From e708ef96d1a20cc2b69bdf1ec30b92bde55951db Mon Sep 17 00:00:00 2001 From: Weslly Date: Sun, 25 Jun 2017 12:21:32 -0300 Subject: [PATCH 001/402] Bring unlock database dialog to the front --- src/gui/UnlockDatabaseDialog.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/UnlockDatabaseDialog.cpp b/src/gui/UnlockDatabaseDialog.cpp index 3aca54cf2..bf5cbdbc0 100644 --- a/src/gui/UnlockDatabaseDialog.cpp +++ b/src/gui/UnlockDatabaseDialog.cpp @@ -26,6 +26,7 @@ UnlockDatabaseDialog::UnlockDatabaseDialog(QWidget* parent) : QDialog(parent) , m_view(new UnlockDatabaseWidget(this)) { + setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); connect(m_view, SIGNAL(editFinished(bool)), this, SLOT(complete(bool))); } From 2727f759199373242cfc843b8e28152083c4cd4c Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Mon, 26 Jun 2017 01:40:21 +0200 Subject: [PATCH 002/402] Fix release tool build checks --- release-tool | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/release-tool b/release-tool index a08e9601b..680cdca2c 100755 --- a/release-tool +++ b/release-tool @@ -525,8 +525,7 @@ build() { done init - - performChecks + checkWorkingTreeClean OUTPUT_DIR="$(realpath "$OUTPUT_DIR")" From 13cc117caa5e1d31da2290528046cf83c1f98a38 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Mon, 26 Jun 2017 01:40:40 +0200 Subject: [PATCH 003/402] Require CMake 3.1.0 and update Dockerfile --- CMakeLists.txt | 2 +- Dockerfile | 20 +++++++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 627676105..77dbd9579 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,7 +22,7 @@ endif() project(KeePassXC) -cmake_minimum_required(VERSION 2.8.12) +cmake_minimum_required(VERSION 3.1.0) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake) diff --git a/Dockerfile b/Dockerfile index 8602d44a3..7da658219 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,7 +21,13 @@ RUN set -x \ && apt-get install --yes software-properties-common RUN set -x \ - && add-apt-repository --yes ppa:beineri/opt-qt58-trusty + && add-apt-repository ppa:george-edison55/cmake-3.x + +ENV QT_VERSION=qt59 + +RUN set -x \ + && add-apt-repository --yes ppa:beineri/opt-${QT_VERSION}-trusty + RUN set -x \ && apt-get update \ @@ -29,9 +35,9 @@ RUN set -x \ g++ \ cmake \ libgcrypt20-dev \ - qt58base \ - qt58tools \ - qt58x11extras \ + ${QT_VERSION}base \ + ${QT_VERSION}tools \ + ${QT_VERSION}x11extras \ libxi-dev \ libxtst-dev \ zlib1g-dev \ @@ -50,7 +56,7 @@ VOLUME /keepassxc/src VOLUME /keepassxc/out WORKDIR /keepassxc -ENV CMAKE_PREFIX_PATH=/opt/qt58/lib/cmake -ENV LD_LIBRARY_PATH=/opt/qt58/lib +ENV CMAKE_PREFIX_PATH=/opt/${QT_VERSION}/lib/cmake +ENV LD_LIBRARY_PATH=/opt/${QT_VERSION}/lib RUN set -x \ - && echo /opt/qt58/lib > /etc/ld.so.conf.d/qt58.conf + && echo /opt/${QT_VERSION}/lib > /etc/ld.so.conf.d/${QT_VERSION}.conf From 701f3d6054e43e958bdc307534a1f2f553c79fee Mon Sep 17 00:00:00 2001 From: Vladimir Svyatski Date: Tue, 27 Jun 2017 12:49:41 +0300 Subject: [PATCH 004/402] :bug: Add proper plural processing in CSV importer (found issues during localization) --- src/gui/csvImport/CsvParserModel.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/gui/csvImport/CsvParserModel.cpp b/src/gui/csvImport/CsvParserModel.cpp index d4af2b785..c4c02cddb 100644 --- a/src/gui/csvImport/CsvParserModel.cpp +++ b/src/gui/csvImport/CsvParserModel.cpp @@ -31,9 +31,9 @@ void CsvParserModel::setFilename(const QString& filename) { } QString CsvParserModel::getFileInfo(){ - QString a(QString::number(getFileSize()).append(tr(" byte, "))); - a.append(QString::number(getCsvRows())).append(tr(" rows, ")); - a.append(QString::number(qMax(0, getCsvCols()-1))).append(tr(" columns")); + QString a(tr("%n byte(s), ", Q_NULLPTR, getFileSize())); + a.append(tr("%n row(s), ", Q_NULLPTR, getCsvRows())); + a.append(tr("%n column(s)", Q_NULLPTR, qMax(0, getCsvCols() - 1))); return a; } From a42ac00d3c91c1c7f59b12634adc738c46bfb92e Mon Sep 17 00:00:00 2001 From: Vladimir Svyatski Date: Tue, 27 Jun 2017 14:39:58 +0300 Subject: [PATCH 005/402] Requested code changes --- src/gui/csvImport/CsvParserModel.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/gui/csvImport/CsvParserModel.cpp b/src/gui/csvImport/CsvParserModel.cpp index c4c02cddb..29f389df2 100644 --- a/src/gui/csvImport/CsvParserModel.cpp +++ b/src/gui/csvImport/CsvParserModel.cpp @@ -31,9 +31,9 @@ void CsvParserModel::setFilename(const QString& filename) { } QString CsvParserModel::getFileInfo(){ - QString a(tr("%n byte(s), ", Q_NULLPTR, getFileSize())); - a.append(tr("%n row(s), ", Q_NULLPTR, getCsvRows())); - a.append(tr("%n column(s)", Q_NULLPTR, qMax(0, getCsvCols() - 1))); + QString a(tr("%n byte(s), ", nullptr, getFileSize())); + a.append(tr("%n row(s), ", nullptr, getCsvRows())); + a.append(tr("%n column(s)", nullptr, qMax(0, getCsvCols() - 1))); return a; } From 640b09c6b23a5c53776b503ea4f9e066c063b515 Mon Sep 17 00:00:00 2001 From: Gianfranco Costamagna Date: Wed, 28 Jun 2017 14:58:29 +0200 Subject: [PATCH 006/402] Add code to detect a system library for zxcvbn, with fallback to the embedded one in case it is not found --- src/CMakeLists.txt | 12 ++++++++---- src/cli/CMakeLists.txt | 2 +- src/cli/EntropyMeter.cpp | 2 +- src/core/PasswordGenerator.cpp | 2 +- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 791685576..05642ea8d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -27,6 +27,13 @@ if (NOT GIT_HEAD OR NOT GIT_DESCRIBE) set(GIT_DESCRIBE "") endif() +find_library(ZXCVBN_FOUND zxcvbn) +if(NOT ZXCVBN_FOUND) + add_library(zxcvbn STATIC zxcvbn/zxcvbn.cpp) + include_directories(${CMAKE_CURRENT_SOURCE_DIR}/zxcvbn) + set(ZXCVBN_FOUND zxcvbn) +endif(NOT ZXCVBN_FOUND) + configure_file(version.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/version.h @ONLY) set(keepassx_SOURCES @@ -203,9 +210,6 @@ else() list(APPEND keepassx_SOURCES keys/drivers/YubiKeyStub.cpp) endif() -add_library(zxcvbn STATIC zxcvbn/zxcvbn.cpp) -target_link_libraries(zxcvbn) - add_library(autotype STATIC ${autotype_SOURCES}) target_link_libraries(autotype Qt5::Core Qt5::Widgets) @@ -218,7 +222,7 @@ target_link_libraries(keepassx_core ${keepasshttp_LIB} ${autotype_LIB} ${YUBIKEY_LIBRARIES} - zxcvbn + ${ZXCVBN_FOUND} Qt5::Core Qt5::Network Qt5::Concurrent diff --git a/src/cli/CMakeLists.txt b/src/cli/CMakeLists.txt index 86edb9c01..4731f7be5 100644 --- a/src/cli/CMakeLists.txt +++ b/src/cli/CMakeLists.txt @@ -38,7 +38,7 @@ target_link_libraries(keepassxc-cli ${GCRYPT_LIBRARIES} ${GPGERROR_LIBRARIES} ${ZLIB_LIBRARIES} - zxcvbn) + ${ZXCVBN_FOUND}) install(TARGETS keepassxc-cli BUNDLE DESTINATION . COMPONENT Runtime diff --git a/src/cli/EntropyMeter.cpp b/src/cli/EntropyMeter.cpp index a62cd3077..5c531af5e 100644 --- a/src/cli/EntropyMeter.cpp +++ b/src/cli/EntropyMeter.cpp @@ -20,7 +20,7 @@ #include #include #include -#include "zxcvbn/zxcvbn.h" +#include /* For pre-compiled headers under windows */ #ifdef _WIN32 diff --git a/src/core/PasswordGenerator.cpp b/src/core/PasswordGenerator.cpp index cdff204a0..21aa590e0 100644 --- a/src/core/PasswordGenerator.cpp +++ b/src/core/PasswordGenerator.cpp @@ -19,7 +19,7 @@ #include "PasswordGenerator.h" #include "crypto/Random.h" -#include "zxcvbn/zxcvbn.h" +#include PasswordGenerator::PasswordGenerator() : m_length(0) From 34ff6d5f6bc02c6a691a4371c5286d56aac8e233 Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Wed, 28 Jun 2017 15:18:24 +0200 Subject: [PATCH 007/402] Change from ZXCVBN_FOUND to ZXCVBN_LIBRARIES to be aligned with other libraries --- src/CMakeLists.txt | 10 +++++----- src/cli/CMakeLists.txt | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 05642ea8d..18d737d2e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -27,12 +27,12 @@ if (NOT GIT_HEAD OR NOT GIT_DESCRIBE) set(GIT_DESCRIBE "") endif() -find_library(ZXCVBN_FOUND zxcvbn) -if(NOT ZXCVBN_FOUND) +find_library(ZXCVBN_LIBRARIES zxcvbn) +if(NOT ZXCVBN_LIBRARIES) add_library(zxcvbn STATIC zxcvbn/zxcvbn.cpp) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/zxcvbn) - set(ZXCVBN_FOUND zxcvbn) -endif(NOT ZXCVBN_FOUND) + set(ZXCVBN_LIBRARIES zxcvbn) +endif(NOT ZXCVBN_LIBRARIES) configure_file(version.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/version.h @ONLY) @@ -222,7 +222,7 @@ target_link_libraries(keepassx_core ${keepasshttp_LIB} ${autotype_LIB} ${YUBIKEY_LIBRARIES} - ${ZXCVBN_FOUND} + ${ZXCVBN_LIBRARIES} Qt5::Core Qt5::Network Qt5::Concurrent diff --git a/src/cli/CMakeLists.txt b/src/cli/CMakeLists.txt index 4731f7be5..0e27f2060 100644 --- a/src/cli/CMakeLists.txt +++ b/src/cli/CMakeLists.txt @@ -38,7 +38,7 @@ target_link_libraries(keepassxc-cli ${GCRYPT_LIBRARIES} ${GPGERROR_LIBRARIES} ${ZLIB_LIBRARIES} - ${ZXCVBN_FOUND}) + ${ZXCVBN_LIBRARIES}) install(TARGETS keepassxc-cli BUNDLE DESTINATION . COMPONENT Runtime From 2822f5fd0ad6751576318aa552d6ca2aec13c0de Mon Sep 17 00:00:00 2001 From: Weslly Date: Wed, 28 Jun 2017 13:53:02 -0300 Subject: [PATCH 008/402] Fix apply button on settings window --- src/gui/MainWindow.cpp | 4 +++- src/gui/SettingsWidget.cpp | 4 +--- src/gui/SettingsWidget.h | 3 --- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 7027d94c2..0d40e89e8 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -240,8 +240,10 @@ MainWindow::MainWindow() SLOT(databaseStatusChanged(DatabaseWidget*))); connect(m_ui->stackedWidget, SIGNAL(currentChanged(int)), SLOT(setMenuActionState())); connect(m_ui->stackedWidget, SIGNAL(currentChanged(int)), SLOT(updateWindowTitle())); - connect(m_ui->settingsWidget, SIGNAL(editFinished(bool)), SLOT(switchToDatabases())); connect(m_ui->settingsWidget, SIGNAL(accepted()), SLOT(applySettingsChanges())); + connect(m_ui->settingsWidget, SIGNAL(apply()), SLOT(applySettingsChanges())); + connect(m_ui->settingsWidget, SIGNAL(accepted()), SLOT(switchToDatabases())); + connect(m_ui->settingsWidget, SIGNAL(rejected()), SLOT(switchToDatabases())); connect(m_ui->actionDatabaseNew, SIGNAL(triggered()), m_ui->tabWidget, SLOT(newDatabase())); diff --git a/src/gui/SettingsWidget.cpp b/src/gui/SettingsWidget.cpp index e8fe9fcb9..185372beb 100644 --- a/src/gui/SettingsWidget.cpp +++ b/src/gui/SettingsWidget.cpp @@ -68,6 +68,7 @@ SettingsWidget::SettingsWidget(QWidget* parent) } connect(this, SIGNAL(accepted()), SLOT(saveSettings())); + connect(this, SIGNAL(apply()), SLOT(saveSettings())); connect(this, SIGNAL(rejected()), SLOT(reject())); connect(m_generalUi->autoSaveAfterEveryChangeCheckBox, SIGNAL(toggled(bool)), @@ -213,8 +214,6 @@ void SettingsWidget::saveSettings() for (const ExtraPage& page: asConst(m_extraPages)) { page.saveSettings(); } - - emit editFinished(true); } void SettingsWidget::reject() @@ -224,7 +223,6 @@ void SettingsWidget::reject() autoType()->registerGlobalShortcut(m_globalAutoTypeKey, m_globalAutoTypeModifiers); } - emit editFinished(false); } void SettingsWidget::enableAutoSaveOnExit(bool checked) diff --git a/src/gui/SettingsWidget.h b/src/gui/SettingsWidget.h index f2fc9f2db..27566037d 100644 --- a/src/gui/SettingsWidget.h +++ b/src/gui/SettingsWidget.h @@ -46,9 +46,6 @@ public: void addSettingsPage(ISettingsPage * page); void loadSettings(); -signals: - void editFinished(bool accepted); - private slots: void saveSettings(); void reject(); From 9a22ac6ee65f9d94648f54e7e4e1173bd54e9f86 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Thu, 29 Jun 2017 03:39:39 +0200 Subject: [PATCH 009/402] Update issue template to ask for debug info from new About dialog --- .github/ISSUE_TEMPLATE.md | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 1a3f1a064..926c90b0c 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -24,9 +24,17 @@ -## Your Environment - -* KeePassXC version/commit used: (can be found under Help -> About) -* Qt version (e.g. Qt 5.3): -* Compiler (e.g. Clang++3.6.0): -* Operating System and version: +## Debug Info + +KeePassXC - VERSION +Revision: REVISION + +Libraries: +- LIBS + +Operating system: OS +CPU architecture: ARCH +Kernel: KERNEL + +Enabled extensions: +- EXTENSIONS From a763b3d1400d30952f81d4159d38961e829b61b9 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Thu, 29 Jun 2017 03:51:40 +0200 Subject: [PATCH 010/402] Update feature list --- .github/ISSUE_TEMPLATE.md | 2 +- README.md | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 926c90b0c..cf8b88f10 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -25,7 +25,7 @@ ## Debug Info - + KeePassXC - VERSION Revision: REVISION diff --git a/README.md b/README.md index bf214d3c1..81a99e253 100644 --- a/README.md +++ b/README.md @@ -7,14 +7,19 @@ KeePass Cross-platform Community Edition ## Additional features compared to KeePassX -- Auto-Type on all three major platforms (Linux, Windows, OS X) -- Stand-alone password generator +- Auto-Type on all three major platforms (Linux, Windows, macOS) +- Twofish encryption +- YubiKey challenge-response support +- TOTP generation +- CSV import +- Command line interface +- DEP and ASLR hardening +- Stand-alone password and passphrase generator - Password strength meter -- YubiKey HMAC-SHA1 authentication for unlocking databases - Using website favicons as entry icons - Merging of databases -- Automatic reload when the database changed on disk -- KeePassHTTP support for use with [PassIFox](https://addons.mozilla.org/en-us/firefox/addon/passifox/) in Mozilla Firefox and [chromeIPass](https://chrome.google.com/webstore/detail/chromeipass/ompiailgknfdndiefoaoiligalphfdae) in Google Chrome or Chromium, and [passafari](https://github.com/mmichaa/passafari.safariextension/) in Safari. +- Automatic reload when the database was changed externally +- KeePassHTTP support for use with [PassIFox](https://addons.mozilla.org/en-us/firefox/addon/passifox/) in Mozilla Firefox, [chromeIPass](https://chrome.google.com/webstore/detail/chromeipass/ompiailgknfdndiefoaoiligalphfdae) in Google Chrome or Chromium and [passafari](https://github.com/mmichaa/passafari.safariextension/) in Safari. - Many bug fixes For a full list of features and changes, read the [CHANGELOG](CHANGELOG) document. From ceeeee3d76a5736772150fa1adb00e30f3c6459b Mon Sep 17 00:00:00 2001 From: Toni Spets Date: Wed, 28 Jun 2017 19:22:59 +0300 Subject: [PATCH 011/402] Split auto-type title and URL matching into separate options --- src/autotype/AutoType.cpp | 9 +++++++-- src/core/Config.cpp | 1 + src/gui/SettingsWidget.cpp | 3 +++ src/gui/SettingsWidgetGeneral.ui | 9 ++++++++- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp index 927d6822b..47efeb1ca 100644 --- a/src/autotype/AutoType.cpp +++ b/src/autotype/AutoType.cpp @@ -576,8 +576,13 @@ QString AutoType::autoTypeSequence(const Entry* entry, const QString& windowTitl } if (!match && config()->get("AutoTypeEntryTitleMatch").toBool() - && (windowMatchesTitle(windowTitle, entry->resolvePlaceholder(entry->title())) - || windowMatchesUrl(windowTitle, entry->resolvePlaceholder(entry->url())))) { + && windowMatchesTitle(windowTitle, entry->resolvePlaceholder(entry->title()))) { + sequence = entry->defaultAutoTypeSequence(); + match = true; + } + + if (!match && config()->get("AutoTypeEntryURLMatch").toBool() + && windowMatchesUrl(windowTitle, entry->resolvePlaceholder(entry->url()))) { sequence = entry->defaultAutoTypeSequence(); match = true; } diff --git a/src/core/Config.cpp b/src/core/Config.cpp index 8b266a845..675896d22 100644 --- a/src/core/Config.cpp +++ b/src/core/Config.cpp @@ -118,6 +118,7 @@ void Config::init(const QString& fileName) m_defaults.insert("MinimizeOnCopy", false); m_defaults.insert("UseGroupIconOnEntryCreation", false); m_defaults.insert("AutoTypeEntryTitleMatch", true); + m_defaults.insert("AutoTypeEntryURLMatch", true); m_defaults.insert("UseGroupIconOnEntryCreation", true); m_defaults.insert("IgnoreGroupExpansion", false); m_defaults.insert("security/clearclipboard", true); diff --git a/src/gui/SettingsWidget.cpp b/src/gui/SettingsWidget.cpp index 24d00b7d9..864a6365c 100644 --- a/src/gui/SettingsWidget.cpp +++ b/src/gui/SettingsWidget.cpp @@ -117,6 +117,7 @@ void SettingsWidget::loadSettings() m_generalUi->minimizeOnCopyCheckBox->setChecked(config()->get("MinimizeOnCopy").toBool()); m_generalUi->useGroupIconOnEntryCreationCheckBox->setChecked(config()->get("UseGroupIconOnEntryCreation").toBool()); m_generalUi->autoTypeEntryTitleMatchCheckBox->setChecked(config()->get("AutoTypeEntryTitleMatch").toBool()); + m_generalUi->autoTypeEntryURLMatchCheckBox->setChecked(config()->get("AutoTypeEntryURLMatch").toBool()); m_generalUi->ignoreGroupExpansionCheckBox->setChecked(config()->get("IgnoreGroupExpansion").toBool()); m_generalUi->languageComboBox->clear(); @@ -190,6 +191,8 @@ void SettingsWidget::saveSettings() m_generalUi->ignoreGroupExpansionCheckBox->isChecked()); config()->set("AutoTypeEntryTitleMatch", m_generalUi->autoTypeEntryTitleMatchCheckBox->isChecked()); + config()->set("AutoTypeEntryURLMatch", + m_generalUi->autoTypeEntryURLMatchCheckBox->isChecked()); int currentLangIndex = m_generalUi->languageComboBox->currentIndex(); config()->set("GUI/Language", m_generalUi->languageComboBox->itemData(currentLangIndex).toString()); diff --git a/src/gui/SettingsWidgetGeneral.ui b/src/gui/SettingsWidgetGeneral.ui index 2fe0f4089..e75631995 100644 --- a/src/gui/SettingsWidgetGeneral.ui +++ b/src/gui/SettingsWidgetGeneral.ui @@ -303,7 +303,14 @@ - Use entry title and URL to match windows for global Auto-Type + Use entry title to match windows for global Auto-Type + + + + + + + Use entry URL to match windows for global Auto-Type From 8fa875a5429d7fc0dbdf03736151c47cd78d0645 Mon Sep 17 00:00:00 2001 From: Cooper Worobetz Date: Wed, 28 Jun 2017 23:47:53 -0700 Subject: [PATCH 012/402] :memo: Remove reference to Google Groups from CONTRIBUTING.md --- .github/CONTRIBUTING.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 67b0e1746..df5429582 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -53,7 +53,7 @@ If we reject your contribution, it means only that we do not consider it suitabl ## How can I contribute? ### Feature requests -We're always looking for suggestions to improve our application. If you have a suggestion to improve an existing feature, or would like to suggest a completely new feature for KeePassXC, please use the [issue tracker on GitHub][issues-section]. For more general discussion, try using our [Google Groups][google-groups] forum. +We're always looking for suggestions to improve our application. If you have a suggestion to improve an existing feature, or would like to suggest a completely new feature for KeePassXC, please use the [issue tracker on GitHub][issues-section]. ### Bug reports @@ -63,7 +63,7 @@ Before submitting a bug report, check if the problem has already been reported. ### Discuss with the team -As with feature requests, you can talk to the KeePassXC team about bugs, new features, other issues and pull requests on the dedicated issue tracker, using the [Google Groups][google-groups] forum, or in the IRC channel on Freenode (`#keepassxc-dev` on `irc.freenode.net`, or use a [webchat link](https://webchat.freenode.net/?channels=%23keepassxc-dev)). +As with feature requests, you can talk to the KeePassXC team about bugs, new features, other issues and pull requests on the dedicated issue tracker, or in the IRC channel on Freenode (`#keepassxc-dev` on `irc.freenode.net`, or use a [webchat link](https://webchat.freenode.net/?channels=%23keepassxc-dev)). ### Your first code contribution @@ -177,4 +177,3 @@ Example: `` [beginner]:https://github.com/keepassxreboot/keepassx/issues?q=is%3Aopen+is%3Aissue+label%3Abeginner+label%3A%22help+wanted%22+sort%3Acomments-desc [help-wanted]:https://github.com/keepassxreboot/keepassx/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22+sort%3Acomments-desc [issues-section]:https://github.com/keepassxreboot/keepassxc/issues -[google-groups]:https://groups.google.com/forum/#!forum/keepassx-reboot From 55d863adb8548bfc193f5d8b6ebfe0101187a1bc Mon Sep 17 00:00:00 2001 From: Kyodev Date: Mon, 3 Jul 2017 01:33:59 +0200 Subject: [PATCH 013/402] fix url for functions.sh * the url for script functions.sh was changed, see [functions.sh](https://github.com/AppImage/AppImages/raw/master/functions.sh) * for information, **bug** on appImage: functions.sh don't build on debian, see [pull request](https://github.com/AppImage/AppImages/pull/252) then release-tool don't work. the PR was accepted, and it is **important** for debian platforms --- AppImage-Recipe.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppImage-Recipe.sh b/AppImage-Recipe.sh index 2707fe96b..7f301f44f 100755 --- a/AppImage-Recipe.sh +++ b/AppImage-Recipe.sh @@ -36,7 +36,7 @@ LOWERAPP="$(echo "$APP" | tr '[:upper:]' '[:lower:]')" VERSION="$2" mkdir -p $APP.AppDir -wget -q https://github.com/probonopd/AppImages/raw/master/functions.sh -O ./functions.sh +wget -q https://github.com/AppImage/AppImages/raw/master/functions.sh -O ./functions.sh . ./functions.sh LIB_DIR=./usr/lib From 0d8a3fb389ab1464431cfb2ee2e50fe1cf848616 Mon Sep 17 00:00:00 2001 From: Kyodev Date: Mon, 3 Jul 2017 03:22:18 +0200 Subject: [PATCH 014/402] add 32bits architecture --- AppImage-Recipe.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/AppImage-Recipe.sh b/AppImage-Recipe.sh index 7f301f44f..0472cccdf 100755 --- a/AppImage-Recipe.sh +++ b/AppImage-Recipe.sh @@ -42,6 +42,8 @@ wget -q https://github.com/AppImage/AppImages/raw/master/functions.sh -O ./funct LIB_DIR=./usr/lib if [ -d ./usr/lib/x86_64-linux-gnu ]; then LIB_DIR=./usr/lib/x86_64-linux-gnu +elif [ -d ./usr/lib/i386-linux-gnu ]; then + LIB_DIR=./usr/lib/i386-linux-gnu fi cd $APP.AppDir From e4c78f92d413d3e55443ad5f6505a287c48b6616 Mon Sep 17 00:00:00 2001 From: Avik Sengupta Date: Mon, 10 Jul 2017 20:35:07 +0100 Subject: [PATCH 015/402] Fix url to build environment instructions and format better. --- INSTALL.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index deed3e5c6..56a51ff6a 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -28,9 +28,9 @@ The following libraries are required: Prepare the Building Environment ================================ -Building Environment on Linux ==> https://github.com/keepassxreboot/keepassx/wiki/Building-Environment-on-Linux -Building Environment on Windows ==> https://github.com/keepassxreboot/keepassx/wiki/Building-Environment-on-Windows -Building Environment on MacOS ==> https://github.com/keepassxreboot/keepassx/wiki/Building-Environment-on-MacOS +* Building Environment on Linux ==> https://github.com/keepassxreboot/keepassxc/wiki/Set-up-Build-Environment-on-Linux +* Building Environment on Windows ==> https://github.com/keepassxreboot/keepassxc/wiki/Set-up-Build-Environment-on-Windows +* Building Environment on MacOS ==> https://github.com/keepassxreboot/keepassxc/wiki/Set-up-Build-Environment-on-OS-X Build Steps From 3b23e68540b15f662f8b15f3b6ffaf216903c830 Mon Sep 17 00:00:00 2001 From: louib Date: Mon, 17 Jul 2017 15:16:53 -0400 Subject: [PATCH 016/402] Refactoring : Introducing Command class for CLI commands (#778) --- src/cli/CMakeLists.txt | 2 + src/cli/Clip.cpp | 44 ++++++++++++++------- src/cli/Clip.h | 9 ++++- src/cli/Command.cpp | 80 +++++++++++++++++++++++++++++++++++++++ src/cli/Command.h | 41 ++++++++++++++++++++ src/cli/EntropyMeter.cpp | 12 +++++- src/cli/EntropyMeter.h | 8 +++- src/cli/Extract.cpp | 28 +++++++++++--- src/cli/Extract.h | 8 +++- src/cli/List.cpp | 69 ++++++++++++++++++++------------- src/cli/List.h | 9 ++++- src/cli/Merge.cpp | 36 +++++++++++------- src/cli/Merge.h | 8 +++- src/cli/Show.cpp | 57 +++++++++++++++++++--------- src/cli/Show.h | 9 ++++- src/cli/keepassxc-cli.cpp | 65 +++++++------------------------ src/core/Group.cpp | 17 +++------ src/core/Group.h | 2 +- tests/TestGroup.cpp | 17 +++++---- 19 files changed, 356 insertions(+), 165 deletions(-) create mode 100644 src/cli/Command.cpp create mode 100644 src/cli/Command.h diff --git a/src/cli/CMakeLists.txt b/src/cli/CMakeLists.txt index 0e27f2060..1f7ab25d9 100644 --- a/src/cli/CMakeLists.txt +++ b/src/cli/CMakeLists.txt @@ -16,6 +16,8 @@ set(cli_SOURCES Clip.cpp Clip.h + Command.cpp + Command.h EntropyMeter.cpp EntropyMeter.h Extract.cpp diff --git a/src/cli/Clip.cpp b/src/cli/Clip.cpp index 70d97c0e2..7571bc194 100644 --- a/src/cli/Clip.cpp +++ b/src/cli/Clip.cpp @@ -21,7 +21,6 @@ #include "Clip.h" #include -#include #include #include #include @@ -32,30 +31,41 @@ #include "core/Group.h" #include "gui/Clipboard.h" +Clip::Clip() +{ + this->name = QString("clip"); + this->description = QObject::tr("Copy an entry's password to the clipboard."); +} + +Clip::~Clip() +{ +} + int Clip::execute(int argc, char** argv) { - QStringList arguments; - for (int i = 0; i < argc; ++i) { + // Skipping the first argument (keepassxc). + for (int i = 1; i < argc; ++i) { arguments << QString(argv[i]); } + QTextStream out(stdout); QCommandLineParser parser; - parser.setApplicationDescription(QCoreApplication::translate("main", "Copy a password to the clipboard")); - parser.addPositionalArgument("database", QCoreApplication::translate("main", "Path of the database.")); - QCommandLineOption guiPrompt( - QStringList() << "g" - << "gui-prompt", - QCoreApplication::translate("main", "Use a GUI prompt unlocking the database.")); + parser.setApplicationDescription(this->description); + parser.addPositionalArgument("database", QObject::tr("Path of the database.")); + QCommandLineOption guiPrompt(QStringList() << "g" + << "gui-prompt", + QObject::tr("Use a GUI prompt unlocking the database.")); parser.addOption(guiPrompt); - parser.addPositionalArgument("entry", QCoreApplication::translate("main", "Name of the entry to clip.")); + parser.addPositionalArgument("entry", QObject::tr("Path of the entry to clip.")); parser.process(arguments); const QStringList args = parser.positionalArguments(); if (args.size() != 2) { QCoreApplication app(argc, argv); - parser.showHelp(EXIT_FAILURE); + out << parser.helpText().replace("keepassxc-cli", "keepassxc-cli clip"); + return EXIT_FAILURE; } Database* db = nullptr; @@ -69,14 +79,20 @@ int Clip::execute(int argc, char** argv) if (!db) { return EXIT_FAILURE; } + return this->clipEntry(db, args.at(1)); +} - QString entryId = args.at(1); - Entry* entry = db->rootGroup()->findEntry(entryId); +int Clip::clipEntry(Database* database, QString entryPath) +{ + + QTextStream outputTextStream(stdout, QIODevice::WriteOnly); + Entry* entry = database->rootGroup()->findEntry(entryPath); if (!entry) { - qCritical("Entry %s not found.", qPrintable(entryId)); + qCritical("Entry %s not found.", qPrintable(entryPath)); return EXIT_FAILURE; } Clipboard::instance()->setText(entry->password()); return EXIT_SUCCESS; + } diff --git a/src/cli/Clip.h b/src/cli/Clip.h index cb72e4299..195976355 100644 --- a/src/cli/Clip.h +++ b/src/cli/Clip.h @@ -18,10 +18,15 @@ #ifndef KEEPASSXC_CLIP_H #define KEEPASSXC_CLIP_H -class Clip +#include "Command.h" + +class Clip : public Command { public: - static int execute(int argc, char** argv); + Clip(); + ~Clip(); + int execute(int argc, char** argv); + int clipEntry(Database* database, QString entryPath); }; #endif // KEEPASSXC_CLIP_H diff --git a/src/cli/Command.cpp b/src/cli/Command.cpp new file mode 100644 index 000000000..443208c7e --- /dev/null +++ b/src/cli/Command.cpp @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2017 KeePassXC Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include + +#include + +#include "Command.h" + +#include "Clip.h" +#include "EntropyMeter.h" +#include "Extract.h" +#include "List.h" +#include "Merge.h" +#include "Show.h" + +QMap commands; + +Command::~Command() +{ +} + +int Command::execute(int, char**) +{ + return EXIT_FAILURE; +} + +QString Command::getDescriptionLine() +{ + + QString response = this->name; + QString space(" "); + QString spaces = space.repeated(15 - this->name.length()); + response = response.append(spaces); + response = response.append(this->description); + response = response.append("\n"); + return response; +} + +void populateCommands() +{ + if (commands.isEmpty()) { + commands.insert(QString("clip"), new Clip()); + commands.insert(QString("entropy-meter"), new EntropyMeter()); + commands.insert(QString("extract"), new Extract()); + commands.insert(QString("ls"), new List()); + commands.insert(QString("merge"), new Merge()); + commands.insert(QString("show"), new Show()); + } +} + +Command* Command::getCommand(QString commandName) +{ + populateCommands(); + if (commands.contains(commandName)) { + return commands[commandName]; + } + return nullptr; +} + +QList Command::getCommands() +{ + populateCommands(); + return commands.values(); +} diff --git a/src/cli/Command.h b/src/cli/Command.h new file mode 100644 index 000000000..adc4aad0d --- /dev/null +++ b/src/cli/Command.h @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2017 KeePassXC Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef KEEPASSXC_COMMAND_H +#define KEEPASSXC_COMMAND_H + +#include +#include +#include +#include + +#include "core/Database.h" + +class Command +{ +public: + virtual ~Command(); + virtual int execute(int argc, char** argv); + QString name; + QString description; + QString getDescriptionLine(); + + static QList getCommands(); + static Command* getCommand(QString commandName); +}; + +#endif // KEEPASSXC_COMMAND_H diff --git a/src/cli/EntropyMeter.cpp b/src/cli/EntropyMeter.cpp index 5c531af5e..62bd973f8 100644 --- a/src/cli/EntropyMeter.cpp +++ b/src/cli/EntropyMeter.cpp @@ -18,8 +18,8 @@ #include "EntropyMeter.h" #include -#include #include +#include #include /* For pre-compiled headers under windows */ @@ -29,6 +29,16 @@ #endif #endif +EntropyMeter::EntropyMeter() +{ + this->name = QString("entropy-meter"); + this->description = QObject::tr("Calculate password entropy."); +} + +EntropyMeter::~EntropyMeter() +{ +} + static void calculate(const char *pwd, int advanced) { double e; diff --git a/src/cli/EntropyMeter.h b/src/cli/EntropyMeter.h index d160115bf..b1508f172 100644 --- a/src/cli/EntropyMeter.h +++ b/src/cli/EntropyMeter.h @@ -18,10 +18,14 @@ #ifndef KEEPASSXC_ENTROPYMETER_H #define KEEPASSXC_ENTROPYMETER_H -class EntropyMeter +#include "Command.h" + +class EntropyMeter : public Command { public: - static int execute(int argc, char** argv); + EntropyMeter(); + ~EntropyMeter(); + int execute(int argc, char** argv); }; #endif // KEEPASSXC_ENTROPYMETER_H diff --git a/src/cli/Extract.cpp b/src/cli/Extract.cpp index b9433801c..0073acba5 100644 --- a/src/cli/Extract.cpp +++ b/src/cli/Extract.cpp @@ -26,25 +26,41 @@ #include #include +#include "cli/PasswordInput.h" #include "core/Database.h" #include "format/KeePass2Reader.h" #include "keys/CompositeKey.h" -#include "cli/PasswordInput.h" + +Extract::Extract() +{ + this->name = QString("extract"); + this->description = QObject::tr("Extract and print the content of a database."); +} + +Extract::~Extract() +{ +} int Extract::execute(int argc, char** argv) { + QStringList arguments; + // Skipping the first argument (keepassxc). + for (int i = 1; i < argc; ++i) { + arguments << QString(argv[i]); + } + QCoreApplication app(argc, argv); QTextStream out(stdout); QCommandLineParser parser; - parser.setApplicationDescription( - QCoreApplication::translate("main", "Extract and print the content of a database.")); - parser.addPositionalArgument("database", QCoreApplication::translate("main", "Path of the database to extract.")); - parser.process(app); + parser.setApplicationDescription(this->description); + parser.addPositionalArgument("database", QObject::tr("Path of the database to extract.")); + parser.process(arguments); const QStringList args = parser.positionalArguments(); if (args.size() != 1) { - parser.showHelp(EXIT_FAILURE); + out << parser.helpText().replace("keepassxc-cli", "keepassxc-cli extract"); + return EXIT_FAILURE; } out << "Insert the database password\n> "; diff --git a/src/cli/Extract.h b/src/cli/Extract.h index e1b0672ec..eadbb9e34 100644 --- a/src/cli/Extract.h +++ b/src/cli/Extract.h @@ -18,10 +18,14 @@ #ifndef KEEPASSXC_EXTRACT_H #define KEEPASSXC_EXTRACT_H -class Extract +#include "Command.h" + +class Extract : public Command { public: - static int execute(int argc, char** argv); + Extract(); + ~Extract(); + int execute(int argc, char** argv); }; #endif // KEEPASSXC_EXTRACT_H diff --git a/src/cli/List.cpp b/src/cli/List.cpp index de6bd5ef5..f3f22f6e3 100644 --- a/src/cli/List.cpp +++ b/src/cli/List.cpp @@ -26,43 +26,47 @@ #include #include -#include "gui/UnlockDatabaseDialog.h" #include "core/Database.h" #include "core/Entry.h" #include "core/Group.h" -#include "keys/CompositeKey.h" +#include "gui/UnlockDatabaseDialog.h" +List::List() +{ + this->name = QString("ls"); + this->description = QObject::tr("List database entries."); +} + +List::~List() +{ +} int List::execute(int argc, char** argv) { QStringList arguments; - for (int i = 0; i < argc; ++i) { + // Skipping the first argument (keepassxc). + for (int i = 1; i < argc; ++i) { arguments << QString(argv[i]); } + QTextStream out(stdout); QCommandLineParser parser; - parser.setApplicationDescription(QCoreApplication::translate("main", "List database entries.")); - parser.addPositionalArgument("database", QCoreApplication::translate("main", "Path of the database.")); - parser.addPositionalArgument("group", - QCoreApplication::translate("main", "Path of the group to list. Default is /"), - QString("[group]")); - QCommandLineOption printUuidsOption( - QStringList() << "u" - << "print-uuids", - QCoreApplication::translate("main", "Print the UUIDs of the entries and groups.")); - parser.addOption(printUuidsOption); - QCommandLineOption guiPrompt( - QStringList() << "g" - << "gui-prompt", - QCoreApplication::translate("main", "Use a GUI prompt unlocking the database.")); + parser.setApplicationDescription(this->description); + parser.addPositionalArgument("database", QObject::tr("Path of the database.")); + parser.addPositionalArgument( + "group", QObject::tr("Path of the group to list. Default is /"), QString("[group]")); + QCommandLineOption guiPrompt(QStringList() << "g" + << "gui-prompt", + QObject::tr("Use a GUI prompt unlocking the database.")); parser.addOption(guiPrompt); parser.process(arguments); const QStringList args = parser.positionalArguments(); if (args.size() != 1 && args.size() != 2) { QCoreApplication app(argc, argv); - parser.showHelp(EXIT_FAILURE); + out << parser.helpText().replace("keepassxc-cli", "keepassxc-cli ls"); + return EXIT_FAILURE; } Database* db = nullptr; @@ -78,17 +82,28 @@ int List::execute(int argc, char** argv) return EXIT_FAILURE; } - Group* group = db->rootGroup(); if (args.size() == 2) { - QString groupPath = args.at(1); - group = db->rootGroup()->findGroupByPath(groupPath); - if (group == nullptr) { - qCritical("Cannot find group %s.", qPrintable(groupPath)); - return EXIT_FAILURE; - } + return this->listGroup(db, args.at(1)); + } + return this->listGroup(db); +} + +int List::listGroup(Database* database, QString groupPath) +{ + QTextStream outputTextStream(stdout, QIODevice::WriteOnly); + if (groupPath.isEmpty()) { + outputTextStream << database->rootGroup()->print(); + outputTextStream.flush(); + return EXIT_SUCCESS; } - out << group->print(parser.isSet("print-uuids")); - out.flush(); + Group* group = database->rootGroup()->findGroupByPath(groupPath); + if (group == nullptr) { + qCritical("Cannot find group %s.", qPrintable(groupPath)); + return EXIT_FAILURE; + } + + outputTextStream << group->print(); + outputTextStream.flush(); return EXIT_SUCCESS; } diff --git a/src/cli/List.h b/src/cli/List.h index 18528bd78..cd9f8d1df 100644 --- a/src/cli/List.h +++ b/src/cli/List.h @@ -18,10 +18,15 @@ #ifndef KEEPASSXC_LIST_H #define KEEPASSXC_LIST_H -class List +#include "Command.h" + +class List : public Command { public: - static int execute(int argc, char** argv); + List(); + ~List(); + int execute(int argc, char** argv); + int listGroup(Database* database, QString groupPath = QString("")); }; #endif // KEEPASSXC_LIST_H diff --git a/src/cli/Merge.cpp b/src/cli/Merge.cpp index a179d69be..7567029c6 100644 --- a/src/cli/Merge.cpp +++ b/src/cli/Merge.cpp @@ -28,31 +28,39 @@ #include "core/Database.h" #include "gui/UnlockDatabaseDialog.h" +Merge::Merge() +{ + this->name = QString("merge"); + this->description = QObject::tr("Merge two databases."); +} + +Merge::~Merge() +{ +} + int Merge::execute(int argc, char** argv) { - QStringList arguments; - for (int i = 0; i < argc; ++i) { + // Skipping the first argument (keepassxc). + for (int i = 1; i < argc; ++i) { arguments << QString(argv[i]); } + QTextStream out(stdout); QCommandLineParser parser; - parser.setApplicationDescription(QCoreApplication::translate("main", "Merge two databases.")); - parser.addPositionalArgument("database1", - QCoreApplication::translate("main", "Path of the database to merge into.")); - parser.addPositionalArgument("database2", - QCoreApplication::translate("main", "Path of the database to merge from.")); + parser.setApplicationDescription(this->description); + parser.addPositionalArgument("database1", QObject::tr("Path of the database to merge into.")); + parser.addPositionalArgument("database2", QObject::tr("Path of the database to merge from.")); QCommandLineOption samePasswordOption( QStringList() << "s" << "same-password", - QCoreApplication::translate("main", "Use the same password for both database files.")); + QObject::tr("Use the same password for both database files.")); - QCommandLineOption guiPrompt( - QStringList() << "g" - << "gui-prompt", - QCoreApplication::translate("main", "Use a GUI prompt unlocking the database.")); + QCommandLineOption guiPrompt(QStringList() << "g" + << "gui-prompt", + QObject::tr("Use a GUI prompt unlocking the database.")); parser.addOption(guiPrompt); parser.addOption(samePasswordOption); @@ -61,7 +69,8 @@ int Merge::execute(int argc, char** argv) const QStringList args = parser.positionalArguments(); if (args.size() != 2) { QCoreApplication app(argc, argv); - parser.showHelp(EXIT_FAILURE); + out << parser.helpText().replace("keepassxc-cli", "keepassxc-cli merge"); + return EXIT_FAILURE; } Database* db1; @@ -100,5 +109,4 @@ int Merge::execute(int argc, char** argv) out << "Successfully merged the database files.\n"; return EXIT_SUCCESS; - } diff --git a/src/cli/Merge.h b/src/cli/Merge.h index 95da7af81..bb121f579 100644 --- a/src/cli/Merge.h +++ b/src/cli/Merge.h @@ -18,10 +18,14 @@ #ifndef KEEPASSXC_MERGE_H #define KEEPASSXC_MERGE_H -class Merge +#include "Command.h" + +class Merge : public Command { public: - static int execute(int argc, char** argv); + Merge(); + ~Merge(); + int execute(int argc, char** argv); }; #endif // KEEPASSXC_MERGE_H diff --git a/src/cli/Show.cpp b/src/cli/Show.cpp index c212a9d61..55da87515 100644 --- a/src/cli/Show.cpp +++ b/src/cli/Show.cpp @@ -28,43 +28,64 @@ #include "core/Database.h" #include "core/Entry.h" #include "core/Group.h" -#include "keys/CompositeKey.h" -#include "cli/PasswordInput.h" + +Show::Show() +{ + this->name = QString("show"); + this->description = QObject::tr("Show an entry's information."); +} + +Show::~Show() +{ +} int Show::execute(int argc, char** argv) { + QStringList arguments; + // Skipping the first argument (keepassxc). + for (int i = 1; i < argc; ++i) { + arguments << QString(argv[i]); + } + QCoreApplication app(argc, argv); QTextStream out(stdout); QCommandLineParser parser; - parser.setApplicationDescription(QCoreApplication::translate("main", "Show a password.")); - parser.addPositionalArgument("database", QCoreApplication::translate("main", "Path of the database.")); - parser.addPositionalArgument("entry", QCoreApplication::translate("main", "Name of the entry to show.")); - parser.process(app); + parser.setApplicationDescription(this->description); + parser.addPositionalArgument("database", QObject::tr("Path of the database.")); + parser.addPositionalArgument("entry", QObject::tr("Name of the entry to show.")); + parser.process(arguments); const QStringList args = parser.positionalArguments(); if (args.size() != 2) { - parser.showHelp(EXIT_FAILURE); + out << parser.helpText().replace("keepassxc-cli", "keepassxc-cli show"); + return EXIT_FAILURE; } - out << "Insert the database password\n> "; - out.flush(); - - QString line = PasswordInput::getPassword(); - CompositeKey key = CompositeKey::readFromLine(line); - - Database* db = Database::openDatabaseFile(args.at(0), key); + Database* db = Database::unlockFromStdin(args.at(0)); if (db == nullptr) { return EXIT_FAILURE; } - QString entryId = args.at(1); - Entry* entry = db->rootGroup()->findEntry(entryId); + return this->showEntry(db, args.at(1)); +} + +int Show::showEntry(Database* database, QString entryPath) +{ + + QTextStream inputTextStream(stdin, QIODevice::ReadOnly); + QTextStream outputTextStream(stdout, QIODevice::WriteOnly); + + Entry* entry = database->rootGroup()->findEntry(entryPath); if (!entry) { - qCritical("Entry %s not found.", qPrintable(entryId)); + qCritical("Could not find entry with path %s.", qPrintable(entryPath)); return EXIT_FAILURE; } - out << entry->password() << "\n"; + outputTextStream << " title: " << entry->title() << endl; + outputTextStream << "username: " << entry->username() << endl; + outputTextStream << "password: " << entry->password() << endl; + outputTextStream << " URL: " << entry->url() << endl; + outputTextStream << " Notes: " << entry->notes() << endl; return EXIT_SUCCESS; } diff --git a/src/cli/Show.h b/src/cli/Show.h index 630b18f80..b10e6bf0a 100644 --- a/src/cli/Show.h +++ b/src/cli/Show.h @@ -18,10 +18,15 @@ #ifndef KEEPASSXC_SHOW_H #define KEEPASSXC_SHOW_H -class Show +#include "Command.h" + +class Show : public Command { public: - static int execute(int argc, char** argv); + Show(); + ~Show(); + int execute(int argc, char** argv); + int showEntry(Database* database, QString entryPath); }; #endif // KEEPASSXC_SHOW_H diff --git a/src/cli/keepassxc-cli.cpp b/src/cli/keepassxc-cli.cpp index 18bb224ec..37210b6a1 100644 --- a/src/cli/keepassxc-cli.cpp +++ b/src/cli/keepassxc-cli.cpp @@ -22,12 +22,7 @@ #include #include -#include -#include -#include -#include -#include -#include +#include #include "config-keepassx.h" #include "core/Tools.h" @@ -48,6 +43,7 @@ int main(int argc, char** argv) return EXIT_FAILURE; } + QTextStream out(stdout); QStringList arguments; for (int i = 0; i < argc; ++i) { arguments << QString(argv[i]); @@ -55,16 +51,13 @@ int main(int argc, char** argv) QCommandLineParser parser; QString description("KeePassXC command line interface."); - description = description.append(QString("\n\nAvailable commands:")); - description = description.append(QString("\n clip\t\tCopy a password to the clipboard.")); - description = description.append(QString("\n extract\tExtract and print the content of a database.")); - description = description.append(QString("\n entropy-meter\tCalculate password entropy.")); - description = description.append(QString("\n list\t\tList database entries.")); - description = description.append(QString("\n merge\t\tMerge two databases.")); - description = description.append(QString("\n show\t\tShow a password.")); - parser.setApplicationDescription(QCoreApplication::translate("main", qPrintable(description))); + description = description.append(QObject::tr("\n\nAvailable commands:\n")); + for (Command* command : Command::getCommands()) { + description = description.append(command->getDescriptionLine()); + } + parser.setApplicationDescription(description); - parser.addPositionalArgument("command", QCoreApplication::translate("main", "Name of the command to execute.")); + parser.addPositionalArgument("command", QObject::tr("Name of the command to execute.")); parser.addHelpOption(); parser.addVersionOption(); @@ -78,50 +71,16 @@ int main(int argc, char** argv) app.setApplicationVersion(KEEPASSX_VERSION); if (parser.isSet("version")) { // Switch to parser.showVersion() when available (QT 5.4). - QTextStream out(stdout); - out << KEEPASSX_VERSION << "\n"; - out.flush(); + out << KEEPASSX_VERSION << endl; return EXIT_SUCCESS; } parser.showHelp(); } QString commandName = parser.positionalArguments().at(0); + Command* command = Command::getCommand(commandName); - int exitCode = EXIT_FAILURE; - - if (commandName == "clip") { - // Removing the first cli argument before dispatching. - ++argv; - --argc; - argv[0] = const_cast("keepassxc-cli clip"); - exitCode = Clip::execute(argc, argv); - } else if (commandName == "entropy-meter") { - ++argv; - --argc; - argv[0] = const_cast("keepassxc-cli entropy-meter"); - exitCode = EntropyMeter::execute(argc, argv); - } else if (commandName == "extract") { - ++argv; - --argc; - argv[0] = const_cast("keepassxc-cli extract"); - exitCode = Extract::execute(argc, argv); - } else if (commandName == "list") { - ++argv; - --argc; - argv[0] = const_cast("keepassxc-cli list"); - exitCode = List::execute(argc, argv); - } else if (commandName == "merge") { - ++argv; - --argc; - argv[0] = const_cast("keepassxc-cli merge"); - exitCode = Merge::execute(argc, argv); - } else if (commandName == "show") { - ++argv; - --argc; - argv[0] = const_cast("keepassxc-cli show"); - exitCode = Show::execute(argc, argv); - } else { + if (command == nullptr) { qCritical("Invalid command %s.", qPrintable(commandName)); QCoreApplication app(argc, argv); app.setApplicationVersion(KEEPASSX_VERSION); @@ -130,6 +89,8 @@ int main(int argc, char** argv) parser.showHelp(EXIT_FAILURE); } + int exitCode = command->execute(argc, argv); + #if defined(WITH_ASAN) && defined(WITH_LSAN) // do leak check here to prevent massive tail of end-of-process leak errors from third-party libraries __lsan_do_leak_check(); diff --git a/src/core/Group.cpp b/src/core/Group.cpp index edbed947e..008755510 100644 --- a/src/core/Group.cpp +++ b/src/core/Group.cpp @@ -578,7 +578,7 @@ Group* Group::findGroupByPath(QString groupPath, QString basePath) } -QString Group::print(bool printUuids, QString baseName, int depth) +QString Group::print(bool recursive, int depth) { QString response; @@ -590,21 +590,14 @@ QString Group::print(bool printUuids, QString baseName, int depth) } for (Entry* entry : entries()) { - response += indentation + entry->title(); - if (printUuids) { - response += " " + entry->uuid().toHex(); - } - response += "\n"; + response += indentation + entry->title() + "\n"; } for (Group* innerGroup : children()) { - QString newBaseName = baseName + innerGroup->name() + "/"; - response += indentation + newBaseName; - if (printUuids) { - response += " " + innerGroup->uuid().toHex(); + response += indentation + innerGroup->name() + "/\n"; + if (recursive) { + response += innerGroup->print(recursive, depth + 1); } - response += "\n"; - response += innerGroup->print(printUuids, newBaseName, depth + 1); } return response; diff --git a/src/core/Group.h b/src/core/Group.h index f8c976eeb..10313b488 100644 --- a/src/core/Group.h +++ b/src/core/Group.h @@ -125,7 +125,7 @@ public: Group* clone(Entry::CloneFlags entryFlags = Entry::CloneNewUuid | Entry::CloneResetTimeInfo) const; void copyDataFrom(const Group* other); void merge(const Group* other); - QString print(bool printUuids = false, QString baseName = QString(""), int depth = 0); + QString print(bool recursive = false, int depth = 0); signals: void dataChanged(Group* group); diff --git a/tests/TestGroup.cpp b/tests/TestGroup.cpp index 50997dcca..14956618e 100644 --- a/tests/TestGroup.cpp +++ b/tests/TestGroup.cpp @@ -728,10 +728,6 @@ void TestGroup::testPrint() output = db->rootGroup()->print(); QCOMPARE(output, QString("entry1\n")); - output = db->rootGroup()->print(true); - QCOMPARE(output, QString("entry1 " + entry1->uuid().toHex() + "\n")); - - Group* group1 = new Group(); group1->setName("group1"); @@ -746,11 +742,16 @@ void TestGroup::testPrint() output = db->rootGroup()->print(); QVERIFY(output.contains(QString("entry1\n"))); QVERIFY(output.contains(QString("group1/\n"))); - QVERIFY(output.contains(QString(" entry2\n"))); + QVERIFY(!output.contains(QString(" entry2\n"))); output = db->rootGroup()->print(true); - QVERIFY(output.contains(QString("entry1 " + entry1->uuid().toHex() + "\n"))); - QVERIFY(output.contains(QString("group1/ " + group1->uuid().toHex() + "\n"))); - QVERIFY(output.contains(QString(" entry2 " + entry2->uuid().toHex() + "\n"))); + QVERIFY(output.contains(QString("entry1\n"))); + QVERIFY(output.contains(QString("group1/\n"))); + QVERIFY(output.contains(QString(" entry2\n"))); + + output = group1->print(); + QVERIFY(!output.contains(QString("group1/\n"))); + QVERIFY(output.contains(QString("entry2\n"))); + delete db; } From 1edabc4b3c76ca72633334cdf73a42c4fda3a3ce Mon Sep 17 00:00:00 2001 From: louib Date: Sat, 22 Jul 2017 19:40:30 -0400 Subject: [PATCH 017/402] Feature : Clip command using native programs. (#792) * Adding a timeout option * Using native apps. * Renaming PasswordInput -> Utils --- src/CMakeLists.txt | 4 +- src/cli/Clip.cpp | 49 +++++++++++++++---- src/cli/Clip.h | 2 +- src/cli/Extract.cpp | 4 +- src/cli/{PasswordInput.cpp => Utils.cpp} | 60 +++++++++++++++++++++--- src/cli/{PasswordInput.h => Utils.h} | 10 ++-- src/core/Database.cpp | 4 +- 7 files changed, 105 insertions(+), 28 deletions(-) rename src/cli/{PasswordInput.cpp => Utils.cpp} (56%) rename src/cli/{PasswordInput.h => Utils.h} (85%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 18d737d2e..6ee280d40 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -66,8 +66,8 @@ set(keepassx_SOURCES core/Tools.cpp core/Translator.cpp core/Uuid.cpp - cli/PasswordInput.cpp - cli/PasswordInput.h + cli/Utils.cpp + cli/Utils.h crypto/Crypto.cpp crypto/CryptoHash.cpp crypto/Random.cpp diff --git a/src/cli/Clip.cpp b/src/cli/Clip.cpp index 7571bc194..ab12bb1bc 100644 --- a/src/cli/Clip.cpp +++ b/src/cli/Clip.cpp @@ -15,8 +15,10 @@ * along with this program. If not, see . */ +#include #include #include +#include #include "Clip.h" @@ -25,11 +27,11 @@ #include #include -#include "gui/UnlockDatabaseDialog.h" +#include "cli/Utils.h" #include "core/Database.h" #include "core/Entry.h" #include "core/Group.h" -#include "gui/Clipboard.h" +#include "gui/UnlockDatabaseDialog.h" Clip::Clip() { @@ -50,6 +52,7 @@ int Clip::execute(int argc, char** argv) } QTextStream out(stdout); + QApplication app(argc, argv); QCommandLineParser parser; parser.setApplicationDescription(this->description); @@ -59,17 +62,19 @@ int Clip::execute(int argc, char** argv) QObject::tr("Use a GUI prompt unlocking the database.")); parser.addOption(guiPrompt); parser.addPositionalArgument("entry", QObject::tr("Path of the entry to clip.")); + parser.addPositionalArgument( + "timeout", + QObject::tr("Timeout in seconds before clearing the clipboard."), + QString("[timeout]")); parser.process(arguments); const QStringList args = parser.positionalArguments(); - if (args.size() != 2) { - QCoreApplication app(argc, argv); + if (args.size() != 2 && args.size() != 3) { out << parser.helpText().replace("keepassxc-cli", "keepassxc-cli clip"); return EXIT_FAILURE; } Database* db = nullptr; - QApplication app(argc, argv); if (parser.isSet("gui-prompt")) { db = UnlockDatabaseDialog::openDatabasePrompt(args.at(0)); } else { @@ -79,12 +84,20 @@ int Clip::execute(int argc, char** argv) if (!db) { return EXIT_FAILURE; } - return this->clipEntry(db, args.at(1)); + return this->clipEntry(db, args.at(1), args.value(2)); } -int Clip::clipEntry(Database* database, QString entryPath) +int Clip::clipEntry(Database* database, QString entryPath, QString timeout) { + int timeoutSeconds = 0; + if (!timeout.isEmpty() && !timeout.toInt()) { + qCritical("Invalid timeout value %s.", qPrintable(timeout)); + return EXIT_FAILURE; + } else if (!timeout.isEmpty()) { + timeoutSeconds = timeout.toInt(); + } + QTextStream outputTextStream(stdout, QIODevice::WriteOnly); Entry* entry = database->rootGroup()->findEntry(entryPath); if (!entry) { @@ -92,7 +105,25 @@ int Clip::clipEntry(Database* database, QString entryPath) return EXIT_FAILURE; } - Clipboard::instance()->setText(entry->password()); - return EXIT_SUCCESS; + int exitCode = Utils::clipText(entry->password()); + if (exitCode != EXIT_SUCCESS) { + return exitCode; + } + outputTextStream << "Entry's password copied to the clipboard!" << endl; + + if (!timeoutSeconds) { + return exitCode; + } + + while (timeoutSeconds > 0) { + outputTextStream << "\rClearing the clipboard in " << timeoutSeconds << " seconds..."; + outputTextStream.flush(); + std::this_thread::sleep_for(std::chrono::milliseconds(1000)); + timeoutSeconds--; + } + Utils::clipText(""); + outputTextStream << "\nClipboard cleared!" << endl; + + return EXIT_SUCCESS; } diff --git a/src/cli/Clip.h b/src/cli/Clip.h index 195976355..1771e5581 100644 --- a/src/cli/Clip.h +++ b/src/cli/Clip.h @@ -26,7 +26,7 @@ public: Clip(); ~Clip(); int execute(int argc, char** argv); - int clipEntry(Database* database, QString entryPath); + int clipEntry(Database* database, QString entryPath, QString timeout); }; #endif // KEEPASSXC_CLIP_H diff --git a/src/cli/Extract.cpp b/src/cli/Extract.cpp index 0073acba5..2095c177e 100644 --- a/src/cli/Extract.cpp +++ b/src/cli/Extract.cpp @@ -26,7 +26,7 @@ #include #include -#include "cli/PasswordInput.h" +#include "cli/Utils.h" #include "core/Database.h" #include "format/KeePass2Reader.h" #include "keys/CompositeKey.h" @@ -66,7 +66,7 @@ int Extract::execute(int argc, char** argv) out << "Insert the database password\n> "; out.flush(); - QString line = PasswordInput::getPassword(); + QString line = Utils::getPassword(); CompositeKey key = CompositeKey::readFromLine(line); QString databaseFilename = args.at(0); diff --git a/src/cli/PasswordInput.cpp b/src/cli/Utils.cpp similarity index 56% rename from src/cli/PasswordInput.cpp rename to src/cli/Utils.cpp index 16913e956..b9866a1a2 100644 --- a/src/cli/PasswordInput.cpp +++ b/src/cli/Utils.cpp @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -#include "PasswordInput.h" +#include "Utils.h" #ifdef Q_OS_WIN #include @@ -24,14 +24,11 @@ #include #endif +#include #include -PasswordInput::PasswordInput() -{ -} - -void PasswordInput::setStdinEcho(bool enable = true) +void Utils::setStdinEcho(bool enable = true) { #ifdef Q_OS_WIN HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE); @@ -60,7 +57,7 @@ void PasswordInput::setStdinEcho(bool enable = true) #endif } -QString PasswordInput::getPassword() +QString Utils::getPassword() { static QTextStream inputTextStream(stdin, QIODevice::ReadOnly); static QTextStream outputTextStream(stdout, QIODevice::WriteOnly); @@ -75,3 +72,52 @@ QString PasswordInput::getPassword() return line; } + +/* + * A valid and running event loop is needed to use the global QClipboard, + * so we need to use this from the CLI. + */ +int Utils::clipText(QString text) +{ + + QString programName = ""; + QStringList arguments; + +#ifdef Q_OS_UNIX + programName = "xclip"; + arguments << "-i" + << "-selection" + << "clipboard"; +#endif + +#ifdef Q_OS_MACOS + programName = "pbcopy"; +#endif + +#ifdef Q_OS_WIN + programName = "clip"; +#endif + + if (programName.isEmpty()) { + qCritical("No program defined for clipboard manipulation"); + return EXIT_FAILURE; + } + + QProcess* clipProcess = new QProcess(nullptr); + clipProcess->start(programName, arguments); + clipProcess->waitForStarted(); + + if (clipProcess->state() != QProcess::Running) { + qCritical("Unable to start program %s", qPrintable(programName)); + return EXIT_FAILURE; + } + + if (clipProcess->write(text.toLatin1()) == -1) { + qDebug("Unable to write to process : %s", qPrintable(clipProcess->errorString())); + } + clipProcess->waitForBytesWritten(); + clipProcess->closeWriteChannel(); + clipProcess->waitForFinished(); + + return clipProcess->exitCode(); +} diff --git a/src/cli/PasswordInput.h b/src/cli/Utils.h similarity index 85% rename from src/cli/PasswordInput.h rename to src/cli/Utils.h index b76061864..0c6b749a3 100644 --- a/src/cli/PasswordInput.h +++ b/src/cli/Utils.h @@ -15,17 +15,17 @@ * along with this program. If not, see . */ -#ifndef KEEPASSXC_PASSWORDINPUT_H -#define KEEPASSXC_PASSWORDINPUT_H +#ifndef KEEPASSXC_UTILS_H +#define KEEPASSXC_UTILS_H #include -class PasswordInput +class Utils { public: - PasswordInput(); static void setStdinEcho(bool enable); static QString getPassword(); + static int clipText(QString text); }; -#endif // KEEPASSXC_PASSWORDINPUT_H +#endif // KEEPASSXC_UTILS_H diff --git a/src/core/Database.cpp b/src/core/Database.cpp index d1c0fea4d..b0b215eb6 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -24,7 +24,7 @@ #include #include -#include "cli/PasswordInput.h" +#include "cli/Utils.h" #include "core/Group.h" #include "core/Metadata.h" #include "crypto/Random.h" @@ -404,7 +404,7 @@ Database* Database::unlockFromStdin(QString databaseFilename) outputTextStream << QString("Insert password to unlock " + databaseFilename + "\n> "); outputTextStream.flush(); - QString line = PasswordInput::getPassword(); + QString line = Utils::getPassword(); CompositeKey key = CompositeKey::readFromLine(line); return Database::openDatabaseFile(databaseFilename, key); } From 1d3028351470d6d50425169d8aa022db31abbb6e Mon Sep 17 00:00:00 2001 From: louib Date: Tue, 25 Jul 2017 13:41:52 -0400 Subject: [PATCH 018/402] Feature : --key-file option for CLI (#816) * removing readFromLine * Removing gui-prompt * execute uses an arg list. * Testing with key-file * Fixing the -a option in EntropyMeter. --- src/cli/Clip.cpp | 29 +++++----------- src/cli/Clip.h | 2 +- src/cli/Command.cpp | 2 +- src/cli/Command.h | 2 +- src/cli/EntropyMeter.cpp | 15 ++++---- src/cli/EntropyMeter.h | 2 +- src/cli/Extract.cpp | 20 +++++------ src/cli/Extract.h | 2 +- src/cli/List.cpp | 32 ++++------------- src/cli/List.h | 2 +- src/cli/Merge.cpp | 59 ++++++++++++-------------------- src/cli/Merge.h | 2 +- src/cli/Show.cpp | 18 ++++------ src/cli/Show.h | 2 +- src/cli/keepassxc-cli.cpp | 11 +++--- src/core/Database.cpp | 20 +++++++++-- src/core/Database.h | 2 +- src/gui/UnlockDatabaseDialog.cpp | 17 --------- src/gui/UnlockDatabaseDialog.h | 1 - src/keys/CompositeKey.cpp | 23 ------------- src/keys/CompositeKey.h | 1 - tests/TestKeys.cpp | 16 --------- tests/TestKeys.h | 1 - 23 files changed, 92 insertions(+), 189 deletions(-) diff --git a/src/cli/Clip.cpp b/src/cli/Clip.cpp index ab12bb1bc..d50b32f0c 100644 --- a/src/cli/Clip.cpp +++ b/src/cli/Clip.cpp @@ -22,16 +22,13 @@ #include "Clip.h" -#include #include -#include #include #include "cli/Utils.h" #include "core/Database.h" #include "core/Entry.h" #include "core/Group.h" -#include "gui/UnlockDatabaseDialog.h" Clip::Clip() { @@ -43,24 +40,19 @@ Clip::~Clip() { } -int Clip::execute(int argc, char** argv) +int Clip::execute(QStringList arguments) { - QStringList arguments; - // Skipping the first argument (keepassxc). - for (int i = 1; i < argc; ++i) { - arguments << QString(argv[i]); - } QTextStream out(stdout); - QApplication app(argc, argv); QCommandLineParser parser; parser.setApplicationDescription(this->description); parser.addPositionalArgument("database", QObject::tr("Path of the database.")); - QCommandLineOption guiPrompt(QStringList() << "g" - << "gui-prompt", - QObject::tr("Use a GUI prompt unlocking the database.")); - parser.addOption(guiPrompt); + QCommandLineOption keyFile(QStringList() << "k" + << "key-file", + QObject::tr("Key file of the database."), + QObject::tr("path")); + parser.addOption(keyFile); parser.addPositionalArgument("entry", QObject::tr("Path of the entry to clip.")); parser.addPositionalArgument( "timeout", @@ -74,16 +66,11 @@ int Clip::execute(int argc, char** argv) return EXIT_FAILURE; } - Database* db = nullptr; - if (parser.isSet("gui-prompt")) { - db = UnlockDatabaseDialog::openDatabasePrompt(args.at(0)); - } else { - db = Database::unlockFromStdin(args.at(0)); - } - + Database* db = Database::unlockFromStdin(args.at(0), parser.value(keyFile)); if (!db) { return EXIT_FAILURE; } + return this->clipEntry(db, args.at(1), args.value(2)); } diff --git a/src/cli/Clip.h b/src/cli/Clip.h index 1771e5581..a9e24faee 100644 --- a/src/cli/Clip.h +++ b/src/cli/Clip.h @@ -25,7 +25,7 @@ class Clip : public Command public: Clip(); ~Clip(); - int execute(int argc, char** argv); + int execute(QStringList arguments); int clipEntry(Database* database, QString entryPath, QString timeout); }; diff --git a/src/cli/Command.cpp b/src/cli/Command.cpp index 443208c7e..a7b6bab0a 100644 --- a/src/cli/Command.cpp +++ b/src/cli/Command.cpp @@ -35,7 +35,7 @@ Command::~Command() { } -int Command::execute(int, char**) +int Command::execute(QStringList) { return EXIT_FAILURE; } diff --git a/src/cli/Command.h b/src/cli/Command.h index adc4aad0d..b751c4a8e 100644 --- a/src/cli/Command.h +++ b/src/cli/Command.h @@ -29,7 +29,7 @@ class Command { public: virtual ~Command(); - virtual int execute(int argc, char** argv); + virtual int execute(QStringList arguments); QString name; QString description; QString getDescriptionLine(); diff --git a/src/cli/EntropyMeter.cpp b/src/cli/EntropyMeter.cpp index 62bd973f8..1632fe234 100644 --- a/src/cli/EntropyMeter.cpp +++ b/src/cli/EntropyMeter.cpp @@ -97,17 +97,18 @@ static void calculate(const char *pwd, int advanced) } } -int EntropyMeter::execute(int argc, char **argv) +int EntropyMeter::execute(QStringList arguments) { printf("KeePassXC Entropy Meter, based on zxcvbn-c.\nEnter your password below or pass it as argv\n"); printf(" Usage: entropy-meter [-a] [pwd1 pwd2 ...]\n> "); - int i, advanced; - if ((argc > 1) && (argv[1][0] == '-') && (!strcmp(argv[1], "-a"))) + int i, advanced = 0; + if (arguments.size() > 1 && arguments.at(1) == "-a") { advanced = 1; + arguments.removeAt(1); } - i = 2; - if (i >= argc) + i = 1; + if (i >= arguments.size()) { /* No test passwords on command line, so get them from stdin */ char line[500]; @@ -131,9 +132,9 @@ int EntropyMeter::execute(int argc, char **argv) else { /* Do the test passwords on the command line */ - for(; i < argc; ++i) + for(; i < arguments.size(); ++i) { - calculate(argv[i],advanced); + calculate(arguments.at(i).toLatin1(), advanced); } } return 0; diff --git a/src/cli/EntropyMeter.h b/src/cli/EntropyMeter.h index b1508f172..614e2de35 100644 --- a/src/cli/EntropyMeter.h +++ b/src/cli/EntropyMeter.h @@ -25,7 +25,7 @@ class EntropyMeter : public Command public: EntropyMeter(); ~EntropyMeter(); - int execute(int argc, char** argv); + int execute(QStringList arguments); }; #endif // KEEPASSXC_ENTROPYMETER_H diff --git a/src/cli/Extract.cpp b/src/cli/Extract.cpp index 2095c177e..a387686e2 100644 --- a/src/cli/Extract.cpp +++ b/src/cli/Extract.cpp @@ -21,15 +21,14 @@ #include "Extract.h" #include -#include #include -#include #include #include "cli/Utils.h" #include "core/Database.h" #include "format/KeePass2Reader.h" #include "keys/CompositeKey.h" +#include "keys/PasswordKey.h" Extract::Extract() { @@ -41,15 +40,8 @@ Extract::~Extract() { } -int Extract::execute(int argc, char** argv) +int Extract::execute(QStringList arguments) { - QStringList arguments; - // Skipping the first argument (keepassxc). - for (int i = 1; i < argc; ++i) { - arguments << QString(argv[i]); - } - - QCoreApplication app(argc, argv); QTextStream out(stdout); QCommandLineParser parser; @@ -66,8 +58,12 @@ int Extract::execute(int argc, char** argv) out << "Insert the database password\n> "; out.flush(); + CompositeKey compositeKey; + QString line = Utils::getPassword(); - CompositeKey key = CompositeKey::readFromLine(line); + PasswordKey passwordKey; + passwordKey.setPassword(line); + compositeKey.addKey(passwordKey); QString databaseFilename = args.at(0); QFile dbFile(databaseFilename); @@ -82,7 +78,7 @@ int Extract::execute(int argc, char** argv) KeePass2Reader reader; reader.setSaveXml(true); - Database* db = reader.readDatabase(&dbFile, key); + Database* db = reader.readDatabase(&dbFile, compositeKey); delete db; QByteArray xmlData = reader.xmlData(); diff --git a/src/cli/Extract.h b/src/cli/Extract.h index eadbb9e34..bef6a7821 100644 --- a/src/cli/Extract.h +++ b/src/cli/Extract.h @@ -25,7 +25,7 @@ class Extract : public Command public: Extract(); ~Extract(); - int execute(int argc, char** argv); + int execute(QStringList arguments); }; #endif // KEEPASSXC_EXTRACT_H diff --git a/src/cli/List.cpp b/src/cli/List.cpp index f3f22f6e3..63e48ee22 100644 --- a/src/cli/List.cpp +++ b/src/cli/List.cpp @@ -20,16 +20,12 @@ #include "List.h" -#include #include -#include -#include #include #include "core/Database.h" #include "core/Entry.h" #include "core/Group.h" -#include "gui/UnlockDatabaseDialog.h" List::List() { @@ -41,14 +37,8 @@ List::~List() { } -int List::execute(int argc, char** argv) +int List::execute(QStringList arguments) { - QStringList arguments; - // Skipping the first argument (keepassxc). - for (int i = 1; i < argc; ++i) { - arguments << QString(argv[i]); - } - QTextStream out(stdout); QCommandLineParser parser; @@ -56,28 +46,20 @@ int List::execute(int argc, char** argv) parser.addPositionalArgument("database", QObject::tr("Path of the database.")); parser.addPositionalArgument( "group", QObject::tr("Path of the group to list. Default is /"), QString("[group]")); - QCommandLineOption guiPrompt(QStringList() << "g" - << "gui-prompt", - QObject::tr("Use a GUI prompt unlocking the database.")); - parser.addOption(guiPrompt); + QCommandLineOption keyFile(QStringList() << "k" + << "key-file", + QObject::tr("Key file of the database."), + QObject::tr("path")); + parser.addOption(keyFile); parser.process(arguments); const QStringList args = parser.positionalArguments(); if (args.size() != 1 && args.size() != 2) { - QCoreApplication app(argc, argv); out << parser.helpText().replace("keepassxc-cli", "keepassxc-cli ls"); return EXIT_FAILURE; } - Database* db = nullptr; - if (parser.isSet("gui-prompt")) { - QApplication app(argc, argv); - db = UnlockDatabaseDialog::openDatabasePrompt(args.at(0)); - } else { - QCoreApplication app(argc, argv); - db = Database::unlockFromStdin(args.at(0)); - } - + Database* db = Database::unlockFromStdin(args.at(0), parser.value(keyFile)); if (db == nullptr) { return EXIT_FAILURE; } diff --git a/src/cli/List.h b/src/cli/List.h index cd9f8d1df..d12105f3c 100644 --- a/src/cli/List.h +++ b/src/cli/List.h @@ -25,7 +25,7 @@ class List : public Command public: List(); ~List(); - int execute(int argc, char** argv); + int execute(QStringList arguments); int listGroup(Database* database, QString groupPath = QString("")); }; diff --git a/src/cli/Merge.cpp b/src/cli/Merge.cpp index 7567029c6..a713cbb33 100644 --- a/src/cli/Merge.cpp +++ b/src/cli/Merge.cpp @@ -19,14 +19,10 @@ #include "Merge.h" -#include #include -#include -#include #include #include "core/Database.h" -#include "gui/UnlockDatabaseDialog.h" Merge::Merge() { @@ -38,14 +34,8 @@ Merge::~Merge() { } -int Merge::execute(int argc, char** argv) +int Merge::execute(QStringList arguments) { - QStringList arguments; - // Skipping the first argument (keepassxc). - for (int i = 1; i < argc; ++i) { - arguments << QString(argv[i]); - } - QTextStream out(stdout); QCommandLineParser parser; @@ -55,52 +45,47 @@ int Merge::execute(int argc, char** argv) QCommandLineOption samePasswordOption( QStringList() << "s" - << "same-password", - QObject::tr("Use the same password for both database files.")); + << "same-credentials", + QObject::tr("Use the same credentials for both database files.")); - QCommandLineOption guiPrompt(QStringList() << "g" - << "gui-prompt", - QObject::tr("Use a GUI prompt unlocking the database.")); - parser.addOption(guiPrompt); + QCommandLineOption keyFile(QStringList() << "k" + << "key-file", + QObject::tr("Key file of the database."), + QObject::tr("path")); + parser.addOption(keyFile); + QCommandLineOption keyFileFrom(QStringList() << "f" + << "key-file-from", + QObject::tr("Key file of the database to merge from."), + QObject::tr("path")); + parser.addOption(keyFileFrom); parser.addOption(samePasswordOption); parser.process(arguments); const QStringList args = parser.positionalArguments(); if (args.size() != 2) { - QCoreApplication app(argc, argv); out << parser.helpText().replace("keepassxc-cli", "keepassxc-cli merge"); return EXIT_FAILURE; } - Database* db1; - Database* db2; - if (parser.isSet("gui-prompt")) { - QApplication app(argc, argv); - db1 = UnlockDatabaseDialog::openDatabasePrompt(args.at(0)); - if (!parser.isSet("same-password")) { - db2 = UnlockDatabaseDialog::openDatabasePrompt(args.at(1)); - } else { - db2 = Database::openDatabaseFile(args.at(1), *(db1->key().clone())); - } - } else { - QCoreApplication app(argc, argv); - db1 = Database::unlockFromStdin(args.at(0)); - if (!parser.isSet("same-password")) { - db2 = Database::unlockFromStdin(args.at(1)); - } else { - db2 = Database::openDatabaseFile(args.at(1), *(db1->key().clone())); - } - } + Database* db1 = Database::unlockFromStdin(args.at(0), parser.value(keyFile)); if (db1 == nullptr) { return EXIT_FAILURE; } + + Database* db2; + if (!parser.isSet("same-credentials")) { + db2 = Database::unlockFromStdin(args.at(1), parser.value(keyFileFrom)); + } else { + db2 = Database::openDatabaseFile(args.at(1), *(db1->key().clone())); + } if (db2 == nullptr) { return EXIT_FAILURE; } db1->merge(db2); + QString errorMessage = db1->saveToFile(args.at(0)); if (!errorMessage.isEmpty()) { qCritical("Unable to save database to file : %s", qPrintable(errorMessage)); diff --git a/src/cli/Merge.h b/src/cli/Merge.h index bb121f579..4f0b42836 100644 --- a/src/cli/Merge.h +++ b/src/cli/Merge.h @@ -25,7 +25,7 @@ class Merge : public Command public: Merge(); ~Merge(); - int execute(int argc, char** argv); + int execute(QStringList arguments); }; #endif // KEEPASSXC_MERGE_H diff --git a/src/cli/Show.cpp b/src/cli/Show.cpp index 55da87515..d137f74df 100644 --- a/src/cli/Show.cpp +++ b/src/cli/Show.cpp @@ -21,8 +21,6 @@ #include "Show.h" #include -#include -#include #include #include "core/Database.h" @@ -39,20 +37,18 @@ Show::~Show() { } -int Show::execute(int argc, char** argv) +int Show::execute(QStringList arguments) { - QStringList arguments; - // Skipping the first argument (keepassxc). - for (int i = 1; i < argc; ++i) { - arguments << QString(argv[i]); - } - - QCoreApplication app(argc, argv); QTextStream out(stdout); QCommandLineParser parser; parser.setApplicationDescription(this->description); parser.addPositionalArgument("database", QObject::tr("Path of the database.")); + QCommandLineOption keyFile(QStringList() << "k" + << "key-file", + QObject::tr("Key file of the database."), + QObject::tr("path")); + parser.addOption(keyFile); parser.addPositionalArgument("entry", QObject::tr("Name of the entry to show.")); parser.process(arguments); @@ -62,7 +58,7 @@ int Show::execute(int argc, char** argv) return EXIT_FAILURE; } - Database* db = Database::unlockFromStdin(args.at(0)); + Database* db = Database::unlockFromStdin(args.at(0), parser.value(keyFile)); if (db == nullptr) { return EXIT_FAILURE; } diff --git a/src/cli/Show.h b/src/cli/Show.h index b10e6bf0a..f3bc55e60 100644 --- a/src/cli/Show.h +++ b/src/cli/Show.h @@ -25,7 +25,7 @@ class Show : public Command public: Show(); ~Show(); - int execute(int argc, char** argv); + int execute(QStringList arguments); int showEntry(Database* database, QString entryPath); }; diff --git a/src/cli/keepassxc-cli.cpp b/src/cli/keepassxc-cli.cpp index 37210b6a1..1462f92b9 100644 --- a/src/cli/keepassxc-cli.cpp +++ b/src/cli/keepassxc-cli.cpp @@ -43,6 +43,9 @@ int main(int argc, char** argv) return EXIT_FAILURE; } + QCoreApplication app(argc, argv); + app.setApplicationVersion(KEEPASSX_VERSION); + QTextStream out(stdout); QStringList arguments; for (int i = 0; i < argc; ++i) { @@ -67,8 +70,6 @@ int main(int argc, char** argv) parser.parse(arguments); if (parser.positionalArguments().size() < 1) { - QCoreApplication app(argc, argv); - app.setApplicationVersion(KEEPASSX_VERSION); if (parser.isSet("version")) { // Switch to parser.showVersion() when available (QT 5.4). out << KEEPASSX_VERSION << endl; @@ -82,14 +83,14 @@ int main(int argc, char** argv) if (command == nullptr) { qCritical("Invalid command %s.", qPrintable(commandName)); - QCoreApplication app(argc, argv); - app.setApplicationVersion(KEEPASSX_VERSION); // showHelp exits the application immediately, so we need to set the // exit code here. parser.showHelp(EXIT_FAILURE); } - int exitCode = command->execute(argc, argv); + // Removing the first argument (keepassxc). + arguments.removeFirst(); + int exitCode = command->execute(arguments); #if defined(WITH_ASAN) && defined(WITH_LSAN) // do leak check here to prevent massive tail of end-of-process leak errors from third-party libraries diff --git a/src/core/Database.cpp b/src/core/Database.cpp index b0b215eb6..fdfc11cfe 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -31,6 +31,9 @@ #include "format/KeePass2.h" #include "format/KeePass2Reader.h" #include "format/KeePass2Writer.h" +#include "keys/PasswordKey.h" +#include "keys/FileKey.h" +#include "keys/CompositeKey.h" QHash Database::m_uuidMap; @@ -397,16 +400,27 @@ Database* Database::openDatabaseFile(QString fileName, CompositeKey key) return db; } -Database* Database::unlockFromStdin(QString databaseFilename) +Database* Database::unlockFromStdin(QString databaseFilename, QString keyFilename) { QTextStream outputTextStream(stdout); outputTextStream << QString("Insert password to unlock " + databaseFilename + "\n> "); outputTextStream.flush(); + CompositeKey compositeKey; + QString line = Utils::getPassword(); - CompositeKey key = CompositeKey::readFromLine(line); - return Database::openDatabaseFile(databaseFilename, key); + PasswordKey passwordKey; + passwordKey.setPassword(line); + compositeKey.addKey(passwordKey); + + if (!keyFilename.isEmpty()) { + FileKey fileKey; + fileKey.load(keyFilename); + compositeKey.addKey(fileKey); + } + + return Database::openDatabaseFile(databaseFilename, compositeKey); } QString Database::saveToFile(QString filePath) diff --git a/src/core/Database.h b/src/core/Database.h index a799e0b3b..2ab556a07 100644 --- a/src/core/Database.h +++ b/src/core/Database.h @@ -122,7 +122,7 @@ public: static Database* databaseByUuid(const Uuid& uuid); static Database* openDatabaseFile(QString fileName, CompositeKey key); - static Database* unlockFromStdin(QString databaseFilename); + static Database* unlockFromStdin(QString databaseFilename, QString keyFilename = QString("")); signals: void groupDataChanged(Group* group); diff --git a/src/gui/UnlockDatabaseDialog.cpp b/src/gui/UnlockDatabaseDialog.cpp index bf5cbdbc0..a0c915467 100644 --- a/src/gui/UnlockDatabaseDialog.cpp +++ b/src/gui/UnlockDatabaseDialog.cpp @@ -54,20 +54,3 @@ void UnlockDatabaseDialog::complete(bool r) reject(); } } - -Database* UnlockDatabaseDialog::openDatabasePrompt(QString databaseFilename) -{ - - UnlockDatabaseDialog* unlockDatabaseDialog = new UnlockDatabaseDialog(); - unlockDatabaseDialog->setObjectName("Open database"); - unlockDatabaseDialog->setDBFilename(databaseFilename); - unlockDatabaseDialog->show(); - unlockDatabaseDialog->exec(); - - Database* db = unlockDatabaseDialog->database(); - if (!db) { - qWarning("Could not open database %s.", qPrintable(databaseFilename)); - } - delete unlockDatabaseDialog; - return db; -} diff --git a/src/gui/UnlockDatabaseDialog.h b/src/gui/UnlockDatabaseDialog.h index 55830c97e..9a42ed6e2 100644 --- a/src/gui/UnlockDatabaseDialog.h +++ b/src/gui/UnlockDatabaseDialog.h @@ -35,7 +35,6 @@ public: void setDBFilename(const QString& filename); void clearForms(); Database* database(); - static Database* openDatabasePrompt(QString databaseFilename); signals: void unlockDone(bool); diff --git a/src/keys/CompositeKey.cpp b/src/keys/CompositeKey.cpp index 3b1a82a22..83a6725c9 100644 --- a/src/keys/CompositeKey.cpp +++ b/src/keys/CompositeKey.cpp @@ -80,29 +80,6 @@ CompositeKey& CompositeKey::operator=(const CompositeKey& key) return *this; } -/* - * Read a key from a line of input. - * If the line references a valid file - * path, the key is loaded from file. - */ -CompositeKey CompositeKey::readFromLine(QString line) -{ - - CompositeKey key; - if (QFile::exists(line)) { - FileKey fileKey; - fileKey.load(line); - key.addKey(fileKey); - } - else { - PasswordKey password; - password.setPassword(line); - key.addKey(password); - } - return key; - -} - QByteArray CompositeKey::rawKey() const { CryptoHash cryptoHash(CryptoHash::Sha256); diff --git a/src/keys/CompositeKey.h b/src/keys/CompositeKey.h index 12e2d955d..d9c4e3a9e 100644 --- a/src/keys/CompositeKey.h +++ b/src/keys/CompositeKey.h @@ -46,7 +46,6 @@ public: void addChallengeResponseKey(QSharedPointer key); static int transformKeyBenchmark(int msec); - static CompositeKey readFromLine(QString line); private: static QByteArray transformKeyRaw(const QByteArray& key, const QByteArray& seed, diff --git a/tests/TestKeys.cpp b/tests/TestKeys.cpp index dea0436f0..738b39a26 100644 --- a/tests/TestKeys.cpp +++ b/tests/TestKeys.cpp @@ -84,22 +84,6 @@ void TestKeys::testComposite() delete compositeKey4; } -void TestKeys::testCompositeKeyReadFromLine() -{ - - QString keyFilename = QString("%1/FileKeyXml.key").arg(QString(KEEPASSX_TEST_DATA_DIR)); - - CompositeKey compositeFileKey = CompositeKey::readFromLine(keyFilename); - FileKey fileKey; - fileKey.load(keyFilename); - QCOMPARE(compositeFileKey.rawKey().size(), fileKey.rawKey().size()); - - CompositeKey compositePasswordKey = CompositeKey::readFromLine(QString("password")); - PasswordKey passwordKey(QString("password")); - QCOMPARE(compositePasswordKey.rawKey().size(), passwordKey.rawKey().size()); - -} - void TestKeys::testFileKey() { QFETCH(QString, type); diff --git a/tests/TestKeys.h b/tests/TestKeys.h index 06ed3b0a1..1cbe7bf96 100644 --- a/tests/TestKeys.h +++ b/tests/TestKeys.h @@ -28,7 +28,6 @@ class TestKeys : public QObject private slots: void initTestCase(); void testComposite(); - void testCompositeKeyReadFromLine(); void testFileKey(); void testFileKey_data(); void testCreateFileKey(); From 4c76c97762c2204dea30318be67f8861ac38160a Mon Sep 17 00:00:00 2001 From: Michael Lass Date: Sat, 15 Jul 2017 23:48:51 +0200 Subject: [PATCH 019/402] Open previously opened databases in correct order In LastOpenedDatabases, the most recently opened file is listed first and the least recently opened one is listed last. If the databases are re-opened in this order, LastOpenedDatabases is reversed afterwards. To avoid this, load the files in reverse order, so LastOpenedDatabases is not modified. --- src/main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 2018d29ea..354c8a3bd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -131,7 +131,8 @@ int main(int argc, char** argv) if (config()->get("OpenPreviousDatabasesOnStartup").toBool()) { const QStringList filenames = config()->get("LastOpenedDatabases").toStringList(); - for (const QString& filename : filenames) { + for (int ii = filenames.size()-1; ii >= 0; ii--) { + QString filename = filenames.at(ii); if (!filename.isEmpty() && QFile::exists(filename)) { mainWindow.openDatabase(filename, QString(), QString()); } From fe877486fff8e138a96b846776a4512fabd66a0a Mon Sep 17 00:00:00 2001 From: louib Date: Sat, 29 Jul 2017 17:24:24 -0400 Subject: [PATCH 020/402] Handle FileKey::load errors (--key-file) (#825) --- src/core/Database.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/core/Database.cpp b/src/core/Database.cpp index fdfc11cfe..2e9112c7c 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -402,24 +402,28 @@ Database* Database::openDatabaseFile(QString fileName, CompositeKey key) Database* Database::unlockFromStdin(QString databaseFilename, QString keyFilename) { + CompositeKey compositeKey; + + if (!keyFilename.isEmpty()) { + FileKey fileKey; + QString errorMessage; + if (!fileKey.load(keyFilename, &errorMessage)) { + qCritical("Failed to load key file %s : %s", qPrintable(keyFilename), qPrintable(errorMessage)); + return nullptr; + } + compositeKey.addKey(fileKey); + } + QTextStream outputTextStream(stdout); outputTextStream << QString("Insert password to unlock " + databaseFilename + "\n> "); outputTextStream.flush(); - CompositeKey compositeKey; - QString line = Utils::getPassword(); PasswordKey passwordKey; passwordKey.setPassword(line); compositeKey.addKey(passwordKey); - if (!keyFilename.isEmpty()) { - FileKey fileKey; - fileKey.load(keyFilename); - compositeKey.addKey(fileKey); - } - return Database::openDatabaseFile(databaseFilename, compositeKey); } From 839a61ef59083ab610dd9cbe6c5560d24b3e3ec0 Mon Sep 17 00:00:00 2001 From: louib Date: Mon, 31 Jul 2017 10:17:08 -0400 Subject: [PATCH 021/402] Moving keyFile after password. (#830) * Moving keyFile after password. * Using tr() in unlockFromStdin. --- src/core/Database.cpp | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/core/Database.cpp b/src/core/Database.cpp index 2e9112c7c..4eb02ad1d 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -403,20 +403,10 @@ Database* Database::openDatabaseFile(QString fileName, CompositeKey key) Database* Database::unlockFromStdin(QString databaseFilename, QString keyFilename) { CompositeKey compositeKey; - - if (!keyFilename.isEmpty()) { - FileKey fileKey; - QString errorMessage; - if (!fileKey.load(keyFilename, &errorMessage)) { - qCritical("Failed to load key file %s : %s", qPrintable(keyFilename), qPrintable(errorMessage)); - return nullptr; - } - compositeKey.addKey(fileKey); - } - QTextStream outputTextStream(stdout); + QTextStream errorTextStream(stderr); - outputTextStream << QString("Insert password to unlock " + databaseFilename + "\n> "); + outputTextStream << QObject::tr("Insert password to unlock %1: ").arg(databaseFilename); outputTextStream.flush(); QString line = Utils::getPassword(); @@ -424,6 +414,17 @@ Database* Database::unlockFromStdin(QString databaseFilename, QString keyFilenam passwordKey.setPassword(line); compositeKey.addKey(passwordKey); + if (!keyFilename.isEmpty()) { + FileKey fileKey; + QString errorMessage; + if (!fileKey.load(keyFilename, &errorMessage)) { + errorTextStream << QObject::tr("Failed to load key file %1 : %2").arg(keyFilename).arg(errorMessage); + errorTextStream << endl; + return nullptr; + } + compositeKey.addKey(fileKey); + } + return Database::openDatabaseFile(databaseFilename, compositeKey); } From 23b818f9e668b1d15d84264fb64ef5604a368aa3 Mon Sep 17 00:00:00 2001 From: Yen Chi Hsuan Date: Wed, 2 Aug 2017 04:57:19 +0800 Subject: [PATCH 022/402] Support --key-file in `keepassxc-cli extract` (#824) --- src/cli/Extract.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/cli/Extract.cpp b/src/cli/Extract.cpp index a387686e2..0e5b10a2f 100644 --- a/src/cli/Extract.cpp +++ b/src/cli/Extract.cpp @@ -28,6 +28,7 @@ #include "core/Database.h" #include "format/KeePass2Reader.h" #include "keys/CompositeKey.h" +#include "keys/FileKey.h" #include "keys/PasswordKey.h" Extract::Extract() @@ -43,10 +44,16 @@ Extract::~Extract() int Extract::execute(QStringList arguments) { QTextStream out(stdout); + QTextStream errorTextStream(stderr); QCommandLineParser parser; parser.setApplicationDescription(this->description); parser.addPositionalArgument("database", QObject::tr("Path of the database to extract.")); + QCommandLineOption keyFile(QStringList() << "k" + << "key-file", + QObject::tr("Key file of the database."), + QObject::tr("path")); + parser.addOption(keyFile); parser.process(arguments); const QStringList args = parser.positionalArguments(); @@ -65,6 +72,20 @@ int Extract::execute(QStringList arguments) passwordKey.setPassword(line); compositeKey.addKey(passwordKey); + QString keyFilePath = parser.value(keyFile); + if (!keyFilePath.isEmpty()) { + FileKey fileKey; + QString errorMsg; + if (!fileKey.load(keyFilePath, &errorMsg)) { + errorTextStream << QObject::tr("Failed to load key file %s: %s").arg(keyFilePath).arg(errorMsg); + errorTextStream << endl; + return EXIT_FAILURE; + } + + compositeKey.addKey(fileKey); + } + + QString databaseFilename = args.at(0); QFile dbFile(databaseFilename); if (!dbFile.exists()) { From b4dcfd650a4618d14f5f693b5dc585df1451ca23 Mon Sep 17 00:00:00 2001 From: louib Date: Tue, 1 Aug 2017 17:04:47 -0400 Subject: [PATCH 023/402] Normalizing translated messages in Extract. --- src/cli/Extract.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cli/Extract.cpp b/src/cli/Extract.cpp index 0e5b10a2f..2d519f9a1 100644 --- a/src/cli/Extract.cpp +++ b/src/cli/Extract.cpp @@ -62,7 +62,7 @@ int Extract::execute(QStringList arguments) return EXIT_FAILURE; } - out << "Insert the database password\n> "; + out << QObject::tr("Insert password to unlock %1: ").arg(args.at(0)); out.flush(); CompositeKey compositeKey; @@ -77,7 +77,7 @@ int Extract::execute(QStringList arguments) FileKey fileKey; QString errorMsg; if (!fileKey.load(keyFilePath, &errorMsg)) { - errorTextStream << QObject::tr("Failed to load key file %s: %s").arg(keyFilePath).arg(errorMsg); + errorTextStream << QObject::tr("Failed to load key file %1 : %2").arg(keyFilePath).arg(errorMsg); errorTextStream << endl; return EXIT_FAILURE; } From b2107b5e276481efc36f95c1af09cd76b9a67ba5 Mon Sep 17 00:00:00 2001 From: louib Date: Sat, 5 Aug 2017 12:20:26 -0400 Subject: [PATCH 024/402] Adding Locate command. (#829) * Adding Locate command. * Adding group searching in locate --- src/cli/CMakeLists.txt | 2 + src/cli/Command.cpp | 2 + src/cli/Locate.cpp | 87 ++++++++++++++++++++++++++++++++++++++++++ src/cli/Locate.h | 32 ++++++++++++++++ src/core/Group.cpp | 22 +++++++++++ src/core/Group.h | 1 + tests/TestGroup.cpp | 60 +++++++++++++++++++++++++++++ tests/TestGroup.h | 1 + 8 files changed, 207 insertions(+) create mode 100644 src/cli/Locate.cpp create mode 100644 src/cli/Locate.h diff --git a/src/cli/CMakeLists.txt b/src/cli/CMakeLists.txt index 1f7ab25d9..f9958e5b2 100644 --- a/src/cli/CMakeLists.txt +++ b/src/cli/CMakeLists.txt @@ -24,6 +24,8 @@ set(cli_SOURCES Extract.h List.cpp List.h + Locate.cpp + Locate.h Merge.cpp Merge.h Show.cpp diff --git a/src/cli/Command.cpp b/src/cli/Command.cpp index a7b6bab0a..721710776 100644 --- a/src/cli/Command.cpp +++ b/src/cli/Command.cpp @@ -26,6 +26,7 @@ #include "EntropyMeter.h" #include "Extract.h" #include "List.h" +#include "Locate.h" #include "Merge.h" #include "Show.h" @@ -58,6 +59,7 @@ void populateCommands() commands.insert(QString("clip"), new Clip()); commands.insert(QString("entropy-meter"), new EntropyMeter()); commands.insert(QString("extract"), new Extract()); + commands.insert(QString("locate"), new Locate()); commands.insert(QString("ls"), new List()); commands.insert(QString("merge"), new Merge()); commands.insert(QString("show"), new Show()); diff --git a/src/cli/Locate.cpp b/src/cli/Locate.cpp new file mode 100644 index 000000000..bb9831be1 --- /dev/null +++ b/src/cli/Locate.cpp @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2017 KeePassXC Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include + +#include "Locate.h" + +#include +#include +#include + +#include "cli/Utils.h" +#include "core/Database.h" +#include "core/Entry.h" +#include "core/Group.h" + +Locate::Locate() +{ + this->name = QString("locate"); + this->description = QObject::tr("Find entries quickly."); +} + +Locate::~Locate() +{ +} + +int Locate::execute(QStringList arguments) +{ + + QTextStream out(stdout); + + QCommandLineParser parser; + parser.setApplicationDescription(this->description); + parser.addPositionalArgument("database", QObject::tr("Path of the database.")); + parser.addPositionalArgument("term", QObject::tr("Search term.")); + QCommandLineOption keyFile(QStringList() << "k" + << "key-file", + QObject::tr("Key file of the database."), + QObject::tr("path")); + parser.addOption(keyFile); + parser.process(arguments); + + const QStringList args = parser.positionalArguments(); + if (args.size() != 2) { + out << parser.helpText().replace("keepassxc-cli", "keepassxc-cli locate"); + return EXIT_FAILURE; + } + + Database* db = Database::unlockFromStdin(args.at(0), parser.value(keyFile)); + if (!db) { + return EXIT_FAILURE; + } + + return this->locateEntry(db, args.at(1)); +} + +int Locate::locateEntry(Database* database, QString searchTerm) +{ + + QTextStream outputTextStream(stdout, QIODevice::WriteOnly); + QStringList results = database->rootGroup()->locate(searchTerm); + if (results.isEmpty()) { + outputTextStream << "No results for that search term" << endl; + return EXIT_SUCCESS; + } + + for (QString result : results) { + outputTextStream << result << endl; + } + return EXIT_SUCCESS; + +} diff --git a/src/cli/Locate.h b/src/cli/Locate.h new file mode 100644 index 000000000..c919b0cb3 --- /dev/null +++ b/src/cli/Locate.h @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2017 KeePassXC Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef KEEPASSXC_LOCATE_H +#define KEEPASSXC_LOCATE_H + +#include "Command.h" + +class Locate : public Command +{ +public: + Locate(); + ~Locate(); + int execute(QStringList arguments); + int locateEntry(Database* database, QString searchTerm); +}; + +#endif // KEEPASSXC_LOCATE_H diff --git a/src/core/Group.cpp b/src/core/Group.cpp index 008755510..e199ae43f 100644 --- a/src/core/Group.cpp +++ b/src/core/Group.cpp @@ -908,3 +908,25 @@ void Group::resolveConflict(Entry* existingEntry, Entry* otherEntry) break; } } + +QStringList Group::locate(QString locateTerm, QString currentPath) +{ + Q_ASSERT(!locateTerm.isNull()); + QStringList response; + + for (Entry* entry : asConst(m_entries)) { + QString entryPath = currentPath + entry->title(); + if (entryPath.toLower().contains(locateTerm.toLower())) { + response << entryPath; + } + } + + for (Group* group : asConst(m_children)) { + for (QString path : group->locate(locateTerm, currentPath + group->name() + QString("/"))) { + response << path; + } + } + + return response; + +} diff --git a/src/core/Group.h b/src/core/Group.h index 10313b488..4e76538e0 100644 --- a/src/core/Group.h +++ b/src/core/Group.h @@ -84,6 +84,7 @@ public: Entry* findEntryByUuid(const Uuid& uuid); Entry* findEntryByPath(QString entryPath, QString basePath = QString("")); Group* findGroupByPath(QString groupPath, QString basePath = QString("/")); + QStringList locate(QString locateTerm, QString currentPath = QString("/")); void setUuid(const Uuid& uuid); void setName(const QString& name); void setNotes(const QString& notes); diff --git a/tests/TestGroup.cpp b/tests/TestGroup.cpp index 14956618e..5553feae8 100644 --- a/tests/TestGroup.cpp +++ b/tests/TestGroup.cpp @@ -755,3 +755,63 @@ void TestGroup::testPrint() delete db; } + +void TestGroup::testLocate() +{ + Database* db = new Database(); + + Entry* entry1 = new Entry(); + entry1->setTitle("entry1"); + entry1->setGroup(db->rootGroup()); + + Entry* entry2 = new Entry(); + entry2->setTitle("entry2"); + entry2->setGroup(db->rootGroup()); + + Group* group1 = new Group(); + group1->setName("group1"); + group1->setParent(db->rootGroup()); + + Group* group2 = new Group(); + group2->setName("group2"); + group2->setParent(group1); + + Entry* entry3 = new Entry(); + entry3->setTitle("entry3"); + entry3->setGroup(group1); + + Entry* entry43 = new Entry(); + entry43->setTitle("entry43"); + entry43->setGroup(group1); + + Entry* google = new Entry(); + google->setTitle("Google"); + google->setGroup(group2); + + QStringList results = db->rootGroup()->locate("entry"); + QVERIFY(results.size() == 4); + QVERIFY(results.contains("/group1/entry43")); + + results = db->rootGroup()->locate("entry1"); + QVERIFY(results.size() == 1); + QVERIFY(results.contains("/entry1")); + + results = db->rootGroup()->locate("Entry1"); + QVERIFY(results.size() == 1); + QVERIFY(results.contains("/entry1")); + + results = db->rootGroup()->locate("invalid"); + QVERIFY(results.size() == 0); + + results = db->rootGroup()->locate("google"); + QVERIFY(results.size() == 1); + QVERIFY(results.contains("/group1/group2/Google")); + + results = db->rootGroup()->locate("group1"); + QVERIFY(results.size() == 3); + QVERIFY(results.contains("/group1/entry3")); + QVERIFY(results.contains("/group1/entry43")); + QVERIFY(results.contains("/group1/group2/Google")); + + delete db; +} diff --git a/tests/TestGroup.h b/tests/TestGroup.h index 16bb42acd..16f4906ee 100644 --- a/tests/TestGroup.h +++ b/tests/TestGroup.h @@ -42,6 +42,7 @@ private slots: void testFindEntry(); void testFindGroupByPath(); void testPrint(); + void testLocate(); private: Database* createMergeTestDatabase(); From 09d6d3c545426662f896083191a0619faf54eb92 Mon Sep 17 00:00:00 2001 From: luzpaz Date: Fri, 18 Aug 2017 16:18:55 -0400 Subject: [PATCH 025/402] misc. typo fixes non-user-facing trivial source comment fixes --- src/core/Entry.cpp | 2 +- src/core/Entry.h | 4 ++-- src/http/Server.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index 267c9ad2b..238c26176 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -588,7 +588,7 @@ Entry* Entry::clone(CloneFlags flags) const entry->m_attachments->copyDataFrom(m_attachments); if (flags & CloneUserAsRef) { - // Build the username refrence + // Build the username reference QString username = "{REF:U@I:" + m_uuid.toHex() + "}"; entry->m_attributes->set(EntryAttributes::UserNameKey, username.toUpper(), m_attributes->isProtected(EntryAttributes::UserNameKey)); } diff --git a/src/core/Entry.h b/src/core/Entry.h index 889a9334e..d97b09269 100644 --- a/src/core/Entry.h +++ b/src/core/Entry.h @@ -129,8 +129,8 @@ public: CloneResetTimeInfo = 2, // set all TimeInfo attributes to the current time CloneIncludeHistory = 4, // clone the history items CloneRenameTitle = 8, // add "-Clone" after the original title - CloneUserAsRef = 16, // Add the user as a refrence to the origional entry - ClonePassAsRef = 32, // Add the password as a refrence to the origional entry + CloneUserAsRef = 16, // Add the user as a reference to the original entry + ClonePassAsRef = 32, // Add the password as a reference to the original entry }; Q_DECLARE_FLAGS(CloneFlags, CloneFlag) diff --git a/src/http/Server.cpp b/src/http/Server.cpp index faac7be23..6a9cd94b1 100644 --- a/src/http/Server.cpp +++ b/src/http/Server.cpp @@ -170,7 +170,7 @@ void Server::handleRequest(const QByteArray& data, QHttpResponse* response) // THIS IS A FAKE HACK!!! // the real "error" is a misbehavior in the QJSON qobject2qvariant method // 1. getLogins returns an empty QList into protocolResp->m_entries - // in toJson() function the following happend: + // in toJson() function the following happened: // 2. QJson::QObjectHelper::qobject2qvariant marks m_entries as invalid !!! // 3. QJson::Serializer write out Entries as null instead of empty list //(4. ChromeIPass tries to access Entries.length and fails with null pointer exception) From 03bd3464320c377702a58656378a908b5cf999c2 Mon Sep 17 00:00:00 2001 From: Ettore Dreucci Date: Mon, 21 Aug 2017 02:02:33 +0200 Subject: [PATCH 026/402] Solve issue #847: Keyboard autofocus on search filed at startup Signed-off-by: Ettore Dreucci --- src/gui/MainWindow.cpp | 5 +++++ src/gui/SearchWidget.h | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index f1d5f866c..ec1406c4a 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -464,6 +464,11 @@ void MainWindow::setMenuActionState(DatabaseWidget::Mode mode) m_ui->actionDatabaseMerge->setEnabled(m_ui->tabWidget->currentIndex() != -1); m_searchWidgetAction->setEnabled(true); + + //if not already in search mode focus the search widget and select all its content + if (!inSearch) { + m_ui->toolBar->findChild("SearchWidget")->searchFocus(); + } break; } case DatabaseWidget::EditMode: diff --git a/src/gui/SearchWidget.h b/src/gui/SearchWidget.h index 2441ef60b..15e3488fb 100644 --- a/src/gui/SearchWidget.h +++ b/src/gui/SearchWidget.h @@ -55,13 +55,13 @@ signals: public slots: void databaseChanged(DatabaseWidget* dbWidget = 0); + void searchFocus(); private slots: void startSearchTimer(); void startSearch(); void updateCaseSensitive(); void updateLimitGroup(); - void searchFocus(); private: const QScopedPointer m_ui; From 8b46feb085d59144b2fb9073c9b2920485d00798 Mon Sep 17 00:00:00 2001 From: louib Date: Mon, 21 Aug 2017 21:33:49 -0400 Subject: [PATCH 027/402] Adding manpage --- src/cli/CMakeLists.txt | 5 ++++ src/cli/keepassxc-cli.1 | 55 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 src/cli/keepassxc-cli.1 diff --git a/src/cli/CMakeLists.txt b/src/cli/CMakeLists.txt index f9958e5b2..43ed06be6 100644 --- a/src/cli/CMakeLists.txt +++ b/src/cli/CMakeLists.txt @@ -47,3 +47,8 @@ target_link_libraries(keepassxc-cli install(TARGETS keepassxc-cli BUNDLE DESTINATION . COMPONENT Runtime RUNTIME DESTINATION ${CLI_INSTALL_DIR} COMPONENT Runtime) + +if(APPLE OR UNIX) + install(FILES keepassxc-cli.1 DESTINATION /usr/local/share/man/man1/) + execute_process(COMMAND mandb -q) +endif() diff --git a/src/cli/keepassxc-cli.1 b/src/cli/keepassxc-cli.1 new file mode 100644 index 000000000..1120f1fb0 --- /dev/null +++ b/src/cli/keepassxc-cli.1 @@ -0,0 +1,55 @@ +.TH KEEPASSXC-CLI 1 "Aug 22, 2017" + +.SH NAME +keepassxc-cli \- command line interface for the \fBKeePassXC\fP password manager. + +.SH SYNOPSIS +.B keepassxc-cli +.RI [ options ] +.I command + +.SH DESCRIPTION +\fBkeepassxc-cli\fP is the command line interface for the \fBKeePassXC\fP password manager. It provides the ability of listing the entries of a database, displaying the contents of an entry and many more, directly from the command line. + +.SH COMMANDS + +.IP "clip [options] [timeout]" +Copies the password of a database entry to the clipboard. If multiple entries with the same name exist in different groups, only the password for the first one is going to be copied. For copying the password of an entry in a specific group, the group path to the entry should be specified as well, instead of just the name. Optionally, a timeout in seconds can be specified to automatically clear the clipboard. + +.IP "entropy-meter [-a pwd1 pwd2 ...]" +Calculates the entropy of a single, or multiple passwords specified using the \fI-a\fP option. If no passwords are specified, the program will run in interactive mode and prompt the user to enter a password. + +.IP "extract [options] " +Extracts and prints the contents of a database to standard output in XML format. + +.IP "locate [options] " +Locates all the entries that match a specific search term in a database. + +.IP "ls [options] [group]" +Lists the contents of a group in a database. If no group is specified, it will default to the root group. + +.IP "merge [options] " +Merges two databases together. The first database file is going to be replaced by the result of the merge, for that reason it is advisable to keep a backup of the two database files before attempting a merge. In the case that both databases make use of the same credentials, the \fI--same-credentials\fP or \fI-s\fP option can be used. + +.IP "show [options] " +Shows the title, username, password, URL and notes of a database entry. Regarding the occurrence of multiple entries with the same name in different groups, everything stated in the \fIclip\fP command section also applies here. + +.SH OPTIONS + +.IP "-k, --key-file " +Specifies a path to a key file for unlocking the database. In a merge operation this option is used to specify the key file path for the first database. + +.IP "-f, --key-file-from " +Specifies a path to a key file for the second database in a merge operation. + +.IP "-s, --same-credentials" +Tells the program to use the same credentials for unlocking both of the database files in a merge operation. + +.IP "-h, --help" +Displays help information. + +.IP "-v, --version" +Shows the program version. + +.SH AUTHOR +This manual page was written by Manolis Agkopian . From 0987521cd3301ae518001f4d3fd4e3f8b5d1b4f1 Mon Sep 17 00:00:00 2001 From: Louis-Bertrand Varin Date: Tue, 22 Aug 2017 17:16:59 -0400 Subject: [PATCH 028/402] Adding reporting bugs section. --- src/cli/keepassxc-cli.1 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/cli/keepassxc-cli.1 b/src/cli/keepassxc-cli.1 index 1120f1fb0..b88215631 100644 --- a/src/cli/keepassxc-cli.1 +++ b/src/cli/keepassxc-cli.1 @@ -51,5 +51,8 @@ Displays help information. .IP "-v, --version" Shows the program version. +.SH REPORTING BUGS +Bugs and feature requests can be reported on GitHub at https://github.com/keepassxreboot/keepassxc/issues. + .SH AUTHOR This manual page was written by Manolis Agkopian . From 12b5cf033169d5336908fb5e9e362d4ae8b75ff3 Mon Sep 17 00:00:00 2001 From: Ettore Dreucci Date: Wed, 23 Aug 2017 00:21:08 +0200 Subject: [PATCH 029/402] replaced hard function call with signal connection Signed-off-by: Ettore Dreucci --- src/gui/MainWindow.cpp | 4 ---- src/gui/SearchWidget.cpp | 3 ++- src/gui/SearchWidget.h | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index ec1406c4a..3fe6d09a0 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -465,10 +465,6 @@ void MainWindow::setMenuActionState(DatabaseWidget::Mode mode) m_searchWidgetAction->setEnabled(true); - //if not already in search mode focus the search widget and select all its content - if (!inSearch) { - m_ui->toolBar->findChild("SearchWidget")->searchFocus(); - } break; } case DatabaseWidget::EditMode: diff --git a/src/gui/SearchWidget.cpp b/src/gui/SearchWidget.cpp index 7aa5f2901..ed3a50b2a 100644 --- a/src/gui/SearchWidget.cpp +++ b/src/gui/SearchWidget.cpp @@ -119,7 +119,8 @@ void SearchWidget::databaseChanged(DatabaseWidget* dbWidget) if (dbWidget != nullptr) { // Set current search text from this database m_ui->searchEdit->setText(dbWidget->getCurrentSearch()); - + // Keyboard focus on search widget at database unlocking + connect(dbWidget, SIGNAL(unlockedDatabase()), this, SLOT(searchFocus())); // Enforce search policy emit caseSensitiveChanged(m_actionCaseSensitive->isChecked()); emit limitGroupChanged(m_actionLimitGroup->isChecked()); diff --git a/src/gui/SearchWidget.h b/src/gui/SearchWidget.h index 15e3488fb..2441ef60b 100644 --- a/src/gui/SearchWidget.h +++ b/src/gui/SearchWidget.h @@ -55,13 +55,13 @@ signals: public slots: void databaseChanged(DatabaseWidget* dbWidget = 0); - void searchFocus(); private slots: void startSearchTimer(); void startSearch(); void updateCaseSensitive(); void updateLimitGroup(); + void searchFocus(); private: const QScopedPointer m_ui; From b95eaa5843df41964e93c6734bda3c6f215e306e Mon Sep 17 00:00:00 2001 From: rockihack Date: Wed, 30 Aug 2017 20:26:01 +0200 Subject: [PATCH 030/402] Fix build on mac os with qt 5.9.1 --- src/crypto/SymmetricCipher.h | 4 ++-- src/crypto/SymmetricCipherBackend.h | 4 ++-- src/crypto/SymmetricCipherGcrypt.h | 4 ++-- src/format/KeePass2RandomStream.h | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/crypto/SymmetricCipher.h b/src/crypto/SymmetricCipher.h index 0070ed7de..b85c58b7c 100644 --- a/src/crypto/SymmetricCipher.h +++ b/src/crypto/SymmetricCipher.h @@ -59,11 +59,11 @@ public: return m_backend->process(data, ok); } - inline bool processInPlace(QByteArray& data) Q_REQUIRED_RESULT { + Q_REQUIRED_RESULT inline bool processInPlace(QByteArray& data) { return m_backend->processInPlace(data); } - inline bool processInPlace(QByteArray& data, quint64 rounds) Q_REQUIRED_RESULT { + Q_REQUIRED_RESULT inline bool processInPlace(QByteArray& data, quint64 rounds) { Q_ASSERT(rounds > 0); return m_backend->processInPlace(data, rounds); } diff --git a/src/crypto/SymmetricCipherBackend.h b/src/crypto/SymmetricCipherBackend.h index 8f19b8ed0..78ec60c60 100644 --- a/src/crypto/SymmetricCipherBackend.h +++ b/src/crypto/SymmetricCipherBackend.h @@ -29,8 +29,8 @@ public: virtual bool setIv(const QByteArray& iv) = 0; virtual QByteArray process(const QByteArray& data, bool* ok) = 0; - virtual bool processInPlace(QByteArray& data) Q_REQUIRED_RESULT = 0; - virtual bool processInPlace(QByteArray& data, quint64 rounds) Q_REQUIRED_RESULT = 0; + Q_REQUIRED_RESULT virtual bool processInPlace(QByteArray& data) = 0; + Q_REQUIRED_RESULT virtual bool processInPlace(QByteArray& data, quint64 rounds) = 0; virtual bool reset() = 0; virtual int blockSize() const = 0; diff --git a/src/crypto/SymmetricCipherGcrypt.h b/src/crypto/SymmetricCipherGcrypt.h index 367ee5b95..d3ad8d15b 100644 --- a/src/crypto/SymmetricCipherGcrypt.h +++ b/src/crypto/SymmetricCipherGcrypt.h @@ -35,8 +35,8 @@ public: bool setIv(const QByteArray& iv); QByteArray process(const QByteArray& data, bool* ok); - bool processInPlace(QByteArray& data) Q_REQUIRED_RESULT; - bool processInPlace(QByteArray& data, quint64 rounds) Q_REQUIRED_RESULT; + Q_REQUIRED_RESULT bool processInPlace(QByteArray& data); + Q_REQUIRED_RESULT bool processInPlace(QByteArray& data, quint64 rounds); bool reset(); int blockSize() const; diff --git a/src/format/KeePass2RandomStream.h b/src/format/KeePass2RandomStream.h index 022c8399f..584d738b3 100644 --- a/src/format/KeePass2RandomStream.h +++ b/src/format/KeePass2RandomStream.h @@ -29,7 +29,7 @@ public: bool init(const QByteArray& key); QByteArray randomBytes(int size, bool* ok); QByteArray process(const QByteArray& data, bool* ok); - bool processInPlace(QByteArray& data) Q_REQUIRED_RESULT; + Q_REQUIRED_RESULT bool processInPlace(QByteArray& data); QString errorString() const; private: From 091a35293a87303e35ed1a0b2477010c8f665422 Mon Sep 17 00:00:00 2001 From: Jake Howard Date: Wed, 30 Aug 2017 20:38:18 +0100 Subject: [PATCH 031/402] Bind delete key to delete records --- src/gui/MainWindow.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 3fe6d09a0..8f6846f4b 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -167,6 +167,7 @@ MainWindow::MainWindow() setShortcut(m_ui->actionEntryNew, QKeySequence::New, Qt::CTRL + Qt::Key_N); m_ui->actionEntryEdit->setShortcut(Qt::CTRL + Qt::Key_E); m_ui->actionEntryDelete->setShortcut(Qt::CTRL + Qt::Key_D); + m_ui->actionEntryDelete->setShortcut(Qt::Key_Delete); m_ui->actionEntryClone->setShortcut(Qt::CTRL + Qt::Key_K); m_ui->actionEntryTotp->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_T); m_ui->actionEntryCopyTotp->setShortcut(Qt::CTRL + Qt::Key_T); From e2177746789681ad3893f8970936160dec787d22 Mon Sep 17 00:00:00 2001 From: louib Date: Thu, 31 Aug 2017 09:24:36 -0400 Subject: [PATCH 032/402] Updating .clang-format (#915) --- .clang-format | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.clang-format b/.clang-format index 5dc8fc3b0..3838b6b1f 100644 --- a/.clang-format +++ b/.clang-format @@ -23,11 +23,10 @@ BraceWrapping: AfterClass: true AfterFunction: true AfterControlStatement: false - AfterEnum: false - AfterNamespace: false - AfterObjCDeclaration: false - AfterStruct: false - AfterUnion: false + AfterEnum: true + AfterNamespace: true + AfterStruct: true + AfterUnion: true BeforeCatch: false BeforeElse: false IndentBraces: false From 6608de6cfe945cf89dcc1626da256cf32e409b8f Mon Sep 17 00:00:00 2001 From: David Sapienza Date: Tue, 5 Sep 2017 10:39:20 +0200 Subject: [PATCH 033/402] Typo fix "document a the following link" -> "document at the following link" --- INSTALL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL.md b/INSTALL.md index 56a51ff6a..45efa7a21 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -2,7 +2,7 @@ Install KeePassXC ================= This document will guide you across the steps to install KeePassXC. -You can visit the online version of this document a the following link +You can visit the online version of this document at the following link https://github.com/keepassxreboot/keepassx/wiki/Install-Instruction-from-Source From 1220b7d5017f4b855110e4459aff2ae26e0f34d1 Mon Sep 17 00:00:00 2001 From: louib Date: Tue, 5 Sep 2017 10:28:47 -0400 Subject: [PATCH 034/402] Feature : Update entries across groups when merging (#807) * Feature : Update entries across groups when merging * Styling --- .gitignore | 1 + src/core/Group.cpp | 123 +++++++----- src/core/Group.h | 5 +- tests/CMakeLists.txt | 3 + tests/TestGroup.cpp | 117 ------------ tests/TestGroup.h | 7 - tests/TestMerge.cpp | 445 +++++++++++++++++++++++++++++++++++++++++++ tests/TestMerge.h | 46 +++++ 8 files changed, 569 insertions(+), 178 deletions(-) create mode 100644 tests/TestMerge.cpp create mode 100644 tests/TestMerge.h diff --git a/.gitignore b/.gitignore index 0521a42e3..2d9bb4af7 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ release*/ *.kdev4 \.vscode/ +*.swp diff --git a/src/core/Group.cpp b/src/core/Group.cpp index e199ae43f..92e0269e5 100644 --- a/src/core/Group.cpp +++ b/src/core/Group.cpp @@ -488,18 +488,17 @@ Entry* Group::findEntry(QString entryId) { Q_ASSERT(!entryId.isNull()); + Entry* entry; if (Uuid::isUuid(entryId)) { - Uuid entryUuid = Uuid::fromHex(entryId); - for (Entry* entry : entriesRecursive(false)) { - if (entry->uuid() == entryUuid) { - return entry; - } + entry = findEntryByUuid(Uuid::fromHex(entryId)); + if (entry) { + return entry; } } - Entry* entry = findEntryByPath(entryId); + entry = findEntryByPath(entryId); if (entry) { - return entry; + return entry; } for (Entry* entry : entriesRecursive(false)) { @@ -514,7 +513,7 @@ Entry* Group::findEntry(QString entryId) Entry* Group::findEntryByUuid(const Uuid& uuid) { Q_ASSERT(!uuid.isNull()); - for (Entry* entry : asConst(m_entries)) { + for (Entry* entry : entriesRecursive(false)) { if (entry->uuid() == uuid) { return entry; } @@ -575,7 +574,6 @@ Group* Group::findGroupByPath(QString groupPath, QString basePath) } return nullptr; - } QString Group::print(bool recursive, int depth) @@ -655,25 +653,44 @@ QSet Group::customIconsRecursive() const void Group::merge(const Group* other) { + + Group* rootGroup = this; + while (rootGroup->parentGroup()) { + rootGroup = rootGroup->parentGroup(); + } + // merge entries const QList dbEntries = other->entries(); for (Entry* entry : dbEntries) { - // entries are searched by uuid - if (!findEntryByUuid(entry->uuid())) { + + Entry* existingEntry = rootGroup->findEntryByUuid(entry->uuid()); + + // This entry does not exist at all. Create it. + if (!existingEntry) { + qDebug("New entry %s detected. Creating it.", qPrintable(entry->title())); entry->clone(Entry::CloneNoFlags)->setGroup(this); + // Entry is already present in the database. Update it. } else { - resolveConflict(findEntryByUuid(entry->uuid()), entry); + bool locationChanged = existingEntry->timeInfo().locationChanged() < entry->timeInfo().locationChanged(); + if (locationChanged && existingEntry->group() != this) { + existingEntry->setGroup(this); + qDebug("Location changed for entry %s. Updating it", qPrintable(existingEntry->title())); + } + resolveConflict(existingEntry, entry); } } - // merge groups (recursively) + // merge groups recursively const QList dbChildren = other->children(); for (Group* group : dbChildren) { // groups are searched by name instead of uuid if (findChildByName(group->name())) { findChildByName(group->name())->merge(group); } else { - group->setParent(this); + qDebug("New group %s detected. Creating it.", qPrintable(group->name())); + Group* newGroup = group->clone(Entry::CloneNoFlags, true); + newGroup->setParent(this); + newGroup->merge(group); } } @@ -691,7 +708,7 @@ Group* Group::findChildByName(const QString& name) return nullptr; } -Group* Group::clone(Entry::CloneFlags entryFlags) const +Group* Group::clone(Entry::CloneFlags entryFlags, bool shallow) const { Group* clonedGroup = new Group(); @@ -700,16 +717,18 @@ Group* Group::clone(Entry::CloneFlags entryFlags) const clonedGroup->setUuid(Uuid::random()); clonedGroup->m_data = m_data; - const QList entryList = entries(); - for (Entry* entry : entryList) { - Entry* clonedEntry = entry->clone(entryFlags); - clonedEntry->setGroup(clonedGroup); - } + if (!shallow) { + const QList entryList = entries(); + for (Entry* entry : entryList) { + Entry* clonedEntry = entry->clone(entryFlags); + clonedEntry->setGroup(clonedGroup); + } - const QList childrenGroups = children(); - for (Group* groupChild : childrenGroups) { - Group* clonedGroupChild = groupChild->clone(entryFlags); - clonedGroupChild->setParent(clonedGroup); + const QList childrenGroups = children(); + for (Group* groupChild : childrenGroups) { + Group* clonedGroupChild = groupChild->clone(entryFlags); + clonedGroupChild->setParent(clonedGroup); + } } clonedGroup->setUpdateTimeinfo(true); @@ -829,8 +848,7 @@ void Group::markOlderEntry(Entry* entry) { entry->attributes()->set( "merged", - QString("older entry merged from database \"%1\"").arg(entry->group()->database()->metadata()->name()) - ); + QString("older entry merged from database \"%1\"").arg(entry->group()->database()->metadata()->name())); } bool Group::resolveSearchingEnabled() const @@ -880,32 +898,34 @@ void Group::resolveConflict(Entry* existingEntry, Entry* otherEntry) Entry* clonedEntry; - switch(mergeMode()) { - case KeepBoth: - // if one entry is newer, create a clone and add it to the group - if (timeExisting > timeOther) { - clonedEntry = otherEntry->clone(Entry::CloneNoFlags); - clonedEntry->setGroup(this); - markOlderEntry(clonedEntry); - } else if (timeExisting < timeOther) { - clonedEntry = otherEntry->clone(Entry::CloneNoFlags); - clonedEntry->setGroup(this); - markOlderEntry(existingEntry); - } - break; - case KeepNewer: - if (timeExisting < timeOther) { - // only if other entry is newer, replace existing one - removeEntry(existingEntry); - addEntry(otherEntry->clone(Entry::CloneNoFlags)); - } + switch (mergeMode()) { + case KeepBoth: + // if one entry is newer, create a clone and add it to the group + if (timeExisting > timeOther) { + clonedEntry = otherEntry->clone(Entry::CloneNewUuid); + clonedEntry->setGroup(this); + markOlderEntry(clonedEntry); + } else if (timeExisting < timeOther) { + clonedEntry = otherEntry->clone(Entry::CloneNewUuid); + clonedEntry->setGroup(this); + markOlderEntry(existingEntry); + } + break; + case KeepNewer: + if (timeExisting < timeOther) { + qDebug("Updating entry %s.", qPrintable(existingEntry->title())); + // only if other entry is newer, replace existing one + Group* currentGroup = existingEntry->group(); + currentGroup->removeEntry(existingEntry); + otherEntry->clone(Entry::CloneNoFlags)->setGroup(currentGroup); + } - break; - case KeepExisting: - break; - default: - // do nothing - break; + break; + case KeepExisting: + break; + default: + // do nothing + break; } } @@ -928,5 +948,4 @@ QStringList Group::locate(QString locateTerm, QString currentPath) } return response; - } diff --git a/src/core/Group.h b/src/core/Group.h index 4e76538e0..73b791590 100644 --- a/src/core/Group.h +++ b/src/core/Group.h @@ -117,13 +117,14 @@ public: QList groupsRecursive(bool includeSelf); QSet customIconsRecursive() const; /** - * Creates a duplicate of this group including all child entries and groups. + * Creates a duplicate of this group including all child entries and groups (if not shallow). * The exceptions are that the returned group doesn't have a parent group * and all TimeInfo attributes are set to the current time. * Note that you need to copy the custom icons manually when inserting the * new group into another database. */ - Group* clone(Entry::CloneFlags entryFlags = Entry::CloneNewUuid | Entry::CloneResetTimeInfo) const; + Group* clone(Entry::CloneFlags entryFlags = Entry::CloneNewUuid | Entry::CloneResetTimeInfo, + bool shallow = false) const; void copyDataFrom(const Group* other); void merge(const Group* other); QString print(bool recursive = false, int depth = 0); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 2a420270a..33baf564f 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -158,6 +158,9 @@ endif() add_unit_test(NAME testentry SOURCES TestEntry.cpp LIBS ${TEST_LIBRARIES}) +add_unit_test(NAME testmerge SOURCES TestMerge.cpp + LIBS ${TEST_LIBRARIES}) + add_unit_test(NAME testtotp SOURCES TestTotp.cpp LIBS ${TEST_LIBRARIES}) diff --git a/tests/TestGroup.cpp b/tests/TestGroup.cpp index 5553feae8..efdcb32e6 100644 --- a/tests/TestGroup.cpp +++ b/tests/TestGroup.cpp @@ -452,123 +452,6 @@ void TestGroup::testCopyCustomIcons() delete dbSource; } -void TestGroup::testMerge() -{ - Group* group1 = new Group(); - group1->setName("group 1"); - Group* group2 = new Group(); - group2->setName("group 2"); - - Entry* entry1 = new Entry(); - Entry* entry2 = new Entry(); - - entry1->setGroup(group1); - entry1->setUuid(Uuid::random()); - entry2->setGroup(group1); - entry2->setUuid(Uuid::random()); - - group2->merge(group1); - - QCOMPARE(group1->entries().size(), 2); - QCOMPARE(group2->entries().size(), 2); -} - -void TestGroup::testMergeDatabase() -{ - Database* dbSource = createMergeTestDatabase(); - Database* dbDest = new Database(); - - dbDest->merge(dbSource); - - QCOMPARE(dbDest->rootGroup()->children().size(), 2); - QCOMPARE(dbDest->rootGroup()->children().at(0)->entries().size(), 2); - - delete dbDest; - delete dbSource; -} - -void TestGroup::testMergeConflict() -{ - Database* dbSource = createMergeTestDatabase(); - - // test merging updated entries - // falls back to KeepBoth mode - Database* dbCopy = new Database(); - dbCopy->setRootGroup(dbSource->rootGroup()->clone(Entry::CloneNoFlags)); - - // sanity check - QCOMPARE(dbCopy->rootGroup()->children().at(0)->entries().size(), 2); - - // make this entry newer than in original db - Entry* updatedEntry = dbCopy->rootGroup()->children().at(0)->entries().at(0); - TimeInfo updatedTimeInfo = updatedEntry->timeInfo(); - updatedTimeInfo.setLastModificationTime(updatedTimeInfo.lastModificationTime().addYears(1)); - updatedEntry->setTimeInfo(updatedTimeInfo); - - dbCopy->merge(dbSource); - - // one entry is duplicated because of mode - QCOMPARE(dbCopy->rootGroup()->children().at(0)->entries().size(), 2); - - delete dbSource; - delete dbCopy; -} - -void TestGroup::testMergeConflictKeepBoth() -{ - Database* dbSource = createMergeTestDatabase(); - - // test merging updated entries - // falls back to KeepBoth mode - Database* dbCopy = new Database(); - dbCopy->setRootGroup(dbSource->rootGroup()->clone(Entry::CloneNoFlags)); - - // sanity check - QCOMPARE(dbCopy->rootGroup()->children().at(0)->entries().size(), 2); - - // make this entry newer than in original db - Entry* updatedEntry = dbCopy->rootGroup()->children().at(0)->entries().at(0); - TimeInfo updatedTimeInfo = updatedEntry->timeInfo(); - updatedTimeInfo.setLastModificationTime(updatedTimeInfo.lastModificationTime().addYears(1)); - updatedEntry->setTimeInfo(updatedTimeInfo); - - dbCopy->rootGroup()->setMergeMode(Group::MergeMode::KeepBoth); - - dbCopy->merge(dbSource); - - // one entry is duplicated because of mode - QCOMPARE(dbCopy->rootGroup()->children().at(0)->entries().size(), 3); - // the older entry was merged from the other db as last in the group - Entry* olderEntry = dbCopy->rootGroup()->children().at(0)->entries().at(2); - QVERIFY2(olderEntry->attributes()->hasKey("merged"), "older entry is marked with an attribute \"merged\""); - - delete dbSource; - delete dbCopy; -} - -Database* TestGroup::createMergeTestDatabase() -{ - Database* db = new Database(); - - Group* group1 = new Group(); - group1->setName("group 1"); - Group* group2 = new Group(); - group2->setName("group 2"); - - Entry* entry1 = new Entry(); - Entry* entry2 = new Entry(); - - entry1->setGroup(group1); - entry1->setUuid(Uuid::random()); - entry2->setGroup(group1); - entry2->setUuid(Uuid::random()); - - group1->setParent(db->rootGroup()); - group2->setParent(db->rootGroup()); - - return db; -} - void TestGroup::testFindEntry() { Database* db = new Database(); diff --git a/tests/TestGroup.h b/tests/TestGroup.h index 16f4906ee..fabe860af 100644 --- a/tests/TestGroup.h +++ b/tests/TestGroup.h @@ -35,17 +35,10 @@ private slots: void testCopyCustomIcon(); void testClone(); void testCopyCustomIcons(); - void testMerge(); - void testMergeConflict(); - void testMergeDatabase(); - void testMergeConflictKeepBoth(); void testFindEntry(); void testFindGroupByPath(); void testPrint(); void testLocate(); - -private: - Database* createMergeTestDatabase(); }; #endif // KEEPASSX_TESTGROUP_H diff --git a/tests/TestMerge.cpp b/tests/TestMerge.cpp new file mode 100644 index 000000000..e9876f183 --- /dev/null +++ b/tests/TestMerge.cpp @@ -0,0 +1,445 @@ +/* + * Copyright (C) 2017 KeePassXC Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "TestMerge.h" + +#include +#include + +#include "core/Database.h" +#include "core/Group.h" +#include "core/Metadata.h" +#include "crypto/Crypto.h" + +QTEST_GUILESS_MAIN(TestMerge) + +void TestMerge::initTestCase() +{ + qRegisterMetaType("Entry*"); + qRegisterMetaType("Group*"); + QVERIFY(Crypto::init()); +} + +/** + * Merge an existing database into a new one. + * All the entries of the existing should end + * up in the new one. + */ +void TestMerge::testMergeIntoNew() +{ + Database* dbSource = createTestDatabase(); + Database* dbDestination = new Database(); + + dbDestination->merge(dbSource); + + QCOMPARE(dbDestination->rootGroup()->children().size(), 2); + QCOMPARE(dbDestination->rootGroup()->children().at(0)->entries().size(), 2); + + delete dbDestination; + delete dbSource; +} + +/** + * Merging when no changes occured should not + * have any side effect. + */ +void TestMerge::testMergeNoChanges() +{ + Database* dbDestination = createTestDatabase(); + + Database* dbSource = new Database(); + dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneNoFlags)); + + QCOMPARE(dbDestination->rootGroup()->entriesRecursive().size(), 2); + QCOMPARE(dbSource->rootGroup()->entriesRecursive().size(), 2); + + dbDestination->merge(dbSource); + + QCOMPARE(dbDestination->rootGroup()->entriesRecursive().size(), 2); + QCOMPARE(dbSource->rootGroup()->entriesRecursive().size(), 2); + + dbDestination->merge(dbSource); + + QCOMPARE(dbDestination->rootGroup()->entriesRecursive().size(), 2); + QCOMPARE(dbSource->rootGroup()->entriesRecursive().size(), 2); + + delete dbDestination; + delete dbSource; +} + +/** + * If the entry is updated in the source database, the update + * should propagate in the destination database. + */ +void TestMerge::testResolveConflictNewer() +{ + Database* dbDestination = createTestDatabase(); + + Database* dbSource = new Database(); + dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneNoFlags)); + + // sanity check + Group* group1 = dbSource->rootGroup()->findChildByName("group1"); + QVERIFY(group1 != nullptr); + QCOMPARE(group1->entries().size(), 2); + + Entry* entry1 = dbSource->rootGroup()->findEntry("entry1"); + QVERIFY(entry1 != nullptr); + + // Make sure the two changes have a different timestamp. + QTest::qSleep(1); + // make this entry newer than in destination db + entry1->beginUpdate(); + entry1->setPassword("password"); + entry1->endUpdate(); + + dbDestination->merge(dbSource); + + // sanity check + group1 = dbDestination->rootGroup()->findChildByName("group1"); + QVERIFY(group1 != nullptr); + QCOMPARE(group1->entries().size(), 2); + + entry1 = dbDestination->rootGroup()->findEntry("entry1"); + QVERIFY(entry1 != nullptr); + QCOMPARE(entry1->password(), QString("password")); + + // When updating an entry, it should not end up in the + // deleted objects. + for (DeletedObject deletedObject : dbDestination->deletedObjects()) { + QVERIFY(deletedObject.uuid != entry1->uuid()); + } + + delete dbDestination; + delete dbSource; +} + +/** + * If the entry is updated in the source database, and the + * destination database after, the entry should remain the + * same. + */ +void TestMerge::testResolveConflictOlder() +{ + Database* dbDestination = createTestDatabase(); + + Database* dbSource = new Database(); + dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneNoFlags)); + + // sanity check + Group* group1 = dbSource->rootGroup()->findChildByName("group1"); + QVERIFY(group1 != nullptr); + QCOMPARE(group1->entries().size(), 2); + + Entry* entry1 = dbSource->rootGroup()->findEntry("entry1"); + QVERIFY(entry1 != nullptr); + + // Make sure the two changes have a different timestamp. + QTest::qSleep(1); + // make this entry newer than in destination db + entry1->beginUpdate(); + entry1->setPassword("password1"); + entry1->endUpdate(); + + entry1 = dbDestination->rootGroup()->findEntry("entry1"); + QVERIFY(entry1 != nullptr); + + // Make sure the two changes have a different timestamp. + QTest::qSleep(1); + // make this entry newer than in destination db + entry1->beginUpdate(); + entry1->setPassword("password2"); + entry1->endUpdate(); + + dbDestination->merge(dbSource); + + // sanity check + group1 = dbDestination->rootGroup()->findChildByName("group1"); + QVERIFY(group1 != nullptr); + QCOMPARE(group1->entries().size(), 2); + + entry1 = dbDestination->rootGroup()->findEntry("entry1"); + QVERIFY(entry1 != nullptr); + QCOMPARE(entry1->password(), QString("password2")); + + // When updating an entry, it should not end up in the + // deleted objects. + for (DeletedObject deletedObject : dbDestination->deletedObjects()) { + QVERIFY(deletedObject.uuid != entry1->uuid()); + } + + delete dbDestination; + delete dbSource; +} + +/** + * Tests the KeepBoth merge mode. + */ +void TestMerge::testResolveConflictKeepBoth() +{ + Database* dbDestination = createTestDatabase(); + + Database* dbSource = new Database(); + dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneNoFlags)); + + // sanity check + QCOMPARE(dbDestination->rootGroup()->children().at(0)->entries().size(), 2); + + // make this entry newer than in original db + Entry* updatedEntry = dbDestination->rootGroup()->children().at(0)->entries().at(0); + TimeInfo updatedTimeInfo = updatedEntry->timeInfo(); + updatedTimeInfo.setLastModificationTime(updatedTimeInfo.lastModificationTime().addYears(1)); + updatedEntry->setTimeInfo(updatedTimeInfo); + + dbDestination->rootGroup()->setMergeMode(Group::MergeMode::KeepBoth); + + dbDestination->merge(dbSource); + + // one entry is duplicated because of mode + QCOMPARE(dbDestination->rootGroup()->children().at(0)->entries().size(), 3); + // the older entry was merged from the other db as last in the group + Entry* olderEntry = dbDestination->rootGroup()->children().at(0)->entries().at(2); + QVERIFY2(olderEntry->attributes()->hasKey("merged"), "older entry is marked with an attribute \"merged\""); + + QVERIFY2(olderEntry->uuid().toHex() != updatedEntry->uuid().toHex(), + "KeepBoth should not reuse the UUIDs when cloning."); + + delete dbSource; + delete dbDestination; +} + +/** + * The location of an entry should be updated in the + * destination database. + */ +void TestMerge::testMoveEntry() +{ + Database* dbDestination = createTestDatabase(); + + Database* dbSource = new Database(); + dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneNoFlags)); + + Entry* entry1 = dbSource->rootGroup()->findEntry("entry1"); + QVERIFY(entry1 != nullptr); + + Group* group2 = dbSource->rootGroup()->findChildByName("group2"); + QVERIFY(group2 != nullptr); + + // Make sure the two changes have a different timestamp. + QTest::qSleep(1); + entry1->setGroup(group2); + QCOMPARE(entry1->group()->name(), QString("group2")); + + dbDestination->merge(dbSource); + + entry1 = dbDestination->rootGroup()->findEntry("entry1"); + QVERIFY(entry1 != nullptr); + QCOMPARE(entry1->group()->name(), QString("group2")); + QCOMPARE(dbDestination->rootGroup()->entriesRecursive().size(), 2); + + delete dbDestination; + delete dbSource; +} + +/** + * The location of an entry should be updated in the + * destination database, but changes from the destination + * database should be preserved. + */ +void TestMerge::testMoveEntryPreserveChanges() +{ + Database* dbDestination = createTestDatabase(); + + Database* dbSource = new Database(); + dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneNoFlags)); + + Entry* entry1 = dbSource->rootGroup()->findEntry("entry1"); + QVERIFY(entry1 != nullptr); + + Group* group2 = dbSource->rootGroup()->findChildByName("group2"); + QVERIFY(group2 != nullptr); + + QTest::qSleep(1); + entry1->setGroup(group2); + QCOMPARE(entry1->group()->name(), QString("group2")); + + entry1 = dbDestination->rootGroup()->findEntry("entry1"); + QVERIFY(entry1 != nullptr); + + QTest::qSleep(1); + entry1->beginUpdate(); + entry1->setPassword("password"); + entry1->endUpdate(); + + dbDestination->merge(dbSource); + + entry1 = dbDestination->rootGroup()->findEntry("entry1"); + QVERIFY(entry1 != nullptr); + QCOMPARE(entry1->group()->name(), QString("group2")); + QCOMPARE(dbDestination->rootGroup()->entriesRecursive().size(), 2); + QCOMPARE(entry1->password(), QString("password")); + + delete dbDestination; + delete dbSource; +} + +void TestMerge::testCreateNewGroups() +{ + Database* dbDestination = createTestDatabase(); + + Database* dbSource = new Database(); + dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneNoFlags)); + + QTest::qSleep(1); + Group* group3 = new Group(); + group3->setName("group3"); + group3->setParent(dbSource->rootGroup()); + + dbDestination->merge(dbSource); + + group3 = dbDestination->rootGroup()->findChildByName("group3"); + QVERIFY(group3 != nullptr); + QCOMPARE(group3->name(), QString("group3")); + + delete dbDestination; + delete dbSource; +} + +void TestMerge::testMoveEntryIntoNewGroup() +{ + Database* dbDestination = createTestDatabase(); + + Database* dbSource = new Database(); + dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneNoFlags)); + + QTest::qSleep(1); + Group* group3 = new Group(); + group3->setName("group3"); + group3->setParent(dbSource->rootGroup()); + + Entry* entry1 = dbSource->rootGroup()->findEntry("entry1"); + entry1->setGroup(group3); + + dbDestination->merge(dbSource); + + QCOMPARE(dbDestination->rootGroup()->entriesRecursive().size(), 2); + + group3 = dbDestination->rootGroup()->findChildByName("group3"); + QVERIFY(group3 != nullptr); + QCOMPARE(group3->name(), QString("group3")); + QCOMPARE(group3->entries().size(), 1); + + entry1 = dbDestination->rootGroup()->findEntry("entry1"); + QVERIFY(entry1 != nullptr); + QCOMPARE(entry1->group()->name(), QString("group3")); + + delete dbDestination; + delete dbSource; +} + +/** + * Even though the entries' locations are no longer + * the same, we will keep associating them. + */ +void TestMerge::testUpdateEntryDifferentLocation() +{ + Database* dbDestination = createTestDatabase(); + + Database* dbSource = new Database(); + dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneNoFlags)); + + Group* group3 = new Group(); + group3->setName("group3"); + group3->setParent(dbDestination->rootGroup()); + + Entry* entry1 = dbDestination->rootGroup()->findEntry("entry1"); + QVERIFY(entry1 != nullptr); + entry1->setGroup(group3); + Uuid uuidBeforeSyncing = entry1->uuid(); + + // Change the entry in the source db. + QTest::qSleep(1); + entry1 = dbSource->rootGroup()->findEntry("entry1"); + QVERIFY(entry1 != nullptr); + entry1->beginUpdate(); + entry1->setUsername("username"); + entry1->endUpdate(); + + dbDestination->merge(dbSource); + + QCOMPARE(dbDestination->rootGroup()->entriesRecursive().size(), 2); + + entry1 = dbDestination->rootGroup()->findEntry("entry1"); + QVERIFY(entry1 != nullptr); + QVERIFY(entry1->group() != nullptr); + QCOMPARE(entry1->username(), QString("username")); + QCOMPARE(entry1->group()->name(), QString("group3")); + QCOMPARE(uuidBeforeSyncing, entry1->uuid()); + + delete dbDestination; + delete dbSource; +} + +/** + * The first merge should create new entries, the + * second should only sync them, since they have + * been created with the same UUIDs. + */ +void TestMerge::testMergeAndSync() +{ + Database* dbDestination = new Database(); + Database* dbSource = createTestDatabase(); + + QCOMPARE(dbDestination->rootGroup()->entriesRecursive().size(), 0); + + dbDestination->merge(dbSource); + + QCOMPARE(dbDestination->rootGroup()->entriesRecursive().size(), 2); + + dbDestination->merge(dbSource); + + // Still only 2 entries, since now we detect which are already present. + QCOMPARE(dbDestination->rootGroup()->entriesRecursive().size(), 2); + + delete dbDestination; + delete dbSource; +} + +Database* TestMerge::createTestDatabase() +{ + Database* db = new Database(); + + Group* group1 = new Group(); + group1->setName("group1"); + Group* group2 = new Group(); + group2->setName("group2"); + + Entry* entry1 = new Entry(); + Entry* entry2 = new Entry(); + + entry1->setGroup(group1); + entry1->setUuid(Uuid::random()); + entry1->setTitle("entry1"); + entry2->setGroup(group1); + entry2->setUuid(Uuid::random()); + entry2->setTitle("entry2"); + + group1->setParent(db->rootGroup()); + group2->setParent(db->rootGroup()); + + return db; +} diff --git a/tests/TestMerge.h b/tests/TestMerge.h new file mode 100644 index 000000000..bfb18c305 --- /dev/null +++ b/tests/TestMerge.h @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2017 KeePassXC Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef KEEPASSX_TESTMERGE_H +#define KEEPASSX_TESTMERGE_H + +#include "core/Database.h" +#include + +class TestMerge : public QObject +{ + Q_OBJECT + +private slots: + void initTestCase(); + void testMergeIntoNew(); + void testMergeNoChanges(); + void testResolveConflictNewer(); + void testResolveConflictOlder(); + void testResolveConflictKeepBoth(); + void testMoveEntry(); + void testMoveEntryPreserveChanges(); + void testMoveEntryIntoNewGroup(); + void testCreateNewGroups(); + void testUpdateEntryDifferentLocation(); + void testMergeAndSync(); + +private: + Database* createTestDatabase(); +}; + +#endif // KEEPASSX_TESTMERGE_H From 6e1fd0694f1013de83fa7cfcf62c527a128a39be Mon Sep 17 00:00:00 2001 From: louib Date: Wed, 6 Sep 2017 09:14:41 -0400 Subject: [PATCH 035/402] CLI : basic entry manipulation commands. (#919) * CLI : basic entry manipulation commands. * Code review. --- src/cli/Add.cpp | 150 ++++++++++++++++++++ src/cli/Add.h | 31 +++++ src/cli/CMakeLists.txt | 6 + src/cli/Command.cpp | 6 + src/cli/Edit.cpp | 168 +++++++++++++++++++++++ src/cli/Edit.h | 31 +++++ src/cli/Remove.cpp | 106 ++++++++++++++ src/cli/Remove.h | 34 +++++ src/cli/keepassxc-cli.1 | 53 ++++++- src/core/Group.cpp | 29 ++++ src/core/Group.h | 1 + src/core/PasswordGenerator.h | 2 + src/gui/PasswordGeneratorWidget.cpp | 2 +- src/http/HttpPasswordGeneratorWidget.cpp | 2 +- tests/TestGroup.cpp | 48 +++++++ tests/TestGroup.h | 1 + 16 files changed, 661 insertions(+), 9 deletions(-) create mode 100644 src/cli/Add.cpp create mode 100644 src/cli/Add.h create mode 100644 src/cli/Edit.cpp create mode 100644 src/cli/Edit.h create mode 100644 src/cli/Remove.cpp create mode 100644 src/cli/Remove.h diff --git a/src/cli/Add.cpp b/src/cli/Add.cpp new file mode 100644 index 000000000..13023b5bb --- /dev/null +++ b/src/cli/Add.cpp @@ -0,0 +1,150 @@ +/* + * Copyright (C) 2017 KeePassXC Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include + +#include "Add.h" + +#include +#include + +#include "cli/Utils.h" +#include "core/Database.h" +#include "core/Entry.h" +#include "core/Group.h" +#include "core/PasswordGenerator.h" + +Add::Add() +{ + this->name = QString("add"); + this->description = QObject::tr("Add a new entry to a database."); +} + +Add::~Add() +{ +} + +int Add::execute(QStringList arguments) +{ + + QTextStream inputTextStream(stdin, QIODevice::ReadOnly); + QTextStream outputTextStream(stdout, QIODevice::WriteOnly); + + QCommandLineParser parser; + parser.setApplicationDescription(this->description); + parser.addPositionalArgument("database", QObject::tr("Path of the database.")); + + QCommandLineOption keyFile(QStringList() << "k" + << "key-file", + QObject::tr("Key file of the database."), + QObject::tr("path")); + parser.addOption(keyFile); + + QCommandLineOption username(QStringList() << "u" + << "username", + QObject::tr("Username for the entry."), + QObject::tr("username")); + parser.addOption(username); + + QCommandLineOption url(QStringList() << "url", QObject::tr("URL for the entry."), QObject::tr("URL")); + parser.addOption(url); + + QCommandLineOption prompt(QStringList() << "p" + << "password-prompt", + QObject::tr("Prompt for the entry's password.")); + parser.addOption(prompt); + + QCommandLineOption generate(QStringList() << "g" + << "generate", + QObject::tr("Generate a password for the entry.")); + parser.addOption(generate); + + QCommandLineOption length(QStringList() << "l" + << "password-length", + QObject::tr("Length for the generated password."), + QObject::tr("length")); + parser.addOption(length); + + parser.addPositionalArgument("entry", QObject::tr("Path of the entry to add.")); + parser.process(arguments); + + const QStringList args = parser.positionalArguments(); + if (args.size() != 2) { + outputTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli add"); + return EXIT_FAILURE; + } + + QString databasePath = args.at(0); + QString entryPath = args.at(1); + + Database* db = Database::unlockFromStdin(databasePath, parser.value(keyFile)); + if (db == nullptr) { + return EXIT_FAILURE; + } + + // Validating the password length here, before we actually create + // the entry. + QString passwordLength = parser.value(length); + if (!passwordLength.isEmpty() && !passwordLength.toInt()) { + qCritical("Invalid value for password length %s.", qPrintable(passwordLength)); + return EXIT_FAILURE; + } + + Entry* entry = db->rootGroup()->addEntryWithPath(entryPath); + if (!entry) { + qCritical("Could not create entry with path %s.", qPrintable(entryPath)); + return EXIT_FAILURE; + } + + if (!parser.value("username").isEmpty()) { + entry->setUsername(parser.value("username")); + } + + if (!parser.value("url").isEmpty()) { + entry->setUrl(parser.value("url")); + } + + if (parser.isSet(prompt)) { + outputTextStream << "Enter password for new entry: "; + outputTextStream.flush(); + QString password = Utils::getPassword(); + entry->setPassword(password); + } else if (parser.isSet(generate)) { + PasswordGenerator passwordGenerator; + + if (passwordLength.isEmpty()) { + passwordGenerator.setLength(PasswordGenerator::DefaultLength); + } else { + passwordGenerator.setLength(passwordLength.toInt()); + } + + passwordGenerator.setCharClasses(PasswordGenerator::LowerLetters | PasswordGenerator::UpperLetters | + PasswordGenerator::Numbers); + QString password = passwordGenerator.generatePassword(); + entry->setPassword(password); + } + + QString errorMessage = db->saveToFile(databasePath); + if (!errorMessage.isEmpty()) { + qCritical("Writing the database failed %s.", qPrintable(errorMessage)); + return EXIT_FAILURE; + } + + outputTextStream << "Successfully added entry " << entry->title() << "." << endl; + return EXIT_SUCCESS; +} diff --git a/src/cli/Add.h b/src/cli/Add.h new file mode 100644 index 000000000..14356c418 --- /dev/null +++ b/src/cli/Add.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2017 KeePassXC Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef KEEPASSXC_ADD_H +#define KEEPASSXC_ADD_H + +#include "Command.h" + +class Add : public Command +{ +public: + Add(); + ~Add(); + int execute(QStringList arguments); +}; + +#endif // KEEPASSXC_ADD_H diff --git a/src/cli/CMakeLists.txt b/src/cli/CMakeLists.txt index 43ed06be6..1ee232a48 100644 --- a/src/cli/CMakeLists.txt +++ b/src/cli/CMakeLists.txt @@ -14,10 +14,14 @@ # along with this program. If not, see . set(cli_SOURCES + Add.cpp + Add.h Clip.cpp Clip.h Command.cpp Command.h + Edit.cpp + Edit.h EntropyMeter.cpp EntropyMeter.h Extract.cpp @@ -28,6 +32,8 @@ set(cli_SOURCES Locate.h Merge.cpp Merge.h + Remove.cpp + Remove.h Show.cpp Show.h) diff --git a/src/cli/Command.cpp b/src/cli/Command.cpp index 721710776..c7eff6b08 100644 --- a/src/cli/Command.cpp +++ b/src/cli/Command.cpp @@ -22,12 +22,15 @@ #include "Command.h" +#include "Add.h" +#include "Edit.h" #include "Clip.h" #include "EntropyMeter.h" #include "Extract.h" #include "List.h" #include "Locate.h" #include "Merge.h" +#include "Remove.h" #include "Show.h" QMap commands; @@ -56,12 +59,15 @@ QString Command::getDescriptionLine() void populateCommands() { if (commands.isEmpty()) { + commands.insert(QString("add"), new Add()); commands.insert(QString("clip"), new Clip()); + commands.insert(QString("edit"), new Edit()); commands.insert(QString("entropy-meter"), new EntropyMeter()); commands.insert(QString("extract"), new Extract()); commands.insert(QString("locate"), new Locate()); commands.insert(QString("ls"), new List()); commands.insert(QString("merge"), new Merge()); + commands.insert(QString("rm"), new Remove()); commands.insert(QString("show"), new Show()); } } diff --git a/src/cli/Edit.cpp b/src/cli/Edit.cpp new file mode 100644 index 000000000..25d2fd456 --- /dev/null +++ b/src/cli/Edit.cpp @@ -0,0 +1,168 @@ +/* + * Copyright (C) 2017 KeePassXC Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include + +#include "Edit.h" + +#include +#include + +#include "cli/Utils.h" +#include "core/Database.h" +#include "core/Entry.h" +#include "core/Group.h" +#include "core/PasswordGenerator.h" + +Edit::Edit() +{ + this->name = QString("edit"); + this->description = QObject::tr("Edit an entry."); +} + +Edit::~Edit() +{ +} + +int Edit::execute(QStringList arguments) +{ + + QTextStream inputTextStream(stdin, QIODevice::ReadOnly); + QTextStream outputTextStream(stdout, QIODevice::WriteOnly); + + QCommandLineParser parser; + parser.setApplicationDescription(this->description); + parser.addPositionalArgument("database", QObject::tr("Path of the database.")); + + QCommandLineOption keyFile(QStringList() << "k" + << "key-file", + QObject::tr("Key file of the database."), + QObject::tr("path")); + parser.addOption(keyFile); + + QCommandLineOption username(QStringList() << "u" + << "username", + QObject::tr("Username for the entry."), + QObject::tr("username")); + parser.addOption(username); + + QCommandLineOption url(QStringList() << "url", QObject::tr("URL for the entry."), QObject::tr("URL")); + parser.addOption(url); + + QCommandLineOption title(QStringList() << "t" + << "title", + QObject::tr("Title for the entry."), + QObject::tr("title")); + parser.addOption(title); + + QCommandLineOption prompt(QStringList() << "p" + << "password-prompt", + QObject::tr("Prompt for the entry's password.")); + parser.addOption(prompt); + + QCommandLineOption generate(QStringList() << "g" + << "generate", + QObject::tr("Generate a password for the entry.")); + parser.addOption(generate); + + QCommandLineOption length(QStringList() << "l" + << "password-length", + QObject::tr("Length for the generated password."), + QObject::tr("length")); + parser.addOption(length); + + parser.addPositionalArgument("entry", QObject::tr("Path of the entry to edit.")); + parser.process(arguments); + + const QStringList args = parser.positionalArguments(); + if (args.size() != 2) { + outputTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli edit"); + return EXIT_FAILURE; + } + + QString databasePath = args.at(0); + QString entryPath = args.at(1); + + Database* db = Database::unlockFromStdin(databasePath, parser.value(keyFile)); + if (db == nullptr) { + return EXIT_FAILURE; + } + + QString passwordLength = parser.value(length); + if (!passwordLength.isEmpty() && !passwordLength.toInt()) { + qCritical("Invalid value for password length %s.", qPrintable(passwordLength)); + return EXIT_FAILURE; + } + + Entry* entry = db->rootGroup()->findEntryByPath(entryPath); + if (!entry) { + qCritical("Could not find entry with path %s.", qPrintable(entryPath)); + return EXIT_FAILURE; + } + + if (parser.value("username").isEmpty() && parser.value("url").isEmpty() && parser.value("title").isEmpty() && + !parser.isSet(prompt) && !parser.isSet(generate)) { + qCritical("Not changing any field for entry %s.", qPrintable(entryPath)); + return EXIT_FAILURE; + } + + entry->beginUpdate(); + + if (!parser.value("title").isEmpty()) { + entry->setTitle(parser.value("title")); + } + + if (!parser.value("username").isEmpty()) { + entry->setUsername(parser.value("username")); + } + + if (!parser.value("url").isEmpty()) { + entry->setUrl(parser.value("url")); + } + + if (parser.isSet(prompt)) { + outputTextStream << "Enter new password for entry: "; + outputTextStream.flush(); + QString password = Utils::getPassword(); + entry->setPassword(password); + } else if (parser.isSet(generate)) { + PasswordGenerator passwordGenerator; + + if (passwordLength.isEmpty()) { + passwordGenerator.setLength(PasswordGenerator::DefaultLength); + } else { + passwordGenerator.setLength(passwordLength.toInt()); + } + + passwordGenerator.setCharClasses(PasswordGenerator::LowerLetters | PasswordGenerator::UpperLetters | + PasswordGenerator::Numbers); + QString password = passwordGenerator.generatePassword(); + entry->setPassword(password); + } + + entry->endUpdate(); + + QString errorMessage = db->saveToFile(databasePath); + if (!errorMessage.isEmpty()) { + qCritical("Writing the database failed %s.", qPrintable(errorMessage)); + return EXIT_FAILURE; + } + + outputTextStream << "Successfully edited entry " << entry->title() << "." << endl; + return EXIT_SUCCESS; +} diff --git a/src/cli/Edit.h b/src/cli/Edit.h new file mode 100644 index 000000000..e52069ff0 --- /dev/null +++ b/src/cli/Edit.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2017 KeePassXC Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef KEEPASSXC_EDIT_H +#define KEEPASSXC_EDIT_H + +#include "Command.h" + +class Edit : public Command +{ +public: + Edit(); + ~Edit(); + int execute(QStringList arguments); +}; + +#endif // KEEPASSXC_EDIT_H diff --git a/src/cli/Remove.cpp b/src/cli/Remove.cpp new file mode 100644 index 000000000..6abb68f1c --- /dev/null +++ b/src/cli/Remove.cpp @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2017 KeePassXC Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include + +#include "Remove.h" + +#include +#include +#include +#include + +#include "cli/Utils.h" +#include "core/Database.h" +#include "core/Entry.h" +#include "core/Group.h" +#include "core/Metadata.h" +#include "core/Tools.h" + +Remove::Remove() +{ + this->name = QString("rm"); + this->description = QString("Remove an entry from the database."); +} + +Remove::~Remove() +{ +} + +int Remove::execute(QStringList arguments) +{ + QTextStream outputTextStream(stdout, QIODevice::WriteOnly); + + QCommandLineParser parser; + parser.setApplicationDescription(QCoreApplication::translate("main", "Remove an entry from the database.")); + parser.addPositionalArgument("database", QCoreApplication::translate("main", "Path of the database.")); + QCommandLineOption keyFile(QStringList() << "k" + << "key-file", + QObject::tr("Key file of the database."), + QObject::tr("path")); + parser.addOption(keyFile); + parser.addPositionalArgument("entry", QCoreApplication::translate("main", "Path of the entry to remove.")); + parser.process(arguments); + + const QStringList args = parser.positionalArguments(); + if (args.size() != 2) { + outputTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli rm"); + return EXIT_FAILURE; + } + + Database* db = Database::unlockFromStdin(args.at(0), parser.value(keyFile)); + if (db == nullptr) { + return EXIT_FAILURE; + } + + return this->removeEntry(db, args.at(0), args.at(1)); +} + +int Remove::removeEntry(Database* database, QString databasePath, QString entryPath) +{ + + QTextStream outputTextStream(stdout, QIODevice::WriteOnly); + Entry* entry = database->rootGroup()->findEntryByPath(entryPath); + if (!entry) { + qCritical("Entry %s not found.", qPrintable(entryPath)); + return EXIT_FAILURE; + } + + QString entryTitle = entry->title(); + bool recycled = true; + if (Tools::hasChild(database->metadata()->recycleBin(), entry) || !database->metadata()->recycleBinEnabled()) { + delete entry; + recycled = false; + } else { + database->recycleEntry(entry); + }; + + QString errorMessage = database->saveToFile(databasePath); + if (!errorMessage.isEmpty()) { + qCritical("Unable to save database to file : %s", qPrintable(errorMessage)); + return EXIT_FAILURE; + } + + if (recycled) { + outputTextStream << "Successfully recycled entry " << entryTitle << "." << endl; + } else { + outputTextStream << "Successfully deleted entry " << entryTitle << "." << endl; + } + + return EXIT_SUCCESS; +} diff --git a/src/cli/Remove.h b/src/cli/Remove.h new file mode 100644 index 000000000..2440c201c --- /dev/null +++ b/src/cli/Remove.h @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2017 KeePassXC Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef KEEPASSXC_REMOVE_H +#define KEEPASSXC_REMOVE_H + +#include "Command.h" + +#include "core/Database.h" + +class Remove : public Command +{ +public: + Remove(); + ~Remove(); + int execute(QStringList arguments); + int removeEntry(Database* database, QString databasePath, QString entryPath); +}; + +#endif // KEEPASSXC_REMOVE_H diff --git a/src/cli/keepassxc-cli.1 b/src/cli/keepassxc-cli.1 index b88215631..940b3d4cf 100644 --- a/src/cli/keepassxc-cli.1 +++ b/src/cli/keepassxc-cli.1 @@ -9,13 +9,19 @@ keepassxc-cli \- command line interface for the \fBKeePassXC\fP password manager .I command .SH DESCRIPTION -\fBkeepassxc-cli\fP is the command line interface for the \fBKeePassXC\fP password manager. It provides the ability of listing the entries of a database, displaying the contents of an entry and many more, directly from the command line. +\fBkeepassxc-cli\fP is the command line interface for the \fBKeePassXC\fP password manager. It provides the ability to query and modify the entries of a KeePass database, directly from the command line. .SH COMMANDS +.IP "add [options] " +Adds a new entry to a database. A password can be generated (\fI-g\fP option), or a prompt can be displayed to input the password (\fI-p\fP option). + .IP "clip [options] [timeout]" Copies the password of a database entry to the clipboard. If multiple entries with the same name exist in different groups, only the password for the first one is going to be copied. For copying the password of an entry in a specific group, the group path to the entry should be specified as well, instead of just the name. Optionally, a timeout in seconds can be specified to automatically clear the clipboard. +.IP "edit [options] " +Edits a database entry. A password can be generated (\fI-g\fP option), or a prompt can be displayed to input the password (\fI-p\fP option). + .IP "entropy-meter [-a pwd1 pwd2 ...]" Calculates the entropy of a single, or multiple passwords specified using the \fI-a\fP option. If no passwords are specified, the program will run in interactive mode and prompt the user to enter a password. @@ -31,26 +37,59 @@ Lists the contents of a group in a database. If no group is specified, it will d .IP "merge [options] " Merges two databases together. The first database file is going to be replaced by the result of the merge, for that reason it is advisable to keep a backup of the two database files before attempting a merge. In the case that both databases make use of the same credentials, the \fI--same-credentials\fP or \fI-s\fP option can be used. +.IP "rm [options] " +Removes an entry from a database. If the database has a recycle bin, the entry will be moved there. If the entry is already in the recycle bin, it will be removed permanently. + .IP "show [options] " Shows the title, username, password, URL and notes of a database entry. Regarding the occurrence of multiple entries with the same name in different groups, everything stated in the \fIclip\fP command section also applies here. .SH OPTIONS +.SS "General options" + .IP "-k, --key-file " Specifies a path to a key file for unlocking the database. In a merge operation this option is used to specify the key file path for the first database. -.IP "-f, --key-file-from " -Specifies a path to a key file for the second database in a merge operation. - -.IP "-s, --same-credentials" -Tells the program to use the same credentials for unlocking both of the database files in a merge operation. - .IP "-h, --help" Displays help information. .IP "-v, --version" Shows the program version. + +.SS "Merge options" + +.IP "-f, --key-file-from " +Path of the key file for the second database. + +.IP "-s, --same-credentials" +Use the same credentials for unlocking both database. + + +.SS "Add and edit options" + +.IP "-u, --username " +Specify the username of the entry. + +.IP "--url " +Specify the URL of the entry. + +.IP "-p, --password-prompt" +Use a password prompt for the entry's password. + +.IP "-g, --generate" +Generate a new password for the entry. + +.IP "-l, --password-length" +Specify the length of the password to generate. + + +.SS "Edit options" + +.IP "-t, --title " +Specify the title of the entry. + + .SH REPORTING BUGS Bugs and feature requests can be reported on GitHub at https://github.com/keepassxreboot/keepassxc/issues. diff --git a/src/core/Group.cpp b/src/core/Group.cpp index 92e0269e5..6da1f2cee 100644 --- a/src/core/Group.cpp +++ b/src/core/Group.cpp @@ -949,3 +949,32 @@ QStringList Group::locate(QString locateTerm, QString currentPath) return response; } + +Entry* Group::addEntryWithPath(QString entryPath) +{ + Q_ASSERT(!entryPath.isNull()); + if (this->findEntryByPath(entryPath)) { + return nullptr; + } + + QStringList groups = entryPath.split("/"); + QString entryTitle = groups.takeLast(); + QString groupPath = groups.join("/"); + if (groupPath.isNull()) { + groupPath = QString(""); + } + + Q_ASSERT(!groupPath.isNull()); + Group* group = this->findGroupByPath(groupPath); + if (!group) { + return nullptr; + } + + Entry* entry = new Entry(); + entry->setTitle(entryTitle); + entry->setUuid(Uuid::random()); + entry->setGroup(group); + + return entry; + +} diff --git a/src/core/Group.h b/src/core/Group.h index 73b791590..27400703e 100644 --- a/src/core/Group.h +++ b/src/core/Group.h @@ -85,6 +85,7 @@ public: Entry* findEntryByPath(QString entryPath, QString basePath = QString("")); Group* findGroupByPath(QString groupPath, QString basePath = QString("/")); QStringList locate(QString locateTerm, QString currentPath = QString("/")); + Entry* addEntryWithPath(QString entryPath); void setUuid(const Uuid& uuid); void setName(const QString& name); void setNotes(const QString& notes); diff --git a/src/core/PasswordGenerator.h b/src/core/PasswordGenerator.h index 5a5c7a3f6..98bb58b6a 100644 --- a/src/core/PasswordGenerator.h +++ b/src/core/PasswordGenerator.h @@ -58,6 +58,8 @@ public: QString generatePassword() const; int getbits() const; + static const int DefaultLength = 16; + private: QVector<PasswordGroup> passwordGroups() const; int numCharClasses() const; diff --git a/src/gui/PasswordGeneratorWidget.cpp b/src/gui/PasswordGeneratorWidget.cpp index 3753071d1..d77634415 100644 --- a/src/gui/PasswordGeneratorWidget.cpp +++ b/src/gui/PasswordGeneratorWidget.cpp @@ -98,7 +98,7 @@ void PasswordGeneratorWidget::loadSettings() m_ui->checkBoxExtASCII->setChecked(config()->get("generator/EASCII", false).toBool()); m_ui->checkBoxExcludeAlike->setChecked(config()->get("generator/ExcludeAlike", true).toBool()); m_ui->checkBoxEnsureEvery->setChecked(config()->get("generator/EnsureEvery", true).toBool()); - m_ui->spinBoxLength->setValue(config()->get("generator/Length", 16).toInt()); + m_ui->spinBoxLength->setValue(config()->get("generator/Length", PasswordGenerator::DefaultLength).toInt()); // Diceware config m_ui->spinBoxWordCount->setValue(config()->get("generator/WordCount", 6).toInt()); diff --git a/src/http/HttpPasswordGeneratorWidget.cpp b/src/http/HttpPasswordGeneratorWidget.cpp index 55e5b08fc..b722a85f3 100644 --- a/src/http/HttpPasswordGeneratorWidget.cpp +++ b/src/http/HttpPasswordGeneratorWidget.cpp @@ -56,7 +56,7 @@ void HttpPasswordGeneratorWidget::loadSettings() m_ui->checkBoxExcludeAlike->setChecked(config()->get("Http/generator/ExcludeAlike", true).toBool()); m_ui->checkBoxEnsureEvery->setChecked(config()->get("Http/generator/EnsureEvery", true).toBool()); - m_ui->spinBoxLength->setValue(config()->get("Http/generator/Length", 16).toInt()); + m_ui->spinBoxLength->setValue(config()->get("Http/generator/Length", PasswordGenerator::DefaultLength).toInt()); } void HttpPasswordGeneratorWidget::saveSettings() diff --git a/tests/TestGroup.cpp b/tests/TestGroup.cpp index efdcb32e6..5a809670f 100644 --- a/tests/TestGroup.cpp +++ b/tests/TestGroup.cpp @@ -698,3 +698,51 @@ void TestGroup::testLocate() delete db; } + +void TestGroup::testAddEntryWithPath() +{ + Database* db = new Database(); + + Group* group1 = new Group(); + group1->setName("group1"); + group1->setParent(db->rootGroup()); + + Group* group2 = new Group(); + group2->setName("group2"); + group2->setParent(group1); + + Entry* entry = db->rootGroup()->addEntryWithPath("entry1"); + QVERIFY(entry != nullptr); + QVERIFY(!entry->uuid().isNull()); + + entry = db->rootGroup()->addEntryWithPath("entry1"); + QVERIFY(entry == nullptr); + + entry = db->rootGroup()->addEntryWithPath("/entry1"); + QVERIFY(entry == nullptr); + + entry = db->rootGroup()->addEntryWithPath("entry2"); + QVERIFY(entry != nullptr); + QVERIFY(entry->title() == "entry2"); + QVERIFY(!entry->uuid().isNull()); + + entry = db->rootGroup()->addEntryWithPath("/entry3"); + QVERIFY(entry != nullptr); + QVERIFY(entry->title() == "entry3"); + QVERIFY(!entry->uuid().isNull()); + + entry = db->rootGroup()->addEntryWithPath("/group1/entry4"); + QVERIFY(entry != nullptr); + QVERIFY(entry->title() == "entry4"); + QVERIFY(!entry->uuid().isNull()); + + entry = db->rootGroup()->addEntryWithPath("/group1/group2/entry5"); + QVERIFY(entry != nullptr); + QVERIFY(entry->title() == "entry5"); + QVERIFY(!entry->uuid().isNull()); + + entry = db->rootGroup()->addEntryWithPath("/group1/invalid_group/entry6"); + QVERIFY(entry == nullptr); + + delete db; +} diff --git a/tests/TestGroup.h b/tests/TestGroup.h index fabe860af..11abfe129 100644 --- a/tests/TestGroup.h +++ b/tests/TestGroup.h @@ -39,6 +39,7 @@ private slots: void testFindGroupByPath(); void testPrint(); void testLocate(); + void testAddEntryWithPath(); }; #endif // KEEPASSX_TESTGROUP_H From f73150c9985b7b1451508ff512d88a29eb560989 Mon Sep 17 00:00:00 2001 From: TheZ3ro <io@thezero.org> Date: Tue, 19 Sep 2017 16:41:38 +0200 Subject: [PATCH 036/402] Fixing travis build (#969) --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index e24d1d178..df7f8ed58 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,8 @@ language: cpp sudo: required dist: trusty +# FIXME : remove when (https://github.com/google/sanitizers/issues/837) is resolved. +group: deprecated-2017Q3 services: [docker] os: From 8e8d9f39cb867b0d2ddce151f34d1c89d171a392 Mon Sep 17 00:00:00 2001 From: louib <louib@users.noreply.github.com> Date: Wed, 20 Sep 2017 11:39:10 -0400 Subject: [PATCH 037/402] Merge : making sure the group is populated. (#942) --- tests/TestMerge.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/TestMerge.cpp b/tests/TestMerge.cpp index e9876f183..48f228b41 100644 --- a/tests/TestMerge.cpp +++ b/tests/TestMerge.cpp @@ -116,6 +116,7 @@ void TestMerge::testResolveConflictNewer() entry1 = dbDestination->rootGroup()->findEntry("entry1"); QVERIFY(entry1 != nullptr); + QVERIFY(entry1->group() != nullptr); QCOMPARE(entry1->password(), QString("password")); // When updating an entry, it should not end up in the From 5a18b8de774cb8b5843f29b3e53bea142cee9a29 Mon Sep 17 00:00:00 2001 From: Yen Chi Hsuan <yan12125@gmail.com> Date: Sat, 23 Sep 2017 19:14:15 +0800 Subject: [PATCH 038/402] Use CMake's variable instead of hardcoded path to install man pages --- src/cli/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cli/CMakeLists.txt b/src/cli/CMakeLists.txt index 1ee232a48..e9f50d1a8 100644 --- a/src/cli/CMakeLists.txt +++ b/src/cli/CMakeLists.txt @@ -55,6 +55,6 @@ install(TARGETS keepassxc-cli RUNTIME DESTINATION ${CLI_INSTALL_DIR} COMPONENT Runtime) if(APPLE OR UNIX) - install(FILES keepassxc-cli.1 DESTINATION /usr/local/share/man/man1/) + install(FILES keepassxc-cli.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1/) execute_process(COMMAND mandb -q) endif() From 0c62d8454d005e975975880ca2aeb156bbe07668 Mon Sep 17 00:00:00 2001 From: Martin Wallin <guzzard@gmail.com> Date: Sun, 24 Sep 2017 21:36:07 +0200 Subject: [PATCH 039/402] Toggle main window with by middle mouse clicking tray icon --- src/gui/MainWindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 8f6846f4b..ab340e1f3 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -855,7 +855,7 @@ void MainWindow::applySettingsChanges() void MainWindow::trayIconTriggered(QSystemTrayIcon::ActivationReason reason) { - if (reason == QSystemTrayIcon::Trigger) { + if (reason == QSystemTrayIcon::Trigger || reason == QSystemTrayIcon::MiddleClick) { toggleWindow(); } } From 522e132200712f9243e310495710e9a369c14909 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20E=2E=20Garc=C3=ADa?= <adolfo.garcia.cr@gmail.com> Date: Sun, 24 Sep 2017 16:00:12 -0600 Subject: [PATCH 040/402] New base32 implementation (#984) * Add new base32 encode/decode implementation * Remove old base32 implementation * Updates licensing info --- COPYING | 9 -- LICENSE.APACHE-2.0 | 201 ----------------------------------------- src/CMakeLists.txt | 5 +- src/core/Base32.cpp | 210 +++++++++++++++++++++++++++++++++++++++++++ src/core/Base32.h | 36 ++++++++ src/core/Optional.h | 93 +++++++++++++++++++ src/totp/base32.cpp | 68 -------------- src/totp/base32.h | 34 ------- src/totp/totp.cpp | 8 +- tests/CMakeLists.txt | 3 + tests/TestBase32.cpp | 168 ++++++++++++++++++++++++++++++++++ tests/TestBase32.h | 34 +++++++ tests/TestTotp.cpp | 20 ----- tests/TestTotp.h | 1 - 14 files changed, 551 insertions(+), 339 deletions(-) delete mode 100644 LICENSE.APACHE-2.0 create mode 100644 src/core/Base32.cpp create mode 100644 src/core/Base32.h create mode 100644 src/core/Optional.h delete mode 100644 src/totp/base32.cpp delete mode 100644 src/totp/base32.h create mode 100644 tests/TestBase32.cpp create mode 100644 tests/TestBase32.h diff --git a/COPYING b/COPYING index 481aaf726..403e4564b 100644 --- a/COPYING +++ b/COPYING @@ -214,10 +214,6 @@ Files: share/icons/database/C65_W.png Copyright: none License: public-domain -Files: src/crypto/salsa20/* -Copyright: none -License: public-domain - Files: src/streams/qtiocompressor.* src/streams/QtIOCompressor tests/modeltest.* @@ -241,8 +237,3 @@ Files: src/gui/KMessageWidget.h Copyright: 2011 Aurélien Gâteau <agateau@kde.org> 2014 Dominik Haumann <dhaumann@kde.org> License: LGPL-2.1 - -Files: src/totp/base32.cpp - src/totp/base32.h -Copyright: 2010 Google Inc. -License: Apache 2.0 \ No newline at end of file diff --git a/LICENSE.APACHE-2.0 b/LICENSE.APACHE-2.0 deleted file mode 100644 index 9c8f3ea08..000000000 --- a/LICENSE.APACHE-2.0 +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6ee280d40..bd8a1fd33 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -66,6 +66,9 @@ set(keepassx_SOURCES core/Tools.cpp core/Translator.cpp core/Uuid.cpp + core/Base32.h + core/Base32.cpp + core/Optional.h cli/Utils.cpp cli/Utils.h crypto/Crypto.cpp @@ -145,8 +148,6 @@ set(keepassx_SOURCES streams/qtiocompressor.cpp streams/StoreDataStream.cpp streams/SymmetricCipherStream.cpp - totp/base32.h - totp/base32.cpp totp/totp.h totp/totp.cpp ) diff --git a/src/core/Base32.cpp b/src/core/Base32.cpp new file mode 100644 index 000000000..a58f2e422 --- /dev/null +++ b/src/core/Base32.cpp @@ -0,0 +1,210 @@ +/* + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +// Conforms to RFC 4648. For details, see: https://tools.ietf.org/html/rfc4648 + +#include "Base32.h" + +constexpr quint64 MASK_40BIT = quint64(0xF8) << 32; +constexpr quint64 MASK_35BIT = quint64(0x7C0000000); +constexpr quint64 MASK_25BIT = quint64(0x1F00000); +constexpr quint64 MASK_20BIT = quint64(0xF8000); +constexpr quint64 MASK_10BIT = quint64(0x3E0); + +constexpr char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"; +constexpr quint8 ALPH_POS_2 = 26; + +constexpr quint8 ASCII_2 = static_cast<quint8>('2'); +constexpr quint8 ASCII_7 = static_cast<quint8>('7'); +constexpr quint8 ASCII_A = static_cast<quint8>('A'); +constexpr quint8 ASCII_Z = static_cast<quint8>('Z'); +constexpr quint8 ASCII_a = static_cast<quint8>('a'); +constexpr quint8 ASCII_z = static_cast<quint8>('z'); +constexpr quint8 ASCII_EQ = static_cast<quint8>('='); + +Optional<QByteArray> Base32::decode(const QByteArray& encodedData) +{ + if (encodedData.size() <= 0) + return Optional<QByteArray>(""); + + if (encodedData.size() % 8 != 0) + return Optional<QByteArray>(); + + int nPads = 0; + for (int i = -1; i > -7; --i) { + if ('=' == encodedData[encodedData.size()+i]) + ++nPads; + } + + int specialOffset; + int nSpecialBytes; + + switch (nPads) { // in {0, 1, 3, 4, 6} + case 1: + nSpecialBytes = 4; + specialOffset = 3; + break; + case 3: + nSpecialBytes = 3; + specialOffset = 1; + break; + case 4: + nSpecialBytes = 2; + specialOffset = 4; + break; + case 6: + nSpecialBytes = 1; + specialOffset = 2; + break; + default: + nSpecialBytes = 0; + specialOffset = 0; + } + + + Q_ASSERT(encodedData.size() > 0); + const int nQuantums = encodedData.size() / 8; + const int nBytes = (nQuantums - 1) * 5 + nSpecialBytes; + + QByteArray data(nBytes, Qt::Uninitialized); + + int i = 0; + int o = 0; + + while (i < encodedData.size()) { + quint64 quantum = 0; + int nQuantumBytes = 5; + + for (int n = 0; n < 8; n++) { + quint8 ch = static_cast<quint8>(encodedData[i++]); + if ((ASCII_A <= ch && ch <= ASCII_Z) || (ASCII_a <= ch && ch <= ASCII_z)) { + ch -= ASCII_A; + if (ch >= ALPH_POS_2) + ch -= ASCII_a - ASCII_A; + } else { + if (ch >= ASCII_2 && ch <= ASCII_7) { + ch -= ASCII_2; + ch += ALPH_POS_2; + } else { + if (ASCII_EQ == ch) { + if(i == encodedData.size()) { + // finished with special quantum + quantum >>= specialOffset; + nQuantumBytes = nSpecialBytes; + } + continue; + } else { + // illegal character + return Optional<QByteArray>(); + } + } + } + + quantum <<= 5; + quantum |= ch; + } + + const int offset = (nQuantumBytes - 1) * 8; + quint64 mask = quint64(0xFF) << offset; + for (int n = offset; n >= 0; n -= 8) { + char c = static_cast<char>((quantum & mask) >> n); + data[o++] = c; + mask >>= 8; + } + } + + return Optional<QByteArray>(data); +} + +QByteArray Base32::encode(const QByteArray& data) +{ + if (data.size() < 1) + return QByteArray(); + + const int nBits = data.size() * 8; + const int rBits = nBits % 40; // in {0, 8, 16, 24, 32} + const int nQuantums = nBits / 40 + (rBits > 0 ? 1 : 0); + QByteArray encodedData(nQuantums * 8, Qt::Uninitialized); + + int i = 0; + int o = 0; + int n; + quint64 mask; + quint64 quantum; + + // 40-bits of input per input group + while (i + 5 <= data.size()) { + quantum = 0; + for (n = 32; n >= 0; n -= 8) { + quantum |= (static_cast<quint64>(data[i++]) << n); + } + + mask = MASK_40BIT; + int index; + for (n = 35; n >= 0; n -= 5) { + index = (quantum & mask) >> n; + encodedData[o++] = alphabet[index]; + mask >>= 5; + } + } + + // < 40-bits of input at final input group + if (i < data.size()) { + Q_ASSERT(rBits > 0); + quantum = 0; + for (n = rBits - 8; n >= 0; n -= 8) + quantum |= static_cast<quint64>(data[i++]) << n; + + switch (rBits) { + case 8: // expand to 10 bits + quantum <<= 2; + mask = MASK_10BIT; + n = 5; + break; + case 16: // expand to 20 bits + quantum <<= 4; + mask = MASK_20BIT; + n = 15; + break; + case 24: // expand to 25 bits + quantum <<= 1; + mask = MASK_25BIT; + n = 20; + break; + default: // expand to 35 bits + Q_ASSERT(rBits == 32); + quantum <<= 3; + mask = MASK_35BIT; + n = 30; + } + + while (n >= 0) { + int index = (quantum & mask) >> n; + encodedData[o++] = alphabet[index]; + mask >>= 5; + n -= 5; + } + + // add pad characters + while (o < encodedData.size()) + encodedData[o++] = '='; + } + + Q_ASSERT(encodedData.size() == o); + return encodedData; +} + diff --git a/src/core/Base32.h b/src/core/Base32.h new file mode 100644 index 000000000..701eb7ab6 --- /dev/null +++ b/src/core/Base32.h @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +// Conforms to RFC 4648. For details, see: https://tools.ietf.org/html/rfc4648 + +#ifndef BASE32_H +#define BASE32_H + +#include "Optional.h" +#include <QtCore/qglobal.h> +#include <QByteArray> + +class Base32 +{ +public: + Base32() =default; + Q_REQUIRED_RESULT static Optional<QByteArray> decode(const QByteArray&); + Q_REQUIRED_RESULT static QByteArray encode(const QByteArray&); +}; + + +#endif //BASE32_H diff --git a/src/core/Optional.h b/src/core/Optional.h new file mode 100644 index 000000000..fb800198a --- /dev/null +++ b/src/core/Optional.h @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef OPTIONAL_H +#define OPTIONAL_H + +/* + * This utility class is for providing basic support for an option type. + * It can be replaced by std::optional (C++17) or + * std::experimental::optional (C++11) when they become fully supported + * by all the compilers. + */ + +template <typename T> +class Optional +{ +public: + + // None + Optional() : + m_hasValue(false), + m_value() + { }; + + // Some T + Optional(const T& value) : + m_hasValue(true), + m_value(value) + { }; + + // Copy + Optional(const Optional& other) : + m_hasValue(other.m_hasValue), + m_value(other.m_value) + { }; + + const Optional& operator=(const Optional& other) + { + m_hasValue = other.m_hasValue; + m_value = other.m_value; + return *this; + } + + bool operator==(const Optional& other) const + { + if(m_hasValue) + return other.m_hasValue && m_value == other.m_value; + else + return !other.m_hasValue; + } + + bool operator!=(const Optional& other) const + { + return !(*this == other); + } + + bool hasValue() const + { + return m_hasValue; + } + + T valueOr(const T& other) const + { + return m_hasValue ? m_value : other; + } + + Optional static makeOptional(const T& value) + { + return Optional(value); + } + + +private: + + bool m_hasValue; + T m_value; +}; + +#endif // OPTIONAL_H diff --git a/src/totp/base32.cpp b/src/totp/base32.cpp deleted file mode 100644 index 4c81cb491..000000000 --- a/src/totp/base32.cpp +++ /dev/null @@ -1,68 +0,0 @@ -// Base32 implementation -// Source: https://github.com/google/google-authenticator-libpam/blob/master/src/base32.c -// -// Copyright 2010 Google Inc. -// Author: Markus Gutschke -// Modifications Copyright 2017 KeePassXC team <team@keepassxc.org> -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "base32.h" - -Base32::Base32() -{ -} - -QByteArray Base32::base32_decode(const QByteArray encoded) -{ - QByteArray result; - - int buffer = 0; - int bitsLeft = 0; - - for (char ch : encoded) { - if (ch == 0 || ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n' || ch == '-' || ch == '=') { - continue; - } - - buffer <<= 5; - - // Deal with commonly mistyped characters - if (ch == '0') { - ch = 'O'; - } else if (ch == '1') { - ch = 'L'; - } else if (ch == '8') { - ch = 'B'; - } - - // Look up one base32 digit - if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) { - ch = (ch & 0x1F) - 1; - } else if (ch >= '2' && ch <= '7') { - ch -= '2' - 26; - } else { - return QByteArray(); - } - - buffer |= ch; - bitsLeft += 5; - - if (bitsLeft >= 8) { - result.append(static_cast<char> (buffer >> (bitsLeft - 8))); - bitsLeft -= 8; - } - } - - return result; -} \ No newline at end of file diff --git a/src/totp/base32.h b/src/totp/base32.h deleted file mode 100644 index 75343fa43..000000000 --- a/src/totp/base32.h +++ /dev/null @@ -1,34 +0,0 @@ -// Base32 implementation -// Source: https://github.com/google/google-authenticator-libpam/blob/master/src/base32.h -// -// Copyright 2010 Google Inc. -// Author: Markus Gutschke -// Modifications Copyright 2017 KeePassXC team <team@keepassxc.org> -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef BASE32_H -#define BASE32_H - -#include <QtCore/qglobal.h> -#include <QByteArray> - -class Base32 -{ -public: - Base32(); - static QByteArray base32_decode(const QByteArray encoded); -}; - - -#endif //BASE32_H diff --git a/src/totp/totp.cpp b/src/totp/totp.cpp index 51af0e086..26716c095 100644 --- a/src/totp/totp.cpp +++ b/src/totp/totp.cpp @@ -17,7 +17,7 @@ */ #include "totp.h" -#include "base32.h" +#include "core/Base32.h" #include <cmath> #include <QtEndian> #include <QRegExp> @@ -98,13 +98,13 @@ QString QTotp::generateTotp(const QByteArray key, quint64 time, { quint64 current = qToBigEndian(time / step); - QByteArray secret = Base32::base32_decode(key); - if (secret.isEmpty()) { + Optional<QByteArray> secret = Base32::decode(key); + if (!secret.hasValue()) { return "Invalid TOTP secret key"; } QMessageAuthenticationCode code(QCryptographicHash::Sha1); - code.setKey(secret); + code.setKey(secret.valueOr("")); code.addData(QByteArray(reinterpret_cast<char*>(¤t), sizeof(current))); QByteArray hmac = code.result(); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 33baf564f..c1f1adf41 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -164,6 +164,9 @@ add_unit_test(NAME testmerge SOURCES TestMerge.cpp add_unit_test(NAME testtotp SOURCES TestTotp.cpp LIBS ${TEST_LIBRARIES}) +add_unit_test(NAME testbase32 SOURCES TestBase32.cpp + LIBS ${TEST_LIBRARIES}) + add_unit_test(NAME testcsvparser SOURCES TestCsvParser.cpp LIBS ${TEST_LIBRARIES}) diff --git a/tests/TestBase32.cpp b/tests/TestBase32.cpp new file mode 100644 index 000000000..7268e9271 --- /dev/null +++ b/tests/TestBase32.cpp @@ -0,0 +1,168 @@ +/* + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "TestBase32.h" +#include "core/Base32.h" +#include <QTest> + +QTEST_GUILESS_MAIN(TestBase32) + +void TestBase32::testDecode() +{ + // 3 quantums, all upper case + padding + QByteArray encodedData = "JBSWY3DPEB3W64TMMQXC4LQ="; + auto data = Base32::decode(encodedData); + QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("Hello world...")); + + // 4 quantums, all upper case + encodedData = "GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ"; + data = Base32::decode(encodedData); + QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("12345678901234567890")); + + // 4 quantums, all lower case + encodedData = "gezdgnbvgy3tqojqgezdgnbvgy3tqojq"; + data = Base32::decode(encodedData); + QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("12345678901234567890")); + + // 4 quantums, mixed upper and lower case + encodedData = "Gezdgnbvgy3tQojqgezdGnbvgy3tQojQ"; + data = Base32::decode(encodedData); + QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("12345678901234567890")); + + // 1 pad characters + encodedData = "ORSXG5A="; + data = Base32::decode(encodedData); + QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("test")); + + // 3 pad characters + encodedData = "L5PV6==="; + data = Base32::decode(encodedData); + QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("___")); + + // 4 pad characters + encodedData = "MZXW6IDCMFZA===="; + data = Base32::decode(encodedData); + QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("foo bar")); + + // six pad characters + encodedData = "MZXW6YTBOI======"; + data = Base32::decode(encodedData); + QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("foobar")); + + encodedData = "IA======"; + data = Base32::decode(encodedData); + QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("@")); + + // error: illegal character + encodedData = "1MZXW6YTBOI====="; + data = Base32::decode(encodedData); + QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("ERROR")); + + // error: missing pad character + encodedData = "MZXW6YTBOI====="; + data = Base32::decode(encodedData); + QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("ERROR")); + + // RFC 4648 test vectors + encodedData = ""; + data = Base32::decode(encodedData); + QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("")); + + encodedData = "MY======"; + data = Base32::decode(encodedData); + QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("f")); + + encodedData = "MZXQ===="; + data = Base32::decode(encodedData); + QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("fo")); + + encodedData = "MZXW6==="; + data = Base32::decode(encodedData); + QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("foo")); + + encodedData = "MZXW6YQ="; + data = Base32::decode(encodedData); + QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("foob")); + + encodedData = "MZXW6YTB"; + data = Base32::decode(encodedData); + QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("fooba")); + + encodedData = "MZXW6YTBOI======"; + data = Base32::decode(encodedData); + QCOMPARE(QString::fromLatin1(data.valueOr("ERROR")), QString("foobar")); +} + +void TestBase32::testEncode() +{ + QByteArray data = "Hello world..."; + QByteArray encodedData = Base32::encode(data); + QCOMPARE(encodedData, QByteArray("JBSWY3DPEB3W64TMMQXC4LQ=")); + + data = "12345678901234567890"; + encodedData = Base32::encode(data); + QCOMPARE(encodedData, QByteArray("GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ")); + + data = "012345678901234567890"; + encodedData = Base32::encode(data); + QCOMPARE(encodedData, QByteArray("GAYTEMZUGU3DOOBZGAYTEMZUGU3DOOBZGA======")); + + data = "test"; + encodedData = Base32::encode(data); + QCOMPARE(encodedData, QByteArray("ORSXG5A=")); + + data = "___"; + encodedData = Base32::encode(data); + QCOMPARE(encodedData, QByteArray("L5PV6===")); + + data = "foo bar"; + encodedData = Base32::encode(data); + QCOMPARE(encodedData, QByteArray("MZXW6IDCMFZA====")); + + data = "@"; + encodedData = Base32::encode(data); + QCOMPARE(encodedData, QByteArray("IA======")); + + // RFC 4648 test vectors + data = ""; + encodedData = Base32::encode(data); + QCOMPARE(encodedData, QByteArray("")); + + data = "f"; + encodedData = Base32::encode(data); + QCOMPARE(encodedData, QByteArray("MY======")); + + data = "fo"; + encodedData = Base32::encode(data); + QCOMPARE(encodedData, QByteArray("MZXQ====")); + + data = "foo"; + encodedData = Base32::encode(data); + QCOMPARE(encodedData, QByteArray("MZXW6===")); + + data = "foob"; + encodedData = Base32::encode(data); + QCOMPARE(encodedData, QByteArray("MZXW6YQ=")); + + data = "fooba"; + encodedData = Base32::encode(data); + QCOMPARE(encodedData, QByteArray("MZXW6YTB")); + + data = "foobar"; + encodedData = Base32::encode(data); + QCOMPARE(encodedData, QByteArray("MZXW6YTBOI======")); +} diff --git a/tests/TestBase32.h b/tests/TestBase32.h new file mode 100644 index 000000000..6d4de34a6 --- /dev/null +++ b/tests/TestBase32.h @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef KEEPASSX_TESTBASE32_H +#define KEEPASSX_TESTBASE32_H + +#include <QObject> + +class Base32; + +class TestBase32 : public QObject +{ + Q_OBJECT + +private slots: + void testEncode(); + void testDecode(); +}; + +#endif // KEEPASSX_TESTBASE32_H diff --git a/tests/TestTotp.cpp b/tests/TestTotp.cpp index e22c2567e..7a3b2e3cd 100644 --- a/tests/TestTotp.cpp +++ b/tests/TestTotp.cpp @@ -26,7 +26,6 @@ #include "crypto/Crypto.h" #include "totp/totp.h" -#include "totp/base32.h" QTEST_GUILESS_MAIN(TestTotp) @@ -60,25 +59,6 @@ void TestTotp::testParseSecret() QCOMPARE(step, quint8(30)); } -void TestTotp::testBase32() -{ - QByteArray key = QString("JBSW Y3DP EB3W 64TM MQXC 4LQA").toLatin1(); - QByteArray secret = Base32::base32_decode(key); - QCOMPARE(QString::fromLatin1(secret), QString("Hello world...")); - - key = QString("gezdgnbvgy3tqojqgezdgnbvgy3tqojq").toLatin1(); - secret = Base32::base32_decode(key); - QCOMPARE(QString::fromLatin1(secret), QString("12345678901234567890")); - - key = QString("ORSXG5A=").toLatin1(); - secret = Base32::base32_decode(key); - QCOMPARE(QString::fromLatin1(secret), QString("test")); - - key = QString("MZXW6YTBOI======").toLatin1(); - secret = Base32::base32_decode(key); - QCOMPARE(QString::fromLatin1(secret), QString("foobar")); -} - void TestTotp::testTotpCode() { // Test vectors from RFC 6238 diff --git a/tests/TestTotp.h b/tests/TestTotp.h index d197294dd..785a9f522 100644 --- a/tests/TestTotp.h +++ b/tests/TestTotp.h @@ -30,7 +30,6 @@ class TestTotp : public QObject private slots: void initTestCase(); void testParseSecret(); - void testBase32(); void testTotpCode(); }; From 852e89c0df4f7c743ed7bbc214e9f81fccf907f2 Mon Sep 17 00:00:00 2001 From: Josef Vitu <josef@vitu.org> Date: Sun, 24 Sep 2017 11:44:17 +0200 Subject: [PATCH 041/402] Use the emit keyword correctly --- src/gui/CloneDialog.cpp | 2 +- src/gui/csvImport/CsvImportWizard.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/gui/CloneDialog.cpp b/src/gui/CloneDialog.cpp index 5985e26a8..7af504395 100644 --- a/src/gui/CloneDialog.cpp +++ b/src/gui/CloneDialog.cpp @@ -63,7 +63,7 @@ void CloneDialog::cloneEntry() Entry* entry = m_entry->clone(flags); entry->setGroup(m_entry->group()); - emit m_parent->refreshSearch(); + m_parent->refreshSearch(); close(); } diff --git a/src/gui/csvImport/CsvImportWizard.cpp b/src/gui/csvImport/CsvImportWizard.cpp index 06ee23110..eb4b21236 100644 --- a/src/gui/csvImport/CsvImportWizard.cpp +++ b/src/gui/csvImport/CsvImportWizard.cpp @@ -56,7 +56,7 @@ void CsvImportWizard::load(const QString& filename, Database* database) void CsvImportWizard::keyFinished(bool accepted) { if (!accepted) { - emit(importFinished(false)); + emit importFinished(false); return; } @@ -68,11 +68,11 @@ void CsvImportWizard::keyFinished(bool accepted) if (!result) { MessageBox::critical(this, tr("Error"), tr("Unable to calculate master key")); - emit(importFinished(false)); + emit importFinished(false); } } void CsvImportWizard::parseFinished(bool accepted) { - emit(importFinished(accepted)); + emit importFinished(accepted); } From be312bbe4f7115d411893a07cf546b7eff9c65c1 Mon Sep 17 00:00:00 2001 From: Josef Vitu <josef@vitu.org> Date: Sun, 24 Sep 2017 11:45:58 +0200 Subject: [PATCH 042/402] Prevent unnecessary memory allocations --- src/core/Database.cpp | 2 +- src/core/EntryAttachments.cpp | 2 +- src/core/EntryAttributes.cpp | 2 +- src/format/KeePass2XmlWriter.cpp | 6 +++--- src/gui/AboutDialog.cpp | 14 +++++++------- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/core/Database.cpp b/src/core/Database.cpp index 4eb02ad1d..82b928219 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -418,7 +418,7 @@ Database* Database::unlockFromStdin(QString databaseFilename, QString keyFilenam FileKey fileKey; QString errorMessage; if (!fileKey.load(keyFilename, &errorMessage)) { - errorTextStream << QObject::tr("Failed to load key file %1 : %2").arg(keyFilename).arg(errorMessage); + errorTextStream << QObject::tr("Failed to load key file %1 : %2").arg(keyFilename, errorMessage); errorTextStream << endl; return nullptr; } diff --git a/src/core/EntryAttachments.cpp b/src/core/EntryAttachments.cpp index a53a3c997..d700ed443 100644 --- a/src/core/EntryAttachments.cpp +++ b/src/core/EntryAttachments.cpp @@ -29,7 +29,7 @@ QList<QString> EntryAttachments::keys() const bool EntryAttachments::hasKey(const QString& key) const { - return m_attachments.keys().contains(key); + return m_attachments.contains(key); } QList<QByteArray> EntryAttachments::values() const diff --git a/src/core/EntryAttributes.cpp b/src/core/EntryAttributes.cpp index a5143aa04..8ffdaa8f5 100644 --- a/src/core/EntryAttributes.cpp +++ b/src/core/EntryAttributes.cpp @@ -41,7 +41,7 @@ QList<QString> EntryAttributes::keys() const bool EntryAttributes::hasKey(const QString& key) const { - return m_attributes.keys().contains(key); + return m_attributes.contains(key); } QList<QString> EntryAttributes::customKeys() diff --git a/src/format/KeePass2XmlWriter.cpp b/src/format/KeePass2XmlWriter.cpp index f8dfa1581..8f1d9231d 100644 --- a/src/format/KeePass2XmlWriter.cpp +++ b/src/format/KeePass2XmlWriter.cpp @@ -521,9 +521,9 @@ void KeePass2XmlWriter::writeColor(const QString& qualifiedName, const QColor& c QString colorStr; if (color.isValid()) { - colorStr = QString("#%1%2%3").arg(colorPartToString(color.red())) - .arg(colorPartToString(color.green())) - .arg(colorPartToString(color.blue())); + colorStr = QString("#%1%2%3").arg(colorPartToString(color.red()), + colorPartToString(color.green()), + colorPartToString(color.blue())); } writeString(qualifiedName, colorStr); diff --git a/src/gui/AboutDialog.cpp b/src/gui/AboutDialog.cpp index 0e0f2960a..7cbd648ec 100644 --- a/src/gui/AboutDialog.cpp +++ b/src/gui/AboutDialog.cpp @@ -59,16 +59,16 @@ AboutDialog::AboutDialog(QWidget* parent) } debugInfo.append(QString("%1\n- Qt %2\n- %3\n\n") - .arg(tr("Libraries:")) - .arg(QString::fromLocal8Bit(qVersion())) - .arg(Crypto::backendVersion())); + .arg(tr("Libraries:"), + QString::fromLocal8Bit(qVersion()), + Crypto::backendVersion())); #if QT_VERSION >= QT_VERSION_CHECK(5, 4, 0) debugInfo.append(tr("Operating system: %1\nCPU architecture: %2\nKernel: %3 %4") - .arg(QSysInfo::prettyProductName()) - .arg(QSysInfo::currentCpuArchitecture()) - .arg(QSysInfo::kernelType()) - .arg(QSysInfo::kernelVersion())); + .arg(QSysInfo::prettyProductName(), + QSysInfo::currentCpuArchitecture(), + QSysInfo::kernelType(), + QSysInfo::kernelVersion())); debugInfo.append("\n\n"); #endif From 2481367ab4fb5de4b806d2c5d01e1ace13e131b4 Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Wed, 4 Oct 2017 19:17:34 +0300 Subject: [PATCH 043/402] Fix memory leak in DatabaseTabWidget::openDatabase function --- src/gui/DatabaseTabWidget.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp index 9dca1ac06..df0e1a1da 100644 --- a/src/gui/DatabaseTabWidget.cpp +++ b/src/gui/DatabaseTabWidget.cpp @@ -181,6 +181,7 @@ void DatabaseTabWidget::openDatabase(const QString& fileName, const QString& pw, lockFile->tryLock(); } } else { + delete lockFile; return; } } From 8a8eecbe8bbfe6a86c26128c5e62b2c308ea9a3f Mon Sep 17 00:00:00 2001 From: Weslly <weslly.honorato@gmail.com> Date: Fri, 6 Oct 2017 00:15:23 -0300 Subject: [PATCH 044/402] Fix macOS man path --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 976b32937..b0abafa11 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -178,6 +178,7 @@ endif() if(APPLE AND WITH_APP_BUNDLE AND "${CMAKE_INSTALL_PREFIX}" STREQUAL "/usr/local") set(CMAKE_INSTALL_PREFIX "/Applications") + set(CMAKE_INSTALL_MANDIR "/usr/local/share/man") endif() if(MINGW) From 242faa138b68a1f1403d49cdff0487ca911a0fd8 Mon Sep 17 00:00:00 2001 From: louib <louib@users.noreply.github.com> Date: Sat, 7 Oct 2017 10:40:29 -0400 Subject: [PATCH 045/402] Add custom icons when merging. (#1008) * Adding missing custom icons on merge. * qDebug when adding icon * Adding test for merge custom icons. --- src/core/Database.cpp | 9 +++++++++ src/core/Metadata.cpp | 11 ----------- src/core/Metadata.h | 3 --- src/format/KeePass2XmlReader.cpp | 3 --- src/format/KeePass2XmlWriter.cpp | 1 - tests/TestMerge.cpp | 23 +++++++++++++++++++++++ tests/TestMerge.h | 1 + 7 files changed, 33 insertions(+), 18 deletions(-) diff --git a/src/core/Database.cpp b/src/core/Database.cpp index 82b928219..924eec067 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -331,6 +331,15 @@ void Database::emptyRecycleBin() void Database::merge(const Database* other) { m_rootGroup->merge(other->rootGroup()); + + for (Uuid customIconId : other->metadata()->customIcons().keys()) { + QImage customIcon = other->metadata()->customIcon(customIconId); + if (!this->metadata()->containsCustomIcon(customIconId)) { + qDebug("Adding custom icon %s to database.", qPrintable(customIconId.toHex())); + this->metadata()->addCustomIcon(customIconId, customIcon); + } + } + emit modified(); } diff --git a/src/core/Metadata.cpp b/src/core/Metadata.cpp index eb976d0e5..9fd0ce02f 100644 --- a/src/core/Metadata.cpp +++ b/src/core/Metadata.cpp @@ -41,7 +41,6 @@ Metadata::Metadata(QObject* parent) m_data.protectPassword = true; m_data.protectUrl = false; m_data.protectNotes = false; - // m_data.autoEnableVisualHiding = false; QDateTime now = QDateTime::currentDateTimeUtc(); m_data.nameChanged = now; @@ -158,11 +157,6 @@ bool Metadata::protectNotes() const return m_data.protectNotes; } -/*bool Metadata::autoEnableVisualHiding() const -{ - return m_autoEnableVisualHiding; -}*/ - QImage Metadata::customIcon(const Uuid& uuid) const { return m_customIcons.value(uuid); @@ -376,11 +370,6 @@ void Metadata::setProtectNotes(bool value) set(m_data.protectNotes, value); } -/*void Metadata::setAutoEnableVisualHiding(bool value) -{ - set(m_autoEnableVisualHiding, value); -}*/ - void Metadata::addCustomIcon(const Uuid& uuid, const QImage& icon) { Q_ASSERT(!uuid.isNull()); diff --git a/src/core/Metadata.h b/src/core/Metadata.h index 2104868c2..1e972fd5a 100644 --- a/src/core/Metadata.h +++ b/src/core/Metadata.h @@ -60,7 +60,6 @@ public: bool protectPassword; bool protectUrl; bool protectNotes; - // bool autoEnableVisualHiding; }; QString generator() const; @@ -77,7 +76,6 @@ public: bool protectPassword() const; bool protectUrl() const; bool protectNotes() const; - // bool autoEnableVisualHiding() const; QImage customIcon(const Uuid& uuid) const; QPixmap customIconPixmap(const Uuid& uuid) const; QPixmap customIconScaledPixmap(const Uuid& uuid) const; @@ -117,7 +115,6 @@ public: void setProtectPassword(bool value); void setProtectUrl(bool value); void setProtectNotes(bool value); - // void setAutoEnableVisualHiding(bool value); void addCustomIcon(const Uuid& uuid, const QImage& icon); void addCustomIconScaled(const Uuid& uuid, const QImage& icon); void removeCustomIcon(const Uuid& uuid); diff --git a/src/format/KeePass2XmlReader.cpp b/src/format/KeePass2XmlReader.cpp index e4ceb1762..de7ca6d79 100644 --- a/src/format/KeePass2XmlReader.cpp +++ b/src/format/KeePass2XmlReader.cpp @@ -323,9 +323,6 @@ void KeePass2XmlReader::parseMemoryProtection() else if (m_xml.name() == "ProtectNotes") { m_meta->setProtectNotes(readBool()); } - /*else if (m_xml.name() == "AutoEnableVisualHiding") { - m_meta->setAutoEnableVisualHiding(readBool()); - }*/ else { skipCurrentElement(); } diff --git a/src/format/KeePass2XmlWriter.cpp b/src/format/KeePass2XmlWriter.cpp index 8f1d9231d..fa67ece93 100644 --- a/src/format/KeePass2XmlWriter.cpp +++ b/src/format/KeePass2XmlWriter.cpp @@ -141,7 +141,6 @@ void KeePass2XmlWriter::writeMemoryProtection() writeBool("ProtectPassword", m_meta->protectPassword()); writeBool("ProtectURL", m_meta->protectUrl()); writeBool("ProtectNotes", m_meta->protectNotes()); - // writeBool("AutoEnableVisualHiding", m_meta->autoEnableVisualHiding()); m_xml.writeEndElement(); } diff --git a/tests/TestMerge.cpp b/tests/TestMerge.cpp index 48f228b41..c8f15f29b 100644 --- a/tests/TestMerge.cpp +++ b/tests/TestMerge.cpp @@ -420,6 +420,29 @@ void TestMerge::testMergeAndSync() delete dbSource; } +/** + * Custom icons should be brought over when merging. + */ +void TestMerge::testMergeCustomIcons() +{ + Database* dbDestination = new Database(); + Database* dbSource = createTestDatabase(); + + Uuid customIconId = Uuid::random(); + QImage customIcon; + + dbSource->metadata()->addCustomIcon(customIconId, customIcon); + // Sanity check. + QVERIFY(dbSource->metadata()->containsCustomIcon(customIconId)); + + dbDestination->merge(dbSource); + + QVERIFY(dbDestination->metadata()->containsCustomIcon(customIconId)); + + delete dbDestination; + delete dbSource; +} + Database* TestMerge::createTestDatabase() { Database* db = new Database(); diff --git a/tests/TestMerge.h b/tests/TestMerge.h index bfb18c305..0b3ec618e 100644 --- a/tests/TestMerge.h +++ b/tests/TestMerge.h @@ -38,6 +38,7 @@ private slots: void testCreateNewGroups(); void testUpdateEntryDifferentLocation(); void testMergeAndSync(); + void testMergeCustomIcons(); private: Database* createTestDatabase(); From 6d569a86f9f7d86bc8672a7f9364cc4c525c26c0 Mon Sep 17 00:00:00 2001 From: Bernhard Rieder <bernhard.rieder@eguana.at> Date: Mon, 9 Oct 2017 13:26:24 +0200 Subject: [PATCH 046/402] added autoopen functionality (#477) --- src/gui/DatabaseTabWidget.cpp | 41 ++++++++++++++++++++++++++++++++++- src/gui/DatabaseWidget.cpp | 15 ++++++++++--- 2 files changed, 52 insertions(+), 4 deletions(-) diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp index df0e1a1da..b443aba10 100644 --- a/src/gui/DatabaseTabWidget.cpp +++ b/src/gui/DatabaseTabWidget.cpp @@ -129,7 +129,13 @@ void DatabaseTabWidget::openDatabase(const QString& fileName, const QString& pw, while (i.hasNext()) { i.next(); if (i.value().canonicalFilePath == canonicalFilePath) { - setCurrentIndex(databaseIndex(i.key())); + if (pw.isEmpty() && keyFile.isEmpty()) { + setCurrentIndex(databaseIndex(i.key())); + } else { + if (!i.key()->hasKey()) { + i.value().dbWidget->switchToOpenDatabase(canonicalFilePath, pw, keyFile); + } + } return; } } @@ -607,6 +613,39 @@ void DatabaseTabWidget::updateTabNameFromDbWidgetSender() DatabaseWidget* dbWidget = static_cast<DatabaseWidget*>(sender()); updateTabName(databaseFromDatabaseWidget(dbWidget)); + + Database* db = dbWidget->database(); + Group *autoload = db->rootGroup()->findChildByName("AutoOpen"); + if (autoload) + { + const DatabaseManagerStruct& dbStruct = m_dbList.value(db); + QFileInfo dbpath(dbStruct.canonicalFilePath); + QDir dbFolder(dbpath.canonicalPath()); + + for (auto entry : autoload->entries()) { + + if (entry->url().isEmpty() || entry->password().isEmpty()) + continue; + + QFileInfo filepath; + if (entry->url().startsWith("file:/")) { + QUrl url(entry->url()); + filepath.setFile(url.toLocalFile()); + } + else { + filepath.setFile(entry->url()); + if (filepath.isRelative()) { + filepath.setFile(dbFolder, entry->url()); + } + } + + if (!filepath.isFile()) + continue; + + openDatabase(filepath.canonicalFilePath(), entry->password(), ""); + + } + } } int DatabaseTabWidget::databaseIndex(Database* db) diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 3a39bddcf..e5693e4f9 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -897,8 +897,13 @@ void DatabaseWidget::switchToDatabaseSettings() void DatabaseWidget::switchToOpenDatabase(const QString& fileName) { updateFilename(fileName); - m_databaseOpenWidget->load(fileName); - setCurrentWidget(m_databaseOpenWidget); + if (m_databaseOpenWidget) { + m_databaseOpenWidget->load(fileName); + setCurrentWidget(m_databaseOpenWidget); + } else if (m_unlockDatabaseWidget) { + m_unlockDatabaseWidget->load(fileName); + setCurrentWidget(m_unlockDatabaseWidget); + } } void DatabaseWidget::switchToOpenDatabase(const QString& fileName, const QString& password, @@ -906,7 +911,11 @@ void DatabaseWidget::switchToOpenDatabase(const QString& fileName, const QString { updateFilename(fileName); switchToOpenDatabase(fileName); - m_databaseOpenWidget->enterKey(password, keyFile); + if (m_databaseOpenWidget) { + m_databaseOpenWidget->enterKey(password, keyFile); + } else if (m_unlockDatabaseWidget) { + m_unlockDatabaseWidget->enterKey(password, keyFile); + } } void DatabaseWidget::switchToImportCsv(const QString& fileName) From 60215cf2cffb7471c654e8ca2f296f2a8d69feb1 Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Tue, 10 Oct 2017 23:30:40 +0300 Subject: [PATCH 047/402] Add button for auto-type in the toolbar (#1026) --- src/gui/MainWindow.ui | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/MainWindow.ui b/src/gui/MainWindow.ui index 5991077f5..7e88bd9d4 100644 --- a/src/gui/MainWindow.ui +++ b/src/gui/MainWindow.ui @@ -292,6 +292,7 @@ <addaction name="separator"/> <addaction name="actionEntryCopyUsername"/> <addaction name="actionEntryCopyPassword"/> + <addaction name="actionEntryAutoType"/> <addaction name="separator"/> <addaction name="actionPasswordGenerator"/> <addaction name="actionLockDatabases"/> From 24333d0a19e064e3692de9d54822a96c82ad21c3 Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Wed, 11 Oct 2017 17:03:51 +0300 Subject: [PATCH 048/402] Add toolbar button for copy url to clipboard --- .../icons/application/16x16/actions/url-copy.png | Bin 0 -> 900 bytes .../icons/application/22x22/actions/url-copy.png | Bin 0 -> 1338 bytes src/gui/MainWindow.cpp | 1 + src/gui/MainWindow.ui | 10 ++++++++++ 4 files changed, 11 insertions(+) create mode 100644 share/icons/application/16x16/actions/url-copy.png create mode 100644 share/icons/application/22x22/actions/url-copy.png diff --git a/share/icons/application/16x16/actions/url-copy.png b/share/icons/application/16x16/actions/url-copy.png new file mode 100644 index 0000000000000000000000000000000000000000..154d2439e868d1382cdad95e54d3e29ce3a04d21 GIT binary patch literal 900 zcmV-~1AF|5P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00006VoOIv0RI60 z0RN!9r;`8x010qNS#tmY0lNSI0lNV@?Bn79000McNliru;R*{4F*zOm;m!a60})9? zK~y-)Ws^%xoMjY-pKrc@E|dYB7D{IfBe7U4v<*-Y(^%7H)Cxv}Z5mB9v0f52gpIK= zY+P7P?b2xC24mBjG>EC2Ruij@3N_;;X-G<h76_9%0x~LgerEppZ^s24#Bh?c`A(ka zdl%;@R!fDWk9W0o^}W~Ly`#IOWvjYXaQJTQYVPXj`Hym$OJ9L$v9YoMRK-7j;*}Gl zE92Rl;)p4>zaplSlbpLOLzide*}>1{`t=)L-ZZ_uX?mt<dX{Cmz<#5u{)5KeV_VKV z_d<A6Wmsc55ti~<GPxOofgpQ#7}yn2PM#hOyfe^4MMVV)FbqQg6{y(~J}C{$HONl1 zj`OE!F*%pPS_$({UNe*Vn`=LR!B6wEOiX6bTBEf_DFuMBtvPyh(XHo`i72ggKGVOP zCo}T{k#LOVe4eSB3rx>mqiN^EoEiR-ecgLd@Si|e|D}KY<^<Urz2qNy6R##kZgVB+ z@889?mN6=->3VE{cx@fOeR~BR2%wZI3sk`KN`&ft<`&Pf@W%v3G(mIcVYc1dj8RwM zz@x|6+u1{BYX>0(T5AHgB>;xKurl9ps42cDag6${_hVY1ZD`!SpW6BwQXPGyC*Nm2 zBP8QhYhXEny0huY7kdVe3_bF|5f*PnC_3N+L1j}F@d;6+^X>?z-agB#hdb!LucN#J zzScTrWT$^UH+ymZnR|MjgDtfYmJ1%PuLuQ#M8k^hwGl3SJx!#zNJsnbwFDxvnq*bB zIdS07%OibHAKa(fEUIG$m1+}pxx4sm<TAGTJEz|2Cl-q#B6yw$;0J@jlsXD}1iVBd z(K|eH;o^s<hnZVi!gCyUH^h1A`KM@a+eIi8VrpuNd_GU9RN{_U%-z-6`rz79CzHuk zsZ^3ep&+GFNgT%!*LB77Jn?;BT-TL!IxQk1mQ|F&!8gtVdZVCN+#pzmEEyXclVY(T zuOENyQ^5G&StXOnl<T@;uLH}!i-_2^E#u?kcK<;C5D+YLYMrAINZx)^>*nj*1Fise a8TuD-9)CQ5m<mDw0000<MNUMnLSTZx-=7Eo literal 0 HcmV?d00001 diff --git a/share/icons/application/22x22/actions/url-copy.png b/share/icons/application/22x22/actions/url-copy.png new file mode 100644 index 0000000000000000000000000000000000000000..84eae639f02b0fbf01e38d2f7549fe1463d7544e GIT binary patch literal 1338 zcmV-A1;zS_P)<h;3K|Lk000e1NJLTq000&M000&U1^@s6#I$TX00009a7bBm0007E z0007E0l_d;`Tzg`2XskIMF-&u3k@+UnM0ru00006VoOIv0RI600RN!9r;`8x1jk84 zK~y-)ja6$*TV)u2PJ2!{w3I@*j3KBU7dI|pxNJIxQzq!9VQSF0EOS4`FQblSY-6VC zRB$F{F#&bXxTr&ZxXdMUnhdwN@dE{fb*Kmn%yDNe^g>(O)6>iO{8~!aZg_cf-t?Te z=X>7wdA|4k4ujjqP)}2<)yXX_Ewx!$SzB3_RhdktzUJoUV_jWc^Z0*8sGFFmfGk;? z|ID+`zjNAT=ee9U>Bv}-2$$f;@XZ;RCx`6Y%G9G9Hsm}04b@;UjMdlIzt7$d9bKPY zwCa;bo-5<FKbDRZJ}w;h!$}I!J5r(f^oyRg)9o`ja%d~%$Iy$3p(~Tgpj0a3gO9Ss zVADgJUMOup_T|GXw^fJ`#Ti)L7EH}gVaPa)S@Q^rvZtYcy$JJJx!BuqG6cHhvZW-{ z3AHfr5pDh^-8Vb;E0R_um|?do!Lpf9@hNbMZW!$*Oj_q~ebNY@?N3x!SuvZDi<XbR z4pkU&xjgh6rE5lA+D6a)CaV$gTruL~GHJRv3h2PZEff4Ak3c{Tx4>Y|>cvRE0Zz6X z7k=|$c6Ju>Xz)egP{r)Z)d@Q|x=Dksa-6@RKw&D)wlI#tfh!?uEK7kU3Fdhl3`0Y> z+;s^up2zx9J<gnM$G+G0ghh_koK3nnKHEAs054JC8oL=Y3rdJqAFi}tgh#MY{S*+~ z0xS+YL`I1?&3)iG0+ATeKR6wszohq~#I$0DcXDInXW+Pc62{5xSXX`kn#5cbRJ{w! z+z5I)KY$=o0F@l-L^X<vc0irLA)U{F`O=LTU87AF@OdRZjR%*?V8V0`w~PjO{D3Ms z7rKIN$jn^>K8--3Ww4?AWfT`biNc(G6z7zJ_{Es+V4}MsU}Nmb=~~FO1SRWsA%9gR z7zyxs0m%m>re?zzZ@~kF)p+#58r(9sqkHrOrY44=ikII79MRZ3{71L0s<b*sSBx$B zZ(?4EgFr$3G_RbpEXmtWr4dn<w+AZOJap+Q@IorCU+zbBc~J~l^zpz>+&F(!_xs@| z9^bz@E|*T*>;fRrO8vBILf7b$3b8q-5K20uGGaqb>5J&=e+q9KYO$l~cx2-u2Ss@I z*Z{`6e?9yCiL#9)b)~hyoCR2L10vN~3cf(sDCATUC6JevjGNOE8ud-6f8}YUq@>&h z95vyKrc&3mz1PwuP1^{$=J|^lT%%;rHA6<dCgP=4h}3`Vo+E3w93+j6jYN{9kO$50 z_Y<GbN4#Dy>Fn(Mg~F9Y4k4HG>@NM@KH;Z}FV(8bG>jt0jYKU6#wW);jslEz+R*#+ zIW+98#_rv_Lsi;rwvdaW2nrsGxm>Pb{}DEp!T9OVoA>N&Yx_ZY?b}I=3LZ$39~OQD zl@)98;gQcG^n+4PO-+I0IA}DQh`y&<PYux9v6!BwUb#SxW+j3k5L!uyUXW&xZXghd z&=1CXdwYr1Y7NDlP6uf?eDFJpk$l&%EC(C}SPt0Z@sN&=4ibDf2zua9{RO&S8|mX^ zoA8cZUanVZf>7K`CrST?{`B#WkH1R8wtoU9eSLjb!(V~_G`HK$)$Ob6Y5l78E&6B; wADMUb+v0s@SR*FNqyJ}?SvL^|m7<gW4Wp7%hz^%hcK`qY07*qoM6N<$f+g947ytkO literal 0 HcmV?d00001 diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index ab340e1f3..14531a4f2 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -197,6 +197,7 @@ MainWindow::MainWindow() m_ui->actionEntryAutoType->setIcon(filePath()->icon("actions", "auto-type", false)); m_ui->actionEntryCopyUsername->setIcon(filePath()->icon("actions", "username-copy", false)); m_ui->actionEntryCopyPassword->setIcon(filePath()->icon("actions", "password-copy", false)); + m_ui->actionEntryCopyURL->setIcon(filePath()->icon("actions", "url-copy", false)); m_ui->actionGroupNew->setIcon(filePath()->icon("actions", "group-new", false)); m_ui->actionGroupEdit->setIcon(filePath()->icon("actions", "group-edit", false)); diff --git a/src/gui/MainWindow.ui b/src/gui/MainWindow.ui index 7e88bd9d4..258dd90c8 100644 --- a/src/gui/MainWindow.ui +++ b/src/gui/MainWindow.ui @@ -292,6 +292,7 @@ <addaction name="separator"/> <addaction name="actionEntryCopyUsername"/> <addaction name="actionEntryCopyPassword"/> + <addaction name="actionEntryCopyURL"/> <addaction name="actionEntryAutoType"/> <addaction name="separator"/> <addaction name="actionPasswordGenerator"/> @@ -496,6 +497,9 @@ <property name="text"> <string>&Title</string> </property> + <property name="toolTip"> + <string>Copy title to clipboard</string> + </property> </action> <action name="actionEntryCopyURL"> <property name="enabled"> @@ -504,6 +508,9 @@ <property name="text"> <string>&URL</string> </property> + <property name="toolTip"> + <string>Copy URL to clipboard</string> + </property> </action> <action name="actionEntryCopyNotes"> <property name="enabled"> @@ -512,6 +519,9 @@ <property name="text"> <string>&Notes</string> </property> + <property name="toolTip"> + <string>Copy notes to clipboard</string> + </property> </action> <action name="actionExportCsv"> <property name="enabled"> From 0fc8c37f23d0fa1ee64f718c92afc20c9ff037c9 Mon Sep 17 00:00:00 2001 From: Bernhard Rieder <bernhard.rieder@eguana.at> Date: Thu, 12 Oct 2017 23:30:51 +0200 Subject: [PATCH 049/402] changed file:/ to file:// --- src/gui/DatabaseTabWidget.cpp | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp index b443aba10..67edd130a 100644 --- a/src/gui/DatabaseTabWidget.cpp +++ b/src/gui/DatabaseTabWidget.cpp @@ -90,12 +90,12 @@ void DatabaseTabWidget::newDatabase() Database* db = new Database(); db->rootGroup()->setName(tr("Root")); dbStruct.dbWidget = new DatabaseWidget(db, this); - + CompositeKey emptyKey; db->setKey(emptyKey); insertDatabase(db, dbStruct); - + if (!saveDatabaseAs(db)) { closeDatabase(db); return; @@ -616,19 +616,16 @@ void DatabaseTabWidget::updateTabNameFromDbWidgetSender() Database* db = dbWidget->database(); Group *autoload = db->rootGroup()->findChildByName("AutoOpen"); - if (autoload) - { + if (autoload) { const DatabaseManagerStruct& dbStruct = m_dbList.value(db); QFileInfo dbpath(dbStruct.canonicalFilePath); QDir dbFolder(dbpath.canonicalPath()); - for (auto entry : autoload->entries()) { - - if (entry->url().isEmpty() || entry->password().isEmpty()) + if (entry->url().isEmpty() || entry->password().isEmpty()) { continue; - + } QFileInfo filepath; - if (entry->url().startsWith("file:/")) { + if (entry->url().startsWith("file://")) { QUrl url(entry->url()); filepath.setFile(url.toLocalFile()); } @@ -639,11 +636,11 @@ void DatabaseTabWidget::updateTabNameFromDbWidgetSender() } } - if (!filepath.isFile()) + if (!filepath.isFile()) { continue; + } openDatabase(filepath.canonicalFilePath(), entry->password(), ""); - } } } From 1374c68274b8e93b74027f40c56db3eb5c48ab3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20E=2E=20Garc=C3=ADa?= <adolfo.garcia.cr@gmail.com> Date: Sun, 15 Oct 2017 01:46:09 -0600 Subject: [PATCH 050/402] Add .DS_Store (mac os) to .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 2d9bb4af7..b91b15acf 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,5 @@ release*/ \.vscode/ *.swp + +.DS_Store From 75cfe1c5dd1c23523135d38e751f4cedba5cd0dd Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Wed, 11 Oct 2017 13:10:40 +0300 Subject: [PATCH 051/402] Add the auto hide functionality to the MessageWidget --- src/gui/MessageWidget.cpp | 36 +++++++++++++++++++++++++++++++++--- src/gui/MessageWidget.h | 9 +++++++++ src/http/OptionDialog.cpp | 1 + 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/src/gui/MessageWidget.cpp b/src/gui/MessageWidget.cpp index de981b92a..b3d014c33 100644 --- a/src/gui/MessageWidget.cpp +++ b/src/gui/MessageWidget.cpp @@ -18,20 +18,50 @@ #include "MessageWidget.h" -MessageWidget::MessageWidget(QWidget* parent) - :KMessageWidget(parent) -{ +#include "QTimer" +MessageWidget::MessageWidget(QWidget* parent) + : KMessageWidget(parent) + , m_autoHideTimer(new QTimer(this)) + , m_autoHideTimeout(6000) +{ + m_autoHideTimer->setSingleShot(true); + connect(m_autoHideTimer, SIGNAL(timeout()), this, SLOT(animatedHide())); + connect(this, SIGNAL(hideAnimationFinished()), m_autoHideTimer, SLOT(stop())); +} + +int MessageWidget::autoHideTimeout() const +{ + return m_autoHideTimeout; } void MessageWidget::showMessage(const QString& text, MessageWidget::MessageType type) +{ + showMessage(text, type, m_autoHideTimeout); +} + +void MessageWidget::showMessage(const QString &text, KMessageWidget::MessageType type, int autoHideTimeout) { setMessageType(type); setText(text); animatedShow(); + if (autoHideTimeout > 0) { + m_autoHideTimer->start(autoHideTimeout); + } else { + m_autoHideTimer->stop(); + } } void MessageWidget::hideMessage() { animatedHide(); + m_autoHideTimer->stop(); +} + +void MessageWidget::setAutoHideTimeout(int autoHideTimeout) +{ + m_autoHideTimeout = autoHideTimeout; + if (autoHideTimeout <= 0) { + m_autoHideTimer->stop(); + } } diff --git a/src/gui/MessageWidget.h b/src/gui/MessageWidget.h index 03ebee3eb..4a25737b1 100644 --- a/src/gui/MessageWidget.h +++ b/src/gui/MessageWidget.h @@ -21,6 +21,8 @@ #include "gui/KMessageWidget.h" +class QTimer; + class MessageWidget : public KMessageWidget { Q_OBJECT @@ -28,10 +30,17 @@ class MessageWidget : public KMessageWidget public: explicit MessageWidget(QWidget* parent = 0); + int autoHideTimeout() const; + public slots: void showMessage(const QString& text, MessageWidget::MessageType type); + void showMessage(const QString& text, MessageWidget::MessageType type, int autoHideTimeout); void hideMessage(); + void setAutoHideTimeout(int autoHideTimeout); +private: + QTimer* m_autoHideTimer; + int m_autoHideTimeout; }; #endif // MESSAGEWIDGET_H diff --git a/src/http/OptionDialog.cpp b/src/http/OptionDialog.cpp index 9fb66bd6f..b0823c7b4 100644 --- a/src/http/OptionDialog.cpp +++ b/src/http/OptionDialog.cpp @@ -35,6 +35,7 @@ OptionDialog::OptionDialog(QWidget *parent) : m_ui->warningWidget->showMessage(tr("The following options can be dangerous!\nChange them only if you know what you are doing."), MessageWidget::Warning); m_ui->warningWidget->setIcon(FilePath::instance()->icon("status", "dialog-warning")); m_ui->warningWidget->setCloseButtonVisible(false); + m_ui->warningWidget->setAutoHideTimeout(-1); m_ui->tabWidget->setEnabled(m_ui->enableHttpServer->isChecked()); connect(m_ui->enableHttpServer, SIGNAL(toggled(bool)), m_ui->tabWidget, SLOT(setEnabled(bool))); From f38fe5a9dda5f17393373c67c0c4735ad578c95d Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Thu, 19 Oct 2017 21:46:09 +0300 Subject: [PATCH 052/402] Disable automatic hiding of an information message for YubiKey --- src/gui/DatabaseWidget.cpp | 5 +++-- src/gui/DatabaseWidget.h | 3 ++- src/gui/MainWindow.cpp | 14 ++++++++------ src/gui/MainWindow.h | 6 ++++-- src/gui/MessageWidget.cpp | 5 ++++- src/gui/MessageWidget.h | 3 +++ src/http/OptionDialog.cpp | 2 +- 7 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 3a39bddcf..7fbcbe35c 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -1325,9 +1325,10 @@ void DatabaseWidget::closeUnlockDialog() m_unlockDatabaseDialog->close(); } -void DatabaseWidget::showMessage(const QString& text, MessageWidget::MessageType type) +void DatabaseWidget::showMessage(const QString& text, MessageWidget::MessageType type, bool showClosebutton, int autoHideTimeout) { - m_messageWidget->showMessage(text, type); + m_messageWidget->setCloseButtonVisible(showClosebutton); + m_messageWidget->showMessage(text, type, autoHideTimeout); } void DatabaseWidget::hideMessage() diff --git a/src/gui/DatabaseWidget.h b/src/gui/DatabaseWidget.h index 734e979e7..934820009 100644 --- a/src/gui/DatabaseWidget.h +++ b/src/gui/DatabaseWidget.h @@ -166,7 +166,8 @@ public slots: void setSearchLimitGroup(bool state); void endSearch(); - void showMessage(const QString& text, MessageWidget::MessageType type); + void showMessage(const QString& text, MessageWidget::MessageType type, bool showClosebutton = true, + int autoHideTimeout = MessageWidget::DefaultAutoHideTimeout); void hideMessage(); private slots: diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 14531a4f2..cfa18597f 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -952,16 +952,17 @@ bool MainWindow::isTrayIconEnabled() const && QSystemTrayIcon::isSystemTrayAvailable(); } -void MainWindow::displayGlobalMessage(const QString& text, MessageWidget::MessageType type, bool showClosebutton) +void MainWindow::displayGlobalMessage(const QString& text, MessageWidget::MessageType type, bool showClosebutton, + int autoHideTimeout) { m_ui->globalMessageWidget->setCloseButtonVisible(showClosebutton); - m_ui->globalMessageWidget->showMessage(text, type); + m_ui->globalMessageWidget->showMessage(text, type, autoHideTimeout); } -void MainWindow::displayTabMessage(const QString& text, MessageWidget::MessageType type, bool showClosebutton) +void MainWindow::displayTabMessage(const QString& text, MessageWidget::MessageType type, bool showClosebutton, + int autoHideTimeout) { - m_ui->globalMessageWidget->setCloseButtonVisible(showClosebutton); - m_ui->tabWidget->currentDatabaseWidget()->showMessage(text, type); + m_ui->tabWidget->currentDatabaseWidget()->showMessage(text, type, showClosebutton, autoHideTimeout); } void MainWindow::hideGlobalMessage() @@ -978,7 +979,8 @@ void MainWindow::hideTabMessage() void MainWindow::showYubiKeyPopup() { - displayGlobalMessage(tr("Please touch the button on your YubiKey!"), MessageWidget::Information, false); + displayGlobalMessage(tr("Please touch the button on your YubiKey!"), MessageWidget::Information, + false, MessageWidget::DisableAutoHide); setEnabled(false); } diff --git a/src/gui/MainWindow.h b/src/gui/MainWindow.h index caf3f5854..ea17107ad 100644 --- a/src/gui/MainWindow.h +++ b/src/gui/MainWindow.h @@ -54,8 +54,10 @@ public slots: void openDatabase(const QString& fileName, const QString& pw = QString(), const QString& keyFile = QString()); void appExit(); - void displayGlobalMessage(const QString& text, MessageWidget::MessageType type, bool showClosebutton = true); - void displayTabMessage(const QString& text, MessageWidget::MessageType type, bool showClosebutton = true); + void displayGlobalMessage(const QString& text, MessageWidget::MessageType type, bool showClosebutton = true, + int autoHideTimeout = MessageWidget::DefaultAutoHideTimeout); + void displayTabMessage(const QString& text, MessageWidget::MessageType type, bool showClosebutton = true, + int autoHideTimeout = MessageWidget::DefaultAutoHideTimeout); void hideGlobalMessage(); void showYubiKeyPopup(); void hideYubiKeyPopup(); diff --git a/src/gui/MessageWidget.cpp b/src/gui/MessageWidget.cpp index b3d014c33..2be298055 100644 --- a/src/gui/MessageWidget.cpp +++ b/src/gui/MessageWidget.cpp @@ -20,10 +20,13 @@ #include "QTimer" +const int MessageWidget::DefaultAutoHideTimeout = 6000; +const int MessageWidget::DisableAutoHide = -1; + MessageWidget::MessageWidget(QWidget* parent) : KMessageWidget(parent) , m_autoHideTimer(new QTimer(this)) - , m_autoHideTimeout(6000) + , m_autoHideTimeout(DefaultAutoHideTimeout) { m_autoHideTimer->setSingleShot(true); connect(m_autoHideTimer, SIGNAL(timeout()), this, SLOT(animatedHide())); diff --git a/src/gui/MessageWidget.h b/src/gui/MessageWidget.h index 4a25737b1..c29c320bf 100644 --- a/src/gui/MessageWidget.h +++ b/src/gui/MessageWidget.h @@ -32,6 +32,9 @@ public: int autoHideTimeout() const; + static const int DefaultAutoHideTimeout; + static const int DisableAutoHide; + public slots: void showMessage(const QString& text, MessageWidget::MessageType type); void showMessage(const QString& text, MessageWidget::MessageType type, int autoHideTimeout); diff --git a/src/http/OptionDialog.cpp b/src/http/OptionDialog.cpp index b0823c7b4..03ae6e9ce 100644 --- a/src/http/OptionDialog.cpp +++ b/src/http/OptionDialog.cpp @@ -35,7 +35,7 @@ OptionDialog::OptionDialog(QWidget *parent) : m_ui->warningWidget->showMessage(tr("The following options can be dangerous!\nChange them only if you know what you are doing."), MessageWidget::Warning); m_ui->warningWidget->setIcon(FilePath::instance()->icon("status", "dialog-warning")); m_ui->warningWidget->setCloseButtonVisible(false); - m_ui->warningWidget->setAutoHideTimeout(-1); + m_ui->warningWidget->setAutoHideTimeout(MessageWidget::DisableAutoHide); m_ui->tabWidget->setEnabled(m_ui->enableHttpServer->isChecked()); connect(m_ui->enableHttpServer, SIGNAL(toggled(bool)), m_ui->tabWidget, SLOT(setEnabled(bool))); From 5e0df62d7adc951aa05bdb064eddd23f50ab87be Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Sat, 14 Oct 2017 15:41:45 +0300 Subject: [PATCH 053/402] Add processing of the url placeholders --- src/core/Entry.cpp | 92 ++++++++++++++++++++++++++++++++++++++------- src/core/Entry.h | 17 +++++++++ tests/TestEntry.cpp | 32 ++++++++++++++++ tests/TestEntry.h | 1 + 4 files changed, 128 insertions(+), 14 deletions(-) diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index 464628dc2..867e68eab 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -755,23 +755,28 @@ QString Entry::resolvePlaceholder(const QString& str) const { QString result = str; - const QList<QString> keyList = attributes()->keys(); - for (const QString& key : keyList) { - Qt::CaseSensitivity cs = Qt::CaseInsensitive; - QString k = key; + const UrlPlaceholderType placeholderType = urlPlaceholderType(str); + if (placeholderType != UrlPlaceholderType::NotUrl) { + return resolveUrlPlaceholder(url(), placeholderType); + } else { + const QList<QString> keyList = attributes()->keys(); + for (const QString& key : keyList) { + Qt::CaseSensitivity cs = Qt::CaseInsensitive; + QString k = key; - if (!EntryAttributes::isDefaultAttribute(key)) { - cs = Qt::CaseSensitive; - k.prepend("{S:"); - } else { - k.prepend("{"); - } + if (!EntryAttributes::isDefaultAttribute(key)) { + cs = Qt::CaseSensitive; + k.prepend("{S:"); + } else { + k.prepend("{"); + } - k.append("}"); - if (result.compare(k,cs)==0) { - result.replace(result,attributes()->value(key)); - break; + k.append("}"); + if (result.compare(k,cs)==0) { + result.replace(result,attributes()->value(key)); + break; + } } } @@ -829,3 +834,62 @@ QString Entry::resolveUrl(const QString& url) const // No valid http URL's found return QString(""); } + +QString Entry::resolveUrlPlaceholder(const QString &strUrl, Entry::UrlPlaceholderType placeholderType) const +{ + QUrl qurl(strUrl); + if (!qurl.isValid()) + return QString(); + + switch (placeholderType) { + case UrlPlaceholderType::FullUrl: + return strUrl; + case UrlPlaceholderType::WithoutScheme: + return qurl.toString(QUrl::RemoveScheme | QUrl::FullyDecoded); + case UrlPlaceholderType::Scheme: + return qurl.scheme(); + case UrlPlaceholderType::Host: + return qurl.host(); + case UrlPlaceholderType::Port: + return QString::number(qurl.port()); + case UrlPlaceholderType::Path: + return qurl.path(); + case UrlPlaceholderType::Query: + return qurl.query(); + case UrlPlaceholderType::Fragment: + return qurl.fragment(); + case UrlPlaceholderType::UserInfo: + return qurl.userInfo(); + case UrlPlaceholderType::UserName: + return qurl.userName(); + case UrlPlaceholderType::Password: + return qurl.password(); + default: + Q_ASSERT(false); + break; + } + + return QString(); +} + +Entry::UrlPlaceholderType Entry::urlPlaceholderType(const QString &placeholder) const +{ + static const QMap<QString, UrlPlaceholderType> urlPlaceholders { + { QStringLiteral("{URL}"), UrlPlaceholderType::FullUrl }, + { QStringLiteral("{URL:RMVSCM}"), UrlPlaceholderType::WithoutScheme }, + { QStringLiteral("{URL:WITHOUTSCHEME}"), UrlPlaceholderType::WithoutScheme }, + { QStringLiteral("{URL:SCM}"), UrlPlaceholderType::Scheme }, + { QStringLiteral("{URL:SCHEME}"), UrlPlaceholderType::Scheme }, + { QStringLiteral("{URL:HOST}"), UrlPlaceholderType::Host }, + { QStringLiteral("{URL:PORT}"), UrlPlaceholderType::Port }, + { QStringLiteral("{URL:PATH}"), UrlPlaceholderType::Path }, + { QStringLiteral("{URL:QUERY}"), UrlPlaceholderType::Query }, + { QStringLiteral("{URL:FRAGMENT}"), UrlPlaceholderType::Fragment }, + { QStringLiteral("{URL:USERINFO}"), UrlPlaceholderType::UserInfo }, + { QStringLiteral("{URL:USERNAME}"), UrlPlaceholderType::UserName }, + { QStringLiteral("{URL:PASSWORD}"), UrlPlaceholderType::Password } + }; + + UrlPlaceholderType result = urlPlaceholders.value(placeholder.toUpper(), UrlPlaceholderType::NotUrl); + return result; +} diff --git a/src/core/Entry.h b/src/core/Entry.h index a37637c27..51208c9e3 100644 --- a/src/core/Entry.h +++ b/src/core/Entry.h @@ -134,6 +134,21 @@ public: }; Q_DECLARE_FLAGS(CloneFlags, CloneFlag) + enum class UrlPlaceholderType { + NotUrl, + FullUrl, + WithoutScheme, + Scheme, + Host, + Port, + Path, + Query, + Fragment, + UserInfo, + UserName, + Password, + }; + /** * Creates a duplicate of this entry except that the returned entry isn't * part of any group. @@ -145,6 +160,8 @@ public: QString maskPasswordPlaceholders(const QString& str) const; QString resolveMultiplePlaceholders(const QString& str) const; QString resolvePlaceholder(const QString& str) const; + QString resolveUrlPlaceholder(const QString& url, UrlPlaceholderType placeholderType) const; + UrlPlaceholderType urlPlaceholderType(const QString& placeholder) const; QString resolveUrl(const QString& url) const; /** diff --git a/tests/TestEntry.cpp b/tests/TestEntry.cpp index 84ad03181..056dbc931 100644 --- a/tests/TestEntry.cpp +++ b/tests/TestEntry.cpp @@ -158,3 +158,35 @@ void TestEntry::testResolveUrl() delete entry; } + +void TestEntry::testResolveUrlPlaceholders() +{ + Entry* entry = new Entry(); + entry->setUrl("https://user:pw@keepassxc.org:80/path/example.php?q=e&s=t+2#fragment"); + + QString rmvscm("//user:pw@keepassxc.org:80/path/example.php?q=e&s=t+2#fragment"); // Entry URL without scheme name. + QString scm("https"); // Scheme name of the entry URL. + QString host("keepassxc.org"); // Host component of the entry URL. + QString port("80"); // Port number of the entry URL. + QString path("/path/example.php"); // Path component of the entry URL. + QString query("q=e&s=t+2"); // Query information of the entry URL. + QString userinfo("user:pw"); // User information of the entry URL. + QString username("user"); // User name of the entry URL. + QString password("pw"); // Password of the entry URL. + QString fragment("fragment"); // Password of the entry URL. + + QCOMPARE(entry->resolvePlaceholder("{URL:RMVSCM}"), rmvscm); + QCOMPARE(entry->resolvePlaceholder("{URL:WITHOUTSCHEME}"), rmvscm); + QCOMPARE(entry->resolvePlaceholder("{URL:SCM}"), scm); + QCOMPARE(entry->resolvePlaceholder("{URL:SCHEME}"), scm); + QCOMPARE(entry->resolvePlaceholder("{URL:HOST}"), host); + QCOMPARE(entry->resolvePlaceholder("{URL:PORT}"), port); + QCOMPARE(entry->resolvePlaceholder("{URL:PATH}"), path); + QCOMPARE(entry->resolvePlaceholder("{URL:QUERY}"), query); + QCOMPARE(entry->resolvePlaceholder("{URL:USERINFO}"), userinfo); + QCOMPARE(entry->resolvePlaceholder("{URL:USERNAME}"), username); + QCOMPARE(entry->resolvePlaceholder("{URL:PASSWORD}"), password); + QCOMPARE(entry->resolvePlaceholder("{URL:FRAGMENT}"), fragment); + + delete entry; +} diff --git a/tests/TestEntry.h b/tests/TestEntry.h index 3f6d20ee3..febdf0855 100644 --- a/tests/TestEntry.h +++ b/tests/TestEntry.h @@ -32,6 +32,7 @@ private slots: void testCopyDataFrom(); void testClone(); void testResolveUrl(); + void testResolveUrlPlaceholders(); }; #endif // KEEPASSX_TESTENTRY_H From e81d8beb191eab920f165fa4086779915490e77a Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Sat, 14 Oct 2017 19:23:22 +0300 Subject: [PATCH 054/402] Refactor Entry::resolvePlaceholder function --- src/core/Entry.cpp | 229 +++++++++++++++++++++++++-------------------- src/core/Entry.h | 34 ++++--- 2 files changed, 149 insertions(+), 114 deletions(-) diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index 867e68eab..1a1dff02a 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -751,56 +751,142 @@ QString Entry::resolveMultiplePlaceholders(const QString& str) const return result; } -QString Entry::resolvePlaceholder(const QString& str) const +QString Entry::resolvePlaceholder(const QString& placeholder) const { - QString result = str; + const PlaceholderType placeholderType = this->placeholderType(placeholder); + switch (placeholderType) { + case PlaceholderType::NotPlaceholder: + return placeholder; + case PlaceholderType::Unknown: + qWarning("Can't resolve placeholder '%s' for entry with uuid %s", qPrintable(placeholder), + qPrintable(uuid().toHex())); + return placeholder; + case PlaceholderType::Title: + return title(); + case PlaceholderType::UserName: + return username(); + case PlaceholderType::Password: + return password(); + case PlaceholderType::Notes: + return notes(); + case PlaceholderType::Totp: + return totp(); + case PlaceholderType::Url: + case PlaceholderType::UrlWithoutScheme: + case PlaceholderType::UrlScheme: + case PlaceholderType::UrlHost: + case PlaceholderType::UrlPort: + case PlaceholderType::UrlPath: + case PlaceholderType::UrlQuery: + case PlaceholderType::UrlFragment: + case PlaceholderType::UrlUserInfo: + case PlaceholderType::UrlUserName: + case PlaceholderType::UrlPassword: + return resolveUrlPlaceholder(placeholderType); + case PlaceholderType::CustomAttribute: { + const QString key = placeholder.mid(3, placeholder.length() - 4); // {S:attribute} => mid(3, len - 4) + return attributes()->hasKey(key) ? attributes()->value(key) : placeholder; + } + case PlaceholderType::Reference: { + // resolving references in format: {REF:<WantedField>@I:<uuid of referenced entry>} + // using format from http://keepass.info/help/base/fieldrefs.html at the time of writing, + // but supporting lookups of standard fields and references by UUID only - const UrlPlaceholderType placeholderType = urlPlaceholderType(str); - if (placeholderType != UrlPlaceholderType::NotUrl) { - return resolveUrlPlaceholder(url(), placeholderType); - } else { - const QList<QString> keyList = attributes()->keys(); - for (const QString& key : keyList) { - Qt::CaseSensitivity cs = Qt::CaseInsensitive; - QString k = key; + QRegExp* tmpRegExp = m_attributes->referenceRegExp(); + if (tmpRegExp->indexIn(placeholder) != -1) { + constexpr int wantedFieldIndex = 1; + constexpr int referencedUuidIndex = 2; + const Uuid referencedUuid(QByteArray::fromHex(tmpRegExp->cap(referencedUuidIndex).toLatin1())); + const Entry* refEntry = m_group->database()->resolveEntry(referencedUuid); + if (refEntry) { + QString result; + const QString wantedField = tmpRegExp->cap(wantedFieldIndex).toLower(); + if (wantedField == "t") result = refEntry->title(); + else if (wantedField == "u") result = refEntry->username(); + else if (wantedField == "p") result = refEntry->password(); + else if (wantedField == "a") result = refEntry->url(); + else if (wantedField == "n") result = refEntry->notes(); - if (!EntryAttributes::isDefaultAttribute(key)) { - cs = Qt::CaseSensitive; - k.prepend("{S:"); - } else { - k.prepend("{"); - } - - - k.append("}"); - if (result.compare(k,cs)==0) { - result.replace(result,attributes()->value(key)); - break; + result = refEntry->resolveMultiplePlaceholders(result); + return result; } } } - - // resolving references in format: {REF:<WantedField>@I:<uuid of referenced entry>} - // using format from http://keepass.info/help/base/fieldrefs.html at the time of writing, - // but supporting lookups of standard fields and references by UUID only - - QRegExp* tmpRegExp = m_attributes->referenceRegExp(); - if (tmpRegExp->indexIn(result) != -1) { - // cap(0) contains the whole reference - // cap(1) contains which field is wanted - // cap(2) contains the uuid of the referenced entry - Entry* tmpRefEntry = m_group->database()->resolveEntry(Uuid(QByteArray::fromHex(tmpRegExp->cap(2).toLatin1()))); - if (tmpRefEntry) { - // entry found, get the relevant field - QString tmpRefField = tmpRegExp->cap(1).toLower(); - if (tmpRefField == "t") result.replace(tmpRegExp->cap(0), tmpRefEntry->title(), Qt::CaseInsensitive); - else if (tmpRefField == "u") result.replace(tmpRegExp->cap(0), tmpRefEntry->username(), Qt::CaseInsensitive); - else if (tmpRefField == "p") result.replace(tmpRegExp->cap(0), tmpRefEntry->password(), Qt::CaseInsensitive); - else if (tmpRefField == "a") result.replace(tmpRegExp->cap(0), tmpRefEntry->url(), Qt::CaseInsensitive); - else if (tmpRefField == "n") result.replace(tmpRegExp->cap(0), tmpRefEntry->notes(), Qt::CaseInsensitive); - } } + return placeholder; +} + +QString Entry::resolveUrlPlaceholder(Entry::PlaceholderType placeholderType) const +{ + const QString urlStr = url(); + if (urlStr.isEmpty()) + return QString(); + + const QUrl qurl(urlStr); + switch (placeholderType) { + case PlaceholderType::Url: + return urlStr; + case PlaceholderType::UrlWithoutScheme: + return qurl.toString(QUrl::RemoveScheme | QUrl::FullyDecoded); + case PlaceholderType::UrlScheme: + return qurl.scheme(); + case PlaceholderType::UrlHost: + return qurl.host(); + case PlaceholderType::UrlPort: + return QString::number(qurl.port()); + case PlaceholderType::UrlPath: + return qurl.path(); + case PlaceholderType::UrlQuery: + return qurl.query(); + case PlaceholderType::UrlFragment: + return qurl.fragment(); + case PlaceholderType::UrlUserInfo: + return qurl.userInfo(); + case PlaceholderType::UrlUserName: + return qurl.userName(); + case PlaceholderType::UrlPassword: + return qurl.password(); + default: + Q_ASSERT(false); + break; + } + + return urlStr; +} + +Entry::PlaceholderType Entry::placeholderType(const QString &placeholder) const +{ + if (!placeholder.startsWith(QLatin1Char('{')) || !placeholder.endsWith(QLatin1Char('}'))) { + return PlaceholderType::NotPlaceholder; + } else if (placeholder.startsWith(QLatin1Literal("{S:"))) { + return PlaceholderType::CustomAttribute; + } else if (placeholder.startsWith(QLatin1Literal("{REF:"))) { + return PlaceholderType::Reference; + } + + static const QMap<QString, PlaceholderType> placeholders { + { QStringLiteral("{TITLE}"), PlaceholderType::Title }, + { QStringLiteral("{USERNAME}"), PlaceholderType::UserName }, + { QStringLiteral("{PASSWORD}"), PlaceholderType::Password }, + { QStringLiteral("{NOTES}"), PlaceholderType::Notes }, + { QStringLiteral("{TOTP}"), PlaceholderType::Totp }, + { QStringLiteral("{URL}"), PlaceholderType::Url }, + { QStringLiteral("{URL:RMVSCM}"), PlaceholderType::UrlWithoutScheme }, + { QStringLiteral("{URL:WITHOUTSCHEME}"), PlaceholderType::UrlWithoutScheme }, + { QStringLiteral("{URL:SCM}"), PlaceholderType::UrlScheme }, + { QStringLiteral("{URL:SCHEME}"), PlaceholderType::UrlScheme }, + { QStringLiteral("{URL:HOST}"), PlaceholderType::UrlHost }, + { QStringLiteral("{URL:PORT}"), PlaceholderType::UrlPort }, + { QStringLiteral("{URL:PATH}"), PlaceholderType::UrlPath }, + { QStringLiteral("{URL:QUERY}"), PlaceholderType::UrlQuery }, + { QStringLiteral("{URL:FRAGMENT}"), PlaceholderType::UrlFragment }, + { QStringLiteral("{URL:USERINFO}"), PlaceholderType::UrlUserInfo }, + { QStringLiteral("{URL:USERNAME}"), PlaceholderType::UrlUserName }, + { QStringLiteral("{URL:PASSWORD}"), PlaceholderType::UrlPassword } + }; + + PlaceholderType result = placeholders.value(placeholder.toUpper(), PlaceholderType::Unknown); return result; } @@ -834,62 +920,3 @@ QString Entry::resolveUrl(const QString& url) const // No valid http URL's found return QString(""); } - -QString Entry::resolveUrlPlaceholder(const QString &strUrl, Entry::UrlPlaceholderType placeholderType) const -{ - QUrl qurl(strUrl); - if (!qurl.isValid()) - return QString(); - - switch (placeholderType) { - case UrlPlaceholderType::FullUrl: - return strUrl; - case UrlPlaceholderType::WithoutScheme: - return qurl.toString(QUrl::RemoveScheme | QUrl::FullyDecoded); - case UrlPlaceholderType::Scheme: - return qurl.scheme(); - case UrlPlaceholderType::Host: - return qurl.host(); - case UrlPlaceholderType::Port: - return QString::number(qurl.port()); - case UrlPlaceholderType::Path: - return qurl.path(); - case UrlPlaceholderType::Query: - return qurl.query(); - case UrlPlaceholderType::Fragment: - return qurl.fragment(); - case UrlPlaceholderType::UserInfo: - return qurl.userInfo(); - case UrlPlaceholderType::UserName: - return qurl.userName(); - case UrlPlaceholderType::Password: - return qurl.password(); - default: - Q_ASSERT(false); - break; - } - - return QString(); -} - -Entry::UrlPlaceholderType Entry::urlPlaceholderType(const QString &placeholder) const -{ - static const QMap<QString, UrlPlaceholderType> urlPlaceholders { - { QStringLiteral("{URL}"), UrlPlaceholderType::FullUrl }, - { QStringLiteral("{URL:RMVSCM}"), UrlPlaceholderType::WithoutScheme }, - { QStringLiteral("{URL:WITHOUTSCHEME}"), UrlPlaceholderType::WithoutScheme }, - { QStringLiteral("{URL:SCM}"), UrlPlaceholderType::Scheme }, - { QStringLiteral("{URL:SCHEME}"), UrlPlaceholderType::Scheme }, - { QStringLiteral("{URL:HOST}"), UrlPlaceholderType::Host }, - { QStringLiteral("{URL:PORT}"), UrlPlaceholderType::Port }, - { QStringLiteral("{URL:PATH}"), UrlPlaceholderType::Path }, - { QStringLiteral("{URL:QUERY}"), UrlPlaceholderType::Query }, - { QStringLiteral("{URL:FRAGMENT}"), UrlPlaceholderType::Fragment }, - { QStringLiteral("{URL:USERINFO}"), UrlPlaceholderType::UserInfo }, - { QStringLiteral("{URL:USERNAME}"), UrlPlaceholderType::UserName }, - { QStringLiteral("{URL:PASSWORD}"), UrlPlaceholderType::Password } - }; - - UrlPlaceholderType result = urlPlaceholders.value(placeholder.toUpper(), UrlPlaceholderType::NotUrl); - return result; -} diff --git a/src/core/Entry.h b/src/core/Entry.h index 51208c9e3..7b7a25088 100644 --- a/src/core/Entry.h +++ b/src/core/Entry.h @@ -134,19 +134,27 @@ public: }; Q_DECLARE_FLAGS(CloneFlags, CloneFlag) - enum class UrlPlaceholderType { - NotUrl, - FullUrl, - WithoutScheme, - Scheme, - Host, - Port, - Path, - Query, - Fragment, - UserInfo, + enum class PlaceholderType { + NotPlaceholder, + Unknown, + Title, UserName, Password, + Notes, + Totp, + Url, + UrlWithoutScheme, + UrlScheme, + UrlHost, + UrlPort, + UrlPath, + UrlQuery, + UrlFragment, + UrlUserInfo, + UrlUserName, + UrlPassword, + Reference, + CustomAttribute }; /** @@ -160,8 +168,8 @@ public: QString maskPasswordPlaceholders(const QString& str) const; QString resolveMultiplePlaceholders(const QString& str) const; QString resolvePlaceholder(const QString& str) const; - QString resolveUrlPlaceholder(const QString& url, UrlPlaceholderType placeholderType) const; - UrlPlaceholderType urlPlaceholderType(const QString& placeholder) const; + QString resolveUrlPlaceholder(PlaceholderType placeholderType) const; + PlaceholderType placeholderType(const QString& placeholder) const; QString resolveUrl(const QString& url) const; /** From f0fcc199156b842e7fc972d4896d451dc1a99fc7 Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Mon, 16 Oct 2017 10:35:40 +0300 Subject: [PATCH 055/402] Implement recursive resolving for placeholders --- src/core/Entry.cpp | 200 +++++++++++++++++++++++++------------------- src/core/Entry.h | 6 +- tests/TestEntry.cpp | 106 +++++++++++++++++++---- tests/TestEntry.h | 1 + 4 files changed, 209 insertions(+), 104 deletions(-) diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index 1a1dff02a..d5afec046 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -26,6 +26,8 @@ #include "totp/totp.h" const int Entry::DefaultIconNumber = 0; +const int Entry::ResolveMaximumDepth = 10; + Entry::Entry() : m_attributes(new EntryAttributes(this)) @@ -670,6 +672,108 @@ void Entry::updateModifiedSinceBegin() m_modifiedSinceBegin = true; } +QString Entry::resolveMultiplePlaceholdersRecursive(const QString &str, int maxDepth) const +{ + if (maxDepth <= 0) { + qWarning("Maximum depth of replacement has been reached. Entry uuid: %s", qPrintable(uuid().toHex())); + return str; + } + + QString result = str; + QRegExp placeholderRegEx("(\\{[^\\}]+\\})", Qt::CaseInsensitive, QRegExp::RegExp2); + placeholderRegEx.setMinimal(true); + int pos = 0; + while ((pos = placeholderRegEx.indexIn(str, pos)) != -1) { + const QString found = placeholderRegEx.cap(1); + result.replace(found, resolvePlaceholderRecursive(found, maxDepth - 1)); + pos += placeholderRegEx.matchedLength(); + } + + if (result != str) { + result = resolveMultiplePlaceholdersRecursive(result, maxDepth - 1); + } + + return result; +} + +QString Entry::resolvePlaceholderRecursive(const QString &placeholder, int maxDepth) const +{ + const PlaceholderType typeOfPlaceholder = placeholderType(placeholder); + switch (typeOfPlaceholder) { + case PlaceholderType::NotPlaceholder: + return placeholder; + case PlaceholderType::Unknown: + qWarning("Can't resolve placeholder %s for entry with uuid %s", qPrintable(placeholder), + qPrintable(uuid().toHex())); + return placeholder; + case PlaceholderType::Title: + return title(); + case PlaceholderType::UserName: + return username(); + case PlaceholderType::Password: + return password(); + case PlaceholderType::Notes: + return notes(); + case PlaceholderType::Totp: + return totp(); + case PlaceholderType::Url: + return url(); + case PlaceholderType::UrlWithoutScheme: + case PlaceholderType::UrlScheme: + case PlaceholderType::UrlHost: + case PlaceholderType::UrlPort: + case PlaceholderType::UrlPath: + case PlaceholderType::UrlQuery: + case PlaceholderType::UrlFragment: + case PlaceholderType::UrlUserInfo: + case PlaceholderType::UrlUserName: + case PlaceholderType::UrlPassword: { + const QString strUrl = resolveMultiplePlaceholdersRecursive(url(), maxDepth - 1); + return resolveUrlPlaceholder(strUrl, typeOfPlaceholder); + } + case PlaceholderType::CustomAttribute: { + const QString key = placeholder.mid(3, placeholder.length() - 4); // {S:attr} => mid(3, len - 4) + return attributes()->hasKey(key) ? attributes()->value(key) : QString(); + } + case PlaceholderType::Reference: { + // resolving references in format: {REF:<WantedField>@I:<uuid of referenced entry>} + // using format from http://keepass.info/help/base/fieldrefs.html at the time of writing, + // but supporting lookups of standard fields and references by UUID only + + QString result; + QRegExp* referenceRegExp = m_attributes->referenceRegExp(); + if (referenceRegExp->indexIn(placeholder) != -1) { + constexpr int wantedFieldIndex = 1; + constexpr int referencedUuidIndex = 2; + const Uuid referencedUuid(QByteArray::fromHex(referenceRegExp->cap(referencedUuidIndex).toLatin1())); + const Entry* refEntry = m_group->database()->resolveEntry(referencedUuid); + if (refEntry) { + const QString wantedField = referenceRegExp->cap(wantedFieldIndex).toLower(); + if (wantedField == "t") { + result = refEntry->title(); + } else if (wantedField == "u") { + result = refEntry->username(); + } else if (wantedField == "p") { + result = refEntry->password(); + } else if (wantedField == "a") { + result = refEntry->url(); + } else if (wantedField == "n") { + result = refEntry->notes(); + } + + // Referencing fields of other entries only works with standard fields, not with custom user strings. + // If you want to reference a custom user string, you need to place a redirection in a standard field + // of the entry with the custom string, using {S:<Name>}, and reference the standard field. + result = refEntry->resolveMultiplePlaceholdersRecursive(result, maxDepth - 1); + } + } + return result; + } + } + + return placeholder; +} + Group* Entry::group() { return m_group; @@ -736,97 +840,21 @@ QString Entry::maskPasswordPlaceholders(const QString &str) const QString Entry::resolveMultiplePlaceholders(const QString& str) const { - QString result = str; - QRegExp tmplRegEx("(\\{.*\\})", Qt::CaseInsensitive, QRegExp::RegExp2); - tmplRegEx.setMinimal(true); - QStringList tmplList; - int pos = 0; - - while ((pos = tmplRegEx.indexIn(str, pos)) != -1) { - QString found = tmplRegEx.cap(1); - result.replace(found,resolvePlaceholder(found)); - pos += tmplRegEx.matchedLength(); - } - - return result; + return resolveMultiplePlaceholdersRecursive(str, ResolveMaximumDepth); } QString Entry::resolvePlaceholder(const QString& placeholder) const { - const PlaceholderType placeholderType = this->placeholderType(placeholder); - switch (placeholderType) { - case PlaceholderType::NotPlaceholder: - return placeholder; - case PlaceholderType::Unknown: - qWarning("Can't resolve placeholder '%s' for entry with uuid %s", qPrintable(placeholder), - qPrintable(uuid().toHex())); - return placeholder; - case PlaceholderType::Title: - return title(); - case PlaceholderType::UserName: - return username(); - case PlaceholderType::Password: - return password(); - case PlaceholderType::Notes: - return notes(); - case PlaceholderType::Totp: - return totp(); - case PlaceholderType::Url: - case PlaceholderType::UrlWithoutScheme: - case PlaceholderType::UrlScheme: - case PlaceholderType::UrlHost: - case PlaceholderType::UrlPort: - case PlaceholderType::UrlPath: - case PlaceholderType::UrlQuery: - case PlaceholderType::UrlFragment: - case PlaceholderType::UrlUserInfo: - case PlaceholderType::UrlUserName: - case PlaceholderType::UrlPassword: - return resolveUrlPlaceholder(placeholderType); - case PlaceholderType::CustomAttribute: { - const QString key = placeholder.mid(3, placeholder.length() - 4); // {S:attribute} => mid(3, len - 4) - return attributes()->hasKey(key) ? attributes()->value(key) : placeholder; - } - case PlaceholderType::Reference: { - // resolving references in format: {REF:<WantedField>@I:<uuid of referenced entry>} - // using format from http://keepass.info/help/base/fieldrefs.html at the time of writing, - // but supporting lookups of standard fields and references by UUID only - - QRegExp* tmpRegExp = m_attributes->referenceRegExp(); - if (tmpRegExp->indexIn(placeholder) != -1) { - constexpr int wantedFieldIndex = 1; - constexpr int referencedUuidIndex = 2; - const Uuid referencedUuid(QByteArray::fromHex(tmpRegExp->cap(referencedUuidIndex).toLatin1())); - const Entry* refEntry = m_group->database()->resolveEntry(referencedUuid); - if (refEntry) { - QString result; - const QString wantedField = tmpRegExp->cap(wantedFieldIndex).toLower(); - if (wantedField == "t") result = refEntry->title(); - else if (wantedField == "u") result = refEntry->username(); - else if (wantedField == "p") result = refEntry->password(); - else if (wantedField == "a") result = refEntry->url(); - else if (wantedField == "n") result = refEntry->notes(); - - result = refEntry->resolveMultiplePlaceholders(result); - return result; - } - } - } - } - - return placeholder; + return resolvePlaceholderRecursive(placeholder, ResolveMaximumDepth); } -QString Entry::resolveUrlPlaceholder(Entry::PlaceholderType placeholderType) const +QString Entry::resolveUrlPlaceholder(const QString &str, Entry::PlaceholderType placeholderType) const { - const QString urlStr = url(); - if (urlStr.isEmpty()) + if (str.isEmpty()) return QString(); - const QUrl qurl(urlStr); + const QUrl qurl(str); switch (placeholderType) { - case PlaceholderType::Url: - return urlStr; case PlaceholderType::UrlWithoutScheme: return qurl.toString(QUrl::RemoveScheme | QUrl::FullyDecoded); case PlaceholderType::UrlScheme: @@ -847,12 +875,13 @@ QString Entry::resolveUrlPlaceholder(Entry::PlaceholderType placeholderType) con return qurl.userName(); case PlaceholderType::UrlPassword: return qurl.password(); - default: - Q_ASSERT(false); + default: { + Q_ASSERT_X(false, "Entry::resolveUrlPlaceholder", "Bad url placeholder type"); break; } + } - return urlStr; + return QString(); } Entry::PlaceholderType Entry::placeholderType(const QString &placeholder) const @@ -886,8 +915,7 @@ Entry::PlaceholderType Entry::placeholderType(const QString &placeholder) const { QStringLiteral("{URL:PASSWORD}"), PlaceholderType::UrlPassword } }; - PlaceholderType result = placeholders.value(placeholder.toUpper(), PlaceholderType::Unknown); - return result; + return placeholders.value(placeholder.toUpper(), PlaceholderType::Unknown); } QString Entry::resolveUrl(const QString& url) const diff --git a/src/core/Entry.h b/src/core/Entry.h index 7b7a25088..212c8668a 100644 --- a/src/core/Entry.h +++ b/src/core/Entry.h @@ -96,6 +96,7 @@ public: const EntryAttachments* attachments() const; static const int DefaultIconNumber; + static const int ResolveMaximumDepth; void setUuid(const Uuid& uuid); void setIcon(int iconNumber); @@ -168,7 +169,7 @@ public: QString maskPasswordPlaceholders(const QString& str) const; QString resolveMultiplePlaceholders(const QString& str) const; QString resolvePlaceholder(const QString& str) const; - QString resolveUrlPlaceholder(PlaceholderType placeholderType) const; + QString resolveUrlPlaceholder(const QString &str, PlaceholderType placeholderType) const; PlaceholderType placeholderType(const QString& placeholder) const; QString resolveUrl(const QString& url) const; @@ -199,6 +200,9 @@ private slots: void updateModifiedSinceBegin(); private: + QString resolveMultiplePlaceholdersRecursive(const QString& str, int maxDepth) const; + QString resolvePlaceholderRecursive(const QString& placeholder, int maxDepth) const; + const Database* database() const; template <class T> bool set(T& property, const T& value); diff --git a/tests/TestEntry.cpp b/tests/TestEntry.cpp index 056dbc931..1e863dbeb 100644 --- a/tests/TestEntry.cpp +++ b/tests/TestEntry.cpp @@ -20,7 +20,9 @@ #include <QTest> +#include "core/Database.h" #include "core/Entry.h" +#include "core/Group.h" #include "crypto/Crypto.h" QTEST_GUILESS_MAIN(TestEntry) @@ -161,8 +163,8 @@ void TestEntry::testResolveUrl() void TestEntry::testResolveUrlPlaceholders() { - Entry* entry = new Entry(); - entry->setUrl("https://user:pw@keepassxc.org:80/path/example.php?q=e&s=t+2#fragment"); + Entry entry; + entry.setUrl("https://user:pw@keepassxc.org:80/path/example.php?q=e&s=t+2#fragment"); QString rmvscm("//user:pw@keepassxc.org:80/path/example.php?q=e&s=t+2#fragment"); // Entry URL without scheme name. QString scm("https"); // Scheme name of the entry URL. @@ -173,20 +175,90 @@ void TestEntry::testResolveUrlPlaceholders() QString userinfo("user:pw"); // User information of the entry URL. QString username("user"); // User name of the entry URL. QString password("pw"); // Password of the entry URL. - QString fragment("fragment"); // Password of the entry URL. + QString fragment("fragment"); // Fragment of the entry URL. - QCOMPARE(entry->resolvePlaceholder("{URL:RMVSCM}"), rmvscm); - QCOMPARE(entry->resolvePlaceholder("{URL:WITHOUTSCHEME}"), rmvscm); - QCOMPARE(entry->resolvePlaceholder("{URL:SCM}"), scm); - QCOMPARE(entry->resolvePlaceholder("{URL:SCHEME}"), scm); - QCOMPARE(entry->resolvePlaceholder("{URL:HOST}"), host); - QCOMPARE(entry->resolvePlaceholder("{URL:PORT}"), port); - QCOMPARE(entry->resolvePlaceholder("{URL:PATH}"), path); - QCOMPARE(entry->resolvePlaceholder("{URL:QUERY}"), query); - QCOMPARE(entry->resolvePlaceholder("{URL:USERINFO}"), userinfo); - QCOMPARE(entry->resolvePlaceholder("{URL:USERNAME}"), username); - QCOMPARE(entry->resolvePlaceholder("{URL:PASSWORD}"), password); - QCOMPARE(entry->resolvePlaceholder("{URL:FRAGMENT}"), fragment); - - delete entry; + QCOMPARE(entry.resolvePlaceholder("{URL:RMVSCM}"), rmvscm); + QCOMPARE(entry.resolvePlaceholder("{URL:WITHOUTSCHEME}"), rmvscm); + QCOMPARE(entry.resolvePlaceholder("{URL:SCM}"), scm); + QCOMPARE(entry.resolvePlaceholder("{URL:SCHEME}"), scm); + QCOMPARE(entry.resolvePlaceholder("{URL:HOST}"), host); + QCOMPARE(entry.resolvePlaceholder("{URL:PORT}"), port); + QCOMPARE(entry.resolvePlaceholder("{URL:PATH}"), path); + QCOMPARE(entry.resolvePlaceholder("{URL:QUERY}"), query); + QCOMPARE(entry.resolvePlaceholder("{URL:USERINFO}"), userinfo); + QCOMPARE(entry.resolvePlaceholder("{URL:USERNAME}"), username); + QCOMPARE(entry.resolvePlaceholder("{URL:PASSWORD}"), password); + QCOMPARE(entry.resolvePlaceholder("{URL:FRAGMENT}"), fragment); +} + +void TestEntry::testResolveRecursivePlaceholders() +{ + Database db; + Group* root = db.rootGroup(); + + Entry* entry1 = new Entry(); + entry1->setGroup(root); + entry1->setUuid(Uuid::random()); + entry1->setTitle("{USERNAME}"); + entry1->setUsername("{PASSWORD}"); + entry1->setPassword("{URL}"); + entry1->setUrl("{S:CustomTitle}"); + entry1->attributes()->set("CustomTitle", "RecursiveValue"); + QCOMPARE(entry1->resolveMultiplePlaceholders(entry1->title()), QString("RecursiveValue")); + + Entry* entry2 = new Entry(); + entry2->setGroup(root); + entry2->setUuid(Uuid::random()); + entry2->setTitle("Entry2Title"); + entry2->setUsername("{S:CustomUserNameAttribute}"); + entry2->setPassword(QString("{REF:P@I:%1}").arg(entry1->uuid().toHex())); + entry2->setUrl("http://{S:IpAddress}:{S:Port}/{S:Uri}"); + entry2->attributes()->set("CustomUserNameAttribute", "CustomUserNameValue"); + entry2->attributes()->set("IpAddress", "127.0.0.1"); + entry2->attributes()->set("Port", "1234"); + entry2->attributes()->set("Uri", "uri/path"); + + Entry* entry3 = new Entry(); + entry3->setGroup(root); + entry3->setUuid(Uuid::random()); + entry3->setTitle(QString("{REF:T@I:%1}").arg(entry2->uuid().toHex())); + entry3->setUsername(QString("{REF:U@I:%1}").arg(entry2->uuid().toHex())); + entry3->setPassword(QString("{REF:P@I:%1}").arg(entry2->uuid().toHex())); + entry3->setUrl(QString("{REF:A@I:%1}").arg(entry2->uuid().toHex())); + + QCOMPARE(entry3->resolveMultiplePlaceholders(entry3->title()), QString("Entry2Title")); + QCOMPARE(entry3->resolveMultiplePlaceholders(entry3->username()), QString("CustomUserNameValue")); + QCOMPARE(entry3->resolveMultiplePlaceholders(entry3->password()), QString("RecursiveValue")); + QCOMPARE(entry3->resolveMultiplePlaceholders(entry3->url()), QString("http://127.0.0.1:1234/uri/path")); + + Entry* entry4 = new Entry(); + entry4->setGroup(root); + entry4->setUuid(Uuid::random()); + entry4->setTitle(QString("{REF:T@I:%1}").arg(entry3->uuid().toHex())); + entry4->setUsername(QString("{REF:U@I:%1}").arg(entry3->uuid().toHex())); + entry4->setPassword(QString("{REF:P@I:%1}").arg(entry3->uuid().toHex())); + entry4->setUrl(QString("{REF:A@I:%1}").arg(entry3->uuid().toHex())); + + QCOMPARE(entry4->resolveMultiplePlaceholders(entry4->title()), QString("Entry2Title")); + QCOMPARE(entry4->resolveMultiplePlaceholders(entry4->username()), QString("CustomUserNameValue")); + QCOMPARE(entry4->resolveMultiplePlaceholders(entry4->password()), QString("RecursiveValue")); + QCOMPARE(entry4->resolveMultiplePlaceholders(entry4->url()), QString("http://127.0.0.1:1234/uri/path")); + + Entry* entry5 = new Entry(); + entry5->setGroup(root); + entry5->setUuid(Uuid::random()); + entry5->attributes()->set("Scheme", "http"); + entry5->attributes()->set("Host", "host.org"); + entry5->attributes()->set("Port", "2017"); + entry5->attributes()->set("Path", "/some/path"); + entry5->attributes()->set("UserName", "username"); + entry5->attributes()->set("Password", "password"); + entry5->attributes()->set("Query", "q=e&t=s"); + entry5->attributes()->set("Fragment", "fragment"); + entry5->setUrl("{S:Scheme}://{S:UserName}:{S:Password}@{S:Host}:{S:Port}{S:Path}?{S:Query}#{S:Fragment}"); + entry5->setTitle("title+{URL:Path}+{URL:Fragment}+title"); + + const QString url("http://username:password@host.org:2017/some/path?q=e&t=s#fragment"); + QCOMPARE(entry5->resolveMultiplePlaceholders(entry5->url()), url); + QCOMPARE(entry5->resolveMultiplePlaceholders(entry5->title()), QString("title+/some/path+fragment+title")); } diff --git a/tests/TestEntry.h b/tests/TestEntry.h index febdf0855..50fec57a5 100644 --- a/tests/TestEntry.h +++ b/tests/TestEntry.h @@ -33,6 +33,7 @@ private slots: void testClone(); void testResolveUrl(); void testResolveUrlPlaceholders(); + void testResolveRecursivePlaceholders(); }; #endif // KEEPASSX_TESTENTRY_H From 09e94397aa7b2508591ff10683ea69d39485c720 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sat, 21 Oct 2017 13:27:25 +0200 Subject: [PATCH 056/402] Remove emoji in commit messages from style guide --- .github/CONTRIBUTING.md | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index df5429582..4f937513c 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -103,18 +103,8 @@ The Branch Strategy is based on [git-flow-lite](http://nvie.com/posts/a-successf * Use the imperative mood ("Move cursor to…" not "Moves cursor to…") * Limit the first line to 72 characters or less * Reference issues and pull requests liberally +* If your pull request fixes an existing issue, add "…, resolves #ISSUENUMBER" to your main commit * When only changing documentation, include `[ci skip]` in the commit description -* Consider starting the commit message with an applicable emoji: - * :memo: `:memo:` when writing docs - * :penguin: `:penguin:` when fixing something on Linux - * :apple: `:apple:` when fixing something on macOS - * :checkered_flag: `:checkered_flag:` when fixing something on Windows - * :bug: `:bug:` when fixing a bug - * :fire: `:fire:` when removing code or files - * :green_heart: `:green_heart:` when fixing the CI build - * :white_check_mark: `:white_check_mark:` when adding tests - * :lock: `:lock:` when dealing with security - ### Coding styleguide From 2fa3f5072d2010c402d44c394b208cd32f108aea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20E=2E=20Garc=C3=ADa?= <adolfo.garcia.cr@gmail.com> Date: Sun, 15 Oct 2017 06:02:34 -0600 Subject: [PATCH 057/402] Simplify the ZLIB version check --- CMakeLists.txt | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5ec37473c..bfefcadd1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -240,17 +240,8 @@ find_package(ZLIB REQUIRED) set(CMAKE_REQUIRED_INCLUDES ${ZLIB_INCLUDE_DIR}) -check_cxx_source_compiles(" - #include <zlib.h> - - #if !defined(ZLIB_VERNUM) || (ZLIB_VERNUM < 0x1200) - #error zlib 1.2.x or higher is required to use the gzip format - #endif - - int main() { return 0; }" ZLIB_SUPPORTS_GZIP) - -if(NOT ZLIB_SUPPORTS_GZIP) - message(FATAL_ERROR "zlib 1.2.x or higher is required to use the gzip format") +if(ZLIB_VERSION_STRING VERSION_LESS "1.2.0") + message(FATAL_ERROR "zlib 1.2.0 or higher is required to use the gzip format") endif() # Optional From de065c728fb7600ec368e895ba4faab656c0dc0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20E=2E=20Garc=C3=ADa?= <adolfo.garcia.cr@gmail.com> Date: Sun, 15 Oct 2017 06:54:27 -0600 Subject: [PATCH 058/402] Enable option WITH_ASAN for macOS builds --- CMakeLists.txt | 16 ++++++++++------ README.md | 4 +++- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bfefcadd1..f9aec839c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,9 +36,9 @@ include(CheckCXXSourceCompiles) option(WITH_TESTS "Enable building of unit tests" ON) option(WITH_GUI_TESTS "Enable building of GUI tests" OFF) option(WITH_DEV_BUILD "Use only for development. Disables/warns about deprecated methods." OFF) -option(WITH_ASAN "Enable address sanitizer checks (Linux only)" OFF) +option(WITH_ASAN "Enable address sanitizer checks (Linux and macOS only)" OFF) option(WITH_COVERAGE "Use to build with coverage tests (GCC only)." OFF) -option(WITH_APP_BUNDLE "Enable Application Bundle for OS X" ON) +option(WITH_APP_BUNDLE "Enable Application Bundle for macOS" ON) option(WITH_XC_AUTOTYPE "Include Auto-Type." ON) option(WITH_XC_HTTP "Include KeePassHTTP and Custom Icon Downloads." OFF) @@ -110,16 +110,20 @@ endif() add_gcc_compiler_cxxflags("-fno-exceptions -fno-rtti") add_gcc_compiler_cxxflags("-Wnon-virtual-dtor -Wold-style-cast -Woverloaded-virtual") add_gcc_compiler_cflags("-Wchar-subscripts -Wwrite-strings") + if(WITH_ASAN) - if(NOT CMAKE_SYSTEM_NAME STREQUAL "Linux") - message(FATAL_ERROR "WITH_ASAN is only supported on Linux at the moment.") + if(NOT (LINUX OR APPLE)) + message(FATAL_ERROR "WITH_ASAN is only supported on Linux and macOS at the moment.") endif() add_gcc_compiler_flags("-fsanitize=address -DWITH_ASAN") - if(NOT (CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9)) - add_gcc_compiler_flags("-fsanitize=leak -DWITH_LSAN") + if(LINUX) + if(NOT (CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9)) + add_gcc_compiler_flags("-fsanitize=leak -DWITH_LSAN") + endif() endif() + endif() string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER) diff --git a/README.md b/README.md index 669b0b666..e379123c1 100644 --- a/README.md +++ b/README.md @@ -70,10 +70,12 @@ cmake accepts the following options: -DWITH_TESTS=[ON|OFF] Enable/Disable building of unit tests (default: ON) -DWITH_GUI_TESTS=[ON|OFF] Enable/Disable building of GUI tests (default: OFF) -DWITH_DEV_BUILD=[ON|OFF] Enable/Disable deprecated method warnings (default: OFF) - -DWITH_ASAN=[ON|OFF] Enable/Disable address sanitizer checks (Linux only) (default: OFF) + -DWITH_ASAN=[ON|OFF] Enable/Disable address sanitizer checks (Linux / macOS only) (default: OFF) -DWITH_COVERAGE=[ON|OFF] Enable/Disable coverage tests (GCC only) (default: OFF) ``` +:exclamation: When building with ASan support on macOS, you need to use `export ASAN_OPTIONS=detect_leaks=0` before running the tests (no LSan support in macOS). + ### Contributing We are always looking for suggestions how to improve our application. If you find any bugs or have an idea for a new feature, please let us know by opening a report in our [issue tracker](https://github.com/keepassxreboot/keepassxc/issues) on GitHub or join us on IRC on freenode channels #keepassxc or #keepassxc-dev. From 7198f20d6931bd39a17f41bd01d0c9d93ba56f10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20E=2E=20Garc=C3=ADa?= <adolfo.garcia.cr@gmail.com> Date: Sun, 15 Oct 2017 16:27:07 -0600 Subject: [PATCH 059/402] Improve building of macOS target --- CMakeLists.txt | 42 +++++++++++++++++++++++---------- src/CMakeLists.txt | 18 +++++++------- src/autotype/mac/CMakeLists.txt | 6 ++--- utils/fix_mac.sh | 20 ---------------- 4 files changed, 39 insertions(+), 47 deletions(-) delete mode 100755 utils/fix_mac.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index f9aec839c..7b465d227 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,7 +36,7 @@ include(CheckCXXSourceCompiles) option(WITH_TESTS "Enable building of unit tests" ON) option(WITH_GUI_TESTS "Enable building of GUI tests" OFF) option(WITH_DEV_BUILD "Use only for development. Disables/warns about deprecated methods." OFF) -option(WITH_ASAN "Enable address sanitizer checks (Linux and macOS only)" OFF) +option(WITH_ASAN "Enable address sanitizer checks (Linux / macOS only)" OFF) option(WITH_COVERAGE "Use to build with coverage tests (GCC only)." OFF) option(WITH_APP_BUNDLE "Enable Application Bundle for macOS" ON) @@ -112,13 +112,13 @@ add_gcc_compiler_cxxflags("-Wnon-virtual-dtor -Wold-style-cast -Woverloaded-virt add_gcc_compiler_cflags("-Wchar-subscripts -Wwrite-strings") if(WITH_ASAN) - if(NOT (LINUX OR APPLE)) - message(FATAL_ERROR "WITH_ASAN is only supported on Linux and macOS at the moment.") + if(NOT (CMAKE_SYSTEM_NAME STREQUAL "Linux" OR APPLE)) + message(FATAL_ERROR "WITH_ASAN is only supported on Linux / macOS at the moment.") endif() add_gcc_compiler_flags("-fsanitize=address -DWITH_ASAN") - if(LINUX) + if(CMAKE_SYSTEM_NAME STREQUAL "Linux") if(NOT (CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9)) add_gcc_compiler_flags("-fsanitize=leak -DWITH_LSAN") endif() @@ -220,17 +220,33 @@ if(WITH_TESTS) enable_testing() endif(WITH_TESTS) -find_package(Qt5Core 5.2 REQUIRED) -find_package(Qt5Network 5.2 REQUIRED) -find_package(Qt5Concurrent 5.2 REQUIRED) -find_package(Qt5Widgets 5.2 REQUIRED) -find_package(Qt5Test 5.2 REQUIRED) -find_package(Qt5LinguistTools 5.2 REQUIRED) -find_package(Qt5Network 5.2 REQUIRED) -if (UNIX AND NOT APPLE) - find_package(Qt5DBus 5.2 REQUIRED) +if(UNIX AND NOT APPLE) + find_package(Qt5 COMPONENTS Core Network Concurrent Widgets Test LinguistTools DBus REQUIRED) +elseif(APPLE) + find_package(Qt5 COMPONENTS Core Network Concurrent Widgets Test LinguistTools MacExtras REQUIRED + HINTS /usr/local/Cellar/qt/*/lib/cmake ENV PATH + ) +else() + find_package(Qt5 COMPONENTS Core Network Concurrent Widgets Test LinguistTools REQUIRED) endif() + +if(Qt5Core_VERSION VERSION_LESS "5.2.0") + message(FATAL_ERROR "Qt version 5.2.0 or higher is required") +endif() + set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) + +if(APPLE) + set(CMAKE_MACOSX_RPATH TRUE) + find_program(MACDEPLOYQT_EXE macdeployqt HINTS /usr/local/opt/qt5/bin ENV PATH) + if(NOT MACDEPLOYQT_EXE) + message(FATAL_ERROR "macdeployqt is required to use build in macOS") + else() + message(STATUS "Using macdeployqt: ${MACDEPLOYQT_EXE}") + endif() +endif() # Debian sets the the build type to None for package builds. # Make sure we don't enable asserts there. diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index bd8a1fd33..3d5e7bf48 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -234,6 +234,9 @@ target_link_libraries(keepassx_core if(APPLE) target_link_libraries(keepassx_core "-framework Foundation") + if(Qt5MacExtras_FOUND) + target_link_libraries(keepassx_core Qt5::MacExtras) + endif() endif() if (UNIX AND NOT APPLE) target_link_libraries(keepassx_core Qt5::DBus) @@ -264,13 +267,7 @@ if(APPLE AND WITH_APP_BUNDLE) set_target_properties(${PROGNAME} PROPERTIES MACOSX_BUNDLE ON MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_BINARY_DIR}/Info.plist) -endif() -install(TARGETS ${PROGNAME} - BUNDLE DESTINATION . COMPONENT Runtime - RUNTIME DESTINATION ${BIN_INSTALL_DIR} COMPONENT Runtime) - -if(APPLE AND WITH_APP_BUNDLE) if(QT_MAC_USE_COCOA AND EXISTS "${QT_LIBRARY_DIR}/Resources/qt_menu.nib") install(DIRECTORY "${QT_LIBRARY_DIR}/Resources/qt_menu.nib" DESTINATION "${DATA_INSTALL_DIR}") @@ -284,16 +281,17 @@ if(APPLE AND WITH_APP_BUNDLE) set(CPACK_PACKAGE_FILE_NAME "${PROGNAME}-${KEEPASSXC_VERSION}") include(CPack) - if(NOT DEFINED QT_BINARY_DIR) - set(QT_BINARY_DIR "/usr/local/opt/qt5/bin" CACHE PATH "QT binary folder") - endif() add_custom_command(TARGET ${PROGNAME} POST_BUILD - COMMAND ${QT_BINARY_DIR}/macdeployqt ${PROGNAME}.app + COMMAND ${MACDEPLOYQT_EXE} ${PROGNAME}.app WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/src COMMENT "Deploying app bundle") endif() +install(TARGETS ${PROGNAME} + BUNDLE DESTINATION . COMPONENT Runtime + RUNTIME DESTINATION ${BIN_INSTALL_DIR} COMPONENT Runtime) + if(MINGW) if(${CMAKE_SIZEOF_VOID_P} EQUAL "8") set(OUTPUT_FILE_POSTFIX "Win64") diff --git a/src/autotype/mac/CMakeLists.txt b/src/autotype/mac/CMakeLists.txt index ac93de0e7..08c532784 100644 --- a/src/autotype/mac/CMakeLists.txt +++ b/src/autotype/mac/CMakeLists.txt @@ -9,14 +9,12 @@ set(autotype_mac_mm_SOURCES add_library(keepassx-autotype-cocoa MODULE ${autotype_mac_SOURCES} ${autotype_mac_mm_SOURCES}) set_target_properties(keepassx-autotype-cocoa PROPERTIES LINK_FLAGS "-framework Foundation -framework AppKit -framework Carbon") target_link_libraries(keepassx-autotype-cocoa ${PROGNAME} Qt5::Core Qt5::Widgets) -if(NOT DEFINED QT_BINARY_DIR) - set(QT_BINARY_DIR "/usr/local/opt/qt5/bin" CACHE PATH "QT binary folder") -endif() + if(WITH_APP_BUNDLE) add_custom_command(TARGET keepassx-autotype-cocoa POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/libkeepassx-autotype-cocoa.so ${PLUGIN_INSTALL_DIR} - COMMAND ${QT_BINARY_DIR}/macdeployqt ${PROGNAME}.app -executable=${PLUGIN_INSTALL_DIR}/libkeepassx-autotype-cocoa.so -no-plugins + COMMAND ${MACDEPLOYQT_EXE} ${PROGNAME}.app -executable=${PLUGIN_INSTALL_DIR}/libkeepassx-autotype-cocoa.so -no-plugins WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/src COMMENT "Deploying autotype plugin") else() diff --git a/utils/fix_mac.sh b/utils/fix_mac.sh deleted file mode 100755 index 2e4e84e5e..000000000 --- a/utils/fix_mac.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash - -# Canonical path to qt5 directory -QT="/usr/local/Cellar/qt" -if [ ! -d "$QT" ]; then - # Alternative (old) path to qt5 directory - QT+="5" - if [ ! -d "$QT" ]; then - echo "Qt/Qt5 not found!" - exit - fi -fi -QT5_DIR="$QT/$(ls $QT | sort -r | head -n1)" -echo $QT5_DIR - -# Change qt5 framework ids -for framework in $(find "$QT5_DIR/lib" -regex ".*/\(Qt[a-zA-Z]*\)\.framework/Versions/5/\1"); do - echo "$framework" - install_name_tool -id "$framework" "$framework" -done From fdc7471a7b42731c849028ad17dbbee323007545 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20E=2E=20Garc=C3=ADa?= <adolfo.garcia.cr@gmail.com> Date: Sun, 15 Oct 2017 17:28:26 -0600 Subject: [PATCH 060/402] Make QtMacExtras optional --- CMakeLists.txt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7b465d227..5fa90173a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -223,7 +223,10 @@ endif(WITH_TESTS) if(UNIX AND NOT APPLE) find_package(Qt5 COMPONENTS Core Network Concurrent Widgets Test LinguistTools DBus REQUIRED) elseif(APPLE) - find_package(Qt5 COMPONENTS Core Network Concurrent Widgets Test LinguistTools MacExtras REQUIRED + find_package(Qt5 COMPONENTS Core Network Concurrent Widgets Test LinguistTools REQUIRED + HINTS /usr/local/Cellar/qt/*/lib/cmake ENV PATH + ) + find_package(Qt5 COMPONENTS MacExtras HINTS /usr/local/Cellar/qt/*/lib/cmake ENV PATH ) else() @@ -242,7 +245,7 @@ if(APPLE) set(CMAKE_MACOSX_RPATH TRUE) find_program(MACDEPLOYQT_EXE macdeployqt HINTS /usr/local/opt/qt5/bin ENV PATH) if(NOT MACDEPLOYQT_EXE) - message(FATAL_ERROR "macdeployqt is required to use build in macOS") + message(FATAL_ERROR "macdeployqt is required to build in macOS") else() message(STATUS "Using macdeployqt: ${MACDEPLOYQT_EXE}") endif() From 067da8223dfcc700654eae22c1ddf9f902187e5d Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sat, 21 Oct 2017 22:38:24 +0200 Subject: [PATCH 061/402] Fix build after merge --- src/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index cd2565118..3f0ba7823 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -68,8 +68,8 @@ set(keepassx_SOURCES core/Uuid.cpp core/Base32.h core/Base32.cpp - cli/PasswordInput.cpp - cli/PasswordInput.h + cli/Utils.cpp + cli/Utils.h crypto/Crypto.cpp crypto/CryptoHash.cpp crypto/Random.cpp From 1a4303bbceb7dc6e303b4fe3aeff8e1d4a888d30 Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Sat, 23 Sep 2017 12:25:45 -0400 Subject: [PATCH 062/402] Added tests for retention of entry history after merge --- tests/TestMerge.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/tests/TestMerge.cpp b/tests/TestMerge.cpp index c8f15f29b..4f8daa068 100644 --- a/tests/TestMerge.cpp +++ b/tests/TestMerge.cpp @@ -48,6 +48,8 @@ void TestMerge::testMergeIntoNew() QCOMPARE(dbDestination->rootGroup()->children().size(), 2); QCOMPARE(dbDestination->rootGroup()->children().at(0)->entries().size(), 2); + // Test for retention of history + QCOMPARE(dbDestination->rootGroup()->children().at(0)->entries().at(0)->historyItems().isEmpty(), false); delete dbDestination; delete dbSource; @@ -195,7 +197,7 @@ void TestMerge::testResolveConflictKeepBoth() Database* dbDestination = createTestDatabase(); Database* dbSource = new Database(); - dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneNoFlags)); + dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneIncludeHistory)); // sanity check QCOMPARE(dbDestination->rootGroup()->children().at(0)->entries().size(), 2); @@ -212,9 +214,11 @@ void TestMerge::testResolveConflictKeepBoth() // one entry is duplicated because of mode QCOMPARE(dbDestination->rootGroup()->children().at(0)->entries().size(), 3); + QCOMPARE(dbDestination->rootGroup()->children().at(0)->entries().at(0)->historyItems().isEmpty(), false); // the older entry was merged from the other db as last in the group Entry* olderEntry = dbDestination->rootGroup()->children().at(0)->entries().at(2); QVERIFY2(olderEntry->attributes()->hasKey("merged"), "older entry is marked with an attribute \"merged\""); + QCOMPARE(olderEntry->historyItems().isEmpty(), false); QVERIFY2(olderEntry->uuid().toHex() != updatedEntry->uuid().toHex(), "KeepBoth should not reuse the UUIDs when cloning."); @@ -455,12 +459,19 @@ Database* TestMerge::createTestDatabase() Entry* entry1 = new Entry(); Entry* entry2 = new Entry(); + // Give Entry 1 a history + entry1->beginUpdate(); entry1->setGroup(group1); entry1->setUuid(Uuid::random()); entry1->setTitle("entry1"); + entry1->endUpdate(); + + // Give Entry 2 a history + entry2->beginUpdate(); entry2->setGroup(group1); entry2->setUuid(Uuid::random()); entry2->setTitle("entry2"); + entry2->endUpdate(); group1->setParent(db->rootGroup()); group2->setParent(db->rootGroup()); From 010690a9c748fab667baf92eb2f01bae366a0e7a Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sun, 22 Oct 2017 20:55:05 +0200 Subject: [PATCH 063/402] Reduce external dependencies and install YubiKey deps from EPEL --- Dockerfile | 35 ++++++----------------------------- 1 file changed, 6 insertions(+), 29 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6f7ace34c..c8a82844a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,12 +20,9 @@ RUN set -x \ && curl "https://copr.fedorainfracloud.org/coprs/bugzy/keepassxc/repo/epel-7/bugzy-keepassxc-epel-7.repo" \ > /etc/yum.repos.d/bugzy-keepassxc-epel-7.repo -RUN set -x \ - && curl "https://copr.fedorainfracloud.org/coprs/sic/backports/repo/epel-7/sic-backports-epel-7.repo" \ - > /etc/yum.repos.d/sic-backports-epel-7.repo - RUN set -x \ && yum clean -y all \ + && yum install -y epel-release \ && yum upgrade -y # build and runtime dependencies @@ -34,7 +31,7 @@ RUN set -x \ make \ automake \ gcc-c++ \ - cmake \ + cmake3 \ libgcrypt16-devel \ qt5-qtbase-devel \ qt5-linguist \ @@ -43,7 +40,9 @@ RUN set -x \ qt5-qtx11extras \ qt5-qtx11extras-devel \ libXi-devel \ - libXtst-devel + libXtst-devel \ + libyubikey-devel \ + ykpers-devel # AppImage dependencies RUN set -x \ @@ -51,30 +50,8 @@ RUN set -x \ wget \ fuse-libs -# build libyubikey -ENV YUBIKEY_VERSION=1.13 -RUN set -x && yum install -y libusb-devel RUN set -x \ - && wget "https://developers.yubico.com/yubico-c/Releases/libyubikey-${YUBIKEY_VERSION}.tar.gz" \ - && tar xf libyubikey-${YUBIKEY_VERSION}.tar.gz \ - && cd libyubikey-${YUBIKEY_VERSION} \ - && ./configure --prefix=/usr --libdir=/usr/lib64 \ - && make \ - && make install \ - && cd .. \ - && rm -Rf libyubikey-${YUBIKEY_VERSION}* - -# build libykpers-1 -ENV YKPERS_VERSION=1.18.0 -RUN set -x \ - && wget "https://developers.yubico.com/yubikey-personalization/Releases/ykpers-${YKPERS_VERSION}.tar.gz" \ - && tar xf ykpers-${YKPERS_VERSION}.tar.gz \ - && cd ykpers-${YKPERS_VERSION} \ - && ./configure --prefix=/usr --libdir=/usr/lib64 \ - && make \ - && make install \ - && cd .. \ - && rm -Rf ykpers-${YKPERS_VERSION}* + && ln -s /usr/bin/cmake3 /usr/bin/cmake VOLUME /keepassxc/src VOLUME /keepassxc/out From 7f2bd4784933957ad5ce89eb3092dc39d276fe07 Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Thu, 5 Oct 2017 23:05:08 +0300 Subject: [PATCH 064/402] AutoType: resolve placeholders for title in window associations --- src/autotype/AutoType.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp index f3496849d..2519b9dcb 100644 --- a/src/autotype/AutoType.cpp +++ b/src/autotype/AutoType.cpp @@ -563,7 +563,8 @@ QString AutoType::autoTypeSequence(const Entry* entry, const QString& windowTitl bool match = false; const QList<AutoTypeAssociations::Association> assocList = entry->autoTypeAssociations()->getAll(); for (const AutoTypeAssociations::Association& assoc : assocList) { - if (windowMatches(windowTitle, assoc.window)) { + const QString window = entry->resolveMultiplePlaceholders(assoc.window); + if (windowMatches(windowTitle, window)) { if (!assoc.sequence.isEmpty()) { sequence = assoc.sequence; } From 1f5a0c013005dd811fc647e3f9c8fa09b0639fb9 Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Fri, 6 Oct 2017 19:41:04 +0300 Subject: [PATCH 065/402] Add test for resolved placeholders in window association title --- tests/TestAutoType.cpp | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/tests/TestAutoType.cpp b/tests/TestAutoType.cpp index be73efd47..acc2df61f 100644 --- a/tests/TestAutoType.cpp +++ b/tests/TestAutoType.cpp @@ -96,6 +96,9 @@ void TestAutoType::init() m_entry4->setGroup(m_group); m_entry4->setPassword("custom_attr"); m_entry4->attributes()->set("CUSTOM","Attribute",false); + m_entry4->attributes()->set("CustomAttrFirst","AttrValueFirst",false); + m_entry4->attributes()->set("CustomAttrSecond","AttrValueSecond",false); + m_entry4->attributes()->set("CustomAttrThird","AttrValueThird",false); association.window = "//^CustomAttr1$//"; association.sequence = "{PASSWORD}:{S:CUSTOM}"; m_entry4->autoTypeAssociations()->add(association); @@ -105,7 +108,16 @@ void TestAutoType::init() association.window = "//^CustomAttr3$//"; association.sequence = "{PaSSworD}"; m_entry4->autoTypeAssociations()->add(association); - + association.window = "//^{S:CustomAttrFirst}$//"; + association.sequence = "custom_attr_first"; + m_entry4->autoTypeAssociations()->add(association); + association.window = "//{S:CustomAttrFirst}And{S:CustomAttrSecond}//"; + association.sequence = "custom_attr_first_and_second"; + m_entry4->autoTypeAssociations()->add(association); + association.window = "//{S:CustomAttrThird}//"; + association.sequence = "custom_attr_third"; + m_entry4->autoTypeAssociations()->add(association); + m_entry5 = new Entry(); m_entry5->setGroup(m_group); m_entry5->setPassword("example5"); @@ -253,4 +265,20 @@ void TestAutoType::testGlobalAutoTypeRegExp() m_autoType->performGlobalAutoType(m_dbList); QCOMPARE(m_test->actionChars(), QString("custom_attr")); m_test->clearActions(); + + // with resolve placeholders in window association title + m_test->setActiveWindowTitle("AttrValueFirst"); + m_autoType->performGlobalAutoType(m_dbList); + QCOMPARE(m_test->actionChars(), QString("custom_attr_first")); + m_test->clearActions(); + + m_test->setActiveWindowTitle("lorem AttrValueFirstAndAttrValueSecond ipsum"); + m_autoType->performGlobalAutoType(m_dbList); + QCOMPARE(m_test->actionChars(), QString("custom_attr_first_and_second")); + m_test->clearActions(); + + m_test->setActiveWindowTitle("lorem AttrValueThird ipsum"); + m_autoType->performGlobalAutoType(m_dbList); + QCOMPARE(m_test->actionChars(), QString("custom_attr_third")); + m_test->clearActions(); } From b6387f7709a4750b82498bf52b12e3205dd110e4 Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Fri, 6 Oct 2017 18:22:59 +0300 Subject: [PATCH 066/402] AutoType: resolve placeholders in window associations list --- src/gui/entry/AutoTypeAssociationsModel.cpp | 15 ++++++++++++++- src/gui/entry/AutoTypeAssociationsModel.h | 5 ++++- src/gui/entry/EditEntryWidget.cpp | 1 + 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/gui/entry/AutoTypeAssociationsModel.cpp b/src/gui/entry/AutoTypeAssociationsModel.cpp index 4a76233b4..442453de0 100644 --- a/src/gui/entry/AutoTypeAssociationsModel.cpp +++ b/src/gui/entry/AutoTypeAssociationsModel.cpp @@ -17,9 +17,12 @@ #include "AutoTypeAssociationsModel.h" +#include "core/Entry.h" + AutoTypeAssociationsModel::AutoTypeAssociationsModel(QObject* parent) : QAbstractListModel(parent) , m_autoTypeAssociations(nullptr) + , m_entry(nullptr) { } @@ -46,6 +49,11 @@ void AutoTypeAssociationsModel::setAutoTypeAssociations(AutoTypeAssociations* au endResetModel(); } +void AutoTypeAssociationsModel::setEntry(const Entry *entry) +{ + m_entry = entry; +} + int AutoTypeAssociationsModel::rowCount(const QModelIndex& parent) const { if (!m_autoTypeAssociations || parent.isValid()) { @@ -86,7 +94,12 @@ QVariant AutoTypeAssociationsModel::data(const QModelIndex& index, int role) con if (role == Qt::DisplayRole) { if (index.column() == 0) { - return m_autoTypeAssociations->get(index.row()).window; + QString window = m_autoTypeAssociations->get(index.row()).window; + if (m_entry) { + window = m_entry->maskPasswordPlaceholders(window); + window = m_entry->resolveMultiplePlaceholders(window); + } + return window; } else { QString sequence = m_autoTypeAssociations->get(index.row()).sequence; diff --git a/src/gui/entry/AutoTypeAssociationsModel.h b/src/gui/entry/AutoTypeAssociationsModel.h index cef8bc66b..1daa4a9c7 100644 --- a/src/gui/entry/AutoTypeAssociationsModel.h +++ b/src/gui/entry/AutoTypeAssociationsModel.h @@ -19,10 +19,11 @@ #define KEEPASSX_AUTOTYPEASSOCIATIONSMODEL_H #include <QAbstractListModel> +#include <QPointer> #include "core/AutoTypeAssociations.h" -class EntryAttributes; +class Entry; class AutoTypeAssociationsModel : public QAbstractListModel { @@ -31,6 +32,7 @@ class AutoTypeAssociationsModel : public QAbstractListModel public: explicit AutoTypeAssociationsModel(QObject* parent = nullptr); void setAutoTypeAssociations(AutoTypeAssociations* autoTypeAssociations); + void setEntry(const Entry* entry); int rowCount(const QModelIndex& parent = QModelIndex()) const override; int columnCount(const QModelIndex& parent = QModelIndex()) const override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; @@ -47,6 +49,7 @@ public slots: private: AutoTypeAssociations* m_autoTypeAssociations; + QPointer<const Entry> m_entry; }; #endif // KEEPASSX_AUTOTYPEASSOCIATIONSMODEL_H diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index 809ac95eb..463096b32 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -378,6 +378,7 @@ void EditEntryWidget::setForms(const Entry* entry, bool restore) m_autoTypeUi->defaultWindowSequenceButton->setChecked(true); m_autoTypeUi->windowSequenceEdit->setText(""); m_autoTypeAssoc->copyDataFrom(entry->autoTypeAssociations()); + m_autoTypeAssocModel->setEntry(entry); if (m_autoTypeAssoc->size() != 0) { m_autoTypeUi->assocView->setCurrentIndex(m_autoTypeAssocModel->index(0, 0)); } From ca59ae4f4f503ff0044919ebce94d544484aa126 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Tue, 24 Oct 2017 18:24:25 +0200 Subject: [PATCH 067/402] remove useless View menu --- src/gui/MainWindow.cpp | 6 ------ src/gui/MainWindow.ui | 6 ------ 2 files changed, 12 deletions(-) diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index c83cae102..e8a1728f0 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -124,12 +124,6 @@ MainWindow::MainWindow() setWindowIcon(filePath()->applicationIcon()); m_ui->globalMessageWidget->setHidden(true); - QAction* toggleViewAction = m_ui->toolBar->toggleViewAction(); - toggleViewAction->setText(tr("Show toolbar")); - m_ui->menuView->addAction(toggleViewAction); - bool showToolbar = config()->get("ShowToolbar").toBool(); - m_ui->toolBar->setVisible(showToolbar); - connect(m_ui->toolBar, SIGNAL(visibilityChanged(bool)), this, SLOT(saveToolbarState(bool))); m_clearHistoryAction = new QAction(tr("Clear history"), m_ui->menuFile); m_lastDatabasesActions = new QActionGroup(m_ui->menuRecentDatabases); diff --git a/src/gui/MainWindow.ui b/src/gui/MainWindow.ui index 258dd90c8..6824904ab 100644 --- a/src/gui/MainWindow.ui +++ b/src/gui/MainWindow.ui @@ -260,15 +260,9 @@ <addaction name="actionPasswordGenerator"/> <addaction name="actionSettings"/> </widget> - <widget class="QMenu" name="menuView"> - <property name="title"> - <string>&View</string> - </property> - </widget> <addaction name="menuFile"/> <addaction name="menuEntries"/> <addaction name="menuGroups"/> - <addaction name="menuView"/> <addaction name="menuTools"/> <addaction name="menuHelp"/> </widget> From 4076b37378248ffcacddc8b3b722b4d61e0920bb Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Tue, 24 Oct 2017 19:23:55 +0200 Subject: [PATCH 068/402] disable the save button if there isn't anything to save --- src/gui/DatabaseTabWidget.cpp | 10 ++++++++++ src/gui/DatabaseTabWidget.h | 1 + src/gui/MainWindow.cpp | 3 ++- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp index 4c9445ccc..8510279b5 100644 --- a/src/gui/DatabaseTabWidget.cpp +++ b/src/gui/DatabaseTabWidget.cpp @@ -539,6 +539,16 @@ bool DatabaseTabWidget::readOnly(int index) return indexDatabaseManagerStruct(index).readOnly; } +bool DatabaseTabWidget::canSave(int index) +{ + if (index == -1) { + index = currentIndex(); + } + + const DatabaseManagerStruct& dbStruct = indexDatabaseManagerStruct(index); + return !dbStruct.saveToFilename || (dbStruct.modified && !dbStruct.readOnly); +} + bool DatabaseTabWidget::isModified(int index) { if (index == -1) { diff --git a/src/gui/DatabaseTabWidget.h b/src/gui/DatabaseTabWidget.h index 847eaef05..db237d98c 100644 --- a/src/gui/DatabaseTabWidget.h +++ b/src/gui/DatabaseTabWidget.h @@ -78,6 +78,7 @@ public slots: void changeMasterKey(); void changeDatabaseSettings(); bool readOnly(int index = -1); + bool canSave(int index = -1); bool isModified(int index = -1); void performGlobalAutoType(); void lockDatabases(); diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index e8a1728f0..c82ea1751 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -454,7 +454,7 @@ void MainWindow::setMenuActionState(DatabaseWidget::Mode mode) m_ui->actionGroupEmptyRecycleBin->setEnabled(recycleBinSelected); m_ui->actionChangeMasterKey->setEnabled(true); m_ui->actionChangeDatabaseSettings->setEnabled(true); - m_ui->actionDatabaseSave->setEnabled(true); + m_ui->actionDatabaseSave->setEnabled(m_ui->tabWidget->canSave()); m_ui->actionDatabaseSaveAs->setEnabled(true); m_ui->actionExportCsv->setEnabled(true); m_ui->actionDatabaseMerge->setEnabled(m_ui->tabWidget->currentIndex() != -1); @@ -560,6 +560,7 @@ void MainWindow::updateWindowTitle() if (m_ui->tabWidget->readOnly(tabWidgetIndex)) { customWindowTitlePart.append(QString(" [%1]").arg(tr("read-only"))); } + m_ui->actionDatabaseSave->setEnabled(m_ui->tabWidget->canSave(tabWidgetIndex)); } else if (stackedWidgetIndex == 1) { customWindowTitlePart = tr("Settings"); } From ecfbad0443d638585c38554fa0e8baeac6d14fac Mon Sep 17 00:00:00 2001 From: Louis-Bertrand Varin <louisbvarin@gmail.com> Date: Tue, 24 Oct 2017 20:26:02 -0400 Subject: [PATCH 069/402] Disable reload prompt when db is locked --- src/gui/DatabaseWidget.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 7fbcbe35c..0cf418286 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -825,7 +825,7 @@ void DatabaseWidget::unlockDatabase(bool accepted) return; } - Database *db = Q_NULLPTR; + Database* db = Q_NULLPTR; if (sender() == m_unlockDatabaseDialog) { db = m_unlockDatabaseDialog->database(); } else if (sender() == m_unlockDatabaseWidget) { @@ -1125,8 +1125,13 @@ void DatabaseWidget::onWatchedFileChanged() void DatabaseWidget::reloadDatabaseFile() { - if (m_db == nullptr) + if (m_db == nullptr) { return; + } + + if (currentMode() == DatabaseWidget::LockedMode) { + return; + } if (! config()->get("AutoReloadOnChange").toBool()) { // Ask if we want to reload the db From 055ba4f14ed4cf69519f5d5c6313fd231718bf1d Mon Sep 17 00:00:00 2001 From: Louis-Bertrand Varin <louisbvarin@gmail.com> Date: Wed, 25 Oct 2017 10:15:37 -0400 Subject: [PATCH 070/402] Q_NULLPTR -> nullptr --- src/gui/DatabaseWidget.cpp | 2 +- src/gui/UnlockDatabaseDialog.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 0cf418286..6a425b5d7 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -825,7 +825,7 @@ void DatabaseWidget::unlockDatabase(bool accepted) return; } - Database* db = Q_NULLPTR; + Database* db = nullptr; if (sender() == m_unlockDatabaseDialog) { db = m_unlockDatabaseDialog->database(); } else if (sender() == m_unlockDatabaseWidget) { diff --git a/src/gui/UnlockDatabaseDialog.h b/src/gui/UnlockDatabaseDialog.h index 9a42ed6e2..ef2eabb30 100644 --- a/src/gui/UnlockDatabaseDialog.h +++ b/src/gui/UnlockDatabaseDialog.h @@ -31,7 +31,7 @@ class UnlockDatabaseDialog : public QDialog { Q_OBJECT public: - explicit UnlockDatabaseDialog(QWidget* parent = Q_NULLPTR); + explicit UnlockDatabaseDialog(QWidget* parent = nullptr); void setDBFilename(const QString& filename); void clearForms(); Database* database(); From 263bee3c095abaa4e98d516ac440fdd3852d3f3b Mon Sep 17 00:00:00 2001 From: Francois Ferrand <thetypz@gmail.com> Date: Wed, 30 Aug 2017 17:54:15 +0200 Subject: [PATCH 071/402] Detect session lock on Xfce/XUbuntu 16.04 The current code does not work with XUbuntu 16.04, which uses light-locker to lock the screen. I am not using a screensaver, but I suspect the screensaver activation may have been detected by the existing events, and using it could thus mask the issue. --- src/core/ScreenLockListenerDBus.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/core/ScreenLockListenerDBus.cpp b/src/core/ScreenLockListenerDBus.cpp index 1976b47ea..6c1b7fe96 100644 --- a/src/core/ScreenLockListenerDBus.cpp +++ b/src/core/ScreenLockListenerDBus.cpp @@ -20,6 +20,7 @@ #include <QDBusConnection> #include <QDBusInterface> #include <QDBusReply> +#include <QProcessEnvironment> ScreenLockListenerDBus::ScreenLockListenerDBus(QWidget *parent): ScreenLockListenerPrivate(parent) @@ -34,7 +35,7 @@ ScreenLockListenerDBus::ScreenLockListenerDBus(QWidget *parent): "ActiveChanged", // signal name this, //receiver SLOT(freedesktopScreenSaver(bool))); - + sessionBus.connect( "org.gnome.SessionManager", // service "/org/gnome/SessionManager/Presence", // path @@ -51,6 +52,15 @@ ScreenLockListenerDBus::ScreenLockListenerDBus(QWidget *parent): this, //receiver SLOT(logindPrepareForSleep(bool))); + QString sessionId = QProcessEnvironment::systemEnvironment().value("XDG_SESSION_ID"); + systemBus.connect( + "", // service + QString("/org/freedesktop/login1/session/") + sessionId, // path + "org.freedesktop.login1.Session", // interface + "Lock", // signal name + this, //receiver + SLOT(unityLocked())); + sessionBus.connect( "com.canonical.Unity", // service "/com/canonical/Unity/Session", // path @@ -84,4 +94,4 @@ void ScreenLockListenerDBus::freedesktopScreenSaver(bool status) if (status) { emit screenLocked(); } -} \ No newline at end of file +} From 1a87e30b95f0cda7b31e641a79ffc5bb46fb7521 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Thu, 17 Aug 2017 21:02:21 +0200 Subject: [PATCH 072/402] add preview panel for entries and groups --- COPYING | 1 + .../application/22x22/actions/chronometer.png | Bin 0 -> 1675 bytes src/CMakeLists.txt | 1 + src/core/Group.cpp | 12 + src/core/Group.h | 1 + src/gui/DatabaseWidget.cpp | 46 +- src/gui/DatabaseWidget.h | 9 + src/gui/DetailsWidget.cpp | 213 +++++++ src/gui/DetailsWidget.h | 60 ++ src/gui/DetailsWidget.ui | 552 ++++++++++++++++++ src/gui/SettingsWidget.cpp | 4 + src/gui/SettingsWidgetGeneral.ui | 7 + src/gui/SettingsWidgetSecurity.ui | 7 + src/gui/entry/EntryView.cpp | 7 + src/gui/entry/EntryView.h | 2 + src/gui/group/GroupView.cpp | 7 + src/gui/group/GroupView.h | 2 + 17 files changed, 930 insertions(+), 1 deletion(-) create mode 100644 share/icons/application/22x22/actions/chronometer.png create mode 100644 src/gui/DetailsWidget.cpp create mode 100644 src/gui/DetailsWidget.h create mode 100644 src/gui/DetailsWidget.ui diff --git a/COPYING b/COPYING index 403e4564b..e12f4534c 100644 --- a/COPYING +++ b/COPYING @@ -156,6 +156,7 @@ License: LGPL-2.1 Comment: based on Nuvola icon theme Files: share/icons/application/*/actions/application-exit.png + share/icons/application/*/actions/chronometer.png share/icons/application/*/actions/configure.png share/icons/application/*/actions/dialog-close.png share/icons/application/*/actions/dialog-ok.png diff --git a/share/icons/application/22x22/actions/chronometer.png b/share/icons/application/22x22/actions/chronometer.png new file mode 100644 index 0000000000000000000000000000000000000000..71d6eabe5f7447958918c8c5d73ab060ada1d78c GIT binary patch literal 1675 zcmV;626Xv}P)<h;3K|Lk000e1NJLTq000&M000&U1^@s6#I$TX00006VoOIv0RI60 z0RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru;Rp{1CMOXXUgrP+1{g_1 zK~y-)U6f61RM#EF&;P!!dGkFm<Hr~qgNG7T#zA&d(bOceqEaa|o1~}`=^|AWwGNV1 zA=HADNZ3?WRWG1)fl*M?MHX%aa!adNq^JuB2q}sQ;5z<@XY3h!Z0rd$!+URL-kbMv zyD(I4j&yVvSNEs;Kf3o2wrFs05QBq**tc&V0HAYsC*FGdEtXEFNe~3oYjys`y)XEO zfBukfJ$K{Ajib6@yyQ79_qjjny6!wZ+Z-Ai!qCtV0N~A^z9}62@zJ2~`Rz@o`GTsd zyNF2gJZ}RW_fx6Vm$z=;s=xo<`}VbK*M4Z4=8L9bT>izt!0M$-mqryuIZXgCJUomu zXU+fsMn*=qWipvpqmk$@HBI}jBuTJs8=U))BpI?Sqf{!bRjQRs%Z23+BC+U?+IH@| zOuqlmpc?%7KPEo@P9~Fa=){Q=IDh^;0N~uYbKTE(KR>j6`}Q~LjXLJ%=doHW@}}d! z_gpZ>5DrJs)wQ2mTU%im#)BvNleulN=#fw;99~??U!IwpU2z=e>i?oRd-iPip}s?x z6N$vZnb{dU-q=7(D#c}4rbHqE-}h0iR{7%6B0YJc^JqLy2M>M^j4>>HHE*O^w0qfX zwz#~qd~;-E<O2eLQ@=hH@9F8e(%IShgNF|u@bnH1-+t~nh^`A)5D*N7zyUNG4cN8~ z!!R)Y<unS*E9iga6*6?g_;_OC?a|ST;{bdB5Kf;yO~GJrV1L*C<BN+qWcKVvDwTqy zD8wH>Mlc=+lVxIzk)kM2Rh3-VMIfM(C<w?G3dm&kD#>J0+OucRCwK1Lv5voc9LzLL zwQXnHdzNKEmPB-ScT+GJguocobQ=2H9KrKIw3!+sf@RyVZ5zG4z0{iCfl_G$?d|Qa zA2@KJ2LN3hy$EKSW`9ddOEQ<s^1c_p&wbzLkw^rJEOR-LK&@Eh+;KQ#j7y@3jjzAv z;cysTU0pntO7Y&FURajJBhe^0=dTUCI}iW>7K_FDi3qOi!frOH-e{0x7_be4+-4Ik zFTYHWu3sl55TN^0Q}8^GlF1}gRV7A5oOAe|M?`?E$bH9ta%^)lNs=;+Mg#F!44S6# zfU0si97Zr2<-|E+ZEgHNw{G#@zw-`{gu~diYZqsXfrvO01fEPLvAd&#bI(UC7W>wP zKmK93tE+2*d9J5gjRqKFV1huRD3YYA5EO-ES%x48^l)*JjPY^O(rM79o~=Yg2&gI% zW2l+6z*0WnpUdUqVx?MHw`?1p=YRkZ08tPCL4YJlxP9{`Ub}Ds=0_hPBFg|{ApU<< z0n4%wjzqCiTv?l(oP3FhG;w`>eNxx;pP8nCjZz6gRpo(T5a1lH=iyLa9{`|!>J;2& z69H8P-@Gw6=iD?+lq(fPqA^q|m8l~~j>rHCtXwYtYiVf-qA1e(`Z|wq+XmNhU|SX^ z0GxAfSr+$2k$bWX5OLr4Vb*F~k|fBojCefGv)L?aX6^d)^t1&4Y)5*>SGmR9gyXpQ z^!9D4R4QZ`26V$9P6T3%h%s_>og`6&@B8F)j&iw7^?IGMxg0#tr))O+=+XM4e-{b` z2LOa>rAmsdEHK87sllLJE|>YPjt->LX)r<9{1}`=4hBJj09oE_xJWpRnVA_lu1C7A zV_{)oc<e7@H|n*zclhvO2(?-bE5((ySS+SXqVy^g1gbY0h{xl!J()zcTt+w&AyJk| z6h-K|PNF1Xc5aqxwFX(1h1uEJzkc@lXTO{Ld{Q4A9K_hz7=)82PvY*~yWIEvheV`1 zuG3FMLbX!C>gp=Wl?wTuhgz+MjZz8OY?g|}BCLi*Yinzmnwq+D@BY1CUA=O34FEJv z!~Fa_XzR0SZ*P}0O*^b<+HX2KI(ql+-3v|A5DJALZsrTivQVv5k<aHV`9l7;^;-Q; z<9{2k;v0Gf7M_{`P*SN>G878+CzHuHT3cIRNF)+1vLvJFG|f_}G`+gI`boW3|9ifW zU$t$!{<JE+E%u**836GqTzqOtk|bG?6+sXMfiXtD@B7VW)3<Hg@qORf0&>3z{x5B` V=tXj1`11e&002ovPDHLkV1fyI8=(LI literal 0 HcmV?d00001 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3f0ba7823..97ff5edf2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -98,6 +98,7 @@ set(keepassx_SOURCES gui/DatabaseTabWidget.cpp gui/DatabaseWidget.cpp gui/DatabaseWidgetStateSync.cpp + gui/DetailsWidget.cpp gui/DialogyWidget.cpp gui/DragTabBar.cpp gui/EditWidget.cpp diff --git a/src/core/Group.cpp b/src/core/Group.cpp index 644d2ff67..fa48d8cec 100644 --- a/src/core/Group.cpp +++ b/src/core/Group.cpp @@ -435,6 +435,18 @@ void Group::setParent(Database* db) QObject::setParent(db); } +QStringList Group::hierarchy() +{ + QStringList hierarchy; + Group* group = this; + while (group->parentGroup()) { + hierarchy << group->name(); + + group = group->parentGroup(); + } + return hierarchy; +} + Database* Group::database() { return m_db; diff --git a/src/core/Group.h b/src/core/Group.h index 27400703e..2a9d2b18c 100644 --- a/src/core/Group.h +++ b/src/core/Group.h @@ -106,6 +106,7 @@ public: Group* parentGroup(); const Group* parentGroup() const; void setParent(Group* parent, int index = -1); + QStringList hierarchy(); Database* database(); const Database* database() const; diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 6a425b5d7..0b83002e8 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -47,6 +47,7 @@ #include "gui/TotpDialog.h" #include "gui/DatabaseOpenWidget.h" #include "gui/DatabaseSettingsWidget.h" +#include "gui/DetailsWidget.h" #include "gui/KeePass1OpenWidget.h" #include "gui/MessageBox.h" #include "gui/UnlockDatabaseWidget.h" @@ -74,6 +75,9 @@ DatabaseWidget::DatabaseWidget(Database* db, QWidget* parent) mainLayout->addLayout(layout); m_splitter = new QSplitter(m_mainWidget); m_splitter->setChildrenCollapsible(false); + m_detailSplitter = new QSplitter(m_mainWidget); + m_detailSplitter->setOrientation(Qt::Vertical); + m_detailSplitter->setChildrenCollapsible(true); QWidget* rightHandSideWidget = new QWidget(m_splitter); @@ -99,10 +103,18 @@ DatabaseWidget::DatabaseWidget(Database* db, QWidget* parent) "border: 2px solid rgb(190, 190, 190);" "border-radius: 5px;"); + m_detailsView = new DetailsWidget(this); + QVBoxLayout* vLayout = new QVBoxLayout(rightHandSideWidget); vLayout->setMargin(0); vLayout->addWidget(m_searchingLabel); - vLayout->addWidget(m_entryView); + vLayout->addWidget(m_detailSplitter); + + m_detailSplitter->addWidget(m_entryView); + m_detailSplitter->addWidget(m_detailsView); + + m_detailSplitter->setStretchFactor(0, 80); + m_detailSplitter->setStretchFactor(1, 20); m_searchingLabel->setVisible(false); @@ -180,6 +192,12 @@ DatabaseWidget::DatabaseWidget(Database* db, QWidget* parent) connect(&m_fileWatchUnblockTimer, SIGNAL(timeout()), this, SLOT(unblockAutoReload())); connect(this, SIGNAL(currentChanged(int)), this, SLOT(emitCurrentModeChanged())); + connect(m_groupView, SIGNAL(groupPressed(Group*)), SLOT(emitPressedGroup(Group*))); + //connect(m_groupView, SIGNAL(groupChanged(Group*)), SLOT(emitPressedGroup(Group*))); + connect(m_entryView, SIGNAL(entryPressed(Entry*)), SLOT(emitPressedEntry(Entry*))); + //connect(m_entryView, SIGNAL(entrySelectionChanged()), SLOT(emitPressedEntry())); + connect(m_editEntryWidget, SIGNAL(editFinished(bool)), SLOT(emitPressedEntry())); + m_databaseModified = false; m_fileWatchTimer.setSingleShot(true); @@ -1041,6 +1059,32 @@ void DatabaseWidget::emitEntryContextMenuRequested(const QPoint& pos) emit entryContextMenuRequested(m_entryView->viewport()->mapToGlobal(pos)); } +void DatabaseWidget::emitPressedEntry() +{ + Entry* currentEntry = m_entryView->currentEntry(); + emitPressedEntry(currentEntry); +} + +void DatabaseWidget::emitPressedEntry(Entry* currentEntry) +{ + if (!currentEntry) { + // if no entry is pressed, leave in details the last entry + return; + } + + emit pressedEntry(currentEntry); +} + +void DatabaseWidget::emitPressedGroup(Group* currentGroup) +{ + if (!currentGroup) { + // if no group is pressed, leave in details the last group + return; + } + + emit pressedGroup(currentGroup); +} + bool DatabaseWidget::dbHasKey() const { return m_db->hasKey(); diff --git a/src/gui/DatabaseWidget.h b/src/gui/DatabaseWidget.h index 934820009..141248bd4 100644 --- a/src/gui/DatabaseWidget.h +++ b/src/gui/DatabaseWidget.h @@ -27,6 +27,7 @@ #include "core/Uuid.h" #include "gui/entry/EntryModel.h" +#include "gui/DetailsWidget.h" #include "gui/MessageWidget.h" #include "gui/csvImport/CsvImportWizard.h" @@ -47,6 +48,7 @@ class QSplitter; class QLabel; class UnlockDatabaseWidget; class MessageWidget; +class DetailsWidget; class UnlockDatabaseDialog; class QFileSystemWatcher; @@ -115,6 +117,8 @@ signals: void databaseMerged(Database* mergedDb); void groupContextMenuRequested(const QPoint& globalPos); void entryContextMenuRequested(const QPoint& globalPos); + void pressedEntry(Entry* selectedEntry); + void pressedGroup(Group* selectedGroup); void unlockedDatabase(); void listModeAboutToActivate(); void listModeActivated(); @@ -179,6 +183,9 @@ private slots: void switchToGroupEdit(Group* entry, bool create); void emitGroupContextMenuRequested(const QPoint& pos); void emitEntryContextMenuRequested(const QPoint& pos); + void emitPressedEntry(); + void emitPressedEntry(Entry* currentEntry); + void emitPressedGroup(Group* currentGroup); void updateMasterKey(bool accepted); void openDatabase(bool accepted); void mergeDatabase(bool accepted); @@ -209,6 +216,7 @@ private: UnlockDatabaseWidget* m_unlockDatabaseWidget; UnlockDatabaseDialog* m_unlockDatabaseDialog; QSplitter* m_splitter; + QSplitter* m_detailSplitter; GroupView* m_groupView; EntryView* m_entryView; QLabel* m_searchingLabel; @@ -219,6 +227,7 @@ private: Uuid m_groupBeforeLock; Uuid m_entryBeforeLock; MessageWidget* m_messageWidget; + DetailsWidget* m_detailsView; // Search state QString m_lastSearchText; diff --git a/src/gui/DetailsWidget.cpp b/src/gui/DetailsWidget.cpp new file mode 100644 index 000000000..d506d551e --- /dev/null +++ b/src/gui/DetailsWidget.cpp @@ -0,0 +1,213 @@ +/* + * Copyright (C) 2012 Felix Geyer <debfx@fobos.de> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "DetailsWidget.h" +#include "ui_DetailsWidget.h" + +#include <QDebug> + +#include "core/Config.h" +#include "core/FilePath.h" +#include "core/TimeInfo.h" + +DetailsWidget::DetailsWidget(QWidget* parent) + : QWidget(parent) + , m_ui(new Ui::DetailsWidget()) + , m_currentEntry(nullptr) + , m_currentGroup(nullptr) +{ + m_ui->setupUi(this); + + connect(parent, SIGNAL(pressedEntry(Entry*)), SLOT(getSelectedEntry(Entry*))); + connect(parent, SIGNAL(pressedGroup(Group*)), SLOT(getSelectedGroup(Group*))); + + m_ui->totpButton->setIcon(filePath()->icon("actions", "chronometer")); + m_ui->closeButton->setIcon(filePath()->icon("actions", "dialog-close")); + m_ui->togglePasswordButton->setIcon(filePath()->onOffIcon("actions", "password-show")); + + connect(m_ui->totpButton, SIGNAL(toggled(bool)), SLOT(showTotp(bool))); + connect(m_ui->closeButton, SIGNAL(toggled(bool)), SLOT(hideDetails())); + connect(m_ui->togglePasswordButton, SIGNAL(toggled(bool)), SLOT(togglePasswordShown(bool))); + + this->hide(); +} + +DetailsWidget::~DetailsWidget() +{ +} + +void DetailsWidget::getSelectedEntry(Entry* selectedEntry) +{ + m_currentEntry = selectedEntry; + + if (!config()->get("GUI/HideDetailsView").toBool()) { + this->show(); + } + + m_ui->stackedWidget->setCurrentIndex(EntryPreview); + + m_ui->totpButton->hide(); + m_ui->totpWidget->hide(); + m_ui->totpButton->setChecked(false); + + m_ui->entryIcon->setPixmap(m_currentEntry->iconPixmap()); + + QStringList hierarchy = m_currentEntry->group()->hierarchy(); + QString title = " / "; + for (QString parent : hierarchy) { + title.append(parent); + title.append(" / "); + } + title.append(m_currentEntry->title()); + m_ui->titleLabel->setText(title); + + m_ui->usernameLabel->setText(m_currentEntry->username()); + m_ui->groupLabel->setText(m_currentEntry->group()->name()); + m_ui->notesEdit->setText(m_currentEntry->notes()); + + if (!config()->get("security/hidepassworddetails").toBool()) { + m_ui->passwordEdit->setText(m_currentEntry->password()); + m_ui->togglePasswordButton->show(); + } else { + m_ui->passwordEdit->setText("****"); + m_ui->togglePasswordButton->hide(); + } + + QString url = m_currentEntry->webUrl(); + if (url != "") { + url = QString("<a href=\"%1\">%2</a>").arg(url).arg(shortUrl(url)); + m_ui->urlLabel->setOpenExternalLinks(true); + } else { + url = shortUrl(m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->url())); + m_ui->urlLabel->setOpenExternalLinks(false); + } + m_ui->urlLabel->setText(url); + + TimeInfo entryTime = m_currentEntry->timeInfo(); + if (entryTime.expires()) { + m_ui->expirationLabel->setText(entryTime.expiryTime().toString(Qt::DefaultLocaleShortDate)); + } else { + m_ui->expirationLabel->setText(tr("Never")); + } + + m_ui->creationLabel->setText(entryTime.creationTime().toString(Qt::DefaultLocaleShortDate)); + m_ui->modifyLabel->setText(entryTime.lastModificationTime().toString(Qt::DefaultLocaleShortDate)); + m_ui->accessLabel->setText(entryTime.lastAccessTime().toString(Qt::DefaultLocaleShortDate)); + + if (m_currentEntry->hasTotp()) { + m_ui->totpButton->show(); + updateTotp(); + + m_step = m_currentEntry->totpStep(); + + m_timer = new QTimer(this); + connect(m_timer, SIGNAL(timeout()), this, SLOT(updateTotp())); + m_timer->start(m_step * 10); + } +} + +void DetailsWidget::getSelectedGroup(Group* selectedGroup) +{ + m_currentGroup = selectedGroup; + + if (!config()->get("GUI/HideDetailsView").toBool()) { + this->show(); + } + + m_ui->stackedWidget->setCurrentIndex(GroupPreview); + + m_ui->totpButton->hide(); + m_ui->totpWidget->hide(); + + m_ui->entryIcon->setPixmap(m_currentGroup->iconPixmap()); + + QStringList hierarchy = m_currentGroup->hierarchy(); + QString title = " / "; + for (QString parent : hierarchy) { + title.append(parent); + title.append(" / "); + } + m_ui->titleLabel->setText(title); + + m_ui->notesEdit->setText(m_currentGroup->notes()); + + QString searching = tr("Disabled"); + if (m_currentGroup->resolveSearchingEnabled()) { + searching = tr("Enabled"); + } + m_ui->searchingLabel->setText(searching); + + QString autotype = tr("Disabled"); + if (m_currentGroup->resolveAutoTypeEnabled()) { + autotype = tr("Enabled"); + } + m_ui->autotypeLabel->setText(autotype); + + TimeInfo groupTime = m_currentGroup->timeInfo(); + if (groupTime.expires()) { + m_ui->groupExpirationLabel->setText(groupTime.expiryTime().toString(Qt::DefaultLocaleShortDate)); + } else { + m_ui->groupExpirationLabel->setText(tr("Never")); + } + + m_ui->groupCreationLabel->setText(groupTime.creationTime().toString(Qt::DefaultLocaleShortDate)); + m_ui->groupModifyLabel->setText(groupTime.lastModificationTime().toString(Qt::DefaultLocaleShortDate)); + m_ui->groupAccessLabel->setText(groupTime.lastAccessTime().toString(Qt::DefaultLocaleShortDate)); +} + +void DetailsWidget::updateTotp() +{ + QString totpCode = m_currentEntry->totp(); + QString firstHalf = totpCode.left(totpCode.size()/2); + QString secondHalf = totpCode.right(totpCode.size()/2); + m_ui->totpLabel->setText(firstHalf + " " + secondHalf); +} + +void DetailsWidget::showTotp(bool visible) +{ + if (visible){ + m_ui->totpWidget->show(); + } else { + m_ui->totpWidget->hide(); + } +} + +QString DetailsWidget::shortUrl(QString url) +{ + QString newurl = ""; + if (url.length() > 60) { + newurl.append(url.left(20)); + newurl.append("..."); + newurl.append(url.right(20)); + return newurl; + } + return url; +} + +void DetailsWidget::hideDetails() +{ + this->hide(); +} + +void DetailsWidget::togglePasswordShown(bool showing) +{ + m_ui->passwordEdit->setShowPassword(showing); + bool blockSignals = m_ui->togglePasswordButton->blockSignals(true); + m_ui->togglePasswordButton->setChecked(showing); + m_ui->togglePasswordButton->blockSignals(blockSignals); +} \ No newline at end of file diff --git a/src/gui/DetailsWidget.h b/src/gui/DetailsWidget.h new file mode 100644 index 000000000..89e6cf62b --- /dev/null +++ b/src/gui/DetailsWidget.h @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef KEEPASSX_DETAILSWIDGET_H +#define KEEPASSX_DETAILSWIDGET_H + +#include <QWidget> + +#include "gui/DatabaseWidget.h" + +namespace Ui { + class DetailsWidget; +} + +class DetailsWidget : public QWidget +{ + Q_OBJECT + +public: + explicit DetailsWidget(QWidget* parent = nullptr); + ~DetailsWidget(); + + enum StackedWidgetIndex + { + EntryPreview = 0, + GroupPreview = 1, + }; + +private slots: + void getSelectedEntry(Entry* selectedEntry); + void getSelectedGroup(Group* selectedGroup); + void showTotp(bool visible); + void updateTotp(); + void hideDetails(); + void togglePasswordShown(bool showing); + +private: + const QScopedPointer<Ui::DetailsWidget> m_ui; + Entry* m_currentEntry; + Group* m_currentGroup; + quint8 m_step; + QTimer* m_timer; + QString shortUrl(QString url); +}; + +#endif // KEEPASSX_DETAILSWIDGET_H diff --git a/src/gui/DetailsWidget.ui b/src/gui/DetailsWidget.ui new file mode 100644 index 000000000..fb6b7fb24 --- /dev/null +++ b/src/gui/DetailsWidget.ui @@ -0,0 +1,552 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>DetailsWidget</class> + <widget class="QWidget" name="DetailsWidget"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>630</width> + <height>207</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="MinimumExpanding" vsizetype="Minimum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>16777215</width> + <height>235</height> + </size> + </property> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout" stretch="0,0,0,0,0,0,0"> + <property name="sizeConstraint"> + <enum>QLayout::SetDefaultConstraint</enum> + </property> + <item> + <widget class="QLabel" name="entryIcon"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>20</width> + <height>16777215</height> + </size> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="titleLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="font"> + <font> + <pointsize>12</pointsize> + </font> + </property> + <property name="textFormat"> + <enum>Qt::AutoText</enum> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QWidget" name="totpWidget" native="true"> + <layout class="QGridLayout" name="gridLayout_3"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item row="0" column="0"> + <widget class="QLabel" name="totpLabel"> + <property name="font"> + <font> + <pointsize>10</pointsize> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QToolButton" name="totpButton"> + <property name="toolTip"> + <string>Generate TOTP Token</string> + </property> + <property name="text"> + <string/> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="closeButton"> + <property name="toolTip"> + <string>Generate TOTP Token</string> + </property> + <property name="text"> + <string/> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QFrame" name="frame"> + <property name="frameShape"> + <enum>QFrame::StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Raised</enum> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QStackedWidget" name="stackedWidget"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Minimum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="currentIndex"> + <number>0</number> + </property> + <widget class="QWidget" name="entryPage"> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_6"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_7"> + <item> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0"> + <widget class="QLabel" name="groupLabel_2"> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Group</string> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="urlLabel_2"> + <property name="font"> + <font> + <pointsize>9</pointsize> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>URL</string> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="passwordLabel_2"> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Password</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="usernameLabel_2"> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Username</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLabel" name="groupLabel"/> + </item> + <item row="1" column="1"> + <widget class="QLabel" name="usernameLabel"/> + </item> + <item row="2" column="1"> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="PasswordEdit" name="passwordEdit"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maxLength"> + <number>999</number> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="togglePasswordButton"> + <property name="checkable"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </item> + <item row="3" column="1"> + <widget class="QLabel" name="urlLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </item> + <item> + <layout class="QGridLayout" name="gridLayout_2"> + <item row="2" column="0"> + <widget class="QLabel" name="modifyLabel_2"> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Modification</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="accessLabel_2"> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Access</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLabel" name="accessLabel"/> + </item> + <item row="0" column="1"> + <widget class="QLabel" name="creationLabel"/> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="creationLabel_2"> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Creation</string> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="expirationLabel_2"> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Expiration</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLabel" name="modifyLabel"/> + </item> + <item row="3" column="1"> + <widget class="QLabel" name="expirationLabel"/> + </item> + </layout> + </item> + </layout> + </item> + </layout> + </widget> + <widget class="QWidget" name="groupPage"> + <layout class="QVBoxLayout" name="verticalLayout"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_8"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_9"> + <item> + <layout class="QGridLayout" name="gridLayout_4"> + <item row="0" column="1"> + <widget class="QLabel" name="autotypeLabel"/> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="autotypeLabel_2"> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Autotype</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLabel" name="searchingLabel"/> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="searchingLabel_2"> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Searching</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLabel" name="groupExpirationLabel"/> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="groupExpirationLabel_2"> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Expiration</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </item> + <item> + <layout class="QGridLayout" name="gridLayout_5"> + <item row="2" column="0"> + <widget class="QLabel" name="groupModifyLabel_2"> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Modification</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="groupAccessLabel_2"> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Access</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLabel" name="groupAccessLabel"/> + </item> + <item row="0" column="1"> + <widget class="QLabel" name="groupCreationLabel"/> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="groupCreationLabel_2"> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Creation</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLabel" name="groupModifyLabel"/> + </item> + </layout> + </item> + </layout> + </item> + </layout> + </widget> + </widget> + </item> + <item> + <layout class="QFormLayout" name="formLayout"> + <item row="0" column="1"> + <widget class="QTextEdit" name="notesEdit"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>1</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>50</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>16777215</width> + <height>50</height> + </size> + </property> + <property name="focusPolicy"> + <enum>Qt::ClickFocus</enum> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="notesLabel_2"> + <property name="text"> + <string>Notes</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="Line" name="line"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + </layout> + <action name="searchIcon"> + <property name="text"> + <string>Search</string> + </property> + </action> + <action name="clearIcon"> + <property name="text"> + <string>Clear</string> + </property> + </action> + </widget> + <customwidgets> + <customwidget> + <class>PasswordEdit</class> + <extends>QLineEdit</extends> + <header>gui/PasswordEdit.h</header> + <container>1</container> + </customwidget> + </customwidgets> + <resources/> + <connections/> +</ui> diff --git a/src/gui/SettingsWidget.cpp b/src/gui/SettingsWidget.cpp index 8385bf262..aa0e56648 100644 --- a/src/gui/SettingsWidget.cpp +++ b/src/gui/SettingsWidget.cpp @@ -134,6 +134,7 @@ void SettingsWidget::loadSettings() m_generalUi->languageComboBox->setCurrentIndex(defaultIndex); } + m_generalUi->detailsHideCheckBox->setChecked(config()->get("GUI/HideDetailsView").toBool()); m_generalUi->systrayShowCheckBox->setChecked(config()->get("GUI/ShowTrayIcon").toBool()); m_generalUi->systrayMinimizeToTrayCheckBox->setChecked(config()->get("GUI/MinimizeToTray").toBool()); m_generalUi->systrayMinimizeOnCloseCheckBox->setChecked(config()->get("GUI/MinimizeOnClose").toBool()); @@ -160,6 +161,7 @@ void SettingsWidget::loadSettings() m_secUi->fallbackToGoogle->setChecked(config()->get("security/IconDownloadFallbackToGoogle").toBool()); m_secUi->passwordCleartextCheckBox->setChecked(config()->get("security/passwordscleartext").toBool()); + m_secUi->passwordDetailsCleartextCheckBox->setChecked(config()->get("security/hidepassworddetails").toBool()); m_secUi->passwordRepeatCheckBox->setChecked(config()->get("security/passwordsrepeat").toBool()); @@ -203,6 +205,7 @@ void SettingsWidget::saveSettings() config()->set("GUI/Language", m_generalUi->languageComboBox->itemData(currentLangIndex).toString()); + config()->set("GUI/HideDetailsView", m_generalUi->detailsHideCheckBox->isChecked()); config()->set("GUI/ShowTrayIcon", m_generalUi->systrayShowCheckBox->isChecked()); config()->set("GUI/MinimizeToTray", m_generalUi->systrayMinimizeToTrayCheckBox->isChecked()); config()->set("GUI/MinimizeOnClose", m_generalUi->systrayMinimizeOnCloseCheckBox->isChecked()); @@ -226,6 +229,7 @@ void SettingsWidget::saveSettings() config()->set("security/IconDownloadFallbackToGoogle", m_secUi->fallbackToGoogle->isChecked()); config()->set("security/passwordscleartext", m_secUi->passwordCleartextCheckBox->isChecked()); + config()->set("security/hidepassworddetails", m_secUi->passwordDetailsCleartextCheckBox->isChecked()); config()->set("security/passwordsrepeat", m_secUi->passwordRepeatCheckBox->isChecked()); // Security: clear storage if related settings are disabled diff --git a/src/gui/SettingsWidgetGeneral.ui b/src/gui/SettingsWidgetGeneral.ui index 1e62104cc..7dc4487cf 100644 --- a/src/gui/SettingsWidgetGeneral.ui +++ b/src/gui/SettingsWidgetGeneral.ui @@ -153,6 +153,13 @@ </property> </spacer> </item> + <item> + <widget class="QCheckBox" name="detailsHideCheckBox"> + <property name="text"> + <string>Hide the Details view</string> + </property> + </widget> + </item> <item> <widget class="QCheckBox" name="systrayShowCheckBox"> <property name="text"> diff --git a/src/gui/SettingsWidgetSecurity.ui b/src/gui/SettingsWidgetSecurity.ui index 4233fdbd1..53c69db6d 100644 --- a/src/gui/SettingsWidgetSecurity.ui +++ b/src/gui/SettingsWidgetSecurity.ui @@ -136,6 +136,13 @@ </property> </widget> </item> + <item> + <widget class="QCheckBox" name="passwordDetailsCleartextCheckBox"> + <property name="text"> + <string>Hide passwords in the preview panel</string> + </property> + </widget> + </item> </layout> </widget> </item> diff --git a/src/gui/entry/EntryView.cpp b/src/gui/entry/EntryView.cpp index 1bdd4fbcf..ac8e66782 100644 --- a/src/gui/entry/EntryView.cpp +++ b/src/gui/entry/EntryView.cpp @@ -49,6 +49,8 @@ EntryView::EntryView(QWidget* parent) connect(selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), SIGNAL(entrySelectionChanged())); connect(m_model, SIGNAL(switchedToEntryListMode()), SLOT(switchToEntryListMode())); connect(m_model, SIGNAL(switchedToGroupMode()), SLOT(switchToGroupMode())); + + connect(this, SIGNAL(clicked(QModelIndex)), SLOT(emitEntryPressed(QModelIndex))); } void EntryView::keyPressEvent(QKeyEvent* event) @@ -99,6 +101,11 @@ void EntryView::emitEntryActivated(const QModelIndex& index) emit entryActivated(entry, static_cast<EntryModel::ModelColumn>(m_sortModel->mapToSource(index).column())); } +void EntryView::emitEntryPressed(const QModelIndex& index) +{ + emit entryPressed(entryFromIndex(index)); +} + void EntryView::setModel(QAbstractItemModel* model) { Q_UNUSED(model); diff --git a/src/gui/entry/EntryView.h b/src/gui/entry/EntryView.h index 6a545f62a..14c6b7ccc 100644 --- a/src/gui/entry/EntryView.h +++ b/src/gui/entry/EntryView.h @@ -47,6 +47,7 @@ public slots: signals: void entryActivated(Entry* entry, EntryModel::ModelColumn column); + void entryPressed(Entry* entry); void entrySelectionChanged(); protected: @@ -54,6 +55,7 @@ protected: private slots: void emitEntryActivated(const QModelIndex& index); + void emitEntryPressed(const QModelIndex& index); void switchToEntryListMode(); void switchToGroupMode(); diff --git a/src/gui/group/GroupView.cpp b/src/gui/group/GroupView.cpp index e9649e441..82d01e31c 100644 --- a/src/gui/group/GroupView.cpp +++ b/src/gui/group/GroupView.cpp @@ -41,6 +41,8 @@ GroupView::GroupView(Database* db, QWidget* parent) connect(selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), SLOT(emitGroupChanged())); + connect(this, SIGNAL(clicked(QModelIndex)), SLOT(emitGroupPressed(QModelIndex))); + modelReset(); setDragEnabled(true); @@ -126,6 +128,11 @@ void GroupView::emitGroupChanged() emit groupChanged(currentGroup()); } +void GroupView::emitGroupPressed(const QModelIndex& index) +{ + emit groupPressed(m_model->groupFromIndex(index)); +} + void GroupView::syncExpandedState(const QModelIndex& parent, int start, int end) { for (int row = start; row <= end; row++) { diff --git a/src/gui/group/GroupView.h b/src/gui/group/GroupView.h index eaa290725..0a084425d 100644 --- a/src/gui/group/GroupView.h +++ b/src/gui/group/GroupView.h @@ -38,11 +38,13 @@ public: signals: void groupChanged(Group* group); + void groupPressed(Group* group); private slots: void expandedChanged(const QModelIndex& index); void emitGroupChanged(const QModelIndex& index); void emitGroupChanged(); + void emitGroupPressed(const QModelIndex& index); void syncExpandedState(const QModelIndex& parent, int start, int end); void modelReset(); From 0e6fedc056f2f03400a3048c71c2faefd278f2df Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Thu, 31 Aug 2017 00:52:05 +0200 Subject: [PATCH 073/402] fix group parent, add details update by keyboard --- src/core/Group.cpp | 10 +++++--- src/gui/DatabaseWidget.cpp | 4 +-- src/gui/DetailsWidget.cpp | 52 ++++++++++++++++++++++---------------- src/gui/DetailsWidget.h | 2 +- src/gui/DetailsWidget.ui | 38 +++------------------------- 5 files changed, 43 insertions(+), 63 deletions(-) diff --git a/src/core/Group.cpp b/src/core/Group.cpp index fa48d8cec..1fee54a43 100644 --- a/src/core/Group.cpp +++ b/src/core/Group.cpp @@ -439,10 +439,14 @@ QStringList Group::hierarchy() { QStringList hierarchy; Group* group = this; - while (group->parentGroup()) { - hierarchy << group->name(); - + Group* parent = m_parent; + hierarchy << group->name(); + + while (parent) { group = group->parentGroup(); + parent = group->parentGroup(); + + hierarchy << group->name(); } return hierarchy; } diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 0b83002e8..6571668c8 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -193,9 +193,9 @@ DatabaseWidget::DatabaseWidget(Database* db, QWidget* parent) connect(this, SIGNAL(currentChanged(int)), this, SLOT(emitCurrentModeChanged())); connect(m_groupView, SIGNAL(groupPressed(Group*)), SLOT(emitPressedGroup(Group*))); - //connect(m_groupView, SIGNAL(groupChanged(Group*)), SLOT(emitPressedGroup(Group*))); + connect(m_groupView, SIGNAL(groupChanged(Group*)), SLOT(emitPressedGroup(Group*))); connect(m_entryView, SIGNAL(entryPressed(Entry*)), SLOT(emitPressedEntry(Entry*))); - //connect(m_entryView, SIGNAL(entrySelectionChanged()), SLOT(emitPressedEntry())); + connect(m_entryView, SIGNAL(entrySelectionChanged()), SLOT(emitPressedEntry())); connect(m_editEntryWidget, SIGNAL(editFinished(bool)), SLOT(emitPressedEntry())); m_databaseModified = false; diff --git a/src/gui/DetailsWidget.cpp b/src/gui/DetailsWidget.cpp index d506d551e..ee051e9cb 100644 --- a/src/gui/DetailsWidget.cpp +++ b/src/gui/DetailsWidget.cpp @@ -24,6 +24,7 @@ #include "core/Config.h" #include "core/FilePath.h" #include "core/TimeInfo.h" +#include "gui/Clipboard.h" DetailsWidget::DetailsWidget(QWidget* parent) : QWidget(parent) @@ -38,11 +39,9 @@ DetailsWidget::DetailsWidget(QWidget* parent) m_ui->totpButton->setIcon(filePath()->icon("actions", "chronometer")); m_ui->closeButton->setIcon(filePath()->icon("actions", "dialog-close")); - m_ui->togglePasswordButton->setIcon(filePath()->onOffIcon("actions", "password-show")); connect(m_ui->totpButton, SIGNAL(toggled(bool)), SLOT(showTotp(bool))); connect(m_ui->closeButton, SIGNAL(toggled(bool)), SLOT(hideDetails())); - connect(m_ui->togglePasswordButton, SIGNAL(toggled(bool)), SLOT(togglePasswordShown(bool))); this->hide(); } @@ -67,25 +66,31 @@ void DetailsWidget::getSelectedEntry(Entry* selectedEntry) m_ui->entryIcon->setPixmap(m_currentEntry->iconPixmap()); - QStringList hierarchy = m_currentEntry->group()->hierarchy(); QString title = " / "; - for (QString parent : hierarchy) { - title.append(parent); - title.append(" / "); + + Group* entry_group = m_currentEntry->group(); + if (entry_group) { + QStringList hierarchy = entry_group->hierarchy(); + + for (QString parent : hierarchy) { + title.append(parent); + title.append(" / "); + } } - title.append(m_currentEntry->title()); + title.append(m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->title())); m_ui->titleLabel->setText(title); - m_ui->usernameLabel->setText(m_currentEntry->username()); - m_ui->groupLabel->setText(m_currentEntry->group()->name()); - m_ui->notesEdit->setText(m_currentEntry->notes()); + m_ui->usernameLabel->setText(m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->username())); + if (entry_group) { + m_ui->groupLabel->setText(entry_group->name()); + } + m_ui->notesEdit->setText(m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->notes())); if (!config()->get("security/hidepassworddetails").toBool()) { - m_ui->passwordEdit->setText(m_currentEntry->password()); - m_ui->togglePasswordButton->show(); + m_ui->passwordLabel->setText(shortPassword(m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->password()))); + m_ui->passwordLabel->setToolTip(m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->password())); } else { - m_ui->passwordEdit->setText("****"); - m_ui->togglePasswordButton->hide(); + m_ui->passwordLabel->setText("****"); } QString url = m_currentEntry->webUrl(); @@ -199,15 +204,18 @@ QString DetailsWidget::shortUrl(QString url) return url; } +QString DetailsWidget::shortPassword(QString password) +{ + QString newpassword = ""; + if (password.length() > 60) { + newpassword.append(password.left(50)); + newpassword.append("..."); + return newpassword; + } + return password; +} + void DetailsWidget::hideDetails() { this->hide(); } - -void DetailsWidget::togglePasswordShown(bool showing) -{ - m_ui->passwordEdit->setShowPassword(showing); - bool blockSignals = m_ui->togglePasswordButton->blockSignals(true); - m_ui->togglePasswordButton->setChecked(showing); - m_ui->togglePasswordButton->blockSignals(blockSignals); -} \ No newline at end of file diff --git a/src/gui/DetailsWidget.h b/src/gui/DetailsWidget.h index 89e6cf62b..d4accf08f 100644 --- a/src/gui/DetailsWidget.h +++ b/src/gui/DetailsWidget.h @@ -46,7 +46,6 @@ private slots: void showTotp(bool visible); void updateTotp(); void hideDetails(); - void togglePasswordShown(bool showing); private: const QScopedPointer<Ui::DetailsWidget> m_ui; @@ -55,6 +54,7 @@ private: quint8 m_step; QTimer* m_timer; QString shortUrl(QString url); + QString shortPassword(QString password); }; #endif // KEEPASSX_DETAILSWIDGET_H diff --git a/src/gui/DetailsWidget.ui b/src/gui/DetailsWidget.ui index fb6b7fb24..b4c3150fb 100644 --- a/src/gui/DetailsWidget.ui +++ b/src/gui/DetailsWidget.ui @@ -235,33 +235,6 @@ <item row="1" column="1"> <widget class="QLabel" name="usernameLabel"/> </item> - <item row="2" column="1"> - <layout class="QHBoxLayout" name="horizontalLayout_2"> - <item> - <widget class="PasswordEdit" name="passwordEdit"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="maxLength"> - <number>999</number> - </property> - <property name="readOnly"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="togglePasswordButton"> - <property name="checkable"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </item> <item row="3" column="1"> <widget class="QLabel" name="urlLabel"> <property name="sizePolicy"> @@ -275,6 +248,9 @@ </property> </widget> </item> + <item row="2" column="1"> + <widget class="QLabel" name="passwordLabel"/> + </item> </layout> </item> </layout> @@ -539,14 +515,6 @@ </property> </action> </widget> - <customwidgets> - <customwidget> - <class>PasswordEdit</class> - <extends>QLineEdit</extends> - <header>gui/PasswordEdit.h</header> - <container>1</container> - </customwidget> - </customwidgets> <resources/> <connections/> </ui> From 4a5fc2104f82b1e43a9d9d12b909ad65c97a8014 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Thu, 31 Aug 2017 00:57:50 +0200 Subject: [PATCH 074/402] fix notes label --- src/gui/DetailsWidget.ui | 37 ++++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/src/gui/DetailsWidget.ui b/src/gui/DetailsWidget.ui index b4c3150fb..0f202c0f6 100644 --- a/src/gui/DetailsWidget.ui +++ b/src/gui/DetailsWidget.ui @@ -459,6 +459,36 @@ </item> <item> <layout class="QFormLayout" name="formLayout"> + <item row="0" column="0"> + <layout class="QVBoxLayout" name="verticalLayout_4"> + <item> + <widget class="QLabel" name="notesLabel_2"> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Notes</string> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> <item row="0" column="1"> <widget class="QTextEdit" name="notesEdit"> <property name="sizePolicy"> @@ -487,13 +517,6 @@ </property> </widget> </item> - <item row="0" column="0"> - <widget class="QLabel" name="notesLabel_2"> - <property name="text"> - <string>Notes</string> - </property> - </widget> - </item> </layout> </item> <item> From eb6582266533a979a753327b7f222867b7d146c3 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Wed, 27 Sep 2017 19:18:13 +0200 Subject: [PATCH 075/402] layout update --- src/core/Group.cpp | 5 +- src/gui/DatabaseWidget.h | 1 - src/gui/DetailsWidget.cpp | 67 +++- src/gui/DetailsWidget.h | 10 + src/gui/DetailsWidget.ui | 727 ++++++++++++++++++++------------------ 5 files changed, 449 insertions(+), 361 deletions(-) diff --git a/src/core/Group.cpp b/src/core/Group.cpp index 1fee54a43..6f70db347 100644 --- a/src/core/Group.cpp +++ b/src/core/Group.cpp @@ -440,14 +440,15 @@ QStringList Group::hierarchy() QStringList hierarchy; Group* group = this; Group* parent = m_parent; - hierarchy << group->name(); + hierarchy.prepend(group->name()); while (parent) { group = group->parentGroup(); parent = group->parentGroup(); - hierarchy << group->name(); + hierarchy.prepend(group->name()); } + return hierarchy; } diff --git a/src/gui/DatabaseWidget.h b/src/gui/DatabaseWidget.h index 141248bd4..404adb528 100644 --- a/src/gui/DatabaseWidget.h +++ b/src/gui/DatabaseWidget.h @@ -27,7 +27,6 @@ #include "core/Uuid.h" #include "gui/entry/EntryModel.h" -#include "gui/DetailsWidget.h" #include "gui/MessageWidget.h" #include "gui/csvImport/CsvImportWizard.h" diff --git a/src/gui/DetailsWidget.cpp b/src/gui/DetailsWidget.cpp index ee051e9cb..45284c840 100644 --- a/src/gui/DetailsWidget.cpp +++ b/src/gui/DetailsWidget.cpp @@ -25,10 +25,12 @@ #include "core/FilePath.h" #include "core/TimeInfo.h" #include "gui/Clipboard.h" +#include "gui/DatabaseWidget.h" DetailsWidget::DetailsWidget(QWidget* parent) : QWidget(parent) , m_ui(new Ui::DetailsWidget()) + , m_locked(false) , m_currentEntry(nullptr) , m_currentGroup(nullptr) { @@ -36,6 +38,7 @@ DetailsWidget::DetailsWidget(QWidget* parent) connect(parent, SIGNAL(pressedEntry(Entry*)), SLOT(getSelectedEntry(Entry*))); connect(parent, SIGNAL(pressedGroup(Group*)), SLOT(getSelectedGroup(Group*))); + connect(parent, SIGNAL(currentModeChanged(DatabaseWidget::Mode)), SLOT(setDatabaseMode(DatabaseWidget::Mode))); m_ui->totpButton->setIcon(filePath()->icon("actions", "chronometer")); m_ui->closeButton->setIcon(filePath()->icon("actions", "dialog-close")); @@ -60,6 +63,9 @@ void DetailsWidget::getSelectedEntry(Entry* selectedEntry) m_ui->stackedWidget->setCurrentIndex(EntryPreview); + m_ui->tabWidget->setTabEnabled(AttributesTab, false); + m_ui->tabWidget->setTabEnabled(NotesTab, false); + m_ui->totpButton->hide(); m_ui->totpWidget->hide(); m_ui->totpButton->setChecked(false); @@ -81,10 +87,6 @@ void DetailsWidget::getSelectedEntry(Entry* selectedEntry) m_ui->titleLabel->setText(title); m_ui->usernameLabel->setText(m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->username())); - if (entry_group) { - m_ui->groupLabel->setText(entry_group->name()); - } - m_ui->notesEdit->setText(m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->notes())); if (!config()->get("security/hidepassworddetails").toBool()) { m_ui->passwordLabel->setText(shortPassword(m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->password()))); @@ -110,10 +112,6 @@ void DetailsWidget::getSelectedEntry(Entry* selectedEntry) m_ui->expirationLabel->setText(tr("Never")); } - m_ui->creationLabel->setText(entryTime.creationTime().toString(Qt::DefaultLocaleShortDate)); - m_ui->modifyLabel->setText(entryTime.lastModificationTime().toString(Qt::DefaultLocaleShortDate)); - m_ui->accessLabel->setText(entryTime.lastAccessTime().toString(Qt::DefaultLocaleShortDate)); - if (m_currentEntry->hasTotp()) { m_ui->totpButton->show(); updateTotp(); @@ -124,6 +122,28 @@ void DetailsWidget::getSelectedEntry(Entry* selectedEntry) connect(m_timer, SIGNAL(timeout()), this, SLOT(updateTotp())); m_timer->start(m_step * 10); } + + QString notes = m_currentEntry->notes(); + if (!notes.isEmpty()) { + m_ui->tabWidget->setTabEnabled(NotesTab, true); + m_ui->notesEdit->setText(m_currentEntry->resolveMultiplePlaceholders(notes)); + } + + QStringList customAttributes = m_currentEntry->attributes()->customKeys(); + if (customAttributes.size() > 0) { + m_ui->tabWidget->setTabEnabled(AttributesTab, true); + m_ui->attributesEdit->clear(); + + QString attributesText = QString(); + for (const QString& key : customAttributes) { + QString value = m_currentEntry->attributes()->value(key); + if (m_currentEntry->attributes()->isProtected(key)) { + value = "<i>[PROTECTED]</i>"; + } + attributesText.append(QString("<b>%1</b>: %2<br/>").arg(key, value)); + } + m_ui->attributesEdit->setText(attributesText); + } } void DetailsWidget::getSelectedGroup(Group* selectedGroup) @@ -136,13 +156,18 @@ void DetailsWidget::getSelectedGroup(Group* selectedGroup) m_ui->stackedWidget->setCurrentIndex(GroupPreview); + m_ui->tabWidget->setTabEnabled(AttributesTab, false); + m_ui->tabWidget->setTabEnabled(NotesTab, false); + m_ui->totpButton->hide(); m_ui->totpWidget->hide(); m_ui->entryIcon->setPixmap(m_currentGroup->iconPixmap()); - QStringList hierarchy = m_currentGroup->hierarchy(); QString title = " / "; + + QStringList hierarchy = m_currentGroup->hierarchy(); + for (QString parent : hierarchy) { title.append(parent); title.append(" / "); @@ -177,6 +202,10 @@ void DetailsWidget::getSelectedGroup(Group* selectedGroup) void DetailsWidget::updateTotp() { + if (m_locked) { + m_timer->stop(); + return; + } QString totpCode = m_currentEntry->totp(); QString firstHalf = totpCode.left(totpCode.size()/2); QString secondHalf = totpCode.right(totpCode.size()/2); @@ -219,3 +248,23 @@ void DetailsWidget::hideDetails() { this->hide(); } + +void DetailsWidget::setDatabaseMode(DatabaseWidget::Mode mode) +{ + m_locked = false; + if (mode == DatabaseWidget::LockedMode) { + m_locked = true; + return; + } + if (mode == DatabaseWidget::ViewMode) { + if (m_ui->stackedWidget->currentIndex() == GroupPreview) { + getSelectedGroup(m_currentGroup); + } else { + getSelectedEntry(m_currentEntry); + } + } +} + +void DetailsWidget::copyToClipboard(const QString& text) { + clipboard()->setText(text); +} \ No newline at end of file diff --git a/src/gui/DetailsWidget.h b/src/gui/DetailsWidget.h index d4accf08f..44989fd1b 100644 --- a/src/gui/DetailsWidget.h +++ b/src/gui/DetailsWidget.h @@ -40,15 +40,25 @@ public: GroupPreview = 1, }; + enum TabWidgetIndex + { + GeneralTab = 0, + AttributesTab = 1, + NotesTab = 2, + }; + private slots: void getSelectedEntry(Entry* selectedEntry); void getSelectedGroup(Group* selectedGroup); void showTotp(bool visible); void updateTotp(); void hideDetails(); + void setDatabaseMode(DatabaseWidget::Mode mode); + void copyToClipboard(const QString& text); private: const QScopedPointer<Ui::DetailsWidget> m_ui; + bool m_locked; Entry* m_currentEntry; Group* m_currentGroup; quint8 m_step; diff --git a/src/gui/DetailsWidget.ui b/src/gui/DetailsWidget.ui index 0f202c0f6..2bc6653c8 100644 --- a/src/gui/DetailsWidget.ui +++ b/src/gui/DetailsWidget.ui @@ -7,7 +7,7 @@ <x>0</x> <y>0</y> <width>630</width> - <height>207</height> + <height>180</height> </rect> </property> <property name="sizePolicy"> @@ -19,7 +19,7 @@ <property name="maximumSize"> <size> <width>16777215</width> - <height>235</height> + <height>200</height> </size> </property> <layout class="QVBoxLayout" name="verticalLayout_3"> @@ -146,332 +146,326 @@ </layout> </item> <item> - <widget class="QStackedWidget" name="stackedWidget"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Minimum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> + <widget class="QTabWidget" name="tabWidget"> <property name="currentIndex"> <number>0</number> </property> - <widget class="QWidget" name="entryPage"> - <layout class="QVBoxLayout" name="verticalLayout_2"> - <property name="leftMargin"> - <number>0</number> - </property> - <property name="topMargin"> - <number>0</number> - </property> - <property name="rightMargin"> - <number>0</number> - </property> - <property name="bottomMargin"> - <number>0</number> - </property> + <property name="documentMode"> + <bool>false</bool> + </property> + <property name="tabsClosable"> + <bool>false</bool> + </property> + <property name="movable"> + <bool>false</bool> + </property> + <property name="tabBarAutoHide"> + <bool>false</bool> + </property> + <widget class="QWidget" name="generalTab"> + <attribute name="title"> + <string>General</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_5"> <item> - <layout class="QHBoxLayout" name="horizontalLayout_6"> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_7"> + <widget class="QStackedWidget" name="stackedWidget"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Minimum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="currentIndex"> + <number>0</number> + </property> + <widget class="QWidget" name="entryPage"> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> <item> - <layout class="QGridLayout" name="gridLayout"> - <item row="0" column="0"> - <widget class="QLabel" name="groupLabel_2"> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Group</string> - </property> - </widget> - </item> - <item row="3" column="0"> - <widget class="QLabel" name="urlLabel_2"> - <property name="font"> - <font> - <pointsize>9</pointsize> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>URL</string> - </property> - </widget> - </item> - <item row="2" column="0"> - <widget class="QLabel" name="passwordLabel_2"> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Password</string> - </property> - </widget> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="usernameLabel_2"> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Username</string> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QLabel" name="groupLabel"/> - </item> - <item row="1" column="1"> - <widget class="QLabel" name="usernameLabel"/> - </item> - <item row="3" column="1"> - <widget class="QLabel" name="urlLabel"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string/> - </property> - </widget> - </item> - <item row="2" column="1"> - <widget class="QLabel" name="passwordLabel"/> + <layout class="QHBoxLayout" name="horizontalLayout_6"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_7"> + <item> + <layout class="QGridLayout" name="gridLayout" columnstretch="1,3"> + <item row="2" column="0"> + <widget class="QLabel" name="urlLabel_2"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="font"> + <font> + <pointsize>9</pointsize> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>URL</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="passwordLabel_2"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Password</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="usernameLabel_2"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="layoutDirection"> + <enum>Qt::LeftToRight</enum> + </property> + <property name="text"> + <string>Username</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLabel" name="usernameLabel"/> + </item> + <item row="2" column="1"> + <widget class="QLabel" name="urlLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLabel" name="passwordLabel"/> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="expirationLabel_2"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Expiration</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QLabel" name="expirationLabel"/> + </item> + </layout> + </item> + </layout> </item> </layout> </item> </layout> - </item> - <item> - <layout class="QGridLayout" name="gridLayout_2"> - <item row="2" column="0"> - <widget class="QLabel" name="modifyLabel_2"> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Modification</string> - </property> - </widget> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="accessLabel_2"> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Access</string> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QLabel" name="accessLabel"/> - </item> - <item row="0" column="1"> - <widget class="QLabel" name="creationLabel"/> - </item> - <item row="0" column="0"> - <widget class="QLabel" name="creationLabel_2"> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Creation</string> - </property> - </widget> - </item> - <item row="3" column="0"> - <widget class="QLabel" name="expirationLabel_2"> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Expiration</string> - </property> - </widget> - </item> - <item row="2" column="1"> - <widget class="QLabel" name="modifyLabel"/> - </item> - <item row="3" column="1"> - <widget class="QLabel" name="expirationLabel"/> - </item> - </layout> - </item> - </layout> - </item> - </layout> - </widget> - <widget class="QWidget" name="groupPage"> - <layout class="QVBoxLayout" name="verticalLayout"> - <property name="leftMargin"> - <number>0</number> - </property> - <property name="topMargin"> - <number>0</number> - </property> - <property name="rightMargin"> - <number>0</number> - </property> - <property name="bottomMargin"> - <number>0</number> - </property> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_8"> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_9"> + </widget> + <widget class="QWidget" name="groupPage"> + <layout class="QVBoxLayout" name="verticalLayout"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> <item> - <layout class="QGridLayout" name="gridLayout_4"> - <item row="0" column="1"> - <widget class="QLabel" name="autotypeLabel"/> + <layout class="QHBoxLayout" name="horizontalLayout_8"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_9"> + <item> + <layout class="QGridLayout" name="gridLayout_4"> + <item row="0" column="1"> + <widget class="QLabel" name="autotypeLabel"/> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="autotypeLabel_2"> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Autotype</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="groupExpirationLabel_2"> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Expiration</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="searchingLabel_2"> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Searching</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLabel" name="searchingLabel"/> + </item> + <item row="2" column="1"> + <widget class="QLabel" name="groupExpirationLabel"/> + </item> + </layout> + </item> + </layout> </item> - <item row="0" column="0"> - <widget class="QLabel" name="autotypeLabel_2"> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Autotype</string> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QLabel" name="searchingLabel"/> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="searchingLabel_2"> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Searching</string> - </property> - </widget> - </item> - <item row="2" column="1"> - <widget class="QLabel" name="groupExpirationLabel"/> - </item> - <item row="2" column="0"> - <widget class="QLabel" name="groupExpirationLabel_2"> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Expiration</string> - </property> - </widget> + <item> + <layout class="QGridLayout" name="gridLayout_5"> + <item row="1" column="0"> + <widget class="QLabel" name="groupAccessLabel_2"> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Access</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLabel" name="groupCreationLabel"/> + </item> + <item row="1" column="1"> + <widget class="QLabel" name="groupAccessLabel"/> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="groupCreationLabel_2"> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Creation</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="groupModifyLabel_2"> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Modification</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLabel" name="groupModifyLabel"/> + </item> + </layout> </item> </layout> </item> </layout> - </item> - <item> - <layout class="QGridLayout" name="gridLayout_5"> - <item row="2" column="0"> - <widget class="QLabel" name="groupModifyLabel_2"> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Modification</string> - </property> - </widget> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="groupAccessLabel_2"> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Access</string> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QLabel" name="groupAccessLabel"/> - </item> - <item row="0" column="1"> - <widget class="QLabel" name="groupCreationLabel"/> - </item> - <item row="0" column="0"> - <widget class="QLabel" name="groupCreationLabel_2"> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Creation</string> - </property> - </widget> - </item> - <item row="2" column="1"> - <widget class="QLabel" name="groupModifyLabel"/> - </item> - </layout> - </item> - </layout> - </item> - </layout> - </widget> - </widget> - </item> - <item> - <layout class="QFormLayout" name="formLayout"> - <item row="0" column="0"> - <layout class="QVBoxLayout" name="verticalLayout_4"> - <item> - <widget class="QLabel" name="notesLabel_2"> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Notes</string> - </property> + </widget> </widget> </item> <item> @@ -488,42 +482,77 @@ </spacer> </item> </layout> - </item> - <item row="0" column="1"> - <widget class="QTextEdit" name="notesEdit"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> - <horstretch>0</horstretch> - <verstretch>1</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>0</width> - <height>50</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>16777215</width> - <height>50</height> - </size> - </property> - <property name="focusPolicy"> - <enum>Qt::ClickFocus</enum> - </property> - <property name="readOnly"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="Line" name="line"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> + </widget> + <widget class="QWidget" name="attributesTab"> + <attribute name="title"> + <string>Attributes</string> + </attribute> + <layout class="QFormLayout" name="formLayout"> + <item row="0" column="1"> + <widget class="QTextEdit" name="attributesEdit"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>1</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>80</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>16777215</width> + <height>80</height> + </size> + </property> + <property name="focusPolicy"> + <enum>Qt::ClickFocus</enum> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </widget> + <widget class="QWidget" name="notesTab"> + <attribute name="title"> + <string>Notes</string> + </attribute> + <layout class="QFormLayout" name="formLayout_2"> + <item row="0" column="1"> + <widget class="QTextEdit" name="notesEdit"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>1</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>80</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>16777215</width> + <height>80</height> + </size> + </property> + <property name="focusPolicy"> + <enum>Qt::ClickFocus</enum> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </widget> </widget> </item> </layout> From d0f8d437396425b2907a2255f6730c3883b960f7 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Thu, 28 Sep 2017 20:48:49 +0200 Subject: [PATCH 076/402] remove root group from path, resize icons to 16x16 --- src/gui/DetailsWidget.cpp | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/src/gui/DetailsWidget.cpp b/src/gui/DetailsWidget.cpp index 45284c840..d0e9c4a4e 100644 --- a/src/gui/DetailsWidget.cpp +++ b/src/gui/DetailsWidget.cpp @@ -70,17 +70,20 @@ void DetailsWidget::getSelectedEntry(Entry* selectedEntry) m_ui->totpWidget->hide(); m_ui->totpButton->setChecked(false); - m_ui->entryIcon->setPixmap(m_currentEntry->iconPixmap()); - - QString title = " / "; + auto icon = m_currentEntry->iconPixmap(); + if (icon.width() > 16 || icon.height() > 16) { + icon = icon.scaled(16, 16); + } + m_ui->entryIcon->setPixmap(icon); + QString title = QString(" / "); Group* entry_group = m_currentEntry->group(); if (entry_group) { QStringList hierarchy = entry_group->hierarchy(); - - for (QString parent : hierarchy) { - title.append(parent); - title.append(" / "); + hierarchy.removeFirst(); + title += hierarchy.join(" / "); + if (hierarchy.size() > 0) { + title += " / "; } } title.append(m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->title())); @@ -162,15 +165,18 @@ void DetailsWidget::getSelectedGroup(Group* selectedGroup) m_ui->totpButton->hide(); m_ui->totpWidget->hide(); - m_ui->entryIcon->setPixmap(m_currentGroup->iconPixmap()); + auto icon = m_currentGroup->iconPixmap(); + if (icon.width() > 32 || icon.height() > 32) { + icon = icon.scaled(32, 32); + } + m_ui->entryIcon->setPixmap(icon); QString title = " / "; - QStringList hierarchy = m_currentGroup->hierarchy(); - - for (QString parent : hierarchy) { - title.append(parent); - title.append(" / "); + hierarchy.removeFirst(); + title += hierarchy.join(" / "); + if (hierarchy.size() > 0) { + title += " / "; } m_ui->titleLabel->setText(title); From 9279bf76287238e2eb99ba757a48073e3beb21b6 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Fri, 29 Sep 2017 20:37:37 +0200 Subject: [PATCH 077/402] fix group layout, add autotype associations --- src/gui/DetailsWidget.cpp | 44 ++- src/gui/DetailsWidget.h | 4 + src/gui/DetailsWidget.ui | 582 +++++++++++++++++++------------------- 3 files changed, 326 insertions(+), 304 deletions(-) diff --git a/src/gui/DetailsWidget.cpp b/src/gui/DetailsWidget.cpp index d0e9c4a4e..dd80ea239 100644 --- a/src/gui/DetailsWidget.cpp +++ b/src/gui/DetailsWidget.cpp @@ -33,6 +33,8 @@ DetailsWidget::DetailsWidget(QWidget* parent) , m_locked(false) , m_currentEntry(nullptr) , m_currentGroup(nullptr) + , m_attributesWidget(nullptr) + , m_autotypeWidget(nullptr) { m_ui->setupUi(this); @@ -63,8 +65,14 @@ void DetailsWidget::getSelectedEntry(Entry* selectedEntry) m_ui->stackedWidget->setCurrentIndex(EntryPreview); + if (m_ui->tabWidget->count() < 4) { + m_ui->tabWidget->insertTab(static_cast<int>(AttributesTab), m_attributesWidget, "Attributes"); + m_ui->tabWidget->insertTab(static_cast<int>(AutotypeTab), m_autotypeWidget, "Autotype"); + } + m_ui->tabWidget->setTabEnabled(AttributesTab, false); m_ui->tabWidget->setTabEnabled(NotesTab, false); + m_ui->tabWidget->setTabEnabled(AutotypeTab, false); m_ui->totpButton->hide(); m_ui->totpWidget->hide(); @@ -147,6 +155,21 @@ void DetailsWidget::getSelectedEntry(Entry* selectedEntry) } m_ui->attributesEdit->setText(attributesText); } + + m_ui->autotypeTree->clear(); + AutoTypeAssociations* autotypeAssociations = m_currentEntry->autoTypeAssociations(); + QList<QTreeWidgetItem *> items; + for (auto assoc : autotypeAssociations->getAll()) { + QStringList association = QStringList() << assoc.window << assoc.sequence; + if (association.at(1).isEmpty()) { + association.replace(1, m_currentEntry->effectiveAutoTypeSequence()); + } + items.append(new QTreeWidgetItem(m_ui->autotypeTree, association)); + } + if (items.count() > 0) { + m_ui->autotypeTree->addTopLevelItems(items); + m_ui->tabWidget->setTabEnabled(AutotypeTab, true); + } } void DetailsWidget::getSelectedGroup(Group* selectedGroup) @@ -159,8 +182,15 @@ void DetailsWidget::getSelectedGroup(Group* selectedGroup) m_ui->stackedWidget->setCurrentIndex(GroupPreview); - m_ui->tabWidget->setTabEnabled(AttributesTab, false); - m_ui->tabWidget->setTabEnabled(NotesTab, false); + if (m_ui->tabWidget->count() > 2) { + m_autotypeWidget = m_ui->tabWidget->widget(AutotypeTab); + m_attributesWidget = m_ui->tabWidget->widget(AttributesTab); + m_ui->tabWidget->removeTab(AutotypeTab); + m_ui->tabWidget->removeTab(AttributesTab); + } + + m_ui->tabWidget->setTabEnabled(GroupNotesTab, false); + m_ui->totpButton->hide(); m_ui->totpWidget->hide(); @@ -180,7 +210,11 @@ void DetailsWidget::getSelectedGroup(Group* selectedGroup) } m_ui->titleLabel->setText(title); - m_ui->notesEdit->setText(m_currentGroup->notes()); + QString notes = m_currentGroup->notes(); + if (!notes.isEmpty()) { + m_ui->tabWidget->setTabEnabled(GroupNotesTab, true); + m_ui->notesEdit->setText(notes); + } QString searching = tr("Disabled"); if (m_currentGroup->resolveSearchingEnabled()) { @@ -200,10 +234,6 @@ void DetailsWidget::getSelectedGroup(Group* selectedGroup) } else { m_ui->groupExpirationLabel->setText(tr("Never")); } - - m_ui->groupCreationLabel->setText(groupTime.creationTime().toString(Qt::DefaultLocaleShortDate)); - m_ui->groupModifyLabel->setText(groupTime.lastModificationTime().toString(Qt::DefaultLocaleShortDate)); - m_ui->groupAccessLabel->setText(groupTime.lastAccessTime().toString(Qt::DefaultLocaleShortDate)); } void DetailsWidget::updateTotp() diff --git a/src/gui/DetailsWidget.h b/src/gui/DetailsWidget.h index 44989fd1b..155c58f10 100644 --- a/src/gui/DetailsWidget.h +++ b/src/gui/DetailsWidget.h @@ -44,7 +44,9 @@ public: { GeneralTab = 0, AttributesTab = 1, + GroupNotesTab = 1, NotesTab = 2, + AutotypeTab = 3, }; private slots: @@ -63,6 +65,8 @@ private: Group* m_currentGroup; quint8 m_step; QTimer* m_timer; + QWidget* m_attributesWidget; + QWidget* m_autotypeWidget; QString shortUrl(QString url); QString shortPassword(QString password); }; diff --git a/src/gui/DetailsWidget.ui b/src/gui/DetailsWidget.ui index 2bc6653c8..99164807e 100644 --- a/src/gui/DetailsWidget.ui +++ b/src/gui/DetailsWidget.ui @@ -7,7 +7,7 @@ <x>0</x> <y>0</y> <width>630</width> - <height>180</height> + <height>200</height> </rect> </property> <property name="sizePolicy"> @@ -159,9 +159,6 @@ <property name="movable"> <bool>false</bool> </property> - <property name="tabBarAutoHide"> - <bool>false</bool> - </property> <widget class="QWidget" name="generalTab"> <attribute name="title"> <string>General</string> @@ -179,308 +176,251 @@ <number>0</number> </property> <widget class="QWidget" name="entryPage"> - <layout class="QVBoxLayout" name="verticalLayout_2"> - <property name="leftMargin"> - <number>0</number> - </property> - <property name="topMargin"> - <number>0</number> - </property> - <property name="rightMargin"> - <number>0</number> - </property> - <property name="bottomMargin"> - <number>0</number> - </property> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_6"> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_7"> - <item> - <layout class="QGridLayout" name="gridLayout" columnstretch="1,3"> - <item row="2" column="0"> - <widget class="QLabel" name="urlLabel_2"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="font"> - <font> - <pointsize>9</pointsize> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>URL</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="passwordLabel_2"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Password</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item row="0" column="0"> - <widget class="QLabel" name="usernameLabel_2"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="layoutDirection"> - <enum>Qt::LeftToRight</enum> - </property> - <property name="text"> - <string>Username</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QLabel" name="usernameLabel"/> - </item> - <item row="2" column="1"> - <widget class="QLabel" name="urlLabel"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string/> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QLabel" name="passwordLabel"/> - </item> - <item row="3" column="0"> - <widget class="QLabel" name="expirationLabel_2"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Expiration</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item row="3" column="1"> - <widget class="QLabel" name="expirationLabel"/> - </item> - </layout> - </item> - </layout> - </item> - </layout> + <layout class="QGridLayout" name="gridLayout" columnstretch="1,3"> + <item row="1" column="1"> + <widget class="QLabel" name="passwordLabel"/> + </item> + <item row="2" column="1"> + <widget class="QLabel" name="urlLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="expirationLabel_2"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Expiration</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="urlLabel_2"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="font"> + <font> + <pointsize>9</pointsize> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>URL</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QLabel" name="expirationLabel"/> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="passwordLabel_2"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Password</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="usernameLabel_2"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="layoutDirection"> + <enum>Qt::LeftToRight</enum> + </property> + <property name="text"> + <string>Username</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLabel" name="usernameLabel"/> + </item> + <item row="4" column="1"> + <spacer name="verticalSpacer_2"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> </item> </layout> </widget> <widget class="QWidget" name="groupPage"> - <layout class="QVBoxLayout" name="verticalLayout"> - <property name="leftMargin"> - <number>0</number> - </property> - <property name="topMargin"> - <number>0</number> - </property> - <property name="rightMargin"> - <number>0</number> - </property> - <property name="bottomMargin"> - <number>0</number> - </property> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_8"> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_9"> - <item> - <layout class="QGridLayout" name="gridLayout_4"> - <item row="0" column="1"> - <widget class="QLabel" name="autotypeLabel"/> - </item> - <item row="0" column="0"> - <widget class="QLabel" name="autotypeLabel_2"> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Autotype</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item row="2" column="0"> - <widget class="QLabel" name="groupExpirationLabel_2"> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Expiration</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="searchingLabel_2"> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Searching</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QLabel" name="searchingLabel"/> - </item> - <item row="2" column="1"> - <widget class="QLabel" name="groupExpirationLabel"/> - </item> - </layout> - </item> - </layout> - </item> - <item> - <layout class="QGridLayout" name="gridLayout_5"> - <item row="1" column="0"> - <widget class="QLabel" name="groupAccessLabel_2"> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Access</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QLabel" name="groupCreationLabel"/> - </item> - <item row="1" column="1"> - <widget class="QLabel" name="groupAccessLabel"/> - </item> - <item row="0" column="0"> - <widget class="QLabel" name="groupCreationLabel_2"> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Creation</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item row="2" column="0"> - <widget class="QLabel" name="groupModifyLabel_2"> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Modification</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item row="2" column="1"> - <widget class="QLabel" name="groupModifyLabel"/> - </item> - </layout> - </item> - </layout> + <layout class="QGridLayout" name="gridLayout_4" columnstretch="1,3"> + <item row="2" column="1"> + <widget class="QLabel" name="groupExpirationLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="autotypeLabel_2"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Autotype</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLabel" name="searchingLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="searchingLabel_2"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Searching</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLabel" name="autotypeLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="groupExpirationLabel_2"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Expiration</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="3" column="1"> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> </item> </layout> </widget> </widget> </item> - <item> - <spacer name="verticalSpacer"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </item> </layout> </widget> <widget class="QWidget" name="attributesTab"> @@ -553,6 +493,54 @@ </item> </layout> </widget> + <widget class="QWidget" name="autotypeTab"> + <attribute name="title"> + <string>Autotype</string> + </attribute> + <layout class="QGridLayout" name="gridLayout_2"> + <item row="0" column="0"> + <widget class="QTreeWidget" name="autotypeTree"> + <property name="frameShadow"> + <enum>QFrame::Sunken</enum> + </property> + <property name="showDropIndicator" stdset="0"> + <bool>true</bool> + </property> + <property name="rootIsDecorated"> + <bool>true</bool> + </property> + <property name="wordWrap"> + <bool>false</bool> + </property> + <property name="columnCount"> + <number>2</number> + </property> + <attribute name="headerCascadingSectionResizes"> + <bool>false</bool> + </attribute> + <attribute name="headerDefaultSectionSize"> + <number>250</number> + </attribute> + <attribute name="headerMinimumSectionSize"> + <number>50</number> + </attribute> + <attribute name="headerStretchLastSection"> + <bool>true</bool> + </attribute> + <column> + <property name="text"> + <string>Window</string> + </property> + </column> + <column> + <property name="text"> + <string>Sequence</string> + </property> + </column> + </widget> + </item> + </layout> + </widget> </widget> </item> </layout> From 71ae2a3458d23a164aa9137798e2c00029a6d220 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Fri, 29 Sep 2017 22:02:07 +0200 Subject: [PATCH 078/402] remember last selected tab, hide passwords by default --- src/core/Config.cpp | 1 + src/gui/DetailsWidget.cpp | 19 +++++++++++++++++-- src/gui/DetailsWidget.h | 4 +++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/core/Config.cpp b/src/core/Config.cpp index a432b3c9b..6899015a6 100644 --- a/src/core/Config.cpp +++ b/src/core/Config.cpp @@ -131,6 +131,7 @@ void Config::init(const QString& fileName) m_defaults.insert("security/lockdatabasescreenlock", true); m_defaults.insert("security/passwordsrepeat", false); m_defaults.insert("security/passwordscleartext", false); + m_defaults.insert("security/hidepassworddetails", true); m_defaults.insert("security/autotypeask", true); m_defaults.insert("security/IconDownloadFallbackToGoogle", false); m_defaults.insert("GUI/Language", "system"); diff --git a/src/gui/DetailsWidget.cpp b/src/gui/DetailsWidget.cpp index dd80ea239..1ec891a60 100644 --- a/src/gui/DetailsWidget.cpp +++ b/src/gui/DetailsWidget.cpp @@ -35,6 +35,8 @@ DetailsWidget::DetailsWidget(QWidget* parent) , m_currentGroup(nullptr) , m_attributesWidget(nullptr) , m_autotypeWidget(nullptr) + , m_selectedTabEntry(0) + , m_selectedTabGroup(0) { m_ui->setupUi(this); @@ -47,6 +49,7 @@ DetailsWidget::DetailsWidget(QWidget* parent) connect(m_ui->totpButton, SIGNAL(toggled(bool)), SLOT(showTotp(bool))); connect(m_ui->closeButton, SIGNAL(toggled(bool)), SLOT(hideDetails())); + connect(m_ui->tabWidget, SIGNAL(tabBarClicked(int)), SLOT(updateTabIndex(int))); this->hide(); } @@ -170,6 +173,10 @@ void DetailsWidget::getSelectedEntry(Entry* selectedEntry) m_ui->autotypeTree->addTopLevelItems(items); m_ui->tabWidget->setTabEnabled(AutotypeTab, true); } + + if (m_ui->tabWidget->isTabEnabled(m_selectedTabEntry)) { + m_ui->tabWidget->setCurrentIndex(m_selectedTabEntry); + } } void DetailsWidget::getSelectedGroup(Group* selectedGroup) @@ -234,6 +241,10 @@ void DetailsWidget::getSelectedGroup(Group* selectedGroup) } else { m_ui->groupExpirationLabel->setText(tr("Never")); } + + if (m_ui->tabWidget->isTabEnabled(m_selectedTabGroup)) { + m_ui->tabWidget->setCurrentIndex(m_selectedTabGroup); + } } void DetailsWidget::updateTotp() @@ -301,6 +312,10 @@ void DetailsWidget::setDatabaseMode(DatabaseWidget::Mode mode) } } -void DetailsWidget::copyToClipboard(const QString& text) { - clipboard()->setText(text); +void DetailsWidget::updateTabIndex(int index) { + if (m_ui->stackedWidget->currentIndex() == GroupPreview) { + m_selectedTabGroup = index; + } else { + m_selectedTabEntry = index; + } } \ No newline at end of file diff --git a/src/gui/DetailsWidget.h b/src/gui/DetailsWidget.h index 155c58f10..5bc026000 100644 --- a/src/gui/DetailsWidget.h +++ b/src/gui/DetailsWidget.h @@ -56,7 +56,7 @@ private slots: void updateTotp(); void hideDetails(); void setDatabaseMode(DatabaseWidget::Mode mode); - void copyToClipboard(const QString& text); + void updateTabIndex(int index); private: const QScopedPointer<Ui::DetailsWidget> m_ui; @@ -67,6 +67,8 @@ private: QTimer* m_timer; QWidget* m_attributesWidget; QWidget* m_autotypeWidget; + quint8 m_selectedTabEntry; + quint8 m_selectedTabGroup; QString shortUrl(QString url); QString shortPassword(QString password); }; From 8416d69f1e0b390b82c0c2dea7bd158e10eb7bed Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Tue, 24 Oct 2017 14:08:22 +0200 Subject: [PATCH 079/402] fix protected transalation --- src/gui/DetailsWidget.cpp | 8 ++++---- src/gui/entry/EditEntryWidget.cpp | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/gui/DetailsWidget.cpp b/src/gui/DetailsWidget.cpp index 1ec891a60..51448a970 100644 --- a/src/gui/DetailsWidget.cpp +++ b/src/gui/DetailsWidget.cpp @@ -152,7 +152,7 @@ void DetailsWidget::getSelectedEntry(Entry* selectedEntry) for (const QString& key : customAttributes) { QString value = m_currentEntry->attributes()->value(key); if (m_currentEntry->attributes()->isProtected(key)) { - value = "<i>[PROTECTED]</i>"; + value = "<i>" + tr("[PROTECTED]") + "</i>"; } attributesText.append(QString("<b>%1</b>: %2<br/>").arg(key, value)); } @@ -161,7 +161,7 @@ void DetailsWidget::getSelectedEntry(Entry* selectedEntry) m_ui->autotypeTree->clear(); AutoTypeAssociations* autotypeAssociations = m_currentEntry->autoTypeAssociations(); - QList<QTreeWidgetItem *> items; + QList<QTreeWidgetItem*> items; for (auto assoc : autotypeAssociations->getAll()) { QStringList association = QStringList() << assoc.window << assoc.sequence; if (association.at(1).isEmpty()) { @@ -273,7 +273,7 @@ QString DetailsWidget::shortUrl(QString url) QString newurl = ""; if (url.length() > 60) { newurl.append(url.left(20)); - newurl.append("..."); + newurl.append("…"); newurl.append(url.right(20)); return newurl; } @@ -285,7 +285,7 @@ QString DetailsWidget::shortPassword(QString password) QString newpassword = ""; if (password.length() > 60) { newpassword.append(password.left(50)); - newpassword.append("..."); + newpassword.append("…"); return newpassword; } return password; diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index 463096b32..2d17c3459 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -632,7 +632,7 @@ void EditEntryWidget::displayAttribute(QModelIndex index, bool showProtected) if (index.isValid()) { QString key = m_attributesModel->keyByIndex(index); if (showProtected) { - m_advancedUi->attributesEdit->setPlainText(tr("[PROTECTED] Press reveal to view or edit")); + m_advancedUi->attributesEdit->setPlainText(tr("[PROTECTED]") + " " + tr("Press reveal to view or edit")); m_advancedUi->attributesEdit->setEnabled(false); m_advancedUi->revealAttributeButton->setEnabled(true); m_advancedUi->protectAttributeButton->setChecked(true); From b9fd609bb20d6246db8f63dd43bc237ce05de641 Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Wed, 25 Oct 2017 00:01:29 -0400 Subject: [PATCH 080/402] Resolve placeholders in entry details url --- src/core/Entry.cpp | 3 ++- src/gui/DetailsWidget.cpp | 11 +++++++++-- src/gui/DetailsWidget.ui | 9 ++++++++- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index d5afec046..edf5b6f24 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -243,7 +243,8 @@ QString Entry::url() const QString Entry::webUrl() const { - return resolveUrl(m_attributes->value(EntryAttributes::URLKey)); + QString url = resolveMultiplePlaceholders(m_attributes->value(EntryAttributes::URLKey)); + return resolveUrl(url); } QString Entry::username() const diff --git a/src/gui/DetailsWidget.cpp b/src/gui/DetailsWidget.cpp index 51448a970..deb7008ac 100644 --- a/src/gui/DetailsWidget.cpp +++ b/src/gui/DetailsWidget.cpp @@ -110,10 +110,17 @@ void DetailsWidget::getSelectedEntry(Entry* selectedEntry) } QString url = m_currentEntry->webUrl(); - if (url != "") { - url = QString("<a href=\"%1\">%2</a>").arg(url).arg(shortUrl(url)); + if (!url.isEmpty()) { + // URL is well formed and can be opened in a browser + // create a new display url that masks password placeholders + // the actual link will use the password + QString displayUrl = m_currentEntry->url(); + displayUrl = m_currentEntry->maskPasswordPlaceholders(displayUrl); + displayUrl = m_currentEntry->resolveMultiplePlaceholders(displayUrl); + url = QString("<a href=\"%1\">%2</a>").arg(url).arg(shortUrl(displayUrl)); m_ui->urlLabel->setOpenExternalLinks(true); } else { + // Fallback to the raw url string url = shortUrl(m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->url())); m_ui->urlLabel->setOpenExternalLinks(false); } diff --git a/src/gui/DetailsWidget.ui b/src/gui/DetailsWidget.ui index 99164807e..fb31409f8 100644 --- a/src/gui/DetailsWidget.ui +++ b/src/gui/DetailsWidget.ui @@ -188,6 +188,9 @@ <verstretch>0</verstretch> </sizepolicy> </property> + <property name="cursor"> + <cursorShape>PointingHandCursor</cursorShape> + </property> <property name="text"> <string/> </property> @@ -289,7 +292,11 @@ </widget> </item> <item row="0" column="1"> - <widget class="QLabel" name="usernameLabel"/> + <widget class="QLabel" name="usernameLabel"> + <property name="textInteractionFlags"> + <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set> + </property> + </widget> </item> <item row="4" column="1"> <spacer name="verticalSpacer_2"> From f3d85ae21917feff31806ef1c22bb76833cb914f Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Wed, 25 Oct 2017 23:29:01 -0400 Subject: [PATCH 081/402] Cleaned up url display code --- src/core/Entry.cpp | 7 +++++++ src/core/Entry.h | 1 + src/gui/DetailsWidget.cpp | 7 ++----- src/gui/entry/EntryModel.cpp | 3 +-- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index edf5b6f24..91d757a91 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -247,6 +247,13 @@ QString Entry::webUrl() const return resolveUrl(url); } +QString Entry::displayUrl() const +{ + QString url = maskPasswordPlaceholders(m_attributes->value(EntryAttributes::URLKey)); + url = resolveMultiplePlaceholders(url); + return resolveUrl(url); +} + QString Entry::username() const { return m_attributes->value(EntryAttributes::UserNameKey); diff --git a/src/core/Entry.h b/src/core/Entry.h index 212c8668a..d4d2b9034 100644 --- a/src/core/Entry.h +++ b/src/core/Entry.h @@ -79,6 +79,7 @@ public: QString title() const; QString url() const; QString webUrl() const; + QString displayUrl() const; QString username() const; QString password() const; QString notes() const; diff --git a/src/gui/DetailsWidget.cpp b/src/gui/DetailsWidget.cpp index deb7008ac..b805f9b10 100644 --- a/src/gui/DetailsWidget.cpp +++ b/src/gui/DetailsWidget.cpp @@ -114,10 +114,7 @@ void DetailsWidget::getSelectedEntry(Entry* selectedEntry) // URL is well formed and can be opened in a browser // create a new display url that masks password placeholders // the actual link will use the password - QString displayUrl = m_currentEntry->url(); - displayUrl = m_currentEntry->maskPasswordPlaceholders(displayUrl); - displayUrl = m_currentEntry->resolveMultiplePlaceholders(displayUrl); - url = QString("<a href=\"%1\">%2</a>").arg(url).arg(shortUrl(displayUrl)); + url = QString("<a href=\"%1\">%2</a>").arg(url).arg(shortUrl(m_currentEntry->displayUrl())); m_ui->urlLabel->setOpenExternalLinks(true); } else { // Fallback to the raw url string @@ -325,4 +322,4 @@ void DetailsWidget::updateTabIndex(int index) { } else { m_selectedTabEntry = index; } -} \ No newline at end of file +} diff --git a/src/gui/entry/EntryModel.cpp b/src/gui/entry/EntryModel.cpp index 2f79f02d9..4d3578069 100644 --- a/src/gui/entry/EntryModel.cpp +++ b/src/gui/entry/EntryModel.cpp @@ -151,8 +151,7 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const } return result; case Url: - result = entry->maskPasswordPlaceholders(entry->url()); - result = entry->resolveMultiplePlaceholders(result); + result = entry->displayUrl(); if (attr->isReference(EntryAttributes::URLKey)) { result.prepend(tr("Ref: ","Reference abbreviation")); } From 5bc000cc3193ee42f5e8b65a4e785c2646d209ec Mon Sep 17 00:00:00 2001 From: Joe Brown <grim210@users.noreply.github.com> Date: Sat, 29 Apr 2017 21:00:15 -0500 Subject: [PATCH 082/402] Use fixed-width font for Notes Fixed width, and a smaller font size, make for easier readability in the notes section. --- src/gui/entry/EditEntryWidgetMain.ui | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/gui/entry/EditEntryWidgetMain.ui b/src/gui/entry/EditEntryWidgetMain.ui index afc1d4f26..1d4977084 100644 --- a/src/gui/entry/EditEntryWidgetMain.ui +++ b/src/gui/entry/EditEntryWidgetMain.ui @@ -127,6 +127,12 @@ <height>100</height> </size> </property> + <property name="font"> + <font> + <family>Monospace</family> + <pointsize>10</pointsize> + </font> + </property> </widget> </item> <item row="1" column="0" alignment="Qt::AlignRight"> From 0c2d71c2cee497129a26bc40a2a8bbf1d3adf004 Mon Sep 17 00:00:00 2001 From: Joe Brown <grim210@users.noreply.github.com> Date: Sat, 29 Apr 2017 21:23:28 -0500 Subject: [PATCH 083/402] Notes section no longer visible by default. There is a simple checkbox that allows your notes to become visible again. This is always disabled by default, as the use case referenced in issue #342 (and my own use case) has confidential data in that field. Passes all tests (YubiKey is N/A) on Ubuntu 16.04.2 with Qt 5.5.1. --- src/gui/entry/EditEntryWidget.cpp | 3 +++ src/gui/entry/EditEntryWidgetMain.ui | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index 2d17c3459..000a1e551 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -99,6 +99,7 @@ void EditEntryWidget::setupMain() connect(m_mainUi->togglePasswordButton, SIGNAL(toggled(bool)), m_mainUi->passwordEdit, SLOT(setShowPassword(bool))); connect(m_mainUi->togglePasswordGeneratorButton, SIGNAL(toggled(bool)), SLOT(togglePasswordGeneratorButton(bool))); connect(m_mainUi->expireCheck, SIGNAL(toggled(bool)), m_mainUi->expireDatePicker, SLOT(setEnabled(bool))); + connect(m_mainUi->notesEnabled, SIGNAL(toggled(bool)), m_mainUi->notesEdit, SLOT(setVisible(bool))); m_mainUi->passwordRepeatEdit->enableVerifyMode(m_mainUi->passwordEdit); connect(m_mainUi->passwordGenerator, SIGNAL(appliedPassword(QString)), SLOT(setGeneratedPassword(QString))); @@ -308,7 +309,9 @@ void EditEntryWidget::setForms(const Entry* entry, bool restore) m_mainUi->passwordRepeatEdit->setReadOnly(m_history); m_mainUi->expireCheck->setEnabled(!m_history); m_mainUi->expireDatePicker->setReadOnly(m_history); + m_mainUi->notesEnabled->setChecked(false); m_mainUi->notesEdit->setReadOnly(m_history); + m_mainUi->notesEdit->setVisible(false); m_mainUi->togglePasswordGeneratorButton->setChecked(false); m_mainUi->togglePasswordGeneratorButton->setDisabled(m_history); m_mainUi->passwordGenerator->reset(); diff --git a/src/gui/entry/EditEntryWidgetMain.ui b/src/gui/entry/EditEntryWidgetMain.ui index 1d4977084..f291e37c1 100644 --- a/src/gui/entry/EditEntryWidgetMain.ui +++ b/src/gui/entry/EditEntryWidgetMain.ui @@ -79,10 +79,10 @@ </property> </widget> </item> - <item row="9" column="0" alignment="Qt::AlignRight|Qt::AlignTop"> - <widget class="QLabel" name="notesLabel"> + <item row="9" column="0" alignment="Qt::AlignLeft|Qt::AlignTop"> + <widget class="QCheckBox" name="notesEnabled"> <property name="text"> - <string>Notes:</string> + <string>Notes</string> </property> </widget> </item> From fdceeb368e75f3044d33ee0a634fda06e6123e93 Mon Sep 17 00:00:00 2001 From: Joe Brown <grim210@users.noreply.github.com> Date: Sun, 28 May 2017 20:58:56 -0500 Subject: [PATCH 084/402] Do not hide notes by default. --- src/gui/entry/EditEntryWidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index 000a1e551..1d584abb4 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -309,7 +309,7 @@ void EditEntryWidget::setForms(const Entry* entry, bool restore) m_mainUi->passwordRepeatEdit->setReadOnly(m_history); m_mainUi->expireCheck->setEnabled(!m_history); m_mainUi->expireDatePicker->setReadOnly(m_history); - m_mainUi->notesEnabled->setChecked(false); + m_mainUi->notesEnabled->setChecked(true); m_mainUi->notesEdit->setReadOnly(m_history); m_mainUi->notesEdit->setVisible(false); m_mainUi->togglePasswordGeneratorButton->setChecked(false); From ff01a7da1ed8a5df0493c1c6f32d31e3ef5d381e Mon Sep 17 00:00:00 2001 From: Joe Brown <grim210@users.noreply.github.com> Date: Sun, 28 May 2017 21:58:15 -0500 Subject: [PATCH 085/402] Hint is displayed when notes section is hidden. The alignment is a bit off, however. A better option may be simply disabling the QPlainTextEdit widget and stashing the actual notes in another buffer somewhere. --- src/gui/entry/EditEntryWidget.cpp | 10 ++++++++-- src/gui/entry/EditEntryWidget.h | 1 + src/gui/entry/EditEntryWidgetMain.ui | 13 +++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index 1d584abb4..a152ebb74 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -99,7 +99,7 @@ void EditEntryWidget::setupMain() connect(m_mainUi->togglePasswordButton, SIGNAL(toggled(bool)), m_mainUi->passwordEdit, SLOT(setShowPassword(bool))); connect(m_mainUi->togglePasswordGeneratorButton, SIGNAL(toggled(bool)), SLOT(togglePasswordGeneratorButton(bool))); connect(m_mainUi->expireCheck, SIGNAL(toggled(bool)), m_mainUi->expireDatePicker, SLOT(setEnabled(bool))); - connect(m_mainUi->notesEnabled, SIGNAL(toggled(bool)), m_mainUi->notesEdit, SLOT(setVisible(bool))); + connect(m_mainUi->notesEnabled, SIGNAL(toggled(bool)), this, SLOT(toggleHideNotes(bool))); m_mainUi->passwordRepeatEdit->enableVerifyMode(m_mainUi->passwordEdit); connect(m_mainUi->passwordGenerator, SIGNAL(appliedPassword(QString)), SLOT(setGeneratedPassword(QString))); @@ -262,6 +262,12 @@ void EditEntryWidget::updateAttachmentButtonsEnabled(const QModelIndex& current) m_advancedUi->removeAttachmentButton->setEnabled(enable && !m_history); } +void EditEntryWidget::toggleHideNotes(bool visible) +{ + m_mainUi->notesEdit->setVisible(visible); + m_mainUi->notesHint->setVisible(!visible); +} + QString EditEntryWidget::entryTitle() const { if (m_entry) { @@ -311,7 +317,7 @@ void EditEntryWidget::setForms(const Entry* entry, bool restore) m_mainUi->expireDatePicker->setReadOnly(m_history); m_mainUi->notesEnabled->setChecked(true); m_mainUi->notesEdit->setReadOnly(m_history); - m_mainUi->notesEdit->setVisible(false); + m_mainUi->notesEdit->setVisible(true); m_mainUi->togglePasswordGeneratorButton->setChecked(false); m_mainUi->togglePasswordGeneratorButton->setDisabled(m_history); m_mainUi->passwordGenerator->reset(); diff --git a/src/gui/entry/EditEntryWidget.h b/src/gui/entry/EditEntryWidget.h index 2888d43a8..74da2c46f 100644 --- a/src/gui/entry/EditEntryWidget.h +++ b/src/gui/entry/EditEntryWidget.h @@ -100,6 +100,7 @@ private slots: void updateHistoryButtons(const QModelIndex& current, const QModelIndex& previous); void useExpiryPreset(QAction* action); void updateAttachmentButtonsEnabled(const QModelIndex& current); + void toggleHideNotes(bool visible); private: void setupMain(); diff --git a/src/gui/entry/EditEntryWidgetMain.ui b/src/gui/entry/EditEntryWidgetMain.ui index f291e37c1..2c9aa59b7 100644 --- a/src/gui/entry/EditEntryWidgetMain.ui +++ b/src/gui/entry/EditEntryWidgetMain.ui @@ -135,6 +135,19 @@ </property> </widget> </item> + <item row="9" column="1"> + <widget class="QLabel" name="notesHint"> + <property name="visible"> + <bool>false</bool> + </property> + <property name="text"> + <string>Toggle the checkbox to reveal the notes section.</string> + </property> + <property name="alignment"> + <set>Qt::AlignTop</set> + </property> + </widget> + </item> <item row="1" column="0" alignment="Qt::AlignRight"> <widget class="QLabel" name="usernameLabel"> <property name="text"> From 9840470df8f95995e121ea5cfbac3d30a2175c0e Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Wed, 25 Oct 2017 16:40:14 +0200 Subject: [PATCH 086/402] hide note option --- src/gui/SettingsWidget.cpp | 2 ++ src/gui/SettingsWidgetSecurity.ui | 7 +++++++ src/gui/entry/EditEntryWidget.cpp | 5 +++-- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/gui/SettingsWidget.cpp b/src/gui/SettingsWidget.cpp index aa0e56648..a8b0e9424 100644 --- a/src/gui/SettingsWidget.cpp +++ b/src/gui/SettingsWidget.cpp @@ -163,6 +163,7 @@ void SettingsWidget::loadSettings() m_secUi->passwordCleartextCheckBox->setChecked(config()->get("security/passwordscleartext").toBool()); m_secUi->passwordDetailsCleartextCheckBox->setChecked(config()->get("security/hidepassworddetails").toBool()); m_secUi->passwordRepeatCheckBox->setChecked(config()->get("security/passwordsrepeat").toBool()); + m_secUi->hideNotesCheckBox->setChecked(config()->get("security/hidenotes").toBool()); for (const ExtraPage& page: asConst(m_extraPages)) { @@ -231,6 +232,7 @@ void SettingsWidget::saveSettings() config()->set("security/passwordscleartext", m_secUi->passwordCleartextCheckBox->isChecked()); config()->set("security/hidepassworddetails", m_secUi->passwordDetailsCleartextCheckBox->isChecked()); config()->set("security/passwordsrepeat", m_secUi->passwordRepeatCheckBox->isChecked()); + config()->set("security/hidenotes", m_secUi->hideNotesCheckBox->isChecked()); // Security: clear storage if related settings are disabled if (!config()->get("RememberLastDatabases").toBool()) { diff --git a/src/gui/SettingsWidgetSecurity.ui b/src/gui/SettingsWidgetSecurity.ui index 53c69db6d..17d324f7b 100644 --- a/src/gui/SettingsWidgetSecurity.ui +++ b/src/gui/SettingsWidgetSecurity.ui @@ -143,6 +143,13 @@ </property> </widget> </item> + <item> + <widget class="QCheckBox" name="hideNotesCheckBox"> + <property name="text"> + <string>Hide entry notes by default</string> + </property> + </widget> + </item> </layout> </widget> </item> diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index a152ebb74..8457c5af3 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -315,9 +315,10 @@ void EditEntryWidget::setForms(const Entry* entry, bool restore) m_mainUi->passwordRepeatEdit->setReadOnly(m_history); m_mainUi->expireCheck->setEnabled(!m_history); m_mainUi->expireDatePicker->setReadOnly(m_history); - m_mainUi->notesEnabled->setChecked(true); + m_mainUi->notesEnabled->setChecked(!config()->get("security/hidenotes").toBool()); m_mainUi->notesEdit->setReadOnly(m_history); - m_mainUi->notesEdit->setVisible(true); + m_mainUi->notesEdit->setVisible(!config()->get("security/hidenotes").toBool()); + m_mainUi->notesHint->setVisible(config()->get("security/hidenotes").toBool()); m_mainUi->togglePasswordGeneratorButton->setChecked(false); m_mainUi->togglePasswordGeneratorButton->setDisabled(m_history); m_mainUi->passwordGenerator->reset(); From 2027429d879b9af5bcd8f1a60cd70431077e7e76 Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Sun, 15 Oct 2017 12:49:41 +0300 Subject: [PATCH 087/402] Add support for placeholders on the KeePassHTTP custom fields --- src/http/Service.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/http/Service.cpp b/src/http/Service.cpp index 768a5774d..e68a7bfd9 100644 --- a/src/http/Service.cpp +++ b/src/http/Service.cpp @@ -259,13 +259,16 @@ Service::Access Service::checkAccess(const Entry *entry, const QString & host, c KeepassHttpProtocol::Entry Service::prepareEntry(const Entry* entry) { - KeepassHttpProtocol::Entry res(entry->resolvePlaceholder(entry->title()), entry->resolvePlaceholder(entry->username()), entry->resolvePlaceholder(entry->password()), entry->uuid().toHex()); + KeepassHttpProtocol::Entry res(entry->resolveMultiplePlaceholders(entry->title()), + entry->resolveMultiplePlaceholders(entry->username()), + entry->resolveMultiplePlaceholders(entry->password()), + entry->uuid().toHex()); if (HttpSettings::supportKphFields()) { const EntryAttributes * attr = entry->attributes(); const auto keys = attr->keys(); for (const QString& key: keys) { if (key.startsWith(QLatin1String("KPH: "))) { - res.addStringField(key, attr->value(key)); + res.addStringField(key, entry->resolveMultiplePlaceholders(attr->value(key))); } } } From 7e54bd49564dd658fa98aec5f5e63a8f0b3c4a6a Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Sat, 28 Oct 2017 20:57:11 +0200 Subject: [PATCH 088/402] prevent crash with empty database --- src/gui/DetailsWidget.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/gui/DetailsWidget.cpp b/src/gui/DetailsWidget.cpp index b805f9b10..48077bbb2 100644 --- a/src/gui/DetailsWidget.cpp +++ b/src/gui/DetailsWidget.cpp @@ -60,6 +60,11 @@ DetailsWidget::~DetailsWidget() void DetailsWidget::getSelectedEntry(Entry* selectedEntry) { + if (!selectedEntry) { + hideDetails(); + return; + } + m_currentEntry = selectedEntry; if (!config()->get("GUI/HideDetailsView").toBool()) { @@ -185,6 +190,11 @@ void DetailsWidget::getSelectedEntry(Entry* selectedEntry) void DetailsWidget::getSelectedGroup(Group* selectedGroup) { + if (!selectedGroup) { + hideDetails(); + return; + } + m_currentGroup = selectedGroup; if (!config()->get("GUI/HideDetailsView").toBool()) { From ffe344ce901b37c0b118398be1a1db0862f3357d Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Sun, 29 Oct 2017 11:18:48 +0200 Subject: [PATCH 089/402] Save the geometry of main window only if the window is visible --- src/gui/MainWindow.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index c82ea1751..ccc5fb11f 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -727,7 +727,9 @@ void MainWindow::changeEvent(QEvent* event) void MainWindow::saveWindowInformation() { - config()->set("GUI/MainWindowGeometry", saveGeometry()); + if (isVisible()) { + config()->set("GUI/MainWindowGeometry", saveGeometry()); + } } bool MainWindow::saveLastDatabases() @@ -858,6 +860,7 @@ void MainWindow::trayIconTriggered(QSystemTrayIcon::ActivationReason reason) void MainWindow::hideWindow() { + saveWindowInformation(); #ifndef Q_OS_MAC setWindowState(windowState() | Qt::WindowMinimized); #endif From 3e9067fe8eba8ee7e0556361707ee0796f4c8bde Mon Sep 17 00:00:00 2001 From: Sebastian Marsching <sebastian-git-2016@marsching.com> Date: Mon, 30 Oct 2017 15:41:20 +0100 Subject: [PATCH 090/402] Add build of MSI packages (#1148) --- share/windows/wix-banner.bmp | Bin 0 -> 85894 bytes share/windows/wix-dialog.bmp | Bin 0 -> 461814 bytes share/windows/wix-patch.xml | 8 ++++++ share/windows/wix-template.xml | 51 +++++++++++++++++++++++++++++++++ src/CMakeLists.txt | 18 ++++++++++-- 5 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 share/windows/wix-banner.bmp create mode 100644 share/windows/wix-dialog.bmp create mode 100644 share/windows/wix-patch.xml create mode 100644 share/windows/wix-template.xml diff --git a/share/windows/wix-banner.bmp b/share/windows/wix-banner.bmp new file mode 100644 index 0000000000000000000000000000000000000000..14a13b8f1ae153db1ba6610510ffdd3218938012 GIT binary patch literal 85894 zcmeI5>r)j+8pg>#u%Gu&*strxsA#-vDlt~Pu%bXfH`%x<xSP0JC?JQMM&QUn6p<jP zpePb@5#{0)<Q%}=vRuVw0WUEqh+NO%qHZY4eK>>7oSB|sFxd~M_L*w%?RWa^?)nY& z*wxeBvv}p+kKPIxzuv*mZ}8KHY#{!9E8y4o9T2bz_np5A@cwum`1Ohx36KB@kbplE zppN_V(_`OBfCNb3)hp^a{|ZQe1W3TY2~fxV`}wi=BtQZrKpp4b011!)3HUbw>bQSD zKlYvkNPq;W<NO;S0TLjA{|SNq{(hIsb>_^O%*@Qh#KfK63kI@qI-O1w_(d9~j{hPU zSqTY{00~SG=<Mt)E-sFYj9l%#)~;Q<Wy_Z6=xCewf`KfY%H61_sMDuUKYjZ2=isA` z{~UUZB>@s3fk^_bt*v|Z>{+vB4P-hgDXF%$w!6Fgr`Okiyw~g8PhDMI*REZ|@EnB^ zg21-6w#mAtV^PPaLyKiefCNZDMxd{+&u+J`TD2-7BBHXga%5x#daVez`EL{(9v-f! zs6ZgXGcq#XV6ufeE_){QkpKyhfMo)h=?)1A2@Vd19KU?|(p<QW?jo?fynNldb)li5 z_4W0Z8y_!79iJ917A64_Ac08&V`F1^d3hK|$Hc^VJRZG9KN{$`@X(oi_uJ$f`7!m` zNGX5MN4Daj>&JmkeR;RrjjAwpo}ZtO$|qYgwW#B!czBZpNPq+k2#k)7rlzJsbFuhD zqsY&OdQUW;kEpgS`(~?2+H@(gu=zswP@g&+Gc9;cifYr-)6s-M<34WcxDO6yNPq-L zzzP8jmebPG@P4wUrbay#-aqWgzE!f~yY0)${-jCC4PPN?oXD>Dc6-k4(t+X0;XEq5 zdiAOz<yJ=J)Nw11jAclG1W3S#0H#x*vk-ChP`aVx_V3UAZE5LdeM)M`eg5(}5)A!a zc!JMIH+I}n*QQ80CRltLmSw2pGAi_u011$QF@d_eI*52_X{mZ7exm8z(vr<fN<P!4 z#QGypa7CkGAgeC}&$6?di|(EmQZ6P~u$joXFXMNp<K}#Lmjp<F1bhf!i6K^}#Kpx4 z!G&?~X7Q5KpGs4rGe?N{q?9{zq=n%;bhB903@OKJ&#<sC^TmkNai1r|3<;0`378YW z>qjgxRIg4se&@Tzr~hD-hMo@#T^5FW#A8$*{-UPx$&zk279(O^xk<06<0f!;iv&o3 z1bhgzw6tJG1v`C&&elKv=aS-0i%xAcO3z<BufFfBx?d+kU~~=k7?p<~6*fM;Ey`nE zIhHn>?DnLN`#dCONPq-Lz=S|bN=kTmxKP->p@B7DM=dG}H%ZX(r0dzXnk*3o<6h4r zlMvhrD*Llo!GbM9*zJjp`$iq3jvJAop9DyN1bhf|baY^$VO3R?P~-zQ3KtfBY@VRw ziM5B~eRaI0`@y2ZaPz?If1DBxVW%jXHabp=I_~qFm>~fYAORx+Cr_TlnN~OsMUmHM zp5Em}8y6lAHBaL@UUM-1YNiln#W;JnV$tz1lUP*V<>^rhqfs=C4M)<xQOBiN=p+FW zAOS6bZQHhCUPY`m%)fbdLBWP86LdV`TGs9>4vmf@`(<s8dHC^LWl9tp#mR^`<W}1! zZ=O0X#X=_ukN^qz5Wvbmyy3il{ko9j^(EWq9}S)|jqCW8%-xqWM4)0^d(gPJAk;iO zwDfZkg+p%90qFun>bTFNVul1rfCQujpx}_vo}P(`jt4!D=I5=mlDs<Z*nP<^6d6X} z;J}K)O;*Am^|mX4ILaIyknRbhj!PdIog_d4B;Z2;U+ux0Mlq@K{lBW;%?+}WpyRen z8F3fW)jAIQ=Hold3&N(Xp}hH$5{RZTMP5=;;?pf}hB~fiLJtX$010RbU?&c~$0l?< z%ULilXN{Ev9gn|gkF846==g+`=ZBbAa>#XD=r}sya5%I*<Gy@75qd~~1V}(nK>1Lz z(DB&H)Om+jTS?<OUTsHty^g<l`C`ZUB=bskzy1#ZP2=01_*|U6Zyb;7nb1Q5BtQaM z0{GZHq+Dq6j`GC0*&kU+UL8-5t=K1G6$2ukcxnHXHS9Py*=RyS!meGrv_0c^Tu+1^ z5+DH*&=b(;_!r;X0uQdVlAz<et5Rbw>{aVHL_DE-zm@R6mM4io>bU;7&_e<wKmt|? zXy#RHm1%(oR#-{nI$i-C-y`H0#;x`yE3qh(P&Kj8h4U&_9~H}y011$Qlz{d<XYE&W zGT*n7pyN5tV~6UFs&%~W*?lXqD0A@oL?CpW?>VK9hE5V70TQr80N>2Sx<jGG=bJ9h z&UnvCf{u$QVLTn^vJ#6j6?ZQyQP6Rtt@(V<Y3UKN5DAdL|2Y9=9}qU<D60D4*$=br z?^#Jw9d{3Vti+<s58Xd1Eh_tfoKC0yK~Tr_Oz0s25+DIB0qo?&c1nEFO^m5S3O=2c zw#+20&i%Ny%_YifjG9*G>fA7saNG(x_D2z=?90d3h_pT9dKEnpdPsl-NI*(p>(;Hw z$;p`CP_*@^vv5}G5~H;F)aQMJ{X&JMMz5z2#f)lzzra<b1fo%_9FL5Qly;2caVZu$ zNq_`MKuZAU)&>OyO`cop?p|Pjf7X|a^eOz<XPyy{RJ%1!_pm!O{}X);@GRW_LAQJ2 zIG2%;5loKbYyfSaym{)l6bqdsKmsJ7CGh0Q6TIrIuC5kZoOwC>oxKY*X>RJ$`&|!3 znJJBXPahyeQwg#ME*}=L_>vr&?(FQ;_Q{*4j!Uu7NdhE50uln4+}OBrBR;gIC~W`G zz=v6DXQsTXPHC0eBWi^l8yWj5?CKg|uRItuFf^c)=Xc#CPl7HIAORA1GXl-c&3N0X z{<K?Nt7}%u{F%w~MEZ9}i;-R%`J10Ki*OjI(ACx;3ge@0_|9@`YpYS8IUYA6Lq7?S z00~G4q@|^;U%!5Ea8T&%3D?QD69bjB-2S2PTQ@M`UYh=asHCXASj4*B?%?2HyWKA7 z%4-*O{51*wO9CW70u~5h0pf-Y8*Db4ShxbsbyQ`&ZJUksN&aRb!P7DjsML^EeMlV` z8yg!E5+Yr0C^}0W7bs|u011$QB?7gzwU}KgD=Sk=`3YyyOxv7og;8o17Iss6)8WfU za<1eywciy^wXyX?6vB&Kr-T!g<HO2mNV@k&-BIeeng(qWAORAvMBvDgBT!iN=Q^Rk z4fh)VQuKuoVqu(ZD4iKUdq&($Bp6>ePJBIC6o7%i#(Ou^o|>8(G?AB=H)V&Y<5MDH z0TLhq63`MD8ynlVZy(kILdw;n@}ZF-wHCwf_4LlM1<r{1ok)QRb9)E-G{w|`s1PEK z$}ty@hO}+#^3-u15;{nL1W3RF0jMpcTtC605olM7>$f{+Xp*a?UQ<k+EiElYwW+D8 zqobo1I`WD-ZiN!dkN^pgfP?@B%a~xnqQLn0c=ZYvwJ5iDw>vI4qKl)q<ZnTOfh?Tr zGQ#$FJaKVx%5;jAk+{+)>bT_D&_x0yKmyhY;I$`KuwXGFwt9*!LPDCY8`!joC5Bj? zg44LHw~mt3@oC{=VG<w#5|9w+?d`=}HpbD|?Flu<87%5aa}y~?F%-teqKJqHgr}#c zn=dhxv`rnCLZOocNPq<1fB<%T;y^^mF^<!Mfnl|BUOB`Xm!jsv#yWJoBTY$3!2wu! zr3s^@rR5D8MF_{^Z^n&LBtQZrASZz1v~V&azQG1T#|4>&9UUEwtwXqAAPc8*7iZz3 za7Ranye?~A>bNydEJXq&KmyYwpp3ZjK{$uQ0R`Xby<i{<Cr0a-jhSYZ^5WESITw0K zfCNauUkFgg{pCrqpCmv6Bp@e19hY;Vmjp<F1pI{nb=+T`6#Gd6BtQak0@QIi7kWv6 Y1W3SN2vEoU<w>!hBtQZrASV#;U+P6Qwg3PC literal 0 HcmV?d00001 diff --git a/share/windows/wix-dialog.bmp b/share/windows/wix-dialog.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b26ad1e251bf9ecd8aa52207d13b181769852bfe GIT binary patch literal 461814 zcmeFaX_#F_x%S`hr}xAEy8hR7^f)k2Va%L#lI~8YlkN=6b0!iX0~x>xha)N~dXDcA zJ+B@C5fDNGgrqYNP!JUllSe=haGpRwK|lrtnaKq2{oMES)T+IE2!w=VcPiInQLE~y zXR5t^RlD}uyE~42`TzUh4fby|{yPBw{q27>G&JGA|JCqbt8Taz?YI5^4g8N4IJK{s zQ;vVM40LRtL3zFWD;X#m=#LpF9PeowoBNLj_qXm(e|!O#m`Vmp23{{5?}xnZiTLI9 zUNTTJ&@VHv%{aalTLD|qr6)qMeg`6QuX(6{hmrE!FJHkWsFHz_fo;a|H$|5IEu6Ud zj}~Tmxt9!-4D`zk6pq)gUjNbHyAA#6m#^RwRLMZeK;d}dc)1Ho21*9{b_NQ^{}DJo zcN;Fcdr{T5U#i9Xl7W(e9x_lkzAZWa54$rixcBfHDAgqcB?Ems1OFo&-}>d}KR76R zSquLoH1+M5YVp2gpk$zj4E&F9d|NJoyYO-ACy6eqwyU4pTX{Em=;1X`s!Ik+2Ksge z`X9%)Hy^vv-&fux^zD~w@xElBWT1x(Y!{CA6|VKK1$Z|TOkIFIyaq~j$w0|K-_F2x z;dmWB%H=;u2Kx3(wRm4LP%_X%1`5Zwyo`O56rTGg<+r&5Ju2+sHBhQc21*9{b_NQ^ zd!*h!ERMI@vA+FME#8+5lnnHcfvx2DTigMEi`};xWZSvpKkiCgf%otlDAgqcB?Ems z16#@Q?F_^nXpQ`KX0mU;REzf|10@4JWT0?-2bwc_cny^5l7W(ezMX*{IsPWMKD4Ev zb0TBy<;qlV1?kVM)CzCm51YLy;TpSdVEwyYmA_eMwkZE5yzSdB)#820K*>N48ED8z z+C4J1C{RPjm4=m$T4dJ<IH2DIeY)%3)zvL3+@e5NomTTk!Vj6PG*K5|XzSjeI^lHr zMtb$|8YtBz10@4}I|B{vE9Q2rr~yzN5qN0=z0<j_SK`Z-3Nl^eK(Afs2`2+tth1Xg zS?F2$mS>td?JH{_o-`w4J$u-5Q)V$!C0Jt!dZ2dJs|TZR$fEl8?U!otzGR?epoa`J zfL1*Kg7vn(Hc}+eq(WZVorXHT_+{Ok5gqG<ZO(w9%2skR6#{&eNy<|!^$Np~g2K70 zK%J5#kP5Xfg#%R{y7-oITN6t+rjy$}73zFTnPENc=6O)CmC<mlhu1)<E*U5p=-U}+ zaKPEEZcs2BMA@4%V5J&TqXs&pMo;TX$B=2((M4yjFe{5w-km0DjLM%bb3=D-SWpRn zHA?J#23zal?p<JAN8U@0rH*-1Zpb~a*PMlK!Mb%T)W;a_39_8j*$Pjp>0xfAP=-8^ zIeq)3TD&hAC>iJ>0}VNvW9KB%r$P)llGRrvLZyzJFD_X_C8LSe=SZ?L>YY|qE79y5 zKACA(3q84#c5ce2Kvd{hS;^$WnYP?vFXxh>(DbN2@>3H+im0Y<LbF`0F2ks5s`@Il zuq(+birRW>HH)Dktk>vCm6Gh?HBhQc21*9{b_N>aRu`Kpl6Iv=RReZ(hfXI;2A2d} zC!oWNtm#$*1>jQhDvV~1#S)eDuj;$@s+2hFYME$Jkd@wwG9BX-Ro6FNR#vPR6uJWv z2r(I|v@r@@#+gP#zA|k!l|L!ZW+(|GnJ9;3vJ#rJ>_rze+0nOOs>S<~fs%n9GSEO6 z5ogXX!vXJqD>#72+ysRn2*ey@AsO<4LSc>&k<JQORTn3k?*>4*4&uz{Q^U1d%!NzI zf0I|GE6Jc{7IQ?}rG)3Eg|>Somw-zvBnMK#%q7z~$|GJ0(0Qh!3O2i>aHTW(kTgdx z4MdWx_qImf1N1Ixa)Fg|dUy?#>XLzyfxexA2Eszb(aldL+KSIvAew*$sIfEAMl_^L zZxXNLEIpw_OmxbyDNyJ*%K>M26=7Yna*|6?yR@mLM#gDHx1GOM){$GRfLP<Iv?UMo zLKZS+f-sbPQ;fP)+3i|rp(pi9h0Hp8b&0yWB+$BaauTZ5#u2gPz?tMp<yhZ-sTS`` z21*8c$UuXwNd;MFv>_m^4Ff|CCek6%GZjP%cFdH3wxo=JLK(o93_^VdAZt<$nO<S2 zP9~gjwN-1d)w|o2kojh<ewhillF(^Rvemtn^2$Uv4l5^hQ8P@RlR|*NwYjJMZ~?O$ zxcB7KXUdxl-9VwM2D6U(YP?Jp<TZlzU3z#8l<Ja!l7YURfrbhej*`R_P=Jg8K8Ob6 zg`q?O&Ir{QIK1A;!oDVn&l|n0zNXFeWNdOn)DHl;<~l?4Gj%kgkya)gKClq3CV3&! z+@opMyNT4XPS|CTkjfcZRCMUBBUM@<*G%W#3hF&S?m$c`8M{;W<dQpVYNe-|Tq)Dl zqDxjC>-3j>mA-we7Vk?2ddxtB5rkkBN=N}Gby}wfWsFBG=d7<lBUK?BlHNru6MfV~ z?2^I&lMeMYy9tz;Z*`gtXBDbUGnH`ih$hOwoE=tnq{?TjkpP=)Dw2#D^65too4jIA zGS(L|zSg#gqOYQJc~eETwXLRBHKvCt3IUVXp?Y=KjFQQi1|245Q;uShW(8vB=wdp1 zd=-?2l7W(ezMO#u!$i=K_q;HaF{0u{f&yAa3X(LsqcZSBC4@_$7BxmacBEL=tH!R? zQ<wxaRDqS1a78Op%v4dc?=1wj=)Zb7k!dt^5|PB5wL&LRXtsFJRaBZb_eZg#MuF>W zzR}w}AztHeEW-2T80t|D%~puFAeAbQ$h<WZG#Vb-c!dTNP?>!h3lqYQv?Bdxu5i3B z->Aj+l7U__&|nmEmf6j3L^Cw#tV==1ctL@R5r!KITT?}}5O4yjBP5f4Q)>si2r=xg zj>&=0Lk7{7I?^9^)yky2=?@@!jT}}`j7S{~h;hkYbj;l&cI6&B=04L_q)4&H*-ZPP zFoXVbo60RN9CDHwlf&kN9~q!6C=xtrkk3+OQJXe*FOt9jvw<*~OlL2zgVIzoP%_YW zGtfY&<;V~n{48Dw89b*|p+nPwLTve}ne+)-K~IL8*f2@lNv*LEPDDe&J8DIobrHgd zW6eNGtuBpjW;Z$S&N!n9yO042otWB}U`MN@bsA;J-s+kuka<XL=t4tu%&of&^f+_r zA<J^l(<qCcKo1;xq{=+3G{i(AbF8nD9FEDH66j~h_uZFi@w{Z9WT2M}Gz2B%Zg<ew zdRe#;8jKg#<m+gINM4TRCqM?tIIJu}dB=)D21*@u=*jBMT*9%|m0pt*nO@1au;uiW zaGb4D?pcj5bu0JKHw5IEHJL&%l;+ec(xq0V$R(wL6O!ufT+=<mp&|5=8)UR0o9SYK zR+J)&Sw|}%IV`Y?k}2P6!l6H`(FA6O7)vj&gVIzoP%_YWGtfZP0&pNsU`3R~Su8LL zSQFr4Vk$e433rHD7b!tafDc`QJ_L|yPz{AeB`Oza%$%T>nB^MGx?42)3}?JFuQIfe zS-ENYY&vz|(j2Ba*2tVkXRUNwO?8*3G;J`KB}dk+SLn<DDs8fkbIMQXv3$Do?u-Si z)<|r+M1ko|9?BU83nj9ZELsgyr}Lb?`!X$_mkg8)^pb%F5<yfFO$<`TDe}e0lHrx4 z5Msz9w7M|mc^NX&MnrNB5TuAdH$?miRqF2b#69T-(}7F(ljby4n1?*5M|@;W%pXQW zGSNaXaMKwNO?J(H=`lWra#dR2q)K|iA~i=x_aRh;Mfqlu)sZL7XiK9OsaZ60@=(56 zrIdu2GOwUqlKSaMB+8OQiySz4WvWow%j=*tl?;>&^xX_J7zhjjP7Q+^;YG?AS=3}Q zIs#k99rjWeiaE=SJH(1mB1zX{h#_~(kSh=3ILPYR$1bWAkCN%cELc<%&(64TO!$jH zlK-Tn$=IP*11M{Zu&9(ymX#ufYznPX!i=<%A&wb7yEDejikY+SvTJ>z$9<^r#OfIc zt%R7|lLPEa=R>Ep+L5{BLr^&0ckj{SdC9<*GSCorenJ4*LAa0zcA0P{JQ;{9ZW0{M zj?`DZvMGVsvhKv3xI@G^4T(iD4t+Tdm~iMJhU6-pp|^w}WYWao`klWfBhM{_ij}6{ z5p4Amvnb3f6N?&iRrOXwlA1puY5YxP3Ya!i?t0jT^46-1g*mg!vNS|5=}%T@BE%#g zftW(Uotha)<*+&CE?L3y39q*FVkqq;10@4}G6M~~$;D++%+BPF-Ty)oS>uQ?c_Pm! zCd3#%66wf6AtoeEo&v@oN3&@oPiadEDP|ajFvN%+nWHB(VZM=HJj)Zd8mDk65W5my z<}xN}YH`j(W27<{u`_VPp9m<U%#2%S`0VJ>L7^RVUO7}w=#^kf>-2|W7J^IC`H+_n zkrPicFHN3S<epMwMy*w6=7F(zLaL@YeexAroGuwC8Q4+=8WKtp3rH)Y4`ES(Osw(B zgcU*um84i=7P~v#qq1Tm;U!oLWNdO)vPRluk>rwo^4Ek7$5wA=YjST5b39nDK<KbK zlHH~s@?@?^YI+3Lh=R(gKQyC8wrbs$@?<@El^mmQ?x!QZO03+#+*UIYdI<E>5~~RY zuA1A5H_kpAp-E9&!Q~@_lmx`Mr58hKFBvEq=#v>}Ff@o1Vu7K}kP-NBKoD4B8L1In zNI>F`1aY8HCpBkFR5HjR<+j8lS|qT%)yl>!Gis{HFLp^a8Q_vwCK)(G6g4g-yH=1| zLfj1Tl1634`i3V#L&%tz3(&W4DJm^>QpK}RIl`+0J#|<1m~iVZi|#O#$VvCvCLzkJ zp1v_Zj8PUXSW}KJazlOX67_TX<SVo|T{2KIu%!$%q}$$bDGCG~tjU-~Fo}#Lf-%Bi zAx2xlXzP?QWJr$~3P}mOJS9zrn$_10v67&KLRU_-nSLrkFKg1JH_0XQN3HaSWdY7s z#7VPb&NSG;dRg}<TnSB}td2TU9wepRs=HkEN~WR;r#7Fajj5w!t^vYav(r{m9w|i^ z2urz}2)C_?smKDcq`AC0nlQp=yerH8_?GU5(q1yqH#5)>L<`s@W{DSsg%QMXK=hzK z;iE!iP)RZ-?=_)6fmlr-ODOCjOmnd~P167hNz#09H>{GEESTC<WA$}iB+OVOW?Z&# zjC7hRNMXD5Lm0J=2E>F;<FEKwZ!zMcby#tK0;YCJH)x1P<$uUmnW2d!Mn;F961Fqr z^|*McL{TR*z*s2IH(#Q~>ym+zfh}a9!AY0Xii{uvj0<)MbBR6%cQhI4oHDF2W(gl? zvQ`p}<y4;viIQ$8I#!sg*Je7MiL`F2QcbcbJ#-8L&S<G}8T6`9>;8Bzi`2R#Nt*CW zRpJ~bn3?2*<B~>QrdGK*U-=(OjLw$cs(Y0XbDR0kjG9gk3YA;0%1UxO4^Xi)kS)9x zN^{9T$w1%CKtoQAM3bsA;YLg$4jj;Gs@OrGh&bt7L#_-u>P0a}o7Gf!l_zW><D`%l z6SlIB2Gc}UD}!$0m(}wKva2aWGcf7`>gZ>IRZUdrIf0XMqb9U~sU$<5nms7<mWR6? zMj><QJ*$8F<R8-O2jz3_SQ_RSOSnPedyU+#SIZn)Q*?n*zbwxkrWBV#$w2?gK!dY8 zyY0o(1PBqKLPPyF0`Nq%1*e=KNudhqjDoE(9W)ixYUOF21UGpjVAOP(EwmsFg-LS` zGF2v=*(K@bI+N#8k`r8B(Fg0EL0n2;CDpTFn$2{IF=>z$PB3PjV(9WOH=K=E)aqY; zhrO&Xu#TEb?_Mn@t-eO5CK4t`I=xkPlQ1tmZ^~ZTAMaoHZi%L3ATrQkj0mh$L^cvR z2q+Nb&FjUxgc21DIsy%Wl9ZF16_Qe~q|iE=MY1)s?lp8E^`d0B9UH`|ltM{{&XCL^ zQd8)ucT99PRgA^NvJ50cd3P!l%5hc{IJ2fUA*QxU&eU}udiuq`iQ4iLH7{*=`PPT- zw1jYd%|i5&a%pf?@Gac4E^%aTSY=s{$BVxFzht1FWuU>B;yCa{qVD;;{`%kDjIiy^ zK5>u>OugzuX-_~K0$>nUmkX}@^!2~DUix?UpMMESbVO5<cYX;;E9ZWUD^p0CX%Y~0 zLw8%NW^95RNyEd>Jc`w;<bgj3!)PuHosdaBNFkQMd32D6Z{AnVh~qLE$$=gm5>5`} zA*1P>+m}L5zAJ)okPw*bDN*RP@VZY!Mo#JswWvfB4up?HsU8kkHt16F$Hc-(E9f$v zSI+a+!tp%CrCc)5k2268SoD4tksVJW1rdYwCa{8RI2l*Yz4gI6aVhfRoa!HbmJsAN zf?8ow8wlszu}tVeJ#dBtL>7;LGhBjV9e@!ns*7nLxpL4~92eApPA+VrMEc>3fLL*y zI?-CwmjqmR?WZw&nJ1E2G1o$P);JF9RmdymV&R-ZuHiTn<s6S*AG_g8awbm{%5V&z zw^h8-tMkfv$UHKTW>DydS3-Qn@rc)5jiBl;SImQ-<zLA_$w2?h06Ff|@TJ^D=YpdX zWU1EUCaHR@^5%(LV3{qq^WENBBnftoMVVVM7pz1=(+V0a6VU{E(8^l*R^Z=m{ko_G z87+zvq^bq4*5kk9dYmRidFv~SE9YuLirEE$c#IXt&26g${d3<?lcpk26-{u}LS9+3 z!R;Ksoo`&o)5P(bM6H|$AD~2$;*7XbMD*5tNExuENScdbUeWsl)Wcyr`|x=oLi4_C zg~jr(WT0fA|7Cz2Cvhh7%-i1SCIkTM)p|V9A%TM+g8)dBvI8(l8~BJOF)=oLjW}3V zOD7hai?D&PVlHTl?y4u$=0S<p=D36~oT;TPu@&pwf4SjHQ`emi4U!bgWCF8=qb&k4 zj;CN(&YieoUXA9^2?Rr72+ymy*+a<CS<mqmbA#iSQmBGUb%~NET`Q4xO&EL|<RfBP zRpt}Ntwyapdu!B$uriPas1!;DN(TB<1{y#y-sE=nm3U$tD8RB7#d+A^5!jcQA~9Un zEi=^x1P7ogW5mS57WKd))B?V=Zc_!Q4J3Wxmh;j2Z?~Kev>EzW%+n$rVxlcB)kUjm z;2!eic(%t)&*iq}2?zs%B0HS4NV71pvW610q7w4(1pI{+xXNuA!=kUp!To$PTRHdR zH+%_w;Ra+X@)}<42#%u{Yob0+6l4&r%{N@9!@7AA9Eb9{e@dp!E7<3u6_15L*9;mp zHAd_7l*^KVl7aq_0b7q(P^+bzF@oF?{%m0ggsreW0T9H{!=*IEG#ShVf036<?^y%b zfk$a?I>ANQP5UI!rY2|u&g2Qo&<{QTcI)|YKudLPkEqEZ1>aWAb5I85ap|qL>R)5d z+`SqmXvMahQ3L-KSLng);%j+`!Do1`SxTmD2Y*GZ$7wVaT7D!0D=43H`!ZTwV~H|J z(*~bKTbnXjiB^PWlKhZXu`AoqjMy!T74sHe_Zi4&hOmy<iDHdXp&@`+vQ<;ahtfvP zoPoCTuVkQPp#No{A(4d?5NHh61RrjGE@Sn)3b%c&KGxk@FFS@vE>U&rRi{HOKqHQ$ z3t&VZ&C6G;m<AvZhW^_vzNvy<5=NpOe>4ZMVi^t&0(@vnXsa&4@vDr*kR*29b1Yh+ z$L1SbIA@=8il+fqt@J^8XwLN`5AaZ)ARK73bgh`@A)`A5#C>=U)98*?&UyCk#5}hr z2rZ3Oua&+|x7mVaG;uxd&#oYE(10%Jizb_RFd{2#R)8C*$0Z6-ZYy`iQq9L4I|H}j z+ond93&$}w<zLA_f6RdGt7sLR-|$+#0Tw*6&pC~=wgA*dgkjniiH2h(hX}LPE8v2~ zBLq^t!Iw-y0RU1xI;y*&ke`&IBd~>5;twz~9s%MKfVTi#QVXzZlL2C4F)q~#Pry4= zCf^{eCTzkO3e&M--ZXwj3X8A;K6;aRYfE)h!so<sWS~pP#$5O*j>AI;D?nJBW^ox? zv15~*i9}TaN<N)!&anL36bJ`YkM8<#6&}I_(t=hsX|93~FeGQt*9sg9$fKN;mqN)v z$v}U~K!dTB46<82yXOUW0Z1FoT4RdEKq0c=s8uiNF?JaJi4p<D^sADFj4b4fBSuCw zJ-C1qw%Rc;8B&$1d?UzBm|eDduPPjantSE`)a<KpLZZODX<W-|Ty59Fn%oKsA}Pr0 z>+xtx>7v^LsCA5#GEz$pnixw3RyZbkd23w|4kL;t#YHYtztSi%lL;$b3bn)GeW|}c zy>Lq`B?Bb`DFY3G14oG?%uq!D5emW|Id1g9A{Wa{EE2KeCZG*i!5U*0u@xK?*)zI{ ztvItUJBqdyzKLe1bJFZqgzsdI1#>lOoOi78%IK2z$FUx_F79gV$sj3M@VY8Q1P_@6 zXx91~XIXLJ%3*ijY^k0Fb!Uu%IE76hbXvh-op+2b%n#(1OmoH)qU7k(hC_C}AZJY2 zoM&aqOnH7hz3fY&WT0PVpdoJcw5&6rI~p7cj=wx^@D59Ihz0dnkUaQkgsSjCG1Dn| z5l0xc?$(RwCw)vtfD^fRY0!^L$C>+PI;Buhj&o(sJv5m5^D5XVue#8vKIg>DgbfyI z$SBD`v|&PyLyz-O6H;7S6n4Nd0F*&RlbMD^(@br&t`wOn*TVp1-Q?*Q3ei_#hN>(Z z>Yh5%x{0|z44j@6j^{7oQZ5<jKN)BsbM2lF$`ApB2%%$O3K@qH87)#I+~AU6a(>xl zAZC#!Vv0!QWm>Gt#vNlE&3PHEVUaL`hZ19fFwM-lAu5riofU{f%@j&!B^<z26TPxj z&>5Gnyz=hmhGqg5DDQAb7e>KLlgacuzFFz)W<*F7EQZfX19M1=RFXXRdO1K7=o{HH zc{%S2<vh;N-+x}VC6bbXl7TD(4dhn>s1}lj4Dv`UW~K4SE)z1y5$ByzDFarN9d_zP zP7y8@wv4lGi1;Jj2x~fEbdy~xm}wpC5<YvqUqT@rOOlF3l}U3l>IJ%?Imu+qt~n5W z>2Rhw+)ln(X6!J>%mF&%=TKrz44+7)mDI#8KIOP+X`?DvE5~5Me1j@lS1Qc9nZwz} zD7ldZVwKsrmtx64$w2?fKm&ng2oR@&K}G~2!&v}27$6KiLIw$<vN1wp#*yGx>PS_l zP#sw>ZBppuqCzXHBZbARicOLUA7s}phS~~_=2ZZW&YP30v_d)*yVc7>@-!}8IT0*a zvm+SF`2%7u$xB8mUV9W2GtDMeC9p~(-SAn^9e~bIE+-i;6nbcxZ_>ji>yqcw%kq#h z7LNCy`?f?<GLUDW!IpKgvI~wlFSrC2gNzhT91>7;AUKE*YM>1ICSYmJ=zIwc2{*12 z%p#anUy(@Wcm~%r&6uPh9<Ew1bHf}!L7q!2n#54HriiSIQ%@ZwOdvwuwYeU%m}5HY zE9-U+`cthrSzic<i|q84o}2ULxei7bZkSq^salz?P;Q1I7E?mI>dq$D>|*)AmvYHK z$w0r!K!b?jEC?Es2)Ox$2BL(V61FM^akb07BnVNJup*YFE~%FUx~*rW5m2pySCX`X zd1&OyE0a75$tcSTA<l4*SVUh*s-R$_EF!yrG>fyeE7Nrjn8T9n>Xp2O1`2q0$)_&z zN|)ADvD@;Wyfsx80&0>TFU0&*xh;$GnVM~K>Nl_25=hBF$v~cg1_KAN$bvIMH9;i@ zt0V;`HVGnPO#p>ULPJlrq;;`mMSb&2Y8DL>6TOg(M!_%#AHof{D{Ylm&dq8*$OTm9 znOh|>F{nnGLmv9we=64k*(xC*;8MV3!ZCBtDwP4v9L8TkR%h#OUF=+yO($zo6OGaq z<#ow(vhFcj-<SZB5-RuZsLThxluHIm2Kr3~8ib5QM#DiML*;aqB(YVoBUPqeR^!WF zqnjNSRSj?^8I)IdS~p4Al1!AnK2=IA3FmfEnYD&>udFWFrMiqRR+EfMtu9@jZ$7NX zou`H>G)77dbi?VK+}8BKOPQ{tvpjdNl6A=QK&v-VdAhVpIjI8As<e)^Q%m7^zqxHo zASDAe8EEKA0YQYkNHB6p1vM%LQCNtngrz|%Q0htDE19UTsR?baQ079?Cm6_tSVEY{ zWmaU`5XK23U6O-li$`u$w$wM*Bbku2naRtc#A@i9pTm}^%Iec)^0uZ%N-~{UU!Npu z?1plRaYhNda6_J;DHTji%2B8p`EpS*P%_Y8GSHB?knZ+WlW?G)B~i$UIH@4{FYpKa zB!e&1;4<mK_u6v}_%;n{rmZ_Y39uma*q7jY5U$vi+k(9Gz#lkFuPRAt)>;^n>4!>C zz~!RrJ_9%Kg?qTo-xzS};VVx13ai3_0EF>fp)6!Gfl7VPQ)1A7uM43bV){8l)k6k- zQ!<l>C`gIKaE2lOimcBBCIFqeGZKbr*@8fRNM~M?%1A;oR0<^nB?J8_0}Z;*yWanK zO%B$K3-cy+Iz#}(gh*t^5z{#j^*QP45{EDPLt8Qgg!L+Hh?IOzNf1r=u5m0Rp<Md! ziC^-n^8xTx4GPrY-}$T)!zBXb4{Vta_|0+AzpGg2G0Labu1?C^y1Z%fOFrX!r@bTu z%Fzl><hB&ztnP}MmzdjpVoUy%LdihMK!3`Bb37>EH#{%B3?lT%@xWz{8!R40leE<B zC0}XT{zioPbL586p4a0(uPB_3PKUVu)Pvk0Qe8>zHu-D6ZQF~tV7Dllezve%Vg39% zBy-jS*}+yztn{Q=1bQ&jNI+-(czU<`>ndeVA*WS;Tq*-Tlyx1;WywIvK>x@<gWvF4 zS;zW1Q9y;9;{l^sjCa=j`U=PeB1@(YQfbEk6xQk(=VYi(7}Qe}gayr9xLb}VRb2~s ze~?D2t~H^S9Jipfj>cv3AzxYRtp;Mm@*I5=vLT#i1r(C=$u4qOXF87p+RR+!KW~Bt z7)sL*lt41yX|W}FbVREUP}Ef8RrbfzV3b11K>x}>0~W1ye5qIv%k7-wb;3C!kr}<s z2RlHzlqg4Vt)Yr9owdS`8r;?DGVEB%_plz9V<9#_M_axg2O{$jQfSU`hMWtioN!;e z__fr9Mf{Bm`}0Hi2jQe4pPwL*gdvc)k1jc;>)x7F6BzQ4<q$!^kZ)nFobMJZfvE9_ z?2_J<Q^`QdK!3{s*W(EgK>^?<Cr*MLqBmYhjN9M&ws-}j&Uxqjcv(sn;XXf8Sce$@ z^9z#KOyE=!gE}*Ln$DN2G@1lhpp4A9(a!mxVe$uEoaUX?mQgLop(k{9+HQF2i@0)_ z(odI6n=NTQj@D`GKAcj70vN5(67-=tmq#nyOXkqj0Z$N7<XqjmKYOAo&+EjJ+EOSP zC>iKa8HjxqCuTQmbFiSE<A!pBMZThpWuqW6Kfws_3h)JAgh;W8c&ZULPeM}gs`IV0 z`~C4cW_7*Hm&RR(unWiST>>1-V}JU^XX@2r#=2u!@?UCg&2IUzDDZYCN47pZ$l;DI zK6OQ~c~&{!L^hNMKdZ8~$x_N1Q&ro<UR|RuH6;Tj1N|Ta4TLQ2`E>s~0w!hD$XP~^ znQ*>E3&4R*1`)xibKVc*Igs9S1Omcz?}SYnC~PxLz8+7lDqz}J^ULpi{0Dl9Be<5u z0ws0WRY!7M{?7+k^N=NgiAt+!X2vAD>Vb7zuy<i-t_{lb)EU{8H=-XVQbZ3w`<QcC z{s-u#-`#+%s@{@gt*OQfKDbG9DU=M94D_cAWb5(Hd6Vq651?yhM}p)S5+m|8Ceq<6 z$_$q|s(Q(nQLJ`K*pe{Zo8Jq^Q}^2Sb?i$xVHsm>Xh|NiBqb;Srr>qj4<RT`TfR{P zvFm?-OSV<596C=Yt(=cfCX>#5xs46(X;)*X#ey=;o%7Dk_M?=XK=b^3W<{l6rXiyS zRdO7~^!z+O`A`Za10@6fDFfiR69k1x&Tgy8sgZNMYw%i8f>t7tK%cKwV;M^UYEG1g z80>ZxCcMO;`L)6})4UOm!_V02F+N&2TAapN0jAKvan;=OsPCi$xSF4;zCKZ5!T#lx z2Za!+GxxGGL!iYx#?;q#U`(fH28DcrL>IYaIw50GK++F`HJ9*g)f`Og7Abr%)2X|x zB)g?hGEg$mpE7`bmF#VJ#vn%q37BBlHS%iBXy8aZvS;Ixut*oJFgHIv{()Txu%=$v zRZ&|fp2B`cs(iuQ&HlJaigb0jG*HGH3(y~{U88wm9bK>!BIOLk5Sh%OuZSF}sG_^{ z-ug#Vd<jg?S++3QF{Y3#5LrZ4o%q%CIX`KJ49c8)%qwckrXo|GVcqPSAz2i)6}Y3E zj>&F0mkg8)^s@|TUqz%K1!9TkEZ_>X7mnL@L;wr8F^-TaIOn~Hasxe(opvO^P}@}p zeYzJmzNghOg-<7{YWBxXGkrE-(RBW(jBPP<c1cqOywdJDj3!SosGKB>)M?)Xg+<@t zW9-}t$EA^--a<IN4zL|BR(|{kU&dqri_@;gM+ICUlb*;4j;`+^Y*Ph~uLQ)UB<Hv% z%~WxKeC2LVntl$A4^s>Qf(n!y`Z*%i!aVt03MB(21N|ujzCR99=>FGQ(rD#GHfrQV z#wD8a8sUcBtGDye00^elZnr68N2k&o6DGVmYnT|;*(9Gk!Q#h~MNJhDOEp~!K&mf| zYd3l7BoPkDK7TsD2UORZF0of`GfK>7nn==H5QwF;RPSbNvawX;xThYgv_Yvsxi0N2 zn%6O%^)?n76!taY<Y6h443rG?rwka!odSV!)Tq+x$%35PT;k0K9CI*XDar}JI+91W zDn||Wk<&IsUDg6&v4rPi+C2;3LL^Cl4eX5L33DvKF5V?1bMV2!>8#m>Ppv3`s+8e7 z39gRwcymd87Rq$h%q6*uYoi_qXzkp9CwUNi>S9~)m9Ql?HQ^lqvu&fmf#4a!xb!hH z`fHe!cCFm2TuE5+o#lH#DYd0gGSIIw5bN=@Gj8`h=@2(RFp+c3R_<H|g54<-;O}&7 zCJ^F~&&dL9*m=ko$N(8uongh+n<xW4*2{$-O`3sD7p@$uVJMWFDosK@71cb*$j>TG zIot*%A)n6{So31bMXh$G7+k^@N**<~ch0>7TlwOqWdKIeF<<6`;JAc|Y9VY2YaUjC z%=C31h71ad5zfGz6q^3pHxo#*<;P}IoRy*&Af}6{W0N7<(x|g3Oc^st>y@%v3MB(2 z1N|uj;J6{lNP*j)H@{&BL@-ntL2%BAM%WQ3wJThZ&N)IVIr0K7u1&TAK+sGvQikS8 zKqF45vdsayK@ihVT;`h(wjOss&0#2nt=!@1c(BjH@g{m=`rV3oNH;<zH6=HUp%#>A zD?Oeo$?$A$oAro}<Tc^knKbKQo=7hvgupylcUaGx&{vg=QLZu}@+T}Ry|l=<A`hNV z28-5Yu@p)MN(TB<1{#0~+~I;$jsukKAbE2VQP}D!P=k0P)tdrpF&Q{YDrg#*Oo^F} zvN4F7fj_d<&qg;KG7aH6j+@)2-$|N36o{>fXk~Yo5rt{a`zjo>4j*(>Wk)<+Vopq_ ziMhqNWTj1qslMjRoOn~BcrE1G$wnWjnngC{Z(s7w9LD0#BMF!l@R=%mng2`?6Ua2C zoUq<p>Q67+5=+TI$w110eV<bxu-l$XPGe01C~1{*+@L^~iDKAWNLvI@8haqbN{|`^ zamr9XFU_dgHF9MDlJa0B+%REwr@Z&dIS!U_CU7N~OLBi~YEe+8N0C}|j$oQL2V_Ea z*=jNJ(j7<%VSP%P#Bj-j;V3A`V;kq{YX3yZv5;kMWz9qAT6cSloz|2`0j%p8L=KH@ zE2Xc?@)>z$(%&vHr7YVxrX&}Rr`LQblnnH@4A}GIez!aC5;{o%!&c3rTQn5ogq8d& zh@cOamQrYEr=AL2dIz<MPQy*8GD9eXu&E<$QN|JMEY3OJ%YXoX!Yeg1E?FnwEO4`E z^@epT*rlxV(lbNuN4fHl-cq5^%<h~{TyxDfJ;-Zfaad^flfSnl|2gGIz<fZAIm(k* z*8(INi-ltaP8EKZC!{%AyY?+LB?Bb`{U8I}R}ox@-9!W-m5aNY9p1F?Bq{toe$FG( zlXNzSIJr#N^gH{4-HAH{s2D^^@d&->29+529HwuC<5;NT6GhX&jt+Dp+w^3}BgX@O z^w7OU$B<9X%O9$RSCva90Aa>!t+fwF+VrNM7xx$$cqg7;#A84HEhovSudJX;{!Xat zs||gT3hzP(Qg_BkmplXJYF7=VrevUGpdVzQT8{$(q?O(LI>dCGbD9_+C{QC@`@^u< z(seN-rn6Y9TIsA;BK(DBbxAU=!CJ}9T13{30cePw7ST-}x}WmI*4>&F>}-Lk9+fPo zO83($xk9gPMK4M694q~RK3egnBmo*8Vy&$?tV%4Q56S%9jP0(_oLi?AJhD=^Sp<cc zIQa{@^gn`1`H__rS}N4#s$7-~lnnHb3}hU4(#4`O0GB9`ldi%X0H=fUsa}PuOSC3J zL9La^M={QXLsc%8JD@JrSxRu`B;*=$&!wN|%3O9?RjQXJGZS!pOSAhx_@axBaGrsr zSkPDcxt#Yhm79AKi-K8KlM3n^i0>vGc2B*szMM-m&xLZdx(2B&>+$|^%a$lg2D)Ux z_En4v>E_Q06)&<%r-RU$(FejVFJUzaB~eaLbKzVq%Dk*#C$Fsj6f>IihtA4e;MFux ziJz0*N|kZ5q8kNFGdp^H>LpbnBOjpI?MkQ4>fW_ut|7@}m6gMxt@43lc9{pxa$af9 zghCG_xe-m0hn_B@Un)ulN(TBv2DlzKI-DXLR2&fwzzAU?U;(O%7YS!X3A$4Q<r6r- z4nNp^Vi38e-kPE>(UUain5!y@UB8q$c6XyRWct|z&6P80#-a?}2Eom=%E_y$i}a*3 z3U!B6F(+yYKP^kHnGT~hnmBDlrPa$-sxr4(17SO?iOH$6YfYHmY=%=8D@a~7(w6mt zw*K&fEise~lnivqfbXjqVt_NFMxZJc#D&C&Ktn>mcOj!m6T&6LoY96_K_|7=GsyJN z2XiKjCVvcSl}@^v#41+<d2TCWNs>uJ2v`)X%$2LA2B67=3emmt6H2_POMy+MAHD2w zf!w0c993(YeyXIwRd$IOH6pn`wJE9$Nv89ZE~8&6N(M>>`a=fvyh>tgFo<Y#oCWFP zGF$gqQ`OgDRP{|w30{<UtcYv17E@EDBx5>k)d}D-YH}?4oMGscK=Pyu*+pb&HdSH5 z>(RYSUs=r0xwooUO}0*VKcy|#sp&Imh|3_mT<YS3g(j?rhp=0t9IbV|3dj4y9a~~3 z8R(jUhFE)o0zA^q&r7Z%bN1DtL0ytSYE1<;CA6hNg)K^Yed?78b@~al#9ZqI$xJxt zSxq^HHVVi@T^F~T{8u3qx-hNON#e3%amdS=B$*18S20OgP3lFXm9XZ#)QW<RNJWyY zE7)b|Pfe8}Q_^+#OHIi@$v{8IKyW<4LVR%$kR}2Ih)@++FUiD?3K@ww(cL?$SB5aR zLXg$yQB8i%EhY`2Fga#E#DU6Oe}!EMpf9^8nN*O5`pa5j^Hv&I@6M}6?gdhzEvZt$ zJxRh4kZ`C<UA!Z0)%zb|cAhfXLk@*iuaJ@c^1b|iaKDxiN(Q>iK*Qt!Xev}FG|~|< z6-0FDfCz%*mx7UMQkezvWwKKS0;!e4X2O(*P8yPR<5bwS?h>QCBa9kCj2dc{Co$I_ zt(7zKL3%>7@F%sM^WnLCv$Hy~#`5O+tuWbpnG!3j)#WLPvX0a%iBWU-k1&;l@Xf?h zq<KO0d8-WRtnOCs?gdclN(M>>`g{hk9*?_SG%@0!hLuJQD+gJkNmK%}BoKhhmZ(5j z>Kod;hV{WyXwYGX$SLb6{Z^10?gO!yjCzy#uo52XGIfC!9Z7@KhFF+WfFbOp=4D#v zx+)o>JVWs0BttA@4l9cKc}oHckaL6CvdVCb0+EEM4|(~CJfx&?_EldBn`CtvqaY{C zzDl3JT}uEZ1Knl->v7%rT>2SagB`>{TqZ_{2muQMlp3twVOmi&sS0`5NhP(!37oOX zeGre-mu1IUs!wV|Ch^Y6Xngko6Ca)LGGrZN)of}#mI|zOb}Q47H!i?a>~4<A)AW`_ zoq8E<>5|aQvmC(L4o{|QRukPL#G{wh`;lq$C_If8qhz{$1(eE?fs%o~o&n={z{T)k zM-48mMoh`*K>Rr-qL+vRnmF81ABd?nVcLAcZ~@i`xK<MgOQutkbS8_bz%GQZV#y*3 zSABL-EOJ2BO*t(}IakL-aJb=4GA;5X+@M7|EGxF;H`9^8a3eH$9_&&^Lm&lWh1@O$ zDuqdN<W};o--S6Y5s|wpbAA2ATKq2=C>iKB1KL*+M+`=O#NrM(5NqOWlpz$zyC5K2 z)!iW#JfbkUmdGOE?k?Q{>;||ABfg`Gy>w|N{4mW{>DnBuRXAbA#A?f8H?f<vS@={K zaV5?4hiZe}ROm`luPDd?n=L{tsr4Ese&rS2b9uRuGVFb&oKdJItfWzk0%Sa05s_l= z_7zYnO9n~?`g#WJd6fWMe)HEeLR=sq9Ej{?ebt=;;ETwp?pEgE+M+C$q0+h=h#fcf zS)yNN1k}DqSg~G`r$t%!nox*KtC0Z9?go{ZQ5D=)I4SpXL$zWaX;_yhPTQ=~!jTgC z<1wNpw8>jV?cuQ19itm6<Lt30qC6H_aa9tNQJph+GeLo}Ki=2x*5ZH3K=&Eo^D0D4 zLPmf9+^L9za;gtbCB!(PD3iKa0bO{AN+Or^_*r0bBxP>`P@_Y3(>W^5H~Qn|a^I*; zF1ZqdES23WkxrkTs+<{>ez~28iJBCb9H=p*c&W#FC9hH;H>Ao4t#Xh4yA{QvvrOkT z)F#Q~74(>Ch@~TS?EWQCYD)%62Ksmg(!Po_E8rrKITTo#uq8&!pR~$>NK6<zh$KNI z=SYRKAdAbWW1>t3J7W;Fxe0c3ok`v*&4(IWVZuDmV#)P%ZL0B5c9TUY$&akwdL<L6 zrzZ-Hd1HPuq(a_YO}(hfBF$x_hiWrnS7pNL9(Fx;R>~jmB}pk~L}tB@zgCO;B?Bb` z-DjX7!?Bp+Yzkx~I#gH*h*XjkHc6xBDoEn2R`p77acxEx3M5r>LqsE$99W4*Niww( zQZ-^ZD3gB58^uzj>L|_TNx(5F^d|GrJkKPlhc#KfMQtHxdQg@?^wp)y<YBtlsv3Fr zGGVrwa*3%%hC)f@QXY#uS4}7>`zqbv1EscPps#1Z_Q%BtV9pEV5z5YssIP^HG0tkL z)*4V+-?~*~fLm&bd$Z`5WERWv$IiG+XBkorDy#Y^rzR@#zPY68^Ntzjk}aY(b2Zn1 zTqWf)r?YfQn+ZftQr}v!<a}t0L`B9bY9}jFYiFe;^N=-CW#?p+UbzWX_VpKQ@xNrC zWT4v&*#5X~{_4D{f<kH~6ts`wq)?3nl30G3xRxYIleAQKB&EJ=b;ebC0$4pT6v(Sk zRrSi?p4{+OKsIzHdGj!Xuj-TA!mFRNbOm;6e6D(#&ODP=R*dzw630Wi#N?-!Q{RX; zoOI}$ScFg)mtE3Cx37RwSu#*E(AP6y`{Tx!K#5%v2X&Bgu?#e#gX#s2N>yl6z3JzX zF7raJA+J|2ooi$=_ax6&r+Mn7rbNt4vL3rNScm6yK9{dAX98%-L#xWlfLzUDS0Fmq z^-XC{t+FdIm2*;eRaGNj>!h0c`ir&rUoucK&}{~MJzfK^0A&J7Dv&7)3<}~@VBP9b zQ_BwYGVX+Au0&Xw)Jaw9D^*m|Rn_EG3)H<{VU0!CCgs(+My8uL0Tn<c*|WUqbWg$- zh26IZp}R=qO;3>B-OFrQFS}e&r7>F3q=ODb2$^ZrcNH*&kz19!eFc=tl7W(ezMg@G ziW+gxCs^?2udpH(2pJ~R^U<SZfQfw_&EY_hvD50429vCSMHxe(3U<!PZkORzHAzq* zEt)D<p7AtwNitS2qtu^wSN$q?Ljoa8XwrH$4@JCgG~6=*Q%gOr)5EMhq^im#bjh?? z_qfd6P%Pe53HV_3^%raLzht0fpxX>+J)U441yMsFs6}4jBP0z&dD)Qx0A+j(U{%6d z4J8FN$B-keLRF@UYR$144HfS){GpdCOyL-U>pH^usF7G$mrgoXdE$nkB&CH}at~QH znTqvQLZYu~GNVb}Ojq^PsoX}Td~+)?5vq%vPY#&QWZJuT`wA$PB?Bb`eLVxQuOj3* zeQ?{?f}`8jpO})LgD(VDtp+tEVtTJ6V-_8SY62xI3{^au<Qf9LxXg@Nm%LZHw8~ij zS|#l!5IgRvGj&e|_`~jbQ08jZo#3XJ`(vskllNjdV#)O<5W6k&){Yb%gp<4%7<gV; zl|4Etp*iVURh~QS>vwDMzht2M3}9b{w|zahi4vf}4kAN%wQ~kRV~4s2FI=Fm3tKA< zxp3E}P-u2jImB{r-8y6_CU296$(&CK$t4!l*UoZ=VM0%`n7Stc7O*_`{Sfs{8fxWz zMv)aXp^$m*Qxs~fK723@iZ`OJ)fujala<0uUfPmQ$;4&%FM(29GEg$m$1~8C<HSS_ z4u~6rk+_pMlDMNLiPbWtMvsV@p~_lAxwAOyE{kHB@hJ2Mm4bS5LtatLy693(ap_QF zQ*sOix#5OFTe52cVcIpT3nbH#2Ss7o%A=DNJM&0|6u1P?YUZ*$<mFspr6-Fzx#apY z$I9Pz>*M!oald4srwm|U#VIgF1PPAVrBfpVpD<C!AXU120+1D^2vVtu9j6dX&~F9Q zByCovGgc!#yrh1rT43i~USiT?P3o2DGyzshGgPgj66$p8W>;)Y!np&{%Dx$eDeTV3 zs|8b%Dz_U7t#6p93g(#NqFTGG#4H?Krb-s%gW`2P;i_G_jO7-RrXdcNdwLO+`jUZ? zfj*r9?vINIcIOKmVuui*O7VqcF&S2p6cwqRIA9q&b_!~Np;bAsMDV0PR}08eznh>o zGZc;`TA>hS(o>QFJNkxR0xRi{CTry^QY&U;7x+vk2?&dnkD&ZAk&!M1wX;CX&y+D* z$@~llB72r78OqL)J=a4+)=_$rHtU#j!c@~Vq6`0{Rec$FpMIql=Sv1k271asT8|T3 zanExdCnO1ZK^$NLq!Vk%IAfWyhKt;)o>ZkkwIsAl9uiB0vc9f_st6zg%j&J*y<#zL z&alaR%Vp$PG|310mMlse&nD*n(0U>`O|!`}5KCs*HH&u8CDd0lgq)N@OJj;u!kQjf zkERfI=RE@o2d(U)vnll1$XtrP5h;Z$qmqokLm0i3x}IJHrM_gKWS~!HAoj;eX95ev zNfZ`wDr`AG$sHG~XPFpO5eM`!N%ANok#WsQTEk6(NdQ8<V_HmfAc{)Xop_=W5!nQM zj)@7tFHIGd7z%R_1!dImh}P6gPMY&Z-tZ?lo`7yKhPQIe<ttnCO?s*cBh*@7mR(-n z>a5tS3@~0fqb`Zs<{mw9wRFkK77p~6{qa71rxxc+271nbz6TVydIBg50beo5&Ve&w z1(&Q0q!LD`iJ2hSWa!~ML7G@!f|AftnUrzjn3ZHp0J0jRl7Ty#Xa#ICZn^_G_=0HG z%3d_&5jpPN0s6zfFhP0u)8l2-?iH;YE=?`7VX;sx-8NgQcbR&aLXUgv1=)(3!@8%k zHJLn*$_hKONr6`~RbNFNj)jJvUk0V6WT0fA4`+b;Dj6({m5xY*h(U@7Bc4Dpfh>{5 z7RBU<I2hbfFG5WMq-`L{utLnSZ-CEQqbyi+#cgaQ-2z7DLre^kHxthH@JAuQjpzj# zmE9j#OL=n!p4)ujO!TP3C0A~jk~A@zkZJ2k8Mi{^l3^Ex!%Rj_XiIjPaQS0_Fo!J2 zRp_A=I%8${%#L)%12pSaZ%vf<0v&^l{OrT8)8cx`K*>PQ8E7yNh#JNP0|fCw95|cO z+S6bm0m<NO2ib(a;)OM_qe)UZYouJ=UAfhhJ5=jzVx@ebX8LAqiY2fMxH*E@^w@zW zXR&&j1MYJ;W3bLESx?jKj?1Kn+C)!Ukps++`4D+?`Q(GuD`OU>TEn_)OP5TYLQqaZ z-U3m^tj3f`ZP-;}t;yY>Ee@ZQv%6~(_u+HTFN4xjGEg$mhcnP1BylN6dXiJ3k2Q&I zJmV5{Fb*200-%N))~nT)goF$E;xsXxqNlhcW`%}Oo@^POl9KSpfaSIvd346vO;<Td zNK6{yY~VJ3WU-c*)Ng+JjFPM{8+5~!o1Zb+n7m@Kvt@?17-n^;xh?EM5)K&RO<1!6 zlcsp3!DFO0m2Fatppv1KqN*kZ60sy(G-pQp@awd=UNTTJ&~pa3KOQ7?C<rk^mE%e1 zad?>+$>Q=xrL0NXqB~>&ox~KEBs43cNkH&Y_b6Amv>L5*-8!2HWpoLD1US2-9y<eY z(JE);gPiA?(^A5#v=RDnI|*l?xB0--(u9TPg<!fSIZLCt2MzKkFUu<_k*lf3#Hi5D z$%^txg)%3xIH&2M>O#*WKUCH8%b>KB43rG?;SAXRIACFCu_FlRmBFAKRh4j#8%kO) zAvoy~j6%PGN#=BBYXvNdxl5TpsIfy#OlN7PnA9fg@HPNf^~&+*Zb+4k)^?EwKPTtI zw5g&$UP!!_Gj?{kCpRb=Sf?$UB&aaOi%WA%R!~sL)LH3ay~IpX7LzklnCf$dWj)@9 z@6+OX$v|%z;B$upNASYw5b&D3YN0VmGT=qPMP!k%m&Kq2k<d_e&#@B1h9s3UdEv<+ zMeBl^3#&_bV)|JlH-trZO!c|j?By1Fa+URFJzT2sg#Of6$t06ADQaeHVT}f=HE-z{ ztfW?}R6Pq)Qm<1oNkB^I6(mg+70N?hN>6Vugwj?rP%_YGGhqAUI{b#up<p<0i04Ez z(6E;kx+Psynr1I&AR}d_P;;&UH85uu&4;in4YgiP>7+JkR#RAk#pIHe{RnMPOG)`} zhA5y6Wb(|3>qHsdO@sGB0Zp`<@{^iWFDpr{6{1Vt#9pDfCXmVj*DP0)OHr_lv0Oz> zL+&kmCFlF>tF$;?GEg$mTLyyT6&FOD1ilJhHB<_Yi%MXP;YL8Qg2TnT7?epX$BIEp zT`Kz2YM{38fwpq|SvhDW6DGfELC3N=<1aX&<*QT2eBr1OpE!8%`zIVQuVvp^qxL>- z_#TH3-u>W%cAa#<E*<;tJbqssDBu#6Xo3L5AUx>(?ZZEDFuITZ>QtzjxNMGGm6a&_ zoFt>x6xnmJxb*1qIf;HUI+EJ@)=VvE;^8KeT^5)SQ?AU!WtIxMWc8W|eVPdedV3+1 zwvvI8fj*l7-&e6a-|66d5o^c=)`(472#dK%-Z&z%1eGLAX61}a)b7Ss0$eSm<c5*U zO$5A5e&OU5^T%H}tLcl!4F8wO0~d|k_k>Y<95!gDvHQGx)Sf!tGkVW=H}1hhHG8lg zXI8qH%6ph_bcB-K4;uu9P&@47lVPImqFFGPK$!@u6osEPX-t)zb;#>HGxp{q%XXBL zW)2Fmo_a<8bD6+;_C_S+D+j2&&%R2F<0S(n1HENH>v3Na0yjZe;8JJ~Kv$H>>nWBX zUNad;rwJ3^U{=;KKw~U6%@p(L!O@nXN*x1vD;G?-c=njHj~V>__I;+0-2IS&?`_%V zpNH=H&Y`=$YxwT(8nHX5{oc`g?KEbeUB(R9t$Dvan)lzU<-mQ$9yDO=z<pZ>?Kf`l zzO94z!(oL%s6-P4AO_)Gng;ANW^Z(d5~zYgsD*NvfT01?M-KkLgyt_D*M7-~lUL$X z%G|N6oDvdY2CpT<ISDe>8ofd?q7F%BFYC_wq~E%S24;`ow#w+jq`9Gmy}b}hTggDl zK%dP3IPM@Il~k_KU=#*toiYZ9B<~nvQw=pl`~)TgR_a)zIha*}8^jNDlB~?3sqGuH zMxJ@-{wIyWe#m>q?DfteyS!uI&i_1gw|9@+W2e!3gTi~Y9t1QW*fwnN_>sdVj2h8C zrm>@`vAt>JgfS!9M&TIN+Bj_NNFFS-HjZc;J$&3K2tW+N=z@;u4kb{vSL=aL3+3+` zxd&(tbHMt0n)cpp@`3xG+%)pjhqawQbMlJnxkDufAt;$lOA6UyscJkeirr<{n!!C~ z(i4~uM3pof2xZ&O*?eieqKTv2XJ4ho@sfd(f!;C@>v2Oy4RHbis;oQXG70BPc)>-j zSr=ng-jvEJ;GDEkQUDUgRxND5<fKt&9e&V))?M27d*|R?-Z5xroUu{{UiWC(f55mw z2aO*-tbNp|j^@!FEjUJwA2XtL6kt81dBngmLkEr?0#dh3X`67wq)EpdGWobe51Vlm z4is>SN;E+LVh~1`VJ#!k9ZIAPYM~q^2DA=@x%YzUSfs-ZFn#bYJ5Si}fVs_$pE(Rp zMieQQh|6P7!LrbOLQ>yUP_KM0OnPz|ly#X>4Y6FnE_-_+l(v$Al7T*(ft=&DfN+=! z5D62B4v7&V05H{csX<ke&#kc1dg(}uN0XVfeBRivP8+zmZTCY4Vd?!(2fP<&EWLLg zv(MhG2MwGse8j{tV<wIr-QGN6-00!0jfU^G(WBa%!07p>FZ$@`&-lW*XMg?ji<Vur zeARc?ef#F?zkkP#H{bo=x88f(?Z3PW2MW0S{v9`=Y1MbHT6)#;^Des(T|V~tPt5z! z!b7JY34&t@54BJZ6EHM-;#e4kX*jU+=zZYKJBRE_$99F2aCPi|PM@@VzE6Qw_zMp9 zIZ4?|smKDaVQ!v{h3uOoQz4}>=@h{skZM9E=EXkyDlLwe43rG?mI3Xn1UR}`mFM8- zDrVFONV%jgMW2Hcpjp5rYtSXB5~qSV#2FqtX*&Cu{br5EhmBhHVp{_{*Vw`yIDYu3 z$t_KjTSrZ38qz#`WZUR*hqi;cr+j$v7tjB{%fHom!yPx>d*9FRfBd1pJonTyuRQnn zS6_Hx{Yx)xc=_dxue`kR)mJyIe|6J_>{yRVG(iAj5Jnetyzj9G@A>`Dq3VinbwVwa z!$j+$6JQQTVcHy+)G~O&$UR#Q*rj;@+|vqur?CUzcGKC%PP}YxH90Y;z-tECnrTlt zQESRZD&%=im30Nre=Ni8GRrfB%X+-GJE63d4D{U$r1iMp_5o!vB1ePDh8xJ}Og3eb zt07~&NcF)H>&voQr78*Q(wac<#<LC|Fr)Fk&3o%}OML3M=hy=eXd61RV+<C^jpN5) z>jQ;DXB@fUBa6TEjjv!e{qqNY{m5S*``gQZ2a5q^V0z=`O`A4v+K7LfHg4d*_1V8y z`7f(jFBu414|LqT2}+;}3ZWLtfA)u8!O+=Y`bQSS^yrRexPhg*t=T)q958Oko~;MM zRcyJ~hoa4U?>n<`)aQ=qSSFgMd8-PX39JHF-XcXxDSBBURcdNvjnXKwl*U{>8LC<f z$NTPGT0Acq=sg2kk0&DNwihO>EOrEROe|p~c<o&%BR#pc9N%6qJV6yTp!>ops~1kX zVlH->@f<gv{3F44!^XwF;|2|FAB9gK?bFEC#>NS@XL80D&Rn|oiXZ;;_D7%j%imvp z{-q5D?oF?4e(kl_Kw%I$2lQJhL)E5Do1hlTVFHGpTmQmi&prXuaNyHl`rI)mO~u-r zyDsMBkO__ZjT?lAWJvSf5D3D-XQ30XaGHC_Hrpv_>C7x;^(o=Zw&cB6s!3RnL6NqU zRTc8f@;h0*-wUO+WT3BRK<n`ZAgQPtIJQee#%gN{WLS+3Z{^y&mP!T=>zEE|W=&$s z!h=nx%S>KAAK$y#`&bfuh<$(w6yl-4VePirJ+x&6*5DJ5IrxKTeq_b9t8e@HosT{9 z1eVFzA=$Wj<L1qq!EV61>k|8|5IpsjTAWb>Loi3CuZIIqJpc4vzquDK!Ldol91JJn z>ZtbS;q9aM8#iRvrhVT%Vt4GGW6NdlV}>^UpQ9&TiN{*1s0m-s71E1@c*de&`H6DO zd1(@@^rSSVgrkOsl>1C9(|z?tTKp~<C>iKA1IBTOh^S%bsBzQ=e<>hL1U0-Vfg_*~ z`U^Tv979!rn|*oNxuEr&>HE)Veh=2*cm!qS?z=Yc3xYRJY{t@iFm|Flnx`+Ab@n&D z^4~wb<H08$es2AX>#=9Tt&;7>?ga6!g*02(KFr1qa0V_t_?JJyJvcdi!R*l!Tg>eV zO$gzD@k0>~f&$I)4Wk3*G`F5J<KRvu#0eg042WBbEHfODTt*|JIaR_jDBOFIo-D&P zebLH^v#iH^y%kDh$v~gYfc8}gmmqI~O9F}kLVR~3aGfqLXDe&#sL6m$)?G4ocJ8PK zSns&><RKsG*r{~@Fo!J&d|J4F+mJDn@%%~4pfN+i@%bNKe97u%4?OWl>`-G*1KZYV z&qNF4uAF__YLWwR35#@mSc(rw;p)Y!md-nUVdI1`2myhNnbLaT_@TSB?2B&|Axs22 z<n)OMJdz-4BQrUm)6AD=FK2hkBqz&AICWwU@HyB`M62f4KKm*yj+YFS4D^<P2D{<G zVjaO>Tft@JbZG^GTdh^SctItoBsEM!95st^XlVKJaeEy#RBP~^n)lgj?17^vj~zQ@ zJRag6+B)*2_s_rlniUT``6q0DWB&vz-^9(gjnr?-5Zp5-H?4o})fYhX<=<X~Cl?XO zL8At@Od1E8@6$SPr>1>uZ9aIHJ&ziKZ-mCg=1|sU%4$k%s_{aWe9tX2uR*cQXGh*w z!o9r^N?XZ5$v~gYfUU>vCI=39I2|$^m_XpeCE1Fycr6XqJ=IfZ(rl8lvTDJ^%jaPk zj*XOe4B7?X$=t1FzoG4oW2dwY95v*C#(~pMnT6-LfBVRNMsVBrwvF#Mh1CB+VRLoE zdbkbefA{A<ELnT`jD;s2IBGCLYdv^8KCs=rWq*W>Cn@p%W5@?PkP2nY&muCjTGcS~ zpuEN<(pU{ymD}j9n$R4JceeJ~S7~v)WT0fAw+u8G!O2-MB3nu?O6)KJp*(~Q7J1n* zofhC);4d<r*&Kk~@O_RSp>MbE+&lnZe8*Z9yUF_wI{@FVJZI_ozx?BGpMCXt>^mC} zw>7~rA@G3SbXd){{U@3u1kn7~5C8uBD=wOJ>>>LM*$-ikncRxKqn(@f!2>x+!am0h zA9v35ly=K74<*fW&g`klY9h~h!OM~i0UNv2H!6F3A(Xa~fs%nfn*nm1H@wzyiQUyD zT7wbJnw$|C&Ap2Wa}HpWD)F?&$WI-*^SA;3bkI)NEXK+dUv_VqJPyxz;IlzI!*}Oz z@5L4~@TX1iZ3Xd-c$6GZgm2vZ+9n+K2;pm+H&=&hHsPrk9Qgc{Zvoyi*X2BSS~ei4 zAOGf_Po4c)go$7g^6-w)d$t~cCHXrJ+6f71Jo8XJ$|6h~lv7HT_SKvY$>J%i7pb)_ z)k3)gU6XDo@g@#ppM8}U$4drE271eYKIb$#BtU=>c1dvPJY|)k#Ez(UI+&!BB{fNp z1gK}x#HDivE*|&K!*+Y;pk1&{j9)|<J*j0(dkdb`!_LFn8@~1Ub5G)<!t?~;)`1jj zc%$})O|Nfy?e$Hszy6vXuWj7?%B!!w@bZh#zVzHvFFf<)^MC!z^G`qa{8Knkz$Gft z1OdPo!j>wW&>asLZrHSOJ)TP0$_LU#a|DIZ9{c+f*WC1-S&L7`SBDTdz7D!y+YqDz z2|-%$(=qK!PtMbulFzJGqhm5WLSRv(-QPT+-ZBq}S0m-q0P1^tA(Xa~fs%nfn*sZr z6U%42`B_MS5Q6=(T3Le^I-D0K0F>8vk0tr4h2t-nHDKyU01Ho2@7l8O;P#Q&EFL*- z^n@cP;p>sV{qy~JbPwO3+&Xq+hXm~2v=QvyZ2aB)Ivy*3^2NXY{;z-f$>YDi<>9;6 z+;`(QezErKyO)0Ejtf70>wlhh%a<42^nd34*T3OF0hg#m69g{!#oD#^-FWMt??Fd& zfAWRD0^-sM<@l!2#`POuZtMI+fX}ag5&Qo50&2%mQ}8=n_(%X>>$mUp<1zC=yX-S< zB!11&r$8dOme*B2W29`nQrQZ@ZdP(YrAPHBuPz+#v$tt+ykwx)48-T01OahOC_A{V zY%4n+00hcHMq+nb_nC|<0YtQfT-5rt>3l9_SA4LE9}65gv8j1dD}JKn__;Gye{bE> zFFo^0EW_U{AF)g}eB)c3I5us5>cwa7dhFNhet+Y+KVA8W+s>PJ<G&vM?GLxDT{!Nl zh2yVU)W(B_g>6^W9H|vD5N=zy=<sVlJnzQOfAY4kpYzj|SKW8hU623zuP^=`%X93> zz#NQj-3lEGa|HX>m!G}*#_MJ*m_4Lr1X3|_QWMgm$LIGvVlaLej6<MIYIej~1y)*y zIVdR9A0eh`mBXPS<ItF%USA2Nv1FiRps!{C>v6lo6D$nD1_++HXM#&-x4_|;0IAu_ z@on<9{h}`9e)AWP*=@=}_<klH(iqS>sQKV=_)U@n8VBJEkaz$7XLv-<HZ9)#zs(zL z_XArdcyRl%=b!xEL$`hDC(GV<)0d`y_Y;$@KCNZ-yw<e~#$UCtecj@Yb*D~TcPc6; zUH!hvy&e#N7=+OU9nl?1pbC}Kzx%28-~8n-|KzgoKXm)!&p*8x`|P%5^E$TF-@Nbm zR;WGAa?kxg|G=3a#-l9QF>gMk4Znzs6k&s9*NF!-pM4yX&xtSw!jc(fjfD#s$~iP@ z<*3<kaHoqyU_)8;EgbKwcWLpvWT5v9kmCuyB)FqN_rHC}Mojo6*XCBEBe8>ptbWv4 zN8rc*@JAlr+q5?x(inU2csxvvN2<Sg{(s;JYkaTgO>H~dUh{_awt0e$>&=_7wSDu$ zKl#F)mrlL@jEU<`Yh63PdG*}3wF^3~T0ChTsBK5@;O@Ou8lVaap|;uPhWQh(e&5vV zKl$%>UV78RcRlvplbc?{Cc1g^rXQ`@fFD_W1xfgiZ+>mqxJJ+%$-xhSAyGj2PA&V4 z`t0FkvGzvz&W3ZOzvDsK#*6vaS!oyU?F|#VXuLG_ng9l<?5p&CFO=4jfxemnJg*{B z@K&#Ge!ugB9ZnOi_55rd6HN>g=@|K`L*CuECw}=44;LQPHVk{gpw;*zCgKY+k3aX6 zJy!UJ9}EY<v5#R-n7sbliyL3Q=P$px;Ad;*|KRiER-ZDu^W^4L^Tw@NF!8EWjmzuo zFph8O5X84A1_9}WJWRk4%#B`ka?9%ZCx8E}^M1Pep1=GKF2OOl2PgHx<`x&}F1Bd{ zKHWt^+K-xSD901@<A>vuPoNyB!?Qh>Os%N}Xood(?)A!lthhBCXsYR`OO0k(kN4HP zwD?^z(0c~R@e0A@bs~a8fv~Ptc?N|;RxiRqWH=+ZLI*V#4gdJT_|_u6hQ4#l0DP1; zcCtbIxVh7B`0>qud*$!;ldy02!Eo^2w!dG0?S&05|LD=5opr~BQ?7a6pyksVSI!={ zX8y#h7EgJ@>=v~r8=6l8i*cy@Mra;=-v@K;S1oQ`b4ugN6XC{`Yu<m>9T)uQ&p&-( z<4dIZYj1p?$mXX_8<CJ7+;z(_Cr{gd<Uk~9NJrz&E&C#M_~di=$ER3&?cku;S%ofd zi5&D2rhM&SB|W{r6iRE!K*>NK&453zLRb*Z4h5seAzImWfr1g-nZkmJf#z1mN*oNr zksyvgmUi+7PPyxMKgEVPo(+HF5XXZk*ob~{!^^ima?dAz`1SE?77n^%+US)h0^gI? zooW=m>a<B$o%&{u(<ZK6)V%8C6K^={#P6Tg)Oj*4C%s7}FscavZjA0canR*c$FEuN z$se6}>!bI+yx|qR2;TTZ=!WtQ8;}+}JC770QTSzoArnR-bv6+W+GWHi4sir0f-}{T zf970#H{6T(7zG;+j2*?Qp}_$4(bs5kyJVnbp!W=Df4l|(P6W}}*WCebV}uSTxWj@F z!Cy|m*IU3KkO(|#J$S<4reUXi<kX)%@GJb#>npF~N$xlL+#VkI!wUDFCw}*t+s<!a zvtam@C$x0VnR3->2Lron7jMl0;;&siV)+R(um9Bj&pdMfvyYtc-7`lnKVcGP1vYJk zPWUtBs`tUM;mc2GU%T+E+b+2Cv0vd01e||^3v(m{X+d)EMb?EMJ8e+YFn)u-aTlT- z8!Y&kK@((P+Ubn6YnDAk^RCaVKAU<a5MROF%Dul7N^8kL$v_{?fIqL|OFX;tZB<SX z7~ECQ^TJr-kq%sd`-0ud3!A@qEPl@q+q*kA?_=93Q^tczr+)kc266lihBv$te|@7p z4f5ybpE&<#YmWW)M?v1PopUCwU3Bo)(iVW8yms-#H48^ApFQKcPyFnO`!rNPfAanr z*L||_%2{aI3W%pJbZilv#H?`Sw?6dspLIU^{F7#4(`#GYE7#`)NDfkjL?K;+nzSl! z#77JEvFF$Uc!EV-wo$OvH^;>Q&DodhaT8!ct=7ar;bqLbWj(HeFXxhhewP9JUcS8z zxAh${;W)5M)&wsE?hGY-^X~8B$9--3Zj%op#JMLvW&GggVT(TYzF$1_8xZOZeSPLt zJcYOs>3wPa%Rl(zkLTa;uT3lGG<TlVjz1Ly3a?$X)d#w_uUR;H#fc|=_tQUr;yx_% zVF(BQ(9bWPyzk`ieP+~(6Ctn-tgK$pjE`Pdo;?4C&wuy9+g@59+bmmp6M|JaQiL6( zUq1Ak)6V!HQioX(b0L0-<z2&eLt<P1bGpXJW>zv<Ob@c#z-1$7Oi!a}GOIBMn@qoZ z^_GB221*7j1OB`UiJ(QCZJ7AYkNe-jZIuoYLq=NtS^fA6XYYCB5IiT2KTwH>F7SCB zetjFe1cLY*d@K*&<$*U3KKti?|M8N^Yfl}s;-vAbPMNr7k>PdCqOCp*;;R>8r9Ah0 zXZ`ZY`|OXj#gC{s%AdG@-uFI-Rrv%>7;nwi#5IfCR?Q!?;>5{oPdod^OCNgnF$9Is zY~9`K;@n8SVZEXJkH1~;(bMqzy+|XHiH8x9*gcOJGX8?ug0&4q%)1yJjub~n<unb~ z%h;;i2E6<$87LX(cNu7?0RbssYd0;@xyo~DfD2sHi6e<76PL~%Fl{6rvA{Q3@DMb9 z2MXWxne%~De(~UMKqdU*Nw4_wM(l;-!NTu9c-zeDKGC@RgqD?aCazvIY0X<AxXl4; z7I&;!IQ;UNbH4kT-#qmo#tu6exj(o><!_#PXwG*(3o!_96Qgi`?8>=~%V(YNolo8H z$2;(SC0NPr_Eg4qK9RJaKlp2W?1?8>@P$vL^gT^`zjN@e1Ew`1)wZ%G$74{q^yXlt z5s?7SIzWFPva%lUcXw|IsANDH(0be$ZTEiyw}2isLWARgl`2nJv0&iBaqk?oGrn1l zzlq#3r40~2_T*`JIt8EI^+c<>dia5#So!+BtH!RFGvbPwM)1{(aoz^Uszt*tpE3LT zPyP1k2e6$|2XVQ9N;LiUuMeJh{ilatK7&TLfpvt?v3eoGX<ae*>-Tg%xBhvASr>S> zm+%LvyX$xN;z>;;6JHTRV)19;@c7EWMQxK;*q{3`Kx3phSQ<6wd(`-N#c2Al7LJ#j zzGR@EW}xDDg=sG3aOtGT=paC(Grq2ZJ#qX1*6z*w<7@W^jT+K+c*hU!yv6<s1poAL zx2Q^$S`I({!qaE`@SLHSO>epK<SAH#8^IU8<pYz!qCv}!JO0}r`}NaYiTCg;SMU>G z;lbek`l$z|efwjBFFPI`w}}sv@YTvSry{7K%ch<2!>>K|!c(x)?Oc))f`azS@i5|z zKlvekN(_(QBeA<T?}wk$LaH0jJj})=21r9@!=W)sOK;7!X)+G^e)<|NVU-N*=oxU1 zAG~^T;&{R|YgivB7epl4cHYdL$L))CB7U?FKY%rK>_~j=e&zLR@r&D_m2LR;`VV^u z$o(Ild3f;+Ul_D(YU|3m0BFamg>U^Z3a?st(9&a%Sogu7J!wy;U@N>=U;HE1Up#sL z(bt?laM^M20ZQJwC(wYP#;u%-02kcwulN7$PjF__#w|F5)FFXL<Erni8{RewiN#-S zMw0ER{I>m&c8$Uzs}^gdG#m!^RX&JT2Fk6b+El^ij{agV@s|wr(+qHbJl*ZQ`N4Fj z0O2ku<Yx#>x?=u-sU!aBfcNgyv^Sotz)mh!j$gj;tM+rRTl&T(IE7yg#BRpjkN@h# z?|gE^<uk^2&Ifrr@W+?m@?m;9PZ_-I_+zg5$S<F~AESl|qj!j_RrAU(pSu6pZ+#fu z+dEI$hAtsMggN`VPyXcbUm<XW-}^jgDBra4i5LF*9~b?nEy*XfBFRWK5{|SZ`8FJB z+r&m~alRyv!2;He>=cH;;(q!XE@71n?C2S=^?2H8#SQPby>5P<0f?v+-wh4;8=F`j z;xGGP_tt(&yLmW%!0(}_AHi>@Y>`m-%R6A%e?NTBvDbWL*s^KuD^Ho&Y4CmP$HdMB z?JMUGS$h2RYtQ)g(|^F&VkN$X_XQc_A&f4+e)@qEt~&!t%rVR>+s3hl&^CP8^kc3$ z{pN@7Lik9+788YJKJ?VXANur1kzOQu-?qU>_&W~TdFbgAgVbWQ2FON-$TqAWf}_j3 zs2%;qUg9qq=%*R5^|;;hLUvY04e^~fiTI20*Y4jlYA^hj;T~fTXqwcDzltz*-pqUM z{{?==FQa1jMJ#(kv77&N*AZ(!Fw|H%AMo8Ktb~#YE9MPfHf{EIKKZMjKiKTvt*G6| zk3E0$^aCe;=gbkyrnj${x2=5B9D|S#Tl>D7{&Xjj@J8M!Af@--{|lrSNyc9hLc;$U zj|Pp}6GIS_E7@I*V9?xG;sm<$y{yOk=}lb1+Tk+*j`Pm9&DQLm*PUN`7C1UCox9gj z!`?AyXYAMx>loeCF&2N|=IZ~t)_y)^OHUaJ;y--&Cx@?n->{|AI<TFx@|2EkcFZ4r z#R(^U=S)x-l(fJ0@Wz+o!Eto4pI5{aEKff)@A}V-xqMc~%K6*MLj*gqbN=w9Qx9MB zz8^kvx1oHC8~2+wBC+d!aBcgMlaXp9TpQ*1>l__R=V<oLXIzX?#`oA%5!1`_Dm(n$ zUJ}q>GhiH#JD)(WWp|K5P4-qDZ|d>1IKH2<-?+goliM06G~sWRJ^kV{Tl}LC;^SS9 z|MHltKQv_NaqTPT0g+gbZ>wYM^4YVlJ>%z3{0>8fWpyI+Rur_s@{1?#n|0k8P`j-> zgdT=GZ^)&`9lP#yd^}+D&6Zrn^E6Mr_&59wyv7M*@OVDbj^twqFc8@C<`#-A$+;D- zOCQJ7ltABKU&JM@l7SsO16q&Q5!|Vr@!bX5&Yg)LQL#UGKX!k-%^%t_@`Obv{qE5} z;4hYK5tm5xgMWKu_P5U%w)D6OE9Zja+wg$G=H;``yZcJ~u}*9~Z_$}83cLm-8`pp3 zuFIO2&)Oc|A_*s6d&UFLJdCt#(HW%ow~yREbK!|dIMR;fzkB2!JGTzNvn&2~YE2qJ zD+IyQ46VJF^1R9pezTYG`)vleKfWgIvDV;#OLf)Yy!hbG1qaS)!AcN+?qJA-#>VkY zqdQt`M+M&}?|D(FPxFvJJSV>J`p*x)bn1i^b33*v#4#U;<LBSK@|6v*ZX=Gr_Tu`N z{{8lgo38-Jx8;<>HzM<pgkejMUwHlJ{_?`pNDffm)5o5u$9@!cSFXC@TSz$4KBT=7 zLx6$6a2&jH0a0!P#5Yf=Ae!rv=QV}n{q{C4f$iWKXgI_mUXOr7Y<;I=5z8inAKrV< z=)Le`s(X(;Xxt$a1`OT*(_i`=o{j7MK|?Imk>clHeesN&zcTRRquQ=KxnsqAe15oX z4`8wRirHWP$(66HuQ-k;wZU{9Til7RTNLBh3W3fuZ~0o&<ukXftI~!fjKA{aflH45 z_)TAV{?!+dqF&z77|J(qLaNU^`>cJ2?2q5J-K*t53<SRC+5AQP8e%qBEFW4wpf0e3 zzt&6mB?J9616+^C&CmNk@a-&EWR+_cPhNh?KF5u~8gS>P0i&mk9XM*p<l_&+pG(FA z6+JB^ZH)=4ZU#s<fv|&@9M!sfcE^gj?JMSN^JBt_lbbI;A#ogb@q1VpGyE`?{=tnp zQulrdjz9a#bEp5{>@k<k*yi3!AyUzL#q7ZsAN`HHS8m$834eDKZujIBl8jU%;ggR$ zbkOLbqb9dtATS&l6bwzEJWaZqn-kwru$un*A}(>24D8?;5XWn8`)srIP?gs#8ui&D z-qW}zcE%5E8;YOe+rM$(H<o`>U)}5pJ*d|QhTr?cZB3WW9CP`MjurDJTsfzGI~)_P z6vtO+J&rHhJpIBmD}R0cxp!ZA!M&YdzxT?!9{nYj=e_Lz)J5_7rq`c&>A6MMpVhc@ z>h^FLI*|&XeDvirF$3N3huiT&?EOuHzT}Ct>yN<gKW+$?<o35FK6`{FV9vN2$~2%T zq;lc-4t}$j@cV5B8nQLGFW>SSl_y;`f1l$=;O{2y+O#i!M`iGg1+#zm=lk^+lj{hW zUm|UPeCClE-}>0#CC7AJIdA;(Ios)ITYmDGWmu1k<Mzjd?)&Q>u>#%o{E7Qsc-S7_ zm~_G2ov&@ebAE61ITrj)pQm4X=EQHEG2+sx+sS9CMOp@5a?G@KAHj#fNLQY{ZpxcB z-~&%2A3to1f!MWqUknO{X7c6pxFokXPx<g=`(sw$Z(qeFu#$ltI|KH-O5FL}Lg97_ zm*K2mW9KoSI}+bLdDn<N@H48T+gtF9AD3Od0^7%UIHZ?N75s%WeCqh`Ke}+(rN^~h zaq{@(+wo{ye$tp_Gh<)HIR3!j9-ev4$A(>ceDh@|j9fZ(*-zKKS&l#c{L?e8{s{VR zSI?mw$r-lf*nj`gMX#)X<+Y7H{uLqHCEv6Wzd^Qa-Ic>y8!-?V4h#xDv>5ZRM`hz^ z`(XJpoQStcddGgLm*`6d`fUc%=bXCv6VtUexBb@1SDdonj8XXZCKlt36PxfiB2Iq) ze5?xJ$YT8afA~@Rm2<}|n=t_^@heW+en;CCCyrS<<Lh_nb53#mky+P#eB`B5TQ8e6 zdg-)fKfC(Pas0K{ANt#$kH6|ejaZLwPtTzo$w7)buAGB(;f2=CGCZ&1k{mx!j)538 zu^EGczZtaO%+VO8#A_8a8RwP#_ElU0D;e0aGXRbo!Mon`T%_9yz2(ctzqffG{BG+0 zZA0*_pHc12S6;gct3rHxvzNs<R>Y4y`}n+TKRI&A@qq01Mq$q!KYpt@{;MbMKYI21 zM{R$OBRTMY<dWm&U3=!ApL+sZIytxVG7^ro<DJkI-|B2^Z^Ce3mmEWbZw9s4pYgQW zSMRR;Yzy;hZr-t9>LvP;fqt6--yg?quRFh5zHvw8kd+JfpWTFCzTTy2z=)19Lt947 zKYh^yPyDHu-^0Qq7aKQh+Wgw)^X|N&amn#xmz^+SJFjQO!5-G*ThH;k{`|`$I~R|- zblUcwgrFZOLZXl^Bn_$Cw4ukZG6ChUZd`x=;}6aK(1O8D!-uzz*=5WCyjwb8b`u7R zJ1RCSR|Cp<+J<#a*;nbew{Zz<2hV`*kLxDK+3tTkPPOGZmvZCInTbEyjuqd&;|60T zj_;vdy7qFc2YY!!PT#-3^U+@%+Ib4rm~EGzH2(4v+qUyD?(*5AFP(ngoy+;Witmrl zy5?U-EIAH*#G3j|?T;e_yr1~52X3FZeD0W~)3>+t(2o?2zx*Vm>#&szfAZKb@S=nd z`AR%5Bl&ngbjj*v7!C{yh6V#<U++9;W=zJX)^I$Acn5#2m+(sl`fCRA&pFdua#CQ8 z{iOBa)5hcXX?GgE_t5rHLz+k6NeQe3ds~dZ`YH(c;`*0A`Cnfhe9@7u%Vq&jZvzLr zavYC;%(~`dBbFSy6&zpBpUV2~{r}yxbO!c?-iCRIC_f458uZO0&b;}nFRy<EY3ymT zwC$`-8}57TK@11JsgI$-0KIeYE<@fo0e?#3(AB5f9Ly>Ckky=$#qshvXMeqkOI$mA z2FP*0?G4}g@*F>HxW}P`@MV)d#~!HN*#EfbYtOv=_g;3!@dPw}`{|ZH-r2Hr=BP`K z8-LmCwzuUNhYvHCOwHHh5B}}pSyz8-#3jd$HBXLzQ|oaoe(|u)U!H&JlQ({4&_zd# zT{iRW2?SOeFTop#nYaFtKWy8>uOVue91rh*`NIDk**1D)dlLo-!-T<_c<CH_I|Y36 z-IdYYP|lGp`zky9-Ch#VUo*h{ac!r>zKT$e`+v;mkHW8AzjxGL2eu6xF>dt4qYwV! zy|=$?j~aIWwL{e7nGpP$;E(^{?12{?+O}-g+jfjwcEadOjz90m)xL^xeBDP!TzvG{ zOJ|I___$?1z3NRpuL6`~$RB_HsgK<7#laUG-g4;-L;2eh5mNW@8_q@=;czdherdxi zx88f(q+<>l-r9J;xS{$*_|gA*6v6FVWWF#L$_vN)>rGtZ+Tk+*j@w&rEZJ;-9P4o_ zaQW7`_@H@X|LMS;c5T7qhRwrUN8u0C{PD?0@D1{OuePp?#rTi@boZDg(?)#r*zuR0 zIBwajx94cZCio@CpPO+U&yR!S!!JG>2yWaej^q22czHbb{1YF$;q1W|9?`U98c@Ey z!$H!JI@r4HPxb@lb?MD7F%TGz4}SV1c$R!*M-#pigunWB(EPE7bS|<1<!JKEk>!$n zhkvz~1e6T)&kWdloVPvSee*3jfqrWHg|l~=us_!0_*E=@p4R!Dwa@qZ(}tTjZGL&f zE1$mUtNWZcscqTpaZ68l+m2Rjo?Lv~xj()l`<(MnCtUTB;om%}Wy$oB-#m8Ny=&j> zdK}Q)xZZxG1*`H;-1vV7UvMP0ZpLF~+Rkwybx7cuH+>b!L`rjZ=VeSY_@&7!uU(C& z4>3R(CJffD?fbW1cp~3X#deB~ukDy)l>6sPxI|Slu)}A-o*%~@j%Bz5Jw75E{n;b` zdB|?~O%?n~>d3Y+$DB0vC%^q^@8A7FGVgx$R}+@a9(uu%6PEsubNpfB_(gAt<KU(} zyYl+$e|`CxGjIIru#1jrUNUuia~!F&1TLF>&!fMB>73p5<xLyz`pvyZpLjfW$?=Dn zF<AJT{^+xg(1y63eOUc1*AD+`F9|3a=${$jdR$9#-S&32zx#8*NlkcCWtXOXM^9?O zlPYI^>8!{9{v^H^UXPNv#!pjier?lvw_iTs+=;E1&KP&;%(wG^#Zlip_S`!z=kJg6 zxx>Hy@q{&}55MrJmP@9Myy%#%TaQO@wpaelOV57(mU9~~I;Q!OY1=zAgo8AmcgN*O zDH5C9s4HMNFen%r3=oD1gM}eG@Z=W!ouF)AMP*}p|9lCTs7eNQ_zXD5xhlt!oC~+r zr%qflXSYcQy>sxc`-~feKR|<rl$Whr{^Ew0@Ls;BPu`HpNB{npS!+)p^o>K?-d>1< zs@-w?PbaMX@bC+dXj!riI1ZR%xB8mj-hkNx8#voLK<GyrXRZD4W6%8siLJx8E-?@o z4h#x@Ze`SjCJfVnaf7h6viszNCN7!ldu95B)6ZpJWrx4rO9J|71{&;!_mwynZnkQ} zdF+>_;=B0x<6#3Q3<o0)pLz6;e)i*DHdXZ9pBw)0qsEJl9`(&*40B6nyq!nulIf!^ zI;NZT_ytF_Trzd!g-0*DXU$gZkAs-NC4TT0qmO3+4_iKe_=QJ~Te97wLjn;Fl6m6; zw_*P1?K?r6*8lg<?l^45Q5Yr+*1JdSfq@(Q<>NJuJZo6X{&+vVgG*Q?1FyfHahxBB z;m$v7&8b5_I1yj<-g(SEBPTWCJ^R9sp7z+YPxSP6fAA0@{|dsUvu^s@kn<03xp*2# z*SciJ+j)##G95b}T{%ANf+LzQo;u>fqnB<i$MHASK+;<tx?|$969=AuFeazBAuc2k zX&n5G!#{t^*YOuHdfHmS9D_l@&|rXuG!4gK;R`|dRAbob6OG^;N)<F)mlu4=K*>PA z%mAM|#4<cq;<)Yc;2M755Ie1VwjS6tsTH50;p;#6E<PS~>vmHGmH6@@HdT&XzF_z_ z4!2#7CDY&LW9*V?SiPQm$7QeJ8IO&=KR$EK>BBBKy!n#jM_hQ+R&X3&r^MqT81<VU zG>9K~-V}R>aVa?dc0`9X4!_{=qpn=^=-;2P?{;?g%swhHC>R=iA!tO~XbhHpA!y(( z7`{VS;^{-ZyIOph2Dj{w_scuD1XVJ?^|(Pi-RijcJHC11o`(*?uc6|HJI1uPj61ab zx?8`8Z=LkCId0$KeC@UCes|N@i>Hmg@R)Iz%xJx2`rCYry<}SBg-4%zdo9OTe{k40 zupU2t#06W!aqWrU`oNFdmz;3Wc?Tn|w=*=@8g=2(Na^*zzXj>t(A{@C!Ep=<hUVKh zUyotJU}1~=UBh<Y<B&le7oB8tv)*H2e2wX4f4toBB?J940}Z&t591a&&Z2qC*~jlZ zcEEc^?s-t#|7-6${G%$izkkE;J)a7slD?bmy`=Yq-a%369TAX@^gw_FNC*i6f`C+c zVlOBlD2NZlh9U?m3WQE5A(h{EX71f=!tN%4B#U<^%xAfKckaD&zGv=t&YU?jqt@Du z={-9fKmDTz=Qy!{t7_(azFb?_!CKtizPhKa)f4zmS6G+FFQ4tbb+oD=%Us+|v$DxN zj>ZZ9_MAG9w6<S#ewzKYo~<kw9%m`;t}X01Z(lw(nRDk_A!D9Z6;Ke=q>D90#i;(H z4TSnE3#p5ondIW9G^;R|iX-6j2oN5J4bDDcvVqDq6VqUfW1(7gf&p{B2aOwc?&|rf znrfF_do0R#zq+R6#^nKTO;i<RQnKq|Tix2py1Kirup_m{?+Jbt!sBC91sUezu9}q{ zn(9}9E8~x=e|6n7BrGohB;NWG;fVlKS&%Vk*QCp(SJ6_sT>p@`R%)vMyz=+Jmxe-F zP#H!wpg!%yH0D=<LLDmh`P$9_;0Q<)0gQ7Fcf9cAVB0YH&{zy|`dh;F31&FQ7Zl`R zZ7g){-SBt?_C5IO>`^$!wS}Fm#XY=|i0Qhr<MM;+9rHO)T{+up>u6<urm3i_x}d|_ zZ<-db0{i#Y-P?tSHyT%UhEWVk^@?2RWOUj%=<x4H0kX@e6(|L&xqA1;ycLU}ET{~M zgZiR}#!|mZt;Y;(F3l>;rQ!(qJObcxagdW5<|)|4t&b5Ahe6gz%=X6U*{0oFF&)3E z%JpoNs)|aOu3L}4YcA?$T-61B6|W>qaX0PC4iE77C}n<zsi=#(Agif74tGUORrS4! z^4GuFZY=Dg&d;(HgUVZ5IzVbJ?!NWgcL6e>CSH^W{-7F6(BJs>7AVV@XocdSzVJTA zls5*k7FuYhIgk7N+s*-yDguPZNxz%+zHyLH)ITsI8blCkiw2K_7xo<9cej!Zay~#H z<U|eT6joN|e6d=&BHdEd&05smD+!O*7J$cJcg*J`_V}Bll*`jis|X9PJ+d83(N?;V z!lh_rMm~BWmE{}0*=bzaDSBBNsNB}N0-|+PuE@ywq8K2<U*x)+6%|m>r-%0%p|1oB z6i1rjOhtUrbIhYcd7SjRq*{r&TpR%(M*#kD@`mFR?>tgWF4+JGi=fJ4)Vf$>R-ewt zPyJ9)?b;FqtzZbQ<i@43@6FcaXHXsom3tvsin?kGvX&oQ_W+NlnO1dH=Vz`xvaP8+ z4(Skj2=71sZ94Y0W<`c<S+X6DBSPh^BqJaNurIwoyX59&K<$#p$;qmUqbI+^Y#^vC zDpviJE~t$yG$yYX)2TzhK3><k_#6SLBEaHRFw_Yi2cZu)&+GEEA?RsCup&;!202e% zIE%?9?id7q+Y=Xm?Y(8BuAoD!vD<?WY9StHQX`5SQ-QV~->qJeF3)3B-by?UNdauX ztz&+^c-q7M%TUm-fB*L4*ufgR9*V<kpr;H$=J{QjJub5OaH&>eE*D3@#}Od*xWgES z;ij9M4hlfbgF4Qjvg#(xo_wM7vWGRt0pFqDkHxR<WmwtCvZ|}Ml6h4ZO@8JB_V`G} zvQ%SXC)J9KwMVu-ggx$Py;v;y#-ndV<tEAVQs7-_HAw+%!kXS+|M4xLc9f^y0Tgup z=B4qoCaJ7iC=Tj_67^FuL<T4AH216c_^ZyvmoNggafj3%AEq3Y2nuLt3e_c$8Tp8U zxL$VC!!n0}=F^i0wE3CFf{vELF5XJ!!p`t}EI+u`F`x6)<ukoDjZoyJ7*}>wEl+<$ z9%pkqVU@4@W_#4qL^Kc9Roz-gSOBYCk+tXKK|o!Pz8znoAgF21vTSVEsf{-xW)z(& z<>&;~LZ|OwO*Oa2CHx|D(R>;KHqJ>rD(sz)8ejtj_?yGAA*alsT=_;ZrhU8PaZHuL z>K~hr{udl-f<6A&@%V5>UTU-OI2e=p$}!rw?#Nc%iVV&2jMkACzyjW_$95xr27o)b z+xY+rf|~L-tdbj*P#n~U##lDM?&xVz2MgzMpMKT3@DfIV#E-MyH+$8?`<lSx0p<wM zf!w6Rny4Q30D|NA-o3KCFV<-C(@ll2$2)r~nF~R7>B|qSEh`t+SE2Secs$v-vV&@Q z+9TTIj5LW=UR@2++<a_TTu~1_76og0kpZkWKYiJOwOD%5-S$9;CW4w?-?>pnc^vA4 z62tqMsAh?N*-)p1>oFINBjC#ji1xVH^={u)i(r*tOB8rq8*AMD;jY^icijaYf>v(b zx%KL&OTnS0LfGSvC65<08;^s{;V4ISIe7L+*6S~5SHL81aghNm?D5%q@=EXAf=TXd zhC7a-AgF2U`#aTkJrsvM-oWD_-F43PIN02mD>|2*BOqY}p2*ligAR8PlMS|cP^OYl zfK>((x246sv+qN9!Q*tf+L~*(Z%lZ9E_mFsva=VH8P130uI%yLWMh5@)w1TX$H{1C zP0jw(hq`PS1d;L3RuP$WH7344@A~Z<)m1fs{lP!*IMf7XSyEy!8wlz{V;q#Fbhyhh zb`aN@gzGUEjU(X82ncb9)Nms%@_<wsT&tm0Ip`pvW6H;0eSXhP%psf%HPzLZO0Nvv zH5nWVQuAUmt?Z~-o>tGV(sR?W=-ebjewJ!k>e?e)9wlA{!eZJa#yMe$r>*HLTbh6; zwwk=^<!K{!O}Sip1%RU@5Arz9+^xL#$)V5VJ0!y-54Fj`;{mC1;#VO(EupFQ<%-T_ z=Lkp`0f#+4oEhf+Nl}c)K?f;a(?9>;0gpUhbKz#mi`&Pkm!+8tI(jjg3OZ<(r7r(s zjkABe=f)w?OOp&MGF5rWgvV=|HlNc$m!M9vn?y~`muJ68EbbM)IL2JisWpXFFH3!K z`^y(^mY^we$Kz1bXGiuYbxwog!festacuDBXr7sJC0viWXdD4wMu6JmJBDY9{_%G4 z5#aG~y8@Gd(t2d=KlY_(9zTEMLjO0%fJ0l8*B*RUOY%4+@%uGjojsOR+&gTM-O{=w z4q*Xr|1G2czHz}bkMBEnFtuAI6c=WXh7$b}BdIY?x>=ORxqsZ3-*hg!lo5DBU~up_ zNyFO3hCihb45K`r(X-=MKODiFZ<i|_!Z3u1`q%Y~eKrl(<fWMNJ9;sh@;hkqV2{7{ zfIXgQSe~iMO<w!;L;6(^o<c40Bk@Ju+h<#>1)VMVomyE^z}siza6pZcxU|QKf~qRM z{Qhg~q^bgs+Z3?Jp-Sda$rOT0xqn>BZ!(w7ml1eEc*)sl=l0>0$AdrwFzXu6<LbO* zbAFZ=lPNzFWmx8d$Kwsl(^a{NYrlT;A^hXmcN9MHFHRp$Sk)tFfyt8J!9tp=)|M2a zHHpX3onkyrlq>YK$l^J^T+zAg903U<0ROn-RVN3;ucB{)U**D$lIORKQRgO`R%CfG z8Q}!aP0ri@TJ3z!OJ{m)7%X2LuV0p~TnZlF3}e>aJQ{~9-1z{OI28Z+sV_m|VGC{M z{0>M)Z-}YNO##S&x&gn+Q76BOp7>Q*XN!DN*O`RtF&B*^;L8X&)>jeOyzV$>MuX#= z7jIq~ux*@bX_9GqrWccOc?Qamw{LZ=Uj;nAevmvTPM?>iT#`WS@uu)NBKZ&;viH}o zl2-MISY)%T$TEY$y(FV*Y4V`0<FT%!XC8Ms&IuA1c$~)_`tpm;WtTJpPWCuncoKI= zLe>!QfVe{hu{9#@@ba*?UU^)2d~dVyIF$bFxgR^O?H|6->Mi<qJQwf|--+GbE_;qU zgtDMAEO|)c4lyYgafgl(Z0cQ+bWP^MaRhu90jF_JIvN(7g?T{1AObcI=-quEH8c<C z`pdgtRWC_2Ez9s?GA>J3ElG4`kH_kBQ<aP3o9I`mK#h3sr%%D8N^gs1TAl%T$G<b{ z>h0?d&I7Wh#tQR*3}hY<ahi#PoM@zdx0-XwIRcVK0DhGb<ZY*h8(#I0Zd#af?X9)* z^6yl*-3*A#%fEYj_D4&>p@wDY-sf=__V~l_IN1pZp7E0h;|sc~7AJU7E<D<hm#$iz zIPa5OK<#0D70k=u_Q6{q@!EO$-LxQa;#Z-got(!d{UUSWd>R4bA1D6P?IYMH_H}$( z9~5Yb&?j2hI$5{M?|4{W1p|XC_N{@zs9%=mMZR-skN4a#IC^oMAumlu{Nqg+=foCv zs1%10FkaXbckrTIcr^U`XeJ8|tOL{@cpU3wt$%A1TPG`!tdkXtb+R&PBTaamQn^pp zbS^wcK)MJZ?r;R&b2=0@0&hDOJH`4cjbFDGD>uFQ&0EUFar)d8V_v$q63AM)I3ag$ zv16R`*Gs>3T>D(e0;4=9Hay!>eCUlPjdMcdKb$*}TGShtdrK(xTmY+B9Jl3vyK1W3 z#@n!UYYW~e!cxPq#{(?kP@-(0ooW_pMVAZh^a$xzV=fs-z^4%)@#Dl^qrGo%x^i?P zOgZc$f$a#CjoU}!vtRaWmL%wwCL8n8yp;@j#0f6&cvUramp@r@I-|I^|15R*d`r-5 zZQ;Rnhy-tZ+#xE(ZzaEH7Wb1cw0lb^_FMp~U6T0O&tITO&S8<x$KY}7BY{mn>h2?v zL^Mm<Y0Bf=Kkn0SIu~Bb2v8n}u}1tV#8HmTz+lR?F@<1zFiZuSFndaa`?`Je$Fanf zT{Vjnjk#&wN(KyO=7>Cwy&ftnuiv?`=j0c=j=#72`w##7-TNmloP>7>j&EoB^KcBE z|9$O3r`Mj3T43{*Q0%z?HmR`t|9(G?BDpIt_I0~(^Aa}U!&ZE3UpFXGKP8j;%1Aqn z1E^Ta6`9M%5%6IIs9%M2x`p_0%lxhw=fp<6j(wI-d){Zc=KjwYPW9R_Sd|lRSeojs zq+gn%SQMALw}|;wz;|q+@LJ7QyCp%F<Oqu%OF4F1Hz0C>)muWb=c;nz`fM2b%f;Us zvCr}l$3Dy8am#|PaHmkuIMFXsEgJlYBft@m5CVk9sq<8@+G6v1x3Ps{s8bfJ*2WmJ z`gA^i>W7MI*V~DK0q<AczjWjBn75|F|Da!*Y*?D&m84&itXLSEyLXj?$5A$TQEF4U zTM^vx_?6pN`fV5%xxnHTiP%E{scfNb?5^ooZe9V@E{jS|R#hB5`CUe@j=ET5RE!$x zgA!wMd(%N|+S8%~o)W6JTojG~N1zq~G7pG2Rm7B7^ju(i^nbKusVrlH#gJ&(b9kS- z5ONR*Ca>df@n;3H1y<eSB*T&vuO$8AWJPv;9(T)njralfIO4Sjy*Vxl_PCdX!gB#B z3b5p}LVygYT^1bfA}Hw7LwlhwBr*v|8;Jct5{vtj7MeI!Xn%|Q$7`!SKjH{T3IP&7 zPTq4e)JY8U)Heo)_c1)F4hXVFni8#uN8bF-HpH~S<Lr_|VDJKuZAW(-m!zo|C3uVS znxDt3?q9!qbIgt@@&$Hp35DkZQqz*Oo!`C#klhW^g5nVyy7BF;P!@PR$Qp%aIJ~bh zb>kowPD&bS?pKl2Ys-b<2-HD<`o}4Wi=$z~qld;lsq#bUp+3Q^jWI4<xdgEgWW`i0 zj{3kKnKDy-|H#>6Sw(%L7sPmr^1$QD?6^E9|M&wXZQ6<ZRW&!uN~i3e9lan{?>&1w zIy<IgalillaU3AK9HfO(pqguUZ_LlnfwG`7e@i&jrx+GT6iT{Tf<4at<8>-N|H2WF z5CY6U&R%tDnC}>&o0RdS+P|$SRGnbd*bPI*k2rVrd{s@gOCAS1f?}?gUVCxlsK|L1 z<Kh&<;$#E)Y_&ulhv!Dkvo8F2+1>KHh_h}QXS>Rco7}p0Yx3K3BIcTn;BjxrWn7#Z zG1oF+)97oruHUbAEfkaj)j&Z5UmB{m={1Q)DDFv>ziv`Gb*E5|8F8Hv6-%hza#1(} z9D!N{s69^nr>yHuUVGcZ?rkg~=$p%8)LOd%qi5frIf0QhS9C|tk;sth`}03s0@GEy zDAACUqR&ZgorE^Sv?NutC?RmBDrlCvVBc#P&aAF<y{Wvr^1D2bn_vmtyuHQ2vvjyQ z9)Snpajhd4o&p%Pi;~dA$^Ix0%Nzn^m*pfUt16D4{xQ902c6vrl|7{kY-0_zE$mUN zQ|dS4JYHMt`4LAzS_ojBEWr#Hy5T!UB(8owAWaUN4%>qn<E=3n3GeRzh^?~X(j-TJ zA5(1h{JhVQlN>$Y4%1kllhg_c4}zr}KF1h1LzT6vPvL>Je_y}gZsxjM5_JCqZiQ8O z*M7MvYgMm+8A?0|UZd8OPQJhfLjUZSF95GQrwRr+p_+I0egHKY;w_=}XebUN)rqV7 zL$g985^;_bElaEFa%ngM9036VvfiN>tU?bENWOJgSTDoB<ZXj&QKn>@F4nZTc-hT+ zw=mhnC6D7IqB}}%Ud|}&88OEUHrFpoYUyOmN!Dg31kF%u7bPs-v*PsSGu1U@8mCLX zbI;YDej%%@RM&t*Phb9R(I<JD?6{y;HQI#<Mszq@UO>PYG1rt?*z?k@E0D__@=yv? zld~!p>r)z&tWX&g7v9?dCDO4?=2sCud9CLNa0DcYfM|~kAq^w4sNtp>lk}w0uZ^+2 zHpz_H`EZf{ef?sk8y*K2lBl?<>RIn+ht1Myv*Qhf<`P>j;r_}6F#*$6omchy{Fi-r zHgx03^WcfDJ^TjpyvG7^F!6owFJE*m?jJB+p<EE#3Ib}f<HKg_=6;w{?cS+EidS6) z)eL@lxWcS~vY;~9<La@=wcRX7e~ZrplH?oAh2jX@zwhK9C$SBJkHxmA$1|q(2t$^| zY4ous?B09e_#qE2a^_mu_v=B$JezE;#Q+jt*is2MSI)CX%rU(3-&ucMI}atI32|wz zdSK`#{e+vtLyZUhb^Y&2yJkhsHlYA5Eu(y{MLFMo;M5^^P8BA?y{hsrzWoYg82UI9 zlm(SNV{UI>+>^D(U~_iBK6!=b2yg@>iGXO2i&h(Z;ZxSW7?3Rcx1wE$U2aac>*LMq zcWuTB*YL)=V@#lP@kU9%wS(KwR2vp1=vyqIsep4McTfK9vfFql>}7XFY7$v{&WuM? zmRG{Rap&IMyw6vn04PSw$p`@3&rm(PZpg)(C6Li&*-#{?14_YiwNMb$6cQtc$^uek z$!lM9FgP>JIgd;7?d3vo1Q-GWkF)ojzVjn-jQQMA{Vo5FZij^rjmcJpSv_sht5}H% z?gf{ef|JCxa=)fv?`prPGVOvmeRe`iq^Q{@xTn_~+*DCj0akTan3g+_hhj?9>Vt0> z7ADDNn_5Cf+!Fx$O_d}329SF27eO88Z(M?ElopL4+1kz=3YA4YZxyEF)7}-+Ec@h@ zo+H2!kR$?($45F_ZS2@MqvO97eoyOy6!AJtFzM32$B`4qJh)b{k{|#&{^$2GOEW^I zt4s@%^x5&vmKMYtvJ>UAO>n-yacFB*RV5-FTaK(f-x-evfv!KaS+_7jKHF@}PSh`G zK1s9V0bTp)>e$@O@6P=INIey%ssc*s{9Jb^2x@||pfV`VS({*RO5&t>mShd)LU9B* z0#AtVIq{6s7hX6>Eb8AbE&`*S!PY2aqScUK+49~FOwdPP-W{_LKXv83neQxUH#yRP z(N6F<4D;ql#%wUA3HEQ{{x#)Q<<-^A5FzePipHEL1*j@7+`ks3ibfX!osZ@a6E`8C zWyiOj9Qo=y3jih{byprJ0_u44y&X^umcfCVpe(2iimRu}%pF2I&8s^{fFmGD1PG7g zJ<k$fbq57xY#S~gVE@0UHh$J{U7{It1z(ym;rC1D5FFx;S#TbMa)-_w(JqLIn5i`q z9*=$WWXO(F&$9(ik<Wd9QCVe~SKKKNii~1lqR{MjvjeBdH1lmJ<fBW9I{>usnHp_& z?BO%t0L%xU>o@~NoGtlt%(R!WRxK3dX9@eih-YL2W1u)uiIl!~3S-weDajhlh2jWs z1c+Y+Bu;r;u-d5kM$VXKb%Ke9?SUd=RcgCFsdE}aBg)9IqKk!Az%MwD>FjsP?@WAa zM!;0Lc79AVQCpn<<cJquA9ktqG8A^N-1XBP1lKwTC<Y2sa`RIEb%O(@L^M~UrJZjJ zoGP2L>(x6IWPt$>P(u;>kA0cgITdRsM8&G0CMe4?yR)E5Lf^!fBJ{T?oAc_<5#R_& z5&>q9Q<F`6^O<>$_a9*ofoaijxngz+Su-ovxVR|qTG`EtO1Dufl@(-e=Yi9Q^$X)8 zXKD4>vAP8@kCKepaj;KupTlR4c(zYlhra7Q1x5Pu^kH2#`X3q;^-(0nwGcC6mKMP( zU;cI&cXsE(0=Yv4Pz2PWi!)(EPApD|NR_}0Me@3Vw1Y)R94)kHm<vs{Bx^7iiX*@g zVD>n9&)IA5c=>S#VGoMo@d$yy>=I?XUS-kt9{lX-i@#&E)2*FYPC~6gKr`Q-7c@<- zo@dd6$LHH0F5z0`98<s)S;5{S@LEg9iPz)k2EPIX6bS_@_`Dc}L{T46SiluDRW@_? ze9$ytbl3AB;8#`rdj3qWLH!V^0@buJhCofq5eZq_M`rD0tW9;glc|;Vw|0)?)tw{2 z5s)MT;BnUbCZCz?wWpt~KOVQdZ(CdFe>4H%F$x4JW59FW&W)G|?v7#@_W`M+zki#U zn-xA&{csG<uF}r41y7OnT|MCZjf=QvgT(5U3@8}Zb?N=ui^0=mDDb1m8#z;*v^4YB z@85bB7T`k#YqoE|@Fx06VKE9Q2pa%FSww5#ae>Nf+vY5yQ_kbSmH%-BB!~cwS0Qgc zv*TdIF~2II0CK!_c;s^yO!f9NhiMZ{u>J;(8}{49KRlS^AXCiE!MY>`pBF{V(kf;f z_4DjH5L^=zu9D3pm%so0hp>4Owe7j_@Cu2eNGKSJ_uh9O$mbYP;D;6#lFDc43-`W; z^~Bw6837rYF%A{HICco;;%gF&i1CMlBA+#<zlk+f&=@lfGOHYF71$gH60E;mB#r<_ z0Q2(UKcU=BSX(@%-Ec<eJ4f1cdOTysGPVH`F)EnkFaS5dyB+qR2QNA3=6+4hg&QT$ ztr-+HU7?%%FeI*-Yk@I7^38F#%5K5Q;1!x~<U>)sTV<sqHop`+Rfb|e43*Ed0jTHK z4Y_plGI-qGb3x*O{l>jpo8H+5MZh^8VOPQ!$07>$MOdhoD2^$Swa1LpS(A)2yuxz? zI0BMHfbsZ9#|ux#$3zQm2kDHbZyFlj$4E?aQz+uw<VMvCqX+%+*J)34f+!CGuaAHH z+>{+3Ia32;TszO&_@tX}i=3&&=X=LL#C@7^6+?Fv`H1IH$alZ}00PQhCB<&Mq{s<y z0FgO6e$R=$xK9HmsjB$-uTxL~6hXobsWA=(rEMC_xLa(GiSEcT^Rb}6#r-M(m;Z4D zq=<mvA7`c<BXLRu%vVlcew;MV>4LB}tico+qrwi5Dw}S@uFWvXF|Cnw^WFSmvJ7U= zXMeD`{S>)+j#)d`+LUAqo-BLrwE<UeUwcdf#@$FMoJJw9+`8I#^@}Jr`X5b^)CzDy zr$sOPU@7qQFvST_BLj@_^}9By>^dj{@t`oqp&Ik-&Qy0KKm|=Qv&yL%PN|$K5nrWP zfw@c^0geFtD%4UVd`-OMpa2I85E5r8?Tta9-E;^*gqPf$8WW{gAaJFTCi$ON{_MW8 zPr$?o!#uloj-`=F@v1&*hIaX$mDTsF-G$$ICe~K|6@^4mb3a`XHAAg@Ro_T4kqxi} zyb{r4Rlh&4{)PJ3K(VVTPMrG{VJc7o6ajUhpA_0%m$q?8UG5eX$C_uVVxm@F-#G#t z0ZAf2{3_&acVckij7aF@>&}s;nVp{22Vu`J*nrlQm~fqJ)#f$V%Sz#{^*}vjjllc& z_x!Y1IZGctRiTG>1%`P;Y_6MY4V@~tElfnv3oiF?|HtYl6!n`kM{QU)e5xEGG$<w^ z@wv9}Y0;|L#?Mde$K`YpGPnI3G!@tHl@@M#EnF+JrN%-LPw9i86ywZJj@DN^5E^6X z4w|L<CCrXT@IQ_KM?iWAz#ez>#Ko6iw9p9)kc9Ii(l-qW>8d3wcv!+rsWzEjk=i}; ze<zQZRniCwH-w6C4zdnnb#=jKMS+vTWivGTIabXav*!eYYd=Z$>}xM#TQx7Phvh~l zx2NG+!OFeQ7QfJbvJ4`4mJz=K3K;K!uS68>TZ7GvfRkGar(r60E6cw5<#<ZB44FY; zO0`1~P)BH2UE1cM4o!&$IN@%AzDXpKkfc|AxkMZRjsOrKJT8(ob*%{8&FGuH{{oed zv}JdH+87LPY<sKBmKGPHikO}=tK`-d5Bmf$&ckEwmX}T1F{ADHP&iC<vn`rgW)DgE zsv&%uD(AzzvhsV)vT3qg>TT8^FeeCNF8Uxhe3}v>cn}aj>1JCMGxdHGLSET116Khe z4`m^q@#-o-J$=#a_R4U3dOTF{v>^z(fKs47%Gx7Xr;1JjaP+Z=9tCpe{&D`sa|9%c zKph?z%{ofrjNgeVN5(wyQ^vMoSlb#lU>kD?<`80^AWRF|_368w7eQnLp+N6)>E##J z3=W(a4vy2#29KLuChaV<e7Z(HL-WCRAK|LUKT^fPzbGmS{QmI|(d~c;5X7Z`IEkMC zLg0jmfoq3eF1>=Qa1#$B#_*_MRC(8@@0gOXU8<2x;53I|xFYHWTjsXmb+m>?7m6c^ zDULSM2qC8$#Dn-BM}Q+BJp^dnA$`e(0Z;P&J0;OePAtBiBjZ=}!}QLlbU^{u2vdq3 zGxhrodmaOx@UArY2kid1@<)%tzWx)!R2T^)JZ^k2;e6CIrD=Z5H)oIHlE-lFk2^_G zR1_F4a^u_>h~Pm$h#xQ^w0B{@bB!6>EH4MVh&Ajxw7<%#1?&JHDu5#5^PhDhai=a6 zRj6o&3nY%5(yP8)B8~t@00=N1XRZ}W--1EMOme|6C)S)m4I|WJl3@vAW>9#H(vlpb zi!&`M%)NZ)8YXeNBRF=R?cw?TUq5Cn>)h_;K+Q}8VY*k152lDIicTxK|8o8$JkB0m z#-1P7`oE&6DDcncPj*_-EpkfqgL2^v5qYKo;%6=I^3&fZFcGxj4o5}#rQ6pQu3Q4B zEf`^rQDWB5lL|l0ODS2~p&*)wcBl>R_)7Iv+a%LwnAdoY07pQQ2nh3lYUzNz|AfuO z#Hc|eh?Lg{w(q1STfSMsG>JxIf;FL2%I?qJXEQuKvnQFaf4}D7$uARg()`8;t6`Oc z$7dSqrLalzf$N5zyZZM(XpoZ$jsl;%dTzkl!C{kR^@PG#2n&(@UJgpmN&D&)S<%qL z{CjpogaZNC|L%D=p<{|E!KTJ6d`lR>Z{JZ3MYz%$Ym!F@>LYp-8)<HjOY#loLU9D> zIH$v)b2je8lcHJIfgDhF*fBC@aW9OpA#yp$9%V|lVg2i#1Nt62^*sVAJo7kyWvh`K z_~l^Y;`FxTf>qP?+L=c6OoMX@eML5Y%j7G!uQmI0eCDOWr{kc(0yilG3Vh}E)t9$S zf(XtM;TR;Yny!P$DT_0|{PnBGkT@O<NC9k*7yAHYKpkj{1ndCcp3{?%IBRR2511c} zDGTRW5~-Y5c#Z%^K#~a1c|eQ~>V57QNx9n<S?nCC8JqlXd0PZ8huIa@l-Ovqdd&3k zXD^@gynYsl38Q(~I2bJU)u}`2OFR0FYp<B0)etJzJBTmjm8coJ=G-Z}>tR>3CebU) zjL|~azqlv7A4oXBSDbu^Te-Ug_q<(pXZl;SAc8|2hz5^}V!8&xX6AJ{e3~qz4iG#H zY~udp*QyFYI(EhczzdME<Rk*d|0Qdy9-C6D8cO0F1S%g<d!A4^)g7a9`YFj8%!T3z za0EoZ3MFyE0_^>Fdifo8A0dk!qnL?@aB@r|#IA1$oQRIonUn01hUlE4ypmg28w^8q zQ2DpNAMc*uJ79c>VycE%<umk1su}wB6C&omy#Q3!Ts#iGCfp77uBpCPRet;KZ6qAv zD?NL^LH~w3;;wfd1%{<RclUgV06~~U5KTT!9q@8U&w{=`{P`oX#Ibgx`}GVMiIYIX z+gAZ;q&^z(VjE>Z4Ztz6HhuFDstdu~cH(Y9JAx9ORY^6=t2;-4BOplxoa}MXG~;pl z{tHaOxIjD)%3!7+4iGHS)=qr2?aX2NBnv_*ls4Vg58fgh235G-XhI;qd&I#4K;cau zv}Q=#F+q`&6}p)w^>jTvEg->pyR(tAS$G_~qv1iNWu=Es9nRlVIBDC|5wDL%dS%<x zf<1+YPkoJ_kOA51k@7=)Wd)wMdja9`>3WC*5|5muXg4-!$hr}KUp<cp5fb;fH617( z00KsUiFH)4RxscN$bh<SOgM>A5fn5^&=+fTca9PWo#|0HNx0rY^msb|;|OpBq=x{D zR}sx{k*@`Vjxqva0jK031soWsW<9C)M`u6K5{Y=YD1CH%$K*Xn_F-s__@F(SoM1^7 zaDAop%7iy3`@Iw#Ix$i=)2NxD4;ddhW9KZG%#X<9C;;)WSKRyL`%ebFHpDz9CTM)v z)1%w98ykp(gW&PuIEjYj(;q$~<~g?DX{gMe$sGm0b@$fvowFbU1c5jq6Cwh}1y9~K z^=j!=)E>{5<5!9r*(Tz%Z}!J`NCu=>M<vjLK*K<I#*I_5oKz$7IHh&gPl8fv6~qXg z{z^{n93{Q#%O&Cna0GyW!>=-m8rsCB6NsQL3s52u2_4=Q%Iq0ihAD=|!A``;Tc}NL z#iAcNdDrKA9{Ks$t@1k!au&;gLfkI9UAU)MHACk&HV8hJkO`5KwoJW#`}!k}bK=ey zZ(N%D_I&wNl|OAKlv6dZksS%oLgV2-E<`>}JAe1WlA9&Cq>;sTnGFTLe*4D6EmI)^ zZtnL|5W-Ye?|tp|z1xkyGobtW=VRSp><ushX_!44(`W&*VsI<~2l5>#{*I1O9eu(2 zb|{YVyOW)cGVni+07pQ22vENY@p@C&Dtq&Hh-^;DS}*_|$BY+t5-JB}q;41#)>Ds3 zo(O8j%1!2EJJ{#NF@wMR?Wfxnci}^D$#?Zm0#<m9_nz3-WqFUFmqVW!?KfimsFE8c zkHX`)=ecX=hQ2<s?bzVJaiPkoS`C~w({%L`PU5G4aiRWWgNMI9>MsO4J_41az!$EU z3|%+!nNfa$FNb!^@3sGz1FX{26WQfgzy;6%9hMgdjAYayR`rZ21kvJQJq>AZV1;qf zPr}qezrxUl`UF~MUKFYtlG&j(ddy0~KRE&%0f`|%c%0hW0xuIn7c9P7Y7p`;)^PH- z5}MdCG8v0*cOVO4w=spt<1|<eQEpNV89(CtGbg}G@SZfrSy59>h8+L6{Acb5d5F(T zS(N_s-@ky}UGiOnC$Xi@)mv9bZy48Rw131znP$2{4F;d8b(!!J*c{oAdF&hGZ`{7& zVMiX%k4Aw{{PlD4!gRC^IqxpPn!OOJG2S5pQAPQkio4&RJu&#@;WDF=z!;~&*d~Al zyvfDS6SPSqD(HoQFB;>d8K%cjA5BgTGo^T<R*BVJE)GY4Bft<Keigju>{Tb9)NrF; zg=5C-ltjcc4(cbQ4_X<89e(|jWdBk5x3z>Kvcg6q5r<9~2`UFSHO5yCek4&PSWu;^ z@`K|ajd*?3(X+=Mg2(YJ7{!PxT)C&ne@t-11et~~xTc|`MYiw>vcR$Ji#}V8)d%tC zc{I``p`*Y@&m0}Oe)LD*eOz8y4soz@ug5`6avSCoN1F$@hEE!UC_?}U7~7i3#+v~t za<YN4h`C7I#MWkNB5oEzag^d6N)&od$VOS7&jaEwJx4&I2*4f}dgTI@6BC<Iv%nYB z1|(;w=}p<3{7Pv>U=3UdBhkL7CszExu&0B{VU-ViW%Tjiegu^_9Kj;;Vl}3G-oJn0 z+Qln3uOP@;Jl)v;+1Tk1=YEWt8y7GpSVL^^21#7VfXo47gJR|<ocQYm%FytP`3DMx z0$;s(_2Tu5xV$lDIBozE2RI<{<EMWFTmTJgi(@4$!1y14X$!M2>;dqJc4#8@ICE+- zO*#0Tu{r%pltuN$a<XG6TB3EBi^UP}bp)QE?>u2-_VU-h`IHOjS4!(35lS3{!3m*= z9ehUdB=acqEVBI@S)<$<ri|0sQ{!M-4jMNM4quGjmE9|AjDrQ#1_DJC;6uc8<Njbz zSko&$E(jhMB6}rTHAT~;6!nTccwA_~Cx!6W<5rC<urr^d*ffN(QPYcXf4~B8e*EK? zVG~Dz!~q&e8~_4FOtUi2>MQ_Gxm##ZscHmvriv4oUC<FzC2O7?Z7n(Q^~%oW=Lkp? z0q{8Obkjb#V8;mz&U)?w#S1LYdgzqOafY!xv*_8UVM-PvE0DlMiZ~r{@*0)Tj~a*w z7P0_KgK_1~jM(&J&?3}y<L-@T3;VYj<)@yiRZdYiDXFJvap7|-`?H|(hv4zXml`(* zAb<tnU}TtB;wi)uCmTd4{ID1qz$7-fvxzM*IOz|8(}kaE+hAg|JGIAz%Gnu4^b)PZ zTr7@&uOq<b0TDMhBLy5#f~FiTFhw0MAlaDRM;ZW;N@!z1NN2}L{iICL(3494cGhrA z^~8j7Y$l0d#E%bsj=3!j&h~6P54y|=eZngeKR+>GOrUy-Mmbs4q=ZWX#stO9OZe#= zajm#~M6;YEBwkf{we03+NA`Dnp;v@fj>RJt@p?a7IG{sAsGpR<nnt1y+Ua3^CZXLG z_?oGPd^)R7_=>C8g@pZyrhL7!bNM*}5=DT;t2i^YgA|zOMCh0^njp3wA!`TkJANfJ zA*3B64O6q=6M(P0ojDXi7g%i-QFNFhwCSB~7j9m{vLT?tmN0c;-a<_We*VHV(-QJh zs0t)LN!g@?OG3wm>Sq}D{<s&nA{~eZhbf!L>w@4_73WJYZGLwf7BWOT2NIXZX#p2N z19Sk8a<R}E62K?MHETH8=SVV8L6}<jO39iv!&G;)aTQzTkvNcO9p++j1biI<(LYZ6 z>4c^o_BbU7c7|DV%(!D@K`6VHK?KI9X9!=wax~BG!iGH&IY+i;PK}K+C{#9G_R7Vl zFaCa~q6}W}=KTZVG9Lfr_$Ruly0CF!569!UP&-Zc@$rvQHClqlA^6?OdjMg{>Sb8T z05dj8I~S`WA%^OJHr7zntDOZTX?saj;5cAD7GiyayTt_CoZ8*aR|&t;oFICl6h6-B z>n}T(U$O|0col&uC>^k`qUVH|*pwp}Wr&tIr4>RhG%=1K7YbjQc{s|puqR^X5dMrQ zLZNmtzZ^@2MCj#XroD^}nu)u-p{*yHMDz|G-}lo#5_vKzKt53}pBNoYlVXy>onelj zSRR^R?mx<3Jx#NpZeZW+JPuz91jkaeSRRrzY!<C0Ee10-0TF--NS50d_9QS04Jt*F zd?ks|F}2N^84hZ8Bz6hy5(y13$<OXXE~h6YTZ_4190A`(;0Z$0)K$V*IE%2k!z#!7 zPnd$z0S*MlXZi6HVFyAGl<w<r4ZY{iQE@B!VaEd!dSM90A|bjYvjt1{Su|Ksd&fur z#V$hFv8<7EJ{!a7#2&A?f2QQjfZ~Cw$?B-_ve1{p!p4Qyrk9+Kao*``__zpsl}(Uq zrf3Hh4?a_J7PrC;8}r=8<RQyrRh3^YyMaw1dJXIc5X^}-0D`4yNRW@h50iajb6K1? zqip&~K&BcYN+G(S?94KduMS$LT#v6zBP0W*ewu-*7-xLDs&nZ%0+K~Q@T-8430X5< zCe$pD2%!V|l@SEX!^mC8Ba#bi1}M>hUj*|ICliZa2<u_^x4a#;l=QQND-!hZv0zsO zECPkS%6>j~s<ix0RZVqcsIW145cY>izTeKDIdt;SC*OUt`M~Df_w%N1oi=9um;prt z`mE^NEw@{zB^{A)&^N#DfTDq8HjJINb^5aRm%Vv#^QYf`didAFzg;*3>;54EAKjG@ z0zym(i#_lXJEuZ?4F3WO0P>VJ5TlxycAvQFc@a{f6-0YU&WJ3`P^GObn7x+D3G&ba zYgTD~%HWL9>3Na;C0mQRU>pJ8MnH&HVZ6XBILa3ym5XMbNHK&L2w4*zAqRxn8R^r5 zEM~tm<B`$O&QWO_1}TQd!}$xs!t@sGhk&hZuuB;>oa{5?xwk&qjls{d%6rT(Z<g^- zn9}Tz&9E=MQ+loR>ZR)?=dWG(>+)acu8@R-3)e1Ox_;?e>9t#TZjqq%+RK_DQiTap zSyc(qAmH1dz4z?!7a%fr!ZWAXBVv`9t_eT@OZ4ElwDn|@HV4Rnl%(1-l&L8l(>zoK zB0ICI81h6rjMmv5gik?JzFpP1^c(@nBEal%#tVd+iDkzKf^e~D^btZq5^QsUIA~5W z58)jlPpwHv?!Yo&p+4jE4p^@oJ0Tz*0~^9&Z%+hiz(H(GvQA$#`^br7*YA}gl!ZCX zn}y9`9mA$3GlS?KINjx+@H5>W$elsmr1PxsM3AbA8}~}TK5=x~qFIJSvP3&XhTstY z8AI^DqT05#ha0DN6jm{G##3N$hh8YQ^;|1dL0QCFCu*V%s#AXIRc9KZCOpX?*;>p6 z;|TaR0%RT#HL(d(5E2&*ZAJ|O3o|aJ6i?0*i;pq8Ko*SO9lY<jir&!a{&1Ivb=Ut( z-VV!#U}J=cSQS<+*T<Sdlo6@jGxIkT{q)Dl8~1LJz{JL_uGL6-g_ESg)W};km<=RO zyy{hCf)5-iD>oKHwD!tyhzVgMVw7Z>kJ=yGvtehSgcZ+HswHhC;bKbPgqlT8#~BJc z!`Ate=3)4YRL*W9-il<vwKS2N<Ew91buK+eK(Yu>9w)59UVGt%7Z^b>!x??BpQ!a$ zYXH)d^eef9k`5z%%0v!AC)p@Hjmp?O4BJbxk-cZkApzD%Re}K?bGbnop_BI>{OtN& zn?QeH^Rfy;h|Oh~H^{$_o`Es=y~=Vh_^;>ByuNcIyhaF0foQh0I90qM&>D&0Like9 zBT<h{&e%MZz(N_Eq6d_SBE&OHDHJ*(kEjSr+zd~0p`bn?CoUK7K+ZTP$<|^n7)QXj z5g<Iy3~gq+i4Imq3ZN1Pn~(#6AVhvAzfzNs-2q?442(YLwIa(4{6fBtj9t<@q_YN$ zhQUvG%!92_#uOW7rDMHTO^gBa_&4s}`upW`AVe6pB+}#2w&{6vj`n;96puLfsSSRn z<j*(X+dlB6VM?1;W*`%M%&B&4veDKOM&?E-{n~d@$K>=RU{Yj6&IMK^2`0J7&LW=l zR{?4Qpffv*U+GEeY$5k?<e@e`>t^|ORp-)k1SE?9^Q#bQsD1MV5)n9sPzEL6y4=B- zntnR{N_j_M8G*Q|Nl4C9+G0K&d`(?HNHaDC>-k|CItb3s5{9`j@H`me%yOejA8*Do z-0OC{f%!7m%SthCsHz&ib0G@Q>$L7D0Ez_nIz}>4NECJL_6-Ba4MX7}0t6v@-NmW> ztl^Zw$>N2YaVcr*2h~Rs$cP>)$4?F<>4Av02=#-?a$M;8fL<usTFeFG2>3Pv%&)>| zLbRqS^E%Oi!}`MkF~G&2T<|r1s>3_tttjs}@{0#MM!`WWd)|h9%iuA`KA--UaCne) ziDrGASz*?gl5D*OJ&Rbq1K%DxQ}PEw_bRF@5dp#o9c1d@Q_uEtbN%XgA_{<EOcVx1 zI$QGR7vCOQShy5UAq-}s*eJX{(GnG__P0blt%D8j4*_K_*b@q#>#$u!?*SMYs&3E| zuM*&`rzvNp5d3S=u6+vb!2RRC{jPKArHcUbt1$8v=vAa?^5)kbJ23*~8vF$Ma3U1J zq9mLmk`cX}_3K4Kuf3tj_!(P<+ZJ>W>8cahTpQ?Tf^DwW#2aDQBE~}(YedZT*clVv ze0Td--yiw=`bDhPjX5>2&|wQZq7_?+(;eK62jOvu1jnOMfRfTHM}9iC<-Hx4o|@Dp z4FQEHDhjMkG@<bR=5WH`Xq<F`@E}<ibkE!}{6X328HN&NYKm1YyiTBzlSBnhfD6CY z(NSGHT`=>RI`ETpt1*|1BjD2rIN9S)OkIa@g!2x*a2!zTd5}%$nJkfXL=th?RMZ-h z8E+0XzuGypyPgbzg8sCDZA~Q79K(b91hY2Apt0-qai+}PonDzc4MT_rjvoS{V>py7 z)lyXfdPPhjsFs=P&0>HPo4c|Sw<Xh*sw(iH((>Equa}^6u>P%0h?VTpzXyn0ZPTH6 zD5NT0A8uEm5kldy1q1{^aE=LKg>*cVIh5)&jRG~(_Od>M3m}V}?toeZ-_cms(^|c+ zVq?h~44<y)TzHOvbP;gkae<K?l)(-h1|S%OPWWWm7+>I1Bo4;c&J94_<5~i$d%n)& z(l-vV%<de~$AnN82b%}mWbjeI*<whrz-56&T5teDhXXxlRo=V%KK$<VPk&xHfA!7{ zY{+o8QlNEM>tJE#gsDgF4ino!_sD=hWF}WsS25zot#HGucdp~+cmy7V$Kjz_eL91_ zQ4DR25snmnq8Y^twnd@gVGQ2J5&{vhQW(S`u!s=V3jV;ETJ*%9>N2>99tEHMRC|eQ z#SviZ<&kbR=8|y)d>R3lJnmqPT6?*cgIutNBfmiXt}@d+4lA;jV$e>o%WH1}`m^Ws zjC|INfkDKyu$^%*g+163g%!FD$z(nx!m*WRjW*U8laY|ov*Vy~!?RZ|*|dA>r-%1` zd+LYN7k<B3dKnXo5b**ohAE9D2H_7uf@SSU><oTF24q8KT!IU6`LSOyLw_%Bh}+`k zcmy7V$Kj!PGzx$K8x#hSHt^}QKok@e6P+TTwZ!D~f(Qfzk(BG3;Z7LVqgto04nQ0S zb=o{vAPX6sZbGSCEQU|lbS^wcK)MJ#$m30BjXH$l#ME`p6XvSZDmZhEb53?1pKvJ0 zFYBiqkr0%jfNlPNk!@&XOR%3gEW{oykJsvwEp&drRcnXW#Q^IVo^)fPHLG`Lg#AsJ zGiCmYMFnpZzy8*yZ6EA<Z~sT&<-Pwqu>aVXhkpD92?zL!llTc4kPVsVEnhfs&J<h@ zdmmOmZiw5Go7)Yh1S=kghvLyF0Om10V`z_p{VR$TEGR>%9G(!ryr19)7pYSat=?BB z9(R`A<8dAIoLYzn$sHQ3t3>hX(yhi^GLC>xBOvg&J65I4QkN9ma}c?SNE!7hsj=r> zJS+9}L0FPoKEUo5A4xVmqZT@Gpc_Ll!9C2bkjH8?2}XFRv2=-%kgo~MtG4Rk`at|2 zV$wm!n2D3vF(tW6dRq4^5IqtO@D(TV6EYwhGUF0lh|6&kLp-@5Zi|~^H;k|tMG%}P z#t=LjT?AST|8_CqQT?s(?4ytm$nHXx`modo^C2#&$K#&v;L|mo3(padE&>nQ<Mnvq zarv6HZA8+l=S?#@fj6;EH*uh2|1&zppK*Es94}Tv>(Oyq%n?<`8?*@~urNvSW@=d* z)HXfFOEEHuL=W^Bq9mh~@iZF-R1-|N5SQa7xK(?*EWi>0?ndwlTjvW8CDTxo<tT<} zW~ao${+V0r1fn#=)ZWBXy49FV#u4yo1pYBR?%+oddg{7?m=dWTlN{082!{r|(jZwj zE{X}F@K(d)fl)_zV8FsbmdN(jC~RaAW{XBV3F6bk?Ih6y1x|+8<n668WJ6|Lf(vmu zZi424nBFRXB+RD|OpV6svUn)m-zY%Vc2AbCqqL9Jflt?TE<8s-x(Kugk9Vx^E_ehZ z)SW|yJ|c75h?F%0!0FiBSvf2|qOU19lh8V1{t%6h^o+4RIc8tkf%{LAnO=qbxCw3* z(bo*Gw|-&<BHWXTUZ@uX-XKReCk~GQsiPRut;Sq3j(|@i&>}qEAi=dz21JP@7rzjf z*B7*Fn34tCSw1i(vY#1Y>A_j5z_e)pB$<C=lwVu~5)SYcC-D<9AR98{5?qMOaTDAs zeG^&AN;1i(YdRO6BOqM_B*o*+Nw^;S0nPcKR%|DvTaCG7908w3fb+O?%<TqS7oV=_ zTzHOvbP<pyk2^fV4N{v=Wsq()=8|y)d>R31^0-g2bK`~e>6*@k=Lkp_0jcqLGh5;h z;U#~FOW-1ZxT~7zTbFJ%=8|y)d>R3%@p$8n)8^0FDqQ?1#rEl%&V}a)NEd+?;PJ<v z&K`vd|Iyb<w;FTFI08P6Knw7A6Fd8Ln31;ukAhx9*ZOo#=fZOYq>Dhy@HnUAhA6d8 z>(yGBrCW`;WE=sXMxgn4oO5?;(eXpK0X|*Rx$qnT=_1f{9_M`h*z>hJqL*$p=8|y) zd>VnK^Y}lO#oV!*@0|DPn$Csi2uK%!`aIsu@z=gh`i~o!(yhi^GLC>xBT%2m{{hD7 z<LB6U-1yp|#Ciqu>6*@k=Lkp_fqx*6`?ihm;OK`qkZv{Rl5qrl8i7{g@p^{gLvT<F zUDAYtd8r@Jgc3H?!ufPf=fZOYq>Df+@wi(SZhdlWfhRU2)w%_$A&zd$h0?9YTr!S; zPb2WeKZS!D!&43CX#o;%_@T`~!Oij%pRVa#c#eQ{5qM;K{PAbT$G?QFMfB3G##}Ov zfKMav$UNR!9Mn{U)VKN>jnjfp*K{sCM?ks=NS4Q&%KN^MU%J(pOU4oKX$1ahJkFgY zjWfMnHcLKT)4A{*0qG*}Pvh}NU@@1}*2t66@X|=P8gt1w0zQp^8y@$z*((j+^w3B= zgn$omNxcI2bWP{Na|EP|fEyn7lG$62cO>%F+l`_FM(I{#E*VF_rxEZ09)E0T)WN6T zI`HY5&V}a)NEZPo9_M@~^<Ic{t1*|1BjD2rIPv)7!D5f@1@@M;>$T@Lx&ij-n$Csi z2uK%!$BxIn#)gkaGv-$OMw7MMJM0`K-D=Dw;|TaP0-VQ3c_6-j`cL&bH$Gj{x$qnT z=_2sB@OVAO`KJ@;<5_;`R%0$1N5H2McwBh=@gzQpmCC1UIv1WJAYBBW=+GRFSBddm YW5sDE=vu8WBHe1tCF2PAGy+fjKPI4DEC2ui literal 0 HcmV?d00001 diff --git a/share/windows/wix-patch.xml b/share/windows/wix-patch.xml new file mode 100644 index 000000000..1c1d222a9 --- /dev/null +++ b/share/windows/wix-patch.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<CPackWiXPatch> + <CPackWiXFragment Id="CM_FP_KeePassXC.exe"> + <Shortcut Id="CM_SP_KeePassXC.exe" Directory="ProgramMenuFolder" + Name="KeePassXC" Icon="ProductIcon.ico" + WorkingDirectory="INSTALL_ROOT" Advertise="yes" /> + </CPackWiXFragment> +</CPackWiXPatch> diff --git a/share/windows/wix-template.xml b/share/windows/wix-template.xml new file mode 100644 index 000000000..1e47029ef --- /dev/null +++ b/share/windows/wix-template.xml @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?include "cpack_variables.wxi"?> + +<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" + RequiredVersion="3.6.3303.0"> + + <Product Id="$(var.CPACK_WIX_PRODUCT_GUID)" + Name="$(var.CPACK_PACKAGE_NAME)" + Language="1033" + Version="$(var.CPACK_PACKAGE_VERSION)" + Manufacturer="$(var.CPACK_PACKAGE_VENDOR)" + UpgradeCode="$(var.CPACK_WIX_UPGRADE_GUID)"> + + <Package InstallScope="perMachine" InstallerVersion="301" Compressed="yes"/> + + <Media Id="1" Cabinet="media1.cab" EmbedCab="yes"/> + + <MajorUpgrade + Schedule="afterInstallInitialize" + AllowSameVersionUpgrades="yes" + DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit."/> + + <WixVariable Id="WixUILicenseRtf" Value="$(var.CPACK_WIX_LICENSE_RTF)"/> + <Property Id="WIXUI_INSTALLDIR" Value="INSTALL_ROOT"/> + + <?ifdef CPACK_WIX_PRODUCT_ICON?> + <Property Id="ARPPRODUCTICON">ProductIcon.ico</Property> + <Icon Id="ProductIcon.ico" SourceFile="$(var.CPACK_WIX_PRODUCT_ICON)"/> + <?endif?> + + <?ifdef CPACK_WIX_UI_BANNER?> + <WixVariable Id="WixUIBannerBmp" Value="$(var.CPACK_WIX_UI_BANNER)"/> + <?endif?> + + <?ifdef CPACK_WIX_UI_DIALOG?> + <WixVariable Id="WixUIDialogBmp" Value="$(var.CPACK_WIX_UI_DIALOG)"/> + <?endif?> + + <FeatureRef Id="ProductFeature"/> + + <UIRef Id="$(var.CPACK_WIX_UI_REF)" /> + + <?include "properties.wxi"?> + <?include "product_fragment.wxi"?> + + <DirectoryRef Id="TARGETDIR"> + <Directory Id="ProgramMenuFolder" /> + </DirectoryRef> + </Product> +</Wix> diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 97ff5edf2..ca918971d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -299,14 +299,21 @@ if(MINGW) set(OUTPUT_FILE_POSTFIX "Win32") endif() - set(CPACK_GENERATOR "ZIP;NSIS") + # We have to copy the license file in the configuration phase. + # CMake checks that CPACK_RESOURCE_FILE_LICENSE actually exists and + # we have to copy it because WiX needs it to have a .txt extension. + execute_process(COMMAND ${CMAKE_COMMAND} -E copy + "${CMAKE_SOURCE_DIR}/LICENSE.GPL-2" + "${CMAKE_CURRENT_BINARY_DIR}/INSTALLER_LICENSE.txt") + + set(CPACK_GENERATOR "ZIP;NSIS;WIX") set(CPACK_STRIP_FILES ON) set(CPACK_PACKAGE_FILE_NAME "${PROGNAME}-${KEEPASSXC_VERSION}-${OUTPUT_FILE_POSTFIX}") set(CPACK_PACKAGE_INSTALL_DIRECTORY ${PROGNAME}) set(CPACK_PACKAGE_VERSION ${KEEPASSXC_VERSION}) set(CPACK_PACKAGE_VENDOR "${PROGNAME} Team") string(REGEX REPLACE "/" "\\\\\\\\" CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/share/windows/installer-header.bmp") - set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE.GPL-2") + set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_BINARY_DIR}/INSTALLER_LICENSE.txt") set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON) set(CPACK_NSIS_MUI_ICON "${CMAKE_SOURCE_DIR}/share/windows/keepassxc.ico") set(CPACK_NSIS_MUI_UNIICON "${CPACK_NSIS_MUI_ICON}") @@ -319,6 +326,13 @@ if(MINGW) set(CPACK_NSIS_DISPLAY_NAME ${PROGNAME}) set(CPACK_NSIS_PACKAGE_NAME "${PROGNAME} v${KEEPASSXC_VERSION}") set(CPACK_NSIS_MUI_FINISHPAGE_RUN "../${PROGNAME}.exe") + set(CPACK_WIX_UPGRADE_GUID 88785A72-3EAE-4F29-89E3-BC6B19BA9A5B) + set(CPACK_WIX_PRODUCT_ICON "${CMAKE_SOURCE_DIR}/share/windows/keepassxc.ico") + set(CPACK_WIX_UI_BANNER "${CMAKE_SOURCE_DIR}/share/windows/wix-banner.bmp") + set(CPACK_WIX_UI_DIALOG "${CMAKE_SOURCE_DIR}/share/windows/wix-dialog.bmp") + set(CPACK_WIX_TEMPLATE "${CMAKE_SOURCE_DIR}/share/windows/wix-template.xml") + set(CPACK_WIX_PATCH_FILE "${CMAKE_SOURCE_DIR}/share/windows/wix-patch.xml") + set(CPACK_WIX_PROPERTY_ARPURLINFOABOUT "https://keepassxc.org") include(CPack) install(CODE " From 6bbd42bfd194c93639ba246b92ae08dbee277e79 Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Sat, 28 Oct 2017 18:37:05 +0300 Subject: [PATCH 091/402] Allow to change the height of the preview panel (#1135) --- src/gui/DetailsWidget.ui | 322 ++++++++++++++++++--------------------- 1 file changed, 147 insertions(+), 175 deletions(-) diff --git a/src/gui/DetailsWidget.ui b/src/gui/DetailsWidget.ui index fb31409f8..8fbafe349 100644 --- a/src/gui/DetailsWidget.ui +++ b/src/gui/DetailsWidget.ui @@ -6,22 +6,10 @@ <rect> <x>0</x> <y>0</y> - <width>630</width> + <width>600</width> <height>200</height> </rect> </property> - <property name="sizePolicy"> - <sizepolicy hsizetype="MinimumExpanding" vsizetype="Minimum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="maximumSize"> - <size> - <width>16777215</width> - <height>200</height> - </size> - </property> <layout class="QVBoxLayout" name="verticalLayout_3"> <item> <layout class="QHBoxLayout" name="horizontalLayout" stretch="0,0,0,0,0,0,0"> @@ -36,12 +24,6 @@ <verstretch>0</verstretch> </sizepolicy> </property> - <property name="maximumSize"> - <size> - <width>20</width> - <height>16777215</height> - </size> - </property> <property name="text"> <string/> </property> @@ -166,85 +148,19 @@ <layout class="QVBoxLayout" name="verticalLayout_5"> <item> <widget class="QStackedWidget" name="stackedWidget"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Minimum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> <property name="currentIndex"> <number>0</number> </property> <widget class="QWidget" name="entryPage"> - <layout class="QGridLayout" name="gridLayout" columnstretch="1,3"> + <layout class="QGridLayout" name="gridLayout" columnstretch="0,0,1"> + <item row="0" column="2"> + <widget class="QLabel" name="usernameLabel"> + <property name="textInteractionFlags"> + <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set> + </property> + </widget> + </item> <item row="1" column="1"> - <widget class="QLabel" name="passwordLabel"/> - </item> - <item row="2" column="1"> - <widget class="QLabel" name="urlLabel"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="cursor"> - <cursorShape>PointingHandCursor</cursorShape> - </property> - <property name="text"> - <string/> - </property> - </widget> - </item> - <item row="3" column="0"> - <widget class="QLabel" name="expirationLabel_2"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Expiration</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item row="2" column="0"> - <widget class="QLabel" name="urlLabel_2"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="font"> - <font> - <pointsize>9</pointsize> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>URL</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item row="3" column="1"> - <widget class="QLabel" name="expirationLabel"/> - </item> - <item row="1" column="0"> <widget class="QLabel" name="passwordLabel_2"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> @@ -267,6 +183,102 @@ </widget> </item> <item row="0" column="0"> + <spacer name="horizontalSpacer_2"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Fixed</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item row="3" column="2"> + <widget class="QLabel" name="expirationLabel"/> + </item> + <item row="4" column="2"> + <spacer name="verticalSpacer_2"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>0</height> + </size> + </property> + </spacer> + </item> + <item row="2" column="1"> + <widget class="QLabel" name="urlLabel_2"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="font"> + <font> + <pointsize>9</pointsize> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>URL</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="2" column="2"> + <widget class="QLabel" name="urlLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="cursor"> + <cursorShape>PointingHandCursor</cursorShape> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QLabel" name="expirationLabel_2"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Expiration</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="1" column="2"> + <widget class="QLabel" name="passwordLabel"/> + </item> + <item row="0" column="1"> <widget class="QLabel" name="usernameLabel_2"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> @@ -291,41 +303,11 @@ </property> </widget> </item> - <item row="0" column="1"> - <widget class="QLabel" name="usernameLabel"> - <property name="textInteractionFlags"> - <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set> - </property> - </widget> - </item> - <item row="4" column="1"> - <spacer name="verticalSpacer_2"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </item> </layout> </widget> <widget class="QWidget" name="groupPage"> - <layout class="QGridLayout" name="gridLayout_4" columnstretch="1,3"> - <item row="2" column="1"> - <widget class="QLabel" name="groupExpirationLabel"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - </widget> - </item> - <item row="0" column="0"> + <layout class="QGridLayout" name="gridLayout_4" columnstretch="0,0,1"> + <item row="0" column="1"> <widget class="QLabel" name="autotypeLabel_2"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> @@ -347,7 +329,30 @@ </property> </widget> </item> - <item row="1" column="1"> + <item row="2" column="2"> + <widget class="QLabel" name="groupExpirationLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="3" column="2"> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>0</height> + </size> + </property> + </spacer> + </item> + <item row="1" column="2"> <widget class="QLabel" name="searchingLabel"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> @@ -357,7 +362,7 @@ </property> </widget> </item> - <item row="1" column="0"> + <item row="1" column="1"> <widget class="QLabel" name="searchingLabel_2"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> @@ -379,7 +384,7 @@ </property> </widget> </item> - <item row="0" column="1"> + <item row="0" column="2"> <widget class="QLabel" name="autotypeLabel"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> @@ -389,7 +394,7 @@ </property> </widget> </item> - <item row="2" column="0"> + <item row="2" column="1"> <widget class="QLabel" name="groupExpirationLabel_2"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> @@ -411,15 +416,18 @@ </property> </widget> </item> - <item row="3" column="1"> - <spacer name="verticalSpacer"> + <item row="0" column="0"> + <spacer name="horizontalSpacer_3"> <property name="orientation"> - <enum>Qt::Vertical</enum> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Fixed</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> - <height>40</height> + <height>20</height> </size> </property> </spacer> @@ -434,27 +442,9 @@ <attribute name="title"> <string>Attributes</string> </attribute> - <layout class="QFormLayout" name="formLayout"> - <item row="0" column="1"> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> <widget class="QTextEdit" name="attributesEdit"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> - <horstretch>0</horstretch> - <verstretch>1</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>0</width> - <height>80</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>16777215</width> - <height>80</height> - </size> - </property> <property name="focusPolicy"> <enum>Qt::ClickFocus</enum> </property> @@ -469,27 +459,9 @@ <attribute name="title"> <string>Notes</string> </attribute> - <layout class="QFormLayout" name="formLayout_2"> - <item row="0" column="1"> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> <widget class="QTextEdit" name="notesEdit"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> - <horstretch>0</horstretch> - <verstretch>1</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>0</width> - <height>80</height> - </size> - </property> - <property name="maximumSize"> - <size> - <width>16777215</width> - <height>80</height> - </size> - </property> <property name="focusPolicy"> <enum>Qt::ClickFocus</enum> </property> @@ -504,8 +476,8 @@ <attribute name="title"> <string>Autotype</string> </attribute> - <layout class="QGridLayout" name="gridLayout_2"> - <item row="0" column="0"> + <layout class="QVBoxLayout" name="verticalLayout_4"> + <item> <widget class="QTreeWidget" name="autotypeTree"> <property name="frameShadow"> <enum>QFrame::Sunken</enum> From 8b00d0580bd4028a20124113d2bc2be3f3153f1e Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Sat, 28 Oct 2017 21:14:45 +0300 Subject: [PATCH 092/402] Synchronize the height of the preview panel for all open databases --- src/gui/DatabaseWidget.cpp | 39 ++++++++++++++++++----------- src/gui/DatabaseWidget.h | 11 +++++--- src/gui/DatabaseWidgetStateSync.cpp | 20 ++++++++++----- src/gui/DatabaseWidgetStateSync.h | 3 ++- 4 files changed, 48 insertions(+), 25 deletions(-) diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 6571668c8..ec51312c1 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -73,15 +73,15 @@ DatabaseWidget::DatabaseWidget(Database* db, QWidget* parent) QLayout* layout = new QHBoxLayout(); mainLayout->addWidget(m_messageWidget); mainLayout->addLayout(layout); - m_splitter = new QSplitter(m_mainWidget); - m_splitter->setChildrenCollapsible(false); + m_mainSplitter = new QSplitter(m_mainWidget); + m_mainSplitter->setChildrenCollapsible(false); m_detailSplitter = new QSplitter(m_mainWidget); m_detailSplitter->setOrientation(Qt::Vertical); m_detailSplitter->setChildrenCollapsible(true); - QWidget* rightHandSideWidget = new QWidget(m_splitter); + QWidget* rightHandSideWidget = new QWidget(m_mainSplitter); - m_groupView = new GroupView(db, m_splitter); + m_groupView = new GroupView(db, m_mainSplitter); m_groupView->setObjectName("groupView"); m_groupView->setContextMenuPolicy(Qt::CustomContextMenu); connect(m_groupView, SIGNAL(customContextMenuRequested(QPoint)), @@ -122,13 +122,13 @@ DatabaseWidget::DatabaseWidget(Database* db, QWidget* parent) setTabOrder(m_entryView, m_groupView); - m_splitter->addWidget(m_groupView); - m_splitter->addWidget(rightHandSideWidget); + m_mainSplitter->addWidget(m_groupView); + m_mainSplitter->addWidget(rightHandSideWidget); - m_splitter->setStretchFactor(0, 30); - m_splitter->setStretchFactor(1, 70); + m_mainSplitter->setStretchFactor(0, 30); + m_mainSplitter->setStretchFactor(1, 70); - layout->addWidget(m_splitter); + layout->addWidget(m_mainSplitter); m_mainWidget->setLayout(mainLayout); m_editEntryWidget = new EditEntryWidget(); @@ -168,7 +168,8 @@ DatabaseWidget::DatabaseWidget(Database* db, QWidget* parent) addWidget(m_keepass1OpenWidget); addWidget(m_unlockDatabaseWidget); - connect(m_splitter, SIGNAL(splitterMoved(int,int)), SIGNAL(splitterSizesChanged())); + connect(m_mainSplitter, SIGNAL(splitterMoved(int,int)), SIGNAL(mainSplitterSizesChanged())); + connect(m_detailSplitter, SIGNAL(splitterMoved(int,int)), SIGNAL(detailSplitterSizesChanged())); connect(m_entryView->header(), SIGNAL(sectionResized(int,int,int)), SIGNAL(entryColumnSizesChanged())); connect(m_groupView, SIGNAL(groupChanged(Group*)), this, SLOT(onGroupChanged(Group*))); connect(m_groupView, SIGNAL(groupChanged(Group*)), SIGNAL(groupChanged())); @@ -251,14 +252,24 @@ bool DatabaseWidget::isEditWidgetModified() const } } -QList<int> DatabaseWidget::splitterSizes() const +QList<int> DatabaseWidget::mainSplitterSizes() const { - return m_splitter->sizes(); + return m_mainSplitter->sizes(); } -void DatabaseWidget::setSplitterSizes(const QList<int>& sizes) +void DatabaseWidget::setMainSplitterSizes(const QList<int>& sizes) { - m_splitter->setSizes(sizes); + m_mainSplitter->setSizes(sizes); +} + +QList<int> DatabaseWidget::detailSplitterSizes() const +{ + return m_detailSplitter->sizes(); +} + +void DatabaseWidget::setDetailSplitterSizes(const QList<int> &sizes) +{ + m_detailSplitter->setSizes(sizes); } QList<int> DatabaseWidget::entryHeaderViewSizes() const diff --git a/src/gui/DatabaseWidget.h b/src/gui/DatabaseWidget.h index 404adb528..215077594 100644 --- a/src/gui/DatabaseWidget.h +++ b/src/gui/DatabaseWidget.h @@ -88,8 +88,10 @@ public: bool isGroupSelected() const; bool isInEditMode() const; bool isEditWidgetModified() const; - QList<int> splitterSizes() const; - void setSplitterSizes(const QList<int>& sizes); + QList<int> mainSplitterSizes() const; + void setMainSplitterSizes(const QList<int>& sizes); + QList<int> detailSplitterSizes() const; + void setDetailSplitterSizes(const QList<int>& sizes); QList<int> entryHeaderViewSizes() const; void setEntryViewHeaderSizes(const QList<int>& sizes); void clearAllWidgets(); @@ -123,7 +125,8 @@ signals: void listModeActivated(); void searchModeAboutToActivate(); void searchModeActivated(); - void splitterSizesChanged(); + void mainSplitterSizesChanged(); + void detailSplitterSizesChanged(); void entryColumnSizesChanged(); void updateSearch(QString text); @@ -214,7 +217,7 @@ private: KeePass1OpenWidget* m_keepass1OpenWidget; UnlockDatabaseWidget* m_unlockDatabaseWidget; UnlockDatabaseDialog* m_unlockDatabaseDialog; - QSplitter* m_splitter; + QSplitter* m_mainSplitter; QSplitter* m_detailSplitter; GroupView* m_groupView; EntryView* m_entryView; diff --git a/src/gui/DatabaseWidgetStateSync.cpp b/src/gui/DatabaseWidgetStateSync.cpp index 1510d8440..9b5492b0d 100644 --- a/src/gui/DatabaseWidgetStateSync.cpp +++ b/src/gui/DatabaseWidgetStateSync.cpp @@ -25,14 +25,16 @@ DatabaseWidgetStateSync::DatabaseWidgetStateSync(QObject* parent) , m_activeDbWidget(nullptr) , m_blockUpdates(false) { - m_splitterSizes = variantToIntList(config()->get("GUI/SplitterState")); + m_mainSplitterSizes = variantToIntList(config()->get("GUI/SplitterState")); + m_detailSplitterSizes = variantToIntList(config()->get("GUI/DetailSplitterState")); m_columnSizesList = variantToIntList(config()->get("GUI/EntryListColumnSizes")); m_columnSizesSearch = variantToIntList(config()->get("GUI/EntrySearchColumnSizes")); } DatabaseWidgetStateSync::~DatabaseWidgetStateSync() { - config()->set("GUI/SplitterState", intListToVariant(m_splitterSizes)); + config()->set("GUI/SplitterState", intListToVariant(m_mainSplitterSizes)); + config()->set("GUI/DetailSplitterState", intListToVariant(m_detailSplitterSizes)); config()->set("GUI/EntryListColumnSizes", intListToVariant(m_columnSizesList)); config()->set("GUI/EntrySearchColumnSizes", intListToVariant(m_columnSizesSearch)); } @@ -48,8 +50,11 @@ void DatabaseWidgetStateSync::setActive(DatabaseWidget* dbWidget) if (m_activeDbWidget) { m_blockUpdates = true; - if (!m_splitterSizes.isEmpty()) - m_activeDbWidget->setSplitterSizes(m_splitterSizes); + if (!m_mainSplitterSizes.isEmpty()) + m_activeDbWidget->setMainSplitterSizes(m_mainSplitterSizes); + + if (!m_detailSplitterSizes.isEmpty()) + m_activeDbWidget->setDetailSplitterSizes(m_detailSplitterSizes); if (m_activeDbWidget->isInSearchMode()) restoreSearchView(); @@ -58,7 +63,9 @@ void DatabaseWidgetStateSync::setActive(DatabaseWidget* dbWidget) m_blockUpdates = false; - connect(m_activeDbWidget, SIGNAL(splitterSizesChanged()), + connect(m_activeDbWidget, SIGNAL(mainSplitterSizesChanged()), + SLOT(updateSplitterSizes())); + connect(m_activeDbWidget, SIGNAL(detailSplitterSizesChanged()), SLOT(updateSplitterSizes())); connect(m_activeDbWidget, SIGNAL(entryColumnSizesChanged()), SLOT(updateColumnSizes())); @@ -102,7 +109,8 @@ void DatabaseWidgetStateSync::updateSplitterSizes() return; } - m_splitterSizes = m_activeDbWidget->splitterSizes(); + m_mainSplitterSizes = m_activeDbWidget->mainSplitterSizes(); + m_detailSplitterSizes = m_activeDbWidget->detailSplitterSizes(); } void DatabaseWidgetStateSync::updateColumnSizes() diff --git a/src/gui/DatabaseWidgetStateSync.h b/src/gui/DatabaseWidgetStateSync.h index 96ecd104a..79a8ded38 100644 --- a/src/gui/DatabaseWidgetStateSync.h +++ b/src/gui/DatabaseWidgetStateSync.h @@ -46,7 +46,8 @@ private: DatabaseWidget* m_activeDbWidget; bool m_blockUpdates; - QList<int> m_splitterSizes; + QList<int> m_mainSplitterSizes; + QList<int> m_detailSplitterSizes; QList<int> m_columnSizesList; QList<int> m_columnSizesSearch; }; From afaa0a3493c78d47fd4aad14c4c3fff5292b5afe Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Thu, 2 Nov 2017 20:47:54 +0200 Subject: [PATCH 093/402] Fix formatting brackets in DatabaseWidgetStateSync::setActive function --- src/gui/DatabaseWidgetStateSync.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/gui/DatabaseWidgetStateSync.cpp b/src/gui/DatabaseWidgetStateSync.cpp index 9b5492b0d..57a3dcf86 100644 --- a/src/gui/DatabaseWidgetStateSync.cpp +++ b/src/gui/DatabaseWidgetStateSync.cpp @@ -50,16 +50,19 @@ void DatabaseWidgetStateSync::setActive(DatabaseWidget* dbWidget) if (m_activeDbWidget) { m_blockUpdates = true; - if (!m_mainSplitterSizes.isEmpty()) + if (!m_mainSplitterSizes.isEmpty()) { m_activeDbWidget->setMainSplitterSizes(m_mainSplitterSizes); + } - if (!m_detailSplitterSizes.isEmpty()) + if (!m_detailSplitterSizes.isEmpty()) { m_activeDbWidget->setDetailSplitterSizes(m_detailSplitterSizes); + } - if (m_activeDbWidget->isInSearchMode()) + if (m_activeDbWidget->isInSearchMode()) { restoreSearchView(); - else + } else { restoreListView(); + } m_blockUpdates = false; From c3c67f18b8752b3304bcd057efac43ade31c89fb Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Sun, 29 Oct 2017 15:04:46 +0100 Subject: [PATCH 094/402] add test for DB creation --- src/gui/DatabaseWidget.cpp | 19 +++++++++++--- src/gui/DatabaseWidget.h | 3 +++ src/gui/csvImport/CsvImportWizard.cpp | 23 ++++------------ src/gui/csvImport/CsvImportWizard.h | 6 ++--- tests/gui/TestGui.cpp | 38 +++++++++++++++++++++++++++ tests/gui/TestGui.h | 1 + 6 files changed, 64 insertions(+), 26 deletions(-) diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index ec51312c1..63420158b 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -63,6 +63,7 @@ DatabaseWidget::DatabaseWidget(Database* db, QWidget* parent) , m_newGroup(nullptr) , m_newEntry(nullptr) , m_newParent(nullptr) + , m_importingCsv(false) { m_mainWidget = new QWidget(this); @@ -137,13 +138,14 @@ DatabaseWidget::DatabaseWidget(Database* db, QWidget* parent) m_editGroupWidget = new EditGroupWidget(); m_editGroupWidget->setObjectName("editGroupWidget"); m_changeMasterKeyWidget = new ChangeMasterKeyWidget(); + m_changeMasterKeyWidget->setObjectName("changeMasterKeyWidget"); m_changeMasterKeyWidget->headlineLabel()->setText(tr("Change master key")); - m_csvImportWizard = new CsvImportWizard(); - m_csvImportWizard->setObjectName("csvImportWizard"); QFont headlineLabelFont = m_changeMasterKeyWidget->headlineLabel()->font(); headlineLabelFont.setBold(true); headlineLabelFont.setPointSize(headlineLabelFont.pointSize() + 2); m_changeMasterKeyWidget->headlineLabel()->setFont(headlineLabelFont); + m_csvImportWizard = new CsvImportWizard(); + m_csvImportWizard->setObjectName("csvImportWizard"); m_databaseSettingsWidget = new DatabaseSettingsWidget(); m_databaseSettingsWidget->setObjectName("databaseSettingsWidget"); m_databaseOpenWidget = new DatabaseOpenWidget(); @@ -782,6 +784,12 @@ void DatabaseWidget::switchToGroupEdit(Group* group, bool create) void DatabaseWidget::updateMasterKey(bool accepted) { + if (m_importingCsv) { + setCurrentWidget(m_csvImportWizard); + m_csvImportWizard->keyFinished(accepted, m_changeMasterKeyWidget->newMasterKey()); + return; + } + if (accepted) { QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); bool result = m_db->setKey(m_changeMasterKeyWidget->newMasterKey()); @@ -915,6 +923,7 @@ void DatabaseWidget::switchToMasterKeyChange(bool disableCancel) m_changeMasterKeyWidget->clearForms(); m_changeMasterKeyWidget->setCancelEnabled(!disableCancel); setCurrentWidget(m_changeMasterKeyWidget); + m_importingCsv = false; } void DatabaseWidget::switchToDatabaseSettings() @@ -941,9 +950,11 @@ void DatabaseWidget::switchToOpenDatabase(const QString& fileName, const QString void DatabaseWidget::switchToImportCsv(const QString& fileName) { updateFilename(fileName); - switchToMasterKeyChange(); m_csvImportWizard->load(fileName, m_db); - setCurrentWidget(m_csvImportWizard); + m_changeMasterKeyWidget->clearForms(); + m_changeMasterKeyWidget->setCancelEnabled(false); + setCurrentWidget(m_changeMasterKeyWidget); + m_importingCsv = true; } void DatabaseWidget::switchToOpenMergeDatabase(const QString& fileName) diff --git a/src/gui/DatabaseWidget.h b/src/gui/DatabaseWidget.h index 215077594..e9428a702 100644 --- a/src/gui/DatabaseWidget.h +++ b/src/gui/DatabaseWidget.h @@ -236,6 +236,9 @@ private: bool m_searchCaseSensitive; bool m_searchLimitGroup; + // CSV import state + bool m_importingCsv; + // Autoreload QFileSystemWatcher m_fileWatcher; QTimer m_fileWatchTimer; diff --git a/src/gui/csvImport/CsvImportWizard.cpp b/src/gui/csvImport/CsvImportWizard.cpp index eb4b21236..e9a8f4984 100644 --- a/src/gui/csvImport/CsvImportWizard.cpp +++ b/src/gui/csvImport/CsvImportWizard.cpp @@ -28,19 +28,9 @@ CsvImportWizard::CsvImportWizard(QWidget *parent) : DialogyWidget(parent) { m_layout = new QGridLayout(this); - m_pages = new QStackedWidget(parent); - m_layout->addWidget(m_pages, 0, 0); + m_layout->addWidget(m_parse = new CsvImportWidget(this), 0, 0); - m_pages->addWidget(key = new ChangeMasterKeyWidget(m_pages)); - m_pages->addWidget(parse = new CsvImportWidget(m_pages)); - key->headlineLabel()->setText(tr("Import CSV file")); - QFont headLineFont = key->headlineLabel()->font(); - headLineFont.setBold(true); - headLineFont.setPointSize(headLineFont.pointSize() + 2); - key->headlineLabel()->setFont(headLineFont); - - connect(key, SIGNAL(editFinished(bool)), this, SLOT(keyFinished(bool))); - connect(parse, SIGNAL(editFinished(bool)), this, SLOT(parseFinished(bool))); + connect(m_parse, SIGNAL(editFinished(bool)), this, SLOT(parseFinished(bool))); } CsvImportWizard::~CsvImportWizard() @@ -49,21 +39,18 @@ CsvImportWizard::~CsvImportWizard() void CsvImportWizard::load(const QString& filename, Database* database) { m_db = database; - parse->load(filename, database); - key->clearForms(); + m_parse->load(filename, database); } -void CsvImportWizard::keyFinished(bool accepted) +void CsvImportWizard::keyFinished(bool accepted, CompositeKey key) { if (!accepted) { emit importFinished(false); return; } - m_pages->setCurrentIndex(m_pages->currentIndex()+1); - QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); - bool result = m_db->setKey(key->newMasterKey()); + bool result = m_db->setKey(key); QApplication::restoreOverrideCursor(); if (!result) { diff --git a/src/gui/csvImport/CsvImportWizard.h b/src/gui/csvImport/CsvImportWizard.h index 317018d99..b6414c0c9 100644 --- a/src/gui/csvImport/CsvImportWizard.h +++ b/src/gui/csvImport/CsvImportWizard.h @@ -38,19 +38,17 @@ public: explicit CsvImportWizard(QWidget *parent = nullptr); ~CsvImportWizard(); void load(const QString& filename, Database *database); + void keyFinished(bool accepted, CompositeKey key); signals: void importFinished(bool accepted); private slots: - void keyFinished(bool accepted); void parseFinished(bool accepted); private: Database* m_db; - CsvImportWidget* parse; - ChangeMasterKeyWidget* key; - QStackedWidget *m_pages; + CsvImportWidget* m_parse; QGridLayout *m_layout; }; diff --git a/tests/gui/TestGui.cpp b/tests/gui/TestGui.cpp index 75ce3cc59..8c066c93e 100644 --- a/tests/gui/TestGui.cpp +++ b/tests/gui/TestGui.cpp @@ -49,6 +49,7 @@ #include "gui/DatabaseTabWidget.h" #include "gui/DatabaseWidget.h" #include "gui/CloneDialog.h" +#include "gui/PasswordEdit.h" #include "gui/TotpDialog.h" #include "gui/SetupTotpDialog.h" #include "gui/FileDialog.h" @@ -119,6 +120,43 @@ void TestGui::cleanup() m_dbWidget = nullptr; } +void TestGui::testCreateDatabase() +{ + fileDialog()->setNextFileName(QString(KEEPASSX_TEST_DATA_DIR).append("/NewTestDatabase.kdbx")); + triggerAction("actionDatabaseNew"); + + DatabaseWidget* dbWidget = m_tabWidget->currentDatabaseWidget(); + + QWidget* databaseNewWidget = dbWidget->findChild<QWidget*>("changeMasterKeyWidget"); + QList<QWidget*> databaseNewWidgets = dbWidget->findChildren<QWidget*>("changeMasterKeyWidget"); + PasswordEdit* editPassword = databaseNewWidget->findChild<PasswordEdit*>("enterPasswordEdit"); + QVERIFY(editPassword->isVisible()); + + QLineEdit* editPasswordRepeat = databaseNewWidget->findChild<QLineEdit*>("repeatPasswordEdit"); + QVERIFY(editPasswordRepeat->isVisible()); + + m_tabWidget->currentDatabaseWidget()->setCurrentWidget(databaseNewWidget); + + QTest::keyClicks(editPassword, "test"); + QTest::keyClicks(editPasswordRepeat, "test"); + QTest::keyClick(editPasswordRepeat, Qt::Key_Enter); + + QTRY_VERIFY(m_tabWidget->tabText(m_tabWidget->currentIndex()).contains("*")); + + m_db = m_tabWidget->currentDatabaseWidget()->database(); + + // there is a new empty db + QCOMPARE(m_db->rootGroup()->children().size(), 0); + + // clean + MessageBox::setNextAnswer(QMessageBox::No); + triggerAction("actionDatabaseClose"); + Tools::wait(100); + + QFile dbfile(QString(KEEPASSX_TEST_DATA_DIR).append("/NewTestDatabase.kdbx")); + dbfile.remove(); +} + void TestGui::testMergeDatabase() { // It is safe to ignore the warning this line produces diff --git a/tests/gui/TestGui.h b/tests/gui/TestGui.h index 904e5f21e..9929b4e7f 100644 --- a/tests/gui/TestGui.h +++ b/tests/gui/TestGui.h @@ -40,6 +40,7 @@ private slots: void cleanup(); void cleanupTestCase(); + void testCreateDatabase(); void testMergeDatabase(); void testAutoreloadDatabase(); void testTabs(); From d6e8e1be6e1371f9dad6b83c1fa698ac77f218af Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Thu, 2 Nov 2017 19:58:45 +0100 Subject: [PATCH 095/402] use QTemporaryFile when creating a database for guitest --- tests/gui/TestGui.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tests/gui/TestGui.cpp b/tests/gui/TestGui.cpp index 8c066c93e..ffa10b7dd 100644 --- a/tests/gui/TestGui.cpp +++ b/tests/gui/TestGui.cpp @@ -122,7 +122,12 @@ void TestGui::cleanup() void TestGui::testCreateDatabase() { - fileDialog()->setNextFileName(QString(KEEPASSX_TEST_DATA_DIR).append("/NewTestDatabase.kdbx")); + QTemporaryFile tmpFile; + QVERIFY(tmpFile.open()); + QString tmpFileName = tmpFile.fileName(); + tmpFile.remove(); + + fileDialog()->setNextFileName(tmpFileName); triggerAction("actionDatabaseNew"); DatabaseWidget* dbWidget = m_tabWidget->currentDatabaseWidget(); @@ -148,13 +153,10 @@ void TestGui::testCreateDatabase() // there is a new empty db QCOMPARE(m_db->rootGroup()->children().size(), 0); - // clean + // close the new database MessageBox::setNextAnswer(QMessageBox::No); triggerAction("actionDatabaseClose"); Tools::wait(100); - - QFile dbfile(QString(KEEPASSX_TEST_DATA_DIR).append("/NewTestDatabase.kdbx")); - dbfile.remove(); } void TestGui::testMergeDatabase() From 78408cf54ba817f0fb666ce69a701ac10fdf41b0 Mon Sep 17 00:00:00 2001 From: Yen Chi Hsuan <yan12125@gmail.com> Date: Mon, 6 Nov 2017 16:05:39 +0800 Subject: [PATCH 096/402] COPYING: remove a duplicated entry Already in line 46~48 :) --- COPYING | 4 ---- 1 file changed, 4 deletions(-) diff --git a/COPYING b/COPYING index e12f4534c..a6bf0cf46 100644 --- a/COPYING +++ b/COPYING @@ -55,10 +55,6 @@ Files: cmake/GenerateProductVersion.cmake Copyright: 2015 halex2005 <akharlov@gmail.com> License: MIT -Files: cmake/CodeCoverage.cmake -Copyright: 2012 - 2015, Lars Bilke -License: BSD-3-clause - Files: share/icons/application/*/apps/keepassxc.png share/icons/application/scalable/apps/keepassxc.svgz share/icons/application/*/apps/keepassxc-dark.png From 4853014a61f01427ec9cb59c46371c5619e74653 Mon Sep 17 00:00:00 2001 From: AsavarTzeth <asavartzeth@gmail.com> Date: Thu, 26 Oct 2017 13:00:50 +0200 Subject: [PATCH 097/402] Fix id and appdata validation failures (#1131) According to the AppStream specification org.keepassxc is not a valid id. The product name is missing. This results in failures if one tries to validate the file and makes it unusable where validation is enforced. Additionally it seems specification don't allow the `<icon>` tag with component type desktop-application. I am not sure this tag is strictly necessary. In any case validation tests require this to be removed. Fixing both of these issues ensure the AppStream appdata is compliant and works anywhere passing validations is a requirement. Also provide some other fixes and improvements to the appdata. Minor validation failures: - Fix missing captions for screenshots (`appstreamcli`) - Fix descriptions cannot start with `<ul>` tag (`appstream-util`) Other enhancements: - Add more URL types, but could not add donation type because "&" is not allowed in the `<url>` tag and using "%26" causes `appstreamcli validate` to fail. - Add `<developer_name>`, which in cases such as KeePassXC is a team name. --- release-tool | 6 +-- share/CMakeLists.txt | 4 +- ...ml => org.keepassxc.KeePassXC.appdata.xml} | 53 ++++++++----------- ...esktop => org.keepassxc.KeePassXC.desktop} | 0 snapcraft.yaml | 4 +- 5 files changed, 29 insertions(+), 38 deletions(-) rename share/linux/{org.keepassxc.appdata.xml => org.keepassxc.KeePassXC.appdata.xml} (89%) rename share/linux/{org.keepassxc.desktop => org.keepassxc.KeePassXC.desktop} (100%) diff --git a/release-tool b/release-tool index 10c6a14c3..42cd3a1d6 100755 --- a/release-tool +++ b/release-tool @@ -264,13 +264,13 @@ checkChangeLog() { } checkAppStreamInfo() { - if [ ! -f share/linux/org.keepassxc.appdata.xml ]; then + if [ ! -f share/linux/org.keepassxc.KeePassXC.appdata.xml ]; then exitError "No AppStream info file found!" fi - grep -qPzo "<release version=\"${RELEASE_NAME}\" date=\"\d{4}-\d{2}-\d{2}\">" share/linux/org.keepassxc.appdata.xml + grep -qPzo "<release version=\"${RELEASE_NAME}\" date=\"\d{4}-\d{2}-\d{2}\">" share/linux/org.keepassxc.KeePassXC.appdata.xml if [ $? -ne 0 ]; then - exitError "'share/linux/org.keepassxc.appdata.xml' has not been updated to the '${RELEASE_NAME}' release!" + exitError "'share/linux/org.keepassxc.KeePassXC.appdata.xml' has not been updated to the '${RELEASE_NAME}' release!" fi } diff --git a/share/CMakeLists.txt b/share/CMakeLists.txt index 6323ece88..81bb26938 100644 --- a/share/CMakeLists.txt +++ b/share/CMakeLists.txt @@ -30,8 +30,8 @@ if(UNIX AND NOT APPLE) install(DIRECTORY icons/application/ DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor FILES_MATCHING PATTERN "application-x-keepassxc.png" PATTERN "application-x-keepassxc.svgz" PATTERN "status" EXCLUDE PATTERN "actions" EXCLUDE PATTERN "categories" EXCLUDE) - install(FILES linux/org.keepassxc.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications) - install(FILES linux/org.keepassxc.appdata.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo) + install(FILES linux/org.keepassxc.KeePassXC.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications) + install(FILES linux/org.keepassxc.KeePassXC.appdata.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo) install(FILES linux/keepassxc.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/mime/packages) endif(UNIX AND NOT APPLE) diff --git a/share/linux/org.keepassxc.appdata.xml b/share/linux/org.keepassxc.KeePassXC.appdata.xml similarity index 89% rename from share/linux/org.keepassxc.appdata.xml rename to share/linux/org.keepassxc.KeePassXC.appdata.xml index 563450a4f..b2a4de6e6 100644 --- a/share/linux/org.keepassxc.appdata.xml +++ b/share/linux/org.keepassxc.KeePassXC.appdata.xml @@ -1,16 +1,15 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- Copyright 2017 KeePassXC Team <team@keepassxc.org> --> <component type="desktop-application"> - <id>org.keepassxc</id> + <id>org.keepassxc.KeePassXC.desktop</id> <name>KeePassXC</name> <metadata_license>CC-BY-3.0</metadata_license> <project_license>GPL-3.0+</project_license> - <icon type="stock">keepassxc</icon> - <url type="homepage">https://keepassxc.org</url> <mimetypes> <mimetype>application/x-keepass2</mimetype> </mimetypes> <summary>Community-driven port of the Windows application “KeePass Password Safe”</summary> + <developer_name>KeePassXC Team</developer_name> <description> <p> KeePassXC is an application for people with extremely high demands on secure @@ -19,56 +18,41 @@ </p> </description> - <launchable type="desktop-id">org.keepassxc.desktop</launchable> + <launchable type="desktop-id">org.keepassxc.KeePassXC.desktop</launchable> + + <url type="homepage">https://keepassxc.org</url> + <url type="bugtracker">https://github.com/keepassxreboot/keepassxc/issues</url> + <url type="faq">https://keepassxc.org/docs#faq</url> + <url type="help">https://keepassxc.org/docs</url> + <url type="translate">https://www.transifex.com/keepassxc/keepassxc</url> <screenshots> <screenshot type="default"> <image>https://keepassxc.org/images/screenshots/linux/screen_001.png</image> + <caption>Create, Import or Open Databases</caption> </screenshot> <screenshot> <image>https://keepassxc.org/images/screenshots/linux/screen_002.png</image> + <caption>Organize with Groups and Entries</caption> </screenshot> <screenshot> <image>https://keepassxc.org/images/screenshots/linux/screen_003.png</image> + <caption>Database Entry</caption> </screenshot> <screenshot> <image>https://keepassxc.org/images/screenshots/linux/screen_004.png</image> - </screenshot> - <screenshot> - <image>https://keepassxc.org/images/screenshots/linux/screen_005.png</image> + <caption>Icon Selection for Entry</caption> </screenshot> <screenshot> <image>https://keepassxc.org/images/screenshots/linux/screen_006.png</image> - </screenshot> - <screenshot> - <image>https://keepassxc.org/images/screenshots/linux/screen_007.png</image> - </screenshot> - <screenshot> - <image>https://keepassxc.org/images/screenshots/linux/screen_008.png</image> - </screenshot> - <screenshot> - <image>https://keepassxc.org/images/screenshots/linux/screen_009.png</image> - </screenshot> - <screenshot> - <image>https://keepassxc.org/images/screenshots/linux/screen_010.png</image> - </screenshot> - <screenshot> - <image>https://keepassxc.org/images/screenshots/linux/screen_011.png</image> - </screenshot> - <screenshot> - <image>https://keepassxc.org/images/screenshots/linux/screen_012.png</image> - </screenshot> - <screenshot> - <image>https://keepassxc.org/images/screenshots/linux/screen_013.png</image> - </screenshot> - <screenshot> - <image>https://keepassxc.org/images/screenshots/linux/screen_014.png</image> + <caption>Password Generator</caption> </screenshot> </screenshots> <releases> <release version="2.2.2" date="2017-10-22"> <description> + <p>Changes included in this release:</p> <ul> <li>Fixed entries with empty URLs being reported to KeePassHTTP clients [#1031]</li> <li>Fixed YubiKey detection and enabled CLI tool for AppImage binary [#1100]</li> @@ -87,6 +71,7 @@ </description> </release><release version="2.2.1" date="2017-10-01"> <description> + <p>Changes included in this release:</p> <ul> <li>Corrected multiple snap issues [#934, #1011]</li> <li>Corrected multiple custom icon issues [#708, #719, #994]</li> @@ -103,6 +88,7 @@ </release> <release version="2.2.0" date="2017-06-23"> <description> + <p>Changes included in this release:</p> <ul> <li>Added YubiKey 2FA integration for unlocking databases [#127]</li> <li>Added TOTP support [#519]</li> @@ -138,6 +124,7 @@ </release> <release version="2.1.4" date="2017-04-09"> <description> + <p>Changes included in this release:</p> <ul> <li>Bumped KeePassHTTP version to 1.8.4.2</li> <li>KeePassHTTP confirmation window comes to foreground [#466]</li> @@ -146,6 +133,7 @@ </release> <release version="2.1.3" date="2017-03-03"> <description> + <p>Changes included in this release:</p> <ul> <li>Fix possible overflow in zxcvbn library [#363]</li> <li>Revert HiDPI setting to avoid problems on laptop screens [#332]</li> @@ -160,6 +148,7 @@ </release> <release version="2.1.2" date="2017-02-17"> <description> + <p>Changes included in this release:</p> <ul> <li>Ask for save location when creating a new database [#302]</li> <li>Remove Libmicrohttpd dependency to clean up the code and ensure better OS X compatibility [#317, #265]</li> @@ -177,6 +166,7 @@ </release> <release version="2.1.1" date="2017-02-06"> <description> + <p>Changes included in this release:</p> <ul> <li>Enabled HTTP plugin build; plugin is disabled by default and limited to localhost [#147]</li> <li>Escape HTML in dialog boxes [#247]</li> @@ -189,6 +179,7 @@ </release> <release version="2.1.0" date="2017-01-22"> <description> + <p>Changes included in this release:</p> <ul> <li>Show unlock dialog when using autotype on a closed database [#10, #89]</li> <li>Show different tray icon when database is locked [#37, #46]</li> diff --git a/share/linux/org.keepassxc.desktop b/share/linux/org.keepassxc.KeePassXC.desktop similarity index 100% rename from share/linux/org.keepassxc.desktop rename to share/linux/org.keepassxc.KeePassXC.desktop diff --git a/snapcraft.yaml b/snapcraft.yaml index 0d69941ac..7903eb038 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -12,7 +12,7 @@ apps: keepassxc: command: desktop-launch keepassxc plugs: [unity7, x11, opengl, gsettings, home, network, network-bind, removable-media, raw-usb] - desktop: usr/share/applications/org.keepassxc.desktop + desktop: usr/share/applications/org.keepassxc.KeePassXC.desktop cli: command: keepassxc-cli plugs: [gsettings, home, removable-media, raw-usb] @@ -42,7 +42,7 @@ parts: - libyubikey-dev - libykpers-1-dev install: | - sed -i 's|Icon=keepassxc|Icon=${SNAP}/usr/share/icons/hicolor/256x256/apps/keepassxc.png|g' $SNAPCRAFT_PART_INSTALL/usr/share/applications/org.keepassxc.desktop + sed -i 's|Icon=keepassxc|Icon=${SNAP}/usr/share/icons/hicolor/256x256/apps/keepassxc.png|g' $SNAPCRAFT_PART_INSTALL/usr/share/applications/org.keepassxc.KeePassXC.desktop after: [desktop-qt5] # Redefine desktop-qt5 stage packages to work with Ubuntu 17.04 From 3427a1aff4d304dcd4c44c843f4dc26209fe48cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20E=2E=20Garc=C3=ADa?= <adolfo.garcia.cr@gmail.com> Date: Sat, 11 Nov 2017 16:25:20 -0600 Subject: [PATCH 098/402] Fix #1156 - Fix multiple activations of updateTotp by different QTimer instance timeouts. - Fix call to updateTotp with invalid, uninitialized state - Fix tooltip description --- src/gui/DetailsWidget.cpp | 41 ++++++++++++++++++++++----------------- src/gui/DetailsWidget.h | 3 +-- src/gui/DetailsWidget.ui | 2 +- 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/gui/DetailsWidget.cpp b/src/gui/DetailsWidget.cpp index 48077bbb2..c8dc058d9 100644 --- a/src/gui/DetailsWidget.cpp +++ b/src/gui/DetailsWidget.cpp @@ -20,6 +20,7 @@ #include "ui_DetailsWidget.h" #include <QDebug> +#include <QTimer> #include "core/Config.h" #include "core/FilePath.h" @@ -33,6 +34,7 @@ DetailsWidget::DetailsWidget(QWidget* parent) , m_locked(false) , m_currentEntry(nullptr) , m_currentGroup(nullptr) + , m_timer(nullptr) , m_attributesWidget(nullptr) , m_autotypeWidget(nullptr) , m_selectedTabEntry(0) @@ -58,7 +60,7 @@ DetailsWidget::~DetailsWidget() { } -void DetailsWidget::getSelectedEntry(Entry* selectedEntry) +void DetailsWidget::getSelectedEntry(Entry* selectedEntry) { if (!selectedEntry) { hideDetails(); @@ -108,7 +110,8 @@ void DetailsWidget::getSelectedEntry(Entry* selectedEntry) m_ui->usernameLabel->setText(m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->username())); if (!config()->get("security/hidepassworddetails").toBool()) { - m_ui->passwordLabel->setText(shortPassword(m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->password()))); + m_ui->passwordLabel->setText( + shortPassword(m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->password()))); m_ui->passwordLabel->setToolTip(m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->password())); } else { m_ui->passwordLabel->setText("****"); @@ -136,14 +139,16 @@ void DetailsWidget::getSelectedEntry(Entry* selectedEntry) } if (m_currentEntry->hasTotp()) { - m_ui->totpButton->show(); - updateTotp(); - m_step = m_currentEntry->totpStep(); + if (nullptr != m_timer) { + m_timer->stop(); + } m_timer = new QTimer(this); connect(m_timer, SIGNAL(timeout()), this, SLOT(updateTotp())); + updateTotp(); m_timer->start(m_step * 10); + m_ui->totpButton->show(); } QString notes = m_currentEntry->notes(); @@ -188,7 +193,7 @@ void DetailsWidget::getSelectedEntry(Entry* selectedEntry) } } -void DetailsWidget::getSelectedGroup(Group* selectedGroup) +void DetailsWidget::getSelectedGroup(Group* selectedGroup) { if (!selectedGroup) { hideDetails(); @@ -212,7 +217,6 @@ void DetailsWidget::getSelectedGroup(Group* selectedGroup) m_ui->tabWidget->setTabEnabled(GroupNotesTab, false); - m_ui->totpButton->hide(); m_ui->totpWidget->hide(); @@ -248,7 +252,7 @@ void DetailsWidget::getSelectedGroup(Group* selectedGroup) autotype = tr("Enabled"); } m_ui->autotypeLabel->setText(autotype); - + TimeInfo groupTime = m_currentGroup->timeInfo(); if (groupTime.expires()) { m_ui->groupExpirationLabel->setText(groupTime.expiryTime().toString(Qt::DefaultLocaleShortDate)); @@ -263,23 +267,23 @@ void DetailsWidget::getSelectedGroup(Group* selectedGroup) void DetailsWidget::updateTotp() { - if (m_locked) { + if (!m_locked) { + QString totpCode = m_currentEntry->totp(); + QString firstHalf = totpCode.left(totpCode.size() / 2); + QString secondHalf = totpCode.right(totpCode.size() / 2); + m_ui->totpLabel->setText(firstHalf + " " + secondHalf); + } else if (nullptr != m_timer) { m_timer->stop(); - return; } - QString totpCode = m_currentEntry->totp(); - QString firstHalf = totpCode.left(totpCode.size()/2); - QString secondHalf = totpCode.right(totpCode.size()/2); - m_ui->totpLabel->setText(firstHalf + " " + secondHalf); } void DetailsWidget::showTotp(bool visible) -{ - if (visible){ +{ + if (visible) { m_ui->totpWidget->show(); } else { m_ui->totpWidget->hide(); - } + } } QString DetailsWidget::shortUrl(QString url) @@ -326,7 +330,8 @@ void DetailsWidget::setDatabaseMode(DatabaseWidget::Mode mode) } } -void DetailsWidget::updateTabIndex(int index) { +void DetailsWidget::updateTabIndex(int index) +{ if (m_ui->stackedWidget->currentIndex() == GroupPreview) { m_selectedTabGroup = index; } else { diff --git a/src/gui/DetailsWidget.h b/src/gui/DetailsWidget.h index 5bc026000..780fe5588 100644 --- a/src/gui/DetailsWidget.h +++ b/src/gui/DetailsWidget.h @@ -18,9 +18,8 @@ #ifndef KEEPASSX_DETAILSWIDGET_H #define KEEPASSX_DETAILSWIDGET_H -#include <QWidget> - #include "gui/DatabaseWidget.h" +#include <QWidget> namespace Ui { class DetailsWidget; diff --git a/src/gui/DetailsWidget.ui b/src/gui/DetailsWidget.ui index 8fbafe349..8cece9a2f 100644 --- a/src/gui/DetailsWidget.ui +++ b/src/gui/DetailsWidget.ui @@ -105,7 +105,7 @@ <item> <widget class="QToolButton" name="closeButton"> <property name="toolTip"> - <string>Generate TOTP Token</string> + <string>Close</string> </property> <property name="text"> <string/> From 2987895370bfe397c461707f99a3ad2d67946246 Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Fri, 20 Oct 2017 15:20:44 +0300 Subject: [PATCH 099/402] Fix usage of LastAttachmentDir in entry attachments --- src/gui/entry/EditEntryWidget.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index 8457c5af3..6ea2088a5 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -727,7 +727,9 @@ void EditEntryWidget::insertAttachment() return; } - m_entryAttachments->set(QFileInfo(filename).fileName(), data); + const QFileInfo fInfo(filename); + config()->set("LastAttachmentDir", fInfo.absolutePath()); + m_entryAttachments->set(fInfo.fileName(), data); } void EditEntryWidget::saveCurrentAttachment() @@ -757,6 +759,7 @@ void EditEntryWidget::saveCurrentAttachment() showMessage(tr("Unable to save the attachment:\n").append(file.errorString()), MessageWidget::Error); return; } + config()->set("LastAttachmentDir", QFileInfo(savePath).absolutePath()); } } From f34b090b427e717610925e928bd0e2209c816e5f Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Sun, 22 Oct 2017 21:15:25 +0300 Subject: [PATCH 100/402] Add support for working with multiple entry attachments at once --- src/core/EntryAttachments.cpp | 30 ++++- src/core/EntryAttachments.h | 3 + src/gui/FileDialog.cpp | 72 +++++++++- src/gui/FileDialog.h | 9 ++ src/gui/entry/EditEntryWidget.cpp | 212 +++++++++++++++++++++--------- src/gui/entry/EditEntryWidget.h | 11 +- 6 files changed, 265 insertions(+), 72 deletions(-) diff --git a/src/core/EntryAttachments.cpp b/src/core/EntryAttachments.cpp index d700ed443..8ff66277d 100644 --- a/src/core/EntryAttachments.cpp +++ b/src/core/EntryAttachments.cpp @@ -17,6 +17,8 @@ #include "EntryAttachments.h" +#include <QStringList> + EntryAttachments::EntryAttachments(QObject* parent) : QObject(parent) { @@ -71,7 +73,8 @@ void EntryAttachments::set(const QString& key, const QByteArray& value) void EntryAttachments::remove(const QString& key) { if (!m_attachments.contains(key)) { - Q_ASSERT(false); + Q_ASSERT_X(false, "EntryAttachments::remove", + qPrintable(QString("Can't find attachment for key %1").arg(key))); return; } @@ -83,6 +86,31 @@ void EntryAttachments::remove(const QString& key) emit modified(); } +void EntryAttachments::remove(const QStringList &keys) +{ + if (keys.isEmpty()) { + return; + } + + bool isModified = false; + for (const QString &key: keys) { + if (!m_attachments.contains(key)) { + Q_ASSERT_X(false, "EntryAttachments::remove", + qPrintable(QString("Can't find attachment for key %1").arg(key))); + continue; + } + + isModified = true; + emit aboutToBeRemoved(key); + m_attachments.remove(key); + emit removed(key); + } + + if (isModified) { + emit modified(); + } +} + void EntryAttachments::clear() { if (m_attachments.isEmpty()) { diff --git a/src/core/EntryAttachments.h b/src/core/EntryAttachments.h index 04c22cb34..8fa7c7179 100644 --- a/src/core/EntryAttachments.h +++ b/src/core/EntryAttachments.h @@ -21,6 +21,8 @@ #include <QMap> #include <QObject> +class QStringList; + class EntryAttachments : public QObject { Q_OBJECT @@ -33,6 +35,7 @@ public: QByteArray value(const QString& key) const; void set(const QString& key, const QByteArray& value); void remove(const QString& key); + void remove(const QStringList& keys); void clear(); void copyDataFrom(const EntryAttachments* other); bool operator==(const EntryAttachments& other) const; diff --git a/src/gui/FileDialog.cpp b/src/gui/FileDialog.cpp index e293db2ba..cf792e160 100644 --- a/src/gui/FileDialog.cpp +++ b/src/gui/FileDialog.cpp @@ -27,7 +27,7 @@ QString FileDialog::getOpenFileName(QWidget* parent, const QString& caption, QSt { if (!m_nextFileName.isEmpty()) { QString result = m_nextFileName; - m_nextFileName = ""; + m_nextFileName.clear(); return result; } else { @@ -51,13 +51,43 @@ QString FileDialog::getOpenFileName(QWidget* parent, const QString& caption, QSt } } +QStringList FileDialog::getOpenFileNames(QWidget *parent, const QString &caption, QString dir, + const QString &filter, QString *selectedFilter, + QFileDialog::Options options) +{ + if (!m_nextFileNames.isEmpty()) { + QStringList results = m_nextFileNames; + m_nextFileNames.clear(); + return results; + } + else { + if (dir.isEmpty()) { + dir = config()->get("LastDir").toString(); + } + + QStringList results = QFileDialog::getOpenFileNames(parent, caption, dir, filter, + selectedFilter, options); + + // on Mac OS X the focus is lost after closing the native dialog + if (parent) { + parent->activateWindow(); + } + + if (!results.isEmpty()) { + config()->set("LastDir", QFileInfo(results[0]).absolutePath()); + } + + return results; + } +} + QString FileDialog::getSaveFileName(QWidget* parent, const QString& caption, QString dir, const QString& filter, QString* selectedFilter, QFileDialog::Options options, const QString& defaultExtension) { if (!m_nextFileName.isEmpty()) { QString result = m_nextFileName; - m_nextFileName = ""; + m_nextFileName.clear(); return result; } else { @@ -103,11 +133,49 @@ QString FileDialog::getSaveFileName(QWidget* parent, const QString& caption, QSt } } +QString FileDialog::getExistingDirectory(QWidget *parent, const QString &caption, QString dir, + QFileDialog::Options options) +{ + if (!m_nextDirName.isEmpty()) { + QString result = m_nextDirName; + m_nextDirName.clear(); + return result; + } + else { + if (dir.isEmpty()) { + dir = config()->get("LastDir").toString(); + } + + dir = QFileDialog::getExistingDirectory(parent, caption, dir, options); + + // on Mac OS X the focus is lost after closing the native dialog + if (parent) { + parent->activateWindow(); + } + + if (!dir.isEmpty()) { + config()->set("LastDir", QFileInfo(dir).absolutePath()); + } + + return dir; + } +} + void FileDialog::setNextFileName(const QString& fileName) { m_nextFileName = fileName; } +void FileDialog::setNextFileNames(const QStringList &fileNames) +{ + m_nextFileNames = fileNames; +} + +void FileDialog::setNextDirName(const QString &dirName) +{ + m_nextDirName = dirName; +} + FileDialog::FileDialog() { } diff --git a/src/gui/FileDialog.h b/src/gui/FileDialog.h index 9f8fbb547..92b58a584 100644 --- a/src/gui/FileDialog.h +++ b/src/gui/FileDialog.h @@ -26,22 +26,31 @@ public: QString getOpenFileName(QWidget* parent = nullptr, const QString& caption = QString(), QString dir = QString(), const QString& filter = QString(), QString* selectedFilter = nullptr, QFileDialog::Options options = 0); + QStringList getOpenFileNames(QWidget* parent = nullptr, const QString& caption = QString(), + QString dir = QString(), const QString& filter = QString(), + QString* selectedFilter = nullptr, QFileDialog::Options options = 0); QString getSaveFileName(QWidget* parent = nullptr, const QString& caption = QString(), QString dir = QString(), const QString& filter = QString(), QString* selectedFilter = nullptr, QFileDialog::Options options = 0, const QString& defaultExtension = QString()); + QString getExistingDirectory(QWidget* parent = nullptr, const QString& caption = QString(), + QString dir = QString(), QFileDialog::Options options = QFileDialog::ShowDirsOnly); /** * Sets the result of the next get* method call. * Use only for testing. */ void setNextFileName(const QString& fileName); + void setNextFileNames(const QStringList& fileNames); + void setNextDirName(const QString& dirName); static FileDialog* instance(); private: FileDialog(); QString m_nextFileName; + QStringList m_nextFileNames; + QString m_nextDirName; static FileDialog* m_instance; diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index 6ea2088a5..0dc555a0a 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -122,13 +122,14 @@ void EditEntryWidget::setupAdvanced() m_attachmentsModel->setEntryAttachments(m_entryAttachments); m_advancedUi->attachmentsView->setModel(m_attachmentsModel); + m_advancedUi->attachmentsView->setSelectionMode(QAbstractItemView::ExtendedSelection); connect(m_advancedUi->attachmentsView->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), SLOT(updateAttachmentButtonsEnabled(QModelIndex))); connect(m_advancedUi->attachmentsView, SIGNAL(doubleClicked(QModelIndex)), SLOT(openAttachment(QModelIndex))); - connect(m_advancedUi->saveAttachmentButton, SIGNAL(clicked()), SLOT(saveCurrentAttachment())); - connect(m_advancedUi->openAttachmentButton, SIGNAL(clicked()), SLOT(openCurrentAttachment())); - connect(m_advancedUi->addAttachmentButton, SIGNAL(clicked()), SLOT(insertAttachment())); - connect(m_advancedUi->removeAttachmentButton, SIGNAL(clicked()), SLOT(removeCurrentAttachment())); + connect(m_advancedUi->saveAttachmentButton, SIGNAL(clicked()), SLOT(saveSelectedAttachments())); + connect(m_advancedUi->openAttachmentButton, SIGNAL(clicked()), SLOT(openSelectedAttachments())); + connect(m_advancedUi->addAttachmentButton, SIGNAL(clicked()), SLOT(insertAttachments())); + connect(m_advancedUi->removeAttachmentButton, SIGNAL(clicked()), SLOT(removeSelectedAttachments())); m_attributesModel->setEntryAttributes(m_entryAttributes); m_advancedUi->attributesView->setModel(m_attributesModel); @@ -672,6 +673,32 @@ void EditEntryWidget::displayAttribute(QModelIndex index, bool showProtected) m_advancedUi->protectAttributeButton->blockSignals(false); } +bool EditEntryWidget::openAttachment(const QModelIndex &index, QString *errorMessage) +{ + const QString filename = m_attachmentsModel->keyByIndex(index); + const QByteArray attachmentData = m_entryAttachments->value(filename); + + // tmp file will be removed once the database (or the application) has been closed + const QString tmpFileTemplate = QDir::temp().absoluteFilePath(QString("XXXXXX.").append(filename)); + QTemporaryFile* tmpFile = new QTemporaryFile(tmpFileTemplate, this); + + const bool saveOk = tmpFile->open() + && tmpFile->write(attachmentData) == attachmentData.size() + && tmpFile->flush(); + if (!saveOk) { + if (errorMessage) { + *errorMessage = tr("Unable to save the attachment:\n").append(tmpFile->errorString()); + } + delete tmpFile; + return false; + } + + tmpFile->close(); + QDesktopServices::openUrl(QUrl::fromLocalFile(tmpFile->fileName())); + + return true; +} + void EditEntryWidget::protectCurrentAttribute(bool state) { QModelIndex index = m_advancedUi->attributesView->currentIndex(); @@ -702,7 +729,7 @@ void EditEntryWidget::revealCurrentAttribute() } } -void EditEntryWidget::insertAttachment() +void EditEntryWidget::insertAttachments() { Q_ASSERT(!m_history); @@ -710,56 +737,115 @@ void EditEntryWidget::insertAttachment() if (defaultDir.isEmpty() || !QDir(defaultDir).exists()) { defaultDir = QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation).value(0); } - QString filename = fileDialog()->getOpenFileName(this, tr("Select file"), defaultDir); - if (filename.isEmpty() || !QFile::exists(filename)) { + + const QStringList filenames = fileDialog()->getOpenFileNames(this, tr("Select files"), defaultDir); + if (filenames.isEmpty()) { return; } - QFile file(filename); - if (!file.open(QIODevice::ReadOnly)) { - showMessage(tr("Unable to open file").append(":\n").append(file.errorString()), MessageWidget::Error); - return; + config()->set("LastAttachmentDir", QFileInfo(filenames.first()).absolutePath()); + + QStringList errors; + for (const QString &filename: filenames) { + const QFileInfo fInfo(filename); + QFile file(filename); + QByteArray data; + const bool readOk = file.open(QIODevice::ReadOnly) && Tools::readAllFromDevice(&file, data); + if (!readOk) { + errors.append(QString("%1 - %2").arg(fInfo.fileName(), file.errorString())); + continue; + } + + m_entryAttachments->set(fInfo.fileName(), data); } - QByteArray data; - if (!Tools::readAllFromDevice(&file, data)) { - showMessage(tr("Unable to open file").append(":\n").append(file.errorString()), MessageWidget::Error); - return; + if (!errors.isEmpty()) { + showMessage(tr("Unable to open files:\n%1").arg(errors.join('\n')), MessageWidget::Error); } - - const QFileInfo fInfo(filename); - config()->set("LastAttachmentDir", fInfo.absolutePath()); - m_entryAttachments->set(fInfo.fileName(), data); } -void EditEntryWidget::saveCurrentAttachment() +void EditEntryWidget::saveSelectedAttachment() { - QModelIndex index = m_advancedUi->attachmentsView->currentIndex(); + const QModelIndex index = m_advancedUi->attachmentsView->currentIndex(); if (!index.isValid()) { return; } - QString filename = m_attachmentsModel->keyByIndex(index); + const QString filename = m_attachmentsModel->keyByIndex(index); QString defaultDirName = config()->get("LastAttachmentDir").toString(); if (defaultDirName.isEmpty() || !QDir(defaultDirName).exists()) { defaultDirName = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); } - QDir dir(defaultDirName); - QString savePath = fileDialog()->getSaveFileName(this, tr("Save attachment"), - dir.filePath(filename)); + + const QString savePath = fileDialog()->getSaveFileName(this, tr("Save attachment"), + QDir(defaultDirName).filePath(filename)); if (!savePath.isEmpty()) { - QByteArray attachmentData = m_entryAttachments->value(filename); + config()->set("LastAttachmentDir", QFileInfo(savePath).absolutePath()); QFile file(savePath); - if (!file.open(QIODevice::WriteOnly)) { + const QByteArray attachmentData = m_entryAttachments->value(filename); + const bool saveOk = file.open(QIODevice::WriteOnly) && file.write(attachmentData) == attachmentData.size(); + if (!saveOk) { showMessage(tr("Unable to save the attachment:\n").append(file.errorString()), MessageWidget::Error); + } + } +} + +void EditEntryWidget::saveSelectedAttachments() +{ + const QModelIndexList indexes = m_advancedUi->attachmentsView->selectionModel()->selectedIndexes(); + if (indexes.isEmpty()) { + return; + } else if (indexes.count() == 1) { + saveSelectedAttachment(); + return; + } + + QString defaultDirName = config()->get("LastAttachmentDir").toString(); + if (defaultDirName.isEmpty() || !QDir(defaultDirName).exists()) { + defaultDirName = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); + } + + const QString savePath = fileDialog()->getExistingDirectory(this, tr("Save attachments"), defaultDirName); + if (savePath.isEmpty()) { + return; + } + + QDir saveDir(savePath); + if (!saveDir.exists()) { + if (saveDir.mkpath(saveDir.absolutePath())) { + showMessage(tr("Unable to create the directory:\n").append(saveDir.absolutePath()), MessageWidget::Error); return; } - if (file.write(attachmentData) != attachmentData.size()) { - showMessage(tr("Unable to save the attachment:\n").append(file.errorString()), MessageWidget::Error); - return; + } + config()->set("LastAttachmentDir", QFileInfo(saveDir.absolutePath()).absolutePath()); + + QStringList errors; + for (const QModelIndex &index: indexes) { + const QString filename = m_attachmentsModel->keyByIndex(index); + const QString attachmentPath = saveDir.absoluteFilePath(filename); + + if (QFileInfo::exists(attachmentPath)) { + const QString question(tr("Are you sure you want to overwrite existing file \"%1\" with the attachment?")); + auto ans = MessageBox::question(this, tr("Confirm overwrite"), question.arg(filename), + QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel); + if (ans == QMessageBox::No) { + continue; + } else if (ans == QMessageBox::Cancel) { + return; + } } - config()->set("LastAttachmentDir", QFileInfo(savePath).absolutePath()); + + QFile file(attachmentPath); + const QByteArray attachmentData = m_entryAttachments->value(filename); + const bool saveOk = file.open(QIODevice::WriteOnly) && file.write(attachmentData) == attachmentData.size(); + if (!saveOk) { + errors.append(QString("%1 - %2").arg(filename, file.errorString())); + } + } + + if (!errors.isEmpty()) { + showMessage(tr("Unable to save the attachments:\n").append(errors.join('\n')), MessageWidget::Error); } } @@ -770,55 +856,51 @@ void EditEntryWidget::openAttachment(const QModelIndex& index) return; } - QString filename = m_attachmentsModel->keyByIndex(index); - QByteArray attachmentData = m_entryAttachments->value(filename); - - // tmp file will be removed once the database (or the application) has been closed - QString tmpFileTemplate = QDir::temp().absoluteFilePath(QString("XXXXXX.").append(filename)); - QTemporaryFile* file = new QTemporaryFile(tmpFileTemplate, this); - - if (!file->open()) { - showMessage(tr("Unable to save the attachment:\n").append(file->errorString()), MessageWidget::Error); - return; + QString errorMessage; + if (!openAttachment(index, &errorMessage)) { + showMessage(errorMessage, MessageWidget::Error); } - - if (file->write(attachmentData) != attachmentData.size()) { - showMessage(tr("Unable to save the attachment:\n").append(file->errorString()), MessageWidget::Error); - return; - } - - if (!file->flush()) { - showMessage(tr("Unable to save the attachment:\n").append(file->errorString()), MessageWidget::Error); - return; - } - - file->close(); - - QDesktopServices::openUrl(QUrl::fromLocalFile(file->fileName())); } -void EditEntryWidget::openCurrentAttachment() +void EditEntryWidget::openSelectedAttachments() { - QModelIndex index = m_advancedUi->attachmentsView->currentIndex(); + const QModelIndexList indexes = m_advancedUi->attachmentsView->selectionModel()->selectedIndexes(); + if (indexes.isEmpty()) { + return; + } - openAttachment(index); + QStringList errors; + for (const QModelIndex &index: indexes) { + QString errorMessage; + if (!openAttachment(index, &errorMessage)) { + const QString filename = m_attachmentsModel->keyByIndex(index); + errors.append(QString("%1 - %2").arg(filename, errorMessage)); + }; + } + + if (!errors.isEmpty()) { + showMessage(tr("Unable to open the attachments:\n").append(errors.join('\n')), MessageWidget::Error); + } } -void EditEntryWidget::removeCurrentAttachment() +void EditEntryWidget::removeSelectedAttachments() { Q_ASSERT(!m_history); - QModelIndex index = m_advancedUi->attachmentsView->currentIndex(); - if (!index.isValid()) { + const QModelIndexList indexes = m_advancedUi->attachmentsView->selectionModel()->selectedIndexes(); + if (indexes.isEmpty()) { return; } + const QString question = tr("Are you sure you want to remove %n attachments?", "", indexes.count()); QMessageBox::StandardButton ans = MessageBox::question(this, tr("Confirm Remove"), - tr("Are you sure you want to remove this attachment?"), - QMessageBox::Yes | QMessageBox::No); + question, QMessageBox::Yes | QMessageBox::No); if (ans == QMessageBox::Yes) { - QString key = m_attachmentsModel->keyByIndex(index); - m_entryAttachments->remove(key); + QStringList keys; + for (const QModelIndex &index: indexes) { + keys.append(m_attachmentsModel->keyByIndex(index)); + } + m_entryAttachments->remove(keys); } } diff --git a/src/gui/entry/EditEntryWidget.h b/src/gui/entry/EditEntryWidget.h index 74da2c46f..1f1b55529 100644 --- a/src/gui/entry/EditEntryWidget.h +++ b/src/gui/entry/EditEntryWidget.h @@ -80,11 +80,12 @@ private slots: void updateCurrentAttribute(); void protectCurrentAttribute(bool state); void revealCurrentAttribute(); - void insertAttachment(); - void saveCurrentAttachment(); + void insertAttachments(); + void saveSelectedAttachment(); + void saveSelectedAttachments(); void openAttachment(const QModelIndex& index); - void openCurrentAttachment(); - void removeCurrentAttachment(); + void openSelectedAttachments(); + void removeSelectedAttachments(); void updateAutoTypeEnabled(); void insertAutoTypeAssoc(); void removeAutoTypeAssoc(); @@ -117,6 +118,8 @@ private: void displayAttribute(QModelIndex index, bool showProtected); + bool openAttachment(const QModelIndex& index, QString *errorMessage); + Entry* m_entry; Database* m_database; From c9895dd5c71261430e77b77ad9e86ba6255e35ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20E=2E=20Garc=C3=ADa?= <adolfo.garcia.cr@gmail.com> Date: Tue, 7 Nov 2017 00:08:01 -0600 Subject: [PATCH 101/402] Improve Base32.cpp --- src/core/Base32.cpp | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/core/Base32.cpp b/src/core/Base32.cpp index 13228a37f..78448ffb5 100644 --- a/src/core/Base32.cpp +++ b/src/core/Base32.cpp @@ -52,8 +52,9 @@ QVariant Base32::decode(const QByteArray& encodedData) int nPads = 0; for (int i = -1; i > -7; --i) { - if ('=' == encodedData[encodedData.size() + i]) + if ('=' == encodedData[encodedData.size() + i]) { ++nPads; + } } int specialOffset; @@ -95,11 +96,12 @@ QVariant Base32::decode(const QByteArray& encodedData) int nQuantumBytes = 5; for (int n = 0; n < 8; ++n) { - quint8 ch = static_cast<quint8>(encodedData[i++]); + auto ch = static_cast<quint8>(encodedData[i++]); if ((ASCII_A <= ch && ch <= ASCII_Z) || (ASCII_a <= ch && ch <= ASCII_z)) { ch -= ASCII_A; - if (ch >= ALPH_POS_2) + if (ch >= ALPH_POS_2) { ch -= ASCII_a - ASCII_A; + } } else { if (ASCII_2 <= ch && ch <= ASCII_7) { ch -= ASCII_2; @@ -126,8 +128,8 @@ QVariant Base32::decode(const QByteArray& encodedData) const int offset = (nQuantumBytes - 1) * 8; quint64 mask = quint64(0xFF) << offset; for (int n = offset; n >= 0 && o < nBytes; n -= 8) { - data[o++] = static_cast<char>((quantum & mask) >> n); - mask >>= 8; + data[o++] = static_cast<char>((quantum & mask) >> n); + mask >>= 8; } } @@ -147,7 +149,7 @@ QByteArray Base32::encode(const QByteArray& data) const int rBits = nBits % 40; // in {0, 8, 16, 24, 32} const int nQuanta = nBits / 40 + (rBits > 0 ? 1 : 0); const int nBytes = nQuanta * 8; - QByteArray encodedData(nQuanta * 8, Qt::Uninitialized); + QByteArray encodedData(nBytes, Qt::Uninitialized); int i = 0; int o = 0; @@ -166,6 +168,7 @@ QByteArray Base32::encode(const QByteArray& data) int index; for (n = 35; n >= 0; n -= 5) { index = (quantum & mask) >> n; + Q_ASSERT(0 <= index && index <= 31); encodedData[o++] = alphabet[index]; mask >>= 5; } @@ -173,10 +176,11 @@ QByteArray Base32::encode(const QByteArray& data) // < 40-bits of input at final input group if (i < data.size()) { - Q_ASSERT(rBits > 0); + Q_ASSERT(8 <= rBits && rBits <= 32); quantum = 0; - for (n = rBits - 8; n >= 0; n -= 8) + for (n = rBits - 8; n >= 0; n -= 8) { quantum |= static_cast<quint64>(data[i++]) << n; + } switch (rBits) { case 8: // expand to 10 bits @@ -195,7 +199,7 @@ QByteArray Base32::encode(const QByteArray& data) n = 20; break; default: // expand to 35 bits - Q_ASSERT(rBits == 32); + Q_ASSERT(32 == rBits); quantum <<= 3; mask = MASK_35BIT; n = 30; @@ -203,6 +207,7 @@ QByteArray Base32::encode(const QByteArray& data) while (n >= 0) { int index = (quantum & mask) >> n; + Q_ASSERT(0 <= index && index <= 31); encodedData[o++] = alphabet[index]; mask >>= 5; n -= 5; From cc6be754f724fe6efdc6099da785100c3c825cd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20E=2E=20Garc=C3=ADa?= <adolfo.garcia.cr@gmail.com> Date: Tue, 7 Nov 2017 00:10:38 -0600 Subject: [PATCH 102/402] Remove deprecated Optional.h --- src/core/Optional.h | 93 --------------------------------------------- 1 file changed, 93 deletions(-) delete mode 100644 src/core/Optional.h diff --git a/src/core/Optional.h b/src/core/Optional.h deleted file mode 100644 index fb800198a..000000000 --- a/src/core/Optional.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 or (at your option) - * version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef OPTIONAL_H -#define OPTIONAL_H - -/* - * This utility class is for providing basic support for an option type. - * It can be replaced by std::optional (C++17) or - * std::experimental::optional (C++11) when they become fully supported - * by all the compilers. - */ - -template <typename T> -class Optional -{ -public: - - // None - Optional() : - m_hasValue(false), - m_value() - { }; - - // Some T - Optional(const T& value) : - m_hasValue(true), - m_value(value) - { }; - - // Copy - Optional(const Optional& other) : - m_hasValue(other.m_hasValue), - m_value(other.m_value) - { }; - - const Optional& operator=(const Optional& other) - { - m_hasValue = other.m_hasValue; - m_value = other.m_value; - return *this; - } - - bool operator==(const Optional& other) const - { - if(m_hasValue) - return other.m_hasValue && m_value == other.m_value; - else - return !other.m_hasValue; - } - - bool operator!=(const Optional& other) const - { - return !(*this == other); - } - - bool hasValue() const - { - return m_hasValue; - } - - T valueOr(const T& other) const - { - return m_hasValue ? m_value : other; - } - - Optional static makeOptional(const T& value) - { - return Optional(value); - } - - -private: - - bool m_hasValue; - T m_value; -}; - -#endif // OPTIONAL_H From a81a5fa31bb50b00b7091086013952fb0332fca1 Mon Sep 17 00:00:00 2001 From: Toni Spets <toni.spets@iki.fi> Date: Sun, 29 Oct 2017 17:07:01 +0200 Subject: [PATCH 103/402] SymmetricCipher: Support CTR mode Includes AES-256-CTR non-stream tests --- src/crypto/SymmetricCipher.h | 1 + src/crypto/SymmetricCipherGcrypt.cpp | 11 +++++++- tests/TestSymmetricCipher.cpp | 40 ++++++++++++++++++++++++++++ tests/TestSymmetricCipher.h | 2 ++ 4 files changed, 53 insertions(+), 1 deletion(-) diff --git a/src/crypto/SymmetricCipher.h b/src/crypto/SymmetricCipher.h index b85c58b7c..4f1d50c12 100644 --- a/src/crypto/SymmetricCipher.h +++ b/src/crypto/SymmetricCipher.h @@ -38,6 +38,7 @@ public: enum Mode { Cbc, + Ctr, Ecb, Stream }; diff --git a/src/crypto/SymmetricCipherGcrypt.cpp b/src/crypto/SymmetricCipherGcrypt.cpp index e600a7edb..c88dbd8c2 100644 --- a/src/crypto/SymmetricCipherGcrypt.cpp +++ b/src/crypto/SymmetricCipherGcrypt.cpp @@ -62,6 +62,9 @@ int SymmetricCipherGcrypt::gcryptMode(SymmetricCipher::Mode mode) case SymmetricCipher::Cbc: return GCRY_CIPHER_MODE_CBC; + case SymmetricCipher::Ctr: + return GCRY_CIPHER_MODE_CTR; + case SymmetricCipher::Stream: return GCRY_CIPHER_MODE_STREAM; @@ -119,7 +122,13 @@ bool SymmetricCipherGcrypt::setKey(const QByteArray& key) bool SymmetricCipherGcrypt::setIv(const QByteArray& iv) { m_iv = iv; - gcry_error_t error = gcry_cipher_setiv(m_ctx, m_iv.constData(), m_iv.size()); + gcry_error_t error; + + if (m_mode == GCRY_CIPHER_MODE_CTR) { + error = gcry_cipher_setctr(m_ctx, m_iv.constData(), m_iv.size()); + } else { + error = gcry_cipher_setiv(m_ctx, m_iv.constData(), m_iv.size()); + } if (error != 0) { setErrorString(error); diff --git a/tests/TestSymmetricCipher.cpp b/tests/TestSymmetricCipher.cpp index 4f78693d6..74f720a7f 100644 --- a/tests/TestSymmetricCipher.cpp +++ b/tests/TestSymmetricCipher.cpp @@ -124,6 +124,46 @@ void TestSymmetricCipher::testAes256CbcDecryption() plainText); } +void TestSymmetricCipher::testAes256CtrEncryption() +{ + // http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf + + QByteArray key = QByteArray::fromHex("603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4"); + QByteArray ctr = QByteArray::fromHex("f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"); + QByteArray plainText = QByteArray::fromHex("6bc1bee22e409f96e93d7e117393172a"); + plainText.append(QByteArray::fromHex("ae2d8a571e03ac9c9eb76fac45af8e51")); + QByteArray cipherText = QByteArray::fromHex("601ec313775789a5b7a7f504bbf3d228"); + cipherText.append(QByteArray::fromHex("f443e3ca4d62b59aca84e990cacaf5c5")); + bool ok; + + SymmetricCipher cipher(SymmetricCipher::Aes256, SymmetricCipher::Ctr, SymmetricCipher::Encrypt); + QVERIFY(cipher.init(key, ctr)); + QCOMPARE(cipher.blockSize(), 16); + + QCOMPARE(cipher.process(plainText, &ok), + cipherText); + QVERIFY(ok); +} + +void TestSymmetricCipher::testAes256CtrDecryption() +{ + QByteArray key = QByteArray::fromHex("603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4"); + QByteArray ctr = QByteArray::fromHex("f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"); + QByteArray cipherText = QByteArray::fromHex("601ec313775789a5b7a7f504bbf3d228"); + cipherText.append(QByteArray::fromHex("f443e3ca4d62b59aca84e990cacaf5c5")); + QByteArray plainText = QByteArray::fromHex("6bc1bee22e409f96e93d7e117393172a"); + plainText.append(QByteArray::fromHex("ae2d8a571e03ac9c9eb76fac45af8e51")); + bool ok; + + SymmetricCipher cipher(SymmetricCipher::Aes256, SymmetricCipher::Ctr, SymmetricCipher::Decrypt); + QVERIFY(cipher.init(key, ctr)); + QCOMPARE(cipher.blockSize(), 16); + + QCOMPARE(cipher.process(cipherText, &ok), + plainText); + QVERIFY(ok); +} + void TestSymmetricCipher::testTwofish256CbcEncryption() { // NIST MCT Known-Answer Tests (cbc_e_m.txt) diff --git a/tests/TestSymmetricCipher.h b/tests/TestSymmetricCipher.h index 009989500..cad13841a 100644 --- a/tests/TestSymmetricCipher.h +++ b/tests/TestSymmetricCipher.h @@ -29,6 +29,8 @@ private slots: void initTestCase(); void testAes256CbcEncryption(); void testAes256CbcDecryption(); + void testAes256CtrEncryption(); + void testAes256CtrDecryption(); void testTwofish256CbcEncryption(); void testTwofish256CbcDecryption(); void testSalsa20(); From 248ae9d4ba40975558c928ae0d28fdd78c16d26d Mon Sep 17 00:00:00 2001 From: Toni Spets <toni.spets@iki.fi> Date: Sun, 29 Oct 2017 17:07:56 +0200 Subject: [PATCH 104/402] SymmetricCipher: Add keySize(), don't rely on state for sizes This additionally makes keySize() and blockSize() work before setting the key and IV. Required for SSH agent decryption. --- src/crypto/SymmetricCipher.cpp | 5 +++++ src/crypto/SymmetricCipher.h | 1 + src/crypto/SymmetricCipherBackend.h | 1 + src/crypto/SymmetricCipherGcrypt.cpp | 30 ++++++++++++++++++---------- src/crypto/SymmetricCipherGcrypt.h | 2 +- 5 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/crypto/SymmetricCipher.cpp b/src/crypto/SymmetricCipher.cpp index 98d481969..016103b27 100644 --- a/src/crypto/SymmetricCipher.cpp +++ b/src/crypto/SymmetricCipher.cpp @@ -74,6 +74,11 @@ bool SymmetricCipher::reset() return m_backend->reset(); } +int SymmetricCipher::keySize() const +{ + return m_backend->keySize(); +} + int SymmetricCipher::blockSize() const { return m_backend->blockSize(); diff --git a/src/crypto/SymmetricCipher.h b/src/crypto/SymmetricCipher.h index 4f1d50c12..81e13f385 100644 --- a/src/crypto/SymmetricCipher.h +++ b/src/crypto/SymmetricCipher.h @@ -70,6 +70,7 @@ public: } bool reset(); + int keySize() const; int blockSize() const; QString errorString() const; diff --git a/src/crypto/SymmetricCipherBackend.h b/src/crypto/SymmetricCipherBackend.h index 78ec60c60..dd493d2df 100644 --- a/src/crypto/SymmetricCipherBackend.h +++ b/src/crypto/SymmetricCipherBackend.h @@ -33,6 +33,7 @@ public: Q_REQUIRED_RESULT virtual bool processInPlace(QByteArray& data, quint64 rounds) = 0; virtual bool reset() = 0; + virtual int keySize() const = 0; virtual int blockSize() const = 0; virtual QString errorString() const = 0; diff --git a/src/crypto/SymmetricCipherGcrypt.cpp b/src/crypto/SymmetricCipherGcrypt.cpp index c88dbd8c2..ed031c00f 100644 --- a/src/crypto/SymmetricCipherGcrypt.cpp +++ b/src/crypto/SymmetricCipherGcrypt.cpp @@ -26,7 +26,6 @@ SymmetricCipherGcrypt::SymmetricCipherGcrypt(SymmetricCipher::Algorithm algo, Sy , m_algo(gcryptAlgo(algo)) , m_mode(gcryptMode(mode)) , m_direction(direction) - , m_blockSize(-1) { } @@ -95,14 +94,6 @@ bool SymmetricCipherGcrypt::init() return false; } - size_t blockSizeT; - error = gcry_cipher_algo_info(m_algo, GCRYCTL_GET_BLKLEN, nullptr, &blockSizeT); - if (error != 0) { - setErrorString(error); - return false; - } - - m_blockSize = blockSizeT; return true; } @@ -237,9 +228,28 @@ bool SymmetricCipherGcrypt::reset() return true; } +int SymmetricCipherGcrypt::keySize() const +{ + gcry_error_t error; + size_t keySizeT; + + error = gcry_cipher_algo_info(m_algo, GCRYCTL_GET_KEYLEN, nullptr, &keySizeT); + if (error != 0) + return -1; + + return keySizeT; +} + int SymmetricCipherGcrypt::blockSize() const { - return m_blockSize; + gcry_error_t error; + size_t blockSizeT; + + error = gcry_cipher_algo_info(m_algo, GCRYCTL_GET_BLKLEN, nullptr, &blockSizeT); + if (error != 0) + return -1; + + return blockSizeT; } QString SymmetricCipherGcrypt::errorString() const diff --git a/src/crypto/SymmetricCipherGcrypt.h b/src/crypto/SymmetricCipherGcrypt.h index d3ad8d15b..108bc14e4 100644 --- a/src/crypto/SymmetricCipherGcrypt.h +++ b/src/crypto/SymmetricCipherGcrypt.h @@ -39,6 +39,7 @@ public: Q_REQUIRED_RESULT bool processInPlace(QByteArray& data, quint64 rounds); bool reset(); + int keySize() const; int blockSize() const; QString errorString() const; @@ -54,7 +55,6 @@ private: const SymmetricCipher::Direction m_direction; QByteArray m_key; QByteArray m_iv; - int m_blockSize; QString m_errorString; }; From 4840c2c64f1d6616af887457a0ec5a423d889db0 Mon Sep 17 00:00:00 2001 From: Toni Spets <toni.spets@iki.fi> Date: Sun, 29 Oct 2017 17:17:24 +0200 Subject: [PATCH 105/402] SSH agent support --- CMakeLists.txt | 1 + COPYING | 1 + .../32x32/apps/utilities-terminal.png | Bin 0 -> 958 bytes share/icons/svg/utilities-terminal.svgz | Bin 0 -> 6689 bytes src/CMakeLists.txt | 7 + src/config-keepassx.h.cmake | 1 + src/gui/AboutDialog.cpp | 3 + src/gui/DatabaseWidget.cpp | 13 + src/gui/MainWindow.cpp | 9 + src/gui/entry/EditEntryWidget.cpp | 268 +++++++ src/gui/entry/EditEntryWidget.h | 28 + src/gui/entry/EditEntryWidgetSSHAgent.ui | 207 ++++++ src/sshagent/AgentSettingsPage.cpp | 58 ++ src/sshagent/AgentSettingsPage.h | 40 + src/sshagent/AgentSettingsWidget.cpp | 37 + src/sshagent/AgentSettingsWidget.h | 46 ++ src/sshagent/AgentSettingsWidget.ui | 53 ++ src/sshagent/BinaryStream.cpp | 219 ++++++ src/sshagent/BinaryStream.h | 68 ++ src/sshagent/CMakeLists.txt | 15 + src/sshagent/KeeAgentSettings.cpp | 278 +++++++ src/sshagent/KeeAgentSettings.h | 79 ++ src/sshagent/OpenSSHKey.cpp | 486 ++++++++++++ src/sshagent/OpenSSHKey.h | 73 ++ src/sshagent/SSHAgent.cpp | 272 +++++++ src/sshagent/SSHAgent.h | 73 ++ src/sshagent/bcrypt_pbkdf.cpp | 172 +++++ src/sshagent/blf.h | 98 +++ src/sshagent/blowfish.c | 696 ++++++++++++++++++ tests/CMakeLists.txt | 7 +- tests/TestOpenSSHKey.cpp | 124 ++++ tests/TestOpenSSHKey.h | 35 + 32 files changed, 3466 insertions(+), 1 deletion(-) create mode 100644 share/icons/application/32x32/apps/utilities-terminal.png create mode 100644 share/icons/svg/utilities-terminal.svgz create mode 100644 src/gui/entry/EditEntryWidgetSSHAgent.ui create mode 100644 src/sshagent/AgentSettingsPage.cpp create mode 100644 src/sshagent/AgentSettingsPage.h create mode 100644 src/sshagent/AgentSettingsWidget.cpp create mode 100644 src/sshagent/AgentSettingsWidget.h create mode 100644 src/sshagent/AgentSettingsWidget.ui create mode 100644 src/sshagent/BinaryStream.cpp create mode 100644 src/sshagent/BinaryStream.h create mode 100644 src/sshagent/CMakeLists.txt create mode 100644 src/sshagent/KeeAgentSettings.cpp create mode 100644 src/sshagent/KeeAgentSettings.h create mode 100644 src/sshagent/OpenSSHKey.cpp create mode 100644 src/sshagent/OpenSSHKey.h create mode 100644 src/sshagent/SSHAgent.cpp create mode 100644 src/sshagent/SSHAgent.h create mode 100644 src/sshagent/bcrypt_pbkdf.cpp create mode 100644 src/sshagent/blf.h create mode 100644 src/sshagent/blowfish.c create mode 100644 tests/TestOpenSSHKey.cpp create mode 100644 tests/TestOpenSSHKey.h diff --git a/CMakeLists.txt b/CMakeLists.txt index c5cc9e41b..b86f0eee7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,6 +43,7 @@ option(WITH_APP_BUNDLE "Enable Application Bundle for macOS" ON) option(WITH_XC_AUTOTYPE "Include Auto-Type." ON) option(WITH_XC_HTTP "Include KeePassHTTP and Custom Icon Downloads." OFF) option(WITH_XC_YUBIKEY "Include YubiKey support." OFF) +option(WITH_XC_SSHAGENT "Include SSH agent support." OFF) # Process ui files automatically from source files set(CMAKE_AUTOUIC ON) diff --git a/COPYING b/COPYING index a6bf0cf46..7aa9c0333 100644 --- a/COPYING +++ b/COPYING @@ -175,6 +175,7 @@ Files: share/icons/application/*/actions/application-exit.png share/icons/application/*/actions/view-history.png share/icons/application/*/apps/internet-web-browser.png share/icons/application/*/apps/preferences-desktop-icons.png + share/icons/application/*/apps/utilities-terminal.png share/icons/application/*/categories/preferences-other.png share/icons/application/*/status/dialog-error.png share/icons/application/*/status/dialog-information.png diff --git a/share/icons/application/32x32/apps/utilities-terminal.png b/share/icons/application/32x32/apps/utilities-terminal.png new file mode 100644 index 0000000000000000000000000000000000000000..3e4d324c0c5f03b7d15fe758dfb0a652e3536c4b GIT binary patch literal 958 zcmV;v13~<WP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800004b3#c}2nYxW zd<bNS00009a7bBm000Aa000Aa0e#hi%m4rY8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H113O7XK~#9!#aBIV6G0H2JD&-%pg<Ne4I&i5LMGszf&eW-Q7DNb z@*hZw5dHx06F^9i3MeU3x<Mhr6mf$?hbZF8mV&>1=VjlWSG$APM~p)<*3<0AdEcAa zx%Ju+LXhJ)B+Zj>=y*&>_~2HADTxabQ>4xLPsFf}L`9;BsFM<xi^bx{WHNctbzM3v z5{ZOrhgt0R`-G^1AOO$@SQ}`yT0iso{5>N24gs#jIY~aVzrT-#;z%(MVq04iX<`Us zBGAudGBe-=Hw3^E^?IFFR#s^4dM^5sga{Xkd|>tkyxA9ui1|MaV+e9<Yb)erg@-TA z-MB{6)90xlNWyS&lL!a~(V%T0>_fC_D*;wB=N!+RaGYoo9}*h)U|bEs*dwgO@U+ST z_pola%fxxaj4ujkR-I}tGFsgCee!!gyxRLw(Q^TOl7*&)2!KC_ZRqv7ir6T;*!08L zylW0BtgWt6E|=4hla8{}=}^1fqE5RFVh~zH#+p3?c#YIPe%{%k<>g0It5)g#hj+BQ zTawZC$Pav7WcXO>1Q^432Gl}@LV-3m)+v=r(UbM3AP1?gHeM$xQHQno8VLM8-I|}L zh5HM1aBx7+Up$K~Krw#w2*xg;+wFw7d;1Q(di|2Nx3|NTJB}-}ahjb0&1REC5DdK~ z<C@2m4We0HdmO18^rucu(c3qhWZL3`MQn{OzzMeigCqAAmA|y~kb>wW1n?FN72qTS z@PjgPZ$a4THQ?DXZDjwS&1J8l;E~6lfM|_dfSSuLfG=!40fk-Ukz^q5Z~;IRCvx%( z=%9FDT9X(h^5|+npZ~VV;jAJj&w%H7AsJto72n7L9K-NDu5tF)aId^avsY$GM7JB} z1M`A`aorz_yi%zk19kz$;#c^;A?^~YgvHJ^8V&nNSgX~jTCJ+vuJVjnjl<aDv2EQ? zr_&^F;7ou}g#qAv2NAvi4`GHNHqMB+$GmNvr61fX1HDqI^d+0kUX^!t6)g&rMGdbq zq84N%(XGjx8_Ea*ESJmQz^VRzp(HO!+>|(jv19mOSeN)D@k5beQ_f1bbUfCV_=PMu g*sGH?mrmGz1I7zFk1Ci&^Z)<=07*qoM6N<$g5EB-%>V!Z literal 0 HcmV?d00001 diff --git a/share/icons/svg/utilities-terminal.svgz b/share/icons/svg/utilities-terminal.svgz new file mode 100644 index 0000000000000000000000000000000000000000..e913402f54e909ded22b71d6e12b4762ef8d1a37 GIT binary patch literal 6689 zcmYLtbySq!_cdM8p}-I$B_ItBNDL`mQiF6#r*t`VGb11(jkGijjiAC1BHi86%@6|e z4xit5t@ppX*4=xbefBxex@$em@dO0IP;W&HY$rF@cW%zMeD8eh0x%Y`P2J`dA4eTs zLi{E(AIFpm+jV3&BO4v!vD#+h8^15%CMfjE(e#sV&iuQSD74lUq5Cj7+CM_g*v%Hr za2h=H+n?Q|$1SA!rdj+Z)#YsSZLlB(q54oADyZJDO4>yI-|hORvdpZ_Hm`5WkW6nM z!8dLk(n0qy(fcgT;gGqvJAB4ji+sKiyUxn{Ut2rgJ{Jd*uD-$G%*CZ8j)7r7%HT!U zep~&H2*c<1e~)4H_4V2Z;?m~7`8je2%$J=Zwk^n@w8}czY`~{s1(vrdU$5G^Lo&Z< zHNNR+nH^%*l+Hc+w7|zFKf0^xYWqgn@5l}+-0i?AICwPOcJA6b)Hy35Vq!6$Pk>Qh zQ_VeFJ#oFr-FJ+P=ej(cW-9C?z0V=_TYyV0?AeM5sZGtgUR=PMv?NO4JU;Q?#wEGU z%bTLCvqOHL?s?^G*7qJDPeT7#`O>gpnzjUd<drr#_=?(Gv!XmCs|0QSU8l*CMv}8p z4w%A97MF{>SmLr9;N`jYwV$6%`v_h;)eni5^AJu>4mY*TnlA4z+4{CQ-?=Bd%TF#! z?UP39&(ptX*E-Yg+IKt?%;X)@8bI=p3H}RtCwdL04zBOxJ3GGLy5XG~afBQ`3T)c3 z`dk&l`|r_f`bMdb6-N}Mhz!ZY++|aB5rgu}Cn;srT6^=rND)FPLTerz1Rl-Z+vJOw z*T`{s&kw)zy|c^t2+=ju>X<kA)cL7;aMLyi*GizQakK44zj^t~idV-Qm&UDSleFsT z&0-C)9Z%o)d}fedNjPa>d>cXb_lg4XlgsjOem%RDvR2Xh*23JTD8-bbdHT>h3_|a! zI{)TUFYnByt(0H|lsv9-q&GX+5?*R`v7-iR-j$?KXLZVcQr6ge?a}0CDfT_zf1=j2 z#@12vzxbY~G3D=9Iw*J=bCr`q(mVLmz^~!<o&zWGRy*Flj{zhlk9<Y5KouJ2gMIce z)<iQcaf}F|iyDr1x;()cUh7lacdK(DeC7v!uQ}nRfqJa6S=+_k9~P~flke}gmOH-% zKdT57y$(D+QYeKy8&keS9CXa!fheY$zXGEYIYxh4=#$5X@d@^T0wbgwcf`pW|Ewcz zAh)eV#i#RS-yyoIovatctw9Y48djbb%huD$0MF&g10Sk7C5kW^<yrBkn4$0nZ#fq7 zx?uuB3WAo72x?*A3QmNV%pXpfFBoh9jZ#8_cn%wYhP@b6MhFW_1HTZ4Rj4W>Wd#4H z^XSx(9EuPPf+BpqWOiv~swy$dIGC5GLeAaiU_Loiu)OsTz5Wp$j9GMk_$7=&Se|jD z1Td_KqF39lGID8*3s7VDWCFCJ2%EAuP;9oh>$NbsF!Q?DHAXg>LWBFsHGv{nG5MNy z_+TX?D1w%hxsvwUUVdwRjjs91E7i8JKr%Ziad&y`3{w-Vyk(u#<W>g@2Ke24Nd5qu z@B#;{9BKghfg%aekx|UD(hFWNaP=i7p*WCkx)X^XkpPYOg8efFj}Oc=lHm7!>?9_g zln)HtWPAq9!wzeHj6VOsSN2!IE0n5_E_e&XF_Y00#PW<H?R$lCKf!!6K+qQ;4g^eh zA@Omtpm5T@nn1D9<j@LcJSJAU6IzYlf`WkND=5Mer;w2m9=E%?hOLuB1<%7ymcMjQ zq9Yf=(m}`ZAExjv4jV5cJmvu-*GovS4P7xLduFOeBviGtS~J*1f(x_g4o^-{x-Mlx z+sdcKB$UVBNIG+u0>I(&Zn741n4u-ub=a5gV*=P%nlj4xUK{pNRhY7iOqwKE@bhFc z_<07YveJX^mt6#XFU5g0qg}{eYpG{Uvc0UIl_W{Oh1d5H^l^&=6CO+mWl+Fty=1Ib zm^8V}Wad1uu*88D7w+A%i?>i5Rv>Rb)Mnv?_ym&+NuW$84t(+;#>&gew6o*qY(n;g zncN*qP8>)ziOwb>nS$I=Ja4^Mq_2_K#w0#EC6Rcd6W3t_myMVexVjD1(|aKJY089= za-OC~T|wa#<eX?9TdQm9vennec}-rDEMKGJ$@*Su%E;j3cu1K9$%IkBQ*30mwIqbI z_N4eG&#`TwPvH9KUCPJ)OJq&&oEd%QNDED{#j%lOgeOV}qbc7B33j0B-5zBpC-(g@ zN>1WThk_*XM=Po50WmOYF9?#HV5$rgDvx0HhYs^vF$e=~aM)=6cai@VCnAkhS>Yi; z!v7`&ERK$cDG97mpvTh9I8M$?&Z#J4u?<b{5%CIaw)ArUX$+S687K~va3`}P`QKN? z@n0V*iZYtxm^=T?(uo%HjS_yhL~&?Z=+z1BaIDhENni8Blx=Wqs2Rx>A1XQw5-1ys z=jFp3+~c0WJ+q)tQi8RI<wDPby&noZe2A^k3Wtq^5gxz&klR2Ez7(U@#zRk-&wz#4 zLa!fElM}+CMDGFFLYMyrE>08$xfps8-no9bg0^pMux<yfkvhZ-<6mF-z3Qd%kdY4( z(>(j(kw*G#*FEaWufn<;+e=cO_V;&~QlFK-sq0)spwZ#sFmexM5|*H5iySNAQ$cRs z37#V~+ZA;SwiFVL3kafE++${Xy_!syf}c~mPdz##`pII}FQiG`2l=T@_fMz8$V(*d z_x{%Dq>t-3a@(_I&UQW+bpQ8Y@#s^ge{0)p@sXbQ^rzYC9gQ6RaTKgP^WYzfXX$Nj z+Ky|>8*}xE`tnldhW9VYUR;uVELbYy(vOr0Mv?9X#_MmhWo@(4Ir-D~NH=5~r_ASr z6-|OT_$IoMt<8O$RYE~)+)9rjjI34F4)NR{N+SeN`#2n<b6^0h+SUqzXT6j5-Emf2 zSF>pWPK)qs#=31Woa3&+$uZr!u*o?sEwrV?7>Q0c&@T*gDA!nwRill)c>0bVSV$`U zG@Q$8jtKROg9$+-J)v-6eeD?h6`^Heza>uJdS8T=SqUnv7S?_2w6iN?VL?NC*7lvM zeDWr~U(euEBX5OmsPSA#ZFi)447iWYFt8BwX;AY_@X1YV^_TI*wCVSoXXoM)WHc4% zmn-bQmrLKtB$8zdGQWRnb*k}^<?_SyFi)i3EgfQuS}YPm@-xc}Yy4@brLVmR;Z=dm z4~&95&+9ukDK7|I2KU^jWyUlzErXzfuY?ET8w{B}?V7COEHcq3j-D%eHGAUv<z_C! zO$_+*Hcj4WBGH$T`VCHVF(2n|VaxBIK@Jf}kVmR#&MSs^{K?n9;-kbX39HR5M1`|X z5=9J$lV7~p^;VS`R}LN|bTS#n8T*}KS3gv*w*C3<+}Yb|?&BGNas|~F2+giLjoW)- zHDj7Jr;VAvu`dFG^D<FW3@Ofw^=2SJ#pgG-<s7A`MnzQZ5-e>#fcXCBk!~)*lkZ~4 z<Vc(td51oUS!oi~JweJUw(DaTy=YKhA<135Mu>}ZG-x+<P7Ia2rYI8)ijoCHMbp1Q zd|;dts{;+%rP1X$*p2ouOetb!g1TUU<@`aF8>@9QoduweeL*vVE@UC^a3pH!iRc!$ zW%@wWE5LMqqV-4=xv04=V0JYgg+||f398j&oCAh~h*N0m?X4vcFCEM)%u@LcM)DI^ z$KGCf6xc+Ao*l#&`M>rUUyUbmcM!h4T>a&1|8A^<);yJeY9>E%4UOwC+#_}Qt<n(s zghsSV9?)Afc)Z@@b!8Pe)?v7!76&L0N63O)qL@V+<uk|su6?2gJr*w%R39UjcC6Tk z|0$F@Ik%0}h<@(#z4(FYZ6E$@QgH;_ac$)GVsDEaNHeA9c<9?;JO+MEBr9?+gkxW+ zuK(D0!0PoB`<UbQtTQZRyEK4S5rd_7Tp%5aG71;FQcl1~9kjEe?MRIDjaG3KUK)b( zkt#j5OpoS^6T|DtwAxt%wuu?WSO;n#mJ=981d*0C=fr0PJ)>{ib8@N@ttX?vjIs(Y zJOYmLxq4E?LVbC^mB*;hqMx5j<5TGZx{mV~498NviPsX?wO(3~+wsKydKxaa-lwOT zc=?>NRg8G?#NP9x^}n?b;7L;j56Of}<2S8heZV0@&ySE2n&|X$g?Wb8;A9cj5aI|v zQh8s=G?Stg#9}Q#w@L@P9(<a>mt;k5$JU}6y81X846x^MSg>dIE{bOrYqgI0EU+FE zPD}=eu|o)7ES2o-tkL3m^dy%@Sd-f^v=CXgclmFx33&Au^y~KtK;1=Jh?FG5;CxBw zYn~QWtOuj|l)Vx*pZ}|zVZu&wqky3uGd{IWJDpr^Q_ver`!Y#3t9FAM_n|`wm(7E& zYT1eAfZUVld<iCvs<rI>(g1T?;{b-~o0l?FN?G?!z9GYj^NI}bhs{@8+9z~B_gML2 zR-~Lil@=eTyDSRcw(hmtbJjZOV;yK|yG7wzs!)3y-GE*WS&B`tb6{fO9FHD8f#YE9 zE7nj>Sh(L}xGSDskqeSw*ioNh#46RCFSxto!PiHBR}z>TB#o#4sn9)UH9YVX5EH@3 zsy)|#N{nI05Uj6^okusY5GNMFKvwhWb~<z&-w+YN6RclIQL!yWn<elcR*(dz_aCE$ zOI*qVK_fXW@eqcmWJU)!NsU9l{U3uuihUy?hO7tKTQhc746*g?@@|+#X5o(&VqkB< zPB|NK&Gn4oUv3rb?{xiH-acpuN`rYsG!jQkonP?u5B~?XdTdlC17M?D#b<6oYXYxD z<->?PZkxQ3OMeNul7(s){DVrU2#BJ%O3gNWJYC7QYuw_EEmg^|ArakYaE6mJrTX$t zsk8fEA#L<kQy+Jx*xhYj-G?1Wd6x}NF|&j|NbF9vs&3UGAo3T7=9#A+NJwK_XC@}x zfhkW8uVkly8<6vdvD|r0#M0E3bv%WX9su2;p!-Oosb#=r;}-zbLRWkCQXeEFg;h~| zA|NGERrkYT6!RmAmXkiG%^IRR_LpLDgNF!+VEl_JHz3PkU1#<fk&ub5R({WAV`C(u zV=XUG3HpkreKtbV_5kQ=2!Td44K+cQVws+{3YlF&ybu2sRgx&J2lAK`R75*5kf+bY z7$?;yqRRq-bkUNmIcP~^uCLBEbK$zyRF-q?`she<I*I6V8siLRyB%O29~0Fx$DN$V zp6FX0TkjT8l74^7_DydMb0)zm$vh4lPN%~E(FOy=x>IC>!Ok?G?sfe|Ro!~GFalpj zI0>w}hGE|`@+y`X<1MiiwK#s)m$J_Au~A~4pQuYM@eF?MpU)ieX{77J<2p!dxt!O& zJMSLldx3;7GG9xQMUYxxfWlQyE=wS1zOc=G4-fAf_`UQEYAqxLHGgn>Cpxd#@omQ7 zYIQ9j$DcQiuD|Wn$lR~Z&}{Hirdob`z^BJ82TkR$7ShClCjmz?fzt=xzE^+O2a%I& zcVuq2|B%a1;)xS43izc{kxwtJ-(gZ@u25Rdbow<k2el3#A^XSAj4zH?Q}(q6Y%^C5 z*VZMQ>KQDux8H^Y2G={bl(_U<HbKfWLnhV-*X~et$W|k;OHCsMj2CKN{SLQ`Z7Ke~ zhFQAvy`lN9-xtsS{=1k~-?K68P|&7y=4RyN;+pde_pGdZ?&iD`($U)7YG~@^Qy+UG z_&u|MpRal;`)+Tmvnijlqh0c5*y_5IlBXK<138b>t<vkS*Yx%Fp9<(j?z%Ny&eCf# zzi<1u7k$&_{3G+xU3WQ*?2KWw?ZES2v!9XK(0jjk^+r-z**RcI-lGiUsrWM6z3=<^ zx8iq~yBCLt%q~xjaUG;=O-C7ChnY%vT8xiSwk}zF`=0oOTy|xi%`gA)^^IqpvGf0C zA}O`NU-ic+Fkl>$XO*{gPb1JEm(O-iY=a<Tk6i=vGce*!I&wY7%#=!{gb`K_^KF@F z*voE->J0n@cz;p(yqZ#M)+7?toWVaVgy;;q2_hZ3sn9Z3y^FMbSMlo6+4CD}3;V1t zpu}k9bPjO8$EM!KoTaq~rS^<+sUfd-a_wn!z{@!?mK}w<0-dUCYFUY!i{8`SBBS=e zOR-_aUGeAsMb!S4sph}-+_^|vX{GBqeU9zuC%SQtXJ4&4y}G-#{^#4wx$SRwe=y%8 zZBpUdG0VS#E4(Ni2a>2=&)#OZ8D`CDDacLAlO1~II+e45&6K^>8FsA$)~33885@x$ zE7w7!d8(30V?y<d2BTBcc<5B>7h#%0$3j5L+{atK68nMsyHY@5mf5G2kU%w!cbZ() zZvxE9#Wn$I;R_(9);^JxC_#*3_%J4Y1bk$x&a<y5D(182)J29<I~kL&t8SDA;ZvVY zZ;zr^wX<q(=00V}+#yy>A##M?MY*5cAx*ie&E=PWLQIX@!rDsD<kf|KyIm~##x4dG z<!n+D?!gv4jl`Ekiwbm68YhWr<m7hWBjx2|#pD1H7jE+ENo6>4>lk#U7Fk6T%0#Jk z6d&_M)MX8QTv=R8Fg)0qMX?C2Nz;Nhbup!%Mb5OT?Z<Jxw1$KyzwnuyZ=rC9C<DZf z8cxW~a`l?`PU=?P!z5w`t~VRC`u>tgtY0t?xs-}JdQK>!@F4vt$I&GUQ^-&6>gp~X z=#ni5-V^(ATdeDDkElc?&y71C5z6_#n!}Y;80D@Vrl;F)DGRzaVbQwlI0Rs$cTw-3 z#aD(*?VYo~^!FL|!tZQ?-YK66c5!u^^A{0<|4zr9b|UT(U$)QU!lWUp+ujO`fHH4| zY>{=I#t;)ts~s!`gd8(_Zc7knNGgo|b@*mn#kgwbwInm}xg|IiXU}Hr?Lf<bi|65B zVo_>?O03J&nYWZU^MQ8=BVbXh>}qGvlwzp)U@D!ye?nkz<OL?7i6o_KyV4JVvjuVv z|HrAHOYj(Rez|b1ZY|+7DfP(D$?+%XEC!^vUgLZ%_o^apSd8=)Cf#EdsTFW?Vp>a> zI@zGlopKQD{n$R?H=D)0Z#lCwnR<liz{A|RigbLJ9%*pi?*c3O%h1@nLTd2r-;dph zPhY7(lX(ZVdaTWZugjCRCr`dz9;0CNv{Fo+rCTfhm79_hnA87Ip0_V5S)ofI0jmc< z-ykT)>wwyq7_}!Ye3Th6uV{cGp-)wlxPK^0dLC!4aCjfrF#VK?lbtKwC`u&gm*93_ zb8nHQJgHS+GkfxbPc}ovgiOtfausBV=eqIX7fIwLw;%b;9xGA5YSH;6nB3bGwRv!Q z>bj(|yt^VkCcLuF7`zZd(&!w`hR+|Q&1dq5fs3Ji?5zj?uj5ct+oVgxZHtu31(@#$ zN4o4s>&oxFJspZ{qBo`R!Y;k<tIrKLsCdpBYGbBr^GMXRYoLL2@mE?k7Cky;WGaZ) zPZL!|{=&O6O#5a_{UYO@)jw*9b3ty)YUYPoG|*H)APVZ*I%9ck1r;$9doq;H+9H+g zpuez)INnGXZILotw+8Aeh;H&|a62ASJWB0F8>~roGy;TEesdMai~IwAO*I!|ptc(K z0vAoq*BJWBrCohfXcI0+pK9-wo4VVON{!aZrx7wzjiYgj8x5w;N0C-!=+xi9300Np zQ*FGNzfS8|A!G@Os4WVLx(#cK^GJxewA-5;i469^LwHCh?e1N0m6=+sRrnV|Uc7=L zg)&23=fkdy5lW*MMOK%wKk!~r8Tlw)#^#%;5nBCM8IcO4aUz<}vzG((edRK#z3~H3 zYuK|IF7`s4xh%ruRKk-h(y;yq$(;GhMboCG4C2ffi4$$rQl>FR`)tR1g@&LURbxP$ zaU);qlkDXyW`g^0a8s~wM|Qz_wMBU(s@i#eb`8`O5M8mkJUBX_FPj;Qy|a0KxJ1d5 z!6wKwD=%gZd%}veFq9)vJYk#`J@sBpT9Mi1s>MSu^`pUJdd^(V=(Ec)I>dk%kqL+E zFF2<tcqjM4OX#-dXe$oapEpux-at7Jgq3MO(Uxb>T|NK5oVDv@pOVCRPhsjy?m@qh z#IYbY`s}%=pHER2+=$^4LG^VVeVB!0Js#RUlt&p6DFRaSWKNtB)Cp)Iv}G*ZZ~D45 zR+k<iPP1?pgUd3%Da<&MI1V%*Elj7jIDG*hovmVdvEDwI_F=#zQ*ZDMPb#qaL7auM zv5IOZXi&`q;X_5nPn!QNN9bg55HbymgOkfaJ9$zk&q~AcA^yn944vAWE1U2y1iTV^ z71+7ljcA{KByonkxVw|o%r4qlShy9eM$FG2OvkE(u8scxob&39h^ET9$X&FR!>t%c z<pvMeAN;V_wZh70bP^5=2zkRNb!yBsFa>1^RURN=6MJCt|2#W;F%!@j|KB=%o78DG z(+~`RO{W{;BVI_rngmB}K)B^+S8>_+>e_}MW>>N%{T)NNXM5P})qfA4J30ByO-JBp z{dix;bh;D}j{mqYO1cr)kP?Lvn&eq=##U!mC{7d+<P^Qq(p?xMn7WoV%=KB-SslKj z{L3GnzV>G!-`T*><+Q9|P`n(IwyeTCk-QseqQ9bW+)i9?vBCHD+fe?a5Yf7d!i9(k zK9o?2BCUYr6H1_G(%#41@RtCkEK6rjcB|zcZ<@ns)uhGZk1Q-|3l0IXkGL*?ACnDP zj%sj@#OL0-dmK&}X9WT{)6Gm^0LcU5_BLMhFPAf)y~tkY>rK?v)m4zrzQ4=h@|G0y Q>FRwMgXX>{5)<S90UtNk(EtDd literal 0 HcmV?d00001 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 97ff5edf2..092a2102d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -177,6 +177,7 @@ set(keepassx_SOURCES_MAINEXE add_feature_info(AutoType WITH_XC_AUTOTYPE "Automatic password typing") add_feature_info(KeePassHTTP WITH_XC_HTTP "Browser integration compatible with ChromeIPass and PassIFox") add_feature_info(YubiKey WITH_XC_YUBIKEY "YubiKey HMAC-SHA1 challenge-response") +add_feature_info(SSHAgent WITH_XC_SSHAGENT "SSH agent integration compatible with KeeAgent") add_subdirectory(http) if(WITH_XC_HTTP) @@ -186,6 +187,11 @@ endif() add_subdirectory(autotype) add_subdirectory(cli) +add_subdirectory(sshagent) +if(WITH_XC_SSHAGENT) + set(sshagent_LIB sshagent) +endif() + set(autotype_SOURCES core/Tools.cpp autotype/AutoType.cpp @@ -222,6 +228,7 @@ set_target_properties(keepassx_core PROPERTIES COMPILE_DEFINITIONS KEEPASSX_BUIL target_link_libraries(keepassx_core ${keepasshttp_LIB} ${autotype_LIB} + ${sshagent_LIB} ${YUBIKEY_LIBRARIES} ${ZXCVBN_LIBRARIES} Qt5::Core diff --git a/src/config-keepassx.h.cmake b/src/config-keepassx.h.cmake index e06c69382..b06e702a9 100644 --- a/src/config-keepassx.h.cmake +++ b/src/config-keepassx.h.cmake @@ -15,6 +15,7 @@ #cmakedefine WITH_XC_HTTP #cmakedefine WITH_XC_AUTOTYPE #cmakedefine WITH_XC_YUBIKEY +#cmakedefine WITH_XC_SSHAGENT #cmakedefine KEEPASSXC_DIST #cmakedefine KEEPASSXC_DIST_TYPE "@KEEPASSXC_DIST_TYPE@" diff --git a/src/gui/AboutDialog.cpp b/src/gui/AboutDialog.cpp index 58387335c..e89a7fdcb 100644 --- a/src/gui/AboutDialog.cpp +++ b/src/gui/AboutDialog.cpp @@ -87,6 +87,9 @@ AboutDialog::AboutDialog(QWidget* parent) #ifdef WITH_XC_YUBIKEY extensions += "\n- YubiKey"; #endif +#ifdef WITH_XC_SSHAGENT + extensions += "\n- SSH Agent"; +#endif if (extensions.isEmpty()) extensions = " None"; diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 63420158b..a610cf506 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -57,6 +57,12 @@ #include "gui/group/EditGroupWidget.h" #include "gui/group/GroupView.h" +#include "config-keepassx.h" + +#ifdef WITH_XC_SSHAGENT +#include "sshagent/SSHAgent.h" +#endif + DatabaseWidget::DatabaseWidget(Database* db, QWidget* parent) : QStackedWidget(parent) , m_db(db) @@ -210,6 +216,13 @@ DatabaseWidget::DatabaseWidget(Database* db, QWidget* parent) m_searchCaseSensitive = false; m_searchLimitGroup = config()->get("SearchLimitGroup", false).toBool(); +#ifdef WITH_XC_SSHAGENT + if (config()->get("SSHAgent", false).toBool()) { + connect(this, SIGNAL(currentModeChanged(DatabaseWidget::Mode)), SSHAgent::instance(), SLOT(databaseModeChanged(DatabaseWidget::Mode))); + connect(this, SIGNAL(closeRequest()), SSHAgent::instance(), SLOT(databaseModeChanged())); + } +#endif + setCurrentWidget(m_mainWidget); } diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index ccc5fb11f..30bb2cdf3 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -49,6 +49,11 @@ #include "http/OptionDialog.h" #endif +#ifdef WITH_XC_SSHAGENT +#include "sshagent/AgentSettingsPage.h" +#include "sshagent/SSHAgent.h" +#endif + #include "gui/SettingsWidget.h" #include "gui/PasswordGeneratorWidget.h" @@ -121,6 +126,10 @@ MainWindow::MainWindow() #ifdef WITH_XC_HTTP m_ui->settingsWidget->addSettingsPage(new HttpPlugin(m_ui->tabWidget)); #endif + #ifdef WITH_XC_SSHAGENT + SSHAgent::init(this); + m_ui->settingsWidget->addSettingsPage(new AgentSettingsPage(m_ui->tabWidget)); + #endif setWindowIcon(filePath()->applicationIcon()); m_ui->globalMessageWidget->setHidden(true); diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index 0dc555a0a..f1fe37502 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -19,6 +19,7 @@ #include "EditEntryWidget.h" #include "ui_EditEntryWidgetAdvanced.h" #include "ui_EditEntryWidgetAutoType.h" +#include "ui_EditEntryWidgetSSHAgent.h" #include "ui_EditEntryWidgetHistory.h" #include "ui_EditEntryWidgetMain.h" @@ -36,10 +37,16 @@ #include "core/Metadata.h" #include "core/TimeDelta.h" #include "core/Tools.h" +#ifdef WITH_XC_SSHAGENT +#include "sshagent/KeeAgentSettings.h" +#include "sshagent/OpenSSHKey.h" +#include "sshagent/SSHAgent.h" +#endif #include "gui/EditWidgetIcons.h" #include "gui/EditWidgetProperties.h" #include "gui/FileDialog.h" #include "gui/MessageBox.h" +#include "gui/Clipboard.h" #include "gui/entry/AutoTypeAssociationsModel.h" #include "gui/entry/EntryAttachmentsModel.h" #include "gui/entry/EntryAttributesModel.h" @@ -51,11 +58,13 @@ EditEntryWidget::EditEntryWidget(QWidget* parent) , m_mainUi(new Ui::EditEntryWidgetMain()) , m_advancedUi(new Ui::EditEntryWidgetAdvanced()) , m_autoTypeUi(new Ui::EditEntryWidgetAutoType()) + , m_sshAgentUi(new Ui::EditEntryWidgetSSHAgent()) , m_historyUi(new Ui::EditEntryWidgetHistory()) , m_mainWidget(new QWidget()) , m_advancedWidget(new QWidget()) , m_iconsWidget(new EditWidgetIcons()) , m_autoTypeWidget(new QWidget()) + , m_sshAgentWidget(new QWidget()) , m_editWidgetProperties(new EditWidgetProperties()) , m_historyWidget(new QWidget()) , m_entryAttachments(new EntryAttachments(this)) @@ -73,6 +82,14 @@ EditEntryWidget::EditEntryWidget(QWidget* parent) setupAdvanced(); setupIcon(); setupAutoType(); +#ifdef WITH_XC_SSHAGENT + if (config()->get("SSHAgent", false).toBool()) { + setupSSHAgent(); + m_sshAgentEnabled = true; + } else { + m_sshAgentEnabled = false; + } +#endif setupProperties(); setupHistory(); @@ -245,6 +262,239 @@ void EditEntryWidget::updateHistoryButtons(const QModelIndex& current, const QMo } } +#ifdef WITH_XC_SSHAGENT +void EditEntryWidget::setupSSHAgent() +{ + m_sshAgentUi->setupUi(m_sshAgentWidget); + + connect(m_sshAgentUi->privateKeyComboBox, SIGNAL(currentTextChanged(QString)), SLOT(updateSSHAgentKeyInfo())); + connect(m_sshAgentUi->browseButton, SIGNAL(clicked()), SLOT(browsePrivateKey())); + connect(m_sshAgentUi->addToAgentButton, SIGNAL(clicked()), SLOT(addKeyToAgent())); + connect(m_sshAgentUi->removeFromAgentButton, SIGNAL(clicked()), SLOT(removeKeyFromAgent())); + connect(m_sshAgentUi->decryptButton, SIGNAL(clicked()), SLOT(decryptPrivateKey())); + connect(m_sshAgentUi->copyToClipboardButton, SIGNAL(clicked()), SLOT(copyPublicKey())); + + addPage(tr("SSH Agent"), FilePath::instance()->icon("apps", "utilities-terminal"), m_sshAgentWidget); +} + +void EditEntryWidget::updateSSHAgent() +{ + // TODO: unsafe use of translations + QString prefix = tr("Attachment") + ": "; + KeeAgentSettings settings; + settings.fromXml(m_entryAttachments->value("KeeAgent.settings")); + + m_sshAgentUi->addKeyToAgentCheckBox->setChecked(settings.addAtDatabaseOpen()); + m_sshAgentUi->removeKeyFromAgentCheckBox->setChecked(settings.removeAtDatabaseClose()); + m_sshAgentUi->requireUserConfirmationCheckBox->setChecked(settings.useConfirmConstraintWhenAdding()); + m_sshAgentUi->lifetimeCheckBox->setChecked(settings.useLifetimeConstraintWhenAdding()); + m_sshAgentUi->lifetimeSpinBox->setValue(settings.lifetimeConstraintDuration()); + m_sshAgentUi->privateKeyComboBox->clear(); + m_sshAgentUi->addToAgentButton->setEnabled(false); + m_sshAgentUi->removeFromAgentButton->setEnabled(false); + m_sshAgentUi->copyToClipboardButton->setEnabled(false); + + for (QString fileName : m_entryAttachments->keys()) { + if (fileName == "KeeAgent.settings") { + continue; + } + + m_sshAgentUi->privateKeyComboBox->addItem(prefix + fileName); + } + + if (settings.selectedType() == "attachment") { + m_sshAgentUi->privateKeyComboBox->setCurrentText(prefix + settings.attachmentName()); + } else if (!settings.fileName().isEmpty()) { + m_sshAgentUi->privateKeyComboBox->addItem(settings.fileName()); + m_sshAgentUi->privateKeyComboBox->setCurrentText(settings.fileName()); + } else { + m_sshAgentUi->privateKeyComboBox->setCurrentText(""); + } + + m_sshAgentSettings = settings; +} + +void EditEntryWidget::updateSSHAgentKeyInfo() +{ + m_sshAgentUi->addToAgentButton->setEnabled(false); + m_sshAgentUi->removeFromAgentButton->setEnabled(false); + m_sshAgentUi->copyToClipboardButton->setEnabled(false); + m_sshAgentUi->fingerprintEdit->setText(""); + m_sshAgentUi->commentEdit->setText(""); + m_sshAgentUi->decryptButton->setEnabled(false); + m_sshAgentUi->publicKeyEdit->document()->setPlainText(""); + + if (m_sshAgentUi->privateKeyComboBox->currentText().isEmpty()) { + return; + } + + OpenSSHKey key; + + if (!getOpenSSHKey(key)) { + return; + } + + m_sshAgentUi->fingerprintEdit->setText(key.fingerprint()); + + if (key.encrypted()) { + m_sshAgentUi->commentEdit->setText(tr("(encrypted)")); + m_sshAgentUi->decryptButton->setEnabled(true); + } else { + m_sshAgentUi->commentEdit->setText(key.comment()); + } + + m_sshAgentUi->publicKeyEdit->document()->setPlainText(key.publicKey()); + + // enable agent buttons only if we have an agent running + if (SSHAgent::instance()->isAgentRunning()) { + m_sshAgentUi->addToAgentButton->setEnabled(true); + m_sshAgentUi->removeFromAgentButton->setEnabled(true); + } + + m_sshAgentUi->copyToClipboardButton->setEnabled(true); +} + +void EditEntryWidget::saveSSHAgentConfig() +{ + KeeAgentSettings settings; + QString privateKeyPath = m_sshAgentUi->privateKeyComboBox->currentText(); + + settings.setAddAtDatabaseOpen(m_sshAgentUi->addKeyToAgentCheckBox->isChecked()); + settings.setRemoveAtDatabaseClose(m_sshAgentUi->removeKeyFromAgentCheckBox->isChecked()); + settings.setUseConfirmConstraintWhenAdding(m_sshAgentUi->requireUserConfirmationCheckBox->isChecked()); + settings.setUseLifetimeConstraintWhenAdding(m_sshAgentUi->lifetimeCheckBox->isChecked()); + settings.setLifetimeConstraintDuration(m_sshAgentUi->lifetimeSpinBox->value()); + + // TODO: unsafe use of translations + QString prefix = tr("Attachment") + ": "; + if (privateKeyPath.startsWith(prefix)) { + settings.setSelectedType("attachment"); + settings.setAttachmentName(privateKeyPath.remove(0, prefix.length())); + settings.setFileName(""); + } else { + settings.setSelectedType("file"); + settings.setFileName(privateKeyPath); + settings.setAttachmentName(""); + } + + // we don't use this as we don't run an agent but for compatibility we set it if necessary + settings.setAllowUseOfSshKey(settings.addAtDatabaseOpen() || settings.removeAtDatabaseClose()); + + // we don't use this either but we don't want it to dirty flag the config + settings.setSaveAttachmentToTempFile(m_sshAgentSettings.saveAttachmentToTempFile()); + + if (settings.isDefault() && m_entryAttachments->hasKey("KeeAgent.settings")) { + m_entryAttachments->remove("KeeAgent.settings"); + } else if (settings != m_sshAgentSettings) { + m_entryAttachments->set("KeeAgent.settings", settings.toXml()); + } + + m_sshAgentSettings = settings; +} + +void EditEntryWidget::browsePrivateKey() +{ + QString fileName = QFileDialog::getOpenFileName(this, tr("Select private key"), ""); + if (!fileName.isEmpty()) { + m_sshAgentUi->privateKeyComboBox->addItem(fileName); + m_sshAgentUi->privateKeyComboBox->setCurrentText(fileName); + } +} + +bool EditEntryWidget::getOpenSSHKey(OpenSSHKey& key) +{ + QString privateKeyPath = m_sshAgentUi->privateKeyComboBox->currentText(); + QByteArray privateKeyData; + + // TODO: unsafe use of translations + QString prefix = tr("Attachment") + ": "; + if (privateKeyPath.startsWith(prefix)) { + QString attachmentName = privateKeyPath.remove(0, prefix.length()); + privateKeyData = m_entryAttachments->value(attachmentName); + } else { + QFile localFile(privateKeyPath); + + if (localFile.size() > 1024 * 1024) { + showMessage(tr("File too large to be a private key"), MessageWidget::Error); + return false; + } + + if (!localFile.open(QIODevice::ReadOnly)) { + showMessage(tr("Failed to open private key"), MessageWidget::Error); + return false; + } + + privateKeyData = localFile.readAll(); + } + + if (!key.parse(privateKeyData)) { + showMessage(key.errorString(), MessageWidget::Error); + return false; + } + + return true; +} + +void EditEntryWidget::addKeyToAgent() +{ + OpenSSHKey key; + + if (!getOpenSSHKey(key)) { + return; + } + + if (!key.openPrivateKey(m_entry->password())) { + showMessage(key.errorString(), MessageWidget::Error); + } else { + m_sshAgentUi->commentEdit->setText(key.comment()); + m_sshAgentUi->publicKeyEdit->document()->setPlainText(key.publicKey()); + } + + quint32 lifetime = 0; + bool confirm = m_sshAgentUi->requireUserConfirmationCheckBox->isChecked(); + + if (m_sshAgentUi->lifetimeCheckBox->isChecked()) { + lifetime = m_sshAgentUi->lifetimeSpinBox->value(); + } + + SSHAgent::instance()->addIdentity(key, lifetime, confirm); + + if (m_sshAgentUi->removeKeyFromAgentCheckBox->isChecked()) { + SSHAgent::instance()->removeIdentityAtLock(key, m_entry->uuid()); + } +} + +void EditEntryWidget::removeKeyFromAgent() +{ + OpenSSHKey key; + + if (getOpenSSHKey(key)) { + SSHAgent::instance()->removeIdentity(key); + } +} + +void EditEntryWidget::decryptPrivateKey() +{ + OpenSSHKey key; + + if (!getOpenSSHKey(key)) { + return; + } + + if (!key.openPrivateKey(m_entry->password())) { + showMessage(key.errorString(), MessageWidget::Error); + } else { + m_sshAgentUi->commentEdit->setText(key.comment()); + m_sshAgentUi->publicKeyEdit->document()->setPlainText(key.publicKey()); + } +} + +void EditEntryWidget::copyPublicKey() +{ + clipboard()->setText(m_sshAgentUi->publicKeyEdit->document()->toPlainText()); +} +#endif + void EditEntryWidget::useExpiryPreset(QAction* action) { m_mainUi->expireCheck->setChecked(true); @@ -398,6 +648,12 @@ void EditEntryWidget::setForms(const Entry* entry, bool restore) } updateAutoTypeEnabled(); +#ifdef WITH_XC_SSHAGENT + if (m_sshAgentEnabled) { + updateSSHAgent(); + } +#endif + m_editWidgetProperties->setFields(entry->timeInfo(), entry->uuid()); if (!m_history && !restore) { @@ -445,6 +701,12 @@ void EditEntryWidget::saveEntry() m_autoTypeAssoc->removeEmpty(); +#ifdef WITH_XC_SSHAGENT + if (m_sshAgentEnabled) { + saveSSHAgentConfig(); + } +#endif + if (!m_create) { m_entry->beginUpdate(); } @@ -454,6 +716,12 @@ void EditEntryWidget::saveEntry() if (!m_create) { m_entry->endUpdate(); } + +#ifdef WITH_XC_SSHAGENT + if (m_sshAgentEnabled) { + updateSSHAgent(); + } +#endif } void EditEntryWidget::acceptEntry() diff --git a/src/gui/entry/EditEntryWidget.h b/src/gui/entry/EditEntryWidget.h index 1f1b55529..a151f1b5e 100644 --- a/src/gui/entry/EditEntryWidget.h +++ b/src/gui/entry/EditEntryWidget.h @@ -23,6 +23,7 @@ #include <QScopedPointer> #include "gui/EditWidget.h" +#include "config-keepassx.h" class AutoTypeAssociations; class AutoTypeAssociationsModel; @@ -39,10 +40,15 @@ class QButtonGroup; class QMenu; class QSortFilterProxyModel; class QStackedLayout; +#ifdef WITH_XC_SSHAGENT +#include "sshagent/KeeAgentSettings.h" +class OpenSSHKey; +#endif namespace Ui { class EditEntryWidgetAdvanced; class EditEntryWidgetAutoType; + class EditEntryWidgetSSHAgent; class EditEntryWidgetMain; class EditEntryWidgetHistory; class EditWidget; @@ -102,12 +108,24 @@ private slots: void useExpiryPreset(QAction* action); void updateAttachmentButtonsEnabled(const QModelIndex& current); void toggleHideNotes(bool visible); +#ifdef WITH_XC_SSHAGENT + void updateSSHAgent(); + void updateSSHAgentKeyInfo(); + void browsePrivateKey(); + void addKeyToAgent(); + void removeKeyFromAgent(); + void decryptPrivateKey(); + void copyPublicKey(); +#endif private: void setupMain(); void setupAdvanced(); void setupIcon(); void setupAutoType(); +#ifdef WITH_XC_SSHAGENT + void setupSSHAgent(); +#endif void setupProperties(); void setupHistory(); @@ -115,6 +133,10 @@ private: void setForms(const Entry* entry, bool restore = false); QMenu* createPresetsMenu(); void updateEntryData(Entry* entry) const; +#ifdef WITH_XC_SSHAGENT + bool getOpenSSHKey(OpenSSHKey& key); + void saveSSHAgentConfig(); +#endif void displayAttribute(QModelIndex index, bool showProtected); @@ -125,14 +147,20 @@ private: bool m_create; bool m_history; +#ifdef WITH_XC_SSHAGENT + bool m_sshAgentEnabled; + KeeAgentSettings m_sshAgentSettings; +#endif const QScopedPointer<Ui::EditEntryWidgetMain> m_mainUi; const QScopedPointer<Ui::EditEntryWidgetAdvanced> m_advancedUi; const QScopedPointer<Ui::EditEntryWidgetAutoType> m_autoTypeUi; + const QScopedPointer<Ui::EditEntryWidgetSSHAgent> m_sshAgentUi; const QScopedPointer<Ui::EditEntryWidgetHistory> m_historyUi; QWidget* const m_mainWidget; QWidget* const m_advancedWidget; EditWidgetIcons* const m_iconsWidget; QWidget* const m_autoTypeWidget; + QWidget* const m_sshAgentWidget; EditWidgetProperties* const m_editWidgetProperties; QWidget* const m_historyWidget; EntryAttachments* const m_entryAttachments; diff --git a/src/gui/entry/EditEntryWidgetSSHAgent.ui b/src/gui/entry/EditEntryWidgetSSHAgent.ui new file mode 100644 index 000000000..2d88327cc --- /dev/null +++ b/src/gui/entry/EditEntryWidgetSSHAgent.ui @@ -0,0 +1,207 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>EditEntryWidgetSSHAgent</class> + <widget class="QWidget" name="EditEntryWidgetSSHAgent"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>471</width> + <height>480</height> + </rect> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item row="1" column="1" colspan="4"> + <widget class="QCheckBox" name="removeKeyFromAgentCheckBox"> + <property name="text"> + <string>Remove key from agent when database is closed/locked</string> + </property> + </widget> + </item> + <item row="10" column="1"> + <widget class="QLabel" name="fingerprintLabel"> + <property name="text"> + <string>Fingerprint</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="12" column="3" colspan="2"> + <widget class="QPlainTextEdit" name="publicKeyEdit"> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="10" column="3" colspan="2"> + <widget class="QLineEdit" name="fingerprintEdit"> + <property name="autoFillBackground"> + <bool>false</bool> + </property> + <property name="alignment"> + <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="4" column="1"> + <widget class="QLabel" name="privateKeyLabel"> + <property name="text"> + <string>Private key</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="12" column="1"> + <widget class="QLabel" name="publicKeyLabel"> + <property name="text"> + <string>Public key</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing</set> + </property> + </widget> + </item> + <item row="3" column="1" colspan="4"> + <layout class="QHBoxLayout" name="removeKeyLayout"> + <item> + <widget class="QCheckBox" name="lifetimeCheckBox"> + <property name="text"> + <string>Remove key from agent after</string> + </property> + </widget> + </item> + <item> + <widget class="QSpinBox" name="lifetimeSpinBox"> + <property name="suffix"> + <string> seconds</string> + </property> + <property name="maximum"> + <number>999999999</number> + </property> + </widget> + </item> + <item> + <spacer name="removeKeySpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item row="11" column="1"> + <widget class="QLabel" name="commentLabel"> + <property name="text"> + <string>Comment</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="0" column="1" colspan="4"> + <widget class="QCheckBox" name="addKeyToAgentCheckBox"> + <property name="text"> + <string>Add key to agent when database is opened/unlocked</string> + </property> + </widget> + </item> + <item row="4" column="3"> + <widget class="QComboBox" name="privateKeyComboBox"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="editable"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="4" column="4"> + <widget class="QPushButton" name="browseButton"> + <property name="text"> + <string>Browse...</string> + </property> + </widget> + </item> + <item row="2" column="1" colspan="4"> + <widget class="QCheckBox" name="requireUserConfirmationCheckBox"> + <property name="text"> + <string>Require user confirmation when this key is used</string> + </property> + </widget> + </item> + <item row="13" column="3" colspan="2"> + <widget class="QPushButton" name="copyToClipboardButton"> + <property name="text"> + <string>Copy to clipboard</string> + </property> + </widget> + </item> + <item row="6" column="3"> + <layout class="QHBoxLayout" name="agentActionsLayout" stretch="0,0"> + <item> + <widget class="QPushButton" name="addToAgentButton"> + <property name="text"> + <string>Add to agent</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="removeFromAgentButton"> + <property name="text"> + <string>Remove from agent</string> + </property> + </widget> + </item> + </layout> + </item> + <item row="11" column="3"> + <widget class="QLineEdit" name="commentEdit"> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="11" column="4"> + <widget class="QPushButton" name="decryptButton"> + <property name="text"> + <string>Decrypt</string> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/src/sshagent/AgentSettingsPage.cpp b/src/sshagent/AgentSettingsPage.cpp new file mode 100644 index 000000000..70fa04bde --- /dev/null +++ b/src/sshagent/AgentSettingsPage.cpp @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2017 Toni Spets <toni.spets@iki.fi> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "AgentSettingsPage.h" +#include "AgentSettingsWidget.h" +#include "core/FilePath.h" + +AgentSettingsPage::AgentSettingsPage(DatabaseTabWidget* tabWidget) +{ + Q_UNUSED(tabWidget); +} + +AgentSettingsPage::~AgentSettingsPage() +{ + +} + +QString AgentSettingsPage::name() +{ + return QObject::tr("SSH Agent"); +} + +QIcon AgentSettingsPage::icon() +{ + return FilePath::instance()->icon("apps", "utilities-terminal"); +} + +QWidget* AgentSettingsPage::createWidget() +{ + return new AgentSettingsWidget(); +} + +void AgentSettingsPage::loadSettings(QWidget* widget) +{ + AgentSettingsWidget* agentWidget = reinterpret_cast<AgentSettingsWidget*>(widget); + agentWidget->loadSettings(); +} + +void AgentSettingsPage::saveSettings(QWidget* widget) +{ + AgentSettingsWidget* agentWidget = reinterpret_cast<AgentSettingsWidget*>(widget); + agentWidget->saveSettings(); +} diff --git a/src/sshagent/AgentSettingsPage.h b/src/sshagent/AgentSettingsPage.h new file mode 100644 index 000000000..f9d1be3f9 --- /dev/null +++ b/src/sshagent/AgentSettingsPage.h @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2017 Toni Spets <toni.spets@iki.fi> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef AGENTSETTINGSPAGE_H +#define AGENTSETTINGSPAGE_H + +#include "gui/SettingsWidget.h" +#include "gui/DatabaseTabWidget.h" + +class AgentSettingsPage : public ISettingsPage +{ +public: + AgentSettingsPage(DatabaseTabWidget* tabWidget); + ~AgentSettingsPage() override; + + QString name() override; + QIcon icon() override; + QWidget* createWidget() override; + void loadSettings(QWidget* widget) override; + void saveSettings(QWidget* widget) override; + +private: +}; + +#endif // AGENTSETTINGSPAGE_H diff --git a/src/sshagent/AgentSettingsWidget.cpp b/src/sshagent/AgentSettingsWidget.cpp new file mode 100644 index 000000000..e8bc75ae1 --- /dev/null +++ b/src/sshagent/AgentSettingsWidget.cpp @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2017 Toni Spets <toni.spets@iki.fi> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "AgentSettingsWidget.h" +#include "core/Config.h" + +AgentSettingsWidget::AgentSettingsWidget(QWidget* parent) + : QWidget(parent) + , m_ui(new Ui::AgentSettingsWidget()) +{ + m_ui->setupUi(this); +} + +void AgentSettingsWidget::loadSettings() +{ + m_ui->enableSSHAgentCheckBox->setChecked(config()->get("SSHAgent", false).toBool()); +} + +void AgentSettingsWidget::saveSettings() +{ + config()->set("SSHAgent", m_ui->enableSSHAgentCheckBox->isChecked()); +} diff --git a/src/sshagent/AgentSettingsWidget.h b/src/sshagent/AgentSettingsWidget.h new file mode 100644 index 000000000..b6462daa0 --- /dev/null +++ b/src/sshagent/AgentSettingsWidget.h @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2017 Toni Spets <toni.spets@iki.fi> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef AGENTSETTINGSWIDGET_H +#define AGENTSETTINGSWIDGET_H + +#include <QWidget> +#include <QScopedPointer> +#include "ui_AgentSettingsWidget.h" + +namespace Ui { + class AgentSettingsWidget; +} + +class AgentSettingsWidget : public QWidget +{ + Q_OBJECT +public: + explicit AgentSettingsWidget(QWidget* parent = nullptr); + +signals: + +public slots: + void loadSettings(); + void saveSettings(); + +private: + QScopedPointer<Ui::AgentSettingsWidget> m_ui; +}; + +#endif // AGENTSETTINGSWIDGET_H diff --git a/src/sshagent/AgentSettingsWidget.ui b/src/sshagent/AgentSettingsWidget.ui new file mode 100644 index 000000000..e97ee87bb --- /dev/null +++ b/src/sshagent/AgentSettingsWidget.ui @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>AgentSettingsWidget</class> + <widget class="QWidget" name="AgentSettingsWidget"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>300</height> + </rect> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <widget class="QCheckBox" name="enableSSHAgentCheckBox"> + <property name="text"> + <string>Enable SSH Agent (requires restart)</string> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/src/sshagent/BinaryStream.cpp b/src/sshagent/BinaryStream.cpp new file mode 100644 index 000000000..b9ed236fd --- /dev/null +++ b/src/sshagent/BinaryStream.cpp @@ -0,0 +1,219 @@ +/* + * Copyright (C) 2017 Toni Spets <toni.spets@iki.fi> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "BinaryStream.h" +#include <QtEndian> + +BinaryStream::BinaryStream(QObject* parent) + : QObject(parent) + , m_timeout(-1) +{ + +} + +BinaryStream::BinaryStream(QIODevice* device) + : QObject(device) + , m_timeout(-1) + , m_device(device) +{ + +} + +BinaryStream::BinaryStream(QByteArray* ba, QObject* parent) + : QObject(parent) + , m_timeout(-1) +{ + setData(ba); +} + +BinaryStream::~BinaryStream() +{ +} + +const QString BinaryStream::errorString() const +{ + return m_error; +} + +QIODevice* BinaryStream::device() const +{ + return m_device; +} + +void BinaryStream::setDevice(QIODevice* device) +{ + m_device = device; +} + +void BinaryStream::setData(QByteArray* ba) +{ + m_buffer.reset(new QBuffer(ba)); + m_buffer->open(QIODevice::ReadWrite); + + m_device = m_buffer.data(); +} + +void BinaryStream::setTimeout(int timeout) +{ + m_timeout = timeout; +} + +bool BinaryStream::read(char* ptr, qint64 size) +{ + qint64 pos = 0; + + while (pos < size) { + if (m_device->bytesAvailable() == 0) { + if (!m_device->waitForReadyRead(m_timeout)) { + m_error = m_device->errorString(); + return false; + } + } + + qint64 nread = m_device->read(ptr + pos, size - pos); + + if (nread == -1) { + m_error = m_device->errorString(); + return false; + } + + pos += nread; + } + + return true; +} + +bool BinaryStream::read(QByteArray& ba) +{ + return read(ba.data(), ba.length()); +} + +bool BinaryStream::read(quint32& i) +{ + if (read(reinterpret_cast<char *>(&i), sizeof(i))) { + i = qFromBigEndian<quint32>(i); + return true; + } + + return false; +} + +bool BinaryStream::read(quint16& i) +{ + if (read(reinterpret_cast<char *>(&i), sizeof(i))) { + i = qFromBigEndian<quint16>(i); + return true; + } + + return false; +} + +bool BinaryStream::read(quint8& i) +{ + return read(reinterpret_cast<char *>(&i), sizeof(i)); +} + +bool BinaryStream::readString(QByteArray& ba) +{ + quint32 length; + + if (!read(length)) { + return false; + } + + ba.resize(length); + + if (!read(ba.data(), ba.length())) { + return false; + } + + return true; +} + +bool BinaryStream::readString(QString& str) +{ + QByteArray ba; + + if (!readString(ba)) { + return false; + } + + str = str.fromLatin1(ba); + return true; +} + + +bool BinaryStream::write(const char* ptr, qint64 size) +{ + if (m_device->write(ptr, size) < 0) { + m_error = m_device->errorString(); + return false; + } + + return true; +} + +bool BinaryStream::flush() +{ + if (!m_device->waitForBytesWritten(m_timeout)) { + m_error = m_device->errorString(); + return false; + } + + return true; +} + +bool BinaryStream::write(const QByteArray& ba) +{ + return write(ba.data(), ba.length()); +} + +bool BinaryStream::write(quint32 i) +{ + i = qToBigEndian<quint32>(i); + return write(reinterpret_cast<char *>(&i), sizeof(i)); +} + +bool BinaryStream::write(quint16 i) +{ + i = qToBigEndian<quint16>(i); + return write(reinterpret_cast<char *>(&i), sizeof(i)); +} + +bool BinaryStream::write(quint8 i) +{ + return write(reinterpret_cast<char *>(&i), sizeof(i)); +} + +bool BinaryStream::writeString(const QByteArray& ba) +{ + if (!write(static_cast<quint32>(ba.length()))) { + return false; + } + + if (!write(ba)) { + return false; + } + + return true; +} + +bool BinaryStream::writeString(const QString& s) +{ + return writeString(s.toLatin1()); +} diff --git a/src/sshagent/BinaryStream.h b/src/sshagent/BinaryStream.h new file mode 100644 index 000000000..c61010180 --- /dev/null +++ b/src/sshagent/BinaryStream.h @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2017 Toni Spets <toni.spets@iki.fi> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef BINARYSTREAM_H +#define BINARYSTREAM_H + +#include <QObject> +#include <QIODevice> +#include <QBuffer> + +class BinaryStream : QObject +{ + Q_OBJECT +public: + BinaryStream(QObject* parent = nullptr); + BinaryStream(QIODevice* device); + BinaryStream(QByteArray* ba, QObject* parent = nullptr); + ~BinaryStream(); + + const QString errorString() const; + QIODevice* device() const; + void setDevice(QIODevice* device); + void setData(QByteArray* ba); + void setTimeout(int timeout); + + bool read(QByteArray& ba); + bool read(quint32& i); + bool read(quint16& i); + bool read(quint8& i); + bool readString(QByteArray& ba); + bool readString(QString& s); + + bool write(const QByteArray& ba); + bool write(quint32 i); + bool write(quint16 i); + bool write(quint8 i); + bool writeString(const QByteArray& ba); + bool writeString(const QString& s); + + bool flush(); + +protected: + bool read(char* ptr, qint64 len); + bool write(const char* ptr, qint64 len); + +private: + int m_timeout; + QString m_error; + QIODevice* m_device; + QScopedPointer<QBuffer> m_buffer; +}; + +#endif // BINARYSTREAM_H diff --git a/src/sshagent/CMakeLists.txt b/src/sshagent/CMakeLists.txt new file mode 100644 index 000000000..1733e21b1 --- /dev/null +++ b/src/sshagent/CMakeLists.txt @@ -0,0 +1,15 @@ +if(WITH_XC_SSHAGENT) + set(sshagent_SOURCES + bcrypt_pbkdf.cpp + blowfish.c + AgentSettingsPage.cpp + AgentSettingsWidget.cpp + BinaryStream.cpp + KeeAgentSettings.cpp + OpenSSHKey.cpp + SSHAgent.cpp + ) + + add_library(sshagent STATIC ${sshagent_SOURCES}) + target_link_libraries(sshagent Qt5::Core Qt5::Widgets Qt5::Network ${GCRYPT_LIBRARIES}) +endif() diff --git a/src/sshagent/KeeAgentSettings.cpp b/src/sshagent/KeeAgentSettings.cpp new file mode 100644 index 000000000..218e98acb --- /dev/null +++ b/src/sshagent/KeeAgentSettings.cpp @@ -0,0 +1,278 @@ +/* + * Copyright (C) 2017 Toni Spets <toni.spets@iki.fi> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "KeeAgentSettings.h" + +KeeAgentSettings::KeeAgentSettings() + : m_allowUseOfSshKey(false) + , m_addAtDatabaseOpen(false) + , m_removeAtDatabaseClose(false) + , m_useConfirmConstraintWhenAdding(false) + , m_useLifetimeConstraintWhenAdding(false) + , m_lifetimeConstraintDuration(600) + , m_selectedType(QString("file")) + , m_attachmentName(QString()) + , m_saveAttachmentToTempFile(false) + , m_fileName(QString()) +{ + +} + +bool KeeAgentSettings::operator==(KeeAgentSettings& other) +{ + return (m_allowUseOfSshKey == other.m_allowUseOfSshKey + && m_addAtDatabaseOpen == other.m_addAtDatabaseOpen + && m_removeAtDatabaseClose == other.m_removeAtDatabaseClose + && m_useConfirmConstraintWhenAdding == other.m_useConfirmConstraintWhenAdding + && m_useLifetimeConstraintWhenAdding == other.m_useLifetimeConstraintWhenAdding + && m_lifetimeConstraintDuration == other.m_lifetimeConstraintDuration + && m_selectedType == other.m_selectedType + && m_attachmentName == other.m_attachmentName + && m_saveAttachmentToTempFile == other.m_saveAttachmentToTempFile + && m_fileName == other.m_fileName); +} + +bool KeeAgentSettings::operator!=(KeeAgentSettings& other) +{ + return !(*this == other); +} + +bool KeeAgentSettings::isDefault() +{ + KeeAgentSettings defaultSettings; + return (*this == defaultSettings); +} + +bool KeeAgentSettings::allowUseOfSshKey() const +{ + return m_allowUseOfSshKey; +} + +bool KeeAgentSettings::addAtDatabaseOpen() const +{ + return m_addAtDatabaseOpen; +} + +bool KeeAgentSettings::removeAtDatabaseClose() const +{ + return m_removeAtDatabaseClose; +} + +bool KeeAgentSettings::useConfirmConstraintWhenAdding() const +{ + return m_useConfirmConstraintWhenAdding; +} + +bool KeeAgentSettings::useLifetimeConstraintWhenAdding() const +{ + return m_useLifetimeConstraintWhenAdding; +} + +int KeeAgentSettings::lifetimeConstraintDuration() const +{ + return m_lifetimeConstraintDuration; +} + +const QString KeeAgentSettings::selectedType() const +{ + return m_selectedType; +} + +const QString KeeAgentSettings::attachmentName() const +{ + return m_attachmentName; +} + +bool KeeAgentSettings::saveAttachmentToTempFile() const +{ + return m_saveAttachmentToTempFile; +} + +const QString KeeAgentSettings::fileName() const +{ + return m_fileName; +} + +void KeeAgentSettings::setAllowUseOfSshKey(bool allowUseOfSshKey) +{ + m_allowUseOfSshKey = allowUseOfSshKey; +} + +void KeeAgentSettings::setAddAtDatabaseOpen(bool addAtDatabaseOpen) +{ + m_addAtDatabaseOpen = addAtDatabaseOpen; +} + +void KeeAgentSettings::setRemoveAtDatabaseClose(bool removeAtDatabaseClose) +{ + m_removeAtDatabaseClose = removeAtDatabaseClose; +} + +void KeeAgentSettings::setUseConfirmConstraintWhenAdding(bool useConfirmConstraintWhenAdding) +{ + m_useConfirmConstraintWhenAdding = useConfirmConstraintWhenAdding; +} + +void KeeAgentSettings::setUseLifetimeConstraintWhenAdding(bool useLifetimeConstraintWhenAdding) +{ + m_useLifetimeConstraintWhenAdding = useLifetimeConstraintWhenAdding; +} + +void KeeAgentSettings::setLifetimeConstraintDuration(int lifetimeConstraintDuration) +{ + m_lifetimeConstraintDuration = lifetimeConstraintDuration; +} + +void KeeAgentSettings::setSelectedType(const QString& selectedType) +{ + m_selectedType = selectedType; +} + +void KeeAgentSettings::setAttachmentName(const QString& attachmentName) +{ + m_attachmentName = attachmentName; +} + +void KeeAgentSettings::setSaveAttachmentToTempFile(bool saveAttachmentToTempFile) +{ + m_saveAttachmentToTempFile = saveAttachmentToTempFile; +} + +void KeeAgentSettings::setFileName(const QString& fileName) +{ + m_fileName = fileName; +} + +bool KeeAgentSettings::readBool(QXmlStreamReader& reader) +{ + reader.readNext(); + bool ret = (reader.text().startsWith("t", Qt::CaseInsensitive)); + reader.readNext(); // tag end + return ret; +} + +int KeeAgentSettings::readInt(QXmlStreamReader& reader) +{ + reader.readNext(); + int ret = reader.text().toInt(); + reader.readNext(); // tag end + return ret; +} + +bool KeeAgentSettings::fromXml(const QByteArray& ba) +{ + QXmlStreamReader reader; + reader.addData(ba); + + if (reader.error() || !reader.readNextStartElement()) { + return false; + } + + if (reader.qualifiedName() != "EntrySettings") { + return false; + } + + while (!reader.error() && reader.readNextStartElement()) { + if (reader.name() == "AllowUseOfSshKey") { + m_allowUseOfSshKey = readBool(reader); + } else if (reader.name() == "AddAtDatabaseOpen") { + m_addAtDatabaseOpen = readBool(reader); + } else if (reader.name() == "RemoveAtDatabaseClose") { + m_removeAtDatabaseClose = readBool(reader); + } else if (reader.name() == "UseConfirmConstraintWhenAdding") { + m_useConfirmConstraintWhenAdding = readBool(reader); + } else if (reader.name() == "UseLifetimeConstraintWhenAdding") { + m_useLifetimeConstraintWhenAdding = readBool(reader); + } else if (reader.name() == "LifetimeConstraintDuration") { + m_lifetimeConstraintDuration = readInt(reader); + } else if (reader.name() == "Location") { + while (!reader.error() && reader.readNextStartElement()) { + if (reader.name() == "SelectedType") { + reader.readNext(); + m_selectedType = reader.text().toString(); + reader.readNext(); + } else if (reader.name() == "AttachmentName") { + reader.readNext(); + m_attachmentName = reader.text().toString(); + reader.readNext(); + } else if (reader.name() == "SaveAttachmentToTempFile") { + m_saveAttachmentToTempFile = readBool(reader); + } else if (reader.name() == "FileName") { + reader.readNext(); + m_fileName = reader.text().toString(); + reader.readNext(); + } else { + qWarning() << "Skipping location element" << reader.name(); + reader.skipCurrentElement(); + } + } + } else { + qWarning() << "Skipping element" << reader.name(); + reader.skipCurrentElement(); + } + } + + return true; +} + +QByteArray KeeAgentSettings::toXml() +{ + QByteArray ba; + QXmlStreamWriter writer(&ba); + + // real KeeAgent can only read UTF-16 + writer.setCodec(QTextCodec::codecForName("UTF-16")); + writer.setAutoFormatting(true); + writer.setAutoFormattingIndent(2); + + writer.writeStartDocument(); + + writer.writeStartElement("EntrySettings"); + writer.writeAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema"); + writer.writeAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); + + writer.writeTextElement("AllowUseOfSshKey", m_allowUseOfSshKey ? "true" : "false"); + writer.writeTextElement("AddAtDatabaseOpen", m_addAtDatabaseOpen ? "true" : "false"); + writer.writeTextElement("RemoveAtDatabaseClose", m_removeAtDatabaseClose ? "true" : "false"); + writer.writeTextElement("UseConfirmConstraintWhenAdding", m_useConfirmConstraintWhenAdding ? "true" : "false"); + writer.writeTextElement("UseLifetimeConstraintWhenAdding", m_useLifetimeConstraintWhenAdding ? "true" : "false"); + writer.writeTextElement("LifetimeConstraintDuration", QString::number(m_lifetimeConstraintDuration)); + + writer.writeStartElement("Location"); + writer.writeTextElement("SelectedType", m_selectedType); + + if (!m_attachmentName.isEmpty()) { + writer.writeTextElement("AttachmentName", m_attachmentName); + } else { + writer.writeEmptyElement("AttachmentName"); + } + + writer.writeTextElement("SaveAttachmentToTempFile", m_saveAttachmentToTempFile ? "true" : "false"); + + if (!m_fileName.isEmpty()) { + writer.writeTextElement("FileName", m_fileName); + } else { + writer.writeEmptyElement("FileName"); + } + + writer.writeEndElement(); // Location + writer.writeEndElement(); // EntrySettings + writer.writeEndDocument(); + + return ba; +} diff --git a/src/sshagent/KeeAgentSettings.h b/src/sshagent/KeeAgentSettings.h new file mode 100644 index 000000000..4022750d1 --- /dev/null +++ b/src/sshagent/KeeAgentSettings.h @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2017 Toni Spets <toni.spets@iki.fi> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef KEEAGENTSETTINGS_H +#define KEEAGENTSETTINGS_H + +#include <QtCore> +#include <QXmlStreamReader> + +class KeeAgentSettings +{ +public: + KeeAgentSettings(); + + bool operator==(KeeAgentSettings& other); + bool operator!=(KeeAgentSettings& other); + bool isDefault(); + + bool fromXml(const QByteArray &ba); + QByteArray toXml(); + + bool allowUseOfSshKey() const; + bool addAtDatabaseOpen() const; + bool removeAtDatabaseClose() const; + bool useConfirmConstraintWhenAdding() const; + bool useLifetimeConstraintWhenAdding() const; + int lifetimeConstraintDuration() const; + + const QString selectedType() const; + const QString attachmentName() const; + bool saveAttachmentToTempFile() const; + const QString fileName() const; + + void setAllowUseOfSshKey(bool allowUseOfSshKey); + void setAddAtDatabaseOpen(bool addAtDatabaseOpen); + void setRemoveAtDatabaseClose(bool removeAtDatabaseClose); + void setUseConfirmConstraintWhenAdding(bool useConfirmConstraintWhenAdding); + void setUseLifetimeConstraintWhenAdding(bool useLifetimeConstraintWhenAdding); + void setLifetimeConstraintDuration(int lifetimeConstraintDuration); + + void setSelectedType(const QString& type); + void setAttachmentName(const QString& attachmentName); + void setSaveAttachmentToTempFile(bool); + void setFileName(const QString& fileName); + +private: + bool readBool(QXmlStreamReader& reader); + int readInt(QXmlStreamReader& reader); + + bool m_allowUseOfSshKey; + bool m_addAtDatabaseOpen; + bool m_removeAtDatabaseClose; + bool m_useConfirmConstraintWhenAdding; + bool m_useLifetimeConstraintWhenAdding; + int m_lifetimeConstraintDuration; + + // location + QString m_selectedType; + QString m_attachmentName; + bool m_saveAttachmentToTempFile; + QString m_fileName; +}; + +#endif // KEEAGENTSETTINGS_H diff --git a/src/sshagent/OpenSSHKey.cpp b/src/sshagent/OpenSSHKey.cpp new file mode 100644 index 000000000..2c51ee459 --- /dev/null +++ b/src/sshagent/OpenSSHKey.cpp @@ -0,0 +1,486 @@ +/* + * Copyright (C) 2017 Toni Spets <toni.spets@iki.fi> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "OpenSSHKey.h" +#include <QRegularExpression> +#include <QStringList> +#include <QCryptographicHash> +#include "crypto/SymmetricCipher.h" + +// bcrypt_pbkdf.cpp +int bcrypt_pbkdf(const QByteArray& pass, const QByteArray& salt, QByteArray& key, quint32 rounds); + +OpenSSHKey::OpenSSHKey(QObject *parent) + : QObject(parent) + , m_type(QString()) + , m_cipherName(QString("none")) + , m_kdfName(QString("none")) + , m_kdfOptions(QByteArray()) + , m_rawPrivateData(QByteArray()) + , m_publicData(QList<QByteArray>()) + , m_privateData(QList<QByteArray>()) + , m_comment(QString()) + , m_error(QString()) +{ + +} + +OpenSSHKey::OpenSSHKey(const OpenSSHKey& other) + : QObject(nullptr) + , m_type(other.m_type) + , m_cipherName(other.m_cipherName) + , m_kdfName(other.m_kdfName) + , m_kdfOptions(other.m_kdfOptions) + , m_rawPrivateData(other.m_rawPrivateData) + , m_publicData(other.m_publicData) + , m_privateData(other.m_privateData) + , m_comment(other.m_comment) + , m_error(other.m_error) +{ + +} + +bool OpenSSHKey::operator==(const OpenSSHKey& other) const +{ + // close enough for now + return (fingerprint() == other.fingerprint()); +} + +const QString OpenSSHKey::cipherName() const +{ + return m_cipherName; +} + +const QString OpenSSHKey::type() const +{ + return m_type; +} + +int OpenSSHKey::keyLength() const +{ + if (m_type == "ssh-dss" && m_publicData.length() == 4) { + return (m_publicData[0].length() - 1) * 8; + } else if (m_type == "ssh-rsa" && m_publicData.length() == 2) { + return (m_publicData[1].length() - 1) * 8; + } else if (m_type.startsWith("ecdsa-sha2-") && m_publicData.length() == 2) { + return (m_publicData[1].length() - 1) * 4; + } else if (m_type == "ssh-ed25519" && m_publicData.length() == 1) { + return m_publicData[0].length() * 8; + } + + return 0; +} + +const QString OpenSSHKey::fingerprint() const +{ + QByteArray publicKey; + BinaryStream stream(&publicKey); + + stream.writeString(m_type); + + for (QByteArray ba : m_publicData) { + stream.writeString(ba); + } + + QByteArray rawHash = QCryptographicHash::hash(publicKey, QCryptographicHash::Sha256); + + return "SHA256:" + QString::fromLatin1(rawHash.toBase64(QByteArray::OmitTrailingEquals)); +} + +const QString OpenSSHKey::comment() const +{ + return m_comment; +} + +const QString OpenSSHKey::publicKey() const +{ + QByteArray publicKey; + BinaryStream stream(&publicKey); + + stream.writeString(m_type); + + for (QByteArray ba : m_publicData) { + stream.writeString(ba); + } + + return m_type + " " + QString::fromLatin1(publicKey.toBase64()) + " " + m_comment; +} + +const QString OpenSSHKey::errorString() const +{ + return m_error; +} + +void OpenSSHKey::setType(const QString& type) +{ + m_type = type; +} + +void OpenSSHKey::setPublicData(const QList<QByteArray>& data) +{ + m_publicData = data; +} + +void OpenSSHKey::setPrivateData(const QList<QByteArray>& data) +{ + m_privateData = data; +} + +void OpenSSHKey::setComment(const QString& comment) +{ + m_comment = comment; +} + +void OpenSSHKey::clearPrivate() +{ + m_rawPrivateData.clear(); + m_privateData.clear(); +} + +bool OpenSSHKey::parsePEM(const QByteArray& in, QByteArray& out) +{ + QString pem = QString::fromLatin1(in); + QStringList rows = pem.split(QRegularExpression("(?:\r?\n|\r)"), QString::SkipEmptyParts); + + if (rows.length() < 3) { + m_error = tr("Invalid key file, expecting an OpenSSH key"); + return false; + } + + QString begin = rows.first(); + QString end = rows.last(); + + QRegularExpressionMatch beginMatch = QRegularExpression("^-----BEGIN ([^\\-]+)-----$").match(begin); + QRegularExpressionMatch endMatch = QRegularExpression("^-----END ([^\\-]+)-----$").match(end); + + if (!beginMatch.hasMatch() || !endMatch.hasMatch()) { + m_error = tr("Invalid key file, expecting an OpenSSH key"); + return false; + } + + if (beginMatch.captured(1) != endMatch.captured(1)) { + m_error = tr("PEM boundary mismatch"); + return false; + } + + if (beginMatch.captured(1) != "OPENSSH PRIVATE KEY") { + m_error = tr("This is not an OpenSSH key, only modern keys are supported"); + return false; + } + + rows.removeFirst(); + rows.removeLast(); + + out = QByteArray::fromBase64(rows.join("").toLatin1()); + + if (out.isEmpty()) { + m_error = tr("Base64 decoding failed"); + return false; + } + + return true; +} + +bool OpenSSHKey::parse(const QByteArray& in) +{ + QByteArray data; + + if (!parsePEM(in, data)) { + return false; + } + + BinaryStream stream(&data); + + QByteArray magic; + magic.resize(15); + + if (!stream.read(magic)) { + m_error = tr("Key file way too small."); + return false; + } + + if (QString::fromLatin1(magic) != "openssh-key-v1") { + m_error = tr("Key file magic header id invalid"); + return false; + } + + stream.readString(m_cipherName); + stream.readString(m_kdfName); + stream.readString(m_kdfOptions); + + quint32 numberOfKeys; + stream.read(numberOfKeys); + + if (numberOfKeys == 0) { + m_error = tr("Found zero keys"); + return false; + } + + for (quint32 i = 0; i < numberOfKeys; ++i) { + QByteArray publicKey; + if (!stream.readString(publicKey)) { + m_error = tr("Failed to read public key."); + return false; + } + + if (i == 0) { + BinaryStream publicStream(&publicKey); + if (!readPublic(publicStream)) { + return false; + } + } + } + + // padded list of keys + if (!stream.readString(m_rawPrivateData)) { + m_error = tr("Corrupted key file, reading private key failed"); + return false; + } + + // load private if no encryption + if (!encrypted()) { + return openPrivateKey(); + } + + return true; +} + +bool OpenSSHKey::encrypted() const +{ + return (m_cipherName != "none"); +} + +bool OpenSSHKey::openPrivateKey(const QString& passphrase) +{ + QScopedPointer<SymmetricCipher> cipher; + + if (!m_privateData.isEmpty()) { + return true; + } + + if (m_rawPrivateData.isEmpty()) { + m_error = tr("No private key payload to decrypt"); + return false; + } + + if (m_cipherName == "aes256-cbc") { + cipher.reset(new SymmetricCipher(SymmetricCipher::Aes256, SymmetricCipher::Cbc, SymmetricCipher::Decrypt)); + } else if (m_cipherName == "aes256-ctr") { + cipher.reset(new SymmetricCipher(SymmetricCipher::Aes256, SymmetricCipher::Ctr, SymmetricCipher::Decrypt)); + } else if (m_cipherName != "none") { + m_error = tr("Unknown cipher: ") + m_cipherName; + return false; + } + + if (m_kdfName == "bcrypt") { + if (!cipher) { + m_error = tr("Trying to run KDF without cipher"); + return false; + } + + if (passphrase.length() == 0) { + m_error = tr("Passphrase is required to decrypt this key"); + return false; + } + + BinaryStream optionStream(&m_kdfOptions); + + QByteArray salt; + quint32 rounds; + + optionStream.readString(salt); + optionStream.read(rounds); + + QByteArray decryptKey; + decryptKey.fill(0, cipher->keySize() + cipher->blockSize()); + + QByteArray phraseData = passphrase.toLatin1(); + if (bcrypt_pbkdf(phraseData, salt, decryptKey, rounds) < 0) { + m_error = tr("Key derivation failed, key file corrupted?"); + return false; + } + + QByteArray keyData, ivData; + keyData.setRawData(decryptKey.data(), cipher->keySize()); + ivData.setRawData(decryptKey.data() + cipher->keySize(), cipher->blockSize()); + + cipher->init(keyData, ivData); + } else if (m_kdfName != "none") { + m_error = tr("Unknown KDF: ") + m_kdfName; + return false; + } + + QByteArray rawPrivateData = m_rawPrivateData; + + if (cipher && cipher->isInitalized()) { + bool ok = false; + rawPrivateData = cipher->process(rawPrivateData, &ok); + if (!ok) { + m_error = tr("Decryption failed, wrong passphrase?"); + return false; + } + } + + BinaryStream keyStream(&rawPrivateData); + + quint32 checkInt1; + quint32 checkInt2; + + keyStream.read(checkInt1); + keyStream.read(checkInt2); + + if (checkInt1 != checkInt2) { + m_error = tr("Decryption failed, wrong passphrase?"); + return false; + } + + return readPrivate(keyStream); +} + +bool OpenSSHKey::readPublic(BinaryStream& stream) +{ + m_publicData.clear(); + + if (!stream.readString(m_type)) { + m_error = tr("Unexpected EOF while reading public key"); + return false; + } + + int keyParts; + if (m_type == "ssh-dss") { + keyParts = 4; + } else if (m_type == "ssh-rsa") { + keyParts = 2; + } else if (m_type.startsWith("ecdsa-sha2-")) { + keyParts = 2; + } else if (m_type == "ssh-ed25519") { + keyParts = 1; + } else { + m_error = tr("Unknown key type: ") + m_type; + return false; + } + + for (int i = 0; i < keyParts; ++i) { + QByteArray t; + + if (!stream.readString(t)) { + m_error = tr("Unexpected EOF while reading public key"); + return false; + } + + m_publicData.append(t); + } + + return true; +} + +bool OpenSSHKey::readPrivate(BinaryStream& stream) +{ + m_privateData.clear(); + + if (!stream.readString(m_type)) { + m_error = tr("Unexpected EOF while reading private key"); + return false; + } + + int keyParts; + if (m_type == "ssh-dss") { + keyParts = 5; + } else if (m_type == "ssh-rsa") { + keyParts = 6; + } else if (m_type.startsWith("ecdsa-sha2-")) { + keyParts = 3; + } else if (m_type == "ssh-ed25519") { + keyParts = 2; + } else { + m_error = tr("Unknown key type: ") + m_type; + return false; + } + + for (int i = 0; i < keyParts; ++i) { + QByteArray t; + + if (!stream.readString(t)) { + m_error = tr("Unexpected EOF while reading private key"); + return false; + } + + m_privateData.append(t); + } + + if (!stream.readString(m_comment)) { + m_error = tr("Unexpected EOF while reading private key"); + return false; + } + + return true; +} + +bool OpenSSHKey::writePublic(BinaryStream& stream) +{ + if (m_publicData.isEmpty()) { + m_error = tr("Can't write public key as it is empty"); + return false; + } + + if (!stream.writeString(m_type)) { + m_error = tr("Unexpected EOF when writing public key"); + return false; + } + + for (QByteArray t : m_publicData) { + if (!stream.writeString(t)) { + m_error = tr("Unexpected EOF when writing public key"); + return false; + } + } + + return true; +} + +bool OpenSSHKey::writePrivate(BinaryStream& stream) +{ + if (m_privateData.isEmpty()) { + m_error = tr("Can't write private key as it is empty"); + return false; + } + + if (!stream.writeString(m_type)) { + m_error = tr("Unexpected EOF when writing private key"); + return false; + } + + for (QByteArray t : m_privateData) { + if (!stream.writeString(t)) { + m_error = tr("Unexpected EOF when writing private key"); + return false; + } + } + + if (!stream.writeString(m_comment)) { + m_error = tr("Unexpected EOF when writing private key"); + return false; + } + + return true; +} + +uint qHash(const OpenSSHKey& key) +{ + return qHash(key.fingerprint()); +} diff --git a/src/sshagent/OpenSSHKey.h b/src/sshagent/OpenSSHKey.h new file mode 100644 index 000000000..eca6c9edd --- /dev/null +++ b/src/sshagent/OpenSSHKey.h @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2017 Toni Spets <toni.spets@iki.fi> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef OPENSSHKEY_H +#define OPENSSHKEY_H + +#include <QtCore> +#include "BinaryStream.h" + +class OpenSSHKey : QObject +{ + Q_OBJECT +public: + explicit OpenSSHKey(QObject* parent = nullptr); + OpenSSHKey(const OpenSSHKey& other); + bool operator==(const OpenSSHKey& other) const; + + bool parse(const QByteArray& in); + bool encrypted() const; + bool openPrivateKey(const QString& passphrase = QString()); + + const QString cipherName() const; + const QString type() const; + int keyLength() const; + const QString fingerprint() const; + const QString comment() const; + const QString publicKey() const; + const QString errorString() const; + + void setType(const QString& type); + void setPublicData(const QList<QByteArray>& data); + void setPrivateData(const QList<QByteArray>& data); + void setComment(const QString& comment); + + void clearPrivate(); + + bool readPublic(BinaryStream& stream); + bool readPrivate(BinaryStream& stream); + bool writePublic(BinaryStream& stream); + bool writePrivate(BinaryStream& stream); + +private: + bool parsePEM(const QByteArray& in, QByteArray& out); + + QString m_type; + QString m_cipherName; + QString m_kdfName; + QByteArray m_kdfOptions; + QByteArray m_rawPrivateData; + QList<QByteArray> m_publicData; + QList<QByteArray> m_privateData; + QString m_comment; + QString m_error; +}; + +uint qHash(const OpenSSHKey& key); + +#endif // OPENSSHKEY_H diff --git a/src/sshagent/SSHAgent.cpp b/src/sshagent/SSHAgent.cpp new file mode 100644 index 000000000..a398eb4be --- /dev/null +++ b/src/sshagent/SSHAgent.cpp @@ -0,0 +1,272 @@ +/* + * Copyright (C) 2017 Toni Spets <toni.spets@iki.fi> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "SSHAgent.h" +#include "BinaryStream.h" +#include "KeeAgentSettings.h" + +#ifndef Q_OS_WIN +#include <QtNetwork> +#else +#include <windows.h> +#endif + +SSHAgent* SSHAgent::m_instance; + +SSHAgent::SSHAgent(QObject* parent) : QObject(parent) +{ +#ifndef Q_OS_WIN + m_socketPath = QProcessEnvironment::systemEnvironment().value("SSH_AUTH_SOCK"); +#endif +} + +SSHAgent::~SSHAgent() +{ + for (QSet<OpenSSHKey> keys : m_keys.values()) { + for (OpenSSHKey key : keys) { + removeIdentity(key); + } + } +} + +SSHAgent* SSHAgent::instance() +{ + if (m_instance == nullptr) { + qFatal("Race condition: instance wanted before it was initialized, this is a bug."); + } + + return m_instance; +} + +void SSHAgent::init(QObject* parent) +{ + m_instance = new SSHAgent(parent); +} + +bool SSHAgent::isAgentRunning() const +{ +#ifndef Q_OS_WIN + return !m_socketPath.isEmpty(); +#else + return (FindWindowA("Pageant", "Pageant") != nullptr); +#endif +} + +bool SSHAgent::sendMessage(const QByteArray& in, QByteArray& out) const +{ +#ifndef Q_OS_WIN + QLocalSocket socket; + BinaryStream stream(&socket); + + socket.connectToServer(m_socketPath); + if (!socket.waitForConnected(500)) { + return false; + } + + stream.writeString(in); + stream.flush(); + + if (!stream.readString(out)) { + return false; + } + + socket.close(); + + return true; +#else + HWND hWnd = FindWindowA("Pageant", "Pageant"); + + if (!hWnd) { + return false; + } + + if (in.length() > AGENT_MAX_MSGLEN - 4) { + return false; + } + + QByteArray mapName = (QString("SSHAgentRequest") + reinterpret_cast<intptr_t>(QThread::currentThreadId())).toLatin1(); + + HANDLE handle = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, AGENT_MAX_MSGLEN, mapName.data()); + + if (!handle) { + return false; + } + + LPVOID ptr = MapViewOfFile(handle, FILE_MAP_WRITE, 0, 0, 0); + + if (!ptr) { + CloseHandle(handle); + return false; + } + + quint32 *requestLength = reinterpret_cast<quint32*>(ptr); + void *requestData = reinterpret_cast<void*>(reinterpret_cast<char*>(ptr) + 4); + + *requestLength = qToBigEndian<quint32>(in.length()); + memcpy(requestData, in.data(), in.length()); + + COPYDATASTRUCT data; + data.dwData = AGENT_COPYDATA_ID; + data.cbData = mapName.length() + 1; + data.lpData = reinterpret_cast<LPVOID>(mapName.data()); + + LRESULT res = SendMessageA(hWnd, WM_COPYDATA, 0, reinterpret_cast<LPARAM>(&data)); + + if (res) { + quint32 responseLength = qFromBigEndian<quint32>(*requestLength); + if (responseLength <= AGENT_MAX_MSGLEN) { + out.resize(responseLength); + memcpy(out.data(), requestData, responseLength); + } + } + + UnmapViewOfFile(ptr); + CloseHandle(handle); + + return (res > 0); +#endif +} + + +bool SSHAgent::addIdentity(OpenSSHKey& key, quint32 lifetime, bool confirm) const +{ + QByteArray requestData; + BinaryStream request(&requestData); + + request.write((lifetime > 0 || confirm) ? SSH_AGENTC_ADD_ID_CONSTRAINED : SSH_AGENTC_ADD_IDENTITY); + key.writePrivate(request); + + if (lifetime > 0) { + request.write(SSH_AGENT_CONSTRAIN_LIFETIME); + request.write(lifetime); + } + + if (confirm) { + request.write(SSH_AGENT_CONSTRAIN_CONFIRM); + } + + QByteArray responseData; + sendMessage(requestData, responseData); + + if (responseData.length() < 1 || static_cast<quint8>(responseData[0]) != SSH_AGENT_SUCCESS) { + return false; + } + + return true; +} + +bool SSHAgent::removeIdentity(OpenSSHKey& key) const +{ + QByteArray requestData; + BinaryStream request(&requestData); + + QByteArray keyData; + BinaryStream keyStream(&keyData); + key.writePublic(keyStream); + + request.write(SSH_AGENTC_REMOVE_IDENTITY); + request.writeString(keyData); + + QByteArray responseData; + sendMessage(requestData, responseData); + + if (responseData.length() < 1 || static_cast<quint8>(responseData[0]) != SSH_AGENT_SUCCESS) { + return false; + } + + return true; +} + +void SSHAgent::removeIdentityAtLock(const OpenSSHKey& key, const Uuid& uuid) +{ + OpenSSHKey copy = key; + copy.clearPrivate(); + m_keys[uuid.toHex()].insert(copy); +} + +void SSHAgent::databaseModeChanged(DatabaseWidget::Mode mode) +{ + DatabaseWidget* widget = qobject_cast<DatabaseWidget*>(sender()); + + if (widget == nullptr) { + return; + } + + Uuid uuid = widget->database()->uuid(); + + if (mode == DatabaseWidget::LockedMode && m_keys.contains(uuid.toHex())) { + QSet<OpenSSHKey> keys = m_keys.take(uuid.toHex()); + for (OpenSSHKey key : keys) { + removeIdentity(key); + } + } else if (mode == DatabaseWidget::ViewMode && !m_keys.contains(uuid.toHex())) { + for (Entry* e : widget->database()->rootGroup()->entriesRecursive()) { + + if (!e->attachments()->hasKey("KeeAgent.settings")) + continue; + + KeeAgentSettings settings; + settings.fromXml(e->attachments()->value("KeeAgent.settings")); + + if (!settings.allowUseOfSshKey()) { + continue; + } + + QByteArray keyData; + if (settings.selectedType() == "attachment") { + keyData = e->attachments()->value(settings.attachmentName()); + } else if (!settings.fileName().isEmpty()) { + QFile file(settings.fileName()); + + if (file.size() > 1024 * 1024) { + continue; + } + + if (!file.open(QIODevice::ReadOnly)) { + continue; + } + + keyData = file.readAll(); + } + + if (keyData.isEmpty()) { + continue; + } + + OpenSSHKey key; + + if (!key.parse(keyData)) { + continue; + } + + if (settings.removeAtDatabaseClose()) { + removeIdentityAtLock(key, uuid); + } + + if (settings.addAtDatabaseOpen() && key.openPrivateKey(e->password())) { + int lifetime = 0; + + if (settings.useLifetimeConstraintWhenAdding()) { + lifetime = settings.lifetimeConstraintDuration(); + } + + addIdentity(key, lifetime, settings.useConfirmConstraintWhenAdding()); + } + } + } +} diff --git a/src/sshagent/SSHAgent.h b/src/sshagent/SSHAgent.h new file mode 100644 index 000000000..e96f59e59 --- /dev/null +++ b/src/sshagent/SSHAgent.h @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2017 Toni Spets <toni.spets@iki.fi> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef AGENTCLIENT_H +#define AGENTCLIENT_H + +#include <QtCore> +#include <QList> +#include "OpenSSHKey.h" + +#include "gui/DatabaseWidget.h" + +class SSHAgent : public QObject +{ + Q_OBJECT + +public: + static SSHAgent* instance(); + static void init(QObject* parent); + + bool isAgentRunning() const; + bool addIdentity(OpenSSHKey& key, quint32 lifetime = 0, bool confirm = false) const; + bool removeIdentity(OpenSSHKey& key) const; + void removeIdentityAtLock(const OpenSSHKey& key, const Uuid& uuid); + +public slots: + void databaseModeChanged(DatabaseWidget::Mode mode = DatabaseWidget::LockedMode); + +private: + const quint8 SSH_AGENT_FAILURE = 5; + const quint8 SSH_AGENT_SUCCESS = 6; + const quint8 SSH_AGENTC_REQUEST_IDENTITIES = 11; + const quint8 SSH_AGENT_IDENTITIES_ANSWER = 12; + const quint8 SSH_AGENTC_ADD_IDENTITY = 17; + const quint8 SSH_AGENTC_REMOVE_IDENTITY = 18; + const quint8 SSH_AGENTC_ADD_ID_CONSTRAINED = 25; + + const quint8 SSH_AGENT_CONSTRAIN_LIFETIME = 1; + const quint8 SSH_AGENT_CONSTRAIN_CONFIRM = 2; + + explicit SSHAgent(QObject* parent = nullptr); + ~SSHAgent(); + + bool sendMessage(const QByteArray& in, QByteArray& out) const; + + static SSHAgent* m_instance; + +#ifndef Q_OS_WIN + QString m_socketPath; +#else + const int AGENT_MAX_MSGLEN = 8192; + const quint32 AGENT_COPYDATA_ID = 0x804e50ba; +#endif + + QMap<QString, QSet<OpenSSHKey>> m_keys; +}; + +#endif // AGENTCLIENT_H diff --git a/src/sshagent/bcrypt_pbkdf.cpp b/src/sshagent/bcrypt_pbkdf.cpp new file mode 100644 index 000000000..fed4cdb29 --- /dev/null +++ b/src/sshagent/bcrypt_pbkdf.cpp @@ -0,0 +1,172 @@ +/* $OpenBSD: bcrypt_pbkdf.c,v 1.13 2015/01/12 03:20:04 tedu Exp $ */ +/* + * Copyright (c) 2013 Ted Unangst <tedu@openbsd.org> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <QtCore> + +extern "C" { +#include "blf.h" +} + +#define MINIMUM(a,b) (((a) < (b)) ? (a) : (b)) + +/* + * pkcs #5 pbkdf2 implementation using the "bcrypt" hash + * + * The bcrypt hash function is derived from the bcrypt password hashing + * function with the following modifications: + * 1. The input password and salt are preprocessed with SHA512. + * 2. The output length is expanded to 256 bits. + * 3. Subsequently the magic string to be encrypted is lengthened and modifed + * to "OxychromaticBlowfishSwatDynamite" + * 4. The hash function is defined to perform 64 rounds of initial state + * expansion. (More rounds are performed by iterating the hash.) + * + * Note that this implementation pulls the SHA512 operations into the caller + * as a performance optimization. + * + * One modification from official pbkdf2. Instead of outputting key material + * linearly, we mix it. pbkdf2 has a known weakness where if one uses it to + * generate (e.g.) 512 bits of key material for use as two 256 bit keys, an + * attacker can merely run once through the outer loop, but the user + * always runs it twice. Shuffling output bytes requires computing the + * entirety of the key material to assemble any subkey. This is something a + * wise caller could do; we just do it for you. + */ + +#define BCRYPT_WORDS 8 +#define BCRYPT_HASHSIZE (BCRYPT_WORDS * 4) +#define SHA512_DIGEST_LENGTH 64 + +// FIXME: explicit_bzero exists to ensure bzero is not optimized out +#define explicit_bzero bzero + +static void +bcrypt_hash(const quint8* sha2pass, const quint8* sha2salt, quint8* out) +{ + blf_ctx state; + quint8 ciphertext[BCRYPT_HASHSIZE] = // "OxychromaticBlowfishSwatDynamite" + { 0x4f, 0x78, 0x79, 0x63, 0x68, 0x72, 0x6f, 0x6d, + 0x61, 0x74, 0x69, 0x63, 0x42, 0x6c, 0x6f, 0x77, + 0x66, 0x69, 0x73, 0x68, 0x53, 0x77, 0x61, 0x74, + 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x74, 0x65 }; + quint32 cdata[BCRYPT_WORDS]; + int i; + quint16 j; + size_t shalen = SHA512_DIGEST_LENGTH; + + /* key expansion */ + Blowfish_initstate(&state); + Blowfish_expandstate(&state, sha2salt, shalen, sha2pass, shalen); + for (i = 0; i < 64; i++) { + Blowfish_expand0state(&state, sha2salt, shalen); + Blowfish_expand0state(&state, sha2pass, shalen); + } + + /* encryption */ + j = 0; + for (i = 0; i < BCRYPT_WORDS; i++) + cdata[i] = Blowfish_stream2word(ciphertext, sizeof(ciphertext), + &j); + for (i = 0; i < 64; i++) + blf_enc(&state, cdata, sizeof(cdata) / sizeof(uint64_t)); + + /* copy out */ + for (i = 0; i < BCRYPT_WORDS; i++) { + out[4 * i + 3] = (cdata[i] >> 24) & 0xff; + out[4 * i + 2] = (cdata[i] >> 16) & 0xff; + out[4 * i + 1] = (cdata[i] >> 8) & 0xff; + out[4 * i + 0] = cdata[i] & 0xff; + } + + /* zap */ + explicit_bzero(ciphertext, sizeof(ciphertext)); + explicit_bzero(cdata, sizeof(cdata)); + explicit_bzero(&state, sizeof(state)); +} + +int bcrypt_pbkdf(const QByteArray& pass, const QByteArray& salt, QByteArray& key, quint32 rounds) +{ + QCryptographicHash ctx(QCryptographicHash::Sha512); + QByteArray sha2pass; + QByteArray sha2salt; + quint8 out[BCRYPT_HASHSIZE]; + quint8 tmpout[BCRYPT_HASHSIZE]; + quint8 countsalt[4]; + + /* nothing crazy */ + if (rounds < 1) { + return -1; + } + + if (pass.isEmpty() || salt.isEmpty() || key.isEmpty() || + static_cast<quint32>(key.length()) > sizeof(out) * sizeof(out)) { + return -1; + } + + quint32 stride = (key.length() + sizeof(out) - 1) / sizeof(out); + quint32 amt = (key.length() + stride - 1) / stride; + + /* collapse password */ + ctx.reset(); + ctx.addData(pass); + sha2pass = ctx.result(); + + /* generate key, sizeof(out) at a time */ + for (quint32 count = 1, keylen = key.length(); keylen > 0; count++) { + countsalt[0] = (count >> 24) & 0xff; + countsalt[1] = (count >> 16) & 0xff; + countsalt[2] = (count >> 8) & 0xff; + countsalt[3] = count & 0xff; + + /* first round, salt is salt */ + ctx.reset(); + ctx.addData(salt); + ctx.addData(reinterpret_cast<char *>(countsalt), sizeof(countsalt)); + sha2salt = ctx.result(); + + bcrypt_hash(reinterpret_cast<quint8 *>(sha2pass.data()), reinterpret_cast<quint8 *>(sha2salt.data()), tmpout); + memcpy(out, tmpout, sizeof(out)); + + for (quint32 i = 1; i < rounds; i++) { + /* subsequent rounds, salt is previous output */ + ctx.reset(); + ctx.addData(reinterpret_cast<char *>(tmpout), sizeof(tmpout)); + sha2salt = ctx.result(); + bcrypt_hash(reinterpret_cast<quint8 *>(sha2pass.data()), reinterpret_cast<quint8 *>(sha2salt.data()), tmpout); + for (quint32 j = 0; j < sizeof(out); j++) + out[j] ^= tmpout[j]; + } + + /* + * pbkdf2 deviation: output the key material non-linearly. + */ + amt = MINIMUM(amt, keylen); + quint32 i; + for (i = 0; i < amt; i++) { + int dest = i * stride + (count - 1); + if (dest >= key.length()) + break; + key.data()[dest] = out[i]; + } + keylen -= i; + } + + /* zap */ + explicit_bzero(out, sizeof(out)); + + return 0; +} diff --git a/src/sshagent/blf.h b/src/sshagent/blf.h new file mode 100644 index 000000000..4878e5588 --- /dev/null +++ b/src/sshagent/blf.h @@ -0,0 +1,98 @@ +/* $OpenBSD: blf.h,v 1.7 2007/03/14 17:59:41 grunk Exp $ */ +/* + * Blowfish - a fast block cipher designed by Bruce Schneier + * + * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Niels Provos. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _BLF_H_ +#define _BLF_H_ + +#ifdef _WIN32 + +#include <stdint.h> + +typedef uint32_t u_int32_t; +typedef uint16_t u_int16_t; +typedef uint8_t u_int8_t; + +#define bzero(p,s) memset(p, 0, s) + +#endif + +#if !defined(HAVE_BCRYPT_PBKDF) && !defined(HAVE_BLH_H) + +/* Schneier specifies a maximum key length of 56 bytes. + * This ensures that every key bit affects every cipher + * bit. However, the subkeys can hold up to 72 bytes. + * Warning: For normal blowfish encryption only 56 bytes + * of the key affect all cipherbits. + */ + +#define BLF_N 16 /* Number of Subkeys */ +#define BLF_MAXKEYLEN ((BLF_N-2)*4) /* 448 bits */ +#define BLF_MAXUTILIZED ((BLF_N+2)*4) /* 576 bits */ + +/* Blowfish context */ +typedef struct BlowfishContext { + u_int32_t S[4][256]; /* S-Boxes */ + u_int32_t P[BLF_N + 2]; /* Subkeys */ +} blf_ctx; + +/* Raw access to customized Blowfish + * blf_key is just: + * Blowfish_initstate( state ) + * Blowfish_expand0state( state, key, keylen ) + */ + +void Blowfish_encipher(blf_ctx *, u_int32_t *, u_int32_t *); +void Blowfish_decipher(blf_ctx *, u_int32_t *, u_int32_t *); +void Blowfish_initstate(blf_ctx *); +void Blowfish_expand0state(blf_ctx *, const u_int8_t *, u_int16_t); +void Blowfish_expandstate +(blf_ctx *, const u_int8_t *, u_int16_t, const u_int8_t *, u_int16_t); + +/* Standard Blowfish */ + +void blf_key(blf_ctx *, const u_int8_t *, u_int16_t); +void blf_enc(blf_ctx *, u_int32_t *, u_int16_t); +void blf_dec(blf_ctx *, u_int32_t *, u_int16_t); + +void blf_ecb_encrypt(blf_ctx *, u_int8_t *, u_int32_t); +void blf_ecb_decrypt(blf_ctx *, u_int8_t *, u_int32_t); + +void blf_cbc_encrypt(blf_ctx *, u_int8_t *, u_int8_t *, u_int32_t); +void blf_cbc_decrypt(blf_ctx *, u_int8_t *, u_int8_t *, u_int32_t); + +/* Converts u_int8_t to u_int32_t */ +u_int32_t Blowfish_stream2word(const u_int8_t *, u_int16_t , u_int16_t *); + +#endif /* !defined(HAVE_BCRYPT_PBKDF) && !defined(HAVE_BLH_H) */ +#endif /* _BLF_H */ + diff --git a/src/sshagent/blowfish.c b/src/sshagent/blowfish.c new file mode 100644 index 000000000..02e9ac0bd --- /dev/null +++ b/src/sshagent/blowfish.c @@ -0,0 +1,696 @@ +/* $OpenBSD: blowfish.c,v 1.18 2004/11/02 17:23:26 hshoexer Exp $ */ +/* + * Blowfish block cipher for OpenBSD + * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de> + * All rights reserved. + * + * Implementation advice by David Mazieres <dm@lcs.mit.edu>. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Niels Provos. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * This code is derived from section 14.3 and the given source + * in section V of Applied Cryptography, second edition. + * Blowfish is an unpatented fast block cipher designed by + * Bruce Schneier. + */ + +#define HAVE_BLF_H + +#if !defined(HAVE_BCRYPT_PBKDF) && (!defined(HAVE_BLOWFISH_INITSTATE) || \ + !defined(HAVE_BLOWFISH_EXPAND0STATE) || !defined(HAVE_BLF_ENC)) + +#if 0 +#include <stdio.h> /* used for debugging */ +#include <string.h> +#endif + +#include <sys/types.h> +#ifdef HAVE_BLF_H +#include "blf.h" +#endif + +#undef inline +#ifdef __GNUC__ +#define inline __inline +#else /* !__GNUC__ */ +#define inline +#endif /* !__GNUC__ */ + +/* Function for Feistel Networks */ + +#define F(s, x) ((((s)[ (((x)>>24)&0xFF)] \ + + (s)[0x100 + (((x)>>16)&0xFF)]) \ + ^ (s)[0x200 + (((x)>> 8)&0xFF)]) \ + + (s)[0x300 + ( (x) &0xFF)]) + +#define BLFRND(s,p,i,j,n) (i ^= F(s,j) ^ (p)[n]) + +void +Blowfish_encipher(blf_ctx *c, u_int32_t *xl, u_int32_t *xr) +{ + u_int32_t Xl; + u_int32_t Xr; + u_int32_t *s = c->S[0]; + u_int32_t *p = c->P; + + Xl = *xl; + Xr = *xr; + + Xl ^= p[0]; + BLFRND(s, p, Xr, Xl, 1); BLFRND(s, p, Xl, Xr, 2); + BLFRND(s, p, Xr, Xl, 3); BLFRND(s, p, Xl, Xr, 4); + BLFRND(s, p, Xr, Xl, 5); BLFRND(s, p, Xl, Xr, 6); + BLFRND(s, p, Xr, Xl, 7); BLFRND(s, p, Xl, Xr, 8); + BLFRND(s, p, Xr, Xl, 9); BLFRND(s, p, Xl, Xr, 10); + BLFRND(s, p, Xr, Xl, 11); BLFRND(s, p, Xl, Xr, 12); + BLFRND(s, p, Xr, Xl, 13); BLFRND(s, p, Xl, Xr, 14); + BLFRND(s, p, Xr, Xl, 15); BLFRND(s, p, Xl, Xr, 16); + + *xl = Xr ^ p[17]; + *xr = Xl; +} + +void +Blowfish_decipher(blf_ctx *c, u_int32_t *xl, u_int32_t *xr) +{ + u_int32_t Xl; + u_int32_t Xr; + u_int32_t *s = c->S[0]; + u_int32_t *p = c->P; + + Xl = *xl; + Xr = *xr; + + Xl ^= p[17]; + BLFRND(s, p, Xr, Xl, 16); BLFRND(s, p, Xl, Xr, 15); + BLFRND(s, p, Xr, Xl, 14); BLFRND(s, p, Xl, Xr, 13); + BLFRND(s, p, Xr, Xl, 12); BLFRND(s, p, Xl, Xr, 11); + BLFRND(s, p, Xr, Xl, 10); BLFRND(s, p, Xl, Xr, 9); + BLFRND(s, p, Xr, Xl, 8); BLFRND(s, p, Xl, Xr, 7); + BLFRND(s, p, Xr, Xl, 6); BLFRND(s, p, Xl, Xr, 5); + BLFRND(s, p, Xr, Xl, 4); BLFRND(s, p, Xl, Xr, 3); + BLFRND(s, p, Xr, Xl, 2); BLFRND(s, p, Xl, Xr, 1); + + *xl = Xr ^ p[0]; + *xr = Xl; +} + +void +Blowfish_initstate(blf_ctx *c) +{ + /* P-box and S-box tables initialized with digits of Pi */ + + static const blf_ctx initstate = + { { + { + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, + 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, + 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, + 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, + 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, + 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, + 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, + 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, + 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, + 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, + 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, + 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, + 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, + 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, + 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, + 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, + 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, + 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, + 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, + 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, + 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, + 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, + 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, + 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, + 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, + 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, + 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, + 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, + 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, + 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, + 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, + 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, + 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, + 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, + 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, + 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, + 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, + 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, + 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, + 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, + 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, + 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, + 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, + 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, + 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, + 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, + 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, + 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, + 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, + 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, + 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, + 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, + 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, + 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, + 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, + 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, + 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, + 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, + 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a}, + { + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, + 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, + 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, + 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, + 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, + 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, + 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, + 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, + 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, + 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, + 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, + 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, + 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, + 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, + 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, + 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, + 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, + 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, + 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, + 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, + 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, + 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, + 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, + 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, + 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, + 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, + 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, + 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, + 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, + 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, + 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, + 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, + 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, + 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, + 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, + 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, + 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, + 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, + 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, + 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, + 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, + 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, + 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, + 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, + 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, + 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, + 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, + 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, + 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, + 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, + 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, + 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, + 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, + 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, + 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, + 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, + 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, + 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, + 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, + 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7}, + { + 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, + 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, + 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, + 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, + 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, + 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, + 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, + 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, + 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, + 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, + 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, + 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, + 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, + 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, + 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, + 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, + 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, + 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, + 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, + 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, + 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, + 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, + 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, + 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, + 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, + 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, + 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, + 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, + 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, + 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, + 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, + 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, + 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, + 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, + 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, + 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, + 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, + 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, + 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, + 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, + 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, + 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, + 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, + 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, + 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, + 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, + 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, + 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, + 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, + 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, + 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, + 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, + 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, + 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, + 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, + 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, + 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, + 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, + 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, + 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, + 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, + 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0}, + { + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, + 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, + 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, + 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, + 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, + 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, + 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, + 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, + 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, + 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, + 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, + 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, + 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, + 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, + 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, + 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, + 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, + 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, + 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, + 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, + 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, + 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, + 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, + 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, + 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, + 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, + 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, + 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, + 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, + 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, + 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, + 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, + 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, + 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, + 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, + 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, + 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, + 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, + 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, + 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, + 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, + 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, + 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, + 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, + 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, + 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, + 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, + 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, + 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, + 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, + 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, + 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, + 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, + 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, + 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, + 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, + 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, + 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, + 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, + 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6} + }, + { + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, + 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, + 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, + 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, + 0x9216d5d9, 0x8979fb1b + } }; + + *c = initstate; +} + +u_int32_t +Blowfish_stream2word(const u_int8_t *data, u_int16_t databytes, + u_int16_t *current) +{ + u_int8_t i; + u_int16_t j; + u_int32_t temp; + + temp = 0x00000000; + j = *current; + + for (i = 0; i < 4; i++, j++) { + if (j >= databytes) + j = 0; + temp = (temp << 8) | data[j]; + } + + *current = j; + return temp; +} + +void +Blowfish_expand0state(blf_ctx *c, const u_int8_t *key, u_int16_t keybytes) +{ + u_int16_t i; + u_int16_t j; + u_int16_t k; + u_int32_t temp; + u_int32_t datal; + u_int32_t datar; + + j = 0; + for (i = 0; i < BLF_N + 2; i++) { + /* Extract 4 int8 to 1 int32 from keystream */ + temp = Blowfish_stream2word(key, keybytes, &j); + c->P[i] = c->P[i] ^ temp; + } + + j = 0; + datal = 0x00000000; + datar = 0x00000000; + for (i = 0; i < BLF_N + 2; i += 2) { + Blowfish_encipher(c, &datal, &datar); + + c->P[i] = datal; + c->P[i + 1] = datar; + } + + for (i = 0; i < 4; i++) { + for (k = 0; k < 256; k += 2) { + Blowfish_encipher(c, &datal, &datar); + + c->S[i][k] = datal; + c->S[i][k + 1] = datar; + } + } +} + + +void +Blowfish_expandstate(blf_ctx *c, const u_int8_t *data, u_int16_t databytes, + const u_int8_t *key, u_int16_t keybytes) +{ + u_int16_t i; + u_int16_t j; + u_int16_t k; + u_int32_t temp; + u_int32_t datal; + u_int32_t datar; + + j = 0; + for (i = 0; i < BLF_N + 2; i++) { + /* Extract 4 int8 to 1 int32 from keystream */ + temp = Blowfish_stream2word(key, keybytes, &j); + c->P[i] = c->P[i] ^ temp; + } + + j = 0; + datal = 0x00000000; + datar = 0x00000000; + for (i = 0; i < BLF_N + 2; i += 2) { + datal ^= Blowfish_stream2word(data, databytes, &j); + datar ^= Blowfish_stream2word(data, databytes, &j); + Blowfish_encipher(c, &datal, &datar); + + c->P[i] = datal; + c->P[i + 1] = datar; + } + + for (i = 0; i < 4; i++) { + for (k = 0; k < 256; k += 2) { + datal ^= Blowfish_stream2word(data, databytes, &j); + datar ^= Blowfish_stream2word(data, databytes, &j); + Blowfish_encipher(c, &datal, &datar); + + c->S[i][k] = datal; + c->S[i][k + 1] = datar; + } + } + +} + +void +blf_key(blf_ctx *c, const u_int8_t *k, u_int16_t len) +{ + /* Initialize S-boxes and subkeys with Pi */ + Blowfish_initstate(c); + + /* Transform S-boxes and subkeys with key */ + Blowfish_expand0state(c, k, len); +} + +void +blf_enc(blf_ctx *c, u_int32_t *data, u_int16_t blocks) +{ + u_int32_t *d; + u_int16_t i; + + d = data; + for (i = 0; i < blocks; i++) { + Blowfish_encipher(c, d, d + 1); + d += 2; + } +} + +void +blf_dec(blf_ctx *c, u_int32_t *data, u_int16_t blocks) +{ + u_int32_t *d; + u_int16_t i; + + d = data; + for (i = 0; i < blocks; i++) { + Blowfish_decipher(c, d, d + 1); + d += 2; + } +} + +void +blf_ecb_encrypt(blf_ctx *c, u_int8_t *data, u_int32_t len) +{ + u_int32_t l, r; + u_int32_t i; + + for (i = 0; i < len; i += 8) { + l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]; + r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]; + Blowfish_encipher(c, &l, &r); + data[0] = l >> 24 & 0xff; + data[1] = l >> 16 & 0xff; + data[2] = l >> 8 & 0xff; + data[3] = l & 0xff; + data[4] = r >> 24 & 0xff; + data[5] = r >> 16 & 0xff; + data[6] = r >> 8 & 0xff; + data[7] = r & 0xff; + data += 8; + } +} + +void +blf_ecb_decrypt(blf_ctx *c, u_int8_t *data, u_int32_t len) +{ + u_int32_t l, r; + u_int32_t i; + + for (i = 0; i < len; i += 8) { + l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]; + r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]; + Blowfish_decipher(c, &l, &r); + data[0] = l >> 24 & 0xff; + data[1] = l >> 16 & 0xff; + data[2] = l >> 8 & 0xff; + data[3] = l & 0xff; + data[4] = r >> 24 & 0xff; + data[5] = r >> 16 & 0xff; + data[6] = r >> 8 & 0xff; + data[7] = r & 0xff; + data += 8; + } +} + +void +blf_cbc_encrypt(blf_ctx *c, u_int8_t *iv, u_int8_t *data, u_int32_t len) +{ + u_int32_t l, r; + u_int32_t i, j; + + for (i = 0; i < len; i += 8) { + for (j = 0; j < 8; j++) + data[j] ^= iv[j]; + l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]; + r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]; + Blowfish_encipher(c, &l, &r); + data[0] = l >> 24 & 0xff; + data[1] = l >> 16 & 0xff; + data[2] = l >> 8 & 0xff; + data[3] = l & 0xff; + data[4] = r >> 24 & 0xff; + data[5] = r >> 16 & 0xff; + data[6] = r >> 8 & 0xff; + data[7] = r & 0xff; + iv = data; + data += 8; + } +} + +void +blf_cbc_decrypt(blf_ctx *c, u_int8_t *iva, u_int8_t *data, u_int32_t len) +{ + u_int32_t l, r; + u_int8_t *iv; + u_int32_t i, j; + + iv = data + len - 16; + data = data + len - 8; + for (i = len - 8; i >= 8; i -= 8) { + l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]; + r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]; + Blowfish_decipher(c, &l, &r); + data[0] = l >> 24 & 0xff; + data[1] = l >> 16 & 0xff; + data[2] = l >> 8 & 0xff; + data[3] = l & 0xff; + data[4] = r >> 24 & 0xff; + data[5] = r >> 16 & 0xff; + data[6] = r >> 8 & 0xff; + data[7] = r & 0xff; + for (j = 0; j < 8; j++) + data[j] ^= iv[j]; + iv -= 8; + data -= 8; + } + l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]; + r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]; + Blowfish_decipher(c, &l, &r); + data[0] = l >> 24 & 0xff; + data[1] = l >> 16 & 0xff; + data[2] = l >> 8 & 0xff; + data[3] = l & 0xff; + data[4] = r >> 24 & 0xff; + data[5] = r >> 16 & 0xff; + data[6] = r >> 8 & 0xff; + data[7] = r & 0xff; + for (j = 0; j < 8; j++) + data[j] ^= iva[j]; +} + +#if 0 +void +report(u_int32_t data[], u_int16_t len) +{ + u_int16_t i; + for (i = 0; i < len; i += 2) + printf("Block %0hd: %08lx %08lx.\n", + i / 2, data[i], data[i + 1]); +} +void +main(void) +{ + + blf_ctx c; + char key[] = "AAAAA"; + char key2[] = "abcdefghijklmnopqrstuvwxyz"; + + u_int32_t data[10]; + u_int32_t data2[] = + {0x424c4f57l, 0x46495348l}; + + u_int16_t i; + + /* First test */ + for (i = 0; i < 10; i++) + data[i] = i; + + blf_key(&c, (u_int8_t *) key, 5); + blf_enc(&c, data, 5); + blf_dec(&c, data, 1); + blf_dec(&c, data + 2, 4); + printf("Should read as 0 - 9.\n"); + report(data, 10); + + /* Second test */ + blf_key(&c, (u_int8_t *) key2, strlen(key2)); + blf_enc(&c, data2, 1); + printf("\nShould read as: 0x324ed0fe 0xf413a203.\n"); + report(data2, 2); + blf_dec(&c, data2, 1); + report(data2, 2); +} +#endif + +#endif /* !defined(HAVE_BCRYPT_PBKDF) && (!defined(HAVE_BLOWFISH_INITSTATE) || \ + !defined(HAVE_BLOWFISH_EXPAND0STATE) || !defined(HAVE_BLF_ENC)) */ + diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index c1f1adf41..c36eefd4a 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -13,7 +13,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. -include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/src) +include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/src ${CMAKE_CURRENT_BINARY_DIR}/../src) add_definitions(-DQT_TEST_LIB) @@ -155,6 +155,11 @@ if(WITH_XC_AUTOTYPE) set_target_properties(testautotype PROPERTIES ENABLE_EXPORTS ON) endif() +if(WITH_XC_SSHAGENT) + add_unit_test(NAME testopensshkey SOURCES TestOpenSSHKey.cpp + LIBS sshagent ${TEST_LIBRARIES}) +endif() + add_unit_test(NAME testentry SOURCES TestEntry.cpp LIBS ${TEST_LIBRARIES}) diff --git a/tests/TestOpenSSHKey.cpp b/tests/TestOpenSSHKey.cpp new file mode 100644 index 000000000..52cf4dbf5 --- /dev/null +++ b/tests/TestOpenSSHKey.cpp @@ -0,0 +1,124 @@ +/* + * Copyright (C) 2017 Toni Spets <toni.spets@iki.fi> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "TestOpenSSHKey.h" +#include "sshagent/OpenSSHKey.h" +#include <QTest> + +QTEST_GUILESS_MAIN(TestOpenSSHKey) + +void TestOpenSSHKey::testParse() +{ + // mixed line endings and missing ones are intentional, we only require 3 lines total + const QString keyString = QString( + "\r\n\r" + "-----BEGIN OPENSSH PRIVATE KEY-----\n" + "b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW" + "QyNTUxOQAAACDdlO5F2kF2WzedrBAHBi9wBHeISzXZ0IuIqrp0EzeazAAAAKjgCfj94An4" + "/QAAAAtzc2gtZWQyNTUxOQAAACDdlO5F2kF2WzedrBAHBi9wBHeISzXZ0IuIqrp0EzeazA" + "AAAEBe1iilZFho8ZGAliiSj5URvFtGrgvmnEKdiLZow5hOR92U7kXaQXZbN52sEAcGL3AE" + "d4hLNdnQi4iqunQTN5rMAAAAH29wZW5zc2hrZXktdGVzdC1wYXJzZUBrZWVwYXNzeGMBAg" + "MEBQY=\r" + "-----END OPENSSH PRIVATE KEY-----\r\n\r" + ); + + const QByteArray keyData = keyString.toLatin1(); + + OpenSSHKey key; + QVERIFY(key.parse(keyData)); + QVERIFY(!key.encrypted()); + QCOMPARE(key.cipherName(), QString("none")); + QCOMPARE(key.type(), QString("ssh-ed25519")); + QCOMPARE(key.comment(), QString("opensshkey-test-parse@keepassxc")); + + QByteArray publicKey, privateKey; + BinaryStream publicStream(&publicKey), privateStream(&privateKey); + + QVERIFY(key.writePublic(publicStream)); + QVERIFY(key.writePrivate(privateStream)); + + QVERIFY(publicKey.length() == 51); + QVERIFY(privateKey.length() == 154); +} + +void TestOpenSSHKey::testDecryptAES256CBC() +{ + const QString keyString = QString( + "-----BEGIN OPENSSH PRIVATE KEY-----\n" + "b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jYmMAAAAGYmNyeXB0AAAAGAAAABD2A0agtd\n" + "oGtJiI9JvIxYbTAAAAEAAAAAEAAAAzAAAAC3NzaC1lZDI1NTE5AAAAIDPvDXmi0w1rdMoX\n" + "fOeyZ0Q/v+wqq/tPFgJwxnW5ADtfAAAAsC3UPsf035hrF5SgZ48p55iDFPiyGfZC/C3vQx\n" + "+THzpQo8DTUmFokdPn8wvDYGQoIcr9q0RzJuKV87eMQf3zzvZfJthtLYBlt330Deivv9AQ\n" + "MbKdhPZ4SfwRvv0grgT2EVId3GQAPgSVBhXYQTOf2CdmbXV4kieFLTmSsBMy+v6Qn5Rqur\n" + "PDWBwuLQgamcVDZuhrkUEqIVJZU2zAiRU2oAXsw/XOgFV6+Y5UZmLwWJQZ\n" + "-----END OPENSSH PRIVATE KEY-----\n" + ); + + const QByteArray keyData = keyString.toLatin1(); + + OpenSSHKey key; + QVERIFY(key.parse(keyData)); + QVERIFY(key.encrypted()); + QCOMPARE(key.cipherName(), QString("aes256-cbc")); + QVERIFY(!key.openPrivateKey("incorrectpassphrase")); + QVERIFY(key.openPrivateKey("correctpassphrase")); + QCOMPARE(key.type(), QString("ssh-ed25519")); + QCOMPARE(key.comment(), QString("opensshkey-test-aes256cbc@keepassxc")); + + QByteArray publicKey, privateKey; + BinaryStream publicStream(&publicKey), privateStream(&privateKey); + + QVERIFY(key.writePublic(publicStream)); + QVERIFY(key.writePrivate(privateStream)); + + QVERIFY(publicKey.length() == 51); + QVERIFY(privateKey.length() == 158); +} + +void TestOpenSSHKey::testDecryptAES256CTR() +{ + const QString keyString = QString( + "-----BEGIN OPENSSH PRIVATE KEY-----\n" + "b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jdHIAAAAGYmNyeXB0AAAAGAAAABAMhIAypt\n" + "WP4tZJBmMwq0tTAAAAEAAAAAEAAAAzAAAAC3NzaC1lZDI1NTE5AAAAIErNsS8ROy43XoWC\n" + "nO9Sn2lEFBJYcDVtRPM1t6WB7W7OAAAAsFKXMOlPILoTmMj2JmcqzjaYAhaCezx18HDp76\n" + "VrNxaZTd0T28EGFSkzrReeewpJWy/bWlhLoXR5fRyOSSto+iMg/pibIvIJMrD5sqxlxr/e\n" + "c5lSeSZUzIK8Rv+ou/3EFDcY5jp8hVXqA4qNtoM/3fV52vmwlNje5d1V5Gsr4U8443+i+p\n" + "swqksozfatkynk51uR/9QFoOJKlsL/Z3LkK1S/apYz/K331iU1f5ozFELf\n" + "-----END OPENSSH PRIVATE KEY-----\n" + ); + + const QByteArray keyData = keyString.toLatin1(); + + OpenSSHKey key; + QVERIFY(key.parse(keyData)); + QVERIFY(key.encrypted()); + QCOMPARE(key.cipherName(), QString("aes256-ctr")); + QVERIFY(!key.openPrivateKey("incorrectpassphrase")); + QVERIFY(key.openPrivateKey("correctpassphrase")); + QCOMPARE(key.type(), QString("ssh-ed25519")); + QCOMPARE(key.comment(), QString("opensshkey-test-aes256ctr@keepassxc")); + + QByteArray publicKey, privateKey; + BinaryStream publicStream(&publicKey), privateStream(&privateKey); + + QVERIFY(key.writePublic(publicStream)); + QVERIFY(key.writePrivate(privateStream)); + + QVERIFY(publicKey.length() == 51); + QVERIFY(privateKey.length() == 158); +} diff --git a/tests/TestOpenSSHKey.h b/tests/TestOpenSSHKey.h new file mode 100644 index 000000000..92a071f6a --- /dev/null +++ b/tests/TestOpenSSHKey.h @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2017 Toni Spets <toni.spets@iki.fi> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef TESTOPENSSHKEY_H +#define TESTOPENSSHKEY_H + +#include <QObject> + +class OpenSSHKey; + +class TestOpenSSHKey : public QObject +{ + Q_OBJECT + +private slots: + void testParse(); + void testDecryptAES256CBC(); + void testDecryptAES256CTR(); +}; + +#endif // TESTOPENSSHKEY_H From 3b8d49104c35a0a85ef8511e1d563037ef505673 Mon Sep 17 00:00:00 2001 From: Weslly <weslly.honorato@gmail.com> Date: Mon, 20 Nov 2017 04:26:53 -0200 Subject: [PATCH 106/402] Focus database unlock dialog on macOS, fix #1023 --- src/autotype/AutoType.cpp | 7 +++++++ src/autotype/AutoType.h | 1 + src/gui/DatabaseWidget.cpp | 6 ++++++ 3 files changed, 14 insertions(+) diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp index 2519b9dcb..0d01a8311 100644 --- a/src/autotype/AutoType.cpp +++ b/src/autotype/AutoType.cpp @@ -256,6 +256,13 @@ void AutoType::resetInAutoType() m_inAutoType = false; } +void AutoType::raiseWindow() +{ +#if defined(Q_OS_MAC) + m_plugin->raiseOwnWindow(); +#endif +} + void AutoType::unloadPlugin() { if (m_executor) { diff --git a/src/autotype/AutoType.h b/src/autotype/AutoType.h index 6f4a815f8..e881975ac 100644 --- a/src/autotype/AutoType.h +++ b/src/autotype/AutoType.h @@ -51,6 +51,7 @@ public: public slots: void performGlobalAutoType(const QList<Database*>& dbList); + void raiseWindow(); signals: void globalShortcutTriggered(); diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index a610cf506..e5110e30a 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -1400,6 +1400,12 @@ void DatabaseWidget::showUnlockDialog() { m_unlockDatabaseDialog->clearForms(); m_unlockDatabaseDialog->setDBFilename(m_filename); + +#if defined(Q_OS_MAC) + autoType()->raiseWindow(); + Tools::wait(500); +#endif + m_unlockDatabaseDialog->show(); m_unlockDatabaseDialog->activateWindow(); } From f0a34de3c0d9e6453fdc8a261ae68f16c69bb553 Mon Sep 17 00:00:00 2001 From: Weslly <weslly.honorato@gmail.com> Date: Mon, 20 Nov 2017 15:36:30 -0200 Subject: [PATCH 107/402] Revert 5bc000c to fix startup delay --- src/gui/entry/EditEntryWidgetMain.ui | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/gui/entry/EditEntryWidgetMain.ui b/src/gui/entry/EditEntryWidgetMain.ui index 2c9aa59b7..dc07603aa 100644 --- a/src/gui/entry/EditEntryWidgetMain.ui +++ b/src/gui/entry/EditEntryWidgetMain.ui @@ -127,12 +127,6 @@ <height>100</height> </size> </property> - <property name="font"> - <font> - <family>Monospace</family> - <pointsize>10</pointsize> - </font> - </property> </widget> </item> <item row="9" column="1"> From dc7322cc4a08b64e72bf19e3b48502db682a65f6 Mon Sep 17 00:00:00 2001 From: Weslly <weslly.honorato@gmail.com> Date: Mon, 20 Nov 2017 01:38:48 -0200 Subject: [PATCH 108/402] Improve macOS pasteboard handling --- src/CMakeLists.txt | 2 + src/core/MacPasteboard.cpp | 94 ++++++++++++++++++++++++++++++++++++++ src/core/MacPasteboard.h | 37 +++++++++++++++ src/gui/Clipboard.cpp | 11 +++++ 4 files changed, 144 insertions(+) create mode 100644 src/core/MacPasteboard.cpp create mode 100644 src/core/MacPasteboard.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 092a2102d..24742edef 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -155,6 +155,8 @@ if(APPLE) set(keepassx_SOURCES ${keepassx_SOURCES} core/ScreenLockListenerMac.h core/ScreenLockListenerMac.cpp + core/MacPasteboard.h + core/MacPasteboard.cpp ) endif() if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") diff --git a/src/core/MacPasteboard.cpp b/src/core/MacPasteboard.cpp new file mode 100644 index 000000000..98dc6f7ab --- /dev/null +++ b/src/core/MacPasteboard.cpp @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "MacPasteboard.h" + +QString MacPasteboard::convertorName() { return QLatin1String("MacPasteboard"); } + +QString MacPasteboard::flavorFor(const QString& mimetype) { + if (mimetype == QLatin1String("text/plain")) { + return QLatin1String("public.utf8-plain-text"); + } else if (mimetype == QLatin1String("application/x-nspasteboard-concealed-type")) { + return QLatin1String("org.nspasteboard.ConcealedType"); + } + + int i = mimetype.indexOf(QLatin1String("charset=")); + + if (i >= 0) { + QString cs(mimetype.mid(i + 8).toLower()); + i = cs.indexOf(QLatin1Char(';')); + + if (i >= 0) { + cs = cs.left(i); + } + + if (cs == QLatin1String("system")) { + return QLatin1String("public.utf8-plain-text"); + } else if (cs == QLatin1String("iso-10646-ucs-2") || + cs == QLatin1String("utf16")) { + return QLatin1String("public.utf16-plain-text"); + } + } + return QString(); +} + +QString MacPasteboard::mimeFor(QString flavor) { + if (flavor == QLatin1String("public.utf8-plain-text")) + return QLatin1String("text/plain"); + if (flavor == QLatin1String("org.nspasteboard.ConcealedType")) + return QLatin1String("application/x-nspasteboard-concealed-type"); + if (flavor == QLatin1String("public.utf16-plain-text")) + return QLatin1String("text/plain;charset=utf16"); + return QString(); +} + +bool MacPasteboard::canConvert(const QString& mimetype, QString flavor) { + Q_UNUSED(mimetype); + Q_UNUSED(flavor); + return true; +} + +QVariant MacPasteboard::convertToMime(const QString& mimetype, QList<QByteArray> data, QString flavor) { + if (data.count() > 1) + qWarning("QMime::convertToMime: Cannot handle multiple member data"); + const QByteArray& firstData = data.first(); + QVariant ret; + if (flavor == QLatin1String("public.utf8-plain-text")) { + ret = QString::fromUtf8(firstData); + } else if (flavor == QLatin1String("org.nspasteboard.ConcealedType")) { + ret = QString::fromUtf8(firstData); + } else if (flavor == QLatin1String("public.utf16-plain-text")) { + ret = QTextCodec::codecForName("UTF-16")->toUnicode(firstData); + } else { + qWarning("QMime::convertToMime: unhandled mimetype: %s", + qPrintable(mimetype)); + } + return ret; +} + +QList<QByteArray> MacPasteboard::convertFromMime(const QString&, QVariant data, QString flavor) { + QList<QByteArray> ret; + QString string = data.toString(); + if (flavor == QLatin1String("public.utf8-plain-text")) + ret.append(string.toUtf8()); + else if (flavor == QLatin1String("org.nspasteboard.ConcealedType")) + ret.append(string.toUtf8()); + else if (flavor == QLatin1String("public.utf16-plain-text")) + ret.append(QTextCodec::codecForName("UTF-16")->fromUnicode(string)); + return ret; +} + diff --git a/src/core/MacPasteboard.h b/src/core/MacPasteboard.h new file mode 100644 index 000000000..15e99616c --- /dev/null +++ b/src/core/MacPasteboard.h @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef KEEPASSXC_MACPASTEBOARD_H +#define KEEPASSXC_MACPASTEBOARD_H + +#include <QMacPasteboardMime> +#include <QTextCodec> + +class MacPasteboard : public QMacPasteboardMime +{ +public: + explicit MacPasteboard() : QMacPasteboardMime(MIME_ALL) {} + + QString convertorName(); + bool canConvert(const QString &mime, QString flav); + QString mimeFor(QString flav); + QString flavorFor(const QString &mime); + QVariant convertToMime(const QString &mime, QList<QByteArray> data, QString flav); + QList<QByteArray> convertFromMime(const QString &mime, QVariant data, QString flav); +}; + +#endif // KEEPASSXC_MACPASTEBOARD_H diff --git a/src/gui/Clipboard.cpp b/src/gui/Clipboard.cpp index bf4db8ff5..a62385728 100644 --- a/src/gui/Clipboard.cpp +++ b/src/gui/Clipboard.cpp @@ -22,6 +22,9 @@ #include <QTimer> #include "core/Config.h" +#ifdef Q_OS_MAC +#include "core/MacPasteboard.h" +#endif Clipboard* Clipboard::m_instance(nullptr); @@ -38,10 +41,18 @@ void Clipboard::setText(const QString& text) { QClipboard* clipboard = QApplication::clipboard(); +#ifdef Q_OS_MAC + new MacPasteboard; + QMimeData* mime = new QMimeData; + mime->setText(text); + mime->setData("application/x-nspasteboard-concealed-type", text.toUtf8()); + clipboard->setMimeData(mime, QClipboard::Clipboard); +#else clipboard->setText(text, QClipboard::Clipboard); if (clipboard->supportsSelection()) { clipboard->setText(text, QClipboard::Selection); } +#endif if (config()->get("security/clearclipboard").toBool()) { int timeout = config()->get("security/clearclipboardtimeout").toInt(); From 806248ebd4a2ab68c159029ea94597c731c72414 Mon Sep 17 00:00:00 2001 From: Weslly <weslly.honorato@gmail.com> Date: Mon, 20 Nov 2017 16:50:56 -0200 Subject: [PATCH 109/402] Review fixes --- src/core/MacPasteboard.h | 12 ++++++------ src/gui/Clipboard.cpp | 17 +++++++++++++---- src/gui/Clipboard.h | 7 +++++++ 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/core/MacPasteboard.h b/src/core/MacPasteboard.h index 15e99616c..8461cbc5d 100644 --- a/src/core/MacPasteboard.h +++ b/src/core/MacPasteboard.h @@ -26,12 +26,12 @@ class MacPasteboard : public QMacPasteboardMime public: explicit MacPasteboard() : QMacPasteboardMime(MIME_ALL) {} - QString convertorName(); - bool canConvert(const QString &mime, QString flav); - QString mimeFor(QString flav); - QString flavorFor(const QString &mime); - QVariant convertToMime(const QString &mime, QList<QByteArray> data, QString flav); - QList<QByteArray> convertFromMime(const QString &mime, QVariant data, QString flav); + QString convertorName() override; + bool canConvert(const QString &mime, QString flav) override; + QString mimeFor(QString flav) override; + QString flavorFor(const QString &mime) override; + QVariant convertToMime(const QString &mime, QList<QByteArray> data, QString flav) override; + QList<QByteArray> convertFromMime(const QString &mime, QVariant data, QString flav) override; }; #endif // KEEPASSXC_MACPASTEBOARD_H diff --git a/src/gui/Clipboard.cpp b/src/gui/Clipboard.cpp index a62385728..a35f59b19 100644 --- a/src/gui/Clipboard.cpp +++ b/src/gui/Clipboard.cpp @@ -22,9 +22,6 @@ #include <QTimer> #include "core/Config.h" -#ifdef Q_OS_MAC -#include "core/MacPasteboard.h" -#endif Clipboard* Clipboard::m_instance(nullptr); @@ -33,16 +30,28 @@ Clipboard::Clipboard(QObject* parent) , m_timer(new QTimer(this)) { m_timer->setSingleShot(true); +#ifdef Q_OS_MAC + m_pasteboard = new MacPasteboard; +#endif + connect(m_timer, SIGNAL(timeout()), SLOT(clearClipboard())); connect(qApp, SIGNAL(aboutToQuit()), SLOT(clearCopiedText())); } +Clipboard::~Clipboard() +{ +#ifdef Q_OS_MAC + if (m_pasteboard) { + delete m_pasteboard; + } +#endif +} + void Clipboard::setText(const QString& text) { QClipboard* clipboard = QApplication::clipboard(); #ifdef Q_OS_MAC - new MacPasteboard; QMimeData* mime = new QMimeData; mime->setText(text); mime->setData("application/x-nspasteboard-concealed-type", text.toUtf8()); diff --git a/src/gui/Clipboard.h b/src/gui/Clipboard.h index e0a16d26d..68f4e0485 100644 --- a/src/gui/Clipboard.h +++ b/src/gui/Clipboard.h @@ -19,6 +19,9 @@ #define KEEPASSX_CLIPBOARD_H #include <QObject> +#ifdef Q_OS_MAC +#include "core/MacPasteboard.h" +#endif class QTimer; @@ -28,6 +31,7 @@ class Clipboard : public QObject public: void setText(const QString& text); + ~Clipboard(); static Clipboard* instance(); @@ -43,6 +47,9 @@ private: static Clipboard* m_instance; QTimer* m_timer; +#ifdef Q_OS_MAC + MacPasteboard* m_pasteboard; +#endif QString m_lastCopied; }; From afe48da4b182e71b204d33c5f9a8f8d43cffc074 Mon Sep 17 00:00:00 2001 From: Weslly <weslly.honorato@gmail.com> Date: Mon, 20 Nov 2017 17:25:27 -0200 Subject: [PATCH 110/402] Change MacPasteboard init object to QScopedPointer --- src/gui/Clipboard.cpp | 16 +++------------- src/gui/Clipboard.h | 3 +-- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/src/gui/Clipboard.cpp b/src/gui/Clipboard.cpp index a35f59b19..78bad2731 100644 --- a/src/gui/Clipboard.cpp +++ b/src/gui/Clipboard.cpp @@ -28,25 +28,15 @@ Clipboard* Clipboard::m_instance(nullptr); Clipboard::Clipboard(QObject* parent) : QObject(parent) , m_timer(new QTimer(this)) +#ifdef Q_OS_MAC + , m_pasteboard(new MacPasteboard) +#endif { m_timer->setSingleShot(true); -#ifdef Q_OS_MAC - m_pasteboard = new MacPasteboard; -#endif - connect(m_timer, SIGNAL(timeout()), SLOT(clearClipboard())); connect(qApp, SIGNAL(aboutToQuit()), SLOT(clearCopiedText())); } -Clipboard::~Clipboard() -{ -#ifdef Q_OS_MAC - if (m_pasteboard) { - delete m_pasteboard; - } -#endif -} - void Clipboard::setText(const QString& text) { QClipboard* clipboard = QApplication::clipboard(); diff --git a/src/gui/Clipboard.h b/src/gui/Clipboard.h index 68f4e0485..6f8ff9ace 100644 --- a/src/gui/Clipboard.h +++ b/src/gui/Clipboard.h @@ -31,7 +31,6 @@ class Clipboard : public QObject public: void setText(const QString& text); - ~Clipboard(); static Clipboard* instance(); @@ -48,7 +47,7 @@ private: QTimer* m_timer; #ifdef Q_OS_MAC - MacPasteboard* m_pasteboard; + QScopedPointer<MacPasteboard> m_pasteboard; #endif QString m_lastCopied; }; From 8ca52ba8f9856cc015f4421bfcfef6eeec3f4b85 Mon Sep 17 00:00:00 2001 From: Joel Smith <joesmith@redhat.com> Date: Mon, 20 Nov 2017 11:01:22 -0700 Subject: [PATCH 111/402] Add initial Steam TOTP support * Add the concept of custom TOTP encoders, each with potential for custom code alphabet, length, step interval and code direction (i.e. reversed) * Select custom encoder via overload of the digits field of a loaded entry * Allow selection of custom encoders via the "TOTP Settings" field's size, as currently done by KeeTrayTOTP for Steam. Use "S" for the short name of the Steam custom encoder * Allow selection of custom encoders via the "otp" field by appending a "&encoder=<name>" field to the URL query. For example, "&encoder=steam" * Update TOTP set-up dialog to permit selection between (default, steam, custom) settings. --- src/core/Entry.cpp | 33 +++++++++++--- src/gui/DatabaseWidget.cpp | 2 + src/gui/DetailsWidget.cpp | 2 +- src/gui/SetupTotpDialog.cpp | 49 ++++++++++++++++----- src/gui/SetupTotpDialog.h | 3 ++ src/gui/SetupTotpDialog.ui | 42 +++++++++++++++--- src/gui/TotpDialog.cpp | 4 +- src/totp/totp.cpp | 60 +++++++++++++++++++++++--- src/totp/totp.h | 21 ++++++++- tests/TestTotp.cpp | 86 +++++++++++++++++++++++++++++++++++++ tests/TestTotp.h | 2 + 11 files changed, 270 insertions(+), 34 deletions(-) diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index 91d757a91..eab79d6aa 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -25,6 +25,8 @@ #include "core/Metadata.h" #include "totp/totp.h" +#include <QRegularExpression> + const int Entry::DefaultIconNumber = 0; const int Entry::ResolveMaximumDepth = 10; @@ -332,12 +334,24 @@ void Entry::setTotp(const QString& seed, quint8& step, quint8& digits) if (digits == 0) { digits = QTotp::defaultDigits; } + QString data; + + const QTotp::Encoder & enc = QTotp::encoders.value(digits, QTotp::defaultEncoder); if (m_attributes->hasKey("otp")) { - m_attributes->set("otp", QString("key=%1&step=%2&size=%3").arg(seed).arg(step).arg(digits), true); + data = QString("key=%1&step=%2&size=%3").arg(seed).arg(step).arg(enc.digits == 0 ? digits : enc.digits); + if (!enc.name.isEmpty()) { + data.append("&enocder=").append(enc.name); + } + m_attributes->set("otp", data, true); } else { m_attributes->set("TOTP Seed", seed, true); - m_attributes->set("TOTP Settings", QString("%1;%2").arg(step).arg(digits)); + if (!enc.shortName.isEmpty()) { + data = QString("%1;%2").arg(step).arg(enc.shortName); + } else { + data = QString("%1;%2").arg(step).arg(digits); + } + m_attributes->set("TOTP Settings", data); } } @@ -355,11 +369,16 @@ QString Entry::totpSeed() const m_data.totpStep = QTotp::defaultStep; if (m_attributes->hasKey("TOTP Settings")) { - QRegExp rx("(\\d+);(\\d)", Qt::CaseInsensitive, QRegExp::RegExp); - int pos = rx.indexIn(m_attributes->value("TOTP Settings")); - if (pos > -1) { - m_data.totpStep = rx.cap(1).toUInt(); - m_data.totpDigits = rx.cap(2).toUInt(); + // this regex must be kept in sync with the set of allowed short names QTotp::shortNameToEncoder + QRegularExpression rx(QString("(\\d+);((?:\\d+)|S)")); + QRegularExpressionMatch m = rx.match(m_attributes->value("TOTP Settings")); + if (m.hasMatch()) { + m_data.totpStep = m.captured(1).toUInt(); + if (QTotp::shortNameToEncoder.contains(m.captured(2))) { + m_data.totpDigits = QTotp::shortNameToEncoder[m.captured(2)]; + } else { + m_data.totpDigits = m.captured(2).toUInt(); + } } } diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index e5110e30a..a0671af98 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -417,6 +417,8 @@ void DatabaseWidget::setupTotp() setupTotpDialog->setSeed(currentEntry->totpSeed()); setupTotpDialog->setStep(currentEntry->totpStep()); setupTotpDialog->setDigits(currentEntry->totpDigits()); + // now that all settings are set, decide whether it's default, steam or custom + setupTotpDialog->setSettings(currentEntry->totpDigits()); } setupTotpDialog->open(); diff --git a/src/gui/DetailsWidget.cpp b/src/gui/DetailsWidget.cpp index c8dc058d9..23c3485ad 100644 --- a/src/gui/DetailsWidget.cpp +++ b/src/gui/DetailsWidget.cpp @@ -270,7 +270,7 @@ void DetailsWidget::updateTotp() if (!m_locked) { QString totpCode = m_currentEntry->totp(); QString firstHalf = totpCode.left(totpCode.size() / 2); - QString secondHalf = totpCode.right(totpCode.size() / 2); + QString secondHalf = totpCode.mid(totpCode.size() / 2); m_ui->totpLabel->setText(firstHalf + " " + secondHalf); } else if (nullptr != m_timer) { m_timer->stop(); diff --git a/src/gui/SetupTotpDialog.cpp b/src/gui/SetupTotpDialog.cpp index 5521773bd..2e6c91f00 100644 --- a/src/gui/SetupTotpDialog.cpp +++ b/src/gui/SetupTotpDialog.cpp @@ -35,7 +35,9 @@ SetupTotpDialog::SetupTotpDialog(DatabaseWidget* parent, Entry* entry) connect(m_ui->buttonBox, SIGNAL(rejected()), SLOT(close())); connect(m_ui->buttonBox, SIGNAL(accepted()), SLOT(setupTotp())); - connect(m_ui->customSettingsCheckBox, SIGNAL(toggled(bool)), SLOT(toggleCustom(bool))); + connect(m_ui->radioDefault, SIGNAL(toggled(bool)), SLOT(toggleDefault(bool))); + connect(m_ui->radioSteam, SIGNAL(toggled(bool)), SLOT(toggleSteam(bool))); + connect(m_ui->radioCustom, SIGNAL(toggled(bool)), SLOT(toggleCustom(bool))); } @@ -43,7 +45,9 @@ void SetupTotpDialog::setupTotp() { quint8 digits; - if (m_ui->radio8Digits->isChecked()) { + if (m_ui->radioSteam->isChecked()) { + digits = QTotp::ENCODER_STEAM; + } else if (m_ui->radio8Digits->isChecked()) { digits = 8; } else { digits = 6; @@ -56,6 +60,22 @@ void SetupTotpDialog::setupTotp() close(); } +void SetupTotpDialog::toggleDefault(bool status) +{ + if (status) { + setStep(QTotp::defaultStep); + setDigits(QTotp::defaultDigits); + } +} + +void SetupTotpDialog::toggleSteam(bool status) +{ + if (status) { + setStep(QTotp::defaultStep); + setDigits(QTotp::ENCODER_STEAM); + } +} + void SetupTotpDialog::toggleCustom(bool status) { m_ui->digitsLabel->setEnabled(status); @@ -72,13 +92,25 @@ void SetupTotpDialog::setSeed(QString value) m_ui->seedEdit->setText(value); } +void SetupTotpDialog::setSettings(quint8 digits) { + quint8 step = m_ui->stepSpinBox->value(); + + bool isDefault = ((step == QTotp::defaultStep) && + (digits == QTotp::defaultDigits)); + bool isSteam = (digits == QTotp::ENCODER_STEAM); + + if (isSteam) { + m_ui->radioSteam->setChecked(true); + } else if (isDefault) { + m_ui->radioDefault->setChecked(true); + } else { + m_ui->radioCustom->setChecked(true); + } +} + void SetupTotpDialog::setStep(quint8 step) { m_ui->stepSpinBox->setValue(step); - - if (step != QTotp::defaultStep) { - m_ui->customSettingsCheckBox->setChecked(true); - } } void SetupTotpDialog::setDigits(quint8 digits) @@ -90,13 +122,8 @@ void SetupTotpDialog::setDigits(quint8 digits) m_ui->radio6Digits->setChecked(true); m_ui->radio8Digits->setChecked(false); } - - if (digits != QTotp::defaultDigits) { - m_ui->customSettingsCheckBox->setChecked(true); - } } - SetupTotpDialog::~SetupTotpDialog() { } diff --git a/src/gui/SetupTotpDialog.h b/src/gui/SetupTotpDialog.h index 243a05f9f..9e90e9686 100644 --- a/src/gui/SetupTotpDialog.h +++ b/src/gui/SetupTotpDialog.h @@ -39,8 +39,11 @@ public: void setSeed(QString value); void setStep(quint8 step); void setDigits(quint8 digits); + void setSettings(quint8 digits); private Q_SLOTS: + void toggleDefault(bool status); + void toggleSteam(bool status); void toggleCustom(bool status); void setupTotp(); diff --git a/src/gui/SetupTotpDialog.ui b/src/gui/SetupTotpDialog.ui index a6d806287..c3a83e21d 100644 --- a/src/gui/SetupTotpDialog.ui +++ b/src/gui/SetupTotpDialog.ui @@ -7,7 +7,7 @@ <x>0</x> <y>0</y> <width>282</width> - <height>257</height> + <height>364</height> </rect> </property> <property name="windowTitle"> @@ -29,11 +29,38 @@ </layout> </item> <item> - <widget class="QCheckBox" name="customSettingsCheckBox"> - <property name="text"> - <string>Use custom settings</string> - </property> - </widget> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <widget class="QRadioButton" name="radioDefault"> + <property name="text"> + <string>Default RFC 6238 token settings</string> + </property> + <attribute name="buttonGroup"> + <string notr="true">settingsButtonGroup</string> + </attribute> + </widget> + </item> + <item> + <widget class="QRadioButton" name="radioSteam"> + <property name="text"> + <string>Steam token settings</string> + </property> + <attribute name="buttonGroup"> + <string notr="true">settingsButtonGroup</string> + </attribute> + </widget> + </item> + <item> + <widget class="QRadioButton" name="radioCustom"> + <property name="text"> + <string>Use custom settings</string> + </property> + <attribute name="buttonGroup"> + <string notr="true">settingsButtonGroup</string> + </attribute> + </widget> + </item> + </layout> </item> <item> <widget class="QLabel" name="label_4"> @@ -134,4 +161,7 @@ </widget> <resources/> <connections/> + <buttongroups> + <buttongroup name="settingsButtonGroup"/> + </buttongroups> </ui> diff --git a/src/gui/TotpDialog.cpp b/src/gui/TotpDialog.cpp index 17cc1120f..474acf773 100644 --- a/src/gui/TotpDialog.cpp +++ b/src/gui/TotpDialog.cpp @@ -87,8 +87,8 @@ void TotpDialog::updateSeconds() void TotpDialog::updateTotp() { QString totpCode = m_entry->totp(); - QString firstHalf = totpCode.left(totpCode.size()/2); - QString secondHalf = totpCode.right(totpCode.size()/2); + QString firstHalf = totpCode.left(totpCode.size() / 2); + QString secondHalf = totpCode.mid(totpCode.size() / 2); m_ui->totpLabel->setText(firstHalf + " " + secondHalf); } diff --git a/src/totp/totp.cpp b/src/totp/totp.cpp index 7a584def2..f17def8a2 100644 --- a/src/totp/totp.cpp +++ b/src/totp/totp.cpp @@ -31,6 +31,39 @@ const quint8 QTotp::defaultStep = 30; const quint8 QTotp::defaultDigits = 6; +/** + * Custom encoder types. Each should be unique and >= 128 and < 255 + * Values have no meaning outside of keepassxc + */ +/** + * Encoder for Steam Guard TOTP + */ +const quint8 QTotp::ENCODER_STEAM = 254; + +const QTotp::Encoder QTotp::defaultEncoder = { "", "", "0123456789", 0, 0, false }; +const QMap<quint8, QTotp::Encoder> QTotp::encoders{ + { QTotp::ENCODER_STEAM, { "steam", "S", "23456789BCDFGHJKMNPQRTVWXY", 5, 30, true } }, +}; + +/** + * These map the second field of the "TOTP Settings" field to our internal encoder number + * that overloads the digits field. Make sure that the key matches the shortName value + * in the corresponding Encoder + * NOTE: when updating this map, a corresponding edit to the settings regex must be made + * in Entry::totpSeed() + */ +const QMap<QString, quint8> QTotp::shortNameToEncoder{ + { "S", QTotp::ENCODER_STEAM }, +}; +/** + * These map the "encoder=" URL parameter of the "otp" field to our internal encoder number + * that overloads the digits field. Make sure that the key matches the name value + * in the corresponding Encoder + */ +const QMap<QString, quint8> QTotp::nameToEncoder{ + { "steam", QTotp::ENCODER_STEAM }, +}; + QTotp::QTotp() { } @@ -57,7 +90,10 @@ QString QTotp::parseOtpString(QString key, quint8& digits, quint8& step) if (q_step > 0 && q_step <= 60) { step = q_step; } - + QString encName = query.queryItemValue("encoder"); + if (!encName.isEmpty() && nameToEncoder.contains(encName)) { + digits = nameToEncoder[encName]; + } } else { // Compatibility with "KeeOtp" plugin string format QRegExp rx("key=(.+)", Qt::CaseInsensitive, QRegExp::RegExp); @@ -119,10 +155,24 @@ QString QTotp::generateTotp(const QByteArray key, | (hmac[offset + 3] & 0xff); // clang-format on - quint32 digitsPower = pow(10, numDigits); + const Encoder& encoder = encoders.value(numDigits, defaultEncoder); + // if encoder.digits is 0, we need to use the passed-in number of digits (default encoder) + quint8 digits = encoder.digits == 0 ? numDigits : encoder.digits; + int direction = -1; + int startpos = digits - 1; + if (encoder.reverse) { + direction = 1; + startpos = 0; + } + quint32 digitsPower = pow(encoder.alphabet.size(), digits); quint64 password = binary % digitsPower; - return QString("%1").arg(password, numDigits, 10, QChar('0')); + QString retval(int(digits), encoder.alphabet[0]); + for (quint8 pos = startpos; password > 0; pos += direction) { + retval[pos] = encoder.alphabet[int(password % encoder.alphabet.size())]; + password /= encoder.alphabet.size(); + } + return retval; } // See: https://github.com/google/google-authenticator/wiki/Key-Uri-Format @@ -131,8 +181,8 @@ QUrl QTotp::generateOtpString(const QString& secret, const QString& issuer, const QString& username, const QString& algorithm, - const quint8& digits, - const quint8& step) + quint8 digits, + quint8 step) { QUrl keyUri; keyUri.setScheme("otpauth"); diff --git a/src/totp/totp.h b/src/totp/totp.h index d5d8aa679..d67298712 100644 --- a/src/totp/totp.h +++ b/src/totp/totp.h @@ -20,6 +20,8 @@ #define QTOTP_H #include <QtCore/qglobal.h> +#include <QString> +#include <QMap> class QUrl; @@ -34,10 +36,25 @@ public: const QString& issuer, const QString& username, const QString& algorithm, - const quint8& digits, - const quint8& step); + quint8 digits, + quint8 step); static const quint8 defaultStep; static const quint8 defaultDigits; + struct Encoder + { + QString name; + QString shortName; + QString alphabet; + quint8 digits; + quint8 step; + bool reverse; + }; + static const Encoder defaultEncoder; + // custom encoder values that overload the digits field + static const quint8 ENCODER_STEAM; + static const QMap<quint8, Encoder> encoders; + static const QMap<QString, quint8> shortNameToEncoder; + static const QMap<QString, quint8> nameToEncoder; }; #endif // QTOTP_H diff --git a/tests/TestTotp.cpp b/tests/TestTotp.cpp index 48ff88144..288c047a0 100644 --- a/tests/TestTotp.cpp +++ b/tests/TestTotp.cpp @@ -83,3 +83,89 @@ void TestTotp::testTotpCode() output = QTotp::generateTotp(seed, time, 8, 30); QCOMPARE(output, QString("69279037")); } + +void TestTotp::testEncoderData() +{ + for (quint8 key: QTotp::encoders.keys()) { + const QTotp::Encoder& enc = QTotp::encoders.value(key); + QVERIFY2(enc.digits != 0, + qPrintable(QString("Custom encoders cannot have zero-value for digits field: %1(%2)") + .arg(enc.name) + .arg(key))); + QVERIFY2(!enc.name.isEmpty(), + qPrintable(QString("Custom encoders must have a name: %1(%2)") + .arg(enc.name) + .arg(key))); + QVERIFY2(!enc.shortName.isEmpty(), + qPrintable(QString("Custom encoders must have a shortName: %1(%2)") + .arg(enc.name) + .arg(key))); + QVERIFY2(QTotp::shortNameToEncoder.contains(enc.shortName), + qPrintable(QString("No shortNameToEncoder entry found for custom encoder: %1(%2) %3") + .arg(enc.name) + .arg(key) + .arg(enc.shortName))); + QVERIFY2(QTotp::shortNameToEncoder[enc.shortName] == key, + qPrintable(QString("shortNameToEncoder doesn't reference this custome encoder: %1(%2) %3") + .arg(enc.name) + .arg(key) + .arg(enc.shortName))); + QVERIFY2(QTotp::nameToEncoder.contains(enc.name), + qPrintable(QString("No nameToEncoder entry found for custom encoder: %1(%2) %3") + .arg(enc.name) + .arg(key) + .arg(enc.shortName))); + QVERIFY2(QTotp::nameToEncoder[enc.name] == key, + qPrintable(QString("nameToEncoder doesn't reference this custome encoder: %1(%2) %3") + .arg(enc.name) + .arg(key) + .arg(enc.shortName))); + } + + for (const QString & key: QTotp::nameToEncoder.keys()) { + quint8 value = QTotp::nameToEncoder.value(key); + QVERIFY2(QTotp::encoders.contains(value), + qPrintable(QString("No custom encoder found for encoder named %1(%2)") + .arg(value) + .arg(key))); + QVERIFY2(QTotp::encoders[value].name == key, + qPrintable(QString("nameToEncoder doesn't reference the right custom encoder: %1(%2)") + .arg(value) + .arg(key))); + } + + for (const QString & key: QTotp::shortNameToEncoder.keys()) { + quint8 value = QTotp::shortNameToEncoder.value(key); + QVERIFY2(QTotp::encoders.contains(value), + qPrintable(QString("No custom encoder found for short-name encoder %1(%2)") + .arg(value) + .arg(key))); + QVERIFY2(QTotp::encoders[value].shortName == key, + qPrintable(QString("shortNameToEncoder doesn't reference the right custom encoder: %1(%2)") + .arg(value) + .arg(key))); + } +} + +void TestTotp::testSteamTotp() +{ + quint8 digits = 0; + quint8 step = 0; + QString secret = "otpauth://totp/" + "test:test@example.com?secret=63BEDWCQZKTQWPESARIERL5DTTQFCJTK&issuer=Valve&algorithm=" + "SHA1&digits=5&period=30&encoder=steam"; + QCOMPARE(QTotp::parseOtpString(secret, digits, step), QString("63BEDWCQZKTQWPESARIERL5DTTQFCJTK")); + QCOMPARE(digits, quint8(QTotp::ENCODER_STEAM)); + QCOMPARE(step, quint8(30)); + + + QByteArray seed = QString("63BEDWCQZKTQWPESARIERL5DTTQFCJTK").toLatin1(); + + // These time/value pairs were created by running the Steam Guard function of the + // Steam mobile app with a throw-away steam account. The above secret was extracted + // from the Steam app's data for use in testing here. + quint64 time = 1511200518; + QCOMPARE(QTotp::generateTotp(seed, time, QTotp::ENCODER_STEAM, 30), QString("FR8RV")); + time = 1511200714; + QCOMPARE(QTotp::generateTotp(seed, time, QTotp::ENCODER_STEAM, 30), QString("9P3VP")); +} diff --git a/tests/TestTotp.h b/tests/TestTotp.h index 785a9f522..3bf2de93f 100644 --- a/tests/TestTotp.h +++ b/tests/TestTotp.h @@ -31,6 +31,8 @@ private slots: void initTestCase(); void testParseSecret(); void testTotpCode(); + void testEncoderData(); + void testSteamTotp(); }; #endif // KEEPASSX_TESTTOTP_H From 19ac36b965261846353734305981c18868e5f0d9 Mon Sep 17 00:00:00 2001 From: Weslly <weslly.honorato@gmail.com> Date: Mon, 20 Nov 2017 22:25:09 -0200 Subject: [PATCH 112/402] Change QTotp class name to Totp --- src/core/Entry.cpp | 24 ++++++++--------- src/gui/SetupTotpDialog.cpp | 18 ++++++------- src/totp/totp.cpp | 28 +++++++++---------- src/totp/totp.h | 4 +-- tests/TestTotp.cpp | 54 ++++++++++++++++++------------------- 5 files changed, 64 insertions(+), 64 deletions(-) diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index eab79d6aa..53a1ad225 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -42,8 +42,8 @@ Entry::Entry() m_data.iconNumber = DefaultIconNumber; m_data.autoTypeEnabled = true; m_data.autoTypeObfuscation = 0; - m_data.totpStep = QTotp::defaultStep; - m_data.totpDigits = QTotp::defaultDigits; + m_data.totpStep = Totp::defaultStep; + m_data.totpDigits = Totp::defaultDigits; connect(m_attributes, SIGNAL(modified()), this, SIGNAL(modified())); connect(m_attributes, SIGNAL(defaultKeyModified()), SLOT(emitDataChanged())); @@ -317,7 +317,7 @@ QString Entry::totp() const if (hasTotp()) { QString seed = totpSeed(); quint64 time = QDateTime::currentDateTime().toTime_t(); - QString output = QTotp::generateTotp(seed.toLatin1(), time, m_data.totpDigits, m_data.totpStep); + QString output = Totp::generateTotp(seed.toLatin1(), time, m_data.totpDigits, m_data.totpStep); return QString(output); } else { @@ -328,15 +328,15 @@ QString Entry::totp() const void Entry::setTotp(const QString& seed, quint8& step, quint8& digits) { if (step == 0) { - step = QTotp::defaultStep; + step = Totp::defaultStep; } if (digits == 0) { - digits = QTotp::defaultDigits; + digits = Totp::defaultDigits; } QString data; - const QTotp::Encoder & enc = QTotp::encoders.value(digits, QTotp::defaultEncoder); + const Totp::Encoder & enc = Totp::encoders.value(digits, Totp::defaultEncoder); if (m_attributes->hasKey("otp")) { data = QString("key=%1&step=%2&size=%3").arg(seed).arg(step).arg(enc.digits == 0 ? digits : enc.digits); @@ -365,24 +365,24 @@ QString Entry::totpSeed() const secret = m_attributes->value("TOTP Seed"); } - m_data.totpDigits = QTotp::defaultDigits; - m_data.totpStep = QTotp::defaultStep; + m_data.totpDigits = Totp::defaultDigits; + m_data.totpStep = Totp::defaultStep; if (m_attributes->hasKey("TOTP Settings")) { - // this regex must be kept in sync with the set of allowed short names QTotp::shortNameToEncoder + // this regex must be kept in sync with the set of allowed short names Totp::shortNameToEncoder QRegularExpression rx(QString("(\\d+);((?:\\d+)|S)")); QRegularExpressionMatch m = rx.match(m_attributes->value("TOTP Settings")); if (m.hasMatch()) { m_data.totpStep = m.captured(1).toUInt(); - if (QTotp::shortNameToEncoder.contains(m.captured(2))) { - m_data.totpDigits = QTotp::shortNameToEncoder[m.captured(2)]; + if (Totp::shortNameToEncoder.contains(m.captured(2))) { + m_data.totpDigits = Totp::shortNameToEncoder[m.captured(2)]; } else { m_data.totpDigits = m.captured(2).toUInt(); } } } - return QTotp::parseOtpString(secret, m_data.totpDigits, m_data.totpStep); + return Totp::parseOtpString(secret, m_data.totpDigits, m_data.totpStep); } quint8 Entry::totpStep() const diff --git a/src/gui/SetupTotpDialog.cpp b/src/gui/SetupTotpDialog.cpp index 2e6c91f00..52d63f0ef 100644 --- a/src/gui/SetupTotpDialog.cpp +++ b/src/gui/SetupTotpDialog.cpp @@ -46,7 +46,7 @@ void SetupTotpDialog::setupTotp() quint8 digits; if (m_ui->radioSteam->isChecked()) { - digits = QTotp::ENCODER_STEAM; + digits = Totp::ENCODER_STEAM; } else if (m_ui->radio8Digits->isChecked()) { digits = 8; } else { @@ -54,7 +54,7 @@ void SetupTotpDialog::setupTotp() } quint8 step = m_ui->stepSpinBox->value(); - QString seed = QTotp::parseOtpString(m_ui->seedEdit->text(), digits, step); + QString seed = Totp::parseOtpString(m_ui->seedEdit->text(), digits, step); m_entry->setTotp(seed, step, digits); emit m_parent->entrySelectionChanged(); close(); @@ -63,16 +63,16 @@ void SetupTotpDialog::setupTotp() void SetupTotpDialog::toggleDefault(bool status) { if (status) { - setStep(QTotp::defaultStep); - setDigits(QTotp::defaultDigits); + setStep(Totp::defaultStep); + setDigits(Totp::defaultDigits); } } void SetupTotpDialog::toggleSteam(bool status) { if (status) { - setStep(QTotp::defaultStep); - setDigits(QTotp::ENCODER_STEAM); + setStep(Totp::defaultStep); + setDigits(Totp::ENCODER_STEAM); } } @@ -95,9 +95,9 @@ void SetupTotpDialog::setSeed(QString value) void SetupTotpDialog::setSettings(quint8 digits) { quint8 step = m_ui->stepSpinBox->value(); - bool isDefault = ((step == QTotp::defaultStep) && - (digits == QTotp::defaultDigits)); - bool isSteam = (digits == QTotp::ENCODER_STEAM); + bool isDefault = ((step == Totp::defaultStep) && + (digits == Totp::defaultDigits)); + bool isSteam = (digits == Totp::ENCODER_STEAM); if (isSteam) { m_ui->radioSteam->setChecked(true); diff --git a/src/totp/totp.cpp b/src/totp/totp.cpp index f17def8a2..f102335aa 100644 --- a/src/totp/totp.cpp +++ b/src/totp/totp.cpp @@ -28,8 +28,8 @@ #include <QtEndian> #include <cmath> -const quint8 QTotp::defaultStep = 30; -const quint8 QTotp::defaultDigits = 6; +const quint8 Totp::defaultStep = 30; +const quint8 Totp::defaultDigits = 6; /** * Custom encoder types. Each should be unique and >= 128 and < 255 @@ -38,11 +38,11 @@ const quint8 QTotp::defaultDigits = 6; /** * Encoder for Steam Guard TOTP */ -const quint8 QTotp::ENCODER_STEAM = 254; +const quint8 Totp::ENCODER_STEAM = 254; -const QTotp::Encoder QTotp::defaultEncoder = { "", "", "0123456789", 0, 0, false }; -const QMap<quint8, QTotp::Encoder> QTotp::encoders{ - { QTotp::ENCODER_STEAM, { "steam", "S", "23456789BCDFGHJKMNPQRTVWXY", 5, 30, true } }, +const Totp::Encoder Totp::defaultEncoder = { "", "", "0123456789", 0, 0, false }; +const QMap<quint8, Totp::Encoder> Totp::encoders{ + { Totp::ENCODER_STEAM, { "steam", "S", "23456789BCDFGHJKMNPQRTVWXY", 5, 30, true } }, }; /** @@ -52,23 +52,23 @@ const QMap<quint8, QTotp::Encoder> QTotp::encoders{ * NOTE: when updating this map, a corresponding edit to the settings regex must be made * in Entry::totpSeed() */ -const QMap<QString, quint8> QTotp::shortNameToEncoder{ - { "S", QTotp::ENCODER_STEAM }, +const QMap<QString, quint8> Totp::shortNameToEncoder{ + { "S", Totp::ENCODER_STEAM }, }; /** * These map the "encoder=" URL parameter of the "otp" field to our internal encoder number * that overloads the digits field. Make sure that the key matches the name value * in the corresponding Encoder */ -const QMap<QString, quint8> QTotp::nameToEncoder{ - { "steam", QTotp::ENCODER_STEAM }, +const QMap<QString, quint8> Totp::nameToEncoder{ + { "steam", Totp::ENCODER_STEAM }, }; -QTotp::QTotp() +Totp::Totp() { } -QString QTotp::parseOtpString(QString key, quint8& digits, quint8& step) +QString Totp::parseOtpString(QString key, quint8& digits, quint8& step) { QUrl url(key); @@ -128,7 +128,7 @@ QString QTotp::parseOtpString(QString key, quint8& digits, quint8& step) return seed; } -QString QTotp::generateTotp(const QByteArray key, +QString Totp::generateTotp(const QByteArray key, quint64 time, const quint8 numDigits = defaultDigits, const quint8 step = defaultStep) @@ -176,7 +176,7 @@ QString QTotp::generateTotp(const QByteArray key, } // See: https://github.com/google/google-authenticator/wiki/Key-Uri-Format -QUrl QTotp::generateOtpString(const QString& secret, +QUrl Totp::generateOtpString(const QString& secret, const QString& type, const QString& issuer, const QString& username, diff --git a/src/totp/totp.h b/src/totp/totp.h index d67298712..7d4c78c1d 100644 --- a/src/totp/totp.h +++ b/src/totp/totp.h @@ -25,10 +25,10 @@ class QUrl; -class QTotp +class Totp { public: - QTotp(); + Totp(); static QString parseOtpString(QString rawSecret, quint8& digits, quint8& step); static QString generateTotp(const QByteArray key, quint64 time, const quint8 numDigits, const quint8 step); static QUrl generateOtpString(const QString& secret, diff --git a/tests/TestTotp.cpp b/tests/TestTotp.cpp index 288c047a0..06e360148 100644 --- a/tests/TestTotp.cpp +++ b/tests/TestTotp.cpp @@ -41,21 +41,21 @@ void TestTotp::testParseSecret() QString secret = "otpauth://totp/" "ACME%20Co:john@example.com?secret=HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ&issuer=ACME%20Co&algorithm=" "SHA1&digits=6&period=30"; - QCOMPARE(QTotp::parseOtpString(secret, digits, step), QString("HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ")); + QCOMPARE(Totp::parseOtpString(secret, digits, step), QString("HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ")); QCOMPARE(digits, quint8(6)); QCOMPARE(step, quint8(30)); - digits = QTotp::defaultDigits; - step = QTotp::defaultStep; + digits = Totp::defaultDigits; + step = Totp::defaultStep; secret = "key=HXDMVJECJJWSRBY%3d&step=25&size=8"; - QCOMPARE(QTotp::parseOtpString(secret, digits, step), QString("HXDMVJECJJWSRBY=")); + QCOMPARE(Totp::parseOtpString(secret, digits, step), QString("HXDMVJECJJWSRBY=")); QCOMPARE(digits, quint8(8)); QCOMPARE(step, quint8(25)); digits = 0; step = 0; secret = "gezdgnbvgy3tqojqgezdgnbvgy3tqojq"; - QCOMPARE(QTotp::parseOtpString(secret, digits, step), QString("gezdgnbvgy3tqojqgezdgnbvgy3tqojq")); + QCOMPARE(Totp::parseOtpString(secret, digits, step), QString("gezdgnbvgy3tqojqgezdgnbvgy3tqojq")); QCOMPARE(digits, quint8(6)); QCOMPARE(step, quint8(30)); } @@ -68,26 +68,26 @@ void TestTotp::testTotpCode() QByteArray seed = QString("GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ").toLatin1(); quint64 time = 1234567890; - QString output = QTotp::generateTotp(seed, time, 6, 30); + QString output = Totp::generateTotp(seed, time, 6, 30); QCOMPARE(output, QString("005924")); time = 1111111109; - output = QTotp::generateTotp(seed, time, 6, 30); + output = Totp::generateTotp(seed, time, 6, 30); QCOMPARE(output, QString("081804")); time = 1111111111; - output = QTotp::generateTotp(seed, time, 8, 30); + output = Totp::generateTotp(seed, time, 8, 30); QCOMPARE(output, QString("14050471")); time = 2000000000; - output = QTotp::generateTotp(seed, time, 8, 30); + output = Totp::generateTotp(seed, time, 8, 30); QCOMPARE(output, QString("69279037")); } void TestTotp::testEncoderData() { - for (quint8 key: QTotp::encoders.keys()) { - const QTotp::Encoder& enc = QTotp::encoders.value(key); + for (quint8 key: Totp::encoders.keys()) { + const Totp::Encoder& enc = Totp::encoders.value(key); QVERIFY2(enc.digits != 0, qPrintable(QString("Custom encoders cannot have zero-value for digits field: %1(%2)") .arg(enc.name) @@ -100,47 +100,47 @@ void TestTotp::testEncoderData() qPrintable(QString("Custom encoders must have a shortName: %1(%2)") .arg(enc.name) .arg(key))); - QVERIFY2(QTotp::shortNameToEncoder.contains(enc.shortName), + QVERIFY2(Totp::shortNameToEncoder.contains(enc.shortName), qPrintable(QString("No shortNameToEncoder entry found for custom encoder: %1(%2) %3") .arg(enc.name) .arg(key) .arg(enc.shortName))); - QVERIFY2(QTotp::shortNameToEncoder[enc.shortName] == key, + QVERIFY2(Totp::shortNameToEncoder[enc.shortName] == key, qPrintable(QString("shortNameToEncoder doesn't reference this custome encoder: %1(%2) %3") .arg(enc.name) .arg(key) .arg(enc.shortName))); - QVERIFY2(QTotp::nameToEncoder.contains(enc.name), + QVERIFY2(Totp::nameToEncoder.contains(enc.name), qPrintable(QString("No nameToEncoder entry found for custom encoder: %1(%2) %3") .arg(enc.name) .arg(key) .arg(enc.shortName))); - QVERIFY2(QTotp::nameToEncoder[enc.name] == key, + QVERIFY2(Totp::nameToEncoder[enc.name] == key, qPrintable(QString("nameToEncoder doesn't reference this custome encoder: %1(%2) %3") .arg(enc.name) .arg(key) .arg(enc.shortName))); } - for (const QString & key: QTotp::nameToEncoder.keys()) { - quint8 value = QTotp::nameToEncoder.value(key); - QVERIFY2(QTotp::encoders.contains(value), + for (const QString & key: Totp::nameToEncoder.keys()) { + quint8 value = Totp::nameToEncoder.value(key); + QVERIFY2(Totp::encoders.contains(value), qPrintable(QString("No custom encoder found for encoder named %1(%2)") .arg(value) .arg(key))); - QVERIFY2(QTotp::encoders[value].name == key, + QVERIFY2(Totp::encoders[value].name == key, qPrintable(QString("nameToEncoder doesn't reference the right custom encoder: %1(%2)") .arg(value) .arg(key))); } - for (const QString & key: QTotp::shortNameToEncoder.keys()) { - quint8 value = QTotp::shortNameToEncoder.value(key); - QVERIFY2(QTotp::encoders.contains(value), + for (const QString & key: Totp::shortNameToEncoder.keys()) { + quint8 value = Totp::shortNameToEncoder.value(key); + QVERIFY2(Totp::encoders.contains(value), qPrintable(QString("No custom encoder found for short-name encoder %1(%2)") .arg(value) .arg(key))); - QVERIFY2(QTotp::encoders[value].shortName == key, + QVERIFY2(Totp::encoders[value].shortName == key, qPrintable(QString("shortNameToEncoder doesn't reference the right custom encoder: %1(%2)") .arg(value) .arg(key))); @@ -154,8 +154,8 @@ void TestTotp::testSteamTotp() QString secret = "otpauth://totp/" "test:test@example.com?secret=63BEDWCQZKTQWPESARIERL5DTTQFCJTK&issuer=Valve&algorithm=" "SHA1&digits=5&period=30&encoder=steam"; - QCOMPARE(QTotp::parseOtpString(secret, digits, step), QString("63BEDWCQZKTQWPESARIERL5DTTQFCJTK")); - QCOMPARE(digits, quint8(QTotp::ENCODER_STEAM)); + QCOMPARE(Totp::parseOtpString(secret, digits, step), QString("63BEDWCQZKTQWPESARIERL5DTTQFCJTK")); + QCOMPARE(digits, quint8(Totp::ENCODER_STEAM)); QCOMPARE(step, quint8(30)); @@ -165,7 +165,7 @@ void TestTotp::testSteamTotp() // Steam mobile app with a throw-away steam account. The above secret was extracted // from the Steam app's data for use in testing here. quint64 time = 1511200518; - QCOMPARE(QTotp::generateTotp(seed, time, QTotp::ENCODER_STEAM, 30), QString("FR8RV")); + QCOMPARE(Totp::generateTotp(seed, time, Totp::ENCODER_STEAM, 30), QString("FR8RV")); time = 1511200714; - QCOMPARE(QTotp::generateTotp(seed, time, QTotp::ENCODER_STEAM, 30), QString("9P3VP")); + QCOMPARE(Totp::generateTotp(seed, time, Totp::ENCODER_STEAM, 30), QString("9P3VP")); } From a4d1293eaf20555fef326c496694947dfaab9bb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Mesk=C3=B3?= <meskobalazs@gmail.com> Date: Tue, 21 Nov 2017 02:12:14 +0100 Subject: [PATCH 113/402] I18n fixes in Service.cpp (#875) Fix plural strings --- src/http/Service.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/http/Service.cpp b/src/http/Service.cpp index e68a7bfd9..7f74a3ae8 100644 --- a/src/http/Service.cpp +++ b/src/http/Service.cpp @@ -548,7 +548,7 @@ void Service::removeSharedEncryptionKeys() const int count = keysToRemove.count(); QMessageBox::information(0, tr("KeePassXC: Removed keys from database"), - tr("Successfully removed %1 encryption-%2 from KeePassX/Http Settings.").arg(count).arg(count ? "keys" : "key"), + tr("Successfully removed %n encryption-key(s) from KeePassX/Http Settings.", "", count), QMessageBox::Ok); } else { QMessageBox::information(0, tr("KeePassXC: No keys found"), @@ -592,7 +592,7 @@ void Service::removeStoredPermissions() if (counter > 0) { QMessageBox::information(0, tr("KeePassXC: Removed permissions"), - tr("Successfully removed permissions from %1 %2.").arg(counter).arg(counter ? "entries" : "entry"), + tr("Successfully removed permissions from %n entries.", "", counter), QMessageBox::Ok); } else { QMessageBox::information(0, tr("KeePassXC: No entry with permissions found!"), From 236846baa7049cf75cc6cc69a8109701b74fba2b Mon Sep 17 00:00:00 2001 From: Vladimir Svyatski <vsvyatski@yandex.ru> Date: Fri, 7 Jul 2017 23:29:26 +0300 Subject: [PATCH 114/402] Add menu shortcut Alt+m (underlined letter) for "Empty recycle bin" for consistency with other items in the same submenu which all have "Alt+underlined letter" style shortcuts. --- src/gui/MainWindow.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/MainWindow.ui b/src/gui/MainWindow.ui index 6824904ab..d0cded220 100644 --- a/src/gui/MainWindow.ui +++ b/src/gui/MainWindow.ui @@ -557,7 +557,7 @@ </action> <action name="actionGroupEmptyRecycleBin"> <property name="text"> - <string>Empty recycle bin</string> + <string>E&mpty recycle bin</string> </property> <property name="visible"> <bool>false</bool> From 9603c91877cce828c223310635e036688a5371ab Mon Sep 17 00:00:00 2001 From: Louis-Bertrand Varin <louisv@unito.io> Date: Fri, 3 Nov 2017 16:29:42 -0400 Subject: [PATCH 115/402] Merge : Synchronising groups. --- src/core/Group.cpp | 80 +++++++++++++++++++------ src/core/Group.h | 17 +++++- tests/TestMerge.cpp | 139 +++++++++++++++++++++++++++++++++++++++++--- tests/TestMerge.h | 3 + 4 files changed, 210 insertions(+), 29 deletions(-) diff --git a/src/core/Group.cpp b/src/core/Group.cpp index 6f70db347..443f7cbed 100644 --- a/src/core/Group.cpp +++ b/src/core/Group.cpp @@ -77,8 +77,7 @@ template <class P, class V> inline bool Group::set(P& property, const V& value) updateTimeinfo(); emit modified(); return true; - } - else { + } else { return false; } } @@ -693,27 +692,48 @@ void Group::merge(const Group* other) existingEntry->setGroup(this); qDebug("Location changed for entry %s. Updating it", qPrintable(existingEntry->title())); } - resolveConflict(existingEntry, entry); + resolveEntryConflict(existingEntry, entry); } } // merge groups recursively const QList<Group*> dbChildren = other->children(); for (Group* group : dbChildren) { - // groups are searched by name instead of uuid - if (findChildByName(group->name())) { - findChildByName(group->name())->merge(group); - } else { + + Group* existingGroup = rootGroup->findChildByUuid(group->uuid()); + + if (!existingGroup) { qDebug("New group %s detected. Creating it.", qPrintable(group->name())); - Group* newGroup = group->clone(Entry::CloneNoFlags, true); + Group* newGroup = group->clone(Entry::CloneNoFlags, Group::CloneNoFlags); newGroup->setParent(this); newGroup->merge(group); + } else { + bool locationChanged = existingGroup->timeInfo().locationChanged() < group->timeInfo().locationChanged(); + if (locationChanged && existingGroup->parent() != this) { + existingGroup->setParent(this); + qDebug("Location changed for group %s. Updating it", qPrintable(existingGroup->name())); + } + resolveGroupConflict(existingGroup, group); + existingGroup->merge(group); } + } emit modified(); } +Group* Group::findChildByUuid(const Uuid& uuid) +{ + Q_ASSERT(!uuid.isNull()); + for (Group* group : groupsRecursive(true)) { + if (group->uuid() == uuid) { + return group; + } + } + + return nullptr; +} + Group* Group::findChildByName(const QString& name) { for (Group* group : asConst(m_children)) { @@ -725,16 +745,21 @@ Group* Group::findChildByName(const QString& name) return nullptr; } -Group* Group::clone(Entry::CloneFlags entryFlags, bool shallow) const +Group* Group::clone(Entry::CloneFlags entryFlags, Group::CloneFlags groupFlags) const { Group* clonedGroup = new Group(); clonedGroup->setUpdateTimeinfo(false); - clonedGroup->setUuid(Uuid::random()); + if (groupFlags & Group::CloneNewUuid) { + clonedGroup->setUuid(Uuid::random()); + } else { + clonedGroup->setUuid(this->uuid()); + } + clonedGroup->m_data = m_data; - if (!shallow) { + if (groupFlags & Group::CloneIncludeEntries) { const QList<Entry*> entryList = entries(); for (Entry* entry : entryList) { Entry* clonedEntry = entry->clone(entryFlags); @@ -743,18 +768,20 @@ Group* Group::clone(Entry::CloneFlags entryFlags, bool shallow) const const QList<Group*> childrenGroups = children(); for (Group* groupChild : childrenGroups) { - Group* clonedGroupChild = groupChild->clone(entryFlags); + Group* clonedGroupChild = groupChild->clone(entryFlags, groupFlags); clonedGroupChild->setParent(clonedGroup); } } clonedGroup->setUpdateTimeinfo(true); + if (groupFlags & Group::CloneResetTimeInfo) { - QDateTime now = QDateTime::currentDateTimeUtc(); - clonedGroup->m_data.timeInfo.setCreationTime(now); - clonedGroup->m_data.timeInfo.setLastModificationTime(now); - clonedGroup->m_data.timeInfo.setLastAccessTime(now); - clonedGroup->m_data.timeInfo.setLocationChanged(now); + QDateTime now = QDateTime::currentDateTimeUtc(); + clonedGroup->m_data.timeInfo.setCreationTime(now); + clonedGroup->m_data.timeInfo.setLastModificationTime(now); + clonedGroup->m_data.timeInfo.setLastAccessTime(now); + clonedGroup->m_data.timeInfo.setLocationChanged(now); + } return clonedGroup; } @@ -908,7 +935,7 @@ bool Group::resolveAutoTypeEnabled() const } } -void Group::resolveConflict(Entry* existingEntry, Entry* otherEntry) +void Group::resolveEntryConflict(Entry* existingEntry, Entry* otherEntry) { const QDateTime timeExisting = existingEntry->timeInfo().lastModificationTime(); const QDateTime timeOther = otherEntry->timeInfo().lastModificationTime(); @@ -946,6 +973,23 @@ void Group::resolveConflict(Entry* existingEntry, Entry* otherEntry) } } +void Group::resolveGroupConflict(Group* existingGroup, Group* otherGroup) +{ + const QDateTime timeExisting = existingGroup->timeInfo().lastModificationTime(); + const QDateTime timeOther = otherGroup->timeInfo().lastModificationTime(); + + // only if the other group newer, update the existing one. + if (timeExisting < timeOther) { + qDebug("Updating group %s.", qPrintable(existingGroup->name())); + existingGroup->setName(otherGroup->name()); + existingGroup->setNotes(otherGroup->notes()); + existingGroup->setIcon(otherGroup->iconNumber()); + existingGroup->setIcon(otherGroup->iconUuid()); + existingGroup->setExpiryTime(otherGroup->timeInfo().expiryTime()); + } + +} + QStringList Group::locate(QString locateTerm, QString currentPath) { Q_ASSERT(!locateTerm.isNull()); diff --git a/src/core/Group.h b/src/core/Group.h index 2a9d2b18c..6d309bdcf 100644 --- a/src/core/Group.h +++ b/src/core/Group.h @@ -37,6 +37,14 @@ public: enum TriState { Inherit, Enable, Disable }; enum MergeMode { ModeInherit, KeepBoth, KeepNewer, KeepExisting }; + enum CloneFlag { + CloneNoFlags = 0, + CloneNewUuid = 1, // generate a random uuid for the clone + CloneResetTimeInfo = 2, // set all TimeInfo attributes to the current time + CloneIncludeEntries = 4, // clone the group entries + }; + Q_DECLARE_FLAGS(CloneFlags, CloneFlag) + struct GroupData { QString name; @@ -80,6 +88,7 @@ public: static const int RecycleBinIconNumber; Group* findChildByName(const QString& name); + Group* findChildByUuid(const Uuid& uuid); Entry* findEntry(QString entryId); Entry* findEntryByUuid(const Uuid& uuid); Entry* findEntryByPath(QString entryPath, QString basePath = QString("")); @@ -126,7 +135,8 @@ public: * new group into another database. */ Group* clone(Entry::CloneFlags entryFlags = Entry::CloneNewUuid | Entry::CloneResetTimeInfo, - bool shallow = false) const; + CloneFlags groupFlags = static_cast<CloneFlags>(Group::CloneNewUuid | Group::CloneResetTimeInfo | + Group::CloneIncludeEntries)) const; void copyDataFrom(const Group* other); void merge(const Group* other); QString print(bool recursive = false, int depth = 0); @@ -160,7 +170,8 @@ private: void removeEntry(Entry* entry); void setParent(Database* db); void markOlderEntry(Entry* entry); - void resolveConflict(Entry* existingEntry, Entry* otherEntry); + void resolveEntryConflict(Entry* existingEntry, Entry* otherEntry); + void resolveGroupConflict(Group* existingGroup, Group* otherGroup); void recSetDatabase(Database* db); void cleanupParent(); @@ -183,4 +194,6 @@ private: friend void Entry::setGroup(Group* group); }; +Q_DECLARE_OPERATORS_FOR_FLAGS(Group::CloneFlags) + #endif // KEEPASSX_GROUP_H diff --git a/tests/TestMerge.cpp b/tests/TestMerge.cpp index 4f8daa068..d68c4f102 100644 --- a/tests/TestMerge.cpp +++ b/tests/TestMerge.cpp @@ -64,7 +64,7 @@ void TestMerge::testMergeNoChanges() Database* dbDestination = createTestDatabase(); Database* dbSource = new Database(); - dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneNoFlags)); + dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneNoFlags, Group::CloneIncludeEntries)); QCOMPARE(dbDestination->rootGroup()->entriesRecursive().size(), 2); QCOMPARE(dbSource->rootGroup()->entriesRecursive().size(), 2); @@ -92,7 +92,7 @@ void TestMerge::testResolveConflictNewer() Database* dbDestination = createTestDatabase(); Database* dbSource = new Database(); - dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneNoFlags)); + dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneNoFlags, Group::CloneIncludeEntries)); // sanity check Group* group1 = dbSource->rootGroup()->findChildByName("group1"); @@ -141,7 +141,7 @@ void TestMerge::testResolveConflictOlder() Database* dbDestination = createTestDatabase(); Database* dbSource = new Database(); - dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneNoFlags)); + dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneNoFlags, Group::CloneIncludeEntries)); // sanity check Group* group1 = dbSource->rootGroup()->findChildByName("group1"); @@ -197,7 +197,7 @@ void TestMerge::testResolveConflictKeepBoth() Database* dbDestination = createTestDatabase(); Database* dbSource = new Database(); - dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneIncludeHistory)); + dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneIncludeHistory, Group::CloneIncludeEntries)); // sanity check QCOMPARE(dbDestination->rootGroup()->children().at(0)->entries().size(), 2); @@ -236,7 +236,7 @@ void TestMerge::testMoveEntry() Database* dbDestination = createTestDatabase(); Database* dbSource = new Database(); - dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneNoFlags)); + dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneNoFlags, Group::CloneIncludeEntries)); Entry* entry1 = dbSource->rootGroup()->findEntry("entry1"); QVERIFY(entry1 != nullptr); @@ -270,7 +270,7 @@ void TestMerge::testMoveEntryPreserveChanges() Database* dbDestination = createTestDatabase(); Database* dbSource = new Database(); - dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneNoFlags)); + dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneNoFlags, Group::CloneIncludeEntries)); Entry* entry1 = dbSource->rootGroup()->findEntry("entry1"); QVERIFY(entry1 != nullptr); @@ -307,11 +307,12 @@ void TestMerge::testCreateNewGroups() Database* dbDestination = createTestDatabase(); Database* dbSource = new Database(); - dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneNoFlags)); + dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneNoFlags, Group::CloneIncludeEntries)); QTest::qSleep(1); Group* group3 = new Group(); group3->setName("group3"); + group3->setUuid(Uuid::random()); group3->setParent(dbSource->rootGroup()); dbDestination->merge(dbSource); @@ -329,11 +330,12 @@ void TestMerge::testMoveEntryIntoNewGroup() Database* dbDestination = createTestDatabase(); Database* dbSource = new Database(); - dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneNoFlags)); + dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneNoFlags, Group::CloneIncludeEntries)); QTest::qSleep(1); Group* group3 = new Group(); group3->setName("group3"); + group3->setUuid(Uuid::random()); group3->setParent(dbSource->rootGroup()); Entry* entry1 = dbSource->rootGroup()->findEntry("entry1"); @@ -365,10 +367,11 @@ void TestMerge::testUpdateEntryDifferentLocation() Database* dbDestination = createTestDatabase(); Database* dbSource = new Database(); - dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneNoFlags)); + dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneNoFlags, Group::CloneIncludeEntries)); Group* group3 = new Group(); group3->setName("group3"); + group3->setUuid(Uuid::random()); group3->setParent(dbDestination->rootGroup()); Entry* entry1 = dbDestination->rootGroup()->findEntry("entry1"); @@ -399,6 +402,84 @@ void TestMerge::testUpdateEntryDifferentLocation() delete dbSource; } +/** + * Groups should be updated using the uuids. + */ +void TestMerge::testUpdateGroup() +{ + Database* dbDestination = createTestDatabase(); + + Database* dbSource = new Database(); + dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneNoFlags, Group::CloneIncludeEntries)); + + QTest::qSleep(1); + + Group* group2 = dbSource->rootGroup()->findChildByName("group2"); + group2->setName("group2 renamed"); + group2->setNotes("updated notes"); + Uuid customIconId = Uuid::random(); + QImage customIcon; + dbSource->metadata()->addCustomIcon(customIconId, customIcon); + group2->setIcon(customIconId); + + Entry* entry1 = dbSource->rootGroup()->findEntry("entry1"); + QVERIFY(entry1 != nullptr); + entry1->setGroup(group2); + entry1->setTitle("entry1 renamed"); + Uuid uuidBeforeSyncing = entry1->uuid(); + + dbDestination->merge(dbSource); + + QCOMPARE(dbDestination->rootGroup()->entriesRecursive().size(), 2); + + entry1 = dbDestination->rootGroup()->findEntry("entry1 renamed"); + QVERIFY(entry1 != nullptr); + QVERIFY(entry1->group() != nullptr); + QCOMPARE(entry1->group()->name(), QString("group2 renamed")); + QCOMPARE(uuidBeforeSyncing, entry1->uuid()); + + group2 = dbDestination->rootGroup()->findChildByName("group2 renamed"); + QCOMPARE(group2->notes(), QString("updated notes")); + QCOMPARE(group2->iconUuid(), customIconId); + + delete dbDestination; + delete dbSource; +} + +void TestMerge::testUpdateGroupLocation() +{ + Database* dbDestination = createTestDatabase(); + Group* group3 = new Group(); + Uuid group3Uuid = Uuid::random(); + group3->setUuid(group3Uuid); + group3->setName("group3"); + group3->setParent(dbDestination->rootGroup()->findChildByName("group1")); + + Database* dbSource = new Database(); + dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneNoFlags, Group::CloneIncludeEntries)); + + // Sanity check + group3 = dbSource->rootGroup()->findChildByUuid(group3Uuid); + QVERIFY(group3 != nullptr); + + QTest::qSleep(1); + + group3->setParent(dbSource->rootGroup()->findChildByName("group2")); + + dbDestination->merge(dbSource); + group3 = dbDestination->rootGroup()->findChildByUuid(group3Uuid); + QVERIFY(group3 != nullptr); + QCOMPARE(group3->parent(), dbDestination->rootGroup()->findChildByName("group2")); + + dbDestination->merge(dbSource); + group3 = dbDestination->rootGroup()->findChildByUuid(group3Uuid); + QVERIFY(group3 != nullptr); + QCOMPARE(group3->parent(), dbDestination->rootGroup()->findChildByName("group2")); + + delete dbDestination; + delete dbSource; +} + /** * The first merge should create new entries, the * second should only sync them, since they have @@ -447,14 +528,54 @@ void TestMerge::testMergeCustomIcons() delete dbSource; } +/** + * If the group is updated in the source database, and the + * destination database after, the group should remain the + * same. + */ +void TestMerge::testResolveGroupConflictOlder() +{ + Database* dbDestination = createTestDatabase(); + + Database* dbSource = new Database(); + dbSource->setRootGroup(dbDestination->rootGroup()->clone(Entry::CloneNoFlags, Group::CloneIncludeEntries)); + + // sanity check + Group* group1 = dbSource->rootGroup()->findChildByName("group1"); + QVERIFY(group1 != nullptr); + + // Make sure the two changes have a different timestamp. + QTest::qSleep(1); + group1->setName("group1 updated in source"); + + // Make sure the two changes have a different timestamp. + QTest::qSleep(1); + + group1 = dbDestination->rootGroup()->findChildByName("group1"); + group1->setName("group1 updated in destination"); + + dbDestination->merge(dbSource); + + // sanity check + group1 = dbDestination->rootGroup()->findChildByName("group1 updated in destination"); + QVERIFY(group1 != nullptr); + + delete dbDestination; + delete dbSource; +} + + Database* TestMerge::createTestDatabase() { Database* db = new Database(); Group* group1 = new Group(); group1->setName("group1"); + group1->setUuid(Uuid::random()); + Group* group2 = new Group(); group2->setName("group2"); + group2->setUuid(Uuid::random()); Entry* entry1 = new Entry(); Entry* entry2 = new Entry(); diff --git a/tests/TestMerge.h b/tests/TestMerge.h index 0b3ec618e..3588cfd53 100644 --- a/tests/TestMerge.h +++ b/tests/TestMerge.h @@ -31,12 +31,15 @@ private slots: void testMergeNoChanges(); void testResolveConflictNewer(); void testResolveConflictOlder(); + void testResolveGroupConflictOlder(); void testResolveConflictKeepBoth(); void testMoveEntry(); void testMoveEntryPreserveChanges(); void testMoveEntryIntoNewGroup(); void testCreateNewGroups(); void testUpdateEntryDifferentLocation(); + void testUpdateGroup(); + void testUpdateGroupLocation(); void testMergeAndSync(); void testMergeCustomIcons(); From 2ff56fe86c7a35dc84b714e9030997a8153018e9 Mon Sep 17 00:00:00 2001 From: Louis-Bertrand Varin <louisv@unito.io> Date: Tue, 21 Nov 2017 09:52:31 -0500 Subject: [PATCH 116/402] Only updating custom group icon if set. --- src/core/Group.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/core/Group.cpp b/src/core/Group.cpp index 443f7cbed..dbe3d6b78 100644 --- a/src/core/Group.cpp +++ b/src/core/Group.cpp @@ -681,12 +681,12 @@ void Group::merge(const Group* other) Entry* existingEntry = rootGroup->findEntryByUuid(entry->uuid()); - // This entry does not exist at all. Create it. if (!existingEntry) { + // This entry does not exist at all. Create it. qDebug("New entry %s detected. Creating it.", qPrintable(entry->title())); entry->clone(Entry::CloneIncludeHistory)->setGroup(this); - // Entry is already present in the database. Update it. } else { + // Entry is already present in the database. Update it. bool locationChanged = existingEntry->timeInfo().locationChanged() < entry->timeInfo().locationChanged(); if (locationChanged && existingEntry->group() != this) { existingEntry->setGroup(this); @@ -978,13 +978,16 @@ void Group::resolveGroupConflict(Group* existingGroup, Group* otherGroup) const QDateTime timeExisting = existingGroup->timeInfo().lastModificationTime(); const QDateTime timeOther = otherGroup->timeInfo().lastModificationTime(); - // only if the other group newer, update the existing one. + // only if the other group is newer, update the existing one. if (timeExisting < timeOther) { qDebug("Updating group %s.", qPrintable(existingGroup->name())); existingGroup->setName(otherGroup->name()); existingGroup->setNotes(otherGroup->notes()); - existingGroup->setIcon(otherGroup->iconNumber()); - existingGroup->setIcon(otherGroup->iconUuid()); + if (otherGroup->iconNumber() == 0) { + existingGroup->setIcon(otherGroup->iconUuid()); + } else { + existingGroup->setIcon(otherGroup->iconNumber()); + } existingGroup->setExpiryTime(otherGroup->timeInfo().expiryTime()); } From 94ea3238360ebb32af0555b66c2673a59a8860d1 Mon Sep 17 00:00:00 2001 From: Louis-Bertrand Varin <louisv@unito.io> Date: Tue, 21 Nov 2017 14:02:21 -0500 Subject: [PATCH 117/402] Extracting default clone flags. --- src/core/Group.cpp | 5 +++++ src/core/Group.h | 12 ++++++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/core/Group.cpp b/src/core/Group.cpp index dbe3d6b78..c7c12bfea 100644 --- a/src/core/Group.cpp +++ b/src/core/Group.cpp @@ -26,6 +26,11 @@ const int Group::DefaultIconNumber = 48; const int Group::RecycleBinIconNumber = 43; +Group::CloneFlags Group::DefaultCloneFlags = static_cast<Group::CloneFlags>( + Group::CloneNewUuid | Group::CloneResetTimeInfo | Group::CloneIncludeEntries); +Entry::CloneFlags Group::DefaultEntryCloneFlags = static_cast<Entry::CloneFlags>( + Entry::CloneNewUuid | Entry::CloneResetTimeInfo); + Group::Group() : m_updateTimeinfo(true) { diff --git a/src/core/Group.h b/src/core/Group.h index 6d309bdcf..eec376eeb 100644 --- a/src/core/Group.h +++ b/src/core/Group.h @@ -86,6 +86,8 @@ public: static const int DefaultIconNumber; static const int RecycleBinIconNumber; + static CloneFlags DefaultCloneFlags; + static Entry::CloneFlags DefaultEntryCloneFlags; Group* findChildByName(const QString& name); Group* findChildByUuid(const Uuid& uuid); @@ -128,15 +130,13 @@ public: QList<Group*> groupsRecursive(bool includeSelf); QSet<Uuid> customIconsRecursive() const; /** - * Creates a duplicate of this group including all child entries and groups (if not shallow). - * The exceptions are that the returned group doesn't have a parent group - * and all TimeInfo attributes are set to the current time. + * Creates a duplicate of this group. * Note that you need to copy the custom icons manually when inserting the * new group into another database. */ - Group* clone(Entry::CloneFlags entryFlags = Entry::CloneNewUuid | Entry::CloneResetTimeInfo, - CloneFlags groupFlags = static_cast<CloneFlags>(Group::CloneNewUuid | Group::CloneResetTimeInfo | - Group::CloneIncludeEntries)) const; + Group* clone( + Entry::CloneFlags entryFlags = DefaultEntryCloneFlags, CloneFlags groupFlags = DefaultCloneFlags) const; + void copyDataFrom(const Group* other); void merge(const Group* other); QString print(bool recursive = false, int depth = 0); From 2cd5006260dc7649eeb8c55f22a634995ee1d57b Mon Sep 17 00:00:00 2001 From: Louis-Bertrand Varin <louisv@unito.io> Date: Tue, 21 Nov 2017 14:03:24 -0500 Subject: [PATCH 118/402] Formatting --- src/core/Group.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/Group.h b/src/core/Group.h index eec376eeb..57d503a85 100644 --- a/src/core/Group.h +++ b/src/core/Group.h @@ -134,8 +134,8 @@ public: * Note that you need to copy the custom icons manually when inserting the * new group into another database. */ - Group* clone( - Entry::CloneFlags entryFlags = DefaultEntryCloneFlags, CloneFlags groupFlags = DefaultCloneFlags) const; + Group* clone(Entry::CloneFlags entryFlags = DefaultEntryCloneFlags, + CloneFlags groupFlags = DefaultCloneFlags) const; void copyDataFrom(const Group* other); void merge(const Group* other); From f25c23c051a9c1a55e22d0e453f35105081821b4 Mon Sep 17 00:00:00 2001 From: Louis-Bertrand Varin <louisv@unito.io> Date: Tue, 21 Nov 2017 14:24:24 -0500 Subject: [PATCH 119/402] Adding tests for Group::clone --- tests/TestGroup.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests/TestGroup.cpp b/tests/TestGroup.cpp index 5a809670f..2d478bd19 100644 --- a/tests/TestGroup.cpp +++ b/tests/TestGroup.cpp @@ -391,6 +391,22 @@ void TestGroup::testClone() QCOMPARE(clonedGroupKeepUuid->entries().at(0)->uuid(), originalGroupEntry->uuid()); QCOMPARE(clonedGroupKeepUuid->children().at(0)->entries().at(0)->uuid(), subGroupEntry->uuid()); + Group* clonedGroupNoFlags = originalGroup->clone(Entry::CloneNoFlags, Group::CloneNoFlags); + QCOMPARE(clonedGroupNoFlags->entries().size(), 0); + QVERIFY(clonedGroupNoFlags->uuid() == originalGroup->uuid()); + + Group* clonedGroupNewUuid = originalGroup->clone(Entry::CloneNoFlags, Group::CloneNewUuid); + QCOMPARE(clonedGroupNewUuid->entries().size(), 0); + QVERIFY(clonedGroupNewUuid->uuid() != originalGroup->uuid()); + + // Making sure the new modification date is not the same. + QTest::qSleep(1); + + Group* clonedGroupResetTimeInfo = originalGroup->clone(Entry::CloneNoFlags, Group::CloneNewUuid | Group::CloneResetTimeInfo); + QCOMPARE(clonedGroupResetTimeInfo->entries().size(), 0); + QVERIFY(clonedGroupResetTimeInfo->uuid() != originalGroup->uuid()); + QVERIFY(clonedGroupResetTimeInfo->timeInfo().lastModificationTime() != originalGroup->timeInfo().lastModificationTime()); + delete clonedGroup; delete clonedGroupKeepUuid; delete db; From cd1e0571a5f9af260cdf4ab53353116c0ce1b445 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Thu, 16 Nov 2017 16:04:30 +0100 Subject: [PATCH 120/402] forget keyfile path, fix #1151 --- src/gui/DatabaseOpenWidget.cpp | 3 +++ src/gui/FileDialog.cpp | 18 +++++++++++++----- src/gui/FileDialog.h | 2 ++ src/gui/SettingsWidget.cpp | 1 + 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/gui/DatabaseOpenWidget.cpp b/src/gui/DatabaseOpenWidget.cpp index e487f97ca..451dc597a 100644 --- a/src/gui/DatabaseOpenWidget.cpp +++ b/src/gui/DatabaseOpenWidget.cpp @@ -277,6 +277,9 @@ void DatabaseOpenWidget::activateChallengeResponse() void DatabaseOpenWidget::browseKeyFile() { QString filters = QString("%1 (*);;%2 (*.key)").arg(tr("All files"), tr("Key files")); + if (!config()->get("RememberLastKeyFiles").toBool()) { + fileDialog()->setNextForgetDialog(); + } QString filename = fileDialog()->getOpenFileName(this, tr("Select key file"), QString(), filters); if (!filename.isEmpty()) { diff --git a/src/gui/FileDialog.cpp b/src/gui/FileDialog.cpp index cf792e160..ed86bd851 100644 --- a/src/gui/FileDialog.cpp +++ b/src/gui/FileDialog.cpp @@ -42,11 +42,11 @@ QString FileDialog::getOpenFileName(QWidget* parent, const QString& caption, QSt if (parent) { parent->activateWindow(); } - - if (!result.isEmpty()) { + if (!result.isEmpty() && m_nextSaveLastDir) { config()->set("LastDir", QFileInfo(result).absolutePath()); } + m_nextSaveLastDir = true; return result; } } @@ -73,10 +73,11 @@ QStringList FileDialog::getOpenFileNames(QWidget *parent, const QString &caption parent->activateWindow(); } - if (!results.isEmpty()) { + if (!results.isEmpty() && m_nextSaveLastDir) { config()->set("LastDir", QFileInfo(results[0]).absolutePath()); } + m_nextSaveLastDir = true; return results; } } @@ -125,10 +126,11 @@ QString FileDialog::getSaveFileName(QWidget* parent, const QString& caption, QSt parent->activateWindow(); } - if (!result.isEmpty()) { + if (!result.isEmpty() && m_nextSaveLastDir) { config()->set("LastDir", QFileInfo(result).absolutePath()); } + m_nextSaveLastDir = true; return result; } } @@ -153,10 +155,11 @@ QString FileDialog::getExistingDirectory(QWidget *parent, const QString &caption parent->activateWindow(); } - if (!dir.isEmpty()) { + if (!dir.isEmpty() && m_nextSaveLastDir) { config()->set("LastDir", QFileInfo(dir).absolutePath()); } + m_nextSaveLastDir = true; return dir; } } @@ -176,6 +179,11 @@ void FileDialog::setNextDirName(const QString &dirName) m_nextDirName = dirName; } +void FileDialog::setNextForgetDialog() +{ + m_nextSaveLastDir = false; +} + FileDialog::FileDialog() { } diff --git a/src/gui/FileDialog.h b/src/gui/FileDialog.h index 92b58a584..b4f032eaf 100644 --- a/src/gui/FileDialog.h +++ b/src/gui/FileDialog.h @@ -36,6 +36,7 @@ public: QString getExistingDirectory(QWidget* parent = nullptr, const QString& caption = QString(), QString dir = QString(), QFileDialog::Options options = QFileDialog::ShowDirsOnly); + void setNextForgetDialog(); /** * Sets the result of the next get* method call. * Use only for testing. @@ -51,6 +52,7 @@ private: QString m_nextFileName; QStringList m_nextFileNames; QString m_nextDirName; + bool m_nextSaveLastDir = true; static FileDialog* m_instance; diff --git a/src/gui/SettingsWidget.cpp b/src/gui/SettingsWidget.cpp index a8b0e9424..4ba81c6f7 100644 --- a/src/gui/SettingsWidget.cpp +++ b/src/gui/SettingsWidget.cpp @@ -241,6 +241,7 @@ void SettingsWidget::saveSettings() if (!config()->get("RememberLastKeyFiles").toBool()) { config()->set("LastKeyFiles", QVariant()); + config()->set("LastDir", ""); } for (const ExtraPage& page: asConst(m_extraPages)) { From 135e8419ae54c9cde3003776e5f7791e151a0bc4 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Wed, 22 Nov 2017 22:12:43 +0100 Subject: [PATCH 121/402] refactor saveLastDir code --- src/gui/FileDialog.cpp | 33 ++++++++++++++------------------- src/gui/FileDialog.h | 4 +++- 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/gui/FileDialog.cpp b/src/gui/FileDialog.cpp index ed86bd851..9f3caf6da 100644 --- a/src/gui/FileDialog.cpp +++ b/src/gui/FileDialog.cpp @@ -42,11 +42,8 @@ QString FileDialog::getOpenFileName(QWidget* parent, const QString& caption, QSt if (parent) { parent->activateWindow(); } - if (!result.isEmpty() && m_nextSaveLastDir) { - config()->set("LastDir", QFileInfo(result).absolutePath()); - } - m_nextSaveLastDir = true; + saveLastDir(result); return result; } } @@ -73,11 +70,9 @@ QStringList FileDialog::getOpenFileNames(QWidget *parent, const QString &caption parent->activateWindow(); } - if (!results.isEmpty() && m_nextSaveLastDir) { - config()->set("LastDir", QFileInfo(results[0]).absolutePath()); + if (!results.isEmpty()) { + saveLastDir(results[0]); } - - m_nextSaveLastDir = true; return results; } } @@ -126,11 +121,7 @@ QString FileDialog::getSaveFileName(QWidget* parent, const QString& caption, QSt parent->activateWindow(); } - if (!result.isEmpty() && m_nextSaveLastDir) { - config()->set("LastDir", QFileInfo(result).absolutePath()); - } - - m_nextSaveLastDir = true; + saveLastDir(result); return result; } } @@ -155,11 +146,7 @@ QString FileDialog::getExistingDirectory(QWidget *parent, const QString &caption parent->activateWindow(); } - if (!dir.isEmpty() && m_nextSaveLastDir) { - config()->set("LastDir", QFileInfo(dir).absolutePath()); - } - - m_nextSaveLastDir = true; + saveLastDir(dir); return dir; } } @@ -181,13 +168,21 @@ void FileDialog::setNextDirName(const QString &dirName) void FileDialog::setNextForgetDialog() { - m_nextSaveLastDir = false; + m_forgetLastDir = true; } FileDialog::FileDialog() { } +void FileDialog::saveLastDir(QString dir) { + if (!dir.isEmpty() && !m_forgetLastDir) { + config()->set("LastDir", QFileInfo(dir).absolutePath()); + } + + m_forgetLastDir = false; +} + FileDialog* FileDialog::instance() { if (!m_instance) { diff --git a/src/gui/FileDialog.h b/src/gui/FileDialog.h index b4f032eaf..9a57a9218 100644 --- a/src/gui/FileDialog.h +++ b/src/gui/FileDialog.h @@ -52,7 +52,9 @@ private: QString m_nextFileName; QStringList m_nextFileNames; QString m_nextDirName; - bool m_nextSaveLastDir = true; + bool m_forgetLastDir = false; + + void saveLastDir(QString); static FileDialog* m_instance; From a0bfa710beaeff9dea963d858e250bc6a9a84cfb Mon Sep 17 00:00:00 2001 From: Toni Spets <toni.spets@iki.fi> Date: Sat, 25 Nov 2017 11:31:31 +0200 Subject: [PATCH 122/402] Add missing crypto init to OpenSSHKey test --- tests/TestOpenSSHKey.cpp | 6 ++++++ tests/TestOpenSSHKey.h | 1 + 2 files changed, 7 insertions(+) diff --git a/tests/TestOpenSSHKey.cpp b/tests/TestOpenSSHKey.cpp index 52cf4dbf5..949c708cf 100644 --- a/tests/TestOpenSSHKey.cpp +++ b/tests/TestOpenSSHKey.cpp @@ -16,11 +16,17 @@ */ #include "TestOpenSSHKey.h" +#include "crypto/Crypto.h" #include "sshagent/OpenSSHKey.h" #include <QTest> QTEST_GUILESS_MAIN(TestOpenSSHKey) +void TestOpenSSHKey::initTestCase() +{ + QVERIFY(Crypto::init()); +} + void TestOpenSSHKey::testParse() { // mixed line endings and missing ones are intentional, we only require 3 lines total diff --git a/tests/TestOpenSSHKey.h b/tests/TestOpenSSHKey.h index 92a071f6a..f2d6d1fb9 100644 --- a/tests/TestOpenSSHKey.h +++ b/tests/TestOpenSSHKey.h @@ -27,6 +27,7 @@ class TestOpenSSHKey : public QObject Q_OBJECT private slots: + void initTestCase(); void testParse(); void testDecryptAES256CBC(); void testDecryptAES256CTR(); From 54d500737a580ffa8201ca60e6fa095ee1d4a39a Mon Sep 17 00:00:00 2001 From: Rich Brown <richb.hanover@gmail.com> Date: Sun, 26 Nov 2017 16:36:46 -0500 Subject: [PATCH 123/402] =?UTF-8?q?Create=20docs=20directory=20and=20QUICK?= =?UTF-8?q?START.md=20instructions;=20editorial=20pass=20=E2=80=A6=20(#122?= =?UTF-8?q?7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Create docs directory and QUICKSTART.md instructions; editorial pass on README and INSTALL --- INSTALL.md | 75 +++++++++++++++++------ README.md | 98 +++++++++++++------------------ docs/KeePassXC-Accept-Button.png | Bin 0 -> 98966 bytes docs/KeePassXC-Confirm.png | Bin 0 -> 72759 bytes docs/KeePassXC-Connect.png | Bin 0 -> 103252 bytes docs/QUICKSTART.md | 47 +++++++++++++++ 6 files changed, 143 insertions(+), 77 deletions(-) create mode 100644 docs/KeePassXC-Accept-Button.png create mode 100644 docs/KeePassXC-Confirm.png create mode 100644 docs/KeePassXC-Connect.png create mode 100644 docs/QUICKSTART.md diff --git a/INSTALL.md b/INSTALL.md index 45efa7a21..2d3f7cb2b 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -1,11 +1,13 @@ -Install KeePassXC +Build and Install KeePassXC ================= -This document will guide you across the steps to install KeePassXC. -You can visit the online version of this document at the following link +This document will guide you through the steps to build and install KeePassXC from source. +You can visit the online version of this document at the following link: https://github.com/keepassxreboot/keepassx/wiki/Install-Instruction-from-Source +The [KeePassXC QuickStart](./docs/QUICKSTART.md) gets you started using KeePassXC on your +Windows, Mac, or Linux computer using the pre-built binaries. Build Dependencies ================== @@ -28,10 +30,9 @@ The following libraries are required: Prepare the Building Environment ================================ -* Building Environment on Linux ==> https://github.com/keepassxreboot/keepassxc/wiki/Set-up-Build-Environment-on-Linux -* Building Environment on Windows ==> https://github.com/keepassxreboot/keepassxc/wiki/Set-up-Build-Environment-on-Windows -* Building Environment on MacOS ==> https://github.com/keepassxreboot/keepassxc/wiki/Set-up-Build-Environment-on-OS-X - +* [Building Environment on Linux](https://github.com/keepassxreboot/keepassxc/wiki/Set-up-Build-Environment-on-Linux) +* [Building Environment on Windows](https://github.com/keepassxreboot/keepassxc/wiki/Set-up-Build-Environment-on-Windows) +* [Building Environment on MacOS](https://github.com/keepassxreboot/keepassxc/wiki/Set-up-Build-Environment-on-OS-X) Build Steps =========== @@ -39,32 +40,68 @@ Build Steps To compile from source, open a **Terminal (on Linux/MacOS)** or a **MSYS2-MinGW shell (on Windows)**<br/> **Note:** on Windows make sure you are using a **MINGW shell** by checking the label before the current path -Navigate to the path you have downloaded KeePassXC and type these commands: +First, download the KeePassXC [source tarball](https://keepassxc.org/download#source) +or check out the latest version from our [Git repository](https://github.com/keepassxreboot/keepassxc). + +To clone the project from Git, `cd` to a suitable location and run + +```bash +git clone https://github.com/keepassxreboot/keepassxc.git +``` + +This will clone the entire contents of the repository and check out the current `develop` branch. + +To update the project from within the project's folder, you can run the following command: + +```bash +git pull +``` + +Navigate to the directory where you have downloaded KeePassXC and type these commands: ``` +cd directory-where-sources-live mkdir build cd build -cmake -DWITH_TESTS=OFF +cmake -DWITH_TESTS=OFF ...and other options - see below... make ``` +These steps place the compiled KeePassXC binary inside the `./build/src/` directory. +(Note the cmake notes/options below.) -**Note:** If you are on MacOS you must add this parameter to **Cmake**, with the Qt version you have installed<br/> `-DCMAKE_PREFIX_PATH=/usr/local/Cellar/qt5/5.6.2/lib/cmake/` +**Cmake Notes:** -You will have the compiled KeePassXC binary inside the `./build/src/` directory. +* Common cmake parameters -Common cmake parameters -``` --DCMAKE_INSTALL_PREFIX=/usr/local --DCMAKE_VERBOSE_MAKEFILE=ON --DCMAKE_BUILD_TYPE=<RelWithDebInfo/Debug/Release> --DWITH_GUI_TESTS=ON -``` + ``` + -DCMAKE_INSTALL_PREFIX=/usr/local + -DCMAKE_VERBOSE_MAKEFILE=ON + -DCMAKE_BUILD_TYPE=<RelWithDebInfo/Debug/Release> + -DWITH_GUI_TESTS=ON + ``` +* cmake accepts the following options: + + ``` + -DWITH_XC_AUTOTYPE=[ON|OFF] Enable/Disable Auto-Type (default: ON) + -DWITH_XC_HTTP=[ON|OFF] Enable/Disable KeePassHTTP and custom icon downloads (default: OFF) + -DWITH_XC_YUBIKEY=[ON|OFF] Enable/Disable YubiKey HMAC-SHA1 authentication support (default: OFF) + + -DWITH_TESTS=[ON|OFF] Enable/Disable building of unit tests (default: ON) + -DWITH_GUI_TESTS=[ON|OFF] Enable/Disable building of GUI tests (default: OFF) + -DWITH_DEV_BUILD=[ON|OFF] Enable/Disable deprecated method warnings (default: OFF) + -DWITH_ASAN=[ON|OFF] Enable/Disable address sanitizer checks (Linux / macOS only) (default: OFF) + -DWITH_COVERAGE=[ON|OFF] Enable/Disable coverage tests (GCC only) (default: OFF) + ``` + +* If you are on MacOS you must add this parameter to **Cmake**, with the Qt version you have installed<br/> `-DCMAKE_PREFIX_PATH=/usr/local/Cellar/qt5/5.6.2/lib/cmake/` + +:exclamation: When building with ASan support on macOS, you need to use `export ASAN_OPTIONS=detect_leaks=0` before running the tests (no LSan support in macOS). Installation ============ -To install this binary execute the following: +After you have successfully built KeePassXC, install the binary by executing the following: ```bash sudo make install diff --git a/README.md b/README.md index e379123c1..e4787cac0 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,20 @@ -# <img src="https://keepassxc.org/logo.png" width="40" height="40"/> KeePassXC [![Travis Build Status](https://travis-ci.org/keepassxreboot/keepassxc.svg?branch=develop)](https://travis-ci.org/keepassxreboot/keepassxc) [![Coverage Status](https://coveralls.io/repos/github/keepassxreboot/keepassxc/badge.svg)](https://coveralls.io/github/keepassxreboot/keepassxc) +# <img src="https://keepassxc.org/logo.png" width="40" height="40"/> KeePassXC +[![Travis Build Status](https://travis-ci.org/keepassxreboot/keepassxc.svg?branch=develop)](https://travis-ci.org/keepassxreboot/keepassxc) [![Coverage Status](https://coveralls.io/repos/github/keepassxreboot/keepassxc/badge.svg)](https://coveralls.io/github/keepassxreboot/keepassxc) -KeePass Cross-platform Community Edition - -## About -[KeePassXC](https://keepassxc.org) is a community fork of [KeePassX](https://www.keepassx.org/) with the goal to extend and improve it with new features and bugfixes to provide a feature-rich, fully cross-platform and modern open-source password manager. +## About KeePassXC +[KeePassXC](https://keepassxc.org) is a cross-platform community fork of +[KeePassX](https://www.keepassx.org/). +Our goal is to extend and improve it with new features and bugfixes +to provide a feature-rich, fully cross-platform and modern +open-source password manager. +## Installation +The [KeePassXC QuickStart](./docs/QUICKSTART.md) gets you started using +KeePassXC on your Windows, Mac, or Linux computer using pre-compiled binaries +from the [downloads page](https://keepassxc.org/download). + +Additionally, individual Linux distributions may ship their own versions, +so please check out your distribution's package list to see if KeePassXC is available. ## Additional features compared to KeePassX - Auto-Type on all three major platforms (Linux, Windows, macOS) @@ -19,67 +29,39 @@ KeePass Cross-platform Community Edition - Using website favicons as entry icons - Merging of databases - Automatic reload when the database changed on disk -- KeePassHTTP support for use with KeePassHTTP-Connector for [Mozilla Firefox](https://addons.mozilla.org/en-US/firefox/addon/keepasshttp-connector/) and [Google Chrome or Chromium](https://chrome.google.com/webstore/detail/keepasshttp-connector/dafgdjggglmmknipkhngniifhplpcldb), and [passafari](https://github.com/mmichaa/passafari.safariextension/) in Safari. +- Browser integration with KeePassHTTP-Connector for +[Mozilla Firefox](https://addons.mozilla.org/en-US/firefox/addon/keepasshttp-connector/) and +[Google Chrome or Chromium](https://chrome.google.com/webstore/detail/keepasshttp-connector/dafgdjggglmmknipkhngniifhplpcldb), and +[passafari](https://github.com/mmichaa/passafari.safariextension/) in Safari. [[See note about KeePassHTTP]](#Note_about_KeePassHTTP) - Many bug fixes For a full list of features and changes, read the [CHANGELOG](CHANGELOG) document. -### Note about KeePassHTTP -KeePassHTTP is not a highly secure protocol and has certain flaw which allow an attacker to decrypt your passwords when they manage to intercept communication between a KeePassHTTP server and PassIFox/chromeIPass over a network connection (see [here](https://github.com/pfn/keepasshttp/issues/258) and [here](https://github.com/keepassxreboot/keepassxc/issues/147)). KeePassXC therefore strictly limits communication between itself and the browser plugin to your local computer. As long as your computer is not compromised, your passwords are fairly safe that way, but use it at your own risk! +## Building KeePassXC -### Installation -Pre-compiled binaries can be found on the [downloads page](https://keepassxc.org/download). Additionally, individual Linux distributions may ship their own versions, so please check out your distribution's package list to see if KeePassXC is available. +Detailed instructions are available in the [Build and Install](./BUILD-INSTALL.md) +page or on the [Wiki page](https://github.com/keepassxreboot/keepassxc/wiki/Building-KeePassXC). -### Building KeePassXC +## Contributing -*More detailed instructions are available in the INSTALL file or on the [Wiki page](https://github.com/keepassxreboot/keepassxc/wiki/Building-KeePassXC).* - -First, you must download the KeePassXC [source tarball](https://keepassxc.org/download#source) or check out the latest version from our [Git repository](https://github.com/keepassxreboot/keepassxc). - -To clone the project from Git, `cd` to a suitable location and run - -```bash -git clone https://github.com/keepassxreboot/keepassxc.git -``` - -This will clone the entire contents of the repository and check out the current `develop` branch. - -To update the project from within the project's folder, you can run the following command: - -```bash -git pull -``` - -Once you have downloaded the source code, you can `cd` into the source code directory, build and install KeePassXC: - -```bash -mkdir build -cd build -cmake -DWITH_TESTS=OFF .. -make -j8 -sudo make install -``` - -cmake accepts the following options: - -``` - -DWITH_XC_AUTOTYPE=[ON|OFF] Enable/Disable Auto-Type (default: ON) - -DWITH_XC_HTTP=[ON|OFF] Enable/Disable KeePassHTTP and custom icon downloads (default: OFF) - -DWITH_XC_YUBIKEY=[ON|OFF] Enable/Disable YubiKey HMAC-SHA1 authentication support (default: OFF) - - -DWITH_TESTS=[ON|OFF] Enable/Disable building of unit tests (default: ON) - -DWITH_GUI_TESTS=[ON|OFF] Enable/Disable building of GUI tests (default: OFF) - -DWITH_DEV_BUILD=[ON|OFF] Enable/Disable deprecated method warnings (default: OFF) - -DWITH_ASAN=[ON|OFF] Enable/Disable address sanitizer checks (Linux / macOS only) (default: OFF) - -DWITH_COVERAGE=[ON|OFF] Enable/Disable coverage tests (GCC only) (default: OFF) -``` - -:exclamation: When building with ASan support on macOS, you need to use `export ASAN_OPTIONS=detect_leaks=0` before running the tests (no LSan support in macOS). - -### Contributing - -We are always looking for suggestions how to improve our application. If you find any bugs or have an idea for a new feature, please let us know by opening a report in our [issue tracker](https://github.com/keepassxreboot/keepassxc/issues) on GitHub or join us on IRC on freenode channels #keepassxc or #keepassxc-dev. +We are always looking for suggestions how to improve our application. +If you find any bugs or have an idea for a new feature, please let us know by +opening a report in our [issue tracker](https://github.com/keepassxreboot/keepassxc/issues) +on GitHub or join us on IRC on freenode channels #keepassxc or #keepassxc-dev. You can of course also directly contribute your own code. We are happy to accept your pull requests. Please read the [CONTRIBUTING document](.github/CONTRIBUTING.md) for further information. + +### Note about KeePassHTTP +The KeePassHTTP protocol is not a highly secure protocol. +It has a certain flaw which could allow an attacker to decrypt your passwords +should they manage to impersonate the web browser extension from a remote address. +<!--intercept communication between a KeePassHTTP server +and PassIFox/chromeIPass over a network connection --> +(See [here](https://github.com/pfn/keepasshttp/issues/258) and [here](https://github.com/keepassxreboot/keepassxc/issues/147)). + +To minimize the risk, KeePassXC strictly limits communication between itself +and the browser plugin to your local computer (localhost). +This makes your passwords quite safe, +but as with all open source software, use it at your own risk! diff --git a/docs/KeePassXC-Accept-Button.png b/docs/KeePassXC-Accept-Button.png new file mode 100644 index 0000000000000000000000000000000000000000..de4b39261a9179902f6f9e700bb510c6c47e0e71 GIT binary patch literal 98966 zcmb@tbyQrzvp<Lh4J3GQ9b~ZJ?mh$`+#Q0uySuvu8Qk3^KyY_=5AMEs-}m<YcK7e? z)92jNeebERuBuOWRoCrs1vyDnWPD^OC@55EDKRA|C|EQoDCjgqn14OSe&p6r&;dHq zV!~jztiKD)&`{q$`_(*ib^^C_W5uAUZ=j$MZ+M}gwiwIdpyDbppoHo`P*B4_Xei46 zzdJ0Tp`boK{$?#F5=asazLDU)BOvRFNY!MQeTDHCx*F5jt4W0N?;*H^QRxr{U<Hwf zR_o+)pY>m1^G=w$0>-^J3*udfsGUAMJc=Y|r0^|F0oKoIxk}z<Ma9Lgiz?48?SLv! zhuhW8KqM}cE@VI@{NLk0?ec~e;Qw@YxFs*($|Vcz{^z3(H+I!XpWN#1|MUK5xp?>F zq8?oZDDr)<=f5cZBT-h2bB47WQI7FH1TA|T&5OUO(ftD5d_bT7-=yz5?n6Z?{ea#R z*8elKX5$J;&MmhZ;J^8ZRKsla1($Yvx`r<;pOHOZf<#hArJs3&Y^r0Wpr|g4QD<(X zZLe-={%-q>5Kbs1#Klpr+i+3^WAKbIvOgV3X!uXxd%k6N;ks}F4xfwc&oGTdYpew` zs+-+p9Bi!c7f+AIQ4Qyi@W0_@V)l0mbj{sv+UWWF8XYw+U!3VH5F=UF%x<n9U+8<Z z$Bp`N+}gP!*t=eEk){*>fx*d?#U;b{LlTmkgr!6b3H<6$U$7WsLjm`T&5}xFioXA~ z6;`8%diDmp&c;BM6jsHNC`>4t=o~vFjBHnL!HV>={v<1&C>boP$#BnJI)~IGf#@<D zKnE8KLJ?8vLNJXZ?i41MFGI1in4yM(SHfK0bo@B6zj{Xf?s4T$t^4-Or1vzOJCWU9 z7rv@qWSE|SbSC@5!`6MlY8LJ9XtS2&$NispYTZtfyZb}OL%}8Rk3gZ7zFFtxIkMBZ z=w2)QG86TjyZiC8+_(K#Z^4gE@9swuWLw=$7H#FmWuK69hO<NgCv9ELTXglFJ*&bc zA!*g`MLSSU()AFYq6l4`p4yqe-={>!8`&rSR8xXSmbaY<&5zGJzV%qO`UNg6e7E{@ z^f{v*vP=sUx+(ezp;67D)k6Ng29A=&^M^4W({@KOf_h<BldKFqQxQiv7|QU+8(|nX zAJ1X72<fv1SsHxv{FrKr@$qt&!4kA+6xdi2va+(ZMS|f8XNu<#3a&VP>NH|)wfv(k z1e-BVq;mmocZEqXS<375*-w1&y&LHreD{AGiPd|52-YIf!Td}loEw>*HoeMlayFJ6 z-6wz0+3B?{3jGjr{LLeDL!}2QLZi;9uQ^7q?WQsJJ@xi}KKK2hu~~3N8&(J3Mv%Lj z0~pNB#y<9#MMOSzfyxX-!E5r*(-^b+@i`H&8kcsHU?f!)ZV$C6G899bYK9l=|2Ly& z&#NcQm3bPi$dF@K2a_Z}5f+bCcA-GvHx$TmY4&#xnz<Dk2D=m+C`Cn3@wEz>#xG-g zV1(^aXttFw8P+^0PexHr$ly!yC_Xt<(eMjycHZ&(UEFVCj`-2(SD{8CjYV;3k)ez- z^^}7b4OrOjkVYdm>FhU2*=@?&S(%MzDW6A9Gc<wwoqy7JiY}JRcB{4y$-@p-CCr!_ zi<<c^z$+c(;dvPIx_&sjaqfFPH~gTf`faOfXQ;3l3i>-s!JoqB^QX+;fs*o=Dk9r| zoqLZ5TyQzl@^eAlyjhuU+`YaE<-9QM1O^Ghmx8gBE}q{INSDuC(TTV2rw#bBI*FpX z6G=0M5VGFQ>bFxIY&{6YE@rQm!uHOkD$dWpQw5YQkt%K$!mIvUj($wQd2p{U*K&CV zj3>|&m#?x1_S6umEUL)PGK^mG(VgRD0_Z}OaXU?0J4$^IgHiO}w@1VJCbKlUsko(a zS(R-stnp$$$j;8bo}86&O~zgx5Z&eJ<pMhSZ`YP1n^pGY5t~!lgqn$;N5dB7zw-t@ z^74<JllIz>pl=ZE%o2&Q<#?t&ZrC^)m%%M4F=KM#Czrw}n-#k<&Ho~EkOsj6hVlKv z&{0_JlLM%GYGC~-?`XVX<z)d-=|#Wsvf0XviR%32iw@1kjKMM){-yPJ21Ds>4lXTH zhWce|18i}XT($Tk_PA18H7I{gZ2TC%Cs||VFI{?#*BPrMV~ewYUbnAAe3R!KURnC_ zqFMK8ImUn4!T+0j?GLBDnUMRVi^*aKN2|A61eiADvZN;J12%5Vs}+Ur2a%Ok&e+OI zZ&I$p=FfBAni2jOSBMQ0H1CJz@QQlyUjKa#{sPDcVV)DEr^4fw<WPud$Q65C4iAkN z`F<DMn)!Rjn!s25JE^d+ENMka$f5OnZ62x8gG=~#VJU2CAn`;Vh`%O9TkoDG5MGfV zf22RLf-xa4pVH(;g6%WY87lquv0|IP+8ohq*(aSKVoHy=1H37Mg3<}mUm`KgDy+wO zT~_*SLO6AO`+5FXVnVa&hKwPIOOaLswRj<Ir==mZv=Nk}5mlB=fs1~IE_{7`nYfn3 zhERuYRX(PkHhg?h8g)d2VXlIzBya1jOmAC)VWNWzayrLbGNeLJyG4F$4#!6OFX=!c z{!SN_nyWxW=EUNi9fspPv&EsM7`}Fw_oB2a9Oo+)%jc>i22bJU$Ced`Fxt`eq23_c z{@jpnr3(Ei4#6W?;Xk;9shW~3logzc>c+Tc&+X*)OX*pamHW~sfDjC2hSW)*Y>vSQ z?&4A~N85r#f60%89}CeTs#6h$bF;sLhQ0=)6XgakBV$6%nslU7K^+Vikj8$S)#sij zIBg2jxUVxOTNhOx+(-@9XIrrDWSc(J7CW-VH;*a*7D6*xqb99vO^_{?`hDP@%BRxo zOWg7|)O(V7Bt?kpIZdp9Z^{v3LS~{GPd`O%B=`gse0&{pT_8B~sijyxx1B7()u}^~ zDkFpI&JU%zp8}kWCRpzhQ-*OI&DSi_>?z6z?Wq*FEVQl^obRuRRsTjqvF@|?)p{i5 zgtU0n(Hkh;zLY*iH%+RVEcL4%G!%#Ij(?oaP+bGWD*)4GijrIY)J(g0nJ9`8629)- z(8M<!h%H)n<nQ>@e!^fB4zFNowjet-@30<+`djw4^{+y0Ia8=6BAh`Etp}HzsZYid zIX|6SchkX(u~svwbN~(Lq^Ie;^P6-NuBS><^dd#%FML~HO5c|!R=wxmZglnJ4cmH6 z)y8H5qPJKk9q-rRn=gXx?{k|>o!zAeJnZX5&Z^xLzBI%>2W)r*$Y!=-f9JRFUowy~ zXO#yi%h;fJ(hD8IP7~pbhzG1cxSevsmz2stUnNQ~_NL3kio!A!A^duNbXraYpnm!` z1G@aoMkAOTJf0;VFh^*iiRI6^pd-5X&nuUb+r~@@Iz8nfFyPMepC5NhkX1XJ*Jnk4 zs^^N-kT&ZS($L35O}Z5*fw)5<6ez(GvU+MssQZJL2$RUN1@!(H(y%&mf}#U=kFr=J zn`%@d^ZZGV(&km|WS@39r@h{SVma-N1@By`C}Q|oqaM$uqn5?hXI|GmPFoqZCUCDy zZ!-*x^<P-4Ay$j@vKd)2HHcC1r1r&EZlOt*87(PKk`e~9K6U(8d$Dg{sWu~E1EgUA znO?|N&!wClrfPFVuZcEKYf7A}J^eONX1KdENX3eg_R$PI4CTN)wR}k<@G#<yw^V;( z+6CIsVe~aOft5HI*MTlVF=b7`A;gZF0(Q26uoo*fE;6=+lQVcwK{*%s`;M^5WOfjX zlR9Sa$u?}9%CC)g6`XG3r1T5asqcKt4RGStC?f5%=*Ai|r~`L#ICJbB;a?${caoQq z`3(GGX&Y?}1}Yw}dSM8;0`9NZDKY%mry}!cDw`y#B?*6Yk4xg9KG7c9IH3tTMns)m z)+(PauFREOsyr)$DYK$*@;7_D;2a;~L_*kF0oYWZ6A^-t0<FUtXL>iN3}v2vuU!%s z&85IUcpsJ}t<Fq!LFVFAU8|LX#W~yTSMx`$ar9><>(ZB-3V(4$C;3KV@H&f8`>bXC z2&toA=_Q@e#faf!sw8I=mGvHhq`pp1R)%R42=w)A|E9%@MG#W;^T;i)af_66(H{Q( zNnAK5=twG|<n+k+iGldL&c{1=e9qkmZj&HflZja2Ny2wbB_CwFhC%#vhOYv_9AvWI zrsdy+%`ANtV{k?1J1sCd^q+S91k0}<wvg4iA>j3w5^punh<dTQsH{ImwjA^w^}OS; z=k@IeKQXx(Je3L^%b~I93fA+UWp2%Pap<QEKwES8xxq<Ydw1j}`}Z9Rht3^C?P{yd znIxEoLeJzPFn}*NsZ=SeJVE1e$@g4(`A0&E@0oE^1<oiqfwDquj~$z0n98;moIvmU z)l+bXZK)L;#D})}qqf(o6^>~zov4(<D+IsY8l!pn-2}(=N~($CB!qOdQm%O3##Kyl zip{C+700#pl5cEkDT(UxB&g)iz!%=w*Mr;Mi|!z|%hKIyy%n&I+MUu*pPiwb_ns0& zH!HKMMl=$B;Xf`%N8xwn3?A5tcN(a^8K!dlj}%i9*;zrO3JVPARDXYnyI->gvxu5D z(T?CA3{fhVf!6;LAY9u<<iDg)m0;vsMY=Y$c_xo^k^0fMp{uZ<yd>5Tn`{zW1bGK8 zrxYUa*C~7UYibF{&OjLBY2q=FUHodjK6k8(+`~B{MzV5pOl?uD5qdI;>1#I?nTvL! z`dq%wDD6VY3W&fA)l>TMIe}e@%vsaw`(W-%5*c}HQ8G4gAZMzc?ejm8L?jgfqkmE* z?svIHgHOMUGH56G^VCOvuHy)cuPM9jNgUMkbQN{68gRy<_i`4H`{Qj`WFh*;<zVHW ztPHg2_58S!%&>zTk@`>o9+0smiPZU`tHbqq%>4kpe~e9Hzz*IWgpC|TJ5SXHHe;r9 z8cWbln`98y?}{sx>27z(;$VLpfR_0MLMj0LeW%1CF9S`>9Y{YRtg*-=t4l{<t0v5- zR61=Su7!b=Oht+ods~S52C5xN?Lun1hPcMbVD5}p(V^^Ze|@PWvdG|&8laa^Xlx?2 zv2Jc^YStpkqoB*T*p?}HPRbarSDvEq3?_wlxiWpx>K1Um^kgC@cDue)+gy&biX726 zlh1<ToIF))M&tL+ib5@&Iey^0QfZzlVmU7heCP4gg4!EXs%15~Ha1IC2WRr}FH+@> zv0^{4?t7-qv;rPAWnvp400qbg?0<sbY>ij~HJ8EeKVHFjjY*HRwb|}SU;B{)i~~sh zsnMu>E_;NC|F{pq`5PGrd_$xk-gTEE9}jeCq>QCbFdR)Flul`DWa^BoFvPah(@<G! zo6n>fCZ>GI^0Xw&T>t5kXjSL@#fR!$#W->xMgQG?qSUbo?6<1UY_krdZRx92*(ey! zZa*sw6=~JwGW5rIuyYmVR^X#aWHmqYo|wOAfSo!IbT&=Mr`kiN5vF4?)n^T1<|=y| zIR4POz5W@R*tJyg%&}v`q(65e2l<%_J8RF@H|4ZmV?D~0m}ryTsgL68lY9J%)7aH* z+j&k#u)zMM*HVW4P88GqrdqILtYYS+ADG+&?5*#wta_@?TsWPUGElY9l&PFS!0nEx zRJu>5KxOCG`Pr0!gFD{zp}5bD%vHv=8k7@`eY`_eR>-H8$N!^&vbjOXHa>E-Gc{p& ztDk}2r|sH}zkIIn3}hbr%xh%9TdCx*sMW5bscW5_5iXyv8qW8}xw&vHq}er3`X_Cz ziLxY~vY|MtggWOUnFxHDrI3V{;`&Kq%n-qyq82IqFII4ztVKJ_=WGep(@I70CQ07p zjKrg#(ch&|LluMFD0bq&vJ^)tCLUcx;>Rd;)uAX<_{(7%?sIWf&Y#TZ=X!sPod~`* z%Xn@OQ@?J#q2QjUXkUY0|K2-Thp0oCjvL>e5O5g<!RsE$!h$lDJ21C3JGV*?VLUTh zI+1brH@ev~I}r2t@Mr23VeE<KdyYzu9}UjovQU$4kZ~=@#)LY)0(8}^pI?JuIL_A0 zRf0_UpbSUBz*tG)K+93c!_!N&ILS|IbwklmW7w_e6488Vik*nD5`!RTiY8$Rh1o!$ zJDg(G&wXU~Lc>{2gj#kYu)n`KtbmUi{*fj{=e(#`SVbvC0G{d?`iz0tuN63E{Z4oK z!oV1)DbgW=;D1hTk%kghKt4gnZkjNZym)2xMRAeZ5-d^h&=y;5@_iAT&-6moq`B?; z>A(`u+y3eOs|F;Tuoi@yrt*Bq#JG_<jU(m)fXn}mt#gdJOWIcqD}tc&$&lhx{{a%| zMEF5gK#QCtBGOSxesE!E_(2NJZX>W_*OPIA!Q>@{C382&7y-eF{!g@S^~`hS8iT4u z={S&m)eD26ZMuolBiGmA13#^B>05d-Jeg%IOG?;tLfMHV+<5g@EGEhlU9qJIRbeaH zT@_Rb%gd|w8KFh|<4R)kk)aG8(xZI^5;7e$MDQsod<AE$zta?SocTIad6V*tvvdmJ zI=76r2=dZ}9z>+KNiADlgTO;W5jfkgnvpr9`VFH>me%(D@9%RGB8rZyFJ@nIeA$=_ z<i>t7k3?rlkQ$zPkS}2V*fl^)j~4c(t6s;xqew0OcqEyewtVS*`EcB}nT`kxMH`Fr zLZ+m*m9YJWf+ui>$#aDG>mXdC<foK<Iavz;RDge&KE+``pqya<TJ6M5SBWS_n)=jv zGajQ_`Xo{gXJg^yk-Wvu^zCcSb;m|m!yc`W_YB6mJd6NsI*dY2XkPqOosJn=_`+fj zfua%C0-}e)EX<`u+~XCUIr>s_*G>q4lZN~AGVSPn8yE9(pU+Vv?SS!@=KS_SNshN& z?>~2Vw><6B$i1JAo*3Ecx(+BynC*_9fWLDLS17FH%Eg@KazguUw_5<SNnjOv9Hapy z=>=2=7I)#(Q!O730YaCCw7=V`jTaVJ9(A74o7LMN0&(vrdIH5Rd#*lw@2MnNzJ~>o z7k@i%cRN!zmOas1Z{>WQ5r*2k+b?D^1z%oWH~Gb@&nDlG*KnIZMYj0&%#P+v2y{h$ zuY|p&RXYuqSQ}R+#=6waLH|D1Q;ZXVN4t|tKE&5*KM}rgyu+vL^+3q+T?Hp`d2<<W z(<!WnrA~y--h!F2v=`#J!}A60Tb?dpim3rqe&5bqo|N8;ip|NRk%_Y&Chu^fU|wJ5 zNM#zUF3V6AhHg~&NWTwTg&2kI@#zxKWehDonn+)5j-fs66dBg?i65l?Pk<X1;rh_G ze6vFfclcbqc)V1e=G-j3@JCNJ4XaOl<QGzexPlcbb56o3Hvw@>SV8%eWo5>i!zesT z5yQkymV>lpe_un`U-~$UwQAzGr-#XYdGyD&rJf`CUcI;0Hlsy%I=lU?r111{x^3PR zXgcc%cwN{eCV0uDaI+45-z)AG5KLF*5B=4`vGtk%+@s_lOXrQBxNrzPnhv->Z-(=e zxY3^EhH*DBpY8oJ%U9vHf**vpv(h&_+Ze9H;_$Sf-Az%&XvTVAFsYci=~ahVGxqQ! z9L*#oo549rnJ1LUYns=I1E$jZD-zW7oGek$oG66z#t~0Fv^A79P7pg3vudsYytQKH zmY+jOkK}}#kzm~CDmqNbReey}pwfm$f3-_qpu!aUexu!yD>To@ufhd^<gm;fTGN-8 zmjmKbjU6y@R-U!eq&PD=Y^R0V=7-7p!iI^_0!?XRq$_5EwOR$=j;l+E@J!#gI%m7z zJwSIA3D!~vG7(Y64U7Xlc>^@dRDIACkhT;FZLD#=WF1z&AaWP3Pv&V;4D2(8+6~{; zhHXG(HWmP4@=Igdb+4HyNo9fY1~<XgAJFHY23p8YR6H=WAjaLRARc_b$HKU$LaOIN z>VE3v!<_@loy4-(E2@t+ozi0il`rHgr1@_CJIQ3Z7j6ke#dtp?*{r8)pq`z}@%+jT zF|inmOSs(%4PP3{pabXK1InOv%nP+TZ>Hj+k70yGLo{Nke#1`>7bwL=)Ca%*9h)1w zEl6Lp62^jSq&(7m#@8XjTMr1hRgCnDuo6j>d|T;U^L%0IxJpd)z1`s2kIsXxI=mSC zxTL1`{kVwfez`bg+RVUkX1EcCm$Y}IB`ZM{Cr<;4H?b`*U<VYGSLJyWoolq&rkkvO z)}g*O4;ikMXoxOdEBVt3k;v34%hNIpp*>Bpi*s#P@!)_epIe1l!yjl_fLY^&!r3aT zY~M&|->5lH*-JDBS+o*z+KW0WnQR~u*oitfmW9R>!)NF%c<Ej74LC9@|CDZ`)qtz% z%P)<D_kS%|MCN((Emu;Id4dz4K!yD&;g{m~ZlNNw$45$5P=yegf=)2?DImg1?je|* z<ysReVyI0s6;1`K@YTxTr_1xk*j#7&ny7GAaAMnSK(5I%K!Pa(4s|&yMNDTRGB}d+ zJp0-3`lyv4bW&H)>;8|6{hqcNT5h|~?b_Xqn$094cgMlb7A+de4v=LMKfxG;;mu~U zOrC_LrAR35j8t}R(Po>LXA#nb$?bBKPS(V%LeZ>y6{Zrfrj)G-DYT`n>}PIHTE<MZ zKDQwuymUIwGz(HZQaLeBPN-1IR2ez<C}$Lu%)R~WJu_P~0IY;NN__37?zOf-rK>=a z+b>fW;NADRpL)OT66bQ9<nvzSa+c(E)*|Sx%%NOU^2;0v&xGu9%1~47?<QW?BJD{8 zI3?K;k?__{D0>&SWEc&V9Gw}HQ+c)+czeNo<B6_V&=T@0<?@dmw84t;&gOM6d7gqG zgfeajUe6a8shJH8?<W5JWcl{DWNNTHTdb)lRvuB(77I;h^kZ><`J;u6HR$zlKRr-y zoUko}BGu!%$jyPJ>ro{u>L1kNyO508+qa^BZue6<U<%91QB~u0OVcRHt&>Xy%{K4P zy6(-o?z6h?vAW81w^e)HEAYQab!&eAv|1}NiR|qplZVm@aFV&XtLe10@JGF~ag>o~ zwJDvAf^=y>-f_29QqucjVa%ta8yyOy4FzaHr#4p(%}*xX{tO`JOKH=&8s=OvubEY| zC^a9&l^aL*hrw%NW7m|osM?snGI1dZ<YqE|C0!EE`FBQ#1pI3(Z4DMB-SusKtZbp> zY+iyp>ErYoYb<jwJ3D{73Ie@cnXVNLJe{b!5PGl^PS@V@W9td<u-5^<mw+z27nGvR zfk6#ED2W&QxueyuB0et-9uWPdcx!|zB%9K|Q~ogaHneA2zi%<*zM7Zzv#$W{hqwHq ztWRbW61%h@^PZbanrr(@KnB5LDx~IAN*TLl2HRu4b9l@BreCq`A+v}D^|Opu(wk2T z8+YOFZ-EP^2o;NHY1O^Ek?wb-W}%61k;Kl~gbqz;?*eCwtR2W!AHkiJaeC}e*&iEB zp~R2PwQt>3@gc7;!)iBG@=+IF>K^-;Pu(PC9?MgsO}eHw;p;e|t&j%WV`jQPD!9tc zV7>Wfwp3>s>5$`0Q{M`uSY$g(RJ5Tc=UEu-3>D4!T(Q)x0F?+?C8*K$lx0m$n$Gcb zMWRDlNsq5y_fu3Z$&ZD*v$4r5_1aTe*W83?p{y`JzA&%8k1pfw1r+a<r+W!wHa8p^ zJ<YxV))$>7=lBL`L;+}~Opu5E`9SU_nBW%34;v()eW}XHTC>=pD<>}#H(rh|1XUB_ zQLa+vR0m3*As}LJ-Q&RF&l<E=If$x>xoLzQe-P}nJ$qNDDoTDec_sNm%;$Ew)oU~q z;3e$)k$S)MzH{83utO7JL{kNMioq+CmC+4sg`l-U##D6-lV|#8W|P@!Z?ncP&Sy{7 zpmDcmOsM7ylRcj_#I%wy%EfHmBh@+-%Y$HH4k}9w;MnKO%^7P!8^sSl43l*Q_4fk~ zTt1ApdIJ&uYv2Y+Mz`l@Vatd2ozhkDffQ^ly51lL0!*27=wvG%!0C0&&KicL=5LVp z8<Gq?JH~%GW5F5__LQtB^=c)Ti&ah4@JC9KcKNbdVbIi6Womf@!S<T<!<bH>I^>`F zl?9qX|CwIk;MAw50G~6cTF~!D2H`r&VI`AM1wxq{owOs_LHEU_N2oRi#!l*U<}t0Z zKYb|)_=HK@O67AdoZ5mFGf*gY4aMydtT0FPkU}WjS`E+?1TGqMGX?~p*b}V<qRcn5 zR5T3$v?oe=c{Bl$T7dr%Dk4QKh}sr8L8HGk*<+YPWpcXKX!sB9h7IaNe{E&kot=QS zW*Orj<&M-ut?iVB?Ap1%&d@dl6-uY{fS<_;I<^(!7U^f-hsUyll9beyN8@2u*E$l6 zVmGH-RCfMbh9Mj!D)_5RS!wiPZKNj-(^I6ib1SuQj<lBP{TMd$*3$G0OvdX<GG-4a z_DK{A<#SegrU}^)tbwP(5|c#&IfOK70gK^E)^cN&rB2&2l3|xt<JSJfm`zpJi$m4$ z|ETHm+YG7RR5fwK;62iy&7K%L)9)!SahAjwz+%K8J%G-68d$rAQ4gxs$~WO!shS%a zQwPB#D3mu`!K_K7WZf<U*?sFhE(jVyP6w3rAe1rSClszU0wqv7BY-2v6K!!v6`LuE zzT2EfeD+&6#IC&mzs=*bb-!w<-R-lLE?L;8N-$ePf^|t%<%?5pRqnlOu}$fOW(Th3 zI!3k>o)*APCR`<=9@N<cdZX)M_f4#6gHn^lZ#&)_9>CQCVB#m20a7&qnd*?l<|JmD z<o~kyK!jKW)ay@g&%&O#jUYfkoSO0Ulre#&-FKsKxx&vo%rdnq8It8<m@*YcNI&g{ z=|?2A1C3NmV?VW!)q;lIY}6l`vYrc{joLYKjg!IM<h;Vuw_<%bsBitU|2x8VbU%>j z$-`8Y3d;c?J*6_t0*ZlneD7FAd`;<vcB0uQtOr>bB5@usu-I5As9MDJ!PI?f*-wEX z{HG*JRv3K!WWo$3k#ge@)XvYC$(of);s0x1=7AcJ&R~kgBGX9adL^GGFxFf`5@m`P zb#^TnNxO-lO2V~|x%{?8Q6sG&9ME(^$r{O`?04#1jd4O&15)>h9F${BwHJaaOv2wv zWSQrz0YxD2ujg+gw*ih;!iT%mA-3IbP0Ln{^z>}_(VA34WZcp@<V;7~t5^SxVBUX_ zbb36QYj`woOUsNO2ms<bC$A%fddiJ`HKU(?KX>wRWeBTOf>X7~K~w)JO@G&@7Onvi zz}nJeQ{6mTlKz>Q0Hd9Zn)@R)ol+Ia6pm5@(xQkIBJU9or#g(zraaZKo9OTlf!Eh{ zyIlWPj24IekyJgOCvJH3y|^q&`FPyh%d`K{Wj21e3J;uWcwA<De+MwK4H-7&Qh=+Z z7rhyaviY}4UF7zT3m`)URDnUyZ7~cqIRG*g$;feNIE|isApG}%5`wz&@O{ssx3%6= zw|9FvDd_-X)4a}laV;GVJ!zP_LT!Fn`B7QPuQ0z(SaQ-OA)yG=<FFYe(qKv<4?i|3 z#II6haci%KRM6<;buVISsW<CPdJY%qt%>Qa5AWw$tY!kpz{W-dl%u-yOmHkHyV90N zt_+=Z)w^wUNgJaeLCOr{xPh0+0GvVmOspVXsY-_x5fT!zvZ6^GD_Jm&jDo_-!lI<C zq?}Xahw23_*ehp;NCU<G>vMu%&;^9`PNw_zKh?|U8b6su1|&5ApyX?c68rU=40c4_ zi3`WX8IY|tu%*iSMCg5KV=!*1S++PcbLwt)7MW$PC{6Ec9e64VE(=sFn%o68GR410 z)Ih<WcCkBsrj>>Qs{F)dJ+A4R=4wm=eoGF!1(8P!7b+Tnc|Lp;q=CtG>J|UW+#DFj zUqM5I_ABCvm@`IgVQUwj)fUPll1qT7(Du{KVS0KxY4{H+Pp0fry=TaO>i$il3m6zZ zM8imC2$JHm!i!f>lqggj`mxlSsW~tsj;eo>5AU?Jb*sF6(m*WZtmz6^hiS8AbeQo6 zf!qgwQ?=P8@qj(Pz_)aXL+)EZIttRf53)}OZMJQs>rlxVT+d_xKM-p2nJ9=zVBHv} zI7wIf7YibIBzx`p>TvV}7aTxZ(%7g%9&g7*2$K_+l93XhBTSVTERv^Gnnbs+;;e$* zQRkqG_Xy(?kiGR)K}uc*VZ<+8NF<KX7^cpnd%gUBr=pBY1dI+=L{ip{VEmVB7=k<^ zv&5G*_SWJN!OGapL9O>BDE!jHuDStpRhqe4A0B~pQYPkSl}LUmZQ^a6G-MU7-oOK; z?*!I~;JNsL$K*f@MQP5mLLG9oNRStLAa$Yr&lSaR*<UkAa}lc_tU&1g?JGAZZv`5x zCb-e^18Mw>jLeLEhqMS_3$__?u1jYv(tqTClc<e`MR|wu&ss?1hwAEB1aiOpe^^gN z10%~X<}1-QrGX>LNmG^Rq?~@@MJg%|=fi+^z{h=xzd5*s%?PwTmu!fD&bnW!T8)Ae zpXE+_kN>2spxQB<N!@zhs?5YvI|~E0PXP|eXB=Elr+4;u1t5&<0wtA~5{y8m{N@*@ z#I$)xgA3S0k>lNK`6B>?5e{dE(L=<BFG`6?X9*l&sjbriEki={zpUt}LpSv?hxSay zhzg<7q$Yr-Y1oj%VH)86pUiuFZPY}y=>P+<1AF~e-SSj>TrtAIIy#jKUI)U)85tS> z6pIsy9XZg+X8AvWA$8YFRiO3&^Jw9x#7JN&n8V<RlIxE)o`Y6u*1rQ)Y8yFPfK+;% z*fG@v>L)B^;8}O@@%X?Nk3{nAX>X?<_=Fc$TXJa_4K}N07Nd2g)%L8s+xeH$;B$-J zo^)k_QZ#Y0x%QG`X%=b$hW`k;f;k-M>EBeh@Do80LNtV65$J#5pJRC%<1)4)KOpPQ zsoo`v2}|_zaAQ9kxw|bNPNTFTQft;zV3O*m{8O-_;ibyZjWdPO0uokbNw3%(ZU1lZ zz#_VxG&eM0VPm(px67xqn9P+Zs;a7rhN8V~hmvGvWijfs^&7JYy5PO2LY*%yEsbSy zv$C^egT-wV{$H}FR-{D@{zEYxgz-5Zs+~@8B+MzhJpr0PyI5S#2|7hg(-q=T*`AP- z(w48(?)Y%(53sI*%8qok{cLB;`o~)cJd?4}R*=9^f??%7%V-Mog%%ndz%7l)6hB&p z-e&;wnC;bur{V@gQ4{V{fdZ4q^2+C2Whx+b*!iJ^`%!Pza4F%1Gw62~c5o3sjE0Mm zL@Z3f7b>nu9mK^)k+Z?7^fIJM0ovZMhzB^2Thw0j)RMG0a>Xez?Ex)HBD9&~=L4Rf z^=UO^98q({Ofb{5Yddry7S_Hb3UmNjdTjtY>_q79NQUMHikttBJy80uqAV$KoMbF) z9Bdpc92_jHU)Lyz>W0{o`Bn?SyVep-wwV(uXiRx@{q%(AlqOElGEf;2k({HcLsJa1 z)VR{Ni?S4-U^xi1R*qpTEI`BiD3r2iK!-FY5hs7K*57bPx{or%1!9I4#ZIu)!q!Q| zH_ztiYrPBhTC4ZfoGDYB9~QIHL<$Fs7)2I3Z}B{jrwd=OH~T!1&MYiYVIe0bB=jiz zZuR(!hJ0pbWqmowwC#F-KE3FAu{oZB(9+VPqN3*7f8(RaLHRW}GjqL_CwhE*+}PO2 ze+v8Q7krX1M%-7*kMH|dl7QdiU@T;{px?L!GFJd&a$N!)Bnbdc6lm_J^`4Cl_URp8 zi<}~C!)cb&XZm>;5kOkXGk)^(l$tb&7luSFqrkccthO0=M%LGI>Ysvt_}PG^NvQn( zl;-u=w>g*e_p2z_W1A>)cM~P|0FwT#@Hr{EeU<yjt<p!21z)}}wtn}O+%qLC7Yh}O z!1?qGV4wKS$}bTr_VoTAqo$q)&{8lM4#9+R(xwuoE-oBH_c~@N7Np3r-$=G=R&B#w z&3Ra5ki%EG#s5r766t+y`8o2KorfYycggoueVz<2mgj%OzW-3bxqL<}@R@n-=aSuM zp6ECO!(e9G%7i_iCqzM^!e5|YOn?@FT&GWxM5~3uVWKwRZ`q%Thnkd?>ycHNMEUUz z4+axo5NqXmG(lEb7vfp>>sZHyse0xYcoR-e=H?t`JDXo;;T^bHe>V8%8}5X<h&oMk zR+EA^+XbCs_F4ON68<Up`3tAQqy6N&bhzec_Tt&xPsBnMy3t%;AER<MUY~iMhg$DO z5zy0rNKhq`@VV7!(bd-0PUZ@B+wX>ym!CFo`dI$_>G5}|R;^l>orA;YZ^C_Y*uc)e zUDZ#ZU{HNBgO!?rLFehd7Vv+ze$uB<S~CP-a1puUk_Z-BAk~&r30ylJvpJ6|AYuVt za&cvAsSU8bq9~2qlv$k(w}_N{3(r-X-#UqEM}nUGGeZ+DVWNc6I~wH711`IW0`cV9 zkQZRcPv<MSYwUgaf&8jxg$AW%sxjxMElZ*0z0|Zdx#+fv=Y?J5K?#qBIof1uE|~6- zS$dP6+6jAD#t2ENdYXtB0ejBQJ5jfv85U7Coe!u`gA5LIxOfn^?_JyV&XXiKg;!jm z(~DaDa`s)lqZ=^|6Xp*HnzpfEK01G4a8XoY;2m*}IZgO6MZa?&k*HFHekL(BF|>Gv z9Mf1Lw3oZ%4grfgF3c{6TNK>Q?H|ue9XZjO1&N}{iuzvjaqZn#68Q_f2_@*iNL@>% zDxW&<$2Uta^GV40ydLW>;;j~?y?!5Y2!kXi2d57lkwh1@PCi7nMpl}XvUeUquXxbh z3Yu_V7DM~K%&M!&R0mNev_Q%y2r3=*VCKDABo7ApU#J1y=r(Q9tEG**E^+D<XOa;4 zA5cI=nxubz5U=YwpZ7EP&>hz1Z?o+tF}K6sqMmQ3L0?E(TAFK2qgPu#t8l;}+Gn8! zqt1>PztD`{k8;lq=>GxkW#IVALS8~6PIBCm2qjJ+`Bua*&*b^F%cPAdH31=Eq|#y4 z9Cus7mMj=UI&(|fu1>B1lp9!`Fy>dCAVlC*SFhz-tO%$qNDztz&7EXKfEa+&jV0hJ zame4z01z;_thF_LayK!I(u+3cPhKH<?pfFh+!TV9iyF=|KTitC4QNw#8UxZlbo`x| z7#jo4p53K2SHz}-94$J4Uem9X@5khpI*8#$m{NmW{iHczPtfvw<ZakNScZ_@6|d@P ztGKhxd{0cBn(bp>U6VnjM5DPmx{jZPKFZj(!)dsZ;XAhB@VYTf=l~3fl55SixANcQ z>Hj|HsO%Lv0|a>6o+?_-VL(%D-%l`0a>{Whf$?=AI5fTQ647O0Pb^Nc>x{+NgQ9hG zQw(tn(z@^`5vi^VwpZ$*;euQwZQfi(x5p?>NciC*1`)dalEvARZaBm#6On^umYEyw z%YAnW!Du|J6Q;vZ1?WY-nGFjI{H5eonhZaWD`rcb^QCJsO6~*mXC(PviUHl@#tYVK za_|=E9V!LqoIT!#Fz0()rdoP>Uj}>rf%bdDwp|N0ooW;@|H{AsfSf#F^3Zq9;l9zF znTAMz>YJZ%{UH?P$xibeOe{6TU)1Q9>&`}b{Uv#^05lmtlmJ617YU+-kvm<M4dQRN zz_#*UvgvG3@LRP$)}Gc<IBslDAcNH&r9LV*{+f)xuPK*s?3H}mORZO+l<o7JX#ggV z=9PbLEGbl=DJv^8XXA<OGg4)}rgIQ=VC4P8knMWVtzX~CWvSdU`-IhPNL5$cng^SJ z#Sjr<${eET#5iE9oQA0|d(8WZ3Dw)a@z)M^LBvGm0n1U;$;k;Z|KF`zR2RjmQgoEH zF>S9Mi|}!U0uge?@bG&=&z`fv`9%kLtkTnsLvPJcP_IuPZfm+Nn%ju<qR>ia#Mj@R zCb>F1Han_xnQ`CQn(?*47gr6o@hO@ZoK_>d1-l&CayM>;K!h+@d$JSSTcU?#OPiH5 z+7UC(Qx%gR*vBFp`zA3I3}21ZY`Vu|O8t4F>uK2;N*R*nbFdIGnLEWHAg9OlaLYw6 z?iGU(y;Pg0ivZ<igq#wZI|XVYoztb3^r{<op%~leo|3t<zqyqK1Cr?JE<tw@vFN|g zF6h2UrVd)@fuHvs69NJP05U02M7#@qeH3J5!ZcooQXkYzBh7sZu5l;5Qj3z;9^hkl zMMY_0be!mZqgDR)O)-EQe+!5Rc)Xt6FrD1sPlNghyn{&=@YVx#Ld(U1R*r2o!DZ(m zAT}F@MolQDq!)N#ye|Pzni2yGIhbB#KJtV+zl>{6r#jS=u!;$4t$u6G7gr~(X^-4+ zl%cr%*vw&+l_2BPxrEZHVwkL0M_RCx`!~{m2Yp=H&D<F^OvKJ4#sHj!f;bvB{B@%( zKe-a)uBXS{m418+?;H}Ar6=lUSfhvaNa34JI_l$zFq32A9#aA@5~W0~UlMQcw-F7A zo)QdN+=i(i6reU33|~KV4R?01J+iZFYNv9|`o<19^IU$>4S6viw^irWj||VcvI;ph z#N?oC)g#uYm6hpJw4n0{!*2ajN}ULVkyUaGb{c5vyPcCoath$wrpNw5HM)Rg)`QNK z2$wj|1s$-=Dun0s^<U696AQXf(`5e&N%1<p{Z7DHfLcuKsKlnwz58lLu_X~bxcm0@ zhJcFC_Akc&cZ(n;HFb3VVjz0^fsu%c!%wXKaBO^N2u!o553AQR$;_W|_^jDb0-lcn zJ!LC|!xdl<)@SNYn4XBjn=b|i^0$9FE1@jgKUq%}JB#c+Hgs`~!TsfUdT!%)+M#_; zeO5k)m+TY|v$E?%AObo0AWH5xv^O<1buo2O_GYcl<Dop<X)2j_Sv;Wc;<CPiSX>?s zSllljykj)q*a)kCimfnL^rMT@QbYAQk6v!uS+UBFk;5~$>F%Vu9Wc>_EiUb%MKR7w zUoL3R@`*Z}8yeWM|Mmz)q!Q)hwehsJfxU}H&Db_t9Nx}H&>PrR+E^N)qZu$cDvGnW zkE?%uO~a)mTiKyfn%jEML1a)#sAREsnc3iv@O?>sdxxA6EwlcVH<aQb?17+BSJ`^p z!H2f`FE$P;3y^+jlBxeIvU#J42&BVXHKPoosH8DMwr8YxIedMin^y}l;iHvDYy3SM zj-T<F(E4Eb7Y-L}cu{3sw(n_bqi)rN*+pkhF=;Nmr<_2eWzmJv%sR-K;Rinhen~`N zo4a+@(|M_&Tfc(MT#09Y3r=*_qV_12QY)Nkr}~B|;`av9fY03QBQC|qb)ygD69S$! zrcWEuXw($fN9v6ewQtr1pb*P%@;Jy^q}-ILmmqN~m|{6#oG7TXON18lDtrzElc-m1 z?&svVyux<kAzmM+$Y5%hxz7NE1<d7ocTNUg!<D*>6*Q`f0ZVCqW5u_+<#Zr%Xo!T2 zhz=xLih+W`^Q6W*t=JHi-v{`?ReWt#g>y7N3xAKyAfv@FmL)cqHQ;qluWDvMIs`1= z7TJeODGjfl+-cl^6kO5*@bX2-T0xZ=jO;Lt(mkzZcJ6>7&WV9k*#7wD;h(&oM7_R} z7B#QG>)LQG5816No=2Ac#(B4o`Dj09N0(o$E4L;M8k0ear1NZ4M}q?<Zj{(N=_`@% zeG`z~jU}*i$aiYpw2^U8GGJ+Ne%Voy7uU8SDd9`#F1dneEB6!A|0dM^gpZe?D2Pik z<cnQhE9)#}Z)8_d>3UgNO!<1`hZ;HH*n+)=&yh0%sCzVQeT-#}Re~tR5AU&>O)Raf zWTd72i}-Gq>&?c;$9=P)7&S$;c%TZdFsYuid6G-8FF(D)@%HBF!ehBz{5w$L%)!M; z*~2wd6nCS~2xFR#1|BPf4^;T6aZSqx%ra)vZPl*g2JUuoBUMqDHXk{6_z6frCg58h zETc}dq0wAU|G6zLQl+fG-U85=3pgK)GO~#YoS&cP_kHJMV3&oFQ`2)NJKJlkfzVY= zYC5=QoFyO2RP{hLoP><`hPDSdGV%>j$8kNT;CzxF3wLu~e|rx}7IuWDgl1QNx@L>B z^M0(0JTB(COC}YKV;CaL+BrL1%*SAvvyJL}agD6{cYCGV*(M_UaIWzXw$9>{Y+OUR z02Dr$;o8e@{YR#-gwc4k?6@zXdBdow^ACF2q3O)AjUr3}8A~j`VluF%&bPe}MsS2p zfKY3mCiz*4cmILEBXuT0rh3K~j>fFEek<FxXE;V3!HrMs_Id^|XN*k5e3li#@yBt! zfnC{riyQ0#gu~!KLU3cXUGZ5v5kNv=&a3mL1vDaISZ&kQiE?!#SIk{?9!MBF#)JQs zMVWL=vSBDI0}nW!lPkv_mGsCOHtB?-KFd?Y<_p76#J@PK;dKgkRpqJI{Ym=jk0u6H z$mm3{gAw<mD;yYM_wjzaVs9D1`lVoQUdisj^jF_W0BB0f(rtSsG(1Z+A|WJP{hdw! zcpvMUsO(%2#v8txo_l11!Y<y`nB&ES4sJ3UZjWNzbeq^i2lRkUHN`z10xBW0XS2Tw z&!cJ<0m)|Pvv6z}JU7KFhqMPVhU;&AigR&-n{DNzI#7nkKhteE_hHFZ0S?OwG<`Q- zy=D#H^Q33jn~o7hhVJiBOL6mfYC63^D=eHkZ9@o;y9!SV>-y<Utc?*24=fee5$JSS zFx>4mVxS+Rr~d)}C8y49{XA&o5x?Y0w$L1%Y#Q3-&>DU`$dPsNplOCZpD&`+#xD(Z z|EihjPFHf7!S0LVywgRe%=kT(wU@|lX&BJdxM4Qx?&EdjB(nR}x<~EfeUfwYN5j*~ z-9%YCSKDXm0_t_=>#2i3LkY(c>YmD)Q)a-H!oslm(8=-Dr=t+tqv%e@LpgR97G`#4 z0zupP2)d_3W?+{AZ0+a5{lvtA1!8{g@%^3N`J9)9Sdv`<Z|VN=8F(D+<pIOJr=Fau zw?%+9m-&==&3Jk{*W;g<E%WZDbK(0zTa!AL52zcOeFyh{ML}Vz#eO#`DoV9l*Zbx` zmLv16cJwX}($vI3L4mn7-SG(}1dRlm<39)$%=hGt0&zB$Bq@Q_v-H#hBz9z=fXAYA z&|t%!D;OZ~pLaiQdPLoOtROwbTvjL!uut8W6^MgAe+UGvaVnJ7UMT!?JN%oY4<~bA z>q;@|<pc$rc;@~vnjh3zhV3t+Z(&+l{>E_!wCN2aw<v#mjz|Fbi^9)AlBk}F3GKtx zi)N>31B1$K8TqnLQ0rju0<44&wy<mkyIqKJc)0Xme~<g(wfgQS&GRn4IX*>Sd@<6+ zLqz?h#HpAW$LTQHY9sn1+lp__qrYZbbyMrzayY8hXM_6|9DNT>4;lV^nsx2dJ26G0 zMG8ZLM+o&buN<1Ol6-#AXin*6oA)h|7SFmZ6g3?G*v+#1>UVC4)@LFPkN#%SKXR`( zNqvbva`H@xJ(H?o69YjyE4O-s(;qo}zt?7Fevdu2OW&xrZIrdhs>m2u@MtfoEON%W zhyyO8wuA;GnGeyc1j*?o7~i@Xq&XfeX^Dy?RZ!=?%6e^e{yf@v!mJiI;ATq`@F)Sp z2MN5MWUcys&GFUq;EW(O_o4$H%jQz&hMlvP*SO+RlHhe3kBYY|7xH;z;s_%qiwnO~ zIPdb9e1Uuy_*n?X8xcaCY~tRHtdKEI-b09qS>~U+QaV`ptn%sa(_D$a!#6zY`%JPF zuTC!+b7@4qaoA5kcZDiO(<CKvJ=V1T>O`4wbV7nSYz_##FprTi@YEjTUZ=)AuhTRn z5NFx9M{Sj*cBo_tWc-oNRC6GXI5~X5w9!<8G3z$&3ob3z`V03~*brg8Lj`{E>_!GU z{pqOzAJHZgzKW7mR|1uUD{1U_H1DbBLM^Z}Din%%E1@?d@07uKKT_X^fxw(qS~8?| zpa<HB>PN<Qe2rigbe{_Co%b&}MKvK1ucLJzR;vBx4}2RNp8mDDqxNA(B5ewqW{ndn z#7RlrOXh`1oT&H{p<J<3&G(BBmi?tzgalpt2)DU*MLAZ^*PHS@+g~#}#hwH7`{ivr z<z0c!t>^`rWJ`VGD~=X`Z;XXAasv9ey0>`OiL<E%YaF)fzUHHa$I9c;T}02-(4zE` zuY-)n!`Kpe+n!kFSB9$FkllmXzuj!E4cXkjmG$#A>-DLj>t$O>!dWW`HLs3UtDY_Q znWOtd^~=z7+0;M2-6y9H2+h{A7A-yg)$AIze$V}SzsW<~A|LStJ63>&2&bs1c)CzY z@Gq(Sc(n`7sz`$cQF{7^S#+_yIBF^?7^&yc%`O;%|KtfsYNd1(kvMvi^*2I5gx+H| zF3|?yGUf)1HIhlSV_EPC3aqvo7{q@<Xj;!=oTBsnw}2b`Bi!c(0mG}>z4gU<`Ax}? z&V18j)4p)Z-&xml-nCVJajI~~$-@7YcTiH<lmY(?8FY(a%Kn&Map}n&>wYwx3bIg^ zBa6i<D{Gfq4Bdr7lB#u8Yaz^STBhdWhwG!wS5-^tD2cfrLA+YVQSl;`S4UOMEWKjB zx1H@J9>TQCGgOq8+8P?LZF61}c@)(!!_|u2G!zh|{QRlixvyjfm^iOsnGVO341%PB zuZc|sZdciT=2ybIwY?^2zb=ZJ<n=%HvGOtgSi&WG;7gSj!^Pb%u-mKCY*e81lj?1G z?3-;T^zMTzz`TqbGU`O+<00Js?lymqC{iM%vuZ$XUhdz|TqyZoZY{^q80+(+4Bf(m zjr>&;%(Cjnmy=CuQJVNCRginj;OvO+UP=MK`rF)Rv7P(?7=5tAmAjBMSV&gEL{#Ii zH?Jr=;YmA1NXLf(Gli+8V$DrZ-<PiLi9eTQEjF#&x9yBtMPy%h&(OPCbKHSA=6bX` z*=H%(dmTf(_5;x;N;acfpq8oepMB|8D@4Hi_=np|=Yn;#kh9Olg9QV(Av}or5hFVn zcr=soQJI75#QF~d2dTlfBizj%QEF>JUvZk=P894wON)O7&PfioK8%$`2z1T$vqT|D z?A;#=)G1e3?3F-NFaQ`CX8+Ao|96W@JH`6%VQKClr9EZC=Xiv7#?i{f@m%|7ZB6Gq z<OEC7Pn;-tTp!mV(xYoI*)TbS{F8kK5pkc~&FM>{iYqK&)ex%6j#i}U-mH3Cs2J8t zjIUR0_DK#K&R@LMauVzDEz>H3UZ=c?t5NN42lqTOT2x^T%HkK_Dh}FEwH?{ocJg2n zgx3B<gsBe_gFFwk@xLGmTYr`I6L9p2S`L7g*c`ige&4HKJx+`0D2y0F<y^-}*F0xQ zCvguXEn)d?osTEsxR>syNHyBcCS1XL`Yj+r8Zv!Ej|Bcx;r7j>d%M43d=ORV<>lt2 zjI1chgKolS%-`OKaLv{_mPTd-u&paVAGKm<&uaLn_f_H`)8$VJwG8R>VGM{8V|aSn z{`P2^POXa1_uWfFW7&+*z0T|@J3nCqO0AH!$HF`La%lpdYe}s%5&HbDL}@&;1Z?&- zxgVK<`c2U*SpX5}%+X_y4`edQUc+jfqqU0JjZQBYF$<8dv5wN-xp9-fjAUg#y5z$b z0-y^)OvN41DIWBHt7gXps=7NbWyvazGMZ(>Y1~af6-z=;1ba%1?-!w|1jib<UvI%6 zRz<i@cY7H&1!#Wit<+vY`j^uVYqK2f9wcP*j-OUMf-cH4!O_aGg-b#4rP18^`Sp@x zK5P}ccVkrf0pybGUqvQjGxx7^-B-OYa!1G@hEgR-X}1NVuR1vD)$QMRofIV+3-9i} z1&S1WbzD-x(zFK%GSfXT<p>LM<5hBh9rTdGZN@>^va!ai{WIDBra^u@PN&ctWY_h{ zKr4iYfaf`c&3sP2v{X_)TCc|bi0VQA2cojh@{G^BUL=TR2}<&BGPE48sZreqbrE?f zc7mt~?f!NkcO;qyuMJvncBK`%D4f0Y<*_0UI3F<Tj}~#mvQ-oAuPW8iVo~P$yn_<F zRx#UPTy4K<gC?jRr&hVp;4uI1H%eS9K8{IYF6-<rRts-8_EPA8{-BeuFOPjPS=Gk> z7gg^VT}c<MjmGJ)W2<A^Hg;^=w(X>2+qP}nwmY_c^PY3QA9sxUQKQD%wP($ms)=V^ zi7P5OIrq$CnhJf0(QR0D?%SCK+4eUTL?d_Mq~J&xY%R=ufqs_6CR?|v66-i+on_U% zFs7?Ir9E!Gk2I|eUx?4-ogKR^F*z)7lWFhVCD=NgRsouFkF2M4ug$zKY^^>;t;b^U z=@~Vip364+$r0gVw}GJcEE;BT8u4r`+h#xEZ)I>7e?binu?eB4TH~>K=<_f88#qV# zFAridCSlQjm-|mcUd`b*gP@qO$>-BX)j8wWbKFp{DPJ$cz2DbCH(|i7^Qf#`VaQzF z3JvolKe4{b@c5NG$d9#6986h%aX(mw-nc&pJFV78LP=c74Y<mDuiJ#J<ss8y1Y?zM zIQ@RHkqhSb^oR@}=oy}VBQey?1H8*_FeAh#;o8l<gckW`wH#Hg_*DOL9=B{gx)Wg9 zvYoqP5nO-IMd)NT!WEGE`rSWjF;U(6mrPo2>qlS2iIME)`MzIgei~{19UXlNXti}r zT(1DFq?8ukE1zj9&0}vpkT&qL_Bv~>9u{EiI@xTgr>*%}y&%cBeUZepHk}h$<Je9+ zL1(m4!kQ4Qa5azQeBs>PSy7Yb$Hpy?Tbm`b=~KnEL<G1DvG>WLLQn+~6YR~{pWC8p zA&RpT3~aYKA5hBo0UM%Qz4b_VKG*DcIFT7Fwih*g)*P>(Smw%n3s;&;6!AVe;aju* zi}<lF>A$fUd{$HK4MTrp+CCKB*2?RyLCA7{mS-l*rFf4zULb&S3W@nNy}SiQkSj1L zX!v}tE1egCei^+^?S8}J+A#bCdu|WCd{e3Pr+#9B_F94QC0A<NA|O!6<@lEywJ7>F zHoOiGdXmTsJ-;z{y$0c92FFp_E2DgJ99+9D<&X;mm`t-qxdIh?o?7MabJNMa7T-iv zLZV%eic-g;G}GN@A5uRr!0%mtYhf`g{LY#(cRhJ&f?#)!5FNIyHcr?+UH)7*Z>JV0 zW?5U@OM2eIceick&E&j<4_*pUinqyZ(K#_`?<0%OrZ!g`Wva+_zjD{4qVBrw(uF{E z?&2KqO<PD>)0}rKCy-D?Js4hwr5h}Y#m$%jBe<}sT+c|RL%4Z)P3uSj=c>8+OVvHB z;D`btR|bviViM4BpF>)mYT0BqlKGmA?h=~sfO+Slsof>IW>}+!#C@x!BQiyVNIB?z zp<i;lg1>L!Mu4kClgr!H{tq2r>|0n#8S{eFu$J__`Y{;m=%5}9U-bYLX6iY6%%E$& z^Jy|6v81>?hW&th`;+xbuuOy6NB(otcSf9RBd$Z1n@*Mm2y^QnC99CeXe>Wr;L%Pu zSM;kC6h)rHAKHfp^4V_MS_X|g7DIFI#dXJprVfQavc{zERxGD^jR%`VlGCcCA_(eg zUXPQhr{|Egj$ImVX+>zgW*|3IIa%Jr3kGprV<tI+cVaYhEpsN?Ih|*G4(p-?sGj|H zh#*Za7M=ygG*M5hj?bkny6^sU<5c;UI$2xIdNcLG=vOGWCs<h-99C*{zW+WOjw(@2 zXm#q0p`>GP9L0(P0zjCU8hXASYrej|h>=bkbjeq8KdQId-{*l=#JT}lJ-%v6XE(|g zU#X?UapJRP%=N#1vaOCoOA@V~J~KQmn+@8?4A@rFExR)`&&hAa7jRQt*qTW4gOhQi zSU;&-U8O>usoM=i>ym{<YyNwsGk>ucv+PzZqhIxxBDFwv5j}fs7DF-(Nva1|TE0ki zre`0{1<6%hX;-@BRk2Ncyvl;5f9eRQ4ew7Fh`L`|g3H?49_=dj213-;;hGxj)0_JZ zTsQx11mlc*Z!6B=9#q1ee7Lp^O{YrRw~nhQ5uL6l!7J5cS@14S&Kr#H_I04wM97v} zRnF}g^}#iX4AGRu+{>(Y*sUkp>!zh;z%|s;<33&Hh{~p({d-M)tVE2Tm}Q}p$<h5< zD3=He##?FG_DYLY7pE+s7qK>IlOm!zJj~?Xcr@cEP*JG>`c1jzo3OH<vw5HDG(X4Q zyJLNhsH-^mWKRVmB#+a+EuQCmF7vcw-efRT%46!N-p146{0wNHvawvAdZ`F@+bbl~ zQPh@=-f<-=plrhN-tb*CU~7OIIlvrq5`p=I;_5TZc+}MB`}9B8He%sYkHxQd9jb$? z5Xzo^CF#5?)ZM&lUmG&j?YevTDi<+rX4jrEK+DCHrLER*wF=jigJ)5MT5`o*_Lo!( zZnL+!V+;ibMGWl5VR0SI{iLXfSGtI%hoY31?E<m6J(0dGqIOP8ygRvis2b_n@#PJC z6<%6gOr9j~?4BWUSXs6ruF_eXl9cEuh|$OyFAY5V@!U9?XqT5(`@Fu3!L{*}4rE#h z4z<R|m3TO{tEkHR89S8uBTR-dm3WPo)3p(Z?6gBb<gQsXFSVF{HPA?j;`?yPzM-a! zOd`NzfAWEFQP}GzU`J%y(yVX%H?+3}eZ^yLbvA^|pEIui^5>At!w|&Rva=&Rr2WYN zi7y2j6}CG9`5;tA4b8@7@hvH9aAl@wuJb$zeR{1W;`iM+Ns+r1&l{pBMPKnbq=KjD zq`W`F8mX9IEjC&>LwRFel3D2$)4}K(-7>li=M#0J<;LqV8jCkyDBfywEUB-*Gi2x! zOWg6S^^?U-;w=Q0DaBO_Q1!L6Ve4h_1_RBc1tZB4Jyy9-U2-BOdWJts_sj&1<c(`s z5t(v{&g|mxNYg#r&UiI7knD#^TSHP06kb;w9EF<TI>tNx#r(4hWPBG!+zlN!$fO%Y z-M+l_K_@tO5gbPCkk#n3OjwY+DFCU9&3vVvfrwj-+S@K=POgFpuW5<@vF^~Urb%d- zVA92N#~nv<q=#G}4;nh+r)y49Joo_uD+O+8SPsvvib>a!za&*nysY5wkNXV@gy*!b zV(Wc1-c!7bOC^-j2Uh0V(k^-~hM-%ep<6Rw`7~{{ezo7J+lUz$|LZv6z=W^G)iwJM zedEz*X8hnhuU#drIBlXJF~x)wEvQX<gU9==5b@x+X2UrKX+&XV><Eh@W#^O}gty&g zW$R9@c^MmufZ&;zV%hR3{}LIe)3%_V5vIV)O3WtXUU!Dwf!M7gM6v(|4Z+3Rzi7m_ z<jR{Lu14M!G(wju1O%AB-EofnWR^cPd?V%CjqzB3U*XPY;wT%9mJGkYv@n;9(V$Cf z60QkEYe4X?9IOB=FzugJpRShAV$GmM%|Wjm7SriUxXG%~DUzd1`x}@>uGHX;v@kf= zI<9t~p~p}Xt!Dk1q<PB8BFBUgcKDYC>Vuv%qJLkG+MB=scmYQKx&d8aZEsWkm4u-P zaEJqmjg1d1&eXx}a(xWZT+PWzPU6`L?7D1!GuuC_u<}yHFU!{a_L!-PaWg%qvs*)* z0vM5_27q}~K5Hlj-pJ<%#$?3}k=^;wP`14c&czd3ly%C*y7Sl-_idl=KS!pM2NzyL zCN&m4GH+l;-%&u63Zo^1or;z3kN2quy>Z`KDcSXog4>W<dK)w{$#z6vIYmbGnad6) zk%%|pspcB8cAu{w*AiT1-6dAYP<e`yAhFv{{e(z<KuE~Q*V|nYeR^OZefU#(?~1<! zUc<3>c|j;8_!ue6lzxu!<NI(h!f3yu`*FupitU-^j?J`<y0#(OXW0#Ob*EeVQ*SHf zJf-bT@~WAFqTtTE9o*|#^#v~D5lK<3EU`YM+M=NOZ5pfjJ+00$F8}*R0XQfm_PJ~- zQCe)?d2caT&SpHM-gLP1WwIlv5$z~dnnrFfR$0FbUIZYg_3T)Dyq(1a_zR#3YS^=| z<t%8rLK|@nceyEPtHJHHz)ezh$ekjJCK+1ju-Ava@}m)S_IEzgVOIWt6;rbiyJMKo zVp_Z>Q=*DEMK2vZTDdu{d=3{5kNqOmxb!Uu^FkEo@$3iW=>wI}$Y;?bW>#@xj#A{E z9XqU+r``h|1{$z9TF9oL*Up>RM`K8;j!!nW?Xqc;iuU!pU4%quLWzu0owDQ`<Nj^z z-QAJHffd^gIYVQJc}s^AjfN@UP;}21y3ZbW>=4^K2|ez4Y=dZ9%uOM<0cTY)@3^*w zuMnpF#Xw|FgR4p{=VL!l%Ic7bs-YqeoX(bIj=i}&#~9j4HO~bb(|<7OtFx`qXi2l^ zGO`%mCcQnX)4IG1&OK{bIc?j|$aT2>66c<CRE<ljvX)b8*`AJ%^T;vB*D*0WeBZbB zn#Zx3)@gupfwPN_WqeMPafw9NZb5P{ozF?rj56Q^6+`#+hOC2`>a6`&KfA1a8#6yR zJ3OL`l<2z~=_+wH`r_3wAjko@d&Dkvi5TjLO|BWc*OfQEJmTI`rExLsXMCFjllr|u zTbABa$qtjhrp#ZQnlvHeO{uxP@>y@n=pP=I?21C1H$HKquP<9GJ`+R=<=-J~coXQ_ zotlG&81%i?H-BklgGM$qSnf2e7s=6ZSfD}Z4DVFRXepJSdEQ19a^#qci;GFA(K2#! zWJweHx;}pg19C?DNpsjKy>UP{#U7RCp-!mEW)u|_7laArjX`M|dwpg50V^l&w64bi zQ#?K*dc~&9q~tN#!)Wq-!Ky1t??G;S^o~2#FGsc0S#A8U$HF5S!Ttnoa>O9+{;-~N z;9Pk~7yJMTkQUo01!-w9aO!*KY?jTv`9{T6ReIV|7KHRH?~fb31#sW&&RM#d7Qrp+ zD62FG!TI_a{0oT^+$7F?=X3nuTf*Z3zsO)}+TpVHt@m%J(`vf7gib;-dq0;QtwXE$ zaKr#+0ozWs%0iWm^HdFi+@@1pw~HJyGL?a_I9qI%SK*0|5{#r^I;nFc*;KaG&5k{3 zu1GZ|KyC_k1oggOMO9Q)G3(PY(xnLZO){IYsg*MK;ym>FiA8HWWL0ZUJ(OkDj!HI{ z{iI72vT{?hI?GLZ`Q#El72F=j%UhpwB!*>@GpO1vj%mEp`!oN(@#yD0DmS);mzg*U z{pdGS$f8pp<ObGZTisMf*AKVCE;CGsSltOW@onKMXl?y+Ll|97{zZa@Np_#J<-iK# zh->3c_VzfRu}4RB{^Ro)HYqR;71V*?mhNday@P7OUja8y>5#YlW(hJd!RK34j5trv zf>G8PAiH+m#PQ?5*a+nZvvOI@3F{bEafIb`de%PooK8E=sN?n5rJyRMxp`z{xcWyP zg=D0?$!5^D^{d5?+9MibkwZ5K9wy7S+qm;_zd=3J?#yOI`55B?+Z$<B_QaV|i-2|1 zdQj;nG`C}qei8>BBcT56KD6SMmvNh{DBF6fz142*vA4V>zn%r01}mpQB78{X+(5d+ zsPI@J2elk$mP;r)9ge4osr4?hsI~JsP^E$~^U4wbl`HS+?BsI3-A)w^|5l4)@OSK1 z-VT;BXZE2S9dL7f;;a`F*vGTJbjw?2Cbc{KezP~A*<y2acsP6dz!#?ZT+*m@b=?nC z^0DZZ<O5l%q^q0r(?OV=K7G9S>#PkEHC(`b#Mk|z^Qf<Lis9a6kmgQe4Jn*E!lVa* z*-k?P#R`!I$^C0Lp=raw+7CqT{pdD**K23;FR>49sOk`;x<9Ny^EIbq3W<EUefu9* zV>qS#=d<{Mhc(L(8eVro;1pdln}Af7#8I^ps1C6x{?#lEH*T6Yb-cXRU)qVfe#1SK z6(kX7$_SELh?vhRxcX_OXdXO>?IR*;M_OSH1&2>FOv&vrYW8PNR-&|fB+caPUzr;K z!@&#v^XCy&;$@*n>3&uLOsLRts(u1V^U+GvSO4iavE?eL@wEg}1BdcI@*<dcTd!t| zbB~rnI_`xkNp%hw>ge98?Cmw1*y+0JV5fL|xiYg!r>Z<+tF%p<wQP9qvgNp{mKC9H zV~r=cmIym=xGWZL)tVjs;bZC;IK>MNZ8HV^I^uX;hvoG#`Lu1`@6md|Jk+8veAKUP z{v{^qA2&mOblvoC@1vI+2d6VAy9@(KayCO;QEW;BtE$G_`MId9Q_OYiI+wnu5o#>J z{;9P{dl?<7=mh-3R-UK+oDr+Grc66m1pCw;*DxFfeY?^C&Hez(ZnXO?sg{=_)?o(= zz%{ib2jlSGal*uh<CSq81`7)fLY8c}mtO18-d*Ay>QvSGW@7Ng$GMmm+oafJR#a+> z&B5OJYh?gh>G>PI_vYIVpK98^3~Z}wp$*1Q;_NGiozs0{$WV$Bi(iKzE*w+cHs_uM zaMaa`v{ltrvi!Mu4*EII!D&m9aV5NOn1AbP1yM7jQ1_Z`&9RFrNGH^DXL>y!uT8)v z?-={ykYI*{01#;z-PR|wl9^mzws^CJe1*@vYyD`8qN0da9Cz0&Ud{q6$vU1YwyAwS zShLXJ2CHd0P&>x;YR+4q)(jlfE(|KX2ddDnV0F>uzvxqfeADDm+HU9321|Vjq(W^s zaA(}ML1vLhrubYRGEQxLwXZOh@e2IXJ=Yr+nf}_fAR>8jmJaICcXoENTCLjM?u+nC z!oh{;LhvymMhxx3eg5?I{<MCA0s$l?ulrhyS?102EFxKcT4tZvKTo{JAw@{s^u`D% zKP|Z5R=WZC8$cz<!Ge7Tb-%zsn!&^<iR^={aOn67cL%>lDx4Y{d2F^%D|vz^VSR*> z<ofBVC&BqzhNl<ok>on$Pa=*{{ep^w1sU2gjD}1aJQ?mmHgOmxJ7L5iPlb*}TszAu z&cIV4>pVqmb1bdecIo%crXAs>B&Am)*1n#e3PjVq&8^H07@Sg%YX1!XOE~sE_n6@Q zD~QHsspMol7A)oK*-_1T-{aiXQEuthHUDl4Cjn{auMyR0Z~iFkdCwQa%EpNG9JrS6 zY<OIyPH*%U@;V)w!?530k9LQvkytU%DX{~`+Ja$XY|iR)lXEO3;^ujzV!|A*lt^wt z%+A?%KleS&eU&gHTS-bd@NdTn+rs>u!)53G;V+wwDcs>=<E7B^G@e=g(Rd@h2ZJtG z5IjrMo&1Gr3Es;_O(wlQ7!Jg&#R+{yUa|>VfiH9VKVDzo5AFQKjnUv)F_@Virs{cY zmYps<lq9;b6f}tGub!H23}(Gujg)uJ18|(ba{j!gr6I>Y=UDpq5@h`he}m+t*;$>c zKH0)fcUG(5hC=R^ykdLOf8Pq;?wzls5+W2^YW3gdX|e3odh@IHN7zAqAGwi-+~z`+ zTMIktyacyKYDU%Kv5t85)m=PfdjvOgw~!0_cjL3lF*S6SeAG`)n%#DXhbk^m@VI$> z{#|zcV5#CWenYI8{Ch0tIV!AloEwdnj5ZMJ#pW`fD19z_41o$LlfG1BQ0`m~Y262l z0ZkyC#Gto((1UTLa%4KN`9r=JY<ub3rir%!#v(wC_-|O*6!ge7?bzuB5p$7@TnL8g zJ*lMWdC)f!>tiX!5bewIpi3t-_d-E~qe&fouPZglbx&=@=ke-mxgc6&ONo?a^L*FR z*BB*fGj~=zy!>!0W|J%mo8>OTH`SMI)Qa1nJn9**gU2)F6T8kQwZfJA6S4DY+B6z~ z0sAi$-{)mQ_p4s7FF-PdR#{cm_X5fL*N=ez^tUuNHvY_kXMfo=V95bl@M97KLkZmd zR-FEA>ZfP{X9tv&2$a;0y{q@|YUG_nj1QT#Xwf7^dSJ)?lOl~0T)DAm%OAJ0xTA5> z<6oZE&1S!n(b~^weq~@l8k(jwFeXh2$r0bUh-*DeA*=A~r+F~Xg=LrMt)c+AZVwjG zqE)3$c{b?!lLnE06LyOj0@1DvH<=DeWysT$(>?FG+=osPiAK^%4OI>A{Q6PO(M(!= zKuz=0m|i)_iT5{BVbvY1bHyOIbmF-E3`nW{(hX89#YLwv?>Ns{8JX_4<MQ4((g8=o z&lKi;LS5CdENyo-ZARe72a%+O&a(KTaSO%z$X?4Z=|415G&Dts3=e9J6oirFB@1GN za~JoZ^YJ!Y9PLhCint9?MFmNsWMQ{2=F8R3qi1&1Cfl0;1@XPX)g8X*RF~bK$$e<< zl7Vm)@Gou9yZN=G2DH8iNxyFsb7Or28y>^mO@7UtesqvnS=_-$!Y-m}1zDCF^fI9S zOp4Zv3wqZ_DXyMgsV7Oy#o6xO;5@A5CXlRO?^7TqG^LYJyxm6cPb4FO4OI7<&hm5E zELE=;nFQCtn$6S?@Z%=ORDT9Y8`vb>h@u|z;aJN`Enw(<U}WiVzd!R08@hA~=`}Sx zuTT+Dg}b|-P;jU}FJ{keK&M={GI0nAZaj7Vw#jPv&ZW1qx0k*P;zUG64Qr&PrpGYh z88I!;?sC_o75Q^w%J3&GGb@n})@XKm-t1DK5pX#oAGFX|^^eQ<6D0x!@SZ9Q{O@wO zF~g0FCHHbc<#4Mw?FRyLq^-$*V{zMT`?7Akv<4PP?6lR6Z2(~CWDH7mAM<;<gi1zq z&?V@CO-Yyq`i)ffb<j7;iid|yM28RlP1nP9wVrMsWr@Q0)UEHLi%BPfh8cNnL$DLZ z{fsgKEG;e3(Nk`2?09p&>m(okfQ1gMt*!!{NJvXx9u@NazY&h>bELDwz&r)RoV@w} z!@k;jbwobKguLm=zjR8+kLQOegf|bQ5R=Hr<M-zuM>G)9jMx9A2tm$ljRhT?hqDI| z$_*g~wHDM6zlqfcGSuhtoAb7GUaOzh#;tH9xjd_-9xJ{E)W=1^8d#m*-KTx(H?1cf zEv>&V@m_aamx8y}p&w8_nE=0<r7xd962@T^kyPoN!*k*`O7PoN>q(bfeZStcXh!dB z_|!X+rAKdVxwIbOHr8TVBJJaNt_mx_H$fmn%Pk}2q3fp-ay2x78j%ua>rat|cAu7b zymw;NND!)K91Z94Wq*cD6=Fc<DeHM<s}bzpzk=|xsan_%5w&&p!Kb~Ba*n@yC<rmu zJ&fk@<1gqjZJ`%K!EtStg^eIfxTi`KH>5vk%Vb0uy$O1kLCQ1!o3B8Pf7jA6`H-WC z8F?zae|jRDgL#gh6U$k8_rCbvR~syHz%*uz5W75$APLpp#SkAx(uo?OOu^2g6k}$z zB3CD!T7_~MRmf()?|_=6ia68)k5(TLaN%A(3}naj?)OfDzI=_Vc;M0dwVt;?*#sR0 zSK=Ym=KLnMHn1l92TlJvz|Y5|mF=X_00Pv+8NzcwNazs0c7mq-$|i}#_BCPW55W9_ z7ck!_9c*Y2K2FGn>ZruM>B-R1`99j9`?1$i!PnW<Mx)&-@GR{6#%a5^r@aPj=6(`* z=%DP-6s7l;8VAglCiCLOsr);JYzkiaJ$26k@&`{fBz10^Z!3b=-ld2504itO^3YI$ zR<;u3(zbBct_^(0+9UCxJnY~S>YV$lbmHr>0PdrUw*W7po-2$h(c%T--}Kgo>DSk0 zJ`LY$?KhS8J+av`Zn&_V22#Y(iEiD*Q93aj3_lqziYp2<xQM(6E4N@pUeX+?*+Bk` zx}ow}Gawko4%tz+C_D=AYMs=76bTqJLh}9|EhLE(tR}|A^Ci%Gd?5dIWj&y(YiLR< z4xfd5C4!v(ip3R$MhTTYwQ%tKo&`pcFd8KIXMOY1r62`sX8^{J0s9yBx=p9%_ufD7 z_Zov^nl)fcfhz3Tw?k>Gn9l3t-!X9f?u&v-l#amFIG`DaLWtNRIO)Y%G9?;S-Bad2 z#vdT1@0_~%r-SZ{7;{rZb1ukaR>*Z!-!Wa;f@H(B`mq^Hu>ek<Rg6xdej5x3#ghL7 zEqklZVk4s>+KYk^dMoSKV)kGl@Z_Iq_*d@L3ix~^@|<~;-GH=Al=7bu^lj)cfYAPJ z>y*j)$q7HEc$7I#5Yui^KQQTGNnkg9`Yfym#tlT43%W+$ql%@cCs*`A!ae+3Za|S@ zm%w;2+2G0p&HI<@+2;z|hv%m!NOn|pz6Uf$pn=CWupDO-LJ~B}?(pd_u(G@#_WaIH zjG!zz%AH4-&Ac^ZnuwsinC3`T@-p^{Z9ddgV~cZc@CijDhz49$ra19mvk^G{vDzxl zfaT@rF3G2<_vy;(Pdkmz4LJOW>GB0(*lG_Mq@jmS&|D{rJRnH<Q~5fzNt+f);`pbh zr{v`1b4)V`9$}a{MYCZ04||}<94V#xMwbiqM%OPUI-dKp%A?R|dkOpPtYU#Gs^Vi@ zpdv*W`7$kVc3I;_Wy;c?9=@L%3bV9)BHwS1Ftq+8V!5^XGB-a)DjLS_pqf|%R>DoO z<B(3E1OWz~YasG04f0+ArT<X)d%?<rOToa|e@=m<Vt+0xdnx4;{9x<@0V$Vf%2Tjl zB+WOisZcPh`4!{>{S0&iDU~sz?5>t3j*1j1^?__IpdS41a=rW?*}$T1&r4*Y?;c_| z`@!h{xurwXq6$<#($6W-usV%!(KuzVyqw<;(jbt97!ArU<sZtnQ!9;t(*G7OCTfHM zjwpIXLZI!;#zjaNQJldrM{fR)yj%}uVPKm`HW&;|C9F|xDJ)}XSey5o{`uMpKo=hA zS-v0|<eE?`Ty`u&@2=1A)o)~kq@SDmov9+qQzV5IPHd=@y_BNN2p5g&Dg7PfM&yfj zb==^xX?EG3ZRgUC92!{#)$hQEw)^=J|58OF2+m)?>3owiR(9;Zy=`v<mlbD$eDx(# znG;BGa*c38bjd7?5)V?9w7HWxP9L7{;PivL0mZc(8T+_c`nANybPkV;-b{DQ*AvCF zRED-0%sz1XuUekn8!aX1R4v|u1ycfX(7i<sJJ|nWj~v`#weVHB!lP(W2~BU^{qF*W zc<6M`!l}#&F<G3Ch32XZENr&U?sEO3^bk}_-wv;>VwRqbCinBa9-NPlK$Gnh#*D;B zq`5**dP)xau4?y@qOJSoF4h*Cr*ixmj#`uR$C;uaMucWCvrX(l9u%(HaIUa?q;y94 z@I{SZ&M_io*Yamf@~7;70j>Q><j;LSd;s!`n}zZK{tFPB(DtL!*DSIU1SrCav`=bN z_H|{Te|uUSe_7X5X()Urw5KVWMy8rb``V9vkZ2}bf3H--WbHVCH^wD0rH_k}go+fs z&a}_4E=^Tcc=~vJCZ2YnG3&fanPEo)(kcLjI~PvQnv;~U2a-uR>Z%#@<jZMyHI!3) zrU~nYX|jcUaQ{&Q?I$ySG8ic{%l8dN=c`#1zo|-LtIsW}&R$<325;+Kp+C1jR5O{T z&37+GB&6`gY<m_N1>@^`C0z1Jn@|s@qwK&1*Sy@Lv(592PPfRzXZ@9URI=hj(2@7J zOHKyPn6>Nmhw7A7lLgQ>m3&Voo5kLCdT`D~C#hKkVT=xt^gu~ElR5dvtlmm`CP0}S zCPwrhmr8+73L|BvxE1ZT)z4u@mVQuQfl}b43eb16wIV&!n*kRC%&2f1QG`DC{tF$+ zbe;?uK_;@^?)IPkJJecjHm5&t)V5N$t(k$TtIgo?tcWVP`)$IQZpQ6kr6T5|V9S9h zlTpk;HHn*-tgPMXc>kSiTc;=gHs(CW0ls;4Xqh0+x*{<O;Idh1bJ^+eF!&Vm7=?ZA zqNV1M?yEeT6ajE;bS9HmV%#}@3jR;E<@B$d-;bHq%eg2~DSJ`LhmZ1+kPF+ZZ|J%@ z3=i(y`LZ~orX=X3y^YWNX^x*Vdz^2hgNT$J8E|#WkjYs<P+fHUZ7q9TUcDCPtgmrb zKj+M|AJh4ajUWmX*!Q2-r~c8#N!hDbo-T3}HRp~Yn-s+R(o?2A4%>dePSp)N_oTBN znNDPTpD&1%3{C}HeUvh{jBT3Vq`d3>$Io8z6R@l(fK|iQ8FlX`{{Ny#ys9o7H;2Cd zp5}SpZh+^*bxb3Mm2dnj1+9-FQkk2-T!va@UG>PW<w@DZp4(F87}3;}Zzg}PR1pBe zIFn{7_%GI-6j->j`W+YP7n2%wo++Ot-Lhpe^#LIN_qA!yJ8ll;9<Y{djVPc9<&xuG zUTToqijRWYMd$4u)3e4$XVh!71-c^?8*P_f{B<!sL!@WB)itJ|ioPp0zkIQv<yr3@ zB>RAfeCed|iq;9NXo!~0NiVoOUTQcA&DZCX$w5jD;SWJ_?UUe#`Fa*9Vlkk9Lb-Fc z#%(Y6XIqn>ZBF8(_>&T|%K?UvcGF+Pp=*N2%9(s0+jom{3IzKSj{C>fGrre^kH=`J zsvBjs-^KVo)$@*BO+sah;)$GbZJH*&dG-&SCC)KoNlpstLvx;?3j4?4hynXh*wFEJ z?lGyYl;MA|zzUH+ZXEybFT)?o=9%GlhbsWAQE94jkDtkvsjq6j^Ii&X(~sz<$8B^& zpeFL|-Op=Oimu-uV_%4gCtIYe9}?Vt3!@^|nI6zhjsCAelx2t~FB%p7M#>nAglVaQ z`l{Tm?<X5EJs+_+JZ!1_k$<RXqPBex4woQf{^Eao^boh?&VSPrG3sj2FiSsX{3nt? zetnTe0KpVWiLCNMm-6_{G5|!<SlACNwZVLT2LR1GRN1x#69;!#rlV{^|LRIuX^c}m zNk^)hG77U-AHGl(M%dLA<uW@1DcVgT(spq>b<1_8#Vl<`$KpNo7pyDfW~})ZM5R2` zrSd$*qI3$tceTx0(PZ+DW^RMd_*n5TIBD=$DLtzqrO%6n=Tor=R2d9W|G)qUNZ>DE z;{M8DCUjzv_=E%G`LPJr;G!dUUoBkMvMv>)>@&9i+!+v1ASR37fupb>UOqs<z9NHC zf`u||x(skh8aRHTK$4-p;$Ip+q}Q^q2_W@SE!#<G-{Kxa?QH{TnqHxy<0i#cPs#)- zL|IZju6kjNLO~V0%V-$1_1-JL9+Xv{5$!oPD%2(^p)6ZhDuT2<8Wf#^zJ<y>$4<g- z>)GdAAYeN^3b}jhXyZB{L<0l+{;lvOVD^d_m%fJ`w#erN^1X+BiCaJ5X{p|iDxI~; zxMU0QKSV<?RZ_AvoG8&oOdr<=1@LMjjS^Quo9_(AD@FWDU<$MxF=VF>TrgnBoVHow zvVsVmT3ypWb4kr{COopxa9AkTX<05>sbT<SKRkDIjL{kVI$AF_#s`o4halk-!8q!U znxo8Hkf9^3m86pkj8hG;s4M>%%@U%x-TTAKRNyu0ZqK32rXEI#dDwn73`zE6T1*BR z`wuxVFifBuSODxBA>bP)r?&+}=ol<i6atc#RQUSwYuDV%A4>`9zbD|1{R6D!2%5D% zSlCjVh5{ckd_WK8C7ilyU4>H@ONM%DY``3OZh5OhG+j8{(Rl<>wUBvJMLL<ue4>(o z%0kuwmrw%FoiXr~iDTwmV0?8on9tb=QTdKzd4n}a2ig6^7+D3#`j@Su<Jec$I8+f< zs8<-TTJsg>lm4xscRsO2&*0#6%8Vp|T@XA}mgituX4Pnhb7(0IQxHvIm8{MYqN5yY zsVYGv&%@(#Jvx7Qf{@cI!YeU?{99$m;QWX*LTkooaht>U@T5EH+Ga*d3z3hEnLP}F zK82o+h}n4J@8iby#P;n~F%QL>Y3K7IO?zn&(9bqX|2?|CGE|u;1RP?q30gwG@xqH% zh+n9yJ5m2&QkdIn8oN`11O<8%m9RyT+5+udDZTal=%YrkP6bY`G-(qmP1I84XhQQq zz7UKud8Za(Fj{+a$1;4&2xMiI_?{)5am$2r2-L0}@)`ZJoO;r+LkbBUX?{bZIE6ZP zb=^G)9XPJ{r-T|`g6RCyuCD8SvWe}alv;Aq8!K-Zqvh#cQbbCjvC;LGOSnUGQK+F^ zS-eJM`Mi7zB?(cvl5<2^T;4+aBU12>U{%miRkyaDPs%vJt}l1R))LbF>!sWI(0XdD zFK=x8aFd^!ERZrg{~w8+F){;El`UA5OOGutQNTKFBt<I-9w@w9b>dB--DS{tr7odw zx-BHsN)3Xx%8>}>NMOoVEU4OXlT1LgCv9Apesf_mkTENx5!K4JixB)cZJLn0!1&QU zY)RIJ0)KUvy9Q$kd*OJ#IA%}#<$vd!Fn1{+??B4)<CvK+5i>PJQ@Bqa2`%wNjuTIb zu8J%Lr3yzh#TsWWb>UJ($vjgXp6o0P++hgu{Htyhx0+9&?WxmZ=OvsNX#c%3pzMj- zawSRY>LO;g*-~j(52g%(y?hCrGYJr0MRL7}S$)Y*{Y=5-kRyA-r1`2Ss9WNweil!O zaB-w72{a;wRx%E4NKG>?YO_BP;Wb@B(f*+yp>30cCRbKQ$vK?0)D(D%Me41TV>-?2 zkYIKi9F8c;(2){k$I3n$uaU*LBz_fwN)rF70gT;+hqF_G6j1kw%71fir-Or-8at$0 zDSyTigAfz{qja|o7Q2^)(R}KsxDg?7RC@|St2k=flJ~iVvlu(*l~#yqsftvFa%FQE zxjnlnUE*M=+8;DLzf%_!g~T5->b!niTqNKv`GSRuv9`4`#_VJ*2CeG}bzxYp5Zcxe z{P=LuXFMh${GhR^PNAMrZBHu>Q4z00W#hSu-diO-rPku4?g7~RC~Z4&1s^gY#;f6! zTN1+8PErF^mKe05nx=W<Cc#rCVbtGxeMy*VISWpu>>DEeAIj$<=~crej_T{OZSY{? zi0jS~aIjj&X1|C{g<8hT#6&-Ea99n;+~MJ~>JB*}kIxRS&Uc5S`#EF>+G4c&Wry=% zR<O7T+3cb|>(Qw$?CDf{=0>{!X2|S;+G)P*G$g3!%7V(L(C32Z6Dk{iK+|i>GzQJ| zYfVl9JYpK^KHn(^r=bnvh<}KCN+Vx7$3c~6-jvN>bc%q>iA9u7=g<R{PLJPI<VgM_ z_Qop&%<i*1$RmFCR03p0Cf>0zewjsMEG$Z;AHt=hSZ*J*!(QmDSCpzv8XAL9&-{dh z3|ZT=?JY{w{QQdbIm``Cb-Ge!iZEU<tdRe1ym2AQeTt65qy@K3KNMW8@DBUD+L~-A zIPQaxX|$#a!12GXpZ*g=BFT&!-s4a@Nc!9bTY$o03pg|?cQM)(jHKCfkxde+ERTp> zx1&=-?Dwvm<{8Vg+Tca#3ZKTC1co_Y+#&j{OD`Y3b-Q)miB2T1>R9Q&79DNH+9VV% zY{eo&WcXcr<#F6X07CD7&b_x$uMp_R7kaz)j)}If3iH`Xj_tRD!uPBWM(bKJzQDI4 z(z4oX2XNI%$_y6(#6Op5tt)xz_RdiYF_6aSnCEQQ#tIFiTEO9zXZVG%PNX!zLtRPE zN37=a#}tZOyCvC|9I*e_9~6TgsF1XrJ1p6rwQsH{70H9P{v@|Oj2D~A0FJi!TA2tO z8!_x7F|FJNTPr!q7Cuc~^R1o=JGgeMMC~rwxpvZhtSi;?*KoT(aT6_ZX5MDV|61E( zP(v^~>k}=Y4;AD+zYv>?PHfg+z0ygOM5RbRIT9%ulyFzF4ifR27;IOMZpvd;Z0SX= zST+~aK3tS2TpzNLT0IXZ1DOue!Hao~-zFIG-FY1VMy$_J<sF;hr+mAg&+Sr51_ot- zs4@k4bnTti$2ZHSnOVW@5cB`D9aA|1NyE^)Z&qa^A5s*BIz1l}cg??$OeE)kVV22k zc<ZjAkH}=mS}aQ`A4}VeWxI9k=>t*lBD4H5+<?ds>w<s7e>o9^<KPM3=!%C;L~QB0 zw8=-7#kc+vmHRIl;0MXn4J5;D47|zS-+EgXZ)q!0U?LCmtosq$881b+-#{XioUp_9 z+2?A^m$-nx0M6oM1Dd5dbGRaZ;=E-1Oq;|0B+%ck_OO|$tK@M}H!fQ-j3vNPswy!V z$Ia_-KdW#Tpck;C8MLN(T*Gx=6A-#WX@SR0@m*hvMa%j>QDBU5zx5Vg>3>1+>bkj1 z7On?N;1m0Ihb$7?NG?;doF+8U3~31+Kr<=6&V<6{R8!+$dLwE@GOcEIB7byds5_Fv zy&~cL_>&S}!O1Xo?-+t|{C#0m$yLtu--uM{8zQ8Sf3H1B^#s<6XY07<+iPj*pGnWz z=_2SGd+l2PqmcZ=h`r%23R+2p)~i7_F)+KLxB?t{!||4r^R}FD9cARt@7|c$s<hEM zC`@ctX!fg;J2!+hu-Q2{-Si}nTRdyQiH?(a(RD4lN#ik_9EnKyc>7FD<7B*av?cqb zhPjkYl7$~!s4ILM^_1o^2n@Y3>;r6eA-1EiJELj-Wj=MD-(PzRFCfnUzc5X`ys!?V zNwEm<Q3u*85D2Q1*3rI*RphrMr>LdoMr-=rT$uzF2NMt?u5f~5V5Q;oubZW#=X-zu zpdVn<v`R?dBe(IcR3`m+xLcLETB`ns*Wb~*z=7zy<%3h`NQtCNxwr-3ELx^AY~|zh zz8Ib9Ja?!rkV^R{m^#^wZuE9rC(TYBy!^jB4G`X_5x89{rL+kU+gBg3&i-7@1a3X+ zBNXzTWP!L8Rh#b1)EM2<<#xNh(DHZ-lPaBhT$9o3`U6Xbs`t&UCuH<Bm;3dF^|YY? z+0Ik{>SzCKuu=`YDoK{YmRs4wd)5Z4@o=GSxX-u3Qwz<I7j8ZPS}Vy3t!$cbPCY1I z#pQHJclv6*!T9lRF>$c4u(fb<kfh^Z6~}c~1@D#EkrUi*C259wvEr{Zr$1Q~iYHQ| zx&xd`vS&LeZZv+U@OOBuf1M316s<)h>?I^_3rdzAr$C%5hE3dr_#`!=6kp43KV~YA z`3CrcB;-k!uuqiJ{U}e{ZzaSHA?&;@*_6-D<};)fjJagV^XuHDVO@B#6vc%8YR>Gk z*lA>F8avfxSJY2bcBRv5C3(QLlKnAmvTSmQ3saQMOJ=3dmLp*S!Id=>Xi1D@)k-4P zXizgXw^W7EXk*q;bT>Zwj3;ZsL)mHnfjC^L7g9a{h}pH?TDS+xR5!8g86bZ(S$VQ; zzHV3Sk8L7~k$y~gV*}TL(Q7wM+z0}nq|#&@)%Sg``TlzM{UTxJbe>uZX+X)4dpG$C zWR)nnQ#^RhQJ?V*@%`1q=Vy7XT0{Z8iy(^?iU+6t+c9d4-nCc12a|3vAyT{RO@`Xr zk$Yv$(`i(7#L-%eO~JwvUEvaqO946%&RVHoS;7#hBFfq#P|g~Gyiweq7`m_)F>yct zZ447FcRt<X^v)tgtNNNtBD6DS;}IITqPeUnWH`>E$Rxvl{=10*%6k5zy<#LjKU#$3 zNVf_Z5H~{l{yS}$fUhB)Sc4;Hz27zuaHvsmI`t_9Q8Ogoxm`iOdu-k&XxdDWL(%Z? z+k@pBN6JpNpRjB}`}JjbIjmOCx2DJK`?2Pmfy(4|T|$ZE`FKEq@LO)9k}%`qBhlM} z`<v<fb>`;xo@_4Q`}hCk6||w$6xEZf&(2P(uTD=jlwxs(hrH3z<$%{fM=AIJj^`8n zBFrTW$mK;45sCHQas6|l9~y)p{>wiI0VF7vpTNIUr`XfPqqxUiLQM!nTt7u4Gymi6 zs4LU+dTsmrisN~^CON@LbN{~n=aaYoJ0ZtAFn3<}MNYym;j0sfQu@O^Y$_1Y&;TH^ zf;P<L=7yw{2bU`&E35w5pDWjD5YD2#Q`OO1R~RER<YQnLEI<usze?X(U~7#IJ7oe4 zQq>#DGXMmBIF}LlV4>IiAXN&*_y+xT`cE?HTie5=%L`1XBpoe>5n9Xh0$;Y*veTbv zmEvIc>xJN>tV#J;c*X|%Av&CI@bwSI6VQLeY6M{=1cv#t*sYh$t#9;KGBQG<62^+i z^--N3P_1pBZTH=o^qkQ1tpoNaQoV<!x9PGwrhK1xUy>)1;=NTMN=Wx<_buN?pHngv z(n3W&GD1as-zz6MU%b#?)<N$%uvfaFWZ#0Jc1XvvLKl2AegH!w&In=b)2kBXH#6Kr zADr+2BIlarK2m4#58%KKKzsHdWiXsyf^?F*>`;SzqCu%AquFv>7jA5*nxhfW6-Mk# z%yW?Q`x^B?Og#KE+`JvmvEA!5UfawJy+x*mdo`KW-R)<Ipd<4kd<KThv1yCRkZLEO zZzlF@G~SK6Msmm^PO)(jbnZu9aPxw!I9#>drHdoDe?#z)JjnczA?(wv5tIx955TpH zYHYj_a&#G`<xGrA@e|fKM-e=!oQjZi(M~!ACY-u14+Je<#ZG6mvW88YqiTEQ?U*q$ zK-E5|5n(|H8`&3?KBPwbV0|WEY6;V^_onviHQeM*Q@AT0FolYKOSDhP_DauSOuchE zLg4t4hCh!$N-fBp`WF8P%b(H*U6|bYoMZl?G!2qzW+g0=xzsICCb=?K)I0@SPwAk~ zYOZBZZN>C{@l79uLwLe5`SQAHXp7^I#w!+-W`<#YyGJS_QydBO*%tBffjUvuuJD-* z_T9r949DD1cK!=}`e8l`O@wD^0}8uo1bX_YiLavW@9;cCyT+arFmwG>hGF$&BD<eG zxS*R6=ocVishM_#;lD);ad5Ct&eQhqC#dZ|fzl7hYQ056wybXBL-_@P|LlCnFM{(7 zh1$jrT;dn--8-d&U+?*H#4RU5stL;V5>h<t;`EW0<i=B=@X;tjbB^%Z1gZTr8j$!X zy>g#h_##yaf<%8hlI<?%A_*VxG!?3PGF@HN-qJZu0^Jhr{-ULO|65;@%}7nYQwDK? zg}6Ct^c%TD4o>>Wcq!=!HL2++=~CK^(%C8=bjXWVT3ESne+eR%2yVE^2=rfwU$ng2 z{QGki4@*;&GU`#%tgbc_mZb4x%>9lasairHF6hf!F{d!*q65i;s<zJDqTdDKJckr* z%E~wp;)-}L0mWjR{W3~z;Fo?>4D16da@Z7)5@{%3wEnamdR|+1T_w)XSTpb~g>9u6 zQv2z_0L)%)?)O9Y^mN}7D^gKI_G(C}NbY(1s4%Hfy`)`62-Zb717%ZDSyg9ebA3Ep z>s@_11WNkkeu^ADDTX%KAqf0{)roW(7Y8E)r*P3M1<Lv=c`%3gAgjywAcKt5=ife) zn<gl2(M6RMQ<fulF+O`aE_c}h#y`k37AoNb=?E3ztjJj7VAfWt<0;C&iyHicXlzTX zsOgSBrz{kSIn^TX*@b2kBv?mJ@{u!Q;b!e9-AEO*b=MYy&kXp#`hzEf)>t}sDdXv3 z+v0mYIAG<MC-!Sitrf%-<z^-<v9TC<Q2GfH#ETWnh^R*iNk>S{UIZArjG<c@><^@Y zuLJ2U@tb&@_O}m4Ck3S>z1iBjTuURE!EP~)VX#maD$H}RGU~gGCmfS#nk$=;+Cybo zqLjr6)9L9aFAN#UadEk0iX)z!))68m*rxTL_Pbd*XaOZ#qc#xU0bFBe7?#k~(A||x zBm<E@Rk(E<jpJP~%k4!lQ-juEozt94dzEv~uC4jzY1{Z6{aJ8vBrLvOoRX-h2LuhQ z^pw~eZuLj{VKFpeP+DX*)`EqE-*{rj1Db$!xtjX@57@`-lZ+s;hzLC`|B<;r=1#Os zchpzt<OXb@LDl|^U{29B;FHIV`r=9^0zB2l?bYS=`R)1nZNN*?ha<74<P4YB`A77< zXV*HPFC28Xv9ZBulkJZU@3p0zM$SCd1-@Qk&l&nUuqb^A_@I4b;d6b!T11F}7x~e0 zY5`8=xwfBO;!>(a(Jyi3=BnY{V5N=8eg|`AWMOT($kw)2i24ROD?t<1HC|V(A~SNQ z0jf5Vq`%<rY_LH4+Plw6V)RBDiI*!z0peqqI|Sw>#&MZa7^lZ1=zo71@3{t*L!;HO z?i$x0%(nR@f#=%a3B;Zw_L>*03#`G#J0Qi+LpD~~5br9C?jksmfzD7qjo$P6XgHs@ zM={nrFgiGFkg!_d2EOuCo!A=5+NHf}w+U2};cL%F$cQT5eC&gN@vUwrXNqTq$~Flp zW|(8>DAnNczr3E{^4t~-s$f!3sH29%VTr+cfl!Vu$<d?4!}ff;31^m=UNueh#p#6R zXzz6T-me9&Bj$;FkX^&qZ6YXc=I$wk{F1me!CGOh+##c)qM&N9ANcJli?Pu;B&II_ z-{I0aeVylz0J-B=?*AqcJ3&sOD&pBO)ZsbE#wNy+7_z<i(2<XxRX@)l^Zb{kNSa7I zBYxxX(D<kbwdh+&(B+(MoXtg7M%MaV7vqK0+|6W;P$M-Hhn7%z#KTjd9y<I%!P7@b z@Uqv-I=&ZJ-nQF-1Dn@NL$n<E!Mzc^^1jNe9Gt6J+8{8oGBN0)xgcJ{2O`E|55*1# z=aBVH8A_Yy()0#Fei4qRJU5T|K{o2ALQYD0VBV!@+YZA*(ju?m(DP>Bks^CNXrkp3 zdH>|U62JCfkA!=rzU!@}+1k=AJK=%Nf5kqEcRCr;f$zNY%r$iVb+gn{_5L*iM=2I# z=IO4<9nNiu?K}giv&F(n+N{dN``BGUxjb<%blBF8)`1rv7?~IlklESUF9YZPS%SuU zx>PD`Bovu3!DagV0Uej^bL@?YhlTsV67cuNlVCCVE3xJ_yQ9EJyae^W(M9Uc$uCdW zeTbi~sHXPh%09-sM{$4bX5`xUMdvl_iQ$?%=2?o{dYJW(q|LQRH}uMm?W=9i_RErO z&(|4W_eQPF=hFdSDIe>@Wcf91e@hTI_s_^-ozI2=Qg+hPpUYa+sV-}|Ym*`9*Tqo; z-VQUBlJg#2vNDH5zpJcs`s<SNb|9&Z<KT?2U&*kiVWv8>c2pF<dfq1@xg|X}`4`w9 z09k*jZt6JB?S&sdqzibWArv58#3cdNDVwDQCKun8@d{Lj*Mf5!@noUEqn@koS!)8c zWGXy9)BXUov9wFW0)!cVcEQYoy+47tVzxVDq$ziWT1-j@#|3nQ_xk+cHQzXPnQL)b zp69}|Bwb=-CuZE@`cQ8n*Ft1s=h|LQ`zm&<v>CUE|LHAn1lZ>OSSw2@ajt%>VlW*{ z16#LonKuXTKhZ^Owydn@2bn>VT*$D1i#xmXU;RBNh?7>w@IyP2RO6$g;x@0hs$#B} zt_?E-#Y_~L{^VAidbzy5MFaa(1a8rZv+0+HRp&lVD;&r7o|)4VIGZKpP5Ob8*F7pK zYi%nmGk@@{f<J5%>7kz|dt3#tU#6q(G7?#-Y*kh(A4X_A;d9vBBVcXt^M9kcl<?Ii z@px<8*4xT^BGx=W92$0hH20ICA68>i@_DK5_=AikhLo1~Ry>ix<Hjql7I&H_%&P>$ zb^ONZu)5EuL>bD?=F2$!1NJXp-W*SK#I~F=ol~QNUF~|c+Q?Cujv7`-IFQHNxqlO- zr1g(ZlU=*}J*LsLoR?7jXO_^r?58NexS+E!Gcs{7##0tkE6l<}n{8GHM;k`VnVlnN z;I@J_FUl6XBh>C%qaOHE(Juu41`knP{$*8E;Kyo@uy0T?XN;zSjnEgcEUbTIWd=0< zzz`<JPsYoYC8#^8CZf?|gtl;x$YHi(cr9-+oyAs8;#RqCbrMj`7H>APUOJL#LWr#9 zs7;4Xrv)v6;u0iHK|rCNl$ZueHRG(7e29sFbAVG|zHaS|>v9|2vzB$itmx{Z8zCFi zAMI{dIH1F?2aUKsJotfWc<Y7JO=^vLJh!cy7Q~Od(t&C*hN9{6sVd&xDPR}Dm*YCY zwjbTVvR6W%U<?^GF}#s^gaW#DcDVBBHZ`#m*x>ld#KFbZwm6Dhqo;f;uU4FUD$mb~ z%Fn7yagw%V@PN2N&p>x!JV|cK;&`9*q{N1|m@M!KXL1bcN+}|Y7m&{sak$|xSNskM zhLDTnA8c2wmEMvX50aVqbui^LU^AD2WX`%Jk&jN#Jg(;%3VmXQD<Ud?by|>ZE~93k zFV$!cdkznev{TB-&Opp8oNn75(c*F9Cre$J;gV0^D|K{ul|FRr0KDHnYkuseLqX7m z%Mx6=jz)CfSe*@KpNZ+y#d>2<5P1E1xAy5KVpi?SL@)r-nFmMD)jJxmqo8YN_;SDh zSMqf%-`aR4*xE~6dRTpL#fpfyj?$re|G_kNXhF6iM2P*^7Wg(gTurIXT;1}jO%X|l zY3Ro=oWuD~C02cC6oK4#o>L%ocl!R>-J#VwXCrwyKPm>zsffEaNnPSY%L-+|9n@!> zF%Lnq@c#p+Kv=(xpeTv%30HJ>ZPt=Ib=$qDy`Y!UT^U{d^s4<yQFekE?*&JPJ5mZS z%RD%(c-r^<<sz`1_x23^4|UY{vf}B}GMDZrWAaC#w<QrW{1j-}P-(H_a(`y1w9*9J z(#g2bC;=y+!8Uk?i>i;-A1)hhfnBiGaw~I=9YOYkyhzCH>T7uuYp}&xWvkKkw^zbi z)5==va^ni_==s<hsCcF7L{)cV-u4y%7P|9SIxM~dVzQq*oZgybXR}2{b;B;0Tln1! zbXFy*xi|^^>TH;+k&;2cHm8!z4h9S4vKgdd5(bCGAltC5I6_BVQBRyxa-jX5yQykn z*w+5xiMHH~OPhU6cDg1sydZ!iD1LK@AR(we-gO%c*nB0aw6}^%$cuz|KT?12I=wWb zr>g-^=xnJXRtD$4^Er3<^#%9h(hl0ZiFc@n^i*`hRVyVa)gQJS-VXCf!=x4AG1!hF z5Y>UndaLg#ird3;m%}c379*%s@<-;o%q7J8f@=+r2=h7Sz<&R8>_})}yLBM;q#^ zvtMa@`JGt6A@b2V+bCO?xTe~WYB*p7y_1>76tt1r@P+YLwme$l7=6!O4!`V`TQk_y zNr;R#QgPvH^YWXPl;S2NA`6wjL;{Y>8RO8phe#N#kQSae?(xb#@v;h!iRsO>zpz<a z^@kmXx8HhXiqK{Tc4%xtjm~16Ju}rqYp~eN!NMSqLsv}qIs2sMCy?3@t;mvuwBWN& zPp@9jYIqd~e`S04>e+qHzOz?TgDoAO+_;rag=cleh8k~oQ`u@PWW87PR6OFfk_hdi zOt7!G=E0%ob2U|qs6x~<))talU*#tPdYXXlnb@qBeh3_lF?&Q?qesfIH@If%I5^qK zMFuWN*1XJ&eyFSQ$iOoEJ*fuM9TjQ3&1GS)1U?m0*Nu(q%do$oyr?{J^X2(dEcR{@ zqL)JMFM>Zh^8Ea6Tek>@mn~^UP0c*p@Qey{IHLYg(*%H*0c9nCp&p=P9Frx=({(Mv z3Q1+?uKX~Vx8K6HB7M)<zPoZer2(0QEPn2M_=@E|=ZCXeO9{5L3$VYNfG5;|<bKq% z(%{RwOD5pxE%XZiY`@D|N3N=#dJqtuTZpNx?k+9N@DJ8dys={&%r1N>2@7P^npOlo z$H<hC<t5<I6>XTPoG?4HO|q&IyNrb+n6Z-K)19|-3kGUBJ9EPgy+lYuT;y4v$8}(0 zC|Pcoww_d#Hop2e{&^*;u)YP69g}}o^MTbdW#fRuK1C%%NFpIJX4>C{?f-7V=|lpK z#^ko;WL#2S<@m|Z8=!IlQy5@k{jR<}rL8{H?Vzoxvi+^l{D^KG7DTl-WrgXAv&lCX zJxa<+BO}b#@wAKC4^5O^6L!AruBSk(DPZ@@`UKaVCJ#4VNXl%Ye#+J2%TB=Yp%R_e z$A?OvRs!xbhDyZl`0CY!O5;>CG4e#hrS+#(x2S46T}mcJ^$Mnr=^$8%EAe)gm(^c) z?D|`5G+i(~O9l~k1p)eU27yW!V-Qs@+R6Y+*!=ZV!Yd%=KY#^LDe;>1CJ9x!<2J8x z5fo664hMTeTBGcDsJTnSqGFKLsg)fQ!$aMj-Iz8kt_xRR*qdY<?PLC(=~JoO)up}A zkI>{-yOZ6wm<APHDFEA<Ajs_C7C6C!FYdmVq57^7$0!)83UZS$G5+@p-cbedeWW@< zcNe;xT=OU`$nMDY8;8_GV;g$Na|;g__OMsbL+J5T-dPmryv|q@H~S;oosXOfN^3>b zV50*Kl^u^Cx*6a8mI}_9poX4qmBiA(TkDOD7IFx7II`>Z(WCdXiUJGD0V5*-W|f+c z=k_u&_}6<<-M5&pWQ-0+w!0kFc%0FmRNCb4psWB}cg*fBHi{+~(K5@rCm}7+gtcJx zo%u^yr_{QJcilNRE^ghph&E%9l%Wsh?3`SWdefDC*J>T?&>!sFBI<I-_>$yK^u)!q zgn2jPpGK#9>HGjY`UgArnX8i%Juy+JcaIu}6O#~rwu%Zy>yFzAS?^<AIbA=+YuV*p z&3%~25CdiV<A-htYl;PqCgE~<tDJPr;vuL+U(^~UZ&eoK$9ZeAI2kxNU}XdtpUWvF z3x1N;l@C}M0ESkt;Dof=hDSG)<qY{+5aCmo;t)0AxZE4(w@Q70Jb#MCYCccJH`d`3 zLbT*v_U*Qh!Mqp%hi7b~3^)gk#TY1qpi(Jd0s{;ddU`g`(_z-3C0$81wIPm@rf2^B z!ab3;t@a?R>RCaaH*CGpk$GBU_r!!Xz6~ww9YBMlAUm@Y4xEMBwazLfE>ep!1ai{x zWxP9$tg}mqf-g}6wGZzo$r=23^m-UJYB>^~l9d?Z4uWH8!a4=>h^f~uC`+iy9zQ3f zqe#ac>fZ9E!5N*2b#*TwX_zjQhPcSH9KUc%u4{PPo$X<xd|GX@{r&vj(y5<N!0MZY z544naILhiiOTwj8Hu^bE`}=(R*OAlpk-J`AL<A=pt)$ny__?CkB4!l)ya77vzNMD4 z=CPYEL+*w>zh`#H)7mIDy?dO>y93b!4|EZ2lMqkGLnq!uBk6;Xe#xPzWcS@>!CSAw ziwP4ThrlhqS{!V))jfGvNLLeiY!SWv?DQo-rO!A4CxA-NR}CtGV<Zs!q$c9Bv4(?& z@vDeh3XUINK`s>>O-1MWSgYIVX$D3j$hfJ{Oa&>g8zY=_wmKc(b0?`FAiV-GfF9~* zaXHI`N_<CZ$?&o`aZO7*FuanCol4IQfP>NKbZ<TF`)Z~MX{{st=+i{61p-V?>PX4$ z-n3bHlbp)N-%3g=eY4GZlYK!(*Te*;i(7094>H-}8owi?r)dD>_Tz{_7U`a6oYR{8 z&_gs@UQf2OgR<h*uYMyXDYtR^woNMAwrx?^zUdDezmxp>8;y-y{Q|1HTjox@i|rv4 znsc$~PS+I`L~#3F>g!+Y$!>8CEe=htdtn8;VPW_<x`y07Z=vikIFZ|t;dEU|BnRoQ zf2}X8?DQ(nKcNcHHwKI>l5??R^a<V=OI9{U9#5!Ow_d@4#F{52nvO8dz$m^p`Mp}s zW&zM6vwpA^cr2s^na$tqxU<zZqPXT|1KihK(_UM&HXo>+iA_gQK7_OKH{0B|I>r}~ zGh6E)-d2#_|Mefg|IN8W=ThVP!9Ly(Ip7!`1mUO>FBci9eZp5Kz+nuRkx-xa&`O;3 zZn=4EuUBH}>+G5kYuF8Q5t<t0(&JmR0doi{nI~n=TH`a()@YZXjvM7d`W;Oc$kV_w zH4n!c<1H*tYR>^I3;>vEaA{3wMMZ$6hJ%4PpW5q@RQM#L%nznzucI9pu}pcc%woTT zELKN)m*)#?b~ZNQ?k>xl%67qUd@(41jC|Y3e`a9_7%d5vARuTKQrZwvU3}-t7Uk_< z{YF}Zcj(IQyc3F!%Ru@$D9IlB`j0=()7l8gghC+5;laK{Odd~S1{O(q?KF`EJv^H1 z2N{W&eEyx5DS6n@F<$7(?kMoR0O?&L-~%Nrh9;;`e_C?^bAuV3vOrcUHq*=U<TcIH z3vK>^p6=sQXM&6C!^KKNT;y4<$GvDM_BYpb)71@)Z|EaV%`ZY@3~LO(sVjf|*fy7F zIFN*RI@jOl$iY!Z`TF65FT#<GPLRljUoBnT_{j(EZK)2Ib}McAT1w*gMu)VXJWOgR zp|W~;ml@zhUPro^7%1SW@;IQTuZ<^%qE2}5RTVe0J#SK4$1&rrm^XV;+*Qnji){-) zENv0B{rvPLB;eMd(kwyYW+bhx5HN=xmgdQYZPcl$R5k^q@^%w3HUxC7v)*F|rY8Kk z{or^;d-6k@^|rc_wqaQh!>Ryn6TrwkK6g$4<qjpFb9j##!2@{ST!mnI77DM1fPqzd zVSE2ni_ov=iRfIwQXc|dF?p!YzVY_nnvi_|v(^W8@AyteNk&0IQASDr2T6sU-)wT& ze=$87#~cL*L1H*E`QE|v&-c3KSN73{Db0D#=fbXCil`-)j81R{Gw>-67x(W}`sPPP zDOm+&MMWh=MMVV#B}D~ARVBG=`c_eqt(5kulE%e**bmZ@G06_+MRHR*rlfe&*vvnz z)IS*xXc_`~7Fk8@1M?CkOK>>K<6s_`R`D#gj1NG~6SFbHBhVPTS2{)kPqTou(!k^r zK<5l#Xq{1n?Pm#kwYa8ugC6DdBdJwEIsRwQ3TZ)c*EgG84_gC;l|XsfGZPa4W|jV4 zlr{}Nl(WLFUvF|cXd9bNsl!rI<85_s%J0~_-sI4Ud-tNV(opCMR3EMf8Umh-k59a$ z?I^!v&&<^pOhxM;9*dhKzH7_@j9`GCbykr`>y@y5o9^|x95`VF=!?+Q?0kv7S#0jo z)|i&k&S3I(V@l)!EPdWG^6Xan>^Fu03<4Z*ptJ-qJOk*9>y^N#5P-HRU}BYCv`l%f z%wiRfD#<w-T?k30r01bxZz;Gq$oa?Ab|D2&i8Ebs0)adeptOvKmQ0KQL-Y6?Ay3cc zjn2q~cSB`?%h|)bH;ZWNh?1;5?0i^4Z%svCT9mD>(>$HFRHAy?2_rOKNTYIx;sup1 zyj_bH+3RcGN~^@IRyqS5;ts{~Hiuj?YAuwoIGR&=Gow=oh_@~h!3=>jCOoGQFAXt~ z=Yu@%4CHai1sLkodN=+U+n_N@Ue()Z8<BqhZ3Uod3c#$hiiPBmbl>JjTP+#yr`6;} z$UaFC=;V8cRxy4~L#4}ml@-2T_s3tUs;GK8mv`n)!Kr@kP;#qSn-uVjjzkZ1@H*U0 zsZR*mVd}BtT4)_1mQWXaZAYl-PLG6!kWP>^_NkUB@o9CT(kM8=TB}w1853|b?#-V8 zO2|d`O>L3KSvFMS2OVR}#Jri`PEtWeGW51*B|5Cnh8}&3#Mu^kfiJ#=|Mq5N`VwB7 z*iaSZscm4j&+OWxgh#o}ITcM!RXHuizHz~~G)~^rwn)rG4-WI91cr!6eQ0#g)!Mg! z3WrmRe68<4I1`kM?C%DdP$<Wwdz)$BR@3x<o{(FDuB)s?AS$c)RF9}?L!x_oN5)6z z<=Vyc5RyrMY)iVgsYq^!CPYmarnzyn>op<^(ANXBEwbJVJ%E?s&<Js8MK+I+B5U%1 zGrXCegzTR<#;IO4jS$|}<Nz=uNSkQ|Z8O1rQB84&z|oS<eE<6zdY1dlt_o|xRYTKX z-xMe*pMHog)MmCA5VknyAV|OWb*$pEvAqM}_z)4-*Id?$O3jM$zJGGR$@*Q}<Q%jv zB*k|2b%5jjr1@7j?Aa#oqHFa$v*KxH8KBF9h6^4Q9|V;Q00Yy|rLEC2DH8)ds%L?b zzEyHA59Y22D)C=Gj4kH))Z+47nZ;H$A`tjiT>CIs+EN{HN7nheoPYG<PzjQ!<sAM3 zPcL|81q03)1LY+^S@9!defLwE{vjfKtsRBw?d6OyCK+@>dv9|YT1cnoQ)6%p5?^8% zfeh!iB`S8U94al8u=of$C5JgW6+k6(aS_arpR!y+8loc4hkBejFJe!pVyDNrfj7qR z^!slr0F6bUlC<a3%I-RlI|;Uv5vjhb8$W3Y=xm>}dTwgltUXQk-MV3@=$WpWFwnu< zPIQn<k3&H=d3q6^l-?1xAiG9ugBM&<39;JbU6SgOTH>N?<*jll1m0FKwMP5XrPWQq ziGfOMwMwF(5|-49{RmJ=bg~R`swEO|&in+Ne_Ba^?y38Fx=|VEfhpUa>;s9R4RNlz z+V@YGCuE37z=>*c=HbMDLoKfWN-}Pp-l(N2>-eyEpmyph#s)`XI<h>C^n6a4#b=<X z{0fo@I<}_hqGPnRRb0)}r!}#bXCoXg6d<r894PFv(=oZe)+e0}^g>h6qXR!lCRA_) zl8Nux#kjG+@qAp~V_RK&6Iei0jnMS|5IC0BmiN&5q?33K4Bn$66EN3>T940KoiUC; z_q65sTC3gGKOLIb(AP5+Iv3Xzg*z109Br?+{uHDIA7L$c8yN(g<`?{yi%ZRjO~NkD z+0#h(;i)sxne}abJVyMj<RQbO#-~`To&R>D#IFu0Zg#r&z77t8_!+aDx+*2{tD~DY zUkuC-d|d_@XgC^a21YNEfUD&v;9vnU!kXeI;BuztOO~`o^Tdp)`G$CO`U6unZ*Be9 z^tKWD%+AisOu(%?sl8&0g~oy=RlR+rVrIA5J_wG7FHFGkXN*dV9>Y%E*U^ni7xMIY zH(gzSP1EPa(C8|kSZKKz>4m0>^R-F(<S1j1Etp`K(VC>hul6f$b@#69sRl<NAkv=x zzzmY1UNqE}Sf3REl^7s9qb=9RW(8#fVq2krv{+R7gEI?tDlURe>H6i;(pb<IcPM&U z9#{5^|8kO)-!`3~gmm5esv-QQ_7<mO`|c)|24^CkoY8bN6qkV89~4&GgBMgqt#bV2 z&2jP|;~Bs}?`clhwdCmYdu&~I-;7PD9~>SZ23Z-n!bj&$EsH0MjKse^mUd6t{+Xk$ z<1=09d-liPrXk6A!8{gkXD=FSum|5vXh)Izm?8@Ee=hnGpwefWfWwj~*i}!!i4DQS z%P8xPMpOs2W_ZD5?bK9)BGGigPPX7=FIZxqe_wO+aTi6a<ODQzSoob|DX3)3D~x~_ z+&_Kn?n&*K3><rUc6R`*x>@v4TSd)Pz*%tU0lNo@4?b6LOZADL&G|=<Rh{yzfX-&p zB!6F%D&8m*<P0{bJ4O=XnakK>e@U4v&W%g#sd*i&yUAW%)j7WX9aX4kw3=A%>7ppF zFO~zHJDkv(IotZsDvS|&L#yb3KfWoiXDVy=B%fS4^?ff`Dqd5(rQqSs$#--Q-%($v z1z%m2Q=VJQfZTGRvJ^P;K~QN)&L{3Fp9#$<dE45R_oApbvPLkXagc#*NqX^ERrBUS z^+%Dufpx|AbNk|I1$~~rdRW6rP4hAQl~4AQv$Be3HXL&hSJq8v>TQb*fo*XRp(%b@ zcODNYz?Nl=sR<ayC<KL>G3Z!#BWZi}ouN_fY~HG!$u#2f%eq&#RN^OEEJ&p^M7%jA z=X7ANLoDXi0LT!?bGoeC#F+o;lIg7@Yp1Rf6eaBGr<K(_lx@Ouy3!jO{B9~M!8WMh z5Zx9N9Ly#o(?at|;WdInV7}H8pFcjN=5W-^D;Jkc9~~Qv!^XRt$k?mzcoBtR5Jhx& z;iwa`T4=+(K3C&Qyl<^wF^bq$c(5KB>keC}Q++^JWCYU#U{<e62x&D9em54A#sXTt z$3alZ7%)1QRZ5)RVr!BNmR-w#q$8v2FK?GpLCWr`_jOg4H&`f#$2xL)K5|zI3oui~ zKCD%bpVRY^2IjE^jjb(hX%Q~FU2P9pyr_EEz#0W>81)a_l@-Ltz&XU~0dddj-|C-N zm52UQ)qi{b8MeM>S}>C|aO6Ec|D}iagX>0NiAZvrh}y58hd$Q?+?>yAP-zZ{UDyvj zTnUS97T}qp9oy8|l}CRc<bB|r>2}-O;VG|Ln%_4fYYXBlgJF+tk4qeOQm{yZ9>8?r zrKF--ocUe{(1V2(SI1V@h1s2Rw=}u;GBLXl)mYJptj>?Gn9q4wFgr4Y8!NV}_EUAz z(>Z0}q4uoSxpEB8n~h-$ZFz9{H7ezOZ9{EkbyayKqOQCi-_$WUz~6m%1u~h>t-idT zfb1G%fMbK*`Q>+Z2b*rTbP2oo5|vy~+fY-5;B6LA+sSHatci%wRdLy|fJ1d-c@w#% zy_M7Rt|<pF)&{ist<wb3Tj3ZR%ImvPMDhsOPHKsb*3@%T(YxXk=bn$sLZIs3$5%ZU zuPG=DF^jP95JyW_bCY{7gtee9q3XWbloz-wN&uMnW#pnZj98kpvgz~e3ZT9@_@+n1 zm7D3wsg=l<y4KE$(t@a<3$~BWSw&`ehvdJsb&0s<l%A3{b2T!^=A!QvyYR;MQB`rz zb+^0k*lHqjvw&nmJ8J~&Ev&t}JIHji#f+wE5r~=10+Il|(}00d2z*Ivv`mS|&_^H( znJB|&1UPRqGE}m52}_G;Eo*8C&0hXy0V~^p<EL8e$Y57)splTRVyl(w+siLoQi^6a zlDKhP!&lql6}zU+nTq4O5oZQX=C{fe4|s_Q13=nQf#wmT|ndUV3J-N>`;F>*v( zRiLxm+e<golV)`q5oB}D=c3CCcvsO7hdol!ofU9vJ0wFZm)CJ`+S<yxhq?wQ#)O`z z^F|$)iQ=8F2fe8DuWXAGal{=0$4amn0Zzg?_0iSv;cX-#dh3MnLQ?fyT`w#0EYssE zfJ*p76HN#8qn?3LS$U|&%Eso3oP=B-6JICOJzgn>$!&Oc+XOB=3AR;)9C-F0rx8a$ z^-ZlHn;gQiK2H49F;B_s2B{NWr1+C5w-mK(9%w%($imh(SHFIzx5ahG5|ZIhsX@5C zhLGp!r1S^XKgu8W$Z@CwJ7><lo1}2*@0!DJ>U?Xf`kkA9X-5sn6@O^pzm&cNsPwTD zaO}Sc{yv8U++y2Bawi$BOp#kq?sK)zX-Q#&bdbaCtUw1^1{o>s*`e^Qw7i70?2g^r zv@A}YFgq))>Z)!MlP(mD#I-o{y*hA0KQgDa2TQKV^g43q`0w{^m0TyQC?zAeT^wh2 z57-mZ7<%!HgpsPe`|X^ztl3QV{89W)MnOtmK~YXoPEvNO>bm3Jr#;^1;dztTlPi$P z0&d!##Ra4hCYQu+eNq)<Xt8^T;<vne<m6<ed0SAzE<`oIt|Q~%Pb>Xlmb-*F99^gG zr++)Tst%|u1hh{9C-~d_{p2y;)AlMV=%q1OZOpXWIrc~Q?cDP94|3}_%I(;*?X;zM zP4Q@A5L1}rcF67c@AnF6!Q4h#)l1V5fR_UBMK>oDu?^|soXyTjtKQWxd+{EhT#pX) zIC@ay>mO7$$jK_nD=JECIiR-N=JnOE@@8sYTaCZx;RC0js}fUJHy=2*%O>RV>t;j` zgEfL<R6i~jVZHn<DA|1Jjdg;kfQq@Al9!jBzXhePQDi=5No$NvZxN(QL3&GGp8Zaj zUEgk&{a)hW0WG&H`pe&fa%J1P{uGP7TU<b7LKZuYc~TV&v)lv8K~6zxW_wbVZ#LiD zdnGNigN&orHUVd!8!7D-_H=7$)!QdbV={TQWu5ey(FwQZtLK$cPRT?e1MVI@cxsML z`C5B^IkdTwFe>Qw5IQf<fiFYp-~Mn=_mEfq-FaJ3E*y1aYBSGzd3P{Yv~liYG&$Ik zmn*DOPgPYfU04(ZwnS{msUMk+nXl{RM4sh%91MV0JS)$0JhN3v`m5h=Tqh;9Nl`&T zMpkL}_uH)Y+l2U);;LEP5eR0CU`DI`-}{QT|D-W+V5T&0Cbn!?<@l+t7n6==4uPW} zCmEe~`KF3I1ot#OGF{W_n)4o22O3-L-nkS{NVEfe&B^a{4!a*Yc_X^^IT7rc*{%L_ zfJ!S*z;Wgz;J9C6t<vWNl@>pQWd7Fp+vXh&F-Q>v2<Gh36C2h`OG#|pe(<2Kle3j~ z$k_{T@7*h`?xf8>*hEZ=bG~=-EUD@R`&r#xDV9n0l3M%aHb}}zNlJ<5JOr{!I^T!6 zpYpk;|27>%AqciS5HSjgZL)H*@^T8Y;$8g%WHOiAVIH?T#d)2qao+6>eU<!sBzgBp z%gRVi9c<FUKiH(1QUCO@@q+%S`|7zRmNz9dH^#cTM9w=zVufRbdgXQcE<Cr3!vROY z{$xV3ou$@(iS?3F5|T@3icjMMI8uUn!a^<Fdue?!+Q%~i)g0g05OaHxBQHeAa8b_Q zFV3EieBhhaJk)^ePK>hBvXhkDFDJKAR#sYay~<HT&4B7h4P!Kr!0C)hve3LHDY<X< zs=h`*g-<m|=H=2L@zjetmS^t4CeVF#y_HXWXEg=&L~_6SF}oLm?$N0iu0?y?E2*I@ z#~KF(F`5I7E5$0_Uh>oqiA{SCYk7E?1w@!%in!}tR7IF`u*qs37PLHzHCm>{3LSdm zxZ5@-jWEdoX_HO<2(g}Cj3A7$=8aCs*B<EJ%Ptvez!MXrg>`Dc(;5OKGw0YwG9<$d zr?&qfzvr~--Ml*sp_159i#gC^aS1O<<Dzx?&eOX9(JAhj7uNhkY?cvumg8|=$*7ie zRP|FI3k`jF`JD<1^767go+?MzYXlfPs7Cb7B%s8}VXplP=;OuDf^r<4-=V%CY<wI{ z)oJ$$!@I?Iiu#9!YeyS_0F&cO@q{|kNvcf*&RDp>t_77~3!w+)49NQ&5^x_5m6)Fj zRGLbbO&xZ-stLHie{Ko5#gDe-eH3%x;>>}g^A9wwC@-(Bt82#M(4C}K44DAM5h0%9 zTAcl!jO!etkAv*Vu`w!|+FsGbKQ6SQyh1!@4#*v1(Rw=?3GGO7|0r+u#H8p^lvfMR z0j(52f&2k7S;&nxz?u{siOQxEyO2}&R8&HeDXVEfP9K*$GRY)%3v;M1Zy+>xP=^?z zjwbynW5h$f;_}W!<50(_?dYc3a!6H6YHCUttnt2<J`q~zX~j^wI{TPRDr1R*R2Rx{ zNzT25t^p>8F*?>qK{vHm@D8%&9UKbvxgOcrJ>12F8W;mvlzwz$oA6aSVOVguCRglX z&$Gwn@{bgqrzswv+J^czQg;W1ifQk|cMc7+murnv<LXEEVJn(y%ByPX8awbU-MuZC z-p)=Moi)i<*%HU)e((|0t81~sM=5)2SS4j*XhV>&#)wQ}6H2tFL!;x)AKiT0uJ3H_ z?5A-UEYUih(b`-YmN!+GRn|1s;|Dr~ck5nc)Z(MoA`)Jd#OrjC!-FTqOG8ZLS(e99 znIq66l}JE0BC9HE1T6VS4p%gGBMHO9?3t(_{<z$E$3=r5H-3(C1d~G?Rv#5vkAs3B zp4LI*OiVH+nWP0Va6tlYtQYKxY>sh1dh*6L*z@oP5^-vs$8^u<mvxUWfSx}WeRc`B zg~_;&29^H)8P+PT(HgDM8i}BBkeksB2P|~~9i!+>WbYC+J!`Z^AAz`o7%=x@fsf8+ z<0qSLR%Uh3KNlnX5}?v*B;Z6R<EFO>_<Ry@YqUmdv_>LmfXj$!%>?w-0d?JXsZG3^ zp3mhewMJhIjS>*8zDnV?vIaic=hH#tvbHPuB<QErDzQF^1l$@_TB9{uqcvKLmQiiC zMr-u3iAic|4$)5Y)qR?WiNu3_tfhbQiO@%dN}SKWR%tB(w?=EUMqdCequOkZ*63r? z#2AA?YNmEI69-2rERg+)6e2ByK57Dv^U2gI{d4N`?BD;1{GKCp+tkF;|IMPMzX>Lm z)}YcFt<f5-(HgDMFM>XHtrF)Gs8#wu{%2tf#DhV?*a*6R!8g3rn-Em`@A1F#anf1> zZjIJxjn-(5*62&8RZhUog-U;!f=UxVYpv2h`JewW@i&k;HbTJlx8vxfvA@y&{?Bpf z`@jC3!ycwFhFS-?7{-4M{{_19zbF1Y&R{WH`^M4ze;Ne;hrhMb-$yvCo{r9rwl3Td zNSgcy<1d07+~)(8xEzp8WeFCRmz9^7mDV&MTYH$~k=X^kzc^Y>N@BT-y2<>jlhd-C z1Sg^I$)9(!LohlzG&)L02bIC-6S0ZF8m-Y9eJ=E`Ou~L~3EwXPDlJUF%}d7d=8*n0 z@t^I4hK#4@AGx0od)Gj(`TIZV5LDs}PqaoO@<OjfH(t+UwT?nJPfXB@TB{ST2g5JF z?Lbif!iP$%-j3q<D>nWXcK*5Dv4j60asM$@+5NdB;Mg><HxZv~XQ8!!!@Bj7KYq7c z-Owfs71jpww*~q|(sBx2KVYlC!ZJK_`p_{ZI8uoJz-{q9ITDPn;+?y5jLYq~hQ>G% zTT`yl8m-aiLjTIr{x5DB!55H#`+ooc0RR8&eFs=m+1B>Vom;=}mMJQtR8g^vjs;N^ z6zN@1QBg-x!GfX!Hl(N^1O-7rq$6EAQWI(dBq5;$NFyNu5|WTc$eD6S=gyt`{O2T~ z1OkGCeskw%dGN`Tb8^n!YwfkpyZ2gqtzQ6@1brij8wIiFHwKsJ#jqRL;Kh6iBcUNL zOz(8!MlWOmNh*U%LJ%sYO@K<2UmsKw@OWLA)+RUtSzl9Mk3_)n&1hOLPb^P$D(y!L zGA`$xHQ2m<)kptW`q^iner05R^#60H^!8#MvnxQ64Ha)OG>^$eVJT8Ju7}-&!%8VJ zs9c!2Y-4uztcoqnjy~jE?RD>rV8$k}vI<yvIm~2I!ISq#QZX>n&u39P+Nf<E11!Eo z0$SS9IVT(ZjnHpyj;=tHdnX?6odggwg^YGAs<sZ<g6rk>&ciDB2r$YPvPh)XX7uZn zk5KN+#%e@+b1Q=>l)U#yh*2RhOy%|xT2MVG45N=P7QIQJDi941(pq{*&15E5$Qy$f zqreD5#B6VEZiK@THLufDHa5dM`mlXM{w$-TXJhfE(z}hlcYD^an0^aT>D?S~VhAcR zMYaCL@t5_3%MIg)8s$)lnSv||Gd!QFf1|0GGAe?g(kuQ12OQ;B>459TwtCw-8ZA-T ztgF6iwVvvtW4o<mV=&B4Xjl^mFiA<K)>qeCpYl)fE@;ZFtZ8Y%wA23ocEHVCvUE1r zOe_g(6IPChsY5+I<M!0;Of;%43|;}VkrkbNdkN1uwE08M3uV2_llKl*Sp}=A9P3fu zJoaeXr}s;To_AD4oc%iD>vQ?#1P%}20sPV)_<#9Y-Mi6mZjP=%lY2M7k-t_YLqOlN zp45{LJ65dPYI-QD1)SQ^e&N(^bO;!(CY9d_+_&38UPwe!T~kw4O?}g%#ixy(Qqzg- zzW2>rJ{4#SZ;85Ss()jfO-f>WKXoi)wE#5aG+bfyUf(-=LNlAlXj!Em=s!jpCH>TX z<4ubesj8`IXlkfwsxDUBv}f_@<bBEHc7|x?2aeHfES{2Iz0=rxw`cu|={MnkQ?kKL zF?@S!ShxHT^o#26lq7oX46Zaz<RFK@F9i~28mc(V_|mhTzD*@miSXsm;+Ipxy8k)0 z{SAUj-~Pz|<_GZLN&g8RAX)+s2rZ333ri4G8kR#P5sf44W%GO4Tv9)~yKk_Q%Iu`l z(oxh6;gs#a7%KH(nyy<KZ2siqKYaAjM<1*I@z2f%_D`c*S>4e1tfy25Us`P9xXATh zDHA?lW9Pq~`lamD);yS#CCt((C9f4y<|*?Y7QjnyFM=Jgf>}AG<hL>up%MdNrL^Y5 zoUCEC4i778o-{Nio;#m-{#<NR!^4_Nn1e0M8v2#eJHHc27*cj3Xn-t@U`AF+&+&ur zv6dug>{uz-vEIR|s$tbtuY1Ipw;oOV^a1HmerIKr$Em1O7mF&ohWP*+;3eap!>m3) z-+yf+>HBbU|L`=aP%fsQ1${dT&>LAP7gA1a*40$`>qbk*NX(OVfc^_J@r*L1L(gz& zC--Y>EdA(DDqpCo>S$@KP}fk=RsDnUW<8&?S*TQ&kSckfYj)y3fDnxeJ+^Jp&ZSx> z&KKeep|Wj&tfp;Ndr`opb)K%9A`+4GR;Z9lzp(8EDZ%rpyYc4Dx_?qtSJlwe)>PM4 zQ(3xt+aHW>7~CkS>S4|9!3x$4oba$_2YTLR?8&W%+`8^hD`<lN)_*nqCZN)EIO*+B zi3vib(j*WnRe(?lr2v)EciwK1L#2_aP-%Pz9RIr?XNF4P!Q@MrJW(G{)XNpgpb{U1 zO5h=bO3dfj-mf0@ZjWXBLZ~DjBKIMJo&_8=+;VL5&f9@;@X9VWStyl4(~=TW@!hXg zk6CK@M`Ji0^EGz<>xnHLN&{cLV^9gJ6wrXvwLD4{?1&A_+A$@6@~V;yD#^@&l~ZB? znm`8xWTt>gCIIwAbOFrC>dl?!XH{Q100=TWOQAbkAIz;Fzt6lRqtinr<-D3#l1cyx zN5mWGr4CSN!(51cgMcvW1NHsaMjuk{AD$+zKsco3;)i8RDae89d%jzDT5IfeycvJJ zl2A<+3<v=6FT^nNQJr($(a>$@j_W}Qc}19JcvCa7BpVZPHtwqHhNBO*`BfJ7ux7VV z^UgHPs7p&cq<+p^#~fCC0SS;nvmzn_@KcR3&gcA!&p+Wd^#hU-su<~C;b(8Y!e;%t zb8b(vA7h$I8|#tv^~fevQASSa@r%J1Z)X#F&`^NnTWO*-OP*}arlWTod!u7e$<YF4 zbuhD}NBExk`QGWj+5sp33__)UOTLpZNz_gd?BO~Z@Z?4u8%G%(_~u`tF;w(#$*Wg_ zQE4BEO(Amn#4m?l{VbM2CGlIJ(x^xVl0Y%Dm{c0Qmo)rsuk<JGx3WMb2r#`A0Q{jL zI;On?j>N!G7&sDL-Pl~+(osPeLiS1M!=nR&(E+}M!QnBOR064|3QH|-A)@gZbW3gd ziz5Hz3Z0-1gZRNF`Y(L-^aCT=q-xk9JDC09=T+3<u>n1V<<#8G^EtHlQ_Bs@TrWmv zJZ)<&!H`<J1_$4iMFh={M9d%PCp1&qFeK)1pFr-Ill#v5>6kWBa~EYmGzfjklW^sw zVdtwjs2CU-;InC6UGz?<NT&oU1PcraS@dpsxyNCVtSt7ZgwJJlkr`dR1A-BmF@4uE zr9+JFZWghlP1>8#QV4T|08MIMYrkw_#~+pVZgP>)TgC^|p5qv-nV?d4A0VcK7j z&^Hd1_NV3H28Uz<5;HonNK8G7(A6(uL!9JDxFjMP)m#m)Lm<Eh!r{#*43Rt};!IN{ zQpzI;TY_FZIAONKRnO?wz4+V`Jid|4A+bhA-;}GIxs>Jv8WBhay9T;ZEy%iRC<X#N z>fwl%CM<=_1;BFvD-D+q+dmm9rRGoKl~Vr8_5jXWrqn_H>&T2T<^rQU@i3dw$L?be z3#5RA-z97bE}PtUR?pPJtJC!hL!u0cxNn{!mI#^5)|PfSRO%I~WGX9xjPD($3&7?| zq#|a2YqR26?0A7>E+jk5^s*ZjO)NVtFMwLpLc)@`;7eEv;!GZiGvzFXIK&c2riy<4 z<o-c4{mrh)J|2(RO=NYnQ~P>Ql=iyDIvlcv22L7>6>8VN(Ie{vsU_{?0Z9j~?tY%{ zaXVdyy@t0#;e$x%*0NCnfGj5UOrtepkv+hWSjjbHGEY9LQ*p8hfX$J-O3LduI2Ra< zYEL=4@hcBC!|10ieRPl`Tq3(0g`Qy)DHa!>rIfK$A=p&mP&+MccZRpF+3^s2e{3CT zh)u3*xaX93?eLA_o=3e>sOAR~)fa6Y<Frj{`3W8K)c78OLLm^&5b<$%eK@R~N(T8e zW!YvzS=_1C%=y`K`~VA(il*-)PcBm)L8LhLO555RDIBP>HlvG8Y(k@^w;lxn2W<UJ zZNd|tm!Jp@^~l;9L_Gq5Zo-l&95Giu21W#<Z`Iam_>3WPSVF0+nH*5!bF!s#rQZTn z62AIY!f7b-Ja>J&k=>rX`liRX?~QczL00rhS+D*hLrbqDuZHQw=1h;sX!pcyGza<e zKb%)TON9MmB@Vb};|{oH5Gu*MZ~ta9@r^MaS)rGs>Zlq0KT$`=!@9qd3WPO1H6iCt zAJQ|}Yp~mF*B;YdyNq@?y6FWV&J+!|_DdkBBp783_A)y%s*9f-y;pM3|9N)GovetX z2dsB$?LM;9quL~m-@^QbK6nPeeb!zadcYbqHyOnpL$ZMG?tV;EoYm%ofB5~<kN))W zM}Par;x87h)&FeQO*5YtMcpjk*f4@>Ru2&J^Dh}a_}Vfs1D6QC>!F2i$al`bWh7c2 z57>Prtf039LMSamjUjjK3`~|R(p6ics=j%#ikr!Sj11y%KOhD~WyGmFzuvNsY(UB` zBvi*<x%Bkh^>PG}Cj|JwXf^3YjQ1YDQ<kw=xV|2!iNhQMs`SeJ)T>d2U4w1VFPjJJ zL+-poOAzs1mr^cYPCz5WYb#+6;2g{8Sssono0c^XjNMaZjk<=K#xkvCe_Nuq`V*b= z8&2e8wfA$Tns~X{-4{__mxRJ*cwfu7=ADE^MbuWn_SrzP$m<aDK~4^&5L3?C=vlAZ zam72IRt1Ttf!%P&&uWL!=Sx;ES5;NhU9#AChqYf&4Xqx0IZhTZI6Q{g-T7r+JG?gi zMe84b{pb&$e)`#`Iy)>4ZdLo1_j9?8{AO5?!%jtRJj>{2(WhC{8fA6!%6y7$?lje3 z{l(JdYU<0?)z>arYGPn}Cj>FjA`$_tjE+Ls0h>usX)3QKJn<mJ{{e9RDk$x#ioH53 znTDiZi6|ma6=ueeq)NMM60UnDUhyqKGO6Ug($Z@NKAZlc4fXwVsPEg&3~m<ryx?`S zMrYM8n}Cq&UZe!zLaGK1hdwqjJ=Mwh^x{RE)YMeemM>lW*;j^kF467rM6kJoB5Hd2 z0mZXM_AasA37x=*xRHar<8Q4fJF79-L0ZD61IPeGh>5Mink9=>)l`?Lt=XYsa>qKb zv7!&;&Y-mUPVJ<#rgyFV5oIKfPyyo1uiQU~rcc;4*@DUN@-22d@gV-jw$L*xH?KUT zXBHEMrniF}Qq&`CJ~U~uKk%f!JqM3|=woE+u*&Y3Z*DNWAH#ZGd>(98O<&y|UrQxg zQ#YnH(_Iq~RLeq1Mx^WvLV?T)bs)W{oi#q>z~<DDYa%bMa67c>PFz!e6VTUJb))R& zPV>p5$Umf-ij+S~CgqyBN%@X-Kz%t?A_6$TNGkUE<+JOY53M`>H0Mb|dEzmLtH<|; zBq3?-vWz3VuCg+B^H5vUGeL#7t9kfgK!HXjA{v!LrLcrTW${CxOp%QGkU(YDY@=&l zPLGf+p>Zm&m)_iIrbJWdO(2j0#KS%L6>r8Kq<1R~tab$=ywWk4bT4>-q2-QM(^!uz zLW!TtA)oE~M=#iIJZG)CW!*9r)wL>1&3D<~4Xx<|c?b<Xb~j(Sw!V$eASeCn%E%)S zBn9f2b$4zn8x_iI>ATQx!2$OIhik0NjyrYgilMQc*<L*Z8{M_X%xoeePy;CWPPbPt zC9eiZ*pdeZ=l!<c2(RcX{oy}@;P;~bk+(o4sTd0D{;8jYD7muZ;i=uXpW|VapSmR= zRC+1=PRi}?=&6oK4Lxn;XuoQQ*|yylM#iQ_yAAa$53W20vkIxoLidw+l0LqKF-T-! zBZ?BPY&m#a+wQjS-7By_7dwlcI(uB^2P#dNnOQoe<+Xyw3%ntLDThjb`IG9OKmGmR z7ON~>tfs5~#m-4k3A~a&*p^ZJ^>SZREz^J(C(3{hXx#w(E9)o=IH6@`qW-ntb9@nl zLaDtEzhiq~{W`7xS*Epo`Er$2pZ{*hmz%G;7j@?F`bGv4I&)ywhKjo$X5I|}f;?Ud zCij-z=BviLV$(5fCNKyv9-$+T?^|rAuYK*-3vwkm36s+M(FIYa=Wm-`OTiQB0TLY* zToquu{~cN)+tszl6!xM5LI4hSFq;FZg`MCv-9yNr3i&<%qOQ42Q&Uq_d-*J&k`2tx z0YVZL<uFqdn29O0U#toqYHts-JDB#OlfoLt_C51TJ8AyqN)z=xSG>wPO6Yy$n#B5$ zQ|`O<^wc%i=&V?wy;^hehAjpsTq0^Cv0~CBv#8{i37W0XRvMV^3M}->Zp0P_)(6`= zZ&<IujZL2J`Pg(JFraL3jk0=pW!H*t8CmXJzf@y|_DY?Vnk%*czG~yPqxMg*58Id= zLRwET%-L1}Dk<UBB>oq6<nWndUTRmK@4hWwvykaIUlX6CmhQ%hGvf(k#>ghFpsTBE zpseKju4}V`O4Ia9?}$S*GL!)HLI{E;VW*-p+`aWS@A;#u?oy3q>dRG^e7<qF-LW`) z3~rc2&A{inU*D#1_NzVC#}Zl|BL_Ol6B}Wt&Q6xyNtcNF$E~7Xp-4zVU_%Z)a9Fiv zlg{6@G}Sd#muqbJv&L~fm)P_U5}_Z3408#0ShaQHS@ok^4#g(p>533%e&zl_G+n-H zQl<r!<$hLsF6nDIo<FR6_VC)Z+DEpV$2^`2l?GE=3;ho`+%hx2mKf!g0(0ND!O3#B zZwQ<T0wCd7%Ow(S7pE?+D)`hHqp4a`7ljj3Mn(WZH?KafTJah!@S2^jE|JZ#%~Td4 zrL7oRD^-L_TmUF(FAh4ddFs%ryE3T6=&Qa}?rUT<bri**U|j%HECz@OT*#rYIZOFT zGLG2~J(S79XT%zqd8+E4_c(euAYg~n6Bkc-Er};vg(ddZCqLM2ec9+(D1ulF0CNfV zk&bflyt=z(fwoS{tl0#pbhGr<)IPd6L^r{D04Bf}lMAZ64U|D8EGEMTac7UMp;GHH zz#(LiOKu*wIjO(O{IKy_XA`xJ>ok@wR$uh-(v`Y)Hn8gZcz_7vJ06i=ab3B#&dg`^ zV_RKfQ@f~Cpmz`%UlV-FP06TGYD?dRehW}(@2<e(ZW&KY(KTdZGo_=lIQ7v9%j+)A z7oW9;cmGTtl|iMKEHbYAk;!F0L;t91X2nZ6RAP=a%<O=ZL#2NYQ0mIA?~OcXal5c1 zg7#C7^e5qWLg8=?zU+~^v%8t?)w6MB4;s3PQ22%xbbTu_KR+S(yu+0<$32sf5781F zOTyq#nC(wXpPV)_GSJ#$W9swdN>X)dZqfZ`m8*m2!vUuNl~VIsnJmb<i~>WgLx{Wi zcTSjWKc#Q%8<hCG7=x)q6EO-7I2kcpM$(Tx4{%s<Ic@zTGO7>!st+JPLZx0=?{H_8 zYf>q(k=l`vY`eyD&1$<du_t5j+10Jc!juwkOFvg@-5Xiv3H9W*Sb7QUfQ90&hqvs8 z09#ttS^40+#<@c}_Y<307=Xg8KHK20f8N5va(}?r&lr!X;6-?5Tjo8RJ3jWXa&k=r zIq`}8n#;PY?cc2><GZ@5tD)Dw-Jz#ty$x;Tgn0Wkp0azMh;Gd+Z^6{%VT<49fE$nI z0dG}R1+%e%4)8-Y2$dXRj)$K%b!4`qBCl?Bb<}ac6j>ZcCUgSWj+VR_i|c`gw;$(J z<@S=Ax`{olwUn9%#ZUc?oOpc9tGud<H9TeMSkV#VdoRAAtg9KzZLWt$#+t9Xylx6N zPFm{vq!_0Vu?*qVAtN0Tj<CpVYFlS#8>YPzPat+7%X(8hGVY(-cq88^0@2m_gjNAN zY^MN~rt(VhiPpN;GR@MPiM#?<UBqRr3vZKY#yuOqt5%N+&{QG_p5E~G&6qLUmy*}k zKLAjMTSF=yoG^cz18&-W1-ozb$=Vg$iQ{qsW_iPHy@!X_yIy(X7J<nsX+Sm9)FR+W z42HmE<MCx>H}oDIS?_xF_1W55L=6gC-@|W0)#pc<-MC{kMRxH4M_iwtypq|3Nyn5w zytwV;!A%$avx?KG?R9ueWm@)wLmnZg&g3;krBp<@ZaZ~o)5U-{XEPrhbh~%PC$+u1 zVTv<le&zn&HC?`I(iT>U2t^cK*uQGI{%31#uf+Id<Fm`aHw>+Bc#;DS1kxF8B|b-8 zob+{#OqXsyvg7MZ56WVj*lnEG>q#K8>Y!nB<1BpwlxR)BkrPi&+{kYjtncb6jJ3I; zM6==pkGLkddZsitMl@80I)Kv{1qU1hKwWwfV7glOl=`07r!5S~0mtj*Qrieqwd4A8 z!^not&gX-rVLo~%9XDO{o4b^eG6*<ILv@86cx<b`Sw~-OyPNaFh8V1b0y&jffVikV zEAW)YL7UZHVYNgMGR``dAG|S<(Hfm>z3QSaBta$CY|H@%2)VtSseObrCDS09fM$w- z(H<!#SkVE8Z=`U#8N)m#ncLe=ASkmQk7~QxlKS$le!Y6P{xbVh_fj9$U`tW0b@@rf z*Y@6a-mYVRXX{Nw5wzYc9pO@ywBap$&U$e0-2L+&IgG+w;)^ibTlWlaN6*EU&Xs-( z4!D(TeRiLO=Q3XL#)7pwJEHc*U$xpFUUR162mG+i0r!$kX{(H~xawzoCmPXT`SL%k zxj>~sYD2{>^T!@Gw~IO>=|2&_`AH~Y3Ois`v8N69Ui!)@F``9)pBUE7Y(a<GMV~jd z4a`51#ew&V7(6PoGodWbZSQUatsMs}?^WD|Gq6-fX<P5+$ax6sR)k6u_j9p<k(_Q> z43phq&@@c{6d?^Dg|}pQed+XI^{I+-5b%!>rRAr}9~@ZimAmONmcXgtB5!-^s9Szv za3-cRaR`uYMxg<9ZY4oh>ej*9$CK)6BigHB2W`jpi;V$`$!${v9MEk#DadDG8^8A6 z=pBn<mU5`r_!9^p{m`3^r|yQ>JnHr?Wif^;8MwsDhoaB9#I=xe(5S!*I_lP67`VmG zy(JSvm1V0+_RdjN#O%hV!1FrlHnMvru;klxXA#yt>240t0pcWh)m<kGPg8>nkHW9T zJiO(kcm1$kat>L<gnn7qTM_K}g}wd%9=n-PlFFbWiDVKEPHPCv4s+YS_Pm~9WO7q4 zZK?xBItU1}2^BDBC?c((iYouMiBWUwik6z?q8*dva?f1d(og+lX-WHZdt^od35P}Q zA-A=65=aD8DLvga(a-rG`yZ*DPe(RJ602a&_Odmz>3OC2L<@C`J6i6~tC<ab?YR%P zob-8%Oye&*ho5oIgyWdg#jjZIf0l>i41)rZJnycMN8{yHQDzSCRobru|8RP+{7PvZ z6~o3qePq4DeW%{})Q(uDVo0pCx4$VW+(OIEVCq@$nKhKE;7g0_?WW4^!P)I!UfHqh zc3y30N%2kFMRwc&>gE-PEELM_AeHo{B(=ueM0bZI=G-v<%y!4bv!mkPq?neNaCk4Z zS+>OS9_2nKO@C+o+6Swug&~SO4z5<!SKoQ`F(Hl)D4*U-`T<r}TcPJMdn5ft`ud;f z@BQ+qODraW3^3lvm<<3`o#ppElxxk|?Q1=E7~jq9Oszsaa$oA`_`k<)DV2_aZ(ez5 zY4zQG<`?$vx*3v~SB!10X+a|j(hB_@0$j~E9tzs+4=*8c$5c<kVJp>+iy0_vG%5d@ z^B1;ye|5V$XDL%!<nCq;5vXx5^wd}Ro&LvP969s6r&PXrG)f0piI`+>drf!4^`S9H zO2@=?xVI2^gBn8R&5IgpRx$}HwPxednM(V({~wMaDwk@?yG77o9LXIYdz18Tdh6kl zfozH;=li(mnC@EX?psW+8v98fP=BG+*I0Y)sih`Qp0qIf-;K|slHQ~QY<xg7CpjGv zabk(1(^QGiY)j`z9|$VF{HOHQdxJ{0UU_a=f|lX&oRdO2x7;T`@~m-irFH6XGwUbG ztABw|iHxrpgGz8_<qtBbB%G}SZh%r>J_eOKqWXR!fB%z^)6<vZl6T+caA4N)Bqp5x zt-=ntAriaxPEqV7qsz&L_t1F+0fR?lw#SwxUo$*%Yr}~rK}Gml3KL81%W9%-jF^XH z0ZQQr1eHen0q(Q5Vwfz3Y2t$OR04ld(pmAqRoBaDV{|57)F#5WMQ_aXTI=+%#;u4$ z@6DxF_#fZxW?>v0Uq>U1fd(ef_qaLE!+f>J&W+ybB|$j|n6(|u)+wc6wonP8!S?#1 zQ~RTjAB$}4O~A9t0<Ks4IOG+0+%1YQx?Oebehs}XiH3@HIh*QyE{%YW?XJFeY>&I; z-gj!rByeL7b8vc4-4KaD1RXR!YdwC?5jjt0n=D`gRN4otu7%aU@I1PC<;ss$m;8^N zp2>ax^rlLtfDZkP3rLE(ay-sxYp(w2kE$x_OV_Shp}S_yD$TVk{<`!ZDj$Dhyma-Q zpn7uaRO2XNN;%K)g^>He`e0^JCtnE8AV>2E#ePQ(LAeA?;l??0oip1uhs88f2mml; zpEYO)QG<=Jdk(wJRn<4FSgEr@U3cl9RF(kVKq0@c{A8W?YS*~(`tYV|n3Ds{{xwvZ zhF6MDbkpDVAhDg=z{KR7b&flJENUj1M!L8^b-Ga2+^P6dp9Gcg94`0*;AcRxkdNe! z8AkGS{nGhlo!9D93FXa+=-LM-Y|c5_+)HSnbtvrS;{bxf&eD6X7H$qo&q@lra;K5q zr>Y<S-a>7?cO)()7jx&Vwwm6@fB*cCNA!+lrSt;~=;tGVup0m>u$4DFm#c32`0t-8 zoE-*u10o5OHg@t1__f@v=0)z~n!ft|X!>i704EF;0sBnc&CG)1YG|F)?V23zmvXZ3 z8J<Vh8tVVAzPpXl(UT_@*+=PJZ-DoWYXArqMFkx>9;daGa(>yzzqeFdeL1Q+GOPN! z%W9o3Kl<ZxCD&M~t-KUf3d^kYKDc$=nvegcv1HkDZB0$h<;%4<e7eSY^P#Xig&4$u zSmw9{8{5Qc3{^6U)_AQxms&=9jz{@l(OkB9vK(h4Wf5P_F#!$e^lP|ly!;RPAAf$> zJ-4S!4wONtG?0kN_O;*RXKI_0i<`@yQ)xfI&%zb@9X52coW`12?oZDf+iBP`)Cdcj z)W>DopRBpK!mT)mz?Z((JFBrb$T*G{%d~7Nf5xpxLqt>g-Tiy7T3AG;HZdq;5qRJz zifN8LXQ6gnZ{7WH)F46D2JX~0yq(VyfZGA^b6RpQxoT_8*_O_c-lGHV`w0#>*}~E& z2$lZz9vpBNGFk)Le<qELrvMPLB&gu>)N4C}D-7cXkpuslSE$qpLM6)gKM9yv>_d~3 zn<gIV&9|{X5Qcx?Nx$bwzZ(K^5_s?j*z}CL0+^Xg<gU|2X;^kIkKWrJQ<Cbx(=Be> zm5OI55|#==C2HDy6*id;j?4n4jFS)mdZ?(h@O6$p>rO`^iOED{@~L%^P8)nOa8aG3 z9Lh670nE`BW^p+0Md!d+@F}R4qTG%Qf0sqB7AmeWdHylAFf#|3-Tu_V32l(F({Kf_ z{g%oAhm3|vc<epfTwmLeT6ADVZ}geq91o9LTzG10^1ky)CtM$Qln3DI9vr+=?sBiP zw<(HT3fpf#tCl!SZ3+0wv6-+^;s7B4c%>}G;y#$w;oKLU{Q~(tXKwk7P^s?4<zrh{ zX@C61-+!mCtAG6>yr*zXUHhf%41C7fqnp=jfAYDOs+y*bmX@}bmX@Zbww9)rzP9>l zE9ZoGd|$`ZmmCz;A$uZd><*;ow+-<Cwv-KJ8*;Ew#*K7em(N{ImR$=$bk`}kb-;Hq zf21G7tPLx;d+5-X4eS1~Tzk2urq*(8jn7oHzWik6<!y&yrM02(>d>)uGUdF=D^vDF zQ+3~mO+#foa!sgXp|34$2AS4|9`r9b7}9|!^C$OI0V)k~fgup|<MSc7V7WgvU-?L$ zUBBS4stU*hYknZ_MaO_b81)Dp=zogIf!SEVOsAfO);}`Zrj^}xZ8dk>qcLgp1_UEJ z!PUY;W8GJa9Q2HC-Ac^M#^MlI2B8-mTHUnn)MsCtozqyi@y*%R8f<Sz50@pBj7;6R zHg9sDUeiy{pQbD77l^ZMopWAv^iS&q83lo01}@FZd8PdxHHYvA*Fxh1wpd;G$}!l# ztfO{Vz9KRpWoJ&ydF>tAS{Lm1hh!tdb4xGp-?m}ZC!cF8z2-n@c74?I7gwFPtX=)_ z-_(~ZTc)L<p{}B)yJOLwAZ!1Ix&gTz7L78|{WZ!)k>;1bU*WOUH95Zz+1Zzs>S}S} zU8FoJAG*@PHbHhk@i|-Lwfb7yj@pIS!CIw6$N@J12(s`+cMcnS+gL_tHuuqH50ysx z049_P$sQUT%B&d(dYqC9u{{h?2fZP@`0k;@ll!>-lNDz-AJ5M0;PMpoE-k;6$%gJG zl=NfzXV$VB7-T*6fzr<?X=9G<cax2x_Ke#ui$N=K?IEJIX0)rjF{1SDp(AtRb88y{ zKiEy^8KtLTv(LF~S+6r!TRKPjkWfkbo}iLndFKPl&m`$<s5BsMxLca!V-Q@qC!UQQ z_)!j(=E(s^c+B{z_xqnXz4cXoCefEHujk_*5P#?rjzcAh3@VA)Y;FarF#447U1!V0 zBoq_J>+9`^Elu^`bvk<MrIMujo?jnSf@rY4qU3AcaOV{_E3-VaDm`_aZ>~8RUP&qk z_>#fYj_1&>uD2M_I+&Rw%>LlBA{=9AY^x^|;AXTH!<?;PHq$^QVQ(uX%KpXuy}p&% zuFo3IS%!ri39aj?tm&z^bNFt6xm#tDYe7wrYkId=F0H>Uv8Nd3WcLeNVhg?Ur+NKn zm$r|ab;*n^pV0w_s17<{>tnR$@O6hxm(JU0UC-H@HqZsl$OffDDcGEwj;2?3?Y;Xj zt*{b@tZA&PtErU{s;;&jgQL@jMaote#$TB>Fe~Sb!ZyzEyS*}{Y=B?cQ+(Ig*z({e zr&EDxfraP-L`zF;L2G$H%7e?sd+%B~!YbhtdNfC<6xK9YCG5e+Iab}@dwT|%BJQ}R z;x8495(cL9bULU6_Wj_q!q+mLNN?%a6|i5{`=G{GR=_OY0V;tnq5kAnP<Ce1$*u$2 zMyHPmxue`6Vh0^vjl*W;CEWDgz1d;Wmuu9|njA|{?qPHRqJAoYfv(0+I_r|2)WKAU z*_vOue=tp-pkMaTwux!v^+wjIt+}`N@A0xQkH~6hZzUnhL-z-`+pP7<G)ra@IB(OM zx|X^IQX3jQOp0sF_jNG8Vzl>e_~dJv!E5js%rG^vvEcUpz32Aqx_Lh_uc!qHudk`C zM<JTY7!r>o%aQ;HtB6I@jH0kh#=CvZom2Cn%?%<pMVTDmBIV4ab`}L<DP;hcAHVz3 zZ7sX7OV;NDPpTb?+Ung<N*2myRq(E=;EUR}2ei(Hl#=1VH15l(Gyy7^AI>hBYRzoG z>D;5r#<Zr|u<K^l&YPT0Pu3K$kGISYrax~})H`tO;n_S8b%?9Uv$P(d^!KNM(r1rJ zUp|WbK&WJ{dN#WBNor&GB@3G)o1D(fiO-8SuF>$ca1MW71Iw?vV`J@QJXPW|+tNAG zZ@~c<1n-Wb{Y(a4L!}8hxD(i~SC!rsD*ZeIRC;{L^4e6W1l2a-vc>i2^5iQf!KW<} zQjyHo*HGzH)K-tegu3o|hDr*_0@8~+2Dowq2dd5B9H5ebhUtzq$iB7AJ@lN#xloH` zx7>F=&2AkegXTk$+fnG}vdhgvx!dcaY+3$pc4d&o9$!m~gk0Rf;On+gBAZe!TbTJ8 z?N7^9)`ro64qm~Th8U|G@qYUPo>*GMUUJJr(WzuQroin+yrpY$kZVLv;DxgOkQOnE znMW-3J7#p|9b1xm)xzTL-hHqNxNP1t=2UuwK!hAH_OdmJOmAZJj=dgcZ21gOsTu}H z!1f)4*;<Aa#+=SbJi5{K@`ek^X{bSthyw_638jHY_FS~KjLgLGCxL{S2+Dz*jLo^d zZ`VyTtK^(E-Vh)Hq<LL)b;QUr@S+plEf?+4S3BodKF~OZ2gJZ|QdizhJL@1*2UtZl zZ1SqotQ>G>wr!1w!>~I>DgC8qn_{eP%_LL*3#HV1Xn-`you&*bNx7-GoZF6I-z^h! za05#C2K6gp#(v#1-4|Y7A6HlR;JEF1C)=RJhDnYgxdSf9)xzCD$yqia%x*98KfK#x zCfSV+jq<sJV)-H>6JVxh9^Q5I&r6s5Zj07Rk6SO06#&rvnrUNaRhIm2v)1Y>H><nA zm*UWSlKTXjjiyiI;GT<qO~~**t>u{r1dlu~A%U1+0BF2g8EUg`pNICTl%&Q%u6Q<D zGYp7x+6(*-8_ggcu9TbB_8ih#YlX1x2{b~VaTHy*v+&=uFY!65odGpn9(X<{DSO|n zrPl%C5g?aX8sxb-(CsUKc%EN&@zwRakLj2OM%2@Lz#mD;11<5f28QP~O^@Cz@~a)j zPx2v6mn=Za1o)Y_!oWj@SFBAVpG~r6kaX^W(y2s*R^?tYTWSLK(SK?mE&cZFf0m0M z;!V^$tCXDfVGcO1g{kdH?pCw09uQDYFMb{P0k(}E)fDGpw)&#MM(>Q$z^uH>dsLw| z1k8=ks!M*iW97=@!9_t))nQg9m-kskX3xo%&XMLDDvb)hkqW<sw!eKisC2KoE3)@z zvQ#k#ccKgcC9qM0zt92qvr-2fpNYjhG)a~@;QS^!;2@j?9z6C)Beo&S^F-X4Qw8}L zHc{q)Qx28pqXwK}3d-CnDsN14#1K@%&KfEKf?j|Sii)*5s;>e5)3=H}8rqHO9hJ>; z>bfd#UK$S-R2J-+SXUp0&%I%*=C(^WEFL%1E5GL`9jJ6K_T9U3r>B;4MjDQ(BrTYL z26R6rWS<Ijv$nQBsedx-=wl*|H43nLdLH{1pLY$q;Cea8|7rz2o-XAA4OIBe%bM@p z5;Gm6>nr!e3K6i{>d<{4#|}kS5z`x*9=hvTA5e3<UrehRYZe`-axcC$P0MG5O7hRP z`;$wW@vZIIah@A4yXqZ?sP%6W@PP&{>b94TrqyD@bMeGf-mI6_Wl#W<>}9*m-EiHb zgf@{Z_^G*nuHn7VrtT-`3~!5V-iBsLxdid}+jIb^y-*flp}Xh$DkoSW999GJXJU`u z9@Z^;qH9G7K?vQA9Mkm{nfhI=AjMDs+N5`ul2|1+z)Qj<d)YyKk4R|aQl|1}=6?B` z>l%9N97%rOjly*#hT5(=XQ+QMwc{yMalQ_Pbw3WbTH&@!-(%`opq>K1?y03Qz3h0v zU_K3#9a%(u(jX5e6#-mKYkI^z{k<2q8V1G(1S89R3mGYm^06d4`|RO8y<KOw@4JzQ z1@Fn2q#pAn_lfi#HGP79RfX=GJyepp7Yo`rvS^rAQgu*(wa&gB`nLD$0$T)vw`&bJ zhU&U2ZeG+>pZ=O5DQ7H4ztwcHn<KQhXot}?oqdtHm9cnIQA8O%zCr$!SxR~5*`3Ze z%Nc2XY)0kTwz$I{ft44ZGP?%aDJ_ozEwqjr=$%i)#W7{2PUtnnP>XO2ea&U3R$6Do z6NR%&K?x%5>dva53mTS=Q>_^!of|8iU_~I5De*NkxVBq~rkLsOx~%1#mDa}PPt?2h zkqI3m(2mK`R8p>wjlTCT)1;gkt%rQ4VbyC$I!XhoPZ!@YUv3qwc|4)6=03jornSK} zqj%u*He-)nd+$|5`Q?WkQrB@*F}jd27h5_<npX#$d{t>ORC@0YxVu$^M;{I<y$S24 z=eRtdF07l+WOXK0<%YR=XP&v+Tu$IaJK)-6u}bd;Dk&B=@e7PYRCco{V$e1*!TD(G zbC|<y%NBxWs)1N^-9!7Y`hVBh=2LLC7U+SrPz*>(6E~nv-a>pm(=55Ahg3B5BJAdt zBaUlbuRO_&YDK?j#x$0s);zGi=el#rHV@4M=^)@3QnDO62#gd{O1%Si>RalXZ@*FQ z2A6h$s>7p5iu~Yyu16hRE!=|rYiQ+SKp>^E@zJU8-V(zl`d%v?A!SBX!fYX<8C%+0 zizjA0HM92CwLIyU;#G{ztHYvRq}D#1zU5O3%1%fYATKU!c_6cx3@{}mYU=LHOIju_ zx6N*s<aIWp>mNV09NXr7;xRV!MPpNAO?@rArVa^5b+>d44ophrASWps5LR~P26?Qp zv(Y}}8I}H|2h+%FX@o~UnbW56Q5L`}>#PVrckuFlhg%WP@=LMJh-OTEaVlaGf2v@% ziaoMA@T8PlKYg+Q*%MRASZJpo2N*3OzeT1&{s?mEFu<Au4ki@4NO_K9aR4D8sqW4V zx(M~%+4FHqbbEU>nN1p$2uEhuuai5M=wH-6lAcAOQwA%lZ+sQ*xbmQ9%<)IqjFQHt zhMKyuWC25MxYF_~8^WDd9=!beY;7HsETFMR(AwM(7iXdCxlXnXd!p>>o8is0)(*Uo z7S~=IeDP}R*B5fqvuZG{NPG{Xsw5%om}}q>=lI;4;l+<!J>yP$<YZ>QJ{uS2a>Vc0 z#fWl3@enXLN%r$4_Yb7$llAK@C6*PEi6lSAFyuS41hjIbuU?3q&Q7P>7XBsqgc-D^ z363ITDfD50Kx>OlvRQpeSDAELAnA<sK5Z$0*_*-4rn85$&<-8PhxrH?3jN@MPu$51 zIT^E+^3$-R#{!O?k11|UMN~iY-4}hs<ytW@iY|p9ZEq3MXZ^!{x=tP$XOaY{K|m^@ zk2VKX2H5UV+q+Wd<ms5qXl!%Y+Y6gO2}S$RNr}c5S9L8<OtxlV`>*OaJ<e-LMIvL| zk9Zw)xb<jqA7vKrU}kFD(6EBu9rldQjKkM8;WJ-kgt<Cic6RiAls=91K)`A${2lh5 zHQaGMI3ceH+g#Hu+iB?M5OC3P<E?Dlq-Jt=!C-Bq=iw`J=W~3R%khAdZcmzDB-Exn zv{>u4ZneXlZ0Q{7JwT<=4-b{PK&Uh!R_VPu;AWRBpdXEV==9jb`cPoO>CB<pUJ-*! zVYWq=q$z_+^WlI~QZCowX*8bQ4b7qwaak}+rRg7)5O{KcfzEhpzRhd<?(>O_4=F(J z*pxsqt(ii~yUXqct(jtQIx`~eLEwT9hS_OvT&MZxWg1JCsjb_v#^k^rBd0^l^e-Da zB;_bKn$QN<p31;$%k}O5Zhrg`Dx5BbrmDj|K&?;pU00nQ?n~@rqnhYcdHcEe;dgGy zewStXH}=}VD&$EcjbXd3<8wRc{o)R8&Xq#<?VH!H`uH>TMN8G!ZCqn|aQc={Ot@zP zCEP2ofSH&;2l%199A*OE*)k~?$76#t^^pu*_K6F+8lVB#>+}3_4ia57o;>g`%QaOs zG_};V)K%10LkU7n6%vF_qS3+DqC)reo?rfX<+4A2zRg14ztH<#Qcy|;+e!<r>RsLW zKVPj@`9e)gb-DW5sr;#sCDokRBdhq_HrfEt!$v7fLHYWL&?CT?aqTQ*N*k}NK5-Z- zmQY2Hy*`Ipi;Bkj{-@8jTIk&<zBV}p<@Eh>I=oE(ijiYVZU<{nN)xu-uM4v|xM7{v zpCSIMt1n+BPeB>q9@8{PX$WnKusQUV!r8C(*d9wjKSt6B6(KcuZ4Z9AZi?&zEN^7O z`<`PlLDzO{-ShEhx{KA-v^BJ}maN*cYlF+<Q!#Kfv#7n{?)7b3ptDQH&aT{I@TJSc z6Orhe9-d;h?s=E{8y3GWO`ob?7EiNhusoAxO&=T!0j5g^QyWuGo?WS7q@us~+RR#W z%k27#lHNg%w2LE4jw(yNIPsbtUl`u8x{_Fngw>S7%=W;HW@^<8qv*&o{cFZf5ihzk zP`F^99b1iOE#*~uMqhp%dnTj+R}fVD<l+vqGi&#UJwifGUWoC6E&%Ia9el)E^Niuv zsAv?U9g13GanO0S0S^8)TI<$n$~vSqn{v6M{b)hDXP*0xO_Qw|s0CN|I3^c%&<Hfd z^Bdc}cmB_&$$gYtyyTo#=FlX)TmF|Xwpr}-D>(fyJN(pEzrBCmx^}4&>tPG4K!n1J z&h1;Rz3ihuE&W1Ob%mCu=5jUpPD7XQJ5_`Rfm95P4tKmL_S!aAKFjna{KR8)T`yNK zOyJhvD-WD1@weL2InaBHRr-JqxPVGR_(Z5AV2Wz}i{mfr2bUW@Wj8`$-9JLBN>fu% z3YjBy{>2HhE8~a8SCvwbMPY^)QuS{(6;sBb(pytdo|}+@vaS_bRFD|y>EwI<#HAEe zC|c6Wk}!ry3|v%EiogDeM_-*Uh_9VzsML*Z^|p01TB5R9SAErLJ=I0WcH2COX&oSd zGYr8C68wpe(xM_tNVYqs@fmF20Z-f0VU?YwB7pVA;EpHDw>6kjNMW!~ZghBWlF%<+ zv`lr$(zRQ+T6kP^z8QY#SnRD^rS(0mY0~g_(y$pZ)@S@ouEmrQD@SBY&_WtOh{2}c zwm9|J*sJ_S4{N-#)h}qttw)ECC;DAa!=h80o06`0KK1Y}gA>IfU>NAnAZEB7Fxk9h zk&5aPmAABfN*Rad=9DW}pac9Mzw<?}5;#F#WQM`+Oii)X_t;=$bFJLFte?$!U6NwS z8Z~t_4RuYmS*f>ZfI!W3PIX_rXYHpN8!hy&SKWH2!Y0st()OphtC(z7U#z08s-mid zKT~?-;r#;MEf7LYYwB0d|JP6C&t9gJX>u`~0r?i?kvDz+Ok<;|{<R|SDcQQG?bnzb z%j<}Ifov-{qej+#6^Q@K)RwD4rAzEwVmlK$01+QO)F3PCp>WpTCALde*aXc*h1|0@ zm?FE|7Ps;%*-hP)XNk@xZYnC9)zz1(sV!4kq`SjrZ%}<;laK`vM|zUd59~dyqO$4D zS!?4UgkL>Cn;`|lJjs2W-kYXR(XWeM#fTX!&$NY)WW{H?XQMUSzSw!g)VrdvM<j;K zLo+xs@7PX}j$wf1)o1XQG<0+FRnPdDTQ&VCia2yM{&qkfn%zVoKTDXCly}-1hc?|U zr}7&fk}`bEPChocTJ?g&9v{Bo7_XsL#`+lgoZR~$shNV42l$Hy090VTysQU^y3{o_ zHPkd!7praBv-ouKzGQMcLs`U?m<7<Ebt|=IM`L{bs*wz!UqB{h9!#HBQ$UM1I7RP1 z)!JgcGZ5vO+EN|qnD3!#zEzp^xRHTv&B4}(_#H5|($H8BHW_TQnrx?`agg=x`Z~r~ z;FY+)^PTu?HKs4a@{x=hAFFe-rL(8s0#x!VYY(OTOneQM_<bVyjl!7o8-q*qq6Zts zR+R=P7B(r97d8<xMi4g&V!<m*^<vodEb!;UlD>q7yfD4fi5ssr7LepM;FJ|M`3@>< z!kJRo#L(Dur{S(W4u@@TBwl^iTGT$&#gWkY62?Fe1N*Qr(f_L>57wN?ds5RizYaJ7 zkJp81ZGt0^^|kf&NCX_;jG^`N#C)if5KA~+soJR|qywaQbduMO-RIZXK77(dr6|n! zCzN2Et~{q=X+s1YUXMhgI|;ZRD!z?I>>1=JZvzx0A>#GZFdf8}ZaPcAmdf)&i2y#0 z$0VZLX)RqWmS99W4=w4%xAl>rdXG>=&#o?zGc2}13MDrmVG5ZYxRypZ_=C5$d~$J6 z26%uU#y`vNJjmvc$h351M8IHTP=tmiOgF2GH6nRa=oDUGBd1v{8cRn6qJA8s6W&r^ zUDMEl>SlK<+-<hya-sV$S{WUPmc|-5R1X%Rj6YL*1oCQB)}v|46~B4nTxF`zIK>jn zVu|v;4|FNX);(Rn<Z@(jp!S2$<cWtUB+MB95jEflfy(9LXnZ<fDwPh87mJ;AR$eZ5 zc$7z(B0Cfu)r0QoXN_<LLPj61r2_$#+J#Dhf|sE%&14RV2X;&d2>SYQ&Fz!V4iP!> z;<fKr?ql>GHGQgn4Gzs<d1fl7Ee5SL6FW<-VGTf9JaJ?yN~ej4?qagJ4BjkSHKTUW ziKGGW8T`3Qxe3!u;gQ(FQ4Uqe=x%AJp}N?tH~wR=EgTWZho<iKW=bDdIQD{<j+NcT zqCh^6^#>{$+t>{6=)?92`C?^*2K<$nDVWZh5!oCuARZM8nK<UOnlfhbCXKz?MsyRA zOJMMZdcnCk0*zE^J(#><5GqiJxMoakO~dOp%Xb<QIh^q}OU3WZ=hylo(`C+7iT~F- z;DGscz&&lIWeogG|K>lEm$F055#ti;iy}`ZHlHcv<GDXcUV#T+p<M0{vU0g2+!0)2 z9du>OnIZuW%IiHM87jxuKRX>(elnI&$NW|fm6Vjr{q9HbkeACPPAHeVbGPXZ14Glp z7mg*ghqp?5xY7ybax<$7BVGK`4+K?bH4!_h%+C1?>z*Hy4z>Y>$4mUoSK8lSaiJ!! zYv`8`vISb81^Ttof~GIf0?nSLgGwC~QrCYARO%Id58@>LKgXfc_b*4p92S?2XGz<* zuQ=cSECEr`t5<?iX&;GAA#(b}FWE2uBYFj038EzykBuK31+V0O_aDer_pOL4;I%Qt z_<?U(z`sTysPwZC09Z^ajowQd{<c^86Zcy=P6CgY0)Rg>M8~vuz>yd@3R8_lS2Z@* zU^*Kq{5H0fDS)6-KVQP&@EHA60<pUq-BX69pot((Vsug|sq>XAV4jFitiuOrKXFyF z_RBw-17P0Y=F0_IpauHBqt}{lv!Lk<v_Nm8=^Su!sMPbG9B@C)s{>AkkbaiPFwF?` z;XflU$DMJqV`R!V5O{j|v*I_hD`m&T%SL|q_s9=pcNYKiC-4yc^GDJ5a-8&v|J{%L zZ-3-}^8<J&?0_5j20U0IDN6|9BqmSP#}oB(MZIi3c#!(p#J+(}3cZs;{<T3R9<>D> zZk8Qj5mM9^-wiN+VT#iQTA&5`Rnmf{FVF(bp8gM@(vR~Ut27Rk{v!iPKaa@QmS%=Z zGH3-|KM5F3`Ubq)4?l~4__tUAD*a0&TT<eG`$~4q1eFE_qy57p%wcgKS486oWl)I= zLZxn6e<yVuD*c)qa1tSxOGPtDXv!eJPXH)&f-lelEzo~EEok}zEzs;~hFGQfcfh?G zgG%%4fP1}|G!B*K?K8BVB!^1iA;(GI|4RrS@<1gyRQl#6ANXMy!b#tQAW4>j@*B1o z#7O{4D1%CTIaCtThWJz#k329$WU#t^tx#!!7HEMMXn_`JfhN*#0V+)kdd8NNlz$#u zSeo&(%=`9lMemyoEqym0tE32(xTD`qfJ)MFs3aMON&+ftnB4ywD)s#e9dHY@Knt`$ z3$#EBG?9KY4!92hmHs^gRN_hh$%R&x7NF7sEztX+nYNUFz&5<zfL#rTS64MOVeq{? z+VD)9{68rD8o0DT3-p_#_Xd>!(f8kq|M}g>58uCUsPz8;00960?0pGb6Ir%?&-9y_ zo_RCVcDI5cJ1Fi;tGEDyfMMS^w^m$01VIrMao<bC6;yU)-xpcKzJ)*%l8_J}Kp-T9 zkOT;+?$_@>?>{{=zgLw+mMj=-r(1pbCez)&s-o__=bU@)S9MO^^NR)G;NSR<KS>7Q zz`u>nP^BMO$^e`aO8h$@cca2z5VN-RTk_3f)vv!?XJWT6sx7Jm6mGWk0pLTBk`hXM za`^WI;6zmEdl6OQ3#rm4kgN1DQzgL!I61^&^x|>7IQ$TUGcoz^c-EZL3Z22>^C2%i z#rU9~aeo=fe5!a~?=Te6!kqFKij?S4y!F|mU@*D-Dada5^jZCRvk~7=D>pSb$8X1` zHOoKya_LuJE!tpeyZ?itO8-77{qj)6x;{pqqr^vu8LCt+q)K?XRH=_S+`nL|^usSf zm6QRvw}U?<7|F($J@otT;dg%7rTC$df5)@t>{d?XmJ(TPkPUK*$;jttKiFs7Uq&*Y zD&E&S3`Mjsr>LqTg`X8~efB7dkz_Up90A$6#L|Z+;Qr*6;+doHYTGr4j*qvrJ+sF4 z$d$yidCghn)hHCYqwhls!2SEA^vgpL>-rddjuIasW&&_?sgiU6u5ZBsI5AaH<|=&v zR0(8&tUN;5lYk>njs)bD5#U;8?;m`+U?i7NE^H;RpsaI@12RE&0wx=<F$GL*;<K^h zib5X{ri6VKOD4CRKvz<w1%OWzFyo+w+4^Vdcedro)dB-#r*sqm?lyppYhtdD1iYX3 zC9_9io0#1JQKboRyogfq<kV59KLuq3=*Tz-)^=6i4qRg4ve@Tl@gVZOH2wZDS4!=) zkC`edU|k=h&r#wd#HT=&lmR%!FgiXuMC}>sp^lEqs;>ARAmD?1);OC^?WOnhjg7(s z8U}gkgkr$e2C((WD(n6LcW;>hr&zpEI<<%1OJ%Xgm9Og;0s$T5ro9LK&axa>3p|-x zfUGvBrvlh(2iUqKyickmF^V2hO}cTAN2gKg-PAGRe1R6+qOQUl->Dt2*17Tw&BDKz zrr$qiOG!*9KUS)wh;@CGK1Yd<55IZ<PPB8kGFR#6Qziba@|L0kpF-5P)S$cDDfAHz zlgne#Xe`<QgU1<Q5BCsSx^d`%!Lf0!xau<W5AOIFy}z}qr<FR$o`h>QgRDswrK`26 zr4m_NRaI48heWnCp}V?A##u6IHS@tK_QV*IHo%1L%N2lpPA3m_yCmX})pnmPrWbF< zWEEkt4c!c~REbk?lFJ|Nq?4LZjkT4?Dq;7bwouJzO3%pnsI<G6m&YJk!gheo9wc=! z@Ez0va&s>M*(@x|2>lvcF@!<h5D%Q<bNC$Q-~h9q#vU6NmD`-;^9BdoQ60$2hU%(W zlI+2B(OGO+<u)brT?9hmuqG6jp19{UGI>}|Z@EL`LUO?8PD#tEN+hcZHq;wFlgH}o z>gvT|iDXO@0fnrusj6?q5QjPatg*pPG^M$su?AU(!VqY}dkRF_AAx#HR#ex*F0+X| z)UDT&`ejiVlT!;T<2qwG{j{;M32;u)Q>ZJo4Ry#IR6$tW9Y5n;VdfsMvN7<RC+Hf! zObN3l;dcpq#yD$W9(mFyh2t6{j?WoIb}_EKsk;x~&!qH@4AI#TX_{bTm^C+ZL%l2( zS+7&~34E3s)6xDKLqWBXNa)5MLK|g>LlbZ0D4It@{b(Geh1f&q(D~qm#DHa5`y352 zc&x#<Sb|t<Z)UxulrEZkBxhr24C%QuU+c5y+Qge#0GBC+E13!l24ksX{amPFzF>TC zsJ&(StgxJL+naL2qx?}y7h0ZPnB%kUv$d*GXd=j}s>W6<afk;=OqO0`dXJysbCgg* zVSEZyNg)FCO9kLqzghqeazTx>y1UoxcUY*XtklrZ(AL({($ZdIre$;2{c>h)dum(j zt8<|#p`l5wt+CA&k5BHte%LxL4KqN3TswRR=pTgs_Pm%qSMFLpPH$!4;03FWUVHtr z^>)**RaPuhQ`0b1Sz^B3_VTUjzB*{3l;{GSTTo1@jy)d~cRIYNaj>_0pt$(lj?j&N z)cx|$pZ)IZMPDt_-)6NVtRVC?o5Yy2_)alM?2^!eu$`7hE52E}Oha>-rsgV@r4~Ev zuHLPrHu6Eqx9IZn7(~abUWNq52c1rAZb?L;Q$xZFj~|MRxnTUjU&Z)ajU}p@Dyr(= zT6z1YbZ1foyrIg0`k0HsF+t}`syf+1Q4EfBr6jqUA6>k7qsB5dZEa0hlI9{w*0sGt zH^-j|dKnl}SS8V}s6S_4SCV)<_;B4|?e$9wkX|9FHu3!V{G&2@>*=3NOzQ)gu&PPi zQdzRHzkauBsAXbmidEj*5FLIoa=%wVn8&yNma1#@)Yk3sI8}g+u0f}rvAbomXtU0e zRpuVPNyOA%kPe$3M2xEkYOjYY*jv~(#+ansl925o8~>;S>vs{X-|f~rE>?z@4vmgB za9V&{PCG4B78`1)sA+CmqI%rI{Z%T7(GS1MlW93I=Yt?Elva@;=|SevJOtUZ17y#t zD>bz=wA6Lf|DvL?;&c5I>kj3l;W@%<>V{-U`0A}1dK3KYP}*0Qa8a&2Nf`qm8=M@c z<d&bE9>q6{zFuOueVf&VF!wugUOq`zZseeub@<K~QTCg?e)l`I&;Ib6&;Ih|lEo@( zx2qz;wz`}<<FGNp-|>1TE}jGqa7FWoM8l-USs%P+dMYB9m^%s%&t;l&t$jv=CB1bC zVHf0D!W*q|XU%#EDfzEEl$qW!Bu#VQKG$Fp28nNgDVhaKpjn`ys<CY8lCL(HIP81Y z5z_^7z~S-Uloa>5XH6aVMU!F);N(ODtMU33TX}k^=x>O+1lgx|V3_CT0EF7+Rhp{m znyRX5-|q49PorcELHFnLDY+FhdXeKjeumFcLJ7t3DFom?D5~^p<tk0Fy4kh2ORn0v zu34?~M@?;Y9UW~oJ@r3)vsCxD>L->v0|k{pMHyge0a)w-N@`=Oif``I-m^#N(A5%r z37p^n!Y{7D!j9rQ2Q-h_>0f!-)Y%614K&Br+&<!Kx@C)|_DX#{J>3=BOV)k6<Iui` zHILgSC}VRwG3)CaQ@a;=ot>TZlA`m*=M<t!WOm89!i%QXJJ&4L($h82H_$fF{p<4e zTlP9VYrIPUd$|I6ZO!@8M|3;`K$rsNmOx1vP+of3#_W`lj+?*N+LH$~HgD8XTe3v+ zPruP$xqic$@_=k=4>1Op2WK{zSjT3z4bnmS7(1mU-S6C%Z_R(NW~ipEsja3fA<0s} z(j3@@c$p#5uCPBQ)-N-0y+dFxqcNuH_L1WXN)JxRjcdyYb=Y|l>g@^dxxF=9vmv;^ zuMott;Yz2Rvhy-zwe^7G^Y#b0!BJu&Irp^dE^i|>bJty~Jxms_UGiJq70b5<N4Z^3 z2;XNBy!Ai7{ra~W25Z)yD)cLy!m_8p3DQ{oi^|(ajw#q%8B__<?^gyp_84Ew56Ng~ z%fD84+tG8~8l69>>nvNgOm+F!zumreV~}rdTM7@POTJ~9B|V#%Ok5uwBr}_Cm0h)W z6Wg=4Hl&4R5D74ZNWglZj7;(X1MFo=NmvK!^Ufpt9=Ald^e~CB*qn1tCIPbKxpqTv zk$>?dae~94=9h==I4ic&#f!dCHQcrd5poC-9A;#6$=2n`>z)b>CFZHa7Oy{kq4ve1 z|M-iF>QYtBHQUv!FBv%oo;Uq#xYKg08>NR!Ks?N3q5ngZ>gpjKOUq^7g{R^QAzCqa zymGC5MuYLBoO8}5@+<+;ngGidfD;|u`Wq$J>|G_LG(T0EZ?4@Vf>hWQ_3@cWO{u<T zw`?+lX2DV|b<JgJDqpYP<#6ByHVQLF=}pCE`JUf8=j;YE+XJzvr;T)cX<P$v#BbMJ zTbj{JJTCW)Gi0CYW-g{H-7U1%t=3tlDjc1`>h;HSe6u(h9($xOzidV?a=gdS@Ht8- zp*TJTs`Nnx;6zl3@rwuG2GI=(Hk$$s^&E~x9eRdID@CDebJ`2f$KLkaW^!e>6HrzO zRF(sFHh_&wd~ru_2dOye@bYU;Yl4%TA9jJg&}u)~19shSN(x?S4;UOyspzj6>?(+{ z54&b^>1k#~7M0RW>LRz-^i)R_zP!Bm(9;7Ur4^lwvDuDz*4H;y&WSm=Av)MI)_%7v z;?SPAy$lyj@+KMG%w8OUfJ1i>u*9y;#u92`K<aJZ^`WUdo)B87bL)A^`_e~rJO^;x z1K8LD<yH5P1t;B>FEjdTwcY9H&}>Xjbz5s`3g(Gd)M+POhlq84$>sHt4P}6%HDK); zUr3^mhRaH>Z;#x+&gaYvzenvEC8*ZgoHl7mS_69=<8vh174`?=9#!01iJ=rm*@s<M zTzXSOf{}Dg@)1v6H5t7PcF?uGwKAYQyK|Ha3MNK-S-m)-gskqISbrhc^ieel7u%l| zyid>ANY(N1-ONWt`8CmpV*QL)8Cs}p@%MRH5R;!>|773G(~kOfch{WGFQV6z$@$Oi zE-aw8BCX8{z=hw8$t&q>X&Y^+Lq3k)vpjh93ddv7hoi6=mF<oBiA86vFCVrx3{5mo z>}sR&<Y^P({=B%i4%ZzU<G3=&5Wd5qXYC?;ZYvCnyW?-X>$2tkm&JWZtUL+FT-)mt z>l6G6)e_y9d&0v&miC46ToqWE(*?=1o7Z-yRAi;QF5QePENd_CXnT|$cNt-R1+t1f zJVbnn^t#*m*AH24J7Q!Wek(4!5QC}cprLCk>9O9~*PQiFC$D+b-829VW&rGd)RY{& z#_5XQfs}02pmf+ruC<FbSVO|a_h<VaFi@A(b4OiRYlTI06s0RB-q8?}l7pm_<_o~h zJJ-^UqY0SNQE;%d{?e8Q-fMhLKR^BuonBPmR9{_Fg=|EliK9#`wxs03mPdQn_?($O zTT@e2-PBe`<}^3e<vy{xaNSg%UXoEQPaAU1xapf1so4A6NQ$U#D{4Tul%!yuc|{$y z)HOJ%Yn}M4gATbR7Uphw#395y-s5NZ93_-c9KTus?(br%1P9>$@d@QB{aRFsSW|yW zXT9y>&BvlTVi}<D6@W0ovl7_r0601VmCyoT0XW$McAn`4BtbtLM|!$GJ!HAt{gT5) zAf63^>`p;ZKv~4Wbr-XYUbYZNi<mX{&!{*#{^x<P*rFs_Z(~<C1%vFXzm{?T__kI4 zTTC7&G*kO#2UGYokdfG)1Gqx8!|hcLhBXFtgr7|+1H7O<c;{5~Nak$J#T3YAF}lg! zxDEo5LToDTPw|Pn?DnP0-KD20ONq=m*UoOsH8H3C&5|HGo(s6z0`|^8MGa6@5a6*w z%}8_S{-?wj10u<=Kx!m5#((v$i&{27P6bd^dC$oKaPW#P?LoH_lOFBXI<;|~Z#?cH z9c0Ouq^<A^BguBH0ekPq<&>2AhR74DF3$gX;G%-kgQyZK6Z`6@x1I{r+kFzfjrCn^ z9HMR?8;>3of4#_OF(qZ?`K8+<jeyj~=IHL+(0%%r#w$*Sm#}J}6@vP_>xt*aB}RYN zIUewOq!v2T{gf1cVy$VImP<qy`Bh`%L#VediuYCo!7#|nAeI51uzvF@dPPT@Y1J1` z>u6Xn-hM2K5H}(U@AiSU$BS<6(X_s-dAPW!gCRqkBI$WPDeuZ?XujsJuW9$qj^ojU zIrc0}Sa$S!RNf_D!V!Mk)}G$J^Kwo(@VY3_%}|#1Me=lrk8dC0z|o#JR=PK@qEFPN z3`!y3X#*f!Q?fB*WAGrdyDH&p9K3VNd!{8Z2=+cirJPyodVj@{veGU-IN2pAJyIIs zx*{ZXZ6pQNH<uK?#o9$0OmA#{*`4QqaK%y?mJoAdwMm$k^MfoBblLTj@})FyTDQ#B z-M@5=Sa!O&winIBzI<e>=eu)@e-b`=5S$Z!6;OwopF|>bj_=swpD1w_n%~tu6}L|< zc65;T8)Cg&g7i{cc)?}4)h+|yONIUAVhTP6GGE}I`E2>KwW@0H`EqJAG!}jir5x~{ z$9w!-pQD5l3PF-8iMF65lL*}(4^?`%0GuMhxQ{3RheeV1TZG%0U5TmbC5pcc5`H#Z zc+cGqaF|V%+*9)iyb(S{Q0h~D-)VVp(&|VmiVg~fh&}h+GtWB*W}vQPm<&b%H8;>t zUuVT<zgJV$T)Jwdp5e-s%e7bO{dwt^s=xW%eCdkox9YmvL1>+M0|~c<WsO44os%m1 zblKKDr2x;6N_m+E<l>u#8}8k7+O<bbbDf@nzMiJx(m$xG>wdm6Q14h?CVqI%cYBIZ zB`2T)c@J53)!D+=%Ifxu>OO*4GIVe_4wHGw8gbLi0Vu76g#$^((L1V)TGE0^xU|Oo zg#PjSWu#J2v<%3Wq-?5W3)s0vRy4n;D?NL7x&Erpey_d&=_R*kU2r!&YGHNzxnys{ ztgXV0U6M1fW5N{?HPQgwl91IhgU?r=UE%YhwEkgp=?%BtXAsuUl3G~<AV)BggijB( z-5Idm>PZYrc!ZgV&$?s-Nx(UxwCVYRdn@kqpn&xXn-93z0=6D$1q2Qc<bhK;#KOz_ zO^zeXZ^hL15yeaOAUN=}<;96T`p33zx*yfhLlkGo&C;ewYc3HL^^dEnZh4sd+3vnA zx`U)W&oALc>c9C98x8${Cxy3?kvDBE{SY#=56SbAu}e}0W`qrnf}AwiO5stY7ZABT zXrP=Fd>-Kb#**P{xM_H(bz7k&cT8I{#NdkvW%qqngt)GMmWCb2jbm}o)~AISx<!=w z6oCW=C<`KM2PCb1MuU%<%dWcZhV53$5`=c^1eCy1x-DBuZ`mwBUhDdwuMSypB(}6A zuC*rOklhIvyPL7~efT+F8nQrcKB4%g58}9!%(MLb&a8lAy4o`Q#*AKWCL{0IT7=jl z9w#@`dZwuoh$NTX@YgW6U3&0b204$z<Bz11iU3br`QGDa`5YybP!yj+0PYv3N<Z=b z>+iCu68~4DN~m_4h5IXGk5`3wIJN;lNKMkf;aQ|%dVzO)m5YO(y@tW==jhanoA*E1 z5L{SIW3UEV3j+5>9sTY_Lr*z}KRKL5O7lCoX^rmZU+bu8XzT0f=<4X`Xlv{0XzLj1 zY96)mjE%t#;H4M58Mieu3XXuIudum*n+<d%X@*$L0puq+lSAmin)`V-yu7|$xBAOv zy34e+b(ZOBeWj|s=5sy2O$XA_a6@zcmj7mS5_g98VoAn8i#N2OItgh_CE(};*n4Ka z#t(@@NYFJSub^u@>;Pw{8S3M>_eptQW)nI-L_6rX=8gCU3R*;!q$LSaD+j>NEh$fa zyVXTO-doohEI@h#P%CXvD|UdbXJ)Z<Z*2g3*Z6`qGHo2+Umsa`!^>MjRyu1xHwfP9 z4HQ=c$jW<8&VapFMiHLHg|sl13K1Gldq@uH;v<|?9CSn|0qA0=w_XeCt+W>0Qy{xy zgG>Pv-qps*4nTP4ye81a)+iVP$FuM$;rqV!u~0vEw~AB?3Rtu6Bce)nfIUP;%Yce< zz|I-4@y>cp7~+cVFiXOY^GjHFyRObjN4MJ<Rrk`6fVDH=D5d>&p*-!NxgcSs&?vAF zc@iGU0o)`kS#)GJHHWAnNbYS)j$G{$y87tj#;$~}#)PA*AG@pxO>T}PgS|Y7mm2e0 zyMzX1*=@VXZXE$+xqK<*!Tpp)l@x0o3FkFh+W~vrb6(@$Xi$X7esJg|Iuo!%0G85c z`9mNh6_@I_U#8!X(u;#<Y7uU5bcQNnx|^Qd);Bq->Kd9rd`0APh^a(qyteYa$2<BQ zC6rhgJ_V}u3kKkRdJ}+yf7~DbzhnT8|HH`SuM>c)Yadwdo}}TCl#Uw^zkQKMm0Xi^ zF~cm_JK=h2)2}#O4EDZSG+0(PSaQ`n{F3wieDqK^$c7v)E;G#4>a_9h8xNB6%Q21B z4Yjq^H9|Di)^wmT{rzL(oH@Bl^4*plVB_&BA48L|wV;3ra>~htH^R-WJvO=?xt4q_ zzcsH4g{sMGFTI)=amswxMJxBDYze17y+}*kd1??GO~n<$w7|*n4ON0@jr*)?;C?2x z&!$uFK$V;UJLz_d?m_K}ma)pxYmPP{X1i}hDlWY@w8KVbZ*2hwmq%p{ubOM_pSQC0 z+~|5#QdYs{yKmUI0OiOxWX?S$A17S+*{~MiHx2G7dEz4}*gU}9P8d>rhu%tS!80`< zrr__FDrFRROcMo#C0yH5TTj8FTgQ4{))xTI@H+`9dFBeqgalQZ8HM6h3C3_oS<!cf zk)C>C<>^7`<w5$MVTRvDmUR>fzm-^swM%PIw%t0;FC}5<&`z2vy`}ZjQ0unN@NLV> z0K_{`rO5$sD4{(w%tfZ(n9)m&NG~>S$$1zWQ`|!#Rcd^4Ti5vLVwaEvLb8Y|72NZ% zm+w8^&F3hg!~*dP<|_TaPas$6ZB*&k%T=mJb+5O$tFs$;-qb%JJ|-`0l$6^xDBP2V zKSHQ4Id~$@+cUBL?%nzX53d(~2a0M5W0R1(naITDU-jM<XlwmA4a1=;(g|5^OE8** z$-LxZ9A;%5mx-avxDS6oz>I5+^R-@VW~6cAaw)w*?0YA`vG~rM^A6UR&0LeRB%TiW z10W-zEhF4%=LJhdYzBrdUX!M1V9(>`q%#P_jor>b84^Iw8!VemBE<nXtS|s);2Tj! zDw7Vt38_^@$xVB+@I8pwOquPvJSeSyTvdI?-6F`r`f>U@NKa-+QP?`N3MkJyWx3P> zlGPPSS%o>+-m(-Xo+GE<AWAIr63dA=;Pq(1y`8Ov%uCLYer*ymaqJOr92Deq{@eiE zqpGUA?&cx(7LQY!X;d-UTBw9ap)umJrO3_vRtk-xV{8Ntz@-vq0&s7kO58p)DSAi7 zMRnhMClDv@A=EGW?ugDn_mO10hnwHpr8FqdZs(U$Vlcug+|(^ude*$H^_!N?k)?Gn zYHK47+WWiO--@fB4*!WD3c%g+LHIh!ILici865>zymtl2_Zy>v(PT(3ko;}tgfgLj zmy^qH_^q(9)jf7Oi&8Sio*aHf$hzceGLQFA+~-V!Qw+{9mDJjWZ|kG6$E810P(lfL z_!OwpuaT?t!3E%OHP}Ns`w$w3ZWi`di=Xr6OGXyuNKa7Fq=>ymr;P4g-?#tTO{0JU zPk`LoJ0*O=t09($1!`;BE-^U~)0M<lU}t0*c>_$49gj%}aZvX)S^Y2;H`*ipSMcY) z&s$T^BDS72v5L<kPP|!N=wQvsk}Fn*#=$zCsmYi@*4(e{1k6};{25!-qdN`n$6!XN zqT^HjV7YH$xRt)?c>^~fzY3_SxaX`GRT8IlcP2fu)Cu}_!-)jk6S`<Wrx{5)ISR>2 zb{InAxQXHYSjl!R^^HUI_dU;}WH!Sox4QOAO#I(Ldh)1}Biz-pqHxO{=XOcU>MFv} z?EG?9ARh@-R{+k6P^C9%)b-8R{TI~R*;+^lv4{2hC>A%~4<BtA`Z;OcUXS6F?dAu* z`nK*G$L|#ORf{j`2P+mN;Sm8V8JjIfp7N}8&Er`71pKfumC++k>wY^`0=ZO>c&{ni zX1|dZ^gkn;=>7KyO;kym1Y>?{m)4-XPY2#2rQHTQgJjH_x6HLYh9+nA_a<bMnlSjd zd-lsum>2~n;a?7db9Rb=)4HEV+UOlOHVTkF3)b}@&j;yf*~s-9uwF1ZfQv0)w>PJ} zXF3Iu1r9yJ#UEX}@tC^F!zYdOevl;?O~B6YJr>||m>}nMXW^qztMFqEQLoT_9n!gX zN+=-*3k|@{P^Awi0H>r%5NIv!iDqu0D=iOSjt?n7XIHhLs&m_l!s6}*n3`Qj2w&+} z%=*NgA#$KhBCqs#-F2e?>pf<+p~m+b0;_o>_>I#9D4@{VpC#BX4-|ch{Io6YbwhJQ zbzKdzy0#J7L_&2A)47v#-fYkQfZr)G8^d6MJdj^W%DNS}(!oyGGw5mJvyP6+ZYE`z z&ztt3Qw)$@LMV$o;SucSbn)S<+~T&DsupxzVNz9u{Y{^pDq91z-BTc^KQi0t3z#6c ztTX3s$VM;MRX%5)r#)$Jecgg?C`zh^|H?$gD8#@8UUI6+0ehJr_6s)@u(kurE5wo! zZ5BYLmz0KYjBsD!6&!u&QF~g+%xCI5&97RyKPhWUZmN73yk)<;bi0R*Rg8l5_QhrO zH4wUEW2ZlNU#Rq?w?D`h_SPPH;!mh+j5@wI#KY<0BS~3FjoK+G2lM7RI~#C<^^%l5 z_lS&-^A+jsv=(^fgsfWuuztOQo}@e{qZ`<$2IS-C@4i_;bTPFC+m-s#%J!_G_2J8j zA%$%@wQWtWlWHC)CgHjkB&x3+kDa8xMCAdFR)CdEdCIm@@1UrR7uZTv`{P`Avw+J8 zm!z3@6(SkRC_@V|>iVvN^8vblHu|g9*3dk^8jvir&f;6FT>-mQL`w2z&HSw&-l<{~ zsJk~My{ErtxUBNRhDa9!kD#c7kJ?g;8k*~?YsH%djNmZErKi_Lx*B){PoJ%+g*OXm zAamPW>R-G-7zVAD@*85kbWHTcqw~T&cAwZ~9CjxzrvTl8Y;I{R%0NH#dvV5R-Tp|U zE7e84T$ssBR&<K3OOE$Y#OL6Nl~i8e5EZ1yw7)os_~Nk9m#1%3bk>6cWqCLy6vVsb zDt%Z~Ng03x;ZzwCFXc?G@3xI=mjC8!O%)9tJ)LEGnu}Dm;8e{m!bH*XSsN#co$mw{ zq(-(pKIp9CV5AjtI<F&VCc8o~HHu}|PH%9xOj}J$TSrqzQ&nSy(KkE8EJI%xkl>f+ zbDvqKw}p&JZxz408fh;m@LdzM_6q~`KYX<rvE@SHImzwd_`|s3yfa(Q?EKS)6{_E8 z=%_8zT(xecg}a%ltCzY_u!&QAri{;?C&oIf(6>GAJLs-ot^I|%mWsN@YSCZ0?Nc|p zu-gtOs{qR6Z5JuprqTl5rn0mYuz;?yj?Kc*=>jUZ<8Doay~q01I$vmNtIgW{&_ull zG+f{J2TF88L=Vx8GJ5YsXLM%t5~BCsgXki<(TQ%1-n$S)3!?YldymeO@9+QKTWi)` zv(}xtch|GeIeVY|S=|ilem9r(xu*-2VD+j~!ZTR9wPJZ+wpiJ4y%s}Fe=|N!nSdB5 zTB6LGyFnjVqO3%b4B9On?5H|A91*wAjECkPs_XZe*Kz7nX?A|KRYWU$>0aDdI4VkG zJ0yqVBRq5&wt#isd-u40P>!C@d}|pnLX_0NnRfG(i}7H!z2~=LpF!pO1advo7@j)N z*7IRxTsvAxHE0wh*PcKJ6C-I^1eRnDOPcGK{Gx#lujpk8+Tr^x_wT;?Ni9aktsPcd ze_??@C0|@$)UjC0Yqr4l+!Tf;N(FH!l)0U*h*$#B6?$6?i?}M&E%dO6eA4;T*S%EI z?zmHpla5kl$IF{i64j9NZ7;%x;<)6;%)_4%+wRO-vfqbqdK$#+4{4K^$~#O>s<rgk zXY3>s;Ogw@UxVH_=rupo{;-0>O854x_N;A6Na2qoeiO-RKkAa{ej!8bY=U&B0Ykow z>#hy6b{LiD?1%4<edf||tx5|(AeQ%((g?@J&u`T!IqmPzU7=6++Qp#NO<aLg*@4%K zwzbNdQu?X^x0s^CQ;GqVElMXB5X<EI9w-mJsXo4B(5LOB4TQ8+X~A3fmlLg9`Fvw( zO<&m77(^XAv-DYHG^G?Z^`)N9nRM+!*v_RB-Ao<REfY@gY9Yqf<&8W-+D=+FJB!Y{ z>1K^)#*irGbVV@l6nIL@e)$_Z`sM4WOCj9PXQs~NX<Z3!cT@t?Z}^PLJ8VsUe0s@x z?b`qqdjs6h;;*}!hISGc^b+;bH&lmMB)Lj&B6rgRYb)amIN92Oyc6)yd@U%jWGyje zjF%Uat4NLCrf`Aqx}mNisxOOe_$+2TQJo90>gTO2F3@vSRN!48KLoOwM5OM8nEfT` zNA3Hs)?-bWm=+MzX|B`M7W!99($n;jZCo#wL&(_q%n&m}DJ7Jt<S?BCt*<k8vSM=M zm?#5GR0=PFu_^te*DfDzlgvxd*T)+{?(JulpzQ`hhP6s}?PqP?`gC1QV>O-_Wxw$? zRE&>XV>ybTe!!_%BV0YCFblZ!7tAF|e>%Uuh_^lZI(zi0fX;Wi&AvjSX6tv>i_J{& zCYN*-D!%_KgKv7aDp2fR@N|rg7Fio}pC=p|s;noMalGu7^e5^)yr8taFuy3b+4(FX zf4f3~$?*3V-Om)?S9}>aUH{s(s`=!?!l(76nFC0}nhIWbGF7X+<gl%~%;eWTF3J%E z;#Zi8#PKgGQkyt?y^kNC1M|eWFdioi8D}1sWU?^z#Y>2_XDDT8ZW6jgyrNGTTbUaV zmAl4vruTA9mii)%VMM)&W=^L#t8&^K-n=12LW&p(FD<K(<Bi|V;_^7yj+vOZz5ymx zu~-q-z$>b&p&xqUe5;!}*v>hkm`mp$CXod|@Af2eGY;bV;Xqj8`j0$QXCwly=;1Kt z?LjtsVNH#czuTm!iNd@n#y_)3_HuK~32m;F27YnoFw8I+y=g_8qMxgPHGX^R+`Pz- zV!R^bGal-7A7QrLFCf6#yMb+rYTggphTUp9DU8i|CJWGzUcK^V&TSREGfyB%d_aK? zL4kZMfxn$x;`k%_a!BLiB8chN=*?WUZFi_#FUv!t3(M;;A+cp8j&^%=^`6&_8+QY0 z`XbivM(Sma#N{Kcqu<PR3<VTE2JZ~Fi~dCB_l|Qs!u<br%Bh1_`@z6pAB;;Jy|;1c ziu|gJB%rRiRr#(AW^g=9;JaO>!+!qCsXV&>E}gVr5-y}SZyhZ16e8`ob4Ky?CKGkH zlBB?7S-{aNNCA-FYrVwPu?v>O5WFFH<@9pE;*#>*Kk;SW{*0$t*erf_P^fFSH|($! zu=7(qmBaZ%1nVQVsp6m5-e(CNPGYkdtT69aLYEsV65>`ClH$Nbq(?@n-xXiht`(s- z`0x3!RcY(p);VW!Ud7DH*s&Zai)8roTOAa-)uu>K2A&7cdHxb$?B8cY62a}H2ye1; z`;kc=2fY!;?Bc-rEw1C{9s6a2yghMBFpCy+5f^LHB`>K@v|5Gs!OINl5zFj3p|#%K zS1bX2V%ipZA$r}`tlc$8aH1dxtndKZJITC-B_I@mHeTH|*};(?R}l;xJ=cBnK$%Z` z26dk<y8x~H2P_kufAlMgE9+J6N44~$yH&P7X$WY{QG-|z+`6np_+DzH5S4J*C)Aye zBV1U)rlgq_dWVpu9Whdm6xVCZpj{NZ#?t^?9w!0WBwtHY{O{3)%=lqRH>dw{*7QXK ze`23Sg%;(G_CIVyTpjg<@%hnyndhL|U48g;*cULerSzQH{hdnda$|*_LFe^fbdSwG zoaumAXI(oB_GEdu%*MeOIrhzRO9vCn{Yk#~!)F7Mu#L~pw2leNl;qY2WRAJtG+@$P z?;tDV8qxF(m#&eYR^D`RHYuRiR%Qg1+S@QmP7_lfU^3gBgP1Q$NsSw?Cf&!;MMX=n zlicH%7M9T<`w=x!^VjuzK39N!JyN}i>gOJU@v3i!xB!CiHWnH{5^m5^ludNqVAIzo z{lF;dFFd-f$c)rsE__U9Z`U<*K%X4F-lQx<DWb;+R}W1fn$%&L*x5L&JG(59PYw)H zw*GqN#4k=9Q4R9PFT+r>TRPb7-V^no18aP?vy@#uJ6YsAsav$Rvp94f-}R^s=)K-N z``+`?uxcBds9~y*B4F{*J)dfCE<VIo*wC&a%{S}yZyNf`0M&GacOvxpv=w|$J)TA} z84YP<X*zcNd@C*P#c2neC&l%iHrDoLHb&g$8{O9*phdstK7F<VHq<nCVCq7!8Qv)M zJ(*jCza&pL&EGQRhT!@w?^-z?P!-l&rgC?pFeEW?TznABNV-8k`-`y10>Au%y82T7 zxADfnfxlXi^=iHgE4v7XFCwe8+%ql1zV_Pa_+oa?+0~o9pRkDe>{$*6vOfN+v>Pj% ze2IXdm5q*8@XScvZMEyOgKSZ9kwt66oOh+b!|a;LC;y$B(}2gG&=S1hnTr}eZom7k z`@0zJk#OHdoCR~s_U@m;R2<=%vsekKpXy@vTT*i0yviy&!nOUz+L*3)%rRGQ-?vSU zE?2t|>qlF9zK_9qHOU*_F1#$I*NFF$9u9fAoIRZ}sTD^4c(nZ%>8N_D*wMhh>Tl!3 z#aEeI+g@86{f*W85xAbT0G;TFum61e>6!F_{ViuYejvVPq4O`ViT0VmsI=zDu4AN% zYfQ)F%Qji}`nM5Qc&II-!Bp2+Phz>&v#^oxEw|!l9h6(x1(WUPEA751Pb$|)sxGuP zLKg=Mq}66TkM|?FCO-P6=99PWM2N}06-G*oU*&RLZPOLu%pg*Y4I=~L=7o{I^H$q4 z=o0{Zgbv?}>Pq$pKr|#VUUq>cBj4cs&_Fm2SpM{KLHrM8D9c+d(UY|A(ee8GqorkE z?t*UYSelBhd&3kw6JxM&*2n&!#ocxaE?*w~6|I7~^nLF*kf0PD6PQDQOz>ut038{f z4$(yt$A!W1I1U#V{qTPKL*B<+<lJ+=ZQ-=<o!@RZvb@DEe6z2wGxCr2)-@^3Pp~5A z8@4*jr%!~-*4L~Z+-+^glYeWHy)om<rqZ`2y&vsUE8M@h9(6Q4IB6HKI+-3~Rj}7u zJJo4yOLH;N9OUmJ%RhM**4Cyyl2URB$<TGC73o~r$qF>Q53n9h@W2Y|Yw<SQ&U&1Q z@jKk}{behsE?b-V=vSuyN2v|kHg+GEG8(gM_k*WFj)yEDR23QW>ZQClFs&~m7i9l! zFw>Q~7@aI(oUGm~g?NQ$emaU5#ZoG<l;4b6`mB~XyfvK63Eddtef+eA)DfbXJqFPw zDE}j}jxCV&L6hv7;|e|735!^cb-(H(d@|lB{=)cyct<P5yfCi7Z89+v-eb+mDn{nV zDe}?t;j^Te#xHkoq>B2Ivh_Z8c8VvSQ|WpAVjEGF`U+*jNsn*W%d9WNAs`r$C0chz zYeI{jst`2aZ7r+b`_b_G{(5#QJ~t9B{Wh+#G^-(FF*T+2hoa9wHA>H?%n9<UHp!M$ z6PhFfxlQ|7hhEwAmG>Q7*84|0q_{z6YS%a&H=3uhLcrS4t0h3%9I;l>I)Qn90(fES zjK<ym0=~N!(US{8jntYOS4-_+xLN$c_sH;rDXr8tAqO7f1i(y|?;>E@Eyuph>(?i~ zzJ1@eTfLLpH?|$fW5P-d#`s6J#e2sP;K1?pidc)c@}G52ZU0sBU3|QK;yMcADhlEz z#2*$%dMiKJ`zrO{r|)_f<wksRgO4j>3jmBEM36Y29_E%=aflx6zB|RNy=I|9w5+~L z#R%p-pY8S8ps5m+00x9?{#ySzAsVZ_RS(RB7sOi$Zo=C_Rx4?yaXW^J%@y6j?}|X= zFTW*$0Xh3GYnn0@SJplIy#125B&=RH(ZBki`rq{{*>x&cz2lc-9xfdfZScM*>K%H} z-UymOuIxjrxW>{6fBE>|l^gCfT2qRNTpUa`fN~Yg1Ku1%;Flx;5ChgjX9%EN)_4q@ zNa(?6JHx3B5sGWL)9GdBY4&=6_t+H8Ja}EtJ3m*hi;4|jQt<==Uz`x3^Y>=78sIT; z`|D)8iMH5+ukZ$9WWO1hw^77CM~nAQHs2p08B8@pcgoG%)iUMJY^6U0i4D$i1hX_K z32154diXsScu-xEpj)WEIh8_>LfI4}tPwxTkq0k0Y|^sU1gO5qX~V9QQ;5)w5316l z7WbLd^QNY+g2t-zKLWmOMO$@V)p3wwjZ!EJ`sY<eSZ_biU(tVxb^p%#aGP`8_)g3@ z3GIj|B}#en=$wJ`Hc}3W#sTed_HW!waH^U7Jq&Ip*=@u6S>&${e|sVP%tG46&Z~cq zjDjJOBA#O!`=2RrC-F-`zdcN^+x<+g^%WD(lzNV|gvJ~zXr(B+8jG;xXhO(+*~Na3 zvLAM{YU9bb{Mvy}((Z^2+;eRzIqeb?m#W0wkxqS%Q2$mnF(_-@X#%I)wK82?4*2}7 z`xPT^nz&={+lNzO)8kH)e{3OeB&H!^3$P^Gbe8y_Zb`aG4UX6{@Er+dRr5D<7Jt)I zwJxEb03I+w3+QR0rQ*{UqJu$E?uV{WHOSXiPqEi0lnr)E&6>LA%{*G~nxkhY)n@*3 zocw*$C&d@;cq4S|FP9DfZhI`}CK&?NNXI{Dzux~!YwjrvOVF{!Q}D{Ws|#1?YiM^u z-oigbAFLa)?7ͤEwM>v4J@o41k0<Rq0|nPs<p`;x?w1aQ+Q!9_=Y_2u`VzyXyW z(b#%Ka{pWfXttMriL|~2{xlYv%DT|N-i309dW&3sjb(6hK)Jhj)Vek#C3jM9`L&GP zkPT_60$bn<oU4Tq@Sf6pFF2UkG{!&Mi)xkfdq~+Y6t4}f4Ss(jKY`%5F2*Acg%*3_ z3@f3xzY50>XSameSp{_xlwVA^UWE>yn@kZD5aYFGni#9~d6lfidT3xWk$)f4R?na9 z6RW~Ul_yjDOZ8d*s8*^lG4__>?A!k%{&k9E9ZO#CTh@37^+IRf)gJB|M9Wq-;%MC- zhHZSD%)h?^)+smNRW0*>TtWsb3}{22D>)uHj!nA;XBU|*JuE3MSDqA3<@_Z|+fTcM z(ObFGUVxNvx&tp-3<Q5N!<ZEo2ory7NOpfp#=N2{S!NmYh~$-xXO(Q0m-lF9^Mn#R z+<u)xT=*Mm$#0Z<maemy3B2R-G)Rg1%6<3YK``iV3ga)~ow=y>u_~&6G^asL@(XcU zBdm0#qiFSLEF*wSm!w;6ONf@W-w~neqo1m*3oJ~L>c{^cFCddTHFUqi)Qt7&6FXIQ z@RhcSZ_p&mDA}R|c^hi-LMN!WIO~vHxVII6uHvSLvUOZvq;>j|-p&DWOnVxV+$<uC zuoCI&)g%0YypnIjB^Xj5Qv?Ls1OzE7pTX(+mjXWu_SNx=(+Bdabohb0iuj8;Ai!$? ze02Adb7+AHqi_GZL&BfeUp`Rb_Ora!LmtzJAd>$7#htbo=<Cky5Hlj!RDKWDaZjad z=b5&@FSplbg0Jqst=yG+D&fjARhx;DIhd{anYTyr$L*S$o@X?vNG#O;OF6bEC|Cy0 ztx$cOVF-OKDZLW8i?Um+5gx{%nY$K2U`6r*Q?R07UazT}d0AX`jh|Y|PziEVf~rNz zzBFC^=W?l6IVf*gqf&um641j6ZZXI>PHViq=!1TFLNQw`P)YQV@DcZAsH8onREFO1 z&L(So$K<99=f*BgP_j%mt^6@Z>I4IpTzcq}LZI{WC}5&D!^$+idv6XQ0|t$-@jNd+ z`1r)5)4zb-c^UkV`4)Ake_t)AC1uhw&z1!Sgl4hH3)XS9^zXP>LM&sYpe#tV4M}%X zRveI;g>mkJQf=!V5rvAA<h^08a)o_0K)w_-N$88@P)cdDMuB0O8P=9kN5}|agU2Zo z4@gQzUBhCml~Xx;_jy*V#1#r68N5veR?ACXxQS=}W0~XeKb9|+W&+8IfzFl%z()@S z9|uLuik2HMBbV8l-JgUCL6{xAB_OS6bA%{E=<mOV02cWfZU7t<MiHtBEofOYER2U2 zRF~q(m3_o8SNamtMa*@xIRACAERpQZ(PGW&Dbfj#46mm~C0Ee@Vut);1t>*MvvAL` zGkRk+P%v>$)u#evQ_`|#bGw8kT#0wRIY3s}o~Q{xg5mumQ;Aly97I6h-uog~%Q9ed zA!0G_wH2>Mywc=s39X{9S&{#JPJ#sucGKHh&?o*?<UfH(FMkVUvV@a4<-^CZYC(CC zuyLhqNR6`nwUCiFS<F%*eJ&`B(*oLai9;QIL~_uvRZ;Dr2Ke_nk}fa|uOw2QG#rRw zmY@=<v<n85$O0zdTO+Pe++twKu&lCY%HR4$ME(-gO#A4^iK%3}C$nl5Q>_6GAEX#| zhmAaVPjQV9j78;_=JYsnk^Tte|01=CQ7mvQ3*Pfi3QD)331~Nj+F=Xi|94GXN`Co% z5hxY-JBD}Kz*SfOzUrg6n{KNNRMuEE9yq2BSwF3Ig{FSHbh*37c+H<#YNlQIlF;=h zdz3=bi!%DPGuZ4`-ZefW&ch?HwDNBbllpoh548BApQI?<Lg}jmc!4K8A$P{q4X&YW zTscqz+Aa3xf^YIEkUGaDjCh1x3y?W|jpSQ>51(99D?E{a7Lj-7l!PcMi7PazM6ghw z*Zs=P{j&F@^78CXGp9-*>$_IOzD?&jT5zPe1{93120&^k+*B)Mvr`<%1<^wLnLgm_ zt3rV$;*{5A36d+Up4p{zV<f#c`MXf~B$o`FV3Zz%wE_EWRxee6b*$M(nCeup)9!G= z9X+X(O@jNIzk0>@y8g;K;dgPCK%8LNiW2JS>FKGdsp+@2HW_-621s(i_h7TCV}SoR z)t=C0Mk{rzs%ZKb`c^$(!^Y(yF0aY3DF@0=-c7cCDzBaObwbj~#1;TUCr41<!$A>U z5GaodMDhjIEg$jau$gx%kZD%(-9a-@SptczBa2Q}vCX94V34**4sRSIUNu4_dd%ns z?RD^=F|y}hhb!HOk-@l8O}+71t!DFNp7a*9`1cCOPxgpIJ0qX(9WRJj3^*Lu7F>7A z(bLKNJ@1ukGPBs&l@}?}N!oZ1{4?<WO*L1qN4{BgDm!Uem!TTWNRv9T^KTSsLEUJ< z3JXh>&Tu>nMGpwqU#f0+f$JOukJ=|!W9Bvph|%*p130F0#6v{e{&NXVSB-;Rf{M+r zkBKMc9NF|I<F?#}{O@laG(xi_`=3XZVm_X^ec#0vPxqkH2bsD#py?-xsPP`QlQzQm zGxyG~geQ+@N8SO3RZe3+Z=<%`ucm#M19Zp^0)UC2=HEW)H>1jtl#WB*J>#TB_xk@F zED;%Otpj~}^S{*?1{i;5zR&TbedqqTxv@NgHE0m$Sg#!jWP^YWbWjKhWo!uvP$Xn} zQ4DZr_Q9oEGK*?p0_3+ceALt|7$G4nX4G^n)b}GeiH;VMxMn4KfBqgkJW`JOS{QNv z&WOME%-%`6e#~fln?!q3CULydP?t;Sa=-1&!BJ1O(8=3fS741-k|BK(3eq44ax$Zs z8+716<vD<yCgA;Nm`14<Gb-Vm{>Z=`ypLyJ!$%oyn*1<WlG+4admJh<Li4p}kGgda zGY5T~gBxz2g_*1&(Ba!YZW@u4`6iW2+*Qgfr)YyDqqx}7(Qe|mFUKxgs<setn?&2G z&i#q1eq-x&Y@acENImX6m8j=RhGI^g5TpnCW(3}6!U`M+;G`jgDlj@thyt_)rPccs zm?WBu*NP9k@&#ka0x)2HI(P4Nwq7??#3-|FDCoWOTf8lx%@FzJBQzrHK`r-nCP+RA zW53Kw!$lAfvVNE;!h#w+JTyR!Cr>D{>*Q<gnxR!{r{%)DeAK<gqz^u|?9WJg`1;j` z6xy4+ng$^86C(;94!t8xR(qF+>dbvE$odDp2CyX~?MGq2g3L@A%)~_FTuKmavs6Ey zUT0HL^HrX0u<t__hv2N=tD+Fab-0<bp4vj*)M-oBRy>fPCM<c`rXu}D1~Rjh*LGMg zYuBLr_mr>LX#BPgG~E6cf*i80Q0!=lFeHM&AG^z7ZC$q?^wab`(S$Q`^t!CQer=fo z0JbXs&U~u=y`=fO3S7A^{M)I03*_=iRydHNIU-_UpiffV*aRm`q98&V+n)8$=rX;d zmoO+)iKYl4oRu-Rrhv3VgVr?BOJ*)qKuIiKkG_nUcMrFrF+Ti9Rv6;_RuCp35d172 zlBZFu2S9cZnwHv^`)CtRhny;;rmz?TY8iAOfg*pcfE7dm+hqz>GXibp3Ux@J1_-gd zW4Gp`R)7>7Ar@UupW7nZ$Q=%vn)h}#0df0vA1e?%_hA<-;nY%nsW_Ald=9X&pL1+| zqaSa*_0*Qe7%KHCXYehZ@cfw3;mfC3c`@Y8b<T!PO^t?C6C5v~q4eFu(aK?}`upTJ zAs1kD$;m<pl)r$|>z$bA!0)k@^wjk9SdMV9KCiR)jrcpYrPOZ0QpQ()aZay%{i_!; ztAELM{|>|EB@-U<I#Zaz4^4ZuYndF>lh||-wIn<e6Fidb64`0t1dSGb;Q!*3ukdS7 zex>6u=pOHxo2jpcmk0YsB}Mj2Q+AZ&mfTJ|YTGnI6w&)u60QTussRIGZrV>5xxfAx zmSOoBq;=Zc;#y*2o={>a&b4f<XH}&UH$<lkjr-n>@0QY`pgl3>u{=L8T?@uY{UEos zuruYG>i4=|=XG`_B;`c*j@E^GtIKuAtLq7~Iz^s&@^#a*8rI$ecroStTSku#+qyio zWH*Q^mMDh4mO3QzT#KFeH)?*Xun7F8yU+WTseuRPYk{iapah>y>?R!W_^!Hwu5szE zD4gzw1$G&c;9?rR6JI!lv(!#{xB4>%n%HKrO(`1tRstbJ4TWc{p$<L^Tr5AV)qmU> zO*L^49GU+0%jetHABBl+yE!Mp6K#;Dxnfj9u7TknsqZDOk9-fHHifc;TGQQudo7`| zM#}0=+o#$3s9^@>Dn4FLuKQ8q2HHO5zp9t9j!f!bJ|bx+dJFLSbzCfB&=c`Z)5^uv zk(k?a?Em2Q6LG{v@W{w%ez$4LBwl{+-Mee8X@_0LGR!Lbtt$0_JxY1va~=hE6U$q~ z=Zi37t#1tnE*=|o?))d3w+|Fg8Fe;YnEq>zidY6x+s{sjn(=U%oN~0159aS_Z<}H@ zcMngdPyVL8uN!l_BPcbIl`VRH`suN_IdESa{QaU-=bD5mT<iCnhDM`zyP_81*Ei17 zVzrt14u5Q|K88j({T;@*p2DZsd0v<toOBBrNTq&G<u%#wIAZ#ZTwkT&^Fze?1b%yP zD93WC$KhY!&5s}cwB&QS`;MBwO=U^EWz6~HH+wPmZR;E?a^=Xoegnd+JW*uNGIPmu z{vz9Dr+37L(?z6B#vCxUT*<4QnH}Sx8YE~>9%*DMJK@Zr7(Q@s4b|fZU^V?i{}G13 zW&{rOqbJ=ePZplj=iCG_L~Q`$#vZ=YHy4`Et9VWtYPTWDJ|8zw+3%}yqLdFmTRb=I z?9{<b1r6r}vwKz(vt@+IzovR#>PdQ-@-{ZL1!<=1r}>^u9pNAF%Q@mGvc+xJ3NrC8 z{iJEVQfSBD+wh$6JdrXzyZX6v-)6Tn_s0ENnB12$B~wqHrbxWV;JTyQz51#@OKXV2 zAU}e+PA|Gh)=<WhbB|6aaS;A-W5SjKxi<?d)la~B8TyKzTjB5B4ia~Rmom24)8$n6 zKG*x`q$`fKJkL{A{YFvtmcLXN@D-&W?wTH15hnsK&7Vl0Cl+velB=<NBWgatlGLFD zdye(f?w9^ljgpiM2W;<PKC%IaKTMMLl=4rKPol(9<v(XD(pyk@R?ke#Z>)QMan=pV zkQw-5E0;D;7UQ`<=1%n`JI+YO(usg7Sn7xOjQ#Ip=lm4MsChh@=utLSrRMLX`+kd~ z?uTnPg`A-x+oC3>{jwP+N8#QMw@hoGeXPadVNawEN`8y#v&$@hZKEXx1>nup&a}}R z{l*LY>!Jb>ra*uH_rtY?$kRE$CHB{vKq(}}fBKy&6*GTz%%2DP5eoWVrnNU32}07C z##VkfyG)8xroiEjK0JChIT3K)2xA=I8suAB_(~B<^xLB7ncyKh`~@lQ=W)kZLhu^1 zmjPx`(W=?QC}Qoe@ZUym!1#CfVNT}vRZ!+14{QCxpV?4<r#E>{FMd*R46M^OVU}Zc zC#m0<9h&FY!)=ZrO_JlTxS#*LXJ*=V??lgF9HpjLDmk!mYGtlOlp^D0ct3l+TwNdB zR*`!2wL8UVho18M>6iU4?Wg;^Gp1<t>A-T{H>QmIKNYriP5>dS+-~15paE8Wa}7o5 zzUn=&p;SEq>M3<BXmpo}3l=&`Nm)Wvq&5x<?^5+@D;7Tn)LhSg^lIMTR4whp=Q{iL z=<4=cgYULwRuW`2NyT_&x1m1#P7gt}L=~N`EP=l74n-{lCM~;pJ>2Z|$rp<iu(qAK zx;^w$g#v_q^$9L2UWH&qeh^D-6ul~oYCh0Cpgh^Ytl&0&ujklmw!E8@zXvkFLZ6n_ zHn_;<ntZZlem1oJDzYoTRezq^dGh`zi<XhnrpPa1BOIPDa$*lz@n{XB=~b>V8^bAt zR$X{NFih<V?k`tpEZ(M7axSW-@K@IcddK{3#`BfRY_nF$8*tE23*gX3UG7yyo$D)y zKs5z?)u@FHZinSE_9M@x;g#Lix&969)^3zkJyBqwhW!SXtmG-5ZE1DD{r9zB7W5mx z=Dv{&dnEOGWw3{1Q#|#GXAS=fc}REV72Ej}#@Vp)coZOeIcsTlT3I<F(v#_G_<q0T za3);lC#Zn*U8LTY)40kJkKwM(`9{~xptgMu5#7{VwoLuCD!Y(dx&`$HzU@!pk3(i5 zN8)`)l;k8CMv2n2(uei$IghZAx}OcjyLSeV-ZF-WW2(He=_(s9s}e2hF7o4q9n1;Y zXSJb7a(jmgmA4bw^s7yn{OV@-ox0vOGXvO!J=USCR?ZUhm{gVm>M<p5X+fs5HsSU$ ziX+Rvx47qhK_B)+ZGLiE7IR~zAiWbL=Fp92Cii49bYZ)*rz~lp{*vtC_b3ujEMw`o zVWV@jbxNb=)P6HvVV)nnqat>CbJg5)SnCjTZ<y&I!lI5*ca=kve0G_0u(&#>Sh)lM zuF;;OeJl9Hrcz8?(Uc?+F*1sNMQ+XAao<mt>US0!O0@Dw(0d4w4f_`<VPX()NgY0r zQydf8A`K-K{x^UYAJ<h6pf%xhT!n(pV`Tu|4B&)EE!{@7Sdd>@OOYqoRBJlf9S#BJ za)MCV5R1Jfz2CQZ6ztG&j~e@nxvh;vTC+(!8@lt+WTllN#_L2NCyD3wqS$2$jctFI zDho@~o7dCT)z{V4)zj10)f;VSz&Ss?V?w+is-5v|w@@K{9HpLKy4N|rJQX5~Z9gSI zYAQoW_7ztsj08KXNB*QW5Vk$28lK%aZ4X*tVH4bO`IY8Qc1R!1Phw(kV{L72V{c+* zDtJc8*ER7-L5GE|)HR{AVlK=|uf%trDfTRXvs7@S0Ssd?gG3#4x%hh@=2NC1y9p|G z#o3ay`2b+{8tyWMx!u1O76i#LT;2!^+TKYx#=<P=sDJQ-U-jm&BqzKsb3rm_-!SIx zac^l2#08y2B)lqfN7C|oB`Em81824Rm6LHw-1Jy+GZDcOEyF7chro%uO}C-~iAFvl z#%VtK<X#y&j&paeztNztP4Q?fhA3VY!D7a9IS{LZbt|U8MqwU@vy#{5qJEnge$oNu zi<5Eg-1O0hJm<+rwBi%<cBMOS-Xz*&h)=P<fAPlLy9?{pJkV_qjYxArDv16n2DCU& znoR+<>7nV6Hee>ix`feb4D{NBO6Mp2R0muI<|pL61@CG)-gyYqxz`a=&dcICad{O6 zYBh@?qUGXADh}geZ_=B!2g<%p2*hXHx4D9WSs^s+U0tvq{K2MI)+ojXMyzHK3=$DB z!|#F2x!j7VKsX&DB$iR3PfIvNh_&^-v6}3fDc6W^*6bRe|8pXMQ!*KE`4$=6lYswI zn{`fj<!rJroJluH($0i}jh~-5d}x?<{k)k+LxKE6OX7TtaOkh#<yi5)M;G(QQ0CQ^ zyEUw@YReRwFK|PHv<Bj~wN`!nSTuQT<gu+S!zQ<HJW3x_#l9&qDRdFwJF_#sd;7+J zxxIgFSL0-M=eJ&bgSycGL7WS0^JeGzXYB9q+qXwO&PBrS`NcX$-&WN}uLFzXlB9fh z4#S#Ait6%QU$HR|Cnkoo4_L_K83VEwEY^<gYmwwjdv=#=4<vx-k-MW`rq}{6_T|`N zlA*_JRNx@oeUz$s?9<Z_K_&*W(@TU!EpgD^?!^-<1S#3)6@~4((KwW}{5@E_2!Ld3 zfH1@B%q|quhA>SvGdS?dg-g|^DTK{Q<Z4KmHkNkPWoVbhT66UJzXb{GBQ^){?OSl3 zBux5K?cgP>r()CP1!0Lt2&}<3RZ68|W24rcISKoMUQ(!_oo+ZY|GE|X46VUerf_A- z;gyNrcs`zzq7OL1LlVFl1fmfIP7O{zsKCH;SU~kTgBl8`12v52GZhimpI-TChQjks zp<Vg4r!p*u4Q*uo`=wZ>BzQV>KFqRgCSDB7qglxKv*c0Byjttze37L&)7yg`wCiO# z6q9$N7^g0%22|*bi6z2MtT$na?tC8)fvQ;7QJ!zII|zj)tRmZGKAIIt8wV}DwlSR@ z2p7$KiEC{s(v0{v`Y3v==Rw)%1i!>|uOGt#(ny|{Mts1h@jQM-L@X!$_U)p=Q#Nk$ zI(%dk8$%Z#3u`V_E;GHqBrEcT{Sb*M&7Zn%(CK6~z+ByX)#TMnpMq)Da-$iAAPKOd zYhMi9B8SzzcRE-^lgw-J+8^q`cgl^`9Hlcw)PB=RF3FiLiSi|W|1EY9w<XC)w&!~V zRIS!m$IR>�I?|1N7RxMqPGFRedSE|9PC`R0`@V==o`?h~yVBIQXkHltc(@3U+dX zU8;aFMmi#U(SZucTqSDM_`oe1sAQQIhzDq$rKeq5U<IT608a1()ww%9Q+!P5zR#@N zGgUl-foI-AY=}y))B!T1>V+O)c&M6!Mulo;7c8V~x?HhyX^`Z_#!_-FT@W+lBTyc+ z1a$^|UHQh{3uf%@x5U?I6!#ChBnj7aVC99iV{L)Lgw>=~`YxDkI&7n_SIn)~xau0k zFn9GP={`c4SGO-jN^5AxbCG+scdr{&YZlBo?>`(yZH#Khu&29vt&OMd99n$tN<!{I zG0$`&-Eivn*qSQ%ox!s_q_|h#h&3Nq%40KCFy5D<y1<T^F2;VYvMK1d9iQ?O?WUn2 zrZ$!>EBowoXBnZ%=s<OPwlSJ*#en&D&!^sjWt)%{`IIJMLTpiX2?epw%;Y-zs7=1T z9XC|qabW#NHfCnOlu+GD^QDaAHK!j*?TFJ&NNlB)fa@<Hd9$IVdp#`~KZ&t{&iLtL zsU4KRBIp0~5ejF=MgVSYtyQ1o;DrwS0jyGiP0yMRK}O#0gvCYa`a?SyHq0`TqCkaZ zBq(W8G%f@0PX`ALeyPmK*SgV774;}JsLrbP0%Ozq_ZK+{6<T|-UqO!ie7fu2;_)n# zM^@8niC@IIHj20ST-##=v*eX6h?6&;NsoAh%zl!*d4>(o^sA0ze#NZ16?n~8$r#>A z3pqddV1dmF{N;Yhw#j?L_W3-DvxgKjc=>lMb-O^zG^bNn+o`MP_aAhGI|OgfO3pTi zg!8WNRp#A3kBk)<>}%SrU48ie*;XXhz&j}u#P*9Q@!Y7_l)dHq-wg4Wo{Sz-g=Q=t zs0?2VdD&i!gf!h4XfS1KeHrloe7!^Ir+VkL;!X54RLb1p>)?p3;x+EfcQrjq<`?6* z=q{KDg(LVHRp}cp$wu_Q6mfq%78v&!nuamV4D{}WF7fk4Mhqalr*=B~=Dl2P$QA+` zCvm}BZGP?KjI`YL<!JjA%f&YZpVmT$e4<TEP-S1!x4EeWQ^f0Y@5_t_@W)}UmkqO7 zX*kX|(~`(e%w6Gqj~?rnqXJVXJj+YM6rZl$C~rmlRMZ9QHKN%F|F>|r>QpP?_^$Jf zA@OSofyTQ>By|OPaDON$RKAd)6oMD6r&k<5H8Vi1LaGMdXF{A29}v)0#b}D@ebvIS z>LXjIni=Tp*}AxJ2B^m~M06qh0U_1D`KZ__A9YL5O-!!zTA?S=NOt@Cm5#7=-qjCf z)^L3ty)^ywjMSLy+oMHVMV#XHFb7l??e)<Qu(eQ@ikpVf)H&G;nyl--?c_z8f-t*u zA%{z1<215Z5|dBnCZ8-!xEyYt*)oMTK6Xy5_YKlVHbA<Re47J)JvBe4asApP<1SsJ z{oSWZdeCIi<;VX0?cZ=BZ$ky<01atD&yNjDKiOaRVe|6WHdNJ+3Jp3O7evoAEcdg$ zZ7(3q6ccfs4|=)ZCMxVZ9;TR4nY`)36Wz{=jL=|{(W5c$dWbQK&VPV`&*IL1=Fz$s z%J3d%ks6OJZUP|%rPJ>*f*J<K0y(76A*kSV{_OoAOCOhp$YO*pAh4veyBlnfudJZC zlcf~vWIT0&mlR|%K)%i0=}vLle$jrT(X7FY1ic1rAnu&_3UG~XsnE2`qPq};)QWx+ zc{mDbr5Ip~%dZOgH;ruHpUBaeL0-I<hTcgR7I}b!1TfgPWYtQz?<VW1pF02c<-cs= zA9vqzK!jP_QRoeEa8Qe6<7={#kug(~-L^n+%rZxHJ@_C2UK*9?I9=VLO~}NcHxFNN z$Otf3^TYzGvbzJ*z-qHd*ybg}CnqH!C%D7xPTu!)4SvGwAN)kwH2ON7XXQvu)+$UV z7g)xOI^y-)P-N1pEUh^$v^g}*feT09kK+PRT&;^`(`D-XbenkW+H$!^2xVa{3(H7T z=H!}haheKl!W29Q{U9RXw59M7z2tY!wBeha^=lfaI`i;Q>FQcuOKIm{7W1cRmR9fC z6m4mp9$V@0f~U=Ka8IoLlKu3O_7zDa)}3TTW7ZSkjGbYbw=osjI?_!EwXEv9Sh$h@ zTV5&ZkU>YaX7=PQ=cP&TiJRLMOA(8EXie5allYx|l)h_<PA^Df^(5@1gODISeS*`p zTth8w@Yf>F5@D^Sqn$J7W@@{y16p{I2Pq_rw2n$5H9)LpCt5kZUU`pDa11TSaq|Od zSboI>yx!gVz0#;$kko|hAQ>rD$C2}<I{0OenGk;c=R*!2PHgX^5qLj4kjx8w*Myw; z&`7n{u3my6QHY8R-NyxMcuE3Lf<Rm<(Ij~Q5-9Mt?i{2i*cdXxmODXd0>d9wFE-w1 z2j^`xUG-z>)cBzM$n3R*DiU4|v(Cq)?`$Wd=Ef;~BqWF*G`G`rwatJlYxXj;(wK7G z>ag$;-%Vt%Q`eX$-0^Kv!u7xq1D6@GcEBp=R1l?Ez>b=}_?r%pfVZLU$JnyL3S$BK zI}%gswiFiBJ4TU?kbyiWcuAcen|7Xq`V2q1Et51Vs%Ate8^YDV0Bu}^2tXUV;RDM! z6|Q=O`AIee%-BW$*wN9Bd56HO3W>C<$8wy`$iP}cp-0n~@8OV6(sTdR4ue4SyWmG$ zrXOpG?ivW|w^$G}Sk+2UYzQY|M||*>sM7QWxsu`|7YW^9gX`#i0_^f~T=V)tQi67h z_?ZJxjSs0e4`TQ~e>lli4F)}`m-3uqG{t@Z7>Xz?BWN+}ljIex!^1>W3~>}6!%9Xh zY^bELXJ2PQs)oS2=7UNtc}qMpsLI(YP;<3{y~2bUvoqToMkrm#LydHtWSKHk#b@=N z0124NFKtowGNr*C`c3C`*SQxg_$Ir%Zl%HQx&#L6n^QUDg?^3up{==ZPag^sd3FbG z>SFT<z>Dn4$Rf#zDz=GSUdp=<(f=*~p3v`T^AZezN!?o@nnKC4yAarA?#p<pDXDxw z_R`cl+3Q|38>=%NU!hSLl;Qu4FF&f}NDMQL%W#J_PO+Ghx*LZ<`3-Y57VSKFn1P*V zQ~xop3F&6=O$i!SF$H5PX}UNskK^FeBGY}<^HRpeN*w?5QWmeb_T6SyCH;wf4Yr?s zQ|0WMEJ`xdt!rKaZW4{V`bD5O8>a#oqa~dA-$q039qsO$^uPl$=o5N9=<6>&z<X62 zd@DWY%oa_ipM=^?pWbkzo#c?+jKB6PF;pJ&{zEjFGhCRZB&$SvNo%&AqZ}87W)CE- zi#)x06L)6p$nxOxscVLeYA4_*@w)!aap~1;<@Ao<R@Nibb2_DT;)lWGoj9}RQ!Uq- zV&!C4S8ohIvy1NI7f`X7Ah2HhVs}5UMf)`8pCbXm-{p|PKqvvS;C+LfC2g`Gx~x*d z;WTr2KXH96?K`QU!Pmje*ugSVL1t1x1X(O6Rck8mOs!jy01>@mUue1!a!mp|ozOPt zyM$lb6-!mTJ2V!Z{o!)TM{!tg5M2HqNxb0;`_M<MPk$`#awwUC`Qkg4)h?l)PdUn= zVZQw_>RZia{w0vRP1vN-@WdxWg8w8Yc{O)wtybdts)AB&Zv)@yGhjmu7n=T&J0zNT zBJ?;#AWV1<RevrFaozFn<mcMT5(fUC%cZVJ>prv8?h(9k;fLy7%jJRXia5eLm~$NR zuYHSgJ*ZYVs(emkK(kNpgY8+6j3d%O*bn_-)JZb@vp<NTAQTIET~8D9r5%5P|1w#G z@KJUv$&ex$E0>U>{wK*oPa-U;Yu(bG$BmqX7=JhY_{&L$;Ki|N-mlCDj}F@3L^?SZ zb<If_-_^(kQ;qfICXh-1%wP5%s9|&xY6>Aa8mzw+5Fx>yr>KsVB!|WhRZx>vMe<A9 zfzC=~iNY0fh@_hJq_vRDpVMYamH%ewq5BtD>A1Pp)j!mk8ij%GbgL~X?%LF_o|*gv zTnT_WKUjkbR`9+Fc~LG$gF<e@FWY2QmG?DKS5N*1^(?mGLfpa1`q;8i4=FiyR~$jm zhj9w@giR@rp^x(OC{p8bACVJ+sO0geGJE)6e~<(%G#^nHmYX|0PSEFlp&a8VsH0Si ze3d`Wzm`-gfN|;cfiZf+MlD}9nv{3{M^3H+ZaQWz#@lqF;X7{(5D64Bq8FJfauy5d z>?2vI7b*P*8(KgLEmL8AMursxQ_BcbUrlN4-(n1DjfyMq&g$8a&{-Gfjl9ioH#}o3 zsBmq;#-J@(NOW)%R9GfvXvf!>|HX5f-@Ub#@fGcs=o$-Hs2)P}wlK^$;?E~UiMlJM zex6B~`U^RC?AAg&gp&9)Jgkz5v^+9@DS;;Lun>k6+>*kRSkMU>#O5#rbcdWd;(qrq z@2k_OeZ26uFGmAMk@vuBFK3vpJ8N9U>oVqGeu-(OD3)%IN?}x?)$D|R$t{y$c0@s5 zzQpF#WBKDVX0W}T!2Pz|fiW0p7B#bIF7XCAWK<~QKato>1}Jzch5o5SSC08ZFn0o* z)CZTe2?Ha2B7l*;Q9yS|fU<brxFcY-g>GYBJ+dU*n?SM<uls|-%zVCQS?T<7l~{Hi zSq)w_1vJQ9o}51jB<y~rfDS}C#YVDeu~@+cpBHuwVZUJMp7pxyst0xoLTTh#Wt1dd z^kFjzdrp`h4gP=M9sny)?TnX~1_=Yl=2&F4!SD}iC3unmlS&xf9tITrl59v%E)t4( z0TErCFj$#?_1{|i`Tug-2aft%?>e7@ZW6|;mCJi%O{_kBKr28zn)nk(uRKwwdjCgp zoJTp4CzNMNZ?JqyPw0bkJP_GjvXl>q3M<bE?bP$3F5j4~&YBgBVLv+(@K_(J{yb8h zI9_3O;>$MT>sN9lV03tOyQh8${GK4<GNL+qk-1}-2dt;4gA2z2d%w!#%{kE0DWtC^ zhc}_sNG*a?=K(26bgGy(zSj1!#uG<lhfcOF@Ap+iCdwW7SyTQiu|ZJ7B7*F>N<fvG zApmu#!7ZF1Eh|!1vf4_30^cYgN-jZ(2O3c`K$7zH0uy5D_!}#`j>>Bs+eFP;5VFVD zI&1KPnh1`x6%7Orj4u)smdhvS+HFq8B|!_8&NTviJM^;|%nua2K#}w<j%;o8Ij(q- z>G01=OV&2apYGkKe4#JZ0SE{%6if(dYjP#XBX(i!qUmATdj13hwJkS?U1Z}s78*?x zqP8BChz^2h(L!9sU=C4;qjN6PPoi*EYE8IMCQ#HW#BdL9Ze~wlP-v?OllIYQNT3^K zP;gz`G(s>J#qidkj7DqmeVBKsw2*7Kx6pKyft!InW4`<+gAYp@P+%`jt{2bm9t-@l zW;2ll(>yzxLBJ<JV75it>y%Vt@ZPUHpmV)?;mKgkLN6qenV@XZ;ZrH3(1`N5V~rP4 z7gEy?H$(YfjqROu2`H4*iK0<c4bZ3obwa8r0Gbm)A`>Bzn(&0lz{Dd<4E0c;JumO| zFkw91IXS;%LjR+Jz<O^35~Jt<yW2_+FCtExU(Li<NXc-{G0*?1p*}3tyoQ5o5Vc() zKlziv^MRlA-{?&0_oaJ|06py4WmT}5iWBGv6XWOzuL`mx_DJ!qvl6s{Ozz4i5Imy* z&H8A#Fm?{;pSaZ;S)`CEL?Cc;qzXL9dPpby5_lY7?HP7K$5dEG9iLqQqcc(1k0m;4 zjZ7$DWKw{KShh5-&8&d+FZb>L?-@UmDnZ9^NF)G^u`upZl3*pChX)l}A$rrzcFd#> z_38d<>)=XDeWH}W$H27gnb@Gb-Emd4l*Y>RqCcJD$)oW@r&S3+C@}i}<xfKysbUbG z;8&<Hh1~>zk2709G9(trfHVqbt@i2(n*(&Z2~I0VIN6&FAkfeBK(=t6306ByHG2wm z&;L~!e|VIHC-@(>bnNRE>XhgL3P5{XkitUVRlbi9(y70{aS!7A`^RX_0Sfbdtbdoz zMM|`1^Cp?=mp2peI%u>f%u`<Q%UR%j`8KsU|10g@e^&@J#D@%k<)J;g0Ap$ho|ZeY zR$-C`)JqboWl^TD0btMoB<6tJvgtSl6AE<D;>zjPs2!YR^qZmji+pp;lZheL4r~64 z*0)Ri1t7`ma-^9$WXO2%|JhzbB`Ayw%=7^^URDNDmxPjJD;G2u<bdqTUn~X%_CVrM zt!e@p$A=TJ6I9!Qi$M;`jhYp}c(@yR>3Apd|LWc*8E&zgL?G!NcWqEOo-PEg37M~g zflvSndkT*=bZc<{3^|=@as=Z`dX{aXI|nb(Mz1}xj^8~@i<UI6f%as5+)Ej98GME> zR$_%lpZ#LVfnk96iZMRx#7EVNn$<%%5k7B{=#yBIYQ9#enUl~HV4?(uy()YSsJI)w z!2=Jd!ZdWW3Y&$spiQKu<Mt}qGi)c{z)baPP)<mO$^tnReZ4D9shkW@A&<_yQF;9> zKsUih#AQWU2RD%4O%(%a={!fHRlVN2z<R=IqUa^A$V1y+EbUKDPWUmU`02`X*!^19 z-j$=oq;C#Su32tUZV&Xk`Q@LfJvU?Y*NE=1sZ2>+Nlp9W8;Vw)P;lW5IfRL|bX=qZ z@Y1h3bfJ;R?5gC_APsmX`C3@BypjZ>9|yd}0MG=(s0mBy*3bv9=-P;Ln!g*>#~OLY z`5$sT_Sk+QdjFK%-I3g#-S?&?;3?>_W5<5~2!CHCs%W&WW#wkoVW~y*Zu|4J<?@Ar z>&s~JLCR%}LMnC{a$iJ6%BVJ|wmvxOLWTPwc6p*$^}DF=--p|aoj@T}0D2(?0PBC! z^Wub%vKN9R3V||T;Tl4vAdy_qJ4xtvDHt&3FAV^CCqp9bKffy(cOS-~thR0a_!}gl zl@KyOce|gE!;@LZTy^)y?qFcnI4n)|=r<u+e)roM<z6?<cr4Vr$+VKEe0*D9mh|ki zdbyI7&+_Dyqyb0xL#jr#qK^$baQqi5Crx-!a5!4A_QTv8b@iP83058Y2Wi%dN9a9H z>yiqhI|c|FgbTt4P1lr;W0=2e%z<!5>lC#Bl^RgVEw~113EqnV$f^~7J5;!EL2@ur zP|pP}^-#kSB<gR|Ey5e?=oH`uWpt4VbR!H$1@*1FQ)p5@M0yXWYH8JD6ss9SemH4R zy^ReK&5yZOi4p%}IsI2z<ge;ZXT*@CI`L%#LyStp`|q-8FtIEIgol&n!-(>Lmr*~Z zXuAE_AmI1yZq7w~KJFDBBRL}zBQK+bX_49>oA$Xev8Z!+SlGyS@mPv(W+8v1B$O8> zh(Nj@(;y1Q2GBOPAC*Z!&M`BZbkMI^aOS6X*@^|XX7sH5t3)?#@bQ|Ggh|s@CS-3m zf&^f*8Du{JVm)J*i_R|l{U%-iuX5u@k5CQQ0H>?mekn@2<r?Q{<h}y$O@+FYY8BZZ z)v|2LGVX4Rn;4p?efPyII?(Kln<<8h8HPpqfJzbuebf?$Sna>LC<r<JR1gf&Z?T4_ z2Gw`rzdKw%{eQg7Cd1VVU3W(2j{ZWY5psAKl^J!1DnKVd@PJJ&qXg98T!&wyFpxq1 zUXuICiIIa}QEuA;s17(@AQSnTu~MYI*pk*9`g)J(>o;7i#^+#DqX^KbqGloZKrvrA zBaGKDn<haT$6<$esRlkNW$XJ;`owb)?3v2IcBY-`CNy092?LE#@XGw=w6BX;JnuRS zgW`tka$EZgzU7hcazoi3r?n3&>xq&_fNWNqz|*$%OQn7eA{qkr>k`mGtl$`}cOfPI z2NN|LwIDbc@HJ2C?iv9UJPsy<;E_4W2KUmGCgdjpF-luD&IH3E>F~zPxY9wrI(#F} zuSXfi_sr-M^-?Y48K%Hc>3eGBT^!3o;OG1~F=ZB6noreXbnnJT>^LKnubrbx5&cSy z&?|1^tgBC32<{3K5%C{mV;4u?yQ~PW8r@sY#9j-Ytep5cJx{7$>jhl4$+Qm_EDIIw z@hwgW*EH;8P#(7|w|TCo{qQy^BSRo1(122qyWymLW`0aXzzo(1#zTg?@vG57gmS@! z&brVDRD(`Mm<9(IaRQi0D+c%i`5MydsFSei`GkUar-D8fGAPEb3%yj%sIX~heTl3| zv<fxANd8ugl-8@kFWQXWC*JW!zF~783b9$fTO@oL>x@hs`F^Ep-Jp3xiti^_p}b@Q z@%&c0z`E~|*wT#-M@D$&kAq+KtM4>(suc>M6uyij;5~;N3wQy$Ce#lFyoZC`WB^%D zF^2Y(*sBNkyS^+EK-{;~!w!}VO~jA^_RuOB>nVSqVTRwR%#KQDdpsF9(j8BpA2&*4 zc(ZQdW?J=R^`mKeD_MtkNq6_5XZ$J|x&L&D4b#X+fV*9*)uLv0{6@`WZ$#8i25#}M za!DgObih#;U;Khr1E4LTKqC^F-0?Lbr27X9v?Qk7SnM79eD5eXV=V74M*ACBm|$dc z+=JE;Lt9a7?6JuI(fI%A>8<0MZomI=1f&#^ZV(tXL6L5x+32x>G~OcJ4bmw{4n{~L z12(!-32CH8cb7<)g!0{ezdyg<9((Mu{qwr6*Lht#=UmV8yq;&t@q1c^Lw(7-23qv{ z)n$6nhh7Pro_9-Wj~loNQ8aY>1i_IHp(tG(Sj&f!Y+zixDQmgEzAZLy0na$;qYALO z%evY`@AJ=E#nLFv=U8_ho!>O4X)+MkZr4(L(){vwM|Hn>p9E!J@d={~%Ho+5U9Qxv zNWf;{?bWTrzT}Ue<yNqTbhM+#Mev>&t5kgYqJGScg7pWc)Q32)Iq=YvJi)*vnaPR= zs%VV3@*L9>uv16#A6e}rLnIvCO-?GVix9+~{<6om>1d%&hoMan9-53V?IoFg;YvGT zcp*3xuy#z6vx%te%AWSfKVEE&`un|aT<pid^9NpB18id}ViJ_E;>P+`yqzR00zA?T zC!C;;<CXI=m%rMXq8>X@DhG%<-1dwQ{F}XvRRse@Nb<lUeMiJT+*zU<$FPm5HR8;P z4doT%Xx74Mv}N6!A3d-E*3ZP@iggeKdpNLXj_P|gagKV?HI!?3+6?jc(SJPLC1M@D zt8awI-f35d`$VA+@hNaW7EGhdmHC=No;{$dcWMg8Re4x_$Onv=pfN5Djj>sx#aGhk zg1>(D%lKJ1z><v^z_w;{0krs9|KjV}_VVorJiN-VvxQ08Jm`BCo5Pwwa>D&e5WN%L zlOjmOoRtisAq)?pTdC<y^g<Fo=>$zohHkHc&xjE3p|`Px3z>9eBVd+jmY<DzZ7WE} zR%4?AEe#6(<#8LDF6P?I_NT=ZEYcjD;)p7WEO4a^!z&*3%6u-zVt{T#v7UYR*h}>@ z(ZIwRH6)i7$Nd#*@<ahh>I)@C?cC(d3)tB}{X(JHr{o&QXCJ{a@`;v{PWw|HimLF~ zEUJ9L1f9=OjqHT$z+NRFH&@8>nj>b^-j6iTGbg#9yMgDsy50u2*+wmVYfp2VP@Vp& z$=<2!QdwZ1<JgZDaPZju-}g+0c%MuYRgvR+=UGg<q;aVR9WT}ge^T!bWfDw25m(52 zun+-$s|=ENVyP`D(;cyY2z%p$c~b--JeM+f^jzKWG0^XOUV-l3V;U^{%dS(8UWr?3 z6ZY3hG4W?PcEek2gOAdlDRX=VudhLD`@euIwK$=2y%c_(_3>cGgvBRr8exOOJZ{-B z9vmu>Kj{@QQ=)O?36CRUu?moTC_q$wo%$<Lw4+Ixn-)B^tL^^FW_}&z4e8PmO}+I> zVtj&waKfgq)lU>ON{^U~#epyx3W<KL;&Is7EL$-`qmPd}J`%46cw;CrdYa9eOKVIN zvpUmAQzi1{vmYNsPGKzc+b>(A*MBowCO!WOG4}=itiEe4;Gnk9TUZEGc}dQvhoYv+ z+Wt#dXL%_6=n*4sXS}8Av$;1<i-xNoYZ+!i%z1Ub#$g*P3ghZzb$!GC{Q-yNFK^l` z?n!?ECSsXX91nX|W(plra<1nL^kj$r^kYNh(CO}F<bZF^Ko;kBm(ESGl|i?(ke6+N z)IdZh^yeplqd9;LsYqc&z^(jDYu?TU9%vst{7>PgS5&8GGa22%(p9U}(aKj-1N8B1 zPi>41z?z4`7aR`8E-;^C3rV^!kSGGE$S3v6@!+jjLtI+9>lRk(HTAWPjkR3lvd=U> zYn(=(CJcOq%+D7*4Ib`Oe~GhvOw@UD)-z1;`>g(1E}Mk1M7`GyJ{&OsJ?dGZW-Z0J z7Dt%r)g3T9;wmd!Eu9<}#<>@3d;iTO9iNZie9bQTw9iQU_pkOP@0LUGXhm|{c&=R) zwsu^YYVrWL?ZHv-<a17r1Td*067%)NCNw!M4^!DL6I4))nUKo@hl#Ed*!AW^(Fgf( zhu3uUevXkCJ<vmg@cfi*az_I0PH1R$VKIfWor-Q?iq9>6yZYn%qC?S{x`XARGg4=h z3^qcaK`z5bTAb28RV=Z(px!CL%l8k|7ir5fe=#y6{4N+u6F-}GSXkD8pX5qWv^ix> zm~=_I2|EToX++9KBopu%;`s1M22{7f9t6qir3AQ)7U$m14nLYjw4GUz*30ukLJy8q z?ss}R0SHS{I~AyY$_lP(?m)7lC{wFTx@mf6|GVw2SC1ZHM$9zcv`RRgEuX>adydB@ z7UEOoYET|51rTk#C$cZD-eb={Xmff%_fX`B97QdR*s9LWZlZAa{#!lNh-CnZ9{K($ zfIh2GW#v-bHWQKnSW3jCAC#w71N(fY>hQO?&FeMiD_vreq?8*IF9-O&OLn-IBvuwV z4-S7G-hp(MT0UrhaTcfj&+Tx{7QoRVW&s^%3plh=39|!9v5X2Egvx_0n?lQ4@?Kgm zhO};2|ItTq%`D=iCOybSqV}js*)`wmIo)l^gnS$MwB353o(E2M-ivVY>10PtYDO%w z`p4rp%`Q~9o480eYw-#OzM1Zl$VyKmvOMt_`<htiVr2IyCZoCEgNw&k*hrVHHD>`+ z5zJSbRAL$0BI){GnWMd;syar$KTnaBm>TO=jAp0Ha2Gs-+U(-MJUsm9LI}Nw<av+H zr15pcFE=wrL4Tf!{(Xs_2tJ@lg4UPuvl6KOgVuccCk?iod7B<{)D{CDkr<s~PdPdQ zL{8fipv*Yl?$#sQj;YUOFJCPH4h+v$N*^ET(#HXKJ-@51-6-@X^Zf%eGrYQ*^sshe z8G9ZC9%*IvuHAT@>Lo`i-QVKfP+fZM<n8TkEmp$+9<+1dK*!k0Y2BYh!1V7L6JY(N z10oKs*Hj)*wQ6y6GpYJ%;pI`?&@f7sHhrr9^IKh$j`qD$Zr;ZAb@UGhi|UtEHha}~ zF`wQmuLMdgyc_pv?~qAbw;6UIE(w&<woLDQhM0u^Ec=o8koX%5BbnL42X)<w-9JtG zrRyStnV*eb>ySw7^~UeF%3j?$+(o@3#xLMc+I4s@5=0{*nlt?aVlQPW*5q64b)@mg zEX~J1ZK3h4zEke3Q7osC(VYK!HQz6f3&R&Yq4zA$7LJiwta^Cc1jcVPIA-G`1~LBV z)|EkydT#XVxX--r4in78-5Z*>@Qv*mjjh#(nk!^q5xR3e{OqOUR&fKYa<GJeLVv)} ztR)X-Dnbt<;=$gr3@&8L2!cfclt<pQB{O3IL=J$uWe2Hp;)87VN+#{TDPx-wTQL`# z>E0Ya{{3d*&(Ow5u5rqe2z&&55(ZSZ{*xWWpS_fAx|Dt3jf9mC?BEyjGo7hbc&FYG zexsNRg@iiGM-!42g)sv`^2hp~UW-<Qr;ygT6Wc7~vFG5Ggpg&|Y(@3QS&X$lUQiW% ze@U6;AlsCyP-gD-1dWFZcXCgTbG~wiaQ(pR^nS;F@-$Qg*jX3ha(2O#OLWzN&#-fY zb2Y>RH&WilTG{$Tfb87-$atr17UjS|r$^T$ed(WsRDa_aDF(%pX3N#HaqH_<fM1_@ zQ>MbTi{}>J7(JE!Jt4l6P!wrS2ErS9<{qNSU~9KFmv|slG<wZyZ*4DSEEQV6m2T_q zKh0##Y$a-7m2HXBnO|%D;~AVQ-rd6`{dLV}!2ta+^wAqtLlaj|yB<%AJ%uc=B=GB9 zozpwu*9zMu#bOAl22vn8u&BW<4|19E7RlH)t7%|my!jNt_oT!>eMzo_rS$$}mS^`H zc&xIp^--IFdA{tqqL8os*S*O3SFO!|g?n71DP(60K|f=3h~;MS$yj0ugrGld2#iM& z$es$9mF<n|KM4_<CRO)UPtT3Ah6W@UBzW0pquti#4T|Z<Kg|TJt^Ycd@Y*Js5ixEb zksgHW_gC!zp1MPSJ`EeJi#dBG?={p<$sWR_^@3>7{P^Sm99Jkm|3()E>#QgNmTpf9 zI3H{2j`T(Zw4KG==4Z{HQvF3HPH8o~*iQCmj}P!g-MMLjT&EL|D?zS+#hFfSCy0+1 zL%ZR#Z=j{Cx%{o<8C9l*^nTgg5x)M>0pt!<%H~W1HO;2!pJjLJvfJhFw9ck>W!6(} zKf!JcyDKKz@utmxyKj!6G(xZLxvJ71^D%`$8M<gv@SJFl1xcICZ{vV6V)J~fq#~<1 z?68^3vz=RejcJ<9h-gB2xNd8C@m{1juSvf7X_3GJpV$K59~bBS^GDu_v!=FP74y@F zHw{is_6A=IYR&%U$=_UomzgDv19say-YR`@bSbxWiMvj_aI)@6(y&!&UiGP1<+y7y z!G<cPA3CUPGSS>{TDRnoheM<0l{Wev`*Sz=Zm-$6uY9O%C#?4KCJff$r<Z(2f}=fM zJzJwM&bTYhJnO`(A5dAmrSQJDhy^pq@<<G5%^f<^u8T^n5hWWx2yJg1(|KfP36E@v zJRJmn1V5y|W1Y!eZ2aLdz=pfUl#Ez(@zh)Ov8P=xLqwG(oX8hua^v|%zaPj?Ui7A* zWtK4S;Xz3!tqQ$xn0^el+tOvTnLG(Ql+4a#ZtUrrISQL<)ha9|VaUjeyn!&hl)LPj z$rqA~aq(RGaNTRLC)_bZ_KdL5EFb}e|3t97b>C5QU*+N*Up}qL7uu|b+$9Sjb=(u` zi?Zt@*kH~J<54v@Zgy7qW3GHop@qeNSe6B?5<*?_E;jIcemGNAtn^z4@ViHl*tlvY zwsc1q_Yw6S+0+m@3XoQWl?Y4LS^a2Wz>J`IrPQ;ppaFCXzdYsjihl)OEMQ$mj#zGz z2GZWOuf{96c*K)&i(-4@o82FyN9{*)OBveVyO(kPguVjiU+piN-Am}QZ0e<fgVLDo zp7K2vqI~ju)XYLXYkgOE1nX}9G*&lk{1x=Q4Zi>xUawGF_3&l0uJ6%%$1X!31`z(P zRm%IVG}rTW+3a@bcaS@W9Ix0_=4-b%IKKD91eK7hS2mV;T;<#A+oVqliSI8A?4K80 zbVtXJjEro6D48|Oh8_N%(>kw<4_?{c>bc`M%XN6;Lu`WyOw{d5O;&>S7)4f}0hj1) zDlit%o2ilqQINe1a>STlhRQ-7X_EmGVh*UkP=?2YcjIx~IDmWJx&>-Kc>WOr3z=l% z>%=|T_)a|-_B{O2OmE~kqr?}n=?tfmSElB+H5ESqRsDdf4nU%eRb!&R;gIecv@47- zx$`k1az2<*yE*Y>3iX4h#=Qf#t3c8GNKGyNujN`1>Vd0n2EwC9s!BNEV<#Qr@s<5Z zn&lDeNHu<&naf_XsHVHC(4T$#>Y+64T*2`l)19eGHQeH}8O94icLv4Bqxv}X5;zEw z-?w<*hF)6fi#8VMOcTlPWnhGTvNzb}g8eA_M{wJoX}tUjH{^sc<gOOk5^(Mejz(7G z$j+^ezWY^93{d?50Kmg!20EuY1Cv+aO=suf?of;TqYq%t;b&04v85?nC1h0l-NsH| zyY$V)iCoUz&CmpQ!U_(;EdN0t1M|GJK<wkMqKfp+Idwfcy-*4^C<OzSUXl;_LXNQ0 z6oY0G<U@gxsJd^KKg|Biu*K8!F#<)NE3w+6@n@Os->p0IAH@!0{EYM!UVD5T?e2Ha z;r5-Pc<e}pL--CVxcE}_6mmNj9!oHvC&i6=&56it2s&aqLQdd@{xi~T^8B01bKqdJ zQ7U!zsb+VZ?=9^Mf*KUg1<mRaVPaYi=sD%jD>K?)_yp1*gi|(n<r8Z11x}_m!eo(o zm3~du`M$BZa*6LfhQ7I3Le0&v`TAn(*Sh}U$(^vpcvq5y0qWjq$q(3Rtn(A)vG5Um zMOX-F%mF7v$|K)SJw=@dxv)XeDkT6Wd=LTmfT#0?mf*^Kfg;@LofC1*LSYV=icPR8 zT!;5@K7>aB`7|9|#Av4(_7<2?@lwc8PufmoLYS@yKFax@X+&o8G3pL9c{~P-^WOX~ zy789yo{1&-K6>+uEYZMBt1`;0Sos-;pj4+dhCN1cEIQ?m%i%4tJruL@(%?$-lBLwU z_+ZGE|7ha+7Y+<J37v!5V$DZ}`@Z?%$rh>nKANs2YATN%xjpD4mn%*dw8{nMH1Fv1 zX(N=4!JiYx5FVRmr4OqOhA_Hh;`)>2SRSMO;@*Mew<2Qp$Ddm{U!MH^YvP+p^oy0A zM@lb{_|5u5pEW3UPZrDQ;v5Pt3CwwR(K@sH5EEP~Y-lVX3C+tz@gJE+UiHVSz#mHs zQvC!Z&2g1@D1tvGf4-4Gnau<|st_ba3m6*MQM?J)iH`es7pg%h1r0rGHP$J5;bNlh z;$i63b*~fR^ayNjv4*KNcy8H$S_;20CVWQ||Hvg<{_oFeS+3dG?5~I_6;5%Wla^=O zOrzP0OHug^nw*2yhe(r73AZ|&S$&<lt6fAut<_=HPKH~vQ8^)k=m&D~<H=_MtTsN* zvp9myMO+$E6;9{iHoj{W(qvO#_GNGX^vt2uNpzvvL`(jryKQU3{DQA>a}>)?7UbNS zsNppf*!oy+PiBtK!UyX^3NQjYK+-TUb~kBHq7p@P!v<O=1o;6k<l#xltKW=SxljBW zmwzU)ar$UA+Ug+oZrqYRIk`g0bW7=q<i!!ktDRm|%E(SK(E%Py)^9Ejio1mavKwuG z{&BmUXy#}7)5&!_UaY`-`Y@%9Z+n^kB=9nq@Ym^Lz&@W|zkx@|$^myA!6zv0R@{8( zZkf%gLzi^1>waiLmXrx3-Bx^da}gO{pF~UrCfM&cRKa|vUP!w=lJM9D6J#n|Q|};) zG3{)uL~e~9bBA?wO)3v}=YlK6sygJh1Q*i5EqG3}d>~M%a~Y-e(!9vULXXx^0}HWq zw`}GJ-=rf=M~UO}_pjoa&puaquH(0ps?M-j<qlcW2=4ke3;VHrGU|R_&gbl`@uG#~ zw=ZrE$8po*j51P8tejC~Ox=`G1z`a^xe%&<j|WrNb`-5!0Q7GHqMc&kPSRLslHO5r z6scp&p@1a4C}NClb>8B#S63<TMTHZNsuA^;2=}`-1ElN=hF7w%RhQORymv~9RtOb7 zd)&<Ai@q(c+?VU0#-lr!H5pui8<X=o+)`rdX%cG&4expF3Xd*pRYE~PPaAp9+NR$m zGQDzxeSxO{3?V)|E<0e<wYk>2`Cy>mo(k05i1BJs3jEtyNBnM>_)@f?8>E-D!=Ekm zVE|~HW_s5DT3^)Vj9~Q@ZTbPiKR^8?MmL%)2L5Rj&uq-p%x7Jp`OV`~D7E<(?&f<v zuDSb{A(oD+bsV!D#yapBCagx#Cd|5Lhw0hNTbmlZ(=Um?qA$Cv8z@cWJQ7UlTm_?u z$AoZ3CBC)~F_JYfxF~+X2r#;Q{{nH?DtW!V8+Z3Vgo|DqzN-o!^If#rCuP>gjBX!h z3@!;3hKmz3L(tRwLB`)%>RVhU2c?tq)?a;i_}{W~5>Vk329o!G9FY;9>BII?iFy5O zevX_-l!j(v`vvh$(g&lDTCAzTG3RzatJT01?>|V^tCVFD#j^P8X8H|Y2@O&ioTeEx zSPhnP()moM7g8|P6Y+f<{*=2TH8eLE^BMqG^LnbsM>Mhhh9LK`_;96ua9)9ykC*Mw z-s-a=O1?e{$6h1tn{&O&;mr2gfZb0W$+}XbDOK9FZ+OX#lN%khi>E%mmjp)38~Txo z*h+2Dz5l>f-vA@_o+5d8{+sT!>{?%cM5%zZbK1ze3N#!ItTHv_d-+jrwfIBIYj(H= zaQJSFf8Kt9-tJ^?y+CiFE8*(qg|oDC5_moYHMw+s{B~zl&RfRs9Q}ON?0p3$F=pa& zjKAR@=(Bg{kwrNX4qwq^34pJ@mL*oT0zLvDv7AD8__z-|AG;nQXhBo+w>1q^ITK&e zI7OHn_Wxl?>4gwgDV~jfhBv=Lr8jM+m?ZrHSd<D_PJxa%*lj8H(s}NbEIOqx2AhdN zIv#w^xzIUaK<ae7C>eQaF%yIC`P|THP~9%oDS(g^&TBL4<qtiiC2ckzBOS{B4>W|E zvqKx@uT)AMXj4hhHp-8GKQ?BFOC>bSZ)vHEH_-3gnIxtr2{Cz5f?8AbuI+IV%Wubz zTYI5i=xD@$=M>QrVLWO@EpLu5;oW%U+DuZOwV+cFBusdt`elb&=aEE@2rkM$@94Dm z>@$N4Eun1(@4~{Akz;E-ScbHzm5k+X=_A;b2+?A$hAdWr`c)KToNd^4uXozl7=GR4 z-YcM2E?iJlda^))pmPE<IRNOtZLNn9y#FJ(S5s``!s%-f4_j@s{TlI7e<H<v05&EH z+flnu4w^6{j)!rv4$(mXguD`@E279@+b-7u$vj0IeicUK++E(Ga=@d1eSoCJ53a`e zX^@bO4gtaQ`NvbW%&%($-7rs4;bj3~jl{tyXjw7Eqkj>d^e0-JW%$LITS`9B)tp^b zL=L?!u`&e-SBk789qEZ57B7xWae~^4fRPW9EM4GgSJSJ7ITucmOI(@frOOPeQEqWw zgu&V24pN3+a>q;`XhV&LrW1f$tN$i^`<<w8#46M;=+sFU^(cE<MjVkNBcihhI?_eT z#e-F{MW6~Vn+{buE5<(uZ3wm%%O!;4{m>@CHYa=F33mdDNvhi_)(5Jgn3i>I9jgZz ze6AT4kk~!!zp&*05bz`IWfeRvAuPXy5{X5`oGgGcL6@7HJ3#t(Ha_kMvrzDT2$}_n zL7PmhMh2=;VDnigGN&&;S3HEoiCHuR#ZmezenKpe&{k)z5UjlMR)Udy6snH!U*pil zze31LEb9ZhQRndlEh1y2U8r-}%?sV=zRI18B6xwdkvAcj^Z0OS;pz~JwEE*n5X(Go zw6Ds>&5@ZBS=Hg*!y5Fy8tPY+JQkGbmth|c9!ClwLeHV|lhQgD>q+@4Q3^e(Xi(!a zf47Z+lLswwRdQn0sL;-@K`%5aW%ZCz1BoC)O#hcYFT5(k#8NuK;Egrwgri4<|Nn&I zARuHh#cY1FyYcM=^YQZ1LQwnFMA+>g)FgIs1d8aORzx54KKgrqeH296`j_>80wjhS zCOg!9tnbJYr+>QVer{_Pj(=xT4`F4Wieo5^C!Ty1Z-)YZv8sQE213yKXbA5KT*VOr zGh3ge<8FA>&}s4G2?3takB-Og)`wqfk8TI~f?aO|R!p~_2+<J;m|)H(%y+-B=3nn+ zxsRGg14+l%mM+u~PS8oxm+YWsN5J2gdjMiZF{eYWYlezdP+=~>4->o!3fRnoU~55R zAx9oF>*^0;{>%)L)jLU5U=@Lahd)6PIoIib>n36Y;R{pKG}KBj<hNcc%Om9<8X<wY zRQ2NwIDDkQ2}&quJwzmbe7DXBTv>bu9WW{ZV|i5fzb$#l$!P6)Wo%(L&M11p$kLxu zgLV}LlcdovYqnHt;<`DDRR@cMzKbL`-GZ7a!CffOI>>WV@-_2G;a!B&A_VQoTk6Dx zp2Wo#A~P9Kz<?t~2X!e~WROQ>g*0iBx{id7ZWVWc&6_x2eM197TyNYoj)kpGhE6rM z<}|O;+xrOx?{TQ%M}gN0&{S#VK+=h|+`rYeWksk0r>fWRURp3kdvall2fXmA>5;bP zlhdf?YCv=jpdn@cB>V95!uu&Ps@uv`R;-j|@UUhAThpJ|JaD2W1ym5)v}Hj5XT71m zUPMgnIRbnxq@la3N|DG>B3$yiM5E+QiKUw^vX5+aS{VUm>4>XIk_kFwYX$$A{m?xy z-^Js;X70{7bn8SMBxf4}Bvpf=()2h_vM4IS^=gREAAw5**daAFX{qlzxqn68Un+u0 zfb_t{)6yR(h@Kwh%>yS#N5==2kAY8tl)&lvQcMh?OQt$P5J1^5J3gxN?cVQ0Ptsw` z_pl}*kGipBnnt8@3%IL(AhZH<sPUTc{>Hd`3>Nx;3CF=rWjH^KRP=nJ^-rvA-wK-> z8TN`a{~PR=S8G&M)B@2#@UJys1UQnU@#g-d2a0kjHy%N!WR|&dou^wLc5bQ%_<uh> zYkwTLQ-67icR(F=b22!73Pbt4v;8QXO28S1lm)#*8PCEfW?C|%ft^NTI1WzIojf<= z2L+)rkrtKY>{oe$`Tyj@^Sk)l2iIKa{_HyK-jM1DmROd!l-{$Z<>WExk#3d3L$dOO zYgc4pr@dB(u^;4Y(&r6VZqJh%VrE+Uqx(a!H+)Usfnr=`eR5&Ibl4X}cHzn^H>-}( z3#@9rdu?zXGIDCZ!m-Cw`PJBLAs(W?ps(*v7{t_g<7IfE+4I+`=ecG~fI;J-<Kii% zr{?qiLVVnTgfrfMJUbkEc3mXl8$@qk3WJCQjes&Vng)jIuf_>1mkOV0VJ!voHj}PW z%=sDs+?@qo*4H;b1^o=#9*&RU;D0Zo`Ci0e$gTq9h8QjNr>YE8JgqM<`a!Mi`K92d z=AZlbJ<mx2X;im=Ydu#C0JM#NNw$W{Ka4sreQ??zvTkg<JK}HuJ(HRy8)P?Xt$iTz zbt`S>+wI74&ZA2<FVY{h|FZ0Y>p3e+3#nkXg2iAiO8WuR{a$V!tTO)k323i#U{3X{ zHWXWBZwswIRLv5Q=-S)Xy;7Y)iG8D6xN7{H8!%?*xqf(f6VG}t|HJfE>%Q*1t5#h; z^lMOY%<XNU{nSaSX`eAVeyKvztMunrV_2V){?`xgGatmfzJ9`-cP-4A`|Qk*G*%w^ z?`Q6;+}&KSm@l97BAMH7e>Sh=thk<kvNmsTD-S&HscpC&`=3d#lded`x5i4)R4@{P ze&Rs^mJTd2Qd}R&&KjJ&xJLuyeXfhlfT1BOyVQu!N?yy%!!^q((>XdBUpO=@XX#k5 zeGns?9_Q1ADn@n$kXR?4lKl(_^SkdzsWji&n`yb_S_+`7FpH~I-PoO;ZJoTVa5XL- zoX@XYWEN^nsBz@@kxl5a|J3ut>zPHVxyf>;pG>V&SSe8h7U|pZO>J4Rs|n7wPygv& zcHHP3H!n)V1O<fOiAJvk*MbOKSfYVz&RY~P;NNnS0`Oia*%nyNszwmBo?}n}&WKW1 zwNXvd?jIicqA@D11hU%Ep~x^yc?0}Jp;@Hcbz+-h!56Zg(5=&!PZYDjs!-h;z{8bE zsjQuOF6{np_IS}YU`kFS0Li5IucQ@@MSxEmP*?jk0;6DHOA6Z~f5I(>l&vfUKKuyu ztpXaB`F)<6i0lmv*y8>3e|m9=oZ2=xeFs2JnibeO6m;sk2qRt9&j<U?pML~g@u^{? zNlpr*x|6p7Il`3c9NL3Q#Yx=AL_owk2mlIsv&b5E&Hl<<{3of3bV$_@t%r}lXj-3x z_bdI@5D`6LP5O&8KMy%+iTc~z|8X>*sj{?BJHD|iU&w8rHmxg7f&T)&k2wIAdzF94 z_>)hqgn<B|$hin~3Qqyp%nYIM!W`R~d%?u45X^@qHAehH7c*`Ca|-r9f@ZJ@Ic%?N z^G&cy>D0Ct!i}59@kR0X4KF_#C&Az|L;=_~8u*?QEzDuKZ)P~HiD03DA;lrcy~jD< zI3eWH0UI#hr_tBn|1sb#2GbOPRgw|^yeS0#A0_qKI{;d^07}X`Ks-pCtzVprVI)<F zGz23;*NF#R_!y%53Zi}ZGCpc^Q=;}PB}KlnpzA8|nk1M8aIir5!!HuB(@nBfeAs#m z7^-*#-2%z{j~Urdxfi9Gf_}Rt-aH-G3ic}l^L_t3Y^96H(u(?^3j_WF2HZlU7xsG5 z;f^3E63V6Gg<vNx1GBYFFq0{5{EcV@2bO`K6#n}rh<x=wnrU#`01C2DV(0$`sUN>l z0oPL1rE(Om;ltinb!pveghGA?dro+<bH;f~35I>6mTw>?x95S0%IS@9i~({EKvE3m z)k3(u<7F34RVb`ZDF*+|n_#SJ{Yn#+SpuKxs3M58+s*tp9$;VnG+KxT4wxM)48{5s z_BlNrv-g;)XH121$cWD>Gp?O#)k{K#C2e&7<hD%>5vpEFF=z!t^6g2uqQkMF63kx! z{^uPpg?8k|?>DcXQS=El>2y<4!3GR85P7Be|BfK23`M$U0d1i_2Z&D~ugPJj6fpKQ z+&ea>8yaHePd=C%6y$P^gJQ&a`ZR-eba?p7GZ=UW8qM0lNm~L@K!aTiz`BLt<!9eY zH_vZC2E<3e@kN~YS0;xO|6{oZJMb2O*O54>`2&AIcjb$m(CEe7&6hyVe^8tENkC4F zp@VuTP&pbHu^z1>Ji_mNtDq~7IK~<I>5<{^1`+$%z8kFs%PCyN|4(+YpHdew(wKk} z;rJQtS_u9(&xun*H0dq*=th@NG?sLuD003<KUx~M5vO_7w=u57o~qGX>~4y@z=pg{ zs{@V_3c29q63j1Q`i?CW1a83TY5=0^h`z!-R(H`a{`V2|e~vB7Cr4p;|0ndA$Xft3 zZ7PLo$D+6=8M0G<d2H-4zI)|9Ayzu^*8AiW*r}#ulZ*f_U*~D=&uthlI}8a0W@u?! z3!)tKp~zSzgcY`n-IhY3b$sFEP8<w5r^K*8k<+<GmU(Q-8O`6*M4z?EDc(4DXz@cd zQsh-xbv5h%_{W=%D#5unFFi_xliz&?U4&~%asKjfM_YP|ckg8`?412ZPBglFG=UnO zUo_&v24x?>j7A?UW(fp;=jX)0*wNjUo;$gZ`wci7<#vy61{yW9%6fX!hhsCGn6Rke zzfb>~U6&JC0>0aKwxS%;T<Ooik@EI;n?t8OQ$>&vx?p+l@NVLXL4Ylu7XnjQnliWm zTeotNfOW+o@t1#XJ4R=AlEd7HGncqZmn<97`F<ee6}Nc*Pmr^pQXb)9zO1Kdhe$RW z-b~S|nTUG{oXdLBy0CTJ6tQP)5iRrpwO9a$A_Qx@lfzB1hY+l=G4dYkV(;&NWzV@W z&X7l%f3IBaR`-9Ow#*6hrCsU%1pn0kexQ}<r7LhC!du<Tp(o{I0JDWaSm!sa?s{C_ zX4avswM*4gc4gddot;U8G6Ldgz8FsbyVl|zC}|V%spZ8RyN<ZkgI9HH>HN`#oE8Fy z%wQSuBJfgR?Syk(1W?2X;a7{_C>Ans2<37{3h7H;Czw-$5tF*A%$}3F*4AVw%vq(X zTni(S{og7Ap(XJW%Zw&2oEGPZ>qAB~1u0MjDUTE-1-il*UI?#_B^UYU89Q}kE5b(v zN<Bi*!s~OG6Sg_H4)U+Xq!gW3Gq8NO6SiOOR<BzEt?hwG8dnJ#KDQ63wibZ-ZAI2w z17VQ=Mpn(vmil0o4Bfj-kmskFT(9zn&^89D@3<K<?KU|7u~G%^g4%9X8UwMSsK<cx zy=}Cx^k<8lx)Sitk7QBVQUIy<CxXTCSK5fzh<F{uZ)KOSzOc|WC!*9<$tJ&2V|y=j zoPLI%i+F|Q`wSrRuP-ZfZ=Q50&B^SNEKKre$(MNSN3GB7qx1U4ya!h&+H9KEHh0s` z{&`YqVayMD6q=!BDMR&k^=6gB>_`b%%@O=L)b=A<m_eaX3GE?VEdvr>E$Z^gN#{pl zY$AYbNS80fvlJ-ITB1HdBCuY$D%`Ot1GwdC!aF1_ocnhsZ1dC1h4qTC^C4_jt~Y1y zH)p;M4;4wo`stid<~NW1=|6+DGvzxgW3ty0W!!YtO-TY}fO5S-n$reu1e&@n1GIEm zI1T4c0(P3ZMF5ky9kCRR0`ms8-U(HF@noA0Qdbk(szPwBMKlU>l{eLCnsV?$4{21Z zxdD!F6EWtoe$?Z@cFWp$fib5XZ5wpp^*xBZ7$n`_YBzkj@(hx&g=oZ1M<HJ)OUW;q zTHE+c^20&-<WYt3Xq(;Ln%~{o2i>JH55*bH?^PCg#!6tM0=+bfuf_Q?1yVX;yRali z2Q7d`ivp8?aZ$<9g<yC1rZkM9QU?j^#H{^DHCmFLqtM`6bMYp2A|UL9e0wvPb}AQ% z3A&l|-+Ot3H4g1^c+Z2EZR8);NDqA1JylXpm`)hT-`?f?79!XG*Hj88fVSR`(%ff~ z9Cq!0Ytr6rgM!+a?|Z3*l3kO1A%YniCm~KnU^?F6CDxfsK-PAH%s_lfB&1N793378 z&V(VO`jw|B3g}h$@oZdi>eq@el7qw}-U)tq`C!7c=Xh3+QhlmYo+I2NLanwA2`28n zINO_?{r{H!o%{N`xV;<uXl|}@*;()Dz6FS#k7ut&dE>G!p9CF;-TyhF|8~`W_U$VB zYROsV$bX~xqW*T;pdzzFcH`hBtANuXj`O3<s3BIP`z+EwGSBa|BGyg(BTS~|GZsCF zp4>o~2hy%+JFiw0mf!k+9rd|locXZQvT{Fy=YRBP^}|t=+;7>IjrIVs-zVDn+J71U z{xUnaH~2w2MS2df&1>xt^9Tb@S>Y{tOc@uqR^@*P1YLb(=Y%3TK!|vHRWjCj4OSUR zZmE25ls_}lQa!4M|00~f{&}2L^D>XVy^mZIM0E7qP%|`sfcJKqu?R6X+~m~#kDoBj zC#5<a0K;Qt-29Jnbe9hmWrN1{$$Z)Z#lCNN`byuv7{yDwm0g`*APfws!u$1{Du#4T zrNPjdB2A%M*W`X7&4TQJteHMXhV1)?mA>PnTf7%RW6YM}(rZ;>Oc$#4uZ3A+xY=D5 zg_2LgZFk|^ZwsM6(w;$pFr+ECoW_qr1-x|lON(n0gm(;R$sKU{fUX0G(GG#o!dV(o zRq>}bRb}8XYV_o;$Nqs<{oFqd_?-|Wc5xf?Y>`AjU!)Bdz76sgL}eB^(Y-QF=-D9G z{G{}SO$9*lI4UeZQI77M5Z5en<>=&E+N?<3jJE9}Sgd&|mhi<4-W6wUWfRU~KQf3u zzQ=RUyo2kQXfrCaLM&Q6f0pO)PXIA(hur363q4D2-$q25Uhc|1+3!1fpA6DS+%+{G zCQ{XR<2ELrYH2OQP5~2jWrcO>AgsPmYsxRFZ*%C$eb3tf2og^R8Bzx3*ak7ekSoEa zx=6+4u<sAm!`?dczEOA^YC-%WqEu`w)u#c!6;H6)5@`QsPe~A&slTXZ*Fydt$T;!c zD2qI%H<X;egHMd=M82CUvi0)SgG<6$<Aj&1mk&+M?hjX0yxJRB4}r2FcREx1_Qb3; z<9=%sj)(4ZWR*0(1-H_T)}Bq@_xs*y#NU}|u=<DK=oP-^=_ZQ&p05UAic|Tg+D5u! z&yO!@jFcluLr}Y>KY6-tS*dU`GQ?>OL`WE5j3~JkWgu-tgEMV9Ko`;Iy0OT24Z=*U zE-(gHSl95<fm!?11{&(TfpoD@*PKfgy#7ZrlkhFrTJ!lkqPH>JKj_@KCW~w|5{Rrx zl<S^N6uETMlHB?RJ=r8Cj#(ExVQV#CAoE7#DXC!v8;Vki*cVU-QQR8=i<CJE$BjOH zlO)!zn9)quaw4KA`cAd*bE3zfiGu2Mngk)m7)Am$xGlyXp3RM25z=RX)(id8;UkFM zMuhW{GOR!iq>uCkxy_ehC`;gu>S4OMG=yqtT_OCQ)}Qdumg@BcaXvfh2$Sk8>aG;_ zx8V1WpATp8hKx|XOB8)O*<BC%6j8u{vyGoYc~<;doFce!p9q)*#@D?-?Gx2x&j<Pl zhV;qE=j)gV{0MhAmSLmdaO2Q?_c}P-4?nVS-<6z$KJ_7UBb218P{V3GS!v%9$^8ms zv;lff*wUHoWvRbMBoQDZ5hz^kXnW%l+Yqjf)%X@pjBNF-3P)oju15s0{;eyH0q2Kd ziaAI%Bsm<FK0*!g>Pi_*2WX@V?Xg?ObUH<a(`YMg<Z0@X{uqe#^V+wM5Q=6)%X%^^ zHt5+K-<yy`{3D|gM$>VnIuNIp;E|0rU^HMrn37$E9R${!h?6GXN#@ap8#@alC+!-o z%NxxqXO6CP5l;Xxh7mH41myGrxgW*5!N;Hy%*hwkJ_WxKlY0V_B4C`$Keo@fQlEqa z`Dfu@lWO=wIdk~eWIUeNs~FBg9$fNA`|z4qWe<R@lQ%Wkt-*PsNfN}qxb6@WPY<Q3 z;tJ1A^z^@zqoW!QIU*FJ*dzDmnB)k97eWU$ijy;9BR~|UzX-mAQn<5!frcZ<k=JU` zMJcJ30kyEbU2LkFV~&UqpK~CBaMHifP(aXBgw?`O&V=eV>daM~%aQhi#uRfD#1m*A zl+sAb05xXL|1)v23m1k9oN2Xf$wlw_9cuEF;PiaD<?T=F(vTrEH8x_OCo<CSs&IMD zy-pBN2?a!hC>Ssra2MW=8);k70zmz8A@c)ww8vl^*bVPcdJf}+!sM5My{Z6_sggeL z#7)-X8URi{HJDVjbT=LiLpBZGEX(x~CEet5P5qc8HKUkE?9tL+>yzqYYo|KiPhkU} ztDnZJa3yy&nmuwWHC{H5VG<yTI|NWZoNSddc{D0*E0FGs(P4lVWE>(17N?-dhi{GE zs^5vWm>{OD)wxNMmk>iI6->@Q)}$%7G-^b78<a@q?6PqSB{RU>FRO}HN=5Z2f;1M& zsYxDMuxXWzeg~}(V!lwxn~K`i>Ba)A8aori0SF+XrfHTGdp38&jAg5#xY-&m%=CoD z3!ez|dDa3i-pE<7uj@lj`Vs^wa)Qa?&ram$?^CZ4I0;;A6VM&${=%h^NwvTc=1@O^ z1IZq=)T4bfaRg&5U289NoFR$8RpS^zA4F;Qwm3g*(T#kqIEa}P1;PE}7{TygSm5CF z!inEj7Q~{v?!Gt#7tV;KF9B0x!&_D<c&JMWUAGu%JQ16TqUeI57VN!R*p2OGKJ%;8 zv(+GtzCz1i#ZbS{XpW%gTGRNn?J))7$gFga{Zu}olT|sg6~bJeREu3`T?3Y0biYY- zqkW7u<Kx2_=YBi}sll@VCjuZN5*J7get=lFK9V{|$rpPb0stC9djx{!*<cJZS_m3P zR8#~0P^urhF|INDTZ-W(m1g~yUj(S1*RykJNLvEI?=*1X#l<0fHP<a2O|z1Zdai#e zkk6U~RE$Ps)ngN!C)`oLtTY)?<eR8L+F>-A_~-NB#Y7r70A9FNw4jh<S&Dhb&S{Op zQ29DImSV`evOy4JbrwGe?ZJbBn46H!9DJ`qK5;mSY(|RCLK^2D7~_TuOfi(B)6IYz z3Lz9<*y~W;VvlAwSH0X~4j@X{F#Xv*pn|=|zP<}I_B>V3E@FarjEAC2wZYadlb|t; z6E)``sBKqobosYXt60dGRA4As>kD|n_N${dBF_v7woq3<^m;W2%i<bSpe>J%tk8ft z%v;)8<dYSxxs74*-9AsBu1SX(7r$s?N*#MB-IO1F$t!DYxiG^aU4pkklYY+5l%PQ` zZRq2KeME9zMby7@sGi_hNCb++CfRU--~bjbesxIW0#Ysd#wn`SF_};igy=mLzJddp zoy`zMT~?xlNyh+22<KpGZv%h6Kpc-TgC+r-pIL2=Voc7`<2ps`5R2=YsB64@p!u}O z?@Ld~RHg_Omq(E#o?8*griPO1a+a3*!)A27LiGgnxN+8QAfw(VZqBOQ=O>DtR_~o3 z{sVY_Vn?E#NJ^n39puYfZjfWv>UJ_{)??!>=9iz?abYK0*awVF|7wmfy^v3iuqnJS zDr@gc)T1%nfiw4Ov~UvCmJezhK1V^zRfklpL*o6w{`qfsG)!Cgo_PB<N_rSFVW(HF zMHzu&d!+Zpuw2YaV#0qOy4{27bS)9O=T+6w<MGO1kf;2jRYpz19rk_R)2@079Vdw= z1OUN}G=%{gaLEIGTI?~iDv9Wq8R36GgaKA+R9qndQo`plw%rCin(5rb&^;eXU-5dG zy`QCUJ`EGZb}cd_h5sac;II#Lo4PCON&y$B4;Sd9qom|Y5+Zi2nJB8&Rn1u?15#-} zhiw+v^-vdFo<mk#f0{(oEc2cdEsLVYdpS|#POm;^dr@){!wb!3iYBacCg0^Kp}RRj zbQD)uV2GO-w2t<O^@RgKnfl28Z&Mr%FL?bpa^)VDeS*_W=6z6zJyQ0?VuC4X%0Pdb zUzHI58%V+L09~l|NsCj9L~pF_1@YU0L(UIDOm77>CVM>u=O=-qyb(7~{nq*_aaTLC z^e^4b+It=c;>?PvBtQ`d9-<sLBm5vqZvd|i2z~+J1vzR%1`5BFV7dhtbyncYSfQT? z&~}Cqr^Lj7<#?A;R?*4+Qx^LA9=cglTt2z(n|HUPGN+H?`+b3mFXgi1SacC_ETDup z@QOG<HOrm`#$ud5+VR$_EbYbKCAUcVBBFUej&wlOBZwU&auWE<7y--&BXy7pB@nZZ z3+v&)Ij<wyE~>hSJ-^y{rSA_l8luI^;jHE+9pu+b09w^M9Gn-{TC}>F<rn5RYHY9U z&Ud{wR84J!ateh&4FOUyn~qN8A0Vk-H_3vT+K`;WGmtQIo-XqA%pbFZKL6cFr~HR5 zI3oJ(+kf7q(@_+O4^g86{p~1+OEkWV>sARUpCm8H__>iD#ax=YU7ATSyvV!B81Wkn z&iJA930W3pZf?>^F5wI><p|_<%e?6db3gg>K-zUrR%oMjC-hUEFTAIJY<HZK$Y@C| zMFqYkI`_>H><j><sMH+m1TWGoVUvfwxN|kyrAZ~6FREnZK|G3;8`LEbekh6p4JCmA z2Mc+ie!Qdg0_20Km~&fo5*jWAk_rAcv3aUU;a0)PiS$Vp*vXuRRly(9k8`wDk7l2J zL+<FElQLP*HbIt2UH07!$;CqawjFZG&O-qP)akMS&$FP{!~o2f+p%Xjq$}I0W3z>I zNq_@TGnm6x8wh0peSn}aYV*nHRF;h2*W%_0^XTrWR}J)i)fKH@p~!Cn@0Bw|_BgRK z*-EYHhkIm4NANbOexIibC!wqrkoglGOE*@O-bd|_czqjS*wl6S=Uv&S=|Co#)a${< zhTk178@160-`zFEk@e;`uh_*%d>@LLWdI&ejXCDD4(oAxa`8fhnl{o&L8GbALi$Ed z5%o2oHjwB=BLY8d0T>EHRg@a3!wW@Ija}A3=vY;63tBnx+0*<ZYR9B)e`sffH z0g_R1RU4sVaD*h3X<BMAiJc0EF+TmVl7n;i&|vm!Q0&yWB%LD8H?60O<#bDmUL079 z=*7|@6l2)GsAj3ez;3<Zg|-DV!10_ES7S)NG_SQbFoGM_mE2YWx%k}(u+&PB<<p>` z;R2aw=AZ#<06h(QE-gXNIuLhO88$JCVD|kikAr{K$c^Ki7jNRfB3bvOR|;pP4-i*U zR%GDFAqHNTmsuC4pob)@fSVVsCe#?dsD?r+jk_YdKcxz^U8+$swqL8BZ}68;%wd9o z2pJgA51sM|HmDJaa#q)bM?-l9yQq3>EyJU0HLth@&y>2TMxNo|_&nP_`D2l8bFj$W zF%-^E-&clf|LKoKx7uxD^IH2<2o-11V9`wL)PB=A#K{WB+rF9N0HlEMp~1Q0p6Y`j zwIfiKngMU^NZdK*h55AE8@hzI@<e>(HiEA$<eZW>vGi+lSE=}SXWRv`21<2-3}kPf z?6GS7b0e$qu_sy7)RLhtj*-)lHu*JV*C<ndGdV_|3spg|m$qO+wRBkqt~}GwPtTEp z*d<eO;oRk>btZi@O%}JhG*&8&eDPFTdHz1ikQ@>VsO01wK8xqZc9|)`WWg76eT%N# zwO0GParo5MBe$a#?BBF3`z%=wQ|*bseSKGQDBe4AGPrZhB?B%>;L2i#Hk5wnbkAGp zVGPe(hWUFB%n{4fMSO(8^tTOVsVOex?aJU^yvy{g2gCgEm!~wO@3dAQIkVc9T$Ma* zB_Hpu;T{lnH3&jsN>~oCzMp6!T{LcBB3-V&Nce#T-E9L?+^=-Y)^}^=I{{=Zd5Mox z5<8ya5f^GjJ8CsMW?&XVpuDWKT=%Na-f*7opCEijSH!*r{^Dr3U!?!!IKb?zcudUh z3~hkf&L;Q5_MEjTyuUhv5q9feX6^Kp&o^jbrcZA445>N(TJi&r45@G|X#7Pz7+&7* zV_OeCbGl$vnVhks|MYpD^`qTq_vr#KFc1aicVvgb)nI-h6kJC$)Hq%QxlE>gIKgqp zM(|kRR9M>{s1W?f7Y;$rrw=lesHJm_r4`FBkMrVmjIY&R!(ZV@{i6}K{V_=j<oC34 z!xIHLc!L0AYbwUwSEv<gslQVly1Xm;NIN)iN(cFJa6&i<w}apLzWN~!&S42n*p}6k zUL$ENbK!aK)f~3Uuxu%DJxk>-vv+cQ2wKqL^d{MQszv>R_2p&h0~{uS`xe{|m6Jn7 z9pv{CjNmJr%uwxa<LC$CT+0DAxoBbCs^4XG1Z%<F4*0UMjTCq|!RBq5q|iNe^d>_I z#_Tu{^8hE<ac#-r+ei==(#9gk3v5qt*dF7^|Gl?U3i}e@3K6tadjAk${{}@Rw~n?F z&%cv+aLj`0Rxyc>7sAOB85G08X-b9S;;4Z*ae`C+?@Jz1+<X*5jAOHx3;q1xh4FBD W@0isKp?m-S!~rR5DOD&~g#JIn5jhh8 literal 0 HcmV?d00001 diff --git a/docs/KeePassXC-Confirm.png b/docs/KeePassXC-Confirm.png new file mode 100644 index 0000000000000000000000000000000000000000..989294a4ef0847bcc87833e43c75075acd0ec806 GIT binary patch literal 72759 zcmb@tWmp`|vp1ZC2<}0GEbi`3f)m``-Q5>Rg1fsV*ammEu()oJusFe;#bH_G;l9uL zpYuFl-cN5`yVp$j^i<dM^i)?>*Dp#{Sr!BJ1L}(xFEHfgq|{%$KoWcL;?)b}x6d__ z<85^>UXnb@OMTMx%{|InawgHj|G3M28~!=<l}g+#Nq@$vjQroQ^Vrw;sPe6iaw4t@ zcKUM6`pL8TXTF0TH?hadC8~_mJ4eStUenrA6ij+X3i{D_D!C(@)42@^KCZ452n3?O zrG;KtSh&8ci`Brufa^n?r2uJmNbkq&(xmq4k~NrumX@_%y0sd<b^fk(x|MZyDZOHH z|IwBIPz}z%M6cWe-p|kU4Cjlu9x9e?RBF^{)M+$mG-<SGv}<%~bn8r+YM>QfqW1aP zVf(X3HAiVCqjV07xx{22Fg#H>JT9U_3%QiR9Z~P<%`cWea-Lg=S)NcK_Mw%L`iFqw zi|8{LKa_qr{fPTfmDF+a`z@m;lse5JWz_5Qv44s83YX^t7m+PQBp%>`D_WGq{G;ke zK$Q!ha#t%)PO0m9O2?_Z(Jc*|zrVFwzjeN>b-LFC55@$|erA{P>AZmJQ*1)yKg3?H zhA0NDLaj5MBjt4zg{XZdeh^fDYLsPy(xn}ywom4^p%u8_|1GUfD0uWup%?uiYPT@# z)RPQ@?Vhgy$_#s!QXG8D;o3$qTRCeT=T|O2fF-LZnPUf4AJb>G)(kaWnzt3MpmQia ztzZAUN1Z=u8e-e+Gi3ifUES?ZLCxbttHb2qLec@-?G70vBvGCzhS@>1O5E`P6==u) zIbYy((bUD<Zc^uCH+v0R;}#e=)}4K^2`e~VsoRAd(EdAS{lTZPft)MUi}W>J&~*M9 zPs@P;$ah9dRh{OWp&4G6qN!i$E&D0tarqgm&LeGMs;jpg>1|_4hWEex{LEwj74Ehs zFJSQS>D+ITZI_^Zj_ZRsbdIX5eD?Zr?-U7AN`^iZ;P2^|BepWN2j4r1Z_J5suMtUY zx<6X|^sfx}1$oZcPU+WwfAGc*LYOaDm(nc)f*mOgC|7+oz1H*=^T`86ikph3ke(;| zix(Wsw)eJUd-W|Pe?Hc;)Q`*vJ^C{NQAy0duNRFiHD>?Y=!JDyz_y9|nc6MO>Lsm$ zqzz>9@oey2iZ<V!5`D`)Hqy#iQ9|s0H+^ID3KS5;1N6jQ_C@!0j41FITK|Q4w-4fb zJbtzQU%he<yWJXoNa$BKUn`6FaovA-gGitwqv1pNlZtWvr%hNmBsUBaZfLZS`g19r z0hKo1;>@$rKx>EZ>?1t@`}vc7CXN`z2#8IOqa41N>sz)Us<YAhRIp6vKq%I~m&aL} zXO$vIIvdz@f{Zh28}=_tmX7n$3$_i&gs)OhU;fkRi=G9p7`wym{Us>0H@tz>j3^ou z0pIdFh&8-@{U1Iwo2UDFx4^s2K$OKp+*{UtPa&0Xh#&afzuj0T?w`W9A_8z5d4kC0 zuwQTNGnV>i+ogM1+5HJVS@-btq=|@#sPE`tE}D|N{P@T2%H}TLxCr{{-@8TPp6{Ly zQ&|dA>1bl?hK;Q~S3f-+<)IjA53CL~AXZO~=K`w?anzQfd^23Lv$OaZ%Pl-j+Z+1c ze|VHU)+WeMZg{0j3}3$IxqfH4_USrs?UR&mH*EY9HX6Rh^y=izMV7D7uDHjJpvUCx zlPLE^fz1|M>8NvQ-MX$&geEc|L0s;3Yj+n94=*Gqha`jDWCt9EmMa>dEq~r1LI;s2 zv8yQjUs8YX6P5swb?QPv!QG%|_>!22ouAZ^Il7{_U0n)#da<sduU{U!YH4Lf$*+>8 zalG|ArJ;d4gUtwh@a;X}q>*a!Jxjuf$F$7is0ddLi)4Dq|MD)RVk8vHgJz%<eE*mf zdWwRH*-Z^Bq#g@R&~U9n0|?qvZ`zu)xxZm%W(ER*sd<{)K@$6R`&*V<i5XcS8n_;L z%5HI7W0&t)Ar~sm7y|>t&orU(pZ`Pm@SiNec*8R)hL6P`pSaekL5b36>v&{j+74jZ zia+XxhLx3nk~9v1oq@H@^*hNEw69*hl2cOJo~tszUuB}96Ak|x`th4oa=|vIpYo!d z0f_?%Z4LgXdKSG>76W5R>Hnea8U?F$kK20sua8u3ZgKGOJ!NmDq#3}wsrX_ffS%JN zu#~b!3Rt>m>hJ!#yoBQ`LA|!E?Hx5;T{`D)n<07u))*;1O6vcN6=R{?yxdamI4Nxn zOW&VAX}^Ab+%lFr|G@OW6l_$EFZS3SZS5<gOc{d<re|VG)rfDR25$X~#TQlo+1l2& zNw2Bn>CQv^hB*2sqe{10H!#qXe2^qAmFH<5I$Af%$CWUC$lU!UXAmQ<LIzItfAN0` zPCRTYNuZ~8Z+o7^-Nl9o)|C6;XWFXAXuCEjvEJI*+1TC=1A#!eqVSvX>|{SnW4&+| zg>-nMs@^RrE_i4SA}K=O9ZkT9CziBM73O}<i3Whzj`E7Sf6gY|Pb#DrWDJY!M^<hn z-)%(5<8tFMODP%ZlY)5Y7wo&jj`<AWBP+?bm$%Uu@>%j!5IYtg0x3F~<mAl4NB|sn z*kPDg-2NBR`~RXeaq;OkHYO(Uz(Cmk3}~jwL1(eqDW<zyj8(t!yFvzA><8XxSkF`b zv(BYAS`o)k|9J^pE65iOU^+bB77fz1B+t@GryNVR5@TJa2D163q5#ATxYqIBzn3n? z7E4N^%=JWm9%ST@AsS%uT{>2w;mqdtepv8#aW(m*dtCQ4IQ`D~%Kkv;a@HuFhIbI( zOShM;;T?YoswoA;B6II^qc12?C|Q~e!LMR!>af~mQnAI|FNeqa&`ba(TRwgQ1MJf3 zFQxrPXzn6#xA8s!Whk>~RSo6u(^p3+`KM!S#eH~s&wK|66Ad(TUMZv-4Oe}mNe;P3 z_VViO8z3gMq0g0ecc1>dw-o|1L3a~u8SY5gjMAVo&b`-lPoX-+lm~NDMT{3N^>8w? zvi-GA#<Ek(e?3r&lddiC$?bg)U#eva*|ub3hA4Tp@`msj>?AU!;vHuG)UA{y^R~{D zu=Le2Vo6`i3`QbtuFYu|7G_C*n}lzfkdcFj89!M_&eqy$|GTwg)7vOsr2Q|`($LgP z9jvoXSsT3cRB8WMtdU+!-!>@4nwN_R6<6diOR1c}M|m?Y#@?p+#{^)o196pY$p(*e zX*lj4Yj;C~@HM&GZ73*_c9DUfJDfu$_+Ato`FV`qsJlg_yc+APw%=o*eEelUHy80* zabbBu@bf%K>k(*iS<{~LHPF{*n)G_OyRutsWNdG5@4P=Bo2@d)@V`3X^gT7TLc=G% z(pkAU>m646z^I$e?=sn0(=#|YC=-=!s8L)sPJJ=TWvN#`4hri44`qZ%+}^^Chg6UO zf<n4<Kq}`*{QLQ^1mFv+*L=i@6oO)5x3j)1D=fOc?&KkS-H_mGrC#RgB8mBBmiDs9 zg4ktrTKOsJ_f~K}JLU@_=Oa)m<yf>zoW^K3aG$HWxp|b=LHX;cgoNB_gDK>cm<4dj zYR!jZI08*p8%bf2^OR~R22{v;mt1Iazs-EJnWuU?d;{|D?}Dyk7w#g<(i3wRX(^!V z@6Xh0dFVI(#>3LH@ysTg4(JzZ7NB=CYAscf26o&FG(Ik!inT|+d|Hr&Nh{9}T3#Ho z{bZnx+(Qb1+YJN&+mBy8btTH`-nj^uCo58Z(Fqz}?7rHY`jjx}KVer53Nel#pM^Di z=!22Ae#i*~*tFbTPgJTiE<5zN4|845gFM7UUS+IM3tY-0-F218Qm<(5@w!MJHk0jL z?i_Y5Zu1H?xkw5>l<pnQf+SU_S50<DgRwfyo2DW+=`i-6=0Yx-f}x2w>BeRw>~=Ki z;mH8ESUe5;ng_tc;~dw3o^6UUo}WD(-doR7vzY46X$M-#?z&%7Fo9Jl-`Sr43t|V3 z2;N;6(-a?A0HRSn6<2YY(juO1U%G}?mQxI0)^)Us-iY;|c>=-|Op$&3{Ir=M&Sf!( zPD>^pWEgeY;Q(c$Q^_A^uIZFWp;OXrw8go;zP7Zn5#P5LzZzz=cW;zI&G0@J{$1hY zQW;hgRPmNt{D0Rp+A*O1Pi(P6pr9$WR6;@rw)m<~m`W(N7>>lPuE1;5b-dg8&;-rU zxw*OM(<HMpm*UX+gCq6WZotPHEf;S82u>SO7Wr|x@2A%5q7HscAaJ3?vsM(Kc9e}0 z;etgJqU)uzaEppcMq%re>S_QA!`r}9Ui4ryYBUle)ALSF53D<P9vy|OllLc<`FQ-* zEH;RF%vdg8qzA?hj%BiMD&|h806lj0LL;4qPAfcrs9$<GJI`N}J11MFT+_h39UlK? z6enTyA>Rrl5~R<O3_#Q%PPRx{63fA>74E&cT?>5-qdsLN7Jk)Y!#BjA=5q7?#1Hft zT&y!GSTEw^X6qS0NjUGyCSf~A6on0ox4kRy`tw6!X@|$DIw6SLD7z^jCVT~S@u)K- zu$3iYx!<+DR&sDHnp{NN_W2!L=lY3!<W&rjcSOIbi&%6~0qXip32|KL$KNi0h*rYc z&+oY*r<HO~zVZ?6N>_G;GhdXuV)t%H)-^(aFiZmQP(17?MSjXZ@uV&NkCP|B0+A7C zE82}P=&;ogWfTz&;pR35c^sC`mOZgO0eyG}V_018@X!jzO_?2cn$5He2>t3HEQ{k! zy-WfZ@;VC7>-u(?Br2e7zj*o8_TS!+Tw$MTbJnO!PApP^k2!o!sYwM<c=YZ^^K}s) z+HNb<#llqYCZfOW|4w>?)~yD-My&L>_Za`j<hkOJ)?s_Lbc#>wyoaDm7$yMr`}=z) zl!8+VmLovIX;NRTpPwHM9nA)8H=(75(9Dfe7m>Fsj-Y1*OVe$#BI!O}P*nmalag|b zt4@=4+3s?!vTD=(MlW(A>nk7FBkLv4&d>1eCliYMiz9RosmYA6sPbCs8vR@p4-%}` zal~0d@fcUIoxF({BgFq+-e05VwZ&38RJ+d$rq?#+;1fVgBWMq|<x|H9(pyd@=YzY3 z=oK&<#@Svl-@I66BVC^^3}OMed>q3$+;5+KbGVmlU+VIZ6d9nNEt!m9#8h;GfD<~- zn@ZR_EI!Mt2mPKT*fom09f;K%oFTGme66u$x*Xk@8dl1nx=7t?MmF}&+w#`Ii0I<# z<qqItds&NLWZ7`acG<12Co<>iEnD7NT$|D>g8Y)=E$u6?)>OCbgCJX|%I799C^;~s zj^&Os)51=_aO2xBvRnU<QAooerpnVp?xPuB0bfwaS1-i*nUAb)&_WK{^`x&q{4bt{ zUwIC-G4IIkevFSL=9J&UXT*?wbM1LubMOSLrc~ypr8$v0UyTNl={8@>YtrZtvX1US zcY?LuY9aDtigAnJ9tG5HH=q$TmL)gjG+rPOF81~<5z(dDct70HBeox&?u(V5AIz`$ zO!)%S1*u|2*4EYwK?(c&H;Ps%ho56(V{M_;WO#InrjUHm&&4Kb*=lr_j`)-_#;930 z{><Rga$a%iQMrUB^O^2&iG6uWUd04qu+0;I61XKqLQE&ja`YC(4MnOye3J->q0uoB zyU3Z@?Xaenyk2UoxF{NpL746#3QjxftPFUakb9S&mhm;9740x=g62Z)bN=~#kvHbx z(SdgEw_}uqwogDuk#&A>+8#Nt!A~u|dfe^$koQ#xvqIso0|aKdlQYSI+!5#r7Nig5 z)E<hf=9kS5z+LsvcYqDOG_-;|7MH7+bp9H;UTl~ojXtGuC52bUUyj>*J^hb0E)hBA zCj=^$0vD%aGvwmZjF0^}KHKA9Wkr39iSYsj<mC7UK60l$)MZR%oB4SFNB;IV3(eJ) z*f%(-w=Vr=7uYh5cHy6f%z!}@(H0~6CuAmgOy$GTg?kOTUY|D`b6m$OE{T|1T!Iy| zV{Oh7Ug~bGs@!VULvgN$?gg`IXdj@Zi>~#ruIuVnC`x(r!1hyO+J%ASx4yFsCi&Bk zNt43l?GG?vvxB;|wMB_pnL~xxr4Q+Qe80BB_&MQ}-$eHpK^ySL75u1OaeHCobPpm< zt2AuUhAh^8NI4^Qrp5li^-uMU7|rdXXIDmDBR4mfh{qP2OxW9UXFMxc$m_EnUa`7| zvlgT6iP42d-pBHh*;e{qQSi_x27nzyY&HM(?rtvrc^!CXh0m`;h>>NN)n78;D&Z0N zhTet~7$7d)cxmv232;1`{I2vCSnq>x;56sXx>t`al=U7=&nrya@xq~bzS3+oUoHB- zES7K=7zC`*Q1_cutvV?wyDYTD+ry*6%=gd)1+Z?)CYS==-vV-xrEj)-pu6OZ|JXe0 zBlS?Y50O&w>k8d8IQep@Y`H(88icE?<~`s?@~tX^v*H*#yeWThv_P`9t&Dcl?lcG0 zV(M+pM-ST%lCsDBw_}H`k<stdP$@fWm~D1_{%$tSDL$2j{<=Iz%}B(vio4k0U*M}I z+uY6MbPC4Tp;jn=d~cZZwV5HV@yL9Du}5p$b%+|ZK=_(I?4fJrC-z%?@r|0Cy7sun zobQbZC9O|4CT7|*z-{o2Tl14seIelHp^CLXrWAvg_E#=%Re<@lEssL*=dDWYAeA7^ zi<_be^pd@L6z|eaqWVj8q@BF2t<IOZaA)LA#bb^(V8wK*%0K=>+CidNVM_}?vrcvK zr;xWi&dZrfIed&HnxlaLE%NwLjrrnQzZxF^n^F7tL{8Y}XWy?56j%((T|)*y^a;e= zzowwun+7bTFOQ4h)|+!SE%n<VWGy<Y_>uU%Z2sP?j6Fv4cp3n9@-s&%={>&Ty-H0Y zhpP^OhM0!BMXniTmR2ij*`I?ofkCD$);jz#4*gLM+wRha8pa*gF_kCrm6f*Ks&1Y- zPkV!pht9bR9N||cAExXc?ZgC9<#c7V)FeKqaYcJrM4n&$TIzkNL;sF6Z`sWixpz!F zD-~?Mt#dp5VF8310Ivu#Tli35B7Ec?ovt1yVTBXa2_@%iI+|$o?}P8u0%Yr9l}hb- zvSx+sC||FA(`6|=Jo^_`-hpcIUun3g=`u!Z%B%4SPIdRg1vbi(u9XFZ<~Mit6-*_> zP{ORJaThmO+$);!jtwdL<J2p$^IGzv+?U6e-Ow^ctjQv3{5^WFNQHa+Q{K<`*I&kp zM-(c^s|B%OKTQo{gWzAC0xvVCs?fL-!fKh@E^)#Pd0!Rke^qBw^sZ|^&ci8S3Y+dj zEsvPciCYO-6jxAiPwREux`_@%ziGLL$5Agr@LXiy@hDqO{Usf^*ghfqXlsvCHn2>b zmHfo|ok2V;^oy%`r=*-hBn_q5YZVpvxNtO3*|zikEM|<7%|s00-pH6c{&RCaJ7|Ds z#fNCwl%jw|xL<#W;|Ls<hix&irJ<hqIT^Q#y`DwCKzpt>(cDjj;~PW5NAtc1WHhvo zn;)VhR9K?IvMdQo@CdO#Rl+c)xsv53BWX1~BaN>y1!9ES5N{cK`KJ3lf`z&DJ4p%~ zE?oy!d&|@V8=~GHdmmDMd-r}I0J~`-G6gM;$mZnhNYsm0%9(%7#4wA(=s6eJ5Gx14 zqBE<LTB|ce?C)q%P10Z{Ba(|5+Ro5-Hx|)Nd+g<~cjWaww|JE!>S}6!?TH#ImcK%p z9H8d5wvqAi@wi$?_wZ+b2F=SLWleS}@B16|zn(!?yy-Q%z0aO<8jbjv#d&TcTy(wW zNsbAvAW-7gH=upvSStoBJK39x!(UldIWjU#t1W;<@~jb7fwi|oU4$WgK0~f!9q5bd zbfz*V2awK`nR&aGB#%|lX~G2o{}mkyvD;DI+T<lQ9&vL~0+p{NIc*JtWct<A38iDb z-ltqo)&8a}-t8tUGV*b<q4__t+s6@HU90aLjc!<(Z>m8RXF8rFEnl^o%>+>1(f5qr zPrv+=xWRN38!+ATNmA&5w=ineVAe$-?y)GrO@t*)U=;LSbojBg7D6Zg7JKdvmzi`e z4Qu^&^gH^wfrCb9LyHeXK<O+fAy%SvhO}!?$#&HVyWJ%JZ;{5?@=v1f>0}a@1cbc> zAC{wHP5gxId@*AjNhdfbFr3Rz<pqN3bDFz?`q7y_cjE_P@$1l3)S>eeWaXe#=6nN? zt7-O26Gbv<*vO0>#|DW%tH`J{<vD6<g+iztYr9nBHfres$(dPBR%I8#h?ZW<8UkC} zdCf$LxD%GzcwT0E92U6g#sYt$05&EZKCWucA(z<lHCXGizvZ)69I~GH{azmAX3>sG z3W?R2(xq`2(LSIA9lgPWxs2pbUFfa(Fp0zTqZg{#pWi152Fby1DcOw4Kv|2%fwYNL zKTA7FM)ZZg^`y7JOYp^>_ysBCk6%9FQw!TfJJydOb%SmMZCd{{g}a2Zn`v?ETniC* z4pH^$wEEAkPyWAENJ(1~tybu3?N)8Ovqis79`}3)O<7|~FS_wwQ!Nd#nWn5evQ%NZ zZEa|GlU|ZP9PobE>XYddv_x%ySh)#FMFKi_4NagVo8-s7B|pgHyt1S3;_<J%EJFfN zqImTYG)~S*#P(xWDW5hL`}9nSW9?ku68DzAHefTIpFc+DYWwD7TS~=I&eX&(@xDcC z&~b0=Oa3SV<O4$xvaI&Ja+)|EKxDgWjD;Xd0Mb3F%HTZz_tB4F3ooySU$A5Lf2=X` zSkj54A|YY#qwg9Z<&CwZ@K|!uY(UWMr-f;$?Wx2f0e4SX)V%J8yQxAg2ig(Hd8Wt> zPr_xYM#*W}1WrL?BagJ7iAb;-4mBrnQe|6f<dpRT=jv1n<r4a>Ysc4fozl7;K<(d4 z&t^ltfloHvN0QZvMWIc~yWeVPnc0DTp`wyZM`IVG^)gQ!UwF0Gn4pQ!WN0ch-OHE5 zrx4V3Y^k;TQV||N@+e%%Tm*{W4a4#|y94?hRbUtxN!U3vv{iSsHV1JP5PNP;$guAH zZl|rfGy%b5LiVO?1lJZ<R7stzLMg>#zabWD{w`Ih8RAx}B+W%g>8RE4A(dwxSSr>2 zQMYa;8~?4Xp$FGM&T!5Utfw7$3_T&~T~#6B{Clj;<1m%%U1jpaZU}l?P<`RIiALi1 zYFqP{I<2F3XNTaLihl&o@nZ(R!I<j^ILk>hf&UKE;(XN<Gc-L}16#g5L(qU;$4n=W zS_3=c`c7h*pNIp_ij>_%Jl-Q-SNxQOFTn&MVUd@~@xt!`^jKNOu=_nVIUU`^QltAe zzC1kN^Ig*Y(@l?Od@#1FkWhOcjYXKd+<I~lTM@JTpm*}>IDBx0fSnll%aN_%;L_5! zAqwarlBnTcz64+clJopIZaH?*(45e08FCL+V4OgqQfVMx`qM{@SgdHg%OGd<G$>r_ z#F;pN{&=Wx`E9Yo_!vO-?#5TpUxPrAa?}qmCZ~Jir_GW%mlYKt@Bzi8a|xp>yyo}D zfDn(<YI;Vj4|o48phg6sPJQEH>WM|yeX2qUe4O-v+=mc88WDE+gr34D<4Z8*i{)fj zoVXP}jMxTBW(9C$Zi1sADX_SmfOOu&$=^0tL}v3TH$!pKJ=+<VWZhAKO^Ern%V_Qn zjN{rR4-V<{19k^dTC5&^TD$YIy8)8vd+o_V+X#U5hac!$f_i%eMfYx$W!D>_gs`$o z7Y8*Hjkiu1Lv1n-mPxpkl&gK;jt4C=pEcvLPEnh;!t#s(G_t!n&o2Ce*rGEpCI3vy z1Ew$PBrn82lY81?Jk}g#l=XYxYSp$xHl>t`w^E0a<~sU@M~^sN9we~&>H5*?TKzjg zxcc|9Zj*xrol6A?29xP@SB*<TM(D(XI>|#=baeD6QsPU@YuFm(_G~k4-ziVnM_Vc} z_MXlLwM<0F-9CqOJL%gl?CBPiyk+C3n2+E-^+X0RuN!9G*kszV$NGHW@U+3&uEFO7 z91{;07FgG=cw@*KPSjy_spD+3veLirpkTHJ6jVl%6_NQoe@B*C^+%cGYt+E=Q5o&( zU`Tk2kg4vj%bw^3I)?GFGW2~laMMu2G3|*X<G3MZD>zqD22Xc75H-eU(e!{kLcx}0 zid-j3wEc@hX$;))$!kZT7`Fn0mVNe{g(Scd#(0zx2{opl=u7?Mj=JhX&;t5?^_b0k z_;&io1^r%^OLSYQqgw|ReKZ<_940L-IO6oTs)UO#cAjhU7<~qJ)rH((7hi@F;il{8 zuoQ`Hc)<X0z1Df_&w{L=+t~-4APM|dfx<IX3RT~&GCO(O2cHevqt&X>>cukV=}$fs z=Lhx#&0MCwn@Pa#p?3|%>gr7FbFHkT7qJ$%Po2qA4>}yaduo%n^wb8YQ*)lnPHS;S zi`=@6E*BXj7s){mm-?tf%EjsL%hKvqlq=@AmOb$v^*|U^!oW#Fkc0rU>~wzQX&GDV zb4=I7s)ZfqvQxCY#x*1=Xo@8p;bS>jkw+wG0if$Zs%^aJg<g>c@vWV1j-mkP%|u`~ zx?}!_uML~@ogI+m+zrOUuiGyxW)d?HY=5t;b_Gp0m1{$2dl7W!AtUd2?D+EN9<I&F zv6VvkzS5j^KAH>V5VyOS>DGv+^a%IcBU~N((BxQ#wO?z+VmFRmS~Ygpv50&CGg984 zH+`jvIjnL5^+iAqOgVzcs1;WPtlv+@osvipMIHJ(ntIWT-a-AMbQXg@gUa5`yHBF% zfVgjAh*%`<j;Z~tYmuiriuPc$K^+7s98Sm%tjVLYh2`Dx6@*VB5cAt9Qs`L7OobEp z7#>-w9mkpI$**kQ5#-B%4j5sKl+PzP;`q?_s;}&*ogm&w9<HglaD$&h7Vu{G53Ip& zg9M#ZZ{nvG;Q)f3f51zvw7AXhF6yS{V^l7K&Zq4`qu%YW*ZlHq1XVS06to{NEe3D) zGrU>XFQ~i6MF|zlFSM;f%b|oh_CI=5)zsA5#N7euIMgx>YRlmmB!ka?WOQ^*e%8R) zpWt1e)59`nH@zufuoZF2HI{X%pNq`V!H8T#{-{Zo*eZYIfQ@zC#esf&+wmZ!B5DDT z^zGKlcpvTkhYRIEeKYZU<<+UeN_j*?tzIf?&Dp8O3X|}l6<GGBO=!<^U;YWctLsLI z)x&e_!uMBmuGTiM)vP7DEv|!OtF0T@e9c1AmF$YDKruHH-oKeryL`*J(%tqk_~L~` z!?B!)-Vi@HsiWrM+r{M?o}%23a29|DpXY%Vr+OWD62R;e%tIJ&*5HcFOn+I_cN=%9 zy9q9t&#m{ndhdmQ?86<>`jbckT#c9Ko6Rgs$XU_56l*V#E=W%$=tmv0aaeJ>h(M_t zVw1JG^HWCXoT;wGVn5!g=Z=g27|2A-KfGP<PRpm(M4ow{hd6VKkyl*XkGGRzoJuRw z5e)<H!s*$7LBi@+->++~jYaEElOP>v{EitMEoPG8B5QGwamo3Vk`gMqf}bwY$ND>7 zd$DF0FBQeHfAuO7=L^aq-(ESMu!IgiHGV%iUAYuZ9*x_m-#1yz4GBHTAMNmp`|VW! zg|_)@G`!NbXc%)5GI$-Xs8hH$;E{Cx)7fwIis@T0PZq_A1w(rDDGJp>AQ_3!9>@Iv z=4Ez3)WRe!jm|9hm)8^id|h*~FTFf{;Y}`nJ_}w)smNIRjebK>%fiWGSC2AeYHI`y zPPfx#BEdg?!oCV$@s^gIK%WDcq&A~{bvhxjI|N-wH5zEd*Ga^H$@(G6gOl`zFf~kp zaW3;+0gG;d4e;V$b#v4)sRVqPvuwaTyqir!sLA42IrDg%vHuNXxo;w(kq`!&OR9Z$ zWsyTS<8($Vrt6|I3lDou{+QdmsWU4P{Np*y;T~*gWb}UO0*uDa;j$`1N=iCw`Zgh{ z2dvrh^t{ji&knYar?&L!kcp2Gq&v7Xz?-!(Q39Fb6<d2N)hl&rRczI=>hCd)6#dl- zD3m-n+HZ>ABog4Fw^Ag&pp+O*Sq*@7`N#!`!N!%oQPNQUh&lmIw$Ve{E^@L0c2{lA z5n|jIIUOICKfe8tXin2W6DN9Nz|m6BTN!AP+3xTY`=iADQ8gi_2WG6zb^`3|csp($ zzW6=H=SOR2Wc{f6tK_a*WdQ*+CzBdN#g4;&_jq6n5c8TL9m^;oOCvHYX9`k9*l}f` zIgiW3+Q;;6@faU5lV6Fe+*usU*;OYC+0@>F4*0g~K^DsTwLcSHCOkoqJpJbrhsN(L z?tI1b_ZIRV^MYh;W>)Xr?!EI3VV^B4k>G^lgBwvNRZBN}1ArkXt6$bG;L%Qogym6w z$mPR=8EguVdOerK=cKQwCpiBllK8LXUMxf*6W2jDa#TC+WgBMkqYbf(GSRmmKPbEI zJbPO!Jof@ncOQ+$6X-qYs=sBo_DKP92X4uY_AlpE!>imaBu&Yzlw4ZakOHrRzFk8$ zq*M5gvemS(CEFifvjJ!0g1dxrr>F@p_Fj{O>%(0+t1fMlN=w^$$Dq-s4p(p;lc)O} zkELT~n(03&QbLuc${A6yyoRH1ccl#5f{qR3i>c#d#^*Vz05R9_26=%~KMC8dyTFO? zp#qD!B6jXw2eK#SN@|6Uwa*i0%DCS~z<bih$9I^_q#L|nHE3TeI{#9hyCG*@+@Elm zf}t8X4wZuGV_6Dn^q>wLPkTH`v>ixwIB9=mw^P6rk@zY}t2W3D<iwC=3^qs18tO8c zwZv*_cp)#0M0`LYLD6)z`o*;+-%gFKcbA8rn@I9gr2o<flR3gc4G%Y*>W-&g%R`TG zA<fScDNO>Jbn0dZI{Ng4-7<(1aWi{ZqGJ}@mgd!)!r)qKGl+aFtSM8=hPtV&ffcPP zyvdNPuEt(gd`{!i0?+%jIE`CPY)Sqh2orAt{lqu;hbjX;zhrm~9|y<Z9}(o!RP7@; z6m4PA8`toOcl@nO>y=h=cEpqV;hD<pa@$gWDJv)SPp^NRDYg(-lg(VuJq03uzh;53 zSb=h|#UA;5=~`9Q)hff99~noJYK$s<Z-$E<;2*HET;ew0-P7+O6BlCYWmGm;tXFQQ z7Lw^+<qy9K838&4f2jgF>Yk4?SYHQaWmQ1Ts+j4^%Zk)<m`O)Ar519yTOga650C<m z1M5h$wfxLWo`Ko^Q1U^#O!WN7Df57xAP_a{9S5<v{;6|Mch!<O0#ydh(QnLH;PB5X zeneoOj#5~HJQjKYk*On3B%2WdxAP7sX>v@HiN~RANin})+M;JL>T!mL`M&O3tb-u{ z20AAPFRoYi`6&#+@iz;uo2$6xS(iVG3aAg(hm`6(PC6h(aLfUjVMpz;eQ(IjaHeRs z{-~-ll6IrIVX+-9%oiHboC&_)GEBmBu%OmT#`BDp+(FV4ZQ^#Q+P#>xN%th-N(jP( z*3AgV348z{KOEJL4BX%au$yg`NU=RY-}2i!6(3kbdYS^-C$6iWBcBXr5g8XU8Pc%_ z540T*8pyIKub>PnXcQZ0c=6pX!xAI_Z8+Lj>QK4rHSf7A@}c_^m%3{ybkKl8GRUP9 z!l8ceU0-*@K;W6zdrmzCG@*nZgrdG|sG>abx$w4ExQzs!N1zKz&;AAI3QC<7j1Jyq zcVbze`|s4ASc-rgKD^P&BKX6;;KNVi-_=i*6g+XGcCWfHdgYx%SIv*!u`&1^k5wb< z;L}lQ-BBRIE}ZQ?nQ+c{Ygo?*{ObM`4O!A>E`5wdrr!UATZG4+*J#2>uz&)wCULpl z97=W{Tb97K^=4*b{&gvy67x4Lyw(U5(Mw{DMXLhnWRT*eLQMSm+$Ztmlsv}s`TiYw z$ZFE#M)e6&l`2D!$1wJs`&xc)$UBd}zg|w!)2`hp-`0Fxa~C)apaOp2=ZK3*%ZVPv zP~1F??&*ICbJ4XFFEMUCBAFb2khqWRxrpzKP1{uWZgar~+hDba#z@@a+r7jT*)*Cz zz78Aa*BayZc;aBKxn~&@V#uW~c&$?v-<ayTA=LTR&O*Rpeb2jKAbYcyG$xAbZdhHJ z1(-E7!NQT_ni_H@t^d>Z_^FZ4YdHRtx`3+);TcZEVh#VAGC%O<ETxBkm0U=~OUUyP zTo%Pl#V3jq7|%K-D{fV~9y@pZATcGqi>HxTQDr8FchlSrtEHoU|0&n)1`M4c%#%g` zwBEL5T=lRJ1tmmzcf%#GY)}^zB<AwuMErDjLeoKg--_=Rg(lllA9O?{Mk<b0F|*-E zcra2!p!``+h<GX~)KDOP=mZXIxD^aX=P7#nnZ+W49~Wp&26ty@6UiGVIJT}mHKp;E z$8hi|=1>$@%v=GX2fL9Ym9p##yV$VpT{oBm*&pHH2Hp9H29-zL8Y7^Ez~PD`nNuvh z0aB|eP#;i#*xKc!6tuEl=|Wo8K62rbw&Y}T)=dbYy(|R}^%&pk64ja}@H5{RpQ6x1 zgAMwICmdOhsRfN!1-@yQ$Ni$Qldx*Eh3Qq+#;xC`y?yCX0p8W`UZ|{3`1PaGE-((( zr|Z;bK4zho`_q;wcIygg0ML}$X>rK!*}s~^hAv?{)eP*it$}#lsjkg#)LnK&ZYi*y z&e%mxZ7kY}uD@qwkp>=zm8sb%KAyh__TPhuoc=~{j}z(7M_yP<MILZZm7@e2cQAwL zW#?Op02gRD59)kLdL@M}?8VJIA(z5aCdeJR%uKCcC4Sh7PcNiXW52^9?}tKl(7eBY z`>;&jbA_P@i#kn;86O=R8yO#`;Sosv_4maF7gZa+Pxv-ymlN?T@-QCmU1NIO7#o<M zBS`F?`30YBJIx9|gK&f3u)n2xjzx@bI~+I$=^WekrC0Ojd07~r_!qmLtKm6E%+`kV z#+oGaL+5~d1Wyo4xn#li$3+}8x@-Te{4RpC>MAU6u)_HCIZ8|09exrfbJh%;ckn|n zSf+)gQy*Po$<)Ln`V^*fuHA7|V+&3DzBKokgeu>ZYhEAoBBumB*ij4#;k;|=sMS}q zp!1vles~IMY_`2;r(1wNP%XC%@ybx8D_;qnJRly-5|g7(F-F&S%Tf`sk7Ax_acVi> zD)8r1BxXt|JsHQHtjd<@;qNYaa(6L|4ohTp>kas0vT)`vZVhxzrft?inRH-jiBAq~ z*b_S$>j7nQ>^~UYZ+>JVOtCk}C-=bO=XkIRRe2{{?);gRHj2z??bUgI)BALM<S>uu zpLoofOM{v%8*=o@?0b;G{g7G#-2OS5HWgJO!S1Dluq{@!%#JjeGKgRHty!z$eaRo) z`zyw`qNg_bd(N?X;*{Q@d;3#;_%r09p|_kRI^x`l=!lCwSiaS74S?Bpez-92?3^LZ z{=2ECtK9z3)g4_S8M{wx`s8IDLFG#m#~1y<ohed{9RP>P<14~~Rw(Y;#z`A$n8XxU zNlD4;*RO2@hDN%8#RX-dkgA#N?{;>lf9-`|Pd|V~3B}@u2VF%DBa4bs2&`D!7}E2| z=UCh_$8)KvvjSa1y;+3#lDr661gJ=9S_J5m&&?YN1$%fRG=4-#FLDu(2b8QDBa>&{ zbZu%Zlo){0vY1D`Jw0a+4(5?;>43#ZR)iB#?)$&B)CfH=VNL87f=)!DAV;&)>=%Z- zvPR)wuPOI8K8x*7$4z004d^oSvlJbC0AujWR%4t}Y0n4GvLWceAS3Gc7^(DySjKTD zhww|H#@uQR<qJvc5DUucmSHP0*bP~)?~ESM98g+i)aEwTfE^g6917&kbt32^YCDiE zUC_bJUR(ZTXWrsSM6I1?HW!78yVZV43b<#bYdDOPXIb1HJoqlOQ9@Dv9!lsOhe-Fy zT)y!bOsMapEdQc-K)7&-1}^j98afMkdCAB3H~5|MZdD&+?l6=;CR?kds;)g77_C9> zM|x8>)334wxq&hO7lqaTh+T%^kU6ZS&J+eJ2)y?VL+#=(t7e9`Dme6FbdI>Mj&n8W zWLh?VX(HTko0>ZaP2O*cYx2?hwG0C9+P}R^&3jD-Ot1+b2O$#EbOB;<9+~1N-K)O) zB4@LH>)VI%!I|7Pm<AT`PD-@=;PjFRaIJg>wYwnxEzEq^R&w=ZEyIl@4=zv}pB~W0 z43)WVPOwi1tZOc1oU}^wtv=q*(BB}qLz_6^nK>Foc0iyNJzHc@%D~QlQvJFDZZ<YH zBn%C6QJr1U_OASuhM!Y7;?3AQKNff^n>h&4D(@uuSrI>Ha_&5U+3A3&XlP9zk(A?i zhZV=@Dmd~k)P@#znv=0qlsAuysIwe|lYNd&EC;e$7IvF(3W^JcnLf|(aVU+(yx-+J zn<^u|pK*@0X1)OWx(h9>u(n})eH*{$;Zo;ndUh`AC$BZil^7Lf14Byc&|?s93jins z#>xXpBU%eo3#d?54PWP5PsO1s>oiG<6Zo6d1H9q*)rgftB;DnuSjv<+4(}2?S>+C# zqur<kkTAK}r&gIQ?0g-$DzT(*KLh92X2mihJ4w%8!IKY~-ZQ7*U_jr88&zo7fB2~= z3+O_6f~{`CQDQi9TEnlrciZrRSuY^RqzH4d6k#m0R%|gCAZEk&M?QGk(7v7u8SQd# zVur9LQMWT!WwYD)141lk<kE?a#ch<DlJ$L{F+R>GG5-1ECm;cLx7WZjXIP{Z;YJve zqo5m83>~`_D1a;fPUc;kCZ6fYZucPAQ3Nk`&2pcU9W#wTw)hWzA>{V!JT;6faG3gX zZzX4!;KXV@Up2_}n)Wvo&Bet;#0avn*%);Jx~WANz8!iMY60DlNoEyYYhJADx+Y`2 zF-{A{D@XkeD%ksoSd6@$=%uWT#|>nX=H#1Kaw4A;iZq3AhYIMKwRjV2<QtC6o_Wtl z5GK=YSBgbyCb;OXYy|T3KuXQZBtuQ_!g=X@xYzQOd&mPnrDA7axay0(+>|#ltydg^ zSI#|g?lnvn8CZh}@su)6z4GCcO*EQly@{K#u)!Zd!3Opso0|1)2x;BJR2;>Wi|>AR zL_>86&#_4UVL?w+7rKp61xiWha95$p!J14Dex!pX!4JDILq^3SF6QLlUq}#NudfN8 zhqw2#ijbp6RYLIx>Zb}-hD8-1u+z0&e0zd_&GKSrBKww+sXedY^^<VY%U@exdSwB@ ziUmUm`&TmYtBp1X`dX6Mua!8WI_uH(v=QH;S4e_5*Qud*G<0;hq@;>pf+@^!%!;?^ za5C2?TgWSXpSB#J{SXmEQl*daH@0<=ENRBAbjytlpuF%+{K~LHq3q7Wj|LisK1pU~ z8Xh8XfOr+AA3Ish2_+e^3GQ<D*2U14Ok~RK=|^PQ?D)`Gg5>Q0{0`c{O#VXd!6I?9 z;a#>|r3ymvl9xGcwhv4-sPxl+eW<!Ba6}d3IFDC}`#>`1r@397?c&*|uh#FNgKFDP zw1lA##RSK)D2R|w@8N`gCY|$#?!o#o2-HhgKzG4OsGIAvb}Y7{@cj8;N~irTMIgHH zRN2}LQKvu(y^OMr=gqFK$1IPSAQ`0Y616%UK;ivFS{hF}Ol^eD$;I0{|6SaO9Qf5H zoMm@LVI-G*qKMC5oD;FbVYQ{fKQAimNz1&<Etvly8hWC3l)Z+uc}5^ocf_(==zNqI z4JLEThK7{%0ZI;+OgMdgNQ1I4B>&v0mveW?yBqbXO)00mL;t0?#4sb(m}2PY^hK?p zXUguBN=9$qor5BxU&t0-)^ZOta2dK@^l4lU(0Ww*9W%~5KxVsER2b+XUu+iqvtEv= zlb>(t*DSI{QNCyJ7Rp;p{}{bP_BtgU`B=U`@^6u_VfC#E!A-t^30T9vOz|hny>3fs zP)FADx@@9iRZloY;(u|xJSo!V%1`YbDaH!ISWnrM-HFFJGQOqB+dcXY86@hQ*}kEY z1+vDk@0w1&Lwa|5kCZSCiopq|3ttTX&hKbi4*A|Z|44VO#K+NvJMw;wT_2W_Pu|z} z)VO_Bl_A&FnKn!Pv~@M5vgRJlxz`4{y_BG_vA=4xnRyxZY{p4dANoCmKj3|U$6tF> zMGN&-G0oKmQ=D6#y+0%)%pDyoQ3wU?XOf6DrnUcH_4}OS)V4~;%BmF8b+UOZ=`Dk~ z?>Ax?3;)_BcBp&U`2|Zw$?EJZqt-KfY~**KFTLPqmhV@9#C7fGTy8=;K)%0H!^&ZU z@ffqTinc#rem)m|9sU0P{-Uc5V(yxU3iMq%1;-yfhcTwk-%d~%Li^XS8dNLK*(8l( z3CN4h8!+*6K6eifyu`EFs2MeqYb;}juRdANIIwecJMiB{5&rr;kBo=JXeonCY0*~^ zu!%Aiv|lw<%CU`#VApTV0PhNyk|WbpizG(3;*kPZI{zHnXX$_DUOrtB2&*wZ7)J|i z|Gj<IGoy!`)B|bmH@`M)*3)Z%i06zg(9TK&Wj#Ye&Rut_i9UD@$jM+FT2IDslhvw} z|0d8o#OtA+w#H16on7*BG3R%lLx~4Lu?^l!MouWq>)z+}J_(I8M@&bKwz-`+X*u)Q zHP^WNZeza<u8nb9DnkBT(RxB|Dg55g$!v4WtaH8%O@)Zq!qPl8>L;`ob|E5UPPVDj zcBWzPMsjGpcmou6UYl}<X~B<6HjfQp)h1IiBJTZ&4&yBnXj{rKG|f5uVefvPC|p^8 zjIM^XGt6td2@z?(DVDvqi<*=VR?(vB5sSY+wK(djfS-8YU8R=1!)vy9)m$Od(7!{K zUadt#*hC48PA+qA>R+%%DbiWsGLvn+HRkDF5yYnzc6HnlAn@4-Q&3a4e;}T2y6A(3 zCMao=W$9nams!`lI0KAi2h#>QRv)Ww6ehwFs<6c@^1HVmHwN~v=ZChFWSB`#nD9}h znM1?F?MX7OkC!qQ8f+SDAmmPY356D~-@fIt9w$<&9iGZIh>E4Z82(3Vrn6iGtrOxs z+mgSh-EEB6*<F<Ghm!z;$E;N}m`2ffL*H61(hegky95f@*;v=d#>N^gHdS^cjyfw! z0@)o!Qu5?j<Ea}clt}icc81VC(T=5~tqR3oYBRO!rz=_OqRaQ96ccJv*_h1oT&dVs ztES<7R?fwGq&&MFB1qQJgZ@QNSJ%jv`K<e*m;A){&{IFxFE4_GT<m45j3sumn*2i3 z(`kuji#>qhh#O^srKGSqwtdvFKHEe`_@unKJTo~}b^6;1%BlO%${69zUx9ltUQ|pZ zjgiR3_%u_rrPP;mMJ6sPWR%n1KNCiVF(RQ|0fDo%xy)YRv-jRQT#POgY*Yz`6Z@6l zS*Rmpb;a*->rqCk3k&aLWK~R97Y!S2ybF75$2`}U(=@!B;Heqv_6i#EC>RvOMvW=9 z)L40r^lCL3;?6HeUen`i_%=N!1kO8&tS!~UY};<i@8f^xU$ffJb$ju2_l)R^@h7Qt znvff}w!Mjh$>1_>bTK*AR{H!}YERg?$<i&T&R|T_%-CJt2Kop+_}kZ{+ilPbb4JdO zOC(2M8QLAbj1H19$(1s*X89Dg@ESA*leRe2i8*&4!N8)D5n(qu>s;Pm--%ZFh>SyQ zWr;j>aRL3AckKlghiW5Ab~ILAxfJyvLnuM@`go!@kXY9+i8F`qm6eKk;;XBx*|3bH zq#t0twO7+N=@QcM)6c2jE%jou|D~-e4KDg%m_4nhW!2Sl_<mitXVax!BfR2%a5#<i z5O(6mV4JP*QAkTYbSRrFf2>I|s2S@~MgdLHjb46!lmca+F>CRXPenzgN|AU{b?%=K z;<KCce0U6i4}>LXhN)-%Gw*1Xw1JcRodm=Z;qA(bG1L_dX@+euNjolL+NecJ@i7ms z`A_QpBA+O~F4ktFTT)2sjMW!|Q?1rirfB|~AwKFr*DfKUm{QWAt7YEg<Yaav3JT^Q zKJp0&<9C6c)WS|&RF9Zv0n>NSJy4tCR7<MR^;nBqMppcV35GxZk7W1hZ8f0@=wcLa zV$j7IiX?_HWH&c9&dx6f;ho$z5P|c}vYBU*Ot5z?vm29|pFu^;yPn=GiO){`e?QzU ztA`0n!Orkc7cTrC2?+^&$sRl7#L9U>C1lTVGy0il{Fc^#h5<i1y|pGRfwU>9h~NDo zAr_M|gpfycOE9Zc#`k|7Oxj=>3YPs3dsT*$*Pn0ym%*CI|66iGDR_Fu?LF^LEOdNE zQo|3QBCO|oTcBEdp$}&Y_l)NI#$c@0sFwOw-tyP5H)io%7So6|>+L8~$Ae(_Gp;c4 z+dmM+Vw>A%nBG3|GY;{i|G(Aw|6kQU*VC6IVtparx1D@3-6Stwd~dk$?sFu+CKf{^ zxSjK4i9baxIMT@{)5t66EwBviU+{!q01AqNBOupS=-x03;04Z^Xxxqiu9uO*bE9c> zZ9atsw#_BT{Cq%UQ&o&}pH1K{TYSxGVL8)3T=b(x!x;+%@**JL(F+c5!T@al)EbdA zk(Az?5)+F(7m~FZ`edJv>UZdXe=hDLo>7p`n8fFifp%boe8iWUdW<=v63dGE9_wTl z;G53yWt<{T*>yUKuI(S>V<ZLe89wRz?<xKNpQkr+x3Qeny|8X*C(D&x9AT4Px!2Nx z0OX*nCrIMOi`$ltQ}{D>^Pe528v{+f<{SDhpPf}<58+rr^SS2Z;<yDqipZat7A@v6 zg1fmKzpdY>seZzK4jYU-7d;YlB_G}u_!PWy{7~_oqw!kgzLq?&91}EmSKSE_bLjEf zOi9X$S_pY}B<%VnufxY@M)otkavpeUB<eY}0n0gYWmf6`{=q_46*e{Wv<3pX8?cOj z`)ELIpL#=lef{|k>&nRW`V`6)+~ws*X&JX^Y5!dDM8dMgUiCfnY4CTi%sLT1bBf*% zM11vpYJXLZh8u~31zs96NTmPzBdOn7CsBj3sQFBC*yzUX_GxKjro2a8K3+sklR(ut zpIz=QxWTYw#qAhNGOnp46%?L=LnfgL<TKMtONH_=J>?AQTc+uy+6>_lkSdw_G7*<F zr7GOqA#eHZ#;F(^lY=1n4}YbB{9S@s(WOn*LIAx5kK`^`eK5kP85SJxbFMHN8c*`C zuqkq=E4SVnEk>Ri{EXjkj^B9=47&qT%u68k3v1ICYodD(aQfIBz5-quHKKvB;VS#P zhwW<iJAwNrr!%`h1rX6|81UCgR{}CdfRyeY()CIAkTPY4ijN_pPt~fKzE{@9-T4_m z@7y_3nd25}qr>==Q|@T##*fm|mZY~y$nCwOHtA=L$Kp_UPMx@$$0w#f<8gYrj%D2H zGqW_)bQsRFm4j{O6uF}*S!%!9Cq$J&^<(!A%d8TB`0T3#uYgEvd%`w*TXI&bg4R;o zk2exZYMlMWFY_P1*KvHauMnMg$r^95kUa&d+?_7i6r5jqI?X+j$EgG$6j@7(weLg# z3u6et^3&Rf0_}$dWWiDrE{|r)>XY!+He#-TQcCVnL%tr6;dDylokV$bgIweo72A)* zjdCHl%Tu??^x}mY&8;oATiHuJi!)iG8Yzz%BI)uQX><Zii|RY%yPEFsoxImn?&WDu zMqZfpp~6yz1|d7hUT@J2hL>YjiKKXw^{*(m?Mi*-ZsnGi+6yl4ZKf<5xTO||>s{k1 zJqW~pu`wlN)MGVDT-4Qs`lR)QizNLe2a4Q!&vg8Okvu847~TK4{G$Yu4~C6l6`Qk$ zbq>GFoS3p+({<v@_wRohq3S3KM8Qg+5!>~dKbTt;!|MDc+!W2E$EjqM5Q*c?en;{6 z6o2~sGP{1S8A>+pkZi2mMS>zIFPhM^n78VmM7Ql3ipyr>U*8-$!uN&5o$C6Oc*IM3 zNUA^I&flT86mv0Iz8@|(lnQanKmurVGL3y7d3rGk^(1a_q?hDh-Y#``RmSd6RtEci zmi7U$m@!M!N%6-QiQk9K;^ztPAQ|#6!J?xOcCoI8K@cJ@|4Gr``vzS>>ie|5{ba*@ z#`(vyPqA9Br%Q3U{itTMorf>|s3?(xM#XE99!5=qptpF?v1kAeD{i0cR~LS-!nL*M zyzC?`U0j&uaJ^snxWRd(%@lkkP9@{&k96=+X~O@Z;;n<?Xuc@WFC;*aKyZiP?(V@I zf(LhZw`EC?;O_43?n`iIgS#&7&H@WOe$VQ?|GK7Ts_sm8-#Pc5(<jRC;bZv^mXz*l zvLuvi>cJB@LBA<W7j)sNPVB80zwyNlk><(z$l4-ZU6a}difOTt7qRO;!M;*MTYx0c zkLEhFg<K#~au#9{mTC>eJ;E<wj<uVN24CDzRZ3!Cp;5JOnhp=?*{^N?@-waPs)zdD z8B!7ET2c8nUDnScJ?zR)Un0LUkd6^;_>ie~RZLw{KSm)eE-FhoWWpcQ_)w*|Z_8OH z#xa6}B_kcmR16|Bh6rjNE#s)xpFfV>DHD>}_^yVs{Ode=`8VDFtiu3z*=3Q!N3Ds1 z`0{;d<!5l!6A}^&MO=hrS@#<5LsUoXj#RrPqSHRBs^;qok4OgDhxZi4{^EGA%{Y>y zsQRrchZSg5PxrMW7wVqfaU8pT8?Wjo>J5#7<tfH-+JM1V>YE<c<=H#R<^)JRt$^C) zQsMJu=1uOUI2J<Co*IPmIuLS^fwzGn;xQSmq9GHlGIy~ImDLcF@FC|<4>7k)RX2PP zJkhUtK*-<Zuw{%GnPQ;eENuvhO&zhV5-sr7r1Vyz<?V~|!z!(}8xUGBK;N=Yh{{^2 zS(CYjP`Sd@xH)coUQo&&X?ZrmFAjU21JEsRs6r^Ct6u-X`|@^+>Nf5$x#6u1UJs&} zHhx4xzUd!c)mHAsV5h>>P^Zhv2gx-c+RVuCd+enb$%J5@pGp0y<rM*mc|X&9B~||} z<{|9SkkVZl-Ip>pOFxN9%fa=ZlM@-hzw7GD=U!f+ppht7d7=#KD&-Oy7+j6^0;g93 zDOL#?1m>@oWoCvnMn`jJ@p1kx0#50~Jsn^&$0`>FreWnys*-dP4+0Eca3`Ab%a=1M z&~j4*v#~nC`~ktln6W0ok|pt~y0k{|@#CuTk`8SjSU&|2R$S6@i!d{qDoB}XBN;tz zYR*DA(hHKl_65CMC0t%7%U<qbDO;Nhq%+T|6ABFSW{)(fMN|?QqSw`Kr%*eikaKS2 zetW|Y>~|ZfvbNS~rY|(yN-DuFUGa=PJ+Uss@cc@m+*KF*&FIM2h&(9oFB^=4GhB|b zpo$_F*+Tu7p<ifWTEcM&F8|oB?@1KdWAn^ydTUD$$4sPDf-O^VJw;HHtfsT|0j&t= z6BH3+%R!}WR&|2K(d0O)a6;elw}B$)I{Ey`mN02Ks1?rdM_AA0hb!KVowrH#Ooq|w zluMhu@|ItHhiveRQW%Nq>kZ%@eQfNb?6GzJjU&n8RCRsEqo0SZ6xj_mD-I~!NC8!< z$FT{Z;}FnT2&iG?2emT&O>6_P+H6Buq!I-;P4K{HvcQj@ltnNfM_zc#>;4ox;lhY2 zlAdcR{5^JhvLQGTPLedL<$bwhH|0ss>ZIZ2gMGQdK)oG(rTWXlIxb8KSGuaI;*vpW zqKbi+M9vYFsS??(X_%=i{2j^QLxwa)Wv~Gkj(VXQEDm`_8D<<p?dj4tOf6V3S|mO~ zFmKWM^{S95Lv7PdNU$woIoFoGCYMz3;-?EM3&Oz&lc`!nSs4yM+cFWCM1DYTB-Ox> zaaaL^wRZU+3M-4(FUGG4@k+I|F2FtIQ5P@0^^ir2;b490T9Zf=fCw#O94HOz6Bs2e zrX|`Z5xQbO&~eY#&z<q3iWYy9f2qT{kfz@_7`YKkJ>{iN4BT~(kZQbYD2d8~aa`X7 zqiVwUks-^<F`k<m{A&SS;liF?c><)0u(A!sU6i`vs*1gQ7|JS{Focrgw13Jqw>e47 z*FH+Qbg7Z|B+c`RlH1bdYYh}PwYbo)WqubWgDdvFZHQQFkpC@5b(Ej;=^2TjFC^>H z;TZKOymBJhJ9YN(%Z#|)7R{8X!jL+EHsEPVgE5wO>?DF?JG4jHpHT_;=b+?+en#!k zb!5)zbwa$x6QU!as9&xVeDnyW@qeM5!2bQ1DvZUxHXT|HLHyVF@ZI<BeAtU{eAzNS zSTiMx;&CjbNro>C_Ddm4hb?`%+n3GuJL?k~ObZq*(wHhdB#&M1(}0UuIU<D%Aly`F zoK6?YFcf~~$a7*vh{{pC;76DcWehY{W$}4rX(P?(>vej~B+rE<ioW!KA8#8~2zXS3 zMrE@3pap?RrtlCPy?eD%sOZk6i44#%Ao^LR#MMKOwFI~rPn;|p3%h}VUG?oSXGJdt zM_&Dp1dWrnTxb%TR7|!KW#T@M+!e%CDf|B!ew91LgO!)}8A;qk{ER9jXG|gR{B?oM zZ=~XCJ}Flq6k^*N#7C0dM|>9#>r@FqKs^Qj{cUzQZ^e^%kh_zhodWQc4{`TT<^a$l z0l@kGV~C5l96kls$6s3+;aV@+yKMM2(TqmDzhF5^rz9}+i2S1XJu4T&mp$;87x7IC zSoD{5ypU=V^M;!9v0VloMDQ;c6okm>{O=n=Z1!lLPwG$4Yx)nWu~I+$|B6Vd|H3|v ze~>T7aOE0#r2h)b`Y{0RvIN5EmX0@VL1rzUpPO`g5}VQh6Oj<dnKmsl1_`j6t{x8Y z%Cnr4G&=FXFR_;&Cl9Q?U+_nbLLJQ3o=SfX<1sM*B#cxqb3Pj(RYvg}p=lG7_DO_; z`N>1k^IHFj<>usG-8I2iwPS%_xCk^GQs*pnOxqQEJ!bJ5hWOxTCAWt?#FF51_mU{u zHHY+;Ag7Jixk!D&D$>=^vy!?-sK>lxF`OLKQErS=KL8SYcBe^qizBI-Mvf3!LKm(+ zxEtZOKrf&3rGSmjjhy>mn%Qtoz304gObtF5Z4wkk#u>Nq^6Bn;+{-QGO+;=`z-XbX zx`Zht!)vdHVT;>&0^1kdJrQW;S<r?NVjV`{cc0$yQbz=`!GRM!+OuGtF~WD*3Qe@1 z;}{a4Q8{0Xh8u1u`l^3#H~`pWCJuQU9Nj~Q6xXdbB11ZHv}}^GBhu(9{lz*qC1TtO zMf>Q09->mfx?~q$w51~Mh`yS%p-VTY*D?!LfWkN4Yh14b|MBa$2i_;x(FN>L<!vW1 z=dC34?@^=8L3+SaP8_PXT0yOgycYwZIB44G+vcY)l#Wunn5>D-e!7JdB7T=gJ${_F zJ6_hLOTkmq3T1W?f5aeEix1@qUV@|A4zN0L6Lx6Kr4GxbT<uOVU_6J~<^B(o<`PtB zNTj4IB$X{9X?gbAvMaKP7ID6BQz&}5^@LO}<mIW%xTkp3r0ujPV(&cBJ0#s0%VaPn zD1}(WSWFU1NkLJ~=Y7im#IOi|2JvJifBO$148|>+(__gdd&AUW)fG&V0@{F%-K3z< zgGz`u9ELU^Q=cNA1SrAqsS=5s6g^o(e`~|y5Xz-5sdz`iu+;Q*+k*<nd(2j|HURuh ztdM;ct5kKSAz-}FGA~(>O)iIFHLaOtjd5dp9H-up!qIy56O*}(HWK^Bgf@h?kmrVQ zsCU`Cb-^Jydk%-ze-HR`mBPzFnT=r4>dG6eft%$w)ltelfD8Op9)3}A70&|u7vjU) zZL|XN=S>`{F+EtRU8-*ph4iQvI)QU;-*QDc?dN`iHg2+*!I@#zU;pUisd#Mh>w^#L z%un&kUSeg9U!G@s9zKh_jZ=YOmgt!z1wLww)x>ktNjnm^gUPT4>rb2hoKbJ;Sn!uy zpj)zA?l*iWCDsC=NpiZPeLRtJXsK)2cy#QXaT<n&TO7Q4OJPk*QgtQB{JG;p?Jho) zh@UWoct^y8UIQUx%fo~+vqZ(X?{9AuDNj<qgfvIn0Us!{>o@n}$2Jl@%7{XF1`ZMz zQMUAt71y+z$ChHJjfqt=Yv3YQZLeRoiCYRZ&;;asu8KAE8`zS2Q%O`YI4>WSKqP8A zD3o*eP5N>^c%F#^xtC2xS}gl=mW#}kg}%=#>#rB{W;NHoiT(Kr{Dxf{Gj3b7>39Vz zKBxH?tmY`Th;b_E6eVCCJrJ&R64^zU)%p5BOGB7|TP<%qzh*A*>j^V))+ICNTP17Z z6VDA-(dMQUIbU$k?dsTP1Boojf?Ib^^Oyqq?`I_<O0ylqvu#YOaptPT05Y=PSfGq= zWDRv^NlJ!0S-~d}?TwLF5i_Xymy#TxA>hep3gYO`-3{T@qJUcB&@=&#lMs@*0oC~h zl~=!SLC;?->w+cTYPdwo3$FO*>V?;k_FWUA?0t5o^799>zE(~We}%q%+upSL`XYI? z-nw`I;5PekqG-w<QBEa19`SQ^lKA!Y?gaEImg!Nly@tj@(K{LStv}j6{ffsM#gCZk z($Fl*LR>&Dg#6Q6!ymhyjw^$Dz2XpyO3*&CKYzm}O&HxU=O_K2BM~lUI0NPD_CVYa zi)cFU4D5Fx$m%4z-d|wDsCx16F|st)a`{v&>RDWAt(3Y3m8@U;spW8W4oj6K;wr<P zK^P4JV}WVobRh)vZz8@;4B%LK<GLeR#okz#lbKIxm{n0I(8aYZ?QVYC*^fQE*Z=ht zCqe8N|2s6UzJxxt?=zy~<nj<ww1iNE5@v{-Ks!0!rBHRhn$*?Hs=vLb{H~3KhzDG* z`KrXBvL?1@loV`)Mk_^HZ1uT&AF&X6a(M>m?nUS<vQIz`{Om{BX|28V_ON;M9INuU z+T%Oj8B4b`R5t6jfMMy>9XQ|bzhtNrc&=^4(KLP?jd5LVxuZ|%*rN*JB%KV>`^WE| zAeV@qcXdX1|FWdIp~-C|cQqWFsp?UrUGWdv^+hBGNvN9cD>N-}$2)!R#>fe<&&oN> zt{QPbpM*fPwGl5Y_fU!XP{~HS{L0s{d1h5oXQZHc$~zOTm*K~M6GVDnBg2OIXnt)k zu|LH=u)h8ky)|*-*(9}#WvQj1u;aU&KV_>n_gwH7wB&2;3o%$R7~v0-f0UHsZ`jd@ z(~f6n7q>qM32k(g3a@<!#`9<~CcUtR+Rw+7m{5c`AiNrS9;I3KkUg3}U{nXtMF*We z;{Ayt?tSo!`ssU5KD;<#34VAR_sV?>`OrUny;rj@Kq+0pS)m^Hc-nii<NAlS<L_4W z`4Vkv3lq(pdh)KsF8us4@*_)h!KdT1fPuXRmf08`&SAdHu&fnPM+k)M>t!#>jic`y zSNjF;;c4eM`6~XYe_@z&Bh~(beAGRY`3OuQYW<n`pul-%_WZ_po6a+qa5PY9$et}? zaELL(cvyyy?B7mN4o@MPs2Icq--ZI3%J)Wry!D0Y)smLBI@c^7CpN&IiWFC+twEnG zXfm`;R*v!qwtdKS>Qz?*>12()hh0)h*-tF9`gk0Pr-IjIyopV_2{AznS3YEZxR8&0 zu3oPgQ_6z9XQeqymZew>P}%5f%Gn2G@I|)i-IE~9`!C5w6bFNp*bfp93|`IF9XUX< zF!h33E;r><;l_;uHI&6TtmQ+Ym$z}MzH+l{mdBn>lEq+r626Q%fTCW`h6=GW;l&zJ z3$OKh-bAou9hHiGIwqBc1mXvr6`O#le*!7>_)p((uMK@(i{i7!3XQfyb_pL%8Yz&C zX&m<6Fqvu^rte@@mWH{H;JmE~xgs05h;qhP+70Kof`gfP3kF~M!Y^BCj~`7GS?x`B zn$#yS!)FZSlV-5<e2`22YtDQsYM=O=%EW3qlWSJwrqRA}o@?2>A<T2?FK%5#9q*{U z{P=>9f&x(X7=4XFc@fykAQso~`3B5cSW9yYbDJH!Sn;K=!@KG{xoCI|qx{X<FNXs( zZQ0Tm)d`@@pmp4q9CNW=-*Ky&t#(wp<DSE_`ay9@t{N|_zcitZSe<U0C9CMe-vGx8 zr=qxZTv2~`)*bnJCtH>M5eeyb5Imf@H6oiZrVtkGF?cuf$*~G|@yyOIJGX5rHLmPG zwMua$B<~^SFWa=U$%jT3T@Gyxu865Tj(sAxxUp+a`42DBS`jD8UW1N$E<O&GdX=EQ zU{K%ZOHlaL8pi3PDHRINVEGr_C;@0#dh9z}S*!Y08#y@OGg<ReZ$q#8kBj1<4Su(p z&zl}-5mXbJ052Kn1=vl}tdWF!Ql{XMkxB{XU?IhW<8;<ju|r*>$5OM(P&3}qA7pH{ z@MV?$kOI9gB0R}LZL2xtullk5?3|?Ckqyu{3w*|uUf2E;c_+si_^N}(!ZpC$pZXV- z^PGivGDlV3IdSJ1!){;XGY#bx#$$ntA#YV~AT*v~M+UC^YA9`rY?P%KSQkyt3C^oO zrE&a?j&$EOh2|lwMR&Crb5@Y^XU1CIf9mS=)YnpFE$j)MmW|DAfSM)j7pjWBJ=n#f zgm4vvA06|$&Kswqf58A?76|Pc<6Sz&g-8Ih=+UH~m<R;EFU_Yiow8lDjA{#z>{TXG zyslZU19^oKBa<)h(5~1~s3@m`g|sEKn7zBNbn322YnFcxSfsfcEzLSw+&77>UBs2) zF-dj**#2Js=5b%<U{zda#QC1mHZpEdSe?DkRRL>YGghFHy6wOx^c<1YE0>iiHTpMC zT|BxPr-jXMAB);)wO5XRRx?Tcih8C~v)1q~odz2-|NMjf_4BR&<1CK?1wU6li4DT8 z8K!bDTo$mqg>i#J*J(z8WD22565S6Jw=BYYe;O%)LnrL(9Lem3@7#GG&uxvM%jR^< zUp>3FR<95JlG*H*sjT+|(Hfexsy3Y|2UZ81{%>YnjuseMw4*=%R1GDYccPrW-j^z$ zAlt}90iF$PI5;l4z1N?@w*@EgeMB<;-j4k*rycL#_eNg-FQ=JJ*e`4-_etUh+=w`B z|F^st*4>lLT0&wGcdlu#UWJ4vIDT*PG5zgg^f1zNysF8=R|btEz(4EDKKqYnI0>L{ zSOAn6lNhc3bW;HErs98}{t5Dv(hdk)|0#3-k+Lt!X(w4vGU`^gb1Fu|OF}E+dxvwf za89~McC3`W0~_hvL`8o04>G<GZj#Y@C~`}AED{=MYGET%2i9}KXL%gu19FBnq0X3f zjUovJO|m{I5;rCz%}TOk7&5`7-i~ymz{<x`k1RoH9l1b(5}`0AD0ez<l4?RcLxO@( zxZDv{NL!p;dFb*e4xr%{;iIQ+_|7fb5g4srd`nOa3A8P}csVsip$O2bK@MoIhRF@) zy{q)_mL4xcn6UXsG{a^sf6pq@Om#$f$m93Y<LYM$hplf$ncW2O)!;STf3WpW*P$Ao z#{?GqyY_WJ{*fs;BS5^PbE6@Yt;u^O+e*cDn4#~~F?Q=I#ieC*ZZR{5we)N-q=T(3 zAdJhVy4BdDaDVX2N{i93ch|?r)T=gx>1&UlBstoS*YK(3%*4$S&CeYIU<`9VLgDNV zZOLGD8)(!yNV;7Zo3Sa>0?@FF{PNJTm5U=McPi{?jc#$1gk;aD^0)2#{nJ8fi9NCu zyT6k9mzU9<4w;CWM6DWs_*}fD`9dAXkSA@NixLD?sOYzqLplulR5m}~;P%`jHo0)a zq?I#9f}+$A2U*M~-Kz|c_~?W1kYV!&>$|i88cKMVW0*dIZMOLq0$vs*5{FmBLaX3v zc@nvKS&;ygZU%PSW1O6XFP1%~rlDHHkeU!}K3w<13td;=(~I6+6(t;}^Cx=KB&hZM zy(nCu$of?c5@XOrQVN=eTxuh>5vl!B(7{!GScJI!$R3x$YrI;c-rtnn{-wbFm`u7m zoK|nON77QmPA>F9k3nv=du7l$3w{0k_P3LY-_h!91cba3YJTwAmm5=O7xyoyZIi|V z`0ch;R(l|DtJ0gF)Fl6}#Ea6Ict(!qTM~AyrKn-uF#&0M^`?|6wtK`!iC{o3?`p^q z(fA@#b1QhhPsB~P$BSb2$!hvXc$=Uxa^<EDXoco_UWxRNWg?||L�_)wJ!<!7w89 z*?`t?&8j_Y4+Xb*z)dWY%13*xk8|=*-ak(JlQKiT+R^Wmjb#ok{gvP1y1eyjfUUoS z`hd}z^_xqGr#cP;3&o4!m#-oJT|IXMriLU4KN3U?Ss{+=-IjKN_$iJv?cl74R5!EC zLWLYvd>h+dR=Bin#&esT8Fr+CNa&q1jC3KV*cevAs4hOh;6X~RG<H`(TK)0ML|lW$ ziv&+Q_|035gIwFEQ*YIXo?D+G2Q^ar{c)S;qn<;I{cugH@FCh!QzW!M856wjrh|zL zI}ucd5t5`$R4b<F3L?{5-8E$s-*Mf3=OGFbbe|(odirgpYs{=e-DiiD6!5Z#=R{K_ zbxy{eq^_%fu&b!#75n6nNwT?o=?aep!>54P0`IF()*is|vCQ_KFgSCcRwT~l-nH%3 zbl3|L>2NxP82G2!_J!c>;0<!~raKutzaYer6u+q}q=BuzN(EFm3=^eMCUmM`hKuBa zXU_jQ3f#N@JrroYO39S@%Gt=x;=IT!(@xx>?Tpf{@N4x0PZa)8n&=DOi!XW+IBgo0 zggaxJ5`ok5Q1s|V&gm7ln0`xO@k`A40}^KK`~nrffn_@btbAfowTUZ+)1w}qr#_ik zj3;X*ZycW~qjwGTk$~5oum2C4xkhf!Z08%>tAMX4Worf`!%W70g#I4we7F^EQw3*7 zPtrjm8z3lcmI_V8ETRlo@v4(^V55Xr_Q%<oOBH={V0i%vP23Gw2`Myf{YxE}x+((W zJYcVxSHpXZLst$`b!ae$1K(>WxQj=Hnr#Bxnf48lWazZ{-=&XhQ9i*AyE-kX1b>5T zRyMC``NBV`Ql8zVmV8@2lMDzWq)ghrv=P1P)J4UwkJO`R7e?zEDbUfI#sHeG?9kph zxcu<RYEE*N@TNcA?&9!+iZAs`tFQG<gk5&_Jw58_2pK`$jAH=0vreT9;lW1Cx5uue z!b<+Q9_|J~l%p-;ZxRCk0#Yw)@CJ<|po`gbv6QFpT4SdU+t%9C*6%g7KZp0dP=WKQ z)=NZZa=yTX=GoinESo$kWe1D%Iwio{87n@#1xN&VmmENBb<`wmZN0IpYAur9z!Mz{ zFxg^SMVOH61jiCLjSk2G@8v!vlc%=lJ-578G8h)v)Y2yy<tBd(>mMq{e`$-!6kARk z!iD%gu^A%bnOxKbxhXHE1N#y^@cc)k{k|)YkSy4<TMcTVBv3?2i2-svMD3+33!x&e zi0UAbu;Otk`|ha%PAg6~DHz+M66|Y8Ky&mzu$-3Cdaz~Y|H`kG$&dz_4DMdISc9PF zoAu0<kV`Y2_DjgY*~?Ge5g+M>8=D2B&VOpQcok!dI)=7RxeM3jIovZTobfW4XEAkv zA@D@TP0Y>wNF)9y^RLWyJ@6MK5K2NU1*?xaPZ55HJiJ63hN+oEWEiV>%<X}xU50Fj zMTT*(A7pnIwZ^!)QpRFbDy>z2C6_Lk-!X~CQtf3ijvi?|v2!*Rm?t{z!J=zjrBKk1 zld$%vmU-&n(^StEA%MuJN1+PS#qW3ATl7v#!4PeWA{U~?HT(XRQ?k)MyYUj5qp)af z$b(dq)rE}S2^ubj#cnwMw=bEpbs}N+NhFFhZG$hDDPRTC_;2t3U_#oomR)vFIp*lt zJ&tLpb-u&lU$saMQ)DUvhB(}=gmv`B)&Mfl>rIcwjf72?&u{wp7TUC0{}>%cCYLb! zI9@3-Q&)ortyV|1a4i`0(?e085m~&#!Pg{_l%6csv+a4D-htJ^y<Z#{hx^qH!`$_U zi>Zp4lHaSFse7+K*@-Mlm|Z$L4z!tRn@3(rGkc;v1=jkpBsgIRT3WvA+qgig%Tz_0 zYWj=BpEKokO9m$F_&2{#7w+C`Y+6>8G+{RG(6b<sj7($Z`Dc4IUO&5_zMUMD-I4s= zGO;ZS|652C0qfn_?6o~cC4h3?Xo>6s0Z8;}TbM|ch8Z&@$N^srwiMP>tVTa(6{wBY zDt+U<Bm{%2&F8%!(4E9r)FW1J%t=U`SnjmnWh%_!5N+s0cvr`eE!<}z?Zl?RfB;m! zhrP(v1q}2kg(3Ol>S0(lhcs`-ScIu%(ICBdVSajjsq88h{}Wo^ygZrm`@s8al5$a1 z@l`ok8*nZ$j=T-{T`JKzR9ZeD9uv!jQ|lq6I<s1VcE=M>{*kA!ap801+IPUU0~-$X z^swS3eCS?BzkI7(|8V`!r{Db@G0ylD&OcVC`lu0>ybb@#Lr3+uX>YWbkwxi~@aB~q z_FUQQNhxcau56O<n(jj4v7s-4L3N?Y5vO8j3a<hH^vzn1fk8dv;|)OC)|$nAmn@y{ z3$?Qiy6?8|JH55R^(DRVR3Q1TmSKY(D!G@K#B35Tt{lN18!%)1uAi(VHK<!{ftRin zevvk!hTGh~;lM>A=90?t&1X|4NgXa<enE2?rIiv%Do|X08T8+;uG{g^UzKFx7GXCJ zUfb`hBd|Yij_XGcY|BlOZhH8#hN{(2Qu(?HnY@ypu+G8O&LB}q>J>kYIdL9k4dgsu zUR!qmT`K6gh3EF=<}mco(eJNs_bOFeHqFo*@;JDoe!mNGIlpzp8N;)^?&DgOa(ziC zX-4-QTZ3pwd=EKcB>Vyeu&pJUY^DtoxbJ3<J9cNxcwV}O?yi+_Ng)^)j4RY4=jutF z<MGow1=(Js2}N`7Bno@ks>(dKm@8S~0thMvH1{Pv*ZW+DpoScjb)f?!v-D<Ku5{+s zU}ajYT+iECzlYlibtCMg5J0JT5W3UFI>vjuEx8oyHBP;pvZhH^l)*QTPgAT(+f|g# z3+-X8v-E2@xhbsI%0>>MZhAny8*N6%nRa#L)(-mqRt-bZftCgIcLb1P_;=`lLq)P` zaVEJ1du1!@2aP-PxseUEQ<L_g?6vOOQ@eHBPH=8@+;NnJ)-?j`Zm2XV4WM&ls-P|a zAC6uRQw?ISc*^e^qJ4{9g}S5jLcyi)2e1noVeHEFk3Bi=OkT#SpIfkVuB+wFD-au& zKcbo7Ck4k={XRW4N2crwi)<L$xTPDm0*n`s8gck;;ab)<?~AGN>oET&ud#sL2=&IA zDFP2@SzCowzUzkTESz6pkCK~Tx(fF9`8+?GEb!Op@a<q=MLETZzJh?zM>*`k9wVXn zdid+<9*+j`M}JdYl>8~ET`E*ySAh!-1$XnW@F9DC!H95G{$zwx%H<6K$`qgU))tm> zTkgkcihrU{7I>Ui#8&6X)83;-q}9b#oZ*1qPE{0u#h=&T^1r{Hiz#VC6XA5WB?@v$ zE$W91OOUf_7zXH31KzMr6EP*X59Qo{At551nkQNVCNvxXMF{!AInnTaq>_I<K}_ho z)zPiCz6#$MSW?%X2*-%V>6Nf1i~iD<Fy7N58w~T=M2eRKsF}64>WV0dVf|O=inJ^g zSz}yga8d=+I^S@<Qm_xUDz!1Y3OgxF-XwF2%=9{Ik`{@G4qv6~GU46V{jUwNJg(TA z*mTVBSQ6@YL;BF_2+&vvz`HWE8ttD0B!sNvT6X_lXK2{O_2(bCyCWqedlU~15sFXk zno+ldxP_ufSk*sna`IUKk`uLfm$?i=Js_zKN2h|9o61*&j5VthS!B7UIjS<^nwX<B z9c@NwgGgRPx1@*-nkRTH)u5<=3Pe!(d6t1k%&gnpm3LlfQ0)ib6#CQF$$Yjc#ih(R zFEKo1BT-eTyk4Xv%-NPqbcIXAP4Mbtc5$q;>`3wV7@3{b<-ty-)8x@b0{S|z_Ek~w zmClpMwPw_1|JVvzP7<&y8qAu{dQ~Myy<pCsgBSARTV~x8OZ|+~l4!1+;ij;?2{fsu z%qp%<$*{WQUJVS&BfpvA@Qx<op<roIX7($M2EP}a6_3=4IYy?Glw}iLDtU<`;VY8| z9|Z=udFL7;_MgXdWncE)#`nR^MYKv<*KUOg6_|T^>p9Ji9*qpNHF+L<>R4Yq0uScA zU6Tf{?t#$UmicPGth)dahZ(^@OFtRM)_Ga0D;yzBe|KShvb$PV=SA8CzHLdJhJ}}* zoeVg)oT`kmm4MrlMI(@u!!9u9$r9@uG7>#Gm5^|6Lb=TJKMshEVmx3>yODVz(zGqD zB6Yb)vMBzW_oS1JY*F$PzQqT*d}7|qtL~A8<xZVE53G~43Z9<As@^e&^lNuGgAkZU zg0a9(<zD!o)>t}y2QT(gu>BmO{a%t@JZ!Ib-w!#r3h=$*#RS(nX9v-M^Hh9i6fe5? z7TT^w5Ax$bPG%BK?`&d(afkb9>S95>Gm<$y3z(gKXULV6uEp8L!D*a@DS4s*&Yrf? zEf)2L`RcuQ+5Cx*JMe2rUP(DIIJNr04jX2%K{W>;%g8uLYlbp7CcJn^InA_x*4*o= zvRl8OhJVg{h%0r$f#W>N;}uNEd2iRr^MwVrozq{TmFjSNu-@#i?YdZl0E*UbeNOQw z)1+M7F`Ne2b1m|Q3CYU9Shm$Dtyr?%duO$LVPcEl_dffFhVLq=?AKRqsHzo_f;%c3 zibfN6sYhid9X=OtqwJ9f^|crFPPTHr?GPHy?m6nkJAl6UK?DjiV-4K%jGy80EVFHO zxQxdUh0T*09aU->+pAo6E*;-zhI~-S+F5mUNNx!Z8=C9?#axKnXdQ>9J%Q#jWiEOw zyq_mx%~-lQ7SI{Cco;;CGJzLj#<M)7hs2vPT>nfvE$olStYqeSw2GCGDJAVlh4v)V zR$DwQ@lm)&RJh-BQJf`YQB~hqC1YG}LFw&mp$V;3AUv&@xw<YAy8TZCs3DAT1wmyj zJ(KE`5asK=9h~&W?y?b5$6YkU$=T~;bqMzo8YLWM+0X(_$;SH+X(Q)U?lNA6qfLe! z`i*N>>=(BV9%S2lU;+7F1!&@_skkiF4jV##Xr3)<HEdF_gf9F@Fqeu@zri97L9Aft z)8P_PC^A8%`17QD(LZWRWTdz;RoC9yj;HlaG(}>8C!l*;t9Ab!aOm4QE7w7*uN8c5 z;Ia*F5@!|(8J}ZBb6XX;^yPM5x#^RZs|O$For4qu_dI&SwC||rw6#aTH0n9LnJ@oj z7Ov513$_smG;3YuJnYtSlO=#5*ZJSblpvI<4<Ab2mYXb>mt)?|l5oU8h<YKZID4$3 zIaZe|GTy$Mw4&?rtE{f<NcPNCMIX^9!-0V08?2HBiy6!qJ{l8EU8!g~F3ib?#<Dld z5`Pzx**4e5oG0y&pYtfH|JJth=<s=&xwc&<6cY4W^O^;^B3wWH$-!|&6)Qd9YFSt5 z?<z>_UcGBC_}Z<q+y8QSt3F^vi&WA$WM$$O=jkOfl{FfgmVfo%YEcKz;7<&Wp0l=` z1@pOE3Dnu{@aj<Z`Xgn1ugN{oyLjN(bwEU(#RzDI2TjbqJX1&*R`o<94Qu&pV^_)- zE{S2=mraJy0O_n<zGjQjld66vY(3k41EhY~-k!!3@PE&>DFpU%m1r2^bK^}HOy4d| z+(6v$dG5aTFRTrcztHFB&p3b4yrn^&O$CpHH*J@w<9dD6%XHE_yZH0ZDH@<(>W(Ir z53_g_n>fKnw5jbvA3Z-<7Lkn{6mN+HyIuO<b;pgXC)nZkm!3*Hgd_u)j_n{-duFN^ zm?j?oO<th0DWwZ%WsH~EAmX<?k$cjU4^XAK=vaNyD=lxF75eQ5k8C)Ug3jAE+3X`R zom(-5X0bR5H*za7;h4O8{>f?lBuhJY@cwF+&+Uy1FL0gjJPll!r`4|6w5om2$o;3p z0j3%c+AwVs%dF0eEcTkvT7|?fdkR%v#`X~n2(L}FT?rC!9sRc-LtBRz0+|>MO{c%L zc;I<m)$F2S-V0Obh(%$fQ|?emIg_3`vMcO%{&-AOrQ;_Ujc>CCbYUoORk;FWk|M0$ zEtxq-_@D1QxD_8M{x<g^vjA^>n6M*|&U0@QTTNZ{05X3Hh$bu8O7Mw4wD}iK_W3Qx zGcI3YgCmDN+76eZ1_$M>B6-y<BFt*04u0>N-rL70ACUdS@0r*SYc{xJU%X@b&qNBX z0SOBqNC~9I&)WSFuwmOK7D;y84$0D(J*6d(rdqY%jgr6j%kU?COrz0Mi#L~RNZh$v zApuD+Y{GexfW0|kFw~#Ck^=7sygwdT`Z?HU_H3B9{f3c{srG0HeUo15hbz94Pv&DJ zEaN~iJxdZ&JubS6cdAz?E9zob7%24j?jf`~`|U4ZEL6jd6Uj$<*97TWJ`UC7KrXt7 z#Im*)oO*I(!Eh)UC>}X!!Lrvi9)OGx!<%hwGIu8q(Nc2W1mPX5-vSR0O;itU@HwpV zW#>p@ut1RtTHg;K^m~x1>S?ww-<W&D67m#IMV(X0T15wER#Ha}jZM}4FWq^zQ@Jbo zA0du4ouv?6H5G$mbb@<?Q^Lkyj}lsS&-aw)R8-r^1`^69Ep(qQupAmlCIiBZp+_I4 z9xbsLaP)C-2T(*j4!YWjPn=|~cBSHA8VCQ0IssmSuF&Mjg^Gg<R<scBzl|>ZA}L(G z#3PH<mPR^aB`UKKoa$J=@Elpx$B1(;!g&t;^oc0H$5(V5j|4IVv1*eH*~Y?^`|IWg zs5x{tbRz7Yd*HOc(##1TBB$CxUPaHS6Wg*YekVx;+s{)5+~S=LdE9@C`h3Wh2Huj8 z+Qu4Nop^&6oslv4iZRk()jloD8%9Vk-dt+qvk;9&2=6=*O$)g=h=T692*(|_NlnGV z7Cr72e~ve>`<`|_2fz1Ny1rf`@Ml68M>|a_;=Ir$7Sl{Ju_O!rW!lL2qI~WbWC}eD z{%Px~81~TlcglYVHfQmyH+rs@vZjR7r4fv^>z~-^FhtoCBT@F3Jg97fc=|h49L~$v zMjhQ#qT<0niLpy>Ldbq^bmE3-5HHOc2)3_(Pf#xf2E7n^fvT>FJN5Jnp<e2RNqJr9 zNyMp1P+RPi@}H`f0Rhg`iPUp%lE)0Y$k0YWD~9MsSl^h=CBb3jTcyiF@xWl)R*M($ zVoKP_eN*?8iau?0BN|1sKt|nnEJZGv`ezjCCv5^Jb)Zh^aQZxBo0DIX9R<em8PE0s ziHeWuEPST}wGCt5<?w*^>ry?aLujhQqD?Gno&7Q5E~;Fn-P$r%y(o^CE6Ui4h@#f1 z*Sv=m0_^JFg?K`Tbg_usGpj2f>QAd*S|h!iS6pmJ?h5{mcnSa2nVz$a&KMt{bUgIq zjn`-1tr#ilJ)+v6z5Chu6J6;ACF^>!w^|vyNJ%GYV57Gyx`&a(ifPABI*Yx1>JQVb z2DWICo0-~3r1!67MWuGKD(yqW3%dX9_1I5FQp}~(R%%NuIo<7m?0<Im?GfwJJZS^I z7^MD*R+hBWS@g0GCbVX-&a~PDBQ*_!+N@!(=vajttglDi;^^R%YKLoD6ov(qYM?cX zsg;;Qj)OZ*|K5M4rSICEOjeh%p8sMSTnUkxWxqy8)$E_ZCeE5z*oOGEcNPg7+gFG& z?ki}QE7hqyMNER9MJUH~#*FmRMPBF{Q*?|g5Ag%<p)8otA=&8SF!nEoMW6ka%Ei0X z@U8kYA@=_F!hIwIFWf~AY5O~`JtC?JPMS$?H3?vk!Gi*f$~eM_38G*Er~S+;y&st# zSdbq_TaT`fcjX%t=;z#8hON!ed<BaetlW|=V~$l)V_Q8H`}$xxP+KlNhF2@+1DS7G zKtrlq&giwvZA2*t=xylW|1l|h)JxJ%8Sb>o$r-(!xE+ubGsk$K8fqho#<bD@%k6Sj zmhG-s;4o3J<G8jGtl`x(Z>-No*xMFVR)+n#0p}TXp-``ZgZ)GEt=H;YFONb?tenoa zM--478v3BM?glzoa|4$@u<+oCV8%Q>diW)<6rQ-e4rlL2w$Lbx_SKRYd^_?;YAhez z@j;tsC()PXG5x~GQtVQq(_tVOH8XN%Pr`}Wx_NKx%xabO)V_6WJN#D_%iC=f9nd72 zbE&_+Zp2%W81z|}KdE*D5dPc$HIdY;3%~J>Mvv7>HQ6t?D!0d2I<t>f+4ruJUpXRf z_Qd5D$}00D(DrX}o<Q5mFAE_SGVjI1Y4M^N=xTfZDxjK8wW~KR4Vs=MXguN|S}`(S zso6x^%P9J*G~z*D92T|1Hs$0?bm0XAhxOif9q&d26>`?1`+bRpPjtzA_~1X}@YjDs zq{b5QYa)#KWH@%n;8Jjau!o;;+)r2_0gOudrvsY{!-3VkabkAv3;8EJ>wjUpa=A|= zt&$0?m(0_z)K=3QV<90rgZn5bnh}FAwobDC&BJj8fBm`>$N-Vo-Am#>uP=@lk>TTA zv=pHk%4aPf!Ahm7DLJ(4Cg?<;L=y#fhAZB>2N=ytIUW7JZJe<VG%a1=mN<6M(EQ-` zxU;dIs@k53xQfCT2;01OF0pd5+VDQ%E@4W#)n&SU%8+x5bz86%x5#6-Lrz_YF{!=` z-F|rNkMo3OZRvMpFqpA_349Cd0h@2Lg}>qQXJ?ZfxgEgG7TQ1~<Z8C=9|q1dM|ZZ- zTZlw_aK~c?-Pm-O4m;4dJ41vw0q!8g=!}s%YDAs$N-B_0Skr3fGM}f0f?#Lp<?1~w z><YiF55Z6P6uzW-xV!YFBO><C7t1ZDS3KHI5x!fm!QviHmU{_jXtp5bu)XnKtqU|V zuyAHhQRz<@-pNqL8Fybnw>?o0I#@gK5+c1Vq1KBbc0QSH?@T<LC8~%e<$&s^5XJ1I z-prroSWWBxFpP@d1J}tP%J)^z)G)@L^rLB)9i>29-qRF(ZiZS0Lu|Z@R&SKt!cHjN zKI2aL!&?LjdQ=d3H6$-`Cw;!nQ)6VF1B9yby(eaRN;KPW$nlm=XyFyUww9N}agC+~ zEMTcT(&-KwbJR(&aiLe$zHw8&gp~YUm*{OiK^7Os_Ljv{Lum&uC$TmWgjx~|0vtP} zroIrpc%7S|4OB|?v79AeQOYfi&n5_E8^j4i@U1w5NisP8Wf?H;L$9KeV0SoH>{jhF zJ++iC*+xSfdmgXVoAT03f=b_Qr80#BNUl~Jcz^gBx*5G*vfYe(8)i45)N%vYBDB7; zAWxMiN^NW%4W|#-ssc13z4v4a4j0vrwPA1C3U9eAuem>{Us(skzjD-`8n;K%<|s2l zSBv3ph-xfn9U>?|CgW)sBnJ-s9i1{Ii<U-Ix9YS2%Z`T2&P+f#SG*3bFrz;Rg{)e6 zIL4r}Ls&I++Jo=z=E0mkz;yjU^y;x=oUXBAV%~3@l|nPkmUYwb+&}rB{SluseS2&% z#Y|{+Bkh*SV&Y=fsk1Yw9P2Z9VE0_*yQjnWiHg~WWcpz~c5t@J=^4THsiG4t?bFhO z`3RJt?E(ps`59|4!w*<eJ5j`Dj6th?YkGYm?CevyhnK6=3!j98pzaCzmRafqndKLK z2b&3sHyKBjyGZ<tqA8@F;^^#u4I~TB=R7IeO><<=nLgSk><X@Hf#{=FzXp3f_m%qh zWREoaLcTaAr<Ij~X)kWYVcJU&_8A@L<EWr_|H)X=$=i9OI_nz|Tvp++781O$+8Aoi zH|$|tpUd<uuOez7<;B6G<>R?Ha@=&1&Yq1uipmCg!S^Z|)`XrEKMl!eor3PT6K*TK zX+uSC|DrxCwl|TjTGVGKrj_d#3TQcdnJ3mZq_+yGcDk}umgUU1b=r$HGL^)1Jmo8e zD^XeNsN-rHXpe&Tljt&h>E%gSF51h5g^3Y6yF=G#N*wa>alyYq`X$Z>5=J3=)3HA% zpZ2-KM>QkMDSoZ}0{=W@$L!3x7iaZD@iidlka76^z;g}b$Tg~ZlF$RX2j-S|!dgd` zhet6&4TbT~c`~VIUa*gLIz6uD*50kL>=n-T!#s6}$G?hf;;R@$p$BB%@BzTPv3?ZG z1gpPRk`&aZTwr*xX<z-i{nivHze8mA%5b?lg>w0%f)dk)mud6mQDkK0N98HX!{rmK z_`2Ky(bkT;G;R86a9){&-?9LZETOg&$kg3EmdD2a-zGusb@VU-pmxu-aC9yKz>RG- zc1t~Nv}FG%wze4JtO+%Otcw@Ccsqgh{`=6b%TOe&@MO39=QY?%=BiLNx_lRV*_4<m z&D4h2T~(-&zs92;$n#t(oVZz6_;y+EU9~yTB^;XmwvEB#h(<$E%6L$zjGSAuFXQv+ zg7uvV%D@^J%KpZ3&u0e`=(8nnohbq2zwphazqBq%zh$5L2UYs$=2uGZe$XDNrvT%L zgX_?40_}qLc_JPaZjC%r0vjtI|Jo5xDf=IZ8h;IXjx_Cl2r%9pP7WZuhJO)hA6UMv z@Czk#A931Sr|KEq_qON-C3<eP-($<qvknZuOsv$#H2ALL^tp0Th+;h1QNLV3PjHfO z-^iGD%Q4<~Gj19iyhUTWgu_`8Cykdu`1iX6l3n!Qb6*;hy&)b>#K%Q1ku!iqIn`Ye zPromw%LA=C9$aXf#8+zo-HH|a)C1S@Rg$EXlm;MV$Wdj<LP+HP)s1ZO$@REWVPuMl zoU=3HctLxYIa4KbA_%(S*6i(Q{iTF3;~05FAxf$km6}6e?x#2Q*rmJ1=w8wyZ|f_= z!uP_Kq-!diBNO?8zJ4je55);1X`gnk?MA9`5+yR5SB7Zfg|w;EQ}QKo2;{w!BJiiZ zJT*T){b3-ij2w}R;~7o<QIb3r&zqJC&n?tKDo#VL*G90AiYD}J(?Jd--%ycJ?$kMV z_8TaeQ2B0uWovs&0VN`|rc)^q5=Pb3;FB*N(8iCSo*u9=Psmc2l($7{_er+SIR3|- zq?%zb*uyjKg{S6RSy->0GZ#oJabm^IwGeiXRN()UFCIfxl7Tf3IUxnP%6z9Y)5T~P z{HW3F!@<dgok#y89-oN*_KRKoTMZ~geACob%2i9<sj1g-W~P&P$Bp3!3h<aLfo%M~ z8ds`%Yv@O)n7S-bM#x-22p=B3k2P~Fgn3p@E4-e3MQ=etaR}GPiBd%e(?aWIn^d&f zvWI5_98j5MvW;1rzZRqPt^KD=cv@4GH1lNOaLd!$X3fT$vOryL9(`TGL;t0LLe3DK zX^`yHi9)$-4CR^0%L1k-&+@q1`}at^Y*jI?V)BT@^91=v>dia^7h|MqNc%|KbhrK& z-JyJX#|C*&h1&8X7}S>M@sVfiYw}PZ`&L9(_qY??z85Ic>NyGk-Flz33V3wsO31s9 zz!!uo1GSx^b0MItONr_Pr`E6--XLctL>KSGsxbgLpsjj$;mmrcp+Rnpm0a#Hn{p^% z5-Y1V2Tin?qMQjY+%Nst?L+@Qio@`>#8WN)$uYta=j2ZMzsjKuA(ES{X@-mS7oji7 z*!vbpn~JpDoUv7D#_}(seNL;-unT=M-)giyUFqm(7>{Ry=n_Xy7#|U%JFc%LN;lWT z(L9s4<NO;4SPe5;1hmpQj-b=p9cbJ$XNR3ss7DE^iKj?2h*Xv<#L{Xm1Br)Pqa-G? z)p07>lSyeHshUxlZP<(Dg3ClXoBMTXDH7!?WRAvnbG<C$skkCu5oC{(;G1YOAdrhk zx3wOXzySTIsoHJVNW0FtBhaStg)jGq>2rn;0Y?r^hVH^KZI(8hUq;{&3K%1yHlVCX z`wuDs7!TE#Ib+6stN}72uR=r3EP*Z3ZZ2(9dKt{y^8^@Na<Fn1O;84e*R1aO+t2Nr zMP1T(U-+Tw)n&W}@K3yMF<sjVK3CC|Wk`x81CviB0!-fUP!8WV4FCAZU}hPup1CxP zqmUuZH1PU>!8f5ECyQ>7{mFAOdyZFl)$scBwnr|)S~+AIIlFyLX1kibKA9oTP*1;0 z8XuAafczeoK`M*HpQv*we>sZs(0%7aa5ofUtxarzI1}(A0HF=F@ZwF;;&gx+K$;fS zGiB}LwB?4V+C_jlstO#=;s2P%<M=g(?9{BoiAD}*azS+Q+m6{&?7)RVUy~TbnUF2i zW|Mw7(fXUr;<|uve%}FF(d<T1Va=W&Fvr1u6_ouq?;97PQmbH5RDkMISE=luD69V( zddA|eSP`@705brqoz7jHwT)wmT9KL8xfZ`C<*i%;3;*{hkR7I#3V1skpI@d?4M4e~ z=PFW~bG<~&1{fuCFJ<?vc<?*Vs2-aW=b2KHnNhekQr=JA1tDM(+0-m~BYX^k(dM|X zEQpArUZ0V>MnYzRpI|Ub8MNo?!V7W$`Xe&&e%=LA46$f`ZEE0W0D}1$YOi*U^UKhe z9Sw%Dv9XSIB#V(cf0g+6DgMtqAekIugoe<K;NSu$MV~*gfhIvfb5@UpW!+d>TiE>@ zOpp3Rc<idNOFQ^ASxZtsKSiLs_sOcLTWdx9IN}rSwA`B3UYt=OZx2R5f}fZDpgKLk zd?b!s;(Y~i{BKYwNRB7+e~$j|OWxa8FdUH~=^M<C*<Ax$<UW4Asg~}oz-r)Q-!&s- zurK?{^yI4M|9WHy<<~*&rA<W=Z?Xuo;q7GGdUft;Dn}0O8Ud?`%ulQF5a9oNqgBbJ z%|F{w1!am?E&SFC!-=^D8zzkvt`vQ_kVm)?<f!>!*|->t>@wp5_frSJczvsq0n;o> zNXu}o$d`?rd!n?`Vk5t9SKG1$g*VoI4UgNSE5<^<%QE2lx)aqZWXhYL5;m{&yE8P< zZV@LqnC{Y9`?BV8le6J%?0+vDg@+1O+)hkQ7?_f}NjqQ5%x9TuyY(n>+T<DjG$k4m zAQqGsM#Ofc9Pg>z>!*&bnC_N!6JC5R6`GyjzSq}1aD%)r^#2K@tF~ZbI-j$geIe(Y z&aJ5S{Wu<8?D69Ii}dveAKl?`cy_}Q`pb;+tsy0NUMIS=qhjNX%T1L3e>4EWlt-ti z(g!DC&<mp{AFA_vxkC5rG<54y&`bK=Ol+)C?vuu@y7m<({cq&`NTe0F4I~ztX2pNk ztcfJw<=y9KC&H(Mz_=SMLUJ3Z#rSqGS#0=<(o8ts8~6ZCmCL{$`KWnXIZ)vyEKwi( zW!{}X)}nw+)a|#$g58kZRH;pQD$COhe4LA1Zy@b*&--@udtN<WjD2dSEs?PkYNHz( zM}=?Pk0_wk5G$ht?oX+)NyJqCpK}U<AK+AnQkA==^LhwgM7=}^%YZSHzJ_vWNx5GV zVBS~nUUtM1+;5A~*o#PcuK`UR0pPCmYAp8xAu%uHpm&S;@N2E#<=b3G+PY7f^_Rqp zH$=Hx1n158b}I1<nB$MLAwU!u(nOWa;`|FfBl~<Vjl|5j!psTWVx(>^cP=@rY_B+& zcIiFn!H@T?)3s!GZYszKM95_PHUHlUr=wYZ7&I4jQ~i(k`eaq8@_ps}YD&z#St#?k zCF+TuT?9cY)Ot^sku9eLM+b}KD<&Pdxfb{1iO3}M%M!xs*!ub?RT&^*awFVEc~s2I z?6gEmclZ?zWfL)CI3!|a9914F@pFb!_Tr@Q)p#uFslNEZQyxBZ*k!U|$tz(kCh~oh zW}mh9;^XupJ9_EN<9;X<R=fU`NWDu{0S!rZi!ozn8_8mXPXXMv-4amHM_0S4S);jl zlhkvHD3l1~HN5%ck!Ch4B-O@G=o!X~dG_^c-XN4EO3*ZRM?L83wA-iBqOZxdG^G{k zPbEB0@}&jbngx|CJh=?X@r5NNAc8`<4ywvO2p&kwF6~9bc<TA{v&OGkzxREakJnr) zX3T6D1Qd(tgf_6kS8ta^F`Vxh=%rf2BO<@)6DX&BcL#6~h=Y*3We=m6H_82b28?1f zUx+4w#v76Oqms2N{hIlUb64WEUaeQWJ>&W+9b&pWA6T-M1{J{<ml>-qZ+iP6vi7%? zk`&&LleV|b#iq_$@i|(uHp-~*HW-ppR9MvvC1uJ^Ae={FPXeqkUD|*eC*1|Rh$c?E zrnqS%c*D8$&G&W%SsqhuG;+KkPfaB`f1dRnE2>0EQQH#{)L^?xA?cMC%H!TUv4s`= z1oWsn_+La+`{|L+zjg@B={zP`;Hl1k^X537u52uC;Hv3Ak2;a&8p0JJvi(2!ddsLd zo+sWr2_z5*!QEXGEVu=?;O@cQ-90#qJ1p+*?rw{_F0%OIE|=f`o^zjfPrsWv-7~X$ zs{2$|f2%%YS`Q3pUW1A$ITY+tmwQ-iHEPC6^i?Y^x6tt_Eqx51*}pfA4Z9`jOgKkO zW(XBm)?)*1WR+~L7>j7Ze8(cZF-aR?ZZQl4FcHB33^jVqoxtybKYaeioIHo#j?v{y zE&2@_8Jp{vdNcqQk^5<lEi=#zr4Q_Q*aahHeo)@T=>%syI?%;|8S14eTAH)aGN*a5 z*&<Rh(*Fu;C;vP@Ch?)(|JrdA_haCGYFELMZE`Uii<ciU`E}%dQ5%f#dtX*1r5N-# zJjE~4AmZ|x!S0`|+zZj+sRf=t=zV*REAUp^@-?US*`DEcV%7)o3=9}WN!;guWseIF z)v>xF0Ibrxd~<Q??lFgV=~%-R*ulRI!bYd1GP|lepI<(xte`f#;`xKik)r0w1KvFe zt-Cs2y1D(^JAQf}goXBFCEa*B@o)HsU^4)&j;fuibM_-O98ZQWKHw!mXMBmMr{TFU zDQp}=um#D%j2kSns`7IB7xaUTc_P>P#+(JpFo4#s;|9M$b~d`oATQ-yDL@Trxst5P zinMd+)y;OTQp4Tm4+O|<?5}n+MOQf(t}eZq{06*jb98wICwsP!`!yA@=sThuS6K|J zHnlu7X=s*WNthgvE_k^Ib=iC)Wl$qWqtN#irg2yEzQ}q;8skI0u&kAMl~D}HDWIZ{ zrr&sizc)bNR`BE`jcZDc!2E;xc?4OnE6TvxmMYpMH@Sn=<<=XA&6%{!XM`eqO2jyC zu4&;!uR!Rn0_$dTGOJoKH|SM{EVdNXG92Z+qrn00vU?GD{{`*OrF_C0L<3GxxzvW` z5c}C+J=vFk-j;2-z9T+~y*|0tI`9Lr0(HiQBtWlg<Y*hbu{+>*quuU-$kd}T|9i9< zSjM|9<2cUBJeDgm>@KGrVq%Y4RubGUtN51t*l?nF+VtAp56`@B<I%2*=XcVgu$Bd; zbQZZ@OMIT6h+Oz^!A2p0R}wj6rfv-IBqVCm!CU?LU1Bx|a&B5HZ3f31N#gas)+XQ7 z7Vhn4o=AE=&-b$>$$NOCs|_?~nV4&XR)Xc!gUw94<vpW>dLa8UXh6@;K=cRwL_&1& zhK5Bl{VJ=;gtVYHjvNsB?VXL~o9y$7wwp!CWan_h)ARmb5-94<s5eQz@t?B18g}qc z*`BNxsQT6u#>Zs~seV^>7Zi?fxd*dO7>nbNYPmBJ{n~`TJ+edLSbt#hD|!`M5?<LW zi#=A4#St@DT?9(S-*-OJ@2>IouZY)drg_5}W1-oyXhcS29<e!wgf5DTMA$2up3um0 zg>%jaZpWL{?GF8l-j~`bK=95HctvEWcTDe#6J915W161B5w*Vl*$Ap;lI=JfaJEi= zARAYFzD2q4G{sm9mOB*P9BkHEtHpu1MsN}jHneLx=Fkw+zdN+wZ~*{F_IU|9Jk^h- z5S16znmOl!mUFHR&HHg(yMXLS1Lg~?+-QEOrKYimaqDk}8Bdohey`V1j+D-hf6NxW z;tb2K5ilcS2>E(OY%OM0w!4>D9K4&jQntyj*Z7=%{@!piP~<>2%W=5zn<&9p<J@+I zgY@^}^&o>+epi${v2R<*mEQJe$9{QZOu7!bg9nr$oT(}jIVGWVq~dPxNM$)I3OUO# zL|TQJccLfx>*~(~XeL0TRv=o~J^(n5p0A4)7M=Wwu}3R=qFvOEq$JGi3ct`GtyB&T zzxorDnLPEG`1`lRQz2qgYJwA@ymRJ+ujv^i+iO@R0PTpUe&Ks+Wu>2JFiOh;VViHJ z8^>(v_Al(!dlvj0{ib-4l*$ya_J3CvPcojFAyv@b;+YVQI(G2wKAcy_^$%4>XQOL) zH3E;D-ivqJ?vBa%_V&m^&xkKE9r}u2H@(6Cr+Dg3DdO=>^niGzC*e!1lf^U!ti!tJ zrwuayQ&+uh*0jT8H5SW0j!59v#9XYjdfUmxqbu90t$W!ELh&T8*k~})cxHW?eI@j2 zQ2<GQ52y>d@gY9H{iXL^lfjE3{jgXHY3nj1+A0$~nn0-baF7;uZE@({(9Jeeb-G2q zSmMU%JIn!5f~TX;-db>_ah)*enc}c}@g~+LB($$5?x%la&*BJ<QiV0PQ&o~u+GA#! z3^#I*3!Xi(;<JV-oD%zn!6?0sHkzk%#VU&B-)Di-wcwYJ{v{XK^SR(U`bdF8<{XY# z0P#QWy=-S70icHf5XXa8>a30@SNiEqVYM1lS>><T<zitqjNzyo>(jU5V8C??(YFky zs4yNF4Ogo0{_ac>AD$4=zJL6~ccE44_ROenUlf?|D~1#Txy3Qy3Huvrq=R3>OkONm zeM!ap14ZkI7`#k=a?*kWjf$)+a_{WChZy#?t^&KACXYtV=Q1dcdsR2^8_sf0o8}Gq zhE$gKiE%85MHy*z-*6`GQmMkn1!yp48NkZpF!rMg{UvH{$Lq@sJQ)GDwMp&09~37m z{_ZTnts((=1C5822_h>g`1%1f0}iU4tAZI4GfH#WMWl?8BFuWveeX1g2UbIo=UX`t zc^%omgDyt>Dl?8p|M#kT3K7T`j#83EpR4}2J*h?_#N>Z_FCzDUYnQ1kHr_$qLGEW0 zPo0ns$w|pybTmmzGw76JG7Ji(pOqQH!YBf0#A^D()vF^g5oItiKYkQ6Pp9j++bG}= zTzcz)WLm;}iIq`+I(Bd!hd}#$mK>|Nh6oI!xjHSQ*!J<`j;KE6rfj;|$%lj~v9q`& zAvM87U&-6Y4Mf1I>Tc`X!_z+8)o`r!<t#t7xN+bBz+MK9m%}pOi<nM+-BoGSJwhU$ zoB3j5*0}KozN~8MiRdWcX{4G{6q?4RC5pRT3x`)}IUJ{a2A*9S-9FH;u=15$3Jgq| zA2U6Au`altIp)!1hR%ru*fcwO1b-f4*K}xFg9Eg~Ww5M`p)yBHzeJP!ZJiupE5+w0 z)DOZLxf2<WVGDG4_<o1eus#Ys#8Lz2f>1G?;tFO6Hv~beADMMMeO54ki->-v1PnYA zrc5rY5bIkwf3B+wTf2xLqoRvEpHh=>RzheI{g8$0lopluL!IjtN7jCxf)23+e);#@ zM{D+@gY35Pe?Xfg#~KOA2A0I|YaRj(rvx4D1sV+M^P8tAV<oY?m)9YN4VU0eKE-nc zX)@C8s02j%n$6afnlD2S!=rFrLkhi9-pvNpo*y0<Yh1)h!at4JT$;;ri}_Kgfs~ux z3vkX7Tr_g@xn+D=>C;tuTYp^jh`(<h6WOf$I}oH`*2VJ~hThYqwFvym6rZq*Hj4Ko z<$Nq8%4=;S05-1+ve&XbpKkeNFq#h?mB-2;ADj;dBoTmxl}w+nh!hgGLnF408vkSs z=iVf1m@+<om84pMaQpB$)v(W-&YbZuI7Q}@oU#=71jrv>D@@o-&EM)Oz6DGXGFO|V zzq)(HNsXW{TA0xkc6K>;JP~bXAyQLMq$<ie`eZOEjzg50fyv8<%UXI7IAykD2@|Al zd-Jp94A})muX^0`*1-Er4&=HWiBbT$qJ7pFqJYuyTo}WdW#{4{i#f!3Ul&AP(k@y- zd}?NyQ_<>&N9t?hdkI9M<at1#^rzNnI1mNbneDM{6X#0M+x6?$R0m2P4N{(L-K{d% zMUYqZq#uRWS<SEfa(X$;?BmIiDCkN`jy*2s0-m+^m5&+xm|H~jL?*F#`!#ueScD-$ zO%<o2Cv0&fOmvnt*fO8H-k5dTE850n5Jxs*9ZpGgNra6R>ik&I>TE&2aLBfxu};N4 z9o6s0YL(R)joIr<d~n*Ors?pUeB(BtyXCR<`A^YXuhjJ9ev3;}Fpy(s_%XA&5Q0+h z59R-E#B#QyNcm~MK9o=K47+Yx?WN?w-Nl39BjiZtp1$zICH*xl9V#jVG5K!(AZrcB z#|cC77%9Di-D^X=8U7xzEynQDB~ZIKjl6hCmV5Q?_bbSwIiuVunRxLHyhqCzw+Ph4 zG+a03j*DrBF?+PQQ#Brp2JV%POv2+EzS=VKgbeO$8C<oAymo9dKNOM9zS;~nmQCN+ zI~5q!3luCZ$5PZ>49vG|VR<A0LvZ!ipq%XC_8CKzjVWlxRXpy5m^A6OabAY>gSN+A z9==5!=Ql&D<0&=BRUzURh^Jm0QfW<Ff)nX2I8c+$EJuX9Irv<bOil|XqKMSlrQNii zz3@&YCGH6P=6KvCcX9U%I>rD*ttZLFm|+{L;Asx7n?t#idndSLL%Q=SdbHZtKL@hb zvM0>o<h~(h&g8!DZx*BYfi!Z?CdU?@3`u$<q|a#6on!}TobUYB)bf^;0TtA>GDW!r zXPSsp3Fqp+M<;xd?A%e}XEM2Ypwe9qyeXTX+XQ+OhAKzV)Gb1liD(zPr!sbuP2V~( zHXag*hmeJ}45`ZW#NQ`fx_MMGNd@vVd!3bHk(YqPBI9Z2>jyJh!BkuE=ZaG=E3dS$ zE?BgfI}BqjBEpYdp}&2&(3?EZ9|kCDk3N+EHbBuAX$P-Y_zSD1VC6Cl!7isC_L=ak z&sNUUa{{AF4U-~4KuR6h3HqR{8|C@#QBnC-8Lv?l#%XE+HJR$6yQ<PR47kR$rJ9Xh z_V9$#O6KndI$9f~+_!k2H}Eyy#l$zaV6(|NjaA&1VO+?rW*Wtdzzs!_)*H-<^IdDD zVnqmpIbX34^+{pz)06sW->pGGf&ZB&>thy_9C3QCLCi5zz~^ut=Acc7(%0Gd($<Om zaoYV7cA7ahD+3XXjy4lUIdlK#CrSonGH)r+3d7|u$w~K#gWk@Jpb`W{b3ZFcSwtb} ztS6OmvF57aS}iB58JT9$VFSyBZ*&wGnk!<VSY<EkOR(Q7XRQn=;tnst*zJ=QN363I zX*>3Ah|gLIR>1K}*xb+>C##XYyKa&-JsqNdhV{9-`+L7Z)`|7%=_&WNPWpW3Y#MiZ z7Zc-1P}J6@abHQw>d|Cri|MnG<>twQF(BF>_V&`G@*&~B*p>k51`ar$2pt5P?K14` zdO?c16Zku~#2kssD)syl<Vux(K2XX^a5+X%%K%tFz>f2ls~!JswKV7gJETj=@)z!y zp8%BL`{XM2eQ`ICHXfJ5oF!g>pfADR7ZTVMa+TaQxfdweNDx*+rZjK+=?0LW@d#Dt z6pEJ{l==J2DMRIbPW+9SEvrj*V^RcBjVQ@24$tvJ88i6<nDK3d=dCl%ybNmBp(xpM z#7*W`4*I?9l<WrBWFjmZ5Mho+eTgyzlUk7@N~qq-%AkErW=S~d)=`go^aH(KzUfwU zxr$vTcOB+1Z^R*XhP0rP27n5vnbEEaamL#_ScRT-v7?Zi9Qe0*n?$m044Py2zKGj} z(~%076doyg2A7U%x-Q$l?AhF#DBr#5#{X9Fpy=#k*qK=&=6Wl}8Je>oS~(#zf}pjx z|KK|DOtQU$yV|K?lA6t+4eRK~%OQ_Psx%VUA>rBjKo3b}_U%!q3`#7%UgPQ<qAAOe zXlWzX$s`}w@JRDZp%<>jUp+t|wap_bbRE9r>p}1?;a(*4s!KDE{p5P__6M|Het)L6 z@BNnc2rcP)YFv{i5PW+=I)Hzu<ad4XC;2?)6A+p;=rrRJDbUe>I!B$)CrNoaQ?$0h z|9OX1KjmRTLGwgVVe8|9kLkb3wLDIdgqVU8D!PD_WF3mLQc6T>O%^5CW*eWzHOwGQ zJr4(x(5O3URABO)@A!KvlFq;qOUlwoW94zb!jFZUSpLNu*jH|6ICPmRG!*CPrQi5T z6Rf8Gnx4ynX8|wcEDi&F1*%K79qO)4lGv}NEw5Xrnh*6u9`ef*)?TdXLF@IQ4Pem) zZ%dz)9}`U#X%CHmx9@NMyn!)p0SGFa9Cyo$=>9mRU&wv)32Oola1dwenyD{PMa;rT zP)QXaUy&M&2iA}dKuV@?GtJ{uSw470*JQbLXf16$L1jX|*k8&7t}JnEJtVYEe1mLA zT7tT==$>yFqhb5GVo`k3fJh8XXg;GgasrgkR&~g!ui{Me%!ZP_r&*6Nr}`rvHPj_{ zb#cHs!JRz947rx~^aE1%$oao%ON_4<0dH6?D{<tnU*a(8(|_cNox1~{!q3@|0PdId zDh=YppTGYX9^aY27(@fcYUbfqa1lgFvbxzu|9FJU4J%GsVb8I0BA+-0ScuG+5biex ztIP`M_v*d*FTf)WMlK3TqkQ`DLomC4lUZ{mlCXp5C2`SCc7(EkEk1yT=lOe;(M>Xt z>E=`+l8|!6BCIQK)A&9G@UY4$-O1v-t*h}X)!5aJZC-!&pv3F;6-_04OqZH*Eq)eW zrh<%`KKXVApQ1&pdVdUnv$@In%U2ZCj~X(^GB5Vz^@03TPP7*ti;kUEn;%kcmz-Wf zR}CvpSwq;sSTvZ(BY+11)#)p^PI)|?Y`4Griv2cyauc6;knf(U>607_=r`Ts$v|J^ z(2-ti;-?Kd)bovFhRrhW#X_K86Mob~2?Zf@zafxxs1KbJM}55DM!dz+T+%I^uyW)l z!}`HEs1SPuzM7O0{EPnk=juWBlw4R(1Q;IZ-{bVP0fD?r0MGCY7hMB~B&t6IArP{s z#}%_K@u+ziAnbv}rAVUe8-MMo1Ca>pzSAwmKv|qo*wkQ?Q!#mQzS)%aZNkj#cdluE z4a{03Mp5)o{wd1LQJrqlKUvb{z|W1G+-|1rlR4_XBe&#EAB>oKI)}NTjM)>DReV%_ z2^KU#=5tlf^#ThHR=||IgD^6;3zs|zyZN6f5QF|i1Z8=9paP@Q@bleVRnbp;$dn5P zzyB-ueTOW*i{qn<;uJ`RrGydKVolGnjy;U^jx~=BU%B<^XVo(M1<IA+r2CtZJVB;% z-e39f8QMx_96P4!^55ocUXW)h_0*B$*7GG@l*spo3a+-a0)6&Zt%)sP^+%s$yBv9c ziK|%cKFk%lB-&b){mCbLp4-|*7P$EHO34=nij%#}gFoV)QeH~W!ddL|8NBJ(=b!9f zxUA0ct40^QhkwZ=NO+a42K#Z)N1MiIPR$Libp&Y}M8P5oWYh0E=A0`bKVB-$w3#L@ zO0?7O#w-4sf3ICuLiZ`w#S%uq>jKqq{xPfyw@g2J8~JvPCW@?njZnNsPhIM1z*G9Z zbk&!-03}UXR@J`X{D~`Jx7p#U=(D<n&ua&f4?k^cb-n?M!#iZxy_C$*!5-$nQzbX& zcIN&f*V1%buV3NAO#g+yqv%PPyJERj!q$h#NbFC)k>tCo^nW2FV~51}1u`tGPG-1= z)U<62%S-*z2aturBU1BflaNJ+4r?pM&z6*3lkaUSxPWGj2Oxvb4(DIsywT3TM^W>y zr5n|d>IvN7J9e!O38AAd73*Gl3(4qX?R_Q9r&{kBvqygFd<vk1`i|~SYfUlN^eMqA z-UT4*XLn_`91Wrp35&RKhtU=!u=6W8QdeabRgevj$`pxQCtuRNNIJYTG}BUk8^*#Y z-0_U@G2&gf50v=;lTgH!UPZ}Zx98A5o_uol7vk{v;vppGL2m<&SFGfos_XhtQ^1+p zix}Z<XGQcBu*Teh8ytK_8(qaOC}M-6-{Mc8>5P*eYy!)b4kk3AU)il*&r^;WINp8u z3MRj4YFG0urAF?x@!|$z{3I%WUVoITkWcKiPE@?_cUElOV`&MNOS?V;5%-&>Zdjgl z6}=)<p;9IutMZxSta;svsd$k12*~tK8WDH~oK^41qG%1KSDRjPp9EZfMG@SerBh?! z<=Om<|LY<Qg<YRw7tQ1Ll&kU<K@h{HB-|oJ0@mOInAPYdgb3BTc4=Ql)Lb7WQBb@( zbraOe-=Wf=dfl%ch~b;>f?GVRruN|4(HROtIe84eIUl#tMZY*K7F@;<IeY0lN#_xH z&_jPGQEG|WMV!~DMZse|t_sk+5cbZoC2qE_j(DsMwIgZ%q)*hIks&l67Yw*RX#WnL zRi#>KiScqp7DFsgp?u`bTaYt~NuYZ6&_cX9y_wrLmS0)*?Yd)*XX9Xc6X(!&7#qQQ zk}_6!FJ0~0#%9A=q*lD)ef0Dd_`eVW4#K-*l-JoT$S8rYpaKZIi<CttaE_j;He>*H z1&g*qTH<H&OY!FK*pB4cL!-ufzOCQwXIJR^J9itZu;olbgRP<_jXX~cVkbZDGdTCM zQe`^qDXBd6psV1cj;k~~c+NBUxLLyXy)J&EdKZE#=xO~7$`G=BRZTj|9O~G#FBWV| z_@W?V=@@u)5>vRipw~h7SBZ~y)-%-|o!i|3$e>5d)}KN7ud#FvrJ+Q%6b3C*(qR)c zqv5HZecZpEFa$Fx{<QNAuYD2SxN67-&N695TTl(c(v|9ts-!6*Xim0a(q=!!HZZV| zP)7u}e0|PLZJ<>=(kdFA5Ky=%E~Vl+IxoE{gRLpeqqoqtN|~I6=sJrpy0uF2sb0&7 zpC0?Q^$9uyG`-{c^HLO9BJ3zh#+BUF;|-M<ms8I+wEvVD>&XmsN4ndkLr6d}C@0Il zsWF*gV0D@+<diJ2NpDkJ|Gq<H6fv3MEu<Fh2G6I)R|iAty6tXIWh-jh!{4dn0t4_F ze3^L!Smv;gB{HZve%pZB>Ol2lJAZ6OZ1Ky(K7?n%x!fk_QilT6u-`4nRi%Id52>e8 zMU<#iC#xyF{);|`oQNG%^tP<9HSE}Rjx%=4h~H1|n9^5I&g);s5!K+$yhbI}Ld>+T zM8Vq^gW%WO?_$2L$kiiVq2ynsF7Y3;ntH~ZgP_SPs3`7<p`o+oY-^!4=Ss5Pk0ocy z9IK|U<xm&4QrEf}Z{+GD9_i}=?hd{fpjlNxM@d%cLg(`xT(7Th*aEEdEq^GLycclR zQ5M*M|8vFLe?f%)HfR^EG-2bVB(I}2r9Ft3B~FUQ_Mj*w?0+VBfNuNkLP2k`6}vSQ zK<77?sHprCB>^I<d_u||O&qcPRJVK(6Ji<I>PlRCSll5Nx9Z|lXlr`=$&|NN(-RgI zpzzNYoD=muzVjvXLK?J#>XbU?r8mjXFhE-R)H?IgIgFw$b8q;%MSU`DD7G6>eUoSM zogIvW^p+$O{SqaNq)D%k<f)k8lzi1GsvUOp)93s>L)@?8>`O@&BaiJT!e9(>o!$CL z&T&)Ax@ERNOUxtPN=AhV$ABxBZ{lgJo<|x4vq!W960iGc30&AC4sXGMCXWY<x*@l% zJkNH_0F079cFsRru#xS2^Jp8>|14Wr_BCcZ5Y*wB4?B>rnxgbWjQ7-*^-AFT2_&2j z<Bs#LI8EwZu*S?>i>i-D{!Lm!-`rn17%mjpvGc~c1;>r~e5Qz^Zq2OgZ+>3&g%KEp z^UQ|lJLc2|-kz_TAzkN#zj$}d*_17+taXQl4lCt*oD9nMMQX&$ZpSD}+q?Rn2GD#- zb@bijr5axgNE-QJldoJX(0yloP0VoEl{Ls9&a&p3UDc8I=FDe`O^gTZ7q^eA-kPM& z4kYJy4!95f-Q1Ikk@F@hTw|&70eT;@{)dm+XEB#fiJ>E2`Jr?GN!hrsD#p$-<lIs? zMh^v8&=CfT3CDMe8vBLPRh~5IgK#oJRR3DOjFkfL&WVeo_O5CY9C7|j8gByq`)q;D z>u4Y`Vh0Y|4pF~`6e$lN{WK`z_+F>6qF#Dq8jC^aQX^{l%fld3^SVtIzyH+<5GUe# z^Qz@Zl-`*(Aqa;bEe2N&D#|zpv@Qy(wWXVKvRGr`o8Z)~^1w8;7X6xoQ#$dDUPrvE z^NHo-K$m``(PR9dyyLMCU)U=y2wl(0EfxBicK||HkmgsZ=B}N&r*_U5?v-<L1j3GQ ze%XpW!nhr_JES;K$FLWrFg3Z#zvMS3HLYQ)F<6f4$Y^s%e#_?++Cd9zhe{oo3rD9+ znxx#i4B}^Q>mEoNpvk^hPgPm4ZXK)O(Wjsik59vwss_RoEtC(KWa6rUiMDWjGFiEm zmiV2?q#yCbMSg{+5P<8-+}4}}ylo%yc``H*wAi(DOezjQrz(#Tk;15YLJned)&q;7 zcUV`Af8npNP{{|=#SMHC;U6`N>6!rsL)01UY2D#JZp-<S`+o>b^V21SPNC$2<0OAr z7qkn)eu(PXbwl7PWa#}{{#EOzE=19ToAfi=t{PuK0id=^>TnIv_=NEY?KUZ7Z;i*g zygB<YjzMT74QIoSaXGh$7u-NAfRmbQ=#v41iU~VEe^r0^1(!@-r}ghv?Py?fm$V)i z8?WkT6K5K&fZ@yP0f$<OMY_hNHb*wLp!?mcHOE>p)5>l|>~>x8H;e10-_{xj{v??Z zn4($GpX`7ao|QMQv_qbbWt2*aCfUbMm78b{_e)CcYXPIHe4kMbXzRqMWH*N^?-Fmj za6Y}tL9=jLRW%z&QZ9cu13tb>N6J49Stcx2t(1mIZ6%?A1iXd2%%hy6x0ESgT>l$6 zvob^~fvIR2DlL`cM=OD2j{pVJEn++hiQ-Bpsuahr$48$LXI`b!&-&;+FS95PL9ZNg zL;*U|v|7D3EWqUnsYY$P9jVHcynk*)w3Ci|Dx(_G#^?A%akRTl>ddeYpD$Q{afbQ- zwzE^SNKaTP8swjk9&7N+53jtLJ`?Zxdt+)c=0El689!0E>5kbpFwruzn(=fZQs;Cq zvsV$J?9<of7hD&{`x2(@qSi5u#keG}oZme45^jWxmS-a(_G!Mu0$|u$mg?sbotiUM zjj;v9<G?X<(7AFpDXuI(gxL71aqRgz;LT-s4p2y-Z5<FeM09cn>~k7Z@o8uuv%bqZ ztwa#$!aHuz;=)%J`RxoNSEen|*7$Y32{zShHN3B9xs+wmp@HK+4;F{_zi<kQUgYE* zb_%7PxR=kiU!To2H;R2@7L4m`ejuk~N!X$N)W#dpKniLeZeBrHk}`#UF8f<X3wEXs zGCYIFA3+7CI~VVX=+w6m5cPKm5Kl7_r(h&Oj*8j$fuNI3cS7QHGu6^73685NRFZ3S z5?7D;juFao=q>YWFj`F75(mBW`5$0$DJ+V~KNRedhF@0<;1%i?6poyaHbmZpdimMP znz9u`V7fIwes0-bILW%@+6;fC>QwY)y@#9#A82sB=P|`G`J(;;agDedZ18^Jv-MQ3 zrvK2DD~87%ZYIMgc25hF<V&{FHNUK@<cL8Y($QzSiB~(wpIW9NRVqR<n{hVg9RXOn zywLiC^FZAGl=ywtWfO9T{oUi_pYr_A$hGXiXMU;lfwvZUSaRm2L>DK1QL}MT+|Kxz zzQRbL{$w?!T1$+)OzO2r{z911UHrkVv;02&vP^QPgC%fXr$X{}V6k2LXOt_>?R@h1 zX5;scinghRji~6HyzrEEk2mjQs1_;EQxDGnJABFIvf(JYjlK1@Q={(-A$}&2eWASM zMIFx>Vf|v!42pe9$hyl-uYZ~r^PTLzOPOL!3Olz*b&`YA=OV1Az1b2&H_KhKe^GOP zkLqsf70Zh%#&yBt>povs<!^jb5o?S~YtLt(ma{Jx>-<sH20FgCYpq#pT+zms{hTgk z2u`r!zXh0n$E39w@Lgwtu)pg%queUX%D4*f-3ZXMB~8gD-e-d9Hai9c3XikByF&=8 z_CCxODHlBKbXdb*!XZ3BfJU9a{q6}!_6=Xxe4d4UcNC)p$riQ)7dH(geJL?$+h#-c z6o2lh2>qn*WNVEU7h_W)q^!>;Bp13b!F-<^l`ww@XKDZyxlBi}HKs`F56cm!{ON|n zfatH<kv~c4&pGu&kTfo8xCQhB&(2n9MtLQr>i1l0^u`Yx^t|r(82B|DWA#ojDU|Qy zh@4Y&X1h+TILe!V0(~ItICy$9Y|nl}?xPHe_SUdq+tks1@&8nUx@hn2%gAJ@QClK) zIxGgbE&*Zo4jo9B;Cwfts;&Q2NN=@r;TJ<tl2MIe)vt)_o)P$OlgW39iOMoG%BY^o z@K=76dFxV&OP!q>{Hrk;jV*2V)-A%?cnIqoqRa+y<w)o@dCKLy+JU;wpb<zz^>wS; z2cHqm!eE51IV^9)Yy2NF1W`tYe`@OQ?)hEHFJVASV~)Bw9j$r7AkBJIRF3v3=NB^m z%=sod#Y{Wqtg))xE|6YB*Rp}|h6}prGZGqDd#P~`FUep7BQT4Dd4upH*|{xN&xjH? zi15%tpuO%zB1$3B?M+9}>l^Ha<ZdkqKV}@Svqr)ObI<&<_x>OE<Y}M};1=3>B9Bkv zk_AzWb3*idxlsqb5k7^u!#2?J1j-)rrZITNt=;Bbjfw7`z=H*S@>2S~B*?t(BD5`$ zE)U#3(bSf`R_7%*rrUTwlwHqfewn@HjL2P$)9y=Ub;jA@PoI3wY-4Wh7_9|X)>s0F zQCq4?-mtGB-6o`ZW^xZ-qAHJU05%Q|hYpQ6ucIZ|f1W=dmYf|_gd7mLP+G|u;*kI9 zLa`k91Dnp#lBiT5b)keB{6!EW*BYLOpSaJK>gv^#9GCedkmz_MI#EE^1gh)H%sBrN z>1p-|Y~%BT1ADCRR#hk-><zNm6l*Pdf@&-(&==ZlViLBbw98pl4fxubfE_mlwM9dq zfN_Cq0rj@C{&<MbUG#k>34dF_GQPazJ7^#coPYVqIzR5(K*v_uK>Si#DS+{?Q)y^C z|Mk%E&a3zi878Xiu;6+T_$M&#IMw?zO6;OYUHH}=qzJ2K-+?L`7rY|#bxw>Ba-Q3{ z@&oI%)_xp=+g2u<f1gtvtLzG0sIcP>9_>j~c3URnagFg?iYfj`&k|N?qI>-w_fDgi zF0qg98?wMAMF&VZu=e5O@*Swg(f@su@Sh9B7{T%H{uf6>9QmgR27kN@4Fvwja;$~v zLIkNaOR13&I!bA)R<?;#o!uP&#z&#cc!MxCn$T~E<bQ%8N=c<6F^db+z474~bSy$) zz8L?6P{oSL5{3`V&{*muMt)GSRV1`O5B;j2pPf^b)sW)F%|Rdvv-~F&^B5{gQJJ08 z&RyeQs>sHzykk~@|CiuMab4M8jI|=lIDxV&`qe<be?K-xM^MI_3+cvKsE3i+c6r{Q z{Zxk=^<_T%Hq5sk83_?{2a%MHJ$4TKW!|I$!6XYogHDMCq>Mt0E2OT>%ghBBQFZL~ zc70f(MoLVeFp0qi3Y$B#vJvWhba_G-w39L`Mqw#PF22@SCwmb?slCl|QJ~zleCmtV zowxBgEX$LL`JJf!u1>-T5*I~J&J=bKq#fzCad@{i?;kH^vwBs>$XGuDvUhokH#*WT z*2Spsv$mzIVvh(DA<$-N7ZthVI{V;Id)lBZ;vD!f68?e!glS((*SFJN>N$v#7LJ^O zRld4hPUh{S6(45Ujj~Xd$d@O=JCqy7lUhyfswYjt3L(b5k%YUp%CTV(rsJ|a>F~d_ z2QNXrIKGD4oVT78XWy<eR3pjjbzM16VbsrosnFL-0g8vQ;Ac!a3E(l@^}B@~&tKnN zIykQ;lgyXeyM8+;Qj|)g!SpH3%Zn`%>I|T8K21|O&3ANO!Oyb2TjP!zp(JgJv#8Pg zb=Rgh7rQw{x}PT+lgdJ;1ePG40yUM)yrz|fkHkjc|0kXvl-_wi(0un3?yJPbRq&*M z4fh(1M!jIe$W@GgYA&ZJK)nCddH>T`KZ64Qyi2a{v4xa$VN2KzTMSD5{creun#(9^ zs;-p&pBVeqC?*W>4fjpRj3%7A$L8Z1J2%0dOdqMZr2CccTl4?duZ$F(7?<TW_`JR# z>oFIW?h>7*+#>f+Ox8l@DE!#}d+i9xf8GAyFr(+g|Bd_qy)jLE@$mM}>3f%3tZrJ) zC=d)@2sE#S3Sv*IgasCR2b;I9O|2L+!C70LmXadjQ7Qz!!2ht8Wt~REhtCCiMcPCd zxLkW}+PbZK?rLWYVfMXa?>_ip<GfS<K742&I)A6oec0mr5C8Y!1C;rlf%oBq8{j_< z;D>I{Z^ZvyZltGe&ssE;KbIH`6%n7_?|yr~`Fkm{(U0A~(Z8ur9L}q?#`t14?Q>Y< z=P~jym5BdFpC@fR3v9loUSLg8O|hT5+?%Z*X1ikTxCnF_jEDn%)Wp?^;Jx?rYZ9~d z>3C`QSpT{HYdz94AwRY0PGS*E7j0+LduG}EPrTc`|B!wk{EDvk7gzQ0e{20t|GnA` z-LA{Pt>Poh2>q}1#<TnV_dRcY)HU3%O3A9ksQ<NKYU>ZyAFV$@LjbRi@voV{*IiMO z|Jt_X`*TQ$7Pe=hcNOb4T6xpe9v#v2`B3G}icZ5^J!fu0dJKeHBk%R3fNq0`2&|}q z!ZiLo{xbeL{<g{A?@y>xp$P%4f_YYlAw$S%!_VzH5h6^2kI^?e$2<a6^V*y44$2Lh z4a(fsi;(?{&5^R^S?-8Qk-AtPKiWj8+oP>+-ILSh+sW_ea#_%`m9ZD^Cp#yjb(_VT zd8*tl8s$F7hT@FPM(gSGG=>YZIPzfCMB#Cp+*`@Eo!P^L45P2nRH_quW^7>{C^6jF zk*lqydh5BfTi}rtB8akd+$W6x?Mr1959&+K)Hk51)~YUlyGbGu>43rX%}deO#p4@> zR4J}5+xSA(qw-&T-d*kW4OR;e>%ZOBqQok+f3|f#id?5_e+T|&0{=;U;FJ@G-ev!c zEl?_`$$CFUZt;?Q4HdJRlDr|JOVkgA8cUIyAzc(iy4&m}OnQXS+}L6a`Wa7XhpS*d z0_1L=$4?LjLCi6d%d_H5bJYLJ+tUQJaRpqigUFHdtCd$^o}nZb6S>^ph7-X^xr>sW z20Rl=$Wc=0B)<QhArhwF7Oj`E?b7AJ(2&m&SR=EviMbdB?OB(D=)~gU;=w#Zlvz=w zJOTxx?z@!lp45)C*S@eKf)R#5EFZ~BksmnZy;^z@`Z2b!gA3{1fY((R8iMga3~;<} zoYTvY^;{ZbQ%hMhB!`rb8kpOze38Lq;FTvaPDj#qT>@#ZPJlON9RY=suCe-k0NEL^ zyzj9(yLORMd8BFohBsCS;3q*qon)R0Qr4nmeA3B`YRx}rF75^=EU|~fZUz@;gWK*1 z2DJOXQd5g(5J0yNz+r)|44up^y9<;IFUI+;_o@=AsTdlFG_gar1wiF+gWV`9{#XSC z2F-T$?eFqorovL5WxQ8cBt3AO-Y_*QzfyG6V7PEq#T*1xsN_G?+Qq>z+Ij7MVn@~t z8JWO2!x-D$h1Bd)lOpo{>$-9IXVcOj6Zr9-iod*XY8V^zm2zY=AdehUt-po$eMLn7 zO<wGFOk(Hfm{5|baL|njmZcBqE={0jnLFdyorUY+p)A7b;0>ChNw@a|ec8rbicqwm zRP;!9C=w4_{20gBT<yat+|~ri6Pu8?+=x^Ckv?0hAw0L@3d!UD_l?c2hpSCwx^I7P z3<_RFL)|o}rhh-Vi6CK}3fRd@@KK}<kL5_aKVfE9ZN5^<b%{YBl87Td{xh||K(J`t z<H~cIVxuG_p{gPlPY)l)8q0yC{;bdQrDHw9e6aFFj*h%W>N#dFNXf<ZV^h@7tU3f< zX2HXrvGnJ>D^Vz;J@u$QTp6BO?$w!HQpWYppUTKNH6bsoh;EcHnNAWr3`Cz~u~9uY z(Lbebg=XoB7+BF+&zGlr!FwuD?N<f&7HARgY+nCy(8HC}VZ{Tjj8<cTvlh~ddA(?! zjPx9jmtY;EZ~kIE434Io0}o4jLY(4;A6u0}Nz#44fgV|&`o2uS&i89&T|sS?a77DJ zTZW6TUy)RrXO(hoVx)A&YK3Up*wNe84b8f)8Gv}A;8=O}0V61)kb&G%LGbg^)~4Bl zrT@NMvW8nz%6Y~nd>jL7P#k@H^*R^9gbL))k?A9}AI$v?DeT@2?X*6`dBQX2>f)}P z1*!WF=RtikI2$PYIh2AbFF)gYxL4w$X=|x$$@~#rq;+Q>+PtcSS(g^&IdXfMdl~Nf z^R2qQ{Vu+=iMDk!Q66k=wc!{#JS@@M*W2Gt5!pQ@A+&ZH)}R?SU_r<aZ4dg{Cu`5n z8>qY+yNwi6w4;>}Y6}>SHMMd>r3W89s-dYR<|aVK@TI-R$0sn)&J&99^F4ir0m4}A z=&rMr^_d<qsu55-j@(h>*a6yMFaX_7Dm_(?T~z4>@t0`|^Mw^2sd-lgDmE3uOsy{k zR@uL7Ya>v`@#i3u`MvXTn3lk3dv+7UW1oXx3t~`hCdfb#!_{6?7hcw}O!*iHliq+_ z-3Bkx-9H7sa|Y7M8~gKKx&8+&UMpYWi{$Mk?}+Eb>ET`nP`Orf`lT`mO-@*9@24yR z1u0p|RHzwPscz&Cd||gEag)oWn6x+5DZkEOIlYfV8^}#~(oL0d&z?<_NUaOg-nsoe z-d~+p9*wx*+5PhUY#Qmy7X()~sX3$>$|4MEa%uj5Rf+tX<Sx^WwQP-~xPVz*qvcqP zCD71%GckR#T<+!xlG$XV!TX%p{`wiSOGU(_n2+7@-`{+`a22eq6TnaMnsWdO@M}3U zB19-QvNZ#vv<+iSty>8OP*acy|BViP*^SFzFSdiKL=u!dYdT4@mV|+{zRm3$*TE~N z>*`78+f^@c?=!QPKkDg`;HIO0--msDHkWY=bTRHvvHzpj8a5)fsNp#rzRKgoyk0y; zeO!Lv&VtvK&<nwT)>BRB7pDzR=7_sDGBN2yZR&elCn*r;qmv92!WXi|$>A}=Tp_<R z+)kDFw#W5G`Bhg0Hws*uMU^gVYXbIR^@!vjspn#M3))joai*i~R3(_j^Y;OboYW$2 zONB*#doYc2_5M8)$Z7D*dtq<aJuvO>8GXjd83ZPbk=68%RD4Kk=ct){T3RaXvYRqo zcANY<d(WWV;r+E8;&<HP+3fbPlO7|jofR2J7u{A*6SAf*faV3=-a88I;}bvQS{s-c z17zoiTm~Qk`dNwg)Rc>^02GuQA=e?y`J(BL$K66s>CeeM#NJ~G&P7XZJPBj|B|-TZ zF^r(4cs_A}a*lY|uZrDer>a^$w0<79ZSuoCnhlkJDbPA~O!YO{Ou=}t!$b^l#4SZu z@h^ove~uA_XnX=rcyjXfiD$VQ(NELp+mp@J2s0&Y=!a)Chfr+)&gN^tbzj}dxZraq zV~)8-zwuBUn)&1@-YKo#l9DrPbS>oeitmC!EeG(%dQ&pV-*^7?4{6>m=|e3J%g%U9 zOIIcIE?-1cl(rp|D4$C;et)LL-J~eoQGmy{x>&T>O=@=3#yrN7^{MM6f2n-`xWw~- z6Z8*XUxV%GvpIp}Iog}71O)|iA`XxV?Ilk#X>xFcuB@;iqM2;4LJ#&(gErq}0G*0T zcf*y?4$W|JoiXKnT#+T8lfp~HraUD<avnlJ0OYDHC@n*df0jUKjYv-4wau`@cpVv8 z#~wQW6)+P)>!v*5%gf(}Eo`tr?m!Q=$cSM6Vtpj*WdtA^e$mNjg30<RH#E;1cWI1~ z*bypF5o+n)yV()oqBMF;X-jbt78Rw^oTmgHh{?=kXiv9`%fdP#E}1ALZN*s@|NA5% zmX(d*uFp|Di#zBa*0E$`JMMtUI@mC8D4X1&eJ&yB<D9_|N#XiVcTXKfyBQ#8$L}G` z&;1xD5xtoBEBVw4ZzIqazj#Wpf;4LWb!>>P?%~#xb-dS6BK9C)9N-3l!Ko)4EFbJ+ zX5s74(u<lVT#9%lF3ZlDL5b4M!?~|R*Ww$Ma95XP9(9Xx!@is7Tjt9~<>UD!Twt$+ z$95m{vqPL|&x~m(Z?u^)0_=0{E*q)YU8o<yb?6Z_TWPxdu+H(v6G}MucESEudiVY9 zA)Eh3;Bf3oDVhbWPVq`R<0!Q|fNim`Q$9r=D6(sL1d0)Q&?x-1xNe0z9sdyte>z8l zH4VO)-9lvX<4&p}ZiHxQBtZ*#vSPfD#JA?*X=rj?1&HA%q54n{4C29h8$KOf>7NW< zjcu2Fv+-2kr+1`xqk`ee4erDg5L&a|k+2I_+j=J~Wh@}!tECy0$%gK-5L5Z`#JW0z z7Kn&tg$8=NcyTq;fdb{0XPNcoa_*_Il?|~UK&OzwQkesaYh2X|{&@haO2a!s1;YCK z38yQc2OMiM+GEd``h3Py|17Sv0hNqBlTmO2(&vcCq_i0EK~6jDI~`!_mZO$ATljWv zTWSYeA|szs9K0BoZ##%0hR(nS@&x*O<mawFf@Oj*zbLMcCj7kNQd&R>NZ!uOM3o@s zHclI?WHp&F_;$aM14^9lnn8OFN*OH{{Q>@)Q_#FG#SzW(#>2{3x-Fn!dFHULmd}8S z4xA00KxCCUv;39%LHkVLiQK_7l#~0$(8E<BFUP`hE=bRE!<s|}D<#jHG%R$y_Oh6K zK)-9W&eM|13?1~t-5y3TLpy5u`cr=qP2cAxnZD&$YZ#B=mrPAj?HAd872oK8NwE~5 z6Stb?q+MVCygXf>Hrl<Lxc6mL0`4p3=|O@UbACYqsmu|pkX23ATD;CX_Q#jm4;`1K z))?0a?ydJC7M&S~Kg>{ffxy1`pARJUlQh=}Mo8ZMs^anw1DjK0o1(qQ<61aYfCyO$ z$p_?Kw*v>i)zv~K;W~UByvBU*W7XoO`-FWcQobiNs=Ng=@EspWww<lC7Rh`v6*5BX zHPAj!pHk;dY1lQL50LWa_EH8ETCe7DuZ5!ax<JLG<=iM3n=%i4Qgq_Gj1mTY4`wu@ z_9ud8t?yBRH$=1qPBhfHpSj{5V&2#Cj(_XZ?s|wF(vanCqsb(w2lGxx5q0THzsOWj z?2z!+Q4bO#beWu|9@B#we>M*CX5HIzRx0C!y)W^Q)+qdRahBWo$>KLXR!w$u(TIH{ z^ILnq73bH;GshnfBfQvmBIeW#dPMRD87{et*NB79a#~J>vLc?#zxbb8@h#|xS@fUP zgI8m7nYBDUFg*`tfdGN*KF=F@>y5O#5Gb}07g|w&?hqd-`pbE>>Pt+ZXWSg}9(u&) zss^IIX~4bNivpOuAm0sTkLIyO^5$ht@nBZ@;Hn3D9ZQP7!%($izaY8<k@vXM8=(T} zF<<cYL@V&6yh2^gUwCr$Ji&&RrbXxcYC>UYOya)yibi=%L7aKA8G5-rz42#O*XZcZ zheOkqOR`xL)Aop*+nCWEIKr3D!El1RZB~1Og{aR{EvywA=48);hTKlj(I$^NTyCw9 zPFwTK^$<gKFDeW~=0jhaE6QbexJQ{*md6U&arM>&;-(5PTnn)Wag^(E&PFGUPO>`F zX}9$x{sd$fe0Kd*8%Tmm9C7h*-TeCFrjmrqPd+}DAbkU+f^p7#p%xRbLLlEfM9!`4 z*nvOYG(zULu6uoAIL!KLkA=I+98}$b1&8&*$DPI3U3*;{4oprzk<Zi@>v#O`By}n3 zE8+1~YAaq;Izq9RvY^)|PApZiQV}DBKw3Lb|7I$cbj#<<RT<i<<o4KpYEn|c?P%FB zY+)Ol$~C4s@-qihd;0IP^MAuiki}w+jU?zbwy~GlJoqfdaShRvLbb|?Ra;k5{$%!k zgs4}p`;xc~eSDrszS_L-Jj}NQO)wqujP3GBmV7kHz+?As(326h1tLAIquYItpkBDb zx+tWtUauO8+|gxlk)TvSiMQI!d|oS{ggNs56ZoC=pxiM7$jG&IVvnTP#+I?pl+{@w zma}XP^RJP%dA$q3a6saNH5P2RE(i%OOwsF*N$A2Sn!K~SK_H<i37r!U-qU)W^i<!> z<>00>R5v^eHh(|4RKT|5t&eGuDJy&pvgaa+uO9znWYC+AYSeSM4Vp1*nCc7u%y9`{ z)yS)=;O+_go`q-xhvj-Ue85F@K=5@JETi|VUAbjj7w7l|9cM-NU}-(ZdNJNEcEpVW z5yO8h=JYgeswxZN=Ba#Z_GTfY+Mc>!@EWke@IRw>9v*h^Or<>83n%{>tqPm+2OKKv zi^l<sve-l?IG0I=4wFVuD_!?3uUrcQDy-_{`q+51mX`f3PR4bXQps&LI)n0GVwE|} zKhGs|stJFyJb<9YhY^&j0&!USIeBz;IJLso{Z$S!T>hS^=xKL=z#iAs`)sF=y(KnM z;P?GeB;`9Sd|jEkjaXuE<l_>~t?4!{@q$MJDx*#(Av9#Qv?e26Ad9a_m=nlIu9hSr zJB2#_ugTDU$R%=)ZxA3J*zCsh0m=ih=jM;iRAN(jE25&aP)aez>cM>A;}Xnww=xzV zDl}O0=?*z9oV8yFLlAJ%xX;1ONLh`F1~%@j%fVgFKL;|fv<wySY}~ImQrxT0+gp<j zIwROCE2q<A?J%=N*3;;b_4dL?oKvtL^147cnA&E|2Ay@sC-n^MXyO&fp2c&=h}i36 zN}HmL6U}Lo91K*|z)C{0?R>K7Pqm(4({Izu<0&#~!Cj8stLqwBLdW}ij9?4W63T#^ zVX%l-d4Yg8cV&yMv1dr~s*NaHNdZRi2)?8j1r6iRmt#Th3~k!ruS6mzhrKO(K&Hui zqN`I!$xd7GxI2aY$W723t(txG4{~~Hgtv9W>KXh2k5&2aZlQney>ZXPi)LJwHCE2P z4e;qoaVM!dWrQ}jgi%KEn-0I->i^qjJUN%`Vdf2UW5kb}pmMYyqG+wC-e1il4Z>=^ z>h{GJ(@D!ykxP68mTw<BpRJ8oF7+lo#JW4;)AM-uGTjIsWFbNRh_H*=q+jr}M=cm~ zWS3e_1p6JSmOGXaT%LqPABikvM1d7cB3U%Pwd4#f&&zt5&X!np#tk<Ng>+o)dIW8{ zWf7qV5vg8pycY*GaIS26=Fbnsx75hZ?TvA5W8Sf&5r<0C24j+iYOEj$CpAL*v-dR* zvfy`(8Zlx5N6yy<&txsUo?N6ih~0zuO=rSrVpj@M%96if+DL~FHZwjYu8w&i+w4o7 zUcxU2Dv1!K2Jb)hnXedqery8U=P6$|@z`@L)|RusOgVgLE!20euDi_4sn6cATEtP0 z;+v;%-z&+gT-`-4K6=zh@{D830WEgT4kb2grK{h5dup$?X3<I3%X<rh2OE9F5C`r< zz6Tzk`+#R>7!X+ULa#5j)=HERppKLY#a|yiqxN{9wbv*PKMHr;{^EHg2QXhVZeGxa zUG+KdsZUNW4j#zjBq1B`B6gwpx)P3QvKyKO5*-jBLY$%_FTI1DjBLhg^hzX?kzp^) znKPI7W1s1$`Frv`ZA=%7CVV2a0537$G_r7~hs0)|@|udN2c5@)*%|B@5|d|=6qSuz zs7oV{3k<Zy!OAT#l-L(vf;A}m`%&@E1g$PVpU9}OR`p;<nx6-HK_p9M?{+6AVFm4a zo7I)y?U_LjN6Lw>zq3;&Wkms|LgtnMD~P#4vnxgkm3XoCUKE_RIA+mg3|Refm+JF} zHavzS>HcJ;Lu-3dHmp@2w9x@TQc5BeOI^3J!IR70IU4h7xnXB+YD6>c_*W@FRJg-J zoq=wAIoEI<pLcKE$5fBp#(EWr{7Ox=-ENEF&90u~%z(71JYxSf<o<wLKN&lxY&yv0 ztvF;f#NwCPdYI}d_l#f%ZKm>T$iE+}=aYUNP8)|pzq9g4_~H8dt9Vv!;F#ynsd!+d z!)PCVxZVkdA~jyERO_^{I?6uO^p%BXz$^8F%vhTf>FCJbOZ>QYPqjr-SIJdKdC|cL zbE*!IRZIGhJ&|awSd92~o_XP@iYA&S)QTpwt0MBvJuLd^)Ni8sS!(;R2@Al4|3tSc z8A=fAn^M&B%klo@>RyYWVROz_dDu939uj?!=2pumvf_?NvEB#Y=c1SQa)DBa!&Sr6 z8j0b)MMpyQSleqYIi0fRA`;w@fO=KT0(mB4CfoXHu>geP$%%vL!plSlFtBwfk8+7- zEoPAod2&2QlQSC{>l{9zL+oQ@tV@@a^b6jtH_>=Ls(({u6EuH(C2?RVzLqFD?zzEv zZ2JeYZUc+m5<~12NqG8y*n7*MxVmp|FbTmSxVyW%HNi=6cXzko4Fq=@cM0z99^4_g zySuwh=l?wS&eU5qRr5|w)qJ`Aq3d+_wqAbr`K`5~XWm|id$|W|sg9m_Rgqp&g$Q_Q z|G7y#Y1XHSq!t2hx#>4URic$H?xT-g&aeuF<kgnSYG-h#iER69HOb*O=67?6sf9Gz z{*GUB!p^Dpj~o9cD({Z1hnqDIi+O49eVvJ5#UF}cx~WYY3#0U**w%AlN*3)D1f{Ya zoF39{@LO)ImH8sK>&0y_oNUPCilF!kvYU2W(;3bK%dd&vP}f6jCDue8)yIMa4caQF zpg<fiQk-4QX0-KoM!`<NzZo+|n<gG+L5dhqLyuBu4O`Eu-|%D)RiEPjHmm>GEqNOt z+*`jj^10ny`+9|JE7df??LFs|Q>9L;s!fnJ^Uy3I2gcnfbYj+O9{ubDyzyka+VPrZ zqPnub?O;n`<19UyZ0mPlefW@((P!q72yEeknqc3Iz9Rc9lp6T@7K*THI`ZpwPJ0s1 zZ?%6@nx&%)Kh02h7c0$_bfjG}<Wal8vM%>l@J*z)-?FG)tuWAoPP5)zXk?GU{Bl=5 zb&Pk!*onzd3V-N|ha6^*7>vuT*~Mb1rt`e=j)8U<cPqE+hg~&2z;`ywaKb6JI5S>b z?T#|gV}4?jsoOg<dCKNfU*bVQM*pt7L{>ALr_7c`J8P4PhJ9tc%d^!TIqb+dBMj;i z2E|Ep6Nt-Oa)4{E6%U?ek!_6PcG%@ftvB#-pWsLkCj?uL>>BuC2`y{dpHXp`5;=>k zD@g;z^kwcB2KE{ZbC!OvrZEN?=xDpY2e40m(Jx<93|x-Osj`2fpJY^80P>(7OC;Qp z)`tsL`~AdjI31y%th5>z)5lTxYS8OWI$my&ZfWzBjZ-VLGU<x?dLithy4=&7u)A_! zo$WmKN{>=fu5uenU%-3?$CBujGTG6vJsN6FBy_`3XZh|ehmxg>sFETep|<H&8Gt&w z*_KtwuOgjz@a@lDinb;XD5G(Uc`PyHJN-RGh5m~_;AuPJfr34QI#eI#9sea9#i)bL za4=7=86}fu9lUYkLKmInD|f?U5G?NVL#2Ka>vCJz<i&n<fby}aybGzBsK09L>yI>P z!|g}pGB``@`4S@yBisP@3U*&6k;JWU6@9pjjDNODD+t^RLvdv^Ina#SFo-(xh4yXP zG>kF&Dw%|VC8d6<siaGr2ycaItXJEMH<tBrxoe>TiH*NYL#=Fdg<Cn^gzB_DnDTHO zfSvy^c=t0lE-vBF)`vvW!WM~0RU?i@mbP<Ze~R)6Bp?gw;;UNY4AI)BWP1$YtF`_P z8wVp}L0VJf<)$}n7LiTUZian%{Rfc#dg(c*cVp@!jT3scv%@ZgJqpXN)74a9G-=Hm z%t6Iugt^(nAg88HkYVrQ*ge!kRQN}_yJl)9xOH3SJ{)%YYctu3F$QDSg9-y?G=>A@ z@?zuyXATXoXT~2V8Zu6arX4>~#csdL+SZ@j1_XDbkGNwKn$yLVoV9XdhAHZlpT2&e zIrD_{ErP#{xnV91B=i;r8T%<-xvQ_@gla;=Ok91aE`qI%YRaKfsf??Pz<F;VGa(!e z3}&6$1-TPvnZJA3hIiY1S5RMl_WY3=;!+K>Y3OaDPj8omZ6Q2W@S;mCa4pF=m-?W5 z(<2utCdggAR2{$YJiEL&KT%iPf|7MbFqHcIc>jbB=f#L@(clMbSx;mJyXAQ#KAI`* zeC=qjKM+L#ckW3M?}iJXNWZHYs{BCdAA8Y*|Coc*!qEA3UmXFu?;&pobFl+DCEF>a z+Nok2m!z-DdNXSRl{jR=oaeH-0`Jm+jd6Xmd=lx@rwyXa4l}?+S7uuiPv8(xgTE;O zmo8b2=A9S(W%{i(dX|dOiF?q0S*Wp^uQ7>1bG^p+&u32c;Gx&vo)+Y+6<iqM6j7k; zw(F4zTGoDVz2K5<$@U*Ut?Z;L@0@wrHT5mB&9?mf?u<;-`W_6cV=4xvr7gxfikCUv zJ&;Dv#ROHA3lOWpHvKngDYFZ70*an|N1RAC2MS|ra<e|gYO9Q);`CV=K7X7}WA`o{ z=dNfz5T1X*kwFPJO1$*Zv4J;lLvfpdYnN_!QdZnh_zojZIf&)Fic3O?wy`1KRho2c zBme?piTORe;(*XO4$B~fuHq@feXy-@yDl3KLbE;cJ3L~`QFv%++K%}vI6$MqKb`jN z0vXS@V;A|*2|nk(i<YGQDG*&6t}G|y_;#we>gZQ#Bv6W`HQ-_rQ;g&Z88eECcF69! zjY~PTOQSd`>#4zhC=s|kn-w{Rmo#tBqUYY)%P(t_P8}lrS+%(j9aEcZ_&eyZr2a5? zLQJr!nooN{WAgfBw7Gj67?^QtqI67qcf*|^{S<Ze%o%(1W4-_SMq{K-yuNxun5Qeu zai!-;b+%pal!B8{cJmc%RpgBN`fae)TMf<~Ao-?etxqPyXb1pCy?$(?f*U`_7BjSY zt1)bPtPV0mNNH7Y^%uJZ^+*p|KE`=Wn3%t3q&v#Ss!@4)mn_#R4rLNHPCT}SV$WkL zXon5va(4$1$3fm${OU0~y?3B(Yck}@L)MtV7>^_zUh>{%exOkH7B6-&1AeaN#p-?J zr;$y9;fxax+X;R#{MM$|??07(<^D6_W6Mzw&Wa1;aYdj$*~^f>W&2k!A$8d+W?NR{ zv1&W!uEf!@A|entv9YOFE@>{Ut(R&7V`F0rrE4X1Gbk3%*#{`S#_}l7CokJ6fm2>^ zyqMX^1w)bvS>B9-c|_Z$A>I=chYFP}k?TiY`#QHQKSH}69T@E&&&Aee%rtWQZ#-M! zHSzG(u@qHz|Cp-KB-+^waNC(k@u`S+%x7jwS*sr?fB(K)IhZclu-cDbPl8~{i3YK( ze^OKd{DD(*aQyK4g4iGKF)6VQbsA11DtJXc;wh-b?#;LDq(IozCh7Q?;%upTz@FaU zuZOxD_13rrrKsSybfgeBQ_$o~M{~!gvEV`7qcvd|r$f#ab7pWswU}SviR}&l;g}cE z@C@XHVXNnZIaj73`&%Yg6RIEfDnXe>CFkp&Z1-tBy_I^JcQVZr3HGw)VoG^ct+9a_ zqp`>L*@TkX!mX=>ZQk|9OKUIG^MhK&dd@oy;!Y6l)!M{?iq*L@S{xb`x-Il~YK74J z@O_rT`$F@VR)`X!$U=!Mu@mmP==T04gm*itrH<J|%6HseEH6ZLTeRNFN7fpmb7pQ7 z2Qz~3SuN%=1E#$+QF}%SRRxL@jXp$O%FC31OcR7oQDeoUb{r-n0!>#f|07AOvRFEB zISPmOJyUPX^)#V!%9<5z<f`sMSaq3Ri6?hzEbvVfaX2~M-zTHwf_Vc%%iOjY-^_I5 zBwYnZyE-hTk7qJJYMpBA>8QqhysQJ0uZt+$>igF9d=mH(s$_I#we_Q8Am3Mtl7X-U zx}njs!-5o6$K1-TCS`vU-193J0mL=S)_^`W(q=714U>YlBdM?nZ)uMiGxheyqWcMh znRAnF?{)O8;<n$lZ9pf@KP;o-u7<M9bLL;xL*|x_lQsD^jyEIHt_AQ{flYYvvhqPN z^xZKOEjA{#L9`<8g)FJtjciZ9(Du0aFI}tq-=DsZ;~p^A_233srZ_M%i|BUL+$hjO zh6+7+Hg9d5M1|{dGv3XuEWbcd($(X%-hY8VCy$|~1mY0(W7nPND4em0>YlO5VM+xx z!ajE#b(QT2BsXt<wz3nqry&l%D6_uQRWJ@r)&~?^v)x>vdXR4>#mng`=!|GQZydkS zdCzm{H&~F632KZK37IBCo5m4$77hlxSp;@8D;L~&Uaoyi-c?2XkSWS{YLM{&RMoQC zd%xMsy4R?7gmiFd0Nr})wkqG<KX!-J)RRcC;Hji}a|gT2Lsi$;)GpIEWr(-YM?Ak# zExg}O-^I&_x|FyvVHuv=n3=p*PCl+@)AJJcE(%+aZb^iJcNQ9oS^?mD=PK;$HitxU zeQ`{atyjf1Q0+aeClbbalIpSJT*4KzV3so;C-n+pyu9I>AEY+R>S#ZT0Cw3@ASdlL zHv1iOr})wquJdRA&~@fI1qsdBETQvBGj6ODjoogGA;E#zBiE4H*R)#sXrgir32Yzs z<m*O=i)N$H>C2&$)QZslcZ(@?FWwf^%b2Y4OEk2HrKsh7U<GTYiXxoV5k#0j2-(dN zu#Pa9e_Iu4%~HGDa8A&ces54M6O4k$@mMhX*&DTY;JYlaq(efC=Xf|Gh{~Ig^4+}y z-R|7RC}9N&(KIGh(Clgi%k6vYi9N^3c+}<TA(sJ}h^p@P2?jJUK+wUV#D?cM32Xl7 ztyxi*N`d_H(dQqa$*QNk@;m|b#oUlIo6MU%uxiA}6@?6&1xJCMqrarfyolhBs0{tD zZ<d9sWe)L|C{_u$<)NB<9L2L7D81FF5r+#As1d3zSiZaU@bob7bi|dA2%tcn!~t*5 zaUEuUEEaKO@2r$<Zcl^e{WH6X_D;`<?P_vB+kvBFRfdi}lCy|pzUN|x6<3(lcYG*w zsb<_=s@ID{OW4fBvi^w|*{!%8)@SrzI^GqsK9HAqI#ni^QqiV1T>*dGw1>{!LCplG zh`j8SJ^@XyzAzUz0ms-V#^Z|8SJ7QPGM_^yO0gRmQSCBie7j11yB@arW`_S}VV#rg z2%{j8+7!5kl+2(K=8a+s;Do;x?i63>!!!^4hE8iRoh6<KB>03i{@bnkvm%n~pmw3i z%gm>T@z)Q09W-C*>CH_MO=$Fpr$U)7Fn`*hq;RhrpKncTKQL@H@`F~H-taTG3Rz5# z4EfPkntv9D>f9a~$OxSLB81lv*nx@X)BI3V2`NpHyh9r(&5L8ZU1$(=uKBXJ@ovxG z6~T{Ine`1j&OrVLqx8VNRyg(CZ?!eSk3|ZD4d+J-9k+RK2G2+c?rpE?fr8a##WY7M z=e|+!?`;z)yrxo?C(RqWf>|OtknTW}D;G?&$EYo9Dwp0}xLTr1zKle_V}Y$h4t_jG zOuF0!vqe;p<*mXA&by<;RvZ~QfYOCTKGD8O3izc0fEm1AD@G5HGZGU8gqNx=eBaJq z;VmC|d)!Pxe*RRTfmHR=LJb20112|3M>(je3|s=Zbt^)07VKpzB|0kL#Pau|DlBD+ znD%v~*rE$s5F;Bti93Z~uoqet%4<3E(zD=Q%o3UYUUq`>?p_MKMAK&RTEnMbtHtp> z?*#p<W+HP_gmJm7<~Ggzig4$7Z0<?iAhx%$j`$)T;#-gQ-n*^_F1<0NbP>zlHRMUD zomAFUCuY|*VZ-Q$S>AnDX}j&m++TR?eE})$#D~dz`t)@5T*-AO4Ft?@Sc?oSsA}P8 z9y1bCP@-#@wf%G#%=o}mjgIOXTE+bE8$KEEbiK6E5VvWp3>MbB0u%jZm+#&|QW~At z#HiQLnW3F@S~@6YVfNbZ#t?}%59lM^7)`p$R4W+Zw2~_2y_|!U@1lXvT}=FNbQ2gP zjWw0GR`lH&DJ6NGo4H(Azt<Nb*I04LS!q^u_|UT0+{j1?p89_z!!wc5nseQ~8Ztx$ zK$6f~<LG*X>S%}Q5NA^RoliBQ;3|cf8%bb60%$}s@l(1Xi;?<6(@A1@MQCpW7bwuB z)}s0$y$FT_hYt;A#JAb9!zXRiLl}NHVtTHdXvqN1bP@U=1zUcvo00ae!83C{pnsCZ z`l@B1hZO{hJm@4uihTh3@JF0@ePPT3pC&*hZS;IhdKqNCW!Q##K?0CvCk-XAd2YS1 z0GAR?TwLS`J9j0is7A~1%9x?dK31MMt*%!U)qAUC4(*d4Sj(ktV+2~Kwx^k{-?{*` z;p`(RTJEipE_u||(^p-P&Fpma9aI@sh&OyX>S>WESah~6Q2K+?4MHV&uQbxR4m(A6 zhUGo6;uZ{7s;>A3PW&QW1s*@%;!p#Ud~CmddEZJ#pzcJU5?B-2fx%|>e(sMW^0*Q) zp&l-fNvj$<S93dU?|}h0py^SWcIyxN0|en)PJZN-DE*Qh7H%oP52Qz_;fC8u)Lfut z?6!Ac^LsJt5hD*Ojf0uSYV*@0dZ(N7cKduTdoi&0?bu->mN04A{gZ<EIV)$#-QuMS zM1|HVmwXupTpoc3#DFfAfo~G_R<RTD)w&;#kY_c;0RjFxR@4Nllzq=i?dw6M4o*{h zGnH}JOV;-p%syg|F-2?i@J+geZVg)BT66HWVjS$_sY|>DZ(-Kk<%AVdM+O2_F6HHB z0-uX^6hv^8;l!Gk$QpOlT#eIx7P33doDfzSp(X?UW3&I#6u<fP_w071U`;8j%IvAr zIm*Nr<Lnx02pqA5!IHY0X|bTrxu1zat<>Y+{l)V|6@@=3(_)}1!xhC&qg2wFVQC?n zTUvc>ZH7wVg*eOG`<3?<x?R^lKAxO9;X5_P_ae5M7_~m4>K*{4uN={eGL%xvm!&%6 z-r6jMVmF1_^&t^)7mSF#xu`P)Q*{~fczFL|cm<CMdiGdhzI8)!r-U#4Kn!+E$oOv= zI`gB<8hpoFMT8K}&c|N-VXV{9*~-MB?MaFWFoC2H#Y=qDwpDOL$*(#OYm3l5uFK~Q zQBUxKv+phdC!(x|^vcB>a!Mg!)?>#t?~k-V`=1_sOKVrmSv@};OwrGXU4z2PC)|!A zoY2CrX`g=?Ms{`Ry=0??Pb7+OBUONU9*n=qkooj*!k5kRc=bL*G@yBHtge}lA|(uH zywwQe;|6|OdKcXY*SW4{v*+J?bo+X@qAY!R6_7M<%+HlV@vf-X6gFoxR3a(5r;>}@ z^bXG6>hHj3n5|OY6)98@$ycsEcO_Mvw*4)S9@$hR;x<47L$~6(u^<DX+>NG7XB|lp z_Zgwa>&&%vZ0%~ftlpe@yjKT&a!_cQ*LUO7NO4fSHN;H|eteBp%hi+VCjVUfzryqA zz1W6X$Dx)@%Ln0p@=|JQ6B>&p#veOf_a`Ame$Lpxz1gj8zuvd;uhF6aw8gg7v`xL( z={0*`6z(_zfjc38bOMKSnO+vIj7C8mf_ni!RP^+aawn-*vWdn6&&k%+u68zS+cQE# z+(^-EXnQ&@s`({A1R^z>k#~1d<g1E)SJ$QXZ?3WzX*9lZrO<h2gcld~W_^f?p-7_J za|Q;#@UKR%-U`jm)X=OG-hbZdof{S}dnOCK!pIhd$Aq6vbD{}*;MIpBkpx6f=GNCI zWZ1#Q*dJqdgodMGHWvu*8Vt`asINqTBvf5Er74xp^=mZ@I83{e@jyT7;owX@DFa_= zvx|NyQiya_xKGuYP_uEs4-Nmyv}(ZYLf;M^To2ngK|$EhH**kIqKT-?r9uec7XLdP zvhZNlRFJ9@;u(hVFJ>9vc+o^=ijtW0%s?x>K?mAF2)sQ$qv0??qs?rs5Qd6#4xUdW zd0gLtFn_xSAwFX#oWoUaEkRcroikAxo+-noo5XDZ771)+Gu>PwkodFS1vtg2wuEiq zhnIppvS8g=<+nusc4oD{iF=SViEic-p-e->njgDBdP2ntKMoYDr#UCt>H4o`WjAL> z1<IGz!r#fsix%InvnN$@OPb4<Q(Xd(2dFRqE(1JVgj@W>e=d-P#rgkT9SjK>AqC){ z-=k4Ls6>Aog8y%b#6N!=hQzoxw>S8oZme4h|Ex<G2IunsGOS3-!wVRB3<e(0e}w(; z0pWA@TlxGJbZ~<_7@__X_7aR*zv=}e*$2_Ut%&9Re#!s;#g~9>r+>oG|C#oGi2Oey z^}nxG|Gz6xHR4a^55KG43&*Ybp|{}Wv&{4Lv!WUL!Nx+p`vI)n?td=_*}(ZPUo-z> zG9tjaFVSZIF(KRF%#|ISzb0kk|9R7MwQaV&2mF1{)rqq+aN3OU^~XK<2*mAcu#o~A zuqBr7pM^e%PPV2cV<Q|u@nU1cixY|<jA9D0%r=X(&hD93$Unoaee}qAyTKO(GR{}G zHsfXKE&KSmvi*JWZB2c!@MRbBdC)H3Hf$!8n_#-$DDL2Q2M?d&xIeKfh!~A2iS{FS z;?0@9b=kqCV-%wB?rJ9C{RM0l6@&SF&fYA3)_qMSwvopJ*qsw?zim1YvL_@_RlKY> zf(cUZxc}b#Tv-b__1VII>0+_LhLG7gsgMDj7u1WdNh}l1S%e5C$<I#Gzcljb29vLd z>i^y4z19N|Oya-!B*AJ4YAwNWDa~xIrmSo!qGEaBVGF2um^11^B}M8^Mj?<WY<KEt zk?OJ$l;k1pqM|6D>FY$8{C>y_d7#OM)m;<uyZS)eqZ+0~6b&tv-O_6pw%x|vzKyS~ z0~8-5$x%Z^Nn<3*W7j`dMqXH$n-eoJfo5iuZP(hqeg7VIcOU+1I?+(;GW)?}HZbYG zn=^st#UH5sjF%g17M7QdtgK4=#>dYB|5(UXmp{k@+mE`X{(I!40V^_K{4BOuas)n4 zY_U=ytJyeydU|>?ht-@<prJ^0{(`bK9ROXgvgP96)u4v%>|QRx5Sh@W*3jm{#Q*w5 zyxHjI=l98m_#H6}u`kh3>Hlt?XM1#ooU(Ch;a#zJYEF#hFr>cuQpT6cs0LGZ1{HSY zBzwNbfR$wxWiIw<(o8GQ*=hlfvx0fPGd(LEihri}HfiJRme2@PI2%xCD4;22XL^#T zE?!Ut4q{~K{lp&UsP9@)^sMzx;3}Pi&h1bUD|f5dRT;QrPo>j4Z}KU3PWXpTj|rDc zutd8Z_<fJzZwl754OtAp)X6&4X*Z^<mpZ&WQ3(_*46zw9LxobiXg4-cYrV|U$NF0i zbK}NoZNGvmYMKt(GI|wtO@cnI{DAM5+SjE~GTFz&Lm9XwM6{r!>|)-#7Y8~z(J_pf zbvkms+UU^}xU*R<3%z9qI%cNQica>*BpsxG8Eh*IKF6zW?pJX*v7j*)pP5Ye@So@| zadB*197E$gkZ%VLuK*R>oGCP6wMnn#QjrfL?&4`(Jlscz*cmBW{DR`-J^NUx;(TQb z-MEC%3OXvhitG+0CJ!f2!_stKcoRVu)mb9kk|kpdfd|Yy=*wlyF@<n%mEN?Ddq-Kz z+f<vbi@?7!(E>{YY?;zzglZ>}6ntiJl14au?a%t-u7;(fgoYp!!92w#bZ+Am6rtYx z!X(0t?UYrvG`IeSyg&<e<5~FaR*hv@Gw?ROR(srfJ@$6kNXeWgxBMwU^{cv^GRx#1 zLQ>6<`Jb8G;(L<)ny}`jrU~R|g?xe)qAaug1D_8(;HsBCTSHW5AHhI-m+fCZNMrs^ z#*m>8rX|Td&+H!wy7&7k@?eF01f!P?GRt(AGSv>8b}6<>+h0(RNx-@SmXav}$<1jD zmakT486>A$W}}%^>6b==J=;x!LR@k3ROBc`4k<e$d_3S18nqH-14Db%RCbBcWNXV8 zxa@V$)b8ZK^s?TcXTVH4S6ugp;q9Ye<)|_}?v53329%!zB5MV+#WDoizjh#Fj)z^O zct-tR2`Vg`3bksjPwanAK*vy4R97DH@87ds8Gn%9kP~VO3v3{@EmT@12cjPZz?A*U ztBU;;Gyl3jehfh3J5u<gfaLz*_m8IQ;VC}+5No}aM0ogU_`6ZTp!H8ym0z%+hfMee zZ=kQ<h0nXa!BOk+0+EAM>u$N%Z7#;{^liZs@GOtqkxW=d+L$~>u$ikU<ylj2mcNXF zlBqI!G(!6<k195<jFOQzwkiIHW9bo1ae3~`oXk~R_qPyLw6t_tSq%sbq(1$XJJuJI z7^OvVXD^P_VWPpd7szoJzGPF+=<TG6=wv(zYhiYUm}*h+g6McKSZIl|ymRioiSS+& zn4hDjVr+(?=s^|ZSBAZ1H1$oAvEblM<cJ;ASy*x^#27h5sLfXuaA>51&0)dUD)$*J z6;oWbgzBx()xfGfDJ5#{LAzC4Tmk=*D<@Q0!r~k9<9<As;w1G+<IFVa6$4XwL0wtY zlWCtBTPpP93?{h~+qX~w#ho%raME(o4$yXQ*1j@(mqs`TQS2-GDig6FN9fKVwV}~g zsLFF3eqA7%r%rWxUEt8Tpgm1{jgi>VM}{0*cexU+u^z@?V)n@?by;^!Rt-yzO9h1@ zjCdcaRpQ#B__h*gbo6<7UB)X*cX3@BS210cnVH!?3+f^o5&}o5ykZj&seIQ863BS@ zn3sL<S&QU_;oP`dfo^E-jjOrU1!cLFVmX!H(D#bIg{c`@6}G<#c2xXp%XI1gGF#&k zrJIW3m)EZT-ip&_lhy66+<A7G-miq$0%^`V4^8*t{A6}0WKeB)2KBngG8UtZ4H_Vm zExvZ_Uxncn9XJB@_fTHG5<e(H4G(5kkP6Ay!cVo3YTP>bw9+LuIAwxKyqs}(ds5{5 zS-J7O;;xUaFOx4g$s#=s0gEXZW{#IMGxCdh52a|L0&{wmSetgkpH$Q7dYLLC_hQ3$ zbk@6q;W=6R4OvQ0f~%**lTiGhe&t$4$)4k=^8$z7iWIlR1eUDsvU;(E9ZqN(yfFu- zD4@9;+}WR#ZjIbJA0txF0?od|YIN_(saY-60ZQzk?Y&;r=Q`ibBHk}C?Ox=N*1XlA zYgx#umZ}h18J?@E6b-n%po8Zkg?88QMq-|BW>|hDMGYD}0awOXcMZMqA~8_n`w2{r zQ*&Req_8K&a7ji>%$uvj54@DB@wnuBE5bW$nQow?#LSkG7J!69w=bHw9CDhl3KeOe zhYjzmr@ir&JP(=w{6_Zb0bt)h;<evEUwBR@An0sOJf3(MNT5ViD~Gh$_*k#HY@n!= zwVy2=m%&^qmRyfJnBEyD-ko$kKRq2B;Qi5(2;M~NuYF1LvgY0$K%JkqUPBSr9*VnW zWhMfR-*_$9T~l%1^5YDdE!4ezwi1LVxso-K0De>EA1;J8eQN*1fz4>yl3wiObum<$ zE36^p=@$8NpkzIFcl+z0ltQodw%bwE?DaY1X`<)UnsGnj_-V8By@&cghHj@Z7#*PF zUU1<~472O9@KIYvjoJ0LY@5;5x7i=o&aFP-&@2)#>({U&lu?H9z9<kf&r|cpAH)TM zSq)#P=%4POg6+`dGdyEQe>#t*)_s6q9U9GKhuMb}z@EBxO-4AFIN;D7U33n!2`{KI zz0t$D96$d9K5v2~3u+s8<$FH_3y^cQfbk3lWp%gmojIrsv1he2zO@;!($SHCWFy$0 z^NxTi&1tr#>=lH_n&&D9;nB93=52bnP%?8eW=&ZshOmv;=#Ko{c1b`*rjHhdwo=XP zVz~Q>O&crO$hIb$g{|%33=1|ZM&0H|pY8OQ{;1{OH=E(=_nXWsSjQ|^UPeDW??lg; z><oGBvCqrV+;wSli0`pelElsvJOj%>TUm*6wql>Y=`n2mGV-|uD81QQ2l&P?dIX6) z>iPFYB>N;Q;ZVefB&T}2=+sYo2#RQ9={b5864XK?bw5l%Vc)WJOD-@^Dg}U2kO8&` zPR+mj`0`h#(ZS_FA|w?WcR{7gO%(LJ=>BG!Y_50-xaiZ`UP0tp7}nSv=}2!y;Tm=# zPuRFQ%UVe>iDVj&vxQA(YAj2_eF&|&p9=&jm~uB?hTLe3_Pm9DdSD5W&=yFmUUrQd zJ(yrB6*r4G=RjxcEwD%o?K27gK0M4WoX&Ff=1L^#nXe|L4i0xVVOPo6NnEEi)u=%A z${>5<4NxIE5-jQTRrIOtYHOqn!SF55Q)zz^jQBTn@&x<E1T$ObQZXfu=m;YzoU2Se zFG>#w@^3Se&nq^=O0V3O?J-Q0*88pDn-3VfaX<J#d=``Fq6EYb3$mCk_yZ<m8nJdj ziMDs%y=2+n!UG?Zys#ekz7tOdC)uyeqB_+U-{9^Bjbsx?LF<x^JE2I-^Xgl+g1W3A zniX-VuHbr?UD#T6t2&J`-sX4=kKBG{+kz8a`K1*%p!U*a45f*n6VCuW^9se<GSXy} z8{}PS1yx>a+|mU6*zMc22D6tt;SW(E4=w<<4kA%t@HZIsP$xkF`ZtTHQ%xpL-NB9S zTl}f%Fq-mbNUhZ=vY}!Aag)m3(X&#JSS1N}*|lk$9`76JU3|1tp6B?0RXG{u9jV-W zZ9pFZIY2tl|DZGSbv~dslbrDd`3#eB)YFF}>lw<afjK-mA}t_8VB+Kc?ul+g44Xz{ zsAt`7b)2{mp^3%1({O=c=@^uL=Lxe^huk($l9kKo<r|`ELrb#(j|KEJCef~Cb!x<m ze%na{e{-dTpxGuW6X1zHAo<EMj7}u<0mvSViO_FS&NYIx+I#;UKlGACbfDLP?2R@M zC-ZZbl7WEC&h7<Aw%ph;DfC{YX=gZml2L<`ItpNJ>%B+Yt^%V!*8QG)03Yg#DF);} zxNpQXSs22O`bo~o#Givt+nRa#WF#UEc4dr5CS@HCz<vsr7Rj4iW;`b6;&)t6X={G$ z1HvFZ*;^&m@qgn$Z=Ao*$+M|TV~WY9&%K5&j=r%<4g49AG*(d(0g-t7#zXeh(P%W* zUwVbGE1}IpvrcPeW(96><OrN@_i!9+&Ep-&W)eugvq~YTBjd0l%ZP7pG8$bULC{Iy z!=kN+xE7)GekhGw6?Qsr6>5vgg6<x-&jY&m)VxT%bX=*NMb72-zUQ;e(jJNq)nfj^ z`*S^mNK%r!_d5YqdO&CS>gIVoo(NzeEF1abTMTWEAHYbq^HBPv(a)xfB0#Vt1399) zw5i35meOA}$F3ga)Hsfs@PJs+o<-F`u=G%&qcMihrbCa=U;EIi9Tjh0XSkm-FRz7> z+7G`IRFZ7QBs$VP5`g6jAQJUGS7dR!?-usqhsS8m&u|HhW>5?$!}F&M<u?oC?@<vg zx!*o0>YhBLn}O9sLutYZc0H|fv*I}hks~h@S?EDp+vFVNVGZd*D_~(bisV{!>K&qV zcTk3{R56rs&Y11BZmYX+2XEi=zP{hsLj*srBPY5>H9hz*b&Pu`u6Ag4VPDTiJZ{i2 z8uub6Ir#}R6qMl$hN+m<@Mu>&PSWNJL!>@A?Ld_z)4eQ&wvlEgs%gQC70Si#HK)Y0 zBgtwjv52(U&GE~1Uo#?S)uC}IL0F3cM#KPAmb^&!)Z%Eh>2!o_ELDsCLlT9dq1Tw+ zYSnIEJ@v2zD&7Xvm<JsNyiTH=j!bE0aosJ`{|QyG!ol9hqWo9+9jQi#Ej<qJPj9=n zK<`SxK`OS9zHvnLqxzGqqtVmRHV`BBo3uMb!tg82aCN7Q?~e8lvy^HUh_wf@7G9_u zP9jOYT3>_{y8!p~#)DTEqP3SE=^L5VON6yCjayyof{KCuC(rSM8AaO9%35PMHC|kX zY-<_S(*it+E0=D!7B#O8Y}1xpM5DZ4C3Co{N$?(;I%)R0^|H=xsCq?1Gy{2maMc!+ z^$Z_rjgu!R{5pIw?!cER#^P#IGcak2aM-irLAhkW>gK98|4HL72K1PSm=Ni0#7ncN zP?uTni77HXwQ!$sZqblxK3GOF4(alas!`lNk&?HCh#daCz9BW9KgKPmIUH}{dGQvy z`kh^cO0u(w;CP&$Oj#5LALC;_!Hw59$(MAw$Q$g-y><6z5Ij!(pQLFF+~GRTqd)vb zI|fp5E_iEls(DMa0UH+-0`}1Gl=K6Z!-P?N=yA`3J_8POUC;G?z20|1-EmR;5_-;J zt7Vhtok4aY9eolo8}2T)-Tk(*y%=$?wJj<Z&*><{M`XPj8H02uDem<-#j+Ag-Vp&K z!Z#r;OYmI;g!c?FF@#G<P}bh@awECN8+^9-4rcuyT>Cp4W1Q6Px3H?=TP^64FKato z=6vAirW=iTj?uA{63V^*YhS{>`mZ<1g3ap8uFM5xRx?t1z5V7BKybUZW5nir+R{_M zKR@LjGu$Y>A_1o-^z}d+T|K)p&&>`DDu+;zq(($WGNX1zO7|NYw!sDScs3z7XI%?R zt52Xp?7qNj4^`v~J$5AU5}ke!oRGzl_j-SIYp<&0uK-@1QHx6UdgoNUgg@p6PgS<Q z^3;WYgoKvZbq0JkOMHL6;WYW}b0Cp8u}?qs_}OaJ#0}cbp5B-s3bW^cX^ZU<Y0D|u zHO6WYLvCg1j;&=SEgxTtAX=dZB1U5QwRXwZr@>LXuFCUvz$M}QU7@4#+s@&Nf|^a{ zrtrf8jWh4?Z4P&hlo!voVPM)OanP;3@l0>IwZP^?;0$|?V)$T(Q<i5W!;--pl~!G< zRG_{2yEh56!Mdd{(YzyVT`8GO##`xx<?Dn(fLyRoekFY7(!9f|bJ}Y@a+2N_T8Uv; zd2FNLd@Y?%hl+G-EX~pMrGRt;X{8lt$jaDE*CIu<K+S>g9+RPuO7e^9X5NfQ^Ou0i z3uXh68;iY9n@sx>Z@d-$*1Nn1n|=vV@VakV+ZefqEpbJ~Meny%vwAmUs*i-Zbv5(* z;ST@YhrF1&rC$6ObS2|aO<4kSfQn5pLXeUQZnCOb^qV$iP^bb4%Eyly=wi9O(l^HJ zp}Zj*)VQekpB+eW#5l!7g-|p;2c8uyT4>(oL*{E3TVa|Uz9Dre-TpFKp8krK<d**2 zvwu+R?Pa&Bb?$K1SgJewUU)I7cVz1NVSp)*q@5YE@9<;DLhVO*N-tkXCt2c>5*@b` zod?}c)YLinXsXZMBST0HBS_mj`Dsl`sYu^4(G|aO*3{xmkxDw9XP1cvWd_0QP$Ip@ zj&mtU(h@PwaI97fXP=#xtb5~_eCv@)0Pi&phfS14_+R|E9bnx%pMk$AWEiYxBeAt& z+BCJO9gii?@N*ru@4|CofY}$7*r;RuFrx7;3tH~HSbu7q;!~}%yAeuh=?=b~Pk^mW z+tn%i?M(`tgS$LjoXuR$qvEgY9vFKjjipU+D{_yB3Zi8nsgb8N%i&^0h6ZSbsKo7e zExq7zKWK~pFo8!O-6LD|K7`G}z)RjJ`@`^(qOZ#0oAOjk%-{SQ9fzZ$Pk3$EMC_pb zo-R-NPZO)qc5lE016crQ#LYoQ<AW8v9=DG-+<ZPs6A2+E@6wx$`h#(8NA-$F%?lOY zupkjpQVfLlw+H0ULdc&lKM`-{g5LI^0N<K&1z?nvevXf_ao7ET2Vy>SpQmHT+^!a( z0gQw<9r$TueSQZ`xaj9gQCGy@)pR@7C99NeM2bD$Zu(7_*wCYn@MdqhsC#N`QJ-=J zB{??3OGS-;rRVu#2d(GE?4zcaC#YIyYH0>+x-j@eBj(!3$3eG|(D{qmnlF8A*_VRo z4X-+d%3kJ)O_k@&Z(sCz0B%E6^#fk}PAEu=4=Z!ssNRM+U7LwGJ0}=pp}l)l1p~`I z=)@B8BbKy>1KcM&XL4Ii<zE_XA(Sq!7ry26bBWm6i~8YAlquai6YvHc%SgT&9LUuZ ze9q5(*HfO5`CMRa=MyaZfgomWz(#0ZC+z!Z2P0;Hpa*cn9%+{)^=G1B^U!`?@JjMK z+96xmYKsi5&kY&ns1v<7%(rEvugGKBPKAr>r0*(A0dRYtLI<#t91J?vn##b4qG=p8 z5PwKg0+9-ha)s$Xnmo#}#`}~LryVq*{Uy8*HY_ZW*G*%sE>`f)@OTVX^=w(uh{OPe zUhkU|{GR4{?{ldkipn|@y5&oHB6N!Hf{De)c^a1oPGR5Vv&l7u!+@4!)Zq#cIuH$o zlyS+GeJe)G4Q72T{fq0~c`MegoZf>QRF9DnDXX(<E1qQl<*`*BzP7Kc#z(vATe#kP zyA9ngp@;E0zh%+uOTGY53mGZ}*2^Zq2Jd7qh_t3gkNSv1<kDOcw%>y@a~ur?z%L6z z&RYk-KeijEORJHRsxA9qww8Q$HImyJT(`L#qbjXtQef<z=fC-(jVps$!U{5M4TNtS zZP;@APDbA8RS`hxgs1q0+pyr2aP$UNWUBo$dX2-X?MxHv45C}~Go5g{nSR<T=}APf zs9X430kWK(ZB=Za^YNXJIOzBa2mi76BOgH5&j{;|n3xgU#ag?K>&>q$)Y|sKggtMu zP@(IpdHi)K;tMR1A2Ey{u`VY$@CL;cm=l~t$ph6h$%Z?>E7LuNm(7fC8C*btJBza3 zZP7wU&%kNqWX_s{dn8|8EL=~IfKpMrX(do&b6M%A-JC#`u9y|a;748vld~nhQcmCV z+ut6YibYTsh$D|sk@N-rOFb=A{^&dHnNPfn**S9_&VuSg^Rp4;VF^YVu}R+*0V9m< z`-h3$_20Iay7=3zt3%<$G_gYIKVZ51RW}C+bk(cQ;a0Y2<(Kt*yN;N(U9w({@yv{# z3*%gK;q;xM*+FN&j+PWos_uR+-ymKH;DN49G^ji9!tfM?>>JF=I(~}kv@TtmI(S%a zj~Z_UZ}vle+U5-BQ^WK-ze^w3JB1Btr4<V0Co*w1G%m;-fX#}8S*k-TWGjj3{`__M zm+ksPSAM;DtQgtw8cyqe(?;p9@C&&Z@bSYEUFF!uSw9A1#u}J4>fqUcIril&NGjIa zWCOTr79T|+;o?`UjErt!Y;I|gAx9-b=IP6>1;Uvo22qlRE0csR&H1b-g>A$8L+BV# zsW@%AvLlaCFgl3_7@@Xnccoz};6<MNVXe&wQv9E;oa75wCwE?MuGzWAuf@BA|8g*7 z|F4cf#sA?)2tJ`j!)oZNa{e-)lA@??d9#CcZ+oMhC+zqK;yDA;Am~w1odN0VS8>Ft z_}eBX9;itYS2uWQl@9okV$7;K*5HI@no(1x{$-cojU%kUlNWu-DfO7n2%>nLKsR^j z7Ip%8S23aSmsb1tveyz{7ruEIa%^77EBEJcv(qf7o=lAVLumwK3ZL-V+CrnHthX@N zwal<$wlaN-N5;{DiGj4a<LW>A=wD1!$qMBn2>~K=N>OX+Jx#Z{cN?-~&jVM4?}F|` zAd<ROnf@^wr%gUPRMV7pShO_IMwKU<w(DtMj@a|Y2_X&oT<79!6j%6k%E008tu}%P zgdl%`b!Otv7Ai>!@*W5u!)^56`?ZqU`qKNXKGM;ljXs&f?medWs%5iE9<@ja_?Q-{ z1a*vbNUk(s6ODTz*|nKO4V@=%`$NvzYd0cfRV@Cr2!FXK#-e*Ejqh%9iQ=gUzqp(F z%6&Ta_2`xGN9lQP=LvU>TvL}Ppw)Zo;&u-cGud?GgOb_=a^8Fd;k+kjLvrIGeFq@H zuQjkRW+Y$;&imJ~C=&CjZTIgUNo5M=Y7?^!ch)0!GB6Wi{M=l0c{aCqcLRfhg7z7K zO)|EgFF0A8<}HfyWN`lPcg)uJa=t|cGTiZ3#d^P<Q-2L1`R!EE;qNmIwB>(Xh?@x+ z)qQhk;l1|mHULrBGqd>C<Iqtvj2c*QDpoDM!X&L$BV*|Kl^uL?c^20X_QCBfvp+M) z`92*N#JeZ>^&$%@Cj0KE)?mr*G6xciPoVkOBP{f)-cLaX?oTe_JxN}jRpcKX_oxP! z2`kFL*cJ;|c=%caK_^V3npcIg7Xb9so^D3^6%Gi<E?4Elr?J)-bOrbVB2wLcOSlbL zGz~K$O4jdR2L$zGdZ|0z@Xx)G;d??Tk(5tYmlD`v77Bu<&q?9J8FPv*NMC@t)pQrQ za7%FVIz-`vw_g@4EyDu$_S^<W5vHZ7jK;STssw4p<)fe?SB-AUI|*=2=q<M!x|a<| zq$$%3OG0VZ8moP;qcYTq+~Bh8c!R;kONdqYh1Z+5pQ?$0_z<ko+VjB!sY07irbC0b z1wHd}M$)@p4O)KXg`h4$T5vJ<sIIm1%IqSqh^EA*t~WQrFW=QGaFr%AiK2e{WN-o3 zVefgKqf%fCQki<ur_1dxqD0bjpv!UZz!}KA=o(AUQs?fhcmKs&ab28Evbdp*y}h7% zt9jO}@(G;>`?M9#`!27@C9K<@@)5Vr)CyYVqRuvWyiZU8q$kCCSF`lcw2&=FQu66q z0V{sEGyK4aFPpDXwg@G-@=Q#k)sg}Dp`THGV<^4{!VOw#{>io!Z!8I=04~UxtrG{i zedNnKUzhjfvm(M>JZi>+7+r5)Kdsc6sF3xfvfE#`@GWV@Sk*z4kH^d=*YaDjCJ^L- zM8=xU6`c&Mcq0LG^1bxWd+U=K@%i>ILVeO-_2^?NhMbJx)429>iwZDZkHPuU6~<f* znL4L#$NfW3*{DxlMOJ~9Ujx@9#>{CM#Pihy_~%?%f(I1k{c@gUsaui{aB*|(R^)u( zpEPL|G}EC`o+~b1Ux0%pB?_9ZL?*kD@-y|dZ^e<=^S}@|O9k!esNfTTJV<+eeW-%T z-LbtP%RLaXs7Vi$TA&)Q#+fT?AgYZ>OU(<-^3a6nuS4&8@>Ya<+c9GJrY?<&nU;sz zm(O7C&K~d)a9n6h^!mRrq{qyliQ2*5{;Q*74YBeAJ>vOb?Qa`<trg0~F|P=oZIS<k zenQB-Rs(coz#T^(etv#^BO@{xbO2vZQo-fDV<x1n|MC`Rv(1_R^HVOG+<$c#*-k(K zzy*GS{(_Gj0GpMtd2#QM39ae*ABMk9hEn}U;fZ0kb}xrvvN}2dLeUqC*d6GRoxwft zUWDd04$CXh_qP&MnSbs3UlX77cM1RY0{d)q^8fzec1p7Of36hiU#|{ss_QBFPw@IT zeq9pz$5;FvYn~7l@SoTUyxg|C2nygE{C}RsFUwh?IpFtiinx8&37cAWL&wtn+BGNA zgs4GI4&T=TCm9A$^8UxLHY5$3zguoinEtb2k9qRw1%0MiQXo>#Jptw4@}Ym={`2nf zzxB?(0J^QbI(#y77t~2Ys&#Ho@7bJ^Uiv0tQEVBUHdaukT3Vycm|epjpBQ!9#t!`O ztIM$p;OVJE*zu%EnB_xfX18H)L3x^&U8h{%gI|_AS%d)Puhp}O{H5WP5-~sDNPr0p zUNEm}E1%eW+IU2umHN-n?pj$r_0xy(wvAd(uil5Z9`==Wv8Ge9xZkA)JalmZAO7e+ zD%04V9s|-X8o-m6xHJ&}c=QLh9a1LtO?WdBhm1dY=EwZ)69q1odXlhiu@jdsC~*?5 z;eO+&FwTg%d-#~c?~dp?CAuU@W?`}{gWK{F{LDCD3D6i`e#WnHepd}J{l;cNg}8hE zUyEGbjPt+ST6KPW*eyU1^kHhJYl@?s631;O5PWxk*qP36>#KZ@F3<o|2wbW4XS+)< z_zd>_s`BUP%{uU693wX4<dTox-pv!)jllR7pL#yv6^+u`(Y)87{nC`ACJT@o63ia^ zO7KMM4m)uLEl4=BTDafnf{+R~(1RxI{!PI+R8m%3`|WToZIU@WBW(gMv3dgAL{6E4 zU>;#4+)ewb8yk%b`*S3<;Y?Gd1v-T=x*stv0*v2@6tcO?VyaB47n*t3a}qFXIpkV8 zKNdNo*f3>1T<+s)V+&H@c=+}1T8HGrUr=CedH~1`ER=?vF&8Lcm|$-mIk5LS`U0gk zGywD$AXq@LNtPKL07{l22mVDAvXsBKT)4l$n6xFud=!vD%wXqqVP(G&HOkElD$s=z zCuFH0e0D1s;0^!w5V9!RE%A4j>8DC~A`XxEt{=G9m8cDTQPJ&}@d*RDv;EavJG8Am zQ$uzqCh`I<!2h*hs@~>x^5rA|Dvi#(oHn<vBw=_@=t+D43||>*BFx{X#rTGsK5y~R z8W%K5kEoG?n?7fyz7I^ugA))43z(>kxp23{H_6GG?7-A4sZ&PBR4k)SSCp6k>g^4< zAGRtw=lpXkX<*nt!2kXaJq$Ik>3|3b4W<e|c0^=7I(qmrsU9yRQ8dc^u`>zT)<UQ7 zBur|cCP3^>O;&?Lv(ag}U8`a}5}6L<Y9)9$V%_`mk`L1E{6DXlL5ZVi`0Gty%%tE| z)in*l8syEvH89f~&<MBy2Ot@u?cIO2HJH!b#s4Kzs^F%Pe0?qxh}1F{lJE=DRp%GH zs*5nn5^cFwk5S_n?4ClV%#vl?wpDgFx01=YLK3-1A~_^P+qKJ;ir9;ksDO$1P{#PT z;~DaY+M%US(~zBJmwM7H_4QrdOHd>El*vp$-}ywQ0S8a^uJ!uZLeJiffb_>lx!8YM zzbE%_lZ#zrJ}NLa9*Osu<_{6|rS$S{aqMt~vIYU}wSSw^+w*}x^>W?f4m{r#d!8M^ z@8|ZfbKHa*KcrbLFidt5%xQ+CvPn-r%ztUUioq5BLMH$lQB2jLlfBFg-!CZl-&Cdq ziZ3ht!207&<Tr0N;9!qn*y=9;{R$x65vRe@LMP;BB`md7e)eGiqDmGYxubp?hC%bU zsZ+J2nV8rf@Z-ONKZ{AylXG{*TFpHINVu2vD>LQ362!R%md@X@Fh8b{ZsUJpUYZw* zYe;Ds{?bB(i=6>nh3%IJI<T_NudU8li(v_hZ*~s))@?StlOH!<^nG$8zk=!>q%>&D z_OcW8bN6PCVDrGUpsB4T;+DkXMAl1M=6re|+MRttxE5DxiGQ1SL~VW%w6kkLQ*K`1 zd@;H6B;Wsxjdvnic$|Oc&F7(mb9(z2ze*=Rzk^1x%fbF5Qbv3>poNo4+~dIF&y-7N zY+^<5k0@Gf%FHq$F`T}Os_=@i=Q?vd^JAQBGi}5-9yglIf7Ot~uDh_3P$Woj5zEVg zFSfh2OO3m6C?ceM&MiZVl3FU;;E$X2ePu96j+BN&1VOH&A~AEzDg8pd2b!`{zjNmE zbiSQ|A?hG>nyr1Vd$R2|g$o(ZfnzT0s#n4Wga&#M2t<Q4OFW#rYs+rnBiQYdL~W~j zJW11!c*y*Um~R}ANdaK@W9RT5o*f7_^Z1hG3zoK_i_k0tB0Dw2ilY|E(qm6l+V>kt z0dXnUI}+QBRo~?Tc(=20s@ln46@d=7kA^K_vW~rdG0r}^0U0SYQllptb>;%4t5FUu zRl$lJlJQ;igfDK9BG6L{9SnZS{#MP%*4;~uV{RtZJmJ!b7Y%VlU9d91O0Ehj2(lLR zDd9CTU@827-3;n--Y+7SC=1cqfQ~z;YDO)dw>8^tJFaNfygzI#@O!s7-~MClz{*Vl z7CWiQz}8soy&yYf9wI#&($|Z$m6vX)fsDyEpTm#$H~mJQ@=&Nn;8Nla>*#Wp?Uxm{ zG6?bMl+Ve006JCu*H|1?Qz;g$7hL%Fffx+CK-6SaxhYAkplml>r7zpJcYwLdNXqJx zEXM8UAG$fDj&yi3{PtCEu_CToL!416lhZme-CVLl_%2Iw+U{ug5owJY%%IK$Fgbk? ziLekE*Dmv3PRx3PR1WKQ0&7i9Kd#K_Z9S)AY9>J6#P=%NoAUXdxA*YvCDPZ{cP%Y_ zk&2slx03mwMOrUvwLGI9mCw2RA=ApW_;@H-zjJ=^c1ZE<sQ{xOT-V@Gib>z9Ggifu z6=oc}aB~u-rzLG=wLw|OOqH9Ub;K+M&iS?f@}`uvxYaXaqAcB>b$NKRS95BX`Y4VK z&?)&JJC)qCC-H!NP~IsO)QPswWkY<UDu7~Q^Me9f!G0J~3lyjRc{jQY&%I_7uSGVp zMd9`_<zn#yRB8;ME@<FLOh&vrsctmtxifDNn~jdw>T92|$_s9`?_I}uX0p35$VuGW zT)x2&s~WJRO0$_j)moFt&*|{dMeZ9QSU5b1D7|NC&^;%w(OFfe<@m8Gw-f)YAgsgW z(3+EBDwfiMU~3x<woGX~0}p%{liJu~MXOlWp084<M^nwynO%?|k#tSZ<dH_l$Lw}U z8zr`u5@AjFai{$wSil{q&*$8EcqE5L2DblRg$@6$4gbD<z2-ewGZwzIXz+U;?-Zy= zfKa_P!&F0(aHt#!hoHDCx-KC;H*?`E)U2<M^E=i1hhGvF?UIM}0%aHcVPjOG<Vmh$ zixc(#C4f$XKyek`r4dw~^Rp4ae1<mdNuJy2&nXnCp88d8-m~60npkriCJz%B6Xuxb zMjsO33+a%B?3V7LgP#q9{qu<Br`)5^Lmym90%|eeye!B5?#IuneBQ*Bt=L|#4C9^c zkyTvXA+*PoMpYTZ$rIEI=f9i%bw8)`hcEY0c27MY0Fxs-D1!vNu^v{=DIaHb;*y$W zMjy1_Tu=c@nKZy*bH=dEB6sB0GQW_@CgHL>R4tkIOZP*xjxZUjj@pdaJyp$;Yj=5| zU)}{VzS^0|ZE7z0zIjtx2Od!?1$T0#!3Y;3u++yRH1FvNiL|J>#edi8|0wFp<Du@l zc<PzTZkS{rTa22JEn8zJ*^<3b$k;`;XeebFOJv{o>?*P|c4O?aBtm2CWSOy!Fy2w` z^S*!n&i$No&pDra&)t6Cb5zW};MlO=Xl~{17DqqM-Tn=;JfOn}bH|k}xqD3yKvF24 zI-n}1lDd15#=UY~@Bmm=+`n;exntQ~q}Nn-Z}RHoW<bzDv-|Y$yHa-8{7%Adf;vMD zf)7^Hmagl<=i?k7*33Ru=s2-J62awd8@3$m%Idkg^B)52@D|{psUth2(0Vp5i+xfU zbYfd&;yvfgj-1D~hc#h!-A%4(Dg~Gy?i%oFaWOoa!pzKH>Ymxs+}^NA*N%8HgX4hR zF+es;MMZtN3!_85IT+Ng+VdAzh#tC2UO#q%qSZtnC;RIvj{~f?>1OTh`g#E()-@9x zqqcqJ6}1?Wq*mhOF>o{~3ExgmlU#f9rdzI1vs)oJ&46JLOs*86bZM`5w2^+lXdam_ zu*x6|4nQ|r68Mb{#3c^RG8-k}!AwtT>9=kRd(1ZnK2*6`orIn3g2|yeDlgaN-N)Xh zUfPlQ-xz}-y125d%yaprSPFf7%GYLW(hoQ3CcO^hrMhB3djJaRBwX`Xz-gZmVoJ2r zO@&v-M}kN)CpzD688QYN)E6r>y6Os4=GbjJ4=rRgaFw$6SAdJO<ogqYNzy6cC6xE; zew;CtgyjeS#i)YvH}hunb;pOSvECcG<+5*xYtm8|Uty$9pB44V>*@@DCvs__52pPc zAAtvt<zal3SwcgI;ztrWeFu#AHR0F?L$U8!!;?DLCr(^>#tXD6sw&!hd%GF6oNjz` zEc@vFrEQr8yZmZE$19`3k8Mc%=bWp>ZTf^_@!)wqQr7)yw%z76>FFk>I*V@|tqU(} zzv`zdc2bG#i%`!#&=hwcxYh}PF2{bSYM;}p&o;0JX8?8%)BoMf%79@PWCgZWG^b7l zZVXsjwY^aweCc@rwXE*^EoqR5+P-9IUjAC485M5y7`|hxd#Q<*PzARqhGJgvBAR(o zWl8C`I3-O`-FJ>)8eifr*OB<zgmLLp$C7Fd98{iW=@W=p8?e8wZn{G8p&%jpv(>={ zWvU;%?Z1uy!B$tcMapew^yR+?sQGm{j8y8)ZL)R!KG0)~d4JE_ixO}U4!I8f@U`f! zmcBc6b;1>S=f->PsUh!NyBaYTg4G31V$NMzQF&WEI&z3H_d4CEJg2pqb*c*om3Og@ zLjVPKIyjbp0WQTO6~Ix2?F}wF`cR759o#i1vH$CZdM?;Se^wX$%}!^_&XNQvRNX|> zHRkb&hh{dmdu&q7OHlEbF(z0<8am4obK^^VSL%(GFA_u-qK}Bz5l3i?I^M-r!Hdbo z)9xRA=EdHeQjLihP&T_|d*$;6kZ-laC7-z^@!YqBNu3${g1oDcMzJ3<Mmb-_$m#Tn zW&DVO<AN!((hw(>UYY)k%C;9obzJ4IiwD=6^Ch-u0>DADIL4lVA3(nVLerQGD@u2R z-f=?O$&KXj<V5-P9a^x82B2X@lAlw|7E{li{&o<DT40bf)`&A4R*Dm=b^SyzsN_MA z$OmNdv0-M$z;KxiZnxYkNpaA*3^X0q7q9>7`2b1y7+(5Mb#Vqfx$B7*2Ug9o@LINe zSz2lVQUo%mg_l%ka5G~tO;l5y1SBQ}1H7$#Ehapyo|TO%;HH*k%ENNz7$YmwQ?}5{ z?J}EC52EnS(WdX9hbe+w8v`!may9GL3+M0p$sEBQ?p7~eZBZVRR5^v2ldX!O8ov1~ zAE<@%V82wJZeSzv#GwjNnX5iGnuCl$8Q9)yDrsF>L-g3`C!D-{4oK~Ww^LH}ZOXUf z6QL73H9UMWTm<$wh8=e<M)5TLU(Cy+GeHIYdW3-}eh%P%Kw?O|@+I9Gh#Ot#Z+Vg% z6vkArcWzXdW}?z<|GO;z&`YLYKG?QQ1pPzxd&3X*P1fIy^T3<|HFme>5iMfqLB}RX zLUAL^5<%MP9RZ;+AGM*uarDG$&bMZuoz7%Prz)BouENY1J^93yo$ACFp#+7IYjc3& zy(5N*uC5;wQbfxhBNwjpl?&EV*ja@8VLN<I^=O7I1o7N<mwpD=2`-7qy-xp3KkpaF zLbv$Ib&K82BtEkdZEc^R6;zY195CfsQ)wBEE?%yXtpyx33jDNNmwLEu5JR%0k%C%= zPPBk{>pP>>eYb*Yuh?Ke<nZ653~SMR13SDtqH`0%a({Mw_5z<7LZC>iUlmv9#{e$7 z+x2DQt#qtEXKk60Xrf7OZZ3n7q)eTkpNO}JFSVu?Q@O}glzEK7XUOo+-`eKL$4Coa zJ4#-=N8(O+Bc*F4*R|_RjL(nWp^p5vQRHt*|9Fbk5DQwAAADV>BU5KAUQb-eUP^`F zooG#u#@rvzdSn}BAC4=nhm%;XEr)po_5^B@gzVSS0LuhG1(5*=)W4s46J}$Pt8K2d zF(7g5dWbP?6u3~RHI?~e@wy^R`U}JU8&Cd$cW+6{r3AAj*ar(yZg@UK!5Rs@E|!gt zVqrF6FLzXt`gF%$BMD-}wd29{q`{Lu_SyJsEJSh!OP82$e|=DKZJNayVao~oJrX&u z3)t8uDl)~77_!g{S}CmyzHk}UJTC1GGj@08A6tHY(G+oBh68Juy{XJtqpHDkEU19~ z<<Sm=DX{6!VfACE@#@3}&@gh!6xJmC(42a52JA(bz$WX?xK;ML=q57VKYIy!zTtLm zcG}f2-<Z!fo4G!>?9e>U6FzkL2^W*M)mF`HTkoB)npb!iO|px?IPW(MwWiv=4ydQ- zLlaP8^YdAu`rW0m8RLE3mgINj&QI-89tqMvdAEz(ZbZfX-*0&{*0U&zM+D9FpD}MY ziq+%g<XMd4HTxnL5_sffxy;)pgY?{<E*hsd?*gKhUj@4~3Uf<dGojI{FE@Q&{%nYq ze9w8#W}YDg<Vy!#5k8fpy9Vt@EjOu<=B2>_pYcJVtWGuNor~(X)9+>1b-TP}{~B;A z_C@NL(!q%o83!1E><i5wn03!AJDU~N$6q|D(Js3uq^cD6C@x>anvgQPbtQlNGA2W% zdjiGiX94;-vdWMjw|MP*jK@`;^{Y1+8cENj4VTnY#Ojm#5UDsunZElT%pvHQ801$q z<wE8x(|)r|x)V}_=tGg#hyGkg2k?mWpXy;vm;CQ#6L%F?8)+K}5_IeG?=t4<2&?mf z%N9oFofQL*$^~)JL{t&QVeW3-N#(43GdDAsmzS67UL_i{^>*%8S2l(+?IRQIyQUR( zwhTkR54XHl*jZPUmrpKMnR2zRI;uEDQ`5T$lW%z1e{tH?`m_r4M%uYK&spW3;P<NA z^=*{A!hi?b>ha0fpFkZHy*^S~%$+=SC%ig>y=B?-$!S{RNiAi^dD6GdXR&x<LUL$i zhqoL<_N?Se&_{Klh#{hHbs$>siQ%#99hT>Evvtn`tE)hZft-`~bVO4&b2?1{mDQ|K z&9|zNh||4*?$TiFVwviKHcA&&Gsd6PkYZKFm{Q@>zSESxpY8LtFp=%m><)Kt^s&6e zkMuS7p;1hzT(<OJtDi7n>(g}LZ6;EnfsxDF6%6iuR>xJ$oC-NmDLK>-@87K;+H33G ziT`~1ddk5MI`IOu<CE&v@l(#B&t=1!z{AU%n{A4)7cfOs*=E;+_Ev|b6F`APy=UBn zlJlh(v%r#9{<=0C9SVPg)_C-Lszm=pjbnRcPuj1PYw{hHY^d_7$BF5m)c^uv2B%Uo zgI!oT_uFsuMwd>8k7rVNB1gn?+g!#9+yCmNBMfWl=TfbXK!;}P!ByeGWYHJ?_Tu=Q z;Jdue%{EPXPcJ6X*b~`ZR!;ot-1<Mph%Xo2YsL%dYPKKw*MA6uD8iNDDr6apwjl85 z@9f)3sa0z55OgScY07jW3)@?HaTtSL>dV(AKO5zqOQB4mt={F>I313No^<YNZB^{P z<S@dV!kWVQM}gFlw<L^d?1>?PCzT?FCnY~+={{X4a|FQF*49lnV~zVp3pz<F8Ck$9 z&RfYV&R5AN-uXwjA;V?=$Y8-x6_|8fO%F{EbU-3BaLz_7WsJf&;H5~CFc84^he13d zTu&r|9ta$UjxHV1*DM`<YcmRP5=nvrb&~oc`=k2b_m60M5Lbrzq&euk+!7XIujQ^% zEvUoq!dGoin$o=qLJuPT6|udAIW@XueCX0-Uc$dM%AG2FX3Ag1@jY>ZYprZ+FV*f& zJq>x9XgQAUn?>6_z1)n0fh5b%qB9T}BXy^eSSR~+X6D`LUr6DMmMfDIC}i0Aau_f| z)tV9#$f{X@4B}CO@CWR6xLkOi>iTTqK_`V5w2#Z=7tJ6qY-Z%Kpvx518M5(Z2j2IH zAhi^ifj29}n^B+9Y#MRmX^4o)UCT4r<9vkz!u$;22LzH)lC3M8{%i1QGQE4I&HaMM zIGM!4kzTnUD0J?e=tYczs6SN}eKc<L@|h&LBN5okj>0oW#YFFp!sMUo6{mB2XVT>F zP-p4+==TSa_d=p#9e5cXoWWp=hFO1ZNr@6szHII|;;b6kwx<N*2MD%dLxdU-q4No6 zG%<0Stjf}(qVUF|Uf(gV6LPccA#nNj85Xg7v<2@=Xo&Lp9tXN36i{N#4zu{Kc5uYg zuy1ERUG{)jcGlth3_IM8FPoR7X1FPo*?r`|-_s&(&W;@>5`5O0V?{)rf?<nN2&puk zT_MEpO%w9~9o&xknLiFEX|rrkOjvbBJIN;g*~bm&j@@VJBGl7}DCM>V(XOHE@W#_D zS1cf5VZ4k=fVXTdqCkM>YpViL@X4k_p}41P@IRk%1k|N?%C>)IAU&1Dn+^6O8wy*i zFZVkN(;TUGN+~+dW&{$co8N}_-FBeP%&V6|U^RsL#GX!Z-t0PlXy0zPYZ>{x6Hkr^ z<d`s;$FXrjm9>hNJzpEx>cQ|2#l0p=db9CwjHof3hf?U!HBOlE%dM<e(r1GRIIOAJ zVa}C=cNg6;(}>27nFm=RA7n1C9MlXC8K6oa;slwOH`-60TUo~UL`O#cQ3XlT5L>PI zfz|1tc_&1J^~5_D2SchP!TO*aLlEHiN#-~@&GAi)9L1n{98n*>&4>A^zQrXv)bqGe zT9+K&R8>92UX8Gct+KL3c=dH}$#E?ib8yOkVpbHY2E){1oTf}&3+iN<tQKmXMWK3Z z3y#bOZY_Ftcj0NL(zDq4Yd>&(4%_)opTT!#F|Vw3IjgqHae+vbH}bu1%u2o3qE*fu zPnbXdbyW@wWMh3jd*xtwNIXdMs@6LxOOtprPkipW&1PEY<Y(bbktw+O?ylBodQx0g z@KXcwpD|3&mEKQB{U+Mb#!=^nYy9X8rPW4#p3Qkt>ni`EQT?w0Wmz-av^+O?ba-5D zIgDw0+<mFdS%viM*|qMd>Rk{2n1@lDApkXG{o<8l`5_ydo5}?+Utz-ND3Cvb?m^|^ zO&z`u8;VzB12lV*yOlsyvqw5aOLDH3&|l7N6}NF!&??ou@Q|Ws+08~u{vMoZ<3DnK zTrVqu<o&n*Rxx88aT=*0iQuYWiIA!g35`;Rwr`xgcjkTx$Ee2`$G|nUTY~OiS08cB j8(p0xPYCh=y>RZS4UGV!FxZ~_c}`PJSM`(flQ;hXx^h)Z literal 0 HcmV?d00001 diff --git a/docs/KeePassXC-Connect.png b/docs/KeePassXC-Connect.png new file mode 100644 index 0000000000000000000000000000000000000000..55b0f3d4907a0f93340127f5be82a39d9e6b5494 GIT binary patch literal 103252 zcmc$_byQnh^e{*TDAtzZUfc;zad)S<1b1uE;B6^T+zAfFJ-EBOLvYvP?(l`a_kQ!u z%v!T%{+he)N<;3x`)og3P6L$`B+-!Zk>TLr(4?irRN&xV0pZ|YGQB~7{Q?P{4S;(Q zO&~2MtO`orpDVLURK`VESrBrN*VA!$w>ujAKAEtS{);1uJUUPOTW5z4=0hJ%B1%3y zlKuFFovDBGm`#Kc#dgDY+`gK8l>D&y1Rzd*OG@_lI*N9?AZ(fLxqiH+7FZ}*`!g_7 z`v$h?l3pBS&%R~-bSq#D9u7`P#QWyfNuz7iybA>mF8$a2!STAr-><lTKbikOeS)GV zb}<7wNL?EAY&erNA<#1I;y)WaSEmf-4%jP%v_QDlr2VVAyaGDxU~#$J3Ec1=7W~lv z4dQ_wcol>Lcg)(e&Qd*Z%K#pTAK7L}kTd#3DABSU4us$=+SMqOI08l-sLan4mWH_C zhW%iCG-^Kzd`cQJV#b|>FPzvFYgi0ZFT@%$W5W-XNYUK}rf$j&Z>2OQ*~29VKLtbe zVS;#i+D}=Ooz%kZY0z@9KNB!X&aRqSY-t_RJ6(E8Z!tQf?5`0zMN<`NdN0yMtK5i7 zYaX1185#K_3yd;GAdD#?js7_>^}um1@?`tIds&X<Z2sPRrFA#?%+pZBq*-9ZEi455 zUgQmFc{_ix39Dsra4;tik5x)aiu&izjy4PR&I8)o+6xAUi`4#_?4u%|e=&=gT^`KW zaB^{NvsUY~jS8X2M<%4C5P963W;cOO+F=jQ>M>+c%Pi9U%rqlTKERNR88FL)lL%IS z|Na8pRRDnqniV7_Cfa~NGe%|c1cO?#f}(%nbKV=i&U8AM<DjRfuaKf}V83>aSPd11 zt$-JzqNWzBrm8yA5%BK+hQBla3rX;Js|Ezf-Lb);%VoDv%IkVKGddbEG%_+jJ{|>I z!#JD`_{twU(PD2H{D#0JpIL5uIHlrjdt|;V7>5x*6oC_%ObO#rQ}nZmKLeJ3er4t4 zW3%^SPEL-Eu`&4<KJ!3QY_!TzR1{VqjHRESu=+E16r=(_&eGZ67+6~u$}1?$HMkz> zCXBSTeg9{{rB9WkVjixpH8Uiie;F&0NmV1SPeP&Q5dD^FF*5Yp#)yi}_rVC-MZtr| zcRy^fx_7~+vX_#k+5GP8rid?C^^;c_SUNMlV<#F4cgw;SeV;2r-5wZ-w70YKDe}O` z$=SJ%S0|nkP*m1~XHTeYG5&=d++u^G{6?iaxCje@PXCv<Xg59Y!bpZ{L{Ti85|~NH z);47?DDmLxmB+ux)#I1m-WxSW{mYj0pWyelE4xxV918hk^Yhk)g@w&L`(L{O%`Gj< zO&646@ltpI8H7IICQ6w_F9?1;I5N>eqJWUxIeQ$hP|mgaQZHvOlJ~Q>$)p3lG6Uv6 zXpjBEeEB>F!QyjmcX+vnhlfSof&9bQT{Trzv+eCa_Jl4^)_Y!hi;&*0ZVNc;?^&Zx z)Qoe>624|u^+sTnvNU4($C7>mJUl#x*}rO#O)Qp7rn_~YpH~(a7pIIGgg&Fo9Ky-j z+%&yAUKK?b$bU~Ac|ymuOZgMGkUrK&o9}UCdl}usj@i7J&p_I!Eb^~y{scG?WD%V` z++8g;=z4bt#+_UpE>`3!rp@*D2Q`ci8w}%nELETGuEVTeQl9g?wEPXs0=mqfT5|Ak zi}Zc&783=Zi17&s9DTX1_rFr5U7q=g{iCerMxUppR6!p*UtizpnVB8y<UfD@EExA4 z92^Xr@Pm$9(YBry*K)nJWk!I9_w``ArluzNq0H|~FUapzxu!`Cv$l_3lU3x-2#n~^ zCT8<`m0l1M%naJW#l?&sryGIR0gI!fE7r;5Xt<`n3)@D_BWAUYconm=TIQExE-Ll~ z{2rHs4{7kW_J>5B8IkU?@`RGz^n6O%QgJ997aie(b#2KUmyhrML#rDC9ZKR_)Y0ST z=Rf3o=BN+k#cMI5ucv2ANlEFl+V0o-?$#ag*}HQ-g@tH<{?SXPt9-Re$K0H@hKSTe z2+R%YRoYHYz6N(0mEa-%6^uX3)C*NQ?qMoHWd*JZW&1yS(e<IUeTnd^5T^-o?BJRv zGcz+?3^Zb`oC{CZ1U{>hXW~9}Xc_&I=hC+-i6o%oV1T{cB{{_L6Be|-QXN}UE6$Q4 z&=H4kpM$pmK6PPfG<vGMZs-ywjX}Y4eJC(ltqrbRePc~Q?gJJ>AoHuMh6en@r(M4^ z+0Va~zhQ%66MaYX7f$YEcY<1@`D|;50K6*0CFA+MGiK8$hS`C3J@zr(!N;d%pa=<_ z>KZRxj0`(ef-zERqga#y-=Ytc5|;M6Usa}-q&3~o&uRSv@K5AkEVCk0#tb-V6iICz z-f#AmP2>wuEPD}}#e9umDOOfiS|-*1?FFxGltL7pE%KhGX79dt0MS<*X^D>gw|iH< zFUIPqZ7Qy>Qa!p?D5ayS*FvU;hKAh11!EQzi*{TH_WP`U5wwAsV>Af1lY18zhqDI< zwxlgIyQSG}g}O}C6|*)+JVn|5ZF^q3@AzF^UHfV#CN?OHQC7`l$*eVH(X5m!Xi$Ms z6uY9qU1SLQ$4VROg;m5amiI2AdU|?H1kxmvK5kc7P@9+sTi5A!bF;MLUGeepbsnnY z*XN1LTeUPbJ?#19oF}n^h)76!>cn1RHfU%CfWH8qvHL>raC<x4#*enQ`})8T^z@mg z{&Ak#dyb#vFXu<9CeyJwg4>@N6R6ZKo{m1BJGkWe#PV_d_LfJY`;0QW&oB9IZQyN# z4g><}J3Di%#C{vlQOo6(gTs**t1!84FD1^JAh)JFJvOHNn%bq<0&kF~B+WysL)+?@ zn4^kFa7~piHcORG{EHFP3cAW)WXQ;oCq9(H43dt@8pM64SoraKAo}sH6v(CI_QCtU zeGqiI>x2&l@r7}U%zc2Al&mdj7h_xJ3o}~Dh@YRI$EX%gy^-5j&(@e;x!A_HQvN)D zvJ+HMQSnCZUcY<<1ez|5!=KDBQ^swikXA9PeD@({CObp?izDl5SC{xtdWjCU7m>lx zN{SEFoYZ9H&#*bFVwE$`U~^Ymmb>CGjeMRTE0I$&0te}xc@3MF`TuWna*?q9xLrOo zw04h7S~zPXL9lApyLJJKcduCwSAo;l=_b+ve=WtO+l|5B@Jr4QmSaBO;LFrDg9s;{ zlz8plF6*UrwrAMVX*Rv6w}EZ4Q50VI2YdhkU~H-5*UjDCT`g$H!&5ygjzs!){;zFJ zfPS%NZdj6-IPqbi)jdD09`KE$-1RX&j-r4`G8qrXZ4?EqIRXIok92>+Gg9d&2ebd@ z$JKa^-v77>l=KDcOGo-+vAw>*TkVgq+!OA_$xAr6Ux7Gqa6)p8u)mF-)4=x_Fvt29 z4}yVrcES?Dk5tc~EdTF8%fg|s7hpNn{|`$pw8^M`#qD0L`+nkYg+u3tMe8n){6j1d zCt|G~fj=W&rZ7V<k1ZsOXD1}Ug0fk{&T8V%eOcF;?>2F>>lq%*OQoY!KX&|;EwVYx zgkdJOiuzaNbjhnQFQSn4yL0eLgIfE8pY?&YH$Nn5Hf@*c54B)_PVI-TzjF0=jC{Rp zUN$>jG@Yy1vs6>Vf;~tqYiWocxtrIT<?A2lnvff`&zahFg2`Wqt>8f6ZDBEkJ>f>z zxHJ{EHyXsdh2;5_ug+tN{Cp!lkZre%OR|Hyi^@OsZ=V<8Ih;xWHYwZ<A$B~c>OU3D zopYA-v-z!`wTAiii@W*rml%`3f13UMyo4VAacO}4`dAFzd+^2*z(r*xe9J~0p7v0> z{dBo~?Ed<%(iTT#$;}CSP9F6ZjdrI~UFVauIJ@~Zbu|FQd>khqi{K&kD`V<|(v!Ft zTxvl^FN2f}Gp`F(v=_wKA8BeObXrnIUZK?MX@w@qjW_Ebe>Y@3+dv1LttKRRvI+>; zJ?|)_KO?TpZEOZ%X(=q7t0(D^&z*=HGGhb}+;|%*7Vv5WY48zqJ;S{h>Ag_im7(~+ z$-!Zoui76A2@OTlXx6+TgHk^1Wv^A$)R_MdMjxML7gtwXbMu~QC{%AZF)67+j%r=K z*=hdwGR}1tk7G6n4<@{C@9Jx7OMQJ`>FDV>Z|)uRgHvzn58!Xc#v-wh{pdGK@XuVl z6AQQYT_f|Wl%Cz<+lS<ol)BTZ>T0t-lX3pDY#h6V%OASNJAOp<dS4wKD+)5Xtx6Ir zmc?_XMV|cxP9`fBu;`Mv-F$uzUUC6VpnNUH&u_Jem8)U2x+ucVsIwYQ<fYfgeBQ#+ z$<7DCK`^kqsq`e^ue~^aB7NEHJ%^j|g$u50Jqs(!zhEnG&+ntv8_o-E<}m^MfNY(s zdnV;<2}kJiitF$E*nbG+Rk~3+89(w|tOo7Y(YBzd=8rAV0{>k`h7qVuTX?aS-O_d> z@|phkvsu8o3Z0y`Oiqf>JUjXI$k;prAUFA*0XQ%)P+eMT01LZ^&X;{A?Nn4$Hcn2H z5)u-+mBn7Say>hmDVdJ{;ijO|-rn9;XTa90)Ehok3tX!zFJE(T)8|a8+TFDzASA3j zJhZd6wyx;zPUrW$ZarLnYCl}On-n-Z&8~SEg1%$e@R~j($~1Nk8=k@?xg`$5c`i2L zu5qv!AG%cq(p<-?FJoo1H5w~bI0OZcmNI5w3I6Jrnb?w?94hNK?6qrZ`ug_H&d!&0 zU`V6w0SY^Nt?}IaJi`a121gG6ZaUM8;5G4Q-LyW<^z{YarQ~O4Q{vcK>({B4gDm~% zVr8`K?IAD~Ykz!SszhV5D%E+be?I?({m&4&S#)3)WfVY<YE7DeD0uex%OvppN(bz^ zA5Bf_aZY0}l3G<?#=g~12vaDmVugeI!dU!eXmIekGzzY+g6PtzHL8+b@N4IfBWp0@ zR>Bg|V34?spS3_r*+nSh{388K5|{Yho_z%ypod!gZr!;JSZp&pQh|53+LPyn69(G$ z-s>Jkj_;nFxee0>00RO7;s!QtJUr%OrN!sxa!3AZuT?S~Wgk}j!OE5|f5k-^1n&23 z&a9}IAoehY@!RF@-dqFDkI|^+w4nyqw6B&CJ-AtQxgHkqO%a9z_G_TI)fabV#dezq zV2vbf#YdBow5yqkT*hf!&;9Oc*9E7|LhWGiBNSG@Vqf%IXlQ_8>?x+HiJsgd{!>MJ zsH&+E_Y8C<s>y5fU=LsC#gF&)SX6n&=6$S37?ttc$S;4tL0V)I^ct%Z4!-I&hgj<e z%xKB?y|VBeZ_ES9e!Thd@+A-mtZf8b@ov|kb(^V2Be;gTZe3~Z)f}!SH~HKpXZs|N z%-!8{2IF)vqr&dYlbDzogT3iuBRpbwq6u#2-*zV%N02;x!!J^$@xL?7Pp{qyX>0SC zT!ilIiu*XxeeZ5a$;+$t%UC1RtyBM5Xj-GBzW6=KRW;8>>Gy3e4XwSHh*2Vi{-cTl zn{qt47`|_}dxU*6vD!(-EaL~pckjX<pI$l1ZSUa!M?wcGT($~Qoo<-p_ORi4cjyCP z@$d60Jex^IAU8Mn8&u?<6~SzT`v>SNN8$JP!4_&Xqtm~|Bx@*iqnxU);D(T~9GEcM ztOq#by(*D&RBC;y(WDdnYCSV?!2N2yfX}N(lrp+>2O^f)FJ}ce)*S_XK9$t;AmHHa zBO`w>wkiOPg%AxnT)-+U_>@d*2H>+~U^g2a4==AcX($G@LhIC2)stUR*e;<S%tUa{ zzfREtRp<CwSkS{1!b&U4f3{Fa?ON_C(aat4S5WA=V#!oi(tj<?K}wj#K|k*j_AG7x zaJEGd#H?-h0&<|gdK}1?wKYk;r-Gy6$Q$9M6-eN!N>iZp@v?!vY=3mFADL-b!DvvQ zo_=JlYpv@qH68aP<8yO#$d>zy4LGp+w6vlEL%7E&tVB7fO+s%?eBi+X!bs<7Xk``z zb496<UNO;iJtwF9&Klj*Y9M<R%@{);G~w(<({>N830~H~aQ(H%_E4$gX}b)H<e-~9 zivY7ufNu}e#|IIdwTgLk@Kjg~No>?N=QWkDuRcVL8`6gwHuuXhaA%c0O+<A_sx^Z0 zN&gX42WrI960nR~!`1bw1%AlF&)+}DtJu@aYjt~@`p2`-$hFcp{htzjA9EI3;GF|C zfIwn0a`M&PT_hA)6p*{yn)@sojhc`S^(cb|@@_$~eNPp^#T&HnwwU~hlY(Ii&o!)H zzl?Ly@tu)Nh<Q)ShsEyQ*4RC(AKqj{*^~3ghuN#lf1$~TFPkNzVbCDG>tXd=TSX!u zkhO{H&M4a@W|wcQtws2c+V^we!D0cxbXZjFLg<T)jisTXX@!;dWriIHWi4u&nz$+| zDq^E$u#IkEVWIN_4_&3Qo*v_^%G-W%Zl67%{+|z!q9O*6hero2vzO91AG4V3GZAS_ z+~Ci%-oai|(;oX(+sRPty-z6(-HU&mwjm7U_uF%(!&EIej-}9_$Z}lQ_eP^H=3l9x zer1SM^@$-6dKfQ3c&!jNcn>t$>i_bQK|4xS@e?<<QBpWpdA7$W`^lQa>A!|~7BR}8 zs-u$xvZONX9~#1vMX>BxuB>D~k!^R}86_p9#m2_|^7SivyPCE(-H$L>uguWY6yC?j zM@(Ftl$KWd{AfU!o0cn7*mx}d9nY&Arjv|2vcRmnw@9-ABn}Q^4EEyT6hLP*y;{aS z3B63@8$Y$<)3-k(1M$p;wO(5{gnmlW_j5>)5gV_gldcu$j=@7=(Xr<qJh(p=SFNJ} z%IyEL5;1Ukm7#b+c2Y$6b@}OAlZU8*u`N7K?nQ5}6!g=HyQ*(jupzEL>~^D2&R5OA z?XI$hzDGwV<wVXw_ETl>HG}McDXbUkokbL+>Zgmee7}8zV|kUML?brJ0`t<z;qGpU zeP3~}qY?2sOH};e?kt#|z0sTlagfOQqx17=!-)B*q)p%xb$G_c->ObYuc<*kti{Ia zgop>rA8$=2e7QpIuAvV8a<j$1TTj)s`vdq|Qtx}{8S##sC&9!LOZVky;kEV$NP1@R zG4H~+l^GX8=~(gu8(Oj!fgm-r98Fu}?~~EA48Z>a#^4hx1;1*31O*KrpDtz}GZ)vB zRyNN-8Yc#o8=2)?lShrF0_e%V&q<C=*C})^!X&cj;vjGeCnl*oz05)m|E`4=cuq(~ z)vXdQb(I#vTi#$1aV6xU;iu!wpO>eWQ6TKMGb1PGX^h-0AOE_AzpS^{TEsmSm6qFC zs<%W`uA4~A6X3fShieg@@{?tK`DdX$&m|>I8CwB-GrIf?Hf_&iZNn!=VSnSE=;KFL zjH2sNG4~R&Pz(Ujs`sB5!~6~@@Ezk_VSYaPz>EA*u{4^oeXJpq$m57Nqrn_i<mj;e z(4Uci!VUplbZSJz$6J-KX3u99T-djKrEq>Todku4_jvO2@9gc7GxB2$6))yl{}Fd? zLRM43jH@EMkYj1AKJXj1u8%(sV$v0S_~7x@%wQla^E&B@wAS5kb-h^m+NMWZvuK%8 z8q5U5FAUzac3q#)yE#S!OOI!_Qj-qNe9gi$XR7{4#Y7a0y=xq}>baY+#-Z@P`}nup zTldcH?)IJ@$(X?0qqLW=UPUG+GnniO*LmGlzt2wLbqykn33gDi!(TU427|^P22=S_ zV67F=t$en;{5|1V%*`sgg&49c2Q-0qK|fDeWi7(-0&uE&jLQN!)Mq`B*Rl2t4Jxrw zz(wD`2l9u=EwY&ZhL;E<4nWWBHtKFLW3GBaP9?>fanVG|O_#7ii(Wk!#|!I8YyWX` zmM-YS`C-lYndD@?|H2X+-75fiATlj29JUh$+m}lv?tq&IGRC*rKVQg>a#)GVA{`yc z*3nRJ=CBZBI|o6NxuZb4L!#Y^YijCKeo+M;Yq9RtxUyg!!wr&37Mq#RqvQDg=p*4j zE=lyeUZ+@soX6#Mq*#F40NmmS<Ww&^On(_$e=GjL<!}(v#I|-TWBPjmeR@NZ(Qop1 zR*`PPA0VGTK&~iG60;-Mx(I04{)s<>ABAKQ^Ixuhe}yQP0HPBTUIs-fjoC~Cgef=j zZ%Mt@#l7+Xo9Vh&0C`W%$-2oeZ7=z8ad*f$7%`?eQfNwcTBnlebitkUOb@JPP3FIP zhzZELj2}*}BYxwu8L|S?8kK@>jNDcuNEPpk(7HY?ikDtAy@W_n?z_;hplgRmyD|O> z8v54!`vo>&Y%tsZKmS8zlTunmaSvRou}{lWkn&@(h&H+P-UFvwPx{ZPko=M5rhy76 zfkCh~q0z1i2Kq83Rc1yxx*yk^veH+@#;{zV-}f=e>xbh=L5#vxKuDWzN0p}8CJH$l zppkzBb3}maG;RE%mcmLAE#OkejQOFF&@KuzD@n78mnpOmF8_x2>j!^&fuDi1h*B~N z<DX8}vi<*!*lfQ>$6IS_KiSMxN;m3Gl(z|-WboHoU<YT|3o_M9*yb@_{BDjhPS2}I zZp_|nayT6u>xt0+@(Lb`MN^wE(#D9@EX~jzWm?E$b)J@<ePPm~8S44<C3bvmYd0fd zSQ19*f(td!-Hk5wBW<+NV8n0G=B{!)?}gW=S`#B{C34Rnbm)Y-zm76T$gDKp?8}9$ z+Smn!#F)T*pQ)tnU*GqA({%pXS%fY`*u!beepyA7jsU2pM)@NQsoup$2PQs*ARaCy z7YFTk)_WcVH0H^}!oq=s;!#eUv6pK?a_Fcbwm(5=1eXooC+;rS!SVOQDn+I9z6a>0 zU!KSiAwybWV<RD*WYYCE0TyisyW1;lhm3@tP_$*HdB140@4e;c!b|vE$y&`HmIvd* zcHS-b!0*;Q@7(`~i;%G<pt7*A9A92yFN5IW;gLwwVFQvh95S(gW0I9D%=S`9X#Uxu zrQbJE-Z*q_4W+&b50UUTB$A;#>5uK)8zA?KFH{_Oqu+`lT6NoHJrg}*aIUF0$gcS+ zfU&If<kOEbwm5@i3ZQkiOWR1e(EXrR@AMu0sT0~)aY>R*`<={FJ>vy-{m}7P`md(_ zCc2!QBFa%)j2xb->)wA8`sW_bqL-YSDIwx9#WGznXK`Rqll++630iF6Z;7DKY-sFl z-!}+&g!=1*gyi8na5^`vgr_Mo#e`SdyKrMFJcYlTvE_c+l*pE)9(-NWSLeyw(!=an z(Y1FleO2+`^6n~m+u_jXs$rYEC7><%7wp>iuZ&QXkr5FS`<d9rii=u+VPIuN2TQZc zEXK&x92k!Jxa%ZJV$HpyqN53>{2#rw=|R$n-HQ#b##03rgGt-rzhaeX=mZLXXaoZ1 zFO%CN#();kVPS}ik7e?S!ClzSsfFvO%dZkwOI|0fqIzSWeS88%5wp+;LW2FpCJ*IA zs*(^38ZLfjdjJ*)S&-v8#WY<Ge|B}eiiH&=$34WBs6bSp80<P1H04Yxvz(xsN>NIk z4GIlaqwE={1M=X=^qnkjn`WBKw#Z(dM2%RKOd|tx6;ebD4M|=0nOjG$oEbEkNfKt= zJ~{qIUe+&>3@SrCOsyE*UA41VE~6*jKYqjG^aqyl5RW|_q9O)d`uMX1gnhAE#v^tA zIDp4O*kY&n(-|5tnxpuA`pVKm@xp(L`-OUki)Kx?D1iW>v$6iqo7NW%C_r5+sb@+j ze+;Ma=GJ4%RG=bhe*gac`07gX%NORgwKY|!2rYNq)rM{d2dhMPzd5^xH9UaU@{JKY zJ~}>r5x#9_XXi(@8n`X%i%;&i_%Fdl;w{2}b)?)#P*Kl&zFG6vglW#=N89J_F1Unu zwdqL{@A)=1f*$#GkGC=vdR;sbpc3KVx7N{YwP=bW(M$bXio>eD!C4shi0sXw#0mQ< zHQT2x!UH&=AD;)+Rxd6tE^3|k;%-TsJa0~U89TBqB{VhT6XByjs;a7H$%Jk4b5ldv zbpgh*GBSykmZyu_Y#?bOUKiAp6P;4IcM`H-1VhmU2|`Bh(Dh|CgT1?1P0VVviF<Y9 z`@&URLGlm85Q(;jSc_Wuz;+8rEUo}I@~hk?UulduL(!+e>jDpbRsO>_2RAQDB_!Ld zm=~D%CoR{zg*}SE$iS+H+uwYQLx(?b=KC<vVOJHLB|2clOnL?h8CgZJXj3ij?bh~o zp;l3$24t-}l%QZkb1B-<LB0c5D}zS%hJtT$YKr5=Tbmcu7uE6O$IGe>=8r3vHhTO1 zp;EGfzcRB0S9f;t_XW>UTuf9A7JINjdrc&zAE!g=3Wwq`w8FTpeL5EoG|C+G(96wB zgcB+dt%#41iWTiSCN97$91dB?dRE;7v$IUTI9y6p{|J<WgTo3bm3<(>yvAfpCecjl zQ)ITu75VlCew})EuZk#=91Z~Zv&+cx^r6z_I4Y|3;}ba<AK{C~$2Z!In(y?Jz8()4 z#iSOuN3vD*KB;#!+ZWBmLJX~Q{Lw7&jRYp>^*S2h@df72*uoe?dPazsYPoGND^CC- zC`kU!i#(c8NPu$}vW0-asIIOZBH*FQ^T`_lfB<-=?p830q^zr}i|&`ybyNZa(u;Du z)8!%Ee>|LpRh^TTiIGu_%~*a4yG>RmPQ3qV_BUeB=;-^4qPey7k75##HbfFH|MO(> zUS3uI9~t!5rzWAm8l`lNr4wxvLWs!Wwtk^ky?6W_0>ikj@g1jyw|7n2Zd5{vR)vAQ zf<FhTFbA}>He9@ph!eV^BKk~I2DXx(Ua?stg=gR1<^Y)B0q@x{9F15}$kJw2ZLu2h z&6-W7?FQn8-XLiq3+j`+Mz|)UV<kk=!8l$m!Sswu44Y&pSGh_!hw^3Z4+)QNC(KmP zzR+*l3O%dvGKkFfOX3oBbZn@oR5GhCIyot*{4M%*VsR0svm|R+<?z?4{7HqSy$Act zMJ+4GH2*qguQ^9<n}iMm#NWKx<ns=!Zo@?l)NG>Dwk;>b#Z8|Z9!X{)il%ZiY6rbj z!)O9_tEMHqNfkg#3v=q)CG|DLV?&r*Y4h<f@poT^w|IqEu)ch5TtVc*VZ!V7m+hzY z>Nh}EUTWu~eK0$sw6wIa+@SkUKR=_@d$>jcYlIvHZzK$T2MrF>AZky~rm_W}x0l10 zZLSmg!r8ghe-;)D#yZrBE7%ww?g}qY;*>MLOiW?5py7U_v$xk}PS|GxJ?I4g6XNsm z=G?pYmS!Qamc+{OYKIll8je2UPg*X-?tM8EQ?oo)GjmdCOmMp|Rq~|oWI{5bZg2k& zZgSCs3Ca`{wZ5<J^>h`FH9t!nv$OvT#$wgx11qKjM#o0S&+L#{v7rL1-*H?j{S&Lj zhDIk>DA)J-L4B^J&go^~|G*FuE+SVb^$-XM8i&&a?a$z*CZjye{|5_(Mv3nCK9e6~ z7B;HK1w}=wP;hMQET0%h^+xLE(kAZ=&*+RS3+P#G=p4#kUi?gY^;ti_gYK{+6!+^S zYfy;3B<w)N+~90#J9wdRp<<!I6Hx~d-y^@l7kUJ16h3dTKC;@%uzq{05dZIk78V2# zOqS}N%3lV?Ax5u*(M?x7(`ftiglzB%L*>O$CMNSA?n_39`gQFF;1>&<T8_!;mOKt= zZ`VCPT_wvNXV3&a-+9(?!1ki!$RRUZQ`4^5VSexc8sA3^f<*rDOb>0YP18S_w*>+X zL?-@dZNdM(gHQw;{%y1H4#9P;e?7Z<7*-s5jmGm4S`;}q?oK<F$O8CtuIOc&v*+Jd zc-8}(6~KLoefewJY4gm@JV(}$9zRr@EV5LN$`}z5vE<$Hsyu(2>`3-=GyIyZc>DCm zv%0?i4<9gZG+XjGs4GLQPz{QBeVmiJlI{8q1_ZaGsMBqICE^DW`ndA51U7i5kCiET zx9^ktK95=I<GDW!(9hu+@KK=w$BG=Scz1l=4~WY7M}scb;rLC~o%;{)e9Ci6`wQFL zwTQ4a>_7-X<GEJP3}y%a>*q$h!B2~`cYd(*H@l6-a<B*IDf15vg>Rl4->q*(ZQ_2! zF4bgLnI|PBO<PqF-WD0(Dr_^KIp6&Yp_D#87*|~j#jljeG|bJ-ed{&N;+5+de^c-E z5BgqODN9)o_`-_|=R)Y-;^@@xXAC>K?a%`m&wTX1lLW(T9A4`Ob(q9n>}_mp$Q+Ne zctI0x#yRSz4<47X@*x}^=kCkh)Bs;_b?38?SM+XlmymCMY&LJ&*t?F5?^bphvCPAc zIq*(Q*>A~i|H0QQ<eZF~Q=PYa^3Kdr?bWgsw10GJBW`4vxsDbmK)HVPe7>x;;m7xM z@pkkx#v2<m_wFsTZ5!$a;~}%NwBLoI{}&`wgdqFA^kp;bbr*Z95vo+idCgC_)rJ^I z;xI(t#$542GFJ02!aN5Al6=_gCq7S9AG@@<NkW}PH3CY;s;oq9^X03GJ$8Uk^NKZR z-=Rf*BA2B2l{f>^4NvzK@_c&bW&MU-{u0?nl2e(7>hTxaL@>m-TA}V8iOWgD9(B`3 z*4W7YHh1gQ719z7i^QKmyZ^&weZV1y#S=RfbVk?MDRfG21ci9)Q^AaQg;kkiz~!;p z$@UgL=TB!Bmn{a&Nx`tnx#B}}7<L0pr|w$Vv|U|*L5C{3%!YH1kbwQm1&V={tZjkq z;yTm=n5&<`QrEqu`qUo-*gvtE?WSIyeYVVJA03h*cs`D|cP28wcZ`Gc81pl|WO7nX z1eGa<p(yn<)v#bx$Tn%3`_%I|ohcbf4*O^zAz?!G#NFMUZeX)qu0>%0Hk-x^?=fY^ zpBh?)sZ|uW>E8Qxvyza61p0$LX~=sop`?cIEY^5yhFfyD>X5A{8a0(6RW8*gHKgR* z1K;{hP5Fh}n8Jy>w|9wtSVKdDgO`_H3t`=i8=LGUC9KJoFZcp(g<PsRG&3`^{^kUB zIK>Ti^h<O1&t^Qg%W$OQ#rDIL`M`+DiOH$SnaTNrL%cCnLz10DMNj!f{_nL|%0a$2 zAZKSa!2ZpRTN4h)Q2mlDY@$h`%4#n&RPR;)s2-MJ{3Km6{6rB=okX3fm^<O%;h__5 zU2j<eDpoIaaC6h5ik5CForODmeDq$|=Yz3%5Y-nw<TzlcK3skpyKnalYT8i~Q^H`L zqh>CBuFvlMA5iqz*}ev=M|s0;PTgAU=Ex&4)Vt+Jqg%Gm9gK=&p9?p>Sw6fb9|?xp zMW+eflYUta2hw-%-dQINM{R}kzk->jYvf;Xr52?Qrv9_m=4w-;<>tytI;;gciFgBp zF_e-}R97@pbm3ZL*JyNLnMl97ynG&z;l`Vsn_QS&-rGJCxmgusISLc<MKSHsLl-QH z0Vy)63#lupVG>KE2L^X#>>nM0VF&V_$5aSZc>G%Y3H<*Orlax~Uk<d3{`nV^lYaip z`T6<h$q=d>t9!XSYs1<F>kt;?#<K)AgKHIPVgmLZ<|J(efw7(mVWJ1_Nj{INI3-TB z1)pClWeI}by6H7G!?=7l$9Y9UQ#knJmfq`?VC6l(A2JxsoCa0s^2VNd%Ildv-%i>j zmy2owrlo|LP>`oOt*op=B|=LV>`?{}%XwvMQJBE%u4Y%h&Ue2<_x;~GQr%Dzh$K>( z$Fl`ArLR){-9aTYRyPIM8=vb3u`DC@#)Y1?<3HoaAD*|m$jq^02a-r)AZ!k#>ExxS z@Y=kD>a2kWaJY8&4DLSJvziTio$NuSV?}}wEXtJRpO)w^$op%563{ERAYpco&1%dQ zN<yJ(hh5Hw$0}>qZ<D}M;euAqI~=^`m%5GrblKV7{&IYmT_qngsxJ#x8LHy)#_0_V zn_iXsax}Kfb_{rlIe=!(>uI*lBRIIWcLm*7^n7p}%b?8jOFufd<)u6?Q9o$lhe#m# z`HPrQ@tXBAB+yovb`QEg;j#4iEdW;zc8p#e6DGySw;mreubq5CKty~6yI|})h*fLM zmhEf1Fg1XQba|TDTieB-7jyz8v~`)+-xt-9hLb<&@J1~+zk+1KFKzOG()eB<bs$DG zI>D0K1!_YhR$~`o|G{ySzl@n}4W@2?vj)L$`?W3Cp4`KZWwu{mf0B@td__)94qH&g zu-bgKZXf8v+%R)l?ypg60jdj^LW8v1%LR=%nNIW$qme&&P;YrG|A5ZDZrO8VxM==0 z)eJ71_Ia@fr3i^9Vl#;wjG1LMHX9oB1ruQ-f_Cl4_u2FsM@L3R5OKWMWIuw&^nt+c zxjB5;bX**!C6SrpeN7ieUg#yDAwH$Zyt!TSna3|6Mly4g&umgX5Yn4PkK+<fa>s1q z0sigdZ7#?PWDh6u>CxF{8T47?*DQ;uS)W`2Bb(XuVDjvCKLWT58tai7AV&6mcXxLs zV}x~PZm#|Ckm>UB^4TuhXa1AvAd?w&MG{Ppf5qwoGBsO2wrdPG*(bX%InxZ|Fs^vw zJJlz6*e+d!>Q1VjY987mYW<&9BjIekPO3^sNLcwX0tEvY84tpl&;T&o{8P&RkCn`J zvE@Y14&eh=pG}#Jw-GzXyGwU@{#bj&i1zX&=iR5;RMF-mhSMgr-kv|9xsgY4N`_{G zVK8%y{%a_S32YwF<26~r>wFncV}SlzE5z2$&dA){yyg90GoSfKWAQ12cGX8`<HyK| zXn-s9zST{F-M};!0*_Zqo9;!<g2DG1@>^z2V+)mOv<tN)SKlJY-<IBr#0^fG41^?b zu$f;zl6C|`7)b~SP?#=ZhjO2A^*kA1RxzbKSF>;6!ooY-4At(S=Yx5n<c7b-@LR}9 zTEvbg)>3Y6>5`@0Xp0TQLa8giC7&s=Y~Eif$yX1?Yq2?+9pQ|?!&u0rgPpTLu)pL# z`~Y*{Kr)z_!8E>#C4dh+ByaE7<NTnnD|Bki);Om~zT9D6_o@C*(7J3pq=dQMeK<bE z+P5fyyP~FJz+0}kE0|Ysy4n+DYi|#0*ht03z5}?F69I2EZ;nTwg91MAGGLl(+*puo z?D0bs34cgvb&rgMMsYHYvv4(mZ8+jzvcPCe!D*=`Pv6J^w>^47FkY2A-<si6!1R@^ z=e3Y2!ru6Jq>Kw}#sl(G`+(q&j#vdtXHQq1FJkJr1#RudLlwA{<1Jl_`>w~LR-NfT zA@)n+j4<*xULz7}XlPuad`uhpOWy2~DPl$N!LgC#9v<W$3W<QUj%O(r*21UbzB3kH zoeNn|Tt!uh054s~H_$6}&7PL~dDr`=f^(l*^U2qEY}RI}x8bWC?Ch0-jbRPnV4Bb9 zeG6mSU*r1OOMO?Tf?Hr|CoC>EUFpO?r;ncije_1jUXWahZBIu9<iIi9XqqNtfbwT~ z%+RLnS*%h@E7kY;KYrxR>=4B+d6*mQFt?t+h#6@(@-U0Q^>7$I+dy{I+Y>S0S~4xJ zf&$Y#jyy*6Q5yfe28jc>e4*J_Vh)dya34rD9zRC*yOX`~Jnxxyozh-5?)Un07d_{A zkttaH^rX`{?$g)J3PMVft@cU90_=)W?!9JaWo4!O{NMd#R5si&PRLiacCj5xd+dI{ z2WeQN{H`(C<Al)Y`?%&5ndL*X;VUS$WWI5VdXBRsPQ;3)w!?l)E!*pa0B8(&JY|sZ zc5SM_4Rw1rk&S23o|F03M{$YAvb>sHyOP|KXRZ`)hiRz&{n_`t&yyZE{HT#f8Nnc& zgY2s@ai3nPL6WJbC)?BCHpYF^QA26)z-cT1?amWD71jiaTgtAFcT{o|?M+$)byz@8 z7}A97<OwUZ@&4M|?xy4R>c|4xqQ#{+)g}99$EUFQ>7@}oBp(YRm@D@kx~~5L#QmW5 z7JAJATEvpRW<>$XN0W-j#V?b;{87?KZNk&t>odB3h41VEBv+J*i?9hcL8iU*NGg$f zA&xENo_}kylh|f4$<DsLoMZSjKS}JFba;$s0U3;$|NYJ<dRWwc+<ir!XIRl($e;Cv zRir)hms5_I9{tRV1$G{Q=f@T6X_BmfCvl_Qa1&!T5M#9M6T@+oH<t+r1TuQboFL~D z62fPHY8bVt1${6)NQ|O&L%$)p>Ot4?PNGN>^w|QrE4ZCFq>h$Q_YPb>`ORP0mqS|$ zT72TYf#ZNj8lS`{oQgDdL|MlZOwa?jDRLw66I~J<WTu4-#Q1ySiSa!0=of`oPNT#5 zDH$A%89w<K8_Q2#7EE^Va7Az)Z$pgdlj#D|b$mnAFCX*ZtDt*+3zWn@gIcuPo!t<= zvd7%2fpQg`y+BTP7WwTsC4v=kX!g5NnfJKsL9630$9gDVmTYB&JVtz<xq=6A8wRBY z(489d0GP54`fch<kfa(;iv%8lL=TF6a<ko0#gs{cXpJ#4n~>JM@MO7=Q~g&|#(=qI zDl2-~z7arrX?g@~zehejqh*5R$Z(6zm!da)9lt<eq>`r=^|Dpva#hZLZ#%uiXsXZ` zbDty*Y0Fb#9vzc&{){+<jIQ%k{FsNcZUHwWgcDT2nONAcLol9E<yoR}HMXoPAt}nu z$WQiSG=3Bp*huW_@<!gA!^>8U-4$(=$3U#uXO6?jGs%CnAcn@8E{~BWT{C2F{8S}z zj=*ByCbPCVI%v!Lb_!4kKqp`~x~DJLu`0<Zw*RFtCU`J$du3k^7A`cB(()~@{uZ>x zcN$FJTZnT~@VO&m`r7_%MDid<Noya1QN3H>_QFH^`~mT1BBn834gp|km--SS2>#Dl z`&XO~0B?X`Y@ODD?w1N8Of4Z&eGk0lJ0b#E#z$}G6m><^)PJ~_5?u)Kc09<Crl7uK zhp9~|7Gc!6J#M(kew^eM8{e{FW#e}9lJD(d(Lu6ZoF+hGLXk~7F{t{1DY09rQu;8S zX+CJ=ia82|=4Fg-waHPLeKwXWO)qR+M?%tXA<IVosxG9m#2`y5#@YHdtDZ#TDbp4t z=Iyu`LOt+#&rOC1Ko{pgK`^jFY4gZ%Tu@LD<x~3A!omV()A*q+igN15A57n7rw{TC z4p$A7)i`!`bzyPgm?s}>m+l0I7PV+fTT}%C7qg_LguwZXaeoF4IEh-?c%DQYbkuN* z(t>&9T53XJ0cs=y$w#%yh(<sX7(%l5V068uTectWUYJJkB>wn`B@BTX57~04De$S@ zAk4O2A?F()d-JSqi+AJUo|Xks<11D6j~(^sWCmI3N{W$rMfqH~q#1b=1jzdJknTMS z8krW?11FOl@p6t#jCiD&-9wP=+qZ)ijs~+hB#!KB?*kxyY(Dx7`e}oksox;mP_Q(% zV-tdEaUJF@WWD=D{<XO}#=Ke7>fYGn!`=Z$ogUQ-JwH_mJ4%P7SA|<cZFXZ&&)RKH z0tkKn;rQd%lXLh3Y$clv`EgjcmWV5@BQ<=-L+JYR;n8s}ts6J5jAJP~j;!M;%$09U zo?V&M7cBD)I@N*?T11z=CgT}y3}aejMCon3i((y0-jMY9$+S-&Lk&p}u@vLVG9|=V zIC|BjA{B65v*Afaj2g!VG9}=r-WtW>@%^3W$}FMNALN}B8EpR>&CB<9Iu!4Xcgo`m z*Umfl=r$#SbLAse2d!44NuBr-Mj@~_ikB$LRgX@c{b2X|?eAOXh<PKAKRC;@Uo&%% zuUEz6WB*q464h-%UM&777wQ~;TaIUW6Cc^mh1+z3kn`om_cnVL!h5Q@W3JJkEn#$G zlO!hCYCB1J<hg;YIcy(n4_Zd`DlKX(DpuPGQ2iT)^&=*ixH_xsgIIs+f}+2paH2{C zc}r-O1edpA-cX7DwvQk1$x5r2op>!2<PMx;dN)r!t65%U;@EdNf&%neFv-AS{iUuY z<}o*-%iEktIe^VPG!2i4!^O9t`^7P_V<BA7aI=~DtuFn#!a5v34>^w|nM%!@yA;x= z0+Q;b$HBP-36aHCvG%K^Th!<$dr&?nLF%@LKlRiNplCas=16*(jjxHR1109^ZvL9j z#RE9se1Aneudc@59bzxdvpR&hM18$7@3dy^VXE(C$lv&LS*oy`%9!V(@4F}Oz&rbS zxDp(C%c_uo-&+kEY4=g|0@lZhg%lEoBKh7YKYj8j!@JoWYyWVe*gw5?$=b=^b#u^{ z>lTnp#KfO?S7E&SfzZ}$opt{Ehz4XMH`tr7j<|2l7piq9OU%vqvJqIh?2rM;t)cop znNo3lRo!)DC18#(SBWaPIk#*Jp}q@mGq45wH+MU!xH4>(W}?aJ3T$-5?p=TJAxtW% z`Mj9#Htdc%A~>A-e%l|*kNs}mL2t&^)_`@{G{Is#$fTJqEe>uT$>UItLy7Cy#_L_> z0_9Q6Y}!j;ds^xo7#xx`qIS8ye<gC!wBromg7Qh{wC;^CeqOn_24giowkSgGFIr*e zPDR*2NSe&AM%X1XfJzz5EV5bTnK<69paX<If9%*ZN?0EFyFEtOQd<HM0|#o;YUA&2 z?%+K*&RX*f<<!E;=)SEEq@o7A`50NvCxMb)e~wV!s$t1}O-I=Pq?Ckh;c}$n0+0#3 zOV0X%m)M!hA~**jr*o7s@I$zV!5f|*Urg17TP$B7gf@6ugfbX_q(TjgUdw-{FDQhJ zVX%ajyqB!^)$P<rd_m5(8|00#-o-VF(5Nu+2+dz&{3G~ChbGu0^C;lB7_~tHimhj} zA17i;LEs*GnR3)W%7K55|3D4Q20ay;XtuN*ao~ryNOa^wd(l;#wis2><Gg{Ol+_A| zihJw*gH5m$6f4Nv<>zcVmT6KJ4{(wRJMz1dF5s_KpP7HxFg2yDs;Vj<;ge%R1yD~1 zDnotC1QYx>(q@{+ll)L>D%jXl&+61nFymB!+EQ+&OtVOaVxBEA>%7foM^hp{3PLNb zJ2xPo4Xlu}n5W-?(YDK$W5s1E4ry0RBf93owiQ5BB`nmcBMP40=KLcGpBhV>)5Z|$ zd=&Gy`wqMnn(l=k+?c$YTdz_jxkgM$nqICqHJKz|bdTM!UpBBw7qC&Ej-<V5mJ;+~ z9Oo2`W<l&)l)B_5G)(fq?W^K<3M%^ud0D82>dHPbza$53Wo{Z*=X(f-vQ26WeNGRS zS~-}-jTsEzb+_^$F_x5Vk@qK-<5y;1;O-h1RjwtGB4x__#w5<zpX#FR?vZbOlv($A zP#VAKrXFYK={0DIGWs!-UzkAeq(Qm2P6DG?@fBp*8Y0<!llis1v8z0w*`HSoz~4!G z^-8SAG-7;8A~hrY_AQ6#_;mmF#RPT8h<Paa-d+7LGLOijl)zeV^{<Bg5w0=PuD&HQ z%(jwFWDmPfY276Z<U{qjVEdRF7i5ozw?4NI>-X?I+a#Pz!1H>^?MN_&wc9u$!%)|F zG9Nt9M<C%Pq^E`A*dd~IuOhw$7c_-@9Hjg0bkN$OLmx-F{#$NdjlRf|(MD86aO%ru z5!^l-6Q|b_Jsx;_cX*#y`6^#pRkqn1eqeQ(@-53?AU+RI;$>G4VzK6~?}f7HeK>f} zY+Sq3Dm0^;_!3*$#T}{69Q<W_->6&>kab+d7L;Cthl-JodGcbea8D_RVoZ6FcEu`U ztWEcY#@_Dzjbq}lM7mU-Fr$2L=7mLJvpLOF;1U7JnA?eH{qX#6)MWVqKT9Vu#h&-; zA(v}>i4WT<Uh4N~Izk<O;+V-8&S~hU17xSKbn~%RrtuyWE0sAjnnai$F($fP$Ml>s z={;GxUdZ<HFzS)(HGJz<%1?IN03K(38c%JLwI8_U6t5d~G$f_WxG$PeApw7Zj*pP} z;LM5SvJukW(oUVIRG0PhmWNX6$Z~>ho*Gv!Jg6fA15MK38b`jvGgn_-E025!Mnu=; z6FTecxZVn=lDrMhL(`PmP<L(g2{Dtcjaqw4JEm%6g_Lt$O#+-J|8h?nIA6zINgqrD z7@-D0em34q&{@0h5KU)zRHD@zp7V2@b8dZBj#9KMsiooy&nTxWm_xKAVC@a;?64M7 zvA`AKol($H!&7ss!`$2s;*sgax=`)C*cla62|wTOix82EQge&J3Uog$x=>Xa6ZmE{ z`c0eb2A>hZi>spvO;zKUz{XY-;7>n*jvP{uQcz8bP<6XKURKA*qYMnEfkfgf10RhC zDkclnGyd3RXXN{yPJ7>q`4pM%`rqMN<O|Iz3Hz3Z$Gv#f!6SR)@9lrbW5H<uJHI?- z>9?Wk+zWTCDW@s$*l&xB{QSW24`XSKe9Aro@Y%7L>=#NC#ilz64+-aW>NCZKL8-U8 zvv%BdQ3t0q`FT0NUE}Qx*=DCzJah_o^B8|;Hzy|kp$kGrrlBiNuND;#keJb6QtVRF z!8&+(T6`Jl`8zAap9)5ERU=YD(TLIMnI9&HvI`)%dtT7t037<M1f|tkADi~V3nQ>` z;qcJPo!~UJWBJ@d{O(S>aK|&_v4F+`b9B5=oN>+s-^!r$luYXd;*3p0!U&NUw;Kys z)v$-N_-&{##VtQF0?+&op6Uc3%DQ-xsR^MY;-#7grJAXDIn&wM*@pM#rp9OBVwi(a zM=9k=w7Np#55C&n?ZLPR%uACUaROqh1dMeZNLSv0Y3&75ao}AbUxP2V;Lo)$d|(2~ zhrCH6)IBv^j;2c2tBE;&lgn4uMvsKI<2z{Bt>`OiX(C(1<|5UgHP^ylXYyvptasaI zGxRz$1C48D%x^P^-mf=~^9-N;Wcq1$T0m2%Ix3KEHhP?=FL$YiZa-OkUPBdy;THGG z(c2)P<7>NJTvXxsDE(RzN9455y}g4csOV{Tsy&w%ci%QArz$cEe|19KPZcLl>0`H^ zn_~;%HgTw+M3chwSB*aB@plbh9M%b&KfQ0w$-^H{lBf9-oR4x&c36tROSXQ^A}wtf zhP$1?xT(@2OV@|vtv-=ytZ5xTX=ezrgMSFWoyc^-c!*q=mxgykTRgq&CmpKjY1n^a zY=0sU*KrrK+1*e7-54T+-hxaS`C#yk6J3x)F*Gd-ussk(ot0JY-<?WYU)2(J<d9rF z_nSFf_cwHbj%Djlq9wL*sa{CeG!UK3--ifddPkc|?aik@=p6^EV$yVA+x`ipeCf_d z`M6*pM@>i~02TQ3zOOD+i>WD3vvsduS3<=YxA<VA&8zJ*Ipt2!)|k(M8fKeMrl=5@ zMdTaQ)U~@r&!jP(pz{j%XhpckJY=(JSaW~Rf?Pn%Z7iU=6BB{p&*-IV=HZc1Z41(c zkU+ud=hGu)XCk-gRmTQqifn_Ooi2)g_m5bv`W-V7Qm5ikwmbN(u>T5RBX>L4=^M$^ z?aqcv%l(b?>3zMwheaaHqrQlOuh4V$*W*v^GOfcz7bAz294R{(i&0&5QkD16Z|$1= z3p&5IRr+Mq-72EuJoZUl3yw+7k0lXFYskN%Gv)mw;8&aT!C8YP(VuLxDgl*CGL!Z$ zEOL)?Cu2!60hCz%Lj(bHC?h<jT<U?4n8qNlKkf02B*MdT=ljR4f%zVX6qCR056XE# zl*X)Ow8(o?qxP{qeGw}8k7T5U=lXJ;HHV(%S7du++B8b|%>2kef0q}UhL~c9=Fx?K zC0T%DLt`3~F%FgZo9vUG_^Wje8!pK&tLHeK#5L=MSeG+%kj~)~+`SfA%8I&oQ<;I| zLMXoZynTFsdh0itW@hVF49rK`)pTYE)r3LC-%D2eqL)e|wCm|JYD-PAk`4|ucWeTD z2ON|~l&23cFDg-cFXR-w{dr~c(PpL2sd$@pcS4GN^Lo^E?=~ekC9p75jMKfosPNwk zpcYUhvfa-x@t<+_yfsJU)x|Dp_jZhd8_}k#pBkz5ts=VhRtC~BCP>cK*>Q)tWH2bF zR;VsfDKGiC)7@s3yR%g4|0ZMnRwbynz2_*t@#|4@Pq}JCW&dahOW)oTvazCXldeWd zi81aPWYJgGRtFjRYV=@QPB53Z57<;VR{!wUyT57$Bl*(_TUwEBV5aXYrZ9zCuX6M& z<K6p+aoNw|m#{!Ns_4V!i=@+cT-J4GY;K0qFgsLcelvG)ZCV|{U_&)4G#@AVbyU6N z0N6h(%6sE-r@rM;U$ztMyx*+c7s~X?OU2FWB}E4pdexXs8u!~Mz^8JfMTM}SQx!FY zTk2QWKLx_ycrkS?*}*#DI+}I&k_y*F+oNMCgQssh&xEk^FPh@SmMrXC$6Z+O_q7^y zC(l%UCIYiQQ#5UJI^G4|&i|Y*lXEe58ZY^rZe1^bpQCv5wVOTJHpkF-y)7icL$hj= z3W<?u675%(APD6vb@hihwV{i*<U|e`3!%T6VuJEQZEhWY?=)Zx4~Ny(GIftx^6J}$ zQWRwQYM<zZzAuJ@#N~biPaTE)c^lHdr;1WLdtXPuX0Fh)^$=eA^(knUAY&FULfG~z zCWl|7&C@1l(lAyOmu2B9+l89#G#IbZ>3othn$#EE^BPoTA#e6X=t=CcNLpp6G$XUK ztSPBsiD^jCViKKFjJy5TC>hW>ZHJ+6he}zXDIJR0QG`@QS^d8N!$3U0nd6%@Hrwf} zy2*`ApR?<|nYi1$&vY9%KAOFbFSZ5|R?tql(Y$5a&|69Ug)KyHwr7<kK1lwz-0FWK zHuTFk2$UEUH>kRMnjJyMSh{lu-z}WWcCQt9tPW(ge*t&Jc-8*q2AA|KTOc`st605o z7SrFh;q7;4V8475Ya(j+C9aUWC+CrN!k#_XBG?=e%jqw^;<)Jd3K8S%SFXoV_}RCq zDw_MOD|C7WTJtCj+{jJgPoct}ZU}$sl<n5YP|`Mw-9%sPrDt_T%vtV@y<aNZ68os{ z(LH9o8z#*UI{HPt$@kyLtz)aXoEFRZ>(@B^)mLnqGlzM$w#-|#S-@i{VIqEZ3_T@& zO3w^CyWr~Tij$)=E5G@cV`&Yf^cv{VJ`$(HH_LH))jT_F=YN9T=97GK;1s9!f5N4J zZ3Nz_Cbrdpa#DTj?h5L{o+p0jWqG-I^I`mx=3r?qo&v8wr%Zv@<6nPW@TwKy6*-rV z(|<=B_L>Et-h6Sn__|rHxHFO#Ccvwa2c!47Z>mRMzKQ<C=_q1E!XN%$^aTAE{b%2& z@5E+QQITjHY8X)^^FT45@xs@+AM-Yv$ggQj%0yY+Cnnf#8O#_}TAmFX1x*P<w^q}4 z){CK_gBTJMdC=4IP(kBr5Ot%iK@g1iJ7NYr=~=S}os19OWxV7J56Uhxs)rGg(2sO4 zVx(pcBZXHPt?T0c1C;<Zoq)#??rU_Q>l9TFSuMa=-%bo=Gtk|5Q$DWVBpqKLzlGk$ z76!EAJP_AQbzu^1(U0*!)bqe#6qS`R-hPe;x8|XV`JA?*0y?^kqMkm{ZqY}RwV$HF zx^i@>-l)T+Etrz7-*`Fu$nutKW69Q%%_ZAE4ZJEUD&$j?B!79?iR0k}qLJ@Fca&Wx zcB2c2Kbz0?h&)bKnP?xjK13`{?vFg2Uz|X|*8v<`6GNKt1*NfDfL9o0w+^yk(<x?s zeu$%omg9fWk<V8;Fy{kz-nChQ*WAM#ORgeQZIJIi%6GtZ!rx2dNk6oJ<11`fIM<#J zoSbm7dl!!d3z)kzgq@L<+-n?U$dVA~2OAiyh~Qp`NaDqJ=D%x)hqE(I4s-cH)U$Ab z569z6$r#YnrMG~Zwh={93{m@5^8J!oEb$cIcX7tW>3uvFuVm5oYwU?=rL;|L(T`TR zRyhM1CrSKiH6Jfqz&o~1I10dX@>syTb9b^}XCxu_8mSNonM(I80M>}|N*GA@A>sH6 z7KlX6<^yLOoCJ7T%lq~cA$dw_``Sce7cTVa$GlHZ<FYo6_{wh726HmmT_Y0vo%Z;y zv1g5696J*<)bvQ7iNswUM`iqJyq*2{Y(W?aH7!(jW|6SRk$^Qee7|KgpKsoW=i(J2 z`I(K!Y#U}fxnZ;7G)_kgNUiOEw%_Q5-L(C5R;G}4_A`E3H<Ohj(Q$Be#A(hu%wM{k zua2g2Dr1lajfURlWYTv#a6;7o#hTA?UHOgBqbp0lTF>6wbzE17#J#TuWkDF1_AKMu z#lk*bE~0(*IDcTn+=UBRaXcQM^Z`mbb!g=_Xea4&xzMLOHnSG+k^LrCEZNHb?JL>w zoi{VQ{h4>@4rz@87VuIDU{56d<j4H9`W==naKu*loAYFUi>Tyo!w^H3#Iv_Hk<=gT zIJ@R;zT2|pG5QmAukgp^L=Ja5>gaBa=hmjr*e$@zbuxHuyGfFwgDPbj@!x;QId5Bh zuNH8&!ARTSF#4uDlwbIfpzVuUy4aIhLPyT-Zn)UHGTX)xuX$V8akZGso#w>as1%SL z?8!}EGkEP5;8ol6aHYa(FB!brCGgtC<}W>%IYVlb5ZjNLu_l6zzr;~<=P0@HzSw>f zz^ol9#MSg#ZjPwvd0u_VTe<Y~*C$V`c=_BaCaB4Lc!Z%>%nupQW3RiUHxCLJ>O|KX zO-amm>|42nrL&yy6p6cwvj<M^FJ$q`y==c)MnsE&w&CB7zh8sb7wmp-1|BvxOtYE8 zv>9KqWbJtZb2}*38c_|_(3Ts@rSBH7bM7=2csOI{<bcy;|H~MnL_mU3qrli0Na3~3 zxUTcY#(6Qz1=Ote{1lfp=UF4b>z)8t?ISmSCWF@+3wXUV8NA|)xOaL1$$lTQ_4H9b zKjhD$<)3rVaSkgT-es1%m+-S=cpc6nsj3gHW$RpTO*|<(-si0BPx-PxDTno_>(j_S zvx1-3Oygr=H#^}^uFkeN%wNviU!7&esT{Hz`X_FJ{Z@bG6~nHY1X8}Y<;*8G>^R`V zy8UO_^6}@ab(qZp+qZF9uo%xBm-+5uGli|z_^C#tETKF3CvG48nq^Dp^NyV>4z3=! zJKEwn-3Ish^I35=lcNO&YWppqtZx=^`ZAZkU(8OgcUa(Ri`{}{IDhj!^S@cks`)l- zT<y%ZEBTyjFwi33AQ6y0SV2>67?Hc56+g6Se&@Vt6=@EZ=3;41o&v8wpG<+*<6l$Y zC4<-BEs4F5i!Uk`@VaQnNYoxiGt+pW9z)tl_+WI9(Vi%@B{S)`_6kM5|3StN|3T&t zuaJLWCUqAU(sOG*#yA@uT>XHtplujpZZOm;ZFOm9RJ&L3$Xp)W^<q449}GzVG{*hD zyO_$3qLmKT5CAihpTPZ&E&)74+}GtYTCjnUxGx#I70FnB4P!bZqYvr?zwH#CEn)P= zc1BaLFfuU4h@pj%j`@sKf5b>ZB%?JQ0vaC(@KOs{y32jVFN|e<#{IiLGTzrKGtu}+ zKKI*vG2Q+EL&Plf*AJm9xQkA$#yHx-gRY&7SFGWF>NW1?wh4WRYcL4#%3-`&v?=x! zhMUo7x_ZRK*1(8zw*W!W&y2aEpZggf5Fjal<w18iqou1DxiM>!o?p;D7Q0F|eo^p} z-m^{sI-TytM7l<vSo?$&(3o+aWAi^_i`Q0;$5nBAz(luvjIl`CtO=a_?2t~pHz*&I zEp26MtmvRyI$B<*6yOy}Y4j!mPENezzJiT`*9AmWaj&v~ySIV}UgO4&W%Kd!xz76d zZYrb%Q6m7ODqJKY-|?068s>ZK;#f=y@m2RI&JQB~{7yE_UBH^9QoHI&889%Q@1wu= zCW%{@aAd(;ymth#IXIuhoN9`N-^B0s;Fy@0=YJc-*B5HZ?-KRsL_H<`+>PGDX9ogV zdiWMslXI!5%%Q3#mc-~F_PQNo-;#?Y6?dQzNxfb#05d0wuvMGI`#U%o63@B3a<a?w zxDyvl(5AWUT(gt~M{cntUOJLm{abrj^sLuQwyHpJFOcxBocM0O2WyVTusflOwBiDC z5`qcdJeM77ma*WcWOk&9<YOR*uDq-Gdi}z8^DdGs+SMs1NF8+4-Q?1bU+~?UFIn?L z96v^NQ{O3lro_;Bk>Zq7c<qeA<6tg%$_|E<8QeYOCO~<*NDTMlx$71|Nre;?rBD;U zm#8DF`N(+#GnSv>bXGIvI=#@d)NY+D*8WT+WCIEerNQK0_2F~hb1XZ0gR3cd)RbmY zo#)T(ARjh*9AnEDF{CuKQPq`2`a!Aw_p#k@LS7w;O1wv1UA??bvaPM2j)W~Foc@@l z-~Yry-#D(O6;W4|OkLbAE+1PhlC<w|T6KYQIUQ8X?W&?PH;@QfpYE(Vc9~uAbwW=y z6eVBc=8x{|^S0xC?_+rS=8@VWY-;Qh{uV}l)Ly>Ye1Ii8&JhxyO<uVGo;=}i!4`iL zAaLYXEs1^R6^@~%WbPhtmG$SmX5SO^w~_Z&oZ)Ov6J@G)Ix3^NckTdN?4+%Rew@6R zM|!)6?IsPKjVYx5XwUhLZus6RBe+IQU(-$MV|`fdwG9u?gB-n_#O>ND@~UddONb_J zw+qL__r3hCvHDgY)hYpzT_q^2;1!(A?sOfs-4DS_r?ZT6oyNS?P?1Axst*@WZpQKR z{n&20L_m5AHHvzSbpaIK^2K#yAof3GkXSz~67m<<*MI<lp@w9#_Bs>1#S7otr34G` z>Kdx0CqIzLub*ZwduDq7B>I>`rm~N|o_vbVea_`QOF0;L6~9|Gq~umnnUhFO>^`D{ z_TqLtnI(}e6txXMGXBi|E8Seu4oh1NQ^~z}5?{y9*=)O!{Q)UNR`ydfY+|6hj?RRw z#2s0{QtzG2+bqUoLJkGRsZ_=9CPw(5$NX<`UL8SDVGs419*nJFltyi3u7@}8xNPT# zz*}6-t0l9%jp`QBcFUG(-K14-dCRBz;a0;_k8Cw;YbvEt%)2q0rZLZHBkn6g2)uDm z_`p3X3qr)W+Q}L>FP6>Uz@h6^BnSxX7y2HoOO&6f3!LyLt?;LK8q$AZ{SQa^_}f6j z;xa@z#gtYFsJ(TG(;Iejbh{sy@*2p|2zZlk99hS^*>|kqC2bwemd5Wq0a-J@!TsYP z&cxm&t16qa`~c#D_OZch7v3v^xhTeGl^j0{QDg;k`s1~1^V-awpxXrGR+Cv$O=;#0 zasyWrwEqh{wuiCobU9fH>1K+EUsXZmT>O!hYxm)`;T%D??~q@XO?CDeuKu!$dG<EU zbe+rEi-m+sD_)YX_twy#w3)bHma*h%@#Cv70`DoP&_6!DJ+D~(OqzqI!0XQ|Q{eUZ z*93U|<qp@7z$?Owj#ICo4gH%XssHCo$UlU<#z@3_LRK<*{V)&eG8oqkAk)`a9}jxJ zLsjHR=>;z`f1XG7DR=VEzE5q?f6x)~Ukr!*H-->5MnXdvNo&F+7{xSRj<LoG?d`ua zaQ46G3vr;oqyY8MxPYP|#s{xrxIGK)g&7!=LIp52aDS|svEkbo1rQk{{)s8#fPkYM zMuydx#_}-L*kek1O}zgVBR8*N>Xx1zsu$qn#Yp7`0^kJbR4Ew~_1}Nc&4a;H+%FTK zT@w9^c4V}!Sb&}AlTpQZ?-fRG+se<QX)|u4Z4!_<B4ACQEFkJ50ezBA)(dF5!C3E* zXtQ2im&tfjETdOr1sF<YskuL1h^bPPapP~OL_d3jX3>`&#c+L&0L3$mSFdLDrU0*q z*Ua)#HhNvQv1Dt>=FbAJ^73-|6ea1s7Y43J#Gn(2l_rJS#MAufuoZ9Tql9HQQ)n=W zgwtf6n0^IphTlB5Ac<+X4O43bC6V8-VD@`Vv;Tz6*PFPdu^c9#DxfJ~0sb2ud3Wmt zoX)k9uN0G)sv2$bM&kA_!rA!{E?=h--)uciu9bnpKmr#}W4(hNtNibBw8B8UzMii9 z5Y9R{v+>=<YzizSP+>$RA3NQGA@ytG4>{tp=trD3#dD)(80BCi%H-`NoL$Q--((!a z2dN#hZpqT1QIrw)O(+qoqsXr4rdhz9zW+Mq*Zf%TxP?#V{=&tg0h+82X%Cj73|>aa zRu`sk3dR0Z4R;$=Pu8=x6N4&|%J>6pbarO3%hw!=Zzk1xAc3lo*1*LCu6N{}Rp+q( zsgT^hdV0iIjasye(_X$@yW32OyhXE?j)t3r{OrfhZ+zIWIfml_WmLCI33fAvVqbD% zcd_VPCLhOkQKM30Y)hxW$AhEZv-!yTEDL|BrJ&Dp=zuYimiR-gvh&8-{zv>0Ye-WY z=n{$8lM)W;PIm8AZ?2#C64zsCEWM(kZbF|m^p?cozbb$u-j~Q~R8ZNOO@^;KKY2Sc zXLl?gUr|vvX-lWJF@tiS*_>VX0ggWLtc*9&GI3mXCW;h4yxkV#>bi*o3H78ZHK>)T zG$ib2v&-Z3SwO?N<(ymV%pC9IxclUirqBpKs6u&jJ=gtK;<P1_dA~GKG;wO2lA+QN zf|pHatBXCGLUTFOApA`vw%V2yau2ybQGd-7`rD0fVheXV#b=#`bmd;+kn1sa&W#|o zwogEp<v97;WHNR;6C{C2Tsfh_NBbMEQGfdc-k%5X*(ULM`=rAjv`rXptl*ZPGavaz zi1DMKs7s8K9syn<kAj!=j=W?uk^E~d03eN1eYa@W1?p0dGk51DTn`m;uTyGMukeu& zif{Vjxj6{uy_uvm51~{EecgC5eJO>$G|d+9+G^=vqmF)M8cm7&+42l~&G!BoPrrL) zb#~CvnnL1^5Aa{>gl|eM;e#fI<fGK3XQkp$ltu7OXf|I*Hd3Y-dIY?*W`NM@<?W9q zQ>PeDsa){d$#K_%T)Njzp27TkSB93mH2h*m$cA@u-W14^z*Y)XCi&nBqcN4{ghPDg zya-39P5gMXjzncIy5<X1UfRimkG%Q7^(d$Ey5%j4)&oi86{JVwz{KGim2`>uHubnG zJ1^yMsK6v2ykZ(Cr7LP75$mQg`@JpLe{!4HCZSI`wl$+F48VWEyKHoHV(Wzh&I$17 z5c(djPm)&{gSN~Spj$y`Q6GavXDPYngYEhYe7LuWyIqqGnHXrI_T0~;|NJwzN*c); zGRV(a{U&b7&*VuEm&#o~PmV5_!JPNL#cOpU@ht}VIWnW6iGhNP_%HgDogN!FENva` zR?|O}Putx{POkD1Kpo7@iouEaDW9%ceS(6BtvGw1#`cGF5}Sm-4OWZsxq(|pKE-3_ zMHcxtQ7~Zf5p6Q9ao@AXYdW^B^I3nXn20tbodzTN=1eL?{P36JhwoG3hsy>I#8;A_ zGSK;${=TS4bFefQOLOuRc>Vcg3cMcwlE6zk)$srP^}s7jB;lTB@Ctdw3{a6mB3@K1 zKoIeUkQt0#n$3e)Cmv*f$5=}pW9kQtkM%M(qL2?N80u9r+$W^<GU~h;sBZm@ZUJAt z7v`c*zs>#TKEZ1mMg|fY3Vn~(@Bc3aLNfMGBO~e(rDfvU(O&Kgz%pF7MHezlfR_NK zx<(6l#bb)M6X5lZ04zU767ps68W}6VROf~%MQZEUjNFQO2wv@;0=xv=<cA6HYG=$i zF3PH6tZfye_x@o9ugmU?lw=5q8WsT6#(4Kd0Yo2Sxa^F!<Su$K5!}~QG2VHOv1Hqa zI=S%;BaJnTsx^#je+^#a0=yoGc8%nJNKfd0Q?%#*k}mq1e&l^hf?QBtx97fq%hBjJ zC+YbG?IYP#*jBQ!8N57Y+dm1sB%iW^m-K(@1fUhk)eDJqjSOA_2sEkGCIzzFX+Im? z&k>v7O1(%%1|{&4%Aa(dxxU}RmuXlbz$=uZh;Nzup*J779OLZ0HmbzLr<W6o8r1RI zxOMVt?Dk&6?Yx4*PLU+_l+kr*F}Ho(SnYe2O;O#Hbw5lH)FL4-IqblhZ)W3qAePUr zG*Z`jhpxL}9ChBoHmAdcXEjkMCT6uf$%@3XE1L4Fd)e&1kxv(#An0Bf1zpW3leUxO z?`;OJFx4dRGCvP9Sl3Rs0Q<gS14F7tbOlGrIKP#-U!G#__ZeigP5yp2#@dq<T>cK% z?V&gvyeAUto`;jN)|~KatqF|KkD*O~>1`htulB`lQxsRrx<w*xNh;Khn2HaRapoHw zL{d2W^UK_96v<IrCO5Y(B=D<`Ihk0=)lP#*X!7W8xkbp01oj=d#>us3xh!;7*fvbF z0NIw9kI6W@m|ZvW@GCW-kdkfz4mk&0`Ni9bPyBAO?e-wmGB`*HX%%e(5RSX8XS?Gr z{F7=)(^$bvD~ndElf|0Y_BCWuaBMCSKh9@+bUug6jI^q)x*0;J>Y}B*l_oJ>RpS30 z&1q!qcjdIVGoSvP$o3Q+_5D`=>7lbEhL{zzIq2!mmdJ8WD@+Vb{7|W=yE%cIJ3KhP zcBufHYNDEl8ElTGS|r3v*E~U=g~EOzJ8)eeD10Z2^tN7<9rq|WK3@RAT)sS&&i5Hc z+9sdw)?GmDNf$1E=g9WZbbRv-wCY8I*_!&C`rCtlatqm=LRX#lXv+*|zl$H+JVS{q z?V!y9UaGoeOQLMqiq~MIy{{X6Z!5L6z0|bmA2~|B6JyQ~+zAnI=W8B6GI(`AZpG^% zcukC3%b@}$wRD3dgtB-)Jhz48vhN-lt<veE!k-nv6x|ZwwIxKnpFz5!=MjBnJh#3y z!r!uG@G^rySgo*EQ#3V+KF?(@w}Y8vDkbnrCTYhk0@ga3!AoTYFSDN+4PDf>_fpY1 zD8_|$0=gc?I`hhn$uunAlu?$(5#qTGKj(dfr8jfO66b~+Qpr2yNXS+vwufhMxX?tS z<j=Cby67&wLewT#_I$RGjUjoQ%4wsoI+W_D9|d^rV2)b=p@m8sjg~_#<ma1y-ImGV zrEV*xRRD9Gp9|YWef#d2pMf(9knXrJkBDzS<U=v8U5-_9SD~|v12qHHw}{_n$H}kV z<WptOx0u08-DCw_p>F{ep+)^Nc$LQbGUuBxKG<FGYw(huo$G96sI`f%fg!pCgbZsZ z#VyNtw}O|n;&n%i-(OZa@X4;rY>DptRh%Af%%<@0d@k&m$IkFfj^t@*?Cr%c*ny(9 zgXRVm!;?;1H3{39y27au<JU`ozT=*BQd`CN6l13F#C#&Z7v)4`3p*HTl%E|m%CWtt zG=|Gt?eSUT#h%y_LKQ~34E^+%$8dG!bHoqth4_lO{enWo#i7aZ?Zw0z=cPH=3SQFO zJOy5VE|~(a$G@z{$^SLM>w-HSC;t;|@GF+2{{Mdou>iq^zcCX2Du$p}7&!f(41`U` zko5~=^@WW0wScx0^zAS*Xzs{}lJTzX=!@Q==gKSeT=hU#lFa>nwfJzD2mSX@M{Pji zXHU^j4rB$bBlC75WmTQ1A80|B&PcK&hD#q{O1&V!tH}ah378TbF<zLC>B12KUIiBL zD#TRpDZuL=j{z?aMk?NCBu@e_1^2}Sbl;f6Xt{VlPV_NS^ex7Vk%B}<mCcMB8U=WX zI&Zv>@ro<Dx>AgTBitX%W4!qYW7qA>`jF(hJErPFMnu2HRd>Ya;<~FR#kEnQj84V{ ztc_J}r9Z(*z?K)8r##3y`w>L}Z=v*m1$E#n7{mVdJM3e&kz`}Z){@Pi1YVL@!Ap9W zx3917#evHr8jHv)F&6OJC4*N0*YaDaGnfxWuujApjYbx&Wm0~01;jYig0Urt!YGlr zxgW-UnV1O6JLs{3S6>6BJNrow-;Rs#Ej)u;Dee-9i87Cx(;{)(<H*(v863zl($x2G zg4T6Z(i^j!SU*o@`(DP~zksTmYqX~Xu*3N<tG&XxEnvT0)FFeHe2jM~Eq5b0>avcl zj=MRN(n4x?4_$>p6kIvL>Lcg*<mX#lOSwx$Nil_a1(a6TqtIC&&^O2@f$7qAk$B<@ zoWDB2N1GxDip!#?s+_{oO3HGRX-GLpjQ>t-SN@FsrrX@8=%8QdL?b0zlCC7Ng4aMJ zhKiHqT;7B8)(bf9&mp6+?_naO>%h<#L*+F;me2OZ!#$A8m2H&w<#G3<7ty=tu~#G- zr;1gy)n22cDw6YeD)GBez~#+;q#Zg%R%;jcl;z}}oJYdJd7Mov;bMn@Zt0G=NX+i+ zbLQN7H@1b{krSHce)De|nT)Npl_U`6xs@YMy9pNHm8vn{5!PxovS>6~S)}LGq-~QO z6*sxL!B!+<ZZbH83n*=~f|p_PvG<l|ernB$p<I7RHhv;OZ|Ji;d#7)rwIH1H?sn{$ z?#Py-F&s{<BPF+#^0FezYD&n83npUyOpdN~VP{M!X9|1hE|l)*@4;=`Z}n+Xw_|Dx zr!46xURy&2NTdsJR-$Z6CvBfAr@r`zuMPyUIiiU8tU{{F%P6gEAU8RNltZ@o?{r|r z&v9%??4V(|1HAyRyZc?9tv~0zgb07j>J;OoGn<ywVD>uuu*D;Y8wCoQr4#6cPWml} zPXurA;Lyzi&Nm5g)fvrOy9S#WQj}0rT1Y{D5rric6lUI{Fl+<ok8WW0z8lO7RZ!9` z{Isjs3|>AD!K-Ehye5rX%a%jaU<;<k^8&DZ@YoWJ^WJQd8`T0X1lY9-@Ve<^2Cw}> zU+piiFP+d=_P$?(Kwpvnuk4ln411+3y6NpLpeT4XR}Ox{k@K<qe6y0&yG4`~mysv* zSyiVpKSyPWLt5dZTFvBmWd;c8HwuknUQiU?;=IQee4O_XoZLXB-iS&+OmF2);x{{R z`fD%z;>rkbH~&nAwSB6VJCq!C=E627)&^v<H=&u%qF`#S`ZC|sSH!zZ#FVzn&)umd z8_PFeetSdAdc#Wk8Gy#~9^8=amcrg_Ghi4xi)at^BFfhu_rup%7Sm0cQaABK$bAjz z0)Siy-|ivCT_Hgh@EUG<WQDO-Lw{2oO_^udy#Fkp?1>~iA&Yxu#pcrlD{80}<F9k# z*)GvG-9x=ijCbi&LW73hTJwt9xsC2@i@e9tQX?&@hx*a9m(m{YM#2$0HU=i}U9yg< z9?KyVdIg&9a_TDzDatRTu&9iZoFr-!4sto*2OPc$!sB4N0Br^B&57LFV$bPS?(!B@ zs~xQU?{CT?_kar*w@WuHN(h#~OO)SL98QqObHtA|PVx%li3$;a`VB8Ve_BPFgQdB6 z3cUWDG6i0be@Wow^q2erWf{EOCV|)A&2r%-L`v?%US&i;g6h<NQt*?I6R$9MaSjh| z&F6mn62=mih`;j~%iPBO%6r`J>|$JB&)7g1+T8ciq}yUFyTw?C0F==&7&i%!>B89E zf~Kd1p@ANTH22Znw<zL%G2@lajAqPaBs+|e8UbFTmKCoAdjVeW{uaFI+$}3!(pJOE z7VxSQ;N>pB>pcs2iE>5;7!$ByOcUR?0+ay5k-{WKJ1pSU70&4OnF74rFf~;(Iylbw zU=iaj$GCsfb`p5a#Z*(o=zs)X5}2J}G**-qy`1|+sf>5_Fs|)jRIfy<>SDOJ7IjZN z{Uv*7IrlcLKfQwH{3{lKdKuf8<so>vJrlgj%F5(m-`m@3hA1&ns@3Wj6EUf(CGgUS zgkPOPO~Pq@aM;Qk=Oct<Hj*zAK>6rhjano!ldqNP(oF!x1bC^MFp7k(@R|UxH32wn zOCqkiiy;em8M|xIXY3&*WGl`Byu3mhDd`y$32i#L2VDr*;LJAxY3$3^Q`a-;nB?vn zv?<?`7`R^ELNfQvJ!<m<X^8b@nS(FRUZF%4DdZof9g@LICBu4aK`iIoH?iMo7lBE2 z^47UtwHRBKiDU+R#)%E@vvQ#m_71Mt&$eUv+HLq{w~!=&V?ato`s&bUA0+koBIdh0 zU^8tFvmIS<_w>Zw!xK+8C+4}li|s5sY-~1QyXXRuq8%+lCn^cNgswD_Xf3)D{m^Ca zC*|A*oWBXcd7nsl>w4t7<MPRIIx&{yEuZK3*3pM`p26HG>!wy+N6U>3WSm>a_g72V z8(&9dqObe|xc+%99Eocr;m|&EPVFVBsh-<46(sEYhU?$2Cp5c~TPo3Sk(jA0TanIh z@?f9z@O`a0aWWs4(nzaFNP|5#<7)vgX~j!E;$3UCzhrl5<wQErrA2%{lF$Wn@Np6e z(4|5`L;~0{WRSOj=`GLKJOnQ--6C;I-)*fwkFzxfnp9HKHzb3XqUa*wi(T1hV}tVt zcFc6~!pY48PY(|~ygYGn_>kG+GdpKD7M#lAP+~pxi3iCE-iZ5#bHCE3{Da;SU^E3$ zblbXuV*#&@Y_k0p^3x(4JRD{-ZH_yRF7BcpPdq&5;pSwE%eywrvJ-aQ5XF*<(ut5_ zjI^c+aCLdM{sedh%ityS)tN<8a*zyOn>_-#p5JO&5z*0ClSsyHCxSMM1o}pSymHYl z0c&qLO&7OuWxEq!3w<~^yW=YK;O^pp`|Nj^<GC1{%`q&yDB?hm8N8&!HLi;UesfR~ zyVEpOcj+u!gdfHQ$q%Ii1x#X`n(6~75P;<&Z7JN7Nm9d*052uR<{%1V1$b=^{sZ(S zftL$G5_lz45meMgYnm^2gEru{KHwSl5<s{oLq7grYwSm@%A_*+1OcC|WW!8*7CPC> zr<cyQ^JDF{M6z4@7_vM|sS|#xQU5kx>5T)z52d(plR#l73A}=m%-}VsZ>OUuk_!uM zh5ZD$NT-{MgkCZ9Fb)m1=F@o2o$Dg$-xQq1zJw+LUO`mH`!a8>KaQduaaCOmN)Tc& z-*~Y?%;dOhJu-c;C7*^sj|sc&$u!a+t-yB_(kkp3>+8gtfCRQBsj2F+uK4K0II;q} z7<V@Wcs1+gt(`;i_?G-h0+J$v8U?UOhqWkjsk(WH@B^Rl>Bn=KZSRPK?Hm?<xrq&z z1Q1sl=o+$um*x?@N#k83A9&Fv{59R;uLnfE0rkTF2aS{TQ$%Zs2XTImqCW}d-;*2E zVHj#bo%uc4KfADgr7Mn(!k=Bmn09r-)A2p*To+)o^c0JarE{;lisqUtge|eN#FZjK zT8(mCk)Aa+pO$I<nSxNM|2GAAwMyXCPEXlIB9}Zz{BU$){_#`}+|^UlZ3W{OpFgcP zA*DH3nv115S(=-z^Yj#W{W)X`ydM8DgV%rnuWNrn@CtXO<HUcU4f<~jD7^Y|5-ub{ z`YkX!RF_;S3b&^q_+7fs|2IYn8iHOie@B*g8M*N@qs0PNjM7;dwU}yMFcr<hRDF|C z<q+dW=@>vQ_x0TZO4`BDfykg4AFgJ+uN-Y>IqHT`jD_zrdS@0RcLW4gHwy4-GJ{v5 z9meo?L|um`Z8a>kY&8@Bb79pZ;N>d7YX&2^5_nn5NyK#9U6k`GCaK+51)LQL@ak-` zfR}*1*cq6vxG>sWEg(?>uR<O)AHi^aHu@k-zps0uuPVaWr{=z@K!BMqW3m6h5d3$B zFaLl#I{{-?o#=B97^TBQgp7AH)|W=dtuJT`v_TvC_m{VgEPs=2EZJJJ`SXC6^f0d! z^j{dbCdsf6y{21CxFQM2IM31fpR(C=3rBBNaI;5GyL2kn<nIqle}{z#f9>n0t)!8b zQU#p@0^){SFf;^GcuOR1+d@QQl|fQX*94&Hx~kEp?II~?GtNFYe+ypgCGbjRZ<e%G zYSKRX&T2F%JI&zbGa0;m1bF!f@CxBlVJj^n=^C6k#6rMI{xt&JH?rUHM*<V8Nt3q6 zNuR3}Xp**(?JFIB?jn*mN9^t1W5J3~S^sk)XVd#A@6j>T+kht9hxDJ9Fn^&3HnXJD z2i=(K;f9Bs8*c9IxXqo1r`J~k%>3B?-E9)8J7|@`OVY=%1#m5Q-bMdq@bb5S*WN6W zYrD;>W7cQDG|3k5I>b7UU}8&pXcWLdRQwYqw|x2bQYkw^^T`X|O7*oLMKarte~yxS z0lUpdwU^x`=uQFWwjLsM$5F23HIOF~@IfK{wbsPR6W`k+VQbQh#7WYZ04ZI)(AN!1 zLb_Wdq&1|f^>nE97JEOmzfLDT$0mW-MZ!d)>LU_W3A}<^%;m`|WRq4L%qwIXx<%ra zw#)Hh{f%bulFQRJ&{`Bt*y5#Zwwb{^I|0N}vLtlu?k4msfrp0|Ui0R$V&g8hiG(pM zvkFDxe(s1w-bEzxPC}nall7@;#$Zk4H=DsLT>=TE86-|Dv0;&i1G8M_$_bieQ+FXA z0x0Irn~&F5J8<_)=7)rK8ixkaHmAxf3eVP`Na$0V$WjWOwP(>Nz-x~MykhfPXpmP# zMZ#7s?6J#ik3%<$IbW}*t-n<y^HD_qu$XV>O=E!oetXe27k2^sE{=HEzJsmTB5bx? zW?7^JUIH{ai)aawz{^Qa;CD&j)oHyWKlw(BMi%`*Bl`Mt6vUdr%SnJ&V!iZiloEaO zc^SMsCWF`S)t42#3cF}Y_2JI>^=5nRdy>7R6*tkYUFjs&^jnU@SEEvh?{D+Q*LF4^ z3kbD$T!h`s^{n{xEI%idk=i{-+pswy);t>LB)`@7o8v-3tl3UZ!p{Y~XXx}|ygmdk z*`K4Ngx_GXuURBest<4{R)E*W;7s<#OW<{$>LdYPJ3=k-t{b)Ji+b|-|5ZDN<^D=> zP1P*QJLh4sTOzwN_0$Vc(J3uI4<LYSTSy9fGj!B+S>vGqpz4R?NCL0(5_n1Nt4kzv z0_5`vY!dC4p2yYopsxv``r>*vezAbrbL?@n`v|XPD_OZel!MnwxYy7}kASQpwdOZ^ z)9R!#KP-b+nkfIg1YWWE1k@R59C-MQ)Id`XHD}$pvd@W)fzryWnnn@d)wL;P9a+rr zPlW%>wc|q<PqY6B@bYq+Dg4_4UPsN~)$%LwdKgz^Fw|>h@U)(mDUF-pR%uJLf}YZ7 zB9=TWe#~dZ`tR8qo<~UGFwMOdf6=`B94gJh(p)?RUVl!R0<Xuv$|t}p_OAwBnIZ{y znFL;wAnIl0iUTA0Ap&kv(KZIrpT7}>fUJ%H0bkNHWY+RS-)1CW9ium|q3IbzZEC=% zaAved09124qum1nKw7xp7sqhwM$|E0JV;zDWIhkB+M^2jkfP%sk^j>)l;Qu4_NG0? zbm=rg%T_~mJR?cA0+vKQ;l7N-=S_guNSy#IX~pZpmjb+^CxMp>BjwXA;MMdHyyD#^ zftQ<Q#Y+OOCJT5?#}wnlXniRU22BFI?umc<(0k=0`hxz85osmyx+8;S`3!Zc8MA=b zgKKXveEdIY*!?$Z{XU@Q>OAymqK`?QjNjYIczYH12f8sSZ(=OjiRtRhm$!>W?+?Mt zMYjFZz^k;hR1Wq%Jw3mg)L%@j6RUt9T^GvISgvhw;qa$kYzx1~i88(XJ2B?+AAVng zF11=oM@=5r*9H@@CW@>IkyJ^)YttNL*{T$b({7PCRd-D!8oJIZG!x);1JB^*UvD+s z?Z}q!boSrVQ8x*^hTBT%xxAdK(pE#C7(A?74O9Ku;o`^FUSZrUQP65VrApf^pQhE6 z70wZ7Z?@Qf&*}JTQnk_wo+Xj$uVt_)mkQ}L!TfBB%3?{na*m%??#1uxK%#TI$Wu1c zm9m@EfHgSpI*+Yy3YU{|s4Fd?xFC<bf<g*Pt0}E$qNY;R-_%97YFLJ@AxUQzJzK#` z-zWWi!wK$P-i^zaa2)sFBdxyY;j?x_3iLgfskrLH^4UJPy9N?b*g><QPe9u>YH}j^ zA*hV4hcn1Hx`pzHUBpzhakaXQ>Z`lO|JM<g62-o#BsQ-L!sojfGRj3lDWBRU68#!$ zqHo^X7T910A1kOf=RZtH&nF7-640$w>nz|k*<Xf*UHas$hPO96a{6oO&T}!LQi7z? znYSgXe+yoHH3`3|-<-Jh3-GF;IqwSouIt$~YZE_*#B;HviVUISLixv5izqBEr@W?? z+Eyh^y?T0;4H!yKkb8L-PC}pdLZ7L1lk_>*f}u5(l7u6|AEm8pX=d<Jq>&;Lw}3Ua z>^dKVZ)yX{IVF@9<jY%53yVrAtFEP@NkOHekCr~^WIvH$)tOi9o~b_xypo>|UQ+ue zz-!A~d~R0|SlUn1z4PQpe#e&^4zO@*Ai=lNxL00AerXj&nYSs9*g){{Z<w<$mboFV z6n9PrFXsvHs<MKYW>Q>GKN-A|9sw`wiq{{auPv6XhJ}6f7M`K_$}U{CKFwZ-@!T3L zgI7Ye`8azSzVw6i*H+M+n@dSSF$H&0D2x4xm~(!7vM-8NXLHGH=w`?Qm@@cGj&sss zIkKH@O!D(u(xuZobwj_}YA9`S3snekQCUy<)6>_OMez}5!nZo%?VrJ(xJChM0=yD^ znZNB}yfcH><obUt8m$$)@+{zGS*f&um%hD#mWeHh;{9~3u;<gktNn4{)o7quYuSP+ zz*0KQqq?k!oIL5I#ye!hg%Gj(V@~f`%gMx2Vw$wHN;lAcGu|J9m$cFrAa51Ul(z~? z&k|bWbZ>nI`G=k4XXL!krm;Iwfui~*jkk}nVbK;A&ELaMm*crzS<c-O0V+93G$i|Q z<@_!jzX`(qK-wc)4b5AaLlx$@Vg;`rQP16dE<|iIgO{|`vP&;P@Kplco*q9cr1;US zps}MLWuKZs8Pu)w+lz^H-j(KHX)c!L<SFp_^T`x=J^u9&yl(LS00030|LmQKS5#NF z|NoHR`@P><uhU6)ulM@(Yh&^{aYz`10%s*AQDb+<2`6yGL}Ox1zyYU3L>a|-Kopr3 zaG;pSVk)MBf*Poz<^g4r?{A-bYXS=yG%>bSYwaag-FweDd+&43{@gRYS>V-3;FUz+ zb)3K}?(L}u_UGQ=<pzOCNj`=;^#Fm%Q`LDW(`TdO>|0Ppzs0Tl(l9ywSM)@OLVG6- z2K7@|`q>&Qe+<@tfc~nR7;I4xcy(b=eFgg4??L_3Tj-%YYEQleJ-6;@HcF2%d6)iv z3+5|6c#?YwgUtj?LlX4s(qK)V0n4#JqxW<Kp0E)wYQXvjO7OVW2fgWkf;I6Uu-?9g zCwB1a6cBj5N8oi119h(86^JKPwmw$AWP-Nx>}SF2sy7Bi1q6yFz+8uZX%tkqKY;A? zTTq{T2bxRkpsA~eks9|Qb0LPMKjUfE3Yg+&qxGj*5Fh&=$f$hkW4}Ys;om`XZZ`DQ z<*@2Z1ag%aRvgD*+DA@3Pti`y#?02t=FIlvfft)o&Kmv61D8__2KENlOdY2gTFE2S zMlZvKu(??E?FDQ|YJpH<cn0iDrcRiY=_tJ!g*|h^v7Nvty<CAVi<|;C0xvFbV{feU zC=gL_(;2z-WO7&Vx{U?#?WnMAuA#WR40pl<u`VJRp_k>T=yFce(TeY(?4U1BIX2g5 zacr(}Bw!bI_#MKz{3aAr=ikGE0FxBfu1lyQzzLljg1;|0hPa0klo%}N>ZpNABBH?E ziY~`gNhWG&>vItA8-j=#dk}xG9eL_5be9}O!Nsq!c+YhNooL`U193ga#o7sLPYWb6 zC7R_F80t;7sYNb&wg<cvSoTUUpfWuipR9{OVCZGssFac3_$i;gnnv`N9Yo%#O_&q- zJ!XG#1J|mQ1dDoDdxdBr(E0IH4z_Q-NU*ydIfo-~hrsJWw;Zyf6A-8FK>USc*m3+k zg14t)Ph<%yn$@<&<7StDji1^U)7(qo(`y5tXTj^9(Fz%fdw;QTyTcX!I0uP41=w|2 zh(lErIBM;nu7*z8f#!-jG**l0Icl^t+{IlA#1ri4H}#@L(`y?+BXF(Az?J2}h+Mi0 z$Ff^-+x!GZ>k}7!Q~TJ_3R$ZJa!N;UP~frr25Pd8VrB3lEFyj0tl;%&=JY8>Zwcu$ zeg^_JpGCld2gs9lqf1tRlA}v-@#`S$xn6;j4UeJdbv?g`K%i5Co@Po*sYAEf%8%G_ zQze~&?U?%Gz^fGxyQt1|K0s>@4_;dr#N$pyCnPq%>#>8^j>U+`sz+>D7n;-dAor(W zcx{M<Pk1GSN*7-<HN$voH|`wS0KfeySU})a!2<GUz{^B|y4mq2-|2_85pK=+BVKm! z%IkO$ec47>8Ca&VHAhBh+iyX9FA}RJU@yV`Jlt)TLSrGAt7%2Ms1s_Jsm%;{t?ES7 z=S09aBn}^h<sw5QAM-_&#oFW6&-2NbS-YWY&P6e|xrQHhCFSE_NiP~Tz5G;LOBZC7 z*Ks*?F24JF5JD1)@sqFv>Y8}eWkz7}4rhC3q_P+-=CK2I+u9&)TM3%Z&gDkDwkPId z|065fsJ>ZbW!#9@2#}VWZEGz}P>cqzHrAH8f)@jl3dA&$e@Z3L$(m5pX+V9CYkS8= z)`Tef#vkW43J{)Bgy?27nl)xO_1(yU7xVuIY^`6gAHFzv3)@rGsF9m&`cXq!%g#xg zkHe&&ZHdJ=DQttPIttb2BQR%11U{I54awvK2K&_XUOApL{DjggUtwNoECdH0QvDpc zxklLehokJ!30cJzT;Aq`AJ;F$w>K-1*xpP2s3cot;M$5{92u|uXdzMS(QULqZ!%8_ zx?F|z!K^R#fY<9O9`JJiVc;dWq<KTZ>zqFiUa>atN^$|I$x4zp`Y)Zs;G+%#C(7v4 zGW6BWME8w%Q1Qe6!~Na=2ak6D8y^1f7u>%dhbrpCjD2+7P$P!h3A_saN^ld6fxK1> zTY=#L0w&Slpt}4H%J=?X2*3L;)Mdm%+9-lXSp|zY7Ef-xPx&Tb%e#PqHUg&MHuNb| zpgH+JQ0^v>ITj9Mb_M#VQSE;sgt_p2XfM43W!y@rldr+5?4$3+1YZ7>)^q}|L;^3D zsfHN=PVl-Bz;CW0w@)=Z$Ai}eHr4SC2BikjP26_&ru_d#$LZgpc=sBV9i#ko=rIH; z)Z=^%%dTLMI_JL9ObYCBVX8g~b>tt>y8GWz9QJQ0Jp2LbO3I<oP@eT!81CGS!PLLK zfL(0h6>9@8viU^7i%o6l?(TN!Bn?v%1_l-uOsgAUEe%KB&ub7M2*Ir7F^DNvpm8*K zDM}!YUxm1>3-IwjPGi9j6?oW80UdRUy=`%}fG&;#kz8ce^MMEtUUe|#?n8FmHuy)} z!u&W1%Gh@D+6I_%LXmFUPF}F)9@3i4wvnP%sEW_v>?iMGv!87{`MTZ_+sTK#zYL)< zB{<V&fszHaMlsAeYmok<9|YWX@)<~NFrZV_fTk<!aPRaQ9LlK1*#;ieoZyvD;Po92 z&OU;h1?{MzfX~u%8@0C%Ve`D*Sheg7u2yIuadhNV-uzv-e|i<x?u)~^Q)PJ6qT=4T z8(F|>*RRnAUM31`wV6~$4shGae<E0m@U#}>*w)(hDvKaF^9f=$&%yLH(eOG{jr=AC zT?Ud`w24!3>To2s2kpl0_qHQ))oG+wcA?g)g+ZByjt57OcxVT9goPvc$OC+nB7>;Y zXag_)O?fT_Y;ksQAn<9^j16A7Bf!h)FD47W3z)9801YR-k+5?n+4D9&PoV%&V+XHV z$V+b^diA$Bu;v)9mWh#7_W-H;0+F=cnLZC*{PQ&8ho}sni?f>rSP+?mH91ev<_Mf9 zfD~Q9`7K}I`_-Fq^iBhA%X^_?=b{zG;L!X9*yO(&N79;+ZMFsS%3?I0`V`T@KA07J z1OefNxYuq(m$nXFsaueGXcgw~zKTzx+fku;?0|^g&V1zWT8q=G)?;6s5Ybg;bW;7$ zH|KC~{KwUweZ;Ga>Ppvr0<Spi^FM@bi_RmvUJ1D!yy~;ufY)B+{u~VNO>vlWuo^<g zCK=>E?HR~fw*X&x1>%20u43tB8LCxI@VdpOti@$xU#<ytavOM=j4t)u1-zPKP<ktz zuczO!^SbnuM%Re?E7*S@ciZ%%^mT0t`dUaJP=y2u8*#2f=eYLrC3_u3;K5wn@2ZBR z={_#4KZNKtXOK~?MuVgNk>1sDsLwwL-|vz!E20AT8=W%%oNe6m!7GnV`(&e3Z3Srj z*%t|HJNeKUZX5F=r7hq$=b$D1N9T6(spQX{N|?n7s7Z^!!tKuX&R_>GrgJy#En8d5 zz)RCw1o4>w&Tcy{Ji?D9wwFOl9=t}|lLs#&6y!I2JtpwFRW<^=?%P2(Lxh-$ZZzlp zgyQ4~tcfqergS|dMpy8vfN<|xTnbr-Gr84B?zW&qZ*i&bHt@38!Rsyxewc?N!5`tH z;3zCTS&KrM9lYuxFFc21^H(CoFNErc7-^jfn8asLd5#CK84DPAkq_FzOH+o{GoK@7 z;~cX0aReMHL2ic$G7USvAcXg~u!{&f-GV~S4rD`ZI$Bc0ux7#g_&9J0HeV{og^pgx z*`_M34^b2Goc5#E)_#1s5s|4ixY0r7)!9b)j8o`0ZT%tZgIQnf0k79nJmBU2;{>le zZyI>rry$%9@?*b)HRkQ92ljSJBydR#!9em&40RYWY$8DE-Ud^}$EZmX;9;Zy1(9AT zNZNu2<&_Yr*t~eUMwf`;$`3Jk=TCJ1M!G)*LvkyI`=l6FZ->5g1}bA`ppdOQX_P_L zXTsBA`b`^yr>XB@Fp=OZEuI4=c7Srfp#-|?tD!ow0Gd;WV9I=me$!(N47R{pzZv>0 z0lF`4LQlpO^!5y5u)mdH%8%}Um%xjy72`+FhD`U+pCLdWn<mNRh5-E)x#;hvJok~P zFLIk}^d<f``tE#-f$B#DWF`#vx1e9V0qV?UD33})<s~r;ihi)28qu4F;jYUVD87zC zQ2~bOyJ0hdL2@Xhhi0Md@GKNv3`L{30ZL5=`Z|wexO^!FZ~U3hL*mr!!)(lK&1}wW z|2*)js;Y8;*HnRv7d;GYN(lvNR<;vacNWCi$FO~6FqSUeft_)wh<;d!9AOE{N`xq{ zc!0aNV{m5M66{*P9E*>pV{5hw_0(xw&F!!@pG8SZ1Oh^0;Iro*GVA2rv$?51vRat# z?m<>e2z(<_Ac$#2Ne7z_)d@>o5`-~dVXgmqES~obj$F;gotj4|Es8~Y>@I{ZTEZQm zd^EiYcPZG_5GeID-a*!mPjPtZA_RxUAvCrKX%A~ql63`X-%x<S9iSX%J3yHLLM?*i z#@~^4cs@dZj74aa5O?mCK~z(Knz~!axtWBcU&P?}hE&`au@O89I4mM`7GB1=FGKKM z&<-4kPeXK39qv~(pd|AO()S8*c(oS<n@?iJsZ!)OcXQJW4Wk1;`oGnzCaFP(Fa}9$ z{qfb3c~~EL4d0}TkX=%Uhj(HS8@do->_BGH>-Ow!+na6{*vQb?oPnE%*J0n1AOua{ zhjlA&Q6Q=$*fda3Sqf=!9O5?yW7ij9*pyI)$Vv;E)E4KP^7>5N+v|gvkN`xa5U7f+ z1U?oUIEW!BNx@kH?g*c~h{<liT?*2=IPh`?kgSa|n)txcNcNPcZAI#d&#~;QqgWcA zimRE05S8bmrXUKbG5fG}!A@-Y;v~+OHX*0(K5p;zLqh1t^zFNY8D(|o&fJ3ZpO+zs zp0_wW4Og>^QD1c*b>s(kVzy&TfIrqRT!-&&)F4G+p+KJML}M!MZJ3V}ivqFb$W`n~ z6Ctyt2*p`(NZG#>`-2z2D>xEC2Oc4}g@P=r9Ok-nD8BL?z6?EppdDurpLQQbbtR}` zTXkPKguQ|QtoB-oO+P)r=}HrUgvoJ0?YR2$-G|uhR@^6@8?D8V<i#UguoIg<`W`<e z6(Fa*n|zBp{KjnD<qo`^$BhV`t?ofvQ8Y>}?83@5KVW`vJmPQPM{#`xDjS4&kV1a5 zY96-vEx@$(Nmv-yic)UGs~l~yfk=t)K}bv%_S`k1R%UWc5q9{Ykq0lUhT2&Qh#mFx zn|x$4z-QCZS_#Nf!VyT{`_lJW^u76o^%Y3^Dnl%{7D)#k)!XOWYa!X|7?y?K!=o;$ zvyFFg^`F~tWPS*KjJ=I0VGVN2s>#Q4P<QJnZYCYa7cmbIe5(W1Qk|pRdYAggga@x@ z{XExVMK{|3M_vbI#x~qJycC}Xhhb4@EMo3FL}5u5L}}mP+L85`xA-dv)?Gw=nHo(- zC3;)pxDoz9m-ddmcrlnwV+ZWEk$jz`43eZ}xc$Q%tp70@8_(C`ZnG7Vh7#0A2jX^w zFSk43p1UT_o^15eY&Jq(NA-A*k4>+oh-tNOz@`^xlD>VoT?Zr5YH*got0n&=gco;V z+1^u__k9YkWIRG$O)08H4{<*u8Rz#ML|k|@QY+g~YBWP>vW%+l>_rQ;FC+}S9{o5U z$AV{IZt(Y5xR(Gny%55RJX8szksf~lyOw>2ZEKTowN#0Eixw6|D(X@WV%>tRSU7J# zj$O+_MuP~&wIn%Lk#T4l4zHaHpT*%=vYWtFOfeAoo24!ug%|f?<%a!Ouq7HXxARe0 z`2aPAakzPQ3zi2=!<_j`u;p?Y&P%N1Z*23TI`m|1LE5<O$69=Qy$aXc&1lz}`SMNy zyzF8JFV-h}!0YuB4|uu%yxHKDIOkdLN_-LdPm<3taGk(HD8{g{14F}IuoyaFP)T7_ zwZo|IfngA^5WEb@wh>rN$6)H8_>q}J`uFN843yr-piD!6Bgf!i2h2KlpBBBtK>uJD z0o@L|@2?oV{ztm!Ly{;A<cjgM*LG&}lScGY2i$k%B>Gc?y=7EfLGvd}a3{EX5(w@t z!QDN;;O_43?(PJ4w+!y??(Q<U^OEQJ@9sJ8hu!(obMCFFs;=%^)3>X-epUM7FF10? zFL`>H(DP46)V$#x;So3u;BqhfII2$u;;(ejBh~u3tx;XkU1blb!A#(=XYaZY)nK<u zHGH{N5IC;K35<ycL0_uYeENRf|3IW(`DvH@g*G@x{HkwB(snV3uMi4?3bVW9YwtM) zL+ocj$qwm@F+w(9-l!AaZRyfQlwv9((=Br8RPlIs*P9Ve+bs-Y=1cFK6%!tC=m7l- z{e7@ZsWKOrZz&tky#nsN^P2g^w)3TVrwbxG*`nUENd)7%6qt?x$pI8RgWML>W`B;} z^NKhPcXGgKAz`fiRjJ7zlCw2x&`*r@P+ylTv$3VLsD|HaS7_ad?Fh%k0gTK$pGDKc zNG<1A!7qu1sF>sMJ21r5WQC>#b;fQVLUJZwQkxBbVg-HIeGox~Pj6h~qC-HpLT|{A zpbSOny(pBbz4H1@`g?e!>l-tpMr~jr5M!o_+cfaYJU=p4=vqsFP`KC2e0)`^$hwH? zcK|0zJw@^9MES%g<*(frCYm@np2}??<dV8FN>&l_x`bqksp>t<q3{072R;Ue_{(=v za4fqCTnhWcSEyMsj&?R*Tdb)D>Mt_ksy{z^u?_@pH8^kU_UE=Snp6Om{tAuH<Fi|@ z&juQ>lM+$NMMv1b28#7Jf_tPagF-XUuRFOfp(`8^%pH+}y240A^17DWUFFD?kf91+ zx*u0OD548OTiBNr1Nxz@F>2<ENIe!2Gm-B_`=ZD)%^UK=GQ8({D{IYZfqqJW?$Fd$ zgyPxLSedE$V=#I(A4Yqd^Knr&GW7uCZBDJF2To`Dj4-1csH>YC2%qX>_19w)b+2!P z6!!Zi^CzTMW5Ui$(!w#4IWR)2H!SmsF~S#adO1@!Sg>34SLE8v{ObNt-1;>)T2R;c zbMmzwOKmaM;LooCE!eH#0@69muMDfJFr#YF+ZjVPH4o|-e59evuTE@4b=rqZ2UvSH z*C#Z4Xe>mU?1VY=pa7I^A>A&^M;fhgvr!a1kRQPs)p3FDTwfH9^J1~Xp+r=5=Xyb> z=w6)ytQ2~iB$}PEHAzP%8v@|cJ1U9WhFqI0sN{`qrZYRLzMC&poKDP9iN5VN>B!X) zZ!npz8+*27Y-8gptC@h$d(+^26NU6insUd$W!r~+pzDR3)PA*c>gVXR;{ePsDl;lU zQndE6XlR?|mXYIg9t6-mUC)XqNU*FJpe$z+ye`z1D)Vp_*tpLUetzeohCFlf$SPI! z%*FNH3zNL8727HqU~Xffhr0-XTN1pdGFAO$Vd~Fy`OO}=y4!w%$W7_(514zE&(~Kz z#BS^lo(OcesG(T}UiOuu=qOVZB(^KX8)quK{lg#Bi+t*1V;@5~2xzu;4~l`b?!;0D zPra*?*zfg4dU{ie6+G#Fp`L_g%9bZ4-0m6qna_2NF34B<TrP_n>6YAtBj$PIYhjU> z?TnK)SVgpJf%NFYk3W-0UTWB9$c*)7agF8Bg{!t$^NH#q%4rE)kNS>VnpcZ1_s}wb zd{|yui>NIdX{|LAa0eJ~B|Ob7#H~Ym6B|q)e)M6(#G~5%g~EiafG(R|E1|Tg)^apq zy4foH1~&1bN4gX65q#-#+4p?@QhSxKf0cE^IR9X#e*I)$!JQnI(8^m9_i$ZLIaJ(M z7H{V?h!*&ifDF;jz^#i5JhbfQSM`agPeIw09@BgEy7#Woj`dAs@}{clUqLooX4QIk z$L%@jjQIXe+<jW_)Ai7$Q2`s%*F8_XGq(WsnC)khfN5o^gmw=u{P22jur0gbok(6S z02So7mC}yE+|oQN{4DdM0>#*?76u5A1No-BOycv*$NHtv8;X5EB-h(?lGwJ2_vB2a z)S$jCP8f(QBJilj4Lvdg-IqHR<x!+#?UCiAHuuHaVB4OTL^0Ny?tKJwR$Pwg#|J*^ zxGhp06G8b9L*eya3-i#Ds!JKHme;=&C0O?Vx`sk*Ow?am5&xzXv|W|q>TUoNT;&;* z7wq9$mZG~fBRiEGvt7q~8|mdrMO(z82x`!S4wn3ge23xB?WFlUEdk@YVh1hMY^*nx zT-{M#Kc!|H+!g7qWVB^AN{U$I8R~b`%=q<=jVR{>;r3xtP?O$2uRe&REDU^*NnNF} zW+c)z|EyaHo%`1lKB5-6uJkkgEjER2O??`e%E+bZqxx{lbZV3y$Qu#xLS3B@h~11( z&sfh||Kz%*qM>mNR-H2aSQAIjwjYcCq)*PAPGfy~sEto~bOQ<?A^GY6$9C}i^sB}b z!V~#G&m<Z8oYxozN4=4-MlzmsBtk^o5S~pK^G|N!DjZ<MI5qqa2@p3ds`d$1B00BB z=#)oIdObY*uig+p6HJCGq<kBOuG<Tl=^dM8yJCRDo$-+4M57K?eRKiQbvm{9N)w)@ zS3ByrtL>(=dl0vOlpY3UL)o-}rjU{GltB@)T4u-?A--*Fl@6V*yu^-(4~&hFD*$~4 zZVp2<#lcs4eUBo|^t;!Y;d3sD!mndkN<tk?u2yB)B(DM~e$g(YhEp|>?n~{4ePV&7 z0nF6h-2h+CjjxcE!IulvOUZM;{3145Rr}bSB<V2)ye*iSCMyO`Ql%|rm2#VA4XM>& zxXiEZ3=F>QEaVJi<+CNGJ+d#+s2eOgHe=*+n3F4#34P6==s|*mGF}T!2o?r6lOc*1 zB18QPVo?mNq-47GtLT=|)z9^flo8PXRh+VzOG=87A_N2(#exAGAg@5z-Qh^wsBw$I zmUU^-{tQwcUq<rTw+>2f&uy00`D{vk{aLOdh&NCK=@W?O(xwVoInNAOsl;<QP4%AF zgxT^M(s<P>G$Mxf4Ey#Hw{-V-Go!Hb+eE%(d1YK)V3{(xkX+`Xu+bDd4sAjv%65fE zr8;n+{Iz$VTC>WL6d{==69yeeP3~=Gy<1~7<jt9r4k_hoX8Kj|o}ylSz$JU%(yE4R z2)ir6oFo}hhAv00#^r^MR`$}SVN$^pIaxi}UY5&*Vm#^_<<fh;rtBJ22Q0PxMD5A{ z25UiYa0B{RI_&c}5;MyQw79jEi1(SOa1ku3ilK1A3>)hbRO+4OUWiQVY(p<ut6q6A zdo5!dMvpV}6})=E&*)2bVNBFVO2Uj@U`a<j99ki?bCU{tBR!jkm1lN)xB@w&?Uc!a zaULf<ICshWlVS$RR|XAa`b%3#o6%o@g!uBqH5UGMy~NHHG3%wY5UV4{#)O)n8;79j zogwx^ABk04qjGvx7{(6+t7(FYC7fXLC##n7T6-n**2aSKVOiengH>*1;8N%+j$d=P zX@GtsWKr1-Wl@8m+IVk|3VtnVEgD6AnSvu9M$jSK_9JbbNiE#CB!%npX{~nkPsI`b zjOSH4;ZmtL$>W0OQ9$ev)znvFraHdb^SzH&s0?~#lBxm3(qJ7FQ?@8izv5X1Zo`FH z8}}i6``DK^&&*8@glP)ooz<Zn(9?*@)lKbk%*jhPP}NW&OFoS@`e)xtmHnK~QZzO9 zTg^Q>xbr57s}~TroSkqmDWAX)^I#X!?|w3)inRJSe3+Gan*^!gO~1DI#&*mW3HU(L zDG7%=t`1R*(5<<T7W^BA*z9QBlCht#1@SU_%&Padl@%24f(ZKEh}$gZD}ArJPZ!Jo z&&8sk0BrUS@E)eKk8TiM8NuA`NL?k<quvu+afZ|*yCX&D>b?dX-!Qs*V0Ghm26^RJ zv{}l`2R%%=jAOqw9~zK&)sA}IFl@PRa=v)YKHgfxAGx>vV2-W25&d{Fd!-8>zO7)n zuYkf4zw7O~JBH-H%=<{@FBDk({t@S4yqWayQ=9m9mi4XK_?jDh<tC|b%i_ng^^8ra zqs+)=%O;HeW;cmn%4aIS{L?P6-A9)r57#3dJo5AQGzw`6j|=9tGyGOI&%o?pDI`D> z7VRU!=O76;5qWe`aD<tfoSORh$2c|w`=$ffam0}6l|Gvfk?SXDlzkMBNAD**x9H=9 za?tvuT$sTxgIrxz=&XFy#`%3p8X92*1=R4gn$FR3QcLAu!Zl^AOUR2x5s656$Q^Un zY;&Q77<*KCQ%9UjTe-4}z1=B_D}g7foG{u{mECr!%ztxabd*>y^NaFRXJ`**=qfR$ z8+l{D?j1)pRr<7U^>?)wvfVo7YAeH`YHO-WKT%ix(nBp&pa>DP*!watrZWj9TpcI$ zqbxYJioTc$lL-}G0q|WgKrlcSzQ>V<&>ETlCB<Kn+^Gbfu^NSR7AC=-FY7nw9v%dW zwq+$@eTXI@KF6c}<nG;SA8&Q&wSx2{HC?%2oH%@(Fht{qsb=nFX4%lh@T^ohsYRu* zQ3m3?wtI=w4}A4Fo07ew60AR!Wl-Adza7yXK{k%dnilYotnieYWu#VR0_9p!$dyT} zh=J#dW<Ok~$_yb<^cz&0e@VK_%L7<xOpV-J4(Ua`-$Ep+gGChskQGR&q#{UYXm%Wx z0ooCwtyoM4_=rG9$rANveUoQi_d|S>mz&6oZ1x@$X=OTecEQog9Oe@aFLUkN;ez}! zyzwk;(?1P;GWHE<j-@PIhgB}_*UfaO7*UXh`<`4PY#($OH}B)O1}H;Fc;Bn}L66U; zByT@U*PyA7%Zd@|K8bgj60zp~<hMa&C89KT;D;}mJI3>_?C~DWY3eo1+&IEho|sPw zcW5b$z19;5=B4`ob#^T0nyQS;FKR`fA77V0S%MWoX_&zqI@XX;{El7laP;WJMZN-c zkTOPGvX+c`mzdq_NAuJwd(!mYLE~i>g{Xdu-jIT3o=nenVwr!sUv-YE^AQ-NuUwnO z{WAx#jbqDB^F#fmX!ooD--zPi@OOaMpg_X-hj46oxV(y}l{~6NNH~X&wc-&;F%!;M z1;Ov;b3**{8T<k3n5Q;_oiklUi76Sgu#$G_$`a8=;UMEQy!CUk=WNg1Su?qVOXEd% z%h_^eG2h9vKPqU6pu4{^-LGL@a#rO4C>c%G6^lT+y9AQTI_UXxs)kY-W$&5#I2cv6 zEW0hEIzMbp&3h{_v?l1Sp~k-)Dh0yU5=c*`q>J<nZ!DAzM@&rI>W??Xr5pH;iF`?7 zztsXym{e2XZi84$Dy)N*3w^Z;g{2xHX;}$x*&7X--hCl{I&t3;-kG9DOfS*o+rufu zqJ{+cQGdm%ff}3@Y58MExXdos^2WfYv@!gUCaq39_N>1^QQxr)0jN%K?HYYMjDn!A zq;~!8`iJ_OUzhLZUJ9HJJ1irx@9!EmfB(zCvlr8(1I6xsME7QY+SK<6f%#z#SKCJ) z(9zXjNS!aPwz~9G6UBlOgjc(R=Q#1i-Lo@LJbN;1Z`c^d2F4b~H^aV*5nzk;SN$+h z&<PI0dNg(wg;T2=@pbGc))SnyonB3HPIyn;KKy?N-ZQ))#~9HL#A7zIH7-*{`>HkV zB0r1c=NOzIzAU!3zbx%D@o+0LRPm{ku=0VO-f?-4hnWFAS8t1Exi6Xd$~BAMvw4|^ z_F!oqQOis&8&eXFXUEfop!s|oVNfq1P<mUQ_eA%!CYbTF-VJk1bP)NIy+luE>7or# zMW0q%-p^C1xHR6TFRfq4*99t^Gcsfj>_!>ecrHBskHy%7>7!NTqMF?KpEZJ0O6Vu7 zp=ZCH?T;-+%<*r8+!;K#3RKs>UEFrou9CI|FRxd2NJr}exB=X{7AS)@CfaZ7UcAn{ z%wulVaXxM=RqF%y*p<oGX8NZGupFmMwl*>B`htgKWbJshGlNG>JkHg`f4<zuiT*Lu ze?M#aEJm}X3}xnpYAy`vOvY%A|9eVHCo*~ja!&_wP%Y<N?C1niizYVLzf#7a9&V{3 zN}_?-U_NFz{PVBK=D(|bM8Fe9pa*CR^X+9=X!1talxp&+@zO(MvXckG3kuG4O&Osc z2nFqgA6bTl^S6+p<|n~#-scxhhCa64p{&7}IT>haod!!b4kNaM?$L<)x0|l={Ct0l zqka3Q(5)R2Lt!vW{5QO62<AxSOr-nz&+c#D(RFffj}AFaRoM{SHDxW18Tf_{m-rkY zeP66y-8x;4&g7S}5XNIu$FFx_!zE<M&8p#hB+=ym!rkJL{nwNGwrsw2%>)PYX!+Iz zVF<Abrm4<XihqXfK92e2@<%}XxSdPqEZgpL#AxuBi`(IuZFU!i>pv8e1vb=woWUpS zpZoy)E0+Tc#X(*s&bu+rJ|5XVF*BEjw}ZDfw!1dSFH5KXQVgb>ki9ITx#q^)y6Ktw zj4SLh46SqJhfCHK?k7vq+irIcM#mQ5_e>dLho?_>Hu>*d**Slob2J$kmWyqo*Ec|S z&aX`i(?ro!2x>(2R%&V!*;VgVE=%1i)m0gf92fPSJnmKNq6@`wPXurPZL-ysIwZc( z7LD+d<Uvz*KIiHj)ZEKYu=`4@2aQa(nI^To^8w?v=LLk*<jMZbuKv_cTR5z7lrDeH zOM~TbOjy3`AoK_2k~0?jdh}c9!=YEhm6()iojShMyZ#Efe}Q$1e}Q#7|3!Rz-#Q2& z9xQN&KllvRZ}E8Z!+z_!nyQwq_4UhhpdF5Bd2dZe7Iy$*dlrx<S$|16c>4m9r&4RO zTB3gQf%-6IIdwUGIdj=Nf9o#4>rM-7c9ne-r`71q)Q8YQ*|4tjZ_zQ;M3)e|H9+ie zQkzIL#mbQjeR@#cJvGvMJ;|ZsP-friEMkp&nn^~OJwd`Ce=;MKZ}9J>+xvleNa=}9 z!)1%bWsXZb_eW-^>>xyJ>GRa+)FSLvs&D&`-yc7As?n$Cg-@R&=F+Ag<ofuF^!Z)d zvLi28@M!%IA?SG%$7AF%jC6!lBlhkA*3Xpq8V-bh*(H2p&8_#^lpf!bOxtC*8ZXH! zo)WFBnXvtRTVcP}G@9{6HyWljHMUr0B`feZ<;c#f{h%Vca&Pa409^3fFu3k3eC2!5 zxC*};DhP}MXusn>C%iGn;`w$rw0`rGZQYIV)4Y9|=Lh|f>vVq4{!+c1c}@WiU`iV+ zOqc_*q?r~oZ+Ou^zeE7|pR-F7&8VK-72afTJ3!eFb>2Q2?@aUd9f<s{s6H7dm(`Nq zmCtXQvx~~3Z*?P2Wh=|r^A8R;C9^%c-_#XGb4{xRL#(WDSJg!;>!WUCZYsj|Q?mcC z|0+)wT37XRo)$_>fmI-(39PA!)hzyw0k1HyurtE4hR0@IiG^=8CtH=3Q<0Ue_G1C& z-|jBvzujGit7{*JZVN2K5IA7I_s7YX1E-|aW(taG%AEgZW+i<2eCZ8~{Qj9MYrUT$ zJ*(Z8(0-UAd1!RHv$$|teNNqZe^Yc)-KoO;T7GCjb^qLW3!++S-vqclTD1HOY0^NE z)l+(*RNc<5OiNr}JNy%ZUTKvguv>DQts!MHWoL1tzHv6`gL!}RIag`_%~iMhZffg; z`Yl$C*sCEMP0;}CWlyrL{=lb2VJ@~9*FJJ0P^j1sY97~RHVVdTF*IBJ_@m4}V)X2^ zgw4oTZd?7;<PI_)i<ci~Z*->t=WqXZIsUT*pTtK7Fq3eLZ#kVjR1<yugcgGT-*5K- zzy#b)wc0wP$A9_1I~kRcYbeQ#BGdiZ?su|Uu-OkH|Nn7A1hksQy!j#w(DJW#oze{B z#=J@mYY+ibqd2d~GMHE8Ac0Gp_sG90RsV-6&$Xfv&Cw(4>~rHxjwPSi!{EP(*7u)@ zM&N2D>bn?nq)!gue|w*Y@E7w|&||yU={oJT>n^XTh(y1CD8ESL-9i123Ea~16-x&a z)w0;taMy|d4JX>a;pFH(MdBPBg#%cYZJ)($VV=kNNZ3JDw}4z&8`y6ZOC1FXlf-!b z7Y|PTOBW5|e^Ftze^KEZXyV*gFv7#v79l4YM4;>kG*~xzXJo8ZT2xwP+IZSI>#j7b zAyT_AnShJS1NCL#|7MgBc-Q`)4JDJZ?f+)-d<y;e1bh7lt|?`Ku7}ePk|R?t=T7m4 z?9PJSnMvYyIr*(s0;M1|Pjw{twJ(UozvcXUW88w&bd&y!bh%kNOLN;-o4<pcv(eGJ z8Cbiz%o86$#8$`Gh&N+tz_h2!h{YKC=x0>~xwG~5-X@-wQ9i9@tDF#n{ZnW~+W0?p zDgz_G)2Lr$`=tiw#>S*=^XaiZ*Davy!cT0uUram9s`YBj>h<c(8a`qscg`vB^1wFj zG%7$h1z^ScsN93T;`K2x$>zL%MYpq&{(f~ZZ~cCMh3Lh7y;HYy17iQnI;dVLctkOc zO4F#KVl+k$dbyb`I>;6DTSKGv>FH@}owUBbUX>EV{~USVeBQiqr3r=N6Kh#4y*9lu zy*0f(y*s@>eK>vGb0>)ogZ^Q}8uXj)_uaC#$H!J`65ScgrF2eZ<|?jMfe+q_!DjGJ zozjA_*R#aDI_07fRa|NdqpGvsokpxY^fuYom5p5V_qjRcU!C+cG?1EvlsaHw-=ykQ zK0C?A=fj$C_aPh8BW9ED+NyT&3498{wop;~ySD9NEt$eveS5(>gZQYv`S1<F@xx@l zhpzku`+QvLZJ{laMZtJP7B`uVNu_B-U4z=esM<i6Ru$-Id5qBBR$r9Rd7msNE4y-g z>sT`{;Ii(BU8PKwcIehE2L?8kWt(i?WIkZNV18hJZw_sNW%0v;%|cWOI1{k555T1b zSXmtNqDH09OVW>Lv{*Sj$Su`xLnIR~Sv=KyCG)pKm=z(u(Il1ruYpwEo6u-*4Z1`r zRi^4Dnff{fhJ%k^KRvC0kBj?>76>;RIbSh9Hh(scxIh!#0hYd#MD)+Bx*&5+O&g=l zC2B1j7Ry!^lm25dwj0~7><vz9IcuWEwJTKoPWPdKVC0oY%mRVfq@1+6|1++=A>|FL zm7C#eSNtDKQ*!It2%T%?ya!L78}_XPP>5i@kU>FGpH^07X7_ASA<taJuTT5mf`7m4 z9|w;ckDipPlqd62(*x^VY>F)HtY@%HC@euv6Trn?aa1EL!$Xsj|LG^!GmDTK2wv{0 z?Qc;r^>IYUic3dB1I8KiViPPFSS-!B`uOj0t#QEk)>T5)<J!iB;+Jr>X6n^`sT|M7 z1%##NOaA8cpr)7c^G9aTYme3<^ZQ$sMzLJ`4hJ0=m^fgtl~4dANgSTyVN~WSf}nnj zx}yg&xA)6(|AbJD+nJB{T4~(3o6d8z)A|&LxEL9QO-DqY!}n>(XAK~caj~nFb6op! zKikZo+4Z_g*$skEEZtX+^$DxnAODy(xdve`S6x0ju2=`(hUV1#`6u>>)`z)y+Jh2s zAp%<2`^%T{M%->ue)gYRgg)H=y_Iyl1NE7dO``EBD*qG1_fuQM{?T^Ie^}yRXhI-+ z`hT#!V7`6wz_p0~k}`ghhIjmW;{Lq;>1Nhykph1qigYi)vgcxk3zG#hl^Do%?9tf< zhw<p7CoakTCjA5q_Z16N<J<lem52&>3jAa#FY3CF{wd`b?sk&gKfy--7lLXl*YyY9 z$(ziV4xdgJ0vIr`226IlwE;Ww!AcsS`63&z>NI_|Y1~NT0LP%}^b=;;s$Yhn*=}vf zjvAqQ1&;oo<et<0MkIPUq)%|^L8V?7>}^)A;D3t9{a+MWdDr?xDlVY_UcZGbev19) zR%?-be|?4MelHi8!ny?$C-&SqBZw~ish`08Pf8?gHP63x?*H8aF#!+6fRw9GfMnx9 zwGH=Nntz4@-%g_V*W&%Z+rvzrPyNY(*Z(o-XY1^m)$<ACoQeu?qXrWFQ)3LS8b}Bj zeEBr+Kixl+W*-P)u2%0xtyHr_I^e$KFPT+uT5F!4Xg4-BGSzRNRh9ppxTk4vJ*{x= zl+G&G8?t5!X^=gtHG8v9_1j#EjfIr|g_cMb8;j>3OD`zM7wGwf;QX-0oln~)mxa^T z_vpFFi#!x}^|bfaws`n9c9_t$^$F7Z`BBijiYG<{{O3E16%KH3uy1f!%wLT*0Q(;n zGpa~Px0JUuWOXbopcohU36vZfO38%?xbD3cx#H^oA12fPm|%T${ttnvJA>;m3N-yE z?kX8sI@>2TIU4X<_)1d$>OYtAO&MK>V}?9{RZ!I~IRC>`^1o!NX8z(nAvxya|J6?a zld%po{X2xwe|{N`7LfA#$mBZD==vY+6deC)?BzW`9q79^5IP^~M?~%py;c()NCIW; zkP}PXy)E1Fe9MqMo0r#$v~oes!1c}bH7^z0-7u$Tn=#UZ(ALGdYi231NfZJR6`Ips z0H(bIiYp6q0HN1bLIBdBgLw8vOWMu58sUi-$H7r|Y9ZQrm4u7Hfa&J6^Iq%4lk^d& z2WdpC_R71-Q7~->832+eUbHYAgL4^lOT~9Ioj%P&Z_JIE3wQ)<PWc|Np>sh4Yb3TI zOM^Uo_k_gp`dt}9?LZEc3#$$m<DtJFJfOGFOhYQ$A({kG2n_Tdg=#mNgq>a9b|;>( zzef+PL4UpCWb~YdEkD|=<f6s<Jt1V_oV(5k8B&QUl=4}Q`sPamk|d5EuV<rg;8ZB) zg&z@)2efWObQdkuP6fpvKQ#RlBWN2>V61~bK<yXJNTcbS5D``Lo}N@8mPqB7T8_?f zuW$IkU?+|{J?QI>jKEeoy1}z?nA*01&rJ%NgCIUs=rda<)$JU9oq+QZEnv;BursLT zA%z1H3bCIZRCz#B3aPbZ=%5`KaTz6p`BUi3hR3b2CvWMHzp0z2ugK_U^G_VgZQ#_B zD5RY$$O*kZvj!o(Y^aiSy=&BYf0-i{E-Pcm{dLp@b*d4P>99TZK^QNG-vnu{`1$>w z8>@9s*9>Wf$Ar^MB4`wdm*Jt9loYS}>WB?w+_)vj^;}zO-k-y!h)zy}43GV1+2Na8 ztauhy9TUPjc8)j#PhK%8wc}!DgnlTm_S!xgv|ELpT)Yf^T<9dKlMRw%i?&(h`jDfX z++xtk$Ow+aCyB4Pqft|r*<JrBd>qut?vLkJ(O*``fYkxj0K$~W9HD+k<W{cv18I|n zsLg{^1FL^kG@lanZhhzPfCb=R%x>+U@c6IXl`iF_L(NB%tLxzZDweu%Avb}utZDX& zJgHn>y4^wCGxkD9;Q`gb0&;f52Ca@lBeuT786&bJZ=oA8EqLt;81lVR5>2Rw-kv?B z@^d<BCm`*6LNO^~8!SLjgC3PuYYRsLce6>LFQ1?uln)+^`7)3Xn7)V4o4G1$N6s-Z zJHD|Wum{>z<6ca3?#90>W%4;dtu!&LC4g(&TEhN$yE|fC5L9}=m1W`F#);Ouf)9hJ zXMwHW<!N(A-Zgx(sd;&s+^NJpb~OfIF$vQeB5*F_4vnOS4Q6{oPqu4BA{EkdtZWA^ zWBc<T+@$&X=NE~-FwR*Bw;$+~@J>fg67<>z?b5o++$MQ@F^(t_`8{`IltegDqIUyz z!ta{CXPdr+cz(p|cj(+Yg;fNl>sGD9-R%s5$~Z3QGda;6a(pl)R&jtuWAkCZ&fN)~ zvf%5Lxfv|HXrmq5J}-xUIw@iQMHG>%^v1mVcSOKN6;<X>aiKgaq_Q3=j5(;O{p2TY z)Ha~Zsr=ijo2xhAM;%7_)xd=0>-1DmIuQ(47Mkeb?)IG5-j=yvJ7}^*JvLAV<-5UK z_5Du3AHu1*=G?+%-y(?=LN>N65r=X(r@{N}u4;$cClg6e6Ct?d6z9CWO>CH#8=v$| zP4PEq_4`S&;l>~-IQ#pDZrvCfPcjEjDCAjzxjp_6-ci6n)%6X>65#;mX4DJJcJ0ES z#v@E+OLw@-3*IQJ-*5-zj1@7AFg?6J{jG1+dUrF9G~Op>uR8(uXMDOnrET>bi))l8 z`M5GBr&Ib|zPm4MyS*Y2px^fh>J6397WlkJ_t3k#vgnb6;ku`Eb161G)R!0iQmYLm ztU5s$(almwHn&M=XOn42cV`48Qiw}7dROV*(+@G94+7S7Ck_xTc`>}E^sAGRjoxth z!`0G=K8DId?!^w2X(b)bxsdI(VlVgMg<x(Km`V^;K`DHksx7pNwl#G1&wm~p5s<=C zvRTqq<q37|Vpao^21~L2ovOn>JOBHKpc>bPhaEJA1{Dq94sK+{vt~fRZj<JkN|pFb z#zUUYKZVN)b#5QqPWUXr@$XBJ`<9J*bnhy2p1Pv%7^}+T>QkOY3eWoA@dMcdwQNHh zVI2{=`_Le%I(HO%>I%~a7>W~8M_dS*zqRyts3pYdAw9g~B}XW|oX5NXwZAdjW2>d| z<p;V>anMjmdbjTS4_cAS>AJK!5itO{5GE^R#f}GbV0En^^)T&~2$Dvbt~_tp!|W`m z(x_ATpvhcW+xEI*(GmYbwB*8yK&kx7N(J=*<0$v|uFw1Lp81ZuPU(<LFqhl5@VcfD z4&s3OD%zxN;+ui}M>_TMqTqCAI?Pj#L{HmFP%S!t|8~}B?Ck--@bw)H(ZyDR*9*!9 zMQ|l*3S(a=t`i|V>TXI)|0<p8(`iq$|8#x(?^>rlL^Emd{+&=}cB#;2$q{qT6iq69 z01u(oCCY4ILy1OR9@4TzU0(SNHorvtvYoPB?O0{y9h>ix2VY(|5zS%Z;eqJEY20Z7 zGbhBvxRTXk{b4Mf^)fUC?7)J@0*b+=7VXxvSSq2q!BBFhacGCgdE4k);)jlAQu0bU z*zk@aCH8mytAV+0a14?AKpns!crTPR!*X}r%g;c`gu_n0qUPdFI&}IMMDV(dkM`J| zB?k^X#IF2KRIEe&R@Gak+R8CU3e)yTgB!y!{)_G+`F<a`T*<%5aE4C=2S<x1uO-F9 zz`G_(>;h`azu9Gr?GH3jE1|QlXBm?$NUWkKKI01xdM%R9w-?frs}?F6l>Tg2M@u}0 zH_?9@e`3UZB!IOdb?W2$2h@bbf4FbHe=L^O5urBZoxblH?HEPW3bB!X|9G=&xA;&j z4=o-$cAz_76mmLri=@Lu(|qyC)%mDy3RcGGIBjvbA_P5CoD+h~Uno$k(<FE9_}vFi zjdZ;;8UaY3M|^1(I@)H9xZZ#y+JyyFE2Z}fSCPRxIPglIVTgCVgNwxcrTUpVU-|eL z1I0|@G!-6#wJFU^3R6vje)b6mhr4(tT{f#YT^N~6EsQvV9nNCx@pvTA6sX+W&aBDS ziOfbqne!XiF-ODnxM5R&X!~{tqm@M{hGD*etS;mt;KRJV-yy{YuD>;BW>P^l(xdW% zyuI)*rN-4>KWZpFXCp#sF%5H(e5d6#1yqb#I2ri@Vc^`J+hdEXZD>&Ac}C5D7n-)y z?tJ$h4N~^cRwcp2DVeY(Kk9RL9(}H9sE*vnm%T2wU}{DWca6^x)03ryb9r!Z_QNah zP}p7Fd|-YtWJq~s79T3jl^$y7=ukXj3x3TM&%Z_p9r2R%mi#7X;1vd&d?qqeA1if) z(5mbb)G`kzsO_0CG+Lfk{%16$En&%v9Ev_KXEC16C}D;w!41zjcvq=YcUCQ7+2<#C zu{4yN=4xC`gh>$nsmgL7Ab?Ci6w^8VEj()>>|vyYZi1YbD=G1aC0r8zC)ETgD^sTF z@Iaw?gy3X{AeNp&j0AmIenW@bM!S{~JvUc6a7O=HDq<)i{99w`?>{lO?0qlY`NVSe zqls@NUgzM#n0NcjhN7L1-n$&0fkb2=8BE=xf^3s&ug>gX6OkyD{yuj6a*^-{O;sc> zEzxP_VbQ{@+u}r?4xz`ir!&nvB=gPp=#{gCv(6(iaX~iR!pTGtYrs%t`g6Eeo$!Y~ z;A9hl+f8ew%_lxnDku{nFcU#MY$T6^KInDLl&lB*>K>(^n<-$(x!k$&minZp8b{Zz zCu??EB@l8jmT~}RhyGZqPMh?lL_M$i1nc>v%hS7b#+<|Z%ds%O+20ZK#aDrsb2rwm zGgGn~$*>7}%<J%c%EsZC7nWge4)9Kj*1kREh^N=K#LDQS^6l?l^NUzYNyG!_i(Z*& zo53GLbj7zCFZ1)ipXpg6&~Y-O2YA1wmI?dl3%+t+>YR*1;YMQJRA_9>sN<cl46-K; zEuq2ZumbshI5QG;XnQp*axwU9D&IZuAHehj%}whpNOMNkFyeVE?VdCf8l_&QT=qp9 zTv}{ToGB&b3f$zyBxEp?plW%%w39}IR|b0YT5J1+#T~>?I<Gvu^#s+9g@q5USoo9t zca-xLuR|4{Biswe3T}+%`&$ddzQ<uC$y(P=3G|*0ET3?S{PBss)p}zI&IgLmNZm*b zk5W*O2|n5p`?t44ZiJCBHrIxmTh)JDqVbuV0KfE1!tj2dVGreL-fVTVBwBH(jIDMP z1Gdd<pjJ2eT!yMi=~}x*ICa1)CVim{G3mBCcT9>`pY}srWyMu?ojBZ(r7en_78Mb~ zwrYLk=IWJK${BssXv&PCArk?$b*cp9_asDmaHsJbAyQG{nOck{sT>;0s2m<-$Mms@ z2uw?TQ5xC3ga^foi*Vqg$knNgMm~M|7hwrtc=|_sPX-3N!+{)OM0&b1oI+V>NwH;{ zJtJQlGWidB-QysJiEoYIM@Tzw*K8Xpr@6&>(Gw}NQ#CD<;2-w!D;!eFFD&tU2K5~L zYEhtGNBM-~{6DLda!ye}(y3nlH+fIrB204HWjnQh04Q)hIsLB6Ffb$*?Q)o-X>)G7 z_S&s)zgEgscOc@hLSf!mNb@))A^6Ddt)aZ(md|Gq5j*bg0@{!Du2{W_iH(DuSUTMN zZ<Pn)9Bk;=CuI*_ESgizFZ=GYlv>*4v%+%1L1rV<3Kq!`_y|E-isdVp57d=Bm?ABl zC^59%j;~yZhszF(KwoeX58nm>GpWXXPQ$RSWDG2UbP~EJve<c`p-p_&bNtWSwyjox zQ>>J8S=GeV<w4D_rBda<yvIWO7yXNcp!f@~v;byj&_kqGi`(YDUkvZTY==Q~8CP#Z z<8<Qa^wiwJDQ-k<OOEibR)6^Yhn$~>N3%z#Eo13DX~)cVw+~zCALInZJ~6FjR0jPo zCnFDykB&Q;P3PBc36^wzb)mBa?D&J0Dy+fgr=gtX0ad|xTn5GY#uo$Nm+(wF<stB8 z%<Hh~JV*$7vj#zkEVqtRW(us1&pRYUhGC49;UylH0o8ZPMP5|`lSIT<8-wjf3$wl( zUd1<e4MGI>lH?T~Zi5;#V(|NM_nE1z*_?t+z29)9>K0t}C?X()Kgu-0ClyH#NoKsX zI7|=vq9sf~wyzl$DF+N7O>*d?sJxE{HcuPeU^USvd|wfC5ImP(du=dI4q}9o35Vl8 z-YSKxeqQW!aXx+eC#0*z)qaDBdP^bI-8@#ej}f26Y1k9Z6WaO!IDOkD$t<_;GCV&~ zfifkW>08FeWh}pG=g;ylZDTttX}HpMh`I-jU_6AyH$z$j4+f12Dk*;|^TIqIg&UFq zx)W*Nda|2T3UaBR&2y!>R*hIOPfNX?1b0<F7~kYQ+|BQG{0f%w4X9sJiu!*Vh7fSp zd*#n`N?-W<l+s6$Y`5SRo0KzHmo!bKxaz3YS(r^^Fgy9NTc@e?RBc-Gc-}AEPRA|0 zzglU0#vVVOCf{<6U|zS_nUi7pQw4LUk`nK=bM{5{@{X6JPe*ZDYf|JkcH6zZjyHT5 z-kv9QUn6@7P$)?m=+gqZZ)~|(<Ay0R%C(wem8`ym?<ELl>2zhn^(v?>V!UDBlYU4p zjR^dZYdl=I%i?IwU^WUNXQu51O_UU&+Q6=DdBq9MHrF||eaCK}g)6tn`bi$eEFF16 zmQ0(Cfc>HRGfL=)bJh*{BISo3s%=zfkPaue8JUO5%gwTH2Vw?80<BuU?YP+hx!{J1 zcDLAh)Pu!b12UuAjD&U83+jv1Xe@1=fE*d%a>CWAt(_cT^|66U50_ev+T|Hd=YYbm z+b)L`=BAN2n7#c@#F<fi+tX!>Om56+`=hL4J*z5sMKYUL<~!>iPqUR+y_XTcXw00T zQW1Supe^F>fg$%8y}qIOikkZ^Wmm?qLR!_Sf+U>Md=+zs(q<8cm5%u7KVsKmMToQl z*0)ZLi7JPYVv&Yp@D{2$@V(@<%Ex2)AEMYwNT&|+1v%tbbH5LcX?6We6U|ds_Ha(+ z_e7M=^v9!UZ=O8&Z29EpMTNwgYbEpj@^Dh9>g3wsY6?O;pMIhm&cF^;xX~R3zYZpD za);mKMBuzF+wx&tTAUo|<$e~Jl+|I8mVPw778N~f3$U;hh^YU}kXI3lM{`Vdz~?(G zrhj4hEVP%VRn}8X{VVc|IWc0t<D(o6FJ`E=KH;$n{jKJ;R;T^J(wb3w4#`5&`KqXp z0Oc}v6sK8U={G<CUHkVPBlLhxr7u7!e~DW5ts!?z_cvf<wiJ7v^|ts}amh_#DFH32 z<z2(~*3|3iL|Vkn^KhjzB_p#3*~%^K0mb7sU+R}1xpiY$m7U~nvF}(DUw@uA{8};t z`z+s`x!Lq<=@y~=WR!JE<pow~HV;wLx*z_p?b>co)&g7gFRX}PXR>QD4&Fppw3}Wm zevL24H_chB76U%LmS2j3;Yg|q3;ji7tZ`8A#^x$rmOVQCIE+*zhnp0KK+W5c#`FtL zAA!WpMB6T-QUs62;H#{xIF;oQMNQDx-s@AWY$6>yG&hCy?i#dyX(U=s;I_O`<eYt| z6d89Fgf~#T&?7h%v}aOkFkV)eEFm!kgRfSRHTK<nR2h*e&W`wfz{z~BQ{?S?&1Ez5 zkvVHGMg{Dy8TnYa-hr|_ug#pu<KhELJISu^<Y^VLLXQMb*=9PX9g@Hzgq{5?iI&vG zc_&uz)V_EkcQlG}%vUaZNCOWGM)4m9>8bqB*FU(^+AwFcTxw7z$xfd}Y~ye?y+}>) zy@^_~;fU!?W{F4DJ&rs&aQ?)kzpFz_pK^dkF#ATkg$Iavq3bSE2w&Uwzfz0(j3d&@ z1jBoojn2j09S09j$)&Zehpk)h3-2#>KK{KkVo?r^Ju(>{W+hi=D?-V^le$?3)8>WP zmTF*R!1Fcc*WU2)p>oH2S>7QS3<y5RdKi&?4p_l@&wW!(Iu{!;gRopEow^yUynSDf zCx_`cm~oc*5xJn^ucPhe!{QiqOsC^_{Cbm#G)5*fEqw(UR#uM2NTS;38+}5Zan=U? z`Cu8jqw3wY$Gdvnql7NjuaV3UNOOQf@ah`*nXe9MU)%K?z#f=7h^WR9aNX<fU!@4| z=H*Jok$+4KLk~6@sPkKs=pZhr4v=YkSvj(V{JGxd5sj`f&hSdCIi;%8yx?$RBw~BW z`&~A%1m#sg%_Y>r&F2$>yxLu4vE70(AFH{!$8Qe*5#VhbdKF-O=3+zgq``|R=M`F$ z)~zQ192nUwHmSA-E~=3M0*)5tzE-D+)go2(@eBFtaJLufQ>&J&7H%cHk?~2r#WcLY zmG2ATnwxit`A?aTGzud=gI9W=;;<S*WT^V|U(4)1n)VPW`+)XT1&s_mRe8wX2Z+2+ ztb#RilFnK|fgw)gH;t_l-bbWzeGb%`JP###ak=w{k8!5OF>lUJMd{VMqbeRtY_C#m zNb*LHzVDt~c0V+$`36{(zLs92oiO<a0lEER04r|QD$(pajl0^Tl(XZOzxmU0-qR)I zn57~YJnSfH_Xt5Jh8|+TmG@7#3D*q8usGoE#~3jYSi8ZS6#5bYTA?@b&w~q)_BL$H zqF;<Jm$>|ONB7fqkT56syiE?b%?v+>s4eo17bRa%2o@QRe5p6dbWl5U{Te?&Mvd9E zj+WxhA&J^+<d;HH6xln6chhMqn<ILTx4SrGgNIf$d_OZsV5}}m&u6Ji-ufVIA?YWp zE5mKA*IF6X*zz+S><EiQ=s3GG>ge(KJT^zn6$G0In`GExO3p(DCZbH;&BGgY<Ay}m z<i*-s#KUZzuXzFjkU_#bKAWi3<jfp3mXN=n9j4wdU_*fRVF~`}WWhW+H%qd=hubE7 zjLOGlD%yMOZV<lH%q3i<QgbZB?T{`Sw_d2F<{<QPHV@mS49H*EVyVS=4;=Bo@7=Vk zabBK?D63PF>h1h}sM>O}#ez}IAk}e=)cY%FD^+QVr^Z_-*tsFtsp@d2Zo3vhs|SD0 zrH?-!^Rt5y(nA0^M{CK*_2I0Dgnnb5NbNZvL|VXwyxTY82hQSLobitBS$n{Mf8K8E zjUjE=0;XH5*5YN%jE@+pp35JtBll>}RH!jYXu;~%ZKy*uJWSYjyXuHYxZ2mOR9UC^ z^{yr1arM0qB`2NHa!FEEeZ6ai`Lke^Z4bm+=xx*XO1BZs*Mi|OLp<u}7dxtsR(L=u z*f!s{*4J@kFU}n2gxQbN&c_`&lZkcE4>GM8o5Y&(QCGt3@crv*My8G48r*D-fkdT( zH3jj{TACcuLh~Ba=LUwvAO6D}FqU+@J?vZ<A2qguyqRHkYmw^*BBm(Ma8V$!n(L9h zuzb5h6$Lf_{4OalaC~E*#y~l-*B<xsjLe&_V8isOQ@Z?uy}WjRy<t!Hi)eD#!}AuJ zQ%|)8Jxf`TONoOL2R6HWK<duvh=OcR%%YkEoV#Zd(!w};sI{&eeB((`?v|P4=+5r3 z(=YyRI4P2{&k$ekvFbWi%JgjY>2NW7DCS@@s9{OA7wE8JW=$R$l&~y$2l)nZF5ClA zi4FvWBgrRvWSel1^vf)1esJ5=aO8%%8jUoNEF%d{OmHvL5RYA<NFR0T)Bl-R-|rEk zC+j7H4V^f%Ez|2DL01z!xpH^_9C<f@C(uvUEOuvkFy=ir#6B!nO5w1au_OM-*{YFC zR@{j9v7m&dIJ|dRx@7NiUH=j349mF=`o_hQy49r%E)?j4?tE#lkM48Js(S*H^QXBR zmHASTND8uS2d@93p8FVOgbS#yKzkr{vY$urVFz|nXMM|nJ4nx#VtW;K5a)xFmq*m2 z1Lu~rGG=_<O*4ZtDW?h`2vdqJU6a6MES=H;JC;46uJH{F=h_FBP={`T_@!ArlZgda zFc~j>@Is@V+1>GC^qz=d&err@kH{_S%m}I<=oNL~DZT9>syTJ^ZjQy1E1C~d9EjE& zAIP<4)J!?NtrtNJfQip=3In0}cu6bYS~$Ij_r;|~GBHRyG-L+67}EaqIzZwyoG%;J z%Td>_lCiKY7yU*J>;>ut*NFu0!7{8sa$f%&_7&x&dz+cJ<+??@uMSTVVOIQxqkBDz zX@UM!Y;zxf`uT>9B1=$0(zOg|a%txLRpJnlV?lXe@j;90-EHOp%8lyg`$ceJ-A6#= zLEYJwiX~9^BcLbj%Kg__k^x8P6VHlplr@#RCxbpr0NcxMy5js}M^A)sF~n;XBRX@G z3W06-;4bFQcT{PVoqmUMma%O9!=Irk_762A@<(nA#ewa3r!k+Io|Trh&fCFaltddn z8~OSYKP_`>IC9!3njkZezVXGMwH29pCqKjce6)c!C=Nyx7&i(diOM9{S;_exJ+XzF zpB&g*Z~u?mB>@n9Wb~DPn}({sb5~C{WAJ*BFg~m8HLuL%|8Xn0PtNOp`Y|!-Jk4Q5 zN$I+ao55A+@H6zQu3I#!#Q?JC=2}{*H<BUn+VX1}-Ak(V_4hW>di9g9V?o96*M&aR z(FJ2}$Z89b{o<RMq)KnL6Q;W!X>^b>?0Pv>j5>5qy2)OA0<B0gZ{ig6Ls%i*c$Vjd z!}R!apuuq*Eui4<!~_)irY;hGK{Ci1pmEr^zW@z0v))zsu5`Ur7kzcra4mG)iFdH} zW`)W5qmUL7-H+oWMmXP8r@*fn%bp9Ph)9i_%g)?Lo0%podo8G!Edd(s<2dDQe!WCc zeI2(|Braxju9L6vvj!CQdy0_k4tRtvUiaiXm5xvhgugoZ&!_(?h-jTENA2|n0#^G9 zoJ??=xxYRnUjNV~3r(4-j+wgjGlNJ2PWWpKdbZm0`-aAX`GdddaQ(Rl0=-QU0d&PJ zPa!|>eWr6SRW+e?#3>kxpE5)ec{nE<yUo>0kW|rDPb(uV4Bfs0HB!(KoHR^Nhm%!9 zc60XObRAW|{$N5(pD#u|I8iXZi&KilV<z%_aD$%}t$ouy(Y-&$VKxqf;D_afIdp#I zBQC9Qyw-p)8i~v6#}(BcrJ(u9*`!d_`6@De4yE<JjzK$~RuaiMHk})<+LSF|Hia7P zRXT$5n@QTcbIkLQi3}m*tdP{#aFKtBucR4_;O)tE?8^W_<ltqY@)Q|HDa=*9R-i;o zlBp>{{|IvkWDuk~(@%Kb?z=eu8kb9<9HLGGmi;d&N+-XE<d<yE$<eA``<o#Ka(Q+6 zGOGG)JImm3lne7hR{}!zc@Pn?|8U*IiuF<rS@Ir?FkDA_jSm+>myB-)W!Eq_e}i)s zuZtwT@%xTN#U*`a?f;ytDUIM&^cmoN_x7Sv=`d~~c#5p{;q7Z_XLLP~`nbmsc~k|; z(g@q+(Y9$q`kHEJ2~nXFI{CuDP~_%UN<MTeE!#2&`KHW#|IXbia`YgylwZ^<hEA)% z`L#Ddy3|II7($}8KI%M}7w0{Us@<ofui1rK;%sjF#dycbznt7i<{A(MdO&HV+S8tv z+<=Sr0jYFOo8D)PiVAQMDYGv(k^q+3DQrPkIHEbW#?QUxiYF_NfZ&>!%Xtm@OQFf{ zA=9m?0yV;p2tbLt>C*!KBMx0fG%QAXxe6R#=N#)>w)CFM6eU;rmFo&|TBk5I*W2@7 z?=wVQsWNJ*AGzu3VMhx_d7-?YYex|W{<nUAag`<*QkyGcLc9<Xz)VkcaxhK^SQ>s+ z@wUo_{eCCXhkb`H$#;?z#i4wO8=gKQ2%&@0C?n7`L$o2)??UwO$5@xhngppQQ7b-Z z_k%NMDN^y1020hX1vNW2A{1>d9F%}Wki2AwDn@X;TP4DCi;je}g4l$+M1+|_fs5<A zH{C%s=I(>&PMXqW{Rl;33tb<G{{klF^YvZ=m~R$R_sZD62;;CJh|Y@O0li6iU>5<^ z)|Lr2qp8~JI7A}<>>YLGL+WA6tmB*g9zXC7({$G9h&3O=au_xCT7i9ecSat%NStbo zvSV%T^yeLO;~N*Te&vLv@oB|&tOIzq6&k%9+Hc;&w@g>41UoCrrcs#Ol^cZTj0=+- z9n=`j<MKR8t-h?~Nzk;eUyK%)e+)r38ckF)n+oT~OBT^3_s)FMeY9)i+e;1wpm5j) zv}qpxv;;^+Ry`y~LWlO`A#k(dm5%(&Y??|05qW>Te*JY#kt(Tt&#IbD(hH7s-;eh% zw9S^uY`~K1;r2_L&EXT8qbbf`)l=ra9zO|}95l`EU@0VcaeqT}Kk9$tTLL+cUfKxL zc`yV*uGSmV^@M1qa%@9xQ2V30B{`mZzH)zwjeKl;fx)>``O_Rt%EbGoMlZiG+x<%o z2}wwa53eaRj~Wu>7()SUQFUYJ0G&zwR0&!x2>c%VHCrItkpwu-=a#VF7NcWmEWPl1 z^qu?oaX+*x-Y(5{wGr{yK-6d1`Q8l^b@6#Um~6zLX9zipguL0`{|AFgwrhs3Q@SPd zsm!L;A?}W%gy3o7aGPb>HF}uz&<|<fiu^L;t(AgJtD-ZaJGcQdN}t^PkRn-pd(&me zsi}lgIQ%0~9daS}5A(qx>f^vY)}#bA!vtdY@Q4AK(#&GP*3>(DPPgN~-lzLZV@b?v zl6Hv`$W4?mZ#49w4WmDn-mClvQlCu6T(;D8FUm_Rj6f`FtHbLu{Cb9-U|A9_tzR{U zltc#UmMYQus1?3eM_~Pa)%8dqzEry@xXR(4yPgXPyky)zLen0otTkFVRtB#-1-Mo5 zar?6TC9ctaqpkZchT9+}>6GZKfDb1SKkCeO@?a?FV`co|6!Yd6u4*D933+U{4NA(Q zQOKEuTxO%uo`qEwHz9xo!8h%Phe3Dx<n|xA9jd#6e&*3f$&nG;8M-a&=9Tx3_>n*E zDl<fX)^d=A-+OBA*h}7*H%`|vt~G$GwW>-~o0fOa;ut)qA?)z~`RCrQhdgAk5!@AH zo%9~ax%*r#tY$@lpS5eJ)WEkZPrDIQMDqW!^^U=rL|xnHBok+niEZ1qZJQI@cRaD} ziEZ1qZQHqH=j45!@BQkWs#Dc}y1Qz(_FBEyy4H0q=D?a3=f3$eisXwHp&uaK4;zhX z5nferw+}v`GYt~p-dKXWmv)?Hbj8~-*b1AcLzmBN?|K#)H3_&ITQ&Y5x10B`OF{LD zpwCp$2?Tm{>njDz0nng2Q)}0LqLKa=a;nAFBzklHQ-^A|@K(xOOBc(FN5iJ>X0Uq% zlQFMMmf67x>4;M1Y9NZ$>tWTu$fuViIQd`gIHUc9v2qXdeq&YzS}&Z{@I%Q{B7R5T zxOr^HhbQjlv>hX@HF-m#wP=-W^9dZVy4GrCId{X9VtTX$GG$mAc(Q5ZEp#X6Y-YqT z*#V1EqjsIWz75>b8v=7U5Kh(+R6moe#jKvZGxo;xWD|S`yEldjn}k+mO9^=8M7HV< z%F~X1>0XQ+u8b|K)Sv(fr{d0~L+ZWH%+)e(O?{myUy=w9+%wE#Mu+4E`+L#QQ%|&H zoP(aPNpt_`GhR0EiRny{aa0$1YcBGtMl<haaBe#TK1~tg6zQOZf0|%k_5FrFT=Cub zZMz$5g#;2_#GDA8d!WN|q@rxu0UV^+h193nS!kd_V?8nA$}QY`lkW^`#_1nTBJ*mV zie9yO)Q@D|WqW!W)nIOC?<BJxHZUfj8?{RSfXDB0h?JT&Ds~fSdxc2X7Sf{4U}=k< zc?-G0UE%OydHu*Ab+eD8Cn+3=u|KcPK-<rpDFs68#6L#^T$=t*I<Y#@^ZAQ2vODBK zWWVzXP@T@lyWnFy@Z4Cj$>Xn|jFI>7`R9PjbLApq<Y&+xs#%UT9C#mN+wJojA)1A) zQO21q&2*~+J0ocJ3<2oJJM_&HF#$zlPbi7k<`mGNIr6gnb>3{#uwjZ6NhvE|2im(u zBtm#!W%ZAH^rjoK!yPm!(M$}1MKKitRCf=QkoTs9M@_oZx;kUdu!o0L#?TtOJoHAP zXHhs9ux*JBI43OsSCKc3i>tp|*t^&LC_{>{?s>5XDCMapU|~&Cs`NnqMF0wlhlFS! zejdWctZxD_|G@5eW6K4i3QBX>hIoEMjtm(ku5CLMlN^on6usl8PtdzN3s#gAJ43co zsSf&Xepjn8F<-pBS6TAq5S2ieH4qpK?ao7Z>%iAKttTG5%>*2)&UY6FP7X@1(Vxvi zMMiRVNuoB2LNcs8U`$W2Dg8K)0ON2ZI@{wDyVs6M4u)IGiYj%qlfkvIw95ua4k#n+ zuTZzpDHv~q*(7J)7>F-eDS4LFD-2u?zD-R3$~5-_`g?8wbjV)mz%PHqXMCAv>IA19 znY(g`>?u7n`KcD|QM^k!@=lOt;-^-Ba3{-+0w{;GMHOcp=-`l?O#XsIz_-;is|mhJ zf5i64qPY{2w_0xehD{oZ@V%VJPCRJjTTUMye&A@AjKZI&OmpLk)V}H+2nIu_*g%9s zaiR;{A#gM5pK_eHWOnlO8vc`{&)_CE%v@Z+_;5HP*5LBQY_MQMCyLHny|h@x6R}r% zrxS3OdsH{L#X+9P<J-*DA3-jDU$a``fAuLH*`_PztcZPhgbl_}-X?vaN<H*@V*;Tv z9|u){T~9I)R1(!uubO()9fkXX*nSFqpdOZ6ueI+AH<FwFx}FlIPS0(rj4Yxq!#uA) z;N~G=4laA=(gV%RiMFX?vEceKAyr3?xI*S{hmQQ-llQ8q?~IQXC%q~<?tp<A&DCjA zHII4%y3o?%5Oa>wS@P$LjDO*a?uq!E!^gMJfD-S-Qf4BxS0{WAkw*^)Wo0krP$=un zt@C|_#C_>2ZMgJl`0jFSTk!!Sp@b6d?&<%xK0Wr!K(5-IsB6QKoQ5qhXGZ{W9IKuT zG#~&f3~ql`mU?Omx94cI%&YkczWnMqHq#{~a(#&=!G#I0s#)w#2EuPnb4p2&g6{WK z1K<5rk@H30$(RgEOw5i+Jz}NY^tKd?@u#+rebP+;5Wt4IZ7~8%uwUp&J`XkG?vVU& zXrxGv;YFEr6OMxwUv+1YOXWFiRX4Hp(fCnKA6>Ly!V>K}9-H<N<(0`lB{^9dZ083! zgx+&;P*CRCi1?KImSVxjG>_&^LgDEOJ|~)-+Re|xJ}veJT`v(KOjzI0C>sM|+&av} zwd?y{$*lfoCG(w0Q_=x`86)`qyU)3P+n!Ng%wR1RvX_)6s(ps<U1qDT??y{#`z_ve z$yV=AEoplmDH}zg$0;YWQoWBYjJ)MpjbDc4cpnKK${y>Qe2<mh1@amk09J$U*J{S@ zF$Q@%8oz&{8%^9nhAR3_dKJZPs{8btQFSq=I*XCZ0|MjhoE3>w@Ynr4T#_gy#Ob3* zVR42nKCNNSJ5R_*HXpejxL}ixmvNb4#N4Ek=1vZjm$6gWXjM^O<wADKzlK|{-`hdT zjOxl(6`uw4P#IlZT2zjFXMF#9i`G}Y>7#leEX?v^^J-u@Xc&!3uR>17RZa^_>HRy{ zJhoGF%^b3m1X&Ln9xCHWP(aW&n6ty9Yw@l-x3fR7u#Db`XO=Yk4uT#tVybNSiL6Ey zmtjB`Ql(yFl;LpapeMXN2hQCI-i6^7C&d}LNI`;{${fP}s-DYj&`Kv;(i!<%QzyGA z=~Xy4&0E&JXBA^%btI_>Lu;5NV0(p26RWP2TJ@l5`^u59XKR`-VuAfF?~uKqrB24a zJ`9OVX~j|!Nk+1Nj=!+(<;o13nA4l`({|wTSmH8({i{U}+8&Vvuw`>9{Oiq)X(vhy zr21t^0_t0WRr^wseH%G8{sAajP`Ayg1lZ;ffQo70z#a&h1~?9vvz-$fzRA|4E~FDe zlzEky7SJph{F#xM!ahz1fq>w`z=Rjc&*r*z!S<K2!d=&`2M3Pj4}8hvY0(Ptts+$( zUVW!auAW8b2ci7|l{TUsQrXBMbtLMbO_omPaW{g=%^FvF!d~e=bU+0d|9EiQD|Gok z^vTI>$qwtU80mK6m(rnCq_B^^93kUDW1@Bg^}5-Pydv^=GZWl?JeF41{-#tWxD32W zcS>dT!LYP+bUuJMu_&jG$h*hhXt;5p4Ny4s5v63MIuSsB7aU%rzPtSc<Fi@~3JA+7 z<YrNW!=cb+C%hy`468NUB>&Sccl=P;n3hmAI)+O~S)RuP%toxHVuU}Hi3tdbJZ+Mr z>C~TBNj#eTG|8L7*Weu?tm*h0KJycRpD{2)2+{GB8yg}Mog1g}Lp0n>c2Zyhj#${4 z<u&(q%d^C49OL$wmknx96~it4&oEph`;`pOMYRm=qRR+@#+o1vG@&@?LFU{r<F89) z@R6$@Kq^$=pf7b*a>Pv5LfVUV`F()<7b|~@)^jhQBMUiY3W2^<%8m$ek#a#K`|$O+ z>|$mS{o~2g`%8MS)V%?x_$TsgnhD{1BK=fYQU~uI>8o#Vi{!L;U=}#0ujI7S#%M0V z9*^8MhASxkDU4SG4yrJ>94~Y~|Egbo{vreV{^nXKkc}?%dxel`^<4$A-i?k<@l}mf z{RjQM`Lurju4`nmiD_d3zqsL*Y?zwNGafm&KDb`BYA^(uouTKQFS<5Jr3r#oRjJl* z{ux&<uoQ|+Dd#l5Dr#d!;PjVX!6R$3OtOD+ZWUti{!y;o)mV()Xu;xOr~&!kNrs<j zE}r-Sd}sGb*m)mwa;nBXbI4!iRurGnvmBB4Zp>zB+;Z|`|C%<LM^b($nT1<*G%ZqR zTFF|_t=2LQK=KnQadlXBXMPa#8Sg?`{z3;)T^9gT^=4&(9D7la>}aZet0F)SKXR<? zEyzfl4l;2hi&+rX29^G3pVwDc*PN{RYNF1te>`xorpZkU;-RdxOLXvV{ZZ^g(u!yB zGGRBnyoAIwBcQA*Hf_swGFDW7-(v#rIlOn2EpV}q<2Y`aKBOftsSHf?RnysTfjT%P zitYR^Ior-~@&(<O#soWT`Zk8dK}4i$9HaVZOxVM2BNuX*<~%8+{Jhbd2hxkeH&dY- zpd1lVlS-?RmKuiG(qUZ28e#Euk+Hd3UCTGoy}pPdc(21e{%(AvBz{YljDCmW*jcsa zgj%-%d!SGz$gy~Lv0Jf#=MLHT4ux8kmSLWAJm@cIeA3_k5EL_L2^xdwDX|J&q$I!R zL+7F;5YJ4gmC<JkJ%no5A*v|KY;ymW)Y+Lbe49-x^hn`kmE@M-vjT0v2U8&bFHeIC z#@LvJ``N^1-fgV)V^C|ly|+Tw40u}7GJ=3T@$yzD392K5Ag}uBx>wZ@H=Qksjx&ld zx4wOL8=A=jnufN1(`*Q&^$w_JVBQ7Jmvjbm>Nwu2-O83+ukebsY!kf&-Q{R&=Te@z zyi?->{CK;A4-1}cbwSq!G<aI?z(C->+cjAhTes2Oz6KvQW9Sx>?jI!=VT<8bdG=Q< zcBE=Vb!I3^b1bt`U-EasrdvMx!rx~-9QtV~=<8W2m2L<Sx>Ce4V;T}py>5*iu&=ME z>)Oyf)}VPwl3%d^6UbQmrN7i@YZV;cAyIe_Buy_qR$p}x<?Wn26Qe})AM83`OaluV z0Z)8N#yLeDan6kssR*^F?#K?;cNWr`&TOFVIWl8?QwR=5jQw!miafuMbGp~V4)MTA zq__)2d;dss$9~&-`M`c-r3C0o_wFA~<V(59ZOcOZ2{fOZiudka$aMlbTr$1l?+}q- zPxHs(Zj;V}x=r^NX&B41^-=VLkn@oSH2>i|_}*dR#n&Bp!}5K%4X^YasoX>gaR%Gs zH5eZj{mm@j(U%uwa|c78k(|SvLgn4Qw_A*Q%G&oo{qfp23y?$t^S47UdXPnytkT8c zba1aoxLUT7#V;7r(|(mh(Oq5Ush2s`hYI5j1w4qB+*%U}&TqY?-I(k3XY#DJCwjV^ zG^vL$5FVODVolbfvwaU=LSVocbWTcCffgZ}Gq%B#d)1a9_O!D>v+b0nJ;TW1!Pcr+ zYE3Ogi^I>abbyEQ$Ra4Qh^X=xYY~`BS;o6n`hiAvEVgs<{2f`nigeQMKVHVzvBppH z{%W?Z4G#nvl@sASQ0rC?`=58JMa;T(ypV-Il(ta>&c*=A$kMht1aZ4ctkmd6)z<q5 zMWa%;4_lrer|b&CU|VSzIL@Z6z97(rvZag<CMu|=HzZX4IRf9=-%bZ7o}OJyrsOlP z&?+@w4|AXBvPUMeY5vKy9iGEn<55W|vw_4PNBBtzDWI#q=>W}oO}_NOS8C2PV5pU0 zmCirTpv<wivI1OjPDc;{mj>~CE(304Gu|C7A=)&TFqCcmk%!KG%$fzXhi>B5?J&n% z)<K5@{?wr3LW_6z`IMi#hX*h{ib!6OcOJMua2j7IZmW@9hx`>kXc=O&`_+C#Hyr;J zh8b{5hf)RAyR1t5hSzcaO|Pv&I1*O6@UIbp5_0^J-X6_o*@!;Rwy4d`#!67rsOy=E zDgXU549eD1Tt$le7nGNbicZ#T{LO8iNEu$`UQ;0^*O%%ZX(17KoZ}Y;w~Ox%dFFO4 z+Q7K<igjf?0Ge}ro8<UW3wv3`Sz`-C2LX&$-@S;|kLc@=1AoC}h=Z0zC3yC$Uo;Y< zHv97U+L4qEDSL$cd6RSUvb%AmK`NkYy#V)^1=J~h>Vn023ICw0#AsE{%G;rB7W}mR z3j%0aNPoFq<0{pYpIZwU^o;<}&gn)hc6wcz41M<nM>%FM&E<6mw}ic@>3Brw4mAMv z2h|TV88eav@e33izB{nMUFDQid9&-cIsWwvg6<N)^DBms;DOSiFiMr-{1#M_-)=+F z`yHP|&u;VgXSY}f3HP1aP;JyLCk?{1rsTeL{g=(DW}k;2$>wG++XqNyk2vC9x7jTT zr??k+Rzr?)#_5RvF8AJp+W#>bzQvjsJo<8XN3@kKW91tE#5%NT7N}t*L=v2Fwxj50 z1k|J~b6Tz;f7mpz<0cMR)#Okj1(^l@$(gH0yhcKG4s7jBXnW;cXBuca-#W>5bkj0n z4PUloYSGNi(z7%0v1$t!e*`pcL~j>bX$Wj$-)mzQzSH3y=)Tc4aeJc5L&5`v+l`o; z^er7StLojqi7-I2zv`$GOWv?PEZ8AkuL6+}9rC`s%6$JwKzF*JHs-ek5UBDbc$;JI zq)lXAbjU`6Bjwvh8Nd11i|Tm}R8~9@>a;&1ulc(KT3LZew{RT6ow@cqKS^JjAaWW} zhPQ{T8lSIdaF4>TtL|QlOM^o+%32dg{b%s*9{Na+;G_9v42K0&hZ+Ps$lmR<%N<nz zP&<}})eoE>NQud>^xU)_+yC-i19X-Ce5IFn7`&#(WTS?-32211^0ETg7|A8NWl`r> zx8WZw;=&fqqwN}IBV67T?4GW&S90g*LbNC0)}~Sy;Lggs_1If%%IppU94ceE##{BP zY7`fZKW|>W<E{4M&K{{z9d&LeAD2q~8{cfjRNnw{2ZryLKIlwd3fIr1QHL&bWz!X5 z!Eo|=N^DI2q?y$ja9dli?MM-<sTq9r&{xuhZzMi`TswEGTT6M0Sdc4~vX~HTz0E2k z^x!>Ny2keSz0&^#>)o0%n`a)=u<vC7W%i{a{!wj8@DjXG%l;ZbVGF~rHDe3oG7REn z<xhr64MkmkDpF=><!v)K$11AHB6j<fH0MA2Z}~0eQA=GJj(qg1??{m_OWxSs%Y?*i zxjdiChrO*^d@pMm+Orhtj>w#uZVb>;1q-|x<WS<SjFCgARx1t0&F)shF_&TO;86;~ z{c_-cmJeO-j<p25Ay_#dF=%(eW2cCCt*_O3K1!^tf+Sl_8|6)D(TIF`bFF+G51dbB zTVFBpjqR2uVsRN6pbx##E!I%~r?UMi8o=9apbo}?jlT5K)G0)nl<8X|KJ*HmJ)`dg z!=)@|jIDS7-i0Wt3K32o0_15ys^o(`Ep3ho=z1Zc;sT85wI+QA{;CeZnLX<t!}Flw zI2rF6m`XzQIUgve0T&&CzrxoZnX$m0ec6RdPPszDcnVB?hcPi}Xgj**b0P-5(sj+T z36trMZ%+ZAyP$Vi6K^Xh5?WR;gm`rWmA86NZLAa)H~h}f)j4qE#jEyMArH@~MHt*= z^n`xY)_!hu8--n3%d+|Mr?!S{J`*?iMFx9VD(l{8KQ)D^ml5cRbCO>^-`nYMdU76? zi6PLF^QfH~yaZ&tsJX42eAMZ>bhQlmh~2OMl^Orn-xVejCXfgu31`V}Qiki#4<9Ly zrNWmwPz9@a^IS187?|clu4&7f$S-?z{qe7g6slo&#;j9=Ox-Xj37riHbGXT<3RG|H zmgxKtK1?#w6S>-nyJY%<{FqyJgQt#{0&PGXrP`)nR&Vxm>)R2^u~w+68GE(}Bt;pk z%sk&w>2Fq(RS7?Ru{4H9robORz4bxAjer81QE_4B;DQ_$__Tr&4u6|ZHw$&uIt+fa z;<`4p1lJ@4&uNblLF?adhw8Y>Xo}Jaa(*76K7648VbqW|iA14I6p!s+#iBMnerh&e zg00(;?A}vEkjqO^*uJ>I_)BaUM=m0vLfCQz*9vnByf%Is#NI$Yt>CQ)I9jM5c@O{n zBq$BfVCjbC($L9o>}rTM+D|I{*5D>bMMe7TFE9K8Tu!Z?56>p;VKJ>bz(Xb?Xr~BG z<%@2taELwc^DBNxX^oU#aEw$U-Vt4m@P~#(UFwtT(S}=%aPj(<Q$)A+ZAPOk1I~SJ zvJtAA6?KSz9Fss>NgUpYc4yFN7V>7Vwxx6U&<7camY2o41W~}~hB~kGn#)4tS0FzV zfP59<Zas#n8z0FQxk-B+%u9Nyh#EE!yB(D}SEi1%?_p)y{wJ1k8z|3AtT|dzNRtqq z!O>~5x_yCUTJW4Op4HQz8f1&D(vhSURlNUuBF&v@{f^r9>ZIwxR0Fi`r;g4A5p@9> zRLuPY7J{6jC#2;P1tlR*8P+urKshvqnpT~h_2<gnV!SizFJ)3QZFC+1aq7%>#$9QQ zQb`TYlXdY1AF(=*e1Y#h4ExCRSB62rP_-csVC|K2w!6=K>?+O4;=y{sQ#P-7*Ywj_ zmas(a$Ge#*&$u)x6OCW&h)mu1*&5VNU+obN;l%>g{lk}OkC{Ip=rEpAHF_+Pgqlvq z{gJw@Aop@7+vWFkQt(CkpAjJ|kcLmzJyO)m5kmSEIrow_heGDR%9KPu8cLAV{~d(; zj%S98H<Gv(W_T&Do^q$F8U6X=H#OkNA%a5fCn#>CQ#ZMXA-*v@Ub~=bHt3<<#9@Yz zsQl$YpqeRW(}IilhR!U!9Lh+>%=oS2@1|&+Q!xsVP!S&=%}$#PYuumJbwruxjpI>C zR!nvUv^!F~*&tM-b2GrL;*n_hjQWv!-0RdJx;U}xAg$d}8(B{?QH)2E6Okm%gbF!Q z7m9*_P=wpEC+A<aBY8h;eq)KMS2`U^?*+NBXZ|uo!pw=+$EvWLY6Uq^D`T6-A#c1b zNgAI-J?J6|3vrIOvL?Nm?4O}!Rh%E)E=M{ll%%pfa$1VM^%?6{x}<smiQJLsP6enp z&f#Ej{N<}Dw7gL(rs(5^@k`4@60jVI1)f*EK36}EqGk)8))G?nWXTJ1v@FIKPxrQi z_@Pc?`56#Ccj&aifl{yNVJY9FqTab^C3l(OvC;0l>h%mOMY*ny2RSq9uUWlwd(M}X z_i+$sa{iq?V-N-G+Y;%fzPBEvuCv-7ye>{`EhG(!rk#q%E+(sgL;?};(IhQDnWe@C zQ}6JRoZKOmxln)ii}278Rp!moSr+7Bevtt!HRZa5@7SdWYGwNJvXnIR#RZRug`Qk% zGTyZx0=@zPorR9KQhTJ00!li+Yh~H|G|ON$Jqa^l2W6jXSewgKQ2gFnpO&o~-ehw^ zKE;~aNswk{T7InX0pr8dcnT@bke<l9d&HgA2E_?M@l6o26zMLSvTkMM^L|IFMZ3MX zDZd+}+*W10cdz^}V*)ZPg-Ki!_;-N&e6@Np8+vmAy!Sc1S{-cnpW-~qdjthk?XY1M zT0}@$F5fwYJ}&Z)r=-97qL~C>c+5kN<_GNWjwgtoL|}>~30J5v`6qikQ}lS@$*(jE zU0g%6IdkgtnH92yW5y74A!4_O^dZkfJUCAaR9Int4a&geQ1#mHvJ-ws<9f^wh<DL# zdc3{V4G&g^w7Qx7j8vY$uuZ<*&MW;H-)A~k-Z9cTF^=gA?g726;e%SMXX{(U3nB1X zuS4xp7M|zub5EDk&I<yncA}dR>RdIj;85@V+Rq0oKK?!bG&|JNYOpI7sh`tzW;4w+ zOH9UZgHTmTY!Fq=DV7xA{zsO7K~pKlOUvu*{Nbf-I#+S?0b##X3p{V1L#rGQwY#SM z7~QBO%pL5MWFue`534%`G-H7W>Cd48_0pz2C&%a%ZaEvi<!UMDa=kC$I$8x`xydkP z`N#E>oVeX*O|B?GQ%adP*^C*JT3TLAhCdze-dcDleLk&)4N*v^aJvQElanKJ%jxTT zS|ceAF{K#YusifXkiIDQT=dp*6Q^)gVfK)%{m!exekGR9Z~np3wk<?>9n(Slkf<j+ zSfC<{UKu}up3;e=AXJyMHXiNpjqUu|kao8VWvcyF&tLz*0X9<ViVSvwu^rQ7xBx~@ zCzg`192-Lf#ORs}Z}-Cg7~0r15}J&Vwk(9r%BSUWCA?-qZYmkq*3H>~x>!qb^1S@^ z1i!*TD>%xRB2+g`CTeenc^VfVa2`&1?y~wbX|W=|bEM6m9`~P@IQlK7h}5XAqd+3l zYd}RH|8qtECxJ{_eBx7eAr{P@3t@sl>9e@E>oC27kEH%AkA$xxUwhr4oSF7#e&^CG zY@$Ap{umZYtqA2i79s>yxE?afxp+W_Wgl(lSb#qdBi3N`Ao8Ra-6gu$omCKWcy_0o zy0+$VMh7Yg7B$4GVu&1p@B798SaowU$d0bF;3v2D$6mNS`fTX<s|Y&TqTkyiT3+#= z{%drwi3y|~gfHCy$Bs&l+}z%aD+qJjj^4z-Sn=AA-77KAKaDvUiqJpWeWkJm*I)Ws zTagFKYb71(cZAG<aj4rDQ9FuiaBwcC6heitiO2cn?cZIaDmjoe-mgFpeM|orxdV{% zs9V_g$o#DTDOYh@;wdZV(>W)pUetor@^1BcRT#YXwtre&m#_#Q*P^ySr4F!!`6*eO z9=#dfoBEHoAK(X<yu5J}4mC(G(e`sNK%tasCv7tIH`5+@XSJqdPo_7~Oo4Rk&;w{_ z;Tobrv;S$4=`S|Dp1OeL8enA4Bz@>ij)9O+KG2>wBL9Ve?W-VUHvXqqB@eRd=EAhI zV^XQTckRhKAZDs{IoZj!SoMz*K5?PZ`@o-l(qGJ*V@*y|I$`j`%p{2l{BA@%m#yB; zKhL{9601GRa#tsRAopi$`ttg<za%Y~Z0wH?cBk?T{Icofq~QagVpl_5y)|P@XFBO@ znT$16_G7y5VL5rjNLC>B(hUa;LyFb=`r)i@M4i}l^qsDMBX~gwI5<+V+q`|ew5^7X zarhzCCaVB#951Zj^U~BshtP6>k1fQHu8p$#4@q9L9z{f`#HYRt=|TSE!Jv#Nbg19^ zD@e3t73;%^#C{ylg$b!oGSL65B8ZaEx7V&`O?sxWPuow?hHd%CNNfF-5Ur&m`XyUm zF<tq~L;o&kUIptjSWX(UW!?3?C^8`K>IDu<xYqq|Rj^w2?J%3Bpso772JHpaDUF}m zF_TjROn|IRTK6H%8*YB<IU%kbJOKkiXb;(22X$AwT`2UO%P`}g6zV(BG06(^+BywN zRUl7T_oe(hfxu>sA+@HV%TKFmi4D*`=->9lbL+uYkSVnWGX@i2xtb0eG0MP6SBfO@ zM}n=>AKwLm4D%X;AjJTlH8337Y;D>sD?0LQNy8n*sqWdSLeAL?thGH(L5#X2?!-e1 zDNqULwb4C#lT-|BMwdIxCa6{p*w(-xFhm@z=<Sblz#7f4<Ec#KgDZn|87w+cM0%9~ zMIO%;7ay#+F|QHFotg$Pzmc4M;~n}p91(@cO4%@P9`0{P+j?+eNPL466f-)JlsI~j zY9;i%%O?h(p6Qdv)qx>n_SU3$0c%NIR8-I(unO_^R_GDKr_5fdl(0=%#@WV^Gujxt zhIk@S+zx1;e<EfHipGYF>h2&SeujstU&SU;D*OG%>99Ilt8cyTwGvE8qesH(stxM) zdS78Y!oQ)^CoR$NosBlWeToFaU?;x!cthgE_>5-rKkiHKKb_Lzj}0sTHa5bIvdeXT zsUx3FHm*6T;YS$QAWzo_+5=C!yzlURu+}_3cD|ekPFr<YNhqQSY)np_mH&O7Lto}u zVEZl~U-KmyMpf2WO=Y|(0!3JK?=8^78w27)=H#wM{e}~-w~qN)ylG_r1dUwxNO0lu zSy;xog{qu<BGR)*ziMF=X?<oI*~H;Eq<ON_+HsA1Wzzo;AgyUzF+E|Zyy8F@&h0L1 z<^==3!@v0gXyKO<RMXvm!+Z?RTpB*l@@$l3qR$bT(7%?O)JH!Qo#!;VS|(dZq<P<| z_$tA-_L{0s10234d<Fx%jjE4HJXKlNtkUQm*lCh{ykci{{MZYgX<qSB<N}wyjjC`4 z4bPRtelHfJ|3k$0YKq9!21k^nvLgb5C-QcMPj}2(GqV+R*C1cosMk0FiPTOwX^4>Q z5VteG-u=6~u3~f$=vzNcKV2o2vcStv1ithKYI#sbb$i6$h#jV5oplRw?D}Y}j-vk! zE6g9#G<QTl+yVIr9>*9Nw@4$|6!X)=vk3IKF&b7OmkZDb%Dc)!=Moj__JqTx<LOLo zbIN|ga(`L<H@M}O?+DM@*x8kGc}#uiwVsAk<Ez-0Ob>}oC->oUseOFD(jDoDdCQ%Z zof6l_-%0O}101M8i<4-%lSp2vW#};`9`^I~Ehr$f>i#_RM)qi9I;h*ikX8jr!QXpA z?&S%kCF*YDJQM@#ctw&z2G8Ye1T8=84|HNUAZFENak*!hnI9CO6CMYEbq>>*9bA)h z+!G}4yqlp=`V}-tB?>iVqq<sl);tTq!BXp+Q0b(ErYvNyDc$DVI!t?ktrtI_eJB=J zNAof9a<;7r&tP%*&2E1VJ;F9=;B5`HZFy@v=Yq_;N>KVf{7Hl{OSzH`+?0Z+!woMj z72F3L(8m-nr{cd@e^|gn79*(6C!Q&0i`&$~?tY`T#x0Zy?GJ+@y20PUO&dhssX2l2 z%impM@mhm+=8)^;I}&|h2bE4ORLRx!gJ-Ar2U}wqjlPoHsd3>iFtw6wDfd&oxL1F3 zsf-jymr6D<kB^`LyvgANn^Z&GAh)V}8M^S{WPpaekXa4cH&!?R$;-~{63xwygi4|= z8gFkxQT(MKZnjB(|7F39jqW{EHEQW)K_sqBCahgPDyOCatAG+LZbUiglF3aB>|kA> zr0=X6fhMCo!C?Pgxw9NcjIpjAA;_eQ2$g<SVOcjVxYuqB{^R9A1d82Q#Gup?@M4=D ztaZ3uE(1rfxf*}Bj>cg0%|=sMR9h?U()p>|7{kDVJ63b3R#5{x%&T|b-Q?cfAn_wC zgr~JOB&icT_M|?ZcRBm!2DNAQwKaRdDGWeCvX><2*Ntknu>I$Far(Hwbm>m86?Qhq ztB8#|qk@~ecAHCer5O79VNp<bWN=1crPz;+>tDa(hdmxKAMZdibMA&5C2?n4mjw+R z%fcVUBuc1-Ae$AaRa$_4*=K1$GC+S>KzhU(42xHt$#OxmDJ!B!(nJ5n+hUR9-!C^S z__JR|O3hd1UNZ@T%BHn1S~O2gqTlr0I=XOD-U|{rHQI-w5FL5xkv4j)Zy_ZX7wRJJ zYXkf&(WQD*U#0i547&!>?`#+L!3v1`I<$W>@udu}bS~Q~jt?94i+gHKRLmj+isKw= zmxz8**u@?FX{RN<@uQ~wmJw)(x|ig%&-v-ci_1kHEcgs<Zr(<c`Kiw!{98aUe6>n5 z`?daCM&`ZFq!T8OCziCO1o^${rhv_OS^eB<@5xUd%R~O6cl(rbBR*3~6g!$9ivLTn zDxWzoF1*)i3cDN^b1*N8v<p7VC47&lX!Ml?EOxUjm?~$wgxJ4TUa+v5SYqEUseLGn zyeS{qarWn~QwA2PE30kayJ1O{(uWZ!4hXl)4fOl}6T_!dJ&<W+KI!1oyVF^(q`qrb z;q)!M1BCw*D*N2`sR6c%!^xsk9Cv8S*{qgNJ9$<rzXB!Nv%$77sP@`Jr_YEWMjL15 zKfei1R+uJjX|m_!ck|iI&wpM)B9{QW@d~#@vMoXr=Oy(3ZCbM{f>J1TeP>pdnOWTE z;34ZS%x;KtWnU-2wicP!GwwG0Gv-~o!x&Z8A@0eSG@ziW1@^h54H}>F-@7*oCY{=f zUHWzbJuRc&WD&5+cp(<fTI&OKoIPqkAKFvlV>LkAVG@0vT_Ni>HfK}c;q|HdI{`}A z{_|YoRDkO4OY1*mr$!RJFZ}<?zh%BDC#Yi$oB6Jc|K6<ShAPQ1py#$}oNCHcYv#@a zr#`b+Y^dLtYvw;`YiHgx;r6s>Y*)%{YuYNKZLscC)ecWis*0tKi-iRNBP2vZB2bTy z4b=Gzy3TqcHSd8U%z?iBhEMHB-4pII#+|b4ZjU%&l>l((;O3l(F=umLiE6M4TYDis zfHJEVH(3t@!`}Y1%xa_KGWDB-Wa1It0k*2G_U3Rf8>*v|Z{_j$;EY8bgp|Py1+?`N zrntC&;i~7b3Oa>-4rnbJ`QDs~oGG!7C@QL?6l0oEEVlLII=yUVGDkQ{ajllTN)hD> z_BybOf%LLYedAE|N1&Fl?0W-4LK!VH;abL_+Y@_N<%qZ$@tGym+QE}nX}qT!g2glh zlNvz_iI*dke38?QxaM=LdzO-Ta-IJo_;GA{1WlkiJNoMh3b>(J&8CAXFJ4+8%W_A4 z`n2|}jIuRxNx0gIX?m=!_)Ti+AoTC}9K$<osrdhN(Spj@zqW?Fj;!_)+vg6Bfu=UL zA*9P#35_DB%c)rkRlD1i?+~&jtKgE$KfR~3*8gHj=6PW9N%jRxr%E(uus7}jwJZnQ zWQDBt9G4!E(GExyEnHDhm=08rg{CKM`@D0?pwjj)G%1c%bihlxKG>VXJ{|GqOW?O= z;Ux`rM?$xzQBC4dticntu+SKs9Iddf7|G(`kDyZJ=+#^1JY)o`kk=u)U&Iv{EmDvD zH^!#@h_lf`V?5o-RSZR1@uBnAHvJ}=K)c<C^WNVw@i--qr5k4vlvnFLp<B3b(JHJ& zz4r_==U|9}1<G?BTqn&j>&-~#w{?P>WE!r?N~1gN+&l+&GBI^Tz*}bh<qx(bD1~Kq z$833d9U4G+0Ku(+gX@Q*tGC$DxP+uTx;r=4&8Cgpz=O_Pu)%eipZOCS&V)?AG-X5$ znHjazbg4rSHv|y_Uv}eD<T_JT_3FP7op#Jq6BmH+nNT)4hB&{xc*O@tt6pz`hw<lp zMOEKu9vp?CjsE0%TrX%N%2xD(FHBA6BU!`bS8!Du3incyasPQEM>)<{;4EBr6Z{<J zOTbF1>!!RW{q0f-V3>NMBtU*)mUYzkz`E1lsd65czRP<XZEvr*b;Ws?>6VIqe`DLx zp@{?)TYY+=yJg4lPV05Z`C}8(kNUOu>XYM1_*#Mb)e3eGC&u$!R+i_SUD3zBB8v#6 zOLck<W*+5H{wf>v3Ya_cGIpeWO>X{WL>~U~k!Hoeo|5u~R4UCcqIX4JQtE-6o&5$k z=ljN({3RJ#jwt!}YCzOlH+!`Uv0E=b`Zz82oB!Xtmq>JA&G%QTmsJOKVORgfci2-K zes>(R;R|msI%df5tzO#Rtpkl7e!U&OR2rVpO_`KV-wR#e*Y}6}7e_=TO&9Ws?k>Bt zBw!E*y86V#54M`%9S<9JYLUUEeAcF}HirjlIuRc;WSh_p)6iNy=OY+L>A{A=GsF-# z?D;Ax+eYmJ3u9eGVQc^)j1<AiOgeNB0X8U>QY)9S)!=4>-ZMU1Uhtf$Q7}JIki=*? zto4p^;DR#{VH^d)QpTJWuyZSKn~lzQOhAK$`ilzgSAbk<=fum9OSF3GUq}#f><SOY z1xLviUK}Q<AS?=&X2aW--J3N-8}(fMT%lzfY>%`NOz2=-Cz{85Mo%$vNFoq09yN}& zg_-*E1244h+RuYE0;F&P^+rLnhaS98uVJ<<ATIHVQ=iq6!Ay?-7y}d>Y*|KEs4MtN z(au#!emAa7I9X`=0YZtbaG}{<4|2~lc@XiDo^#1zY^ZG{u5|?__sWW4vf$f`GKXGr z^g<o7hI<j}a(eo1D``;hL$$)dD(W~-7$jS=^(U4V>WqDLZ`A(tD!Jm(aYJ?u_~nh3 zv$^u<OD#q^`mZ=Bra}mt3-{M+i|%axm{DV9!RjlqX06`|lL5Os&JQa*_3p!4hbFzz z+pL>BF)q9{9w2n%MR=Fr6tFx-?&p_Lvxvlc##zBd(~v>z4*6^_gnO-23>CrQsucMV zw$Uo|IsyS><7G&)2}L^dyLQOkojR4eSI68R>?j*vaLrDAEoo%Y+AZ0Gj;tac)N8mP zfB@kA-F+9+kxxe5R?F8PSMx;k{UeDL_^{9ykX9I>%*@JWL_qM{4(5rVb_AYOQW`(T zCbmx$f%Y=<6Qonkm6-~C77$Bc*?PkZz9oe0^|xp_=1;lphGwiSi)=;kha60*c?5_C zsbA)S?>;QdUwxBSN51RDr*;u3*ViSN;ZFR&CQbn|!>O6f+TCHd0lOZ#H}80vYo8?_ z`<Wa3rhI8?A>os(Y-C2Z`pI?fRQ0*4Wdrv8_=<0bwgsP!FsI@R<{h~18{?ZUHh<3B zbZPqFf<t3|Yvn4O8Z>Ac)@skLmjzX+#`t}kh~8dQ4AF=80U+oSwYjFT_XV3c7{Y~N z-C4m3GRN?(ZPJOo>u$a>m{G8g+Cy`vFM<H6-`w{AWNi4Q!hDih0$mmXOc0^oaKXk9 zG!Oh$j`W|b?MBD8F5?s$20!gknw#D*GrmsW+Bg|Su<2_UQSA)DE^24&4N)i<LYfIx z&^VK7VTd)u8ZF}YFkp<!&uJ&Gc()(jd-Z``fO{$!5}!}DrLc!c`%(U(xD@3YYHrx| zR+@=3gzQ^>AREHyuWySDLe|rk03Z(ZlYY|Z{AU<#Q2WOvVfULt$~uT;!C3$X`na3% zQ~k8zTf`uTSM5(BC#c6+k>+d(R|$Y9JxK=?5y%7`Ec*8y2u?)jY=dP#Xj2rAU}ePh znN;co;QGG&3hC~IYwR8Nweu{y#y|pt{GZDPq6?DzZ5{0s{m&~PT&n1On%0s;nEk&` z$iS}I0_9HtWyCg+$_gl}NCHCyN79>xg{J>L_@C|Q*Z<#sVFLMoPeU0^{hz`9Kl?QH zyQqQNRw45<@WP(R3zJF`q(~B15g10bzlapE6S02ER4D?4?oH<3_OJy<xc%b{e$YKO zXMc6$=k74@up!@{**cd$Fs$-md;{2W2(wUq%zaDgo+y3-7m^b3^kJjUt^;Ofx4@DW z;9p=2f%$Tu(Me#({EyZp`0-F*+b5LYo^UbP`F=mdgd6lHqhGpw9WI-V2j(CvJCHLS zX@4ant{h9g1@J9B1;AiDOqwrY=VJWvzJ`^l5O)xt6Zr2;8vmUl2>Jlj<!H1b)$=99 zUe#P3*&E&SH8l$v)$0A!3!j)!m5^Q!gA*lJEM&_M;hi=|lDR49pU%h?j8NF7b*`7~ z4)~ZJ<R2QE*aq#)!8&{?q?n`^Zxo0@<JT?-vt^De09!pe5wwdzZIh!G(_p|qZyZf( z^5x>*Yi4c*s9XS`I2vx)FU3DjJ2jf0Se7pBggTcP-FgY`%6qr)0M3~*Gp&ZOvp%fc zM{l2p2A3&<+P+wC%a?;&E^iKPdJ$wxKH`1rY`l78ZNE|+Zw7bKZ~AuWYd)3mk@dIQ zT_~<3sQzbq!Ri54+q?V>wwXHaCgf{a4jJDK6w#EJ>wp7eP_u&xK^IBXv1y-RO1>>H z(|k{8uK00#k!z5Z+(2X=cLTxXZHSa6SX_O*fP)SMxSwnkLi_MjV|dl#!-G%2Bjfd& z%VN8|k7_Q3X`CF|T^sWFsK0JdSD#|{CFhDxA7outbv+lMys`4h0cF>X{an4#t7~aA zJXEecEO?1GFf|4Xn=!d~tXNi`A+OheS}a_9u!we9x%=Lh)$d%sJQe~|K*Dn!zKpW@ zu2P%#+4u>+&6ftSYhv72?w}6=fAoQZ?c;`^9TRT<*o{PyUKq<NdA(suVG}R7RuR~8 z#e>DS5q-O<4ZL?k)ljAxc!B4hAY7XPc$o&usLyy@VZi8@_PlO5m8ih)sF}a-h+;ea zU7me;fLuwK!ZCQo^SW^%uS)nyaz*%~xC@c?(7nXtjrD@p9qt;MXJ*Z~+huZ|-tVeD z={Xc#51;Uy8JA=zgtjAZb=SmoA~SQeH{WPj_&{*e@??Q{M#*nztU0dviA2v+z6UHb z(>5xb_0IdtW5AXb=hl#;2k%b%`<n^<*Cq7zo%iq2B;vG3^EU@FFdVX4gFGb(d;Ed) z0qz^o=)d#9>&^=f;yID^ipX>DAq%}Sn{#OeHw=&6<QJ-PkTK`;vs|rkLazL+`Ui6{ zP9tJ?#Fx12ER2BDP5PJMYOm!14r@zFc(rM`wy^`kGm!9}!?=6PI5DsJOcKYqkGk*z zBdcsqm<<D9a2d7yzu#=a6Q>!W;}flmay?jdeGK@FhiK`M5oWjCF+3O;@ne(q@Yx&i zRaSB;^b`ChY*5-koJr{0+QLxuzW%RhqN@1QXJt{^039y8XpMnv1>=xLKB8wBFIh}y z%0Mu9!D>weY6Vou|7a#ch0b}3dvJdB9cOy~5EbMt8NK`H{C(WE<dSQ4U2nFe=Tz-7 zU7>l$FV&F&2Au14OperKd(yb3CO^$A4LB6?m-MK~{#Xls-*RGUpAK<k7MGJ-^xdBM zdL#NlH=UJwXL{nsp08bvoe@)NzLyAt@&m)S803e^d5yhfpZFFV@;cdMA<qY+A9e!= zn|MU)@a8HC(U4~4?Nhg0hc#ncqM-dO|MJ$-J#qWd;**JmEm+mpjnAikT#UEA&23l# z53c(T1Rj2Rz*5G(xh+iZM>oUn%@=>1nw__VW354EMHJv8JFcy%W&bO$0kJxn-)2CX zNY4r!_^-5IMw)!dW8tRZX7g#}(ET7Jd*3vhF7;ui=c0z*ENgtU0xd^JQNmCLW)(3E z<@is0W`YO+fUu?K2XH4tKuZ!|im;^82NffA37S11e?>sti)fC)@9KJ3MDFa&AAC@H z7{C$@m$++MP|{WuP?Q0a<l_qree)_9i}2yw`&97qQVNZvEXvW*S^ia0CaOJ8F&R!q zCF7A?z1RBPFlx{aJXjntK~=~jD5H#v)LD}}!@~vo(Biw2YkNHGA!7ET?z{QBZ|!a% zG2QexSyH1vVhnwxyhFmi$*9sAzP?f2;lh-lDy{W7P#j_BJgU1o=5~>oU&?nZ6j0na zsDf5-L&7A|FnU~=^<K~|OazpqBq(Z04oCYbGuxGiahu?Uy>|Ro=l$?8ZeHt6Uk)@8 zL5$OtQITT|T8%>?VZEPk|Kxpv2-?R^7j-rTCtZ|PZo?|)FiAj45;0O?0vCNjK{1U- zK@>}DX7`Kle0~jceMZ812~6~N3>U@!w>m~XTkq)MrKF_J&vq7GG6A<AHV!g1rD}2* zQx>V|5}QUI(6W~@HXn(OqTa<%T22X6V&(ShO{3WG51^30A?8}C{`3ZP@AEFHD5%E^ z87?ssWt$+TDG3>h!cKedx0Ng)g_jMql+)(v+!H@uoqwddFk!s)IPWRXjmrKed;Aof zno_RIj<>x{2n|E<xPP<&{EpgZ(~4YIVxroTz_qm2cO_Dk1Q#KN-9YG8Or^Y#X8bJN zM%*K}?^oX$N@(60(k`fKi@nX5G5vTy_)q|yKXe)FySfY9JdVRiD?M?NQ$yL!{RF%O z?V!d9i8zMk`O;sPdlS}BheuM_^??R?Q?C&<Qi`ldAR#h}9;h#MisC<T=-?nrhO;Dl zonNQCqL47ql98tj;P}18As&c{C8XW?cZ>xu+^@kLT-Q~r?KpdvwL5#$1<79_dAQ<1 zs(pr@rK*-p@r?G4cY*Ow5;V3b#bpAest*^sMhIxnQ0W%BA?+CHh;Agu$csvn$J&<8 zIFmw~qf(M@1oZ@6ERyqZXQM97wNy3E+%!-=jWUM180Gl!=+m3O#V0c`B!^)#?$KQl zBt!y#x2{%!ZE+1zU9L{VRrZ#l4xF2CGZTlRupy=;Nz3KcL}1|e1$b@8h|^y-`fKf~ z!|1)DLdWQ<>ObDWBDF=Jx~7+gvg^G}H>*4)Ebn(MbcJu2!_*N=P)-pta)(UZ*vAjN zLEYYxFwn#YS{ru9cQ&G+OO)0RN}~KBLjdxmhc+mMQ(67fEiNIW9nzLFDgcNfT9AU4 zr^|>?UUZekDj^Dsh7=+rrir^+&>p&&Bp!>yPDBzA5vQbXI8u#8lp<pM^V+`Oj^JJs zp|l{@qxD@2U4}%g7J?z7V?m&o73_HDOs66L7Q&9;VAnBCcQEPOe%9v?>3{f;!T7@E zZHLS8OrecTcSR2w@nXXEt)@zHjA`B2t{g2uT)S6U7S%2)EXgV<V@t1Pwr)jG6v*o+ z{QC@EIIRo($Be10sw#GNl2b)4TvSYVg&*{<4O98(4Y;FO+Be(f>gz&xdpsQ0!jO(> zJXo(%Xm*xI?ISELo9VZ2%5*IRMgHxaN>zkXR9{BsuMus!gD{O>fs^XE7Ry!4muqhO z>r=YVwtK&tHbajM+Xx&@x=6O`4KqKD&`RhJ&n&d3bh!swpz{^gRfUW4bG;rUa=Yh# zFJ&_kf#xgu&go2QFqoj6S;pJC%p{2D!euHdE3iA6bZx`Nk7?T<s1ljqW`&fOk|l_r z<&@DOKUsBNY){wAg*~EDtu3?kR3w%GIj47CSM}5WTu(Qge*#wI4{J-&x+53FL}i1U z+92xu_GfjR<222(5&x|hv?b()D??H0sdL_+<GFr%{7|p<<hgI^cOILbP*ODh+r);& zgn5Rw7Ww(WK7q$G{1ucjmyGive*WU^kwJC;9J>uFEtxW;;rCnKy2yZ6b0yjXlFMf+ ztGeq_L_A>DIn5)rG&vVg)CI6p(2K(qsLMob@&{O?W(tkZW!0|_JK1z$Awz~e<q~d% zoTXm_7eA0ROQCCf&TrL<Y&$1ZA{07A7*;P@=Uj55mUVa4(-q$D!YRh?NH1<s;3Ir~ zd9TJyd98c?;yuDMyJ*{AslxA{)zrl-+Vrd5J~>7y&93IHmO7agKbcK*PY@4x(5@Cw zGukL)ygAl1+7Pp+QUvp7wR_x0&{O|9TIQ{i;k`kq_ACOdP8y9(|2!!z^J{A2Vp=t4 zX_$O|VE4nG*6xXFHppverk*%MAAG}lZF+iueg*oJ(&NSMT}}`pi@VBlgtULiRq3Y< zJ~IY8FJlWf>svn$68(xfxK)2b4Y|8-fi^RJJShHLE3t%apGjIHX`D<Pz3Z@-rS_H9 ziYKs<ta_fz_D`!Zfeuj(GKXr%;_yMbtLCnI8?w0|lRsEHNXux)43bXH0Hw62l@`QX zTIdo&d3;bhmfE|Q%q{jheWIF=4bk2;<V_phF8_vbr!Afqn;X8?{>teVF?ocOhVUjp zSK82U5yVXwCkAHkwv5V8s3;b8H$`KtbDflx=P^4nl@(P@+)<HMz6;-1Y;dR|h`l&D z2I=$i8Pn7U!Tmz;URatJRxe|ypcYn_hTX)MoniJJQQAf)N$w(=N@~TANU3fnroROx zH;XdP0%ZRzbSotmmQ_udMJE65uFOMzSydzB1QPMEWUybs15{Gcbjccxazak?`d~}A z#A&Vdj0cSwqV^M~FJy^B*K<mLM&)(>qeN<2`dY`vv?*wQMq{+sQLpoB@-VF+U#wdJ zd#<7_TO}}02J1Y}+d{71zMTn#`Rn|`xn-&qdVjTgF6z3?&9JA%!rCEpuj*$1g?13! z-&qwBujivrjO?PuY;KprYfd^{_lamSMIyaa=gX6d`?9kZx}3PtLdwwv<W`40YlCOH zVzwzV`>gMwMJh|3pY)~I+BQ35B#>Edq7zlv@&H%K*3N87!}xF?J}M^i|K-`#%a!2@ z&G<;R+?hRDT{O3xezi}F?`e=+0;Nd!d!p;L5>`K7C}fsxj1RkHf8nskUX=x$Y`IYH z%U(HLN`hD@)hHzjS>AwWSbtN--PMDC&x#03>;EmXXZj~*?t<03Ls+h9c{x>DBZL&5 zJ|VDtq@e4VO)lr_;QZ`H^DLC)ht;Qu33YQx%6aJH{9;Y?0dZ|Ozlot!b`TCq@ZepN z!@?LFdWX&N{zlP-KbJnG#nj;ZFq=}EU;YXXG4%7a`vj#sTaJLB@cm<Fo@(z<e9Rk` z4eK*pGDY&e^M#%*)z<W;WVgi95@wGACq#w!R(dx0lUl=ce|U97YS%m+)G5urNs<Km zW78t&GclVNousVF|LmS&PS@4A*@bCn=)-(j6q1#e*W=V;PP!QO>?88UaZe25!tuyM z0}Wgi&d<^YQ}u<C1U&S~iZRvZuASje4g}TO>j~5`g{LO26Q%U`ETvsT*VnnL^G3z& zBFSRxG1Zmt(rZeRE2rTw;`>Lv&WgdVqb`{2Y_h4a%$gTqO*!O5Z%;>%iQ=9gkmR_w z8QN|#7Jg;?{4(xP!E2wISzM{f{3vc3PVnb%72dypyo%Q=c==o2sT~h^Z}<yH>Nk`R z8(6%yhOwp0(em?>-dD0UgDBDOM4;|bzsdEIH2p~Q&xXTr%gifv1!GXPS6ZDp(7G)d z+q$a=FttuBSb2Qs&>*flBaCIP%73&oB>z7|y<?CiUC^%Gwr!i!cK5XHp0;h<w(Xua zrfu7{ZQK0z^PcxRCu0As9kHq^SH`N$JFi=_<!JL4TYkeBKR2V_;M8j1@eF-<@$sCa zEloAg?-hYfd#SO)ve~>^Qe}a3ciASm0otm{?Gj5E5&s+c$Ru#g<|$Ne!ck0`K;DZ} zw&)GUGn36cVChPAPj0xDSHnn4TvO|){W6cvK&=vi1)oXHZoHNx(6ANzbx#T-KRlvK zNoBBBOY>*ef&;Upvn?|Lt(&2{zp5GjO4$2P4qsH2s;)=UQq-PAm)oJ}e9J7?|H!S^ z>(ZN2dww|w^H;o+p79_3>QRRdOwtfZ=?t$wM9Sp`*m${uUHF~%&GN6CkAt<%t%!*m z5%Kk;55)H^TQ@`vay4Z~mz?x20YFsy3{0_Ft30FWl2;wG^0Hb;5Xh%i6$ZSPP)RZz z%zj&j7)?Lf=sAt*eyeIsifQD?#fj?Y1RU!z#(K7!;k1^$Z#3iJa^f^W3uZ}BlW5!( zqeT>(IE-0ipUjQm`)q%Z7;9Mjt%}e?rI5`>BI<173a31mW3k5N`5I3P>2D<gc*?6> zb2vPqk+uyi>!WBLV~BD_wdLfwhWbJ2*QP`;DPg&NtGaZyAV?;m(=iF@#)032e4wCk zjY~|I-`HDV01%u9EDj{$E}GiyJx2vuC+`Q7`x=o+Ag4%n-;O18&kIM%Pnso`gt5dc znQWCU9KPw~y6nZ;=f{rB=Wwt^=tZ5qWUumRg9P*kon7zKz=hZSRpgL&mpSRhF=C%{ zB2HnniMgd!Vd)lLobDB24f0{Te`Q$~r-t85sz*+Uo+7625D@+t!=nq+X>mkJB*so- z8Z-)f9C_(y8_^|wRYf1;B23S%m`l%y%acea`$Agq!uzU?no<23w^-HYNOM5p>Y`3a zz*Yy71X4}a4Vf<V=oiPnAwOtU0*^wDL(;#!w#dkcCiol8$b82EMn@}8#AUx9_@JL= zv*iI8Lzv9yfAz+Pb6y_ib>X(>T5pcGveP0<P$)PuojJ341?uw-jj<s}=-yeAJUr<y z4<F$xVZ-<~Ljn9M>)~n>dF=a3=leJjDxora&#Erb0=RK9M@V4=rbtylsc0~Pat1pa z;YawabA${aV^th=uC61bB47l*5hBBf$_kXZSr_t^S7>sTxFSEY8(793=p7%|BB5ZY zXaG^xhfcxei@oiH->Fe&CO@jY{XAnBnTHRMQtq+n;oY6K`U~Gg3&F9xmAq}+J2D22 zkc2ubL9Cg*I;GJ8icX{K%tMeeMt-D!JC?^bX+aIX$?z?{_sf^>ce{O>RYJdD<Voo3 z7G?he2;{@kWc<{K@h(AZ8wIlVOYQ?hvK$*7I@wfQk(bx%_K5$@#>KqTplYafcR)-M zr0yQ^Ygp*P&n`Cs`$L_!sZh_iskgud(~4oFZlZWZ`XFImVAcG41N!@f(xg6himN*P zWAcsoXUx_oyHb>I7kozN8=cl=p@SnLIqzc7Ef(Z;_V%b4AHJy-g3-1h$7JETMB4QX z;_lknS@x?BP>@XOyk8reDu>QpG}M3q9f;owKut9{V0g!he8^C|ldO#QGI3bm+9Fk7 zoK2Ki^L+AJe;xR@vDBz1?{(l9Cats3{gQH9Ih@B}?wK>^KUf|=odV&+jcP7l1Uf=< zLG?G^%KPo42LS$R0*4~kx^dcr{ho$;qSFb52usY#iqZqAcE`($9YtQq#JWD>ueVhf z_a5w7ZBb0n6w2~5ONszyf|7<NHa-xvI`wm_GBBR4pNJo7fB!;oYTj~URftTt<`%I~ zJ;!^GK;9@A=QeF?8WceM@aVTcgUX+c79bUihSlR9xoLzRdrVQ5m0s9A4?6PNe;i<J zz{_?`i(AbTJWL~h%}a}RQy(1}Xur?Ty7a3-+hMfS@WK6)`qReG?41Y|0#1Eei8g?q z0J-%&4Egv*DmV>(1(Dt~muQaStEBd^m9Z2RELV~?y?7?!!*<x?gb2COt*~oaLF~sR zwkNya;SPp^ZZK|ELY_do35l!@Q(6qM*F2A}r~L#)=k?q1_C}WNbJRCGGA(Ise$tPH z8ikz_U0`*}RD%%0cRS8j`i154laGP_o{U5#x~mMXfEgC7ZMxvsH->J5n3MY~5=M2) zaoof8rsD(pI~0k8esj$QJa1*1ew#7E@K+T!`$pEr9XVsrWd$8!qTKgjgaG_pUJrH< zJVJKYfuxK(kpXfpuPgUt2)wWcOC#y~)jH|I<qY!%(WUY^&LwRwcU(%%rBw=M?96z) z>f9l?EiW=BpE7m!_C#G6bubjjZGq4u{WZg$*$KNe8=TZANs~%+6wMybL#GIk?LZ|V z2DAAsVP#AEkcXR~vriBd^gX)oAm|EisyZW+=~%YGV@vmx^^M^^IxXt{H}{R(sfND0 zN+wEq=zNAJ_F?GS9_Mm+kRe?4hI6XUvtny2WRxoy5)ztJZ3hbz0uN`M1+xy^<Ll*z zg*DQO`w=^u_$VyN&^PFv64RXKzuKJr)+~2<!r+iz>ZBoz$>zJmOe-Sfz1)3YNCNHk z@wvS(jYUED7=#_8RX<#>YrYY+F~>{vH9<0H?G~MFP<jo>^$SFk)64<u#)rW(2P9;J z+$Z-{6avYER$g$ATVR4*^~o2fW&PGskSN@jJ2dxeTr3Iwzl44L*V<Q8T=)Mlq9Cmb z1tt>nYz*%t(&}A`mMG<OxicH2eAXw<eF<EihWgI$L4tSA2B-tl#NG$y@ETL-m!~(K z5&O2Jqocwla(h^oerfG?ff}T_L3L>NW05Lb6OyA++tC>kues8d$00b*o?40dJX8^l znPE9IhRuGeaVjSf3hr&qt>UvDZjhUnT}BMkD|@Tq$(#@A;#m>tzMtfxCTCJ^`%z&d zK7R>2h!b<&H>cDfCIAxe{Rv=P7oD8*pi39=ftoM9bvhb*#M|C|cSk{PyGD}hjR-`z z(B6$Z>I*}dU4FU1t!FFxlioiIP?Stos?Cz}{Y$^{@vpX3n4_D(73d&H{+8bTp-mJm z7}`F^Vl*?sXO_dou-*>8d}<w2BJ%;b<QX@ldQS#J2WC&Hn-x??ZY}BGX4ZC+4(Xp? zT$j_K=_Rz9iDb%0Z15)yq}VQpFb8%fC=5-7?80FDs=WNIiPt-yQ)-?Zby5E;sM^-4 zW~iatruU#PRv#C1r`wv2vk{SB5A`UY1F?NnrWCG7eSaiPk~EyCf88InO&~NseXAk` zUVF3MBazahLV42<u@HL9`+6fz70jqjDE#4xOc4(aOkad9)k8b;U#MI@wF{lqBXV7H ztglEp6)(59PdMgn#FCfKz`+**YCUo#A+DLaPf^Y~jE);KkM$Nv6{zA}B~+9wX{@1K z&h2<$(=gdYjj<5NcHm6uU5Vs|5=!)p?k!xvE}ut~t>UU|#|dzf9GJB5g(_bOvp2MG zYvgGuP1+;7^C3Zu%9{REQ%>6LJz(N{)#~6OW#{_!BG?9%Tzn(4t9ml?(8061-H|j4 zXe8noOos~tX4^_mK=RF;yaBAHnghqhr4WE8dw7~ODzx4CnuZ0R-l#=-Z<&NB!4eFg zFC_@PwA-`z1p2gGE-grIm1lN(&4jlWVsm4?x-jV-H!%pltV_N)@}*sCLi9;g3AJ;| zD5~9_KpP^YGhi<F7G;4E9f>X`ZTw`>qh?^tk%F6reoliHq^Oi0xu$f{z0${J3y1M~ z5VOZpJd~#|%SG>I#A=95^R-)2z{-)7s+}c{_FweeVmd`&=l~u(o#%m0krJMJun`Dq zi4{y@$2pBtwsZtd!h1qAuRV`j3u1wMX^r`g4H)U94;R|caHMJgqvY{dt@__-j)^J- z0hBOt&5ZeX2D|dSyaGbE$na6CZndH|G>+W~_U4!K(Ox^1)5d)mqwAD}+x6D8`N;wa z*B0YELB`{<*u$2>d^}07hVhJ3uV<!yIfi}lr8cb7tojwUgx_sw;Q&)=?+ob$cn!`1 zL~cl1rnMfW1ly1M?|r0P!rb13x}3SMO1>@Uuv(G$>x**u@_@kA6%V$$ESGLhaw%gG zq{Y%@cc|>^d^ou{i(U&4VV5nbfQP;;2Z1`Et+(b=Tj;(*3x}9_vH-gh-sbcm!I~Wf zY>(i={Nkdn@|k*t`nZ_mLlRJxlWV~lR-l!Wc?US5a}Wvdn%o`AeZIxw1XSOQECIxm z+wk&id#OXkD6fxC$*!hcy+wZEWyz=z_HJ#oU^2CP=#ajmt=C_j(TckU<sc)uZJCA@ zr8C+o$aK6oy?cu#v>GXk<UD(PS3K;lr=u<S5DRPWJUn1`_sa7EG`FYgNOBBU0k$j8 z-X%N%b>c#t_nl{7^m~f@ef=*J|CGyMw+9Xytlk{H*nFG4#T2BqNTq@#1@7^~%qr%_ zjB#mx?v9ri>OH+uy%Khf-!%V-)uav5O1$C=!lgNjA6?`-v+$1s?||e|eesj?i6wrX zf|YdnnPzO`xo(Kt|110E8@m9Lq;V#>euh~7nZ-1U$#>55&Sp}bdu8j(m@g6+xnAhA z6m|2=($Sy%!W>MNy5S0smKKZT>!1mA$JUh^VeHv!6Xp00XgvrI=b1-?WJ;s13SzfN z{=aEZpeJmH-3Xx9h9CtV&U;xD78cjzT;)JiSQg#+%M@bA{1xNYu*3kD_DD029xLXU zI(7)P@6uF5^N-t-=`xO%&Yqg0<W*Kbv4Uj1u5<=M6;O>Grqxo^DIH=r{XjD3^5^>p ze`@8L5>ah2xJ03Z?27Wyt)spn3!4O*YwgG4pBTOyWe&qE1SLB~!rM~9|JOaif71@% ztyvZo!3Q_zo!e>8Vhi^#2}t%m9y3X9B2uP=m>})+TiLW=u5U)XvME+M6cB6sWce(} z5RJmu*HeIE-~#{~=r`4B%RTw}!4C;~MApMzNbg@i8G#k1^I5_jme<s5;J_#f#_O{0 z)-T~_9A@$Fu~eS0Au8HwoPzh}i{+KAZSRmLcCWLXK_|^d#H58*?#^yKOGSn}Zof=n zK5!sH+DGsl)`EgFdQp62b>)W=<9u2_rb@sp@zA)lS*=*rfDs$GIXky{=$xr5q|k5l zTY}4i?FoTmDxa|VpJxHTH$vtEqm%9_(@Bi0YN-d3SxMB?eeUTc=aBw~b)X~8r3_My zn&+}<Nzn<=8?F}w86VHXpaBQ$(lK*2Ip2#-SMJCTJ(*M{He*D=;9IHcDN}T7vQP-U zM8jdRq@j0pngNT}ur)RMs(51$`q3C|1BgWTVwjPZ%4xSTTc#J`E|%K7_l}Yzugi;@ zlik7%7EVSX&mFPaKFt{BO<BJk9|Pg<{~B?Y*=K&l_QNmuUsN75FN`8YD9tPBg|IGf z7BTcJ(`0*jbJ^jGrmsofp4`p<M*cS4QgtDU+))X8t0l?k>{4hq#|ifw$h2D$9^QON zM*jY4((gWnHkpQXSmi@#YD+b@y*s&XFf4xhihDBB<3vnKrViT<XWUpVTS;)>1MkLj z9+5$Mi!S+NW>x$EVTbJcfmB$MG5^EiRXv>CMXpnse$VM;ONTT1JT{==xQ_b}&l{O| zleB9eKIYkDWZar1`?Bwl(vyI#KntZZPyQJ<Wm5f)89jSCLbLI^x@5UaThS-Uor`is zK`X1WOzO0AO2i|3n$a(1{?9#L+l=S++N2o!2E>}D-Zk5to=q%~N{g7oMuEVBOwE0k z4>A*d$*S}aiY<~^PmU;P8neYJupIw1k(j5e4boVkyUn~`Snduj3W6#?ktr&tPE}5v zP;{c&N#4blRsT!N8or~hB8xyP_T547R1tX=6D-kk$Fmb}KVDhh+;Sm7fNSs|X#)HE zf%|=mcc9!qIt`nm#$Kqi1`@Kh!IVOCC$_M#Ppp}Tl1jd_9#pb>eRdkzNiokW!U$L+ z@}x6V(r!0lI`~67l7>wF^j|w~MnQCGFy9mfT~p#dMwDK}xBFM$765L<%oQHmn3(w& z?hXdY^YWj09)KA+`#u#y%QRHQsomy#^owIYK+EZIjjx$wB3O?F9`n0PX}8n7gV&v~ zZzc6MuTTrS<C4f}F|PJxq@z_Fjola*T?xrGmq)-AlV3Mxr;4!dCnDR~0)$e)zcETS zd}WCB^P$KKCf-c<?a?9ZSe5REe?b2GXBc?lXQe2{z3CIsCmBa!<fGPWmz;|P|86b$ z!<vDgVhWrz2E#dByj@{^UNRH-g}8=K3=&u3l~jbCSKq<gW;+HFBl}rYj~Vq)y(tYf z!b27hq$lwC<$Z?;M@;mI&0l@u(W(}8McXmw@ukRmWeCk6Ekxj!5_a%$n+7O%rfTXt zZo+<q`36IVAS0#AEH1QwAu}eH#V{Wwtl^2d>iBn`BQ)naAA34OT?c#zi}4b(|EuSx zdPT}nH6@Yn_WyBUfddDsz|!4y|4lJ=KdkKu4dml-{>X7*9LQ=3XSPxdl^yah;TMxG z(U(g&b4_5HH0^wRUOC)P4Sh2yWywMqZ@-WjQnj4Nc3wL4W77Epv^B3HpNof#;Atf9 zjHqj{nuAgRlT1C5UE|&}hX9#g+Me#P-obgtDVtz9Hy@pm%#71gBVeY6#k~DV@u2fB z+$w!dx@SJ?AWKC-!yYPVi>bAkRnMbr9D(916Pa>~6$b%IZkSP8(+7QJ`Ryz1(K_h3 zE%`lT&|5DTf8_^=Z#ixz@HLb#T?(_uL#L=BRMNEz?R`$bct&AlKQ&K}7SAn$G$9S~ zSL=mmBWs+&ftrN14o*flZtIHXev>LvO=-;Fzu5g!Irpxn@R^Uu&*TKcgWfHV3OuaR zseRPz%SdaP1W#cakzVu`!kPx!QvqEtVpszE4-4{)do*TIqMP~!Fr6wLb2ztSLlJ)P zdk&C^eY4Roc88Z+ZQ}*{S>3Y|iK<Gad!H}muV2}2X<2g~QfMFUsCuDw6AXBzcw8Q` zYKBq^@#2K2Jw4D@XC>Y|CveLxTTn636u+o`uQn&2?aKdFAnIev=j}EbYFpb{<CRQt zfV`=@k0s*vWe+CUq4Mq*Y)9xGC>{+=TiVlY5~ta{3ucvfdd6}#3y4I{iiNa)(;1|# z)9g%wvlRUy^rMn%F^>~v+)$;kr+iN*IAJem-dfD$G81aM!Vr<E6%dS+i39rl41$Jn zCZ%}9YpG;s={T5?IlY4{X~{dt)e!$vLWIn~v-bA`fzPitSs{htPsSrL-7laWBE~?Y zoK`Pa*pkc~^?%!8SIxlMmSnmlMDksRi=Lg0(&WEMbc-EScJjgozUv;<t)qskB{nrR z&#LIrj0Q8PK62nzm<6SqV{-yqsj@891&~#C<d(pXu`WFV#Wg)(XFTxZSeI;SpJhBI z#-*83Jm8lEeZKBs;YNPu;6LT3h8!PMR7wbh?79%AXOaOVZK1d{FOEh#f%gtl_w>b1 z&fyP{I>V+GL`qexU)Qtr#{y`+vP{UB(&ZC)oeZ-2U13C@VLGcd-2@%{Uadz7Vzt_u zl5#{F7g!@~@AbtGaq8=$_ARXjM@$=ei&3Gn;c777ZSyQn38lK9fK2f$MTd9bp}pj) z-5Vx>duRFf0GLHemSwACoYU0PRaY$0p=tTl^w{&<PoWN90VhRwEyJpR3rD2P8$%~g z(Bp5ALaLDw@4s5UGpg}zv|2$&cM&{~_RKdULgwxAoa6Z2qh|NmDAN1x;?<q%a&QqM zKHHTnqOZtyUjPNeNPjp_q67EDX7N%5L6e!ezfCx|%x1KH|C_*gTnj2a@;u<Eo7$9H zOvd&H+jDF2%=B+qdozMC#kAR82-T(1Ie#VChgU>e<KYc8(5wv5kGrWkW8bGMUL5TX z7`uaxjnCVPOTXZxQg%l|pk2wVQwgj*LzPjbfz^{6R>qc-pv*R4@G5U>$nPI}DlBV; zzC#wd?Vmwf)LS(((wSDF*>WAYvo>&@Ak@`&vrZQ~4IN*&Vz*TL4NGpZj~b>|ONxBa zr*anTM9|Ir$noPstX!GF7Vv&5uKQ%^r#~N_>G*|dIrbuJD0iOut3h`=a}7}D43sGM z1t=cxphB*voh2ij#Ssf(D)>G+<KTCmuG{|7rkXNMF2-{~6)RC;ooL7ke>#xeHUdR) zV6kc%Krh5KUeQhB&zb^0R9WV7p6pO+)<bWKm)79wgXEk{B;;K$aB7E^<rQrn*|aT^ zxg%b8h>x4mrK6u&jKcXi`t{;TkQslTHrcWQ08H+6>CHBLwO3CAV97|7vM0^3hNa7Q z-^%C1SR&o=E4$Z|cP5`%lWK4?YWu^j)<ux+&B&uVcQFIyL?x1`&YP2jHL&+5w!d4L zhS?TlrzTXF8U{P?B;V}6E<<8H)jXT6!ZMrLzg+nY0nTJ7*EW3@qe8~0^t0-RC9`Hu ze3H~L5kfEGTqdhYQx#&DoYym=fC)}5fWoKCL5d31l{DrF2t@#?^dgu~wdHpwj+%aP zFQ>boz$ArpK}`URUKtJyN`73v;8#&$t`OX>U$cF+YKV&+6?4@-dX22hwO4Y?+Zj!Z z#_!PkCc~a<JddCGN_cYhS8$i6<;<@BD&$It83AxMP1Vk*H~I24eV-oO=~m^ALx%yp z@?eK)a9S~Gp_mI7%1@E~qfW1}${o&Ub!!-3Ni!Erwd5Zao-&<<T++^_P}%BH8AJ@@ z7%OE0+x@41c;w0V)7F$+hF0#(vzIaGbWk*PJ<1=6pL~s66v~<NdQI?=Vat3a<uwTT z3A-^5Y=AeVlcBah!qY^oaW>pUP8HiC#yN_)DFX{|omx$~u!SeA;M#J;MI5?vS?nH< z=CDB#+<Em!jz+T6S<@es!<-hGU`Dhpz;)MaTtahb{=Mp$FrEOaJq$H^8GyP1<xzha zQVn7h4*(uNd@sjKuw*lMA^bl_f;RyDy^68=jy<8bA=iBkyF$OjFnBHE_t2!N>cSV@ zQDFLDPT$KdNOXu%63F_r<@%^6HdXf4KlJAJ`P#&Xn_?@8nmp6|o|S~5IH&NWXKRT7 z$$gDL1_smXLE_QICDGrTvYZk++}`ZSTecgk&i&9~luWH*MaZaHGP)TeXvJ&aLb_0f zdmY9&$M5T(RJo<)`GKKO*-g$(vl_<JivzmaE>ENs$I$Y{PKM)P5z3}^Q(h5j2hjJb zm2(**bU88VfRmd4kITr@d67p*P<++MzHX*{DEZ=W9_8yQ2n3e5|Mw<y1bvyOyg&t2 zxZB{Dz`A<+Xu91|zv&G(N-~#wi_qiG8`o!SCh>)Z7-k{uDufC3vm7g|BRO?=>HD3d zZ4NVX>>)}0Lj)KGD^g9U_H(W&<*)W^DScHZ$gRh0nlWT-9doHp-XB=cT>8h$L8Td) zT(vZsXIqb&d5bOrz1W#JGF|L%UOqGbpbU2Dnbz95uGC<R8%8ChB`{2B_KWmidfa&@ zw%l<nEMt$W;s2NiCzRJ=*+2eN>`@ZyCRR}-5`(-r)#s+WAh#Ogj;64_U9{dS!HD!y zfDCArsxu7lIInpyKw_dY%9AhH@x4@<5@(skSQm0kLyJyD5wMcR+nv?S-&`y_4v2if zVSb&z5OjOhggCw`X<?1P0(?cg3Nd|R7A;<iY4});pNcMueWaVKex$&35p&wpLtGVC zJ^6^o&IEWldGWWvRY%!BcIOlM(S3<iDtl42nNWQ5ONoyI-F4h?@05zlQdvLckc+DZ z&!UGbf<)!ZpS(9jeq)O|v^e~9G4go23`%rC>Q$T<5?f`SDGJmTl<rXNz;4m)rh!v( zp~p`oY0lN)*rDXmi~7Gaczfh6Qd<`ST#5Eq&F2HXBM=^Tzv*$UzdvJ53b~nDTT%-W z3v-EdH7jz?=)%(!Ylva?$*)pqlYJ>~mZT)CZtGu)Wdg}R=-|k%gcxJl2^xLLtA;-G z_JY~6Od8T_7TTRU(Pmn#=BH`tTN<zl&MF7@<%Ia^=qK_?D05d&p#lk{hhh*M4L-af z{8kk3RZ7AFWbl1b7*F#Tes?y*?xz%y-L>EP@^!04q9#CI?tW*WmsNH9muR5rdMqu5 zzn~es<Hu%&ISlh;H}LnhTHj1Hx%j+p5C<FWrJxn<5bwpZJwOtgj3df%iXAT99H1)Y zyyXvGfF8s)gVqa3{ol5h<Go#y+Teu{>0Ld%g7vo#eJzy-1&{^qi>s_?&xawm1)w31 zU2bd*rP~J#CKbY)Nq|%S>IU>}F!xG%L?a<wZfMb|iF}x5JcNvjEcQE|C!Yy{GjDUS z*|uHAdIxx`n(x%|74;k<EWLS9ZO^?J1P|u^kM3_t0IfU#I2clV_oJ7fW}wHgTSA<Z zOLpBwr8EoZ?uK&O<gV@a^kAefRUu|^L>icN19)wfGEkNoi@p~=klC4S@4YXCZpIoK z#P?JopYqv~(H!JyP2xNT;<Po*55Zl<G&JeS@UQ7i>{%U7Z=H@siot(wK|yus2oxFq zs;G=LKY_VM!MP6+jOA#+`sC#D_;>1W0>3*WQAB{ckj*YUPABW%4+m+LHTp@e>L%L+ zPc>LVU04d!w!!5f(r!Bw+$95Et*MKrq{mV^<fS|L8wnxm8zNJT&Ug#lYTUc(PuOm1 zKgKWh=kY@AJ%eB}QBw=JZ&)!_2={Oag8lS=vuvc!BYb^=LPhvWS=-W|Sp>H7ea6iu zL32L{5Z_s<XH=}X(Yt_@Mrj2t+&R{h{}5dr`8bhZokfK{o5bUKXIcrfuFd{QftIFE zcUw=hiW_7J+@5?iNBYtK1kFWyBTITju}G;BsSAw1)dfVm1Z{p><lSD!p&G(j#Y2** zn<pHW(8${cw)boR>`P}z+ygnuGXg^?N1bv5D(%uo?Nl?riL#;!O^pRi=Dqvchtlv5 z?x1ut4s06hW|S0lWE1J6E%E~ef{66cZ=^e9ID${g32R%U1N5<hzY;<OIs-ed3}Ngt z#V5(jML6967ti?vuVOlQk4weQSR2v88u+c@ond~`%u;IIO}x4Yr=Vv?9wOYEf>PcN ze%zNr7IhE4M0!LeiRV@6zh9QoD|$sU-S)hRdbiClE1vsLw%X>Tx_PSq8^=!x0b8^d za-C=hfNz*d(?Kg12EUBIUss+gAKdl~$2M6JTC_)zi`D)n6zOOG?vnED^>v<JFB_mA zlkj`Tt9-}4MWbF)N#wcZ4?{#J^B%i^9<R-P76@buw?|cZZa1nxNSsp2Xef~5$auhk zo>2x1!}dgDAx*nN+`C{`x5c39so++p2XZJzxqU3Zx)RmOLvds{oukNYQ^t!&C6An0 zs%dg8)pM_f1FQH)*vtQRT#)T>9U`kfzDK6@_i0NE_k<*)9fhy>$<Ks9yWM>t@zE4z z_P_GDS7RJFg(5Tzy=tGl*_GmyB%QT&^DimTC=p%tSvV9^#g30ix7zR%Tw$BS2iTI{ zRTQ^s2v`EpVpH8UAGK&*k#L95&98VH!7^@`Iz2tZXW>fBMJmFAo!8BtHJVlcm*<-c z)F-3SKY~OJq5_&ydA=QdJyX}kB#;)*pqy=TDFj9@1syaXEtjgRt{J@!KlH75n*PhJ z@)?$|{60O9rTEg}iAwD>A|IX0;X65VzZ)+i)V}PX_R*bDK7jc&N-HK-yKE~X&237= z1B7PoB7Z*{fv8ygD1cGhE~j5SnmB$SoVr|!v=I8`e{_FLzLb+anVcIEqsvb_6xZPR zJ^ebof#9Qgc0cN>dlA>@1bA%xj3~pSyC0?oxcQP$%Sk(EQx@hW;9PZ|4{+$1G1(qN zU-nC*`8I$1?u7|`2W=!so=&lgdsQL2B~w@5;oNz45bV&h1wtM1p!oU<2)OD-)E#5U zeQ2M^&HAt-aLp{==-5ZmP)e^Fnj8W?ooo!=Gz3!deEeq=QSstF0|TC1-ghR6$Vwwy zx_VY3R=_{w*aq>%@+htW0ZB+{Gx+aF9{29OB_hp`;`A3mSZd*#2fyA0{%*WH0`&ch z4GzFq4lRrpV`L~EV_(pD(<Xby+9)j&!b&By{zB##g2ugP*v{p)Cb$L7l<#;_I@Tv4 z=dKwK>V$01U#5>=T`iD~KOT2pGqOrZHG>b4=!AU0{#(%uw5r}kj&p?I{`K(i)b=5Z z!)yCyZFpDm)jewWo(}Llq1?x`8q=DM9iIe>QWz^#vOY3{wl>z7FUFg|kQlA1w2@X4 zEVXAp;QLDjxgFlExdPg8i7H8iC*dDbHgqKu=~hSm!>U#3KH3g314<4t>nhA$EA}t5 zGR6<Fg&ox49}!ay;@oZ&J06^At`_+Q^~y-B0?4QACDBU?Xgjs{D~1AO{UlEhHajf^ zRH7O*_u)Fc%{p{YeZVRhyu0lx+J&n6NjH!xX4dF;74IYOb57ejc!u}rMyFd?MR?td z=pxGR`V7yw;<L&Jj4HnFy-lsmM=wpPB~W-ReFK(!=b4cFIu0>xLOXZ#c(Y$h+c671 z-!OfDK3#QONS1W}In<}ePHWQ|;})a0C8pWXL^q%GX`{2po<_Xut-S6Df;&`=J(eXY z2?_w;DOFl;lRbXw`l{$e=*C@H^X!dInbq;iVII_!S(N++X$w%j<T&r^&lR)A_-;Bv zuUST_aTX2j``OyZfdnV85z+eiH4>-{J^s+=wL>IFKfAXQgCQfZKa<iiH#lS(udMlC zsZ_ulAhkl+S|<)`6ClowLcnLGQ?VzGTr*sMZ_9qUfHztZ>%&=RN7+%MEpAuELMkJC zCtFoPSOd-x@x(pt=c;RT+|SpKSz**rjc8P5%d*oHP5D;Ctg<cF8H``N>hs=O7~}4f z{J+Bu7dsTXOCSnPgh(DHn5Z$nzt#NMqvRl{swXU)!z#KbT@8$($_4WWi_zjA3siw5 z!JCRT4nxBd(eU~fqEUwO+op0{C`|H8ISXoL#;<qk9%QHxlq}_aaZJt}M1o6@Y4B6E z=9GRV$>n@FUK6JOu6bL=vW7q0W+4v;$cY^y7Gh}mDeInQ6tiuVzaVP6HVim+yo}Eh zqxC|7F0|eDFWs2lKp)f8mBc-!yxxiI=qLp;A4(vcHJUM-x`10Lns$kb-G~FPJ0BH< z=I<jWrwW@Xf>~RPF4X|+Wa#PXMUyLaBMbtc!SC>Q$NQ=A<8Q0Mi-l8-io<eFC~kr5 zKpp{_nvq5%A*BZBnHnXqzT$`%D09ujLkBkK9}%v%ea`din|_l8M>zP4i7~y{l<~1r zMchtMwFzwVpH7UFH_SGq)Rjr-G|DZ?-M<KaGnX<e4jXejSpH5zV-t5u_oj8J9Pe|L z=@Ym+Y0V{YA8Q%e>O2@*A>wB}0x%rq+1`Ipn)om5zr`a~1Xd7@7VHVA|H$c%^_I&Z zm2$#vPGK_FAMidd%B<~vHhOTqLRi;Oj}fu)roYZYB|6ej)6ioC_ob9g9LvOiF<2j? z0(i_y@F81^60ZuWG6qt32E^kB&NWwkoASsn%aPyUwg<UGAdQsjf7=FwHlP8p;co7w zoL6B|CcUzel?V0$)APuOh1Ab-caD_uWaB|pf@~29cLI%KC32ZFf7cmPVDEpRDi$UW zYZl(t&40H|aP@F?_MBy09+nCt(P&67Z&x|O*0u!HP93hsh^k9D0GX9|@WK!WSc&UC z)bakBGL6Oh5>N=|tfHc1d;=W$0sKFAvbAO6N8h%Yra>8$dhOO8r5I2OOPN}a(Y$>4 z6QeFuC-OsaoxSdIihpLV`y0@Hb5>4BZm7lRod7=a64kJw?xM+ctlEgwl~uDW_5>rY z%$dV2au9xq?1`jr#rJ39;4bXv(*}Y}G(}yjop@>%+<r@vEgn=-(k7SyU|SR&5MS=# zx^?;$`~~a`ssCTx-y_?J<G9`+%wX>jOVRVBCTcUR=*yWZrGJ;zqai1o$a38iJLouy z^<Dd@@27&D(Z7~Dq&?)ZFM;6Ak-%0e%$c~UR52i&XnT1QCMP|6)fOfkC;D3}M_BO{ zxU=%d`0_;@%Vs~wN$Cm~(g}td1NfqwKl?*AifMz<XkX#Cc{2(vy3$<Se8->!Ek8{Z z7Uf1%l^Xw?Y(SMN&~DB$$lv6oFT5LW3kYfMlLL^nlV&kL0hq5g101EoO)iDvu~E{O zyIyaMttPYkx7{H14|G-m{l;@H^y;2nXK$<ln`-83IT(2<r?S|N;Vy7ZDZIbDK?yWp zbBmc1=l>FF5EN3!-+d*B?&=0Fl+QFcC&{QoDy6{u=RQ(a4wxk4(y&j`b^H+2s}Z3` z9?@t`>p|17_LRmKRI^cwE`i6JX6*L(=EC_jA>iydYgr{6ew8}MUrF*-nHJ<%3ql4- zT6ezT{j97b$>-N_g^4*E4XWk5de0(w+PxfHKkTQ?lu101J&$gDC?@RRP2U_v28Er_ zxZU1Tp_`gp&iOt4Ip!evtNjhv)`AjzP8y-MfIcn17S{%7pR2eIX_WU$-s6+(c64Ai z5NJl<%px|?w`8E)4+D?FAcIjIvMwJ$HaNbzKkFeMuqr<`Rmb<wN^9rdSs*I7%2gDU zFyv&0`?P9(jmcN_on43qOVV<>1kMf;4lS6HX4Zo`<L~t!l`hr93Q(gzBe^4`@g1C1 zKQ#wU;XY<q%ifl!L=$%A?Hy#dqG`ya8j{asoycKCp4$;hcXn2(7TiD4@h>nBP1dLj zie$boucKjhn#LGToahxSSL1Izbsq?r4WQo$2BZ;6b%N<auoCplx%=14q;YM9vHVB? zsg}!rJlNs?)qa8?&@nh(k|7yqrj~Ubv<kt|l4+m)vh(WpQz?`%@|&v8%Og5`b*Fg# z%68pxK6=Ra!m6cB4x>)_^cwsJj5yC5Ue9{CddL8`aQ<8Efa&zpC$2bd0;d8@+W1%O z<lm%h9QJ6BtB$`Lx?*|6(f~h4oYMZ4iLRE*o1&Y@VEU~e$o*LM{U@e*u};nJMr1}& zn0W4Eiu3ezp8EMNv9|iXDG`u(GEs&fk1mFEm$`w<GQyK2&FujNVxa4{v+``+bx5P6 zA*`u}zWsLET!5?)LdtBc6&1x~W~(8K>B?sG##5kvb`!MW^u6=+K0RtPk0|G$IBd)= zEZyW_jIA6F5S;;i#9(b5NG>jjCoMKZ?xWBUQ_shqLg;VzG8KlC9^Uo@18iob3mc=u zEN=GU2t%Y);k&=}go-MZI4Wz^+2doPM(UpvIYx{`1f){tf>>$s#S)$UZ~YzU7BdIA zk^S+Z-9zOy$+;L|;?>$8E~klABYG!9e8`Vu?^;`+{I4Um-&4*h_S^sLa|8R|4+jx^ zNm{0Si@|<LvY0p3O#SWpQvn`-;(_cokO@9;!tCD5oT|AsxK0YEw)0yEB&0g9(7wly z;6r%Wn*Bna@IhL}ahj~8Qpy2g<zaz^^X>x(B7?5@$I+_NHu70Cc#jYxpy$E`8Exu6 z`J?BHhExxADd%<Cn6k%!lwvC3*a<vZR@cSMiBx}02p=Rmwl7(itB%wFmoCcPy?H^8 zpT^9d3p}JUOkl>2CZDcxqOvWY0aZl7>Ko<d^Vz)5kXXBQ`&6BlygPxKgs(=7;h#&L zf3^R~%yh11?o756SIlQHyFwe>cgUw(#SV_~r6j_6^5>o-9|E2q*^UK#DC*yn37aDT zq9fe(yc5~UCYwp@W%xqfb(wANNE-wuPOsp|yJJ!JB2<QxpW~W*?&xa@)IlrC_pIWn z%bICfrOLnC*b9|}5zxhGOOZguzY?`enY7&-^5mtdkOqsTG$nmKVf;3BG8je={DCKM zAF%@d`C%D+SBto>*?-L%9zR_NML-p$5xg8Z2WDGageZZ%I>!Cs%*^_0YZ&`3g*f!4 zJr$w$pR97nZ%gaY=Ie9ye<Y0>)iSu-jVCQ@K3~zFQDEYqez-%|zGCLG+tGU%UenwW z`b@0pfBzzZ_z)r;TMWbqN2wbY%`^fht-3Iwq+JgC?}QyH3pnh{3qPLN4eJMin%%gg zpb|)^2UEu7AQ-h6P+5h#4A%O1Jw8Iz2_Z3tB@d(5xS#Xto@p61ak!y?-=T2o;M&A$ zSvkB*7WRw@>)MCeclbn~b%Sh8XRW$lQna9=hErD*R|3ujfj|KR9U7ccQNCiK{naz| zL;Nt5FZx13pwKYT1228>yw<7ub>=u?o*h`f-WV_orAAee80B-J`D&E>Fk^efD}n_^ zJtZ0kd`)AJo`0Qkq-yD%l!<d9dJ98ASC6DYrhV_9mMPMGbfSg=RF*8)6UMl1bmTo` zYb_$3m!3XAx)cX#id(ln$U}E6cbR-}7vIB^8ir#i04;JW1Pb!Cq<S<cBBRaGYHc^& z<=;R6Xxy`lqv7J3r88yoV2Kmi*-{ko@sVdXe?=j*ifeNCA(xX6frM9vw-lS;&560q zz=Tm+|7<Qo9k$1?(H?hL3!js5%}O1rk9hC3eXDQ47GIp>vo~E3$Gd7hZU%1IsCE-O zEFC4_jJ}5>PHdn2Q!Wz4S6ri<Iy(RMj!|3lU*x*kmHEpPkr<(S^q=Hx6;WPd6W>E+ zBoE+~JDSSNTX1~t=;Mu>s$VY>cCNM>6W`U%#NROg<u}B}3wFi-+oOUpw7WNN!}*Zm zHmbj&m>^t2+Sot-c!^-WMIF0s+D|@jN%yIa%t%2jMcJwM=xkQ^SK@@WRV69Ann?uK zGu)I0{i6fw{0KL@uq0Hn1YOt{giVasTY)Ob8%<4CswCx8raY;h8j{^F4F)z59dq_m zOap<#><s^iX5!|;CQ5X71qI>Pl4}wc#EGgQYUlwv`v)@--xdEv2XvM7PAmGOd``3! zQ*(a}qMaMd{7J-T7m0g%W4d<W#XfRsPju?zS(R1lYwXEGaiz6kG`?wFuVCehRwY#4 zXg>i6LE1ty#I}eNe>bigWR;uIY$ryYfDM%0;^CRp(C*sEqf~9BZHZl1O-4u2>PhW) ztctBhxsz#d?8P{Gn0pD=hP}fEF9ag?=m}rb?Cc!6XCgG8#a}LWtR1?Y@!F)=Y(#nD zy4Di@(oWUQtUMv5Uhr%>hz1*9%uu++-=bQ2jq;coo{TCzSpE(_#dLL!2hQrmcl+DJ zKrJL&VS@|r>eP7A=$54@TD<b2G}8(06=N=?Nq1w(;b~a7E^%3BH#>_?f40O=>xzgu zdU(-27KsV8<bRjOL0qlB96!`>uvonFRg0b^G5ASme2aY<zb3j517$t&y*<B(dUv^_ zZeSt~IA&r9Jg*4rNW;?0mVXIj)h%j*apkvCqA9CyIEz+B&WkXT%uEeimPc=kwKrZA z1huzww}Xlo@-Jl8k+^erIpIMr$L>w!$%3ERAE;`h_AAjm4Rm?{04;}_+Ta>4f$@Wy z`_$cOUCT2c+HurMj|~;o{^LbJN;!0`vwy`!-^|Z82{O#1&eI;5uV?(pRq6QfL$$o? z0vD-=Z4B_(Y$w_bEQQRHe4KT^!?Wt>FUe{C&%{mlO?%7O#`{|WVC*H8b}ba+^37D* zRgckS3EQx;4au}6WeY@{vgJldfQ{bS6B~*Sy`V6*c^nfCk2$<eYufNET|z<%oSgBB zR4u-=W02F<;D*SEg8F(zOiMnrxrD|?+-GEvFH57=0i3qor;po)RFsXM8da!nrI{?X zeMI)@YIy23G-bY>#Iauht+W`eno0>>l=l5sz7OQ0z>UO>B+IHdAH<3?GTI-Q%4r1B zhilu*X1U?j*1Z1erAFs76Qbb~01*%eRPoIaAqY~V{>U22Em1eVK)o+{n#Yk;PLi(& z*Nk@X^`7+p6UI6f(fId|u6J<-?WG_gUj|klPR^_EB9!WNPcLx8Kzhu@;JjkaY5O<Y z&JGQccIIE|Tgt0S!HYYkc80EdHZLl97m9gX++`5dW8doj-!9mhp8fny?My21)h=18 z4F+RkzOUAJMt@XmZ(Q+grJg&OY2y#20YEKb^eY#?*{hc+YwcTnFNzB0iaZ%!Vd>Q= zT=&ODf;hCBCWf#~6g3h%yAfvzzY-`fmek8XdTOUqs8`(sXI!>CM&Cw#q8l!F+w6IE zJo0<6L06ZZd1ApTI*rRgCoRu)1rz^Xo?EN=MVlEG!ipAdRto1yu9mzFhYNj@6whX} zo_D4V)`p<8BaaR_BsCbNJtQW9u|FtW3WW1aoHH-_i$_0Ay(qFiI>_d_#rCy7ms<}c z0MLi1=XLH+^CUOv|Jv;f$?ji%|I5RRQdU{PA1O_uSdh#ri2$L2g|#G5m0g!C%!nlc zhLHk8jjof;k+WJbUYDs|V2vn(7&2#rh@sez56=u2gJ;4v(er2c2rcWa@4p7=xCEK# zzWIjT$?br3FsNxIf}rVPdBApEb$Z!;_{bUg+IG6WnUvUDvP=ByAWlFN^`M|lEvR7x zRPr71iSbiV2G0KFkWD=*;$aFr9(Q3sj1p)QU91Qk7V1J4Qbr{uGK}Ioiz=K<V+z_0 zH3ki>-swoc{KvdseiwlG(;9GNud216t?jW#k4!|V3&v-O+gdEG7Zf7Xj1C@jQEzi4 zq+#XTJA#@+ZsBY}2910wqs|H2Ji6?ZyzHcwX)F#Wl9K{BnIoV`St^iW|JKrG(ILfd zTr7Osec*gGL{a6vN5Wv35Z(4WS{(uljfo@r^Fr-f!yx9Mi%mmL!3rVPqtzEiYa1-7 z6j9%a`<Cp@Z_9j%$!P1!LM<phbqkRqIoV7-DK|DL*AV~d%x>ECg|6GW+wYQ}w%~(r zFBzqv%#6u3AtIq4)GEQsc$qgi_%uqz+xvMC?vd7Owb18S0yHwglAz&>2X00;yJq-8 z_%L+XAY?|U%Uu{*x3jqB5$O8JHP8T~Cf^e#Q0WU(Fi839qR-H{k}Ha4t13iom0u5I zcW^{wl*<=oElj@Pe2NZ_Ug|dmEo2Y1^L!;|^^To**^>fi=H^3&G*ehabuw2&LMJC^ z0}LW*%OM`wNsFM;1A^+$2TSF4e(>O;-$1Fa@39O(`u16)u(TLw``s7QfKYY$ktUv| zY!wBSy5~Dgj%y;0tn}KPH~Q`$EreF*c#G(brzq{*>Wd08&MZL_m7t~_(OEy7u)+bC zSHl$R&2eCQlwIVwiL>{Pr*%{4(6^u%)DGW9W%6~(><TYw$fV@{I#cP(I6*BWDGNzf zt#IimaNP0xq{VzS{^jcqI-09eM!KQ?cD@|d{XqiUbtWgSOH#hzahF_0Gc-7DBRHOB zeOqcV)0R#VzRq`@E#KGEIQ{uWB*NWtImn&F2tM*(Bc~ODXrR*VlWlxNYNk?WdIz3l zgz%Np<bdC?k8)r(3A82mCPylbV`omvLF0q^)9~>6itloFq(ZAD^abu4KQnrPv0|$a z!;DVYkHm)kF%K!jjW2MDmg-(cec>pNRR}*X%XV<CQwZuQW5|8muIZCtJwGHlbi=@R z_LOzMo!qC4DuQb^Z-9J7&(Ox2UB2-Y0v`S~;{jD^SWMJa7%4923^kwsVa|yCYo5ld zp)g8)>hJ=gs47cq44Xn_Tt!VKe-Rm_$a~>Qoc>m|XQPiB!tgpM)wnNw&(wA-Uz4dh zh#(j!j(SmwyTG_zg@UnZM8k!CjL~MqP7OkEJ7d9{G1sz*O<yFN*R7(?rA+G1T=X^U zg?+s@czv^XFq>Cq{%JJ4Ey<<8&&$qE`A01D$^|w8G~*uYKnP}-|483p8pbjPy=El> zMLVbaFx#xSTe$8kM7zO?)ol4(VS^VC`^|0APZpAXP`3tRlpusl5FT?Ih@<ZgS{t5Y zIT}0-{-Y`;H(z1i>;1_??@fJya!sfpg)pd}jQbAyv)VRLxe8)RHK=NufUBhHY><8) za2EwvqZGI?v#YMhVJA!mnqx5pvyq*<Mx+@?Ao=OVz~40>rzE@zPwMlv8;fe5x$T>< znH|Kug~*F`j7D?WT5jIGtj~la*kDMvxB-|X*Jy9l<{i#Y9OwQGt6;&xU>O=C*TlHm zq{b<PE>ftPzd4<|*$}HSj^@dZ5+?Vzcb$I5%%F>&ED!QT6qz_Dxcd9jao2LDEz`EA zHo9=HfZd8ZiK$C6GQ&G;&_g&mE$rGDw-Afh!QajB)L5wT&)9=ekjBE`X+5+Wc!xd> z$JdT93S!+Bmvx!Ixv6}vI4yLd??V`4=E*6+=Rtd!;&dsE$m~jXTF)&AMkxnevk*Ua z+m%y;Z?4HjaAq)a0JYV@#wd9JCsu6u67@7l>-1yp=+N*AEA$4iN-TA*$-)Wb+u)(J zfprj@DD?HY6^?Ch4x>s(IWaC<$?PW&FhP57)>R66nM!`DHMUW-g!d^uL_Zs;7+|rE zmti<VxJt(EiZBfZQBoeU@%1p73jcb^h~`-~^P;6Pv@e7k%1-~TKc3kHcqsgMsQjRH z&)r|Xp6*8b*SGxoSJpBLQsk{g`y*}n4i=n*D<kh5sF~?K#`XEG<-2<Vv>LcfLPqxe z*GC1WgcOD+b?5Lq-P{@<%(c%$FERJ_T%^xw%pVs9&Yt>C4NlHjvr83Xh2^lC-94}( z@02?t9~0@`-afSh7PGyhm-%oXNqy&ng_@ws@*H&RkkRYxSS}RKF@>9RH&o=wsia@= z2$&3dp(mR7kCQ!jPvSDX9_l`9B1<dw8`$S@k22A^H$i5z2sI1Q6jOi7Sg%^I^-YdA z?eQ9bA2y!MdqP4@Q$O!wcn<FW%>b*#VSCEbE?)W$UOtA3sy)hJoS1z(oz5Al3NKiO zRvRJ7*;zlXX}#S*cH9u{2L`9vXYK(AdH|N&u;lDWun@;P{gr}_ZGh4a3u_SBphtT5 zc4$?cZU6B|^Zvnum^Q*3>SKmP<1LKc;^Yk}d+Zex)cy}Nif(@d06hnQ&P7AoAqwFy zDfqR+XY_cW_l$o7g|P<J&2bA;*xy@c(?|}HPJD;Hg_J53$6Aa3mY+2vAPrF?qtO#? z>Fo{#bHM!FFU^^7O9EI>_}y*;vGF&`d88ll!<;u+6l|Tr2-9Wtp98BQg+{qz1k7pQ z=)xP`P>%0<q$u4tpc!9xaOQ?te%C=6B6gacD^Yl|@H03-QV{vyI|T2Myd#3Bmdxk9 z6~A14m8R27j{SHw_og;1ic(I<Wkz(u<PXT>`(n=ZJ_2&p=?oMLBb<ir5|-J7hZ6hK znNt=3#uP)mN1hEp`vIVSgCebxto#lYQ2U2q;TSa{{p~Q7U$yX=x|&Mt3lWSJB!Zjx z@wX^)0GQu@#66NtG8{cl8hw>yE}c?HhRn0fyFuKlRHADL33q5p6y5(Yf&cwvaL77? zQU4#1j{^SxJ>LJWNP_r(xAfm*k_`Iaw<z3u@ViG6)+!2vUKLX23y;^R3vB8Q>C#Hf zt^;p<f>{DrC0_d?aQQfcf^qDAWjAEUB&bjW(MX3+#RZ1S9ZhHyn|bs|YSfs*9Ny>j z2@E;=-ccr&e)wvKc;5?p9kaP<W2)~8hM4NL<I>w!fH%k&ENCI$_y4SVQv+}prPvIe zAeSZDfy4M7WpvZR4#i+5F~F`){KHJ%V6;PG-d#2X_r71hOzFpZXLic^GaGVd*SeH- z=SU5E1GkSYy+1yLtYx+Q(H|D#xdqVoS(yg+S)V!JEe67sSAP<TQ0T=Cm8c!{RQ?X1 z4)-Rf88N5(`-NfQKfBq;tnL66CP6PEG&XtKS8)XkuAJ@|^fMj`dRZ|>t9kC3?pvMP z2>s7m9nAiFho+sk=QiJXJJwQz9dC$4KU*_(XIVg*ULp66P#!!6iui*WEy{QA6(4m( zN0hB*4j8DqBe$DvXC$4kQ&=1NRU1*H77cZG;sRp#K8SnW9<WT5Z1`t$1++3W^YfzV zX|J3Ft(1^askWjHO$a9tfv3kM?Q|^@=0CYu13je3+oz7JJ$Rqh?3|eb1ApF_vU^s+ zBWS?HlmEhcdi^r57X9~(o85hj-(Ar%uq^(60yw;b5D*F$!?27aDVExs*}+$DlA}Ai zF;kczt@}u$6C!E<d`YJ}*)V4&WyK<?Fd4hlB6K2YIX4W28@7T3f1K5&0RJVWb0Pd| z_&osd)>vD8T=%tp6N+1ClA^*zD~tR8XnV`3xRz%RGzkF`+%=Hk?(V^Y6WkfxgF_fR zf#B{A!GjL2gAeYW;0*2z?z}nY{N>*F?$@{0eCRdZyLVM}b@i{Rt9$Ex)zS8UiykFt z!0-M>=DGTX;}_YUeE*e*$TOzc^yTTF!eX)hGV2^n#t+nF-aXxRY>=EfNt5*;+>;H~ z-)@@x`c-K6T9zg|COoB;K@(f#qN1TM)mcb}YgA!(wKoS(=Rg^#c!sOs4CddLO@<1= zZ=QtD&x3uNnRdqRu~*nAU$gtl2oahDp?yBqMP;xTxQ4E$*P7RoiSaT0t}$!hhR~<E ze=Sk1TUjial&psIC<2pcMT4h$lx{MU2D#>(4N!fi&@z9gqfJg{#2M&BeV!F@sycb4 z4k!}ZGcplQ7Oc}|?i8g3Tc#ZM1fbyVGk3}Qt_d1ftOiPkiAnFZxmNocAux_m{LWv2 zxd4QMBK+m0Y@XPviVnGX6(p_6Qf<BerSYDBX}tCNrP#k*nGkJ_`Sx$UMETXZ?1?5M z(s(>1u2CGlb`WstFb@HDUY{GjX$%_@2NDx69?!QnYE|qmoR2mLlGs>?WZ_c<5f^Fx z>)uwMRA*FAl)!ABY~G+t7K6-&@fDf*r-!4*MG0`h_uGfxS~kWj44lqlQ(K)xGR?Xz zmajimGqq(4+kCLU!Sz|fJpTypHne|R=T7BR9Q{bk0o<SIl8>A<DR_U;yV#rI9H?Eh z6-l18$2R`{NqHRP?_UcH!cWkcat4Q|XR2TbT+>Y~By~=_i`EijZt!r(lsTZYTGSAj zZs@O)wJOMajB&vH{_z9Wo7Vx)!V+L+LJ9yTI{XsJ4`UzwWX$s};iq@|Ax?5F`}DEV zVm#+Lxx|u6yqb4FPWQJ4k)Nq4D8wa(dn5i7SS=Tn=N>Vr(yN;n25&Qp{7DnsO9!4` zh81}mfJ1pjA`WYi9C$@Y;=ByNa}J*=!4tAJ=hF+&1}VXyNg-Y6T2SMm`YZqT?mt@j z0{a%}qE_59QyPZwuu#rT^qt#KY-((*th^;gvqd9=J@?dI?5^B=qkhwh6!>DNP60xw znV>$eoR28ZQO7$0q>7k2j3}@xyix>CWW!(r=BW#{?Y&FcnC3U0VcP5t-l!8Rww;Mh z1tt6>M;KySgZFFG+GB?xj~dD|LAtZj!3z4~QVp4vz4teh`h6*mgTVW;_cu;fD9AVw zgG}~60k+duS3+v5mg=hMgN5PptVzpx5;=nvnLti8#np(CoWie@BGxIi6b`TcmhBVf z2gtAsHgwk0xc!OHXCn$P6&ZfwqF5)~Z8mQ86m5@lQcY3vkUOv4)x7&a`S<TKCpGzN zRWxZ!zM$%afVbo2pB#Or+Vt3YA!_d~$);(+(NR$%%F6N@D2Og;k-27c95liS#%*!? zAxN7=Jb(^qu%cR=GORg^+5N&aT^H;!3e{Y82Cu)m+kH{g#z&GilK6Hq5nI*%Q(@xD z=St(IVm?vt>EEuS0~KTAT(a}44Nh%p-xpRedPz^r-UE?NAd3ce*8b&w6^)$D?e;k9 z>gJJTr5|avb5)k@KMUROMcz9hueYF7D(vuzmHefHN03Kj^1Udp$oXhzzcV3b&t~Mn zR-H-7yw9Nai|57HUtUF@ISgQ5RRU8c{PnmNs+mMubYW_sl?x}ogmzrM^DbJsf}tqx zm1YT>89cwI$%JRYJJgdPvYp=^xcr>U(H=%|E92r}5_6NRlZq(|g+F0`E(zYe{!8FD z`Pfj4<~J}-^pPC}g!4hhqA#KmtGxtg!;UUOR+v^=OuE9kgk!7;#G*Fuy;*0)xTY+u z+a%8`UZJS<2w)3`Z@J!c*#4lxa6y+(qE?P}81U{GJH<Xvtz`&~y&yR|Sa>g0fmT7J zL<~bwqvxj>{BzbENx~D5Lbk~-?~<=7ke7JfXMghskW(AxNnr!ooL8NmQw6Q^&sMeJ znW@qbQlO@mURh>_*p!;Q+?%QvDw^5b(w&j|0xhPQCK50uTK<w%rTy#JQqJvb+{!S) z?XcDW&0F;`j4mN?Yym0D_2M5D=d?vteSv0Eq<jEbU&PcU1`5xZt&9PlZ}ofO)Z=Va z;$#2tflPV5<9Q{Vh9bp_h0z~=BJrPBc6&m<yKKs%Ge)5lwsF-sNS+d1y%nVxJREY& z{{<6&o?AIFqDcr;-bncnc9~`6PZ}&wMsvUXn|Rll0Q4O>I{}Djk>E5eD`}5%$8Obd z^Jn5<TKD2YH}vEJ`?X@#20A89w6gNAEX5<J`1M-_q6WtJ4S~ic`x`E0NBn<=2lx$( zZCE-~d*!W-@iBzfk<ao_uII$(C9#z#<uNkNh5-_n(`o<6BL4W~ff62%$bEJc&0B*% zPoiDzAa?UfPQV|h*s5Pdtb1y5a!OP*wDIMVPY+F-s7oT->&L_+V-QZ)&Ea<?Hq2c> zccHgk?O-u;Y!JBSyM>ABJ8%INFHO=+BGFV026nU6+owR`o9<=xc#u>8h?IeA{)CTq z{@1h`*dA?>b}$b87N>ZRuE1(e&2fd0ISN`Uq{HRHSZm;$+VMnmU^X2lKan?WJ6U8I z58TFb)`xo{<?H;mv>O-KEMG#IHo_-Agh}vj5%#<#7b9Ga%c<qwwc_n9#LfCir9`OU zb!8HL5)YBwgM67KdL=Q<ulv<8+{}<SX@}O?{GcrI&JvNTLrel_{w`(8t)NJ5JW5b; zsYR|lYbVI%jyL$O7{_qJ>7;F;B;oElV5Wn#_!n%2yeFQUYU_EZ5q|SrdJYmcZCHw- zF?;3uxK*i%pJxPhjhc~0p_-F5z0fvBEOiZ&R{A{9{>hRcxYzk?9*=W+V_-mFBupgY zcHs}c<EW5NJ5_epU9{i7=anlZ+>G50M`+voy>|Aqo%8;~<$S9ws?!z`g_`KYRY}OZ zJbN+c(_7qH!w>jUa8_dXMUiwL{uNLP^klkLPX9Wg^lu5^6yu*a)vonRp*lT~F2|oP zSwF_x@vc@l)l3An6678S2j69jk!UNuI6k3qs`=f0?jZFui$9fzk#FVnPk%ubN}WZp z_a%Lv0qKaShj;Ro%UW#^h0nPwFSc_@*3=+fn%o?1Y&y2W#pLB{PfYXVdE=#>FFTKh zp45pM$L{?Gs{!ZUr~bn+h-Q3F)P=!zF>MLdG<=P*Bo`E*tFvyv75=a?9*)sMWG;7l zS%?;ANh4vteTSv1B8>p1A=99t$!o$V7*eZD$8a(N@q>YvHh4k7Z)^V(zL?LS96zRR zmFJm(q=vD1`PI(L(cNfPQ}9U)xRx>P{BH3&Pa+;D_vo#<zgmBS**VP@E4K(0@SzQh zoT08848yEYZOs7~r6?Ily%F=@=<FUp+-v0~x^9!EPWdWao4&B*6x}lXCb2oA_v&~4 zAdf>|Y>iHD^d4goa(~Tc+$PEBRtX+Cao3mtg34tr6mb^V=P+5l)e_foe;r4y_sk`C z(p>v#z3+hQ8uqy)M|}w5XZ)`P3j79EWAJna)%1Ae4pR_$L$r*F=^@mzh*|Wk(4%st z#r3;_2_d9(@8nLzKPOAR?kQS8&&0DdrG&L)cRYCg<cTN8tDI_ALIC#J>#L{m0=gtD zr`SYgO|&nkU0T^p=#v~br#3p}p*m(eMoVYQ4V|?05Qi-v)`?h5Zs4oQNFixpFty*d zS+7RnF?8UKw&=+M`g}X57n4D38BdJk&vLD`@_3UIxJ}8eCFYdD89&#S1KAXgF{2b+ zYPoZ3CH?$7OvTogdL}4Y?5>g3+&MbH<3oGhJ?;EbER&HkR|BU88d!kLW~}m_t$b@( z7gu{UNe0BD;VL8)g=2`+Yk{t@l2EpIODB8gZk(p=c*lxrr2-*4BhTXeqa|S`Et=*@ zQ?PgN%i&Om>MO`U#j|SPk!@ppCdYx-_8lI<LN3=B>#r@&J<_T?P#J2Q*lKTRk90xu zssf!ObFKtow_l^Tx`3qHVaKhLpy#wJ?nB~hB~{K|?%v6|uT|=Tx7#i(LCDCs4@u}( zpwB&i3!)7)DI%gt^-qk!zfSnuc5w}s=kkdB)7#QCm*S)ApWZ&1{M(x1Q2>%7u-JU@ z!kB{3jwZ5yd+bRNGNFr@8?pNwz9L{IAG6{zbn@xKEgZEa$QjuwuXdHn!wr^?^q_3^ zaYNvGM*xdHVw?;4<SHl@7$L|q_%@81hBmffHZIdS>SkAEtTMj#LBa0s#-WdcJ7;FG zkm$0*$)Sjfbfwy2@=ir7YmDwLFFJDbbzPCHW_<FGO*A*yq=8Ut_{5gcR7c4Bwj+;P zhV~_4C%z*tO_s3vNvrS_l6rXxxnQzz6aW4(q0B)FFHXCK?B%bcNi$pKYFIhnSXC9& zrUW?SCHNamIHtdd8s}M394HgU&HRq6W=_xaWdeGv>0~AXe85jwi)`jjycB7P7tHaf zc7wG|$E8_|h&ux)L`rKK=#Qd$;mdq7e~7Ua8d#NVV+=Uiv{mLFsEPf?pqi7PWTaqw zg9_PMGx^QTY2CgKUyRHnzVzv3KC<D$-J#&wquF>LvYn|X9<-C4kbGaP4AY1~9+J`L zx2H1CJ&bVB44*!y^#8!-J6W6#;(_okk=^@l{fjzuV?S9&Z0Y#{kbv~iq_mIK(ZEe* zj|!_$S3#nXL1SHCku(lyYQy};?OF1$af{ntNJSe?eFk@^2d{MUjK?H@zB4gB`k}qb zWnEse%L}&grRcjg{3(4Dc7Vvo867^K*7nel3K8E~2l|<@ChHjwX*nE(`o7-GMAM(8 zbi5)-I_^1xFD&>oa2=NkLGt$O_c?;IRS4?x*Fc;)V#rQnoZ*y|<YMiDQhW)N9$MTX z^G&hOI_Q;m6txqH&^!A?w-Z4WkC?4;_(AbM#s$4P((Vg@t5LUJnM+ENW|p>h-28%q zxqb)le<6&sYcEQa6k5#!dQ$OZH9EcNmuB2NyGZQ3z4snNHVRV1b}rbvYtxy(nA?Xd z*2}+g^I+UN$+m3*g>KgD&;hP%Y5k~rzQVK&Xx5dO?HeZMc!>1JUAIy$Z}>;n3~zCG zr2tfuH$R?V{3G!XH-Y~EycTkCC?`6T%#}2Q{t!DzDw?oib+~js0Jh-lmJnR6u{RKL z;-~cdjqBY|33M!fdYMFl1Mo+wdz%<2>tcZe68)-7Z<sk+b75?o!|>Q5e^=5ay%jzz zq(1pt>dbk`9c8h`W<n0(E_ZAM{!x$}(XSVpEo&Dl1^bnqC51VRgnOcuCu^m;y_>o_ z0@?chj(VmX__Q219`Sa<*wYs+LUl7qs__Y<vx!E7+%(s3^v5uJj4ZtPh<m8J++32W z)v0<+zQq%cLhB<ni!Uw3*`+NPnA9gu()w0(<%MN_IdcvsxNDbdGP?3g9$19@app`O z77*BV(1_EY_iKz=bTliMThrUrvwYsL=T?qZBmKQ$%v4;Q^eV}RQq&H!=2ik@GR$++ zfVHr^{c@$XLEW3pbLd2&vYITViZWh42kt2@D``98HX$@3^jZ%yhiO+(PZ17^)qn3r zVJi~y?Yi60zO64b^XK`OhbTq}SM`(*FmQHT0l{31=KF~dyI+^6&((aa?(AM>i!hp% zHg5H);rWWH;j);qsVs_#7nNq#bxCPQFoh>^v9_|*v_C;x)`M={V&W@<{-7E2x+3eL z{K+JUc|0d;f`$$q`VbRG1FbsICE0KmGJACju4u&94S(T~0n}tl%_5r++9^3@)(=9B z!TRV$qlrqoZ%`TTJ*Ef6u+?3n42J5&YP?J7M57zfTzA828L}Sx#eK-#z8j4dImvlM zE68=d)4k@I{zA*Cdeq+%>cd(`TEeqjT#>y!^=_z=Iw8$r=$J@+Y~A9}VACcU#A;Z+ z$JYtKne<-+A5+86s|=R4Hfoi%W%reuy0BUNR8s!HbN*^FWUl5GK|nN|P*p&0y2pgN zLAmxcvmrx-VatGLWm#vT?$aSOU^PS8PpEQT0{pj!g7xMJ{|8W))!!4g|GVFALxX0e zOO;ukBM)@q7A=kwgT!)6m%?Fj6Y=}^1;n|J7ks_)p|E^f@7JAA<Y0tAeK%?`z;6JF zY`Z_R$luKAi@avGA^?IyAaL0|{1wYjY}={nZZ%5daSlB(=VJ!-51#%(!J2Pr#}4$Z z;2)2}k52EeDc%QLR7titK0cniC+4hn6Yetr1xKxp!pb1^BGOnS3C*6CEbqPB0{a|Z zR6ZJY>K%z+!$?&t2iJVokLc#h)^QMXr{7-3ahVjnTYPc>G^jzhpRms{tenA5#~R=w zJG!vvWm0-EMu6Hqtv%I9Z*V94(kmrP&<uvf^<raEdKq142AzmUd;r6gtM3LxL-HRb z^GE+nFcRQn$0{cD*g(qDD85*u`<v#Xx^pY-VHoK(=NtyEisEl2C$D->r6kYujXu-J z=8P~yKEi&{>Aey_Ps<I;S=8rMr`wlB5R_)T{tB}Qv-jIqDjRLA**v$H#T5R$<GSGe zOCoh`7t2MrU~mUkuUKQ%Q>RTlXfxh$@}t~v+clp^qd@wD*;AzRnM9>QXCoa5=b0PE zIWuYC8^|Q^XV;X9x>;xN*y6m}T_^0wF62*^o^l%OZ5Y=ADYa*_q9*`HKp-qr0Gz#s zNv88)bgcO2-6)?RLT~U_Jyc5BQ{NS+=7+F(Es5E9pl&NRQMrYGb#4N%UKZ+}naYM= z{#+byL;AV;w7X|DNw$*WZ@ahl%=FJnGoFew_kCSi6n$Y(irK^1oKN7ZND=48Jy60G z4KFQ0b;hJzRAKIW60jvoyf7_be9XM|G*N_B87WdJX~tkmH8XxJDNhe2Lyua#RoZ^; z<(RUQS)qInQBIcPTQ=(E@@0wT4E7m=yc&MQ<s{0fi^dWM?#CxsNpOb(xYX4~<oc}` zB9Oz_0P8BJ*!gNMe@E`JY$#8Z@f*UqD5P>8=+(k(DP2HrUq=0Abe21XFg7h&#&#QB zet(f!3U+MFyey$NkYdffI`yn62c8;gqIhiI|3u3NDoC66vzR4emU-d$30r7Bh-bqv zwVfe+>zM<_NpnPBC~QH9{OPys<K{^G8nwhl{D(%-ruJh!>M(_@-|RhcumgXSD^SJe zbF$l+yEeO2#pX<2b5l#W+u6TB?!#Xo_XqGX0%`%UGZR*LVi5Cls<X^Y%AzJ(J==cA z64%ReZT>TTXomet$$c}Qg7c8p-eRP|w9Y+dr7VtD?v1G^(P%KXBkWJGk!}`6SOB$C z@IH6x^=F!gd<y;rB?(?jQvG`O7{~4<y^m%i$WmX3x=3^E*DAibjS;3&($aF!=RLq9 zP*KzXj`!!&rfheY&yIKPU!x`Gh4Ku@42nhVg@lBWVU@GPZhLnmb3G5R=laNzWXnjJ z;sJpsr18mf&skU0R=0R-(W~-TXjc7Bhu-*YRuw&cVu7h=dU}qAAIwH|czvH}sT!r$ z@K<HK%qaC`4bNiA$!~by3wTxg_#??29DiEKUe)N4kOK?yvN{wn?y$$LG?Wt;chcRw zDyxao@MvkzrB5E#*LclRC*ExN9+YGI0kqWxOI9YOXUb{%UPHYx@4uZ_O#0+v^(hQJ z5%F*NKD_@JnzBU+IoNkL?WnV=ND%?p#hhCxl4`SHj3}uVBOUKj$z?y%u3p7cc$+Xk zerY#bX;-8q)f>$qY}BC1U*(B2bX|g-rUzwsU>(GK!cEDg63+<dr9sMKU|P%WeU0X} zg?pJXV&I+4L;NXR(Pn><iJjn((q{f0tru|pczd+mUFL20=m$aZ2;~fkQr3vnf%gJ< z?6JK$znrt0lleyN^3soIYePBDHJaLAUuoht@x)EMqM}KjS`&*1Catq_q+s2}6<)UF zoH1h<miX+#&y@9BgRJGpxj7`*+4Nxkru`Ac%xlQ0%Ehv3xcG)_c*CuiY#}^<VEK6! zh;h~}Cz2L3M@B)<8psuvwX&l@kNha2)8Ix#_4S>_P%q<|z8-sWpOfbiz2B)8Wljy& zWp~e^D7L~^Jw^rw!MeAq1^tyf#ZjoYz~8SdqtGo^d*PG{t4r;EU2%rC-)Y}no21L* zFuZZMETaZIA~fb<uzaYl+j?@Ielp!F3#qX$qT2A8XE#ycyvGS2U~??$x;WfdEL8?8 z{kFw_6f=}vmF}oI+8N$GC;i1G>!O(u{WMT^csGMoU&Lf+2-t8u=c{Gsj!x((ij5<e z@oLx;(hYe2fZ6VJZ4Qv7?DC?rP$FB+w=p{)-F4S)E}eF*EsfLb$ya0k7Y^=#dm+PH zY;1tpW-(`nO0u%HyS4f|y6tQ`s>VBpd2am4WZX{=*VActYGQ{KiEjR`EROc@{N%d0 zulbN8#mcPJfnx#5RFOI%a#oB1jj`>=rWr;7c~8eBMctQHj%#IP44I=PMR_G=`>EVN z9YBSwMmXuQ0$(yk5-G@8-BL=NRDL;Yl{sk*IlGZ6pUhivJ(Q7s;m?qim*$$?E^#P& zjqW9n!&{>;7t!g!`HHVEqqzH#7REVSTpt~-(1C@|p1E~$oxE=*V-$qctQR(9gB6X? z$FYCJrqj-sdYO^3zSxR6ZREE7m{i2ze}p&BW6B&(XEtvzcZ=55({p=#PygO82LSRP zDf4UnlbN@p77_Pp`h0QNrXuXa<1VEZ#(C#-DO=#tCcQzXs(=FhVcepd+3(Pf^|lA< zjL)mIjd^B<snm1Y(aukP&*a`;pI7o>mcn;f=%jFnh~0`M0;5s7j%n1kRP~+;p+e1c z($qJz;0jL>4!kj*reRG?8)N7JdWvvl^ucec{24L(vE|ZW#5-a9T)jQ+AS!K>jJ*5U z@lfT)FZhx!LYIF-^FhP{%%Kw&Xb_#S(RN}!Ml07c6*>sYFKRPmG|igfjo-{!94+NA zg3YFC9*P#zH7ijs|7)=O{|W`|F$10vUc7jIK3rb?tZ(tIA12mC^lC))Q{*oCG-*Dq zg7NE=YE&ZB-5~$(9uR%Dxsl#pdf5hgSAZ-uh$0vQk@Js?j?Q-ZX3pvNC%H<^50C$& z{!>uQ`1g`gm)FbbZa=R1JZTJ^b_ML&?vyddT`7C)eEoDVE9>`_J<3{6&<<*m1x7*d zzeajz%u}(%_~+{z?##@dRsvexBw6N1kT;s6I{ZOZrfHbRDYL7(g+;ZZnpu?zCyH5b z5p!%AnPw+`7e)KoJ(EU8&O?ct@sCC?2KP^9wu)*?UCeqs`hH}5cIQbt<KZr?$v3hW z;i}>6eMZ<0)|R*N{up>Px^M5GebU*4r0y+$BHZs<&r|lLNkQ^yy5%OjIeTC4*4A#b z%tpnc7oW%7r*e@?oh0p1Nz9`i)b7f1cN5XtLb5o$<cGy-=Xhn;yL=$vKXB=DD?7IV z)!$pvr>k8^CsS)W$a|R8L?-2(pDmf&dOCD~`sAwTV2oPxw>CaUO?NpXgB&mX+uD)8 zD(Vy>E%Hn(mT#}Ttj8?k&VJe<1+^*RYN_+_xSS&x+V~h2@2^e{SMa&5dntP09@`n4 za^cQheAd34ENt8=^HRWPb3gD|WTOS6(1K09ZXQYZ&vT}jo<wI2p2b)Frt;p4m1_-W zv_FnEmN8*?=cJwvNxxxx@#3_b0u0{y5uz<FVAboxA7ke%Sh?4Wf1V5eK<9D8aokPN zO3F}3+t2MOR_YBy?A@MA`opLP5N)KOvti=F)?mg_W5?4PSoUVZQ=`XHG5=z41r5d- z>sThSd`eE3>4W|_)RF4?DZsjUyo%51PxVv9T=Av1>c(3c(&plEM}46`G%SnBILQ?d zHLX2+T-@=xn0Z`JncMoe7Tc2HGCiNi`temi7~72iCh}@a>W?%nXjy3bnMDkACNsk_ zD<1ooA06k<Lz=UfyVYZIv{weL?I|lgT@7Z09oT(NeOh*~&|c%$({g7x*QK)oGNHPF zRfM3d@`mXK_)E(n@rM@;HA2!mNqpE1X)}5*YPe=pC{a>8Uswjx`A!h%KppK2OJ2go zB|we!HDAQwV*J|qy2C!z1*z#HugjY<&ApS^vc|s4gWX@5t0#lJ<BlJ80rMs&xaUvw z<t}9uFJ1uGu>dQs-94!EG0WyKq#=>gXVwzc7<)AMMrAZ<_ptXHwx4L>+Dhf8{)Kl> zp3=$S26T88Kj0192?h8Y=P7_^lHuO-<%<`>Z2xK<t;d7?;>B7MB^VrX`f6xxKob{U z9nJ9XYJ<P4Q~#-k_oc%5Bjp+k0583e4?aC3??#1}J`Td^k_5sZd_hnA_mh9s(?|k6 zG1n2{rJv@16Y$rciD>IvB0mV>rEl?YZGpcNUi`aLypZ`Eco}X&=5x_suwy~09vfL% z-rNU9Z&H|o;q7rZW{KfiX50sK?}NWJl>?9kgFkH<scrRFHSzz?)sGvO|B$zA=$PRC zt`Fw%;&;7fei-eisFxJ9ySd<3zSy5|a068XzoXMdhIApF|M~F)_>*H2!RVX5)n1)m z`jR~|qqxqd^KRe1e$#`IhkkRE$e*t%-jgR{x8_#n$g6>?^)-=yOU&4i2=Ms62hOH3 zf_3BKx}DJZ3Bt3-kwb*tGv9xzB;O#P$m=&gH{}PBD%b)58kaj6rI{VMj{5VOwt#6x zl~;4Q^RXE&`VJ!%%>s=(Nb~myFM_q7`~Q;qfXdl)(AJhv`m?*L(HP5a)VRKvb7_&G zOxc2fVDS-^>q1LMo_&v1pnx&@SRZ;b4c}J7QmVeIYsEx1>EZmgEj##5EEqnLACtSC zTWf0a3Y|8jv>o=`ZsWiD&&{}QXfAg&ma}+U*54+@^B!eS7Nva0`;okqxaeZ$Fgn^S z!naGXyqSXr()gRt4+tLq#bp(}g%;ANjTg>a@!8Lt$oQBkm#45&auMBmGxa!fe^3eC zisPQ#2SkTKrDhhs?YX7QMb|)wNu{ehgCja4G|*GbU*d~>`My>p#qp_<%~tzjN*f(N zIyp&*y{ubGDaHp6V{@ADVkXU~?s7W9OYk>Rc_68ag2Rw~Ge;u<AK}8^-O-X7DlPt} zx9^*(2hS^)3-d}x4?jyoXv-Kgf0gmis=$^#@jusV2){-92Inc4hi~U<>8HM10vgEe zUn~vgU$sWeUv{UZqnKHU@Ovs_D)MaPH?dEuJ?Ti^QpKHx1Xdqw8&`OtH<wH#le*eD zj2&%B{>2a{c*++IuI=B@sACq+KF`-3^qeG-vIdzoRdyF3YjeHpk817bjBNmZ<AKfz zj?Qi%E$3yJ0}Jno{+gS_vgGx(gq8b$)bZ^-U1{GzOn^}#lRR@16J4^BA>UpK67^QN zr<e7kw@C91p2}Zyz$efP&RAhvg&oj-nj9v`k(=8~`Ic(^jpz&+pz~Yv|H0dnkemqD z`oJ;=cJTbc^ib4HOU_rs6Dcy%HU578iB(@7==M@J=@Pk~Tf*Qc?P=bgvS+iuOoaK* z<;R{uIJ$pU5>j>xnSV+b%xB^NfBU|V<_lL*I2(tTgLHsB;lFhYDZa;Uq2~Z7opJqR zz5YZ7J?aygBf|B^#>S;~J-D<pErEqk|L}a%e`*`F&a*-cxNg%tc-Mpc&6}Qk=L))x z4=3TjWAaP_=<h!D;z0wo!KETqy~NHAY+Heo>K1_px-fD9KEgE!ZiTXJG!nJb`^7%z z;YDybh`TCArxO(~I!rf=WpbTcc#WC6&`vMQwbZ7+smZU&ho`R>Pdf`nkX--7;R#hW zHTa12C!+B8P+qt%(@&k!ZvlBf3w}KdUsp)ThvDu-N{^andyk!{oVJg*jkjI;G<CSH zGU|Ydf=%E*%TOC=eLn>t&ZW^2lJ=Yvx{v^|!;DB_B8edEVMps>k0ec{1-y?3A{O>A z1wfdTP3Y#LAR@1iM^1`^h302DDu0Qn2Idjyg2{c&V5Wa}>WnZAv1^nBHw+wQtP}B_ z8x77s2S51PD$2)__7m3Ah0Qw<uxWD>u>DN|5uZ~GQ1f^1Fx3aL><l?@9{$%n%h*AV ze1$@pG2tE;3e<KBI>`46Z(d=^bL#}<Yw0CIp@iEfJg4#uZF3Ic9@j#i>jgE=^MidN znVIZg;&Na(cjWH>lNzQ;3c$KcWB501H|(w0@BPoQk^KN6`FB*&LRg@fHQ4-Emzf#d zvyKgB5Qqh|>RUd6#Pbe_vx9U=m9Ym;PlxM4c94-BO54vkAgTXFJG&D2YaH-44j42@ z^F1y!^<{zcP(lBQa1ROvDy>9KH8mr8*~Yk;y$|D@qe8FXcOY4cgnw)3tdN7ToKL%( z#0Igl?-$>XV{u~Lfi7M;PjoQMTHeagHc}&Hjrc<XV_1WNPMTBL{!c6gF(=tmMewt7 zbNB)-54~+%@4+PBe`NR<9fA-hDTh@w$1DK|m1WJE+lb%2pygvb(Mngn?8wn4KO?c3 zWu&@2H0$Ku;`zXdnK=qRD#X@y#qP{1<^kTME-npNkLPo2sFd*9%KgSMVP?qDM!(dq zNuR&Uaols%Z{)#+O%Z+BmWG+`>wGN;{>2B)>9C6jl83FxR|>cgcVsSA<iwO;B68rb zHNfV)Y9I$(f6#iGzQd2|W<r?0Lk@g#K*qN-!QSVJA4JPE-++E+oQ4nf=T!-UYdbJ| zTR0*+gQMe|x%Vrq=VI~)ttInkgIUk9j_WKW;(W;+kB7U2_aGxBpJkr1*J-HTJYx~f z6Ec?rLORI)6d4S>+NzsmYuoVyIpH*&n##Q}e<|%|L}4zD7%l2@9EC|=P>)k=Z=t-A z6#pVzz17Et%tCxdCYI<RdHN<%;l(AP#+MZ79az>m*5hlXC_A`2Fd{ZC`qlbR+j-mK z=aP$oY-aX(hSm4!d|Tvd7=KzBh3{1f<LhuIQu}gkN;)r3YEPFihL%?;>MAQk1~2n@ z{u(6J8S04ne0yfV-;!W=Fir;^RYjyQ%ldgpGLx^nvPc-XtdSXoddlptdAAYD*`l@x zjk0?*<P}IndBoeoy8G*aFgDwAfvNDMJ=&W|k*J<PA|iN%$slNajIqk8U!x--!xI+t zu69K*u;0)72mkgOeO#n2sHn$G5_>SDmLFdsM!*Z465a3bozxVm>*%N8o0*?VEmOY6 zZFo;!yE+uNdEnq9OCkKgI@x#iDo%VJr22)E{C-)r7{-vYn$>m4C)@du3F(uQ5SD}| z88HDLVkoacnWi1_roF$(PlgMBx1J}N_8R;+w3zT6j5avQ@jx1FeUWYAW@JpUr4t&& z!SmaQ31WvuGD}mCE%I`8R5$UxoWX>KUu9|F;Dhv$9JD^LcNjmaH{vgYMAV1=0Ka(K zNtTY1m5>#=t1#A{@!Mw!8Um|b*w=o3L1V;E_o{~FQr*so;NJYu+yo8d<DA7cZ_hV5 zmx>>mc&#kS7KV6$kDrsK7-GpL9jh-`LQ&18s$9HL{P0u4FF6A6$|DqdTI~PmU{gUN zj!{2!y{V3f@KB@xo4Hmq?-Rhk6M;Jn<*G7W)GQBcldax4f>ozf@rt6BnW9wDCvI}6 zn8d8=p@Eu6PnVU?uyP`dAghqGBO5$_a=QW;gD4|nN3?QJ1k4l2TQt*-L4mS|$|7|P zO&sCkMh0;3Rar0MKQJHbm*+RRS4)jF>b&<w><Ax%3=Ie~<88<lyG38(ofFWxfB&OX z!-Fmsquiy(vGZFaJS+X$#b)JeiB~|u{wf9^RAP~Tp)YcR&x(?6<JHQO-Ae))?Rc!D z#d*<@%gYb8pJzTqq}ct}hy#BD5#i?ekoY5k%FA&jM&UN~h~;!4`WijsiN@U2f`dyo zSrp2w!r^FbAkFr%UH3Gi<rhvxV=RK-ZoW+|pAnxYOqoBJKLw>eT2g>z!@C{oHu4(Y z53wTD2_opVhF!7NmGSU<mY|__pRK_hSj|Zz<eExho5iC#eyR~>L%f@FHqOEw$aJU| z^p1Hq<k%n?^<s?63YI3Xe57^N!kev6&3Ix~#W?={auGVs7-`Z`u_?S1a<hTzN{_#G ze*%YcmFzwuT$UwjuSaktI=ZD%f6VTZ5JqA5-as7a2CWlXkyI6yzfWV~rj1&ZXl_*T z5y~yM?&~ecc(dw`FRCB$j?ReNvBPx4Px3qb{2}%BSBezqjNrZ1re1-k#}wGk32KTT zrHgPfS`j)({PF1<VjW#bRKYy2=xbMhOgHx<e&0d@CLG4%xz(-9PUzN9AGG(c^$~3Y zsVHpz>fMN62*fVI$2Ok~DiP2-ZVL>mgF0fOe`s6{e!KXlMP8HttK#<{=rBRRJH_pd zn`NOI6jWum^*u0!PX&*-?w^QSZ_PJLIsu+f)E~anOcAlY{{p#WjYnDNsZaZ2y`S;1 zZ6#QgO1BTlwm`bSel7i$;Kyb{T_|W$+vF*ZygV*LMZlzp9<@d8c)t#B(M~$QEBH>7 z)aw_UF_GDFR+CE=$@eZig)<(jMkLU{D8HPUPUI(J^A`&osHLOa4jr0zk$MQySK;by zxxCzo46u;TLxufhy?Z&u15}43TE2RryYf`+@2kXR4md5V^3=t?2b&B@j`RvgX4j}0 z2&IMjhqF@ZGSK{C4z@BD00)qso)}%_{c?O~=H|E)ijO{a-f;D^ITzpYp&rryx*Ee< zUM5b&TC$NE0C{ap&Mi4V5j3rRa0unO6>Tadcy|K&zhK36Xi5OYPQTI+Ec=m~!G$K_ z6}~I!dCXpwylA9L8T{bg3&xnzQ<KzJpAnUoJ^VARtef$KtWrprp33_oyfuJ+c8J^d z%z<C>U!CW3zZqu#(B_JljLnr^_joF_{9~*20A^rHxFXLBO&)voIKW<aIeN1%fuFq~ ze}?-D0)8~q$>M{bs2Ri_kYLVNDY*omlzj?!goH~WtO#%+-G0N*=fy=UwagS!4=U7G zSg)->Vq4~fI)Tu=aEO<PyFx4R)1-NT8y~jrESQoBGuBpxFe=<%H#m^hOliDX)&J29 zg>_pCXwmUeRhnYW776X{lk_HW=^ZYphooH1naqY^2y2UCJhuy36Cd?DxsxgPCPA-B zH&1_m+~}X7ya>jguOmQ<y(y8)UJ?8A4ZoH2@cd~Z^j-LDOk}*<SE?;rp(mJ_;3;N5 zI{!THcV5&Axs2Fk60q;buwG})Q#7WWC())is^0NHRhIB{bC_4%e@(I?E(nMNYMffH zRu!$E#Bf8ec_Ab!q;c9-)UR-q|0{&Jp#e~EqD7Hd$%3Y$INk%hH-C5pB5BFSOo({= zL?{u_N;M9wFpN1IM%N+PYohy!<l5j)DeH{<C!bnN3&G1a1Ge3de;WR)TR7Y>$-Y}D zpZ}RSWOO2ANk0lm`<1i(<vH%1Q-RH^<*7kUK6w<|YEHnz2@}3wg21=HW!xzS(%_Iu zfEy_?2E%Cqo_^46NDHjo2QP?Vf0Z-x35Q3SjG;R|*5~GnHuNzby8vC!m}DlmUL`2C z!c*tTMUdQE7tD7HJe$^I9^4a8ws`H~g{<PO67)G>cn!CpTm4?>6y3fOnZdEP2zNEB ztSg>H{roCyno@ZF$H{`?#LU+<H$4QOfP;11#jwvaT1&iXxvC{jtU(aIZW}{G1I&cS zi2ob2LEk}X+F8amNe}OP4+2Tb$4NS~D>*K7l!zQADE4|5fl-wr*ryw?>kYC($O9D_ zFn8e1?G4d{;}6;r@_Wjm>fg8R*60LTTx<1<`4c*Q#*^0+2YEOq_i~ZZ9>%(J><$<S zZc$+}cO*`nCGW<il>1W5CM!Q3mXb&|r)}B{d<%!tmWQ*YkZV4SM!kHuPae`G7`{G7 zUO=v4DoH=88UG$;Z6T!fju+|zLhot7CYrI$RALQu{6=!#;ITeTi^@&aW<Amtyy@Ft zeKu=$laUf5hz0uG$;3()mh?z}P}{9C7kyGWXEu4uic=%Lsr%_=Aa?0S{SB}-;4W(< zqkvl~Ea<H*_%x2h?pn)CH#6R)G|({*<Nl!h7ssTRifBm*3Uh=r!9tq&Og1&ZnHf-N z{XfA}@3!gOdpYn*!so#eTEcZJt7Bwau%F$VVz1*)Ym$KW2Hg8=dKjDA=;8^*Jxc2S zxK##9yEYoI#1}0J`Z@}-qZfc9?q>geb>=s~WEN=Zh@5@vKtwD_fEJ07%On$IX2n!} z`UN@J5(Spmk%6R|;Ypg~U({KvU)1MmtBsx~KQgda*EJ^)x<5q_AA|ywSxJT*R4GF+ zx_<6;?r=Ye!Q+4+l59T~plJ1b2I#Y;YIOP?iH~dUs|eG@s?7v(gX6SslM4~s4`@EF zn|9zDDnuq;qt5hDRGn4<#InZ(*ia6q^UsCQa0-%+R^)I!769{m2<Tu$Wf21QcJ?jC z=}I`qX!6J^`apbM)>G5A%s<2bvL1^q3TYLfVr-E)?OR!juyY-YRZnNDGD8UmqmKWP z-x@iLkqQ<*SRFCnN)32Indf8xEXsjv<iIUQP#P(VX9qf%S898v)R>hw`ka-Z@&qm9 ztsY@KP7*MwQe=HcxB=@YZ~2YS3mXxFizwnrr*mEme#k)@sXA0M$1o5fXO#)i{?-<f zoF2y(HvghDT)&D@OSp8GALbIOEf%&ZPV#Id?cmXG-+S(j<m9IYp5fv5E_{WGX$N!L z$Ev&z8&B5d5akRN_kFMD?lt31G9k<DzB@TFhiVVPrkWZ{>^nISH?t??EmI7&CYS8b zT7RG2INkDD)rJs+DF@ysgBE@b)h>sNpb{B5?}{3hr-#Qg2)(q<s0BXK{S#ozvT;(M zCk}q5T??uYdJ+5)S3)A0R%t3$`97b^hIfj(50#@&|AX;}DLYneMnN3~sSR&3ckGYe zw?%aY#zIJcj04b;SseAi1NQ;U!)KHf`VE&?LfV}1gbQf(<?kQIM!3v8j|HxMWKLqv zN7`Ca{snR^6NxARq;g>RZfNq5A?Yy@Ciamrlz=BpjdaDKCbzi}A*&FbA6!e+wN8zO z9iDscbbm<btLgQ!#!-jYhY**-MNv_MN{4qBh2-tPxm)Gi$;u}`?4Z+_U)=~oQT)2A z=t|n8GdmHmNenFG|qMn>B5t>|OftLsYlQ6b|HB*%E5VI>``gioA-4z?f##WxDD znkIwJ+8+Oi+rQ0}I-^l7n}L5KsD<QQ4y-(v0Q}SISSkyiN=$vSN3hJ{qw1MqIuh`1 zy_;BBiO|ajGMcb4>c7*##vc_?;rlA7JBM@|!z0_Q5kZDX;A3DH=-kwT3^Ed%l+VMv zK5ma5U+O)e4x9g^-9|p#_0u!#Fbpl6xds^J^KZ8u_NoyN<kY;ww=jnO_(O^Dbtcz3 zVtfv#TPNVp5AOJCejJd^`m^{`9w<(D(kE~nI<}*XQ_OMItH7O2AWmoiwU~MHl7XD^ z!y}Z(-#bD9%;`V@;KTvN$b#pZ;DF5pVn-D=-(mt`+9QB!&a(k%Fkp9;*siRp6bE%( z4m|n1DL)u>BVsY@fSVO+!mwgB=HDA@B_b9;)6W9ri-lbeN{Bb3-i4t<$B<Q7<HbAB zyOxOgir0)SofH5$00HRfgeJ3hIN?8QC@LB@=rvB-PwpGmxYZ@6duh+mH^>|F;n$YL zrz+9-p1xYYGeDBJ>zZJEhMvgNvQzzie!os1%H3yG?X?bO(kCX1COTHKn98BfM@Iu% z@yWI8ny=J63r>ax;?r{*!xe~cP!i2tfX_tK_Hpt!Ao-C+yH2t6%tn%Iwr;xBSfH;Y zG)XiPSn(A;{uxLaAPgMP51*23t7!u$jRVhv4`CSLWg5{Wn-4X>QJ`00$@Ui|Oi*&? z5sY1{&OBg!Qh45wM@fZwe`RT+7WuI4S-8-91Qh>6bl;Ckbl!~^>ATLEr5!{!wOG9) zI6FmG`A%(l5d|C1<<fHbvHm{T=!c_D@<o8nYOm)hDr@f&^|d~FJqAqPY4)J{ofP_m zpY)X!k~BP!^r`*dkptj&3TS;70{|4}A;BOV;VOCZUN_QtIQ{gLPOBd^(fiVRM6oN^ zBgR-ygLhQg0MQvYB-CIb)99O{6fNx+=I)um*&B^Nk#@c4vSPVXQ*ovvW8CW=n!MJ% zJ)2DXP7a0`T1WthVZ?p^KwP#WKS%Ye4t|G^Uiz4dhFNYaIPYA-=QHb`R)KLqLzVSu zxJl7!4x677hq?zr>_o!m)8RU_!wyZF*~ejvLg`OPN^Q@5S^H$#B?ekF+2_h-phFG0 z_K&eCTk2IPUyV6^D;gs7<dk}YV)pc*=SEZSb*4>!#3irBPu#DD2x_>Aq3CfNmGesw z+6T_Q*W@%9W?$BHZ(eVA@~K2Mw_Z3vHG|bx8BRNqu3e)sDB&>8-WYZ!_22n|068ED zo4;dTh)e*od|ljSyTp3j2qEkgGYDzrBdyk74q+0pXP>k9uoL2lUBg6{Knd52#2@VJ z@NBoxSVcK-pJNlP$dw4~H4+H~sbVp5=|rIlHvLNRUOuL^*6~BDjDfgau%!|C3YBUG zae7!a2#d`y5n{LBrT2QLLDKB#Q)4yyj(T{tR}PN4D5&26hfTKwm<3-$av)4|6yF2B zLEy738^RO~VXC+P3ACq!<%!}Jwo?Pv10f1!-C_BjZ$c|O6JJw_G8{<;Eu*QsvzixA z!wfRf%m^(7=RSnOVT1(^9`Ui?#tG2v(ngrv<85t23CCsZ%kxSdr^0zvkHHXma4k3L z%iOVc>Kswf<F`Sk&nCxr(?CuN)N?I{bwa&pfyE3O*i`E11Rj&q*>A*=D5@@0Fw!b} z@2@R!^Uvlg=BnoLy>@W_^<VK%Lb#=dDZ@~bT6rPs<fffBP>#c`)Z0MB_4)gW3A^C7 zLOevV0^|E^gw)eB@g>*@1@y(S4=eG8)(*6?gU8fJmye9;tCb=9?nUU5{_E#oK9Lb6 z-EH@ZH_?5Zfz(pkVIyXQ9CR0?Bpd9<KHElhgKV8c3P-WJN8grF+O7n<S6CrUnus^I z_m@Ead<4SLK#1Me2iTA^E(nf%=EAPc1$xU=L$#6hcp9-lhR4vtPiLx#mTbd4KY(O; zTZa707RAj8U+7VtskilCs~vgBzUxo5Vl`8fB3>D@{iJ1&Tlu6D>MN6&nyC^+e3BmP zvmDLqP3NGp%9WGVTP|%RbWi?m9E$gvCS}988oP9gwxD3nMC%KBkpt%%R|OV`!20a- z#!W68yT}8x4}fM6wRt<96>|qJOdJr9fbH{t0=;bPQsB8bU|Tw^2-$=g>7jUN8AE_` zHDc<S9D?Ow`Az%}IY-|7#!tZyk!GQacLbQM_ZTs3V&D543(TJ4Y$2OEDl30z4EH!S zc455?WR~Sx-E7P;DrR@-Ugb))locfz7&hN44T9#c{bKI(l-HkrG3lJK4(deVvup!q z_ViA-22n<I;8<jGeAONT;$(^S2-C+BQlU~ec}7MVG2BZ(QN#gNG;3|j#w0k($SLzw z<Vb?EKRfp4Zj+~u5~L2NJ6Y><0E$EtAW8Y`IG`#L;ifY5V$vgOfR^<T55Idi$5Rtu z_~`()2u^QA)+BNnASV2p%ZYoND8Mwv%<l{1af~Vz6oJac2Dd_-ZswNJ$LZtu*5p!l zKWPM0b$fno$DopW9NWTolm4QCo|AO!V*B&~S3^#9OK4etU{BS<RtLLa_<@{>(8h@S zpG}jWa57%rHYbEWsS{X&2HXw8a9oWzQ9OVCAFHV(#I8aT>=UpRt#m~{!Nv)-4SBA4 zrMQsWbFrxmp|_{6t$TSzu#3(@53(1R&Uz{6E5yj`Yt8P_HK!5<R_F}{g0QA#mmZS0 z1^RH#@Rf0J^do}qm1Jpdr}9a8KH)Oj>Z@v5<vuQ<cUp?u2fYM6*Q2SY>?rs?8nN{y z`XUKu+e^Nb1%EV6spwme!D|{<0$bA9R+m+g2E_x@RMU(?j4IXTq4g?rVIU!|7q#eD zwg~MjfB@+ks~YY`N*s`vaHjbu+XyU>gSBm)tVm&JpxryO`+mH&L0`?^pxWHJevFJ< zgs-J-)hpjP;|tG%$!GYMz7<v?oek3fkJvm@TSjy}Qjs>aNlu4eqE-@>?*<^ESJ2u# z4u#TERWN+nwcdx^KH}>%N`!^YICl4ON)1%VQc%?X7W!6c={C>1KGV!7T-82tDdNeG z`Iq^vu=ro*w<mlaJ|6=%`S=!~>jdO7nRGMXS8-@)?JK(KKuR~MkWaHq$cC<Lr4aA( z*B2g2u9(~wpA1ImyOnYB!s05Q_;$$Tad1kLH<?)55d7f`$*xAUBm*=^y;YWFrwS)G z%G3oFeW{);{huwQQ^Bp|*EAVUDi)ujONomU6skNMU%dpij&acdf(E!)Zt?~Kz@`Y% zkNG&)kZrT2GfHOug-D12m$?P)0P74DNA8;rd@}`KR2zV1YVF`Rk4l|bRU4^KMJOkS z+Q!P|b`Q=>DA@5+0Wq4q2DXRN&6BDfz!2@I62f#ws+y9gWsT=e>&83DUdINv8{JHD zxfJFm*?L>4_a%<+884S7X6q?g+6e5l@Ygu3I$(C;r<<xGP>^n%o?Jh#TYh0FzSWc+ zyHTk2^G){13yK;#&H?CF+J7Qyh)ALHnm8aHxYebG>6H^1-tk>QVcT)gMlHsrTHOdb zk3=YgX_qqH#r3pM-OXh(j&KVrW^FR&@yU}wj#TBFY3OWf$0*0#v=E{m^Y6;80Ep>` zz9GBHL-*PGd-WeMXT}j<^{D<8=B_~J+c%-a)S(LJ92ONQ*Y;W)+8Odr&w4nePU-hJ z{Rq644r&{5QuyS$MnBT9Z<Y64-sHxzJrCfF$o({H2sJz7unIcYYR!0+9+FeR+9l#> z3){U?d+;i@L(g83zI4=-yIgHsVqit+WBXYh&S4jb)PZMLKdstm_E-nB%|OBICp5i_ z7jE=AvmTA$Fv~~6w9n-!zPw|}+MtMM?Fa?u9vo0e{pGtbhbzMI@t6Ou_wX6*PSD3p z4fE1GUa$^{#5vwUZAV8MZ+t#Ky6BkYXyiIxgFWl}e~$5Q-8pw7&)kUkKkWk37#v{@ z$b4=>auu4w7k;(zIJ4pCkuBy9$R>aGuUPB}J(Ppu_d~bB{yRXyq4SJ5pdC3dAi0%y zNgRy}h5wuuK8*A=15lo`|ABe2K<{usIw8O)-!O<>T!6_ZvN-tu5Pbw?0yBVW@!z|U z;7%-<o*eX&Ic#1+z{eVw8GC>|{~MPhr8i|DWdywC>i=rFjt3&#T3HR{dQSO^w)%kH zVch@mPC9^xs3i3ARoFZe3Njnl2>sef#z6J}JRokB-U@sq{d>!GNkKuw1fDxq!6k7i zkH%LiU-OBqq|Tx>U{^wlFI2A%RS%IRKua3WF!U#V_|S+P4ckU)oZ%M}LOizo_F(_< zlXst8Ns5E+_~~}<JCS`}uJ%6ns}ldUA+A~T1xN-U0oXeL-SNJas(W{x3XYuW#r&NK zA=~-B$F36{B<TROSUMeQS)T>GIYKHmF5#;$Mw-n_HwWJSvlst55fjuB*u1u@)QIsQ z8fxe9@_=n$>8M1!e&F=%`R`rmx1pFI?c;$8qdRDl1F`G_R{yiyUkz@;*S8-3-e$+a zdJixRTrFRhjS=!P3hpVZz*=~#(WU0Ne(FVB_q%r$=;{CW&i`vjh&Jo<as$~(t%hr{ zkl(7FeS;esf@U1c>%V&ZMN16u`zO!f<)kW88<kl3qd|xL?>`oMbD|1-n7a0MKs1Dd zvHGIznQW3TVvFy&i5=Z&?76^<|D<iay1+Ma=6FbF7v{C0W9_JId2Bnr8P&BtAXRWY zX>_AK!GM~S*)zOYDXI9$F|Rj~Y4;huRGR1i)k$|guke?Cx}u}GY3D@`3P;k~@e0df z+~R4qD3N3blDZ2F4{9qndIa)cG(1}iYG$@dqa`9dzX)c{xm$<;e&m1UxO{jCTjvqr zvAe}g_`3BZV<&vKz*{fUpfQZAV3950@XexSxjNHT=A6{{h_m@;NmYfFxSg%?|3?Vo ztyS!fy-@Jz2%bIgu-MS|Vg<usNcXWiq`~IIUcr5-F8vU_%%&aVW+Poq-&V1rMBtwR z*2q9(^ZzGv<eQTlOUq)>1tyy1j-|c%L&owEdHwW!i~V?S|D4;?cb?2<tIOhJz2!ln z24Woqo`U3=#Q$(bbV<}OczSmEk0#Lj!Whv(P@l=7BCErLYq??n^s4Mh(466oY1Zxd zmFb&P8Kn{yo}#&#%mwv880{@|>*OB|Q4s~ZZR~2d=H(RXFh7|%IAG}1o>k_pbQ5fd zae;kA|IUmE80zqn4q@y0f5!d#>HEXkbvLiCyJ~Xw!>T_J%eCd>FDm}o&dBy7;NHys zi>f^9Pk}x7fnVcq_0OmEzeDR3nC(J-MX$U1Co9piE&QpteB6G>_{&{??<7W%V-Mf| zx1E$>>a?_DiwBeWE5C!T+Pz#Y|1_60rCWq2E!%O%pu}76vrI+C#ZS9_?2S<d#^eJB zySDeo1-~u7e|Z0|+v%^2=cgWC{Rfnq7Z|mL|NJWzXAj~$DCSxJ$r!X~>y$*?({#|P zkg0}yPMrrWOVUcNm^vS{h$rOO2Q7P0>R8e9FtiTj<p4=!!>)dl*NBgc10HbP{j^B( z{Q2`AzkFd~V36@JtK3#;R<&){!>|9ctoKyyjk|O2-m$8^eP`2x|M;w5zn+2NfO+NX z58KtwyPXd+-*YeiZQJ#vjU9FS<898oe*L<lrbb8ZL)mVi6ZlkS+uXL1wvD!(ZF~Ff z+x2CKwfCD_$?$c*?|pW7j*r^M4<8CX@Jlf;{5ikr<mR)RFMeL#w)o<TjPmXKZ}F~= zx%l|wj*8OC!a~9D@NmPqevh9$Q+xOB-J^g1<QN!!sNH;U^U=*GH=pJA&O1A={`b>w z;j15Rz5Vvl)2B--YAq#ry0*v7^;5s~wroq(S_^yo{>_^=TiDtHowYAwTe(@qwhE|6 ztIVpmRh#Wu{qRH7+AzcU=et?wt~cC$H_v4DSqtFSlgE!AXP8J8mXrVkr)Fc$`<xFs zA9FtCe9rlj^EKyNPWj>N`u+Utp-b=XTCY+{lyJTH^StMos|UgplxA78uS}aRQu}h* z;r%;HBe}nEXj#fXeSBL!?&b90xb@e+RM;##{nY4f+3ugAY16-!?Vf8k`|O_ss-BZn zde^?a%a-2_JU;YU?w4&<v-iF|cl;IK`nqMC&Ubx_yc8E-<~#rV^Pi`y_g=D*;k#V7 zf4=-K70*da47cvQeJ}UJwu;$%a__n2uik$1_Pd%j?><!RzyH}k^c#Dw?S<!`E$`-S ze_6Hn9RKeUE8pXf11G6?UV3l~o3>ZRi%x&MDtcG@%s<)P?RT`#>b==@|2<IsB(|+@ z-kDWI@A187mcLlvefs<IzuR^l)&{CxecI0a*7R?`j!t>CYn|K<u&Z=;SKoY?`)OOH z^xcbJw};Bb)xTP(_jLlur+??~%Pai%)?Efv)!d&6Ubbh@4otBJ68J!CxDJ9Pnk_-A ztk{Y{$(`pJD6LDJ0VQ;U8OR#q`Pauovf(X5;Nne=0|x)23=bY`ZmeC~ttt$%fDxog z0L(NbkGYY1y&%XWQLy&SQb4C10j<e&c+-9z$ObLJR0J*NJiOrF+Whzgz9<E-y`a^W z9i1R`J|LeYJp#J}<iQyrKOH#&D$3PBN)2%<1#WT!D)<jvE&i+_vL$r!;(tIcgQu&X J%Q~loCIGpw15^M2 literal 0 HcmV?d00001 diff --git a/docs/QUICKSTART.md b/docs/QUICKSTART.md new file mode 100644 index 000000000..b4b2d38ca --- /dev/null +++ b/docs/QUICKSTART.md @@ -0,0 +1,47 @@ +# Quick Start for KeePassXC + +This procedure gets KeePassXC running on your computer with browser integration, +using the pre-built binaries available for [download](https://keepassxc.org/download) +from [KeePassXC site](https://keepassxc.org). + +**TL;DR** KeePassXC saves your passwords securely. +When you double-click a URL in KeePassXC, it launches your default browser to that URL. +With browser integration configured, KeePassXC automatically enters +username/password credentials into web page fields. + +## Installing and Starting KeePassXC + +* [Download the native installer](https://keepassxc.org/download) and install +KeePassXC for your Windows, macOS, or Linux computer in the usual way for your platform. +* Open the KeePassXC application. +* Create a new database and give it a master key that's used to unlock the database file. +This database holds entries (usernames, passwords, account numbers, notes) +for all your websites, programs, etc. +* Create a few entries - enter the username, password, URL, and optionally notes about the entry. +* KeePassXC securely stores those entries in the database. + + +## Setting up Browser Integration with KeePassXC + +* *Within KeePassXC*, go to **Tools->Settings** (on macOS, go to **KeePassXC->Preferences**.) +* In **Browser Integration**, check **Enable KeePassHTTP server** +Leave the other options at their defaults. +* *In your default web browser,* install the KeePassHTTP-Connector extension/add-on. Instructions for [Firefox](https://addons.mozilla.org/en-US/firefox/addon/keepasshttp-connector/?src=api) or [Chrome](https://chrome.google.com/webstore/detail/keepasshttp-connector/dafgdjggglmmknipkhngniifhplpcldb?utm_source=chrome-app-launcher-info-dialog) +* Click the KeePassXC icon in the upper-right corner. You'll see the dialog below. +* Click the blue Connect button to make the browser extension connect to the KeePassXC application. +<img src="./KeePassXC-Connect.png" height="200" alt="KeePassXC Connect dialog"> + +* *Switch back to KeePassXC.* You'll see a dialog (below) indicating that a request to connect has arrived. +* Give the connection a name (perhaps *Keepass-Browsername*, any unique name will suffice) and click OK to accept it. +* This one-time operation connects KeePassXC and your browser. +<img src="./KeePassXC-Accept-Button.png" height="200" alt="KeePassXC accept connection dialog"> + +## Using Browser Integration + +* *Within KeePassXC,* double-click the URL of an entry, +or select it and type Ctrl+U (Cmd+U on macOS). +* Your browser opens to that URL. +* If there are username/password fields on that page, you will see the dialog below. +Click *Allow* to confirm that KeePassXC may access the credentials to auto-fill the fields. +* Check *Remember this decision* to allow this each time you visit the page. +<img src="./KeePassXC-Confirm.png" height="200" alt="KeePassCX Confirm Access dialog"> From 525d5de30c5ca817c1d8510754659d66b27c139a Mon Sep 17 00:00:00 2001 From: Weslly <weslly.honorato@gmail.com> Date: Sun, 26 Nov 2017 22:23:15 -0200 Subject: [PATCH 124/402] Remove empty context menu from toolbar --- src/gui/MainWindow.cpp | 7 ++----- src/gui/MainWindow.h | 1 - 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 30bb2cdf3..fa16adb80 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -114,6 +114,8 @@ MainWindow::MainWindow() { m_ui->setupUi(this); + m_ui->toolBar->setContextMenuPolicy(Qt::PreventContextMenu); + // Setup the search widget in the toolbar SearchWidget *search = new SearchWidget(); search->connectSignals(m_actionMultiplexer); @@ -822,11 +824,6 @@ void MainWindow::showGroupContextMenu(const QPoint& globalPos) m_ui->menuGroups->popup(globalPos); } -void MainWindow::saveToolbarState(bool value) -{ - config()->set("ShowToolbar", value); -} - void MainWindow::setShortcut(QAction* action, QKeySequence::StandardKey standard, int fallback) { if (!QKeySequence::keyBindings(standard).isEmpty()) { diff --git a/src/gui/MainWindow.h b/src/gui/MainWindow.h index ea17107ad..ade339c56 100644 --- a/src/gui/MainWindow.h +++ b/src/gui/MainWindow.h @@ -87,7 +87,6 @@ private slots: void updateCopyAttributesMenu(); void showEntryContextMenu(const QPoint& globalPos); void showGroupContextMenu(const QPoint& globalPos); - void saveToolbarState(bool value); void rememberOpenDatabases(const QString& filePath); void applySettingsChanges(); void trayIconTriggered(QSystemTrayIcon::ActivationReason reason); From 5fa76dfd66e90b5efb4a4a159c034ea130e89059 Mon Sep 17 00:00:00 2001 From: Weslly <weslly.honorato@gmail.com> Date: Sun, 26 Nov 2017 22:59:48 -0200 Subject: [PATCH 125/402] Remove `ShowToolbar` from config --- share/keepassxc.ini | 1 - src/core/Config.cpp | 1 - 2 files changed, 2 deletions(-) diff --git a/share/keepassxc.ini b/share/keepassxc.ini index f7ff52cbc..c6f0654fe 100644 --- a/share/keepassxc.ini +++ b/share/keepassxc.ini @@ -1,5 +1,4 @@ [General] -ShowToolbar=true RememberLastDatabases=true RememberLastKeyFiles=true OpenPreviousDatabasesOnStartup=true diff --git a/src/core/Config.cpp b/src/core/Config.cpp index 6899015a6..2047919b1 100644 --- a/src/core/Config.cpp +++ b/src/core/Config.cpp @@ -114,7 +114,6 @@ void Config::init(const QString& fileName) m_defaults.insert("AutoSaveAfterEveryChange", false); m_defaults.insert("AutoReloadOnChange", true); m_defaults.insert("AutoSaveOnExit", false); - m_defaults.insert("ShowToolbar", true); m_defaults.insert("SearchLimitGroup", false); m_defaults.insert("MinimizeOnCopy", false); m_defaults.insert("UseGroupIconOnEntryCreation", false); From d35f3fc573cee42ec9cd00a4a20aea0438862a06 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Mon, 27 Nov 2017 20:39:44 +0100 Subject: [PATCH 126/402] Treat warning as errors --- CMakeLists.txt | 2 +- src/http/qhttp/http-parser/http_parser.c | 6 ++++++ src/sshagent/SSHAgent.cpp | 2 +- src/sshagent/SSHAgent.h | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b86f0eee7..ec7682c6c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -97,7 +97,7 @@ if(WITH_APP_BUNDLE) endif() add_gcc_compiler_flags("-fno-common") -add_gcc_compiler_flags("-Wall -Wextra -Wundef -Wpointer-arith -Wno-long-long") +add_gcc_compiler_flags("-Wall -Werror -Wextra -Wundef -Wpointer-arith -Wno-long-long") add_gcc_compiler_flags("-Wformat=2 -Wmissing-format-attribute") add_gcc_compiler_flags("-fvisibility=hidden") add_gcc_compiler_cxxflags("-fvisibility-inlines-hidden") diff --git a/src/http/qhttp/http-parser/http_parser.c b/src/http/qhttp/http-parser/http_parser.c index 895bf0c73..ab48d0cb5 100644 --- a/src/http/qhttp/http-parser/http_parser.c +++ b/src/http/qhttp/http-parser/http_parser.c @@ -1815,6 +1815,9 @@ reexecute: case 2: parser->upgrade = 1; +#if __GNUC__ >= 7 + __attribute__ ((fallthrough)); +#endif case 1: parser->flags |= F_SKIPBODY; @@ -2374,6 +2377,9 @@ http_parser_parse_url(const char *buf, size_t buflen, int is_connect, case s_req_server_with_at: found_at = 1; +#if __GNUC__ >= 7 + __attribute__ ((fallthrough)); +#endif /* FALLTROUGH */ case s_req_server: diff --git a/src/sshagent/SSHAgent.cpp b/src/sshagent/SSHAgent.cpp index a398eb4be..7969fe0cc 100644 --- a/src/sshagent/SSHAgent.cpp +++ b/src/sshagent/SSHAgent.cpp @@ -95,7 +95,7 @@ bool SSHAgent::sendMessage(const QByteArray& in, QByteArray& out) const return false; } - if (in.length() > AGENT_MAX_MSGLEN - 4) { + if (static_cast<quint32>(in.length()) > AGENT_MAX_MSGLEN - 4) { return false; } diff --git a/src/sshagent/SSHAgent.h b/src/sshagent/SSHAgent.h index e96f59e59..078ff7b0d 100644 --- a/src/sshagent/SSHAgent.h +++ b/src/sshagent/SSHAgent.h @@ -63,7 +63,7 @@ private: #ifndef Q_OS_WIN QString m_socketPath; #else - const int AGENT_MAX_MSGLEN = 8192; + const quint32 AGENT_MAX_MSGLEN = 8192; const quint32 AGENT_COPYDATA_ID = 0x804e50ba; #endif From 8c7ef64fabb4cfc0d321fd04f7722d6ea67b3610 Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Sun, 12 Nov 2017 14:34:13 +0200 Subject: [PATCH 127/402] Show "Can't resolve placeholder" warning only in debug mode --- src/core/Entry.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index 53a1ad225..9dd019d56 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -730,8 +730,10 @@ QString Entry::resolvePlaceholderRecursive(const QString &placeholder, int maxDe case PlaceholderType::NotPlaceholder: return placeholder; case PlaceholderType::Unknown: - qWarning("Can't resolve placeholder %s for entry with uuid %s", qPrintable(placeholder), - qPrintable(uuid().toHex())); +#ifdef QT_DEBUG + qWarning("Can't resolve placeholder \"%s\" for entry with title: \"%s\" (uuid \"%s\") ", + qPrintable(placeholder), qPrintable(title()), qPrintable(uuid().toHex())); +#endif return placeholder; case PlaceholderType::Title: return title(); From d4d0f4c131a1e8cba473e1142ef6a577db17376a Mon Sep 17 00:00:00 2001 From: Martin Unzner <martin.u@posteo.de> Date: Sun, 12 Nov 2017 18:11:52 +0100 Subject: [PATCH 128/402] Add failing test for complete entry resolution --- tests/TestEntry.cpp | 82 +++++++++++++++++++++++++++++++++++++++++++++ tests/TestEntry.h | 1 + 2 files changed, 83 insertions(+) diff --git a/tests/TestEntry.cpp b/tests/TestEntry.cpp index 90da71d56..802a27b72 100644 --- a/tests/TestEntry.cpp +++ b/tests/TestEntry.cpp @@ -344,3 +344,85 @@ void TestEntry::testResolveReferencePlaceholders() QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:A@I:%1}").arg(entry3->uuid().toHex())), QString("UrlValue")); QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:N@I:%1}").arg(entry3->uuid().toHex())), QString("NotesValue")); } + +static const char placeholders[] = { +'T', +'U', +'P', +'A', +'N', +}; + +void TestEntry::testResolveNonIdPlaceholdersToUuid() +{ + Database db; + auto* root = db.rootGroup(); + + Entry referencedEntryTitle; + referencedEntryTitle.setGroup(root); + referencedEntryTitle.setTitle("myTitle"); + referencedEntryTitle.setUuid(Uuid::random()); + + Entry referencedEntryUsername; + referencedEntryUsername.setGroup(root); + referencedEntryUsername.setUsername("myUser"); + referencedEntryUsername.setUuid(Uuid::random()); + + Entry referencedEntryPassword; + referencedEntryPassword.setGroup(root); + referencedEntryPassword.setPassword("myPassword"); + referencedEntryPassword.setUuid(Uuid::random()); + + Entry referencedEntryUrl; + referencedEntryUrl.setGroup(root); + referencedEntryUrl.setUrl("myUrl"); + referencedEntryUrl.setUuid(Uuid::random()); + + Entry referencedEntryNotes; + referencedEntryNotes.setGroup(root); + referencedEntryNotes.setNotes("myNotes"); + referencedEntryNotes.setUuid(Uuid::random()); + + for (const auto searchIn : placeholders) { + const Entry* referencedEntry = nullptr; + QString newEntryNotesRaw("{REF:I@%1:%2}"); + + switch(searchIn) { + case 'T': + referencedEntry = &referencedEntryTitle; + newEntryNotesRaw = newEntryNotesRaw.arg( + QString(searchIn), referencedEntry->title()); + break; + case 'U': + referencedEntry = &referencedEntryUsername; + newEntryNotesRaw = newEntryNotesRaw.arg( + QString(searchIn), referencedEntry->username()); + break; + case 'P': + referencedEntry = &referencedEntryPassword; + newEntryNotesRaw = newEntryNotesRaw.arg( + QString(searchIn), referencedEntry->password()); + break; + case 'A': + referencedEntry = &referencedEntryUrl; + newEntryNotesRaw = newEntryNotesRaw.arg( + QString(searchIn), referencedEntry->url()); + break; + case 'N': + referencedEntry = &referencedEntryNotes; + newEntryNotesRaw = newEntryNotesRaw.arg( + QString(searchIn), referencedEntry->notes()); + break; + default: + break; + } + + Entry newEntry; + newEntry.setGroup(root); + newEntry.setNotes(newEntryNotesRaw); + + const auto newEntryNotesResolved = + newEntry.resolveMultiplePlaceholders(newEntry.notes()); + QCOMPARE(newEntryNotesResolved, QString(referencedEntry->uuid().toHex())); + } +} diff --git a/tests/TestEntry.h b/tests/TestEntry.h index c6a72b05c..44a371ba6 100644 --- a/tests/TestEntry.h +++ b/tests/TestEntry.h @@ -35,6 +35,7 @@ private slots: void testResolveUrlPlaceholders(); void testResolveRecursivePlaceholders(); void testResolveReferencePlaceholders(); + void testResolveNonIdPlaceholdersToUuid(); }; #endif // KEEPASSX_TESTENTRY_H From 806dd5d78376005c64b7431b4f0dedd4a746cb81 Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Sun, 12 Nov 2017 17:21:11 +0200 Subject: [PATCH 129/402] Add unit test to search for referenced entries based on fields other than ID --- tests/TestEntry.cpp | 49 +++++++++++++++++++++++++++++++++++++++++++++ tests/TestEntry.h | 1 + 2 files changed, 50 insertions(+) diff --git a/tests/TestEntry.cpp b/tests/TestEntry.cpp index 1e863dbeb..d6ff53576 100644 --- a/tests/TestEntry.cpp +++ b/tests/TestEntry.cpp @@ -262,3 +262,52 @@ void TestEntry::testResolveRecursivePlaceholders() QCOMPARE(entry5->resolveMultiplePlaceholders(entry5->url()), url); QCOMPARE(entry5->resolveMultiplePlaceholders(entry5->title()), QString("title+/some/path+fragment+title")); } + +void TestEntry::testResolveReferencePlaceholders() +{ + Database db; + Group* root = db.rootGroup(); + + Entry* entry1 = new Entry(); + entry1->setGroup(root); + entry1->setUuid(Uuid::random()); + entry1->setTitle("Title1"); + entry1->setUsername("Username1"); + entry1->setPassword("Password1"); + entry1->setUrl("Url1"); + entry1->setNotes("Notes1"); + entry1->attributes()->set("CustomAttribute1", "CustomAttributeValue1"); + + Group* group = new Group(); + group->setParent(root); + Entry* entry2 = new Entry(); + entry2->setGroup(root); + entry2->setUuid(Uuid::random()); + entry2->setTitle("Title2"); + entry2->setUsername("Username2"); + entry2->setPassword("password2"); + entry2->setUrl("Url2"); + entry2->setNotes("Notes2"); + entry2->attributes()->set("CustomAttribute2", "CustomAttributeValue2"); + entry2->attributes()->set("CustomAttribute21", "CustomAttributeValue21"); + + Entry* entry3 = new Entry(); + entry3->setGroup(root); + entry3->setUuid(Uuid::random()); + + QCOMPARE(entry3->resolveMultiplePlaceholders(QString("{REF:T@I:%1}").arg(entry1->uuid().toHex())), QString("Title1")); + QCOMPARE(entry3->resolveMultiplePlaceholders(QString("{REF:T@T:%1}").arg(entry1->title())), QString("Title1")); + QCOMPARE(entry3->resolveMultiplePlaceholders(QString("{REF:T@U:%1}").arg(entry1->username())), QString("Title1")); + QCOMPARE(entry3->resolveMultiplePlaceholders(QString("{REF:T@P:%1}").arg(entry1->password())), QString("Title1")); + QCOMPARE(entry3->resolveMultiplePlaceholders(QString("{REF:T@A:%1}").arg(entry1->url())), QString("Title1")); + QCOMPARE(entry3->resolveMultiplePlaceholders(QString("{REF:T@N:%1}").arg(entry1->notes())), QString("Title1")); + QCOMPARE(entry3->resolveMultiplePlaceholders(QString("{REF:T@O:%1}").arg(entry1->attributes()->value("CustomAttribute1"))), QString("Title1")); + + QCOMPARE(entry3->resolveMultiplePlaceholders(QString("{REF:T@I:%1}").arg(entry1->uuid().toHex())), QString("Title1")); + QCOMPARE(entry3->resolveMultiplePlaceholders(QString("{REF:T@T:%1}").arg(entry1->title())), QString("Title1")); + QCOMPARE(entry3->resolveMultiplePlaceholders(QString("{REF:U@U:%1}").arg(entry1->username())), QString("Username1")); + QCOMPARE(entry3->resolveMultiplePlaceholders(QString("{REF:P@P:%1}").arg(entry1->password())), QString("Password1")); + QCOMPARE(entry3->resolveMultiplePlaceholders(QString("{REF:A@A:%1}").arg(entry1->url())), QString("Url1")); + QCOMPARE(entry3->resolveMultiplePlaceholders(QString("{REF:N@N:%1}").arg(entry1->notes())), QString("Notes1")); + QCOMPARE(entry3->resolveMultiplePlaceholders(QString("{REF:O@O:%1}").arg(entry1->attributes()->value("CustomAttribute1"))), QString("CustomAttributeValue1")); +} diff --git a/tests/TestEntry.h b/tests/TestEntry.h index 50fec57a5..c6a72b05c 100644 --- a/tests/TestEntry.h +++ b/tests/TestEntry.h @@ -34,6 +34,7 @@ private slots: void testResolveUrl(); void testResolveUrlPlaceholders(); void testResolveRecursivePlaceholders(); + void testResolveReferencePlaceholders(); }; #endif // KEEPASSX_TESTENTRY_H From b44092ac43478af6fb80593e5b278ab08278359a Mon Sep 17 00:00:00 2001 From: Martin Unzner <martin.u@posteo.de> Date: Sun, 12 Nov 2017 18:58:42 +0100 Subject: [PATCH 130/402] Add capability to resolve UUID --- src/core/Entry.cpp | 2 ++ src/core/EntryAttributes.cpp | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index 05f24b5a1..65e2454e2 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -838,6 +838,8 @@ QString Entry::referenceFieldValue(EntryReferenceType referenceType) const return url(); case EntryReferenceType::Notes: return notes(); + case EntryReferenceType::Uuid: + return uuid().toHex(); default: break; } diff --git a/src/core/EntryAttributes.cpp b/src/core/EntryAttributes.cpp index b1b4fad6a..21dcccf6e 100644 --- a/src/core/EntryAttributes.cpp +++ b/src/core/EntryAttributes.cpp @@ -34,7 +34,7 @@ const QString EntryAttributes::RememberCmdExecAttr = "_EXEC_CMD"; EntryAttributes::EntryAttributes(QObject* parent) : QObject(parent) - , m_referenceRegExp("\\{REF:(?<WantedField>[TUPAN])@(?<SearchIn>[TUPANIO]):(?<SearchText>[^}]+)\\}", + , m_referenceRegExp("\\{REF:(?<WantedField>[TUPANI])@(?<SearchIn>[TUPANIO]):(?<SearchText>[^}]+)\\}", QRegularExpression::CaseInsensitiveOption) { clear(); From 4c4d8a5e848c2aaba14f3dc7c1e51072e9e984f9 Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Sun, 12 Nov 2017 17:35:54 +0200 Subject: [PATCH 131/402] Implement search for reference placeholder based on fields other than ID --- src/core/Database.cpp | 55 ++++++++++++++++++ src/core/Database.h | 3 + src/core/Entry.cpp | 109 ++++++++++++++++++++++++----------- src/core/Entry.h | 15 +++++ src/core/EntryAttributes.cpp | 22 ++++--- src/core/EntryAttributes.h | 10 +++- tests/TestEntry.cpp | 65 ++++++++++++++++----- 7 files changed, 220 insertions(+), 59 deletions(-) diff --git a/src/core/Database.cpp b/src/core/Database.cpp index 3913f8090..99dd94ef1 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -98,6 +98,11 @@ Entry* Database::resolveEntry(const Uuid& uuid) return recFindEntry(uuid, m_rootGroup); } +Entry *Database::resolveEntry(const QString &text, EntryReferenceType referenceType) +{ + return recFindEntry(text, referenceType, m_rootGroup); +} + Entry* Database::recFindEntry(const Uuid& uuid, Group* group) { const QList<Entry*> entryList = group->entries(); @@ -118,6 +123,56 @@ Entry* Database::recFindEntry(const Uuid& uuid, Group* group) return nullptr; } +Entry *Database::recFindEntry(const QString &text, EntryReferenceType referenceType, Group *group) +{ + Q_ASSERT_X(referenceType != EntryReferenceType::Unknown, "Database::recFindEntry", + "Can't search entry with \"referenceType\" parameter equal to \"Unknown\""); + + bool found = false; + const QList<Entry*> entryList = group->entries(); + for (Entry* entry : entryList) { + switch (referenceType) { + case EntryReferenceType::Unknown: + return nullptr; + case EntryReferenceType::Title: + found = entry->title() == text; + break; + case EntryReferenceType::UserName: + found = entry->username() == text; + break; + case EntryReferenceType::Password: + found = entry->password() == text; + break; + case EntryReferenceType::Url: + found = entry->url() == text; + break; + case EntryReferenceType::Notes: + found = entry->notes() == text; + break; + case EntryReferenceType::Uuid: + found = entry->uuid().toHex() == text; + break; + case EntryReferenceType::CustomAttributes: + found = entry->attributes()->containsValue(text); + break; + } + + if (found) { + return entry; + } + } + + const QList<Group*> children = group->children(); + for (Group* child : children) { + Entry* result = recFindEntry(text, referenceType, child); + if (result) { + return result; + } + } + + return nullptr; +} + Group* Database::resolveGroup(const Uuid& uuid) { return recFindGroup(uuid, m_rootGroup); diff --git a/src/core/Database.h b/src/core/Database.h index 26b150253..14cb0bcaf 100644 --- a/src/core/Database.h +++ b/src/core/Database.h @@ -27,6 +27,7 @@ #include "keys/CompositeKey.h" class Entry; +enum class EntryReferenceType; class Group; class Metadata; class QTimer; @@ -81,6 +82,7 @@ public: Metadata* metadata(); const Metadata* metadata() const; Entry* resolveEntry(const Uuid& uuid); + Entry* resolveEntry(const QString& text, EntryReferenceType referenceType); Group* resolveGroup(const Uuid& uuid); QList<DeletedObject> deletedObjects(); void addDeletedObject(const DeletedObject& delObj); @@ -142,6 +144,7 @@ private slots: private: Entry* recFindEntry(const Uuid& uuid, Group* group); + Entry* recFindEntry(const QString& text, EntryReferenceType referenceType, Group* group); Group* recFindGroup(const Uuid& uuid, Group* group); void createRecycleBin(); diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index 9dd019d56..05f24b5a1 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -92,6 +92,29 @@ void Entry::setUpdateTimeinfo(bool value) m_updateTimeinfo = value; } +EntryReferenceType Entry::referenceType(const QString& referenceStr) +{ + const QString referenceLowerStr = referenceStr.toLower(); + EntryReferenceType result = EntryReferenceType::Unknown; + if (referenceLowerStr == QLatin1String("t")) { + result = EntryReferenceType::Title; + } else if (referenceLowerStr == QLatin1String("u")) { + result = EntryReferenceType::UserName; + } else if (referenceLowerStr == QLatin1String("p")) { + result = EntryReferenceType::Password; + } else if (referenceLowerStr == QLatin1String("a")) { + result = EntryReferenceType::Url; + } else if (referenceLowerStr == QLatin1String("n")) { + result = EntryReferenceType::Notes; + } else if (referenceLowerStr == QLatin1String("i")) { + result = EntryReferenceType::Uuid; + } else if (referenceLowerStr == QLatin1String("o")) { + result = EntryReferenceType::CustomAttributes; + } + + return result; +} + Uuid Entry::uuid() const { return m_uuid; @@ -764,45 +787,63 @@ QString Entry::resolvePlaceholderRecursive(const QString &placeholder, int maxDe const QString key = placeholder.mid(3, placeholder.length() - 4); // {S:attr} => mid(3, len - 4) return attributes()->hasKey(key) ? attributes()->value(key) : QString(); } - case PlaceholderType::Reference: { - // resolving references in format: {REF:<WantedField>@I:<uuid of referenced entry>} - // using format from http://keepass.info/help/base/fieldrefs.html at the time of writing, - // but supporting lookups of standard fields and references by UUID only - - QString result; - QRegExp* referenceRegExp = m_attributes->referenceRegExp(); - if (referenceRegExp->indexIn(placeholder) != -1) { - constexpr int wantedFieldIndex = 1; - constexpr int referencedUuidIndex = 2; - const Uuid referencedUuid(QByteArray::fromHex(referenceRegExp->cap(referencedUuidIndex).toLatin1())); - const Entry* refEntry = m_group->database()->resolveEntry(referencedUuid); - if (refEntry) { - const QString wantedField = referenceRegExp->cap(wantedFieldIndex).toLower(); - if (wantedField == "t") { - result = refEntry->title(); - } else if (wantedField == "u") { - result = refEntry->username(); - } else if (wantedField == "p") { - result = refEntry->password(); - } else if (wantedField == "a") { - result = refEntry->url(); - } else if (wantedField == "n") { - result = refEntry->notes(); - } - - // Referencing fields of other entries only works with standard fields, not with custom user strings. - // If you want to reference a custom user string, you need to place a redirection in a standard field - // of the entry with the custom string, using {S:<Name>}, and reference the standard field. - result = refEntry->resolveMultiplePlaceholdersRecursive(result, maxDepth - 1); - } - } - return result; - } + case PlaceholderType::Reference: + return resolveReferencePlaceholderRecursive(placeholder, maxDepth); } return placeholder; } +QString Entry::resolveReferencePlaceholderRecursive(const QString &placeholder, int maxDepth) const +{ + // resolving references in format: {REF:<WantedField>@<SearchIn>:<SearchText>} + // using format from http://keepass.info/help/base/fieldrefs.html at the time of writing + + QRegularExpression* referenceRegExp = m_attributes->referenceRegExp(); + QRegularExpressionMatch match = referenceRegExp->match(placeholder); + if (!match.hasMatch()) { + return placeholder; + } + + QString result; + const QString searchIn = match.captured(EntryAttributes::SearchInGroupName); + const QString searchText = match.captured(EntryAttributes::SearchTextGroupName); + + const EntryReferenceType searchInType = Entry::referenceType(searchIn); + const Entry* refEntry = m_group->database()->resolveEntry(searchText, searchInType); + + if (refEntry) { + const QString wantedField = match.captured(EntryAttributes::WantedFieldGroupName); + result = refEntry->referenceFieldValue(Entry::referenceType(wantedField)); + + // Referencing fields of other entries only works with standard fields, not with custom user strings. + // If you want to reference a custom user string, you need to place a redirection in a standard field + // of the entry with the custom string, using {S:<Name>}, and reference the standard field. + result = refEntry->resolveMultiplePlaceholdersRecursive(result, maxDepth - 1); + } + + return result; +} + +QString Entry::referenceFieldValue(EntryReferenceType referenceType) const +{ + switch (referenceType) { + case EntryReferenceType::Title: + return title(); + case EntryReferenceType::UserName: + return username(); + case EntryReferenceType::Password: + return password(); + case EntryReferenceType::Url: + return url(); + case EntryReferenceType::Notes: + return notes(); + default: + break; + } + return QString(); +} + Group* Entry::group() { return m_group; diff --git a/src/core/Entry.h b/src/core/Entry.h index d4d2b9034..af11478b9 100644 --- a/src/core/Entry.h +++ b/src/core/Entry.h @@ -36,6 +36,17 @@ class Database; class Group; +enum class EntryReferenceType { + Unknown, + Title, + UserName, + Password, + Url, + Notes, + Uuid, + CustomAttributes +}; + struct EntryData { int iconNumber; @@ -203,6 +214,10 @@ private slots: private: QString resolveMultiplePlaceholdersRecursive(const QString& str, int maxDepth) const; QString resolvePlaceholderRecursive(const QString& placeholder, int maxDepth) const; + QString resolveReferencePlaceholderRecursive(const QString& placeholder, int maxDepth) const; + QString referenceFieldValue(EntryReferenceType referenceType) const; + + static EntryReferenceType referenceType(const QString& referenceStr); const Database* database() const; template <class T> bool set(T& property, const T& value); diff --git a/src/core/EntryAttributes.cpp b/src/core/EntryAttributes.cpp index 8ffdaa8f5..b1b4fad6a 100644 --- a/src/core/EntryAttributes.cpp +++ b/src/core/EntryAttributes.cpp @@ -25,11 +25,17 @@ const QString EntryAttributes::URLKey = "URL"; const QString EntryAttributes::NotesKey = "Notes"; const QStringList EntryAttributes::DefaultAttributes(QStringList() << TitleKey << UserNameKey << PasswordKey << URLKey << NotesKey); + +const QString EntryAttributes::WantedFieldGroupName = "WantedField"; +const QString EntryAttributes::SearchInGroupName = "SearchIn"; +const QString EntryAttributes::SearchTextGroupName = "SearchText"; + const QString EntryAttributes::RememberCmdExecAttr = "_EXEC_CMD"; EntryAttributes::EntryAttributes(QObject* parent) : QObject(parent) - , m_referenceRegExp("\\{REF:([TUPAN])@I:([^}]+)\\}", Qt::CaseInsensitive, QRegExp::RegExp2) + , m_referenceRegExp("\\{REF:(?<WantedField>[TUPAN])@(?<SearchIn>[TUPANIO]):(?<SearchText>[^}]+)\\}", + QRegularExpression::CaseInsensitiveOption) { clear(); } @@ -66,6 +72,11 @@ bool EntryAttributes::contains(const QString &key) const return m_attributes.contains(key); } +bool EntryAttributes::containsValue(const QString &value) const +{ + return m_attributes.values().contains(value); +} + bool EntryAttributes::isProtected(const QString& key) const { return m_protectedAttributes.contains(key); @@ -78,14 +89,11 @@ bool EntryAttributes::isReference(const QString& key) const return false; } - QString data = value(key); - if (m_referenceRegExp.indexIn(data) != -1) { - return true; - } - return false; + const QString data = value(key); + return m_referenceRegExp.match(data).hasMatch(); } -QRegExp* EntryAttributes::referenceRegExp() +QRegularExpression* EntryAttributes::referenceRegExp() { return &m_referenceRegExp; } diff --git a/src/core/EntryAttributes.h b/src/core/EntryAttributes.h index 40fc5dec4..f28388654 100644 --- a/src/core/EntryAttributes.h +++ b/src/core/EntryAttributes.h @@ -21,6 +21,7 @@ #include <QMap> #include <QObject> +#include <QRegularExpression> #include <QSet> #include <QStringList> @@ -35,9 +36,10 @@ public: QList<QString> customKeys(); QString value(const QString& key) const; bool contains(const QString& key) const; + bool containsValue(const QString& value) const; bool isProtected(const QString& key) const; bool isReference(const QString& key) const; - QRegExp* referenceRegExp(); + QRegularExpression *referenceRegExp(); void set(const QString& key, const QString& value, bool protect = false); void remove(const QString& key); void rename(const QString& oldKey, const QString& newKey); @@ -58,6 +60,10 @@ public: static const QString RememberCmdExecAttr; static bool isDefaultAttribute(const QString& key); + static const QString WantedFieldGroupName; + static const QString SearchInGroupName; + static const QString SearchTextGroupName; + signals: void modified(); void defaultKeyModified(); @@ -74,7 +80,7 @@ signals: private: QMap<QString, QString> m_attributes; QSet<QString> m_protectedAttributes; - QRegExp m_referenceRegExp; + QRegularExpression m_referenceRegExp; }; #endif // KEEPASSX_ENTRYATTRIBUTES_H diff --git a/tests/TestEntry.cpp b/tests/TestEntry.cpp index d6ff53576..90da71d56 100644 --- a/tests/TestEntry.cpp +++ b/tests/TestEntry.cpp @@ -285,29 +285,62 @@ void TestEntry::testResolveReferencePlaceholders() entry2->setUuid(Uuid::random()); entry2->setTitle("Title2"); entry2->setUsername("Username2"); - entry2->setPassword("password2"); + entry2->setPassword("Password2"); entry2->setUrl("Url2"); entry2->setNotes("Notes2"); entry2->attributes()->set("CustomAttribute2", "CustomAttributeValue2"); - entry2->attributes()->set("CustomAttribute21", "CustomAttributeValue21"); Entry* entry3 = new Entry(); entry3->setGroup(root); entry3->setUuid(Uuid::random()); + entry3->setTitle("{S:AttributeTitle}"); + entry3->setUsername("{S:AttributeUsername}"); + entry3->setPassword("{S:AttributePassword}"); + entry3->setUrl("{S:AttributeUrl}"); + entry3->setNotes("{S:AttributeNotes}"); + entry3->attributes()->set("AttributeTitle", "TitleValue"); + entry3->attributes()->set("AttributeUsername", "UsernameValue"); + entry3->attributes()->set("AttributePassword", "PasswordValue"); + entry3->attributes()->set("AttributeUrl", "UrlValue"); + entry3->attributes()->set("AttributeNotes", "NotesValue"); - QCOMPARE(entry3->resolveMultiplePlaceholders(QString("{REF:T@I:%1}").arg(entry1->uuid().toHex())), QString("Title1")); - QCOMPARE(entry3->resolveMultiplePlaceholders(QString("{REF:T@T:%1}").arg(entry1->title())), QString("Title1")); - QCOMPARE(entry3->resolveMultiplePlaceholders(QString("{REF:T@U:%1}").arg(entry1->username())), QString("Title1")); - QCOMPARE(entry3->resolveMultiplePlaceholders(QString("{REF:T@P:%1}").arg(entry1->password())), QString("Title1")); - QCOMPARE(entry3->resolveMultiplePlaceholders(QString("{REF:T@A:%1}").arg(entry1->url())), QString("Title1")); - QCOMPARE(entry3->resolveMultiplePlaceholders(QString("{REF:T@N:%1}").arg(entry1->notes())), QString("Title1")); - QCOMPARE(entry3->resolveMultiplePlaceholders(QString("{REF:T@O:%1}").arg(entry1->attributes()->value("CustomAttribute1"))), QString("Title1")); + Entry* tstEntry = new Entry(); + tstEntry->setGroup(root); + tstEntry->setUuid(Uuid::random()); - QCOMPARE(entry3->resolveMultiplePlaceholders(QString("{REF:T@I:%1}").arg(entry1->uuid().toHex())), QString("Title1")); - QCOMPARE(entry3->resolveMultiplePlaceholders(QString("{REF:T@T:%1}").arg(entry1->title())), QString("Title1")); - QCOMPARE(entry3->resolveMultiplePlaceholders(QString("{REF:U@U:%1}").arg(entry1->username())), QString("Username1")); - QCOMPARE(entry3->resolveMultiplePlaceholders(QString("{REF:P@P:%1}").arg(entry1->password())), QString("Password1")); - QCOMPARE(entry3->resolveMultiplePlaceholders(QString("{REF:A@A:%1}").arg(entry1->url())), QString("Url1")); - QCOMPARE(entry3->resolveMultiplePlaceholders(QString("{REF:N@N:%1}").arg(entry1->notes())), QString("Notes1")); - QCOMPARE(entry3->resolveMultiplePlaceholders(QString("{REF:O@O:%1}").arg(entry1->attributes()->value("CustomAttribute1"))), QString("CustomAttributeValue1")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@I:%1}").arg(entry1->uuid().toHex())), QString("Title1")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@T:%1}").arg(entry1->title())), QString("Title1")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@U:%1}").arg(entry1->username())), QString("Title1")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@P:%1}").arg(entry1->password())), QString("Title1")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@A:%1}").arg(entry1->url())), QString("Title1")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@N:%1}").arg(entry1->notes())), QString("Title1")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@O:%1}").arg(entry1->attributes()->value("CustomAttribute1"))), QString("Title1")); + + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@I:%1}").arg(entry1->uuid().toHex())), QString("Title1")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@T:%1}").arg(entry1->title())), QString("Title1")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:U@U:%1}").arg(entry1->username())), QString("Username1")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:P@P:%1}").arg(entry1->password())), QString("Password1")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:A@A:%1}").arg(entry1->url())), QString("Url1")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:N@N:%1}").arg(entry1->notes())), QString("Notes1")); + + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@I:%1}").arg(entry2->uuid().toHex())), QString("Title2")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@T:%1}").arg(entry2->title())), QString("Title2")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@U:%1}").arg(entry2->username())), QString("Title2")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@P:%1}").arg(entry2->password())), QString("Title2")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@A:%1}").arg(entry2->url())), QString("Title2")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@N:%1}").arg(entry2->notes())), QString("Title2")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@O:%1}").arg(entry2->attributes()->value("CustomAttribute2"))), QString("Title2")); + + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@T:%1}").arg(entry2->title())), QString("Title2")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:U@U:%1}").arg(entry2->username())), QString("Username2")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:P@P:%1}").arg(entry2->password())), QString("Password2")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:A@A:%1}").arg(entry2->url())), QString("Url2")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:N@N:%1}").arg(entry2->notes())), QString("Notes2")); + + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@I:%1}").arg(entry3->uuid().toHex())), QString("TitleValue")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@I:%1}").arg(entry3->uuid().toHex())), QString("TitleValue")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:U@I:%1}").arg(entry3->uuid().toHex())), QString("UsernameValue")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:P@I:%1}").arg(entry3->uuid().toHex())), QString("PasswordValue")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:A@I:%1}").arg(entry3->uuid().toHex())), QString("UrlValue")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:N@I:%1}").arg(entry3->uuid().toHex())), QString("NotesValue")); } From d99dee9c40d8c9c3444ed0f3851dd7195a06a5ab Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Sun, 19 Nov 2017 21:06:09 +0200 Subject: [PATCH 132/402] Small refactoring related to references placeholders --- src/core/Database.cpp | 22 ++++---- src/core/Database.h | 6 +-- src/core/Entry.cpp | 15 +++--- src/core/Entry.h | 2 +- src/core/EntryAttachments.cpp | 2 +- src/core/EntryAttributes.cpp | 22 ++++---- src/core/EntryAttributes.h | 4 +- tests/TestEntry.cpp | 94 +++++++++++++++-------------------- 8 files changed, 78 insertions(+), 89 deletions(-) diff --git a/src/core/Database.cpp b/src/core/Database.cpp index 99dd94ef1..7ae9308a0 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -95,15 +95,15 @@ const Metadata* Database::metadata() const Entry* Database::resolveEntry(const Uuid& uuid) { - return recFindEntry(uuid, m_rootGroup); + return findEntryRecursive(uuid, m_rootGroup); } -Entry *Database::resolveEntry(const QString &text, EntryReferenceType referenceType) +Entry* Database::resolveEntry(const QString& text, EntryReferenceType referenceType) { - return recFindEntry(text, referenceType, m_rootGroup); + return findEntryRecursive(text, referenceType, m_rootGroup); } -Entry* Database::recFindEntry(const Uuid& uuid, Group* group) +Entry* Database::findEntryRecursive(const Uuid& uuid, Group* group) { const QList<Entry*> entryList = group->entries(); for (Entry* entry : entryList) { @@ -114,7 +114,7 @@ Entry* Database::recFindEntry(const Uuid& uuid, Group* group) const QList<Group*> children = group->children(); for (Group* child : children) { - Entry* result = recFindEntry(uuid, child); + Entry* result = findEntryRecursive(uuid, child); if (result) { return result; } @@ -123,9 +123,9 @@ Entry* Database::recFindEntry(const Uuid& uuid, Group* group) return nullptr; } -Entry *Database::recFindEntry(const QString &text, EntryReferenceType referenceType, Group *group) +Entry* Database::findEntryRecursive(const QString& text, EntryReferenceType referenceType, Group* group) { - Q_ASSERT_X(referenceType != EntryReferenceType::Unknown, "Database::recFindEntry", + Q_ASSERT_X(referenceType != EntryReferenceType::Unknown, "Database::findEntryRecursive", "Can't search entry with \"referenceType\" parameter equal to \"Unknown\""); bool found = false; @@ -164,7 +164,7 @@ Entry *Database::recFindEntry(const QString &text, EntryReferenceType referenceT const QList<Group*> children = group->children(); for (Group* child : children) { - Entry* result = recFindEntry(text, referenceType, child); + Entry* result = findEntryRecursive(text, referenceType, child); if (result) { return result; } @@ -175,10 +175,10 @@ Entry *Database::recFindEntry(const QString &text, EntryReferenceType referenceT Group* Database::resolveGroup(const Uuid& uuid) { - return recFindGroup(uuid, m_rootGroup); + return findGroupRecursive(uuid, m_rootGroup); } -Group* Database::recFindGroup(const Uuid& uuid, Group* group) +Group* Database::findGroupRecursive(const Uuid& uuid, Group* group) { if (group->uuid() == uuid) { return group; @@ -186,7 +186,7 @@ Group* Database::recFindGroup(const Uuid& uuid, Group* group) const QList<Group*> children = group->children(); for (Group* child : children) { - Group* result = recFindGroup(uuid, child); + Group* result = findGroupRecursive(uuid, child); if (result) { return result; } diff --git a/src/core/Database.h b/src/core/Database.h index 14cb0bcaf..b20f897fe 100644 --- a/src/core/Database.h +++ b/src/core/Database.h @@ -143,9 +143,9 @@ private slots: void startModifiedTimer(); private: - Entry* recFindEntry(const Uuid& uuid, Group* group); - Entry* recFindEntry(const QString& text, EntryReferenceType referenceType, Group* group); - Group* recFindGroup(const Uuid& uuid, Group* group); + Entry* findEntryRecursive(const Uuid& uuid, Group* group); + Entry* findEntryRecursive(const QString& text, EntryReferenceType referenceType, Group* group); + Group* findGroupRecursive(const Uuid& uuid, Group* group); void createRecycleBin(); diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index 65e2454e2..11ae97d71 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -722,7 +722,7 @@ void Entry::updateModifiedSinceBegin() m_modifiedSinceBegin = true; } -QString Entry::resolveMultiplePlaceholdersRecursive(const QString &str, int maxDepth) const +QString Entry::resolveMultiplePlaceholdersRecursive(const QString& str, int maxDepth) const { if (maxDepth <= 0) { qWarning("Maximum depth of replacement has been reached. Entry uuid: %s", qPrintable(uuid().toHex())); @@ -746,7 +746,7 @@ QString Entry::resolveMultiplePlaceholdersRecursive(const QString &str, int maxD return result; } -QString Entry::resolvePlaceholderRecursive(const QString &placeholder, int maxDepth) const +QString Entry::resolvePlaceholderRecursive(const QString& placeholder, int maxDepth) const { const PlaceholderType typeOfPlaceholder = placeholderType(placeholder); switch (typeOfPlaceholder) { @@ -794,13 +794,12 @@ QString Entry::resolvePlaceholderRecursive(const QString &placeholder, int maxDe return placeholder; } -QString Entry::resolveReferencePlaceholderRecursive(const QString &placeholder, int maxDepth) const +QString Entry::resolveReferencePlaceholderRecursive(const QString& placeholder, int maxDepth) const { // resolving references in format: {REF:<WantedField>@<SearchIn>:<SearchText>} // using format from http://keepass.info/help/base/fieldrefs.html at the time of writing - QRegularExpression* referenceRegExp = m_attributes->referenceRegExp(); - QRegularExpressionMatch match = referenceRegExp->match(placeholder); + QRegularExpressionMatch match = EntryAttributes::matchReference(placeholder); if (!match.hasMatch()) { return placeholder; } @@ -903,7 +902,7 @@ const Database* Entry::database() const } } -QString Entry::maskPasswordPlaceholders(const QString &str) const +QString Entry::maskPasswordPlaceholders(const QString& str) const { QString result = str; result.replace(QRegExp("(\\{PASSWORD\\})", Qt::CaseInsensitive, QRegExp::RegExp2), "******"); @@ -920,7 +919,7 @@ QString Entry::resolvePlaceholder(const QString& placeholder) const return resolvePlaceholderRecursive(placeholder, ResolveMaximumDepth); } -QString Entry::resolveUrlPlaceholder(const QString &str, Entry::PlaceholderType placeholderType) const +QString Entry::resolveUrlPlaceholder(const QString& str, Entry::PlaceholderType placeholderType) const { if (str.isEmpty()) return QString(); @@ -956,7 +955,7 @@ QString Entry::resolveUrlPlaceholder(const QString &str, Entry::PlaceholderType return QString(); } -Entry::PlaceholderType Entry::placeholderType(const QString &placeholder) const +Entry::PlaceholderType Entry::placeholderType(const QString& placeholder) const { if (!placeholder.startsWith(QLatin1Char('{')) || !placeholder.endsWith(QLatin1Char('}'))) { return PlaceholderType::NotPlaceholder; diff --git a/src/core/Entry.h b/src/core/Entry.h index af11478b9..266254e65 100644 --- a/src/core/Entry.h +++ b/src/core/Entry.h @@ -181,7 +181,7 @@ public: QString maskPasswordPlaceholders(const QString& str) const; QString resolveMultiplePlaceholders(const QString& str) const; QString resolvePlaceholder(const QString& str) const; - QString resolveUrlPlaceholder(const QString &str, PlaceholderType placeholderType) const; + QString resolveUrlPlaceholder(const QString& str, PlaceholderType placeholderType) const; PlaceholderType placeholderType(const QString& placeholder) const; QString resolveUrl(const QString& url) const; diff --git a/src/core/EntryAttachments.cpp b/src/core/EntryAttachments.cpp index 8ff66277d..bab110576 100644 --- a/src/core/EntryAttachments.cpp +++ b/src/core/EntryAttachments.cpp @@ -86,7 +86,7 @@ void EntryAttachments::remove(const QString& key) emit modified(); } -void EntryAttachments::remove(const QStringList &keys) +void EntryAttachments::remove(const QStringList& keys) { if (keys.isEmpty()) { return; diff --git a/src/core/EntryAttributes.cpp b/src/core/EntryAttributes.cpp index 21dcccf6e..8cc7f2f0a 100644 --- a/src/core/EntryAttributes.cpp +++ b/src/core/EntryAttributes.cpp @@ -34,8 +34,6 @@ const QString EntryAttributes::RememberCmdExecAttr = "_EXEC_CMD"; EntryAttributes::EntryAttributes(QObject* parent) : QObject(parent) - , m_referenceRegExp("\\{REF:(?<WantedField>[TUPANI])@(?<SearchIn>[TUPANIO]):(?<SearchText>[^}]+)\\}", - QRegularExpression::CaseInsensitiveOption) { clear(); } @@ -67,12 +65,12 @@ QString EntryAttributes::value(const QString& key) const return m_attributes.value(key); } -bool EntryAttributes::contains(const QString &key) const +bool EntryAttributes::contains(const QString& key) const { return m_attributes.contains(key); } -bool EntryAttributes::containsValue(const QString &value) const +bool EntryAttributes::containsValue(const QString& value) const { return m_attributes.values().contains(value); } @@ -90,12 +88,7 @@ bool EntryAttributes::isReference(const QString& key) const } const QString data = value(key); - return m_referenceRegExp.match(data).hasMatch(); -} - -QRegularExpression* EntryAttributes::referenceRegExp() -{ - return &m_referenceRegExp; + return matchReference(data).hasMatch(); } void EntryAttributes::set(const QString& key, const QString& value, bool protect) @@ -266,6 +259,15 @@ bool EntryAttributes::operator!=(const EntryAttributes& other) const || m_protectedAttributes != other.m_protectedAttributes); } +QRegularExpressionMatch EntryAttributes::matchReference(const QString& text) +{ + static QRegularExpression referenceRegExp( + "\\{REF:(?<WantedField>[TUPANI])@(?<SearchIn>[TUPANIO]):(?<SearchText>[^}]+)\\}", + QRegularExpression::CaseInsensitiveOption); + + return referenceRegExp.match(text); +} + void EntryAttributes::clear() { emit aboutToBeReset(); diff --git a/src/core/EntryAttributes.h b/src/core/EntryAttributes.h index f28388654..f483b8a9b 100644 --- a/src/core/EntryAttributes.h +++ b/src/core/EntryAttributes.h @@ -39,7 +39,6 @@ public: bool containsValue(const QString& value) const; bool isProtected(const QString& key) const; bool isReference(const QString& key) const; - QRegularExpression *referenceRegExp(); void set(const QString& key, const QString& value, bool protect = false); void remove(const QString& key); void rename(const QString& oldKey, const QString& newKey); @@ -51,6 +50,8 @@ public: bool operator==(const EntryAttributes& other) const; bool operator!=(const EntryAttributes& other) const; + static QRegularExpressionMatch matchReference(const QString& text); + static const QString TitleKey; static const QString UserNameKey; static const QString PasswordKey; @@ -80,7 +81,6 @@ signals: private: QMap<QString, QString> m_attributes; QSet<QString> m_protectedAttributes; - QRegularExpression m_referenceRegExp; }; #endif // KEEPASSX_ENTRYATTRIBUTES_H diff --git a/tests/TestEntry.cpp b/tests/TestEntry.cpp index 802a27b72..bb1176453 100644 --- a/tests/TestEntry.cpp +++ b/tests/TestEntry.cpp @@ -281,7 +281,7 @@ void TestEntry::testResolveReferencePlaceholders() Group* group = new Group(); group->setParent(root); Entry* entry2 = new Entry(); - entry2->setGroup(root); + entry2->setGroup(group); entry2->setUuid(Uuid::random()); entry2->setTitle("Title2"); entry2->setUsername("Username2"); @@ -291,7 +291,7 @@ void TestEntry::testResolveReferencePlaceholders() entry2->attributes()->set("CustomAttribute2", "CustomAttributeValue2"); Entry* entry3 = new Entry(); - entry3->setGroup(root); + entry3->setGroup(group); entry3->setUuid(Uuid::random()); entry3->setTitle("{S:AttributeTitle}"); entry3->setUsername("{S:AttributeUsername}"); @@ -308,51 +308,43 @@ void TestEntry::testResolveReferencePlaceholders() tstEntry->setGroup(root); tstEntry->setUuid(Uuid::random()); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@I:%1}").arg(entry1->uuid().toHex())), QString("Title1")); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@T:%1}").arg(entry1->title())), QString("Title1")); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@U:%1}").arg(entry1->username())), QString("Title1")); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@P:%1}").arg(entry1->password())), QString("Title1")); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@A:%1}").arg(entry1->url())), QString("Title1")); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@N:%1}").arg(entry1->notes())), QString("Title1")); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@O:%1}").arg(entry1->attributes()->value("CustomAttribute1"))), QString("Title1")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@I:%1}").arg(entry1->uuid().toHex())), entry1->title()); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@T:%1}").arg(entry1->title())), entry1->title()); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@U:%1}").arg(entry1->username())), entry1->title()); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@P:%1}").arg(entry1->password())), entry1->title()); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@A:%1}").arg(entry1->url())), entry1->title()); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@N:%1}").arg(entry1->notes())), entry1->title()); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@O:%1}").arg(entry1->attributes()->value("CustomAttribute1"))), entry1->title()); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@I:%1}").arg(entry1->uuid().toHex())), QString("Title1")); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@T:%1}").arg(entry1->title())), QString("Title1")); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:U@U:%1}").arg(entry1->username())), QString("Username1")); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:P@P:%1}").arg(entry1->password())), QString("Password1")); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:A@A:%1}").arg(entry1->url())), QString("Url1")); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:N@N:%1}").arg(entry1->notes())), QString("Notes1")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@I:%1}").arg(entry1->uuid().toHex())), entry1->title()); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@T:%1}").arg(entry1->title())), entry1->title()); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:U@U:%1}").arg(entry1->username())), entry1->username()); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:P@P:%1}").arg(entry1->password())), entry1->password()); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:A@A:%1}").arg(entry1->url())), entry1->url()); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:N@N:%1}").arg(entry1->notes())), entry1->notes()); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@I:%1}").arg(entry2->uuid().toHex())), QString("Title2")); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@T:%1}").arg(entry2->title())), QString("Title2")); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@U:%1}").arg(entry2->username())), QString("Title2")); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@P:%1}").arg(entry2->password())), QString("Title2")); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@A:%1}").arg(entry2->url())), QString("Title2")); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@N:%1}").arg(entry2->notes())), QString("Title2")); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@O:%1}").arg(entry2->attributes()->value("CustomAttribute2"))), QString("Title2")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@I:%1}").arg(entry2->uuid().toHex())), entry2->title()); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@T:%1}").arg(entry2->title())), entry2->title()); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@U:%1}").arg(entry2->username())), entry2->title()); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@P:%1}").arg(entry2->password())), entry2->title()); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@A:%1}").arg(entry2->url())), entry2->title()); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@N:%1}").arg(entry2->notes())), entry2->title()); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@O:%1}").arg(entry2->attributes()->value("CustomAttribute2"))), entry2->title()); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@T:%1}").arg(entry2->title())), QString("Title2")); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:U@U:%1}").arg(entry2->username())), QString("Username2")); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:P@P:%1}").arg(entry2->password())), QString("Password2")); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:A@A:%1}").arg(entry2->url())), QString("Url2")); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:N@N:%1}").arg(entry2->notes())), QString("Notes2")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@T:%1}").arg(entry2->title())), entry2->title()); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:U@U:%1}").arg(entry2->username())), entry2->username()); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:P@P:%1}").arg(entry2->password())), entry2->password()); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:A@A:%1}").arg(entry2->url())), entry2->url()); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:N@N:%1}").arg(entry2->notes())), entry2->notes()); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@I:%1}").arg(entry3->uuid().toHex())), QString("TitleValue")); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@I:%1}").arg(entry3->uuid().toHex())), QString("TitleValue")); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:U@I:%1}").arg(entry3->uuid().toHex())), QString("UsernameValue")); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:P@I:%1}").arg(entry3->uuid().toHex())), QString("PasswordValue")); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:A@I:%1}").arg(entry3->uuid().toHex())), QString("UrlValue")); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:N@I:%1}").arg(entry3->uuid().toHex())), QString("NotesValue")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@I:%1}").arg(entry3->uuid().toHex())), entry3->attributes()->value("AttributeTitle")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@I:%1}").arg(entry3->uuid().toHex())), entry3->attributes()->value("AttributeTitle")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:U@I:%1}").arg(entry3->uuid().toHex())), entry3->attributes()->value("AttributeUsername")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:P@I:%1}").arg(entry3->uuid().toHex())), entry3->attributes()->value("AttributePassword")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:A@I:%1}").arg(entry3->uuid().toHex())), entry3->attributes()->value("AttributeUrl")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:N@I:%1}").arg(entry3->uuid().toHex())), entry3->attributes()->value("AttributeNotes")); } -static const char placeholders[] = { -'T', -'U', -'P', -'A', -'N', -}; - void TestEntry::testResolveNonIdPlaceholdersToUuid() { Database db; @@ -383,35 +375,31 @@ void TestEntry::testResolveNonIdPlaceholdersToUuid() referencedEntryNotes.setNotes("myNotes"); referencedEntryNotes.setUuid(Uuid::random()); - for (const auto searchIn : placeholders) { + const QList<QChar> placeholders{'T', 'U', 'P', 'A', 'N'}; + for (const QChar searchIn : placeholders) { const Entry* referencedEntry = nullptr; QString newEntryNotesRaw("{REF:I@%1:%2}"); - switch(searchIn) { + switch(searchIn.toLatin1()) { case 'T': referencedEntry = &referencedEntryTitle; - newEntryNotesRaw = newEntryNotesRaw.arg( - QString(searchIn), referencedEntry->title()); + newEntryNotesRaw = newEntryNotesRaw.arg(searchIn, referencedEntry->title()); break; case 'U': referencedEntry = &referencedEntryUsername; - newEntryNotesRaw = newEntryNotesRaw.arg( - QString(searchIn), referencedEntry->username()); + newEntryNotesRaw = newEntryNotesRaw.arg(searchIn, referencedEntry->username()); break; case 'P': referencedEntry = &referencedEntryPassword; - newEntryNotesRaw = newEntryNotesRaw.arg( - QString(searchIn), referencedEntry->password()); + newEntryNotesRaw = newEntryNotesRaw.arg(searchIn, referencedEntry->password()); break; case 'A': referencedEntry = &referencedEntryUrl; - newEntryNotesRaw = newEntryNotesRaw.arg( - QString(searchIn), referencedEntry->url()); + newEntryNotesRaw = newEntryNotesRaw.arg(searchIn, referencedEntry->url()); break; case 'N': referencedEntry = &referencedEntryNotes; - newEntryNotesRaw = newEntryNotesRaw.arg( - QString(searchIn), referencedEntry->notes()); + newEntryNotesRaw = newEntryNotesRaw.arg(searchIn, referencedEntry->notes()); break; default: break; From c4bbb76da4bcb4ee9b0c3c70967aabeb59f6a198 Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Mon, 20 Nov 2017 09:45:26 +0200 Subject: [PATCH 133/402] Remove "Can't resolve placeholder" warning (#1137) --- src/core/Entry.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index 11ae97d71..6169c1093 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -751,12 +751,7 @@ QString Entry::resolvePlaceholderRecursive(const QString& placeholder, int maxDe const PlaceholderType typeOfPlaceholder = placeholderType(placeholder); switch (typeOfPlaceholder) { case PlaceholderType::NotPlaceholder: - return placeholder; case PlaceholderType::Unknown: -#ifdef QT_DEBUG - qWarning("Can't resolve placeholder \"%s\" for entry with title: \"%s\" (uuid \"%s\") ", - qPrintable(placeholder), qPrintable(title()), qPrintable(uuid().toHex())); -#endif return placeholder; case PlaceholderType::Title: return title(); From 938cf8fce2d7dacef72d5638dc6787074466fc6d Mon Sep 17 00:00:00 2001 From: Mike Woudenberg <mwoudenberg@xebia.com> Date: Sun, 3 Dec 2017 13:17:43 +0100 Subject: [PATCH 134/402] Adds listener for Gnome specific screensaver activation --- src/core/ScreenLockListenerDBus.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/core/ScreenLockListenerDBus.cpp b/src/core/ScreenLockListenerDBus.cpp index 6c1b7fe96..03eed58ad 100644 --- a/src/core/ScreenLockListenerDBus.cpp +++ b/src/core/ScreenLockListenerDBus.cpp @@ -36,6 +36,14 @@ ScreenLockListenerDBus::ScreenLockListenerDBus(QWidget *parent): this, //receiver SLOT(freedesktopScreenSaver(bool))); + sessionBus.connect( + "org.gnome.ScreenSaver", // service + "/org/gnome/ScreenSaver", // path + "org.gnome.ScreenSaver", // interface + "ActiveChanged", // signal name + this, //receiver + SLOT(freedesktopScreenSaver(bool))); + sessionBus.connect( "org.gnome.SessionManager", // service "/org/gnome/SessionManager/Presence", // path From 1ce77e6f1583d8dad2b8f49c4787e99794a7ef8d Mon Sep 17 00:00:00 2001 From: Sebastian Marsching <sebastian-git-2016@marsching.com> Date: Sun, 3 Dec 2017 17:49:15 +0100 Subject: [PATCH 135/402] Remove WIX from default list of CPack generators. This ensures that MSI packages are only built when explicitly requested by using the "-G" parameter of cpack. --- src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ca918971d..89e3ebcbf 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -306,7 +306,7 @@ if(MINGW) "${CMAKE_SOURCE_DIR}/LICENSE.GPL-2" "${CMAKE_CURRENT_BINARY_DIR}/INSTALLER_LICENSE.txt") - set(CPACK_GENERATOR "ZIP;NSIS;WIX") + set(CPACK_GENERATOR "ZIP;NSIS") set(CPACK_STRIP_FILES ON) set(CPACK_PACKAGE_FILE_NAME "${PROGNAME}-${KEEPASSXC_VERSION}-${OUTPUT_FILE_POSTFIX}") set(CPACK_PACKAGE_INSTALL_DIRECTORY ${PROGNAME}) From 471e684151c90e35335a21e36d779cbdb3f8d61f Mon Sep 17 00:00:00 2001 From: louib <louib@users.noreply.github.com> Date: Mon, 4 Dec 2017 09:46:23 -0500 Subject: [PATCH 136/402] Rename EntropyMeter -> Estimate (#1250) * EntropyMeter -> Estimate * Cleaning estimate * Documentation * clang-formatting /cli --- src/cli/CMakeLists.txt | 4 +- src/cli/Clip.cpp | 4 +- src/cli/Command.cpp | 6 +- src/cli/EntropyMeter.cpp | 141 -------------------- src/cli/Estimate.cpp | 175 +++++++++++++++++++++++++ src/cli/{EntropyMeter.h => Estimate.h} | 12 +- src/cli/Extract.cpp | 1 - src/cli/List.cpp | 3 +- src/cli/Locate.cpp | 1 - src/cli/Merge.cpp | 12 +- src/cli/Utils.cpp | 1 - src/cli/keepassxc-cli.1 | 10 +- 12 files changed, 201 insertions(+), 169 deletions(-) delete mode 100644 src/cli/EntropyMeter.cpp create mode 100644 src/cli/Estimate.cpp rename src/cli/{EntropyMeter.h => Estimate.h} (81%) diff --git a/src/cli/CMakeLists.txt b/src/cli/CMakeLists.txt index e9f50d1a8..4c8620d55 100644 --- a/src/cli/CMakeLists.txt +++ b/src/cli/CMakeLists.txt @@ -22,8 +22,8 @@ set(cli_SOURCES Command.h Edit.cpp Edit.h - EntropyMeter.cpp - EntropyMeter.h + Estimate.cpp + Estimate.h Extract.cpp Extract.h List.cpp diff --git a/src/cli/Clip.cpp b/src/cli/Clip.cpp index d50b32f0c..dd51d7f0b 100644 --- a/src/cli/Clip.cpp +++ b/src/cli/Clip.cpp @@ -55,9 +55,7 @@ int Clip::execute(QStringList arguments) parser.addOption(keyFile); parser.addPositionalArgument("entry", QObject::tr("Path of the entry to clip.")); parser.addPositionalArgument( - "timeout", - QObject::tr("Timeout in seconds before clearing the clipboard."), - QString("[timeout]")); + "timeout", QObject::tr("Timeout in seconds before clearing the clipboard."), QString("[timeout]")); parser.process(arguments); const QStringList args = parser.positionalArguments(); diff --git a/src/cli/Command.cpp b/src/cli/Command.cpp index c7eff6b08..6ec07b7af 100644 --- a/src/cli/Command.cpp +++ b/src/cli/Command.cpp @@ -23,9 +23,9 @@ #include "Command.h" #include "Add.h" -#include "Edit.h" #include "Clip.h" -#include "EntropyMeter.h" +#include "Edit.h" +#include "Estimate.h" #include "Extract.h" #include "List.h" #include "Locate.h" @@ -62,7 +62,7 @@ void populateCommands() commands.insert(QString("add"), new Add()); commands.insert(QString("clip"), new Clip()); commands.insert(QString("edit"), new Edit()); - commands.insert(QString("entropy-meter"), new EntropyMeter()); + commands.insert(QString("estimate"), new Estimate()); commands.insert(QString("extract"), new Extract()); commands.insert(QString("locate"), new Locate()); commands.insert(QString("ls"), new List()); diff --git a/src/cli/EntropyMeter.cpp b/src/cli/EntropyMeter.cpp deleted file mode 100644 index 1632fe234..000000000 --- a/src/cli/EntropyMeter.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 or (at your option) - * version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "EntropyMeter.h" - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <zxcvbn.h> - -/* For pre-compiled headers under windows */ -#ifdef _WIN32 -#ifndef __MINGW32__ -#include "stdafx.h" -#endif -#endif - -EntropyMeter::EntropyMeter() -{ - this->name = QString("entropy-meter"); - this->description = QObject::tr("Calculate password entropy."); -} - -EntropyMeter::~EntropyMeter() -{ -} - -static void calculate(const char *pwd, int advanced) -{ - double e; - int len = strlen(pwd); - if (advanced == 0){ - e = ZxcvbnMatch(pwd, 0, 0); - printf("Pass '%s' \tLength %d\tEntropy %.3f\tLog10 %.3f\n", pwd, len, e, e * 0.301029996); - } else { - int ChkLen; - ZxcMatch_t *info, *p; - double m = 0.0; - e = ZxcvbnMatch(pwd, 0, &info); - for(p = info; p; p = p->Next) { - m += p->Entrpy; - } - m = e - m; - printf("Pass '%s' \tLength %d\tEntropy %.3f\tLog10 %.3f\n Multi-word extra bits %.1f\n", pwd, len, e, e * 0.301029996, m); - p = info; - ChkLen = 0; - while(p) { - int n; - switch(static_cast<int>(p->Type)) - { - case BRUTE_MATCH: printf(" Type: Bruteforce "); break; - case DICTIONARY_MATCH: printf(" Type: Dictionary "); break; - case DICT_LEET_MATCH: printf(" Type: Dict+Leet "); break; - case USER_MATCH: printf(" Type: User Words "); break; - case USER_LEET_MATCH: printf(" Type: User+Leet "); break; - case REPEATS_MATCH: printf(" Type: Repeated "); break; - case SEQUENCE_MATCH: printf(" Type: Sequence "); break; - case SPATIAL_MATCH: printf(" Type: Spatial "); break; - case DATE_MATCH: printf(" Type: Date "); break; - case BRUTE_MATCH+MULTIPLE_MATCH: printf(" Type: Bruteforce(Rep)"); break; - case DICTIONARY_MATCH+MULTIPLE_MATCH: printf(" Type: Dictionary(Rep)"); break; - case DICT_LEET_MATCH+MULTIPLE_MATCH: printf(" Type: Dict+Leet(Rep) "); break; - case USER_MATCH+MULTIPLE_MATCH: printf(" Type: User Words(Rep)"); break; - case USER_LEET_MATCH+MULTIPLE_MATCH: printf(" Type: User+Leet(Rep) "); break; - case REPEATS_MATCH+MULTIPLE_MATCH: printf(" Type: Repeated(Rep) "); break; - case SEQUENCE_MATCH+MULTIPLE_MATCH: printf(" Type: Sequence(Rep) "); break; - case SPATIAL_MATCH+MULTIPLE_MATCH: printf(" Type: Spatial(Rep) "); break; - case DATE_MATCH+MULTIPLE_MATCH: printf(" Type: Date(Rep) "); break; - - default: printf(" Type: Unknown%d ", p->Type); break; - } - ChkLen += p->Length; - printf(" Length %d Entropy %6.3f (%.2f) ", p->Length, p->Entrpy, p->Entrpy * 0.301029996); - for(n = 0; n < p->Length; ++n, ++pwd) { - printf("%c", *pwd); - } - printf("\n"); - p = p->Next; - } - ZxcvbnFreeInfo(info); - if (ChkLen != len) - printf("*** Password length (%d) != sum of length of parts (%d) ***\n", len, ChkLen); - } -} - -int EntropyMeter::execute(QStringList arguments) -{ - printf("KeePassXC Entropy Meter, based on zxcvbn-c.\nEnter your password below or pass it as argv\n"); - printf(" Usage: entropy-meter [-a] [pwd1 pwd2 ...]\n> "); - int i, advanced = 0; - if (arguments.size() > 1 && arguments.at(1) == "-a") - { - advanced = 1; - arguments.removeAt(1); - } - i = 1; - if (i >= arguments.size()) - { - /* No test passwords on command line, so get them from stdin */ - char line[500]; - while(fgets(line, sizeof line, stdin)) - { - /* Drop the trailing newline character */ - for(i = 0; i < static_cast<int>(sizeof line - 1); ++i) - { - if (line[i] < ' ') - { - line[i] = 0; - break; - } - } - if (line[0]) { - calculate(line,advanced); - printf("> "); - } - } - } - else - { - /* Do the test passwords on the command line */ - for(; i < arguments.size(); ++i) - { - calculate(arguments.at(i).toLatin1(), advanced); - } - } - return 0; -} diff --git a/src/cli/Estimate.cpp b/src/cli/Estimate.cpp new file mode 100644 index 000000000..fbab96962 --- /dev/null +++ b/src/cli/Estimate.cpp @@ -0,0 +1,175 @@ +/* + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "Estimate.h" + +#include <QCommandLineParser> +#include <QTextStream> + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <zxcvbn.h> + +/* For pre-compiled headers under windows */ +#ifdef _WIN32 +#ifndef __MINGW32__ +#include "stdafx.h" +#endif +#endif + +Estimate::Estimate() +{ + this->name = QString("estimate"); + this->description = QObject::tr("Estimate the entropy of a password."); +} + +Estimate::~Estimate() +{ +} + +static void calculate(const char* pwd, bool advanced) +{ + double e; + int len = strlen(pwd); + if (!advanced) { + e = ZxcvbnMatch(pwd, 0, 0); + printf("Pass '%s' \tLength %d\tEntropy %.3f\tLog10 %.3f\n", pwd, len, e, e * 0.301029996); + } else { + int ChkLen; + ZxcMatch_t *info, *p; + double m = 0.0; + e = ZxcvbnMatch(pwd, 0, &info); + for (p = info; p; p = p->Next) { + m += p->Entrpy; + } + m = e - m; + printf("Pass '%s' \tLength %d\tEntropy %.3f\tLog10 %.3f\n Multi-word extra bits %.1f\n", + pwd, + len, + e, + e * 0.301029996, + m); + p = info; + ChkLen = 0; + while (p) { + int n; + switch (static_cast<int>(p->Type)) { + case BRUTE_MATCH: + printf(" Type: Bruteforce "); + break; + case DICTIONARY_MATCH: + printf(" Type: Dictionary "); + break; + case DICT_LEET_MATCH: + printf(" Type: Dict+Leet "); + break; + case USER_MATCH: + printf(" Type: User Words "); + break; + case USER_LEET_MATCH: + printf(" Type: User+Leet "); + break; + case REPEATS_MATCH: + printf(" Type: Repeated "); + break; + case SEQUENCE_MATCH: + printf(" Type: Sequence "); + break; + case SPATIAL_MATCH: + printf(" Type: Spatial "); + break; + case DATE_MATCH: + printf(" Type: Date "); + break; + case BRUTE_MATCH + MULTIPLE_MATCH: + printf(" Type: Bruteforce(Rep)"); + break; + case DICTIONARY_MATCH + MULTIPLE_MATCH: + printf(" Type: Dictionary(Rep)"); + break; + case DICT_LEET_MATCH + MULTIPLE_MATCH: + printf(" Type: Dict+Leet(Rep) "); + break; + case USER_MATCH + MULTIPLE_MATCH: + printf(" Type: User Words(Rep)"); + break; + case USER_LEET_MATCH + MULTIPLE_MATCH: + printf(" Type: User+Leet(Rep) "); + break; + case REPEATS_MATCH + MULTIPLE_MATCH: + printf(" Type: Repeated(Rep) "); + break; + case SEQUENCE_MATCH + MULTIPLE_MATCH: + printf(" Type: Sequence(Rep) "); + break; + case SPATIAL_MATCH + MULTIPLE_MATCH: + printf(" Type: Spatial(Rep) "); + break; + case DATE_MATCH + MULTIPLE_MATCH: + printf(" Type: Date(Rep) "); + break; + + default: + printf(" Type: Unknown%d ", p->Type); + break; + } + ChkLen += p->Length; + printf(" Length %d Entropy %6.3f (%.2f) ", p->Length, p->Entrpy, p->Entrpy * 0.301029996); + for (n = 0; n < p->Length; ++n, ++pwd) { + printf("%c", *pwd); + } + printf("\n"); + p = p->Next; + } + ZxcvbnFreeInfo(info); + if (ChkLen != len) { + printf("*** Password length (%d) != sum of length of parts (%d) ***\n", len, ChkLen); + } + } +} + +int Estimate::execute(QStringList arguments) +{ + QTextStream inputTextStream(stdin, QIODevice::ReadOnly); + QTextStream outputTextStream(stdout, QIODevice::WriteOnly); + + QCommandLineParser parser; + parser.setApplicationDescription(this->description); + parser.addPositionalArgument("password", QObject::tr("Password for which to estimate the entropy."), "[password]"); + QCommandLineOption advancedOption(QStringList() << "a" + << "advanced", + QObject::tr("Perform advanced analysis on the password.")); + parser.addOption(advancedOption); + parser.process(arguments); + + const QStringList args = parser.positionalArguments(); + if (args.size() > 1) { + outputTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli estimate"); + return EXIT_FAILURE; + } + + QString password; + if (args.size() == 1) { + password = args.at(0); + } else { + password = inputTextStream.readLine(); + } + + calculate(password.toLatin1(), parser.isSet(advancedOption)); + return EXIT_SUCCESS; +} diff --git a/src/cli/EntropyMeter.h b/src/cli/Estimate.h similarity index 81% rename from src/cli/EntropyMeter.h rename to src/cli/Estimate.h index 614e2de35..2cbe49104 100644 --- a/src/cli/EntropyMeter.h +++ b/src/cli/Estimate.h @@ -15,17 +15,17 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef KEEPASSXC_ENTROPYMETER_H -#define KEEPASSXC_ENTROPYMETER_H +#ifndef KEEPASSXC_ESTIMATE_H +#define KEEPASSXC_ESTIMATE_H #include "Command.h" -class EntropyMeter : public Command +class Estimate : public Command { public: - EntropyMeter(); - ~EntropyMeter(); + Estimate(); + ~Estimate(); int execute(QStringList arguments); }; -#endif // KEEPASSXC_ENTROPYMETER_H +#endif // KEEPASSXC_ESTIMATE_H diff --git a/src/cli/Extract.cpp b/src/cli/Extract.cpp index 2d519f9a1..73879f67d 100644 --- a/src/cli/Extract.cpp +++ b/src/cli/Extract.cpp @@ -85,7 +85,6 @@ int Extract::execute(QStringList arguments) compositeKey.addKey(fileKey); } - QString databaseFilename = args.at(0); QFile dbFile(databaseFilename); if (!dbFile.exists()) { diff --git a/src/cli/List.cpp b/src/cli/List.cpp index 63e48ee22..73830cab8 100644 --- a/src/cli/List.cpp +++ b/src/cli/List.cpp @@ -44,8 +44,7 @@ int List::execute(QStringList arguments) QCommandLineParser parser; parser.setApplicationDescription(this->description); parser.addPositionalArgument("database", QObject::tr("Path of the database.")); - parser.addPositionalArgument( - "group", QObject::tr("Path of the group to list. Default is /"), QString("[group]")); + parser.addPositionalArgument("group", QObject::tr("Path of the group to list. Default is /"), QString("[group]")); QCommandLineOption keyFile(QStringList() << "k" << "key-file", QObject::tr("Key file of the database."), diff --git a/src/cli/Locate.cpp b/src/cli/Locate.cpp index bb9831be1..83a3c5ce0 100644 --- a/src/cli/Locate.cpp +++ b/src/cli/Locate.cpp @@ -83,5 +83,4 @@ int Locate::locateEntry(Database* database, QString searchTerm) outputTextStream << result << endl; } return EXIT_SUCCESS; - } diff --git a/src/cli/Merge.cpp b/src/cli/Merge.cpp index a713cbb33..5df6b0188 100644 --- a/src/cli/Merge.cpp +++ b/src/cli/Merge.cpp @@ -43,10 +43,9 @@ int Merge::execute(QStringList arguments) parser.addPositionalArgument("database1", QObject::tr("Path of the database to merge into.")); parser.addPositionalArgument("database2", QObject::tr("Path of the database to merge from.")); - QCommandLineOption samePasswordOption( - QStringList() << "s" - << "same-credentials", - QObject::tr("Use the same credentials for both database files.")); + QCommandLineOption samePasswordOption(QStringList() << "s" + << "same-credentials", + QObject::tr("Use the same credentials for both database files.")); QCommandLineOption keyFile(QStringList() << "k" << "key-file", @@ -55,8 +54,8 @@ int Merge::execute(QStringList arguments) parser.addOption(keyFile); QCommandLineOption keyFileFrom(QStringList() << "f" << "key-file-from", - QObject::tr("Key file of the database to merge from."), - QObject::tr("path")); + QObject::tr("Key file of the database to merge from."), + QObject::tr("path")); parser.addOption(keyFileFrom); parser.addOption(samePasswordOption); @@ -68,7 +67,6 @@ int Merge::execute(QStringList arguments) return EXIT_FAILURE; } - Database* db1 = Database::unlockFromStdin(args.at(0), parser.value(keyFile)); if (db1 == nullptr) { return EXIT_FAILURE; diff --git a/src/cli/Utils.cpp b/src/cli/Utils.cpp index b9866a1a2..f42095cbb 100644 --- a/src/cli/Utils.cpp +++ b/src/cli/Utils.cpp @@ -27,7 +27,6 @@ #include <QProcess> #include <QTextStream> - void Utils::setStdinEcho(bool enable = true) { #ifdef Q_OS_WIN diff --git a/src/cli/keepassxc-cli.1 b/src/cli/keepassxc-cli.1 index 940b3d4cf..37127abc7 100644 --- a/src/cli/keepassxc-cli.1 +++ b/src/cli/keepassxc-cli.1 @@ -22,8 +22,8 @@ Copies the password of a database entry to the clipboard. If multiple entries wi .IP "edit [options] <database> <entry>" Edits a database entry. A password can be generated (\fI-g\fP option), or a prompt can be displayed to input the password (\fI-p\fP option). -.IP "entropy-meter [-a pwd1 pwd2 ...]" -Calculates the entropy of a single, or multiple passwords specified using the \fI-a\fP option. If no passwords are specified, the program will run in interactive mode and prompt the user to enter a password. +.IP "estimate [options] [password]" +Estimates the entropy of a password. The password to estimate can be provided as a positional argument, or using the standard input. .IP "extract [options] <database>" Extracts and prints the contents of a database to standard output in XML format. @@ -90,6 +90,12 @@ Specify the length of the password to generate. Specify the title of the entry. +.SS "Estimate options" + +.IP "-a, --advanced" +Perform advanced analysis on the password. + + .SH REPORTING BUGS Bugs and feature requests can be reported on GitHub at https://github.com/keepassxreboot/keepassxc/issues. From afe2967473dd6b6e23b81b2dbbab7d5402f71a1b Mon Sep 17 00:00:00 2001 From: Jean-Louis Dupond <jean-louis@dupond.be> Date: Sat, 28 Oct 2017 20:10:59 +0200 Subject: [PATCH 137/402] Add WMClass to the desktop file to have proper linking to the desktop file --- share/linux/org.keepassxc.KeePassXC.desktop | 1 + 1 file changed, 1 insertion(+) diff --git a/share/linux/org.keepassxc.KeePassXC.desktop b/share/linux/org.keepassxc.KeePassXC.desktop index d3b007bdc..8a0169800 100644 --- a/share/linux/org.keepassxc.KeePassXC.desktop +++ b/share/linux/org.keepassxc.KeePassXC.desktop @@ -9,6 +9,7 @@ Comment=Community-driven port of the Windows application “KeePass Password Saf Exec=keepassxc %f TryExec=keepassxc Icon=keepassxc +StartupWMClass=keepassxc Terminal=false Type=Application Version=1.0 From 8f48ede957b1f52b00c45d561b115ed568ba31af Mon Sep 17 00:00:00 2001 From: Matt Signorini <matt@signorini.id.au> Date: Sat, 7 Oct 2017 17:19:55 +1100 Subject: [PATCH 138/402] Add keypress handler to the password generator widget so that esc quits in standalone mode. --- src/gui/PasswordGeneratorWidget.cpp | 15 +++++++++++++++ src/gui/PasswordGeneratorWidget.h | 3 +++ 2 files changed, 18 insertions(+) diff --git a/src/gui/PasswordGeneratorWidget.cpp b/src/gui/PasswordGeneratorWidget.cpp index d77634415..dd3cd5802 100644 --- a/src/gui/PasswordGeneratorWidget.cpp +++ b/src/gui/PasswordGeneratorWidget.cpp @@ -21,6 +21,7 @@ #include <QLineEdit> #include <QDir> +#include <QKeyEvent> #include "core/Config.h" #include "core/PasswordGenerator.h" @@ -149,6 +150,20 @@ void PasswordGeneratorWidget::setStandaloneMode(bool standalone) } } +void PasswordGeneratorWidget::keyPressEvent(QKeyEvent* e) +{ + if (!e->modifiers() || (e->modifiers() & Qt::KeypadModifier && e->key() == Qt::Key_Enter)) { + if (e->key() == Qt::Key_Escape && m_standalone == true) { + emit dialogTerminated(); + } else { + e->ignore(); + } + } + else { + e->ignore(); + } +} + void PasswordGeneratorWidget::regeneratePassword() { if (m_ui->tabWidget->currentIndex() == Password) { diff --git a/src/gui/PasswordGeneratorWidget.h b/src/gui/PasswordGeneratorWidget.h index 130106461..3d6d27a55 100644 --- a/src/gui/PasswordGeneratorWidget.h +++ b/src/gui/PasswordGeneratorWidget.h @@ -81,6 +81,9 @@ private: const QScopedPointer<PasswordGenerator> m_passwordGenerator; const QScopedPointer<PassphraseGenerator> m_dicewareGenerator; const QScopedPointer<Ui::PasswordGeneratorWidget> m_ui; + +protected: + void keyPressEvent(QKeyEvent* e) override; }; #endif // KEEPASSX_PASSWORDGENERATORWIDGET_H From fef8f5c453066d8490c69226c18f954d5a5877f4 Mon Sep 17 00:00:00 2001 From: Matt Signorini <matt@signorini.id.au> Date: Wed, 25 Oct 2017 08:51:43 +1100 Subject: [PATCH 139/402] Tidied up code. --- src/gui/PasswordGeneratorWidget.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/gui/PasswordGeneratorWidget.cpp b/src/gui/PasswordGeneratorWidget.cpp index dd3cd5802..70375a048 100644 --- a/src/gui/PasswordGeneratorWidget.cpp +++ b/src/gui/PasswordGeneratorWidget.cpp @@ -158,8 +158,7 @@ void PasswordGeneratorWidget::keyPressEvent(QKeyEvent* e) } else { e->ignore(); } - } - else { + } else { e->ignore(); } } From 74dac174db5ce89c27c2134ca97babfe924c5f02 Mon Sep 17 00:00:00 2001 From: Nicolas Garnier <nicolas@github.equinoxe.ovh> Date: Fri, 8 Dec 2017 10:52:40 +0100 Subject: [PATCH 140/402] Enable translations for 'Extended ASCII' button --- src/gui/PasswordGeneratorWidget.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/PasswordGeneratorWidget.ui b/src/gui/PasswordGeneratorWidget.ui index a04719c33..a7e485817 100644 --- a/src/gui/PasswordGeneratorWidget.ui +++ b/src/gui/PasswordGeneratorWidget.ui @@ -318,7 +318,7 @@ QProgressBar::chunk { <string>Extended ASCII</string> </property> <property name="text"> - <string notr="true">Extended ASCII</string> + <string>Extended ASCII</string> </property> <property name="checkable"> <bool>true</bool> From 1bc2d58ae137b52b64c3133cae5164be21e4fdcb Mon Sep 17 00:00:00 2001 From: Jonathan White <droidmonkey@users.noreply.github.com> Date: Fri, 8 Dec 2017 17:17:33 -0500 Subject: [PATCH 141/402] Corrected file link to INSTALL.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e4787cac0..16f382b03 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ For a full list of features and changes, read the [CHANGELOG](CHANGELOG) documen ## Building KeePassXC -Detailed instructions are available in the [Build and Install](./BUILD-INSTALL.md) +Detailed instructions are available in the [Build and Install](./INSTALL.md) page or on the [Wiki page](https://github.com/keepassxreboot/keepassxc/wiki/Building-KeePassXC). ## Contributing From ab31619745a1bd0ee4be664a3b69f8210c5c9941 Mon Sep 17 00:00:00 2001 From: Sebastian Marsching <sebastian-git-2016@marsching.com> Date: Sat, 9 Dec 2017 15:02:57 +0100 Subject: [PATCH 142/402] Build MSI package when making a release. --- release-tool | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/release-tool b/release-tool index 10c6a14c3..8ad547468 100755 --- a/release-tool +++ b/release-tool @@ -609,9 +609,13 @@ build() { -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" $CMAKE_OPTIONS "$SRC_DIR" logInfo "Compiling and packaging sources..." - make $MAKE_OPTIONS package + make $MAKE_OPTIONS preinstall + # Call cpack directly instead of calling make package. + # This is important because we want to build the MSI when making a + # release. + cpack -G "NSIS;WIX;ZIP" - mv "./${APP_NAME}-${RELEASE_NAME}-"*.{exe,zip} ../ + mv "./${APP_NAME}-${RELEASE_NAME}-"*.{exe,msi,zip} ../ else mkdir -p "${OUTPUT_DIR}/bin-release" From 24b1ec25920e89ae21bf6805863e79cef723c612 Mon Sep 17 00:00:00 2001 From: Germano Massullo <germano.massullo@gmail.com> Date: Tue, 12 Dec 2017 23:24:59 +0100 Subject: [PATCH 143/402] Fixed typo in XML tag Signed-off-by: Germano Massullo <germano.massullo@gmail.com> --- share/linux/org.keepassxc.KeePassXC.appdata.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/linux/org.keepassxc.KeePassXC.appdata.xml b/share/linux/org.keepassxc.KeePassXC.appdata.xml index 39cddac12..69e7855ba 100644 --- a/share/linux/org.keepassxc.KeePassXC.appdata.xml +++ b/share/linux/org.keepassxc.KeePassXC.appdata.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<!-<li>Copyright 2017 KeePassXC Team <team@keepassxc.org> --> +<!--Copyright 2017 KeePassXC Team <team@keepassxc.org> --> <component type="desktop-application"> <id>org.keepassxc.KeePassXC.desktop</id> <name>KeePassXC</name> From 0141fa2f1c5432428f80f8ad0e5b338f23f98747 Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Tue, 12 Dec 2017 23:38:23 -0500 Subject: [PATCH 144/402] Correct memory leaks in TestGroup.cpp --- tests/TestGroup.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/TestGroup.cpp b/tests/TestGroup.cpp index 5f654ee3a..24bdfeb5a 100644 --- a/tests/TestGroup.cpp +++ b/tests/TestGroup.cpp @@ -385,18 +385,19 @@ void TestGroup::testClone() QCOMPARE(clonedGroupKeepUuid->entries().at(0)->uuid(), originalGroupEntry->uuid()); QCOMPARE(clonedGroupKeepUuid->children().at(0)->entries().at(0)->uuid(), subGroupEntry->uuid()); - Group* clonedGroupNoFlags = originalGroup->clone(Entry::CloneNoFlags, Group::CloneNoFlags); + QScopedPointer<Group> clonedGroupNoFlags(originalGroup->clone(Entry::CloneNoFlags, Group::CloneNoFlags)); QCOMPARE(clonedGroupNoFlags->entries().size(), 0); QVERIFY(clonedGroupNoFlags->uuid() == originalGroup->uuid()); - Group* clonedGroupNewUuid = originalGroup->clone(Entry::CloneNoFlags, Group::CloneNewUuid); + QScopedPointer<Group> clonedGroupNewUuid(originalGroup->clone(Entry::CloneNoFlags, Group::CloneNewUuid)); QCOMPARE(clonedGroupNewUuid->entries().size(), 0); QVERIFY(clonedGroupNewUuid->uuid() != originalGroup->uuid()); // Making sure the new modification date is not the same. QTest::qSleep(1); - Group* clonedGroupResetTimeInfo = originalGroup->clone(Entry::CloneNoFlags, Group::CloneNewUuid | Group::CloneResetTimeInfo); + QScopedPointer<Group> clonedGroupResetTimeInfo(originalGroup->clone(Entry::CloneNoFlags, + Group::CloneNewUuid | Group::CloneResetTimeInfo)); QCOMPARE(clonedGroupResetTimeInfo->entries().size(), 0); QVERIFY(clonedGroupResetTimeInfo->uuid() != originalGroup->uuid()); QVERIFY(clonedGroupResetTimeInfo->timeInfo().lastModificationTime() != originalGroup->timeInfo().lastModificationTime()); From 8b1c8f69f74770f3a12524d1784f9da108f29b68 Mon Sep 17 00:00:00 2001 From: louib <louib@users.noreply.github.com> Date: Thu, 14 Dec 2017 20:22:59 -0500 Subject: [PATCH 145/402] Removing password output from Estimate. (#1281) * Removing password output from Estimate. * clang-format --- src/cli/Estimate.cpp | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/cli/Estimate.cpp b/src/cli/Estimate.cpp index fbab96962..80226a27e 100644 --- a/src/cli/Estimate.cpp +++ b/src/cli/Estimate.cpp @@ -42,13 +42,13 @@ Estimate::~Estimate() { } -static void calculate(const char* pwd, bool advanced) +static void estimate(const char* pwd, bool advanced) { double e; int len = strlen(pwd); if (!advanced) { e = ZxcvbnMatch(pwd, 0, 0); - printf("Pass '%s' \tLength %d\tEntropy %.3f\tLog10 %.3f\n", pwd, len, e, e * 0.301029996); + printf("Length %d\tEntropy %.3f\tLog10 %.3f\n", len, e, e * 0.301029996); } else { int ChkLen; ZxcMatch_t *info, *p; @@ -58,12 +58,7 @@ static void calculate(const char* pwd, bool advanced) m += p->Entrpy; } m = e - m; - printf("Pass '%s' \tLength %d\tEntropy %.3f\tLog10 %.3f\n Multi-word extra bits %.1f\n", - pwd, - len, - e, - e * 0.301029996, - m); + printf("Length %d\tEntropy %.3f\tLog10 %.3f\n Multi-word extra bits %.1f\n", len, e, e * 0.301029996, m); p = info; ChkLen = 0; while (p) { @@ -170,6 +165,6 @@ int Estimate::execute(QStringList arguments) password = inputTextStream.readLine(); } - calculate(password.toLatin1(), parser.isSet(advancedOption)); + estimate(password.toLatin1(), parser.isSet(advancedOption)); return EXIT_SUCCESS; } From f257145ee03f9a18302e692de5aa7c5da920fa2e Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Wed, 13 Dec 2017 22:38:44 +0100 Subject: [PATCH 146/402] Separate code and GPG signing and add support for macOS codesign --- release-tool | 239 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 187 insertions(+), 52 deletions(-) diff --git a/release-tool b/release-tool index 42cd3a1d6..a8d4a7a84 100755 --- a/release-tool +++ b/release-tool @@ -50,14 +50,14 @@ printUsage() { local cmd if [ "" == "$1" ] || [ "help" == "$1" ]; then cmd="COMMAND" - elif [ "check" == "$1" ] || [ "merge" == "$1" ] || [ "build" == "$1" ] || [ "sign" == "$1" ]; then + elif [ "check" == "$1" ] || [ "merge" == "$1" ] || [ "build" == "$1" ] || [ "gpgsign" == "$1" ] || [ "appsign" == "$1" ]; then cmd="$1" else logError "Unknown command: '$1'\n" cmd="COMMAND" fi - - printf "\e[1mUsage:\e[0m $(basename $0) $cmd [--version x.y.z] [options]\n" + + printf "\e[1mUsage:\e[0m $(basename $0) $cmd [options]\n" if [ "COMMAND" == "$cmd" ]; then cat << EOF @@ -66,7 +66,8 @@ Commands: check Perform a dry-run check, nothing is changed merge Merge release branch into main branch and create release tags build Build and package binary release from sources - sign Sign previously compiled release packages + gpgsign Sign previously compiled release packages with GPG + appsign Sign binaries with code signing certificates on Windows and macOS help Show help for the given command EOF elif [ "merge" == "$cmd" ]; then @@ -113,16 +114,25 @@ Options: -n, --no-source-tarball Don't build source tarball -h, --help Show this help EOF - elif [ "sign" == "$cmd" ]; then + elif [ "gpgsign" == "$cmd" ]; then cat << EOF -Sign previously compiled release packages +Sign previously compiled release packages with GPG Options: -f, --files Files to sign (required) -g, --gpg-key GPG key used to sign the files (default: '${GPG_KEY}') - --signtool Specify the signtool executable (default: 'signtool') - --signtool-key Provide a key to be used with signtool (for Windows EXE) + -h, --help Show this help +EOF + elif [ "appsign" == "$cmd" ]; then + cat << EOF + +Sign binaries with code signing certificates on Windows and macOS + +Options: + -f, --files Files to sign (required) + -k, --signtool-key Key to be used with signtool (required for Windows EXE) + -i, --identity Apple Developer ID to be used with codesign (required for macOS APP and DMG) -h, --help Show this help EOF fi @@ -289,7 +299,28 @@ checkSnapcraft() { checkTransifexCommandExists() { command -v tx > /dev/null if [ 0 -ne $? ]; then - exitError "Transifex tool 'tx' not installed! Please install it using 'pip install transifex-client'" + exitError "Transifex tool 'tx' not installed! Please install it using 'pip install transifex-client'." + fi +} + +checkSigntoolCommandExists() { + command -v signtool > /dev/null + if [ 0 -ne $? ]; then + exitError "signtool command not found on the PATH! Please check that you have correctly installed the Windows SDK." + fi +} + +checkCodesignCommandExists() { + command -v codesign > /dev/null + if [ 0 -ne $? ]; then + exitError "codesign command not found on the PATH! Please check that you have correctly installed Xcode." + fi +} + +checkCreateDMGCommandExists() { + command -v create-dmg > /dev/null + if [ 0 -ne $? ]; then + exitError "create-dmg command not found on the PATH! Please install it using 'npm install --global create-dmg'." fi } @@ -661,81 +692,54 @@ build() { # ----------------------------------------------------------------------- -# sign command +# gpgsign command # ----------------------------------------------------------------------- -sign() { - SIGN_FILES=() - SIGNTOOL="signtool" - SIGNTOOL_KEY="" - +gpgsign() { + local sign_files=() + while [ $# -ge 1 ]; do local arg="$1" case "$arg" in -f|--files) while [ "${2:0:1}" != "-" ] && [ $# -ge 2 ]; do - SIGN_FILES+=("$2") + sign_files+=("$2") shift done ;; - + -g|--gpg-key) GPG_KEY="$2" shift ;; - --signtool) - SIGNTOOL="$2" - shift ;; - - --signtool-key) - SIGNTOOL_KEY="$2" - shift ;; - -h|--help) - printUsage "sign" + printUsage "gpgsign" exit ;; - + *) logError "Unknown option '$arg'\n" - printUsage "sign" + printUsage "gpgsign" exit 1 ;; esac shift done - if [ -z "$SIGN_FILES" ]; then + if [ -z "${sign_files}" ]; then logError "Missing arguments, --files is required!\n" - printUsage "sign" + printUsage "gpgsign" exit 1 fi - if [[ -n "$SIGNTOOL_KEY" && ! -f "$SIGNTOOL_KEY" ]]; then - exitError "Signtool Key was not found!" - elif [[ -f "$SIGNTOOL_KEY" && ! -x $(command -v "${SIGNTOOL}") ]]; then - exitError "signtool program not found on PATH!" - fi - - for f in "${SIGN_FILES[@]}"; do + for f in "${sign_files[@]}"; do if [ ! -f "$f" ]; then - exitError "File '${f}' does not exist!" + exitError "File '${f}' does not exist or is not a file!" fi - if [[ -n "$SIGNTOOL_KEY" && ${f: -4} == '.exe' ]]; then - logInfo "Signing file '${f}' using signtool...\n" - read -s -p "Signtool Key Password: " password - echo - "${SIGNTOOL}" sign -f "${SIGNTOOL_KEY}" -p ${password} -v -t http://timestamp.comodoca.com/authenticode ${f} - - if [ 0 -ne $? ]; then - exitError "Signing failed!" - fi - fi - logInfo "Signing file '${f}' using release key..." gpg --output "${f}.sig" --armor --local-user "$GPG_KEY" --detach-sig "$f" if [ 0 -ne $? ]; then exitError "Signing failed!" fi - + logInfo "Creating digest for file '${f}'..." local rp="$(realpath "$f")" local bname="$(basename "$f")" @@ -746,6 +750,137 @@ sign() { } + +# ----------------------------------------------------------------------- +# appsign command +# ----------------------------------------------------------------------- +appsign() { + local sign_files=() + local signtool_key + local codesign_identity + + while [ $# -ge 1 ]; do + local arg="$1" + case "$arg" in + -f|--files) + while [ "${2:0:1}" != "-" ] && [ $# -ge 2 ]; do + sign_files+=("$2") + shift + done ;; + + -k|--signtool-key) + signtool_key="$2" + shift ;; + + -i|--identity) + codesign_identity="$2" + shift ;; + + -h|--help) + printUsage "appsign" + exit ;; + + *) + logError "Unknown option '$arg'\n" + printUsage "appsign" + exit 1 ;; + esac + shift + done + + if [ -z "${sign_files}" ]; then + logError "Missing arguments, --files is required!\n" + printUsage "appsign" + exit 1 + fi + + for f in "${sign_files[@]}"; do + if [ ! -f "${f}" ]; then + exitError "File '${f}' does not exist or is not a file!" + fi + done + + if [ "$(uname -s)" == "Darwin" ]; then + if [ -z "${codesign_identity}" ]; then + logError "Missing arguments, --identity is required on macOS!\n" + printUsage "appsign" + exit 1 + fi + + checkCodesignCommandExists + checkCreateDMGCommandExists + + local orig_dir="$(pwd)" + for f in "${sign_files[@]}"; do + if [[ ${f: -4} == '.dmg' ]]; then + logInfo "Unpacking disk image '${f}'..." + local tmp_dir="/tmp/KeePassXC_${RANDOM}" + mkdir -p ${tmp_dir}/{mnt,app} + hdiutil attach -quiet -noautoopen -mountpoint ${tmp_dir}/mnt "${f}" + cd ${tmp_dir} + cp -a ./mnt/KeePassXC.app ./app + hdiutil detach -quiet ${tmp_dir}/mnt + + if [ ! -d ./app/KeePassXC.app ]; then + cd "${orig_dir}" + exitError "Unpacking failed!" + fi + + logInfo "Signing app using codesign..." + codesign --sign "${codesign_identity}" --verbose --deep ./app/KeePassXC.app + + if [ 0 -ne $? ]; then + cd "${orig_dir}" + exitError "Signing failed!" + fi + + logInfo "Repacking and signing disk image..." + create-dmg ./app/KeePassXC.app + cd "${orig_dir}" + cp -f ${tmp_dir}/KeePassXC-*.dmg "${f}" + rm -Rf ${tmp_dir} + else + logInfo "Skipping non-DMG file '${f}'..." + fi + done + + elif [ "$(uname -o)" == "Msys" ]; then + if [ -z "${signtool_key}" ]; then + logError "Missing arguments, --signtool-key is required on Windows!\n" + printUsage "appsign" + exit 1 + fi + + checkSigntoolCommandExists + + if [[ ! -f "${signtool_key}" ]]; then + exitError "Key file was not found!" + fi + + read -s -p "Key password: " password + echo + + for f in "${sign_files[@]}"; do + if [[ ${f: -4} == '.exe' ]]; then + logInfo "Signing file '${f}' using signtool..." + signtool sign -f "${signtool_key}" -p "${password}" -v -t "http://timestamp.comodoca.com/authenticode" "${f}" + + if [ 0 -ne $? ]; then + exitError "Signing failed!" + fi + else + logInfo "Skipping non-EXE file '${f}'..." + fi + done + + else + exitError "Unsupported platform for code signing!\n" + fi + + logInfo "All done!" +} + + # ----------------------------------------------------------------------- # parse global command line # ----------------------------------------------------------------------- @@ -758,8 +893,8 @@ if [ "" == "$MODE" ]; then elif [ "help" == "$MODE" ]; then printUsage "$1" exit -elif [ "check" == "$MODE" ] || [ "merge" == "$MODE" ] || [ "build" == "$MODE" ] || [ "sign" == "$MODE" ]; then - $MODE "$@" +elif [ "check" == "$MODE" ] || [ "merge" == "$MODE" ] || [ "build" == "$MODE" ] || [ "gpgsign" == "$MODE" ] || [ "appsign" == "$MODE" ]; then + ${MODE} "$@" else printUsage "$MODE" fi From b457c8c1fa0e8f5f4e78c55acb734875056986a1 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Thu, 14 Dec 2017 18:17:43 +0100 Subject: [PATCH 147/402] Replace signtool with osslsigncode --- release-tool | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/release-tool b/release-tool index a8d4a7a84..434547fc3 100755 --- a/release-tool +++ b/release-tool @@ -303,10 +303,10 @@ checkTransifexCommandExists() { fi } -checkSigntoolCommandExists() { - command -v signtool > /dev/null +checkOsslsigncodeCommandExists() { + command -v osslsigncode > /dev/null if [ 0 -ne $? ]; then - exitError "signtool command not found on the PATH! Please check that you have correctly installed the Windows SDK." + exitError "osslsigncode command not found on the PATH! Please install it using 'pacman -S mingw-w64-osslsigncode'." fi } @@ -851,7 +851,7 @@ appsign() { exit 1 fi - checkSigntoolCommandExists + checkOsslsigncodeCommandExists if [[ ! -f "${signtool_key}" ]]; then exitError "Key file was not found!" @@ -862,12 +862,18 @@ appsign() { for f in "${sign_files[@]}"; do if [[ ${f: -4} == '.exe' ]]; then - logInfo "Signing file '${f}' using signtool..." - signtool sign -f "${signtool_key}" -p "${password}" -v -t "http://timestamp.comodoca.com/authenticode" "${f}" + logInfo "Signing file '${f}' using osslsigncode..." + # output a signed exe; we have to use a different name due to osslsigntool limitations + osslsigncode sign -pkcs12 "${signtool_key}" -pass "${password}" \ + -t "http://timestamp.comodoca.com/authenticode" -in "${f}" -out "${f}.signed" if [ 0 -ne $? ]; then + rm -f "${f}.signed" exitError "Signing failed!" fi + + # overwrite the original exe with the signed exe + mv -f "${f}.signed" "${f}" else logInfo "Skipping non-EXE file '${f}'..." fi From d2a59c556ec3eeb1ec6793618641a7e4c577827d Mon Sep 17 00:00:00 2001 From: Toni Spets <toni.spets@iki.fi> Date: Tue, 28 Nov 2017 19:19:19 +0200 Subject: [PATCH 148/402] Refactor fixed font selection into Font class --- src/CMakeLists.txt | 1 + src/gui/Font.cpp | 36 ++++++++++++++++++++++++++++++++++++ src/gui/Font.h | 31 +++++++++++++++++++++++++++++++ src/gui/PasswordEdit.cpp | 14 ++------------ 4 files changed, 70 insertions(+), 12 deletions(-) create mode 100644 src/gui/Font.cpp create mode 100644 src/gui/Font.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 24742edef..0b9f7a823 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -105,6 +105,7 @@ set(keepassx_SOURCES gui/EditWidgetIcons.cpp gui/EditWidgetProperties.cpp gui/FileDialog.cpp + gui/Font.cpp gui/IconModels.cpp gui/KeePass1OpenWidget.cpp gui/KMessageWidget.cpp diff --git a/src/gui/Font.cpp b/src/gui/Font.cpp new file mode 100644 index 000000000..3583622dd --- /dev/null +++ b/src/gui/Font.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "Font.h" + +#include <QFontDatabase> + +QFont Font::fixedFont() +{ + QFont fixedFont = QFontDatabase::systemFont(QFontDatabase::FixedFont); + +#ifdef Q_OS_WIN + // try to use Consolas on Windows, because the default Courier New has too many similar characters + QFont consolasFont = QFontDatabase().font("Consolas", fixedFont.styleName(), fixedFont.pointSize()); + const QFont defaultFont; + if (fixedFont != defaultFont) { + fixedFont = consolasFont; + } +#endif + + return fixedFont; +} diff --git a/src/gui/Font.h b/src/gui/Font.h new file mode 100644 index 000000000..bfc3d7d36 --- /dev/null +++ b/src/gui/Font.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef KEEPASSX_FONT_H +#define KEEPASSX_FONT_H + +#include <QFont> + +class Font +{ +public: + static QFont fixedFont(); +private: + Font() {} +}; + +#endif // KEEPASSX_FONT_H diff --git a/src/gui/PasswordEdit.cpp b/src/gui/PasswordEdit.cpp index ad736bf20..b084f9cf0 100644 --- a/src/gui/PasswordEdit.cpp +++ b/src/gui/PasswordEdit.cpp @@ -19,8 +19,7 @@ #include "PasswordEdit.h" #include "core/Config.h" - -#include <QFontDatabase> +#include "gui/Font.h" const QColor PasswordEdit::CorrectSoFarColor = QColor(255, 205, 15); const QColor PasswordEdit::ErrorColor = QColor(255, 125, 125); @@ -33,16 +32,7 @@ PasswordEdit::PasswordEdit(QWidget* parent) updateStylesheet(); // use a monospace font for the password field - QFont passwordFont = QFontDatabase::systemFont(QFontDatabase::FixedFont); -#ifdef Q_OS_WIN - // try to use Consolas on Windows, because the default Courier New has too many similar characters - QFont consolasFont = QFontDatabase().font("Consolas", passwordFont.styleName(), passwordFont.pointSize()); - const QFont defaultFont; - if (passwordFont != defaultFont) { - passwordFont = consolasFont; - } -#endif - + QFont passwordFont = Font::fixedFont(); passwordFont.setLetterSpacing(QFont::PercentageSpacing, 110); setFont(passwordFont); } From 76e6d498cfcd9583ee97dcdf8a9eb2a774d241ef Mon Sep 17 00:00:00 2001 From: Toni Spets <toni.spets@iki.fi> Date: Sat, 25 Nov 2017 11:12:31 +0200 Subject: [PATCH 149/402] SSH Agent: Split private key selection --- src/gui/entry/EditEntryWidget.cpp | 82 +++---- src/gui/entry/EditEntryWidgetSSHAgent.ui | 272 ++++++++++++++--------- 2 files changed, 214 insertions(+), 140 deletions(-) diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index dda0ab1d0..db35b2f8f 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -47,6 +47,7 @@ #include "gui/FileDialog.h" #include "gui/MessageBox.h" #include "gui/Clipboard.h" +#include "gui/Font.h" #include "gui/entry/AutoTypeAssociationsModel.h" #include "gui/entry/EntryAttachmentsModel.h" #include "gui/entry/EntryAttributesModel.h" @@ -267,7 +268,15 @@ void EditEntryWidget::setupSSHAgent() { m_sshAgentUi->setupUi(m_sshAgentWidget); - connect(m_sshAgentUi->privateKeyComboBox, SIGNAL(currentTextChanged(QString)), SLOT(updateSSHAgentKeyInfo())); + QFont fixedFont = Font::fixedFont(); + m_sshAgentUi->fingerprintTextLabel->setFont(fixedFont); + m_sshAgentUi->commentTextLabel->setFont(fixedFont); + m_sshAgentUi->publicKeyEdit->setFont(fixedFont); + + connect(m_sshAgentUi->attachmentRadioButton, SIGNAL(clicked(bool)), SLOT(updateSSHAgentKeyInfo())); + connect(m_sshAgentUi->attachmentComboBox, SIGNAL(currentIndexChanged(int)), SLOT(updateSSHAgentKeyInfo())); + connect(m_sshAgentUi->externalFileRadioButton, SIGNAL(clicked(bool)), SLOT(updateSSHAgentKeyInfo())); + connect(m_sshAgentUi->externalFileEdit, SIGNAL(textChanged(QString)), SLOT(updateSSHAgentKeyInfo())); connect(m_sshAgentUi->browseButton, SIGNAL(clicked()), SLOT(browsePrivateKey())); connect(m_sshAgentUi->addToAgentButton, SIGNAL(clicked()), SLOT(addKeyToAgent())); connect(m_sshAgentUi->removeFromAgentButton, SIGNAL(clicked()), SLOT(removeKeyFromAgent())); @@ -279,8 +288,6 @@ void EditEntryWidget::setupSSHAgent() void EditEntryWidget::updateSSHAgent() { - // TODO: unsafe use of translations - QString prefix = tr("Attachment") + ": "; KeeAgentSettings settings; settings.fromXml(m_entryAttachments->value("KeeAgent.settings")); @@ -289,29 +296,33 @@ void EditEntryWidget::updateSSHAgent() m_sshAgentUi->requireUserConfirmationCheckBox->setChecked(settings.useConfirmConstraintWhenAdding()); m_sshAgentUi->lifetimeCheckBox->setChecked(settings.useLifetimeConstraintWhenAdding()); m_sshAgentUi->lifetimeSpinBox->setValue(settings.lifetimeConstraintDuration()); - m_sshAgentUi->privateKeyComboBox->clear(); + m_sshAgentUi->attachmentComboBox->clear(); m_sshAgentUi->addToAgentButton->setEnabled(false); m_sshAgentUi->removeFromAgentButton->setEnabled(false); m_sshAgentUi->copyToClipboardButton->setEnabled(false); + m_sshAgentUi->attachmentComboBox->addItem(""); + for (QString fileName : m_entryAttachments->keys()) { if (fileName == "KeeAgent.settings") { continue; } - m_sshAgentUi->privateKeyComboBox->addItem(prefix + fileName); + m_sshAgentUi->attachmentComboBox->addItem(fileName); } + m_sshAgentUi->attachmentComboBox->setCurrentText(settings.attachmentName()); + m_sshAgentUi->externalFileEdit->setText(settings.fileName()); + if (settings.selectedType() == "attachment") { - m_sshAgentUi->privateKeyComboBox->setCurrentText(prefix + settings.attachmentName()); - } else if (!settings.fileName().isEmpty()) { - m_sshAgentUi->privateKeyComboBox->addItem(settings.fileName()); - m_sshAgentUi->privateKeyComboBox->setCurrentText(settings.fileName()); + m_sshAgentUi->attachmentRadioButton->setChecked(true); } else { - m_sshAgentUi->privateKeyComboBox->setCurrentText(""); + m_sshAgentUi->externalFileRadioButton->setChecked(true); } m_sshAgentSettings = settings; + + updateSSHAgentKeyInfo(); } void EditEntryWidget::updateSSHAgentKeyInfo() @@ -319,28 +330,24 @@ void EditEntryWidget::updateSSHAgentKeyInfo() m_sshAgentUi->addToAgentButton->setEnabled(false); m_sshAgentUi->removeFromAgentButton->setEnabled(false); m_sshAgentUi->copyToClipboardButton->setEnabled(false); - m_sshAgentUi->fingerprintEdit->setText(""); - m_sshAgentUi->commentEdit->setText(""); + m_sshAgentUi->fingerprintTextLabel->setText(tr("n/a")); + m_sshAgentUi->commentTextLabel->setText(tr("n/a")); m_sshAgentUi->decryptButton->setEnabled(false); m_sshAgentUi->publicKeyEdit->document()->setPlainText(""); - if (m_sshAgentUi->privateKeyComboBox->currentText().isEmpty()) { - return; - } - OpenSSHKey key; if (!getOpenSSHKey(key)) { return; } - m_sshAgentUi->fingerprintEdit->setText(key.fingerprint()); + m_sshAgentUi->fingerprintTextLabel->setText(key.fingerprint()); if (key.encrypted()) { - m_sshAgentUi->commentEdit->setText(tr("(encrypted)")); + m_sshAgentUi->commentTextLabel->setText(tr("(encrypted)")); m_sshAgentUi->decryptButton->setEnabled(true); } else { - m_sshAgentUi->commentEdit->setText(key.comment()); + m_sshAgentUi->commentTextLabel->setText(key.comment()); } m_sshAgentUi->publicKeyEdit->document()->setPlainText(key.publicKey()); @@ -357,7 +364,7 @@ void EditEntryWidget::updateSSHAgentKeyInfo() void EditEntryWidget::saveSSHAgentConfig() { KeeAgentSettings settings; - QString privateKeyPath = m_sshAgentUi->privateKeyComboBox->currentText(); + QString privateKeyPath = m_sshAgentUi->attachmentComboBox->currentText(); settings.setAddAtDatabaseOpen(m_sshAgentUi->addKeyToAgentCheckBox->isChecked()); settings.setRemoveAtDatabaseClose(m_sshAgentUi->removeKeyFromAgentCheckBox->isChecked()); @@ -365,17 +372,13 @@ void EditEntryWidget::saveSSHAgentConfig() settings.setUseLifetimeConstraintWhenAdding(m_sshAgentUi->lifetimeCheckBox->isChecked()); settings.setLifetimeConstraintDuration(m_sshAgentUi->lifetimeSpinBox->value()); - // TODO: unsafe use of translations - QString prefix = tr("Attachment") + ": "; - if (privateKeyPath.startsWith(prefix)) { + if (m_sshAgentUi->attachmentRadioButton->isChecked()) { settings.setSelectedType("attachment"); - settings.setAttachmentName(privateKeyPath.remove(0, prefix.length())); - settings.setFileName(""); } else { settings.setSelectedType("file"); - settings.setFileName(privateKeyPath); - settings.setAttachmentName(""); } + settings.setAttachmentName(m_sshAgentUi->attachmentComboBox->currentText()); + settings.setFileName(m_sshAgentUi->externalFileEdit->text()); // we don't use this as we don't run an agent but for compatibility we set it if necessary settings.setAllowUseOfSshKey(settings.addAtDatabaseOpen() || settings.removeAtDatabaseClose()); @@ -396,23 +399,22 @@ void EditEntryWidget::browsePrivateKey() { QString fileName = QFileDialog::getOpenFileName(this, tr("Select private key"), ""); if (!fileName.isEmpty()) { - m_sshAgentUi->privateKeyComboBox->addItem(fileName); - m_sshAgentUi->privateKeyComboBox->setCurrentText(fileName); + m_sshAgentUi->externalFileEdit->setText(fileName); } } bool EditEntryWidget::getOpenSSHKey(OpenSSHKey& key) { - QString privateKeyPath = m_sshAgentUi->privateKeyComboBox->currentText(); QByteArray privateKeyData; - // TODO: unsafe use of translations - QString prefix = tr("Attachment") + ": "; - if (privateKeyPath.startsWith(prefix)) { - QString attachmentName = privateKeyPath.remove(0, prefix.length()); - privateKeyData = m_entryAttachments->value(attachmentName); + if (m_sshAgentUi->attachmentRadioButton->isChecked()) { + privateKeyData = m_entryAttachments->value(m_sshAgentUi->attachmentComboBox->currentText()); } else { - QFile localFile(privateKeyPath); + QFile localFile(m_sshAgentUi->externalFileEdit->text()); + + if (localFile.fileName().isEmpty()) { + return false; + } if (localFile.size() > 1024 * 1024) { showMessage(tr("File too large to be a private key"), MessageWidget::Error); @@ -427,6 +429,10 @@ bool EditEntryWidget::getOpenSSHKey(OpenSSHKey& key) privateKeyData = localFile.readAll(); } + if (privateKeyData.length() == 0) { + return false; + } + if (!key.parse(privateKeyData)) { showMessage(key.errorString(), MessageWidget::Error); return false; @@ -446,7 +452,7 @@ void EditEntryWidget::addKeyToAgent() if (!key.openPrivateKey(m_entry->password())) { showMessage(key.errorString(), MessageWidget::Error); } else { - m_sshAgentUi->commentEdit->setText(key.comment()); + m_sshAgentUi->commentTextLabel->setText(key.comment()); m_sshAgentUi->publicKeyEdit->document()->setPlainText(key.publicKey()); } @@ -484,7 +490,7 @@ void EditEntryWidget::decryptPrivateKey() if (!key.openPrivateKey(m_entry->password())) { showMessage(key.errorString(), MessageWidget::Error); } else { - m_sshAgentUi->commentEdit->setText(key.comment()); + m_sshAgentUi->commentTextLabel->setText(key.comment()); m_sshAgentUi->publicKeyEdit->document()->setPlainText(key.publicKey()); } } diff --git a/src/gui/entry/EditEntryWidgetSSHAgent.ui b/src/gui/entry/EditEntryWidgetSSHAgent.ui index 2d88327cc..34c8fae82 100644 --- a/src/gui/entry/EditEntryWidgetSSHAgent.ui +++ b/src/gui/entry/EditEntryWidgetSSHAgent.ui @@ -26,63 +26,6 @@ <property name="bottomMargin"> <number>0</number> </property> - <item row="1" column="1" colspan="4"> - <widget class="QCheckBox" name="removeKeyFromAgentCheckBox"> - <property name="text"> - <string>Remove key from agent when database is closed/locked</string> - </property> - </widget> - </item> - <item row="10" column="1"> - <widget class="QLabel" name="fingerprintLabel"> - <property name="text"> - <string>Fingerprint</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item row="12" column="3" colspan="2"> - <widget class="QPlainTextEdit" name="publicKeyEdit"> - <property name="readOnly"> - <bool>true</bool> - </property> - </widget> - </item> - <item row="10" column="3" colspan="2"> - <widget class="QLineEdit" name="fingerprintEdit"> - <property name="autoFillBackground"> - <bool>false</bool> - </property> - <property name="alignment"> - <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> - </property> - <property name="readOnly"> - <bool>true</bool> - </property> - </widget> - </item> - <item row="4" column="1"> - <widget class="QLabel" name="privateKeyLabel"> - <property name="text"> - <string>Private key</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item row="12" column="1"> - <widget class="QLabel" name="publicKeyLabel"> - <property name="text"> - <string>Public key</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing</set> - </property> - </widget> - </item> <item row="3" column="1" colspan="4"> <layout class="QHBoxLayout" name="removeKeyLayout"> <item> @@ -118,15 +61,32 @@ </layout> </item> <item row="11" column="1"> - <widget class="QLabel" name="commentLabel"> + <widget class="QLabel" name="fingerprintLabel"> <property name="text"> - <string>Comment</string> + <string>Fingerprint</string> </property> <property name="alignment"> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> </property> </widget> </item> + <item row="1" column="1" colspan="4"> + <widget class="QCheckBox" name="removeKeyFromAgentCheckBox"> + <property name="text"> + <string>Remove key from agent when database is closed/locked</string> + </property> + </widget> + </item> + <item row="13" column="1"> + <widget class="QLabel" name="publicKeyLabel"> + <property name="text"> + <string>Public key</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing</set> + </property> + </widget> + </item> <item row="0" column="1" colspan="4"> <widget class="QCheckBox" name="addKeyToAgentCheckBox"> <property name="text"> @@ -134,26 +94,129 @@ </property> </widget> </item> - <item row="4" column="3"> - <widget class="QComboBox" name="privateKeyComboBox"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> + <item row="12" column="1"> + <widget class="QLabel" name="commentLabel"> + <property name="text"> + <string>Comment</string> </property> - <property name="editable"> - <bool>true</bool> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> </property> </widget> </item> - <item row="4" column="4"> - <widget class="QPushButton" name="browseButton"> + <item row="12" column="4"> + <widget class="QPushButton" name="decryptButton"> <property name="text"> - <string>Browse...</string> + <string>Decrypt</string> </property> </widget> </item> + <item row="11" column="3" colspan="2"> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QLabel" name="fingerprintTextLabel"> + <property name="font"> + <font> + <family>Monospace</family> + </font> + </property> + <property name="text"> + <string>n/a</string> + </property> + <property name="textInteractionFlags"> + <set>Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_2"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item row="14" column="3" colspan="2"> + <widget class="QPushButton" name="copyToClipboardButton"> + <property name="text"> + <string>Copy to clipboard</string> + </property> + </widget> + </item> + <item row="4" column="1" colspan="4"> + <widget class="QGroupBox" name="privateKeyGroupBox"> + <property name="title"> + <string>Private key</string> + </property> + <layout class="QGridLayout" name="gridLayout_3"> + <item row="3" column="0"> + <widget class="QRadioButton" name="externalFileRadioButton"> + <property name="text"> + <string>External file</string> + </property> + </widget> + </item> + <item row="3" column="2"> + <widget class="QPushButton" name="browseButton"> + <property name="text"> + <string>Browse...</string> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QRadioButton" name="attachmentRadioButton"> + <property name="text"> + <string>Attachment</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QLineEdit" name="externalFileEdit"/> + </item> + <item row="4" column="1"> + <layout class="QHBoxLayout" name="agentActionsLayout" stretch="0,0"> + <item> + <widget class="QPushButton" name="addToAgentButton"> + <property name="text"> + <string>Add to agent</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="removeFromAgentButton"> + <property name="text"> + <string>Remove from agent</string> + </property> + </widget> + </item> + </layout> + </item> + <item row="0" column="1" colspan="2"> + <widget class="QComboBox" name="attachmentComboBox"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="editable"> + <bool>false</bool> + </property> + </widget> + </item> + </layout> + </widget> + </item> <item row="2" column="1" colspan="4"> <widget class="QCheckBox" name="requireUserConfirmationCheckBox"> <property name="text"> @@ -162,43 +225,48 @@ </widget> </item> <item row="13" column="3" colspan="2"> - <widget class="QPushButton" name="copyToClipboardButton"> - <property name="text"> - <string>Copy to clipboard</string> + <widget class="QPlainTextEdit" name="publicKeyEdit"> + <property name="font"> + <font> + <family>Monospace</family> + </font> </property> - </widget> - </item> - <item row="6" column="3"> - <layout class="QHBoxLayout" name="agentActionsLayout" stretch="0,0"> - <item> - <widget class="QPushButton" name="addToAgentButton"> - <property name="text"> - <string>Add to agent</string> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="removeFromAgentButton"> - <property name="text"> - <string>Remove from agent</string> - </property> - </widget> - </item> - </layout> - </item> - <item row="11" column="3"> - <widget class="QLineEdit" name="commentEdit"> <property name="readOnly"> <bool>true</bool> </property> </widget> </item> - <item row="11" column="4"> - <widget class="QPushButton" name="decryptButton"> - <property name="text"> - <string>Decrypt</string> - </property> - </widget> + <item row="12" column="3"> + <layout class="QHBoxLayout" name="horizontalLayout_4"> + <item> + <widget class="QLabel" name="commentTextLabel"> + <property name="font"> + <font> + <family>Monospace</family> + </font> + </property> + <property name="text"> + <string>n/a</string> + </property> + <property name="textInteractionFlags"> + <set>Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> </item> </layout> </widget> From 8e231dfa95545a084eb36e1ca38a46a29658717b Mon Sep 17 00:00:00 2001 From: Aleksa Sarai <cyphar@cyphar.com> Date: Sun, 17 Dec 2017 11:14:39 +1100 Subject: [PATCH 150/402] cli: show: add --attributes flag (#1289) In order for scripting to be much simpler with `keepassxc-cli show`, provide a simple --attributesk API which effectively is just a CLI interface for entry->attributes()->value(...). This allows for more extensibility and prevents changes in our output formatting from breaking existing users of keepassxc-cli (if they use --attributes). Signed-off-by: Aleksa Sarai <cyphar@cyphar.com> --- src/cli/Show.cpp | 37 +++++++++++++++++++++++++++++-------- src/cli/Show.h | 2 +- src/cli/keepassxc-cli.1 | 8 ++++++++ 3 files changed, 38 insertions(+), 9 deletions(-) diff --git a/src/cli/Show.cpp b/src/cli/Show.cpp index d137f74df..43a9a8376 100644 --- a/src/cli/Show.cpp +++ b/src/cli/Show.cpp @@ -49,6 +49,13 @@ int Show::execute(QStringList arguments) QObject::tr("Key file of the database."), QObject::tr("path")); parser.addOption(keyFile); + QCommandLineOption attributes(QStringList() << "a" + << "attributes", + QObject::tr("Names of the attributes to show. " + "This option can be specified more than once, with each attribute shown one-per-line in the given order. " + "If no attributes are specified, a summary of the default attributes is given."), + QObject::tr("attribute")); + parser.addOption(attributes); parser.addPositionalArgument("entry", QObject::tr("Name of the entry to show.")); parser.process(arguments); @@ -63,10 +70,10 @@ int Show::execute(QStringList arguments) return EXIT_FAILURE; } - return this->showEntry(db, args.at(1)); + return this->showEntry(db, parser.values(attributes), args.at(1)); } -int Show::showEntry(Database* database, QString entryPath) +int Show::showEntry(Database* database, QStringList attributes, QString entryPath) { QTextStream inputTextStream(stdin, QIODevice::ReadOnly); @@ -78,10 +85,24 @@ int Show::showEntry(Database* database, QString entryPath) return EXIT_FAILURE; } - outputTextStream << " title: " << entry->title() << endl; - outputTextStream << "username: " << entry->username() << endl; - outputTextStream << "password: " << entry->password() << endl; - outputTextStream << " URL: " << entry->url() << endl; - outputTextStream << " Notes: " << entry->notes() << endl; - return EXIT_SUCCESS; + // If no attributes specified, output the default attribute set. + bool showAttributeNames = attributes.isEmpty(); + if (attributes.isEmpty()) { + attributes = EntryAttributes::DefaultAttributes; + } + + // Iterate over the attributes and output them line-by-line. + bool sawUnknownAttribute = false; + for (QString attribute : attributes) { + if (!entry->attributes()->contains(attribute)) { + sawUnknownAttribute = true; + qCritical("ERROR: unknown attribute '%s'.", qPrintable(attribute)); + continue; + } + if (showAttributeNames) { + outputTextStream << attribute << ": "; + } + outputTextStream << entry->attributes()->value(attribute) << endl; + } + return sawUnknownAttribute ? EXIT_FAILURE : EXIT_SUCCESS; } diff --git a/src/cli/Show.h b/src/cli/Show.h index f3bc55e60..f2caefdbf 100644 --- a/src/cli/Show.h +++ b/src/cli/Show.h @@ -26,7 +26,7 @@ public: Show(); ~Show(); int execute(QStringList arguments); - int showEntry(Database* database, QString entryPath); + int showEntry(Database* database, QStringList attributes, QString entryPath); }; #endif // KEEPASSXC_SHOW_H diff --git a/src/cli/keepassxc-cli.1 b/src/cli/keepassxc-cli.1 index 37127abc7..a9145b27e 100644 --- a/src/cli/keepassxc-cli.1 +++ b/src/cli/keepassxc-cli.1 @@ -96,6 +96,14 @@ Specify the title of the entry. Perform advanced analysis on the password. +.SS "Show options" + +.IP "-a, --attributes <attribute>..." +Names of the attributes to show. This option can be specified more than once, +with each attribute shown one-per-line in the given order. If no attributes are +specified, a summary of the default attributes is given. + + .SH REPORTING BUGS Bugs and feature requests can be reported on GitHub at https://github.com/keepassxreboot/keepassxc/issues. From 9f8943c89bfb4cfc1d6729eaed00b6db97391206 Mon Sep 17 00:00:00 2001 From: Aleksa Sarai <cyphar@cyphar.com> Date: Mon, 18 Dec 2017 02:44:12 +1100 Subject: [PATCH 151/402] keepassxc-cli show: resolve references in output (#1280) * core: database: make UUID searching case-insensitive 4c4d8a5e848c ("Implement search for reference placeholder based on fields other than ID") changed the semantics of searching-by-reference in KeePassXC. Unforuntately it contained a bug where it implicitly became case-sensitive to UUIDs, which broke existing databases that used references (especially since the default reference format uses a different case to the UUID used while searching). The tests didn't catch this because ->toHex() preserves the case that it was provided, they have been updated to check that UUIDs are case insensitive. * cli: show: resolve references in output Previously, `keepassxc-cli show` would not resolve references. This would make it quite hard to script around its output (since there's not interface to resolve references manually either). Fix this by using resolveMultiplePlaceholders as with all other users of ->password() and related entry fields. Fixes: keepassxreboot/keepassxc#1260 * tests: entry: add tests for ref-cloned entries This ensures that the most "intuitive" current usage of references (through the clone feature of the GUI) remains self-consistent and always produces the correct results. In addition, explicitly test that case insensitivity works as expected. These should avoid similar regressions in reference handling in the future. * http: resolve references in AccessControlDialog The access control dialog previously would not show the "real" username or "real" title when asking for permission to give access to entries. Fix this by resolving it, as we do in many other places. Fixes: keepassxreboot/keepassxc#1269 Signed-off-by: Aleksa Sarai <cyphar@cyphar.com> --- src/cli/Show.cpp | 2 +- src/core/Database.cpp | 2 +- src/http/AccessControlDialog.cpp | 4 +- tests/TestEntry.cpp | 93 +++++++++++++++++++++++++++++++- tests/TestEntry.h | 1 + 5 files changed, 97 insertions(+), 5 deletions(-) diff --git a/src/cli/Show.cpp b/src/cli/Show.cpp index 43a9a8376..66225c56a 100644 --- a/src/cli/Show.cpp +++ b/src/cli/Show.cpp @@ -102,7 +102,7 @@ int Show::showEntry(Database* database, QStringList attributes, QString entryPat if (showAttributeNames) { outputTextStream << attribute << ": "; } - outputTextStream << entry->attributes()->value(attribute) << endl; + outputTextStream << entry->resolveMultiplePlaceholders(entry->attributes()->value(attribute)) << endl; } return sawUnknownAttribute ? EXIT_FAILURE : EXIT_SUCCESS; } diff --git a/src/core/Database.cpp b/src/core/Database.cpp index 7ae9308a0..cb28ee211 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -150,7 +150,7 @@ Entry* Database::findEntryRecursive(const QString& text, EntryReferenceType refe found = entry->notes() == text; break; case EntryReferenceType::Uuid: - found = entry->uuid().toHex() == text; + found = entry->uuid() == Uuid::fromHex(text); break; case EntryReferenceType::CustomAttributes: found = entry->attributes()->containsValue(text); diff --git a/src/http/AccessControlDialog.cpp b/src/http/AccessControlDialog.cpp index ef02215a3..30ab3f21c 100644 --- a/src/http/AccessControlDialog.cpp +++ b/src/http/AccessControlDialog.cpp @@ -44,7 +44,9 @@ void AccessControlDialog::setUrl(const QString &url) void AccessControlDialog::setItems(const QList<Entry*> &items) { for (Entry* entry: items) { - ui->itemsList->addItem(entry->title() + " - " + entry->username()); + QString title = entry->resolveMultiplePlaceholders(entry->title()); + QString username = entry->resolveMultiplePlaceholders(entry->username()); + ui->itemsList->addItem(title + " - " + username); } } diff --git a/tests/TestEntry.cpp b/tests/TestEntry.cpp index bb1176453..47082d12f 100644 --- a/tests/TestEntry.cpp +++ b/tests/TestEntry.cpp @@ -337,12 +337,23 @@ void TestEntry::testResolveReferencePlaceholders() QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:A@A:%1}").arg(entry2->url())), entry2->url()); QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:N@N:%1}").arg(entry2->notes())), entry2->notes()); - QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@I:%1}").arg(entry3->uuid().toHex())), entry3->attributes()->value("AttributeTitle")); QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@I:%1}").arg(entry3->uuid().toHex())), entry3->attributes()->value("AttributeTitle")); QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:U@I:%1}").arg(entry3->uuid().toHex())), entry3->attributes()->value("AttributeUsername")); QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:P@I:%1}").arg(entry3->uuid().toHex())), entry3->attributes()->value("AttributePassword")); QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:A@I:%1}").arg(entry3->uuid().toHex())), entry3->attributes()->value("AttributeUrl")); QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:N@I:%1}").arg(entry3->uuid().toHex())), entry3->attributes()->value("AttributeNotes")); + + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:T@I:%1}").arg(entry3->uuid().toHex().toUpper())), entry3->attributes()->value("AttributeTitle")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:U@I:%1}").arg(entry3->uuid().toHex().toUpper())), entry3->attributes()->value("AttributeUsername")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:P@I:%1}").arg(entry3->uuid().toHex().toUpper())), entry3->attributes()->value("AttributePassword")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:A@I:%1}").arg(entry3->uuid().toHex().toUpper())), entry3->attributes()->value("AttributeUrl")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:N@I:%1}").arg(entry3->uuid().toHex().toUpper())), entry3->attributes()->value("AttributeNotes")); + + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:t@i:%1}").arg(entry3->uuid().toHex().toLower())), entry3->attributes()->value("AttributeTitle")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:u@i:%1}").arg(entry3->uuid().toHex().toLower())), entry3->attributes()->value("AttributeUsername")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:p@i:%1}").arg(entry3->uuid().toHex().toLower())), entry3->attributes()->value("AttributePassword")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:a@i:%1}").arg(entry3->uuid().toHex().toLower())), entry3->attributes()->value("AttributeUrl")); + QCOMPARE(tstEntry->resolveMultiplePlaceholders(QString("{REF:n@i:%1}").arg(entry3->uuid().toHex().toLower())), entry3->attributes()->value("AttributeNotes")); } void TestEntry::testResolveNonIdPlaceholdersToUuid() @@ -409,8 +420,86 @@ void TestEntry::testResolveNonIdPlaceholdersToUuid() newEntry.setGroup(root); newEntry.setNotes(newEntryNotesRaw); - const auto newEntryNotesResolved = + const auto newEntryNotesResolved = newEntry.resolveMultiplePlaceholders(newEntry.notes()); QCOMPARE(newEntryNotesResolved, QString(referencedEntry->uuid().toHex())); } } + +void TestEntry::testResolveClonedEntry() +{ + Database db; + Group* root = db.rootGroup(); + + Entry* original = new Entry(); + original->setGroup(root); + original->setUuid(Uuid::random()); + original->setTitle("Title"); + original->setUsername("SomeUsername"); + original->setPassword("SomePassword"); + + QCOMPARE(original->resolveMultiplePlaceholders(original->username()), original->username()); + QCOMPARE(original->resolveMultiplePlaceholders(original->password()), original->password()); + + // Top-level clones. + Entry* clone1 = original->clone(Entry::CloneNewUuid); + clone1->setGroup(root); + Entry* clone2 = original->clone(Entry::CloneUserAsRef | Entry::CloneNewUuid); + clone2->setGroup(root); + Entry* clone3 = original->clone(Entry::ClonePassAsRef | Entry::CloneNewUuid); + clone3->setGroup(root); + Entry* clone4 = original->clone(Entry::CloneUserAsRef | Entry::ClonePassAsRef | Entry::CloneNewUuid); + clone4->setGroup(root); + + QCOMPARE(clone1->resolveMultiplePlaceholders(clone1->username()), original->username()); + QCOMPARE(clone1->resolveMultiplePlaceholders(clone1->password()), original->password()); + QCOMPARE(clone2->resolveMultiplePlaceholders(clone2->username()), original->username()); + QCOMPARE(clone2->resolveMultiplePlaceholders(clone2->password()), original->password()); + QCOMPARE(clone3->resolveMultiplePlaceholders(clone3->username()), original->username()); + QCOMPARE(clone3->resolveMultiplePlaceholders(clone3->password()), original->password()); + QCOMPARE(clone4->resolveMultiplePlaceholders(clone4->username()), original->username()); + QCOMPARE(clone4->resolveMultiplePlaceholders(clone4->password()), original->password()); + + // Second-level clones. + Entry* cclone1 = clone4->clone(Entry::CloneNewUuid); + cclone1->setGroup(root); + Entry* cclone2 = clone4->clone(Entry::CloneUserAsRef | Entry::CloneNewUuid); + cclone2->setGroup(root); + Entry* cclone3 = clone4->clone(Entry::ClonePassAsRef | Entry::CloneNewUuid); + cclone3->setGroup(root); + Entry* cclone4 = clone4->clone(Entry::CloneUserAsRef | Entry::ClonePassAsRef | Entry::CloneNewUuid); + cclone4->setGroup(root); + + QCOMPARE(cclone1->resolveMultiplePlaceholders(cclone1->username()), original->username()); + QCOMPARE(cclone1->resolveMultiplePlaceholders(cclone1->password()), original->password()); + QCOMPARE(cclone2->resolveMultiplePlaceholders(cclone2->username()), original->username()); + QCOMPARE(cclone2->resolveMultiplePlaceholders(cclone2->password()), original->password()); + QCOMPARE(cclone3->resolveMultiplePlaceholders(cclone3->username()), original->username()); + QCOMPARE(cclone3->resolveMultiplePlaceholders(cclone3->password()), original->password()); + QCOMPARE(cclone4->resolveMultiplePlaceholders(cclone4->username()), original->username()); + QCOMPARE(cclone4->resolveMultiplePlaceholders(cclone4->password()), original->password()); + + // Change the original's attributes and make sure that the changes are tracked. + QString oldUsername = original->username(); + QString oldPassword = original->password(); + original->setUsername("DifferentUsername"); + original->setPassword("DifferentPassword"); + + QCOMPARE(clone1->resolveMultiplePlaceholders(clone1->username()), oldUsername); + QCOMPARE(clone1->resolveMultiplePlaceholders(clone1->password()), oldPassword); + QCOMPARE(clone2->resolveMultiplePlaceholders(clone2->username()), original->username()); + QCOMPARE(clone2->resolveMultiplePlaceholders(clone2->password()), oldPassword); + QCOMPARE(clone3->resolveMultiplePlaceholders(clone3->username()), oldUsername); + QCOMPARE(clone3->resolveMultiplePlaceholders(clone3->password()), original->password()); + QCOMPARE(clone4->resolveMultiplePlaceholders(clone4->username()), original->username()); + QCOMPARE(clone4->resolveMultiplePlaceholders(clone4->password()), original->password()); + + QCOMPARE(cclone1->resolveMultiplePlaceholders(cclone1->username()), original->username()); + QCOMPARE(cclone1->resolveMultiplePlaceholders(cclone1->password()), original->password()); + QCOMPARE(cclone2->resolveMultiplePlaceholders(cclone2->username()), original->username()); + QCOMPARE(cclone2->resolveMultiplePlaceholders(cclone2->password()), original->password()); + QCOMPARE(cclone3->resolveMultiplePlaceholders(cclone3->username()), original->username()); + QCOMPARE(cclone3->resolveMultiplePlaceholders(cclone3->password()), original->password()); + QCOMPARE(cclone4->resolveMultiplePlaceholders(cclone4->username()), original->username()); + QCOMPARE(cclone4->resolveMultiplePlaceholders(cclone4->password()), original->password()); +} diff --git a/tests/TestEntry.h b/tests/TestEntry.h index 44a371ba6..7c2350861 100644 --- a/tests/TestEntry.h +++ b/tests/TestEntry.h @@ -36,6 +36,7 @@ private slots: void testResolveRecursivePlaceholders(); void testResolveReferencePlaceholders(); void testResolveNonIdPlaceholdersToUuid(); + void testResolveClonedEntry(); }; #endif // KEEPASSX_TESTENTRY_H From b268671afda3eab1dbb0d27b796fff478e9c2610 Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Tue, 19 Dec 2017 00:07:25 -0500 Subject: [PATCH 152/402] Updated snapcraft build file * Removed snapd-xdg-open support; built into snapd * Updated desktop-qt5 stage packages --- snapcraft.yaml | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/snapcraft.yaml b/snapcraft.yaml index b8d9747ec..fd2ca7b8d 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -41,6 +41,8 @@ parts: - libxtst-dev - libyubikey-dev - libykpers-1-dev + stage-packages: + - dbus install: | sed -i 's|Icon=keepassxc|Icon=${SNAP}/usr/share/icons/hicolor/256x256/apps/keepassxc.png|g' $SNAPCRAFT_PART_INSTALL/usr/share/applications/org.keepassxc.KeePassXC.desktop after: [desktop-qt5] @@ -52,19 +54,12 @@ parts: - ttf-ubuntu-font-family - dmz-cursor-theme - light-themes + - adwaita-icon-theme + - gnome-themes-standard - shared-mime-info - libqt5gui5 - libgdk-pixbuf2.0-0 - libqt5svg5 # for loading icon themes which are svg - locales-all + - xdg-user-dirs - # Overcome limitation in snapd to support URL loading (CTRL+U) - # client needs to install "snapd-xdg-open" on their system - snapd-xdg-open: - source: https://github.com/ubuntu-core/snapd-xdg-open.git - source-depth: 1 - plugin: nil - install: | - install -D -t $SNAPCRAFT_PART_INSTALL/usr/bin/ data/xdg-open - stage-packages: - - dbus From f6a48f2672086001cd652252b2e3ded22c376513 Mon Sep 17 00:00:00 2001 From: Orivej Desh <orivej@gmx.fr> Date: Wed, 20 Dec 2017 08:25:55 +0000 Subject: [PATCH 153/402] Fix use of cmake_minimum_required cmake_minimum_required() must be used before project(), otherwise it has no effect on internal cmake code that runs when project() is invoked. In particular CMP0025 does not default to NEW and CMake does not detect Clang features on Darwin, which is necessary to compile the project with the upstream (non Apple) compiler. --- CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0b207b5e4..a92f018f5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,16 +14,16 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. +cmake_minimum_required(VERSION 3.1.0) + +project(KeePassXC) + if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo Debug DebugFull Profile MinSizeRel." FORCE) endif() -project(KeePassXC) - -cmake_minimum_required(VERSION 3.1.0) - set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake) # Support Visual Studio Code From 8037a7967371fbdc979fb84d820afb7fbb645c72 Mon Sep 17 00:00:00 2001 From: louib <louib@users.noreply.github.com> Date: Wed, 20 Dec 2017 18:08:18 -0500 Subject: [PATCH 154/402] Add \n in merge request message. (#1310) --- src/gui/DatabaseWidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 5b274dc00..b851839ae 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -1247,7 +1247,7 @@ void DatabaseWidget::reloadDatabaseFile() if (m_databaseModified) { // Ask if we want to merge changes into new database QMessageBox::StandardButton mb = MessageBox::question(this, tr("Merge Request"), - tr("The database file has changed and you have unsaved changes." + tr("The database file has changed and you have unsaved changes.\n" "Do you want to merge your changes?"), QMessageBox::Yes | QMessageBox::No); From fc39e8f27dd2cb62449fda7c3eaf33148d86bf7a Mon Sep 17 00:00:00 2001 From: Yen Chi Hsuan <yan12125@gmail.com> Date: Sat, 23 Dec 2017 16:20:59 +0800 Subject: [PATCH 155/402] Fix font size of URL label in the preview panel --- src/gui/DetailsWidget.ui | 1 - 1 file changed, 1 deletion(-) diff --git a/src/gui/DetailsWidget.ui b/src/gui/DetailsWidget.ui index 8cece9a2f..3a0b2f2c0 100644 --- a/src/gui/DetailsWidget.ui +++ b/src/gui/DetailsWidget.ui @@ -224,7 +224,6 @@ </property> <property name="font"> <font> - <pointsize>9</pointsize> <weight>75</weight> <bold>true</bold> </font> From 5b525eb9ca0b80bae2497af5605da8473f8a6d4b Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Wed, 20 Dec 2017 00:18:42 +0100 Subject: [PATCH 156/402] Refactor Translator class to load qtbase translations from local directory if available --- src/core/Translator.cpp | 105 +++++++++++++++++++++------------------- src/core/Translator.h | 7 ++- src/main.cpp | 2 +- 3 files changed, 59 insertions(+), 55 deletions(-) diff --git a/src/core/Translator.cpp b/src/core/Translator.cpp index 713727ea1..bc75a0973 100644 --- a/src/core/Translator.cpp +++ b/src/core/Translator.cpp @@ -1,4 +1,5 @@ /* + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * Copyright (C) 2014 Felix Geyer <debfx@fobos.de> * * This program is free software: you can redistribute it and/or modify @@ -21,33 +22,45 @@ #include <QDir> #include <QLibraryInfo> #include <QLocale> -#include <QRegExp> #include <QTranslator> +#include <QRegularExpression> #include "config-keepassx.h" #include "core/Config.h" #include "core/FilePath.h" -void Translator::installTranslator() +/** + * Install all KeePassXC and Qt translators. + */ +void Translator::installTranslators() { QString language = config()->get("GUI/Language").toString(); if (language == "system" || language.isEmpty()) { language = QLocale::system().name(); } - if (!installTranslator(language)) { - // English fallback still needs translations for plurals - if (!installTranslator("en_plurals")) { - qWarning("Couldn't load translations."); - } + const QStringList paths = { +#ifdef QT_DEBUG + QString("%1/share/translations").arg(KEEPASSX_BINARY_DIR), +#endif + filePath()->dataPath("translations") + }; + + bool translationsLoaded = false; + for (const QString& path : paths) { + translationsLoaded |= installTranslator(language, path) || installTranslator("en_plurals", path); + installQtTranslator(language, path); + } + if (!translationsLoaded) { + // couldn't load configured language or fallback + qWarning("Couldn't load translations."); } - - installQtTranslator(language); - - availableLanguages(); } -QList<QPair<QString, QString> > Translator::availableLanguages() +/** + * @return list of pairs of available language codes and names + */ +QList<QPair<QString, QString>> Translator::availableLanguages() { const QStringList paths = { #ifdef QT_DEBUG @@ -59,12 +72,13 @@ QList<QPair<QString, QString> > Translator::availableLanguages() QList<QPair<QString, QString> > languages; languages.append(QPair<QString, QString>("system", "System default")); - QRegExp regExp("keepassx_([a-zA-Z_]+)\\.qm", Qt::CaseInsensitive, QRegExp::RegExp2); + QRegularExpression regExp("^keepassx_([a-zA-Z_]+)\\.qm$", QRegularExpression::CaseInsensitiveOption); for (const QString& path : paths) { const QStringList fileList = QDir(path).entryList(); for (const QString& filename : fileList) { - if (regExp.exactMatch(filename)) { - QString langcode = regExp.cap(1); + QRegularExpressionMatch match = regExp.match(filename); + if (match.hasMatch()) { + QString langcode = match.captured(1); if (langcode == "en_plurals") { langcode = "en"; } @@ -85,46 +99,37 @@ QList<QPair<QString, QString> > Translator::availableLanguages() return languages; } -bool Translator::installTranslator(const QString& language) +/** + * Install KeePassXC translator. + * + * @param language translator language + * @param path local search path + * @return true on success + */ +bool Translator::installTranslator(const QString& language, const QString& path) { - const QStringList paths = { -#ifdef QT_DEBUG - QString("%1/share/translations").arg(KEEPASSX_BINARY_DIR), -#endif - filePath()->dataPath("translations") - }; - - for (const QString& path : paths) { - if (installTranslator(language, path)) { - return true; - } + QScopedPointer<QTranslator> translator(new QTranslator(qApp)); + if (translator->load(QString("keepassx_%1").arg(language), path)) { + return QCoreApplication::installTranslator(translator.take()); } - return false; } -bool Translator::installTranslator(const QString& language, const QString& path) +/** + * Install Qt5 base translator from the specified local search path or the default system path + * if no qtbase_* translations were found at the local path. + * + * @param language translator language + * @param path local search path + * @return true on success + */ +bool Translator::installQtTranslator(const QString& language, const QString& path) { - QTranslator* translator = new QTranslator(qApp); - if (translator->load(QString("keepassx_").append(language), path)) { - QCoreApplication::installTranslator(translator); - return true; - } - else { - delete translator; - return false; - } -} - -bool Translator::installQtTranslator(const QString& language) -{ - QTranslator* qtTranslator = new QTranslator(qApp); - if (qtTranslator->load(QString("%1/qtbase_%2").arg(QLibraryInfo::location(QLibraryInfo::TranslationsPath), language))) { - QCoreApplication::installTranslator(qtTranslator); - return true; - } - else { - delete qtTranslator; - return false; + QScopedPointer<QTranslator> qtTranslator(new QTranslator(qApp)); + if (qtTranslator->load(QString("qtbase_%1").arg(language), path)) { + return QCoreApplication::installTranslator(qtTranslator.take()); + } else if (qtTranslator->load(QString("qtbase_%1").arg(language), QLibraryInfo::location(QLibraryInfo::TranslationsPath))) { + return QCoreApplication::installTranslator(qtTranslator.take()); } + return false; } diff --git a/src/core/Translator.h b/src/core/Translator.h index 4bc4fca3e..cf62f48e4 100644 --- a/src/core/Translator.h +++ b/src/core/Translator.h @@ -24,13 +24,12 @@ class Translator { public: - static void installTranslator(); - static QList<QPair<QString, QString> > availableLanguages(); + static void installTranslators(); + static QList<QPair<QString, QString>> availableLanguages(); private: - static bool installTranslator(const QString& language); static bool installTranslator(const QString& language, const QString& path); - static bool installQtTranslator(const QString& language); + static bool installQtTranslator(const QString& language, const QString& path); }; #endif // KEEPASSX_TRANSLATOR_H diff --git a/src/main.cpp b/src/main.cpp index 354c8a3bd..7977435fc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -99,7 +99,7 @@ int main(int argc, char** argv) Config::createConfigFromFile(parser.value(configOption)); } - Translator::installTranslator(); + Translator::installTranslators(); #ifdef Q_OS_MAC // Don't show menu icons on OSX From c57973615837c3d0c1a8574a204d3a1943bd1e48 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Wed, 20 Dec 2017 00:19:04 +0100 Subject: [PATCH 157/402] Bundle qtbase translations on Windows --- share/translations/CMakeLists.txt | 6 ++++++ src/CMakeLists.txt | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/share/translations/CMakeLists.txt b/share/translations/CMakeLists.txt index 7380750e4..a5d8882be 100644 --- a/share/translations/CMakeLists.txt +++ b/share/translations/CMakeLists.txt @@ -1,3 +1,4 @@ +# Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> # Copyright (C) 2014 Felix Geyer <debfx@fobos.de> # # This program is free software: you can redistribute it and/or modify @@ -21,6 +22,11 @@ message(STATUS "${TRANSLATION_FILES}") qt5_add_translation(QM_FILES ${TRANSLATION_FILES}) +if(MINGW) + file(GLOB QTBASE_TRANSLATIONS ${Qt5_DIR}/../../../share/qt5/translations/qtbase_*.qm) +endif() +set(QM_FILES ${QM_FILES} ${QTBASE_TRANSLATIONS}) + install(FILES ${QM_FILES} DESTINATION ${DATA_INSTALL_DIR}/translations) add_custom_target(translations DEPENDS ${QM_FILES}) add_dependencies(${PROGNAME} translations) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 42e1bdbd0..afa30056c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,5 +1,5 @@ -# Copyright (C) 2010 Felix Geyer <debfx@fobos.de> # Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> +# Copyright (C) 2010 Felix Geyer <debfx@fobos.de> # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -352,7 +352,7 @@ if(MINGW) include(DeployQt4) install_qt4_executable(${PROGNAME}.exe) add_custom_command(TARGET ${PROGNAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${Qt5Core_DIR}/../../../share/qt5/plugins/platforms/qwindows$<$<CONFIG:Debug>:d>.dll + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${Qt5_DIR}/../../../share/qt5/plugins/platforms/qwindows$<$<CONFIG:Debug>:d>.dll $<TARGET_FILE_DIR:${PROGNAME}>) install(FILES $<TARGET_FILE_DIR:${PROGNAME}>/qwindows$<$<CONFIG:Debug>:d>.dll DESTINATION "platforms") endif() From a4cf32dce0eed6e0dd326a88f464712512482962 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Thu, 21 Dec 2017 19:12:51 +0100 Subject: [PATCH 158/402] Bundle qtbase translations with macOS and AppImage releases --- Dockerfile | 1 + release-tool | 3 ++- share/translations/CMakeLists.txt | 5 +++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index a5966be39..66ecb4c04 100644 --- a/Dockerfile +++ b/Dockerfile @@ -40,6 +40,7 @@ RUN set -x \ qt${QT5_VERSION}base \ qt${QT5_VERSION}tools \ qt${QT5_VERSION}x11extras \ + qt${QT5_VERSION}translations \ zlib1g-dev \ libxi-dev \ libxtst-dev \ diff --git a/release-tool b/release-tool index a3813fd93..93e964bc3 100755 --- a/release-tool +++ b/release-tool @@ -678,7 +678,8 @@ build() { "$DOCKER_IMAGE" \ bash -c "cd /keepassxc/out/build-release && \ cmake -DCMAKE_BUILD_TYPE=Release -DWITH_TESTS=Off $CMAKE_OPTIONS \ - -DCMAKE_INSTALL_PREFIX=\"${INSTALL_PREFIX}\" /keepassxc/src && \ + -DCMAKE_INSTALL_PREFIX=\"${INSTALL_PREFIX}\" \ + -DKEEPASSXC_DIST_TYPE=AppImage /keepassxc/src && \ make $MAKE_OPTIONS && make DESTDIR=/keepassxc/out/bin-release install/strip && \ /keepassxc/src/AppImage-Recipe.sh "$APP_NAME" "$RELEASE_NAME"" diff --git a/share/translations/CMakeLists.txt b/share/translations/CMakeLists.txt index a5d8882be..c0b1a49b8 100644 --- a/share/translations/CMakeLists.txt +++ b/share/translations/CMakeLists.txt @@ -24,6 +24,11 @@ qt5_add_translation(QM_FILES ${TRANSLATION_FILES}) if(MINGW) file(GLOB QTBASE_TRANSLATIONS ${Qt5_DIR}/../../../share/qt5/translations/qtbase_*.qm) +elseif(APPLE OR KEEPASSXC_DIST_APPIMAGE) + file(GLOB QTBASE_TRANSLATIONS + /usr/share/qt/translations/qtbase_*.qm + /usr/share/qt5/translations/qtbase_*.qm + ${Qt5_DIR}/../../../translations/qtbase_*.qm) endif() set(QM_FILES ${QM_FILES} ${QTBASE_TRANSLATIONS}) From 6c2ccada1383379a47035431b5f46d1038c21881 Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Thu, 21 Dec 2017 23:25:24 -0500 Subject: [PATCH 159/402] Support built-in translations in Snap --- snapcraft.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/snapcraft.yaml b/snapcraft.yaml index fd2ca7b8d..97a4bc255 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -43,8 +43,11 @@ parts: - libykpers-1-dev stage-packages: - dbus + - qttranslations5-l10n # common translations install: | sed -i 's|Icon=keepassxc|Icon=${SNAP}/usr/share/icons/hicolor/256x256/apps/keepassxc.png|g' $SNAPCRAFT_PART_INSTALL/usr/share/applications/org.keepassxc.KeePassXC.desktop + organize: + usr/share/qt5/translations/*.qm: usr/share/keepassxc/translations/ after: [desktop-qt5] # Redefine desktop-qt5 stage packages to work with Ubuntu 17.04 From bf5b96362f72de5c6a29e8ec49ac05cdd47aec0a Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Sun, 10 Dec 2017 20:55:18 +0200 Subject: [PATCH 160/402] Use a table view to display the list of attachments in EditEntryWidget --- src/gui/entry/EditEntryWidget.cpp | 35 ++++++++++++++---------- src/gui/entry/EditEntryWidget.h | 2 +- src/gui/entry/EditEntryWidgetAdvanced.ui | 10 +------ src/gui/entry/EntryAttachmentsModel.cpp | 31 +++++++++++++++------ src/gui/entry/EntryAttachmentsModel.h | 8 ++++++ 5 files changed, 53 insertions(+), 33 deletions(-) diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index db35b2f8f..944471c7f 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -140,9 +140,14 @@ void EditEntryWidget::setupAdvanced() m_attachmentsModel->setEntryAttachments(m_entryAttachments); m_advancedUi->attachmentsView->setModel(m_attachmentsModel); + m_advancedUi->attachmentsView->horizontalHeader()->setStretchLastSection(true); + m_advancedUi->attachmentsView->horizontalHeader()->resizeSection(0, 600); + m_advancedUi->attachmentsView->setSelectionBehavior(QAbstractItemView::SelectRows); + m_advancedUi->attachmentsView->setSelectionMode(QAbstractItemView::MultiSelection); + m_advancedUi->attachmentsView->setSelectionMode(QAbstractItemView::ExtendedSelection); - connect(m_advancedUi->attachmentsView->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), - SLOT(updateAttachmentButtonsEnabled(QModelIndex))); + connect(m_advancedUi->attachmentsView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), + SLOT(updateAttachmentButtonsEnabled())); connect(m_advancedUi->attachmentsView, SIGNAL(doubleClicked(QModelIndex)), SLOT(openAttachment(QModelIndex))); connect(m_advancedUi->saveAttachmentButton, SIGNAL(clicked()), SLOT(saveSelectedAttachments())); connect(m_advancedUi->openAttachmentButton, SIGNAL(clicked()), SLOT(openSelectedAttachments())); @@ -510,15 +515,6 @@ void EditEntryWidget::useExpiryPreset(QAction* action) m_mainUi->expireDatePicker->setDateTime(expiryDateTime); } -void EditEntryWidget::updateAttachmentButtonsEnabled(const QModelIndex& current) -{ - bool enable = current.isValid(); - - m_advancedUi->saveAttachmentButton->setEnabled(enable); - m_advancedUi->openAttachmentButton->setEnabled(enable); - m_advancedUi->removeAttachmentButton->setEnabled(enable && !m_history); -} - void EditEntryWidget::toggleHideNotes(bool visible) { m_mainUi->notesEdit->setVisible(visible); @@ -581,7 +577,7 @@ void EditEntryWidget::setForms(const Entry* entry, bool restore) m_mainUi->togglePasswordGeneratorButton->setDisabled(m_history); m_mainUi->passwordGenerator->reset(); m_advancedUi->addAttachmentButton->setEnabled(!m_history); - updateAttachmentButtonsEnabled(m_advancedUi->attachmentsView->currentIndex()); + updateAttachmentButtonsEnabled(); m_advancedUi->addAttributeButton->setEnabled(!m_history); m_advancedUi->editAttributeButton->setEnabled(false); m_advancedUi->removeAttributeButton->setEnabled(false); @@ -1069,7 +1065,7 @@ void EditEntryWidget::saveSelectedAttachment() void EditEntryWidget::saveSelectedAttachments() { - const QModelIndexList indexes = m_advancedUi->attachmentsView->selectionModel()->selectedIndexes(); + const QModelIndexList indexes = m_advancedUi->attachmentsView->selectionModel()->selectedRows(0); if (indexes.isEmpty()) { return; } else if (indexes.count() == 1) { @@ -1140,7 +1136,7 @@ void EditEntryWidget::openAttachment(const QModelIndex& index) void EditEntryWidget::openSelectedAttachments() { - const QModelIndexList indexes = m_advancedUi->attachmentsView->selectionModel()->selectedIndexes(); + const QModelIndexList indexes = m_advancedUi->attachmentsView->selectionModel()->selectedRows(0); if (indexes.isEmpty()) { return; } @@ -1163,7 +1159,7 @@ void EditEntryWidget::removeSelectedAttachments() { Q_ASSERT(!m_history); - const QModelIndexList indexes = m_advancedUi->attachmentsView->selectionModel()->selectedIndexes(); + const QModelIndexList indexes = m_advancedUi->attachmentsView->selectionModel()->selectedRows(0); if (indexes.isEmpty()) { return; } @@ -1180,6 +1176,15 @@ void EditEntryWidget::removeSelectedAttachments() } } +void EditEntryWidget::updateAttachmentButtonsEnabled() +{ + const bool hasSelection = m_advancedUi->attachmentsView->selectionModel()->hasSelection(); + + m_advancedUi->saveAttachmentButton->setEnabled(hasSelection); + m_advancedUi->openAttachmentButton->setEnabled(hasSelection); + m_advancedUi->removeAttachmentButton->setEnabled(hasSelection && !m_history); +} + void EditEntryWidget::updateAutoTypeEnabled() { bool autoTypeEnabled = m_autoTypeUi->enableButton->isChecked(); diff --git a/src/gui/entry/EditEntryWidget.h b/src/gui/entry/EditEntryWidget.h index 883e7e7fb..887e562d6 100644 --- a/src/gui/entry/EditEntryWidget.h +++ b/src/gui/entry/EditEntryWidget.h @@ -92,6 +92,7 @@ private slots: void openAttachment(const QModelIndex& index); void openSelectedAttachments(); void removeSelectedAttachments(); + void updateAttachmentButtonsEnabled(); void updateAutoTypeEnabled(); void insertAutoTypeAssoc(); void removeAutoTypeAssoc(); @@ -106,7 +107,6 @@ private slots: void histEntryActivated(const QModelIndex& index); void updateHistoryButtons(const QModelIndex& current, const QModelIndex& previous); void useExpiryPreset(QAction* action); - void updateAttachmentButtonsEnabled(const QModelIndex& current); void toggleHideNotes(bool visible); #ifdef WITH_XC_SSHAGENT void updateSSHAgent(); diff --git a/src/gui/entry/EditEntryWidgetAdvanced.ui b/src/gui/entry/EditEntryWidgetAdvanced.ui index 2c7f95dde..5085d164e 100644 --- a/src/gui/entry/EditEntryWidgetAdvanced.ui +++ b/src/gui/entry/EditEntryWidgetAdvanced.ui @@ -153,14 +153,7 @@ </property> <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> - <widget class="QListView" name="attachmentsView"> - <property name="flow"> - <enum>QListView::LeftToRight</enum> - </property> - <property name="isWrapping" stdset="0"> - <bool>true</bool> - </property> - </widget> + <widget class="QTableView" name="attachmentsView"/> </item> <item> <layout class="QVBoxLayout" name="attachmentsButtonLayout"> @@ -234,7 +227,6 @@ <tabstop>addAttributeButton</tabstop> <tabstop>removeAttributeButton</tabstop> <tabstop>editAttributeButton</tabstop> - <tabstop>attachmentsView</tabstop> <tabstop>addAttachmentButton</tabstop> <tabstop>removeAttachmentButton</tabstop> <tabstop>openAttachmentButton</tabstop> diff --git a/src/gui/entry/EntryAttachmentsModel.cpp b/src/gui/entry/EntryAttachmentsModel.cpp index 082641380..332ed754c 100644 --- a/src/gui/entry/EntryAttachmentsModel.cpp +++ b/src/gui/entry/EntryAttachmentsModel.cpp @@ -26,6 +26,8 @@ EntryAttachmentsModel::EntryAttachmentsModel(QObject* parent) : QAbstractListModel(parent) , m_entryAttachments(nullptr) { + m_headers << tr("Name") + << tr("Size"); } void EntryAttachmentsModel::setEntryAttachments(EntryAttachments* entryAttachments) @@ -65,7 +67,17 @@ int EntryAttachmentsModel::columnCount(const QModelIndex& parent) const { Q_UNUSED(parent); - return 1; + return Columns::ColumnsCount; +} + +QVariant EntryAttachmentsModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { + Q_ASSERT(m_headers.size() == columnCount()); + return m_headers[section]; + } + + return QAbstractListModel::headerData(section, orientation, role); } QVariant EntryAttachmentsModel::data(const QModelIndex& index, int role) const @@ -74,15 +86,18 @@ QVariant EntryAttachmentsModel::data(const QModelIndex& index, int role) const return QVariant(); } - if (role == Qt::DisplayRole && index.column() == 0) { + if (role == Qt::DisplayRole) { QString key = keyByIndex(index); - - return QString("%1 (%2)").arg(key, - Tools::humanReadableFileSize(m_entryAttachments->value(key).size())); - } - else { - return QVariant(); + switch (index.column()) { + case Columns::NameColumn: + return key; + case Columns::SizeColumn: + return Tools::humanReadableFileSize(m_entryAttachments->value(key).size()); + default: + break; + } } + return QVariant(); } QString EntryAttachmentsModel::keyByIndex(const QModelIndex& index) const diff --git a/src/gui/entry/EntryAttachmentsModel.h b/src/gui/entry/EntryAttachmentsModel.h index 6abcdc2e2..fa8d35548 100644 --- a/src/gui/entry/EntryAttachmentsModel.h +++ b/src/gui/entry/EntryAttachmentsModel.h @@ -27,10 +27,17 @@ class EntryAttachmentsModel : public QAbstractListModel Q_OBJECT public: + enum Columns { + NameColumn, + SizeColumn, + ColumnsCount + }; + explicit EntryAttachmentsModel(QObject* parent = nullptr); void setEntryAttachments(EntryAttachments* entry); int rowCount(const QModelIndex& parent = QModelIndex()) const override; int columnCount(const QModelIndex& parent = QModelIndex()) const override; + QVariant headerData(int section, Qt::Orientation orientation, int role) const override; QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; QString keyByIndex(const QModelIndex& index) const; @@ -45,6 +52,7 @@ private slots: private: EntryAttachments* m_entryAttachments; + QStringList m_headers; }; #endif // KEEPASSX_ENTRYATTACHMENTSMODEL_H From 90a64dbde239c758c48d6b8681523b87e774a40b Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Fri, 8 Dec 2017 21:06:30 +0200 Subject: [PATCH 161/402] Add drag and drop support for attachments view in EditEntryWidget --- src/gui/entry/EditEntryWidget.cpp | 85 ++++++++++++++++++++++++------- src/gui/entry/EditEntryWidget.h | 3 ++ 2 files changed, 71 insertions(+), 17 deletions(-) diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index 944471c7f..2ba395c95 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -29,6 +29,9 @@ #include <QMenu> #include <QSortFilterProxyModel> #include <QTemporaryFile> +#include <QMimeData> +#include <QEvent> + #include "core/Config.h" #include "core/Database.h" @@ -138,6 +141,10 @@ void EditEntryWidget::setupAdvanced() m_advancedUi->setupUi(m_advancedWidget); addPage(tr("Advanced"), FilePath::instance()->icon("categories", "preferences-other"), m_advancedWidget); + m_advancedUi->attachmentsView->setAcceptDrops(false); + m_advancedUi->attachmentsView->viewport()->setAcceptDrops(true); + m_advancedUi->attachmentsView->viewport()->installEventFilter(this); + m_attachmentsModel->setEntryAttachments(m_entryAttachments); m_advancedUi->attachmentsView->setModel(m_attachmentsModel); m_advancedUi->attachmentsView->horizontalHeader()->setStretchLastSection(true); @@ -145,7 +152,6 @@ void EditEntryWidget::setupAdvanced() m_advancedUi->attachmentsView->setSelectionBehavior(QAbstractItemView::SelectRows); m_advancedUi->attachmentsView->setSelectionMode(QAbstractItemView::MultiSelection); - m_advancedUi->attachmentsView->setSelectionMode(QAbstractItemView::ExtendedSelection); connect(m_advancedUi->attachmentsView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), SLOT(updateAttachmentButtonsEnabled())); connect(m_advancedUi->attachmentsView, SIGNAL(doubleClicked(QModelIndex)), SLOT(openAttachment(QModelIndex))); @@ -971,6 +977,43 @@ bool EditEntryWidget::openAttachment(const QModelIndex &index, QString *errorMes return true; } +bool EditEntryWidget::eventFilter(QObject* watched, QEvent* e) +{ + switch (e->type()) { + case QEvent::DragEnter: + case QEvent::DragMove: { + QDropEvent* dropEv = static_cast<QDropEvent*>(e); + const QMimeData* mimeData = dropEv->mimeData(); + if (mimeData->hasUrls()) { + dropEv->acceptProposedAction(); + return true; + } + break; + } + case QEvent::Drop: { + QDropEvent* dropEv = static_cast<QDropEvent*>(e); + const QMimeData* mimeData = dropEv->mimeData(); + if (mimeData->hasUrls()) { + dropEv->acceptProposedAction(); + QStringList filenames; + for (const QUrl url: mimeData->urls()) { + QFileInfo fInfo(url.toLocalFile()); + if (fInfo.isFile()) { + filenames.append(fInfo.absoluteFilePath()); + } + } + insertAttachments(filenames); + + return true; + } + } + default: + break; + } + + return EditWidget::eventFilter(watched, e); +} + void EditEntryWidget::protectCurrentAttribute(bool state) { QModelIndex index = m_advancedUi->attributesView->currentIndex(); @@ -1001,6 +1044,26 @@ void EditEntryWidget::revealCurrentAttribute() } } +void EditEntryWidget::insertAttachments(const QStringList &filenames, QString *errorMessage) +{ + QStringList errors; + for (const QString &filename: filenames) { + const QFileInfo fInfo(filename); + QFile file(filename); + QByteArray data; + const bool readOk = file.open(QIODevice::ReadOnly) && Tools::readAllFromDevice(&file, data); + if (readOk) { + m_entryAttachments->set(fInfo.fileName(), data); + } else { + errors.append(QString("%1 - %2").arg(fInfo.fileName(), file.errorString())); + } + } + + if (errorMessage && !errors.isEmpty()) { + *errorMessage = tr("Unable to open files:\n%1").arg(errors.join('\n'));; + } +} + void EditEntryWidget::insertAttachments() { Q_ASSERT(!m_history); @@ -1017,22 +1080,10 @@ void EditEntryWidget::insertAttachments() config()->set("LastAttachmentDir", QFileInfo(filenames.first()).absolutePath()); - QStringList errors; - for (const QString &filename: filenames) { - const QFileInfo fInfo(filename); - QFile file(filename); - QByteArray data; - const bool readOk = file.open(QIODevice::ReadOnly) && Tools::readAllFromDevice(&file, data); - if (!readOk) { - errors.append(QString("%1 - %2").arg(fInfo.fileName(), file.errorString())); - continue; - } - - m_entryAttachments->set(fInfo.fileName(), data); - } - - if (!errors.isEmpty()) { - showMessage(tr("Unable to open files:\n%1").arg(errors.join('\n')), MessageWidget::Error); + QString error; + insertAttachments(filenames, &error); + if (!error.isEmpty()) { + showMessage(error, MessageWidget::Error); } } diff --git a/src/gui/entry/EditEntryWidget.h b/src/gui/entry/EditEntryWidget.h index 887e562d6..01c173512 100644 --- a/src/gui/entry/EditEntryWidget.h +++ b/src/gui/entry/EditEntryWidget.h @@ -86,6 +86,7 @@ private slots: void updateCurrentAttribute(); void protectCurrentAttribute(bool state); void revealCurrentAttribute(); + void insertAttachments(const QStringList &fileNames, QString *errorMessage = nullptr); void insertAttachments(); void saveSelectedAttachment(); void saveSelectedAttachments(); @@ -142,6 +143,8 @@ private: bool openAttachment(const QModelIndex& index, QString *errorMessage); + bool eventFilter(QObject* watched, QEvent* event) override; + Entry* m_entry; Database* m_database; From 0c200d360be6dc1d3a59991fb8aad349ace334d1 Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Wed, 13 Dec 2017 22:22:31 +0200 Subject: [PATCH 162/402] Add attachments tab to details view --- src/core/EntryAttachments.cpp | 5 +++ src/core/EntryAttachments.h | 1 + src/gui/DatabaseWidget.cpp | 3 ++ src/gui/DetailsWidget.cpp | 52 +++++++++++++++++++++++++++++-- src/gui/DetailsWidget.h | 13 ++++++-- src/gui/DetailsWidget.ui | 10 ++++++ src/gui/entry/EditEntryWidget.cpp | 5 ++- src/gui/entry/EditEntryWidget.h | 2 +- 8 files changed, 82 insertions(+), 9 deletions(-) diff --git a/src/core/EntryAttachments.cpp b/src/core/EntryAttachments.cpp index bab110576..957558609 100644 --- a/src/core/EntryAttachments.cpp +++ b/src/core/EntryAttachments.cpp @@ -111,6 +111,11 @@ void EntryAttachments::remove(const QStringList& keys) } } +bool EntryAttachments::isEmpty() const +{ + return m_attachments.isEmpty(); +} + void EntryAttachments::clear() { if (m_attachments.isEmpty()) { diff --git a/src/core/EntryAttachments.h b/src/core/EntryAttachments.h index 8fa7c7179..0dba9543f 100644 --- a/src/core/EntryAttachments.h +++ b/src/core/EntryAttachments.h @@ -36,6 +36,7 @@ public: void set(const QString& key, const QByteArray& value); void remove(const QString& key); void remove(const QStringList& keys); + bool isEmpty() const; void clear(); void copyDataFrom(const EntryAttachments* other); bool operator==(const EntryAttachments& other) const; diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index b851839ae..b6e772f65 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -111,6 +111,9 @@ DatabaseWidget::DatabaseWidget(Database* db, QWidget* parent) "border-radius: 5px;"); m_detailsView = new DetailsWidget(this); + connect(m_detailsView, &DetailsWidget::errorOccured, this, [this](const QString& error) { + showMessage(error, MessageWidget::MessageType::Error, false); + }); QVBoxLayout* vLayout = new QVBoxLayout(rightHandSideWidget); vLayout->setMargin(0); diff --git a/src/gui/DetailsWidget.cpp b/src/gui/DetailsWidget.cpp index 23c3485ad..eadc5d47c 100644 --- a/src/gui/DetailsWidget.cpp +++ b/src/gui/DetailsWidget.cpp @@ -21,12 +21,16 @@ #include <QDebug> #include <QTimer> +#include <QDir> +#include <QDesktopServices> +#include <QTemporaryFile> #include "core/Config.h" #include "core/FilePath.h" #include "core/TimeInfo.h" #include "gui/Clipboard.h" #include "gui/DatabaseWidget.h" +#include "entry/EntryAttachmentsModel.h" DetailsWidget::DetailsWidget(QWidget* parent) : QWidget(parent) @@ -36,9 +40,11 @@ DetailsWidget::DetailsWidget(QWidget* parent) , m_currentGroup(nullptr) , m_timer(nullptr) , m_attributesWidget(nullptr) + , m_attachmentsWidget(nullptr) , m_autotypeWidget(nullptr) , m_selectedTabEntry(0) , m_selectedTabGroup(0) + , m_attachmentsModel(new EntryAttachmentsModel(this)) { m_ui->setupUi(this); @@ -53,6 +59,17 @@ DetailsWidget::DetailsWidget(QWidget* parent) connect(m_ui->closeButton, SIGNAL(toggled(bool)), SLOT(hideDetails())); connect(m_ui->tabWidget, SIGNAL(tabBarClicked(int)), SLOT(updateTabIndex(int))); + m_ui->attachmentsTableView->setModel(m_attachmentsModel); + m_ui->attachmentsTableView->horizontalHeader()->setStretchLastSection(true); + m_ui->attachmentsTableView->horizontalHeader()->resizeSection(0, 600); + m_ui->attachmentsTableView->setSelectionBehavior(QAbstractItemView::SelectRows); + m_ui->attachmentsTableView->setSelectionMode(QAbstractItemView::SingleSelection); + connect(m_ui->attachmentsTableView, SIGNAL(activated(QModelIndex)), SLOT(openAttachment(QModelIndex))); + + m_attributesWidget = m_ui->tabWidget->widget(AttributesTab); + m_attachmentsWidget = m_ui->tabWidget->widget(AttachmentsTab); + m_autotypeWidget = m_ui->tabWidget->widget(AutotypeTab); + this->hide(); } @@ -75,8 +92,9 @@ void DetailsWidget::getSelectedEntry(Entry* selectedEntry) m_ui->stackedWidget->setCurrentIndex(EntryPreview); - if (m_ui->tabWidget->count() < 4) { + if (m_ui->tabWidget->count() < 5) { m_ui->tabWidget->insertTab(static_cast<int>(AttributesTab), m_attributesWidget, "Attributes"); + m_ui->tabWidget->insertTab(static_cast<int>(AttachmentsTab), m_attachmentsWidget, "Attachments"); m_ui->tabWidget->insertTab(static_cast<int>(AutotypeTab), m_autotypeWidget, "Autotype"); } @@ -173,6 +191,10 @@ void DetailsWidget::getSelectedEntry(Entry* selectedEntry) m_ui->attributesEdit->setText(attributesText); } + const bool hasAttachments = !m_currentEntry->attachments()->isEmpty(); + m_ui->tabWidget->setTabEnabled(AttachmentsTab, hasAttachments); + m_attachmentsModel->setEntryAttachments(hasAttachments ? m_currentEntry->attachments() : nullptr); + m_ui->autotypeTree->clear(); AutoTypeAssociations* autotypeAssociations = m_currentEntry->autoTypeAssociations(); QList<QTreeWidgetItem*> items; @@ -209,9 +231,8 @@ void DetailsWidget::getSelectedGroup(Group* selectedGroup) m_ui->stackedWidget->setCurrentIndex(GroupPreview); if (m_ui->tabWidget->count() > 2) { - m_autotypeWidget = m_ui->tabWidget->widget(AutotypeTab); - m_attributesWidget = m_ui->tabWidget->widget(AttributesTab); m_ui->tabWidget->removeTab(AutotypeTab); + m_ui->tabWidget->removeTab(AttachmentsTab); m_ui->tabWidget->removeTab(AttributesTab); } @@ -338,3 +359,28 @@ void DetailsWidget::updateTabIndex(int index) m_selectedTabEntry = index; } } + +void DetailsWidget::openAttachment(const QModelIndex& index) +{ + Q_ASSERT(m_currentEntry != nullptr); + const QString filename = m_attachmentsModel->keyByIndex(index); + const QByteArray attachmentData = m_currentEntry->attachments()->value(filename); + + // tmp file will be removed once the database (or the application) has been closed + const QString tmpFileTemplate = QDir::temp().absoluteFilePath(QString("XXXXXX.").append(filename)); + QTemporaryFile* tmpFile = new QTemporaryFile(tmpFileTemplate, this); + + const bool saveOk = tmpFile->open() + && tmpFile->write(attachmentData) == attachmentData.size() + && tmpFile->flush(); + + if (!saveOk) { + delete tmpFile; + emit errorOccured(tr("Unable to open the attachment:\n").append(tmpFile->errorString())); + return; + } + + tmpFile->close(); + QDesktopServices::openUrl(QUrl::fromLocalFile(tmpFile->fileName())); +} + diff --git a/src/gui/DetailsWidget.h b/src/gui/DetailsWidget.h index 780fe5588..c50e2d7ef 100644 --- a/src/gui/DetailsWidget.h +++ b/src/gui/DetailsWidget.h @@ -25,6 +25,8 @@ namespace Ui { class DetailsWidget; } +class EntryAttachmentsModel; + class DetailsWidget : public QWidget { Q_OBJECT @@ -44,10 +46,14 @@ public: GeneralTab = 0, AttributesTab = 1, GroupNotesTab = 1, - NotesTab = 2, - AutotypeTab = 3, + AttachmentsTab = 2, + NotesTab = 3, + AutotypeTab = 4, }; +signals: + void errorOccured(const QString& error); + private slots: void getSelectedEntry(Entry* selectedEntry); void getSelectedGroup(Group* selectedGroup); @@ -56,6 +62,7 @@ private slots: void hideDetails(); void setDatabaseMode(DatabaseWidget::Mode mode); void updateTabIndex(int index); + void openAttachment(const QModelIndex& index); private: const QScopedPointer<Ui::DetailsWidget> m_ui; @@ -65,9 +72,11 @@ private: quint8 m_step; QTimer* m_timer; QWidget* m_attributesWidget; + QWidget* m_attachmentsWidget; QWidget* m_autotypeWidget; quint8 m_selectedTabEntry; quint8 m_selectedTabGroup; + EntryAttachmentsModel* const m_attachmentsModel; QString shortUrl(QString url); QString shortPassword(QString password); }; diff --git a/src/gui/DetailsWidget.ui b/src/gui/DetailsWidget.ui index 3a0b2f2c0..d7cb29cdb 100644 --- a/src/gui/DetailsWidget.ui +++ b/src/gui/DetailsWidget.ui @@ -454,6 +454,16 @@ </item> </layout> </widget> + <widget class="QWidget" name="attachmentsTab"> + <attribute name="title"> + <string>Attachments</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_6"> + <item> + <widget class="QTableView" name="attachmentsTableView"/> + </item> + </layout> + </widget> <widget class="QWidget" name="notesTab"> <attribute name="title"> <string>Notes</string> diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index 2ba395c95..c6d49c822 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -32,7 +32,6 @@ #include <QMimeData> #include <QEvent> - #include "core/Config.h" #include "core/Database.h" #include "core/Entry.h" @@ -150,7 +149,7 @@ void EditEntryWidget::setupAdvanced() m_advancedUi->attachmentsView->horizontalHeader()->setStretchLastSection(true); m_advancedUi->attachmentsView->horizontalHeader()->resizeSection(0, 600); m_advancedUi->attachmentsView->setSelectionBehavior(QAbstractItemView::SelectRows); - m_advancedUi->attachmentsView->setSelectionMode(QAbstractItemView::MultiSelection); + m_advancedUi->attachmentsView->setSelectionMode(QAbstractItemView::ExtendedSelection); connect(m_advancedUi->attachmentsView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), SLOT(updateAttachmentButtonsEnabled())); @@ -1044,7 +1043,7 @@ void EditEntryWidget::revealCurrentAttribute() } } -void EditEntryWidget::insertAttachments(const QStringList &filenames, QString *errorMessage) +void EditEntryWidget::insertAttachments(const QStringList& filenames, QString* errorMessage) { QStringList errors; for (const QString &filename: filenames) { diff --git a/src/gui/entry/EditEntryWidget.h b/src/gui/entry/EditEntryWidget.h index 01c173512..d40b5c148 100644 --- a/src/gui/entry/EditEntryWidget.h +++ b/src/gui/entry/EditEntryWidget.h @@ -86,7 +86,7 @@ private slots: void updateCurrentAttribute(); void protectCurrentAttribute(bool state); void revealCurrentAttribute(); - void insertAttachments(const QStringList &fileNames, QString *errorMessage = nullptr); + void insertAttachments(const QStringList& fileNames, QString* errorMessage = nullptr); void insertAttachments(); void saveSelectedAttachment(); void saveSelectedAttachments(); From ed0bda98a684a764d8c1f00b97112624d2ae79ff Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Sat, 16 Dec 2017 23:26:51 +0200 Subject: [PATCH 163/402] Fix failing entry model test for attachment name and size --- src/gui/entry/EntryAttachmentsModel.cpp | 19 +++++++++++-------- tests/TestEntryModel.cpp | 6 ++++-- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/gui/entry/EntryAttachmentsModel.cpp b/src/gui/entry/EntryAttachmentsModel.cpp index 332ed754c..608744841 100644 --- a/src/gui/entry/EntryAttachmentsModel.cpp +++ b/src/gui/entry/EntryAttachmentsModel.cpp @@ -86,17 +86,20 @@ QVariant EntryAttachmentsModel::data(const QModelIndex& index, int role) const return QVariant(); } - if (role == Qt::DisplayRole) { - QString key = keyByIndex(index); - switch (index.column()) { - case Columns::NameColumn: + if (role == Qt::DisplayRole || role == Qt::EditRole) { + const QString key = keyByIndex(index); + const int column = index.column(); + if (column == Columns::NameColumn) { return key; - case Columns::SizeColumn: - return Tools::humanReadableFileSize(m_entryAttachments->value(key).size()); - default: - break; + } else if (column == SizeColumn) { + const int attachmentSize = m_entryAttachments->value(key).size(); + if (role == Qt::DisplayRole) { + return Tools::humanReadableFileSize(attachmentSize); + } + return attachmentSize; } } + return QVariant(); } diff --git a/tests/TestEntryModel.cpp b/tests/TestEntryModel.cpp index e0c8bb490..ad7c9060a 100644 --- a/tests/TestEntryModel.cpp +++ b/tests/TestEntryModel.cpp @@ -122,9 +122,11 @@ void TestEntryModel::testAttachmentsModel() entryAttachments->set("first", QByteArray("123")); entryAttachments->set("2nd", QByteArray("456")); - entryAttachments->set("2nd", QByteArray("789")); + entryAttachments->set("2nd", QByteArray("7890")); - QCOMPARE(model->data(model->index(0, 0)).toString().left(4), QString("2nd ")); + const int firstRow = 0; + QCOMPARE(model->data(model->index(firstRow, EntryAttachmentsModel::NameColumn)).toString(), QString("2nd")); + QCOMPARE(model->data(model->index(firstRow, EntryAttachmentsModel::SizeColumn), Qt::EditRole).toInt(), 4); entryAttachments->remove("first"); From c490c21cd53a9286c86143ef524ad3b22486d295 Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Tue, 19 Dec 2017 15:36:09 +0200 Subject: [PATCH 164/402] Move attachments view to the separate widget EntryAttachmentsWidget --- src/CMakeLists.txt | 1 + src/gui/DatabaseWidget.cpp | 4 +- src/gui/DetailsWidget.cpp | 2 +- src/gui/DetailsWidget.h | 2 +- src/gui/entry/EditEntryWidget.cpp | 291 +------------------ src/gui/entry/EditEntryWidget.h | 16 - src/gui/entry/EditEntryWidgetAdvanced.ui | 81 +----- src/gui/entry/EntryAttachmentsWidget.cpp | 353 +++++++++++++++++++++++ src/gui/entry/EntryAttachmentsWidget.h | 59 ++++ src/gui/entry/EntryAttachmentsWidget.ui | 99 +++++++ 10 files changed, 541 insertions(+), 367 deletions(-) create mode 100644 src/gui/entry/EntryAttachmentsWidget.cpp create mode 100644 src/gui/entry/EntryAttachmentsWidget.h create mode 100644 src/gui/entry/EntryAttachmentsWidget.ui diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index afa30056c..216db839e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -130,6 +130,7 @@ set(keepassx_SOURCES gui/entry/EditEntryWidget.cpp gui/entry/EditEntryWidget_p.h gui/entry/EntryAttachmentsModel.cpp + gui/entry/EntryAttachmentsWidget.cpp gui/entry/EntryAttributesModel.cpp gui/entry/EntryHistoryModel.cpp gui/entry/EntryModel.cpp diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index b6e772f65..1ef91a4fc 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -111,8 +111,8 @@ DatabaseWidget::DatabaseWidget(Database* db, QWidget* parent) "border-radius: 5px;"); m_detailsView = new DetailsWidget(this); - connect(m_detailsView, &DetailsWidget::errorOccured, this, [this](const QString& error) { - showMessage(error, MessageWidget::MessageType::Error, false); + connect(m_detailsView, &DetailsWidget::errorOccurred, this, [this](const QString& error) { + showMessage(error, MessageWidget::MessageType::Error); }); QVBoxLayout* vLayout = new QVBoxLayout(rightHandSideWidget); diff --git a/src/gui/DetailsWidget.cpp b/src/gui/DetailsWidget.cpp index eadc5d47c..8c4de5fc9 100644 --- a/src/gui/DetailsWidget.cpp +++ b/src/gui/DetailsWidget.cpp @@ -376,7 +376,7 @@ void DetailsWidget::openAttachment(const QModelIndex& index) if (!saveOk) { delete tmpFile; - emit errorOccured(tr("Unable to open the attachment:\n").append(tmpFile->errorString())); + emit errorOccurred(tr("Unable to open the attachment:\n").append(tmpFile->errorString())); return; } diff --git a/src/gui/DetailsWidget.h b/src/gui/DetailsWidget.h index c50e2d7ef..610976515 100644 --- a/src/gui/DetailsWidget.h +++ b/src/gui/DetailsWidget.h @@ -52,7 +52,7 @@ public: }; signals: - void errorOccured(const QString& error); + void errorOccurred(const QString& error); private slots: void getSelectedEntry(Entry* selectedEntry); diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index c6d49c822..b922f4171 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -70,8 +70,6 @@ EditEntryWidget::EditEntryWidget(QWidget* parent) , m_sshAgentWidget(new QWidget()) , m_editWidgetProperties(new EditWidgetProperties()) , m_historyWidget(new QWidget()) - , m_entryAttachments(new EntryAttachments(this)) - , m_attachmentsModel(new EntryAttachmentsModel(m_advancedWidget)) , m_entryAttributes(new EntryAttributes(this)) , m_attributesModel(new EntryAttributesModel(m_advancedWidget)) , m_historyModel(new EntryHistoryModel(this)) @@ -140,24 +138,12 @@ void EditEntryWidget::setupAdvanced() m_advancedUi->setupUi(m_advancedWidget); addPage(tr("Advanced"), FilePath::instance()->icon("categories", "preferences-other"), m_advancedWidget); - m_advancedUi->attachmentsView->setAcceptDrops(false); - m_advancedUi->attachmentsView->viewport()->setAcceptDrops(true); - m_advancedUi->attachmentsView->viewport()->installEventFilter(this); + m_advancedUi->attachmentsWidget->setReadOnly(false); + m_advancedUi->attachmentsWidget->setButtonsVisible(true); - m_attachmentsModel->setEntryAttachments(m_entryAttachments); - m_advancedUi->attachmentsView->setModel(m_attachmentsModel); - m_advancedUi->attachmentsView->horizontalHeader()->setStretchLastSection(true); - m_advancedUi->attachmentsView->horizontalHeader()->resizeSection(0, 600); - m_advancedUi->attachmentsView->setSelectionBehavior(QAbstractItemView::SelectRows); - m_advancedUi->attachmentsView->setSelectionMode(QAbstractItemView::ExtendedSelection); - - connect(m_advancedUi->attachmentsView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), - SLOT(updateAttachmentButtonsEnabled())); - connect(m_advancedUi->attachmentsView, SIGNAL(doubleClicked(QModelIndex)), SLOT(openAttachment(QModelIndex))); - connect(m_advancedUi->saveAttachmentButton, SIGNAL(clicked()), SLOT(saveSelectedAttachments())); - connect(m_advancedUi->openAttachmentButton, SIGNAL(clicked()), SLOT(openSelectedAttachments())); - connect(m_advancedUi->addAttachmentButton, SIGNAL(clicked()), SLOT(insertAttachments())); - connect(m_advancedUi->removeAttachmentButton, SIGNAL(clicked()), SLOT(removeSelectedAttachments())); + connect(m_advancedUi->attachmentsWidget, &EntryAttachmentsWidget::errorOccurred, this, [this](const QString &error) { + showMessage(error, MessageWidget::Error); + }); m_attributesModel->setEntryAttributes(m_entryAttributes); m_advancedUi->attributesView->setModel(m_attributesModel); @@ -581,8 +567,8 @@ void EditEntryWidget::setForms(const Entry* entry, bool restore) m_mainUi->togglePasswordGeneratorButton->setChecked(false); m_mainUi->togglePasswordGeneratorButton->setDisabled(m_history); m_mainUi->passwordGenerator->reset(); - m_advancedUi->addAttachmentButton->setEnabled(!m_history); - updateAttachmentButtonsEnabled(); + + m_advancedUi->attachmentsWidget->setReadOnly(m_history); m_advancedUi->addAttributeButton->setEnabled(!m_history); m_advancedUi->editAttributeButton->setEnabled(false); m_advancedUi->removeAttributeButton->setEnabled(false); @@ -613,7 +599,7 @@ void EditEntryWidget::setForms(const Entry* entry, bool restore) m_mainUi->notesEdit->setPlainText(entry->notes()); - m_entryAttachments->copyDataFrom(entry->attachments()); + m_advancedUi->attachmentsWidget->setEntryAttachments(entry->attachments()); m_entryAttributes->copyCustomKeysFrom(entry->attributes()); if (m_attributesModel->rowCount() != 0) { @@ -749,8 +735,8 @@ void EditEntryWidget::acceptEntry() void EditEntryWidget::updateEntryData(Entry* entry) const { entry->attributes()->copyCustomKeysFrom(m_entryAttributes); - entry->attachments()->copyDataFrom(m_entryAttachments); - + entry->attachments()->copyDataFrom(m_advancedUi->attachmentsWidget->entryAttachments()); + entry->setTitle(m_mainUi->titleEdit->text()); entry->setUsername(m_mainUi->usernameEdit->text()); entry->setUrl(m_mainUi->urlEdit->text()); @@ -807,7 +793,7 @@ void EditEntryWidget::clear() m_entry = nullptr; m_database = nullptr; m_entryAttributes->clear(); - m_entryAttachments->clear(); + m_advancedUi->attachmentsWidget->clearAttachments(); m_autoTypeAssoc->clear(); m_historyModel->clear(); m_iconsWidget->reset(); @@ -950,69 +936,6 @@ void EditEntryWidget::displayAttribute(QModelIndex index, bool showProtected) m_advancedUi->protectAttributeButton->blockSignals(false); } -bool EditEntryWidget::openAttachment(const QModelIndex &index, QString *errorMessage) -{ - const QString filename = m_attachmentsModel->keyByIndex(index); - const QByteArray attachmentData = m_entryAttachments->value(filename); - - // tmp file will be removed once the database (or the application) has been closed - const QString tmpFileTemplate = QDir::temp().absoluteFilePath(QString("XXXXXX.").append(filename)); - QTemporaryFile* tmpFile = new QTemporaryFile(tmpFileTemplate, this); - - const bool saveOk = tmpFile->open() - && tmpFile->write(attachmentData) == attachmentData.size() - && tmpFile->flush(); - if (!saveOk) { - if (errorMessage) { - *errorMessage = tr("Unable to save the attachment:\n").append(tmpFile->errorString()); - } - delete tmpFile; - return false; - } - - tmpFile->close(); - QDesktopServices::openUrl(QUrl::fromLocalFile(tmpFile->fileName())); - - return true; -} - -bool EditEntryWidget::eventFilter(QObject* watched, QEvent* e) -{ - switch (e->type()) { - case QEvent::DragEnter: - case QEvent::DragMove: { - QDropEvent* dropEv = static_cast<QDropEvent*>(e); - const QMimeData* mimeData = dropEv->mimeData(); - if (mimeData->hasUrls()) { - dropEv->acceptProposedAction(); - return true; - } - break; - } - case QEvent::Drop: { - QDropEvent* dropEv = static_cast<QDropEvent*>(e); - const QMimeData* mimeData = dropEv->mimeData(); - if (mimeData->hasUrls()) { - dropEv->acceptProposedAction(); - QStringList filenames; - for (const QUrl url: mimeData->urls()) { - QFileInfo fInfo(url.toLocalFile()); - if (fInfo.isFile()) { - filenames.append(fInfo.absoluteFilePath()); - } - } - insertAttachments(filenames); - - return true; - } - } - default: - break; - } - - return EditWidget::eventFilter(watched, e); -} - void EditEntryWidget::protectCurrentAttribute(bool state) { QModelIndex index = m_advancedUi->attributesView->currentIndex(); @@ -1043,198 +966,6 @@ void EditEntryWidget::revealCurrentAttribute() } } -void EditEntryWidget::insertAttachments(const QStringList& filenames, QString* errorMessage) -{ - QStringList errors; - for (const QString &filename: filenames) { - const QFileInfo fInfo(filename); - QFile file(filename); - QByteArray data; - const bool readOk = file.open(QIODevice::ReadOnly) && Tools::readAllFromDevice(&file, data); - if (readOk) { - m_entryAttachments->set(fInfo.fileName(), data); - } else { - errors.append(QString("%1 - %2").arg(fInfo.fileName(), file.errorString())); - } - } - - if (errorMessage && !errors.isEmpty()) { - *errorMessage = tr("Unable to open files:\n%1").arg(errors.join('\n'));; - } -} - -void EditEntryWidget::insertAttachments() -{ - Q_ASSERT(!m_history); - - QString defaultDir = config()->get("LastAttachmentDir").toString(); - if (defaultDir.isEmpty() || !QDir(defaultDir).exists()) { - defaultDir = QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation).value(0); - } - - const QStringList filenames = fileDialog()->getOpenFileNames(this, tr("Select files"), defaultDir); - if (filenames.isEmpty()) { - return; - } - - config()->set("LastAttachmentDir", QFileInfo(filenames.first()).absolutePath()); - - QString error; - insertAttachments(filenames, &error); - if (!error.isEmpty()) { - showMessage(error, MessageWidget::Error); - } -} - -void EditEntryWidget::saveSelectedAttachment() -{ - const QModelIndex index = m_advancedUi->attachmentsView->currentIndex(); - if (!index.isValid()) { - return; - } - - const QString filename = m_attachmentsModel->keyByIndex(index); - QString defaultDirName = config()->get("LastAttachmentDir").toString(); - if (defaultDirName.isEmpty() || !QDir(defaultDirName).exists()) { - defaultDirName = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); - } - - const QString savePath = fileDialog()->getSaveFileName(this, tr("Save attachment"), - QDir(defaultDirName).filePath(filename)); - if (!savePath.isEmpty()) { - config()->set("LastAttachmentDir", QFileInfo(savePath).absolutePath()); - - QFile file(savePath); - const QByteArray attachmentData = m_entryAttachments->value(filename); - const bool saveOk = file.open(QIODevice::WriteOnly) && file.write(attachmentData) == attachmentData.size(); - if (!saveOk) { - showMessage(tr("Unable to save the attachment:\n").append(file.errorString()), MessageWidget::Error); - } - } -} - -void EditEntryWidget::saveSelectedAttachments() -{ - const QModelIndexList indexes = m_advancedUi->attachmentsView->selectionModel()->selectedRows(0); - if (indexes.isEmpty()) { - return; - } else if (indexes.count() == 1) { - saveSelectedAttachment(); - return; - } - - QString defaultDirName = config()->get("LastAttachmentDir").toString(); - if (defaultDirName.isEmpty() || !QDir(defaultDirName).exists()) { - defaultDirName = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); - } - - const QString savePath = fileDialog()->getExistingDirectory(this, tr("Save attachments"), defaultDirName); - if (savePath.isEmpty()) { - return; - } - - QDir saveDir(savePath); - if (!saveDir.exists()) { - if (saveDir.mkpath(saveDir.absolutePath())) { - showMessage(tr("Unable to create the directory:\n").append(saveDir.absolutePath()), MessageWidget::Error); - return; - } - } - config()->set("LastAttachmentDir", QFileInfo(saveDir.absolutePath()).absolutePath()); - - QStringList errors; - for (const QModelIndex &index: indexes) { - const QString filename = m_attachmentsModel->keyByIndex(index); - const QString attachmentPath = saveDir.absoluteFilePath(filename); - - if (QFileInfo::exists(attachmentPath)) { - const QString question(tr("Are you sure you want to overwrite existing file \"%1\" with the attachment?")); - auto ans = MessageBox::question(this, tr("Confirm overwrite"), question.arg(filename), - QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel); - if (ans == QMessageBox::No) { - continue; - } else if (ans == QMessageBox::Cancel) { - return; - } - } - - QFile file(attachmentPath); - const QByteArray attachmentData = m_entryAttachments->value(filename); - const bool saveOk = file.open(QIODevice::WriteOnly) && file.write(attachmentData) == attachmentData.size(); - if (!saveOk) { - errors.append(QString("%1 - %2").arg(filename, file.errorString())); - } - } - - if (!errors.isEmpty()) { - showMessage(tr("Unable to save the attachments:\n").append(errors.join('\n')), MessageWidget::Error); - } -} - -void EditEntryWidget::openAttachment(const QModelIndex& index) -{ - if (!index.isValid()) { - Q_ASSERT(false); - return; - } - - QString errorMessage; - if (!openAttachment(index, &errorMessage)) { - showMessage(errorMessage, MessageWidget::Error); - } -} - -void EditEntryWidget::openSelectedAttachments() -{ - const QModelIndexList indexes = m_advancedUi->attachmentsView->selectionModel()->selectedRows(0); - if (indexes.isEmpty()) { - return; - } - - QStringList errors; - for (const QModelIndex &index: indexes) { - QString errorMessage; - if (!openAttachment(index, &errorMessage)) { - const QString filename = m_attachmentsModel->keyByIndex(index); - errors.append(QString("%1 - %2").arg(filename, errorMessage)); - }; - } - - if (!errors.isEmpty()) { - showMessage(tr("Unable to open the attachments:\n").append(errors.join('\n')), MessageWidget::Error); - } -} - -void EditEntryWidget::removeSelectedAttachments() -{ - Q_ASSERT(!m_history); - - const QModelIndexList indexes = m_advancedUi->attachmentsView->selectionModel()->selectedRows(0); - if (indexes.isEmpty()) { - return; - } - - const QString question = tr("Are you sure you want to remove %n attachments?", "", indexes.count()); - QMessageBox::StandardButton ans = MessageBox::question(this, tr("Confirm Remove"), - question, QMessageBox::Yes | QMessageBox::No); - if (ans == QMessageBox::Yes) { - QStringList keys; - for (const QModelIndex &index: indexes) { - keys.append(m_attachmentsModel->keyByIndex(index)); - } - m_entryAttachments->remove(keys); - } -} - -void EditEntryWidget::updateAttachmentButtonsEnabled() -{ - const bool hasSelection = m_advancedUi->attachmentsView->selectionModel()->hasSelection(); - - m_advancedUi->saveAttachmentButton->setEnabled(hasSelection); - m_advancedUi->openAttachmentButton->setEnabled(hasSelection); - m_advancedUi->removeAttachmentButton->setEnabled(hasSelection && !m_history); -} - void EditEntryWidget::updateAutoTypeEnabled() { bool autoTypeEnabled = m_autoTypeUi->enableButton->isChecked(); diff --git a/src/gui/entry/EditEntryWidget.h b/src/gui/entry/EditEntryWidget.h index d40b5c148..b23f7b658 100644 --- a/src/gui/entry/EditEntryWidget.h +++ b/src/gui/entry/EditEntryWidget.h @@ -31,8 +31,6 @@ class Database; class EditWidgetIcons; class EditWidgetProperties; class Entry; -class EntryAttachments; -class EntryAttachmentsModel; class EntryAttributes; class EntryAttributesModel; class EntryHistoryModel; @@ -86,14 +84,6 @@ private slots: void updateCurrentAttribute(); void protectCurrentAttribute(bool state); void revealCurrentAttribute(); - void insertAttachments(const QStringList& fileNames, QString* errorMessage = nullptr); - void insertAttachments(); - void saveSelectedAttachment(); - void saveSelectedAttachments(); - void openAttachment(const QModelIndex& index); - void openSelectedAttachments(); - void removeSelectedAttachments(); - void updateAttachmentButtonsEnabled(); void updateAutoTypeEnabled(); void insertAutoTypeAssoc(); void removeAutoTypeAssoc(); @@ -141,10 +131,6 @@ private: void displayAttribute(QModelIndex index, bool showProtected); - bool openAttachment(const QModelIndex& index, QString *errorMessage); - - bool eventFilter(QObject* watched, QEvent* event) override; - Entry* m_entry; Database* m_database; @@ -167,8 +153,6 @@ private: QWidget* const m_sshAgentWidget; EditWidgetProperties* const m_editWidgetProperties; QWidget* const m_historyWidget; - EntryAttachments* const m_entryAttachments; - EntryAttachmentsModel* const m_attachmentsModel; EntryAttributes* const m_entryAttributes; EntryAttributesModel* const m_attributesModel; EntryHistoryModel* const m_historyModel; diff --git a/src/gui/entry/EditEntryWidgetAdvanced.ui b/src/gui/entry/EditEntryWidgetAdvanced.ui index 5085d164e..8c729fd7c 100644 --- a/src/gui/entry/EditEntryWidgetAdvanced.ui +++ b/src/gui/entry/EditEntryWidgetAdvanced.ui @@ -2,14 +2,6 @@ <ui version="4.0"> <class>EditEntryWidgetAdvanced</class> <widget class="QWidget" name="EditEntryWidgetAdvanced"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>400</width> - <height>366</height> - </rect> - </property> <layout class="QVBoxLayout" name="verticalLayout"> <property name="leftMargin"> <number>0</number> @@ -153,61 +145,14 @@ </property> <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> - <widget class="QTableView" name="attachmentsView"/> - </item> - <item> - <layout class="QVBoxLayout" name="attachmentsButtonLayout"> - <item> - <widget class="QPushButton" name="addAttachmentButton"> - <property name="text"> - <string>Add</string> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="removeAttachmentButton"> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="text"> - <string>Remove</string> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="openAttachmentButton"> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="text"> - <string>Open</string> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="saveAttachmentButton"> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="text"> - <string>Save</string> - </property> - </widget> - </item> - <item> - <spacer name="verticalSpacer_2"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </item> - </layout> + <widget class="EntryAttachmentsWidget" name="attachmentsWidget" native="true"> + <property name="minimumSize"> + <size> + <width>100</width> + <height>100</height> + </size> + </property> + </widget> </item> </layout> </widget> @@ -215,6 +160,12 @@ </layout> </widget> <customwidgets> + <customwidget> + <class>EntryAttachmentsWidget</class> + <extends>QWidget</extends> + <header>gui/entry/EntryAttachmentsWidget.h</header> + <container>1</container> + </customwidget> <customwidget> <class>AttributesListView</class> <extends>QListView</extends> @@ -227,10 +178,6 @@ <tabstop>addAttributeButton</tabstop> <tabstop>removeAttributeButton</tabstop> <tabstop>editAttributeButton</tabstop> - <tabstop>addAttachmentButton</tabstop> - <tabstop>removeAttachmentButton</tabstop> - <tabstop>openAttachmentButton</tabstop> - <tabstop>saveAttachmentButton</tabstop> </tabstops> <resources/> <connections/> diff --git a/src/gui/entry/EntryAttachmentsWidget.cpp b/src/gui/entry/EntryAttachmentsWidget.cpp new file mode 100644 index 000000000..93b73a166 --- /dev/null +++ b/src/gui/entry/EntryAttachmentsWidget.cpp @@ -0,0 +1,353 @@ +#include "EntryAttachmentsWidget.h" +#include "ui_EntryAttachmentsWidget.h" + +#include <QDesktopServices> +#include <QDir> +#include <QDropEvent> +#include <QFile> +#include <QFileInfo> +#include <QMimeData> +#include <QTemporaryFile> + +#include "EntryAttachmentsModel.h" +#include "core/Config.h" +#include "core/EntryAttachments.h" +#include "core/Tools.h" +#include "gui/FileDialog.h" +#include "gui/MessageBox.h" + + +EntryAttachmentsWidget::EntryAttachmentsWidget(QWidget* parent) : + QWidget(parent) + , m_ui(new Ui::EntryAttachmentsWidget) + , m_entryAttachments(new EntryAttachments(this)) + , m_attachmentsModel(new EntryAttachmentsModel(this)) + , m_readOnly(false) + , m_buttonsVisible(true) +{ + m_ui->setupUi(this); + + m_ui->attachmentsView->setAcceptDrops(false); + m_ui->attachmentsView->viewport()->setAcceptDrops(true); + m_ui->attachmentsView->viewport()->installEventFilter(this); + + m_attachmentsModel->setEntryAttachments(m_entryAttachments); + m_ui->attachmentsView->setModel(m_attachmentsModel); + m_ui->attachmentsView->verticalHeader()->hide(); + m_ui->attachmentsView->horizontalHeader()->setStretchLastSection(true); + m_ui->attachmentsView->horizontalHeader()->resizeSection(EntryAttachmentsModel::NameColumn, 400); + m_ui->attachmentsView->setSelectionBehavior(QAbstractItemView::SelectRows); + m_ui->attachmentsView->setSelectionMode(QAbstractItemView::ExtendedSelection); + + m_ui->actionsWidget->setVisible(m_buttonsVisible); + connect(this, SIGNAL(buttonsVisibleChanged(bool)), m_ui->actionsWidget, SLOT(setVisible(bool))); + + connect(this, SIGNAL(readOnlyChanged(bool)), SLOT(updateButtonsEnabled())); + connect(m_attachmentsModel, SIGNAL(modelReset()), SLOT(updateButtonsEnabled())); + connect(m_ui->attachmentsView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), + SLOT(updateButtonsEnabled())); + + connect(m_ui->attachmentsView, SIGNAL(doubleClicked(QModelIndex)), SLOT(openAttachment(QModelIndex))); + connect(m_ui->saveAttachmentButton, SIGNAL(clicked()), SLOT(saveSelectedAttachments())); + connect(m_ui->openAttachmentButton, SIGNAL(clicked()), SLOT(openSelectedAttachments())); + connect(m_ui->addAttachmentButton, SIGNAL(clicked()), SLOT(insertAttachments())); + connect(m_ui->removeAttachmentButton, SIGNAL(clicked()), SLOT(removeSelectedAttachments())); + + updateButtonsEnabled(); +} + +EntryAttachmentsWidget::~EntryAttachmentsWidget() +{ +} + +const EntryAttachments* EntryAttachmentsWidget::entryAttachments() const +{ + return m_entryAttachments; +} + +bool EntryAttachmentsWidget::isReadOnly() const +{ + return m_readOnly; +} + +bool EntryAttachmentsWidget::isButtonsVisible() const +{ + return m_buttonsVisible; +} + +void EntryAttachmentsWidget::setEntryAttachments(const EntryAttachments* attachments) +{ + Q_ASSERT(attachments != nullptr); + m_entryAttachments->copyDataFrom(attachments); +} + +void EntryAttachmentsWidget::clearAttachments() +{ + m_entryAttachments->clear(); +} + +void EntryAttachmentsWidget::setReadOnly(bool readOnly) +{ + if (m_readOnly == readOnly) { + return; + } + + m_readOnly = readOnly; + emit readOnlyChanged(m_readOnly); +} + +void EntryAttachmentsWidget::setButtonsVisible(bool buttonsVisible) +{ + if (m_buttonsVisible == buttonsVisible) { + return; + } + + m_buttonsVisible = buttonsVisible; + emit buttonsVisibleChanged(m_buttonsVisible); +} + +void EntryAttachmentsWidget::insertAttachments() +{ + Q_ASSERT(!isReadOnly()); + if (isReadOnly()) { + return; + } + + QString defaultDirPath = config()->get("LastAttachmentDir").toString(); + const bool dirExists = !defaultDirPath.isEmpty() && QDir(defaultDirPath).exists(); + if (!dirExists) { + defaultDirPath = QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation).first(); + } + + const QStringList filenames = fileDialog()->getOpenFileNames(this, tr("Select files"), defaultDirPath); + if (filenames.isEmpty()) { + return; + } + + config()->set("LastAttachmentDir", QFileInfo(filenames.first()).absolutePath()); + + QString errorMessage; + if (!insertAttachments(filenames, errorMessage)) { + errorOccurred(errorMessage); + } +} + +void EntryAttachmentsWidget::removeSelectedAttachments() +{ + Q_ASSERT(!isReadOnly()); + if (isReadOnly()) { + return; + } + + const QModelIndexList indexes = m_ui->attachmentsView->selectionModel()->selectedRows(0); + if (indexes.isEmpty()) { + return; + } + + const QString question = tr("Are you sure you want to remove %n attachment(s)?", "", indexes.count()); + QMessageBox::StandardButton answer = MessageBox::question(this, tr("Confirm Remove"), + question, QMessageBox::Yes | QMessageBox::No); + if (answer == QMessageBox::Yes) { + QStringList keys; + for (const QModelIndex& index: indexes) { + keys.append(m_attachmentsModel->keyByIndex(index)); + } + m_entryAttachments->remove(keys); + } +} + +void EntryAttachmentsWidget::saveSelectedAttachments() +{ + const QModelIndexList indexes = m_ui->attachmentsView->selectionModel()->selectedRows(0); + if (indexes.isEmpty()) { + return; + } + + QString defaultDirPath = config()->get("LastAttachmentDir").toString(); + const bool dirExists = !defaultDirPath.isEmpty() && QDir(defaultDirPath).exists(); + if (!dirExists) { + defaultDirPath = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); + } + + const QString saveDirPath = fileDialog()->getExistingDirectory(this, tr("Save attachments"), defaultDirPath); + if (saveDirPath.isEmpty()) { + return; + } + + QDir saveDir(saveDirPath); + if (!saveDir.exists()) { + if (saveDir.mkpath(saveDir.absolutePath())) { + errorOccurred(tr("Unable to create directory:\n%1").arg(saveDir.absolutePath())); + return; + } + } + config()->set("LastAttachmentDir", QFileInfo(saveDir.absolutePath()).absolutePath()); + + QStringList errors; + for (const QModelIndex& index: indexes) { + const QString filename = m_attachmentsModel->keyByIndex(index); + const QString attachmentPath = saveDir.absoluteFilePath(filename); + + if (QFileInfo::exists(attachmentPath)) { + const QString question(tr("Are you sure you want to overwrite the existing file \"%1\" with the attachment?")); + auto answer = MessageBox::question(this, tr("Confirm overwrite"), question.arg(filename), + QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel); + if (answer == QMessageBox::No) { + continue; + } else if (answer == QMessageBox::Cancel) { + return; + } + } + + QFile file(attachmentPath); + const QByteArray attachmentData = m_entryAttachments->value(filename); + const bool saveOk = file.open(QIODevice::WriteOnly) && file.write(attachmentData) == attachmentData.size(); + if (!saveOk) { + errors.append(QString("%1 - %2").arg(filename, file.errorString())); + } + } + + if (!errors.isEmpty()) { + errorOccurred(tr("Unable to save attachments:\n%1").arg(errors.join('\n'))); + } +} + +void EntryAttachmentsWidget::openAttachment(const QModelIndex& index) +{ + Q_ASSERT(index.isValid()); + if (!index.isValid()) { + return; + } + + QString errorMessage; + if (!openAttachment(index, errorMessage)) { + errorOccurred(tr("Unable to open attachment:\n%1").arg(errorMessage)); + } +} + +void EntryAttachmentsWidget::openSelectedAttachments() +{ + const QModelIndexList indexes = m_ui->attachmentsView->selectionModel()->selectedRows(0); + if (indexes.isEmpty()) { + return; + } + + QStringList errors; + for (const QModelIndex& index: indexes) { + QString errorMessage; + if (!openAttachment(index, errorMessage)) { + const QString filename = m_attachmentsModel->keyByIndex(index); + errors.append(QString("%1 - %2").arg(filename, errorMessage)); + }; + } + + if (!errors.isEmpty()) { + errorOccurred(tr("Unable to open attachments:\n%1").arg(errors.join('\n'))); + } +} + +void EntryAttachmentsWidget::updateButtonsEnabled() +{ + const bool hasSelection = m_ui->attachmentsView->selectionModel()->hasSelection(); + + m_ui->addAttachmentButton->setEnabled(!m_readOnly); + m_ui->removeAttachmentButton->setEnabled(hasSelection && !m_readOnly); + + m_ui->saveAttachmentButton->setEnabled(hasSelection); + m_ui->openAttachmentButton->setEnabled(hasSelection); +} + +bool EntryAttachmentsWidget::insertAttachments(const QStringList& filenames, QString& errorMessage) +{ + Q_ASSERT(!isReadOnly()); + if (isReadOnly()) { + return false; + } + + QStringList errors; + for (const QString &filename: filenames) { + QByteArray data; + QFile file(filename); + const QFileInfo fInfo(filename); + const bool readOk = file.open(QIODevice::ReadOnly) && Tools::readAllFromDevice(&file, data); + if (readOk) { + m_entryAttachments->set(fInfo.fileName(), data); + } else { + errors.append(QString("%1 - %2").arg(fInfo.fileName(), file.errorString())); + } + } + + if (!errors.isEmpty()) { + errorMessage = tr("Unable to open files:\n%1").arg(errors.join('\n')); + } + + return errors.isEmpty(); +} + +bool EntryAttachmentsWidget::openAttachment(const QModelIndex& index, QString& errorMessage) +{ + const QString filename = m_attachmentsModel->keyByIndex(index); + const QByteArray attachmentData = m_entryAttachments->value(filename); + + // tmp file will be removed once the database (or the application) has been closed + const QString tmpFileTemplate = QDir::temp().absoluteFilePath(QString("XXXXXX.").append(filename)); + + QScopedPointer<QTemporaryFile> tmpFile(new QTemporaryFile(tmpFileTemplate, this)); + + const bool saveOk = tmpFile->open() + && tmpFile->write(attachmentData) == attachmentData.size() + && tmpFile->flush(); + if (!saveOk) { + errorMessage = QString("%1 - %2").arg(filename, tmpFile->errorString()); + return false; + } + + tmpFile->close(); + const bool openOk = QDesktopServices::openUrl(QUrl::fromLocalFile(tmpFile->fileName())); + if (!openOk) { + errorMessage = QString("Can't open file \"%1\"").arg(filename); + return false; + } + + // take ownership of the tmpFile pointer + tmpFile.take(); + return true; +} + +bool EntryAttachmentsWidget::eventFilter(QObject* watched, QEvent* e) +{ + if (watched == m_ui->attachmentsView->viewport() && !isReadOnly()) { + const QEvent::Type eventType = e->type(); + if (eventType == QEvent::DragEnter || eventType == QEvent::DragMove) { + QDropEvent* dropEv = static_cast<QDropEvent*>(e); + const QMimeData* mimeData = dropEv->mimeData(); + if (mimeData->hasUrls()) { + dropEv->acceptProposedAction(); + return true; + } + } else if (eventType == QEvent::Drop) { + QDropEvent* dropEv = static_cast<QDropEvent*>(e); + const QMimeData* mimeData = dropEv->mimeData(); + if (mimeData->hasUrls()) { + dropEv->acceptProposedAction(); + QStringList filenames; + const QList<QUrl> urls = mimeData->urls(); + for (const QUrl& url: urls) { + const QFileInfo fInfo(url.toLocalFile()); + if (fInfo.isFile()) { + filenames.append(fInfo.absoluteFilePath()); + } + } + + QString errorMessage; + if (!insertAttachments(filenames, errorMessage)) { + errorOccurred(errorMessage); + } + + return true; + } + } + } + + return QWidget::eventFilter(watched, e); +} diff --git a/src/gui/entry/EntryAttachmentsWidget.h b/src/gui/entry/EntryAttachmentsWidget.h new file mode 100644 index 000000000..41a54d477 --- /dev/null +++ b/src/gui/entry/EntryAttachmentsWidget.h @@ -0,0 +1,59 @@ +#ifndef ENTRYATTACHMENTSWIDGET_H +#define ENTRYATTACHMENTSWIDGET_H + +#include <QPointer> +#include <QWidget> + +namespace Ui { +class EntryAttachmentsWidget; +} + +class EntryAttachments; +class EntryAttachmentsModel; + +class EntryAttachmentsWidget : public QWidget +{ + Q_OBJECT + Q_PROPERTY(bool readOnly READ isReadOnly WRITE setReadOnly NOTIFY readOnlyChanged) + Q_PROPERTY(bool isButtonsVisible READ isButtonsVisible WRITE setButtonsVisible NOTIFY buttonsVisibleChanged) +public: + explicit EntryAttachmentsWidget(QWidget* parent = nullptr); + ~EntryAttachmentsWidget(); + + const EntryAttachments* entryAttachments() const; + bool isReadOnly() const; + bool isButtonsVisible() const; + +public slots: + void setEntryAttachments(const EntryAttachments* attachments); + void clearAttachments(); + void setReadOnly(bool readOnly); + void setButtonsVisible(bool isButtonsVisible); + +signals: + void errorOccurred(const QString& error); + void readOnlyChanged(bool readOnly); + void buttonsVisibleChanged(bool isButtonsVisible); + +private slots: + void insertAttachments(); + void removeSelectedAttachments(); + void saveSelectedAttachments(); + void openAttachment(const QModelIndex& index); + void openSelectedAttachments(); + void updateButtonsEnabled(); + +private: + bool insertAttachments(const QStringList& fileNames, QString& errorMessage); + bool openAttachment(const QModelIndex& index, QString& errorMessage); + + bool eventFilter(QObject* watched, QEvent* event) override; + + QScopedPointer<Ui::EntryAttachmentsWidget> m_ui; + QPointer<EntryAttachments> m_entryAttachments; + QPointer<EntryAttachmentsModel> m_attachmentsModel; + bool m_readOnly; + bool m_buttonsVisible; +}; + +#endif // ENTRYATTACHMENTSWIDGET_H diff --git a/src/gui/entry/EntryAttachmentsWidget.ui b/src/gui/entry/EntryAttachmentsWidget.ui new file mode 100644 index 000000000..60292309f --- /dev/null +++ b/src/gui/entry/EntryAttachmentsWidget.ui @@ -0,0 +1,99 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>EntryAttachmentsWidget</class> + <widget class="QWidget" name="EntryAttachmentsWidget"> + <property name="windowTitle"> + <string>Form</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <widget class="QTableView" name="attachmentsView"/> + </item> + <item> + <widget class="QWidget" name="actionsWidget" native="true"> + <layout class="QVBoxLayout" name="verticalLayout"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <widget class="QPushButton" name="addAttachmentButton"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Add</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="removeAttachmentButton"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Remove</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="openAttachmentButton"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Open</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="saveAttachmentButton"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Save</string> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer_2"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>173</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> From 80636ab083b7e9c1f1dc785632de9ed7479918f1 Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Tue, 19 Dec 2017 23:08:41 +0200 Subject: [PATCH 165/402] Use EntryAttachmentsWidget in details view --- src/gui/DetailsWidget.cpp | 54 +++++++++------------------------------ src/gui/DetailsWidget.h | 10 +++----- src/gui/DetailsWidget.ui | 18 ++++++------- 3 files changed, 24 insertions(+), 58 deletions(-) diff --git a/src/gui/DetailsWidget.cpp b/src/gui/DetailsWidget.cpp index 8c4de5fc9..1d20984be 100644 --- a/src/gui/DetailsWidget.cpp +++ b/src/gui/DetailsWidget.cpp @@ -39,12 +39,11 @@ DetailsWidget::DetailsWidget(QWidget* parent) , m_currentEntry(nullptr) , m_currentGroup(nullptr) , m_timer(nullptr) - , m_attributesWidget(nullptr) - , m_attachmentsWidget(nullptr) - , m_autotypeWidget(nullptr) + , m_attributesTabWidget(nullptr) + , m_attachmentsTabWidget(nullptr) + , m_autotypeTabWidget(nullptr) , m_selectedTabEntry(0) , m_selectedTabGroup(0) - , m_attachmentsModel(new EntryAttachmentsModel(this)) { m_ui->setupUi(this); @@ -59,16 +58,12 @@ DetailsWidget::DetailsWidget(QWidget* parent) connect(m_ui->closeButton, SIGNAL(toggled(bool)), SLOT(hideDetails())); connect(m_ui->tabWidget, SIGNAL(tabBarClicked(int)), SLOT(updateTabIndex(int))); - m_ui->attachmentsTableView->setModel(m_attachmentsModel); - m_ui->attachmentsTableView->horizontalHeader()->setStretchLastSection(true); - m_ui->attachmentsTableView->horizontalHeader()->resizeSection(0, 600); - m_ui->attachmentsTableView->setSelectionBehavior(QAbstractItemView::SelectRows); - m_ui->attachmentsTableView->setSelectionMode(QAbstractItemView::SingleSelection); - connect(m_ui->attachmentsTableView, SIGNAL(activated(QModelIndex)), SLOT(openAttachment(QModelIndex))); + m_ui->attachmentsWidget->setReadOnly(true); + m_ui->attachmentsWidget->setButtonsVisible(false); - m_attributesWidget = m_ui->tabWidget->widget(AttributesTab); - m_attachmentsWidget = m_ui->tabWidget->widget(AttachmentsTab); - m_autotypeWidget = m_ui->tabWidget->widget(AutotypeTab); + m_attributesTabWidget = m_ui->tabWidget->widget(AttributesTab); + m_attachmentsTabWidget = m_ui->tabWidget->widget(AttachmentsTab); + m_autotypeTabWidget = m_ui->tabWidget->widget(AutotypeTab); this->hide(); } @@ -93,9 +88,9 @@ void DetailsWidget::getSelectedEntry(Entry* selectedEntry) m_ui->stackedWidget->setCurrentIndex(EntryPreview); if (m_ui->tabWidget->count() < 5) { - m_ui->tabWidget->insertTab(static_cast<int>(AttributesTab), m_attributesWidget, "Attributes"); - m_ui->tabWidget->insertTab(static_cast<int>(AttachmentsTab), m_attachmentsWidget, "Attachments"); - m_ui->tabWidget->insertTab(static_cast<int>(AutotypeTab), m_autotypeWidget, "Autotype"); + m_ui->tabWidget->insertTab(static_cast<int>(AttributesTab), m_attributesTabWidget, tr("Attributes")); + m_ui->tabWidget->insertTab(static_cast<int>(AttachmentsTab), m_attachmentsTabWidget, tr("Attachments")); + m_ui->tabWidget->insertTab(static_cast<int>(AutotypeTab), m_autotypeTabWidget, tr("Autotype")); } m_ui->tabWidget->setTabEnabled(AttributesTab, false); @@ -193,7 +188,7 @@ void DetailsWidget::getSelectedEntry(Entry* selectedEntry) const bool hasAttachments = !m_currentEntry->attachments()->isEmpty(); m_ui->tabWidget->setTabEnabled(AttachmentsTab, hasAttachments); - m_attachmentsModel->setEntryAttachments(hasAttachments ? m_currentEntry->attachments() : nullptr); + m_ui->attachmentsWidget->setEntryAttachments(m_currentEntry->attachments()); m_ui->autotypeTree->clear(); AutoTypeAssociations* autotypeAssociations = m_currentEntry->autoTypeAssociations(); @@ -359,28 +354,3 @@ void DetailsWidget::updateTabIndex(int index) m_selectedTabEntry = index; } } - -void DetailsWidget::openAttachment(const QModelIndex& index) -{ - Q_ASSERT(m_currentEntry != nullptr); - const QString filename = m_attachmentsModel->keyByIndex(index); - const QByteArray attachmentData = m_currentEntry->attachments()->value(filename); - - // tmp file will be removed once the database (or the application) has been closed - const QString tmpFileTemplate = QDir::temp().absoluteFilePath(QString("XXXXXX.").append(filename)); - QTemporaryFile* tmpFile = new QTemporaryFile(tmpFileTemplate, this); - - const bool saveOk = tmpFile->open() - && tmpFile->write(attachmentData) == attachmentData.size() - && tmpFile->flush(); - - if (!saveOk) { - delete tmpFile; - emit errorOccurred(tr("Unable to open the attachment:\n").append(tmpFile->errorString())); - return; - } - - tmpFile->close(); - QDesktopServices::openUrl(QUrl::fromLocalFile(tmpFile->fileName())); -} - diff --git a/src/gui/DetailsWidget.h b/src/gui/DetailsWidget.h index 610976515..832839bbb 100644 --- a/src/gui/DetailsWidget.h +++ b/src/gui/DetailsWidget.h @@ -25,8 +25,6 @@ namespace Ui { class DetailsWidget; } -class EntryAttachmentsModel; - class DetailsWidget : public QWidget { Q_OBJECT @@ -62,7 +60,6 @@ private slots: void hideDetails(); void setDatabaseMode(DatabaseWidget::Mode mode); void updateTabIndex(int index); - void openAttachment(const QModelIndex& index); private: const QScopedPointer<Ui::DetailsWidget> m_ui; @@ -71,12 +68,11 @@ private: Group* m_currentGroup; quint8 m_step; QTimer* m_timer; - QWidget* m_attributesWidget; - QWidget* m_attachmentsWidget; - QWidget* m_autotypeWidget; + QWidget* m_attributesTabWidget; + QWidget* m_attachmentsTabWidget; + QWidget* m_autotypeTabWidget; quint8 m_selectedTabEntry; quint8 m_selectedTabGroup; - EntryAttachmentsModel* const m_attachmentsModel; QString shortUrl(QString url); QString shortPassword(QString password); }; diff --git a/src/gui/DetailsWidget.ui b/src/gui/DetailsWidget.ui index d7cb29cdb..9c705569d 100644 --- a/src/gui/DetailsWidget.ui +++ b/src/gui/DetailsWidget.ui @@ -2,14 +2,6 @@ <ui version="4.0"> <class>DetailsWidget</class> <widget class="QWidget" name="DetailsWidget"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>600</width> - <height>200</height> - </rect> - </property> <layout class="QVBoxLayout" name="verticalLayout_3"> <item> <layout class="QHBoxLayout" name="horizontalLayout" stretch="0,0,0,0,0,0,0"> @@ -460,7 +452,7 @@ </attribute> <layout class="QVBoxLayout" name="verticalLayout_6"> <item> - <widget class="QTableView" name="attachmentsTableView"/> + <widget class="EntryAttachmentsWidget" name="attachmentsWidget" native="true"/> </item> </layout> </widget> @@ -543,6 +535,14 @@ </property> </action> </widget> + <customwidgets> + <customwidget> + <class>EntryAttachmentsWidget</class> + <extends>QWidget</extends> + <header>gui/entry/EntryAttachmentsWidget.h</header> + <container>1</container> + </customwidget> + </customwidgets> <resources/> <connections/> </ui> From d217da421f9b60e81c37572d7f7f07f52a324a65 Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Mon, 25 Dec 2017 11:10:30 -0500 Subject: [PATCH 166/402] Correct test failures in mingw --- tests/TestCsvParser.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/TestCsvParser.cpp b/tests/TestCsvParser.cpp index a292b56bb..705ef48c3 100644 --- a/tests/TestCsvParser.cpp +++ b/tests/TestCsvParser.cpp @@ -320,6 +320,7 @@ void TestCsvParser::testUnicode() { //ERROR QChar g("\u20AC"); parser->setFieldSeparator(QChar('A')); QTextStream out(file.data()); + out.setCodec("UTF-8"); out << QString("€1A2śA\"3śAż\"Ażac"); QVERIFY(parser->parse(file.data())); From cc1ab94a4f1eb8b0187b372fd062d840c7f029fa Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Mon, 25 Dec 2017 11:07:02 -0500 Subject: [PATCH 167/402] Correct regression to ssh-agent from entry attachment refactor --- src/gui/entry/EditEntryWidget.cpp | 13 +++++++------ src/gui/entry/EntryAttachmentsWidget.cpp | 17 +++++++++++++++++ src/gui/entry/EntryAttachmentsWidget.h | 5 +++++ 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index b922f4171..3e26e3092 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -285,7 +285,7 @@ void EditEntryWidget::setupSSHAgent() void EditEntryWidget::updateSSHAgent() { KeeAgentSettings settings; - settings.fromXml(m_entryAttachments->value("KeeAgent.settings")); + settings.fromXml(m_advancedUi->attachmentsWidget->getAttachment("KeeAgent.settings")); m_sshAgentUi->addKeyToAgentCheckBox->setChecked(settings.addAtDatabaseOpen()); m_sshAgentUi->removeKeyFromAgentCheckBox->setChecked(settings.removeAtDatabaseClose()); @@ -299,7 +299,8 @@ void EditEntryWidget::updateSSHAgent() m_sshAgentUi->attachmentComboBox->addItem(""); - for (QString fileName : m_entryAttachments->keys()) { + auto attachments = m_advancedUi->attachmentsWidget->entryAttachments(); + for (const QString& fileName : attachments->keys()) { if (fileName == "KeeAgent.settings") { continue; } @@ -382,10 +383,10 @@ void EditEntryWidget::saveSSHAgentConfig() // we don't use this either but we don't want it to dirty flag the config settings.setSaveAttachmentToTempFile(m_sshAgentSettings.saveAttachmentToTempFile()); - if (settings.isDefault() && m_entryAttachments->hasKey("KeeAgent.settings")) { - m_entryAttachments->remove("KeeAgent.settings"); + if (settings.isDefault()) { + m_advancedUi->attachmentsWidget->removeAttachment("KeeAgent.settings"); } else if (settings != m_sshAgentSettings) { - m_entryAttachments->set("KeeAgent.settings", settings.toXml()); + m_advancedUi->attachmentsWidget->setAttachment("KeeAgent.settings", settings.toXml()); } m_sshAgentSettings = settings; @@ -404,7 +405,7 @@ bool EditEntryWidget::getOpenSSHKey(OpenSSHKey& key) QByteArray privateKeyData; if (m_sshAgentUi->attachmentRadioButton->isChecked()) { - privateKeyData = m_entryAttachments->value(m_sshAgentUi->attachmentComboBox->currentText()); + privateKeyData = m_advancedUi->attachmentsWidget->getAttachment(m_sshAgentUi->attachmentComboBox->currentText()); } else { QFile localFile(m_sshAgentUi->externalFileEdit->text()); diff --git a/src/gui/entry/EntryAttachmentsWidget.cpp b/src/gui/entry/EntryAttachmentsWidget.cpp index 93b73a166..df56e7777 100644 --- a/src/gui/entry/EntryAttachmentsWidget.cpp +++ b/src/gui/entry/EntryAttachmentsWidget.cpp @@ -106,6 +106,23 @@ void EntryAttachmentsWidget::setButtonsVisible(bool buttonsVisible) emit buttonsVisibleChanged(m_buttonsVisible); } +QByteArray EntryAttachmentsWidget::getAttachment(const QString &name) +{ + return m_entryAttachments->value(name); +} + +void EntryAttachmentsWidget::setAttachment(const QString &name, const QByteArray &value) +{ + m_entryAttachments->set(name, value); +} + +void EntryAttachmentsWidget::removeAttachment(const QString &name) +{ + if (!isReadOnly() && m_entryAttachments->hasKey(name)) { + m_entryAttachments->remove(name); + } +} + void EntryAttachmentsWidget::insertAttachments() { Q_ASSERT(!isReadOnly()); diff --git a/src/gui/entry/EntryAttachmentsWidget.h b/src/gui/entry/EntryAttachmentsWidget.h index 41a54d477..5fd19415e 100644 --- a/src/gui/entry/EntryAttachmentsWidget.h +++ b/src/gui/entry/EntryAttachmentsWidget.h @@ -8,6 +8,7 @@ namespace Ui { class EntryAttachmentsWidget; } +class QByteArray; class EntryAttachments; class EntryAttachmentsModel; @@ -24,6 +25,10 @@ public: bool isReadOnly() const; bool isButtonsVisible() const; + QByteArray getAttachment(const QString& name); + void setAttachment(const QString& name, const QByteArray& value); + void removeAttachment(const QString& name); + public slots: void setEntryAttachments(const EntryAttachments* attachments); void clearAttachments(); From 910c630f8e6bee595362b0606a25e99b29259d99 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Mon, 25 Dec 2017 20:57:25 +0100 Subject: [PATCH 168/402] Add CI Dockerfile --- ci/trusty/Dockerfile | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 ci/trusty/Dockerfile diff --git a/ci/trusty/Dockerfile b/ci/trusty/Dockerfile new file mode 100644 index 000000000..9bd3424f0 --- /dev/null +++ b/ci/trusty/Dockerfile @@ -0,0 +1,38 @@ +# KeePassXC Linux Release Build Dockerfile +# Copyright (C) 2017 KeePassXC team <https://keepassxc.org/> +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 or (at your option) +# version 3 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# TIP: check this Dockerfile using this online tool: https://www.fromlatest.io + +FROM ubuntu:trusty + +RUN set -x \ + && apt-get -y update \ + && apt-get -y --no-install-recommends install \ + git build-essential clang-3.6 libclang-common-3.6-dev clang-format-3.6 cmake3 make \ + curl ca-certificates gnupg2 \ + libgcrypt20-dev zlib1g-dev libyubikey-dev libykpers-1-dev \ + qttools5-dev \ + qttools5-dev-tools \ + qtbase5-dev \ + libqt5x11extras5-dev \ + libxi-dev \ + libxtst-dev \ + xvfb \ + && apt-get autoremove --purge \ + && rm -rf /var/lib/apt/lists/* + +VOLUME ["/keepassxc"] +WORKDIR /keepassxc From f8b7ffcf8c928166b2555ecd30fe2059ab906830 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Tue, 26 Dec 2017 11:31:17 +0100 Subject: [PATCH 169/402] Add WITH_XC_SSHAGENT flag to build config and use cmake3 package --- .travis.yml | 4 ++-- src/gui/entry/EntryAttachmentsWidget.cpp | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 942bb426d..7183e19f5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,7 +23,7 @@ git: before_install: - if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo apt-get -qq update; fi - - if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo apt-get -qq install cmake libclang-common-3.5-dev libxi-dev qtbase5-dev libqt5x11extras5-dev qttools5-dev qttools5-dev-tools libgcrypt20-dev zlib1g-dev libxtst-dev xvfb libyubikey-dev libykpers-1-dev; fi + - if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo apt-get -qq install cmake3 libclang-common-3.5-dev libxi-dev qtbase5-dev libqt5x11extras5-dev qttools5-dev qttools5-dev-tools libgcrypt20-dev zlib1g-dev libxtst-dev xvfb libyubikey-dev libykpers-1-dev; fi - if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew update; fi - if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew ls | grep -wq cmake || brew install cmake; fi - if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew ls | grep -wq qt5 || brew install qt5; fi @@ -34,7 +34,7 @@ before_script: - mkdir build && pushd build script: - - cmake -DCMAKE_BUILD_TYPE=${CONFIG} -DWITH_GUI_TESTS=ON -DWITH_ASAN=ON -DWITH_XC_HTTP=ON -DWITH_XC_AUTOTYPE=ON -DWITH_XC_YUBIKEY=ON $CMAKE_ARGS .. + - cmake -DCMAKE_BUILD_TYPE=${CONFIG} -DWITH_GUI_TESTS=ON -DWITH_ASAN=ON -DWITH_XC_HTTP=ON -DWITH_XC_AUTOTYPE=ON -DWITH_XC_YUBIKEY=ON -DWITH_XC_SSHAGENT=ON $CMAKE_ARGS .. - make -j2 - if [ "$TRAVIS_OS_NAME" = "linux" ]; then make test ARGS+="-E testgui --output-on-failure"; fi - if [ "$TRAVIS_OS_NAME" = "linux" ]; then ASAN_OPTIONS=${ASAN_OPTIONS}:leak_check_at_exit=0 xvfb-run -a --server-args="-screen 0 800x600x24" make test ARGS+="-R testgui --output-on-failure"; fi diff --git a/src/gui/entry/EntryAttachmentsWidget.cpp b/src/gui/entry/EntryAttachmentsWidget.cpp index df56e7777..16908361a 100644 --- a/src/gui/entry/EntryAttachmentsWidget.cpp +++ b/src/gui/entry/EntryAttachmentsWidget.cpp @@ -106,17 +106,17 @@ void EntryAttachmentsWidget::setButtonsVisible(bool buttonsVisible) emit buttonsVisibleChanged(m_buttonsVisible); } -QByteArray EntryAttachmentsWidget::getAttachment(const QString &name) +QByteArray EntryAttachmentsWidget::getAttachment(const QString& name) { return m_entryAttachments->value(name); } -void EntryAttachmentsWidget::setAttachment(const QString &name, const QByteArray &value) +void EntryAttachmentsWidget::setAttachment(const QString& name, const QByteArray& value) { m_entryAttachments->set(name, value); } -void EntryAttachmentsWidget::removeAttachment(const QString &name) +void EntryAttachmentsWidget::removeAttachment(const QString& name) { if (!isReadOnly() && m_entryAttachments->hasKey(name)) { m_entryAttachments->remove(name); From d2555db9527465558dec77659e03d29fd426d934 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Tue, 26 Dec 2017 13:46:33 +0100 Subject: [PATCH 170/402] Replace Travis build icon with TeamCity build icon --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 16f382b03..36a1d61f4 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # <img src="https://keepassxc.org/logo.png" width="40" height="40"/> KeePassXC -[![Travis Build Status](https://travis-ci.org/keepassxreboot/keepassxc.svg?branch=develop)](https://travis-ci.org/keepassxreboot/keepassxc) [![Coverage Status](https://coveralls.io/repos/github/keepassxreboot/keepassxc/badge.svg)](https://coveralls.io/github/keepassxreboot/keepassxc) +[![TeamCity Build Status](https://ci.keepassxc.org/app/rest/builds/buildType:\(id:KeepassXC_TeamCityCi\)/statusIcon?guest=1)](https://ci.keepassxc.org/viewType.html?buildTypeId=KeepassXC_TeamCityCi&guest=1) [![Coverage Status](https://coveralls.io/repos/github/keepassxreboot/keepassxc/badge.svg)](https://coveralls.io/github/keepassxreboot/keepassxc) ## About KeePassXC [KeePassXC](https://keepassxc.org) is a cross-platform community fork of From 901bf622132f09704cc153636db9976453e52544 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Tue, 26 Dec 2017 21:55:08 +0100 Subject: [PATCH 171/402] Generate random 128-byte stream instead of legacy XML format when creating key files Add API documentation for FileKey class Resolves #1325 --- src/keys/FileKey.cpp | 167 ++++++++++++++++++++++++++++++------------- src/keys/FileKey.h | 12 ++-- 2 files changed, 123 insertions(+), 56 deletions(-) diff --git a/src/keys/FileKey.cpp b/src/keys/FileKey.cpp index d3cdfe040..7f2f8a6ea 100644 --- a/src/keys/FileKey.cpp +++ b/src/keys/FileKey.cpp @@ -1,4 +1,5 @@ /* +* Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * Copyright (C) 2011 Felix Geyer <debfx@fobos.de> * * This program is free software: you can redistribute it and/or modify @@ -18,16 +19,30 @@ #include "FileKey.h" #include <QFile> -#include <QXmlStreamReader> #include "core/Tools.h" #include "crypto/CryptoHash.h" #include "crypto/Random.h" -FileKey::FileKey() -{ -} - +/** + * Read key file from device while trying to detect its file format. + * + * If no legacy key file format was detected, the SHA-256 hash of the + * key file will be used, allowing usage of arbitrary files as key files. + * In case of a detected legacy key file format, the raw byte contents + * will be extracted from the file. + * + * Supported legacy formats are: + * - KeePass 2 XML key file + * - Fixed 32 byte binary + * - Fixed 32 byte ASCII hex-encoded binary + * + * Usage of legacy formats is discouraged and support for them may be + * removed in a future version. + * + * @param device input device + * @return true if key file was loaded successfully + */ bool FileKey::load(QIODevice* device) { // we may need to read the file multiple times @@ -39,8 +54,7 @@ bool FileKey::load(QIODevice* device) return false; } - // try different key file formats - + // try different legacy key file formats if (!device->reset()) { return false; } @@ -65,13 +79,31 @@ bool FileKey::load(QIODevice* device) if (!device->reset()) { return false; } - if (loadHashed(device)) { - return true; - } - return false; + // if no legacy format was detected, generate SHA-256 hash of key file + return loadHashed(device); } +/** + * Load key file from path while trying to detect its file format. + * + * If no legacy key file format was detected, the SHA-256 hash of the + * key file will be used, allowing usage of arbitrary files as key files. + * In case of a detected legacy key file format, the raw byte contents + * will be extracted from the file. + * + * Supported legacy formats are: + * - KeePass 2 XML key file + * - Fixed 32 byte binary + * - Fixed 32 byte ASCII hex-encoded binary + * + * Usage of legacy formats is discouraged and support for them may be + * removed in a future version. + * + * @param fileName input file name + * @param errorMsg error message if loading failed + * @return true if key file was loaded successfully + */ bool FileKey::load(const QString& fileName, QString* errorMsg) { QFile file(fileName); @@ -95,41 +127,42 @@ bool FileKey::load(const QString& fileName, QString* errorMsg) return result; } +/** + * @return key data as bytes + */ QByteArray FileKey::rawKey() const { return m_key; } +/** + * @return cloned \link FileKey instance + */ FileKey* FileKey::clone() const { return new FileKey(*this); } -void FileKey::create(QIODevice* device) +/** + * Generate a new key file from random bytes. + * + * @param device output device + * @param number of random bytes to generate + */ +void FileKey::create(QIODevice* device, int size) { - QXmlStreamWriter xmlWriter(device); - - xmlWriter.writeStartDocument("1.0"); - - xmlWriter.writeStartElement("KeyFile"); - - xmlWriter.writeStartElement("Meta"); - - xmlWriter.writeTextElement("Version", "1.00"); - - xmlWriter.writeEndElement(); - - xmlWriter.writeStartElement("Key"); - - QByteArray data = randomGen()->randomArray(32); - xmlWriter.writeTextElement("Data", QString::fromLatin1(data.toBase64())); - - xmlWriter.writeEndElement(); - - xmlWriter.writeEndDocument(); + device->write(randomGen()->randomArray(size)); } -bool FileKey::create(const QString& fileName, QString* errorMsg) +/** + * Create a new key file from random bytes. + * + * @param fileName output file name + * @param errorMsg error message if generation failed + * @param number of random bytes to generate + * @return true on successful creation + */ +bool FileKey::create(const QString& fileName, QString* errorMsg, int size) { QFile file(fileName); if (!file.open(QFile::WriteOnly)) { @@ -138,8 +171,7 @@ bool FileKey::create(const QString& fileName, QString* errorMsg) } return false; } - create(&file); - + create(&file, size); file.close(); if (file.error()) { @@ -149,11 +181,17 @@ bool FileKey::create(const QString& fileName, QString* errorMsg) return false; } - else { - return true; - } + + return true; } +/** + * Load key file in legacy KeePass 2 XML format. + * + * @param device input device + * @return true on success + * @deprecated + */ bool FileKey::loadXml(QIODevice* device) { QXmlStreamReader xmlReader(device); @@ -162,8 +200,7 @@ bool FileKey::loadXml(QIODevice* device) if (xmlReader.name() != "KeyFile") { return false; } - } - else { + } else { return false; } @@ -173,8 +210,7 @@ bool FileKey::loadXml(QIODevice* device) while (!xmlReader.error() && xmlReader.readNextStartElement()) { if (xmlReader.name() == "Meta") { correctMeta = loadXmlMeta(xmlReader); - } - else if (xmlReader.name() == "Key") { + } else if (xmlReader.name() == "Key") { data = loadXmlKey(xmlReader); } } @@ -183,18 +219,23 @@ bool FileKey::loadXml(QIODevice* device) m_key = data; return true; } - else { - return false; - } + + return false; } +/** + * Load meta data from legacy KeePass 2 XML key file. + * + * @param xmlReader input XML reader + * @return true on success + * @deprecated + */ bool FileKey::loadXmlMeta(QXmlStreamReader& xmlReader) { bool correctVersion = false; while (!xmlReader.error() && xmlReader.readNextStartElement()) { if (xmlReader.name() == "Version") { - // TODO: error message about incompatible key file version if (xmlReader.readElementText() == "1.00") { correctVersion = true; } @@ -204,13 +245,19 @@ bool FileKey::loadXmlMeta(QXmlStreamReader& xmlReader) return correctVersion; } +/** + * Load base64 key data from legacy KeePass 2 XML key file. + * + * @param xmlReader input XML reader + * @return true on success + * @deprecated + */ QByteArray FileKey::loadXmlKey(QXmlStreamReader& xmlReader) { QByteArray data; while (!xmlReader.error() && xmlReader.readNextStartElement()) { if (xmlReader.name() == "Data") { - // TODO: do we need to enforce a specific data.size()? QByteArray rawData = xmlReader.readElementText().toLatin1(); if (Tools::isBase64(rawData)) { data = QByteArray::fromBase64(rawData); @@ -221,6 +268,13 @@ QByteArray FileKey::loadXmlKey(QXmlStreamReader& xmlReader) return data; } +/** + * Load fixed 32-bit binary key file. + * + * @param device input device + * @return true on success + * @deprecated + */ bool FileKey::loadBinary(QIODevice* device) { if (device->size() != 32) { @@ -230,13 +284,19 @@ bool FileKey::loadBinary(QIODevice* device) QByteArray data; if (!Tools::readAllFromDevice(device, data) || data.size() != 32) { return false; - } - else { + } else { m_key = data; return true; } } +/** + * Load hex-encoded representation of fixed 32-bit binary key file. + * + * @param device input device + * @return true on success + * @deprecated + */ bool FileKey::loadHex(QIODevice* device) { if (device->size() != 64) { @@ -262,6 +322,12 @@ bool FileKey::loadHex(QIODevice* device) return true; } +/** + * Generate SHA-256 hash of arbitrary text or binary key file. + * + * @param device input device + * @return true on success + */ bool FileKey::loadHashed(QIODevice* device) { CryptoHash cryptoHash(CryptoHash::Sha256); @@ -272,7 +338,8 @@ bool FileKey::loadHashed(QIODevice* device) return false; } cryptoHash.addData(buffer); - } while (!buffer.isEmpty()); + } + while (!buffer.isEmpty()); m_key = cryptoHash.result(); diff --git a/src/keys/FileKey.h b/src/keys/FileKey.h index 7a9b1caf0..af324e530 100644 --- a/src/keys/FileKey.h +++ b/src/keys/FileKey.h @@ -1,4 +1,5 @@ /* +* Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * Copyright (C) 2011 Felix Geyer <debfx@fobos.de> * * This program is free software: you can redistribute it and/or modify @@ -24,16 +25,15 @@ class QIODevice; -class FileKey : public Key +class FileKey: public Key { public: - FileKey(); bool load(QIODevice* device); bool load(const QString& fileName, QString* errorMsg = nullptr); - QByteArray rawKey() const; - FileKey* clone() const; - static void create(QIODevice* device); - static bool create(const QString& fileName, QString* errorMsg = nullptr); + QByteArray rawKey() const override; + FileKey* clone() const override; + static void create(QIODevice* device, int size = 128); + static bool create(const QString& fileName, QString* errorMsg = nullptr, int size = 128); private: bool loadXml(QIODevice* device); From 60b3037e4ad297e6d1313e1986eede5b3183a549 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Wed, 27 Dec 2017 01:11:46 +0100 Subject: [PATCH 172/402] Add additional unit tests for key file generation --- tests/TestKeys.cpp | 67 ++++++++++++++++++++++++++++++---------------- tests/TestKeys.h | 2 ++ 2 files changed, 46 insertions(+), 23 deletions(-) diff --git a/tests/TestKeys.cpp b/tests/TestKeys.cpp index 738b39a26..95a72a49f 100644 --- a/tests/TestKeys.cpp +++ b/tests/TestKeys.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2011 Felix Geyer <debfx@fobos.de> * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * Copyright (C) 2011 Felix Geyer <debfx@fobos.de> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,12 +22,14 @@ #include <QTest> #include "config-keepassx-tests.h" + #include "core/Database.h" #include "core/Metadata.h" +#include "core/Tools.h" #include "crypto/Crypto.h" +#include "crypto/CryptoHash.h" #include "format/KeePass2Reader.h" #include "format/KeePass2Writer.h" -#include "keys/CompositeKey.h" #include "keys/FileKey.h" #include "keys/PasswordKey.h" @@ -40,31 +42,27 @@ void TestKeys::initTestCase() void TestKeys::testComposite() { - CompositeKey* compositeKey1 = new CompositeKey(); - PasswordKey* passwordKey1 = new PasswordKey(); - PasswordKey* passwordKey2 = new PasswordKey("test"); + QScopedPointer<CompositeKey> compositeKey1(new CompositeKey()); + QScopedPointer<PasswordKey> passwordKey1(new PasswordKey()); + QScopedPointer<PasswordKey> passwordKey2(new PasswordKey("test")); bool ok; QString errorString; // make sure that addKey() creates a copy of the keys compositeKey1->addKey(*passwordKey1); compositeKey1->addKey(*passwordKey2); - delete passwordKey1; - delete passwordKey2; QByteArray transformed = compositeKey1->transform(QByteArray(32, '\0'), 1, &ok, &errorString); QVERIFY(ok); QCOMPARE(transformed.size(), 32); // make sure the subkeys are copied - CompositeKey* compositeKey2 = compositeKey1->clone(); - delete compositeKey1; + QScopedPointer<CompositeKey> compositeKey2(compositeKey1->clone()); QCOMPARE(compositeKey2->transform(QByteArray(32, '\0'), 1, &ok, &errorString), transformed); QVERIFY(ok); - delete compositeKey2; - CompositeKey* compositeKey3 = new CompositeKey(); - CompositeKey* compositeKey4 = new CompositeKey(); + QScopedPointer<CompositeKey> compositeKey3(new CompositeKey()); + QScopedPointer<CompositeKey> compositeKey4(new CompositeKey()); // test clear() compositeKey3->addKey(PasswordKey("test")); @@ -79,9 +77,6 @@ void TestKeys::testComposite() // test self-assignment *compositeKey3 = *compositeKey3; QCOMPARE(compositeKey3->rawKey(), compositeKey4->rawKey()); - - delete compositeKey3; - delete compositeKey4; } void TestKeys::testFileKey() @@ -101,12 +96,10 @@ void TestKeys::testFileKey() QCOMPARE(fileKey.rawKey().size(), 32); compositeKey.addKey(fileKey); - Database* db = reader.readDatabase(dbFilename, compositeKey); + QScopedPointer<Database> db(reader.readDatabase(dbFilename, compositeKey)); QVERIFY(db); QVERIFY(!reader.hasError()); QCOMPARE(db->metadata()->name(), QString("%1 Database").arg(name)); - - delete db; } void TestKeys::testFileKey_data() @@ -120,6 +113,20 @@ void TestKeys::testFileKey_data() } void TestKeys::testCreateFileKey() +{ + QBuffer keyBuffer1; + keyBuffer1.open(QBuffer::ReadWrite); + + FileKey::create(&keyBuffer1, 128); + QCOMPARE(keyBuffer1.size(), 128); + + QBuffer keyBuffer2; + keyBuffer2.open(QBuffer::ReadWrite); + FileKey::create(&keyBuffer2, 64); + QCOMPARE(keyBuffer2.size(), 64); +} + +void TestKeys::testCreateAndOpenFileKey() { const QString dbName("testCreateFileKey database"); @@ -134,7 +141,7 @@ void TestKeys::testCreateFileKey() CompositeKey compositeKey; compositeKey.addKey(fileKey); - Database* dbOrg = new Database(); + QScopedPointer<Database> dbOrg(new Database()); QVERIFY(dbOrg->setKey(compositeKey)); dbOrg->metadata()->setName(dbName); @@ -142,16 +149,30 @@ void TestKeys::testCreateFileKey() dbBuffer.open(QBuffer::ReadWrite); KeePass2Writer writer; - writer.writeDatabase(&dbBuffer, dbOrg); + writer.writeDatabase(&dbBuffer, dbOrg.data()); dbBuffer.reset(); - delete dbOrg; KeePass2Reader reader; - Database* dbRead = reader.readDatabase(&dbBuffer, compositeKey); + QScopedPointer<Database> dbRead(reader.readDatabase(&dbBuffer, compositeKey)); QVERIFY(dbRead); QVERIFY(!reader.hasError()); QCOMPARE(dbRead->metadata()->name(), dbName); - delete dbRead; +} + +void TestKeys::testFileKeyHash() +{ + QBuffer keyBuffer; + keyBuffer.open(QBuffer::ReadWrite); + + FileKey::create(&keyBuffer); + + CryptoHash cryptoHash(CryptoHash::Sha256); + cryptoHash.addData(keyBuffer.data()); + + FileKey fileKey; + fileKey.load(&keyBuffer); + + QCOMPARE(fileKey.rawKey(), cryptoHash.result()); } void TestKeys::testFileKeyError() diff --git a/tests/TestKeys.h b/tests/TestKeys.h index 1cbe7bf96..237225f8f 100644 --- a/tests/TestKeys.h +++ b/tests/TestKeys.h @@ -31,6 +31,8 @@ private slots: void testFileKey(); void testFileKey_data(); void testCreateFileKey(); + void testCreateAndOpenFileKey(); + void testFileKeyHash(); void testFileKeyError(); void benchmarkTransformKey(); }; From 55271311c4754d4bd204ad2fa3a1f4c253df3269 Mon Sep 17 00:00:00 2001 From: Vlad N <voffka.nikituk@gmail.com> Date: Sat, 21 Oct 2017 15:16:52 +0300 Subject: [PATCH 173/402] Added dark tray icon parameter to settings. --- share/keepassxc.ini | 1 + src/core/FilePath.cpp | 18 ++++++++++++++++ src/core/FilePath.h | 2 ++ src/gui/MainWindow.cpp | 17 ++++++++++++--- src/gui/SettingsWidget.cpp | 3 +++ src/gui/SettingsWidgetGeneral.ui | 36 ++++++++++++++++++++++++++++++++ 6 files changed, 74 insertions(+), 3 deletions(-) diff --git a/share/keepassxc.ini b/share/keepassxc.ini index c6f0654fe..54920224a 100644 --- a/share/keepassxc.ini +++ b/share/keepassxc.ini @@ -16,6 +16,7 @@ LastOpenedDatabases=@Invalid() [GUI] Language=system ShowTrayIcon=false +DarkTrayIcon=false MinimizeToTray=false MinimizeOnClose=false MinimizeOnStartup=false diff --git a/src/core/FilePath.cpp b/src/core/FilePath.cpp index b5c9d1020..89b0e4643 100644 --- a/src/core/FilePath.cpp +++ b/src/core/FilePath.cpp @@ -98,6 +98,15 @@ QIcon FilePath::applicationIcon() #endif } +QIcon FilePath::applicationIconDark() +{ +#ifdef KEEPASSXC_DIST_SNAP + return icon("apps", "keepassxc-dark", false); +#else + return icon("apps", "keepassxc-dark"); +#endif +} + QIcon FilePath::trayIconLocked() { #ifdef KEEPASSXC_DIST_SNAP @@ -116,6 +125,15 @@ QIcon FilePath::trayIconUnlocked() #endif } +QIcon FilePath::trayIconUnlockedDark() +{ +#ifdef KEEPASSXC_DIST_SNAP + return icon("apps", "keepassxc-dark", false); +#else + return icon("apps", "keepassxc-dark"); +#endif +} + QIcon FilePath::icon(const QString& category, const QString& name, bool fromTheme) { QString combinedName = category + "/" + name; diff --git a/src/core/FilePath.h b/src/core/FilePath.h index 34edcbc93..fdadee79e 100644 --- a/src/core/FilePath.h +++ b/src/core/FilePath.h @@ -28,8 +28,10 @@ public: QString dataPath(const QString& name); QString pluginPath(const QString& name); QIcon applicationIcon(); + QIcon applicationIconDark(); QIcon trayIconLocked(); QIcon trayIconUnlocked(); + QIcon trayIconUnlockedDark(); QIcon icon(const QString& category, const QString& name, bool fromTheme = true); QIcon onOffIcon(const QString& category, const QString& name); diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index fa16adb80..044cb736b 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -773,9 +773,10 @@ bool MainWindow::saveLastDatabases() void MainWindow::updateTrayIcon() { if (isTrayIconEnabled()) { + bool darkIcon = config()->get("GUI/DarkTrayIcon").toBool(); + if (!m_trayIcon) { m_trayIcon = new QSystemTrayIcon(this); - QMenu* menu = new QMenu(this); QAction* actionToggle = new QAction(tr("Toggle window"), menu); @@ -795,11 +796,21 @@ void MainWindow::updateTrayIcon() connect(actionToggle, SIGNAL(triggered()), SLOT(toggleWindow())); m_trayIcon->setContextMenu(menu); - m_trayIcon->setIcon(filePath()->applicationIcon()); + + if(darkIcon){ + m_trayIcon->setIcon(filePath()->applicationIconDark()); + } else { + m_trayIcon->setIcon(filePath()->applicationIcon()); + } + m_trayIcon->show(); } if (m_ui->tabWidget->hasLockableDatabases()) { - m_trayIcon->setIcon(filePath()->trayIconUnlocked()); + if(darkIcon){ + m_trayIcon->setIcon(filePath()->trayIconUnlockedDark()); + } else { + m_trayIcon->setIcon(filePath()->trayIconUnlocked()); + } } else { m_trayIcon->setIcon(filePath()->trayIconLocked()); diff --git a/src/gui/SettingsWidget.cpp b/src/gui/SettingsWidget.cpp index 4ba81c6f7..ce3df3338 100644 --- a/src/gui/SettingsWidget.cpp +++ b/src/gui/SettingsWidget.cpp @@ -136,6 +136,7 @@ void SettingsWidget::loadSettings() m_generalUi->detailsHideCheckBox->setChecked(config()->get("GUI/HideDetailsView").toBool()); m_generalUi->systrayShowCheckBox->setChecked(config()->get("GUI/ShowTrayIcon").toBool()); + m_generalUi->systrayDarkIconCheckBox->setChecked(config()->get("GUI/DarkTrayIcon").toBool()); m_generalUi->systrayMinimizeToTrayCheckBox->setChecked(config()->get("GUI/MinimizeToTray").toBool()); m_generalUi->systrayMinimizeOnCloseCheckBox->setChecked(config()->get("GUI/MinimizeOnClose").toBool()); m_generalUi->systrayMinimizeOnStartup->setChecked(config()->get("GUI/MinimizeOnStartup").toBool()); @@ -208,6 +209,7 @@ void SettingsWidget::saveSettings() config()->set("GUI/HideDetailsView", m_generalUi->detailsHideCheckBox->isChecked()); config()->set("GUI/ShowTrayIcon", m_generalUi->systrayShowCheckBox->isChecked()); + config()->set("GUI/DarkTrayIcon", m_generalUi->systrayDarkIconCheckBox->isChecked()); config()->set("GUI/MinimizeToTray", m_generalUi->systrayMinimizeToTrayCheckBox->isChecked()); config()->set("GUI/MinimizeOnClose", m_generalUi->systrayMinimizeOnCloseCheckBox->isChecked()); config()->set("GUI/MinimizeOnStartup", m_generalUi->systrayMinimizeOnStartup->isChecked()); @@ -265,6 +267,7 @@ void SettingsWidget::enableAutoSaveOnExit(bool checked) void SettingsWidget::enableSystray(bool checked) { + m_generalUi->systrayDarkIconCheckBox->setEnabled(checked); m_generalUi->systrayMinimizeToTrayCheckBox->setEnabled(checked); m_generalUi->systrayMinimizeOnCloseCheckBox->setEnabled(checked); } diff --git a/src/gui/SettingsWidgetGeneral.ui b/src/gui/SettingsWidgetGeneral.ui index 7dc4487cf..684cb4353 100644 --- a/src/gui/SettingsWidgetGeneral.ui +++ b/src/gui/SettingsWidgetGeneral.ui @@ -245,6 +245,42 @@ </item> </layout> </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_4"> + <property name="spacing"> + <number>0</number> + </property> + <property name="sizeConstraint"> + <enum>QLayout::SetMaximumSize</enum> + </property> + <item> + <spacer name="horizontalSpacer_3"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Fixed</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QCheckBox" name="systrayDarkIconCheckBox"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Dark system tray icon</string> + </property> + </widget> + </item> + </layout> + </item> </layout> </widget> </item> From 4fa00b74ad75b968011acf80ebd3554173199d85 Mon Sep 17 00:00:00 2001 From: Vlad N <voffka.nikituk@gmail.com> Date: Sun, 17 Dec 2017 16:52:13 +0200 Subject: [PATCH 174/402] Moved dark icon logic into FilePath. --- src/core/FilePath.cpp | 33 +++++++++++++-------------------- src/core/FilePath.h | 3 +-- src/gui/MainWindow.cpp | 15 ++------------- 3 files changed, 16 insertions(+), 35 deletions(-) diff --git a/src/core/FilePath.cpp b/src/core/FilePath.cpp index 89b0e4643..f4703b99b 100644 --- a/src/core/FilePath.cpp +++ b/src/core/FilePath.cpp @@ -23,6 +23,7 @@ #include "config-keepassx.h" #include "core/Global.h" +#include "core/Config.h" FilePath* FilePath::m_instance(nullptr); @@ -91,21 +92,15 @@ QString FilePath::pluginPath(const QString& name) QIcon FilePath::applicationIcon() { + bool darkIcon = useDarkIcon(); + #ifdef KEEPASSXC_DIST_SNAP - return icon("apps", "keepassxc", false); + return (darkIcon) ? icon("apps", "keepassxc-dark", false) : icon("apps", "keepassxc", false); #else - return icon("apps", "keepassxc"); + return (darkIcon) ? icon("apps", "keepassxc-dark") : icon("apps", "keepassxc"); #endif } -QIcon FilePath::applicationIconDark() -{ -#ifdef KEEPASSXC_DIST_SNAP - return icon("apps", "keepassxc-dark", false); -#else - return icon("apps", "keepassxc-dark"); -#endif -} QIcon FilePath::trayIconLocked() { @@ -118,19 +113,12 @@ QIcon FilePath::trayIconLocked() QIcon FilePath::trayIconUnlocked() { -#ifdef KEEPASSXC_DIST_SNAP - return icon("apps", "keepassxc-unlocked", false); -#else - return icon("apps", "keepassxc-unlocked"); -#endif -} + bool darkIcon = useDarkIcon(); -QIcon FilePath::trayIconUnlockedDark() -{ #ifdef KEEPASSXC_DIST_SNAP - return icon("apps", "keepassxc-dark", false); + return (darkIcon) ? icon("apps", "keepassxc-dark", false) : icon("apps", "keepassxc-unlocked", false); #else - return icon("apps", "keepassxc-dark"); + return (darkIcon) ? icon("apps", "keepassxc-dark") : icon("apps", "keepassxc-unlocked"); #endif } @@ -264,6 +252,11 @@ bool FilePath::testSetDir(const QString& dir) } } +bool FilePath::useDarkIcon() +{ + return config()->get("GUI/DarkTrayIcon").toBool(); +} + FilePath* FilePath::instance() { if (!m_instance) { diff --git a/src/core/FilePath.h b/src/core/FilePath.h index fdadee79e..2db496937 100644 --- a/src/core/FilePath.h +++ b/src/core/FilePath.h @@ -28,10 +28,8 @@ public: QString dataPath(const QString& name); QString pluginPath(const QString& name); QIcon applicationIcon(); - QIcon applicationIconDark(); QIcon trayIconLocked(); QIcon trayIconUnlocked(); - QIcon trayIconUnlockedDark(); QIcon icon(const QString& category, const QString& name, bool fromTheme = true); QIcon onOffIcon(const QString& category, const QString& name); @@ -40,6 +38,7 @@ public: private: FilePath(); bool testSetDir(const QString& dir); + bool useDarkIcon(); static FilePath* m_instance; diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 044cb736b..d63545bf1 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -773,8 +773,6 @@ bool MainWindow::saveLastDatabases() void MainWindow::updateTrayIcon() { if (isTrayIconEnabled()) { - bool darkIcon = config()->get("GUI/DarkTrayIcon").toBool(); - if (!m_trayIcon) { m_trayIcon = new QSystemTrayIcon(this); QMenu* menu = new QMenu(this); @@ -797,20 +795,11 @@ void MainWindow::updateTrayIcon() m_trayIcon->setContextMenu(menu); - if(darkIcon){ - m_trayIcon->setIcon(filePath()->applicationIconDark()); - } else { - m_trayIcon->setIcon(filePath()->applicationIcon()); - } - + m_trayIcon->setIcon(filePath()->applicationIcon()); m_trayIcon->show(); } if (m_ui->tabWidget->hasLockableDatabases()) { - if(darkIcon){ - m_trayIcon->setIcon(filePath()->trayIconUnlockedDark()); - } else { - m_trayIcon->setIcon(filePath()->trayIconUnlocked()); - } + m_trayIcon->setIcon(filePath()->trayIconUnlocked()); } else { m_trayIcon->setIcon(filePath()->trayIconLocked()); From 23f8d58859d637da6fcb75050c8dde90fa37ae8e Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Wed, 27 Dec 2017 16:46:56 +0100 Subject: [PATCH 175/402] Add default value for DarkTrayIcon option and fix style issues --- src/core/Config.cpp | 1 + src/core/FilePath.cpp | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/core/Config.cpp b/src/core/Config.cpp index 2047919b1..96fd385ff 100644 --- a/src/core/Config.cpp +++ b/src/core/Config.cpp @@ -135,6 +135,7 @@ void Config::init(const QString& fileName) m_defaults.insert("security/IconDownloadFallbackToGoogle", false); m_defaults.insert("GUI/Language", "system"); m_defaults.insert("GUI/ShowTrayIcon", false); + m_defaults.insert("GUI/DarkTrayIcon", false); m_defaults.insert("GUI/MinimizeToTray", false); m_defaults.insert("GUI/MinimizeOnClose", false); } diff --git a/src/core/FilePath.cpp b/src/core/FilePath.cpp index f4703b99b..f694f548b 100644 --- a/src/core/FilePath.cpp +++ b/src/core/FilePath.cpp @@ -1,4 +1,5 @@ /* + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * Copyright (C) 2011 Felix Geyer <debfx@fobos.de> * * This program is free software: you can redistribute it and/or modify @@ -116,9 +117,9 @@ QIcon FilePath::trayIconUnlocked() bool darkIcon = useDarkIcon(); #ifdef KEEPASSXC_DIST_SNAP - return (darkIcon) ? icon("apps", "keepassxc-dark", false) : icon("apps", "keepassxc-unlocked", false); + return darkIcon ? icon("apps", "keepassxc-dark", false) : icon("apps", "keepassxc-unlocked", false); #else - return (darkIcon) ? icon("apps", "keepassxc-dark") : icon("apps", "keepassxc-unlocked"); + return darkIcon ? icon("apps", "keepassxc-dark") : icon("apps", "keepassxc-unlocked"); #endif } From 8f4c2f5c5857ee3c14198f8b59b4928e442eb32a Mon Sep 17 00:00:00 2001 From: Rafael Sadowski <rafael@sizeofvoid.org> Date: Mon, 2 Oct 2017 23:53:28 +0200 Subject: [PATCH 176/402] Fix cmake build on OpenBSD --- src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 216db839e..00d628aca 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -161,7 +161,7 @@ if(APPLE) core/MacPasteboard.cpp ) endif() -if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") +if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux" OR ${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD") set(keepassx_SOURCES ${keepassx_SOURCES} core/ScreenLockListenerDBus.h core/ScreenLockListenerDBus.cpp From e29d3497eb3f6fa207810d0c0e28f03047175f71 Mon Sep 17 00:00:00 2001 From: Rafael Sadowski <rafael@sizeofvoid.org> Date: Tue, 3 Oct 2017 09:47:33 +0200 Subject: [PATCH 177/402] s/Q_OS_LINUX/Q_OS_UNIX/g Enable support for UNIX like OS. --- src/core/ScreenLockListenerPrivate.cpp | 4 ++-- src/gui/MainWindow.cpp | 4 ++-- src/main.cpp | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/core/ScreenLockListenerPrivate.cpp b/src/core/ScreenLockListenerPrivate.cpp index 36ee301f2..e1e6f3ae6 100644 --- a/src/core/ScreenLockListenerPrivate.cpp +++ b/src/core/ScreenLockListenerPrivate.cpp @@ -19,7 +19,7 @@ #if defined(Q_OS_OSX) #include "ScreenLockListenerMac.h" #endif -#if defined(Q_OS_LINUX) +#if defined(Q_OS_UNIX) #include "ScreenLockListenerDBus.h" #endif #if defined(Q_OS_WIN) @@ -36,7 +36,7 @@ ScreenLockListenerPrivate* ScreenLockListenerPrivate::instance(QWidget* parent) #if defined(Q_OS_OSX) Q_UNUSED(parent); return ScreenLockListenerMac::instance(); -#elif defined(Q_OS_LINUX) +#elif defined(Q_OS_UNIX) return new ScreenLockListenerDBus(parent); #elif defined(Q_OS_WIN) return new ScreenLockListenerWin(parent); diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index d63545bf1..e21c9dd64 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -23,7 +23,7 @@ #include <QShortcut> #include <QTimer> -#if defined(Q_OS_LINUX) && ! defined(QT_NO_DBUS) +#if defined(Q_OS_UNIX) && !defined(QT_NO_DBUS) #include <QList> #include <QtDBus/QtDBus> #endif @@ -888,7 +888,7 @@ void MainWindow::toggleWindow() raise(); activateWindow(); -#if defined(Q_OS_LINUX) && ! defined(QT_NO_DBUS) && (QT_VERSION < QT_VERSION_CHECK(5, 9, 0)) +#if defined(Q_OS_UNIX) && !defined(QT_NO_DBUS) && (QT_VERSION < QT_VERSION_CHECK(5, 9, 0)) // re-register global D-Bus menu (needed on Ubuntu with Unity) // see https://github.com/keepassxreboot/keepassxc/issues/271 // and https://bugreports.qt.io/browse/QTBUG-58723 diff --git a/src/main.cpp b/src/main.cpp index 7977435fc..90fb68762 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -39,7 +39,7 @@ #ifdef Q_OS_WIN Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin) -#elif Q_OS_LINUX +#elif Q_OS_UNIX Q_IMPORT_PLUGIN(QXcbIntegrationPlugin) #endif #endif From 71f38f17cd8c39b5858f33c769455e11e56687d7 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Wed, 27 Dec 2017 20:31:15 +0100 Subject: [PATCH 178/402] Restrict Q_OS_UNIX ifdefs to non-Mac platforms --- src/core/ScreenLockListenerPrivate.cpp | 10 ++++------ src/gui/MainWindow.cpp | 4 ++-- src/main.cpp | 4 ++-- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/core/ScreenLockListenerPrivate.cpp b/src/core/ScreenLockListenerPrivate.cpp index e1e6f3ae6..b36b9a33a 100644 --- a/src/core/ScreenLockListenerPrivate.cpp +++ b/src/core/ScreenLockListenerPrivate.cpp @@ -16,13 +16,11 @@ */ #include "ScreenLockListenerPrivate.h" -#if defined(Q_OS_OSX) +#if defined(Q_OS_MAC) #include "ScreenLockListenerMac.h" -#endif -#if defined(Q_OS_UNIX) +#elif defined(Q_OS_UNIX) #include "ScreenLockListenerDBus.h" -#endif -#if defined(Q_OS_WIN) +#elif defined(Q_OS_WIN) #include "ScreenLockListenerWin.h" #endif @@ -33,7 +31,7 @@ ScreenLockListenerPrivate::ScreenLockListenerPrivate(QWidget* parent) ScreenLockListenerPrivate* ScreenLockListenerPrivate::instance(QWidget* parent) { -#if defined(Q_OS_OSX) +#if defined(Q_OS_MAC) Q_UNUSED(parent); return ScreenLockListenerMac::instance(); #elif defined(Q_OS_UNIX) diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index e21c9dd64..08840cdb0 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -23,7 +23,7 @@ #include <QShortcut> #include <QTimer> -#if defined(Q_OS_UNIX) && !defined(QT_NO_DBUS) +#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(QT_NO_DBUS) #include <QList> #include <QtDBus/QtDBus> #endif @@ -888,7 +888,7 @@ void MainWindow::toggleWindow() raise(); activateWindow(); -#if defined(Q_OS_UNIX) && !defined(QT_NO_DBUS) && (QT_VERSION < QT_VERSION_CHECK(5, 9, 0)) +#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(QT_NO_DBUS) && (QT_VERSION < QT_VERSION_CHECK(5, 9, 0)) // re-register global D-Bus menu (needed on Ubuntu with Unity) // see https://github.com/keepassxreboot/keepassxc/issues/271 // and https://bugreports.qt.io/browse/QTBUG-58723 diff --git a/src/main.cpp b/src/main.cpp index 90fb68762..c3b1c6987 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -37,9 +37,9 @@ #ifdef QT_STATIC #include <QtPlugin> -#ifdef Q_OS_WIN +#if defined(Q_OS_WIN) Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin) -#elif Q_OS_UNIX +#elif defined(Q_OS_UNIX) && !defined(Q_OS_MAC) Q_IMPORT_PLUGIN(QXcbIntegrationPlugin) #endif #endif From 716a5d15434054988841f0bf457e6eafe0349eab Mon Sep 17 00:00:00 2001 From: Sam Schlinkert <sschlinkert@gmail.com> Date: Wed, 27 Dec 2017 22:59:40 -0500 Subject: [PATCH 179/402] Fixes link to Note about KeePassHTTP section Fixes internal link to "Note about KeePassHTTP" section in the README. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 36a1d61f4..685ebee0b 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ so please check out your distribution's package list to see if KeePassXC is avai - Browser integration with KeePassHTTP-Connector for [Mozilla Firefox](https://addons.mozilla.org/en-US/firefox/addon/keepasshttp-connector/) and [Google Chrome or Chromium](https://chrome.google.com/webstore/detail/keepasshttp-connector/dafgdjggglmmknipkhngniifhplpcldb), and -[passafari](https://github.com/mmichaa/passafari.safariextension/) in Safari. [[See note about KeePassHTTP]](#Note_about_KeePassHTTP) +[passafari](https://github.com/mmichaa/passafari.safariextension/) in Safari. [[See note about KeePassHTTP]](#note-about-keepasshttp) - Many bug fixes For a full list of features and changes, read the [CHANGELOG](CHANGELOG) document. From 0bea8a881d21de62a37f21a8b6157cd9cd51648d Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Thu, 28 Dec 2017 18:00:33 -0500 Subject: [PATCH 180/402] Prevent shadowing of application settings on MacOS --- src/gui/MainWindow.cpp | 3 --- src/gui/MainWindow.ui | 12 ++++++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 08840cdb0..bc7b3a89e 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -193,7 +193,6 @@ MainWindow::MainWindow() m_ui->actionChangeMasterKey->setIcon(filePath()->icon("actions", "database-change-key", false)); m_ui->actionLockDatabases->setIcon(filePath()->icon("actions", "document-encrypt", false)); m_ui->actionQuit->setIcon(filePath()->icon("actions", "application-exit")); - m_ui->actionQuit->setMenuRole(QAction::QuitRole); m_ui->actionEntryNew->setIcon(filePath()->icon("actions", "entry-new", false)); m_ui->actionEntryClone->setIcon(filePath()->icon("actions", "entry-clone", false)); @@ -210,11 +209,9 @@ MainWindow::MainWindow() m_ui->actionGroupEmptyRecycleBin->setIcon(filePath()->icon("actions", "group-empty-trash", false)); m_ui->actionSettings->setIcon(filePath()->icon("actions", "configure")); - m_ui->actionSettings->setMenuRole(QAction::PreferencesRole); m_ui->actionPasswordGenerator->setIcon(filePath()->icon("actions", "password-generator", false)); m_ui->actionAbout->setIcon(filePath()->icon("actions", "help-about")); - m_ui->actionAbout->setMenuRole(QAction::AboutRole); m_actionMultiplexer.connect(SIGNAL(currentModeChanged(DatabaseWidget::Mode)), this, SLOT(setMenuActionState(DatabaseWidget::Mode))); diff --git a/src/gui/MainWindow.ui b/src/gui/MainWindow.ui index d0cded220..c4d782f08 100644 --- a/src/gui/MainWindow.ui +++ b/src/gui/MainWindow.ui @@ -297,11 +297,17 @@ <property name="text"> <string>&Quit</string> </property> + <property name="menuRole"> + <enum>QAction::QuitRole</enum> + </property> </action> <action name="actionAbout"> <property name="text"> <string>&About</string> </property> + <property name="menuRole"> + <enum>QAction::AboutRole</enum> + </property> </action> <action name="actionDatabaseOpen"> <property name="text"> @@ -408,6 +414,9 @@ <property name="toolTip"> <string>Database settings</string> </property> + <property name="menuRole"> + <enum>QAction::NoRole</enum> + </property> </action> <action name="actionEntryClone"> <property name="enabled"> @@ -451,6 +460,9 @@ <property name="text"> <string>&Settings</string> </property> + <property name="menuRole"> + <enum>QAction::PreferencesRole</enum> + </property> </action> <action name="actionPasswordGenerator"> <property name="checkable"> From a89f57a2dfc1f1d12efb0d866dfc8f3f0919a025 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Wed, 3 Jan 2018 01:02:44 +0100 Subject: [PATCH 181/402] Fix sshagent autouic --- src/sshagent/AgentSettingsWidget.cpp | 5 +++++ src/sshagent/AgentSettingsWidget.h | 4 +--- src/sshagent/CMakeLists.txt | 2 ++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/sshagent/AgentSettingsWidget.cpp b/src/sshagent/AgentSettingsWidget.cpp index e8bc75ae1..81b6808fe 100644 --- a/src/sshagent/AgentSettingsWidget.cpp +++ b/src/sshagent/AgentSettingsWidget.cpp @@ -17,6 +17,7 @@ */ #include "AgentSettingsWidget.h" +#include "ui_AgentSettingsWidget.h" #include "core/Config.h" AgentSettingsWidget::AgentSettingsWidget(QWidget* parent) @@ -26,6 +27,10 @@ AgentSettingsWidget::AgentSettingsWidget(QWidget* parent) m_ui->setupUi(this); } +AgentSettingsWidget::~AgentSettingsWidget() +{ +} + void AgentSettingsWidget::loadSettings() { m_ui->enableSSHAgentCheckBox->setChecked(config()->get("SSHAgent", false).toBool()); diff --git a/src/sshagent/AgentSettingsWidget.h b/src/sshagent/AgentSettingsWidget.h index b6462daa0..90d1b1973 100644 --- a/src/sshagent/AgentSettingsWidget.h +++ b/src/sshagent/AgentSettingsWidget.h @@ -21,7 +21,6 @@ #include <QWidget> #include <QScopedPointer> -#include "ui_AgentSettingsWidget.h" namespace Ui { class AgentSettingsWidget; @@ -32,8 +31,7 @@ class AgentSettingsWidget : public QWidget Q_OBJECT public: explicit AgentSettingsWidget(QWidget* parent = nullptr); - -signals: + ~AgentSettingsWidget(); public slots: void loadSettings(); diff --git a/src/sshagent/CMakeLists.txt b/src/sshagent/CMakeLists.txt index 1733e21b1..5d2ad6e3b 100644 --- a/src/sshagent/CMakeLists.txt +++ b/src/sshagent/CMakeLists.txt @@ -1,4 +1,6 @@ if(WITH_XC_SSHAGENT) + include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) + set(sshagent_SOURCES bcrypt_pbkdf.cpp blowfish.c From 45cb97ec8535f6ab5c47cd3d92da91a89f9381b7 Mon Sep 17 00:00:00 2001 From: Marco <test@test.com> Date: Mon, 8 May 2017 12:10:53 +0200 Subject: [PATCH 182/402] :bug: #216 add warning on long autotypes, enable user and pw repetition Auto Type now shows a warning when you try to repeat something too often. Also you can now repeat your password and username --- src/autotype/AutoType.cpp | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp index 0d01a8311..b0c65ccc6 100644 --- a/src/autotype/AutoType.cpp +++ b/src/autotype/AutoType.cpp @@ -334,7 +334,9 @@ bool AutoType::parseActions(const QString& sequence, const Entry* entry, QList<A return false; } else if (ch == '}') { - actions.append(createActionFromTemplate(tmpl, entry)); + QList<AutoTypeAction*> autoType = createActionFromTemplate(tmpl, entry); + if (autoType.isEmpty()) return false; + actions.append(autoType); inTmpl = false; tmpl.clear(); } @@ -391,11 +393,24 @@ QList<AutoTypeAction*> AutoType::createActionFromTemplate(const QString& tmpl, c // some safety checks else if (tmplName.compare("delay",Qt::CaseInsensitive)==0) { if (num > 10000) { - return list; + QMessageBox::StandardButton reply; + reply = QMessageBox::question(0,"AutoType", + "This AutoType command contains a very long delay. Do you really want to execute it?"); + + if (reply==QMessageBox::No) { + return list; + } } } else if (num > 100) { - return list; + QMessageBox::StandardButton reply; + reply = QMessageBox::question(0,"AutoType", + "This AutoType command contains arguments which are repeated very often. Do you really want to execute it?"); + + if (reply==QMessageBox::No) { + return list; + } + } } @@ -501,6 +516,7 @@ QList<AutoTypeAction*> AutoType::createActionFromTemplate(const QString& tmpl, c else if (tmplName.compare("rightbrace",Qt::CaseInsensitive)==0) { list.append(new AutoTypeChar('}')); } + else { QRegExp fnRegexp("f(\\d+)", Qt::CaseInsensitive, QRegExp::RegExp2); if (fnRegexp.exactMatch(tmplName)) { @@ -515,7 +531,6 @@ QList<AutoTypeAction*> AutoType::createActionFromTemplate(const QString& tmpl, c for (int i = 1; i < num; i++) { list.append(list.at(0)->clone()); } - return list; } @@ -555,6 +570,14 @@ QList<AutoTypeAction*> AutoType::createActionFromTemplate(const QString& tmpl, c } } + //allows to insert usernames and passwords multiple times + if (!list.isEmpty()) { + for (int i = 1; i < num; i++) { + for (int i = 0; i< resolved.size();i++) { + list.append(list.at(i)->clone()); + } + } + } return list; } From 4fcedc218702b7ec1044887e80f2b29dad75427b Mon Sep 17 00:00:00 2001 From: Marco <test@test.com> Date: Sun, 14 May 2017 18:25:43 +0200 Subject: [PATCH 183/402] check autotype syntax, high repetion, reformat code TODO: specify what should happen when autotypesyntax incorrect --- src/autotype/AutoType.cpp | 101 +++++++++++++++--------------- src/gui/entry/EditEntryWidget.cpp | 14 +++++ 2 files changed, 66 insertions(+), 49 deletions(-) diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp index b0c65ccc6..fa6a5d853 100644 --- a/src/autotype/AutoType.cpp +++ b/src/autotype/AutoType.cpp @@ -62,9 +62,9 @@ AutoType::AutoType(QObject* parent, bool test) QString pluginPath = filePath()->pluginPath(pluginName); if (!pluginPath.isEmpty()) { - #ifdef WITH_XC_AUTOTYPE +#ifdef WITH_XC_AUTOTYPE loadPlugin(pluginPath); - #endif +#endif } connect(qApp, SIGNAL(aboutToQuit()), SLOT(unloadPlugin())); @@ -394,126 +394,128 @@ QList<AutoTypeAction*> AutoType::createActionFromTemplate(const QString& tmpl, c else if (tmplName.compare("delay",Qt::CaseInsensitive)==0) { if (num > 10000) { QMessageBox::StandardButton reply; - reply = QMessageBox::question(0,"AutoType", + reply = QMessageBox::question(0, + "AutoType", "This AutoType command contains a very long delay. Do you really want to execute it?"); - if (reply==QMessageBox::No) { + if (reply == QMessageBox::No) { return list; } } } else if (num > 100) { QMessageBox::StandardButton reply; - reply = QMessageBox::question(0,"AutoType", + reply = QMessageBox::question(0, + "AutoType", "This AutoType command contains arguments which are repeated very often. Do you really want to execute it?"); - if (reply==QMessageBox::No) { + if (reply == QMessageBox::No) { return list; } } } - if (tmplName.compare("tab",Qt::CaseInsensitive)==0) { + if (tmplName.compare("tab", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_Tab)); } - else if (tmplName.compare("enter",Qt::CaseInsensitive)==0) { + else if (tmplName.compare("enter", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_Enter)); } - else if (tmplName.compare("space",Qt::CaseInsensitive)==0) { + else if (tmplName.compare("space", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_Space)); } - else if (tmplName.compare("up",Qt::CaseInsensitive)==0) { + else if (tmplName.compare("up", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_Up)); } - else if (tmplName.compare("down",Qt::CaseInsensitive)==0) { + else if (tmplName.compare("down", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_Down)); } - else if (tmplName.compare("left",Qt::CaseInsensitive)==0) { + else if (tmplName.compare("left", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_Left)); } - else if (tmplName.compare("right",Qt::CaseInsensitive)==0) { + else if (tmplName.compare("right", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_Right)); } - else if (tmplName.compare("insert",Qt::CaseInsensitive)==0 || - tmplName.compare("ins",Qt::CaseInsensitive)==0) { + else if (tmplName.compare("insert", Qt::CaseInsensitive) == 0 || + tmplName.compare("ins", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_Insert)); } - else if (tmplName.compare("delete",Qt::CaseInsensitive)==0 || - tmplName.compare("del",Qt::CaseInsensitive)==0) { + else if (tmplName.compare("delete", Qt::CaseInsensitive) == 0 || + tmplName.compare("del", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_Delete)); } - else if (tmplName.compare("home",Qt::CaseInsensitive)==0) { + else if (tmplName.compare("home", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_Home)); } - else if (tmplName.compare("end",Qt::CaseInsensitive)==0) { + else if (tmplName.compare("end", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_End)); } - else if (tmplName.compare("pgup",Qt::CaseInsensitive)==0) { + else if (tmplName.compare("pgup", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_PageUp)); } - else if (tmplName.compare("pgdown",Qt::CaseInsensitive)==0) { + else if (tmplName.compare("pgdown", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_PageDown)); } - else if (tmplName.compare("backspace",Qt::CaseInsensitive)==0 || - tmplName.compare("bs",Qt::CaseInsensitive)==0 || - tmplName.compare("bksp",Qt::CaseInsensitive)==0) { + else if (tmplName.compare("backspace", Qt::CaseInsensitive) == 0 || + tmplName.compare("bs", Qt::CaseInsensitive) == 0 || + tmplName.compare("bksp", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_Backspace)); } - else if (tmplName.compare("break",Qt::CaseInsensitive)==0) { + else if (tmplName.compare("break", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_Pause)); } - else if (tmplName.compare("capslock",Qt::CaseInsensitive)==0) { + else if (tmplName.compare("capslock", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_CapsLock)); } - else if (tmplName.compare("esc",Qt::CaseInsensitive)==0) { + else if (tmplName.compare("esc", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_Escape)); } - else if (tmplName.compare("help",Qt::CaseInsensitive)==0) { + else if (tmplName.compare("help", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_Help)); } - else if (tmplName.compare("numlock",Qt::CaseInsensitive)==0) { + else if (tmplName.compare("numlock", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_NumLock)); } - else if (tmplName.compare("ptrsc",Qt::CaseInsensitive)==0) { + else if (tmplName.compare("ptrsc", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_Print)); } - else if (tmplName.compare("scrolllock",Qt::CaseInsensitive)==0) { + else if (tmplName.compare("scrolllock", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_ScrollLock)); } - // Qt doesn't know about keypad keys so use the normal ones instead - else if (tmplName.compare("add",Qt::CaseInsensitive)==0 || - tmplName.compare("+",Qt::CaseInsensitive)==0) { + // Qt doesn't know about keypad keys so use the normal ones instead + else if (tmplName.compare("add", Qt::CaseInsensitive) == 0 || + tmplName.compare("+", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeChar('+')); } - else if (tmplName.compare("subtract",Qt::CaseInsensitive)==0) { + else if (tmplName.compare("subtract", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeChar('-')); } - else if (tmplName.compare("multiply",Qt::CaseInsensitive)==0) { + else if (tmplName.compare("multiply", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeChar('*')); } - else if (tmplName.compare("divide",Qt::CaseInsensitive)==0) { + else if (tmplName.compare("divide", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeChar('/')); } - else if (tmplName.compare("^",Qt::CaseInsensitive)==0) { + else if (tmplName.compare("^", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeChar('^')); } - else if (tmplName.compare("%",Qt::CaseInsensitive)==0) { + else if (tmplName.compare("%", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeChar('%')); } - else if (tmplName.compare("~",Qt::CaseInsensitive)==0) { + else if (tmplName.compare("~", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeChar('~')); } - else if (tmplName.compare("(",Qt::CaseInsensitive)==0) { + else if (tmplName.compare("(", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeChar('(')); } - else if (tmplName.compare(")",Qt::CaseInsensitive)==0) { + else if (tmplName.compare(")", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeChar(')')); } - else if (tmplName.compare("leftbrace",Qt::CaseInsensitive)==0) { + else if (tmplName.compare("leftbrace", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeChar('{')); } - else if (tmplName.compare("rightbrace",Qt::CaseInsensitive)==0) { + else if (tmplName.compare("rightbrace", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeChar('}')); } @@ -535,10 +537,10 @@ QList<AutoTypeAction*> AutoType::createActionFromTemplate(const QString& tmpl, c } - if (tmplName.compare("delay",Qt::CaseInsensitive)==0 && num > 0) { + if (tmplName.compare("delay", Qt::CaseInsensitive) == 0 && num > 0) { list.append(new AutoTypeDelay(num)); } - else if (tmplName.compare("clearfield",Qt::CaseInsensitive)==0) { + else if (tmplName.compare("clearfield", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeClearField()); } else if (tmplName.compare("totp", Qt::CaseInsensitive) == 0) { @@ -573,7 +575,7 @@ QList<AutoTypeAction*> AutoType::createActionFromTemplate(const QString& tmpl, c //allows to insert usernames and passwords multiple times if (!list.isEmpty()) { for (int i = 1; i < num; i++) { - for (int i = 0; i< resolved.size();i++) { + for (int i = 0; i < resolved.size(); i++) { list.append(list.at(i)->clone()); } } @@ -626,7 +628,7 @@ QString AutoType::autoTypeSequence(const Entry* entry, const QString& windowTitl sequence = entry->defaultAutoTypeSequence(); } - const Group* group = entry->group(); + const Group *group = entry->group(); do { if (!enableSet) { if (group->autoTypeEnabled() == Group::Disable) { @@ -644,7 +646,8 @@ QString AutoType::autoTypeSequence(const Entry* entry, const QString& windowTitl group = group->parentGroup(); } while (group && (!enableSet || sequence.isEmpty())); - if (sequence.isEmpty() && (!entry->resolvePlaceholder(entry->username()).isEmpty() || !entry->resolvePlaceholder(entry->password()).isEmpty())) { + if (sequence.isEmpty() && (!entry->resolvePlaceholder(entry->username()).isEmpty() + || !entry->resolvePlaceholder(entry->password()).isEmpty())) { if (entry->resolvePlaceholder(entry->username()).isEmpty()) { sequence = "{PASSWORD}{ENTER}"; } diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index 3e26e3092..f8f3ab49a 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -764,6 +764,20 @@ void EditEntryWidget::updateEntryData(Entry* entry) const entry->setDefaultAutoTypeSequence(QString()); } else { + QRegExp autoTypeSyntax("(\\{[A-Z]*(\\s[0-9]*){0,1}\\})*"); + autoTypeSyntax.setCaseSensitivity(Qt::CaseInsensitive); + autoTypeSyntax.setPatternSyntax(QRegExp::RegExp); + + + QRegExp highRepetition(".*[0-9]{3,}.*"); //the 3 means 3 digitnumbers are too much + highRepetition.setPatternSyntax(QRegExp::RegExp); + + if (!autoTypeSyntax.exactMatch(m_autoTypeUi->sequenceEdit->text())) { + //@TODO handle wrong syntax + } + if (!highRepetition.exactMatch(m_autoTypeUi->sequenceEdit->text())) { + //@TODO handle too much repetition + } entry->setDefaultAutoTypeSequence(m_autoTypeUi->sequenceEdit->text()); } From d524aea779e97adcecd8184ab0ad0ca7deeab028 Mon Sep 17 00:00:00 2001 From: Marco <test@test.com> Date: Mon, 15 May 2017 11:42:13 +0200 Subject: [PATCH 184/402] Extended autotype syntax to allow all things in keepass2 --- src/autotype/AutoType.cpp | 5 +++-- src/gui/entry/EditEntryWidget.cpp | 33 ++++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp index fa6a5d853..f69431f9f 100644 --- a/src/autotype/AutoType.cpp +++ b/src/autotype/AutoType.cpp @@ -20,6 +20,7 @@ #include <QApplication> #include <QPluginLoader> +#include <iostream> #include "config-keepassx.h" @@ -396,7 +397,7 @@ QList<AutoTypeAction*> AutoType::createActionFromTemplate(const QString& tmpl, c QMessageBox::StandardButton reply; reply = QMessageBox::question(0, "AutoType", - "This AutoType command contains a very long delay. Do you really want to execute it?"); + tr("This AutoType command contains a very long delay. Do you really want to execute it?")); if (reply == QMessageBox::No) { return list; @@ -407,7 +408,7 @@ QList<AutoTypeAction*> AutoType::createActionFromTemplate(const QString& tmpl, c QMessageBox::StandardButton reply; reply = QMessageBox::question(0, "AutoType", - "This AutoType command contains arguments which are repeated very often. Do you really want to execute it?"); + tr("This AutoType command contains arguments which are repeated very often. Do you really want to execute it?")); if (reply == QMessageBox::No) { return list; diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index f8f3ab49a..7c612303f 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -31,6 +31,7 @@ #include <QTemporaryFile> #include <QMimeData> #include <QEvent> +#include <iostream> #include "core/Config.h" #include "core/Database.h" @@ -764,11 +765,41 @@ void EditEntryWidget::updateEntryData(Entry* entry) const entry->setDefaultAutoTypeSequence(QString()); } else { - QRegExp autoTypeSyntax("(\\{[A-Z]*(\\s[0-9]*){0,1}\\})*"); + //checks things like {word 23}{F1 23}{~ 23}{% 23}{^}{F12}{(}{) 23}{[}{[}{]}{Delay=23}{+}{-}~+%@fixedstring + + QString allowRepetition = "(\\s[0-9]*){0,1}"; + QString normalCommands = "[A-Z]*" + allowRepetition; + QString specialLiterals = "[\\^\\%\\(\\)~\\{\\}\\[\\]\\+-]" + allowRepetition; + QString functionKeys = "(F[1-9]" +allowRepetition + "|F1[0-2])" + allowRepetition; + QString numpad = "NUMPAD[0-9]" + allowRepetition; + QString delay = "DELAY=[0-9]+"; + QString beep = "BEEP\\s[0-9]*\\s[0-9]*"; + QString vkey = "VKEY-[EN]X" + allowRepetition; + + //these arent in parenthesis + QString shortcutKeys = "[\\^\\%~\\+@]"; + QString fixedStrings = "[^\\^\\%~\\+@\\{\\}]*"; + + QRegExp autoTypeSyntax + ("("+shortcutKeys + "|" + fixedStrings + "|\\{(" + normalCommands + "|" + specialLiterals + "|" + functionKeys + + "|" + numpad + "|" + delay + "|" + beep + "|" + vkey+")\\})*"); autoTypeSyntax.setCaseSensitivity(Qt::CaseInsensitive); autoTypeSyntax.setPatternSyntax(QRegExp::RegExp); + + //small test @TODO delete + if(autoTypeSyntax.exactMatch(QString("{word 23}{F1 23}{~ 23}{% 23}{^}{F12}{(}{) 23}{[}{[}{]}{Delay=23}{+}{-}~+%@fixeds{Beep 23 32}{Vkey-NX 34}"))) { + std::cout << "yes\n"; + } + if(autoTypeSyntax.exactMatch(QString("word 23}{F1 23}{~ 23}{% 23}{^}{F12}{(}{) 23}{[}{[}{]}{Delay=23}{+}{-}~+%@fixeds"))) { + std::cout << "no1\n"; + } + if(autoTypeSyntax.exactMatch(QString("{@}{F1 23}{~ 23}{% 23}{^}{F12}{(}{) 23}{[}{[}{]}{Delay=23}{+}{-}~+%@fixeds"))) { + std::cout << "no2\n"; + } + + //@TODO restrict repetition only on normal commands and delay QRegExp highRepetition(".*[0-9]{3,}.*"); //the 3 means 3 digitnumbers are too much highRepetition.setPatternSyntax(QRegExp::RegExp); From 2bf68b7970f8cd1e769ad2730a2831a6dea97342 Mon Sep 17 00:00:00 2001 From: Marco <test@test.com> Date: Mon, 15 May 2017 17:12:29 +0200 Subject: [PATCH 185/402] fix regular expressions for delays and repetition --- src/gui/entry/EditEntryWidget.cpp | 46 +++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index 7c612303f..45b62e110 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -770,43 +770,67 @@ void EditEntryWidget::updateEntryData(Entry* entry) const QString allowRepetition = "(\\s[0-9]*){0,1}"; QString normalCommands = "[A-Z]*" + allowRepetition; QString specialLiterals = "[\\^\\%\\(\\)~\\{\\}\\[\\]\\+-]" + allowRepetition; - QString functionKeys = "(F[1-9]" +allowRepetition + "|F1[0-2])" + allowRepetition; + QString functionKeys = "(F[1-9]" + allowRepetition + "|F1[0-2])" + allowRepetition; QString numpad = "NUMPAD[0-9]" + allowRepetition; QString delay = "DELAY=[0-9]+"; QString beep = "BEEP\\s[0-9]*\\s[0-9]*"; - QString vkey = "VKEY-[EN]X" + allowRepetition; + QString vkey = "VKEY(-[EN]X){0,1}" + allowRepetition; //these arent in parenthesis QString shortcutKeys = "[\\^\\%~\\+@]"; QString fixedStrings = "[^\\^\\%~\\+@\\{\\}]*"; QRegExp autoTypeSyntax - ("("+shortcutKeys + "|" + fixedStrings + "|\\{(" + normalCommands + "|" + specialLiterals + "|" + functionKeys - + "|" + numpad + "|" + delay + "|" + beep + "|" + vkey+")\\})*"); + ("(" + shortcutKeys + "|" + fixedStrings + "|\\{(" + normalCommands + "|" + specialLiterals + "|" + + functionKeys + + "|" + numpad + "|" + delay + "|" + beep + "|" + vkey + ")\\})*"); autoTypeSyntax.setCaseSensitivity(Qt::CaseInsensitive); autoTypeSyntax.setPatternSyntax(QRegExp::RegExp); + QRegExp highDelay(".*\\{Delay\\s[0-9]{5,}\\}.*"); //the 3 means 3 digitnumbers are too much + highDelay.setCaseSensitivity(Qt::CaseInsensitive); + highDelay.setPatternSyntax(QRegExp::RegExp); + + QRegExp highRepetition(".*\\s[0-9]{3,}.*"); + highRepetition.setPatternSyntax(QRegExp::RegExp); //small test @TODO delete - if(autoTypeSyntax.exactMatch(QString("{word 23}{F1 23}{~ 23}{% 23}{^}{F12}{(}{) 23}{[}{[}{]}{Delay=23}{+}{-}~+%@fixeds{Beep 23 32}{Vkey-NX 34}"))) { + if (autoTypeSyntax.exactMatch(QString( + "{word 23}{F1 23}{~ 23}{% 23}{^}{F12}{(}{) 23}{[}{[}{]}{Delay=23}{+}{-}~+%@fixeds{Beep 23 32}{Vkey-NX 34}"))) { std::cout << "yes\n"; } - if(autoTypeSyntax.exactMatch(QString("word 23}{F1 23}{~ 23}{% 23}{^}{F12}{(}{) 23}{[}{[}{]}{Delay=23}{+}{-}~+%@fixeds"))) { + if (autoTypeSyntax + .exactMatch(QString("word 23}{F1 23}{~ 23}{% 23}{^}{F12}{(}{) 23}{[}{[}{]}{Delay=23}{+}{-}~+%@fixeds"))) { std::cout << "no1\n"; } - if(autoTypeSyntax.exactMatch(QString("{@}{F1 23}{~ 23}{% 23}{^}{F12}{(}{) 23}{[}{[}{]}{Delay=23}{+}{-}~+%@fixeds"))) { + if (autoTypeSyntax + .exactMatch(QString("{@}{F1 23}{~ 23}{% 23}{^}{F12}{(}{) 23}{[}{[}{]}{Delay=23}{+}{-}~+%@fixeds"))) { std::cout << "no2\n"; } + if (highDelay.exactMatch("{asfd}{DELAY 10000}{dasf}")) { + std::cout << "yes1\n"; + } + if (highDelay.exactMatch("{asfd}{DELAY 1000}{dasf}")) { + std::cout << "no3\n"; + } + if (highRepetition.exactMatch("{asfd}{DELAY 100}{dasf}")) { + std::cout << "yes2\n"; + } + if (highRepetition.exactMatch("{asfd}{DELAY 10}{dasf}")) { + std::cout << "no4\n"; + } + + - //@TODO restrict repetition only on normal commands and delay - QRegExp highRepetition(".*[0-9]{3,}.*"); //the 3 means 3 digitnumbers are too much - highRepetition.setPatternSyntax(QRegExp::RegExp); if (!autoTypeSyntax.exactMatch(m_autoTypeUi->sequenceEdit->text())) { //@TODO handle wrong syntax } - if (!highRepetition.exactMatch(m_autoTypeUi->sequenceEdit->text())) { + else if (highDelay.exactMatch(m_autoTypeUi->sequenceEdit->text())) { + //@TODO handle too long delay + } + else if (highRepetition.exactMatch(m_autoTypeUi->sequenceEdit->text())) { //@TODO handle too much repetition } entry->setDefaultAutoTypeSequence(m_autoTypeUi->sequenceEdit->text()); From 70127bad4b5ab4a21d663ffd3929daceda9a7a5a Mon Sep 17 00:00:00 2001 From: Marco <test@test.com> Date: Mon, 15 May 2017 17:45:17 +0200 Subject: [PATCH 186/402] extract syntax checking methods as static methods to the Autotype class --- src/autotype/AutoType.cpp | 40 ++++++++++++++++++ src/autotype/AutoType.h | 4 ++ src/gui/entry/EditEntryWidget.cpp | 69 ++++--------------------------- 3 files changed, 51 insertions(+), 62 deletions(-) diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp index f69431f9f..021607382 100644 --- a/src/autotype/AutoType.cpp +++ b/src/autotype/AutoType.cpp @@ -692,3 +692,43 @@ bool AutoType::windowMatchesUrl(const QString& windowTitle, const QString& resol return false; } + +bool AutoType::checkSynatx(const QString &string) +{ + //checks things like {word 23}{F1 23}{~ 23}{% 23}{^}{F12}{(}{) 23}{[}{[}{]}{Delay=23}{+}{-}~+%@fixedstring + QString allowRepetition = "(\\s[0-9]*){0,1}"; + QString normalCommands = "[A-Z]*" + allowRepetition; + QString specialLiterals = "[\\^\\%\\(\\)~\\{\\}\\[\\]\\+-]" + allowRepetition; + QString functionKeys = "(F[1-9]" + allowRepetition + "|F1[0-2])" + allowRepetition; + QString numpad = "NUMPAD[0-9]" + allowRepetition; + QString delay = "DELAY=[0-9]+"; + QString beep = "BEEP\\s[0-9]*\\s[0-9]*"; + QString vkey = "VKEY(-[EN]X){0,1}" + allowRepetition; + + //these arent in parenthesis + QString shortcutKeys = "[\\^\\%~\\+@]"; + QString fixedStrings = "[^\\^\\%~\\+@\\{\\}]*"; + + QRegExp autoTypeSyntax + ("(" + shortcutKeys + "|" + fixedStrings + "|\\{(" + normalCommands + "|" + specialLiterals + "|" + + functionKeys + + "|" + numpad + "|" + delay + "|" + beep + "|" + vkey + ")\\})*"); + autoTypeSyntax.setCaseSensitivity(Qt::CaseInsensitive); + autoTypeSyntax.setPatternSyntax(QRegExp::RegExp); + return autoTypeSyntax.exactMatch(string); +} + +bool AutoType::checkHighDelay(const QString &string) +{ + QRegExp highDelay(".*\\{Delay\\s[0-9]{5,}\\}.*"); //the 3 means 3 digitnumbers are too much + highDelay.setCaseSensitivity(Qt::CaseInsensitive); + highDelay.setPatternSyntax(QRegExp::RegExp); + return highDelay.exactMatch(string); +} + +bool AutoType::checkHighRepetition(const QString &string) +{ + QRegExp highRepetition(".*\\s[0-9]{3,}.*"); + highRepetition.setPatternSyntax(QRegExp::RegExp); + return highRepetition.exactMatch(string); +} diff --git a/src/autotype/AutoType.h b/src/autotype/AutoType.h index e881975ac..f38c19f67 100644 --- a/src/autotype/AutoType.h +++ b/src/autotype/AutoType.h @@ -34,6 +34,7 @@ class AutoType : public QObject { Q_OBJECT + public: QStringList windowTitles(); void performAutoType(const Entry* entry, QWidget* hideWindow = nullptr, @@ -41,6 +42,9 @@ public: bool registerGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers); void unregisterGlobalShortcut(); int callEventFilter(void* event); + static bool checkSynatx(const QString &string); + static bool checkHighRepetition(const QString &string); + static bool checkHighDelay(const QString &string); inline bool isAvailable() { return m_plugin; diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index 45b62e110..cb04e9005 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -32,6 +32,7 @@ #include <QMimeData> #include <QEvent> #include <iostream> +#include <autotype/AutoType.h> #include "core/Config.h" #include "core/Database.h" @@ -765,73 +766,17 @@ void EditEntryWidget::updateEntryData(Entry* entry) const entry->setDefaultAutoTypeSequence(QString()); } else { - //checks things like {word 23}{F1 23}{~ 23}{% 23}{^}{F12}{(}{) 23}{[}{[}{]}{Delay=23}{+}{-}~+%@fixedstring - - QString allowRepetition = "(\\s[0-9]*){0,1}"; - QString normalCommands = "[A-Z]*" + allowRepetition; - QString specialLiterals = "[\\^\\%\\(\\)~\\{\\}\\[\\]\\+-]" + allowRepetition; - QString functionKeys = "(F[1-9]" + allowRepetition + "|F1[0-2])" + allowRepetition; - QString numpad = "NUMPAD[0-9]" + allowRepetition; - QString delay = "DELAY=[0-9]+"; - QString beep = "BEEP\\s[0-9]*\\s[0-9]*"; - QString vkey = "VKEY(-[EN]X){0,1}" + allowRepetition; - - //these arent in parenthesis - QString shortcutKeys = "[\\^\\%~\\+@]"; - QString fixedStrings = "[^\\^\\%~\\+@\\{\\}]*"; - - QRegExp autoTypeSyntax - ("(" + shortcutKeys + "|" + fixedStrings + "|\\{(" + normalCommands + "|" + specialLiterals + "|" - + functionKeys - + "|" + numpad + "|" + delay + "|" + beep + "|" + vkey + ")\\})*"); - autoTypeSyntax.setCaseSensitivity(Qt::CaseInsensitive); - autoTypeSyntax.setPatternSyntax(QRegExp::RegExp); - - QRegExp highDelay(".*\\{Delay\\s[0-9]{5,}\\}.*"); //the 3 means 3 digitnumbers are too much - highDelay.setCaseSensitivity(Qt::CaseInsensitive); - highDelay.setPatternSyntax(QRegExp::RegExp); - - QRegExp highRepetition(".*\\s[0-9]{3,}.*"); - highRepetition.setPatternSyntax(QRegExp::RegExp); - - - //small test @TODO delete - if (autoTypeSyntax.exactMatch(QString( - "{word 23}{F1 23}{~ 23}{% 23}{^}{F12}{(}{) 23}{[}{[}{]}{Delay=23}{+}{-}~+%@fixeds{Beep 23 32}{Vkey-NX 34}"))) { - std::cout << "yes\n"; - } - if (autoTypeSyntax - .exactMatch(QString("word 23}{F1 23}{~ 23}{% 23}{^}{F12}{(}{) 23}{[}{[}{]}{Delay=23}{+}{-}~+%@fixeds"))) { - std::cout << "no1\n"; - } - if (autoTypeSyntax - .exactMatch(QString("{@}{F1 23}{~ 23}{% 23}{^}{F12}{(}{) 23}{[}{[}{]}{Delay=23}{+}{-}~+%@fixeds"))) { - std::cout << "no2\n"; - } - if (highDelay.exactMatch("{asfd}{DELAY 10000}{dasf}")) { - std::cout << "yes1\n"; - } - if (highDelay.exactMatch("{asfd}{DELAY 1000}{dasf}")) { - std::cout << "no3\n"; - } - if (highRepetition.exactMatch("{asfd}{DELAY 100}{dasf}")) { - std::cout << "yes2\n"; - } - if (highRepetition.exactMatch("{asfd}{DELAY 10}{dasf}")) { - std::cout << "no4\n"; - } - - - - - if (!autoTypeSyntax.exactMatch(m_autoTypeUi->sequenceEdit->text())) { + if (!AutoType::checkSynatx(m_autoTypeUi->sequenceEdit->text())) { //@TODO handle wrong syntax + std::cout << "wrong syntax\n"; } - else if (highDelay.exactMatch(m_autoTypeUi->sequenceEdit->text())) { + else if (AutoType::checkHighDelay(m_autoTypeUi->sequenceEdit->text())) { //@TODO handle too long delay + std::cout << "too long delay\n"; } - else if (highRepetition.exactMatch(m_autoTypeUi->sequenceEdit->text())) { + else if (AutoType::checkHighRepetition(m_autoTypeUi->sequenceEdit->text())) { //@TODO handle too much repetition + std::cout << "too much repetition\n"; } entry->setDefaultAutoTypeSequence(m_autoTypeUi->sequenceEdit->text()); } From 7bb9ea201c1939e2d4d908daeb3320b5a5d05f9b Mon Sep 17 00:00:00 2001 From: Marco <test@test.com> Date: Mon, 15 May 2017 17:47:35 +0200 Subject: [PATCH 187/402] fix typo --- src/autotype/AutoType.cpp | 2 +- src/autotype/AutoType.h | 2 +- src/gui/entry/EditEntryWidget.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp index 021607382..ac3be5b90 100644 --- a/src/autotype/AutoType.cpp +++ b/src/autotype/AutoType.cpp @@ -693,7 +693,7 @@ bool AutoType::windowMatchesUrl(const QString& windowTitle, const QString& resol return false; } -bool AutoType::checkSynatx(const QString &string) +bool AutoType::checkSyntax(const QString &string) { //checks things like {word 23}{F1 23}{~ 23}{% 23}{^}{F12}{(}{) 23}{[}{[}{]}{Delay=23}{+}{-}~+%@fixedstring QString allowRepetition = "(\\s[0-9]*){0,1}"; diff --git a/src/autotype/AutoType.h b/src/autotype/AutoType.h index f38c19f67..92505b7de 100644 --- a/src/autotype/AutoType.h +++ b/src/autotype/AutoType.h @@ -42,7 +42,7 @@ public: bool registerGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers); void unregisterGlobalShortcut(); int callEventFilter(void* event); - static bool checkSynatx(const QString &string); + static bool checkSyntax(const QString &string); static bool checkHighRepetition(const QString &string); static bool checkHighDelay(const QString &string); diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index cb04e9005..f1bdc8145 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -766,7 +766,7 @@ void EditEntryWidget::updateEntryData(Entry* entry) const entry->setDefaultAutoTypeSequence(QString()); } else { - if (!AutoType::checkSynatx(m_autoTypeUi->sequenceEdit->text())) { + if (!AutoType::checkSyntax(m_autoTypeUi->sequenceEdit->text())) { //@TODO handle wrong syntax std::cout << "wrong syntax\n"; } From fbfc2e4d070fe9475fa08e94d68e27ea7b7658fb Mon Sep 17 00:00:00 2001 From: Marco <test@test.com> Date: Mon, 15 May 2017 21:06:14 +0200 Subject: [PATCH 188/402] create message boxes for saving editing autotypes statements, fix multiple messages problem on autotype execution You now get an error when you try to save incorrect autotype statements and warnings if you have high delays or much repetiton in your statement. Also you will now only get one warning if you want to perfom high delayed or often repeated statements. --- src/autotype/AutoType.cpp | 54 ++++++++++++++++--------------- src/gui/entry/EditEntryWidget.cpp | 35 ++++++++++++++++---- 2 files changed, 56 insertions(+), 33 deletions(-) diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp index ac3be5b90..4ad83b086 100644 --- a/src/autotype/AutoType.cpp +++ b/src/autotype/AutoType.cpp @@ -21,6 +21,7 @@ #include <QApplication> #include <QPluginLoader> #include <iostream> +#include <QtWidgets/QErrorMessage> #include "config-keepassx.h" @@ -328,8 +329,33 @@ bool AutoType::parseActions(const QString& sequence, const Entry* entry, QList<A m_autoTypeDelay = config()->get("AutoTypeDelay").toInt(); - for (const QChar& ch : sequence) { - if (inTmpl) { + if (!AutoType::checkSyntax(sequence)) { + QMessageBox messageBox; + messageBox.critical(0, "AutoType", tr("The Syntax of your AutoType statement is incorrect!")); + return false; + } + else if (AutoType::checkHighDelay(sequence)) { + QMessageBox::StandardButton reply; + reply = QMessageBox::question(0, + "AutoType", + tr("This AutoType command contains a very long delay. Do you really want to execute it?")); + + if (reply == QMessageBox::No) { + return false; + } + } + else if (AutoType::checkHighRepetition(sequence)) { + QMessageBox::StandardButton reply; + reply = QMessageBox::question(0, + "AutoType", + tr("This AutoType command contains arguments which are repeated very often. Do you really want to execute it?")); + + if (reply == QMessageBox::No) { + return false; + } + } + + for (const QChar &ch : sequence) { if (ch == '{') { qWarning("Syntax error in auto-type sequence."); return false; @@ -391,30 +417,6 @@ QList<AutoTypeAction*> AutoType::createActionFromTemplate(const QString& tmpl, c if (num == 0) { return list; } - // some safety checks - else if (tmplName.compare("delay",Qt::CaseInsensitive)==0) { - if (num > 10000) { - QMessageBox::StandardButton reply; - reply = QMessageBox::question(0, - "AutoType", - tr("This AutoType command contains a very long delay. Do you really want to execute it?")); - - if (reply == QMessageBox::No) { - return list; - } - } - } - else if (num > 100) { - QMessageBox::StandardButton reply; - reply = QMessageBox::question(0, - "AutoType", - tr("This AutoType command contains arguments which are repeated very often. Do you really want to execute it?")); - - if (reply == QMessageBox::No) { - return list; - } - - } } if (tmplName.compare("tab", Qt::CaseInsensitive) == 0) { diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index f1bdc8145..171590513 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -767,18 +767,39 @@ void EditEntryWidget::updateEntryData(Entry* entry) const } else { if (!AutoType::checkSyntax(m_autoTypeUi->sequenceEdit->text())) { - //@TODO handle wrong syntax - std::cout << "wrong syntax\n"; + //handle wrong syntax + QMessageBox messageBox; + messageBox.critical(0, + "AutoType", + tr("The Syntax of your AutoType statement is incorrect! It won't be saved!")); + } else if (AutoType::checkHighDelay(m_autoTypeUi->sequenceEdit->text())) { - //@TODO handle too long delay - std::cout << "too long delay\n"; + //handle too long delay + QMessageBox::StandardButton reply; + reply = QMessageBox::question(0, + "AutoType", + tr("This AutoType command contains a very long delay. Do you really want to save it?")); + + if (reply == QMessageBox::Yes) { + entry->setDefaultAutoTypeSequence(m_autoTypeUi->sequenceEdit->text()); + } } else if (AutoType::checkHighRepetition(m_autoTypeUi->sequenceEdit->text())) { - //@TODO handle too much repetition - std::cout << "too much repetition\n"; + //handle too much repetition + QMessageBox::StandardButton reply; + reply = QMessageBox::question(0, + "AutoType", + tr("This AutoType command contains arguments which are repeated very often. Do you really want to save it?")); + + if (reply == QMessageBox::Yes) { + entry->setDefaultAutoTypeSequence(m_autoTypeUi->sequenceEdit->text()); + } } - entry->setDefaultAutoTypeSequence(m_autoTypeUi->sequenceEdit->text()); + else { + entry->setDefaultAutoTypeSequence(m_autoTypeUi->sequenceEdit->text()); + } + } entry->autoTypeAssociations()->copyDataFrom(m_autoTypeAssoc); From a4bdc9a71d41a106396cbe3d42bffcb8de09147d Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Tue, 7 Nov 2017 14:07:47 +0100 Subject: [PATCH 189/402] fix syntax error --- src/autotype/AutoType.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp index 4ad83b086..74f68702c 100644 --- a/src/autotype/AutoType.cpp +++ b/src/autotype/AutoType.cpp @@ -356,13 +356,16 @@ bool AutoType::parseActions(const QString& sequence, const Entry* entry, QList<A } for (const QChar &ch : sequence) { + if (inTmpl) { if (ch == '{') { qWarning("Syntax error in auto-type sequence."); return false; } else if (ch == '}') { - QList<AutoTypeAction*> autoType = createActionFromTemplate(tmpl, entry); - if (autoType.isEmpty()) return false; + QList<AutoTypeAction *> autoType = createActionFromTemplate(tmpl, entry); + if (autoType.isEmpty()) { + return false; + } actions.append(autoType); inTmpl = false; tmpl.clear(); From 6057c9f27daff15f40a6ebb84192c00f428f12d6 Mon Sep 17 00:00:00 2001 From: Marco <test@test.com> Date: Mon, 15 May 2017 21:48:47 +0200 Subject: [PATCH 190/402] fix comments --- src/autotype/AutoType.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp index 74f68702c..400527963 100644 --- a/src/autotype/AutoType.cpp +++ b/src/autotype/AutoType.cpp @@ -725,7 +725,7 @@ bool AutoType::checkSyntax(const QString &string) bool AutoType::checkHighDelay(const QString &string) { - QRegExp highDelay(".*\\{Delay\\s[0-9]{5,}\\}.*"); //the 3 means 3 digitnumbers are too much + QRegExp highDelay(".*\\{Delay\\s[0-9]{5,}\\}.*"); //5 digit numbers(10 seconds) are too much highDelay.setCaseSensitivity(Qt::CaseInsensitive); highDelay.setPatternSyntax(QRegExp::RegExp); return highDelay.exactMatch(string); @@ -733,7 +733,7 @@ bool AutoType::checkHighDelay(const QString &string) bool AutoType::checkHighRepetition(const QString &string) { - QRegExp highRepetition(".*\\s[0-9]{3,}.*"); + QRegExp highRepetition(".*\\s[0-9]{3,}.*");//3 digit numbers are too much highRepetition.setPatternSyntax(QRegExp::RegExp); return highRepetition.exactMatch(string); } From 393017cf3bc58f49e43b52b8701f98296a087df2 Mon Sep 17 00:00:00 2001 From: Marco <test@test.com> Date: Tue, 16 May 2017 10:54:15 +0200 Subject: [PATCH 191/402] fix for loops now have diffrent variables. dont know why it worked before --- src/autotype/AutoType.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp index 400527963..0d76e3de9 100644 --- a/src/autotype/AutoType.cpp +++ b/src/autotype/AutoType.cpp @@ -581,8 +581,8 @@ QList<AutoTypeAction*> AutoType::createActionFromTemplate(const QString& tmpl, c //allows to insert usernames and passwords multiple times if (!list.isEmpty()) { for (int i = 1; i < num; i++) { - for (int i = 0; i < resolved.size(); i++) { - list.append(list.at(i)->clone()); + for (int j = 0; j < resolved.size(); j++) { + list.append(list.at(j)->clone()); } } } From 4893d997740a53dff068a72a4eefcf348ec7ed89 Mon Sep 17 00:00:00 2001 From: Marco <test@test.com> Date: Wed, 31 May 2017 21:23:33 +0200 Subject: [PATCH 192/402] move autotype syntax warning and error dialogs from AutoType to DatabaseWidget in the gui folder and replaced it with a checkSyntax call. this fixes part of why autotype test fails --- src/autotype/AutoType.cpp | 31 ++++--------------------------- src/gui/DatabaseWidget.cpp | 25 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp index 0d76e3de9..fbe64b456 100644 --- a/src/autotype/AutoType.cpp +++ b/src/autotype/AutoType.cpp @@ -145,6 +145,10 @@ void AutoType::performAutoType(const Entry* entry, QWidget* hideWindow, const QS sequence = customSequence; } + if (!checkSyntax(sequence)) { + return; + } + sequence.replace("{{}", "{LEFTBRACE}"); sequence.replace("{}}", "{RIGHTBRACE}"); @@ -328,33 +332,6 @@ bool AutoType::parseActions(const QString& sequence, const Entry* entry, QList<A bool inTmpl = false; m_autoTypeDelay = config()->get("AutoTypeDelay").toInt(); - - if (!AutoType::checkSyntax(sequence)) { - QMessageBox messageBox; - messageBox.critical(0, "AutoType", tr("The Syntax of your AutoType statement is incorrect!")); - return false; - } - else if (AutoType::checkHighDelay(sequence)) { - QMessageBox::StandardButton reply; - reply = QMessageBox::question(0, - "AutoType", - tr("This AutoType command contains a very long delay. Do you really want to execute it?")); - - if (reply == QMessageBox::No) { - return false; - } - } - else if (AutoType::checkHighRepetition(sequence)) { - QMessageBox::StandardButton reply; - reply = QMessageBox::question(0, - "AutoType", - tr("This AutoType command contains arguments which are repeated very often. Do you really want to execute it?")); - - if (reply == QMessageBox::No) { - return false; - } - } - for (const QChar &ch : sequence) { if (inTmpl) { if (ch == '{') { diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 1ef91a4fc..3fe403fc7 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -584,6 +584,31 @@ void DatabaseWidget::performAutoType() return; } + if (!AutoType::checkSyntax(currentEntry->effectiveAutoTypeSequence())) { + QMessageBox messageBox; + messageBox.critical(0, "AutoType", tr("The Syntax of your AutoType statement is incorrect!")); + return; + } + else if (AutoType::checkHighDelay(currentEntry->effectiveAutoTypeSequence())) { + QMessageBox::StandardButton reply; + reply = QMessageBox::question(0, + "AutoType", + tr("This AutoType command contains a very long delay. Do you really want to execute it?")); + + if (reply == QMessageBox::No) { + return; + } + } + else if (AutoType::checkHighRepetition(currentEntry->effectiveAutoTypeSequence())) { + QMessageBox::StandardButton reply; + reply = QMessageBox::question(0, + "AutoType", + tr("This AutoType command contains arguments which are repeated very often. Do you really want to execute it?")); + + if (reply == QMessageBox::No) { + return; + } + } autoType()->performAutoType(currentEntry, window()); } From 7ceac0539549d07a0f14e517f277f002c242495f Mon Sep 17 00:00:00 2001 From: Marco <test@test.com> Date: Wed, 31 May 2017 21:27:04 +0200 Subject: [PATCH 193/402] add support for custom commands. all autotype tests are getting passed now --- src/autotype/AutoType.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp index fbe64b456..e4618f749 100644 --- a/src/autotype/AutoType.cpp +++ b/src/autotype/AutoType.cpp @@ -679,7 +679,7 @@ bool AutoType::checkSyntax(const QString &string) { //checks things like {word 23}{F1 23}{~ 23}{% 23}{^}{F12}{(}{) 23}{[}{[}{]}{Delay=23}{+}{-}~+%@fixedstring QString allowRepetition = "(\\s[0-9]*){0,1}"; - QString normalCommands = "[A-Z]*" + allowRepetition; + QString normalCommands = "[A-Z:]*" + allowRepetition; //the ":" allows custom commands QString specialLiterals = "[\\^\\%\\(\\)~\\{\\}\\[\\]\\+-]" + allowRepetition; QString functionKeys = "(F[1-9]" + allowRepetition + "|F1[0-2])" + allowRepetition; QString numpad = "NUMPAD[0-9]" + allowRepetition; From 8ca444aee005dd37284d83591a6f3c18f5c2ef66 Mon Sep 17 00:00:00 2001 From: Marco <test@test.com> Date: Sat, 3 Jun 2017 12:32:46 +0200 Subject: [PATCH 194/402] add a method to perform the autotype sequence showing graphical dialogs Dialogs are show when the syntax of the autotype statement is wrong or contains long delays or statements which are repeated very often --- src/autotype/AutoType.cpp | 38 +++++++++++++++++++++++++++++++++++++- src/autotype/AutoType.h | 4 ++++ src/gui/DatabaseWidget.cpp | 35 +++++------------------------------ 3 files changed, 46 insertions(+), 31 deletions(-) diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp index e4618f749..319814a3e 100644 --- a/src/autotype/AutoType.cpp +++ b/src/autotype/AutoType.cpp @@ -252,7 +252,8 @@ void AutoType::performAutoTypeFromGlobal(Entry* entry, const QString& sequence) m_plugin->raiseWindow(m_windowFromGlobal); m_inAutoType = false; - performAutoType(entry, nullptr, sequence, m_windowFromGlobal); + + performAutoTypeWithSyntaxCheckingDialog(entry, nullptr, sequence, m_windowFromGlobal); } void AutoType::resetInAutoType() @@ -714,3 +715,38 @@ bool AutoType::checkHighRepetition(const QString &string) highRepetition.setPatternSyntax(QRegExp::RegExp); return highRepetition.exactMatch(string); } + +void +AutoType::performAutoTypeWithSyntaxCheckingDialog(const Entry *entry, + QWidget *hideWindow, + const QString &customSequence, + WId window) +{ + if (!AutoType::checkSyntax(entry->effectiveAutoTypeSequence())) { + QMessageBox messageBox; + messageBox.critical(0, "AutoType", tr("The Syntax of your AutoType statement is incorrect!")); + return; + } + else if (AutoType::checkHighDelay(entry->effectiveAutoTypeSequence())) { + QMessageBox::StandardButton reply; + reply = QMessageBox::question(0, + "AutoType", + tr("This AutoType command contains a very long delay. Do you really want to execute it?")); + + if (reply == QMessageBox::No) { + return; + } + } + else if (AutoType::checkHighRepetition(entry->effectiveAutoTypeSequence())) { + QMessageBox::StandardButton reply; + reply = QMessageBox::question(0, + "AutoType", + tr("This AutoType command contains arguments which are repeated very often. Do you really want to execute it?")); + + if (reply == QMessageBox::No) { + return; + } + } + performAutoType(entry, hideWindow, customSequence, window); + +} diff --git a/src/autotype/AutoType.h b/src/autotype/AutoType.h index 92505b7de..90d12a7f6 100644 --- a/src/autotype/AutoType.h +++ b/src/autotype/AutoType.h @@ -45,6 +45,10 @@ public: static bool checkSyntax(const QString &string); static bool checkHighRepetition(const QString &string); static bool checkHighDelay(const QString &string); + void performAutoTypeWithSyntaxCheckingDialog(const Entry *entry, + QWidget *hideWindow = nullptr, + const QString &customSequence = QString(), + WId window = 0); inline bool isAvailable() { return m_plugin; diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 3fe403fc7..3f5222e1d 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -584,32 +584,7 @@ void DatabaseWidget::performAutoType() return; } - if (!AutoType::checkSyntax(currentEntry->effectiveAutoTypeSequence())) { - QMessageBox messageBox; - messageBox.critical(0, "AutoType", tr("The Syntax of your AutoType statement is incorrect!")); - return; - } - else if (AutoType::checkHighDelay(currentEntry->effectiveAutoTypeSequence())) { - QMessageBox::StandardButton reply; - reply = QMessageBox::question(0, - "AutoType", - tr("This AutoType command contains a very long delay. Do you really want to execute it?")); - - if (reply == QMessageBox::No) { - return; - } - } - else if (AutoType::checkHighRepetition(currentEntry->effectiveAutoTypeSequence())) { - QMessageBox::StandardButton reply; - reply = QMessageBox::question(0, - "AutoType", - tr("This AutoType command contains arguments which are repeated very often. Do you really want to execute it?")); - - if (reply == QMessageBox::No) { - return; - } - } - autoType()->performAutoType(currentEntry, window()); + autoType()->performAutoTypeWithSyntaxCheckingDialog(currentEntry, window()); } void DatabaseWidget::openUrl() @@ -638,7 +613,7 @@ void DatabaseWidget::openUrlForEntry(Entry* entry) } return; } - + // otherwise ask user if (urlString.length() > 6) { QString cmdTruncated = urlString.mid(6); @@ -652,7 +627,7 @@ void DatabaseWidget::openUrlForEntry(Entry* entry) this ); msgbox.setDefaultButton(QMessageBox::No); - + QCheckBox* checkbox = new QCheckBox(tr("Remember my choice"), &msgbox); msgbox.setCheckBox(checkbox); bool remember = false; @@ -661,12 +636,12 @@ void DatabaseWidget::openUrlForEntry(Entry* entry) remember = true; } }); - + int result = msgbox.exec(); if (result == QMessageBox::Yes) { QProcess::startDetached(urlString.mid(6)); } - + if (remember) { entry->attributes()->set(EntryAttributes::RememberCmdExecAttr, result == QMessageBox::Yes ? "1" : "0"); From a02a49a1841aba425f6186e6e8b88470b3cdd008 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Tue, 7 Nov 2017 17:58:08 +0100 Subject: [PATCH 195/402] add test for syntax checking --- src/autotype/AutoType.cpp | 32 +++++++++++-------------------- src/autotype/AutoType.h | 8 +++----- src/gui/DatabaseWidget.cpp | 2 +- src/gui/entry/EditEntryWidget.cpp | 2 +- tests/TestAutoType.cpp | 15 +++++++++++++++ tests/TestAutoType.h | 1 + 6 files changed, 32 insertions(+), 28 deletions(-) diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp index 319814a3e..00cb8d512 100644 --- a/src/autotype/AutoType.cpp +++ b/src/autotype/AutoType.cpp @@ -130,7 +130,7 @@ QStringList AutoType::windowTitles() return m_plugin->windowTitles(); } -void AutoType::performAutoType(const Entry* entry, QWidget* hideWindow, const QString& customSequence, WId window) +void AutoType::_performAutoType(const Entry* entry, QWidget* hideWindow, const QString& customSequence, WId window) { if (m_inAutoType || !m_plugin) { return; @@ -253,7 +253,7 @@ void AutoType::performAutoTypeFromGlobal(Entry* entry, const QString& sequence) m_inAutoType = false; - performAutoTypeWithSyntaxCheckingDialog(entry, nullptr, sequence, m_windowFromGlobal); + performAutoType(entry, nullptr, sequence, m_windowFromGlobal); } void AutoType::resetInAutoType() @@ -556,14 +556,6 @@ QList<AutoTypeAction*> AutoType::createActionFromTemplate(const QString& tmpl, c } } - //allows to insert usernames and passwords multiple times - if (!list.isEmpty()) { - for (int i = 1; i < num; i++) { - for (int j = 0; j < resolved.size(); j++) { - list.append(list.at(j)->clone()); - } - } - } return list; } @@ -679,13 +671,13 @@ bool AutoType::windowMatchesUrl(const QString& windowTitle, const QString& resol bool AutoType::checkSyntax(const QString &string) { //checks things like {word 23}{F1 23}{~ 23}{% 23}{^}{F12}{(}{) 23}{[}{[}{]}{Delay=23}{+}{-}~+%@fixedstring - QString allowRepetition = "(\\s[0-9]*){0,1}"; + QString allowRepetition = "(\\s\\d*){0,1}"; QString normalCommands = "[A-Z:]*" + allowRepetition; //the ":" allows custom commands QString specialLiterals = "[\\^\\%\\(\\)~\\{\\}\\[\\]\\+-]" + allowRepetition; QString functionKeys = "(F[1-9]" + allowRepetition + "|F1[0-2])" + allowRepetition; - QString numpad = "NUMPAD[0-9]" + allowRepetition; - QString delay = "DELAY=[0-9]+"; - QString beep = "BEEP\\s[0-9]*\\s[0-9]*"; + QString numpad = "NUMPAD\\d" + allowRepetition; + QString delay = "DELAY=\\d+"; + QString beep = "BEEP\\s\\d*\\s\\d*"; QString vkey = "VKEY(-[EN]X){0,1}" + allowRepetition; //these arent in parenthesis @@ -703,7 +695,7 @@ bool AutoType::checkSyntax(const QString &string) bool AutoType::checkHighDelay(const QString &string) { - QRegExp highDelay(".*\\{Delay\\s[0-9]{5,}\\}.*"); //5 digit numbers(10 seconds) are too much + QRegExp highDelay("\\{DELAY\\s\\d{5,}\\}"); //5 digit numbers(10 seconds) are too much highDelay.setCaseSensitivity(Qt::CaseInsensitive); highDelay.setPatternSyntax(QRegExp::RegExp); return highDelay.exactMatch(string); @@ -711,16 +703,14 @@ bool AutoType::checkHighDelay(const QString &string) bool AutoType::checkHighRepetition(const QString &string) { - QRegExp highRepetition(".*\\s[0-9]{3,}.*");//3 digit numbers are too much + QRegExp highRepetition("\\{(?!DELAY\\s)\\w*\\s\\d{3,}\\}"); //3 digit numbers are too much + highRepetition.setCaseSensitivity(Qt::CaseInsensitive); highRepetition.setPatternSyntax(QRegExp::RegExp); return highRepetition.exactMatch(string); } void -AutoType::performAutoTypeWithSyntaxCheckingDialog(const Entry *entry, - QWidget *hideWindow, - const QString &customSequence, - WId window) +AutoType::performAutoType(const Entry *entry, QWidget *hideWindow, const QString &customSequence, WId window) { if (!AutoType::checkSyntax(entry->effectiveAutoTypeSequence())) { QMessageBox messageBox; @@ -747,6 +737,6 @@ AutoType::performAutoTypeWithSyntaxCheckingDialog(const Entry *entry, return; } } - performAutoType(entry, hideWindow, customSequence, window); + _performAutoType(entry, hideWindow, customSequence, window); } diff --git a/src/autotype/AutoType.h b/src/autotype/AutoType.h index 90d12a7f6..8aff7a947 100644 --- a/src/autotype/AutoType.h +++ b/src/autotype/AutoType.h @@ -37,7 +37,7 @@ class AutoType : public QObject public: QStringList windowTitles(); - void performAutoType(const Entry* entry, QWidget* hideWindow = nullptr, + void _performAutoType(const Entry* entry, QWidget* hideWindow = nullptr, const QString& customSequence = QString(), WId window = 0); bool registerGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers); void unregisterGlobalShortcut(); @@ -45,10 +45,8 @@ public: static bool checkSyntax(const QString &string); static bool checkHighRepetition(const QString &string); static bool checkHighDelay(const QString &string); - void performAutoTypeWithSyntaxCheckingDialog(const Entry *entry, - QWidget *hideWindow = nullptr, - const QString &customSequence = QString(), - WId window = 0); + void performAutoType(const Entry *entry, QWidget *hideWindow = nullptr, + const QString &customSequence = QString(), WId window = 0); inline bool isAvailable() { return m_plugin; diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 3f5222e1d..387d5d2a2 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -584,7 +584,7 @@ void DatabaseWidget::performAutoType() return; } - autoType()->performAutoTypeWithSyntaxCheckingDialog(currentEntry, window()); + autoType()->performAutoType(currentEntry, window()); } void DatabaseWidget::openUrl() diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index 171590513..fdb8aa142 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -32,8 +32,8 @@ #include <QMimeData> #include <QEvent> #include <iostream> -#include <autotype/AutoType.h> +#include "autotype/AutoType.h" #include "core/Config.h" #include "core/Database.h" #include "core/Entry.h" diff --git a/tests/TestAutoType.cpp b/tests/TestAutoType.cpp index acc2df61f..d1c09c263 100644 --- a/tests/TestAutoType.cpp +++ b/tests/TestAutoType.cpp @@ -282,3 +282,18 @@ void TestAutoType::testGlobalAutoTypeRegExp() QCOMPARE(m_test->actionChars(), QString("custom_attr_third")); m_test->clearActions(); } + +void TestAutoType::testAutoTypeSyntaxChecks() +{ + // Huge sequence + QCOMPARE(true, AutoType::checkSyntax("{word 23}{F1 23}{~ 23}{% 23}{^}{F12}{(}{) 23}{[}{[}{]}{Delay=23}{+}{-}~+%@fixedstring")); + // Bad sequence + QCOMPARE(false, AutoType::checkSyntax("{{{}}{}{}}{{}}")); + // High DelAY / low delay + QCOMPARE(true, AutoType::checkHighDelay("{DelAY 50000}")); + QCOMPARE(false, AutoType::checkHighDelay("{delay 50}")); + // Many repetition / few repetition / delay not repetition + QCOMPARE(true, AutoType::checkHighRepetition("{LEFT 50000000}")); + QCOMPARE(false, AutoType::checkHighRepetition("{SPACE 10}{TAB 3}{RIGHT 50}")); + QCOMPARE(false, AutoType::checkHighRepetition("{delay 5000000000}")); +} \ No newline at end of file diff --git a/tests/TestAutoType.h b/tests/TestAutoType.h index 0cd4a5bdd..b7c33823b 100644 --- a/tests/TestAutoType.h +++ b/tests/TestAutoType.h @@ -47,6 +47,7 @@ private slots: void testGlobalAutoTypeUrlSubdomainMatch(); void testGlobalAutoTypeTitleMatchDisabled(); void testGlobalAutoTypeRegExp(); + void testAutoTypeSyntaxChecks(); private: AutoTypePlatformInterface* m_platform; From 3d5ff723e99c99962d079fd0af02119bb28cbea5 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Wed, 8 Nov 2017 17:21:56 +0100 Subject: [PATCH 196/402] fix codestyle --- src/autotype/AutoType.cpp | 239 ++++++++++++++------------------------ src/autotype/AutoType.h | 25 ++-- 2 files changed, 104 insertions(+), 160 deletions(-) diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp index 00cb8d512..556dc2de5 100644 --- a/src/autotype/AutoType.cpp +++ b/src/autotype/AutoType.cpp @@ -20,8 +20,8 @@ #include <QApplication> #include <QPluginLoader> -#include <iostream> #include <QtWidgets/QErrorMessage> +#include <iostream> #include "config-keepassx.h" @@ -56,8 +56,7 @@ AutoType::AutoType(QObject* parent, bool test) QString pluginName = "keepassx-autotype-"; if (!test) { pluginName += QApplication::platformName(); - } - else { + } else { pluginName += "test"; } @@ -93,8 +92,7 @@ void AutoType::loadPlugin(const QString& pluginPath) if (m_plugin->isAvailable()) { m_executor = m_plugin->createExecutor(); connect(pluginInstance, SIGNAL(globalShortcutTriggered()), SIGNAL(globalShortcutTriggered())); - } - else { + } else { unloadPlugin(); } } @@ -140,8 +138,7 @@ void AutoType::_performAutoType(const Entry* entry, QWidget* hideWindow, const Q QString sequence; if (customSequence.isEmpty()) { sequence = autoTypeSequence(entry); - } - else { + } else { sequence = customSequence; } @@ -223,16 +220,14 @@ void AutoType::performGlobalAutoType(const QList<Database*>& dbList) message.append("\n\n"); message.append(windowTitle); MessageBox::information(nullptr, tr("Auto-Type - KeePassXC"), message); - } - else if ((entryList.size() == 1) && !config()->get("security/autotypeask").toBool()) { + } else if ((entryList.size() == 1) && !config()->get("security/autotypeask").toBool()) { m_inAutoType = false; performAutoType(entryList.first(), nullptr, sequenceHash[entryList.first()]); - } - else { + } else { m_windowFromGlobal = m_plugin->activeWindow(); AutoTypeSelectDialog* selectDialog = new AutoTypeSelectDialog(); - connect(selectDialog, SIGNAL(entryActivated(Entry*,QString)), - SLOT(performAutoTypeFromGlobal(Entry*,QString))); + connect( + selectDialog, SIGNAL(entryActivated(Entry*, QString)), SLOT(performAutoTypeFromGlobal(Entry*, QString))); connect(selectDialog, SIGNAL(rejected()), SLOT(resetInAutoType())); selectDialog->setEntries(entryList, sequenceHash); #if defined(Q_OS_MAC) @@ -301,12 +296,10 @@ bool AutoType::registerGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifie m_currentGlobalKey = key; m_currentGlobalModifiers = modifiers; return true; - } - else { + } else { return false; } - } - else { + } else { return true; } } @@ -333,33 +326,28 @@ bool AutoType::parseActions(const QString& sequence, const Entry* entry, QList<A bool inTmpl = false; m_autoTypeDelay = config()->get("AutoTypeDelay").toInt(); - for (const QChar &ch : sequence) { + for (const QChar& ch : sequence) { if (inTmpl) { if (ch == '{') { qWarning("Syntax error in auto-type sequence."); return false; - } - else if (ch == '}') { - QList<AutoTypeAction *> autoType = createActionFromTemplate(tmpl, entry); + } else if (ch == '}') { + QList<AutoTypeAction*> autoType = createActionFromTemplate(tmpl, entry); if (autoType.isEmpty()) { return false; } actions.append(autoType); inTmpl = false; tmpl.clear(); - } - else { + } else { tmpl += ch; } - } - else if (ch == '{') { + } else if (ch == '{') { inTmpl = true; - } - else if (ch == '}') { + } else if (ch == '}') { qWarning("Syntax error in auto-type sequence."); return false; - } - else { + } else { actions.append(new AutoTypeChar(ch)); } } @@ -402,104 +390,72 @@ QList<AutoTypeAction*> AutoType::createActionFromTemplate(const QString& tmpl, c if (tmplName.compare("tab", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_Tab)); - } - else if (tmplName.compare("enter", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare("enter", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_Enter)); - } - else if (tmplName.compare("space", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare("space", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_Space)); - } - else if (tmplName.compare("up", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare("up", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_Up)); - } - else if (tmplName.compare("down", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare("down", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_Down)); - } - else if (tmplName.compare("left", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare("left", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_Left)); - } - else if (tmplName.compare("right", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare("right", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_Right)); - } - else if (tmplName.compare("insert", Qt::CaseInsensitive) == 0 || - tmplName.compare("ins", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare("insert", Qt::CaseInsensitive) == 0 || + tmplName.compare("ins", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_Insert)); - } - else if (tmplName.compare("delete", Qt::CaseInsensitive) == 0 || - tmplName.compare("del", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare("delete", Qt::CaseInsensitive) == 0 || + tmplName.compare("del", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_Delete)); - } - else if (tmplName.compare("home", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare("home", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_Home)); - } - else if (tmplName.compare("end", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare("end", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_End)); - } - else if (tmplName.compare("pgup", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare("pgup", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_PageUp)); - } - else if (tmplName.compare("pgdown", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare("pgdown", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_PageDown)); - } - else if (tmplName.compare("backspace", Qt::CaseInsensitive) == 0 || - tmplName.compare("bs", Qt::CaseInsensitive) == 0 || - tmplName.compare("bksp", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare("backspace", Qt::CaseInsensitive) == 0 || + tmplName.compare("bs", Qt::CaseInsensitive) == 0 || tmplName.compare("bksp", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_Backspace)); - } - else if (tmplName.compare("break", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare("break", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_Pause)); - } - else if (tmplName.compare("capslock", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare("capslock", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_CapsLock)); - } - else if (tmplName.compare("esc", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare("esc", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_Escape)); - } - else if (tmplName.compare("help", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare("help", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_Help)); - } - else if (tmplName.compare("numlock", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare("numlock", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_NumLock)); - } - else if (tmplName.compare("ptrsc", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare("ptrsc", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_Print)); - } - else if (tmplName.compare("scrolllock", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare("scrolllock", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeKey(Qt::Key_ScrollLock)); } - // Qt doesn't know about keypad keys so use the normal ones instead - else if (tmplName.compare("add", Qt::CaseInsensitive) == 0 || - tmplName.compare("+", Qt::CaseInsensitive) == 0) { + // Qt doesn't know about keypad keys so use the normal ones instead + else if (tmplName.compare("add", Qt::CaseInsensitive) == 0 || tmplName.compare("+", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeChar('+')); - } - else if (tmplName.compare("subtract", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare("subtract", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeChar('-')); - } - else if (tmplName.compare("multiply", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare("multiply", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeChar('*')); - } - else if (tmplName.compare("divide", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare("divide", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeChar('/')); - } - else if (tmplName.compare("^", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare("^", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeChar('^')); - } - else if (tmplName.compare("%", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare("%", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeChar('%')); - } - else if (tmplName.compare("~", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare("~", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeChar('~')); - } - else if (tmplName.compare("(", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare("(", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeChar('(')); - } - else if (tmplName.compare(")", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare(")", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeChar(')')); - } - else if (tmplName.compare("leftbrace", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare("leftbrace", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeChar('{')); - } - else if (tmplName.compare("rightbrace", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare("rightbrace", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeChar('}')); } @@ -520,14 +476,11 @@ QList<AutoTypeAction*> AutoType::createActionFromTemplate(const QString& tmpl, c return list; } - if (tmplName.compare("delay", Qt::CaseInsensitive) == 0 && num > 0) { list.append(new AutoTypeDelay(num)); - } - else if (tmplName.compare("clearfield", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare("clearfield", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeClearField()); - } - else if (tmplName.compare("totp", Qt::CaseInsensitive) == 0) { + } else if (tmplName.compare("totp", Qt::CaseInsensitive) == 0) { QString totp = entry->totp(); if (!totp.isEmpty()) { for (const QChar& ch : totp) { @@ -546,11 +499,9 @@ QList<AutoTypeAction*> AutoType::createActionFromTemplate(const QString& tmpl, c for (const QChar& ch : resolved) { if (ch == '\n') { list.append(new AutoTypeKey(Qt::Key_Enter)); - } - else if (ch == '\t') { + } else if (ch == '\t') { list.append(new AutoTypeKey(Qt::Key_Tab)); - } - else { + } else { list.append(new AutoTypeChar(ch)); } } @@ -575,8 +526,7 @@ QString AutoType::autoTypeSequence(const Entry* entry, const QString& windowTitl if (windowMatches(windowTitle, window)) { if (!assoc.sequence.isEmpty()) { sequence = assoc.sequence; - } - else { + } else { sequence = entry->defaultAutoTypeSequence(); } match = true; @@ -584,14 +534,14 @@ QString AutoType::autoTypeSequence(const Entry* entry, const QString& windowTitl } } - if (!match && config()->get("AutoTypeEntryTitleMatch").toBool() - && windowMatchesTitle(windowTitle, entry->resolvePlaceholder(entry->title()))) { + if (!match && config()->get("AutoTypeEntryTitleMatch").toBool() && + windowMatchesTitle(windowTitle, entry->resolvePlaceholder(entry->title()))) { sequence = entry->defaultAutoTypeSequence(); match = true; } - if (!match && config()->get("AutoTypeEntryURLMatch").toBool() - && windowMatchesUrl(windowTitle, entry->resolvePlaceholder(entry->url()))) { + if (!match && config()->get("AutoTypeEntryURLMatch").toBool() && + windowMatchesUrl(windowTitle, entry->resolvePlaceholder(entry->url()))) { sequence = entry->defaultAutoTypeSequence(); match = true; } @@ -599,18 +549,16 @@ QString AutoType::autoTypeSequence(const Entry* entry, const QString& windowTitl if (!match) { return QString(); } - } - else { + } else { sequence = entry->defaultAutoTypeSequence(); } - const Group *group = entry->group(); + const Group* group = entry->group(); do { if (!enableSet) { if (group->autoTypeEnabled() == Group::Disable) { return QString(); - } - else if (group->autoTypeEnabled() == Group::Enable) { + } else if (group->autoTypeEnabled() == Group::Enable) { enableSet = true; } } @@ -622,15 +570,13 @@ QString AutoType::autoTypeSequence(const Entry* entry, const QString& windowTitl group = group->parentGroup(); } while (group && (!enableSet || sequence.isEmpty())); - if (sequence.isEmpty() && (!entry->resolvePlaceholder(entry->username()).isEmpty() - || !entry->resolvePlaceholder(entry->password()).isEmpty())) { + if (sequence.isEmpty() && (!entry->resolvePlaceholder(entry->username()).isEmpty() || + !entry->resolvePlaceholder(entry->password()).isEmpty())) { if (entry->resolvePlaceholder(entry->username()).isEmpty()) { sequence = "{PASSWORD}{ENTER}"; - } - else if (entry->resolvePlaceholder(entry->password()).isEmpty()) { + } else if (entry->resolvePlaceholder(entry->password()).isEmpty()) { sequence = "{USERNAME}{ENTER}"; - } - else { + } else { sequence = "{USERNAME}{TAB}{PASSWORD}{ENTER}"; } } @@ -643,8 +589,7 @@ bool AutoType::windowMatches(const QString& windowTitle, const QString& windowPa if (windowPattern.startsWith("//") && windowPattern.endsWith("//") && windowPattern.size() >= 4) { QRegExp regExp(windowPattern.mid(2, windowPattern.size() - 4), Qt::CaseInsensitive, QRegExp::RegExp2); return (regExp.indexIn(windowTitle) != -1); - } - else { + } else { return WildcardMatcher(windowTitle).match(windowPattern); } } @@ -668,11 +613,11 @@ bool AutoType::windowMatchesUrl(const QString& windowTitle, const QString& resol return false; } -bool AutoType::checkSyntax(const QString &string) +bool AutoType::checkSyntax(const QString& string) { - //checks things like {word 23}{F1 23}{~ 23}{% 23}{^}{F12}{(}{) 23}{[}{[}{]}{Delay=23}{+}{-}~+%@fixedstring + // checks things like {word 23}{F1 23}{~ 23}{% 23}{^}{F12}{(}{) 23}{[}{[}{]}{Delay=23}{+}{-}~+%@fixedstring QString allowRepetition = "(\\s\\d*){0,1}"; - QString normalCommands = "[A-Z:]*" + allowRepetition; //the ":" allows custom commands + QString normalCommands = "[A-Z:]*" + allowRepetition; // the ":" allows custom commands QString specialLiterals = "[\\^\\%\\(\\)~\\{\\}\\[\\]\\+-]" + allowRepetition; QString functionKeys = "(F[1-9]" + allowRepetition + "|F1[0-2])" + allowRepetition; QString numpad = "NUMPAD\\d" + allowRepetition; @@ -680,63 +625,57 @@ bool AutoType::checkSyntax(const QString &string) QString beep = "BEEP\\s\\d*\\s\\d*"; QString vkey = "VKEY(-[EN]X){0,1}" + allowRepetition; - //these arent in parenthesis + // these arent in parenthesis QString shortcutKeys = "[\\^\\%~\\+@]"; QString fixedStrings = "[^\\^\\%~\\+@\\{\\}]*"; - QRegExp autoTypeSyntax - ("(" + shortcutKeys + "|" + fixedStrings + "|\\{(" + normalCommands + "|" + specialLiterals + "|" - + functionKeys - + "|" + numpad + "|" + delay + "|" + beep + "|" + vkey + ")\\})*"); + QRegExp autoTypeSyntax("(" + shortcutKeys + "|" + fixedStrings + "|\\{(" + normalCommands + "|" + specialLiterals + + "|" + functionKeys + "|" + numpad + "|" + delay + "|" + beep + "|" + vkey + ")\\})*"); autoTypeSyntax.setCaseSensitivity(Qt::CaseInsensitive); autoTypeSyntax.setPatternSyntax(QRegExp::RegExp); return autoTypeSyntax.exactMatch(string); } -bool AutoType::checkHighDelay(const QString &string) +bool AutoType::checkHighDelay(const QString& string) { - QRegExp highDelay("\\{DELAY\\s\\d{5,}\\}"); //5 digit numbers(10 seconds) are too much + QRegExp highDelay("\\{DELAY\\s\\d{5,}\\}"); // 5 digit numbers(10 seconds) are too much highDelay.setCaseSensitivity(Qt::CaseInsensitive); highDelay.setPatternSyntax(QRegExp::RegExp); return highDelay.exactMatch(string); } -bool AutoType::checkHighRepetition(const QString &string) +bool AutoType::checkHighRepetition(const QString& string) { - QRegExp highRepetition("\\{(?!DELAY\\s)\\w*\\s\\d{3,}\\}"); //3 digit numbers are too much + QRegExp highRepetition("\\{(?!DELAY\\s)\\w*\\s\\d{3,}\\}"); // 3 digit numbers are too much highRepetition.setCaseSensitivity(Qt::CaseInsensitive); highRepetition.setPatternSyntax(QRegExp::RegExp); return highRepetition.exactMatch(string); } -void -AutoType::performAutoType(const Entry *entry, QWidget *hideWindow, const QString &customSequence, WId window) +void AutoType::performAutoType(const Entry* entry, QWidget* hideWindow, const QString& customSequence, WId window) { if (!AutoType::checkSyntax(entry->effectiveAutoTypeSequence())) { QMessageBox messageBox; - messageBox.critical(0, "AutoType", tr("The Syntax of your AutoType statement is incorrect!")); + messageBox.critical(0, tr("AutoType"), tr("The Syntax of your AutoType statement is incorrect!")); return; - } - else if (AutoType::checkHighDelay(entry->effectiveAutoTypeSequence())) { + } else if (AutoType::checkHighDelay(entry->effectiveAutoTypeSequence())) { QMessageBox::StandardButton reply; - reply = QMessageBox::question(0, - "AutoType", - tr("This AutoType command contains a very long delay. Do you really want to execute it?")); + reply = QMessageBox::question( + 0, + tr("AutoType"), + tr("This AutoType command contains a very long delay. Do you really want to execute it?")); if (reply == QMessageBox::No) { return; } - } - else if (AutoType::checkHighRepetition(entry->effectiveAutoTypeSequence())) { + } else if (AutoType::checkHighRepetition(entry->effectiveAutoTypeSequence())) { QMessageBox::StandardButton reply; - reply = QMessageBox::question(0, - "AutoType", - tr("This AutoType command contains arguments which are repeated very often. Do you really want to execute it?")); + reply = QMessageBox::question(0, tr("AutoType"), tr("This AutoType command contains arguments which are " + "repeated very often. Do you really want to execute it?")); if (reply == QMessageBox::No) { return; } } _performAutoType(entry, hideWindow, customSequence, window); - } diff --git a/src/autotype/AutoType.h b/src/autotype/AutoType.h index 8aff7a947..9c3685b55 100644 --- a/src/autotype/AutoType.h +++ b/src/autotype/AutoType.h @@ -34,21 +34,25 @@ class AutoType : public QObject { Q_OBJECT - public: QStringList windowTitles(); - void _performAutoType(const Entry* entry, QWidget* hideWindow = nullptr, - const QString& customSequence = QString(), WId window = 0); + void _performAutoType(const Entry* entry, + QWidget* hideWindow = nullptr, + const QString& customSequence = QString(), + WId window = 0); bool registerGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers); void unregisterGlobalShortcut(); int callEventFilter(void* event); - static bool checkSyntax(const QString &string); - static bool checkHighRepetition(const QString &string); - static bool checkHighDelay(const QString &string); - void performAutoType(const Entry *entry, QWidget *hideWindow = nullptr, - const QString &customSequence = QString(), WId window = 0); + static bool checkSyntax(const QString& string); + static bool checkHighRepetition(const QString& string); + static bool checkHighDelay(const QString& string); + void performAutoType(const Entry* entry, + QWidget* hideWindow = nullptr, + const QString& customSequence = QString(), + WId window = 0); - inline bool isAvailable() { + inline bool isAvailable() + { return m_plugin; } @@ -91,7 +95,8 @@ private: Q_DISABLE_COPY(AutoType) }; -inline AutoType* autoType() { +inline AutoType* autoType() +{ return AutoType::instance(); } From 203960b4b51837e1a73edb8f00794b1ae0778ed7 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Thu, 30 Nov 2017 15:11:24 +0100 Subject: [PATCH 197/402] rename to executeAutoType --- src/autotype/AutoType.cpp | 4 ++-- src/autotype/AutoType.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp index 556dc2de5..fc098afd3 100644 --- a/src/autotype/AutoType.cpp +++ b/src/autotype/AutoType.cpp @@ -128,7 +128,7 @@ QStringList AutoType::windowTitles() return m_plugin->windowTitles(); } -void AutoType::_performAutoType(const Entry* entry, QWidget* hideWindow, const QString& customSequence, WId window) +void AutoType::executeAutoType(const Entry* entry, QWidget* hideWindow, const QString& customSequence, WId window) { if (m_inAutoType || !m_plugin) { return; @@ -677,5 +677,5 @@ void AutoType::performAutoType(const Entry* entry, QWidget* hideWindow, const QS return; } } - _performAutoType(entry, hideWindow, customSequence, window); + executeAutoType(entry, hideWindow, customSequence, window); } diff --git a/src/autotype/AutoType.h b/src/autotype/AutoType.h index 9c3685b55..f800ab1e6 100644 --- a/src/autotype/AutoType.h +++ b/src/autotype/AutoType.h @@ -36,7 +36,7 @@ class AutoType : public QObject public: QStringList windowTitles(); - void _performAutoType(const Entry* entry, + void executeAutoType(const Entry* entry, QWidget* hideWindow = nullptr, const QString& customSequence = QString(), WId window = 0); From e8030760632f224a85c6b9c19ff890d2811847ee Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Thu, 28 Dec 2017 14:12:17 +0100 Subject: [PATCH 198/402] improve regex filtering --- src/autotype/AutoType.cpp | 121 ++++++++++++++++++------------ src/autotype/AutoType.h | 4 +- src/gui/entry/EditEntryWidget.cpp | 33 +------- tests/TestAutoType.cpp | 12 +++ 4 files changed, 88 insertions(+), 82 deletions(-) diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp index fc098afd3..a3d8b0533 100644 --- a/src/autotype/AutoType.cpp +++ b/src/autotype/AutoType.cpp @@ -20,8 +20,7 @@ #include <QApplication> #include <QPluginLoader> -#include <QtWidgets/QErrorMessage> -#include <iostream> +#include <QRegularExpression> #include "config-keepassx.h" @@ -128,7 +127,7 @@ QStringList AutoType::windowTitles() return m_plugin->windowTitles(); } -void AutoType::executeAutoType(const Entry* entry, QWidget* hideWindow, const QString& customSequence, WId window) +void AutoType::executeAutoTypeActions(const Entry* entry, QWidget* hideWindow, const QString& customSequence, WId window) { if (m_inAutoType || !m_plugin) { return; @@ -457,9 +456,7 @@ QList<AutoTypeAction*> AutoType::createActionFromTemplate(const QString& tmpl, c list.append(new AutoTypeChar('{')); } else if (tmplName.compare("rightbrace", Qt::CaseInsensitive) == 0) { list.append(new AutoTypeChar('}')); - } - - else { + } else { QRegExp fnRegexp("f(\\d+)", Qt::CaseInsensitive, QRegExp::RegExp2); if (fnRegexp.exactMatch(tmplName)) { int fnNo = fnRegexp.cap(1).toInt(); @@ -615,67 +612,93 @@ bool AutoType::windowMatchesUrl(const QString& windowTitle, const QString& resol bool AutoType::checkSyntax(const QString& string) { - // checks things like {word 23}{F1 23}{~ 23}{% 23}{^}{F12}{(}{) 23}{[}{[}{]}{Delay=23}{+}{-}~+%@fixedstring - QString allowRepetition = "(\\s\\d*){0,1}"; - QString normalCommands = "[A-Z:]*" + allowRepetition; // the ":" allows custom commands + QString allowRepetition = "(?:\\s\\d+)?"; + // the ":" allows custom commands with syntax S:Field + // exclude BEEP otherwise will be checked as valid + QString normalCommands = "(?!BEEP\\s)[A-Z:]*" + allowRepetition; QString specialLiterals = "[\\^\\%\\(\\)~\\{\\}\\[\\]\\+-]" + allowRepetition; - QString functionKeys = "(F[1-9]" + allowRepetition + "|F1[0-2])" + allowRepetition; + QString functionKeys = "(?:F[1-9]" + allowRepetition + "|F1[0-2])" + allowRepetition; QString numpad = "NUMPAD\\d" + allowRepetition; QString delay = "DELAY=\\d+"; - QString beep = "BEEP\\s\\d*\\s\\d*"; - QString vkey = "VKEY(-[EN]X){0,1}" + allowRepetition; + QString beep = "BEEP\\s\\d+\\s\\d+"; + QString vkey = "VKEY(?:-[EN]X)?\\s\\w+"; - // these arent in parenthesis + // these chars aren't in parentheses QString shortcutKeys = "[\\^\\%~\\+@]"; + // a normal string not in parentheses QString fixedStrings = "[^\\^\\%~\\+@\\{\\}]*"; - QRegExp autoTypeSyntax("(" + shortcutKeys + "|" + fixedStrings + "|\\{(" + normalCommands + "|" + specialLiterals + - "|" + functionKeys + "|" + numpad + "|" + delay + "|" + beep + "|" + vkey + ")\\})*"); - autoTypeSyntax.setCaseSensitivity(Qt::CaseInsensitive); - autoTypeSyntax.setPatternSyntax(QRegExp::RegExp); - return autoTypeSyntax.exactMatch(string); + QRegularExpression autoTypeSyntax("^(?:" + shortcutKeys + "|" + fixedStrings + "|\\{(?:" + normalCommands + "|" + specialLiterals + + "|" + functionKeys + "|" + numpad + "|" + delay + "|" + beep + "|" + vkey + ")\\})*$", + QRegularExpression::CaseInsensitiveOption); + QRegularExpressionMatch match = autoTypeSyntax.match(string); + return match.hasMatch(); } bool AutoType::checkHighDelay(const QString& string) { - QRegExp highDelay("\\{DELAY\\s\\d{5,}\\}"); // 5 digit numbers(10 seconds) are too much - highDelay.setCaseSensitivity(Qt::CaseInsensitive); - highDelay.setPatternSyntax(QRegExp::RegExp); - return highDelay.exactMatch(string); + // 5 digit numbers(10 seconds) are too much + QRegularExpression highDelay("\\{DELAY\\s\\d{5,}\\}", QRegularExpression::CaseInsensitiveOption); + QRegularExpressionMatch match = highDelay.match(string); + return match.hasMatch(); +} + +bool AutoType::checkSlowKeypress(const QString& string) +{ + // 3 digit numbers(100 milliseconds) are too much + QRegularExpression slowKeypress("\\{DELAY=\\d{3,}\\}", QRegularExpression::CaseInsensitiveOption); + QRegularExpressionMatch match = slowKeypress.match(string); + return match.hasMatch(); } bool AutoType::checkHighRepetition(const QString& string) { - QRegExp highRepetition("\\{(?!DELAY\\s)\\w*\\s\\d{3,}\\}"); // 3 digit numbers are too much - highRepetition.setCaseSensitivity(Qt::CaseInsensitive); - highRepetition.setPatternSyntax(QRegExp::RegExp); - return highRepetition.exactMatch(string); + // 3 digit numbers are too much + QRegularExpression highRepetition("\\{(?!DELAY\\s)\\w+\\s\\d{3,}\\}", QRegularExpression::CaseInsensitiveOption); + QRegularExpressionMatch match = highRepetition.match(string); + return match.hasMatch(); } +bool AutoType::verifyAutoTypeSyntax(const QString& sequence) +{ + if (!AutoType::checkSyntax(sequence)) { + QMessageBox messageBox; + messageBox.critical(0, tr("Auto-Type"), tr("The Syntax of your AutoType statement is incorrect!")); + return false; + } else if (AutoType::checkHighDelay(sequence)) { + QMessageBox::StandardButton reply; + reply = QMessageBox::question(0, tr("Auto-Type"), + tr("This AutoType command contains a very long delay. Do you really want to proceed?")); + + if (reply == QMessageBox::No) { + return false; + } + } else if (AutoType::checkSlowKeypress(sequence)) { + QMessageBox::StandardButton reply; + reply = QMessageBox::question(0, tr("Auto-Type"), + tr("This AutoType command contains very slow key-press. Do you really want to proceed?")); + + if (reply == QMessageBox::No) { + return false; + } + } else if (AutoType::checkHighRepetition(sequence)) { + QMessageBox::StandardButton reply; + reply = QMessageBox::question(0, tr("Auto-Type"), + tr("This AutoType command contains arguments which are " + "repeated very often. Do you really want to proceed?")); + + if (reply == QMessageBox::No) { + return false; + } + } + return true; +} + + void AutoType::performAutoType(const Entry* entry, QWidget* hideWindow, const QString& customSequence, WId window) { - if (!AutoType::checkSyntax(entry->effectiveAutoTypeSequence())) { - QMessageBox messageBox; - messageBox.critical(0, tr("AutoType"), tr("The Syntax of your AutoType statement is incorrect!")); - return; - } else if (AutoType::checkHighDelay(entry->effectiveAutoTypeSequence())) { - QMessageBox::StandardButton reply; - reply = QMessageBox::question( - 0, - tr("AutoType"), - tr("This AutoType command contains a very long delay. Do you really want to execute it?")); - - if (reply == QMessageBox::No) { - return; - } - } else if (AutoType::checkHighRepetition(entry->effectiveAutoTypeSequence())) { - QMessageBox::StandardButton reply; - reply = QMessageBox::question(0, tr("AutoType"), tr("This AutoType command contains arguments which are " - "repeated very often. Do you really want to execute it?")); - - if (reply == QMessageBox::No) { - return; - } + auto sequence = entry->effectiveAutoTypeSequence(); + if (verifyAutoTypeSyntax(sequence)) { + executeAutoTypeActions(entry, hideWindow, customSequence, window); } - executeAutoType(entry, hideWindow, customSequence, window); } diff --git a/src/autotype/AutoType.h b/src/autotype/AutoType.h index f800ab1e6..eb366ae9c 100644 --- a/src/autotype/AutoType.h +++ b/src/autotype/AutoType.h @@ -36,7 +36,7 @@ class AutoType : public QObject public: QStringList windowTitles(); - void executeAutoType(const Entry* entry, + void executeAutoTypeActions(const Entry* entry, QWidget* hideWindow = nullptr, const QString& customSequence = QString(), WId window = 0); @@ -45,7 +45,9 @@ public: int callEventFilter(void* event); static bool checkSyntax(const QString& string); static bool checkHighRepetition(const QString& string); + static bool checkSlowKeypress(const QString& string); static bool checkHighDelay(const QString& string); + static bool verifyAutoTypeSyntax(const QString& sequence); void performAutoType(const Entry* entry, QWidget* hideWindow = nullptr, const QString& customSequence = QString(), diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index fdb8aa142..2c65d3ec8 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -766,40 +766,9 @@ void EditEntryWidget::updateEntryData(Entry* entry) const entry->setDefaultAutoTypeSequence(QString()); } else { - if (!AutoType::checkSyntax(m_autoTypeUi->sequenceEdit->text())) { - //handle wrong syntax - QMessageBox messageBox; - messageBox.critical(0, - "AutoType", - tr("The Syntax of your AutoType statement is incorrect! It won't be saved!")); - - } - else if (AutoType::checkHighDelay(m_autoTypeUi->sequenceEdit->text())) { - //handle too long delay - QMessageBox::StandardButton reply; - reply = QMessageBox::question(0, - "AutoType", - tr("This AutoType command contains a very long delay. Do you really want to save it?")); - - if (reply == QMessageBox::Yes) { - entry->setDefaultAutoTypeSequence(m_autoTypeUi->sequenceEdit->text()); - } - } - else if (AutoType::checkHighRepetition(m_autoTypeUi->sequenceEdit->text())) { - //handle too much repetition - QMessageBox::StandardButton reply; - reply = QMessageBox::question(0, - "AutoType", - tr("This AutoType command contains arguments which are repeated very often. Do you really want to save it?")); - - if (reply == QMessageBox::Yes) { - entry->setDefaultAutoTypeSequence(m_autoTypeUi->sequenceEdit->text()); - } - } - else { + if (AutoType::verifyAutoTypeSyntax(m_autoTypeUi->sequenceEdit->text())) { entry->setDefaultAutoTypeSequence(m_autoTypeUi->sequenceEdit->text()); } - } entry->autoTypeAssociations()->copyDataFrom(m_autoTypeAssoc); diff --git a/tests/TestAutoType.cpp b/tests/TestAutoType.cpp index d1c09c263..da245d8cb 100644 --- a/tests/TestAutoType.cpp +++ b/tests/TestAutoType.cpp @@ -287,11 +287,23 @@ void TestAutoType::testAutoTypeSyntaxChecks() { // Huge sequence QCOMPARE(true, AutoType::checkSyntax("{word 23}{F1 23}{~ 23}{% 23}{^}{F12}{(}{) 23}{[}{[}{]}{Delay=23}{+}{-}~+%@fixedstring")); + + QCOMPARE(true, AutoType::checkSyntax("{NUMPAD1 3}")); + + QCOMPARE(true, AutoType::checkSyntax("{BEEP 3 3}")); + QCOMPARE(false, AutoType::checkSyntax("{BEEP 3}")); + + QCOMPARE(true, AutoType::checkSyntax("{VKEY 0x01}")); + QCOMPARE(true, AutoType::checkSyntax("{VKEY VK_LBUTTON}")); + QCOMPARE(true, AutoType::checkSyntax("{VKEY-EX 0x01}")); // Bad sequence QCOMPARE(false, AutoType::checkSyntax("{{{}}{}{}}{{}}")); // High DelAY / low delay QCOMPARE(true, AutoType::checkHighDelay("{DelAY 50000}")); QCOMPARE(false, AutoType::checkHighDelay("{delay 50}")); + // Slow typing + QCOMPARE(true, AutoType::checkSlowKeypress("{DelAY=50000}")); + QCOMPARE(false, AutoType::checkSlowKeypress("{delay=50}")); // Many repetition / few repetition / delay not repetition QCOMPARE(true, AutoType::checkHighRepetition("{LEFT 50000000}")); QCOMPARE(false, AutoType::checkHighRepetition("{SPACE 10}{TAB 3}{RIGHT 50}")); From 6d046f251ef214c11b8794604d7eebd82ccfa4b7 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Sat, 30 Dec 2017 14:16:18 +0100 Subject: [PATCH 199/402] Remove minus since it's an invalid literal --- src/autotype/AutoType.cpp | 2 +- src/gui/entry/EditEntryWidget.cpp | 1 - tests/TestAutoType.cpp | 6 +++++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp index a3d8b0533..2df3b4f1e 100644 --- a/src/autotype/AutoType.cpp +++ b/src/autotype/AutoType.cpp @@ -616,7 +616,7 @@ bool AutoType::checkSyntax(const QString& string) // the ":" allows custom commands with syntax S:Field // exclude BEEP otherwise will be checked as valid QString normalCommands = "(?!BEEP\\s)[A-Z:]*" + allowRepetition; - QString specialLiterals = "[\\^\\%\\(\\)~\\{\\}\\[\\]\\+-]" + allowRepetition; + QString specialLiterals = "[\\^\\%\\(\\)~\\{\\}\\[\\]\\+]" + allowRepetition; QString functionKeys = "(?:F[1-9]" + allowRepetition + "|F1[0-2])" + allowRepetition; QString numpad = "NUMPAD\\d" + allowRepetition; QString delay = "DELAY=\\d+"; diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index 2c65d3ec8..707d2f6d2 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -31,7 +31,6 @@ #include <QTemporaryFile> #include <QMimeData> #include <QEvent> -#include <iostream> #include "autotype/AutoType.h" #include "core/Config.h" diff --git a/tests/TestAutoType.cpp b/tests/TestAutoType.cpp index da245d8cb..2f980e546 100644 --- a/tests/TestAutoType.cpp +++ b/tests/TestAutoType.cpp @@ -286,7 +286,7 @@ void TestAutoType::testGlobalAutoTypeRegExp() void TestAutoType::testAutoTypeSyntaxChecks() { // Huge sequence - QCOMPARE(true, AutoType::checkSyntax("{word 23}{F1 23}{~ 23}{% 23}{^}{F12}{(}{) 23}{[}{[}{]}{Delay=23}{+}{-}~+%@fixedstring")); + QCOMPARE(true, AutoType::checkSyntax("{word 23}{F1 23}{~ 23}{% 23}{^}{F12}{(}{) 23}{[}{[}{]}{Delay=23}{+}{SUBTRACT}~+%@fixedstring")); QCOMPARE(true, AutoType::checkSyntax("{NUMPAD1 3}")); @@ -298,6 +298,10 @@ void TestAutoType::testAutoTypeSyntaxChecks() QCOMPARE(true, AutoType::checkSyntax("{VKEY-EX 0x01}")); // Bad sequence QCOMPARE(false, AutoType::checkSyntax("{{{}}{}{}}{{}}")); + // Good sequence + QCOMPARE(true, AutoType::checkSyntax("{{}{}}{}}{{}")); + QCOMPARE(true, AutoType::checkSyntax("{]}{[}{[}{]}")); + QCOMPARE(true, AutoType::checkSyntax("{)}{(}{(}{)}")); // High DelAY / low delay QCOMPARE(true, AutoType::checkHighDelay("{DelAY 50000}")); QCOMPARE(false, AutoType::checkHighDelay("{delay 50}")); From 7b9b23b1430c81cc9157336fa7fdfa65b340f387 Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Tue, 5 Dec 2017 09:44:01 +0200 Subject: [PATCH 200/402] Implement drag&drop support in main form to open database files --- src/gui/MainWindow.cpp | 38 ++++++++++++++++++++++++++++++++++++++ src/gui/MainWindow.h | 4 ++++ 2 files changed, 42 insertions(+) diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index bc7b3a89e..2715a3df5 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -114,6 +114,8 @@ MainWindow::MainWindow() { m_ui->setupUi(this); + setAcceptDrops(true); + m_ui->toolBar->setContextMenuPolicy(Qt::PreventContextMenu); // Setup the search widget in the toolbar @@ -997,3 +999,39 @@ void MainWindow::handleScreenLock() lockDatabasesAfterInactivity(); } } + +QStringList MainWindow::kdbxFilesFromUrls(const QList<QUrl>& urls) +{ + QStringList kdbxFiles; + for (const QUrl& url: urls) { + const QFileInfo fInfo(url.toLocalFile()); + const bool isKdbxFile = fInfo.isFile() && fInfo.suffix().toLower() == "kdbx"; + if (isKdbxFile) { + kdbxFiles.append(fInfo.absoluteFilePath()); + } + } + + return kdbxFiles; +} + +void MainWindow::dragEnterEvent(QDragEnterEvent* event) +{ + const QMimeData* mimeData = event->mimeData(); + if (mimeData->hasUrls()) { + const QStringList kdbxFiles = kdbxFilesFromUrls(mimeData->urls()); + if (!kdbxFiles.isEmpty()) { + event->acceptProposedAction(); + } + } +} + +void MainWindow::dropEvent(QDropEvent* event) +{ + const QMimeData* mimeData = event->mimeData(); + if (mimeData->hasUrls()) { + const QStringList kdbxFiles = kdbxFilesFromUrls(mimeData->urls()); + for(const QString &kdbxFile: kdbxFiles) { + openDatabase(kdbxFile); + } + } +} diff --git a/src/gui/MainWindow.h b/src/gui/MainWindow.h index ade339c56..bb18e170a 100644 --- a/src/gui/MainWindow.h +++ b/src/gui/MainWindow.h @@ -107,6 +107,10 @@ private: void updateTrayIcon(); bool isTrayIconEnabled() const; + static QStringList kdbxFilesFromUrls(const QList<QUrl>& urls); + void dragEnterEvent(QDragEnterEvent* event) override; + void dropEvent(QDropEvent* event) override; + const QScopedPointer<Ui::MainWindow> m_ui; SignalMultiplexer m_actionMultiplexer; QAction* m_clearHistoryAction; From 165d664524b375bcba26696fed5e2f942a18d481 Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Tue, 5 Dec 2017 17:25:08 +0200 Subject: [PATCH 201/402] Pass (using IPC) command line filenames to already running instance --- src/gui/Application.cpp | 108 ++++++++++++++++++++++++++++++++-------- src/gui/Application.h | 7 +++ src/gui/MainWindow.cpp | 17 ++++--- src/gui/MainWindow.h | 1 + src/main.cpp | 61 +++++++++++------------ 5 files changed, 136 insertions(+), 58 deletions(-) diff --git a/src/gui/Application.cpp b/src/gui/Application.cpp index 98ae83a6c..48cd0d8d7 100644 --- a/src/gui/Application.cpp +++ b/src/gui/Application.cpp @@ -22,13 +22,15 @@ #include "core/Config.h" #include <QAbstractNativeEventFilter> +#include <QFileInfo> #include <QFileOpenEvent> -#include <QSocketNotifier> #include <QLockFile> +#include <QSocketNotifier> #include <QStandardPaths> #include <QtNetwork/QLocalSocket> #include "autotype/AutoType.h" +#include "core/Global.h" #if defined(Q_OS_UNIX) #include <signal.h> @@ -36,6 +38,11 @@ #include <sys/socket.h> #endif +namespace { +constexpr int WaitTimeoutMSec = 150; +const char BlockSizeProperty[] = "blockSize"; +} + #if defined(Q_OS_UNIX) && !defined(Q_OS_OSX) class XcbEventFilter : public QAbstractNativeEventFilter { @@ -105,8 +112,8 @@ Application::Application(int& argc, char** argv) // In DEBUG mode don't interfere with Release instances identifier += "-DEBUG"; #endif - QString socketName = identifier + ".socket"; QString lockName = identifier + ".lock"; + m_socketName = identifier + ".socket"; // According to documentation we should use RuntimeLocation on *nixes, but even Qt doesn't respect // this and creates sockets in TempLocation, so let's be consistent. @@ -114,20 +121,22 @@ Application::Application(int& argc, char** argv) m_lockFile->setStaleLockTime(0); m_lockFile->tryLock(); + m_lockServer.setSocketOptions(QLocalServer::UserAccessOption); + connect(&m_lockServer, SIGNAL(newConnection()), this, SIGNAL(anotherInstanceStarted())); + connect(&m_lockServer, SIGNAL(newConnection()), this, SLOT(processIncomingConnection())); + switch (m_lockFile->error()) { case QLockFile::NoError: // No existing lock was found, start listener - m_lockServer.setSocketOptions(QLocalServer::UserAccessOption); - m_lockServer.listen(socketName); - connect(&m_lockServer, SIGNAL(newConnection()), this, SIGNAL(anotherInstanceStarted())); + m_lockServer.listen(m_socketName); break; case QLockFile::LockFailedError: { if (config()->get("SingleInstance").toBool()) { // Attempt to connect to the existing instance QLocalSocket client; - for (int i = 0; i < 3; i++) { - client.connectToServer(socketName); - if (client.waitForConnected(150)) { + for (int i = 0; i < 3; ++i) { + client.connectToServer(m_socketName); + if (client.waitForConnected(WaitTimeoutMSec)) { // Connection succeeded, this will raise the existing window if minimized client.abort(); m_alreadyRunning = true; @@ -145,9 +154,7 @@ Application::Application(int& argc, char** argv) m_lockFile->removeStaleLockFile(); m_lockFile->tryLock(); // start the listen server - m_lockServer.setSocketOptions(QLocalServer::UserAccessOption); - m_lockServer.listen(socketName); - connect(&m_lockServer, SIGNAL(newConnection()), this, SIGNAL(anotherInstanceStarted())); + m_lockServer.listen(m_socketName); } } break; @@ -187,12 +194,8 @@ bool Application::event(QEvent* event) } #ifdef Q_OS_MAC // restore main window when clicking on the docker icon - else if ((event->type() == QEvent::ApplicationActivate) && m_mainWindow) { - m_mainWindow->ensurePolished(); - m_mainWindow->setWindowState(m_mainWindow->windowState() & ~Qt::WindowMinimized); - m_mainWindow->show(); - m_mainWindow->raise(); - m_mainWindow->activateWindow(); + else if (event->type() == QEvent::ApplicationActivate) { + emit applicationActivated(); } #endif @@ -247,12 +250,54 @@ void Application::quitBySignal() m_unixSignalNotifier->setEnabled(false); char buf; Q_UNUSED(::read(unixSignalSocket[1], &buf, sizeof(buf))); - - if (nullptr != m_mainWindow) - static_cast<MainWindow*>(m_mainWindow)->appExit(); + emit quitSignalReceived(); } #endif +void Application::processIncomingConnection() +{ + if (m_lockServer.hasPendingConnections()) { + QLocalSocket* socket = m_lockServer.nextPendingConnection(); + socket->setProperty(BlockSizeProperty, 0); + connect(socket, SIGNAL(readyRead()), this, SLOT(socketReadyRead())); + } +} + +void Application::socketReadyRead() +{ + QLocalSocket* socket = qobject_cast<QLocalSocket*>(sender()); + if (!socket) { + return; + } + + QDataStream in(socket); + in.setVersion(QDataStream::Qt_5_0); + + int blockSize = socket->property(BlockSizeProperty).toInt(); + if (blockSize == 0) { + // Relies on the fact that QDataStream format streams a quint32 into sizeof(quint32) bytes + if (socket->bytesAvailable() < qint64(sizeof(quint32))) { + return; + } + in >> blockSize; + } + + if (socket->bytesAvailable() < blockSize || in.atEnd()) { + socket->setProperty(BlockSizeProperty, blockSize); + return; + } + + QStringList fileNames; + in >> fileNames; + for (const QString& fileName: asConst(fileNames)) { + const QFileInfo fInfo(fileName); + if (fInfo.isFile() && fInfo.suffix().toLower() == "kdbx") { + emit openFile(fileName); + } + } + socket->deleteLater(); +} + bool Application::isAlreadyRunning() const { #ifdef QT_DEBUG @@ -262,3 +307,26 @@ bool Application::isAlreadyRunning() const return config()->get("SingleInstance").toBool() && m_alreadyRunning; } +bool Application::sendFileNamesToRunningInstance(const QStringList& fileNames) +{ + QLocalSocket client; + client.connectToServer(m_socketName); + const bool connected = client.waitForConnected(WaitTimeoutMSec); + if (!connected) { + return false; + } + + QByteArray data; + QDataStream out(&data, QIODevice::WriteOnly); + out.setVersion(QDataStream::Qt_5_0); + out << quint32(0) + << fileNames; + out.device()->seek(0); + out << quint32(data.size() - sizeof(quint32)); + + const bool writeOk = client.write(data) != -1 && client.waitForBytesWritten(WaitTimeoutMSec); + client.disconnectFromServer(); + const bool disconnected = client.waitForDisconnected(WaitTimeoutMSec); + return writeOk && disconnected; +} + diff --git a/src/gui/Application.h b/src/gui/Application.h index 670342ca4..1f5759368 100644 --- a/src/gui/Application.h +++ b/src/gui/Application.h @@ -39,14 +39,20 @@ public: bool event(QEvent* event) override; bool isAlreadyRunning() const; + bool sendFileNamesToRunningInstance(const QStringList& fileNames); + signals: void openFile(const QString& filename); void anotherInstanceStarted(); + void applicationActivated(); + void quitSignalReceived(); private slots: #if defined(Q_OS_UNIX) void quitBySignal(); #endif + void processIncomingConnection(); + void socketReadyRead(); private: QWidget* m_mainWindow; @@ -63,6 +69,7 @@ private: bool m_alreadyRunning; QLockFile* m_lockFile; QLocalServer m_lockServer; + QString m_socketName; }; #endif // KEEPASSX_APPLICATION_H diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 2715a3df5..718eb1c61 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -881,11 +881,7 @@ void MainWindow::toggleWindow() if ((QApplication::activeWindow() == this) && isVisible() && !isMinimized()) { hideWindow(); } else { - ensurePolished(); - setWindowState(windowState() & ~Qt::WindowMinimized); - show(); - raise(); - activateWindow(); + bringToFront(); #if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(QT_NO_DBUS) && (QT_VERSION < QT_VERSION_CHECK(5, 9, 0)) // re-register global D-Bus menu (needed on Ubuntu with Unity) @@ -993,6 +989,15 @@ void MainWindow::hideYubiKeyPopup() setEnabled(true); } +void MainWindow::bringToFront() +{ + ensurePolished(); + setWindowState(windowState() & ~Qt::WindowMinimized); + show(); + raise(); + activateWindow(); +} + void MainWindow::handleScreenLock() { if (config()->get("security/lockdatabasescreenlock").toBool()){ @@ -1030,7 +1035,7 @@ void MainWindow::dropEvent(QDropEvent* event) const QMimeData* mimeData = event->mimeData(); if (mimeData->hasUrls()) { const QStringList kdbxFiles = kdbxFilesFromUrls(mimeData->urls()); - for(const QString &kdbxFile: kdbxFiles) { + for (const QString& kdbxFile: kdbxFiles) { openDatabase(kdbxFile); } } diff --git a/src/gui/MainWindow.h b/src/gui/MainWindow.h index bb18e170a..b70dd9072 100644 --- a/src/gui/MainWindow.h +++ b/src/gui/MainWindow.h @@ -61,6 +61,7 @@ public slots: void hideGlobalMessage(); void showYubiKeyPopup(); void hideYubiKeyPopup(); + void bringToFront(); protected: void closeEvent(QCloseEvent* event) override; diff --git a/src/main.cpp b/src/main.cpp index c3b1c6987..82331f072 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -57,22 +57,6 @@ int main(int argc, char** argv) // don't set organizationName as that changes the return value of // QStandardPaths::writableLocation(QDesktopServices::DataLocation) - if (app.isAlreadyRunning()) { - qWarning() << QCoreApplication::translate("Main", "Another instance of KeePassXC is already running.").toUtf8().constData(); - return 0; - } - - QApplication::setQuitOnLastWindowClosed(false); - - if (!Crypto::init()) { - QString error = QCoreApplication::translate("Main", - "Fatal error while testing the cryptographic functions."); - error.append("\n"); - error.append(Crypto::errorString()); - MessageBox::critical(nullptr, QCoreApplication::translate("Main", "KeePassXC - Error"), error); - return 1; - } - QCommandLineParser parser; parser.setApplicationDescription(QCoreApplication::translate("main", "KeePassXC - cross-platform password manager")); parser.addPositionalArgument("filename", QCoreApplication::translate("main", "filenames of the password databases to open (*.kdbx)"), "[filename(s)]"); @@ -93,7 +77,26 @@ int main(int argc, char** argv) parser.addOption(pwstdinOption); parser.process(app); - const QStringList args = parser.positionalArguments(); + const QStringList fileNames = parser.positionalArguments(); + + if (app.isAlreadyRunning()) { + if (!fileNames.isEmpty()) { + app.sendFileNamesToRunningInstance(fileNames); + } + qWarning() << QCoreApplication::translate("Main", "Another instance of KeePassXC is already running.").toUtf8().constData(); + return 0; + } + + QApplication::setQuitOnLastWindowClosed(false); + + if (!Crypto::init()) { + QString error = QCoreApplication::translate("Main", + "Fatal error while testing the cryptographic functions."); + error.append("\n"); + error.append(Crypto::errorString()); + MessageBox::critical(nullptr, QCoreApplication::translate("Main", "KeePassXC - Error"), error); + return 1; + } if (parser.isSet(configOption)) { Config::createConfigFromFile(parser.value(configOption)); @@ -109,15 +112,10 @@ int main(int argc, char** argv) MainWindow mainWindow; app.setMainWindow(&mainWindow); - QObject::connect(&app, &Application::anotherInstanceStarted, - [&]() { - mainWindow.ensurePolished(); - mainWindow.setWindowState(mainWindow.windowState() & ~Qt::WindowMinimized); - mainWindow.show(); - mainWindow.raise(); - mainWindow.activateWindow(); - }); + QObject::connect(&app, SIGNAL(anotherInstanceStarted()), &mainWindow, SLOT(bringToFront())); + QObject::connect(&app, SIGNAL(applicationActivated()), &mainWindow, SLOT(bringToFront())); QObject::connect(&app, SIGNAL(openFile(QString)), &mainWindow, SLOT(openDatabase(QString))); + QObject::connect(&app, SIGNAL(quitSignalReceived()), &mainWindow, SLOT(appExit()), Qt::DirectConnection); // start minimized if configured bool minimizeOnStartup = config()->get("GUI/MinimizeOnStartup").toBool(); @@ -130,20 +128,19 @@ int main(int argc, char** argv) } if (config()->get("OpenPreviousDatabasesOnStartup").toBool()) { - const QStringList filenames = config()->get("LastOpenedDatabases").toStringList(); - for (int ii = filenames.size()-1; ii >= 0; ii--) { - QString filename = filenames.at(ii); + const QStringList fileNames = config()->get("LastOpenedDatabases").toStringList(); + for (const QString& filename: fileNames) { if (!filename.isEmpty() && QFile::exists(filename)) { - mainWindow.openDatabase(filename, QString(), QString()); + mainWindow.openDatabase(filename); } } } - for (int ii=0; ii < args.length(); ii++) { - QString filename = args[ii]; + const bool pwstdin = parser.isSet(pwstdinOption); + for (const QString& filename: fileNames) { if (!filename.isEmpty() && QFile::exists(filename)) { QString password; - if (parser.isSet(pwstdinOption)) { + if (pwstdin) { static QTextStream in(stdin, QIODevice::ReadOnly); password = in.readLine(); } From 3720c5ef7900539abb76c7d3925b142d4894c09f Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Fri, 22 Dec 2017 20:05:33 +0200 Subject: [PATCH 202/402] Add test for drag and drop database files into main window --- src/gui/MainWindow.cpp | 3 +++ tests/gui/TestGui.cpp | 37 +++++++++++++++++++++++++++++++++++++ tests/gui/TestGui.h | 1 + 3 files changed, 41 insertions(+) diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 718eb1c61..72be3a4aa 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -1035,6 +1035,9 @@ void MainWindow::dropEvent(QDropEvent* event) const QMimeData* mimeData = event->mimeData(); if (mimeData->hasUrls()) { const QStringList kdbxFiles = kdbxFilesFromUrls(mimeData->urls()); + if (!kdbxFiles.isEmpty()) { + event->acceptProposedAction(); + } for (const QString& kdbxFile: kdbxFiles) { openDatabase(kdbxFile); } diff --git a/tests/gui/TestGui.cpp b/tests/gui/TestGui.cpp index 664bfd654..17b2736cc 100644 --- a/tests/gui/TestGui.cpp +++ b/tests/gui/TestGui.cpp @@ -952,6 +952,43 @@ void TestGui::testDatabaseLocking() QCOMPARE(m_tabWidget->tabText(0).remove('&'), origDbName); } +void TestGui::testDragAndDropKdbxFiles() +{ + const int openedDatabasesCount = m_tabWidget->count(); + + const QString badDatabaseFilePath(QString(KEEPASSX_TEST_DATA_DIR).append("/NotDatabase.notkdbx")); + QMimeData badMimeData; + badMimeData.setUrls({QUrl::fromLocalFile(badDatabaseFilePath)}); + QDragEnterEvent badDragEvent(QPoint(1, 1), Qt::LinkAction, &badMimeData, Qt::LeftButton, Qt::NoModifier); + qApp->notify(m_mainWindow, &badDragEvent); + QCOMPARE(badDragEvent.isAccepted(), false); + + QDropEvent badDropEvent(QPoint(1, 1), Qt::LinkAction, &badMimeData, Qt::LeftButton, Qt::NoModifier); + qApp->notify(m_mainWindow, &badDropEvent); + QCOMPARE(badDropEvent.isAccepted(), false); + + QCOMPARE(m_tabWidget->count(), openedDatabasesCount); + + const QString goodDatabaseFilePath(QString(KEEPASSX_TEST_DATA_DIR).append("/NewDatabase.kdbx")); + QMimeData goodMimeData; + goodMimeData.setUrls({QUrl::fromLocalFile(goodDatabaseFilePath)}); + QDragEnterEvent goodDragEvent(QPoint(1, 1), Qt::LinkAction, &goodMimeData, Qt::LeftButton, Qt::NoModifier); + qApp->notify(m_mainWindow, &goodDragEvent); + QCOMPARE(goodDragEvent.isAccepted(), true); + + QDropEvent goodDropEvent(QPoint(1, 1), Qt::LinkAction, &goodMimeData, Qt::LeftButton, Qt::NoModifier); + qApp->notify(m_mainWindow, &goodDropEvent); + QCOMPARE(goodDropEvent.isAccepted(), true); + + QCOMPARE(m_tabWidget->count(), openedDatabasesCount + 1); + + MessageBox::setNextAnswer(QMessageBox::No); + triggerAction("actionDatabaseClose"); + Tools::wait(100); + + QCOMPARE(m_tabWidget->count(), openedDatabasesCount); +} + void TestGui::cleanupTestCase() { delete m_mainWindow; diff --git a/tests/gui/TestGui.h b/tests/gui/TestGui.h index 5ec8237b3..1a2b24e74 100644 --- a/tests/gui/TestGui.h +++ b/tests/gui/TestGui.h @@ -60,6 +60,7 @@ private slots: void testDatabaseSettings(); void testKeePass1Import(); void testDatabaseLocking(); + void testDragAndDropKdbxFiles(); private: int addCannedEntries(); From 506057d20283ee69de4219bffea26d2609cd6809 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Wed, 3 Jan 2018 20:18:45 +0100 Subject: [PATCH 203/402] undefine FORTIFY_SOURCE before trying to define it. In case it's already defined by the distro --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a92f018f5..77f4d8624 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -129,7 +129,7 @@ endif() string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER) if (CMAKE_BUILD_TYPE_LOWER MATCHES "(release|relwithdebinfo|minsizerel)") - add_gcc_compiler_flags("-D_FORTIFY_SOURCE=2") + add_gcc_compiler_flags("-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2") endif() check_c_compiler_flag("-Werror=format-security -Werror=implicit-function-declaration" WERROR_C_AVAILABLE) From 06518c57361f366d7d4b00fc9cb441dae57174c5 Mon Sep 17 00:00:00 2001 From: varjolintu <sami.vanttinen@protonmail.com> Date: Tue, 12 Dec 2017 10:15:23 +0200 Subject: [PATCH 204/402] keepassxc-browser --- CMakeLists.txt | 4 + Dockerfile | 6 +- INSTALL.md | 12 +- README.md | 45 +- cmake/Findsodium.cmake | 267 ++++++++ snapcraft.yaml | 3 +- src/CMakeLists.txt | 31 + src/browser/BrowserAccessControlDialog.cpp | 59 ++ src/browser/BrowserAccessControlDialog.h | 48 ++ src/browser/BrowserAccessControlDialog.ui | 69 ++ src/browser/BrowserAction.cpp | 546 +++++++++++++++ src/browser/BrowserAction.h | 97 +++ src/browser/BrowserClients.cpp | 77 +++ src/browser/BrowserClients.h | 56 ++ src/browser/BrowserEntryConfig.cpp | 109 +++ src/browser/BrowserEntryConfig.h | 60 ++ src/browser/BrowserOptionDialog.cpp | 104 +++ src/browser/BrowserOptionDialog.h | 50 ++ src/browser/BrowserOptionDialog.ui | 327 +++++++++ src/browser/BrowserService.cpp | 734 +++++++++++++++++++++ src/browser/BrowserService.h | 82 +++ src/browser/BrowserSettings.cpp | 377 +++++++++++ src/browser/BrowserSettings.h | 105 +++ src/browser/CMakeLists.txt | 37 ++ src/browser/HostInstaller.cpp | 230 +++++++ src/browser/HostInstaller.h | 63 ++ src/browser/NativeMessagingBase.cpp | 141 ++++ src/browser/NativeMessagingBase.h | 61 ++ src/browser/NativeMessagingHost.cpp | 200 ++++++ src/browser/NativeMessagingHost.h | 67 ++ src/browser/Variant.cpp | 37 ++ src/browser/Variant.h | 25 + src/config-keepassx.h.cmake | 1 + src/core/PassphraseGenerator.cpp | 13 +- src/core/PassphraseGenerator.h | 3 +- src/gui/AboutDialog.cpp | 3 + src/gui/MainWindow.cpp | 57 ++ src/gui/PasswordGeneratorWidget.cpp | 5 +- src/main.cpp | 15 +- src/proxy/CMakeLists.txt | 34 + src/proxy/NativeMessagingHost.cpp | 95 +++ src/proxy/NativeMessagingHost.h | 43 ++ src/proxy/keepassxc-proxy.cpp | 66 ++ 43 files changed, 4422 insertions(+), 42 deletions(-) create mode 100644 cmake/Findsodium.cmake create mode 100755 src/browser/BrowserAccessControlDialog.cpp create mode 100755 src/browser/BrowserAccessControlDialog.h create mode 100755 src/browser/BrowserAccessControlDialog.ui create mode 100755 src/browser/BrowserAction.cpp create mode 100755 src/browser/BrowserAction.h create mode 100755 src/browser/BrowserClients.cpp create mode 100755 src/browser/BrowserClients.h create mode 100644 src/browser/BrowserEntryConfig.cpp create mode 100644 src/browser/BrowserEntryConfig.h create mode 100755 src/browser/BrowserOptionDialog.cpp create mode 100755 src/browser/BrowserOptionDialog.h create mode 100755 src/browser/BrowserOptionDialog.ui create mode 100644 src/browser/BrowserService.cpp create mode 100644 src/browser/BrowserService.h create mode 100755 src/browser/BrowserSettings.cpp create mode 100755 src/browser/BrowserSettings.h create mode 100755 src/browser/CMakeLists.txt create mode 100644 src/browser/HostInstaller.cpp create mode 100644 src/browser/HostInstaller.h create mode 100644 src/browser/NativeMessagingBase.cpp create mode 100644 src/browser/NativeMessagingBase.h create mode 100755 src/browser/NativeMessagingHost.cpp create mode 100755 src/browser/NativeMessagingHost.h create mode 100644 src/browser/Variant.cpp create mode 100644 src/browser/Variant.h create mode 100755 src/proxy/CMakeLists.txt create mode 100755 src/proxy/NativeMessagingHost.cpp create mode 100755 src/proxy/NativeMessagingHost.h create mode 100644 src/proxy/keepassxc-proxy.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 77f4d8624..1d5c198ee 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -44,6 +44,7 @@ option(WITH_XC_AUTOTYPE "Include Auto-Type." ON) option(WITH_XC_HTTP "Include KeePassHTTP and Custom Icon Downloads." OFF) option(WITH_XC_YUBIKEY "Include YubiKey support." OFF) option(WITH_XC_SSHAGENT "Include SSH agent support." OFF) +option(WITH_XC_BROWSER "Include browser extension support." OFF) # Process ui files automatically from source files set(CMAKE_AUTOUIC ON) @@ -200,11 +201,13 @@ endif() if(MINGW) set(CLI_INSTALL_DIR ".") + set(PROXY_INSTALL_DIR ".") set(BIN_INSTALL_DIR ".") set(PLUGIN_INSTALL_DIR ".") set(DATA_INSTALL_DIR "share") elseif(APPLE AND WITH_APP_BUNDLE) set(CLI_INSTALL_DIR "/usr/local/bin") + set(PROXY_INSTALL_DIR "/usr/local/bin") set(BIN_INSTALL_DIR ".") set(PLUGIN_INSTALL_DIR "${PROGNAME}.app/Contents/PlugIns") set(DATA_INSTALL_DIR "${PROGNAME}.app/Contents/Resources") @@ -212,6 +215,7 @@ else() include(GNUInstallDirs) set(CLI_INSTALL_DIR "${CMAKE_INSTALL_BINDIR}") + set(PROXY_INSTALL_DIR "${CMAKE_INSTALL_BINDIR}") set(BIN_INSTALL_DIR "${CMAKE_INSTALL_BINDIR}") set(PLUGIN_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/keepassxc") set(DATA_INSTALL_DIR "${CMAKE_INSTALL_DATADIR}/keepassxc") diff --git a/Dockerfile b/Dockerfile index 66ecb4c04..c8c637c07 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,7 +25,8 @@ RUN set -x \ RUN set -x \ && add-apt-repository ppa:beineri/opt-qt${QT5_PPA_VERSION}-trusty \ - && add-apt-repository ppa:phoerious/keepassxc + && add-apt-repository ppa:phoerious/keepassxc \ + && LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php RUN set -x \ && apt-get update -y \ @@ -46,7 +47,8 @@ RUN set -x \ libxtst-dev \ mesa-common-dev \ libyubikey-dev \ - libykpers-1-dev + libykpers-1-dev \ + libsodium-dev ENV CMAKE_PREFIX_PATH=/opt/qt${QT5_VERSION}/lib/cmake ENV LD_LIBRARY_PATH=/opt/qt${QT5_VERSION}/lib diff --git a/INSTALL.md b/INSTALL.md index 2d3f7cb2b..0bfa86b2c 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -6,7 +6,7 @@ You can visit the online version of this document at the following link: https://github.com/keepassxreboot/keepassx/wiki/Install-Instruction-from-Source -The [KeePassXC QuickStart](./docs/QUICKSTART.md) gets you started using KeePassXC on your +The [KeePassXC QuickStart](./docs/QUICKSTART.md) gets you started using KeePassXC on your Windows, Mac, or Linux computer using the pre-built binaries. Build Dependencies @@ -25,6 +25,7 @@ The following libraries are required: * zlib * libmicrohttpd * libxi, libxtst, qtx11extras (optional for auto-type on X11) +* libsodium (>= 1.0.12, optional for keepassxc-browser support) Prepare the Building Environment @@ -40,7 +41,7 @@ Build Steps To compile from source, open a **Terminal (on Linux/MacOS)** or a **MSYS2-MinGW shell (on Windows)**<br/> **Note:** on Windows make sure you are using a **MINGW shell** by checking the label before the current path -First, download the KeePassXC [source tarball](https://keepassxc.org/download#source) +First, download the KeePassXC [source tarball](https://keepassxc.org/download#source) or check out the latest version from our [Git repository](https://github.com/keepassxreboot/keepassxc). To clone the project from Git, `cd` to a suitable location and run @@ -66,10 +67,10 @@ cd build cmake -DWITH_TESTS=OFF ...and other options - see below... make ``` -These steps place the compiled KeePassXC binary inside the `./build/src/` directory. +These steps place the compiled KeePassXC binary inside the `./build/src/` directory. (Note the cmake notes/options below.) -**Cmake Notes:** +**Cmake Notes:** * Common cmake parameters @@ -86,7 +87,8 @@ These steps place the compiled KeePassXC binary inside the `./build/src/` direct -DWITH_XC_AUTOTYPE=[ON|OFF] Enable/Disable Auto-Type (default: ON) -DWITH_XC_HTTP=[ON|OFF] Enable/Disable KeePassHTTP and custom icon downloads (default: OFF) -DWITH_XC_YUBIKEY=[ON|OFF] Enable/Disable YubiKey HMAC-SHA1 authentication support (default: OFF) - + -DWITH_XC_BROWSER=[ON|OFF] Enable/Disable keepassxc-browser extension support (default: OFF) + -DWITH_TESTS=[ON|OFF] Enable/Disable building of unit tests (default: ON) -DWITH_GUI_TESTS=[ON|OFF] Enable/Disable building of GUI tests (default: OFF) -DWITH_DEV_BUILD=[ON|OFF] Enable/Disable deprecated method warnings (default: OFF) diff --git a/README.md b/README.md index 685ebee0b..5c2373259 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,19 @@ -# <img src="https://keepassxc.org/logo.png" width="40" height="40"/> KeePassXC +# <img src="https://keepassxc.org/logo.png" width="40" height="40"/> KeePassXC [![TeamCity Build Status](https://ci.keepassxc.org/app/rest/builds/buildType:\(id:KeepassXC_TeamCityCi\)/statusIcon?guest=1)](https://ci.keepassxc.org/viewType.html?buildTypeId=KeepassXC_TeamCityCi&guest=1) [![Coverage Status](https://coveralls.io/repos/github/keepassxreboot/keepassxc/badge.svg)](https://coveralls.io/github/keepassxreboot/keepassxc) ## About KeePassXC [KeePassXC](https://keepassxc.org) is a cross-platform community fork of -[KeePassX](https://www.keepassx.org/). -Our goal is to extend and improve it with new features and bugfixes -to provide a feature-rich, fully cross-platform and modern +[KeePassX](https://www.keepassx.org/). +Our goal is to extend and improve it with new features and bugfixes +to provide a feature-rich, fully cross-platform and modern open-source password manager. ## Installation -The [KeePassXC QuickStart](./docs/QUICKSTART.md) gets you started using -KeePassXC on your Windows, Mac, or Linux computer using pre-compiled binaries -from the [downloads page](https://keepassxc.org/download). - -Additionally, individual Linux distributions may ship their own versions, +The [KeePassXC QuickStart](./docs/QUICKSTART.md) gets you started using +KeePassXC on your Windows, Mac, or Linux computer using pre-compiled binaries +from the [downloads page](https://keepassxc.org/download). + +Additionally, individual Linux distributions may ship their own versions, so please check out your distribution's package list to see if KeePassXC is available. ## Additional features compared to KeePassX @@ -29,24 +29,25 @@ so please check out your distribution's package list to see if KeePassXC is avai - Using website favicons as entry icons - Merging of databases - Automatic reload when the database changed on disk -- Browser integration with KeePassHTTP-Connector for -[Mozilla Firefox](https://addons.mozilla.org/en-US/firefox/addon/keepasshttp-connector/) and -[Google Chrome or Chromium](https://chrome.google.com/webstore/detail/keepasshttp-connector/dafgdjggglmmknipkhngniifhplpcldb), and -[passafari](https://github.com/mmichaa/passafari.safariextension/) in Safari. [[See note about KeePassHTTP]](#note-about-keepasshttp) +- Browser integration with KeePassHTTP-Connector for +[Mozilla Firefox](https://addons.mozilla.org/en-US/firefox/addon/keepasshttp-connector/) and +[Google Chrome or Chromium](https://chrome.google.com/webstore/detail/keepasshttp-connector/dafgdjggglmmknipkhngniifhplpcldb), and +[passafari](https://github.com/mmichaa/passafari.safariextension/) in Safari. [[See note about KeePassHTTP]](#Note_about_KeePassHTTP) +- Browser integration with keepassxc-browser using [native messaging](https://developer.chrome.com/extensions/nativeMessaging) for [Mozilla Firefox](https://addons.mozilla.org/en-US/firefox/addon/keepassxc-browser/) and [Google Chrome or Chromium](https://chrome.google.com/webstore/detail/keepassxc-browser/iopaggbpplllidnfmcghoonnokmjoicf) - Many bug fixes For a full list of features and changes, read the [CHANGELOG](CHANGELOG) document. ## Building KeePassXC -Detailed instructions are available in the [Build and Install](./INSTALL.md) +Detailed instructions are available in the [Build and Install](./INSTALL.md) page or on the [Wiki page](https://github.com/keepassxreboot/keepassxc/wiki/Building-KeePassXC). ## Contributing -We are always looking for suggestions how to improve our application. -If you find any bugs or have an idea for a new feature, please let us know by -opening a report in our [issue tracker](https://github.com/keepassxreboot/keepassxc/issues) +We are always looking for suggestions how to improve our application. +If you find any bugs or have an idea for a new feature, please let us know by +opening a report in our [issue tracker](https://github.com/keepassxreboot/keepassxc/issues) on GitHub or join us on IRC on freenode channels #keepassxc or #keepassxc-dev. You can of course also directly contribute your own code. We are happy to accept your pull requests. @@ -57,11 +58,11 @@ Please read the [CONTRIBUTING document](.github/CONTRIBUTING.md) for further inf The KeePassHTTP protocol is not a highly secure protocol. It has a certain flaw which could allow an attacker to decrypt your passwords should they manage to impersonate the web browser extension from a remote address. -<!--intercept communication between a KeePassHTTP server +<!--intercept communication between a KeePassHTTP server and PassIFox/chromeIPass over a network connection --> -(See [here](https://github.com/pfn/keepasshttp/issues/258) and [here](https://github.com/keepassxreboot/keepassxc/issues/147)). +(See [here](https://github.com/pfn/keepasshttp/issues/258) and [here](https://github.com/keepassxreboot/keepassxc/issues/147)). -To minimize the risk, KeePassXC strictly limits communication between itself -and the browser plugin to your local computer (localhost). -This makes your passwords quite safe, +To minimize the risk, KeePassXC strictly limits communication between itself +and the browser plugin to your local computer (localhost). +This makes your passwords quite safe, but as with all open source software, use it at your own risk! diff --git a/cmake/Findsodium.cmake b/cmake/Findsodium.cmake new file mode 100644 index 000000000..ad7031e5a --- /dev/null +++ b/cmake/Findsodium.cmake @@ -0,0 +1,267 @@ +# Written in 2016 by Henrik Steffen Gaßmann <henrik@gassmann.onl> +# +# To the extent possible under law, the author(s) have dedicated all +# copyright and related and neighboring rights to this software to the +# public domain worldwide. This software is distributed without any warranty. +# +# You should have received a copy of the CC0 Public Domain Dedication +# along with this software. If not, see +# +# http://creativecommons.org/publicdomain/zero/1.0/ +# +######################################################################## +# Tries to find the local libsodium installation. +# +# On Windows the sodium_DIR environment variable is used as a default +# hint which can be overridden by setting the corresponding cmake variable. +# +# Once done the following variables will be defined: +# +# sodium_FOUND +# sodium_INCLUDE_DIR +# sodium_LIBRARY_DEBUG +# sodium_LIBRARY_RELEASE +# +# +# Furthermore an imported "sodium" target is created. +# + +if (CMAKE_C_COMPILER_ID STREQUAL "GNU" + OR CMAKE_C_COMPILER_ID STREQUAL "Clang") + set(_GCC_COMPATIBLE 1) +endif() + +# static library option +option(sodium_USE_STATIC_LIBS "enable to statically link against sodium") +if(NOT (sodium_USE_STATIC_LIBS EQUAL sodium_USE_STATIC_LIBS_LAST)) + unset(sodium_LIBRARY CACHE) + unset(sodium_LIBRARY_DEBUG CACHE) + unset(sodium_LIBRARY_RELEASE CACHE) + unset(sodium_DLL_DEBUG CACHE) + unset(sodium_DLL_RELEASE CACHE) + set(sodium_USE_STATIC_LIBS_LAST ${sodium_USE_STATIC_LIBS} CACHE INTERNAL "internal change tracking variable") +endif() + + +######################################################################## +# UNIX +if (UNIX) + # import pkg-config + find_package(PkgConfig QUIET) + if (PKG_CONFIG_FOUND) + pkg_check_modules(sodium_PKG QUIET libsodium) + endif() + + if(sodium_USE_STATIC_LIBS) + set(XPREFIX sodium_PKG_STATIC) + else() + set(XPREFIX sodium_PKG) + endif() + + find_path(sodium_INCLUDE_DIR sodium.h + HINTS ${${XPREFIX}_INCLUDE_DIRS} + ) + find_library(sodium_LIBRARY_DEBUG NAMES ${${XPREFIX}_LIBRARIES} sodium + HINTS ${${XPREFIX}_LIBRARY_DIRS} + ) + find_library(sodium_LIBRARY_RELEASE NAMES ${${XPREFIX}_LIBRARIES} sodium + HINTS ${${XPREFIX}_LIBRARY_DIRS} + ) + + +######################################################################## +# Windows +elseif (WIN32) + set(sodium_DIR "$ENV{sodium_DIR}" CACHE FILEPATH "sodium install directory") + mark_as_advanced(sodium_DIR) + + find_path(sodium_INCLUDE_DIR sodium.h + HINTS ${sodium_DIR} + PATH_SUFFIXES include + ) + + if (MSVC) + # detect target architecture + file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/arch.c" [=[ + #if defined _M_IX86 + #error ARCH_VALUE x86_32 + #elif defined _M_X64 + #error ARCH_VALUE x86_64 + #endif + #error ARCH_VALUE unknown + ]=]) + try_compile(_UNUSED_VAR "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/arch.c" + OUTPUT_VARIABLE _COMPILATION_LOG + ) + string(REGEX REPLACE ".*ARCH_VALUE ([a-zA-Z0-9_]+).*" "\\1" _TARGET_ARCH "${_COMPILATION_LOG}") + + # construct library path + if (_TARGET_ARCH STREQUAL "x86_32") + string(APPEND _PLATFORM_PATH "Win32") + elseif(_TARGET_ARCH STREQUAL "x86_64") + string(APPEND _PLATFORM_PATH "x64") + else() + message(FATAL_ERROR "the ${_TARGET_ARCH} architecture is not supported by Findsodium.cmake.") + endif() + string(APPEND _PLATFORM_PATH "/$$CONFIG$$") + + if (MSVC_VERSION LESS 1900) + math(EXPR _VS_VERSION "${MSVC_VERSION} / 10 - 60") + else() + math(EXPR _VS_VERSION "${MSVC_VERSION} / 10 - 50") + endif() + string(APPEND _PLATFORM_PATH "/v${_VS_VERSION}") + + if (sodium_USE_STATIC_LIBS) + string(APPEND _PLATFORM_PATH "/static") + else() + string(APPEND _PLATFORM_PATH "/dynamic") + endif() + + string(REPLACE "$$CONFIG$$" "Debug" _DEBUG_PATH_SUFFIX "${_PLATFORM_PATH}") + string(REPLACE "$$CONFIG$$" "Release" _RELEASE_PATH_SUFFIX "${_PLATFORM_PATH}") + + find_library(sodium_LIBRARY_DEBUG libsodium.lib + HINTS ${sodium_DIR} + PATH_SUFFIXES ${_DEBUG_PATH_SUFFIX} + ) + find_library(sodium_LIBRARY_RELEASE libsodium.lib + HINTS ${sodium_DIR} + PATH_SUFFIXES ${_RELEASE_PATH_SUFFIX} + ) + if (NOT sodium_USE_STATIC_LIBS) + set(CMAKE_FIND_LIBRARY_SUFFIXES ".dll") + find_library(sodium_DLL_DEBUG libsodium + HINTS ${sodium_DIR} + PATH_SUFFIXES ${_DEBUG_PATH_SUFFIX} + ) + find_library(sodium_DLL_RELEASE libsodium + HINTS ${sodium_DIR} + PATH_SUFFIXES ${_RELEASE_PATH_SUFFIX} + ) + endif() + + elseif(_GCC_COMPATIBLE) + if (sodium_USE_STATIC_LIBS) + find_library(sodium_LIBRARY_DEBUG libsodium.a + HINTS ${sodium_DIR} + PATH_SUFFIXES lib + ) + find_library(sodium_LIBRARY_RELEASE libsodium.a + HINTS ${sodium_DIR} + PATH_SUFFIXES lib + ) + else() + find_library(sodium_LIBRARY_DEBUG libsodium.dll.a + HINTS ${sodium_DIR} + PATH_SUFFIXES lib + ) + find_library(sodium_LIBRARY_RELEASE libsodium.dll.a + HINTS ${sodium_DIR} + PATH_SUFFIXES lib + ) + + file(GLOB _DLL + LIST_DIRECTORIES false + RELATIVE "${sodium_DIR}/bin" + "${sodium_DIR}/bin/libsodium*.dll" + ) + find_library(sodium_DLL_DEBUG ${_DLL} libsodium + HINTS ${sodium_DIR} + PATH_SUFFIXES bin + ) + find_library(sodium_DLL_RELEASE ${_DLL} libsodium + HINTS ${sodium_DIR} + PATH_SUFFIXES bin + ) + endif() + else() + message(FATAL_ERROR "this platform is not supported by FindSodium.cmake") + endif() + + +######################################################################## +# unsupported +else() + message(FATAL_ERROR "this platform is not supported by FindSodium.cmake") +endif() + + +######################################################################## +# common stuff + +# extract sodium version +if (sodium_INCLUDE_DIR) + set(_VERSION_HEADER "${_INCLUDE_DIR}/sodium/version.h") + if (EXISTS _VERSION_HEADER) + file(READ "${_VERSION_HEADER}" _VERSION_HEADER_CONTENT) + string(REGEX REPLACE ".*#[ \t]*define[ \t]*SODIUM_VERSION_STRING[ \t]*\"([^\n]*)\".*" "\\1" + sodium_VERSION "${_VERSION_HEADER_CONTENT}") + set(sodium_VERSION "${sodium_VERSION}" PARENT_SCOPE) + endif() +endif() + +# communicate results +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(sodium + REQUIRED_VARS + sodium_LIBRARY_RELEASE + sodium_LIBRARY_DEBUG + sodium_INCLUDE_DIR + VERSION_VAR + sodium_VERSION +) + +# mark file paths as advanced +mark_as_advanced(sodium_INCLUDE_DIR) +mark_as_advanced(sodium_LIBRARY_DEBUG) +mark_as_advanced(sodium_LIBRARY_RELEASE) +if (WIN32) + mark_as_advanced(sodium_DLL_DEBUG) + mark_as_advanced(sodium_DLL_RELEASE) +endif() + +# create imported target +if(sodium_USE_STATIC_LIBS) + set(_LIB_TYPE STATIC) +else() + set(_LIB_TYPE SHARED) +endif() +add_library(sodium ${_LIB_TYPE} IMPORTED) + +set_target_properties(sodium PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${sodium_INCLUDE_DIR}" + IMPORTED_LINK_INTERFACE_LANGUAGES "C" +) + +if (sodium_USE_STATIC_LIBS) + set_target_properties(sodium PROPERTIES + INTERFACE_COMPILE_DEFINITIONS "SODIUM_STATIC" + IMPORTED_LOCATION "${sodium_LIBRARY_RELEASE}" + IMPORTED_LOCATION_DEBUG "${sodium_LIBRARY_DEBUG}" + ) +else() + if (UNIX) + set_target_properties(sodium PROPERTIES + IMPORTED_LOCATION "${sodium_LIBRARY_RELEASE}" + IMPORTED_LOCATION_DEBUG "${sodium_LIBRARY_DEBUG}" + ) + elseif (WIN32) + set_target_properties(sodium PROPERTIES + IMPORTED_IMPLIB "${sodium_LIBRARY_RELEASE}" + IMPORTED_IMPLIB_DEBUG "${sodium_LIBRARY_DEBUG}" + ) + if (NOT (sodium_DLL_DEBUG MATCHES ".*-NOTFOUND")) + set_target_properties(sodium PROPERTIES + IMPORTED_LOCATION_DEBUG "${sodium_DLL_DEBUG}" + ) + endif() + if (NOT (sodium_DLL_RELEASE MATCHES ".*-NOTFOUND")) + set_target_properties(sodium PROPERTIES + IMPORTED_LOCATION_RELWITHDEBINFO "${sodium_DLL_RELEASE}" + IMPORTED_LOCATION_MINSIZEREL "${sodium_DLL_RELEASE}" + IMPORTED_LOCATION_RELEASE "${sodium_DLL_RELEASE}" + ) + endif() + endif() +endif() diff --git a/snapcraft.yaml b/snapcraft.yaml index 97a4bc255..d614c354f 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -29,6 +29,7 @@ parts: - -DWITH_XC_AUTOTYPE=ON - -DWITH_XC_HTTP=ON - -DWITH_XC_YUBIKEY=ON + - -DWITH_XC_BROWSER=ON build-packages: - g++ - libgcrypt20-dev @@ -41,6 +42,7 @@ parts: - libxtst-dev - libyubikey-dev - libykpers-1-dev + - libsodium-dev stage-packages: - dbus - qttranslations5-l10n # common translations @@ -65,4 +67,3 @@ parts: - libqt5svg5 # for loading icon themes which are svg - locales-all - xdg-user-dirs - diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 00d628aca..29a2c452c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -182,12 +182,20 @@ add_feature_info(AutoType WITH_XC_AUTOTYPE "Automatic password typing") add_feature_info(KeePassHTTP WITH_XC_HTTP "Browser integration compatible with ChromeIPass and PassIFox") add_feature_info(YubiKey WITH_XC_YUBIKEY "YubiKey HMAC-SHA1 challenge-response") add_feature_info(SSHAgent WITH_XC_SSHAGENT "SSH agent integration compatible with KeeAgent") +add_feature_info(keepassxc-browser WITH_XC_BROWSER "KeePassXC browser support with keepassxc-browser") add_subdirectory(http) if(WITH_XC_HTTP) set(keepasshttp_LIB keepasshttp qhttp Qt5::Network) endif() +set(BROWSER_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/browser) +add_subdirectory(browser) +add_subdirectory(proxy) +if(WITH_XC_BROWSER) + set(keepassxcbrowser_LIB keepassxcbrowser) +endif() + add_subdirectory(autotype) add_subdirectory(cli) @@ -231,6 +239,7 @@ add_library(keepassx_core STATIC ${keepassx_SOURCES}) set_target_properties(keepassx_core PROPERTIES COMPILE_DEFINITIONS KEEPASSX_BUILDING_CORE) target_link_libraries(keepassx_core ${keepasshttp_LIB} + ${keepassxcbrowser_LIB} ${autotype_LIB} ${sshagent_LIB} ${YUBIKEY_LIBRARIES} @@ -297,6 +306,28 @@ if(APPLE AND WITH_APP_BUNDLE) COMMAND ${MACDEPLOYQT_EXE} ${PROGNAME}.app WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/src COMMENT "Deploying app bundle") + + if(WITH_XC_BROWSER) + set(PROXY_BINARY_DIR "${CMAKE_BINARY_DIR}/src/proxy/keepassxc-proxy") + set(PROXY_APP_DIR "${PROGNAME}.app/Contents/MacOS/keepassxc-proxy") + add_custom_command(TARGET ${PROGNAME} + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${PROXY_BINARY_DIR} ${PROXY_APP_DIR} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/src + COMMENT "Copying keepassxc-proxy inside the application") + + add_custom_command(TARGET ${PROGNAME} + POST_BUILD + COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change /usr/local/opt/qt/lib/QtCore.framework/Versions/5/QtCore "@executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore" ${PROXY_APP_DIR} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/src + COMMENT "Changing linking of keepassxc-proxy QtCore") + + add_custom_command(TARGET ${PROGNAME} + POST_BUILD + COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change /usr/local/opt/qt/lib/QtNetwork.framework/Versions/5/QtNetwork "@executable_path/../Frameworks/QtNetwork.framework/Versions/5/QtNetwork" ${PROXY_APP_DIR} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/src + COMMENT "Changing linking of keepassxc-proxy QtNetwork") + endif() endif() install(TARGETS ${PROGNAME} diff --git a/src/browser/BrowserAccessControlDialog.cpp b/src/browser/BrowserAccessControlDialog.cpp new file mode 100755 index 000000000..7090a4d16 --- /dev/null +++ b/src/browser/BrowserAccessControlDialog.cpp @@ -0,0 +1,59 @@ +/* +* Copyright (C) 2013 Francois Ferrand +* Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "BrowserAccessControlDialog.h" +#include "ui_BrowserAccessControlDialog.h" +#include "core/Entry.h" + +BrowserAccessControlDialog::BrowserAccessControlDialog(QWidget* parent) : + QDialog(parent), + ui(new Ui::BrowserAccessControlDialog()) +{ + this->setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); + + ui->setupUi(this); + connect(ui->allowButton, SIGNAL(clicked()), this, SLOT(accept())); + connect(ui->denyButton, SIGNAL(clicked()), this, SLOT(reject())); +} + +BrowserAccessControlDialog::~BrowserAccessControlDialog() +{ +} + +void BrowserAccessControlDialog::setUrl(const QString& url) +{ + ui->label->setText(QString(tr("%1 has requested access to passwords for the following item(s).\n" + "Please select whether you want to allow access.")).arg(QUrl(url).host())); +} + +void BrowserAccessControlDialog::setItems(const QList<Entry*>& items) +{ + for (Entry* entry : items) { + ui->itemsList->addItem(entry->title() + " - " + entry->username()); + } +} + +bool BrowserAccessControlDialog::remember() const +{ + return ui->rememberDecisionCheckBox->isChecked(); +} + +void BrowserAccessControlDialog::setRemember(bool r) +{ + ui->rememberDecisionCheckBox->setChecked(r); +} diff --git a/src/browser/BrowserAccessControlDialog.h b/src/browser/BrowserAccessControlDialog.h new file mode 100755 index 000000000..d2a66ce0d --- /dev/null +++ b/src/browser/BrowserAccessControlDialog.h @@ -0,0 +1,48 @@ +/* +* Copyright (C) 2013 Francois Ferrand +* Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef BROWSERACCESSCONTROLDIALOG_H +#define BROWSERACCESSCONTROLDIALOG_H + +#include <QDialog> +#include <QScopedPointer> + +class Entry; + +namespace Ui { +class BrowserAccessControlDialog; +} + +class BrowserAccessControlDialog : public QDialog +{ + Q_OBJECT + +public: + explicit BrowserAccessControlDialog(QWidget* parent = nullptr); + ~BrowserAccessControlDialog(); + + void setUrl(const QString& url); + void setItems(const QList<Entry*>& items); + bool remember() const; + void setRemember(bool r); + +private: + QScopedPointer<Ui::BrowserAccessControlDialog> ui; +}; + +#endif // BROWSERACCESSCONTROLDIALOG_H diff --git a/src/browser/BrowserAccessControlDialog.ui b/src/browser/BrowserAccessControlDialog.ui new file mode 100755 index 000000000..d4f104544 --- /dev/null +++ b/src/browser/BrowserAccessControlDialog.ui @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>BrowserAccessControlDialog</class> + <widget class="QDialog" name="BrowserAccessControlDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>221</height> + </rect> + </property> + <property name="windowTitle"> + <string>keepassxc-browser Confirm Access</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item> + <widget class="QListWidget" name="itemsList"/> + </item> + <item> + <widget class="QCheckBox" name="rememberDecisionCheckBox"> + <property name="text"> + <string>Remember this decision</string> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="allowButton"> + <property name="text"> + <string>Allow</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="denyButton"> + <property name="text"> + <string>Deny</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/src/browser/BrowserAction.cpp b/src/browser/BrowserAction.cpp new file mode 100755 index 000000000..ebd9e2d9a --- /dev/null +++ b/src/browser/BrowserAction.cpp @@ -0,0 +1,546 @@ +/* +* Copyright (C) 2017 Sami Vänttinen <sami.vanttinen@protonmail.com> +* Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <QJsonDocument> +#include <QJsonParseError> +#include "BrowserAction.h" +#include "BrowserSettings.h" +#include "sodium.h" +#include "sodium/crypto_box.h" +#include "sodium/randombytes.h" +#include "config-keepassx.h" + +BrowserAction::BrowserAction(BrowserService& browserService) : + m_mutex(QMutex::Recursive), + m_browserService(browserService), + m_associated(false) +{ + +} + +QJsonObject BrowserAction::readResponse(const QJsonObject& json) +{ + if (json.isEmpty()) { + return QJsonObject(); + } + + const QString action = json.value("action").toString(); + if (action.isEmpty()) { + return QJsonObject(); + } + + QMutexLocker locker(&m_mutex); + if (action.compare("change-public-keys", Qt::CaseSensitive) != 0 && !m_browserService.isDatabaseOpened()) { + if (m_clientPublicKey.isEmpty()) { + return getErrorReply(action, ERROR_KEEPASS_CLIENT_PUBLIC_KEY_NOT_RECEIVED); + } else if (!m_browserService.openDatabase()) { + return getErrorReply(action, ERROR_KEEPASS_DATABASE_NOT_OPENED); + } + } + + return handleAction(json); +} + + +// Private functions +/////////////////////// + +QJsonObject BrowserAction::handleAction(const QJsonObject& json) +{ + QString action = json.value("action").toString(); + if (action.isEmpty()) { + return getErrorReply(action, ERROR_KEEPASS_INCORRECT_ACTION); + } + + if (action.compare("change-public-keys", Qt::CaseSensitive) == 0) { + return handleChangePublicKeys(json, action); + } else if (action.compare("get-databasehash", Qt::CaseSensitive) == 0) { + return handleGetDatabaseHash(json, action); + } else if (action.compare("associate", Qt::CaseSensitive) == 0) { + return handleAssociate(json, action); + } else if (action.compare("test-associate", Qt::CaseSensitive) == 0) { + return handleTestAssociate(json, action); + } else if (action.compare("get-logins", Qt::CaseSensitive) == 0) { + return handleGetLogins(json, action); + } else if (action.compare("generate-password", Qt::CaseSensitive) == 0) { + return handleGeneratePassword(json, action); + } else if (action.compare("set-login", Qt::CaseSensitive) == 0) { + return handleSetLogin(json, action); + } else if (action.compare("lock-database", Qt::CaseSensitive) == 0) { + return handleLockDatabase(json, action); + } + + // Action was not recognized + return getErrorReply(action, ERROR_KEEPASS_INCORRECT_ACTION); +} + +QJsonObject BrowserAction::handleChangePublicKeys(const QJsonObject& json, const QString& action) +{ + QMutexLocker locker(&m_mutex); + const QString nonce = json.value("nonce").toString(); + const QString clientPublicKey = json.value("publicKey").toString(); + + if (clientPublicKey.isEmpty() || nonce.isEmpty()) { + return getErrorReply(action, ERROR_KEEPASS_CLIENT_PUBLIC_KEY_NOT_RECEIVED); + } + + m_associated = false; + unsigned char pk[crypto_box_PUBLICKEYBYTES]; + unsigned char sk[crypto_box_SECRETKEYBYTES]; + crypto_box_keypair(pk, sk); + + const QString publicKey = getBase64FromKey(pk, crypto_box_PUBLICKEYBYTES); + const QString secretKey = getBase64FromKey(sk, crypto_box_SECRETKEYBYTES); + m_clientPublicKey = clientPublicKey; + m_publicKey = publicKey; + m_secretKey = secretKey; + + QJsonObject response = buildMessage(incrementNonce(nonce)); + response["action"] = action; + response["publicKey"] = publicKey; + + return response; +} + +QJsonObject BrowserAction::handleGetDatabaseHash(const QJsonObject& json, const QString& action) +{ + const QString hash = getDatabaseHash(); + const QString nonce = json.value("nonce").toString(); + const QString encrypted = json.value("message").toString(); + const QJsonObject decrypted = decryptMessage(encrypted, nonce, action); + + if (decrypted.isEmpty()) { + return getErrorReply(action, ERROR_KEEPASS_CANNOT_DECRYPT_MESSAGE); + } + + if (hash.isEmpty()) { + return getErrorReply(action, ERROR_KEEPASS_DATABASE_HASH_NOT_RECEIVED); + } + + QString command = decrypted.value("action").toString(); + if (!command.isEmpty() && command.compare("get-databasehash", Qt::CaseSensitive) == 0) { + QJsonObject message; + message["hash"] = hash; + message["version"] = KEEPASSX_VERSION; + return buildResponse(action, message, incrementNonce(nonce)); + } + + return getErrorReply(action, ERROR_KEEPASS_CANNOT_DECRYPT_MESSAGE); +} + +QJsonObject BrowserAction::handleAssociate(const QJsonObject& json, const QString& action) +{ + const QString hash = getDatabaseHash(); + const QString nonce = json.value("nonce").toString(); + const QString encrypted = json.value("message").toString(); + const QJsonObject decrypted = decryptMessage(encrypted, nonce, action); + + if (decrypted.isEmpty()) { + return getErrorReply(action, ERROR_KEEPASS_CANNOT_DECRYPT_MESSAGE); + } + + const QString key = decrypted.value("key").toString(); + if (key.isEmpty()) { + return getErrorReply(action, ERROR_KEEPASS_ASSOCIATION_FAILED); + } + + QMutexLocker locker(&m_mutex); + if (key.compare(m_clientPublicKey, Qt::CaseSensitive) == 0) { + const QString id = m_browserService.storeKey(key); + if (id.isEmpty()) { + return getErrorReply(action, ERROR_KEEPASS_ACTION_CANCELLED_OR_DENIED); + } + + m_associated = true; + const QString newNonce = incrementNonce(nonce); + + QJsonObject message = buildMessage(newNonce); + message["hash"] = hash; + message["id"] = id; + return buildResponse(action, message, newNonce); + } + + return getErrorReply(action, ERROR_KEEPASS_ASSOCIATION_FAILED); +} + +QJsonObject BrowserAction::handleTestAssociate(const QJsonObject& json, const QString& action) +{ + const QString hash = getDatabaseHash(); + const QString nonce = json.value("nonce").toString(); + const QString encrypted = json.value("message").toString(); + const QJsonObject decrypted = decryptMessage(encrypted, nonce, action); + + if (decrypted.isEmpty()) { + return getErrorReply(action, ERROR_KEEPASS_CANNOT_DECRYPT_MESSAGE); + } + + const QString responseKey = decrypted.value("key").toString(); + const QString id = decrypted.value("id").toString(); + if (responseKey.isEmpty() || id.isEmpty()) { + return getErrorReply(action, ERROR_KEEPASS_DATABASE_NOT_OPENED); + } + + QMutexLocker locker(&m_mutex); + const QString key = m_browserService.getKey(id); + if (key.isEmpty() || key.compare(responseKey, Qt::CaseSensitive) != 0) { + return getErrorReply(action, ERROR_KEEPASS_ASSOCIATION_FAILED); + } + + m_associated = true; + const QString newNonce = incrementNonce(nonce); + + QJsonObject message = buildMessage(newNonce); + message["hash"] = hash; + message["id"] = id; + + return buildResponse(action, message, newNonce); +} + +QJsonObject BrowserAction::handleGetLogins(const QJsonObject& json, const QString& action) +{ + const QString hash = getDatabaseHash(); + const QString nonce = json.value("nonce").toString(); + const QString encrypted = json.value("message").toString(); + + QMutexLocker locker(&m_mutex); + if (!m_associated) { + return getErrorReply(action, ERROR_KEEPASS_ASSOCIATION_FAILED); + } + + const QJsonObject decrypted = decryptMessage(encrypted, nonce, action); + if (decrypted.isEmpty()) { + return getErrorReply(action, ERROR_KEEPASS_CANNOT_DECRYPT_MESSAGE); + } + + const QString url = decrypted.value("url").toString(); + if (url.isEmpty()) { + return getErrorReply(action, ERROR_KEEPASS_NO_URL_PROVIDED); + } + + const QString id = decrypted.value("id").toString(); + const QString submit = decrypted.value("submitUrl").toString(); + const QJsonArray users = m_browserService.findMatchingEntries(id, url, submit, ""); + + if (users.isEmpty()) { + return QJsonObject(); // No logins found. Not an error, return an empty JSON object. + } + + const QString newNonce = incrementNonce(nonce); + + QJsonObject message = buildMessage(newNonce); + message["count"] = users.count(); + message["entries"] = users; + message["hash"] = hash; + message["id"] = id; + + return buildResponse(action, message, newNonce); +} + +QJsonObject BrowserAction::handleGeneratePassword(const QJsonObject& json, const QString& action) +{ + const QString nonce = json.value("nonce").toString(); + const QString password = BrowserSettings::generatePassword(); + const QString bits = QString::number(BrowserSettings::getbits()); // For some reason this always returns 1140 bits? + + if (nonce.isEmpty() || password.isEmpty()) { + return QJsonObject(); + } + + QJsonArray arr; + QJsonObject passwd; + passwd["login"] = QString::number(password.length() * 8); //bits; + passwd["password"] = password; + arr.append(passwd); + + const QString newNonce = incrementNonce(nonce); + + QJsonObject message = buildMessage(newNonce); + message["entries"] = arr; + + return buildResponse(action, message, newNonce); +} + +QJsonObject BrowserAction::handleSetLogin(const QJsonObject& json, const QString& action) +{ + const QString hash = getDatabaseHash(); + const QString nonce = json.value("nonce").toString(); + const QString encrypted = json.value("message").toString(); + + QMutexLocker locker(&m_mutex); + if (!m_associated) { + return getErrorReply(action, ERROR_KEEPASS_ASSOCIATION_FAILED); + } + + const QJsonObject decrypted = decryptMessage(encrypted, nonce, action); + if (decrypted.isEmpty()) { + return getErrorReply(action, ERROR_KEEPASS_CANNOT_DECRYPT_MESSAGE); + } + + const QString url = decrypted.value("url").toString(); + if (url.isEmpty()) { + return getErrorReply(action, ERROR_KEEPASS_NO_URL_PROVIDED); + } + + const QString id = decrypted.value("id").toString(); + const QString login = decrypted.value("login").toString(); + const QString password = decrypted.value("password").toString(); + const QString submitUrl = decrypted.value("submitUrl").toString(); + const QString uuid = decrypted.value("uuid").toString(); + const QString realm; + + if (uuid.isEmpty()) { + m_browserService.addEntry(id, login, password, url, submitUrl, realm); + } else { + m_browserService.updateEntry(id, uuid, login, password, url); + } + + const QString newNonce = incrementNonce(nonce); + + QJsonObject message = buildMessage(newNonce); + message["count"] = QJsonValue::Null; + message["entries"] = QJsonValue::Null; + message["error"] = ""; + message["hash"] = hash; + + return buildResponse(action, message, newNonce); +} + +QJsonObject BrowserAction::handleLockDatabase(const QJsonObject& json, const QString& action) +{ + const QString hash = getDatabaseHash(); + const QString nonce = json.value("nonce").toString(); + const QString encrypted = json.value("message").toString(); + const QJsonObject decrypted = decryptMessage(encrypted, nonce, action); + + if (decrypted.isEmpty()) { + return getErrorReply(action, ERROR_KEEPASS_CANNOT_DECRYPT_MESSAGE); + } + + if (hash.isEmpty()) { + return getErrorReply(action, ERROR_KEEPASS_DATABASE_HASH_NOT_RECEIVED); + } + + QString command = decrypted.value("action").toString(); + if (!command.isEmpty() && command.compare("lock-database", Qt::CaseSensitive) == 0) { + QMutexLocker locker(&m_mutex); + m_browserService.lockDatabase(); + + const QString newNonce = incrementNonce(nonce); + QJsonObject message = buildMessage(newNonce); + + return buildResponse(action, message, newNonce); + } + + return getErrorReply(action, ERROR_KEEPASS_DATABASE_HASH_NOT_RECEIVED); +} + +QJsonObject BrowserAction::getErrorReply(const QString& action, const int errorCode) const +{ + QJsonObject response; + response["action"] = action; + response["errorCode"] = QString::number(errorCode); + response["error"] = getErrorMessage(errorCode); + return response; +} + +QJsonObject BrowserAction::buildMessage(const QString& nonce) const +{ + QJsonObject message; + message["version"] = KEEPASSX_VERSION; + message["success"] = "true"; + message["nonce"] = nonce; + return message; +} + +QJsonObject BrowserAction::buildResponse(const QString& action, const QJsonObject& message, const QString& nonce) +{ + QJsonObject response; + response["action"] = action; + response["message"] = encryptMessage(message, nonce); + response["nonce"] = nonce; + return response; +} + +QString BrowserAction::getErrorMessage(const int errorCode) const +{ + switch (errorCode) { + case ERROR_KEEPASS_DATABASE_NOT_OPENED: return "Database not opened"; + case ERROR_KEEPASS_DATABASE_HASH_NOT_RECEIVED: return "Database hash not available"; + case ERROR_KEEPASS_CLIENT_PUBLIC_KEY_NOT_RECEIVED: return "Client public key not received"; + case ERROR_KEEPASS_CANNOT_DECRYPT_MESSAGE: return "Cannot decrypt message"; + case ERROR_KEEPASS_TIMEOUT_OR_NOT_CONNECTED: return "Timeout or cannot connect to KeePassXC"; + case ERROR_KEEPASS_ACTION_CANCELLED_OR_DENIED: return "Action cancelled or denied"; + case ERROR_KEEPASS_CANNOT_ENCRYPT_MESSAGE: return "Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?"; + case ERROR_KEEPASS_ASSOCIATION_FAILED: return "KeePassXC association failed, try again"; + case ERROR_KEEPASS_KEY_CHANGE_FAILED: return "Key change was not successful"; + case ERROR_KEEPASS_ENCRYPTION_KEY_UNRECOGNIZED: return "Encryption key is not recognized"; + case ERROR_KEEPASS_NO_SAVED_DATABASES_FOUND: return "No saved databases found"; + case ERROR_KEEPASS_INCORRECT_ACTION: return "Incorrect action"; + case ERROR_KEEPASS_EMPTY_MESSAGE_RECEIVED: return "Empty message received"; + case ERROR_KEEPASS_NO_URL_PROVIDED: return "No URL provided"; + default: return "Unknown error"; + } +} + +QString BrowserAction::getDatabaseHash() +{ + QMutexLocker locker(&m_mutex); + QByteArray hash = QCryptographicHash::hash( + (m_browserService.getDatabaseRootUuid() + m_browserService.getDatabaseRecycleBinUuid()).toUtf8(), + QCryptographicHash::Sha256).toHex(); + return QString(hash); +} + +QString BrowserAction::encryptMessage(const QJsonObject& message, const QString& nonce) +{ + if (message.isEmpty() || nonce.isEmpty()) { + return QString(); + } + + const QString reply(QJsonDocument(message).toJson()); + if (!reply.isEmpty()) { + return encrypt(reply, nonce); + } + + return QString(); +} + +QJsonObject BrowserAction::decryptMessage(const QString& message, const QString& nonce, const QString& action) +{ + if (message.isEmpty() || nonce.isEmpty()) { + return QJsonObject(); + } + + QByteArray ba = decrypt(message, nonce); + if (!ba.isEmpty()) { + return getJsonObject(ba); + } + + return getErrorReply(action, ERROR_KEEPASS_CANNOT_DECRYPT_MESSAGE); +} + +QString BrowserAction::encrypt(const QString plaintext, const QString nonce) +{ + QMutexLocker locker(&m_mutex); + const QByteArray ma = plaintext.toUtf8(); + const QByteArray na = base64Decode(nonce); + const QByteArray ca = base64Decode(m_clientPublicKey); + const QByteArray sa = base64Decode(m_secretKey); + + std::vector<unsigned char> m(ma.cbegin(), ma.cend()); + std::vector<unsigned char> n(na.cbegin(), na.cend()); + std::vector<unsigned char> ck(ca.cbegin(), ca.cend()); + std::vector<unsigned char> sk(sa.cbegin(), sa.cend()); + + std::vector<unsigned char> e; + e.resize(max_length); + + if (m.empty() || n.empty() || ck.empty() || sk.empty()) { + return QString(); + } + + if (crypto_box_easy(e.data(), m.data(), m.size(), n.data(), ck.data(), sk.data()) == 0) { + QByteArray res = getQByteArray(e.data(), (crypto_box_MACBYTES + ma.length())); + return res.toBase64(); + } + + return QString(); +} + +QByteArray BrowserAction::decrypt(const QString encrypted, const QString nonce) +{ + QMutexLocker locker(&m_mutex); + const QByteArray ma = base64Decode(encrypted); + const QByteArray na = base64Decode(nonce); + const QByteArray ca = base64Decode(m_clientPublicKey); + const QByteArray sa = base64Decode(m_secretKey); + + std::vector<unsigned char> m(ma.cbegin(), ma.cend()); + std::vector<unsigned char> n(na.cbegin(), na.cend()); + std::vector<unsigned char> ck(ca.cbegin(), ca.cend()); + std::vector<unsigned char> sk(sa.cbegin(), sa.cend()); + + std::vector<unsigned char> d; + d.resize(max_length); + + if (m.empty() || n.empty() || ck.empty() || sk.empty()) { + return QByteArray(); + } + + if (crypto_box_open_easy(d.data(), m.data(), ma.length(), n.data(), ck.data(), sk.data()) == 0) { + return getQByteArray(d.data(), std::char_traits<char>::length(reinterpret_cast<const char *>(d.data()))); + } + + return QByteArray(); +} + +QString BrowserAction::getBase64FromKey(const uchar* array, const uint len) +{ + return getQByteArray(array, len).toBase64(); +} + +QByteArray BrowserAction::getQByteArray(const uchar* array, const uint len) const +{ + QByteArray qba; + qba.reserve(len); + for (uint i = 0; i < len; ++i) { + qba.append(static_cast<char>(array[i])); + } + return qba; +} + +QJsonObject BrowserAction::getJsonObject(const uchar* pArray, const uint len) const +{ + QByteArray arr = getQByteArray(pArray, len); + QJsonParseError err; + QJsonDocument doc(QJsonDocument::fromJson(arr, &err)); + return doc.object(); +} + +QJsonObject BrowserAction::getJsonObject(const QByteArray ba) const +{ + QJsonParseError err; + QJsonDocument doc(QJsonDocument::fromJson(ba, &err)); + return doc.object(); +} + +QByteArray BrowserAction::base64Decode(const QString str) +{ + return QByteArray::fromBase64(str.toUtf8()); +} + +QString BrowserAction::incrementNonce(const QString& nonce) +{ + const QByteArray nonceArray = base64Decode(nonce); + std::vector<unsigned char> n(nonceArray.cbegin(), nonceArray.cend()); + + sodium_increment(n.data(), n.size()); + return getQByteArray(n.data(), n.size()).toBase64(); +} + +void BrowserAction::removeSharedEncryptionKeys() +{ + QMutexLocker locker(&m_mutex); + m_browserService.removeSharedEncryptionKeys(); +} + +void BrowserAction::removeStoredPermissions() +{ + QMutexLocker locker(&m_mutex); + m_browserService.removeStoredPermissions(); +} diff --git a/src/browser/BrowserAction.h b/src/browser/BrowserAction.h new file mode 100755 index 000000000..83d89fb7f --- /dev/null +++ b/src/browser/BrowserAction.h @@ -0,0 +1,97 @@ +/* +* Copyright (C) 2017 Sami Vänttinen <sami.vanttinen@protonmail.com> +* Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef BROWSERACTION_H +#define BROWSERACTION_H + +#include <QtCore> +#include <QObject> +#include <QJsonObject> +#include <QMutex> +#include "BrowserService.h" + +class BrowserAction : public QObject +{ + Q_OBJECT + + enum { + ERROR_KEEPASS_DATABASE_NOT_OPENED = 1, + ERROR_KEEPASS_DATABASE_HASH_NOT_RECEIVED = 2, + ERROR_KEEPASS_CLIENT_PUBLIC_KEY_NOT_RECEIVED = 3, + ERROR_KEEPASS_CANNOT_DECRYPT_MESSAGE = 4, + ERROR_KEEPASS_TIMEOUT_OR_NOT_CONNECTED = 5, + ERROR_KEEPASS_ACTION_CANCELLED_OR_DENIED = 6, + ERROR_KEEPASS_CANNOT_ENCRYPT_MESSAGE = 7, + ERROR_KEEPASS_ASSOCIATION_FAILED = 8, + ERROR_KEEPASS_KEY_CHANGE_FAILED = 9, + ERROR_KEEPASS_ENCRYPTION_KEY_UNRECOGNIZED = 10, + ERROR_KEEPASS_NO_SAVED_DATABASES_FOUND = 11, + ERROR_KEEPASS_INCORRECT_ACTION = 12, + ERROR_KEEPASS_EMPTY_MESSAGE_RECEIVED = 13, + ERROR_KEEPASS_NO_URL_PROVIDED = 14 + }; + +public: + BrowserAction(BrowserService& browserService); + ~BrowserAction() = default; + + QJsonObject readResponse(const QJsonObject& json); + +public slots: + void removeSharedEncryptionKeys(); + void removeStoredPermissions(); + +private: + QJsonObject handleAction(const QJsonObject& json); + QJsonObject handleChangePublicKeys(const QJsonObject& json, const QString& action); + QJsonObject handleGetDatabaseHash(const QJsonObject& json, const QString& action); + QJsonObject handleAssociate(const QJsonObject& json, const QString& action); + QJsonObject handleTestAssociate(const QJsonObject& json, const QString& action); + QJsonObject handleGetLogins(const QJsonObject& json, const QString& action); + QJsonObject handleGeneratePassword(const QJsonObject& json, const QString& action); + QJsonObject handleSetLogin(const QJsonObject& json, const QString& action); + QJsonObject handleLockDatabase(const QJsonObject& json, const QString& action); + + QJsonObject buildMessage(const QString& nonce) const; + QJsonObject buildResponse(const QString& action, const QJsonObject& message, const QString& nonce); + QJsonObject getErrorReply(const QString& action, const int errorCode) const; + QString getErrorMessage(const int errorCode) const; + QString getDatabaseHash(); + + QString encryptMessage(const QJsonObject& message, const QString& nonce); + QJsonObject decryptMessage(const QString& message, const QString& nonce, const QString& action = QString()); + QString encrypt(const QString plaintext, const QString nonce); + QByteArray decrypt(const QString encrypted, const QString nonce); + + QString getBase64FromKey(const uchar* array, const uint len); + QByteArray getQByteArray(const uchar* array, const uint len) const; + QJsonObject getJsonObject(const uchar* pArray, const uint len) const; + QJsonObject getJsonObject(const QByteArray ba) const; + QByteArray base64Decode(const QString str); + QString incrementNonce(const QString& nonce); + +private: + QMutex m_mutex; + BrowserService& m_browserService; + QString m_clientPublicKey; + QString m_publicKey; + QString m_secretKey; + bool m_associated; +}; + +#endif // BROWSERACTION_H diff --git a/src/browser/BrowserClients.cpp b/src/browser/BrowserClients.cpp new file mode 100755 index 000000000..9c47fdd46 --- /dev/null +++ b/src/browser/BrowserClients.cpp @@ -0,0 +1,77 @@ +/* +* Copyright (C) 2017 Sami Vänttinen <sami.vanttinen@protonmail.com> +* Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <QJsonValue> +#include <QJsonParseError> +#include "BrowserClients.h" + +BrowserClients::BrowserClients(BrowserService& browserService) : + m_mutex(QMutex::Recursive), + m_browserService(browserService) +{ + m_clients.reserve(1000); +} + +QJsonObject BrowserClients::readResponse(const QByteArray& arr) +{ + QJsonObject json; + const QJsonObject message = byteArrayToJson(arr); + const QString clientID = getClientID(message); + + if (!clientID.isEmpty()) { + const ClientPtr client = getClient(clientID); + if (client->browserAction) { + json = client->browserAction->readResponse(message); + } + } + + return json; +} + +QJsonObject BrowserClients::byteArrayToJson(const QByteArray& arr) const +{ + QJsonObject json; + QJsonParseError err; + QJsonDocument doc(QJsonDocument::fromJson(arr, &err)); + if (doc.isObject()) { + json = doc.object(); + } + + return json; +} + +QString BrowserClients::getClientID(const QJsonObject& json) const +{ + return json["clientID"].toString(); +} + +BrowserClients::ClientPtr BrowserClients::getClient(const QString& clientID) +{ + QMutexLocker locker(&m_mutex); + for (const auto &i : m_clients) { + if (i->clientID.compare(clientID, Qt::CaseSensitive) == 0) { + return i; + } + } + + // clientID not found, create a new client + QSharedPointer<BrowserAction> ba = QSharedPointer<BrowserAction>::create(m_browserService); + ClientPtr client = ClientPtr::create(clientID, ba); + m_clients.push_back(client); + return m_clients.back(); +} diff --git a/src/browser/BrowserClients.h b/src/browser/BrowserClients.h new file mode 100755 index 000000000..f9052e7de --- /dev/null +++ b/src/browser/BrowserClients.h @@ -0,0 +1,56 @@ +/* +* Copyright (C) 2017 Sami Vänttinen <sami.vanttinen@protonmail.com> +* Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef BROWSERCLIENTS_H +#define BROWSERCLIENTS_H + +#include <QJsonObject> +#include <QMutex> +#include <QVector> +#include <QSharedPointer> +#include <QLocalSocket> +#include "BrowserAction.h" + +class BrowserClients +{ + struct Client { + Client(const QString& id, QSharedPointer<BrowserAction> ba) : clientID(id), browserAction(ba) {} + QString clientID; + QSharedPointer<BrowserAction> browserAction; + }; + + typedef QSharedPointer<Client> ClientPtr; + +public: + BrowserClients(BrowserService& browserService); + ~BrowserClients() = default; + + QJsonObject readResponse(const QByteArray& arr); + +private: + QJsonObject byteArrayToJson(const QByteArray& arr) const; + QString getClientID(const QJsonObject& json) const; + ClientPtr getClient(const QString& clientID); + +private: + QMutex m_mutex; + QVector<ClientPtr> m_clients; + BrowserService& m_browserService; +}; + +#endif // BROWSERCLIENTS_H diff --git a/src/browser/BrowserEntryConfig.cpp b/src/browser/BrowserEntryConfig.cpp new file mode 100644 index 000000000..a390e5a75 --- /dev/null +++ b/src/browser/BrowserEntryConfig.cpp @@ -0,0 +1,109 @@ +/* +* Copyright (C) 2013 Francois Ferrand +* Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "BrowserEntryConfig.h" +#include <QtCore> +#include "core/Entry.h" +#include "core/EntryAttributes.h" + +static const char KEEPASSBROWSER_NAME[] = "keepassxc-browser Settings"; //TODO: duplicated string (also in Service.cpp) + + +BrowserEntryConfig::BrowserEntryConfig(QObject* parent) : + QObject(parent) +{ +} + +QStringList BrowserEntryConfig::allowedHosts() const +{ + return m_allowedHosts.toList(); +} + +void BrowserEntryConfig::setAllowedHosts(const QStringList& allowedHosts) +{ + m_allowedHosts = allowedHosts.toSet(); +} + +QStringList BrowserEntryConfig::deniedHosts() const +{ + return m_deniedHosts.toList(); +} + +void BrowserEntryConfig::setDeniedHosts(const QStringList& deniedHosts) +{ + m_deniedHosts = deniedHosts.toSet(); +} + +bool BrowserEntryConfig::isAllowed(const QString& host) const +{ + return m_allowedHosts.contains(host); +} + +void BrowserEntryConfig::allow(const QString& host) +{ + m_allowedHosts.insert(host); + m_deniedHosts.remove(host); +} + +bool BrowserEntryConfig::isDenied(const QString& host) const +{ + return m_deniedHosts.contains(host); +} + +void BrowserEntryConfig::deny(const QString& host) +{ + m_deniedHosts.insert(host); + m_allowedHosts.remove(host); +} + +QString BrowserEntryConfig::realm() const +{ + return m_realm; +} + +void BrowserEntryConfig::setRealm(const QString& realm) +{ + m_realm = realm; +} + +bool BrowserEntryConfig::load(const Entry* entry) +{ + QString s = entry->attributes()->value(KEEPASSBROWSER_NAME); + if (s.isEmpty()) { + return false; + } + + QJsonDocument doc = QJsonDocument::fromJson(s.toUtf8()); + if (doc.isNull()) { + return false; + } + + QVariantMap map = doc.object().toVariantMap(); + for (QVariantMap::const_iterator iter = map.cbegin(); iter != map.cend(); ++iter) { + setProperty(iter.key().toLatin1(), iter.value()); + } + return true; +} + +void BrowserEntryConfig::save(Entry* entry) +{ + QVariantMap v = qo2qv(this); + QJsonObject o = QJsonObject::fromVariantMap(v); + QByteArray json = QJsonDocument(o).toJson(QJsonDocument::Compact); + entry->attributes()->set(KEEPASSBROWSER_NAME, json); +} diff --git a/src/browser/BrowserEntryConfig.h b/src/browser/BrowserEntryConfig.h new file mode 100644 index 000000000..0ffaf985b --- /dev/null +++ b/src/browser/BrowserEntryConfig.h @@ -0,0 +1,60 @@ +/* +* Copyright (C) 2013 Francois Ferrand +* Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef BROWSERENTRYCONFIG_H +#define BROWSERENTRYCONFIG_H + +#include <QtCore/QObject> +#include <QtCore/QString> +#include <QtCore/QStringList> +#include <QtCore/QSet> +#include "Variant.h" + +class Entry; + +class BrowserEntryConfig : public QObject +{ + Q_OBJECT + Q_PROPERTY(QStringList Allow READ allowedHosts WRITE setAllowedHosts) + Q_PROPERTY(QStringList Deny READ deniedHosts WRITE setDeniedHosts ) + Q_PROPERTY(QString Realm READ realm WRITE setRealm ) + +public: + BrowserEntryConfig(QObject* object = 0); + + bool load(const Entry* entry); + void save(Entry* entry); + bool isAllowed(const QString& host) const; + void allow(const QString& host); + bool isDenied(const QString& host) const; + void deny(const QString& host); + QString realm() const; + void setRealm(const QString& realm); + +private: + QStringList allowedHosts() const; + void setAllowedHosts(const QStringList& allowedHosts); + QStringList deniedHosts() const; + void setDeniedHosts(const QStringList& deniedHosts); + + QSet<QString> m_allowedHosts; + QSet<QString> m_deniedHosts; + QString m_realm; +}; + +#endif // BROWSERENTRYCONFIG_H diff --git a/src/browser/BrowserOptionDialog.cpp b/src/browser/BrowserOptionDialog.cpp new file mode 100755 index 000000000..9a876ac45 --- /dev/null +++ b/src/browser/BrowserOptionDialog.cpp @@ -0,0 +1,104 @@ +/* +* Copyright (C) 2013 Francois Ferrand +* Copyright (C) 2017 Sami Vänttinen <sami.vanttinen@protonmail.com> +* Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "BrowserOptionDialog.h" +#include "ui_BrowserOptionDialog.h" +#include "BrowserSettings.h" +#include "core/FilePath.h" + +#include <QMessageBox> + +BrowserOptionDialog::BrowserOptionDialog(QWidget* parent) : + QWidget(parent), + m_ui(new Ui::BrowserOptionDialog()) +{ + m_ui->setupUi(this); + connect(m_ui->removeSharedEncryptionKeys, SIGNAL(clicked()), this, SIGNAL(removeSharedEncryptionKeys())); + connect(m_ui->removeStoredPermissions, SIGNAL(clicked()), this, SIGNAL(removeStoredPermissions())); + + m_ui->warningWidget->showMessage(tr("The following options can be dangerous!\nChange them only if you know what you are doing."), MessageWidget::Warning); + m_ui->warningWidget->setIcon(FilePath::instance()->icon("status", "dialog-warning")); + m_ui->warningWidget->setCloseButtonVisible(false); + + m_ui->tabWidget->setEnabled(m_ui->enableBrowserSupport->isChecked()); + connect(m_ui->enableBrowserSupport, SIGNAL(toggled(bool)), m_ui->tabWidget, SLOT(setEnabled(bool))); + + m_ui->customProxyLocation->setEnabled(m_ui->useCustomProxy->isChecked()); + connect(m_ui->useCustomProxy, SIGNAL(toggled(bool)), m_ui->customProxyLocation, SLOT(setEnabled(bool))); +} + +BrowserOptionDialog::~BrowserOptionDialog() +{ +} + +void BrowserOptionDialog::loadSettings() +{ + BrowserSettings settings; + m_ui->enableBrowserSupport->setChecked(settings.isEnabled()); + + m_ui->showNotification->setChecked(settings.showNotification()); + m_ui->bestMatchOnly->setChecked(settings.bestMatchOnly()); + m_ui->unlockDatabase->setChecked(settings.unlockDatabase()); + m_ui->matchUrlScheme->setChecked(settings.matchUrlScheme()); + + if (settings.sortByUsername()) { + m_ui->sortByUsername->setChecked(true); + } else { + m_ui->sortByTitle->setChecked(true); + } + + m_ui->alwaysAllowAccess->setChecked(settings.alwaysAllowAccess()); + m_ui->alwaysAllowUpdate->setChecked(settings.alwaysAllowUpdate()); + m_ui->searchInAllDatabases->setChecked(settings.searchInAllDatabases()); + m_ui->supportKphFields->setChecked(settings.supportKphFields()); + m_ui->supportBrowserProxy->setChecked(settings.supportBrowserProxy()); + m_ui->useCustomProxy->setChecked(settings.useCustomProxy()); + m_ui->customProxyLocation->setText(settings.customProxyLocation()); + m_ui->updateBinaryPath->setChecked(settings.updateBinaryPath()); + m_ui->chromeSupport->setChecked(settings.chromeSupport()); + m_ui->chromiumSupport->setChecked(settings.chromiumSupport()); + m_ui->firefoxSupport->setChecked(settings.firefoxSupport()); + m_ui->vivaldiSupport->setChecked(settings.vivaldiSupport()); +} + +void BrowserOptionDialog::saveSettings() +{ + BrowserSettings settings; + settings.setEnabled(m_ui->enableBrowserSupport->isChecked()); + settings.setShowNotification(m_ui->showNotification->isChecked()); + settings.setBestMatchOnly(m_ui->bestMatchOnly->isChecked()); + settings.setUnlockDatabase(m_ui->unlockDatabase->isChecked()); + settings.setMatchUrlScheme(m_ui->matchUrlScheme->isChecked()); + settings.setSortByUsername(m_ui->sortByUsername->isChecked()); + + settings.setSupportBrowserProxy(m_ui->supportBrowserProxy->isChecked()); + settings.setUseCustomProxy(m_ui->useCustomProxy->isChecked()); + settings.setCustomProxyLocation(m_ui->customProxyLocation->text()); + + settings.setUpdateBinaryPath(m_ui->updateBinaryPath->isChecked()); + settings.setAlwaysAllowAccess(m_ui->alwaysAllowAccess->isChecked()); + settings.setAlwaysAllowUpdate(m_ui->alwaysAllowUpdate->isChecked()); + settings.setSearchInAllDatabases(m_ui->searchInAllDatabases->isChecked()); + settings.setSupportKphFields(m_ui->supportKphFields->isChecked()); + + settings.setChromeSupport(m_ui->chromeSupport->isChecked()); + settings.setChromiumSupport(m_ui->chromiumSupport->isChecked()); + settings.setFirefoxSupport(m_ui->firefoxSupport->isChecked()); + settings.setVivaldiSupport(m_ui->vivaldiSupport->isChecked()); +} diff --git a/src/browser/BrowserOptionDialog.h b/src/browser/BrowserOptionDialog.h new file mode 100755 index 000000000..798d215d6 --- /dev/null +++ b/src/browser/BrowserOptionDialog.h @@ -0,0 +1,50 @@ +/* +* Copyright (C) 2013 Francois Ferrand +* Copyright (C) 2017 Sami Vänttinen <sami.vanttinen@protonmail.com> +* Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef BROWSEROPTIONDIALOG_H +#define BROWSEROPTIONDIALOG_H + +#include <QWidget> +#include <QScopedPointer> + +namespace Ui { +class BrowserOptionDialog; +} + +class BrowserOptionDialog : public QWidget +{ + Q_OBJECT + +public: + explicit BrowserOptionDialog(QWidget* parent = nullptr); + ~BrowserOptionDialog(); + +public slots: + void loadSettings(); + void saveSettings(); + +signals: + void removeSharedEncryptionKeys(); + void removeStoredPermissions(); + +private: + QScopedPointer<Ui::BrowserOptionDialog> m_ui; +}; + +#endif // BROWSEROPTIONDIALOG_H diff --git a/src/browser/BrowserOptionDialog.ui b/src/browser/BrowserOptionDialog.ui new file mode 100755 index 000000000..81eaa229d --- /dev/null +++ b/src/browser/BrowserOptionDialog.ui @@ -0,0 +1,327 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>BrowserOptionDialog</class> + <widget class="QWidget" name="BrowserOptionDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>577</width> + <height>404</height> + </rect> + </property> + <property name="windowTitle"> + <string>Dialog</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <widget class="QCheckBox" name="enableBrowserSupport"> + <property name="toolTip"> + <string>This is required for accessing your databases with keepassxc-browser</string> + </property> + <property name="text"> + <string>Enable KeepassXC browser extension</string> + </property> + </widget> + </item> + <item> + <widget class="QTabWidget" name="tabWidget"> + <property name="currentIndex"> + <number>0</number> + </property> + <widget class="QWidget" name="tab"> + <attribute name="title"> + <string>General</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <widget class="QCheckBox" name="showNotification"> + <property name="text"> + <string>Sh&ow a notification when credentials are requested</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="bestMatchOnly"> + <property name="toolTip"> + <string>Only returns the best matches for a specific URL instead of all entries for the whole domain.</string> + </property> + <property name="text"> + <string>&Return only best-matching entries</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="unlockDatabase"> + <property name="text"> + <string>Re&quest to unlock the database if it is locked</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="matchUrlScheme"> + <property name="toolTip"> + <string>Only entries with the same scheme (http://, https://, ...) are returned.</string> + </property> + <property name="text"> + <string>&Match URL schemes</string> + </property> + </widget> + </item> + <item> + <widget class="QRadioButton" name="sortByUsername"> + <property name="text"> + <string>Sort matching entries by &username</string> + </property> + </widget> + </item> + <item> + <widget class="QRadioButton" name="sortByTitle"> + <property name="text"> + <string>Sort &matching entries by title</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="removeSharedEncryptionKeys"> + <property name="text"> + <string>R&emove all shared encryption keys from active database</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="removeStoredPermissions"> + <property name="text"> + <string>Re&move all stored permissions from entries in active database</string> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer_2"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <widget class="QWidget" name="tab_3"> + <attribute name="title"> + <string>Supported browsers</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_4"> + <item> + <widget class="QLabel" name="browserLabel1"> + <property name="text"> + <string>Native messaging requires certain .json files to be installed. Already installed browsers are automatically detected.</string> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="browserLabel2"> + <property name="text"> + <string>Enable KeePassXC native messaging extension for these browsers:</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="chromeSupport"> + <property name="text"> + <string>Chrome</string> + </property> + <property name="checked"> + <bool>false</bool> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="chromiumSupport"> + <property name="text"> + <string>Chromium</string> + </property> + <property name="checked"> + <bool>false</bool> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="firefoxSupport"> + <property name="text"> + <string>Firefox</string> + </property> + <property name="checked"> + <bool>false</bool> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="vivaldiSupport"> + <property name="text"> + <string>Vivaldi</string> + </property> + <property name="checked"> + <bool>false</bool> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer_3"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <widget class="QWidget" name="tab_2"> + <attribute name="title"> + <string>Advanced</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_6"> + <item> + <widget class="MessageWidget" name="warningWidget" native="true"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="alwaysAllowAccess"> + <property name="text"> + <string>Always allow &access to entries</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="alwaysAllowUpdate"> + <property name="text"> + <string>Always allow &updating entries</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="searchInAllDatabases"> + <property name="toolTip"> + <string>Only the selected database has to be connected with a client.</string> + </property> + <property name="text"> + <string>Searc&h in all opened databases for matching entries</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="supportKphFields"> + <property name="toolTip"> + <string>Automatically creating or updating string fields is not supported.</string> + </property> + <property name="text"> + <string>&Return advanced string fields which start with "KPH: "</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="updateBinaryPath"> + <property name="toolTip"> + <string>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</string> + </property> + <property name="text"> + <string>&Update KeePassXC binary path automatically to native messaging scripts on startup</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="supportBrowserProxy"> + <property name="toolTip"> + <string>Support a proxy application between KeePassXC and browser extension.</string> + </property> + <property name="text"> + <string>&Enable support for proxy application between KeePassXC and browser extension</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="useCustomProxy"> + <property name="toolTip"> + <string>Use a custom proxy location if you installed a proxy manually.</string> + </property> + <property name="text"> + <string>&Use a custom proxy location</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="customProxyLocation"> + <property name="maxLength"> + <number>999</number> + </property> + <property name="alignment"> + <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer_4"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + </widget> + </item> + </layout> + </widget> + <customwidgets> + <customwidget> + <class>MessageWidget</class> + <extends>QWidget</extends> + <header>gui/MessageWidget.h</header> + <container>1</container> + </customwidget> + </customwidgets> + <resources/> + <connections/> +</ui> diff --git a/src/browser/BrowserService.cpp b/src/browser/BrowserService.cpp new file mode 100644 index 000000000..97b8fea42 --- /dev/null +++ b/src/browser/BrowserService.cpp @@ -0,0 +1,734 @@ +/* +* Copyright (C) 2013 Francois Ferrand +* Copyright (C) 2017 Sami Vänttinen <sami.vanttinen@protonmail.com> +* Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <QJsonArray> +#include <QInputDialog> +#include <QProgressDialog> +#include <QMessageBox> +#include "BrowserService.h" +#include "BrowserSettings.h" +#include "BrowserEntryConfig.h" +#include "BrowserAccessControlDialog.h" +#include "core/Database.h" +#include "core/Group.h" +#include "core/EntrySearcher.h" +#include "core/Metadata.h" +#include "core/Uuid.h" +#include "core/PasswordGenerator.h" + + +// de887cc3-0363-43b8-974b-5911b8816224 +static const unsigned char KEEPASSXCBROWSER_UUID_DATA[] = { + 0xde, 0x88, 0x7c, 0xc3, 0x03, 0x63, 0x43, 0xb8, + 0x97, 0x4b, 0x59, 0x11, 0xb8, 0x81, 0x62, 0x24 +}; +static const Uuid KEEPASSXCBROWSER_UUID = Uuid(QByteArray::fromRawData(reinterpret_cast<const char *>(KEEPASSXCBROWSER_UUID_DATA), sizeof(KEEPASSXCBROWSER_UUID_DATA))); +static const char KEEPASSXCBROWSER_NAME[] = "keepassxc-browser Settings"; +static const char ASSOCIATE_KEY_PREFIX[] = "Public Key: "; +static const char KEEPASSXCBROWSER_GROUP_NAME[] = "keepassxc-browser Passwords"; +static int KEEPASSXCBROWSER_DEFAULT_ICON = 1; + +BrowserService::BrowserService(DatabaseTabWidget* parent) : + m_dbTabWidget(parent), + m_dialogActive(false) +{ + connect(m_dbTabWidget, SIGNAL(databaseLocked(DatabaseWidget*)), this, SLOT(databaseLocked(DatabaseWidget*))); + connect(m_dbTabWidget, SIGNAL(databaseUnlocked(DatabaseWidget*)), this, SLOT(databaseUnlocked(DatabaseWidget*))); + connect(m_dbTabWidget, SIGNAL(activateDatabaseChanged(DatabaseWidget*)), this, SLOT(activateDatabaseChanged(DatabaseWidget*))); +} + +bool BrowserService::isDatabaseOpened() const +{ + DatabaseWidget* dbWidget = m_dbTabWidget->currentDatabaseWidget(); + if (!dbWidget) { + return false; + } + + if (dbWidget->currentMode() == DatabaseWidget::ViewMode || dbWidget->currentMode() == DatabaseWidget::EditMode) { + return true; + } + + return false; +} + +bool BrowserService::openDatabase() +{ + if (!BrowserSettings::unlockDatabase()) { + return false; + } + + DatabaseWidget* dbWidget = m_dbTabWidget->currentDatabaseWidget(); + if (!dbWidget) { + return false; + } + + if (dbWidget->currentMode() == DatabaseWidget::ViewMode || dbWidget->currentMode() == DatabaseWidget::EditMode) { + return true; + } + + m_dbTabWidget->activateWindow(); + return false; +} + +void BrowserService::lockDatabase() +{ + if (thread() != QThread::currentThread()) { + QMetaObject::invokeMethod(this, "lockDatabase", Qt::BlockingQueuedConnection); + } + + DatabaseWidget* dbWidget = m_dbTabWidget->currentDatabaseWidget(); + if (!dbWidget) { + return; + } + + if (dbWidget->currentMode() == DatabaseWidget::ViewMode || dbWidget->currentMode() == DatabaseWidget::EditMode) { + dbWidget->lock(); + } +} + +QString BrowserService::getDatabaseRootUuid() +{ + Database* db = getDatabase(); + if (!db) { + return QString(); + } + + Group* rootGroup = db->rootGroup(); + if (!rootGroup) { + return QString(); + } + + return rootGroup->uuid().toHex(); +} + +QString BrowserService::getDatabaseRecycleBinUuid() +{ + Database* db = getDatabase(); + if (!db) { + return QString(); + } + + Group* recycleBin = db->metadata()->recycleBin(); + if (!recycleBin) { + return QString(); + } + return recycleBin->uuid().toHex(); +} + +Entry* BrowserService::getConfigEntry(bool create) +{ + Entry* entry = nullptr; + Database* db = getDatabase(); + if (!db) { + return nullptr; + } + + entry = db->resolveEntry(KEEPASSXCBROWSER_UUID); + if (!entry && create) { + entry = new Entry(); + entry->setTitle(QLatin1String(KEEPASSXCBROWSER_NAME)); + entry->setUuid(KEEPASSXCBROWSER_UUID); + entry->setAutoTypeEnabled(false); + entry->setGroup(db->rootGroup()); + return entry; + } + + if (entry && entry->group() == db->metadata()->recycleBin()) { + if (!create) { + return nullptr; + } else { + entry->setGroup(db->rootGroup()); + return entry; + } + } + + return entry; +} + +QString BrowserService::storeKey(const QString& key) +{ + QString id; + + if (thread() != QThread::currentThread()) { + QMetaObject::invokeMethod(this, "storeKey", Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QString, id), + Q_ARG(const QString&, key)); + return id; + } + + Entry* config = getConfigEntry(true); + if (!config) { + return QString(); + } + + bool contains = false; + QMessageBox::StandardButton dialogResult = QMessageBox::No; + + do { + bool ok = false; + id = QInputDialog::getText(0, tr("KeePassXC: New key association request"), + tr("You have received an association " + "request for the above key.\n" + "If you would like to allow it access " + "to your KeePassXC database,\n" + "give it a unique name to identify and accept it."), + QLineEdit::Normal, QString(), &ok); + if (!ok || id.isEmpty()) { + return QString(); + } + + contains = config->attributes()->contains(QLatin1String(ASSOCIATE_KEY_PREFIX) + id); + dialogResult = QMessageBox::warning(0, tr("KeePassXC: Overwrite existing key?"), + tr("A shared encryption key with the name \"%1\" already exists.\nDo you want to overwrite it?").arg(id), + QMessageBox::Yes | QMessageBox::No); + } while (contains && dialogResult == QMessageBox::No); + + config->attributes()->set(QLatin1String(ASSOCIATE_KEY_PREFIX) + id, key, true); + return id; +} + +QString BrowserService::getKey(const QString& id) +{ + Entry* config = getConfigEntry(); + if (!config) { + return QString(); + } + + return config->attributes()->value(QLatin1String(ASSOCIATE_KEY_PREFIX) + id); +} + +// No need to use KeepassHttpProtocol. Just return a JSON array. +QJsonArray BrowserService::findMatchingEntries(const QString& id, const QString& url, const QString& submitUrl, const QString& realm) +{ + QJsonArray result; + if (thread() != QThread::currentThread()) { + QMetaObject::invokeMethod(this, "findMatchingEntries", Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QJsonArray, result), + Q_ARG(const QString&, id), + Q_ARG(const QString&, url), + Q_ARG(const QString&, submitUrl), + Q_ARG(const QString&, realm)); + return result; + } + + const bool alwaysAllowAccess = BrowserSettings::alwaysAllowAccess(); + const QString host = QUrl(url).host(); + const QString submitHost = QUrl(submitUrl).host(); + + // Check entries for authorization + QList<Entry*> pwEntriesToConfirm; + QList<Entry*> pwEntries; + for (Entry* entry : searchEntries(url)) { + switch (checkAccess(entry, host, submitHost, realm)) { + case Denied: + continue; + + case Unknown: + if (alwaysAllowAccess) { + pwEntries.append(entry); + } else { + pwEntriesToConfirm.append(entry); + } + break; + + case Allowed: + pwEntries.append(entry); + break; + } + } + + // Confirm entries + if (confirmEntries(pwEntriesToConfirm, url, host, submitHost, realm)) { + pwEntries.append(pwEntriesToConfirm); + } + + if (pwEntries.isEmpty()) { + return QJsonArray(); + } + + // Sort results + pwEntries = sortEntries(pwEntries, host, submitUrl); + + // Fill the list + for (Entry* entry : pwEntries) { + result << prepareEntry(entry); + } + + return result; +} + +void BrowserService::addEntry(const QString&, const QString& login, const QString& password, const QString& url, const QString& submitUrl, const QString& realm) +{ + Group* group = findCreateAddEntryGroup(); + if (!group) { + return; + } + + Entry* entry = new Entry(); + entry->setUuid(Uuid::random()); + entry->setTitle(QUrl(url).host()); + entry->setUrl(url); + entry->setIcon(KEEPASSXCBROWSER_DEFAULT_ICON); + entry->setUsername(login); + entry->setPassword(password); + entry->setGroup(group); + + const QString host = QUrl(url).host(); + const QString submitHost = QUrl(submitUrl).host(); + BrowserEntryConfig config; + config.allow(host); + + if (!submitHost.isEmpty()) { + config.allow(submitHost); + } + if (!realm.isEmpty()) { + config.setRealm(realm); + } + config.save(entry); +} + +void BrowserService::updateEntry(const QString& id, const QString& uuid, const QString& login, const QString& password, const QString& url) +{ + if (thread() != QThread::currentThread()) { + QMetaObject::invokeMethod(this, "updateEntry", Qt::BlockingQueuedConnection, + Q_ARG(const QString&, id), + Q_ARG(const QString&, uuid), + Q_ARG(const QString&, login), + Q_ARG(const QString&, password), + Q_ARG(const QString&, url)); + } + + Database* db = getDatabase(); + if (!db) { + return; + } + + Entry* entry = db->resolveEntry(Uuid::fromHex(uuid)); + if (!entry) { + return; + } + + QString username = entry->username(); + if (username.isEmpty()) { + return; + } + + if (username.compare(login, Qt::CaseSensitive) != 0 || entry->password().compare(password, Qt::CaseSensitive) != 0) { + QMessageBox::StandardButton dialogResult = QMessageBox::No; + if (!BrowserSettings::alwaysAllowUpdate()) { + dialogResult = QMessageBox::warning(0, tr("KeePassXC: Update Entry"), + tr("Do you want to update the information in %1 - %2?") + .arg(QUrl(url).host()).arg(username), + QMessageBox::Yes|QMessageBox::No); + } + + if (BrowserSettings::alwaysAllowUpdate() || dialogResult == QMessageBox::Yes) { + entry->beginUpdate(); + entry->setUsername(login); + entry->setPassword(password); + entry->endUpdate(); + } + } +} + +QList<Entry*> BrowserService::searchEntries(Database* db, const QString& hostname) +{ + QList<Entry*> entries; + Group* rootGroup = db->rootGroup(); + if (!rootGroup) { + return entries; + } + + for (Entry* entry : EntrySearcher().search(hostname, rootGroup, Qt::CaseInsensitive)) { + QString title = entry->title(); + QString url = entry->url(); + + // Filter to match hostname in Title and Url fields + if ((!title.isEmpty() && hostname.contains(title)) + || (!url.isEmpty() && hostname.contains(url)) + || (matchUrlScheme(title) && hostname.endsWith(QUrl(title).host())) + || (matchUrlScheme(url) && hostname.endsWith(QUrl(url).host())) ) { + entries.append(entry); + } + } + + return entries; +} + +QList<Entry*> BrowserService::searchEntries(const QString& text) +{ + // Get the list of databases to search + QList<Database*> databases; + if (BrowserSettings::searchInAllDatabases()) { + const int count = m_dbTabWidget->count(); + for (int i = 0; i < count; ++i) { + if (DatabaseWidget* dbWidget = qobject_cast<DatabaseWidget*>(m_dbTabWidget->widget(i))) { + if (Database* db = dbWidget->database()) { + databases << db; + } + } + } + } else if (Database* db = getDatabase()) { + databases << db; + } + + // Search entries matching the hostname + QString hostname = QUrl(text).host(); + QList<Entry*> entries; + do { + for (Database* db : databases) { + entries << searchEntries(db, hostname); + } + } while (entries.isEmpty() && removeFirstDomain(hostname)); + + return entries; +} + +void BrowserService::removeSharedEncryptionKeys() +{ + if (!isDatabaseOpened()) { + QMessageBox::critical(0, tr("KeePassXC: Database locked!"), + tr("The active database is locked!\n" + "Please unlock the selected database or choose another one which is unlocked."), + QMessageBox::Ok); + return; + } + + Entry* entry = getConfigEntry(); + if (!entry) { + QMessageBox::information(0, tr("KeePassXC: Settings not available!"), + tr("The active database does not contain a settings entry."), + QMessageBox::Ok); + return; + } + + QStringList keysToRemove; + for (const QString& key : entry->attributes()->keys()) { + if (key.startsWith(ASSOCIATE_KEY_PREFIX)) { + keysToRemove << key; + } + } + + if (keysToRemove.isEmpty()) { + QMessageBox::information(0, tr("KeePassXC: No keys found"), + tr("No shared encryption keys found in KeePassXC Settings."), + QMessageBox::Ok); + return; + } + + entry->beginUpdate(); + for (const QString& key : keysToRemove) { + entry->attributes()->remove(key); + } + entry->endUpdate(); + + const int count = keysToRemove.count(); + QMessageBox::information(0, tr("KeePassXC: Removed keys from database"), + tr("Successfully removed %n encryption key(s) from KeePassXC settings.", "", count), + QMessageBox::Ok); + +} + +void BrowserService::removeStoredPermissions() +{ + if (!isDatabaseOpened()) { + QMessageBox::critical(0, tr("KeePassXC: Database locked!"), + tr("The active database is locked!\n" + "Please unlock the selected database or choose another one which is unlocked."), + QMessageBox::Ok); + return; + } + + Database* db = m_dbTabWidget->currentDatabaseWidget()->database(); + if (!db) { + return; + } + + QList<Entry*> entries = db->rootGroup()->entriesRecursive(); + + QProgressDialog progress(tr("Removing stored permissions…"), tr("Abort"), 0, entries.count()); + progress.setWindowModality(Qt::WindowModal); + + uint counter = 0; + for (Entry* entry : entries) { + if (progress.wasCanceled()) { + return; + } + + if (entry->attributes()->contains(KEEPASSXCBROWSER_NAME)) { + entry->beginUpdate(); + entry->attributes()->remove(KEEPASSXCBROWSER_NAME); + entry->endUpdate(); + ++counter; + } + progress.setValue(progress.value() + 1); + } + progress.reset(); + + if (counter > 0) { + QMessageBox::information(0, tr("KeePassXC: Removed permissions"), + tr("Successfully removed permissions from %n entry(s).", "", counter), + QMessageBox::Ok); + } else { + QMessageBox::information(0, tr("KeePassXC: No entry with permissions found!"), + tr("The active database does not contain an entry with permissions."), + QMessageBox::Ok); + } +} + +QList<Entry*> BrowserService::sortEntries(QList<Entry*>& pwEntries, const QString& host, const QString& entryUrl) +{ + QUrl url(entryUrl); + if (url.scheme().isEmpty()) { + url.setScheme("http"); + } + + const QString submitUrl = url.toString(QUrl::StripTrailingSlash); + const QString baseSubmitUrl = url.toString(QUrl::StripTrailingSlash | QUrl::RemovePath | QUrl::RemoveQuery | QUrl::RemoveFragment); + + QMultiMap<int, const Entry*> priorities; + for (const Entry* entry : pwEntries) { + priorities.insert(sortPriority(entry, host, submitUrl, baseSubmitUrl), entry); + } + + QString field = BrowserSettings::sortByTitle() ? "Title" : "UserName"; + std::sort(pwEntries.begin(), pwEntries.end(), [&priorities, &field](const Entry* left, const Entry* right) { + int res = priorities.key(left) - priorities.key(right); + if (res == 0) { + return QString::localeAwareCompare(left->attributes()->value(field), right->attributes()->value(field)) < 0; + } + return res < 0; + }); + + return pwEntries; +} + +bool BrowserService::confirmEntries(QList<Entry*>& pwEntriesToConfirm, const QString& url, const QString& host, const QString& submitHost, const QString& realm) +{ + if (pwEntriesToConfirm.isEmpty() || m_dialogActive) { + return false; + } + + m_dialogActive = true; + BrowserAccessControlDialog accessControlDialog; + accessControlDialog.setUrl(url); + accessControlDialog.setItems(pwEntriesToConfirm); + + int res = accessControlDialog.exec(); + if (accessControlDialog.remember()) { + for (Entry* entry : pwEntriesToConfirm) { + BrowserEntryConfig config; + config.load(entry); + if (res == QDialog::Accepted) { + config.allow(host); + if (!submitHost.isEmpty() && host != submitHost) + config.allow(submitHost); + } else if (res == QDialog::Rejected) { + config.deny(host); + if (!submitHost.isEmpty() && host != submitHost) { + config.deny(submitHost); + } + } + if (!realm.isEmpty()) { + config.setRealm(realm); + } + config.save(entry); + } + } + + m_dialogActive = false; + if (res == QDialog::Accepted) { + return true; + } + + return false; +} + +QJsonObject BrowserService::prepareEntry(const Entry* entry) +{ + QJsonObject res; + res["login"] = entry->resolveMultiplePlaceholders(entry->username()); + res["password"] = entry->resolveMultiplePlaceholders(entry->password()); + res["name"] = entry->resolveMultiplePlaceholders(entry->title()); + res["uuid"] = entry->resolveMultiplePlaceholders(entry->uuid().toHex()); + + if (BrowserSettings::supportKphFields()) { + const EntryAttributes* attr = entry->attributes(); + QJsonArray stringFields; + for (const QString& key : attr->keys()) { + if (key.startsWith(QLatin1String("KPH: "))) { + QJsonObject sField; + sField[key] = entry->resolveMultiplePlaceholders(attr->value(key)); + stringFields << sField; + } + } + res["stringFields"] = stringFields; + } + return res; +} + +BrowserService::Access BrowserService::checkAccess(const Entry* entry, const QString& host, const QString& submitHost, const QString& realm) +{ + BrowserEntryConfig config; + if (!config.load(entry)) { + return Unknown; + } + if ((config.isAllowed(host)) && (submitHost.isEmpty() || config.isAllowed(submitHost))) { + return Allowed; + } + if ((config.isDenied(host)) || (!submitHost.isEmpty() && config.isDenied(submitHost))) { + return Denied; + } + if (!realm.isEmpty() && config.realm() != realm) { + return Denied; + } + return Unknown; +} + +Group* BrowserService::findCreateAddEntryGroup() +{ + Database* db = getDatabase(); + if (!db) { + return nullptr; + } + + Group* rootGroup = db->rootGroup(); + if (!rootGroup) { + return nullptr; + } + + const QString groupName = QLatin1String(KEEPASSXCBROWSER_GROUP_NAME); //TODO: setting to decide where new keys are created + + for (const Group* g : rootGroup->groupsRecursive(true)) { + if (g->name() == groupName) { + return db->resolveGroup(g->uuid()); + } + } + + Group* group = new Group(); + group->setUuid(Uuid::random()); + group->setName(groupName); + group->setIcon(KEEPASSXCBROWSER_DEFAULT_ICON); + group->setParent(rootGroup); + return group; +} + +int BrowserService::sortPriority(const Entry* entry, const QString& host, const QString& submitUrl, const QString& baseSubmitUrl) const +{ + QUrl url(entry->url()); + if (url.scheme().isEmpty()) { + url.setScheme("http"); + } + const QString entryURL = url.toString(QUrl::StripTrailingSlash); + const QString baseEntryURL = url.toString(QUrl::StripTrailingSlash | QUrl::RemovePath | QUrl::RemoveQuery | QUrl::RemoveFragment); + + if (submitUrl == entryURL) { + return 100; + } + if (submitUrl.startsWith(entryURL) && entryURL != host && baseSubmitUrl != entryURL) { + return 90; + } + if (submitUrl.startsWith(baseEntryURL) && entryURL != host && baseSubmitUrl != baseEntryURL) { + return 80; + } + if (entryURL == host) { + return 70; + } + if (entryURL == baseSubmitUrl) { + return 60; + } + if (entryURL.startsWith(submitUrl)) { + return 50; + } + if (entryURL.startsWith(baseSubmitUrl) && baseSubmitUrl != host) { + return 40; + } + if (submitUrl.startsWith(entryURL)) { + return 30; + } + if (submitUrl.startsWith(baseEntryURL)) { + return 20; + } + if (entryURL.startsWith(host)) { + return 10; + } + if (host.startsWith(entryURL)) { + return 5; + } + return 0; +} + +bool BrowserService::matchUrlScheme(const QString& url) +{ + QUrl address(url); + return !address.scheme().isEmpty(); +} + +bool BrowserService::removeFirstDomain(QString& hostname) +{ + int pos = hostname.indexOf("."); + if (pos < 0) { + return false; + } + + // Don't remove the second-level domain if it's the only one + if (hostname.count(".") > 1) { + hostname = hostname.mid(pos + 1); + return !hostname.isEmpty(); + } + + // Nothing removed + return false; +} + +Database* BrowserService::getDatabase() +{ + if (DatabaseWidget* dbWidget = m_dbTabWidget->currentDatabaseWidget()) { + if (Database* db = dbWidget->database()) { + return db; + } + } + return nullptr; +} + +void BrowserService::databaseLocked(DatabaseWidget* dbWidget) +{ + if (dbWidget) { + emit databaseLocked(); + } +} + +void BrowserService::databaseUnlocked(DatabaseWidget* dbWidget) +{ + if (dbWidget) { + emit databaseUnlocked(); + } +} + +void BrowserService::activateDatabaseChanged(DatabaseWidget* dbWidget) +{ + if (dbWidget) { + auto currentMode = dbWidget->currentMode(); + if (currentMode == DatabaseWidget::ViewMode || currentMode == DatabaseWidget::EditMode) { + emit databaseUnlocked(); + } else { + emit databaseLocked(); + } + } +} diff --git a/src/browser/BrowserService.h b/src/browser/BrowserService.h new file mode 100644 index 000000000..859daee2a --- /dev/null +++ b/src/browser/BrowserService.h @@ -0,0 +1,82 @@ +/* +* Copyright (C) 2013 Francois Ferrand +* Copyright (C) 2017 Sami Vänttinen <sami.vanttinen@protonmail.com> +* Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 2 or (at your option) +* version 3 of the License. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef BROWSERSERVICE_H +#define BROWSERSERVICE_H + +#include <QtCore> +#include <QObject> +#include "gui/DatabaseTabWidget.h" +#include "core/Entry.h" + +enum { max_length = 16*1024 }; + +class BrowserService : public QObject +{ + Q_OBJECT + +public: + explicit BrowserService(DatabaseTabWidget* parent); + + bool isDatabaseOpened() const; + bool openDatabase(); + QString getDatabaseRootUuid(); + QString getDatabaseRecycleBinUuid(); + Entry* getConfigEntry(bool create = false); + QString getKey(const QString& id); + void addEntry(const QString& id, const QString& login, const QString& password, const QString& url, const QString& submitUrl, const QString& realm); + QList<Entry*> searchEntries(Database* db, const QString& hostname); + QList<Entry*> searchEntries(const QString& text); + void removeSharedEncryptionKeys(); + void removeStoredPermissions(); + +public slots: + QJsonArray findMatchingEntries(const QString& id, const QString& url, const QString& submitUrl, const QString& realm); + QString storeKey(const QString& key); + void updateEntry(const QString& id, const QString& uuid, const QString& login, const QString& password, const QString& url); + void databaseLocked(DatabaseWidget* dbWidget); + void databaseUnlocked(DatabaseWidget* dbWidget); + void activateDatabaseChanged(DatabaseWidget* dbWidget); + void lockDatabase(); + +signals: + void databaseLocked(); + void databaseUnlocked(); + void databaseChanged(); + +private: + enum Access { Denied, Unknown, Allowed}; + +private: + QList<Entry*> sortEntries(QList<Entry*>& pwEntries, const QString& host, const QString& submitUrl); + bool confirmEntries(QList<Entry*>& pwEntriesToConfirm, const QString& url, const QString& host, const QString& submitHost, const QString& realm); + QJsonObject prepareEntry(const Entry* entry); + Access checkAccess(const Entry* entry, const QString& host, const QString& submitHost, const QString& realm); + Group* findCreateAddEntryGroup(); + int sortPriority(const Entry* entry, const QString &host, const QString& submitUrl, const QString& baseSubmitUrl) const; + bool matchUrlScheme(const QString& url); + bool removeFirstDomain(QString& hostname); + Database* getDatabase(); + +private: + DatabaseTabWidget* const m_dbTabWidget; + bool m_dialogActive; +}; + +#endif // BROWSERSERVICE_H diff --git a/src/browser/BrowserSettings.cpp b/src/browser/BrowserSettings.cpp new file mode 100755 index 000000000..d15f57d46 --- /dev/null +++ b/src/browser/BrowserSettings.cpp @@ -0,0 +1,377 @@ +/* +* Copyright (C) 2013 Francois Ferrand +* Copyright (C) 2017 Sami Vänttinen <sami.vanttinen@protonmail.com> +* Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "BrowserSettings.h" +#include "core/Config.h" + +PasswordGenerator BrowserSettings::m_passwordGenerator; +PassphraseGenerator BrowserSettings::m_passPhraseGenerator; +HostInstaller BrowserSettings::m_hostInstaller; + +bool BrowserSettings::isEnabled() +{ + return config()->get("Browser/Enabled", false).toBool(); +} + +void BrowserSettings::setEnabled(bool enabled) +{ + config()->set("Browser/Enabled", enabled); +} + +bool BrowserSettings::showNotification() +{ + return config()->get("Browser/ShowNotification", true).toBool(); +} + +void BrowserSettings::setShowNotification(bool showNotification) +{ + config()->set("Browser/ShowNotification", showNotification); +} + +bool BrowserSettings::bestMatchOnly() +{ + return config()->get("Browser/BestMatchOnly", false).toBool(); +} + +void BrowserSettings::setBestMatchOnly(bool bestMatchOnly) +{ + config()->set("Browser/BestMatchOnly", bestMatchOnly); +} + +bool BrowserSettings::unlockDatabase() +{ + return config()->get("Browser/UnlockDatabase", true).toBool(); +} + +void BrowserSettings::setUnlockDatabase(bool unlockDatabase) +{ + config()->set("Browser/UnlockDatabase", unlockDatabase); +} + +bool BrowserSettings::matchUrlScheme() +{ + return config()->get("Browser/MatchUrlScheme", true).toBool(); +} + +void BrowserSettings::setMatchUrlScheme(bool matchUrlScheme) +{ + config()->set("Browser/MatchUrlScheme", matchUrlScheme); +} + +bool BrowserSettings::sortByUsername() +{ + return config()->get("Browser/SortByUsername", false).toBool(); +} + +void BrowserSettings::setSortByUsername(bool sortByUsername) +{ + config()->set("Browser/SortByUsername", sortByUsername); +} + +bool BrowserSettings::sortByTitle() +{ + return !sortByUsername(); +} + +void BrowserSettings::setSortByTitle(bool sortByUsertitle) +{ + setSortByUsername(!sortByUsertitle); +} + +bool BrowserSettings::alwaysAllowAccess() +{ + return config()->get("Browser/AlwaysAllowAccess", false).toBool(); +} + +void BrowserSettings::setAlwaysAllowAccess(bool alwaysAllowAccess) +{ + config()->set("Browser/AlwaysAllowAccess", alwaysAllowAccess); +} + +bool BrowserSettings::alwaysAllowUpdate() +{ + return config()->get("Browser/AlwaysAllowUpdate", false).toBool(); +} + +void BrowserSettings::setAlwaysAllowUpdate(bool alwaysAllowUpdate) +{ + config()->set("Browser/AlwaysAllowUpdate", alwaysAllowUpdate); +} + +bool BrowserSettings::searchInAllDatabases() +{ + return config()->get("Browser/SearchInAllDatabases", false).toBool(); +} + +void BrowserSettings::setSearchInAllDatabases(bool searchInAllDatabases) +{ + config()->set("Browser/SearchInAllDatabases", searchInAllDatabases); +} + +bool BrowserSettings::supportKphFields() +{ + return config()->get("Browser/SupportKphFields", true).toBool(); +} + +void BrowserSettings::setSupportKphFields(bool supportKphFields) +{ + config()->set("Browser/SupportKphFields", supportKphFields); +} + +bool BrowserSettings::supportBrowserProxy() +{ + return config()->get("Browser/SupportBrowserProxy", true).toBool(); +} + +void BrowserSettings::setSupportBrowserProxy(bool enabled) +{ + config()->set("Browser/SupportBrowserProxy", enabled); +} + +bool BrowserSettings::useCustomProxy() +{ + return config()->get("Browser/UseCustomProxy", false).toBool(); +} + +void BrowserSettings::setUseCustomProxy(bool enabled) +{ + config()->set("Browser/UseCustomProxy", enabled); +} + +QString BrowserSettings::customProxyLocation() +{ + return config()->get("Browser/CustomProxyLocation", " ").toString(); +} + +void BrowserSettings::setCustomProxyLocation(QString location) +{ + config()->set("Browser/CustomProxyLocation", location); +} + +bool BrowserSettings::updateBinaryPath() +{ + return config()->get("Browser/UpdateBinaryPath", false).toBool(); +} + +void BrowserSettings::setUpdateBinaryPath(bool enabled) +{ + config()->set("Browser/UpdateBinaryPath", enabled); +} + +bool BrowserSettings::chromeSupport() { + return m_hostInstaller.checkIfInstalled(HostInstaller::SupportedBrowsers::CHROME); +} + +void BrowserSettings::setChromeSupport(bool enabled) { + m_hostInstaller.installBrowser(HostInstaller::SupportedBrowsers::CHROME, enabled, supportBrowserProxy(), customProxyLocation()); +} + +bool BrowserSettings::chromiumSupport() { + return m_hostInstaller.checkIfInstalled(HostInstaller::SupportedBrowsers::CHROMIUM); +} + +void BrowserSettings::setChromiumSupport(bool enabled) { + m_hostInstaller.installBrowser(HostInstaller::SupportedBrowsers::CHROMIUM, enabled, supportBrowserProxy(), customProxyLocation()); +} + +bool BrowserSettings::firefoxSupport() { + return m_hostInstaller.checkIfInstalled(HostInstaller::SupportedBrowsers::FIREFOX); +} + +void BrowserSettings::setFirefoxSupport(bool enabled) { + m_hostInstaller.installBrowser(HostInstaller::SupportedBrowsers::FIREFOX, enabled, supportBrowserProxy(), customProxyLocation()); +} + +bool BrowserSettings::vivaldiSupport() { + return m_hostInstaller.checkIfInstalled(HostInstaller::SupportedBrowsers::VIVALDI); +} + +void BrowserSettings::setVivaldiSupport(bool enabled) { + m_hostInstaller.installBrowser(HostInstaller::SupportedBrowsers::VIVALDI, enabled, supportBrowserProxy(), customProxyLocation()); +} + +bool BrowserSettings::passwordUseNumbers() +{ + return config()->get("generator/Numbers", true).toBool(); +} + +void BrowserSettings::setPasswordUseNumbers(bool useNumbers) +{ + config()->set("generator/Numbers", useNumbers); +} + +bool BrowserSettings::passwordUseLowercase() +{ + return config()->get("generator/LowerCase", true).toBool(); +} + +void BrowserSettings::setPasswordUseLowercase(bool useLowercase) +{ + config()->set("generator/LowerCase", useLowercase); +} + +bool BrowserSettings::passwordUseUppercase() +{ + return config()->get("generator/UpperCase", true).toBool(); +} + +void BrowserSettings::setPasswordUseUppercase(bool useUppercase) +{ + config()->set("generator/UpperCase", useUppercase); +} + +bool BrowserSettings::passwordUseSpecial() +{ + return config()->get("generator/SpecialChars", false).toBool(); +} + +void BrowserSettings::setPasswordUseSpecial(bool useSpecial) +{ + config()->set("generator/SpecialChars", useSpecial); +} + +bool BrowserSettings::passwordUseEASCII() +{ + return config()->get("generator/EASCII", false).toBool(); +} + +void BrowserSettings::setPasswordUseEASCII(bool useEASCII) +{ + config()->set("generator/EASCII", useEASCII); +} + +int BrowserSettings::passPhraseWordCount() +{ + return config()->get("generator/WordCount", 6).toInt(); +} + +void BrowserSettings::setPassPhraseWordCount(int wordCount) +{ + config()->set("generator/WordCount", wordCount); +} + +QString BrowserSettings::passPhraseWordSeparator() +{ + return config()->get("generator/WordSeparator", " ").toString(); +} + +void BrowserSettings::setPassPhraseWordSeparator(QString separator) +{ + config()->set("generator/WordSeparator", separator); +} + +int BrowserSettings::generatorType() +{ + return config()->get("generator/Type", 0).toInt(); +} + +void BrowserSettings::setGeneratorType(int type) +{ + config()->set("generator/Type", type); +} + +bool BrowserSettings::passwordEveryGroup() +{ + return config()->get("generator/EnsureEvery", true).toBool(); +} + +void BrowserSettings::setPasswordEveryGroup(bool everyGroup) +{ + config()->get("generator/EnsureEvery", everyGroup); +} + +bool BrowserSettings::passwordExcludeAlike() +{ + return config()->get("generator/ExcludeAlike", true).toBool(); +} + +void BrowserSettings::setPasswordExcludeAlike(bool excludeAlike) +{ + config()->set("generator/ExcludeAlike", excludeAlike); +} + +int BrowserSettings::passwordLength() +{ + return config()->get("generator/Length", 20).toInt(); +} + +void BrowserSettings::setPasswordLength(int length) +{ + config()->set("generator/Length", length); + m_passwordGenerator.setLength(length); +} + +PasswordGenerator::CharClasses BrowserSettings::passwordCharClasses() +{ + PasswordGenerator::CharClasses classes; + if (passwordUseLowercase()) { + classes |= PasswordGenerator::LowerLetters; + } + if (passwordUseUppercase()) { + classes |= PasswordGenerator::UpperLetters; + } + if (passwordUseNumbers()) { + classes |= PasswordGenerator::Numbers; + } + if (passwordUseSpecial()) { + classes |= PasswordGenerator::SpecialCharacters; + } + if (passwordUseEASCII()) { + classes |= PasswordGenerator::EASCII; + } + return classes; +} + +PasswordGenerator::GeneratorFlags BrowserSettings::passwordGeneratorFlags() +{ + PasswordGenerator::GeneratorFlags flags; + if (passwordExcludeAlike()) { + flags |= PasswordGenerator::ExcludeLookAlike; + } + if (passwordEveryGroup()) { + flags |= PasswordGenerator::CharFromEveryGroup; + } + return flags; +} + +QString BrowserSettings::generatePassword() +{ + if (generatorType() == 0) { + m_passwordGenerator.setLength(passwordLength()); + m_passwordGenerator.setCharClasses(passwordCharClasses()); + m_passwordGenerator.setFlags(passwordGeneratorFlags()); + return m_passwordGenerator.generatePassword(); + } else { + m_passPhraseGenerator.setDefaultWordList(); + m_passPhraseGenerator.setWordCount(passPhraseWordCount()); + m_passPhraseGenerator.setWordSeparator(passPhraseWordSeparator()); + return m_passPhraseGenerator.generatePassphrase(); + } +} + +int BrowserSettings::getbits() +{ + return m_passwordGenerator.getbits(); +} + +void BrowserSettings::updateBinaryPaths(QString customProxyLocation) +{ + bool isProxy = supportBrowserProxy(); + m_hostInstaller.updateBinaryPaths(isProxy, customProxyLocation); +} diff --git a/src/browser/BrowserSettings.h b/src/browser/BrowserSettings.h new file mode 100755 index 000000000..8d08eef71 --- /dev/null +++ b/src/browser/BrowserSettings.h @@ -0,0 +1,105 @@ +/* +* Copyright (C) 2013 Francois Ferrand +* Copyright (C) 2017 Sami Vänttinen <sami.vanttinen@protonmail.com> +* Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef BROWSERSETTINGS_H +#define BROWSERSETTINGS_H + +#include "core/PasswordGenerator.h" +#include "core/PassphraseGenerator.h" +#include "HostInstaller.h" + +class BrowserSettings +{ +public: + static bool isEnabled(); + static void setEnabled(bool enabled); + + static bool showNotification(); //TODO!! + static void setShowNotification(bool showNotification); + static bool bestMatchOnly(); //TODO!! + static void setBestMatchOnly(bool bestMatchOnly); + static bool unlockDatabase(); //TODO!! + static void setUnlockDatabase(bool unlockDatabase); + static bool matchUrlScheme(); + static void setMatchUrlScheme(bool matchUrlScheme); + static bool sortByUsername(); + static void setSortByUsername(bool sortByUsername = true); + static bool sortByTitle(); + static void setSortByTitle(bool sortByUsertitle = true); + static bool alwaysAllowAccess(); + static void setAlwaysAllowAccess(bool alwaysAllowAccess); + static bool alwaysAllowUpdate(); + static void setAlwaysAllowUpdate(bool alwaysAllowUpdate); + static bool searchInAllDatabases();//TODO!! + static void setSearchInAllDatabases(bool searchInAllDatabases); + static bool supportKphFields(); + static void setSupportKphFields(bool supportKphFields); + + static bool supportBrowserProxy(); + static void setSupportBrowserProxy(bool enabled); + static bool useCustomProxy(); + static void setUseCustomProxy(bool enabled); + static QString customProxyLocation(); + static void setCustomProxyLocation(QString location); + static bool updateBinaryPath(); + static void setUpdateBinaryPath(bool enabled); + static bool chromeSupport(); + static void setChromeSupport(bool enabled); + static bool chromiumSupport(); + static void setChromiumSupport(bool enabled); + static bool firefoxSupport(); + static void setFirefoxSupport(bool enabled); + static bool vivaldiSupport(); + static void setVivaldiSupport(bool enabled); + + static bool passwordUseNumbers(); + static void setPasswordUseNumbers(bool useNumbers); + static bool passwordUseLowercase(); + static void setPasswordUseLowercase(bool useLowercase); + static bool passwordUseUppercase(); + static void setPasswordUseUppercase(bool useUppercase); + static bool passwordUseSpecial(); + static void setPasswordUseSpecial(bool useSpecial); + static bool passwordUseEASCII(); + static void setPasswordUseEASCII(bool useEASCII); + static int passPhraseWordCount(); + static void setPassPhraseWordCount(int wordCount); + static QString passPhraseWordSeparator(); + static void setPassPhraseWordSeparator(QString separator); + static int generatorType(); + static void setGeneratorType(int type); + static bool passwordEveryGroup(); + static void setPasswordEveryGroup(bool everyGroup); + static bool passwordExcludeAlike(); + static void setPasswordExcludeAlike(bool excludeAlike); + static int passwordLength(); + static void setPasswordLength(int length); + static PasswordGenerator::CharClasses passwordCharClasses(); + static PasswordGenerator::GeneratorFlags passwordGeneratorFlags(); + static QString generatePassword(); + static int getbits(); + static void updateBinaryPaths(QString customProxyLocation = QString()); + +private: + static PasswordGenerator m_passwordGenerator; + static PassphraseGenerator m_passPhraseGenerator; + static HostInstaller m_hostInstaller; +}; + +#endif // BROWSERSETTINGS_H diff --git a/src/browser/CMakeLists.txt b/src/browser/CMakeLists.txt new file mode 100755 index 000000000..61215c181 --- /dev/null +++ b/src/browser/CMakeLists.txt @@ -0,0 +1,37 @@ +# Copyright (C) 2017 Sami Vänttinen <sami.vanttinen@protonmail.com> +# Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +if(WITH_XC_BROWSER) + include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) + find_package(sodium 1.0.12 REQUIRED) + + set(keepassxcbrowser_SOURCES + BrowserAccessControlDialog.cpp + BrowserAction.cpp + BrowserClients.cpp + BrowserEntryConfig.cpp + BrowserOptionDialog.cpp + BrowserService.cpp + BrowserSettings.cpp + HostInstaller.cpp + NativeMessagingBase.cpp + NativeMessagingHost.cpp + Variant.cpp + ) + + add_library(keepassxcbrowser STATIC ${keepassxcbrowser_SOURCES}) + target_link_libraries(keepassxcbrowser Qt5::Core Qt5::Concurrent Qt5::Widgets Qt5::Network sodium) +endif() diff --git a/src/browser/HostInstaller.cpp b/src/browser/HostInstaller.cpp new file mode 100644 index 000000000..bbb5fb6f5 --- /dev/null +++ b/src/browser/HostInstaller.cpp @@ -0,0 +1,230 @@ +/* +* Copyright (C) 2017 Sami Vänttinen <sami.vanttinen@protonmail.com> +* Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "HostInstaller.h" +#include <QDir> +#include <QFile> +#include <QStandardPaths> +#include <QJsonArray> +#include <QJsonDocument> +#include <QCoreApplication> +#include <QMessageBox> + +const QString HostInstaller::HOST_NAME = "org.keepassxc.keepassxc_browser"; +const QStringList HostInstaller::ALLOWED_ORIGINS = QStringList() + << "chrome-extension://iopaggbpplllidnfmcghoonnokmjoicf/" + << "chrome-extension://fhakpkpdnjecjfceboihdjpfmgajebii/" + << "chrome-extension://jaikbblhommnkeialomogohhdlndpfbi/"; + +const QStringList HostInstaller::ALLOWED_EXTENSIONS = QStringList() + << "keepassxc-browser@keepassxc.org"; + +#if defined(Q_OS_OSX) + const QString HostInstaller::TARGET_DIR_CHROME = "/Library/Application Support/Google/Chrome/NativeMessagingHosts"; + const QString HostInstaller::TARGET_DIR_CHROMIUM = "/Library/Application Support/Chromium/NativeMessagingHosts"; + const QString HostInstaller::TARGET_DIR_FIREFOX = "/Library/Application Support/Mozilla/NativeMessagingHosts"; + const QString HostInstaller::TARGET_DIR_VIVALDI = "/Library/Application Support/Vivaldi/NativeMessagingHosts"; +#elif defined(Q_OS_LINUX) + const QString HostInstaller::TARGET_DIR_CHROME = "/.config/google-chrome/NativeMessagingHosts"; + const QString HostInstaller::TARGET_DIR_CHROMIUM = "/.config/chromium/NativeMessagingHosts"; + const QString HostInstaller::TARGET_DIR_FIREFOX = "/.mozilla/native-messaging-hosts"; + const QString HostInstaller::TARGET_DIR_VIVALDI = "/.config/vivaldi/NativeMessagingHosts"; +#elif defined(Q_OS_WIN) + const QString HostInstaller::TARGET_DIR_CHROME = "HKEY_CURRENT_USER\\Software\\Google\\Chrome\\NativeMessagingHosts\\" + HostInstaller::HOST_NAME; + const QString HostInstaller::TARGET_DIR_CHROMIUM = "HKEY_CURRENT_USER\\Software\\Chromium\\NativeMessagingHosts\\" + HostInstaller::HOST_NAME; + const QString HostInstaller::TARGET_DIR_FIREFOX = "HKEY_CURRENT_USER\\Software\\Mozilla\\NativeMessagingHosts\\" + HostInstaller::HOST_NAME; + const QString HostInstaller::TARGET_DIR_VIVALDI = "HKEY_CURRENT_USER\\Software\\Vivaldi\\NativeMessagingHosts\\" + HostInstaller::HOST_NAME; +#endif + +HostInstaller::HostInstaller() +{ + +} + +bool HostInstaller::checkIfInstalled(SupportedBrowsers browser) +{ + QString fileName = getPath(browser); +#ifdef Q_OS_WIN + QSettings settings(getTargetPath(browser), QSettings::NativeFormat); + return registryEntryFound(settings); +#else + return QFile::exists(fileName); +#endif +} + +void HostInstaller::installBrowser(SupportedBrowsers browser, const bool& enabled, const bool& proxy, const QString& location) +{ + if (enabled) { + #ifdef Q_OS_WIN + // Create a registry key + QSettings settings(getTargetPath(browser), QSettings::NativeFormat); + if (!registryEntryFound(settings)) { + settings.setValue("Default", getPath(browser)); + } + #endif + // Always create the script file + QJsonObject script = constructFile(browser, proxy, location); + if (!saveFile(browser, script)) { + QMessageBox::critical(0, tr("KeePassXC: Cannot save file!"), + tr("Cannot save the native messaging script file."), QMessageBox::Ok); + } + } else { + // Remove the script file + QString fileName = getPath(browser); + QFile::remove(fileName); + #ifdef Q_OS_WIN + // Remove the registry entry + QSettings settings(getTargetPath(browser), QSettings::NativeFormat); + if (registryEntryFound(settings)) { + settings.remove("Default"); + } + #endif + } +} + +void HostInstaller::updateBinaryPaths(const bool& proxy, const QString& location) +{ + for (int i = 0; i < 4; ++i) { + if (checkIfInstalled(static_cast<SupportedBrowsers>(i))) { + installBrowser(static_cast<SupportedBrowsers>(i), true, proxy, location); + } + } +} + +QString HostInstaller::getTargetPath(SupportedBrowsers browser) const +{ + switch (browser) { + case SupportedBrowsers::CHROME: return HostInstaller::TARGET_DIR_CHROME; + case SupportedBrowsers::CHROMIUM: return HostInstaller::TARGET_DIR_CHROMIUM; + case SupportedBrowsers::FIREFOX: return HostInstaller::TARGET_DIR_FIREFOX; + case SupportedBrowsers::VIVALDI: return HostInstaller::TARGET_DIR_VIVALDI; + default: return QString(); + } +} + +QString HostInstaller::getBrowserName(SupportedBrowsers browser) const +{ + switch (browser) { + case SupportedBrowsers::CHROME: return "chrome"; + case SupportedBrowsers::CHROMIUM: return "chromium"; + case SupportedBrowsers::FIREFOX: return "firefox"; + case SupportedBrowsers::VIVALDI: return "vivaldi"; + default: return QString(); + } +} + +QString HostInstaller::getPath(SupportedBrowsers browser) const +{ +#ifdef Q_OS_WIN + // If portable settings file exists save the JSON scripts to application folder + QString userPath; + QString portablePath = QCoreApplication::applicationDirPath() + "/keepassxc.ini"; + if (QFile::exists(portablePath)) { + userPath = QCoreApplication::applicationDirPath(); + } else { + userPath = QDir::fromNativeSeparators(QStandardPaths::writableLocation(QStandardPaths::DataLocation)); + } + + QString winPath = QString("%1/%2_%3.json").arg(userPath, HostInstaller::HOST_NAME, getBrowserName(browser)); + winPath.replace("/","\\"); + return winPath; +#else + QString path = getTargetPath(browser); + return QString("%1%2/%3.json").arg(QDir::homePath(), path, HostInstaller::HOST_NAME); +#endif +} + +QString HostInstaller::getInstallDir(SupportedBrowsers browser) const +{ + QString path = getTargetPath(browser); +#ifdef Q_OS_WIN + return QCoreApplication::applicationDirPath(); +#else + return QString("%1%2").arg(QDir::homePath(), path); +#endif +} + +QJsonObject HostInstaller::constructFile(SupportedBrowsers browser, const bool& proxy, const QString& location) +{ + QString path; + if (proxy) { + if (!location.isEmpty()) { + path = location; + } else { + path = QFileInfo(QCoreApplication::applicationFilePath()).absolutePath(); + path.append("/keepassxc-proxy"); +#ifdef Q_OS_WIN + path.append(".exe"); +#endif + } + } else { + path = QFileInfo(QCoreApplication::applicationFilePath()).absoluteFilePath(); + } +#ifdef Q_OS_WIN + path.replace("/","\\"); +#endif + + QJsonObject script; + script["name"] = HostInstaller::HOST_NAME; + script["description"] = "KeePassXC integration with native messaging support"; + script["path"] = path; + script["type"] = "stdio"; + + QJsonArray arr; + if (browser == SupportedBrowsers::FIREFOX) { + for (const QString extension : HostInstaller::ALLOWED_EXTENSIONS) { + arr.append(extension); + } + script["allowed_extensions"] = arr; + } else { + for (const QString origin : HostInstaller::ALLOWED_ORIGINS) { + arr.append(origin); + } + script["allowed_origins"] = arr; + } + + return script; +} + +bool HostInstaller::registryEntryFound(const QSettings& settings) +{ + return !settings.value("Default").isNull(); +} + +bool HostInstaller::saveFile(SupportedBrowsers browser, const QJsonObject& script) +{ + QString path = getPath(browser); + QString installDir = getInstallDir(browser); + QDir dir(installDir); + if (!dir.exists()) { + QDir().mkpath(installDir); + } + + QFile scriptFile(path); + if (!scriptFile.open(QIODevice::WriteOnly)) { + return false; + } + + QJsonDocument doc(script); + qint64 bytesWritten = scriptFile.write(doc.toJson()); + if (bytesWritten < 0) { + return false; + } + + return true; +} diff --git a/src/browser/HostInstaller.h b/src/browser/HostInstaller.h new file mode 100644 index 000000000..c3fc85620 --- /dev/null +++ b/src/browser/HostInstaller.h @@ -0,0 +1,63 @@ +/* +* Copyright (C) 2017 Sami Vänttinen <sami.vanttinen@protonmail.com> +* Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef HOSTINSTALLER_H +#define HOSTINSTALLER_H + +#include <QObject> +#include <QJsonObject> +#include <QSettings> + +class HostInstaller : public QObject +{ + Q_OBJECT + +public: + enum SupportedBrowsers : int { + CHROME = 0, + CHROMIUM = 1, + FIREFOX = 2, + VIVALDI = 3 + }; + +public: + HostInstaller(); + bool checkIfInstalled(SupportedBrowsers browser); + void installBrowser(SupportedBrowsers browser, const bool& enabled, const bool& proxy = false, const QString& location = ""); + void updateBinaryPaths(const bool& proxy, const QString& location = ""); + +private: + QString getTargetPath(SupportedBrowsers browser) const; + QString getBrowserName(SupportedBrowsers browser) const; + QString getPath(SupportedBrowsers browser) const; + QString getInstallDir(SupportedBrowsers browser) const; + QJsonObject constructFile(SupportedBrowsers browser, const bool& proxy, const QString& location); + bool registryEntryFound(const QSettings& settings); + bool saveFile(SupportedBrowsers browser, const QJsonObject& script); + +private: + static const QString HOST_NAME; + static const QStringList ALLOWED_EXTENSIONS; + static const QStringList ALLOWED_ORIGINS; + static const QString TARGET_DIR_CHROME; + static const QString TARGET_DIR_CHROMIUM; + static const QString TARGET_DIR_FIREFOX; + static const QString TARGET_DIR_VIVALDI; +}; + +#endif // HOSTINSTALLER_H diff --git a/src/browser/NativeMessagingBase.cpp b/src/browser/NativeMessagingBase.cpp new file mode 100644 index 000000000..fb4959688 --- /dev/null +++ b/src/browser/NativeMessagingBase.cpp @@ -0,0 +1,141 @@ +/* +* Copyright (C) 2017 Sami Vänttinen <sami.vanttinen@protonmail.com> +* Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "NativeMessagingBase.h" +#include <QStandardPaths> + +#if defined(Q_OS_UNIX) && !defined(Q_OS_LINUX) +#include <sys/types.h> +#include <sys/event.h> +#include <sys/time.h> +#include <unistd.h> +#endif + +#ifdef Q_OS_LINUX +#include <sys/epoll.h> +#include <unistd.h> +#endif + +#ifdef Q_OS_WIN +#include <fcntl.h> +#include <io.h> +#endif + +NativeMessagingBase::NativeMessagingBase() +{ +#ifdef Q_OS_WIN + _setmode(_fileno(stdin), _O_BINARY); + _setmode(_fileno(stdout), _O_BINARY); +#else + m_notifier.reset(new QSocketNotifier(fileno(stdin), QSocketNotifier::Read, this)); + connect(m_notifier.data(), SIGNAL(activated(int)), this, SLOT(newNativeMessage())); +#endif +} + +void NativeMessagingBase::newNativeMessage() +{ +#if defined(Q_OS_UNIX) && !defined(Q_OS_LINUX) + struct kevent ev[1]; + struct timespec ts = { 5, 0 }; + + int fd = kqueue(); + if (fd == -1) { + m_notifier->setEnabled(false); + return; + } + + EV_SET(ev, fileno(stdin), EVFILT_READ, EV_ADD, 0, 0, nullptr); + if (kevent(fd, ev, 1, nullptr, 0, &ts) == -1) { + m_notifier->setEnabled(false); + return; + } + + int ret = kevent(fd, NULL, 0, ev, 1, &ts); + if (ret < 1) { + m_notifier->setEnabled(false); + ::close(fd); + return; + } +#elif defined(Q_OS_LINUX) + int fd = epoll_create(5); + struct epoll_event event; + event.events = EPOLLIN; + event.data.fd = 0; + if (epoll_ctl(fd, EPOLL_CTL_ADD, 0, &event) != 0) { + m_notifier->setEnabled(false); + return; + } + + if (epoll_wait(fd, &event, 1, 5000) < 1) { + m_notifier->setEnabled(false); + ::close(fd); + return; + } +#endif + readLength(); +#ifndef Q_OS_WIN + ::close(fd); +#endif +} + +void NativeMessagingBase::readNativeMessages() +{ +#ifdef Q_OS_WIN + quint32 length = 0; + while (m_running.load() && !std::cin.eof()) { + length = 0; + std::cin.read(reinterpret_cast<char*>(&length), 4); + readStdIn(length); + QThread::msleep(1); + } +#endif +} + +QString NativeMessagingBase::jsonToString(const QJsonObject& json) const +{ + return QString(QJsonDocument(json).toJson(QJsonDocument::Compact)); +} + +void NativeMessagingBase::sendReply(const QJsonObject& json) +{ + if (!json.isEmpty()) { + sendReply(jsonToString(json)); + } +} + +void NativeMessagingBase::sendReply(const QString& reply) +{ + if (!reply.isEmpty()) { + uint len = reply.length(); + std::cout << char(((len>>0) & 0xFF)) << char(((len>>8) & 0xFF)) << char(((len>>16) & 0xFF)) << char(((len>>24) & 0xFF)); + std::cout << reply.toStdString() << std::flush; + } +} + +QString NativeMessagingBase::getLocalServerPath() const +{ +#if defined(Q_OS_WIN) + return QStandardPaths::writableLocation(QStandardPaths::TempLocation) + "/kpxc_server"; +#elif defined(Q_OS_UNIX) && !defined(Q_OS_MAC) + // Use XDG_RUNTIME_DIR instead of /tmp/ if it's available + QString path = QStandardPaths::writableLocation(QStandardPaths::RuntimeLocation) + "/kpxc_server"; + return path.isEmpty() ? "/tmp/kpxc_server" : path; +#else // Q_OS_MAC and others + return "/tmp/kpxc_server"; +#endif +} diff --git a/src/browser/NativeMessagingBase.h b/src/browser/NativeMessagingBase.h new file mode 100644 index 000000000..4253b7585 --- /dev/null +++ b/src/browser/NativeMessagingBase.h @@ -0,0 +1,61 @@ +/* +* Copyright (C) 2017 Sami Vänttinen <sami.vanttinen@protonmail.com> +* Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef NATIVEMESSAGINGBASE_H +#define NATIVEMESSAGINGBASE_H + +#include <QObject> +#include <QJsonObject> +#include <QJsonDocument> +#include <QFuture> +#include <QtConcurrent/QtConcurrent> +#include <QMutex> +#include <QSocketNotifier> +#include <QLocalServer> +#include <QLocalSocket> +#include <QAtomicInteger> +#include <iostream> +#include <unistd.h> + +class NativeMessagingBase : public QObject +{ + Q_OBJECT + +public: + explicit NativeMessagingBase(); + ~NativeMessagingBase() = default; + +protected slots: + void newNativeMessage(); + +protected: + virtual void readLength() = 0; + virtual void readStdIn(const quint32 length) = 0; + void readNativeMessages(); + QString jsonToString(const QJsonObject& json) const; + void sendReply(const QJsonObject& json); + void sendReply(const QString& reply); + QString getLocalServerPath() const; + +protected: + QAtomicInteger<quint8> m_running; + QSharedPointer<QSocketNotifier> m_notifier; + QFuture<void> m_future; +}; + +#endif // NATIVEMESSAGINGBASE_H diff --git a/src/browser/NativeMessagingHost.cpp b/src/browser/NativeMessagingHost.cpp new file mode 100755 index 000000000..1dcd24cb1 --- /dev/null +++ b/src/browser/NativeMessagingHost.cpp @@ -0,0 +1,200 @@ +/* +* Copyright (C) 2017 Sami Vänttinen <sami.vanttinen@protonmail.com> +* Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <QMutexLocker> +#include <QtNetwork> +#include <iostream> +#include "sodium.h" +#include "NativeMessagingHost.h" +#include "BrowserSettings.h" + +NativeMessagingHost::NativeMessagingHost(DatabaseTabWidget* parent) : + NativeMessagingBase(), + m_mutex(QMutex::Recursive), + m_browserClients(m_browserService), + m_browserService(parent) +{ + m_localServer.reset(new QLocalServer(this)); + m_localServer->setSocketOptions(QLocalServer::UserAccessOption); + m_running.store(false); + + if (BrowserSettings::isEnabled() && !m_running) { + run(); + } + + connect(&m_browserService, SIGNAL(databaseLocked()), this, SLOT(databaseLocked())); + connect(&m_browserService, SIGNAL(databaseUnlocked()), this, SLOT(databaseUnlocked())); +} + +NativeMessagingHost::~NativeMessagingHost() +{ + stop(); +} + +int NativeMessagingHost::init() +{ + QMutexLocker locker(&m_mutex); + return sodium_init(); +} + +void NativeMessagingHost::run() +{ + QMutexLocker locker(&m_mutex); + if (!m_running.load() && init() == -1) { + return; + } + + // Update KeePassXC/keepassxc-proxy binary paths to Native Messaging scripts + if (BrowserSettings::updateBinaryPath()) { + BrowserSettings::updateBinaryPaths(BrowserSettings::useCustomProxy() ? BrowserSettings::customProxyLocation() : ""); + } + + m_running.store(true); +#ifdef Q_OS_WIN + m_future = QtConcurrent::run(this, static_cast<void(NativeMessagingHost::*)()>(&NativeMessagingHost::readNativeMessages)); +#endif + + if (BrowserSettings::supportBrowserProxy()) { + QString serverPath = getLocalServerPath(); + QFile::remove(serverPath); + m_localServer->listen(serverPath); + connect(m_localServer.data(), SIGNAL(newConnection()), this, SLOT(newLocalConnection())); + } else { + m_localServer->close(); + } +} + +void NativeMessagingHost::stop() +{ + databaseLocked(); + QMutexLocker locker(&m_mutex); + m_socketList.clear(); + m_running.testAndSetOrdered(true, false); + m_future.waitForFinished(); + m_localServer->close(); +} + +void NativeMessagingHost::readLength() +{ + quint32 length = 0; + std::cin.read(reinterpret_cast<char*>(&length), 4); + if (!std::cin.eof() && length > 0) + { + readStdIn(length); + } +} + +void NativeMessagingHost::readStdIn(const quint32 length) +{ + if (length > 0) { + QByteArray arr; + arr.reserve(length); + + for (quint32 i = 0; i < length; ++i) { + arr.append(getchar()); + } + + if (arr.length() > 0) { + QMutexLocker locker(&m_mutex); + sendReply(m_browserClients.readResponse(arr)); + } + } +} + +void NativeMessagingHost::newLocalConnection() +{ + QLocalSocket* socket = m_localServer->nextPendingConnection(); + connect(socket, SIGNAL(readyRead()), this, SLOT(newLocalMessage())); + connect(socket, SIGNAL(disconnected()), this, SLOT(disconnectSocket())); +} + +void NativeMessagingHost::newLocalMessage() +{ + QLocalSocket* socket = qobject_cast<QLocalSocket*>(QObject::sender()); + + if (!socket || socket->bytesAvailable() <= 0) { + return; + } + + QByteArray arr = socket->readAll(); + if (arr.isEmpty()) { + return; + } + + QMutexLocker locker(&m_mutex); + if (!m_socketList.contains(socket)) { + m_socketList.push_back(socket); + } + + QString reply = jsonToString(m_browserClients.readResponse(arr)); + if (socket && socket->isValid() && socket->state() == QLocalSocket::ConnectedState) { + QByteArray arr = reply.toUtf8(); + socket->write(arr.constData(), arr.length()); + socket->flush(); + } +} + +void NativeMessagingHost::sendReplyToAllClients(const QJsonObject& json) +{ + QString reply = jsonToString(json); + QMutexLocker locker(&m_mutex); + for (const auto socket : m_socketList) { + if (socket && socket->isValid() && socket->state() == QLocalSocket::ConnectedState) { + QByteArray arr = reply.toUtf8(); + socket->write(arr.constData(), arr.length()); + socket->flush(); + } + } +} + +void NativeMessagingHost::disconnectSocket() +{ + QLocalSocket* socket(qobject_cast<QLocalSocket*>(QObject::sender())); + QMutexLocker locker(&m_mutex); + for (auto s : m_socketList) { + if (s == socket) { + m_socketList.removeOne(s); + } + } +} + +void NativeMessagingHost::removeSharedEncryptionKeys() +{ + QMutexLocker locker(&m_mutex); + m_browserService.removeSharedEncryptionKeys(); +} + +void NativeMessagingHost::removeStoredPermissions() +{ + QMutexLocker locker(&m_mutex); + m_browserService.removeStoredPermissions(); +} + +void NativeMessagingHost::databaseLocked() +{ + QJsonObject response; + response["action"] = "database-locked"; + sendReplyToAllClients(response); +} + +void NativeMessagingHost::databaseUnlocked() +{ + QJsonObject response; + response["action"] = "database-unlocked"; + sendReplyToAllClients(response); +} diff --git a/src/browser/NativeMessagingHost.h b/src/browser/NativeMessagingHost.h new file mode 100755 index 000000000..80825237b --- /dev/null +++ b/src/browser/NativeMessagingHost.h @@ -0,0 +1,67 @@ +/* +* Copyright (C) 2017 Sami Vänttinen <sami.vanttinen@protonmail.com> +* Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef NATIVEMESSAGINGHOST_H +#define NATIVEMESSAGINGHOST_H + +#include "NativeMessagingBase.h" +#include "BrowserClients.h" +#include "BrowserService.h" +#include "gui/DatabaseTabWidget.h" + +class NativeMessagingHost : public NativeMessagingBase +{ + Q_OBJECT + + typedef QList<QLocalSocket*> SocketList; + +public: + explicit NativeMessagingHost(DatabaseTabWidget* parent = 0); + ~NativeMessagingHost(); + int init(); + void run(); + void stop(); + +public slots: + void removeSharedEncryptionKeys(); + void removeStoredPermissions(); + +signals: + void quit(); + +private: + void readLength(); + void readStdIn(const quint32 length); + void sendReplyToAllClients(const QJsonObject& json); + +private slots: + void databaseLocked(); + void databaseUnlocked(); + void newLocalConnection(); + void newLocalMessage(); + void disconnectSocket(); + +private: + QMutex m_mutex; + BrowserClients m_browserClients; + BrowserService m_browserService; + QSharedPointer<QLocalServer> m_localServer; + SocketList m_socketList; +}; + +#endif // NATIVEMESSAGINGHOST_H diff --git a/src/browser/Variant.cpp b/src/browser/Variant.cpp new file mode 100644 index 000000000..2d42ac4ec --- /dev/null +++ b/src/browser/Variant.cpp @@ -0,0 +1,37 @@ +/* +* Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "Variant.h" + +QVariantMap qo2qv(const QObject* object, const QStringList& ignoredProperties) +{ + QVariantMap result; + const QMetaObject* metaobject = object->metaObject(); + int count = metaobject->propertyCount(); + for (int i = 0; i < count; ++i) { + QMetaProperty metaproperty = metaobject->property(i); + const char* name = metaproperty.name(); + + if (ignoredProperties.contains(QLatin1String(name)) || (!metaproperty.isReadable())) { + continue; + } + + QVariant value = object->property(name); + result[QLatin1String(name)] = value; + } + return result; +} diff --git a/src/browser/Variant.h b/src/browser/Variant.h new file mode 100644 index 000000000..e467b4211 --- /dev/null +++ b/src/browser/Variant.h @@ -0,0 +1,25 @@ +/* +* Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef VARIANT_H +#define VARIANT_H + +#include <QtCore> + +QVariantMap qo2qv(const QObject* object, const QStringList& ignoredProperties = QStringList(QString(QLatin1String("objectName")))); + +#endif // VARIANT_H diff --git a/src/config-keepassx.h.cmake b/src/config-keepassx.h.cmake index b06e702a9..5a00a5dba 100644 --- a/src/config-keepassx.h.cmake +++ b/src/config-keepassx.h.cmake @@ -16,6 +16,7 @@ #cmakedefine WITH_XC_AUTOTYPE #cmakedefine WITH_XC_YUBIKEY #cmakedefine WITH_XC_SSHAGENT +#cmakedefine WITH_XC_BROWSER #cmakedefine KEEPASSXC_DIST #cmakedefine KEEPASSXC_DIST_TYPE "@KEEPASSXC_DIST_TYPE@" diff --git a/src/core/PassphraseGenerator.cpp b/src/core/PassphraseGenerator.cpp index 1af614795..115c70d6d 100644 --- a/src/core/PassphraseGenerator.cpp +++ b/src/core/PassphraseGenerator.cpp @@ -28,8 +28,7 @@ PassphraseGenerator::PassphraseGenerator() : m_wordCount(0) , m_separator(' ') { - const QString path = filePath()->dataPath("wordlists/eff_large.wordlist"); - setWordList(path); + } double PassphraseGenerator::calculateEntropy(QString passphrase) @@ -46,12 +45,12 @@ double PassphraseGenerator::calculateEntropy(QString passphrase) void PassphraseGenerator::setWordCount(int wordCount) { if (wordCount > 0) { - m_wordCount = wordCount; + m_wordCount = wordCount; } else { // safe default if something goes wrong m_wordCount = 7; } - + } void PassphraseGenerator::setWordList(QString path) @@ -75,6 +74,12 @@ void PassphraseGenerator::setWordList(QString path) } } +void PassphraseGenerator::setDefaultWordList() +{ + const QString path = filePath()->dataPath("wordlists/eff_large.wordlist"); + setWordList(path); +} + void PassphraseGenerator::setWordSeparator(QString separator) { m_separator = separator; } diff --git a/src/core/PassphraseGenerator.h b/src/core/PassphraseGenerator.h index 3be2d5836..20845ff21 100644 --- a/src/core/PassphraseGenerator.h +++ b/src/core/PassphraseGenerator.h @@ -30,6 +30,7 @@ public: double calculateEntropy(QString passphrase); void setWordCount(int wordCount); void setWordList(QString path); + void setDefaultWordList(); void setWordSeparator(QString separator); bool isValid() const; @@ -43,4 +44,4 @@ private: Q_DISABLE_COPY(PassphraseGenerator) }; -#endif // KEEPASSX_PASSPHRASEGENERATOR_H \ No newline at end of file +#endif // KEEPASSX_PASSPHRASEGENERATOR_H diff --git a/src/gui/AboutDialog.cpp b/src/gui/AboutDialog.cpp index e89a7fdcb..44ab895e8 100644 --- a/src/gui/AboutDialog.cpp +++ b/src/gui/AboutDialog.cpp @@ -90,6 +90,9 @@ AboutDialog::AboutDialog(QWidget* parent) #ifdef WITH_XC_SSHAGENT extensions += "\n- SSH Agent"; #endif +#ifdef WITH_XC_BROWSER + extensions += "\n- Native messaging browser extension"; +#endif if (extensions.isEmpty()) extensions = " None"; diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 72be3a4aa..4804b47b2 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -54,6 +54,12 @@ #include "sshagent/SSHAgent.h" #endif +#ifdef WITH_XC_BROWSER +#include "browser/NativeMessagingHost.h" +#include "browser/BrowserSettings.h" +#include "browser/BrowserOptionDialog.h" +#endif + #include "gui/SettingsWidget.h" #include "gui/PasswordGeneratorWidget.h" @@ -104,6 +110,54 @@ private: }; #endif +#ifdef WITH_XC_BROWSER +class BrowserPlugin: public ISettingsPage +{ + public: + BrowserPlugin(DatabaseTabWidget* tabWidget) { + m_nativeMessagingHost = QSharedPointer<NativeMessagingHost>(new NativeMessagingHost(tabWidget)); + } + + ~BrowserPlugin() { + + } + + QString name() override + { + return QObject::tr("Browser extension with native messaging"); + } + + QIcon icon() override + { + return FilePath::instance()->icon("apps", "internet-web-browser"); + } + + QWidget* createWidget() override { + BrowserOptionDialog* dlg = new BrowserOptionDialog(); + QObject::connect(dlg, SIGNAL(removeSharedEncryptionKeys()), m_nativeMessagingHost.data(), SLOT(removeSharedEncryptionKeys())); + QObject::connect(dlg, SIGNAL(removeStoredPermissions()), m_nativeMessagingHost.data(), SLOT(removeStoredPermissions())); + return dlg; + } + + void loadSettings(QWidget* widget) override + { + qobject_cast<BrowserOptionDialog*>(widget)->loadSettings(); + } + + void saveSettings(QWidget* widget) override + { + qobject_cast<BrowserOptionDialog*>(widget)->saveSettings(); + if (BrowserSettings::isEnabled()) { + m_nativeMessagingHost->run(); + } else { + m_nativeMessagingHost->stop(); + } + } + private: + QSharedPointer<NativeMessagingHost> m_nativeMessagingHost; +}; +#endif + const QString MainWindow::BaseWindowTitle = "KeePassXC"; MainWindow::MainWindow() @@ -134,6 +188,9 @@ MainWindow::MainWindow() SSHAgent::init(this); m_ui->settingsWidget->addSettingsPage(new AgentSettingsPage(m_ui->tabWidget)); #endif + #ifdef WITH_XC_BROWSER + m_ui->settingsWidget->addSettingsPage(new BrowserPlugin(m_ui->tabWidget)); + #endif setWindowIcon(filePath()->applicationIcon()); m_ui->globalMessageWidget->setHidden(true); diff --git a/src/gui/PasswordGeneratorWidget.cpp b/src/gui/PasswordGeneratorWidget.cpp index 70375a048..1c72bd353 100644 --- a/src/gui/PasswordGeneratorWidget.cpp +++ b/src/gui/PasswordGeneratorWidget.cpp @@ -80,7 +80,8 @@ PasswordGeneratorWidget::PasswordGeneratorWidget(QWidget* parent) m_ui->comboBoxWordList->setVisible(false); m_ui->labelWordList->setVisible(false); } - + + m_dicewareGenerator->setDefaultWordList(); loadSettings(); reset(); } @@ -164,7 +165,7 @@ void PasswordGeneratorWidget::keyPressEvent(QKeyEvent* e) } void PasswordGeneratorWidget::regeneratePassword() -{ +{ if (m_ui->tabWidget->currentIndex() == Password) { if (m_passwordGenerator->isValid()) { QString password = m_passwordGenerator->generatePassword(); diff --git a/src/main.cpp b/src/main.cpp index 82331f072..deabeabb7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -69,12 +69,18 @@ int main(int argc, char** argv) "keyfile"); QCommandLineOption pwstdinOption("pw-stdin", QCoreApplication::translate("main", "read password of the database from stdin")); + // This is needed under Windows where clients send --parent-window parameter with Native Messaging connect method + QCommandLineOption parentWindowOption(QStringList() << "pw" + << "parent-window", + QCoreApplication::translate("main", "Parent window handle"), + "handle"); parser.addHelpOption(); parser.addVersionOption(); parser.addOption(configOption); parser.addOption(keyfileOption); parser.addOption(pwstdinOption); + parser.addOption(parentWindowOption); parser.process(app); const QStringList fileNames = parser.positionalArguments(); @@ -86,7 +92,7 @@ int main(int argc, char** argv) qWarning() << QCoreApplication::translate("Main", "Another instance of KeePassXC is already running.").toUtf8().constData(); return 0; } - + QApplication::setQuitOnLastWindowClosed(false); if (!Crypto::init()) { @@ -116,7 +122,7 @@ int main(int argc, char** argv) QObject::connect(&app, SIGNAL(applicationActivated()), &mainWindow, SLOT(bringToFront())); QObject::connect(&app, SIGNAL(openFile(QString)), &mainWindow, SLOT(openDatabase(QString))); QObject::connect(&app, SIGNAL(quitSignalReceived()), &mainWindow, SLOT(appExit()), Qt::DirectConnection); - + // start minimized if configured bool minimizeOnStartup = config()->get("GUI/MinimizeOnStartup").toBool(); bool minimizeToTray = config()->get("GUI/MinimizeToTray").toBool(); @@ -126,7 +132,7 @@ int main(int argc, char** argv) if (!(minimizeOnStartup && minimizeToTray)) { mainWindow.show(); } - + if (config()->get("OpenPreviousDatabasesOnStartup").toBool()) { const QStringList fileNames = config()->get("LastOpenedDatabases").toStringList(); for (const QString& filename: fileNames) { @@ -138,13 +144,12 @@ int main(int argc, char** argv) const bool pwstdin = parser.isSet(pwstdinOption); for (const QString& filename: fileNames) { - if (!filename.isEmpty() && QFile::exists(filename)) { + if (!filename.isEmpty() && QFile::exists(filename) && !filename.endsWith(".json", Qt::CaseInsensitive)) { QString password; if (pwstdin) { static QTextStream in(stdin, QIODevice::ReadOnly); password = in.readLine(); } - mainWindow.openDatabase(filename, password, parser.value(keyfileOption)); } } diff --git a/src/proxy/CMakeLists.txt b/src/proxy/CMakeLists.txt new file mode 100755 index 000000000..4fe32428d --- /dev/null +++ b/src/proxy/CMakeLists.txt @@ -0,0 +1,34 @@ +# Copyright (C) 2017 Sami Vänttinen <sami.vanttinen@protonmail.com> +# Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +if(WITH_XC_BROWSER) + include_directories(${BROWSER_SOURCE_DIR}) + + set(proxy_SOURCES + keepassxc-proxy.cpp + ${BROWSER_SOURCE_DIR}/NativeMessagingBase.cpp + NativeMessagingHost.cpp) + + add_library(proxy STATIC ${proxy_SOURCES}) + target_link_libraries(proxy Qt5::Core Qt5::Network) + add_executable(keepassxc-proxy keepassxc-proxy.cpp) + target_link_libraries(keepassxc-proxy proxy) + + install(TARGETS keepassxc-proxy + BUNDLE DESTINATION . COMPONENT Runtime + RUNTIME DESTINATION ${PROXY_INSTALL_DIR} COMPONENT Runtime) + +endif() diff --git a/src/proxy/NativeMessagingHost.cpp b/src/proxy/NativeMessagingHost.cpp new file mode 100755 index 000000000..2add63814 --- /dev/null +++ b/src/proxy/NativeMessagingHost.cpp @@ -0,0 +1,95 @@ +/* +* Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <QCoreApplication> +#include "NativeMessagingHost.h" + +NativeMessagingHost::NativeMessagingHost() : NativeMessagingBase() +{ + m_localSocket = new QLocalSocket(); + m_localSocket->connectToServer(getLocalServerPath()); +#ifdef Q_OS_WIN + m_running.store(true); + m_future = QtConcurrent::run(this, static_cast<void(NativeMessagingHost::*)()>(&NativeMessagingHost::readNativeMessages)); +#endif + connect(m_localSocket, SIGNAL(readyRead()), this, SLOT(newLocalMessage())); + connect(m_localSocket, SIGNAL(disconnected()), this, SLOT(deleteSocket())); + connect(m_localSocket, SIGNAL(stateChanged(QLocalSocket::LocalSocketState)), this, SLOT(socketStateChanged(QLocalSocket::LocalSocketState))); +} + +NativeMessagingHost::~NativeMessagingHost() +{ +#ifdef Q_OS_WIN + m_future.waitForFinished(); +#endif +} + +void NativeMessagingHost::readLength() +{ + quint32 length = 0; + std::cin.read(reinterpret_cast<char*>(&length), 4); + if (!std::cin.eof() && length > 0) { + readStdIn(length); + } else { + QCoreApplication::quit(); + } +} + +void NativeMessagingHost::readStdIn(const quint32 length) +{ + if (length > 0) { + QByteArray arr; + arr.reserve(length); + + for (quint32 i = 0; i < length; ++i) { + arr.append(getchar()); + } + + if (arr.length() > 0 && m_localSocket && m_localSocket->state() == QLocalSocket::ConnectedState) { + m_localSocket->write(arr.constData(), arr.length()); + m_localSocket->flush(); + } + } +} + +void NativeMessagingHost::newLocalMessage() +{ + if (!m_localSocket || m_localSocket->bytesAvailable() <= 0) { + return; + } + + QByteArray arr = m_localSocket->readAll(); + if (!arr.isEmpty()) { + sendReply(arr); + } +} + +void NativeMessagingHost::deleteSocket() +{ + if (m_notifier) { + m_notifier->setEnabled(false); + } + m_localSocket->deleteLater(); + QCoreApplication::quit(); +} + +void NativeMessagingHost::socketStateChanged(QLocalSocket::LocalSocketState socketState) +{ + if (socketState == QLocalSocket::UnconnectedState || socketState == QLocalSocket::ClosingState) { + m_running.testAndSetOrdered(true, false); + } +} diff --git a/src/proxy/NativeMessagingHost.h b/src/proxy/NativeMessagingHost.h new file mode 100755 index 000000000..41f3ed753 --- /dev/null +++ b/src/proxy/NativeMessagingHost.h @@ -0,0 +1,43 @@ +/* +* Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef NATIVEMESSAGINGHOST_H +#define NATIVEMESSAGINGHOST_H + +#include "NativeMessagingBase.h" + +class NativeMessagingHost : public NativeMessagingBase +{ + Q_OBJECT +public: + NativeMessagingHost(); + ~NativeMessagingHost(); + +public slots: + void newLocalMessage(); + void deleteSocket(); + void socketStateChanged(QLocalSocket::LocalSocketState socketState); + +private: + void readLength(); + void readStdIn(const quint32 length); + +private: + QLocalSocket* m_localSocket; +}; + +#endif // NATIVEMESSAGINGHOST_H diff --git a/src/proxy/keepassxc-proxy.cpp b/src/proxy/keepassxc-proxy.cpp new file mode 100644 index 000000000..9509c1eab --- /dev/null +++ b/src/proxy/keepassxc-proxy.cpp @@ -0,0 +1,66 @@ +/* +* Copyright (C) 2017 Sami Vänttinen <sami.vanttinen@protonmail.com> +* Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <QCoreApplication> +#include <iostream> +#include "NativeMessagingHost.h" + +#ifndef Q_OS_WIN +#include <initializer_list> +#include <signal.h> +#include <unistd.h> + +// (C) Gist: https://gist.github.com/azadkuh/a2ac6869661ebd3f8588 +void ignoreUnixSignals(std::initializer_list<int> ignoreSignals) { + for (int sig : ignoreSignals) { + signal(sig, SIG_IGN); + } +} + +void catchUnixSignals(std::initializer_list<int> quitSignals) { + auto handler = [](int sig) -> void { + std::cerr << sig; + QCoreApplication::quit(); + }; + + sigset_t blocking_mask; + sigemptyset(&blocking_mask); + for (auto sig : quitSignals) { + sigaddset(&blocking_mask, sig); + } + + struct sigaction sa; + sa.sa_handler = handler; + sa.sa_mask = blocking_mask; + sa.sa_flags = 0; + + for (auto sig : quitSignals) { + sigaction(sig, &sa, nullptr); + } +} +#endif + +int main(int argc, char *argv[]) +{ + QCoreApplication a(argc, argv); +#if defined(Q_OS_UNIX) || defined(Q_OS_LINUX) + catchUnixSignals({SIGQUIT, SIGINT, SIGTERM, SIGHUP}); +#endif + NativeMessagingHost host; + return a.exec(); +} From d80c6b4b7d8ec9b7863ed077797c79567e5cc78e Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Thu, 4 Jan 2018 21:52:29 +0100 Subject: [PATCH 205/402] Update CI Dockerfile to include libsodium and bump minimum supported Qt version --- Dockerfile | 4 ++++ ci/trusty/Dockerfile | 29 ++++++++++++++++++++++++----- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index c8c637c07..20d7ff352 100644 --- a/Dockerfile +++ b/Dockerfile @@ -61,6 +61,10 @@ RUN set -x \ libfuse2 \ wget +RUN set -x \ + && apt-get autoremove --purge \ + && rm -rf /var/lib/apt/lists/* + VOLUME /keepassxc/src VOLUME /keepassxc/out WORKDIR /keepassxc diff --git a/ci/trusty/Dockerfile b/ci/trusty/Dockerfile index 9bd3424f0..bd6bec1d2 100644 --- a/ci/trusty/Dockerfile +++ b/ci/trusty/Dockerfile @@ -16,7 +16,18 @@ # TIP: check this Dockerfile using this online tool: https://www.fromlatest.io -FROM ubuntu:trusty +FROM ubuntu:14.04 + +ENV QT5_VERSION=53 +ENV QT5_PPA_VERSION=${QT5_VERSION}2 + +RUN set -x \ + && apt-get update -y \ + && apt-get -y install software-properties-common + +RUN set -x \ + && add-apt-repository ppa:beineri/opt-qt${QT5_PPA_VERSION}-trusty \ + && LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php RUN set -x \ && apt-get -y update \ @@ -24,13 +35,21 @@ RUN set -x \ git build-essential clang-3.6 libclang-common-3.6-dev clang-format-3.6 cmake3 make \ curl ca-certificates gnupg2 \ libgcrypt20-dev zlib1g-dev libyubikey-dev libykpers-1-dev \ - qttools5-dev \ - qttools5-dev-tools \ - qtbase5-dev \ - libqt5x11extras5-dev \ + qt${QT5_VERSION}base \ + qt${QT5_VERSION}tools \ + qt${QT5_VERSION}x11extras \ + qt${QT5_VERSION}translations \ libxi-dev \ libxtst-dev \ xvfb \ + libsodium-dev + +ENV CMAKE_PREFIX_PATH=/opt/qt${QT5_VERSION}/lib/cmake +ENV LD_LIBRARY_PATH=/opt/qt${QT5_VERSION}/lib +RUN set -x \ + && echo /opt/qt${QT_VERSION}/lib > /etc/ld.so.conf.d/qt${QT5_VERSION}.conf + +RUN set -x \ && apt-get autoremove --purge \ && rm -rf /var/lib/apt/lists/* From c2d04499abc21edef9567db5920a58f7870d3d28 Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Sun, 26 Nov 2017 16:58:54 -0500 Subject: [PATCH 206/402] Remove lock file and cleanup file handling [#1002] --- src/gui/DatabaseTabWidget.cpp | 182 +++++++--------------------------- src/gui/DatabaseTabWidget.h | 10 +- src/gui/DatabaseWidget.cpp | 5 +- 3 files changed, 44 insertions(+), 153 deletions(-) diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp index 8cade6965..8b36c0079 100644 --- a/src/gui/DatabaseTabWidget.cpp +++ b/src/gui/DatabaseTabWidget.cpp @@ -19,7 +19,6 @@ #include "DatabaseTabWidget.h" #include <QFileInfo> -#include <QLockFile> #include <QTabWidget> #include <QPushButton> @@ -42,8 +41,6 @@ DatabaseManagerStruct::DatabaseManagerStruct() : dbWidget(nullptr) - , lockFile(nullptr) - , saveToFilename(false) , modified(false) , readOnly(false) { @@ -107,7 +104,7 @@ void DatabaseTabWidget::newDatabase() void DatabaseTabWidget::openDatabase() { QString filter = QString("%1 (*.kdbx);;%2 (*)").arg(tr("KeePass 2 Database"), tr("All files")); - QString fileName = fileDialog()->getOpenFileName(this, tr("Open database"), QString(), + QString fileName = fileDialog()->getOpenFileName(this, tr("Open database"), QDir::homePath(), filter); if (!fileName.isEmpty()) { openDatabase(fileName); @@ -128,10 +125,10 @@ void DatabaseTabWidget::openDatabase(const QString& fileName, const QString& pw, QHashIterator<Database*, DatabaseManagerStruct> i(m_dbList); while (i.hasNext()) { i.next(); - if (i.value().canonicalFilePath == canonicalFilePath) { + if (i.value().fileInfo.canonicalFilePath() == canonicalFilePath) { if (!i.value().dbWidget->dbHasKey() && !(pw.isNull() && keyFile.isEmpty())) { // If the database is locked and a pw or keyfile is provided, unlock it - i.value().dbWidget->switchToOpenDatabase(i.value().filePath, pw, keyFile); + i.value().dbWidget->switchToOpenDatabase(i.value().fileInfo.absoluteFilePath(), pw, keyFile); } else { setCurrentIndex(databaseIndex(i.key())); } @@ -157,49 +154,9 @@ void DatabaseTabWidget::openDatabase(const QString& fileName, const QString& pw, } file.close(); - QLockFile* lockFile = new QLockFile(QString("%1/.%2.lock").arg(fileInfo.canonicalPath(), fileInfo.fileName())); - lockFile->setStaleLockTime(0); - - if (!dbStruct.readOnly && !lockFile->tryLock()) { - // for now silently ignore if we can't create a lock file - // due to lack of permissions - if (lockFile->error() != QLockFile::PermissionError) { - QMessageBox msgBox; - msgBox.setWindowTitle(tr("Database already opened")); - msgBox.setText(tr("The database you are trying to open is locked by another instance of KeePassXC.\n\n" - "Do you want to open it anyway?")); - msgBox.setIcon(QMessageBox::Question); - msgBox.addButton(QMessageBox::Yes); - msgBox.addButton(QMessageBox::No); - auto readOnlyButton = msgBox.addButton(tr("Open read-only"), QMessageBox::NoRole); - msgBox.setDefaultButton(readOnlyButton); - msgBox.setEscapeButton(QMessageBox::No); - auto result = msgBox.exec(); - - if (msgBox.clickedButton() == readOnlyButton) { - dbStruct.readOnly = true; - delete lockFile; - lockFile = nullptr; - } else if (result == QMessageBox::Yes) { - // take over the lock file if possible - if (lockFile->removeStaleLockFile()) { - lockFile->tryLock(); - } - } else { - delete lockFile; - return; - } - } - } - Database* db = new Database(); dbStruct.dbWidget = new DatabaseWidget(db, this); - dbStruct.lockFile = lockFile; - dbStruct.saveToFilename = !dbStruct.readOnly; - - dbStruct.filePath = fileInfo.absoluteFilePath(); - dbStruct.canonicalFilePath = canonicalFilePath; - dbStruct.fileName = fileInfo.fileName(); + dbStruct.fileInfo = fileInfo; insertDatabase(db, dbStruct); @@ -207,13 +164,12 @@ void DatabaseTabWidget::openDatabase(const QString& fileName, const QString& pw, emit messageTab(tr("File opened in read only mode."), MessageWidget::Warning); } - updateLastDatabases(dbStruct.filePath); + updateLastDatabases(dbStruct.fileInfo.absoluteFilePath()); if (!(pw.isNull() && keyFile.isEmpty())) { - dbStruct.dbWidget->switchToOpenDatabase(dbStruct.filePath, pw, keyFile); - } - else { - dbStruct.dbWidget->switchToOpenDatabase(dbStruct.filePath); + dbStruct.dbWidget->switchToOpenDatabase(dbStruct.fileInfo.absoluteFilePath(), pw, keyFile); + } else { + dbStruct.dbWidget->switchToOpenDatabase(dbStruct.fileInfo.absoluteFilePath()); } emit messageDismissGlobal(); } @@ -322,15 +278,14 @@ bool DatabaseTabWidget::closeDatabase(Database* db) void DatabaseTabWidget::deleteDatabase(Database* db) { const DatabaseManagerStruct dbStruct = m_dbList.value(db); - bool emitDatabaseWithFileClosed = dbStruct.saveToFilename; - QString filePath = dbStruct.filePath; + bool emitDatabaseWithFileClosed = dbStruct.fileInfo.exists() && !dbStruct.readOnly; + QString filePath = dbStruct.fileInfo.absoluteFilePath(); int index = databaseIndex(db); removeTab(index); toggleTabbar(); m_dbList.remove(db); - delete dbStruct.lockFile; delete dbStruct.dbWidget; delete db; @@ -349,7 +304,7 @@ bool DatabaseTabWidget::closeAllDatabases() return true; } -bool DatabaseTabWidget::saveDatabase(Database* db) +bool DatabaseTabWidget::saveDatabase(Database* db, QString filePath) { DatabaseManagerStruct& dbStruct = m_dbList[db]; @@ -359,9 +314,13 @@ bool DatabaseTabWidget::saveDatabase(Database* db) return true; } - if (dbStruct.saveToFilename) { + if (!dbStruct.readOnly) { + if (filePath.isEmpty()) { + filePath = dbStruct.fileInfo.canonicalFilePath(); + } + dbStruct.dbWidget->blockAutoReload(true); - QString errorMessage = db->saveToFile(dbStruct.canonicalFilePath); + QString errorMessage = db->saveToFile(filePath); dbStruct.dbWidget->blockAutoReload(false); if (errorMessage.isEmpty()) { @@ -388,71 +347,26 @@ bool DatabaseTabWidget::saveDatabaseAs(Database* db) while (true) { DatabaseManagerStruct& dbStruct = m_dbList[db]; QString oldFileName; - if (dbStruct.saveToFilename) { - oldFileName = dbStruct.filePath; + if (dbStruct.fileInfo.exists()) { + oldFileName = dbStruct.fileInfo.absoluteFilePath(); } else { - oldFileName = tr("Passwords").append(".kdbx"); + oldFileName = QDir::toNativeSeparators(QDir::homePath() + "/" + tr("Passwords").append(".kdbx")); } QString fileName = fileDialog()->getSaveFileName(this, tr("Save database as"), oldFileName, tr("KeePass 2 Database").append(" (*.kdbx)"), nullptr, 0, "kdbx"); if (!fileName.isEmpty()) { - QFileInfo fileInfo(fileName); - QString lockFilePath; - if (fileInfo.exists()) { - // returns empty string when file doesn't exist - lockFilePath = fileInfo.canonicalPath(); - } else { - lockFilePath = fileInfo.absolutePath(); - } - QString lockFileName = QString("%1/.%2.lock").arg(lockFilePath, fileInfo.fileName()); - QScopedPointer<QLockFile> lockFile(new QLockFile(lockFileName)); - lockFile->setStaleLockTime(0); - if (!lockFile->tryLock()) { - // for now silently ignore if we can't create a lock file - // due to lack of permissions - if (lockFile->error() != QLockFile::PermissionError) { - QMessageBox::StandardButton result = MessageBox::question(this, tr("Save database as"), - tr("The database you are trying to save as is locked by another instance of KeePassXC.\n" - "Do you want to save it anyway?"), - QMessageBox::Yes | QMessageBox::No); - - if (result == QMessageBox::No) { - return false; - } else { - // take over the lock file if possible - if (lockFile->removeStaleLockFile()) { - lockFile->tryLock(); - } - } - } - } - - // setup variables so saveDatabase succeeds - dbStruct.saveToFilename = true; - dbStruct.canonicalFilePath = fileName; - - if (!saveDatabase(db)) { - // failed to save, revert back - dbStruct.saveToFilename = false; - dbStruct.canonicalFilePath = oldFileName; + if (!saveDatabase(db, fileName)) { + // Failed to save, try again continue; } - // refresh fileinfo since the file didn't exist before - fileInfo.refresh(); - dbStruct.modified = false; - dbStruct.saveToFilename = true; dbStruct.readOnly = false; - dbStruct.filePath = fileInfo.absoluteFilePath(); - dbStruct.canonicalFilePath = fileInfo.canonicalFilePath(); - dbStruct.fileName = fileInfo.fileName(); - dbStruct.dbWidget->updateFilename(dbStruct.filePath); - delete dbStruct.lockFile; - dbStruct.lockFile = lockFile.take(); + dbStruct.fileInfo = QFileInfo(fileName); + dbStruct.dbWidget->updateFilename(dbStruct.fileInfo.absoluteFilePath()); updateTabName(db); - updateLastDatabases(dbStruct.filePath); + updateLastDatabases(dbStruct.fileInfo.absoluteFilePath()); return true; } else { return false; @@ -548,7 +462,7 @@ bool DatabaseTabWidget::canSave(int index) } const DatabaseManagerStruct& dbStruct = indexDatabaseManagerStruct(index); - return !dbStruct.saveToFilename || (dbStruct.modified && !dbStruct.readOnly); + return dbStruct.modified && !dbStruct.readOnly; } bool DatabaseTabWidget::isModified(int index) @@ -566,7 +480,7 @@ QString DatabaseTabWidget::databasePath(int index) index = currentIndex(); } - return indexDatabaseManagerStruct(index).filePath; + return indexDatabaseManagerStruct(index).fileInfo.absoluteFilePath(); } @@ -579,21 +493,18 @@ void DatabaseTabWidget::updateTabName(Database* db) QString tabName; - if (dbStruct.saveToFilename || dbStruct.readOnly) { + if (dbStruct.fileInfo.exists()) { if (db->metadata()->name().isEmpty()) { - tabName = dbStruct.fileName; - } - else { + tabName = dbStruct.fileInfo.fileName(); + } else { tabName = db->metadata()->name(); } - setTabToolTip(index, dbStruct.filePath); - } - else { + setTabToolTip(index, dbStruct.fileInfo.absoluteFilePath()); + } else { if (db->metadata()->name().isEmpty()) { tabName = tr("New database"); - } - else { + } else { tabName = QString("%1 [%2]").arg(db->metadata()->name(), tr("New database")); } } @@ -756,17 +667,14 @@ void DatabaseTabWidget::lockDatabases() DatabaseWidget* dbWidget = static_cast<DatabaseWidget*>(widget(i)); Database* db = databaseFromDatabaseWidget(dbWidget); - DatabaseWidget::Mode mode = dbWidget->currentMode(); - - if ((mode != DatabaseWidget::ViewMode && mode != DatabaseWidget::EditMode) - || !dbWidget->dbHasKey()) { + if (dbWidget->currentMode() == DatabaseWidget::LockedMode) { continue; } // show the correct tab widget before we are asking questions about it setCurrentWidget(dbWidget); - if (mode == DatabaseWidget::EditMode && dbWidget->isEditWidgetModified()) { + if (dbWidget->currentMode() == DatabaseWidget::EditMode && dbWidget->isEditWidgetModified()) { QMessageBox::StandardButton result = MessageBox::question( this, tr("Lock database"), @@ -777,23 +685,7 @@ void DatabaseTabWidget::lockDatabases() } } - - if (m_dbList[db].modified && !m_dbList[db].saveToFilename) { - QMessageBox::StandardButton result = - MessageBox::question( - this, tr("Lock database"), - tr("This database has never been saved.\nYou can save the database or stop locking it."), - QMessageBox::Save | QMessageBox::Cancel, QMessageBox::Cancel); - if (result == QMessageBox::Save) { - if (!saveDatabase(db)) { - continue; - } - } - else if (result == QMessageBox::Cancel) { - continue; - } - } - else if (m_dbList[db].modified) { + if (m_dbList[db].modified) { QMessageBox::StandardButton result = MessageBox::question( this, tr("Lock database"), @@ -828,7 +720,7 @@ void DatabaseTabWidget::modified() Database* db = static_cast<Database*>(sender()); DatabaseManagerStruct& dbStruct = m_dbList[db]; - if (config()->get("AutoSaveAfterEveryChange").toBool() && dbStruct.saveToFilename) { + if (config()->get("AutoSaveAfterEveryChange").toBool() && !dbStruct.readOnly) { saveDatabase(db); return; } diff --git a/src/gui/DatabaseTabWidget.h b/src/gui/DatabaseTabWidget.h index db237d98c..875c3c904 100644 --- a/src/gui/DatabaseTabWidget.h +++ b/src/gui/DatabaseTabWidget.h @@ -21,6 +21,7 @@ #include <QHash> #include <QTabWidget> +#include <QFileInfo> #include "gui/DatabaseWidget.h" #include "gui/MessageWidget.h" @@ -29,7 +30,6 @@ class DatabaseWidget; class DatabaseWidgetStateSync; class DatabaseOpenWidget; class QFile; -class QLockFile; class MessageWidget; struct DatabaseManagerStruct @@ -37,11 +37,7 @@ struct DatabaseManagerStruct DatabaseManagerStruct(); DatabaseWidget* dbWidget; - QLockFile* lockFile; - QString filePath; - QString canonicalFilePath; - QString fileName; - bool saveToFilename; + QFileInfo fileInfo; bool modified; bool readOnly; }; @@ -106,7 +102,7 @@ private slots: void emitDatabaseUnlockedFromDbWidgetSender(); private: - bool saveDatabase(Database* db); + bool saveDatabase(Database* db, QString filePath = ""); bool saveDatabaseAs(Database* db); bool closeDatabase(Database* db); void deleteDatabase(Database* db); diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 387d5d2a2..f17a7ef02 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -1284,8 +1284,11 @@ void DatabaseWidget::reloadDatabaseFile() } } else { m_messageWidget->showMessage( - tr("Could not open the new database file while attempting to autoreload this database."), + tr("Could not open the new database file while attempting to autoreload this database.") + .append("\n").append(file.errorString()), MessageWidget::Error); + // Mark db as modified since existing data may differ from file or file was deleted + m_db->modified(); } // Rewatch the database file From a80d1bbd2b486297d57067d8cfddbad26e490fb4 Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Sun, 26 Nov 2017 22:30:18 -0500 Subject: [PATCH 207/402] Addressed comments; further streamlined code --- src/gui/DatabaseTabWidget.cpp | 33 ++++++++++++++++++--------------- src/gui/DatabaseWidget.cpp | 1 + 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp index 8b36c0079..c1b77813f 100644 --- a/src/gui/DatabaseTabWidget.cpp +++ b/src/gui/DatabaseTabWidget.cpp @@ -166,7 +166,7 @@ void DatabaseTabWidget::openDatabase(const QString& fileName, const QString& pw, updateLastDatabases(dbStruct.fileInfo.absoluteFilePath()); - if (!(pw.isNull() && keyFile.isEmpty())) { + if (!pw.isNull() || !keyFile.isEmpty()) { dbStruct.dbWidget->switchToOpenDatabase(dbStruct.fileInfo.absoluteFilePath(), pw, keyFile); } else { dbStruct.dbWidget->switchToOpenDatabase(dbStruct.fileInfo.absoluteFilePath()); @@ -308,8 +308,10 @@ bool DatabaseTabWidget::saveDatabase(Database* db, QString filePath) { DatabaseManagerStruct& dbStruct = m_dbList[db]; + // Never allow saving a locked database; it causes corruption + Q_ASSERT(dbStruct.dbWidget->currentMode() != DatabaseWidget::LockedMode); + // Release build interlock if (dbStruct.dbWidget->currentMode() == DatabaseWidget::LockedMode) { - // Never allow saving a locked database; it causes corruption // We return true since a save is not required return true; } @@ -326,6 +328,7 @@ bool DatabaseTabWidget::saveDatabase(Database* db, QString filePath) if (errorMessage.isEmpty()) { // successfully saved database file dbStruct.modified = false; + dbStruct.fileInfo = QFileInfo(filePath); dbStruct.dbWidget->databaseSaved(); updateTabName(db); emit messageDismissTab(); @@ -346,31 +349,31 @@ bool DatabaseTabWidget::saveDatabaseAs(Database* db) { while (true) { DatabaseManagerStruct& dbStruct = m_dbList[db]; - QString oldFileName; + QString oldFilePath; if (dbStruct.fileInfo.exists()) { - oldFileName = dbStruct.fileInfo.absoluteFilePath(); + oldFilePath = dbStruct.fileInfo.absoluteFilePath(); } else { - oldFileName = QDir::toNativeSeparators(QDir::homePath() + "/" + tr("Passwords").append(".kdbx")); + oldFilePath = QDir::toNativeSeparators(QDir::homePath() + "/" + tr("Passwords").append(".kdbx")); } - QString fileName = fileDialog()->getSaveFileName(this, tr("Save database as"), - oldFileName, tr("KeePass 2 Database").append(" (*.kdbx)"), + QString newFilePath = fileDialog()->getSaveFileName(this, tr("Save database as"), + oldFilePath, tr("KeePass 2 Database").append(" (*.kdbx)"), nullptr, 0, "kdbx"); - if (!fileName.isEmpty()) { - if (!saveDatabase(db, fileName)) { + if (!newFilePath.isEmpty()) { + // Ensure we don't recurse back into this function + dbStruct.readOnly = false; + + if (!saveDatabase(db, newFilePath)) { // Failed to save, try again continue; } - dbStruct.modified = false; - dbStruct.readOnly = false; - dbStruct.fileInfo = QFileInfo(fileName); dbStruct.dbWidget->updateFilename(dbStruct.fileInfo.absoluteFilePath()); - updateTabName(db); updateLastDatabases(dbStruct.fileInfo.absoluteFilePath()); return true; - } else { - return false; } + + // Canceled file selection + return false; } } diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index f17a7ef02..56400c246 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -1287,6 +1287,7 @@ void DatabaseWidget::reloadDatabaseFile() tr("Could not open the new database file while attempting to autoreload this database.") .append("\n").append(file.errorString()), MessageWidget::Error); + // HACK: Directly calling the database's signal // Mark db as modified since existing data may differ from file or file was deleted m_db->modified(); } From 36e5377e6a2cec4094d08d4efc20b7e8e8b37b92 Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Thu, 7 Dec 2017 22:40:37 -0500 Subject: [PATCH 208/402] Corrected use of canonicalfile info in autoopen code --- src/gui/DatabaseTabWidget.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp index c1b77813f..8f15dfe91 100644 --- a/src/gui/DatabaseTabWidget.cpp +++ b/src/gui/DatabaseTabWidget.cpp @@ -543,8 +543,7 @@ void DatabaseTabWidget::updateTabNameFromDbWidgetSender() Group *autoload = db->rootGroup()->findChildByName("AutoOpen"); if (autoload) { const DatabaseManagerStruct& dbStruct = m_dbList.value(db); - QFileInfo dbpath(dbStruct.canonicalFilePath); - QDir dbFolder(dbpath.canonicalPath()); + QDir dbFolder(dbStruct.fileInfo.canonicalPath()); for (auto entry : autoload->entries()) { if (entry->url().isEmpty() || entry->password().isEmpty()) { continue; From 1a7b874c60687ab9b21ac03e2ada9a8a1badcc7e Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Wed, 20 Dec 2017 10:18:01 -0500 Subject: [PATCH 209/402] Consistency using filepath and minor code fixes --- src/gui/DatabaseTabWidget.cpp | 10 +++--- src/gui/DatabaseWidget.cpp | 60 ++++++++++++++++---------------- src/gui/DatabaseWidget.h | 16 ++++----- src/gui/UnlockDatabaseDialog.cpp | 4 +-- src/gui/UnlockDatabaseDialog.h | 2 +- 5 files changed, 46 insertions(+), 46 deletions(-) diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp index 8f15dfe91..09205fca4 100644 --- a/src/gui/DatabaseTabWidget.cpp +++ b/src/gui/DatabaseTabWidget.cpp @@ -355,9 +355,9 @@ bool DatabaseTabWidget::saveDatabaseAs(Database* db) } else { oldFilePath = QDir::toNativeSeparators(QDir::homePath() + "/" + tr("Passwords").append(".kdbx")); } - QString newFilePath = fileDialog()->getSaveFileName(this, tr("Save database as"), - oldFilePath, tr("KeePass 2 Database").append(" (*.kdbx)"), - nullptr, 0, "kdbx"); + QString newFilePath = fileDialog()->getSaveFileName(this, tr("Save database as"), oldFilePath, + tr("KeePass 2 Database").append(" (*.kdbx)"), + nullptr, 0, "kdbx"); if (!newFilePath.isEmpty()) { // Ensure we don't recurse back into this function dbStruct.readOnly = false; @@ -367,7 +367,7 @@ bool DatabaseTabWidget::saveDatabaseAs(Database* db) continue; } - dbStruct.dbWidget->updateFilename(dbStruct.fileInfo.absoluteFilePath()); + dbStruct.dbWidget->updateFilePath(dbStruct.fileInfo.absoluteFilePath()); updateLastDatabases(dbStruct.fileInfo.absoluteFilePath()); return true; } @@ -669,7 +669,7 @@ void DatabaseTabWidget::lockDatabases() DatabaseWidget* dbWidget = static_cast<DatabaseWidget*>(widget(i)); Database* db = databaseFromDatabaseWidget(dbWidget); - if (dbWidget->currentMode() == DatabaseWidget::LockedMode) { + if (dbWidget->currentMode() == DatabaseWidget::LockedMode || !dbWidget->dbHasKey()) { continue; } diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 56400c246..cc041d6f0 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -839,10 +839,10 @@ void DatabaseWidget::openDatabase(bool accepted) m_databaseOpenWidget = nullptr; delete m_keepass1OpenWidget; m_keepass1OpenWidget = nullptr; - m_fileWatcher.addPath(m_filename); + m_fileWatcher.addPath(m_filePath); } else { - m_fileWatcher.removePath(m_filename); + m_fileWatcher.removePath(m_filePath); if (m_databaseOpenWidget->database()) { delete m_databaseOpenWidget->database(); } @@ -950,23 +950,23 @@ void DatabaseWidget::switchToDatabaseSettings() setCurrentWidget(m_databaseSettingsWidget); } -void DatabaseWidget::switchToOpenDatabase(const QString& fileName) +void DatabaseWidget::switchToOpenDatabase(const QString& filePath) { - updateFilename(fileName); + updateFilePath(filePath); if (m_databaseOpenWidget) { - m_databaseOpenWidget->load(fileName); + m_databaseOpenWidget->load(filePath); setCurrentWidget(m_databaseOpenWidget); } else if (m_unlockDatabaseWidget) { - m_unlockDatabaseWidget->load(fileName); + m_unlockDatabaseWidget->load(filePath); setCurrentWidget(m_unlockDatabaseWidget); } } -void DatabaseWidget::switchToOpenDatabase(const QString& fileName, const QString& password, +void DatabaseWidget::switchToOpenDatabase(const QString& filePath, const QString& password, const QString& keyFile) { - updateFilename(fileName); - switchToOpenDatabase(fileName); + updateFilePath(filePath); + switchToOpenDatabase(filePath); if (m_databaseOpenWidget) { m_databaseOpenWidget->enterKey(password, keyFile); } else if (m_unlockDatabaseWidget) { @@ -974,35 +974,35 @@ void DatabaseWidget::switchToOpenDatabase(const QString& fileName, const QString } } -void DatabaseWidget::switchToImportCsv(const QString& fileName) +void DatabaseWidget::switchToImportCsv(const QString& filePath) { - updateFilename(fileName); - m_csvImportWizard->load(fileName, m_db); + updateFilePath(filePath); + m_csvImportWizard->load(filePath, m_db); m_changeMasterKeyWidget->clearForms(); m_changeMasterKeyWidget->setCancelEnabled(false); setCurrentWidget(m_changeMasterKeyWidget); m_importingCsv = true; } -void DatabaseWidget::switchToOpenMergeDatabase(const QString& fileName) +void DatabaseWidget::switchToOpenMergeDatabase(const QString& filePath) { m_databaseOpenMergeWidget->clearForms(); - m_databaseOpenMergeWidget->load(fileName); + m_databaseOpenMergeWidget->load(filePath); setCurrentWidget(m_databaseOpenMergeWidget); } -void DatabaseWidget::switchToOpenMergeDatabase(const QString& fileName, const QString& password, +void DatabaseWidget::switchToOpenMergeDatabase(const QString& filePath, const QString& password, const QString& keyFile) { - switchToOpenMergeDatabase(fileName); + switchToOpenMergeDatabase(filePath); m_databaseOpenMergeWidget->enterKey(password, keyFile); } -void DatabaseWidget::switchToImportKeepass1(const QString& fileName) +void DatabaseWidget::switchToImportKeepass1(const QString& filePath) { - updateFilename(fileName); - m_keepass1OpenWidget->load(fileName); + updateFilePath(filePath); + m_keepass1OpenWidget->load(filePath); setCurrentWidget(m_keepass1OpenWidget); } @@ -1172,21 +1172,21 @@ void DatabaseWidget::lock() endSearch(); clearAllWidgets(); - m_unlockDatabaseWidget->load(m_filename); + m_unlockDatabaseWidget->load(m_filePath); setCurrentWidget(m_unlockDatabaseWidget); Database* newDb = new Database(); newDb->metadata()->setName(m_db->metadata()->name()); replaceDatabase(newDb); } -void DatabaseWidget::updateFilename(const QString& fileName) +void DatabaseWidget::updateFilePath(const QString &filePath) { - if (!m_filename.isEmpty()) { - m_fileWatcher.removePath(m_filename); + if (!m_filePath.isEmpty()) { + m_fileWatcher.removePath(m_filePath); } - m_fileWatcher.addPath(fileName); - m_filename = fileName; + m_fileWatcher.addPath(filePath); + m_filePath = filePath; } void DatabaseWidget::blockAutoReload(bool block) @@ -1202,7 +1202,7 @@ void DatabaseWidget::blockAutoReload(bool block) void DatabaseWidget::unblockAutoReload() { m_ignoreAutoReload = false; - updateFilename(m_filename); + updateFilePath(m_filePath); } void DatabaseWidget::onWatchedFileChanged() @@ -1237,13 +1237,13 @@ void DatabaseWidget::reloadDatabaseFile() emit m_db->modified(); m_databaseModified = true; // Rewatch the database file - m_fileWatcher.addPath(m_filename); + m_fileWatcher.addPath(m_filePath); return; } } KeePass2Reader reader; - QFile file(m_filename); + QFile file(m_filePath); if (file.open(QIODevice::ReadOnly)) { Database* db = reader.readDatabase(&file, database()->key()); if (db != nullptr) { @@ -1293,7 +1293,7 @@ void DatabaseWidget::reloadDatabaseFile() } // Rewatch the database file - m_fileWatcher.addPath(m_filename); + m_fileWatcher.addPath(m_filePath); } int DatabaseWidget::numberOfSelectedEntries() const @@ -1417,7 +1417,7 @@ EntryView* DatabaseWidget::entryView() { void DatabaseWidget::showUnlockDialog() { m_unlockDatabaseDialog->clearForms(); - m_unlockDatabaseDialog->setDBFilename(m_filename); + m_unlockDatabaseDialog->setFilePath(m_filePath); #if defined(Q_OS_MAC) autoType()->raiseWindow(); diff --git a/src/gui/DatabaseWidget.h b/src/gui/DatabaseWidget.h index e9428a702..3643bb03a 100644 --- a/src/gui/DatabaseWidget.h +++ b/src/gui/DatabaseWidget.h @@ -82,7 +82,7 @@ public: void setCurrentWidget(QWidget* widget); DatabaseWidget::Mode currentMode() const; void lock(); - void updateFilename(const QString& filename); + void updateFilePath(const QString &filePath); int numberOfSelectedEntries() const; QStringList customEntryAttributes() const; bool isGroupSelected() const; @@ -155,13 +155,13 @@ public slots: void switchToGroupEdit(); void switchToMasterKeyChange(bool disableCancel = false); void switchToDatabaseSettings(); - void switchToOpenDatabase(const QString& fileName); - void switchToOpenDatabase(const QString& fileName, const QString& password, const QString& keyFile); - void switchToImportCsv(const QString& fileName); + void switchToOpenDatabase(const QString& filePath); + void switchToOpenDatabase(const QString& filePath, const QString& password, const QString& keyFile); + void switchToImportCsv(const QString& filePath); void csvImportFinished(bool accepted); - void switchToOpenMergeDatabase(const QString& fileName); - void switchToOpenMergeDatabase(const QString& fileName, const QString& password, const QString& keyFile); - void switchToImportKeepass1(const QString& fileName); + void switchToOpenMergeDatabase(const QString& filePath); + void switchToOpenMergeDatabase(const QString& filePath, const QString& password, const QString& keyFile); + void switchToImportKeepass1(const QString& filePath); void databaseModified(); void databaseSaved(); void emptyRecycleBin(); @@ -225,7 +225,7 @@ private: Group* m_newGroup; Entry* m_newEntry; Group* m_newParent; - QString m_filename; + QString m_filePath; Uuid m_groupBeforeLock; Uuid m_entryBeforeLock; MessageWidget* m_messageWidget; diff --git a/src/gui/UnlockDatabaseDialog.cpp b/src/gui/UnlockDatabaseDialog.cpp index a0c915467..cea5918a9 100644 --- a/src/gui/UnlockDatabaseDialog.cpp +++ b/src/gui/UnlockDatabaseDialog.cpp @@ -30,9 +30,9 @@ UnlockDatabaseDialog::UnlockDatabaseDialog(QWidget* parent) connect(m_view, SIGNAL(editFinished(bool)), this, SLOT(complete(bool))); } -void UnlockDatabaseDialog::setDBFilename(const QString& filename) +void UnlockDatabaseDialog::setFilePath(const QString &filePath) { - m_view->load(filename); + m_view->load(filePath); } void UnlockDatabaseDialog::clearForms() diff --git a/src/gui/UnlockDatabaseDialog.h b/src/gui/UnlockDatabaseDialog.h index ef2eabb30..7dec06765 100644 --- a/src/gui/UnlockDatabaseDialog.h +++ b/src/gui/UnlockDatabaseDialog.h @@ -32,7 +32,7 @@ class UnlockDatabaseDialog : public QDialog Q_OBJECT public: explicit UnlockDatabaseDialog(QWidget* parent = nullptr); - void setDBFilename(const QString& filename); + void setFilePath(const QString &filePath); void clearForms(); Database* database(); From 6a75fd84abc02f5b65d77dea82e333afe09886e7 Mon Sep 17 00:00:00 2001 From: Weslly <weslly.honorato@gmail.com> Date: Fri, 5 Jan 2018 23:08:04 -0200 Subject: [PATCH 210/402] Fix auto-type regression when using {delay=x} --- src/autotype/AutoType.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp index 2df3b4f1e..976a7d46e 100644 --- a/src/autotype/AutoType.cpp +++ b/src/autotype/AutoType.cpp @@ -332,10 +332,9 @@ bool AutoType::parseActions(const QString& sequence, const Entry* entry, QList<A return false; } else if (ch == '}') { QList<AutoTypeAction*> autoType = createActionFromTemplate(tmpl, entry); - if (autoType.isEmpty()) { - return false; + if (!autoType.isEmpty()) { + actions.append(autoType); } - actions.append(autoType); inTmpl = false; tmpl.clear(); } else { From 9b5ed176cddffead98e264d1b532a6ed361c7bce Mon Sep 17 00:00:00 2001 From: Yen Chi Hsuan <yan12125@gmail.com> Date: Sat, 6 Jan 2018 18:22:10 +0800 Subject: [PATCH 211/402] Improve proxy path handling for the browser plugin If "Update KeePassXC binary path automatically to native messaging scripts on startup" is not selected (default behavior), native messaging host JSON contains wrong path " ". --- src/browser/BrowserSettings.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/browser/BrowserSettings.cpp b/src/browser/BrowserSettings.cpp index d15f57d46..2df7fc1c5 100755 --- a/src/browser/BrowserSettings.cpp +++ b/src/browser/BrowserSettings.cpp @@ -156,7 +156,10 @@ void BrowserSettings::setUseCustomProxy(bool enabled) QString BrowserSettings::customProxyLocation() { - return config()->get("Browser/CustomProxyLocation", " ").toString(); + if (!useCustomProxy()) { + return QString(); + } + return config()->get("Browser/CustomProxyLocation", "").toString(); } void BrowserSettings::setCustomProxyLocation(QString location) From 4316999254be0f6c5a4851029ebc6b8aa7ef2791 Mon Sep 17 00:00:00 2001 From: varjolintu <sami.vanttinen@gmail.com> Date: Sat, 6 Jan 2018 16:30:56 +0200 Subject: [PATCH 212/402] Fix for building with MacPorts --- src/CMakeLists.txt | 22 ---------------------- src/proxy/CMakeLists.txt | 21 +++++++++++++++++++++ 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 29a2c452c..2dca9e606 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -306,28 +306,6 @@ if(APPLE AND WITH_APP_BUNDLE) COMMAND ${MACDEPLOYQT_EXE} ${PROGNAME}.app WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/src COMMENT "Deploying app bundle") - - if(WITH_XC_BROWSER) - set(PROXY_BINARY_DIR "${CMAKE_BINARY_DIR}/src/proxy/keepassxc-proxy") - set(PROXY_APP_DIR "${PROGNAME}.app/Contents/MacOS/keepassxc-proxy") - add_custom_command(TARGET ${PROGNAME} - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${PROXY_BINARY_DIR} ${PROXY_APP_DIR} - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/src - COMMENT "Copying keepassxc-proxy inside the application") - - add_custom_command(TARGET ${PROGNAME} - POST_BUILD - COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change /usr/local/opt/qt/lib/QtCore.framework/Versions/5/QtCore "@executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore" ${PROXY_APP_DIR} - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/src - COMMENT "Changing linking of keepassxc-proxy QtCore") - - add_custom_command(TARGET ${PROGNAME} - POST_BUILD - COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change /usr/local/opt/qt/lib/QtNetwork.framework/Versions/5/QtNetwork "@executable_path/../Frameworks/QtNetwork.framework/Versions/5/QtNetwork" ${PROXY_APP_DIR} - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/src - COMMENT "Changing linking of keepassxc-proxy QtNetwork") - endif() endif() install(TARGETS ${PROGNAME} diff --git a/src/proxy/CMakeLists.txt b/src/proxy/CMakeLists.txt index 4fe32428d..35e02ea26 100755 --- a/src/proxy/CMakeLists.txt +++ b/src/proxy/CMakeLists.txt @@ -31,4 +31,25 @@ if(WITH_XC_BROWSER) BUNDLE DESTINATION . COMPONENT Runtime RUNTIME DESTINATION ${PROXY_INSTALL_DIR} COMPONENT Runtime) + if(APPLE AND WITH_APP_BUNDLE) + set(PROXY_BINARY_DIR "${CMAKE_BINARY_DIR}/src/proxy/keepassxc-proxy") + set(PROXY_APP_DIR "KeePassXC.app/Contents/MacOS/keepassxc-proxy") + add_custom_command(TARGET keepassxc-proxy + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${PROXY_BINARY_DIR} ${PROXY_APP_DIR} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/src + COMMENT "Copying keepassxc-proxy inside the application") + + add_custom_command(TARGET keepassxc-proxy + POST_BUILD + COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change /usr/local/opt/qt/lib/QtCore.framework/Versions/5/QtCore "@executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore" ${PROXY_APP_DIR} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/src + COMMENT "Changing linking of keepassxc-proxy QtCore") + + add_custom_command(TARGET keepassxc-proxy + POST_BUILD + COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change /usr/local/opt/qt/lib/QtNetwork.framework/Versions/5/QtNetwork "@executable_path/../Frameworks/QtNetwork.framework/Versions/5/QtNetwork" ${PROXY_APP_DIR} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/src + COMMENT "Changing linking of keepassxc-proxy QtNetwork") + endif() endif() From 540bcd8d70d75400eca5b6f2fc1d2ce62bcfc65c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20E=2E=20Garc=C3=ADa?= <adolfo.garcia.cr@gmail.com> Date: Wed, 27 Dec 2017 19:18:47 -0600 Subject: [PATCH 213/402] Refactor src/DatabaseWidget.cpp Based on input from PR #1167's code review. --- src/gui/DatabaseWidget.cpp | 57 +++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index cc041d6f0..5325ed3de 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -303,8 +303,9 @@ QList<int> DatabaseWidget::entryHeaderViewSizes() const void DatabaseWidget::setEntryViewHeaderSizes(const QList<int>& sizes) { - if (sizes.size() != m_entryView->header()->count()) { - Q_ASSERT(false); + const bool enoughSizes = sizes.size() == m_entryView->header()->count(); + Q_ASSERT(enoughSizes); + if (!enoughSizes) { return; } @@ -332,8 +333,8 @@ Database* DatabaseWidget::database() void DatabaseWidget::createEntry() { + Q_ASSERT(m_groupView->currentGroup()); if (!m_groupView->currentGroup()) { - Q_ASSERT(false); return; } @@ -375,33 +376,32 @@ void DatabaseWidget::replaceDatabase(Database* db) void DatabaseWidget::cloneEntry() { Entry* currentEntry = m_entryView->currentEntry(); + Q_ASSERT(currentEntry); if (!currentEntry) { - Q_ASSERT(false); return; } - CloneDialog* cloneDialog = new CloneDialog(this, m_db, currentEntry); + auto cloneDialog = new CloneDialog(this, m_db, currentEntry); cloneDialog->show(); - return; } void DatabaseWidget::showTotp() { Entry* currentEntry = m_entryView->currentEntry(); + Q_ASSERT(currentEntry); if (!currentEntry) { - Q_ASSERT(false); return; } - TotpDialog* totpDialog = new TotpDialog(this, currentEntry); + auto totpDialog = new TotpDialog(this, currentEntry); totpDialog->open(); } void DatabaseWidget::copyTotp() { Entry* currentEntry = m_entryView->currentEntry(); + Q_ASSERT(currentEntry); if (!currentEntry) { - Q_ASSERT(false); return; } setClipboardTextAndMinimize(currentEntry->totp()); @@ -410,12 +410,12 @@ void DatabaseWidget::copyTotp() void DatabaseWidget::setupTotp() { Entry* currentEntry = m_entryView->currentEntry(); + Q_ASSERT(currentEntry); if (!currentEntry) { - Q_ASSERT(false); return; } - SetupTotpDialog* setupTotpDialog = new SetupTotpDialog(this, currentEntry); + auto setupTotpDialog = new SetupTotpDialog(this, currentEntry); if (currentEntry->hasTotp()) { setupTotpDialog->setSeed(currentEntry->totpSeed()); setupTotpDialog->setStep(currentEntry->totpStep()); @@ -425,7 +425,6 @@ void DatabaseWidget::setupTotp() } setupTotpDialog->open(); - } @@ -433,8 +432,8 @@ void DatabaseWidget::deleteEntries() { const QModelIndexList selected = m_entryView->selectionModel()->selectedRows(); + Q_ASSERT(!selected.isEmpty()); if (selected.isEmpty()) { - Q_ASSERT(false); return; } @@ -505,8 +504,8 @@ void DatabaseWidget::setFocus() void DatabaseWidget::copyTitle() { Entry* currentEntry = m_entryView->currentEntry(); + Q_ASSERT(currentEntry); if (!currentEntry) { - Q_ASSERT(false); return; } @@ -516,8 +515,8 @@ void DatabaseWidget::copyTitle() void DatabaseWidget::copyUsername() { Entry* currentEntry = m_entryView->currentEntry(); + Q_ASSERT(currentEntry); if (!currentEntry) { - Q_ASSERT(false); return; } @@ -527,8 +526,8 @@ void DatabaseWidget::copyUsername() void DatabaseWidget::copyPassword() { Entry* currentEntry = m_entryView->currentEntry(); + Q_ASSERT(currentEntry); if (!currentEntry) { - Q_ASSERT(false); return; } @@ -538,8 +537,8 @@ void DatabaseWidget::copyPassword() void DatabaseWidget::copyURL() { Entry* currentEntry = m_entryView->currentEntry(); + Q_ASSERT(currentEntry); if (!currentEntry) { - Q_ASSERT(false); return; } @@ -549,8 +548,8 @@ void DatabaseWidget::copyURL() void DatabaseWidget::copyNotes() { Entry* currentEntry = m_entryView->currentEntry(); + Q_ASSERT(currentEntry); if (!currentEntry) { - Q_ASSERT(false); return; } @@ -560,8 +559,8 @@ void DatabaseWidget::copyNotes() void DatabaseWidget::copyAttribute(QAction* action) { Entry* currentEntry = m_entryView->currentEntry(); + Q_ASSERT(currentEntry); if (!currentEntry) { - Q_ASSERT(false); return; } @@ -579,8 +578,8 @@ void DatabaseWidget::setClipboardTextAndMinimize(const QString& text) void DatabaseWidget::performAutoType() { Entry* currentEntry = m_entryView->currentEntry(); + Q_ASSERT(currentEntry); if (!currentEntry) { - Q_ASSERT(false); return; } @@ -590,8 +589,8 @@ void DatabaseWidget::performAutoType() void DatabaseWidget::openUrl() { Entry* currentEntry = m_entryView->currentEntry(); + Q_ASSERT(currentEntry); if (!currentEntry) { - Q_ASSERT(false); return; } @@ -917,7 +916,7 @@ void DatabaseWidget::entryActivationSignalReceived(Entry* entry, EntryModel::Mod void DatabaseWidget::switchToEntryEdit() { Entry* entry = m_entryView->currentEntry(); - + if (!entry) { return; } @@ -928,7 +927,7 @@ void DatabaseWidget::switchToEntryEdit() void DatabaseWidget::switchToGroupEdit() { Group* group = m_groupView->currentGroup(); - + if (!group) { return; } @@ -1348,8 +1347,8 @@ bool DatabaseWidget::isGroupSelected() const bool DatabaseWidget::currentEntryHasTitle() { Entry* currentEntry = m_entryView->currentEntry(); + Q_ASSERT(currentEntry); if (!currentEntry) { - Q_ASSERT(false); return false; } return !currentEntry->title().isEmpty(); @@ -1358,8 +1357,8 @@ bool DatabaseWidget::currentEntryHasTitle() bool DatabaseWidget::currentEntryHasUsername() { Entry* currentEntry = m_entryView->currentEntry(); + Q_ASSERT(currentEntry); if (!currentEntry) { - Q_ASSERT(false); return false; } return !currentEntry->resolveMultiplePlaceholders(currentEntry->username()).isEmpty(); @@ -1368,8 +1367,8 @@ bool DatabaseWidget::currentEntryHasUsername() bool DatabaseWidget::currentEntryHasPassword() { Entry* currentEntry = m_entryView->currentEntry(); + Q_ASSERT(currentEntry); if (!currentEntry) { - Q_ASSERT(false); return false; } return !currentEntry->resolveMultiplePlaceholders(currentEntry->password()).isEmpty(); @@ -1378,8 +1377,8 @@ bool DatabaseWidget::currentEntryHasPassword() bool DatabaseWidget::currentEntryHasUrl() { Entry* currentEntry = m_entryView->currentEntry(); + Q_ASSERT(currentEntry); if (!currentEntry) { - Q_ASSERT(false); return false; } return !currentEntry->resolveMultiplePlaceholders(currentEntry->url()).isEmpty(); @@ -1389,8 +1388,8 @@ bool DatabaseWidget::currentEntryHasUrl() bool DatabaseWidget::currentEntryHasTotp() { Entry* currentEntry = m_entryView->currentEntry(); + Q_ASSERT(currentEntry); if (!currentEntry) { - Q_ASSERT(false); return false; } return currentEntry->hasTotp(); @@ -1399,8 +1398,8 @@ bool DatabaseWidget::currentEntryHasTotp() bool DatabaseWidget::currentEntryHasNotes() { Entry* currentEntry = m_entryView->currentEntry(); + Q_ASSERT(currentEntry); if (!currentEntry) { - Q_ASSERT(false); return false; } return !currentEntry->resolveMultiplePlaceholders(currentEntry->notes()).isEmpty(); From acceb8efc9b9847c82959e3322b5958a4a6e66f9 Mon Sep 17 00:00:00 2001 From: varjolintu <sami.vanttinen@gmail.com> Date: Wed, 10 Jan 2018 12:24:09 +0200 Subject: [PATCH 214/402] High CPU fix for Linux --- src/browser/NativeMessagingHost.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/browser/NativeMessagingHost.cpp b/src/browser/NativeMessagingHost.cpp index 1dcd24cb1..f6d2bd9e7 100755 --- a/src/browser/NativeMessagingHost.cpp +++ b/src/browser/NativeMessagingHost.cpp @@ -93,9 +93,10 @@ void NativeMessagingHost::readLength() { quint32 length = 0; std::cin.read(reinterpret_cast<char*>(&length), 4); - if (!std::cin.eof() && length > 0) - { + if (!std::cin.eof() && length > 0) { readStdIn(length); + } else { + m_notifier->setEnabled(false); } } From 2e19af5032513f3041e1c8936d629b52a8737304 Mon Sep 17 00:00:00 2001 From: angelsl <angelsl@in04.sg> Date: Sun, 12 Nov 2017 20:20:57 +0800 Subject: [PATCH 215/402] Pull out KDFs into their own class hierarchy In preparation for multiple KDFs in KDBX 4 --- src/CMakeLists.txt | 4 +- src/core/Database.cpp | 103 ++++++++--------- src/core/Database.h | 22 ++-- src/crypto/kdf/AesKdf.cpp | 171 +++++++++++++++++++++++++++++ src/crypto/kdf/AesKdf.h | 62 +++++++++++ src/crypto/kdf/Kdf.cpp | 86 +++++++++++++++ src/crypto/kdf/Kdf.h | 69 ++++++++++++ src/crypto/kdf/Kdf_p.h | 43 ++++++++ src/format/KeePass1Reader.cpp | 18 +-- src/format/KeePass2Reader.cpp | 32 ++++-- src/format/KeePass2Reader.h | 1 - src/format/KeePass2Writer.cpp | 9 +- src/gui/DatabaseSettingsWidget.cpp | 10 +- src/keys/CompositeKey.cpp | 112 +------------------ src/keys/CompositeKey.h | 9 +- src/keys/CompositeKey_p.h | 39 ------- tests/TestKeePass1Reader.cpp | 3 +- tests/TestKeys.cpp | 27 +++-- 18 files changed, 555 insertions(+), 265 deletions(-) create mode 100644 src/crypto/kdf/AesKdf.cpp create mode 100644 src/crypto/kdf/AesKdf.h create mode 100644 src/crypto/kdf/Kdf.cpp create mode 100644 src/crypto/kdf/Kdf.h create mode 100644 src/crypto/kdf/Kdf_p.h delete mode 100644 src/keys/CompositeKey_p.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2dca9e606..5ee71a28a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -76,6 +76,9 @@ set(keepassx_SOURCES crypto/SymmetricCipher.cpp crypto/SymmetricCipherBackend.h crypto/SymmetricCipherGcrypt.cpp + crypto/kdf/Kdf.cpp + crypto/kdf/Kdf_p.h + crypto/kdf/AesKdf.cpp format/CsvExporter.cpp format/KeePass1.h format/KeePass1Reader.cpp @@ -139,7 +142,6 @@ set(keepassx_SOURCES gui/group/GroupModel.cpp gui/group/GroupView.cpp keys/CompositeKey.cpp - keys/CompositeKey_p.h keys/drivers/YubiKey.h keys/FileKey.cpp keys/Key.h diff --git a/src/core/Database.cpp b/src/core/Database.cpp index cb28ee211..45f2b479f 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -27,7 +27,7 @@ #include "cli/Utils.h" #include "core/Group.h" #include "core/Metadata.h" -#include "crypto/Random.h" +#include "crypto/kdf/AesKdf.h" #include "format/KeePass2.h" #include "format/KeePass2Reader.h" #include "format/KeePass2Writer.h" @@ -45,7 +45,8 @@ Database::Database() { m_data.cipher = KeePass2::CIPHER_AES; m_data.compressionAlgo = CompressionGZip; - m_data.transformRounds = 100000; + m_data.kdf = new AesKdf(); + m_data.kdf->randomizeTransformSalt(); m_data.hasKey = false; setRootGroup(new Group()); @@ -225,16 +226,6 @@ Database::CompressionAlgorithm Database::compressionAlgo() const return m_data.compressionAlgo; } -QByteArray Database::transformSeed() const -{ - return m_data.transformSeed; -} - -quint64 Database::transformRounds() const -{ - return m_data.transformRounds; -} - QByteArray Database::transformedMasterKey() const { return m_data.transformedMasterKey; @@ -265,36 +256,18 @@ void Database::setCompressionAlgo(Database::CompressionAlgorithm algo) m_data.compressionAlgo = algo; } -bool Database::setTransformRounds(quint64 rounds) +bool Database::setKey(const CompositeKey& key, bool updateChangedTime, bool updateTransformSalt) { - if (m_data.transformRounds != rounds) { - quint64 oldRounds = m_data.transformRounds; - - m_data.transformRounds = rounds; - - if (m_data.hasKey) { - if (!setKey(m_data.key)) { - m_data.transformRounds = oldRounds; - return false; - } - } + if (updateTransformSalt) { + m_data.kdf->randomizeTransformSalt(); } - return true; -} - -bool Database::setKey(const CompositeKey& key, const QByteArray& transformSeed, bool updateChangedTime) -{ - bool ok; - QString errorString; - - QByteArray transformedMasterKey = key.transform(transformSeed, transformRounds(), &ok, &errorString); - if (!ok) { + QByteArray transformedMasterKey; + if (!key.transform(*m_data.kdf, transformedMasterKey)) { return false; } m_data.key = key; - m_data.transformSeed = transformSeed; m_data.transformedMasterKey = transformedMasterKey; m_data.hasKey = true; if (updateChangedTime) { @@ -305,35 +278,11 @@ bool Database::setKey(const CompositeKey& key, const QByteArray& transformSeed, return true; } -bool Database::setKey(const CompositeKey& key) -{ - return setKey(key, randomGen()->randomArray(32)); -} - bool Database::hasKey() const { return m_data.hasKey; } -bool Database::transformKeyWithSeed(const QByteArray& transformSeed) -{ - Q_ASSERT(hasKey()); - - bool ok; - QString errorString; - - QByteArray transformedMasterKey = - m_data.key.transform(transformSeed, transformRounds(), &ok, &errorString); - if (!ok) { - return false; - } - - m_data.transformSeed = transformSeed; - m_data.transformedMasterKey = transformedMasterKey; - - return true; -} - bool Database::verifyKey(const CompositeKey& key) const { Q_ASSERT(hasKey()); @@ -429,6 +378,7 @@ void Database::setEmitModified(bool value) void Database::copyAttributesFrom(const Database* other) { m_data = other->m_data; + m_data.kdf = m_data.kdf->clone(); m_metadata->copyAttributesFrom(other->m_metadata); } @@ -534,3 +484,38 @@ QString Database::saveToFile(QString filePath) return saveFile.errorString(); } } + +Kdf* Database::kdf() { + return m_data.kdf; +} + +void Database::setKdf(Kdf* kdf) { + if (m_data.kdf == kdf) { + return; + } + + if (m_data.kdf != nullptr) { + delete m_data.kdf; + } + + m_data.kdf = kdf; +} + +bool Database::changeKdf(Kdf* kdf) { + kdf->randomizeTransformSalt(); + QByteArray transformedMasterKey; + if (!m_data.key.transform(*kdf, transformedMasterKey)) { + return false; + } + + setKdf(kdf); + m_data.transformedMasterKey = transformedMasterKey; + emit modifiedImmediate(); + + return true; +} + +Database::DatabaseData::~DatabaseData() +{ + delete kdf; +} diff --git a/src/core/Database.h b/src/core/Database.h index b20f897fe..dbb48718e 100644 --- a/src/core/Database.h +++ b/src/core/Database.h @@ -23,6 +23,7 @@ #include <QHash> #include <QObject> +#include "crypto/kdf/Kdf.h" #include "core/Uuid.h" #include "keys/CompositeKey.h" @@ -56,13 +57,14 @@ public: { Uuid cipher; CompressionAlgorithm compressionAlgo; - QByteArray transformSeed; - quint64 transformRounds; QByteArray transformedMasterKey; + Kdf* kdf; CompositeKey key; bool hasKey; QByteArray masterSeed; QByteArray challengeResponseKey; + + ~DatabaseData(); }; Database(); @@ -90,8 +92,7 @@ public: Uuid cipher() const; Database::CompressionAlgorithm compressionAlgo() const; - QByteArray transformSeed() const; - quint64 transformRounds() const; + Kdf* kdf(); QByteArray transformedMasterKey() const; const CompositeKey& key() const; QByteArray challengeResponseKey() const; @@ -99,16 +100,10 @@ public: void setCipher(const Uuid& cipher); void setCompressionAlgo(Database::CompressionAlgorithm algo); - bool setTransformRounds(quint64 rounds); - bool setKey(const CompositeKey& key, const QByteArray& transformSeed, - bool updateChangedTime = true); - - /** - * Sets the database key and generates a random transform seed. - */ - bool setKey(const CompositeKey& key); + void setKdf(Kdf* kdf); + bool setKey(const CompositeKey& key, bool updateChangedTime = true, + bool updateTransformSalt = false); bool hasKey() const; - bool transformKeyWithSeed(const QByteArray& transformSeed); bool verifyKey(const CompositeKey& key) const; void recycleEntry(Entry* entry); void recycleGroup(Group* group); @@ -122,6 +117,7 @@ public: * Returns a unique id that is only valid as long as the Database exists. */ Uuid uuid(); + bool changeKdf(Kdf* kdf); static Database* databaseByUuid(const Uuid& uuid); static Database* openDatabaseFile(QString fileName, CompositeKey key); diff --git a/src/crypto/kdf/AesKdf.cpp b/src/crypto/kdf/AesKdf.cpp new file mode 100644 index 000000000..4380a782e --- /dev/null +++ b/src/crypto/kdf/AesKdf.cpp @@ -0,0 +1,171 @@ +/* + * Copyright (C) 2017 KeePassXC Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <QtConcurrent> + +#include "format/KeePass2.h" +#include "crypto/SymmetricCipher.h" +#include "crypto/CryptoHash.h" +#include "crypto/Random.h" +#include "AesKdf.h" + +const QList<Kdf::Field> AesKdf::FIELDS = AesKdf::initFields(); + +QList<Kdf::Field> AesKdf::initFields() +{ + return QList<Kdf::Field> { + Kdf::Field(static_cast<quint32>(Fields::ROUNDS), "Transform rounds", 1, UINT64_MAX, true), + }; +} + +bool AesKdf::transform(const QByteArray& raw, QByteArray& result) const +{ + QByteArray resultLeft; + QByteArray resultRight; + + QFuture<bool> future = QtConcurrent::run(transformKeyRaw, raw.left(16), m_seed, m_rounds, &resultLeft); + + bool rightResult = transformKeyRaw(raw.right(16), m_seed, m_rounds, &resultRight); + bool leftResult = future.result(); + + if (!rightResult || !leftResult) { + return false; + } + + QByteArray transformed; + transformed.append(resultLeft); + transformed.append(resultRight); + + result = CryptoHash::hash(transformed, CryptoHash::Sha256); + return true; +} + +bool AesKdf::transformKeyRaw(const QByteArray& key, const QByteArray& seed, quint64 rounds, QByteArray* result) +{ + QByteArray iv(16, 0); + SymmetricCipher cipher(SymmetricCipher::Aes256, SymmetricCipher::Ecb, + SymmetricCipher::Encrypt); + if (!cipher.init(seed, iv)) { + qWarning("AesKdf::transformKeyRaw: error in SymmetricCipher::init: %s", cipher.errorString().toUtf8().data()); + return false; + } + + *result = key; + + if (!cipher.processInPlace(*result, rounds)) { + qWarning("AesKdf::transformKeyRaw: error in SymmetricCipher::processInPlace: %s", cipher.errorString().toUtf8().data()); + return false; + } + + return true; +} + +AesKdf::AesKdf() + : m_rounds(100000ull) + , m_seed(QByteArray(32, 0)) +{ +} + +quint64 AesKdf::rounds() const +{ + return m_rounds; +} + +QByteArray AesKdf::seed() const +{ + return m_seed; +} + +bool AesKdf::setRounds(quint64 rounds) +{ + m_rounds = rounds; + return true; +} + +bool AesKdf::setSeed(const QByteArray& seed) +{ + if (seed.size() != 32) { + return false; + } + + m_seed = seed; + return true; +} + +void AesKdf::randomizeTransformSalt() +{ + setSeed(randomGen()->randomArray(32)); +} + +Kdf::Type AesKdf::type() const +{ + return Kdf::Type::AES; +} + +Kdf* AesKdf::clone() const +{ + return static_cast<Kdf*>(new AesKdf(*this)); +} + +const QList<Kdf::Field> AesKdf::fields() const +{ + return FIELDS; +} + +quint64 AesKdf::field(quint32 id) const +{ + switch (static_cast<Fields>(id)) { + case Fields::ROUNDS: + return m_rounds; + default: + return 0; + } +} + +bool AesKdf::setField(quint32 id, quint64 val) +{ + switch (static_cast<Fields>(id)) { + case Fields::ROUNDS: + return setRounds(val); + default: + return false; + } +} + +int AesKdf::benchmarkImpl(int msec) const +{ + QByteArray key = QByteArray(16, '\x7E'); + QByteArray seed = QByteArray(32, '\x4B'); + QByteArray iv(16, 0); + + SymmetricCipher cipher(SymmetricCipher::Aes256, SymmetricCipher::Ecb, + SymmetricCipher::Encrypt); + cipher.init(seed, iv); + + int rounds = 0; + QElapsedTimer t; + t.start(); + do { + if (!cipher.processInPlace(key, 10000)) { + rounds = -1; + break; + } + rounds += 10000; + } while (!t.hasExpired(msec)); + + return rounds; +} \ No newline at end of file diff --git a/src/crypto/kdf/AesKdf.h b/src/crypto/kdf/AesKdf.h new file mode 100644 index 000000000..3aebc8d50 --- /dev/null +++ b/src/crypto/kdf/AesKdf.h @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2017 KeePassXC Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef KEEPASSX_AESKDF_H +#define KEEPASSX_AESKDF_H + +#include "Kdf.h" + +class AesKdf : public Kdf +{ +public: + AesKdf(); + + bool transform(const QByteArray& raw, QByteArray& result) const override; + void randomizeTransformSalt() override; + Kdf::Type type() const override; + Kdf* clone() const override; + + const QList<Field> fields() const override; + quint64 field(quint32 id) const override; + bool setField(quint32 id, quint64 val) override; + + quint64 rounds() const; + QByteArray seed() const; + + bool setRounds(quint64 rounds); + bool setSeed(const QByteArray& seed); + + enum class Fields : quint32 + { + ROUNDS, + SEED + }; + + static const QList<Kdf::Field> FIELDS; + +protected: + int benchmarkImpl(int msec) const override; + +private: + quint64 m_rounds; + QByteArray m_seed; + + static bool transformKeyRaw(const QByteArray& key, const QByteArray& seed, quint64 rounds, QByteArray* result) Q_REQUIRED_RESULT; + static QList<Kdf::Field> initFields(); +}; + +#endif // KEEPASSX_AESKDF_H diff --git a/src/crypto/kdf/Kdf.cpp b/src/crypto/kdf/Kdf.cpp new file mode 100644 index 000000000..99f12645c --- /dev/null +++ b/src/crypto/kdf/Kdf.cpp @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2017 KeePassXC Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "Kdf.h" +#include "Kdf_p.h" + +#include <QThread> +#include <QElapsedTimer> +#include <QtConcurrent> + +Kdf::Field::Field(quint32 id, const QString& name, quint64 min, quint64 max, bool benchmark) + : m_id(id) + , m_name(name) + , m_min(min) + , m_max(max) + , m_benchmark(benchmark) +{ +} + +quint32 Kdf::Field::id() const +{ + return m_id; +} + +QString Kdf::Field::name() const +{ + return m_name; +} + +quint64 Kdf::Field::min() const +{ + return m_min; +} + +quint64 Kdf::Field::max() const +{ + return m_max; +} + +bool Kdf::Field::benchmarked() const +{ + return m_benchmark; +} + +int Kdf::benchmark(int msec) const +{ + BenchmarkThread thread1(msec, this); + BenchmarkThread thread2(msec, this); + + thread1.start(); + thread2.start(); + + thread1.wait(); + thread2.wait(); + + return qMin(thread1.rounds(), thread2.rounds()); +} + +Kdf::BenchmarkThread::BenchmarkThread(int msec, const Kdf* kdf) + : m_msec(msec) + , m_kdf(kdf) +{ +} + +int Kdf::BenchmarkThread::rounds() +{ + return m_rounds; +} + +void Kdf::BenchmarkThread::run() { + m_rounds = m_kdf->benchmarkImpl(m_msec); +} diff --git a/src/crypto/kdf/Kdf.h b/src/crypto/kdf/Kdf.h new file mode 100644 index 000000000..c032a030c --- /dev/null +++ b/src/crypto/kdf/Kdf.h @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2017 KeePassXC Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef KEEPASSX_KDF_H +#define KEEPASSX_KDF_H + +#include <QVariant> + +#include "core/Uuid.h" + +class Kdf +{ +public: + enum class Type { + AES + }; + + class Field { + public: + Field(quint32 id, const QString& name, quint64 min, quint64 max, bool benchmark = false); + + quint32 id() const; + QString name() const; + quint64 min() const; + quint64 max() const; + bool benchmarked() const; + + private: + quint32 m_id; + QString m_name; + quint64 m_min; + quint64 m_max; + bool m_benchmark; + }; + + virtual ~Kdf() {} + virtual bool transform(const QByteArray& raw, QByteArray& result) const = 0; + virtual void randomizeTransformSalt() = 0; + virtual Type type() const = 0; + virtual Kdf* clone() const = 0; + + virtual const QList<Field> fields() const = 0; + virtual quint64 field(quint32 id) const = 0; + virtual bool setField(quint32 id, quint64 val) = 0; + virtual int benchmark(int msec) const; + +protected: + virtual int benchmarkImpl(int msec) const = 0; + +private: + class BenchmarkThread; + +}; + +#endif // KEEPASSX_KDF_H diff --git a/src/crypto/kdf/Kdf_p.h b/src/crypto/kdf/Kdf_p.h new file mode 100644 index 000000000..c74837522 --- /dev/null +++ b/src/crypto/kdf/Kdf_p.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2017 KeePassXC Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "Kdf.h" + +#include <QThread> + +#ifndef KEEPASSXC_KDF_P_H +#define KEEPASSXC_KDF_P_H + +class Kdf::BenchmarkThread : public QThread +{ + Q_OBJECT + +public: + explicit BenchmarkThread(int msec, const Kdf* kdf); + + int rounds(); + +protected: + void run(); + +private: + int m_rounds; + int m_msec; + const Kdf* m_kdf; +}; + +#endif // KEEPASSXC_KDF_P_H diff --git a/src/format/KeePass1Reader.cpp b/src/format/KeePass1Reader.cpp index 4747d7f87..512b0b58b 100644 --- a/src/format/KeePass1Reader.cpp +++ b/src/format/KeePass1Reader.cpp @@ -21,6 +21,7 @@ #include <QImage> #include <QTextCodec> +#include "crypto/kdf/AesKdf.h" #include "core/Database.h" #include "core/Endian.h" #include "core/Entry.h" @@ -159,10 +160,10 @@ Database* KeePass1Reader::readDatabase(QIODevice* device, const QString& passwor raiseError("Invalid number of transform rounds"); return nullptr; } - if (!m_db->setTransformRounds(m_transformRounds)) { - raiseError(tr("Unable to calculate master key")); - return nullptr; - } + AesKdf* kdf = new AesKdf(); + kdf->setRounds(m_transformRounds); + kdf->setSeed(m_transformSeed); + db->setKdf(kdf); qint64 contentPos = m_device->pos(); @@ -397,12 +398,11 @@ QByteArray KeePass1Reader::key(const QByteArray& password, const QByteArray& key key.setPassword(password); key.setKeyfileData(keyfileData); - bool ok; - QString errorString; - QByteArray transformedKey = key.transform(m_transformSeed, m_transformRounds, &ok, &errorString); + QByteArray transformedKey; + bool result = key.transform(*m_db->kdf(), transformedKey); - if (!ok) { - raiseError(errorString); + if (!result) { + raiseError("Key transformation failed"); return QByteArray(); } diff --git a/src/format/KeePass2Reader.cpp b/src/format/KeePass2Reader.cpp index bb737beda..60ebfdc82 100644 --- a/src/format/KeePass2Reader.cpp +++ b/src/format/KeePass2Reader.cpp @@ -24,6 +24,7 @@ #include "core/Database.h" #include "core/Endian.h" #include "crypto/CryptoHash.h" +#include "crypto/kdf/AesKdf.h" #include "format/KeePass1.h" #include "format/KeePass2.h" #include "format/KeePass2RandomStream.h" @@ -53,7 +54,6 @@ Database* KeePass2Reader::readDatabase(QIODevice* device, const CompositeKey& ke m_headerEnd = false; m_xmlData.clear(); m_masterSeed.clear(); - m_transformSeed.clear(); m_encryptionIV.clear(); m_streamStartBytes.clear(); m_protectedStreamKey.clear(); @@ -101,14 +101,14 @@ Database* KeePass2Reader::readDatabase(QIODevice* device, const CompositeKey& ke } // check if all required headers were present - if (m_masterSeed.isEmpty() || m_transformSeed.isEmpty() || m_encryptionIV.isEmpty() + if (m_masterSeed.isEmpty() || m_encryptionIV.isEmpty() || m_streamStartBytes.isEmpty() || m_protectedStreamKey.isEmpty() || m_db->cipher().isNull()) { raiseError("missing database headers"); return nullptr; } - if (!m_db->setKey(key, m_transformSeed, false)) { + if (!m_db->setKey(key, false)) { raiseError(tr("Unable to calculate master key")); return nullptr; } @@ -378,7 +378,15 @@ void KeePass2Reader::setTransformSeed(const QByteArray& data) raiseError("Invalid transform seed size"); } else { - m_transformSeed = data; + AesKdf* aesKdf; + if (m_db->kdf()->type() == Kdf::Type::AES) { + aesKdf = static_cast<AesKdf*>(m_db->kdf()); + } else { + aesKdf = new AesKdf(); + m_db->setKdf(aesKdf); + } + + aesKdf->setSeed(data); } } @@ -388,10 +396,18 @@ void KeePass2Reader::setTransformRounds(const QByteArray& data) raiseError("Invalid transform rounds size"); } else { - if (!m_db->setTransformRounds(Endian::bytesToUInt64(data, KeePass2::BYTEORDER))) { - raiseError(tr("Unable to calculate master key")); - } - } + quint64 rounds = Endian::bytesToUInt64(data, KeePass2::BYTEORDER); + + AesKdf* aesKdf; + if (m_db->kdf()->type() == Kdf::Type::AES) { + aesKdf = static_cast<AesKdf*>(m_db->kdf()); + } else { + aesKdf = new AesKdf(); + m_db->setKdf(aesKdf); + } + + aesKdf->setRounds(rounds); + } } void KeePass2Reader::setEncryptionIV(const QByteArray& data) diff --git a/src/format/KeePass2Reader.h b/src/format/KeePass2Reader.h index f8b962535..f82b4464a 100644 --- a/src/format/KeePass2Reader.h +++ b/src/format/KeePass2Reader.h @@ -64,7 +64,6 @@ private: Database* m_db; QByteArray m_masterSeed; - QByteArray m_transformSeed; QByteArray m_encryptionIV; QByteArray m_streamStartBytes; QByteArray m_protectedStreamKey; diff --git a/src/format/KeePass2Writer.cpp b/src/format/KeePass2Writer.cpp index f8f60f11e..0d78dc9a8 100644 --- a/src/format/KeePass2Writer.cpp +++ b/src/format/KeePass2Writer.cpp @@ -24,6 +24,7 @@ #include "core/Database.h" #include "core/Endian.h" #include "crypto/CryptoHash.h" +#include "crypto/kdf/AesKdf.h" #include "crypto/Random.h" #include "format/KeePass2RandomStream.h" #include "format/KeePass2XmlWriter.h" @@ -45,7 +46,6 @@ void KeePass2Writer::writeDatabase(QIODevice* device, Database* db) m_error = false; m_errorStr.clear(); - QByteArray transformSeed = randomGen()->randomArray(32); QByteArray masterSeed = randomGen()->randomArray(32); QByteArray encryptionIV = randomGen()->randomArray(16); QByteArray protectedStreamKey = randomGen()->randomArray(32); @@ -57,7 +57,7 @@ void KeePass2Writer::writeDatabase(QIODevice* device, Database* db) return; } - if (!db->transformKeyWithSeed(transformSeed)) { + if (!db->setKey(db->key(), false, true)) { raiseError(tr("Unable to calculate master key")); return; } @@ -81,10 +81,11 @@ void KeePass2Writer::writeDatabase(QIODevice* device, Database* db) CHECK_RETURN(writeHeaderField(KeePass2::CompressionFlags, Endian::int32ToBytes(db->compressionAlgo(), KeePass2::BYTEORDER))); + AesKdf* kdf = static_cast<AesKdf*>(db->kdf()); CHECK_RETURN(writeHeaderField(KeePass2::MasterSeed, masterSeed)); - CHECK_RETURN(writeHeaderField(KeePass2::TransformSeed, db->transformSeed())); + CHECK_RETURN(writeHeaderField(KeePass2::TransformSeed, kdf->seed())); CHECK_RETURN(writeHeaderField(KeePass2::TransformRounds, - Endian::int64ToBytes(db->transformRounds(), + Endian::int64ToBytes(kdf->rounds(), KeePass2::BYTEORDER))); CHECK_RETURN(writeHeaderField(KeePass2::EncryptionIV, encryptionIV)); CHECK_RETURN(writeHeaderField(KeePass2::ProtectedStreamKey, protectedStreamKey)); diff --git a/src/gui/DatabaseSettingsWidget.cpp b/src/gui/DatabaseSettingsWidget.cpp index 7c51edfd4..dd18f3e0e 100644 --- a/src/gui/DatabaseSettingsWidget.cpp +++ b/src/gui/DatabaseSettingsWidget.cpp @@ -22,6 +22,7 @@ #include "core/Group.h" #include "core/Metadata.h" #include "crypto/SymmetricCipher.h" +#include "crypto/kdf/AesKdf.h" #include "format/KeePass2.h" #include "keys/CompositeKey.h" @@ -56,7 +57,7 @@ void DatabaseSettingsWidget::load(Database* db) m_ui->recycleBinEnabledCheckBox->setChecked(meta->recycleBinEnabled()); m_ui->defaultUsernameEdit->setText(meta->defaultUserName()); m_ui->AlgorithmComboBox->setCurrentIndex(SymmetricCipher::cipherToAlgorithm(m_db->cipher())); - m_ui->transformRoundsSpinBox->setValue(m_db->transformRounds()); + m_ui->transformRoundsSpinBox->setValue(static_cast<AesKdf*>(m_db->kdf())->rounds()); if (meta->historyMaxItems() > -1) { m_ui->historyMaxItemsSpinBox->setValue(meta->historyMaxItems()); m_ui->historyMaxItemsCheckBox->setChecked(true); @@ -88,9 +89,10 @@ void DatabaseSettingsWidget::save() m_db->setCipher(SymmetricCipher::algorithmToCipher(static_cast<SymmetricCipher::Algorithm> (m_ui->AlgorithmComboBox->currentIndex()))); meta->setRecycleBinEnabled(m_ui->recycleBinEnabledCheckBox->isChecked()); - if (static_cast<quint64>(m_ui->transformRoundsSpinBox->value()) != m_db->transformRounds()) { + AesKdf* kdf = static_cast<AesKdf*>(m_db->kdf()); + if (static_cast<quint64>(m_ui->transformRoundsSpinBox->value()) != kdf->rounds()) { QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); - m_db->setTransformRounds(m_ui->transformRoundsSpinBox->value()); + kdf->setRounds(m_ui->transformRoundsSpinBox->value()); QApplication::restoreOverrideCursor(); } @@ -135,7 +137,7 @@ void DatabaseSettingsWidget::reject() void DatabaseSettingsWidget::transformRoundsBenchmark() { QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); - int rounds = CompositeKey::transformKeyBenchmark(1000); + int rounds = m_db->kdf()->benchmark(1000); if (rounds != -1) { m_ui->transformRoundsSpinBox->setValue(rounds); } diff --git a/src/keys/CompositeKey.cpp b/src/keys/CompositeKey.cpp index 83a6725c9..88ac4cf6a 100644 --- a/src/keys/CompositeKey.cpp +++ b/src/keys/CompositeKey.cpp @@ -17,13 +17,14 @@ */ #include "CompositeKey.h" -#include "CompositeKey_p.h" #include "ChallengeResponseKey.h" #include <QElapsedTimer> #include <QFile> #include <QtConcurrent> +#include "crypto/kdf/Kdf.h" +#include "format/KeePass2.h" #include "core/Global.h" #include "crypto/CryptoHash.h" #include "crypto/SymmetricCipher.h" @@ -91,64 +92,9 @@ QByteArray CompositeKey::rawKey() const return cryptoHash.result(); } -QByteArray CompositeKey::transform(const QByteArray& seed, quint64 rounds, - bool* ok, QString* errorString) const +bool CompositeKey::transform(const Kdf& kdf, QByteArray& result) const { - Q_ASSERT(seed.size() == 32); - Q_ASSERT(rounds > 0); - - bool okLeft; - QString errorStringLeft; - bool okRight; - QString errorStringRight; - - QByteArray key = rawKey(); - - QFuture<QByteArray> future = QtConcurrent::run(transformKeyRaw, key.left(16), seed, rounds, - &okLeft, &errorStringLeft); - QByteArray result2 = transformKeyRaw(key.right(16), seed, rounds, &okRight, &errorStringRight); - - QByteArray transformed; - transformed.append(future.result()); - transformed.append(result2); - - *ok = (okLeft && okRight); - - if (!okLeft) { - *errorString = errorStringLeft; - return QByteArray(); - } - - if (!okRight) { - *errorString = errorStringRight; - return QByteArray(); - } - - return CryptoHash::hash(transformed, CryptoHash::Sha256); -} - -QByteArray CompositeKey::transformKeyRaw(const QByteArray& key, const QByteArray& seed, - quint64 rounds, bool* ok, QString* errorString) -{ - QByteArray iv(16, 0); - SymmetricCipher cipher(SymmetricCipher::Aes256, SymmetricCipher::Ecb, - SymmetricCipher::Encrypt); - if (!cipher.init(seed, iv)) { - *ok = false; - *errorString = cipher.errorString(); - return QByteArray(); - } - - QByteArray result = key; - - if (!cipher.processInPlace(result, rounds)) { - *ok = false; - *errorString = cipher.errorString(); - return QByteArray(); - } - - *ok = true; - return result; + return kdf.transform(rawKey(), result); } bool CompositeKey::challenge(const QByteArray& seed, QByteArray& result) const @@ -183,53 +129,3 @@ void CompositeKey::addChallengeResponseKey(QSharedPointer<ChallengeResponseKey> { m_challengeResponseKeys.append(key); } - - -int CompositeKey::transformKeyBenchmark(int msec) -{ - TransformKeyBenchmarkThread thread1(msec); - TransformKeyBenchmarkThread thread2(msec); - - thread1.start(); - thread2.start(); - - thread1.wait(); - thread2.wait(); - - return qMin(thread1.rounds(), thread2.rounds()); -} - - -TransformKeyBenchmarkThread::TransformKeyBenchmarkThread(int msec) - : m_msec(msec) - , m_rounds(0) -{ - Q_ASSERT(msec > 0); -} - -int TransformKeyBenchmarkThread::rounds() -{ - return m_rounds; -} - -void TransformKeyBenchmarkThread::run() -{ - QByteArray key = QByteArray(16, '\x7E'); - QByteArray seed = QByteArray(32, '\x4B'); - QByteArray iv(16, 0); - - SymmetricCipher cipher(SymmetricCipher::Aes256, SymmetricCipher::Ecb, - SymmetricCipher::Encrypt); - cipher.init(seed, iv); - - QElapsedTimer t; - t.start(); - - do { - if (!cipher.processInPlace(key, 10000)) { - m_rounds = -1; - return; - } - m_rounds += 10000; - } while (!t.hasExpired(m_msec)); -} diff --git a/src/keys/CompositeKey.h b/src/keys/CompositeKey.h index d9c4e3a9e..35bc309fa 100644 --- a/src/keys/CompositeKey.h +++ b/src/keys/CompositeKey.h @@ -23,6 +23,7 @@ #include <QString> #include <QSharedPointer> +#include "crypto/kdf/Kdf.h" #include "keys/Key.h" #include "keys/ChallengeResponseKey.h" @@ -38,19 +39,13 @@ public: CompositeKey& operator=(const CompositeKey& key); QByteArray rawKey() const; - QByteArray transform(const QByteArray& seed, quint64 rounds, - bool* ok, QString* errorString) const; + bool transform(const Kdf& kdf, QByteArray& result) const Q_REQUIRED_RESULT; bool challenge(const QByteArray& seed, QByteArray &result) const; void addKey(const Key& key); void addChallengeResponseKey(QSharedPointer<ChallengeResponseKey> key); - static int transformKeyBenchmark(int msec); - private: - static QByteArray transformKeyRaw(const QByteArray& key, const QByteArray& seed, - quint64 rounds, bool* ok, QString* errorString); - QList<Key*> m_keys; QList<QSharedPointer<ChallengeResponseKey>> m_challengeResponseKeys; }; diff --git a/src/keys/CompositeKey_p.h b/src/keys/CompositeKey_p.h deleted file mode 100644 index 27fa7abc4..000000000 --- a/src/keys/CompositeKey_p.h +++ /dev/null @@ -1,39 +0,0 @@ -/* -* Copyright (C) 2012 Felix Geyer <debfx@fobos.de> -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 2 or (at your option) -* version 3 of the License. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef KEEPASSX_COMPOSITEKEY_P_H -#define KEEPASSX_COMPOSITEKEY_P_H - -#include <QThread> - -class TransformKeyBenchmarkThread : public QThread -{ - Q_OBJECT - -public: - explicit TransformKeyBenchmarkThread(int msec); - int rounds(); - -protected: - void run(); - -private: - int m_msec; - int m_rounds; -}; - -#endif // KEEPASSX_COMPOSITEKEY_P_H diff --git a/tests/TestKeePass1Reader.cpp b/tests/TestKeePass1Reader.cpp index f60846d26..7e015c2bc 100644 --- a/tests/TestKeePass1Reader.cpp +++ b/tests/TestKeePass1Reader.cpp @@ -26,6 +26,7 @@ #include "core/Group.h" #include "core/Metadata.h" #include "crypto/Crypto.h" +#include "crypto/kdf/AesKdf.h" #include "format/KeePass1Reader.h" #include "format/KeePass2Reader.h" #include "format/KeePass2Writer.h" @@ -110,7 +111,7 @@ void TestKeePass1Reader::testBasic() void TestKeePass1Reader::testMasterKey() { QVERIFY(m_db->hasKey()); - QCOMPARE(m_db->transformRounds(), static_cast<quint64>(713)); + QCOMPARE(static_cast<AesKdf*>(m_db->kdf())->rounds(), static_cast<quint64>(713)); } void TestKeePass1Reader::testCustomIcons() diff --git a/tests/TestKeys.cpp b/tests/TestKeys.cpp index 95a72a49f..990878e2d 100644 --- a/tests/TestKeys.cpp +++ b/tests/TestKeys.cpp @@ -27,6 +27,7 @@ #include "core/Metadata.h" #include "core/Tools.h" #include "crypto/Crypto.h" +#include "crypto/kdf/AesKdf.h" #include "crypto/CryptoHash.h" #include "format/KeePass2Reader.h" #include "format/KeePass2Writer.h" @@ -45,21 +46,23 @@ void TestKeys::testComposite() QScopedPointer<CompositeKey> compositeKey1(new CompositeKey()); QScopedPointer<PasswordKey> passwordKey1(new PasswordKey()); QScopedPointer<PasswordKey> passwordKey2(new PasswordKey("test")); - bool ok; - QString errorString; // make sure that addKey() creates a copy of the keys compositeKey1->addKey(*passwordKey1); compositeKey1->addKey(*passwordKey2); - QByteArray transformed = compositeKey1->transform(QByteArray(32, '\0'), 1, &ok, &errorString); - QVERIFY(ok); - QCOMPARE(transformed.size(), 32); + AesKdf kdf; + kdf.setRounds(1); + QByteArray transformed1; + QVERIFY(compositeKey1->transform(kdf, transformed1)); + QCOMPARE(transformed1.size(), 32); // make sure the subkeys are copied QScopedPointer<CompositeKey> compositeKey2(compositeKey1->clone()); - QCOMPARE(compositeKey2->transform(QByteArray(32, '\0'), 1, &ok, &errorString), transformed); - QVERIFY(ok); + QByteArray transformed2; + QVERIFY(compositeKey2->transform(kdf, transformed2)); + QCOMPARE(transformed2.size(), 32); + QCOMPARE(transformed1, transformed2); QScopedPointer<CompositeKey> compositeKey3(new CompositeKey()); QScopedPointer<CompositeKey> compositeKey4(new CompositeKey()); @@ -208,10 +211,12 @@ void TestKeys::benchmarkTransformKey() QByteArray seed(32, '\x4B'); - bool ok; - QString errorString; + QByteArray result; + AesKdf kdf; + kdf.setSeed(seed); + kdf.setRounds(1e6); QBENCHMARK { - compositeKey.transform(seed, 1e6, &ok, &errorString); - } + Q_UNUSED(compositeKey.transform(kdf, result)); + }; } From 23347b392f0c15a3a2fc2ca19601049d433315d2 Mon Sep 17 00:00:00 2001 From: angelsl <angelsl@in04.sg> Date: Sun, 12 Nov 2017 20:58:41 +0800 Subject: [PATCH 216/402] Fix typo in Endian and add uint{16,32,64}ToBytes --- src/core/Endian.cpp | 47 ++++++++++++++++++++++++++++++++++++++++++++- src/core/Endian.h | 3 +++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/core/Endian.cpp b/src/core/Endian.cpp index bf838abcb..3944bba2d 100644 --- a/src/core/Endian.cpp +++ b/src/core/Endian.cpp @@ -139,7 +139,7 @@ QByteArray int16ToBytes(qint16 num, QSysInfo::Endian byteOrder) qToLittleEndian<qint16>(num, reinterpret_cast<uchar*>(ba.data())); } else { - qToBigEndian<qint64>(num, reinterpret_cast<uchar*>(ba.data())); + qToBigEndian<qint16>(num, reinterpret_cast<uchar*>(ba.data())); } return ba; @@ -175,6 +175,51 @@ QByteArray int64ToBytes(qint64 num, QSysInfo::Endian byteOrder) return ba; } +QByteArray uint16ToBytes(quint16 num, QSysInfo::Endian byteOrder) +{ + QByteArray ba; + ba.resize(2); + + if (byteOrder == QSysInfo::LittleEndian) { + qToLittleEndian<quint16>(num, reinterpret_cast<uchar*>(ba.data())); + } + else { + qToBigEndian<quint16>(num, reinterpret_cast<uchar*>(ba.data())); + } + + return ba; +} + +QByteArray uint32ToBytes(quint32 num, QSysInfo::Endian byteOrder) +{ + QByteArray ba; + ba.resize(4); + + if (byteOrder == QSysInfo::LittleEndian) { + qToLittleEndian<quint32>(num, reinterpret_cast<uchar*>(ba.data())); + } + else { + qToBigEndian<quint32>(num, reinterpret_cast<uchar*>(ba.data())); + } + + return ba; +} + +QByteArray uint64ToBytes(quint64 num, QSysInfo::Endian byteOrder) +{ + QByteArray ba; + ba.resize(8); + + if (byteOrder == QSysInfo::LittleEndian) { + qToLittleEndian<quint64>(num, reinterpret_cast<uchar*>(ba.data())); + } + else { + qToBigEndian<quint64>(num, reinterpret_cast<uchar*>(ba.data())); + } + + return ba; +} + bool writeInt16(qint16 num, QIODevice* device, QSysInfo::Endian byteOrder) { QByteArray ba = int16ToBytes(num, byteOrder); diff --git a/src/core/Endian.h b/src/core/Endian.h index 0cea617c6..0b969b3ed 100644 --- a/src/core/Endian.h +++ b/src/core/Endian.h @@ -42,6 +42,9 @@ namespace Endian { QByteArray int16ToBytes(qint16 num, QSysInfo::Endian byteOrder); QByteArray int32ToBytes(qint32 num, QSysInfo::Endian byteOrder); QByteArray int64ToBytes(qint64 num, QSysInfo::Endian byteOrder); + QByteArray uint16ToBytes(quint16 num, QSysInfo::Endian byteOrder); + QByteArray uint32ToBytes(quint32 num, QSysInfo::Endian byteOrder); + QByteArray uint64ToBytes(quint64 num, QSysInfo::Endian byteOrder); bool writeInt16(qint16 num, QIODevice* device, QSysInfo::Endian byteOrder); bool writeInt32(qint32 num, QIODevice* device, QSysInfo::Endian byteOrder); From 656836950ef6e03b8ae4d132694386e966df0b11 Mon Sep 17 00:00:00 2001 From: angelsl <angelsl@in04.sg> Date: Sun, 12 Nov 2017 21:02:23 +0800 Subject: [PATCH 217/402] Add support for stream cipher subclasses in SymmetricCipherStream --- src/streams/SymmetricCipherStream.cpp | 82 ++++++++++++++------------- src/streams/SymmetricCipherStream.h | 4 +- 2 files changed, 47 insertions(+), 39 deletions(-) diff --git a/src/streams/SymmetricCipherStream.cpp b/src/streams/SymmetricCipherStream.cpp index 643aa0339..ece2642b5 100644 --- a/src/streams/SymmetricCipherStream.cpp +++ b/src/streams/SymmetricCipherStream.cpp @@ -24,7 +24,7 @@ SymmetricCipherStream::SymmetricCipherStream(QIODevice* baseDevice, SymmetricCip , m_bufferPos(0) , m_bufferFilling(false) , m_error(false) - , m_isInitalized(false) + , m_isInitialized(false) , m_dataWritten(false) { } @@ -36,12 +36,12 @@ SymmetricCipherStream::~SymmetricCipherStream() bool SymmetricCipherStream::init(const QByteArray& key, const QByteArray& iv) { - m_isInitalized = m_cipher->init(key, iv); - if (!m_isInitalized) { + m_isInitialized = m_cipher->init(key, iv); + if (!m_isInitialized) { setErrorString(m_cipher->errorString()); } - - return m_isInitalized; + m_streamCipher = m_cipher->blockSize() == 1; + return m_isInitialized; } void SymmetricCipherStream::resetInternalState() @@ -56,11 +56,8 @@ void SymmetricCipherStream::resetInternalState() bool SymmetricCipherStream::open(QIODevice::OpenMode mode) { - if (!m_isInitalized) { - return false; - } + return m_isInitialized && LayeredStream::open(mode); - return LayeredStream::open(mode); } bool SymmetricCipherStream::reset() @@ -127,11 +124,11 @@ bool SymmetricCipherStream::readBlock() QByteArray newData; if (m_bufferFilling) { - newData.resize(m_cipher->blockSize() - m_buffer.size()); + newData.resize(blockSize() - m_buffer.size()); } else { m_buffer.clear(); - newData.resize(m_cipher->blockSize()); + newData.resize(blockSize()); } int readResult = m_baseDevice->read(newData.data(), newData.size()); @@ -140,12 +137,11 @@ bool SymmetricCipherStream::readBlock() m_error = true; setErrorString(m_baseDevice->errorString()); return false; - } - else { + } else { m_buffer.append(newData.left(readResult)); } - if (m_buffer.size() != m_cipher->blockSize()) { + if (!m_streamCipher && m_buffer.size() != blockSize()) { m_bufferFilling = true; return false; } @@ -159,26 +155,28 @@ bool SymmetricCipherStream::readBlock() m_bufferFilling = false; if (m_baseDevice->atEnd()) { - // PKCS7 padding - quint8 padLength = m_buffer.at(m_buffer.size() - 1); + if (!m_streamCipher) { + // PKCS7 padding + quint8 padLength = m_buffer.at(m_buffer.size() - 1); - if (padLength == m_cipher->blockSize()) { - Q_ASSERT(m_buffer == QByteArray(m_cipher->blockSize(), m_cipher->blockSize())); - // full block with just padding: discard - m_buffer.clear(); - return false; - } - else if (padLength > m_cipher->blockSize()) { - // invalid padding - m_error = true; - setErrorString("Invalid padding."); - return false; - } - else { - Q_ASSERT(m_buffer.right(padLength) == QByteArray(padLength, padLength)); - // resize buffer to strip padding - m_buffer.resize(m_cipher->blockSize() - padLength); - return true; + if (padLength == blockSize()) { + Q_ASSERT(m_buffer == QByteArray(blockSize(), blockSize())); + // full block with just padding: discard + m_buffer.clear(); + return false; + } else if (padLength > blockSize()) { + // invalid padding + m_error = true; + setErrorString("Invalid padding."); + return false; + } else { + Q_ASSERT(m_buffer.right(padLength) == QByteArray(padLength, padLength)); + // resize buffer to strip padding + m_buffer.resize(blockSize() - padLength); + return true; + } + } else { + return m_buffer.size() > 0; } } else { @@ -200,14 +198,14 @@ qint64 SymmetricCipherStream::writeData(const char* data, qint64 maxSize) qint64 offset = 0; while (bytesRemaining > 0) { - int bytesToCopy = qMin(bytesRemaining, static_cast<qint64>(m_cipher->blockSize() - m_buffer.size())); + int bytesToCopy = qMin(bytesRemaining, static_cast<qint64>(blockSize() - m_buffer.size())); m_buffer.append(data + offset, bytesToCopy); offset += bytesToCopy; bytesRemaining -= bytesToCopy; - if (m_buffer.size() == m_cipher->blockSize()) { + if (m_buffer.size() == blockSize()) { if (!writeBlock(false)) { if (m_error) { return -1; @@ -224,11 +222,11 @@ qint64 SymmetricCipherStream::writeData(const char* data, qint64 maxSize) bool SymmetricCipherStream::writeBlock(bool lastBlock) { - Q_ASSERT(lastBlock || (m_buffer.size() == m_cipher->blockSize())); + Q_ASSERT(m_streamCipher || lastBlock || (m_buffer.size() == blockSize())); - if (lastBlock) { + if (lastBlock && !m_streamCipher) { // PKCS7 padding - int padLen = m_cipher->blockSize() - m_buffer.size(); + int padLen = blockSize() - m_buffer.size(); for (int i = 0; i < padLen; i++) { m_buffer.append(static_cast<char>(padLen)); } @@ -250,3 +248,11 @@ bool SymmetricCipherStream::writeBlock(bool lastBlock) return true; } } + +int SymmetricCipherStream::blockSize() const { + if (m_streamCipher) { + return 1024; + } else { + return m_cipher->blockSize(); + } +} diff --git a/src/streams/SymmetricCipherStream.h b/src/streams/SymmetricCipherStream.h index b6228e1b8..b68dba01f 100644 --- a/src/streams/SymmetricCipherStream.h +++ b/src/streams/SymmetricCipherStream.h @@ -45,14 +45,16 @@ private: void resetInternalState(); bool readBlock(); bool writeBlock(bool lastBlock); + int blockSize() const; const QScopedPointer<SymmetricCipher> m_cipher; QByteArray m_buffer; int m_bufferPos; bool m_bufferFilling; bool m_error; - bool m_isInitalized; + bool m_isInitialized; bool m_dataWritten; + bool m_streamCipher; }; #endif // KEEPASSX_SYMMETRICCIPHERSTREAM_H From 663b8dcb0826295a701b5891924658f870b5cabc Mon Sep 17 00:00:00 2001 From: angelsl <angelsl@in04.sg> Date: Sun, 12 Nov 2017 21:21:26 +0800 Subject: [PATCH 218/402] Remove unused SymmetricCipherSalsa20 --- src/crypto/SymmetricCipherSalsa20.cpp | 112 -------------------------- src/crypto/SymmetricCipherSalsa20.h | 53 ------------ 2 files changed, 165 deletions(-) delete mode 100644 src/crypto/SymmetricCipherSalsa20.cpp delete mode 100644 src/crypto/SymmetricCipherSalsa20.h diff --git a/src/crypto/SymmetricCipherSalsa20.cpp b/src/crypto/SymmetricCipherSalsa20.cpp deleted file mode 100644 index 7e477656a..000000000 --- a/src/crypto/SymmetricCipherSalsa20.cpp +++ /dev/null @@ -1,112 +0,0 @@ -/* -* Copyright (C) 2010 Felix Geyer <debfx@fobos.de> -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 2 or (at your option) -* version 3 of the License. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -#include "SymmetricCipherSalsa20.h" - -SymmetricCipherSalsa20::SymmetricCipherSalsa20(SymmetricCipher::Algorithm algo, SymmetricCipher::Mode mode, - SymmetricCipher::Direction direction) -{ - Q_ASSERT(algo == SymmetricCipher::Salsa20); - Q_UNUSED(algo); - - Q_ASSERT(mode == SymmetricCipher::Stream); - Q_UNUSED(mode); - - Q_UNUSED(direction); -} - -SymmetricCipherSalsa20::~SymmetricCipherSalsa20() -{ -} - -bool SymmetricCipherSalsa20::init() -{ - return true; -} - -bool SymmetricCipherSalsa20::setKey(const QByteArray& key) -{ - Q_ASSERT((key.size() == 16) || (key.size() == 32)); - - m_key = key; - ECRYPT_keysetup(&m_ctx, reinterpret_cast<const u8*>(m_key.constData()), m_key.size()*8, 64); - - return true; -} - -bool SymmetricCipherSalsa20::setIv(const QByteArray& iv) -{ - Q_ASSERT(iv.size() == 8); - - m_iv = iv; - ECRYPT_ivsetup(&m_ctx, reinterpret_cast<const u8*>(m_iv.constData())); - - return true; -} - -QByteArray SymmetricCipherSalsa20::process(const QByteArray& data, bool* ok) -{ - Q_ASSERT((data.size() < blockSize()) || ((data.size() % blockSize()) == 0)); - - QByteArray result; - result.resize(data.size()); - - ECRYPT_encrypt_bytes(&m_ctx, reinterpret_cast<const u8*>(data.constData()), - reinterpret_cast<u8*>(result.data()), data.size()); - - *ok = true; - return result; -} - -bool SymmetricCipherSalsa20::processInPlace(QByteArray& data) -{ - Q_ASSERT((data.size() < blockSize()) || ((data.size() % blockSize()) == 0)); - - ECRYPT_encrypt_bytes(&m_ctx, reinterpret_cast<const u8*>(data.constData()), - reinterpret_cast<u8*>(data.data()), data.size()); - - return true; -} - -bool SymmetricCipherSalsa20::processInPlace(QByteArray& data, quint64 rounds) -{ - Q_ASSERT((data.size() < blockSize()) || ((data.size() % blockSize()) == 0)); - - for (quint64 i = 0; i != rounds; ++i) { - ECRYPT_encrypt_bytes(&m_ctx, reinterpret_cast<const u8*>(data.constData()), - reinterpret_cast<u8*>(data.data()), data.size()); - } - - return true; -} - -bool SymmetricCipherSalsa20::reset() -{ - ECRYPT_ivsetup(&m_ctx, reinterpret_cast<const u8*>(m_iv.constData())); - - return true; -} - -int SymmetricCipherSalsa20::blockSize() const -{ - return 64; -} - -QString SymmetricCipherSalsa20::errorString() const -{ - return QString(); -} diff --git a/src/crypto/SymmetricCipherSalsa20.h b/src/crypto/SymmetricCipherSalsa20.h deleted file mode 100644 index 443d4ec8b..000000000 --- a/src/crypto/SymmetricCipherSalsa20.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -* Copyright (C) 2010 Felix Geyer <debfx@fobos.de> -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 2 or (at your option) -* version 3 of the License. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef KEEPASSX_SYMMETRICCIPHERSALSA20_H -#define KEEPASSX_SYMMETRICCIPHERSALSA20_H - -#include "crypto/SymmetricCipher.h" -#include "crypto/SymmetricCipherBackend.h" -#include "crypto/salsa20/ecrypt-sync.h" - -class SymmetricCipherSalsa20 : public SymmetricCipherBackend -{ -public: - SymmetricCipherSalsa20(SymmetricCipher::Algorithm algo, SymmetricCipher::Mode mode, - SymmetricCipher::Direction direction); - ~SymmetricCipherSalsa20(); - bool init(); - void setAlgorithm(SymmetricCipher::Algorithm algo); - void setMode(SymmetricCipher::Mode mode); - void setDirection(SymmetricCipher::Direction direction); - bool setKey(const QByteArray& key); - bool setIv(const QByteArray& iv); - - QByteArray process(const QByteArray& data, bool* ok); - bool processInPlace(QByteArray& data); - bool processInPlace(QByteArray& data, quint64 rounds); - - bool reset(); - int blockSize() const; - - QString errorString() const; - -private: - ECRYPT_ctx m_ctx; - QByteArray m_key; - QByteArray m_iv; -}; - -#endif // KEEPASSX_SYMMETRICCIPHERSALSA20_H From a5ec7fc704a1271d34534e8976e494598565b2fc Mon Sep 17 00:00:00 2001 From: angelsl <angelsl@in04.sg> Date: Sun, 12 Nov 2017 21:48:53 +0800 Subject: [PATCH 219/402] Make HashedBlockStream::atEnd report EOF correctly --- src/streams/HashedBlockStream.cpp | 4 ++++ src/streams/HashedBlockStream.h | 2 ++ 2 files changed, 6 insertions(+) diff --git a/src/streams/HashedBlockStream.cpp b/src/streams/HashedBlockStream.cpp index ec59769aa..0b11a9ca0 100644 --- a/src/streams/HashedBlockStream.cpp +++ b/src/streams/HashedBlockStream.cpp @@ -256,3 +256,7 @@ bool HashedBlockStream::writeHashedBlock() return true; } + +bool HashedBlockStream::atEnd() const { + return m_eof; +} diff --git a/src/streams/HashedBlockStream.h b/src/streams/HashedBlockStream.h index 93e4af59c..60a15a8c9 100644 --- a/src/streams/HashedBlockStream.h +++ b/src/streams/HashedBlockStream.h @@ -34,6 +34,8 @@ public: bool reset() override; void close() override; + bool atEnd() const override; + protected: qint64 readData(char* data, qint64 maxSize) override; qint64 writeData(const char* data, qint64 maxSize) override; From 33974d710a2e93ab39878a8d827c722bffa610b5 Mon Sep 17 00:00:00 2001 From: angelsl <angelsl@in04.sg> Date: Mon, 13 Nov 2017 02:02:32 +0800 Subject: [PATCH 220/402] Move constants in KeePass2.h to KeePass2.cpp and add a list of KDFs and ciphers --- src/CMakeLists.txt | 2 +- src/crypto/SymmetricCipher.h | 1 + src/format/KeePass2.cpp | 70 ++++++++++++++++++++++++++++++++++++ src/format/KeePass2.h | 29 +++++++++++++-- 4 files changed, 98 insertions(+), 4 deletions(-) create mode 100644 src/format/KeePass2.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5ee71a28a..c04901a11 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -82,7 +82,7 @@ set(keepassx_SOURCES format/CsvExporter.cpp format/KeePass1.h format/KeePass1Reader.cpp - format/KeePass2.h + format/KeePass2.cpp format/KeePass2RandomStream.cpp format/KeePass2Reader.cpp format/KeePass2Repair.cpp diff --git a/src/crypto/SymmetricCipher.h b/src/crypto/SymmetricCipher.h index 81e13f385..31d10466b 100644 --- a/src/crypto/SymmetricCipher.h +++ b/src/crypto/SymmetricCipher.h @@ -24,6 +24,7 @@ #include "crypto/SymmetricCipherBackend.h" #include "format/KeePass2.h" +#include "core/Uuid.h" class SymmetricCipher { diff --git a/src/format/KeePass2.cpp b/src/format/KeePass2.cpp new file mode 100644 index 000000000..01c15a871 --- /dev/null +++ b/src/format/KeePass2.cpp @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "KeePass2.h" +#include "crypto/CryptoHash.h" +#include "crypto/kdf/AesKdf.h" +#include "core/Uuid.h" + +const Uuid KeePass2::CIPHER_AES = Uuid(QByteArray::fromHex("31c1f2e6bf714350be5805216afc5aff")); +const Uuid KeePass2::CIPHER_TWOFISH = Uuid(QByteArray::fromHex("ad68f29f576f4bb9a36ad47af965346c")); + +const Uuid KeePass2::KDF_AES = Uuid(QByteArray::fromHex("C9D9F39A628A4460BF740D08C18A4FEA")); + +const QByteArray KeePass2::INNER_STREAM_SALSA20_IV("\xE8\x30\x09\x4B\x97\x20\x5D\x2A"); + +const QList<KeePass2::UuidNamePair> KeePass2::CIPHERS { + KeePass2::UuidNamePair(KeePass2::CIPHER_AES, "AES: 256-bit"), + KeePass2::UuidNamePair(KeePass2::CIPHER_TWOFISH, "Twofish: 256-bit"), +}; +const QList<KeePass2::UuidNamePair> KeePass2::KDFS { + KeePass2::UuidNamePair(KeePass2::KDF_AES, "AES-KDF"), +}; + +Kdf* KeePass2::uuidToKdf(const Uuid& uuid) { + if (uuid == KDF_AES) { + return static_cast<Kdf*>(new AesKdf()); + } + + return nullptr; +} + +Uuid KeePass2::kdfToUuid(const Kdf& kdf) +{ + switch (kdf.type()) { + case Kdf::Type::AES: + return KDF_AES; + default: + return Uuid(); + } +} + +KeePass2::UuidNamePair::UuidNamePair(const Uuid& uuid, const QString& name) + : m_uuid(uuid) + , m_name(name) +{ +} + +Uuid KeePass2::UuidNamePair::uuid() const +{ + return m_uuid; +} + +QString KeePass2::UuidNamePair::name() const +{ + return m_name; +} diff --git a/src/format/KeePass2.h b/src/format/KeePass2.h index 91ee48293..b3c7ee559 100644 --- a/src/format/KeePass2.h +++ b/src/format/KeePass2.h @@ -19,7 +19,10 @@ #define KEEPASSX_KEEPASS2_H #include <QtGlobal> +#include <QList> +#include "crypto/SymmetricCipher.h" +#include "crypto/kdf/Kdf.h" #include "core/Uuid.h" namespace KeePass2 @@ -32,10 +35,27 @@ namespace KeePass2 const QSysInfo::Endian BYTEORDER = QSysInfo::LittleEndian; - const Uuid CIPHER_AES = Uuid(QByteArray::fromHex("31c1f2e6bf714350be5805216afc5aff")); - const Uuid CIPHER_TWOFISH = Uuid(QByteArray::fromHex("ad68f29f576f4bb9a36ad47af965346c")); + extern const Uuid CIPHER_AES; + extern const Uuid CIPHER_TWOFISH; - const QByteArray INNER_STREAM_SALSA20_IV("\xE8\x30\x09\x4B\x97\x20\x5D\x2A"); + extern const Uuid KDF_AES; + + extern const QByteArray INNER_STREAM_SALSA20_IV; + + class UuidNamePair + { + public: + UuidNamePair(const Uuid& uuid, const QString& name); + Uuid uuid() const; + QString name() const; + + private: + Uuid m_uuid; + QString m_name; + }; + + extern const QList<UuidNamePair> CIPHERS; + extern const QList<UuidNamePair> KDFS; enum HeaderFieldID { @@ -57,6 +77,9 @@ namespace KeePass2 ArcFourVariant = 1, Salsa20 = 2 }; + + Kdf* uuidToKdf(const Uuid& uuid); + Uuid kdfToUuid(const Kdf& kdf); } #endif // KEEPASSX_KEEPASS2_H From 4532108678e5b86cd064c9d234db55055a86a17c Mon Sep 17 00:00:00 2001 From: angelsl <angelsl@in04.sg> Date: Mon, 13 Nov 2017 01:56:01 +0800 Subject: [PATCH 221/402] Add support for KDFs and cyphers to the db settings widget --- src/gui/DatabaseSettingsWidget.cpp | 151 +++++++++++++-- src/gui/DatabaseSettingsWidget.h | 11 ++ src/gui/DatabaseSettingsWidget.ui | 295 ++++++++++++----------------- tests/gui/TestGui.cpp | 5 +- 4 files changed, 265 insertions(+), 197 deletions(-) diff --git a/src/gui/DatabaseSettingsWidget.cpp b/src/gui/DatabaseSettingsWidget.cpp index dd18f3e0e..5f1dfeedf 100644 --- a/src/gui/DatabaseSettingsWidget.cpp +++ b/src/gui/DatabaseSettingsWidget.cpp @@ -18,17 +18,28 @@ #include "DatabaseSettingsWidget.h" #include "ui_DatabaseSettingsWidget.h" +#include <QList> +#include <QLabel> +#include <QPushButton> +#include <QHBoxLayout> +#include <QSpinBox> +#include <QMessageBox> +#include <QDialogButtonBox> + #include "core/Database.h" #include "core/Group.h" #include "core/Metadata.h" #include "crypto/SymmetricCipher.h" -#include "crypto/kdf/AesKdf.h" #include "format/KeePass2.h" #include "keys/CompositeKey.h" +#include "format/KeePass2.h" +#include "crypto/kdf/Kdf.h" +#include "MessageBox.h" DatabaseSettingsWidget::DatabaseSettingsWidget(QWidget* parent) : DialogyWidget(parent) , m_ui(new Ui::DatabaseSettingsWidget()) + , m_benchmarkField(nullptr) , m_db(nullptr) { m_ui->setupUi(this); @@ -39,7 +50,7 @@ DatabaseSettingsWidget::DatabaseSettingsWidget(QWidget* parent) m_ui->historyMaxItemsSpinBox, SLOT(setEnabled(bool))); connect(m_ui->historyMaxSizeCheckBox, SIGNAL(toggled(bool)), m_ui->historyMaxSizeSpinBox, SLOT(setEnabled(bool))); - connect(m_ui->transformBenchmarkButton, SIGNAL(clicked()), SLOT(transformRoundsBenchmark())); + connect(m_ui->kdfComboBox, SIGNAL(currentIndexChanged(int)), SLOT(changeKdf(int))); } DatabaseSettingsWidget::~DatabaseSettingsWidget() @@ -56,8 +67,6 @@ void DatabaseSettingsWidget::load(Database* db) m_ui->dbDescriptionEdit->setText(meta->description()); m_ui->recycleBinEnabledCheckBox->setChecked(meta->recycleBinEnabled()); m_ui->defaultUsernameEdit->setText(meta->defaultUserName()); - m_ui->AlgorithmComboBox->setCurrentIndex(SymmetricCipher::cipherToAlgorithm(m_db->cipher())); - m_ui->transformRoundsSpinBox->setValue(static_cast<AesKdf*>(m_db->kdf())->rounds()); if (meta->historyMaxItems() > -1) { m_ui->historyMaxItemsSpinBox->setValue(meta->historyMaxItems()); m_ui->historyMaxItemsCheckBox->setChecked(true); @@ -76,6 +85,33 @@ void DatabaseSettingsWidget::load(Database* db) m_ui->historyMaxSizeCheckBox->setChecked(false); } + m_ui->algorithmComboBox->clear(); + for (QList<KeePass2::UuidNamePair>::const_iterator ciphers = KeePass2::CIPHERS.constBegin(); + ciphers != KeePass2::CIPHERS.constEnd(); ++ciphers) { + KeePass2::UuidNamePair cipher = *ciphers; + m_ui->algorithmComboBox->addItem(cipher.name(), cipher.uuid().toByteArray()); + } + int cipherIndex = m_ui->algorithmComboBox->findData(m_db->cipher().toByteArray()); + if (cipherIndex > -1) { + m_ui->algorithmComboBox->setCurrentIndex(cipherIndex); + } + + bool blockSignals = m_ui->kdfComboBox->signalsBlocked(); + m_ui->kdfComboBox->blockSignals(true); + m_kdf.reset(m_db->kdf()->clone()); + m_ui->kdfComboBox->clear(); + for (QList<KeePass2::UuidNamePair>::const_iterator kdfs = KeePass2::KDFS.constBegin(); + kdfs != KeePass2::KDFS.constEnd(); ++kdfs) { + KeePass2::UuidNamePair kdf = *kdfs; + m_ui->kdfComboBox->addItem(kdf.name(), kdf.uuid().toByteArray()); + } + int kdfIndex = m_ui->kdfComboBox->findData(KeePass2::kdfToUuid(*m_kdf).toByteArray()); + if (kdfIndex > -1) { + m_ui->kdfComboBox->setCurrentIndex(kdfIndex); + } + displayKdf(*m_kdf); + m_ui->kdfComboBox->blockSignals(blockSignals); + m_ui->dbNameEdit->setFocus(); } @@ -86,15 +122,7 @@ void DatabaseSettingsWidget::save() meta->setName(m_ui->dbNameEdit->text()); meta->setDescription(m_ui->dbDescriptionEdit->text()); meta->setDefaultUserName(m_ui->defaultUsernameEdit->text()); - m_db->setCipher(SymmetricCipher::algorithmToCipher(static_cast<SymmetricCipher::Algorithm> - (m_ui->AlgorithmComboBox->currentIndex()))); meta->setRecycleBinEnabled(m_ui->recycleBinEnabledCheckBox->isChecked()); - AesKdf* kdf = static_cast<AesKdf*>(m_db->kdf()); - if (static_cast<quint64>(m_ui->transformRoundsSpinBox->value()) != kdf->rounds()) { - QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); - kdf->setRounds(m_ui->transformRoundsSpinBox->value()); - QApplication::restoreOverrideCursor(); - } bool truncate = false; @@ -126,6 +154,33 @@ void DatabaseSettingsWidget::save() truncateHistories(); } + m_db->setCipher(Uuid(m_ui->algorithmComboBox->currentData().toByteArray())); + + bool kdfValid = true; + for (int i = 0; i < m_kdfFields.size(); ++i) { + QPair<quint32, QSpinBox*> field = m_kdfFields.at(i); + kdfValid &= m_kdf->setField(field.first, static_cast<quint64>(qMax(0, field.second->value()))); + if (!kdfValid) { + break; + } + } + + if (kdfValid) { + Kdf* kdf = m_kdf.take(); + bool ok = m_db->changeKdf(kdf); + if (!ok) { + MessageBox::warning(this, tr("KDF unchanged"), + tr("Failed to transform key with new KDF parameters; KDF unchanged."), + QMessageBox::Ok); + delete kdf; // m_db has not taken ownership + } + } else { + MessageBox::warning(this, tr("KDF unchanged"), + tr("Invalid KDF parameters; KDF unchanged."), + QMessageBox::Ok); + } + clearKdfWidgets(); + emit editFinished(true); } @@ -136,11 +191,12 @@ void DatabaseSettingsWidget::reject() void DatabaseSettingsWidget::transformRoundsBenchmark() { - QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); - int rounds = m_db->kdf()->benchmark(1000); - if (rounds != -1) { - m_ui->transformRoundsSpinBox->setValue(rounds); + if (m_benchmarkField == nullptr) { + Q_ASSERT(false); + return; } + QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); + m_benchmarkField->setValue(m_kdf->benchmark(1000)); QApplication::restoreOverrideCursor(); } @@ -151,3 +207,66 @@ void DatabaseSettingsWidget::truncateHistories() entry->truncateHistory(); } } + +void DatabaseSettingsWidget::changeKdf(int index) { + QByteArray uuidBytes = m_ui->kdfComboBox->itemData(index).toByteArray(); + if (uuidBytes.size() != Uuid::Length) { + return; + } + Kdf* newKdf = KeePass2::uuidToKdf(Uuid(uuidBytes)); + if (newKdf != nullptr) { + m_kdf.reset(newKdf); + displayKdf(*m_kdf); + } +} + +void DatabaseSettingsWidget::displayKdf(const Kdf& kdf) +{ + clearKdfWidgets(); + + QWidget* lastWidget = nullptr; + int columnStart = m_ui->gridLayout->columnCount(); + int rowStart = m_ui->gridLayout->rowCount(); + QList<Kdf::Field> fields = kdf.fields(); + for (int i = 0; i < fields.size(); i++) { + const Kdf::Field& field = fields.at(i); + QLabel* label = new QLabel(QString("%1:").arg(field.name())); + QSpinBox* spinBox = new QSpinBox(); + m_kdfWidgets.append(label); + m_kdfWidgets.append(spinBox); + m_kdfFields.append(QPair<quint32, QSpinBox*>(field.id(), spinBox)); + spinBox->setMinimum(static_cast<qint32>(qMin(qMax(0ull, field.min()), 0x7FFFFFFFull))); + spinBox->setMaximum(static_cast<qint32>(qMin(qMax(0ull, field.max()), 0x7FFFFFFFull))); + spinBox->setValue(static_cast<qint32>(qMin(qMax(0ull, kdf.field(field.id())), 0x7FFFFFFFull))); + spinBox->setObjectName(QString("kdfParams%1").arg(i)); + m_ui->gridLayout->addWidget(label, rowStart + i, columnStart - 3, Qt::AlignRight); + if (field.benchmarked()) { + Q_ASSERT(m_benchmarkField == nullptr); + QPushButton* benchBtn = new QPushButton("Benchmark"); + connect(benchBtn, &QPushButton::clicked, this, &DatabaseSettingsWidget::transformRoundsBenchmark); + m_kdfWidgets.append(benchBtn); + m_ui->gridLayout->addWidget(spinBox, rowStart + i, columnStart - 2); + m_ui->gridLayout->addWidget(benchBtn, rowStart + i, columnStart - 1); + m_benchmarkField = spinBox; + lastWidget = benchBtn; + } else { + m_ui->gridLayout->addWidget(spinBox, rowStart + i, columnStart - 2, 1, 2); + lastWidget = spinBox; + } + } + if (lastWidget != nullptr) { + QWidget::setTabOrder(lastWidget, m_ui->buttonBox->button(QDialogButtonBox::StandardButton::Cancel)); + QWidget::setTabOrder(m_ui->buttonBox->button(QDialogButtonBox::StandardButton::Cancel), m_ui->buttonBox->button(QDialogButtonBox::StandardButton::Ok)); + } +} + +void DatabaseSettingsWidget::clearKdfWidgets() +{ + m_benchmarkField = nullptr; + for (int i = 0; i < m_kdfWidgets.size(); ++i) { + m_ui->gridLayout->removeWidget(m_kdfWidgets.at(i)); + m_kdfWidgets.at(i)->deleteLater(); + } + m_kdfWidgets.clear(); + m_kdfFields.clear(); +} diff --git a/src/gui/DatabaseSettingsWidget.h b/src/gui/DatabaseSettingsWidget.h index 733b32f87..a6001b892 100644 --- a/src/gui/DatabaseSettingsWidget.h +++ b/src/gui/DatabaseSettingsWidget.h @@ -19,8 +19,12 @@ #define KEEPASSX_DATABASESETTINGSWIDGET_H #include <QScopedPointer> +#include <QWidget> +#include <QSpinBox> +#include <QLayout> #include "gui/DialogyWidget.h" +#include "crypto/kdf/Kdf.h" class Database; @@ -45,11 +49,18 @@ private slots: void save(); void reject(); void transformRoundsBenchmark(); + void changeKdf(int index); private: void truncateHistories(); + void displayKdf(const Kdf& kdf); + void clearKdfWidgets(); const QScopedPointer<Ui::DatabaseSettingsWidget> m_ui; + QList<QWidget*> m_kdfWidgets; + QList<QPair<quint32, QSpinBox*>> m_kdfFields; + QSpinBox* m_benchmarkField; + QScopedPointer<Kdf> m_kdf; Database* m_db; Q_DISABLE_COPY(DatabaseSettingsWidget) diff --git a/src/gui/DatabaseSettingsWidget.ui b/src/gui/DatabaseSettingsWidget.ui index c38aebc8c..701df42a0 100644 --- a/src/gui/DatabaseSettingsWidget.ui +++ b/src/gui/DatabaseSettingsWidget.ui @@ -12,7 +12,7 @@ </property> <layout class="QVBoxLayout" name="verticalLayout" stretch="1,2,5,1"> <item> - <spacer name="verticalSpacer_2"> + <spacer name="topSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> @@ -25,9 +25,9 @@ </spacer> </item> <item> - <layout class="QHBoxLayout" name="horizontalLayout_5" stretch="0,1,0"> + <layout class="QHBoxLayout" name="horizontalLayout" stretch="0,1,0"> <item> - <spacer name="horizontalSpacer"> + <spacer name="leftSpacer"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> @@ -40,181 +40,118 @@ </spacer> </item> <item> - <widget class="QWidget" name="widget" native="true"> - <property name="maximumSize"> - <size> - <width>800</width> - <height>16777215</height> - </size> - </property> - <layout class="QGridLayout" name="gridLayout"> - <item row="3" column="2"> - <layout class="QHBoxLayout" name="horizontalLayout_3"> - <item> - <widget class="QSpinBox" name="transformRoundsSpinBox"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimum"> - <number>1</number> - </property> - <property name="maximum"> - <number>1000000000</number> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="transformBenchmarkButton"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Fixed" vsizetype="MinimumExpanding"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>25</width> - <height>0</height> - </size> - </property> - <property name="text"> - <string>Benchmark</string> - </property> - </widget> - </item> - </layout> - </item> - <item row="0" column="1" alignment="Qt::AlignRight"> - <widget class="QLabel" name="dbNameLabel"> - <property name="text"> - <string>Database name:</string> - </property> - </widget> - </item> - <item row="7" column="1"> - <widget class="QCheckBox" name="historyMaxSizeCheckBox"> - <property name="text"> - <string>Max. history size:</string> - </property> - </widget> - </item> - <item row="3" column="1" alignment="Qt::AlignRight"> - <widget class="QLabel" name="transformRoundsLabel"> - <property name="text"> - <string>Transform rounds:</string> - </property> - </widget> - </item> - <item row="6" column="1"> - <widget class="QCheckBox" name="historyMaxItemsCheckBox"> - <property name="text"> - <string>Max. history items:</string> - </property> - </widget> - </item> - <item row="0" column="2"> - <widget class="QLineEdit" name="dbNameEdit"/> - </item> - <item row="6" column="2"> - <layout class="QHBoxLayout" name="horizontalLayout_2"> - <item> - <widget class="QSpinBox" name="historyMaxItemsSpinBox"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="maximum"> - <number>2000000000</number> - </property> - </widget> - </item> - </layout> - </item> - <item row="4" column="1" alignment="Qt::AlignRight"> - <widget class="QLabel" name="defaultUsernameLabel"> - <property name="text"> - <string>Default username:</string> - </property> - </widget> - </item> - <item row="1" column="2"> - <widget class="QLineEdit" name="dbDescriptionEdit"/> - </item> - <item row="7" column="2"> - <layout class="QHBoxLayout" name="horizontalLayout"> - <item> - <widget class="QSpinBox" name="historyMaxSizeSpinBox"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="suffix"> - <string> MiB</string> - </property> - <property name="minimum"> - <number>1</number> - </property> - <property name="maximum"> - <number>2000000000</number> - </property> - </widget> - </item> - </layout> - </item> - <item row="5" column="2"> - <widget class="QCheckBox" name="recycleBinEnabledCheckBox"> - <property name="text"> - <string>Use recycle bin</string> - </property> - </widget> - </item> - <item row="4" column="2"> - <widget class="QLineEdit" name="defaultUsernameEdit"> - <property name="enabled"> - <bool>true</bool> - </property> - </widget> - </item> - <item row="1" column="1" alignment="Qt::AlignRight"> - <widget class="QLabel" name="dbDescriptionLabel"> - <property name="text"> - <string>Database description:</string> - </property> - </widget> - </item> - <item row="2" column="2"> - <widget class="QComboBox" name="AlgorithmComboBox"> - <item> - <property name="text"> - <string>AES: 256 Bit (default)</string> - </property> - </item> - <item> - <property name="text"> - <string>Twofish: 256 Bit</string> - </property> - </item> - </widget> - </item> - <item row="2" column="1" alignment="Qt::AlignRight"> - <widget class="QLabel" name="AlgorithmLabel"> - <property name="text"> - <string>Algorithm:</string> - </property> - </widget> - </item> - </layout> - </widget> + <layout class="QGridLayout" name="gridLayout"> + <item row="7" column="2" colspan="2"> + <widget class="QComboBox" name="kdfComboBox"/> + </item> + <item row="0" column="1" alignment="Qt::AlignRight"> + <widget class="QLabel" name="dbNameLabel"> + <property name="text"> + <string>Database name:</string> + </property> + </widget> + </item> + <item row="5" column="1"> + <widget class="QCheckBox" name="historyMaxSizeCheckBox"> + <property name="text"> + <string>Max. history size:</string> + </property> + </widget> + </item> + <item row="7" column="1" alignment="Qt::AlignRight"> + <widget class="QLabel" name="kdfLabel"> + <property name="text"> + <string>Key derivation function:</string> + </property> + </widget> + </item> + <item row="4" column="1"> + <widget class="QCheckBox" name="historyMaxItemsCheckBox"> + <property name="text"> + <string>Max. history items:</string> + </property> + </widget> + </item> + <item row="0" column="2" colspan="2"> + <widget class="QLineEdit" name="dbNameEdit"/> + </item> + <item row="4" column="2" colspan="2"> + <widget class="QSpinBox" name="historyMaxItemsSpinBox"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximum"> + <number>2000000000</number> + </property> + </widget> + </item> + <item row="2" column="1" alignment="Qt::AlignRight"> + <widget class="QLabel" name="defaultUsernameLabel"> + <property name="text"> + <string>Default username:</string> + </property> + </widget> + </item> + <item row="1" column="2" colspan="2"> + <widget class="QLineEdit" name="dbDescriptionEdit"/> + </item> + <item row="5" column="2" colspan="2"> + <widget class="QSpinBox" name="historyMaxSizeSpinBox"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="suffix"> + <string> MiB</string> + </property> + <property name="minimum"> + <number>1</number> + </property> + <property name="maximum"> + <number>2000000000</number> + </property> + </widget> + </item> + <item row="3" column="2" colspan="2"> + <widget class="QCheckBox" name="recycleBinEnabledCheckBox"> + <property name="text"> + <string>Use recycle bin</string> + </property> + </widget> + </item> + <item row="2" column="2" colspan="2"> + <widget class="QLineEdit" name="defaultUsernameEdit"> + <property name="enabled"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="1" column="1" alignment="Qt::AlignRight"> + <widget class="QLabel" name="dbDescriptionLabel"> + <property name="text"> + <string>Database description:</string> + </property> + </widget> + </item> + <item row="6" column="2" colspan="2"> + <widget class="QComboBox" name="algorithmComboBox"/> + </item> + <item row="6" column="1" alignment="Qt::AlignRight"> + <widget class="QLabel" name="algorithmLabel"> + <property name="text"> + <string>Algorithm:</string> + </property> + </widget> + </item> + </layout> </item> <item> - <spacer name="horizontalSpacer_2"> + <spacer name="rightSpacer"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> @@ -229,7 +166,7 @@ </layout> </item> <item> - <spacer name="verticalSpacer"> + <spacer name="bottomSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> @@ -253,14 +190,14 @@ <tabstops> <tabstop>dbNameEdit</tabstop> <tabstop>dbDescriptionEdit</tabstop> - <tabstop>transformRoundsSpinBox</tabstop> - <tabstop>transformBenchmarkButton</tabstop> <tabstop>defaultUsernameEdit</tabstop> <tabstop>recycleBinEnabledCheckBox</tabstop> <tabstop>historyMaxItemsCheckBox</tabstop> <tabstop>historyMaxItemsSpinBox</tabstop> <tabstop>historyMaxSizeCheckBox</tabstop> <tabstop>historyMaxSizeSpinBox</tabstop> + <tabstop>algorithmComboBox</tabstop> + <tabstop>kdfComboBox</tabstop> <tabstop>buttonBox</tabstop> </tabstops> <resources/> diff --git a/tests/gui/TestGui.cpp b/tests/gui/TestGui.cpp index 17b2736cc..92b7a6a5f 100644 --- a/tests/gui/TestGui.cpp +++ b/tests/gui/TestGui.cpp @@ -45,6 +45,7 @@ #include "core/Metadata.h" #include "core/Tools.h" #include "crypto/Crypto.h" +#include "crypto/kdf/AesKdf.h" #include "format/KeePass2Reader.h" #include "gui/DatabaseTabWidget.h" #include "gui/DatabaseWidget.h" @@ -897,12 +898,12 @@ void TestGui::testDatabaseSettings() m_db->metadata()->setName("Save"); triggerAction("actionChangeDatabaseSettings"); QWidget* dbSettingsWidget = m_dbWidget->findChild<QWidget*>("databaseSettingsWidget"); - QSpinBox* transformRoundsSpinBox = dbSettingsWidget->findChild<QSpinBox*>("transformRoundsSpinBox"); + QSpinBox* transformRoundsSpinBox = dbSettingsWidget->findChild<QSpinBox*>("kdfParams0"); transformRoundsSpinBox->setValue(100); QTest::keyClick(transformRoundsSpinBox, Qt::Key_Enter); // wait for modified timer QTRY_COMPARE(m_tabWidget->tabText(m_tabWidget->currentIndex()), QString("Save*")); - QCOMPARE(m_db->transformRounds(), Q_UINT64_C(100)); + QCOMPARE(static_cast<AesKdf*>(m_db->kdf())->rounds(), Q_UINT64_C(100)); triggerAction("actionDatabaseSave"); QCOMPARE(m_tabWidget->tabText(m_tabWidget->currentIndex()), QString("Save")); From 6a0d05e1ef6c15a77c543ecba927ad77fb2f395c Mon Sep 17 00:00:00 2001 From: angelsl <angelsl@in04.sg> Date: Mon, 13 Nov 2017 02:23:01 +0800 Subject: [PATCH 222/402] Add support for various algorithms for kdbx4 * Add SHA512 support to CryptoHash * Add ChaCha20 support * Add HMAC support * Add new HmacBlockStream, used in KDBX 4 * Add support for ChaCha20 protected stream --- CMakeLists.txt | 2 +- src/CMakeLists.txt | 1 + src/crypto/Crypto.cpp | 52 +++++- src/crypto/Crypto.h | 2 + src/crypto/CryptoHash.cpp | 42 ++++- src/crypto/CryptoHash.h | 6 +- src/crypto/SymmetricCipher.cpp | 47 ++++- src/crypto/SymmetricCipher.h | 15 +- src/crypto/SymmetricCipherGcrypt.cpp | 3 + src/format/KeePass2.cpp | 16 ++ src/format/KeePass2.h | 6 +- src/format/KeePass2RandomStream.cpp | 30 ++- src/format/KeePass2RandomStream.h | 6 +- src/format/KeePass2Reader.cpp | 12 +- src/format/KeePass2Reader.h | 3 + src/format/KeePass2Repair.cpp | 2 +- src/format/KeePass2Writer.cpp | 2 +- src/streams/HmacBlockStream.cpp | 267 +++++++++++++++++++++++++++ src/streams/HmacBlockStream.h | 61 ++++++ tests/TestCryptoHash.cpp | 13 ++ tests/TestKeePass2RandomStream.cpp | 2 +- tests/TestSymmetricCipher.cpp | 50 +++++ tests/TestSymmetricCipher.h | 1 + 23 files changed, 616 insertions(+), 25 deletions(-) create mode 100644 src/streams/HmacBlockStream.cpp create mode 100644 src/streams/HmacBlockStream.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 1d5c198ee..34ac87f04 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -262,7 +262,7 @@ set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_NONE QT_NO_DEBUG) find_package(LibGPGError REQUIRED) -find_package(Gcrypt 1.6.0 REQUIRED) +find_package(Gcrypt 1.7.0 REQUIRED) find_package(ZLIB REQUIRED) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c04901a11..2e10cdcf4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -148,6 +148,7 @@ set(keepassx_SOURCES keys/PasswordKey.cpp keys/YkChallengeResponseKey.cpp streams/HashedBlockStream.cpp + streams/HmacBlockStream.cpp streams/LayeredStream.cpp streams/qtiocompressor.cpp streams/StoreDataStream.cpp diff --git a/src/crypto/Crypto.cpp b/src/crypto/Crypto.cpp index d00be720b..7ba78a6b3 100644 --- a/src/crypto/Crypto.cpp +++ b/src/crypto/Crypto.cpp @@ -95,18 +95,28 @@ bool Crypto::checkAlgorithms() qWarning("Crypto::checkAlgorithms: %s", qPrintable(m_errorStr)); return false; } + if (gcry_cipher_algo_info(GCRY_CIPHER_CHACHA20, GCRYCTL_TEST_ALGO, nullptr, nullptr) != 0) { + m_errorStr = "GCRY_CIPHER_CHACHA20 not found."; + qWarning("Crypto::checkAlgorithms: %s", qPrintable(m_errorStr)); + return false; + } if (gcry_md_test_algo(GCRY_MD_SHA256) != 0) { m_errorStr = "GCRY_MD_SHA256 not found."; qWarning("Crypto::checkAlgorithms: %s", qPrintable(m_errorStr)); return false; } + if (gcry_md_test_algo(GCRY_MD_SHA512) != 0) { + m_errorStr = "GCRY_MD_SHA512 not found."; + qWarning("Crypto::checkAlgorithms: %s", qPrintable(m_errorStr)); + return false; + } return true; } bool Crypto::selfTest() { - return testSha256() && testAes256Cbc() && testAes256Ecb() && testTwofish() && testSalsa20(); + return testSha256() && testSha512() && testAes256Cbc() && testAes256Ecb() && testTwofish() && testSalsa20() && testChaCha20(); } void Crypto::raiseError(const QString& str) @@ -128,6 +138,19 @@ bool Crypto::testSha256() return true; } +bool Crypto::testSha512() +{ + QByteArray sha512Test = CryptoHash::hash("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + CryptoHash::Sha512); + + if (sha512Test != QByteArray::fromHex("204a8fc6dda82f0a0ced7beb8e08a41657c16ef468b228a8279be331a703c33596fd15c13b1b07f9aa1d3bea57789ca031ad85c7a71dd70354ec631238ca3445")) { + raiseError("SHA-512 mismatch."); + return false; + } + + return true; +} + bool Crypto::testAes256Cbc() { QByteArray key = QByteArray::fromHex("603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4"); @@ -285,3 +308,30 @@ bool Crypto::testSalsa20() return true; } + +bool Crypto::testChaCha20() { + QByteArray chacha20Key = QByteArray::fromHex("0000000000000000000000000000000000000000000000000000000000000000"); + QByteArray chacha20iv = QByteArray::fromHex("0000000000000000"); + QByteArray chacha20Plain = QByteArray::fromHex("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"); + QByteArray chacha20Cipher = QByteArray::fromHex("76b8e0ada0f13d90405d6ae55386bd28bdd219b8a08ded1aa836efcc8b770dc7da41597c5157488d7724e03fb8d84a376a43b8f41518a11cc387b669b2ee6586"); + bool ok; + + SymmetricCipher chacha20Stream(SymmetricCipher::ChaCha20, SymmetricCipher::Stream, + SymmetricCipher::Encrypt); + if (!chacha20Stream.init(chacha20Key, chacha20iv)) { + raiseError(chacha20Stream.errorString()); + return false; + } + + QByteArray chacha20Processed = chacha20Stream.process(chacha20Plain, &ok); + if (!ok) { + raiseError(chacha20Stream.errorString()); + return false; + } + if (chacha20Processed != chacha20Cipher) { + raiseError("ChaCha20 stream cipher mismatch."); + return false; + } + + return true; +} \ No newline at end of file diff --git a/src/crypto/Crypto.h b/src/crypto/Crypto.h index 0ce2903c6..379068eb4 100644 --- a/src/crypto/Crypto.h +++ b/src/crypto/Crypto.h @@ -35,10 +35,12 @@ private: static bool selfTest(); static void raiseError(const QString& str); static bool testSha256(); + static bool testSha512(); static bool testAes256Cbc(); static bool testAes256Ecb(); static bool testTwofish(); static bool testSalsa20(); + static bool testChaCha20(); static bool m_initalized; static QString m_errorStr; diff --git a/src/crypto/CryptoHash.cpp b/src/crypto/CryptoHash.cpp index d116451fc..a3ffb648e 100644 --- a/src/crypto/CryptoHash.cpp +++ b/src/crypto/CryptoHash.cpp @@ -29,27 +29,42 @@ public: }; CryptoHash::CryptoHash(CryptoHash::Algorithm algo) + : CryptoHash::CryptoHash(algo, false) {} + +CryptoHash::CryptoHash(CryptoHash::Algorithm algo, bool hmac) : d_ptr(new CryptoHashPrivate()) { Q_D(CryptoHash); Q_ASSERT(Crypto::initalized()); - int algoGcrypt; + int algoGcrypt = -1; + unsigned int flagsGcrypt = 0; switch (algo) { case CryptoHash::Sha256: algoGcrypt = GCRY_MD_SHA256; break; + case CryptoHash::Sha512: + algoGcrypt = GCRY_MD_SHA512; + break; + default: Q_ASSERT(false); break; } - gcry_error_t error = gcry_md_open(&d->ctx, algoGcrypt, 0); + if (hmac) { + flagsGcrypt |= GCRY_MD_FLAG_HMAC; + } + + gcry_error_t error = gcry_md_open(&d->ctx, algoGcrypt, flagsGcrypt); + if (error) { + qWarning("Gcrypt error (ctor): %s", gcry_strerror(error)); + qWarning("Gcrypt error (ctor): %s", gcry_strsource(error)); + } Q_ASSERT(error == 0); // TODO: error handling - Q_UNUSED(error); d->hashLen = gcry_md_get_algo_dlen(algoGcrypt); } @@ -74,6 +89,18 @@ void CryptoHash::addData(const QByteArray& data) gcry_md_write(d->ctx, data.constData(), data.size()); } +void CryptoHash::setKey(const QByteArray& data) +{ + Q_D(CryptoHash); + + gcry_error_t error = gcry_md_setkey(d->ctx, data.constData(), data.size()); + if (error) { + qWarning("Gcrypt error (setKey): %s", gcry_strerror(error)); + qWarning("Gcrypt error (setKey): %s", gcry_strsource(error)); + } + Q_ASSERT(error == 0); +} + void CryptoHash::reset() { Q_D(CryptoHash); @@ -96,3 +123,12 @@ QByteArray CryptoHash::hash(const QByteArray& data, CryptoHash::Algorithm algo) cryptoHash.addData(data); return cryptoHash.result(); } + +QByteArray CryptoHash::hmac(const QByteArray& data, const QByteArray& key, CryptoHash::Algorithm algo) +{ + // replace with gcry_md_hash_buffer()? + CryptoHash cryptoHash(algo, true); + cryptoHash.setKey(key); + cryptoHash.addData(data); + return cryptoHash.result(); +} diff --git a/src/crypto/CryptoHash.h b/src/crypto/CryptoHash.h index 80df056f1..cf027e0f3 100644 --- a/src/crypto/CryptoHash.h +++ b/src/crypto/CryptoHash.h @@ -27,16 +27,20 @@ class CryptoHash public: enum Algorithm { - Sha256 + Sha256, + Sha512 }; explicit CryptoHash(CryptoHash::Algorithm algo); + explicit CryptoHash(CryptoHash::Algorithm algo, bool hmac); ~CryptoHash(); void addData(const QByteArray& data); void reset(); QByteArray result() const; + void setKey(const QByteArray& data); static QByteArray hash(const QByteArray& data, CryptoHash::Algorithm algo); + static QByteArray hmac(const QByteArray& data, const QByteArray& key, Algorithm algo); private: CryptoHashPrivate* const d_ptr; diff --git a/src/crypto/SymmetricCipher.cpp b/src/crypto/SymmetricCipher.cpp index 016103b27..9bd605b43 100644 --- a/src/crypto/SymmetricCipher.cpp +++ b/src/crypto/SymmetricCipher.cpp @@ -24,6 +24,7 @@ SymmetricCipher::SymmetricCipher(SymmetricCipher::Algorithm algo, SymmetricCiphe SymmetricCipher::Direction direction) : m_backend(createBackend(algo, mode, direction)) , m_initialized(false) + , m_algo(algo) { } @@ -61,6 +62,7 @@ SymmetricCipherBackend* SymmetricCipher::createBackend(SymmetricCipher::Algorith case SymmetricCipher::Aes256: case SymmetricCipher::Twofish: case SymmetricCipher::Salsa20: + case SymmetricCipher::ChaCha20: return new SymmetricCipherGcrypt(algo, mode, direction); default: @@ -93,10 +95,14 @@ SymmetricCipher::Algorithm SymmetricCipher::cipherToAlgorithm(Uuid cipher) { if (cipher == KeePass2::CIPHER_AES) { return SymmetricCipher::Aes256; - } - else { + } else if (cipher == KeePass2::CIPHER_CHACHA20) { + return SymmetricCipher::ChaCha20; + } else if (cipher == KeePass2::CIPHER_TWOFISH) { return SymmetricCipher::Twofish; } + + qWarning("SymmetricCipher::cipherToAlgorithm: invalid Uuid %s", cipher.toByteArray().toHex().data()); + return InvalidAlgorithm; } Uuid SymmetricCipher::algorithmToCipher(SymmetricCipher::Algorithm algo) @@ -104,7 +110,42 @@ Uuid SymmetricCipher::algorithmToCipher(SymmetricCipher::Algorithm algo) switch (algo) { case SymmetricCipher::Aes256: return KeePass2::CIPHER_AES; - default: + case SymmetricCipher::ChaCha20: + return KeePass2::CIPHER_CHACHA20; + case SymmetricCipher::Twofish: return KeePass2::CIPHER_TWOFISH; + default: + qWarning("SymmetricCipher::algorithmToCipher: invalid algorithm %d", algo); + return Uuid(); } } + +int SymmetricCipher::algorithmIvSize(SymmetricCipher::Algorithm algo) { + switch (algo) { + case SymmetricCipher::ChaCha20: + return 12; + case SymmetricCipher::Aes256: + case SymmetricCipher::Twofish: + return 16; + default: + qWarning("SymmetricCipher::algorithmIvSize: invalid algorithm %d", algo); + return -1; + } +} + +SymmetricCipher::Mode SymmetricCipher::algorithmMode(SymmetricCipher::Algorithm algo) { + switch (algo) { + case SymmetricCipher::ChaCha20: + return SymmetricCipher::Stream; + case SymmetricCipher::Aes256: + case SymmetricCipher::Twofish: + return SymmetricCipher::Cbc; + default: + qWarning("SymmetricCipher::algorithmMode: invalid algorithm %d", algo); + return SymmetricCipher::InvalidMode; + } +} + +SymmetricCipher::Algorithm SymmetricCipher::algorithm() const { + return m_algo; +} diff --git a/src/crypto/SymmetricCipher.h b/src/crypto/SymmetricCipher.h index 31d10466b..981ef320e 100644 --- a/src/crypto/SymmetricCipher.h +++ b/src/crypto/SymmetricCipher.h @@ -33,7 +33,9 @@ public: { Aes256, Twofish, - Salsa20 + Salsa20, + ChaCha20, + InvalidAlgorithm = -1 }; enum Mode @@ -41,7 +43,8 @@ public: Cbc, Ctr, Ecb, - Stream + Stream, + InvalidMode = -1 }; enum Direction @@ -74,9 +77,12 @@ public: int keySize() const; int blockSize() const; QString errorString() const; + Algorithm algorithm() const; - static SymmetricCipher::Algorithm cipherToAlgorithm(Uuid cipher); - static Uuid algorithmToCipher(SymmetricCipher::Algorithm algo); + static Algorithm cipherToAlgorithm(Uuid cipher); + static Uuid algorithmToCipher(Algorithm algo); + static int algorithmIvSize(Algorithm algo); + static Mode algorithmMode(Algorithm algo); private: static SymmetricCipherBackend* createBackend(SymmetricCipher::Algorithm algo, SymmetricCipher::Mode mode, @@ -84,6 +90,7 @@ private: const QScopedPointer<SymmetricCipherBackend> m_backend; bool m_initialized; + Algorithm m_algo; Q_DISABLE_COPY(SymmetricCipher) }; diff --git a/src/crypto/SymmetricCipherGcrypt.cpp b/src/crypto/SymmetricCipherGcrypt.cpp index 0b291e693..bbb80bf60 100644 --- a/src/crypto/SymmetricCipherGcrypt.cpp +++ b/src/crypto/SymmetricCipherGcrypt.cpp @@ -46,6 +46,9 @@ int SymmetricCipherGcrypt::gcryptAlgo(SymmetricCipher::Algorithm algo) case SymmetricCipher::Salsa20: return GCRY_CIPHER_SALSA20; + case SymmetricCipher::ChaCha20: + return GCRY_CIPHER_CHACHA20; + default: Q_ASSERT(false); return -1; diff --git a/src/format/KeePass2.cpp b/src/format/KeePass2.cpp index 01c15a871..8cf3df555 100644 --- a/src/format/KeePass2.cpp +++ b/src/format/KeePass2.cpp @@ -22,6 +22,7 @@ const Uuid KeePass2::CIPHER_AES = Uuid(QByteArray::fromHex("31c1f2e6bf714350be5805216afc5aff")); const Uuid KeePass2::CIPHER_TWOFISH = Uuid(QByteArray::fromHex("ad68f29f576f4bb9a36ad47af965346c")); +const Uuid KeePass2::CIPHER_CHACHA20 = Uuid(QByteArray::fromHex("D6038A2B8B6F4CB5A524339A31DBB59A")); const Uuid KeePass2::KDF_AES = Uuid(QByteArray::fromHex("C9D9F39A628A4460BF740D08C18A4FEA")); @@ -30,6 +31,7 @@ const QByteArray KeePass2::INNER_STREAM_SALSA20_IV("\xE8\x30\x09\x4B\x97\x20\x5D const QList<KeePass2::UuidNamePair> KeePass2::CIPHERS { KeePass2::UuidNamePair(KeePass2::CIPHER_AES, "AES: 256-bit"), KeePass2::UuidNamePair(KeePass2::CIPHER_TWOFISH, "Twofish: 256-bit"), + KeePass2::UuidNamePair(KeePass2::CIPHER_CHACHA20, "ChaCha20: 256-bit") }; const QList<KeePass2::UuidNamePair> KeePass2::KDFS { KeePass2::UuidNamePair(KeePass2::KDF_AES, "AES-KDF"), @@ -53,6 +55,20 @@ Uuid KeePass2::kdfToUuid(const Kdf& kdf) } } +KeePass2::ProtectedStreamAlgo KeePass2::idToProtectedStreamAlgo(quint32 id) +{ + switch (id) { + case static_cast<quint32>(KeePass2::ArcFourVariant): + return KeePass2::ArcFourVariant; + case static_cast<quint32>(KeePass2::Salsa20): + return KeePass2::Salsa20; + case static_cast<quint32>(KeePass2::ChaCha20): + return KeePass2::ChaCha20; + default: + return KeePass2::InvalidProtectedStreamAlgo; + } +} + KeePass2::UuidNamePair::UuidNamePair(const Uuid& uuid, const QString& name) : m_uuid(uuid) , m_name(name) diff --git a/src/format/KeePass2.h b/src/format/KeePass2.h index b3c7ee559..6356e15da 100644 --- a/src/format/KeePass2.h +++ b/src/format/KeePass2.h @@ -37,6 +37,7 @@ namespace KeePass2 extern const Uuid CIPHER_AES; extern const Uuid CIPHER_TWOFISH; + extern const Uuid CIPHER_CHACHA20; extern const Uuid KDF_AES; @@ -75,11 +76,14 @@ namespace KeePass2 enum ProtectedStreamAlgo { ArcFourVariant = 1, - Salsa20 = 2 + Salsa20 = 2, + ChaCha20 = 3, + InvalidProtectedStreamAlgo = -1 }; Kdf* uuidToKdf(const Uuid& uuid); Uuid kdfToUuid(const Kdf& kdf); + ProtectedStreamAlgo idToProtectedStreamAlgo(quint32 id); } #endif // KEEPASSX_KEEPASS2_H diff --git a/src/format/KeePass2RandomStream.cpp b/src/format/KeePass2RandomStream.cpp index 1944e5d5b..5f80fc151 100644 --- a/src/format/KeePass2RandomStream.cpp +++ b/src/format/KeePass2RandomStream.cpp @@ -20,16 +20,27 @@ #include "crypto/CryptoHash.h" #include "format/KeePass2.h" -KeePass2RandomStream::KeePass2RandomStream() - : m_cipher(SymmetricCipher::Salsa20, SymmetricCipher::Stream, SymmetricCipher::Encrypt) +KeePass2RandomStream::KeePass2RandomStream(KeePass2::ProtectedStreamAlgo algo) + : m_cipher(mapAlgo(algo), SymmetricCipher::Stream, SymmetricCipher::Encrypt) , m_offset(0) { } bool KeePass2RandomStream::init(const QByteArray& key) { - return m_cipher.init(CryptoHash::hash(key, CryptoHash::Sha256), - KeePass2::INNER_STREAM_SALSA20_IV); + switch (m_cipher.algorithm()) { + case SymmetricCipher::Salsa20: + return m_cipher.init(CryptoHash::hash(key, CryptoHash::Sha256), + KeePass2::INNER_STREAM_SALSA20_IV); + case SymmetricCipher::ChaCha20: { + QByteArray keyIv = CryptoHash::hash(key, CryptoHash::Sha512); + return m_cipher.init(keyIv.left(32), keyIv.mid(32, 12)); + } + default: + qWarning("Invalid stream algorithm (%d)", m_cipher.algorithm()); + break; + } + return false; } QByteArray KeePass2RandomStream::randomBytes(int size, bool* ok) @@ -109,3 +120,14 @@ bool KeePass2RandomStream::loadBlock() return true; } + +SymmetricCipher::Algorithm KeePass2RandomStream::mapAlgo(KeePass2::ProtectedStreamAlgo algo) { + switch (algo) { + case KeePass2::ChaCha20: + return SymmetricCipher::ChaCha20; + case KeePass2::Salsa20: + return SymmetricCipher::Salsa20; + default: + return SymmetricCipher::InvalidAlgorithm; + } +} \ No newline at end of file diff --git a/src/format/KeePass2RandomStream.h b/src/format/KeePass2RandomStream.h index 584d738b3..1e341bacc 100644 --- a/src/format/KeePass2RandomStream.h +++ b/src/format/KeePass2RandomStream.h @@ -21,11 +21,13 @@ #include <QByteArray> #include "crypto/SymmetricCipher.h" +#include "KeePass2.h" class KeePass2RandomStream { public: - KeePass2RandomStream(); + KeePass2RandomStream(KeePass2::ProtectedStreamAlgo algo); + bool init(const QByteArray& key); QByteArray randomBytes(int size, bool* ok); QByteArray process(const QByteArray& data, bool* ok); @@ -38,6 +40,8 @@ private: SymmetricCipher m_cipher; QByteArray m_buffer; int m_offset; + + static SymmetricCipher::Algorithm mapAlgo(KeePass2::ProtectedStreamAlgo algo); }; #endif // KEEPASSX_KEEPASS2RANDOMSTREAM_H diff --git a/src/format/KeePass2Reader.cpp b/src/format/KeePass2Reader.cpp index 60ebfdc82..f42e7b9bb 100644 --- a/src/format/KeePass2Reader.cpp +++ b/src/format/KeePass2Reader.cpp @@ -41,6 +41,7 @@ KeePass2Reader::KeePass2Reader() , m_headerEnd(false) , m_saveXml(false) , m_db(nullptr) + , m_irsAlgo(KeePass2::InvalidProtectedStreamAlgo) { } @@ -164,7 +165,7 @@ Database* KeePass2Reader::readDatabase(QIODevice* device, const CompositeKey& ke xmlDevice = ioCompressor.data(); } - KeePass2RandomStream randomStream; + KeePass2RandomStream randomStream(m_irsAlgo); if (!randomStream.init(m_protectedStreamKey)) { raiseError(randomStream.errorString()); return nullptr; @@ -447,9 +448,14 @@ void KeePass2Reader::setInnerRandomStreamID(const QByteArray& data) } else { quint32 id = Endian::bytesToUInt32(data, KeePass2::BYTEORDER); - - if (id != KeePass2::Salsa20) { + m_irsAlgo = KeePass2::idToProtectedStreamAlgo(id); + if (m_irsAlgo == KeePass2::ArcFourVariant || m_irsAlgo == KeePass2::InvalidProtectedStreamAlgo) { raiseError("Unsupported random stream algorithm"); } } } + +KeePass2::ProtectedStreamAlgo KeePass2Reader::protectedStreamAlgo() const +{ + return m_irsAlgo; +} diff --git a/src/format/KeePass2Reader.h b/src/format/KeePass2Reader.h index f82b4464a..e9a947284 100644 --- a/src/format/KeePass2Reader.h +++ b/src/format/KeePass2Reader.h @@ -21,6 +21,7 @@ #include <QCoreApplication> #include "keys/CompositeKey.h" +#include "format/KeePass2.h" class Database; class QIODevice; @@ -38,6 +39,7 @@ public: void setSaveXml(bool save); QByteArray xmlData(); QByteArray streamKey(); + KeePass2::ProtectedStreamAlgo protectedStreamAlgo() const; private: void raiseError(const QString& errorMessage); @@ -67,6 +69,7 @@ private: QByteArray m_encryptionIV; QByteArray m_streamStartBytes; QByteArray m_protectedStreamKey; + KeePass2::ProtectedStreamAlgo m_irsAlgo; }; #endif // KEEPASSX_KEEPASS2READER_H diff --git a/src/format/KeePass2Repair.cpp b/src/format/KeePass2Repair.cpp index 8d18457d4..5f2732e2a 100644 --- a/src/format/KeePass2Repair.cpp +++ b/src/format/KeePass2Repair.cpp @@ -71,7 +71,7 @@ KeePass2Repair::RepairOutcome KeePass2Repair::repairDatabase(QIODevice* device, return qMakePair(RepairFailed, nullptr); } - KeePass2RandomStream randomStream; + KeePass2RandomStream randomStream(reader.protectedStreamAlgo()); randomStream.init(reader.streamKey()); KeePass2XmlReader xmlReader; QBuffer buffer(&xmlData); diff --git a/src/format/KeePass2Writer.cpp b/src/format/KeePass2Writer.cpp index 0d78dc9a8..6dc89c36d 100644 --- a/src/format/KeePass2Writer.cpp +++ b/src/format/KeePass2Writer.cpp @@ -131,7 +131,7 @@ void KeePass2Writer::writeDatabase(QIODevice* device, Database* db) m_device = ioCompressor.data(); } - KeePass2RandomStream randomStream; + KeePass2RandomStream randomStream(KeePass2::Salsa20); if (!randomStream.init(protectedStreamKey)) { raiseError(randomStream.errorString()); return; diff --git a/src/streams/HmacBlockStream.cpp b/src/streams/HmacBlockStream.cpp new file mode 100644 index 000000000..c01c973b1 --- /dev/null +++ b/src/streams/HmacBlockStream.cpp @@ -0,0 +1,267 @@ +/* +* Copyright (C) 2017 KeePassXC Team +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 2 or (at your option) +* version 3 of the License. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "HmacBlockStream.h" + +#include "core/Endian.h" +#include "crypto/CryptoHash.h" + +const QSysInfo::Endian HmacBlockStream::ByteOrder = QSysInfo::LittleEndian; + +HmacBlockStream::HmacBlockStream(QIODevice* baseDevice, QByteArray key) + : LayeredStream(baseDevice) + , m_blockSize(1024*1024) + , m_key(key) +{ + init(); +} + +HmacBlockStream::HmacBlockStream(QIODevice* baseDevice, QByteArray key, qint32 blockSize) + : LayeredStream(baseDevice) + , m_blockSize(blockSize) + , m_key(key) +{ + init(); +} + +HmacBlockStream::~HmacBlockStream() +{ + close(); +} + +void HmacBlockStream::init() +{ + m_buffer.clear(); + m_bufferPos = 0; + m_blockIndex = 0; + m_eof = false; + m_error = false; +} + +bool HmacBlockStream::reset() +{ + // Write final block(s) only if device is writable and we haven't + // already written a final block. + if (isWritable() && (!m_buffer.isEmpty() || m_blockIndex != 0)) { + if (!m_buffer.isEmpty()) { + if (!writeHashedBlock()) { + return false; + } + } + + // write empty final block + if (!writeHashedBlock()) { + return false; + } + } + + init(); + + return true; +} + +void HmacBlockStream::close() +{ + // Write final block(s) only if device is writable and we haven't + // already written a final block. + if (isWritable() && (!m_buffer.isEmpty() || m_blockIndex != 0)) { + if (!m_buffer.isEmpty()) { + writeHashedBlock(); + } + + // write empty final block + writeHashedBlock(); + } + + LayeredStream::close(); +} + +qint64 HmacBlockStream::readData(char* data, qint64 maxSize) +{ + if (m_error) { + return -1; + } + else if (m_eof) { + return 0; + } + + qint64 bytesRemaining = maxSize; + qint64 offset = 0; + + while (bytesRemaining > 0) { + if (m_bufferPos == m_buffer.size()) { + if (!readHashedBlock()) { + if (m_error) { + return -1; + } + else { + return maxSize - bytesRemaining; + } + } + } + + int bytesToCopy = qMin(bytesRemaining, static_cast<qint64>(m_buffer.size() - m_bufferPos)); + + memcpy(data + offset, m_buffer.constData() + m_bufferPos, bytesToCopy); + + offset += bytesToCopy; + m_bufferPos += bytesToCopy; + bytesRemaining -= bytesToCopy; + } + + return maxSize; +} + +bool HmacBlockStream::readHashedBlock() +{ + if (m_eof) { + return false; + } + QByteArray hmac = m_baseDevice->read(32); + if (hmac.size() != 32) { + m_error = true; + setErrorString("Invalid HMAC size."); + return false; + } + + QByteArray blockSizeBytes = m_baseDevice->read(4); + if (blockSizeBytes.size() != 4) { + m_error = true; + setErrorString("Invalid block size size."); + return false; + } + qint32 blockSize = Endian::bytesToInt32(blockSizeBytes, ByteOrder); + if (blockSize < 0) { + m_error = true; + setErrorString("Invalid block size."); + return false; + } + + m_buffer = m_baseDevice->read(blockSize); + if (m_buffer.size() != blockSize) { + m_error = true; + setErrorString("Block too short."); + return false; + } + + CryptoHash hasher(CryptoHash::Sha256, true); + hasher.setKey(getCurrentHmacKey()); + hasher.addData(Endian::uint64ToBytes(m_blockIndex, ByteOrder)); + hasher.addData(blockSizeBytes); + hasher.addData(m_buffer); + + if (hmac != hasher.result()) { + m_error = true; + setErrorString("Mismatch between hash and data."); + return false; + } + + m_bufferPos = 0; + m_blockIndex++; + + if (blockSize == 0) { + m_eof = true; + return false; + } + + return true; +} + +qint64 HmacBlockStream::writeData(const char* data, qint64 maxSize) +{ + Q_ASSERT(maxSize >= 0); + + if (m_error) { + return 0; + } + + qint64 bytesRemaining = maxSize; + qint64 offset = 0; + + while (bytesRemaining > 0) { + int bytesToCopy = qMin(bytesRemaining, static_cast<qint64>(m_blockSize - m_buffer.size())); + + m_buffer.append(data + offset, bytesToCopy); + + offset += bytesToCopy; + bytesRemaining -= bytesToCopy; + + if (m_buffer.size() == m_blockSize) { + if (!writeHashedBlock()) { + if (m_error) { + return -1; + } + else { + return maxSize - bytesRemaining; + } + } + } + } + + return maxSize; +} + +bool HmacBlockStream::writeHashedBlock() +{ + CryptoHash hasher(CryptoHash::Sha256, true); + hasher.setKey(getCurrentHmacKey()); + hasher.addData(Endian::uint64ToBytes(m_blockIndex, ByteOrder)); + hasher.addData(Endian::int32ToBytes(m_buffer.size(), ByteOrder)); + hasher.addData(m_buffer); + QByteArray hash = hasher.result(); + + if (m_baseDevice->write(hash) != hash.size()) { + m_error = true; + setErrorString(m_baseDevice->errorString()); + return false; + } + + if (!Endian::writeInt32(m_buffer.size(), m_baseDevice, ByteOrder)) { + m_error = true; + setErrorString(m_baseDevice->errorString()); + return false; + } + + if (!m_buffer.isEmpty()) { + if (m_baseDevice->write(m_buffer) != m_buffer.size()) { + m_error = true; + setErrorString(m_baseDevice->errorString()); + return false; + } + + m_buffer.clear(); + } + m_blockIndex++; + return true; +} + +QByteArray HmacBlockStream::getCurrentHmacKey() const { + return getHmacKey(m_blockIndex, m_key); +} + +QByteArray HmacBlockStream::getHmacKey(quint64 blockIndex, QByteArray key) { + Q_ASSERT(key.size() == 64); + QByteArray indexBytes = Endian::uint64ToBytes(blockIndex, ByteOrder); + CryptoHash hasher(CryptoHash::Sha512); + hasher.addData(indexBytes); + hasher.addData(key); + return hasher.result(); +} + +bool HmacBlockStream::atEnd() const { + return m_eof; +} diff --git a/src/streams/HmacBlockStream.h b/src/streams/HmacBlockStream.h new file mode 100644 index 000000000..eecd8fe92 --- /dev/null +++ b/src/streams/HmacBlockStream.h @@ -0,0 +1,61 @@ +/* +* Copyright (C) 2017 KeePassXC Team +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 2 or (at your option) +* version 3 of the License. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef KEEPASSX_HMACBLOCKSTREAM_H +#define KEEPASSX_HMACBLOCKSTREAM_H + +#include <QSysInfo> + +#include "streams/LayeredStream.h" + +class HmacBlockStream : public LayeredStream +{ + Q_OBJECT + +public: + explicit HmacBlockStream(QIODevice* baseDevice, QByteArray key); + HmacBlockStream(QIODevice* baseDevice, QByteArray key, qint32 blockSize); + ~HmacBlockStream(); + + bool reset() override; + void close() override; + + static QByteArray getHmacKey(quint64 blockIndex, QByteArray key); + + bool atEnd() const override; + +protected: + qint64 readData(char* data, qint64 maxSize) override; + qint64 writeData(const char* data, qint64 maxSize) override; + +private: + void init(); + bool readHashedBlock(); + bool writeHashedBlock(); + QByteArray getCurrentHmacKey() const; + + static const QSysInfo::Endian ByteOrder; + qint32 m_blockSize; + QByteArray m_buffer; + QByteArray m_key; + int m_bufferPos; + quint64 m_blockIndex; + bool m_eof; + bool m_error; +}; + +#endif // KEEPASSX_HMACBLOCKSTREAM_H diff --git a/tests/TestCryptoHash.cpp b/tests/TestCryptoHash.cpp index c166f5595..469ce8192 100644 --- a/tests/TestCryptoHash.cpp +++ b/tests/TestCryptoHash.cpp @@ -44,4 +44,17 @@ void TestCryptoHash::test() cryptoHash3.addData(QString("ssX").toLatin1()); QCOMPARE(cryptoHash3.result(), QByteArray::fromHex("0b56e5f65263e747af4a833bd7dd7ad26a64d7a4de7c68e52364893dca0766b4")); + + CryptoHash cryptoHash2(CryptoHash::Sha512); + QCOMPARE(cryptoHash2.result(), + QByteArray::fromHex("cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e")); + + QByteArray result3 = CryptoHash::hash(source2, CryptoHash::Sha512); + QCOMPARE(result3, QByteArray::fromHex("0d41b612584ed39ff72944c29494573e40f4bb95283455fae2e0be1e3565aa9f48057d59e6ffd777970e282871c25a549a2763e5b724794f312c97021c42f91d")); + + CryptoHash cryptoHash4(CryptoHash::Sha512); + cryptoHash4.addData(QString("KeePa").toLatin1()); + cryptoHash4.addData(QString("ssX").toLatin1()); + QCOMPARE(cryptoHash4.result(), + QByteArray::fromHex("0d41b612584ed39ff72944c29494573e40f4bb95283455fae2e0be1e3565aa9f48057d59e6ffd777970e282871c25a549a2763e5b724794f312c97021c42f91d")); } diff --git a/tests/TestKeePass2RandomStream.cpp b/tests/TestKeePass2RandomStream.cpp index 03dfbe507..bef7af540 100644 --- a/tests/TestKeePass2RandomStream.cpp +++ b/tests/TestKeePass2RandomStream.cpp @@ -58,7 +58,7 @@ void TestKeePass2RandomStream::test() } - KeePass2RandomStream randomStream; + KeePass2RandomStream randomStream(KeePass2::Salsa20); bool ok; QVERIFY(randomStream.init(key)); QByteArray randomStreamData; diff --git a/tests/TestSymmetricCipher.cpp b/tests/TestSymmetricCipher.cpp index c1e947063..bfa3c3db8 100644 --- a/tests/TestSymmetricCipher.cpp +++ b/tests/TestSymmetricCipher.cpp @@ -342,6 +342,56 @@ void TestSymmetricCipher::testSalsa20() QCOMPARE(cipherTextB.mid(448, 64), expectedCipherText4); } +void TestSymmetricCipher::testChaCha20() +{ + // https://tools.ietf.org/html/draft-agl-tls-chacha20poly1305-04#section-7 + bool ok; + + { + QByteArray key = QByteArray::fromHex("0000000000000000000000000000000000000000000000000000000000000000"); + QByteArray iv = QByteArray::fromHex("0000000000000000"); + SymmetricCipher cipher(SymmetricCipher::ChaCha20, SymmetricCipher::Stream, SymmetricCipher::Encrypt); + QVERIFY(cipher.init(key, iv)); + QCOMPARE(cipher.process(QByteArray(64, 0), &ok), + QByteArray::fromHex( + "76b8e0ada0f13d90405d6ae55386bd28bdd219b8a08ded1aa836efcc8b770dc7da41597c5157488d7724e03fb8d84a376a43b8f41518a11cc387b669b2ee6586")); + QVERIFY(ok); + } + + { + QByteArray key = QByteArray::fromHex("0000000000000000000000000000000000000000000000000000000000000001"); + QByteArray iv = QByteArray::fromHex("0000000000000000"); + SymmetricCipher cipher(SymmetricCipher::ChaCha20, SymmetricCipher::Stream, SymmetricCipher::Encrypt); + QVERIFY(cipher.init(key, iv)); + QCOMPARE(cipher.process(QByteArray(64, 0), &ok), + QByteArray::fromHex( + "4540f05a9f1fb296d7736e7b208e3c96eb4fe1834688d2604f450952ed432d41bbe2a0b6ea7566d2a5d1e7e20d42af2c53d792b1c43fea817e9ad275ae546963")); + QVERIFY(ok); + } + + { + QByteArray key = QByteArray::fromHex("0000000000000000000000000000000000000000000000000000000000000000"); + QByteArray iv = QByteArray::fromHex("0000000000000001"); + SymmetricCipher cipher(SymmetricCipher::ChaCha20, SymmetricCipher::Stream, SymmetricCipher::Encrypt); + QVERIFY(cipher.init(key, iv)); + QCOMPARE(cipher.process(QByteArray(60, 0), &ok), + QByteArray::fromHex( + "de9cba7bf3d69ef5e786dc63973f653a0b49e015adbff7134fcb7df137821031e85a050278a7084527214f73efc7fa5b5277062eb7a0433e445f41e3")); + QVERIFY(ok); + } + + { + QByteArray key = QByteArray::fromHex("0000000000000000000000000000000000000000000000000000000000000000"); + QByteArray iv = QByteArray::fromHex("0100000000000000"); + SymmetricCipher cipher(SymmetricCipher::ChaCha20, SymmetricCipher::Stream, SymmetricCipher::Encrypt); + QVERIFY(cipher.init(key, iv)); + QCOMPARE(cipher.process(QByteArray(64, 0), &ok), + QByteArray::fromHex( + "ef3fdfd6c61578fbf5cf35bd3dd33b8009631634d21e42ac33960bd138e50d32111e4caf237ee53ca8ad6426194a88545ddc497a0b466e7d6bbdb0041b2f586b")); + QVERIFY(ok); + } +} + void TestSymmetricCipher::testPadding() { QByteArray key = QByteArray::fromHex("603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4"); diff --git a/tests/TestSymmetricCipher.h b/tests/TestSymmetricCipher.h index cad13841a..40e3b49cf 100644 --- a/tests/TestSymmetricCipher.h +++ b/tests/TestSymmetricCipher.h @@ -34,6 +34,7 @@ private slots: void testTwofish256CbcEncryption(); void testTwofish256CbcDecryption(); void testSalsa20(); + void testChaCha20(); void testPadding(); void testStreamReset(); }; From e5ec585f983d17fba5db23fa510776d65bceb9e6 Mon Sep 17 00:00:00 2001 From: angelsl <angelsl@in04.sg> Date: Mon, 13 Nov 2017 15:43:38 +0800 Subject: [PATCH 223/402] Use GCRY_MD_FLAG_SECURE in CryptoHash --- src/crypto/CryptoHash.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/crypto/CryptoHash.cpp b/src/crypto/CryptoHash.cpp index a3ffb648e..907140606 100644 --- a/src/crypto/CryptoHash.cpp +++ b/src/crypto/CryptoHash.cpp @@ -39,7 +39,7 @@ CryptoHash::CryptoHash(CryptoHash::Algorithm algo, bool hmac) Q_ASSERT(Crypto::initalized()); int algoGcrypt = -1; - unsigned int flagsGcrypt = 0; + unsigned int flagsGcrypt = GCRY_MD_FLAG_SECURE; switch (algo) { case CryptoHash::Sha256: From 3461cbfb060012dbdaaea5af418eccbeb0fedc04 Mon Sep 17 00:00:00 2001 From: angelsl <angelsl@in04.sg> Date: Mon, 13 Nov 2017 02:55:03 +0800 Subject: [PATCH 224/402] Rename KeePass2{,Xml}{R,W} to Kdbx3{,Xml}{R,W}, and add a redirection class This class will in future select Kdbx4{R,W} as appropriate. --- src/CMakeLists.txt | 8 +- src/format/Kdbx3Reader.cpp | 394 ++++++++++++++++ src/format/Kdbx3Reader.h | 62 +++ src/format/Kdbx3Writer.cpp | 187 ++++++++ src/format/Kdbx3Writer.h | 47 ++ ...ePass2XmlReader.cpp => Kdbx3XmlReader.cpp} | 92 ++-- .../{KeePass2XmlReader.h => Kdbx3XmlReader.h} | 12 +- ...ePass2XmlWriter.cpp => Kdbx3XmlWriter.cpp} | 72 +-- .../{KeePass2XmlWriter.h => Kdbx3XmlWriter.h} | 10 +- src/format/KeePass2Reader.cpp | 437 +++--------------- src/format/KeePass2Reader.h | 83 ++-- src/format/KeePass2Repair.cpp | 5 +- src/format/KeePass2Writer.cpp | 209 ++------- src/format/KeePass2Writer.h | 51 +- tests/CMakeLists.txt | 2 +- tests/TestDeletedObjects.cpp | 4 +- tests/TestKdbx3XmlReader.cpp | 22 + tests/TestKeePass2Writer.cpp | 1 - tests/TestKeePass2XmlReader.cpp | 112 +++-- tests/TestKeePass2XmlReader.h | 23 +- 20 files changed, 1099 insertions(+), 734 deletions(-) create mode 100644 src/format/Kdbx3Reader.cpp create mode 100644 src/format/Kdbx3Reader.h create mode 100644 src/format/Kdbx3Writer.cpp create mode 100644 src/format/Kdbx3Writer.h rename src/format/{KeePass2XmlReader.cpp => Kdbx3XmlReader.cpp} (92%) rename src/format/{KeePass2XmlReader.h => Kdbx3XmlReader.h} (92%) rename src/format/{KeePass2XmlWriter.cpp => Kdbx3XmlWriter.cpp} (86%) rename src/format/{KeePass2XmlWriter.h => Kdbx3XmlWriter.h} (94%) create mode 100644 tests/TestKdbx3XmlReader.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2e10cdcf4..35ea97817 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -84,11 +84,13 @@ set(keepassx_SOURCES format/KeePass1Reader.cpp format/KeePass2.cpp format/KeePass2RandomStream.cpp - format/KeePass2Reader.cpp format/KeePass2Repair.cpp + format/KeePass2Reader.cpp format/KeePass2Writer.cpp - format/KeePass2XmlReader.cpp - format/KeePass2XmlWriter.cpp + format/Kdbx3Reader.cpp + format/Kdbx3Writer.cpp + format/Kdbx3XmlReader.cpp + format/Kdbx3XmlWriter.cpp gui/AboutDialog.cpp gui/Application.cpp gui/CategoryListWidget.cpp diff --git a/src/format/Kdbx3Reader.cpp b/src/format/Kdbx3Reader.cpp new file mode 100644 index 000000000..fc3dcbd64 --- /dev/null +++ b/src/format/Kdbx3Reader.cpp @@ -0,0 +1,394 @@ +/* + * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "Kdbx3Reader.h" + +#include <QBuffer> +#include <QFile> +#include <QIODevice> + +#include "core/Database.h" +#include "core/Endian.h" +#include "crypto/CryptoHash.h" +#include "crypto/kdf/AesKdf.h" +#include "format/KeePass1.h" +#include "format/KeePass2.h" +#include "format/KeePass2RandomStream.h" +#include "format/Kdbx3XmlReader.h" +#include "streams/HashedBlockStream.h" +#include "streams/QtIOCompressor" +#include "streams/StoreDataStream.h" +#include "streams/SymmetricCipherStream.h" + +Kdbx3Reader::Kdbx3Reader() + : m_device(nullptr) + , m_headerStream(nullptr) + , m_headerEnd(false) + , m_db(nullptr) +{ +} + +Database* Kdbx3Reader::readDatabase(QIODevice* device, const CompositeKey& key, bool keepDatabase) +{ + QScopedPointer<Database> db(new Database()); + m_db = db.data(); + m_device = device; + m_error = false; + m_errorStr.clear(); + m_headerEnd = false; + m_xmlData.clear(); + m_masterSeed.clear(); + m_encryptionIV.clear(); + m_streamStartBytes.clear(); + m_protectedStreamKey.clear(); + + StoreDataStream headerStream(m_device); + headerStream.open(QIODevice::ReadOnly); + m_headerStream = &headerStream; + + bool ok; + + quint32 signature1 = Endian::readUInt32(m_headerStream, KeePass2::BYTEORDER, &ok); + if (!ok || signature1 != KeePass2::SIGNATURE_1) { + raiseError(tr("Not a KeePass database.")); + return nullptr; + } + + quint32 signature2 = Endian::readUInt32(m_headerStream, KeePass2::BYTEORDER, &ok); + if (ok && signature2 == KeePass1::SIGNATURE_2) { + raiseError(tr("The selected file is an old KeePass 1 database (.kdb).\n\n" + "You can import it by clicking on Database > 'Import KeePass 1 database...'.\n" + "This is a one-way migration. You won't be able to open the imported " + "database with the old KeePassX 0.4 version.")); + return nullptr; + } + else if (!ok || signature2 != KeePass2::SIGNATURE_2) { + raiseError(tr("Not a KeePass database.")); + return nullptr; + } + + quint32 version = Endian::readUInt32(m_headerStream, KeePass2::BYTEORDER, &ok) + & KeePass2::FILE_VERSION_CRITICAL_MASK; + quint32 maxVersion = KeePass2::FILE_VERSION & KeePass2::FILE_VERSION_CRITICAL_MASK; + if (!ok || (version < KeePass2::FILE_VERSION_MIN) || (version > maxVersion)) { + raiseError(tr("Unsupported KeePass KDBX 2 or 3 database version.")); + return nullptr; + } + + while (readHeaderField() && !hasError()) { + } + + headerStream.close(); + + if (hasError()) { + return nullptr; + } + + // check if all required headers were present + if (m_masterSeed.isEmpty() || m_encryptionIV.isEmpty() + || m_streamStartBytes.isEmpty() || m_protectedStreamKey.isEmpty() + || m_db->cipher().isNull()) { + raiseError("missing database headers"); + return nullptr; + } + + if (!m_db->setKey(key, false)) { + raiseError(tr("Unable to calculate master key")); + return nullptr; + } + + if (m_db->challengeMasterSeed(m_masterSeed) == false) { + raiseError(tr("Unable to issue challenge-response.")); + return nullptr; + } + + CryptoHash hash(CryptoHash::Sha256); + hash.addData(m_masterSeed); + hash.addData(m_db->challengeResponseKey()); + hash.addData(m_db->transformedMasterKey()); + QByteArray finalKey = hash.result(); + + SymmetricCipher::Algorithm cipher = SymmetricCipher::cipherToAlgorithm(m_db->cipher()); + SymmetricCipherStream cipherStream(m_device, cipher, + SymmetricCipher::algorithmMode(cipher), SymmetricCipher::Decrypt); + if (!cipherStream.init(finalKey, m_encryptionIV)) { + raiseError(cipherStream.errorString()); + return nullptr; + } + if (!cipherStream.open(QIODevice::ReadOnly)) { + raiseError(cipherStream.errorString()); + return nullptr; + } + + QByteArray realStart = cipherStream.read(32); + + if (realStart != m_streamStartBytes) { + raiseError(tr("Wrong key or database file is corrupt.")); + return nullptr; + } + + HashedBlockStream hashedStream(&cipherStream); + if (!hashedStream.open(QIODevice::ReadOnly)) { + raiseError(hashedStream.errorString()); + return nullptr; + } + + QIODevice* xmlDevice; + QScopedPointer<QtIOCompressor> ioCompressor; + + if (m_db->compressionAlgo() == Database::CompressionNone) { + xmlDevice = &hashedStream; + } + else { + ioCompressor.reset(new QtIOCompressor(&hashedStream)); + ioCompressor->setStreamFormat(QtIOCompressor::GzipFormat); + if (!ioCompressor->open(QIODevice::ReadOnly)) { + raiseError(ioCompressor->errorString()); + return nullptr; + } + xmlDevice = ioCompressor.data(); + } + + KeePass2RandomStream randomStream(KeePass2::Salsa20); + if (!randomStream.init(m_protectedStreamKey)) { + raiseError(randomStream.errorString()); + return nullptr; + } + + QScopedPointer<QBuffer> buffer; + + if (m_saveXml) { + m_xmlData = xmlDevice->readAll(); + buffer.reset(new QBuffer(&m_xmlData)); + buffer->open(QIODevice::ReadOnly); + xmlDevice = buffer.data(); + } + + Kdbx3XmlReader xmlReader; + xmlReader.readDatabase(xmlDevice, m_db, &randomStream); + + if (xmlReader.hasError()) { + raiseError(xmlReader.errorString()); + if (keepDatabase) { + return db.take(); + } + else { + return nullptr; + } + } + + Q_ASSERT(version < 0x00030001 || !xmlReader.headerHash().isEmpty()); + + if (!xmlReader.headerHash().isEmpty()) { + QByteArray headerHash = CryptoHash::hash(headerStream.storedData(), CryptoHash::Sha256); + if (headerHash != xmlReader.headerHash()) { + raiseError("Header doesn't match hash"); + return nullptr; + } + } + + return db.take(); +} + +bool Kdbx3Reader::readHeaderField() +{ + QByteArray fieldIDArray = m_headerStream->read(1); + if (fieldIDArray.size() != 1) { + raiseError("Invalid header id size"); + return false; + } + quint8 fieldID = fieldIDArray.at(0); + + bool ok; + quint16 fieldLen = Endian::readUInt16(m_headerStream, KeePass2::BYTEORDER, &ok); + if (!ok) { + raiseError("Invalid header field length"); + return false; + } + + QByteArray fieldData; + if (fieldLen != 0) { + fieldData = m_headerStream->read(fieldLen); + if (fieldData.size() != fieldLen) { + raiseError("Invalid header data length"); + return false; + } + } + + switch (fieldID) { + case KeePass2::EndOfHeader: + m_headerEnd = true; + break; + + case KeePass2::CipherID: + setCipher(fieldData); + break; + + case KeePass2::CompressionFlags: + setCompressionFlags(fieldData); + break; + + case KeePass2::MasterSeed: + setMasterSeed(fieldData); + break; + + case KeePass2::TransformSeed: + setTransformSeed(fieldData); + break; + + case KeePass2::TransformRounds: + setTransformRounds(fieldData); + break; + + case KeePass2::EncryptionIV: + setEncryptionIV(fieldData); + break; + + case KeePass2::ProtectedStreamKey: + setProtectedStreamKey(fieldData); + break; + + case KeePass2::StreamStartBytes: + setStreamStartBytes(fieldData); + break; + + case KeePass2::InnerRandomStreamID: + setInnerRandomStreamID(fieldData); + break; + + default: + qWarning("Unknown header field read: id=%d", fieldID); + break; + } + + return !m_headerEnd; +} + +void Kdbx3Reader::setCipher(const QByteArray& data) +{ + if (data.size() != Uuid::Length) { + raiseError("Invalid cipher uuid length"); + } else { + Uuid uuid(data); + + if (SymmetricCipher::cipherToAlgorithm(uuid) == SymmetricCipher::InvalidAlgorithm) { + raiseError("Unsupported cipher"); + } else { + m_db->setCipher(uuid); + } + } +} + +void Kdbx3Reader::setCompressionFlags(const QByteArray& data) +{ + if (data.size() != 4) { + raiseError("Invalid compression flags length"); + } + else { + quint32 id = Endian::bytesToUInt32(data, KeePass2::BYTEORDER); + + if (id > Database::CompressionAlgorithmMax) { + raiseError("Unsupported compression algorithm"); + } + else { + m_db->setCompressionAlgo(static_cast<Database::CompressionAlgorithm>(id)); + } + } +} + +void Kdbx3Reader::setMasterSeed(const QByteArray& data) +{ + if (data.size() != 32) { + raiseError("Invalid master seed size"); + } + else { + m_masterSeed = data; + } +} + +void Kdbx3Reader::setTransformSeed(const QByteArray& data) +{ + if (data.size() != 32) { + raiseError("Invalid transform seed size"); + } + else { + AesKdf* aesKdf; + if (m_db->kdf()->type() == Kdf::Type::AES) { + aesKdf = static_cast<AesKdf*>(m_db->kdf()); + } else { + aesKdf = new AesKdf(); + m_db->setKdf(aesKdf); + } + + aesKdf->setSeed(data); + } +} + +void Kdbx3Reader::setTransformRounds(const QByteArray& data) +{ + if (data.size() != 8) { + raiseError("Invalid transform rounds size"); + } + else { + quint64 rounds = Endian::bytesToUInt64(data, KeePass2::BYTEORDER); + + AesKdf* aesKdf; + if (m_db->kdf()->type() == Kdf::Type::AES) { + aesKdf = static_cast<AesKdf*>(m_db->kdf()); + } else { + aesKdf = new AesKdf(); + m_db->setKdf(aesKdf); + } + + aesKdf->setRounds(rounds); + } +} + +void Kdbx3Reader::setEncryptionIV(const QByteArray& data) +{ + m_encryptionIV = data; +} + +void Kdbx3Reader::setProtectedStreamKey(const QByteArray& data) +{ + m_protectedStreamKey = data; +} + +void Kdbx3Reader::setStreamStartBytes(const QByteArray& data) +{ + if (data.size() != 32) { + raiseError("Invalid start bytes size"); + } + else { + m_streamStartBytes = data; + } +} + +void Kdbx3Reader::setInnerRandomStreamID(const QByteArray& data) +{ + if (data.size() != 4) { + raiseError("Invalid random stream id size"); + } else { + quint32 id = Endian::bytesToUInt32(data, KeePass2::BYTEORDER); + KeePass2::ProtectedStreamAlgo irsAlgo = KeePass2::idToProtectedStreamAlgo(id); + if (irsAlgo == KeePass2::InvalidProtectedStreamAlgo || irsAlgo == KeePass2::ArcFourVariant) { + raiseError("Invalid inner random stream cipher"); + } else { + m_irsAlgo = irsAlgo; + } + } +} diff --git a/src/format/Kdbx3Reader.h b/src/format/Kdbx3Reader.h new file mode 100644 index 000000000..1083b4bb4 --- /dev/null +++ b/src/format/Kdbx3Reader.h @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef KEEPASSX_KDBX3READER_H +#define KEEPASSX_KDBX3READER_H + +#include <QCoreApplication> + +#include "format/KeePass2Reader.h" +#include "keys/CompositeKey.h" + +class Database; +class QIODevice; + +class Kdbx3Reader : public BaseKeePass2Reader +{ + Q_DECLARE_TR_FUNCTIONS(Kdbx3Reader) + +public: + Kdbx3Reader(); + + using BaseKeePass2Reader::readDatabase; + virtual Database* readDatabase(QIODevice* device, const CompositeKey& key, bool keepDatabase = false) override; + +private: + bool readHeaderField(); + + void setCipher(const QByteArray& data); + void setCompressionFlags(const QByteArray& data); + void setMasterSeed(const QByteArray& data); + void setTransformSeed(const QByteArray& data); + void setTransformRounds(const QByteArray& data); + void setEncryptionIV(const QByteArray& data); + void setProtectedStreamKey(const QByteArray& data); + void setStreamStartBytes(const QByteArray& data); + void setInnerRandomStreamID(const QByteArray& data); + + QIODevice* m_device; + QIODevice* m_headerStream; + bool m_headerEnd; + + Database* m_db; + QByteArray m_masterSeed; + QByteArray m_encryptionIV; + QByteArray m_streamStartBytes; +}; + +#endif // KEEPASSX_KDBX3READER_H diff --git a/src/format/Kdbx3Writer.cpp b/src/format/Kdbx3Writer.cpp new file mode 100644 index 000000000..d07ff9663 --- /dev/null +++ b/src/format/Kdbx3Writer.cpp @@ -0,0 +1,187 @@ +/* + * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "Kdbx3Writer.h" + +#include <QBuffer> +#include <QFile> +#include <QIODevice> + +#include "core/Database.h" +#include "core/Endian.h" +#include "crypto/CryptoHash.h" +#include "crypto/kdf/AesKdf.h" +#include "crypto/Random.h" +#include "format/KeePass2RandomStream.h" +#include "format/Kdbx3XmlWriter.h" +#include "streams/HashedBlockStream.h" +#include "streams/QtIOCompressor" +#include "streams/SymmetricCipherStream.h" + +#define CHECK_RETURN(x) if (!(x)) return; +#define CHECK_RETURN_FALSE(x) if (!(x)) return false; + +Kdbx3Writer::Kdbx3Writer() + : m_device(0) +{ +} + +bool Kdbx3Writer::writeDatabase(QIODevice* device, Database* db) +{ + m_error = false; + m_errorStr.clear(); + + QByteArray masterSeed = randomGen()->randomArray(32); + QByteArray encryptionIV = randomGen()->randomArray(16); + QByteArray protectedStreamKey = randomGen()->randomArray(32); + QByteArray startBytes = randomGen()->randomArray(32); + QByteArray endOfHeader = "\r\n\r\n"; + + if (db->challengeMasterSeed(masterSeed) == false) { + raiseError(tr("Unable to issue challenge-response.")); + return false; + } + + if (!db->setKey(db->key(), false, true)) { + raiseError(tr("Unable to calculate master key")); + return false; + } + + CryptoHash hash(CryptoHash::Sha256); + hash.addData(masterSeed); + hash.addData(db->challengeResponseKey()); + Q_ASSERT(!db->transformedMasterKey().isEmpty()); + hash.addData(db->transformedMasterKey()); + QByteArray finalKey = hash.result(); + + QBuffer header; + header.open(QIODevice::WriteOnly); + m_device = &header; + + CHECK_RETURN_FALSE(writeData(Endian::int32ToBytes(KeePass2::SIGNATURE_1, KeePass2::BYTEORDER))); + CHECK_RETURN_FALSE(writeData(Endian::int32ToBytes(KeePass2::SIGNATURE_2, KeePass2::BYTEORDER))); + CHECK_RETURN_FALSE(writeData(Endian::int32ToBytes(KeePass2::FILE_VERSION, KeePass2::BYTEORDER))); + + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::CipherID, db->cipher().toByteArray())); + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::CompressionFlags, + Endian::int32ToBytes(db->compressionAlgo(), + KeePass2::BYTEORDER))); + AesKdf* kdf = static_cast<AesKdf*>(db->kdf()); + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::MasterSeed, masterSeed)); + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::TransformSeed, kdf->seed())); + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::TransformRounds, + Endian::int64ToBytes(kdf->rounds(), + KeePass2::BYTEORDER))); + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::EncryptionIV, encryptionIV)); + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::ProtectedStreamKey, protectedStreamKey)); + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::StreamStartBytes, startBytes)); + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::InnerRandomStreamID, + Endian::int32ToBytes(KeePass2::Salsa20, + KeePass2::BYTEORDER))); + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::EndOfHeader, endOfHeader)); + + header.close(); + m_device = device; + QByteArray headerHash = CryptoHash::hash(header.data(), CryptoHash::Sha256); + CHECK_RETURN_FALSE(writeData(header.data())); + + SymmetricCipher::Algorithm algo = SymmetricCipher::cipherToAlgorithm(db->cipher()); + SymmetricCipherStream cipherStream(device, algo, + SymmetricCipher::algorithmMode(algo), SymmetricCipher::Encrypt); + cipherStream.init(finalKey, encryptionIV); + if (!cipherStream.open(QIODevice::WriteOnly)) { + raiseError(cipherStream.errorString()); + return false; + } + m_device = &cipherStream; + CHECK_RETURN_FALSE(writeData(startBytes)); + + HashedBlockStream hashedStream(&cipherStream); + if (!hashedStream.open(QIODevice::WriteOnly)) { + raiseError(hashedStream.errorString()); + return false; + } + + QScopedPointer<QtIOCompressor> ioCompressor; + + if (db->compressionAlgo() == Database::CompressionNone) { + m_device = &hashedStream; + } + else { + ioCompressor.reset(new QtIOCompressor(&hashedStream)); + ioCompressor->setStreamFormat(QtIOCompressor::GzipFormat); + if (!ioCompressor->open(QIODevice::WriteOnly)) { + raiseError(ioCompressor->errorString()); + return false; + } + m_device = ioCompressor.data(); + } + + KeePass2RandomStream randomStream(KeePass2::Salsa20); + if (!randomStream.init(protectedStreamKey)) { + raiseError(randomStream.errorString()); + return false; + } + + Kdbx3XmlWriter xmlWriter; + xmlWriter.writeDatabase(m_device, db, &randomStream, headerHash); + + // Explicitly close/reset streams so they are flushed and we can detect + // errors. QIODevice::close() resets errorString() etc. + if (ioCompressor) { + ioCompressor->close(); + } + if (!hashedStream.reset()) { + raiseError(hashedStream.errorString()); + return false; + } + if (!cipherStream.reset()) { + raiseError(cipherStream.errorString()); + return false; + } + + if (xmlWriter.hasError()) { + raiseError(xmlWriter.errorString()); + } + + return true; +} + +bool Kdbx3Writer::writeData(const QByteArray& data) +{ + if (m_device->write(data) != data.size()) { + raiseError(m_device->errorString()); + return false; + } + else { + return true; + } +} + +bool Kdbx3Writer::writeHeaderField(KeePass2::HeaderFieldID fieldId, const QByteArray& data) +{ + Q_ASSERT(data.size() <= 65535); + + QByteArray fieldIdArr; + fieldIdArr[0] = fieldId; + CHECK_RETURN_FALSE(writeData(fieldIdArr)); + CHECK_RETURN_FALSE(writeData(Endian::int16ToBytes(static_cast<quint16>(data.size()), + KeePass2::BYTEORDER))); + CHECK_RETURN_FALSE(writeData(data)); + + return true; +} diff --git a/src/format/Kdbx3Writer.h b/src/format/Kdbx3Writer.h new file mode 100644 index 000000000..6b5b8f28f --- /dev/null +++ b/src/format/Kdbx3Writer.h @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef KEEPASSX_KDBX3WRITER_H +#define KEEPASSX_KDBX3WRITER_H + +#include <QCoreApplication> + +#include "format/KeePass2.h" +#include "format/KeePass2Writer.h" +#include "keys/CompositeKey.h" + +class Database; +class QIODevice; + +class Kdbx3Writer : public BaseKeePass2Writer +{ + Q_DECLARE_TR_FUNCTIONS(Kdbx3Writer) + +public: + Kdbx3Writer(); + + using BaseKeePass2Writer::writeDatabase; + bool writeDatabase(QIODevice* device, Database* db); + +private: + bool writeData(const QByteArray& data); + bool writeHeaderField(KeePass2::HeaderFieldID fieldId, const QByteArray& data); + + QIODevice* m_device; +}; + +#endif // KEEPASSX_KDBX3WRITER_H diff --git a/src/format/KeePass2XmlReader.cpp b/src/format/Kdbx3XmlReader.cpp similarity index 92% rename from src/format/KeePass2XmlReader.cpp rename to src/format/Kdbx3XmlReader.cpp index de7ca6d79..6f3745553 100644 --- a/src/format/KeePass2XmlReader.cpp +++ b/src/format/Kdbx3XmlReader.cpp @@ -15,7 +15,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include "KeePass2XmlReader.h" +#include "Kdbx3XmlReader.h" #include <QBuffer> #include <QFile> @@ -30,7 +30,7 @@ typedef QPair<QString, QString> StringPair; -KeePass2XmlReader::KeePass2XmlReader() +Kdbx3XmlReader::Kdbx3XmlReader() : m_randomStream(nullptr) , m_db(nullptr) , m_meta(nullptr) @@ -40,12 +40,12 @@ KeePass2XmlReader::KeePass2XmlReader() { } -void KeePass2XmlReader::setStrictMode(bool strictMode) +void Kdbx3XmlReader::setStrictMode(bool strictMode) { m_strictMode = strictMode; } -void KeePass2XmlReader::readDatabase(QIODevice* device, Database* db, KeePass2RandomStream* randomStream) +void Kdbx3XmlReader::readDatabase(QIODevice* device, Database* db, KeePass2RandomStream* randomStream) { m_error = false; m_errorStr.clear(); @@ -76,12 +76,12 @@ void KeePass2XmlReader::readDatabase(QIODevice* device, Database* db, KeePass2Ra if (!m_xml.error()) { if (!m_tmpParent->children().isEmpty()) { - qWarning("KeePass2XmlReader::readDatabase: found %d invalid group reference(s)", + qWarning("Kdbx3XmlReader::readDatabase: found %d invalid group reference(s)", m_tmpParent->children().size()); } if (!m_tmpParent->entries().isEmpty()) { - qWarning("KeePass2XmlReader::readDatabase: found %d invalid entry reference(s)", + qWarning("Kdbx3XmlReader::readDatabase: found %d invalid entry reference(s)", m_tmpParent->children().size()); } } @@ -97,7 +97,7 @@ void KeePass2XmlReader::readDatabase(QIODevice* device, Database* db, KeePass2Ra if (!m_xml.error()) { for (const QString& key : unusedKeys) { - qWarning("KeePass2XmlReader::readDatabase: found unused key \"%s\"", qPrintable(key)); + qWarning("Kdbx3XmlReader::readDatabase: found unused key \"%s\"", qPrintable(key)); } } @@ -127,26 +127,26 @@ void KeePass2XmlReader::readDatabase(QIODevice* device, Database* db, KeePass2Ra delete m_tmpParent; } -Database* KeePass2XmlReader::readDatabase(QIODevice* device) +Database* Kdbx3XmlReader::readDatabase(QIODevice* device) { Database* db = new Database(); readDatabase(device, db); return db; } -Database* KeePass2XmlReader::readDatabase(const QString& filename) +Database* Kdbx3XmlReader::readDatabase(const QString& filename) { QFile file(filename); file.open(QIODevice::ReadOnly); return readDatabase(&file); } -bool KeePass2XmlReader::hasError() +bool Kdbx3XmlReader::hasError() { return m_error || m_xml.hasError(); } -QString KeePass2XmlReader::errorString() +QString Kdbx3XmlReader::errorString() { if (m_error) { return m_errorStr; @@ -162,18 +162,18 @@ QString KeePass2XmlReader::errorString() } } -void KeePass2XmlReader::raiseError(const QString& errorMessage) +void Kdbx3XmlReader::raiseError(const QString& errorMessage) { m_error = true; m_errorStr = errorMessage; } -QByteArray KeePass2XmlReader::headerHash() +QByteArray Kdbx3XmlReader::headerHash() { return m_headerHash; } -bool KeePass2XmlReader::parseKeePassFile() +bool Kdbx3XmlReader::parseKeePassFile() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "KeePassFile"); @@ -202,7 +202,7 @@ bool KeePass2XmlReader::parseKeePassFile() return rootParsedSuccessfully; } -void KeePass2XmlReader::parseMeta() +void Kdbx3XmlReader::parseMeta() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Meta"); @@ -303,7 +303,7 @@ void KeePass2XmlReader::parseMeta() } } -void KeePass2XmlReader::parseMemoryProtection() +void Kdbx3XmlReader::parseMemoryProtection() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "MemoryProtection"); @@ -329,7 +329,7 @@ void KeePass2XmlReader::parseMemoryProtection() } } -void KeePass2XmlReader::parseCustomIcons() +void Kdbx3XmlReader::parseCustomIcons() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "CustomIcons"); @@ -343,7 +343,7 @@ void KeePass2XmlReader::parseCustomIcons() } } -void KeePass2XmlReader::parseIcon() +void Kdbx3XmlReader::parseIcon() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Icon"); @@ -374,7 +374,7 @@ void KeePass2XmlReader::parseIcon() } } -void KeePass2XmlReader::parseBinaries() +void Kdbx3XmlReader::parseBinaries() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Binaries"); @@ -393,7 +393,7 @@ void KeePass2XmlReader::parseBinaries() } if (m_binaryPool.contains(id)) { - qWarning("KeePass2XmlReader::parseBinaries: overwriting binary item \"%s\"", + qWarning("Kdbx3XmlReader::parseBinaries: overwriting binary item \"%s\"", qPrintable(id)); } @@ -405,7 +405,7 @@ void KeePass2XmlReader::parseBinaries() } } -void KeePass2XmlReader::parseCustomData() +void Kdbx3XmlReader::parseCustomData() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "CustomData"); @@ -419,7 +419,7 @@ void KeePass2XmlReader::parseCustomData() } } -void KeePass2XmlReader::parseCustomDataItem() +void Kdbx3XmlReader::parseCustomDataItem() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Item"); @@ -450,7 +450,7 @@ void KeePass2XmlReader::parseCustomDataItem() } } -bool KeePass2XmlReader::parseRoot() +bool Kdbx3XmlReader::parseRoot() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Root"); @@ -486,7 +486,7 @@ bool KeePass2XmlReader::parseRoot() return groupParsedSuccessfully; } -Group* KeePass2XmlReader::parseGroup() +Group* Kdbx3XmlReader::parseGroup() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Group"); @@ -525,7 +525,7 @@ Group* KeePass2XmlReader::parseGroup() } else { if (iconId >= DatabaseIcons::IconCount) { - qWarning("KeePass2XmlReader::parseGroup: icon id \"%d\" not supported", iconId); + qWarning("Kdbx3XmlReader::parseGroup: icon id \"%d\" not supported", iconId); } group->setIcon(iconId); } @@ -623,7 +623,7 @@ Group* KeePass2XmlReader::parseGroup() return group; } -void KeePass2XmlReader::parseDeletedObjects() +void Kdbx3XmlReader::parseDeletedObjects() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "DeletedObjects"); @@ -637,7 +637,7 @@ void KeePass2XmlReader::parseDeletedObjects() } } -void KeePass2XmlReader::parseDeletedObject() +void Kdbx3XmlReader::parseDeletedObject() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "DeletedObject"); @@ -671,7 +671,7 @@ void KeePass2XmlReader::parseDeletedObject() } } -Entry* KeePass2XmlReader::parseEntry(bool history) +Entry* Kdbx3XmlReader::parseEntry(bool history) { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Entry"); @@ -793,7 +793,7 @@ Entry* KeePass2XmlReader::parseEntry(bool history) return entry; } -void KeePass2XmlReader::parseEntryString(Entry* entry) +void Kdbx3XmlReader::parseEntryString(Entry* entry) { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "String"); @@ -855,7 +855,7 @@ void KeePass2XmlReader::parseEntryString(Entry* entry) } } -QPair<QString, QString> KeePass2XmlReader::parseEntryBinary(Entry* entry) +QPair<QString, QString> Kdbx3XmlReader::parseEntryBinary(Entry* entry) { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Binary"); @@ -913,7 +913,7 @@ QPair<QString, QString> KeePass2XmlReader::parseEntryBinary(Entry* entry) return poolRef; } -void KeePass2XmlReader::parseAutoType(Entry* entry) +void Kdbx3XmlReader::parseAutoType(Entry* entry) { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "AutoType"); @@ -936,7 +936,7 @@ void KeePass2XmlReader::parseAutoType(Entry* entry) } } -void KeePass2XmlReader::parseAutoTypeAssoc(Entry* entry) +void Kdbx3XmlReader::parseAutoTypeAssoc(Entry* entry) { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Association"); @@ -966,7 +966,7 @@ void KeePass2XmlReader::parseAutoTypeAssoc(Entry* entry) } } -QList<Entry*> KeePass2XmlReader::parseEntryHistory() +QList<Entry*> Kdbx3XmlReader::parseEntryHistory() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "History"); @@ -984,7 +984,7 @@ QList<Entry*> KeePass2XmlReader::parseEntryHistory() return historyItems; } -TimeInfo KeePass2XmlReader::parseTimes() +TimeInfo Kdbx3XmlReader::parseTimes() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Times"); @@ -1019,12 +1019,12 @@ TimeInfo KeePass2XmlReader::parseTimes() return timeInfo; } -QString KeePass2XmlReader::readString() +QString Kdbx3XmlReader::readString() { return m_xml.readElementText(); } -bool KeePass2XmlReader::readBool() +bool Kdbx3XmlReader::readBool() { QString str = readString(); @@ -1043,7 +1043,7 @@ bool KeePass2XmlReader::readBool() } } -QDateTime KeePass2XmlReader::readDateTime() +QDateTime Kdbx3XmlReader::readDateTime() { QString str = readString(); QDateTime dt = QDateTime::fromString(str, Qt::ISODate); @@ -1060,7 +1060,7 @@ QDateTime KeePass2XmlReader::readDateTime() return dt; } -QColor KeePass2XmlReader::readColor() +QColor Kdbx3XmlReader::readColor() { QString colorStr = readString(); @@ -1101,7 +1101,7 @@ QColor KeePass2XmlReader::readColor() return color; } -int KeePass2XmlReader::readNumber() +int Kdbx3XmlReader::readNumber() { bool ok; int result = readString().toInt(&ok); @@ -1111,7 +1111,7 @@ int KeePass2XmlReader::readNumber() return result; } -Uuid KeePass2XmlReader::readUuid() +Uuid Kdbx3XmlReader::readUuid() { QByteArray uuidBin = readBinary(); if (uuidBin.isEmpty()) { @@ -1128,12 +1128,12 @@ Uuid KeePass2XmlReader::readUuid() } } -QByteArray KeePass2XmlReader::readBinary() +QByteArray Kdbx3XmlReader::readBinary() { return QByteArray::fromBase64(readString().toLatin1()); } -QByteArray KeePass2XmlReader::readCompressedBinary() +QByteArray Kdbx3XmlReader::readCompressedBinary() { QByteArray rawData = readBinary(); @@ -1151,7 +1151,7 @@ QByteArray KeePass2XmlReader::readCompressedBinary() return result; } -Group* KeePass2XmlReader::getGroup(const Uuid& uuid) +Group* Kdbx3XmlReader::getGroup(const Uuid& uuid) { if (uuid.isNull()) { return nullptr; @@ -1170,7 +1170,7 @@ Group* KeePass2XmlReader::getGroup(const Uuid& uuid) } } -Entry* KeePass2XmlReader::getEntry(const Uuid& uuid) +Entry* Kdbx3XmlReader::getEntry(const Uuid& uuid) { if (uuid.isNull()) { return nullptr; @@ -1189,8 +1189,8 @@ Entry* KeePass2XmlReader::getEntry(const Uuid& uuid) } } -void KeePass2XmlReader::skipCurrentElement() +void Kdbx3XmlReader::skipCurrentElement() { - qWarning("KeePass2XmlReader::skipCurrentElement: skip element \"%s\"", qPrintable(m_xml.name().toString())); + qWarning("Kdbx3XmlReader::skipCurrentElement: skip element \"%s\"", qPrintable(m_xml.name().toString())); m_xml.skipCurrentElement(); } diff --git a/src/format/KeePass2XmlReader.h b/src/format/Kdbx3XmlReader.h similarity index 92% rename from src/format/KeePass2XmlReader.h rename to src/format/Kdbx3XmlReader.h index d2e0e0025..1837aaab6 100644 --- a/src/format/KeePass2XmlReader.h +++ b/src/format/Kdbx3XmlReader.h @@ -15,8 +15,8 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef KEEPASSX_KEEPASS2XMLREADER_H -#define KEEPASSX_KEEPASS2XMLREADER_H +#ifndef KEEPASSX_KDBX3XMLREADER_H +#define KEEPASSX_KDBX3XMLREADER_H #include <QColor> #include <QCoreApplication> @@ -34,12 +34,12 @@ class Group; class KeePass2RandomStream; class Metadata; -class KeePass2XmlReader +class Kdbx3XmlReader { - Q_DECLARE_TR_FUNCTIONS(KeePass2XmlReader) + Q_DECLARE_TR_FUNCTIONS(Kdbx3XmlReader) public: - KeePass2XmlReader(); + Kdbx3XmlReader(); Database* readDatabase(QIODevice* device); void readDatabase(QIODevice* device, Database* db, KeePass2RandomStream* randomStream = nullptr); Database* readDatabase(const QString& filename); @@ -98,4 +98,4 @@ private: bool m_strictMode; }; -#endif // KEEPASSX_KEEPASS2XMLREADER_H +#endif // KEEPASSX_KDBX3XMLREADER_H diff --git a/src/format/KeePass2XmlWriter.cpp b/src/format/Kdbx3XmlWriter.cpp similarity index 86% rename from src/format/KeePass2XmlWriter.cpp rename to src/format/Kdbx3XmlWriter.cpp index fa67ece93..ff9262a01 100644 --- a/src/format/KeePass2XmlWriter.cpp +++ b/src/format/Kdbx3XmlWriter.cpp @@ -15,7 +15,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include "KeePass2XmlWriter.h" +#include "Kdbx3XmlWriter.h" #include <QBuffer> #include <QFile> @@ -24,7 +24,7 @@ #include "format/KeePass2RandomStream.h" #include "streams/QtIOCompressor" -KeePass2XmlWriter::KeePass2XmlWriter() +Kdbx3XmlWriter::Kdbx3XmlWriter() : m_db(nullptr) , m_meta(nullptr) , m_randomStream(nullptr) @@ -35,7 +35,7 @@ KeePass2XmlWriter::KeePass2XmlWriter() m_xml.setCodec("UTF-8"); } -void KeePass2XmlWriter::writeDatabase(QIODevice* device, Database* db, KeePass2RandomStream* randomStream, +void Kdbx3XmlWriter::writeDatabase(QIODevice* device, Database* db, KeePass2RandomStream* randomStream, const QByteArray& headerHash) { m_db = db; @@ -63,24 +63,24 @@ void KeePass2XmlWriter::writeDatabase(QIODevice* device, Database* db, KeePass2R } } -void KeePass2XmlWriter::writeDatabase(const QString& filename, Database* db) +void Kdbx3XmlWriter::writeDatabase(const QString& filename, Database* db) { QFile file(filename); file.open(QIODevice::WriteOnly|QIODevice::Truncate); writeDatabase(&file, db); } -bool KeePass2XmlWriter::hasError() +bool Kdbx3XmlWriter::hasError() { return m_error; } -QString KeePass2XmlWriter::errorString() +QString Kdbx3XmlWriter::errorString() { return m_errorStr; } -void KeePass2XmlWriter::generateIdMap() +void Kdbx3XmlWriter::generateIdMap() { const QList<Entry*> allEntries = m_db->rootGroup()->entriesRecursive(true); int nextId = 0; @@ -96,7 +96,7 @@ void KeePass2XmlWriter::generateIdMap() } } -void KeePass2XmlWriter::writeMetadata() +void Kdbx3XmlWriter::writeMetadata() { m_xml.writeStartElement("Meta"); @@ -132,7 +132,7 @@ void KeePass2XmlWriter::writeMetadata() m_xml.writeEndElement(); } -void KeePass2XmlWriter::writeMemoryProtection() +void Kdbx3XmlWriter::writeMemoryProtection() { m_xml.writeStartElement("MemoryProtection"); @@ -145,7 +145,7 @@ void KeePass2XmlWriter::writeMemoryProtection() m_xml.writeEndElement(); } -void KeePass2XmlWriter::writeCustomIcons() +void Kdbx3XmlWriter::writeCustomIcons() { m_xml.writeStartElement("CustomIcons"); @@ -157,7 +157,7 @@ void KeePass2XmlWriter::writeCustomIcons() m_xml.writeEndElement(); } -void KeePass2XmlWriter::writeIcon(const Uuid& uuid, const QImage& icon) +void Kdbx3XmlWriter::writeIcon(const Uuid& uuid, const QImage& icon) { m_xml.writeStartElement("Icon"); @@ -174,7 +174,7 @@ void KeePass2XmlWriter::writeIcon(const Uuid& uuid, const QImage& icon) m_xml.writeEndElement(); } -void KeePass2XmlWriter::writeBinaries() +void Kdbx3XmlWriter::writeBinaries() { m_xml.writeStartElement("Binaries"); @@ -216,7 +216,7 @@ void KeePass2XmlWriter::writeBinaries() m_xml.writeEndElement(); } -void KeePass2XmlWriter::writeCustomData() +void Kdbx3XmlWriter::writeCustomData() { m_xml.writeStartElement("CustomData"); @@ -229,7 +229,7 @@ void KeePass2XmlWriter::writeCustomData() m_xml.writeEndElement(); } -void KeePass2XmlWriter::writeCustomDataItem(const QString& key, const QString& value) +void Kdbx3XmlWriter::writeCustomDataItem(const QString& key, const QString& value) { m_xml.writeStartElement("Item"); @@ -239,7 +239,7 @@ void KeePass2XmlWriter::writeCustomDataItem(const QString& key, const QString& v m_xml.writeEndElement(); } -void KeePass2XmlWriter::writeRoot() +void Kdbx3XmlWriter::writeRoot() { Q_ASSERT(m_db->rootGroup()); @@ -251,7 +251,7 @@ void KeePass2XmlWriter::writeRoot() m_xml.writeEndElement(); } -void KeePass2XmlWriter::writeGroup(const Group* group) +void Kdbx3XmlWriter::writeGroup(const Group* group) { Q_ASSERT(!group->uuid().isNull()); @@ -288,7 +288,7 @@ void KeePass2XmlWriter::writeGroup(const Group* group) m_xml.writeEndElement(); } -void KeePass2XmlWriter::writeTimes(const TimeInfo& ti) +void Kdbx3XmlWriter::writeTimes(const TimeInfo& ti) { m_xml.writeStartElement("Times"); @@ -303,7 +303,7 @@ void KeePass2XmlWriter::writeTimes(const TimeInfo& ti) m_xml.writeEndElement(); } -void KeePass2XmlWriter::writeDeletedObjects() +void Kdbx3XmlWriter::writeDeletedObjects() { m_xml.writeStartElement("DeletedObjects"); @@ -315,7 +315,7 @@ void KeePass2XmlWriter::writeDeletedObjects() m_xml.writeEndElement(); } -void KeePass2XmlWriter::writeDeletedObject(const DeletedObject& delObj) +void Kdbx3XmlWriter::writeDeletedObject(const DeletedObject& delObj) { m_xml.writeStartElement("DeletedObject"); @@ -325,7 +325,7 @@ void KeePass2XmlWriter::writeDeletedObject(const DeletedObject& delObj) m_xml.writeEndElement(); } -void KeePass2XmlWriter::writeEntry(const Entry* entry) +void Kdbx3XmlWriter::writeEntry(const Entry* entry) { Q_ASSERT(!entry->uuid().isNull()); @@ -407,7 +407,7 @@ void KeePass2XmlWriter::writeEntry(const Entry* entry) m_xml.writeEndElement(); } -void KeePass2XmlWriter::writeAutoType(const Entry* entry) +void Kdbx3XmlWriter::writeAutoType(const Entry* entry) { m_xml.writeStartElement("AutoType"); @@ -423,7 +423,7 @@ void KeePass2XmlWriter::writeAutoType(const Entry* entry) m_xml.writeEndElement(); } -void KeePass2XmlWriter::writeAutoTypeAssoc(const AutoTypeAssociations::Association& assoc) +void Kdbx3XmlWriter::writeAutoTypeAssoc(const AutoTypeAssociations::Association& assoc) { m_xml.writeStartElement("Association"); @@ -433,7 +433,7 @@ void KeePass2XmlWriter::writeAutoTypeAssoc(const AutoTypeAssociations::Associati m_xml.writeEndElement(); } -void KeePass2XmlWriter::writeEntryHistory(const Entry* entry) +void Kdbx3XmlWriter::writeEntryHistory(const Entry* entry) { m_xml.writeStartElement("History"); @@ -445,7 +445,7 @@ void KeePass2XmlWriter::writeEntryHistory(const Entry* entry) m_xml.writeEndElement(); } -void KeePass2XmlWriter::writeString(const QString& qualifiedName, const QString& string) +void Kdbx3XmlWriter::writeString(const QString& qualifiedName, const QString& string) { if (string.isEmpty()) { m_xml.writeEmptyElement(qualifiedName); @@ -455,12 +455,12 @@ void KeePass2XmlWriter::writeString(const QString& qualifiedName, const QString& } } -void KeePass2XmlWriter::writeNumber(const QString& qualifiedName, int number) +void Kdbx3XmlWriter::writeNumber(const QString& qualifiedName, int number) { writeString(qualifiedName, QString::number(number)); } -void KeePass2XmlWriter::writeBool(const QString& qualifiedName, bool b) +void Kdbx3XmlWriter::writeBool(const QString& qualifiedName, bool b) { if (b) { writeString(qualifiedName, "True"); @@ -470,7 +470,7 @@ void KeePass2XmlWriter::writeBool(const QString& qualifiedName, bool b) } } -void KeePass2XmlWriter::writeDateTime(const QString& qualifiedName, const QDateTime& dateTime) +void Kdbx3XmlWriter::writeDateTime(const QString& qualifiedName, const QDateTime& dateTime) { Q_ASSERT(dateTime.isValid()); Q_ASSERT(dateTime.timeSpec() == Qt::UTC); @@ -485,12 +485,12 @@ void KeePass2XmlWriter::writeDateTime(const QString& qualifiedName, const QDateT writeString(qualifiedName, dateTimeStr); } -void KeePass2XmlWriter::writeUuid(const QString& qualifiedName, const Uuid& uuid) +void Kdbx3XmlWriter::writeUuid(const QString& qualifiedName, const Uuid& uuid) { writeString(qualifiedName, uuid.toBase64()); } -void KeePass2XmlWriter::writeUuid(const QString& qualifiedName, const Group* group) +void Kdbx3XmlWriter::writeUuid(const QString& qualifiedName, const Group* group) { if (group) { writeUuid(qualifiedName, group->uuid()); @@ -500,7 +500,7 @@ void KeePass2XmlWriter::writeUuid(const QString& qualifiedName, const Group* gro } } -void KeePass2XmlWriter::writeUuid(const QString& qualifiedName, const Entry* entry) +void Kdbx3XmlWriter::writeUuid(const QString& qualifiedName, const Entry* entry) { if (entry) { writeUuid(qualifiedName, entry->uuid()); @@ -510,12 +510,12 @@ void KeePass2XmlWriter::writeUuid(const QString& qualifiedName, const Entry* ent } } -void KeePass2XmlWriter::writeBinary(const QString& qualifiedName, const QByteArray& ba) +void Kdbx3XmlWriter::writeBinary(const QString& qualifiedName, const QByteArray& ba) { writeString(qualifiedName, QString::fromLatin1(ba.toBase64())); } -void KeePass2XmlWriter::writeColor(const QString& qualifiedName, const QColor& color) +void Kdbx3XmlWriter::writeColor(const QString& qualifiedName, const QColor& color) { QString colorStr; @@ -528,7 +528,7 @@ void KeePass2XmlWriter::writeColor(const QString& qualifiedName, const QColor& c writeString(qualifiedName, colorStr); } -void KeePass2XmlWriter::writeTriState(const QString& qualifiedName, Group::TriState triState) +void Kdbx3XmlWriter::writeTriState(const QString& qualifiedName, Group::TriState triState) { QString value; @@ -545,7 +545,7 @@ void KeePass2XmlWriter::writeTriState(const QString& qualifiedName, Group::TriSt writeString(qualifiedName, value); } -QString KeePass2XmlWriter::colorPartToString(int value) +QString Kdbx3XmlWriter::colorPartToString(int value) { QString str = QString::number(value, 16).toUpper(); if (str.length() == 1) { @@ -555,7 +555,7 @@ QString KeePass2XmlWriter::colorPartToString(int value) return str; } -QString KeePass2XmlWriter::stripInvalidXml10Chars(QString str) +QString Kdbx3XmlWriter::stripInvalidXml10Chars(QString str) { for (int i = str.size() - 1; i >= 0; i--) { const QChar ch = str.at(i); @@ -580,7 +580,7 @@ QString KeePass2XmlWriter::stripInvalidXml10Chars(QString str) return str; } -void KeePass2XmlWriter::raiseError(const QString& errorMessage) +void Kdbx3XmlWriter::raiseError(const QString& errorMessage) { m_error = true; m_errorStr = errorMessage; diff --git a/src/format/KeePass2XmlWriter.h b/src/format/Kdbx3XmlWriter.h similarity index 94% rename from src/format/KeePass2XmlWriter.h rename to src/format/Kdbx3XmlWriter.h index 23e148dbb..2bb130566 100644 --- a/src/format/KeePass2XmlWriter.h +++ b/src/format/Kdbx3XmlWriter.h @@ -15,8 +15,8 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef KEEPASSX_KEEPASS2XMLWRITER_H -#define KEEPASSX_KEEPASS2XMLWRITER_H +#ifndef KEEPASSX_KDBX3XMLWRITER_H +#define KEEPASSX_KDBX3XMLWRITER_H #include <QColor> #include <QDateTime> @@ -32,10 +32,10 @@ class KeePass2RandomStream; class Metadata; -class KeePass2XmlWriter +class Kdbx3XmlWriter { public: - KeePass2XmlWriter(); + Kdbx3XmlWriter(); void writeDatabase(QIODevice* device, Database* db, KeePass2RandomStream* randomStream = nullptr, const QByteArray& headerHash = QByteArray()); void writeDatabase(const QString& filename, Database* db); @@ -87,4 +87,4 @@ private: QString m_errorStr; }; -#endif // KEEPASSX_KEEPASS2XMLWRITER_H +#endif // KEEPASSX_KDBX3XMLWRITER_H diff --git a/src/format/KeePass2Reader.cpp b/src/format/KeePass2Reader.cpp index f42e7b9bb..a09f0adce 100644 --- a/src/format/KeePass2Reader.cpp +++ b/src/format/KeePass2Reader.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -15,198 +15,30 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include "KeePass2Reader.h" - -#include <QBuffer> +#include <QtGlobal> +#include <QString> #include <QFile> -#include <QIODevice> -#include "core/Database.h" #include "core/Endian.h" -#include "crypto/CryptoHash.h" -#include "crypto/kdf/AesKdf.h" +#include "keys/CompositeKey.h" +#include "format/KeePass2Reader.h" #include "format/KeePass1.h" #include "format/KeePass2.h" -#include "format/KeePass2RandomStream.h" -#include "format/KeePass2XmlReader.h" -#include "streams/HashedBlockStream.h" -#include "streams/QtIOCompressor" -#include "streams/StoreDataStream.h" -#include "streams/SymmetricCipherStream.h" +#include "format/Kdbx3Reader.h" -KeePass2Reader::KeePass2Reader() - : m_device(nullptr) - , m_headerStream(nullptr) - , m_error(false) - , m_headerEnd(false) - , m_saveXml(false) - , m_db(nullptr) - , m_irsAlgo(KeePass2::InvalidProtectedStreamAlgo) +BaseKeePass2Reader::BaseKeePass2Reader() : + m_error(false), + m_saveXml(false), + m_irsAlgo(KeePass2::InvalidProtectedStreamAlgo) { -} - -Database* KeePass2Reader::readDatabase(QIODevice* device, const CompositeKey& key, bool keepDatabase) -{ - QScopedPointer<Database> db(new Database()); - m_db = db.data(); - m_device = device; - m_error = false; m_errorStr.clear(); - m_headerEnd = false; m_xmlData.clear(); - m_masterSeed.clear(); - m_encryptionIV.clear(); - m_streamStartBytes.clear(); m_protectedStreamKey.clear(); - - StoreDataStream headerStream(m_device); - headerStream.open(QIODevice::ReadOnly); - m_headerStream = &headerStream; - - bool ok; - - quint32 signature1 = Endian::readUInt32(m_headerStream, KeePass2::BYTEORDER, &ok); - if (!ok || signature1 != KeePass2::SIGNATURE_1) { - raiseError(tr("Not a KeePass database.")); - return nullptr; - } - - quint32 signature2 = Endian::readUInt32(m_headerStream, KeePass2::BYTEORDER, &ok); - if (ok && signature2 == KeePass1::SIGNATURE_2) { - raiseError(tr("The selected file is an old KeePass 1 database (.kdb).\n\n" - "You can import it by clicking on Database > 'Import KeePass 1 database...'.\n" - "This is a one-way migration. You won't be able to open the imported " - "database with the old KeePassX 0.4 version.")); - return nullptr; - } - else if (!ok || signature2 != KeePass2::SIGNATURE_2) { - raiseError(tr("Not a KeePass database.")); - return nullptr; - } - - quint32 version = Endian::readUInt32(m_headerStream, KeePass2::BYTEORDER, &ok) - & KeePass2::FILE_VERSION_CRITICAL_MASK; - quint32 maxVersion = KeePass2::FILE_VERSION & KeePass2::FILE_VERSION_CRITICAL_MASK; - if (!ok || (version < KeePass2::FILE_VERSION_MIN) || (version > maxVersion)) { - raiseError(tr("Unsupported KeePass database version.")); - return nullptr; - } - - while (readHeaderField() && !hasError()) { - } - - headerStream.close(); - - if (hasError()) { - return nullptr; - } - - // check if all required headers were present - if (m_masterSeed.isEmpty() || m_encryptionIV.isEmpty() - || m_streamStartBytes.isEmpty() || m_protectedStreamKey.isEmpty() - || m_db->cipher().isNull()) { - raiseError("missing database headers"); - return nullptr; - } - - if (!m_db->setKey(key, false)) { - raiseError(tr("Unable to calculate master key")); - return nullptr; - } - - if (m_db->challengeMasterSeed(m_masterSeed) == false) { - raiseError(tr("Unable to issue challenge-response.")); - return nullptr; - } - - CryptoHash hash(CryptoHash::Sha256); - hash.addData(m_masterSeed); - hash.addData(m_db->challengeResponseKey()); - hash.addData(m_db->transformedMasterKey()); - QByteArray finalKey = hash.result(); - - SymmetricCipherStream cipherStream(m_device, SymmetricCipher::cipherToAlgorithm(m_db->cipher()), - SymmetricCipher::Cbc, SymmetricCipher::Decrypt); - if (!cipherStream.init(finalKey, m_encryptionIV)) { - raiseError(cipherStream.errorString()); - return nullptr; - } - if (!cipherStream.open(QIODevice::ReadOnly)) { - raiseError(cipherStream.errorString()); - return nullptr; - } - - QByteArray realStart = cipherStream.read(32); - - if (realStart != m_streamStartBytes) { - raiseError(tr("Wrong key or database file is corrupt.")); - return nullptr; - } - - HashedBlockStream hashedStream(&cipherStream); - if (!hashedStream.open(QIODevice::ReadOnly)) { - raiseError(hashedStream.errorString()); - return nullptr; - } - - QIODevice* xmlDevice; - QScopedPointer<QtIOCompressor> ioCompressor; - - if (m_db->compressionAlgo() == Database::CompressionNone) { - xmlDevice = &hashedStream; - } - else { - ioCompressor.reset(new QtIOCompressor(&hashedStream)); - ioCompressor->setStreamFormat(QtIOCompressor::GzipFormat); - if (!ioCompressor->open(QIODevice::ReadOnly)) { - raiseError(ioCompressor->errorString()); - return nullptr; - } - xmlDevice = ioCompressor.data(); - } - - KeePass2RandomStream randomStream(m_irsAlgo); - if (!randomStream.init(m_protectedStreamKey)) { - raiseError(randomStream.errorString()); - return nullptr; - } - - QScopedPointer<QBuffer> buffer; - - if (m_saveXml) { - m_xmlData = xmlDevice->readAll(); - buffer.reset(new QBuffer(&m_xmlData)); - buffer->open(QIODevice::ReadOnly); - xmlDevice = buffer.data(); - } - - KeePass2XmlReader xmlReader; - xmlReader.readDatabase(xmlDevice, m_db, &randomStream); - - if (xmlReader.hasError()) { - raiseError(xmlReader.errorString()); - if (keepDatabase) { - return db.take(); - } - else { - return nullptr; - } - } - - Q_ASSERT(version < 0x00030001 || !xmlReader.headerHash().isEmpty()); - - if (!xmlReader.headerHash().isEmpty()) { - QByteArray headerHash = CryptoHash::hash(headerStream.storedData(), CryptoHash::Sha256); - if (headerHash != xmlReader.headerHash()) { - raiseError("Header doesn't match hash"); - return nullptr; - } - } - - return db.take(); } -Database* KeePass2Reader::readDatabase(const QString& filename, const CompositeKey& key) +BaseKeePass2Reader::~BaseKeePass2Reader() {} + +Database* BaseKeePass2Reader::readDatabase(const QString& filename, const CompositeKey& key) { QFile file(filename); if (!file.open(QFile::ReadOnly)) { @@ -224,238 +56,113 @@ Database* KeePass2Reader::readDatabase(const QString& filename, const CompositeK return db.take(); } -bool KeePass2Reader::hasError() +bool BaseKeePass2Reader::hasError() { return m_error; } -QString KeePass2Reader::errorString() +QString BaseKeePass2Reader::errorString() { return m_errorStr; } -void KeePass2Reader::setSaveXml(bool save) +void BaseKeePass2Reader::setSaveXml(bool save) { m_saveXml = save; } -QByteArray KeePass2Reader::xmlData() +QByteArray BaseKeePass2Reader::xmlData() { return m_xmlData; } -QByteArray KeePass2Reader::streamKey() +QByteArray BaseKeePass2Reader::streamKey() { return m_protectedStreamKey; } -void KeePass2Reader::raiseError(const QString& errorMessage) +KeePass2::ProtectedStreamAlgo BaseKeePass2Reader::protectedStreamAlgo() const { + return m_irsAlgo; +} + + +void BaseKeePass2Reader::raiseError(const QString& errorMessage) { m_error = true; m_errorStr = errorMessage; } -bool KeePass2Reader::readHeaderField() +Database* KeePass2Reader::readDatabase(QIODevice* device, const CompositeKey& key, bool keepDatabase) { - QByteArray fieldIDArray = m_headerStream->read(1); - if (fieldIDArray.size() != 1) { - raiseError("Invalid header id size"); - return false; - } - quint8 fieldID = fieldIDArray.at(0); + m_error = false; + m_errorStr.clear(); bool ok; - quint16 fieldLen = Endian::readUInt16(m_headerStream, KeePass2::BYTEORDER, &ok); - if (!ok) { - raiseError("Invalid header field length"); - return false; + + quint32 signature1 = Endian::readUInt32(device, KeePass2::BYTEORDER, &ok); + if (!ok || signature1 != KeePass2::SIGNATURE_1) { + raiseError(tr("Not a KeePass database.")); + return nullptr; } - QByteArray fieldData; - if (fieldLen != 0) { - fieldData = m_headerStream->read(fieldLen); - if (fieldData.size() != fieldLen) { - raiseError("Invalid header data length"); - return false; - } + quint32 signature2 = Endian::readUInt32(device, KeePass2::BYTEORDER, &ok); + if (ok && signature2 == KeePass1::SIGNATURE_2) { + raiseError(tr("The selected file is an old KeePass 1 database (.kdb).\n\n" + "You can import it by clicking on Database > 'Import KeePass 1 database...'.\n" + "This is a one-way migration. You won't be able to open the imported " + "database with the old KeePassX 0.4 version.")); + return nullptr; + } + else if (!ok || signature2 != KeePass2::SIGNATURE_2) { + raiseError(tr("Not a KeePass database.")); + return nullptr; } - switch (fieldID) { - case KeePass2::EndOfHeader: - m_headerEnd = true; - break; - - case KeePass2::CipherID: - setCipher(fieldData); - break; - - case KeePass2::CompressionFlags: - setCompressionFlags(fieldData); - break; - - case KeePass2::MasterSeed: - setMasterSeed(fieldData); - break; - - case KeePass2::TransformSeed: - setTransformSeed(fieldData); - break; - - case KeePass2::TransformRounds: - setTransformRounds(fieldData); - break; - - case KeePass2::EncryptionIV: - setEncryptionIV(fieldData); - break; - - case KeePass2::ProtectedStreamKey: - setProtectedStreamKey(fieldData); - break; - - case KeePass2::StreamStartBytes: - setStreamStartBytes(fieldData); - break; - - case KeePass2::InnerRandomStreamID: - setInnerRandomStreamID(fieldData); - break; - - default: - qWarning("Unknown header field read: id=%d", fieldID); - break; + m_version = Endian::readUInt32(device, KeePass2::BYTEORDER, &ok) + & KeePass2::FILE_VERSION_CRITICAL_MASK; + quint32 maxVersion = KeePass2::FILE_VERSION & KeePass2::FILE_VERSION_CRITICAL_MASK; + if (!ok || (m_version < KeePass2::FILE_VERSION_MIN) || (m_version > maxVersion)) { + raiseError(tr("Unsupported KeePass 2 database version.")); + return nullptr; } - return !m_headerEnd; + device->seek(0); + m_reader.reset(static_cast<BaseKeePass2Reader*>(new Kdbx3Reader())); + m_reader->setSaveXml(m_saveXml); + return m_reader->readDatabase(device, key, keepDatabase); } -void KeePass2Reader::setCipher(const QByteArray& data) +bool KeePass2Reader::hasError() { - if (data.size() != Uuid::Length) { - raiseError("Invalid cipher uuid length"); - } - else { - Uuid uuid(data); - - if (uuid != KeePass2::CIPHER_AES && uuid != KeePass2::CIPHER_TWOFISH) { - raiseError("Unsupported cipher"); - } - else { - m_db->setCipher(uuid); - } - } + return m_error || (m_reader && m_reader->hasError()); } -void KeePass2Reader::setCompressionFlags(const QByteArray& data) +QString KeePass2Reader::errorString() { - if (data.size() != 4) { - raiseError("Invalid compression flags length"); - } - else { - quint32 id = Endian::bytesToUInt32(data, KeePass2::BYTEORDER); - - if (id > Database::CompressionAlgorithmMax) { - raiseError("Unsupported compression algorithm"); - } - else { - m_db->setCompressionAlgo(static_cast<Database::CompressionAlgorithm>(id)); - } - } + return m_reader ? m_reader->errorString() : m_errorStr; } -void KeePass2Reader::setMasterSeed(const QByteArray& data) +QByteArray KeePass2Reader::xmlData() { - if (data.size() != 32) { - raiseError("Invalid master seed size"); - } - else { - m_masterSeed = data; - } + return m_reader ? m_reader->xmlData() : m_xmlData; } -void KeePass2Reader::setTransformSeed(const QByteArray& data) +QByteArray KeePass2Reader::streamKey() { - if (data.size() != 32) { - raiseError("Invalid transform seed size"); - } - else { - AesKdf* aesKdf; - if (m_db->kdf()->type() == Kdf::Type::AES) { - aesKdf = static_cast<AesKdf*>(m_db->kdf()); - } else { - aesKdf = new AesKdf(); - m_db->setKdf(aesKdf); - } - - aesKdf->setSeed(data); - } -} - -void KeePass2Reader::setTransformRounds(const QByteArray& data) -{ - if (data.size() != 8) { - raiseError("Invalid transform rounds size"); - } - else { - quint64 rounds = Endian::bytesToUInt64(data, KeePass2::BYTEORDER); - - AesKdf* aesKdf; - if (m_db->kdf()->type() == Kdf::Type::AES) { - aesKdf = static_cast<AesKdf*>(m_db->kdf()); - } else { - aesKdf = new AesKdf(); - m_db->setKdf(aesKdf); - } - - aesKdf->setRounds(rounds); - } -} - -void KeePass2Reader::setEncryptionIV(const QByteArray& data) -{ - if (data.size() != 16) { - raiseError("Invalid encryption iv size"); - } - else { - m_encryptionIV = data; - } -} - -void KeePass2Reader::setProtectedStreamKey(const QByteArray& data) -{ - if (data.size() != 32) { - raiseError("Invalid stream key size"); - } - else { - m_protectedStreamKey = data; - } -} - -void KeePass2Reader::setStreamStartBytes(const QByteArray& data) -{ - if (data.size() != 32) { - raiseError("Invalid start bytes size"); - } - else { - m_streamStartBytes = data; - } -} - -void KeePass2Reader::setInnerRandomStreamID(const QByteArray& data) -{ - if (data.size() != 4) { - raiseError("Invalid random stream id size"); - } - else { - quint32 id = Endian::bytesToUInt32(data, KeePass2::BYTEORDER); - m_irsAlgo = KeePass2::idToProtectedStreamAlgo(id); - if (m_irsAlgo == KeePass2::ArcFourVariant || m_irsAlgo == KeePass2::InvalidProtectedStreamAlgo) { - raiseError("Unsupported random stream algorithm"); - } - } + return m_reader ? m_reader->streamKey() : m_protectedStreamKey; } KeePass2::ProtectedStreamAlgo KeePass2Reader::protectedStreamAlgo() const { - return m_irsAlgo; + return m_reader ? m_reader->protectedStreamAlgo() : m_irsAlgo; +} + +quint32 KeePass2Reader::version() const +{ + return m_version; +} + +BaseKeePass2Reader* KeePass2Reader::reader() const +{ + return m_reader.data(); } diff --git a/src/format/KeePass2Reader.h b/src/format/KeePass2Reader.h index e9a947284..21c317023 100644 --- a/src/format/KeePass2Reader.h +++ b/src/format/KeePass2Reader.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,58 +18,65 @@ #ifndef KEEPASSX_KEEPASS2READER_H #define KEEPASSX_KEEPASS2READER_H +#include <QtGlobal> +#include <QByteArray> +#include <QString> #include <QCoreApplication> +#include <QScopedPointer> +#include <QIODevice> -#include "keys/CompositeKey.h" #include "format/KeePass2.h" +#include "core/Database.h" +#include "keys/CompositeKey.h" -class Database; -class QIODevice; - -class KeePass2Reader +class BaseKeePass2Reader { - Q_DECLARE_TR_FUNCTIONS(KeePass2Reader) - public: - KeePass2Reader(); - Database* readDatabase(QIODevice* device, const CompositeKey& key, bool keepDatabase = false); - Database* readDatabase(const QString& filename, const CompositeKey& key); - bool hasError(); - QString errorString(); - void setSaveXml(bool save); - QByteArray xmlData(); - QByteArray streamKey(); - KeePass2::ProtectedStreamAlgo protectedStreamAlgo() const; + BaseKeePass2Reader(); -private: + virtual Database* readDatabase(QIODevice* device, const CompositeKey& key, bool keepDatabase = false) = 0; + virtual Database* readDatabase(const QString& filename, const CompositeKey& key); + + virtual bool hasError(); + virtual QString errorString(); + virtual void setSaveXml(bool save); + virtual QByteArray xmlData(); + virtual QByteArray streamKey(); + virtual KeePass2::ProtectedStreamAlgo protectedStreamAlgo() const; + + virtual ~BaseKeePass2Reader(); + +protected: void raiseError(const QString& errorMessage); - bool readHeaderField(); - - void setCipher(const QByteArray& data); - void setCompressionFlags(const QByteArray& data); - void setMasterSeed(const QByteArray& data); - void setTransformSeed(const QByteArray& data); - void setTransformRounds(const QByteArray& data); - void setEncryptionIV(const QByteArray& data); - void setProtectedStreamKey(const QByteArray& data); - void setStreamStartBytes(const QByteArray& data); - void setInnerRandomStreamID(const QByteArray& data); - - QIODevice* m_device; - QIODevice* m_headerStream; bool m_error; QString m_errorStr; - bool m_headerEnd; + bool m_saveXml; QByteArray m_xmlData; - - Database* m_db; - QByteArray m_masterSeed; - QByteArray m_encryptionIV; - QByteArray m_streamStartBytes; QByteArray m_protectedStreamKey; KeePass2::ProtectedStreamAlgo m_irsAlgo; }; +class KeePass2Reader : public BaseKeePass2Reader +{ + Q_DECLARE_TR_FUNCTIONS(KeePass2Reader) + +public: + virtual Database* readDatabase(QIODevice* device, const CompositeKey& key, bool keepDatabase = false) override; + using BaseKeePass2Reader::readDatabase; + + virtual bool hasError() override; + virtual QString errorString() override; + virtual QByteArray xmlData() override; + virtual QByteArray streamKey() override; + virtual KeePass2::ProtectedStreamAlgo protectedStreamAlgo() const override; + + quint32 version() const; + BaseKeePass2Reader* reader() const; +private: + QScopedPointer<BaseKeePass2Reader> m_reader; + quint32 m_version; +}; + #endif // KEEPASSX_KEEPASS2READER_H diff --git a/src/format/KeePass2Repair.cpp b/src/format/KeePass2Repair.cpp index 5f2732e2a..0e79fa8ba 100644 --- a/src/format/KeePass2Repair.cpp +++ b/src/format/KeePass2Repair.cpp @@ -22,9 +22,10 @@ #include <QScopedPointer> #include <QRegExp> +#include "format/KeePass2.h" #include "format/KeePass2RandomStream.h" #include "format/KeePass2Reader.h" -#include "format/KeePass2XmlReader.h" +#include "format/Kdbx3XmlReader.h" KeePass2Repair::RepairOutcome KeePass2Repair::repairDatabase(QIODevice* device, const CompositeKey& key) { @@ -73,7 +74,7 @@ KeePass2Repair::RepairOutcome KeePass2Repair::repairDatabase(QIODevice* device, KeePass2RandomStream randomStream(reader.protectedStreamAlgo()); randomStream.init(reader.streamKey()); - KeePass2XmlReader xmlReader; + Kdbx3XmlReader xmlReader; QBuffer buffer(&xmlData); buffer.open(QIODevice::ReadOnly); xmlReader.readDatabase(&buffer, db.data(), &randomStream); diff --git a/src/format/KeePass2Writer.cpp b/src/format/KeePass2Writer.cpp index 6dc89c36d..00392dc05 100644 --- a/src/format/KeePass2Writer.cpp +++ b/src/format/KeePass2Writer.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -15,197 +15,58 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include "KeePass2Writer.h" - -#include <QBuffer> -#include <QFile> #include <QIODevice> +#include <QString> +#include <QFile> +#include "format/KeePass2Writer.h" #include "core/Database.h" -#include "core/Endian.h" -#include "crypto/CryptoHash.h" -#include "crypto/kdf/AesKdf.h" -#include "crypto/Random.h" -#include "format/KeePass2RandomStream.h" -#include "format/KeePass2XmlWriter.h" -#include "streams/HashedBlockStream.h" -#include "streams/QtIOCompressor" -#include "streams/SymmetricCipherStream.h" +#include "format/Kdbx3Writer.h" -#define CHECK_RETURN(x) if (!(x)) return; -#define CHECK_RETURN_FALSE(x) if (!(x)) return false; - -KeePass2Writer::KeePass2Writer() - : m_device(0) - , m_error(false) +BaseKeePass2Writer::BaseKeePass2Writer() : m_error(false) { -} - -void KeePass2Writer::writeDatabase(QIODevice* device, Database* db) -{ - m_error = false; m_errorStr.clear(); - - QByteArray masterSeed = randomGen()->randomArray(32); - QByteArray encryptionIV = randomGen()->randomArray(16); - QByteArray protectedStreamKey = randomGen()->randomArray(32); - QByteArray startBytes = randomGen()->randomArray(32); - QByteArray endOfHeader = "\r\n\r\n"; - - if (db->challengeMasterSeed(masterSeed) == false) { - raiseError(tr("Unable to issue challenge-response.")); - return; - } - - if (!db->setKey(db->key(), false, true)) { - raiseError(tr("Unable to calculate master key")); - return; - } - - CryptoHash hash(CryptoHash::Sha256); - hash.addData(masterSeed); - hash.addData(db->challengeResponseKey()); - Q_ASSERT(!db->transformedMasterKey().isEmpty()); - hash.addData(db->transformedMasterKey()); - QByteArray finalKey = hash.result(); - - QBuffer header; - header.open(QIODevice::WriteOnly); - m_device = &header; - - CHECK_RETURN(writeData(Endian::int32ToBytes(KeePass2::SIGNATURE_1, KeePass2::BYTEORDER))); - CHECK_RETURN(writeData(Endian::int32ToBytes(KeePass2::SIGNATURE_2, KeePass2::BYTEORDER))); - CHECK_RETURN(writeData(Endian::int32ToBytes(KeePass2::FILE_VERSION, KeePass2::BYTEORDER))); - - CHECK_RETURN(writeHeaderField(KeePass2::CipherID, db->cipher().toByteArray())); - CHECK_RETURN(writeHeaderField(KeePass2::CompressionFlags, - Endian::int32ToBytes(db->compressionAlgo(), - KeePass2::BYTEORDER))); - AesKdf* kdf = static_cast<AesKdf*>(db->kdf()); - CHECK_RETURN(writeHeaderField(KeePass2::MasterSeed, masterSeed)); - CHECK_RETURN(writeHeaderField(KeePass2::TransformSeed, kdf->seed())); - CHECK_RETURN(writeHeaderField(KeePass2::TransformRounds, - Endian::int64ToBytes(kdf->rounds(), - KeePass2::BYTEORDER))); - CHECK_RETURN(writeHeaderField(KeePass2::EncryptionIV, encryptionIV)); - CHECK_RETURN(writeHeaderField(KeePass2::ProtectedStreamKey, protectedStreamKey)); - CHECK_RETURN(writeHeaderField(KeePass2::StreamStartBytes, startBytes)); - CHECK_RETURN(writeHeaderField(KeePass2::InnerRandomStreamID, - Endian::int32ToBytes(KeePass2::Salsa20, - KeePass2::BYTEORDER))); - CHECK_RETURN(writeHeaderField(KeePass2::EndOfHeader, endOfHeader)); - - header.close(); - m_device = device; - QByteArray headerHash = CryptoHash::hash(header.data(), CryptoHash::Sha256); - CHECK_RETURN(writeData(header.data())); - - SymmetricCipherStream cipherStream(device, SymmetricCipher::cipherToAlgorithm(db->cipher()), - SymmetricCipher::Cbc, SymmetricCipher::Encrypt); - cipherStream.init(finalKey, encryptionIV); - if (!cipherStream.open(QIODevice::WriteOnly)) { - raiseError(cipherStream.errorString()); - return; - } - m_device = &cipherStream; - CHECK_RETURN(writeData(startBytes)); - - HashedBlockStream hashedStream(&cipherStream); - if (!hashedStream.open(QIODevice::WriteOnly)) { - raiseError(hashedStream.errorString()); - return; - } - - QScopedPointer<QtIOCompressor> ioCompressor; - - if (db->compressionAlgo() == Database::CompressionNone) { - m_device = &hashedStream; - } - else { - ioCompressor.reset(new QtIOCompressor(&hashedStream)); - ioCompressor->setStreamFormat(QtIOCompressor::GzipFormat); - if (!ioCompressor->open(QIODevice::WriteOnly)) { - raiseError(ioCompressor->errorString()); - return; - } - m_device = ioCompressor.data(); - } - - KeePass2RandomStream randomStream(KeePass2::Salsa20); - if (!randomStream.init(protectedStreamKey)) { - raiseError(randomStream.errorString()); - return; - } - - KeePass2XmlWriter xmlWriter; - xmlWriter.writeDatabase(m_device, db, &randomStream, headerHash); - - // Explicitly close/reset streams so they are flushed and we can detect - // errors. QIODevice::close() resets errorString() etc. - if (ioCompressor) { - ioCompressor->close(); - } - if (!hashedStream.reset()) { - raiseError(hashedStream.errorString()); - return; - } - if (!cipherStream.reset()) { - raiseError(cipherStream.errorString()); - return; - } - - if (xmlWriter.hasError()) { - raiseError(xmlWriter.errorString()); - } } -bool KeePass2Writer::writeData(const QByteArray& data) -{ - if (m_device->write(data) != data.size()) { - raiseError(m_device->errorString()); - return false; - } - else { - return true; - } -} +BaseKeePass2Writer::~BaseKeePass2Writer() {} -bool KeePass2Writer::writeHeaderField(KeePass2::HeaderFieldID fieldId, const QByteArray& data) -{ - Q_ASSERT(data.size() <= 65535); - - QByteArray fieldIdArr; - fieldIdArr[0] = fieldId; - CHECK_RETURN_FALSE(writeData(fieldIdArr)); - CHECK_RETURN_FALSE(writeData(Endian::int16ToBytes(static_cast<quint16>(data.size()), - KeePass2::BYTEORDER))); - CHECK_RETURN_FALSE(writeData(data)); - - return true; -} - -void KeePass2Writer::writeDatabase(const QString& filename, Database* db) -{ - QFile file(filename); - if (!file.open(QIODevice::WriteOnly|QIODevice::Truncate)) { - raiseError(file.errorString()); - return; - } - writeDatabase(&file, db); -} - -bool KeePass2Writer::hasError() +bool BaseKeePass2Writer::hasError() { return m_error; } -QString KeePass2Writer::errorString() +QString BaseKeePass2Writer::errorString() { return m_errorStr; } -void KeePass2Writer::raiseError(const QString& errorMessage) +void BaseKeePass2Writer::raiseError(const QString& errorMessage) { m_error = true; m_errorStr = errorMessage; } + +bool BaseKeePass2Writer::writeDatabase(const QString& filename, Database* db) +{ + QFile file(filename); + if (!file.open(QIODevice::WriteOnly|QIODevice::Truncate)) { + raiseError(file.errorString()); + return false; + } + return writeDatabase(&file, db); +} + +bool KeePass2Writer::hasError() +{ + return m_error || (m_writer && m_writer->hasError()); +} + +QString KeePass2Writer::errorString() +{ + return m_writer ? m_writer->errorString() : m_errorStr; +} + +bool KeePass2Writer::writeDatabase(QIODevice* device, Database* db) { + m_writer.reset(static_cast<BaseKeePass2Writer*>(new Kdbx3Writer())); + return m_writer->writeDatabase(device, db); +} diff --git a/src/format/KeePass2Writer.h b/src/format/KeePass2Writer.h index 184aa1a71..85802eb44 100644 --- a/src/format/KeePass2Writer.h +++ b/src/format/KeePass2Writer.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,33 +18,48 @@ #ifndef KEEPASSX_KEEPASS2WRITER_H #define KEEPASSX_KEEPASS2WRITER_H +#include <QIODevice> +#include <QByteArray> +#include <QString> #include <QCoreApplication> +#include <QScopedPointer> +#include "core/Database.h" #include "format/KeePass2.h" -#include "keys/CompositeKey.h" -class Database; -class QIODevice; - -class KeePass2Writer +class BaseKeePass2Writer { - Q_DECLARE_TR_FUNCTIONS(KeePass2Writer) - public: - KeePass2Writer(); - void writeDatabase(QIODevice* device, Database* db); - void writeDatabase(const QString& filename, Database* db); - bool hasError(); - QString errorString(); + BaseKeePass2Writer(); -private: - bool writeData(const QByteArray& data); - bool writeHeaderField(KeePass2::HeaderFieldID fieldId, const QByteArray& data); + virtual bool writeDatabase(QIODevice* device, Database* db) = 0; + virtual bool writeDatabase(const QString& filename, Database* db); + + virtual bool hasError(); + virtual QString errorString(); + + virtual ~BaseKeePass2Writer(); + +protected: void raiseError(const QString& errorMessage); - QIODevice* m_device; bool m_error; QString m_errorStr; }; -#endif // KEEPASSX_KEEPASS2WRITER_H +class KeePass2Writer : public BaseKeePass2Writer +{ + Q_DECLARE_TR_FUNCTIONS(KeePass2Writer) + +public: + virtual bool writeDatabase(QIODevice* device, Database* db) override; + using BaseKeePass2Writer::writeDatabase; + + virtual bool hasError() override; + virtual QString errorString() override; + +private: + QScopedPointer<BaseKeePass2Writer> m_writer; +}; + +#endif // KEEPASSX_KEEPASS2READER_H diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index c36eefd4a..bdf0e6f86 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -107,7 +107,7 @@ endif() add_unit_test(NAME testgroup SOURCES TestGroup.cpp LIBS ${TEST_LIBRARIES}) -add_unit_test(NAME testkeepass2xmlreader SOURCES TestKeePass2XmlReader.cpp +add_unit_test(NAME testkdbx3xmlreader SOURCES TestKeePass2XmlReader.cpp TestKdbx3XmlReader.cpp LIBS ${TEST_LIBRARIES}) add_unit_test(NAME testkeys SOURCES TestKeys.cpp diff --git a/tests/TestDeletedObjects.cpp b/tests/TestDeletedObjects.cpp index 5af017885..371d318db 100644 --- a/tests/TestDeletedObjects.cpp +++ b/tests/TestDeletedObjects.cpp @@ -22,7 +22,7 @@ #include "core/Database.h" #include "core/Group.h" #include "crypto/Crypto.h" -#include "format/KeePass2XmlReader.h" +#include "format/Kdbx3XmlReader.h" #include "config-keepassx-tests.h" QTEST_GUILESS_MAIN(TestDeletedObjects) @@ -88,7 +88,7 @@ void TestDeletedObjects::createAndDelete(Database* db, int delObjectsSize) void TestDeletedObjects::testDeletedObjectsFromFile() { - KeePass2XmlReader reader; + Kdbx3XmlReader reader; reader.setStrictMode(true); QString xmlFile = QString(KEEPASSX_TEST_DATA_DIR).append("/NewDatabase.xml"); Database* db = reader.readDatabase(xmlFile); diff --git a/tests/TestKdbx3XmlReader.cpp b/tests/TestKdbx3XmlReader.cpp new file mode 100644 index 000000000..d4ce58542 --- /dev/null +++ b/tests/TestKdbx3XmlReader.cpp @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <QTest> + +#include "TestKeePass2XmlReader.h" + +QTEST_GUILESS_MAIN(TestKdbx3XmlReader) diff --git a/tests/TestKeePass2Writer.cpp b/tests/TestKeePass2Writer.cpp index f6d3f58ad..049c3e66e 100644 --- a/tests/TestKeePass2Writer.cpp +++ b/tests/TestKeePass2Writer.cpp @@ -30,7 +30,6 @@ #include "format/KeePass2Reader.h" #include "format/KeePass2Repair.h" #include "format/KeePass2Writer.h" -#include "format/KeePass2XmlWriter.h" #include "keys/PasswordKey.h" QTEST_GUILESS_MAIN(TestKeePass2Writer) diff --git a/tests/TestKeePass2XmlReader.cpp b/tests/TestKeePass2XmlReader.cpp index 495b39acf..c1e3b4b63 100644 --- a/tests/TestKeePass2XmlReader.cpp +++ b/tests/TestKeePass2XmlReader.cpp @@ -25,12 +25,10 @@ #include "core/Group.h" #include "core/Metadata.h" #include "crypto/Crypto.h" -#include "format/KeePass2XmlReader.h" -#include "format/KeePass2XmlWriter.h" +#include "format/Kdbx3XmlReader.h" +#include "format/Kdbx3XmlWriter.h" #include "config-keepassx-tests.h" -QTEST_GUILESS_MAIN(TestKeePass2XmlReader) - namespace QTest { template<> char* toString(const Uuid& uuid) @@ -79,11 +77,11 @@ QByteArray TestKeePass2XmlReader::strToBytes(const QString& str) return result; } -void TestKeePass2XmlReader::initTestCase() +void TestKdbx3XmlReader::initTestCase() { QVERIFY(Crypto::init()); - KeePass2XmlReader reader; + Kdbx3XmlReader reader; reader.setStrictMode(true); QString xmlFile = QString(KEEPASSX_TEST_DATA_DIR).append("/NewDatabase.xml"); m_db = reader.readDatabase(xmlFile); @@ -91,6 +89,32 @@ void TestKeePass2XmlReader::initTestCase() QVERIFY(!reader.hasError()); } +void TestKdbx3XmlReader::readDatabase(QString path, bool strictMode, Database*& db, bool& hasError, QString& errorString) +{ + Kdbx3XmlReader reader; + reader.setStrictMode(strictMode); + db = reader.readDatabase(path); + hasError = reader.hasError(); + errorString = reader.errorString(); +} + +void TestKdbx3XmlReader::readDatabase(QBuffer* buf, bool strictMode, Database*& db, bool& hasError, QString& errorString) +{ + Kdbx3XmlReader reader; + reader.setStrictMode(strictMode); + db = reader.readDatabase(buf); + hasError = reader.hasError(); + errorString = reader.errorString(); +} + +void TestKdbx3XmlReader::writeDatabase(QBuffer* buf, Database* db, bool& hasError, QString& errorString) +{ + Kdbx3XmlWriter writer; + writer.writeDatabase(buf, db); + hasError = writer.hasError(); + errorString = writer.errorString(); +} + void TestKeePass2XmlReader::testMetadata() { QCOMPARE(m_db->metadata()->generator(), QString("KeePass")); @@ -374,15 +398,20 @@ void TestKeePass2XmlReader::testBroken() QFETCH(bool, strictMode); QFETCH(bool, expectError); - KeePass2XmlReader reader; - reader.setStrictMode(strictMode); + QString xmlFile = QString("%1/%2.xml").arg(KEEPASSX_TEST_DATA_DIR, baseName); QVERIFY(QFile::exists(xmlFile)); - QScopedPointer<Database> db(reader.readDatabase(xmlFile)); - if (reader.hasError()) { - qWarning("Reader error: %s", qPrintable(reader.errorString())); + bool hasError; + QString errorString; + Database* db; + readDatabase(xmlFile, strictMode, db, hasError, errorString); + if (hasError) { + qWarning("Reader error: %s", qPrintable(errorString)); + } + QCOMPARE(hasError, expectError); + if (db) { + delete db; } - QCOMPARE(reader.hasError(), expectError); } void TestKeePass2XmlReader::testBroken_data() @@ -412,15 +441,20 @@ void TestKeePass2XmlReader::testBroken_data() void TestKeePass2XmlReader::testEmptyUuids() { - KeePass2XmlReader reader; - reader.setStrictMode(true); + QString xmlFile = QString("%1/%2.xml").arg(KEEPASSX_TEST_DATA_DIR, "EmptyUuids"); QVERIFY(QFile::exists(xmlFile)); - QScopedPointer<Database> db(reader.readDatabase(xmlFile)); - if (reader.hasError()) { - qWarning("Reader error: %s", qPrintable(reader.errorString())); + Database* dbp; + bool hasError; + QString errorString; + readDatabase(xmlFile, true, dbp, hasError, errorString); + if (hasError) { + qWarning("Reader error: %s", qPrintable(errorString)); + } + QVERIFY(!hasError); + if (dbp) { + delete dbp; } - QVERIFY(!reader.hasError()); } void TestKeePass2XmlReader::testInvalidXmlChars() @@ -459,19 +493,19 @@ void TestKeePass2XmlReader::testInvalidXmlChars() QBuffer buffer; buffer.open(QIODevice::ReadWrite); - KeePass2XmlWriter writer; - writer.writeDatabase(&buffer, dbWrite.data()); - QVERIFY(!writer.hasError()); + bool hasError; + QString errorString; + writeDatabase(&buffer, dbWrite.data(), hasError, errorString); + QVERIFY(!hasError); buffer.seek(0); - KeePass2XmlReader reader; - reader.setStrictMode(true); - QScopedPointer<Database> dbRead(reader.readDatabase(&buffer)); - if (reader.hasError()) { - qWarning("Database read error: %s", qPrintable(reader.errorString())); + Database* dbRead; + readDatabase(&buffer, true, dbRead, hasError, errorString); + if (hasError) { + qWarning("Database read error: %s", qPrintable(errorString)); } - QVERIFY(!reader.hasError()); - QVERIFY(!dbRead.isNull()); + QVERIFY(!hasError); + QVERIFY(dbRead); QCOMPARE(dbRead->rootGroup()->entries().size(), 1); Entry* entryRead = dbRead->rootGroup()->entries().at(0); EntryAttributes* attrRead = entryRead->attributes(); @@ -486,22 +520,28 @@ void TestKeePass2XmlReader::testInvalidXmlChars() QCOMPARE(strToBytes(attrRead->value("LowLowSurrogate")), QByteArray()); QCOMPARE(strToBytes(attrRead->value("SurrogateValid1")), strToBytes(strSurrogateValid1)); QCOMPARE(strToBytes(attrRead->value("SurrogateValid2")), strToBytes(strSurrogateValid2)); + + if (dbRead) { + delete dbRead; + } } void TestKeePass2XmlReader::testRepairUuidHistoryItem() { - KeePass2XmlReader reader; QString xmlFile = QString("%1/%2.xml").arg(KEEPASSX_TEST_DATA_DIR, "BrokenDifferentEntryHistoryUuid"); QVERIFY(QFile::exists(xmlFile)); - QScopedPointer<Database> db(reader.readDatabase(xmlFile)); - if (reader.hasError()) { - qWarning("Database read error: %s", qPrintable(reader.errorString())); + Database* db; + bool hasError; + QString errorString; + readDatabase(xmlFile, true, db, hasError, errorString); + if (hasError) { + qWarning("Database read error: %s", qPrintable(errorString)); } - QVERIFY(!reader.hasError()); + QVERIFY(!hasError); - QList<Entry*> entries = db.data()->rootGroup()->entries(); + QList<Entry*> entries = db->rootGroup()->entries(); QCOMPARE(entries.size(), 1); Entry* entry = entries.at(0); @@ -512,6 +552,10 @@ void TestKeePass2XmlReader::testRepairUuidHistoryItem() QVERIFY(!entry->uuid().isNull()); QVERIFY(!historyItem->uuid().isNull()); QCOMPARE(historyItem->uuid(), entry->uuid()); + + if (db) { + delete db; + } } void TestKeePass2XmlReader::cleanupTestCase() diff --git a/tests/TestKeePass2XmlReader.h b/tests/TestKeePass2XmlReader.h index 628964b46..2ce122235 100644 --- a/tests/TestKeePass2XmlReader.h +++ b/tests/TestKeePass2XmlReader.h @@ -20,6 +20,7 @@ #include <QDateTime> #include <QObject> +#include <QBuffer> class Database; @@ -27,8 +28,8 @@ class TestKeePass2XmlReader : public QObject { Q_OBJECT -private slots: - void initTestCase(); +protected slots: + virtual void initTestCase() = 0; void testMetadata(); void testCustomIcons(); void testCustomData(); @@ -46,11 +47,27 @@ private slots: void testRepairUuidHistoryItem(); void cleanupTestCase(); -private: +protected: + virtual void readDatabase(QBuffer* buf, bool strictMode, Database*& db, bool& hasError, QString& errorString) = 0; + virtual void readDatabase(QString path, bool strictMode, Database*& db, bool& hasError, QString& errorString) = 0; + virtual void writeDatabase(QBuffer* buf, Database* db, bool& hasError, QString& errorString) = 0; static QDateTime genDT(int year, int month, int day, int hour, int min, int second); static QByteArray strToBytes(const QString& str); Database* m_db; }; +class TestKdbx3XmlReader : public TestKeePass2XmlReader +{ + Q_OBJECT + +private slots: + virtual void initTestCase() override; + +protected: + virtual void readDatabase(QBuffer* buf, bool strictMode, Database*& db, bool& hasError, QString& errorString) override; + virtual void readDatabase(QString path, bool strictMode, Database*& db, bool& hasError, QString& errorString) override; + virtual void writeDatabase(QBuffer* buf, Database* db, bool& hasError, QString& errorString) override; +}; + #endif // KEEPASSX_TESTKEEPASS2XMLREADER_H From d1a19a1009fe237406d35431c75b01362d5a7aee Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sat, 16 Dec 2017 17:32:39 +0100 Subject: [PATCH 225/402] Refactor Endian namespace --- src/CMakeLists.txt | 1 - src/core/Endian.cpp | 244 ------------------------------ src/core/Endian.h | 70 ++++++--- src/format/Kdbx3Reader.cpp | 14 +- src/format/Kdbx3Writer.cpp | 14 +- src/format/KeePass1Reader.cpp | 50 +++--- src/format/KeePass2Reader.cpp | 6 +- src/streams/HashedBlockStream.cpp | 8 +- src/streams/HmacBlockStream.cpp | 12 +- 9 files changed, 99 insertions(+), 320 deletions(-) delete mode 100644 src/core/Endian.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 35ea97817..5172ea0ba 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -42,7 +42,6 @@ set(keepassx_SOURCES core/CsvParser.cpp core/Database.cpp core/DatabaseIcons.cpp - core/Endian.cpp core/Entry.cpp core/EntryAttachments.cpp core/EntryAttributes.cpp diff --git a/src/core/Endian.cpp b/src/core/Endian.cpp deleted file mode 100644 index 3944bba2d..000000000 --- a/src/core/Endian.cpp +++ /dev/null @@ -1,244 +0,0 @@ -/* - * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 or (at your option) - * version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "Endian.h" - -#include <QtEndian> -#include <QIODevice> - -namespace Endian { - -qint16 bytesToInt16(const QByteArray& ba, QSysInfo::Endian byteOrder) -{ - Q_ASSERT(ba.size() == 2); - - if (byteOrder == QSysInfo::LittleEndian) { - return qFromLittleEndian<qint16>(reinterpret_cast<const uchar*>(ba.constData())); - } - else { - return qFromBigEndian<qint16>(reinterpret_cast<const uchar*>(ba.constData())); - } -} - -qint32 bytesToInt32(const QByteArray& ba, QSysInfo::Endian byteOrder) -{ - Q_ASSERT(ba.size() == 4); - - if (byteOrder == QSysInfo::LittleEndian) { - return qFromLittleEndian<qint32>(reinterpret_cast<const uchar*>(ba.constData())); - } - else { - return qFromBigEndian<qint32>(reinterpret_cast<const uchar*>(ba.constData())); - } -} - -qint64 bytesToInt64(const QByteArray& ba, QSysInfo::Endian byteOrder) -{ - Q_ASSERT(ba.size() == 8); - - if (byteOrder == QSysInfo::LittleEndian) { - return qFromLittleEndian<qint64>(reinterpret_cast<const uchar*>(ba.constData())); - } - else { - return qFromBigEndian<qint64>(reinterpret_cast<const uchar*>(ba.constData())); - } -} - -quint16 bytesToUInt16(const QByteArray& ba, QSysInfo::Endian byteOrder) -{ - return static_cast<quint16>(bytesToInt16(ba, byteOrder)); -} - -quint32 bytesToUInt32(const QByteArray& ba, QSysInfo::Endian byteOrder) -{ - return static_cast<quint32>(bytesToInt32(ba, byteOrder)); -} - -quint64 bytesToUInt64(const QByteArray& ba, QSysInfo::Endian byteOrder) -{ - return static_cast<quint64>(bytesToInt64(ba, byteOrder)); -} - -qint16 readInt16(QIODevice* device, QSysInfo::Endian byteOrder, bool* ok) -{ - QByteArray ba = device->read(2); - - if (ba.size() != 2) { - *ok = false; - return 0; - } - else { - *ok = true; - return bytesToInt16(ba, byteOrder); - } -} - -qint32 readInt32(QIODevice* device, QSysInfo::Endian byteOrder, bool* ok) -{ - QByteArray ba = device->read(4); - - if (ba.size() != 4) { - *ok = false; - return 0; - } - else { - *ok = true; - return bytesToInt32(ba, byteOrder); - } -} - -qint64 readInt64(QIODevice* device, QSysInfo::Endian byteOrder, bool* ok) -{ - QByteArray ba = device->read(8); - - if (ba.size() != 8) { - *ok = false; - return 0; - } - else { - *ok = true; - return bytesToInt64(ba, byteOrder); - } -} - -quint16 readUInt16(QIODevice* device, QSysInfo::Endian byteOrder, bool* ok) -{ - return static_cast<quint16>(readInt16(device, byteOrder, ok)); -} - -quint32 readUInt32(QIODevice* device, QSysInfo::Endian byteOrder, bool* ok) -{ - return static_cast<quint32>(readInt32(device, byteOrder, ok)); -} - -quint64 readUInt64(QIODevice* device, QSysInfo::Endian byteOrder, bool* ok) -{ - return static_cast<quint64>(readInt64(device, byteOrder, ok)); -} - -QByteArray int16ToBytes(qint16 num, QSysInfo::Endian byteOrder) -{ - QByteArray ba; - ba.resize(2); - - if (byteOrder == QSysInfo::LittleEndian) { - qToLittleEndian<qint16>(num, reinterpret_cast<uchar*>(ba.data())); - } - else { - qToBigEndian<qint16>(num, reinterpret_cast<uchar*>(ba.data())); - } - - return ba; -} - -QByteArray int32ToBytes(qint32 num, QSysInfo::Endian byteOrder) -{ - QByteArray ba; - ba.resize(4); - - if (byteOrder == QSysInfo::LittleEndian) { - qToLittleEndian<qint32>(num, reinterpret_cast<uchar*>(ba.data())); - } - else { - qToBigEndian<qint32>(num, reinterpret_cast<uchar*>(ba.data())); - } - - return ba; -} - -QByteArray int64ToBytes(qint64 num, QSysInfo::Endian byteOrder) -{ - QByteArray ba; - ba.resize(8); - - if (byteOrder == QSysInfo::LittleEndian) { - qToLittleEndian<qint64>(num, reinterpret_cast<uchar*>(ba.data())); - } - else { - qToBigEndian<qint64>(num, reinterpret_cast<uchar*>(ba.data())); - } - - return ba; -} - -QByteArray uint16ToBytes(quint16 num, QSysInfo::Endian byteOrder) -{ - QByteArray ba; - ba.resize(2); - - if (byteOrder == QSysInfo::LittleEndian) { - qToLittleEndian<quint16>(num, reinterpret_cast<uchar*>(ba.data())); - } - else { - qToBigEndian<quint16>(num, reinterpret_cast<uchar*>(ba.data())); - } - - return ba; -} - -QByteArray uint32ToBytes(quint32 num, QSysInfo::Endian byteOrder) -{ - QByteArray ba; - ba.resize(4); - - if (byteOrder == QSysInfo::LittleEndian) { - qToLittleEndian<quint32>(num, reinterpret_cast<uchar*>(ba.data())); - } - else { - qToBigEndian<quint32>(num, reinterpret_cast<uchar*>(ba.data())); - } - - return ba; -} - -QByteArray uint64ToBytes(quint64 num, QSysInfo::Endian byteOrder) -{ - QByteArray ba; - ba.resize(8); - - if (byteOrder == QSysInfo::LittleEndian) { - qToLittleEndian<quint64>(num, reinterpret_cast<uchar*>(ba.data())); - } - else { - qToBigEndian<quint64>(num, reinterpret_cast<uchar*>(ba.data())); - } - - return ba; -} - -bool writeInt16(qint16 num, QIODevice* device, QSysInfo::Endian byteOrder) -{ - QByteArray ba = int16ToBytes(num, byteOrder); - int bytesWritten = device->write(ba); - return (bytesWritten == ba.size()); -} - -bool writeInt32(qint32 num, QIODevice* device, QSysInfo::Endian byteOrder) -{ - QByteArray ba = int32ToBytes(num, byteOrder); - int bytesWritten = device->write(ba); - return (bytesWritten == ba.size()); -} - -bool writeInt64(qint64 num, QIODevice* device, QSysInfo::Endian byteOrder) -{ - QByteArray ba = int64ToBytes(num, byteOrder); - int bytesWritten = device->write(ba); - return (bytesWritten == ba.size()); -} - -} // namespace Endian diff --git a/src/core/Endian.h b/src/core/Endian.h index 0b969b3ed..cd01eb483 100644 --- a/src/core/Endian.h +++ b/src/core/Endian.h @@ -1,4 +1,5 @@ /* + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> * * This program is free software: you can redistribute it and/or modify @@ -20,35 +21,58 @@ #include <QByteArray> #include <QSysInfo> +#include <QtEndian> +#include <QIODevice> -class QIODevice; +namespace Endian +{ -namespace Endian { +template<typename SizedQInt> +SizedQInt bytesToSizedInt(const QByteArray& ba, QSysInfo::Endian byteOrder) +{ + Q_ASSERT(ba.size() == sizeof(SizedQInt)); - qint16 bytesToInt16(const QByteArray& ba, QSysInfo::Endian byteOrder); - quint16 bytesToUInt16(const QByteArray& ba, QSysInfo::Endian byteOrder); - qint32 bytesToInt32(const QByteArray& ba, QSysInfo::Endian byteOrder); - quint32 bytesToUInt32(const QByteArray& ba, QSysInfo::Endian byteOrder); - qint64 bytesToInt64(const QByteArray& ba, QSysInfo::Endian byteOrder); - quint64 bytesToUInt64(const QByteArray& ba, QSysInfo::Endian byteOrder); + if (byteOrder == QSysInfo::LittleEndian) { + return qFromLittleEndian<SizedQInt>(reinterpret_cast<const uchar*>(ba.constData())); + } + return qFromBigEndian<SizedQInt>(reinterpret_cast<const uchar*>(ba.constData())); +} - qint16 readInt16(QIODevice* device, QSysInfo::Endian byteOrder, bool* ok); - quint16 readUInt16(QIODevice* device, QSysInfo::Endian byteOrder, bool* ok); - qint32 readInt32(QIODevice* device, QSysInfo::Endian byteOrder, bool* ok); - quint32 readUInt32(QIODevice* device, QSysInfo::Endian byteOrder, bool* ok); - qint64 readInt64(QIODevice* device, QSysInfo::Endian byteOrder, bool* ok); - quint64 readUInt64(QIODevice* device, QSysInfo::Endian byteOrder, bool* ok); +template<typename SizedQInt> +SizedQInt readSizedInt(QIODevice* device, QSysInfo::Endian byteOrder, bool* ok) +{ + QByteArray ba = device->read(sizeof(SizedQInt)); - QByteArray int16ToBytes(qint16 num, QSysInfo::Endian byteOrder); - QByteArray int32ToBytes(qint32 num, QSysInfo::Endian byteOrder); - QByteArray int64ToBytes(qint64 num, QSysInfo::Endian byteOrder); - QByteArray uint16ToBytes(quint16 num, QSysInfo::Endian byteOrder); - QByteArray uint32ToBytes(quint32 num, QSysInfo::Endian byteOrder); - QByteArray uint64ToBytes(quint64 num, QSysInfo::Endian byteOrder); + if (ba.size() != sizeof(SizedQInt)) { + *ok = false; + return 0; + } + *ok = true; + return bytesToSizedInt<SizedQInt>(ba, byteOrder); +} - bool writeInt16(qint16 num, QIODevice* device, QSysInfo::Endian byteOrder); - bool writeInt32(qint32 num, QIODevice* device, QSysInfo::Endian byteOrder); - bool writeInt64(qint64 num, QIODevice* device, QSysInfo::Endian byteOrder); +template<typename SizedQInt> +QByteArray sizedIntToBytes(SizedQInt num, QSysInfo::Endian byteOrder) +{ + QByteArray ba; + ba.resize(sizeof(SizedQInt)); + + if (byteOrder == QSysInfo::LittleEndian) { + qToLittleEndian<SizedQInt>(num, reinterpret_cast<uchar*>(ba.data())); + } else { + qToBigEndian<SizedQInt>(num, reinterpret_cast<uchar*>(ba.data())); + } + + return ba; +} + +template<typename SizedQInt> +bool writeSizedInt(SizedQInt num, QIODevice* device, QSysInfo::Endian byteOrder) +{ + QByteArray ba = sizedIntToBytes<SizedQInt>(num, byteOrder); + qint64 bytesWritten = device->write(ba); + return (bytesWritten == ba.size()); +} } // namespace Endian diff --git a/src/format/Kdbx3Reader.cpp b/src/format/Kdbx3Reader.cpp index fc3dcbd64..fdf3c5997 100644 --- a/src/format/Kdbx3Reader.cpp +++ b/src/format/Kdbx3Reader.cpp @@ -62,13 +62,13 @@ Database* Kdbx3Reader::readDatabase(QIODevice* device, const CompositeKey& key, bool ok; - quint32 signature1 = Endian::readUInt32(m_headerStream, KeePass2::BYTEORDER, &ok); + quint32 signature1 = Endian::readSizedInt<quint32>(m_headerStream, KeePass2::BYTEORDER, &ok); if (!ok || signature1 != KeePass2::SIGNATURE_1) { raiseError(tr("Not a KeePass database.")); return nullptr; } - quint32 signature2 = Endian::readUInt32(m_headerStream, KeePass2::BYTEORDER, &ok); + quint32 signature2 = Endian::readSizedInt<quint32>(m_headerStream, KeePass2::BYTEORDER, &ok); if (ok && signature2 == KeePass1::SIGNATURE_2) { raiseError(tr("The selected file is an old KeePass 1 database (.kdb).\n\n" "You can import it by clicking on Database > 'Import KeePass 1 database...'.\n" @@ -81,7 +81,7 @@ Database* Kdbx3Reader::readDatabase(QIODevice* device, const CompositeKey& key, return nullptr; } - quint32 version = Endian::readUInt32(m_headerStream, KeePass2::BYTEORDER, &ok) + quint32 version = Endian::readSizedInt<quint32>(m_headerStream, KeePass2::BYTEORDER, &ok) & KeePass2::FILE_VERSION_CRITICAL_MASK; quint32 maxVersion = KeePass2::FILE_VERSION & KeePass2::FILE_VERSION_CRITICAL_MASK; if (!ok || (version < KeePass2::FILE_VERSION_MIN) || (version > maxVersion)) { @@ -214,7 +214,7 @@ bool Kdbx3Reader::readHeaderField() quint8 fieldID = fieldIDArray.at(0); bool ok; - quint16 fieldLen = Endian::readUInt16(m_headerStream, KeePass2::BYTEORDER, &ok); + quint16 fieldLen = Endian::readSizedInt<quint16>(m_headerStream, KeePass2::BYTEORDER, &ok); if (!ok) { raiseError("Invalid header field length"); return false; @@ -299,7 +299,7 @@ void Kdbx3Reader::setCompressionFlags(const QByteArray& data) raiseError("Invalid compression flags length"); } else { - quint32 id = Endian::bytesToUInt32(data, KeePass2::BYTEORDER); + quint32 id = Endian::bytesToSizedInt<quint32>(data, KeePass2::BYTEORDER); if (id > Database::CompressionAlgorithmMax) { raiseError("Unsupported compression algorithm"); @@ -344,7 +344,7 @@ void Kdbx3Reader::setTransformRounds(const QByteArray& data) raiseError("Invalid transform rounds size"); } else { - quint64 rounds = Endian::bytesToUInt64(data, KeePass2::BYTEORDER); + quint64 rounds = Endian::bytesToSizedInt<quint64>(data, KeePass2::BYTEORDER); AesKdf* aesKdf; if (m_db->kdf()->type() == Kdf::Type::AES) { @@ -383,7 +383,7 @@ void Kdbx3Reader::setInnerRandomStreamID(const QByteArray& data) if (data.size() != 4) { raiseError("Invalid random stream id size"); } else { - quint32 id = Endian::bytesToUInt32(data, KeePass2::BYTEORDER); + quint32 id = Endian::bytesToSizedInt<quint32>(data, KeePass2::BYTEORDER); KeePass2::ProtectedStreamAlgo irsAlgo = KeePass2::idToProtectedStreamAlgo(id); if (irsAlgo == KeePass2::InvalidProtectedStreamAlgo || irsAlgo == KeePass2::ArcFourVariant) { raiseError("Invalid inner random stream cipher"); diff --git a/src/format/Kdbx3Writer.cpp b/src/format/Kdbx3Writer.cpp index d07ff9663..de04ad686 100644 --- a/src/format/Kdbx3Writer.cpp +++ b/src/format/Kdbx3Writer.cpp @@ -72,25 +72,25 @@ bool Kdbx3Writer::writeDatabase(QIODevice* device, Database* db) header.open(QIODevice::WriteOnly); m_device = &header; - CHECK_RETURN_FALSE(writeData(Endian::int32ToBytes(KeePass2::SIGNATURE_1, KeePass2::BYTEORDER))); - CHECK_RETURN_FALSE(writeData(Endian::int32ToBytes(KeePass2::SIGNATURE_2, KeePass2::BYTEORDER))); - CHECK_RETURN_FALSE(writeData(Endian::int32ToBytes(KeePass2::FILE_VERSION, KeePass2::BYTEORDER))); + CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes<qint32>(KeePass2::SIGNATURE_1, KeePass2::BYTEORDER))); + CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes<qint32>(KeePass2::SIGNATURE_2, KeePass2::BYTEORDER))); + CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes<qint32>(KeePass2::FILE_VERSION, KeePass2::BYTEORDER))); CHECK_RETURN_FALSE(writeHeaderField(KeePass2::CipherID, db->cipher().toByteArray())); CHECK_RETURN_FALSE(writeHeaderField(KeePass2::CompressionFlags, - Endian::int32ToBytes(db->compressionAlgo(), + Endian::sizedIntToBytes<qint32>(db->compressionAlgo(), KeePass2::BYTEORDER))); AesKdf* kdf = static_cast<AesKdf*>(db->kdf()); CHECK_RETURN_FALSE(writeHeaderField(KeePass2::MasterSeed, masterSeed)); CHECK_RETURN_FALSE(writeHeaderField(KeePass2::TransformSeed, kdf->seed())); CHECK_RETURN_FALSE(writeHeaderField(KeePass2::TransformRounds, - Endian::int64ToBytes(kdf->rounds(), + Endian::sizedIntToBytes<qint64>(kdf->rounds(), KeePass2::BYTEORDER))); CHECK_RETURN_FALSE(writeHeaderField(KeePass2::EncryptionIV, encryptionIV)); CHECK_RETURN_FALSE(writeHeaderField(KeePass2::ProtectedStreamKey, protectedStreamKey)); CHECK_RETURN_FALSE(writeHeaderField(KeePass2::StreamStartBytes, startBytes)); CHECK_RETURN_FALSE(writeHeaderField(KeePass2::InnerRandomStreamID, - Endian::int32ToBytes(KeePass2::Salsa20, + Endian::sizedIntToBytes<qint32>(KeePass2::Salsa20, KeePass2::BYTEORDER))); CHECK_RETURN_FALSE(writeHeaderField(KeePass2::EndOfHeader, endOfHeader)); @@ -179,7 +179,7 @@ bool Kdbx3Writer::writeHeaderField(KeePass2::HeaderFieldID fieldId, const QByteA QByteArray fieldIdArr; fieldIdArr[0] = fieldId; CHECK_RETURN_FALSE(writeData(fieldIdArr)); - CHECK_RETURN_FALSE(writeData(Endian::int16ToBytes(static_cast<quint16>(data.size()), + CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes<qint16>(static_cast<quint16>(data.size()), KeePass2::BYTEORDER))); CHECK_RETURN_FALSE(writeData(data)); diff --git a/src/format/KeePass1Reader.cpp b/src/format/KeePass1Reader.cpp index 512b0b58b..ccb3d1ad1 100644 --- a/src/format/KeePass1Reader.cpp +++ b/src/format/KeePass1Reader.cpp @@ -94,25 +94,25 @@ Database* KeePass1Reader::readDatabase(QIODevice* device, const QString& passwor bool ok; - quint32 signature1 = Endian::readUInt32(m_device, KeePass1::BYTEORDER, &ok); + quint32 signature1 = Endian::readSizedInt<quint32>(m_device, KeePass1::BYTEORDER, &ok); if (!ok || signature1 != KeePass1::SIGNATURE_1) { raiseError(tr("Not a KeePass database.")); return nullptr; } - quint32 signature2 = Endian::readUInt32(m_device, KeePass1::BYTEORDER, &ok); + quint32 signature2 = Endian::readSizedInt<quint32>(m_device, KeePass1::BYTEORDER, &ok); if (!ok || signature2 != KeePass1::SIGNATURE_2) { raiseError(tr("Not a KeePass database.")); return nullptr; } - m_encryptionFlags = Endian::readUInt32(m_device, KeePass1::BYTEORDER, &ok); + m_encryptionFlags = Endian::readSizedInt<quint32>(m_device, KeePass1::BYTEORDER, &ok); if (!ok || !(m_encryptionFlags & KeePass1::Rijndael || m_encryptionFlags & KeePass1::Twofish)) { raiseError(tr("Unsupported encryption algorithm.")); return nullptr; } - quint32 version = Endian::readUInt32(m_device, KeePass1::BYTEORDER, &ok); + quint32 version = Endian::readSizedInt<quint32>(m_device, KeePass1::BYTEORDER, &ok); if (!ok || (version & KeePass1::FILE_VERSION_CRITICAL_MASK) != (KeePass1::FILE_VERSION & KeePass1::FILE_VERSION_CRITICAL_MASK)) { raiseError(tr("Unsupported KeePass database version.")); @@ -131,13 +131,13 @@ Database* KeePass1Reader::readDatabase(QIODevice* device, const QString& passwor return nullptr; } - quint32 numGroups = Endian::readUInt32(m_device, KeePass1::BYTEORDER, &ok); + quint32 numGroups = Endian::readSizedInt<quint32>(m_device, KeePass1::BYTEORDER, &ok); if (!ok) { raiseError("Invalid number of groups"); return nullptr; } - quint32 numEntries = Endian::readUInt32(m_device, KeePass1::BYTEORDER, &ok); + quint32 numEntries = Endian::readSizedInt<quint32>(m_device, KeePass1::BYTEORDER, &ok); if (!ok) { raiseError("Invalid number of entries"); return nullptr; @@ -155,7 +155,7 @@ Database* KeePass1Reader::readDatabase(QIODevice* device, const QString& passwor return nullptr; } - m_transformRounds = Endian::readUInt32(m_device, KeePass1::BYTEORDER, &ok); + m_transformRounds = Endian::readSizedInt<quint32>(m_device, KeePass1::BYTEORDER, &ok); if (!ok) { raiseError("Invalid number of transform rounds"); return nullptr; @@ -444,13 +444,13 @@ Group* KeePass1Reader::readGroup(QIODevice* cipherStream) bool reachedEnd = false; do { - quint16 fieldType = Endian::readUInt16(cipherStream, KeePass1::BYTEORDER, &ok); + quint16 fieldType = Endian::readSizedInt<quint16>(cipherStream, KeePass1::BYTEORDER, &ok); if (!ok) { raiseError("Invalid group field type number"); return nullptr; } - int fieldSize = static_cast<int>(Endian::readUInt32(cipherStream, KeePass1::BYTEORDER, &ok)); + int fieldSize = static_cast<int>(Endian::readSizedInt<quint32>(cipherStream, KeePass1::BYTEORDER, &ok)); if (!ok) { raiseError("Invalid group field size"); return nullptr; @@ -471,7 +471,7 @@ Group* KeePass1Reader::readGroup(QIODevice* cipherStream) raiseError("Incorrect group id field size"); return nullptr; } - groupId = Endian::bytesToUInt32(fieldData, KeePass1::BYTEORDER); + groupId = Endian::bytesToSizedInt<quint32>(fieldData, KeePass1::BYTEORDER); groupIdSet = true; break; case 0x0002: @@ -530,7 +530,7 @@ Group* KeePass1Reader::readGroup(QIODevice* cipherStream) raiseError("Incorrect group icon field size"); return nullptr; } - quint32 iconNumber = Endian::bytesToUInt32(fieldData, KeePass1::BYTEORDER); + quint32 iconNumber = Endian::bytesToSizedInt<quint32>(fieldData, KeePass1::BYTEORDER); group->setIcon(iconNumber); break; } @@ -540,7 +540,7 @@ Group* KeePass1Reader::readGroup(QIODevice* cipherStream) raiseError("Incorrect group level field size"); return nullptr; } - groupLevel = Endian::bytesToUInt16(fieldData, KeePass1::BYTEORDER); + groupLevel = Endian::bytesToSizedInt<quint16>(fieldData, KeePass1::BYTEORDER); groupLevelSet = true; break; } @@ -582,13 +582,13 @@ Entry* KeePass1Reader::readEntry(QIODevice* cipherStream) bool reachedEnd = false; do { - quint16 fieldType = Endian::readUInt16(cipherStream, KeePass1::BYTEORDER, &ok); + quint16 fieldType = Endian::readSizedInt<quint16>(cipherStream, KeePass1::BYTEORDER, &ok); if (!ok) { raiseError("Missing entry field type number"); return nullptr; } - int fieldSize = static_cast<int>(Endian::readUInt32(cipherStream, KeePass1::BYTEORDER, &ok)); + int fieldSize = static_cast<int>(Endian::readSizedInt<quint32>(cipherStream, KeePass1::BYTEORDER, &ok)); if (!ok) { raiseError("Invalid entry field size"); return nullptr; @@ -617,7 +617,7 @@ Entry* KeePass1Reader::readEntry(QIODevice* cipherStream) raiseError("Invalid entry group id field size"); return nullptr; } - quint32 groupId = Endian::bytesToUInt32(fieldData, KeePass1::BYTEORDER); + quint32 groupId = Endian::bytesToSizedInt<quint32>(fieldData, KeePass1::BYTEORDER); m_entryGroupIds.insert(entry.data(), groupId); break; } @@ -627,7 +627,7 @@ Entry* KeePass1Reader::readEntry(QIODevice* cipherStream) raiseError("Invalid entry icon field size"); return nullptr; } - quint32 iconNumber = Endian::bytesToUInt32(fieldData, KeePass1::BYTEORDER); + quint32 iconNumber = Endian::bytesToSizedInt<quint32>(fieldData, KeePass1::BYTEORDER); entry->setIcon(iconNumber); break; } @@ -837,7 +837,7 @@ bool KeePass1Reader::parseGroupTreeState(const QByteArray& data) } int pos = 0; - quint32 num = Endian::bytesToUInt32(data.mid(pos, 4), KeePass1::BYTEORDER); + quint32 num = Endian::bytesToSizedInt<quint32>(data.mid(pos, 4), KeePass1::BYTEORDER); pos += 4; if (static_cast<quint32>(data.size() - 4) != (num * 5)) { @@ -845,7 +845,7 @@ bool KeePass1Reader::parseGroupTreeState(const QByteArray& data) } for (quint32 i = 0; i < num; i++) { - quint32 groupId = Endian::bytesToUInt32(data.mid(pos, 4), KeePass1::BYTEORDER); + quint32 groupId = Endian::bytesToSizedInt<quint32>(data.mid(pos, 4), KeePass1::BYTEORDER); pos += 4; bool expanded = data.at(pos); @@ -867,13 +867,13 @@ bool KeePass1Reader::parseCustomIcons4(const QByteArray& data) int pos = 0; - quint32 numIcons = Endian::bytesToUInt32(data.mid(pos, 4), KeePass1::BYTEORDER); + quint32 numIcons = Endian::bytesToSizedInt<quint32>(data.mid(pos, 4), KeePass1::BYTEORDER); pos += 4; - quint32 numEntries = Endian::bytesToUInt32(data.mid(pos, 4), KeePass1::BYTEORDER); + quint32 numEntries = Endian::bytesToSizedInt<quint32>(data.mid(pos, 4), KeePass1::BYTEORDER); pos += 4; - quint32 numGroups = Endian::bytesToUInt32(data.mid(pos, 4), KeePass1::BYTEORDER); + quint32 numGroups = Endian::bytesToSizedInt<quint32>(data.mid(pos, 4), KeePass1::BYTEORDER); pos += 4; QList<Uuid> iconUuids; @@ -882,7 +882,7 @@ bool KeePass1Reader::parseCustomIcons4(const QByteArray& data) if (data.size() < (pos + 4)) { return false; } - quint32 iconSize = Endian::bytesToUInt32(data.mid(pos, 4), KeePass1::BYTEORDER); + quint32 iconSize = Endian::bytesToSizedInt<quint32>(data.mid(pos, 4), KeePass1::BYTEORDER); pos += 4; if (static_cast<quint32>(data.size()) < (pos + iconSize)) { @@ -908,7 +908,7 @@ bool KeePass1Reader::parseCustomIcons4(const QByteArray& data) QByteArray entryUuid = data.mid(pos, 16); pos += 16; - quint32 iconId = Endian::bytesToUInt32(data.mid(pos, 4), KeePass1::BYTEORDER); + quint32 iconId = Endian::bytesToSizedInt<quint32>(data.mid(pos, 4), KeePass1::BYTEORDER); pos += 4; if (m_entryUuids.contains(entryUuid) && (iconId < static_cast<quint32>(iconUuids.size()))) { @@ -921,10 +921,10 @@ bool KeePass1Reader::parseCustomIcons4(const QByteArray& data) } for (quint32 i = 0; i < numGroups; i++) { - quint32 groupId = Endian::bytesToUInt32(data.mid(pos, 4), KeePass1::BYTEORDER); + quint32 groupId = Endian::bytesToSizedInt<quint32>(data.mid(pos, 4), KeePass1::BYTEORDER); pos += 4; - quint32 iconId = Endian::bytesToUInt32(data.mid(pos, 4), KeePass1::BYTEORDER); + quint32 iconId = Endian::bytesToSizedInt<quint32>(data.mid(pos, 4), KeePass1::BYTEORDER); pos += 4; if (m_groupIds.contains(groupId) && (iconId < static_cast<quint32>(iconUuids.size()))) { diff --git a/src/format/KeePass2Reader.cpp b/src/format/KeePass2Reader.cpp index a09f0adce..5d62794d4 100644 --- a/src/format/KeePass2Reader.cpp +++ b/src/format/KeePass2Reader.cpp @@ -99,13 +99,13 @@ Database* KeePass2Reader::readDatabase(QIODevice* device, const CompositeKey& ke bool ok; - quint32 signature1 = Endian::readUInt32(device, KeePass2::BYTEORDER, &ok); + quint32 signature1 = Endian::readSizedInt<quint32>(device, KeePass2::BYTEORDER, &ok); if (!ok || signature1 != KeePass2::SIGNATURE_1) { raiseError(tr("Not a KeePass database.")); return nullptr; } - quint32 signature2 = Endian::readUInt32(device, KeePass2::BYTEORDER, &ok); + quint32 signature2 = Endian::readSizedInt<quint32>(device, KeePass2::BYTEORDER, &ok); if (ok && signature2 == KeePass1::SIGNATURE_2) { raiseError(tr("The selected file is an old KeePass 1 database (.kdb).\n\n" "You can import it by clicking on Database > 'Import KeePass 1 database...'.\n" @@ -118,7 +118,7 @@ Database* KeePass2Reader::readDatabase(QIODevice* device, const CompositeKey& ke return nullptr; } - m_version = Endian::readUInt32(device, KeePass2::BYTEORDER, &ok) + m_version = Endian::readSizedInt<quint32>(device, KeePass2::BYTEORDER, &ok) & KeePass2::FILE_VERSION_CRITICAL_MASK; quint32 maxVersion = KeePass2::FILE_VERSION & KeePass2::FILE_VERSION_CRITICAL_MASK; if (!ok || (m_version < KeePass2::FILE_VERSION_MIN) || (m_version > maxVersion)) { diff --git a/src/streams/HashedBlockStream.cpp b/src/streams/HashedBlockStream.cpp index 0b11a9ca0..dd323a6d5 100644 --- a/src/streams/HashedBlockStream.cpp +++ b/src/streams/HashedBlockStream.cpp @@ -130,7 +130,7 @@ bool HashedBlockStream::readHashedBlock() { bool ok; - quint32 index = Endian::readUInt32(m_baseDevice, ByteOrder, &ok); + quint32 index = Endian::readSizedInt<quint32>(m_baseDevice, ByteOrder, &ok); if (!ok || index != m_blockIndex) { m_error = true; setErrorString("Invalid block index."); @@ -144,7 +144,7 @@ bool HashedBlockStream::readHashedBlock() return false; } - m_blockSize = Endian::readInt32(m_baseDevice, ByteOrder, &ok); + m_blockSize = Endian::readSizedInt<qint32>(m_baseDevice, ByteOrder, &ok); if (!ok || m_blockSize < 0) { m_error = true; setErrorString("Invalid block size."); @@ -217,7 +217,7 @@ qint64 HashedBlockStream::writeData(const char* data, qint64 maxSize) bool HashedBlockStream::writeHashedBlock() { - if (!Endian::writeInt32(m_blockIndex, m_baseDevice, ByteOrder)) { + if (!Endian::writeSizedInt<qint32>(m_blockIndex, m_baseDevice, ByteOrder)) { m_error = true; setErrorString(m_baseDevice->errorString()); return false; @@ -238,7 +238,7 @@ bool HashedBlockStream::writeHashedBlock() return false; } - if (!Endian::writeInt32(m_buffer.size(), m_baseDevice, ByteOrder)) { + if (!Endian::writeSizedInt<qint32>(m_buffer.size(), m_baseDevice, ByteOrder)) { m_error = true; setErrorString(m_baseDevice->errorString()); return false; diff --git a/src/streams/HmacBlockStream.cpp b/src/streams/HmacBlockStream.cpp index c01c973b1..40c5fc547 100644 --- a/src/streams/HmacBlockStream.cpp +++ b/src/streams/HmacBlockStream.cpp @@ -144,7 +144,7 @@ bool HmacBlockStream::readHashedBlock() setErrorString("Invalid block size size."); return false; } - qint32 blockSize = Endian::bytesToInt32(blockSizeBytes, ByteOrder); + qint32 blockSize = Endian::bytesToSizedInt<qint32>(blockSizeBytes, ByteOrder); if (blockSize < 0) { m_error = true; setErrorString("Invalid block size."); @@ -160,7 +160,7 @@ bool HmacBlockStream::readHashedBlock() CryptoHash hasher(CryptoHash::Sha256, true); hasher.setKey(getCurrentHmacKey()); - hasher.addData(Endian::uint64ToBytes(m_blockIndex, ByteOrder)); + hasher.addData(Endian::sizedIntToBytes<quint64>(m_blockIndex, ByteOrder)); hasher.addData(blockSizeBytes); hasher.addData(m_buffer); @@ -219,8 +219,8 @@ bool HmacBlockStream::writeHashedBlock() { CryptoHash hasher(CryptoHash::Sha256, true); hasher.setKey(getCurrentHmacKey()); - hasher.addData(Endian::uint64ToBytes(m_blockIndex, ByteOrder)); - hasher.addData(Endian::int32ToBytes(m_buffer.size(), ByteOrder)); + hasher.addData(Endian::sizedIntToBytes<quint64>(m_blockIndex, ByteOrder)); + hasher.addData(Endian::sizedIntToBytes<qint32>(m_buffer.size(), ByteOrder)); hasher.addData(m_buffer); QByteArray hash = hasher.result(); @@ -230,7 +230,7 @@ bool HmacBlockStream::writeHashedBlock() return false; } - if (!Endian::writeInt32(m_buffer.size(), m_baseDevice, ByteOrder)) { + if (!Endian::writeSizedInt<qint32>(m_buffer.size(), m_baseDevice, ByteOrder)) { m_error = true; setErrorString(m_baseDevice->errorString()); return false; @@ -255,7 +255,7 @@ QByteArray HmacBlockStream::getCurrentHmacKey() const { QByteArray HmacBlockStream::getHmacKey(quint64 blockIndex, QByteArray key) { Q_ASSERT(key.size() == 64); - QByteArray indexBytes = Endian::uint64ToBytes(blockIndex, ByteOrder); + QByteArray indexBytes = Endian::sizedIntToBytes<quint64>(blockIndex, ByteOrder); CryptoHash hasher(CryptoHash::Sha512); hasher.addData(indexBytes); hasher.addData(key); From 0d6ca0945bf1425decf5516420fe3973743e47ab Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sat, 16 Dec 2017 17:36:33 +0100 Subject: [PATCH 226/402] Reformat code, fix minor style issues, make kdf() getter const --- src/core/Database.cpp | 2 +- src/core/Database.h | 2 +- src/crypto/CryptoHash.cpp | 15 +- src/crypto/CryptoHash.h | 5 +- src/crypto/SymmetricCipher.cpp | 56 ++-- src/crypto/SymmetricCipher.h | 18 +- src/crypto/SymmetricCipherGcrypt.cpp | 11 +- src/crypto/SymmetricCipherGcrypt.h | 2 +- src/crypto/kdf/AesKdf.cpp | 26 +- src/crypto/kdf/AesKdf.h | 11 +- src/crypto/kdf/Kdf.cpp | 18 +- src/crypto/kdf/Kdf.h | 12 +- src/crypto/kdf/Kdf_p.h | 6 +- src/format/Kdbx3Reader.cpp | 43 ++- src/format/Kdbx3Reader.h | 4 +- src/format/Kdbx3Writer.cpp | 20 +- src/format/Kdbx3Writer.h | 4 +- src/format/Kdbx3XmlReader.cpp | 406 +++++++++------------------ src/format/Kdbx3XmlReader.h | 2 +- src/format/Kdbx3XmlWriter.cpp | 62 ++-- src/format/KeePass2.cpp | 24 +- src/format/KeePass2RandomStream.cpp | 20 +- src/streams/HmacBlockStream.cpp | 22 +- src/streams/HmacBlockStream.h | 6 +- 24 files changed, 324 insertions(+), 473 deletions(-) diff --git a/src/core/Database.cpp b/src/core/Database.cpp index 45f2b479f..ae22603f3 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -485,7 +485,7 @@ QString Database::saveToFile(QString filePath) } } -Kdf* Database::kdf() { +Kdf* Database::kdf() const { return m_data.kdf; } diff --git a/src/core/Database.h b/src/core/Database.h index dbb48718e..44854b854 100644 --- a/src/core/Database.h +++ b/src/core/Database.h @@ -92,7 +92,7 @@ public: Uuid cipher() const; Database::CompressionAlgorithm compressionAlgo() const; - Kdf* kdf(); + Kdf* kdf() const; QByteArray transformedMasterKey() const; const CompositeKey& key() const; QByteArray challengeResponseKey() const; diff --git a/src/crypto/CryptoHash.cpp b/src/crypto/CryptoHash.cpp index 907140606..8d5b56e76 100644 --- a/src/crypto/CryptoHash.cpp +++ b/src/crypto/CryptoHash.cpp @@ -28,10 +28,7 @@ public: int hashLen; }; -CryptoHash::CryptoHash(CryptoHash::Algorithm algo) - : CryptoHash::CryptoHash(algo, false) {} - -CryptoHash::CryptoHash(CryptoHash::Algorithm algo, bool hmac) +CryptoHash::CryptoHash(Algorithm algo, bool hmac) : d_ptr(new CryptoHashPrivate()) { Q_D(CryptoHash); @@ -86,14 +83,14 @@ void CryptoHash::addData(const QByteArray& data) return; } - gcry_md_write(d->ctx, data.constData(), data.size()); + gcry_md_write(d->ctx, data.constData(), static_cast<size_t>(data.size())); } void CryptoHash::setKey(const QByteArray& data) { Q_D(CryptoHash); - gcry_error_t error = gcry_md_setkey(d->ctx, data.constData(), data.size()); + gcry_error_t error = gcry_md_setkey(d->ctx, data.constData(), static_cast<size_t>(data.size())); if (error) { qWarning("Gcrypt error (setKey): %s", gcry_strerror(error)); qWarning("Gcrypt error (setKey): %s", gcry_strsource(error)); @@ -112,11 +109,11 @@ QByteArray CryptoHash::result() const { Q_D(const CryptoHash); - const char* result = reinterpret_cast<const char*>(gcry_md_read(d->ctx, 0)); + const auto* result = reinterpret_cast<const char*>(gcry_md_read(d->ctx, 0)); return QByteArray(result, d->hashLen); } -QByteArray CryptoHash::hash(const QByteArray& data, CryptoHash::Algorithm algo) +QByteArray CryptoHash::hash(const QByteArray& data, Algorithm algo) { // replace with gcry_md_hash_buffer()? CryptoHash cryptoHash(algo); @@ -124,7 +121,7 @@ QByteArray CryptoHash::hash(const QByteArray& data, CryptoHash::Algorithm algo) return cryptoHash.result(); } -QByteArray CryptoHash::hmac(const QByteArray& data, const QByteArray& key, CryptoHash::Algorithm algo) +QByteArray CryptoHash::hmac(const QByteArray& data, const QByteArray& key, Algorithm algo) { // replace with gcry_md_hash_buffer()? CryptoHash cryptoHash(algo, true); diff --git a/src/crypto/CryptoHash.h b/src/crypto/CryptoHash.h index cf027e0f3..bd312121a 100644 --- a/src/crypto/CryptoHash.h +++ b/src/crypto/CryptoHash.h @@ -31,15 +31,14 @@ public: Sha512 }; - explicit CryptoHash(CryptoHash::Algorithm algo); - explicit CryptoHash(CryptoHash::Algorithm algo, bool hmac); + explicit CryptoHash(Algorithm algo, bool hmac = false); ~CryptoHash(); void addData(const QByteArray& data); void reset(); QByteArray result() const; void setKey(const QByteArray& data); - static QByteArray hash(const QByteArray& data, CryptoHash::Algorithm algo); + static QByteArray hash(const QByteArray& data, Algorithm algo); static QByteArray hmac(const QByteArray& data, const QByteArray& key, Algorithm algo); private: diff --git a/src/crypto/SymmetricCipher.cpp b/src/crypto/SymmetricCipher.cpp index 9bd605b43..1ec8a2cf6 100644 --- a/src/crypto/SymmetricCipher.cpp +++ b/src/crypto/SymmetricCipher.cpp @@ -20,8 +20,7 @@ #include "config-keepassx.h" #include "crypto/SymmetricCipherGcrypt.h" -SymmetricCipher::SymmetricCipher(SymmetricCipher::Algorithm algo, SymmetricCipher::Mode mode, - SymmetricCipher::Direction direction) +SymmetricCipher::SymmetricCipher(Algorithm algo, Mode mode, Direction direction) : m_backend(createBackend(algo, mode, direction)) , m_initialized(false) , m_algo(algo) @@ -55,14 +54,13 @@ bool SymmetricCipher::isInitalized() const return m_initialized; } -SymmetricCipherBackend* SymmetricCipher::createBackend(SymmetricCipher::Algorithm algo, SymmetricCipher::Mode mode, - SymmetricCipher::Direction direction) +SymmetricCipherBackend* SymmetricCipher::createBackend(Algorithm algo, Mode mode, Direction direction) { switch (algo) { - case SymmetricCipher::Aes256: - case SymmetricCipher::Twofish: - case SymmetricCipher::Salsa20: - case SymmetricCipher::ChaCha20: + case Aes256: + case Twofish: + case Salsa20: + case ChaCha20: return new SymmetricCipherGcrypt(algo, mode, direction); default: @@ -94,25 +92,25 @@ QString SymmetricCipher::errorString() const SymmetricCipher::Algorithm SymmetricCipher::cipherToAlgorithm(Uuid cipher) { if (cipher == KeePass2::CIPHER_AES) { - return SymmetricCipher::Aes256; + return Aes256; } else if (cipher == KeePass2::CIPHER_CHACHA20) { - return SymmetricCipher::ChaCha20; + return ChaCha20; } else if (cipher == KeePass2::CIPHER_TWOFISH) { - return SymmetricCipher::Twofish; + return Twofish; } qWarning("SymmetricCipher::cipherToAlgorithm: invalid Uuid %s", cipher.toByteArray().toHex().data()); return InvalidAlgorithm; } -Uuid SymmetricCipher::algorithmToCipher(SymmetricCipher::Algorithm algo) +Uuid SymmetricCipher::algorithmToCipher(Algorithm algo) { switch (algo) { - case SymmetricCipher::Aes256: + case Aes256: return KeePass2::CIPHER_AES; - case SymmetricCipher::ChaCha20: + case ChaCha20: return KeePass2::CIPHER_CHACHA20; - case SymmetricCipher::Twofish: + case Twofish: return KeePass2::CIPHER_TWOFISH; default: qWarning("SymmetricCipher::algorithmToCipher: invalid algorithm %d", algo); @@ -120,12 +118,14 @@ Uuid SymmetricCipher::algorithmToCipher(SymmetricCipher::Algorithm algo) } } -int SymmetricCipher::algorithmIvSize(SymmetricCipher::Algorithm algo) { +int SymmetricCipher::algorithmIvSize(Algorithm algo) +{ switch (algo) { - case SymmetricCipher::ChaCha20: + case ChaCha20: return 12; - case SymmetricCipher::Aes256: - case SymmetricCipher::Twofish: + case Aes256: + return 16; + case Twofish: return 16; default: qWarning("SymmetricCipher::algorithmIvSize: invalid algorithm %d", algo); @@ -133,19 +133,21 @@ int SymmetricCipher::algorithmIvSize(SymmetricCipher::Algorithm algo) { } } -SymmetricCipher::Mode SymmetricCipher::algorithmMode(SymmetricCipher::Algorithm algo) { +SymmetricCipher::Mode SymmetricCipher::algorithmMode(Algorithm algo) +{ switch (algo) { - case SymmetricCipher::ChaCha20: - return SymmetricCipher::Stream; - case SymmetricCipher::Aes256: - case SymmetricCipher::Twofish: - return SymmetricCipher::Cbc; + case ChaCha20: + return Stream; + case Aes256: + case Twofish: + return Cbc; default: qWarning("SymmetricCipher::algorithmMode: invalid algorithm %d", algo); - return SymmetricCipher::InvalidMode; + return InvalidMode; } } -SymmetricCipher::Algorithm SymmetricCipher::algorithm() const { +SymmetricCipher::Algorithm SymmetricCipher::algorithm() const +{ return m_algo; } diff --git a/src/crypto/SymmetricCipher.h b/src/crypto/SymmetricCipher.h index 981ef320e..eab834956 100644 --- a/src/crypto/SymmetricCipher.h +++ b/src/crypto/SymmetricCipher.h @@ -53,22 +53,25 @@ public: Encrypt }; - SymmetricCipher(SymmetricCipher::Algorithm algo, SymmetricCipher::Mode mode, - SymmetricCipher::Direction direction); + SymmetricCipher(Algorithm algo, Mode mode, Direction direction); ~SymmetricCipher(); + Q_DISABLE_COPY(SymmetricCipher) bool init(const QByteArray& key, const QByteArray& iv); bool isInitalized() const; - inline QByteArray process(const QByteArray& data, bool* ok) { + inline QByteArray process(const QByteArray& data, bool* ok) + { return m_backend->process(data, ok); } - Q_REQUIRED_RESULT inline bool processInPlace(QByteArray& data) { + Q_REQUIRED_RESULT inline bool processInPlace(QByteArray& data) + { return m_backend->processInPlace(data); } - Q_REQUIRED_RESULT inline bool processInPlace(QByteArray& data, quint64 rounds) { + Q_REQUIRED_RESULT inline bool processInPlace(QByteArray& data, quint64 rounds) + { Q_ASSERT(rounds > 0); return m_backend->processInPlace(data, rounds); } @@ -85,14 +88,11 @@ public: static Mode algorithmMode(Algorithm algo); private: - static SymmetricCipherBackend* createBackend(SymmetricCipher::Algorithm algo, SymmetricCipher::Mode mode, - SymmetricCipher::Direction direction); + static SymmetricCipherBackend* createBackend(Algorithm algo, Mode mode, Direction direction); const QScopedPointer<SymmetricCipherBackend> m_backend; bool m_initialized; Algorithm m_algo; - - Q_DISABLE_COPY(SymmetricCipher) }; #endif // KEEPASSX_SYMMETRICCIPHER_H diff --git a/src/crypto/SymmetricCipherGcrypt.cpp b/src/crypto/SymmetricCipherGcrypt.cpp index bbb80bf60..b1abd5250 100644 --- a/src/crypto/SymmetricCipherGcrypt.cpp +++ b/src/crypto/SymmetricCipherGcrypt.cpp @@ -145,8 +145,7 @@ QByteArray SymmetricCipherGcrypt::process(const QByteArray& data, bool* ok) if (m_direction == SymmetricCipher::Decrypt) { error = gcry_cipher_decrypt(m_ctx, result.data(), data.size(), data.constData(), data.size()); - } - else { + } else { error = gcry_cipher_encrypt(m_ctx, result.data(), data.size(), data.constData(), data.size()); } @@ -154,7 +153,7 @@ QByteArray SymmetricCipherGcrypt::process(const QByteArray& data, bool* ok) setErrorString(error); *ok = false; } else { - *ok = true; + *ok = true; } return result; @@ -168,8 +167,7 @@ bool SymmetricCipherGcrypt::processInPlace(QByteArray& data) if (m_direction == SymmetricCipher::Decrypt) { error = gcry_cipher_decrypt(m_ctx, data.data(), data.size(), nullptr, 0); - } - else { + } else { error = gcry_cipher_encrypt(m_ctx, data.data(), data.size(), nullptr, 0); } @@ -199,8 +197,7 @@ bool SymmetricCipherGcrypt::processInPlace(QByteArray& data, quint64 rounds) return false; } } - } - else { + } else { for (quint64 i = 0; i != rounds; ++i) { error = gcry_cipher_encrypt(m_ctx, rawData, size, nullptr, 0); diff --git a/src/crypto/SymmetricCipherGcrypt.h b/src/crypto/SymmetricCipherGcrypt.h index 108bc14e4..2436c3be1 100644 --- a/src/crypto/SymmetricCipherGcrypt.h +++ b/src/crypto/SymmetricCipherGcrypt.h @@ -23,7 +23,7 @@ #include "crypto/SymmetricCipher.h" #include "crypto/SymmetricCipherBackend.h" -class SymmetricCipherGcrypt : public SymmetricCipherBackend +class SymmetricCipherGcrypt: public SymmetricCipherBackend { public: SymmetricCipherGcrypt(SymmetricCipher::Algorithm algo, SymmetricCipher::Mode mode, diff --git a/src/crypto/kdf/AesKdf.cpp b/src/crypto/kdf/AesKdf.cpp index 4380a782e..a4dd75650 100644 --- a/src/crypto/kdf/AesKdf.cpp +++ b/src/crypto/kdf/AesKdf.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 KeePassXC Team + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,7 +28,7 @@ const QList<Kdf::Field> AesKdf::FIELDS = AesKdf::initFields(); QList<Kdf::Field> AesKdf::initFields() { return QList<Kdf::Field> { - Kdf::Field(static_cast<quint32>(Fields::ROUNDS), "Transform rounds", 1, UINT64_MAX, true), + Kdf::Field(static_cast<quint32>(Fields::ROUNDS), "Transform rounds", 1, UINT64_MAX, true), }; } @@ -67,7 +67,8 @@ bool AesKdf::transformKeyRaw(const QByteArray& key, const QByteArray& seed, quin *result = key; if (!cipher.processInPlace(*result, rounds)) { - qWarning("AesKdf::transformKeyRaw: error in SymmetricCipher::processInPlace: %s", cipher.errorString().toUtf8().data()); + qWarning("AesKdf::transformKeyRaw: error in SymmetricCipher::processInPlace: %s", + cipher.errorString().toUtf8().data()); return false; } @@ -129,20 +130,20 @@ const QList<Kdf::Field> AesKdf::fields() const quint64 AesKdf::field(quint32 id) const { switch (static_cast<Fields>(id)) { - case Fields::ROUNDS: - return m_rounds; - default: - return 0; + case Fields::ROUNDS: + return m_rounds; + default: + return 0; } } bool AesKdf::setField(quint32 id, quint64 val) { switch (static_cast<Fields>(id)) { - case Fields::ROUNDS: - return setRounds(val); - default: - return false; + case Fields::ROUNDS: + return setRounds(val); + default: + return false; } } @@ -165,7 +166,8 @@ int AesKdf::benchmarkImpl(int msec) const break; } rounds += 10000; - } while (!t.hasExpired(msec)); + } + while (!t.hasExpired(msec)); return rounds; } \ No newline at end of file diff --git a/src/crypto/kdf/AesKdf.h b/src/crypto/kdf/AesKdf.h index 3aebc8d50..660c022ed 100644 --- a/src/crypto/kdf/AesKdf.h +++ b/src/crypto/kdf/AesKdf.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 KeePassXC Team + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,7 +20,7 @@ #include "Kdf.h" -class AesKdf : public Kdf +class AesKdf: public Kdf { public: AesKdf(); @@ -40,7 +40,7 @@ public: bool setRounds(quint64 rounds); bool setSeed(const QByteArray& seed); - enum class Fields : quint32 + enum class Fields: quint32 { ROUNDS, SEED @@ -55,7 +55,10 @@ private: quint64 m_rounds; QByteArray m_seed; - static bool transformKeyRaw(const QByteArray& key, const QByteArray& seed, quint64 rounds, QByteArray* result) Q_REQUIRED_RESULT; + static bool transformKeyRaw(const QByteArray& key, + const QByteArray& seed, + quint64 rounds, + QByteArray* result) Q_REQUIRED_RESULT; static QList<Kdf::Field> initFields(); }; diff --git a/src/crypto/kdf/Kdf.cpp b/src/crypto/kdf/Kdf.cpp index 99f12645c..c1bfdf7e1 100644 --- a/src/crypto/kdf/Kdf.cpp +++ b/src/crypto/kdf/Kdf.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 KeePassXC Team + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,11 +23,11 @@ #include <QtConcurrent> Kdf::Field::Field(quint32 id, const QString& name, quint64 min, quint64 max, bool benchmark) - : m_id(id) - , m_name(name) - , m_min(min) - , m_max(max) - , m_benchmark(benchmark) + : m_id(id) + , m_name(name) + , m_min(min) + , m_max(max) + , m_benchmark(benchmark) { } @@ -71,8 +71,7 @@ int Kdf::benchmark(int msec) const } Kdf::BenchmarkThread::BenchmarkThread(int msec, const Kdf* kdf) - : m_msec(msec) - , m_kdf(kdf) + : m_msec(msec), m_kdf(kdf) { } @@ -81,6 +80,7 @@ int Kdf::BenchmarkThread::rounds() return m_rounds; } -void Kdf::BenchmarkThread::run() { +void Kdf::BenchmarkThread::run() +{ m_rounds = m_kdf->benchmarkImpl(m_msec); } diff --git a/src/crypto/kdf/Kdf.h b/src/crypto/kdf/Kdf.h index c032a030c..14ce24501 100644 --- a/src/crypto/kdf/Kdf.h +++ b/src/crypto/kdf/Kdf.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 KeePassXC Team + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,11 +25,13 @@ class Kdf { public: - enum class Type { + enum class Type + { AES }; - class Field { + class Field + { public: Field(quint32 id, const QString& name, quint64 min, quint64 max, bool benchmark = false); @@ -48,9 +50,11 @@ public: }; virtual ~Kdf() {} + + virtual QByteArray seed() const = 0; + virtual Type type() const = 0; virtual bool transform(const QByteArray& raw, QByteArray& result) const = 0; virtual void randomizeTransformSalt() = 0; - virtual Type type() const = 0; virtual Kdf* clone() const = 0; virtual const QList<Field> fields() const = 0; diff --git a/src/crypto/kdf/Kdf_p.h b/src/crypto/kdf/Kdf_p.h index c74837522..5606c0bf5 100644 --- a/src/crypto/kdf/Kdf_p.h +++ b/src/crypto/kdf/Kdf_p.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 KeePassXC Team + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,9 +22,9 @@ #ifndef KEEPASSXC_KDF_P_H #define KEEPASSXC_KDF_P_H -class Kdf::BenchmarkThread : public QThread +class Kdf::BenchmarkThread: public QThread { - Q_OBJECT +Q_OBJECT public: explicit BenchmarkThread(int msec, const Kdf* kdf); diff --git a/src/format/Kdbx3Reader.cpp b/src/format/Kdbx3Reader.cpp index fdf3c5997..0ea6f817e 100644 --- a/src/format/Kdbx3Reader.cpp +++ b/src/format/Kdbx3Reader.cpp @@ -71,18 +71,17 @@ Database* Kdbx3Reader::readDatabase(QIODevice* device, const CompositeKey& key, quint32 signature2 = Endian::readSizedInt<quint32>(m_headerStream, KeePass2::BYTEORDER, &ok); if (ok && signature2 == KeePass1::SIGNATURE_2) { raiseError(tr("The selected file is an old KeePass 1 database (.kdb).\n\n" - "You can import it by clicking on Database > 'Import KeePass 1 database...'.\n" - "This is a one-way migration. You won't be able to open the imported " - "database with the old KeePassX 0.4 version.")); + "You can import it by clicking on Database > 'Import KeePass 1 database...'.\n" + "This is a one-way migration. You won't be able to open the imported " + "database with the old KeePassX 0.4 version.")); return nullptr; - } - else if (!ok || signature2 != KeePass2::SIGNATURE_2) { + } else if (!ok || signature2 != KeePass2::SIGNATURE_2) { raiseError(tr("Not a KeePass database.")); return nullptr; } quint32 version = Endian::readSizedInt<quint32>(m_headerStream, KeePass2::BYTEORDER, &ok) - & KeePass2::FILE_VERSION_CRITICAL_MASK; + & KeePass2::FILE_VERSION_CRITICAL_MASK; quint32 maxVersion = KeePass2::FILE_VERSION & KeePass2::FILE_VERSION_CRITICAL_MASK; if (!ok || (version < KeePass2::FILE_VERSION_MIN) || (version > maxVersion)) { raiseError(tr("Unsupported KeePass KDBX 2 or 3 database version.")); @@ -100,8 +99,8 @@ Database* Kdbx3Reader::readDatabase(QIODevice* device, const CompositeKey& key, // check if all required headers were present if (m_masterSeed.isEmpty() || m_encryptionIV.isEmpty() - || m_streamStartBytes.isEmpty() || m_protectedStreamKey.isEmpty() - || m_db->cipher().isNull()) { + || m_streamStartBytes.isEmpty() || m_protectedStreamKey.isEmpty() + || m_db->cipher().isNull()) { raiseError("missing database headers"); return nullptr; } @@ -152,8 +151,7 @@ Database* Kdbx3Reader::readDatabase(QIODevice* device, const CompositeKey& key, if (m_db->compressionAlgo() == Database::CompressionNone) { xmlDevice = &hashedStream; - } - else { + } else { ioCompressor.reset(new QtIOCompressor(&hashedStream)); ioCompressor->setStreamFormat(QtIOCompressor::GzipFormat); if (!ioCompressor->open(QIODevice::ReadOnly)) { @@ -185,8 +183,7 @@ Database* Kdbx3Reader::readDatabase(QIODevice* device, const CompositeKey& key, raiseError(xmlReader.errorString()); if (keepDatabase) { return db.take(); - } - else { + } else { return nullptr; } } @@ -297,14 +294,12 @@ void Kdbx3Reader::setCompressionFlags(const QByteArray& data) { if (data.size() != 4) { raiseError("Invalid compression flags length"); - } - else { + } else { quint32 id = Endian::bytesToSizedInt<quint32>(data, KeePass2::BYTEORDER); if (id > Database::CompressionAlgorithmMax) { raiseError("Unsupported compression algorithm"); - } - else { + } else { m_db->setCompressionAlgo(static_cast<Database::CompressionAlgorithm>(id)); } } @@ -314,8 +309,7 @@ void Kdbx3Reader::setMasterSeed(const QByteArray& data) { if (data.size() != 32) { raiseError("Invalid master seed size"); - } - else { + } else { m_masterSeed = data; } } @@ -324,8 +318,7 @@ void Kdbx3Reader::setTransformSeed(const QByteArray& data) { if (data.size() != 32) { raiseError("Invalid transform seed size"); - } - else { + } else { AesKdf* aesKdf; if (m_db->kdf()->type() == Kdf::Type::AES) { aesKdf = static_cast<AesKdf*>(m_db->kdf()); @@ -342,8 +335,7 @@ void Kdbx3Reader::setTransformRounds(const QByteArray& data) { if (data.size() != 8) { raiseError("Invalid transform rounds size"); - } - else { + } else { quint64 rounds = Endian::bytesToSizedInt<quint64>(data, KeePass2::BYTEORDER); AesKdf* aesKdf; @@ -352,10 +344,10 @@ void Kdbx3Reader::setTransformRounds(const QByteArray& data) } else { aesKdf = new AesKdf(); m_db->setKdf(aesKdf); - } + } aesKdf->setRounds(rounds); - } + } } void Kdbx3Reader::setEncryptionIV(const QByteArray& data) @@ -372,8 +364,7 @@ void Kdbx3Reader::setStreamStartBytes(const QByteArray& data) { if (data.size() != 32) { raiseError("Invalid start bytes size"); - } - else { + } else { m_streamStartBytes = data; } } diff --git a/src/format/Kdbx3Reader.h b/src/format/Kdbx3Reader.h index 1083b4bb4..24a1ef100 100644 --- a/src/format/Kdbx3Reader.h +++ b/src/format/Kdbx3Reader.h @@ -26,9 +26,9 @@ class Database; class QIODevice; -class Kdbx3Reader : public BaseKeePass2Reader +class Kdbx3Reader: public BaseKeePass2Reader { - Q_DECLARE_TR_FUNCTIONS(Kdbx3Reader) +Q_DECLARE_TR_FUNCTIONS(Kdbx3Reader) public: Kdbx3Reader(); diff --git a/src/format/Kdbx3Writer.cpp b/src/format/Kdbx3Writer.cpp index de04ad686..990aa71ee 100644 --- a/src/format/Kdbx3Writer.cpp +++ b/src/format/Kdbx3Writer.cpp @@ -78,20 +78,20 @@ bool Kdbx3Writer::writeDatabase(QIODevice* device, Database* db) CHECK_RETURN_FALSE(writeHeaderField(KeePass2::CipherID, db->cipher().toByteArray())); CHECK_RETURN_FALSE(writeHeaderField(KeePass2::CompressionFlags, - Endian::sizedIntToBytes<qint32>(db->compressionAlgo(), - KeePass2::BYTEORDER))); + Endian::sizedIntToBytes<qint32>(db->compressionAlgo(), + KeePass2::BYTEORDER))); AesKdf* kdf = static_cast<AesKdf*>(db->kdf()); CHECK_RETURN_FALSE(writeHeaderField(KeePass2::MasterSeed, masterSeed)); CHECK_RETURN_FALSE(writeHeaderField(KeePass2::TransformSeed, kdf->seed())); CHECK_RETURN_FALSE(writeHeaderField(KeePass2::TransformRounds, - Endian::sizedIntToBytes<qint64>(kdf->rounds(), - KeePass2::BYTEORDER))); + Endian::sizedIntToBytes<qint64>(kdf->rounds(), + KeePass2::BYTEORDER))); CHECK_RETURN_FALSE(writeHeaderField(KeePass2::EncryptionIV, encryptionIV)); CHECK_RETURN_FALSE(writeHeaderField(KeePass2::ProtectedStreamKey, protectedStreamKey)); CHECK_RETURN_FALSE(writeHeaderField(KeePass2::StreamStartBytes, startBytes)); CHECK_RETURN_FALSE(writeHeaderField(KeePass2::InnerRandomStreamID, - Endian::sizedIntToBytes<qint32>(KeePass2::Salsa20, - KeePass2::BYTEORDER))); + Endian::sizedIntToBytes<qint32>(KeePass2::Salsa20, + KeePass2::BYTEORDER))); CHECK_RETURN_FALSE(writeHeaderField(KeePass2::EndOfHeader, endOfHeader)); header.close(); @@ -120,8 +120,7 @@ bool Kdbx3Writer::writeDatabase(QIODevice* device, Database* db) if (db->compressionAlgo() == Database::CompressionNone) { m_device = &hashedStream; - } - else { + } else { ioCompressor.reset(new QtIOCompressor(&hashedStream)); ioCompressor->setStreamFormat(QtIOCompressor::GzipFormat); if (!ioCompressor->open(QIODevice::WriteOnly)) { @@ -166,8 +165,7 @@ bool Kdbx3Writer::writeData(const QByteArray& data) if (m_device->write(data) != data.size()) { raiseError(m_device->errorString()); return false; - } - else { + } else { return true; } } @@ -180,7 +178,7 @@ bool Kdbx3Writer::writeHeaderField(KeePass2::HeaderFieldID fieldId, const QByteA fieldIdArr[0] = fieldId; CHECK_RETURN_FALSE(writeData(fieldIdArr)); CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes<qint16>(static_cast<quint16>(data.size()), - KeePass2::BYTEORDER))); + KeePass2::BYTEORDER))); CHECK_RETURN_FALSE(writeData(data)); return true; diff --git a/src/format/Kdbx3Writer.h b/src/format/Kdbx3Writer.h index 6b5b8f28f..f3368eebb 100644 --- a/src/format/Kdbx3Writer.h +++ b/src/format/Kdbx3Writer.h @@ -27,9 +27,9 @@ class Database; class QIODevice; -class Kdbx3Writer : public BaseKeePass2Writer +class Kdbx3Writer: public BaseKeePass2Writer { - Q_DECLARE_TR_FUNCTIONS(Kdbx3Writer) +Q_DECLARE_TR_FUNCTIONS(Kdbx3Writer) public: Kdbx3Writer(); diff --git a/src/format/Kdbx3XmlReader.cpp b/src/format/Kdbx3XmlReader.cpp index 6f3745553..3a4bdbd9d 100644 --- a/src/format/Kdbx3XmlReader.cpp +++ b/src/format/Kdbx3XmlReader.cpp @@ -150,14 +150,12 @@ QString Kdbx3XmlReader::errorString() { if (m_error) { return m_errorStr; - } - else if (m_xml.hasError()) { + } else if (m_xml.hasError()) { return QString("XML error:\n%1\nLine %2, column %3") - .arg(m_xml.errorString()) - .arg(m_xml.lineNumber()) - .arg(m_xml.columnNumber()); - } - else { + .arg(m_xml.errorString()) + .arg(m_xml.lineNumber()) + .arg(m_xml.columnNumber()); + } else { return QString(); } } @@ -183,18 +181,15 @@ bool Kdbx3XmlReader::parseKeePassFile() while (!m_xml.error() && m_xml.readNextStartElement()) { if (m_xml.name() == "Meta") { parseMeta(); - } - else if (m_xml.name() == "Root") { + } else if (m_xml.name() == "Root") { if (rootElementFound) { rootParsedSuccessfully = false; raiseError("Multiple root elements"); - } - else { + } else { rootParsedSuccessfully = parseRoot(); rootElementFound = true; } - } - else { + } else { skipCurrentElement(); } } @@ -209,95 +204,67 @@ void Kdbx3XmlReader::parseMeta() while (!m_xml.error() && m_xml.readNextStartElement()) { if (m_xml.name() == "Generator") { m_meta->setGenerator(readString()); - } - else if (m_xml.name() == "HeaderHash") { + } else if (m_xml.name() == "HeaderHash") { m_headerHash = readBinary(); - } - else if (m_xml.name() == "DatabaseName") { + } else if (m_xml.name() == "DatabaseName") { m_meta->setName(readString()); - } - else if (m_xml.name() == "DatabaseNameChanged") { + } else if (m_xml.name() == "DatabaseNameChanged") { m_meta->setNameChanged(readDateTime()); - } - else if (m_xml.name() == "DatabaseDescription") { + } else if (m_xml.name() == "DatabaseDescription") { m_meta->setDescription(readString()); - } - else if (m_xml.name() == "DatabaseDescriptionChanged") { + } else if (m_xml.name() == "DatabaseDescriptionChanged") { m_meta->setDescriptionChanged(readDateTime()); - } - else if (m_xml.name() == "DefaultUserName") { + } else if (m_xml.name() == "DefaultUserName") { m_meta->setDefaultUserName(readString()); - } - else if (m_xml.name() == "DefaultUserNameChanged") { + } else if (m_xml.name() == "DefaultUserNameChanged") { m_meta->setDefaultUserNameChanged(readDateTime()); - } - else if (m_xml.name() == "MaintenanceHistoryDays") { + } else if (m_xml.name() == "MaintenanceHistoryDays") { m_meta->setMaintenanceHistoryDays(readNumber()); - } - else if (m_xml.name() == "Color") { + } else if (m_xml.name() == "Color") { m_meta->setColor(readColor()); - } - else if (m_xml.name() == "MasterKeyChanged") { + } else if (m_xml.name() == "MasterKeyChanged") { m_meta->setMasterKeyChanged(readDateTime()); - } - else if (m_xml.name() == "MasterKeyChangeRec") { + } else if (m_xml.name() == "MasterKeyChangeRec") { m_meta->setMasterKeyChangeRec(readNumber()); - } - else if (m_xml.name() == "MasterKeyChangeForce") { + } else if (m_xml.name() == "MasterKeyChangeForce") { m_meta->setMasterKeyChangeForce(readNumber()); - } - else if (m_xml.name() == "MemoryProtection") { + } else if (m_xml.name() == "MemoryProtection") { parseMemoryProtection(); - } - else if (m_xml.name() == "CustomIcons") { + } else if (m_xml.name() == "CustomIcons") { parseCustomIcons(); - } - else if (m_xml.name() == "RecycleBinEnabled") { + } else if (m_xml.name() == "RecycleBinEnabled") { m_meta->setRecycleBinEnabled(readBool()); - } - else if (m_xml.name() == "RecycleBinUUID") { + } else if (m_xml.name() == "RecycleBinUUID") { m_meta->setRecycleBin(getGroup(readUuid())); - } - else if (m_xml.name() == "RecycleBinChanged") { + } else if (m_xml.name() == "RecycleBinChanged") { m_meta->setRecycleBinChanged(readDateTime()); - } - else if (m_xml.name() == "EntryTemplatesGroup") { + } else if (m_xml.name() == "EntryTemplatesGroup") { m_meta->setEntryTemplatesGroup(getGroup(readUuid())); - } - else if (m_xml.name() == "EntryTemplatesGroupChanged") { + } else if (m_xml.name() == "EntryTemplatesGroupChanged") { m_meta->setEntryTemplatesGroupChanged(readDateTime()); - } - else if (m_xml.name() == "LastSelectedGroup") { + } else if (m_xml.name() == "LastSelectedGroup") { m_meta->setLastSelectedGroup(getGroup(readUuid())); - } - else if (m_xml.name() == "LastTopVisibleGroup") { + } else if (m_xml.name() == "LastTopVisibleGroup") { m_meta->setLastTopVisibleGroup(getGroup(readUuid())); - } - else if (m_xml.name() == "HistoryMaxItems") { + } else if (m_xml.name() == "HistoryMaxItems") { int value = readNumber(); if (value >= -1) { m_meta->setHistoryMaxItems(value); - } - else { + } else { raiseError("HistoryMaxItems invalid number"); } - } - else if (m_xml.name() == "HistoryMaxSize") { + } else if (m_xml.name() == "HistoryMaxSize") { int value = readNumber(); if (value >= -1) { m_meta->setHistoryMaxSize(value); - } - else { + } else { raiseError("HistoryMaxSize invalid number"); } - } - else if (m_xml.name() == "Binaries") { + } else if (m_xml.name() == "Binaries") { parseBinaries(); - } - else if (m_xml.name() == "CustomData") { + } else if (m_xml.name() == "CustomData") { parseCustomData(); - } - else { + } else { skipCurrentElement(); } } @@ -310,20 +277,15 @@ void Kdbx3XmlReader::parseMemoryProtection() while (!m_xml.error() && m_xml.readNextStartElement()) { if (m_xml.name() == "ProtectTitle") { m_meta->setProtectTitle(readBool()); - } - else if (m_xml.name() == "ProtectUserName") { + } else if (m_xml.name() == "ProtectUserName") { m_meta->setProtectUsername(readBool()); - } - else if (m_xml.name() == "ProtectPassword") { + } else if (m_xml.name() == "ProtectPassword") { m_meta->setProtectPassword(readBool()); - } - else if (m_xml.name() == "ProtectURL") { + } else if (m_xml.name() == "ProtectURL") { m_meta->setProtectUrl(readBool()); - } - else if (m_xml.name() == "ProtectNotes") { + } else if (m_xml.name() == "ProtectNotes") { m_meta->setProtectNotes(readBool()); - } - else { + } else { skipCurrentElement(); } } @@ -336,8 +298,7 @@ void Kdbx3XmlReader::parseCustomIcons() while (!m_xml.error() && m_xml.readNextStartElement()) { if (m_xml.name() == "Icon") { parseIcon(); - } - else { + } else { skipCurrentElement(); } } @@ -356,20 +317,17 @@ void Kdbx3XmlReader::parseIcon() if (m_xml.name() == "UUID") { uuid = readUuid(); uuidSet = !uuid.isNull(); - } - else if (m_xml.name() == "Data") { + } else if (m_xml.name() == "Data") { icon.loadFromData(readBinary()); iconSet = true; - } - else { + } else { skipCurrentElement(); } } if (uuidSet && iconSet) { m_meta->addCustomIcon(uuid, icon); - } - else { + } else { raiseError("Missing icon uuid or data"); } } @@ -387,8 +345,7 @@ void Kdbx3XmlReader::parseBinaries() QByteArray data; if (attr.value("Compressed").compare(QLatin1String("True"), Qt::CaseInsensitive) == 0) { data = readCompressedBinary(); - } - else { + } else { data = readBinary(); } @@ -398,8 +355,7 @@ void Kdbx3XmlReader::parseBinaries() } m_binaryPool.insert(id, data); - } - else { + } else { skipCurrentElement(); } } @@ -412,8 +368,7 @@ void Kdbx3XmlReader::parseCustomData() while (!m_xml.error() && m_xml.readNextStartElement()) { if (m_xml.name() == "Item") { parseCustomDataItem(); - } - else { + } else { skipCurrentElement(); } } @@ -432,20 +387,17 @@ void Kdbx3XmlReader::parseCustomDataItem() if (m_xml.name() == "Key") { key = readString(); keySet = true; - } - else if (m_xml.name() == "Value") { + } else if (m_xml.name() == "Value") { value = readString(); valueSet = true; - } - else { + } else { skipCurrentElement(); } } if (keySet && valueSet) { m_meta->addCustomField(key, value); - } - else { + } else { raiseError("Missing custom data key or value"); } } @@ -474,11 +426,9 @@ bool Kdbx3XmlReader::parseRoot() } groupElementFound = true; - } - else if (m_xml.name() == "DeletedObjects") { + } else if (m_xml.name() == "DeletedObjects") { parseDeletedObjects(); - } - else { + } else { skipCurrentElement(); } } @@ -500,99 +450,77 @@ Group* Kdbx3XmlReader::parseGroup() if (uuid.isNull()) { if (m_strictMode) { raiseError("Null group uuid"); - } - else { + } else { group->setUuid(Uuid::random()); } - } - else { + } else { group->setUuid(uuid); } - } - else if (m_xml.name() == "Name") { + } else if (m_xml.name() == "Name") { group->setName(readString()); - } - else if (m_xml.name() == "Notes") { + } else if (m_xml.name() == "Notes") { group->setNotes(readString()); - } - else if (m_xml.name() == "IconID") { + } else if (m_xml.name() == "IconID") { int iconId = readNumber(); if (iconId < 0) { if (m_strictMode) { raiseError("Invalid group icon number"); } iconId = 0; - } - else { + } else { if (iconId >= DatabaseIcons::IconCount) { qWarning("Kdbx3XmlReader::parseGroup: icon id \"%d\" not supported", iconId); } group->setIcon(iconId); } - } - else if (m_xml.name() == "CustomIconUUID") { + } else if (m_xml.name() == "CustomIconUUID") { Uuid uuid = readUuid(); if (!uuid.isNull()) { group->setIcon(uuid); } - } - else if (m_xml.name() == "Times") { + } else if (m_xml.name() == "Times") { group->setTimeInfo(parseTimes()); - } - else if (m_xml.name() == "IsExpanded") { + } else if (m_xml.name() == "IsExpanded") { group->setExpanded(readBool()); - } - else if (m_xml.name() == "DefaultAutoTypeSequence") { + } else if (m_xml.name() == "DefaultAutoTypeSequence") { group->setDefaultAutoTypeSequence(readString()); - } - else if (m_xml.name() == "EnableAutoType") { + } else if (m_xml.name() == "EnableAutoType") { QString str = readString(); if (str.compare("null", Qt::CaseInsensitive) == 0) { group->setAutoTypeEnabled(Group::Inherit); - } - else if (str.compare("true", Qt::CaseInsensitive) == 0) { + } else if (str.compare("true", Qt::CaseInsensitive) == 0) { group->setAutoTypeEnabled(Group::Enable); - } - else if (str.compare("false", Qt::CaseInsensitive) == 0) { + } else if (str.compare("false", Qt::CaseInsensitive) == 0) { group->setAutoTypeEnabled(Group::Disable); - } - else { + } else { raiseError("Invalid EnableAutoType value"); } - } - else if (m_xml.name() == "EnableSearching") { + } else if (m_xml.name() == "EnableSearching") { QString str = readString(); if (str.compare("null", Qt::CaseInsensitive) == 0) { group->setSearchingEnabled(Group::Inherit); - } - else if (str.compare("true", Qt::CaseInsensitive) == 0) { + } else if (str.compare("true", Qt::CaseInsensitive) == 0) { group->setSearchingEnabled(Group::Enable); - } - else if (str.compare("false", Qt::CaseInsensitive) == 0) { + } else if (str.compare("false", Qt::CaseInsensitive) == 0) { group->setSearchingEnabled(Group::Disable); - } - else { + } else { raiseError("Invalid EnableSearching value"); } - } - else if (m_xml.name() == "LastTopVisibleEntry") { + } else if (m_xml.name() == "LastTopVisibleEntry") { group->setLastTopVisibleEntry(getEntry(readUuid())); - } - else if (m_xml.name() == "Group") { + } else if (m_xml.name() == "Group") { Group* newGroup = parseGroup(); if (newGroup) { children.append(newGroup); } - } - else if (m_xml.name() == "Entry") { + } else if (m_xml.name() == "Entry") { Entry* newEntry = parseEntry(false); if (newEntry) { entries.append(newEntry); } - } - else { + } else { skipCurrentElement(); } } @@ -607,8 +535,7 @@ Group* Kdbx3XmlReader::parseGroup() group->copyDataFrom(tmpGroup); group->setUpdateTimeinfo(false); delete tmpGroup; - } - else if (!hasError()) { + } else if (!hasError()) { raiseError("No group uuid found"); } @@ -630,8 +557,7 @@ void Kdbx3XmlReader::parseDeletedObjects() while (!m_xml.error() && m_xml.readNextStartElement()) { if (m_xml.name() == "DeletedObject") { parseDeletedObject(); - } - else { + } else { skipCurrentElement(); } } @@ -650,23 +576,19 @@ void Kdbx3XmlReader::parseDeletedObject() if (m_strictMode) { raiseError("Null DeleteObject uuid"); } - } - else { + } else { delObj.uuid = uuid; } - } - else if (m_xml.name() == "DeletionTime") { + } else if (m_xml.name() == "DeletionTime") { delObj.deletionTime = readDateTime(); - } - else { + } else { skipCurrentElement(); } } if (!delObj.uuid.isNull() && !delObj.deletionTime.isNull()) { m_db->addDeletedObject(delObj); - } - else if (m_strictMode) { + } else if (m_strictMode) { raiseError("Missing DeletedObject uuid or time"); } } @@ -686,69 +608,53 @@ Entry* Kdbx3XmlReader::parseEntry(bool history) if (uuid.isNull()) { if (m_strictMode) { raiseError("Null entry uuid"); - } - else { + } else { entry->setUuid(Uuid::random()); } - } - else { + } else { entry->setUuid(uuid); } - } - else if (m_xml.name() == "IconID") { + } else if (m_xml.name() == "IconID") { int iconId = readNumber(); if (iconId < 0) { if (m_strictMode) { raiseError("Invalid entry icon number"); } iconId = 0; - } - else { + } else { entry->setIcon(iconId); } - } - else if (m_xml.name() == "CustomIconUUID") { + } else if (m_xml.name() == "CustomIconUUID") { Uuid uuid = readUuid(); if (!uuid.isNull()) { entry->setIcon(uuid); } - } - else if (m_xml.name() == "ForegroundColor") { + } else if (m_xml.name() == "ForegroundColor") { entry->setForegroundColor(readColor()); - } - else if (m_xml.name() == "BackgroundColor") { + } else if (m_xml.name() == "BackgroundColor") { entry->setBackgroundColor(readColor()); - } - else if (m_xml.name() == "OverrideURL") { + } else if (m_xml.name() == "OverrideURL") { entry->setOverrideUrl(readString()); - } - else if (m_xml.name() == "Tags") { + } else if (m_xml.name() == "Tags") { entry->setTags(readString()); - } - else if (m_xml.name() == "Times") { + } else if (m_xml.name() == "Times") { entry->setTimeInfo(parseTimes()); - } - else if (m_xml.name() == "String") { + } else if (m_xml.name() == "String") { parseEntryString(entry); - } - else if (m_xml.name() == "Binary") { + } else if (m_xml.name() == "Binary") { QPair<QString, QString> ref = parseEntryBinary(entry); if (!ref.first.isNull() && !ref.second.isNull()) { binaryRefs.append(ref); } - } - else if (m_xml.name() == "AutoType") { + } else if (m_xml.name() == "AutoType") { parseAutoType(entry); - } - else if (m_xml.name() == "History") { + } else if (m_xml.name() == "History") { if (history) { raiseError("History element in history entry"); - } - else { + } else { historyItems = parseEntryHistory(); } - } - else { + } else { skipCurrentElement(); } } @@ -760,8 +666,7 @@ Entry* Kdbx3XmlReader::parseEntry(bool history) if (!entry->uuid().isNull()) { if (history) { entry->setUpdateTimeinfo(false); - } - else { + } else { Entry* tmpEntry = entry; entry = getEntry(tmpEntry->uuid()); @@ -770,8 +675,7 @@ Entry* Kdbx3XmlReader::parseEntry(bool history) delete tmpEntry; } - } - else if (!hasError()) { + } else if (!hasError()) { raiseError("No entry uuid found"); } @@ -807,8 +711,7 @@ void Kdbx3XmlReader::parseEntryString(Entry* entry) if (m_xml.name() == "Key") { key = readString(); keySet = true; - } - else if (m_xml.name() == "Value") { + } else if (m_xml.name() == "Value") { QXmlStreamAttributes attr = m_xml.attributes(); value = readString(); @@ -823,20 +726,17 @@ void Kdbx3XmlReader::parseEntryString(Entry* entry) if (!ok) { value.clear(); raiseError(m_randomStream->errorString()); - } - else { + } else { value = QString::fromUtf8(plaintext); } - } - else { + } else { raiseError("Unable to decrypt entry string"); } } protect = isProtected || protectInMemory; valueSet = true; - } - else { + } else { skipCurrentElement(); } } @@ -845,12 +745,10 @@ void Kdbx3XmlReader::parseEntryString(Entry* entry) // the default attributes are always there so additionally check if it's empty if (entry->attributes()->hasKey(key) && !entry->attributes()->value(key).isEmpty()) { raiseError("Duplicate custom attribute found"); - } - else { + } else { entry->attributes()->set(key, value, protect); } - } - else { + } else { raiseError("Entry string key or value missing"); } } @@ -870,19 +768,17 @@ QPair<QString, QString> Kdbx3XmlReader::parseEntryBinary(Entry* entry) if (m_xml.name() == "Key") { key = readString(); keySet = true; - } - else if (m_xml.name() == "Value") { + } else if (m_xml.name() == "Value") { QXmlStreamAttributes attr = m_xml.attributes(); if (attr.hasAttribute("Ref")) { poolRef = qMakePair(attr.value("Ref").toString(), key); m_xml.skipCurrentElement(); - } - else { + } else { // format compatibility value = readBinary(); bool isProtected = attr.hasAttribute("Protected") - && (attr.value("Protected") == "True"); + && (attr.value("Protected") == "True"); if (isProtected && !value.isEmpty()) { if (!m_randomStream->processInPlace(value)) { @@ -892,8 +788,7 @@ QPair<QString, QString> Kdbx3XmlReader::parseEntryBinary(Entry* entry) } valueSet = true; - } - else { + } else { skipCurrentElement(); } } @@ -901,12 +796,10 @@ QPair<QString, QString> Kdbx3XmlReader::parseEntryBinary(Entry* entry) if (keySet && valueSet) { if (entry->attachments()->hasKey(key)) { raiseError("Duplicate attachment found"); - } - else { + } else { entry->attachments()->set(key, value); } - } - else { + } else { raiseError("Entry binary key or value missing"); } @@ -920,17 +813,13 @@ void Kdbx3XmlReader::parseAutoType(Entry* entry) while (!m_xml.error() && m_xml.readNextStartElement()) { if (m_xml.name() == "Enabled") { entry->setAutoTypeEnabled(readBool()); - } - else if (m_xml.name() == "DataTransferObfuscation") { + } else if (m_xml.name() == "DataTransferObfuscation") { entry->setAutoTypeObfuscation(readNumber()); - } - else if (m_xml.name() == "DefaultSequence") { + } else if (m_xml.name() == "DefaultSequence") { entry->setDefaultAutoTypeSequence(readString()); - } - else if (m_xml.name() == "Association") { + } else if (m_xml.name() == "Association") { parseAutoTypeAssoc(entry); - } - else { + } else { skipCurrentElement(); } } @@ -948,20 +837,17 @@ void Kdbx3XmlReader::parseAutoTypeAssoc(Entry* entry) if (m_xml.name() == "Window") { assoc.window = readString(); windowSet = true; - } - else if (m_xml.name() == "KeystrokeSequence") { + } else if (m_xml.name() == "KeystrokeSequence") { assoc.sequence = readString(); sequenceSet = true; - } - else { + } else { skipCurrentElement(); } } if (windowSet && sequenceSet) { entry->autoTypeAssociations()->add(assoc); - } - else { + } else { raiseError("Auto-type association window or sequence missing"); } } @@ -975,8 +861,7 @@ QList<Entry*> Kdbx3XmlReader::parseEntryHistory() while (!m_xml.error() && m_xml.readNextStartElement()) { if (m_xml.name() == "Entry") { historyItems.append(parseEntry(true)); - } - else { + } else { skipCurrentElement(); } } @@ -992,26 +877,19 @@ TimeInfo Kdbx3XmlReader::parseTimes() while (!m_xml.error() && m_xml.readNextStartElement()) { if (m_xml.name() == "LastModificationTime") { timeInfo.setLastModificationTime(readDateTime()); - } - else if (m_xml.name() == "CreationTime") { + } else if (m_xml.name() == "CreationTime") { timeInfo.setCreationTime(readDateTime()); - } - else if (m_xml.name() == "LastAccessTime") { + } else if (m_xml.name() == "LastAccessTime") { timeInfo.setLastAccessTime(readDateTime()); - } - else if (m_xml.name() == "ExpiryTime") { + } else if (m_xml.name() == "ExpiryTime") { timeInfo.setExpiryTime(readDateTime()); - } - else if (m_xml.name() == "Expires") { + } else if (m_xml.name() == "Expires") { timeInfo.setExpires(readBool()); - } - else if (m_xml.name() == "UsageCount") { + } else if (m_xml.name() == "UsageCount") { timeInfo.setUsageCount(readNumber()); - } - else if (m_xml.name() == "LocationChanged") { + } else if (m_xml.name() == "LocationChanged") { timeInfo.setLocationChanged(readDateTime()); - } - else { + } else { skipCurrentElement(); } } @@ -1030,14 +908,11 @@ bool Kdbx3XmlReader::readBool() if (str.compare("True", Qt::CaseInsensitive) == 0) { return true; - } - else if (str.compare("False", Qt::CaseInsensitive) == 0) { + } else if (str.compare("False", Qt::CaseInsensitive) == 0) { return false; - } - else if (str.length() == 0) { + } else if (str.length() == 0) { return false; - } - else { + } else { raiseError("Invalid bool value"); return false; } @@ -1051,8 +926,7 @@ QDateTime Kdbx3XmlReader::readDateTime() if (!dt.isValid()) { if (m_strictMode) { raiseError("Invalid date time value"); - } - else { + } else { dt = QDateTime::currentDateTimeUtc(); } } @@ -1077,7 +951,7 @@ QColor Kdbx3XmlReader::readColor() QColor color; for (int i = 0; i <= 2; i++) { - QString rgbPartStr = colorStr.mid(1 + 2*i, 2); + QString rgbPartStr = colorStr.mid(1 + 2 * i, 2); bool ok; int rgbPart = rgbPartStr.toInt(&ok, 16); if (!ok || rgbPart > 255) { @@ -1089,11 +963,9 @@ QColor Kdbx3XmlReader::readColor() if (i == 0) { color.setRed(rgbPart); - } - else if (i == 1) { + } else if (i == 1) { color.setGreen(rgbPart); - } - else { + } else { color.setBlue(rgbPart); } } @@ -1116,14 +988,12 @@ Uuid Kdbx3XmlReader::readUuid() QByteArray uuidBin = readBinary(); if (uuidBin.isEmpty()) { return Uuid(); - } - else if (uuidBin.length() != Uuid::Length) { + } else if (uuidBin.length() != Uuid::Length) { if (m_strictMode) { raiseError("Invalid uuid value"); } return Uuid(); - } - else { + } else { return Uuid(uuidBin); } } @@ -1159,8 +1029,7 @@ Group* Kdbx3XmlReader::getGroup(const Uuid& uuid) if (m_groups.contains(uuid)) { return m_groups.value(uuid); - } - else { + } else { Group* group = new Group(); group->setUpdateTimeinfo(false); group->setUuid(uuid); @@ -1178,8 +1047,7 @@ Entry* Kdbx3XmlReader::getEntry(const Uuid& uuid) if (m_entries.contains(uuid)) { return m_entries.value(uuid); - } - else { + } else { Entry* entry = new Entry(); entry->setUpdateTimeinfo(false); entry->setUuid(uuid); diff --git a/src/format/Kdbx3XmlReader.h b/src/format/Kdbx3XmlReader.h index 1837aaab6..477eb3865 100644 --- a/src/format/Kdbx3XmlReader.h +++ b/src/format/Kdbx3XmlReader.h @@ -36,7 +36,7 @@ class Metadata; class Kdbx3XmlReader { - Q_DECLARE_TR_FUNCTIONS(Kdbx3XmlReader) +Q_DECLARE_TR_FUNCTIONS(Kdbx3XmlReader) public: Kdbx3XmlReader(); diff --git a/src/format/Kdbx3XmlWriter.cpp b/src/format/Kdbx3XmlWriter.cpp index ff9262a01..40c20e65c 100644 --- a/src/format/Kdbx3XmlWriter.cpp +++ b/src/format/Kdbx3XmlWriter.cpp @@ -36,7 +36,7 @@ Kdbx3XmlWriter::Kdbx3XmlWriter() } void Kdbx3XmlWriter::writeDatabase(QIODevice* device, Database* db, KeePass2RandomStream* randomStream, - const QByteArray& headerHash) + const QByteArray& headerHash) { m_db = db; m_meta = db->metadata(); @@ -66,7 +66,7 @@ void Kdbx3XmlWriter::writeDatabase(QIODevice* device, Database* db, KeePass2Rand void Kdbx3XmlWriter::writeDatabase(const QString& filename, Database* db) { QFile file(filename); - file.open(QIODevice::WriteOnly|QIODevice::Truncate); + file.open(QIODevice::WriteOnly | QIODevice::Truncate); writeDatabase(&file, db); } @@ -202,8 +202,7 @@ void Kdbx3XmlWriter::writeBinaries() buffer.seek(0); data = buffer.readAll(); - } - else { + } else { data = i.key(); } @@ -346,12 +345,12 @@ void Kdbx3XmlWriter::writeEntry(const Entry* entry) for (const QString& key : attributesKeyList) { m_xml.writeStartElement("String"); - bool protect = ( ((key == "Title") && m_meta->protectTitle()) || - ((key == "UserName") && m_meta->protectUsername()) || - ((key == "Password") && m_meta->protectPassword()) || - ((key == "URL") && m_meta->protectUrl()) || - ((key == "Notes") && m_meta->protectNotes()) || - entry->attributes()->isProtected(key) ); + bool protect = (((key == "Title") && m_meta->protectTitle()) || + ((key == "UserName") && m_meta->protectUsername()) || + ((key == "Password") && m_meta->protectPassword()) || + ((key == "URL") && m_meta->protectUrl()) || + ((key == "Notes") && m_meta->protectNotes()) || + entry->attributes()->isProtected(key)); writeString("Key", key); @@ -367,13 +366,11 @@ void Kdbx3XmlWriter::writeEntry(const Entry* entry) raiseError(m_randomStream->errorString()); } value = QString::fromLatin1(rawData.toBase64()); - } - else { + } else { m_xml.writeAttribute("ProtectInMemory", "True"); value = entry->attributes()->value(key); } - } - else { + } else { value = entry->attributes()->value(key); } @@ -449,8 +446,7 @@ void Kdbx3XmlWriter::writeString(const QString& qualifiedName, const QString& st { if (string.isEmpty()) { m_xml.writeEmptyElement(qualifiedName); - } - else { + } else { m_xml.writeTextElement(qualifiedName, stripInvalidXml10Chars(string)); } } @@ -464,8 +460,7 @@ void Kdbx3XmlWriter::writeBool(const QString& qualifiedName, bool b) { if (b) { writeString(qualifiedName, "True"); - } - else { + } else { writeString(qualifiedName, "False"); } } @@ -494,8 +489,7 @@ void Kdbx3XmlWriter::writeUuid(const QString& qualifiedName, const Group* group) { if (group) { writeUuid(qualifiedName, group->uuid()); - } - else { + } else { writeUuid(qualifiedName, Uuid()); } } @@ -504,8 +498,7 @@ void Kdbx3XmlWriter::writeUuid(const QString& qualifiedName, const Entry* entry) { if (entry) { writeUuid(qualifiedName, entry->uuid()); - } - else { + } else { writeUuid(qualifiedName, Uuid()); } } @@ -520,9 +513,9 @@ void Kdbx3XmlWriter::writeColor(const QString& qualifiedName, const QColor& colo QString colorStr; if (color.isValid()) { - colorStr = QString("#%1%2%3").arg(colorPartToString(color.red()), - colorPartToString(color.green()), - colorPartToString(color.blue())); + colorStr = QString("#%1%2%3").arg(colorPartToString(color.red()), + colorPartToString(color.green()), + colorPartToString(color.blue())); } writeString(qualifiedName, colorStr); @@ -534,11 +527,9 @@ void Kdbx3XmlWriter::writeTriState(const QString& qualifiedName, Group::TriState if (triState == Group::Inherit) { value = "null"; - } - else if (triState == Group::Enable) { + } else if (triState == Group::Enable) { value = "true"; - } - else { + } else { value = "false"; } @@ -564,13 +555,12 @@ QString Kdbx3XmlWriter::stripInvalidXml10Chars(QString str) if (ch.isLowSurrogate() && i != 0 && str.at(i - 1).isHighSurrogate()) { // keep valid surrogate pair i--; - } - else if ((uc < 0x20 && uc != 0x09 && uc != 0x0A && uc != 0x0D) // control characters - || (uc >= 0x7F && uc <= 0x84) // control characters, valid but discouraged by XML - || (uc >= 0x86 && uc <= 0x9F) // control characters, valid but discouraged by XML - || (uc > 0xFFFD) // noncharacter - || ch.isLowSurrogate() // single low surrogate - || ch.isHighSurrogate()) // single high surrogate + } else if ((uc < 0x20 && uc != 0x09 && uc != 0x0A && uc != 0x0D) // control characters + || (uc >= 0x7F && uc <= 0x84) // control characters, valid but discouraged by XML + || (uc >= 0x86 && uc <= 0x9F) // control characters, valid but discouraged by XML + || (uc > 0xFFFD) // noncharacter + || ch.isLowSurrogate() // single low surrogate + || ch.isHighSurrogate()) // single high surrogate { qWarning("Stripping invalid XML 1.0 codepoint %x", uc); str.remove(i, 1); diff --git a/src/format/KeePass2.cpp b/src/format/KeePass2.cpp index 8cf3df555..e79dff513 100644 --- a/src/format/KeePass2.cpp +++ b/src/format/KeePass2.cpp @@ -48,24 +48,24 @@ Kdf* KeePass2::uuidToKdf(const Uuid& uuid) { Uuid KeePass2::kdfToUuid(const Kdf& kdf) { switch (kdf.type()) { - case Kdf::Type::AES: - return KDF_AES; - default: - return Uuid(); + case Kdf::Type::AES: + return KDF_AES; + default: + return Uuid(); } } KeePass2::ProtectedStreamAlgo KeePass2::idToProtectedStreamAlgo(quint32 id) { switch (id) { - case static_cast<quint32>(KeePass2::ArcFourVariant): - return KeePass2::ArcFourVariant; - case static_cast<quint32>(KeePass2::Salsa20): - return KeePass2::Salsa20; - case static_cast<quint32>(KeePass2::ChaCha20): - return KeePass2::ChaCha20; - default: - return KeePass2::InvalidProtectedStreamAlgo; + case static_cast<quint32>(KeePass2::ArcFourVariant): + return KeePass2::ArcFourVariant; + case static_cast<quint32>(KeePass2::Salsa20): + return KeePass2::Salsa20; + case static_cast<quint32>(KeePass2::ChaCha20): + return KeePass2::ChaCha20; + default: + return KeePass2::InvalidProtectedStreamAlgo; } } diff --git a/src/format/KeePass2RandomStream.cpp b/src/format/KeePass2RandomStream.cpp index 5f80fc151..9e3d4cbce 100644 --- a/src/format/KeePass2RandomStream.cpp +++ b/src/format/KeePass2RandomStream.cpp @@ -29,16 +29,16 @@ KeePass2RandomStream::KeePass2RandomStream(KeePass2::ProtectedStreamAlgo algo) bool KeePass2RandomStream::init(const QByteArray& key) { switch (m_cipher.algorithm()) { - case SymmetricCipher::Salsa20: - return m_cipher.init(CryptoHash::hash(key, CryptoHash::Sha256), - KeePass2::INNER_STREAM_SALSA20_IV); - case SymmetricCipher::ChaCha20: { - QByteArray keyIv = CryptoHash::hash(key, CryptoHash::Sha512); - return m_cipher.init(keyIv.left(32), keyIv.mid(32, 12)); - } - default: - qWarning("Invalid stream algorithm (%d)", m_cipher.algorithm()); - break; + case SymmetricCipher::Salsa20: + return m_cipher.init(CryptoHash::hash(key, CryptoHash::Sha256), + KeePass2::INNER_STREAM_SALSA20_IV); + case SymmetricCipher::ChaCha20: { + QByteArray keyIv = CryptoHash::hash(key, CryptoHash::Sha512); + return m_cipher.init(keyIv.left(32), keyIv.mid(32, 12)); + } + default: + qWarning("Invalid stream algorithm (%d)", m_cipher.algorithm()); + break; } return false; } diff --git a/src/streams/HmacBlockStream.cpp b/src/streams/HmacBlockStream.cpp index 40c5fc547..677921a60 100644 --- a/src/streams/HmacBlockStream.cpp +++ b/src/streams/HmacBlockStream.cpp @@ -1,5 +1,5 @@ /* -* Copyright (C) 2017 KeePassXC Team +* Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,7 +24,7 @@ const QSysInfo::Endian HmacBlockStream::ByteOrder = QSysInfo::LittleEndian; HmacBlockStream::HmacBlockStream(QIODevice* baseDevice, QByteArray key) : LayeredStream(baseDevice) - , m_blockSize(1024*1024) + , m_blockSize(1024 * 1024) , m_key(key) { init(); @@ -94,8 +94,7 @@ qint64 HmacBlockStream::readData(char* data, qint64 maxSize) { if (m_error) { return -1; - } - else if (m_eof) { + } else if (m_eof) { return 0; } @@ -107,8 +106,7 @@ qint64 HmacBlockStream::readData(char* data, qint64 maxSize) if (!readHashedBlock()) { if (m_error) { return -1; - } - else { + } else { return maxSize - bytesRemaining; } } @@ -204,8 +202,7 @@ qint64 HmacBlockStream::writeData(const char* data, qint64 maxSize) if (!writeHashedBlock()) { if (m_error) { return -1; - } - else { + } else { return maxSize - bytesRemaining; } } @@ -249,11 +246,13 @@ bool HmacBlockStream::writeHashedBlock() return true; } -QByteArray HmacBlockStream::getCurrentHmacKey() const { +QByteArray HmacBlockStream::getCurrentHmacKey() const +{ return getHmacKey(m_blockIndex, m_key); } -QByteArray HmacBlockStream::getHmacKey(quint64 blockIndex, QByteArray key) { +QByteArray HmacBlockStream::getHmacKey(quint64 blockIndex, QByteArray key) +{ Q_ASSERT(key.size() == 64); QByteArray indexBytes = Endian::sizedIntToBytes<quint64>(blockIndex, ByteOrder); CryptoHash hasher(CryptoHash::Sha512); @@ -262,6 +261,7 @@ QByteArray HmacBlockStream::getHmacKey(quint64 blockIndex, QByteArray key) { return hasher.result(); } -bool HmacBlockStream::atEnd() const { +bool HmacBlockStream::atEnd() const +{ return m_eof; } diff --git a/src/streams/HmacBlockStream.h b/src/streams/HmacBlockStream.h index eecd8fe92..592cf844c 100644 --- a/src/streams/HmacBlockStream.h +++ b/src/streams/HmacBlockStream.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 2017 KeePassXC Team +* Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,9 +22,9 @@ #include "streams/LayeredStream.h" -class HmacBlockStream : public LayeredStream +class HmacBlockStream: public LayeredStream { - Q_OBJECT +Q_OBJECT public: explicit HmacBlockStream(QIODevice* baseDevice, QByteArray key); From d00ccd2eb5016dec4be962385e61d5bccd606ce1 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sun, 17 Dec 2017 14:49:46 +0100 Subject: [PATCH 227/402] Add AsyncTask helper functions --- src/CMakeLists.txt | 1 + src/core/AsyncTask.h | 63 ++++++++++++++++++++++++++++++ src/gui/DatabaseSettingsWidget.cpp | 25 ++++-------- src/gui/DatabaseSettingsWidget.h | 11 +++--- 4 files changed, 77 insertions(+), 23 deletions(-) create mode 100644 src/core/AsyncTask.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5172ea0ba..1908cea09 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -38,6 +38,7 @@ configure_file(version.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/version.h @ONLY) set(keepassx_SOURCES core/AutoTypeAssociations.cpp + core/AsyncTask.h core/Config.cpp core/CsvParser.cpp core/Database.cpp diff --git a/src/core/AsyncTask.h b/src/core/AsyncTask.h new file mode 100644 index 000000000..67cab1609 --- /dev/null +++ b/src/core/AsyncTask.h @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef KEEPASSXC_ASYNCTASK_HPP +#define KEEPASSXC_ASYNCTASK_HPP + +#include <QFuture> +#include <QFutureWatcher> +#include <QtConcurrent> + + +/** + * Asynchronously run computations outside the GUI thread. + */ +namespace AsyncTask +{ + +/** + * Wait for the given future without blocking the event loop. + * + * @param future future to wait for + * @return async task result + */ +template<typename FunctionObject> +typename std::result_of<FunctionObject()>::type waitForFuture(QFuture<typename std::result_of<FunctionObject()>::type> future) +{ + QEventLoop loop; + QFutureWatcher<typename std::result_of<FunctionObject()>::type> watcher; + QObject::connect(&watcher, SIGNAL(finished()), &loop, SLOT(quit())); + watcher.setFuture(future); + loop.exec(); + return future.result(); +} + +/** + * Run a given task and wait for it to finish without blocking the event loop. + * + * @param task std::function object to run + * @return async task result + */ +template<typename FunctionObject> +typename std::result_of<FunctionObject()>::type runAndWaitForFuture(FunctionObject task) +{ + return waitForFuture<FunctionObject>(QtConcurrent::run(task)); +} + +}; // namespace AsyncTask + +#endif //KEEPASSXC_ASYNCTASK_HPP diff --git a/src/gui/DatabaseSettingsWidget.cpp b/src/gui/DatabaseSettingsWidget.cpp index 5f1dfeedf..ce1fb8dbb 100644 --- a/src/gui/DatabaseSettingsWidget.cpp +++ b/src/gui/DatabaseSettingsWidget.cpp @@ -18,28 +18,18 @@ #include "DatabaseSettingsWidget.h" #include "ui_DatabaseSettingsWidget.h" -#include <QList> -#include <QLabel> -#include <QPushButton> -#include <QHBoxLayout> -#include <QSpinBox> #include <QMessageBox> -#include <QDialogButtonBox> +#include "core/AsyncTask.h" #include "core/Database.h" #include "core/Group.h" #include "core/Metadata.h" #include "crypto/SymmetricCipher.h" -#include "format/KeePass2.h" -#include "keys/CompositeKey.h" -#include "format/KeePass2.h" -#include "crypto/kdf/Kdf.h" #include "MessageBox.h" DatabaseSettingsWidget::DatabaseSettingsWidget(QWidget* parent) : DialogyWidget(parent) , m_ui(new Ui::DatabaseSettingsWidget()) - , m_benchmarkField(nullptr) , m_db(nullptr) { m_ui->setupUi(this); @@ -51,6 +41,7 @@ DatabaseSettingsWidget::DatabaseSettingsWidget(QWidget* parent) connect(m_ui->historyMaxSizeCheckBox, SIGNAL(toggled(bool)), m_ui->historyMaxSizeSpinBox, SLOT(setEnabled(bool))); connect(m_ui->kdfComboBox, SIGNAL(currentIndexChanged(int)), SLOT(changeKdf(int))); + connect(m_ui->transformBenchmarkButton, SIGNAL(clicked()), SLOT(transformRoundsBenchmark())); } DatabaseSettingsWidget::~DatabaseSettingsWidget() @@ -111,6 +102,7 @@ void DatabaseSettingsWidget::load(Database* db) } displayKdf(*m_kdf); m_ui->kdfComboBox->blockSignals(blockSignals); + m_ui->transformRoundsSpinBox->setValue(static_cast<unsigned>(m_kdf->rounds())); m_ui->dbNameEdit->setFocus(); } @@ -191,13 +183,12 @@ void DatabaseSettingsWidget::reject() void DatabaseSettingsWidget::transformRoundsBenchmark() { - if (m_benchmarkField == nullptr) { - Q_ASSERT(false); - return; - } QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); - m_benchmarkField->setValue(m_kdf->benchmark(1000)); - QApplication::restoreOverrideCursor(); + m_ui->transformRoundsSpinBox->setValue(AsyncTask::runAndWaitForFuture([this]() { + int rounds = m_kdf->benchmark(1000); + QApplication::restoreOverrideCursor(); + return rounds; + })); } void DatabaseSettingsWidget::truncateHistories() diff --git a/src/gui/DatabaseSettingsWidget.h b/src/gui/DatabaseSettingsWidget.h index a6001b892..fe8e25c6b 100644 --- a/src/gui/DatabaseSettingsWidget.h +++ b/src/gui/DatabaseSettingsWidget.h @@ -28,13 +28,14 @@ class Database; -namespace Ui { - class DatabaseSettingsWidget; +namespace Ui +{ +class DatabaseSettingsWidget; } -class DatabaseSettingsWidget : public DialogyWidget +class DatabaseSettingsWidget: public DialogyWidget { - Q_OBJECT +Q_OBJECT public: explicit DatabaseSettingsWidget(QWidget* parent = nullptr); @@ -58,8 +59,6 @@ private: const QScopedPointer<Ui::DatabaseSettingsWidget> m_ui; QList<QWidget*> m_kdfWidgets; - QList<QPair<quint32, QSpinBox*>> m_kdfFields; - QSpinBox* m_benchmarkField; QScopedPointer<Kdf> m_kdf; Database* m_db; From 15648991fc0636320804804000066a27973fb7e5 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sat, 16 Dec 2017 18:36:42 +0100 Subject: [PATCH 228/402] Refactor Kdf class, remove fields concept --- src/core/Database.cpp | 27 +-- src/core/Database.h | 12 +- src/crypto/kdf/AesKdf.cpp | 49 +---- src/crypto/kdf/AesKdf.h | 24 +-- src/crypto/kdf/Kdf.cpp | 34 +--- src/crypto/kdf/Kdf.h | 37 +--- src/format/Kdbx3Reader.cpp | 41 ++-- src/format/Kdbx3Writer.cpp | 2 +- src/format/KeePass1Reader.cpp | 2 +- src/format/KeePass2.cpp | 52 ++--- src/format/KeePass2.h | 19 +- src/gui/DatabaseSettingsWidget.cpp | 129 +++--------- src/gui/DatabaseSettingsWidget.h | 8 +- src/gui/DatabaseSettingsWidget.ui | 307 +++++++++++++++++------------ src/keys/CompositeKey.cpp | 8 - tests/TestKeePass1Reader.cpp | 3 +- tests/gui/TestGui.cpp | 2 +- 17 files changed, 282 insertions(+), 474 deletions(-) diff --git a/src/core/Database.cpp b/src/core/Database.cpp index ae22603f3..3aeaa3d26 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -33,7 +33,6 @@ #include "format/KeePass2Writer.h" #include "keys/PasswordKey.h" #include "keys/FileKey.h" -#include "keys/CompositeKey.h" QHash<Uuid, Database*> Database::m_uuidMap; @@ -45,7 +44,7 @@ Database::Database() { m_data.cipher = KeePass2::CIPHER_AES; m_data.compressionAlgo = CompressionGZip; - m_data.kdf = new AesKdf(); + m_data.kdf = QSharedPointer<AesKdf>::create(); m_data.kdf->randomizeTransformSalt(); m_data.hasKey = false; @@ -485,23 +484,18 @@ QString Database::saveToFile(QString filePath) } } -Kdf* Database::kdf() const { +QSharedPointer<Kdf> Database::kdf() const +{ return m_data.kdf; } -void Database::setKdf(Kdf* kdf) { - if (m_data.kdf == kdf) { - return; - } - - if (m_data.kdf != nullptr) { - delete m_data.kdf; - } - - m_data.kdf = kdf; +void Database::setKdf(QSharedPointer<Kdf> kdf) +{ + m_data.kdf = std::move(kdf); } -bool Database::changeKdf(Kdf* kdf) { +bool Database::changeKdf(QSharedPointer<Kdf> kdf) +{ kdf->randomizeTransformSalt(); QByteArray transformedMasterKey; if (!m_data.key.transform(*kdf, transformedMasterKey)) { @@ -514,8 +508,3 @@ bool Database::changeKdf(Kdf* kdf) { return true; } - -Database::DatabaseData::~DatabaseData() -{ - delete kdf; -} diff --git a/src/core/Database.h b/src/core/Database.h index 44854b854..c199069d3 100644 --- a/src/core/Database.h +++ b/src/core/Database.h @@ -58,17 +58,15 @@ public: Uuid cipher; CompressionAlgorithm compressionAlgo; QByteArray transformedMasterKey; - Kdf* kdf; + QSharedPointer<Kdf> kdf; CompositeKey key; bool hasKey; QByteArray masterSeed; QByteArray challengeResponseKey; - - ~DatabaseData(); }; Database(); - ~Database(); + ~Database() override; Group* rootGroup(); const Group* rootGroup() const; @@ -92,7 +90,7 @@ public: Uuid cipher() const; Database::CompressionAlgorithm compressionAlgo() const; - Kdf* kdf() const; + QSharedPointer<Kdf> kdf() const; QByteArray transformedMasterKey() const; const CompositeKey& key() const; QByteArray challengeResponseKey() const; @@ -100,7 +98,7 @@ public: void setCipher(const Uuid& cipher); void setCompressionAlgo(Database::CompressionAlgorithm algo); - void setKdf(Kdf* kdf); + void setKdf(QSharedPointer<Kdf> kdf); bool setKey(const CompositeKey& key, bool updateChangedTime = true, bool updateTransformSalt = false); bool hasKey() const; @@ -117,7 +115,7 @@ public: * Returns a unique id that is only valid as long as the Database exists. */ Uuid uuid(); - bool changeKdf(Kdf* kdf); + bool changeKdf(QSharedPointer<Kdf> kdf); static Database* databaseByUuid(const Uuid& uuid); static Database* openDatabaseFile(QString fileName, CompositeKey key); diff --git a/src/crypto/kdf/AesKdf.cpp b/src/crypto/kdf/AesKdf.cpp index a4dd75650..8d3801a5f 100644 --- a/src/crypto/kdf/AesKdf.cpp +++ b/src/crypto/kdf/AesKdf.cpp @@ -18,20 +18,10 @@ #include <QtConcurrent> #include "format/KeePass2.h" -#include "crypto/SymmetricCipher.h" #include "crypto/CryptoHash.h" #include "crypto/Random.h" #include "AesKdf.h" -const QList<Kdf::Field> AesKdf::FIELDS = AesKdf::initFields(); - -QList<Kdf::Field> AesKdf::initFields() -{ - return QList<Kdf::Field> { - Kdf::Field(static_cast<quint32>(Fields::ROUNDS), "Transform rounds", 1, UINT64_MAX, true), - }; -} - bool AesKdf::transform(const QByteArray& raw, QByteArray& result) const { QByteArray resultLeft; @@ -76,7 +66,8 @@ bool AesKdf::transformKeyRaw(const QByteArray& key, const QByteArray& seed, quin } AesKdf::AesKdf() - : m_rounds(100000ull) + : Kdf::Kdf(KeePass2::KDF_AES) + , m_rounds(100000ull) , m_seed(QByteArray(32, 0)) { } @@ -112,39 +103,9 @@ void AesKdf::randomizeTransformSalt() setSeed(randomGen()->randomArray(32)); } -Kdf::Type AesKdf::type() const +QSharedPointer<Kdf> AesKdf::clone() const { - return Kdf::Type::AES; -} - -Kdf* AesKdf::clone() const -{ - return static_cast<Kdf*>(new AesKdf(*this)); -} - -const QList<Kdf::Field> AesKdf::fields() const -{ - return FIELDS; -} - -quint64 AesKdf::field(quint32 id) const -{ - switch (static_cast<Fields>(id)) { - case Fields::ROUNDS: - return m_rounds; - default: - return 0; - } -} - -bool AesKdf::setField(quint32 id, quint64 val) -{ - switch (static_cast<Fields>(id)) { - case Fields::ROUNDS: - return setRounds(val); - default: - return false; - } + return QSharedPointer<AesKdf>::create(*this); } int AesKdf::benchmarkImpl(int msec) const @@ -170,4 +131,4 @@ int AesKdf::benchmarkImpl(int msec) const while (!t.hasExpired(msec)); return rounds; -} \ No newline at end of file +} diff --git a/src/crypto/kdf/AesKdf.h b/src/crypto/kdf/AesKdf.h index 660c022ed..28206a8d6 100644 --- a/src/crypto/kdf/AesKdf.h +++ b/src/crypto/kdf/AesKdf.h @@ -27,26 +27,13 @@ public: bool transform(const QByteArray& raw, QByteArray& result) const override; void randomizeTransformSalt() override; - Kdf::Type type() const override; - Kdf* clone() const override; + QSharedPointer<Kdf> clone() const override; - const QList<Field> fields() const override; - quint64 field(quint32 id) const override; - bool setField(quint32 id, quint64 val) override; + quint64 rounds() const override; + QByteArray seed() const override; - quint64 rounds() const; - QByteArray seed() const; - - bool setRounds(quint64 rounds); - bool setSeed(const QByteArray& seed); - - enum class Fields: quint32 - { - ROUNDS, - SEED - }; - - static const QList<Kdf::Field> FIELDS; + bool setRounds(quint64 rounds) override; + bool setSeed(const QByteArray& seed) override; protected: int benchmarkImpl(int msec) const override; @@ -59,7 +46,6 @@ private: const QByteArray& seed, quint64 rounds, QByteArray* result) Q_REQUIRED_RESULT; - static QList<Kdf::Field> initFields(); }; #endif // KEEPASSX_AESKDF_H diff --git a/src/crypto/kdf/Kdf.cpp b/src/crypto/kdf/Kdf.cpp index c1bfdf7e1..6829b650a 100644 --- a/src/crypto/kdf/Kdf.cpp +++ b/src/crypto/kdf/Kdf.cpp @@ -18,42 +18,16 @@ #include "Kdf.h" #include "Kdf_p.h" -#include <QThread> -#include <QElapsedTimer> #include <QtConcurrent> -Kdf::Field::Field(quint32 id, const QString& name, quint64 min, quint64 max, bool benchmark) - : m_id(id) - , m_name(name) - , m_min(min) - , m_max(max) - , m_benchmark(benchmark) +Kdf::Kdf(Uuid uuid) + : m_uuid(uuid) { } -quint32 Kdf::Field::id() const +Uuid Kdf::uuid() const { - return m_id; -} - -QString Kdf::Field::name() const -{ - return m_name; -} - -quint64 Kdf::Field::min() const -{ - return m_min; -} - -quint64 Kdf::Field::max() const -{ - return m_max; -} - -bool Kdf::Field::benchmarked() const -{ - return m_benchmark; + return m_uuid; } int Kdf::benchmark(int msec) const diff --git a/src/crypto/kdf/Kdf.h b/src/crypto/kdf/Kdf.h index 14ce24501..ba171dcba 100644 --- a/src/crypto/kdf/Kdf.h +++ b/src/crypto/kdf/Kdf.h @@ -25,41 +25,19 @@ class Kdf { public: - enum class Type - { - AES - }; + explicit Kdf(Uuid uuid); + virtual ~Kdf() = default; - class Field - { - public: - Field(quint32 id, const QString& name, quint64 min, quint64 max, bool benchmark = false); - - quint32 id() const; - QString name() const; - quint64 min() const; - quint64 max() const; - bool benchmarked() const; - - private: - quint32 m_id; - QString m_name; - quint64 m_min; - quint64 m_max; - bool m_benchmark; - }; - - virtual ~Kdf() {} + Uuid uuid() const; + virtual quint64 rounds() const = 0; + virtual bool setRounds(quint64 rounds) = 0; virtual QByteArray seed() const = 0; - virtual Type type() const = 0; + virtual bool setSeed(const QByteArray& seed) = 0; virtual bool transform(const QByteArray& raw, QByteArray& result) const = 0; virtual void randomizeTransformSalt() = 0; - virtual Kdf* clone() const = 0; + virtual QSharedPointer<Kdf> clone() const = 0; - virtual const QList<Field> fields() const = 0; - virtual quint64 field(quint32 id) const = 0; - virtual bool setField(quint32 id, quint64 val) = 0; virtual int benchmark(int msec) const; protected: @@ -67,6 +45,7 @@ protected: private: class BenchmarkThread; + const Uuid m_uuid; }; diff --git a/src/format/Kdbx3Reader.cpp b/src/format/Kdbx3Reader.cpp index 0ea6f817e..3c3529f95 100644 --- a/src/format/Kdbx3Reader.cpp +++ b/src/format/Kdbx3Reader.cpp @@ -318,36 +318,33 @@ void Kdbx3Reader::setTransformSeed(const QByteArray& data) { if (data.size() != 32) { raiseError("Invalid transform seed size"); - } else { - AesKdf* aesKdf; - if (m_db->kdf()->type() == Kdf::Type::AES) { - aesKdf = static_cast<AesKdf*>(m_db->kdf()); - } else { - aesKdf = new AesKdf(); - m_db->setKdf(aesKdf); - } - - aesKdf->setSeed(data); + return; } + + auto kdf = m_db->kdf(); + if (!kdf) { + kdf = QSharedPointer<AesKdf>::create(); + m_db->setKdf(kdf); + } + + kdf->setSeed(data); } void Kdbx3Reader::setTransformRounds(const QByteArray& data) { if (data.size() != 8) { raiseError("Invalid transform rounds size"); - } else { - quint64 rounds = Endian::bytesToSizedInt<quint64>(data, KeePass2::BYTEORDER); - - AesKdf* aesKdf; - if (m_db->kdf()->type() == Kdf::Type::AES) { - aesKdf = static_cast<AesKdf*>(m_db->kdf()); - } else { - aesKdf = new AesKdf(); - m_db->setKdf(aesKdf); - } - - aesKdf->setRounds(rounds); + return; } + + auto rounds = Endian::bytesToSizedInt<quint64>(data, KeePass2::BYTEORDER); + auto kdf = m_db->kdf(); + if (!kdf) { + kdf = QSharedPointer<AesKdf>::create(); + m_db->setKdf(kdf); + } + + kdf->setRounds(rounds); } void Kdbx3Reader::setEncryptionIV(const QByteArray& data) diff --git a/src/format/Kdbx3Writer.cpp b/src/format/Kdbx3Writer.cpp index 990aa71ee..770e7270e 100644 --- a/src/format/Kdbx3Writer.cpp +++ b/src/format/Kdbx3Writer.cpp @@ -80,7 +80,7 @@ bool Kdbx3Writer::writeDatabase(QIODevice* device, Database* db) CHECK_RETURN_FALSE(writeHeaderField(KeePass2::CompressionFlags, Endian::sizedIntToBytes<qint32>(db->compressionAlgo(), KeePass2::BYTEORDER))); - AesKdf* kdf = static_cast<AesKdf*>(db->kdf()); + auto kdf = db->kdf(); CHECK_RETURN_FALSE(writeHeaderField(KeePass2::MasterSeed, masterSeed)); CHECK_RETURN_FALSE(writeHeaderField(KeePass2::TransformSeed, kdf->seed())); CHECK_RETURN_FALSE(writeHeaderField(KeePass2::TransformRounds, diff --git a/src/format/KeePass1Reader.cpp b/src/format/KeePass1Reader.cpp index ccb3d1ad1..c6e2ed03c 100644 --- a/src/format/KeePass1Reader.cpp +++ b/src/format/KeePass1Reader.cpp @@ -160,7 +160,7 @@ Database* KeePass1Reader::readDatabase(QIODevice* device, const QString& passwor raiseError("Invalid number of transform rounds"); return nullptr; } - AesKdf* kdf = new AesKdf(); + auto kdf = QSharedPointer<AesKdf>::create(); kdf->setRounds(m_transformRounds); kdf->setSeed(m_transformSeed); db->setKdf(kdf); diff --git a/src/format/KeePass2.cpp b/src/format/KeePass2.cpp index e79dff513..61bd383df 100644 --- a/src/format/KeePass2.cpp +++ b/src/format/KeePass2.cpp @@ -16,9 +16,9 @@ */ #include "KeePass2.h" -#include "crypto/CryptoHash.h" #include "crypto/kdf/AesKdf.h" -#include "core/Uuid.h" +#include <QSharedPointer> + const Uuid KeePass2::CIPHER_AES = Uuid(QByteArray::fromHex("31c1f2e6bf714350be5805216afc5aff")); const Uuid KeePass2::CIPHER_TWOFISH = Uuid(QByteArray::fromHex("ad68f29f576f4bb9a36ad47af965346c")); @@ -28,31 +28,23 @@ const Uuid KeePass2::KDF_AES = Uuid(QByteArray::fromHex("C9D9F39A628A4460BF740D0 const QByteArray KeePass2::INNER_STREAM_SALSA20_IV("\xE8\x30\x09\x4B\x97\x20\x5D\x2A"); -const QList<KeePass2::UuidNamePair> KeePass2::CIPHERS { - KeePass2::UuidNamePair(KeePass2::CIPHER_AES, "AES: 256-bit"), - KeePass2::UuidNamePair(KeePass2::CIPHER_TWOFISH, "Twofish: 256-bit"), - KeePass2::UuidNamePair(KeePass2::CIPHER_CHACHA20, "ChaCha20: 256-bit") +const QList<QPair<Uuid, QString>> KeePass2::CIPHERS { + qMakePair(KeePass2::CIPHER_AES, QObject::tr("AES: 256-bit")), + qMakePair(KeePass2::CIPHER_TWOFISH, QObject::tr("Twofish: 256-bit")), + qMakePair(KeePass2::CIPHER_CHACHA20, QObject::tr("ChaCha20: 256-bit")) }; -const QList<KeePass2::UuidNamePair> KeePass2::KDFS { - KeePass2::UuidNamePair(KeePass2::KDF_AES, "AES-KDF"), +const QList<QPair<Uuid, QString>> KeePass2::KDFS { + qMakePair(KeePass2::KDF_AES, QObject::tr("AES-KDF")), }; -Kdf* KeePass2::uuidToKdf(const Uuid& uuid) { - if (uuid == KDF_AES) { - return static_cast<Kdf*>(new AesKdf()); - } - - return nullptr; -} - -Uuid KeePass2::kdfToUuid(const Kdf& kdf) +QSharedPointer<Kdf> KeePass2::uuidToKdf(const Uuid& uuid) { - switch (kdf.type()) { - case Kdf::Type::AES: - return KDF_AES; - default: - return Uuid(); + if (uuid == KDF_AES) { + return QSharedPointer<AesKdf>::create(); } + + Q_ASSERT_X(false, "uuidToKdf", "Invalid UUID"); + return nullptr; } KeePass2::ProtectedStreamAlgo KeePass2::idToProtectedStreamAlgo(quint32 id) @@ -68,19 +60,3 @@ KeePass2::ProtectedStreamAlgo KeePass2::idToProtectedStreamAlgo(quint32 id) return KeePass2::InvalidProtectedStreamAlgo; } } - -KeePass2::UuidNamePair::UuidNamePair(const Uuid& uuid, const QString& name) - : m_uuid(uuid) - , m_name(name) -{ -} - -Uuid KeePass2::UuidNamePair::uuid() const -{ - return m_uuid; -} - -QString KeePass2::UuidNamePair::name() const -{ - return m_name; -} diff --git a/src/format/KeePass2.h b/src/format/KeePass2.h index 6356e15da..c7945e907 100644 --- a/src/format/KeePass2.h +++ b/src/format/KeePass2.h @@ -43,20 +43,8 @@ namespace KeePass2 extern const QByteArray INNER_STREAM_SALSA20_IV; - class UuidNamePair - { - public: - UuidNamePair(const Uuid& uuid, const QString& name); - Uuid uuid() const; - QString name() const; - - private: - Uuid m_uuid; - QString m_name; - }; - - extern const QList<UuidNamePair> CIPHERS; - extern const QList<UuidNamePair> KDFS; + extern const QList<QPair<Uuid, QString>> CIPHERS; + extern const QList<QPair<Uuid, QString>> KDFS; enum HeaderFieldID { @@ -81,8 +69,7 @@ namespace KeePass2 InvalidProtectedStreamAlgo = -1 }; - Kdf* uuidToKdf(const Uuid& uuid); - Uuid kdfToUuid(const Kdf& kdf); + QSharedPointer<Kdf> uuidToKdf(const Uuid& uuid); ProtectedStreamAlgo idToProtectedStreamAlgo(quint32 id); } diff --git a/src/gui/DatabaseSettingsWidget.cpp b/src/gui/DatabaseSettingsWidget.cpp index ce1fb8dbb..51c0f4183 100644 --- a/src/gui/DatabaseSettingsWidget.cpp +++ b/src/gui/DatabaseSettingsWidget.cpp @@ -20,6 +20,7 @@ #include <QMessageBox> +#include "core/Global.h" #include "core/AsyncTask.h" #include "core/Database.h" #include "core/Group.h" @@ -40,7 +41,6 @@ DatabaseSettingsWidget::DatabaseSettingsWidget(QWidget* parent) m_ui->historyMaxItemsSpinBox, SLOT(setEnabled(bool))); connect(m_ui->historyMaxSizeCheckBox, SIGNAL(toggled(bool)), m_ui->historyMaxSizeSpinBox, SLOT(setEnabled(bool))); - connect(m_ui->kdfComboBox, SIGNAL(currentIndexChanged(int)), SLOT(changeKdf(int))); connect(m_ui->transformBenchmarkButton, SIGNAL(clicked()), SLOT(transformRoundsBenchmark())); } @@ -61,8 +61,7 @@ void DatabaseSettingsWidget::load(Database* db) if (meta->historyMaxItems() > -1) { m_ui->historyMaxItemsSpinBox->setValue(meta->historyMaxItems()); m_ui->historyMaxItemsCheckBox->setChecked(true); - } - else { + } else { m_ui->historyMaxItemsSpinBox->setValue(Metadata::DefaultHistoryMaxItems); m_ui->historyMaxItemsCheckBox->setChecked(false); } @@ -70,17 +69,14 @@ void DatabaseSettingsWidget::load(Database* db) if (historyMaxSizeMiB > 0) { m_ui->historyMaxSizeSpinBox->setValue(historyMaxSizeMiB); m_ui->historyMaxSizeCheckBox->setChecked(true); - } - else { + } else { m_ui->historyMaxSizeSpinBox->setValue(Metadata::DefaultHistoryMaxSize); m_ui->historyMaxSizeCheckBox->setChecked(false); } m_ui->algorithmComboBox->clear(); - for (QList<KeePass2::UuidNamePair>::const_iterator ciphers = KeePass2::CIPHERS.constBegin(); - ciphers != KeePass2::CIPHERS.constEnd(); ++ciphers) { - KeePass2::UuidNamePair cipher = *ciphers; - m_ui->algorithmComboBox->addItem(cipher.name(), cipher.uuid().toByteArray()); + for (auto& cipher: asConst(KeePass2::CIPHERS)) { + m_ui->algorithmComboBox->addItem(cipher.second, cipher.first.toByteArray()); } int cipherIndex = m_ui->algorithmComboBox->findData(m_db->cipher().toByteArray()); if (cipherIndex > -1) { @@ -89,20 +85,17 @@ void DatabaseSettingsWidget::load(Database* db) bool blockSignals = m_ui->kdfComboBox->signalsBlocked(); m_ui->kdfComboBox->blockSignals(true); - m_kdf.reset(m_db->kdf()->clone()); + m_ui->kdfComboBox->clear(); - for (QList<KeePass2::UuidNamePair>::const_iterator kdfs = KeePass2::KDFS.constBegin(); - kdfs != KeePass2::KDFS.constEnd(); ++kdfs) { - KeePass2::UuidNamePair kdf = *kdfs; - m_ui->kdfComboBox->addItem(kdf.name(), kdf.uuid().toByteArray()); + for (auto& kdf: asConst(KeePass2::KDFS)) { + m_ui->kdfComboBox->addItem(kdf.second, kdf.first.toByteArray()); } - int kdfIndex = m_ui->kdfComboBox->findData(KeePass2::kdfToUuid(*m_kdf).toByteArray()); + int kdfIndex = m_ui->kdfComboBox->findData(m_db->kdf()->uuid().toByteArray()); if (kdfIndex > -1) { m_ui->kdfComboBox->setCurrentIndex(kdfIndex); } - displayKdf(*m_kdf); m_ui->kdfComboBox->blockSignals(blockSignals); - m_ui->transformRoundsSpinBox->setValue(static_cast<unsigned>(m_kdf->rounds())); + m_ui->transformRoundsSpinBox->setValue(static_cast<unsigned>(m_db->kdf()->rounds())); m_ui->dbNameEdit->setFocus(); } @@ -121,8 +114,7 @@ void DatabaseSettingsWidget::save() int historyMaxItems; if (m_ui->historyMaxItemsCheckBox->isChecked()) { historyMaxItems = m_ui->historyMaxItemsSpinBox->value(); - } - else { + } else { historyMaxItems = -1; } if (historyMaxItems != meta->historyMaxItems()) { @@ -133,8 +125,7 @@ void DatabaseSettingsWidget::save() int historyMaxSize; if (m_ui->historyMaxSizeCheckBox->isChecked()) { historyMaxSize = m_ui->historyMaxSizeSpinBox->value() * 1048576; - } - else { + } else { historyMaxSize = -1; } if (historyMaxSize != meta->historyMaxSize()) { @@ -148,31 +139,20 @@ void DatabaseSettingsWidget::save() m_db->setCipher(Uuid(m_ui->algorithmComboBox->currentData().toByteArray())); - bool kdfValid = true; - for (int i = 0; i < m_kdfFields.size(); ++i) { - QPair<quint32, QSpinBox*> field = m_kdfFields.at(i); - kdfValid &= m_kdf->setField(field.first, static_cast<quint64>(qMax(0, field.second->value()))); - if (!kdfValid) { - break; - } - } + auto kdf = KeePass2::uuidToKdf(Uuid(m_ui->kdfComboBox->currentData().toByteArray())); + kdf->setRounds(static_cast<quint64>(qMax(0, m_ui->transformRoundsSpinBox->value()))); - if (kdfValid) { - Kdf* kdf = m_kdf.take(); - bool ok = m_db->changeKdf(kdf); - if (!ok) { - MessageBox::warning(this, tr("KDF unchanged"), - tr("Failed to transform key with new KDF parameters; KDF unchanged."), - QMessageBox::Ok); - delete kdf; // m_db has not taken ownership - } - } else { + QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); + // TODO: we should probably use AsyncTask::runAndWaitForFuture() here, + // but not without making Database thread-safe + bool ok = m_db->changeKdf(kdf); + QApplication::restoreOverrideCursor(); + + if (!ok) { MessageBox::warning(this, tr("KDF unchanged"), - tr("Invalid KDF parameters; KDF unchanged."), + tr("Failed to transform key with new KDF parameters; KDF unchanged."), QMessageBox::Ok); } - clearKdfWidgets(); - emit editFinished(true); } @@ -185,7 +165,7 @@ void DatabaseSettingsWidget::transformRoundsBenchmark() { QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); m_ui->transformRoundsSpinBox->setValue(AsyncTask::runAndWaitForFuture([this]() { - int rounds = m_kdf->benchmark(1000); + int rounds = m_db->kdf()->benchmark(1000); QApplication::restoreOverrideCursor(); return rounds; })); @@ -198,66 +178,3 @@ void DatabaseSettingsWidget::truncateHistories() entry->truncateHistory(); } } - -void DatabaseSettingsWidget::changeKdf(int index) { - QByteArray uuidBytes = m_ui->kdfComboBox->itemData(index).toByteArray(); - if (uuidBytes.size() != Uuid::Length) { - return; - } - Kdf* newKdf = KeePass2::uuidToKdf(Uuid(uuidBytes)); - if (newKdf != nullptr) { - m_kdf.reset(newKdf); - displayKdf(*m_kdf); - } -} - -void DatabaseSettingsWidget::displayKdf(const Kdf& kdf) -{ - clearKdfWidgets(); - - QWidget* lastWidget = nullptr; - int columnStart = m_ui->gridLayout->columnCount(); - int rowStart = m_ui->gridLayout->rowCount(); - QList<Kdf::Field> fields = kdf.fields(); - for (int i = 0; i < fields.size(); i++) { - const Kdf::Field& field = fields.at(i); - QLabel* label = new QLabel(QString("%1:").arg(field.name())); - QSpinBox* spinBox = new QSpinBox(); - m_kdfWidgets.append(label); - m_kdfWidgets.append(spinBox); - m_kdfFields.append(QPair<quint32, QSpinBox*>(field.id(), spinBox)); - spinBox->setMinimum(static_cast<qint32>(qMin(qMax(0ull, field.min()), 0x7FFFFFFFull))); - spinBox->setMaximum(static_cast<qint32>(qMin(qMax(0ull, field.max()), 0x7FFFFFFFull))); - spinBox->setValue(static_cast<qint32>(qMin(qMax(0ull, kdf.field(field.id())), 0x7FFFFFFFull))); - spinBox->setObjectName(QString("kdfParams%1").arg(i)); - m_ui->gridLayout->addWidget(label, rowStart + i, columnStart - 3, Qt::AlignRight); - if (field.benchmarked()) { - Q_ASSERT(m_benchmarkField == nullptr); - QPushButton* benchBtn = new QPushButton("Benchmark"); - connect(benchBtn, &QPushButton::clicked, this, &DatabaseSettingsWidget::transformRoundsBenchmark); - m_kdfWidgets.append(benchBtn); - m_ui->gridLayout->addWidget(spinBox, rowStart + i, columnStart - 2); - m_ui->gridLayout->addWidget(benchBtn, rowStart + i, columnStart - 1); - m_benchmarkField = spinBox; - lastWidget = benchBtn; - } else { - m_ui->gridLayout->addWidget(spinBox, rowStart + i, columnStart - 2, 1, 2); - lastWidget = spinBox; - } - } - if (lastWidget != nullptr) { - QWidget::setTabOrder(lastWidget, m_ui->buttonBox->button(QDialogButtonBox::StandardButton::Cancel)); - QWidget::setTabOrder(m_ui->buttonBox->button(QDialogButtonBox::StandardButton::Cancel), m_ui->buttonBox->button(QDialogButtonBox::StandardButton::Ok)); - } -} - -void DatabaseSettingsWidget::clearKdfWidgets() -{ - m_benchmarkField = nullptr; - for (int i = 0; i < m_kdfWidgets.size(); ++i) { - m_ui->gridLayout->removeWidget(m_kdfWidgets.at(i)); - m_kdfWidgets.at(i)->deleteLater(); - } - m_kdfWidgets.clear(); - m_kdfFields.clear(); -} diff --git a/src/gui/DatabaseSettingsWidget.h b/src/gui/DatabaseSettingsWidget.h index fe8e25c6b..ec3d6415a 100644 --- a/src/gui/DatabaseSettingsWidget.h +++ b/src/gui/DatabaseSettingsWidget.h @@ -40,6 +40,7 @@ Q_OBJECT public: explicit DatabaseSettingsWidget(QWidget* parent = nullptr); ~DatabaseSettingsWidget(); + Q_DISABLE_COPY(DatabaseSettingsWidget) void load(Database* db); @@ -50,19 +51,12 @@ private slots: void save(); void reject(); void transformRoundsBenchmark(); - void changeKdf(int index); private: void truncateHistories(); - void displayKdf(const Kdf& kdf); - void clearKdfWidgets(); const QScopedPointer<Ui::DatabaseSettingsWidget> m_ui; - QList<QWidget*> m_kdfWidgets; - QScopedPointer<Kdf> m_kdf; Database* m_db; - - Q_DISABLE_COPY(DatabaseSettingsWidget) }; #endif // KEEPASSX_DATABASESETTINGSWIDGET_H diff --git a/src/gui/DatabaseSettingsWidget.ui b/src/gui/DatabaseSettingsWidget.ui index 701df42a0..8aaab19e7 100644 --- a/src/gui/DatabaseSettingsWidget.ui +++ b/src/gui/DatabaseSettingsWidget.ui @@ -2,17 +2,9 @@ <ui version="4.0"> <class>DatabaseSettingsWidget</class> <widget class="QWidget" name="DatabaseSettingsWidget"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>600</width> - <height>340</height> - </rect> - </property> <layout class="QVBoxLayout" name="verticalLayout" stretch="1,2,5,1"> <item> - <spacer name="topSpacer"> + <spacer name="verticalSpacer_2"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> @@ -25,9 +17,9 @@ </spacer> </item> <item> - <layout class="QHBoxLayout" name="horizontalLayout" stretch="0,1,0"> + <layout class="QHBoxLayout" name="horizontalLayout_5" stretch="0,1,0"> <item> - <spacer name="leftSpacer"> + <spacer name="horizontalSpacer"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> @@ -40,118 +32,185 @@ </spacer> </item> <item> - <layout class="QGridLayout" name="gridLayout"> - <item row="7" column="2" colspan="2"> - <widget class="QComboBox" name="kdfComboBox"/> - </item> - <item row="0" column="1" alignment="Qt::AlignRight"> - <widget class="QLabel" name="dbNameLabel"> - <property name="text"> - <string>Database name:</string> - </property> - </widget> - </item> - <item row="5" column="1"> - <widget class="QCheckBox" name="historyMaxSizeCheckBox"> - <property name="text"> - <string>Max. history size:</string> - </property> - </widget> - </item> - <item row="7" column="1" alignment="Qt::AlignRight"> - <widget class="QLabel" name="kdfLabel"> - <property name="text"> - <string>Key derivation function:</string> - </property> - </widget> - </item> - <item row="4" column="1"> - <widget class="QCheckBox" name="historyMaxItemsCheckBox"> - <property name="text"> - <string>Max. history items:</string> - </property> - </widget> - </item> - <item row="0" column="2" colspan="2"> - <widget class="QLineEdit" name="dbNameEdit"/> - </item> - <item row="4" column="2" colspan="2"> - <widget class="QSpinBox" name="historyMaxItemsSpinBox"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="maximum"> - <number>2000000000</number> - </property> - </widget> - </item> - <item row="2" column="1" alignment="Qt::AlignRight"> - <widget class="QLabel" name="defaultUsernameLabel"> - <property name="text"> - <string>Default username:</string> - </property> - </widget> - </item> - <item row="1" column="2" colspan="2"> - <widget class="QLineEdit" name="dbDescriptionEdit"/> - </item> - <item row="5" column="2" colspan="2"> - <widget class="QSpinBox" name="historyMaxSizeSpinBox"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="suffix"> - <string> MiB</string> - </property> - <property name="minimum"> - <number>1</number> - </property> - <property name="maximum"> - <number>2000000000</number> - </property> - </widget> - </item> - <item row="3" column="2" colspan="2"> - <widget class="QCheckBox" name="recycleBinEnabledCheckBox"> - <property name="text"> - <string>Use recycle bin</string> - </property> - </widget> - </item> - <item row="2" column="2" colspan="2"> - <widget class="QLineEdit" name="defaultUsernameEdit"> - <property name="enabled"> - <bool>true</bool> - </property> - </widget> - </item> - <item row="1" column="1" alignment="Qt::AlignRight"> - <widget class="QLabel" name="dbDescriptionLabel"> - <property name="text"> - <string>Database description:</string> - </property> - </widget> - </item> - <item row="6" column="2" colspan="2"> - <widget class="QComboBox" name="algorithmComboBox"/> - </item> - <item row="6" column="1" alignment="Qt::AlignRight"> - <widget class="QLabel" name="algorithmLabel"> - <property name="text"> - <string>Algorithm:</string> - </property> - </widget> - </item> - </layout> + <widget class="QWidget" name="widget" native="true"> + <property name="maximumSize"> + <size> + <width>800</width> + <height>16777215</height> + </size> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="4" column="2"> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item> + <widget class="QSpinBox" name="transformRoundsSpinBox"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimum"> + <number>1</number> + </property> + <property name="maximum"> + <number>1000000000</number> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="transformBenchmarkButton"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="MinimumExpanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Benchmark</string> + </property> + </widget> + </item> + </layout> + </item> + <item row="0" column="1" alignment="Qt::AlignRight"> + <widget class="QLabel" name="dbNameLabel"> + <property name="text"> + <string>Database name:</string> + </property> + </widget> + </item> + <item row="8" column="1"> + <widget class="QCheckBox" name="historyMaxSizeCheckBox"> + <property name="text"> + <string>Max. history size:</string> + </property> + </widget> + </item> + <item row="4" column="1" alignment="Qt::AlignRight"> + <widget class="QLabel" name="transformRoundsLabel"> + <property name="text"> + <string>Transform rounds:</string> + </property> + </widget> + </item> + <item row="7" column="1"> + <widget class="QCheckBox" name="historyMaxItemsCheckBox"> + <property name="text"> + <string>Max. history items:</string> + </property> + </widget> + </item> + <item row="0" column="2"> + <widget class="QLineEdit" name="dbNameEdit"/> + </item> + <item row="7" column="2"> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QSpinBox" name="historyMaxItemsSpinBox"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximum"> + <number>2000000000</number> + </property> + </widget> + </item> + </layout> + </item> + <item row="5" column="1" alignment="Qt::AlignRight"> + <widget class="QLabel" name="defaultUsernameLabel"> + <property name="text"> + <string>Default username:</string> + </property> + </widget> + </item> + <item row="1" column="2"> + <widget class="QLineEdit" name="dbDescriptionEdit"/> + </item> + <item row="8" column="2"> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QSpinBox" name="historyMaxSizeSpinBox"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="suffix"> + <string> MiB</string> + </property> + <property name="minimum"> + <number>1</number> + </property> + <property name="maximum"> + <number>2000000000</number> + </property> + </widget> + </item> + </layout> + </item> + <item row="6" column="2"> + <widget class="QCheckBox" name="recycleBinEnabledCheckBox"> + <property name="text"> + <string>Use recycle bin</string> + </property> + </widget> + </item> + <item row="5" column="2"> + <widget class="QLineEdit" name="defaultUsernameEdit"> + <property name="enabled"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="1" column="1" alignment="Qt::AlignRight"> + <widget class="QLabel" name="dbDescriptionLabel"> + <property name="text"> + <string>Database description:</string> + </property> + </widget> + </item> + <item row="2" column="2"> + <widget class="QComboBox" name="algorithmComboBox"> + <item> + <property name="text"> + <string>AES: 256 Bit (default)</string> + </property> + </item> + <item> + <property name="text"> + <string>Twofish: 256 Bit</string> + </property> + </item> + </widget> + </item> + <item row="2" column="1" alignment="Qt::AlignRight"> + <widget class="QLabel" name="algorithmLabel"> + <property name="text"> + <string>Encryption Algorithm:</string> + </property> + </widget> + </item> + <item row="3" column="2"> + <widget class="QComboBox" name="kdfComboBox"/> + </item> + <item row="3" column="1"> + <widget class="QLabel" name="kdfLabel"> + <property name="text"> + <string>Key Derivation Function</string> + </property> + </widget> + </item> + </layout> + </widget> </item> <item> - <spacer name="rightSpacer"> + <spacer name="horizontalSpacer_2"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> @@ -166,7 +225,7 @@ </layout> </item> <item> - <spacer name="bottomSpacer"> + <spacer name="verticalSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> @@ -190,14 +249,14 @@ <tabstops> <tabstop>dbNameEdit</tabstop> <tabstop>dbDescriptionEdit</tabstop> + <tabstop>transformRoundsSpinBox</tabstop> + <tabstop>transformBenchmarkButton</tabstop> <tabstop>defaultUsernameEdit</tabstop> <tabstop>recycleBinEnabledCheckBox</tabstop> <tabstop>historyMaxItemsCheckBox</tabstop> <tabstop>historyMaxItemsSpinBox</tabstop> <tabstop>historyMaxSizeCheckBox</tabstop> <tabstop>historyMaxSizeSpinBox</tabstop> - <tabstop>algorithmComboBox</tabstop> - <tabstop>kdfComboBox</tabstop> <tabstop>buttonBox</tabstop> </tabstops> <resources/> diff --git a/src/keys/CompositeKey.cpp b/src/keys/CompositeKey.cpp index 88ac4cf6a..8f6917afc 100644 --- a/src/keys/CompositeKey.cpp +++ b/src/keys/CompositeKey.cpp @@ -17,19 +17,11 @@ */ #include "CompositeKey.h" -#include "ChallengeResponseKey.h" - -#include <QElapsedTimer> #include <QFile> #include <QtConcurrent> -#include "crypto/kdf/Kdf.h" -#include "format/KeePass2.h" #include "core/Global.h" #include "crypto/CryptoHash.h" -#include "crypto/SymmetricCipher.h" -#include "keys/FileKey.h" -#include "keys/PasswordKey.h" CompositeKey::CompositeKey() { diff --git a/tests/TestKeePass1Reader.cpp b/tests/TestKeePass1Reader.cpp index 7e015c2bc..c372c8715 100644 --- a/tests/TestKeePass1Reader.cpp +++ b/tests/TestKeePass1Reader.cpp @@ -26,7 +26,6 @@ #include "core/Group.h" #include "core/Metadata.h" #include "crypto/Crypto.h" -#include "crypto/kdf/AesKdf.h" #include "format/KeePass1Reader.h" #include "format/KeePass2Reader.h" #include "format/KeePass2Writer.h" @@ -111,7 +110,7 @@ void TestKeePass1Reader::testBasic() void TestKeePass1Reader::testMasterKey() { QVERIFY(m_db->hasKey()); - QCOMPARE(static_cast<AesKdf*>(m_db->kdf())->rounds(), static_cast<quint64>(713)); + QCOMPARE(m_db->kdf()->rounds(), static_cast<quint64>(713)); } void TestKeePass1Reader::testCustomIcons() diff --git a/tests/gui/TestGui.cpp b/tests/gui/TestGui.cpp index 92b7a6a5f..9f1e7abc2 100644 --- a/tests/gui/TestGui.cpp +++ b/tests/gui/TestGui.cpp @@ -903,7 +903,7 @@ void TestGui::testDatabaseSettings() QTest::keyClick(transformRoundsSpinBox, Qt::Key_Enter); // wait for modified timer QTRY_COMPARE(m_tabWidget->tabText(m_tabWidget->currentIndex()), QString("Save*")); - QCOMPARE(static_cast<AesKdf*>(m_db->kdf())->rounds(), Q_UINT64_C(100)); + QCOMPARE(m_db->kdf()->rounds(), Q_UINT64_C(100)); triggerAction("actionDatabaseSave"); QCOMPARE(m_tabWidget->tabText(m_tabWidget->currentIndex()), QString("Save")); From 4592de8fb6c6bc7ff722ae3a78d821acec6ebaa9 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sun, 17 Dec 2017 19:17:22 +0100 Subject: [PATCH 229/402] Make benchmark() method non-virtual --- src/crypto/kdf/Kdf.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/crypto/kdf/Kdf.h b/src/crypto/kdf/Kdf.h index ba171dcba..5330e71d0 100644 --- a/src/crypto/kdf/Kdf.h +++ b/src/crypto/kdf/Kdf.h @@ -38,7 +38,7 @@ public: virtual void randomizeTransformSalt() = 0; virtual QSharedPointer<Kdf> clone() const = 0; - virtual int benchmark(int msec) const; + int benchmark(int msec) const; protected: virtual int benchmarkImpl(int msec) const = 0; From 61c4fe899242d487549d482c6154d327c1656c26 Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Wed, 20 Dec 2017 09:57:17 -0500 Subject: [PATCH 230/402] Formatting and consistency fixes --- src/crypto/CryptoHash.cpp | 2 +- src/crypto/kdf/AesKdf.cpp | 9 ++++----- src/crypto/kdf/Kdf.cpp | 3 ++- src/format/Kdbx3Reader.cpp | 14 ++++---------- src/format/KeePass2Reader.cpp | 25 +++++++++---------------- src/format/KeePass2Reader.h | 19 +++++++++---------- 6 files changed, 29 insertions(+), 43 deletions(-) diff --git a/src/crypto/CryptoHash.cpp b/src/crypto/CryptoHash.cpp index 8d5b56e76..70633da15 100644 --- a/src/crypto/CryptoHash.cpp +++ b/src/crypto/CryptoHash.cpp @@ -57,7 +57,7 @@ CryptoHash::CryptoHash(Algorithm algo, bool hmac) } gcry_error_t error = gcry_md_open(&d->ctx, algoGcrypt, flagsGcrypt); - if (error) { + if (error != GPG_ERR_NO_ERROR) { qWarning("Gcrypt error (ctor): %s", gcry_strerror(error)); qWarning("Gcrypt error (ctor): %s", gcry_strsource(error)); } diff --git a/src/crypto/kdf/AesKdf.cpp b/src/crypto/kdf/AesKdf.cpp index 8d3801a5f..7056698d7 100644 --- a/src/crypto/kdf/AesKdf.cpp +++ b/src/crypto/kdf/AesKdf.cpp @@ -114,13 +114,12 @@ int AesKdf::benchmarkImpl(int msec) const QByteArray seed = QByteArray(32, '\x4B'); QByteArray iv(16, 0); - SymmetricCipher cipher(SymmetricCipher::Aes256, SymmetricCipher::Ecb, - SymmetricCipher::Encrypt); + SymmetricCipher cipher(SymmetricCipher::Aes256, SymmetricCipher::Ecb, SymmetricCipher::Encrypt); cipher.init(seed, iv); int rounds = 0; - QElapsedTimer t; - t.start(); + QElapsedTimer timer; + timer.start(); do { if (!cipher.processInPlace(key, 10000)) { rounds = -1; @@ -128,7 +127,7 @@ int AesKdf::benchmarkImpl(int msec) const } rounds += 10000; } - while (!t.hasExpired(msec)); + while (!timer.hasExpired(msec)); return rounds; } diff --git a/src/crypto/kdf/Kdf.cpp b/src/crypto/kdf/Kdf.cpp index 6829b650a..cfc3025c1 100644 --- a/src/crypto/kdf/Kdf.cpp +++ b/src/crypto/kdf/Kdf.cpp @@ -45,7 +45,8 @@ int Kdf::benchmark(int msec) const } Kdf::BenchmarkThread::BenchmarkThread(int msec, const Kdf* kdf) - : m_msec(msec), m_kdf(kdf) + : m_msec(msec) + , m_kdf(kdf) { } diff --git a/src/format/Kdbx3Reader.cpp b/src/format/Kdbx3Reader.cpp index 3c3529f95..b5e5e2df8 100644 --- a/src/format/Kdbx3Reader.cpp +++ b/src/format/Kdbx3Reader.cpp @@ -322,12 +322,9 @@ void Kdbx3Reader::setTransformSeed(const QByteArray& data) } auto kdf = m_db->kdf(); - if (!kdf) { - kdf = QSharedPointer<AesKdf>::create(); - m_db->setKdf(kdf); + if (!kdf.isNull()) { + kdf->setSeed(data); } - - kdf->setSeed(data); } void Kdbx3Reader::setTransformRounds(const QByteArray& data) @@ -339,12 +336,9 @@ void Kdbx3Reader::setTransformRounds(const QByteArray& data) auto rounds = Endian::bytesToSizedInt<quint64>(data, KeePass2::BYTEORDER); auto kdf = m_db->kdf(); - if (!kdf) { - kdf = QSharedPointer<AesKdf>::create(); - m_db->setKdf(kdf); + if (!kdf.isNull()) { + kdf->setRounds(rounds); } - - kdf->setRounds(rounds); } void Kdbx3Reader::setEncryptionIV(const QByteArray& data) diff --git a/src/format/KeePass2Reader.cpp b/src/format/KeePass2Reader.cpp index 5d62794d4..daa6c9aa8 100644 --- a/src/format/KeePass2Reader.cpp +++ b/src/format/KeePass2Reader.cpp @@ -26,18 +26,16 @@ #include "format/KeePass2.h" #include "format/Kdbx3Reader.h" -BaseKeePass2Reader::BaseKeePass2Reader() : - m_error(false), - m_saveXml(false), - m_irsAlgo(KeePass2::InvalidProtectedStreamAlgo) +BaseKeePass2Reader::BaseKeePass2Reader() + : m_error(false) + , m_saveXml(false) + , m_irsAlgo(KeePass2::InvalidProtectedStreamAlgo) { m_errorStr.clear(); m_xmlData.clear(); m_protectedStreamKey.clear(); } -BaseKeePass2Reader::~BaseKeePass2Reader() {} - Database* BaseKeePass2Reader::readDatabase(const QString& filename, const CompositeKey& key) { QFile file(filename); @@ -134,35 +132,30 @@ Database* KeePass2Reader::readDatabase(QIODevice* device, const CompositeKey& ke bool KeePass2Reader::hasError() { - return m_error || (m_reader && m_reader->hasError()); + return m_error || (!m_reader.isNull() && m_reader->hasError()); } QString KeePass2Reader::errorString() { - return m_reader ? m_reader->errorString() : m_errorStr; + return !m_reader.isNull() ? m_reader->errorString() : m_errorStr; } QByteArray KeePass2Reader::xmlData() { - return m_reader ? m_reader->xmlData() : m_xmlData; + return !m_reader.isNull() ? m_reader->xmlData() : m_xmlData; } QByteArray KeePass2Reader::streamKey() { - return m_reader ? m_reader->streamKey() : m_protectedStreamKey; + return !m_reader.isNull() ? m_reader->streamKey() : m_protectedStreamKey; } KeePass2::ProtectedStreamAlgo KeePass2Reader::protectedStreamAlgo() const { - return m_reader ? m_reader->protectedStreamAlgo() : m_irsAlgo; + return !m_reader.isNull() ? m_reader->protectedStreamAlgo() : m_irsAlgo; } quint32 KeePass2Reader::version() const { return m_version; } - -BaseKeePass2Reader* KeePass2Reader::reader() const -{ - return m_reader.data(); -} diff --git a/src/format/KeePass2Reader.h b/src/format/KeePass2Reader.h index 21c317023..93348f565 100644 --- a/src/format/KeePass2Reader.h +++ b/src/format/KeePass2Reader.h @@ -31,6 +31,8 @@ class BaseKeePass2Reader { + Q_DECLARE_TR_FUNCTIONS(BaseKeePass2Reader) + public: BaseKeePass2Reader(); @@ -44,7 +46,7 @@ public: virtual QByteArray streamKey(); virtual KeePass2::ProtectedStreamAlgo protectedStreamAlgo() const; - virtual ~BaseKeePass2Reader(); + virtual ~BaseKeePass2Reader() = default; protected: void raiseError(const QString& errorMessage); @@ -60,20 +62,17 @@ protected: class KeePass2Reader : public BaseKeePass2Reader { - Q_DECLARE_TR_FUNCTIONS(KeePass2Reader) - public: - virtual Database* readDatabase(QIODevice* device, const CompositeKey& key, bool keepDatabase = false) override; + Database* readDatabase(QIODevice* device, const CompositeKey& key, bool keepDatabase = false) override; using BaseKeePass2Reader::readDatabase; - virtual bool hasError() override; - virtual QString errorString() override; - virtual QByteArray xmlData() override; - virtual QByteArray streamKey() override; - virtual KeePass2::ProtectedStreamAlgo protectedStreamAlgo() const override; + bool hasError() override; + QString errorString() override; + QByteArray xmlData() override; + QByteArray streamKey() override; + KeePass2::ProtectedStreamAlgo protectedStreamAlgo() const override; quint32 version() const; - BaseKeePass2Reader* reader() const; private: QScopedPointer<BaseKeePass2Reader> m_reader; quint32 m_version; From 2866bc626a02f7d0f2943dad3725200f318850cf Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Wed, 20 Dec 2017 09:58:02 -0500 Subject: [PATCH 231/402] Removed dead code --- src/CMakeLists.txt | 1 - src/core/Database.cpp | 6 ------ src/core/Database.h | 1 - src/core/ToDbExporter.cpp | 39 --------------------------------------- src/core/ToDbExporter.h | 33 --------------------------------- 5 files changed, 80 deletions(-) delete mode 100644 src/core/ToDbExporter.cpp delete mode 100644 src/core/ToDbExporter.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1908cea09..c04d7110f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -62,7 +62,6 @@ set(keepassx_SOURCES core/ScreenLockListenerPrivate.cpp core/TimeDelta.cpp core/TimeInfo.cpp - core/ToDbExporter.cpp core/Tools.cpp core/Translator.cpp core/Uuid.cpp diff --git a/src/core/Database.cpp b/src/core/Database.cpp index 3aeaa3d26..2f2f2967d 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -374,12 +374,6 @@ void Database::setEmitModified(bool value) m_emitModified = value; } -void Database::copyAttributesFrom(const Database* other) -{ - m_data = other->m_data; - m_data.kdf = m_data.kdf->clone(); - m_metadata->copyAttributesFrom(other->m_metadata); -} Uuid Database::uuid() { diff --git a/src/core/Database.h b/src/core/Database.h index c199069d3..b293c760d 100644 --- a/src/core/Database.h +++ b/src/core/Database.h @@ -107,7 +107,6 @@ public: void recycleGroup(Group* group); void emptyRecycleBin(); void setEmitModified(bool value); - void copyAttributesFrom(const Database* other); void merge(const Database* other); QString saveToFile(QString filePath); diff --git a/src/core/ToDbExporter.cpp b/src/core/ToDbExporter.cpp deleted file mode 100644 index 1f76fb744..000000000 --- a/src/core/ToDbExporter.cpp +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2014 Felix Geyer <debfx@fobos.de> - * Copyright (C) 2014 Florian Geyer <blueice@fobos.de> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 or (at your option) - * version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "ToDbExporter.h" -#include "core/Database.h" -#include "core/Group.h" -#include "core/Metadata.h" - -Database* ToDbExporter::exportGroup(Group* group) -{ - Database* oldDb = group->database(); - Q_ASSERT(oldDb); - - Database* db = new Database(); - Group* clonedGroup = group->clone(Entry::CloneNewUuid | Entry::CloneIncludeHistory); - clonedGroup->setParent(db->rootGroup()); - - QSet<Uuid> customIcons = group->customIconsRecursive(); - db->metadata()->copyCustomIcons(customIcons, oldDb->metadata()); - - db->copyAttributesFrom(oldDb); - - return db; -} diff --git a/src/core/ToDbExporter.h b/src/core/ToDbExporter.h deleted file mode 100644 index 58c5efeb3..000000000 --- a/src/core/ToDbExporter.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2014 Felix Geyer <debfx@fobos.de> - * Copyright (C) 2014 Florian Geyer <blueice@fobos.de> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 or (at your option) - * version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef KEEPASSX_TODBEXPORTER_H -#define KEEPASSX_TODBEXPORTER_H - -#include "core/Exporter.h" - -class Database; -class Group; - -class ToDbExporter : Exporter -{ -public: - Database* exportGroup(Group* group); -}; - -#endif // KEEPASSX_TODBEXPORTER_H From 9140893cd3e7658cd5ecda2fed4207fda6893f81 Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Mon, 1 Jan 2018 13:20:31 -0500 Subject: [PATCH 232/402] Correct Endian function use in Random tests --- tests/CMakeLists.txt | 3 --- tests/TestRandom.cpp | 16 ++++++++-------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index bdf0e6f86..91c6b2e2e 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -181,9 +181,6 @@ add_unit_test(NAME testrandom SOURCES TestRandom.cpp add_unit_test(NAME testentrysearcher SOURCES TestEntrySearcher.cpp LIBS ${TEST_LIBRARIES}) -add_unit_test(NAME testexporter SOURCES TestExporter.cpp - LIBS ${TEST_LIBRARIES}) - add_unit_test(NAME testcsvexporter SOURCES TestCsvExporter.cpp LIBS ${TEST_LIBRARIES}) diff --git a/tests/TestRandom.cpp b/tests/TestRandom.cpp index 6c5b1f724..69f0fcb7c 100644 --- a/tests/TestRandom.cpp +++ b/tests/TestRandom.cpp @@ -35,29 +35,29 @@ void TestRandom::testUInt() { QByteArray nextBytes; - nextBytes = Endian::int32ToBytes(42, QSysInfo::ByteOrder); + nextBytes = Endian::sizedIntToBytes(42, QSysInfo::ByteOrder); m_backend->setNextBytes(nextBytes); QCOMPARE(randomGen()->randomUInt(100), 42U); - nextBytes = Endian::int32ToBytes(117, QSysInfo::ByteOrder); + nextBytes = Endian::sizedIntToBytes(117, QSysInfo::ByteOrder); m_backend->setNextBytes(nextBytes); QCOMPARE(randomGen()->randomUInt(100), 17U); - nextBytes = Endian::int32ToBytes(1001, QSysInfo::ByteOrder); + nextBytes = Endian::sizedIntToBytes(1001, QSysInfo::ByteOrder); m_backend->setNextBytes(nextBytes); QCOMPARE(randomGen()->randomUInt(1), 0U); nextBytes.clear(); - nextBytes.append(Endian::int32ToBytes(QUINT32_MAX, QSysInfo::ByteOrder)); - nextBytes.append(Endian::int32ToBytes(QUINT32_MAX - 70000U, QSysInfo::ByteOrder)); + nextBytes.append(Endian::sizedIntToBytes(QUINT32_MAX, QSysInfo::ByteOrder)); + nextBytes.append(Endian::sizedIntToBytes(QUINT32_MAX - 70000U, QSysInfo::ByteOrder)); m_backend->setNextBytes(nextBytes); QCOMPARE(randomGen()->randomUInt(100000U), (QUINT32_MAX - 70000U) % 100000U); nextBytes.clear(); for (int i = 0; i < 10000; i++) { - nextBytes.append(Endian::int32ToBytes((QUINT32_MAX / 2U) + 1U + i, QSysInfo::ByteOrder)); + nextBytes.append(Endian::sizedIntToBytes((QUINT32_MAX / 2U) + 1U + i, QSysInfo::ByteOrder)); } - nextBytes.append(Endian::int32ToBytes(QUINT32_MAX / 2U, QSysInfo::ByteOrder)); + nextBytes.append(Endian::sizedIntToBytes(QUINT32_MAX / 2U, QSysInfo::ByteOrder)); m_backend->setNextBytes(nextBytes); QCOMPARE(randomGen()->randomUInt((QUINT32_MAX / 2U) + 1U), QUINT32_MAX / 2U); } @@ -66,7 +66,7 @@ void TestRandom::testUIntRange() { QByteArray nextBytes; - nextBytes = Endian::int32ToBytes(42, QSysInfo::ByteOrder); + nextBytes = Endian::sizedIntToBytes(42, QSysInfo::ByteOrder); m_backend->setNextBytes(nextBytes); QCOMPARE(randomGen()->randomUIntRange(100, 200), 142U); } From 542ee42313f16d7f6522c746b0403da0369a4e99 Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Mon, 1 Jan 2018 13:21:02 -0500 Subject: [PATCH 233/402] Add Argon2Kdf and enable parameters in db settings Note: This implementation is not yet connected to the database itself and will corrupt existing kdbx3 db's. * Implemented memory and parallelism parameters for Argon2Kdf * Using libargon2; libsodium does not support Argon2d algorithm * Moved basic rounds parameter into Kdf class * Reimplemented benchmark algorithm; previous was utterly broken --- CMakeLists.txt | 2 +- INSTALL.md | 1 + cmake/FindArgon2.cmake | 21 +++ src/CMakeLists.txt | 2 + src/cli/CMakeLists.txt | 1 + src/core/Database.cpp | 6 +- src/crypto/kdf/AesKdf.cpp | 65 ++------ src/crypto/kdf/AesKdf.h | 12 +- src/crypto/kdf/Argon2Kdf.cpp | 116 +++++++++++++++ src/crypto/kdf/Argon2Kdf.h | 50 +++++++ src/crypto/kdf/Kdf.cpp | 39 ++++- src/crypto/kdf/Kdf.h | 17 ++- src/format/KeePass2.cpp | 8 +- src/format/KeePass2.h | 1 + src/gui/DatabaseSettingsWidget.cpp | 67 +++++++-- src/gui/DatabaseSettingsWidget.h | 1 + src/gui/DatabaseSettingsWidget.ui | 228 ++++++++++++++++++----------- src/main.cpp | 1 - 18 files changed, 468 insertions(+), 170 deletions(-) create mode 100644 cmake/FindArgon2.cmake create mode 100644 src/crypto/kdf/Argon2Kdf.cpp create mode 100644 src/crypto/kdf/Argon2Kdf.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 34ac87f04..e6d4270ca 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -261,8 +261,8 @@ endif() set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_NONE QT_NO_DEBUG) find_package(LibGPGError REQUIRED) - find_package(Gcrypt 1.7.0 REQUIRED) +find_package(Argon2 REQUIRED) find_package(ZLIB REQUIRED) diff --git a/INSTALL.md b/INSTALL.md index 0bfa86b2c..2690e6091 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -26,6 +26,7 @@ The following libraries are required: * libmicrohttpd * libxi, libxtst, qtx11extras (optional for auto-type on X11) * libsodium (>= 1.0.12, optional for keepassxc-browser support) +* libargon2 Prepare the Building Environment diff --git a/cmake/FindArgon2.cmake b/cmake/FindArgon2.cmake new file mode 100644 index 000000000..8378ebd54 --- /dev/null +++ b/cmake/FindArgon2.cmake @@ -0,0 +1,21 @@ +# Copyright (C) 2017 KeePassXC Team +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 or (at your option) +# version 3 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +find_path(ARGON2_INCLUDE_DIR argon2.h) +find_library(ARGON2_LIBRARIES argon2) +mark_as_advanced(ARGON2_LIBRARIES ARGON2_INCLUDE_DIR) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Argon2 DEFAULT_MSG ARGON2_LIBRARIES ARGON2_INCLUDE_DIR) \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c04d7110f..1e927ee38 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -78,6 +78,7 @@ set(keepassx_SOURCES crypto/kdf/Kdf.cpp crypto/kdf/Kdf_p.h crypto/kdf/AesKdf.cpp + crypto/kdf/Argon2Kdf.cpp format/CsvExporter.cpp format/KeePass1.h format/KeePass1Reader.cpp @@ -252,6 +253,7 @@ target_link_libraries(keepassx_core Qt5::Network Qt5::Concurrent Qt5::Widgets + ${ARGON2_LIBRARIES} ${GCRYPT_LIBRARIES} ${GPGERROR_LIBRARIES} ${ZLIB_LIBRARIES}) diff --git a/src/cli/CMakeLists.txt b/src/cli/CMakeLists.txt index 4c8620d55..225ce47dc 100644 --- a/src/cli/CMakeLists.txt +++ b/src/cli/CMakeLists.txt @@ -46,6 +46,7 @@ target_link_libraries(keepassxc-cli keepassx_core Qt5::Core ${GCRYPT_LIBRARIES} + ${ARGON2_LIBRARIES} ${GPGERROR_LIBRARIES} ${ZLIB_LIBRARIES} ${ZXCVBN_LIBRARIES}) diff --git a/src/core/Database.cpp b/src/core/Database.cpp index 2f2f2967d..ae1664118 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -45,7 +45,7 @@ Database::Database() m_data.cipher = KeePass2::CIPHER_AES; m_data.compressionAlgo = CompressionGZip; m_data.kdf = QSharedPointer<AesKdf>::create(); - m_data.kdf->randomizeTransformSalt(); + m_data.kdf->randomizeSeed(); m_data.hasKey = false; setRootGroup(new Group()); @@ -258,7 +258,7 @@ void Database::setCompressionAlgo(Database::CompressionAlgorithm algo) bool Database::setKey(const CompositeKey& key, bool updateChangedTime, bool updateTransformSalt) { if (updateTransformSalt) { - m_data.kdf->randomizeTransformSalt(); + m_data.kdf->randomizeSeed(); } QByteArray transformedMasterKey; @@ -490,7 +490,7 @@ void Database::setKdf(QSharedPointer<Kdf> kdf) bool Database::changeKdf(QSharedPointer<Kdf> kdf) { - kdf->randomizeTransformSalt(); + kdf->randomizeSeed(); QByteArray transformedMasterKey; if (!m_data.key.transform(*kdf, transformedMasterKey)) { return false; diff --git a/src/crypto/kdf/AesKdf.cpp b/src/crypto/kdf/AesKdf.cpp index 7056698d7..3177506fc 100644 --- a/src/crypto/kdf/AesKdf.cpp +++ b/src/crypto/kdf/AesKdf.cpp @@ -15,12 +15,17 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include "AesKdf.h" + #include <QtConcurrent> #include "format/KeePass2.h" #include "crypto/CryptoHash.h" -#include "crypto/Random.h" -#include "AesKdf.h" + +AesKdf::AesKdf() + : Kdf::Kdf(KeePass2::KDF_AES) +{ +} bool AesKdf::transform(const QByteArray& raw, QByteArray& result) const { @@ -44,7 +49,7 @@ bool AesKdf::transform(const QByteArray& raw, QByteArray& result) const return true; } -bool AesKdf::transformKeyRaw(const QByteArray& key, const QByteArray& seed, quint64 rounds, QByteArray* result) +bool AesKdf::transformKeyRaw(const QByteArray& key, const QByteArray& seed, int rounds, QByteArray* result) { QByteArray iv(16, 0); SymmetricCipher cipher(SymmetricCipher::Aes256, SymmetricCipher::Ecb, @@ -65,44 +70,6 @@ bool AesKdf::transformKeyRaw(const QByteArray& key, const QByteArray& seed, quin return true; } -AesKdf::AesKdf() - : Kdf::Kdf(KeePass2::KDF_AES) - , m_rounds(100000ull) - , m_seed(QByteArray(32, 0)) -{ -} - -quint64 AesKdf::rounds() const -{ - return m_rounds; -} - -QByteArray AesKdf::seed() const -{ - return m_seed; -} - -bool AesKdf::setRounds(quint64 rounds) -{ - m_rounds = rounds; - return true; -} - -bool AesKdf::setSeed(const QByteArray& seed) -{ - if (seed.size() != 32) { - return false; - } - - m_seed = seed; - return true; -} - -void AesKdf::randomizeTransformSalt() -{ - setSeed(randomGen()->randomArray(32)); -} - QSharedPointer<Kdf> AesKdf::clone() const { return QSharedPointer<AesKdf>::create(*this); @@ -117,17 +84,13 @@ int AesKdf::benchmarkImpl(int msec) const SymmetricCipher cipher(SymmetricCipher::Aes256, SymmetricCipher::Ecb, SymmetricCipher::Encrypt); cipher.init(seed, iv); - int rounds = 0; + quint64 rounds = 1000000; QElapsedTimer timer; timer.start(); - do { - if (!cipher.processInPlace(key, 10000)) { - rounds = -1; - break; - } - rounds += 10000; - } - while (!timer.hasExpired(msec)); - return rounds; + if (!cipher.processInPlace(key, rounds)) { + return -1; + } + + return static_cast<int>(rounds * (static_cast<float>(msec) / timer.elapsed())); } diff --git a/src/crypto/kdf/AesKdf.h b/src/crypto/kdf/AesKdf.h index 28206a8d6..3e2c8ada6 100644 --- a/src/crypto/kdf/AesKdf.h +++ b/src/crypto/kdf/AesKdf.h @@ -26,25 +26,15 @@ public: AesKdf(); bool transform(const QByteArray& raw, QByteArray& result) const override; - void randomizeTransformSalt() override; QSharedPointer<Kdf> clone() const override; - quint64 rounds() const override; - QByteArray seed() const override; - - bool setRounds(quint64 rounds) override; - bool setSeed(const QByteArray& seed) override; - protected: int benchmarkImpl(int msec) const override; private: - quint64 m_rounds; - QByteArray m_seed; - static bool transformKeyRaw(const QByteArray& key, const QByteArray& seed, - quint64 rounds, + int rounds, QByteArray* result) Q_REQUIRED_RESULT; }; diff --git a/src/crypto/kdf/Argon2Kdf.cpp b/src/crypto/kdf/Argon2Kdf.cpp new file mode 100644 index 000000000..fa410dc93 --- /dev/null +++ b/src/crypto/kdf/Argon2Kdf.cpp @@ -0,0 +1,116 @@ +/* + * Copyright (C) 2017 KeePassXC Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "Argon2Kdf.h" + +#include <QtConcurrent> +#include <argon2.h> + +#include "format/KeePass2.h" +#include "crypto/CryptoHash.h" + +/** + * KeePass' Argon2 implementation supports all parameters that are defined in the official specification, + * but only the number of iterations, the memory size and the degree of parallelism can be configured by + * the user in the database settings dialog. For the other parameters, KeePass chooses reasonable defaults: + * a 256-bit salt is generated each time the database is saved, the tag length is 256 bits, no secret key + * or associated data. KeePass uses the latest version of Argon2, v1.3. + */ +Argon2Kdf::Argon2Kdf() + : Kdf::Kdf(KeePass2::KDF_ARGON2) + , m_memory(1<<16) + , m_parallelism(2) +{ + m_rounds = 1; +} + +quint32 Argon2Kdf::memory() const +{ + // Convert to Megabytes + return m_memory / (1<<10); +} + +bool Argon2Kdf::setMemory(quint32 memoryMegabytes) +{ + // TODO: add bounds check + // Convert to Kibibytes + m_memory = (1<<10) * memoryMegabytes; + return true; +} + +quint32 Argon2Kdf::parallelism() const +{ + return m_parallelism; +} + +bool Argon2Kdf::setParallelism(quint32 threads) +{ + // TODO: add bounds check + m_parallelism = threads; + return true; +} + +bool Argon2Kdf::transform(const QByteArray& raw, QByteArray& result) const +{ + result.clear(); + result.resize(32); + + if (!transformKeyRaw(raw, seed(), rounds(), memory(), parallelism(), result)) { + return false; + } + + result = CryptoHash::hash(result, CryptoHash::Sha256); + return true; +} + +bool Argon2Kdf::transformKeyRaw(const QByteArray& key, const QByteArray& seed, int rounds, + quint32 memory, quint32 parallelism, QByteArray& result) +{ + // Time Cost, Mem Cost, Threads/Lanes, Password, length, Salt, length, out, length + int rc = argon2d_hash_raw(rounds, memory, parallelism, key.data(), key.size(), + seed.data(), seed.size(), result.data(), result.size()); + if (rc != ARGON2_OK) { + qWarning("Argon2 error: %s", argon2_error_message(rc)); + return false; + } + + return true; +} + +QSharedPointer<Kdf> Argon2Kdf::clone() const +{ + return QSharedPointer<Argon2Kdf>::create(*this); +} + +int Argon2Kdf::benchmarkImpl(int msec) const +{ + QByteArray key = QByteArray(16, '\x7E'); + QByteArray seed = QByteArray(32, '\x4B'); + + QElapsedTimer timer; + timer.start(); + + int rounds = 4; + + int rc = argon2d_hash_raw(rounds, m_memory, m_parallelism, key.data(), key.size(), seed.data(), seed.size(), key.data(), key.size()); + if (rc != ARGON2_OK) { + qWarning("Argon2 error: %s", argon2_error_message(rc)); + return -1; + } + + return static_cast<int>(rounds * (static_cast<float>(msec) / timer.elapsed())); +} \ No newline at end of file diff --git a/src/crypto/kdf/Argon2Kdf.h b/src/crypto/kdf/Argon2Kdf.h new file mode 100644 index 000000000..c01698120 --- /dev/null +++ b/src/crypto/kdf/Argon2Kdf.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2017 KeePassXC Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef KEEPASSX_ARGON2KDF_H +#define KEEPASSX_ARGON2KDF_H + +#include "Kdf.h" + +class Argon2Kdf : public Kdf { +public: + Argon2Kdf(); + + bool transform(const QByteArray& raw, QByteArray& result) const override; + QSharedPointer<Kdf> clone() const override; + + quint32 memory() const; + bool setMemory(quint32 memory_kb); + quint32 parallelism() const; + bool setParallelism(quint32 threads); + +protected: + int benchmarkImpl(int msec) const override; + + quint32 m_memory; + quint32 m_parallelism; + +private: + static bool transformKeyRaw(const QByteArray& key, + const QByteArray& seed, + int rounds, + quint32 memory, + quint32 parallelism, + QByteArray& result) Q_REQUIRED_RESULT; +}; + +#endif // KEEPASSX_ARGON2KDF_H diff --git a/src/crypto/kdf/Kdf.cpp b/src/crypto/kdf/Kdf.cpp index cfc3025c1..5134adc5f 100644 --- a/src/crypto/kdf/Kdf.cpp +++ b/src/crypto/kdf/Kdf.cpp @@ -20,8 +20,12 @@ #include <QtConcurrent> +#include "crypto/Random.h" + Kdf::Kdf(Uuid uuid) - : m_uuid(uuid) + : m_rounds(KDF_DEFAULT_ROUNDS) + , m_seed(QByteArray(KDF_DEFAULT_SEED_SIZE, 0)) + , m_uuid(uuid) { } @@ -30,6 +34,37 @@ Uuid Kdf::uuid() const return m_uuid; } +int Kdf::rounds() const +{ + return m_rounds; +} + +QByteArray Kdf::seed() const +{ + return m_seed; +} + +bool Kdf::setRounds(int rounds) +{ + m_rounds = rounds; + return true; +} + +bool Kdf::setSeed(const QByteArray& seed) +{ + if (seed.size() != m_seed.size()) { + return false; + } + + m_seed = seed; + return true; +} + +void Kdf::randomizeSeed() +{ + setSeed(randomGen()->randomArray(m_seed.size())); +} + int Kdf::benchmark(int msec) const { BenchmarkThread thread1(msec, this); @@ -41,7 +76,7 @@ int Kdf::benchmark(int msec) const thread1.wait(); thread2.wait(); - return qMin(thread1.rounds(), thread2.rounds()); + return qMax(1, qMin(thread1.rounds(), thread2.rounds())); } Kdf::BenchmarkThread::BenchmarkThread(int msec, const Kdf* kdf) diff --git a/src/crypto/kdf/Kdf.h b/src/crypto/kdf/Kdf.h index 5330e71d0..cb0bcc364 100644 --- a/src/crypto/kdf/Kdf.h +++ b/src/crypto/kdf/Kdf.h @@ -22,6 +22,9 @@ #include "core/Uuid.h" +#define KDF_DEFAULT_SEED_SIZE 32 +#define KDF_DEFAULT_ROUNDS 100000ull + class Kdf { public: @@ -30,12 +33,13 @@ public: Uuid uuid() const; - virtual quint64 rounds() const = 0; - virtual bool setRounds(quint64 rounds) = 0; - virtual QByteArray seed() const = 0; - virtual bool setSeed(const QByteArray& seed) = 0; + int rounds() const; + virtual bool setRounds(int rounds); + QByteArray seed() const; + virtual bool setSeed(const QByteArray& seed); + virtual void randomizeSeed(); + virtual bool transform(const QByteArray& raw, QByteArray& result) const = 0; - virtual void randomizeTransformSalt() = 0; virtual QSharedPointer<Kdf> clone() const = 0; int benchmark(int msec) const; @@ -43,6 +47,9 @@ public: protected: virtual int benchmarkImpl(int msec) const = 0; + int m_rounds; + QByteArray m_seed; + private: class BenchmarkThread; const Uuid m_uuid; diff --git a/src/format/KeePass2.cpp b/src/format/KeePass2.cpp index 61bd383df..fd57148d0 100644 --- a/src/format/KeePass2.cpp +++ b/src/format/KeePass2.cpp @@ -16,15 +16,16 @@ */ #include "KeePass2.h" -#include "crypto/kdf/AesKdf.h" #include <QSharedPointer> - +#include "crypto/kdf/AesKdf.h" +#include "crypto/kdf/Argon2Kdf.h" const Uuid KeePass2::CIPHER_AES = Uuid(QByteArray::fromHex("31c1f2e6bf714350be5805216afc5aff")); const Uuid KeePass2::CIPHER_TWOFISH = Uuid(QByteArray::fromHex("ad68f29f576f4bb9a36ad47af965346c")); const Uuid KeePass2::CIPHER_CHACHA20 = Uuid(QByteArray::fromHex("D6038A2B8B6F4CB5A524339A31DBB59A")); const Uuid KeePass2::KDF_AES = Uuid(QByteArray::fromHex("C9D9F39A628A4460BF740D08C18A4FEA")); +const Uuid KeePass2::KDF_ARGON2 = Uuid(QByteArray::fromHex("EF636DDF8C29444B91F7A9A403E30A0C")); const QByteArray KeePass2::INNER_STREAM_SALSA20_IV("\xE8\x30\x09\x4B\x97\x20\x5D\x2A"); @@ -35,12 +36,15 @@ const QList<QPair<Uuid, QString>> KeePass2::CIPHERS { }; const QList<QPair<Uuid, QString>> KeePass2::KDFS { qMakePair(KeePass2::KDF_AES, QObject::tr("AES-KDF")), + qMakePair(KeePass2::KDF_ARGON2, QObject::tr("Argon2")), }; QSharedPointer<Kdf> KeePass2::uuidToKdf(const Uuid& uuid) { if (uuid == KDF_AES) { return QSharedPointer<AesKdf>::create(); + } else if (uuid == KDF_ARGON2) { + return QSharedPointer<Argon2Kdf>::create(); } Q_ASSERT_X(false, "uuidToKdf", "Invalid UUID"); diff --git a/src/format/KeePass2.h b/src/format/KeePass2.h index c7945e907..99bc5a0b0 100644 --- a/src/format/KeePass2.h +++ b/src/format/KeePass2.h @@ -40,6 +40,7 @@ namespace KeePass2 extern const Uuid CIPHER_CHACHA20; extern const Uuid KDF_AES; + extern const Uuid KDF_ARGON2; extern const QByteArray INNER_STREAM_SALSA20_IV; diff --git a/src/gui/DatabaseSettingsWidget.cpp b/src/gui/DatabaseSettingsWidget.cpp index 51c0f4183..2f4fe177d 100644 --- a/src/gui/DatabaseSettingsWidget.cpp +++ b/src/gui/DatabaseSettingsWidget.cpp @@ -26,6 +26,7 @@ #include "core/Group.h" #include "core/Metadata.h" #include "crypto/SymmetricCipher.h" +#include "crypto/kdf/Argon2Kdf.h" #include "MessageBox.h" DatabaseSettingsWidget::DatabaseSettingsWidget(QWidget* parent) @@ -42,6 +43,7 @@ DatabaseSettingsWidget::DatabaseSettingsWidget(QWidget* parent) connect(m_ui->historyMaxSizeCheckBox, SIGNAL(toggled(bool)), m_ui->historyMaxSizeSpinBox, SLOT(setEnabled(bool))); connect(m_ui->transformBenchmarkButton, SIGNAL(clicked()), SLOT(transformRoundsBenchmark())); + connect(m_ui->kdfComboBox, SIGNAL(currentIndexChanged(int)), SLOT(kdfChanged(int))); } DatabaseSettingsWidget::~DatabaseSettingsWidget() @@ -83,19 +85,29 @@ void DatabaseSettingsWidget::load(Database* db) m_ui->algorithmComboBox->setCurrentIndex(cipherIndex); } - bool blockSignals = m_ui->kdfComboBox->signalsBlocked(); + // Setup kdf combo box m_ui->kdfComboBox->blockSignals(true); - m_ui->kdfComboBox->clear(); for (auto& kdf: asConst(KeePass2::KDFS)) { m_ui->kdfComboBox->addItem(kdf.second, kdf.first.toByteArray()); } - int kdfIndex = m_ui->kdfComboBox->findData(m_db->kdf()->uuid().toByteArray()); + m_ui->kdfComboBox->blockSignals(false); + + auto kdfUuid = m_db->kdf()->uuid(); + int kdfIndex = m_ui->kdfComboBox->findData(kdfUuid.toByteArray()); if (kdfIndex > -1) { m_ui->kdfComboBox->setCurrentIndex(kdfIndex); + kdfChanged(kdfIndex); + } + + // Setup kdf parameters + auto kdf = m_db->kdf(); + m_ui->transformRoundsSpinBox->setValue(kdf->rounds()); + if (kdfUuid == KeePass2::KDF_ARGON2) { + auto argon2Kdf = kdf.staticCast<Argon2Kdf>(); + m_ui->memorySpinBox->setValue(argon2Kdf->memory()); + m_ui->parallelismSpinBox->setValue(argon2Kdf->parallelism()); } - m_ui->kdfComboBox->blockSignals(blockSignals); - m_ui->transformRoundsSpinBox->setValue(static_cast<unsigned>(m_db->kdf()->rounds())); m_ui->dbNameEdit->setFocus(); } @@ -139,8 +151,14 @@ void DatabaseSettingsWidget::save() m_db->setCipher(Uuid(m_ui->algorithmComboBox->currentData().toByteArray())); + // Save kdf parameters auto kdf = KeePass2::uuidToKdf(Uuid(m_ui->kdfComboBox->currentData().toByteArray())); - kdf->setRounds(static_cast<quint64>(qMax(0, m_ui->transformRoundsSpinBox->value()))); + kdf->setRounds(m_ui->transformRoundsSpinBox->value()); + if (kdf->uuid() == KeePass2::KDF_ARGON2) { + auto argon2Kdf = kdf.staticCast<Argon2Kdf>(); + argon2Kdf->setMemory(m_ui->memorySpinBox->value()); + argon2Kdf->setParallelism(m_ui->parallelismSpinBox->value()); + } QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); // TODO: we should probably use AsyncTask::runAndWaitForFuture() here, @@ -164,11 +182,26 @@ void DatabaseSettingsWidget::reject() void DatabaseSettingsWidget::transformRoundsBenchmark() { QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); - m_ui->transformRoundsSpinBox->setValue(AsyncTask::runAndWaitForFuture([this]() { - int rounds = m_db->kdf()->benchmark(1000); - QApplication::restoreOverrideCursor(); - return rounds; - })); + m_ui->transformBenchmarkButton->setEnabled(false); + + // Create a new kdf with the current parameters + auto kdf = KeePass2::uuidToKdf(Uuid(m_ui->kdfComboBox->currentData().toByteArray())); + kdf->setRounds(m_ui->transformRoundsSpinBox->value()); + if (kdf->uuid() == KeePass2::KDF_ARGON2) { + auto argon2Kdf = kdf.staticCast<Argon2Kdf>(); + argon2Kdf->setMemory(m_ui->memorySpinBox->value()); + argon2Kdf->setParallelism(m_ui->parallelismSpinBox->value()); + } + + // Determine the number of rounds required to meet 1 second delay + int rounds = AsyncTask::runAndWaitForFuture([this, kdf]() { + return kdf->benchmark(1000); + }); + + m_ui->transformRoundsSpinBox->setValue(rounds); + + QApplication::restoreOverrideCursor(); + m_ui->transformBenchmarkButton->setEnabled(true); } void DatabaseSettingsWidget::truncateHistories() @@ -178,3 +211,15 @@ void DatabaseSettingsWidget::truncateHistories() entry->truncateHistory(); } } + +void DatabaseSettingsWidget::kdfChanged(int index) +{ + Uuid id(m_ui->kdfComboBox->itemData(index).toByteArray()); + if (id == KeePass2::KDF_ARGON2) { + m_ui->memorySpinBox->setEnabled(true); + m_ui->parallelismSpinBox->setEnabled(true); + } else { + m_ui->memorySpinBox->setEnabled(false); + m_ui->parallelismSpinBox->setEnabled(false); + } +} diff --git a/src/gui/DatabaseSettingsWidget.h b/src/gui/DatabaseSettingsWidget.h index ec3d6415a..83a5eb098 100644 --- a/src/gui/DatabaseSettingsWidget.h +++ b/src/gui/DatabaseSettingsWidget.h @@ -51,6 +51,7 @@ private slots: void save(); void reject(); void transformRoundsBenchmark(); + void kdfChanged(int index); private: void truncateHistories(); diff --git a/src/gui/DatabaseSettingsWidget.ui b/src/gui/DatabaseSettingsWidget.ui index 8aaab19e7..5a6778678 100644 --- a/src/gui/DatabaseSettingsWidget.ui +++ b/src/gui/DatabaseSettingsWidget.ui @@ -2,6 +2,14 @@ <ui version="4.0"> <class>DatabaseSettingsWidget</class> <widget class="QWidget" name="DatabaseSettingsWidget"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>1082</width> + <height>506</height> + </rect> + </property> <layout class="QVBoxLayout" name="verticalLayout" stretch="1,2,5,1"> <item> <spacer name="verticalSpacer_2"> @@ -35,39 +43,36 @@ <widget class="QWidget" name="widget" native="true"> <property name="maximumSize"> <size> - <width>800</width> + <width>400</width> <height>16777215</height> </size> </property> <layout class="QGridLayout" name="gridLayout"> - <item row="4" column="2"> + <item row="11" column="1"> + <widget class="QCheckBox" name="historyMaxSizeCheckBox"> + <property name="text"> + <string>Max. history size:</string> + </property> + </widget> + </item> + <item row="0" column="2"> + <widget class="QLineEdit" name="dbNameEdit"/> + </item> + <item row="7" column="2"> <layout class="QHBoxLayout" name="horizontalLayout_3"> <item> - <widget class="QSpinBox" name="transformRoundsSpinBox"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> + <widget class="QSpinBox" name="memorySpinBox"> + <property name="suffix"> + <string> MB</string> </property> <property name="minimum"> <number>1</number> </property> <property name="maximum"> - <number>1000000000</number> + <number>1048576</number> </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="transformBenchmarkButton"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Fixed" vsizetype="MinimumExpanding"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Benchmark</string> + <property name="value"> + <number>64</number> </property> </widget> </item> @@ -80,31 +85,55 @@ </property> </widget> </item> - <item row="8" column="1"> - <widget class="QCheckBox" name="historyMaxSizeCheckBox"> - <property name="text"> - <string>Max. history size:</string> - </property> - </widget> - </item> - <item row="4" column="1" alignment="Qt::AlignRight"> - <widget class="QLabel" name="transformRoundsLabel"> - <property name="text"> - <string>Transform rounds:</string> - </property> - </widget> - </item> - <item row="7" column="1"> + <item row="10" column="1"> <widget class="QCheckBox" name="historyMaxItemsCheckBox"> <property name="text"> <string>Max. history items:</string> </property> </widget> </item> - <item row="0" column="2"> - <widget class="QLineEdit" name="dbNameEdit"/> + <item row="4" column="1"> + <widget class="QLabel" name="kdfLabel"> + <property name="text"> + <string>Key Derivation Function</string> + </property> + </widget> </item> - <item row="7" column="2"> + <item row="3" column="2"> + <widget class="QComboBox" name="algorithmComboBox"> + <item> + <property name="text"> + <string>AES: 256 Bit (default)</string> + </property> + </item> + <item> + <property name="text"> + <string>Twofish: 256 Bit</string> + </property> + </item> + </widget> + </item> + <item row="3" column="1" alignment="Qt::AlignRight"> + <widget class="QLabel" name="algorithmLabel"> + <property name="text"> + <string>Encryption Algorithm:</string> + </property> + </widget> + </item> + <item row="1" column="1" alignment="Qt::AlignRight"> + <widget class="QLabel" name="dbDescriptionLabel"> + <property name="text"> + <string>Database description:</string> + </property> + </widget> + </item> + <item row="1" column="2"> + <widget class="QLineEdit" name="dbDescriptionEdit"/> + </item> + <item row="4" column="2"> + <widget class="QComboBox" name="kdfComboBox"/> + </item> + <item row="10" column="2"> <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> <widget class="QSpinBox" name="historyMaxItemsSpinBox"> @@ -121,17 +150,7 @@ </item> </layout> </item> - <item row="5" column="1" alignment="Qt::AlignRight"> - <widget class="QLabel" name="defaultUsernameLabel"> - <property name="text"> - <string>Default username:</string> - </property> - </widget> - </item> - <item row="1" column="2"> - <widget class="QLineEdit" name="dbDescriptionEdit"/> - </item> - <item row="8" column="2"> + <item row="11" column="2"> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <widget class="QSpinBox" name="historyMaxSizeSpinBox"> @@ -155,54 +174,101 @@ </layout> </item> <item row="6" column="2"> - <widget class="QCheckBox" name="recycleBinEnabledCheckBox"> - <property name="text"> - <string>Use recycle bin</string> + <widget class="QSpinBox" name="transformRoundsSpinBox"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="alignment"> + <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> + </property> + <property name="minimum"> + <number>1</number> + </property> + <property name="maximum"> + <number>1000000000</number> </property> </widget> </item> <item row="5" column="2"> + <widget class="QToolButton" name="transformBenchmarkButton"> + <property name="sizePolicy"> + <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Benchmark 1-second delay</string> + </property> + </widget> + </item> + <item row="2" column="2"> <widget class="QLineEdit" name="defaultUsernameEdit"> <property name="enabled"> <bool>true</bool> </property> </widget> </item> - <item row="1" column="1" alignment="Qt::AlignRight"> - <widget class="QLabel" name="dbDescriptionLabel"> + <item row="2" column="1"> + <widget class="QLabel" name="defaultUsernameLabel"> <property name="text"> - <string>Database description:</string> + <string>Default username:</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> </property> </widget> </item> - <item row="2" column="2"> - <widget class="QComboBox" name="algorithmComboBox"> - <item> - <property name="text"> - <string>AES: 256 Bit (default)</string> - </property> - </item> - <item> - <property name="text"> - <string>Twofish: 256 Bit</string> - </property> - </item> - </widget> - </item> - <item row="2" column="1" alignment="Qt::AlignRight"> - <widget class="QLabel" name="algorithmLabel"> + <item row="6" column="1"> + <widget class="QLabel" name="transformRoundsLabel"> <property name="text"> - <string>Encryption Algorithm:</string> + <string>Transform rounds:</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> </property> </widget> </item> - <item row="3" column="2"> - <widget class="QComboBox" name="kdfComboBox"/> - </item> - <item row="3" column="1"> - <widget class="QLabel" name="kdfLabel"> + <item row="7" column="1"> + <widget class="QLabel" name="memoryUsageLabel"> <property name="text"> - <string>Key Derivation Function</string> + <string>Memory Usage:</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="8" column="1"> + <widget class="QLabel" name="parallelismLabel"> + <property name="text"> + <string>Parallelism:</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="8" column="2"> + <widget class="QSpinBox" name="parallelismSpinBox"> + <property name="suffix"> + <string> thread</string> + </property> + <property name="minimum"> + <number>1</number> + </property> + <property name="maximum"> + <number>128</number> + </property> + </widget> + </item> + <item row="9" column="1"> + <widget class="QCheckBox" name="recycleBinEnabledCheckBox"> + <property name="text"> + <string>Use recycle bin</string> </property> </widget> </item> @@ -249,10 +315,6 @@ <tabstops> <tabstop>dbNameEdit</tabstop> <tabstop>dbDescriptionEdit</tabstop> - <tabstop>transformRoundsSpinBox</tabstop> - <tabstop>transformBenchmarkButton</tabstop> - <tabstop>defaultUsernameEdit</tabstop> - <tabstop>recycleBinEnabledCheckBox</tabstop> <tabstop>historyMaxItemsCheckBox</tabstop> <tabstop>historyMaxItemsSpinBox</tabstop> <tabstop>historyMaxSizeCheckBox</tabstop> diff --git a/src/main.cpp b/src/main.cpp index deabeabb7..da71739c4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -27,7 +27,6 @@ #include "crypto/Crypto.h" #include "gui/Application.h" #include "gui/MainWindow.h" -#include "gui/csvImport/CsvImportWizard.h" #include "gui/MessageBox.h" #if defined(WITH_ASAN) && defined(WITH_LSAN) From 738f870e70b34620b5e441a97854710142319812 Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Mon, 1 Jan 2018 13:59:57 -0500 Subject: [PATCH 234/402] Correct regression in database modification signal --- src/core/Database.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/core/Database.cpp b/src/core/Database.cpp index ae1664118..e3fa5a269 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -261,6 +261,7 @@ bool Database::setKey(const CompositeKey& key, bool updateChangedTime, bool upda m_data.kdf->randomizeSeed(); } + QByteArray oldTransformedMasterKey = m_data.transformedMasterKey; QByteArray transformedMasterKey; if (!key.transform(*m_data.kdf, transformedMasterKey)) { return false; @@ -272,7 +273,10 @@ bool Database::setKey(const CompositeKey& key, bool updateChangedTime, bool upda if (updateChangedTime) { m_metadata->setMasterKeyChanged(QDateTime::currentDateTimeUtc()); } - emit modifiedImmediate(); + + if (oldTransformedMasterKey != m_data.transformedMasterKey) { + emit modifiedImmediate(); + } return true; } @@ -461,7 +465,9 @@ QString Database::saveToFile(QString filePath) if (saveFile.open(QIODevice::WriteOnly)) { // write the database to the file + setEmitModified(false); writer.writeDatabase(&saveFile, this); + setEmitModified(true); if (writer.hasError()) { return writer.errorString(); From 7dba788d09b3333087961e6fa2af4b02579999b4 Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Mon, 1 Jan 2018 14:24:37 -0500 Subject: [PATCH 235/402] Correct failure in GUI tests due to widget name --- tests/gui/TestGui.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/gui/TestGui.cpp b/tests/gui/TestGui.cpp index 9f1e7abc2..449f13a06 100644 --- a/tests/gui/TestGui.cpp +++ b/tests/gui/TestGui.cpp @@ -898,7 +898,8 @@ void TestGui::testDatabaseSettings() m_db->metadata()->setName("Save"); triggerAction("actionChangeDatabaseSettings"); QWidget* dbSettingsWidget = m_dbWidget->findChild<QWidget*>("databaseSettingsWidget"); - QSpinBox* transformRoundsSpinBox = dbSettingsWidget->findChild<QSpinBox*>("kdfParams0"); + QSpinBox* transformRoundsSpinBox = dbSettingsWidget->findChild<QSpinBox*>("transformRoundsSpinBox"); + QVERIFY(transformRoundsSpinBox != nullptr); transformRoundsSpinBox->setValue(100); QTest::keyClick(transformRoundsSpinBox, Qt::Key_Enter); // wait for modified timer From bef7ba2cfed00b88175473ae68481cebb7746098 Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Fri, 5 Jan 2018 10:41:29 -0500 Subject: [PATCH 236/402] Implements KDBX4 format with Argon2 KDF * Adds KDBX4 reader/writer interfaces * Adds KDBX4 XML reader/write interfaces * Implements test cases for KDBX4 * Fully compatible with KeePass2 * Corrects minor issues with Argon2 KDF --- src/CMakeLists.txt | 4 + src/core/Database.cpp | 8 + src/core/Database.h | 3 + src/core/Metadata.cpp | 10 + src/core/Metadata.h | 4 + src/crypto/kdf/AesKdf.cpp | 25 + src/crypto/kdf/AesKdf.h | 2 + src/crypto/kdf/Argon2Kdf.cpp | 139 +++- src/crypto/kdf/Argon2Kdf.h | 16 +- src/crypto/kdf/Kdf.cpp | 8 +- src/crypto/kdf/Kdf.h | 2 + src/format/Kdbx3Reader.cpp | 2 +- src/format/Kdbx3Writer.cpp | 2 +- src/format/Kdbx4Reader.cpp | 522 ++++++++++++++ src/format/Kdbx4Reader.h | 66 ++ src/format/Kdbx4Writer.cpp | 326 +++++++++ src/format/Kdbx4Writer.h | 52 ++ src/format/Kdbx4XmlReader.cpp | 1080 ++++++++++++++++++++++++++++ src/format/Kdbx4XmlReader.h | 102 +++ src/format/Kdbx4XmlWriter.cpp | 611 ++++++++++++++++ src/format/Kdbx4XmlWriter.h | 93 +++ src/format/KeePass2.cpp | 46 ++ src/format/KeePass2.h | 58 +- src/format/KeePass2Reader.cpp | 17 +- src/format/KeePass2Reader.h | 3 +- src/format/KeePass2Repair.cpp | 19 +- src/format/KeePass2Writer.cpp | 19 +- src/gui/DatabaseSettingsWidget.cpp | 13 +- src/gui/DatabaseWidget.cpp | 2 +- tests/CMakeLists.txt | 3 + tests/TestKdbx4XmlReader.cpp | 22 + tests/TestKeePass2Reader.cpp | 23 + tests/TestKeePass2Reader.h | 1 + tests/TestKeePass2XmlReader.cpp | 40 ++ tests/TestKeePass2XmlReader.h | 13 + tests/data/Format400.kdbx | Bin 0 -> 1801 bytes 36 files changed, 3305 insertions(+), 51 deletions(-) create mode 100644 src/format/Kdbx4Reader.cpp create mode 100644 src/format/Kdbx4Reader.h create mode 100644 src/format/Kdbx4Writer.cpp create mode 100644 src/format/Kdbx4Writer.h create mode 100644 src/format/Kdbx4XmlReader.cpp create mode 100644 src/format/Kdbx4XmlReader.h create mode 100644 src/format/Kdbx4XmlWriter.cpp create mode 100644 src/format/Kdbx4XmlWriter.h create mode 100644 tests/TestKdbx4XmlReader.cpp create mode 100644 tests/data/Format400.kdbx diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1e927ee38..6ab5308dc 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -91,6 +91,10 @@ set(keepassx_SOURCES format/Kdbx3Writer.cpp format/Kdbx3XmlReader.cpp format/Kdbx3XmlWriter.cpp + format/Kdbx4Reader.cpp + format/Kdbx4Writer.cpp + format/Kdbx4XmlReader.cpp + format/Kdbx4XmlWriter.cpp gui/AboutDialog.cpp gui/Application.cpp gui/CategoryListWidget.cpp diff --git a/src/core/Database.cpp b/src/core/Database.cpp index e3fa5a269..98a4fc817 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -494,6 +494,14 @@ void Database::setKdf(QSharedPointer<Kdf> kdf) m_data.kdf = std::move(kdf); } +void Database::setPublicCustomData(QByteArray data) { + m_data.publicCustomData = data; +} + +QByteArray Database::publicCustomData() const { + return m_data.publicCustomData; +} + bool Database::changeKdf(QSharedPointer<Kdf> kdf) { kdf->randomizeSeed(); diff --git a/src/core/Database.h b/src/core/Database.h index b293c760d..3bf43f62d 100644 --- a/src/core/Database.h +++ b/src/core/Database.h @@ -58,6 +58,7 @@ public: Uuid cipher; CompressionAlgorithm compressionAlgo; QByteArray transformedMasterKey; + QByteArray publicCustomData; QSharedPointer<Kdf> kdf; CompositeKey key; bool hasKey; @@ -91,6 +92,7 @@ public: Uuid cipher() const; Database::CompressionAlgorithm compressionAlgo() const; QSharedPointer<Kdf> kdf() const; + QByteArray publicCustomData() const; QByteArray transformedMasterKey() const; const CompositeKey& key() const; QByteArray challengeResponseKey() const; @@ -99,6 +101,7 @@ public: void setCipher(const Uuid& cipher); void setCompressionAlgo(Database::CompressionAlgorithm algo); void setKdf(QSharedPointer<Kdf> kdf); + void setPublicCustomData(QByteArray data); bool setKey(const CompositeKey& key, bool updateChangedTime = true, bool updateTransformSalt = false); bool hasKey() const; diff --git a/src/core/Metadata.cpp b/src/core/Metadata.cpp index 46b0a0b5e..ab56dab7f 100644 --- a/src/core/Metadata.cpp +++ b/src/core/Metadata.cpp @@ -49,6 +49,7 @@ Metadata::Metadata(QObject* parent) m_recycleBinChanged = now; m_entryTemplatesGroupChanged = now; m_masterKeyChanged = now; + m_settingsChanged = now; } template <class P, class V> bool Metadata::set(P& property, const V& value) @@ -525,3 +526,12 @@ void Metadata::removeCustomField(const QString& key) m_customFields.remove(key); emit modified(); } + +QDateTime Metadata::settingsChanged() const { + return m_settingsChanged; +} + +void Metadata::setSettingsChanged(const QDateTime& value) { + Q_ASSERT(value.timeSpec() == Qt::UTC); + m_settingsChanged = value; +} diff --git a/src/core/Metadata.h b/src/core/Metadata.h index 1e972fd5a..7791b0387 100644 --- a/src/core/Metadata.h +++ b/src/core/Metadata.h @@ -69,6 +69,7 @@ public: QDateTime descriptionChanged() const; QString defaultUserName() const; QDateTime defaultUserNameChanged() const; + QDateTime settingsChanged() const; int maintenanceHistoryDays() const; QColor color() const; bool protectTitle() const; @@ -108,6 +109,7 @@ public: void setDescriptionChanged(const QDateTime& value); void setDefaultUserName(const QString& value); void setDefaultUserNameChanged(const QDateTime& value); + void setSettingsChanged(const QDateTime& value); void setMaintenanceHistoryDays(int value); void setColor(const QColor& value); void setProtectTitle(bool value); @@ -141,6 +143,7 @@ public: * - Master key changed date * - Custom icons * - Custom fields + * - Settings changed date */ void copyAttributesFrom(const Metadata* other); @@ -170,6 +173,7 @@ private: QPointer<Group> m_lastTopVisibleGroup; QDateTime m_masterKeyChanged; + QDateTime m_settingsChanged; QHash<QString, QString> m_customFields; diff --git a/src/crypto/kdf/AesKdf.cpp b/src/crypto/kdf/AesKdf.cpp index 3177506fc..d668652aa 100644 --- a/src/crypto/kdf/AesKdf.cpp +++ b/src/crypto/kdf/AesKdf.cpp @@ -27,6 +27,31 @@ AesKdf::AesKdf() { } +bool AesKdf::processParameters(const QVariantMap &p) +{ + bool ok; + int rounds = p.value(KeePass2::KDFPARAM_AES_ROUNDS).toInt(&ok); + if (!ok || !setRounds(rounds)) { + return false; + } + + QByteArray seed = p.value(KeePass2::KDFPARAM_AES_SEED).toByteArray(); + if (!setSeed(seed)) { + return false; + } + + return true; +} + +QVariantMap AesKdf::writeParameters() +{ + QVariantMap p; + p.insert(KeePass2::KDFPARAM_UUID, KeePass2::KDF_AES.toByteArray()); + p.insert(KeePass2::KDFPARAM_AES_ROUNDS, rounds()); + p.insert(KeePass2::KDFPARAM_AES_SEED, seed()); + return p; +} + bool AesKdf::transform(const QByteArray& raw, QByteArray& result) const { QByteArray resultLeft; diff --git a/src/crypto/kdf/AesKdf.h b/src/crypto/kdf/AesKdf.h index 3e2c8ada6..69c15b8af 100644 --- a/src/crypto/kdf/AesKdf.h +++ b/src/crypto/kdf/AesKdf.h @@ -25,6 +25,8 @@ class AesKdf: public Kdf public: AesKdf(); + bool processParameters(const QVariantMap& p) override; + QVariantMap writeParameters() override; bool transform(const QByteArray& raw, QByteArray& result) const override; QSharedPointer<Kdf> clone() const override; diff --git a/src/crypto/kdf/Argon2Kdf.cpp b/src/crypto/kdf/Argon2Kdf.cpp index fa410dc93..12e9135af 100644 --- a/src/crypto/kdf/Argon2Kdf.cpp +++ b/src/crypto/kdf/Argon2Kdf.cpp @@ -32,24 +32,43 @@ */ Argon2Kdf::Argon2Kdf() : Kdf::Kdf(KeePass2::KDF_ARGON2) + , m_version(0x13) , m_memory(1<<16) , m_parallelism(2) { m_rounds = 1; } -quint32 Argon2Kdf::memory() const +quint32 Argon2Kdf::version() const { - // Convert to Megabytes - return m_memory / (1<<10); + return m_version; } -bool Argon2Kdf::setMemory(quint32 memoryMegabytes) +bool Argon2Kdf::setVersion(quint32 version) { - // TODO: add bounds check - // Convert to Kibibytes - m_memory = (1<<10) * memoryMegabytes; - return true; + // MIN=0x10; MAX=0x13) + if (version >= 0x10 && version <= 0x13) { + m_version = version; + return true; + } + m_version = 0x13; + return false; +} + +quint64 Argon2Kdf::memory() const +{ + return m_memory; +} + +bool Argon2Kdf::setMemory(quint64 kibibytes) +{ + // MIN=8KB; MAX=2,147,483,648KB + if (kibibytes >= 8 && kibibytes < (1ULL<<32)) { + m_memory = kibibytes; + return true; + } + m_memory = 16; + return false; } quint32 Argon2Kdf::parallelism() const @@ -59,30 +78,97 @@ quint32 Argon2Kdf::parallelism() const bool Argon2Kdf::setParallelism(quint32 threads) { - // TODO: add bounds check - m_parallelism = threads; + // MIN=1; MAX=16,777,215 + if (threads >= 1 && threads < (1<<24)) { + m_parallelism = threads; + return true; + } + m_parallelism = 1; + return false; +} + +bool Argon2Kdf::processParameters(const QVariantMap &p) +{ + QByteArray salt = p.value(KeePass2::KDFPARAM_ARGON2_SALT).toByteArray(); + if (!setSeed(salt)) { + return false; + } + + bool ok; + quint32 version = p.value(KeePass2::KDFPARAM_ARGON2_VERSION).toUInt(&ok); + if (!ok || !setVersion(version)) { + return false; + } + + quint32 lanes = p.value(KeePass2::KDFPARAM_ARGON2_PARALLELISM).toUInt(&ok); + if (!ok || !setParallelism(lanes)) { + return false; + } + + quint64 memory = p.value(KeePass2::KDFPARAM_ARGON2_MEMORY).toULongLong(&ok) / 1024ULL; + if (!ok || !setMemory(memory)) { + return false; + } + + quint64 iterations = p.value(KeePass2::KDFPARAM_ARGON2_ITERATIONS).toULongLong(&ok); + if (!ok || !setRounds(iterations)) { + return false; + } + + /* KeePass2 does not currently implement these parameters + * + QByteArray secret = p.value(KeePass2::KDFPARAM_ARGON2_SECRET).toByteArray(); + if (!argon2Kdf->setSecret(secret)) { + return nullptr; + } + + QByteArray ad = p.value(KeePass2::KDFPARAM_ARGON2_ASSOCDATA).toByteArray(); + if (!argon2Kdf->setAssocData(ad)) { + return nullptr; + } + */ + return true; } +QVariantMap Argon2Kdf::writeParameters() +{ + QVariantMap p; + p.insert(KeePass2::KDFPARAM_UUID, KeePass2::KDF_ARGON2.toByteArray()); + p.insert(KeePass2::KDFPARAM_ARGON2_VERSION, version()); + p.insert(KeePass2::KDFPARAM_ARGON2_PARALLELISM, parallelism()); + p.insert(KeePass2::KDFPARAM_ARGON2_MEMORY, memory() * 1024); + p.insert(KeePass2::KDFPARAM_ARGON2_ITERATIONS, static_cast<quint64>(rounds())); + p.insert(KeePass2::KDFPARAM_ARGON2_SALT, seed()); + + /* KeePass2 does not currently implement these + * + if (!assocData().isEmpty()) { + p.insert(KeePass2::KDFPARAM_ARGON2_ASSOCDATA, argon2Kdf.assocData()); + } + + if (!secret().isEmpty()) { + p.insert(KeePass2::KDFPARAM_ARGON2_SECRET, argon2Kdf.secret()); + } + */ + + return p; +} + bool Argon2Kdf::transform(const QByteArray& raw, QByteArray& result) const { result.clear(); result.resize(32); - - if (!transformKeyRaw(raw, seed(), rounds(), memory(), parallelism(), result)) { - return false; - } - - result = CryptoHash::hash(result, CryptoHash::Sha256); - return true; + return transformKeyRaw(raw, seed(), version(), rounds(), memory(), parallelism(), result); } -bool Argon2Kdf::transformKeyRaw(const QByteArray& key, const QByteArray& seed, int rounds, - quint32 memory, quint32 parallelism, QByteArray& result) +bool Argon2Kdf::transformKeyRaw(const QByteArray& key, const QByteArray& seed, quint32 version, + quint32 rounds, quint64 memory, quint32 parallelism, QByteArray& result) { // Time Cost, Mem Cost, Threads/Lanes, Password, length, Salt, length, out, length - int rc = argon2d_hash_raw(rounds, memory, parallelism, key.data(), key.size(), - seed.data(), seed.size(), result.data(), result.size()); + int rc = argon2_hash(rounds, memory, parallelism, key.data(), key.size(), + seed.data(), seed.size(), result.data(), result.size(), + nullptr, 0, Argon2_d, version); if (rc != ARGON2_OK) { qWarning("Argon2 error: %s", argon2_error_message(rc)); return false; @@ -105,12 +191,9 @@ int Argon2Kdf::benchmarkImpl(int msec) const timer.start(); int rounds = 4; - - int rc = argon2d_hash_raw(rounds, m_memory, m_parallelism, key.data(), key.size(), seed.data(), seed.size(), key.data(), key.size()); - if (rc != ARGON2_OK) { - qWarning("Argon2 error: %s", argon2_error_message(rc)); - return -1; + if (transformKeyRaw(key, seed, version(), rounds, memory(), parallelism(), key)) { + return static_cast<int>(rounds * (static_cast<float>(msec) / timer.elapsed())); } - return static_cast<int>(rounds * (static_cast<float>(msec) / timer.elapsed())); -} \ No newline at end of file + return 1; +} diff --git a/src/crypto/kdf/Argon2Kdf.h b/src/crypto/kdf/Argon2Kdf.h index c01698120..345ca279c 100644 --- a/src/crypto/kdf/Argon2Kdf.h +++ b/src/crypto/kdf/Argon2Kdf.h @@ -24,25 +24,31 @@ class Argon2Kdf : public Kdf { public: Argon2Kdf(); + bool processParameters(const QVariantMap& p) override; + QVariantMap writeParameters() override; bool transform(const QByteArray& raw, QByteArray& result) const override; QSharedPointer<Kdf> clone() const override; - quint32 memory() const; - bool setMemory(quint32 memory_kb); + quint32 version() const; + bool setVersion(quint32 version); + quint64 memory() const; + bool setMemory(quint64 kibibytes); quint32 parallelism() const; bool setParallelism(quint32 threads); protected: int benchmarkImpl(int msec) const override; - quint32 m_memory; + quint32 m_version; + quint64 m_memory; quint32 m_parallelism; private: static bool transformKeyRaw(const QByteArray& key, const QByteArray& seed, - int rounds, - quint32 memory, + quint32 version, + quint32 rounds, + quint64 memory, quint32 parallelism, QByteArray& result) Q_REQUIRED_RESULT; }; diff --git a/src/crypto/kdf/Kdf.cpp b/src/crypto/kdf/Kdf.cpp index 5134adc5f..e500dbe6f 100644 --- a/src/crypto/kdf/Kdf.cpp +++ b/src/crypto/kdf/Kdf.cpp @@ -46,8 +46,12 @@ QByteArray Kdf::seed() const bool Kdf::setRounds(int rounds) { - m_rounds = rounds; - return true; + if (rounds >= 1 && rounds < INT_MAX) { + m_rounds = rounds; + return true; + } + m_rounds = 1; + return false; } bool Kdf::setSeed(const QByteArray& seed) diff --git a/src/crypto/kdf/Kdf.h b/src/crypto/kdf/Kdf.h index cb0bcc364..e45d23bcd 100644 --- a/src/crypto/kdf/Kdf.h +++ b/src/crypto/kdf/Kdf.h @@ -39,6 +39,8 @@ public: virtual bool setSeed(const QByteArray& seed); virtual void randomizeSeed(); + virtual bool processParameters(const QVariantMap& p) = 0; + virtual QVariantMap writeParameters() = 0; virtual bool transform(const QByteArray& raw, QByteArray& result) const = 0; virtual QSharedPointer<Kdf> clone() const = 0; diff --git a/src/format/Kdbx3Reader.cpp b/src/format/Kdbx3Reader.cpp index b5e5e2df8..3187442be 100644 --- a/src/format/Kdbx3Reader.cpp +++ b/src/format/Kdbx3Reader.cpp @@ -82,7 +82,7 @@ Database* Kdbx3Reader::readDatabase(QIODevice* device, const CompositeKey& key, quint32 version = Endian::readSizedInt<quint32>(m_headerStream, KeePass2::BYTEORDER, &ok) & KeePass2::FILE_VERSION_CRITICAL_MASK; - quint32 maxVersion = KeePass2::FILE_VERSION & KeePass2::FILE_VERSION_CRITICAL_MASK; + quint32 maxVersion = KeePass2::FILE_VERSION_3 & KeePass2::FILE_VERSION_CRITICAL_MASK; if (!ok || (version < KeePass2::FILE_VERSION_MIN) || (version > maxVersion)) { raiseError(tr("Unsupported KeePass KDBX 2 or 3 database version.")); return nullptr; diff --git a/src/format/Kdbx3Writer.cpp b/src/format/Kdbx3Writer.cpp index 770e7270e..2fedf273c 100644 --- a/src/format/Kdbx3Writer.cpp +++ b/src/format/Kdbx3Writer.cpp @@ -74,7 +74,7 @@ bool Kdbx3Writer::writeDatabase(QIODevice* device, Database* db) CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes<qint32>(KeePass2::SIGNATURE_1, KeePass2::BYTEORDER))); CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes<qint32>(KeePass2::SIGNATURE_2, KeePass2::BYTEORDER))); - CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes<qint32>(KeePass2::FILE_VERSION, KeePass2::BYTEORDER))); + CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes<qint32>(KeePass2::FILE_VERSION_3, KeePass2::BYTEORDER))); CHECK_RETURN_FALSE(writeHeaderField(KeePass2::CipherID, db->cipher().toByteArray())); CHECK_RETURN_FALSE(writeHeaderField(KeePass2::CompressionFlags, diff --git a/src/format/Kdbx4Reader.cpp b/src/format/Kdbx4Reader.cpp new file mode 100644 index 000000000..0a69cbf2d --- /dev/null +++ b/src/format/Kdbx4Reader.cpp @@ -0,0 +1,522 @@ +/* + * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "Kdbx4Reader.h" + +#include <QBuffer> +#include <QFile> + +#include "crypto/kdf/AesKdf.h" +#include "streams/HmacBlockStream.h" +#include "core/Database.h" +#include "core/Endian.h" +#include "crypto/CryptoHash.h" +#include "format/KeePass1.h" +#include "format/KeePass2.h" +#include "format/KeePass2RandomStream.h" +#include "format/Kdbx4XmlReader.h" +#include "streams/HashedBlockStream.h" +#include "streams/QtIOCompressor" +#include "streams/StoreDataStream.h" +#include "streams/SymmetricCipherStream.h" + +Kdbx4Reader::Kdbx4Reader() + : m_device(nullptr) + , m_db(nullptr) +{ +} + +Database* Kdbx4Reader::readDatabase(QIODevice* device, const CompositeKey& key, bool keepDatabase) +{ + QScopedPointer<Database> db(new Database()); + m_db = db.data(); + m_device = device; + m_error = false; + m_errorStr.clear(); + m_xmlData.clear(); + m_masterSeed.clear(); + m_encryptionIV.clear(); + m_protectedStreamKey.clear(); + m_binaryPool.clear(); + + StoreDataStream headerStream(m_device); + headerStream.open(QIODevice::ReadOnly); + QIODevice* headerIo = &headerStream; + + bool ok; + + quint32 signature1 = Endian::readSizedInt<quint32>(headerIo, KeePass2::BYTEORDER, &ok); + if (!ok || signature1 != KeePass2::SIGNATURE_1) { + raiseError(tr("Not a KeePass database.")); + return nullptr; + } + + quint32 signature2 = Endian::readSizedInt<quint32>(headerIo, KeePass2::BYTEORDER, &ok); + if (ok && signature2 == KeePass1::SIGNATURE_2) { + raiseError(tr("The selected file is an old KeePass 1 database (.kdb).\n\n" + "You can import it by clicking on Database > 'Import KeePass 1 database...'.\n" + "This is a one-way migration. You won't be able to open the imported " + "database with the old KeePassX 0.4 version.")); + return nullptr; + } + else if (!ok || signature2 != KeePass2::SIGNATURE_2) { + raiseError(tr("Not a KeePass database.")); + return nullptr; + } + + quint32 version = Endian::readSizedInt<quint32>(headerIo, KeePass2::BYTEORDER, &ok) + & KeePass2::FILE_VERSION_CRITICAL_MASK; + if (!ok || version != (KeePass2::FILE_VERSION_4 & KeePass2::FILE_VERSION_CRITICAL_MASK)) { + raiseError(tr("Unsupported KeePass KDBX 4 database version.")); + return nullptr; + } + + while (readHeaderField(headerIo) && !hasError()) { + } + + headerStream.close(); + + if (hasError()) { + return nullptr; + } + + // check if all required headers were present + if (m_masterSeed.isEmpty() + || m_encryptionIV.isEmpty() + || m_db->cipher().isNull()) { + raiseError("missing database headers"); + return nullptr; + } + + if (!m_db->setKey(key, false)) { + raiseError(tr("Unable to calculate master key")); + return nullptr; + } + + if (m_db->challengeMasterSeed(m_masterSeed) == false) { + raiseError(tr("Unable to issue challenge-response.")); + return nullptr; + } + + CryptoHash hash(CryptoHash::Sha256); + hash.addData(m_masterSeed); + hash.addData(m_db->challengeResponseKey()); + hash.addData(m_db->transformedMasterKey()); + QByteArray finalKey = hash.result(); + + QByteArray headerSha256 = m_device->read(32); + QByteArray headerHmac = m_device->read(32); + if (headerSha256.size() != 32 || headerHmac.size() != 32) { + raiseError("Invalid header checksum size"); + return nullptr; + } + if (headerSha256 != CryptoHash::hash(headerStream.storedData(), CryptoHash::Sha256)) { + raiseError("Header SHA256 mismatch"); + return nullptr; + } + + QByteArray hmacKey = KeePass2::hmacKey(m_masterSeed, m_db->transformedMasterKey()); + if (headerHmac != CryptoHash::hmac(headerStream.storedData(), + HmacBlockStream::getHmacKey(UINT64_MAX, hmacKey), CryptoHash::Sha256)) { + raiseError(tr("Wrong key or database file is corrupt. (HMAC mismatch)")); + return nullptr; + } + HmacBlockStream hmacStream(m_device, hmacKey); + if (!hmacStream.open(QIODevice::ReadOnly)) { + raiseError(hmacStream.errorString()); + return nullptr; + } + + SymmetricCipher::Algorithm cipher = SymmetricCipher::cipherToAlgorithm(m_db->cipher()); + if (cipher == SymmetricCipher::InvalidAlgorithm) { + raiseError("Unknown cipher"); + return nullptr; + } + SymmetricCipherStream cipherStream(&hmacStream, cipher, + SymmetricCipher::algorithmMode(cipher), SymmetricCipher::Decrypt); + if (!cipherStream.init(finalKey, m_encryptionIV)) { + raiseError(cipherStream.errorString()); + return nullptr; + } + if (!cipherStream.open(QIODevice::ReadOnly)) { + raiseError(cipherStream.errorString()); + return nullptr; + } + + QIODevice* xmlDevice; + QScopedPointer<QtIOCompressor> ioCompressor; + + if (m_db->compressionAlgo() == Database::CompressionNone) { + xmlDevice = &cipherStream; + } else { + ioCompressor.reset(new QtIOCompressor(&cipherStream)); + ioCompressor->setStreamFormat(QtIOCompressor::GzipFormat); + if (!ioCompressor->open(QIODevice::ReadOnly)) { + raiseError(ioCompressor->errorString()); + return nullptr; + } + xmlDevice = ioCompressor.data(); + } + + + while (readInnerHeaderField(xmlDevice) && !hasError()) { + } + + if (hasError()) { + return nullptr; + } + + KeePass2RandomStream randomStream(m_irsAlgo); + if (!randomStream.init(m_protectedStreamKey)) { + raiseError(randomStream.errorString()); + return nullptr; + } + + QScopedPointer<QBuffer> buffer; + + if (m_saveXml) { + m_xmlData = xmlDevice->readAll(); + buffer.reset(new QBuffer(&m_xmlData)); + buffer->open(QIODevice::ReadOnly); + xmlDevice = buffer.data(); + } + + Kdbx4XmlReader xmlReader(m_binaryPool); + xmlReader.readDatabase(xmlDevice, m_db, &randomStream); + + if (xmlReader.hasError()) { + raiseError(xmlReader.errorString()); + if (keepDatabase) { + return db.take(); + } + else { + return nullptr; + } + } + + return db.take(); +} + +bool Kdbx4Reader::readHeaderField(QIODevice* device) +{ + QByteArray fieldIDArray = device->read(1); + if (fieldIDArray.size() != 1) { + raiseError("Invalid header id size"); + return false; + } + quint8 fieldID = fieldIDArray.at(0); + + bool ok; + quint32 fieldLen = Endian::readSizedInt<quint32>(device, KeePass2::BYTEORDER, &ok); + if (!ok) { + raiseError("Invalid header field length"); + return false; + } + + QByteArray fieldData; + if (fieldLen != 0) { + fieldData = device->read(fieldLen); + if (static_cast<quint32>(fieldData.size()) != fieldLen) { + raiseError("Invalid header data length"); + return false; + } + } + + switch (fieldID) { + case KeePass2::EndOfHeader: + return false; + + case KeePass2::CipherID: + setCipher(fieldData); + break; + + case KeePass2::CompressionFlags: + setCompressionFlags(fieldData); + break; + + case KeePass2::MasterSeed: + setMasterSeed(fieldData); + break; + + case KeePass2::EncryptionIV: + setEncryptionIV(fieldData); + break; + + case KeePass2::KdfParameters: { + QBuffer bufIoDevice(&fieldData); + if (!bufIoDevice.open(QIODevice::ReadOnly)) { + raiseError("Failed to open buffer for KDF parameters in header"); + return false; + } + QVariantMap kdfParams = readVariantMap(&bufIoDevice); + QSharedPointer<Kdf> kdf = KeePass2::kdfFromParameters(kdfParams); + if (kdf == nullptr) { + raiseError("Invalid KDF parameters"); + return false; + } + m_db->setKdf(kdf); + break; + } + + case KeePass2::PublicCustomData: + m_db->setPublicCustomData(fieldData); + break; + + case KeePass2::ProtectedStreamKey: + case KeePass2::TransformRounds: + case KeePass2::TransformSeed: + case KeePass2::StreamStartBytes: + case KeePass2::InnerRandomStreamID: + raiseError("Legacy header fields found in KDBX4 file."); + return false; + + default: + qWarning("Unknown header field read: id=%d", fieldID); + break; + } + + return true; +} + +bool Kdbx4Reader::readInnerHeaderField(QIODevice* device) +{ + QByteArray fieldIDArray = device->read(1); + if (fieldIDArray.size() != 1) { + raiseError("Invalid inner header id size"); + return false; + } + KeePass2::InnerHeaderFieldID fieldID = static_cast<KeePass2::InnerHeaderFieldID>(fieldIDArray.at(0)); + + bool ok; + quint32 fieldLen = Endian::readSizedInt<quint32>(device, KeePass2::BYTEORDER, &ok); + if (!ok) { + raiseError("Invalid inner header field length"); + return false; + } + + QByteArray fieldData; + if (fieldLen != 0) { + fieldData = device->read(fieldLen); + if (static_cast<quint32>(fieldData.size()) != fieldLen) { + raiseError("Invalid header data length"); + return false; + } + } + + switch (fieldID) { + case KeePass2::InnerHeaderFieldID::End: + return false; + + case KeePass2::InnerHeaderFieldID::InnerRandomStreamID: + setInnerRandomStreamID(fieldData); + break; + + case KeePass2::InnerHeaderFieldID::InnerRandomStreamKey: + setProtectedStreamKey(fieldData); + break; + + case KeePass2::InnerHeaderFieldID::Binary: + if (fieldLen < 1) { + raiseError("Invalid inner header binary size"); + return false; + } + m_binaryPool.insert(QString::number(m_binaryPool.size()), fieldData.mid(1)); + break; + + default: + qWarning("Unknown inner header field read: id=%hhu", static_cast<quint8>(fieldID)); + break; + } + + return true; +} + +QVariantMap Kdbx4Reader::readVariantMap(QIODevice* device) +{ + bool ok; + quint16 version = Endian::readSizedInt<quint16>(device, KeePass2::BYTEORDER, &ok) + & KeePass2::VARIANTMAP_CRITICAL_MASK; + quint16 maxVersion = KeePass2::VARIANTMAP_VERSION & KeePass2::VARIANTMAP_CRITICAL_MASK; + if (!ok || (version > maxVersion)) { + raiseError(tr("Unsupported KeePass variant map version.")); + return QVariantMap(); + } + + QVariantMap vm; + QByteArray fieldTypeArray; + KeePass2::VariantMapFieldType fieldType; + while (((fieldTypeArray = device->read(1)).size() == 1) + && ((fieldType = static_cast<KeePass2::VariantMapFieldType>(fieldTypeArray.at(0))) + != KeePass2::VariantMapFieldType::End)) { + quint32 nameLen = Endian::readSizedInt<quint32>(device, KeePass2::BYTEORDER, &ok); + if (!ok) { + raiseError("Invalid variant map entry name length"); + return QVariantMap(); + } + QByteArray nameBytes; + if (nameLen != 0) { + nameBytes = device->read(nameLen); + if (static_cast<quint32>(nameBytes.size()) != nameLen) { + raiseError("Invalid variant map entry name data"); + return QVariantMap(); + } + } + QString name = QString::fromUtf8(nameBytes); + + quint32 valueLen = Endian::readSizedInt<quint32>(device, KeePass2::BYTEORDER, &ok); + if (!ok) { + raiseError("Invalid variant map entry value length"); + return QVariantMap(); + } + QByteArray valueBytes; + if (valueLen != 0) { + valueBytes = device->read(valueLen); + if (static_cast<quint32>(valueBytes.size()) != valueLen) { + raiseError("Invalid variant map entry value data"); + return QVariantMap(); + } + } + + switch (fieldType) { + case KeePass2::VariantMapFieldType::Bool: + if (valueLen == 1) { + vm.insert(name, QVariant(valueBytes.at(0) != 0)); + } else { + raiseError("Invalid variant map Bool entry value length"); + return QVariantMap(); + } + break; + case KeePass2::VariantMapFieldType::Int32: + if (valueLen == 4) { + vm.insert(name, QVariant(Endian::bytesToSizedInt<qint32>(valueBytes, KeePass2::BYTEORDER))); + } else { + raiseError("Invalid variant map Int32 entry value length"); + return QVariantMap(); + } + break; + case KeePass2::VariantMapFieldType::UInt32: + if (valueLen == 4) { + vm.insert(name, QVariant(Endian::bytesToSizedInt<quint32>(valueBytes, KeePass2::BYTEORDER))); + } else { + raiseError("Invalid variant map UInt32 entry value length"); + return QVariantMap(); + } + break; + case KeePass2::VariantMapFieldType::Int64: + if (valueLen == 8) { + vm.insert(name, QVariant(Endian::bytesToSizedInt<qint64>(valueBytes, KeePass2::BYTEORDER))); + } else { + raiseError("Invalid variant map Int64 entry value length"); + return QVariantMap(); + } + break; + case KeePass2::VariantMapFieldType::UInt64: + if (valueLen == 8) { + vm.insert(name, QVariant(Endian::bytesToSizedInt<quint64>(valueBytes, KeePass2::BYTEORDER))); + } else { + raiseError("Invalid variant map UInt64 entry value length"); + return QVariantMap(); + } + break; + case KeePass2::VariantMapFieldType::String: + vm.insert(name, QVariant(QString::fromUtf8(valueBytes))); + break; + case KeePass2::VariantMapFieldType::ByteArray: + vm.insert(name, QVariant(valueBytes)); + break; + default: + raiseError("Invalid variant map entry type"); + return QVariantMap(); + } + } + + if (fieldTypeArray.size() != 1) { + raiseError("Invalid variant map field type size"); + return QVariantMap(); + } + + return vm; +} + +void Kdbx4Reader::setCipher(const QByteArray& data) +{ + if (data.size() != Uuid::Length) { + raiseError("Invalid cipher uuid length"); + } else { + Uuid uuid(data); + + if (SymmetricCipher::cipherToAlgorithm(uuid) == SymmetricCipher::InvalidAlgorithm) { + raiseError("Unsupported cipher"); + } else { + m_db->setCipher(uuid); + } + } +} + +void Kdbx4Reader::setCompressionFlags(const QByteArray& data) +{ + if (data.size() != 4) { + raiseError("Invalid compression flags length"); + } else { + quint32 id = Endian::bytesToSizedInt<quint32>(data, KeePass2::BYTEORDER); + + if (id > Database::CompressionAlgorithmMax) { + raiseError("Unsupported compression algorithm"); + } else { + m_db->setCompressionAlgo(static_cast<Database::CompressionAlgorithm>(id)); + } + } +} + +void Kdbx4Reader::setMasterSeed(const QByteArray& data) +{ + if (data.size() != 32) { + raiseError("Invalid master seed size"); + } else { + m_masterSeed = data; + } +} + +void Kdbx4Reader::setEncryptionIV(const QByteArray& data) +{ + m_encryptionIV = data; +} + +void Kdbx4Reader::setProtectedStreamKey(const QByteArray& data) +{ + m_protectedStreamKey = data; +} + +void Kdbx4Reader::setInnerRandomStreamID(const QByteArray& data) +{ + if (data.size() != 4) { + raiseError("Invalid random stream id size"); + } else { + quint32 id = Endian::bytesToSizedInt<quint32>(data, KeePass2::BYTEORDER); + KeePass2::ProtectedStreamAlgo irsAlgo = KeePass2::idToProtectedStreamAlgo(id); + if (irsAlgo == KeePass2::InvalidProtectedStreamAlgo || irsAlgo == KeePass2::ArcFourVariant) { + raiseError("Invalid inner random stream cipher"); + } else { + m_irsAlgo = irsAlgo; + } + } +} + +QHash<QString, QByteArray> Kdbx4Reader::binaryPool() +{ + return m_binaryPool; +} diff --git a/src/format/Kdbx4Reader.h b/src/format/Kdbx4Reader.h new file mode 100644 index 000000000..0375209c4 --- /dev/null +++ b/src/format/Kdbx4Reader.h @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef KEEPASSX_KDBX4READER_H +#define KEEPASSX_KDBX4READER_H + +#include <QCoreApplication> +#include <QHash> +#include <QString> +#include <QByteArray> + +#include "format/KeePass2.h" +#include "format/KeePass2Reader.h" +#include "crypto/SymmetricCipher.h" +#include "keys/CompositeKey.h" + +class Database; +class QIODevice; + +class Kdbx4Reader : public BaseKeePass2Reader +{ + Q_DECLARE_TR_FUNCTIONS(Kdbx4Reader) + +public: + Kdbx4Reader(); + + using BaseKeePass2Reader::readDatabase; + virtual Database* readDatabase(QIODevice* device, const CompositeKey& key, bool keepDatabase = false) override; + + QHash<QString, QByteArray> binaryPool(); + +private: + bool readHeaderField(QIODevice* device); + bool readInnerHeaderField(QIODevice* device); + QVariantMap readVariantMap(QIODevice* device); + + void setCipher(const QByteArray& data); + void setCompressionFlags(const QByteArray& data); + void setMasterSeed(const QByteArray& data); + void setEncryptionIV(const QByteArray& data); + void setProtectedStreamKey(const QByteArray& data); + void setInnerRandomStreamID(const QByteArray& data); + + QIODevice* m_device; + + Database* m_db; + QByteArray m_masterSeed; + QByteArray m_encryptionIV; + QHash<QString, QByteArray> m_binaryPool; +}; + +#endif // KEEPASSX_KDBX4READER_H diff --git a/src/format/Kdbx4Writer.cpp b/src/format/Kdbx4Writer.cpp new file mode 100644 index 000000000..49d04c853 --- /dev/null +++ b/src/format/Kdbx4Writer.cpp @@ -0,0 +1,326 @@ +/* + * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "Kdbx4Writer.h" + +#include <QBuffer> +#include <QFile> +#include <QIODevice> +#include <QList> +#include <QString> + +#include "streams/HmacBlockStream.h" +#include "core/Database.h" +#include "core/Endian.h" +#include "crypto/CryptoHash.h" +#include "crypto/Random.h" +#include "format/KeePass2RandomStream.h" +#include "format/Kdbx4XmlWriter.h" +#include "streams/QtIOCompressor" +#include "streams/SymmetricCipherStream.h" + +#define CHECK_RETURN_FALSE(x) if (!(x)) return false; + +Kdbx4Writer::Kdbx4Writer() + : m_device(nullptr) +{ +} + +bool Kdbx4Writer::writeDatabase(QIODevice* device, Database* db) +{ + m_error = false; + m_errorStr.clear(); + + SymmetricCipher::Algorithm algo = SymmetricCipher::cipherToAlgorithm(db->cipher()); + if (algo == SymmetricCipher::InvalidAlgorithm) { + raiseError("Invalid symmetric cipher algorithm."); + return false; + } + int ivSize = SymmetricCipher::algorithmIvSize(algo); + if (ivSize < 0) { + raiseError("Invalid symmetric cipher IV size."); + return false; + } + + QByteArray masterSeed = randomGen()->randomArray(32); + QByteArray encryptionIV = randomGen()->randomArray(ivSize); + QByteArray protectedStreamKey = randomGen()->randomArray(64); + QByteArray startBytes; + QByteArray endOfHeader = "\r\n\r\n"; + + if (db->challengeMasterSeed(masterSeed) == false) { + raiseError(tr("Unable to issue challenge-response.")); + return false; + } + + if (!db->setKey(db->key(), false, true)) { + raiseError(tr("Unable to calculate master key")); + return false; + } + + CryptoHash hash(CryptoHash::Sha256); + hash.addData(masterSeed); + hash.addData(db->challengeResponseKey()); + Q_ASSERT(!db->transformedMasterKey().isEmpty()); + hash.addData(db->transformedMasterKey()); + QByteArray finalKey = hash.result(); + + QByteArray headerData; + { + QBuffer header; + header.open(QIODevice::WriteOnly); + m_device = &header; + CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes(KeePass2::SIGNATURE_1, KeePass2::BYTEORDER))); + CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes(KeePass2::SIGNATURE_2, KeePass2::BYTEORDER))); + CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes(KeePass2::FILE_VERSION_4, KeePass2::BYTEORDER))); + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::CipherID, db->cipher().toByteArray())); + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::CompressionFlags, + Endian::sizedIntToBytes(static_cast<int>(db->compressionAlgo()), + KeePass2::BYTEORDER))); + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::MasterSeed, masterSeed)); + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::EncryptionIV, encryptionIV)); + + // Convert current Kdf to basic parameters + QVariantMap kdfParams = KeePass2::kdfToParameters(db->kdf()); + + QByteArray kdfParamBytes; + if (!serializeVariantMap(kdfParams, kdfParamBytes)) { + raiseError("Failed to serialise KDF parameters variant map"); + return false; + } + QByteArray publicCustomData = db->publicCustomData(); + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::KdfParameters, kdfParamBytes)); + if (!publicCustomData.isEmpty()) { + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::PublicCustomData, publicCustomData)); + } + + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::EndOfHeader, endOfHeader)); + header.close(); + m_device = device; + headerData = header.data(); + } + CHECK_RETURN_FALSE(writeData(headerData)); + QByteArray headerHash = CryptoHash::hash(headerData, CryptoHash::Sha256); + + QScopedPointer<QIODevice> firstLayer, secondLayer; + + QByteArray hmacKey = KeePass2::hmacKey(masterSeed, db->transformedMasterKey()); + QByteArray headerHmac = CryptoHash::hmac(headerData, HmacBlockStream::getHmacKey(UINT64_MAX, hmacKey), + CryptoHash::Sha256); + CHECK_RETURN_FALSE(writeData(headerHash)); + CHECK_RETURN_FALSE(writeData(headerHmac)); + + HmacBlockStream* hmacStream = new HmacBlockStream(device, hmacKey); + if (!hmacStream->open(QIODevice::WriteOnly)) { + raiseError(hmacStream->errorString()); + return false; + } + firstLayer.reset(static_cast<QIODevice*>(hmacStream)); + + SymmetricCipherStream* cipherStream = new SymmetricCipherStream(hmacStream, algo, + SymmetricCipher::algorithmMode(algo), + SymmetricCipher::Encrypt); + if (!cipherStream->init(finalKey, encryptionIV)) { + raiseError(cipherStream->errorString()); + return false; + } + if (!cipherStream->open(QIODevice::WriteOnly)) { + raiseError(cipherStream->errorString()); + return false; + } + secondLayer.reset(static_cast<QIODevice*>(cipherStream)); + + QScopedPointer<QtIOCompressor> ioCompressor; + if (db->compressionAlgo() == Database::CompressionNone) { + m_device = secondLayer.data(); + } else { + ioCompressor.reset(new QtIOCompressor(secondLayer.data())); + ioCompressor->setStreamFormat(QtIOCompressor::GzipFormat); + if (!ioCompressor->open(QIODevice::WriteOnly)) { + raiseError(ioCompressor->errorString()); + return false; + } + m_device = ioCompressor.data(); + } + + QHash<QByteArray, int> idMap; + + CHECK_RETURN_FALSE(writeInnerHeaderField(KeePass2::InnerHeaderFieldID::InnerRandomStreamID, + Endian::sizedIntToBytes(static_cast<int>(KeePass2::ChaCha20), + KeePass2::BYTEORDER))); + CHECK_RETURN_FALSE(writeInnerHeaderField(KeePass2::InnerHeaderFieldID::InnerRandomStreamKey, + protectedStreamKey)); + const QList<Entry*> allEntries = db->rootGroup()->entriesRecursive(true); + int nextId = 0; + + for (Entry* entry : allEntries) { + const QList<QString> attachmentKeys = entry->attachments()->keys(); + for (const QString& key : attachmentKeys) { + QByteArray data = entry->attachments()->value(key); + if (!idMap.contains(data)) { + CHECK_RETURN_FALSE(writeBinary(data)); + idMap.insert(data, nextId++); + } + } + } + CHECK_RETURN_FALSE(writeInnerHeaderField(KeePass2::InnerHeaderFieldID::End, QByteArray())); + + KeePass2RandomStream randomStream(KeePass2::ChaCha20); + if (!randomStream.init(protectedStreamKey)) { + raiseError(randomStream.errorString()); + return false; + } + + Kdbx4XmlWriter xmlWriter(KeePass2::FILE_VERSION_4, idMap); + xmlWriter.writeDatabase(m_device, db, &randomStream, headerHash); + + // Explicitly close/reset streams so they are flushed and we can detect + // errors. QIODevice::close() resets errorString() etc. + if (ioCompressor) { + ioCompressor->close(); + } + if (!secondLayer->reset()) { + raiseError(secondLayer->errorString()); + return false; + } + if (!firstLayer->reset()) { + raiseError(firstLayer->errorString()); + return false; + } + + if (xmlWriter.hasError()) { + raiseError(xmlWriter.errorString()); + return false; + } + + return true; +} + +bool Kdbx4Writer::writeData(const QByteArray& data) +{ + if (m_device->write(data) != data.size()) { + raiseError(m_device->errorString()); + return false; + } + else { + return true; + } +} + +bool Kdbx4Writer::writeHeaderField(KeePass2::HeaderFieldID fieldId, const QByteArray& data) +{ + QByteArray fieldIdArr; + fieldIdArr[0] = fieldId; + CHECK_RETURN_FALSE(writeData(fieldIdArr)); + CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes(static_cast<quint32>(data.size()), KeePass2::BYTEORDER))); + CHECK_RETURN_FALSE(writeData(data)); + + return true; +} + +bool Kdbx4Writer::writeInnerHeaderField(KeePass2::InnerHeaderFieldID fieldId, const QByteArray& data) +{ + QByteArray fieldIdArr; + fieldIdArr[0] = static_cast<char>(fieldId); + CHECK_RETURN_FALSE(writeData(fieldIdArr)); + CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes(static_cast<quint32>(data.size()), KeePass2::BYTEORDER))); + CHECK_RETURN_FALSE(writeData(data)); + + return true; +} + +bool Kdbx4Writer::writeBinary(const QByteArray& data) +{ + QByteArray fieldIdArr; + fieldIdArr[0] = static_cast<char>(KeePass2::InnerHeaderFieldID::Binary); + CHECK_RETURN_FALSE(writeData(fieldIdArr)); + CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes(static_cast<quint32>(data.size() + 1), KeePass2::BYTEORDER))); + CHECK_RETURN_FALSE(writeData(QByteArray(1, '\1'))); + CHECK_RETURN_FALSE(writeData(data)); + + return true; +} + +bool Kdbx4Writer::serializeVariantMap(const QVariantMap& p, QByteArray& o) +{ + QBuffer buf(&o); + buf.open(QIODevice::WriteOnly); + CHECK_RETURN_FALSE(buf.write(Endian::sizedIntToBytes(KeePass2::VARIANTMAP_VERSION, KeePass2::BYTEORDER)) == 2); + + bool ok; + QList<QString> keys = p.keys(); + for (int i = 0; i < keys.size(); ++i) { + QString k = keys.at(i); + KeePass2::VariantMapFieldType fieldType; + QByteArray data; + QVariant v = p.value(k); + switch (static_cast<QMetaType::Type>(v.type())) { + case QMetaType::Type::Int: + fieldType = KeePass2::VariantMapFieldType::Int32; + data = Endian::sizedIntToBytes(v.toInt(&ok), KeePass2::BYTEORDER); + CHECK_RETURN_FALSE(ok); + break; + case QMetaType::Type::UInt: + fieldType = KeePass2::VariantMapFieldType::UInt32; + data = Endian::sizedIntToBytes(v.toUInt(&ok), KeePass2::BYTEORDER); + CHECK_RETURN_FALSE(ok); + break; + case QMetaType::Type::LongLong: + fieldType = KeePass2::VariantMapFieldType::Int64; + data = Endian::sizedIntToBytes(v.toLongLong(&ok), KeePass2::BYTEORDER); + CHECK_RETURN_FALSE(ok); + break; + case QMetaType::Type::ULongLong: + fieldType = KeePass2::VariantMapFieldType::UInt64; + data = Endian::sizedIntToBytes(v.toULongLong(&ok), KeePass2::BYTEORDER); + CHECK_RETURN_FALSE(ok); + break; + case QMetaType::Type::QString: + fieldType = KeePass2::VariantMapFieldType::String; + data = v.toString().toUtf8(); + break; + case QMetaType::Type::Bool: + fieldType = KeePass2::VariantMapFieldType::Bool; + data = QByteArray(1, (v.toBool() ? '\1' : '\0')); + break; + case QMetaType::Type::QByteArray: + fieldType = KeePass2::VariantMapFieldType::ByteArray; + data = v.toByteArray(); + break; + default: + qWarning("Unknown object type %d in QVariantMap", v.type()); + return false; + } + QByteArray typeBytes; + typeBytes[0] = static_cast<char>(fieldType); + QByteArray nameBytes = k.toUtf8(); + QByteArray nameLenBytes = Endian::sizedIntToBytes(nameBytes.size(), KeePass2::BYTEORDER); + QByteArray dataLenBytes = Endian::sizedIntToBytes(data.size(), KeePass2::BYTEORDER); + + CHECK_RETURN_FALSE(buf.write(typeBytes) == 1); + CHECK_RETURN_FALSE(buf.write(nameLenBytes) == 4); + CHECK_RETURN_FALSE(buf.write(nameBytes) == nameBytes.size()); + CHECK_RETURN_FALSE(buf.write(dataLenBytes) == 4); + CHECK_RETURN_FALSE(buf.write(data) == data.size()); + } + + QByteArray endBytes; + endBytes[0] = static_cast<char>(KeePass2::VariantMapFieldType::End); + CHECK_RETURN_FALSE(buf.write(endBytes) == 1); + return true; +} diff --git a/src/format/Kdbx4Writer.h b/src/format/Kdbx4Writer.h new file mode 100644 index 000000000..4e703324d --- /dev/null +++ b/src/format/Kdbx4Writer.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef KEEPASSX_KDBX4WRITER_H +#define KEEPASSX_KDBX4WRITER_H + +#include <QCoreApplication> + +#include "format/KeePass2.h" +#include "format/KeePass2Writer.h" +#include "keys/CompositeKey.h" + +class Database; +class QIODevice; + +class Kdbx4Writer : public BaseKeePass2Writer +{ + Q_DECLARE_TR_FUNCTIONS(Kdbx4Writer) + +public: + Kdbx4Writer(); + + using BaseKeePass2Writer::writeDatabase; + bool writeDatabase(QIODevice* device, Database* db); + +private: + bool writeData(const QByteArray& data); + bool writeHeaderField(KeePass2::HeaderFieldID fieldId, const QByteArray& data); + bool writeInnerHeaderField(KeePass2::InnerHeaderFieldID fieldId, const QByteArray& data); + + QIODevice* m_device; + + bool writeBinary(const QByteArray& data); + + static bool serializeVariantMap(const QVariantMap& p, QByteArray& o); +}; + +#endif // KEEPASSX_KDBX4WRITER_H diff --git a/src/format/Kdbx4XmlReader.cpp b/src/format/Kdbx4XmlReader.cpp new file mode 100644 index 000000000..10dfe6475 --- /dev/null +++ b/src/format/Kdbx4XmlReader.cpp @@ -0,0 +1,1080 @@ +/* + * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "Kdbx4XmlReader.h" + +#include <QBuffer> +#include <QFile> +#include <QRegularExpression> + +#include "core/Endian.h" +#include "core/Database.h" +#include "core/DatabaseIcons.h" +#include "core/Group.h" +#include "core/Metadata.h" +#include "core/Tools.h" +#include "format/KeePass2RandomStream.h" +#include "streams/QtIOCompressor" + +typedef QPair<QString, QString> StringPair; + +Kdbx4XmlReader::Kdbx4XmlReader() + : m_randomStream(nullptr) + , m_db(nullptr) + , m_meta(nullptr) + , m_tmpParent(nullptr) + , m_error(false) + , m_strictMode(false) +{ +} + +Kdbx4XmlReader::Kdbx4XmlReader(QHash<QString, QByteArray>& binaryPool) + : Kdbx4XmlReader() +{ + m_binaryPool = binaryPool; +} + +void Kdbx4XmlReader::setStrictMode(bool strictMode) +{ + m_strictMode = strictMode; +} + +void Kdbx4XmlReader::readDatabase(QIODevice* device, Database* db, KeePass2RandomStream* randomStream) +{ + m_error = false; + m_errorStr.clear(); + + m_xml.clear(); + m_xml.setDevice(device); + + m_db = db; + m_meta = m_db->metadata(); + m_meta->setUpdateDatetime(false); + + m_randomStream = randomStream; + m_headerHash.clear(); + + m_tmpParent = new Group(); + + bool rootGroupParsed = false; + + if (!m_xml.hasError() && m_xml.readNextStartElement()) { + if (m_xml.name() == "KeePassFile") { + rootGroupParsed = parseKeePassFile(); + } + } + + if (!m_xml.hasError() && !rootGroupParsed) { + raiseError("No root group"); + } + + if (!m_xml.hasError()) { + if (!m_tmpParent->children().isEmpty()) { + qWarning("Kdbx4XmlReader::readDatabase: found %d invalid group reference(s)", + m_tmpParent->children().size()); + } + + if (!m_tmpParent->entries().isEmpty()) { + qWarning("Kdbx4XmlReader::readDatabase: found %d invalid entry reference(s)", + m_tmpParent->children().size()); + } + } + + const QSet<QString> poolKeys = m_binaryPool.keys().toSet(); + const QSet<QString> entryKeys = m_binaryMap.keys().toSet(); + const QSet<QString> unmappedKeys = entryKeys - poolKeys; + const QSet<QString> unusedKeys = poolKeys - entryKeys; + + if (!unmappedKeys.isEmpty()) { + raiseError("Unmapped keys left."); + } + + if (!m_xml.hasError()) { + for (const QString& key : unusedKeys) { + qWarning("Kdbx4XmlReader::readDatabase: found unused key \"%s\"", qPrintable(key)); + } + } + + QHash<QString, QPair<Entry*, QString> >::const_iterator i; + for (i = m_binaryMap.constBegin(); i != m_binaryMap.constEnd(); ++i) { + const QPair<Entry*, QString>& target = i.value(); + target.first->attachments()->set(target.second, m_binaryPool[i.key()]); + } + + m_meta->setUpdateDatetime(true); + + QHash<Uuid, Group*>::const_iterator iGroup; + for (iGroup = m_groups.constBegin(); iGroup != m_groups.constEnd(); ++iGroup) { + iGroup.value()->setUpdateTimeinfo(true); + } + + QHash<Uuid, Entry*>::const_iterator iEntry; + for (iEntry = m_entries.constBegin(); iEntry != m_entries.constEnd(); ++iEntry) { + iEntry.value()->setUpdateTimeinfo(true); + + const QList<Entry*> historyItems = iEntry.value()->historyItems(); + for (Entry* histEntry : historyItems) { + histEntry->setUpdateTimeinfo(true); + } + } + + delete m_tmpParent; +} + +Database* Kdbx4XmlReader::readDatabase(QIODevice* device) +{ + Database* db = new Database(); + readDatabase(device, db); + return db; +} + +Database* Kdbx4XmlReader::readDatabase(const QString& filename) +{ + QFile file(filename); + file.open(QIODevice::ReadOnly); + return readDatabase(&file); +} + +bool Kdbx4XmlReader::hasError() +{ + return m_error || m_xml.hasError(); +} + +QString Kdbx4XmlReader::errorString() +{ + if (m_error) { + return m_errorStr; + } else if (m_xml.hasError()) { + return QString("XML error:\n%1\nLine %2, column %3") + .arg(m_xml.errorString()) + .arg(m_xml.lineNumber()) + .arg(m_xml.columnNumber()); + } else { + return QString(); + } +} + +void Kdbx4XmlReader::raiseError(const QString& errorMessage) +{ + m_error = true; + m_errorStr = errorMessage; +} + +QByteArray Kdbx4XmlReader::headerHash() +{ + return m_headerHash; +} + +bool Kdbx4XmlReader::parseKeePassFile() +{ + Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "KeePassFile"); + + bool rootElementFound = false; + bool rootParsedSuccessfully = false; + + while (!m_xml.hasError() && m_xml.readNextStartElement()) { + if (m_xml.name() == "Meta") { + parseMeta(); + } else if (m_xml.name() == "Root") { + if (rootElementFound) { + rootParsedSuccessfully = false; + raiseError("Multiple root elements"); + } else { + rootParsedSuccessfully = parseRoot(); + rootElementFound = true; + } + } else { + skipCurrentElement(); + } + } + + return rootParsedSuccessfully; +} + +void Kdbx4XmlReader::parseMeta() +{ + Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Meta"); + + while (!m_xml.hasError() && m_xml.readNextStartElement()) { + if (m_xml.name() == "Generator") { + m_meta->setGenerator(readString()); + } else if (m_xml.name() == "HeaderHash") { + m_headerHash = readBinary(); + } else if (m_xml.name() == "DatabaseName") { + m_meta->setName(readString()); + } else if (m_xml.name() == "DatabaseNameChanged") { + m_meta->setNameChanged(readDateTime()); + } else if (m_xml.name() == "DatabaseDescription") { + m_meta->setDescription(readString()); + } else if (m_xml.name() == "DatabaseDescriptionChanged") { + m_meta->setDescriptionChanged(readDateTime()); + } else if (m_xml.name() == "DefaultUserName") { + m_meta->setDefaultUserName(readString()); + } else if (m_xml.name() == "DefaultUserNameChanged") { + m_meta->setDefaultUserNameChanged(readDateTime()); + } else if (m_xml.name() == "MaintenanceHistoryDays") { + m_meta->setMaintenanceHistoryDays(readNumber()); + } else if (m_xml.name() == "Color") { + m_meta->setColor(readColor()); + } else if (m_xml.name() == "MasterKeyChanged") { + m_meta->setMasterKeyChanged(readDateTime()); + } else if (m_xml.name() == "MasterKeyChangeRec") { + m_meta->setMasterKeyChangeRec(readNumber()); + } else if (m_xml.name() == "MasterKeyChangeForce") { + m_meta->setMasterKeyChangeForce(readNumber()); + } else if (m_xml.name() == "MemoryProtection") { + parseMemoryProtection(); + } else if (m_xml.name() == "CustomIcons") { + parseCustomIcons(); + } else if (m_xml.name() == "RecycleBinEnabled") { + m_meta->setRecycleBinEnabled(readBool()); + } else if (m_xml.name() == "RecycleBinUUID") { + m_meta->setRecycleBin(getGroup(readUuid())); + } else if (m_xml.name() == "RecycleBinChanged") { + m_meta->setRecycleBinChanged(readDateTime()); + } else if (m_xml.name() == "EntryTemplatesGroup") { + m_meta->setEntryTemplatesGroup(getGroup(readUuid())); + } else if (m_xml.name() == "EntryTemplatesGroupChanged") { + m_meta->setEntryTemplatesGroupChanged(readDateTime()); + } else if (m_xml.name() == "LastSelectedGroup") { + m_meta->setLastSelectedGroup(getGroup(readUuid())); + } else if (m_xml.name() == "LastTopVisibleGroup") { + m_meta->setLastTopVisibleGroup(getGroup(readUuid())); + } else if (m_xml.name() == "HistoryMaxItems") { + int value = readNumber(); + if (value >= -1) { + m_meta->setHistoryMaxItems(value); + } else { + raiseError("HistoryMaxItems invalid number"); + } + } else if (m_xml.name() == "HistoryMaxSize") { + int value = readNumber(); + if (value >= -1) { + m_meta->setHistoryMaxSize(value); + } else { + raiseError("HistoryMaxSize invalid number"); + } + } else if (m_xml.name() == "Binaries") { + parseBinaries(); + } else if (m_xml.name() == "CustomData") { + parseCustomData(); + } else if (m_xml.name() == "SettingsChanged") { + m_meta->setSettingsChanged(readDateTime()); + } else { + skipCurrentElement(); + } + } +} + +void Kdbx4XmlReader::parseMemoryProtection() +{ + Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "MemoryProtection"); + + while (!m_xml.hasError() && m_xml.readNextStartElement()) { + if (m_xml.name() == "ProtectTitle") { + m_meta->setProtectTitle(readBool()); + } else if (m_xml.name() == "ProtectUserName") { + m_meta->setProtectUsername(readBool()); + } else if (m_xml.name() == "ProtectPassword") { + m_meta->setProtectPassword(readBool()); + } else if (m_xml.name() == "ProtectURL") { + m_meta->setProtectUrl(readBool()); + } else if (m_xml.name() == "ProtectNotes") { + m_meta->setProtectNotes(readBool()); + } else { + skipCurrentElement(); + } + } +} + +void Kdbx4XmlReader::parseCustomIcons() +{ + Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "CustomIcons"); + + while (!m_xml.hasError() && m_xml.readNextStartElement()) { + if (m_xml.name() == "Icon") { + parseIcon(); + } else { + skipCurrentElement(); + } + } +} + +void Kdbx4XmlReader::parseIcon() +{ + Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Icon"); + + Uuid uuid; + QImage icon; + bool uuidSet = false; + bool iconSet = false; + + while (!m_xml.hasError() && m_xml.readNextStartElement()) { + if (m_xml.name() == "UUID") { + uuid = readUuid(); + uuidSet = !uuid.isNull(); + } else if (m_xml.name() == "Data") { + icon.loadFromData(readBinary()); + iconSet = true; + } else { + skipCurrentElement(); + } + } + + if (uuidSet && iconSet) { + m_meta->addCustomIcon(uuid, icon); + } else { + raiseError("Missing icon uuid or data"); + } +} + +void Kdbx4XmlReader::parseBinaries() +{ + Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Binaries"); + + while (!m_xml.hasError() && m_xml.readNextStartElement()) { + if (m_xml.name() == "Binary") { + QXmlStreamAttributes attr = m_xml.attributes(); + + QString id = attr.value("ID").toString(); + + QByteArray data; + if (attr.value("Compressed").compare(QLatin1String("True"), Qt::CaseInsensitive) == 0) { + data = readCompressedBinary(); + } else { + data = readBinary(); + } + + if (m_binaryPool.contains(id)) { + qWarning("Kdbx4XmlReader::parseBinaries: overwriting binary item \"%s\"", + qPrintable(id)); + } + + m_binaryPool.insert(id, data); + } else { + skipCurrentElement(); + } + } +} + +void Kdbx4XmlReader::parseCustomData() +{ + Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "CustomData"); + + while (!m_xml.hasError() && m_xml.readNextStartElement()) { + if (m_xml.name() == "Item") { + parseCustomDataItem(); + } else { + skipCurrentElement(); + } + } +} + +void Kdbx4XmlReader::parseCustomDataItem() +{ + Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Item"); + + QString key; + QString value; + bool keySet = false; + bool valueSet = false; + + while (!m_xml.hasError() && m_xml.readNextStartElement()) { + if (m_xml.name() == "Key") { + key = readString(); + keySet = true; + } else if (m_xml.name() == "Value") { + value = readString(); + valueSet = true; + } else { + skipCurrentElement(); + } + } + + if (keySet && valueSet) { + m_meta->addCustomField(key, value); + } else { + raiseError("Missing custom data key or value"); + } +} + +bool Kdbx4XmlReader::parseRoot() +{ + Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Root"); + + bool groupElementFound = false; + bool groupParsedSuccessfully = false; + + while (!m_xml.hasError() && m_xml.readNextStartElement()) { + if (m_xml.name() == "Group") { + if (groupElementFound) { + groupParsedSuccessfully = false; + raiseError("Multiple group elements"); + continue; + } + + Group* rootGroup = parseGroup(); + if (rootGroup) { + Group* oldRoot = m_db->rootGroup(); + m_db->setRootGroup(rootGroup); + delete oldRoot; + groupParsedSuccessfully = true; + } + + groupElementFound = true; + } else if (m_xml.name() == "DeletedObjects") { + parseDeletedObjects(); + } else { + skipCurrentElement(); + } + } + + return groupParsedSuccessfully; +} + +Group* Kdbx4XmlReader::parseGroup() +{ + Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Group"); + + Group* group = new Group(); + group->setUpdateTimeinfo(false); + QList<Group*> children; + QList<Entry*> entries; + while (!m_xml.hasError() && m_xml.readNextStartElement()) { + if (m_xml.name() == "UUID") { + Uuid uuid = readUuid(); + if (uuid.isNull()) { + if (m_strictMode) { + raiseError("Null group uuid"); + } else { + group->setUuid(Uuid::random()); + } + } else { + group->setUuid(uuid); + } + } else if (m_xml.name() == "Name") { + group->setName(readString()); + } else if (m_xml.name() == "Notes") { + group->setNotes(readString()); + } else if (m_xml.name() == "IconID") { + int iconId = readNumber(); + if (iconId < 0) { + if (m_strictMode) { + raiseError("Invalid group icon number"); + } + iconId = 0; + } else if (iconId >= DatabaseIcons::IconCount) { + qWarning("Kdbx4XmlReader::parseGroup: icon id \"%d\" not supported", iconId); + iconId = DatabaseIcons::IconCount - 1; + } + + group->setIcon(iconId); + } else if (m_xml.name() == "CustomIconUUID") { + Uuid uuid = readUuid(); + if (!uuid.isNull()) { + group->setIcon(uuid); + } + } else if (m_xml.name() == "Times") { + group->setTimeInfo(parseTimes()); + } else if (m_xml.name() == "IsExpanded") { + group->setExpanded(readBool()); + } else if (m_xml.name() == "DefaultAutoTypeSequence") { + group->setDefaultAutoTypeSequence(readString()); + } else if (m_xml.name() == "EnableAutoType") { + QString str = readString(); + + if (str.compare("null", Qt::CaseInsensitive) == 0) { + group->setAutoTypeEnabled(Group::Inherit); + } else if (str.compare("true", Qt::CaseInsensitive) == 0) { + group->setAutoTypeEnabled(Group::Enable); + } else if (str.compare("false", Qt::CaseInsensitive) == 0) { + group->setAutoTypeEnabled(Group::Disable); + } else { + raiseError("Invalid EnableAutoType value"); + } + } else if (m_xml.name() == "EnableSearching") { + QString str = readString(); + + if (str.compare("null", Qt::CaseInsensitive) == 0) { + group->setSearchingEnabled(Group::Inherit); + } else if (str.compare("true", Qt::CaseInsensitive) == 0) { + group->setSearchingEnabled(Group::Enable); + } else if (str.compare("false", Qt::CaseInsensitive) == 0) { + group->setSearchingEnabled(Group::Disable); + } else { + raiseError("Invalid EnableSearching value"); + } + } else if (m_xml.name() == "LastTopVisibleEntry") { + group->setLastTopVisibleEntry(getEntry(readUuid())); + } else if (m_xml.name() == "Group") { + Group* newGroup = parseGroup(); + if (newGroup) { + children.append(newGroup); + } + } else if (m_xml.name() == "Entry") { + Entry* newEntry = parseEntry(false); + if (newEntry) { + entries.append(newEntry); + } + } else { + skipCurrentElement(); + } + } + + if (group->uuid().isNull() && !m_strictMode) { + group->setUuid(Uuid::random()); + } + + if (!group->uuid().isNull()) { + Group* tmpGroup = group; + group = getGroup(tmpGroup->uuid()); + group->copyDataFrom(tmpGroup); + group->setUpdateTimeinfo(false); + delete tmpGroup; + } else if (!hasError()) { + raiseError("No group uuid found"); + } + + for (Group* child : asConst(children)) { + child->setParent(group); + } + + for (Entry* entry : asConst(entries)) { + entry->setGroup(group); + } + + return group; +} + +void Kdbx4XmlReader::parseDeletedObjects() +{ + Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "DeletedObjects"); + + while (!m_xml.hasError() && m_xml.readNextStartElement()) { + if (m_xml.name() == "DeletedObject") { + parseDeletedObject(); + } else { + skipCurrentElement(); + } + } +} + +void Kdbx4XmlReader::parseDeletedObject() +{ + Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "DeletedObject"); + + DeletedObject delObj; + + while (!m_xml.hasError() && m_xml.readNextStartElement()) { + if (m_xml.name() == "UUID") { + Uuid uuid = readUuid(); + if (uuid.isNull()) { + if (m_strictMode) { + raiseError("Null DeleteObject uuid"); + } + } else { + delObj.uuid = uuid; + } + } else if (m_xml.name() == "DeletionTime") { + delObj.deletionTime = readDateTime(); + } else { + skipCurrentElement(); + } + } + + if (!delObj.uuid.isNull() && !delObj.deletionTime.isNull()) { + m_db->addDeletedObject(delObj); + } else if (m_strictMode) { + raiseError("Missing DeletedObject uuid or time"); + } +} + +Entry* Kdbx4XmlReader::parseEntry(bool history) +{ + Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Entry"); + + Entry* entry = new Entry(); + entry->setUpdateTimeinfo(false); + QList<Entry*> historyItems; + QList<StringPair> binaryRefs; + + while (!m_xml.hasError() && m_xml.readNextStartElement()) { + if (m_xml.name() == "UUID") { + Uuid uuid = readUuid(); + if (uuid.isNull()) { + if (m_strictMode) { + raiseError("Null entry uuid"); + } else { + entry->setUuid(Uuid::random()); + } + } else { + entry->setUuid(uuid); + } + } else if (m_xml.name() == "IconID") { + int iconId = readNumber(); + if (iconId < 0) { + if (m_strictMode) { + raiseError("Invalid entry icon number"); + } + iconId = 0; + } + entry->setIcon(iconId); + } else if (m_xml.name() == "CustomIconUUID") { + Uuid uuid = readUuid(); + if (!uuid.isNull()) { + entry->setIcon(uuid); + } + } else if (m_xml.name() == "ForegroundColor") { + entry->setForegroundColor(readColor()); + } else if (m_xml.name() == "BackgroundColor") { + entry->setBackgroundColor(readColor()); + } else if (m_xml.name() == "OverrideURL") { + entry->setOverrideUrl(readString()); + } else if (m_xml.name() == "Tags") { + entry->setTags(readString()); + } else if (m_xml.name() == "Times") { + entry->setTimeInfo(parseTimes()); + } else if (m_xml.name() == "String") { + parseEntryString(entry); + } else if (m_xml.name() == "Binary") { + QPair<QString, QString> ref = parseEntryBinary(entry); + if (!ref.first.isNull() && !ref.second.isNull()) { + binaryRefs.append(ref); + } + } else if (m_xml.name() == "AutoType") { + parseAutoType(entry); + } else if (m_xml.name() == "History") { + if (history) { + raiseError("History element in history entry"); + } else { + historyItems = parseEntryHistory(); + } + } else { + skipCurrentElement(); + } + } + + if (entry->uuid().isNull() && !m_strictMode) { + entry->setUuid(Uuid::random()); + } + + if (!entry->uuid().isNull()) { + if (history) { + entry->setUpdateTimeinfo(false); + } else { + Entry* tmpEntry = entry; + + entry = getEntry(tmpEntry->uuid()); + entry->copyDataFrom(tmpEntry); + entry->setUpdateTimeinfo(false); + + delete tmpEntry; + } + } else if (!hasError()) { + raiseError("No entry uuid found"); + } + + for (Entry* historyItem : asConst(historyItems)) { + if (historyItem->uuid() != entry->uuid()) { + if (m_strictMode) { + raiseError("History element with different uuid"); + } else { + historyItem->setUuid(entry->uuid()); + } + } + entry->addHistoryItem(historyItem); + } + + for (const StringPair& ref : asConst(binaryRefs)) { + m_binaryMap.insertMulti(ref.first, qMakePair(entry, ref.second)); + } + + return entry; +} + +void Kdbx4XmlReader::parseEntryString(Entry* entry) +{ + Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "String"); + + QString key; + QString value; + bool protect = false; + bool keySet = false; + bool valueSet = false; + + while (!m_xml.hasError() && m_xml.readNextStartElement()) { + if (m_xml.name() == "Key") { + key = readString(); + keySet = true; + } else if (m_xml.name() == "Value") { + QXmlStreamAttributes attr = m_xml.attributes(); + value = readString(); + + bool isProtected = attr.value("Protected") == "True"; + bool protectInMemory = attr.value("ProtectInMemory") == "True"; + + if (isProtected && !value.isEmpty()) { + if (m_randomStream) { + QByteArray ciphertext = QByteArray::fromBase64(value.toLatin1()); + bool ok; + QByteArray plaintext = m_randomStream->process(ciphertext, &ok); + if (!ok) { + value.clear(); + raiseError(m_randomStream->errorString()); + } else { + value = QString::fromUtf8(plaintext); + } + } else { + raiseError("Unable to decrypt entry string"); + } + } + + protect = isProtected || protectInMemory; + valueSet = true; + } else { + skipCurrentElement(); + } + } + + if (keySet && valueSet) { + // the default attributes are always there so additionally check if it's empty + if (entry->attributes()->hasKey(key) && !entry->attributes()->value(key).isEmpty()) { + raiseError("Duplicate custom attribute found"); + } else { + entry->attributes()->set(key, value, protect); + } + } else { + raiseError("Entry string key or value missing"); + } +} + +QPair<QString, QString> Kdbx4XmlReader::parseEntryBinary(Entry* entry) +{ + Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Binary"); + + QPair<QString, QString> poolRef; + + QString key; + QByteArray value; + bool keySet = false; + bool valueSet = false; + + while (!m_xml.hasError() && m_xml.readNextStartElement()) { + if (m_xml.name() == "Key") { + key = readString(); + keySet = true; + } else if (m_xml.name() == "Value") { + QXmlStreamAttributes attr = m_xml.attributes(); + + if (attr.hasAttribute("Ref")) { + poolRef = qMakePair(attr.value("Ref").toString(), key); + m_xml.skipCurrentElement(); + } else { + // format compatibility + value = readBinary(); + bool isProtected = attr.hasAttribute("Protected") + && (attr.value("Protected") == "True"); + + if (isProtected && !value.isEmpty()) { + if (!m_randomStream->processInPlace(value)) { + raiseError(m_randomStream->errorString()); + } + } + } + + valueSet = true; + } else { + skipCurrentElement(); + } + } + + if (keySet && valueSet) { + if (entry->attachments()->hasKey(key)) { + raiseError("Duplicate attachment found"); + } else { + entry->attachments()->set(key, value); + } + } else { + raiseError("Entry binary key or value missing"); + } + + return poolRef; +} + +void Kdbx4XmlReader::parseAutoType(Entry* entry) +{ + Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "AutoType"); + + while (!m_xml.hasError() && m_xml.readNextStartElement()) { + if (m_xml.name() == "Enabled") { + entry->setAutoTypeEnabled(readBool()); + } else if (m_xml.name() == "DataTransferObfuscation") { + entry->setAutoTypeObfuscation(readNumber()); + } else if (m_xml.name() == "DefaultSequence") { + entry->setDefaultAutoTypeSequence(readString()); + } else if (m_xml.name() == "Association") { + parseAutoTypeAssoc(entry); + } else { + skipCurrentElement(); + } + } +} + +void Kdbx4XmlReader::parseAutoTypeAssoc(Entry* entry) +{ + Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Association"); + + AutoTypeAssociations::Association assoc; + bool windowSet = false; + bool sequenceSet = false; + + while (!m_xml.hasError() && m_xml.readNextStartElement()) { + if (m_xml.name() == "Window") { + assoc.window = readString(); + windowSet = true; + } else if (m_xml.name() == "KeystrokeSequence") { + assoc.sequence = readString(); + sequenceSet = true; + } else { + skipCurrentElement(); + } + } + + if (windowSet && sequenceSet) { + entry->autoTypeAssociations()->add(assoc); + } else { + raiseError("Auto-type association window or sequence missing"); + } +} + +QList<Entry*> Kdbx4XmlReader::parseEntryHistory() +{ + Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "History"); + + QList<Entry*> historyItems; + + while (!m_xml.hasError() && m_xml.readNextStartElement()) { + if (m_xml.name() == "Entry") { + historyItems.append(parseEntry(true)); + } else { + skipCurrentElement(); + } + } + + return historyItems; +} + +TimeInfo Kdbx4XmlReader::parseTimes() +{ + Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Times"); + + TimeInfo timeInfo; + while (!m_xml.hasError() && m_xml.readNextStartElement()) { + if (m_xml.name() == "LastModificationTime") { + timeInfo.setLastModificationTime(readDateTime()); + } else if (m_xml.name() == "CreationTime") { + timeInfo.setCreationTime(readDateTime()); + } else if (m_xml.name() == "LastAccessTime") { + timeInfo.setLastAccessTime(readDateTime()); + } else if (m_xml.name() == "ExpiryTime") { + timeInfo.setExpiryTime(readDateTime()); + } else if (m_xml.name() == "Expires") { + timeInfo.setExpires(readBool()); + } else if (m_xml.name() == "UsageCount") { + timeInfo.setUsageCount(readNumber()); + } else if (m_xml.name() == "LocationChanged") { + timeInfo.setLocationChanged(readDateTime()); + } else { + skipCurrentElement(); + } + } + + return timeInfo; +} + +QString Kdbx4XmlReader::readString() +{ + return m_xml.readElementText(); +} + +bool Kdbx4XmlReader::readBool() +{ + QString str = readString(); + + if (str.compare("True", Qt::CaseInsensitive) == 0) { + return true; + } else if (str.compare("False", Qt::CaseInsensitive) == 0) { + return false; + } else if (str.length() == 0) { + return false; + } else { + raiseError("Invalid bool value"); + return false; + } +} + +QDateTime Kdbx4XmlReader::readDateTime() +{ + static QRegularExpression b64regex("^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$"); + QString str = readString(); + + if (b64regex.match(str).hasMatch()) { + QByteArray secsBytes = QByteArray::fromBase64(str.toUtf8()).leftJustified(8, '\0', true).left(8); + qint64 secs = Endian::bytesToSizedInt<quint64>(secsBytes, KeePass2::BYTEORDER); + return QDateTime(QDate(1, 1, 1), QTime(0, 0, 0, 0), Qt::UTC).addSecs(secs); + } else { + QDateTime dt = QDateTime::fromString(str, Qt::ISODate); + if (dt.isValid()) { + return dt; + } else { + if (m_strictMode) { + raiseError("Invalid date time value"); + } + + return QDateTime::currentDateTimeUtc(); + } + } +} + +QColor Kdbx4XmlReader::readColor() +{ + QString colorStr = readString(); + + if (colorStr.isEmpty()) { + return QColor(); + } + + if (colorStr.length() != 7 || colorStr[0] != '#') { + if (m_strictMode) { + raiseError("Invalid color value"); + } + return QColor(); + } + + QColor color; + for (int i = 0; i <= 2; i++) { + QString rgbPartStr = colorStr.mid(1 + 2*i, 2); + bool ok; + int rgbPart = rgbPartStr.toInt(&ok, 16); + if (!ok || rgbPart > 255) { + if (m_strictMode) { + raiseError("Invalid color rgb part"); + } + return QColor(); + } + + if (i == 0) { + color.setRed(rgbPart); + } else if (i == 1) { + color.setGreen(rgbPart); + } else { + color.setBlue(rgbPart); + } + } + + return color; +} + +int Kdbx4XmlReader::readNumber() +{ + bool ok; + int result = readString().toInt(&ok); + if (!ok) { + raiseError("Invalid number value"); + } + return result; +} + +Uuid Kdbx4XmlReader::readUuid() +{ + QByteArray uuidBin = readBinary(); + if (uuidBin.isEmpty()) { + return Uuid(); + } else if (uuidBin.length() != Uuid::Length) { + if (m_strictMode) { + raiseError("Invalid uuid value"); + } + return Uuid(); + } else { + return Uuid(uuidBin); + } +} + +QByteArray Kdbx4XmlReader::readBinary() +{ + return QByteArray::fromBase64(readString().toLatin1()); +} + +QByteArray Kdbx4XmlReader::readCompressedBinary() +{ + QByteArray rawData = readBinary(); + + QBuffer buffer(&rawData); + buffer.open(QIODevice::ReadOnly); + + QtIOCompressor compressor(&buffer); + compressor.setStreamFormat(QtIOCompressor::GzipFormat); + compressor.open(QIODevice::ReadOnly); + + QByteArray result; + if (!Tools::readAllFromDevice(&compressor, result)) { + raiseError("Unable to decompress binary"); + } + return result; +} + +Group* Kdbx4XmlReader::getGroup(const Uuid& uuid) +{ + if (uuid.isNull()) { + return nullptr; + } + + if (m_groups.contains(uuid)) { + return m_groups.value(uuid); + } else { + Group* group = new Group(); + group->setUpdateTimeinfo(false); + group->setUuid(uuid); + group->setParent(m_tmpParent); + m_groups.insert(uuid, group); + return group; + } +} + +Entry* Kdbx4XmlReader::getEntry(const Uuid& uuid) +{ + if (uuid.isNull()) { + return nullptr; + } + + if (m_entries.contains(uuid)) { + return m_entries.value(uuid); + } else { + Entry* entry = new Entry(); + entry->setUpdateTimeinfo(false); + entry->setUuid(uuid); + entry->setGroup(m_tmpParent); + m_entries.insert(uuid, entry); + return entry; + } +} + +void Kdbx4XmlReader::skipCurrentElement() +{ + qWarning("Kdbx4XmlReader::skipCurrentElement: skip element \"%s\"", qPrintable(m_xml.name().toString())); + m_xml.skipCurrentElement(); +} diff --git a/src/format/Kdbx4XmlReader.h b/src/format/Kdbx4XmlReader.h new file mode 100644 index 000000000..6a0a6d4f4 --- /dev/null +++ b/src/format/Kdbx4XmlReader.h @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef KEEPASSX_KDBX4XMLREADER_H +#define KEEPASSX_KDBX4XMLREADER_H + +#include <QColor> +#include <QCoreApplication> +#include <QDateTime> +#include <QHash> +#include <QPair> +#include <QXmlStreamReader> + +#include "core/TimeInfo.h" +#include "core/Uuid.h" + +class Database; +class Entry; +class Group; +class KeePass2RandomStream; +class Metadata; + +class Kdbx4XmlReader +{ + Q_DECLARE_TR_FUNCTIONS(Kdbx4XmlReader) + +public: + Kdbx4XmlReader(); + Kdbx4XmlReader(QHash<QString, QByteArray>& binaryPool); + Database* readDatabase(QIODevice* device); + void readDatabase(QIODevice* device, Database* db, KeePass2RandomStream* randomStream = nullptr); + Database* readDatabase(const QString& filename); + bool hasError(); + QString errorString(); + QByteArray headerHash(); + void setStrictMode(bool strictMode); + +private: + bool parseKeePassFile(); + void parseMeta(); + void parseMemoryProtection(); + void parseCustomIcons(); + void parseIcon(); + void parseBinaries(); + void parseCustomData(); + void parseCustomDataItem(); + bool parseRoot(); + Group* parseGroup(); + void parseDeletedObjects(); + void parseDeletedObject(); + Entry* parseEntry(bool history); + void parseEntryString(Entry* entry); + QPair<QString, QString> parseEntryBinary(Entry* entry); + void parseAutoType(Entry* entry); + void parseAutoTypeAssoc(Entry* entry); + QList<Entry*> parseEntryHistory(); + TimeInfo parseTimes(); + + QString readString(); + bool readBool(); + QDateTime readDateTime(); + QColor readColor(); + int readNumber(); + Uuid readUuid(); + QByteArray readBinary(); + QByteArray readCompressedBinary(); + + Group* getGroup(const Uuid& uuid); + Entry* getEntry(const Uuid& uuid); + void raiseError(const QString& errorMessage); + void skipCurrentElement(); + + QXmlStreamReader m_xml; + KeePass2RandomStream* m_randomStream; + Database* m_db; + Metadata* m_meta; + Group* m_tmpParent; + QHash<Uuid, Group*> m_groups; + QHash<Uuid, Entry*> m_entries; + QHash<QString, QByteArray> m_binaryPool; + QHash<QString, QPair<Entry*, QString> > m_binaryMap; + QByteArray m_headerHash; + bool m_error; + QString m_errorStr; + bool m_strictMode; +}; + +#endif // KEEPASSX_KDBX4XMLREADER_H diff --git a/src/format/Kdbx4XmlWriter.cpp b/src/format/Kdbx4XmlWriter.cpp new file mode 100644 index 000000000..374744563 --- /dev/null +++ b/src/format/Kdbx4XmlWriter.cpp @@ -0,0 +1,611 @@ +/* + * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "Kdbx4XmlWriter.h" + +#include <QBuffer> +#include <QFile> + +#include "core/Endian.h" +#include "core/Metadata.h" +#include "format/KeePass2RandomStream.h" +#include "streams/QtIOCompressor" + +Kdbx4XmlWriter::Kdbx4XmlWriter() + : Kdbx4XmlWriter(KeePass2::FILE_VERSION_3) +{ +} + +Kdbx4XmlWriter::Kdbx4XmlWriter(quint32 version) + : Kdbx4XmlWriter(version, QHash<QByteArray, int>()) +{ +} + +Kdbx4XmlWriter::Kdbx4XmlWriter(quint32 version, QHash<QByteArray, int> idMap) + : m_db(nullptr) + , m_meta(nullptr) + , m_randomStream(nullptr) + , m_idMap(idMap) + , m_error(false) + , m_version(version) +{ + m_xml.setAutoFormatting(true); + m_xml.setAutoFormattingIndent(-1); // 1 tab + m_xml.setCodec("UTF-8"); +} + +void Kdbx4XmlWriter::writeDatabase(QIODevice* device, Database* db, KeePass2RandomStream* randomStream, const QByteArray& headerHash) +{ + m_db = db; + m_meta = db->metadata(); + m_randomStream = randomStream; + m_headerHash = headerHash; + + if (m_version < KeePass2::FILE_VERSION_4 && m_idMap.isEmpty()) { + generateIdMap(); + } + + m_xml.setDevice(device); + + m_xml.writeStartDocument("1.0", true); + + m_xml.writeStartElement("KeePassFile"); + + writeMetadata(); + writeRoot(); + + m_xml.writeEndElement(); + + m_xml.writeEndDocument(); + + if (m_xml.hasError()) { + raiseError(device->errorString()); + } +} + +void Kdbx4XmlWriter::writeDatabase(const QString& filename, Database* db) +{ + QFile file(filename); + file.open(QIODevice::WriteOnly|QIODevice::Truncate); + writeDatabase(&file, db); +} + +bool Kdbx4XmlWriter::hasError() +{ + return m_error; +} + +QString Kdbx4XmlWriter::errorString() +{ + return m_errorStr; +} + +void Kdbx4XmlWriter::generateIdMap() +{ + const QList<Entry*> allEntries = m_db->rootGroup()->entriesRecursive(true); + int nextId = 0; + + for (Entry* entry : allEntries) { + const QList<QString> attachmentKeys = entry->attachments()->keys(); + for (const QString& key : attachmentKeys) { + QByteArray data = entry->attachments()->value(key); + if (!m_idMap.contains(data)) { + m_idMap.insert(data, nextId++); + } + } + } +} + +void Kdbx4XmlWriter::writeMetadata() +{ + m_xml.writeStartElement("Meta"); + writeString("Generator", m_meta->generator()); + if (m_version < KeePass2::FILE_VERSION_4 && !m_headerHash.isEmpty()) { + writeBinary("HeaderHash", m_headerHash); + } + writeString("DatabaseName", m_meta->name()); + writeDateTime("DatabaseNameChanged", m_meta->nameChanged()); + writeString("DatabaseDescription", m_meta->description()); + writeDateTime("DatabaseDescriptionChanged", m_meta->descriptionChanged()); + writeString("DefaultUserName", m_meta->defaultUserName()); + writeDateTime("DefaultUserNameChanged", m_meta->defaultUserNameChanged()); + writeNumber("MaintenanceHistoryDays", m_meta->maintenanceHistoryDays()); + writeColor("Color", m_meta->color()); + writeDateTime("MasterKeyChanged", m_meta->masterKeyChanged()); + writeNumber("MasterKeyChangeRec", m_meta->masterKeyChangeRec()); + writeNumber("MasterKeyChangeForce", m_meta->masterKeyChangeForce()); + writeMemoryProtection(); + writeCustomIcons(); + writeBool("RecycleBinEnabled", m_meta->recycleBinEnabled()); + writeUuid("RecycleBinUUID", m_meta->recycleBin()); + writeDateTime("RecycleBinChanged", m_meta->recycleBinChanged()); + writeUuid("EntryTemplatesGroup", m_meta->entryTemplatesGroup()); + writeDateTime("EntryTemplatesGroupChanged", m_meta->entryTemplatesGroupChanged()); + writeUuid("LastSelectedGroup", m_meta->lastSelectedGroup()); + writeUuid("LastTopVisibleGroup", m_meta->lastTopVisibleGroup()); + writeNumber("HistoryMaxItems", m_meta->historyMaxItems()); + writeNumber("HistoryMaxSize", m_meta->historyMaxSize()); + if (m_version >= KeePass2::FILE_VERSION_4) { + writeDateTime("SettingsChanged", m_meta->settingsChanged()); + } + if (m_version < KeePass2::FILE_VERSION_4) { + writeBinaries(); + } + writeCustomData(); + + m_xml.writeEndElement(); +} + +void Kdbx4XmlWriter::writeMemoryProtection() +{ + m_xml.writeStartElement("MemoryProtection"); + + writeBool("ProtectTitle", m_meta->protectTitle()); + writeBool("ProtectUserName", m_meta->protectUsername()); + writeBool("ProtectPassword", m_meta->protectPassword()); + writeBool("ProtectURL", m_meta->protectUrl()); + writeBool("ProtectNotes", m_meta->protectNotes()); + + m_xml.writeEndElement(); +} + +void Kdbx4XmlWriter::writeCustomIcons() +{ + m_xml.writeStartElement("CustomIcons"); + + const QList<Uuid> customIconsOrder = m_meta->customIconsOrder(); + for (const Uuid& uuid : customIconsOrder) { + writeIcon(uuid, m_meta->customIcon(uuid)); + } + + m_xml.writeEndElement(); +} + +void Kdbx4XmlWriter::writeIcon(const Uuid& uuid, const QImage& icon) +{ + m_xml.writeStartElement("Icon"); + + writeUuid("UUID", uuid); + + QByteArray ba; + QBuffer buffer(&ba); + buffer.open(QIODevice::WriteOnly); + // TODO: check !icon.save() + icon.save(&buffer, "PNG"); + buffer.close(); + writeBinary("Data", ba); + + m_xml.writeEndElement(); +} + +void Kdbx4XmlWriter::writeBinaries() +{ + m_xml.writeStartElement("Binaries"); + + QHash<QByteArray, int>::const_iterator i; + for (i = m_idMap.constBegin(); i != m_idMap.constEnd(); ++i) { + m_xml.writeStartElement("Binary"); + + m_xml.writeAttribute("ID", QString::number(i.value())); + + QByteArray data; + if (m_db->compressionAlgo() == Database::CompressionGZip) { + m_xml.writeAttribute("Compressed", "True"); + + QBuffer buffer; + buffer.open(QIODevice::ReadWrite); + + QtIOCompressor compressor(&buffer); + compressor.setStreamFormat(QtIOCompressor::GzipFormat); + compressor.open(QIODevice::WriteOnly); + + qint64 bytesWritten = compressor.write(i.key()); + Q_ASSERT(bytesWritten == i.key().size()); + Q_UNUSED(bytesWritten); + compressor.close(); + + buffer.seek(0); + data = buffer.readAll(); + } + else { + data = i.key(); + } + + if (!data.isEmpty()) { + m_xml.writeCharacters(QString::fromLatin1(data.toBase64())); + } + m_xml.writeEndElement(); + } + + m_xml.writeEndElement(); +} + +void Kdbx4XmlWriter::writeCustomData() +{ + m_xml.writeStartElement("CustomData"); + + QHash<QString, QString> customFields = m_meta->customFields(); + const QList<QString> keyList = customFields.keys(); + for (const QString& key : keyList) { + writeCustomDataItem(key, customFields.value(key)); + } + + m_xml.writeEndElement(); +} + +void Kdbx4XmlWriter::writeCustomDataItem(const QString& key, const QString& value) +{ + m_xml.writeStartElement("Item"); + + writeString("Key", key); + writeString("Value", value); + + m_xml.writeEndElement(); +} + +void Kdbx4XmlWriter::writeRoot() +{ + Q_ASSERT(m_db->rootGroup()); + + m_xml.writeStartElement("Root"); + + writeGroup(m_db->rootGroup()); + writeDeletedObjects(); + + m_xml.writeEndElement(); +} + +void Kdbx4XmlWriter::writeGroup(const Group* group) +{ + Q_ASSERT(!group->uuid().isNull()); + + m_xml.writeStartElement("Group"); + + writeUuid("UUID", group->uuid()); + writeString("Name", group->name()); + writeString("Notes", group->notes()); + writeNumber("IconID", group->iconNumber()); + + if (!group->iconUuid().isNull()) { + writeUuid("CustomIconUUID", group->iconUuid()); + } + writeTimes(group->timeInfo()); + writeBool("IsExpanded", group->isExpanded()); + writeString("DefaultAutoTypeSequence", group->defaultAutoTypeSequence()); + + writeTriState("EnableAutoType", group->autoTypeEnabled()); + + writeTriState("EnableSearching", group->searchingEnabled()); + + writeUuid("LastTopVisibleEntry", group->lastTopVisibleEntry()); + + const QList<Entry*> entryList = group->entries(); + for (const Entry* entry : entryList) { + writeEntry(entry); + } + + const QList<Group*> children = group->children(); + for (const Group* child : children) { + writeGroup(child); + } + + m_xml.writeEndElement(); +} + +void Kdbx4XmlWriter::writeTimes(const TimeInfo& ti) +{ + m_xml.writeStartElement("Times"); + + writeDateTime("LastModificationTime", ti.lastModificationTime()); + writeDateTime("CreationTime", ti.creationTime()); + writeDateTime("LastAccessTime", ti.lastAccessTime()); + writeDateTime("ExpiryTime", ti.expiryTime()); + writeBool("Expires", ti.expires()); + writeNumber("UsageCount", ti.usageCount()); + writeDateTime("LocationChanged", ti.locationChanged()); + + m_xml.writeEndElement(); +} + +void Kdbx4XmlWriter::writeDeletedObjects() +{ + m_xml.writeStartElement("DeletedObjects"); + + const QList<DeletedObject> delObjList = m_db->deletedObjects(); + for (const DeletedObject& delObj : delObjList) { + writeDeletedObject(delObj); + } + + m_xml.writeEndElement(); +} + +void Kdbx4XmlWriter::writeDeletedObject(const DeletedObject& delObj) +{ + m_xml.writeStartElement("DeletedObject"); + + writeUuid("UUID", delObj.uuid); + writeDateTime("DeletionTime", delObj.deletionTime); + + m_xml.writeEndElement(); +} + +void Kdbx4XmlWriter::writeEntry(const Entry* entry) +{ + Q_ASSERT(!entry->uuid().isNull()); + + m_xml.writeStartElement("Entry"); + + writeUuid("UUID", entry->uuid()); + writeNumber("IconID", entry->iconNumber()); + if (!entry->iconUuid().isNull()) { + writeUuid("CustomIconUUID", entry->iconUuid()); + } + writeColor("ForegroundColor", entry->foregroundColor()); + writeColor("BackgroundColor", entry->backgroundColor()); + writeString("OverrideURL", entry->overrideUrl()); + writeString("Tags", entry->tags()); + writeTimes(entry->timeInfo()); + + const QList<QString> attributesKeyList = entry->attributes()->keys(); + for (const QString& key : attributesKeyList) { + m_xml.writeStartElement("String"); + + bool protect = ( ((key == "Title") && m_meta->protectTitle()) || + ((key == "UserName") && m_meta->protectUsername()) || + ((key == "Password") && m_meta->protectPassword()) || + ((key == "URL") && m_meta->protectUrl()) || + ((key == "Notes") && m_meta->protectNotes()) || + entry->attributes()->isProtected(key) ); + + writeString("Key", key); + + m_xml.writeStartElement("Value"); + QString value; + + if (protect) { + if (m_randomStream) { + m_xml.writeAttribute("Protected", "True"); + bool ok; + QByteArray rawData = m_randomStream->process(entry->attributes()->value(key).toUtf8(), &ok); + if (!ok) { + raiseError(m_randomStream->errorString()); + } + value = QString::fromLatin1(rawData.toBase64()); + } + else { + m_xml.writeAttribute("ProtectInMemory", "True"); + value = entry->attributes()->value(key); + } + } + else { + value = entry->attributes()->value(key); + } + + if (!value.isEmpty()) { + m_xml.writeCharacters(stripInvalidXml10Chars(value)); + } + m_xml.writeEndElement(); + + m_xml.writeEndElement(); + } + + const QList<QString> attachmentsKeyList = entry->attachments()->keys(); + for (const QString& key : attachmentsKeyList) { + m_xml.writeStartElement("Binary"); + + writeString("Key", key); + + m_xml.writeStartElement("Value"); + m_xml.writeAttribute("Ref", QString::number(m_idMap[entry->attachments()->value(key)])); + m_xml.writeEndElement(); + + m_xml.writeEndElement(); + } + + writeAutoType(entry); + // write history only for entries that are not history items + if (entry->parent()) { + writeEntryHistory(entry); + } + + m_xml.writeEndElement(); +} + +void Kdbx4XmlWriter::writeAutoType(const Entry* entry) +{ + m_xml.writeStartElement("AutoType"); + + writeBool("Enabled", entry->autoTypeEnabled()); + writeNumber("DataTransferObfuscation", entry->autoTypeObfuscation()); + writeString("DefaultSequence", entry->defaultAutoTypeSequence()); + + const QList<AutoTypeAssociations::Association> autoTypeAssociations = entry->autoTypeAssociations()->getAll(); + for (const AutoTypeAssociations::Association& assoc : autoTypeAssociations) { + writeAutoTypeAssoc(assoc); + } + + m_xml.writeEndElement(); +} + +void Kdbx4XmlWriter::writeAutoTypeAssoc(const AutoTypeAssociations::Association& assoc) +{ + m_xml.writeStartElement("Association"); + + writeString("Window", assoc.window); + writeString("KeystrokeSequence", assoc.sequence); + + m_xml.writeEndElement(); +} + +void Kdbx4XmlWriter::writeEntryHistory(const Entry* entry) +{ + m_xml.writeStartElement("History"); + + const QList<Entry*>& historyItems = entry->historyItems(); + for (const Entry* item : historyItems) { + writeEntry(item); + } + + m_xml.writeEndElement(); +} + +void Kdbx4XmlWriter::writeString(const QString& qualifiedName, const QString& string) +{ + if (string.isEmpty()) { + m_xml.writeEmptyElement(qualifiedName); + } + else { + m_xml.writeTextElement(qualifiedName, stripInvalidXml10Chars(string)); + } +} + +void Kdbx4XmlWriter::writeNumber(const QString& qualifiedName, int number) +{ + writeString(qualifiedName, QString::number(number)); +} + +void Kdbx4XmlWriter::writeBool(const QString& qualifiedName, bool b) +{ + if (b) { + writeString(qualifiedName, "True"); + } + else { + writeString(qualifiedName, "False"); + } +} + +void Kdbx4XmlWriter::writeDateTime(const QString& qualifiedName, const QDateTime& dateTime) +{ + Q_ASSERT(dateTime.isValid()); + Q_ASSERT(dateTime.timeSpec() == Qt::UTC); + + QString dateTimeStr; + if (m_version < KeePass2::FILE_VERSION_4) { + dateTimeStr = dateTime.toString(Qt::ISODate); + + // Qt < 4.8 doesn't append a 'Z' at the end + if (!dateTimeStr.isEmpty() && dateTimeStr[dateTimeStr.size() - 1] != 'Z') { + dateTimeStr.append('Z'); + } + } else { + qint64 secs = QDateTime(QDate(1, 1, 1), QTime(0, 0, 0, 0), Qt::UTC).secsTo(dateTime); + QByteArray secsBytes = Endian::sizedIntToBytes(secs, KeePass2::BYTEORDER); + dateTimeStr = QString::fromLatin1(secsBytes.toBase64()); + } + writeString(qualifiedName, dateTimeStr); +} + +void Kdbx4XmlWriter::writeUuid(const QString& qualifiedName, const Uuid& uuid) +{ + writeString(qualifiedName, uuid.toBase64()); +} + +void Kdbx4XmlWriter::writeUuid(const QString& qualifiedName, const Group* group) +{ + if (group) { + writeUuid(qualifiedName, group->uuid()); + } + else { + writeUuid(qualifiedName, Uuid()); + } +} + +void Kdbx4XmlWriter::writeUuid(const QString& qualifiedName, const Entry* entry) +{ + if (entry) { + writeUuid(qualifiedName, entry->uuid()); + } + else { + writeUuid(qualifiedName, Uuid()); + } +} + +void Kdbx4XmlWriter::writeBinary(const QString& qualifiedName, const QByteArray& ba) +{ + writeString(qualifiedName, QString::fromLatin1(ba.toBase64())); +} + +void Kdbx4XmlWriter::writeColor(const QString& qualifiedName, const QColor& color) +{ + QString colorStr; + + if (color.isValid()) { + colorStr = QString("#%1%2%3").arg(colorPartToString(color.red()), + colorPartToString(color.green()), + colorPartToString(color.blue())); + } + + writeString(qualifiedName, colorStr); +} + +void Kdbx4XmlWriter::writeTriState(const QString& qualifiedName, Group::TriState triState) +{ + QString value; + + if (triState == Group::Inherit) { + value = "null"; + } + else if (triState == Group::Enable) { + value = "true"; + } + else { + value = "false"; + } + + writeString(qualifiedName, value); +} + +QString Kdbx4XmlWriter::colorPartToString(int value) +{ + QString str = QString::number(value, 16).toUpper(); + if (str.length() == 1) { + str.prepend("0"); + } + + return str; +} + +QString Kdbx4XmlWriter::stripInvalidXml10Chars(QString str) +{ + for (int i = str.size() - 1; i >= 0; i--) { + const QChar ch = str.at(i); + const ushort uc = ch.unicode(); + + if (ch.isLowSurrogate() && i != 0 && str.at(i - 1).isHighSurrogate()) { + // keep valid surrogate pair + i--; + } + else if ((uc < 0x20 && uc != 0x09 && uc != 0x0A && uc != 0x0D) // control characters + || (uc >= 0x7F && uc <= 0x84) // control characters, valid but discouraged by XML + || (uc >= 0x86 && uc <= 0x9F) // control characters, valid but discouraged by XML + || (uc > 0xFFFD) // noncharacter + || ch.isLowSurrogate() // single low surrogate + || ch.isHighSurrogate()) // single high surrogate + { + qWarning("Stripping invalid XML 1.0 codepoint %x", uc); + str.remove(i, 1); + } + } + + return str; +} + +void Kdbx4XmlWriter::raiseError(const QString& errorMessage) +{ + m_error = true; + m_errorStr = errorMessage; +} diff --git a/src/format/Kdbx4XmlWriter.h b/src/format/Kdbx4XmlWriter.h new file mode 100644 index 000000000..79f27c98b --- /dev/null +++ b/src/format/Kdbx4XmlWriter.h @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef KEEPASSX_KDBX4XMLWRITER_H +#define KEEPASSX_KDBX4XMLWRITER_H + +#include <QColor> +#include <QDateTime> +#include <QImage> +#include <QXmlStreamWriter> + +#include "core/Database.h" +#include "core/Entry.h" +#include "core/Group.h" +#include "core/TimeInfo.h" +#include "core/Uuid.h" + +class KeePass2RandomStream; +class Metadata; + +class Kdbx4XmlWriter +{ +public: + Kdbx4XmlWriter(); + Kdbx4XmlWriter(quint32 version); + Kdbx4XmlWriter(quint32 version, QHash<QByteArray, int> idMap); + void writeDatabase(QIODevice* device, Database* db, KeePass2RandomStream* randomStream = nullptr, + const QByteArray& headerHash = QByteArray()); + void writeDatabase(const QString& filename, Database* db); + bool hasError(); + QString errorString(); + +private: + void generateIdMap(); + + void writeMetadata(); + void writeMemoryProtection(); + void writeCustomIcons(); + void writeIcon(const Uuid& uuid, const QImage& icon); + void writeBinaries(); + void writeCustomData(); + void writeCustomDataItem(const QString& key, const QString& value); + void writeRoot(); + void writeGroup(const Group* group); + void writeTimes(const TimeInfo& ti); + void writeDeletedObjects(); + void writeDeletedObject(const DeletedObject& delObj); + void writeEntry(const Entry* entry); + void writeAutoType(const Entry* entry); + void writeAutoTypeAssoc(const AutoTypeAssociations::Association& assoc); + void writeEntryHistory(const Entry* entry); + + void writeString(const QString& qualifiedName, const QString& string); + void writeNumber(const QString& qualifiedName, int number); + void writeBool(const QString& qualifiedName, bool b); + void writeDateTime(const QString& qualifiedName, const QDateTime& dateTime); + void writeUuid(const QString& qualifiedName, const Uuid& uuid); + void writeUuid(const QString& qualifiedName, const Group* group); + void writeUuid(const QString& qualifiedName, const Entry* entry); + void writeBinary(const QString& qualifiedName, const QByteArray& ba); + void writeColor(const QString& qualifiedName, const QColor& color); + void writeTriState(const QString& qualifiedName, Group::TriState triState); + QString colorPartToString(int value); + QString stripInvalidXml10Chars(QString str); + + void raiseError(const QString& errorMessage); + + QXmlStreamWriter m_xml; + Database* m_db; + Metadata* m_meta; + KeePass2RandomStream* m_randomStream; + QHash<QByteArray, int> m_idMap; + bool m_error; + QString m_errorStr; + quint32 m_version; + QByteArray m_headerHash; +}; + +#endif // KEEPASSX_KDBX4XMLWRITER_H diff --git a/src/format/KeePass2.cpp b/src/format/KeePass2.cpp index fd57148d0..f89e828a1 100644 --- a/src/format/KeePass2.cpp +++ b/src/format/KeePass2.cpp @@ -19,6 +19,7 @@ #include <QSharedPointer> #include "crypto/kdf/AesKdf.h" #include "crypto/kdf/Argon2Kdf.h" +#include "crypto/CryptoHash.h" const Uuid KeePass2::CIPHER_AES = Uuid(QByteArray::fromHex("31c1f2e6bf714350be5805216afc5aff")); const Uuid KeePass2::CIPHER_TWOFISH = Uuid(QByteArray::fromHex("ad68f29f576f4bb9a36ad47af965346c")); @@ -29,6 +30,19 @@ const Uuid KeePass2::KDF_ARGON2 = Uuid(QByteArray::fromHex("EF636DDF8C29444B91F7 const QByteArray KeePass2::INNER_STREAM_SALSA20_IV("\xE8\x30\x09\x4B\x97\x20\x5D\x2A"); +const QString KeePass2::KDFPARAM_UUID("$UUID"); +// AES parameters +const QString KeePass2::KDFPARAM_AES_ROUNDS("R"); +const QString KeePass2::KDFPARAM_AES_SEED("S"); +// Argon2 parameters +const QString KeePass2::KDFPARAM_ARGON2_SALT("S"); +const QString KeePass2::KDFPARAM_ARGON2_PARALLELISM("P"); +const QString KeePass2::KDFPARAM_ARGON2_MEMORY("M"); +const QString KeePass2::KDFPARAM_ARGON2_ITERATIONS("I"); +const QString KeePass2::KDFPARAM_ARGON2_VERSION("V"); +const QString KeePass2::KDFPARAM_ARGON2_SECRET("K"); +const QString KeePass2::KDFPARAM_ARGON2_ASSOCDATA("A"); + const QList<QPair<Uuid, QString>> KeePass2::CIPHERS { qMakePair(KeePass2::CIPHER_AES, QObject::tr("AES: 256-bit")), qMakePair(KeePass2::CIPHER_TWOFISH, QObject::tr("Twofish: 256-bit")), @@ -39,6 +53,38 @@ const QList<QPair<Uuid, QString>> KeePass2::KDFS { qMakePair(KeePass2::KDF_ARGON2, QObject::tr("Argon2")), }; +QByteArray KeePass2::hmacKey(QByteArray masterSeed, QByteArray transformedMasterKey) { + CryptoHash hmacKeyHash(CryptoHash::Sha512); + hmacKeyHash.addData(masterSeed); + hmacKeyHash.addData(transformedMasterKey); + hmacKeyHash.addData(QByteArray(1, '\x01')); + return hmacKeyHash.result(); +} + +QSharedPointer<Kdf> KeePass2::kdfFromParameters(const QVariantMap &p) +{ + QByteArray uuidBytes = p.value(KDFPARAM_UUID).toByteArray(); + if (uuidBytes.size() != Uuid::Length) { + return nullptr; + } + + QSharedPointer<Kdf> kdf(uuidToKdf(Uuid(uuidBytes))); + if (kdf.isNull()) { + return nullptr; + } + + if (!kdf->processParameters(p)) { + return nullptr; + } + + return kdf; +} + +QVariantMap KeePass2::kdfToParameters(QSharedPointer<Kdf> kdf) +{ + return kdf->writeParameters(); +} + QSharedPointer<Kdf> KeePass2::uuidToKdf(const Uuid& uuid) { if (uuid == KDF_AES) { diff --git a/src/format/KeePass2.h b/src/format/KeePass2.h index 99bc5a0b0..cdc594f5a 100644 --- a/src/format/KeePass2.h +++ b/src/format/KeePass2.h @@ -19,6 +19,8 @@ #define KEEPASSX_KEEPASS2_H #include <QtGlobal> +#include <QMap> +#include <QVariantMap> #include <QList> #include "crypto/SymmetricCipher.h" @@ -29,9 +31,14 @@ namespace KeePass2 { const quint32 SIGNATURE_1 = 0x9AA2D903; const quint32 SIGNATURE_2 = 0xB54BFB67; - const quint32 FILE_VERSION = 0x00030001; + const quint32 FILE_VERSION_MIN = 0x00020000; const quint32 FILE_VERSION_CRITICAL_MASK = 0xFFFF0000; + const quint32 FILE_VERSION_4 = 0x00040000; + const quint32 FILE_VERSION_3 = 0x00030001; + + const quint16 VARIANTMAP_VERSION = 0x0100; + const quint16 VARIANTMAP_CRITICAL_MASK = 0xFF00; const QSysInfo::Endian BYTEORDER = QSysInfo::LittleEndian; @@ -44,6 +51,17 @@ namespace KeePass2 extern const QByteArray INNER_STREAM_SALSA20_IV; + extern const QString KDFPARAM_UUID; + extern const QString KDFPARAM_AES_ROUNDS; + extern const QString KDFPARAM_AES_SEED; + extern const QString KDFPARAM_ARGON2_SALT; + extern const QString KDFPARAM_ARGON2_PARALLELISM; + extern const QString KDFPARAM_ARGON2_MEMORY; + extern const QString KDFPARAM_ARGON2_ITERATIONS; + extern const QString KDFPARAM_ARGON2_VERSION; + extern const QString KDFPARAM_ARGON2_SECRET; + extern const QString KDFPARAM_ARGON2_ASSOCDATA; + extern const QList<QPair<Uuid, QString>> CIPHERS; extern const QList<QPair<Uuid, QString>> KDFS; @@ -59,7 +77,17 @@ namespace KeePass2 EncryptionIV = 7, ProtectedStreamKey = 8, StreamStartBytes = 9, - InnerRandomStreamID = 10 + InnerRandomStreamID = 10, + KdfParameters = 11, + PublicCustomData = 12 + }; + + enum class InnerHeaderFieldID : quint8 + { + End = 0, + InnerRandomStreamID = 1, + InnerRandomStreamKey = 2, + Binary = 3 }; enum ProtectedStreamAlgo @@ -70,7 +98,33 @@ namespace KeePass2 InvalidProtectedStreamAlgo = -1 }; + enum class VariantMapFieldType : quint8 + { + End = 0, + // Byte = 0x02, + // UInt16 = 0x03, + UInt32 = 0x04, + UInt64 = 0x05, + // Signed mask: 0x08 + Bool = 0x08, + // SByte = 0x0A, + // Int16 = 0x0B, + Int32 = 0x0C, + Int64 = 0x0D, + // Float = 0x10, + // Double = 0x11, + // Decimal = 0x12, + // Char = 0x17, // 16-bit Unicode character + String = 0x18, + // Array mask: 0x40 + ByteArray = 0x42 + }; + + QByteArray hmacKey(QByteArray masterSeed, QByteArray transformedMasterKey); + QSharedPointer<Kdf> kdfFromParameters(const QVariantMap &p); + QVariantMap kdfToParameters(QSharedPointer<Kdf> kdf); QSharedPointer<Kdf> uuidToKdf(const Uuid& uuid); + Uuid kdfToUuid(QSharedPointer<Kdf> kdf); ProtectedStreamAlgo idToProtectedStreamAlgo(quint32 id); } diff --git a/src/format/KeePass2Reader.cpp b/src/format/KeePass2Reader.cpp index daa6c9aa8..0a04c79c6 100644 --- a/src/format/KeePass2Reader.cpp +++ b/src/format/KeePass2Reader.cpp @@ -25,6 +25,7 @@ #include "format/KeePass1.h" #include "format/KeePass2.h" #include "format/Kdbx3Reader.h" +#include "format/Kdbx4Reader.h" BaseKeePass2Reader::BaseKeePass2Reader() : m_error(false) @@ -118,14 +119,21 @@ Database* KeePass2Reader::readDatabase(QIODevice* device, const CompositeKey& ke m_version = Endian::readSizedInt<quint32>(device, KeePass2::BYTEORDER, &ok) & KeePass2::FILE_VERSION_CRITICAL_MASK; - quint32 maxVersion = KeePass2::FILE_VERSION & KeePass2::FILE_VERSION_CRITICAL_MASK; + quint32 maxVersion = KeePass2::FILE_VERSION_4 & KeePass2::FILE_VERSION_CRITICAL_MASK; if (!ok || (m_version < KeePass2::FILE_VERSION_MIN) || (m_version > maxVersion)) { raiseError(tr("Unsupported KeePass 2 database version.")); return nullptr; } device->seek(0); - m_reader.reset(static_cast<BaseKeePass2Reader*>(new Kdbx3Reader())); + + // Determine KDBX3 vs KDBX4 + if (m_version < KeePass2::FILE_VERSION_4) { + m_reader.reset(new Kdbx3Reader()); + } else { + m_reader.reset(new Kdbx4Reader()); + } + m_reader->setSaveXml(m_saveXml); return m_reader->readDatabase(device, key, keepDatabase); } @@ -159,3 +167,8 @@ quint32 KeePass2Reader::version() const { return m_version; } + +QSharedPointer<BaseKeePass2Reader> KeePass2Reader::reader() +{ + return m_reader; +} \ No newline at end of file diff --git a/src/format/KeePass2Reader.h b/src/format/KeePass2Reader.h index 93348f565..fd28db2b7 100644 --- a/src/format/KeePass2Reader.h +++ b/src/format/KeePass2Reader.h @@ -70,11 +70,12 @@ public: QString errorString() override; QByteArray xmlData() override; QByteArray streamKey() override; + QSharedPointer<BaseKeePass2Reader> reader(); KeePass2::ProtectedStreamAlgo protectedStreamAlgo() const override; quint32 version() const; private: - QScopedPointer<BaseKeePass2Reader> m_reader; + QSharedPointer<BaseKeePass2Reader> m_reader; quint32 m_version; }; diff --git a/src/format/KeePass2Repair.cpp b/src/format/KeePass2Repair.cpp index 0e79fa8ba..fdaa45d62 100644 --- a/src/format/KeePass2Repair.cpp +++ b/src/format/KeePass2Repair.cpp @@ -25,7 +25,9 @@ #include "format/KeePass2.h" #include "format/KeePass2RandomStream.h" #include "format/KeePass2Reader.h" +#include "format/Kdbx4Reader.h" #include "format/Kdbx3XmlReader.h" +#include "format/Kdbx4XmlReader.h" KeePass2Repair::RepairOutcome KeePass2Repair::repairDatabase(QIODevice* device, const CompositeKey& key) { @@ -74,12 +76,23 @@ KeePass2Repair::RepairOutcome KeePass2Repair::repairDatabase(QIODevice* device, KeePass2RandomStream randomStream(reader.protectedStreamAlgo()); randomStream.init(reader.streamKey()); - Kdbx3XmlReader xmlReader; + bool hasError; + QBuffer buffer(&xmlData); buffer.open(QIODevice::ReadOnly); - xmlReader.readDatabase(&buffer, db.data(), &randomStream); + if ((reader.version() & KeePass2::FILE_VERSION_CRITICAL_MASK) < KeePass2::FILE_VERSION_4) { + Kdbx3XmlReader xmlReader; + xmlReader.readDatabase(&buffer, db.data(), &randomStream); + hasError = xmlReader.hasError(); + } else { + auto reader4 = reader.reader().staticCast<Kdbx4Reader>(); + QHash<QString, QByteArray> pool = reader4->binaryPool(); + Kdbx4XmlReader xmlReader(pool); + xmlReader.readDatabase(&buffer, db.data(), &randomStream); + hasError = xmlReader.hasError(); + } - if (xmlReader.hasError()) { + if (hasError) { return qMakePair(RepairFailed, nullptr); } else { diff --git a/src/format/KeePass2Writer.cpp b/src/format/KeePass2Writer.cpp index 00392dc05..baea9968a 100644 --- a/src/format/KeePass2Writer.cpp +++ b/src/format/KeePass2Writer.cpp @@ -22,6 +22,7 @@ #include "format/KeePass2Writer.h" #include "core/Database.h" #include "format/Kdbx3Writer.h" +#include "format/Kdbx4Writer.h" BaseKeePass2Writer::BaseKeePass2Writer() : m_error(false) { @@ -67,6 +68,22 @@ QString KeePass2Writer::errorString() } bool KeePass2Writer::writeDatabase(QIODevice* device, Database* db) { - m_writer.reset(static_cast<BaseKeePass2Writer*>(new Kdbx3Writer())); + bool useKdbx4 = false; + + if (db->kdf()->uuid() != KeePass2::KDF_AES) { + useKdbx4 = true; + } + + if (db->publicCustomData().size() > 0) { + useKdbx4 = true; + } + + // Determine KDBX3 vs KDBX4 + if (useKdbx4) { + m_writer.reset(new Kdbx4Writer()); + } else { + m_writer.reset(new Kdbx3Writer()); + } + return m_writer->writeDatabase(device, db); } diff --git a/src/gui/DatabaseSettingsWidget.cpp b/src/gui/DatabaseSettingsWidget.cpp index 2f4fe177d..b5c1ad459 100644 --- a/src/gui/DatabaseSettingsWidget.cpp +++ b/src/gui/DatabaseSettingsWidget.cpp @@ -105,7 +105,7 @@ void DatabaseSettingsWidget::load(Database* db) m_ui->transformRoundsSpinBox->setValue(kdf->rounds()); if (kdfUuid == KeePass2::KDF_ARGON2) { auto argon2Kdf = kdf.staticCast<Argon2Kdf>(); - m_ui->memorySpinBox->setValue(argon2Kdf->memory()); + m_ui->memorySpinBox->setValue(argon2Kdf->memory() / (1<<10)); m_ui->parallelismSpinBox->setValue(argon2Kdf->parallelism()); } @@ -120,6 +120,7 @@ void DatabaseSettingsWidget::save() meta->setDescription(m_ui->dbDescriptionEdit->text()); meta->setDefaultUserName(m_ui->defaultUsernameEdit->text()); meta->setRecycleBinEnabled(m_ui->recycleBinEnabledCheckBox->isChecked()); + meta->setSettingsChanged(QDateTime::currentDateTimeUtc()); bool truncate = false; @@ -156,7 +157,7 @@ void DatabaseSettingsWidget::save() kdf->setRounds(m_ui->transformRoundsSpinBox->value()); if (kdf->uuid() == KeePass2::KDF_ARGON2) { auto argon2Kdf = kdf.staticCast<Argon2Kdf>(); - argon2Kdf->setMemory(m_ui->memorySpinBox->value()); + argon2Kdf->setMemory(m_ui->memorySpinBox->value() * (1<<10)); argon2Kdf->setParallelism(m_ui->parallelismSpinBox->value()); } @@ -189,8 +190,12 @@ void DatabaseSettingsWidget::transformRoundsBenchmark() kdf->setRounds(m_ui->transformRoundsSpinBox->value()); if (kdf->uuid() == KeePass2::KDF_ARGON2) { auto argon2Kdf = kdf.staticCast<Argon2Kdf>(); - argon2Kdf->setMemory(m_ui->memorySpinBox->value()); - argon2Kdf->setParallelism(m_ui->parallelismSpinBox->value()); + if (!argon2Kdf->setMemory(m_ui->memorySpinBox->value() * (1<<10))) { + m_ui->memorySpinBox->setValue(argon2Kdf->memory() / (1<<10)); + } + if (!argon2Kdf->setParallelism(m_ui->parallelismSpinBox->value())) { + m_ui->parallelismSpinBox->setValue(argon2Kdf->parallelism()); + } } // Determine the number of rounds required to meet 1 second delay diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 5325ed3de..6ea82b330 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -809,7 +809,7 @@ void DatabaseWidget::updateMasterKey(bool accepted) if (accepted) { QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); - bool result = m_db->setKey(m_changeMasterKeyWidget->newMasterKey()); + bool result = m_db->setKey(m_changeMasterKeyWidget->newMasterKey(), true, true); QApplication::restoreOverrideCursor(); if (!result) { diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 91c6b2e2e..4472fc27a 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -110,6 +110,9 @@ add_unit_test(NAME testgroup SOURCES TestGroup.cpp add_unit_test(NAME testkdbx3xmlreader SOURCES TestKeePass2XmlReader.cpp TestKdbx3XmlReader.cpp LIBS ${TEST_LIBRARIES}) +add_unit_test(NAME testkdbx4xmlreader SOURCES TestKeePass2XmlReader.cpp TestKdbx4XmlReader.cpp + LIBS ${TEST_LIBRARIES}) + add_unit_test(NAME testkeys SOURCES TestKeys.cpp LIBS ${TEST_LIBRARIES}) diff --git a/tests/TestKdbx4XmlReader.cpp b/tests/TestKdbx4XmlReader.cpp new file mode 100644 index 000000000..c1a0b42ee --- /dev/null +++ b/tests/TestKdbx4XmlReader.cpp @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <QTest> + +#include "TestKeePass2XmlReader.h" + +QTEST_GUILESS_MAIN(TestKdbx4XmlReader) diff --git a/tests/TestKeePass2Reader.cpp b/tests/TestKeePass2Reader.cpp index 22973ee00..86dc6db2c 100644 --- a/tests/TestKeePass2Reader.cpp +++ b/tests/TestKeePass2Reader.cpp @@ -155,3 +155,26 @@ void TestKeePass2Reader::testFormat300() delete db; } + +void TestKeePass2Reader::testFormat400() +{ + QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/Format400.kdbx"); + CompositeKey key; + key.addKey(PasswordKey("t")); + KeePass2Reader reader; + Database* db = reader.readDatabase(filename, key); + QVERIFY(db); + QVERIFY(!reader.hasError()); + + QCOMPARE(db->rootGroup()->name(), QString("Format400")); + QCOMPARE(db->metadata()->name(), QString("Format400")); + QCOMPARE(db->rootGroup()->entries().size(), 1); + Entry* entry = db->rootGroup()->entries().at(0); + + QCOMPARE(entry->title(), QString("Format400")); + QCOMPARE(entry->username(), QString("Format400")); + QCOMPARE(entry->attributes()->keys().size(), 6); + QCOMPARE(entry->attributes()->value("Format400"), QString("Format400")); + QCOMPARE(entry->attachments()->keys().size(), 1); + QCOMPARE(entry->attachments()->value("Format400"), QByteArray("Format400\n")); +} diff --git a/tests/TestKeePass2Reader.h b/tests/TestKeePass2Reader.h index 76ffe0297..6ba9b0dc1 100644 --- a/tests/TestKeePass2Reader.h +++ b/tests/TestKeePass2Reader.h @@ -32,6 +32,7 @@ private slots: void testBrokenHeaderHash(); void testFormat200(); void testFormat300(); + void testFormat400(); }; #endif // KEEPASSX_TESTKEEPASS2READER_H diff --git a/tests/TestKeePass2XmlReader.cpp b/tests/TestKeePass2XmlReader.cpp index c1e3b4b63..fda8fffd6 100644 --- a/tests/TestKeePass2XmlReader.cpp +++ b/tests/TestKeePass2XmlReader.cpp @@ -27,6 +27,8 @@ #include "crypto/Crypto.h" #include "format/Kdbx3XmlReader.h" #include "format/Kdbx3XmlWriter.h" +#include "format/Kdbx4XmlReader.h" +#include "format/Kdbx4XmlWriter.h" #include "config-keepassx-tests.h" namespace QTest { @@ -89,6 +91,18 @@ void TestKdbx3XmlReader::initTestCase() QVERIFY(!reader.hasError()); } +void TestKdbx4XmlReader::initTestCase() +{ + QVERIFY(Crypto::init()); + + Kdbx4XmlReader reader; + reader.setStrictMode(true); + QString xmlFile = QString(KEEPASSX_TEST_DATA_DIR).append("/NewDatabase.xml"); + m_db = reader.readDatabase(xmlFile); + QVERIFY(m_db); + QVERIFY(!reader.hasError()); +} + void TestKdbx3XmlReader::readDatabase(QString path, bool strictMode, Database*& db, bool& hasError, QString& errorString) { Kdbx3XmlReader reader; @@ -115,6 +129,32 @@ void TestKdbx3XmlReader::writeDatabase(QBuffer* buf, Database* db, bool& hasErro errorString = writer.errorString(); } +void TestKdbx4XmlReader::readDatabase(QString path, bool strictMode, Database*& db, bool& hasError, QString& errorString) +{ + Kdbx4XmlReader reader; + reader.setStrictMode(strictMode); + db = reader.readDatabase(path); + hasError = reader.hasError(); + errorString = reader.errorString(); +} + +void TestKdbx4XmlReader::readDatabase(QBuffer* buf, bool strictMode, Database*& db, bool& hasError, QString& errorString) +{ + Kdbx4XmlReader reader; + reader.setStrictMode(strictMode); + db = reader.readDatabase(buf); + hasError = reader.hasError(); + errorString = reader.errorString(); +} + +void TestKdbx4XmlReader::writeDatabase(QBuffer* buf, Database* db, bool& hasError, QString& errorString) +{ + Kdbx4XmlWriter writer; + writer.writeDatabase(buf, db); + hasError = writer.hasError(); + errorString = writer.errorString(); +} + void TestKeePass2XmlReader::testMetadata() { QCOMPARE(m_db->metadata()->generator(), QString("KeePass")); diff --git a/tests/TestKeePass2XmlReader.h b/tests/TestKeePass2XmlReader.h index 2ce122235..e07f575b3 100644 --- a/tests/TestKeePass2XmlReader.h +++ b/tests/TestKeePass2XmlReader.h @@ -70,4 +70,17 @@ protected: virtual void writeDatabase(QBuffer* buf, Database* db, bool& hasError, QString& errorString) override; }; +class TestKdbx4XmlReader : public TestKeePass2XmlReader +{ + Q_OBJECT + +private slots: + virtual void initTestCase() override; + +protected: + virtual void readDatabase(QBuffer* buf, bool strictMode, Database*& db, bool& hasError, QString& errorString) override; + virtual void readDatabase(QString path, bool strictMode, Database*& db, bool& hasError, QString& errorString) override; + virtual void writeDatabase(QBuffer* buf, Database* db, bool& hasError, QString& errorString) override; +}; + #endif // KEEPASSX_TESTKEEPASS2XMLREADER_H diff --git a/tests/data/Format400.kdbx b/tests/data/Format400.kdbx new file mode 100644 index 0000000000000000000000000000000000000000..1a877508e838a68870fc8ba6420b0e6b55aead72 GIT binary patch literal 1801 zcmV+k2ln^_*`k_f`%AR|00aO65C8xG)&q(wi*HP|r6e<&G26A80|Wp70096100bZa z002AsdBAy7CEGE7ne=tFS@D(EGicgUEE1q$pu)ND%M%NW000000YU`;001OaRY^n; z0002*V{PAzDMU+=_o<`<;|dG}0RR91Rs;Y5022TJ00jX6002n{000020000000005 z0RR91O$Y!00000G0000000aR5002+~000020000&0RR91Qy>5U09LF9Z7qf>u*D1j z_7plao%BKS=8+32eW;I6!@~mEr2q#E0000pKZj78Z*q{0Xp}Gj1ONa44GIkk(A|W+ z?(w4C8xGa`1D~vE0Is>2-H*l&(4ZVrZRd%*bGLJjo?PbTu0158zkZaan9Ml=_3!<F zxC9+Z5{$NK39cbQ=fW~9zZiCO!fT0Hr*IAK7Mll$UJt|xVF7*#hy?%uoyCpR@sLsZ zbgjjg{qj!d#X8>qI=EUp(86)Bl)HqqwaowA@b;H9Og{7ytKFz7hPjH#4HK`QSqQwU z<9DY<b!c{u329Cp+%|?9pR@oQN<drwIi-JEiqr9f-)ZIjc2($nMLfpWsL!Z}bR-CB z2AvRtxC4LBR1Oz6xf~%caZ%A{f2k^e`t7<L@IW&+|LEb&7=h5K(C8mVMzfv_EnP7$ z%HcC|1XgaS()U;@zpo=s57ZHKHHkON^shG0bQz+d<cVpdgmMjGGwwjbkCnsBa1WR3 zqE_=UWz$)WnQaN+iozkpijDTJ`c#Y=?A<phs&<rN$WDv?-ut$Xq}|)ZFI?A{Jkr31 zIA2&?uNo!USU>O&?^Lo>q3uNhMAc^iZR($z@A<cDBqi<?4MB(@GTcBQl~1uS$`b40 zHLUrEvo34Q3h>ZTWMH3{Jg#^VK8hC3Kjz7ZO~zbjx)`(aL0*K2x~r{FV!qevR=3qX z6;QycGP6WhmBUS%kdz+iHp9=DT`WN8!H-9?B!B&zN8N_e=n^OyRGAtHr&g@vZ|_yu z%zFCg9UR7*{GFN~ur@Z;zI~3CkX7UVUK|$LSZZU7jf3s%I~!}K=m%<|Q>GK-$hRzz zEAfz;xzo?gf~4o9-!*~IVP$Ug@hJ(0HLMI1Y7kza2F9!!?H_Xtc&1|4>KN&;zr|WG zkve*EA+CmsOKnflHj5hO?kAUre)_)CgSvdYx-$&_lQs0<%BrP@_(?hxq}6w;u32;a zaa*cXHV=h?su|2nHJHpFKIbTQH<l;{VpMTG!~^_YaOA^Ze~KF#S$4z$X;7-WQD<f2 zJ~e-M-l#mSsNhs`|Fb{IgPLWd=;nOEV$;T6pN!%3`RPxFW_Feg11CHSTv<@L2Q;62 z8=$R@lMtc9yp8>1`(a!VY-57+N|%u@8=VVmgspcQ@r@IQ`jwn-Zahgw^+(auwgmDM zuuEm^;qFyP^A6n^GDRaKZ>48O(Bt5d_J{5b_P6~tva>QjaOhR%dQijo1#7gv{hZ0I zS>o1g=+gn_WcPArddeiCyS{Krs+A03fjgrxI%sxF5Gypbz-M4Mjhwl@&m)5vx6l`s z__Dcap5oC*o>MwknTZ+qBHve(N0%Ge&ytVuRDmNB{-yzcV!~9S0(ueg3Sr2;07YSc zCcWsX(@fxVg{@W>x~?)2c6q8!w+zdt&ZRL2e5tbNKjqHjLHP-K77?yk=*Z2f2e+w| zYb=U<hpusT82*vDrA^nlVB=(Jnio@RC#JT5bmmnsQGc&Ua_2!)w>1(tbR7iS)NwJK ztA8GJ{_4<>x9dPzpN$xc13a(2T`V^Sjazwc8;C$=GskV#7;1mt-_n>>RNnl?(L(=E zO0~7BeBlb}(SW>~mB!6tnLX>2z8HoLV&`|7jcsm@mbInY^iAL1mEpH<3l7c?%tj2G z<jh8S;Edxrx_9;XLV=)VqkSr`x7WAVqXx;C8a3f*Skhf%@vHqytx-xt5?!Iyut2cx zSE7xlZwt!A!g~xm>i^Z_m_bZ{?mhXA3$%W<(FYy=@$_o49eslC+z$9t%$?RZ2ni+u z{s+ywuTdHA83ti&`1xR?j!j5Ad>GqTNjGORo>Ae=(^drWz^h_)IY-;Ii9nK<AigU* z1>d!3Qz#~>hZeE2&w~|aQ;2#`i~@qnL;Gu&&Tx8O<^y56H%`h*nRRFP*%@Q0CbHs! zZ8GIVEyoYYL7@@68%6m2u*cf2Ovmdr%z+OT_6{rUYk?q+Cf>{MPP%vPZ=7;k(su)O zEo_<24kzHat5>PP+zLbE^eh?4Pe3z2owR|cBd?Cx;|K#ODZg7|Nm~+|)x?Zay*5~$ r`H}nGlUTlv#AmSXdYJo0x{`4F%hdC3e3OW`R%IFyI;%Ph00000Hm_K2 literal 0 HcmV?d00001 From 564188b0d3ef80e436a66c4f53f0393b1cfcfd08 Mon Sep 17 00:00:00 2001 From: angelsl <angelsl@in04.sg> Date: Mon, 13 Nov 2017 03:20:37 +0800 Subject: [PATCH 237/402] Report database read failure reason in tests --- tests/TestKeePass2Writer.cpp | 7 +++++-- tests/TestKeys.cpp | 9 ++++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/tests/TestKeePass2Writer.cpp b/tests/TestKeePass2Writer.cpp index 049c3e66e..30d0cbf5a 100644 --- a/tests/TestKeePass2Writer.cpp +++ b/tests/TestKeePass2Writer.cpp @@ -65,12 +65,15 @@ void TestKeePass2Writer::initTestCase() buffer.open(QBuffer::ReadWrite); KeePass2Writer writer; - writer.writeDatabase(&buffer, m_dbOrg); + bool writeSuccess = writer.writeDatabase(&buffer, m_dbOrg); + QVERIFY(writeSuccess); QVERIFY(!writer.hasError()); buffer.seek(0); KeePass2Reader reader; m_dbTest = reader.readDatabase(&buffer, key); - QVERIFY(!reader.hasError()); + if (reader.hasError()) { + QFAIL(reader.errorString().toUtf8().constData()); + } QVERIFY(m_dbTest); } diff --git a/tests/TestKeys.cpp b/tests/TestKeys.cpp index 990878e2d..a97287f39 100644 --- a/tests/TestKeys.cpp +++ b/tests/TestKeys.cpp @@ -153,12 +153,19 @@ void TestKeys::testCreateAndOpenFileKey() KeePass2Writer writer; writer.writeDatabase(&dbBuffer, dbOrg.data()); + bool writeSuccess = writer.writeDatabase(&dbBuffer, dbOrg.data()); + if (writer.hasError()) { + QFAIL(writer.errorString().toUtf8().constData()); + } + QVERIFY(writeSuccess); dbBuffer.reset(); KeePass2Reader reader; QScopedPointer<Database> dbRead(reader.readDatabase(&dbBuffer, compositeKey)); + if (reader.hasError()) { + QFAIL(reader.errorString().toUtf8().constData()); + } QVERIFY(dbRead); - QVERIFY(!reader.hasError()); QCOMPARE(dbRead->metadata()->name(), dbName); } From f7d3c902185250c8db910f2e1b5f3457ab4a4a05 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sat, 6 Jan 2018 13:11:47 +0100 Subject: [PATCH 238/402] Fix compilation error --- src/crypto/CryptoHash.cpp | 2 +- src/gui/DatabaseSettingsWidget.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/crypto/CryptoHash.cpp b/src/crypto/CryptoHash.cpp index 70633da15..12c6bf791 100644 --- a/src/crypto/CryptoHash.cpp +++ b/src/crypto/CryptoHash.cpp @@ -109,7 +109,7 @@ QByteArray CryptoHash::result() const { Q_D(const CryptoHash); - const auto* result = reinterpret_cast<const char*>(gcry_md_read(d->ctx, 0)); + const auto result = reinterpret_cast<const char*>(gcry_md_read(d->ctx, 0)); return QByteArray(result, d->hashLen); } diff --git a/src/gui/DatabaseSettingsWidget.cpp b/src/gui/DatabaseSettingsWidget.cpp index b5c1ad459..5d1764cd6 100644 --- a/src/gui/DatabaseSettingsWidget.cpp +++ b/src/gui/DatabaseSettingsWidget.cpp @@ -199,7 +199,7 @@ void DatabaseSettingsWidget::transformRoundsBenchmark() } // Determine the number of rounds required to meet 1 second delay - int rounds = AsyncTask::runAndWaitForFuture([this, kdf]() { + int rounds = AsyncTask::runAndWaitForFuture([kdf]() { return kdf->benchmark(1000); }); From 995d6646beb5352acd79f1204c3cbdb23aad0dd8 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sat, 6 Jan 2018 15:27:44 +0100 Subject: [PATCH 239/402] Redesign DatabaseSettingsWidget --- .../32x32/actions/document-encrypt.png | Bin 0 -> 1052 bytes src/gui/DatabaseSettingsWidget.cpp | 145 ++++---- src/gui/DatabaseSettingsWidget.h | 6 + src/gui/DatabaseSettingsWidget.ui | 325 ++---------------- src/gui/DatabaseSettingsWidgetEncryption.ui | 192 +++++++++++ src/gui/DatabaseSettingsWidgetGeneral.ui | 154 +++++++++ 6 files changed, 458 insertions(+), 364 deletions(-) create mode 100644 share/icons/application/32x32/actions/document-encrypt.png create mode 100644 src/gui/DatabaseSettingsWidgetEncryption.ui create mode 100644 src/gui/DatabaseSettingsWidgetGeneral.ui diff --git a/share/icons/application/32x32/actions/document-encrypt.png b/share/icons/application/32x32/actions/document-encrypt.png new file mode 100644 index 0000000000000000000000000000000000000000..353a22ca259a4bcfda30193e8e360870d3b0c10f GIT binary patch literal 1052 zcmV+%1mpXOP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800004b3#c}2nYxW zd<bNS00009a7bBm000Aa000Aa0e#hi%m4rY8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H11DQ!gK~#9!-B!O#96=QRW_I^}_%n9~Igr@chBQJ9m^48P)5Kt9 zW1m9NB88+(8!$y|@*h~GRSXu<qzI%4F(48ILlB9e@y`39yEBvb_GZ~b3q5ZkBoDru z*_qjU-+b@AnH9zu{7rMwq^+#1+^tk9k5j4CgKRc?M+kvZsq}S!e}5yB$-JGKn)-w$ ztQiI5>gwtX*L9!eayjqx^b|)&M^H+kP$-1h-Q5icFDEA_p99cI5|C?aYahw^(8<XO z4i67O3P5WOR)GJbTrMLB0*s7|U}tCN^XTa4-K&t0xPp=MMRGK>x3?EM@;q;goQ?zN zqvyWk<KuBs;#+rjH<p%`(9_d1xW2x=n1}+)%ggs^x9=$K>0+^nbUOWdVq#(j!1))& z!otEUaz4XK3=R(Zq}IdX;o*&z6sXl|^R)Z)!NCDb{4;ib!OYy;+$<@wO=S5!55RoO zA)vVTbF4Y(Iy*a`o^yVI1g)EuQleU|a&Gh|LEskc1`H~*_qfCy$NAv<KIaO*+d2V~ zzngcXlrm#uV?|tI)6>&MQoyGYWinlfQ~`y6lMh!kR*DIOEfE47Q#$o<RkLgVF9IBb zW(c%?7kpozG`%-d`1M1h_}fFN3{)y-VR_XE)oLXwH9nTZxM#9$q4T!3G`hMZ@`ZNf z2L`acxrKX=-iW4e!;ah`JpT&{9eX&dDHKZrCnXn^vWwcO18oGP5Xfc}(kX*XN};_g zKwI9RBd_7~K7qM$8`!+&b*yzAO1T69|BU*90*rwxeF!1pIWF}<&=3%`K1I_30EfX9 zbp7uEDeG{YfS^E1Bk%=`HsQDsiU=sq5t^6uYzPQpj85)@Bv!&{=(9tBe!1mUM1u1{ z!*#jO<Q0sRtrHL;g5oDT7CB+mNd*DmlR~a9!@dZ~>LdvWTe)=w*kl74*JWsUp5Z<d zYh3}YrG??#BXFx(Uh9+z#A|~<5IF{|vFlqRAf<*O$Pjgh%8lkiRS2+iyhhqvF;*?n zuVQ0Zenvg+jxgM^Maf98b4eY=u|+!)q1=Gv)|MTjokz);Tp1c8LMX*C4o3)*!@|xQ z5>r@ZbYtw3r~<>_!>FDE0pNMs=0FU)dpq9ZZP-kCT3pK{60?7kfc+kbGn@%|7H-rw zz_E}Pjlvs(won#91N^9EkY9}`357jlBd6z(vTd6CjC12?aCT<la~mTj8j)m|OyUpv Wi_8pHBnJur0000<MNUMnLSTYaSlXok literal 0 HcmV?d00001 diff --git a/src/gui/DatabaseSettingsWidget.cpp b/src/gui/DatabaseSettingsWidget.cpp index 5d1764cd6..9335b0ab8 100644 --- a/src/gui/DatabaseSettingsWidget.cpp +++ b/src/gui/DatabaseSettingsWidget.cpp @@ -17,10 +17,13 @@ #include "DatabaseSettingsWidget.h" #include "ui_DatabaseSettingsWidget.h" +#include "ui_DatabaseSettingsWidgetGeneral.h" +#include "ui_DatabaseSettingsWidgetEncryption.h" #include <QMessageBox> #include "core/Global.h" +#include "core/FilePath.h" #include "core/AsyncTask.h" #include "core/Database.h" #include "core/Group.h" @@ -32,18 +35,31 @@ DatabaseSettingsWidget::DatabaseSettingsWidget(QWidget* parent) : DialogyWidget(parent) , m_ui(new Ui::DatabaseSettingsWidget()) + , m_uiGeneral(new Ui::DatabaseSettingsWidgetGeneral()) + , m_uiEncryption(new Ui::DatabaseSettingsWidgetEncryption()) + , m_uiGeneralPage(new QWidget()) + , m_uiEncryptionPage(new QWidget()) , m_db(nullptr) { m_ui->setupUi(this); + m_uiGeneral->setupUi(m_uiGeneralPage); + m_uiEncryption->setupUi(m_uiEncryptionPage); connect(m_ui->buttonBox, SIGNAL(accepted()), SLOT(save())); connect(m_ui->buttonBox, SIGNAL(rejected()), SLOT(reject())); - connect(m_ui->historyMaxItemsCheckBox, SIGNAL(toggled(bool)), - m_ui->historyMaxItemsSpinBox, SLOT(setEnabled(bool))); - connect(m_ui->historyMaxSizeCheckBox, SIGNAL(toggled(bool)), - m_ui->historyMaxSizeSpinBox, SLOT(setEnabled(bool))); - connect(m_ui->transformBenchmarkButton, SIGNAL(clicked()), SLOT(transformRoundsBenchmark())); - connect(m_ui->kdfComboBox, SIGNAL(currentIndexChanged(int)), SLOT(kdfChanged(int))); + connect(m_uiGeneral->historyMaxItemsCheckBox, SIGNAL(toggled(bool)), + m_uiGeneral->historyMaxItemsSpinBox, SLOT(setEnabled(bool))); + connect(m_uiGeneral->historyMaxSizeCheckBox, SIGNAL(toggled(bool)), + m_uiGeneral->historyMaxSizeSpinBox, SLOT(setEnabled(bool))); + connect(m_uiEncryption->transformBenchmarkButton, SIGNAL(clicked()), SLOT(transformRoundsBenchmark())); + connect(m_uiEncryption->kdfComboBox, SIGNAL(currentIndexChanged(int)), SLOT(kdfChanged(int))); + + m_ui->categoryList->addCategory(tr("General"), FilePath::instance()->icon("categories", "preferences-other")); + m_ui->categoryList->addCategory(tr("Encryption"), FilePath::instance()->icon("actions", "document-encrypt")); + m_ui->stackedWidget->addWidget(m_uiGeneralPage); + m_ui->stackedWidget->addWidget(m_uiEncryptionPage); + + connect(m_ui->categoryList, SIGNAL(categoryChanged(int)), m_ui->stackedWidget, SLOT(setCurrentIndex(int))); } DatabaseSettingsWidget::~DatabaseSettingsWidget() @@ -56,77 +72,77 @@ void DatabaseSettingsWidget::load(Database* db) Metadata* meta = m_db->metadata(); - m_ui->dbNameEdit->setText(meta->name()); - m_ui->dbDescriptionEdit->setText(meta->description()); - m_ui->recycleBinEnabledCheckBox->setChecked(meta->recycleBinEnabled()); - m_ui->defaultUsernameEdit->setText(meta->defaultUserName()); + m_uiGeneral->dbNameEdit->setText(meta->name()); + m_uiGeneral->dbDescriptionEdit->setText(meta->description()); + m_uiGeneral->recycleBinEnabledCheckBox->setChecked(meta->recycleBinEnabled()); + m_uiGeneral->defaultUsernameEdit->setText(meta->defaultUserName()); if (meta->historyMaxItems() > -1) { - m_ui->historyMaxItemsSpinBox->setValue(meta->historyMaxItems()); - m_ui->historyMaxItemsCheckBox->setChecked(true); + m_uiGeneral->historyMaxItemsSpinBox->setValue(meta->historyMaxItems()); + m_uiGeneral->historyMaxItemsCheckBox->setChecked(true); } else { - m_ui->historyMaxItemsSpinBox->setValue(Metadata::DefaultHistoryMaxItems); - m_ui->historyMaxItemsCheckBox->setChecked(false); + m_uiGeneral->historyMaxItemsSpinBox->setValue(Metadata::DefaultHistoryMaxItems); + m_uiGeneral->historyMaxItemsCheckBox->setChecked(false); } int historyMaxSizeMiB = qRound(meta->historyMaxSize() / qreal(1048576)); if (historyMaxSizeMiB > 0) { - m_ui->historyMaxSizeSpinBox->setValue(historyMaxSizeMiB); - m_ui->historyMaxSizeCheckBox->setChecked(true); + m_uiGeneral->historyMaxSizeSpinBox->setValue(historyMaxSizeMiB); + m_uiGeneral->historyMaxSizeCheckBox->setChecked(true); } else { - m_ui->historyMaxSizeSpinBox->setValue(Metadata::DefaultHistoryMaxSize); - m_ui->historyMaxSizeCheckBox->setChecked(false); + m_uiGeneral->historyMaxSizeSpinBox->setValue(Metadata::DefaultHistoryMaxSize); + m_uiGeneral->historyMaxSizeCheckBox->setChecked(false); } - m_ui->algorithmComboBox->clear(); + m_uiEncryption->algorithmComboBox->clear(); for (auto& cipher: asConst(KeePass2::CIPHERS)) { - m_ui->algorithmComboBox->addItem(cipher.second, cipher.first.toByteArray()); + m_uiEncryption->algorithmComboBox->addItem(cipher.second, cipher.first.toByteArray()); } - int cipherIndex = m_ui->algorithmComboBox->findData(m_db->cipher().toByteArray()); + int cipherIndex = m_uiEncryption->algorithmComboBox->findData(m_db->cipher().toByteArray()); if (cipherIndex > -1) { - m_ui->algorithmComboBox->setCurrentIndex(cipherIndex); + m_uiEncryption->algorithmComboBox->setCurrentIndex(cipherIndex); } // Setup kdf combo box - m_ui->kdfComboBox->blockSignals(true); - m_ui->kdfComboBox->clear(); + m_uiEncryption->kdfComboBox->blockSignals(true); + m_uiEncryption->kdfComboBox->clear(); for (auto& kdf: asConst(KeePass2::KDFS)) { - m_ui->kdfComboBox->addItem(kdf.second, kdf.first.toByteArray()); + m_uiEncryption->kdfComboBox->addItem(kdf.second, kdf.first.toByteArray()); } - m_ui->kdfComboBox->blockSignals(false); + m_uiEncryption->kdfComboBox->blockSignals(false); auto kdfUuid = m_db->kdf()->uuid(); - int kdfIndex = m_ui->kdfComboBox->findData(kdfUuid.toByteArray()); + int kdfIndex = m_uiEncryption->kdfComboBox->findData(kdfUuid.toByteArray()); if (kdfIndex > -1) { - m_ui->kdfComboBox->setCurrentIndex(kdfIndex); + m_uiEncryption->kdfComboBox->setCurrentIndex(kdfIndex); kdfChanged(kdfIndex); } // Setup kdf parameters auto kdf = m_db->kdf(); - m_ui->transformRoundsSpinBox->setValue(kdf->rounds()); + m_uiEncryption->transformRoundsSpinBox->setValue(kdf->rounds()); if (kdfUuid == KeePass2::KDF_ARGON2) { auto argon2Kdf = kdf.staticCast<Argon2Kdf>(); - m_ui->memorySpinBox->setValue(argon2Kdf->memory() / (1<<10)); - m_ui->parallelismSpinBox->setValue(argon2Kdf->parallelism()); + m_uiEncryption->memorySpinBox->setValue(static_cast<int>(argon2Kdf->memory()) / (1 << 10)); + m_uiEncryption->parallelismSpinBox->setValue(argon2Kdf->parallelism()); } - m_ui->dbNameEdit->setFocus(); + m_uiGeneral->dbNameEdit->setFocus(); } void DatabaseSettingsWidget::save() { Metadata* meta = m_db->metadata(); - meta->setName(m_ui->dbNameEdit->text()); - meta->setDescription(m_ui->dbDescriptionEdit->text()); - meta->setDefaultUserName(m_ui->defaultUsernameEdit->text()); - meta->setRecycleBinEnabled(m_ui->recycleBinEnabledCheckBox->isChecked()); + meta->setName(m_uiGeneral->dbNameEdit->text()); + meta->setDescription(m_uiGeneral->dbDescriptionEdit->text()); + meta->setDefaultUserName(m_uiGeneral->defaultUsernameEdit->text()); + meta->setRecycleBinEnabled(m_uiGeneral->recycleBinEnabledCheckBox->isChecked()); meta->setSettingsChanged(QDateTime::currentDateTimeUtc()); bool truncate = false; int historyMaxItems; - if (m_ui->historyMaxItemsCheckBox->isChecked()) { - historyMaxItems = m_ui->historyMaxItemsSpinBox->value(); + if (m_uiGeneral->historyMaxItemsCheckBox->isChecked()) { + historyMaxItems = m_uiGeneral->historyMaxItemsSpinBox->value(); } else { historyMaxItems = -1; } @@ -136,8 +152,8 @@ void DatabaseSettingsWidget::save() } int historyMaxSize; - if (m_ui->historyMaxSizeCheckBox->isChecked()) { - historyMaxSize = m_ui->historyMaxSizeSpinBox->value() * 1048576; + if (m_uiGeneral->historyMaxSizeCheckBox->isChecked()) { + historyMaxSize = m_uiGeneral->historyMaxSizeSpinBox->value() * 1048576; } else { historyMaxSize = -1; } @@ -150,15 +166,15 @@ void DatabaseSettingsWidget::save() truncateHistories(); } - m_db->setCipher(Uuid(m_ui->algorithmComboBox->currentData().toByteArray())); + m_db->setCipher(Uuid(m_uiEncryption->algorithmComboBox->currentData().toByteArray())); // Save kdf parameters - auto kdf = KeePass2::uuidToKdf(Uuid(m_ui->kdfComboBox->currentData().toByteArray())); - kdf->setRounds(m_ui->transformRoundsSpinBox->value()); + auto kdf = KeePass2::uuidToKdf(Uuid(m_uiEncryption->kdfComboBox->currentData().toByteArray())); + kdf->setRounds(m_uiEncryption->transformRoundsSpinBox->value()); if (kdf->uuid() == KeePass2::KDF_ARGON2) { auto argon2Kdf = kdf.staticCast<Argon2Kdf>(); - argon2Kdf->setMemory(m_ui->memorySpinBox->value() * (1<<10)); - argon2Kdf->setParallelism(m_ui->parallelismSpinBox->value()); + argon2Kdf->setMemory(static_cast<quint64>(m_uiEncryption->memorySpinBox->value()) * (1 << 10)); + argon2Kdf->setParallelism(static_cast<quint32>(m_uiEncryption->parallelismSpinBox->value())); } QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); @@ -183,30 +199,30 @@ void DatabaseSettingsWidget::reject() void DatabaseSettingsWidget::transformRoundsBenchmark() { QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); - m_ui->transformBenchmarkButton->setEnabled(false); + m_uiEncryption->transformBenchmarkButton->setEnabled(false); + m_uiEncryption->transformRoundsSpinBox->setFocus(); // Create a new kdf with the current parameters - auto kdf = KeePass2::uuidToKdf(Uuid(m_ui->kdfComboBox->currentData().toByteArray())); - kdf->setRounds(m_ui->transformRoundsSpinBox->value()); + auto kdf = KeePass2::uuidToKdf(Uuid(m_uiEncryption->kdfComboBox->currentData().toByteArray())); + kdf->setRounds(m_uiEncryption->transformRoundsSpinBox->value()); if (kdf->uuid() == KeePass2::KDF_ARGON2) { auto argon2Kdf = kdf.staticCast<Argon2Kdf>(); - if (!argon2Kdf->setMemory(m_ui->memorySpinBox->value() * (1<<10))) { - m_ui->memorySpinBox->setValue(argon2Kdf->memory() / (1<<10)); + if (!argon2Kdf->setMemory(static_cast<quint64>(m_uiEncryption->memorySpinBox->value()) * (1 << 10))) { + m_uiEncryption->memorySpinBox->setValue(static_cast<int>(argon2Kdf->memory() / (1 << 10))); } - if (!argon2Kdf->setParallelism(m_ui->parallelismSpinBox->value())) { - m_ui->parallelismSpinBox->setValue(argon2Kdf->parallelism()); + if (!argon2Kdf->setParallelism(static_cast<quint32>(m_uiEncryption->parallelismSpinBox->value()))) { + m_uiEncryption->parallelismSpinBox->setValue(argon2Kdf->parallelism()); } } // Determine the number of rounds required to meet 1 second delay - int rounds = AsyncTask::runAndWaitForFuture([kdf]() { + int rounds = AsyncTask::runAndWaitForFuture([&kdf]() { return kdf->benchmark(1000); }); - m_ui->transformRoundsSpinBox->setValue(rounds); - + m_uiEncryption->transformRoundsSpinBox->setValue(rounds); + m_uiEncryption->transformBenchmarkButton->setEnabled(true); QApplication::restoreOverrideCursor(); - m_ui->transformBenchmarkButton->setEnabled(true); } void DatabaseSettingsWidget::truncateHistories() @@ -219,12 +235,13 @@ void DatabaseSettingsWidget::truncateHistories() void DatabaseSettingsWidget::kdfChanged(int index) { - Uuid id(m_ui->kdfComboBox->itemData(index).toByteArray()); - if (id == KeePass2::KDF_ARGON2) { - m_ui->memorySpinBox->setEnabled(true); - m_ui->parallelismSpinBox->setEnabled(true); - } else { - m_ui->memorySpinBox->setEnabled(false); - m_ui->parallelismSpinBox->setEnabled(false); - } + Uuid id(m_uiEncryption->kdfComboBox->itemData(index).toByteArray()); + + bool memoryEnabled = id == KeePass2::KDF_ARGON2; + m_uiEncryption->memoryUsageLabel->setEnabled(memoryEnabled); + m_uiEncryption->memorySpinBox->setEnabled(memoryEnabled); + + bool parallelismEnabled = id == KeePass2::KDF_ARGON2; + m_uiEncryption->parallelismLabel->setEnabled(parallelismEnabled); + m_uiEncryption->parallelismSpinBox->setEnabled(parallelismEnabled); } diff --git a/src/gui/DatabaseSettingsWidget.h b/src/gui/DatabaseSettingsWidget.h index 83a5eb098..8410af37e 100644 --- a/src/gui/DatabaseSettingsWidget.h +++ b/src/gui/DatabaseSettingsWidget.h @@ -31,6 +31,8 @@ class Database; namespace Ui { class DatabaseSettingsWidget; +class DatabaseSettingsWidgetGeneral; +class DatabaseSettingsWidgetEncryption; } class DatabaseSettingsWidget: public DialogyWidget @@ -57,6 +59,10 @@ private: void truncateHistories(); const QScopedPointer<Ui::DatabaseSettingsWidget> m_ui; + const QScopedPointer<Ui::DatabaseSettingsWidgetGeneral> m_uiGeneral; + const QScopedPointer<Ui::DatabaseSettingsWidgetEncryption> m_uiEncryption; + QWidget* m_uiGeneralPage; + QWidget* m_uiEncryptionPage; Database* m_db; }; diff --git a/src/gui/DatabaseSettingsWidget.ui b/src/gui/DatabaseSettingsWidget.ui index 5a6778678..9b45feaa7 100644 --- a/src/gui/DatabaseSettingsWidget.ui +++ b/src/gui/DatabaseSettingsWidget.ui @@ -7,320 +7,45 @@ <x>0</x> <y>0</y> <width>1082</width> - <height>506</height> + <height>578</height> </rect> </property> - <layout class="QVBoxLayout" name="verticalLayout" stretch="1,2,5,1"> + <layout class="QVBoxLayout" name="verticalLayout" stretch="0,0"> <item> - <spacer name="verticalSpacer_2"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>0</width> - <height>0</height> - </size> - </property> - </spacer> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_5" stretch="0,1,0"> + <layout class="QHBoxLayout" name="horizontalLayout_2" stretch="0,1"> <item> - <spacer name="horizontalSpacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>0</width> - <height>0</height> - </size> - </property> - </spacer> + <widget class="CategoryListWidget" name="categoryList" native="true"/> </item> <item> - <widget class="QWidget" name="widget" native="true"> - <property name="maximumSize"> - <size> - <width>400</width> - <height>16777215</height> - </size> + <widget class="QStackedWidget" name="stackedWidget"> + <property name="currentIndex"> + <number>-1</number> </property> - <layout class="QGridLayout" name="gridLayout"> - <item row="11" column="1"> - <widget class="QCheckBox" name="historyMaxSizeCheckBox"> - <property name="text"> - <string>Max. history size:</string> - </property> - </widget> - </item> - <item row="0" column="2"> - <widget class="QLineEdit" name="dbNameEdit"/> - </item> - <item row="7" column="2"> - <layout class="QHBoxLayout" name="horizontalLayout_3"> - <item> - <widget class="QSpinBox" name="memorySpinBox"> - <property name="suffix"> - <string> MB</string> - </property> - <property name="minimum"> - <number>1</number> - </property> - <property name="maximum"> - <number>1048576</number> - </property> - <property name="value"> - <number>64</number> - </property> - </widget> - </item> - </layout> - </item> - <item row="0" column="1" alignment="Qt::AlignRight"> - <widget class="QLabel" name="dbNameLabel"> - <property name="text"> - <string>Database name:</string> - </property> - </widget> - </item> - <item row="10" column="1"> - <widget class="QCheckBox" name="historyMaxItemsCheckBox"> - <property name="text"> - <string>Max. history items:</string> - </property> - </widget> - </item> - <item row="4" column="1"> - <widget class="QLabel" name="kdfLabel"> - <property name="text"> - <string>Key Derivation Function</string> - </property> - </widget> - </item> - <item row="3" column="2"> - <widget class="QComboBox" name="algorithmComboBox"> - <item> - <property name="text"> - <string>AES: 256 Bit (default)</string> - </property> - </item> - <item> - <property name="text"> - <string>Twofish: 256 Bit</string> - </property> - </item> - </widget> - </item> - <item row="3" column="1" alignment="Qt::AlignRight"> - <widget class="QLabel" name="algorithmLabel"> - <property name="text"> - <string>Encryption Algorithm:</string> - </property> - </widget> - </item> - <item row="1" column="1" alignment="Qt::AlignRight"> - <widget class="QLabel" name="dbDescriptionLabel"> - <property name="text"> - <string>Database description:</string> - </property> - </widget> - </item> - <item row="1" column="2"> - <widget class="QLineEdit" name="dbDescriptionEdit"/> - </item> - <item row="4" column="2"> - <widget class="QComboBox" name="kdfComboBox"/> - </item> - <item row="10" column="2"> - <layout class="QHBoxLayout" name="horizontalLayout_2"> - <item> - <widget class="QSpinBox" name="historyMaxItemsSpinBox"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="maximum"> - <number>2000000000</number> - </property> - </widget> - </item> - </layout> - </item> - <item row="11" column="2"> - <layout class="QHBoxLayout" name="horizontalLayout"> - <item> - <widget class="QSpinBox" name="historyMaxSizeSpinBox"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="suffix"> - <string> MiB</string> - </property> - <property name="minimum"> - <number>1</number> - </property> - <property name="maximum"> - <number>2000000000</number> - </property> - </widget> - </item> - </layout> - </item> - <item row="6" column="2"> - <widget class="QSpinBox" name="transformRoundsSpinBox"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="alignment"> - <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> - </property> - <property name="minimum"> - <number>1</number> - </property> - <property name="maximum"> - <number>1000000000</number> - </property> - </widget> - </item> - <item row="5" column="2"> - <widget class="QToolButton" name="transformBenchmarkButton"> - <property name="sizePolicy"> - <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Benchmark 1-second delay</string> - </property> - </widget> - </item> - <item row="2" column="2"> - <widget class="QLineEdit" name="defaultUsernameEdit"> - <property name="enabled"> - <bool>true</bool> - </property> - </widget> - </item> - <item row="2" column="1"> - <widget class="QLabel" name="defaultUsernameLabel"> - <property name="text"> - <string>Default username:</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item row="6" column="1"> - <widget class="QLabel" name="transformRoundsLabel"> - <property name="text"> - <string>Transform rounds:</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item row="7" column="1"> - <widget class="QLabel" name="memoryUsageLabel"> - <property name="text"> - <string>Memory Usage:</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item row="8" column="1"> - <widget class="QLabel" name="parallelismLabel"> - <property name="text"> - <string>Parallelism:</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item row="8" column="2"> - <widget class="QSpinBox" name="parallelismSpinBox"> - <property name="suffix"> - <string> thread</string> - </property> - <property name="minimum"> - <number>1</number> - </property> - <property name="maximum"> - <number>128</number> - </property> - </widget> - </item> - <item row="9" column="1"> - <widget class="QCheckBox" name="recycleBinEnabledCheckBox"> - <property name="text"> - <string>Use recycle bin</string> - </property> - </widget> - </item> - </layout> </widget> </item> - <item> - <spacer name="horizontalSpacer_2"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>0</width> - <height>0</height> - </size> - </property> - </spacer> - </item> </layout> </item> <item> - <spacer name="verticalSpacer"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QDialogButtonBox" name="buttonBox"> - <property name="standardButtons"> - <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> - </property> - </widget> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> </item> </layout> </widget> - <tabstops> - <tabstop>dbNameEdit</tabstop> - <tabstop>dbDescriptionEdit</tabstop> - <tabstop>historyMaxItemsCheckBox</tabstop> - <tabstop>historyMaxItemsSpinBox</tabstop> - <tabstop>historyMaxSizeCheckBox</tabstop> - <tabstop>historyMaxSizeSpinBox</tabstop> - <tabstop>buttonBox</tabstop> - </tabstops> + <customwidgets> + <customwidget> + <class>CategoryListWidget</class> + <extends>QWidget</extends> + <header>gui/CategoryListWidget.h</header> + <container>1</container> + </customwidget> + </customwidgets> <resources/> <connections/> -</ui> +</ui> \ No newline at end of file diff --git a/src/gui/DatabaseSettingsWidgetEncryption.ui b/src/gui/DatabaseSettingsWidgetEncryption.ui new file mode 100644 index 000000000..4c4d2aed2 --- /dev/null +++ b/src/gui/DatabaseSettingsWidgetEncryption.ui @@ -0,0 +1,192 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>DatabaseSettingsWidgetEncryption</class> + <widget class="QWidget" name="DatabaseSettingsWidgetEncryption"> + <layout class="QFormLayout" name="formLayout"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item row="0" column="0"> + <widget class="QLabel" name="algorithmLabel"> + <property name="text"> + <string>Encryption Algorithm:</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QComboBox" name="algorithmComboBox"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <item> + <property name="text"> + <string>AES: 256 Bit (default)</string> + </property> + </item> + <item> + <property name="text"> + <string>Twofish: 256 Bit</string> + </property> + </item> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="kdfLabel"> + <property name="text"> + <string>Key Derivation Function:</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QComboBox" name="kdfComboBox"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="transformRoundsLabel"> + <property name="text"> + <string>Transform rounds:</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <layout class="QHBoxLayout" name="horizontalLayout" stretch="40,40,0"> + <item> + <widget class="QSpinBox" name="transformRoundsSpinBox"> + <property name="minimumSize"> + <size> + <width>150</width> + <height>0</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>150</width> + <height>16777215</height> + </size> + </property> + <property name="alignment"> + <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> + </property> + <property name="minimum"> + <number>1</number> + </property> + <property name="maximum"> + <number>1000000000</number> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="transformBenchmarkButton"> + <property name="focusPolicy"> + <enum>Qt::WheelFocus</enum> + </property> + <property name="text"> + <string>Benchmark 1-second delay</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="memoryUsageLabel"> + <property name="text"> + <string>Memory Usage:</string> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QSpinBox" name="memorySpinBox"> + <property name="minimumSize"> + <size> + <width>150</width> + <height>0</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>150</width> + <height>16777215</height> + </size> + </property> + <property name="suffix"> + <string> MB</string> + </property> + <property name="minimum"> + <number>1</number> + </property> + <property name="maximum"> + <number>1048576</number> + </property> + <property name="value"> + <number>64</number> + </property> + </widget> + </item> + <item row="4" column="0"> + <widget class="QLabel" name="parallelismLabel"> + <property name="text"> + <string>Parallelism:</string> + </property> + </widget> + </item> + <item row="4" column="1"> + <widget class="QSpinBox" name="parallelismSpinBox"> + <property name="minimumSize"> + <size> + <width>150</width> + <height>0</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>150</width> + <height>16777215</height> + </size> + </property> + <property name="suffix"> + <string> thread</string> + </property> + <property name="minimum"> + <number>1</number> + </property> + <property name="maximum"> + <number>128</number> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/src/gui/DatabaseSettingsWidgetGeneral.ui b/src/gui/DatabaseSettingsWidgetGeneral.ui new file mode 100644 index 000000000..c072c1d8d --- /dev/null +++ b/src/gui/DatabaseSettingsWidgetGeneral.ui @@ -0,0 +1,154 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>DatabaseSettingsWidgetGeneral</class> + <widget class="QWidget" name="DatabaseSettingsWidgetGeneral"> + <layout class="QVBoxLayout" name="verticalLayout"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <widget class="QGroupBox" name="groupBox"> + <property name="title"> + <string>Database Meta Data</string> + </property> + <layout class="QFormLayout" name="formLayout"> + <item row="0" column="0"> + <widget class="QLabel" name="dbNameLabel"> + <property name="text"> + <string>Database name:</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLineEdit" name="dbNameEdit"/> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="dbDescriptionLabel"> + <property name="text"> + <string>Database description:</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLineEdit" name="dbDescriptionEdit"/> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="defaultUsernameLabel"> + <property name="text"> + <string>Default username:</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLineEdit" name="defaultUsernameEdit"> + <property name="enabled"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox_2"> + <property name="title"> + <string>History Settings</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0"> + <widget class="QCheckBox" name="historyMaxItemsCheckBox"> + <property name="text"> + <string>Max. history items:</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QCheckBox" name="historyMaxSizeCheckBox"> + <property name="text"> + <string>Max. history size:</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QSpinBox" name="historyMaxSizeSpinBox"> + <property name="suffix"> + <string> MiB</string> + </property> + <property name="minimum"> + <number>1</number> + </property> + <property name="maximum"> + <number>2000000000</number> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QSpinBox" name="historyMaxItemsSpinBox"> + <property name="maximum"> + <number>2000000000</number> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QCheckBox" name="recycleBinEnabledCheckBox"> + <property name="text"> + <string>Use recycle bin</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + </item> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> From 54fb0d9bd331d6f5567360e772a4e1b44587a75b Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sat, 6 Jan 2018 16:59:41 +0100 Subject: [PATCH 240/402] Show warning when using inappropriate transform round number Increase default AES-KDF rounds to 100k --- src/crypto/kdf/Kdf.h | 2 +- src/gui/DatabaseSettingsWidget.cpp | 36 +++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/crypto/kdf/Kdf.h b/src/crypto/kdf/Kdf.h index e45d23bcd..216224a6f 100644 --- a/src/crypto/kdf/Kdf.h +++ b/src/crypto/kdf/Kdf.h @@ -23,7 +23,7 @@ #include "core/Uuid.h" #define KDF_DEFAULT_SEED_SIZE 32 -#define KDF_DEFAULT_ROUNDS 100000ull +#define KDF_DEFAULT_ROUNDS 1000000ull class Kdf { diff --git a/src/gui/DatabaseSettingsWidget.cpp b/src/gui/DatabaseSettingsWidget.cpp index 9335b0ab8..0c2eba796 100644 --- a/src/gui/DatabaseSettingsWidget.cpp +++ b/src/gui/DatabaseSettingsWidget.cpp @@ -1,4 +1,5 @@ /* + * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org> * Copyright (C) 2012 Felix Geyer <debfx@fobos.de> * * This program is free software: you can redistribute it and/or modify @@ -21,6 +22,7 @@ #include "ui_DatabaseSettingsWidgetEncryption.h" #include <QMessageBox> +#include <QPushButton> #include "core/Global.h" #include "core/FilePath.h" @@ -130,6 +132,36 @@ void DatabaseSettingsWidget::load(Database* db) void DatabaseSettingsWidget::save() { + // first perform safety check for KDF rounds + auto kdf = KeePass2::uuidToKdf(Uuid(m_uiEncryption->kdfComboBox->currentData().toByteArray())); + if (kdf->uuid() == KeePass2::KDF_ARGON2 and m_uiEncryption->transformRoundsSpinBox->value() > 1000) { + QMessageBox warning; + warning.setIcon(QMessageBox::Warning); + warning.setWindowTitle(tr("Number of rounds too high")); + warning.setText(tr("You are using a very high number of key transform rounds with Argon2.\n\n" + "If you keep this number, your database may take hours or days (or even longer) to open!")); + auto ok = warning.addButton(tr("Understood, keep number"), QMessageBox::ButtonRole::AcceptRole); + auto cancel = warning.addButton(tr("Cancel"), QMessageBox::ButtonRole::RejectRole); + warning.setDefaultButton(cancel); + warning.exec(); + if (warning.clickedButton() != ok) { + return; + } + } else if (kdf->uuid() == KeePass2::KDF_AES and m_uiEncryption->transformRoundsSpinBox->value() < 100000) { + QMessageBox warning; + warning.setIcon(QMessageBox::Warning); + warning.setWindowTitle(tr("Number of rounds too low")); + warning.setText(tr("You are using a very low number of key transform rounds with AES-KDF.\n\n" + "If you keep this number, your database may be too easy to crack!")); + auto ok = warning.addButton(tr("Understood, keep number"), QMessageBox::ButtonRole::AcceptRole); + auto cancel = warning.addButton(tr("Cancel"), QMessageBox::ButtonRole::RejectRole); + warning.setDefaultButton(cancel); + warning.exec(); + if (warning.clickedButton() != ok) { + return; + } + } + Metadata* meta = m_db->metadata(); meta->setName(m_uiGeneral->dbNameEdit->text()); @@ -169,7 +201,6 @@ void DatabaseSettingsWidget::save() m_db->setCipher(Uuid(m_uiEncryption->algorithmComboBox->currentData().toByteArray())); // Save kdf parameters - auto kdf = KeePass2::uuidToKdf(Uuid(m_uiEncryption->kdfComboBox->currentData().toByteArray())); kdf->setRounds(m_uiEncryption->transformRoundsSpinBox->value()); if (kdf->uuid() == KeePass2::KDF_ARGON2) { auto argon2Kdf = kdf.staticCast<Argon2Kdf>(); @@ -188,6 +219,7 @@ void DatabaseSettingsWidget::save() tr("Failed to transform key with new KDF parameters; KDF unchanged."), QMessageBox::Ok); } + emit editFinished(true); } @@ -244,4 +276,6 @@ void DatabaseSettingsWidget::kdfChanged(int index) bool parallelismEnabled = id == KeePass2::KDF_ARGON2; m_uiEncryption->parallelismLabel->setEnabled(parallelismEnabled); m_uiEncryption->parallelismSpinBox->setEnabled(parallelismEnabled); + + transformRoundsBenchmark(); } From ccfd7a065c821b3075144f497ddff6b4c80598f1 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sat, 6 Jan 2018 17:06:51 +0100 Subject: [PATCH 241/402] Fix coding style and GUI test --- src/crypto/kdf/Argon2Kdf.cpp | 8 +- src/crypto/kdf/Argon2Kdf.h | 2 +- src/format/Kdbx3Reader.cpp | 87 +++--- src/format/Kdbx3Reader.h | 1 + src/format/Kdbx3Writer.cpp | 32 ++- src/format/Kdbx3Writer.h | 1 + src/format/Kdbx3XmlReader.cpp | 1 + src/format/Kdbx3XmlReader.h | 1 + src/format/Kdbx3XmlWriter.cpp | 19 +- src/format/Kdbx3XmlWriter.h | 1 + src/format/Kdbx4Reader.cpp | 93 ++++--- src/format/Kdbx4Reader.h | 2 +- src/format/Kdbx4Writer.cpp | 102 ++++--- src/format/Kdbx4Writer.h | 2 +- src/format/Kdbx4XmlReader.cpp | 367 +++++++++++++++----------- src/format/Kdbx4XmlReader.h | 6 +- src/format/Kdbx4XmlWriter.cpp | 2 +- src/format/Kdbx4XmlWriter.h | 2 +- src/format/KeePass2.cpp | 17 +- src/format/KeePass2.h | 4 +- src/format/KeePass2RandomStream.cpp | 4 +- src/format/KeePass2Reader.cpp | 2 +- src/format/KeePass2Writer.h | 2 + src/gui/DatabaseSettingsWidget.cpp | 4 +- src/streams/HmacBlockStream.cpp | 34 +-- src/streams/SymmetricCipherStream.cpp | 3 +- tests/TestKeePass2RandomStream.cpp | 2 +- tests/gui/TestGui.cpp | 4 +- 28 files changed, 426 insertions(+), 379 deletions(-) diff --git a/src/crypto/kdf/Argon2Kdf.cpp b/src/crypto/kdf/Argon2Kdf.cpp index 12e9135af..154f2ffe4 100644 --- a/src/crypto/kdf/Argon2Kdf.cpp +++ b/src/crypto/kdf/Argon2Kdf.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 KeePassXC Team + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -33,7 +33,7 @@ Argon2Kdf::Argon2Kdf() : Kdf::Kdf(KeePass2::KDF_ARGON2) , m_version(0x13) - , m_memory(1<<16) + , m_memory(1 << 16) , m_parallelism(2) { m_rounds = 1; @@ -63,7 +63,7 @@ quint64 Argon2Kdf::memory() const bool Argon2Kdf::setMemory(quint64 kibibytes) { // MIN=8KB; MAX=2,147,483,648KB - if (kibibytes >= 8 && kibibytes < (1ULL<<32)) { + if (kibibytes >= 8 && kibibytes < (1ULL << 32)) { m_memory = kibibytes; return true; } @@ -79,7 +79,7 @@ quint32 Argon2Kdf::parallelism() const bool Argon2Kdf::setParallelism(quint32 threads) { // MIN=1; MAX=16,777,215 - if (threads >= 1 && threads < (1<<24)) { + if (threads >= 1 && threads < (1 << 24)) { m_parallelism = threads; return true; } diff --git a/src/crypto/kdf/Argon2Kdf.h b/src/crypto/kdf/Argon2Kdf.h index 345ca279c..fe62b2953 100644 --- a/src/crypto/kdf/Argon2Kdf.h +++ b/src/crypto/kdf/Argon2Kdf.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 KeePassXC Team + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/format/Kdbx3Reader.cpp b/src/format/Kdbx3Reader.cpp index 3187442be..5fb72a23e 100644 --- a/src/format/Kdbx3Reader.cpp +++ b/src/format/Kdbx3Reader.cpp @@ -1,4 +1,5 @@ /* + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> * * This program is free software: you can redistribute it and/or modify @@ -161,7 +162,7 @@ Database* Kdbx3Reader::readDatabase(QIODevice* device, const CompositeKey& key, xmlDevice = ioCompressor.data(); } - KeePass2RandomStream randomStream(KeePass2::Salsa20); + KeePass2RandomStream randomStream(KeePass2::ProtectedStreamAlgo::Salsa20); if (!randomStream.init(m_protectedStreamKey)) { raiseError(randomStream.errorString()); return nullptr; @@ -208,10 +209,10 @@ bool Kdbx3Reader::readHeaderField() raiseError("Invalid header id size"); return false; } - quint8 fieldID = fieldIDArray.at(0); + char fieldID = fieldIDArray.at(0); bool ok; - quint16 fieldLen = Endian::readSizedInt<quint16>(m_headerStream, KeePass2::BYTEORDER, &ok); + auto fieldLen = Endian::readSizedInt<quint16>(m_headerStream, KeePass2::BYTEORDER, &ok); if (!ok) { raiseError("Invalid header field length"); return false; @@ -226,44 +227,44 @@ bool Kdbx3Reader::readHeaderField() } } - switch (fieldID) { - case KeePass2::EndOfHeader: + switch (static_cast<KeePass2::HeaderFieldID>(fieldID)) { + case KeePass2::HeaderFieldID::EndOfHeader: m_headerEnd = true; break; - case KeePass2::CipherID: + case KeePass2::HeaderFieldID::CipherID: setCipher(fieldData); break; - case KeePass2::CompressionFlags: + case KeePass2::HeaderFieldID::CompressionFlags: setCompressionFlags(fieldData); break; - case KeePass2::MasterSeed: + case KeePass2::HeaderFieldID::MasterSeed: setMasterSeed(fieldData); break; - case KeePass2::TransformSeed: + case KeePass2::HeaderFieldID::TransformSeed: setTransformSeed(fieldData); break; - case KeePass2::TransformRounds: + case KeePass2::HeaderFieldID::TransformRounds: setTransformRounds(fieldData); break; - case KeePass2::EncryptionIV: + case KeePass2::HeaderFieldID::EncryptionIV: setEncryptionIV(fieldData); break; - case KeePass2::ProtectedStreamKey: + case KeePass2::HeaderFieldID::ProtectedStreamKey: setProtectedStreamKey(fieldData); break; - case KeePass2::StreamStartBytes: + case KeePass2::HeaderFieldID::StreamStartBytes: setStreamStartBytes(fieldData); break; - case KeePass2::InnerRandomStreamID: + case KeePass2::HeaderFieldID::InnerRandomStreamID: setInnerRandomStreamID(fieldData); break; @@ -279,39 +280,40 @@ void Kdbx3Reader::setCipher(const QByteArray& data) { if (data.size() != Uuid::Length) { raiseError("Invalid cipher uuid length"); - } else { - Uuid uuid(data); - - if (SymmetricCipher::cipherToAlgorithm(uuid) == SymmetricCipher::InvalidAlgorithm) { - raiseError("Unsupported cipher"); - } else { - m_db->setCipher(uuid); - } + return; } + + Uuid uuid(data); + + if (SymmetricCipher::cipherToAlgorithm(uuid) == SymmetricCipher::InvalidAlgorithm) { + raiseError("Unsupported cipher"); + return; + } + m_db->setCipher(uuid); } void Kdbx3Reader::setCompressionFlags(const QByteArray& data) { if (data.size() != 4) { raiseError("Invalid compression flags length"); - } else { - quint32 id = Endian::bytesToSizedInt<quint32>(data, KeePass2::BYTEORDER); - - if (id > Database::CompressionAlgorithmMax) { - raiseError("Unsupported compression algorithm"); - } else { - m_db->setCompressionAlgo(static_cast<Database::CompressionAlgorithm>(id)); - } + return; } + auto id = Endian::bytesToSizedInt<quint32>(data, KeePass2::BYTEORDER); + + if (id > Database::CompressionAlgorithmMax) { + raiseError("Unsupported compression algorithm"); + return; + } + m_db->setCompressionAlgo(static_cast<Database::CompressionAlgorithm>(id)); } void Kdbx3Reader::setMasterSeed(const QByteArray& data) { if (data.size() != 32) { raiseError("Invalid master seed size"); - } else { - m_masterSeed = data; + return; } + m_masterSeed = data; } void Kdbx3Reader::setTransformSeed(const QByteArray& data) @@ -355,22 +357,23 @@ void Kdbx3Reader::setStreamStartBytes(const QByteArray& data) { if (data.size() != 32) { raiseError("Invalid start bytes size"); - } else { - m_streamStartBytes = data; + return; } + m_streamStartBytes = data; } void Kdbx3Reader::setInnerRandomStreamID(const QByteArray& data) { if (data.size() != 4) { raiseError("Invalid random stream id size"); - } else { - quint32 id = Endian::bytesToSizedInt<quint32>(data, KeePass2::BYTEORDER); - KeePass2::ProtectedStreamAlgo irsAlgo = KeePass2::idToProtectedStreamAlgo(id); - if (irsAlgo == KeePass2::InvalidProtectedStreamAlgo || irsAlgo == KeePass2::ArcFourVariant) { - raiseError("Invalid inner random stream cipher"); - } else { - m_irsAlgo = irsAlgo; - } + return; } + quint32 id = Endian::bytesToSizedInt<quint32>(data, KeePass2::BYTEORDER); + KeePass2::ProtectedStreamAlgo irsAlgo = KeePass2::idToProtectedStreamAlgo(id); + if (irsAlgo == KeePass2::ProtectedStreamAlgo::InvalidProtectedStreamAlgo || + irsAlgo == KeePass2::ProtectedStreamAlgo::ArcFourVariant) { + raiseError("Invalid inner random stream cipher"); + return; + } + m_irsAlgo = irsAlgo; } diff --git a/src/format/Kdbx3Reader.h b/src/format/Kdbx3Reader.h index 24a1ef100..024189eda 100644 --- a/src/format/Kdbx3Reader.h +++ b/src/format/Kdbx3Reader.h @@ -1,4 +1,5 @@ /* + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> * * This program is free software: you can redistribute it and/or modify diff --git a/src/format/Kdbx3Writer.cpp b/src/format/Kdbx3Writer.cpp index 2fedf273c..ca02fb7ac 100644 --- a/src/format/Kdbx3Writer.cpp +++ b/src/format/Kdbx3Writer.cpp @@ -1,4 +1,5 @@ /* + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> * * This program is free software: you can redistribute it and/or modify @@ -32,9 +33,6 @@ #include "streams/QtIOCompressor" #include "streams/SymmetricCipherStream.h" -#define CHECK_RETURN(x) if (!(x)) return; -#define CHECK_RETURN_FALSE(x) if (!(x)) return false; - Kdbx3Writer::Kdbx3Writer() : m_device(0) { @@ -51,7 +49,7 @@ bool Kdbx3Writer::writeDatabase(QIODevice* device, Database* db) QByteArray startBytes = randomGen()->randomArray(32); QByteArray endOfHeader = "\r\n\r\n"; - if (db->challengeMasterSeed(masterSeed) == false) { + if (!db->challengeMasterSeed(masterSeed)) { raiseError(tr("Unable to issue challenge-response.")); return false; } @@ -76,23 +74,23 @@ bool Kdbx3Writer::writeDatabase(QIODevice* device, Database* db) CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes<qint32>(KeePass2::SIGNATURE_2, KeePass2::BYTEORDER))); CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes<qint32>(KeePass2::FILE_VERSION_3, KeePass2::BYTEORDER))); - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::CipherID, db->cipher().toByteArray())); - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::CompressionFlags, + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::CipherID, db->cipher().toByteArray())); + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::CompressionFlags, Endian::sizedIntToBytes<qint32>(db->compressionAlgo(), KeePass2::BYTEORDER))); auto kdf = db->kdf(); - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::MasterSeed, masterSeed)); - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::TransformSeed, kdf->seed())); - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::TransformRounds, + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::MasterSeed, masterSeed)); + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::TransformSeed, kdf->seed())); + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::TransformRounds, Endian::sizedIntToBytes<qint64>(kdf->rounds(), KeePass2::BYTEORDER))); - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::EncryptionIV, encryptionIV)); - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::ProtectedStreamKey, protectedStreamKey)); - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::StreamStartBytes, startBytes)); - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::InnerRandomStreamID, - Endian::sizedIntToBytes<qint32>(KeePass2::Salsa20, + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::EncryptionIV, encryptionIV)); + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::ProtectedStreamKey, protectedStreamKey)); + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::StreamStartBytes, startBytes)); + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::InnerRandomStreamID, + Endian::sizedIntToBytes<qint32>(static_cast<qint32>(KeePass2::ProtectedStreamAlgo::Salsa20), KeePass2::BYTEORDER))); - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::EndOfHeader, endOfHeader)); + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::EndOfHeader, endOfHeader)); header.close(); m_device = device; @@ -130,7 +128,7 @@ bool Kdbx3Writer::writeDatabase(QIODevice* device, Database* db) m_device = ioCompressor.data(); } - KeePass2RandomStream randomStream(KeePass2::Salsa20); + KeePass2RandomStream randomStream(KeePass2::ProtectedStreamAlgo::Salsa20); if (!randomStream.init(protectedStreamKey)) { raiseError(randomStream.errorString()); return false; @@ -175,7 +173,7 @@ bool Kdbx3Writer::writeHeaderField(KeePass2::HeaderFieldID fieldId, const QByteA Q_ASSERT(data.size() <= 65535); QByteArray fieldIdArr; - fieldIdArr[0] = fieldId; + fieldIdArr[0] = static_cast<char>(fieldId); CHECK_RETURN_FALSE(writeData(fieldIdArr)); CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes<qint16>(static_cast<quint16>(data.size()), KeePass2::BYTEORDER))); diff --git a/src/format/Kdbx3Writer.h b/src/format/Kdbx3Writer.h index f3368eebb..1b9fe7563 100644 --- a/src/format/Kdbx3Writer.h +++ b/src/format/Kdbx3Writer.h @@ -1,4 +1,5 @@ /* + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> * * This program is free software: you can redistribute it and/or modify diff --git a/src/format/Kdbx3XmlReader.cpp b/src/format/Kdbx3XmlReader.cpp index 3a4bdbd9d..18dd0914d 100644 --- a/src/format/Kdbx3XmlReader.cpp +++ b/src/format/Kdbx3XmlReader.cpp @@ -1,4 +1,5 @@ /* + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> * * This program is free software: you can redistribute it and/or modify diff --git a/src/format/Kdbx3XmlReader.h b/src/format/Kdbx3XmlReader.h index 477eb3865..213b21c92 100644 --- a/src/format/Kdbx3XmlReader.h +++ b/src/format/Kdbx3XmlReader.h @@ -1,4 +1,5 @@ /* + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> * * This program is free software: you can redistribute it and/or modify diff --git a/src/format/Kdbx3XmlWriter.cpp b/src/format/Kdbx3XmlWriter.cpp index 40c20e65c..bfa94a77c 100644 --- a/src/format/Kdbx3XmlWriter.cpp +++ b/src/format/Kdbx3XmlWriter.cpp @@ -1,4 +1,5 @@ /* + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> * * This program is free software: you can redistribute it and/or modify @@ -458,11 +459,7 @@ void Kdbx3XmlWriter::writeNumber(const QString& qualifiedName, int number) void Kdbx3XmlWriter::writeBool(const QString& qualifiedName, bool b) { - if (b) { - writeString(qualifiedName, "True"); - } else { - writeString(qualifiedName, "False"); - } + writeString(qualifiedName, b ? "True" : "False"); } void Kdbx3XmlWriter::writeDateTime(const QString& qualifiedName, const QDateTime& dateTime) @@ -487,20 +484,12 @@ void Kdbx3XmlWriter::writeUuid(const QString& qualifiedName, const Uuid& uuid) void Kdbx3XmlWriter::writeUuid(const QString& qualifiedName, const Group* group) { - if (group) { - writeUuid(qualifiedName, group->uuid()); - } else { - writeUuid(qualifiedName, Uuid()); - } + writeUuid(qualifiedName, group ? group->uuid() : Uuid()); } void Kdbx3XmlWriter::writeUuid(const QString& qualifiedName, const Entry* entry) { - if (entry) { - writeUuid(qualifiedName, entry->uuid()); - } else { - writeUuid(qualifiedName, Uuid()); - } + writeUuid(qualifiedName, entry ? entry->uuid() : Uuid()); } void Kdbx3XmlWriter::writeBinary(const QString& qualifiedName, const QByteArray& ba) diff --git a/src/format/Kdbx3XmlWriter.h b/src/format/Kdbx3XmlWriter.h index 2bb130566..6eaf32f35 100644 --- a/src/format/Kdbx3XmlWriter.h +++ b/src/format/Kdbx3XmlWriter.h @@ -1,4 +1,5 @@ /* + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> * * This program is free software: you can redistribute it and/or modify diff --git a/src/format/Kdbx4Reader.cpp b/src/format/Kdbx4Reader.cpp index 0a69cbf2d..5bac5d005 100644 --- a/src/format/Kdbx4Reader.cpp +++ b/src/format/Kdbx4Reader.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -72,8 +72,7 @@ Database* Kdbx4Reader::readDatabase(QIODevice* device, const CompositeKey& key, "This is a one-way migration. You won't be able to open the imported " "database with the old KeePassX 0.4 version.")); return nullptr; - } - else if (!ok || signature2 != KeePass2::SIGNATURE_2) { + } else if (!ok || signature2 != KeePass2::SIGNATURE_2) { raiseError(tr("Not a KeePass database.")); return nullptr; } @@ -203,9 +202,7 @@ Database* Kdbx4Reader::readDatabase(QIODevice* device, const CompositeKey& key, if (keepDatabase) { return db.take(); } - else { - return nullptr; - } + return nullptr; } return db.take(); @@ -218,10 +215,10 @@ bool Kdbx4Reader::readHeaderField(QIODevice* device) raiseError("Invalid header id size"); return false; } - quint8 fieldID = fieldIDArray.at(0); + char fieldID = fieldIDArray.at(0); bool ok; - quint32 fieldLen = Endian::readSizedInt<quint32>(device, KeePass2::BYTEORDER, &ok); + auto fieldLen = Endian::readSizedInt<quint32>(device, KeePass2::BYTEORDER, &ok); if (!ok) { raiseError("Invalid header field length"); return false; @@ -236,27 +233,27 @@ bool Kdbx4Reader::readHeaderField(QIODevice* device) } } - switch (fieldID) { - case KeePass2::EndOfHeader: + switch (static_cast<KeePass2::HeaderFieldID>(fieldID)) { + case KeePass2::HeaderFieldID::EndOfHeader: return false; - case KeePass2::CipherID: + case KeePass2::HeaderFieldID::CipherID: setCipher(fieldData); break; - case KeePass2::CompressionFlags: + case KeePass2::HeaderFieldID::CompressionFlags: setCompressionFlags(fieldData); break; - case KeePass2::MasterSeed: + case KeePass2::HeaderFieldID::MasterSeed: setMasterSeed(fieldData); break; - case KeePass2::EncryptionIV: + case KeePass2::HeaderFieldID::EncryptionIV: setEncryptionIV(fieldData); break; - case KeePass2::KdfParameters: { + case KeePass2::HeaderFieldID::KdfParameters: { QBuffer bufIoDevice(&fieldData); if (!bufIoDevice.open(QIODevice::ReadOnly)) { raiseError("Failed to open buffer for KDF parameters in header"); @@ -264,7 +261,7 @@ bool Kdbx4Reader::readHeaderField(QIODevice* device) } QVariantMap kdfParams = readVariantMap(&bufIoDevice); QSharedPointer<Kdf> kdf = KeePass2::kdfFromParameters(kdfParams); - if (kdf == nullptr) { + if (!kdf) { raiseError("Invalid KDF parameters"); return false; } @@ -272,15 +269,15 @@ bool Kdbx4Reader::readHeaderField(QIODevice* device) break; } - case KeePass2::PublicCustomData: + case KeePass2::HeaderFieldID::PublicCustomData: m_db->setPublicCustomData(fieldData); break; - case KeePass2::ProtectedStreamKey: - case KeePass2::TransformRounds: - case KeePass2::TransformSeed: - case KeePass2::StreamStartBytes: - case KeePass2::InnerRandomStreamID: + case KeePass2::HeaderFieldID::ProtectedStreamKey: + case KeePass2::HeaderFieldID::TransformRounds: + case KeePass2::HeaderFieldID::TransformSeed: + case KeePass2::HeaderFieldID::StreamStartBytes: + case KeePass2::HeaderFieldID::InnerRandomStreamID: raiseError("Legacy header fields found in KDBX4 file."); return false; @@ -456,39 +453,39 @@ void Kdbx4Reader::setCipher(const QByteArray& data) { if (data.size() != Uuid::Length) { raiseError("Invalid cipher uuid length"); - } else { - Uuid uuid(data); - - if (SymmetricCipher::cipherToAlgorithm(uuid) == SymmetricCipher::InvalidAlgorithm) { - raiseError("Unsupported cipher"); - } else { - m_db->setCipher(uuid); - } + return; } + Uuid uuid(data); + + if (SymmetricCipher::cipherToAlgorithm(uuid) == SymmetricCipher::InvalidAlgorithm) { + raiseError("Unsupported cipher"); + return; + } + m_db->setCipher(uuid); } void Kdbx4Reader::setCompressionFlags(const QByteArray& data) { if (data.size() != 4) { raiseError("Invalid compression flags length"); - } else { - quint32 id = Endian::bytesToSizedInt<quint32>(data, KeePass2::BYTEORDER); - - if (id > Database::CompressionAlgorithmMax) { - raiseError("Unsupported compression algorithm"); - } else { - m_db->setCompressionAlgo(static_cast<Database::CompressionAlgorithm>(id)); - } + return; } + auto id = Endian::bytesToSizedInt<quint32>(data, KeePass2::BYTEORDER); + + if (id > Database::CompressionAlgorithmMax) { + raiseError("Unsupported compression algorithm"); + return; + } + m_db->setCompressionAlgo(static_cast<Database::CompressionAlgorithm>(id)); } void Kdbx4Reader::setMasterSeed(const QByteArray& data) { if (data.size() != 32) { raiseError("Invalid master seed size"); - } else { - m_masterSeed = data; + return; } + m_masterSeed = data; } void Kdbx4Reader::setEncryptionIV(const QByteArray& data) @@ -505,15 +502,15 @@ void Kdbx4Reader::setInnerRandomStreamID(const QByteArray& data) { if (data.size() != 4) { raiseError("Invalid random stream id size"); - } else { - quint32 id = Endian::bytesToSizedInt<quint32>(data, KeePass2::BYTEORDER); - KeePass2::ProtectedStreamAlgo irsAlgo = KeePass2::idToProtectedStreamAlgo(id); - if (irsAlgo == KeePass2::InvalidProtectedStreamAlgo || irsAlgo == KeePass2::ArcFourVariant) { - raiseError("Invalid inner random stream cipher"); - } else { - m_irsAlgo = irsAlgo; - } + return; } + auto id = Endian::bytesToSizedInt<quint32>(data, KeePass2::BYTEORDER); + KeePass2::ProtectedStreamAlgo irsAlgo = KeePass2::idToProtectedStreamAlgo(id); + if (irsAlgo == KeePass2::ProtectedStreamAlgo::InvalidProtectedStreamAlgo || irsAlgo == KeePass2::ProtectedStreamAlgo::ArcFourVariant) { + raiseError("Invalid inner random stream cipher"); + return; + } + m_irsAlgo = irsAlgo; } QHash<QString, QByteArray> Kdbx4Reader::binaryPool() diff --git a/src/format/Kdbx4Reader.h b/src/format/Kdbx4Reader.h index 0375209c4..9d8c531ef 100644 --- a/src/format/Kdbx4Reader.h +++ b/src/format/Kdbx4Reader.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/format/Kdbx4Writer.cpp b/src/format/Kdbx4Writer.cpp index 49d04c853..8b503c73a 100644 --- a/src/format/Kdbx4Writer.cpp +++ b/src/format/Kdbx4Writer.cpp @@ -1,5 +1,4 @@ /* - * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * * This program is free software: you can redistribute it and/or modify @@ -34,8 +33,6 @@ #include "streams/QtIOCompressor" #include "streams/SymmetricCipherStream.h" -#define CHECK_RETURN_FALSE(x) if (!(x)) return false; - Kdbx4Writer::Kdbx4Writer() : m_device(nullptr) { @@ -63,7 +60,7 @@ bool Kdbx4Writer::writeDatabase(QIODevice* device, Database* db) QByteArray startBytes; QByteArray endOfHeader = "\r\n\r\n"; - if (db->challengeMasterSeed(masterSeed) == false) { + if (!db->challengeMasterSeed(masterSeed)) { raiseError(tr("Unable to issue challenge-response.")); return false; } @@ -88,12 +85,12 @@ bool Kdbx4Writer::writeDatabase(QIODevice* device, Database* db) CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes(KeePass2::SIGNATURE_1, KeePass2::BYTEORDER))); CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes(KeePass2::SIGNATURE_2, KeePass2::BYTEORDER))); CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes(KeePass2::FILE_VERSION_4, KeePass2::BYTEORDER))); - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::CipherID, db->cipher().toByteArray())); - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::CompressionFlags, + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::CipherID, db->cipher().toByteArray())); + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::CompressionFlags, Endian::sizedIntToBytes(static_cast<int>(db->compressionAlgo()), KeePass2::BYTEORDER))); - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::MasterSeed, masterSeed)); - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::EncryptionIV, encryptionIV)); + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::MasterSeed, masterSeed)); + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::EncryptionIV, encryptionIV)); // Convert current Kdf to basic parameters QVariantMap kdfParams = KeePass2::kdfToParameters(db->kdf()); @@ -104,12 +101,12 @@ bool Kdbx4Writer::writeDatabase(QIODevice* device, Database* db) return false; } QByteArray publicCustomData = db->publicCustomData(); - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::KdfParameters, kdfParamBytes)); + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::KdfParameters, kdfParamBytes)); if (!publicCustomData.isEmpty()) { - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::PublicCustomData, publicCustomData)); + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::PublicCustomData, publicCustomData)); } - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::EndOfHeader, endOfHeader)); + CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::EndOfHeader, endOfHeader)); header.close(); m_device = device; headerData = header.data(); @@ -161,7 +158,7 @@ bool Kdbx4Writer::writeDatabase(QIODevice* device, Database* db) QHash<QByteArray, int> idMap; CHECK_RETURN_FALSE(writeInnerHeaderField(KeePass2::InnerHeaderFieldID::InnerRandomStreamID, - Endian::sizedIntToBytes(static_cast<int>(KeePass2::ChaCha20), + Endian::sizedIntToBytes(static_cast<int>(KeePass2::ProtectedStreamAlgo::ChaCha20), KeePass2::BYTEORDER))); CHECK_RETURN_FALSE(writeInnerHeaderField(KeePass2::InnerHeaderFieldID::InnerRandomStreamKey, protectedStreamKey)); @@ -180,7 +177,7 @@ bool Kdbx4Writer::writeDatabase(QIODevice* device, Database* db) } CHECK_RETURN_FALSE(writeInnerHeaderField(KeePass2::InnerHeaderFieldID::End, QByteArray())); - KeePass2RandomStream randomStream(KeePass2::ChaCha20); + KeePass2RandomStream randomStream(KeePass2::ProtectedStreamAlgo::ChaCha20); if (!randomStream.init(protectedStreamKey)) { raiseError(randomStream.errorString()); return false; @@ -217,15 +214,13 @@ bool Kdbx4Writer::writeData(const QByteArray& data) raiseError(m_device->errorString()); return false; } - else { - return true; - } + return true; } bool Kdbx4Writer::writeHeaderField(KeePass2::HeaderFieldID fieldId, const QByteArray& data) { QByteArray fieldIdArr; - fieldIdArr[0] = fieldId; + fieldIdArr[0] = static_cast<char>(fieldId); CHECK_RETURN_FALSE(writeData(fieldIdArr)); CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes(static_cast<quint32>(data.size()), KeePass2::BYTEORDER))); CHECK_RETURN_FALSE(writeData(data)); @@ -264,47 +259,46 @@ bool Kdbx4Writer::serializeVariantMap(const QVariantMap& p, QByteArray& o) bool ok; QList<QString> keys = p.keys(); - for (int i = 0; i < keys.size(); ++i) { - QString k = keys.at(i); + for (const auto& k : keys) { KeePass2::VariantMapFieldType fieldType; QByteArray data; QVariant v = p.value(k); switch (static_cast<QMetaType::Type>(v.type())) { - case QMetaType::Type::Int: - fieldType = KeePass2::VariantMapFieldType::Int32; - data = Endian::sizedIntToBytes(v.toInt(&ok), KeePass2::BYTEORDER); - CHECK_RETURN_FALSE(ok); - break; - case QMetaType::Type::UInt: - fieldType = KeePass2::VariantMapFieldType::UInt32; - data = Endian::sizedIntToBytes(v.toUInt(&ok), KeePass2::BYTEORDER); - CHECK_RETURN_FALSE(ok); - break; - case QMetaType::Type::LongLong: - fieldType = KeePass2::VariantMapFieldType::Int64; - data = Endian::sizedIntToBytes(v.toLongLong(&ok), KeePass2::BYTEORDER); - CHECK_RETURN_FALSE(ok); - break; - case QMetaType::Type::ULongLong: - fieldType = KeePass2::VariantMapFieldType::UInt64; - data = Endian::sizedIntToBytes(v.toULongLong(&ok), KeePass2::BYTEORDER); - CHECK_RETURN_FALSE(ok); - break; - case QMetaType::Type::QString: - fieldType = KeePass2::VariantMapFieldType::String; - data = v.toString().toUtf8(); - break; - case QMetaType::Type::Bool: - fieldType = KeePass2::VariantMapFieldType::Bool; - data = QByteArray(1, (v.toBool() ? '\1' : '\0')); - break; - case QMetaType::Type::QByteArray: - fieldType = KeePass2::VariantMapFieldType::ByteArray; - data = v.toByteArray(); - break; - default: - qWarning("Unknown object type %d in QVariantMap", v.type()); - return false; + case QMetaType::Type::Int: + fieldType = KeePass2::VariantMapFieldType::Int32; + data = Endian::sizedIntToBytes(v.toInt(&ok), KeePass2::BYTEORDER); + CHECK_RETURN_FALSE(ok); + break; + case QMetaType::Type::UInt: + fieldType = KeePass2::VariantMapFieldType::UInt32; + data = Endian::sizedIntToBytes(v.toUInt(&ok), KeePass2::BYTEORDER); + CHECK_RETURN_FALSE(ok); + break; + case QMetaType::Type::LongLong: + fieldType = KeePass2::VariantMapFieldType::Int64; + data = Endian::sizedIntToBytes(v.toLongLong(&ok), KeePass2::BYTEORDER); + CHECK_RETURN_FALSE(ok); + break; + case QMetaType::Type::ULongLong: + fieldType = KeePass2::VariantMapFieldType::UInt64; + data = Endian::sizedIntToBytes(v.toULongLong(&ok), KeePass2::BYTEORDER); + CHECK_RETURN_FALSE(ok); + break; + case QMetaType::Type::QString: + fieldType = KeePass2::VariantMapFieldType::String; + data = v.toString().toUtf8(); + break; + case QMetaType::Type::Bool: + fieldType = KeePass2::VariantMapFieldType::Bool; + data = QByteArray(1, static_cast<char>(v.toBool() ? '\1' : '\0')); + break; + case QMetaType::Type::QByteArray: + fieldType = KeePass2::VariantMapFieldType::ByteArray; + data = v.toByteArray(); + break; + default: + qWarning("Unknown object type %d in QVariantMap", v.type()); + return false; } QByteArray typeBytes; typeBytes[0] = static_cast<char>(fieldType); diff --git a/src/format/Kdbx4Writer.h b/src/format/Kdbx4Writer.h index 4e703324d..7bb20e0f1 100644 --- a/src/format/Kdbx4Writer.h +++ b/src/format/Kdbx4Writer.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/format/Kdbx4XmlReader.cpp b/src/format/Kdbx4XmlReader.cpp index 10dfe6475..9f6ce02c3 100644 --- a/src/format/Kdbx4XmlReader.cpp +++ b/src/format/Kdbx4XmlReader.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,12 +19,9 @@ #include <QBuffer> #include <QFile> -#include <QRegularExpression> #include "core/Endian.h" -#include "core/Database.h" #include "core/DatabaseIcons.h" -#include "core/Group.h" #include "core/Metadata.h" #include "core/Tools.h" #include "format/KeePass2RandomStream.h" @@ -68,30 +65,32 @@ void Kdbx4XmlReader::readDatabase(QIODevice* device, Database* db, KeePass2Rando m_randomStream = randomStream; m_headerHash.clear(); - m_tmpParent = new Group(); + m_tmpParent.reset(new Group()); bool rootGroupParsed = false; - if (!m_xml.hasError() && m_xml.readNextStartElement()) { - if (m_xml.name() == "KeePassFile") { - rootGroupParsed = parseKeePassFile(); - } + if (m_xml.hasError()) { + raiseError(QString("XML parsing failure: %1").arg(m_xml.error())); + return; } - if (!m_xml.hasError() && !rootGroupParsed) { + if (m_xml.readNextStartElement() && m_xml.name() == "KeePassFile") { + rootGroupParsed = parseKeePassFile(); + } + + if (!rootGroupParsed) { raiseError("No root group"); + return; } - if (!m_xml.hasError()) { - if (!m_tmpParent->children().isEmpty()) { - qWarning("Kdbx4XmlReader::readDatabase: found %d invalid group reference(s)", - m_tmpParent->children().size()); - } + if (!m_tmpParent->children().isEmpty()) { + qWarning("Kdbx4XmlReader::readDatabase: found %d invalid group reference(s)", + m_tmpParent->children().size()); + } - if (!m_tmpParent->entries().isEmpty()) { - qWarning("Kdbx4XmlReader::readDatabase: found %d invalid entry reference(s)", - m_tmpParent->children().size()); - } + if (!m_tmpParent->entries().isEmpty()) { + qWarning("Kdbx4XmlReader::readDatabase: found %d invalid entry reference(s)", + m_tmpParent->children().size()); } const QSet<QString> poolKeys = m_binaryPool.keys().toSet(); @@ -100,13 +99,11 @@ void Kdbx4XmlReader::readDatabase(QIODevice* device, Database* db, KeePass2Rando const QSet<QString> unusedKeys = poolKeys - entryKeys; if (!unmappedKeys.isEmpty()) { - raiseError("Unmapped keys left."); + qWarning("Unmapped keys left."); } - if (!m_xml.hasError()) { - for (const QString& key : unusedKeys) { - qWarning("Kdbx4XmlReader::readDatabase: found unused key \"%s\"", qPrintable(key)); - } + for (const QString& key : unusedKeys) { + qWarning("Kdbx4XmlReader::readDatabase: found unused key \"%s\"", qPrintable(key)); } QHash<QString, QPair<Entry*, QString> >::const_iterator i; @@ -131,13 +128,11 @@ void Kdbx4XmlReader::readDatabase(QIODevice* device, Database* db, KeePass2Rando histEntry->setUpdateTimeinfo(true); } } - - delete m_tmpParent; } Database* Kdbx4XmlReader::readDatabase(QIODevice* device) { - Database* db = new Database(); + auto db = new Database(); readDatabase(device, db); return db; } @@ -158,14 +153,16 @@ QString Kdbx4XmlReader::errorString() { if (m_error) { return m_errorStr; - } else if (m_xml.hasError()) { + } + + if (m_xml.hasError()) { return QString("XML error:\n%1\nLine %2, column %3") .arg(m_xml.errorString()) .arg(m_xml.lineNumber()) .arg(m_xml.columnNumber()); - } else { - return QString(); } + + return QString(); } void Kdbx4XmlReader::raiseError(const QString& errorMessage) @@ -189,17 +186,21 @@ bool Kdbx4XmlReader::parseKeePassFile() while (!m_xml.hasError() && m_xml.readNextStartElement()) { if (m_xml.name() == "Meta") { parseMeta(); - } else if (m_xml.name() == "Root") { + continue; + } + + if (m_xml.name() == "Root") { if (rootElementFound) { rootParsedSuccessfully = false; - raiseError("Multiple root elements"); + qWarning("Multiple root elements"); } else { rootParsedSuccessfully = parseRoot(); rootElementFound = true; } - } else { - skipCurrentElement(); + continue; } + + skipCurrentElement(); } return rootParsedSuccessfully; @@ -259,14 +260,14 @@ void Kdbx4XmlReader::parseMeta() if (value >= -1) { m_meta->setHistoryMaxItems(value); } else { - raiseError("HistoryMaxItems invalid number"); + qWarning("HistoryMaxItems invalid number"); } } else if (m_xml.name() == "HistoryMaxSize") { int value = readNumber(); if (value >= -1) { m_meta->setHistoryMaxSize(value); } else { - raiseError("HistoryMaxSize invalid number"); + qWarning("HistoryMaxSize invalid number"); } } else if (m_xml.name() == "Binaries") { parseBinaries(); @@ -337,9 +338,10 @@ void Kdbx4XmlReader::parseIcon() if (uuidSet && iconSet) { m_meta->addCustomIcon(uuid, icon); - } else { - raiseError("Missing icon uuid or data"); + return; } + + raiseError("Missing icon uuid or data"); } void Kdbx4XmlReader::parseBinaries() @@ -347,27 +349,28 @@ void Kdbx4XmlReader::parseBinaries() Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Binaries"); while (!m_xml.hasError() && m_xml.readNextStartElement()) { - if (m_xml.name() == "Binary") { - QXmlStreamAttributes attr = m_xml.attributes(); - - QString id = attr.value("ID").toString(); - - QByteArray data; - if (attr.value("Compressed").compare(QLatin1String("True"), Qt::CaseInsensitive) == 0) { - data = readCompressedBinary(); - } else { - data = readBinary(); - } - - if (m_binaryPool.contains(id)) { - qWarning("Kdbx4XmlReader::parseBinaries: overwriting binary item \"%s\"", - qPrintable(id)); - } - - m_binaryPool.insert(id, data); - } else { + if (m_xml.name() != "Binary") { skipCurrentElement(); + continue; } + + QXmlStreamAttributes attr = m_xml.attributes(); + + QString id = attr.value("ID").toString(); + + QByteArray data; + if (attr.value("Compressed").compare(QLatin1String("True"), Qt::CaseInsensitive) == 0) { + data = readCompressedBinary(); + } else { + data = readBinary(); + } + + if (m_binaryPool.contains(id)) { + qWarning("Kdbx4XmlReader::parseBinaries: overwriting binary item \"%s\"", + qPrintable(id)); + } + + m_binaryPool.insert(id, data); } } @@ -378,9 +381,9 @@ void Kdbx4XmlReader::parseCustomData() while (!m_xml.hasError() && m_xml.readNextStartElement()) { if (m_xml.name() == "Item") { parseCustomDataItem(); - } else { - skipCurrentElement(); + continue; } + skipCurrentElement(); } } @@ -407,9 +410,10 @@ void Kdbx4XmlReader::parseCustomDataItem() if (keySet && valueSet) { m_meta->addCustomField(key, value); - } else { - raiseError("Missing custom data key or value"); + return; } + + raiseError("Missing custom data key or value"); } bool Kdbx4XmlReader::parseRoot() @@ -450,7 +454,7 @@ Group* Kdbx4XmlReader::parseGroup() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Group"); - Group* group = new Group(); + auto group = new Group(); group->setUpdateTimeinfo(false); QList<Group*> children; QList<Entry*> entries; @@ -466,11 +470,17 @@ Group* Kdbx4XmlReader::parseGroup() } else { group->setUuid(uuid); } - } else if (m_xml.name() == "Name") { + continue; + } + if (m_xml.name() == "Name") { group->setName(readString()); - } else if (m_xml.name() == "Notes") { + continue; + } + if (m_xml.name() == "Notes") { group->setNotes(readString()); - } else if (m_xml.name() == "IconID") { + continue; + } + if (m_xml.name() == "IconID") { int iconId = readNumber(); if (iconId < 0) { if (m_strictMode) { @@ -483,18 +493,28 @@ Group* Kdbx4XmlReader::parseGroup() } group->setIcon(iconId); - } else if (m_xml.name() == "CustomIconUUID") { + continue; + } + if (m_xml.name() == "CustomIconUUID") { Uuid uuid = readUuid(); if (!uuid.isNull()) { group->setIcon(uuid); } - } else if (m_xml.name() == "Times") { + continue; + } + if (m_xml.name() == "Times") { group->setTimeInfo(parseTimes()); - } else if (m_xml.name() == "IsExpanded") { + continue; + } + if (m_xml.name() == "IsExpanded") { group->setExpanded(readBool()); - } else if (m_xml.name() == "DefaultAutoTypeSequence") { + continue; + } + if (m_xml.name() == "DefaultAutoTypeSequence") { group->setDefaultAutoTypeSequence(readString()); - } else if (m_xml.name() == "EnableAutoType") { + continue; + } + if (m_xml.name() == "EnableAutoType") { QString str = readString(); if (str.compare("null", Qt::CaseInsensitive) == 0) { @@ -506,7 +526,9 @@ Group* Kdbx4XmlReader::parseGroup() } else { raiseError("Invalid EnableAutoType value"); } - } else if (m_xml.name() == "EnableSearching") { + continue; + } + if (m_xml.name() == "EnableSearching") { QString str = readString(); if (str.compare("null", Qt::CaseInsensitive) == 0) { @@ -518,21 +540,28 @@ Group* Kdbx4XmlReader::parseGroup() } else { raiseError("Invalid EnableSearching value"); } - } else if (m_xml.name() == "LastTopVisibleEntry") { + continue; + } + if (m_xml.name() == "LastTopVisibleEntry") { group->setLastTopVisibleEntry(getEntry(readUuid())); - } else if (m_xml.name() == "Group") { + continue; + } + if (m_xml.name() == "Group") { Group* newGroup = parseGroup(); if (newGroup) { children.append(newGroup); } - } else if (m_xml.name() == "Entry") { + continue; + } + if (m_xml.name() == "Entry") { Entry* newEntry = parseEntry(false); if (newEntry) { entries.append(newEntry); } - } else { - skipCurrentElement(); + continue; } + + skipCurrentElement(); } if (group->uuid().isNull() && !m_strictMode) { @@ -577,7 +606,7 @@ void Kdbx4XmlReader::parseDeletedObject() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "DeletedObject"); - DeletedObject delObj; + DeletedObject delObj{}; while (!m_xml.hasError() && m_xml.readNextStartElement()) { if (m_xml.name() == "UUID") { @@ -586,19 +615,24 @@ void Kdbx4XmlReader::parseDeletedObject() if (m_strictMode) { raiseError("Null DeleteObject uuid"); } - } else { - delObj.uuid = uuid; + continue; } - } else if (m_xml.name() == "DeletionTime") { - delObj.deletionTime = readDateTime(); - } else { - skipCurrentElement(); + delObj.uuid = uuid; + continue; } + if (m_xml.name() == "DeletionTime") { + delObj.deletionTime = readDateTime(); + continue; + } + skipCurrentElement(); } if (!delObj.uuid.isNull() && !delObj.deletionTime.isNull()) { m_db->addDeletedObject(delObj); - } else if (m_strictMode) { + return; + } + + if (m_strictMode) { raiseError("Missing DeletedObject uuid or time"); } } @@ -607,7 +641,7 @@ Entry* Kdbx4XmlReader::parseEntry(bool history) { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Entry"); - Entry* entry = new Entry(); + auto entry = new Entry(); entry->setUpdateTimeinfo(false); QList<Entry*> historyItems; QList<StringPair> binaryRefs; @@ -624,7 +658,9 @@ Entry* Kdbx4XmlReader::parseEntry(bool history) } else { entry->setUuid(uuid); } - } else if (m_xml.name() == "IconID") { + continue; + } + if (m_xml.name() == "IconID") { int iconId = readNumber(); if (iconId < 0) { if (m_strictMode) { @@ -633,39 +669,59 @@ Entry* Kdbx4XmlReader::parseEntry(bool history) iconId = 0; } entry->setIcon(iconId); - } else if (m_xml.name() == "CustomIconUUID") { + continue; + } + if (m_xml.name() == "CustomIconUUID") { Uuid uuid = readUuid(); if (!uuid.isNull()) { entry->setIcon(uuid); } - } else if (m_xml.name() == "ForegroundColor") { + continue; + }if (m_xml.name() == "ForegroundColor") { entry->setForegroundColor(readColor()); - } else if (m_xml.name() == "BackgroundColor") { + continue; + } + if (m_xml.name() == "BackgroundColor") { entry->setBackgroundColor(readColor()); - } else if (m_xml.name() == "OverrideURL") { + continue; + } + if (m_xml.name() == "OverrideURL") { entry->setOverrideUrl(readString()); - } else if (m_xml.name() == "Tags") { + continue; + } + if (m_xml.name() == "Tags") { entry->setTags(readString()); - } else if (m_xml.name() == "Times") { + continue; + } + if (m_xml.name() == "Times") { entry->setTimeInfo(parseTimes()); - } else if (m_xml.name() == "String") { + continue; + } + if (m_xml.name() == "String") { parseEntryString(entry); - } else if (m_xml.name() == "Binary") { + continue; + } + if (m_xml.name() == "Binary") { QPair<QString, QString> ref = parseEntryBinary(entry); if (!ref.first.isNull() && !ref.second.isNull()) { binaryRefs.append(ref); } - } else if (m_xml.name() == "AutoType") { + continue; + } + if (m_xml.name() == "AutoType") { parseAutoType(entry); - } else if (m_xml.name() == "History") { + continue; + } + if (m_xml.name() == "History") { if (history) { raiseError("History element in history entry"); } else { historyItems = parseEntryHistory(); } - } else { - skipCurrentElement(); + continue; } + + skipCurrentElement(); } if (entry->uuid().isNull() && !m_strictMode) { @@ -720,7 +776,10 @@ void Kdbx4XmlReader::parseEntryString(Entry* entry) if (m_xml.name() == "Key") { key = readString(); keySet = true; - } else if (m_xml.name() == "Value") { + continue; + } + + if (m_xml.name() == "Value") { QXmlStreamAttributes attr = m_xml.attributes(); value = readString(); @@ -740,26 +799,29 @@ void Kdbx4XmlReader::parseEntryString(Entry* entry) } } else { raiseError("Unable to decrypt entry string"); + continue; } } protect = isProtected || protectInMemory; valueSet = true; - } else { - skipCurrentElement(); + continue; } + + skipCurrentElement(); } if (keySet && valueSet) { // the default attributes are always there so additionally check if it's empty if (entry->attributes()->hasKey(key) && !entry->attributes()->value(key).isEmpty()) { raiseError("Duplicate custom attribute found"); - } else { - entry->attributes()->set(key, value, protect); + return; } - } else { - raiseError("Entry string key or value missing"); + entry->attributes()->set(key, value, protect); + return; } + + raiseError("Entry string key or value missing"); } QPair<QString, QString> Kdbx4XmlReader::parseEntryBinary(Entry* entry) @@ -777,7 +839,9 @@ QPair<QString, QString> Kdbx4XmlReader::parseEntryBinary(Entry* entry) if (m_xml.name() == "Key") { key = readString(); keySet = true; - } else if (m_xml.name() == "Value") { + continue; + } + if (m_xml.name() == "Value") { QXmlStreamAttributes attr = m_xml.attributes(); if (attr.hasAttribute("Ref")) { @@ -797,9 +861,9 @@ QPair<QString, QString> Kdbx4XmlReader::parseEntryBinary(Entry* entry) } valueSet = true; - } else { - skipCurrentElement(); + continue; } + skipCurrentElement(); } if (keySet && valueSet) { @@ -856,9 +920,9 @@ void Kdbx4XmlReader::parseAutoTypeAssoc(Entry* entry) if (windowSet && sequenceSet) { entry->autoTypeAssociations()->add(assoc); - } else { - raiseError("Auto-type association window or sequence missing"); + return; } + raiseError("Auto-type association window or sequence missing"); } QList<Entry*> Kdbx4XmlReader::parseEntryHistory() @@ -917,14 +981,15 @@ bool Kdbx4XmlReader::readBool() if (str.compare("True", Qt::CaseInsensitive) == 0) { return true; - } else if (str.compare("False", Qt::CaseInsensitive) == 0) { - return false; - } else if (str.length() == 0) { - return false; - } else { - raiseError("Invalid bool value"); + } + if (str.compare("False", Qt::CaseInsensitive) == 0) { return false; } + if (str.length() == 0) { + return false; + } + raiseError("Invalid bool value"); + return false; } QDateTime Kdbx4XmlReader::readDateTime() @@ -936,18 +1001,18 @@ QDateTime Kdbx4XmlReader::readDateTime() QByteArray secsBytes = QByteArray::fromBase64(str.toUtf8()).leftJustified(8, '\0', true).left(8); qint64 secs = Endian::bytesToSizedInt<quint64>(secsBytes, KeePass2::BYTEORDER); return QDateTime(QDate(1, 1, 1), QTime(0, 0, 0, 0), Qt::UTC).addSecs(secs); - } else { - QDateTime dt = QDateTime::fromString(str, Qt::ISODate); - if (dt.isValid()) { - return dt; - } else { - if (m_strictMode) { - raiseError("Invalid date time value"); - } - - return QDateTime::currentDateTimeUtc(); - } } + + QDateTime dt = QDateTime::fromString(str, Qt::ISODate); + if (dt.isValid()) { + return dt; + } + + if (m_strictMode) { + raiseError("Invalid date time value"); + } + + return QDateTime::currentDateTimeUtc(); } QColor Kdbx4XmlReader::readColor() @@ -955,26 +1020,26 @@ QColor Kdbx4XmlReader::readColor() QString colorStr = readString(); if (colorStr.isEmpty()) { - return QColor(); + return {}; } if (colorStr.length() != 7 || colorStr[0] != '#') { if (m_strictMode) { raiseError("Invalid color value"); } - return QColor(); + return {}; } QColor color; - for (int i = 0; i <= 2; i++) { - QString rgbPartStr = colorStr.mid(1 + 2*i, 2); + for (int i = 0; i <= 2; ++i) { + QString rgbPartStr = colorStr.mid(1 + 2 * i, 2); bool ok; int rgbPart = rgbPartStr.toInt(&ok, 16); if (!ok || rgbPart > 255) { if (m_strictMode) { raiseError("Invalid color rgb part"); } - return QColor(); + return {}; } if (i == 0) { @@ -1003,15 +1068,15 @@ Uuid Kdbx4XmlReader::readUuid() { QByteArray uuidBin = readBinary(); if (uuidBin.isEmpty()) { - return Uuid(); - } else if (uuidBin.length() != Uuid::Length) { + return {}; + } + if (uuidBin.length() != Uuid::Length) { if (m_strictMode) { raiseError("Invalid uuid value"); } - return Uuid(); - } else { - return Uuid(uuidBin); + return {}; } + return Uuid(uuidBin); } QByteArray Kdbx4XmlReader::readBinary() @@ -1045,14 +1110,14 @@ Group* Kdbx4XmlReader::getGroup(const Uuid& uuid) if (m_groups.contains(uuid)) { return m_groups.value(uuid); - } else { - Group* group = new Group(); - group->setUpdateTimeinfo(false); - group->setUuid(uuid); - group->setParent(m_tmpParent); - m_groups.insert(uuid, group); - return group; } + + auto group = new Group(); + group->setUpdateTimeinfo(false); + group->setUuid(uuid); + group->setParent(m_tmpParent.data()); + m_groups.insert(uuid, group); + return group; } Entry* Kdbx4XmlReader::getEntry(const Uuid& uuid) @@ -1063,14 +1128,14 @@ Entry* Kdbx4XmlReader::getEntry(const Uuid& uuid) if (m_entries.contains(uuid)) { return m_entries.value(uuid); - } else { - Entry* entry = new Entry(); - entry->setUpdateTimeinfo(false); - entry->setUuid(uuid); - entry->setGroup(m_tmpParent); - m_entries.insert(uuid, entry); - return entry; } + + auto entry = new Entry(); + entry->setUpdateTimeinfo(false); + entry->setUuid(uuid); + entry->setGroup(m_tmpParent.data()); + m_entries.insert(uuid, entry); + return entry; } void Kdbx4XmlReader::skipCurrentElement() diff --git a/src/format/Kdbx4XmlReader.h b/src/format/Kdbx4XmlReader.h index 6a0a6d4f4..229ac7425 100644 --- a/src/format/Kdbx4XmlReader.h +++ b/src/format/Kdbx4XmlReader.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -27,10 +27,10 @@ #include "core/TimeInfo.h" #include "core/Uuid.h" +#include "core/Group.h" class Database; class Entry; -class Group; class KeePass2RandomStream; class Metadata; @@ -88,7 +88,7 @@ private: KeePass2RandomStream* m_randomStream; Database* m_db; Metadata* m_meta; - Group* m_tmpParent; + QScopedPointer<Group> m_tmpParent; QHash<Uuid, Group*> m_groups; QHash<Uuid, Entry*> m_entries; QHash<QString, QByteArray> m_binaryPool; diff --git a/src/format/Kdbx4XmlWriter.cpp b/src/format/Kdbx4XmlWriter.cpp index 374744563..5c99186ca 100644 --- a/src/format/Kdbx4XmlWriter.cpp +++ b/src/format/Kdbx4XmlWriter.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/format/Kdbx4XmlWriter.h b/src/format/Kdbx4XmlWriter.h index 79f27c98b..17d872580 100644 --- a/src/format/Kdbx4XmlWriter.h +++ b/src/format/Kdbx4XmlWriter.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/format/KeePass2.cpp b/src/format/KeePass2.cpp index f89e828a1..88286a051 100644 --- a/src/format/KeePass2.cpp +++ b/src/format/KeePass2.cpp @@ -89,7 +89,8 @@ QSharedPointer<Kdf> KeePass2::uuidToKdf(const Uuid& uuid) { if (uuid == KDF_AES) { return QSharedPointer<AesKdf>::create(); - } else if (uuid == KDF_ARGON2) { + } + if (uuid == KDF_ARGON2) { return QSharedPointer<Argon2Kdf>::create(); } @@ -100,13 +101,13 @@ QSharedPointer<Kdf> KeePass2::uuidToKdf(const Uuid& uuid) KeePass2::ProtectedStreamAlgo KeePass2::idToProtectedStreamAlgo(quint32 id) { switch (id) { - case static_cast<quint32>(KeePass2::ArcFourVariant): - return KeePass2::ArcFourVariant; - case static_cast<quint32>(KeePass2::Salsa20): - return KeePass2::Salsa20; - case static_cast<quint32>(KeePass2::ChaCha20): - return KeePass2::ChaCha20; + case static_cast<quint32>(KeePass2::ProtectedStreamAlgo::ArcFourVariant): + return KeePass2::ProtectedStreamAlgo::ArcFourVariant; + case static_cast<quint32>(KeePass2::ProtectedStreamAlgo::Salsa20): + return KeePass2::ProtectedStreamAlgo::Salsa20; + case static_cast<quint32>(KeePass2::ProtectedStreamAlgo::ChaCha20): + return KeePass2::ProtectedStreamAlgo::ChaCha20; default: - return KeePass2::InvalidProtectedStreamAlgo; + return KeePass2::ProtectedStreamAlgo::InvalidProtectedStreamAlgo; } } diff --git a/src/format/KeePass2.h b/src/format/KeePass2.h index cdc594f5a..f7fa0d397 100644 --- a/src/format/KeePass2.h +++ b/src/format/KeePass2.h @@ -65,7 +65,7 @@ namespace KeePass2 extern const QList<QPair<Uuid, QString>> CIPHERS; extern const QList<QPair<Uuid, QString>> KDFS; - enum HeaderFieldID + enum class HeaderFieldID { EndOfHeader = 0, Comment = 1, @@ -90,7 +90,7 @@ namespace KeePass2 Binary = 3 }; - enum ProtectedStreamAlgo + enum class ProtectedStreamAlgo { ArcFourVariant = 1, Salsa20 = 2, diff --git a/src/format/KeePass2RandomStream.cpp b/src/format/KeePass2RandomStream.cpp index 9e3d4cbce..26824b7e5 100644 --- a/src/format/KeePass2RandomStream.cpp +++ b/src/format/KeePass2RandomStream.cpp @@ -123,9 +123,9 @@ bool KeePass2RandomStream::loadBlock() SymmetricCipher::Algorithm KeePass2RandomStream::mapAlgo(KeePass2::ProtectedStreamAlgo algo) { switch (algo) { - case KeePass2::ChaCha20: + case KeePass2::ProtectedStreamAlgo::ChaCha20: return SymmetricCipher::ChaCha20; - case KeePass2::Salsa20: + case KeePass2::ProtectedStreamAlgo::Salsa20: return SymmetricCipher::Salsa20; default: return SymmetricCipher::InvalidAlgorithm; diff --git a/src/format/KeePass2Reader.cpp b/src/format/KeePass2Reader.cpp index 0a04c79c6..c213b4a18 100644 --- a/src/format/KeePass2Reader.cpp +++ b/src/format/KeePass2Reader.cpp @@ -30,7 +30,7 @@ BaseKeePass2Reader::BaseKeePass2Reader() : m_error(false) , m_saveXml(false) - , m_irsAlgo(KeePass2::InvalidProtectedStreamAlgo) + , m_irsAlgo(KeePass2::ProtectedStreamAlgo::InvalidProtectedStreamAlgo) { m_errorStr.clear(); m_xmlData.clear(); diff --git a/src/format/KeePass2Writer.h b/src/format/KeePass2Writer.h index 85802eb44..f6ec129f2 100644 --- a/src/format/KeePass2Writer.h +++ b/src/format/KeePass2Writer.h @@ -27,6 +27,8 @@ #include "core/Database.h" #include "format/KeePass2.h" +#define CHECK_RETURN_FALSE(x) if (!(x)) return false; + class BaseKeePass2Writer { public: diff --git a/src/gui/DatabaseSettingsWidget.cpp b/src/gui/DatabaseSettingsWidget.cpp index 0c2eba796..c59f97423 100644 --- a/src/gui/DatabaseSettingsWidget.cpp +++ b/src/gui/DatabaseSettingsWidget.cpp @@ -134,7 +134,7 @@ void DatabaseSettingsWidget::save() { // first perform safety check for KDF rounds auto kdf = KeePass2::uuidToKdf(Uuid(m_uiEncryption->kdfComboBox->currentData().toByteArray())); - if (kdf->uuid() == KeePass2::KDF_ARGON2 and m_uiEncryption->transformRoundsSpinBox->value() > 1000) { + if (kdf->uuid() == KeePass2::KDF_ARGON2 && m_uiEncryption->transformRoundsSpinBox->value() > 1000) { QMessageBox warning; warning.setIcon(QMessageBox::Warning); warning.setWindowTitle(tr("Number of rounds too high")); @@ -147,7 +147,7 @@ void DatabaseSettingsWidget::save() if (warning.clickedButton() != ok) { return; } - } else if (kdf->uuid() == KeePass2::KDF_AES and m_uiEncryption->transformRoundsSpinBox->value() < 100000) { + } else if (kdf->uuid() == KeePass2::KDF_AES && m_uiEncryption->transformRoundsSpinBox->value() < 100000) { QMessageBox warning; warning.setIcon(QMessageBox::Warning); warning.setWindowTitle(tr("Number of rounds too low")); diff --git a/src/streams/HmacBlockStream.cpp b/src/streams/HmacBlockStream.cpp index 677921a60..780db98c1 100644 --- a/src/streams/HmacBlockStream.cpp +++ b/src/streams/HmacBlockStream.cpp @@ -57,10 +57,8 @@ bool HmacBlockStream::reset() // Write final block(s) only if device is writable and we haven't // already written a final block. if (isWritable() && (!m_buffer.isEmpty() || m_blockIndex != 0)) { - if (!m_buffer.isEmpty()) { - if (!writeHashedBlock()) { - return false; - } + if (!m_buffer.isEmpty() && !writeHashedBlock()) { + return false; } // write empty final block @@ -106,15 +104,14 @@ qint64 HmacBlockStream::readData(char* data, qint64 maxSize) if (!readHashedBlock()) { if (m_error) { return -1; - } else { - return maxSize - bytesRemaining; } + return maxSize - bytesRemaining; } } - int bytesToCopy = qMin(bytesRemaining, static_cast<qint64>(m_buffer.size() - m_bufferPos)); + qint64 bytesToCopy = qMin(bytesRemaining, static_cast<qint64>(m_buffer.size() - m_bufferPos)); - memcpy(data + offset, m_buffer.constData() + m_bufferPos, bytesToCopy); + memcpy(data + offset, m_buffer.constData() + m_bufferPos, static_cast<size_t>(bytesToCopy)); offset += bytesToCopy; m_bufferPos += bytesToCopy; @@ -142,7 +139,7 @@ bool HmacBlockStream::readHashedBlock() setErrorString("Invalid block size size."); return false; } - qint32 blockSize = Endian::bytesToSizedInt<qint32>(blockSizeBytes, ByteOrder); + auto blockSize = Endian::bytesToSizedInt<qint32>(blockSizeBytes, ByteOrder); if (blockSize < 0) { m_error = true; setErrorString("Invalid block size."); @@ -169,7 +166,7 @@ bool HmacBlockStream::readHashedBlock() } m_bufferPos = 0; - m_blockIndex++; + ++m_blockIndex; if (blockSize == 0) { m_eof = true; @@ -191,21 +188,18 @@ qint64 HmacBlockStream::writeData(const char* data, qint64 maxSize) qint64 offset = 0; while (bytesRemaining > 0) { - int bytesToCopy = qMin(bytesRemaining, static_cast<qint64>(m_blockSize - m_buffer.size())); + qint64 bytesToCopy = qMin(bytesRemaining, static_cast<qint64>(m_blockSize - m_buffer.size())); - m_buffer.append(data + offset, bytesToCopy); + m_buffer.append(data + offset, static_cast<int>(bytesToCopy)); offset += bytesToCopy; bytesRemaining -= bytesToCopy; - if (m_buffer.size() == m_blockSize) { - if (!writeHashedBlock()) { - if (m_error) { - return -1; - } else { - return maxSize - bytesRemaining; - } + if (m_buffer.size() == m_blockSize && !writeHashedBlock()) { + if (m_error) { + return -1; } + return maxSize - bytesRemaining; } } @@ -242,7 +236,7 @@ bool HmacBlockStream::writeHashedBlock() m_buffer.clear(); } - m_blockIndex++; + ++m_blockIndex; return true; } diff --git a/src/streams/SymmetricCipherStream.cpp b/src/streams/SymmetricCipherStream.cpp index ece2642b5..78476c618 100644 --- a/src/streams/SymmetricCipherStream.cpp +++ b/src/streams/SymmetricCipherStream.cpp @@ -252,7 +252,6 @@ bool SymmetricCipherStream::writeBlock(bool lastBlock) int SymmetricCipherStream::blockSize() const { if (m_streamCipher) { return 1024; - } else { - return m_cipher->blockSize(); } + return m_cipher->blockSize(); } diff --git a/tests/TestKeePass2RandomStream.cpp b/tests/TestKeePass2RandomStream.cpp index bef7af540..53852e82d 100644 --- a/tests/TestKeePass2RandomStream.cpp +++ b/tests/TestKeePass2RandomStream.cpp @@ -58,7 +58,7 @@ void TestKeePass2RandomStream::test() } - KeePass2RandomStream randomStream(KeePass2::Salsa20); + KeePass2RandomStream randomStream(KeePass2::ProtectedStreamAlgo::Salsa20); bool ok; QVERIFY(randomStream.init(key)); QByteArray randomStreamData; diff --git a/tests/gui/TestGui.cpp b/tests/gui/TestGui.cpp index 449f13a06..bf237a854 100644 --- a/tests/gui/TestGui.cpp +++ b/tests/gui/TestGui.cpp @@ -900,11 +900,11 @@ void TestGui::testDatabaseSettings() QWidget* dbSettingsWidget = m_dbWidget->findChild<QWidget*>("databaseSettingsWidget"); QSpinBox* transformRoundsSpinBox = dbSettingsWidget->findChild<QSpinBox*>("transformRoundsSpinBox"); QVERIFY(transformRoundsSpinBox != nullptr); - transformRoundsSpinBox->setValue(100); + transformRoundsSpinBox->setValue(123456); QTest::keyClick(transformRoundsSpinBox, Qt::Key_Enter); // wait for modified timer QTRY_COMPARE(m_tabWidget->tabText(m_tabWidget->currentIndex()), QString("Save*")); - QCOMPARE(m_db->kdf()->rounds(), Q_UINT64_C(100)); + QCOMPARE(m_db->kdf()->rounds(), Q_UINT64_C(123456)); triggerAction("actionDatabaseSave"); QCOMPARE(m_tabWidget->tabText(m_tabWidget->currentIndex()), QString("Save")); From 72a1c65d003789fa9ad6330b8c6e6fe3ccb5eb42 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sun, 7 Jan 2018 00:30:18 +0100 Subject: [PATCH 242/402] Fix memory leaks in tests --- src/format/Kdbx3XmlReader.cpp | 2 +- src/format/Kdbx4Writer.cpp | 32 ++++++++++++++++---------------- tests/gui/TestGui.cpp | 9 ++++++++- tests/gui/TestGui.h | 9 +++++---- 4 files changed, 30 insertions(+), 22 deletions(-) diff --git a/src/format/Kdbx3XmlReader.cpp b/src/format/Kdbx3XmlReader.cpp index 18dd0914d..fdc9cb416 100644 --- a/src/format/Kdbx3XmlReader.cpp +++ b/src/format/Kdbx3XmlReader.cpp @@ -1031,7 +1031,7 @@ Group* Kdbx3XmlReader::getGroup(const Uuid& uuid) if (m_groups.contains(uuid)) { return m_groups.value(uuid); } else { - Group* group = new Group(); + auto group = new Group(); group->setUpdateTimeinfo(false); group->setUuid(uuid); group->setParent(m_tmpParent); diff --git a/src/format/Kdbx4Writer.cpp b/src/format/Kdbx4Writer.cpp index 8b503c73a..fbd590563 100644 --- a/src/format/Kdbx4Writer.cpp +++ b/src/format/Kdbx4Writer.cpp @@ -114,24 +114,25 @@ bool Kdbx4Writer::writeDatabase(QIODevice* device, Database* db) CHECK_RETURN_FALSE(writeData(headerData)); QByteArray headerHash = CryptoHash::hash(headerData, CryptoHash::Sha256); - QScopedPointer<QIODevice> firstLayer, secondLayer; - QByteArray hmacKey = KeePass2::hmacKey(masterSeed, db->transformedMasterKey()); QByteArray headerHmac = CryptoHash::hmac(headerData, HmacBlockStream::getHmacKey(UINT64_MAX, hmacKey), CryptoHash::Sha256); CHECK_RETURN_FALSE(writeData(headerHash)); CHECK_RETURN_FALSE(writeData(headerHmac)); - HmacBlockStream* hmacStream = new HmacBlockStream(device, hmacKey); - if (!hmacStream->open(QIODevice::WriteOnly)) { - raiseError(hmacStream->errorString()); + QScopedPointer<HmacBlockStream> hmacBlockStream; + QScopedPointer<SymmetricCipherStream> cipherStream; + + hmacBlockStream.reset(new HmacBlockStream(device, hmacKey)); + if (!hmacBlockStream->open(QIODevice::WriteOnly)) { + raiseError(hmacBlockStream->errorString()); return false; } - firstLayer.reset(static_cast<QIODevice*>(hmacStream)); - SymmetricCipherStream* cipherStream = new SymmetricCipherStream(hmacStream, algo, - SymmetricCipher::algorithmMode(algo), - SymmetricCipher::Encrypt); + cipherStream.reset(new SymmetricCipherStream(hmacBlockStream.data(), algo, + SymmetricCipher::algorithmMode(algo), + SymmetricCipher::Encrypt)); + if (!cipherStream->init(finalKey, encryptionIV)) { raiseError(cipherStream->errorString()); return false; @@ -140,13 +141,12 @@ bool Kdbx4Writer::writeDatabase(QIODevice* device, Database* db) raiseError(cipherStream->errorString()); return false; } - secondLayer.reset(static_cast<QIODevice*>(cipherStream)); QScopedPointer<QtIOCompressor> ioCompressor; if (db->compressionAlgo() == Database::CompressionNone) { - m_device = secondLayer.data(); + m_device = cipherStream.data(); } else { - ioCompressor.reset(new QtIOCompressor(secondLayer.data())); + ioCompressor.reset(new QtIOCompressor(cipherStream.data())); ioCompressor->setStreamFormat(QtIOCompressor::GzipFormat); if (!ioCompressor->open(QIODevice::WriteOnly)) { raiseError(ioCompressor->errorString()); @@ -191,12 +191,12 @@ bool Kdbx4Writer::writeDatabase(QIODevice* device, Database* db) if (ioCompressor) { ioCompressor->close(); } - if (!secondLayer->reset()) { - raiseError(secondLayer->errorString()); + if (!cipherStream->reset()) { + raiseError(cipherStream->errorString()); return false; } - if (!firstLayer->reset()) { - raiseError(firstLayer->errorString()); + if (!hmacBlockStream->reset()) { + raiseError(hmacBlockStream->errorString()); return false; } diff --git a/tests/gui/TestGui.cpp b/tests/gui/TestGui.cpp index bf237a854..d591165c4 100644 --- a/tests/gui/TestGui.cpp +++ b/tests/gui/TestGui.cpp @@ -117,7 +117,14 @@ void TestGui::cleanup() triggerAction("actionDatabaseClose"); Tools::wait(100); + if (m_db) { + delete m_db; + } m_db = nullptr; + + if (m_dbWidget) { + delete m_dbWidget; + } m_dbWidget = nullptr; } @@ -1060,7 +1067,7 @@ void TestGui::dragAndDropGroup(const QModelIndex& sourceIndex, const QModelIndex QVERIFY(sourceIndex.isValid()); QVERIFY(targetIndex.isValid()); - GroupModel* groupModel = qobject_cast<GroupModel*>(m_dbWidget->findChild<GroupView*>("groupView")->model()); + auto groupModel = qobject_cast<GroupModel*>(m_dbWidget->findChild<GroupView*>("groupView")->model()); QMimeData mimeData; QByteArray encoded; diff --git a/tests/gui/TestGui.h b/tests/gui/TestGui.h index 1a2b24e74..b8d3ce1fc 100644 --- a/tests/gui/TestGui.h +++ b/tests/gui/TestGui.h @@ -23,6 +23,7 @@ #include <QAbstractItemModel> #include <QObject> +#include <QPointer> class Database; class DatabaseTabWidget; @@ -71,14 +72,14 @@ private: void clickIndex(const QModelIndex& index, QAbstractItemView* view, Qt::MouseButton button, Qt::KeyboardModifiers stateKey = 0); - MainWindow* m_mainWindow; - DatabaseTabWidget* m_tabWidget; - DatabaseWidget* m_dbWidget; + QPointer<MainWindow> m_mainWindow; + QPointer<DatabaseTabWidget> m_tabWidget; + QPointer<DatabaseWidget> m_dbWidget; + QPointer<Database> m_db; QByteArray m_dbData; TemporaryFile m_dbFile; QString m_dbFileName; QString m_dbFilePath; - Database* m_db; }; #endif // KEEPASSX_TESTGUI_H From a6ddc22fb8f2bd760dfd8ce3a3d1bf0502d94d0d Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sun, 7 Jan 2018 04:08:32 +0100 Subject: [PATCH 243/402] Refactor database readers/writers and XML handling * Refactor Kdbx*Reader * Refactor KdbxWriter * Refactor KdbxXmlReader * Refactor KdbxXmlWriter --- src/CMakeLists.txt | 8 +- src/cli/Extract.cpp | 2 +- src/format/Kdbx3Reader.cpp | 223 +--- src/format/Kdbx3Reader.h | 44 +- src/format/Kdbx3Writer.cpp | 98 +- src/format/Kdbx3Writer.h | 30 +- src/format/Kdbx3XmlReader.cpp | 1065 ----------------- src/format/Kdbx3XmlReader.h | 102 -- src/format/Kdbx3XmlWriter.cpp | 566 --------- src/format/Kdbx4Reader.cpp | 282 ++--- src/format/Kdbx4Reader.h | 43 +- src/format/Kdbx4Writer.cpp | 160 ++- src/format/Kdbx4Writer.h | 33 +- src/format/Kdbx4XmlReader.h | 102 -- src/format/KdbxReader.cpp | 267 +++++ src/format/KdbxReader.h | 107 ++ src/format/KdbxWriter.cpp | 74 ++ src/format/KdbxWriter.h | 90 ++ .../{Kdbx4XmlReader.cpp => KdbxXmlReader.cpp} | 264 ++-- src/format/KdbxXmlReader.h | 120 ++ .../{Kdbx4XmlWriter.cpp => KdbxXmlWriter.cpp} | 118 +- .../{Kdbx4XmlWriter.h => KdbxXmlWriter.h} | 28 +- src/format/KeePass2Reader.cpp | 132 +- src/format/KeePass2Reader.h | 66 +- src/format/KeePass2Repair.cpp | 18 +- src/format/KeePass2Writer.cpp | 106 +- src/format/KeePass2Writer.h | 54 +- tests/TestDeletedObjects.cpp | 5 +- tests/TestKeePass2XmlReader.cpp | 23 +- 29 files changed, 1313 insertions(+), 2917 deletions(-) delete mode 100644 src/format/Kdbx3XmlReader.cpp delete mode 100644 src/format/Kdbx3XmlReader.h delete mode 100644 src/format/Kdbx3XmlWriter.cpp delete mode 100644 src/format/Kdbx4XmlReader.h create mode 100644 src/format/KdbxReader.cpp create mode 100644 src/format/KdbxReader.h create mode 100644 src/format/KdbxWriter.cpp create mode 100644 src/format/KdbxWriter.h rename src/format/{Kdbx4XmlReader.cpp => KdbxXmlReader.cpp} (82%) create mode 100644 src/format/KdbxXmlReader.h rename src/format/{Kdbx4XmlWriter.cpp => KdbxXmlWriter.cpp} (82%) rename src/format/{Kdbx4XmlWriter.h => KdbxXmlWriter.h} (88%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6ab5308dc..b007f0f93 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -85,16 +85,16 @@ set(keepassx_SOURCES format/KeePass2.cpp format/KeePass2RandomStream.cpp format/KeePass2Repair.cpp + format/KdbxReader.cpp + format/KdbxWriter.cpp + format/KdbxXmlReader.cpp format/KeePass2Reader.cpp format/KeePass2Writer.cpp format/Kdbx3Reader.cpp format/Kdbx3Writer.cpp - format/Kdbx3XmlReader.cpp - format/Kdbx3XmlWriter.cpp format/Kdbx4Reader.cpp format/Kdbx4Writer.cpp - format/Kdbx4XmlReader.cpp - format/Kdbx4XmlWriter.cpp + format/KdbxXmlWriter.cpp gui/AboutDialog.cpp gui/Application.cpp gui/CategoryListWidget.cpp diff --git a/src/cli/Extract.cpp b/src/cli/Extract.cpp index 73879f67d..54c8a45ee 100644 --- a/src/cli/Extract.cpp +++ b/src/cli/Extract.cpp @@ -101,7 +101,7 @@ int Extract::execute(QStringList arguments) Database* db = reader.readDatabase(&dbFile, compositeKey); delete db; - QByteArray xmlData = reader.xmlData(); + QByteArray xmlData = reader.reader()->xmlData(); if (reader.hasError()) { if (xmlData.isEmpty()) { diff --git a/src/format/Kdbx3Reader.cpp b/src/format/Kdbx3Reader.cpp index 5fb72a23e..638f84063 100644 --- a/src/format/Kdbx3Reader.cpp +++ b/src/format/Kdbx3Reader.cpp @@ -18,81 +18,21 @@ #include "Kdbx3Reader.h" -#include <QBuffer> -#include <QFile> -#include <QIODevice> - -#include "core/Database.h" +#include "core/Group.h" #include "core/Endian.h" #include "crypto/CryptoHash.h" -#include "crypto/kdf/AesKdf.h" -#include "format/KeePass1.h" -#include "format/KeePass2.h" #include "format/KeePass2RandomStream.h" -#include "format/Kdbx3XmlReader.h" +#include "format/KdbxXmlReader.h" #include "streams/HashedBlockStream.h" #include "streams/QtIOCompressor" -#include "streams/StoreDataStream.h" #include "streams/SymmetricCipherStream.h" -Kdbx3Reader::Kdbx3Reader() - : m_device(nullptr) - , m_headerStream(nullptr) - , m_headerEnd(false) - , m_db(nullptr) +#include <QBuffer> + +Database* Kdbx3Reader::readDatabaseImpl(QIODevice* device, const QByteArray& headerData, + const CompositeKey& key, bool keepDatabase) { -} - -Database* Kdbx3Reader::readDatabase(QIODevice* device, const CompositeKey& key, bool keepDatabase) -{ - QScopedPointer<Database> db(new Database()); - m_db = db.data(); - m_device = device; - m_error = false; - m_errorStr.clear(); - m_headerEnd = false; - m_xmlData.clear(); - m_masterSeed.clear(); - m_encryptionIV.clear(); - m_streamStartBytes.clear(); - m_protectedStreamKey.clear(); - - StoreDataStream headerStream(m_device); - headerStream.open(QIODevice::ReadOnly); - m_headerStream = &headerStream; - - bool ok; - - quint32 signature1 = Endian::readSizedInt<quint32>(m_headerStream, KeePass2::BYTEORDER, &ok); - if (!ok || signature1 != KeePass2::SIGNATURE_1) { - raiseError(tr("Not a KeePass database.")); - return nullptr; - } - - quint32 signature2 = Endian::readSizedInt<quint32>(m_headerStream, KeePass2::BYTEORDER, &ok); - if (ok && signature2 == KeePass1::SIGNATURE_2) { - raiseError(tr("The selected file is an old KeePass 1 database (.kdb).\n\n" - "You can import it by clicking on Database > 'Import KeePass 1 database...'.\n" - "This is a one-way migration. You won't be able to open the imported " - "database with the old KeePassX 0.4 version.")); - return nullptr; - } else if (!ok || signature2 != KeePass2::SIGNATURE_2) { - raiseError(tr("Not a KeePass database.")); - return nullptr; - } - - quint32 version = Endian::readSizedInt<quint32>(m_headerStream, KeePass2::BYTEORDER, &ok) - & KeePass2::FILE_VERSION_CRITICAL_MASK; - quint32 maxVersion = KeePass2::FILE_VERSION_3 & KeePass2::FILE_VERSION_CRITICAL_MASK; - if (!ok || (version < KeePass2::FILE_VERSION_MIN) || (version > maxVersion)) { - raiseError(tr("Unsupported KeePass KDBX 2 or 3 database version.")); - return nullptr; - } - - while (readHeaderField() && !hasError()) { - } - - headerStream.close(); + Q_ASSERT(m_kdbxVersion <= KeePass2::FILE_VERSION_3); if (hasError()) { return nullptr; @@ -111,7 +51,7 @@ Database* Kdbx3Reader::readDatabase(QIODevice* device, const CompositeKey& key, return nullptr; } - if (m_db->challengeMasterSeed(m_masterSeed) == false) { + if (!m_db->challengeMasterSeed(m_masterSeed)) { raiseError(tr("Unable to issue challenge-response.")); return nullptr; } @@ -123,7 +63,7 @@ Database* Kdbx3Reader::readDatabase(QIODevice* device, const CompositeKey& key, QByteArray finalKey = hash.result(); SymmetricCipher::Algorithm cipher = SymmetricCipher::cipherToAlgorithm(m_db->cipher()); - SymmetricCipherStream cipherStream(m_device, cipher, + SymmetricCipherStream cipherStream(device, cipher, SymmetricCipher::algorithmMode(cipher), SymmetricCipher::Decrypt); if (!cipherStream.init(finalKey, m_encryptionIV)) { raiseError(cipherStream.errorString()); @@ -147,7 +87,7 @@ Database* Kdbx3Reader::readDatabase(QIODevice* device, const CompositeKey& key, return nullptr; } - QIODevice* xmlDevice; + QIODevice* xmlDevice = nullptr; QScopedPointer<QtIOCompressor> ioCompressor; if (m_db->compressionAlgo() == Database::CompressionNone) { @@ -168,43 +108,43 @@ Database* Kdbx3Reader::readDatabase(QIODevice* device, const CompositeKey& key, return nullptr; } - QScopedPointer<QBuffer> buffer; - - if (m_saveXml) { + QBuffer buffer; + if (saveXml()) { m_xmlData = xmlDevice->readAll(); - buffer.reset(new QBuffer(&m_xmlData)); - buffer->open(QIODevice::ReadOnly); - xmlDevice = buffer.data(); + buffer.setBuffer(&m_xmlData); + buffer.open(QIODevice::ReadOnly); + xmlDevice = &buffer; } - Kdbx3XmlReader xmlReader; - xmlReader.readDatabase(xmlDevice, m_db, &randomStream); + Q_ASSERT(xmlDevice); + + KdbxXmlReader xmlReader(KeePass2::FILE_VERSION_3); + xmlReader.readDatabase(xmlDevice, m_db.data(), &randomStream); if (xmlReader.hasError()) { raiseError(xmlReader.errorString()); if (keepDatabase) { - return db.take(); - } else { - return nullptr; + return m_db.take(); } + return nullptr; } - Q_ASSERT(version < 0x00030001 || !xmlReader.headerHash().isEmpty()); + Q_ASSERT(!xmlReader.headerHash().isEmpty() || m_kdbxVersion < KeePass2::FILE_VERSION_3); if (!xmlReader.headerHash().isEmpty()) { - QByteArray headerHash = CryptoHash::hash(headerStream.storedData(), CryptoHash::Sha256); + QByteArray headerHash = CryptoHash::hash(headerData, CryptoHash::Sha256); if (headerHash != xmlReader.headerHash()) { raiseError("Header doesn't match hash"); return nullptr; } } - return db.take(); + return m_db.take(); } -bool Kdbx3Reader::readHeaderField() +bool Kdbx3Reader::readHeaderField(StoreDataStream& headerStream) { - QByteArray fieldIDArray = m_headerStream->read(1); + QByteArray fieldIDArray = headerStream.read(1); if (fieldIDArray.size() != 1) { raiseError("Invalid header id size"); return false; @@ -212,7 +152,7 @@ bool Kdbx3Reader::readHeaderField() char fieldID = fieldIDArray.at(0); bool ok; - auto fieldLen = Endian::readSizedInt<quint16>(m_headerStream, KeePass2::BYTEORDER, &ok); + auto fieldLen = Endian::readSizedInt<quint16>(&headerStream, KeePass2::BYTEORDER, &ok); if (!ok) { raiseError("Invalid header field length"); return false; @@ -220,16 +160,17 @@ bool Kdbx3Reader::readHeaderField() QByteArray fieldData; if (fieldLen != 0) { - fieldData = m_headerStream->read(fieldLen); + fieldData = headerStream.read(fieldLen); if (fieldData.size() != fieldLen) { raiseError("Invalid header data length"); return false; } } + bool headerEnd = false; switch (static_cast<KeePass2::HeaderFieldID>(fieldID)) { case KeePass2::HeaderFieldID::EndOfHeader: - m_headerEnd = true; + headerEnd = true; break; case KeePass2::HeaderFieldID::CipherID: @@ -273,107 +214,5 @@ bool Kdbx3Reader::readHeaderField() break; } - return !m_headerEnd; -} - -void Kdbx3Reader::setCipher(const QByteArray& data) -{ - if (data.size() != Uuid::Length) { - raiseError("Invalid cipher uuid length"); - return; - } - - Uuid uuid(data); - - if (SymmetricCipher::cipherToAlgorithm(uuid) == SymmetricCipher::InvalidAlgorithm) { - raiseError("Unsupported cipher"); - return; - } - m_db->setCipher(uuid); -} - -void Kdbx3Reader::setCompressionFlags(const QByteArray& data) -{ - if (data.size() != 4) { - raiseError("Invalid compression flags length"); - return; - } - auto id = Endian::bytesToSizedInt<quint32>(data, KeePass2::BYTEORDER); - - if (id > Database::CompressionAlgorithmMax) { - raiseError("Unsupported compression algorithm"); - return; - } - m_db->setCompressionAlgo(static_cast<Database::CompressionAlgorithm>(id)); -} - -void Kdbx3Reader::setMasterSeed(const QByteArray& data) -{ - if (data.size() != 32) { - raiseError("Invalid master seed size"); - return; - } - m_masterSeed = data; -} - -void Kdbx3Reader::setTransformSeed(const QByteArray& data) -{ - if (data.size() != 32) { - raiseError("Invalid transform seed size"); - return; - } - - auto kdf = m_db->kdf(); - if (!kdf.isNull()) { - kdf->setSeed(data); - } -} - -void Kdbx3Reader::setTransformRounds(const QByteArray& data) -{ - if (data.size() != 8) { - raiseError("Invalid transform rounds size"); - return; - } - - auto rounds = Endian::bytesToSizedInt<quint64>(data, KeePass2::BYTEORDER); - auto kdf = m_db->kdf(); - if (!kdf.isNull()) { - kdf->setRounds(rounds); - } -} - -void Kdbx3Reader::setEncryptionIV(const QByteArray& data) -{ - m_encryptionIV = data; -} - -void Kdbx3Reader::setProtectedStreamKey(const QByteArray& data) -{ - m_protectedStreamKey = data; -} - -void Kdbx3Reader::setStreamStartBytes(const QByteArray& data) -{ - if (data.size() != 32) { - raiseError("Invalid start bytes size"); - return; - } - m_streamStartBytes = data; -} - -void Kdbx3Reader::setInnerRandomStreamID(const QByteArray& data) -{ - if (data.size() != 4) { - raiseError("Invalid random stream id size"); - return; - } - quint32 id = Endian::bytesToSizedInt<quint32>(data, KeePass2::BYTEORDER); - KeePass2::ProtectedStreamAlgo irsAlgo = KeePass2::idToProtectedStreamAlgo(id); - if (irsAlgo == KeePass2::ProtectedStreamAlgo::InvalidProtectedStreamAlgo || - irsAlgo == KeePass2::ProtectedStreamAlgo::ArcFourVariant) { - raiseError("Invalid inner random stream cipher"); - return; - } - m_irsAlgo = irsAlgo; + return !headerEnd; } diff --git a/src/format/Kdbx3Reader.h b/src/format/Kdbx3Reader.h index 024189eda..bd6a794d1 100644 --- a/src/format/Kdbx3Reader.h +++ b/src/format/Kdbx3Reader.h @@ -19,45 +19,19 @@ #ifndef KEEPASSX_KDBX3READER_H #define KEEPASSX_KDBX3READER_H -#include <QCoreApplication> +#include "format/KdbxReader.h" -#include "format/KeePass2Reader.h" -#include "keys/CompositeKey.h" - -class Database; -class QIODevice; - -class Kdbx3Reader: public BaseKeePass2Reader +/** + * KDBX 2/3 reader implementation. + */ +class Kdbx3Reader: public KdbxReader { -Q_DECLARE_TR_FUNCTIONS(Kdbx3Reader) - public: - Kdbx3Reader(); + Database* readDatabaseImpl(QIODevice* device, const QByteArray& headerData, + const CompositeKey& key, bool keepDatabase) override; - using BaseKeePass2Reader::readDatabase; - virtual Database* readDatabase(QIODevice* device, const CompositeKey& key, bool keepDatabase = false) override; - -private: - bool readHeaderField(); - - void setCipher(const QByteArray& data); - void setCompressionFlags(const QByteArray& data); - void setMasterSeed(const QByteArray& data); - void setTransformSeed(const QByteArray& data); - void setTransformRounds(const QByteArray& data); - void setEncryptionIV(const QByteArray& data); - void setProtectedStreamKey(const QByteArray& data); - void setStreamStartBytes(const QByteArray& data); - void setInnerRandomStreamID(const QByteArray& data); - - QIODevice* m_device; - QIODevice* m_headerStream; - bool m_headerEnd; - - Database* m_db; - QByteArray m_masterSeed; - QByteArray m_encryptionIV; - QByteArray m_streamStartBytes; +protected: + bool readHeaderField(StoreDataStream& headerStream) override; }; #endif // KEEPASSX_KDBX3READER_H diff --git a/src/format/Kdbx3Writer.cpp b/src/format/Kdbx3Writer.cpp index ca02fb7ac..b0b44c6b2 100644 --- a/src/format/Kdbx3Writer.cpp +++ b/src/format/Kdbx3Writer.cpp @@ -19,25 +19,17 @@ #include "Kdbx3Writer.h" #include <QBuffer> -#include <QFile> -#include <QIODevice> #include "core/Database.h" -#include "core/Endian.h" #include "crypto/CryptoHash.h" -#include "crypto/kdf/AesKdf.h" #include "crypto/Random.h" +#include "format/KeePass2.h" #include "format/KeePass2RandomStream.h" -#include "format/Kdbx3XmlWriter.h" +#include "format/KdbxXmlWriter.h" #include "streams/HashedBlockStream.h" #include "streams/QtIOCompressor" #include "streams/SymmetricCipherStream.h" -Kdbx3Writer::Kdbx3Writer() - : m_device(0) -{ -} - bool Kdbx3Writer::writeDatabase(QIODevice* device, Database* db) { m_error = false; @@ -59,6 +51,7 @@ bool Kdbx3Writer::writeDatabase(QIODevice* device, Database* db) return false; } + // generate transformed master key CryptoHash hash(CryptoHash::Sha256); hash.addData(masterSeed); hash.addData(db->challengeResponseKey()); @@ -66,37 +59,39 @@ bool Kdbx3Writer::writeDatabase(QIODevice* device, Database* db) hash.addData(db->transformedMasterKey()); QByteArray finalKey = hash.result(); + // write header QBuffer header; header.open(QIODevice::WriteOnly); - m_device = &header; - CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes<qint32>(KeePass2::SIGNATURE_1, KeePass2::BYTEORDER))); - CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes<qint32>(KeePass2::SIGNATURE_2, KeePass2::BYTEORDER))); - CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes<qint32>(KeePass2::FILE_VERSION_3, KeePass2::BYTEORDER))); + writeMagicNumbers(&header, KeePass2::SIGNATURE_1, KeePass2::SIGNATURE_2, KeePass2::FILE_VERSION_3); - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::CipherID, db->cipher().toByteArray())); - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::CompressionFlags, - Endian::sizedIntToBytes<qint32>(db->compressionAlgo(), - KeePass2::BYTEORDER))); + CHECK_RETURN_FALSE(writeHeaderField<quint16>(&header, KeePass2::HeaderFieldID::CipherID, db->cipher().toByteArray())); + CHECK_RETURN_FALSE(writeHeaderField<quint16>(&header, KeePass2::HeaderFieldID::CompressionFlags, + Endian::sizedIntToBytes<qint32>(db->compressionAlgo(), + KeePass2::BYTEORDER))); auto kdf = db->kdf(); - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::MasterSeed, masterSeed)); - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::TransformSeed, kdf->seed())); - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::TransformRounds, - Endian::sizedIntToBytes<qint64>(kdf->rounds(), + CHECK_RETURN_FALSE(writeHeaderField<quint16>(&header, KeePass2::HeaderFieldID::MasterSeed, masterSeed)); + CHECK_RETURN_FALSE(writeHeaderField<quint16>(&header, KeePass2::HeaderFieldID::TransformSeed, kdf->seed())); + CHECK_RETURN_FALSE(writeHeaderField<quint16>(&header, KeePass2::HeaderFieldID::TransformRounds, + Endian::sizedIntToBytes<qint64>(kdf->rounds(), + KeePass2::BYTEORDER))); + CHECK_RETURN_FALSE(writeHeaderField<quint16>(&header, KeePass2::HeaderFieldID::EncryptionIV, encryptionIV)); + CHECK_RETURN_FALSE(writeHeaderField<quint16>(&header, KeePass2::HeaderFieldID::ProtectedStreamKey, protectedStreamKey)); + CHECK_RETURN_FALSE(writeHeaderField<quint16>(&header, KeePass2::HeaderFieldID::StreamStartBytes, startBytes)); + CHECK_RETURN_FALSE(writeHeaderField<quint16>(&header, KeePass2::HeaderFieldID::InnerRandomStreamID, + Endian::sizedIntToBytes<qint32>(static_cast<qint32>( + KeePass2::ProtectedStreamAlgo::Salsa20), KeePass2::BYTEORDER))); - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::EncryptionIV, encryptionIV)); - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::ProtectedStreamKey, protectedStreamKey)); - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::StreamStartBytes, startBytes)); - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::InnerRandomStreamID, - Endian::sizedIntToBytes<qint32>(static_cast<qint32>(KeePass2::ProtectedStreamAlgo::Salsa20), - KeePass2::BYTEORDER))); - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::EndOfHeader, endOfHeader)); - + CHECK_RETURN_FALSE(writeHeaderField<quint16>(&header, KeePass2::HeaderFieldID::EndOfHeader, endOfHeader)); header.close(); - m_device = device; - QByteArray headerHash = CryptoHash::hash(header.data(), CryptoHash::Sha256); - CHECK_RETURN_FALSE(writeData(header.data())); + // write header data + CHECK_RETURN_FALSE(writeData(device, header.data())); + + // hash header + const QByteArray headerHash = CryptoHash::hash(header.data(), CryptoHash::Sha256); + + // write cipher stream SymmetricCipher::Algorithm algo = SymmetricCipher::cipherToAlgorithm(db->cipher()); SymmetricCipherStream cipherStream(device, algo, SymmetricCipher::algorithmMode(algo), SymmetricCipher::Encrypt); @@ -105,8 +100,7 @@ bool Kdbx3Writer::writeDatabase(QIODevice* device, Database* db) raiseError(cipherStream.errorString()); return false; } - m_device = &cipherStream; - CHECK_RETURN_FALSE(writeData(startBytes)); + CHECK_RETURN_FALSE(writeData(&cipherStream, startBytes)); HashedBlockStream hashedStream(&cipherStream); if (!hashedStream.open(QIODevice::WriteOnly)) { @@ -114,10 +108,11 @@ bool Kdbx3Writer::writeDatabase(QIODevice* device, Database* db) return false; } + QIODevice* outputDevice = nullptr; QScopedPointer<QtIOCompressor> ioCompressor; if (db->compressionAlgo() == Database::CompressionNone) { - m_device = &hashedStream; + outputDevice = &hashedStream; } else { ioCompressor.reset(new QtIOCompressor(&hashedStream)); ioCompressor->setStreamFormat(QtIOCompressor::GzipFormat); @@ -125,17 +120,19 @@ bool Kdbx3Writer::writeDatabase(QIODevice* device, Database* db) raiseError(ioCompressor->errorString()); return false; } - m_device = ioCompressor.data(); + outputDevice = ioCompressor.data(); } + Q_ASSERT(outputDevice); + KeePass2RandomStream randomStream(KeePass2::ProtectedStreamAlgo::Salsa20); if (!randomStream.init(protectedStreamKey)) { raiseError(randomStream.errorString()); return false; } - Kdbx3XmlWriter xmlWriter; - xmlWriter.writeDatabase(m_device, db, &randomStream, headerHash); + KdbxXmlWriter xmlWriter(KeePass2::FILE_VERSION_3); + xmlWriter.writeDatabase(outputDevice, db, &randomStream, headerHash); // Explicitly close/reset streams so they are flushed and we can detect // errors. QIODevice::close() resets errorString() etc. @@ -153,31 +150,8 @@ bool Kdbx3Writer::writeDatabase(QIODevice* device, Database* db) if (xmlWriter.hasError()) { raiseError(xmlWriter.errorString()); - } - - return true; -} - -bool Kdbx3Writer::writeData(const QByteArray& data) -{ - if (m_device->write(data) != data.size()) { - raiseError(m_device->errorString()); return false; - } else { - return true; } -} - -bool Kdbx3Writer::writeHeaderField(KeePass2::HeaderFieldID fieldId, const QByteArray& data) -{ - Q_ASSERT(data.size() <= 65535); - - QByteArray fieldIdArr; - fieldIdArr[0] = static_cast<char>(fieldId); - CHECK_RETURN_FALSE(writeData(fieldIdArr)); - CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes<qint16>(static_cast<quint16>(data.size()), - KeePass2::BYTEORDER))); - CHECK_RETURN_FALSE(writeData(data)); return true; } diff --git a/src/format/Kdbx3Writer.h b/src/format/Kdbx3Writer.h index 1b9fe7563..88c4d16a4 100644 --- a/src/format/Kdbx3Writer.h +++ b/src/format/Kdbx3Writer.h @@ -1,6 +1,5 @@ /* - * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> - * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> + * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,30 +18,15 @@ #ifndef KEEPASSX_KDBX3WRITER_H #define KEEPASSX_KDBX3WRITER_H -#include <QCoreApplication> +#include "KdbxWriter.h" -#include "format/KeePass2.h" -#include "format/KeePass2Writer.h" -#include "keys/CompositeKey.h" - -class Database; -class QIODevice; - -class Kdbx3Writer: public BaseKeePass2Writer +/** + * KDBX2/3 writer implementation. + */ +class Kdbx3Writer: public KdbxWriter { -Q_DECLARE_TR_FUNCTIONS(Kdbx3Writer) - public: - Kdbx3Writer(); - - using BaseKeePass2Writer::writeDatabase; - bool writeDatabase(QIODevice* device, Database* db); - -private: - bool writeData(const QByteArray& data); - bool writeHeaderField(KeePass2::HeaderFieldID fieldId, const QByteArray& data); - - QIODevice* m_device; + bool writeDatabase(QIODevice* device, Database* db) override; }; #endif // KEEPASSX_KDBX3WRITER_H diff --git a/src/format/Kdbx3XmlReader.cpp b/src/format/Kdbx3XmlReader.cpp deleted file mode 100644 index fdc9cb416..000000000 --- a/src/format/Kdbx3XmlReader.cpp +++ /dev/null @@ -1,1065 +0,0 @@ -/* - * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> - * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 or (at your option) - * version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "Kdbx3XmlReader.h" - -#include <QBuffer> -#include <QFile> - -#include "core/Database.h" -#include "core/DatabaseIcons.h" -#include "core/Group.h" -#include "core/Metadata.h" -#include "core/Tools.h" -#include "format/KeePass2RandomStream.h" -#include "streams/QtIOCompressor" - -typedef QPair<QString, QString> StringPair; - -Kdbx3XmlReader::Kdbx3XmlReader() - : m_randomStream(nullptr) - , m_db(nullptr) - , m_meta(nullptr) - , m_tmpParent(nullptr) - , m_error(false) - , m_strictMode(false) -{ -} - -void Kdbx3XmlReader::setStrictMode(bool strictMode) -{ - m_strictMode = strictMode; -} - -void Kdbx3XmlReader::readDatabase(QIODevice* device, Database* db, KeePass2RandomStream* randomStream) -{ - m_error = false; - m_errorStr.clear(); - - m_xml.clear(); - m_xml.setDevice(device); - - m_db = db; - m_meta = m_db->metadata(); - m_meta->setUpdateDatetime(false); - - m_randomStream = randomStream; - m_headerHash.clear(); - - m_tmpParent = new Group(); - - bool rootGroupParsed = false; - - if (!m_xml.error() && m_xml.readNextStartElement()) { - if (m_xml.name() == "KeePassFile") { - rootGroupParsed = parseKeePassFile(); - } - } - - if (!m_xml.error() && !rootGroupParsed) { - raiseError("No root group"); - } - - if (!m_xml.error()) { - if (!m_tmpParent->children().isEmpty()) { - qWarning("Kdbx3XmlReader::readDatabase: found %d invalid group reference(s)", - m_tmpParent->children().size()); - } - - if (!m_tmpParent->entries().isEmpty()) { - qWarning("Kdbx3XmlReader::readDatabase: found %d invalid entry reference(s)", - m_tmpParent->children().size()); - } - } - - const QSet<QString> poolKeys = m_binaryPool.keys().toSet(); - const QSet<QString> entryKeys = m_binaryMap.keys().toSet(); - const QSet<QString> unmappedKeys = entryKeys - poolKeys; - const QSet<QString> unusedKeys = poolKeys - entryKeys; - - if (!unmappedKeys.isEmpty()) { - raiseError("Unmapped keys left."); - } - - if (!m_xml.error()) { - for (const QString& key : unusedKeys) { - qWarning("Kdbx3XmlReader::readDatabase: found unused key \"%s\"", qPrintable(key)); - } - } - - QHash<QString, QPair<Entry*, QString> >::const_iterator i; - for (i = m_binaryMap.constBegin(); i != m_binaryMap.constEnd(); ++i) { - const QPair<Entry*, QString>& target = i.value(); - target.first->attachments()->set(target.second, m_binaryPool[i.key()]); - } - - m_meta->setUpdateDatetime(true); - - QHash<Uuid, Group*>::const_iterator iGroup; - for (iGroup = m_groups.constBegin(); iGroup != m_groups.constEnd(); ++iGroup) { - iGroup.value()->setUpdateTimeinfo(true); - } - - QHash<Uuid, Entry*>::const_iterator iEntry; - for (iEntry = m_entries.constBegin(); iEntry != m_entries.constEnd(); ++iEntry) { - iEntry.value()->setUpdateTimeinfo(true); - - const QList<Entry*> historyItems = iEntry.value()->historyItems(); - for (Entry* histEntry : historyItems) { - histEntry->setUpdateTimeinfo(true); - } - } - - delete m_tmpParent; -} - -Database* Kdbx3XmlReader::readDatabase(QIODevice* device) -{ - Database* db = new Database(); - readDatabase(device, db); - return db; -} - -Database* Kdbx3XmlReader::readDatabase(const QString& filename) -{ - QFile file(filename); - file.open(QIODevice::ReadOnly); - return readDatabase(&file); -} - -bool Kdbx3XmlReader::hasError() -{ - return m_error || m_xml.hasError(); -} - -QString Kdbx3XmlReader::errorString() -{ - if (m_error) { - return m_errorStr; - } else if (m_xml.hasError()) { - return QString("XML error:\n%1\nLine %2, column %3") - .arg(m_xml.errorString()) - .arg(m_xml.lineNumber()) - .arg(m_xml.columnNumber()); - } else { - return QString(); - } -} - -void Kdbx3XmlReader::raiseError(const QString& errorMessage) -{ - m_error = true; - m_errorStr = errorMessage; -} - -QByteArray Kdbx3XmlReader::headerHash() -{ - return m_headerHash; -} - -bool Kdbx3XmlReader::parseKeePassFile() -{ - Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "KeePassFile"); - - bool rootElementFound = false; - bool rootParsedSuccessfully = false; - - while (!m_xml.error() && m_xml.readNextStartElement()) { - if (m_xml.name() == "Meta") { - parseMeta(); - } else if (m_xml.name() == "Root") { - if (rootElementFound) { - rootParsedSuccessfully = false; - raiseError("Multiple root elements"); - } else { - rootParsedSuccessfully = parseRoot(); - rootElementFound = true; - } - } else { - skipCurrentElement(); - } - } - - return rootParsedSuccessfully; -} - -void Kdbx3XmlReader::parseMeta() -{ - Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Meta"); - - while (!m_xml.error() && m_xml.readNextStartElement()) { - if (m_xml.name() == "Generator") { - m_meta->setGenerator(readString()); - } else if (m_xml.name() == "HeaderHash") { - m_headerHash = readBinary(); - } else if (m_xml.name() == "DatabaseName") { - m_meta->setName(readString()); - } else if (m_xml.name() == "DatabaseNameChanged") { - m_meta->setNameChanged(readDateTime()); - } else if (m_xml.name() == "DatabaseDescription") { - m_meta->setDescription(readString()); - } else if (m_xml.name() == "DatabaseDescriptionChanged") { - m_meta->setDescriptionChanged(readDateTime()); - } else if (m_xml.name() == "DefaultUserName") { - m_meta->setDefaultUserName(readString()); - } else if (m_xml.name() == "DefaultUserNameChanged") { - m_meta->setDefaultUserNameChanged(readDateTime()); - } else if (m_xml.name() == "MaintenanceHistoryDays") { - m_meta->setMaintenanceHistoryDays(readNumber()); - } else if (m_xml.name() == "Color") { - m_meta->setColor(readColor()); - } else if (m_xml.name() == "MasterKeyChanged") { - m_meta->setMasterKeyChanged(readDateTime()); - } else if (m_xml.name() == "MasterKeyChangeRec") { - m_meta->setMasterKeyChangeRec(readNumber()); - } else if (m_xml.name() == "MasterKeyChangeForce") { - m_meta->setMasterKeyChangeForce(readNumber()); - } else if (m_xml.name() == "MemoryProtection") { - parseMemoryProtection(); - } else if (m_xml.name() == "CustomIcons") { - parseCustomIcons(); - } else if (m_xml.name() == "RecycleBinEnabled") { - m_meta->setRecycleBinEnabled(readBool()); - } else if (m_xml.name() == "RecycleBinUUID") { - m_meta->setRecycleBin(getGroup(readUuid())); - } else if (m_xml.name() == "RecycleBinChanged") { - m_meta->setRecycleBinChanged(readDateTime()); - } else if (m_xml.name() == "EntryTemplatesGroup") { - m_meta->setEntryTemplatesGroup(getGroup(readUuid())); - } else if (m_xml.name() == "EntryTemplatesGroupChanged") { - m_meta->setEntryTemplatesGroupChanged(readDateTime()); - } else if (m_xml.name() == "LastSelectedGroup") { - m_meta->setLastSelectedGroup(getGroup(readUuid())); - } else if (m_xml.name() == "LastTopVisibleGroup") { - m_meta->setLastTopVisibleGroup(getGroup(readUuid())); - } else if (m_xml.name() == "HistoryMaxItems") { - int value = readNumber(); - if (value >= -1) { - m_meta->setHistoryMaxItems(value); - } else { - raiseError("HistoryMaxItems invalid number"); - } - } else if (m_xml.name() == "HistoryMaxSize") { - int value = readNumber(); - if (value >= -1) { - m_meta->setHistoryMaxSize(value); - } else { - raiseError("HistoryMaxSize invalid number"); - } - } else if (m_xml.name() == "Binaries") { - parseBinaries(); - } else if (m_xml.name() == "CustomData") { - parseCustomData(); - } else { - skipCurrentElement(); - } - } -} - -void Kdbx3XmlReader::parseMemoryProtection() -{ - Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "MemoryProtection"); - - while (!m_xml.error() && m_xml.readNextStartElement()) { - if (m_xml.name() == "ProtectTitle") { - m_meta->setProtectTitle(readBool()); - } else if (m_xml.name() == "ProtectUserName") { - m_meta->setProtectUsername(readBool()); - } else if (m_xml.name() == "ProtectPassword") { - m_meta->setProtectPassword(readBool()); - } else if (m_xml.name() == "ProtectURL") { - m_meta->setProtectUrl(readBool()); - } else if (m_xml.name() == "ProtectNotes") { - m_meta->setProtectNotes(readBool()); - } else { - skipCurrentElement(); - } - } -} - -void Kdbx3XmlReader::parseCustomIcons() -{ - Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "CustomIcons"); - - while (!m_xml.error() && m_xml.readNextStartElement()) { - if (m_xml.name() == "Icon") { - parseIcon(); - } else { - skipCurrentElement(); - } - } -} - -void Kdbx3XmlReader::parseIcon() -{ - Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Icon"); - - Uuid uuid; - QImage icon; - bool uuidSet = false; - bool iconSet = false; - - while (!m_xml.error() && m_xml.readNextStartElement()) { - if (m_xml.name() == "UUID") { - uuid = readUuid(); - uuidSet = !uuid.isNull(); - } else if (m_xml.name() == "Data") { - icon.loadFromData(readBinary()); - iconSet = true; - } else { - skipCurrentElement(); - } - } - - if (uuidSet && iconSet) { - m_meta->addCustomIcon(uuid, icon); - } else { - raiseError("Missing icon uuid or data"); - } -} - -void Kdbx3XmlReader::parseBinaries() -{ - Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Binaries"); - - while (!m_xml.error() && m_xml.readNextStartElement()) { - if (m_xml.name() == "Binary") { - QXmlStreamAttributes attr = m_xml.attributes(); - - QString id = attr.value("ID").toString(); - - QByteArray data; - if (attr.value("Compressed").compare(QLatin1String("True"), Qt::CaseInsensitive) == 0) { - data = readCompressedBinary(); - } else { - data = readBinary(); - } - - if (m_binaryPool.contains(id)) { - qWarning("Kdbx3XmlReader::parseBinaries: overwriting binary item \"%s\"", - qPrintable(id)); - } - - m_binaryPool.insert(id, data); - } else { - skipCurrentElement(); - } - } -} - -void Kdbx3XmlReader::parseCustomData() -{ - Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "CustomData"); - - while (!m_xml.error() && m_xml.readNextStartElement()) { - if (m_xml.name() == "Item") { - parseCustomDataItem(); - } else { - skipCurrentElement(); - } - } -} - -void Kdbx3XmlReader::parseCustomDataItem() -{ - Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Item"); - - QString key; - QString value; - bool keySet = false; - bool valueSet = false; - - while (!m_xml.error() && m_xml.readNextStartElement()) { - if (m_xml.name() == "Key") { - key = readString(); - keySet = true; - } else if (m_xml.name() == "Value") { - value = readString(); - valueSet = true; - } else { - skipCurrentElement(); - } - } - - if (keySet && valueSet) { - m_meta->addCustomField(key, value); - } else { - raiseError("Missing custom data key or value"); - } -} - -bool Kdbx3XmlReader::parseRoot() -{ - Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Root"); - - bool groupElementFound = false; - bool groupParsedSuccessfully = false; - - while (!m_xml.error() && m_xml.readNextStartElement()) { - if (m_xml.name() == "Group") { - if (groupElementFound) { - groupParsedSuccessfully = false; - raiseError("Multiple group elements"); - continue; - } - - Group* rootGroup = parseGroup(); - if (rootGroup) { - Group* oldRoot = m_db->rootGroup(); - m_db->setRootGroup(rootGroup); - delete oldRoot; - groupParsedSuccessfully = true; - } - - groupElementFound = true; - } else if (m_xml.name() == "DeletedObjects") { - parseDeletedObjects(); - } else { - skipCurrentElement(); - } - } - - return groupParsedSuccessfully; -} - -Group* Kdbx3XmlReader::parseGroup() -{ - Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Group"); - - Group* group = new Group(); - group->setUpdateTimeinfo(false); - QList<Group*> children; - QList<Entry*> entries; - while (!m_xml.error() && m_xml.readNextStartElement()) { - if (m_xml.name() == "UUID") { - Uuid uuid = readUuid(); - if (uuid.isNull()) { - if (m_strictMode) { - raiseError("Null group uuid"); - } else { - group->setUuid(Uuid::random()); - } - } else { - group->setUuid(uuid); - } - } else if (m_xml.name() == "Name") { - group->setName(readString()); - } else if (m_xml.name() == "Notes") { - group->setNotes(readString()); - } else if (m_xml.name() == "IconID") { - int iconId = readNumber(); - if (iconId < 0) { - if (m_strictMode) { - raiseError("Invalid group icon number"); - } - iconId = 0; - } else { - if (iconId >= DatabaseIcons::IconCount) { - qWarning("Kdbx3XmlReader::parseGroup: icon id \"%d\" not supported", iconId); - } - group->setIcon(iconId); - } - } else if (m_xml.name() == "CustomIconUUID") { - Uuid uuid = readUuid(); - if (!uuid.isNull()) { - group->setIcon(uuid); - } - } else if (m_xml.name() == "Times") { - group->setTimeInfo(parseTimes()); - } else if (m_xml.name() == "IsExpanded") { - group->setExpanded(readBool()); - } else if (m_xml.name() == "DefaultAutoTypeSequence") { - group->setDefaultAutoTypeSequence(readString()); - } else if (m_xml.name() == "EnableAutoType") { - QString str = readString(); - - if (str.compare("null", Qt::CaseInsensitive) == 0) { - group->setAutoTypeEnabled(Group::Inherit); - } else if (str.compare("true", Qt::CaseInsensitive) == 0) { - group->setAutoTypeEnabled(Group::Enable); - } else if (str.compare("false", Qt::CaseInsensitive) == 0) { - group->setAutoTypeEnabled(Group::Disable); - } else { - raiseError("Invalid EnableAutoType value"); - } - } else if (m_xml.name() == "EnableSearching") { - QString str = readString(); - - if (str.compare("null", Qt::CaseInsensitive) == 0) { - group->setSearchingEnabled(Group::Inherit); - } else if (str.compare("true", Qt::CaseInsensitive) == 0) { - group->setSearchingEnabled(Group::Enable); - } else if (str.compare("false", Qt::CaseInsensitive) == 0) { - group->setSearchingEnabled(Group::Disable); - } else { - raiseError("Invalid EnableSearching value"); - } - } else if (m_xml.name() == "LastTopVisibleEntry") { - group->setLastTopVisibleEntry(getEntry(readUuid())); - } else if (m_xml.name() == "Group") { - Group* newGroup = parseGroup(); - if (newGroup) { - children.append(newGroup); - } - } else if (m_xml.name() == "Entry") { - Entry* newEntry = parseEntry(false); - if (newEntry) { - entries.append(newEntry); - } - } else { - skipCurrentElement(); - } - } - - if (group->uuid().isNull() && !m_strictMode) { - group->setUuid(Uuid::random()); - } - - if (!group->uuid().isNull()) { - Group* tmpGroup = group; - group = getGroup(tmpGroup->uuid()); - group->copyDataFrom(tmpGroup); - group->setUpdateTimeinfo(false); - delete tmpGroup; - } else if (!hasError()) { - raiseError("No group uuid found"); - } - - for (Group* child : asConst(children)) { - child->setParent(group); - } - - for (Entry* entry : asConst(entries)) { - entry->setGroup(group); - } - - return group; -} - -void Kdbx3XmlReader::parseDeletedObjects() -{ - Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "DeletedObjects"); - - while (!m_xml.error() && m_xml.readNextStartElement()) { - if (m_xml.name() == "DeletedObject") { - parseDeletedObject(); - } else { - skipCurrentElement(); - } - } -} - -void Kdbx3XmlReader::parseDeletedObject() -{ - Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "DeletedObject"); - - DeletedObject delObj; - - while (!m_xml.error() && m_xml.readNextStartElement()) { - if (m_xml.name() == "UUID") { - Uuid uuid = readUuid(); - if (uuid.isNull()) { - if (m_strictMode) { - raiseError("Null DeleteObject uuid"); - } - } else { - delObj.uuid = uuid; - } - } else if (m_xml.name() == "DeletionTime") { - delObj.deletionTime = readDateTime(); - } else { - skipCurrentElement(); - } - } - - if (!delObj.uuid.isNull() && !delObj.deletionTime.isNull()) { - m_db->addDeletedObject(delObj); - } else if (m_strictMode) { - raiseError("Missing DeletedObject uuid or time"); - } -} - -Entry* Kdbx3XmlReader::parseEntry(bool history) -{ - Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Entry"); - - Entry* entry = new Entry(); - entry->setUpdateTimeinfo(false); - QList<Entry*> historyItems; - QList<StringPair> binaryRefs; - - while (!m_xml.error() && m_xml.readNextStartElement()) { - if (m_xml.name() == "UUID") { - Uuid uuid = readUuid(); - if (uuid.isNull()) { - if (m_strictMode) { - raiseError("Null entry uuid"); - } else { - entry->setUuid(Uuid::random()); - } - } else { - entry->setUuid(uuid); - } - } else if (m_xml.name() == "IconID") { - int iconId = readNumber(); - if (iconId < 0) { - if (m_strictMode) { - raiseError("Invalid entry icon number"); - } - iconId = 0; - } else { - entry->setIcon(iconId); - } - } else if (m_xml.name() == "CustomIconUUID") { - Uuid uuid = readUuid(); - if (!uuid.isNull()) { - entry->setIcon(uuid); - } - } else if (m_xml.name() == "ForegroundColor") { - entry->setForegroundColor(readColor()); - } else if (m_xml.name() == "BackgroundColor") { - entry->setBackgroundColor(readColor()); - } else if (m_xml.name() == "OverrideURL") { - entry->setOverrideUrl(readString()); - } else if (m_xml.name() == "Tags") { - entry->setTags(readString()); - } else if (m_xml.name() == "Times") { - entry->setTimeInfo(parseTimes()); - } else if (m_xml.name() == "String") { - parseEntryString(entry); - } else if (m_xml.name() == "Binary") { - QPair<QString, QString> ref = parseEntryBinary(entry); - if (!ref.first.isNull() && !ref.second.isNull()) { - binaryRefs.append(ref); - } - } else if (m_xml.name() == "AutoType") { - parseAutoType(entry); - } else if (m_xml.name() == "History") { - if (history) { - raiseError("History element in history entry"); - } else { - historyItems = parseEntryHistory(); - } - } else { - skipCurrentElement(); - } - } - - if (entry->uuid().isNull() && !m_strictMode) { - entry->setUuid(Uuid::random()); - } - - if (!entry->uuid().isNull()) { - if (history) { - entry->setUpdateTimeinfo(false); - } else { - Entry* tmpEntry = entry; - - entry = getEntry(tmpEntry->uuid()); - entry->copyDataFrom(tmpEntry); - entry->setUpdateTimeinfo(false); - - delete tmpEntry; - } - } else if (!hasError()) { - raiseError("No entry uuid found"); - } - - for (Entry* historyItem : asConst(historyItems)) { - if (historyItem->uuid() != entry->uuid()) { - if (m_strictMode) { - raiseError("History element with different uuid"); - } else { - historyItem->setUuid(entry->uuid()); - } - } - entry->addHistoryItem(historyItem); - } - - for (const StringPair& ref : asConst(binaryRefs)) { - m_binaryMap.insertMulti(ref.first, qMakePair(entry, ref.second)); - } - - return entry; -} - -void Kdbx3XmlReader::parseEntryString(Entry* entry) -{ - Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "String"); - - QString key; - QString value; - bool protect = false; - bool keySet = false; - bool valueSet = false; - - while (!m_xml.error() && m_xml.readNextStartElement()) { - if (m_xml.name() == "Key") { - key = readString(); - keySet = true; - } else if (m_xml.name() == "Value") { - QXmlStreamAttributes attr = m_xml.attributes(); - value = readString(); - - bool isProtected = attr.value("Protected") == "True"; - bool protectInMemory = attr.value("ProtectInMemory") == "True"; - - if (isProtected && !value.isEmpty()) { - if (m_randomStream) { - QByteArray ciphertext = QByteArray::fromBase64(value.toLatin1()); - bool ok; - QByteArray plaintext = m_randomStream->process(ciphertext, &ok); - if (!ok) { - value.clear(); - raiseError(m_randomStream->errorString()); - } else { - value = QString::fromUtf8(plaintext); - } - } else { - raiseError("Unable to decrypt entry string"); - } - } - - protect = isProtected || protectInMemory; - valueSet = true; - } else { - skipCurrentElement(); - } - } - - if (keySet && valueSet) { - // the default attributes are always there so additionally check if it's empty - if (entry->attributes()->hasKey(key) && !entry->attributes()->value(key).isEmpty()) { - raiseError("Duplicate custom attribute found"); - } else { - entry->attributes()->set(key, value, protect); - } - } else { - raiseError("Entry string key or value missing"); - } -} - -QPair<QString, QString> Kdbx3XmlReader::parseEntryBinary(Entry* entry) -{ - Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Binary"); - - QPair<QString, QString> poolRef; - - QString key; - QByteArray value; - bool keySet = false; - bool valueSet = false; - - while (!m_xml.error() && m_xml.readNextStartElement()) { - if (m_xml.name() == "Key") { - key = readString(); - keySet = true; - } else if (m_xml.name() == "Value") { - QXmlStreamAttributes attr = m_xml.attributes(); - - if (attr.hasAttribute("Ref")) { - poolRef = qMakePair(attr.value("Ref").toString(), key); - m_xml.skipCurrentElement(); - } else { - // format compatibility - value = readBinary(); - bool isProtected = attr.hasAttribute("Protected") - && (attr.value("Protected") == "True"); - - if (isProtected && !value.isEmpty()) { - if (!m_randomStream->processInPlace(value)) { - raiseError(m_randomStream->errorString()); - } - } - } - - valueSet = true; - } else { - skipCurrentElement(); - } - } - - if (keySet && valueSet) { - if (entry->attachments()->hasKey(key)) { - raiseError("Duplicate attachment found"); - } else { - entry->attachments()->set(key, value); - } - } else { - raiseError("Entry binary key or value missing"); - } - - return poolRef; -} - -void Kdbx3XmlReader::parseAutoType(Entry* entry) -{ - Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "AutoType"); - - while (!m_xml.error() && m_xml.readNextStartElement()) { - if (m_xml.name() == "Enabled") { - entry->setAutoTypeEnabled(readBool()); - } else if (m_xml.name() == "DataTransferObfuscation") { - entry->setAutoTypeObfuscation(readNumber()); - } else if (m_xml.name() == "DefaultSequence") { - entry->setDefaultAutoTypeSequence(readString()); - } else if (m_xml.name() == "Association") { - parseAutoTypeAssoc(entry); - } else { - skipCurrentElement(); - } - } -} - -void Kdbx3XmlReader::parseAutoTypeAssoc(Entry* entry) -{ - Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Association"); - - AutoTypeAssociations::Association assoc; - bool windowSet = false; - bool sequenceSet = false; - - while (!m_xml.error() && m_xml.readNextStartElement()) { - if (m_xml.name() == "Window") { - assoc.window = readString(); - windowSet = true; - } else if (m_xml.name() == "KeystrokeSequence") { - assoc.sequence = readString(); - sequenceSet = true; - } else { - skipCurrentElement(); - } - } - - if (windowSet && sequenceSet) { - entry->autoTypeAssociations()->add(assoc); - } else { - raiseError("Auto-type association window or sequence missing"); - } -} - -QList<Entry*> Kdbx3XmlReader::parseEntryHistory() -{ - Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "History"); - - QList<Entry*> historyItems; - - while (!m_xml.error() && m_xml.readNextStartElement()) { - if (m_xml.name() == "Entry") { - historyItems.append(parseEntry(true)); - } else { - skipCurrentElement(); - } - } - - return historyItems; -} - -TimeInfo Kdbx3XmlReader::parseTimes() -{ - Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Times"); - - TimeInfo timeInfo; - while (!m_xml.error() && m_xml.readNextStartElement()) { - if (m_xml.name() == "LastModificationTime") { - timeInfo.setLastModificationTime(readDateTime()); - } else if (m_xml.name() == "CreationTime") { - timeInfo.setCreationTime(readDateTime()); - } else if (m_xml.name() == "LastAccessTime") { - timeInfo.setLastAccessTime(readDateTime()); - } else if (m_xml.name() == "ExpiryTime") { - timeInfo.setExpiryTime(readDateTime()); - } else if (m_xml.name() == "Expires") { - timeInfo.setExpires(readBool()); - } else if (m_xml.name() == "UsageCount") { - timeInfo.setUsageCount(readNumber()); - } else if (m_xml.name() == "LocationChanged") { - timeInfo.setLocationChanged(readDateTime()); - } else { - skipCurrentElement(); - } - } - - return timeInfo; -} - -QString Kdbx3XmlReader::readString() -{ - return m_xml.readElementText(); -} - -bool Kdbx3XmlReader::readBool() -{ - QString str = readString(); - - if (str.compare("True", Qt::CaseInsensitive) == 0) { - return true; - } else if (str.compare("False", Qt::CaseInsensitive) == 0) { - return false; - } else if (str.length() == 0) { - return false; - } else { - raiseError("Invalid bool value"); - return false; - } -} - -QDateTime Kdbx3XmlReader::readDateTime() -{ - QString str = readString(); - QDateTime dt = QDateTime::fromString(str, Qt::ISODate); - - if (!dt.isValid()) { - if (m_strictMode) { - raiseError("Invalid date time value"); - } else { - dt = QDateTime::currentDateTimeUtc(); - } - } - - return dt; -} - -QColor Kdbx3XmlReader::readColor() -{ - QString colorStr = readString(); - - if (colorStr.isEmpty()) { - return QColor(); - } - - if (colorStr.length() != 7 || colorStr[0] != '#') { - if (m_strictMode) { - raiseError("Invalid color value"); - } - return QColor(); - } - - QColor color; - for (int i = 0; i <= 2; i++) { - QString rgbPartStr = colorStr.mid(1 + 2 * i, 2); - bool ok; - int rgbPart = rgbPartStr.toInt(&ok, 16); - if (!ok || rgbPart > 255) { - if (m_strictMode) { - raiseError("Invalid color rgb part"); - } - return QColor(); - } - - if (i == 0) { - color.setRed(rgbPart); - } else if (i == 1) { - color.setGreen(rgbPart); - } else { - color.setBlue(rgbPart); - } - } - - return color; -} - -int Kdbx3XmlReader::readNumber() -{ - bool ok; - int result = readString().toInt(&ok); - if (!ok) { - raiseError("Invalid number value"); - } - return result; -} - -Uuid Kdbx3XmlReader::readUuid() -{ - QByteArray uuidBin = readBinary(); - if (uuidBin.isEmpty()) { - return Uuid(); - } else if (uuidBin.length() != Uuid::Length) { - if (m_strictMode) { - raiseError("Invalid uuid value"); - } - return Uuid(); - } else { - return Uuid(uuidBin); - } -} - -QByteArray Kdbx3XmlReader::readBinary() -{ - return QByteArray::fromBase64(readString().toLatin1()); -} - -QByteArray Kdbx3XmlReader::readCompressedBinary() -{ - QByteArray rawData = readBinary(); - - QBuffer buffer(&rawData); - buffer.open(QIODevice::ReadOnly); - - QtIOCompressor compressor(&buffer); - compressor.setStreamFormat(QtIOCompressor::GzipFormat); - compressor.open(QIODevice::ReadOnly); - - QByteArray result; - if (!Tools::readAllFromDevice(&compressor, result)) { - raiseError("Unable to decompress binary"); - } - return result; -} - -Group* Kdbx3XmlReader::getGroup(const Uuid& uuid) -{ - if (uuid.isNull()) { - return nullptr; - } - - if (m_groups.contains(uuid)) { - return m_groups.value(uuid); - } else { - auto group = new Group(); - group->setUpdateTimeinfo(false); - group->setUuid(uuid); - group->setParent(m_tmpParent); - m_groups.insert(uuid, group); - return group; - } -} - -Entry* Kdbx3XmlReader::getEntry(const Uuid& uuid) -{ - if (uuid.isNull()) { - return nullptr; - } - - if (m_entries.contains(uuid)) { - return m_entries.value(uuid); - } else { - Entry* entry = new Entry(); - entry->setUpdateTimeinfo(false); - entry->setUuid(uuid); - entry->setGroup(m_tmpParent); - m_entries.insert(uuid, entry); - return entry; - } -} - -void Kdbx3XmlReader::skipCurrentElement() -{ - qWarning("Kdbx3XmlReader::skipCurrentElement: skip element \"%s\"", qPrintable(m_xml.name().toString())); - m_xml.skipCurrentElement(); -} diff --git a/src/format/Kdbx3XmlReader.h b/src/format/Kdbx3XmlReader.h deleted file mode 100644 index 213b21c92..000000000 --- a/src/format/Kdbx3XmlReader.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> - * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 or (at your option) - * version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef KEEPASSX_KDBX3XMLREADER_H -#define KEEPASSX_KDBX3XMLREADER_H - -#include <QColor> -#include <QCoreApplication> -#include <QDateTime> -#include <QHash> -#include <QPair> -#include <QXmlStreamReader> - -#include "core/TimeInfo.h" -#include "core/Uuid.h" - -class Database; -class Entry; -class Group; -class KeePass2RandomStream; -class Metadata; - -class Kdbx3XmlReader -{ -Q_DECLARE_TR_FUNCTIONS(Kdbx3XmlReader) - -public: - Kdbx3XmlReader(); - Database* readDatabase(QIODevice* device); - void readDatabase(QIODevice* device, Database* db, KeePass2RandomStream* randomStream = nullptr); - Database* readDatabase(const QString& filename); - bool hasError(); - QString errorString(); - QByteArray headerHash(); - void setStrictMode(bool strictMode); - -private: - bool parseKeePassFile(); - void parseMeta(); - void parseMemoryProtection(); - void parseCustomIcons(); - void parseIcon(); - void parseBinaries(); - void parseCustomData(); - void parseCustomDataItem(); - bool parseRoot(); - Group* parseGroup(); - void parseDeletedObjects(); - void parseDeletedObject(); - Entry* parseEntry(bool history); - void parseEntryString(Entry* entry); - QPair<QString, QString> parseEntryBinary(Entry* entry); - void parseAutoType(Entry* entry); - void parseAutoTypeAssoc(Entry* entry); - QList<Entry*> parseEntryHistory(); - TimeInfo parseTimes(); - - QString readString(); - bool readBool(); - QDateTime readDateTime(); - QColor readColor(); - int readNumber(); - Uuid readUuid(); - QByteArray readBinary(); - QByteArray readCompressedBinary(); - - Group* getGroup(const Uuid& uuid); - Entry* getEntry(const Uuid& uuid); - void raiseError(const QString& errorMessage); - void skipCurrentElement(); - - QXmlStreamReader m_xml; - KeePass2RandomStream* m_randomStream; - Database* m_db; - Metadata* m_meta; - Group* m_tmpParent; - QHash<Uuid, Group*> m_groups; - QHash<Uuid, Entry*> m_entries; - QHash<QString, QByteArray> m_binaryPool; - QHash<QString, QPair<Entry*, QString> > m_binaryMap; - QByteArray m_headerHash; - bool m_error; - QString m_errorStr; - bool m_strictMode; -}; - -#endif // KEEPASSX_KDBX3XMLREADER_H diff --git a/src/format/Kdbx3XmlWriter.cpp b/src/format/Kdbx3XmlWriter.cpp deleted file mode 100644 index bfa94a77c..000000000 --- a/src/format/Kdbx3XmlWriter.cpp +++ /dev/null @@ -1,566 +0,0 @@ -/* - * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> - * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 or (at your option) - * version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "Kdbx3XmlWriter.h" - -#include <QBuffer> -#include <QFile> - -#include "core/Metadata.h" -#include "format/KeePass2RandomStream.h" -#include "streams/QtIOCompressor" - -Kdbx3XmlWriter::Kdbx3XmlWriter() - : m_db(nullptr) - , m_meta(nullptr) - , m_randomStream(nullptr) - , m_error(false) -{ - m_xml.setAutoFormatting(true); - m_xml.setAutoFormattingIndent(-1); // 1 tab - m_xml.setCodec("UTF-8"); -} - -void Kdbx3XmlWriter::writeDatabase(QIODevice* device, Database* db, KeePass2RandomStream* randomStream, - const QByteArray& headerHash) -{ - m_db = db; - m_meta = db->metadata(); - m_randomStream = randomStream; - m_headerHash = headerHash; - - generateIdMap(); - - m_xml.setDevice(device); - - m_xml.writeStartDocument("1.0", true); - - m_xml.writeStartElement("KeePassFile"); - - writeMetadata(); - writeRoot(); - - m_xml.writeEndElement(); - - m_xml.writeEndDocument(); - - if (m_xml.hasError()) { - raiseError(device->errorString()); - } -} - -void Kdbx3XmlWriter::writeDatabase(const QString& filename, Database* db) -{ - QFile file(filename); - file.open(QIODevice::WriteOnly | QIODevice::Truncate); - writeDatabase(&file, db); -} - -bool Kdbx3XmlWriter::hasError() -{ - return m_error; -} - -QString Kdbx3XmlWriter::errorString() -{ - return m_errorStr; -} - -void Kdbx3XmlWriter::generateIdMap() -{ - const QList<Entry*> allEntries = m_db->rootGroup()->entriesRecursive(true); - int nextId = 0; - - for (Entry* entry : allEntries) { - const QList<QString> attachmentKeys = entry->attachments()->keys(); - for (const QString& key : attachmentKeys) { - QByteArray data = entry->attachments()->value(key); - if (!m_idMap.contains(data)) { - m_idMap.insert(data, nextId++); - } - } - } -} - -void Kdbx3XmlWriter::writeMetadata() -{ - m_xml.writeStartElement("Meta"); - - writeString("Generator", m_meta->generator()); - if (!m_headerHash.isEmpty()) { - writeBinary("HeaderHash", m_headerHash); - } - writeString("DatabaseName", m_meta->name()); - writeDateTime("DatabaseNameChanged", m_meta->nameChanged()); - writeString("DatabaseDescription", m_meta->description()); - writeDateTime("DatabaseDescriptionChanged", m_meta->descriptionChanged()); - writeString("DefaultUserName", m_meta->defaultUserName()); - writeDateTime("DefaultUserNameChanged", m_meta->defaultUserNameChanged()); - writeNumber("MaintenanceHistoryDays", m_meta->maintenanceHistoryDays()); - writeColor("Color", m_meta->color()); - writeDateTime("MasterKeyChanged", m_meta->masterKeyChanged()); - writeNumber("MasterKeyChangeRec", m_meta->masterKeyChangeRec()); - writeNumber("MasterKeyChangeForce", m_meta->masterKeyChangeForce()); - writeMemoryProtection(); - writeCustomIcons(); - writeBool("RecycleBinEnabled", m_meta->recycleBinEnabled()); - writeUuid("RecycleBinUUID", m_meta->recycleBin()); - writeDateTime("RecycleBinChanged", m_meta->recycleBinChanged()); - writeUuid("EntryTemplatesGroup", m_meta->entryTemplatesGroup()); - writeDateTime("EntryTemplatesGroupChanged", m_meta->entryTemplatesGroupChanged()); - writeUuid("LastSelectedGroup", m_meta->lastSelectedGroup()); - writeUuid("LastTopVisibleGroup", m_meta->lastTopVisibleGroup()); - writeNumber("HistoryMaxItems", m_meta->historyMaxItems()); - writeNumber("HistoryMaxSize", m_meta->historyMaxSize()); - writeBinaries(); - writeCustomData(); - - m_xml.writeEndElement(); -} - -void Kdbx3XmlWriter::writeMemoryProtection() -{ - m_xml.writeStartElement("MemoryProtection"); - - writeBool("ProtectTitle", m_meta->protectTitle()); - writeBool("ProtectUserName", m_meta->protectUsername()); - writeBool("ProtectPassword", m_meta->protectPassword()); - writeBool("ProtectURL", m_meta->protectUrl()); - writeBool("ProtectNotes", m_meta->protectNotes()); - - m_xml.writeEndElement(); -} - -void Kdbx3XmlWriter::writeCustomIcons() -{ - m_xml.writeStartElement("CustomIcons"); - - const QList<Uuid> customIconsOrder = m_meta->customIconsOrder(); - for (const Uuid& uuid : customIconsOrder) { - writeIcon(uuid, m_meta->customIcon(uuid)); - } - - m_xml.writeEndElement(); -} - -void Kdbx3XmlWriter::writeIcon(const Uuid& uuid, const QImage& icon) -{ - m_xml.writeStartElement("Icon"); - - writeUuid("UUID", uuid); - - QByteArray ba; - QBuffer buffer(&ba); - buffer.open(QIODevice::WriteOnly); - // TODO: check !icon.save() - icon.save(&buffer, "PNG"); - buffer.close(); - writeBinary("Data", ba); - - m_xml.writeEndElement(); -} - -void Kdbx3XmlWriter::writeBinaries() -{ - m_xml.writeStartElement("Binaries"); - - QHash<QByteArray, int>::const_iterator i; - for (i = m_idMap.constBegin(); i != m_idMap.constEnd(); ++i) { - m_xml.writeStartElement("Binary"); - - m_xml.writeAttribute("ID", QString::number(i.value())); - - QByteArray data; - if (m_db->compressionAlgo() == Database::CompressionGZip) { - m_xml.writeAttribute("Compressed", "True"); - - QBuffer buffer; - buffer.open(QIODevice::ReadWrite); - - QtIOCompressor compressor(&buffer); - compressor.setStreamFormat(QtIOCompressor::GzipFormat); - compressor.open(QIODevice::WriteOnly); - - qint64 bytesWritten = compressor.write(i.key()); - Q_ASSERT(bytesWritten == i.key().size()); - Q_UNUSED(bytesWritten); - compressor.close(); - - buffer.seek(0); - data = buffer.readAll(); - } else { - data = i.key(); - } - - if (!data.isEmpty()) { - m_xml.writeCharacters(QString::fromLatin1(data.toBase64())); - } - m_xml.writeEndElement(); - } - - m_xml.writeEndElement(); -} - -void Kdbx3XmlWriter::writeCustomData() -{ - m_xml.writeStartElement("CustomData"); - - QHash<QString, QString> customFields = m_meta->customFields(); - const QList<QString> keyList = customFields.keys(); - for (const QString& key : keyList) { - writeCustomDataItem(key, customFields.value(key)); - } - - m_xml.writeEndElement(); -} - -void Kdbx3XmlWriter::writeCustomDataItem(const QString& key, const QString& value) -{ - m_xml.writeStartElement("Item"); - - writeString("Key", key); - writeString("Value", value); - - m_xml.writeEndElement(); -} - -void Kdbx3XmlWriter::writeRoot() -{ - Q_ASSERT(m_db->rootGroup()); - - m_xml.writeStartElement("Root"); - - writeGroup(m_db->rootGroup()); - writeDeletedObjects(); - - m_xml.writeEndElement(); -} - -void Kdbx3XmlWriter::writeGroup(const Group* group) -{ - Q_ASSERT(!group->uuid().isNull()); - - m_xml.writeStartElement("Group"); - - writeUuid("UUID", group->uuid()); - writeString("Name", group->name()); - writeString("Notes", group->notes()); - writeNumber("IconID", group->iconNumber()); - - if (!group->iconUuid().isNull()) { - writeUuid("CustomIconUUID", group->iconUuid()); - } - writeTimes(group->timeInfo()); - writeBool("IsExpanded", group->isExpanded()); - writeString("DefaultAutoTypeSequence", group->defaultAutoTypeSequence()); - - writeTriState("EnableAutoType", group->autoTypeEnabled()); - - writeTriState("EnableSearching", group->searchingEnabled()); - - writeUuid("LastTopVisibleEntry", group->lastTopVisibleEntry()); - - const QList<Entry*> entryList = group->entries(); - for (const Entry* entry : entryList) { - writeEntry(entry); - } - - const QList<Group*> children = group->children(); - for (const Group* child : children) { - writeGroup(child); - } - - m_xml.writeEndElement(); -} - -void Kdbx3XmlWriter::writeTimes(const TimeInfo& ti) -{ - m_xml.writeStartElement("Times"); - - writeDateTime("LastModificationTime", ti.lastModificationTime()); - writeDateTime("CreationTime", ti.creationTime()); - writeDateTime("LastAccessTime", ti.lastAccessTime()); - writeDateTime("ExpiryTime", ti.expiryTime()); - writeBool("Expires", ti.expires()); - writeNumber("UsageCount", ti.usageCount()); - writeDateTime("LocationChanged", ti.locationChanged()); - - m_xml.writeEndElement(); -} - -void Kdbx3XmlWriter::writeDeletedObjects() -{ - m_xml.writeStartElement("DeletedObjects"); - - const QList<DeletedObject> delObjList = m_db->deletedObjects(); - for (const DeletedObject& delObj : delObjList) { - writeDeletedObject(delObj); - } - - m_xml.writeEndElement(); -} - -void Kdbx3XmlWriter::writeDeletedObject(const DeletedObject& delObj) -{ - m_xml.writeStartElement("DeletedObject"); - - writeUuid("UUID", delObj.uuid); - writeDateTime("DeletionTime", delObj.deletionTime); - - m_xml.writeEndElement(); -} - -void Kdbx3XmlWriter::writeEntry(const Entry* entry) -{ - Q_ASSERT(!entry->uuid().isNull()); - - m_xml.writeStartElement("Entry"); - - writeUuid("UUID", entry->uuid()); - writeNumber("IconID", entry->iconNumber()); - if (!entry->iconUuid().isNull()) { - writeUuid("CustomIconUUID", entry->iconUuid()); - } - writeColor("ForegroundColor", entry->foregroundColor()); - writeColor("BackgroundColor", entry->backgroundColor()); - writeString("OverrideURL", entry->overrideUrl()); - writeString("Tags", entry->tags()); - writeTimes(entry->timeInfo()); - - const QList<QString> attributesKeyList = entry->attributes()->keys(); - for (const QString& key : attributesKeyList) { - m_xml.writeStartElement("String"); - - bool protect = (((key == "Title") && m_meta->protectTitle()) || - ((key == "UserName") && m_meta->protectUsername()) || - ((key == "Password") && m_meta->protectPassword()) || - ((key == "URL") && m_meta->protectUrl()) || - ((key == "Notes") && m_meta->protectNotes()) || - entry->attributes()->isProtected(key)); - - writeString("Key", key); - - m_xml.writeStartElement("Value"); - QString value; - - if (protect) { - if (m_randomStream) { - m_xml.writeAttribute("Protected", "True"); - bool ok; - QByteArray rawData = m_randomStream->process(entry->attributes()->value(key).toUtf8(), &ok); - if (!ok) { - raiseError(m_randomStream->errorString()); - } - value = QString::fromLatin1(rawData.toBase64()); - } else { - m_xml.writeAttribute("ProtectInMemory", "True"); - value = entry->attributes()->value(key); - } - } else { - value = entry->attributes()->value(key); - } - - if (!value.isEmpty()) { - m_xml.writeCharacters(stripInvalidXml10Chars(value)); - } - m_xml.writeEndElement(); - - m_xml.writeEndElement(); - } - - const QList<QString> attachmentsKeyList = entry->attachments()->keys(); - for (const QString& key : attachmentsKeyList) { - m_xml.writeStartElement("Binary"); - - writeString("Key", key); - - m_xml.writeStartElement("Value"); - m_xml.writeAttribute("Ref", QString::number(m_idMap[entry->attachments()->value(key)])); - m_xml.writeEndElement(); - - m_xml.writeEndElement(); - } - - writeAutoType(entry); - // write history only for entries that are not history items - if (entry->parent()) { - writeEntryHistory(entry); - } - - m_xml.writeEndElement(); -} - -void Kdbx3XmlWriter::writeAutoType(const Entry* entry) -{ - m_xml.writeStartElement("AutoType"); - - writeBool("Enabled", entry->autoTypeEnabled()); - writeNumber("DataTransferObfuscation", entry->autoTypeObfuscation()); - writeString("DefaultSequence", entry->defaultAutoTypeSequence()); - - const QList<AutoTypeAssociations::Association> autoTypeAssociations = entry->autoTypeAssociations()->getAll(); - for (const AutoTypeAssociations::Association& assoc : autoTypeAssociations) { - writeAutoTypeAssoc(assoc); - } - - m_xml.writeEndElement(); -} - -void Kdbx3XmlWriter::writeAutoTypeAssoc(const AutoTypeAssociations::Association& assoc) -{ - m_xml.writeStartElement("Association"); - - writeString("Window", assoc.window); - writeString("KeystrokeSequence", assoc.sequence); - - m_xml.writeEndElement(); -} - -void Kdbx3XmlWriter::writeEntryHistory(const Entry* entry) -{ - m_xml.writeStartElement("History"); - - const QList<Entry*>& historyItems = entry->historyItems(); - for (const Entry* item : historyItems) { - writeEntry(item); - } - - m_xml.writeEndElement(); -} - -void Kdbx3XmlWriter::writeString(const QString& qualifiedName, const QString& string) -{ - if (string.isEmpty()) { - m_xml.writeEmptyElement(qualifiedName); - } else { - m_xml.writeTextElement(qualifiedName, stripInvalidXml10Chars(string)); - } -} - -void Kdbx3XmlWriter::writeNumber(const QString& qualifiedName, int number) -{ - writeString(qualifiedName, QString::number(number)); -} - -void Kdbx3XmlWriter::writeBool(const QString& qualifiedName, bool b) -{ - writeString(qualifiedName, b ? "True" : "False"); -} - -void Kdbx3XmlWriter::writeDateTime(const QString& qualifiedName, const QDateTime& dateTime) -{ - Q_ASSERT(dateTime.isValid()); - Q_ASSERT(dateTime.timeSpec() == Qt::UTC); - - QString dateTimeStr = dateTime.toString(Qt::ISODate); - - // Qt < 4.8 doesn't append a 'Z' at the end - if (!dateTimeStr.isEmpty() && dateTimeStr[dateTimeStr.size() - 1] != 'Z') { - dateTimeStr.append('Z'); - } - - writeString(qualifiedName, dateTimeStr); -} - -void Kdbx3XmlWriter::writeUuid(const QString& qualifiedName, const Uuid& uuid) -{ - writeString(qualifiedName, uuid.toBase64()); -} - -void Kdbx3XmlWriter::writeUuid(const QString& qualifiedName, const Group* group) -{ - writeUuid(qualifiedName, group ? group->uuid() : Uuid()); -} - -void Kdbx3XmlWriter::writeUuid(const QString& qualifiedName, const Entry* entry) -{ - writeUuid(qualifiedName, entry ? entry->uuid() : Uuid()); -} - -void Kdbx3XmlWriter::writeBinary(const QString& qualifiedName, const QByteArray& ba) -{ - writeString(qualifiedName, QString::fromLatin1(ba.toBase64())); -} - -void Kdbx3XmlWriter::writeColor(const QString& qualifiedName, const QColor& color) -{ - QString colorStr; - - if (color.isValid()) { - colorStr = QString("#%1%2%3").arg(colorPartToString(color.red()), - colorPartToString(color.green()), - colorPartToString(color.blue())); - } - - writeString(qualifiedName, colorStr); -} - -void Kdbx3XmlWriter::writeTriState(const QString& qualifiedName, Group::TriState triState) -{ - QString value; - - if (triState == Group::Inherit) { - value = "null"; - } else if (triState == Group::Enable) { - value = "true"; - } else { - value = "false"; - } - - writeString(qualifiedName, value); -} - -QString Kdbx3XmlWriter::colorPartToString(int value) -{ - QString str = QString::number(value, 16).toUpper(); - if (str.length() == 1) { - str.prepend("0"); - } - - return str; -} - -QString Kdbx3XmlWriter::stripInvalidXml10Chars(QString str) -{ - for (int i = str.size() - 1; i >= 0; i--) { - const QChar ch = str.at(i); - const ushort uc = ch.unicode(); - - if (ch.isLowSurrogate() && i != 0 && str.at(i - 1).isHighSurrogate()) { - // keep valid surrogate pair - i--; - } else if ((uc < 0x20 && uc != 0x09 && uc != 0x0A && uc != 0x0D) // control characters - || (uc >= 0x7F && uc <= 0x84) // control characters, valid but discouraged by XML - || (uc >= 0x86 && uc <= 0x9F) // control characters, valid but discouraged by XML - || (uc > 0xFFFD) // noncharacter - || ch.isLowSurrogate() // single low surrogate - || ch.isHighSurrogate()) // single high surrogate - { - qWarning("Stripping invalid XML 1.0 codepoint %x", uc); - str.remove(i, 1); - } - } - - return str; -} - -void Kdbx3XmlWriter::raiseError(const QString& errorMessage) -{ - m_error = true; - m_errorStr = errorMessage; -} diff --git a/src/format/Kdbx4Reader.cpp b/src/format/Kdbx4Reader.cpp index 5bac5d005..05ef71160 100644 --- a/src/format/Kdbx4Reader.cpp +++ b/src/format/Kdbx4Reader.cpp @@ -18,77 +18,24 @@ #include "Kdbx4Reader.h" #include <QBuffer> -#include <QFile> -#include "crypto/kdf/AesKdf.h" -#include "streams/HmacBlockStream.h" +#include "core/Group.h" #include "core/Database.h" #include "core/Endian.h" #include "crypto/CryptoHash.h" -#include "format/KeePass1.h" -#include "format/KeePass2.h" #include "format/KeePass2RandomStream.h" -#include "format/Kdbx4XmlReader.h" -#include "streams/HashedBlockStream.h" +#include "format/KdbxXmlReader.h" +#include "streams/HmacBlockStream.h" #include "streams/QtIOCompressor" -#include "streams/StoreDataStream.h" #include "streams/SymmetricCipherStream.h" -Kdbx4Reader::Kdbx4Reader() - : m_device(nullptr) - , m_db(nullptr) +Database* Kdbx4Reader::readDatabaseImpl(QIODevice* device, const QByteArray& headerData, + const CompositeKey& key, bool keepDatabase) { -} + Q_ASSERT(m_kdbxVersion == KeePass2::FILE_VERSION_4); -Database* Kdbx4Reader::readDatabase(QIODevice* device, const CompositeKey& key, bool keepDatabase) -{ - QScopedPointer<Database> db(new Database()); - m_db = db.data(); - m_device = device; - m_error = false; - m_errorStr.clear(); - m_xmlData.clear(); - m_masterSeed.clear(); - m_encryptionIV.clear(); - m_protectedStreamKey.clear(); m_binaryPool.clear(); - StoreDataStream headerStream(m_device); - headerStream.open(QIODevice::ReadOnly); - QIODevice* headerIo = &headerStream; - - bool ok; - - quint32 signature1 = Endian::readSizedInt<quint32>(headerIo, KeePass2::BYTEORDER, &ok); - if (!ok || signature1 != KeePass2::SIGNATURE_1) { - raiseError(tr("Not a KeePass database.")); - return nullptr; - } - - quint32 signature2 = Endian::readSizedInt<quint32>(headerIo, KeePass2::BYTEORDER, &ok); - if (ok && signature2 == KeePass1::SIGNATURE_2) { - raiseError(tr("The selected file is an old KeePass 1 database (.kdb).\n\n" - "You can import it by clicking on Database > 'Import KeePass 1 database...'.\n" - "This is a one-way migration. You won't be able to open the imported " - "database with the old KeePassX 0.4 version.")); - return nullptr; - } else if (!ok || signature2 != KeePass2::SIGNATURE_2) { - raiseError(tr("Not a KeePass database.")); - return nullptr; - } - - quint32 version = Endian::readSizedInt<quint32>(headerIo, KeePass2::BYTEORDER, &ok) - & KeePass2::FILE_VERSION_CRITICAL_MASK; - if (!ok || version != (KeePass2::FILE_VERSION_4 & KeePass2::FILE_VERSION_CRITICAL_MASK)) { - raiseError(tr("Unsupported KeePass KDBX 4 database version.")); - return nullptr; - } - - while (readHeaderField(headerIo) && !hasError()) { - } - - headerStream.close(); - if (hasError()) { return nullptr; } @@ -97,7 +44,7 @@ Database* Kdbx4Reader::readDatabase(QIODevice* device, const CompositeKey& key, if (m_masterSeed.isEmpty() || m_encryptionIV.isEmpty() || m_db->cipher().isNull()) { - raiseError("missing database headers"); + raiseError(tr("missing database headers")); return nullptr; } @@ -106,7 +53,7 @@ Database* Kdbx4Reader::readDatabase(QIODevice* device, const CompositeKey& key, return nullptr; } - if (m_db->challengeMasterSeed(m_masterSeed) == false) { + if (!m_db->challengeMasterSeed(m_masterSeed)) { raiseError(tr("Unable to issue challenge-response.")); return nullptr; } @@ -117,24 +64,24 @@ Database* Kdbx4Reader::readDatabase(QIODevice* device, const CompositeKey& key, hash.addData(m_db->transformedMasterKey()); QByteArray finalKey = hash.result(); - QByteArray headerSha256 = m_device->read(32); - QByteArray headerHmac = m_device->read(32); + QByteArray headerSha256 = device->read(32); + QByteArray headerHmac = device->read(32); if (headerSha256.size() != 32 || headerHmac.size() != 32) { - raiseError("Invalid header checksum size"); + raiseError(tr("Invalid header checksum size")); return nullptr; } - if (headerSha256 != CryptoHash::hash(headerStream.storedData(), CryptoHash::Sha256)) { - raiseError("Header SHA256 mismatch"); + if (headerSha256 != CryptoHash::hash(headerData, CryptoHash::Sha256)) { + raiseError(tr("Header SHA256 mismatch")); return nullptr; } QByteArray hmacKey = KeePass2::hmacKey(m_masterSeed, m_db->transformedMasterKey()); - if (headerHmac != CryptoHash::hmac(headerStream.storedData(), + if (headerHmac != CryptoHash::hmac(headerData, HmacBlockStream::getHmacKey(UINT64_MAX, hmacKey), CryptoHash::Sha256)) { raiseError(tr("Wrong key or database file is corrupt. (HMAC mismatch)")); return nullptr; } - HmacBlockStream hmacStream(m_device, hmacKey); + HmacBlockStream hmacStream(device, hmacKey); if (!hmacStream.open(QIODevice::ReadOnly)) { raiseError(hmacStream.errorString()); return nullptr; @@ -142,7 +89,7 @@ Database* Kdbx4Reader::readDatabase(QIODevice* device, const CompositeKey& key, SymmetricCipher::Algorithm cipher = SymmetricCipher::cipherToAlgorithm(m_db->cipher()); if (cipher == SymmetricCipher::InvalidAlgorithm) { - raiseError("Unknown cipher"); + raiseError(tr("Unknown cipher")); return nullptr; } SymmetricCipherStream cipherStream(&hmacStream, cipher, @@ -156,7 +103,7 @@ Database* Kdbx4Reader::readDatabase(QIODevice* device, const CompositeKey& key, return nullptr; } - QIODevice* xmlDevice; + QIODevice* xmlDevice = nullptr; QScopedPointer<QtIOCompressor> ioCompressor; if (m_db->compressionAlgo() == Database::CompressionNone) { @@ -171,7 +118,6 @@ Database* Kdbx4Reader::readDatabase(QIODevice* device, const CompositeKey& key, xmlDevice = ioCompressor.data(); } - while (readInnerHeaderField(xmlDevice) && !hasError()) { } @@ -185,50 +131,51 @@ Database* Kdbx4Reader::readDatabase(QIODevice* device, const CompositeKey& key, return nullptr; } - QScopedPointer<QBuffer> buffer; - - if (m_saveXml) { + QBuffer buffer; + if (saveXml()) { m_xmlData = xmlDevice->readAll(); - buffer.reset(new QBuffer(&m_xmlData)); - buffer->open(QIODevice::ReadOnly); - xmlDevice = buffer.data(); + buffer.setBuffer(&m_xmlData); + buffer.open(QIODevice::ReadOnly); + xmlDevice = &buffer; } - Kdbx4XmlReader xmlReader(m_binaryPool); - xmlReader.readDatabase(xmlDevice, m_db, &randomStream); + Q_ASSERT(xmlDevice); + + KdbxXmlReader xmlReader(KeePass2::FILE_VERSION_4, m_binaryPool); + xmlReader.readDatabase(xmlDevice, m_db.data(), &randomStream); if (xmlReader.hasError()) { raiseError(xmlReader.errorString()); if (keepDatabase) { - return db.take(); + return m_db.take(); } return nullptr; } - return db.take(); + return m_db.take(); } -bool Kdbx4Reader::readHeaderField(QIODevice* device) +bool Kdbx4Reader::readHeaderField(StoreDataStream& device) { - QByteArray fieldIDArray = device->read(1); + QByteArray fieldIDArray = device.read(1); if (fieldIDArray.size() != 1) { - raiseError("Invalid header id size"); + raiseError(tr("Invalid header id size")); return false; } char fieldID = fieldIDArray.at(0); bool ok; - auto fieldLen = Endian::readSizedInt<quint32>(device, KeePass2::BYTEORDER, &ok); + auto fieldLen = Endian::readSizedInt<quint32>(&device, KeePass2::BYTEORDER, &ok); if (!ok) { - raiseError("Invalid header field length"); + raiseError(tr("Invalid header field length")); return false; } QByteArray fieldData; if (fieldLen != 0) { - fieldData = device->read(fieldLen); + fieldData = device.read(fieldLen); if (static_cast<quint32>(fieldData.size()) != fieldLen) { - raiseError("Invalid header data length"); + raiseError(tr("Invalid header data length")); return false; } } @@ -256,13 +203,13 @@ bool Kdbx4Reader::readHeaderField(QIODevice* device) case KeePass2::HeaderFieldID::KdfParameters: { QBuffer bufIoDevice(&fieldData); if (!bufIoDevice.open(QIODevice::ReadOnly)) { - raiseError("Failed to open buffer for KDF parameters in header"); + raiseError(tr("Failed to open buffer for KDF parameters in header")); return false; } QVariantMap kdfParams = readVariantMap(&bufIoDevice); QSharedPointer<Kdf> kdf = KeePass2::kdfFromParameters(kdfParams); if (!kdf) { - raiseError("Invalid KDF parameters"); + raiseError(tr("Invalid KDF parameters")); return false; } m_db->setKdf(kdf); @@ -278,7 +225,7 @@ bool Kdbx4Reader::readHeaderField(QIODevice* device) case KeePass2::HeaderFieldID::TransformSeed: case KeePass2::HeaderFieldID::StreamStartBytes: case KeePass2::HeaderFieldID::InnerRandomStreamID: - raiseError("Legacy header fields found in KDBX4 file."); + raiseError(tr("Legacy header fields found in KDBX4 file.")); return false; default: @@ -289,19 +236,25 @@ bool Kdbx4Reader::readHeaderField(QIODevice* device) return true; } +/** + * Helper method for reading KDBX4 inner header fields. + * + * @param device input device + * @return true if there are more inner header fields + */ bool Kdbx4Reader::readInnerHeaderField(QIODevice* device) { QByteArray fieldIDArray = device->read(1); if (fieldIDArray.size() != 1) { - raiseError("Invalid inner header id size"); + raiseError(tr("Invalid inner header id size")); return false; } - KeePass2::InnerHeaderFieldID fieldID = static_cast<KeePass2::InnerHeaderFieldID>(fieldIDArray.at(0)); + auto fieldID = static_cast<KeePass2::InnerHeaderFieldID>(fieldIDArray.at(0)); bool ok; - quint32 fieldLen = Endian::readSizedInt<quint32>(device, KeePass2::BYTEORDER, &ok); + auto fieldLen = Endian::readSizedInt<quint32>(device, KeePass2::BYTEORDER, &ok); if (!ok) { - raiseError("Invalid inner header field length"); + raiseError(tr("Invalid inner header field length")); return false; } @@ -309,7 +262,7 @@ bool Kdbx4Reader::readInnerHeaderField(QIODevice* device) if (fieldLen != 0) { fieldData = device->read(fieldLen); if (static_cast<quint32>(fieldData.size()) != fieldLen) { - raiseError("Invalid header data length"); + raiseError(tr("Invalid header data length")); return false; } } @@ -328,20 +281,22 @@ bool Kdbx4Reader::readInnerHeaderField(QIODevice* device) case KeePass2::InnerHeaderFieldID::Binary: if (fieldLen < 1) { - raiseError("Invalid inner header binary size"); + raiseError(tr("Invalid inner header binary size")); return false; } m_binaryPool.insert(QString::number(m_binaryPool.size()), fieldData.mid(1)); break; - - default: - qWarning("Unknown inner header field read: id=%hhu", static_cast<quint8>(fieldID)); - break; } return true; } +/** + * Helper method for reading KDF parameters into variant map. + * + * @param device input device + * @return filled variant map + */ QVariantMap Kdbx4Reader::readVariantMap(QIODevice* device) { bool ok; @@ -350,41 +305,41 @@ QVariantMap Kdbx4Reader::readVariantMap(QIODevice* device) quint16 maxVersion = KeePass2::VARIANTMAP_VERSION & KeePass2::VARIANTMAP_CRITICAL_MASK; if (!ok || (version > maxVersion)) { raiseError(tr("Unsupported KeePass variant map version.")); - return QVariantMap(); + return {}; } QVariantMap vm; QByteArray fieldTypeArray; - KeePass2::VariantMapFieldType fieldType; + KeePass2::VariantMapFieldType fieldType = KeePass2::VariantMapFieldType::End; while (((fieldTypeArray = device->read(1)).size() == 1) && ((fieldType = static_cast<KeePass2::VariantMapFieldType>(fieldTypeArray.at(0))) != KeePass2::VariantMapFieldType::End)) { - quint32 nameLen = Endian::readSizedInt<quint32>(device, KeePass2::BYTEORDER, &ok); + auto nameLen = Endian::readSizedInt<quint32>(device, KeePass2::BYTEORDER, &ok); if (!ok) { - raiseError("Invalid variant map entry name length"); - return QVariantMap(); + raiseError(tr("Invalid variant map entry name length")); + return {}; } QByteArray nameBytes; if (nameLen != 0) { nameBytes = device->read(nameLen); if (static_cast<quint32>(nameBytes.size()) != nameLen) { - raiseError("Invalid variant map entry name data"); - return QVariantMap(); + raiseError(tr("Invalid variant map entry name data")); + return {}; } } QString name = QString::fromUtf8(nameBytes); - quint32 valueLen = Endian::readSizedInt<quint32>(device, KeePass2::BYTEORDER, &ok); + auto valueLen = Endian::readSizedInt<quint32>(device, KeePass2::BYTEORDER, &ok); if (!ok) { - raiseError("Invalid variant map entry value length"); - return QVariantMap(); + raiseError(tr("Invalid variant map entry value length")); + return {}; } QByteArray valueBytes; if (valueLen != 0) { valueBytes = device->read(valueLen); if (static_cast<quint32>(valueBytes.size()) != valueLen) { - raiseError("Invalid variant map entry value data"); - return QVariantMap(); + raiseError(tr("Invalid variant map entry value data")); + return {}; } } @@ -393,127 +348,70 @@ QVariantMap Kdbx4Reader::readVariantMap(QIODevice* device) if (valueLen == 1) { vm.insert(name, QVariant(valueBytes.at(0) != 0)); } else { - raiseError("Invalid variant map Bool entry value length"); - return QVariantMap(); + raiseError(tr("Invalid variant map Bool entry value length")); + return {}; } break; + case KeePass2::VariantMapFieldType::Int32: if (valueLen == 4) { vm.insert(name, QVariant(Endian::bytesToSizedInt<qint32>(valueBytes, KeePass2::BYTEORDER))); } else { - raiseError("Invalid variant map Int32 entry value length"); - return QVariantMap(); + raiseError(tr("Invalid variant map Int32 entry value length")); + return {}; } break; + case KeePass2::VariantMapFieldType::UInt32: if (valueLen == 4) { vm.insert(name, QVariant(Endian::bytesToSizedInt<quint32>(valueBytes, KeePass2::BYTEORDER))); } else { - raiseError("Invalid variant map UInt32 entry value length"); - return QVariantMap(); + raiseError(tr("Invalid variant map UInt32 entry value length")); + return {}; } break; + case KeePass2::VariantMapFieldType::Int64: if (valueLen == 8) { vm.insert(name, QVariant(Endian::bytesToSizedInt<qint64>(valueBytes, KeePass2::BYTEORDER))); } else { - raiseError("Invalid variant map Int64 entry value length"); - return QVariantMap(); + raiseError(tr("Invalid variant map Int64 entry value length")); + return {}; } break; + case KeePass2::VariantMapFieldType::UInt64: if (valueLen == 8) { vm.insert(name, QVariant(Endian::bytesToSizedInt<quint64>(valueBytes, KeePass2::BYTEORDER))); } else { - raiseError("Invalid variant map UInt64 entry value length"); - return QVariantMap(); + raiseError(tr("Invalid variant map UInt64 entry value length")); + return {}; } break; + case KeePass2::VariantMapFieldType::String: vm.insert(name, QVariant(QString::fromUtf8(valueBytes))); break; + case KeePass2::VariantMapFieldType::ByteArray: vm.insert(name, QVariant(valueBytes)); break; + default: - raiseError("Invalid variant map entry type"); - return QVariantMap(); + raiseError(tr("Invalid variant map entry type")); + return {}; } } if (fieldTypeArray.size() != 1) { - raiseError("Invalid variant map field type size"); - return QVariantMap(); + raiseError(tr("Invalid variant map field type size")); + return {}; } return vm; } -void Kdbx4Reader::setCipher(const QByteArray& data) -{ - if (data.size() != Uuid::Length) { - raiseError("Invalid cipher uuid length"); - return; - } - Uuid uuid(data); - - if (SymmetricCipher::cipherToAlgorithm(uuid) == SymmetricCipher::InvalidAlgorithm) { - raiseError("Unsupported cipher"); - return; - } - m_db->setCipher(uuid); -} - -void Kdbx4Reader::setCompressionFlags(const QByteArray& data) -{ - if (data.size() != 4) { - raiseError("Invalid compression flags length"); - return; - } - auto id = Endian::bytesToSizedInt<quint32>(data, KeePass2::BYTEORDER); - - if (id > Database::CompressionAlgorithmMax) { - raiseError("Unsupported compression algorithm"); - return; - } - m_db->setCompressionAlgo(static_cast<Database::CompressionAlgorithm>(id)); -} - -void Kdbx4Reader::setMasterSeed(const QByteArray& data) -{ - if (data.size() != 32) { - raiseError("Invalid master seed size"); - return; - } - m_masterSeed = data; -} - -void Kdbx4Reader::setEncryptionIV(const QByteArray& data) -{ - m_encryptionIV = data; -} - -void Kdbx4Reader::setProtectedStreamKey(const QByteArray& data) -{ - m_protectedStreamKey = data; -} - -void Kdbx4Reader::setInnerRandomStreamID(const QByteArray& data) -{ - if (data.size() != 4) { - raiseError("Invalid random stream id size"); - return; - } - auto id = Endian::bytesToSizedInt<quint32>(data, KeePass2::BYTEORDER); - KeePass2::ProtectedStreamAlgo irsAlgo = KeePass2::idToProtectedStreamAlgo(id); - if (irsAlgo == KeePass2::ProtectedStreamAlgo::InvalidProtectedStreamAlgo || irsAlgo == KeePass2::ProtectedStreamAlgo::ArcFourVariant) { - raiseError("Invalid inner random stream cipher"); - return; - } - m_irsAlgo = irsAlgo; -} - -QHash<QString, QByteArray> Kdbx4Reader::binaryPool() +QHash<QString, QByteArray> Kdbx4Reader::binaryPool() const { return m_binaryPool; } diff --git a/src/format/Kdbx4Reader.h b/src/format/Kdbx4Reader.h index 9d8c531ef..175af9419 100644 --- a/src/format/Kdbx4Reader.h +++ b/src/format/Kdbx4Reader.h @@ -18,48 +18,27 @@ #ifndef KEEPASSX_KDBX4READER_H #define KEEPASSX_KDBX4READER_H -#include <QCoreApplication> -#include <QHash> -#include <QString> -#include <QByteArray> +#include "format/KdbxReader.h" -#include "format/KeePass2.h" -#include "format/KeePass2Reader.h" -#include "crypto/SymmetricCipher.h" -#include "keys/CompositeKey.h" +#include <QVariantMap> -class Database; -class QIODevice; - -class Kdbx4Reader : public BaseKeePass2Reader +/** + * KDBX4 reader implementation. + */ +class Kdbx4Reader : public KdbxReader { - Q_DECLARE_TR_FUNCTIONS(Kdbx4Reader) - public: - Kdbx4Reader(); + Database* readDatabaseImpl(QIODevice* device, const QByteArray& headerData, + const CompositeKey& key, bool keepDatabase) override; + QHash<QString, QByteArray> binaryPool() const; - using BaseKeePass2Reader::readDatabase; - virtual Database* readDatabase(QIODevice* device, const CompositeKey& key, bool keepDatabase = false) override; - - QHash<QString, QByteArray> binaryPool(); +protected: + bool readHeaderField(StoreDataStream& headerStream) override; private: - bool readHeaderField(QIODevice* device); bool readInnerHeaderField(QIODevice* device); QVariantMap readVariantMap(QIODevice* device); - void setCipher(const QByteArray& data); - void setCompressionFlags(const QByteArray& data); - void setMasterSeed(const QByteArray& data); - void setEncryptionIV(const QByteArray& data); - void setProtectedStreamKey(const QByteArray& data); - void setInnerRandomStreamID(const QByteArray& data); - - QIODevice* m_device; - - Database* m_db; - QByteArray m_masterSeed; - QByteArray m_encryptionIV; QHash<QString, QByteArray> m_binaryPool; }; diff --git a/src/format/Kdbx4Writer.cpp b/src/format/Kdbx4Writer.cpp index fbd590563..e151ab965 100644 --- a/src/format/Kdbx4Writer.cpp +++ b/src/format/Kdbx4Writer.cpp @@ -19,25 +19,16 @@ #include <QBuffer> #include <QFile> -#include <QIODevice> -#include <QList> -#include <QString> #include "streams/HmacBlockStream.h" #include "core/Database.h" -#include "core/Endian.h" #include "crypto/CryptoHash.h" #include "crypto/Random.h" #include "format/KeePass2RandomStream.h" -#include "format/Kdbx4XmlWriter.h" +#include "format/KdbxXmlWriter.h" #include "streams/QtIOCompressor" #include "streams/SymmetricCipherStream.h" -Kdbx4Writer::Kdbx4Writer() - : m_device(nullptr) -{ -} - bool Kdbx4Writer::writeDatabase(QIODevice* device, Database* db) { m_error = false; @@ -45,12 +36,12 @@ bool Kdbx4Writer::writeDatabase(QIODevice* device, Database* db) SymmetricCipher::Algorithm algo = SymmetricCipher::cipherToAlgorithm(db->cipher()); if (algo == SymmetricCipher::InvalidAlgorithm) { - raiseError("Invalid symmetric cipher algorithm."); + raiseError(tr("Invalid symmetric cipher algorithm.")); return false; } int ivSize = SymmetricCipher::algorithmIvSize(algo); if (ivSize < 0) { - raiseError("Invalid symmetric cipher IV size."); + raiseError(tr("Invalid symmetric cipher IV size.")); return false; } @@ -70,6 +61,7 @@ bool Kdbx4Writer::writeDatabase(QIODevice* device, Database* db) return false; } + // generate transformed master key CryptoHash hash(CryptoHash::Sha256); hash.addData(masterSeed); hash.addData(db->challengeResponseKey()); @@ -77,48 +69,49 @@ bool Kdbx4Writer::writeDatabase(QIODevice* device, Database* db) hash.addData(db->transformedMasterKey()); QByteArray finalKey = hash.result(); + // write header QByteArray headerData; { QBuffer header; header.open(QIODevice::WriteOnly); - m_device = &header; - CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes(KeePass2::SIGNATURE_1, KeePass2::BYTEORDER))); - CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes(KeePass2::SIGNATURE_2, KeePass2::BYTEORDER))); - CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes(KeePass2::FILE_VERSION_4, KeePass2::BYTEORDER))); - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::CipherID, db->cipher().toByteArray())); - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::CompressionFlags, - Endian::sizedIntToBytes(static_cast<int>(db->compressionAlgo()), - KeePass2::BYTEORDER))); - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::MasterSeed, masterSeed)); - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::EncryptionIV, encryptionIV)); - // Convert current Kdf to basic parameters + writeMagicNumbers(&header, KeePass2::SIGNATURE_1, KeePass2::SIGNATURE_2, KeePass2::FILE_VERSION_4); + + CHECK_RETURN_FALSE(writeHeaderField<quint32>(&header, KeePass2::HeaderFieldID::CipherID, db->cipher().toByteArray())); + CHECK_RETURN_FALSE(writeHeaderField<quint32>(&header, KeePass2::HeaderFieldID::CompressionFlags, + Endian::sizedIntToBytes(static_cast<int>(db->compressionAlgo()), + KeePass2::BYTEORDER))); + CHECK_RETURN_FALSE(writeHeaderField<quint32>(&header, KeePass2::HeaderFieldID::MasterSeed, masterSeed)); + CHECK_RETURN_FALSE(writeHeaderField<quint32>(&header, KeePass2::HeaderFieldID::EncryptionIV, encryptionIV)); + + // convert current Kdf to basic parameters QVariantMap kdfParams = KeePass2::kdfToParameters(db->kdf()); - QByteArray kdfParamBytes; if (!serializeVariantMap(kdfParams, kdfParamBytes)) { - raiseError("Failed to serialise KDF parameters variant map"); + raiseError(tr("Failed to serialize KDF parameters variant map")); return false; } QByteArray publicCustomData = db->publicCustomData(); - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::KdfParameters, kdfParamBytes)); + CHECK_RETURN_FALSE(writeHeaderField<quint32>(&header, KeePass2::HeaderFieldID::KdfParameters, kdfParamBytes)); if (!publicCustomData.isEmpty()) { - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::PublicCustomData, publicCustomData)); + CHECK_RETURN_FALSE(writeHeaderField<quint32>(&header, KeePass2::HeaderFieldID::PublicCustomData, publicCustomData)); } - CHECK_RETURN_FALSE(writeHeaderField(KeePass2::HeaderFieldID::EndOfHeader, endOfHeader)); + CHECK_RETURN_FALSE(writeHeaderField<quint32>(&header, KeePass2::HeaderFieldID::EndOfHeader, endOfHeader)); header.close(); - m_device = device; headerData = header.data(); } - CHECK_RETURN_FALSE(writeData(headerData)); + CHECK_RETURN_FALSE(writeData(device, headerData)); + + // hash header QByteArray headerHash = CryptoHash::hash(headerData, CryptoHash::Sha256); + // write HMAC-authenticated cipher stream QByteArray hmacKey = KeePass2::hmacKey(masterSeed, db->transformedMasterKey()); QByteArray headerHmac = CryptoHash::hmac(headerData, HmacBlockStream::getHmacKey(UINT64_MAX, hmacKey), CryptoHash::Sha256); - CHECK_RETURN_FALSE(writeData(headerHash)); - CHECK_RETURN_FALSE(writeData(headerHmac)); + CHECK_RETURN_FALSE(writeData(device, headerHash)); + CHECK_RETURN_FALSE(writeData(device, headerHmac)); QScopedPointer<HmacBlockStream> hmacBlockStream; QScopedPointer<SymmetricCipherStream> cipherStream; @@ -130,8 +123,8 @@ bool Kdbx4Writer::writeDatabase(QIODevice* device, Database* db) } cipherStream.reset(new SymmetricCipherStream(hmacBlockStream.data(), algo, - SymmetricCipher::algorithmMode(algo), - SymmetricCipher::Encrypt)); + SymmetricCipher::algorithmMode(algo), + SymmetricCipher::Encrypt)); if (!cipherStream->init(finalKey, encryptionIV)) { raiseError(cipherStream->errorString()); @@ -142,9 +135,11 @@ bool Kdbx4Writer::writeDatabase(QIODevice* device, Database* db) return false; } + QIODevice* outputDevice = nullptr; QScopedPointer<QtIOCompressor> ioCompressor; + if (db->compressionAlgo() == Database::CompressionNone) { - m_device = cipherStream.data(); + outputDevice = cipherStream.data(); } else { ioCompressor.reset(new QtIOCompressor(cipherStream.data())); ioCompressor->setStreamFormat(QtIOCompressor::GzipFormat); @@ -152,30 +147,18 @@ bool Kdbx4Writer::writeDatabase(QIODevice* device, Database* db) raiseError(ioCompressor->errorString()); return false; } - m_device = ioCompressor.data(); + outputDevice = ioCompressor.data(); } - QHash<QByteArray, int> idMap; + Q_ASSERT(outputDevice); - CHECK_RETURN_FALSE(writeInnerHeaderField(KeePass2::InnerHeaderFieldID::InnerRandomStreamID, + CHECK_RETURN_FALSE(writeInnerHeaderField(outputDevice, KeePass2::InnerHeaderFieldID::InnerRandomStreamID, Endian::sizedIntToBytes(static_cast<int>(KeePass2::ProtectedStreamAlgo::ChaCha20), KeePass2::BYTEORDER))); - CHECK_RETURN_FALSE(writeInnerHeaderField(KeePass2::InnerHeaderFieldID::InnerRandomStreamKey, + CHECK_RETURN_FALSE(writeInnerHeaderField(outputDevice, KeePass2::InnerHeaderFieldID::InnerRandomStreamKey, protectedStreamKey)); - const QList<Entry*> allEntries = db->rootGroup()->entriesRecursive(true); - int nextId = 0; - for (Entry* entry : allEntries) { - const QList<QString> attachmentKeys = entry->attachments()->keys(); - for (const QString& key : attachmentKeys) { - QByteArray data = entry->attachments()->value(key); - if (!idMap.contains(data)) { - CHECK_RETURN_FALSE(writeBinary(data)); - idMap.insert(data, nextId++); - } - } - } - CHECK_RETURN_FALSE(writeInnerHeaderField(KeePass2::InnerHeaderFieldID::End, QByteArray())); + CHECK_RETURN_FALSE(writeInnerHeaderField(outputDevice, KeePass2::InnerHeaderFieldID::End, QByteArray())); KeePass2RandomStream randomStream(KeePass2::ProtectedStreamAlgo::ChaCha20); if (!randomStream.init(protectedStreamKey)) { @@ -183,8 +166,8 @@ bool Kdbx4Writer::writeDatabase(QIODevice* device, Database* db) return false; } - Kdbx4XmlWriter xmlWriter(KeePass2::FILE_VERSION_4, idMap); - xmlWriter.writeDatabase(m_device, db, &randomStream, headerHash); + KdbxXmlWriter xmlWriter(KeePass2::FILE_VERSION_4); + xmlWriter.writeDatabase(outputDevice, db, &randomStream, headerHash); // Explicitly close/reset streams so they are flushed and we can detect // errors. QIODevice::close() resets errorString() etc. @@ -208,61 +191,64 @@ bool Kdbx4Writer::writeDatabase(QIODevice* device, Database* db) return true; } -bool Kdbx4Writer::writeData(const QByteArray& data) -{ - if (m_device->write(data) != data.size()) { - raiseError(m_device->errorString()); - return false; - } - return true; -} - -bool Kdbx4Writer::writeHeaderField(KeePass2::HeaderFieldID fieldId, const QByteArray& data) +/** + * Write KDBX4 inner header field. + * + * @param device output device + * @param fieldId field identifier + * @param data header payload + * @return true on success + */ +bool Kdbx4Writer::writeInnerHeaderField(QIODevice* device, KeePass2::InnerHeaderFieldID fieldId, const QByteArray& data) { QByteArray fieldIdArr; fieldIdArr[0] = static_cast<char>(fieldId); - CHECK_RETURN_FALSE(writeData(fieldIdArr)); - CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes(static_cast<quint32>(data.size()), KeePass2::BYTEORDER))); - CHECK_RETURN_FALSE(writeData(data)); + CHECK_RETURN_FALSE(writeData(device, fieldIdArr)); + CHECK_RETURN_FALSE(writeData(device, Endian::sizedIntToBytes(static_cast<quint32>(data.size()), KeePass2::BYTEORDER))); + CHECK_RETURN_FALSE(writeData(device, data)); return true; } -bool Kdbx4Writer::writeInnerHeaderField(KeePass2::InnerHeaderFieldID fieldId, const QByteArray& data) -{ - QByteArray fieldIdArr; - fieldIdArr[0] = static_cast<char>(fieldId); - CHECK_RETURN_FALSE(writeData(fieldIdArr)); - CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes(static_cast<quint32>(data.size()), KeePass2::BYTEORDER))); - CHECK_RETURN_FALSE(writeData(data)); - - return true; -} - -bool Kdbx4Writer::writeBinary(const QByteArray& data) +/** + * Write binary header field.. + * + * @param device output device + * @param fieldId field identifier + * @param data header payload + * @return true on success + */ +bool Kdbx4Writer::writeBinary(QIODevice* device, const QByteArray& data) { QByteArray fieldIdArr; fieldIdArr[0] = static_cast<char>(KeePass2::InnerHeaderFieldID::Binary); - CHECK_RETURN_FALSE(writeData(fieldIdArr)); - CHECK_RETURN_FALSE(writeData(Endian::sizedIntToBytes(static_cast<quint32>(data.size() + 1), KeePass2::BYTEORDER))); - CHECK_RETURN_FALSE(writeData(QByteArray(1, '\1'))); - CHECK_RETURN_FALSE(writeData(data)); + CHECK_RETURN_FALSE(writeData(device, fieldIdArr)); + CHECK_RETURN_FALSE(writeData(device, Endian::sizedIntToBytes(static_cast<quint32>(data.size() + 1), KeePass2::BYTEORDER))); + CHECK_RETURN_FALSE(writeData(device, QByteArray(1, '\1'))); + CHECK_RETURN_FALSE(writeData(device, data)); return true; } -bool Kdbx4Writer::serializeVariantMap(const QVariantMap& p, QByteArray& o) +/** + * Serialize KDF parameter variant map to byte array. + * + * @param map input variant map + * @param outputBytes output byte array + * @return true on success + */ +bool Kdbx4Writer::serializeVariantMap(const QVariantMap& map, QByteArray& outputBytes) { - QBuffer buf(&o); + QBuffer buf(&outputBytes); buf.open(QIODevice::WriteOnly); CHECK_RETURN_FALSE(buf.write(Endian::sizedIntToBytes(KeePass2::VARIANTMAP_VERSION, KeePass2::BYTEORDER)) == 2); bool ok; - QList<QString> keys = p.keys(); + QList<QString> keys = map.keys(); for (const auto& k : keys) { KeePass2::VariantMapFieldType fieldType; QByteArray data; - QVariant v = p.value(k); + QVariant v = map.value(k); switch (static_cast<QMetaType::Type>(v.type())) { case QMetaType::Type::Int: fieldType = KeePass2::VariantMapFieldType::Int32; diff --git a/src/format/Kdbx4Writer.h b/src/format/Kdbx4Writer.h index 7bb20e0f1..097a7864a 100644 --- a/src/format/Kdbx4Writer.h +++ b/src/format/Kdbx4Writer.h @@ -18,35 +18,20 @@ #ifndef KEEPASSX_KDBX4WRITER_H #define KEEPASSX_KDBX4WRITER_H -#include <QCoreApplication> +#include "KdbxWriter.h" -#include "format/KeePass2.h" -#include "format/KeePass2Writer.h" -#include "keys/CompositeKey.h" - -class Database; -class QIODevice; - -class Kdbx4Writer : public BaseKeePass2Writer +/** + * KDBX4 writer implementation. + */ +class Kdbx4Writer : public KdbxWriter { - Q_DECLARE_TR_FUNCTIONS(Kdbx4Writer) - public: - Kdbx4Writer(); - - using BaseKeePass2Writer::writeDatabase; - bool writeDatabase(QIODevice* device, Database* db); + bool writeDatabase(QIODevice* device, Database* db) override; private: - bool writeData(const QByteArray& data); - bool writeHeaderField(KeePass2::HeaderFieldID fieldId, const QByteArray& data); - bool writeInnerHeaderField(KeePass2::InnerHeaderFieldID fieldId, const QByteArray& data); - - QIODevice* m_device; - - bool writeBinary(const QByteArray& data); - - static bool serializeVariantMap(const QVariantMap& p, QByteArray& o); + bool writeInnerHeaderField(QIODevice* device, KeePass2::InnerHeaderFieldID fieldId, const QByteArray& data); + bool writeBinary(QIODevice* device, const QByteArray& data); + static bool serializeVariantMap(const QVariantMap& map, QByteArray& outputBytes); }; #endif // KEEPASSX_KDBX4WRITER_H diff --git a/src/format/Kdbx4XmlReader.h b/src/format/Kdbx4XmlReader.h deleted file mode 100644 index 229ac7425..000000000 --- a/src/format/Kdbx4XmlReader.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 or (at your option) - * version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef KEEPASSX_KDBX4XMLREADER_H -#define KEEPASSX_KDBX4XMLREADER_H - -#include <QColor> -#include <QCoreApplication> -#include <QDateTime> -#include <QHash> -#include <QPair> -#include <QXmlStreamReader> - -#include "core/TimeInfo.h" -#include "core/Uuid.h" -#include "core/Group.h" - -class Database; -class Entry; -class KeePass2RandomStream; -class Metadata; - -class Kdbx4XmlReader -{ - Q_DECLARE_TR_FUNCTIONS(Kdbx4XmlReader) - -public: - Kdbx4XmlReader(); - Kdbx4XmlReader(QHash<QString, QByteArray>& binaryPool); - Database* readDatabase(QIODevice* device); - void readDatabase(QIODevice* device, Database* db, KeePass2RandomStream* randomStream = nullptr); - Database* readDatabase(const QString& filename); - bool hasError(); - QString errorString(); - QByteArray headerHash(); - void setStrictMode(bool strictMode); - -private: - bool parseKeePassFile(); - void parseMeta(); - void parseMemoryProtection(); - void parseCustomIcons(); - void parseIcon(); - void parseBinaries(); - void parseCustomData(); - void parseCustomDataItem(); - bool parseRoot(); - Group* parseGroup(); - void parseDeletedObjects(); - void parseDeletedObject(); - Entry* parseEntry(bool history); - void parseEntryString(Entry* entry); - QPair<QString, QString> parseEntryBinary(Entry* entry); - void parseAutoType(Entry* entry); - void parseAutoTypeAssoc(Entry* entry); - QList<Entry*> parseEntryHistory(); - TimeInfo parseTimes(); - - QString readString(); - bool readBool(); - QDateTime readDateTime(); - QColor readColor(); - int readNumber(); - Uuid readUuid(); - QByteArray readBinary(); - QByteArray readCompressedBinary(); - - Group* getGroup(const Uuid& uuid); - Entry* getEntry(const Uuid& uuid); - void raiseError(const QString& errorMessage); - void skipCurrentElement(); - - QXmlStreamReader m_xml; - KeePass2RandomStream* m_randomStream; - Database* m_db; - Metadata* m_meta; - QScopedPointer<Group> m_tmpParent; - QHash<Uuid, Group*> m_groups; - QHash<Uuid, Entry*> m_entries; - QHash<QString, QByteArray> m_binaryPool; - QHash<QString, QPair<Entry*, QString> > m_binaryMap; - QByteArray m_headerHash; - bool m_error; - QString m_errorStr; - bool m_strictMode; -}; - -#endif // KEEPASSX_KDBX4XMLREADER_H diff --git a/src/format/KdbxReader.cpp b/src/format/KdbxReader.cpp new file mode 100644 index 000000000..36ff6d197 --- /dev/null +++ b/src/format/KdbxReader.cpp @@ -0,0 +1,267 @@ +/* + * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "KdbxReader.h" +#include "core/Database.h" +#include "core/Endian.h" + +/** + * Read KDBX magic header numbers from a device. + * + * @param device input device + * @param sig1 KDBX signature 1 + * @param sig2 KDBX signature 2 + * @param version KDBX version + * @return true if magic numbers were read successfully + */ +bool KdbxReader::readMagicNumbers(QIODevice* device, quint32& sig1, quint32& sig2, quint32& version) +{ + bool ok; + sig1 = Endian::readSizedInt<quint32>(device, KeePass2::BYTEORDER, &ok); + if (!ok) { + return false; + } + + sig2 = Endian::readSizedInt<quint32>(device, KeePass2::BYTEORDER, &ok); + if (!ok) { + return false; + } + + version = Endian::readSizedInt<quint32>(device, KeePass2::BYTEORDER, &ok); + + return ok; +} + +/** + * Read KDBX stream from device. + * The device will automatically be reset to 0 before reading. + * + * @param device input device + * @param key database encryption composite key + * @param keepDatabase keep database in case of read failure + * @return pointer to the read database, nullptr on failure + */ +Database* KdbxReader::readDatabase(QIODevice* device, const CompositeKey& key, bool keepDatabase) +{ + device->seek(0); + + m_db.reset(new Database()); + m_xmlData.clear(); + m_masterSeed.clear(); + m_encryptionIV.clear(); + m_streamStartBytes.clear(); + m_protectedStreamKey.clear(); + + StoreDataStream headerStream(device); + headerStream.open(QIODevice::ReadOnly); + + // read KDBX magic numbers + quint32 sig1, sig2; + readMagicNumbers(&headerStream, sig1, sig2, m_kdbxVersion); + m_kdbxSignature = qMakePair(sig1, sig2); + + // mask out minor version + m_kdbxVersion &= KeePass2::FILE_VERSION_CRITICAL_MASK; + + // read header fields + while (readHeaderField(headerStream) && !hasError()) { + } + + headerStream.close(); + + if (hasError()) { + return nullptr; + } + + // read payload + return readDatabaseImpl(device, headerStream.storedData(), key, keepDatabase); +} + +bool KdbxReader::hasError() const +{ + return m_error; +} + +QString KdbxReader::errorString() const +{ + return m_errorStr; +} + +bool KdbxReader::saveXml() const +{ + return m_saveXml; +} + +void KdbxReader::setSaveXml(bool save) +{ + m_saveXml = save; +} + +QByteArray KdbxReader::xmlData() const +{ + return m_xmlData; +} + +QByteArray KdbxReader::streamKey() const +{ + return m_protectedStreamKey; +} + +KeePass2::ProtectedStreamAlgo KdbxReader::protectedStreamAlgo() const +{ + return m_irsAlgo; +} + +/** + * @param data stream cipher UUID as bytes + */ +void KdbxReader::setCipher(const QByteArray& data) +{ + if (data.size() != Uuid::Length) { + raiseError(tr("Invalid cipher uuid length")); + return; + } + + Uuid uuid(data); + + if (SymmetricCipher::cipherToAlgorithm(uuid) == SymmetricCipher::InvalidAlgorithm) { + raiseError(tr("Unsupported cipher")); + return; + } + m_db->setCipher(uuid); +} + +/** + * @param data compression flags as bytes + */ +void KdbxReader::setCompressionFlags(const QByteArray& data) +{ + if (data.size() != 4) { + raiseError(tr("Invalid compression flags length")); + return; + } + auto id = Endian::bytesToSizedInt<quint32>(data, KeePass2::BYTEORDER); + + if (id > Database::CompressionAlgorithmMax) { + raiseError(tr("Unsupported compression algorithm")); + return; + } + m_db->setCompressionAlgo(static_cast<Database::CompressionAlgorithm>(id)); +} + +/** + * @param data master seed as bytes + */ +void KdbxReader::setMasterSeed(const QByteArray& data) +{ + if (data.size() != 32) { + raiseError(tr("Invalid master seed size")); + return; + } + m_masterSeed = data; +} + +/** + * @param data KDF seed as bytes + */ +void KdbxReader::setTransformSeed(const QByteArray& data) +{ + if (data.size() != 32) { + raiseError(tr("Invalid transform seed size")); + return; + } + + auto kdf = m_db->kdf(); + if (!kdf.isNull()) { + kdf->setSeed(data); + } +} + +/** + * @param data KDF transform rounds as bytes + */ +void KdbxReader::setTransformRounds(const QByteArray& data) +{ + if (data.size() != 8) { + raiseError(tr("Invalid transform rounds size")); + return; + } + + auto rounds = Endian::bytesToSizedInt<quint64>(data, KeePass2::BYTEORDER); + auto kdf = m_db->kdf(); + if (!kdf.isNull()) { + kdf->setRounds(static_cast<int>(rounds)); + } +} + +/** + * @param data cipher stream IV as bytes + */ +void KdbxReader::setEncryptionIV(const QByteArray& data) +{ + m_encryptionIV = data; +} + +/** + * @param data key for random (inner) stream as bytes + */ +void KdbxReader::setProtectedStreamKey(const QByteArray& data) +{ + m_protectedStreamKey = data; +} + +/** + * @param data start bytes for cipher stream + */ +void KdbxReader::setStreamStartBytes(const QByteArray& data) +{ + if (data.size() != 32) { + raiseError(tr("Invalid start bytes size")); + return; + } + m_streamStartBytes = data; +} + +/** + * @param data id of inner cipher stream algorithm + */ +void KdbxReader::setInnerRandomStreamID(const QByteArray& data) +{ + if (data.size() != 4) { + raiseError(tr("Invalid random stream id size")); + return; + } + auto id = Endian::bytesToSizedInt<quint32>(data, KeePass2::BYTEORDER); + KeePass2::ProtectedStreamAlgo irsAlgo = KeePass2::idToProtectedStreamAlgo(id); + if (irsAlgo == KeePass2::ProtectedStreamAlgo::InvalidProtectedStreamAlgo || + irsAlgo == KeePass2::ProtectedStreamAlgo::ArcFourVariant) { + raiseError(tr("Invalid inner random stream cipher")); + return; + } + m_irsAlgo = irsAlgo; +} + +/** + * Raise an error. Use in case of an unexpected read error. + * + * @param errorMessage error message + */ +void KdbxReader::raiseError(const QString& errorMessage) +{ + m_error = true; + m_errorStr = errorMessage; +} diff --git a/src/format/KdbxReader.h b/src/format/KdbxReader.h new file mode 100644 index 000000000..994cfb7ef --- /dev/null +++ b/src/format/KdbxReader.h @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef KEEPASSXC_KDBXREADER_H +#define KEEPASSXC_KDBXREADER_H + +#include "KeePass2.h" +#include "keys/CompositeKey.h" +#include "streams/StoreDataStream.h" + +#include <QCoreApplication> +#include <QPointer> + +class Database; +class QIODevice; + +/** + * Abstract KDBX reader base class. + */ +class KdbxReader +{ +Q_DECLARE_TR_FUNCTIONS(KdbxReader) + +public: + KdbxReader() = default; + virtual ~KdbxReader() = default; + + static bool readMagicNumbers(QIODevice* device, quint32& sig1, quint32& sig2, quint32& version); + Database* readDatabase(QIODevice* device, const CompositeKey& key, bool keepDatabase = false); + + bool hasError() const; + QString errorString() const; + + bool saveXml() const; + void setSaveXml(bool save); + QByteArray xmlData() const; + QByteArray streamKey() const; + KeePass2::ProtectedStreamAlgo protectedStreamAlgo() const; + +protected: + /** + * Concrete reader implementation for reading database from device. + * + * @param device input device at the payload starting position + * @param KDBX header data as bytes + * @param key database encryption composite key + * @param keepDatabase keep database in case of read failure + * @return pointer to the read database, nullptr on failure + */ + virtual Database* readDatabaseImpl(QIODevice* device, const QByteArray& headerData, + const CompositeKey& key, bool keepDatabase) = 0; + + /** + * Read next header field from stream. + * + * @param headerStream input header stream + * @return true if there are more header fields + */ + virtual bool readHeaderField(StoreDataStream& headerStream) = 0; + + virtual void setCipher(const QByteArray& data); + virtual void setCompressionFlags(const QByteArray& data); + virtual void setMasterSeed(const QByteArray& data); + virtual void setTransformSeed(const QByteArray& data); + virtual void setTransformRounds(const QByteArray& data); + virtual void setEncryptionIV(const QByteArray& data); + virtual void setProtectedStreamKey(const QByteArray& data); + virtual void setStreamStartBytes(const QByteArray& data); + virtual void setInnerRandomStreamID(const QByteArray& data); + + void raiseError(const QString& errorMessage); + + QScopedPointer<Database> m_db; + + QPair<quint32, quint32> m_kdbxSignature; + quint32 m_kdbxVersion = 0; + + QByteArray m_masterSeed; + QByteArray m_encryptionIV; + QByteArray m_streamStartBytes; + QByteArray m_protectedStreamKey; + KeePass2::ProtectedStreamAlgo m_irsAlgo = KeePass2::ProtectedStreamAlgo::InvalidProtectedStreamAlgo; + + QByteArray m_xmlData; + +private: + bool m_saveXml = false; + bool m_error = false; + QString m_errorStr = ""; +}; + + +#endif //KEEPASSXC_KDBXREADER_H diff --git a/src/format/KdbxWriter.cpp b/src/format/KdbxWriter.cpp new file mode 100644 index 000000000..6016cf3a6 --- /dev/null +++ b/src/format/KdbxWriter.cpp @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "KdbxWriter.h" + +bool KdbxWriter::hasError() const +{ + return m_error; +} + +QString KdbxWriter::errorString() const +{ + return m_errorStr; +} + +/** + * Write KDBX magic header numbers to a device. + * + * @param device output device + * @param sig1 KDBX signature 1 + * @param sig2 KDBX signature 2 + * @param version KDBX version + * @return true if magic numbers were written successfully + */ +bool KdbxWriter::writeMagicNumbers(QIODevice* device, quint32 sig1, quint32 sig2, quint32 version) +{ + CHECK_RETURN_FALSE(writeData(device, Endian::sizedIntToBytes<qint32>(sig1, KeePass2::BYTEORDER))); + CHECK_RETURN_FALSE(writeData(device, Endian::sizedIntToBytes<qint32>(sig2, KeePass2::BYTEORDER))); + CHECK_RETURN_FALSE(writeData(device, Endian::sizedIntToBytes<qint32>(version, KeePass2::BYTEORDER))); + + return true; +} + +/** + * Helper method for writing bytes to the device and raising an error + * in case of write failure. + * + * @param device output device + * @param data byte contents + * @return true on success + */ +bool KdbxWriter::writeData(QIODevice* device, const QByteArray& data) +{ + if (device->write(data) != data.size()) { + raiseError(device->errorString()); + return false; + } + return true; +} + +/** + * Raise an error. Use in case of an unexpected write error. + * + * @param errorMessage error message + */ +void KdbxWriter::raiseError(const QString& errorMessage) +{ + m_error = true; + m_errorStr = errorMessage; +} diff --git a/src/format/KdbxWriter.h b/src/format/KdbxWriter.h new file mode 100644 index 000000000..5aa41766e --- /dev/null +++ b/src/format/KdbxWriter.h @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef KEEPASSXC_KDBXWRITER_H +#define KEEPASSXC_KDBXWRITER_H + +#include "KeePass2.h" +#include "core/Endian.h" + +#include <QCoreApplication> + +#define CHECK_RETURN_FALSE(x) if (!(x)) return false; + +class QIODevice; +class Database; + +/** + * Abstract KDBX writer base class. + */ +class KdbxWriter +{ +Q_DECLARE_TR_FUNCTIONS(KdbxWriter) + +public: + KdbxWriter() = default; + virtual ~KdbxWriter() = default; + + bool writeMagicNumbers(QIODevice* device, quint32 sig1, quint32 sig2, quint32 version); + + /** + * Write a database to a device in KDBX format. + * + * @param device output device + * @param db source database + * @return true on success + */ + virtual bool writeDatabase(QIODevice* device, Database* db) = 0; + + bool hasError() const; + QString errorString() const; + +protected: + + /** + * Helper method for writing a KDBX header field to a device. + * + * @tparam SizedQInt field width + * @param device output device + * @param fieldId field identifier + * @param data field contents + * @return true on success + */ + template <typename SizedQInt> + bool writeHeaderField(QIODevice* device, KeePass2::HeaderFieldID fieldId, const QByteArray& data) + { + Q_ASSERT(static_cast<unsigned long>(data.size()) < (1ull << (sizeof(SizedQInt) * 8))); + + QByteArray fieldIdArr; + fieldIdArr[0] = static_cast<char>(fieldId); + CHECK_RETURN_FALSE(writeData(device, fieldIdArr)); + CHECK_RETURN_FALSE(writeData(device, Endian::sizedIntToBytes<SizedQInt>(static_cast<SizedQInt>(data.size()), + KeePass2::BYTEORDER))); + CHECK_RETURN_FALSE(writeData(device, data)); + + return true; + } + + bool writeData(QIODevice* device, const QByteArray& data); + void raiseError(const QString& errorMessage); + + bool m_error = false; + QString m_errorStr = ""; +}; + + +#endif //KEEPASSXC_KDBXWRITER_H diff --git a/src/format/Kdbx4XmlReader.cpp b/src/format/KdbxXmlReader.cpp similarity index 82% rename from src/format/Kdbx4XmlReader.cpp rename to src/format/KdbxXmlReader.cpp index 9f6ce02c3..be692abe3 100644 --- a/src/format/Kdbx4XmlReader.cpp +++ b/src/format/KdbxXmlReader.cpp @@ -1,56 +1,86 @@ /* - * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org> * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 or (at your option) - * version 3 of the License. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include "Kdbx4XmlReader.h" - -#include <QBuffer> -#include <QFile> - -#include "core/Endian.h" -#include "core/DatabaseIcons.h" -#include "core/Metadata.h" +#include "KdbxXmlReader.h" +#include "KeePass2RandomStream.h" +#include "core/Global.h" #include "core/Tools.h" -#include "format/KeePass2RandomStream.h" +#include "core/Entry.h" +#include "core/Group.h" +#include "core/DatabaseIcons.h" +#include "core/Endian.h" #include "streams/QtIOCompressor" -typedef QPair<QString, QString> StringPair; +#include <QFile> +#include <QBuffer> -Kdbx4XmlReader::Kdbx4XmlReader() - : m_randomStream(nullptr) - , m_db(nullptr) - , m_meta(nullptr) - , m_tmpParent(nullptr) - , m_error(false) - , m_strictMode(false) +/** + * @param version KDBX version + */ +KdbxXmlReader::KdbxXmlReader(quint32 version) + : m_kdbxVersion(version) { } -Kdbx4XmlReader::Kdbx4XmlReader(QHash<QString, QByteArray>& binaryPool) - : Kdbx4XmlReader() +/** + * @param version KDBX version + * @param binaryPool binary pool + */ +KdbxXmlReader::KdbxXmlReader(quint32 version, QHash<QString, QByteArray>& binaryPool) + : m_kdbxVersion(version) + , m_binaryPool(binaryPool) { - m_binaryPool = binaryPool; } -void Kdbx4XmlReader::setStrictMode(bool strictMode) +/** + * Read XML contents from a file into a new database. + * + * @param device input file + * @return pointer to the new database + */ +Database* KdbxXmlReader::readDatabase(const QString& filename) { - m_strictMode = strictMode; + QFile file(filename); + file.open(QIODevice::ReadOnly); + return readDatabase(&file); } -void Kdbx4XmlReader::readDatabase(QIODevice* device, Database* db, KeePass2RandomStream* randomStream) +/** + * Read XML stream from a device into a new database. + * + * @param device input device + * @return pointer to the new database + */ +Database* KdbxXmlReader::readDatabase(QIODevice* device) +{ + auto db = new Database(); + readDatabase(device, db); + return db; +} + +/** + * Read XML contents from a device into a given database using a \link KeePass2RandomStream. + * + * @param device input device + * @param db database to read into + * @param randomStream random stream to use for decryption + */ +#include "QDebug" +void KdbxXmlReader::readDatabase(QIODevice* device, Database* db, KeePass2RandomStream* randomStream) { m_error = false; m_errorStr.clear(); @@ -70,7 +100,7 @@ void Kdbx4XmlReader::readDatabase(QIODevice* device, Database* db, KeePass2Rando bool rootGroupParsed = false; if (m_xml.hasError()) { - raiseError(QString("XML parsing failure: %1").arg(m_xml.error())); + raiseError(tr("XML parsing failure: %1").arg(m_xml.error())); return; } @@ -79,17 +109,17 @@ void Kdbx4XmlReader::readDatabase(QIODevice* device, Database* db, KeePass2Rando } if (!rootGroupParsed) { - raiseError("No root group"); + raiseError(tr("No root group")); return; } if (!m_tmpParent->children().isEmpty()) { - qWarning("Kdbx4XmlReader::readDatabase: found %d invalid group reference(s)", + qWarning("KdbxXmlReader::readDatabase: found %d invalid group reference(s)", m_tmpParent->children().size()); } if (!m_tmpParent->entries().isEmpty()) { - qWarning("Kdbx4XmlReader::readDatabase: found %d invalid entry reference(s)", + qWarning("KdbxXmlReader::readDatabase: found %d invalid entry reference(s)", m_tmpParent->children().size()); } @@ -103,7 +133,7 @@ void Kdbx4XmlReader::readDatabase(QIODevice* device, Database* db, KeePass2Rando } for (const QString& key : unusedKeys) { - qWarning("Kdbx4XmlReader::readDatabase: found unused key \"%s\"", qPrintable(key)); + qWarning("KdbxXmlReader::readDatabase: found unused key \"%s\"", qPrintable(key)); } QHash<QString, QPair<Entry*, QString> >::const_iterator i; @@ -130,53 +160,46 @@ void Kdbx4XmlReader::readDatabase(QIODevice* device, Database* db, KeePass2Rando } } -Database* Kdbx4XmlReader::readDatabase(QIODevice* device) +bool KdbxXmlReader::strictMode() const { - auto db = new Database(); - readDatabase(device, db); - return db; + return m_strictMode; } -Database* Kdbx4XmlReader::readDatabase(const QString& filename) +void KdbxXmlReader::setStrictMode(bool strictMode) { - QFile file(filename); - file.open(QIODevice::ReadOnly); - return readDatabase(&file); + m_strictMode = strictMode; } -bool Kdbx4XmlReader::hasError() +bool KdbxXmlReader::hasError() const { return m_error || m_xml.hasError(); } -QString Kdbx4XmlReader::errorString() +QString KdbxXmlReader::errorString() const { if (m_error) { return m_errorStr; - } - - if (m_xml.hasError()) { + }if (m_xml.hasError()) { return QString("XML error:\n%1\nLine %2, column %3") - .arg(m_xml.errorString()) - .arg(m_xml.lineNumber()) - .arg(m_xml.columnNumber()); + .arg(m_xml.errorString()) + .arg(m_xml.lineNumber()) + .arg(m_xml.columnNumber()); } - return QString(); } -void Kdbx4XmlReader::raiseError(const QString& errorMessage) +void KdbxXmlReader::raiseError(const QString& errorMessage) { m_error = true; m_errorStr = errorMessage; } -QByteArray Kdbx4XmlReader::headerHash() +QByteArray KdbxXmlReader::headerHash() const { return m_headerHash; } -bool Kdbx4XmlReader::parseKeePassFile() +bool KdbxXmlReader::parseKeePassFile() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "KeePassFile"); @@ -206,7 +229,7 @@ bool Kdbx4XmlReader::parseKeePassFile() return rootParsedSuccessfully; } -void Kdbx4XmlReader::parseMeta() +void KdbxXmlReader::parseMeta() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Meta"); @@ -281,7 +304,7 @@ void Kdbx4XmlReader::parseMeta() } } -void Kdbx4XmlReader::parseMemoryProtection() +void KdbxXmlReader::parseMemoryProtection() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "MemoryProtection"); @@ -302,7 +325,7 @@ void Kdbx4XmlReader::parseMemoryProtection() } } -void Kdbx4XmlReader::parseCustomIcons() +void KdbxXmlReader::parseCustomIcons() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "CustomIcons"); @@ -315,7 +338,7 @@ void Kdbx4XmlReader::parseCustomIcons() } } -void Kdbx4XmlReader::parseIcon() +void KdbxXmlReader::parseIcon() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Icon"); @@ -341,10 +364,10 @@ void Kdbx4XmlReader::parseIcon() return; } - raiseError("Missing icon uuid or data"); + raiseError(tr("Missing icon uuid or data")); } -void Kdbx4XmlReader::parseBinaries() +void KdbxXmlReader::parseBinaries() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Binaries"); @@ -366,7 +389,7 @@ void Kdbx4XmlReader::parseBinaries() } if (m_binaryPool.contains(id)) { - qWarning("Kdbx4XmlReader::parseBinaries: overwriting binary item \"%s\"", + qWarning("KdbxXmlReader::parseBinaries: overwriting binary item \"%s\"", qPrintable(id)); } @@ -374,7 +397,7 @@ void Kdbx4XmlReader::parseBinaries() } } -void Kdbx4XmlReader::parseCustomData() +void KdbxXmlReader::parseCustomData() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "CustomData"); @@ -387,7 +410,7 @@ void Kdbx4XmlReader::parseCustomData() } } -void Kdbx4XmlReader::parseCustomDataItem() +void KdbxXmlReader::parseCustomDataItem() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Item"); @@ -413,10 +436,10 @@ void Kdbx4XmlReader::parseCustomDataItem() return; } - raiseError("Missing custom data key or value"); + raiseError(tr("Missing custom data key or value")); } -bool Kdbx4XmlReader::parseRoot() +bool KdbxXmlReader::parseRoot() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Root"); @@ -427,7 +450,7 @@ bool Kdbx4XmlReader::parseRoot() if (m_xml.name() == "Group") { if (groupElementFound) { groupParsedSuccessfully = false; - raiseError("Multiple group elements"); + raiseError(tr("Multiple group elements")); continue; } @@ -450,7 +473,7 @@ bool Kdbx4XmlReader::parseRoot() return groupParsedSuccessfully; } -Group* Kdbx4XmlReader::parseGroup() +Group* KdbxXmlReader::parseGroup() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Group"); @@ -463,7 +486,7 @@ Group* Kdbx4XmlReader::parseGroup() Uuid uuid = readUuid(); if (uuid.isNull()) { if (m_strictMode) { - raiseError("Null group uuid"); + raiseError(tr("Null group uuid")); } else { group->setUuid(Uuid::random()); } @@ -484,11 +507,11 @@ Group* Kdbx4XmlReader::parseGroup() int iconId = readNumber(); if (iconId < 0) { if (m_strictMode) { - raiseError("Invalid group icon number"); + raiseError(tr("Invalid group icon number")); } iconId = 0; } else if (iconId >= DatabaseIcons::IconCount) { - qWarning("Kdbx4XmlReader::parseGroup: icon id \"%d\" not supported", iconId); + qWarning("KdbxXmlReader::parseGroup: icon id \"%d\" not supported", iconId); iconId = DatabaseIcons::IconCount - 1; } @@ -524,7 +547,7 @@ Group* Kdbx4XmlReader::parseGroup() } else if (str.compare("false", Qt::CaseInsensitive) == 0) { group->setAutoTypeEnabled(Group::Disable); } else { - raiseError("Invalid EnableAutoType value"); + raiseError(tr("Invalid EnableAutoType value")); } continue; } @@ -538,7 +561,7 @@ Group* Kdbx4XmlReader::parseGroup() } else if (str.compare("false", Qt::CaseInsensitive) == 0) { group->setSearchingEnabled(Group::Disable); } else { - raiseError("Invalid EnableSearching value"); + raiseError(tr("Invalid EnableSearching value")); } continue; } @@ -575,7 +598,7 @@ Group* Kdbx4XmlReader::parseGroup() group->setUpdateTimeinfo(false); delete tmpGroup; } else if (!hasError()) { - raiseError("No group uuid found"); + raiseError(tr("No group uuid found")); } for (Group* child : asConst(children)) { @@ -589,7 +612,7 @@ Group* Kdbx4XmlReader::parseGroup() return group; } -void Kdbx4XmlReader::parseDeletedObjects() +void KdbxXmlReader::parseDeletedObjects() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "DeletedObjects"); @@ -602,7 +625,7 @@ void Kdbx4XmlReader::parseDeletedObjects() } } -void Kdbx4XmlReader::parseDeletedObject() +void KdbxXmlReader::parseDeletedObject() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "DeletedObject"); @@ -613,7 +636,7 @@ void Kdbx4XmlReader::parseDeletedObject() Uuid uuid = readUuid(); if (uuid.isNull()) { if (m_strictMode) { - raiseError("Null DeleteObject uuid"); + raiseError(tr("Null DeleteObject uuid")); } continue; } @@ -633,11 +656,11 @@ void Kdbx4XmlReader::parseDeletedObject() } if (m_strictMode) { - raiseError("Missing DeletedObject uuid or time"); + raiseError(tr("Missing DeletedObject uuid or time")); } } -Entry* Kdbx4XmlReader::parseEntry(bool history) +Entry* KdbxXmlReader::parseEntry(bool history) { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Entry"); @@ -651,7 +674,7 @@ Entry* Kdbx4XmlReader::parseEntry(bool history) Uuid uuid = readUuid(); if (uuid.isNull()) { if (m_strictMode) { - raiseError("Null entry uuid"); + raiseError(tr("Null entry uuid")); } else { entry->setUuid(Uuid::random()); } @@ -664,7 +687,7 @@ Entry* Kdbx4XmlReader::parseEntry(bool history) int iconId = readNumber(); if (iconId < 0) { if (m_strictMode) { - raiseError("Invalid entry icon number"); + raiseError(tr("Invalid entry icon number")); } iconId = 0; } @@ -714,7 +737,7 @@ Entry* Kdbx4XmlReader::parseEntry(bool history) } if (m_xml.name() == "History") { if (history) { - raiseError("History element in history entry"); + raiseError(tr("History element in history entry")); } else { historyItems = parseEntryHistory(); } @@ -741,13 +764,13 @@ Entry* Kdbx4XmlReader::parseEntry(bool history) delete tmpEntry; } } else if (!hasError()) { - raiseError("No entry uuid found"); + raiseError(tr("No entry uuid found")); } for (Entry* historyItem : asConst(historyItems)) { if (historyItem->uuid() != entry->uuid()) { if (m_strictMode) { - raiseError("History element with different uuid"); + raiseError(tr("History element with different uuid")); } else { historyItem->setUuid(entry->uuid()); } @@ -762,7 +785,7 @@ Entry* Kdbx4XmlReader::parseEntry(bool history) return entry; } -void Kdbx4XmlReader::parseEntryString(Entry* entry) +void KdbxXmlReader::parseEntryString(Entry* entry) { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "String"); @@ -798,7 +821,7 @@ void Kdbx4XmlReader::parseEntryString(Entry* entry) value = QString::fromUtf8(plaintext); } } else { - raiseError("Unable to decrypt entry string"); + raiseError(tr("Unable to decrypt entry string")); continue; } } @@ -814,17 +837,17 @@ void Kdbx4XmlReader::parseEntryString(Entry* entry) if (keySet && valueSet) { // the default attributes are always there so additionally check if it's empty if (entry->attributes()->hasKey(key) && !entry->attributes()->value(key).isEmpty()) { - raiseError("Duplicate custom attribute found"); + raiseError(tr("Duplicate custom attribute found")); return; } entry->attributes()->set(key, value, protect); return; } - raiseError("Entry string key or value missing"); + raiseError(tr("Entry string key or value missing")); } -QPair<QString, QString> Kdbx4XmlReader::parseEntryBinary(Entry* entry) +QPair<QString, QString> KdbxXmlReader::parseEntryBinary(Entry* entry) { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Binary"); @@ -851,7 +874,7 @@ QPair<QString, QString> Kdbx4XmlReader::parseEntryBinary(Entry* entry) // format compatibility value = readBinary(); bool isProtected = attr.hasAttribute("Protected") - && (attr.value("Protected") == "True"); + && (attr.value("Protected") == "True"); if (isProtected && !value.isEmpty()) { if (!m_randomStream->processInPlace(value)) { @@ -868,18 +891,18 @@ QPair<QString, QString> Kdbx4XmlReader::parseEntryBinary(Entry* entry) if (keySet && valueSet) { if (entry->attachments()->hasKey(key)) { - raiseError("Duplicate attachment found"); + raiseError(tr("Duplicate attachment found")); } else { entry->attachments()->set(key, value); } } else { - raiseError("Entry binary key or value missing"); + raiseError(tr("Entry binary key or value missing")); } return poolRef; } -void Kdbx4XmlReader::parseAutoType(Entry* entry) +void KdbxXmlReader::parseAutoType(Entry* entry) { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "AutoType"); @@ -898,7 +921,7 @@ void Kdbx4XmlReader::parseAutoType(Entry* entry) } } -void Kdbx4XmlReader::parseAutoTypeAssoc(Entry* entry) +void KdbxXmlReader::parseAutoTypeAssoc(Entry* entry) { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Association"); @@ -922,10 +945,10 @@ void Kdbx4XmlReader::parseAutoTypeAssoc(Entry* entry) entry->autoTypeAssociations()->add(assoc); return; } - raiseError("Auto-type association window or sequence missing"); + raiseError(tr("Auto-type association window or sequence missing")); } -QList<Entry*> Kdbx4XmlReader::parseEntryHistory() +QList<Entry*> KdbxXmlReader::parseEntryHistory() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "History"); @@ -942,7 +965,7 @@ QList<Entry*> Kdbx4XmlReader::parseEntryHistory() return historyItems; } -TimeInfo Kdbx4XmlReader::parseTimes() +TimeInfo KdbxXmlReader::parseTimes() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Times"); @@ -970,12 +993,12 @@ TimeInfo Kdbx4XmlReader::parseTimes() return timeInfo; } -QString Kdbx4XmlReader::readString() +QString KdbxXmlReader::readString() { return m_xml.readElementText(); } -bool Kdbx4XmlReader::readBool() +bool KdbxXmlReader::readBool() { QString str = readString(); @@ -988,11 +1011,11 @@ bool Kdbx4XmlReader::readBool() if (str.length() == 0) { return false; } - raiseError("Invalid bool value"); + raiseError(tr("Invalid bool value")); return false; } -QDateTime Kdbx4XmlReader::readDateTime() +QDateTime KdbxXmlReader::readDateTime() { static QRegularExpression b64regex("^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$"); QString str = readString(); @@ -1009,13 +1032,13 @@ QDateTime Kdbx4XmlReader::readDateTime() } if (m_strictMode) { - raiseError("Invalid date time value"); + raiseError(tr("Invalid date time value")); } return QDateTime::currentDateTimeUtc(); } -QColor Kdbx4XmlReader::readColor() +QColor KdbxXmlReader::readColor() { QString colorStr = readString(); @@ -1025,7 +1048,7 @@ QColor Kdbx4XmlReader::readColor() if (colorStr.length() != 7 || colorStr[0] != '#') { if (m_strictMode) { - raiseError("Invalid color value"); + raiseError(tr("Invalid color value")); } return {}; } @@ -1037,7 +1060,7 @@ QColor Kdbx4XmlReader::readColor() int rgbPart = rgbPartStr.toInt(&ok, 16); if (!ok || rgbPart > 255) { if (m_strictMode) { - raiseError("Invalid color rgb part"); + raiseError(tr("Invalid color rgb part")); } return {}; } @@ -1054,17 +1077,17 @@ QColor Kdbx4XmlReader::readColor() return color; } -int Kdbx4XmlReader::readNumber() +int KdbxXmlReader::readNumber() { bool ok; int result = readString().toInt(&ok); if (!ok) { - raiseError("Invalid number value"); + raiseError(tr("Invalid number value")); } return result; } -Uuid Kdbx4XmlReader::readUuid() +Uuid KdbxXmlReader::readUuid() { QByteArray uuidBin = readBinary(); if (uuidBin.isEmpty()) { @@ -1072,19 +1095,19 @@ Uuid Kdbx4XmlReader::readUuid() } if (uuidBin.length() != Uuid::Length) { if (m_strictMode) { - raiseError("Invalid uuid value"); + raiseError(tr("Invalid uuid value")); } return {}; } return Uuid(uuidBin); } -QByteArray Kdbx4XmlReader::readBinary() +QByteArray KdbxXmlReader::readBinary() { return QByteArray::fromBase64(readString().toLatin1()); } -QByteArray Kdbx4XmlReader::readCompressedBinary() +QByteArray KdbxXmlReader::readCompressedBinary() { QByteArray rawData = readBinary(); @@ -1097,12 +1120,12 @@ QByteArray Kdbx4XmlReader::readCompressedBinary() QByteArray result; if (!Tools::readAllFromDevice(&compressor, result)) { - raiseError("Unable to decompress binary"); + raiseError(tr("Unable to decompress binary")); } return result; } -Group* Kdbx4XmlReader::getGroup(const Uuid& uuid) +Group* KdbxXmlReader::getGroup(const Uuid& uuid) { if (uuid.isNull()) { return nullptr; @@ -1120,7 +1143,7 @@ Group* Kdbx4XmlReader::getGroup(const Uuid& uuid) return group; } -Entry* Kdbx4XmlReader::getEntry(const Uuid& uuid) +Entry* KdbxXmlReader::getEntry(const Uuid& uuid) { if (uuid.isNull()) { return nullptr; @@ -1138,8 +1161,9 @@ Entry* Kdbx4XmlReader::getEntry(const Uuid& uuid) return entry; } -void Kdbx4XmlReader::skipCurrentElement() +void KdbxXmlReader::skipCurrentElement() { - qWarning("Kdbx4XmlReader::skipCurrentElement: skip element \"%s\"", qPrintable(m_xml.name().toString())); + qWarning("KdbxXmlReader::skipCurrentElement: skip element \"%s\"", qPrintable(m_xml.name().toString())); m_xml.skipCurrentElement(); } + diff --git a/src/format/KdbxXmlReader.h b/src/format/KdbxXmlReader.h new file mode 100644 index 000000000..e31757ccf --- /dev/null +++ b/src/format/KdbxXmlReader.h @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef KEEPASSXC_KDBXXMLREADER_H +#define KEEPASSXC_KDBXXMLREADER_H + +#include "core/Metadata.h" +#include "core/TimeInfo.h" +#include "core/Uuid.h" +#include "core/Database.h" + +#include <QCoreApplication> +#include <QString> +#include <QPair> +#include <QXmlStreamReader> + +class QIODevice; +class Group; +class Entry; +class KeePass2RandomStream; + +/** + * KDBX XML payload reader. + */ +class KdbxXmlReader +{ +Q_DECLARE_TR_FUNCTIONS(KdbxXmlReader) + +public: + explicit KdbxXmlReader(quint32 version); + explicit KdbxXmlReader(quint32 version, QHash<QString, QByteArray>& binaryPool); + virtual ~KdbxXmlReader() = default; + + virtual Database* readDatabase(const QString& filename); + virtual Database* readDatabase(QIODevice* device); + virtual void readDatabase(QIODevice* device, Database* db, KeePass2RandomStream* randomStream = nullptr); + + bool hasError() const; + QString errorString() const; + + QByteArray headerHash() const; + + bool strictMode() const; + void setStrictMode(bool strictMode); + +protected: + typedef QPair<QString, QString> StringPair; + + virtual bool parseKeePassFile(); + virtual void parseMeta(); + virtual void parseMemoryProtection(); + virtual void parseCustomIcons(); + virtual void parseIcon(); + virtual void parseBinaries(); + virtual void parseCustomData(); + virtual void parseCustomDataItem(); + virtual bool parseRoot(); + virtual Group* parseGroup(); + virtual void parseDeletedObjects(); + virtual void parseDeletedObject(); + virtual Entry* parseEntry(bool history); + virtual void parseEntryString(Entry* entry); + virtual QPair<QString, QString> parseEntryBinary(Entry* entry); + virtual void parseAutoType(Entry* entry); + virtual void parseAutoTypeAssoc(Entry* entry); + virtual QList<Entry*> parseEntryHistory(); + virtual TimeInfo parseTimes(); + + virtual QString readString(); + virtual bool readBool(); + virtual QDateTime readDateTime(); + virtual QColor readColor(); + virtual int readNumber(); + virtual Uuid readUuid(); + virtual QByteArray readBinary(); + virtual QByteArray readCompressedBinary(); + + virtual void skipCurrentElement(); + + virtual Group* getGroup(const Uuid& uuid); + virtual Entry* getEntry(const Uuid& uuid); + + virtual void raiseError(const QString& errorMessage); + + const quint32 m_kdbxVersion; + + bool m_strictMode = false; + + QPointer<Database> m_db; + QPointer<Metadata> m_meta; + KeePass2RandomStream* m_randomStream = nullptr; + QXmlStreamReader m_xml; + + QScopedPointer<Group> m_tmpParent; + QHash<Uuid, Group*> m_groups; + QHash<Uuid, Entry*> m_entries; + + QHash<QString, QByteArray> m_binaryPool; + QHash<QString, QPair<Entry*, QString> > m_binaryMap; + QByteArray m_headerHash; + + bool m_error = false; + QString m_errorStr = ""; +}; + +#endif //KEEPASSXC_KDBXXMLREADER_H diff --git a/src/format/Kdbx4XmlWriter.cpp b/src/format/KdbxXmlWriter.cpp similarity index 82% rename from src/format/Kdbx4XmlWriter.cpp rename to src/format/KdbxXmlWriter.cpp index 5c99186ca..4fe202a9f 100644 --- a/src/format/Kdbx4XmlWriter.cpp +++ b/src/format/KdbxXmlWriter.cpp @@ -15,7 +15,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include "Kdbx4XmlWriter.h" +#include "KdbxXmlWriter.h" #include <QBuffer> #include <QFile> @@ -25,51 +25,35 @@ #include "format/KeePass2RandomStream.h" #include "streams/QtIOCompressor" -Kdbx4XmlWriter::Kdbx4XmlWriter() - : Kdbx4XmlWriter(KeePass2::FILE_VERSION_3) +/** + * @param version KDBX version + */ +KdbxXmlWriter::KdbxXmlWriter(quint32 version) + : m_kdbxVersion(version) { } -Kdbx4XmlWriter::Kdbx4XmlWriter(quint32 version) - : Kdbx4XmlWriter(version, QHash<QByteArray, int>()) -{ -} - -Kdbx4XmlWriter::Kdbx4XmlWriter(quint32 version, QHash<QByteArray, int> idMap) - : m_db(nullptr) - , m_meta(nullptr) - , m_randomStream(nullptr) - , m_idMap(idMap) - , m_error(false) - , m_version(version) -{ - m_xml.setAutoFormatting(true); - m_xml.setAutoFormattingIndent(-1); // 1 tab - m_xml.setCodec("UTF-8"); -} - -void Kdbx4XmlWriter::writeDatabase(QIODevice* device, Database* db, KeePass2RandomStream* randomStream, const QByteArray& headerHash) +void KdbxXmlWriter::writeDatabase(QIODevice* device, Database* db, KeePass2RandomStream* randomStream, const QByteArray& headerHash) { m_db = db; m_meta = db->metadata(); m_randomStream = randomStream; m_headerHash = headerHash; - if (m_version < KeePass2::FILE_VERSION_4 && m_idMap.isEmpty()) { - generateIdMap(); - } + m_xml.setAutoFormatting(true); + m_xml.setAutoFormattingIndent(-1); // 1 tab + m_xml.setCodec("UTF-8"); + + generateIdMap(); m_xml.setDevice(device); - m_xml.writeStartDocument("1.0", true); - m_xml.writeStartElement("KeePassFile"); writeMetadata(); writeRoot(); m_xml.writeEndElement(); - m_xml.writeEndDocument(); if (m_xml.hasError()) { @@ -77,24 +61,24 @@ void Kdbx4XmlWriter::writeDatabase(QIODevice* device, Database* db, KeePass2Rand } } -void Kdbx4XmlWriter::writeDatabase(const QString& filename, Database* db) +void KdbxXmlWriter::writeDatabase(const QString& filename, Database* db) { QFile file(filename); file.open(QIODevice::WriteOnly|QIODevice::Truncate); writeDatabase(&file, db); } -bool Kdbx4XmlWriter::hasError() +bool KdbxXmlWriter::hasError() { return m_error; } -QString Kdbx4XmlWriter::errorString() +QString KdbxXmlWriter::errorString() { return m_errorStr; } -void Kdbx4XmlWriter::generateIdMap() +void KdbxXmlWriter::generateIdMap() { const QList<Entry*> allEntries = m_db->rootGroup()->entriesRecursive(true); int nextId = 0; @@ -110,11 +94,11 @@ void Kdbx4XmlWriter::generateIdMap() } } -void Kdbx4XmlWriter::writeMetadata() +void KdbxXmlWriter::writeMetadata() { m_xml.writeStartElement("Meta"); writeString("Generator", m_meta->generator()); - if (m_version < KeePass2::FILE_VERSION_4 && !m_headerHash.isEmpty()) { + if (m_kdbxVersion < KeePass2::FILE_VERSION_4 && !m_headerHash.isEmpty()) { writeBinary("HeaderHash", m_headerHash); } writeString("DatabaseName", m_meta->name()); @@ -139,10 +123,10 @@ void Kdbx4XmlWriter::writeMetadata() writeUuid("LastTopVisibleGroup", m_meta->lastTopVisibleGroup()); writeNumber("HistoryMaxItems", m_meta->historyMaxItems()); writeNumber("HistoryMaxSize", m_meta->historyMaxSize()); - if (m_version >= KeePass2::FILE_VERSION_4) { + if (m_kdbxVersion >= KeePass2::FILE_VERSION_4) { writeDateTime("SettingsChanged", m_meta->settingsChanged()); } - if (m_version < KeePass2::FILE_VERSION_4) { + if (m_kdbxVersion < KeePass2::FILE_VERSION_4) { writeBinaries(); } writeCustomData(); @@ -150,7 +134,7 @@ void Kdbx4XmlWriter::writeMetadata() m_xml.writeEndElement(); } -void Kdbx4XmlWriter::writeMemoryProtection() +void KdbxXmlWriter::writeMemoryProtection() { m_xml.writeStartElement("MemoryProtection"); @@ -163,7 +147,7 @@ void Kdbx4XmlWriter::writeMemoryProtection() m_xml.writeEndElement(); } -void Kdbx4XmlWriter::writeCustomIcons() +void KdbxXmlWriter::writeCustomIcons() { m_xml.writeStartElement("CustomIcons"); @@ -175,7 +159,7 @@ void Kdbx4XmlWriter::writeCustomIcons() m_xml.writeEndElement(); } -void Kdbx4XmlWriter::writeIcon(const Uuid& uuid, const QImage& icon) +void KdbxXmlWriter::writeIcon(const Uuid& uuid, const QImage& icon) { m_xml.writeStartElement("Icon"); @@ -192,7 +176,7 @@ void Kdbx4XmlWriter::writeIcon(const Uuid& uuid, const QImage& icon) m_xml.writeEndElement(); } -void Kdbx4XmlWriter::writeBinaries() +void KdbxXmlWriter::writeBinaries() { m_xml.writeStartElement("Binaries"); @@ -234,7 +218,7 @@ void Kdbx4XmlWriter::writeBinaries() m_xml.writeEndElement(); } -void Kdbx4XmlWriter::writeCustomData() +void KdbxXmlWriter::writeCustomData() { m_xml.writeStartElement("CustomData"); @@ -247,7 +231,7 @@ void Kdbx4XmlWriter::writeCustomData() m_xml.writeEndElement(); } -void Kdbx4XmlWriter::writeCustomDataItem(const QString& key, const QString& value) +void KdbxXmlWriter::writeCustomDataItem(const QString& key, const QString& value) { m_xml.writeStartElement("Item"); @@ -257,7 +241,7 @@ void Kdbx4XmlWriter::writeCustomDataItem(const QString& key, const QString& valu m_xml.writeEndElement(); } -void Kdbx4XmlWriter::writeRoot() +void KdbxXmlWriter::writeRoot() { Q_ASSERT(m_db->rootGroup()); @@ -269,7 +253,7 @@ void Kdbx4XmlWriter::writeRoot() m_xml.writeEndElement(); } -void Kdbx4XmlWriter::writeGroup(const Group* group) +void KdbxXmlWriter::writeGroup(const Group* group) { Q_ASSERT(!group->uuid().isNull()); @@ -293,12 +277,12 @@ void Kdbx4XmlWriter::writeGroup(const Group* group) writeUuid("LastTopVisibleEntry", group->lastTopVisibleEntry()); - const QList<Entry*> entryList = group->entries(); + const QList<Entry*>& entryList = group->entries(); for (const Entry* entry : entryList) { writeEntry(entry); } - const QList<Group*> children = group->children(); + const QList<Group*>& children = group->children(); for (const Group* child : children) { writeGroup(child); } @@ -306,7 +290,7 @@ void Kdbx4XmlWriter::writeGroup(const Group* group) m_xml.writeEndElement(); } -void Kdbx4XmlWriter::writeTimes(const TimeInfo& ti) +void KdbxXmlWriter::writeTimes(const TimeInfo& ti) { m_xml.writeStartElement("Times"); @@ -321,7 +305,7 @@ void Kdbx4XmlWriter::writeTimes(const TimeInfo& ti) m_xml.writeEndElement(); } -void Kdbx4XmlWriter::writeDeletedObjects() +void KdbxXmlWriter::writeDeletedObjects() { m_xml.writeStartElement("DeletedObjects"); @@ -333,7 +317,7 @@ void Kdbx4XmlWriter::writeDeletedObjects() m_xml.writeEndElement(); } -void Kdbx4XmlWriter::writeDeletedObject(const DeletedObject& delObj) +void KdbxXmlWriter::writeDeletedObject(const DeletedObject& delObj) { m_xml.writeStartElement("DeletedObject"); @@ -343,7 +327,7 @@ void Kdbx4XmlWriter::writeDeletedObject(const DeletedObject& delObj) m_xml.writeEndElement(); } -void Kdbx4XmlWriter::writeEntry(const Entry* entry) +void KdbxXmlWriter::writeEntry(const Entry* entry) { Q_ASSERT(!entry->uuid().isNull()); @@ -425,7 +409,7 @@ void Kdbx4XmlWriter::writeEntry(const Entry* entry) m_xml.writeEndElement(); } -void Kdbx4XmlWriter::writeAutoType(const Entry* entry) +void KdbxXmlWriter::writeAutoType(const Entry* entry) { m_xml.writeStartElement("AutoType"); @@ -441,7 +425,7 @@ void Kdbx4XmlWriter::writeAutoType(const Entry* entry) m_xml.writeEndElement(); } -void Kdbx4XmlWriter::writeAutoTypeAssoc(const AutoTypeAssociations::Association& assoc) +void KdbxXmlWriter::writeAutoTypeAssoc(const AutoTypeAssociations::Association& assoc) { m_xml.writeStartElement("Association"); @@ -451,7 +435,7 @@ void Kdbx4XmlWriter::writeAutoTypeAssoc(const AutoTypeAssociations::Association& m_xml.writeEndElement(); } -void Kdbx4XmlWriter::writeEntryHistory(const Entry* entry) +void KdbxXmlWriter::writeEntryHistory(const Entry* entry) { m_xml.writeStartElement("History"); @@ -463,7 +447,7 @@ void Kdbx4XmlWriter::writeEntryHistory(const Entry* entry) m_xml.writeEndElement(); } -void Kdbx4XmlWriter::writeString(const QString& qualifiedName, const QString& string) +void KdbxXmlWriter::writeString(const QString& qualifiedName, const QString& string) { if (string.isEmpty()) { m_xml.writeEmptyElement(qualifiedName); @@ -473,12 +457,12 @@ void Kdbx4XmlWriter::writeString(const QString& qualifiedName, const QString& st } } -void Kdbx4XmlWriter::writeNumber(const QString& qualifiedName, int number) +void KdbxXmlWriter::writeNumber(const QString& qualifiedName, int number) { writeString(qualifiedName, QString::number(number)); } -void Kdbx4XmlWriter::writeBool(const QString& qualifiedName, bool b) +void KdbxXmlWriter::writeBool(const QString& qualifiedName, bool b) { if (b) { writeString(qualifiedName, "True"); @@ -488,13 +472,13 @@ void Kdbx4XmlWriter::writeBool(const QString& qualifiedName, bool b) } } -void Kdbx4XmlWriter::writeDateTime(const QString& qualifiedName, const QDateTime& dateTime) +void KdbxXmlWriter::writeDateTime(const QString& qualifiedName, const QDateTime& dateTime) { Q_ASSERT(dateTime.isValid()); Q_ASSERT(dateTime.timeSpec() == Qt::UTC); QString dateTimeStr; - if (m_version < KeePass2::FILE_VERSION_4) { + if (m_kdbxVersion < KeePass2::FILE_VERSION_4) { dateTimeStr = dateTime.toString(Qt::ISODate); // Qt < 4.8 doesn't append a 'Z' at the end @@ -509,12 +493,12 @@ void Kdbx4XmlWriter::writeDateTime(const QString& qualifiedName, const QDateTime writeString(qualifiedName, dateTimeStr); } -void Kdbx4XmlWriter::writeUuid(const QString& qualifiedName, const Uuid& uuid) +void KdbxXmlWriter::writeUuid(const QString& qualifiedName, const Uuid& uuid) { writeString(qualifiedName, uuid.toBase64()); } -void Kdbx4XmlWriter::writeUuid(const QString& qualifiedName, const Group* group) +void KdbxXmlWriter::writeUuid(const QString& qualifiedName, const Group* group) { if (group) { writeUuid(qualifiedName, group->uuid()); @@ -524,7 +508,7 @@ void Kdbx4XmlWriter::writeUuid(const QString& qualifiedName, const Group* group) } } -void Kdbx4XmlWriter::writeUuid(const QString& qualifiedName, const Entry* entry) +void KdbxXmlWriter::writeUuid(const QString& qualifiedName, const Entry* entry) { if (entry) { writeUuid(qualifiedName, entry->uuid()); @@ -534,12 +518,12 @@ void Kdbx4XmlWriter::writeUuid(const QString& qualifiedName, const Entry* entry) } } -void Kdbx4XmlWriter::writeBinary(const QString& qualifiedName, const QByteArray& ba) +void KdbxXmlWriter::writeBinary(const QString& qualifiedName, const QByteArray& ba) { writeString(qualifiedName, QString::fromLatin1(ba.toBase64())); } -void Kdbx4XmlWriter::writeColor(const QString& qualifiedName, const QColor& color) +void KdbxXmlWriter::writeColor(const QString& qualifiedName, const QColor& color) { QString colorStr; @@ -552,7 +536,7 @@ void Kdbx4XmlWriter::writeColor(const QString& qualifiedName, const QColor& colo writeString(qualifiedName, colorStr); } -void Kdbx4XmlWriter::writeTriState(const QString& qualifiedName, Group::TriState triState) +void KdbxXmlWriter::writeTriState(const QString& qualifiedName, Group::TriState triState) { QString value; @@ -569,7 +553,7 @@ void Kdbx4XmlWriter::writeTriState(const QString& qualifiedName, Group::TriState writeString(qualifiedName, value); } -QString Kdbx4XmlWriter::colorPartToString(int value) +QString KdbxXmlWriter::colorPartToString(int value) { QString str = QString::number(value, 16).toUpper(); if (str.length() == 1) { @@ -579,7 +563,7 @@ QString Kdbx4XmlWriter::colorPartToString(int value) return str; } -QString Kdbx4XmlWriter::stripInvalidXml10Chars(QString str) +QString KdbxXmlWriter::stripInvalidXml10Chars(QString str) { for (int i = str.size() - 1; i >= 0; i--) { const QChar ch = str.at(i); @@ -604,7 +588,7 @@ QString Kdbx4XmlWriter::stripInvalidXml10Chars(QString str) return str; } -void Kdbx4XmlWriter::raiseError(const QString& errorMessage) +void KdbxXmlWriter::raiseError(const QString& errorMessage) { m_error = true; m_errorStr = errorMessage; diff --git a/src/format/Kdbx4XmlWriter.h b/src/format/KdbxXmlWriter.h similarity index 88% rename from src/format/Kdbx4XmlWriter.h rename to src/format/KdbxXmlWriter.h index 17d872580..6c1bd1d0b 100644 --- a/src/format/Kdbx4XmlWriter.h +++ b/src/format/KdbxXmlWriter.h @@ -15,8 +15,8 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef KEEPASSX_KDBX4XMLWRITER_H -#define KEEPASSX_KDBX4XMLWRITER_H +#ifndef KEEPASSX_KDBXXMLWRITER_H +#define KEEPASSX_KDBXXMLWRITER_H #include <QColor> #include <QDateTime> @@ -32,12 +32,11 @@ class KeePass2RandomStream; class Metadata; -class Kdbx4XmlWriter +class KdbxXmlWriter { public: - Kdbx4XmlWriter(); - Kdbx4XmlWriter(quint32 version); - Kdbx4XmlWriter(quint32 version, QHash<QByteArray, int> idMap); + explicit KdbxXmlWriter(quint32 version); + void writeDatabase(QIODevice* device, Database* db, KeePass2RandomStream* randomStream = nullptr, const QByteArray& headerHash = QByteArray()); void writeDatabase(const QString& filename, Database* db); @@ -79,15 +78,18 @@ private: void raiseError(const QString& errorMessage); + const quint32 m_kdbxVersion; + QXmlStreamWriter m_xml; - Database* m_db; - Metadata* m_meta; - KeePass2RandomStream* m_randomStream; + QPointer<Database> m_db; + QPointer<Metadata> m_meta; + KeePass2RandomStream* m_randomStream = nullptr; QHash<QByteArray, int> m_idMap; - bool m_error; - QString m_errorStr; - quint32 m_version; QByteArray m_headerHash; + + bool m_error = false; + + QString m_errorStr = ""; }; -#endif // KEEPASSX_KDBX4XMLWRITER_H +#endif // KEEPASSX_KDBXXMLWRITER_H diff --git a/src/format/KeePass2Reader.cpp b/src/format/KeePass2Reader.cpp index c213b4a18..abc7f54e1 100644 --- a/src/format/KeePass2Reader.cpp +++ b/src/format/KeePass2Reader.cpp @@ -15,29 +15,21 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include <QtGlobal> -#include <QString> -#include <QFile> - -#include "core/Endian.h" -#include "keys/CompositeKey.h" #include "format/KeePass2Reader.h" #include "format/KeePass1.h" -#include "format/KeePass2.h" #include "format/Kdbx3Reader.h" #include "format/Kdbx4Reader.h" -BaseKeePass2Reader::BaseKeePass2Reader() - : m_error(false) - , m_saveXml(false) - , m_irsAlgo(KeePass2::ProtectedStreamAlgo::InvalidProtectedStreamAlgo) -{ - m_errorStr.clear(); - m_xmlData.clear(); - m_protectedStreamKey.clear(); -} +#include <QFile> -Database* BaseKeePass2Reader::readDatabase(const QString& filename, const CompositeKey& key) +/** + * Read database from file and detect correct file format. + * + * @param filename input file + * @param key database encryption composite key + * @return pointer to the read database, nullptr on failure + */ +Database* KeePass2Reader::readDatabase(const QString& filename, const CompositeKey& key) { QFile file(filename); if (!file.open(QFile::ReadOnly)) { @@ -55,79 +47,45 @@ Database* BaseKeePass2Reader::readDatabase(const QString& filename, const Compos return db.take(); } -bool BaseKeePass2Reader::hasError() -{ - return m_error; -} - -QString BaseKeePass2Reader::errorString() -{ - return m_errorStr; -} - -void BaseKeePass2Reader::setSaveXml(bool save) -{ - m_saveXml = save; -} - -QByteArray BaseKeePass2Reader::xmlData() -{ - return m_xmlData; -} - -QByteArray BaseKeePass2Reader::streamKey() -{ - return m_protectedStreamKey; -} - -KeePass2::ProtectedStreamAlgo BaseKeePass2Reader::protectedStreamAlgo() const { - return m_irsAlgo; -} - - -void BaseKeePass2Reader::raiseError(const QString& errorMessage) -{ - m_error = true; - m_errorStr = errorMessage; -} - +/** + * Read database from device and detect correct file format. + * + * @param device input device + * @param key database encryption composite key + * @param keepDatabase keep database in case of read failure + * @return pointer to the read database, nullptr on failure + */ Database* KeePass2Reader::readDatabase(QIODevice* device, const CompositeKey& key, bool keepDatabase) { m_error = false; m_errorStr.clear(); - bool ok; + quint32 signature1, signature2; + bool ok = KdbxReader::readMagicNumbers(device, signature1, signature2, m_version); - quint32 signature1 = Endian::readSizedInt<quint32>(device, KeePass2::BYTEORDER, &ok); - if (!ok || signature1 != KeePass2::SIGNATURE_1) { + // mask out minor version + m_version &= KeePass2::FILE_VERSION_CRITICAL_MASK; + + if (!ok || signature1 != KeePass2::SIGNATURE_1 || signature2 != KeePass2::SIGNATURE_2) { raiseError(tr("Not a KeePass database.")); return nullptr; } - quint32 signature2 = Endian::readSizedInt<quint32>(device, KeePass2::BYTEORDER, &ok); - if (ok && signature2 == KeePass1::SIGNATURE_2) { + if (signature2 == KeePass1::SIGNATURE_2) { raiseError(tr("The selected file is an old KeePass 1 database (.kdb).\n\n" "You can import it by clicking on Database > 'Import KeePass 1 database...'.\n" "This is a one-way migration. You won't be able to open the imported " "database with the old KeePassX 0.4 version.")); return nullptr; } - else if (!ok || signature2 != KeePass2::SIGNATURE_2) { - raiseError(tr("Not a KeePass database.")); - return nullptr; - } - m_version = Endian::readSizedInt<quint32>(device, KeePass2::BYTEORDER, &ok) - & KeePass2::FILE_VERSION_CRITICAL_MASK; quint32 maxVersion = KeePass2::FILE_VERSION_4 & KeePass2::FILE_VERSION_CRITICAL_MASK; - if (!ok || (m_version < KeePass2::FILE_VERSION_MIN) || (m_version > maxVersion)) { + if (m_version < KeePass2::FILE_VERSION_MIN || m_version > maxVersion) { raiseError(tr("Unsupported KeePass 2 database version.")); return nullptr; } - device->seek(0); - - // Determine KDBX3 vs KDBX4 + // determine file format (KDBX 2/3 or 4) if (m_version < KeePass2::FILE_VERSION_4) { m_reader.reset(new Kdbx3Reader()); } else { @@ -138,37 +96,49 @@ Database* KeePass2Reader::readDatabase(QIODevice* device, const CompositeKey& ke return m_reader->readDatabase(device, key, keepDatabase); } -bool KeePass2Reader::hasError() +bool KeePass2Reader::hasError() const { return m_error || (!m_reader.isNull() && m_reader->hasError()); } -QString KeePass2Reader::errorString() +QString KeePass2Reader::errorString() const { return !m_reader.isNull() ? m_reader->errorString() : m_errorStr; } -QByteArray KeePass2Reader::xmlData() +bool KeePass2Reader::saveXml() const { - return !m_reader.isNull() ? m_reader->xmlData() : m_xmlData; + return m_saveXml; } -QByteArray KeePass2Reader::streamKey() +void KeePass2Reader::setSaveXml(bool save) { - return !m_reader.isNull() ? m_reader->streamKey() : m_protectedStreamKey; -} - -KeePass2::ProtectedStreamAlgo KeePass2Reader::protectedStreamAlgo() const -{ - return !m_reader.isNull() ? m_reader->protectedStreamAlgo() : m_irsAlgo; + m_saveXml = save; } +/** + * @return detected KDBX version + */ quint32 KeePass2Reader::version() const { return m_version; } -QSharedPointer<BaseKeePass2Reader> KeePass2Reader::reader() +/** + * @return KDBX reader used for reading the input file + */ +QSharedPointer<KdbxReader> KeePass2Reader::reader() const { return m_reader; -} \ No newline at end of file +} + +/** + * Raise an error. Use in case of an unexpected read error. + * + * @param errorMessage error message + */ +void KeePass2Reader::raiseError(const QString& errorMessage) +{ + m_error = true; + m_errorStr = errorMessage; +} diff --git a/src/format/KeePass2Reader.h b/src/format/KeePass2Reader.h index fd28db2b7..1b91223ee 100644 --- a/src/format/KeePass2Reader.h +++ b/src/format/KeePass2Reader.h @@ -18,6 +18,11 @@ #ifndef KEEPASSX_KEEPASS2READER_H #define KEEPASSX_KEEPASS2READER_H +#include "format/KeePass2.h" +#include "core/Database.h" +#include "keys/CompositeKey.h" +#include "KdbxReader.h" + #include <QtGlobal> #include <QByteArray> #include <QString> @@ -25,58 +30,31 @@ #include <QScopedPointer> #include <QIODevice> -#include "format/KeePass2.h" -#include "core/Database.h" -#include "keys/CompositeKey.h" - -class BaseKeePass2Reader +class KeePass2Reader { - Q_DECLARE_TR_FUNCTIONS(BaseKeePass2Reader) +Q_DECLARE_TR_FUNCTIONS(KdbxReader) public: - BaseKeePass2Reader(); + Database* readDatabase(const QString& filename, const CompositeKey& key); + Database* readDatabase(QIODevice* device, const CompositeKey& key, bool keepDatabase = false); - virtual Database* readDatabase(QIODevice* device, const CompositeKey& key, bool keepDatabase = false) = 0; - virtual Database* readDatabase(const QString& filename, const CompositeKey& key); + bool hasError() const; + QString errorString() const; - virtual bool hasError(); - virtual QString errorString(); - virtual void setSaveXml(bool save); - virtual QByteArray xmlData(); - virtual QByteArray streamKey(); - virtual KeePass2::ProtectedStreamAlgo protectedStreamAlgo() const; - - virtual ~BaseKeePass2Reader() = default; - -protected: - void raiseError(const QString& errorMessage); - - bool m_error; - QString m_errorStr; - - bool m_saveXml; - QByteArray m_xmlData; - QByteArray m_protectedStreamKey; - KeePass2::ProtectedStreamAlgo m_irsAlgo; -}; - -class KeePass2Reader : public BaseKeePass2Reader -{ -public: - Database* readDatabase(QIODevice* device, const CompositeKey& key, bool keepDatabase = false) override; - using BaseKeePass2Reader::readDatabase; - - bool hasError() override; - QString errorString() override; - QByteArray xmlData() override; - QByteArray streamKey() override; - QSharedPointer<BaseKeePass2Reader> reader(); - KeePass2::ProtectedStreamAlgo protectedStreamAlgo() const override; + bool saveXml() const; + void setSaveXml(bool save); + QSharedPointer<KdbxReader> reader() const; quint32 version() const; private: - QSharedPointer<BaseKeePass2Reader> m_reader; - quint32 m_version; + void raiseError(const QString& errorMessage); + + bool m_saveXml = false; + bool m_error = false; + QString m_errorStr = ""; + + QSharedPointer<KdbxReader> m_reader; + quint32 m_version = 0; }; #endif // KEEPASSX_KEEPASS2READER_H diff --git a/src/format/KeePass2Repair.cpp b/src/format/KeePass2Repair.cpp index fdaa45d62..e2af16cea 100644 --- a/src/format/KeePass2Repair.cpp +++ b/src/format/KeePass2Repair.cpp @@ -19,15 +19,13 @@ #include "KeePass2Repair.h" #include <QBuffer> -#include <QScopedPointer> -#include <QRegExp> +#include "core/Group.h" #include "format/KeePass2.h" #include "format/KeePass2RandomStream.h" #include "format/KeePass2Reader.h" #include "format/Kdbx4Reader.h" -#include "format/Kdbx3XmlReader.h" -#include "format/Kdbx4XmlReader.h" +#include "format/KdbxXmlReader.h" KeePass2Repair::RepairOutcome KeePass2Repair::repairDatabase(QIODevice* device, const CompositeKey& key) { @@ -41,7 +39,7 @@ KeePass2Repair::RepairOutcome KeePass2Repair::repairDatabase(QIODevice* device, return qMakePair(NothingTodo, nullptr); } - QByteArray xmlData = reader.xmlData(); + QByteArray xmlData = reader.reader()->xmlData(); if (!db || xmlData.isEmpty()) { m_errorStr = reader.errorString(); return qMakePair(UnableToOpen, nullptr); @@ -62,7 +60,7 @@ KeePass2Repair::RepairOutcome KeePass2Repair::repairDatabase(QIODevice* device, // try to fix broken databases because of bug #392 for (int i = (xmlData.size() - 1); i >= 0; i--) { - quint8 ch = static_cast<quint8>(xmlData.at(i)); + auto ch = static_cast<quint8>(xmlData.at(i)); if (ch < 0x20 && ch != 0x09 && ch != 0x0A && ch != 0x0D) { xmlData.remove(i, 1); repairAction = true; @@ -74,20 +72,20 @@ KeePass2Repair::RepairOutcome KeePass2Repair::repairDatabase(QIODevice* device, return qMakePair(RepairFailed, nullptr); } - KeePass2RandomStream randomStream(reader.protectedStreamAlgo()); - randomStream.init(reader.streamKey()); + KeePass2RandomStream randomStream(reader.reader()->protectedStreamAlgo()); + randomStream.init(reader.reader()->streamKey()); bool hasError; QBuffer buffer(&xmlData); buffer.open(QIODevice::ReadOnly); if ((reader.version() & KeePass2::FILE_VERSION_CRITICAL_MASK) < KeePass2::FILE_VERSION_4) { - Kdbx3XmlReader xmlReader; + KdbxXmlReader xmlReader(KeePass2::FILE_VERSION_3); xmlReader.readDatabase(&buffer, db.data(), &randomStream); hasError = xmlReader.hasError(); } else { auto reader4 = reader.reader().staticCast<Kdbx4Reader>(); QHash<QString, QByteArray> pool = reader4->binaryPool(); - Kdbx4XmlReader xmlReader(pool); + KdbxXmlReader xmlReader(KeePass2::FILE_VERSION_4, pool); xmlReader.readDatabase(&buffer, db.data(), &randomStream); hasError = xmlReader.hasError(); } diff --git a/src/format/KeePass2Writer.cpp b/src/format/KeePass2Writer.cpp index baea9968a..3e32eb96b 100644 --- a/src/format/KeePass2Writer.cpp +++ b/src/format/KeePass2Writer.cpp @@ -16,7 +16,6 @@ */ #include <QIODevice> -#include <QString> #include <QFile> #include "format/KeePass2Writer.h" @@ -24,66 +23,79 @@ #include "format/Kdbx3Writer.h" #include "format/Kdbx4Writer.h" -BaseKeePass2Writer::BaseKeePass2Writer() : m_error(false) -{ - m_errorStr.clear(); -} - -BaseKeePass2Writer::~BaseKeePass2Writer() {} - -bool BaseKeePass2Writer::hasError() -{ - return m_error; -} - -QString BaseKeePass2Writer::errorString() -{ - return m_errorStr; -} - -void BaseKeePass2Writer::raiseError(const QString& errorMessage) -{ - m_error = true; - m_errorStr = errorMessage; -} - -bool BaseKeePass2Writer::writeDatabase(const QString& filename, Database* db) +/** + * Write a database to a KDBX file. + * + * @param filename output filename + * @param db source database + * @return true on success + */ +bool KeePass2Writer::writeDatabase(const QString& filename, Database* db) { QFile file(filename); - if (!file.open(QIODevice::WriteOnly|QIODevice::Truncate)) { + if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) { raiseError(file.errorString()); return false; } return writeDatabase(&file, db); } -bool KeePass2Writer::hasError() -{ - return m_error || (m_writer && m_writer->hasError()); -} - -QString KeePass2Writer::errorString() -{ - return m_writer ? m_writer->errorString() : m_errorStr; -} - +/** + * Write a database to a device in KDBX format. + * + * @param device output device + * @param db source database + * @return true on success + */ bool KeePass2Writer::writeDatabase(QIODevice* device, Database* db) { - bool useKdbx4 = false; + m_error = false; + m_errorStr.clear(); - if (db->kdf()->uuid() != KeePass2::KDF_AES) { - useKdbx4 = true; - } - - if (db->publicCustomData().size() > 0) { - useKdbx4 = true; - } - - // Determine KDBX3 vs KDBX4 - if (useKdbx4) { + // determine KDBX3 vs KDBX4 + if (db->kdf()->uuid() != KeePass2::KDF_AES || db->publicCustomData().size() > 0) { + m_version = KeePass2::FILE_VERSION_4; m_writer.reset(new Kdbx4Writer()); } else { + m_version = KeePass2::FILE_VERSION_3; m_writer.reset(new Kdbx3Writer()); } return m_writer->writeDatabase(device, db); } + +bool KeePass2Writer::hasError() const +{ + return m_error || (m_writer && m_writer->hasError()); +} + +QString KeePass2Writer::errorString() const +{ + return m_writer ? m_writer->errorString() : m_errorStr; +} + +/** + * Raise an error. Use in case of an unexpected write error. + * + * @param errorMessage error message + */ +void KeePass2Writer::raiseError(const QString& errorMessage) +{ + m_error = true; + m_errorStr = errorMessage; +} + +/** + * @return KDBX writer used for writing the output file + */ +QSharedPointer<KdbxWriter> KeePass2Writer::writer() const +{ + return QSharedPointer<KdbxWriter>(); +} + +/** + * @return KDBX version used for writing the output file + */ +quint32 KeePass2Writer::version() const +{ + return m_version; +} diff --git a/src/format/KeePass2Writer.h b/src/format/KeePass2Writer.h index f6ec129f2..98daed5e3 100644 --- a/src/format/KeePass2Writer.h +++ b/src/format/KeePass2Writer.h @@ -18,50 +18,36 @@ #ifndef KEEPASSX_KEEPASS2WRITER_H #define KEEPASSX_KEEPASS2WRITER_H -#include <QIODevice> -#include <QByteArray> -#include <QString> +#include "KdbxWriter.h" + #include <QCoreApplication> #include <QScopedPointer> -#include "core/Database.h" -#include "format/KeePass2.h" +class QIODevice; +class Database; -#define CHECK_RETURN_FALSE(x) if (!(x)) return false; - -class BaseKeePass2Writer +class KeePass2Writer { -public: - BaseKeePass2Writer(); - - virtual bool writeDatabase(QIODevice* device, Database* db) = 0; - virtual bool writeDatabase(const QString& filename, Database* db); - - virtual bool hasError(); - virtual QString errorString(); - - virtual ~BaseKeePass2Writer(); - -protected: - void raiseError(const QString& errorMessage); - - bool m_error; - QString m_errorStr; -}; - -class KeePass2Writer : public BaseKeePass2Writer -{ - Q_DECLARE_TR_FUNCTIONS(KeePass2Writer) +Q_DECLARE_TR_FUNCTIONS(KeePass2Writer) public: - virtual bool writeDatabase(QIODevice* device, Database* db) override; - using BaseKeePass2Writer::writeDatabase; + bool writeDatabase(const QString& filename, Database* db); + bool writeDatabase(QIODevice* device, Database* db); - virtual bool hasError() override; - virtual QString errorString() override; + QSharedPointer<KdbxWriter> writer() const; + quint32 version() const; + + bool hasError() const; + QString errorString() const; private: - QScopedPointer<BaseKeePass2Writer> m_writer; + void raiseError(const QString& errorMessage); + + bool m_error = false; + QString m_errorStr = ""; + + QScopedPointer<KdbxWriter> m_writer; + quint32 m_version = 0; }; #endif // KEEPASSX_KEEPASS2READER_H diff --git a/tests/TestDeletedObjects.cpp b/tests/TestDeletedObjects.cpp index 371d318db..c8236f05b 100644 --- a/tests/TestDeletedObjects.cpp +++ b/tests/TestDeletedObjects.cpp @@ -22,7 +22,8 @@ #include "core/Database.h" #include "core/Group.h" #include "crypto/Crypto.h" -#include "format/Kdbx3XmlReader.h" +#include "format/KeePass2.h" +#include "format/KdbxXmlReader.h" #include "config-keepassx-tests.h" QTEST_GUILESS_MAIN(TestDeletedObjects) @@ -88,7 +89,7 @@ void TestDeletedObjects::createAndDelete(Database* db, int delObjectsSize) void TestDeletedObjects::testDeletedObjectsFromFile() { - Kdbx3XmlReader reader; + KdbxXmlReader reader(KeePass2::FILE_VERSION_3); reader.setStrictMode(true); QString xmlFile = QString(KEEPASSX_TEST_DATA_DIR).append("/NewDatabase.xml"); Database* db = reader.readDatabase(xmlFile); diff --git a/tests/TestKeePass2XmlReader.cpp b/tests/TestKeePass2XmlReader.cpp index fda8fffd6..4970fe927 100644 --- a/tests/TestKeePass2XmlReader.cpp +++ b/tests/TestKeePass2XmlReader.cpp @@ -20,15 +20,14 @@ #include <QBuffer> #include <QFile> #include <QTest> +#include <format/KeePass2.h> #include "core/Database.h" #include "core/Group.h" #include "core/Metadata.h" #include "crypto/Crypto.h" -#include "format/Kdbx3XmlReader.h" -#include "format/Kdbx3XmlWriter.h" -#include "format/Kdbx4XmlReader.h" -#include "format/Kdbx4XmlWriter.h" +#include "format/KdbxXmlReader.h" +#include "format/KdbxXmlWriter.h" #include "config-keepassx-tests.h" namespace QTest { @@ -83,7 +82,7 @@ void TestKdbx3XmlReader::initTestCase() { QVERIFY(Crypto::init()); - Kdbx3XmlReader reader; + KdbxXmlReader reader(KeePass2::FILE_VERSION_3); reader.setStrictMode(true); QString xmlFile = QString(KEEPASSX_TEST_DATA_DIR).append("/NewDatabase.xml"); m_db = reader.readDatabase(xmlFile); @@ -95,7 +94,7 @@ void TestKdbx4XmlReader::initTestCase() { QVERIFY(Crypto::init()); - Kdbx4XmlReader reader; + KdbxXmlReader reader(KeePass2::FILE_VERSION_3); reader.setStrictMode(true); QString xmlFile = QString(KEEPASSX_TEST_DATA_DIR).append("/NewDatabase.xml"); m_db = reader.readDatabase(xmlFile); @@ -105,7 +104,7 @@ void TestKdbx4XmlReader::initTestCase() void TestKdbx3XmlReader::readDatabase(QString path, bool strictMode, Database*& db, bool& hasError, QString& errorString) { - Kdbx3XmlReader reader; + KdbxXmlReader reader(KeePass2::FILE_VERSION_3); reader.setStrictMode(strictMode); db = reader.readDatabase(path); hasError = reader.hasError(); @@ -114,7 +113,7 @@ void TestKdbx3XmlReader::readDatabase(QString path, bool strictMode, Database*& void TestKdbx3XmlReader::readDatabase(QBuffer* buf, bool strictMode, Database*& db, bool& hasError, QString& errorString) { - Kdbx3XmlReader reader; + KdbxXmlReader reader(KeePass2::FILE_VERSION_3); reader.setStrictMode(strictMode); db = reader.readDatabase(buf); hasError = reader.hasError(); @@ -123,7 +122,7 @@ void TestKdbx3XmlReader::readDatabase(QBuffer* buf, bool strictMode, Database*& void TestKdbx3XmlReader::writeDatabase(QBuffer* buf, Database* db, bool& hasError, QString& errorString) { - Kdbx3XmlWriter writer; + KdbxXmlWriter writer(KeePass2::FILE_VERSION_3); writer.writeDatabase(buf, db); hasError = writer.hasError(); errorString = writer.errorString(); @@ -131,7 +130,7 @@ void TestKdbx3XmlReader::writeDatabase(QBuffer* buf, Database* db, bool& hasErro void TestKdbx4XmlReader::readDatabase(QString path, bool strictMode, Database*& db, bool& hasError, QString& errorString) { - Kdbx4XmlReader reader; + KdbxXmlReader reader(KeePass2::FILE_VERSION_3); reader.setStrictMode(strictMode); db = reader.readDatabase(path); hasError = reader.hasError(); @@ -140,7 +139,7 @@ void TestKdbx4XmlReader::readDatabase(QString path, bool strictMode, Database*& void TestKdbx4XmlReader::readDatabase(QBuffer* buf, bool strictMode, Database*& db, bool& hasError, QString& errorString) { - Kdbx4XmlReader reader; + KdbxXmlReader reader(KeePass2::FILE_VERSION_3); reader.setStrictMode(strictMode); db = reader.readDatabase(buf); hasError = reader.hasError(); @@ -149,7 +148,7 @@ void TestKdbx4XmlReader::readDatabase(QBuffer* buf, bool strictMode, Database*& void TestKdbx4XmlReader::writeDatabase(QBuffer* buf, Database* db, bool& hasError, QString& errorString) { - Kdbx4XmlWriter writer; + KdbxXmlWriter writer(KeePass2::FILE_VERSION_3); writer.writeDatabase(buf, db); hasError = writer.hasError(); errorString = writer.errorString(); From df728083cc147f9669d11b6306999b36c4a79fae Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sun, 7 Jan 2018 18:46:24 +0100 Subject: [PATCH 244/402] Add challenge response to key before transformation, resolves #1060 * Re-implement KDBX4 challenge-response key assembly with transform seed instead of master seed --- src/core/Database.cpp | 9 +++++++ src/format/Kdbx4Reader.cpp | 9 +------ src/format/Kdbx4Writer.cpp | 6 ----- src/keys/CompositeKey.cpp | 54 +++++++++++++++++++++++++++++++++++++- src/keys/CompositeKey.h | 7 ++--- 5 files changed, 67 insertions(+), 18 deletions(-) diff --git a/src/core/Database.cpp b/src/core/Database.cpp index 98a4fc817..a579ed02d 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -255,10 +255,19 @@ void Database::setCompressionAlgo(Database::CompressionAlgorithm algo) m_data.compressionAlgo = algo; } +/** + * Set and transform a new encryption key. + * + * @param key key to set and transform + * @param updateChangedTime true to update database change time + * @param updateTransformSalt true to update the transform salt + * @return true on success + */ bool Database::setKey(const CompositeKey& key, bool updateChangedTime, bool updateTransformSalt) { if (updateTransformSalt) { m_data.kdf->randomizeSeed(); + Q_ASSERT(!m_data.kdf->seed().isEmpty()); } QByteArray oldTransformedMasterKey = m_data.transformedMasterKey; diff --git a/src/format/Kdbx4Reader.cpp b/src/format/Kdbx4Reader.cpp index 05ef71160..1cde6d18c 100644 --- a/src/format/Kdbx4Reader.cpp +++ b/src/format/Kdbx4Reader.cpp @@ -20,7 +20,6 @@ #include <QBuffer> #include "core/Group.h" -#include "core/Database.h" #include "core/Endian.h" #include "crypto/CryptoHash.h" #include "format/KeePass2RandomStream.h" @@ -48,19 +47,13 @@ Database* Kdbx4Reader::readDatabaseImpl(QIODevice* device, const QByteArray& hea return nullptr; } - if (!m_db->setKey(key, false)) { + if (!m_db->setKey(key, false, false)) { raiseError(tr("Unable to calculate master key")); return nullptr; } - if (!m_db->challengeMasterSeed(m_masterSeed)) { - raiseError(tr("Unable to issue challenge-response.")); - return nullptr; - } - CryptoHash hash(CryptoHash::Sha256); hash.addData(m_masterSeed); - hash.addData(m_db->challengeResponseKey()); hash.addData(m_db->transformedMasterKey()); QByteArray finalKey = hash.result(); diff --git a/src/format/Kdbx4Writer.cpp b/src/format/Kdbx4Writer.cpp index e151ab965..70bfa2d5b 100644 --- a/src/format/Kdbx4Writer.cpp +++ b/src/format/Kdbx4Writer.cpp @@ -51,11 +51,6 @@ bool Kdbx4Writer::writeDatabase(QIODevice* device, Database* db) QByteArray startBytes; QByteArray endOfHeader = "\r\n\r\n"; - if (!db->challengeMasterSeed(masterSeed)) { - raiseError(tr("Unable to issue challenge-response.")); - return false; - } - if (!db->setKey(db->key(), false, true)) { raiseError(tr("Unable to calculate master key")); return false; @@ -64,7 +59,6 @@ bool Kdbx4Writer::writeDatabase(QIODevice* device, Database* db) // generate transformed master key CryptoHash hash(CryptoHash::Sha256); hash.addData(masterSeed); - hash.addData(db->challengeResponseKey()); Q_ASSERT(!db->transformedMasterKey().isEmpty()); hash.addData(db->transformedMasterKey()); QByteArray finalKey = hash.result(); diff --git a/src/keys/CompositeKey.cpp b/src/keys/CompositeKey.cpp index 8f6917afc..7a9b2cbe0 100644 --- a/src/keys/CompositeKey.cpp +++ b/src/keys/CompositeKey.cpp @@ -19,6 +19,7 @@ #include "CompositeKey.h" #include <QFile> #include <QtConcurrent> +#include <format/KeePass2.h> #include "core/Global.h" #include "crypto/CryptoHash.h" @@ -73,7 +74,31 @@ CompositeKey& CompositeKey::operator=(const CompositeKey& key) return *this; } +/** + * Get raw key hash as bytes. + * + * The key hash does not contain contributions by challenge-response components for + * backwards compatibility with KeePassXC's pre-KDBX4 challenge-response + * implementation. To include challenge-response in the raw key, + * use \link CompositeKey::rawKey(const QByteArray*) instead. + * + * @return key hash + */ QByteArray CompositeKey::rawKey() const +{ + return rawKey(nullptr); +} + +/** + * Get raw key hash as bytes. + * + * Challenge-response key components will use the provided <tt>transformSeed</tt> + * as a challenge to acquire their key contribution. + * + * @param transformSeed transform seed to challenge or nullptr to exclude challenge-response components + * @return key hash + */ +QByteArray CompositeKey::rawKey(const QByteArray* transformSeed) const { CryptoHash cryptoHash(CryptoHash::Sha256); @@ -81,12 +106,38 @@ QByteArray CompositeKey::rawKey() const cryptoHash.addData(key->rawKey()); } + if (transformSeed) { + QByteArray challengeResult; + challenge(*transformSeed, challengeResult); + cryptoHash.addData(challengeResult); + } + return cryptoHash.result(); } +/** + * Transform this composite key. + * + * If using AES-KDF as transform function, the transformed key will not include + * any challenge-response components. Only static key components will be hashed + * for backwards-compatibility with KeePassXC's KDBX3 implementation, which added + * challenge response key components after key transformation. + * KDBX4+ KDFs transform the whole key including challenge-response components. + * + * @param kdf key derivation function + * @param result transformed key hash + * @return true on success + */ bool CompositeKey::transform(const Kdf& kdf, QByteArray& result) const { - return kdf.transform(rawKey(), result); + if (kdf.uuid() == KeePass2::KDF_AES) { + // legacy KDBX3 AES-KDF, challenge response is added later to the hash + return kdf.transform(rawKey(), result); + } + + QByteArray seed = kdf.seed(); + Q_ASSERT(!seed.isEmpty()); + return kdf.transform(rawKey(&seed), result); } bool CompositeKey::challenge(const QByteArray& seed, QByteArray& result) const @@ -103,6 +154,7 @@ bool CompositeKey::challenge(const QByteArray& seed, QByteArray& result) const for (const auto key : m_challengeResponseKeys) { // if the device isn't present or fails, return an error if (!key->challenge(seed)) { + qWarning("Failed to issue challenge"); return false; } cryptoHash.addData(key->rawKey()); diff --git a/src/keys/CompositeKey.h b/src/keys/CompositeKey.h index 35bc309fa..9018276c3 100644 --- a/src/keys/CompositeKey.h +++ b/src/keys/CompositeKey.h @@ -32,13 +32,14 @@ class CompositeKey : public Key public: CompositeKey(); CompositeKey(const CompositeKey& key); - ~CompositeKey(); + ~CompositeKey() override; void clear(); bool isEmpty() const; - CompositeKey* clone() const; + CompositeKey* clone() const override; CompositeKey& operator=(const CompositeKey& key); - QByteArray rawKey() const; + QByteArray rawKey() const override; + QByteArray rawKey(const QByteArray* transformSeed) const; bool transform(const Kdf& kdf, QByteArray& result) const Q_REQUIRED_RESULT; bool challenge(const QByteArray& seed, QByteArray &result) const; From c51585c2794b99b0f80cd12f7d556f2d9ed0d6d6 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sun, 7 Jan 2018 22:59:59 +0100 Subject: [PATCH 245/402] Fix type conversion error in older Qt versions --- src/format/KeePass2.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/format/KeePass2.cpp b/src/format/KeePass2.cpp index 88286a051..aa081e7b5 100644 --- a/src/format/KeePass2.cpp +++ b/src/format/KeePass2.cpp @@ -65,16 +65,16 @@ QSharedPointer<Kdf> KeePass2::kdfFromParameters(const QVariantMap &p) { QByteArray uuidBytes = p.value(KDFPARAM_UUID).toByteArray(); if (uuidBytes.size() != Uuid::Length) { - return nullptr; + return {}; } QSharedPointer<Kdf> kdf(uuidToKdf(Uuid(uuidBytes))); if (kdf.isNull()) { - return nullptr; + return {}; } if (!kdf->processParameters(p)) { - return nullptr; + return {}; } return kdf; @@ -95,7 +95,7 @@ QSharedPointer<Kdf> KeePass2::uuidToKdf(const Uuid& uuid) } Q_ASSERT_X(false, "uuidToKdf", "Invalid UUID"); - return nullptr; + return {}; } KeePass2::ProtectedStreamAlgo KeePass2::idToProtectedStreamAlgo(quint32 id) From d327c169049c0b56df237e6d8b31812ba0ce9d8b Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Wed, 10 Jan 2018 00:49:04 +0100 Subject: [PATCH 246/402] Increase Argon2 warning threshold and set parallelism default value to number of available processors --- src/crypto/kdf/Argon2Kdf.cpp | 3 +-- src/gui/DatabaseSettingsWidget.cpp | 6 +++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/crypto/kdf/Argon2Kdf.cpp b/src/crypto/kdf/Argon2Kdf.cpp index 154f2ffe4..cd8474056 100644 --- a/src/crypto/kdf/Argon2Kdf.cpp +++ b/src/crypto/kdf/Argon2Kdf.cpp @@ -21,7 +21,6 @@ #include <argon2.h> #include "format/KeePass2.h" -#include "crypto/CryptoHash.h" /** * KeePass' Argon2 implementation supports all parameters that are defined in the official specification, @@ -34,7 +33,7 @@ Argon2Kdf::Argon2Kdf() : Kdf::Kdf(KeePass2::KDF_ARGON2) , m_version(0x13) , m_memory(1 << 16) - , m_parallelism(2) + , m_parallelism(static_cast<quint32>(QThread::idealThreadCount())) { m_rounds = 1; } diff --git a/src/gui/DatabaseSettingsWidget.cpp b/src/gui/DatabaseSettingsWidget.cpp index c59f97423..68b0d4ae6 100644 --- a/src/gui/DatabaseSettingsWidget.cpp +++ b/src/gui/DatabaseSettingsWidget.cpp @@ -23,6 +23,7 @@ #include <QMessageBox> #include <QPushButton> +#include <QThread> #include "core/Global.h" #include "core/FilePath.h" @@ -118,6 +119,9 @@ void DatabaseSettingsWidget::load(Database* db) kdfChanged(kdfIndex); } + // properly initialize parallelism spin box (may be overwritten by actual KDF values) + m_uiEncryption->parallelismSpinBox->setValue(QThread::idealThreadCount()); + // Setup kdf parameters auto kdf = m_db->kdf(); m_uiEncryption->transformRoundsSpinBox->setValue(kdf->rounds()); @@ -134,7 +138,7 @@ void DatabaseSettingsWidget::save() { // first perform safety check for KDF rounds auto kdf = KeePass2::uuidToKdf(Uuid(m_uiEncryption->kdfComboBox->currentData().toByteArray())); - if (kdf->uuid() == KeePass2::KDF_ARGON2 && m_uiEncryption->transformRoundsSpinBox->value() > 1000) { + if (kdf->uuid() == KeePass2::KDF_ARGON2 && m_uiEncryption->transformRoundsSpinBox->value() > 10000) { QMessageBox warning; warning.setIcon(QMessageBox::Warning); warning.setWindowTitle(tr("Number of rounds too high")); From b04c8c2b6e45610a4c26874025668d9d2b91cf71 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Wed, 10 Jan 2018 21:24:53 +0100 Subject: [PATCH 247/402] Explicitly support AES-KDF in KDBX4 and don't convert KDBX4 files with AES-KDF back to KDBX3 when saving --- src/core/Database.cpp | 5 +++- src/crypto/kdf/AesKdf.cpp | 21 +++++++++++------ src/crypto/kdf/AesKdf.h | 1 + src/format/Kdbx4Reader.cpp | 1 + src/format/KeePass2.cpp | 37 ++++++++++++++++++++++-------- src/format/KeePass2.h | 3 ++- src/format/KeePass2Writer.cpp | 11 +++++---- src/gui/DatabaseSettingsWidget.cpp | 3 ++- src/keys/CompositeKey.cpp | 3 ++- 9 files changed, 59 insertions(+), 26 deletions(-) diff --git a/src/core/Database.cpp b/src/core/Database.cpp index a579ed02d..75b91a5c5 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -44,7 +44,10 @@ Database::Database() { m_data.cipher = KeePass2::CIPHER_AES; m_data.compressionAlgo = CompressionGZip; - m_data.kdf = QSharedPointer<AesKdf>::create(); + + // instantiate default AES-KDF with legacy KDBX3 flag set + // KDBX4+ will re-initialize the KDF using parameters read from the KDBX file + m_data.kdf = QSharedPointer<AesKdf>::create(true); m_data.kdf->randomizeSeed(); m_data.hasKey = false; diff --git a/src/crypto/kdf/AesKdf.cpp b/src/crypto/kdf/AesKdf.cpp index d668652aa..df4392468 100644 --- a/src/crypto/kdf/AesKdf.cpp +++ b/src/crypto/kdf/AesKdf.cpp @@ -23,7 +23,15 @@ #include "crypto/CryptoHash.h" AesKdf::AesKdf() - : Kdf::Kdf(KeePass2::KDF_AES) + : Kdf::Kdf(KeePass2::KDF_AES_KDBX4) +{ +} + +/** + * @param legacyKdbx3 initialize as legacy KDBX3 KDF + */ +AesKdf::AesKdf(bool legacyKdbx3) + : Kdf::Kdf(legacyKdbx3 ? KeePass2::KDF_AES_KDBX3 : KeePass2::KDF_AES_KDBX4) { } @@ -36,17 +44,16 @@ bool AesKdf::processParameters(const QVariantMap &p) } QByteArray seed = p.value(KeePass2::KDFPARAM_AES_SEED).toByteArray(); - if (!setSeed(seed)) { - return false; - } - - return true; + return setSeed(seed); } QVariantMap AesKdf::writeParameters() { QVariantMap p; - p.insert(KeePass2::KDFPARAM_UUID, KeePass2::KDF_AES.toByteArray()); + + // always write old KDBX3 AES-KDF UUID for compatibility with other applications + p.insert(KeePass2::KDFPARAM_UUID, KeePass2::KDF_AES_KDBX3.toByteArray()); + p.insert(KeePass2::KDFPARAM_AES_ROUNDS, rounds()); p.insert(KeePass2::KDFPARAM_AES_SEED, seed()); return p; diff --git a/src/crypto/kdf/AesKdf.h b/src/crypto/kdf/AesKdf.h index 69c15b8af..31ee1fa70 100644 --- a/src/crypto/kdf/AesKdf.h +++ b/src/crypto/kdf/AesKdf.h @@ -24,6 +24,7 @@ class AesKdf: public Kdf { public: AesKdf(); + explicit AesKdf(bool legacyKdbx3); bool processParameters(const QVariantMap& p) override; QVariantMap writeParameters() override; diff --git a/src/format/Kdbx4Reader.cpp b/src/format/Kdbx4Reader.cpp index 1cde6d18c..b0545888f 100644 --- a/src/format/Kdbx4Reader.cpp +++ b/src/format/Kdbx4Reader.cpp @@ -22,6 +22,7 @@ #include "core/Group.h" #include "core/Endian.h" #include "crypto/CryptoHash.h" +#include "crypto/kdf/AesKdf.h" #include "format/KeePass2RandomStream.h" #include "format/KdbxXmlReader.h" #include "streams/HmacBlockStream.h" diff --git a/src/format/KeePass2.cpp b/src/format/KeePass2.cpp index aa081e7b5..9f0832fb0 100644 --- a/src/format/KeePass2.cpp +++ b/src/format/KeePass2.cpp @@ -25,7 +25,8 @@ const Uuid KeePass2::CIPHER_AES = Uuid(QByteArray::fromHex("31c1f2e6bf714350be58 const Uuid KeePass2::CIPHER_TWOFISH = Uuid(QByteArray::fromHex("ad68f29f576f4bb9a36ad47af965346c")); const Uuid KeePass2::CIPHER_CHACHA20 = Uuid(QByteArray::fromHex("D6038A2B8B6F4CB5A524339A31DBB59A")); -const Uuid KeePass2::KDF_AES = Uuid(QByteArray::fromHex("C9D9F39A628A4460BF740D08C18A4FEA")); +const Uuid KeePass2::KDF_AES_KDBX3 = Uuid(QByteArray::fromHex("C9D9F39A628A4460BF740D08C18A4FEA")); +const Uuid KeePass2::KDF_AES_KDBX4 = Uuid(QByteArray::fromHex("7C02BB8279A74AC0927D114A00648238")); const Uuid KeePass2::KDF_ARGON2 = Uuid(QByteArray::fromHex("EF636DDF8C29444B91F7A9A403E30A0C")); const QByteArray KeePass2::INNER_STREAM_SALSA20_IV("\xE8\x30\x09\x4B\x97\x20\x5D\x2A"); @@ -43,14 +44,16 @@ const QString KeePass2::KDFPARAM_ARGON2_VERSION("V"); const QString KeePass2::KDFPARAM_ARGON2_SECRET("K"); const QString KeePass2::KDFPARAM_ARGON2_ASSOCDATA("A"); -const QList<QPair<Uuid, QString>> KeePass2::CIPHERS { - qMakePair(KeePass2::CIPHER_AES, QObject::tr("AES: 256-bit")), - qMakePair(KeePass2::CIPHER_TWOFISH, QObject::tr("Twofish: 256-bit")), - qMakePair(KeePass2::CIPHER_CHACHA20, QObject::tr("ChaCha20: 256-bit")) +const QList<QPair<Uuid, QString>> KeePass2::CIPHERS{ + qMakePair(KeePass2::CIPHER_AES, QObject::tr("AES: 256-bit")), + qMakePair(KeePass2::CIPHER_TWOFISH, QObject::tr("Twofish: 256-bit")), + qMakePair(KeePass2::CIPHER_CHACHA20, QObject::tr("ChaCha20: 256-bit")) }; -const QList<QPair<Uuid, QString>> KeePass2::KDFS { - qMakePair(KeePass2::KDF_AES, QObject::tr("AES-KDF")), - qMakePair(KeePass2::KDF_ARGON2, QObject::tr("Argon2")), + +const QList<QPair<Uuid, QString>> KeePass2::KDFS{ + qMakePair(KeePass2::KDF_ARGON2, QObject::tr("Argon2 (recommended)")), + qMakePair(KeePass2::KDF_AES_KDBX4, QObject::tr("AES-KDF (KDBX 4)")), + qMakePair(KeePass2::KDF_AES_KDBX3, QObject::tr("AES-KDF (KDBX 3.1)")) }; QByteArray KeePass2::hmacKey(QByteArray masterSeed, QByteArray transformedMasterKey) { @@ -61,6 +64,12 @@ QByteArray KeePass2::hmacKey(QByteArray masterSeed, QByteArray transformedMaster return hmacKeyHash.result(); } +/** + * Create KDF object from KDBX4+ KDF parameters. + * + * @param p variant map containing parameters + * @return initialized KDF + */ QSharedPointer<Kdf> KeePass2::kdfFromParameters(const QVariantMap &p) { QByteArray uuidBytes = p.value(KDFPARAM_UUID).toByteArray(); @@ -68,7 +77,12 @@ QSharedPointer<Kdf> KeePass2::kdfFromParameters(const QVariantMap &p) return {}; } - QSharedPointer<Kdf> kdf(uuidToKdf(Uuid(uuidBytes))); + Uuid kdfUuid(uuidBytes); + if (kdfUuid == KDF_AES_KDBX3) { + // upgrade to non-legacy AES-KDF, since KDBX3 doesn't have any KDF parameters + kdfUuid = KDF_AES_KDBX4; + } + QSharedPointer<Kdf> kdf = uuidToKdf(kdfUuid); if (kdf.isNull()) { return {}; } @@ -87,7 +101,10 @@ QVariantMap KeePass2::kdfToParameters(QSharedPointer<Kdf> kdf) QSharedPointer<Kdf> KeePass2::uuidToKdf(const Uuid& uuid) { - if (uuid == KDF_AES) { + if (uuid == KDF_AES_KDBX3) { + return QSharedPointer<AesKdf>::create(true); + } + if (uuid == KDF_AES_KDBX4) { return QSharedPointer<AesKdf>::create(); } if (uuid == KDF_ARGON2) { diff --git a/src/format/KeePass2.h b/src/format/KeePass2.h index f7fa0d397..cd53d7132 100644 --- a/src/format/KeePass2.h +++ b/src/format/KeePass2.h @@ -46,7 +46,8 @@ namespace KeePass2 extern const Uuid CIPHER_TWOFISH; extern const Uuid CIPHER_CHACHA20; - extern const Uuid KDF_AES; + extern const Uuid KDF_AES_KDBX3; + extern const Uuid KDF_AES_KDBX4; extern const Uuid KDF_ARGON2; extern const QByteArray INNER_STREAM_SALSA20_IV; diff --git a/src/format/KeePass2Writer.cpp b/src/format/KeePass2Writer.cpp index 3e32eb96b..67aeec98f 100644 --- a/src/format/KeePass2Writer.cpp +++ b/src/format/KeePass2Writer.cpp @@ -18,8 +18,9 @@ #include <QIODevice> #include <QFile> -#include "format/KeePass2Writer.h" #include "core/Database.h" +#include "crypto/kdf/AesKdf.h" +#include "format/KeePass2Writer.h" #include "format/Kdbx3Writer.h" #include "format/Kdbx4Writer.h" @@ -52,12 +53,12 @@ bool KeePass2Writer::writeDatabase(QIODevice* device, Database* db) { m_errorStr.clear(); // determine KDBX3 vs KDBX4 - if (db->kdf()->uuid() != KeePass2::KDF_AES || db->publicCustomData().size() > 0) { - m_version = KeePass2::FILE_VERSION_4; - m_writer.reset(new Kdbx4Writer()); - } else { + if (db->kdf()->uuid() == KeePass2::KDF_AES_KDBX3 && db->publicCustomData().isEmpty()) { m_version = KeePass2::FILE_VERSION_3; m_writer.reset(new Kdbx3Writer()); + } else { + m_version = KeePass2::FILE_VERSION_4; + m_writer.reset(new Kdbx4Writer()); } return m_writer->writeDatabase(device, db); diff --git a/src/gui/DatabaseSettingsWidget.cpp b/src/gui/DatabaseSettingsWidget.cpp index 68b0d4ae6..c0cc06296 100644 --- a/src/gui/DatabaseSettingsWidget.cpp +++ b/src/gui/DatabaseSettingsWidget.cpp @@ -151,7 +151,8 @@ void DatabaseSettingsWidget::save() if (warning.clickedButton() != ok) { return; } - } else if (kdf->uuid() == KeePass2::KDF_AES && m_uiEncryption->transformRoundsSpinBox->value() < 100000) { + } else if ((kdf->uuid() == KeePass2::KDF_AES_KDBX3 || kdf->uuid() == KeePass2::KDF_AES_KDBX4) + && m_uiEncryption->transformRoundsSpinBox->value() < 100000) { QMessageBox warning; warning.setIcon(QMessageBox::Warning); warning.setWindowTitle(tr("Number of rounds too low")); diff --git a/src/keys/CompositeKey.cpp b/src/keys/CompositeKey.cpp index 7a9b2cbe0..e5e507c77 100644 --- a/src/keys/CompositeKey.cpp +++ b/src/keys/CompositeKey.cpp @@ -22,6 +22,7 @@ #include <format/KeePass2.h> #include "core/Global.h" +#include "crypto/kdf/AesKdf.h" #include "crypto/CryptoHash.h" CompositeKey::CompositeKey() @@ -130,7 +131,7 @@ QByteArray CompositeKey::rawKey(const QByteArray* transformSeed) const */ bool CompositeKey::transform(const Kdf& kdf, QByteArray& result) const { - if (kdf.uuid() == KeePass2::KDF_AES) { + if (kdf.uuid() == KeePass2::KDF_AES_KDBX3) { // legacy KDBX3 AES-KDF, challenge response is added later to the hash return kdf.transform(rawKey(), result); } From 6df54cfe8d15891beddf70b0ca8e246103d6d8f9 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Thu, 11 Jan 2018 00:20:37 +0100 Subject: [PATCH 248/402] Do not assert KDF UUID and improve error message --- src/format/Kdbx4Reader.cpp | 2 +- src/format/KeePass2.cpp | 3 +-- src/format/KeePass2.h | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/format/Kdbx4Reader.cpp b/src/format/Kdbx4Reader.cpp index b0545888f..38063acf1 100644 --- a/src/format/Kdbx4Reader.cpp +++ b/src/format/Kdbx4Reader.cpp @@ -203,7 +203,7 @@ bool Kdbx4Reader::readHeaderField(StoreDataStream& device) QVariantMap kdfParams = readVariantMap(&bufIoDevice); QSharedPointer<Kdf> kdf = KeePass2::kdfFromParameters(kdfParams); if (!kdf) { - raiseError(tr("Invalid KDF parameters")); + raiseError(tr("Unsupported key derivation function (KDF) or invalid parameters")); return false; } m_db->setKdf(kdf); diff --git a/src/format/KeePass2.cpp b/src/format/KeePass2.cpp index 9f0832fb0..d58e8bbfd 100644 --- a/src/format/KeePass2.cpp +++ b/src/format/KeePass2.cpp @@ -70,7 +70,7 @@ QByteArray KeePass2::hmacKey(QByteArray masterSeed, QByteArray transformedMaster * @param p variant map containing parameters * @return initialized KDF */ -QSharedPointer<Kdf> KeePass2::kdfFromParameters(const QVariantMap &p) +QSharedPointer<Kdf> KeePass2::kdfFromParameters(const QVariantMap& p) { QByteArray uuidBytes = p.value(KDFPARAM_UUID).toByteArray(); if (uuidBytes.size() != Uuid::Length) { @@ -111,7 +111,6 @@ QSharedPointer<Kdf> KeePass2::uuidToKdf(const Uuid& uuid) return QSharedPointer<Argon2Kdf>::create(); } - Q_ASSERT_X(false, "uuidToKdf", "Invalid UUID"); return {}; } diff --git a/src/format/KeePass2.h b/src/format/KeePass2.h index cd53d7132..c376ecdf2 100644 --- a/src/format/KeePass2.h +++ b/src/format/KeePass2.h @@ -122,7 +122,7 @@ namespace KeePass2 }; QByteArray hmacKey(QByteArray masterSeed, QByteArray transformedMasterKey); - QSharedPointer<Kdf> kdfFromParameters(const QVariantMap &p); + QSharedPointer<Kdf> kdfFromParameters(const QVariantMap& p); QVariantMap kdfToParameters(QSharedPointer<Kdf> kdf); QSharedPointer<Kdf> uuidToKdf(const Uuid& uuid); Uuid kdfToUuid(QSharedPointer<Kdf> kdf); From 337a21f6d6bc022e4a8928a96c941f910ffcc797 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Thu, 11 Jan 2018 00:35:39 +0100 Subject: [PATCH 249/402] Save AES-KDF round parameter as quint64 --- src/crypto/kdf/AesKdf.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/crypto/kdf/AesKdf.cpp b/src/crypto/kdf/AesKdf.cpp index df4392468..593b01c24 100644 --- a/src/crypto/kdf/AesKdf.cpp +++ b/src/crypto/kdf/AesKdf.cpp @@ -54,7 +54,7 @@ QVariantMap AesKdf::writeParameters() // always write old KDBX3 AES-KDF UUID for compatibility with other applications p.insert(KeePass2::KDFPARAM_UUID, KeePass2::KDF_AES_KDBX3.toByteArray()); - p.insert(KeePass2::KDFPARAM_AES_ROUNDS, rounds()); + p.insert(KeePass2::KDFPARAM_AES_ROUNDS, static_cast<quint64>(rounds())); p.insert(KeePass2::KDFPARAM_AES_SEED, seed()); return p; } From 824607080a5fda83e6d667b076f99a607b09721d Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sat, 13 Jan 2018 01:38:26 +0100 Subject: [PATCH 250/402] Install needed PPA packages for deployment --- AppImage-Recipe.sh | 2 ++ Dockerfile | 22 ++++++++++++++-------- ci/trusty/Dockerfile | 32 +++++++++++++++++++++++--------- cmake/FindLibGPGError.cmake | 2 +- src/format/KdbxXmlReader.cpp | 2 +- 5 files changed, 41 insertions(+), 19 deletions(-) diff --git a/AppImage-Recipe.sh b/AppImage-Recipe.sh index f8d7e105f..2187fde1f 100755 --- a/AppImage-Recipe.sh +++ b/AppImage-Recipe.sh @@ -72,6 +72,8 @@ get_desktop get_icon cat << EOF > ./usr/bin/keepassxc_env #!/usr/bin/env bash +export LD_LIBRARY_PATH="/opt/libgcrypt20-18/lib/x86_64-linux-gnu:\${LD_LIBRARY_PATH}" +export LD_LIBRARY_PATH="/opt/gpg-error-127/lib/x86_64-linux-gnu:\${LD_LIBRARY_PATH}" export LD_LIBRARY_PATH="..$(dirname ${QT_PLUGIN_PATH})/lib:\${LD_LIBRARY_PATH}" export QT_PLUGIN_PATH="..${QT_PLUGIN_PATH}:\${KPXC_QT_PLUGIN_PATH}" diff --git a/Dockerfile b/Dockerfile index 20d7ff352..4ceaf9968 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,6 +16,8 @@ FROM ubuntu:14.04 +ENV REBUILD_COUNTER=1 + ENV QT5_VERSION=59 ENV QT5_PPA_VERSION=${QT5_VERSION}2 @@ -25,8 +27,7 @@ RUN set -x \ RUN set -x \ && add-apt-repository ppa:beineri/opt-qt${QT5_PPA_VERSION}-trusty \ - && add-apt-repository ppa:phoerious/keepassxc \ - && LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php + && add-apt-repository ppa:phoerious/keepassxc RUN set -x \ && apt-get update -y \ @@ -37,7 +38,9 @@ RUN set -x \ && apt-get install -y \ cmake3 \ g++ \ - libgcrypt20-dev \ + libgcrypt20-18-dev \ + libargon2-0-dev \ + libsodium-dev \ qt${QT5_VERSION}base \ qt${QT5_VERSION}tools \ qt${QT5_VERSION}x11extras \ @@ -47,13 +50,16 @@ RUN set -x \ libxtst-dev \ mesa-common-dev \ libyubikey-dev \ - libykpers-1-dev \ - libsodium-dev + libykpers-1-dev -ENV CMAKE_PREFIX_PATH=/opt/qt${QT5_VERSION}/lib/cmake -ENV LD_LIBRARY_PATH=/opt/qt${QT5_VERSION}/lib +ENV CMAKE_PREFIX_PATH="/opt/qt${QT5_VERSION}/lib/cmake" +ENV CMAKE_INCLUDE_PATH="/opt/libgcrypt20-18/include:/opt/gpg-error-127/include" +ENV CMAKE_LIBRARY_PATH="/opt/libgcrypt20-18/lib/x86_64-linux-gnu:/opt/gpg-error-127/lib/x86_64-linux-gnu" +ENV LD_LIBRARY_PATH="/opt/qt${QT5_VERSION}/lib:/opt/libgcrypt20-18/lib/x86_64-linux-gnu:/opt/gpg-error-127/lib/x86_64-linux-gnu" RUN set -x \ - && echo /opt/qt${QT_VERSION}/lib > /etc/ld.so.conf.d/qt${QT5_VERSION}.conf + && echo "/opt/qt${QT_VERSION}/lib" > /etc/ld.so.conf.d/qt${QT5_VERSION}.conf \ + && echo "/opt/libgcrypt20-18/lib/x86_64-linux-gnu" > /etc/ld.so.conf.d/libgcrypt20-18.conf \ + && echo "/opt/gpg-error-127/lib/x86_64-linux-gnu" > /etc/ld.so.conf.d/libgpg-error-127.conf # AppImage dependencies RUN set -x \ diff --git a/ci/trusty/Dockerfile b/ci/trusty/Dockerfile index bd6bec1d2..d8911f2af 100644 --- a/ci/trusty/Dockerfile +++ b/ci/trusty/Dockerfile @@ -18,6 +18,8 @@ FROM ubuntu:14.04 +ENV REBUILD_COUNTER=1 + ENV QT5_VERSION=53 ENV QT5_PPA_VERSION=${QT5_VERSION}2 @@ -27,27 +29,39 @@ RUN set -x \ RUN set -x \ && add-apt-repository ppa:beineri/opt-qt${QT5_PPA_VERSION}-trusty \ - && LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php + && add-apt-repository ppa:phoerious/keepassxc RUN set -x \ && apt-get -y update \ && apt-get -y --no-install-recommends install \ - git build-essential clang-3.6 libclang-common-3.6-dev clang-format-3.6 cmake3 make \ - curl ca-certificates gnupg2 \ - libgcrypt20-dev zlib1g-dev libyubikey-dev libykpers-1-dev \ + build-essential \ + clang-3.6 \ + libclang-common-3.6-dev \ + clang-format-3.6 \ + cmake3 \ + make \ + libgcrypt20-18-dev \ + libargon2-0-dev \ + libsodium-dev \ qt${QT5_VERSION}base \ qt${QT5_VERSION}tools \ qt${QT5_VERSION}x11extras \ qt${QT5_VERSION}translations \ + zlib1g-dev \ + libyubikey-dev \ + libykpers-1-dev \ libxi-dev \ libxtst-dev \ - xvfb \ - libsodium-dev + xvfb -ENV CMAKE_PREFIX_PATH=/opt/qt${QT5_VERSION}/lib/cmake -ENV LD_LIBRARY_PATH=/opt/qt${QT5_VERSION}/lib +ENV CMAKE_PREFIX_PATH="/opt/qt${QT5_VERSION}/lib/cmake" +ENV CMAKE_INCLUDE_PATH="/opt/libgcrypt20-18/include:/opt/gpg-error-127/include" +ENV CMAKE_LIBRARY_PATH="/opt/libgcrypt20-18/lib/x86_64-linux-gnu:/opt/gpg-error-127/lib/x86_64-linux-gnu" +ENV LD_LIBRARY_PATH="/opt/qt${QT5_VERSION}/lib:/opt/libgcrypt20-18/lib/x86_64-linux-gnu:/opt/gpg-error-127/lib/x86_64-linux-gnu" RUN set -x \ - && echo /opt/qt${QT_VERSION}/lib > /etc/ld.so.conf.d/qt${QT5_VERSION}.conf + && echo "/opt/qt${QT_VERSION}/lib" > /etc/ld.so.conf.d/qt${QT5_VERSION}.conf \ + && echo "/opt/libgcrypt20-18/lib/x86_64-linux-gnu" > /etc/ld.so.conf.d/libgcrypt20-18.conf \ + && echo "/opt/gpg-error-127/lib/x86_64-linux-gnu" > /etc/ld.so.conf.d/libgpg-error-127.conf RUN set -x \ && apt-get autoremove --purge \ diff --git a/cmake/FindLibGPGError.cmake b/cmake/FindLibGPGError.cmake index c1e1b8686..9a18371ba 100644 --- a/cmake/FindLibGPGError.cmake +++ b/cmake/FindLibGPGError.cmake @@ -14,10 +14,10 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. find_path(GPGERROR_INCLUDE_DIR gpg-error.h) - find_library(GPGERROR_LIBRARIES gpg-error) mark_as_advanced(GPGERROR_LIBRARIES GPGERROR_INCLUDE_DIR) include(FindPackageHandleStandardArgs) +include_directories(${GPGERROR_INCLUDE_DIR}) find_package_handle_standard_args(LibGPGError DEFAULT_MSG GPGERROR_LIBRARIES GPGERROR_INCLUDE_DIR) diff --git a/src/format/KdbxXmlReader.cpp b/src/format/KdbxXmlReader.cpp index be692abe3..774bb00c7 100644 --- a/src/format/KdbxXmlReader.cpp +++ b/src/format/KdbxXmlReader.cpp @@ -629,7 +629,7 @@ void KdbxXmlReader::parseDeletedObject() { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "DeletedObject"); - DeletedObject delObj{}; + DeletedObject delObj{{}, {}}; while (!m_xml.hasError() && m_xml.readNextStartElement()) { if (m_xml.name() == "UUID") { From 90380adc901536ddbc0bf6d4b4dea3eff93b414f Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sat, 13 Jan 2018 02:47:02 +0100 Subject: [PATCH 251/402] Fix test compilation errors * Use legacy AES-KDF mode for KeePass1Reader --- src/format/KeePass1Reader.cpp | 13 ++++++------- tests/TestKeePass1Reader.cpp | 2 +- tests/gui/TestGui.cpp | 2 +- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/format/KeePass1Reader.cpp b/src/format/KeePass1Reader.cpp index c6e2ed03c..20f9ff232 100644 --- a/src/format/KeePass1Reader.cpp +++ b/src/format/KeePass1Reader.cpp @@ -30,7 +30,6 @@ #include "core/Tools.h" #include "crypto/CryptoHash.h" #include "format/KeePass1.h" -#include "keys/CompositeKey.h" #include "keys/FileKey.h" #include "keys/PasswordKey.h" #include "streams/SymmetricCipherStream.h" @@ -94,13 +93,13 @@ Database* KeePass1Reader::readDatabase(QIODevice* device, const QString& passwor bool ok; - quint32 signature1 = Endian::readSizedInt<quint32>(m_device, KeePass1::BYTEORDER, &ok); + auto signature1 = Endian::readSizedInt<quint32>(m_device, KeePass1::BYTEORDER, &ok); if (!ok || signature1 != KeePass1::SIGNATURE_1) { raiseError(tr("Not a KeePass database.")); return nullptr; } - quint32 signature2 = Endian::readSizedInt<quint32>(m_device, KeePass1::BYTEORDER, &ok); + auto signature2 = Endian::readSizedInt<quint32>(m_device, KeePass1::BYTEORDER, &ok); if (!ok || signature2 != KeePass1::SIGNATURE_2) { raiseError(tr("Not a KeePass database.")); return nullptr; @@ -112,7 +111,7 @@ Database* KeePass1Reader::readDatabase(QIODevice* device, const QString& passwor return nullptr; } - quint32 version = Endian::readSizedInt<quint32>(m_device, KeePass1::BYTEORDER, &ok); + auto version = Endian::readSizedInt<quint32>(m_device, KeePass1::BYTEORDER, &ok); if (!ok || (version & KeePass1::FILE_VERSION_CRITICAL_MASK) != (KeePass1::FILE_VERSION & KeePass1::FILE_VERSION_CRITICAL_MASK)) { raiseError(tr("Unsupported KeePass database version.")); @@ -131,13 +130,13 @@ Database* KeePass1Reader::readDatabase(QIODevice* device, const QString& passwor return nullptr; } - quint32 numGroups = Endian::readSizedInt<quint32>(m_device, KeePass1::BYTEORDER, &ok); + auto numGroups = Endian::readSizedInt<quint32>(m_device, KeePass1::BYTEORDER, &ok); if (!ok) { raiseError("Invalid number of groups"); return nullptr; } - quint32 numEntries = Endian::readSizedInt<quint32>(m_device, KeePass1::BYTEORDER, &ok); + auto numEntries = Endian::readSizedInt<quint32>(m_device, KeePass1::BYTEORDER, &ok); if (!ok) { raiseError("Invalid number of entries"); return nullptr; @@ -160,7 +159,7 @@ Database* KeePass1Reader::readDatabase(QIODevice* device, const QString& passwor raiseError("Invalid number of transform rounds"); return nullptr; } - auto kdf = QSharedPointer<AesKdf>::create(); + auto kdf = QSharedPointer<AesKdf>::create(true); kdf->setRounds(m_transformRounds); kdf->setSeed(m_transformSeed); db->setKdf(kdf); diff --git a/tests/TestKeePass1Reader.cpp b/tests/TestKeePass1Reader.cpp index c372c8715..a4ad56ca6 100644 --- a/tests/TestKeePass1Reader.cpp +++ b/tests/TestKeePass1Reader.cpp @@ -110,7 +110,7 @@ void TestKeePass1Reader::testBasic() void TestKeePass1Reader::testMasterKey() { QVERIFY(m_db->hasKey()); - QCOMPARE(m_db->kdf()->rounds(), static_cast<quint64>(713)); + QCOMPARE(m_db->kdf()->rounds(), 713); } void TestKeePass1Reader::testCustomIcons() diff --git a/tests/gui/TestGui.cpp b/tests/gui/TestGui.cpp index d591165c4..d1a251069 100644 --- a/tests/gui/TestGui.cpp +++ b/tests/gui/TestGui.cpp @@ -911,7 +911,7 @@ void TestGui::testDatabaseSettings() QTest::keyClick(transformRoundsSpinBox, Qt::Key_Enter); // wait for modified timer QTRY_COMPARE(m_tabWidget->tabText(m_tabWidget->currentIndex()), QString("Save*")); - QCOMPARE(m_db->kdf()->rounds(), Q_UINT64_C(123456)); + QCOMPARE(m_db->kdf()->rounds(), 123456); triggerAction("actionDatabaseSave"); QCOMPARE(m_tabWidget->tabText(m_tabWidget->currentIndex()), QString("Save")); From 96e271e8bee1255a84b620fec3328de93189db28 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sat, 13 Jan 2018 15:00:15 +0100 Subject: [PATCH 252/402] Force Docker rebuild to fetch fixed version of libgpg-error-127 --- Dockerfile | 2 +- ci/trusty/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 4ceaf9968..69db2ac1f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,7 +16,7 @@ FROM ubuntu:14.04 -ENV REBUILD_COUNTER=1 +ENV REBUILD_COUNTER=2 ENV QT5_VERSION=59 ENV QT5_PPA_VERSION=${QT5_VERSION}2 diff --git a/ci/trusty/Dockerfile b/ci/trusty/Dockerfile index d8911f2af..cdaba3a07 100644 --- a/ci/trusty/Dockerfile +++ b/ci/trusty/Dockerfile @@ -18,7 +18,7 @@ FROM ubuntu:14.04 -ENV REBUILD_COUNTER=1 +ENV REBUILD_COUNTER=2 ENV QT5_VERSION=53 ENV QT5_PPA_VERSION=${QT5_VERSION}2 From 157508858526f960a0d9427f82e09ed2d4c429d5 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sat, 13 Jan 2018 22:45:10 +0100 Subject: [PATCH 253/402] Add 'KDBX 4' to Argon2 KDF name and select first category in the database settings by default --- src/format/KeePass2.cpp | 2 +- src/gui/DatabaseSettingsWidget.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/format/KeePass2.cpp b/src/format/KeePass2.cpp index d58e8bbfd..30fb304c7 100644 --- a/src/format/KeePass2.cpp +++ b/src/format/KeePass2.cpp @@ -51,7 +51,7 @@ const QList<QPair<Uuid, QString>> KeePass2::CIPHERS{ }; const QList<QPair<Uuid, QString>> KeePass2::KDFS{ - qMakePair(KeePass2::KDF_ARGON2, QObject::tr("Argon2 (recommended)")), + qMakePair(KeePass2::KDF_ARGON2, QObject::tr("Argon2 (KDBX 4 – recommended)")), qMakePair(KeePass2::KDF_AES_KDBX4, QObject::tr("AES-KDF (KDBX 4)")), qMakePair(KeePass2::KDF_AES_KDBX3, QObject::tr("AES-KDF (KDBX 3.1)")) }; diff --git a/src/gui/DatabaseSettingsWidget.cpp b/src/gui/DatabaseSettingsWidget.cpp index c0cc06296..d145a2381 100644 --- a/src/gui/DatabaseSettingsWidget.cpp +++ b/src/gui/DatabaseSettingsWidget.cpp @@ -132,6 +132,7 @@ void DatabaseSettingsWidget::load(Database* db) } m_uiGeneral->dbNameEdit->setFocus(); + m_ui->categoryList->setCurrentCategory(0); } void DatabaseSettingsWidget::save() From 43a620b9ff0fae7bc5a6237189168ef17667d2d7 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sat, 13 Jan 2018 18:44:56 +0100 Subject: [PATCH 254/402] Explicitly include <QMimeData>, resolves #1366 --- src/gui/MainWindow.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 4804b47b2..08331ffec 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -20,6 +20,7 @@ #include "ui_MainWindow.h" #include <QCloseEvent> +#include <QMimeData> #include <QShortcut> #include <QTimer> From c2ead0e2657ddfeecb8e7b34841dd79c791d451b Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sat, 13 Jan 2018 22:10:26 +0100 Subject: [PATCH 255/402] Fix macOS building and code signing, resolves #1344 --- COPYING | 4 ++++ LICENSE.MIT | 19 +++++++++++++++++++ release-tool | 25 ++++++++++++------------- share/macosx/DS_Store.in | Bin 0 -> 10244 bytes share/macosx/Info.plist.cmake | 2 +- share/macosx/background.tiff | Bin 0 -> 17836 bytes src/CMakeLists.txt | 2 ++ 7 files changed, 38 insertions(+), 14 deletions(-) create mode 100644 LICENSE.MIT create mode 100644 share/macosx/DS_Store.in create mode 100644 share/macosx/background.tiff diff --git a/COPYING b/COPYING index 7aa9c0333..fe199fcd4 100644 --- a/COPYING +++ b/COPYING @@ -235,3 +235,7 @@ Files: src/gui/KMessageWidget.h Copyright: 2011 Aurélien Gâteau <agateau@kde.org> 2014 Dominik Haumann <dhaumann@kde.org> License: LGPL-2.1 + +Files: share/macosx/dmg-background.tiff +Copyright: 2008-2014, Andrey Tarantsov +License: MIT diff --git a/LICENSE.MIT b/LICENSE.MIT new file mode 100644 index 000000000..d13cc4b26 --- /dev/null +++ b/LICENSE.MIT @@ -0,0 +1,19 @@ +The MIT License (MIT) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/release-tool b/release-tool index 93e964bc3..492f7c08c 100755 --- a/release-tool +++ b/release-tool @@ -317,13 +317,6 @@ checkCodesignCommandExists() { fi } -checkCreateDMGCommandExists() { - command -v create-dmg > /dev/null - if [ 0 -ne $? ]; then - exitError "create-dmg command not found on the PATH! Please install it using 'npm install --global create-dmg'." - fi -} - checkQt5LUpdateExists() { command -v lupdate > /dev/null if [ 0 -eq $? ] && ! $(lupdate -version | grep -q "lupdate version 5\."); then @@ -813,17 +806,16 @@ appsign() { fi checkCodesignCommandExists - checkCreateDMGCommandExists local orig_dir="$(pwd)" for f in "${sign_files[@]}"; do if [[ ${f: -4} == '.dmg' ]]; then logInfo "Unpacking disk image '${f}'..." local tmp_dir="/tmp/KeePassXC_${RANDOM}" - mkdir -p ${tmp_dir}/{mnt,app} + mkdir -p ${tmp_dir}/mnt hdiutil attach -quiet -noautoopen -mountpoint ${tmp_dir}/mnt "${f}" cd ${tmp_dir} - cp -a ./mnt/KeePassXC.app ./app + cp -a ./mnt ./app hdiutil detach -quiet ${tmp_dir}/mnt if [ ! -d ./app/KeePassXC.app ]; then @@ -839,10 +831,17 @@ appsign() { exitError "Signing failed!" fi - logInfo "Repacking and signing disk image..." - create-dmg ./app/KeePassXC.app + logInfo "Repacking disk image..." + hdiutil create \ + -volname "KeePassXC" \ + -size $((1000 * ($(du -sk ./app | cut -f1) + 5000))) \ + -srcfolder ./app \ + -fs HFS+ \ + -fsargs "-c c=64,a=16,e=16" \ + -format UDBZ \ + "${tmp_dir}/$(basename "${f}")" cd "${orig_dir}" - cp -f ${tmp_dir}/KeePassXC-*.dmg "${f}" + cp -f "${tmp_dir}/$(basename "${f}")" "${f}" rm -Rf ${tmp_dir} else logInfo "Skipping non-DMG file '${f}'..." diff --git a/share/macosx/DS_Store.in b/share/macosx/DS_Store.in new file mode 100644 index 0000000000000000000000000000000000000000..9f03769c1c97baa5022a6e29321c6723505d3eb3 GIT binary patch literal 10244 zcmeHMU2G#)6+UA-jnmDKlX%$@w$-#*P$ky(c>EV{K<hY8XlSKGc(r6{%Vs<?_FAz$ zmhJp()1}_G3hfI#z#<`0q#{+SL|=;NLlNa|C3vV{we3SCD)IBkt^_YgK>5zh9mlcL zZ9zi(&GFtj-#z!9bI(0<@40t2L?q>Rj5v`@L_rkhp>aHpA#Ud~L_Q&z0+*mqRte}< zsadPGJ43xaffoTU0$v2X2zU|jBJiIO0i4-P!4nSmo?ZmJ2zU|bMS$~zjKVx8c-P@} z>cGSP1ON{}Y!h&Z0k|x9PVlb7(E^ejRd7dD5}z27qYk+&`sD=gI^0nwNql@rVq{5t zp-A@VurJ%)Ny<6gdwLP@A}|~Q=i5D6+G{sUwf^sSMR`Z^`2!;lj0Tw|g3lJOSbN2e z*4b(2wbs*it!kJhfiGBAt%tSJ#j3e?ITT*D8Xc|LFk5}ypZRjNVOV>4Yo}qfZ95xU z=L&S~fi8zm9ULUHXJvIEeeJA#kWMRS<)oUpb}bk@_38NM*S6|cpF4Q|+ShJ6laWM1 zAf8D-eFqhZqE&rY%q;MN^FI@c^6SvFJGZe1PmE7YPKBmtX2T~xaq6K@&dq)5^uu$H zgyqYj*^;JjS6b}nvQ@KM`Pz<&IUP#Z>RQEIs#Uf2<<L|c;aStI#zxEB#pIu^w5mq2 zsp-{5WwT@McZ${LpgnV_ZQJ~kX?*oibm40A=m>V7FSJavVcT0Tm)mA%vkzb5k@c2U zt8G~AYNu*7E<Iy=(lP66jk1Li*_-tyH?=RCtv2|O&gLbp)zTUjGk^8jnpQGv>y5nC z=~(s6DrUr<&!4~hmo*OW`n2!s%<)7D9(&R>H?($pbD3pF=}tG4d*ZV+0%>^aaE{SV zwOl^h^JCRc!rpne=LaC732_LxQaTYm9ET4g913^3J_YU50>^-zGbarHKhtynT%YDS zI<(?=JBib1ib|xBPTN$W7Fo1I4KgT79ja0pzbOjS7(GcQejDi7#&46BX@*Y6`i#d0 zZO_t7?4niMshjOs&m9U&GCU<o<|vQUHGRFv^<la_`tx@YWhUQ5Pd{qZE5m(1Qu5fw z>YeV)H{5<sl*eSZF1YKC9pBrdue|}eh;QIJFz-ko&Du_%8*pioPSeCOQHmm#bwqZG z#<61RcBI#-i0BPYYL=uJ@!RJzHlO>V<JElbaRJWXePr|{;E)fC_TWbh=TU5$&t1&f zAQ+M^G^~aR1A5n%V1Y#Ny1qg++NbOEE&2hyNw?@W{ht0P1*JLZjHF77Qo;XA|F8V- z`G4pCga4lY&jDZHL|{BH8JG=(9Wy>RAwBBU-DluoAS9$_KCg&W`||suF^5~r+ipjh z=%%>U_<-;EorV$Mps*bR#y^{;0iF`_8Q`-5&jNo=U>SH{;2iKxfh8VP;1IAFmb&+d zUUw_5*V~TQBkz?gYrFdZG${~Ln0*92j}*Yh{5%sZ=TR_D+hWyY*EsdwQbC=+Nx4to z&cWJnWP>{>#B%t<Tt-QvJb{AUPXUbi{ikeadv!N!xb5P__1aHDkIA*W5BwqupE$3e zupUon>8+8%x4T3Sq00AB5lGul?$S>ZVlW4RgvpkxHS=67HoWVRoLrx1Yuk3Se=HvV z4BNm!Y9duomE}Z4&90^*2~|-d3kfwD$!7B_D}_uv8BZ^`erdwDyR(NrvTyD?c?p4? z5O#a-Kx7c^!?ArCW4gYrZal{7wm!Gr5^W+TD{pn3zWsCMQ-J+;Gns3P<e%MuTZb|I z$v4w)pzh9dMa?WLt4chww3=CsBvSE}$kIwW6UoQZY9^V?EUgwY?mVya7$}4DWEqdm zx&M2N5f4*0lBuj(GBf2;HlEdtbUKqZl&qG~v*oO+s|j5<7gFU#MbI#C8dPObx9U-? z*{qrTjI_0eQL^@<EmJchd#!56bXDVvO59dbT?uNcno^SK#n`rKHgS;d>rUWbho65# z{^fVWG>H<xf_#%F0~!H-SKtuv`?i#bGs$m-oU=#QUPb5+{3o|Ra6rhXfs+Dr_6Q5i z+2f4BGVqqb3b4D-2Q$VE*A92VSi=h(cF@N2qI(z@dy{j)zrs&mw|2h4I6VxRi#Zg$ z?|J=pAnc;t5S;N(xefDC7cyohnMst=iKJ>O>OyKkGZG19K~E)9MoNvRN}8&av%NPu z4F36blIj_AY{XNGv0ZUh=&hIgUM}btm<Pw3=R1yhVR_i=XbYT)*AeeGCSFG%oKd^Q zR-<M$Dt3*NarC&$&sxpW#Yx7RTTo5#m4Odt(1&OZ*nSYU%eX3;w2RWfb*fFqQOgoG z_z}y;>I~Q&rzL9QSHty8$900QX%_6a2W<Zpp8l}U>*Fsc8rwRmN#BL$YadUuR*4sp zC7K)->7D&o!R|9o-6|A}osN#n>kA+Jn04;o+xQ21H?Q=0@|z9YxcB(~i~!OvlgxLm z6>R?x`TM`!$$NMa@FMWP838F!C>HXV8($KRBfi(kC|f8@+^_3!TLlmM>IaT1hF#(N z{o{-wQ<yUW=LGLM91_sK;g12{_rD$Zx9#XNq`}*~_x&H@;NbgUAN)m>n<%fK@Y?2u J{$Kt5|98%B0-68- literal 0 HcmV?d00001 diff --git a/share/macosx/Info.plist.cmake b/share/macosx/Info.plist.cmake index ea1a9bc2c..b38ca2844 100644 --- a/share/macosx/Info.plist.cmake +++ b/share/macosx/Info.plist.cmake @@ -29,7 +29,7 @@ <key>CFBundleVersion</key> <string>${KEEPASSXC_VERSION_NUM}</string> <key>NSHumanReadableCopyright</key> - <string>Copyright 2016-2017 KeePassXC Development Team</string> + <string>Copyright 2016-2018 KeePassXC Development Team</string> <key>CFBundleDocumentTypes</key> <array> <dict> diff --git a/share/macosx/background.tiff b/share/macosx/background.tiff new file mode 100644 index 0000000000000000000000000000000000000000..99ae807ec865cd1321f715bd520601d3056c4de4 GIT binary patch literal 17836 zcmeI22UHYUy2o#IqRBZ5(jZBsNfMgS(B!OS5J7>a$vF!mAc&GA2#5p;DvF9?APFcS z2uctT1O=2JNkMTGb9mM2s<UTyW_RZ8Id9)m=XBM-Zhg0I`s&`Q{(fd=KoS5Ni8z2W zCx~z{(j;oTnAf{02{0efb+sTIx5aa(>60z$AB7VIGY#D=RYda4#B+=(mJM#TPBQtX z?p7+t@A@ehZSk;bc=Repv(((vT2+)Q-Qc*Tm-Q8jQt{SP*4{R%Cv2<i&f5CeT$v4T z-dSz$YpW)j*XwcF!OymlQace)@91x*cH-`GMAMD{yT;j9A7fjb1MSttxEc4iy9U`e zxho4~bh!m@Q?IbYAMSAv+14}{K`iO_40Rxi9X2~T<Q?YF>|W<|e$+R7JF#NKuWsBw zVte!4>zHekfsu|H;@s(-kAinOUiDBezP%6{<)m@au4-f{Jlg5%d_?oZmB`&YG{q11 z&cBR`*>TOIZsOUS-FtRwo*Y?z{b5h+&TI3pKYVUsVL(GInNp0%Ru)rEbZe%s08JZ9 znka2s=2<-bb(S7Q#_O3&MCNu@20hmHEGaYg4pvhe&W<c!C+-`pX%yZYS!ey$b+Yz^ z33O&H#Rzt>G3*oS%9cvsaFfk6SM+AKZ?X6-wzLx)Z)KmY+SJX~Q-kl$UTT)<VQ1)& z>p3LVySbO$bXc+Xkne<YAA8!YO5dTg%WAjTdsd0J4=sJv?B`%aYxU>g8FdCY%sBN1 za{L4g207A2jRte7@FsUSdKJy?<SY}n4skN-Sq$ak&8&tw&1`IjbN!s`?sBG6w%yIG z^4mVb*&F6GlDizUbCip5pUY?-KAn7z%Pg1DJ;_+?As9~Hi`>@5SrqMH_6CC}jpIQ? zZO1RH^DNCPn+dFQj$cWD#AEs=K%6iWT3{qPnD*!?0#Epk-g-%J)R3?~^kG%CESTt$ z6$x=Z1rTWDUM=VTNL?{b`Xn8f{x^yGqI8ULPMOZ9&>idt4afs;QAv6mvW?sZcj;Ex zY|1mC48Dy+sV^pA0RC;_T$tL?tsZyYp)vb(%FWwJ+)_LQ$Zx=F=-od36IQ2fyoV$0 z^AS@CSb&e}Na`S8+~#{XTKBRw<lmYY$5mW08*;_Te<Zs7vLoc%x({&0%%c<9Tmna< zPIV!M6X=0dlfHrIp<9&T{?=;rF$@o|e;b3@uXk+FmWIUT%i{^TEQa0xnAAxT5hN6| zxHM|bTzU`?G4?TzMgB<w6AwR=fp~6r6HCa7#o+rRcOHjD4NbOGrDE30sDAuRv%f=x zE={r8{M3oCnOD&<58kkFu)Ryj7|~?zoL{{u5;WOH>;JLEoF6+tyCs_;rleYm7t`9q zlDDIDS|~WCb)`v;;jFM%ctU*V`(#F43x2~=q(Ly#241r!6RwVdD0A^619VtA!N;a9 z{GAr}aT0v2u2}jagAcoey9Nn>tz=%9fw5%nWtPM(3yE@&*CneFTWDF-Al=%Qk8r@X z@_zC$xuf3yAxTKcJpncU_Jl&8RbksEAezF!nRr5XQR8->^8r^}>#k3ftuKiz4-yv3 zvAiX7itLOy-0w{!di0WSgp9h{(z<?QA~83=a|Od0a!oAcR}%>mUtR2a!8kkP$3${C zxA35cp6l8~@*g;n+{^PT_PEcLe!}a1UR9OP7*}tN-&o#qbHF$^V@J^VVSI1M1h?66 z*u-JKiHHZ>>9e~Y9Ijf9e#qUs8uRe*^2gXo9wv1BWWF?G!W7RI&V5t){sQ}_c@Byu zPv@V*r_QiuBYw{V|J+ihgTnz12mmAi07B%zJLs#1GN}n)HNe6e`Awr?jrpeGTo4mL zz<JpLVA6+J0SeY|DpnO@`(^{*9OC>*bA8h{;B@Zq_R<g^fbR@oYwUVx-FGbp@&A-p z;+uv`gyg=I%L13{01<ymCs8%EIaqzj>RUQ|*Zm=Y1^@;_*xnlexfR#|*3|O;c0?Hg zfY=M4+rU4##V88^Fn3l~W@ifu;^V8To;{nKG&Gcv@$`KB*xP$)$;Kum<mpo~IVNWR z{>aFztmWl^fTE%&Pu$%rDi#)Y?2wf`f8N$sUcRnwYRcSPQL&|EV#3IXK<Mlo9o5xU zSMTc^9Mse#k%oqPd)3tR^zPkjZ&y|}F?sl~xmiKM!eV;5rpC$X<jJE)ckOa@O-l0d zxpgZ)f6tz@v;zmSvm+vkiz$@q>V}4{E)|vAw~0h8t(h5p{hl6YXF0i)lnWQ&R;+D* zxd+z9|1WppfAkGjS06tvE>29Wu73G)cGk#9R@U45*)w0?=g;lz!oy#@pip9CQ&OU$ za&mt8B`Bz*WM#$E^YrQEW$IIS@uI!`=FN?bb8{9JN=ohRQ&YyqDk|OG<Kz1JMB?D! z$Ows~t$pv_z<|2Cfx*N?R~La`YC1F1+N!8%Wi>zF(6DponKNZ&(a~;h$;p0xeSL+6 zad8<Lsj0cSQBkF(9v+u2H8=P4sH)z%qoJXrv#?-j*x&E!Dlea&UQ_cQ-R=KpD(~j! zfp>Kw`*;Kgg!#Kk2l{&e5bEXb9v155iwl=mQIM8{>&jqg>g6ARfL9|w|IlDd18toB zHU}I{AG}7<0t|pnT*x7TW>)&v)P@=9>EJ?OqhB}j)!i?v5x9dlG{@n7eeDm=SjmCG zq408M4qI+^qlA!Qod|2+h|oZ4I(5C{aP^^T1a*z(2!<;NYaXih_^PG8*nHI_s&@19 zcY|%Hbq;j%bEE2ZSRV)vqre(z3hShBFG>WghhQz@8|LQ)>o>6G@T0hdz-uT2H9eF< z_Jp-8tQmr>Ep=e64ll6`9zSW<pL8fC60RozIst*Zg1tOELva%1jW{_K6#~wX65&e; z4aJ+oL*f$bhSLe~3v}_{1;E!fQ*!|}YTx4EPF9jrQBuOoe;J`KSN`bY-;Dm?NFCd+ zCNC_$j2Xn$^CRs?<{xPR<p2;?;l9cIk>+{?fVzDE@ZA5ACQ=Fjb0Pq>w|{C67u8=p zLqh{qWn>~EBBZ@2WNB)Le&7Dk;Jf8N7C)6IO)c+x-{EvA?k-`zp*U)%k^_7L!h&%j zfi7eU4*&N~{HHViRIQ)tA!SK%rvy{{;i7C|FZ1&EfQQ@P%`4O^z#r%3|BpuaPiFh6 z4pjNouVKM{{1f2VDGgX|a{%OW4?wZg1Ek|o_zLuW+)Qb00rknV6P*9*_ppYqf7$<P zhsc0W5g}e4IBK$vr8SNm79391@H0W(p#dFW1{{DFtOpx_1i%A%pbXRi3FrZ1uoYN? zZD0o=15e-wf<Xk>4dOu(NClZ77ZiXJa2!;EbKoMV15Kb6+yLF69}I&rFbQVC6R-ka zf%gyu(Ljt4JH!hKLZZ+nNFE|U8jv1j3RyziAZN$}@`u8p-B1FQ3S~nDP#IJSU4R;( zR_G=)0NsP8phf5x=p6!yU_fvn1Q22f83X~Lg)l)_Bb*Q(h#*81A`x*Ak&h@xoJG_k zS`podVZ<cj31Sugh@eMuA%&25Bmt>|+=_HSx+8;;dypx}JY+fY9P$dX6L|+YiCjXy zMPX3vC>#opQbQS{Y*1uW5NZ!94OM_Tg{nohqwb)lP%EfUXht+YdJ|d|ZG^T*d!QrG zN$5Ou1-b^^fgVQBqF-S!7%q%BMj2y>*@p4PL}Su0#hCM$7R&%<2D3^-L&Hn6iH1nC zmBxi8lqQMh2+diVYczv2vovq8^jJZxJXRm;fc3}j#pYp8W3OTdvGdsXv@Eouw5qgQ zY29dd(Pq#dr@caZn|7A=Jsm5ZI31DBn$DXpo-Uv699;+9INb|+dU|1c6?zMLFZww8 zeEMqoF8V3@w+w6yk_<WwjtpT82N_N>v@qObc)`fXD8@))bYKi+Jjhtdc%AV9;~OS+ zCTS)kCO4*7rb4D#ra`8s%(Tp+%v#Jln4_5Um@hHkW?o{UWf5c1VR2#E!&1o7z%s(J z%F50v$GVl(k2Q_;H0w>)1vVNsF*ZFmH?~B!V{F&iX4sMJ8`yQ&$?OU2$JsmBXE`t& z;v7aC-W;hMRUCaBE1Ybc3Y@l_k(`B`&76~5NG>rhBQ9UA46ch@ce&ni3vg?3Q@E44 z&v6fOzvfxTL*k+Er0|^Q8RmJ%i{sVf_2JFpt>c~GL-9%SS@1>h9p&rbTUy7lPHi1| zUCO$P>+bU-_$B!*`J?%d@%Qkr3al3}5C{}FB5++`X+76^(t7XpIqR>kUle2))DZL% z%n`gM_!!5D)57`U@^S6B6(N2hL!mICGNC@9_rl`BHo|*_&kIj%pxZ#$;JzVeL)(TG z5kV0%k=-I^MDB~yiV{RUMGuR1ioO;T7qb)FFIFeEAkHIhBpxMxMtod?Q9@H9NTOU~ zXd`ALVWZE+;*I^12uVdrPsu{b+nW%Zls0*7D&908g_cs0@|P-?8o@K*weaEiGx#ZK zE@@Ngz0!5kPh~`89AvU&I%Ph|D$4rG9+w@HW0NzM+befP?iYDUd9r+={Lp5`&H9^T zH`i}|uCPggqHt7URFPfLOmV+ro8m_$Wu;)Hb4rWKBFfInMam-t4uUx$jnJinR?$|8 zRcTUrtE!|Ls(MlNnHpZrNA0xQg1WdmMg6$?3{jZqLM$UrYTz`SHA*!mHH9=?G|M%o zNgGIRqzcl!)<!LFt+QHBwPm$~wQICr>!|9)=(Ok}bq#b=bo=z!^lbDB^d9I7>wD;* z(O)r8G>A56F+>}h7-kuc7zr4WjVg^+jFpXJjN45ZOsq@_Or}jGO@mFZm?6xJ%?_E3 zZxP+%zol*~*lM)((AEiaaq}SaMhlFExkaJHoTZ%QZp%(9cB`FMr>$ODYg=bnkJ(7r zgxR#>S=ZR@%O{)3wXCo3xj)kFoFG#<$IDTfGB~gRMh_!|Hau?YY}$9Tgpu9Pc`b zJ4HI(+`+fQcSrM1=AAA(FFB)~?VL|Le{k9AQtq<qYUEnvx<b|=A0|I>Be~_cEmDY- zY|6Yl(LLLJ!Gq{=$Yaq{(=*R=$xFwp!0WlUp?8V*YoDz?Cw)Hq+WDUM!}>Y<HTbjn z`}ns9tPh9`7zo@Hm=rh}q#BePv=VF*ToD3=IEB=Qa=<TBJz)}I`@*KeHNp$S-$d9( zT#96k^pEV>CAlkk*L;+I)QM<RG&#C$x6tnR-BU4IF=cz8J+6D&VmHJl#?HnW#GQ(# zi}#7|-7C8{d+*BxyM!x=0*P^nGy4qook?O!3Qii?ueQJB0P29(fxhI;$w!hurMRWs zN|jB`OZ|{WPP>&Zm!6;g`Jns3z6_;|qnVgY|IE8tnpvl^S+k?EXAYSis?EXWq~yHJ z-I;qcPa&`5Fx}y>!;|@@`SnLcj$|JBP~cfGT&P`mzKFjlx#)GVTk+sg($RAz0wt*> z?@GN&N6QS#YRkpS^NwMTg&&(cZhO4*1mQ$w1z$yK#mAHWCnrx?o@%dDuB<%Ge>&p~ z;!N0?#j}oQ`>S-T>d)cNm7V80pIQy7!>S)&aK3Q&qRGX!ON2}3E{k3+s$s85sfB8H z)vnZe)=k!Ls~>1EZfLurcBQ6Ky76R_P*Y(uXLH6?x~qv-KVOTww%QWdvefF)I@7kZ zZS1=J^`Ul)_P!32j;<T}H?DVTbzbWtb~W8pz1eV!aI3Ccsk^pEv8Se2vA3pAsjv37 z^6mP5mHsOO>H}8?H3wVo=-#<8WHi)0yk&UcuFc)i5yz3qQMb{Bd%pLc-w(h4ek^Vr zJ)SbbGLiRy|3Ue~jStUHDor*|=}z@bTTPG6kY}De3VHNlHgS$|E^l6NzH&i+p=nWn zvH$V*$FolYpS)j6T4r4?dMfes@-x!2o)!C*+2_H}KmU^Ug7?MAmkKZ2R?Sx*yz+bX z{&mV5-Z!V-65e*cvwJuHKH>w-hy0HlKVJD{@@f3D-{;S9Ymut8NYy`%RQ=UInAJ*g zYaX^13;mr~=$ePEMce<q(e^bD`?q<RGfA_W{>3j;o&!}3&fiCUTHnu4<vG07(bu}9 z=ytXCQ+W<74;>@~2#Cn*axl+vH7*W`Dg*Y2@OCQC(d2wwVjt8(JIrIi+7r5nnBU8T zEn$5b0rMQ2;^Ht)Em#<&LDR-LR!9EpAdT_$gY~8Mi0PvK-vnundulACB$4p%s{S6N zX<#{kc$Bh#dtUdiK$;85o~-8V522qy8gjV@gFWfq&7VLTbJEzyF)o%`g{bc!4dE1t z<yk7W;Jw-3KpItoy~IRHGQe*U{|3?!1I<3IrX&|KUp@H^q*3)GetMgd+=3Sr{|3^? z#i6S>IWG%7)cgw4&=a6U`n?idK+FyO4Wywv;JsRYzA_8@4WxN2&mSk|Er~|!OA)_< zG*_WX1Vy;49^u^a6{P8QzzO&iNC*JYmtkK)nsYsDcy8`&-7g@`@p5bho0MRjXwS*7 zAk8shtv#t&y?bwE&8Q&FO@u{MDmISROKA%gq-hiO3QfgM(vsE9sgHK!6n4k<@-~Z| z+7?uhrWUNQ+$t~M=45C^1!*p5=Oeb2w*}d4v8IAFXZKbk?1kHsEv#*+AkC>b^AeNt zc%emO+b<vuy=S0pqfn5E^B0h&bb1nDBV1mOFuzBQe-BN1R#=sn4`_cJqsG7cH?SZq zh07N^@s8B^cXtB5A|(ygI|awTdqNciMdc+p6E1yRh2!5+@(Kl6d&M{kc$DDyH}it| zIbn|%4F_g;`V<z&Y^TNKvPU22Wj#tSt*1G3pwyS#^H$pF@EpUao=bVTkWc<RZ(nGO z?Qolz%ps3Y5oHSnlKq=_%-SU7vkR1pPd=tgCz=aaZ8>)43E!;*BfA5IGF86onA&sA zhqNU(vqi5Tu30`XIuR``_iC)+Y2j&lW#L<QH#P<oK5bDxgsqkenQeT{czt2;v{Yi* zZUceNIeAM-g&dmwLftQT#&<OclL8T8Aw*`qy$8kIIg;bakifudvEKxXu3;$?I7*E0 z8@pd!IGTbs__S_3ay?@-g4C5yz_#w-&Yc}Pf97cldTMdqT-4F3^)HCnQuo;WPj$`D zZZloFkc&x-ZGG{Pog@`|bc>;+bBt!jtVHd7O9`c{l9JVrU4EOk=;;Ke#%3}hgiEm) zCy0}AS`yJR%Acf#{mlQ!UMSU55IxyOk4i{O#RQ3BTu?$9T9?gOowF6Tj|=ZJKl^lV zP>WvNn>Vt77x{Fo3YheRxM+`kbk*^UVeVZ((e=Mf-UofUEQ~Tr)~{DfMo9AOX1+=e z+9Jt^b<{)TcdZ++mDal>!Zzr|#*okvsyBO@MEYl6HVGCriVRYh`Phtp2fPz$H=f>C z6er=0{|)d?-w{z+Ci?oFfAimgcctJ}S|V2=Lv+>8;9V;_23s%ZNl0k_3B0qZ#+mB( z#wQvZ`9Am#-qqgUvpb%%rPjT14ZQo`2JimrtH2-eGCX~X=`;CHi5ZW0nc(^2h_u<E zS>7!+xwA+7;rW91ASLqmk*+@n)U2_g|Bu+vzv`lEU)*c-@$b{eYaaG*`yN{3+rPY) z|95!U4w#tv&at8;;Nbf=junZ6^*_(Casi;C@r`4pg;5&5Kjc`cq|H~36}Fdu^@C%T zpZmeF%0K;Mj#b6_w>j3$8o$l4s<=^s0eH)Ve^l1s+Y#XkBL?4o=t@{0`*BW92NeMD zT?9aY0{}soJrEiNKs+7*Nf7{~k^qoifcaSCm6h@F_V&KMCr@f>tgU5aR8<obXJ%4T zjE#qfsjTYUoUSgFRXumk+<baEHFeuIe}8A^#l@r~PtT>L)29OipFW+OR9BCRs;Kbx z&d4}&<k&F_3t8E!Dmgg?h34j=AreVhSxv3Cx3iN#(9|3pY-v$c938E%mzOs(nwU6$ z-rRg@%GP#vwy0>wj)jHnY<Ktl`vU@&mt$fgBAz`935kzSOMCp-#U(Fqe%`^Mtjx;F z%<R&ou`vUK&6}H=w6v6z`ujCB3=MDIR8cu_ptZH3p{GY*zp^qRVfXILOndvfx(5$# z+&FQfurMp@!Uao9BJuX^f&wzRvGLI(xR?IRx3%&A?{<LI)yc`OuED{Tm4*geTUl8( zwf*}S7ShvAOzz*OvZ_y>=<8EiRqB&7KY#Gx_U(azuC7m?CMSD)KYw0T6%z8|#iK_= z;_lt2Py702XBQQnJZWVmCs$o9FR!TB+IsJvwl;yFu0Al(-L0ZRB8`l+w<{@)k2f`K z-fV0<HFfc#g~i;Qz5V0IB_+<z%gedBo}MWwK|#O#5*r&8_3~wScw%Bk#<OQ+@{uD; zOOB2wPT1IN*-}^c@S%~Bf<jA+j*hbO(2%C4kx_52s%mO#M@MsWf4`yO*|SMWd-fbU z<lxZQI6ZyqR%PYUqd7U$IZi|4&K)XKf9=}h;(zzpQ(OOQ?v*4T`2~GlBVX6Z*RRjU o8u_aI(<HG*zOIq4Yvk)1`MO5Fu92^6<m(#wx<<bKYvk+y0Mr0d{Qv*} literal 0 HcmV?d00001 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b007f0f93..6a9638959 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -305,6 +305,8 @@ if(APPLE AND WITH_APP_BUNDLE) set(CPACK_GENERATOR "DragNDrop") set(CPACK_DMG_FORMAT "UDBZ") + set(CPACK_DMG_DS_STORE "${CMAKE_SOURCE_DIR}/share/macosx/DS_Store.in") + set(CPACK_DMG_BACKGROUND_IMAGE "${CMAKE_SOURCE_DIR}/share/macosx/background.tiff") set(CPACK_DMG_VOLUME_NAME "${PROGNAME}") set(CPACK_SYSTEM_NAME "OSX") set(CPACK_STRIP_FILES ON) From ed46f9ac7e467f277af5b430e6aca71f4dd880fa Mon Sep 17 00:00:00 2001 From: Nick Fox <nick@foxsec.net> Date: Sat, 6 Jan 2018 19:28:04 -0500 Subject: [PATCH 256/402] Implement #1208: CSV Import Created and Modified Dates --- src/gui/csvImport/CsvImportWidget.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/gui/csvImport/CsvImportWidget.cpp b/src/gui/csvImport/CsvImportWidget.cpp index 23db871f3..ad56a873b 100644 --- a/src/gui/csvImport/CsvImportWidget.cpp +++ b/src/gui/csvImport/CsvImportWidget.cpp @@ -37,6 +37,8 @@ const QStringList CsvImportWidget::m_columnHeader = QStringList() << QObject::tr("Password") << QObject::tr("URL") << QObject::tr("Notes") + << QObject::tr("Last Modified") + << QObject::tr("Created") // << QObject::tr("Future field1") // << QObject::tr("Future field2") // << QObject::tr("Future field3") @@ -223,6 +225,21 @@ void CsvImportWidget::writeDatabase() { entry->setPassword(m_parserModel->data(m_parserModel->index(r, 3)).toString()); entry->setUrl(m_parserModel->data(m_parserModel->index(r, 4)).toString()); entry->setNotes(m_parserModel->data(m_parserModel->index(r, 5)).toString()); + + TimeInfo timeInfo; + if (m_parserModel->data(m_parserModel->index(r, 6)).isValid()) { + qint64 lastModified = m_parserModel->data(m_parserModel->index(r, 6)).toString().toLongLong(); + if (lastModified) { + timeInfo.setLastModificationTime(QDateTime::fromMSecsSinceEpoch(lastModified * 1000).toTimeSpec(Qt::UTC)); + } + } + if (m_parserModel->data(m_parserModel->index(r, 7)).isValid()) { + qint64 created = m_parserModel->data(m_parserModel->index(r, 7)).toString().toLongLong(); + if (created) { + timeInfo.setCreationTime(QDateTime::fromMSecsSinceEpoch(created * 1000).toTimeSpec(Qt::UTC)); + } + } + entry->setTimeInfo(timeInfo); } QBuffer buffer; buffer.open(QBuffer::ReadWrite); From 21a6c0fd89cf44179281feca1ae923c45fc313aa Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sun, 14 Jan 2018 16:54:23 +0100 Subject: [PATCH 257/402] Fix linker definition clashes between libargon2 and libsodium on Windows --- cmake/FindArgon2.cmake | 17 +++++++++++++++-- src/crypto/argon2/argon2.h | 34 ++++++++++++++++++++++++++++++++++ src/crypto/kdf/Argon2Kdf.cpp | 2 +- 3 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 src/crypto/argon2/argon2.h diff --git a/cmake/FindArgon2.cmake b/cmake/FindArgon2.cmake index 8378ebd54..5f196fc8d 100644 --- a/cmake/FindArgon2.cmake +++ b/cmake/FindArgon2.cmake @@ -14,8 +14,21 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. find_path(ARGON2_INCLUDE_DIR argon2.h) -find_library(ARGON2_LIBRARIES argon2) +if (MINGW) + # find static library on Windows, and redefine used symbols to + # avoid definition name conflicts with libsodium + find_library(ARGON2_SYS_LIBRARIES libargon2.a) + message(STATUS "Patching libargon2...") + execute_process(COMMAND objcopy + --redefine-sym argon2_hash=libargon2_argon2_hash + --redefine-sym argon2_error_message=libargon2_argon2_error_message + ${ARGON2_SYS_LIBRARIES} ${CMAKE_BINARY_DIR}/libargon2_patched.a + WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) + find_library(ARGON2_LIBRARIES libargon2_patched.a PATHS ${CMAKE_BINARY_DIR} NO_DEFAULT_PATH) +else() + find_library(ARGON2_LIBRARIES argon2) +endif() mark_as_advanced(ARGON2_LIBRARIES ARGON2_INCLUDE_DIR) include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Argon2 DEFAULT_MSG ARGON2_LIBRARIES ARGON2_INCLUDE_DIR) \ No newline at end of file +find_package_handle_standard_args(Argon2 DEFAULT_MSG ARGON2_LIBRARIES ARGON2_INCLUDE_DIR) diff --git a/src/crypto/argon2/argon2.h b/src/crypto/argon2/argon2.h new file mode 100644 index 000000000..8ea6108aa --- /dev/null +++ b/src/crypto/argon2/argon2.h @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef KEEPASSXC_CRYPTO_ARGON2_H +#define KEEPASSXC_CRYPTO_ARGON2_H + +/* + Argon2 wrapper header with redefined symbols to be used with the + patched libargon2 binary which is generated by the build system. + This is to avoid link-time definition clashes with libsodium on Windows. + */ + +#ifdef Q_OS_WIN +#define argon2_hash libargon2_argon2_hash +#define argon2_error_message libargon2_argon2_error_message +#endif + +#include <argon2.h> + +#endif //KEEPASSXC_CRYPTO_ARGON2_H diff --git a/src/crypto/kdf/Argon2Kdf.cpp b/src/crypto/kdf/Argon2Kdf.cpp index cd8474056..f67c9c1fb 100644 --- a/src/crypto/kdf/Argon2Kdf.cpp +++ b/src/crypto/kdf/Argon2Kdf.cpp @@ -18,8 +18,8 @@ #include "Argon2Kdf.h" #include <QtConcurrent> -#include <argon2.h> +#include "crypto/argon2/argon2.h" #include "format/KeePass2.h" /** From 871332ecf0603c46c020482553c6420e1c18943f Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Wed, 27 Dec 2017 14:20:28 +0100 Subject: [PATCH 258/402] Add warning when using legacy key file formats. --- src/cli/Extract.cpp | 7 +++++++ src/gui/ChangeMasterKeyWidget.cpp | 8 ++++++++ src/gui/DatabaseOpenWidget.cpp | 17 +++++++++++++++++ src/keys/FileKey.cpp | 21 +++++++++++++++++++-- src/keys/FileKey.h | 10 ++++++++++ 5 files changed, 61 insertions(+), 2 deletions(-) diff --git a/src/cli/Extract.cpp b/src/cli/Extract.cpp index 54c8a45ee..477f2b0e2 100644 --- a/src/cli/Extract.cpp +++ b/src/cli/Extract.cpp @@ -82,6 +82,13 @@ int Extract::execute(QStringList arguments) return EXIT_FAILURE; } + if (fileKey.type() != FileKey::Hashed) { + errorTextStream << QObject::tr("WARNING: You are using a legacy key file format which may become\n" + "unsupported in the future.\n\n" + "Please consider generating a new key file."); + errorTextStream << endl; + } + compositeKey.addKey(fileKey); } diff --git a/src/gui/ChangeMasterKeyWidget.cpp b/src/gui/ChangeMasterKeyWidget.cpp index ef4b61ef2..28a0991db 100644 --- a/src/gui/ChangeMasterKeyWidget.cpp +++ b/src/gui/ChangeMasterKeyWidget.cpp @@ -162,6 +162,14 @@ void ChangeMasterKeyWidget::generateKey() tr("Failed to set %1 as the Key file:\n%2").arg(fileKeyName, errorMsg), MessageWidget::Error); return; } + if (fileKey.type() != FileKey::Hashed) { + QMessageBox::warning(this, + tr("Legacy key file format"), + tr("You are using a legacy key file format which may become\n" + "unsupported in the future.\n\n" + "Please consider generating a new key file."), + QMessageBox::Ok); + } m_key.addKey(fileKey); } diff --git a/src/gui/DatabaseOpenWidget.cpp b/src/gui/DatabaseOpenWidget.cpp index 451dc597a..3af0c6e8f 100644 --- a/src/gui/DatabaseOpenWidget.cpp +++ b/src/gui/DatabaseOpenWidget.cpp @@ -218,6 +218,23 @@ QSharedPointer<CompositeKey> DatabaseOpenWidget::databaseKey() MessageWidget::Error); return QSharedPointer<CompositeKey>(); } + if (key.type() != FileKey::Hashed && !config()->get("Messages/NoLegacyKeyFileWarning").toBool()) { + QMessageBox legacyWarning; + legacyWarning.setWindowTitle(tr("Legacy key file format")); + legacyWarning.setText(tr("You are using a legacy key file format which may become\n" + "unsupported in the future.\n\n" + "Please consider generating a new key file.")); + legacyWarning.setIcon(QMessageBox::Icon::Warning); + legacyWarning.addButton(QMessageBox::Ok); + legacyWarning.setDefaultButton(QMessageBox::Ok); + legacyWarning.setCheckBox(new QCheckBox(tr("Don't show this warning again"))); + + connect(legacyWarning.checkBox(), &QCheckBox::stateChanged, [](int state){ + config()->set("Messages/NoLegacyKeyFileWarning", state == Qt::CheckState::Checked); + }); + + legacyWarning.exec(); + } masterKey->addKey(key); lastKeyFiles[m_filename] = keyFilename; } else { diff --git a/src/keys/FileKey.cpp b/src/keys/FileKey.cpp index 7f2f8a6ea..26db40d85 100644 --- a/src/keys/FileKey.cpp +++ b/src/keys/FileKey.cpp @@ -45,6 +45,8 @@ */ bool FileKey::load(QIODevice* device) { + m_type = None; + // we may need to read the file multiple times if (device->isSequential()) { return false; @@ -59,6 +61,7 @@ bool FileKey::load(QIODevice* device) return false; } if (loadXml(device)) { + m_type = KeePass2XML; return true; } @@ -66,6 +69,7 @@ bool FileKey::load(QIODevice* device) return false; } if (loadBinary(device)) { + m_type = FixedBinary; return true; } @@ -73,15 +77,20 @@ bool FileKey::load(QIODevice* device) return false; } if (loadHex(device)) { + m_type = FixedBinaryHex; return true; } + // if no legacy format was detected, generate SHA-256 hash of key file if (!device->reset()) { return false; } + if (loadHashed(device)) { + m_type = Hashed; + return true; + } - // if no legacy format was detected, generate SHA-256 hash of key file - return loadHashed(device); + return false; } /** @@ -345,3 +354,11 @@ bool FileKey::loadHashed(QIODevice* device) return true; } + +/** + * @return type of loaded key file + */ +FileKey::Type FileKey::type() const +{ + return m_type; +} diff --git a/src/keys/FileKey.h b/src/keys/FileKey.h index af324e530..2aa48909b 100644 --- a/src/keys/FileKey.h +++ b/src/keys/FileKey.h @@ -28,10 +28,19 @@ class QIODevice; class FileKey: public Key { public: + enum Type { + None, + Hashed, + KeePass2XML, + FixedBinary, + FixedBinaryHex + }; + bool load(QIODevice* device); bool load(const QString& fileName, QString* errorMsg = nullptr); QByteArray rawKey() const override; FileKey* clone() const override; + Type type() const; static void create(QIODevice* device, int size = 128); static bool create(const QString& fileName, QString* errorMsg = nullptr, int size = 128); @@ -44,6 +53,7 @@ private: bool loadHashed(QIODevice* device); QByteArray m_key; + Type m_type = None; }; #endif // KEEPASSX_FILEKEY_H From 98591c3bc04b0815db577df0de7718eaace65211 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Wed, 27 Dec 2017 14:36:21 +0100 Subject: [PATCH 259/402] Add tests for FileKey::Type --- tests/TestKeys.cpp | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/tests/TestKeys.cpp b/tests/TestKeys.cpp index a97287f39..811a7688f 100644 --- a/tests/TestKeys.cpp +++ b/tests/TestKeys.cpp @@ -35,6 +35,7 @@ #include "keys/PasswordKey.h" QTEST_GUILESS_MAIN(TestKeys) +Q_DECLARE_METATYPE(FileKey::Type); void TestKeys::initTestCase() { @@ -84,9 +85,10 @@ void TestKeys::testComposite() void TestKeys::testFileKey() { - QFETCH(QString, type); + QFETCH(FileKey::Type, type); + QFETCH(QString, typeString); - QString name = QString("FileKey").append(type); + QString name = QString("FileKey").append(typeString); KeePass2Reader reader; @@ -97,6 +99,9 @@ void TestKeys::testFileKey() FileKey fileKey; QVERIFY(fileKey.load(keyFilename)); QCOMPARE(fileKey.rawKey().size(), 32); + + QCOMPARE(fileKey.type(), type); + compositeKey.addKey(fileKey); QScopedPointer<Database> db(reader.readDatabase(dbFilename, compositeKey)); @@ -107,12 +112,13 @@ void TestKeys::testFileKey() void TestKeys::testFileKey_data() { - QTest::addColumn<QString>("type"); - QTest::newRow("Xml") << QString("Xml"); - QTest::newRow("XmlBrokenBase64") << QString("XmlBrokenBase64"); - QTest::newRow("Binary") << QString("Binary"); - QTest::newRow("Hex") << QString("Hex"); - QTest::newRow("Hashed") << QString("Hashed"); + QTest::addColumn<FileKey::Type>("type"); + QTest::addColumn<QString>("typeString"); + QTest::newRow("Xml") << FileKey::KeePass2XML << QString("Xml"); + QTest::newRow("XmlBrokenBase64") << FileKey::Hashed << QString("XmlBrokenBase64"); + QTest::newRow("Binary") << FileKey::FixedBinary << QString("Binary"); + QTest::newRow("Hex") << FileKey::FixedBinaryHex << QString("Hex"); + QTest::newRow("Hashed") << FileKey::Hashed << QString("Hashed"); } void TestKeys::testCreateFileKey() From 28a67f9957f826d1ceb9fff5bb16fe90a69570e5 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sun, 14 Jan 2018 23:50:31 +0100 Subject: [PATCH 260/402] Remove old chrome extension IDs and add new official extension ID --- src/browser/HostInstaller.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/browser/HostInstaller.cpp b/src/browser/HostInstaller.cpp index bbb5fb6f5..9271da69e 100644 --- a/src/browser/HostInstaller.cpp +++ b/src/browser/HostInstaller.cpp @@ -28,8 +28,7 @@ const QString HostInstaller::HOST_NAME = "org.keepassxc.keepassxc_browser"; const QStringList HostInstaller::ALLOWED_ORIGINS = QStringList() << "chrome-extension://iopaggbpplllidnfmcghoonnokmjoicf/" - << "chrome-extension://fhakpkpdnjecjfceboihdjpfmgajebii/" - << "chrome-extension://jaikbblhommnkeialomogohhdlndpfbi/"; + << "chrome-extension://oboonakemofpalcgghocfoadofidjkkk/"; const QStringList HostInstaller::ALLOWED_EXTENSIONS = QStringList() << "keepassxc-browser@keepassxc.org"; From 48ac3790c25cf0a4d3b069801c42e870e7ab3b38 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Mon, 15 Jan 2018 00:09:15 +0100 Subject: [PATCH 261/402] Show "key already exists" warning only if key really exists --- src/browser/BrowserService.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/browser/BrowserService.cpp b/src/browser/BrowserService.cpp index 97b8fea42..b6af4e391 100644 --- a/src/browser/BrowserService.cpp +++ b/src/browser/BrowserService.cpp @@ -174,15 +174,15 @@ QString BrowserService::storeKey(const QString& key) Entry* config = getConfigEntry(true); if (!config) { - return QString(); + return {}; } - bool contains = false; + bool contains; QMessageBox::StandardButton dialogResult = QMessageBox::No; do { bool ok = false; - id = QInputDialog::getText(0, tr("KeePassXC: New key association request"), + id = QInputDialog::getText(nullptr, tr("KeePassXC: New key association request"), tr("You have received an association " "request for the above key.\n" "If you would like to allow it access " @@ -190,13 +190,17 @@ QString BrowserService::storeKey(const QString& key) "give it a unique name to identify and accept it."), QLineEdit::Normal, QString(), &ok); if (!ok || id.isEmpty()) { - return QString(); + return {}; } contains = config->attributes()->contains(QLatin1String(ASSOCIATE_KEY_PREFIX) + id); - dialogResult = QMessageBox::warning(0, tr("KeePassXC: Overwrite existing key?"), - tr("A shared encryption key with the name \"%1\" already exists.\nDo you want to overwrite it?").arg(id), - QMessageBox::Yes | QMessageBox::No); + if (contains) { + dialogResult = QMessageBox::warning(nullptr, tr("KeePassXC: Overwrite existing key?"), + tr("A shared encryption key with the name \"%1\" " + "already exists.\nDo you want to overwrite it?") + .arg(id), + QMessageBox::Yes | QMessageBox::No); + } } while (contains && dialogResult == QMessageBox::No); config->attributes()->set(QLatin1String(ASSOCIATE_KEY_PREFIX) + id, key, true); From 7665bc6c631758ecf30cd797fc34aaa47a03f45b Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Mon, 15 Jan 2018 01:15:39 +0100 Subject: [PATCH 262/402] Properly active key association dialog and main window upon unlock request --- src/browser/BrowserService.cpp | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/browser/BrowserService.cpp b/src/browser/BrowserService.cpp index b6af4e391..9e2b86cb3 100644 --- a/src/browser/BrowserService.cpp +++ b/src/browser/BrowserService.cpp @@ -31,6 +31,7 @@ #include "core/Metadata.h" #include "core/Uuid.h" #include "core/PasswordGenerator.h" +#include "gui/MainWindow.h" // de887cc3-0363-43b8-974b-5911b8816224 @@ -60,11 +61,8 @@ bool BrowserService::isDatabaseOpened() const return false; } - if (dbWidget->currentMode() == DatabaseWidget::ViewMode || dbWidget->currentMode() == DatabaseWidget::EditMode) { - return true; - } + return dbWidget->currentMode() == DatabaseWidget::ViewMode || dbWidget->currentMode() == DatabaseWidget::EditMode; - return false; } bool BrowserService::openDatabase() @@ -82,7 +80,8 @@ bool BrowserService::openDatabase() return true; } - m_dbTabWidget->activateWindow(); + KEEPASSXC_MAIN_WINDOW->bringToFront(); + return false; } @@ -181,15 +180,20 @@ QString BrowserService::storeKey(const QString& key) QMessageBox::StandardButton dialogResult = QMessageBox::No; do { - bool ok = false; - id = QInputDialog::getText(nullptr, tr("KeePassXC: New key association request"), - tr("You have received an association " - "request for the above key.\n" - "If you would like to allow it access " - "to your KeePassXC database,\n" - "give it a unique name to identify and accept it."), - QLineEdit::Normal, QString(), &ok); - if (!ok || id.isEmpty()) { + QInputDialog keyDialog; + keyDialog.setWindowTitle(tr("KeePassXC: New key association request")); + keyDialog.setLabelText(tr("You have received an association request for the above key.\n\n" + "If you would like to allow it access to your KeePassXC database,\n" + "give it a unique name to identify and accept it.")); + keyDialog.setOkButtonText(tr("Save and allow access")); + keyDialog.show(); + keyDialog.activateWindow(); + keyDialog.raise(); + auto ok = keyDialog.exec(); + + id = keyDialog.textValue(); + + if (ok != QDialog::Accepted || id.isEmpty()) { return {}; } From ef8751a795e055363bcfafda22a08bd5e7d27cc1 Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Tue, 16 Jan 2018 23:44:50 -0500 Subject: [PATCH 263/402] Correct missing attachments in KDBX 4 write --- src/format/Kdbx4Writer.cpp | 30 +++++++++++++----------------- src/format/Kdbx4Writer.h | 2 +- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/format/Kdbx4Writer.cpp b/src/format/Kdbx4Writer.cpp index 70bfa2d5b..7ce8bab1a 100644 --- a/src/format/Kdbx4Writer.cpp +++ b/src/format/Kdbx4Writer.cpp @@ -152,6 +152,9 @@ bool Kdbx4Writer::writeDatabase(QIODevice* device, Database* db) CHECK_RETURN_FALSE(writeInnerHeaderField(outputDevice, KeePass2::InnerHeaderFieldID::InnerRandomStreamKey, protectedStreamKey)); + // Write attachments to the inner header + writeAttachments(outputDevice, db); + CHECK_RETURN_FALSE(writeInnerHeaderField(outputDevice, KeePass2::InnerHeaderFieldID::End, QByteArray())); KeePass2RandomStream randomStream(KeePass2::ProtectedStreamAlgo::ChaCha20); @@ -204,24 +207,17 @@ bool Kdbx4Writer::writeInnerHeaderField(QIODevice* device, KeePass2::InnerHeader return true; } -/** - * Write binary header field.. - * - * @param device output device - * @param fieldId field identifier - * @param data header payload - * @return true on success - */ -bool Kdbx4Writer::writeBinary(QIODevice* device, const QByteArray& data) +void Kdbx4Writer::writeAttachments(QIODevice* device, Database* db) { - QByteArray fieldIdArr; - fieldIdArr[0] = static_cast<char>(KeePass2::InnerHeaderFieldID::Binary); - CHECK_RETURN_FALSE(writeData(device, fieldIdArr)); - CHECK_RETURN_FALSE(writeData(device, Endian::sizedIntToBytes(static_cast<quint32>(data.size() + 1), KeePass2::BYTEORDER))); - CHECK_RETURN_FALSE(writeData(device, QByteArray(1, '\1'))); - CHECK_RETURN_FALSE(writeData(device, data)); - - return true; + const QList<Entry*> allEntries = db->rootGroup()->entriesRecursive(true); + for (Entry* entry : allEntries) { + const QList<QString> attachmentKeys = entry->attachments()->keys(); + for (const QString& key : attachmentKeys) { + QByteArray data = entry->attachments()->value(key); + data.prepend("\x01"); + writeInnerHeaderField(device, KeePass2::InnerHeaderFieldID::Binary, data); + } + } } /** diff --git a/src/format/Kdbx4Writer.h b/src/format/Kdbx4Writer.h index 097a7864a..f05ad21a3 100644 --- a/src/format/Kdbx4Writer.h +++ b/src/format/Kdbx4Writer.h @@ -30,7 +30,7 @@ public: private: bool writeInnerHeaderField(QIODevice* device, KeePass2::InnerHeaderFieldID fieldId, const QByteArray& data); - bool writeBinary(QIODevice* device, const QByteArray& data); + void writeAttachments(QIODevice* device, Database* db); static bool serializeVariantMap(const QVariantMap& map, QByteArray& outputBytes); }; From 00ce60ef20a7799cb0abd2b94e01f595695b8698 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Thu, 18 Jan 2018 01:16:46 +0100 Subject: [PATCH 264/402] create new entry while searching --- src/gui/DatabaseWidget.cpp | 5 +++++ src/gui/MainWindow.cpp | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 6ea82b330..8f4fc9bb3 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -339,6 +339,11 @@ void DatabaseWidget::createEntry() } m_newEntry = new Entry(); + + if (isInSearchMode()) { + m_newEntry->setTitle(getCurrentSearch()); + endSearch(); + } m_newEntry->setUuid(Uuid::random()); m_newEntry->setUsername(m_db->metadata()->defaultUserName()); m_newParent = m_groupView->currentGroup(); diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 08331ffec..9c0fe1dfb 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -493,13 +493,13 @@ void MainWindow::setMenuActionState(DatabaseWidget::Mode mode) switch (mode) { case DatabaseWidget::ViewMode: { - bool inSearch = dbWidget->isInSearchMode(); + //bool inSearch = dbWidget->isInSearchMode(); bool singleEntrySelected = dbWidget->numberOfSelectedEntries() == 1; bool entriesSelected = dbWidget->numberOfSelectedEntries() > 0; bool groupSelected = dbWidget->isGroupSelected(); bool recycleBinSelected = dbWidget->isRecycleBinSelected(); - m_ui->actionEntryNew->setEnabled(!inSearch); + m_ui->actionEntryNew->setEnabled(true); m_ui->actionEntryClone->setEnabled(singleEntrySelected); m_ui->actionEntryEdit->setEnabled(singleEntrySelected); m_ui->actionEntryDelete->setEnabled(entriesSelected); From cdefc7ea9bdfe89e86d57d3155ce35ac2347d719 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Wed, 17 Jan 2018 18:15:37 +0100 Subject: [PATCH 265/402] Fix KDBX reader tests not being executed --- tests/CMakeLists.txt | 62 ++--- tests/TestKdbx3.cpp | 68 ++++++ tests/{TestKdbx3XmlReader.cpp => TestKdbx3.h} | 20 +- tests/TestKdbx4.cpp | 68 ++++++ tests/{TestKdbx4XmlReader.cpp => TestKdbx4.h} | 20 +- tests/TestKeePass2XmlReader.cpp | 211 +++++------------- tests/TestKeePass2XmlReader.h | 38 +--- 7 files changed, 261 insertions(+), 226 deletions(-) create mode 100644 tests/TestKdbx3.cpp rename tests/{TestKdbx3XmlReader.cpp => TestKdbx3.h} (52%) create mode 100644 tests/TestKdbx4.cpp rename tests/{TestKdbx4XmlReader.cpp => TestKdbx4.h} (52%) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 4472fc27a..1e7512268 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -105,94 +105,94 @@ if(YUBIKEY_FOUND) endif() add_unit_test(NAME testgroup SOURCES TestGroup.cpp - LIBS ${TEST_LIBRARIES}) + LIBS ${TEST_LIBRARIES}) -add_unit_test(NAME testkdbx3xmlreader SOURCES TestKeePass2XmlReader.cpp TestKdbx3XmlReader.cpp - LIBS ${TEST_LIBRARIES}) +add_unit_test(NAME testkdbx3 SOURCES TestKeePass2XmlReader.cpp TestKdbx3.cpp + LIBS ${TEST_LIBRARIES}) -add_unit_test(NAME testkdbx4xmlreader SOURCES TestKeePass2XmlReader.cpp TestKdbx4XmlReader.cpp - LIBS ${TEST_LIBRARIES}) +add_unit_test(NAME testkdbx4 SOURCES TestKeePass2XmlReader.cpp TestKdbx4.cpp + LIBS ${TEST_LIBRARIES}) add_unit_test(NAME testkeys SOURCES TestKeys.cpp - LIBS ${TEST_LIBRARIES}) + LIBS ${TEST_LIBRARIES}) add_unit_test(NAME testkeepass2reader SOURCES TestKeePass2Reader.cpp - LIBS ${TEST_LIBRARIES}) + LIBS ${TEST_LIBRARIES}) add_unit_test(NAME testkeepass2writer SOURCES TestKeePass2Writer.cpp - LIBS testsupport ${TEST_LIBRARIES}) + LIBS testsupport ${TEST_LIBRARIES}) add_unit_test(NAME testgroupmodel SOURCES TestGroupModel.cpp - LIBS testsupport ${TEST_LIBRARIES}) + LIBS testsupport ${TEST_LIBRARIES}) add_unit_test(NAME testentrymodel SOURCES TestEntryModel.cpp - LIBS testsupport ${TEST_LIBRARIES}) + LIBS testsupport ${TEST_LIBRARIES}) add_unit_test(NAME testcryptohash SOURCES TestCryptoHash.cpp - LIBS ${TEST_LIBRARIES}) + LIBS ${TEST_LIBRARIES}) add_unit_test(NAME testsymmetriccipher SOURCES TestSymmetricCipher.cpp - LIBS ${TEST_LIBRARIES}) + LIBS ${TEST_LIBRARIES}) add_unit_test(NAME testhashedblockstream SOURCES TestHashedBlockStream.cpp - LIBS testsupport ${TEST_LIBRARIES}) + LIBS testsupport ${TEST_LIBRARIES}) add_unit_test(NAME testkeepass2randomstream SOURCES TestKeePass2RandomStream.cpp - LIBS ${TEST_LIBRARIES}) + LIBS ${TEST_LIBRARIES}) add_unit_test(NAME testmodified SOURCES TestModified.cpp - LIBS ${TEST_LIBRARIES}) + LIBS ${TEST_LIBRARIES}) add_unit_test(NAME testdeletedobjects SOURCES TestDeletedObjects.cpp - LIBS ${TEST_LIBRARIES}) + LIBS ${TEST_LIBRARIES}) add_unit_test(NAME testkeepass1reader SOURCES TestKeePass1Reader.cpp - LIBS ${TEST_LIBRARIES}) + LIBS ${TEST_LIBRARIES}) add_unit_test(NAME testwildcardmatcher SOURCES TestWildcardMatcher.cpp - LIBS ${TEST_LIBRARIES}) + LIBS ${TEST_LIBRARIES}) if(WITH_XC_AUTOTYPE) add_unit_test(NAME testautotype SOURCES TestAutoType.cpp - LIBS ${TEST_LIBRARIES}) + LIBS ${TEST_LIBRARIES}) set_target_properties(testautotype PROPERTIES ENABLE_EXPORTS ON) endif() if(WITH_XC_SSHAGENT) add_unit_test(NAME testopensshkey SOURCES TestOpenSSHKey.cpp - LIBS sshagent ${TEST_LIBRARIES}) + LIBS sshagent ${TEST_LIBRARIES}) endif() add_unit_test(NAME testentry SOURCES TestEntry.cpp - LIBS ${TEST_LIBRARIES}) + LIBS ${TEST_LIBRARIES}) add_unit_test(NAME testmerge SOURCES TestMerge.cpp - LIBS ${TEST_LIBRARIES}) + LIBS ${TEST_LIBRARIES}) add_unit_test(NAME testtotp SOURCES TestTotp.cpp - LIBS ${TEST_LIBRARIES}) + LIBS ${TEST_LIBRARIES}) add_unit_test(NAME testbase32 SOURCES TestBase32.cpp - LIBS ${TEST_LIBRARIES}) + LIBS ${TEST_LIBRARIES}) add_unit_test(NAME testcsvparser SOURCES TestCsvParser.cpp - LIBS ${TEST_LIBRARIES}) + LIBS ${TEST_LIBRARIES}) add_unit_test(NAME testrandom SOURCES TestRandom.cpp - LIBS ${TEST_LIBRARIES}) + LIBS ${TEST_LIBRARIES}) add_unit_test(NAME testentrysearcher SOURCES TestEntrySearcher.cpp - LIBS ${TEST_LIBRARIES}) + LIBS ${TEST_LIBRARIES}) add_unit_test(NAME testcsvexporter SOURCES TestCsvExporter.cpp - LIBS ${TEST_LIBRARIES}) + LIBS ${TEST_LIBRARIES}) add_unit_test(NAME testykchallengeresponsekey - SOURCES TestYkChallengeResponseKey.cpp TestYkChallengeResponseKey.h - LIBS ${TEST_LIBRARIES}) + SOURCES TestYkChallengeResponseKey.cpp TestYkChallengeResponseKey.h + LIBS ${TEST_LIBRARIES}) add_unit_test(NAME testdatabase SOURCES TestDatabase.cpp - LIBS ${TEST_LIBRARIES}) + LIBS ${TEST_LIBRARIES}) if(WITH_GUI_TESTS) add_subdirectory(gui) diff --git a/tests/TestKdbx3.cpp b/tests/TestKdbx3.cpp new file mode 100644 index 000000000..9bb5d8b54 --- /dev/null +++ b/tests/TestKdbx3.cpp @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "TestKdbx3.h" +#include "core/Metadata.h" +#include "crypto/Crypto.h" +#include "format/KeePass2.h" +#include "format/KdbxXmlReader.h" +#include "format/KdbxXmlWriter.h" +#include "config-keepassx-tests.h" + +#include <QTest> + +QTEST_GUILESS_MAIN(TestKdbx3) + +void TestKdbx3::initTestCase() +{ + QVERIFY(Crypto::init()); + + KdbxXmlReader reader(KeePass2::FILE_VERSION_3); + reader.setStrictMode(true); + QString xmlFile = QString(KEEPASSX_TEST_DATA_DIR).append("/NewDatabase.xml"); + m_db.reset(reader.readDatabase(xmlFile)); + QVERIFY(m_db.data()); + QVERIFY(!reader.hasError()); +} + +Database* TestKdbx3::readDatabase(QString path, bool strictMode, bool& hasError, QString& errorString) +{ + KdbxXmlReader reader(KeePass2::FILE_VERSION_3); + reader.setStrictMode(strictMode); + auto db = reader.readDatabase(path); + hasError = reader.hasError(); + errorString = reader.errorString(); + return db; +} + +Database* TestKdbx3::readDatabase(QBuffer* buf, bool strictMode, bool& hasError, QString& errorString) +{ + KdbxXmlReader reader(KeePass2::FILE_VERSION_3); + reader.setStrictMode(strictMode); + auto db = reader.readDatabase(buf); + hasError = reader.hasError(); + errorString = reader.errorString(); + return db; +} + +void TestKdbx3::writeDatabase(QBuffer* buf, Database* db, bool& hasError, QString& errorString) +{ + KdbxXmlWriter writer(KeePass2::FILE_VERSION_3); + writer.writeDatabase(buf, db); + hasError = writer.hasError(); + errorString = writer.errorString(); +} diff --git a/tests/TestKdbx3XmlReader.cpp b/tests/TestKdbx3.h similarity index 52% rename from tests/TestKdbx3XmlReader.cpp rename to tests/TestKdbx3.h index d4ce58542..fac8f7eb1 100644 --- a/tests/TestKdbx3XmlReader.cpp +++ b/tests/TestKdbx3.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -15,8 +15,22 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include <QTest> +#ifndef KEEPASSXC_TEST_KDBX3_H +#define KEEPASSXC_TEST_KDBX3_H #include "TestKeePass2XmlReader.h" -QTEST_GUILESS_MAIN(TestKdbx3XmlReader) +class TestKdbx3 : public TestKeePass2XmlReader +{ +Q_OBJECT + +private slots: + virtual void initTestCase() override; + +protected: + virtual Database* readDatabase(QBuffer* buf, bool strictMode, bool& hasError, QString& errorString) override; + virtual Database* readDatabase(QString path, bool strictMode, bool& hasError, QString& errorString) override; + virtual void writeDatabase(QBuffer* buf, Database* db, bool& hasError, QString& errorString) override; +}; + +#endif // KEEPASSXC_TEST_KDBX3_H diff --git a/tests/TestKdbx4.cpp b/tests/TestKdbx4.cpp new file mode 100644 index 000000000..e67274cbd --- /dev/null +++ b/tests/TestKdbx4.cpp @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "TestKdbx4.h" +#include "core/Metadata.h" +#include "crypto/Crypto.h" +#include "format/KeePass2.h" +#include "format/KdbxXmlReader.h" +#include "format/KdbxXmlWriter.h" +#include "config-keepassx-tests.h" + +#include <QTest> + +QTEST_GUILESS_MAIN(TestKdbx4) + +void TestKdbx4::initTestCase() +{ + QVERIFY(Crypto::init()); + + KdbxXmlReader reader(KeePass2::FILE_VERSION_3); + reader.setStrictMode(true); + QString xmlFile = QString(KEEPASSX_TEST_DATA_DIR).append("/NewDatabase.xml"); + m_db.reset(reader.readDatabase(xmlFile)); + QVERIFY(m_db.data()); + QVERIFY(!reader.hasError()); +} + +Database* TestKdbx4::readDatabase(QString path, bool strictMode, bool& hasError, QString& errorString) +{ + KdbxXmlReader reader(KeePass2::FILE_VERSION_3); + reader.setStrictMode(strictMode); + auto db = reader.readDatabase(path); + hasError = reader.hasError(); + errorString = reader.errorString(); + return db; +} + +Database* TestKdbx4::readDatabase(QBuffer* buf, bool strictMode, bool& hasError, QString& errorString) +{ + KdbxXmlReader reader(KeePass2::FILE_VERSION_3); + reader.setStrictMode(strictMode); + auto db = reader.readDatabase(buf); + hasError = reader.hasError(); + errorString = reader.errorString(); + return db; +} + +void TestKdbx4::writeDatabase(QBuffer* buf, Database* db, bool& hasError, QString& errorString) +{ + KdbxXmlWriter writer(KeePass2::FILE_VERSION_3); + writer.writeDatabase(buf, db); + hasError = writer.hasError(); + errorString = writer.errorString(); +} diff --git a/tests/TestKdbx4XmlReader.cpp b/tests/TestKdbx4.h similarity index 52% rename from tests/TestKdbx4XmlReader.cpp rename to tests/TestKdbx4.h index c1a0b42ee..0615ff3b7 100644 --- a/tests/TestKdbx4XmlReader.cpp +++ b/tests/TestKdbx4.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -15,8 +15,22 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include <QTest> +#ifndef KEEPASSXC_TEST_KDBX4_H +#define KEEPASSXC_TEST_KDBX4_H #include "TestKeePass2XmlReader.h" -QTEST_GUILESS_MAIN(TestKdbx4XmlReader) +class TestKdbx4 : public TestKeePass2XmlReader +{ +Q_OBJECT + +private slots: + virtual void initTestCase() override; + +protected: + virtual Database* readDatabase(QBuffer* buf, bool strictMode, bool& hasError, QString& errorString) override; + virtual Database* readDatabase(QString path, bool strictMode, bool& hasError, QString& errorString) override; + virtual void writeDatabase(QBuffer* buf, Database* db, bool& hasError, QString& errorString) override; +}; + +#endif // KEEPASSXC_TEST_KDBX4_H diff --git a/tests/TestKeePass2XmlReader.cpp b/tests/TestKeePass2XmlReader.cpp index 4970fe927..a89b9547f 100644 --- a/tests/TestKeePass2XmlReader.cpp +++ b/tests/TestKeePass2XmlReader.cpp @@ -17,46 +17,40 @@ #include "TestKeePass2XmlReader.h" -#include <QBuffer> -#include <QFile> -#include <QTest> -#include <format/KeePass2.h> - -#include "core/Database.h" #include "core/Group.h" #include "core/Metadata.h" -#include "crypto/Crypto.h" #include "format/KdbxXmlReader.h" #include "format/KdbxXmlWriter.h" #include "config-keepassx-tests.h" +#include <QFile> +#include <QTest> + namespace QTest { - template<> - char* toString(const Uuid& uuid) - { - QByteArray ba = "Uuid("; - ba += uuid.toBase64().toLatin1().constData(); - ba += ")"; - return qstrdup(ba.constData()); +template<> +char* toString(const Uuid& uuid) +{ + QByteArray ba = "Uuid("; + ba += uuid.toBase64().toLatin1().constData(); + ba += ")"; + return qstrdup(ba.constData()); +} + +template<> +char* toString(const Group::TriState& triState) +{ + QString value; + + if (triState == Group::Inherit) { + value = "null"; + } else if (triState == Group::Enable) { + value = "true"; + } else { + value = "false"; } - template<> - char* toString(const Group::TriState& triState) - { - QString value; - - if (triState == Group::Inherit) { - value = "null"; - } - else if (triState == Group::Enable) { - value = "true"; - } - else { - value = "false"; - } - - return qstrdup(value.toLocal8Bit().constData()); - } + return qstrdup(value.toLocal8Bit().constData()); +} } QDateTime TestKeePass2XmlReader::genDT(int year, int month, int day, int hour, int min, int second) @@ -70,90 +64,14 @@ QByteArray TestKeePass2XmlReader::strToBytes(const QString& str) { QByteArray result; - for (int i = 0; i < str.size(); i++) { - result.append(str.at(i).unicode() >> 8); - result.append(str.at(i).unicode() & 0xFF); + for (auto i : str) { + result.append(static_cast<char>(i.unicode() >> 8)); + result.append(static_cast<char>(i.unicode() & 0xFF)); } return result; } -void TestKdbx3XmlReader::initTestCase() -{ - QVERIFY(Crypto::init()); - - KdbxXmlReader reader(KeePass2::FILE_VERSION_3); - reader.setStrictMode(true); - QString xmlFile = QString(KEEPASSX_TEST_DATA_DIR).append("/NewDatabase.xml"); - m_db = reader.readDatabase(xmlFile); - QVERIFY(m_db); - QVERIFY(!reader.hasError()); -} - -void TestKdbx4XmlReader::initTestCase() -{ - QVERIFY(Crypto::init()); - - KdbxXmlReader reader(KeePass2::FILE_VERSION_3); - reader.setStrictMode(true); - QString xmlFile = QString(KEEPASSX_TEST_DATA_DIR).append("/NewDatabase.xml"); - m_db = reader.readDatabase(xmlFile); - QVERIFY(m_db); - QVERIFY(!reader.hasError()); -} - -void TestKdbx3XmlReader::readDatabase(QString path, bool strictMode, Database*& db, bool& hasError, QString& errorString) -{ - KdbxXmlReader reader(KeePass2::FILE_VERSION_3); - reader.setStrictMode(strictMode); - db = reader.readDatabase(path); - hasError = reader.hasError(); - errorString = reader.errorString(); -} - -void TestKdbx3XmlReader::readDatabase(QBuffer* buf, bool strictMode, Database*& db, bool& hasError, QString& errorString) -{ - KdbxXmlReader reader(KeePass2::FILE_VERSION_3); - reader.setStrictMode(strictMode); - db = reader.readDatabase(buf); - hasError = reader.hasError(); - errorString = reader.errorString(); -} - -void TestKdbx3XmlReader::writeDatabase(QBuffer* buf, Database* db, bool& hasError, QString& errorString) -{ - KdbxXmlWriter writer(KeePass2::FILE_VERSION_3); - writer.writeDatabase(buf, db); - hasError = writer.hasError(); - errorString = writer.errorString(); -} - -void TestKdbx4XmlReader::readDatabase(QString path, bool strictMode, Database*& db, bool& hasError, QString& errorString) -{ - KdbxXmlReader reader(KeePass2::FILE_VERSION_3); - reader.setStrictMode(strictMode); - db = reader.readDatabase(path); - hasError = reader.hasError(); - errorString = reader.errorString(); -} - -void TestKdbx4XmlReader::readDatabase(QBuffer* buf, bool strictMode, Database*& db, bool& hasError, QString& errorString) -{ - KdbxXmlReader reader(KeePass2::FILE_VERSION_3); - reader.setStrictMode(strictMode); - db = reader.readDatabase(buf); - hasError = reader.hasError(); - errorString = reader.errorString(); -} - -void TestKdbx4XmlReader::writeDatabase(QBuffer* buf, Database* db, bool& hasError, QString& errorString) -{ - KdbxXmlWriter writer(KeePass2::FILE_VERSION_3); - writer.writeDatabase(buf, db); - hasError = writer.hasError(); - errorString = writer.errorString(); -} - void TestKeePass2XmlReader::testMetadata() { QCOMPARE(m_db->metadata()->generator(), QString("KeePass")); @@ -437,20 +355,15 @@ void TestKeePass2XmlReader::testBroken() QFETCH(bool, strictMode); QFETCH(bool, expectError); - QString xmlFile = QString("%1/%2.xml").arg(KEEPASSX_TEST_DATA_DIR, baseName); QVERIFY(QFile::exists(xmlFile)); bool hasError; QString errorString; - Database* db; - readDatabase(xmlFile, strictMode, db, hasError, errorString); + QScopedPointer<Database> db(readDatabase(xmlFile, strictMode, hasError, errorString)); if (hasError) { qWarning("Reader error: %s", qPrintable(errorString)); } QCOMPARE(hasError, expectError); - if (db) { - delete db; - } } void TestKeePass2XmlReader::testBroken_data() @@ -459,22 +372,22 @@ void TestKeePass2XmlReader::testBroken_data() QTest::addColumn<bool>("strictMode"); QTest::addColumn<bool>("expectError"); - // testfile strict? error? - QTest::newRow("BrokenNoGroupUuid (strict)") << "BrokenNoGroupUuid" << true << true; - QTest::newRow("BrokenNoGroupUuid (not strict)") << "BrokenNoGroupUuid" << false << false; - QTest::newRow("BrokenNoEntryUuid (strict)") << "BrokenNoEntryUuid" << true << true; - QTest::newRow("BrokenNoEntryUuid (not strict)") << "BrokenNoEntryUuid" << false << false; - QTest::newRow("BrokenNoRootGroup (strict)") << "BrokenNoRootGroup" << true << true; - QTest::newRow("BrokenNoRootGroup (not strict)") << "BrokenNoRootGroup" << false << true; - QTest::newRow("BrokenTwoRoots (strict)") << "BrokenTwoRoots" << true << true; - QTest::newRow("BrokenTwoRoots (not strict)") << "BrokenTwoRoots" << false << true; - QTest::newRow("BrokenTwoRootGroups (strict)") << "BrokenTwoRootGroups" << true << true; - QTest::newRow("BrokenTwoRootGroups (not strict)") << "BrokenTwoRootGroups" << false << true; - QTest::newRow("BrokenGroupReference (strict)") << "BrokenGroupReference" << true << false; - QTest::newRow("BrokenGroupReference (not strict)") << "BrokenGroupReference" << false << false; - QTest::newRow("BrokenDeletedObjects (strict)") << "BrokenDeletedObjects" << true << true; - QTest::newRow("BrokenDeletedObjects (not strict)") << "BrokenDeletedObjects" << false << false; - QTest::newRow("BrokenDifferentEntryHistoryUuid (strict)") << "BrokenDifferentEntryHistoryUuid" << true << true; + // testfile strict? error? + QTest::newRow("BrokenNoGroupUuid (strict)") << "BrokenNoGroupUuid" << true << true; + QTest::newRow("BrokenNoGroupUuid (not strict)") << "BrokenNoGroupUuid" << false << false; + QTest::newRow("BrokenNoEntryUuid (strict)") << "BrokenNoEntryUuid" << true << true; + QTest::newRow("BrokenNoEntryUuid (not strict)") << "BrokenNoEntryUuid" << false << false; + QTest::newRow("BrokenNoRootGroup (strict)") << "BrokenNoRootGroup" << true << true; + QTest::newRow("BrokenNoRootGroup (not strict)") << "BrokenNoRootGroup" << false << true; + QTest::newRow("BrokenTwoRoots (strict)") << "BrokenTwoRoots" << true << true; + QTest::newRow("BrokenTwoRoots (not strict)") << "BrokenTwoRoots" << false << true; + QTest::newRow("BrokenTwoRootGroups (strict)") << "BrokenTwoRootGroups" << true << true; + QTest::newRow("BrokenTwoRootGroups (not strict)") << "BrokenTwoRootGroups" << false << true; + QTest::newRow("BrokenGroupReference (strict)") << "BrokenGroupReference" << true << false; + QTest::newRow("BrokenGroupReference (not strict)") << "BrokenGroupReference" << false << false; + QTest::newRow("BrokenDeletedObjects (strict)") << "BrokenDeletedObjects" << true << true; + QTest::newRow("BrokenDeletedObjects (not strict)") << "BrokenDeletedObjects" << false << false; + QTest::newRow("BrokenDifferentEntryHistoryUuid (strict)") << "BrokenDifferentEntryHistoryUuid" << true << true; QTest::newRow("BrokenDifferentEntryHistoryUuid (not strict)") << "BrokenDifferentEntryHistoryUuid" << false << false; } @@ -483,17 +396,13 @@ void TestKeePass2XmlReader::testEmptyUuids() QString xmlFile = QString("%1/%2.xml").arg(KEEPASSX_TEST_DATA_DIR, "EmptyUuids"); QVERIFY(QFile::exists(xmlFile)); - Database* dbp; bool hasError; QString errorString; - readDatabase(xmlFile, true, dbp, hasError, errorString); + QScopedPointer<Database> dbp(readDatabase(xmlFile, true, hasError, errorString)); if (hasError) { qWarning("Reader error: %s", qPrintable(errorString)); } QVERIFY(!hasError); - if (dbp) { - delete dbp; - } } void TestKeePass2XmlReader::testInvalidXmlChars() @@ -514,9 +423,10 @@ void TestKeePass2XmlReader::testInvalidXmlChars() QString strSingleLowSurrogate2 = QString().append(QChar((0x31))).append(QChar(0xDC37)).append(QChar(0x32)); QString strLowLowSurrogate = QString().append(QChar(0xDC37)).append(QChar(0xDC37)); QString strSurrogateValid1 = QString().append(QChar(0xD801)).append(QChar(0xDC37)); - QString strSurrogateValid2 = QString().append(QChar(0x31)).append(QChar(0xD801)).append(QChar(0xDC37)).append(QChar(0x32)); + QString strSurrogateValid2 = QString().append(QChar(0x31)).append(QChar(0xD801)).append(QChar(0xDC37)) + .append(QChar(0x32)); - Entry* entry = new Entry(); + auto entry = new Entry(); entry->setUuid(Uuid::random()); entry->setGroup(dbWrite->rootGroup()); entry->attributes()->set("PlainInvalid", strPlainInvalid); @@ -538,13 +448,12 @@ void TestKeePass2XmlReader::testInvalidXmlChars() QVERIFY(!hasError); buffer.seek(0); - Database* dbRead; - readDatabase(&buffer, true, dbRead, hasError, errorString); + QScopedPointer<Database> dbRead(readDatabase(&buffer, true, hasError, errorString)); if (hasError) { qWarning("Database read error: %s", qPrintable(errorString)); } QVERIFY(!hasError); - QVERIFY(dbRead); + QVERIFY(dbRead.data()); QCOMPARE(dbRead->rootGroup()->entries().size(), 1); Entry* entryRead = dbRead->rootGroup()->entries().at(0); EntryAttributes* attrRead = entryRead->attributes(); @@ -559,27 +468,20 @@ void TestKeePass2XmlReader::testInvalidXmlChars() QCOMPARE(strToBytes(attrRead->value("LowLowSurrogate")), QByteArray()); QCOMPARE(strToBytes(attrRead->value("SurrogateValid1")), strToBytes(strSurrogateValid1)); QCOMPARE(strToBytes(attrRead->value("SurrogateValid2")), strToBytes(strSurrogateValid2)); - - if (dbRead) { - delete dbRead; - } } void TestKeePass2XmlReader::testRepairUuidHistoryItem() { QString xmlFile = QString("%1/%2.xml").arg(KEEPASSX_TEST_DATA_DIR, "BrokenDifferentEntryHistoryUuid"); QVERIFY(QFile::exists(xmlFile)); - Database* db; bool hasError; QString errorString; - readDatabase(xmlFile, true, db, hasError, errorString); + QScopedPointer<Database> db(readDatabase(xmlFile, false, hasError, errorString)); if (hasError) { qWarning("Database read error: %s", qPrintable(errorString)); } QVERIFY(!hasError); - - QList<Entry*> entries = db->rootGroup()->entries(); QCOMPARE(entries.size(), 1); Entry* entry = entries.at(0); @@ -591,13 +493,4 @@ void TestKeePass2XmlReader::testRepairUuidHistoryItem() QVERIFY(!entry->uuid().isNull()); QVERIFY(!historyItem->uuid().isNull()); QCOMPARE(historyItem->uuid(), entry->uuid()); - - if (db) { - delete db; - } -} - -void TestKeePass2XmlReader::cleanupTestCase() -{ - delete m_db; } diff --git a/tests/TestKeePass2XmlReader.h b/tests/TestKeePass2XmlReader.h index e07f575b3..ba69eb80f 100644 --- a/tests/TestKeePass2XmlReader.h +++ b/tests/TestKeePass2XmlReader.h @@ -21,8 +21,10 @@ #include <QDateTime> #include <QObject> #include <QBuffer> +#include <QScopedPointer> + +#include "core/Database.h" -class Database; class TestKeePass2XmlReader : public QObject { @@ -30,6 +32,8 @@ class TestKeePass2XmlReader : public QObject protected slots: virtual void initTestCase() = 0; + +private slots: void testMetadata(); void testCustomIcons(); void testCustomData(); @@ -45,42 +49,16 @@ protected slots: void testEmptyUuids(); void testInvalidXmlChars(); void testRepairUuidHistoryItem(); - void cleanupTestCase(); protected: - virtual void readDatabase(QBuffer* buf, bool strictMode, Database*& db, bool& hasError, QString& errorString) = 0; - virtual void readDatabase(QString path, bool strictMode, Database*& db, bool& hasError, QString& errorString) = 0; + virtual Database* readDatabase(QBuffer* buf, bool strictMode, bool& hasError, QString& errorString) = 0; + virtual Database* readDatabase(QString path, bool strictMode, bool& hasError, QString& errorString) = 0; virtual void writeDatabase(QBuffer* buf, Database* db, bool& hasError, QString& errorString) = 0; static QDateTime genDT(int year, int month, int day, int hour, int min, int second); static QByteArray strToBytes(const QString& str); - Database* m_db; + QScopedPointer<Database> m_db; }; -class TestKdbx3XmlReader : public TestKeePass2XmlReader -{ - Q_OBJECT - -private slots: - virtual void initTestCase() override; - -protected: - virtual void readDatabase(QBuffer* buf, bool strictMode, Database*& db, bool& hasError, QString& errorString) override; - virtual void readDatabase(QString path, bool strictMode, Database*& db, bool& hasError, QString& errorString) override; - virtual void writeDatabase(QBuffer* buf, Database* db, bool& hasError, QString& errorString) override; -}; - -class TestKdbx4XmlReader : public TestKeePass2XmlReader -{ - Q_OBJECT - -private slots: - virtual void initTestCase() override; - -protected: - virtual void readDatabase(QBuffer* buf, bool strictMode, Database*& db, bool& hasError, QString& errorString) override; - virtual void readDatabase(QString path, bool strictMode, Database*& db, bool& hasError, QString& errorString) override; - virtual void writeDatabase(QBuffer* buf, Database* db, bool& hasError, QString& errorString) override; -}; #endif // KEEPASSX_TESTKEEPASS2XMLREADER_H From a595239624dd91f40074747c0ff5995d6bafb4e3 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Wed, 17 Jan 2018 20:52:29 +0100 Subject: [PATCH 266/402] Refactor and extend file format tests --- src/format/Kdbx3Reader.cpp | 6 +- src/format/Kdbx3Writer.cpp | 4 +- src/format/KeePass2.h | 177 +++++----- src/format/KeePass2Repair.cpp | 2 +- src/format/KeePass2Writer.cpp | 2 +- tests/CMakeLists.txt | 13 +- tests/TestDeletedObjects.cpp | 2 +- tests/TestKdbx2.cpp | 68 ++++ tests/{TestKeePass2Reader.h => TestKdbx2.h} | 18 +- tests/TestKdbx3.cpp | 171 ++++++++- tests/TestKdbx3.h | 26 +- tests/TestKdbx4.cpp | 153 +++++++- tests/TestKdbx4.h | 22 +- ...s2XmlReader.cpp => TestKeePass2Format.cpp} | 330 ++++++++++++------ tests/TestKeePass2Format.h | 91 +++++ tests/TestKeePass2Reader.cpp | 180 ---------- tests/TestKeePass2Writer.cpp | 168 --------- tests/TestKeePass2Writer.h | 44 --- tests/TestKeePass2XmlReader.h | 64 ---- 19 files changed, 826 insertions(+), 715 deletions(-) create mode 100644 tests/TestKdbx2.cpp rename tests/{TestKeePass2Reader.h => TestKdbx2.h} (65%) rename tests/{TestKeePass2XmlReader.cpp => TestKeePass2Format.cpp} (67%) create mode 100644 tests/TestKeePass2Format.h delete mode 100644 tests/TestKeePass2Reader.cpp delete mode 100644 tests/TestKeePass2Writer.cpp delete mode 100644 tests/TestKeePass2Writer.h delete mode 100644 tests/TestKeePass2XmlReader.h diff --git a/src/format/Kdbx3Reader.cpp b/src/format/Kdbx3Reader.cpp index 638f84063..84f7db67e 100644 --- a/src/format/Kdbx3Reader.cpp +++ b/src/format/Kdbx3Reader.cpp @@ -32,7 +32,7 @@ Database* Kdbx3Reader::readDatabaseImpl(QIODevice* device, const QByteArray& headerData, const CompositeKey& key, bool keepDatabase) { - Q_ASSERT(m_kdbxVersion <= KeePass2::FILE_VERSION_3); + Q_ASSERT(m_kdbxVersion <= KeePass2::FILE_VERSION_3_1); if (hasError()) { return nullptr; @@ -118,7 +118,7 @@ Database* Kdbx3Reader::readDatabaseImpl(QIODevice* device, const QByteArray& hea Q_ASSERT(xmlDevice); - KdbxXmlReader xmlReader(KeePass2::FILE_VERSION_3); + KdbxXmlReader xmlReader(KeePass2::FILE_VERSION_3_1); xmlReader.readDatabase(xmlDevice, m_db.data(), &randomStream); if (xmlReader.hasError()) { @@ -129,7 +129,7 @@ Database* Kdbx3Reader::readDatabaseImpl(QIODevice* device, const QByteArray& hea return nullptr; } - Q_ASSERT(!xmlReader.headerHash().isEmpty() || m_kdbxVersion < KeePass2::FILE_VERSION_3); + Q_ASSERT(!xmlReader.headerHash().isEmpty() || m_kdbxVersion < KeePass2::FILE_VERSION_3_1); if (!xmlReader.headerHash().isEmpty()) { QByteArray headerHash = CryptoHash::hash(headerData, CryptoHash::Sha256); diff --git a/src/format/Kdbx3Writer.cpp b/src/format/Kdbx3Writer.cpp index b0b44c6b2..c2fefff1b 100644 --- a/src/format/Kdbx3Writer.cpp +++ b/src/format/Kdbx3Writer.cpp @@ -63,7 +63,7 @@ bool Kdbx3Writer::writeDatabase(QIODevice* device, Database* db) QBuffer header; header.open(QIODevice::WriteOnly); - writeMagicNumbers(&header, KeePass2::SIGNATURE_1, KeePass2::SIGNATURE_2, KeePass2::FILE_VERSION_3); + writeMagicNumbers(&header, KeePass2::SIGNATURE_1, KeePass2::SIGNATURE_2, KeePass2::FILE_VERSION_3_1); CHECK_RETURN_FALSE(writeHeaderField<quint16>(&header, KeePass2::HeaderFieldID::CipherID, db->cipher().toByteArray())); CHECK_RETURN_FALSE(writeHeaderField<quint16>(&header, KeePass2::HeaderFieldID::CompressionFlags, @@ -131,7 +131,7 @@ bool Kdbx3Writer::writeDatabase(QIODevice* device, Database* db) return false; } - KdbxXmlWriter xmlWriter(KeePass2::FILE_VERSION_3); + KdbxXmlWriter xmlWriter(KeePass2::FILE_VERSION_3_1); xmlWriter.writeDatabase(outputDevice, db, &randomStream, headerHash); // Explicitly close/reset streams so they are flushed and we can detect diff --git a/src/format/KeePass2.h b/src/format/KeePass2.h index c376ecdf2..67779121f 100644 --- a/src/format/KeePass2.h +++ b/src/format/KeePass2.h @@ -22,6 +22,7 @@ #include <QMap> #include <QVariantMap> #include <QList> +#include <QSharedPointer> #include "crypto/SymmetricCipher.h" #include "crypto/kdf/Kdf.h" @@ -29,104 +30,108 @@ namespace KeePass2 { - const quint32 SIGNATURE_1 = 0x9AA2D903; - const quint32 SIGNATURE_2 = 0xB54BFB67; - const quint32 FILE_VERSION_MIN = 0x00020000; - const quint32 FILE_VERSION_CRITICAL_MASK = 0xFFFF0000; - const quint32 FILE_VERSION_4 = 0x00040000; - const quint32 FILE_VERSION_3 = 0x00030001; +constexpr quint32 SIGNATURE_1 = 0x9AA2D903; +constexpr quint32 SIGNATURE_2 = 0xB54BFB67; - const quint16 VARIANTMAP_VERSION = 0x0100; - const quint16 VARIANTMAP_CRITICAL_MASK = 0xFF00; +constexpr quint32 FILE_VERSION_CRITICAL_MASK = 0xFFFF0000; +constexpr quint32 FILE_VERSION_4 = 0x00040000; +constexpr quint32 FILE_VERSION_3_1 = 0x00030001; +constexpr quint32 FILE_VERSION_3 = 0x00030000; +constexpr quint32 FILE_VERSION_2 = 0x00020000; +constexpr quint32 FILE_VERSION_MIN = FILE_VERSION_2; - const QSysInfo::Endian BYTEORDER = QSysInfo::LittleEndian; +constexpr quint16 VARIANTMAP_VERSION = 0x0100; +constexpr quint16 VARIANTMAP_CRITICAL_MASK = 0xFF00; - extern const Uuid CIPHER_AES; - extern const Uuid CIPHER_TWOFISH; - extern const Uuid CIPHER_CHACHA20; +const QSysInfo::Endian BYTEORDER = QSysInfo::LittleEndian; - extern const Uuid KDF_AES_KDBX3; - extern const Uuid KDF_AES_KDBX4; - extern const Uuid KDF_ARGON2; +extern const Uuid CIPHER_AES; +extern const Uuid CIPHER_TWOFISH; +extern const Uuid CIPHER_CHACHA20; - extern const QByteArray INNER_STREAM_SALSA20_IV; +extern const Uuid KDF_AES_KDBX3; +extern const Uuid KDF_AES_KDBX4; +extern const Uuid KDF_ARGON2; - extern const QString KDFPARAM_UUID; - extern const QString KDFPARAM_AES_ROUNDS; - extern const QString KDFPARAM_AES_SEED; - extern const QString KDFPARAM_ARGON2_SALT; - extern const QString KDFPARAM_ARGON2_PARALLELISM; - extern const QString KDFPARAM_ARGON2_MEMORY; - extern const QString KDFPARAM_ARGON2_ITERATIONS; - extern const QString KDFPARAM_ARGON2_VERSION; - extern const QString KDFPARAM_ARGON2_SECRET; - extern const QString KDFPARAM_ARGON2_ASSOCDATA; +extern const QByteArray INNER_STREAM_SALSA20_IV; - extern const QList<QPair<Uuid, QString>> CIPHERS; - extern const QList<QPair<Uuid, QString>> KDFS; +extern const QString KDFPARAM_UUID; +extern const QString KDFPARAM_AES_ROUNDS; +extern const QString KDFPARAM_AES_SEED; +extern const QString KDFPARAM_ARGON2_SALT; +extern const QString KDFPARAM_ARGON2_PARALLELISM; +extern const QString KDFPARAM_ARGON2_MEMORY; +extern const QString KDFPARAM_ARGON2_ITERATIONS; +extern const QString KDFPARAM_ARGON2_VERSION; +extern const QString KDFPARAM_ARGON2_SECRET; +extern const QString KDFPARAM_ARGON2_ASSOCDATA; - enum class HeaderFieldID - { - EndOfHeader = 0, - Comment = 1, - CipherID = 2, - CompressionFlags = 3, - MasterSeed = 4, - TransformSeed = 5, - TransformRounds = 6, - EncryptionIV = 7, - ProtectedStreamKey = 8, - StreamStartBytes = 9, - InnerRandomStreamID = 10, - KdfParameters = 11, - PublicCustomData = 12 - }; +extern const QList<QPair<Uuid, QString>> CIPHERS; +extern const QList<QPair<Uuid, QString>> KDFS; - enum class InnerHeaderFieldID : quint8 - { - End = 0, - InnerRandomStreamID = 1, - InnerRandomStreamKey = 2, - Binary = 3 - }; +enum class HeaderFieldID +{ + EndOfHeader = 0, + Comment = 1, + CipherID = 2, + CompressionFlags = 3, + MasterSeed = 4, + TransformSeed = 5, + TransformRounds = 6, + EncryptionIV = 7, + ProtectedStreamKey = 8, + StreamStartBytes = 9, + InnerRandomStreamID = 10, + KdfParameters = 11, + PublicCustomData = 12 +}; - enum class ProtectedStreamAlgo - { - ArcFourVariant = 1, - Salsa20 = 2, - ChaCha20 = 3, - InvalidProtectedStreamAlgo = -1 - }; +enum class InnerHeaderFieldID : quint8 +{ + End = 0, + InnerRandomStreamID = 1, + InnerRandomStreamKey = 2, + Binary = 3 +}; - enum class VariantMapFieldType : quint8 - { - End = 0, - // Byte = 0x02, - // UInt16 = 0x03, - UInt32 = 0x04, - UInt64 = 0x05, - // Signed mask: 0x08 - Bool = 0x08, - // SByte = 0x0A, - // Int16 = 0x0B, - Int32 = 0x0C, - Int64 = 0x0D, - // Float = 0x10, - // Double = 0x11, - // Decimal = 0x12, - // Char = 0x17, // 16-bit Unicode character - String = 0x18, - // Array mask: 0x40 - ByteArray = 0x42 - }; +enum class ProtectedStreamAlgo +{ + ArcFourVariant = 1, + Salsa20 = 2, + ChaCha20 = 3, + InvalidProtectedStreamAlgo = -1 +}; - QByteArray hmacKey(QByteArray masterSeed, QByteArray transformedMasterKey); - QSharedPointer<Kdf> kdfFromParameters(const QVariantMap& p); - QVariantMap kdfToParameters(QSharedPointer<Kdf> kdf); - QSharedPointer<Kdf> uuidToKdf(const Uuid& uuid); - Uuid kdfToUuid(QSharedPointer<Kdf> kdf); - ProtectedStreamAlgo idToProtectedStreamAlgo(quint32 id); -} +enum class VariantMapFieldType : quint8 +{ + End = 0, + // Byte = 0x02, + // UInt16 = 0x03, + UInt32 = 0x04, + UInt64 = 0x05, + // Signed mask: 0x08 + Bool = 0x08, + // SByte = 0x0A, + // Int16 = 0x0B, + Int32 = 0x0C, + Int64 = 0x0D, + // Float = 0x10, + // Double = 0x11, + // Decimal = 0x12, + // Char = 0x17, // 16-bit Unicode character + String = 0x18, + // Array mask: 0x40 + ByteArray = 0x42 +}; + +QByteArray hmacKey(QByteArray masterSeed, QByteArray transformedMasterKey); +QSharedPointer<Kdf> kdfFromParameters(const QVariantMap& p); +QVariantMap kdfToParameters(QSharedPointer<Kdf> kdf); +QSharedPointer<Kdf> uuidToKdf(const Uuid& uuid); +Uuid kdfToUuid(QSharedPointer<Kdf> kdf); +ProtectedStreamAlgo idToProtectedStreamAlgo(quint32 id); + +} // namespace KeePass2 #endif // KEEPASSX_KEEPASS2_H diff --git a/src/format/KeePass2Repair.cpp b/src/format/KeePass2Repair.cpp index e2af16cea..47ed59dc9 100644 --- a/src/format/KeePass2Repair.cpp +++ b/src/format/KeePass2Repair.cpp @@ -79,7 +79,7 @@ KeePass2Repair::RepairOutcome KeePass2Repair::repairDatabase(QIODevice* device, QBuffer buffer(&xmlData); buffer.open(QIODevice::ReadOnly); if ((reader.version() & KeePass2::FILE_VERSION_CRITICAL_MASK) < KeePass2::FILE_VERSION_4) { - KdbxXmlReader xmlReader(KeePass2::FILE_VERSION_3); + KdbxXmlReader xmlReader(KeePass2::FILE_VERSION_3_1); xmlReader.readDatabase(&buffer, db.data(), &randomStream); hasError = xmlReader.hasError(); } else { diff --git a/src/format/KeePass2Writer.cpp b/src/format/KeePass2Writer.cpp index 67aeec98f..7be3178ba 100644 --- a/src/format/KeePass2Writer.cpp +++ b/src/format/KeePass2Writer.cpp @@ -54,7 +54,7 @@ bool KeePass2Writer::writeDatabase(QIODevice* device, Database* db) { // determine KDBX3 vs KDBX4 if (db->kdf()->uuid() == KeePass2::KDF_AES_KDBX3 && db->publicCustomData().isEmpty()) { - m_version = KeePass2::FILE_VERSION_3; + m_version = KeePass2::FILE_VERSION_3_1; m_writer.reset(new Kdbx3Writer()); } else { m_version = KeePass2::FILE_VERSION_4; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 1e7512268..5e6043609 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -107,21 +107,18 @@ endif() add_unit_test(NAME testgroup SOURCES TestGroup.cpp LIBS ${TEST_LIBRARIES}) -add_unit_test(NAME testkdbx3 SOURCES TestKeePass2XmlReader.cpp TestKdbx3.cpp +add_unit_test(NAME testkdbx2 SOURCES TestKdbx2.cpp LIBS ${TEST_LIBRARIES}) -add_unit_test(NAME testkdbx4 SOURCES TestKeePass2XmlReader.cpp TestKdbx4.cpp +add_unit_test(NAME testkdbx3 SOURCES TestKeePass2Format.cpp FailDevice.cpp TestKdbx3.cpp + LIBS ${TEST_LIBRARIES}) + +add_unit_test(NAME testkdbx4 SOURCES TestKeePass2Format.cpp FailDevice.cpp TestKdbx4.cpp LIBS ${TEST_LIBRARIES}) add_unit_test(NAME testkeys SOURCES TestKeys.cpp LIBS ${TEST_LIBRARIES}) -add_unit_test(NAME testkeepass2reader SOURCES TestKeePass2Reader.cpp - LIBS ${TEST_LIBRARIES}) - -add_unit_test(NAME testkeepass2writer SOURCES TestKeePass2Writer.cpp - LIBS testsupport ${TEST_LIBRARIES}) - add_unit_test(NAME testgroupmodel SOURCES TestGroupModel.cpp LIBS testsupport ${TEST_LIBRARIES}) diff --git a/tests/TestDeletedObjects.cpp b/tests/TestDeletedObjects.cpp index c8236f05b..63dab0edf 100644 --- a/tests/TestDeletedObjects.cpp +++ b/tests/TestDeletedObjects.cpp @@ -89,7 +89,7 @@ void TestDeletedObjects::createAndDelete(Database* db, int delObjectsSize) void TestDeletedObjects::testDeletedObjectsFromFile() { - KdbxXmlReader reader(KeePass2::FILE_VERSION_3); + KdbxXmlReader reader(KeePass2::FILE_VERSION_3_1); reader.setStrictMode(true); QString xmlFile = QString(KEEPASSX_TEST_DATA_DIR).append("/NewDatabase.xml"); Database* db = reader.readDatabase(xmlFile); diff --git a/tests/TestKdbx2.cpp b/tests/TestKdbx2.cpp new file mode 100644 index 000000000..8424b56e4 --- /dev/null +++ b/tests/TestKdbx2.cpp @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "TestKdbx2.h" +#include "crypto/Crypto.h" +#include "keys/CompositeKey.h" +#include "keys/PasswordKey.h" +#include "format/KeePass2Reader.h" +#include "core/Entry.h" +#include "core/Group.h" +#include "core/Metadata.h" +#include "config-keepassx-tests.h" + +#include <QTest> + +QTEST_GUILESS_MAIN(TestKdbx2) + +void TestKdbx2::initTestCase() +{ + QVERIFY(Crypto::init()); +} + +void TestKdbx2::testFormat200() +{ + QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/Format200.kdbx"); + CompositeKey key; + key.addKey(PasswordKey("a")); + KeePass2Reader reader; + QScopedPointer<Database> db(reader.readDatabase(filename, key)); + QCOMPARE(reader.version(), KeePass2::FILE_VERSION_2); + QVERIFY(db.data()); + QVERIFY(!reader.hasError()); + + QCOMPARE(db->rootGroup()->name(), QString("Format200")); + QVERIFY(!db->metadata()->protectTitle()); + QVERIFY(db->metadata()->protectUsername()); + QVERIFY(!db->metadata()->protectPassword()); + QVERIFY(db->metadata()->protectUrl()); + QVERIFY(!db->metadata()->protectNotes()); + + QCOMPARE(db->rootGroup()->entries().size(), 1); + auto entry = db->rootGroup()->entries().at(0); + + QCOMPARE(entry->title(), QString("Sample Entry")); + QCOMPARE(entry->username(), QString("User Name")); + QCOMPARE(entry->attachments()->keys().size(), 2); + QCOMPARE(entry->attachments()->value("myattach.txt"), QByteArray("abcdefghijk")); + QCOMPARE(entry->attachments()->value("test.txt"), QByteArray("this is a test")); + + QCOMPARE(entry->historyItems().size(), 2); + QCOMPARE(entry->historyItems().at(0)->attachments()->keys().size(), 0); + QCOMPARE(entry->historyItems().at(1)->attachments()->keys().size(), 1); + QCOMPARE(entry->historyItems().at(1)->attachments()->value("myattach.txt"), QByteArray("abcdefghijk")); +} diff --git a/tests/TestKeePass2Reader.h b/tests/TestKdbx2.h similarity index 65% rename from tests/TestKeePass2Reader.h rename to tests/TestKdbx2.h index 6ba9b0dc1..f72672021 100644 --- a/tests/TestKeePass2Reader.h +++ b/tests/TestKdbx2.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> + * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -15,24 +15,18 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef KEEPASSX_TESTKEEPASS2READER_H -#define KEEPASSX_TESTKEEPASS2READER_H +#ifndef KEEPASSXC_TEST_KDBX2_H +#define KEEPASSXC_TEST_KDBX2_H #include <QObject> -class TestKeePass2Reader : public QObject +class TestKdbx2 : public QObject { - Q_OBJECT +Q_OBJECT private slots: void initTestCase(); - void testNonAscii(); - void testCompressed(); - void testProtectedStrings(); - void testBrokenHeaderHash(); void testFormat200(); - void testFormat300(); - void testFormat400(); }; -#endif // KEEPASSX_TESTKEEPASS2READER_H +#endif // KEEPASSXC_TEST_KDBX2_H diff --git a/tests/TestKdbx3.cpp b/tests/TestKdbx3.cpp index 9bb5d8b54..210ddc752 100644 --- a/tests/TestKdbx3.cpp +++ b/tests/TestKdbx3.cpp @@ -17,31 +17,27 @@ #include "TestKdbx3.h" #include "core/Metadata.h" -#include "crypto/Crypto.h" +#include "keys/PasswordKey.h" #include "format/KeePass2.h" +#include "format/KeePass2Reader.h" +#include "format/KeePass2Writer.h" #include "format/KdbxXmlReader.h" #include "format/KdbxXmlWriter.h" +#include "format/KeePass2Repair.h" #include "config-keepassx-tests.h" #include <QTest> QTEST_GUILESS_MAIN(TestKdbx3) -void TestKdbx3::initTestCase() +void TestKdbx3::initTestCaseImpl() { - QVERIFY(Crypto::init()); - KdbxXmlReader reader(KeePass2::FILE_VERSION_3); - reader.setStrictMode(true); - QString xmlFile = QString(KEEPASSX_TEST_DATA_DIR).append("/NewDatabase.xml"); - m_db.reset(reader.readDatabase(xmlFile)); - QVERIFY(m_db.data()); - QVERIFY(!reader.hasError()); } -Database* TestKdbx3::readDatabase(QString path, bool strictMode, bool& hasError, QString& errorString) +Database* TestKdbx3::readXml(const QString& path, bool strictMode, bool& hasError, QString& errorString) { - KdbxXmlReader reader(KeePass2::FILE_VERSION_3); + KdbxXmlReader reader(KeePass2::FILE_VERSION_3_1); reader.setStrictMode(strictMode); auto db = reader.readDatabase(path); hasError = reader.hasError(); @@ -49,9 +45,9 @@ Database* TestKdbx3::readDatabase(QString path, bool strictMode, bool& hasError, return db; } -Database* TestKdbx3::readDatabase(QBuffer* buf, bool strictMode, bool& hasError, QString& errorString) +Database* TestKdbx3::readXml(QBuffer* buf, bool strictMode, bool& hasError, QString& errorString) { - KdbxXmlReader reader(KeePass2::FILE_VERSION_3); + KdbxXmlReader reader(KeePass2::FILE_VERSION_3_1); reader.setStrictMode(strictMode); auto db = reader.readDatabase(buf); hasError = reader.hasError(); @@ -59,10 +55,155 @@ Database* TestKdbx3::readDatabase(QBuffer* buf, bool strictMode, bool& hasError, return db; } -void TestKdbx3::writeDatabase(QBuffer* buf, Database* db, bool& hasError, QString& errorString) +void TestKdbx3::writeXml(QBuffer* buf, Database* db, bool& hasError, QString& errorString) { - KdbxXmlWriter writer(KeePass2::FILE_VERSION_3); + KdbxXmlWriter writer(KeePass2::FILE_VERSION_3_1); writer.writeDatabase(buf, db); hasError = writer.hasError(); errorString = writer.errorString(); } + +void TestKdbx3::readKdbx(QIODevice* device, CompositeKey const& key, QScopedPointer<Database>& db, + bool& hasError, QString& errorString) +{ + KeePass2Reader reader; + db.reset(reader.readDatabase(device, key)); + hasError = reader.hasError(); + if (hasError) { + errorString = reader.errorString(); + } + QCOMPARE(reader.version(), KeePass2::FILE_VERSION_3_1 & KeePass2::FILE_VERSION_CRITICAL_MASK); +} + +void TestKdbx3::readKdbx(const QString& path, CompositeKey const& key, QScopedPointer<Database>& db, + bool& hasError, QString& errorString) +{ + KeePass2Reader reader; + db.reset(reader.readDatabase(path, key)); + hasError = reader.hasError(); + if (hasError) { + errorString = reader.errorString(); + } + QCOMPARE(reader.version(), KeePass2::FILE_VERSION_3_1 & KeePass2::FILE_VERSION_CRITICAL_MASK); +} + +void TestKdbx3::writeKdbx(QIODevice* device, Database* db, bool& hasError, QString& errorString) +{ + KeePass2Writer writer; + hasError = writer.writeDatabase(device, db); + hasError = writer.hasError(); + if (hasError) { + errorString = writer.errorString(); + } + QCOMPARE(writer.version(), KeePass2::FILE_VERSION_3_1); +} + +void TestKdbx3::testFormat300() +{ + QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/Format300.kdbx"); + CompositeKey key; + key.addKey(PasswordKey("a")); + KeePass2Reader reader; + QScopedPointer<Database> db(reader.readDatabase(filename, key)); + QCOMPARE(reader.version(), KeePass2::FILE_VERSION_3); + QVERIFY(db.data()); + QVERIFY(!reader.hasError()); + + QCOMPARE(db->rootGroup()->name(), QString("Format300")); + QCOMPARE(db->metadata()->name(), QString("Test Database Format 0x00030000")); +} + +void TestKdbx3::testNonAscii() +{ + QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/NonAscii.kdbx"); + CompositeKey key; + key.addKey(PasswordKey(QString::fromUtf8("\xce\x94\xc3\xb6\xd8\xb6"))); + KeePass2Reader reader; + QScopedPointer<Database> db(reader.readDatabase(filename, key)); + QVERIFY(db.data()); + QVERIFY(!reader.hasError()); + QCOMPARE(db->metadata()->name(), QString("NonAsciiTest")); + QCOMPARE(db->compressionAlgo(), Database::CompressionNone); +} + +void TestKdbx3::testCompressed() +{ + QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/Compressed.kdbx"); + CompositeKey key; + key.addKey(PasswordKey("")); + KeePass2Reader reader; + QScopedPointer<Database> db(reader.readDatabase(filename, key)); + QVERIFY(db.data()); + QVERIFY(!reader.hasError()); + QCOMPARE(db->metadata()->name(), QString("Compressed")); + QCOMPARE(db->compressionAlgo(), Database::CompressionGZip); +} + +void TestKdbx3::testProtectedStrings() +{ + QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/ProtectedStrings.kdbx"); + CompositeKey key; + key.addKey(PasswordKey("masterpw")); + KeePass2Reader reader; + QScopedPointer<Database> db(reader.readDatabase(filename, key)); + QVERIFY(db.data()); + QVERIFY(!reader.hasError()); + QCOMPARE(db->metadata()->name(), QString("Protected Strings Test")); + + Entry* entry = db->rootGroup()->entries().at(0); + + QCOMPARE(entry->title(), QString("Sample Entry")); + QCOMPARE(entry->username(), QString("Protected User Name")); + QCOMPARE(entry->password(), QString("ProtectedPassword")); + QCOMPARE(entry->attributes()->value("TestProtected"), QString("ABC")); + QCOMPARE(entry->attributes()->value("TestUnprotected"), QString("DEF")); + + QVERIFY(db->metadata()->protectPassword()); + QVERIFY(entry->attributes()->isProtected("TestProtected")); + QVERIFY(!entry->attributes()->isProtected("TestUnprotected")); +} + +void TestKdbx3::testBrokenHeaderHash() +{ + // The protected stream key has been modified in the header. + // Make sure the database won't open. + + QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/BrokenHeaderHash.kdbx"); + CompositeKey key; + key.addKey(PasswordKey("")); + KeePass2Reader reader; + QScopedPointer<Database> db(reader.readDatabase(filename, key)); + QVERIFY(!db.data()); + QVERIFY(reader.hasError()); +} + +void TestKdbx3::testKdbxRepair() +{ + QString brokenDbFilename = QString(KEEPASSX_TEST_DATA_DIR).append("/bug392.kdbx"); + // master password = test + // entry username: testuser\x10\x20AC + // entry password: testpw + CompositeKey key; + key.addKey(PasswordKey("test")); + + // test that we can't open the broken database + bool hasError; + QString errorString; + QScopedPointer<Database> dbBroken; + readKdbx(brokenDbFilename, key, dbBroken, hasError, errorString); + QVERIFY(!dbBroken.data()); + QVERIFY(hasError); + + // test if we can repair the database + KeePass2Repair repair; + QFile file(brokenDbFilename); + file.open(QIODevice::ReadOnly); + auto result = repair.repairDatabase(&file, key); + QCOMPARE(result.first, KeePass2Repair::RepairSuccess); + QScopedPointer<Database> dbRepaired(result.second); + QVERIFY(dbRepaired); + + QCOMPARE(dbRepaired->rootGroup()->entries().size(), 1); + QCOMPARE(dbRepaired->rootGroup()->entries().at(0)->username(), QString("testuser").append(QChar(0x20AC))); + QCOMPARE(dbRepaired->rootGroup()->entries().at(0)->password(), QString("testpw")); +} diff --git a/tests/TestKdbx3.h b/tests/TestKdbx3.h index fac8f7eb1..07c1c5503 100644 --- a/tests/TestKdbx3.h +++ b/tests/TestKdbx3.h @@ -18,19 +18,33 @@ #ifndef KEEPASSXC_TEST_KDBX3_H #define KEEPASSXC_TEST_KDBX3_H -#include "TestKeePass2XmlReader.h" +#include "TestKeePass2Format.h" -class TestKdbx3 : public TestKeePass2XmlReader +class TestKdbx3 : public TestKeePass2Format { Q_OBJECT private slots: - virtual void initTestCase() override; + void testNonAscii(); + void testCompressed(); + void testProtectedStrings(); + void testBrokenHeaderHash(); + void testFormat300(); + void testKdbxRepair(); protected: - virtual Database* readDatabase(QBuffer* buf, bool strictMode, bool& hasError, QString& errorString) override; - virtual Database* readDatabase(QString path, bool strictMode, bool& hasError, QString& errorString) override; - virtual void writeDatabase(QBuffer* buf, Database* db, bool& hasError, QString& errorString) override; + void initTestCaseImpl() override; + + Database* readXml(QBuffer* buf, bool strictMode, bool& hasError, QString& errorString) override; + Database* readXml(const QString& path, bool strictMode, bool& hasError, QString& errorString) override; + void writeXml(QBuffer* buf, Database* db, bool& hasError, QString& errorString) override; + + void readKdbx(QIODevice* device, CompositeKey const& key, QScopedPointer<Database>& db, + bool& hasError, QString& errorString) override; + void readKdbx(const QString& path, CompositeKey const& key, QScopedPointer<Database>& db, + bool& hasError, QString& errorString) override; + void writeKdbx(QIODevice* device, Database* db, bool& hasError, QString& errorString) override; + }; #endif // KEEPASSXC_TEST_KDBX3_H diff --git a/tests/TestKdbx4.cpp b/tests/TestKdbx4.cpp index e67274cbd..0a21215ac 100644 --- a/tests/TestKdbx4.cpp +++ b/tests/TestKdbx4.cpp @@ -17,8 +17,10 @@ #include "TestKdbx4.h" #include "core/Metadata.h" -#include "crypto/Crypto.h" +#include "keys/PasswordKey.h" #include "format/KeePass2.h" +#include "format/KeePass2Reader.h" +#include "format/KeePass2Writer.h" #include "format/KdbxXmlReader.h" #include "format/KdbxXmlWriter.h" #include "config-keepassx-tests.h" @@ -27,21 +29,15 @@ QTEST_GUILESS_MAIN(TestKdbx4) -void TestKdbx4::initTestCase() +void TestKdbx4::initTestCaseImpl() { - QVERIFY(Crypto::init()); - - KdbxXmlReader reader(KeePass2::FILE_VERSION_3); - reader.setStrictMode(true); - QString xmlFile = QString(KEEPASSX_TEST_DATA_DIR).append("/NewDatabase.xml"); - m_db.reset(reader.readDatabase(xmlFile)); - QVERIFY(m_db.data()); - QVERIFY(!reader.hasError()); + m_xmlDb->changeKdf(KeePass2::uuidToKdf(KeePass2::KDF_ARGON2)); + m_kdbxSourceDb->changeKdf(KeePass2::uuidToKdf(KeePass2::KDF_ARGON2)); } -Database* TestKdbx4::readDatabase(QString path, bool strictMode, bool& hasError, QString& errorString) +Database* TestKdbx4::readXml(const QString& path, bool strictMode, bool& hasError, QString& errorString) { - KdbxXmlReader reader(KeePass2::FILE_VERSION_3); + KdbxXmlReader reader(KeePass2::FILE_VERSION_4); reader.setStrictMode(strictMode); auto db = reader.readDatabase(path); hasError = reader.hasError(); @@ -49,9 +45,9 @@ Database* TestKdbx4::readDatabase(QString path, bool strictMode, bool& hasError, return db; } -Database* TestKdbx4::readDatabase(QBuffer* buf, bool strictMode, bool& hasError, QString& errorString) +Database* TestKdbx4::readXml(QBuffer* buf, bool strictMode, bool& hasError, QString& errorString) { - KdbxXmlReader reader(KeePass2::FILE_VERSION_3); + KdbxXmlReader reader(KeePass2::FILE_VERSION_4); reader.setStrictMode(strictMode); auto db = reader.readDatabase(buf); hasError = reader.hasError(); @@ -59,10 +55,135 @@ Database* TestKdbx4::readDatabase(QBuffer* buf, bool strictMode, bool& hasError, return db; } -void TestKdbx4::writeDatabase(QBuffer* buf, Database* db, bool& hasError, QString& errorString) +void TestKdbx4::writeXml(QBuffer* buf, Database* db, bool& hasError, QString& errorString) { - KdbxXmlWriter writer(KeePass2::FILE_VERSION_3); + KdbxXmlWriter writer(KeePass2::FILE_VERSION_4); writer.writeDatabase(buf, db); hasError = writer.hasError(); errorString = writer.errorString(); } + +void TestKdbx4::readKdbx(QIODevice* device, CompositeKey const& key, QScopedPointer<Database>& db, + bool& hasError, QString& errorString) +{ + KeePass2Reader reader; + db.reset(reader.readDatabase(device, key)); + hasError = reader.hasError(); + if (hasError) { + errorString = reader.errorString(); + } + QCOMPARE(reader.version(), KeePass2::FILE_VERSION_4); +} + +void TestKdbx4::readKdbx(const QString& path, CompositeKey const& key, QScopedPointer<Database>& db, + bool& hasError, QString& errorString) +{ + KeePass2Reader reader; + db.reset(reader.readDatabase(path, key)); + hasError = reader.hasError(); + if (hasError) { + errorString = reader.errorString(); + } + QCOMPARE(reader.version(), KeePass2::FILE_VERSION_4); +} + +void TestKdbx4::writeKdbx(QIODevice* device, Database* db, bool& hasError, QString& errorString) +{ + if (db->kdf()->uuid() == KeePass2::KDF_AES_KDBX3) { + db->changeKdf(KeePass2::uuidToKdf(KeePass2::KDF_ARGON2)); + } + KeePass2Writer writer; + hasError = writer.writeDatabase(device, db); + hasError = writer.hasError(); + if (hasError) { + errorString = writer.errorString(); + } + QCOMPARE(writer.version(), KeePass2::FILE_VERSION_4); +} + +Q_DECLARE_METATYPE(Uuid); +void TestKdbx4::testFormat400() +{ + QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/Format400.kdbx"); + CompositeKey key; + key.addKey(PasswordKey("t")); + KeePass2Reader reader; + QScopedPointer<Database> db(reader.readDatabase(filename, key)); + QCOMPARE(reader.version(), KeePass2::FILE_VERSION_4); + QVERIFY(db.data()); + QVERIFY(!reader.hasError()); + + QCOMPARE(db->rootGroup()->name(), QString("Format400")); + QCOMPARE(db->metadata()->name(), QString("Format400")); + QCOMPARE(db->rootGroup()->entries().size(), 1); + auto entry = db->rootGroup()->entries().at(0); + + QCOMPARE(entry->title(), QString("Format400")); + QCOMPARE(entry->username(), QString("Format400")); + QCOMPARE(entry->attributes()->keys().size(), 6); + QCOMPARE(entry->attributes()->value("Format400"), QString("Format400")); + QCOMPARE(entry->attachments()->keys().size(), 1); + QCOMPARE(entry->attachments()->value("Format400"), QByteArray("Format400\n")); +} + +void TestKdbx4::testFormat400Upgrade() +{ + QFETCH(Uuid, kdfUuid); + QFETCH(Uuid, cipherUuid); + QFETCH(quint32, expectedVersion); + + QScopedPointer<Database> sourceDb(new Database()); + sourceDb->metadata()->setName("Wubba lubba dub dub"); + QCOMPARE(sourceDb->kdf()->uuid(), KeePass2::KDF_AES_KDBX3); // default is legacy AES-KDF + + CompositeKey key; + key.addKey(PasswordKey("I am in great pain, please help me!")); + sourceDb->setKey(key, true, true); + + QBuffer buffer; + buffer.open(QBuffer::ReadWrite); + + // upgrade to KDBX 4 by changing KDF and Cipher + sourceDb->changeKdf(KeePass2::uuidToKdf(kdfUuid)); + sourceDb->setCipher(cipherUuid); + KeePass2Writer writer; + writer.writeDatabase(&buffer, sourceDb.data()); + if (writer.hasError()) { + QFAIL(qPrintable(QString("Error while writing database: %1").arg(writer.errorString()))); + } + + // read buffer back + buffer.seek(0); + KeePass2Reader reader; + QScopedPointer<Database> targetDb(reader.readDatabase(&buffer, key)); + if (reader.hasError()) { + QFAIL(qPrintable(QString("Error while reading database: %1").arg(reader.errorString()))); + } + + QVERIFY(targetDb->rootGroup()); + QCOMPARE(targetDb->metadata()->name(), sourceDb->metadata()->name()); + + QCOMPARE(reader.version(), expectedVersion); + QCOMPARE(targetDb->kdf()->uuid(), sourceDb->kdf()->uuid()); + QCOMPARE(targetDb->cipher(), cipherUuid); +} + +void TestKdbx4::testFormat400Upgrade_data() +{ + QTest::addColumn<Uuid>("kdfUuid"); + QTest::addColumn<Uuid>("cipherUuid"); + QTest::addColumn<quint32>("expectedVersion"); + + auto constexpr kdbx3 = KeePass2::FILE_VERSION_3_1 & KeePass2::FILE_VERSION_CRITICAL_MASK; + auto constexpr kdbx4 = KeePass2::FILE_VERSION_4 & KeePass2::FILE_VERSION_CRITICAL_MASK; + + QTest::newRow("Argon2 + AES") << KeePass2::KDF_ARGON2 << KeePass2::CIPHER_AES << kdbx4; + QTest::newRow("AES-KDF + AES") << KeePass2::KDF_AES_KDBX4 << KeePass2::CIPHER_AES << kdbx4; + QTest::newRow("AES-KDF (legacy) + AES") << KeePass2::KDF_AES_KDBX3 << KeePass2::CIPHER_AES << kdbx3; + QTest::newRow("Argon2 + ChaCha20") << KeePass2::KDF_ARGON2 << KeePass2::CIPHER_CHACHA20 << kdbx4; + QTest::newRow("AES-KDF + ChaCha20") << KeePass2::KDF_AES_KDBX4 << KeePass2::CIPHER_CHACHA20 << kdbx4; + QTest::newRow("AES-KDF (legacy) + ChaCha20") << KeePass2::KDF_AES_KDBX3 << KeePass2::CIPHER_CHACHA20 << kdbx3; + QTest::newRow("Argon2 + Twofish") << KeePass2::KDF_ARGON2 << KeePass2::CIPHER_TWOFISH << kdbx4; + QTest::newRow("AES-KDF + Twofish") << KeePass2::KDF_AES_KDBX4 << KeePass2::CIPHER_TWOFISH << kdbx4; + QTest::newRow("AES-KDF (legacy) + Twofish") << KeePass2::KDF_AES_KDBX3 << KeePass2::CIPHER_TWOFISH << kdbx3; +} diff --git a/tests/TestKdbx4.h b/tests/TestKdbx4.h index 0615ff3b7..59864b70e 100644 --- a/tests/TestKdbx4.h +++ b/tests/TestKdbx4.h @@ -18,19 +18,29 @@ #ifndef KEEPASSXC_TEST_KDBX4_H #define KEEPASSXC_TEST_KDBX4_H -#include "TestKeePass2XmlReader.h" +#include "TestKeePass2Format.h" -class TestKdbx4 : public TestKeePass2XmlReader +class TestKdbx4 : public TestKeePass2Format { Q_OBJECT private slots: - virtual void initTestCase() override; + void testFormat400(); + void testFormat400Upgrade(); + void testFormat400Upgrade_data(); protected: - virtual Database* readDatabase(QBuffer* buf, bool strictMode, bool& hasError, QString& errorString) override; - virtual Database* readDatabase(QString path, bool strictMode, bool& hasError, QString& errorString) override; - virtual void writeDatabase(QBuffer* buf, Database* db, bool& hasError, QString& errorString) override; + void initTestCaseImpl() override; + + Database* readXml(QBuffer* buf, bool strictMode, bool& hasError, QString& errorString) override; + Database* readXml(const QString& path, bool strictMode, bool& hasError, QString& errorString) override; + void writeXml(QBuffer* buf, Database* db, bool& hasError, QString& errorString) override; + + void readKdbx(const QString& path, CompositeKey const& key, QScopedPointer<Database>& db, + bool& hasError, QString& errorString) override; + void readKdbx(QIODevice* device, CompositeKey const& key, QScopedPointer<Database>& db, + bool& hasError, QString& errorString) override; + void writeKdbx(QIODevice* device, Database* db, bool& hasError, QString& errorString) override; }; #endif // KEEPASSXC_TEST_KDBX4_H diff --git a/tests/TestKeePass2XmlReader.cpp b/tests/TestKeePass2Format.cpp similarity index 67% rename from tests/TestKeePass2XmlReader.cpp rename to tests/TestKeePass2Format.cpp index a89b9547f..6c3777387 100644 --- a/tests/TestKeePass2XmlReader.cpp +++ b/tests/TestKeePass2Format.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> + * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -15,101 +15,105 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include "TestKeePass2XmlReader.h" +#include "TestKeePass2Format.h" #include "core/Group.h" #include "core/Metadata.h" +#include "crypto/Crypto.h" +#include "keys/PasswordKey.h" #include "format/KdbxXmlReader.h" -#include "format/KdbxXmlWriter.h" + +#include "FailDevice.h" #include "config-keepassx-tests.h" #include <QFile> #include <QTest> -namespace QTest { -template<> -char* toString(const Uuid& uuid) +void TestKeePass2Format::initTestCase() { - QByteArray ba = "Uuid("; - ba += uuid.toBase64().toLatin1().constData(); - ba += ")"; - return qstrdup(ba.constData()); -} + QVERIFY(Crypto::init()); -template<> -char* toString(const Group::TriState& triState) -{ - QString value; + // read raw XML database + bool hasError; + QString errorString; + m_xmlDb.reset(readXml(QString(KEEPASSX_TEST_DATA_DIR).append("/NewDatabase.xml"), true, hasError, errorString)); + if (hasError) { + QFAIL(qPrintable(QString("Error while reading XML: ").append(errorString))); + } + QVERIFY(m_xmlDb.data()); - if (triState == Group::Inherit) { - value = "null"; - } else if (triState == Group::Enable) { - value = "true"; - } else { - value = "false"; + // construct and write KDBX to buffer + CompositeKey key; + key.addKey(PasswordKey("test")); + + m_kdbxSourceDb.reset(new Database()); + m_kdbxSourceDb->setKey(key); + m_kdbxSourceDb->metadata()->setName("TESTDB"); + Group* group = m_kdbxSourceDb->rootGroup(); + group->setUuid(Uuid::random()); + group->setNotes("I'm a note!"); + auto entry = new Entry(); + entry->setPassword(QString::fromUtf8("\xc3\xa4\xa3\xb6\xc3\xbc\xe9\x9b\xbb\xe7\xb4\x85")); + entry->setUuid(Uuid::random()); + entry->attributes()->set("test", "protectedTest", true); + QVERIFY(entry->attributes()->isProtected("test")); + entry->attachments()->set("myattach.txt", QByteArray("this is an attachment")); + entry->attachments()->set("aaa.txt", QByteArray("also an attachment")); + entry->setGroup(group); + auto groupNew = new Group(); + groupNew->setUuid(Uuid::random()); + groupNew->setName("TESTGROUP"); + groupNew->setNotes("I'm a sub group note!"); + groupNew->setParent(group); + + m_kdbxTargetBuffer.open(QBuffer::ReadWrite); + writeKdbx(&m_kdbxTargetBuffer, m_kdbxSourceDb.data(), hasError, errorString); + if (hasError) { + QFAIL(qPrintable(QString("Error while writing database: ").append(errorString))); } - return qstrdup(value.toLocal8Bit().constData()); -} + // call sub class init method + initTestCaseImpl(); } -QDateTime TestKeePass2XmlReader::genDT(int year, int month, int day, int hour, int min, int second) +void TestKeePass2Format::testXmlMetadata() { - QDate date(year, month, day); - QTime time(hour, min, second); - return QDateTime(date, time, Qt::UTC); + QCOMPARE(m_xmlDb->metadata()->generator(), QString("KeePass")); + QCOMPARE(m_xmlDb->metadata()->name(), QString("ANAME")); + QCOMPARE(m_xmlDb->metadata()->nameChanged(), genDT(2010, 8, 8, 17, 24, 53)); + QCOMPARE(m_xmlDb->metadata()->description(), QString("ADESC")); + QCOMPARE(m_xmlDb->metadata()->descriptionChanged(), genDT(2010, 8, 8, 17, 27, 12)); + QCOMPARE(m_xmlDb->metadata()->defaultUserName(), QString("DEFUSERNAME")); + QCOMPARE(m_xmlDb->metadata()->defaultUserNameChanged(), genDT(2010, 8, 8, 17, 27, 45)); + QCOMPARE(m_xmlDb->metadata()->maintenanceHistoryDays(), 127); + QCOMPARE(m_xmlDb->metadata()->color(), QColor(0xff, 0xef, 0x00)); + QCOMPARE(m_xmlDb->metadata()->masterKeyChanged(), genDT(2012, 4, 5, 17, 9, 34)); + QCOMPARE(m_xmlDb->metadata()->masterKeyChangeRec(), 101); + QCOMPARE(m_xmlDb->metadata()->masterKeyChangeForce(), -1); + QCOMPARE(m_xmlDb->metadata()->protectTitle(), false); + QCOMPARE(m_xmlDb->metadata()->protectUsername(), true); + QCOMPARE(m_xmlDb->metadata()->protectPassword(), false); + QCOMPARE(m_xmlDb->metadata()->protectUrl(), true); + QCOMPARE(m_xmlDb->metadata()->protectNotes(), false); + QCOMPARE(m_xmlDb->metadata()->recycleBinEnabled(), true); + QVERIFY(m_xmlDb->metadata()->recycleBin() != nullptr); + QCOMPARE(m_xmlDb->metadata()->recycleBin()->name(), QString("Recycle Bin")); + QCOMPARE(m_xmlDb->metadata()->recycleBinChanged(), genDT(2010, 8, 25, 16, 12, 57)); + QVERIFY(m_xmlDb->metadata()->entryTemplatesGroup() == nullptr); + QCOMPARE(m_xmlDb->metadata()->entryTemplatesGroupChanged(), genDT(2010, 8, 8, 17, 24, 19)); + QVERIFY(m_xmlDb->metadata()->lastSelectedGroup() != nullptr); + QCOMPARE(m_xmlDb->metadata()->lastSelectedGroup()->name(), QString("NewDatabase")); + QVERIFY(m_xmlDb->metadata()->lastTopVisibleGroup() == m_xmlDb->metadata()->lastSelectedGroup()); + QCOMPARE(m_xmlDb->metadata()->historyMaxItems(), -1); + QCOMPARE(m_xmlDb->metadata()->historyMaxSize(), 5242880); } -QByteArray TestKeePass2XmlReader::strToBytes(const QString& str) +void TestKeePass2Format::testXmlCustomIcons() { - QByteArray result; - - for (auto i : str) { - result.append(static_cast<char>(i.unicode() >> 8)); - result.append(static_cast<char>(i.unicode() & 0xFF)); - } - - return result; -} - -void TestKeePass2XmlReader::testMetadata() -{ - QCOMPARE(m_db->metadata()->generator(), QString("KeePass")); - QCOMPARE(m_db->metadata()->name(), QString("ANAME")); - QCOMPARE(m_db->metadata()->nameChanged(), genDT(2010, 8, 8, 17, 24, 53)); - QCOMPARE(m_db->metadata()->description(), QString("ADESC")); - QCOMPARE(m_db->metadata()->descriptionChanged(), genDT(2010, 8, 8, 17, 27, 12)); - QCOMPARE(m_db->metadata()->defaultUserName(), QString("DEFUSERNAME")); - QCOMPARE(m_db->metadata()->defaultUserNameChanged(), genDT(2010, 8, 8, 17, 27, 45)); - QCOMPARE(m_db->metadata()->maintenanceHistoryDays(), 127); - QCOMPARE(m_db->metadata()->color(), QColor(0xff, 0xef, 0x00)); - QCOMPARE(m_db->metadata()->masterKeyChanged(), genDT(2012, 4, 5, 17, 9, 34)); - QCOMPARE(m_db->metadata()->masterKeyChangeRec(), 101); - QCOMPARE(m_db->metadata()->masterKeyChangeForce(), -1); - QCOMPARE(m_db->metadata()->protectTitle(), false); - QCOMPARE(m_db->metadata()->protectUsername(), true); - QCOMPARE(m_db->metadata()->protectPassword(), false); - QCOMPARE(m_db->metadata()->protectUrl(), true); - QCOMPARE(m_db->metadata()->protectNotes(), false); - QCOMPARE(m_db->metadata()->recycleBinEnabled(), true); - QVERIFY(m_db->metadata()->recycleBin() != nullptr); - QCOMPARE(m_db->metadata()->recycleBin()->name(), QString("Recycle Bin")); - QCOMPARE(m_db->metadata()->recycleBinChanged(), genDT(2010, 8, 25, 16, 12, 57)); - QVERIFY(m_db->metadata()->entryTemplatesGroup() == nullptr); - QCOMPARE(m_db->metadata()->entryTemplatesGroupChanged(), genDT(2010, 8, 8, 17, 24, 19)); - QVERIFY(m_db->metadata()->lastSelectedGroup() != nullptr); - QCOMPARE(m_db->metadata()->lastSelectedGroup()->name(), QString("NewDatabase")); - QVERIFY(m_db->metadata()->lastTopVisibleGroup() == m_db->metadata()->lastSelectedGroup()); - QCOMPARE(m_db->metadata()->historyMaxItems(), -1); - QCOMPARE(m_db->metadata()->historyMaxSize(), 5242880); -} - -void TestKeePass2XmlReader::testCustomIcons() -{ - QCOMPARE(m_db->metadata()->customIcons().size(), 1); + QCOMPARE(m_xmlDb->metadata()->customIcons().size(), 1); Uuid uuid = Uuid::fromBase64("++vyI+daLk6omox4a6kQGA=="); - QVERIFY(m_db->metadata()->customIcons().contains(uuid)); - QImage icon = m_db->metadata()->customIcon(uuid); + QVERIFY(m_xmlDb->metadata()->customIcons().contains(uuid)); + QImage icon = m_xmlDb->metadata()->customIcon(uuid); QCOMPARE(icon.width(), 16); QCOMPARE(icon.height(), 16); @@ -123,18 +127,18 @@ void TestKeePass2XmlReader::testCustomIcons() } } -void TestKeePass2XmlReader::testCustomData() +void TestKeePass2Format::testXmlCustomData() { - QHash<QString, QString> customFields = m_db->metadata()->customFields(); + QHash<QString, QString> customFields = m_xmlDb->metadata()->customFields(); QCOMPARE(customFields.size(), 2); QCOMPARE(customFields.value("A Sample Test Key"), QString("valu")); QCOMPARE(customFields.value("custom key"), QString("blub")); } -void TestKeePass2XmlReader::testGroupRoot() +void TestKeePass2Format::testXmlGroupRoot() { - const Group* group = m_db->rootGroup(); + const Group* group = m_xmlDb->rootGroup(); QVERIFY(group); QCOMPARE(group->uuid().toBase64(), QString("lmU+9n0aeESKZvcEze+bRg==")); QCOMPARE(group->name(), QString("NewDatabase")); @@ -156,14 +160,14 @@ void TestKeePass2XmlReader::testGroupRoot() QCOMPARE(group->lastTopVisibleEntry()->uuid().toBase64(), QString("+wSUOv6qf0OzW8/ZHAs2sA==")); QCOMPARE(group->children().size(), 3); - QVERIFY(m_db->metadata()->recycleBin() == m_db->rootGroup()->children().at(2)); + QVERIFY(m_xmlDb->metadata()->recycleBin() == m_xmlDb->rootGroup()->children().at(2)); QCOMPARE(group->entries().size(), 2); } -void TestKeePass2XmlReader::testGroup1() +void TestKeePass2Format::testXmlGroup1() { - const Group* group = m_db->rootGroup()->children().at(0); + const Group* group = m_xmlDb->rootGroup()->children().at(0); QCOMPARE(group->uuid().toBase64(), QString("AaUYVdXsI02h4T1RiAlgtg==")); QCOMPARE(group->name(), QString("General")); @@ -177,9 +181,9 @@ void TestKeePass2XmlReader::testGroup1() QVERIFY(!group->lastTopVisibleEntry()); } -void TestKeePass2XmlReader::testGroup2() +void TestKeePass2Format::testXmlGroup2() { - const Group* group = m_db->rootGroup()->children().at(1); + const Group* group = m_xmlDb->rootGroup()->children().at(1); QCOMPARE(group->uuid().toBase64(), QString("1h4NtL5DK0yVyvaEnN//4A==")); QCOMPARE(group->name(), QString("Windows")); @@ -197,9 +201,9 @@ void TestKeePass2XmlReader::testGroup2() QCOMPARE(entry->title(), QString("Subsub Entry")); } -void TestKeePass2XmlReader::testEntry1() +void TestKeePass2Format::testXmlEntry1() { - const Entry* entry = m_db->rootGroup()->entries().at(0); + const Entry* entry = m_xmlDb->rootGroup()->entries().at(0); QCOMPARE(entry->uuid().toBase64(), QString("+wSUOv6qf0OzW8/ZHAs2sA==")); QCOMPARE(entry->historyItems().size(), 2); @@ -259,9 +263,9 @@ void TestKeePass2XmlReader::testEntry1() QCOMPARE(assoc1.sequence, QString("")); } -void TestKeePass2XmlReader::testEntry2() +void TestKeePass2Format::testXmlEntry2() { - const Entry* entry = m_db->rootGroup()->entries().at(1); + const Entry* entry = m_xmlDb->rootGroup()->entries().at(1); QCOMPARE(entry->uuid().toBase64(), QString("4jbADG37hkiLh2O0qUdaOQ==")); QCOMPARE(entry->iconNumber(), 0); @@ -307,9 +311,9 @@ void TestKeePass2XmlReader::testEntry2() QCOMPARE(assoc2.sequence, QString("{Title}{UserName} test")); } -void TestKeePass2XmlReader::testEntryHistory() +void TestKeePass2Format::testXmlEntryHistory() { - const Entry* entryMain = m_db->rootGroup()->entries().at(0); + const Entry* entryMain = m_xmlDb->rootGroup()->entries().at(0); QCOMPARE(entryMain->historyItems().size(), 2); { @@ -333,9 +337,9 @@ void TestKeePass2XmlReader::testEntryHistory() } } -void TestKeePass2XmlReader::testDeletedObjects() +void TestKeePass2Format::testXmlDeletedObjects() { - QList<DeletedObject> objList = m_db->deletedObjects(); + QList<DeletedObject> objList = m_xmlDb->deletedObjects(); DeletedObject delObj; delObj = objList.takeFirst(); @@ -349,7 +353,7 @@ void TestKeePass2XmlReader::testDeletedObjects() QVERIFY(objList.isEmpty()); } -void TestKeePass2XmlReader::testBroken() +void TestKeePass2Format::testXmlBroken() { QFETCH(QString, baseName); QFETCH(bool, strictMode); @@ -359,14 +363,14 @@ void TestKeePass2XmlReader::testBroken() QVERIFY(QFile::exists(xmlFile)); bool hasError; QString errorString; - QScopedPointer<Database> db(readDatabase(xmlFile, strictMode, hasError, errorString)); + QScopedPointer<Database> db(readXml(xmlFile, strictMode, hasError, errorString)); if (hasError) { qWarning("Reader error: %s", qPrintable(errorString)); } QCOMPARE(hasError, expectError); } -void TestKeePass2XmlReader::testBroken_data() +void TestKeePass2Format::testXmlBroken_data() { QTest::addColumn<QString>("baseName"); QTest::addColumn<bool>("strictMode"); @@ -391,21 +395,21 @@ void TestKeePass2XmlReader::testBroken_data() QTest::newRow("BrokenDifferentEntryHistoryUuid (not strict)") << "BrokenDifferentEntryHistoryUuid" << false << false; } -void TestKeePass2XmlReader::testEmptyUuids() +void TestKeePass2Format::testXmlEmptyUuids() { QString xmlFile = QString("%1/%2.xml").arg(KEEPASSX_TEST_DATA_DIR, "EmptyUuids"); QVERIFY(QFile::exists(xmlFile)); bool hasError; QString errorString; - QScopedPointer<Database> dbp(readDatabase(xmlFile, true, hasError, errorString)); + QScopedPointer<Database> dbp(readXml(xmlFile, true, hasError, errorString)); if (hasError) { qWarning("Reader error: %s", qPrintable(errorString)); } QVERIFY(!hasError); } -void TestKeePass2XmlReader::testInvalidXmlChars() +void TestKeePass2Format::testXmlInvalidXmlChars() { QScopedPointer<Database> dbWrite(new Database()); @@ -444,11 +448,11 @@ void TestKeePass2XmlReader::testInvalidXmlChars() buffer.open(QIODevice::ReadWrite); bool hasError; QString errorString; - writeDatabase(&buffer, dbWrite.data(), hasError, errorString); + writeXml(&buffer, dbWrite.data(), hasError, errorString); QVERIFY(!hasError); buffer.seek(0); - QScopedPointer<Database> dbRead(readDatabase(&buffer, true, hasError, errorString)); + QScopedPointer<Database> dbRead(readXml(&buffer, true, hasError, errorString)); if (hasError) { qWarning("Database read error: %s", qPrintable(errorString)); } @@ -470,13 +474,13 @@ void TestKeePass2XmlReader::testInvalidXmlChars() QCOMPARE(strToBytes(attrRead->value("SurrogateValid2")), strToBytes(strSurrogateValid2)); } -void TestKeePass2XmlReader::testRepairUuidHistoryItem() +void TestKeePass2Format::testXmlRepairUuidHistoryItem() { QString xmlFile = QString("%1/%2.xml").arg(KEEPASSX_TEST_DATA_DIR, "BrokenDifferentEntryHistoryUuid"); QVERIFY(QFile::exists(xmlFile)); bool hasError; QString errorString; - QScopedPointer<Database> db(readDatabase(xmlFile, false, hasError, errorString)); + QScopedPointer<Database> db(readXml(xmlFile, false, hasError, errorString)); if (hasError) { qWarning("Database read error: %s", qPrintable(errorString)); } @@ -494,3 +498,125 @@ void TestKeePass2XmlReader::testRepairUuidHistoryItem() QVERIFY(!historyItem->uuid().isNull()); QCOMPARE(historyItem->uuid(), entry->uuid()); } + +void TestKeePass2Format::testReadBackTargetDb() +{ + // read back previously constructed KDBX + CompositeKey key; + key.addKey(PasswordKey("test")); + + bool hasError; + QString errorString; + + m_kdbxTargetBuffer.seek(0); + readKdbx(&m_kdbxTargetBuffer, key, m_kdbxTargetDb, hasError, errorString); + if (hasError) { + QFAIL(qPrintable(QString("Error while reading database: ").append(errorString))); + } + QVERIFY(m_kdbxTargetDb.data()); +} + +void TestKeePass2Format::testKdbxBasic() +{ + QCOMPARE(m_kdbxTargetDb->metadata()->name(), m_kdbxSourceDb->metadata()->name()); + QVERIFY(m_kdbxTargetDb->rootGroup()); + QCOMPARE(m_kdbxTargetDb->rootGroup()->children()[0]->name(), m_kdbxSourceDb->rootGroup()->children()[0]->name()); + QCOMPARE(m_kdbxTargetDb->rootGroup()->notes(), m_kdbxSourceDb->rootGroup()->notes()); + QCOMPARE(m_kdbxTargetDb->rootGroup()->children()[0]->notes(), m_kdbxSourceDb->rootGroup()->children()[0]->notes()); +} + +void TestKeePass2Format::testKdbxProtectedAttributes() +{ + QCOMPARE(m_kdbxTargetDb->rootGroup()->entries().size(), 1); + Entry* entry = m_kdbxTargetDb->rootGroup()->entries().at(0); + QCOMPARE(entry->attributes()->value("test"), QString("protectedTest")); + QCOMPARE(entry->attributes()->isProtected("test"), true); +} + +void TestKeePass2Format::testKdbxAttachments() +{ + Entry* entry = m_kdbxTargetDb->rootGroup()->entries().at(0); + QCOMPARE(entry->attachments()->keys().size(), 2); + QCOMPARE(entry->attachments()->value("myattach.txt"), QByteArray("this is an attachment")); + QCOMPARE(entry->attachments()->value("aaa.txt"), QByteArray("also an attachment")); +} + +void TestKeePass2Format::testKdbxNonAsciiPasswords() +{ + QCOMPARE(m_kdbxTargetDb->rootGroup()->entries()[0]->password(), m_kdbxSourceDb->rootGroup()->entries()[0]->password()); +} + +void TestKeePass2Format::testKdbxDeviceFailure() +{ + CompositeKey key; + key.addKey(PasswordKey("test")); + QScopedPointer<Database> db(new Database()); + db->setKey(key); + // Disable compression so we write a predictable number of bytes. + db->setCompressionAlgo(Database::CompressionNone); + + auto entry = new Entry(); + entry->setParent(db->rootGroup()); + QByteArray attachment(4096, 'Z'); + entry->attachments()->set("test", attachment); + + FailDevice failDevice(512); + QVERIFY(failDevice.open(QIODevice::WriteOnly)); + bool hasError; + QString errorString; + writeKdbx(&failDevice, db.data(), hasError, errorString); + QVERIFY(hasError); + QCOMPARE(errorString, QString("FAILDEVICE")); +} + + + +// ==================================================================================================== +// Helper functions +// ==================================================================================================== + +namespace QTest { +template<> +char* toString(const Uuid& uuid) +{ + QByteArray ba = "Uuid("; + ba += uuid.toBase64().toLatin1().constData(); + ba += ")"; + return qstrdup(ba.constData()); +} + +template<> +char* toString(const Group::TriState& triState) +{ + QString value; + + if (triState == Group::Inherit) { + value = "null"; + } else if (triState == Group::Enable) { + value = "true"; + } else { + value = "false"; + } + + return qstrdup(value.toLocal8Bit().constData()); +} +} + +QDateTime TestKeePass2Format::genDT(int year, int month, int day, int hour, int min, int second) +{ + QDate date(year, month, day); + QTime time(hour, min, second); + return QDateTime(date, time, Qt::UTC); +} + +QByteArray TestKeePass2Format::strToBytes(const QString& str) +{ + QByteArray result; + + for (auto i : str) { + result.append(static_cast<char>(i.unicode() >> 8)); + result.append(static_cast<char>(i.unicode() & 0xFF)); + } + + return result; +} diff --git a/tests/TestKeePass2Format.h b/tests/TestKeePass2Format.h new file mode 100644 index 000000000..11420bab0 --- /dev/null +++ b/tests/TestKeePass2Format.h @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef KEEPASSXC_TESTKEEPASS2FORMAT_H +#define KEEPASSXC_TESTKEEPASS2FORMAT_H + +#include <QDateTime> +#include <QObject> +#include <QBuffer> +#include <QScopedPointer> + +#include "core/Database.h" + +/** + * Abstract base class for KeePass2 file format tests. + */ +class TestKeePass2Format : public QObject +{ +Q_OBJECT + +private slots: + void initTestCase(); + + /** + * XML Reader / writer tests. + */ + void testXmlMetadata(); + void testXmlCustomIcons(); + void testXmlCustomData(); + void testXmlGroupRoot(); + void testXmlGroup1(); + void testXmlGroup2(); + void testXmlEntry1(); + void testXmlEntry2(); + void testXmlEntryHistory(); + void testXmlDeletedObjects(); + void testXmlBroken(); + void testXmlBroken_data(); + void testXmlEmptyUuids(); + void testXmlInvalidXmlChars(); + void testXmlRepairUuidHistoryItem(); + + /** + * KDBX binary format tests. + */ + void testReadBackTargetDb(); + void testKdbxBasic(); + void testKdbxProtectedAttributes(); + void testKdbxAttachments(); + void testKdbxNonAsciiPasswords(); + void testKdbxDeviceFailure(); + +protected: + virtual void initTestCaseImpl() = 0; + + virtual Database* readXml(QBuffer* buf, bool strictMode, bool& hasError, QString& errorString) = 0; + virtual Database* readXml(const QString& path, bool strictMode, bool& hasError, QString& errorString) = 0; + virtual void writeXml(QBuffer* buf, Database* db, bool& hasError, QString& errorString) = 0; + + virtual void readKdbx(QIODevice* device, CompositeKey const& key, QScopedPointer<Database>& db, + bool& hasError, QString& errorString) = 0; + virtual void readKdbx(const QString& path, CompositeKey const& key, QScopedPointer<Database>& db, + bool& hasError, QString& errorString) = 0; + virtual void writeKdbx(QIODevice* device, Database* db, bool& hasError, QString& errorString) = 0; + + static QDateTime genDT(int year, int month, int day, int hour, int min, int second); + static QByteArray strToBytes(const QString& str); + + QScopedPointer<Database> m_xmlDb; + QScopedPointer<Database> m_kdbxSourceDb; + QScopedPointer<Database> m_kdbxTargetDb; + +private: + QBuffer m_kdbxTargetBuffer; +}; + +#endif // KEEPASSXC_TESTKEEPASS2FORMAT_H diff --git a/tests/TestKeePass2Reader.cpp b/tests/TestKeePass2Reader.cpp deleted file mode 100644 index 86dc6db2c..000000000 --- a/tests/TestKeePass2Reader.cpp +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 or (at your option) - * version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "TestKeePass2Reader.h" - -#include <QTest> - -#include "config-keepassx-tests.h" -#include "core/Database.h" -#include "core/Group.h" -#include "core/Metadata.h" -#include "crypto/Crypto.h" -#include "format/KeePass2Reader.h" -#include "keys/PasswordKey.h" - -QTEST_GUILESS_MAIN(TestKeePass2Reader) - -void TestKeePass2Reader::initTestCase() -{ - QVERIFY(Crypto::init()); -} - -void TestKeePass2Reader::testNonAscii() -{ - QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/NonAscii.kdbx"); - CompositeKey key; - key.addKey(PasswordKey(QString::fromUtf8("\xce\x94\xc3\xb6\xd8\xb6"))); - KeePass2Reader reader; - Database* db = reader.readDatabase(filename, key); - QVERIFY(db); - QVERIFY(!reader.hasError()); - QCOMPARE(db->metadata()->name(), QString("NonAsciiTest")); - QCOMPARE(db->compressionAlgo(), Database::CompressionNone); - - delete db; -} - -void TestKeePass2Reader::testCompressed() -{ - QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/Compressed.kdbx"); - CompositeKey key; - key.addKey(PasswordKey("")); - KeePass2Reader reader; - Database* db = reader.readDatabase(filename, key); - QVERIFY(db); - QVERIFY(!reader.hasError()); - QCOMPARE(db->metadata()->name(), QString("Compressed")); - QCOMPARE(db->compressionAlgo(), Database::CompressionGZip); - - delete db; -} - -void TestKeePass2Reader::testProtectedStrings() -{ - QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/ProtectedStrings.kdbx"); - CompositeKey key; - key.addKey(PasswordKey("masterpw")); - KeePass2Reader reader; - Database* db = reader.readDatabase(filename, key); - QVERIFY(db); - QVERIFY(!reader.hasError()); - QCOMPARE(db->metadata()->name(), QString("Protected Strings Test")); - - Entry* entry = db->rootGroup()->entries().at(0); - - QCOMPARE(entry->title(), QString("Sample Entry")); - QCOMPARE(entry->username(), QString("Protected User Name")); - QCOMPARE(entry->password(), QString("ProtectedPassword")); - QCOMPARE(entry->attributes()->value("TestProtected"), QString("ABC")); - QCOMPARE(entry->attributes()->value("TestUnprotected"), QString("DEF")); - - QVERIFY(db->metadata()->protectPassword()); - QVERIFY(entry->attributes()->isProtected("TestProtected")); - QVERIFY(!entry->attributes()->isProtected("TestUnprotected")); - - delete db; -} - -void TestKeePass2Reader::testBrokenHeaderHash() -{ - // The protected stream key has been modified in the header. - // Make sure the database won't open. - - QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/BrokenHeaderHash.kdbx"); - CompositeKey key; - key.addKey(PasswordKey("")); - KeePass2Reader reader; - Database* db = reader.readDatabase(filename, key); - QVERIFY(!db); - QVERIFY(reader.hasError()); - - delete db; -} - -void TestKeePass2Reader::testFormat200() -{ - QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/Format200.kdbx"); - CompositeKey key; - key.addKey(PasswordKey("a")); - KeePass2Reader reader; - Database* db = reader.readDatabase(filename, key); - QVERIFY(db); - QVERIFY(!reader.hasError()); - - QCOMPARE(db->rootGroup()->name(), QString("Format200")); - QVERIFY(!db->metadata()->protectTitle()); - QVERIFY(db->metadata()->protectUsername()); - QVERIFY(!db->metadata()->protectPassword()); - QVERIFY(db->metadata()->protectUrl()); - QVERIFY(!db->metadata()->protectNotes()); - - QCOMPARE(db->rootGroup()->entries().size(), 1); - Entry* entry = db->rootGroup()->entries().at(0); - - QCOMPARE(entry->title(), QString("Sample Entry")); - QCOMPARE(entry->username(), QString("User Name")); - QCOMPARE(entry->attachments()->keys().size(), 2); - QCOMPARE(entry->attachments()->value("myattach.txt"), QByteArray("abcdefghijk")); - QCOMPARE(entry->attachments()->value("test.txt"), QByteArray("this is a test")); - - QCOMPARE(entry->historyItems().size(), 2); - QCOMPARE(entry->historyItems().at(0)->attachments()->keys().size(), 0); - QCOMPARE(entry->historyItems().at(1)->attachments()->keys().size(), 1); - QCOMPARE(entry->historyItems().at(1)->attachments()->value("myattach.txt"), QByteArray("abcdefghijk")); - - delete db; -} - -void TestKeePass2Reader::testFormat300() -{ - QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/Format300.kdbx"); - CompositeKey key; - key.addKey(PasswordKey("a")); - KeePass2Reader reader; - Database* db = reader.readDatabase(filename, key); - QVERIFY(db); - QVERIFY(!reader.hasError()); - - QCOMPARE(db->rootGroup()->name(), QString("Format300")); - QCOMPARE(db->metadata()->name(), QString("Test Database Format 0x00030000")); - - delete db; -} - -void TestKeePass2Reader::testFormat400() -{ - QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/Format400.kdbx"); - CompositeKey key; - key.addKey(PasswordKey("t")); - KeePass2Reader reader; - Database* db = reader.readDatabase(filename, key); - QVERIFY(db); - QVERIFY(!reader.hasError()); - - QCOMPARE(db->rootGroup()->name(), QString("Format400")); - QCOMPARE(db->metadata()->name(), QString("Format400")); - QCOMPARE(db->rootGroup()->entries().size(), 1); - Entry* entry = db->rootGroup()->entries().at(0); - - QCOMPARE(entry->title(), QString("Format400")); - QCOMPARE(entry->username(), QString("Format400")); - QCOMPARE(entry->attributes()->keys().size(), 6); - QCOMPARE(entry->attributes()->value("Format400"), QString("Format400")); - QCOMPARE(entry->attachments()->keys().size(), 1); - QCOMPARE(entry->attachments()->value("Format400"), QByteArray("Format400\n")); -} diff --git a/tests/TestKeePass2Writer.cpp b/tests/TestKeePass2Writer.cpp deleted file mode 100644 index 30d0cbf5a..000000000 --- a/tests/TestKeePass2Writer.cpp +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 or (at your option) - * version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "TestKeePass2Writer.h" - -#include <QBuffer> -#include <QFile> -#include <QTest> - -#include "config-keepassx-tests.h" -#include "FailDevice.h" -#include "core/Database.h" -#include "core/Group.h" -#include "core/Metadata.h" -#include "crypto/Crypto.h" -#include "format/KeePass2Reader.h" -#include "format/KeePass2Repair.h" -#include "format/KeePass2Writer.h" -#include "keys/PasswordKey.h" - -QTEST_GUILESS_MAIN(TestKeePass2Writer) - -void TestKeePass2Writer::initTestCase() -{ - QVERIFY(Crypto::init()); - - CompositeKey key; - key.addKey(PasswordKey("test")); - - m_dbOrg = new Database(); - m_dbOrg->setKey(key); - m_dbOrg->metadata()->setName("TESTDB"); - Group* group = m_dbOrg->rootGroup(); - group->setUuid(Uuid::random()); - group->setNotes("I'm a note!"); - Entry* entry = new Entry(); - entry->setPassword(QString::fromUtf8("\xc3\xa4\xa3\xb6\xc3\xbc\xe9\x9b\xbb\xe7\xb4\x85")); - entry->setUuid(Uuid::random()); - entry->attributes()->set("test", "protectedTest", true); - QVERIFY(entry->attributes()->isProtected("test")); - entry->attachments()->set("myattach.txt", QByteArray("this is an attachment")); - entry->attachments()->set("aaa.txt", QByteArray("also an attachment")); - entry->setGroup(group); - Group* groupNew = new Group(); - groupNew->setUuid(Uuid::random()); - groupNew->setName("TESTGROUP"); - groupNew->setNotes("I'm a sub group note!"); - groupNew->setParent(group); - - QBuffer buffer; - buffer.open(QBuffer::ReadWrite); - - KeePass2Writer writer; - bool writeSuccess = writer.writeDatabase(&buffer, m_dbOrg); - QVERIFY(writeSuccess); - QVERIFY(!writer.hasError()); - buffer.seek(0); - KeePass2Reader reader; - m_dbTest = reader.readDatabase(&buffer, key); - if (reader.hasError()) { - QFAIL(reader.errorString().toUtf8().constData()); - } - QVERIFY(m_dbTest); -} - -void TestKeePass2Writer::testBasic() -{ - QCOMPARE(m_dbTest->metadata()->name(), m_dbOrg->metadata()->name()); - QVERIFY(m_dbTest->rootGroup()); - QCOMPARE(m_dbTest->rootGroup()->children()[0]->name(), m_dbOrg->rootGroup()->children()[0]->name()); - QCOMPARE(m_dbTest->rootGroup()->notes(), m_dbOrg->rootGroup()->notes()); - QCOMPARE(m_dbTest->rootGroup()->children()[0]->notes(), m_dbOrg->rootGroup()->children()[0]->notes()); -} - -void TestKeePass2Writer::testProtectedAttributes() -{ - QCOMPARE(m_dbTest->rootGroup()->entries().size(), 1); - Entry* entry = m_dbTest->rootGroup()->entries().at(0); - QCOMPARE(entry->attributes()->value("test"), QString("protectedTest")); - QCOMPARE(entry->attributes()->isProtected("test"), true); -} - -void TestKeePass2Writer::testAttachments() -{ - Entry* entry = m_dbTest->rootGroup()->entries().at(0); - QCOMPARE(entry->attachments()->keys().size(), 2); - QCOMPARE(entry->attachments()->value("myattach.txt"), QByteArray("this is an attachment")); - QCOMPARE(entry->attachments()->value("aaa.txt"), QByteArray("also an attachment")); -} - -void TestKeePass2Writer::testNonAsciiPasswords() -{ - QCOMPARE(m_dbTest->rootGroup()->entries()[0]->password(), m_dbOrg->rootGroup()->entries()[0]->password()); -} - -void TestKeePass2Writer::testDeviceFailure() -{ - CompositeKey key; - key.addKey(PasswordKey("test")); - Database* db = new Database(); - db->setKey(key); - // Disable compression so we write a predictable number of bytes. - db->setCompressionAlgo(Database::CompressionNone); - - Entry* entry = new Entry(); - entry->setParent(db->rootGroup()); - QByteArray attachment(4096, 'Z'); - entry->attachments()->set("test", attachment); - - FailDevice failDevice(512); - QVERIFY(failDevice.open(QIODevice::WriteOnly)); - KeePass2Writer writer; - writer.writeDatabase(&failDevice, db); - QVERIFY(writer.hasError()); - QCOMPARE(writer.errorString(), QString("FAILDEVICE")); - - delete db; -} - -void TestKeePass2Writer::testRepair() -{ - QString brokenDbFilename = QString(KEEPASSX_TEST_DATA_DIR).append("/bug392.kdbx"); - // master password = test - // entry username: testuser\x10\x20AC - // entry password: testpw - CompositeKey key; - key.addKey(PasswordKey("test")); - - // test that we can't open the broken database - KeePass2Reader reader; - Database* dbBroken = reader.readDatabase(brokenDbFilename, key); - QVERIFY(!dbBroken); - QVERIFY(reader.hasError()); - - // test if we can repair the database - KeePass2Repair repair; - QFile file(brokenDbFilename); - file.open(QIODevice::ReadOnly); - auto result = repair.repairDatabase(&file, key); - QCOMPARE(result.first, KeePass2Repair::RepairSuccess); - Database* dbRepaired = result.second; - QVERIFY(dbRepaired); - - QCOMPARE(dbRepaired->rootGroup()->entries().size(), 1); - QCOMPARE(dbRepaired->rootGroup()->entries().at(0)->username(), QString("testuser").append(QChar(0x20AC))); - QCOMPARE(dbRepaired->rootGroup()->entries().at(0)->password(), QString("testpw")); - delete dbRepaired; -} - -void TestKeePass2Writer::cleanupTestCase() -{ - delete m_dbOrg; - delete m_dbTest; -} diff --git a/tests/TestKeePass2Writer.h b/tests/TestKeePass2Writer.h deleted file mode 100644 index 36a51dce6..000000000 --- a/tests/TestKeePass2Writer.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 or (at your option) - * version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef KEEPASSX_TESTKEEPASS2WRITER_H -#define KEEPASSX_TESTKEEPASS2WRITER_H - -#include <QObject> - -class Database; - -class TestKeePass2Writer : public QObject -{ - Q_OBJECT - -private slots: - void initTestCase(); - void testBasic(); - void testProtectedAttributes(); - void testAttachments(); - void testNonAsciiPasswords(); - void testDeviceFailure(); - void testRepair(); - void cleanupTestCase(); - -private: - Database* m_dbOrg; - Database* m_dbTest; -}; - -#endif // KEEPASSX_TESTKEEPASS2WRITER_H diff --git a/tests/TestKeePass2XmlReader.h b/tests/TestKeePass2XmlReader.h deleted file mode 100644 index ba69eb80f..000000000 --- a/tests/TestKeePass2XmlReader.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 or (at your option) - * version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef KEEPASSX_TESTKEEPASS2XMLREADER_H -#define KEEPASSX_TESTKEEPASS2XMLREADER_H - -#include <QDateTime> -#include <QObject> -#include <QBuffer> -#include <QScopedPointer> - -#include "core/Database.h" - - -class TestKeePass2XmlReader : public QObject -{ - Q_OBJECT - -protected slots: - virtual void initTestCase() = 0; - -private slots: - void testMetadata(); - void testCustomIcons(); - void testCustomData(); - void testGroupRoot(); - void testGroup1(); - void testGroup2(); - void testEntry1(); - void testEntry2(); - void testEntryHistory(); - void testDeletedObjects(); - void testBroken(); - void testBroken_data(); - void testEmptyUuids(); - void testInvalidXmlChars(); - void testRepairUuidHistoryItem(); - -protected: - virtual Database* readDatabase(QBuffer* buf, bool strictMode, bool& hasError, QString& errorString) = 0; - virtual Database* readDatabase(QString path, bool strictMode, bool& hasError, QString& errorString) = 0; - virtual void writeDatabase(QBuffer* buf, Database* db, bool& hasError, QString& errorString) = 0; - static QDateTime genDT(int year, int month, int day, int hour, int min, int second); - static QByteArray strToBytes(const QString& str); - - QScopedPointer<Database> m_db; -}; - - -#endif // KEEPASSX_TESTKEEPASS2XMLREADER_H From 679a7b6ec29729312844eb362c89e5d90ba1727c Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Thu, 18 Jan 2018 01:19:47 +0100 Subject: [PATCH 267/402] Add test for KDBX 2 -> 3 upgrade --- tests/TestKdbx2.cpp | 63 ++++++++++++++++++++++++++++++++++++++------- tests/TestKdbx2.h | 6 +++++ 2 files changed, 59 insertions(+), 10 deletions(-) diff --git a/tests/TestKdbx2.cpp b/tests/TestKdbx2.cpp index 8424b56e4..f10f10b94 100644 --- a/tests/TestKdbx2.cpp +++ b/tests/TestKdbx2.cpp @@ -20,12 +20,14 @@ #include "keys/CompositeKey.h" #include "keys/PasswordKey.h" #include "format/KeePass2Reader.h" +#include "format/KeePass2Writer.h" #include "core/Entry.h" #include "core/Group.h" #include "core/Metadata.h" #include "config-keepassx-tests.h" #include <QTest> +#include <QBuffer> QTEST_GUILESS_MAIN(TestKdbx2) @@ -34,17 +36,12 @@ void TestKdbx2::initTestCase() QVERIFY(Crypto::init()); } -void TestKdbx2::testFormat200() +/** + * Helper method for verifying contents of the sample KDBX 2 file. + */ +void TestKdbx2::verifyKdbx2Db(Database* db) { - QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/Format200.kdbx"); - CompositeKey key; - key.addKey(PasswordKey("a")); - KeePass2Reader reader; - QScopedPointer<Database> db(reader.readDatabase(filename, key)); - QCOMPARE(reader.version(), KeePass2::FILE_VERSION_2); - QVERIFY(db.data()); - QVERIFY(!reader.hasError()); - + QVERIFY(db); QCOMPARE(db->rootGroup()->name(), QString("Format200")); QVERIFY(!db->metadata()->protectTitle()); QVERIFY(db->metadata()->protectUsername()); @@ -66,3 +63,49 @@ void TestKdbx2::testFormat200() QCOMPARE(entry->historyItems().at(1)->attachments()->keys().size(), 1); QCOMPARE(entry->historyItems().at(1)->attachments()->value("myattach.txt"), QByteArray("abcdefghijk")); } + +void TestKdbx2::testFormat200() +{ + QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/Format200.kdbx"); + CompositeKey key; + key.addKey(PasswordKey("a")); + KeePass2Reader reader; + QScopedPointer<Database> db(reader.readDatabase(filename, key)); + QCOMPARE(reader.version(), KeePass2::FILE_VERSION_2 & KeePass2::FILE_VERSION_CRITICAL_MASK); + + QVERIFY(!reader.hasError()); + verifyKdbx2Db(db.data()); +} + +void TestKdbx2::testFormat200Upgrade() +{ + QString filename = QString(KEEPASSX_TEST_DATA_DIR).append("/Format200.kdbx"); + CompositeKey key; + key.addKey(PasswordKey("a")); + KeePass2Reader reader; + QScopedPointer<Database> db(reader.readDatabase(filename, key)); + QCOMPARE(reader.version(), KeePass2::FILE_VERSION_2 & KeePass2::FILE_VERSION_CRITICAL_MASK); + QCOMPARE(db->kdf()->uuid(), KeePass2::KDF_AES_KDBX3); + + QBuffer buffer; + buffer.open(QBuffer::ReadWrite); + + // write KDBX 3 to upgrade it + KeePass2Writer writer; + writer.writeDatabase(&buffer, db.data()); + if (writer.hasError()) { + QFAIL(qPrintable(QString("Error while writing database: %1").arg(writer.errorString()))); + } + + // read buffer back + buffer.seek(0); + QScopedPointer<Database> targetDb(reader.readDatabase(&buffer, key)); + if (reader.hasError()) { + QFAIL(qPrintable(QString("Error while reading database: %1").arg(reader.errorString()))); + } + + // database should now be upgraded to KDBX 3 without data loss + verifyKdbx2Db(targetDb.data()); + QCOMPARE(reader.version(), KeePass2::FILE_VERSION_3_1 & KeePass2::FILE_VERSION_CRITICAL_MASK); + QCOMPARE(targetDb->kdf()->uuid(), KeePass2::KDF_AES_KDBX3); +} diff --git a/tests/TestKdbx2.h b/tests/TestKdbx2.h index f72672021..9b5f5c5ff 100644 --- a/tests/TestKdbx2.h +++ b/tests/TestKdbx2.h @@ -20,6 +20,8 @@ #include <QObject> +class Database; + class TestKdbx2 : public QObject { Q_OBJECT @@ -27,6 +29,10 @@ Q_OBJECT private slots: void initTestCase(); void testFormat200(); + void testFormat200Upgrade(); + +private: + void verifyKdbx2Db(Database* db); }; #endif // KEEPASSXC_TEST_KDBX2_H From e20cecf7aa01658b84a3ee74c3a2860a09580b93 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Thu, 18 Jan 2018 01:21:02 +0100 Subject: [PATCH 268/402] Remove obsolete ToDbExporter tests --- tests/TestExporter.cpp | 78 ------------------------------------------ tests/TestExporter.h | 33 ------------------ 2 files changed, 111 deletions(-) delete mode 100644 tests/TestExporter.cpp delete mode 100644 tests/TestExporter.h diff --git a/tests/TestExporter.cpp b/tests/TestExporter.cpp deleted file mode 100644 index 656b76c58..000000000 --- a/tests/TestExporter.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (C) 2014 Felix Geyer <debfx@fobos.de> - * Copyright (C) 2014 Florian Geyer <blueice@fobos.de> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 or (at your option) - * version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "TestExporter.h" - -#include <QTest> - -#include "core/ToDbExporter.h" -#include "core/Group.h" -#include "core/Metadata.h" -#include "crypto/Crypto.h" - -QTEST_GUILESS_MAIN(TestExporter) - -void TestExporter::initTestCase() -{ - QVERIFY(Crypto::init()); -} - -void TestExporter::testToDbExporter() -{ - QImage iconImage(1, 1, QImage::Format_RGB32); - iconImage.setPixel(0, 0, qRgb(1, 2, 3)); - Uuid iconUuid = Uuid::random(); - - QImage iconUnusedImage(1, 1, QImage::Format_RGB32); - iconUnusedImage.setPixel(0, 0, qRgb(1, 2, 3)); - Uuid iconUnusedUuid = Uuid::random(); - - Database* dbOrg = new Database(); - Group* groupOrg = new Group(); - groupOrg->setParent(dbOrg->rootGroup()); - groupOrg->setName("GTEST"); - Entry* entryOrg = new Entry(); - entryOrg->setGroup(groupOrg); - entryOrg->setTitle("ETEST"); - dbOrg->metadata()->addCustomIcon(iconUuid, iconImage); - dbOrg->metadata()->addCustomIcon(iconUnusedUuid, iconUnusedImage); - entryOrg->setIcon(iconUuid); - entryOrg->beginUpdate(); - entryOrg->setIcon(Entry::DefaultIconNumber); - entryOrg->endUpdate(); - - Database* dbExp = ToDbExporter().exportGroup(groupOrg); - - QCOMPARE(dbExp->rootGroup()->children().size(), 1); - Group* groupExp = dbExp->rootGroup()->children().at(0); - QVERIFY(groupExp != groupOrg); - QCOMPARE(groupExp->name(), groupOrg->name()); - QCOMPARE(groupExp->entries().size(), 1); - - Entry* entryExp = groupExp->entries().at(0); - QCOMPARE(entryExp->title(), entryOrg->title()); - QCOMPARE(dbExp->metadata()->customIcons().size(), 1); - QVERIFY(dbExp->metadata()->containsCustomIcon(iconUuid)); - QCOMPARE(entryExp->iconNumber(), entryOrg->iconNumber()); - - QCOMPARE(entryExp->historyItems().size(), 1); - QCOMPARE(entryExp->historyItems().at(0)->iconUuid(), iconUuid); - - delete dbOrg; - delete dbExp; -} diff --git a/tests/TestExporter.h b/tests/TestExporter.h deleted file mode 100644 index 8c9945252..000000000 --- a/tests/TestExporter.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2014 Felix Geyer <debfx@fobos.de> - * Copyright (C) 2014 Florian Geyer <blueice@fobos.de> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 or (at your option) - * version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef KEEPASSX_TESTEXPORTER_H -#define KEEPASSX_TESTEXPORTER_H - -#include <QObject> - -class TestExporter : public QObject -{ - Q_OBJECT - -private slots: - void initTestCase(); - void testToDbExporter(); -}; - -#endif // KEEPASSX_TESTEXPORTER_H From f2b3181735701dbad1db749d0e6f7c4b34d73f01 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Tue, 16 Jan 2018 21:45:31 +0100 Subject: [PATCH 269/402] Rework browser integration settings --- src/browser/BrowserOptionDialog.cpp | 22 +++ src/browser/BrowserOptionDialog.h | 3 + src/browser/BrowserOptionDialog.ui | 261 ++++++++++++++++------------ src/browser/BrowserSettings.h | 2 +- src/gui/MainWindow.cpp | 18 +- 5 files changed, 189 insertions(+), 117 deletions(-) diff --git a/src/browser/BrowserOptionDialog.cpp b/src/browser/BrowserOptionDialog.cpp index 9a876ac45..2040bef66 100755 --- a/src/browser/BrowserOptionDialog.cpp +++ b/src/browser/BrowserOptionDialog.cpp @@ -23,6 +23,7 @@ #include "core/FilePath.h" #include <QMessageBox> +#include <QtWidgets/QFileDialog> BrowserOptionDialog::BrowserOptionDialog(QWidget* parent) : QWidget(parent), @@ -40,7 +41,10 @@ BrowserOptionDialog::BrowserOptionDialog(QWidget* parent) : connect(m_ui->enableBrowserSupport, SIGNAL(toggled(bool)), m_ui->tabWidget, SLOT(setEnabled(bool))); m_ui->customProxyLocation->setEnabled(m_ui->useCustomProxy->isChecked()); + m_ui->customProxyLocationBrowseButton->setEnabled(m_ui->useCustomProxy->isChecked()); connect(m_ui->useCustomProxy, SIGNAL(toggled(bool)), m_ui->customProxyLocation, SLOT(setEnabled(bool))); + connect(m_ui->useCustomProxy, SIGNAL(toggled(bool)), m_ui->customProxyLocationBrowseButton, SLOT(setEnabled(bool))); + connect(m_ui->customProxyLocationBrowseButton, SIGNAL(clicked()), this, SLOT(showProxyLocationFileDialog())); } BrowserOptionDialog::~BrowserOptionDialog() @@ -57,6 +61,11 @@ void BrowserOptionDialog::loadSettings() m_ui->unlockDatabase->setChecked(settings.unlockDatabase()); m_ui->matchUrlScheme->setChecked(settings.matchUrlScheme()); + // hide unimplemented options + // TODO: fix this + m_ui->showNotification->hide(); + m_ui->bestMatchOnly->hide(); + if (settings.sortByUsername()) { m_ui->sortByUsername->setChecked(true); } else { @@ -102,3 +111,16 @@ void BrowserOptionDialog::saveSettings() settings.setFirefoxSupport(m_ui->firefoxSupport->isChecked()); settings.setVivaldiSupport(m_ui->vivaldiSupport->isChecked()); } + +void BrowserOptionDialog::showProxyLocationFileDialog() +{ +#ifdef Q_OS_WIN + QString fileTypeFilter(tr("Executable Files (*.exe);;All Files (*.*)")); +#else + QString fileTypeFilter(tr("Executable Files (*.*)")); +#endif + auto proxyLocation = QFileDialog::getOpenFileName(this, tr("Select custom proxy location"), + QFileInfo(QCoreApplication::applicationDirPath()).filePath(), + fileTypeFilter); + m_ui->customProxyLocation->setText(proxyLocation); +} diff --git a/src/browser/BrowserOptionDialog.h b/src/browser/BrowserOptionDialog.h index 798d215d6..b562f6c18 100755 --- a/src/browser/BrowserOptionDialog.h +++ b/src/browser/BrowserOptionDialog.h @@ -43,6 +43,9 @@ signals: void removeSharedEncryptionKeys(); void removeStoredPermissions(); +private slots: + void showProxyLocationFileDialog(); + private: QScopedPointer<Ui::BrowserOptionDialog> m_ui; }; diff --git a/src/browser/BrowserOptionDialog.ui b/src/browser/BrowserOptionDialog.ui index 81eaa229d..e5352b0fa 100755 --- a/src/browser/BrowserOptionDialog.ui +++ b/src/browser/BrowserOptionDialog.ui @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>577</width> - <height>404</height> + <width>456</width> + <height>385</height> </rect> </property> <property name="windowTitle"> @@ -32,7 +32,7 @@ <string>This is required for accessing your databases with keepassxc-browser</string> </property> <property name="text"> - <string>Enable KeepassXC browser extension</string> + <string>Enable KeepassXC browser integration</string> </property> </widget> </item> @@ -47,22 +47,93 @@ </attribute> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> - <widget class="QCheckBox" name="showNotification"> - <property name="text"> - <string>Sh&ow a notification when credentials are requested</string> - </property> - <property name="checked"> - <bool>true</bool> + <widget class="QGroupBox" name="browsersGroupBox"> + <property name="title"> + <string>Enable integration for these browsers:</string> </property> + <layout class="QGridLayout" name="gridLayout"> + <property name="horizontalSpacing"> + <number>40</number> + </property> + <item row="0" column="0"> + <widget class="QCheckBox" name="chromeSupport"> + <property name="text"> + <string>&Google Chrome</string> + </property> + <property name="checked"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QCheckBox" name="firefoxSupport"> + <property name="text"> + <string>&Firefox</string> + </property> + <property name="checked"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="0" column="2"> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>179</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item row="1" column="0"> + <widget class="QCheckBox" name="chromiumSupport"> + <property name="text"> + <string>&Chromium</string> + </property> + <property name="checked"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QCheckBox" name="vivaldiSupport"> + <property name="text"> + <string>&Vivaldi</string> + </property> + <property name="checked"> + <bool>false</bool> + </property> + </widget> + </item> + </layout> </widget> </item> <item> - <widget class="QCheckBox" name="bestMatchOnly"> - <property name="toolTip"> - <string>Only returns the best matches for a specific URL instead of all entries for the whole domain.</string> + <spacer name="verticalSpacer_3"> + <property name="orientation"> + <enum>Qt::Vertical</enum> </property> + <property name="sizeType"> + <enum>QSizePolicy::Fixed</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>4</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QCheckBox" name="showNotification"> <property name="text"> - <string>&Return only best-matching entries</string> + <string>Show a &notification when credentials are requested</string> + </property> + <property name="checked"> + <bool>true</bool> </property> </widget> </item> @@ -82,117 +153,82 @@ <string>Only entries with the same scheme (http://, https://, ...) are returned.</string> </property> <property name="text"> - <string>&Match URL schemes</string> + <string>&Match URL scheme (e.g., https://...)</string> </property> </widget> </item> <item> - <widget class="QRadioButton" name="sortByUsername"> + <widget class="QCheckBox" name="bestMatchOnly"> + <property name="toolTip"> + <string>Only returns the best matches for a specific URL instead of all entries for the whole domain.</string> + </property> <property name="text"> - <string>Sort matching entries by &username</string> + <string>&Return only best-matching credentials</string> </property> </widget> </item> <item> <widget class="QRadioButton" name="sortByTitle"> <property name="text"> - <string>Sort &matching entries by title</string> + <string>Sort &matching credentials by title</string> </property> </widget> </item> <item> - <widget class="QPushButton" name="removeSharedEncryptionKeys"> + <widget class="QRadioButton" name="sortByUsername"> <property name="text"> - <string>R&emove all shared encryption keys from active database</string> + <string>Sort matching credentials by &username</string> </property> </widget> </item> <item> - <widget class="QPushButton" name="removeStoredPermissions"> - <property name="text"> - <string>Re&move all stored permissions from entries in active database</string> - </property> - </widget> - </item> - <item> - <spacer name="verticalSpacer_2"> + <spacer name="verticalSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> + <property name="sizeType"> + <enum>QSizePolicy::Fixed</enum> + </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> - <height>40</height> + <height>10</height> </size> </property> </spacer> </item> - </layout> - </widget> - <widget class="QWidget" name="tab_3"> - <attribute name="title"> - <string>Supported browsers</string> - </attribute> - <layout class="QVBoxLayout" name="verticalLayout_4"> - <item> - <widget class="QLabel" name="browserLabel1"> - <property name="text"> - <string>Native messaging requires certain .json files to be installed. Already installed browsers are automatically detected.</string> - </property> - <property name="wordWrap"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="browserLabel2"> - <property name="text"> - <string>Enable KeePassXC native messaging extension for these browsers:</string> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="chromeSupport"> - <property name="text"> - <string>Chrome</string> - </property> - <property name="checked"> - <bool>false</bool> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="chromiumSupport"> - <property name="text"> - <string>Chromium</string> - </property> - <property name="checked"> - <bool>false</bool> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="firefoxSupport"> - <property name="text"> - <string>Firefox</string> - </property> - <property name="checked"> - <bool>false</bool> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="vivaldiSupport"> - <property name="text"> - <string>Vivaldi</string> - </property> - <property name="checked"> - <bool>false</bool> - </property> - </widget> - </item> <item> - <spacer name="verticalSpacer_3"> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item> + <widget class="QPushButton" name="removeSharedEncryptionKeys"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>&Disconnect all browsers</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="removeStoredPermissions"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Forget all remembered &permissions</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <spacer name="verticalSpacer_2"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> @@ -224,14 +260,14 @@ <item> <widget class="QCheckBox" name="alwaysAllowAccess"> <property name="text"> - <string>Always allow &access to entries</string> + <string>Never &ask before accessing credentials</string> </property> </widget> </item> <item> <widget class="QCheckBox" name="alwaysAllowUpdate"> <property name="text"> - <string>Always allow &updating entries</string> + <string>Never ask before &updating credentials</string> </property> </widget> </item> @@ -241,7 +277,7 @@ <string>Only the selected database has to be connected with a client.</string> </property> <property name="text"> - <string>Searc&h in all opened databases for matching entries</string> + <string>Searc&h in all opened databases for matching credentials</string> </property> </widget> </item> @@ -261,7 +297,7 @@ <string>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</string> </property> <property name="text"> - <string>&Update KeePassXC binary path automatically to native messaging scripts on startup</string> + <string>Update &native messaging manifest files at startup</string> </property> </widget> </item> @@ -271,7 +307,7 @@ <string>Support a proxy application between KeePassXC and browser extension.</string> </property> <property name="text"> - <string>&Enable support for proxy application between KeePassXC and browser extension</string> + <string>Use a &proxy application between KeePassXC and browser extension</string> </property> </widget> </item> @@ -281,19 +317,30 @@ <string>Use a custom proxy location if you installed a proxy manually.</string> </property> <property name="text"> - <string>&Use a custom proxy location</string> + <string>Use a &custom proxy location</string> </property> </widget> </item> <item> - <widget class="QLineEdit" name="customProxyLocation"> - <property name="maxLength"> - <number>999</number> - </property> - <property name="alignment"> - <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> - </property> - </widget> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QLineEdit" name="customProxyLocation"> + <property name="maxLength"> + <number>999</number> + </property> + <property name="alignment"> + <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="customProxyLocationBrowseButton"> + <property name="text"> + <string>Browse...</string> + </property> + </widget> + </item> + </layout> </item> <item> <spacer name="verticalSpacer_4"> diff --git a/src/browser/BrowserSettings.h b/src/browser/BrowserSettings.h index 8d08eef71..eb59fa5ac 100755 --- a/src/browser/BrowserSettings.h +++ b/src/browser/BrowserSettings.h @@ -34,7 +34,7 @@ public: static void setShowNotification(bool showNotification); static bool bestMatchOnly(); //TODO!! static void setBestMatchOnly(bool bestMatchOnly); - static bool unlockDatabase(); //TODO!! + static bool unlockDatabase(); static void setUnlockDatabase(bool unlockDatabase); static bool matchUrlScheme(); static void setMatchUrlScheme(bool matchUrlScheme); diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 9c0fe1dfb..a3e713426 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -77,7 +77,7 @@ public: QString name() override { - return QObject::tr("Browser Integration"); + return QObject::tr("Browser Integration (old)"); } QIcon icon() override @@ -125,7 +125,7 @@ class BrowserPlugin: public ISettingsPage QString name() override { - return QObject::tr("Browser extension with native messaging"); + return QObject::tr("Browser Integration"); } QIcon icon() override @@ -182,16 +182,16 @@ MainWindow::MainWindow() m_countDefaultAttributes = m_ui->menuEntryCopyAttribute->actions().size(); restoreGeometry(config()->get("GUI/MainWindowGeometry").toByteArray()); - #ifdef WITH_XC_HTTP +#ifdef WITH_XC_BROWSER + m_ui->settingsWidget->addSettingsPage(new BrowserPlugin(m_ui->tabWidget)); +#endif +#ifdef WITH_XC_HTTP m_ui->settingsWidget->addSettingsPage(new HttpPlugin(m_ui->tabWidget)); - #endif - #ifdef WITH_XC_SSHAGENT +#endif +#ifdef WITH_XC_SSHAGENT SSHAgent::init(this); m_ui->settingsWidget->addSettingsPage(new AgentSettingsPage(m_ui->tabWidget)); - #endif - #ifdef WITH_XC_BROWSER - m_ui->settingsWidget->addSettingsPage(new BrowserPlugin(m_ui->tabWidget)); - #endif +#endif setWindowIcon(filePath()->applicationIcon()); m_ui->globalMessageWidget->setHidden(true); From f520a0f272aa2697bd880bbfe92b80910b5112c7 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Wed, 17 Jan 2018 00:56:47 +0100 Subject: [PATCH 270/402] Deprecate KeePassHTTP and introduce WITH_XC_NETWORKING CMake option --- CMakeLists.txt | 13 +++++++--- src/CMakeLists.txt | 21 ++++++++++------ src/browser/BrowserOptionDialog.cpp | 3 ++- src/config-keepassx.h.cmake | 5 ++-- src/gui/AboutDialog.cpp | 14 +++++------ src/gui/EditWidgetIcons.cpp | 14 ++++++----- src/gui/EditWidgetIcons.h | 6 ++--- src/gui/KMessageWidget.cpp | 2 +- src/gui/MainWindow.cpp | 37 ++++++++++++++++++++++++++++- src/gui/MainWindow.h | 2 ++ src/gui/MainWindow.ui | 32 +++++++++++++++++++------ src/gui/MessageWidget.cpp | 1 + src/gui/MessageWidget.h | 3 +++ src/gui/SettingsWidget.cpp | 2 +- src/http/CMakeLists.txt | 2 -- src/http/OptionDialog.cpp | 2 ++ src/http/OptionDialog.ui | 11 +++++++-- 17 files changed, 127 insertions(+), 43 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e6d4270ca..3708667a7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ -# Copyright (C) 2010 Felix Geyer <debfx@fobos.de> # Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> +# Copyright (C) 2010 Felix Geyer <debfx@fobos.de> # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -41,10 +41,17 @@ option(WITH_COVERAGE "Use to build with coverage tests (GCC only)." OFF) option(WITH_APP_BUNDLE "Enable Application Bundle for macOS" ON) option(WITH_XC_AUTOTYPE "Include Auto-Type." ON) -option(WITH_XC_HTTP "Include KeePassHTTP and Custom Icon Downloads." OFF) +option(WITH_XC_NETWORKING "Include networking code (e.g. for downlading website icons)." OFF) +option(WITH_XC_BROWSER "Include browser integration with keepassxc-browser." OFF) +option(WITH_XC_HTTP "Include KeePassHTTP-compatible browser integration (deprecated, implies WITH_NETWORKING)." OFF) option(WITH_XC_YUBIKEY "Include YubiKey support." OFF) option(WITH_XC_SSHAGENT "Include SSH agent support." OFF) -option(WITH_XC_BROWSER "Include browser extension support." OFF) + +if(WITH_XC_HTTP) + message(WARNING "KeePassHTTP support has been deprecated and will be removed in a future version. Please use WITH_XC_BROWSER instead!\n" + "For enabling / disabling network access code, WITH_XC_HTTP has been replaced by WITH_XC_NETWORKING.") + set(WITH_XC_NETWORKING ON CACHE BOOL "Include networking code (e.g. for downlading website icons)." FORCE) +endif() # Process ui files automatically from source files set(CMAKE_AUTOUIC ON) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6a9638959..7abbfc823 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -187,15 +187,21 @@ set(keepassx_SOURCES_MAINEXE main.cpp ) -add_feature_info(AutoType WITH_XC_AUTOTYPE "Automatic password typing") -add_feature_info(KeePassHTTP WITH_XC_HTTP "Browser integration compatible with ChromeIPass and PassIFox") -add_feature_info(YubiKey WITH_XC_YUBIKEY "YubiKey HMAC-SHA1 challenge-response") +add_feature_info(Auto-Type WITH_XC_AUTOTYPE "Automatic password typing") +add_feature_info(Networking WITH_XC_NETWORKING "Compile KeePassXC with network access code (e.g. for downloading website icons)") +add_feature_info(keepassxc-browser WITH_XC_BROWSER "Browser integration with keepassxc-browser") +add_feature_info(KeePassHTTP WITH_XC_HTTP "Browser integration compatible with ChromeIPass and PassIFox (deprecated, implies Networking)") add_feature_info(SSHAgent WITH_XC_SSHAGENT "SSH agent integration compatible with KeeAgent") -add_feature_info(keepassxc-browser WITH_XC_BROWSER "KeePassXC browser support with keepassxc-browser") +add_feature_info(YubiKey WITH_XC_YUBIKEY "YubiKey HMAC-SHA1 challenge-response") + -add_subdirectory(http) if(WITH_XC_HTTP) - set(keepasshttp_LIB keepasshttp qhttp Qt5::Network) + add_subdirectory(http) + set(keepasshttp_LIB keepasshttp) +endif() +if(WITH_XC_NETWORKING) + add_subdirectory(http/qhttp) + set(keepassxcnetwork_LIB qhttp Qt5::Network) endif() set(BROWSER_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/browser) @@ -247,8 +253,9 @@ add_library(keepassx_core STATIC ${keepassx_SOURCES}) set_target_properties(keepassx_core PROPERTIES COMPILE_DEFINITIONS KEEPASSX_BUILDING_CORE) target_link_libraries(keepassx_core - ${keepasshttp_LIB} ${keepassxcbrowser_LIB} + ${keepasshttp_LIB} + ${keepassxcnetwork_LIB} ${autotype_LIB} ${sshagent_LIB} ${YUBIKEY_LIBRARIES} diff --git a/src/browser/BrowserOptionDialog.cpp b/src/browser/BrowserOptionDialog.cpp index 2040bef66..859afc8cf 100755 --- a/src/browser/BrowserOptionDialog.cpp +++ b/src/browser/BrowserOptionDialog.cpp @@ -23,7 +23,7 @@ #include "core/FilePath.h" #include <QMessageBox> -#include <QtWidgets/QFileDialog> +#include <QFileDialog> BrowserOptionDialog::BrowserOptionDialog(QWidget* parent) : QWidget(parent), @@ -36,6 +36,7 @@ BrowserOptionDialog::BrowserOptionDialog(QWidget* parent) : m_ui->warningWidget->showMessage(tr("The following options can be dangerous!\nChange them only if you know what you are doing."), MessageWidget::Warning); m_ui->warningWidget->setIcon(FilePath::instance()->icon("status", "dialog-warning")); m_ui->warningWidget->setCloseButtonVisible(false); + m_ui->warningWidget->setAutoHideTimeout(-1); m_ui->tabWidget->setEnabled(m_ui->enableBrowserSupport->isChecked()); connect(m_ui->enableBrowserSupport, SIGNAL(toggled(bool)), m_ui->tabWidget, SLOT(setEnabled(bool))); diff --git a/src/config-keepassx.h.cmake b/src/config-keepassx.h.cmake index 5a00a5dba..e98830b09 100644 --- a/src/config-keepassx.h.cmake +++ b/src/config-keepassx.h.cmake @@ -12,11 +12,12 @@ #define KEEPASSX_PLUGIN_DIR "${PLUGIN_INSTALL_DIR}" #define KEEPASSX_DATA_DIR "${DATA_INSTALL_DIR}" -#cmakedefine WITH_XC_HTTP #cmakedefine WITH_XC_AUTOTYPE +#cmakedefine WITH_XC_NETWORKING +#cmakedefine WITH_XC_BROWSER +#cmakedefine WITH_XC_HTTP #cmakedefine WITH_XC_YUBIKEY #cmakedefine WITH_XC_SSHAGENT -#cmakedefine WITH_XC_BROWSER #cmakedefine KEEPASSXC_DIST #cmakedefine KEEPASSXC_DIST_TYPE "@KEEPASSXC_DIST_TYPE@" diff --git a/src/gui/AboutDialog.cpp b/src/gui/AboutDialog.cpp index 44ab895e8..9ce3eda5d 100644 --- a/src/gui/AboutDialog.cpp +++ b/src/gui/AboutDialog.cpp @@ -78,20 +78,20 @@ AboutDialog::AboutDialog(QWidget* parent) #endif QString extensions; -#ifdef WITH_XC_HTTP - extensions += "\n- KeePassHTTP"; -#endif #ifdef WITH_XC_AUTOTYPE extensions += "\n- Auto-Type"; #endif -#ifdef WITH_XC_YUBIKEY - extensions += "\n- YubiKey"; +#ifdef WITH_XC_BROWSER + extensions += "\n- Browser Integration"; +#endif +#ifdef WITH_XC_HTTP + extensions += "\n- Legacy Browser Integration (KeePassHTTP)"; #endif #ifdef WITH_XC_SSHAGENT extensions += "\n- SSH Agent"; #endif -#ifdef WITH_XC_BROWSER - extensions += "\n- Native messaging browser extension"; +#ifdef WITH_XC_YUBIKEY + extensions += "\n- YubiKey"; #endif if (extensions.isEmpty()) diff --git a/src/gui/EditWidgetIcons.cpp b/src/gui/EditWidgetIcons.cpp index 7c01b31f1..3ff036e35 100644 --- a/src/gui/EditWidgetIcons.cpp +++ b/src/gui/EditWidgetIcons.cpp @@ -30,7 +30,7 @@ #include "gui/IconModels.h" #include "gui/MessageBox.h" -#ifdef WITH_XC_HTTP +#ifdef WITH_XC_NETWORKING #include "http/qhttp/qhttpclient.hpp" #include "http/qhttp/qhttpclientresponse.hpp" @@ -49,11 +49,13 @@ EditWidgetIcons::EditWidgetIcons(QWidget* parent) , m_database(nullptr) , m_defaultIconModel(new DefaultIconModel(this)) , m_customIconModel(new CustomIconModel(this)) - #ifdef WITH_XC_HTTP +#ifdef WITH_XC_NETWORKING , m_fallbackToGoogle(true) , m_redirectCount(0) +#endif +#ifdef WITH_XC_HTTP , m_httpClient(nullptr) - #endif +#endif { m_ui->setupUi(this); @@ -146,7 +148,7 @@ void EditWidgetIcons::load(const Uuid& currentUuid, Database* database, const Ic void EditWidgetIcons::setUrl(const QString& url) { -#ifdef WITH_XC_HTTP +#ifdef WITH_XC_NETWORKING m_url = url; m_ui->faviconButton->setVisible(!url.isEmpty()); resetFaviconDownload(); @@ -158,14 +160,14 @@ void EditWidgetIcons::setUrl(const QString& url) void EditWidgetIcons::downloadFavicon() { -#ifdef WITH_XC_HTTP +#ifdef WITH_XC_NETWORKING QUrl url = QUrl(m_url); url.setPath("/favicon.ico"); fetchFavicon(url); #endif } -#ifdef WITH_XC_HTTP +#ifdef WITH_XC_NETWORKING void EditWidgetIcons::fetchFavicon(const QUrl& url) { if (nullptr == m_httpClient) { diff --git a/src/gui/EditWidgetIcons.h b/src/gui/EditWidgetIcons.h index 5c27ffe29..0c155f7d9 100644 --- a/src/gui/EditWidgetIcons.h +++ b/src/gui/EditWidgetIcons.h @@ -32,7 +32,7 @@ class Database; class DefaultIconModel; class CustomIconModel; -#ifdef WITH_XC_HTTP +#ifdef WITH_XC_NETWORKING namespace qhttp { namespace client { class QHttpClient; @@ -73,7 +73,7 @@ signals: private slots: void downloadFavicon(); -#ifdef WITH_XC_HTTP +#ifdef WITH_XC_NETWORKING void fetchFavicon(const QUrl& url); void fetchFaviconFromGoogle(const QString& domain); void resetFaviconDownload(bool clearRedirect = true); @@ -93,7 +93,7 @@ private: QString m_url; DefaultIconModel* const m_defaultIconModel; CustomIconModel* const m_customIconModel; -#ifdef WITH_XC_HTTP +#ifdef WITH_XC_NETWORKING QUrl m_redirectUrl; bool m_fallbackToGoogle; unsigned short m_redirectCount; diff --git a/src/gui/KMessageWidget.cpp b/src/gui/KMessageWidget.cpp index 7f4cb94f4..fe9d46605 100644 --- a/src/gui/KMessageWidget.cpp +++ b/src/gui/KMessageWidget.cpp @@ -287,7 +287,7 @@ void KMessageWidget::setMessageType(KMessageWidget::MessageType type) bg1 = palette().highlight().color(); break; case Warning: - bg1.setRgb(181, 102, 0); // values taken from kcolorscheme.cpp (Neutral) + bg1.setRgb(191, 126, 7); // values taken from kcolorscheme.cpp (Neutral) break; case Error: bg1.setRgb(191, 3, 3); // values taken from kcolorscheme.cpp (Negative) diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index a3e713426..fcb112426 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -23,6 +23,7 @@ #include <QMimeData> #include <QShortcut> #include <QTimer> +#include <QDesktopServices> #if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(QT_NO_DBUS) #include <QList> @@ -195,6 +196,9 @@ MainWindow::MainWindow() setWindowIcon(filePath()->applicationIcon()); m_ui->globalMessageWidget->setHidden(true); + connect(m_ui->globalMessageWidget, SIGNAL(linkActivated(const QString&)), this, SLOT(openLink(const QString&))); + connect(m_ui->globalMessageWidget, SIGNAL(showAnimationStarted()), m_ui->globalMessageWidgetContainer, SLOT(show())); + connect(m_ui->globalMessageWidget, SIGNAL(hideAnimationFinished()), m_ui->globalMessageWidgetContainer, SLOT(hide())); m_clearHistoryAction = new QAction(tr("Clear history"), m_ui->menuFile); m_lastDatabasesActions = new QActionGroup(m_ui->menuRecentDatabases); @@ -407,13 +411,44 @@ MainWindow::MainWindow() m_ui->globalMessageWidget->showMessage( tr("Access error for config file %1").arg(config()->getFileName()), MessageWidget::Error); } - +#ifdef WITH_XC_HTTP + if (config()->get("Http/Enabled", false).toBool() && !config()->get("Http/DeprecationNoticeShown", false).toBool()) { + // show message after tab widget dismissed all messages + connect(m_ui->tabWidget, SIGNAL(messageDismissGlobal()), this, SLOT(showKeePassHTTPDeprecationNotice())); + } +#endif } MainWindow::~MainWindow() { } +void MainWindow::showKeePassHTTPDeprecationNotice() +{ + displayGlobalMessage(tr("<p>It looks like you are using KeePassHTTP for browser integration.<br>" + "This feature has been deprecated and will be removed in the future.<br>" + "Please switch to keepassxc-browser instead! For help with migration,<br>" + "visit our <a href=\"https://keepassxc.org/docs/keepassxc-browser-migration\">" + "keepassxc-browser migration guide</a>.</p>"), + MessageWidget::Warning, true, -1); + + config()->set("Http/DeprecationNoticeShown", true); + disconnect(m_ui->tabWidget, SIGNAL(messageDismissGlobal()), this, SLOT(showKeePassHTTPDeprecationNotice())); +} + +/** + * Open a link using the system's default handler. + * Links that are not HTTP(s) links are ignored. + * + * @param link link URL + */ +void MainWindow::openLink(const QString& link) +{ + if (link.startsWith("http://") || link.startsWith("https://")) { + QDesktopServices::openUrl(QUrl(link)); + } +} + void MainWindow::appExit() { m_appExitCalled = true; diff --git a/src/gui/MainWindow.h b/src/gui/MainWindow.h index b70dd9072..cfec5e3f5 100644 --- a/src/gui/MainWindow.h +++ b/src/gui/MainWindow.h @@ -97,6 +97,8 @@ private slots: void repairDatabase(); void hideTabMessage(); void handleScreenLock(); + void showKeePassHTTPDeprecationNotice(); + void openLink(const QString& link); private: static void setShortcut(QAction* action, QKeySequence::StandardKey standard, int fallback = 0); diff --git a/src/gui/MainWindow.ui b/src/gui/MainWindow.ui index c4d782f08..0b39d0b3d 100644 --- a/src/gui/MainWindow.ui +++ b/src/gui/MainWindow.ui @@ -21,6 +21,9 @@ <bool>true</bool> </property> <layout class="QVBoxLayout" name="verticalLayout"> + <property name="spacing"> + <number>0</number> + </property> <property name="leftMargin"> <number>0</number> </property> @@ -34,13 +37,28 @@ <number>0</number> </property> <item> - <widget class="MessageWidget" name="globalMessageWidget" native="true"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> + <widget class="QWidget" name="globalMessageWidgetContainer" native="true"> + <layout class="QVBoxLayout" name="globalMessageWidgetLayout"> + <property name="spacing"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <widget class="MessageWidget" name="globalMessageWidget" native="true"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="styleSheet"> + <string notr="true">MessageWidget {margin: 90px}</string> + </property> + </widget> + </item> + </layout> </widget> </item> <item> diff --git a/src/gui/MessageWidget.cpp b/src/gui/MessageWidget.cpp index 2be298055..4f722ed6b 100644 --- a/src/gui/MessageWidget.cpp +++ b/src/gui/MessageWidget.cpp @@ -47,6 +47,7 @@ void MessageWidget::showMessage(const QString &text, KMessageWidget::MessageType { setMessageType(type); setText(text); + emit showAnimationStarted(); animatedShow(); if (autoHideTimeout > 0) { m_autoHideTimer->start(autoHideTimeout); diff --git a/src/gui/MessageWidget.h b/src/gui/MessageWidget.h index c29c320bf..0eb7a20fa 100644 --- a/src/gui/MessageWidget.h +++ b/src/gui/MessageWidget.h @@ -35,6 +35,9 @@ public: static const int DefaultAutoHideTimeout; static const int DisableAutoHide; +signals: + void showAnimationStarted(); + public slots: void showMessage(const QString& text, MessageWidget::MessageType type); void showMessage(const QString& text, MessageWidget::MessageType type, int autoHideTimeout); diff --git a/src/gui/SettingsWidget.cpp b/src/gui/SettingsWidget.cpp index ce3df3338..7d3f65f81 100644 --- a/src/gui/SettingsWidget.cpp +++ b/src/gui/SettingsWidget.cpp @@ -82,7 +82,7 @@ SettingsWidget::SettingsWidget(QWidget* parent) connect(m_secUi->lockDatabaseIdleCheckBox, SIGNAL(toggled(bool)), m_secUi->lockDatabaseIdleSpinBox, SLOT(setEnabled(bool))); -#ifndef WITH_XC_HTTP +#ifndef WITH_XC_NETWORKING m_secUi->privacy->setVisible(false); #endif } diff --git a/src/http/CMakeLists.txt b/src/http/CMakeLists.txt index 8a3b197ab..db9f5dfb3 100644 --- a/src/http/CMakeLists.txt +++ b/src/http/CMakeLists.txt @@ -1,5 +1,3 @@ -add_subdirectory(qhttp) - if(WITH_XC_HTTP) include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/src/http/OptionDialog.cpp b/src/http/OptionDialog.cpp index 03ae6e9ce..f7f27433c 100644 --- a/src/http/OptionDialog.cpp +++ b/src/http/OptionDialog.cpp @@ -39,6 +39,8 @@ OptionDialog::OptionDialog(QWidget *parent) : m_ui->tabWidget->setEnabled(m_ui->enableHttpServer->isChecked()); connect(m_ui->enableHttpServer, SIGNAL(toggled(bool)), m_ui->tabWidget, SLOT(setEnabled(bool))); + + m_ui->deprecationNotice->setOpenExternalLinks(true); } OptionDialog::~OptionDialog() diff --git a/src/http/OptionDialog.ui b/src/http/OptionDialog.ui index abe994772..39b0ce403 100644 --- a/src/http/OptionDialog.ui +++ b/src/http/OptionDialog.ui @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>577</width> - <height>404</height> + <width>803</width> + <height>433</height> </rect> </property> <property name="windowTitle"> @@ -26,6 +26,13 @@ <property name="bottomMargin"> <number>0</number> </property> + <item> + <widget class="QLabel" name="deprecationNotice"> + <property name="text"> + <string><p><b>NOTE:</b> KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to keepassxc-browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">keepassxc-browser migration guide</a>.</p></string> + </property> + </widget> + </item> <item> <widget class="QCheckBox" name="enableHttpServer"> <property name="toolTip"> From 30f77b07bba1b7e55da2d99c4944552fbc2f0d47 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Fri, 19 Jan 2018 20:05:37 +0100 Subject: [PATCH 271/402] Improve KMessageWidget visuals --- src/browser/BrowserOptionDialog.cpp | 1 - src/gui/KMessageWidget.cpp | 85 ++++++++++++++--------------- src/gui/MainWindow.cpp | 8 +-- src/http/OptionDialog.cpp | 1 - 4 files changed, 45 insertions(+), 50 deletions(-) diff --git a/src/browser/BrowserOptionDialog.cpp b/src/browser/BrowserOptionDialog.cpp index 859afc8cf..d93fa647b 100755 --- a/src/browser/BrowserOptionDialog.cpp +++ b/src/browser/BrowserOptionDialog.cpp @@ -34,7 +34,6 @@ BrowserOptionDialog::BrowserOptionDialog(QWidget* parent) : connect(m_ui->removeStoredPermissions, SIGNAL(clicked()), this, SIGNAL(removeStoredPermissions())); m_ui->warningWidget->showMessage(tr("The following options can be dangerous!\nChange them only if you know what you are doing."), MessageWidget::Warning); - m_ui->warningWidget->setIcon(FilePath::instance()->icon("status", "dialog-warning")); m_ui->warningWidget->setCloseButtonVisible(false); m_ui->warningWidget->setAutoHideTimeout(-1); diff --git a/src/gui/KMessageWidget.cpp b/src/gui/KMessageWidget.cpp index fe9d46605..910f0c91b 100644 --- a/src/gui/KMessageWidget.cpp +++ b/src/gui/KMessageWidget.cpp @@ -33,6 +33,7 @@ #include <QTimeLine> #include <QToolButton> #include <QStyle> +#include <QtGui/QBitmap> //--------------------------------------------------------------------- // KMessageWidgetPrivate @@ -49,6 +50,7 @@ public: QToolButton *closeButton; QTimeLine *timeLine; QIcon icon; + QPixmap closeButtonPixmap; KMessageWidget::MessageType messageType; bool wordWrap; @@ -95,10 +97,11 @@ void KMessageWidgetPrivate::init(KMessageWidget *q_ptr) closeAction->setIcon(FilePath::instance()->icon("actions", "message-close", false)); QObject::connect(closeAction, SIGNAL(triggered(bool)), q, SLOT(animatedHide())); - + closeButton = new QToolButton(content); closeButton->setAutoRaise(true); closeButton->setDefaultAction(closeAction); + closeButtonPixmap = QPixmap(closeButton->icon().pixmap(closeButton->icon().actualSize(QSize(16, 16)))); #ifdef Q_OS_MAC closeButton->setStyleSheet("QToolButton { background: transparent;" "border-radius: 2px; padding: 3px; }" @@ -256,49 +259,42 @@ KMessageWidget::MessageType KMessageWidget::messageType() const return d->messageType; } -static QColor darkShade(QColor c) -{ - qreal contrast = 0.7; // taken from kcolorscheme for the dark shade - - qreal darkAmount; - if (c.lightnessF() < 0.006) { /* too dark */ - darkAmount = 0.02 + 0.40 * contrast; - } else if (c.lightnessF() > 0.93) { /* too bright */ - darkAmount = -0.06 - 0.60 * contrast; - } else { - darkAmount = (-c.lightnessF()) * (0.55 + contrast * 0.35); - } - - qreal v = c.lightnessF() + darkAmount; - v = v > 0.0 ? (v < 1.0 ? v : 1.0) : 0.0; - c.setHsvF(c.hslHueF(), c.hslSaturationF(), v); - return c; -} - void KMessageWidget::setMessageType(KMessageWidget::MessageType type) { d->messageType = type; - QColor bg0, bg1, bg2, border, fg; + QColor bg0, bg1, bg2, border; + QColor fg = palette().light().color(); switch (type) { - case Positive: - bg1.setRgb(0, 110, 40); // values taken from kcolorscheme.cpp (Positive) - break; - case Information: - bg1 = palette().highlight().color(); - break; - case Warning: - bg1.setRgb(191, 126, 7); // values taken from kcolorscheme.cpp (Neutral) - break; - case Error: - bg1.setRgb(191, 3, 3); // values taken from kcolorscheme.cpp (Negative) - break; + case Positive: + bg1.setRgb(37, 163, 83); + break; + case Information: + bg1.setRgb(24, 187, 242); + break; + case Warning: + bg1.setRgb(252, 193, 57); + fg = palette().foreground().color(); + break; + case Error: + bg1.setRgb(198, 69, 21); + break; } - + // Colors - fg = palette().light().color(); - bg0 = bg1.lighter(110); - bg2 = bg1.darker(110); - border = darkShade(bg1); + bg0 = bg1.lighter(105); + bg2 = bg1.darker(105); + border = bg1.darker(115); + + // Tint close icon + auto closeButtonPixmap = d->closeButtonPixmap; + QPixmap mask(closeButtonPixmap); + QPainter painter; + painter.begin(&closeButtonPixmap); + painter.setRenderHints(QPainter::HighQualityAntialiasing); + painter.setCompositionMode(QPainter::CompositionMode_SourceIn); + painter.fillRect(QRect(0, 0, 16, 16), fg); + painter.end(); + d->closeButton->setIcon(closeButtonPixmap); d->content->setStyleSheet( QString(QLatin1String(".QFrame {" @@ -306,10 +302,10 @@ void KMessageWidget::setMessageType(KMessageWidget::MessageType type) " stop: 0 %1," " stop: 0.1 %2," " stop: 1.0 %3);" - "border-radius: 5px;" - "border: 1px solid %4;" - "margin: %5px;" - "padding: 5px;" + " border-radius: 2px;" + " border: 1px solid %4;" + " margin: %5px;" + " padding: 5px;" "}" ".QLabel { color: %6; }" )) @@ -317,8 +313,9 @@ void KMessageWidget::setMessageType(KMessageWidget::MessageType type) .arg(bg1.name()) .arg(bg2.name()) .arg(border.name()) - // DefaultFrameWidth returns the size of the external margin + border width. We know our border is 1px, so we subtract this from the frame normal QStyle FrameWidth to get our margin - .arg(style()->pixelMetric(QStyle::PM_DefaultFrameWidth, 0, this) - 1) + // DefaultFrameWidth returns the size of the external margin + border width. We know our border is 1px, + // so we subtract this from the frame normal QStyle FrameWidth to get our margin + .arg(style()->pixelMetric(QStyle::PM_DefaultFrameWidth, nullptr, this) - 1) .arg(fg.name()) ); } diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index fcb112426..ee7b20021 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -425,14 +425,14 @@ MainWindow::~MainWindow() void MainWindow::showKeePassHTTPDeprecationNotice() { - displayGlobalMessage(tr("<p>It looks like you are using KeePassHTTP for browser integration.<br>" + displayGlobalMessage(tr("<p>It looks like you are using KeePassHTTP for browser integration. " "This feature has been deprecated and will be removed in the future.<br>" - "Please switch to keepassxc-browser instead! For help with migration,<br>" - "visit our <a href=\"https://keepassxc.org/docs/keepassxc-browser-migration\">" + "Please switch to keepassxc-browser instead! For help with migration, " + "visit our <a class=\"link\" href=\"https://keepassxc.org/docs/keepassxc-browser-migration\">" "keepassxc-browser migration guide</a>.</p>"), MessageWidget::Warning, true, -1); - config()->set("Http/DeprecationNoticeShown", true); +// config()->set("Http/DeprecationNoticeShown", true); disconnect(m_ui->tabWidget, SIGNAL(messageDismissGlobal()), this, SLOT(showKeePassHTTPDeprecationNotice())); } diff --git a/src/http/OptionDialog.cpp b/src/http/OptionDialog.cpp index f7f27433c..46eda10b3 100644 --- a/src/http/OptionDialog.cpp +++ b/src/http/OptionDialog.cpp @@ -33,7 +33,6 @@ OptionDialog::OptionDialog(QWidget *parent) : connect(m_ui->removeStoredPermissions, SIGNAL(clicked()), this, SIGNAL(removeStoredPermissions())); m_ui->warningWidget->showMessage(tr("The following options can be dangerous!\nChange them only if you know what you are doing."), MessageWidget::Warning); - m_ui->warningWidget->setIcon(FilePath::instance()->icon("status", "dialog-warning")); m_ui->warningWidget->setCloseButtonVisible(false); m_ui->warningWidget->setAutoHideTimeout(MessageWidget::DisableAutoHide); From a6fd52d1f937d32099bd9b0154ccf9dc63108fb8 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Fri, 19 Jan 2018 20:32:23 +0100 Subject: [PATCH 272/402] Show KeePassHTTP deprecation notice three times and use MessageWidget --- src/browser/BrowserOptionDialog.cpp | 2 +- src/gui/MainWindow.cpp | 27 +++++++-------------------- src/gui/MainWindow.h | 1 - src/gui/MessageWidget.cpp | 17 ++++++++++++++++- src/gui/MessageWidget.h | 1 + src/http/OptionDialog.cpp | 10 ++++++++-- src/http/OptionDialog.ui | 10 +++------- 7 files changed, 36 insertions(+), 32 deletions(-) diff --git a/src/browser/BrowserOptionDialog.cpp b/src/browser/BrowserOptionDialog.cpp index d93fa647b..c97ccdfd5 100755 --- a/src/browser/BrowserOptionDialog.cpp +++ b/src/browser/BrowserOptionDialog.cpp @@ -33,7 +33,7 @@ BrowserOptionDialog::BrowserOptionDialog(QWidget* parent) : connect(m_ui->removeSharedEncryptionKeys, SIGNAL(clicked()), this, SIGNAL(removeSharedEncryptionKeys())); connect(m_ui->removeStoredPermissions, SIGNAL(clicked()), this, SIGNAL(removeStoredPermissions())); - m_ui->warningWidget->showMessage(tr("The following options can be dangerous!\nChange them only if you know what you are doing."), MessageWidget::Warning); + m_ui->warningWidget->showMessage(tr("<b>Warning:</b> The following options can be dangerous!"), MessageWidget::Warning); m_ui->warningWidget->setCloseButtonVisible(false); m_ui->warningWidget->setAutoHideTimeout(-1); diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index ee7b20021..915676e3c 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -23,7 +23,6 @@ #include <QMimeData> #include <QShortcut> #include <QTimer> -#include <QDesktopServices> #if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(QT_NO_DBUS) #include <QList> @@ -78,7 +77,7 @@ public: QString name() override { - return QObject::tr("Browser Integration (old)"); + return QObject::tr("Legacy Browser Integration"); } QIcon icon() override @@ -196,7 +195,7 @@ MainWindow::MainWindow() setWindowIcon(filePath()->applicationIcon()); m_ui->globalMessageWidget->setHidden(true); - connect(m_ui->globalMessageWidget, SIGNAL(linkActivated(const QString&)), this, SLOT(openLink(const QString&))); + connect(m_ui->globalMessageWidget, &MessageWidget::linkActivated, &MessageWidget::openHttpUrl); connect(m_ui->globalMessageWidget, SIGNAL(showAnimationStarted()), m_ui->globalMessageWidgetContainer, SLOT(show())); connect(m_ui->globalMessageWidget, SIGNAL(hideAnimationFinished()), m_ui->globalMessageWidgetContainer, SLOT(hide())); @@ -412,7 +411,7 @@ MainWindow::MainWindow() tr("Access error for config file %1").arg(config()->getFileName()), MessageWidget::Error); } #ifdef WITH_XC_HTTP - if (config()->get("Http/Enabled", false).toBool() && !config()->get("Http/DeprecationNoticeShown", false).toBool()) { + if (config()->get("Http/Enabled", false).toBool() && config()->get("Http/DeprecationNoticeShown", 0).toInt() < 3) { // show message after tab widget dismissed all messages connect(m_ui->tabWidget, SIGNAL(messageDismissGlobal()), this, SLOT(showKeePassHTTPDeprecationNotice())); } @@ -425,30 +424,18 @@ MainWindow::~MainWindow() void MainWindow::showKeePassHTTPDeprecationNotice() { + int warningNum = config()->get("Http/DeprecationNoticeShown", 0).toInt(); displayGlobalMessage(tr("<p>It looks like you are using KeePassHTTP for browser integration. " "This feature has been deprecated and will be removed in the future.<br>" - "Please switch to keepassxc-browser instead! For help with migration, " + "Please switch to KeePassXC-Browser instead! For help with migration, " "visit our <a class=\"link\" href=\"https://keepassxc.org/docs/keepassxc-browser-migration\">" - "keepassxc-browser migration guide</a>.</p>"), + "migration guide</a> (warning %1 of 3).</p>").arg(warningNum + 1), MessageWidget::Warning, true, -1); -// config()->set("Http/DeprecationNoticeShown", true); + config()->set("Http/DeprecationNoticeShown", warningNum + 1); disconnect(m_ui->tabWidget, SIGNAL(messageDismissGlobal()), this, SLOT(showKeePassHTTPDeprecationNotice())); } -/** - * Open a link using the system's default handler. - * Links that are not HTTP(s) links are ignored. - * - * @param link link URL - */ -void MainWindow::openLink(const QString& link) -{ - if (link.startsWith("http://") || link.startsWith("https://")) { - QDesktopServices::openUrl(QUrl(link)); - } -} - void MainWindow::appExit() { m_appExitCalled = true; diff --git a/src/gui/MainWindow.h b/src/gui/MainWindow.h index cfec5e3f5..f3b288003 100644 --- a/src/gui/MainWindow.h +++ b/src/gui/MainWindow.h @@ -98,7 +98,6 @@ private slots: void hideTabMessage(); void handleScreenLock(); void showKeePassHTTPDeprecationNotice(); - void openLink(const QString& link); private: static void setShortcut(QAction* action, QKeySequence::StandardKey standard, int fallback = 0); diff --git a/src/gui/MessageWidget.cpp b/src/gui/MessageWidget.cpp index 4f722ed6b..f40e5aad0 100644 --- a/src/gui/MessageWidget.cpp +++ b/src/gui/MessageWidget.cpp @@ -18,7 +18,9 @@ #include "MessageWidget.h" -#include "QTimer" +#include <QTimer> +#include <QDesktopServices> +#include <QUrl> const int MessageWidget::DefaultAutoHideTimeout = 6000; const int MessageWidget::DisableAutoHide = -1; @@ -69,3 +71,16 @@ void MessageWidget::setAutoHideTimeout(int autoHideTimeout) m_autoHideTimer->stop(); } } + +/** + * Open a link using the system's default handler. + * Links that are not HTTP(S) links are ignored. + * + * @param link link URL + */ +void MessageWidget::openHttpUrl(const QString& link) +{ + if (link.startsWith("http://") || link.startsWith("https://")) { + QDesktopServices::openUrl(QUrl(link)); + } +} \ No newline at end of file diff --git a/src/gui/MessageWidget.h b/src/gui/MessageWidget.h index 0eb7a20fa..73f0b2108 100644 --- a/src/gui/MessageWidget.h +++ b/src/gui/MessageWidget.h @@ -43,6 +43,7 @@ public slots: void showMessage(const QString& text, MessageWidget::MessageType type, int autoHideTimeout); void hideMessage(); void setAutoHideTimeout(int autoHideTimeout); + static void openHttpUrl(QString const& url); private: QTimer* m_autoHideTimer; diff --git a/src/http/OptionDialog.cpp b/src/http/OptionDialog.cpp index 46eda10b3..dd5a51f73 100644 --- a/src/http/OptionDialog.cpp +++ b/src/http/OptionDialog.cpp @@ -32,14 +32,20 @@ OptionDialog::OptionDialog(QWidget *parent) : connect(m_ui->removeSharedEncryptionKeys, SIGNAL(clicked()), this, SIGNAL(removeSharedEncryptionKeys())); connect(m_ui->removeStoredPermissions, SIGNAL(clicked()), this, SIGNAL(removeStoredPermissions())); - m_ui->warningWidget->showMessage(tr("The following options can be dangerous!\nChange them only if you know what you are doing."), MessageWidget::Warning); + m_ui->warningWidget->showMessage(tr("<b>Warning:</b> The following options can be dangerous!"), MessageWidget::Warning); m_ui->warningWidget->setCloseButtonVisible(false); m_ui->warningWidget->setAutoHideTimeout(MessageWidget::DisableAutoHide); m_ui->tabWidget->setEnabled(m_ui->enableHttpServer->isChecked()); connect(m_ui->enableHttpServer, SIGNAL(toggled(bool)), m_ui->tabWidget, SLOT(setEnabled(bool))); - m_ui->deprecationNotice->setOpenExternalLinks(true); + m_ui->deprecationNotice->showMessage(tr("<p>KeePassHTTP has been deprecated and will be removed in the future.<br>" + "Please switch to KeePassXC-Browser instead! For help with migration, visit " + "our <a href=\"https://keepassxc.org/docs/keepassxc-browser-migration\">" + "migration guide</a>.</p>"), MessageWidget::Warning); + m_ui->deprecationNotice->setCloseButtonVisible(false); + m_ui->deprecationNotice->setAutoHideTimeout(-1); + connect(m_ui->deprecationNotice, &MessageWidget::linkActivated, &MessageWidget::openHttpUrl); } OptionDialog::~OptionDialog() diff --git a/src/http/OptionDialog.ui b/src/http/OptionDialog.ui index 39b0ce403..54f7bd70c 100644 --- a/src/http/OptionDialog.ui +++ b/src/http/OptionDialog.ui @@ -26,13 +26,6 @@ <property name="bottomMargin"> <number>0</number> </property> - <item> - <widget class="QLabel" name="deprecationNotice"> - <property name="text"> - <string><p><b>NOTE:</b> KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to keepassxc-browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">keepassxc-browser migration guide</a>.</p></string> - </property> - </widget> - </item> <item> <widget class="QCheckBox" name="enableHttpServer"> <property name="toolTip"> @@ -43,6 +36,9 @@ </property> </widget> </item> + <item> + <widget class="MessageWidget" name="deprecationNotice" native="true"/> + </item> <item> <widget class="QTabWidget" name="tabWidget"> <property name="currentIndex"> From 8ac909b0ebed0f0177f3191b1ff5ef7e0ffece58 Mon Sep 17 00:00:00 2001 From: varjolintu <sami.vanttinen@protonmail.com> Date: Wed, 17 Jan 2018 14:55:13 +0200 Subject: [PATCH 273/402] Multiple browser related fixes --- INSTALL.md | 4 +- README.md | 2 +- src/CMakeLists.txt | 2 +- src/browser/BrowserAccessControlDialog.ui | 2 +- src/browser/BrowserAction.cpp | 48 +++++++++++++---------- src/browser/BrowserAction.h | 3 +- src/browser/BrowserEntryConfig.cpp | 2 +- src/browser/BrowserOptionDialog.ui | 2 +- src/browser/BrowserService.cpp | 12 +++--- src/browser/BrowserService.h | 2 +- src/browser/NativeMessagingBase.cpp | 2 +- src/browser/NativeMessagingHost.cpp | 11 +++++- 12 files changed, 55 insertions(+), 37 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index 2690e6091..86048b501 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -25,7 +25,7 @@ The following libraries are required: * zlib * libmicrohttpd * libxi, libxtst, qtx11extras (optional for auto-type on X11) -* libsodium (>= 1.0.12, optional for keepassxc-browser support) +* libsodium (>= 1.0.12, optional for KeePassXC-Browser support) * libargon2 @@ -88,7 +88,7 @@ These steps place the compiled KeePassXC binary inside the `./build/src/` direct -DWITH_XC_AUTOTYPE=[ON|OFF] Enable/Disable Auto-Type (default: ON) -DWITH_XC_HTTP=[ON|OFF] Enable/Disable KeePassHTTP and custom icon downloads (default: OFF) -DWITH_XC_YUBIKEY=[ON|OFF] Enable/Disable YubiKey HMAC-SHA1 authentication support (default: OFF) - -DWITH_XC_BROWSER=[ON|OFF] Enable/Disable keepassxc-browser extension support (default: OFF) + -DWITH_XC_BROWSER=[ON|OFF] Enable/Disable KeePassXC-Browser extension support (default: OFF) -DWITH_TESTS=[ON|OFF] Enable/Disable building of unit tests (default: ON) -DWITH_GUI_TESTS=[ON|OFF] Enable/Disable building of GUI tests (default: OFF) diff --git a/README.md b/README.md index 5c2373259..9f81795c5 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ so please check out your distribution's package list to see if KeePassXC is avai [Mozilla Firefox](https://addons.mozilla.org/en-US/firefox/addon/keepasshttp-connector/) and [Google Chrome or Chromium](https://chrome.google.com/webstore/detail/keepasshttp-connector/dafgdjggglmmknipkhngniifhplpcldb), and [passafari](https://github.com/mmichaa/passafari.safariextension/) in Safari. [[See note about KeePassHTTP]](#Note_about_KeePassHTTP) -- Browser integration with keepassxc-browser using [native messaging](https://developer.chrome.com/extensions/nativeMessaging) for [Mozilla Firefox](https://addons.mozilla.org/en-US/firefox/addon/keepassxc-browser/) and [Google Chrome or Chromium](https://chrome.google.com/webstore/detail/keepassxc-browser/iopaggbpplllidnfmcghoonnokmjoicf) +- Browser integration with KeePassXC-Browser using [native messaging](https://developer.chrome.com/extensions/nativeMessaging) for [Mozilla Firefox](https://addons.mozilla.org/en-US/firefox/addon/keepassxc-browser/) and [Google Chrome or Chromium](https://chrome.google.com/webstore/detail/keepassxc-browser/iopaggbpplllidnfmcghoonnokmjoicf) - Many bug fixes For a full list of features and changes, read the [CHANGELOG](CHANGELOG) document. diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7abbfc823..80ca54a49 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -189,7 +189,7 @@ set(keepassx_SOURCES_MAINEXE add_feature_info(Auto-Type WITH_XC_AUTOTYPE "Automatic password typing") add_feature_info(Networking WITH_XC_NETWORKING "Compile KeePassXC with network access code (e.g. for downloading website icons)") -add_feature_info(keepassxc-browser WITH_XC_BROWSER "Browser integration with keepassxc-browser") +add_feature_info(KeePassXC-Browser WITH_XC_BROWSER "Browser integration with KeePassXC-Browser") add_feature_info(KeePassHTTP WITH_XC_HTTP "Browser integration compatible with ChromeIPass and PassIFox (deprecated, implies Networking)") add_feature_info(SSHAgent WITH_XC_SSHAGENT "SSH agent integration compatible with KeeAgent") add_feature_info(YubiKey WITH_XC_YUBIKEY "YubiKey HMAC-SHA1 challenge-response") diff --git a/src/browser/BrowserAccessControlDialog.ui b/src/browser/BrowserAccessControlDialog.ui index d4f104544..29715314d 100755 --- a/src/browser/BrowserAccessControlDialog.ui +++ b/src/browser/BrowserAccessControlDialog.ui @@ -11,7 +11,7 @@ </rect> </property> <property name="windowTitle"> - <string>keepassxc-browser Confirm Access</string> + <string>KeePassXC-Browser Confirm Access</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> diff --git a/src/browser/BrowserAction.cpp b/src/browser/BrowserAction.cpp index ebd9e2d9a..b15d8ed59 100755 --- a/src/browser/BrowserAction.cpp +++ b/src/browser/BrowserAction.cpp @@ -39,6 +39,12 @@ QJsonObject BrowserAction::readResponse(const QJsonObject& json) return QJsonObject(); } + bool triggerUnlock = false; + const QString trigger = json.value("triggerUnlock").toString(); + if (!trigger.isEmpty() && trigger.compare("true", Qt::CaseSensitive) == 0) { + triggerUnlock = true; + } + const QString action = json.value("action").toString(); if (action.isEmpty()) { return QJsonObject(); @@ -48,7 +54,7 @@ QJsonObject BrowserAction::readResponse(const QJsonObject& json) if (action.compare("change-public-keys", Qt::CaseSensitive) != 0 && !m_browserService.isDatabaseOpened()) { if (m_clientPublicKey.isEmpty()) { return getErrorReply(action, ERROR_KEEPASS_CLIENT_PUBLIC_KEY_NOT_RECEIVED); - } else if (!m_browserService.openDatabase()) { + } else if (!m_browserService.openDatabase(triggerUnlock)) { return getErrorReply(action, ERROR_KEEPASS_DATABASE_NOT_OPENED); } } @@ -134,10 +140,11 @@ QJsonObject BrowserAction::handleGetDatabaseHash(const QJsonObject& json, const QString command = decrypted.value("action").toString(); if (!command.isEmpty() && command.compare("get-databasehash", Qt::CaseSensitive) == 0) { - QJsonObject message; + const QString newNonce = incrementNonce(nonce); + + QJsonObject message = buildMessage(newNonce); message["hash"] = hash; - message["version"] = KEEPASSX_VERSION; - return buildResponse(action, message, incrementNonce(nonce)); + return buildResponse(action, message, newNonce); } return getErrorReply(action, ERROR_KEEPASS_CANNOT_DECRYPT_MESSAGE); @@ -237,7 +244,7 @@ QJsonObject BrowserAction::handleGetLogins(const QJsonObject& json, const QStrin const QJsonArray users = m_browserService.findMatchingEntries(id, url, submit, ""); if (users.isEmpty()) { - return QJsonObject(); // No logins found. Not an error, return an empty JSON object. + return getErrorReply(action, ERROR_KEEPASS_NO_LOGINS_FOUND); } const QString newNonce = incrementNonce(nonce); @@ -379,21 +386,22 @@ QJsonObject BrowserAction::buildResponse(const QString& action, const QJsonObjec QString BrowserAction::getErrorMessage(const int errorCode) const { switch (errorCode) { - case ERROR_KEEPASS_DATABASE_NOT_OPENED: return "Database not opened"; - case ERROR_KEEPASS_DATABASE_HASH_NOT_RECEIVED: return "Database hash not available"; - case ERROR_KEEPASS_CLIENT_PUBLIC_KEY_NOT_RECEIVED: return "Client public key not received"; - case ERROR_KEEPASS_CANNOT_DECRYPT_MESSAGE: return "Cannot decrypt message"; - case ERROR_KEEPASS_TIMEOUT_OR_NOT_CONNECTED: return "Timeout or cannot connect to KeePassXC"; - case ERROR_KEEPASS_ACTION_CANCELLED_OR_DENIED: return "Action cancelled or denied"; - case ERROR_KEEPASS_CANNOT_ENCRYPT_MESSAGE: return "Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?"; - case ERROR_KEEPASS_ASSOCIATION_FAILED: return "KeePassXC association failed, try again"; - case ERROR_KEEPASS_KEY_CHANGE_FAILED: return "Key change was not successful"; - case ERROR_KEEPASS_ENCRYPTION_KEY_UNRECOGNIZED: return "Encryption key is not recognized"; - case ERROR_KEEPASS_NO_SAVED_DATABASES_FOUND: return "No saved databases found"; - case ERROR_KEEPASS_INCORRECT_ACTION: return "Incorrect action"; - case ERROR_KEEPASS_EMPTY_MESSAGE_RECEIVED: return "Empty message received"; - case ERROR_KEEPASS_NO_URL_PROVIDED: return "No URL provided"; - default: return "Unknown error"; + case ERROR_KEEPASS_DATABASE_NOT_OPENED: return QObject::tr("Database not opened"); + case ERROR_KEEPASS_DATABASE_HASH_NOT_RECEIVED: return QObject::tr("Database hash not available"); + case ERROR_KEEPASS_CLIENT_PUBLIC_KEY_NOT_RECEIVED: return QObject::tr("Client public key not received"); + case ERROR_KEEPASS_CANNOT_DECRYPT_MESSAGE: return QObject::tr("Cannot decrypt message"); + case ERROR_KEEPASS_TIMEOUT_OR_NOT_CONNECTED: return QObject::tr("Timeout or cannot connect to KeePassXC"); + case ERROR_KEEPASS_ACTION_CANCELLED_OR_DENIED: return QObject::tr("Action cancelled or denied"); + case ERROR_KEEPASS_CANNOT_ENCRYPT_MESSAGE: return QObject::tr("Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?"); + case ERROR_KEEPASS_ASSOCIATION_FAILED: return QObject::tr("KeePassXC association failed, try again"); + case ERROR_KEEPASS_KEY_CHANGE_FAILED: return QObject::tr("Key change was not successful"); + case ERROR_KEEPASS_ENCRYPTION_KEY_UNRECOGNIZED: return QObject::tr("Encryption key is not recognized"); + case ERROR_KEEPASS_NO_SAVED_DATABASES_FOUND: return QObject::tr("No saved databases found"); + case ERROR_KEEPASS_INCORRECT_ACTION: return QObject::tr("Incorrect action"); + case ERROR_KEEPASS_EMPTY_MESSAGE_RECEIVED: return QObject::tr("Empty message received"); + case ERROR_KEEPASS_NO_URL_PROVIDED: return QObject::tr("No URL provided"); + case ERROR_KEEPASS_NO_LOGINS_FOUND: return QObject::tr("No logins found"); + default: return QObject::tr("Unknown error"); } } diff --git a/src/browser/BrowserAction.h b/src/browser/BrowserAction.h index 83d89fb7f..c4d59d3c9 100755 --- a/src/browser/BrowserAction.h +++ b/src/browser/BrowserAction.h @@ -43,7 +43,8 @@ class BrowserAction : public QObject ERROR_KEEPASS_NO_SAVED_DATABASES_FOUND = 11, ERROR_KEEPASS_INCORRECT_ACTION = 12, ERROR_KEEPASS_EMPTY_MESSAGE_RECEIVED = 13, - ERROR_KEEPASS_NO_URL_PROVIDED = 14 + ERROR_KEEPASS_NO_URL_PROVIDED = 14, + ERROR_KEEPASS_NO_LOGINS_FOUND = 15 }; public: diff --git a/src/browser/BrowserEntryConfig.cpp b/src/browser/BrowserEntryConfig.cpp index a390e5a75..36d0c7339 100644 --- a/src/browser/BrowserEntryConfig.cpp +++ b/src/browser/BrowserEntryConfig.cpp @@ -21,7 +21,7 @@ #include "core/Entry.h" #include "core/EntryAttributes.h" -static const char KEEPASSBROWSER_NAME[] = "keepassxc-browser Settings"; //TODO: duplicated string (also in Service.cpp) +static const char KEEPASSBROWSER_NAME[] = "KeePassXC-Browser Settings"; BrowserEntryConfig::BrowserEntryConfig(QObject* parent) : diff --git a/src/browser/BrowserOptionDialog.ui b/src/browser/BrowserOptionDialog.ui index e5352b0fa..690ae3955 100755 --- a/src/browser/BrowserOptionDialog.ui +++ b/src/browser/BrowserOptionDialog.ui @@ -29,7 +29,7 @@ <item> <widget class="QCheckBox" name="enableBrowserSupport"> <property name="toolTip"> - <string>This is required for accessing your databases with keepassxc-browser</string> + <string>This is required for accessing your databases with KeePassXC-Browser</string> </property> <property name="text"> <string>Enable KeepassXC browser integration</string> diff --git a/src/browser/BrowserService.cpp b/src/browser/BrowserService.cpp index 9e2b86cb3..0a0ff2961 100644 --- a/src/browser/BrowserService.cpp +++ b/src/browser/BrowserService.cpp @@ -40,9 +40,9 @@ static const unsigned char KEEPASSXCBROWSER_UUID_DATA[] = { 0x97, 0x4b, 0x59, 0x11, 0xb8, 0x81, 0x62, 0x24 }; static const Uuid KEEPASSXCBROWSER_UUID = Uuid(QByteArray::fromRawData(reinterpret_cast<const char *>(KEEPASSXCBROWSER_UUID_DATA), sizeof(KEEPASSXCBROWSER_UUID_DATA))); -static const char KEEPASSXCBROWSER_NAME[] = "keepassxc-browser Settings"; +static const char KEEPASSXCBROWSER_NAME[] = "KeePassXC-Browser Settings"; static const char ASSOCIATE_KEY_PREFIX[] = "Public Key: "; -static const char KEEPASSXCBROWSER_GROUP_NAME[] = "keepassxc-browser Passwords"; +static const char KEEPASSXCBROWSER_GROUP_NAME[] = "KeePassXC-Browser Passwords"; static int KEEPASSXCBROWSER_DEFAULT_ICON = 1; BrowserService::BrowserService(DatabaseTabWidget* parent) : @@ -65,7 +65,7 @@ bool BrowserService::isDatabaseOpened() const } -bool BrowserService::openDatabase() +bool BrowserService::openDatabase(bool triggerUnlock) { if (!BrowserSettings::unlockDatabase()) { return false; @@ -80,7 +80,9 @@ bool BrowserService::openDatabase() return true; } - KEEPASSXC_MAIN_WINDOW->bringToFront(); + if (triggerUnlock) { + KEEPASSXC_MAIN_WINDOW->bringToFront(); + } return false; } @@ -189,6 +191,7 @@ QString BrowserService::storeKey(const QString& key) keyDialog.show(); keyDialog.activateWindow(); keyDialog.raise(); + keyDialog.setWindowFlags(keyDialog.windowFlags() | Qt::WindowStaysOnTopHint); auto ok = keyDialog.exec(); id = keyDialog.textValue(); @@ -221,7 +224,6 @@ QString BrowserService::getKey(const QString& id) return config->attributes()->value(QLatin1String(ASSOCIATE_KEY_PREFIX) + id); } -// No need to use KeepassHttpProtocol. Just return a JSON array. QJsonArray BrowserService::findMatchingEntries(const QString& id, const QString& url, const QString& submitUrl, const QString& realm) { QJsonArray result; diff --git a/src/browser/BrowserService.h b/src/browser/BrowserService.h index 859daee2a..5a96e1ecd 100644 --- a/src/browser/BrowserService.h +++ b/src/browser/BrowserService.h @@ -35,7 +35,7 @@ public: explicit BrowserService(DatabaseTabWidget* parent); bool isDatabaseOpened() const; - bool openDatabase(); + bool openDatabase(bool triggerUnlock); QString getDatabaseRootUuid(); QString getDatabaseRecycleBinUuid(); Entry* getConfigEntry(bool create = false); diff --git a/src/browser/NativeMessagingBase.cpp b/src/browser/NativeMessagingBase.cpp index fb4959688..743953e95 100644 --- a/src/browser/NativeMessagingBase.cpp +++ b/src/browser/NativeMessagingBase.cpp @@ -121,7 +121,7 @@ void NativeMessagingBase::sendReply(const QJsonObject& json) void NativeMessagingBase::sendReply(const QString& reply) { if (!reply.isEmpty()) { - uint len = reply.length(); + uint len = reply.length(); std::cout << char(((len>>0) & 0xFF)) << char(((len>>8) & 0xFF)) << char(((len>>16) & 0xFF)) << char(((len>>24) & 0xFF)); std::cout << reply.toStdString() << std::flush; } diff --git a/src/browser/NativeMessagingHost.cpp b/src/browser/NativeMessagingHost.cpp index f6d2bd9e7..4dfa87d51 100755 --- a/src/browser/NativeMessagingHost.cpp +++ b/src/browser/NativeMessagingHost.cpp @@ -72,6 +72,11 @@ void NativeMessagingHost::run() if (BrowserSettings::supportBrowserProxy()) { QString serverPath = getLocalServerPath(); QFile::remove(serverPath); + + if (m_localServer->isListening()) { + m_localServer->close(); + } + m_localServer->listen(serverPath); connect(m_localServer.data(), SIGNAL(newConnection()), this, SLOT(newLocalConnection())); } else { @@ -120,8 +125,10 @@ void NativeMessagingHost::readStdIn(const quint32 length) void NativeMessagingHost::newLocalConnection() { QLocalSocket* socket = m_localServer->nextPendingConnection(); - connect(socket, SIGNAL(readyRead()), this, SLOT(newLocalMessage())); - connect(socket, SIGNAL(disconnected()), this, SLOT(disconnectSocket())); + if (socket) { + connect(socket, SIGNAL(readyRead()), this, SLOT(newLocalMessage())); + connect(socket, SIGNAL(disconnected()), this, SLOT(disconnectSocket())); + } } void NativeMessagingHost::newLocalMessage() From cfe8ca983645f2bce100b5d970e109cbda377dd8 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sat, 20 Jan 2018 14:45:22 +0100 Subject: [PATCH 274/402] Always initialize m_httpClient to nullptr to avoid accidental dereferencing, resolves #1410 --- src/gui/EditWidgetIcons.cpp | 3 --- src/gui/EditWidgetIcons.h | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/gui/EditWidgetIcons.cpp b/src/gui/EditWidgetIcons.cpp index 3ff036e35..6f5e7ee13 100644 --- a/src/gui/EditWidgetIcons.cpp +++ b/src/gui/EditWidgetIcons.cpp @@ -53,9 +53,6 @@ EditWidgetIcons::EditWidgetIcons(QWidget* parent) , m_fallbackToGoogle(true) , m_redirectCount(0) #endif -#ifdef WITH_XC_HTTP - , m_httpClient(nullptr) -#endif { m_ui->setupUi(this); diff --git a/src/gui/EditWidgetIcons.h b/src/gui/EditWidgetIcons.h index 0c155f7d9..796dd5939 100644 --- a/src/gui/EditWidgetIcons.h +++ b/src/gui/EditWidgetIcons.h @@ -97,7 +97,7 @@ private: QUrl m_redirectUrl; bool m_fallbackToGoogle; unsigned short m_redirectCount; - qhttp::client::QHttpClient* m_httpClient; + qhttp::client::QHttpClient* m_httpClient = nullptr; #endif Q_DISABLE_COPY(EditWidgetIcons) From 5231d07fdf28045e7cf5aa5fffdb63c9ea8e9a83 Mon Sep 17 00:00:00 2001 From: Toni Spets <toni.spets@iki.fi> Date: Sat, 20 Jan 2018 11:19:09 +0200 Subject: [PATCH 275/402] Ignore SSH keys in Recycle Bin, fixes #1396 --- src/sshagent/SSHAgent.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/sshagent/SSHAgent.cpp b/src/sshagent/SSHAgent.cpp index 7969fe0cc..2424bc97f 100644 --- a/src/sshagent/SSHAgent.cpp +++ b/src/sshagent/SSHAgent.cpp @@ -217,8 +217,14 @@ void SSHAgent::databaseModeChanged(DatabaseWidget::Mode mode) } else if (mode == DatabaseWidget::ViewMode && !m_keys.contains(uuid.toHex())) { for (Entry* e : widget->database()->rootGroup()->entriesRecursive()) { - if (!e->attachments()->hasKey("KeeAgent.settings")) + if (widget->database()->metadata()->recycleBinEnabled() + && e->group() == widget->database()->metadata()->recycleBin()) { continue; + } + + if (!e->attachments()->hasKey("KeeAgent.settings")) { + continue; + } KeeAgentSettings settings; settings.fromXml(e->attachments()->value("KeeAgent.settings")); From 34a7ba4477b1d965807786f90a81583265c694bf Mon Sep 17 00:00:00 2001 From: Fonic <fonic.maxxim@live.com> Date: Tue, 19 Dec 2017 10:47:51 +0100 Subject: [PATCH 276/402] Add additional columns to entry view table Add additional columns 'Password', 'Notes', 'Expires', 'Created', 'Modified', 'Accessed' and 'Attachments' to entry view table: - add columns themselves - add display role data providers - introduce/apply sort role - add sort role data providers - add settings to display usernames/passwords visible/hidden - minor addition to EntryModel::columnCount() as advised by Qt documentation --- src/gui/entry/EntryModel.cpp | 249 ++++++++++++++++++++++++++++++++++- src/gui/entry/EntryModel.h | 53 +++++++- src/gui/entry/EntryView.cpp | 7 + 3 files changed, 304 insertions(+), 5 deletions(-) diff --git a/src/gui/entry/EntryModel.cpp b/src/gui/entry/EntryModel.cpp index 4d3578069..b042c255c 100644 --- a/src/gui/entry/EntryModel.cpp +++ b/src/gui/entry/EntryModel.cpp @@ -20,6 +20,12 @@ #include <QFont> #include <QMimeData> #include <QPalette> +/** + * @author Fonic <https://github.com/fonic> + * Add include required for additional columns 'Expires', 'Created', 'Modified' + * and 'Accessed' + */ +#include <QDateTime> #include "core/DatabaseIcons.h" #include "core/Entry.h" @@ -27,9 +33,36 @@ #include "core/Group.h" #include "core/Metadata.h" +/** + * @author Fonic <https://github.com/fonic> + * Define constant string used to display hidden content in columns 'Username' + * and 'Password' + * + * TODO: + * Decide which of the proposed options should be used (stars, bullet, black + * circle) + */ +//const QString EntryModel::HiddenContent("******"); +//const QString EntryModel::HiddenContent(QString(QChar(0x2022)).repeated(6)); +const QString EntryModel::HiddenContent(QString(QChar(0x25CF)).repeated(6)); + +/** + * @author Fonic <https://github.com/fonic> + * Define date format used to display dates in columns 'Expires', 'Created', + * 'Modified' and 'Accessed' + */ +const Qt::DateFormat EntryModel::DateFormat = Qt::DefaultLocaleShortDate; + +/** + * @author Fonic <https://github.com/fonic> + * Initialize 'Hide Usernames' and 'Hide Passwords' settings using sane + * defaults (usernames visible, passwords hidden) + */ EntryModel::EntryModel(QObject* parent) : QAbstractTableModel(parent) , m_group(nullptr) + , m_hideUsernames(false) + , m_hidePasswords(true) { } @@ -116,9 +149,18 @@ int EntryModel::rowCount(const QModelIndex& parent) const int EntryModel::columnCount(const QModelIndex& parent) const { - Q_UNUSED(parent); - - return 4; + /** + * @author Fonic <https://github.com/fonic> + * Change column count to include additional columns 'Password', 'Notes', + * 'Expires', 'Created', 'Modified', 'Accessed' and 'Attachments'. Also, + * return 0 when parent is valid as advised by Qt documentation + */ + if (parent.isValid()) { + return 0; + } + else { + return 11; + } } QVariant EntryModel::data(const QModelIndex& index, int role) const @@ -130,6 +172,25 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const Entry* entry = entryFromIndex(index); EntryAttributes* attr = entry->attributes(); + /** + * @author Fonic <https://github.com/fonic> + * + * Add display data providers for additional columns 'Password', 'Notes', + * 'Expires', 'Created', 'Modified', 'Accessed' and 'Attachments' + * + * Add ability to display usernames and passwords hidden or visible + * depending on current state of 'Hide Usernames' and 'Hide Passwords' + * settings + * + * TODO: + * Decide which of the additional columns should expand placeholders + * -> code added where applicable, but currently commented out + * + * Check what attr->isReference() does and if it applies to any of the + * additional columns + * -> code added for columns 'Password' and 'Notes', as EntryAttributes:: + * PasswordKey and EntryAttributes::NotesKey already existed + */ if (role == Qt::DisplayRole) { QString result; switch (index.column()) { @@ -145,17 +206,139 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const } return result; case Username: - result = entry->resolveMultiplePlaceholders(entry->username()); + /* + * Display usernames hidden or visible according to current state + * of 'Hide Usernames' setting + */ + if (m_hideUsernames) { + result = EntryModel::HiddenContent; + } + else { + //result = entry->username(); + result = entry->resolveMultiplePlaceholders(entry->username()); + } if (attr->isReference(EntryAttributes::UserNameKey)) { result.prepend(tr("Ref: ","Reference abbreviation")); } return result; + case Password: + /* + * Display passwords hidden or visible according to current state + * of 'Hide Passwords' setting + */ + if (m_hidePasswords) { + result = EntryModel::HiddenContent; + } + else { + //result = entry->resolveMultiplePlaceholders(entry->password()); + result = entry->password(); + } + if (attr->isReference(EntryAttributes::PasswordKey)) { + result.prepend(tr("Ref: ","Reference abbreviation")); + } + return result; case Url: + //result = entry->resolveMultiplePlaceholders(entry->displayUrl()); result = entry->displayUrl(); if (attr->isReference(EntryAttributes::URLKey)) { result.prepend(tr("Ref: ","Reference abbreviation")); } return result; + case Notes: + /* + * Display only first line of notes in simplified format like + * KeePassX does + */ + //result = entry->resolveMultiplePlaceholders(entry->notes().section("\n", 0, 0).simplified()); + result = entry->notes().section("\n", 0, 0).simplified(); + if (attr->isReference(EntryAttributes::NotesKey)) { + result.prepend(tr("Ref: ","Reference abbreviation")); + } + return result; + case Expires: + /* + * Display either date of expiry or 'Never' like KeePassX does + */ + result = entry->timeInfo().expires() ? entry->timeInfo().expiryTime().toLocalTime().toString(EntryModel::DateFormat) : tr("Never"); + return result; + case Created: + result = entry->timeInfo().creationTime().toLocalTime().toString(EntryModel::DateFormat); + return result; + case Modified: + result = entry->timeInfo().lastModificationTime().toLocalTime().toString(EntryModel::DateFormat); + return result; + case Accessed: + result = entry->timeInfo().lastAccessTime().toLocalTime().toString(EntryModel::DateFormat); + return result; + case Attachments: + /* + * Display comma-separated list of attachments + * + * TODO: + * 'entry->attachments()->keys().join()' works locally, yet it fails + * on GitHub/Travis CI, most likely due to an older Qt version, thus + * using loop for now (http://doc.qt.io/qt-5/qlist.html#more-members) + */ + //result = entry->resolveMultiplePlaceholders(entry->attachments()->keys().join(", ")); + //result = entry->attachments()->keys().join(", "); + + QList<QString> attachments = entry->attachments()->keys(); + for (int i=0; i < attachments.size(); i++) { + if (result.isEmpty()) { + result.append(attachments.at(i)); + } + else { + result.append(QString(", ") + attachments.at(i)); + } + } + //result = entry->resolveMultiplePlaceholders(result); + return result; + } + + } + /** + * @author Fonic <https://github.com/fonic> + * + * Add sort data providers for columns 'Username' and 'Password', required + * for correct sorting even if displayed hidden (i.e. settings 'Hide User- + * names' and/or 'Hide Passwords' are enabled) + * + * Add sort data providers for columns 'Expires', 'Created', 'Modified' + * and 'Accessed', required for correct sorting of dates (without this, + * sorting would be based on string representation of dates, yielding un- + * desired results) + * + * NOTE: + * Qt::UserRole is used as sort role, using 'm_sortModel->setSortRole(Qt:: + * UserRole)' in EntryView.cpp, EntryView::EntryView() + */ + else if (role == Qt::UserRole) { + switch (index.column()) { + case Username: + //return entry->username(); + return entry->resolveMultiplePlaceholders(entry->username()); + case Password: + //return entry->resolveMultiplePlaceholders(entry->password()); + return entry->password(); + case Expires: + /* + * TODO: + * Is there any better way to return a QDateTime representing + * 'Never' / infinity / end of all time? + */ + return entry->timeInfo().expires() ? entry->timeInfo().expiryTime() : QDateTime(QDate(9999, 1, 1)); + case Created: + return entry->timeInfo().creationTime(); + case Modified: + return entry->timeInfo().lastModificationTime(); + case Accessed: + return entry->timeInfo().lastAccessTime(); + default: + /* + * For all other columns, simply use data provided by Qt::Display- + * Role for sorting + */ + return data(index, Qt::DisplayRole); } } else if (role == Qt::DecorationRole) { @@ -190,8 +373,14 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const return QVariant(); } + QVariant EntryModel::headerData(int section, Qt::Orientation orientation, int role) const { + /** + * @author Fonic <https://github.com/fonic> + * Add captions for additional columns 'Password', 'Notes', 'Expires', + * 'Created', 'Modified', 'Accessed' and 'Attachments' + */ if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { switch (section) { case ParentGroup: @@ -200,8 +389,22 @@ QVariant EntryModel::headerData(int section, Qt::Orientation orientation, int ro return tr("Title"); case Username: return tr("Username"); + case Password: + return tr("Password"); case Url: return tr("URL"); + case Notes: + return tr("Notes"); + case Expires: + return tr("Expires"); + case Created: + return tr("Created"); + case Modified: + return tr("Modified"); + case Accessed: + return tr("Accessed"); + case Attachments: + return tr("Attachments"); } } @@ -337,3 +540,41 @@ void EntryModel::makeConnections(const Group* group) connect(group, SIGNAL(entryRemoved(Entry*)), SLOT(entryRemoved())); connect(group, SIGNAL(entryDataChanged(Entry*)), SLOT(entryDataChanged(Entry*))); } + +/** + * @author Fonic <https://github.com/fonic> + * Get current state of 'Hide Usernames' setting + */ +bool EntryModel::hideUsernames() const +{ + return m_hideUsernames; +} + +/** + * @author Fonic <https://github.com/fonic> + * Set state of 'Hide Usernames' setting and signal change + */ +void EntryModel::setHideUsernames(const bool hide) +{ + m_hideUsernames = hide; + emit hideUsernamesChanged(); +} + +/** + * @author Fonic <https://github.com/fonic> + * Get current state of 'Hide Passwords' setting + */ +bool EntryModel::hidePasswords() const +{ + return m_hidePasswords; +} + +/** + * @author Fonic <https://github.com/fonic> + * Set state of 'Hide Passwords' setting and signal change + */ +void EntryModel::setHidePasswords(const bool hide) +{ + m_hidePasswords = hide; + emit hidePasswordsChanged(); +} diff --git a/src/gui/entry/EntryModel.h b/src/gui/entry/EntryModel.h index d12982d83..5bb58c9ad 100644 --- a/src/gui/entry/EntryModel.h +++ b/src/gui/entry/EntryModel.h @@ -28,12 +28,24 @@ class EntryModel : public QAbstractTableModel Q_OBJECT public: + /** + * @author Fonic <https://github.com/fonic> + * Add entries for additional columns 'Password', 'Notes', 'Expires', + * 'Created', 'Modified', 'Accessed' and 'Attachments' + */ enum ModelColumn { ParentGroup = 0, Title = 1, Username = 2, - Url = 3 + Password = 3, + Url = 4, + Notes = 5, + Expires = 6, + Created = 7, + Modified = 8, + Accessed = 9, + Attachments = 10 }; explicit EntryModel(QObject* parent = nullptr); @@ -52,9 +64,26 @@ public: void setEntryList(const QList<Entry*>& entries); + /** + * @author Fonic <https://github.com/fonic> + * Methods to get/set state of 'Hide Usernames' and 'Hide Passwords' + * settings + */ + bool hideUsernames() const; + void setHideUsernames(const bool hide); + bool hidePasswords() const; + void setHidePasswords(const bool hide); + signals: void switchedToEntryListMode(); void switchedToGroupMode(); + /** + * @author Fonic <https://github.com/fonic> + * Signals to notify about state changes of 'Hide Usernames' and 'Hide + * Passwords' settings + */ + void hideUsernamesChanged(); + void hidePasswordsChanged(); public slots: void setGroup(Group* group); @@ -74,6 +103,28 @@ private: QList<Entry*> m_entries; QList<Entry*> m_orgEntries; QList<const Group*> m_allGroups; + + /** + * @author Fonic <https://github.com/fonic> + * Properties to store state of 'Hide Usernames' and 'Hide Passwords' + * settings + */ + bool m_hideUsernames; + bool m_hidePasswords; + + /** + * @author Fonic <https://github.com/fonic> + * Constant string used to display hidden content in columns 'Username' + * and 'Password' + */ + static const QString HiddenContent; + + /** + * @author Fonic <https://github.com/fonic> + * Date format used to display dates in columns 'Expires', 'Created', + * 'Modified' and 'Accessed' + */ + static const Qt::DateFormat DateFormat; }; #endif // KEEPASSX_ENTRYMODEL_H diff --git a/src/gui/entry/EntryView.cpp b/src/gui/entry/EntryView.cpp index ac8e66782..6d2c88279 100644 --- a/src/gui/entry/EntryView.cpp +++ b/src/gui/entry/EntryView.cpp @@ -32,6 +32,13 @@ EntryView::EntryView(QWidget* parent) m_sortModel->setDynamicSortFilter(true); m_sortModel->setSortLocaleAware(true); m_sortModel->setSortCaseSensitivity(Qt::CaseInsensitive); + /** + * @author Fonic <https://github.com/fonic> + * Set Qt::UserRole as sort role + * -> refer to 'if (role == Qt::UserRole)', EntryModel.cpp, EntryModel:: + * data() for details + */ + m_sortModel->setSortRole(Qt::UserRole); QTreeView::setModel(m_sortModel); setUniformRowHeights(true); From 268035ff9e81d6d4689931346decb73d31d1e4f1 Mon Sep 17 00:00:00 2001 From: Fonic <fonic.maxxim@live.com> Date: Tue, 19 Dec 2017 11:10:32 +0100 Subject: [PATCH 277/402] Update entry model test to account for additional columns Update comparison values of modelProxy->columnCount() to account for additional columns 'Password', 'Notes', 'Expires', 'Created', 'Modified', 'Accessed' and 'Attachments' --- tests/TestEntryModel.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/tests/TestEntryModel.cpp b/tests/TestEntryModel.cpp index ad7c9060a..49ae3b0d1 100644 --- a/tests/TestEntryModel.cpp +++ b/tests/TestEntryModel.cpp @@ -288,9 +288,15 @@ void TestEntryModel::testProxyModel() modelSource->setGroup(db->rootGroup()); + /** + * @author Fonic <https://github.com/fonic> + * Update comparison value of modelProxy->columnCount() to account for + * additional columns 'Password', 'Notes', 'Expires', 'Created', 'Modified', + * 'Accessed' and 'Attachments' + */ QSignalSpy spyColumnRemove(modelProxy, SIGNAL(columnsAboutToBeRemoved(QModelIndex,int,int))); modelProxy->hideColumn(0, true); - QCOMPARE(modelProxy->columnCount(), 3); + QCOMPARE(modelProxy->columnCount(), 10); QVERIFY(spyColumnRemove.size() >= 1); int oldSpyColumnRemoveSize = spyColumnRemove.size(); @@ -304,9 +310,15 @@ void TestEntryModel::testProxyModel() entryList << entry; modelSource->setEntryList(entryList); + /** + * @author Fonic <https://github.com/fonic> + * Update comparison value of modelProxy->columnCount() to account for + * additional columns 'Password', 'Notes', 'Expires', 'Created', 'Modified', + * 'Accessed' and 'Attachments' + */ QSignalSpy spyColumnInsert(modelProxy, SIGNAL(columnsAboutToBeInserted(QModelIndex,int,int))); modelProxy->hideColumn(0, false); - QCOMPARE(modelProxy->columnCount(), 4); + QCOMPARE(modelProxy->columnCount(), 11); QVERIFY(spyColumnInsert.size() >= 1); int oldSpyColumnInsertSize = spyColumnInsert.size(); From 31d73626e5ebfdc0115b9fd745d6af760608f539 Mon Sep 17 00:00:00 2001 From: Fonic <fonic.maxxim@live.com> Date: Thu, 21 Dec 2017 10:01:47 +0100 Subject: [PATCH 278/402] Add header context menu to entry view table Add header context menu to entry view table (accessible using right click on header), providing: - Actions to toggle 'Hide Usernames' / 'Hide Passwords' - Actions to toggle column visibility - Actions to resize columns - Action to reset view to defaults --- src/gui/entry/EntryModel.cpp | 18 +++ src/gui/entry/EntryModel.h | 8 ++ src/gui/entry/EntryView.cpp | 268 ++++++++++++++++++++++++++++++++++- src/gui/entry/EntryView.h | 24 ++++ 4 files changed, 313 insertions(+), 5 deletions(-) diff --git a/src/gui/entry/EntryModel.cpp b/src/gui/entry/EntryModel.cpp index b042c255c..e03b0f791 100644 --- a/src/gui/entry/EntryModel.cpp +++ b/src/gui/entry/EntryModel.cpp @@ -578,3 +578,21 @@ void EntryModel::setHidePasswords(const bool hide) m_hidePasswords = hide; emit hidePasswordsChanged(); } + +/** + * @author Fonic <https://github.com/fonic> + * Toggle state of 'Hide Usernames' setting + */ +void EntryModel::toggleHideUsernames(const bool hide) +{ + setHideUsernames(hide); +} + +/** + * @author Fonic <https://github.com/fonic> + * Toggle state of 'Hide Passwords' setting + */ +void EntryModel::toggleHidePasswords(const bool hide) +{ + setHidePasswords(hide); +} diff --git a/src/gui/entry/EntryModel.h b/src/gui/entry/EntryModel.h index 5bb58c9ad..5b4f5e734 100644 --- a/src/gui/entry/EntryModel.h +++ b/src/gui/entry/EntryModel.h @@ -77,6 +77,7 @@ public: signals: void switchedToEntryListMode(); void switchedToGroupMode(); + /** * @author Fonic <https://github.com/fonic> * Signals to notify about state changes of 'Hide Usernames' and 'Hide @@ -88,6 +89,13 @@ signals: public slots: void setGroup(Group* group); + /** + * @author Fonic <https://github.com/fonic> + * Slots to toggle state of 'Hide Usernames' and 'Hide Passwords' settings + */ + void toggleHideUsernames(const bool hide); + void toggleHidePasswords(const bool hide); + private slots: void entryAboutToAdd(Entry* entry); void entryAdded(Entry* entry); diff --git a/src/gui/entry/EntryView.cpp b/src/gui/entry/EntryView.cpp index 6d2c88279..6657818d2 100644 --- a/src/gui/entry/EntryView.cpp +++ b/src/gui/entry/EntryView.cpp @@ -19,9 +19,26 @@ #include <QHeaderView> #include <QKeyEvent> +/** + * @author Fonic <https://github.com/fonic> + * Add include required for header context menu + */ +#include <QMenu> #include "gui/SortFilterHideProxyModel.h" +/** + * @author Fonic <https://github.com/fonic> + * + * TODO NOTE: + * Currently, 'zombie' columns which are not hidden but have width == 0 + * (rendering them invisible) may appear. This is caused by DatabaseWidget + * StateSync. Corresponding checks/workarounds may be removed once sync + * code is updated accordingly + * -> relevant code pieces: if (header()->sectionSize(...) == 0) { ... } + * + */ + EntryView::EntryView(QWidget* parent) : QTreeView(parent) , m_model(new EntryModel(this)) @@ -47,7 +64,6 @@ EntryView::EntryView(QWidget* parent) setDragEnabled(true); setSortingEnabled(true); setSelectionMode(QAbstractItemView::ExtendedSelection); - header()->setDefaultSectionSize(150); // QAbstractItemView::startDrag() uses this property as the default drag action setDefaultDropAction(Qt::MoveAction); @@ -58,6 +74,69 @@ EntryView::EntryView(QWidget* parent) connect(m_model, SIGNAL(switchedToGroupMode()), SLOT(switchToGroupMode())); connect(this, SIGNAL(clicked(QModelIndex)), SLOT(emitEntryPressed(QModelIndex))); + + /** + * @author Fonic <https://github.com/fonic> + * Create header context menu: + * - Actions to toggle state of 'Hide Usernames'/'Hide Passwords' settings + * - Actions to toggle column visibility, with each action carrying 'its' + * column index as data + * - Actions to resize columns + * - Action to reset view to defaults + */ + m_headerMenu = new QMenu(this); + m_headerMenu->setTitle(tr("Customize View")); + m_headerMenu->addSection(tr("Customize View")); + + m_hideUsernamesAction = m_headerMenu->addAction(tr("Hide Usernames"), m_model, SLOT(toggleHideUsernames(bool))); + m_hideUsernamesAction->setCheckable(true); + m_hidePasswordsAction = m_headerMenu->addAction(tr("Hide Passwords"), m_model, SLOT(toggleHidePasswords(bool))); + m_hidePasswordsAction->setCheckable(true); + m_headerMenu->addSeparator(); + + m_columnActions = new QActionGroup(this); + m_columnActions->setExclusive(false); + for (int colidx = 1; colidx < header()->count(); colidx++) { + QString caption = m_model->headerData(colidx, Qt::Horizontal, Qt::DisplayRole).toString(); + QAction* action = m_headerMenu->addAction(caption); + action->setCheckable(true); + action->setData(colidx); + m_columnActions->addAction(action); + } + connect(m_columnActions, SIGNAL(triggered(QAction*)), this, SLOT(toggleColumnVisibility(QAction*))); + + m_headerMenu->addSeparator(); + m_headerMenu->addAction(tr("Fit to window"), this, SLOT(fitColumnsToWindow())); + m_headerMenu->addAction(tr("Fit to contents"), this, SLOT(fitColumnsToContents())); + m_headerMenu->addSeparator(); + m_headerMenu->addAction(tr("Reset to defaults"), this, SLOT(resetViewToDefaults())); + + /** + * @author Fonic <https://github.com/fonic> + * Configure header: + * - Set default section size + * - Disable stretching of last section (interferes with fitting columns + * to window) + * - Associate with context menu + */ + header()->setDefaultSectionSize(100); + header()->setStretchLastSection(false); + header()->setContextMenuPolicy(Qt::CustomContextMenu); + connect(header(), SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showHeaderMenu(QPoint))); + + /** + * @author Fonic <https://github.com/fonic> + * Finalize setup by resetting view to defaults. Although not really + * necessary at this point, it makes sense in order to avoid duplicating + * code (sorting order, visibility of first column etc.) + * + * TODO: + * Not working as expected, columns will end up being very small, most + * likely due to EntryView not being sized properly at this time. Either + * find a way to make this work by analizing when/where EntryView is + * created or remove + */ + //resetViewToDefaults(); } void EntryView::keyPressEvent(QKeyEvent* event) @@ -153,22 +232,201 @@ Entry* EntryView::entryFromIndex(const QModelIndex& index) void EntryView::switchToEntryListMode() { - m_sortModel->hideColumn(0, false); + /** + * @author Fonic <https://github.com/fonic> + * Use header()->showSection() instead of m_sortModel->hideColumn() as + * the latter messes up column indices, interfering with code relying on + * proper indices + */ + header()->showSection(EntryModel::ParentGroup); + if (header()->sectionSize(EntryModel::ParentGroup) == 0) { + header()->resizeSection(EntryModel::ParentGroup, header()->defaultSectionSize()); + } + /** + * @author Fonic <https://github.com/fonic> + * Set sorting column and order (TODO: check what first two lines do, if + * they are actually necessary, if indices are still correct and if indices + * may be replaced by EntryModel::<column>) + */ m_sortModel->sort(1, Qt::AscendingOrder); m_sortModel->sort(0, Qt::AscendingOrder); - sortByColumn(0, Qt::AscendingOrder); + sortByColumn(EntryModel::ParentGroup, Qt::AscendingOrder); m_inEntryListMode = true; } void EntryView::switchToGroupMode() { - m_sortModel->hideColumn(0, true); + /** + * @author Fonic <https://github.com/fonic> + * Use header()->hideSection() instead of m_sortModel->hideColumn() as + * the latter messes up column indices, interfering with code relying on + * proper indices + */ + header()->hideSection(EntryModel::ParentGroup); + /** + * @author Fonic <https://github.com/fonic> + * Set sorting column and order (TODO: check what first two lines do, if + * they are actually necessary, if indices are still correct and if indices + * may be replaced by EntryModel::<column>) + */ m_sortModel->sort(-1, Qt::AscendingOrder); m_sortModel->sort(0, Qt::AscendingOrder); - sortByColumn(0, Qt::AscendingOrder); + sortByColumn(EntryModel::Title, Qt::AscendingOrder); m_inEntryListMode = false; } + +/** + * @author Fonic <https://github.com/fonic> + * Sync checkable menu actions to current state and display header context + * menu at specified position + */ +void EntryView::showHeaderMenu(const QPoint& position) +{ + /* Sync checked state of menu actions to current state of view */ + m_hideUsernamesAction->setChecked(m_model->hideUsernames()); + m_hidePasswordsAction->setChecked(m_model->hidePasswords()); + foreach (QAction *action, m_columnActions->actions()) { + if (static_cast<QMetaType::Type>(action->data().type()) != QMetaType::Int) { + Q_ASSERT(false); + continue; + } + int colidx = action->data().toInt(); + bool hidden = header()->isSectionHidden(colidx) || (header()->sectionSize(colidx) == 0); + action->setChecked(!hidden); + } + + /* Display menu */ + m_headerMenu->popup(mapToGlobal(position)); +} + +/** + * @author Fonic <https://github.com/fonic> + * Toggle visibility of column referenced by triggering action + */ +void EntryView::toggleColumnVisibility(QAction *action) +{ + /* + * Verify action carries a column index as data. Since QVariant.toInt() + * below will accept anything that's interpretable as int, perform a type + * check here to make sure data actually IS int + */ + if (static_cast<QMetaType::Type>(action->data().type()) != QMetaType::Int) { + Q_ASSERT(false); + return; + } + + /* + * Toggle column visibility. Visible columns will only be hidden if at + * least one visible column remains, as the table header will disappear + * entirely when all columns are hidden, rendering the context menu in- + * accessible + */ + int colidx = action->data().toInt(); + if (action->isChecked()) { + header()->showSection(colidx); + if (header()->sectionSize(colidx) == 0) { + header()->resizeSection(colidx, header()->defaultSectionSize()); + } + } + else { + if ((header()->count() - header()->hiddenSectionCount()) > 1) { + header()->hideSection(colidx); + } + else { + action->setChecked(true); + } + } +} + +/** + * @author Fonic <https://github.com/fonic> + * Resize columns to fit all visible columns within the available space + * + * NOTE: + * If EntryView::resizeEvent() is overridden at some point in the future, + * its implementation MUST call the corresponding parent method using + * 'QTreeView::resizeEvent(event)'. Without this, fitting to window will + * be broken and/or work unreliably (stumbled upon during testing) + */ +void EntryView::fitColumnsToWindow() +{ + header()->resizeSections(QHeaderView::Stretch); +} + +/** + * @author Fonic <https://github.com/fonic> + * Resize columns to fit current table contents, i.e. make all contents + * entirely visible + */ +void EntryView::fitColumnsToContents() +{ + /* Resize columns to fit contents */ + header()->resizeSections(QHeaderView::ResizeToContents); + + /* + * Determine total width of currently visible columns. If there is + * still some space available on the header, equally distribute it to + * visible columns and add remaining fraction to last visible column + */ + int width = 0; + for (int colidx = 0; colidx < header()->count(); colidx++) { + if (!header()->isSectionHidden(colidx)) { + width += header()->sectionSize(colidx); + } + } + int visible = header()->count() - header()->hiddenSectionCount(); + int avail = header()->width() - width; + if ((visible > 0) && (avail > 0)) { + int add = avail / visible; + width = 0; + int last = 0; + for (int colidx = 0; colidx < header()->count(); colidx++) { + if (!header()->isSectionHidden(colidx)) { + header()->resizeSection(colidx, header()->sectionSize(colidx) + add); + width += header()->sectionSize(colidx); + if (header()->visualIndex(colidx) > last) { + last = header()->visualIndex(colidx); + } + } + } + header()->resizeSection(header()->logicalIndex(last), header()->sectionSize(last) + (header()->width() - width)); + } +} + +/** + * @author Fonic <https://github.com/fonic> + * Reset view to defaults + * + * NOTE: + * header()->saveState()/restoreState() could also be used for this, but + * testing showed that it complicates things more than it helps when trying + * to account for current list mode + */ +void EntryView::resetViewToDefaults() +{ + /* Reset state of 'Hide Usernames'/'Hide Passwords' settings */ + m_model->setHideUsernames(false); + m_model->setHidePasswords(true); + + /* Reset visibility, size and position of all columns */ + for (int colidx = 0; colidx < header()->count(); colidx++) { + header()->showSection(colidx); + header()->resizeSection(colidx, header()->defaultSectionSize()); + header()->moveSection(header()->visualIndex(colidx), colidx); + } + + /* Reenter current list mode (affects first column and sorting) */ + if (m_inEntryListMode) { + switchToEntryListMode(); + } + else { + switchToGroupMode(); + } + + /* Nicely fitting columns to window feels like a sane default */ + fitColumnsToWindow(); +} diff --git a/src/gui/entry/EntryView.h b/src/gui/entry/EntryView.h index 14c6b7ccc..2cadf0d82 100644 --- a/src/gui/entry/EntryView.h +++ b/src/gui/entry/EntryView.h @@ -26,6 +26,11 @@ class Entry; class EntryModel; class Group; class SortFilterHideProxyModel; +/** + * @author Fonic <https://github.com/fonic> + * Add forward declaration for QActionGroup + */ +class QActionGroup; class EntryView : public QTreeView { @@ -59,10 +64,29 @@ private slots: void switchToEntryListMode(); void switchToGroupMode(); + /** + * @author Fonic <https://github.com/fonic> + * Slots for header context menu and actions + */ + void showHeaderMenu(const QPoint& position); + void toggleColumnVisibility(QAction *action); + void fitColumnsToWindow(); + void fitColumnsToContents(); + void resetViewToDefaults(); + private: EntryModel* const m_model; SortFilterHideProxyModel* const m_sortModel; bool m_inEntryListMode; + + /** + * @author Fonic <https://github.com/fonic> + * Properties to store header context menu and actions + */ + QMenu* m_headerMenu; + QAction* m_hideUsernamesAction; + QAction* m_hidePasswordsAction; + QActionGroup* m_columnActions; }; #endif // KEEPASSX_ENTRYVIEW_H From 66291ecc3861579382ddc4f7560620b8cb9109f8 Mon Sep 17 00:00:00 2001 From: Fonic <fonic.maxxim@live.com> Date: Thu, 21 Dec 2017 10:32:07 +0100 Subject: [PATCH 279/402] Update GUI test to account for changed column indices Update clicks within entry view referencing column indices to account for changed column indices due to new way of showing/hiding column Entry Model::ParentGroup. This column now has fixed index 0 wether it's shown or hidden, thus all indices need to be shifted by +1 when not in search mode --- tests/gui/TestGui.cpp | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/tests/gui/TestGui.cpp b/tests/gui/TestGui.cpp index d1a251069..00b957241 100644 --- a/tests/gui/TestGui.cpp +++ b/tests/gui/TestGui.cpp @@ -686,6 +686,21 @@ void TestGui::testSearch() QTRY_COMPARE(m_dbWidget->currentMode(), DatabaseWidget::ViewMode); } +/** + * @author Fonic <https://github.com/fonic> + * Update clicks within entry view referencing column indices to account + * for changed column indices due to new way of showing/hiding column Entry + * Model::ParentGroup. This column now has fixed index 0 wether it's shown + * or hidden, thus all indices need to be shifted by +1 when not in search + * mode (which is the case within this entire method) + * + * Old: + * clickIndex(entryView->model()->index(row, column), button); + * + * New: + * clickIndex(entryView->model()->index(row, column+1), button); + * + */ void TestGui::testDeleteEntry() { // Add canned entries for consistent testing @@ -698,7 +713,7 @@ void TestGui::testDeleteEntry() QWidget* entryDeleteWidget = toolBar->widgetForAction(entryDeleteAction); QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::ViewMode); - clickIndex(entryView->model()->index(1, 0), entryView, Qt::LeftButton); + clickIndex(entryView->model()->index(1, 1), entryView, Qt::LeftButton); QVERIFY(entryDeleteWidget->isVisible()); QVERIFY(entryDeleteWidget->isEnabled()); QVERIFY(!m_db->metadata()->recycleBin()); @@ -709,8 +724,8 @@ void TestGui::testDeleteEntry() QCOMPARE(entryView->model()->rowCount(), 3); QCOMPARE(m_db->metadata()->recycleBin()->entries().size(), 1); - clickIndex(entryView->model()->index(1, 0), entryView, Qt::LeftButton); - clickIndex(entryView->model()->index(2, 0), entryView, Qt::LeftButton, Qt::ControlModifier); + clickIndex(entryView->model()->index(1, 1), entryView, Qt::LeftButton); + clickIndex(entryView->model()->index(2, 1), entryView, Qt::LeftButton, Qt::ControlModifier); QCOMPARE(entryView->selectionModel()->selectedRows().size(), 2); MessageBox::setNextAnswer(QMessageBox::No); @@ -729,7 +744,7 @@ void TestGui::testDeleteEntry() groupView, Qt::LeftButton); QCOMPARE(groupView->currentGroup()->name(), m_db->metadata()->recycleBin()->name()); - clickIndex(entryView->model()->index(0, 0), entryView, Qt::LeftButton); + clickIndex(entryView->model()->index(0, 1), entryView, Qt::LeftButton); MessageBox::setNextAnswer(QMessageBox::No); QTest::mouseClick(entryDeleteWidget, Qt::LeftButton); QCOMPARE(entryView->model()->rowCount(), 3); @@ -740,8 +755,8 @@ void TestGui::testDeleteEntry() QCOMPARE(entryView->model()->rowCount(), 2); QCOMPARE(m_db->metadata()->recycleBin()->entries().size(), 2); - clickIndex(entryView->model()->index(0, 0), entryView, Qt::LeftButton); - clickIndex(entryView->model()->index(1, 0), entryView, Qt::LeftButton, Qt::ControlModifier); + clickIndex(entryView->model()->index(0, 1), entryView, Qt::LeftButton); + clickIndex(entryView->model()->index(1, 1), entryView, Qt::LeftButton, Qt::ControlModifier); MessageBox::setNextAnswer(QMessageBox::Yes); QTest::mouseClick(entryDeleteWidget, Qt::LeftButton); QCOMPARE(entryView->model()->rowCount(), 0); From 18be1a0254d1c1381738cd1d52aaf9a03c34c0aa Mon Sep 17 00:00:00 2001 From: Fonic <fonic.maxxim@live.com> Date: Thu, 21 Dec 2017 13:52:01 +0100 Subject: [PATCH 280/402] Add 'copy-on-doubleclick' feature to entry view table Add 'copy-on-doubleclick' feature to entry view table by extending already existing DatabaseWidget::entryActivationSignalReceived(). Currently, username, password and notes are copyied on doubleclick, while doubleclicking URL still opens browser as before. Can easily be extended to account for other/additional columns (switch-case). --- src/gui/DatabaseWidget.cpp | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 8f4fc9bb3..013818c90 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -908,12 +908,39 @@ void DatabaseWidget::unlockDatabase(bool accepted) } } +/** + * @author Fonic <https://github.com/fonic> + * Add 'copy-on-doubleclick' functionality for certain columns + * + * TODO: + * If pull request #1298 gets merged, double-clicking column 'Attachments' + * could open the new details view (see second screenshot) + */ void DatabaseWidget::entryActivationSignalReceived(Entry* entry, EntryModel::ModelColumn column) { - if (column == EntryModel::Url && !entry->url().isEmpty()) { - openUrlForEntry(entry); + /* Should never happen */ + if (!entry) { + Q_ASSERT(false); + return; } - else { + + /* Decide what to do based on specified column */ + switch (column) { + case EntryModel::Username: + setClipboardTextAndMinimize(entry->resolveMultiplePlaceholders(entry->username())); + break; + case EntryModel::Password: + setClipboardTextAndMinimize(entry->resolveMultiplePlaceholders(entry->password())); + break; + case EntryModel::Url: + if (!entry->url().isEmpty()) { + openUrlForEntry(entry); + } + break; + case EntryModel::Notes: + setClipboardTextAndMinimize(entry->resolveMultiplePlaceholders(entry->notes())); + break; + default: switchToEntryEdit(entry); } } From e3a5a22b8445e36e7eb99ed9844daf7cb2d71740 Mon Sep 17 00:00:00 2001 From: Fonic <fonic.maxxim@live.com> Date: Sat, 23 Dec 2017 08:40:00 +0100 Subject: [PATCH 281/402] Update state syncer to account for new features Update state syncer (class DatabaseWidgetStateSync) to account for new features: - properly sync view state when switching tabs - properly read/write view state from/to config Update classes EntryModel and EntryView to consistenly name list/search modes. Before, both classes defined list mode as 'group mode' and search mode as 'entry list mode', which differed from naming in other classes such as DatabaseWidget. --- src/core/Config.cpp | 7 + src/gui/DatabaseWidget.cpp | 74 ++++++--- src/gui/DatabaseWidget.h | 27 +++- src/gui/DatabaseWidgetStateSync.cpp | 107 +++++++++++-- src/gui/DatabaseWidgetStateSync.h | 25 +++- src/gui/entry/EntryModel.cpp | 4 +- src/gui/entry/EntryModel.h | 9 +- src/gui/entry/EntryView.cpp | 225 ++++++++++++++++++++-------- src/gui/entry/EntryView.h | 41 ++++- 9 files changed, 408 insertions(+), 111 deletions(-) diff --git a/src/core/Config.cpp b/src/core/Config.cpp index 96fd385ff..2153d65f6 100644 --- a/src/core/Config.cpp +++ b/src/core/Config.cpp @@ -138,6 +138,13 @@ void Config::init(const QString& fileName) m_defaults.insert("GUI/DarkTrayIcon", false); m_defaults.insert("GUI/MinimizeToTray", false); m_defaults.insert("GUI/MinimizeOnClose", false); + /** + * @author Fonic <https://github.com/fonic> + * Set defaults for state of 'Hide Usernames'/'Hide Passwords' settings + * of entry view + */ + m_defaults.insert("GUI/EntryHideUsernames", false); + m_defaults.insert("GUI/EntryHidePasswords", true); } Config* Config::instance() diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 013818c90..98547c0b8 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -181,7 +181,13 @@ DatabaseWidget::DatabaseWidget(Database* db, QWidget* parent) connect(m_mainSplitter, SIGNAL(splitterMoved(int,int)), SIGNAL(mainSplitterSizesChanged())); connect(m_detailSplitter, SIGNAL(splitterMoved(int,int)), SIGNAL(detailSplitterSizesChanged())); - connect(m_entryView->header(), SIGNAL(sectionResized(int,int,int)), SIGNAL(entryColumnSizesChanged())); + + /** + * @author Fonic <https://github.com/fonic> + * Connect signal to pass through state changes of entry view view + */ + connect(m_entryView, SIGNAL(viewStateChanged()), SIGNAL(entryViewStateChanged())); + connect(m_groupView, SIGNAL(groupChanged(Group*)), this, SLOT(onGroupChanged(Group*))); connect(m_groupView, SIGNAL(groupChanged(Group*)), SIGNAL(groupChanged())); connect(m_entryView, SIGNAL(entryActivated(Entry*, EntryModel::ModelColumn)), @@ -290,28 +296,58 @@ void DatabaseWidget::setDetailSplitterSizes(const QList<int> &sizes) m_detailSplitter->setSizes(sizes); } -QList<int> DatabaseWidget::entryHeaderViewSizes() const +/** + * @author Fonic <https://github.com/fonic> + * Get current state of entry view 'Hide Usernames' setting + */ +bool DatabaseWidget::entryViewHideUsernames() const { - QList<int> sizes; - - for (int i = 0; i < m_entryView->header()->count(); i++) { - sizes.append(m_entryView->header()->sectionSize(i)); - } - - return sizes; + return m_entryView->hideUsernames(); } -void DatabaseWidget::setEntryViewHeaderSizes(const QList<int>& sizes) +/** + * @author Fonic <https://github.com/fonic> + * Set state of entry view 'Hide Usernames' setting + */ +void DatabaseWidget::setEntryViewHideUsernames(const bool hide) { - const bool enoughSizes = sizes.size() == m_entryView->header()->count(); - Q_ASSERT(enoughSizes); - if (!enoughSizes) { - return; - } + m_entryView->setHideUsernames(hide); +} - for (int i = 0; i < sizes.size(); i++) { - m_entryView->header()->resizeSection(i, sizes[i]); - } +/** + * @author Fonic <https://github.com/fonic> + * Get current state of entry view 'Hide Passwords' setting + */ +bool DatabaseWidget::entryViewHidePasswords() const +{ + return m_entryView->hidePasswords(); +} + +/** + * @author Fonic <https://github.com/fonic> + * Set state of entry view 'Hide Passwords' setting + */ +void DatabaseWidget::setEntryViewHidePasswords(const bool hide) +{ + m_entryView->setHidePasswords(hide); +} + +/** + * @author Fonic <https://github.com/fonic> + * Get current state of entry view view + */ +QByteArray DatabaseWidget::entryViewViewState() const +{ + return m_entryView->viewState(); +} + +/** + * @author Fonic <https://github.com/fonic> + * Set state of entry view view + */ +bool DatabaseWidget::setEntryViewViewState(const QByteArray& state) const +{ + return m_entryView->setViewState(state); } void DatabaseWidget::clearAllWidgets() @@ -1178,7 +1214,7 @@ bool DatabaseWidget::canDeleteCurrentGroup() const bool DatabaseWidget::isInSearchMode() const { - return m_entryView->inEntryListMode(); + return m_entryView->inSearchMode(); } Group* DatabaseWidget::currentGroup() const diff --git a/src/gui/DatabaseWidget.h b/src/gui/DatabaseWidget.h index 3643bb03a..3f459e3f6 100644 --- a/src/gui/DatabaseWidget.h +++ b/src/gui/DatabaseWidget.h @@ -92,8 +92,23 @@ public: void setMainSplitterSizes(const QList<int>& sizes); QList<int> detailSplitterSizes() const; void setDetailSplitterSizes(const QList<int>& sizes); - QList<int> entryHeaderViewSizes() const; - void setEntryViewHeaderSizes(const QList<int>& sizes); + + /** + * @author Fonic <https://github.com/fonic> + * Methods to get/set state of entry view 'Hide Usernames'/'Hide + * Passwords' settings + */ + bool entryViewHideUsernames() const; + void setEntryViewHideUsernames(const bool hide); + bool entryViewHidePasswords() const; + void setEntryViewHidePasswords(const bool hide); + /** + * @author Fonic <https://github.com/fonic> + * Methods to get/set state of entry view view state + */ + QByteArray entryViewViewState() const; + bool setEntryViewViewState(const QByteArray& state) const; + void clearAllWidgets(); bool currentEntryHasTitle(); bool currentEntryHasUsername(); @@ -127,7 +142,13 @@ signals: void searchModeActivated(); void mainSplitterSizesChanged(); void detailSplitterSizesChanged(); - void entryColumnSizesChanged(); + + /** + * @author Fonic <https://github.com/fonic> + * Signal to notify about state changes entry view view + */ + void entryViewStateChanged(); + void updateSearch(QString text); public slots: diff --git a/src/gui/DatabaseWidgetStateSync.cpp b/src/gui/DatabaseWidgetStateSync.cpp index 57a3dcf86..e8808d5d0 100644 --- a/src/gui/DatabaseWidgetStateSync.cpp +++ b/src/gui/DatabaseWidgetStateSync.cpp @@ -27,16 +27,40 @@ DatabaseWidgetStateSync::DatabaseWidgetStateSync(QObject* parent) { m_mainSplitterSizes = variantToIntList(config()->get("GUI/SplitterState")); m_detailSplitterSizes = variantToIntList(config()->get("GUI/DetailSplitterState")); - m_columnSizesList = variantToIntList(config()->get("GUI/EntryListColumnSizes")); - m_columnSizesSearch = variantToIntList(config()->get("GUI/EntrySearchColumnSizes")); + + /** + * @author Fonic <https://github.com/fonic> + * Load state of entry view 'Hide Usernames'/'Hide Passwords' settings + */ + m_entryHideUsernames = config()->get("GUI/EntryHideUsernames").toBool(); + m_entryHidePasswords = config()->get("GUI/EntryHidePasswords").toBool(); + + /** + * @author Fonic <https://github.com/fonic> + * Load states of entry view list/search view + */ + m_entryListViewState = config()->get("GUI/EntryListViewState").toByteArray(); + m_entrySearchViewState = config()->get("GUI/EntrySearchViewState").toByteArray(); } DatabaseWidgetStateSync::~DatabaseWidgetStateSync() { config()->set("GUI/SplitterState", intListToVariant(m_mainSplitterSizes)); config()->set("GUI/DetailSplitterState", intListToVariant(m_detailSplitterSizes)); - config()->set("GUI/EntryListColumnSizes", intListToVariant(m_columnSizesList)); - config()->set("GUI/EntrySearchColumnSizes", intListToVariant(m_columnSizesSearch)); + + /** + * @author Fonic <https://github.com/fonic> + * Save state of entry view 'Hide Usernames'/'Hide Passwords' settings + */ + config()->set("GUI/EntryHideUsernames", m_entryHideUsernames); + config()->set("GUI/EntryHidePasswords", m_entryHidePasswords); + + /** + * @author Fonic <https://github.com/fonic> + * Save states of entry view list/search view + */ + config()->set("GUI/EntryListViewState", m_entryListViewState); + config()->set("GUI/EntrySearchViewState", m_entrySearchViewState); } void DatabaseWidgetStateSync::setActive(DatabaseWidget* dbWidget) @@ -70,8 +94,14 @@ void DatabaseWidgetStateSync::setActive(DatabaseWidget* dbWidget) SLOT(updateSplitterSizes())); connect(m_activeDbWidget, SIGNAL(detailSplitterSizesChanged()), SLOT(updateSplitterSizes())); - connect(m_activeDbWidget, SIGNAL(entryColumnSizesChanged()), - SLOT(updateColumnSizes())); + + /** + * @author Fonic <https://github.com/fonic> + * Connect signal to receive state changes of entry view view + */ + connect(m_activeDbWidget, SIGNAL(entryViewStateChanged()), + SLOT(updateViewState())); + connect(m_activeDbWidget, SIGNAL(listModeActivated()), SLOT(restoreListView())); connect(m_activeDbWidget, SIGNAL(searchModeActivated()), @@ -83,19 +113,59 @@ void DatabaseWidgetStateSync::setActive(DatabaseWidget* dbWidget) } } +/** + * @author Fonic <https://github.com/fonic> + * Restore entry view list view state + * + * NOTE: + * States of entry view 'Hide Usernames'/'Hide Passwords' settings are considered + * 'global', i.e. they are the same for both list and search mode + * + * NOTE: + * If m_entryListViewState is empty, it is the first time after clean/invalid + * config that list view is activated. Thus, save its current state. Without + * this, m_entryListViewState would remain empty until there is an actual view + * state change (e.g. column is resized) + */ void DatabaseWidgetStateSync::restoreListView() { - if (!m_columnSizesList.isEmpty()) { - m_activeDbWidget->setEntryViewHeaderSizes(m_columnSizesList); + m_activeDbWidget->setEntryViewHideUsernames(m_entryHideUsernames); + m_activeDbWidget->setEntryViewHidePasswords(m_entryHidePasswords); + + if (!m_entryListViewState.isEmpty()) { + m_activeDbWidget->setEntryViewViewState(m_entryListViewState); + } + else { + m_entryListViewState = m_activeDbWidget->entryViewViewState(); } m_blockUpdates = false; } +/** + * @author Fonic <https://github.com/fonic> + * Restore entry view search view state + * + * NOTE: + * States of entry view 'Hide Usernames'/'Hide Passwords' settings are considered + * 'global', i.e. they are the same for both list and search mode + * + * NOTE: + * If m_entrySearchViewState is empty, it is the first time after clean/invalid + * config that search view is activated. Thus, save its current state. Without + * this, m_entrySearchViewState would remain empty until there is an actual view + * state change (e.g. column is resized) + */ void DatabaseWidgetStateSync::restoreSearchView() { - if (!m_columnSizesSearch.isEmpty()) { - m_activeDbWidget->setEntryViewHeaderSizes(m_columnSizesSearch); + m_activeDbWidget->setEntryViewHideUsernames(m_entryHideUsernames); + m_activeDbWidget->setEntryViewHidePasswords(m_entryHidePasswords); + + if (!m_entrySearchViewState.isEmpty()) { + m_activeDbWidget->setEntryViewViewState(m_entrySearchViewState); + } + else { + m_entrySearchViewState = m_activeDbWidget->entryViewViewState(); } m_blockUpdates = false; @@ -116,17 +186,26 @@ void DatabaseWidgetStateSync::updateSplitterSizes() m_detailSplitterSizes = m_activeDbWidget->detailSplitterSizes(); } -void DatabaseWidgetStateSync::updateColumnSizes() +/** + * @author Fonic <https://github.com/fonic> + * Update entry view list/search view state (NOTE: states of entry view + * 'Hide Usernames'/'Hide Passwords' settings are considered 'global', + * i.e. they are the same for both list and search mode) + */ +void DatabaseWidgetStateSync::updateViewState() { if (m_blockUpdates) { return; } - if (m_activeDbWidget->isGroupSelected()) { - m_columnSizesList = m_activeDbWidget->entryHeaderViewSizes(); + m_entryHideUsernames = m_activeDbWidget->entryViewHideUsernames(); + m_entryHidePasswords = m_activeDbWidget->entryViewHidePasswords(); + + if (m_activeDbWidget->isInSearchMode()) { + m_entrySearchViewState = m_activeDbWidget->entryViewViewState(); } else { - m_columnSizesSearch = m_activeDbWidget->entryHeaderViewSizes(); + m_entryListViewState = m_activeDbWidget->entryViewViewState(); } } diff --git a/src/gui/DatabaseWidgetStateSync.h b/src/gui/DatabaseWidgetStateSync.h index 79a8ded38..be5fcb5d9 100644 --- a/src/gui/DatabaseWidgetStateSync.h +++ b/src/gui/DatabaseWidgetStateSync.h @@ -37,7 +37,12 @@ public slots: private slots: void blockUpdates(); void updateSplitterSizes(); - void updateColumnSizes(); + + /** + * @author Fonic <https://github.com/fonic> + * Slot to update entry view view state + */ + void updateViewState(); private: static QList<int> variantToIntList(const QVariant& variant); @@ -48,8 +53,22 @@ private: bool m_blockUpdates; QList<int> m_mainSplitterSizes; QList<int> m_detailSplitterSizes; - QList<int> m_columnSizesList; - QList<int> m_columnSizesSearch; + + /** + * @author Fonic <https://github.com/fonic> + * Properties to store state of entry view 'Hide Usernames'/'Hide + * Passwords' settings + */ + bool m_entryHideUsernames; + bool m_entryHidePasswords; + + /** + * @author Fonic <https://github.com/fonic> + * Properties to store states of entry view list/search view (replaces + * m_columnSizesList/m_columnSizesSearch) + */ + QByteArray m_entryListViewState; + QByteArray m_entrySearchViewState; }; #endif // KEEPASSX_DATABASEWIDGETSTATESYNC_H diff --git a/src/gui/entry/EntryModel.cpp b/src/gui/entry/EntryModel.cpp index e03b0f791..18d6f1a00 100644 --- a/src/gui/entry/EntryModel.cpp +++ b/src/gui/entry/EntryModel.cpp @@ -97,7 +97,7 @@ void EntryModel::setGroup(Group* group) makeConnections(group); endResetModel(); - emit switchedToGroupMode(); + emit switchedToListMode(); } void EntryModel::setEntryList(const QList<Entry*>& entries) @@ -134,7 +134,7 @@ void EntryModel::setEntryList(const QList<Entry*>& entries) } endResetModel(); - emit switchedToEntryListMode(); + emit switchedToSearchMode(); } int EntryModel::rowCount(const QModelIndex& parent) const diff --git a/src/gui/entry/EntryModel.h b/src/gui/entry/EntryModel.h index 5b4f5e734..7540df986 100644 --- a/src/gui/entry/EntryModel.h +++ b/src/gui/entry/EntryModel.h @@ -75,8 +75,13 @@ public: void setHidePasswords(const bool hide); signals: - void switchedToEntryListMode(); - void switchedToGroupMode(); + /** + * @author Fonic <https://github.com/fonic> + * Signals to notify about list/search mode switches (NOTE: previously + * named 'switchedToGroupMode'/'switchedToEntryListMode') + */ + void switchedToListMode(); + void switchedToSearchMode(); /** * @author Fonic <https://github.com/fonic> diff --git a/src/gui/entry/EntryView.cpp b/src/gui/entry/EntryView.cpp index 6657818d2..e52944e55 100644 --- a/src/gui/entry/EntryView.cpp +++ b/src/gui/entry/EntryView.cpp @@ -43,7 +43,7 @@ EntryView::EntryView(QWidget* parent) : QTreeView(parent) , m_model(new EntryModel(this)) , m_sortModel(new SortFilterHideProxyModel(this)) - , m_inEntryListMode(false) + , m_inSearchMode(false) { m_sortModel->setSourceModel(m_model); m_sortModel->setDynamicSortFilter(true); @@ -70,8 +70,20 @@ EntryView::EntryView(QWidget* parent) connect(this, SIGNAL(doubleClicked(QModelIndex)), SLOT(emitEntryActivated(QModelIndex))); connect(selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), SIGNAL(entrySelectionChanged())); - connect(m_model, SIGNAL(switchedToEntryListMode()), SLOT(switchToEntryListMode())); - connect(m_model, SIGNAL(switchedToGroupMode()), SLOT(switchToGroupMode())); + /** + * @author Fonic <https://github.com/fonic> + * Connect signals to get notified about list/search mode switches (NOTE: + * previously named 'switch[ed]ToGroupMode'/'switch[ed]ToEntryListMode') + */ + connect(m_model, SIGNAL(switchedToListMode()), SLOT(switchToListMode())); + connect(m_model, SIGNAL(switchedToSearchMode()), SLOT(switchToSearchMode())); + /** + * @author Fonic <https://github.com/fonic> + * Connect signals to notify about changes of view state when state of + * 'Hide Usernames'/'Hide Passwords' settings changes in model + */ + connect(m_model, SIGNAL(hideUsernamesChanged()), SIGNAL(viewStateChanged())); + connect(m_model, SIGNAL(hidePasswordsChanged()), SIGNAL(viewStateChanged())); connect(this, SIGNAL(clicked(QModelIndex)), SLOT(emitEntryPressed(QModelIndex))); @@ -118,25 +130,51 @@ EntryView::EntryView(QWidget* parent) * - Disable stretching of last section (interferes with fitting columns * to window) * - Associate with context menu + * - Connect signals to notify about changes of view state when state + * of header changes */ header()->setDefaultSectionSize(100); header()->setStretchLastSection(false); header()->setContextMenuPolicy(Qt::CustomContextMenu); connect(header(), SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showHeaderMenu(QPoint))); + connect(header(), SIGNAL(sectionCountChanged(int, int)), this, SIGNAL(viewStateChanged())); + connect(header(), SIGNAL(sectionMoved(int, int, int)), this, SIGNAL(viewStateChanged())); + connect(header(), SIGNAL(sectionResized(int, int, int)), this, SIGNAL(viewStateChanged())); + connect(header(), SIGNAL(sortIndicatorChanged(int, Qt::SortOrder)), this, SIGNAL(viewStateChanged())); /** * @author Fonic <https://github.com/fonic> - * Finalize setup by resetting view to defaults. Although not really - * necessary at this point, it makes sense in order to avoid duplicating - * code (sorting order, visibility of first column etc.) + * Fit columns to window * * TODO: * Not working as expected, columns will end up being very small, most - * likely due to EntryView not being sized properly at this time. Either - * find a way to make this work by analizing when/where EntryView is - * created or remove + * likely due to EntryView not being sized properly at this time. Find + * a way to make this work by analizing when/where EntryView is created */ - //resetViewToDefaults(); + //fitColumnsToWindow(); + + /** + * @author Fonic <https://github.com/fonic> + * Configure default search view state and save for later use + */ + header()->showSection(EntryModel::ParentGroup); + m_sortModel->sort(EntryModel::ParentGroup, Qt::AscendingOrder); + sortByColumn(EntryModel::ParentGroup, Qt::AscendingOrder); + m_defaultSearchViewState = header()->saveState(); + + /** + * @author Fonic <https://github.com/fonic> + * Configure default list view state and save for later use + * + * NOTE: + * Default list view is intentionally configured last since this is the + * view that's supposed to be active after initialization as m_inSearchMode + * is initialized with 'false' + */ + header()->hideSection(EntryModel::ParentGroup); + m_sortModel->sort(EntryModel::Title, Qt::AscendingOrder); + sortByColumn(EntryModel::Title, Qt::AscendingOrder); + m_defaultListViewState = header()->saveState(); } void EntryView::keyPressEvent(QKeyEvent* event) @@ -175,9 +213,9 @@ void EntryView::setFirstEntryActive() } } -bool EntryView::inEntryListMode() +bool EntryView::inSearchMode() { - return m_inEntryListMode; + return m_inSearchMode; } void EntryView::emitEntryActivated(const QModelIndex& index) @@ -230,53 +268,112 @@ Entry* EntryView::entryFromIndex(const QModelIndex& index) } } -void EntryView::switchToEntryListMode() +/** + * @author Fonic <https://github.com/fonic> + * Switch to list mode, i.e. list entries of group (NOTE: previously named + * 'switchToGroupMode') + */ +void EntryView::switchToListMode() { - /** - * @author Fonic <https://github.com/fonic> - * Use header()->showSection() instead of m_sortModel->hideColumn() as - * the latter messes up column indices, interfering with code relying on - * proper indices - */ - header()->showSection(EntryModel::ParentGroup); - if (header()->sectionSize(EntryModel::ParentGroup) == 0) { - header()->resizeSection(EntryModel::ParentGroup, header()->defaultSectionSize()); + /* Check if already in this mode */ + if (!m_inSearchMode) { + return; } /** - * @author Fonic <https://github.com/fonic> - * Set sorting column and order (TODO: check what first two lines do, if - * they are actually necessary, if indices are still correct and if indices - * may be replaced by EntryModel::<column>) - */ - m_sortModel->sort(1, Qt::AscendingOrder); - m_sortModel->sort(0, Qt::AscendingOrder); - sortByColumn(EntryModel::ParentGroup, Qt::AscendingOrder); - - m_inEntryListMode = true; -} - -void EntryView::switchToGroupMode() -{ - /** - * @author Fonic <https://github.com/fonic> * Use header()->hideSection() instead of m_sortModel->hideColumn() as * the latter messes up column indices, interfering with code relying on * proper indices */ header()->hideSection(EntryModel::ParentGroup); - /** - * @author Fonic <https://github.com/fonic> - * Set sorting column and order (TODO: check what first two lines do, if - * they are actually necessary, if indices are still correct and if indices - * may be replaced by EntryModel::<column>) - */ - m_sortModel->sort(-1, Qt::AscendingOrder); - m_sortModel->sort(0, Qt::AscendingOrder); - sortByColumn(EntryModel::Title, Qt::AscendingOrder); + m_inSearchMode = false; +} - m_inEntryListMode = false; +/** + * @author Fonic <https://github.com/fonic> + * Switch to search mode, i.e. list search results (NOTE: previously named + * 'switchToEntryListMode') + */ +void EntryView::switchToSearchMode() +{ + /* Check if already in this mode */ + if (m_inSearchMode) { + return; + } + + /* + * Use header()->showSection() instead of m_sortModel->hideColumn() as + * the latter messes up column indices, interfering with code relying on + * proper indices + */ + header()->showSection(EntryModel::ParentGroup); + + /* + * Always set sorting to column 'Group', as it does not feel right to have + * the last known sort configuration of search view restored by 'Database + * WidgetStateSync', which is what happens without this + */ + m_sortModel->sort(EntryModel::ParentGroup, Qt::AscendingOrder); + sortByColumn(EntryModel::ParentGroup, Qt::AscendingOrder); + + m_inSearchMode = true; +} + +/** + * @author Fonic <https://github.com/fonic> + * Get current state of 'Hide Usernames' setting (NOTE: just pass-through for + * m_model) + */ +bool EntryView::hideUsernames() const +{ + return m_model->hideUsernames(); +} + +/** + * @author Fonic <https://github.com/fonic> + * Set state of 'Hide Usernames' setting (NOTE: just pass-through for m_model) + */ +void EntryView::setHideUsernames(const bool hide) +{ + m_model->setHideUsernames(hide); +} + +/** + * @author Fonic <https://github.com/fonic> + * Get current state of 'Hide Passwords' setting (NOTE: just pass-through for + * m_model) + */ +bool EntryView::hidePasswords() const +{ + return m_model->hidePasswords(); +} + +/** + * @author Fonic <https://github.com/fonic> + * Set state of 'Hide Passwords' setting (NOTE: just pass-through for m_model) + */ +void EntryView::setHidePasswords(const bool hide) +{ + m_model->setHidePasswords(hide); +} + +/** + * @author Fonic <https://github.com/fonic> + * Get current state of view + */ +QByteArray EntryView::viewState() const +{ + return header()->saveState(); +} + +/** + * @author Fonic <https://github.com/fonic> + * Set state of entry view view + */ +bool EntryView::setViewState(const QByteArray& state) const +{ + return header()->restoreState(state); } /** @@ -351,10 +448,16 @@ void EntryView::toggleColumnVisibility(QAction *action) * its implementation MUST call the corresponding parent method using * 'QTreeView::resizeEvent(event)'. Without this, fitting to window will * be broken and/or work unreliably (stumbled upon during testing) + * + * NOTE: + * Testing showed that it is absolutely necessary to emit signal 'viewState + * Changed' here. Without this, an incomplete view state might get saved by + * 'DatabaseWidgetStateSync' (e.g. only some columns resized) */ void EntryView::fitColumnsToWindow() { header()->resizeSections(QHeaderView::Stretch); + emit viewStateChanged(); } /** @@ -395,16 +498,17 @@ void EntryView::fitColumnsToContents() } header()->resizeSection(header()->logicalIndex(last), header()->sectionSize(last) + (header()->width() - width)); } + + /* + * This should not be necessary due to use of header()->resizeSection, + * but lets do it anyway for the sake of completeness + */ + emit viewStateChanged(); } /** * @author Fonic <https://github.com/fonic> * Reset view to defaults - * - * NOTE: - * header()->saveState()/restoreState() could also be used for this, but - * testing showed that it complicates things more than it helps when trying - * to account for current list mode */ void EntryView::resetViewToDefaults() { @@ -412,19 +516,12 @@ void EntryView::resetViewToDefaults() m_model->setHideUsernames(false); m_model->setHidePasswords(true); - /* Reset visibility, size and position of all columns */ - for (int colidx = 0; colidx < header()->count(); colidx++) { - header()->showSection(colidx); - header()->resizeSection(colidx, header()->defaultSectionSize()); - header()->moveSection(header()->visualIndex(colidx), colidx); - } - - /* Reenter current list mode (affects first column and sorting) */ - if (m_inEntryListMode) { - switchToEntryListMode(); + /* Reset columns (size, order, sorting etc.) */ + if (m_inSearchMode) { + header()->restoreState(m_defaultSearchViewState); } else { - switchToGroupMode(); + header()->restoreState(m_defaultListViewState); } /* Nicely fitting columns to window feels like a sane default */ diff --git a/src/gui/entry/EntryView.h b/src/gui/entry/EntryView.h index 2cadf0d82..5b99bec99 100644 --- a/src/gui/entry/EntryView.h +++ b/src/gui/entry/EntryView.h @@ -43,10 +43,27 @@ public: void setCurrentEntry(Entry* entry); Entry* entryFromIndex(const QModelIndex& index); void setEntryList(const QList<Entry*>& entries); - bool inEntryListMode(); + bool inSearchMode(); int numberOfSelectedEntries(); void setFirstEntryActive(); + /** + * @author Fonic <https://github.com/fonic> + * Methods to get/set state of 'Hide Usernames'/'Hide Passwords' settings + * (NOTE: these are just pass-through methods to avoid exposing entry model) + */ + bool hideUsernames() const; + void setHideUsernames(const bool hide); + bool hidePasswords() const; + void setHidePasswords(const bool hide); + + /** + * @author Fonic <https://github.com/fonic> + * Methods to get/set state of view + */ + QByteArray viewState() const; + bool setViewState(const QByteArray& state) const; + public slots: void setGroup(Group* group); @@ -54,6 +71,11 @@ signals: void entryActivated(Entry* entry, EntryModel::ModelColumn column); void entryPressed(Entry* entry); void entrySelectionChanged(); + /** + * @author Fonic <https://github.com/fonic> + * Signal to notify about changes of view state + */ + void viewStateChanged(); protected: void keyPressEvent(QKeyEvent* event) override; @@ -61,8 +83,13 @@ protected: private slots: void emitEntryActivated(const QModelIndex& index); void emitEntryPressed(const QModelIndex& index); - void switchToEntryListMode(); - void switchToGroupMode(); + /** + * @author Fonic <https://github.com/fonic> + * Methods to switch to list/search mode (NOTE: previously named 'switch + * ToGroupMode'/'switchToEntryListMode') + */ + void switchToListMode(); + void switchToSearchMode(); /** * @author Fonic <https://github.com/fonic> @@ -77,8 +104,14 @@ private slots: private: EntryModel* const m_model; SortFilterHideProxyModel* const m_sortModel; - bool m_inEntryListMode; + bool m_inSearchMode; + /** + * @author Fonic <https://github.com/fonic> + * Properties to store default view states used by resetViewToDefaults() + */ + QByteArray m_defaultListViewState; + QByteArray m_defaultSearchViewState; /** * @author Fonic <https://github.com/fonic> * Properties to store header context menu and actions From 161d0ea50fdd544fb5a64fd3b19297615d5a53f2 Mon Sep 17 00:00:00 2001 From: Fonic <fonic.maxxim@live.com> Date: Mon, 15 Jan 2018 10:06:45 +0100 Subject: [PATCH 282/402] Add column 'Paperclip' to entry view table Add additional column 'Paperclip' to entry view table: - add column itself - add display role data provider - add sort role data provider - update total column count --- src/gui/entry/EntryModel.cpp | 45 ++++++++++++++++++++++++++++-------- src/gui/entry/EntryModel.h | 12 ++++++++-- 2 files changed, 45 insertions(+), 12 deletions(-) diff --git a/src/gui/entry/EntryModel.cpp b/src/gui/entry/EntryModel.cpp index 18d6f1a00..12d85e499 100644 --- a/src/gui/entry/EntryModel.cpp +++ b/src/gui/entry/EntryModel.cpp @@ -42,9 +42,9 @@ * Decide which of the proposed options should be used (stars, bullet, black * circle) */ -//const QString EntryModel::HiddenContent("******"); -//const QString EntryModel::HiddenContent(QString(QChar(0x2022)).repeated(6)); -const QString EntryModel::HiddenContent(QString(QChar(0x25CF)).repeated(6)); +//const QString EntryModel::HiddenContentDisplay("******"); +//const QString EntryModel::HiddenContentDisplay(QString(QChar(0x2022)).repeated(6)); +const QString EntryModel::HiddenContentDisplay(QString(QChar(0x25CF)).repeated(6)); /** * @author Fonic <https://github.com/fonic> @@ -53,6 +53,18 @@ const QString EntryModel::HiddenContent(QString(QChar(0x25CF)).repeated(6)); */ const Qt::DateFormat EntryModel::DateFormat = Qt::DefaultLocaleShortDate; +/** + * @author Fonic <https://github.com/fonic> + * Define constant string used to display header and data of column 'Paper- + * clip' + * + * TODO: + * When using unicode, ASAN reports memory leaks, but when using a plain + * string like 'x', no leaks are reported. Check if this is something to + * worry about, might as well be a Qt bug + */ +const QString EntryModel::PaperClipDisplay(QString("\U0001f4ce")); + /** * @author Fonic <https://github.com/fonic> * Initialize 'Hide Usernames' and 'Hide Passwords' settings using sane @@ -152,14 +164,15 @@ int EntryModel::columnCount(const QModelIndex& parent) const /** * @author Fonic <https://github.com/fonic> * Change column count to include additional columns 'Password', 'Notes', - * 'Expires', 'Created', 'Modified', 'Accessed' and 'Attachments'. Also, - * return 0 when parent is valid as advised by Qt documentation + * 'Expires', 'Created', 'Modified', 'Accessed', 'Paperclip' and + * 'Attachments'. Also, return 0 when parent is valid as advised by Qt + * documentation */ if (parent.isValid()) { return 0; } else { - return 11; + return 12; } } @@ -176,7 +189,8 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const * @author Fonic <https://github.com/fonic> * * Add display data providers for additional columns 'Password', 'Notes', - * 'Expires', 'Created', 'Modified', 'Accessed' and 'Attachments' + * 'Expires', 'Created', 'Modified', 'Accessed', 'Paperclip' and + * 'Attachments' * * Add ability to display usernames and passwords hidden or visible * depending on current state of 'Hide Usernames' and 'Hide Passwords' @@ -211,7 +225,7 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const * of 'Hide Usernames' setting */ if (m_hideUsernames) { - result = EntryModel::HiddenContent; + result = EntryModel::HiddenContentDisplay; } else { //result = entry->username(); @@ -227,7 +241,7 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const * of 'Hide Passwords' setting */ if (m_hidePasswords) { - result = EntryModel::HiddenContent; + result = EntryModel::HiddenContentDisplay; } else { //result = entry->resolveMultiplePlaceholders(entry->password()); @@ -270,6 +284,9 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const case Accessed: result = entry->timeInfo().lastAccessTime().toLocalTime().toString(EntryModel::DateFormat); return result; + case Paperclip: + result = entry->attachments()->keys().isEmpty() ? QString() : EntryModel::PaperClipDisplay; + return result; case Attachments: /* * Display comma-separated list of attachments @@ -308,6 +325,10 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const * sorting would be based on string representation of dates, yielding un- * desired results) * + * Add sort data provider for column 'Paperclip', required to display + * entries with attachments above those without when sorting ascendingly + * (and vice versa when sorting descendingly) + * * NOTE: * Qt::UserRole is used as sort role, using 'm_sortModel->setSortRole(Qt:: * UserRole)' in EntryView.cpp, EntryView::EntryView() @@ -333,6 +354,8 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const return entry->timeInfo().lastModificationTime(); case Accessed: return entry->timeInfo().lastAccessTime(); + case Paperclip: + return entry->attachments()->keys().isEmpty() ? 1 : 0; default: /* * For all other columns, simply use data provided by Qt::Display- @@ -379,7 +402,7 @@ QVariant EntryModel::headerData(int section, Qt::Orientation orientation, int ro /** * @author Fonic <https://github.com/fonic> * Add captions for additional columns 'Password', 'Notes', 'Expires', - * 'Created', 'Modified', 'Accessed' and 'Attachments' + * 'Created', 'Modified', 'Accessed', 'Paperclip' and 'Attachments' */ if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { switch (section) { @@ -403,6 +426,8 @@ QVariant EntryModel::headerData(int section, Qt::Orientation orientation, int ro return tr("Modified"); case Accessed: return tr("Accessed"); + case Paperclip: + return EntryModel::PaperClipDisplay; case Attachments: return tr("Attachments"); } diff --git a/src/gui/entry/EntryModel.h b/src/gui/entry/EntryModel.h index 7540df986..75243e52f 100644 --- a/src/gui/entry/EntryModel.h +++ b/src/gui/entry/EntryModel.h @@ -45,7 +45,8 @@ public: Created = 7, Modified = 8, Accessed = 9, - Attachments = 10 + Paperclip = 10, + Attachments = 11 }; explicit EntryModel(QObject* parent = nullptr); @@ -130,7 +131,7 @@ private: * Constant string used to display hidden content in columns 'Username' * and 'Password' */ - static const QString HiddenContent; + static const QString HiddenContentDisplay; /** * @author Fonic <https://github.com/fonic> @@ -138,6 +139,13 @@ private: * 'Modified' and 'Accessed' */ static const Qt::DateFormat DateFormat; + + /** + * @author Fonic <https://github.com/fonic> + * Constant string used to display header and data of column 'Paper- + * clip' + */ + static const QString PaperClipDisplay; }; #endif // KEEPASSX_ENTRYMODEL_H From 9ff648177c23402f6a48433c28c4867479c8aef9 Mon Sep 17 00:00:00 2001 From: Fonic <fonic.maxxim@live.com> Date: Mon, 15 Jan 2018 10:24:28 +0100 Subject: [PATCH 283/402] Update entry model test to account for additional column 'Paperclip' Update comparison values of modelProxy->columnCount() to account for additional column 'Paperclip' --- tests/TestEntryModel.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/TestEntryModel.cpp b/tests/TestEntryModel.cpp index 49ae3b0d1..ab4ecf754 100644 --- a/tests/TestEntryModel.cpp +++ b/tests/TestEntryModel.cpp @@ -292,11 +292,11 @@ void TestEntryModel::testProxyModel() * @author Fonic <https://github.com/fonic> * Update comparison value of modelProxy->columnCount() to account for * additional columns 'Password', 'Notes', 'Expires', 'Created', 'Modified', - * 'Accessed' and 'Attachments' + * 'Accessed', 'Paperclip' and 'Attachments' */ QSignalSpy spyColumnRemove(modelProxy, SIGNAL(columnsAboutToBeRemoved(QModelIndex,int,int))); modelProxy->hideColumn(0, true); - QCOMPARE(modelProxy->columnCount(), 10); + QCOMPARE(modelProxy->columnCount(), 11); QVERIFY(spyColumnRemove.size() >= 1); int oldSpyColumnRemoveSize = spyColumnRemove.size(); @@ -314,11 +314,11 @@ void TestEntryModel::testProxyModel() * @author Fonic <https://github.com/fonic> * Update comparison value of modelProxy->columnCount() to account for * additional columns 'Password', 'Notes', 'Expires', 'Created', 'Modified', - * 'Accessed' and 'Attachments' + * 'Accessed', 'Paperclip' and 'Attachments' */ QSignalSpy spyColumnInsert(modelProxy, SIGNAL(columnsAboutToBeInserted(QModelIndex,int,int))); modelProxy->hideColumn(0, false); - QCOMPARE(modelProxy->columnCount(), 11); + QCOMPARE(modelProxy->columnCount(), 12); QVERIFY(spyColumnInsert.size() >= 1); int oldSpyColumnInsertSize = spyColumnInsert.size(); From 8c78aca69e114cd3caea519cefb1ddbf225d77f3 Mon Sep 17 00:00:00 2001 From: Fonic <fonic.maxxim@live.com> Date: Tue, 16 Jan 2018 13:20:45 +0100 Subject: [PATCH 284/402] Code cleanup Comprehensive code cleanup: - formatting - comments - obsolete code --- src/core/Config.cpp | 9 +- src/gui/DatabaseWidget.cpp | 62 +++---- src/gui/DatabaseWidget.h | 29 +-- src/gui/DatabaseWidgetStateSync.cpp | 118 +++++------- src/gui/DatabaseWidgetStateSync.h | 23 +-- src/gui/DetailsWidget.cpp | 2 +- src/gui/entry/EntryModel.cpp | 233 +++++------------------ src/gui/entry/EntryModel.h | 64 +------ src/gui/entry/EntryView.cpp | 276 ++++++++-------------------- src/gui/entry/EntryView.h | 46 +---- tests/gui/TestGui.cpp | 15 -- 11 files changed, 220 insertions(+), 657 deletions(-) diff --git a/src/core/Config.cpp b/src/core/Config.cpp index 2153d65f6..fafb3cfd4 100644 --- a/src/core/Config.cpp +++ b/src/core/Config.cpp @@ -138,13 +138,8 @@ void Config::init(const QString& fileName) m_defaults.insert("GUI/DarkTrayIcon", false); m_defaults.insert("GUI/MinimizeToTray", false); m_defaults.insert("GUI/MinimizeOnClose", false); - /** - * @author Fonic <https://github.com/fonic> - * Set defaults for state of 'Hide Usernames'/'Hide Passwords' settings - * of entry view - */ - m_defaults.insert("GUI/EntryHideUsernames", false); - m_defaults.insert("GUI/EntryHidePasswords", true); + m_defaults.insert("GUI/HideUsernames", false); + m_defaults.insert("GUI/HidePasswords", true); } Config* Config::instance() diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 98547c0b8..361ca36fe 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -181,13 +181,7 @@ DatabaseWidget::DatabaseWidget(Database* db, QWidget* parent) connect(m_mainSplitter, SIGNAL(splitterMoved(int,int)), SIGNAL(mainSplitterSizesChanged())); connect(m_detailSplitter, SIGNAL(splitterMoved(int,int)), SIGNAL(detailSplitterSizesChanged())); - - /** - * @author Fonic <https://github.com/fonic> - * Connect signal to pass through state changes of entry view view - */ connect(m_entryView, SIGNAL(viewStateChanged()), SIGNAL(entryViewStateChanged())); - connect(m_groupView, SIGNAL(groupChanged(Group*)), this, SLOT(onGroupChanged(Group*))); connect(m_groupView, SIGNAL(groupChanged(Group*)), SIGNAL(groupChanged())); connect(m_entryView, SIGNAL(entryActivated(Entry*, EntryModel::ModelColumn)), @@ -297,55 +291,49 @@ void DatabaseWidget::setDetailSplitterSizes(const QList<int> &sizes) } /** - * @author Fonic <https://github.com/fonic> * Get current state of entry view 'Hide Usernames' setting */ -bool DatabaseWidget::entryViewHideUsernames() const +bool DatabaseWidget::isUsernamesHidden() const { - return m_entryView->hideUsernames(); + return m_entryView->isUsernamesHidden(); } /** - * @author Fonic <https://github.com/fonic> * Set state of entry view 'Hide Usernames' setting */ -void DatabaseWidget::setEntryViewHideUsernames(const bool hide) +void DatabaseWidget::setUsernamesHidden(const bool hide) { - m_entryView->setHideUsernames(hide); + m_entryView->setUsernamesHidden(hide); } /** - * @author Fonic <https://github.com/fonic> * Get current state of entry view 'Hide Passwords' setting */ -bool DatabaseWidget::entryViewHidePasswords() const +bool DatabaseWidget::isPasswordsHidden() const { - return m_entryView->hidePasswords(); + return m_entryView->isPasswordsHidden(); } /** - * @author Fonic <https://github.com/fonic> * Set state of entry view 'Hide Passwords' setting */ -void DatabaseWidget::setEntryViewHidePasswords(const bool hide) +void DatabaseWidget::setPasswordsHidden(const bool hide) { - m_entryView->setHidePasswords(hide); + m_entryView->setPasswordsHidden(hide); } /** - * @author Fonic <https://github.com/fonic> - * Get current state of entry view view + * Get current view state of entry view */ -QByteArray DatabaseWidget::entryViewViewState() const +QByteArray DatabaseWidget::entryViewState() const { return m_entryView->viewState(); } /** - * @author Fonic <https://github.com/fonic> - * Set state of entry view view + * Set view state of entry view */ -bool DatabaseWidget::setEntryViewViewState(const QByteArray& state) const +bool DatabaseWidget::setEntryViewState(const QByteArray& state) const { return m_entryView->setViewState(state); } @@ -696,8 +684,8 @@ void DatabaseWidget::openUrlForEntry(Entry* entry) void DatabaseWidget::createGroup() { + Q_ASSERT(m_groupView->currentGroup()); if (!m_groupView->currentGroup()) { - Q_ASSERT(false); return; } @@ -710,8 +698,8 @@ void DatabaseWidget::createGroup() void DatabaseWidget::deleteGroup() { Group* currentGroup = m_groupView->currentGroup(); + Q_ASSERT(currentGroup && canDeleteCurrentGroup()); if (!currentGroup || !canDeleteCurrentGroup()) { - Q_ASSERT(false); return; } @@ -944,23 +932,14 @@ void DatabaseWidget::unlockDatabase(bool accepted) } } -/** - * @author Fonic <https://github.com/fonic> - * Add 'copy-on-doubleclick' functionality for certain columns - * - * TODO: - * If pull request #1298 gets merged, double-clicking column 'Attachments' - * could open the new details view (see second screenshot) - */ void DatabaseWidget::entryActivationSignalReceived(Entry* entry, EntryModel::ModelColumn column) { - /* Should never happen */ + Q_ASSERT(entry); if (!entry) { - Q_ASSERT(false); return; } - /* Decide what to do based on specified column */ + // Implement 'copy-on-doubleclick' functionality for certain columns switch (column) { case EntryModel::Username: setClipboardTextAndMinimize(entry->resolveMultiplePlaceholders(entry->username())); @@ -973,9 +952,12 @@ void DatabaseWidget::entryActivationSignalReceived(Entry* entry, EntryModel::Mod openUrlForEntry(entry); } break; - case EntryModel::Notes: - setClipboardTextAndMinimize(entry->resolveMultiplePlaceholders(entry->notes())); - break; + // TODO: switch to 'Notes' tab in details view/pane + //case EntryModel::Notes: + // break; + // TODO: switch to 'Attachments' tab in details view/pane + //case EntryModel::Attachments: + // break; default: switchToEntryEdit(entry); } diff --git a/src/gui/DatabaseWidget.h b/src/gui/DatabaseWidget.h index 3f459e3f6..ba799893a 100644 --- a/src/gui/DatabaseWidget.h +++ b/src/gui/DatabaseWidget.h @@ -92,23 +92,12 @@ public: void setMainSplitterSizes(const QList<int>& sizes); QList<int> detailSplitterSizes() const; void setDetailSplitterSizes(const QList<int>& sizes); - - /** - * @author Fonic <https://github.com/fonic> - * Methods to get/set state of entry view 'Hide Usernames'/'Hide - * Passwords' settings - */ - bool entryViewHideUsernames() const; - void setEntryViewHideUsernames(const bool hide); - bool entryViewHidePasswords() const; - void setEntryViewHidePasswords(const bool hide); - /** - * @author Fonic <https://github.com/fonic> - * Methods to get/set state of entry view view state - */ - QByteArray entryViewViewState() const; - bool setEntryViewViewState(const QByteArray& state) const; - + bool isUsernamesHidden() const; + void setUsernamesHidden(const bool hide); + bool isPasswordsHidden() const; + void setPasswordsHidden(const bool hide); + QByteArray entryViewState() const; + bool setEntryViewState(const QByteArray& state) const; void clearAllWidgets(); bool currentEntryHasTitle(); bool currentEntryHasUsername(); @@ -142,13 +131,7 @@ signals: void searchModeActivated(); void mainSplitterSizesChanged(); void detailSplitterSizesChanged(); - - /** - * @author Fonic <https://github.com/fonic> - * Signal to notify about state changes entry view view - */ void entryViewStateChanged(); - void updateSearch(QString text); public slots: diff --git a/src/gui/DatabaseWidgetStateSync.cpp b/src/gui/DatabaseWidgetStateSync.cpp index e8808d5d0..39904ed99 100644 --- a/src/gui/DatabaseWidgetStateSync.cpp +++ b/src/gui/DatabaseWidgetStateSync.cpp @@ -27,40 +27,20 @@ DatabaseWidgetStateSync::DatabaseWidgetStateSync(QObject* parent) { m_mainSplitterSizes = variantToIntList(config()->get("GUI/SplitterState")); m_detailSplitterSizes = variantToIntList(config()->get("GUI/DetailSplitterState")); - - /** - * @author Fonic <https://github.com/fonic> - * Load state of entry view 'Hide Usernames'/'Hide Passwords' settings - */ - m_entryHideUsernames = config()->get("GUI/EntryHideUsernames").toBool(); - m_entryHidePasswords = config()->get("GUI/EntryHidePasswords").toBool(); - - /** - * @author Fonic <https://github.com/fonic> - * Load states of entry view list/search view - */ - m_entryListViewState = config()->get("GUI/EntryListViewState").toByteArray(); - m_entrySearchViewState = config()->get("GUI/EntrySearchViewState").toByteArray(); + m_hideUsernames = config()->get("GUI/HideUsernames").toBool(); + m_hidePasswords = config()->get("GUI/HidePasswords").toBool(); + m_listViewState = config()->get("GUI/ListViewState").toByteArray(); + m_searchViewState = config()->get("GUI/SearchViewState").toByteArray(); } DatabaseWidgetStateSync::~DatabaseWidgetStateSync() { config()->set("GUI/SplitterState", intListToVariant(m_mainSplitterSizes)); config()->set("GUI/DetailSplitterState", intListToVariant(m_detailSplitterSizes)); - - /** - * @author Fonic <https://github.com/fonic> - * Save state of entry view 'Hide Usernames'/'Hide Passwords' settings - */ - config()->set("GUI/EntryHideUsernames", m_entryHideUsernames); - config()->set("GUI/EntryHidePasswords", m_entryHidePasswords); - - /** - * @author Fonic <https://github.com/fonic> - * Save states of entry view list/search view - */ - config()->set("GUI/EntryListViewState", m_entryListViewState); - config()->set("GUI/EntrySearchViewState", m_entrySearchViewState); + config()->set("GUI/HideUsernames", m_hideUsernames); + config()->set("GUI/HidePasswords", m_hidePasswords); + config()->set("GUI/ListViewState", m_listViewState); + config()->set("GUI/SearchViewState", m_searchViewState); } void DatabaseWidgetStateSync::setActive(DatabaseWidget* dbWidget) @@ -94,14 +74,8 @@ void DatabaseWidgetStateSync::setActive(DatabaseWidget* dbWidget) SLOT(updateSplitterSizes())); connect(m_activeDbWidget, SIGNAL(detailSplitterSizesChanged()), SLOT(updateSplitterSizes())); - - /** - * @author Fonic <https://github.com/fonic> - * Connect signal to receive state changes of entry view view - */ connect(m_activeDbWidget, SIGNAL(entryViewStateChanged()), SLOT(updateViewState())); - connect(m_activeDbWidget, SIGNAL(listModeActivated()), SLOT(restoreListView())); connect(m_activeDbWidget, SIGNAL(searchModeActivated()), @@ -114,58 +88,54 @@ void DatabaseWidgetStateSync::setActive(DatabaseWidget* dbWidget) } /** - * @author Fonic <https://github.com/fonic> * Restore entry view list view state * * NOTE: - * States of entry view 'Hide Usernames'/'Hide Passwords' settings are considered - * 'global', i.e. they are the same for both list and search mode + * States of entry view 'Hide Usernames'/'Hide Passwords' settings are global, + * i.e. they are the same for both list and search mode * * NOTE: - * If m_entryListViewState is empty, it is the first time after clean/invalid - * config that list view is activated. Thus, save its current state. Without - * this, m_entryListViewState would remain empty until there is an actual view - * state change (e.g. column is resized) + * If m_listViewState is empty, the list view has been activated for the first + * time after starting with a clean (or invalid) config. Thus, save the current + * state. Without this, m_listViewState would remain empty until there is an + * actual view state change (e.g. column is resized) */ void DatabaseWidgetStateSync::restoreListView() { - m_activeDbWidget->setEntryViewHideUsernames(m_entryHideUsernames); - m_activeDbWidget->setEntryViewHidePasswords(m_entryHidePasswords); + m_activeDbWidget->setUsernamesHidden(m_hideUsernames); + m_activeDbWidget->setPasswordsHidden(m_hidePasswords); - if (!m_entryListViewState.isEmpty()) { - m_activeDbWidget->setEntryViewViewState(m_entryListViewState); - } - else { - m_entryListViewState = m_activeDbWidget->entryViewViewState(); + if (!m_listViewState.isEmpty()) { + m_activeDbWidget->setEntryViewState(m_listViewState); + } else { + m_listViewState = m_activeDbWidget->entryViewState(); } m_blockUpdates = false; } /** - * @author Fonic <https://github.com/fonic> * Restore entry view search view state * * NOTE: - * States of entry view 'Hide Usernames'/'Hide Passwords' settings are considered - * 'global', i.e. they are the same for both list and search mode + * States of entry view 'Hide Usernames'/'Hide Passwords' settings are global, + * i.e. they are the same for both list and search mode * * NOTE: - * If m_entrySearchViewState is empty, it is the first time after clean/invalid - * config that search view is activated. Thus, save its current state. Without - * this, m_entrySearchViewState would remain empty until there is an actual view - * state change (e.g. column is resized) + * If m_searchViewState is empty, the search view has been activated for the + * first time after starting with a clean (or invalid) config. Thus, save the + * current state. Without this, m_searchViewState would remain empty until + * there is an actual view state change (e.g. column is resized) */ void DatabaseWidgetStateSync::restoreSearchView() { - m_activeDbWidget->setEntryViewHideUsernames(m_entryHideUsernames); - m_activeDbWidget->setEntryViewHidePasswords(m_entryHidePasswords); + m_activeDbWidget->setUsernamesHidden(m_hideUsernames); + m_activeDbWidget->setPasswordsHidden(m_hidePasswords); - if (!m_entrySearchViewState.isEmpty()) { - m_activeDbWidget->setEntryViewViewState(m_entrySearchViewState); - } - else { - m_entrySearchViewState = m_activeDbWidget->entryViewViewState(); + if (!m_searchViewState.isEmpty()) { + m_activeDbWidget->setEntryViewState(m_searchViewState); + } else { + m_searchViewState = m_activeDbWidget->entryViewState(); } m_blockUpdates = false; @@ -187,10 +157,11 @@ void DatabaseWidgetStateSync::updateSplitterSizes() } /** - * @author Fonic <https://github.com/fonic> - * Update entry view list/search view state (NOTE: states of entry view - * 'Hide Usernames'/'Hide Passwords' settings are considered 'global', - * i.e. they are the same for both list and search mode) + * Update entry view list/search view state + * + * NOTE: + * States of entry view 'Hide Usernames'/'Hide Passwords' settings are global, + * i.e. they are the same for both list and search mode */ void DatabaseWidgetStateSync::updateViewState() { @@ -198,14 +169,13 @@ void DatabaseWidgetStateSync::updateViewState() return; } - m_entryHideUsernames = m_activeDbWidget->entryViewHideUsernames(); - m_entryHidePasswords = m_activeDbWidget->entryViewHidePasswords(); + m_hideUsernames = m_activeDbWidget->isUsernamesHidden(); + m_hidePasswords = m_activeDbWidget->isPasswordsHidden(); if (m_activeDbWidget->isInSearchMode()) { - m_entrySearchViewState = m_activeDbWidget->entryViewViewState(); - } - else { - m_entryListViewState = m_activeDbWidget->entryViewViewState(); + m_searchViewState = m_activeDbWidget->entryViewState(); + } else { + m_listViewState = m_activeDbWidget->entryViewState(); } } @@ -219,8 +189,7 @@ QList<int> DatabaseWidgetStateSync::variantToIntList(const QVariant& variant) int size = var.toInt(&ok); if (ok) { result.append(size); - } - else { + } else { result.clear(); break; } @@ -239,4 +208,3 @@ QVariant DatabaseWidgetStateSync::intListToVariant(const QList<int>& list) return result; } - diff --git a/src/gui/DatabaseWidgetStateSync.h b/src/gui/DatabaseWidgetStateSync.h index be5fcb5d9..aca593f1f 100644 --- a/src/gui/DatabaseWidgetStateSync.h +++ b/src/gui/DatabaseWidgetStateSync.h @@ -37,11 +37,6 @@ public slots: private slots: void blockUpdates(); void updateSplitterSizes(); - - /** - * @author Fonic <https://github.com/fonic> - * Slot to update entry view view state - */ void updateViewState(); private: @@ -54,21 +49,11 @@ private: QList<int> m_mainSplitterSizes; QList<int> m_detailSplitterSizes; - /** - * @author Fonic <https://github.com/fonic> - * Properties to store state of entry view 'Hide Usernames'/'Hide - * Passwords' settings - */ - bool m_entryHideUsernames; - bool m_entryHidePasswords; + bool m_hideUsernames; + bool m_hidePasswords; - /** - * @author Fonic <https://github.com/fonic> - * Properties to store states of entry view list/search view (replaces - * m_columnSizesList/m_columnSizesSearch) - */ - QByteArray m_entryListViewState; - QByteArray m_entrySearchViewState; + QByteArray m_listViewState; + QByteArray m_searchViewState; }; #endif // KEEPASSX_DATABASEWIDGETSTATESYNC_H diff --git a/src/gui/DetailsWidget.cpp b/src/gui/DetailsWidget.cpp index 1d20984be..44c29f8f8 100644 --- a/src/gui/DetailsWidget.cpp +++ b/src/gui/DetailsWidget.cpp @@ -127,7 +127,7 @@ void DetailsWidget::getSelectedEntry(Entry* selectedEntry) shortPassword(m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->password()))); m_ui->passwordLabel->setToolTip(m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->password())); } else { - m_ui->passwordLabel->setText("****"); + m_ui->passwordLabel->setText(QString("\u25cf").repeated(6)); } QString url = m_currentEntry->webUrl(); diff --git a/src/gui/entry/EntryModel.cpp b/src/gui/entry/EntryModel.cpp index 12d85e499..4a583b30e 100644 --- a/src/gui/entry/EntryModel.cpp +++ b/src/gui/entry/EntryModel.cpp @@ -20,11 +20,6 @@ #include <QFont> #include <QMimeData> #include <QPalette> -/** - * @author Fonic <https://github.com/fonic> - * Add include required for additional columns 'Expires', 'Created', 'Modified' - * and 'Accessed' - */ #include <QDateTime> #include "core/DatabaseIcons.h" @@ -33,43 +28,15 @@ #include "core/Group.h" #include "core/Metadata.h" -/** - * @author Fonic <https://github.com/fonic> - * Define constant string used to display hidden content in columns 'Username' - * and 'Password' - * - * TODO: - * Decide which of the proposed options should be used (stars, bullet, black - * circle) - */ -//const QString EntryModel::HiddenContentDisplay("******"); -//const QString EntryModel::HiddenContentDisplay(QString(QChar(0x2022)).repeated(6)); -const QString EntryModel::HiddenContentDisplay(QString(QChar(0x25CF)).repeated(6)); +// String being displayed when hiding content +const QString EntryModel::HiddenContentDisplay(QString("\u25cf").repeated(6)); -/** - * @author Fonic <https://github.com/fonic> - * Define date format used to display dates in columns 'Expires', 'Created', - * 'Modified' and 'Accessed' - */ +// Format used to display dates const Qt::DateFormat EntryModel::DateFormat = Qt::DefaultLocaleShortDate; -/** - * @author Fonic <https://github.com/fonic> - * Define constant string used to display header and data of column 'Paper- - * clip' - * - * TODO: - * When using unicode, ASAN reports memory leaks, but when using a plain - * string like 'x', no leaks are reported. Check if this is something to - * worry about, might as well be a Qt bug - */ -const QString EntryModel::PaperClipDisplay(QString("\U0001f4ce")); +// Paperclip symbol +const QString EntryModel::PaperClipDisplay("\U0001f4ce"); -/** - * @author Fonic <https://github.com/fonic> - * Initialize 'Hide Usernames' and 'Hide Passwords' settings using sane - * defaults (usernames visible, passwords hidden) - */ EntryModel::EntryModel(QObject* parent) : QAbstractTableModel(parent) , m_group(nullptr) @@ -153,27 +120,19 @@ int EntryModel::rowCount(const QModelIndex& parent) const { if (parent.isValid()) { return 0; - } - else { + } else { return m_entries.size(); } } int EntryModel::columnCount(const QModelIndex& parent) const { - /** - * @author Fonic <https://github.com/fonic> - * Change column count to include additional columns 'Password', 'Notes', - * 'Expires', 'Created', 'Modified', 'Accessed', 'Paperclip' and - * 'Attachments'. Also, return 0 when parent is valid as advised by Qt - * documentation - */ + // Advised by Qt documentation if (parent.isValid()) { return 0; } - else { - return 12; - } + + return 12; } QVariant EntryModel::data(const QModelIndex& index, int role) const @@ -185,26 +144,6 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const Entry* entry = entryFromIndex(index); EntryAttributes* attr = entry->attributes(); - /** - * @author Fonic <https://github.com/fonic> - * - * Add display data providers for additional columns 'Password', 'Notes', - * 'Expires', 'Created', 'Modified', 'Accessed', 'Paperclip' and - * 'Attachments' - * - * Add ability to display usernames and passwords hidden or visible - * depending on current state of 'Hide Usernames' and 'Hide Passwords' - * settings - * - * TODO: - * Decide which of the additional columns should expand placeholders - * -> code added where applicable, but currently commented out - * - * Check what attr->isReference() does and if it applies to any of the - * additional columns - * -> code added for columns 'Password' and 'Notes', as EntryAttributes:: - * PasswordKey and EntryAttributes::NotesKey already existed - */ if (role == Qt::DisplayRole) { QString result; switch (index.column()) { @@ -216,63 +155,44 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const case Title: result = entry->resolveMultiplePlaceholders(entry->title()); if (attr->isReference(EntryAttributes::TitleKey)) { - result.prepend(tr("Ref: ","Reference abbreviation")); + result.prepend(tr("Ref: ", "Reference abbreviation")); } return result; case Username: - /* - * Display usernames hidden or visible according to current state - * of 'Hide Usernames' setting - */ if (m_hideUsernames) { result = EntryModel::HiddenContentDisplay; - } - else { - //result = entry->username(); + } else { result = entry->resolveMultiplePlaceholders(entry->username()); } if (attr->isReference(EntryAttributes::UserNameKey)) { - result.prepend(tr("Ref: ","Reference abbreviation")); + result.prepend(tr("Ref: ", "Reference abbreviation")); } return result; case Password: - /* - * Display passwords hidden or visible according to current state - * of 'Hide Passwords' setting - */ if (m_hidePasswords) { result = EntryModel::HiddenContentDisplay; - } - else { - //result = entry->resolveMultiplePlaceholders(entry->password()); - result = entry->password(); + } else { + result = entry->resolveMultiplePlaceholders(entry->password()); } if (attr->isReference(EntryAttributes::PasswordKey)) { - result.prepend(tr("Ref: ","Reference abbreviation")); + result.prepend(tr("Ref: ", "Reference abbreviation")); } return result; case Url: - //result = entry->resolveMultiplePlaceholders(entry->displayUrl()); - result = entry->displayUrl(); + result = entry->resolveMultiplePlaceholders(entry->displayUrl()); if (attr->isReference(EntryAttributes::URLKey)) { - result.prepend(tr("Ref: ","Reference abbreviation")); + result.prepend(tr("Ref: ", "Reference abbreviation")); } return result; case Notes: - /* - * Display only first line of notes in simplified format like - * KeePassX does - */ - //result = entry->resolveMultiplePlaceholders(entry->notes().section("\n", 0, 0).simplified()); - result = entry->notes().section("\n", 0, 0).simplified(); + // Display only first line of notes in simplified format + result = entry->resolveMultiplePlaceholders(entry->notes().section("\n", 0, 0).simplified()); if (attr->isReference(EntryAttributes::NotesKey)) { - result.prepend(tr("Ref: ","Reference abbreviation")); + result.prepend(tr("Ref: ", "Reference abbreviation")); } return result; case Expires: - /* - * Display either date of expiry or 'Never' like KeePassX does - */ + // Display either date of expiry or 'Never' result = entry->timeInfo().expires() ? entry->timeInfo().expiryTime().toLocalTime().toString(EntryModel::DateFormat) : tr("Never"); return result; case Created: @@ -288,65 +208,25 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const result = entry->attachments()->keys().isEmpty() ? QString() : EntryModel::PaperClipDisplay; return result; case Attachments: - /* - * Display comma-separated list of attachments - * - * TODO: - * 'entry->attachments()->keys().join()' works locally, yet it fails - * on GitHub/Travis CI, most likely due to an older Qt version, thus - * using loop for now (http://doc.qt.io/qt-5/qlist.html#more-members) - */ - //result = entry->resolveMultiplePlaceholders(entry->attachments()->keys().join(", ")); - //result = entry->attachments()->keys().join(", "); - + // Display comma-separated list of attachments QList<QString> attachments = entry->attachments()->keys(); - for (int i=0; i < attachments.size(); i++) { + for (int i = 0; i < attachments.size(); ++i) { if (result.isEmpty()) { result.append(attachments.at(i)); + continue; } - else { - result.append(QString(", ") + attachments.at(i)); - } + result.append(QString(", ") + attachments.at(i)); } - //result = entry->resolveMultiplePlaceholders(result); return result; } - - } - /** - * @author Fonic <https://github.com/fonic> - * - * Add sort data providers for columns 'Username' and 'Password', required - * for correct sorting even if displayed hidden (i.e. settings 'Hide User- - * names' and/or 'Hide Passwords' are enabled) - * - * Add sort data providers for columns 'Expires', 'Created', 'Modified' - * and 'Accessed', required for correct sorting of dates (without this, - * sorting would be based on string representation of dates, yielding un- - * desired results) - * - * Add sort data provider for column 'Paperclip', required to display - * entries with attachments above those without when sorting ascendingly - * (and vice versa when sorting descendingly) - * - * NOTE: - * Qt::UserRole is used as sort role, using 'm_sortModel->setSortRole(Qt:: - * UserRole)' in EntryView.cpp, EntryView::EntryView() - */ - else if (role == Qt::UserRole) { + } else if (role == Qt::UserRole) { // Qt::UserRole is used as sort role, see EntryView::EntryView() switch (index.column()) { case Username: - //return entry->username(); return entry->resolveMultiplePlaceholders(entry->username()); case Password: - //return entry->resolveMultiplePlaceholders(entry->password()); - return entry->password(); + return entry->resolveMultiplePlaceholders(entry->password()); case Expires: - /* - * TODO: - * Is there any better way to return a QDateTime representing - * 'Never' / infinity / end of all time? - */ + // There seems to be no better way of expressing 'infinity' return entry->timeInfo().expires() ? entry->timeInfo().expiryTime() : QDateTime(QDate(9999, 1, 1)); case Created: return entry->timeInfo().creationTime(); @@ -355,16 +235,15 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const case Accessed: return entry->timeInfo().lastAccessTime(); case Paperclip: + // Display entries with attachments above those without when + // sorting ascendingly (and vice versa when sorting descendingly) return entry->attachments()->keys().isEmpty() ? 1 : 0; default: - /* - * For all other columns, simply use data provided by Qt::Display- - * Role for sorting - */ + // For all other columns, simply use data provided by Qt::Display- + // Role for sorting return data(index, Qt::DisplayRole); } - } - else if (role == Qt::DecorationRole) { + } else if (role == Qt::DecorationRole) { switch (index.column()) { case ParentGroup: if (entry->group()) { @@ -374,20 +253,17 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const case Title: if (entry->isExpired()) { return databaseIcons()->iconPixmap(DatabaseIcons::ExpiredIconIndex); - } - else { + } else { return entry->iconScaledPixmap(); } } - } - else if (role == Qt::FontRole) { + } else if (role == Qt::FontRole) { QFont font; if (entry->isExpired()) { font.setStrikeOut(true); } return font; - } - else if (role == Qt::TextColorRole) { + } else if (role == Qt::TextColorRole) { if (entry->hasReferences()) { QPalette p; return QVariant(p.color(QPalette::Active, QPalette::Mid)); @@ -399,11 +275,6 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const QVariant EntryModel::headerData(int section, Qt::Orientation orientation, int role) const { - /** - * @author Fonic <https://github.com/fonic> - * Add captions for additional columns 'Password', 'Notes', 'Expires', - * 'Created', 'Modified', 'Accessed', 'Paperclip' and 'Attachments' - */ if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { switch (section) { case ParentGroup: @@ -450,8 +321,7 @@ Qt::ItemFlags EntryModel::flags(const QModelIndex& modelIndex) const { if (!modelIndex.isValid()) { return Qt::NoItemFlags; - } - else { + } else { return QAbstractItemModel::flags(modelIndex) | Qt::ItemIsDragEnabled; } } @@ -492,8 +362,7 @@ QMimeData* EntryModel::mimeData(const QModelIndexList& indexes) const if (seenEntries.isEmpty()) { delete data; return nullptr; - } - else { + } else { data->setData(mimeTypes().at(0), encoded); return data; } @@ -567,57 +436,51 @@ void EntryModel::makeConnections(const Group* group) } /** - * @author Fonic <https://github.com/fonic> * Get current state of 'Hide Usernames' setting */ -bool EntryModel::hideUsernames() const +bool EntryModel::isUsernamesHidden() const { return m_hideUsernames; } /** - * @author Fonic <https://github.com/fonic> * Set state of 'Hide Usernames' setting and signal change */ -void EntryModel::setHideUsernames(const bool hide) +void EntryModel::setUsernamesHidden(const bool hide) { m_hideUsernames = hide; - emit hideUsernamesChanged(); + emit usernamesHiddenChanged(); } /** - * @author Fonic <https://github.com/fonic> * Get current state of 'Hide Passwords' setting */ -bool EntryModel::hidePasswords() const +bool EntryModel::isPasswordsHidden() const { return m_hidePasswords; } /** - * @author Fonic <https://github.com/fonic> * Set state of 'Hide Passwords' setting and signal change */ -void EntryModel::setHidePasswords(const bool hide) +void EntryModel::setPasswordsHidden(const bool hide) { m_hidePasswords = hide; - emit hidePasswordsChanged(); + emit passwordsHiddenChanged(); } /** - * @author Fonic <https://github.com/fonic> * Toggle state of 'Hide Usernames' setting */ -void EntryModel::toggleHideUsernames(const bool hide) +void EntryModel::toggleUsernamesHidden(const bool hide) { - setHideUsernames(hide); + setUsernamesHidden(hide); } /** - * @author Fonic <https://github.com/fonic> * Toggle state of 'Hide Passwords' setting */ -void EntryModel::toggleHidePasswords(const bool hide) +void EntryModel::togglePasswordsHidden(const bool hide) { - setHidePasswords(hide); + setPasswordsHidden(hide); } diff --git a/src/gui/entry/EntryModel.h b/src/gui/entry/EntryModel.h index 75243e52f..7c668a5f6 100644 --- a/src/gui/entry/EntryModel.h +++ b/src/gui/entry/EntryModel.h @@ -28,11 +28,6 @@ class EntryModel : public QAbstractTableModel Q_OBJECT public: - /** - * @author Fonic <https://github.com/fonic> - * Add entries for additional columns 'Password', 'Notes', 'Expires', - * 'Created', 'Modified', 'Accessed' and 'Attachments' - */ enum ModelColumn { ParentGroup = 0, @@ -65,42 +60,21 @@ public: void setEntryList(const QList<Entry*>& entries); - /** - * @author Fonic <https://github.com/fonic> - * Methods to get/set state of 'Hide Usernames' and 'Hide Passwords' - * settings - */ - bool hideUsernames() const; - void setHideUsernames(const bool hide); - bool hidePasswords() const; - void setHidePasswords(const bool hide); + bool isUsernamesHidden() const; + void setUsernamesHidden(const bool hide); + bool isPasswordsHidden() const; + void setPasswordsHidden(const bool hide); signals: - /** - * @author Fonic <https://github.com/fonic> - * Signals to notify about list/search mode switches (NOTE: previously - * named 'switchedToGroupMode'/'switchedToEntryListMode') - */ void switchedToListMode(); void switchedToSearchMode(); - - /** - * @author Fonic <https://github.com/fonic> - * Signals to notify about state changes of 'Hide Usernames' and 'Hide - * Passwords' settings - */ - void hideUsernamesChanged(); - void hidePasswordsChanged(); + void usernamesHiddenChanged(); + void passwordsHiddenChanged(); public slots: void setGroup(Group* group); - - /** - * @author Fonic <https://github.com/fonic> - * Slots to toggle state of 'Hide Usernames' and 'Hide Passwords' settings - */ - void toggleHideUsernames(const bool hide); - void toggleHidePasswords(const bool hide); + void toggleUsernamesHidden(const bool hide); + void togglePasswordsHidden(const bool hide); private slots: void entryAboutToAdd(Entry* entry); @@ -118,33 +92,11 @@ private: QList<Entry*> m_orgEntries; QList<const Group*> m_allGroups; - /** - * @author Fonic <https://github.com/fonic> - * Properties to store state of 'Hide Usernames' and 'Hide Passwords' - * settings - */ bool m_hideUsernames; bool m_hidePasswords; - /** - * @author Fonic <https://github.com/fonic> - * Constant string used to display hidden content in columns 'Username' - * and 'Password' - */ static const QString HiddenContentDisplay; - - /** - * @author Fonic <https://github.com/fonic> - * Date format used to display dates in columns 'Expires', 'Created', - * 'Modified' and 'Accessed' - */ static const Qt::DateFormat DateFormat; - - /** - * @author Fonic <https://github.com/fonic> - * Constant string used to display header and data of column 'Paper- - * clip' - */ static const QString PaperClipDisplay; }; diff --git a/src/gui/entry/EntryView.cpp b/src/gui/entry/EntryView.cpp index e52944e55..ceb3c64a0 100644 --- a/src/gui/entry/EntryView.cpp +++ b/src/gui/entry/EntryView.cpp @@ -19,26 +19,10 @@ #include <QHeaderView> #include <QKeyEvent> -/** - * @author Fonic <https://github.com/fonic> - * Add include required for header context menu - */ #include <QMenu> #include "gui/SortFilterHideProxyModel.h" -/** - * @author Fonic <https://github.com/fonic> - * - * TODO NOTE: - * Currently, 'zombie' columns which are not hidden but have width == 0 - * (rendering them invisible) may appear. This is caused by DatabaseWidget - * StateSync. Corresponding checks/workarounds may be removed once sync - * code is updated accordingly - * -> relevant code pieces: if (header()->sectionSize(...) == 0) { ... } - * - */ - EntryView::EntryView(QWidget* parent) : QTreeView(parent) , m_model(new EntryModel(this)) @@ -49,12 +33,7 @@ EntryView::EntryView(QWidget* parent) m_sortModel->setDynamicSortFilter(true); m_sortModel->setSortLocaleAware(true); m_sortModel->setSortCaseSensitivity(Qt::CaseInsensitive); - /** - * @author Fonic <https://github.com/fonic> - * Set Qt::UserRole as sort role - * -> refer to 'if (role == Qt::UserRole)', EntryModel.cpp, EntryModel:: - * data() for details - */ + // Use Qt::UserRole as sort role, see EntryModel::data() m_sortModel->setSortRole(Qt::UserRole); QTreeView::setModel(m_sortModel); @@ -70,49 +49,31 @@ EntryView::EntryView(QWidget* parent) connect(this, SIGNAL(doubleClicked(QModelIndex)), SLOT(emitEntryActivated(QModelIndex))); connect(selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), SIGNAL(entrySelectionChanged())); - /** - * @author Fonic <https://github.com/fonic> - * Connect signals to get notified about list/search mode switches (NOTE: - * previously named 'switch[ed]ToGroupMode'/'switch[ed]ToEntryListMode') - */ connect(m_model, SIGNAL(switchedToListMode()), SLOT(switchToListMode())); connect(m_model, SIGNAL(switchedToSearchMode()), SLOT(switchToSearchMode())); - /** - * @author Fonic <https://github.com/fonic> - * Connect signals to notify about changes of view state when state of - * 'Hide Usernames'/'Hide Passwords' settings changes in model - */ - connect(m_model, SIGNAL(hideUsernamesChanged()), SIGNAL(viewStateChanged())); - connect(m_model, SIGNAL(hidePasswordsChanged()), SIGNAL(viewStateChanged())); - + connect(m_model, SIGNAL(usernamesHiddenChanged()), SIGNAL(viewStateChanged())); + connect(m_model, SIGNAL(passwordsHiddenChanged()), SIGNAL(viewStateChanged())); connect(this, SIGNAL(clicked(QModelIndex)), SLOT(emitEntryPressed(QModelIndex))); - /** - * @author Fonic <https://github.com/fonic> - * Create header context menu: - * - Actions to toggle state of 'Hide Usernames'/'Hide Passwords' settings - * - Actions to toggle column visibility, with each action carrying 'its' - * column index as data - * - Actions to resize columns - * - Action to reset view to defaults - */ m_headerMenu = new QMenu(this); m_headerMenu->setTitle(tr("Customize View")); m_headerMenu->addSection(tr("Customize View")); - m_hideUsernamesAction = m_headerMenu->addAction(tr("Hide Usernames"), m_model, SLOT(toggleHideUsernames(bool))); + m_hideUsernamesAction = m_headerMenu->addAction(tr("Hide Usernames"), m_model, SLOT(toggleUsernamesHidden(bool))); m_hideUsernamesAction->setCheckable(true); - m_hidePasswordsAction = m_headerMenu->addAction(tr("Hide Passwords"), m_model, SLOT(toggleHidePasswords(bool))); + m_hidePasswordsAction = m_headerMenu->addAction(tr("Hide Passwords"), m_model, SLOT(togglePasswordsHidden(bool))); m_hidePasswordsAction->setCheckable(true); m_headerMenu->addSeparator(); + // Actions to toggle column visibility, each carrying the corresponding + // colummn index as data m_columnActions = new QActionGroup(this); m_columnActions->setExclusive(false); - for (int colidx = 1; colidx < header()->count(); colidx++) { - QString caption = m_model->headerData(colidx, Qt::Horizontal, Qt::DisplayRole).toString(); + for (int columnIndex = 1; columnIndex < header()->count(); ++columnIndex) { + QString caption = m_model->headerData(columnIndex, Qt::Horizontal, Qt::DisplayRole).toString(); QAction* action = m_headerMenu->addAction(caption); action->setCheckable(true); - action->setData(colidx); + action->setData(columnIndex); m_columnActions->addAction(action); } connect(m_columnActions, SIGNAL(triggered(QAction*)), this, SLOT(toggleColumnVisibility(QAction*))); @@ -123,17 +84,8 @@ EntryView::EntryView(QWidget* parent) m_headerMenu->addSeparator(); m_headerMenu->addAction(tr("Reset to defaults"), this, SLOT(resetViewToDefaults())); - /** - * @author Fonic <https://github.com/fonic> - * Configure header: - * - Set default section size - * - Disable stretching of last section (interferes with fitting columns - * to window) - * - Associate with context menu - * - Connect signals to notify about changes of view state when state - * of header changes - */ header()->setDefaultSectionSize(100); + // Stretching of last section interferes with fitting columns to window header()->setStretchLastSection(false); header()->setContextMenuPolicy(Qt::CustomContextMenu); connect(header(), SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showHeaderMenu(QPoint))); @@ -142,35 +94,17 @@ EntryView::EntryView(QWidget* parent) connect(header(), SIGNAL(sectionResized(int, int, int)), this, SIGNAL(viewStateChanged())); connect(header(), SIGNAL(sortIndicatorChanged(int, Qt::SortOrder)), this, SIGNAL(viewStateChanged())); - /** - * @author Fonic <https://github.com/fonic> - * Fit columns to window - * - * TODO: - * Not working as expected, columns will end up being very small, most - * likely due to EntryView not being sized properly at this time. Find - * a way to make this work by analizing when/where EntryView is created - */ + // TODO: not working as expected, columns will end up being very small, + // most likely due to the widget not being sized properly at this time //fitColumnsToWindow(); - /** - * @author Fonic <https://github.com/fonic> - * Configure default search view state and save for later use - */ + // Configure default search view state and save for later use header()->showSection(EntryModel::ParentGroup); m_sortModel->sort(EntryModel::ParentGroup, Qt::AscendingOrder); sortByColumn(EntryModel::ParentGroup, Qt::AscendingOrder); m_defaultSearchViewState = header()->saveState(); - /** - * @author Fonic <https://github.com/fonic> - * Configure default list view state and save for later use - * - * NOTE: - * Default list view is intentionally configured last since this is the - * view that's supposed to be active after initialization as m_inSearchMode - * is initialized with 'false' - */ + // Configure default list view state and save for later use header()->hideSection(EntryModel::ParentGroup); m_sortModel->sort(EntryModel::Title, Qt::AscendingOrder); sortByColumn(EntryModel::Title, Qt::AscendingOrder); @@ -207,8 +141,7 @@ void EntryView::setFirstEntryActive() if (m_model->rowCount() > 0) { QModelIndex index = m_sortModel->mapToSource(m_sortModel->index(0, 0)); setCurrentEntry(m_model->entryFromIndex(index)); - } - else { + } else { emit entrySelectionChanged(); } } @@ -241,8 +174,7 @@ Entry* EntryView::currentEntry() QModelIndexList list = selectionModel()->selectedRows(); if (list.size() == 1) { return m_model->entryFromIndex(m_sortModel->mapToSource(list.first())); - } - else { + } else { return nullptr; } } @@ -262,58 +194,38 @@ Entry* EntryView::entryFromIndex(const QModelIndex& index) { if (index.isValid()) { return m_model->entryFromIndex(m_sortModel->mapToSource(index)); - } - else { + } else { return nullptr; } } /** - * @author Fonic <https://github.com/fonic> - * Switch to list mode, i.e. list entries of group (NOTE: previously named - * 'switchToGroupMode') + * Switch to list mode, i.e. list entries of group */ void EntryView::switchToListMode() { - /* Check if already in this mode */ if (!m_inSearchMode) { return; } - /** - * Use header()->hideSection() instead of m_sortModel->hideColumn() as - * the latter messes up column indices, interfering with code relying on - * proper indices - */ header()->hideSection(EntryModel::ParentGroup); - m_inSearchMode = false; } /** - * @author Fonic <https://github.com/fonic> - * Switch to search mode, i.e. list search results (NOTE: previously named - * 'switchToEntryListMode') + * Switch to search mode, i.e. list search results */ void EntryView::switchToSearchMode() { - /* Check if already in this mode */ if (m_inSearchMode) { return; } - /* - * Use header()->showSection() instead of m_sortModel->hideColumn() as - * the latter messes up column indices, interfering with code relying on - * proper indices - */ header()->showSection(EntryModel::ParentGroup); - /* - * Always set sorting to column 'Group', as it does not feel right to have - * the last known sort configuration of search view restored by 'Database - * WidgetStateSync', which is what happens without this - */ + // Always set sorting to column 'Group', as it does not feel right to + // have the last known sort configuration of search view restored by + // 'DatabaseWidgetStateSync', which is what happens without this m_sortModel->sort(EntryModel::ParentGroup, Qt::AscendingOrder); sortByColumn(EntryModel::ParentGroup, Qt::AscendingOrder); @@ -321,46 +233,41 @@ void EntryView::switchToSearchMode() } /** - * @author Fonic <https://github.com/fonic> * Get current state of 'Hide Usernames' setting (NOTE: just pass-through for * m_model) */ -bool EntryView::hideUsernames() const +bool EntryView::isUsernamesHidden() const { - return m_model->hideUsernames(); + return m_model->isUsernamesHidden(); } /** - * @author Fonic <https://github.com/fonic> * Set state of 'Hide Usernames' setting (NOTE: just pass-through for m_model) */ -void EntryView::setHideUsernames(const bool hide) +void EntryView::setUsernamesHidden(const bool hide) { - m_model->setHideUsernames(hide); + m_model->setUsernamesHidden(hide); } /** - * @author Fonic <https://github.com/fonic> * Get current state of 'Hide Passwords' setting (NOTE: just pass-through for * m_model) */ -bool EntryView::hidePasswords() const +bool EntryView::isPasswordsHidden() const { - return m_model->hidePasswords(); + return m_model->isPasswordsHidden(); } /** - * @author Fonic <https://github.com/fonic> * Set state of 'Hide Passwords' setting (NOTE: just pass-through for m_model) */ -void EntryView::setHidePasswords(const bool hide) +void EntryView::setPasswordsHidden(const bool hide) { - m_model->setHidePasswords(hide); + m_model->setPasswordsHidden(hide); } /** - * @author Fonic <https://github.com/fonic> - * Get current state of view + * Get current view state */ QByteArray EntryView::viewState() const { @@ -368,8 +275,7 @@ QByteArray EntryView::viewState() const } /** - * @author Fonic <https://github.com/fonic> - * Set state of entry view view + * Set view state */ bool EntryView::setViewState(const QByteArray& state) const { @@ -377,70 +283,59 @@ bool EntryView::setViewState(const QByteArray& state) const } /** - * @author Fonic <https://github.com/fonic> * Sync checkable menu actions to current state and display header context * menu at specified position */ void EntryView::showHeaderMenu(const QPoint& position) { - /* Sync checked state of menu actions to current state of view */ - m_hideUsernamesAction->setChecked(m_model->hideUsernames()); - m_hidePasswordsAction->setChecked(m_model->hidePasswords()); - foreach (QAction *action, m_columnActions->actions()) { + m_hideUsernamesAction->setChecked(m_model->isUsernamesHidden()); + m_hidePasswordsAction->setChecked(m_model->isPasswordsHidden()); + const QList<QAction*> actions = m_columnActions->actions(); + for (auto& action : actions) { + Q_ASSERT(static_cast<QMetaType::Type>(action->data().type()) == QMetaType::Int); if (static_cast<QMetaType::Type>(action->data().type()) != QMetaType::Int) { - Q_ASSERT(false); continue; } - int colidx = action->data().toInt(); - bool hidden = header()->isSectionHidden(colidx) || (header()->sectionSize(colidx) == 0); + int columnIndex = action->data().toInt(); + bool hidden = header()->isSectionHidden(columnIndex) || (header()->sectionSize(columnIndex) == 0); action->setChecked(!hidden); } - /* Display menu */ m_headerMenu->popup(mapToGlobal(position)); } /** - * @author Fonic <https://github.com/fonic> * Toggle visibility of column referenced by triggering action */ void EntryView::toggleColumnVisibility(QAction *action) { - /* - * Verify action carries a column index as data. Since QVariant.toInt() - * below will accept anything that's interpretable as int, perform a type - * check here to make sure data actually IS int - */ + // Verify action carries a column index as data. Since QVariant.toInt() + // below will accept anything that's interpretable as int, perform a type + // check here to make sure data actually IS int + Q_ASSERT(static_cast<QMetaType::Type>(action->data().type()) == QMetaType::Int); if (static_cast<QMetaType::Type>(action->data().type()) != QMetaType::Int) { - Q_ASSERT(false); return; } - /* - * Toggle column visibility. Visible columns will only be hidden if at - * least one visible column remains, as the table header will disappear - * entirely when all columns are hidden, rendering the context menu in- - * accessible - */ - int colidx = action->data().toInt(); + // Toggle column visibility. Visible columns will only be hidden if at + // least one visible column remains, as the table header will disappear + // entirely when all columns are hidden + int columnIndex = action->data().toInt(); if (action->isChecked()) { - header()->showSection(colidx); - if (header()->sectionSize(colidx) == 0) { - header()->resizeSection(colidx, header()->defaultSectionSize()); + header()->showSection(columnIndex); + if (header()->sectionSize(columnIndex) == 0) { + header()->resizeSection(columnIndex, header()->defaultSectionSize()); } + return; } - else { - if ((header()->count() - header()->hiddenSectionCount()) > 1) { - header()->hideSection(colidx); - } - else { - action->setChecked(true); - } + if ((header()->count() - header()->hiddenSectionCount()) > 1) { + header()->hideSection(columnIndex); + return; } + action->setChecked(true); } /** - * @author Fonic <https://github.com/fonic> * Resize columns to fit all visible columns within the available space * * NOTE: @@ -461,69 +356,60 @@ void EntryView::fitColumnsToWindow() } /** - * @author Fonic <https://github.com/fonic> * Resize columns to fit current table contents, i.e. make all contents * entirely visible */ void EntryView::fitColumnsToContents() { - /* Resize columns to fit contents */ + // Resize columns to fit contents header()->resizeSections(QHeaderView::ResizeToContents); - /* - * Determine total width of currently visible columns. If there is - * still some space available on the header, equally distribute it to - * visible columns and add remaining fraction to last visible column - */ + // Determine total width of currently visible columns. If there is + // still some space available on the header, equally distribute it to + // visible columns and add remaining fraction to last visible column int width = 0; - for (int colidx = 0; colidx < header()->count(); colidx++) { - if (!header()->isSectionHidden(colidx)) { - width += header()->sectionSize(colidx); + for (int columnIndex = 0; columnIndex < header()->count(); ++columnIndex) { + if (!header()->isSectionHidden(columnIndex)) { + width += header()->sectionSize(columnIndex); } } int visible = header()->count() - header()->hiddenSectionCount(); int avail = header()->width() - width; - if ((visible > 0) && (avail > 0)) { - int add = avail / visible; - width = 0; - int last = 0; - for (int colidx = 0; colidx < header()->count(); colidx++) { - if (!header()->isSectionHidden(colidx)) { - header()->resizeSection(colidx, header()->sectionSize(colidx) + add); - width += header()->sectionSize(colidx); - if (header()->visualIndex(colidx) > last) { - last = header()->visualIndex(colidx); - } + if ((visible <= 0) || (avail <= 0)) { + return; + } + int add = avail / visible; + width = 0; + int last = 0; + for (int columnIndex = 0; columnIndex < header()->count(); ++columnIndex) { + if (!header()->isSectionHidden(columnIndex)) { + header()->resizeSection(columnIndex, header()->sectionSize(columnIndex) + add); + width += header()->sectionSize(columnIndex); + if (header()->visualIndex(columnIndex) > last) { + last = header()->visualIndex(columnIndex); } } - header()->resizeSection(header()->logicalIndex(last), header()->sectionSize(last) + (header()->width() - width)); } + header()->resizeSection(header()->logicalIndex(last), header()->sectionSize(last) + (header()->width() - width)); - /* - * This should not be necessary due to use of header()->resizeSection, - * but lets do it anyway for the sake of completeness - */ + // Shouldn't be necessary due to use of header()->resizeSection, but + // lets just do it anyway for the sake of completeness emit viewStateChanged(); } /** - * @author Fonic <https://github.com/fonic> * Reset view to defaults */ void EntryView::resetViewToDefaults() { - /* Reset state of 'Hide Usernames'/'Hide Passwords' settings */ - m_model->setHideUsernames(false); - m_model->setHidePasswords(true); + m_model->setUsernamesHidden(false); + m_model->setPasswordsHidden(true); - /* Reset columns (size, order, sorting etc.) */ if (m_inSearchMode) { header()->restoreState(m_defaultSearchViewState); - } - else { + } else { header()->restoreState(m_defaultListViewState); } - /* Nicely fitting columns to window feels like a sane default */ fitColumnsToWindow(); } diff --git a/src/gui/entry/EntryView.h b/src/gui/entry/EntryView.h index 5b99bec99..1bea22f49 100644 --- a/src/gui/entry/EntryView.h +++ b/src/gui/entry/EntryView.h @@ -26,10 +26,6 @@ class Entry; class EntryModel; class Group; class SortFilterHideProxyModel; -/** - * @author Fonic <https://github.com/fonic> - * Add forward declaration for QActionGroup - */ class QActionGroup; class EntryView : public QTreeView @@ -46,21 +42,10 @@ public: bool inSearchMode(); int numberOfSelectedEntries(); void setFirstEntryActive(); - - /** - * @author Fonic <https://github.com/fonic> - * Methods to get/set state of 'Hide Usernames'/'Hide Passwords' settings - * (NOTE: these are just pass-through methods to avoid exposing entry model) - */ - bool hideUsernames() const; - void setHideUsernames(const bool hide); - bool hidePasswords() const; - void setHidePasswords(const bool hide); - - /** - * @author Fonic <https://github.com/fonic> - * Methods to get/set state of view - */ + bool isUsernamesHidden() const; + void setUsernamesHidden(const bool hide); + bool isPasswordsHidden() const; + void setPasswordsHidden(const bool hide); QByteArray viewState() const; bool setViewState(const QByteArray& state) const; @@ -71,10 +56,6 @@ signals: void entryActivated(Entry* entry, EntryModel::ModelColumn column); void entryPressed(Entry* entry); void entrySelectionChanged(); - /** - * @author Fonic <https://github.com/fonic> - * Signal to notify about changes of view state - */ void viewStateChanged(); protected: @@ -83,18 +64,8 @@ protected: private slots: void emitEntryActivated(const QModelIndex& index); void emitEntryPressed(const QModelIndex& index); - /** - * @author Fonic <https://github.com/fonic> - * Methods to switch to list/search mode (NOTE: previously named 'switch - * ToGroupMode'/'switchToEntryListMode') - */ void switchToListMode(); void switchToSearchMode(); - - /** - * @author Fonic <https://github.com/fonic> - * Slots for header context menu and actions - */ void showHeaderMenu(const QPoint& position); void toggleColumnVisibility(QAction *action); void fitColumnsToWindow(); @@ -106,16 +77,9 @@ private: SortFilterHideProxyModel* const m_sortModel; bool m_inSearchMode; - /** - * @author Fonic <https://github.com/fonic> - * Properties to store default view states used by resetViewToDefaults() - */ QByteArray m_defaultListViewState; QByteArray m_defaultSearchViewState; - /** - * @author Fonic <https://github.com/fonic> - * Properties to store header context menu and actions - */ + QMenu* m_headerMenu; QAction* m_hideUsernamesAction; QAction* m_hidePasswordsAction; diff --git a/tests/gui/TestGui.cpp b/tests/gui/TestGui.cpp index 00b957241..a663b30a3 100644 --- a/tests/gui/TestGui.cpp +++ b/tests/gui/TestGui.cpp @@ -686,21 +686,6 @@ void TestGui::testSearch() QTRY_COMPARE(m_dbWidget->currentMode(), DatabaseWidget::ViewMode); } -/** - * @author Fonic <https://github.com/fonic> - * Update clicks within entry view referencing column indices to account - * for changed column indices due to new way of showing/hiding column Entry - * Model::ParentGroup. This column now has fixed index 0 wether it's shown - * or hidden, thus all indices need to be shifted by +1 when not in search - * mode (which is the case within this entire method) - * - * Old: - * clickIndex(entryView->model()->index(row, column), button); - * - * New: - * clickIndex(entryView->model()->index(row, column+1), button); - * - */ void TestGui::testDeleteEntry() { // Add canned entries for consistent testing From 7a4e74950c4b536978b1b3cfdeef23a69e895cec Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Fri, 19 Jan 2018 21:14:50 +0100 Subject: [PATCH 285/402] Add missing Q_DECLARE_TR_FUNCTIONS to Kdbx classes Remove obsolete Kdbx3XmlWriter header --- share/translations/update.sh | 8 ++-- src/format/Kdbx3Reader.h | 2 + src/format/Kdbx3Writer.h | 2 + src/format/Kdbx3XmlWriter.h | 91 ------------------------------------ src/format/Kdbx4Reader.h | 2 + src/format/Kdbx4Writer.h | 2 + 6 files changed, 13 insertions(+), 94 deletions(-) delete mode 100644 src/format/Kdbx3XmlWriter.h diff --git a/share/translations/update.sh b/share/translations/update.sh index 134d7b996..ed8a69f55 100755 --- a/share/translations/update.sh +++ b/share/translations/update.sh @@ -32,10 +32,12 @@ elif [ "$1" == "update" ]; then PULL=false elif [ "$1" != "" ]; then echo "Unknown command '${1}'" - echo "Usage: $(basename $0) [update|pull|push]" + echo "Usage: $(basename $0) [update|pull|push] [additional tx options]" exit 1 fi +shift + cd "${BASEDIR}/../.." if $UPDATE; then @@ -53,12 +55,12 @@ fi if $PUSH; then echo "Pushing English source files to Transifex..." - tx push -s + tx push -s $@ echo fi if $PULL; then echo "Pulling translations from Transifex..." - tx pull -af --minimum-perc=40 + tx pull -af --minimum-perc=40 $@ echo fi diff --git a/src/format/Kdbx3Reader.h b/src/format/Kdbx3Reader.h index bd6a794d1..e62901578 100644 --- a/src/format/Kdbx3Reader.h +++ b/src/format/Kdbx3Reader.h @@ -26,6 +26,8 @@ */ class Kdbx3Reader: public KdbxReader { +Q_DECLARE_TR_FUNCTIONS(Kdbx3Reader) + public: Database* readDatabaseImpl(QIODevice* device, const QByteArray& headerData, const CompositeKey& key, bool keepDatabase) override; diff --git a/src/format/Kdbx3Writer.h b/src/format/Kdbx3Writer.h index 88c4d16a4..8acc198a5 100644 --- a/src/format/Kdbx3Writer.h +++ b/src/format/Kdbx3Writer.h @@ -25,6 +25,8 @@ */ class Kdbx3Writer: public KdbxWriter { +Q_DECLARE_TR_FUNCTIONS(Kdbx3Writer) + public: bool writeDatabase(QIODevice* device, Database* db) override; }; diff --git a/src/format/Kdbx3XmlWriter.h b/src/format/Kdbx3XmlWriter.h deleted file mode 100644 index 6eaf32f35..000000000 --- a/src/format/Kdbx3XmlWriter.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> - * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 or (at your option) - * version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef KEEPASSX_KDBX3XMLWRITER_H -#define KEEPASSX_KDBX3XMLWRITER_H - -#include <QColor> -#include <QDateTime> -#include <QImage> -#include <QXmlStreamWriter> - -#include "core/Database.h" -#include "core/Entry.h" -#include "core/Group.h" -#include "core/TimeInfo.h" -#include "core/Uuid.h" - -class KeePass2RandomStream; -class Metadata; - -class Kdbx3XmlWriter -{ -public: - Kdbx3XmlWriter(); - void writeDatabase(QIODevice* device, Database* db, KeePass2RandomStream* randomStream = nullptr, - const QByteArray& headerHash = QByteArray()); - void writeDatabase(const QString& filename, Database* db); - bool hasError(); - QString errorString(); - -private: - void generateIdMap(); - - void writeMetadata(); - void writeMemoryProtection(); - void writeCustomIcons(); - void writeIcon(const Uuid& uuid, const QImage& icon); - void writeBinaries(); - void writeCustomData(); - void writeCustomDataItem(const QString& key, const QString& value); - void writeRoot(); - void writeGroup(const Group* group); - void writeTimes(const TimeInfo& ti); - void writeDeletedObjects(); - void writeDeletedObject(const DeletedObject& delObj); - void writeEntry(const Entry* entry); - void writeAutoType(const Entry* entry); - void writeAutoTypeAssoc(const AutoTypeAssociations::Association& assoc); - void writeEntryHistory(const Entry* entry); - - void writeString(const QString& qualifiedName, const QString& string); - void writeNumber(const QString& qualifiedName, int number); - void writeBool(const QString& qualifiedName, bool b); - void writeDateTime(const QString& qualifiedName, const QDateTime& dateTime); - void writeUuid(const QString& qualifiedName, const Uuid& uuid); - void writeUuid(const QString& qualifiedName, const Group* group); - void writeUuid(const QString& qualifiedName, const Entry* entry); - void writeBinary(const QString& qualifiedName, const QByteArray& ba); - void writeColor(const QString& qualifiedName, const QColor& color); - void writeTriState(const QString& qualifiedName, Group::TriState triState); - QString colorPartToString(int value); - QString stripInvalidXml10Chars(QString str); - - void raiseError(const QString& errorMessage); - - QXmlStreamWriter m_xml; - Database* m_db; - Metadata* m_meta; - KeePass2RandomStream* m_randomStream; - QByteArray m_headerHash; - QHash<QByteArray, int> m_idMap; - bool m_error; - QString m_errorStr; -}; - -#endif // KEEPASSX_KDBX3XMLWRITER_H diff --git a/src/format/Kdbx4Reader.h b/src/format/Kdbx4Reader.h index 175af9419..9764ed886 100644 --- a/src/format/Kdbx4Reader.h +++ b/src/format/Kdbx4Reader.h @@ -27,6 +27,8 @@ */ class Kdbx4Reader : public KdbxReader { +Q_DECLARE_TR_FUNCTIONS(Kdbx4Reader) + public: Database* readDatabaseImpl(QIODevice* device, const QByteArray& headerData, const CompositeKey& key, bool keepDatabase) override; diff --git a/src/format/Kdbx4Writer.h b/src/format/Kdbx4Writer.h index f05ad21a3..90a8e658e 100644 --- a/src/format/Kdbx4Writer.h +++ b/src/format/Kdbx4Writer.h @@ -25,6 +25,8 @@ */ class Kdbx4Writer : public KdbxWriter { +Q_DECLARE_TR_FUNCTIONS(Kdbx4Writer) + public: bool writeDatabase(QIODevice* device, Database* db) override; From 0c0c558ff789fa221f9e97c242fb301b20253865 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sat, 20 Jan 2018 14:16:17 +0100 Subject: [PATCH 286/402] Fix Auto-Type locale source strings --- src/autotype/AutoType.cpp | 19 +++++++++---------- src/sshagent/AgentSettingsWidget.ui | 3 --- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp index 976a7d46e..2a77c4c1d 100644 --- a/src/autotype/AutoType.cpp +++ b/src/autotype/AutoType.cpp @@ -328,7 +328,7 @@ bool AutoType::parseActions(const QString& sequence, const Entry* entry, QList<A for (const QChar& ch : sequence) { if (inTmpl) { if (ch == '{') { - qWarning("Syntax error in auto-type sequence."); + qWarning("Syntax error in Auto-Type sequence."); return false; } else if (ch == '}') { QList<AutoTypeAction*> autoType = createActionFromTemplate(tmpl, entry); @@ -343,7 +343,7 @@ bool AutoType::parseActions(const QString& sequence, const Entry* entry, QList<A } else if (ch == '{') { inTmpl = true; } else if (ch == '}') { - qWarning("Syntax error in auto-type sequence."); + qWarning("Syntax error in Auto-Type sequence."); return false; } else { actions.append(new AutoTypeChar(ch)); @@ -662,29 +662,28 @@ bool AutoType::verifyAutoTypeSyntax(const QString& sequence) { if (!AutoType::checkSyntax(sequence)) { QMessageBox messageBox; - messageBox.critical(0, tr("Auto-Type"), tr("The Syntax of your AutoType statement is incorrect!")); + messageBox.critical(nullptr, tr("Auto-Type"), tr("The Syntax of your Auto-Type statement is incorrect!")); return false; } else if (AutoType::checkHighDelay(sequence)) { QMessageBox::StandardButton reply; - reply = QMessageBox::question(0, tr("Auto-Type"), - tr("This AutoType command contains a very long delay. Do you really want to proceed?")); + reply = QMessageBox::question(nullptr, tr("Auto-Type"), + tr("This Auto-Type command contains a very long delay. Do you really want to proceed?")); if (reply == QMessageBox::No) { return false; } } else if (AutoType::checkSlowKeypress(sequence)) { QMessageBox::StandardButton reply; - reply = QMessageBox::question(0, tr("Auto-Type"), - tr("This AutoType command contains very slow key-press. Do you really want to proceed?")); + reply = QMessageBox::question(nullptr, tr("Auto-Type"), + tr("This Auto-Type command contains very slow key presses. Do you really want to proceed?")); if (reply == QMessageBox::No) { return false; } } else if (AutoType::checkHighRepetition(sequence)) { QMessageBox::StandardButton reply; - reply = QMessageBox::question(0, tr("Auto-Type"), - tr("This AutoType command contains arguments which are " - "repeated very often. Do you really want to proceed?")); + reply = QMessageBox::question(nullptr, tr("Auto-Type"), + tr("This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?")); if (reply == QMessageBox::No) { return false; diff --git a/src/sshagent/AgentSettingsWidget.ui b/src/sshagent/AgentSettingsWidget.ui index e97ee87bb..c00c62f39 100644 --- a/src/sshagent/AgentSettingsWidget.ui +++ b/src/sshagent/AgentSettingsWidget.ui @@ -10,9 +10,6 @@ <height>300</height> </rect> </property> - <property name="windowTitle"> - <string>Form</string> - </property> <layout class="QVBoxLayout" name="verticalLayout_3"> <property name="leftMargin"> <number>0</number> From 3605bec8e033782f21cac03a53c542fde229c9ea Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sat, 20 Jan 2018 13:03:50 +0100 Subject: [PATCH 287/402] Change 'unget' error message to untranslatable qWarning --- src/core/CsvParser.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/core/CsvParser.cpp b/src/core/CsvParser.cpp index 70493804e..6a963fc45 100644 --- a/src/core/CsvParser.cpp +++ b/src/core/CsvParser.cpp @@ -268,8 +268,10 @@ void CsvParser::getChar(QChar& c) { } void CsvParser::ungetChar() { - if (!m_ts.seek(m_lastPos)) - appendStatusMsg(QObject::tr("INTERNAL - unget lower bound exceeded"), true); + if (!m_ts.seek(m_lastPos)) { + qWarning("CSV Parser: unget lower bound exceeded"); + m_isGood = false; + } } void CsvParser::peek(QChar& c) { @@ -380,5 +382,5 @@ void CsvParser::appendStatusMsg(QString s, bool isCritical) { .append(",") .append(QString::number(m_currCol)) .append("\n"); - m_isGood = not isCritical; + m_isGood = !isCritical; } From 8da3efa2c219143921b35266a28b0c010b5ebc4b Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sat, 20 Jan 2018 13:47:30 +0100 Subject: [PATCH 288/402] Add disambiguation info to source strings --- src/browser/BrowserOptionDialog.ui | 20 ++++---- src/cli/Clip.cpp | 2 +- src/core/Entry.cpp | 2 +- src/format/Kdbx4Reader.cpp | 12 +++++ src/format/Kdbx4Writer.cpp | 3 +- src/format/KdbxXmlReader.cpp | 1 + src/format/KeePass1Reader.cpp | 62 ++++++++++++------------ src/gui/DatabaseSettingsWidget.cpp | 4 +- src/gui/DatabaseTabWidget.cpp | 2 +- src/gui/DatabaseWidget.cpp | 2 +- src/gui/MainWindow.ui | 4 +- src/gui/PasswordGeneratorWidget.cpp | 8 +-- src/gui/PasswordGeneratorWidget.ui | 10 +++- src/gui/SettingsWidgetGeneral.ui | 2 +- src/gui/SettingsWidgetSecurity.ui | 6 +-- src/gui/SetupTotpDialog.ui | 2 +- src/gui/entry/EditEntryWidgetSSHAgent.ui | 6 +-- src/http/OptionDialog.ui | 2 +- 18 files changed, 86 insertions(+), 64 deletions(-) diff --git a/src/browser/BrowserOptionDialog.ui b/src/browser/BrowserOptionDialog.ui index 690ae3955..9bb0250b3 100755 --- a/src/browser/BrowserOptionDialog.ui +++ b/src/browser/BrowserOptionDialog.ui @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>456</width> - <height>385</height> + <width>523</width> + <height>456</height> </rect> </property> <property name="windowTitle"> @@ -130,7 +130,7 @@ <item> <widget class="QCheckBox" name="showNotification"> <property name="text"> - <string>Show a &notification when credentials are requested</string> + <string extracomment="Credentials mean login data requested via browser extension">Show a &notification when credentials are requested</string> </property> <property name="checked"> <bool>true</bool> @@ -170,14 +170,14 @@ <item> <widget class="QRadioButton" name="sortByTitle"> <property name="text"> - <string>Sort &matching credentials by title</string> + <string extracomment="Credentials mean login data requested via browser extension">Sort &matching credentials by title</string> </property> </widget> </item> <item> <widget class="QRadioButton" name="sortByUsername"> <property name="text"> - <string>Sort matching credentials by &username</string> + <string extracomment="Credentials mean login data requested via browser extension">Sort matching credentials by &username</string> </property> </widget> </item> @@ -260,14 +260,14 @@ <item> <widget class="QCheckBox" name="alwaysAllowAccess"> <property name="text"> - <string>Never &ask before accessing credentials</string> + <string extracomment="Credentials mean login data requested via browser extension">Never &ask before accessing credentials</string> </property> </widget> </item> <item> <widget class="QCheckBox" name="alwaysAllowUpdate"> <property name="text"> - <string>Never ask before &updating credentials</string> + <string extracomment="Credentials mean login data requested via browser extension">Never ask before &updating credentials</string> </property> </widget> </item> @@ -277,7 +277,7 @@ <string>Only the selected database has to be connected with a client.</string> </property> <property name="text"> - <string>Searc&h in all opened databases for matching credentials</string> + <string extracomment="Credentials mean login data requested via browser extension">Searc&h in all opened databases for matching credentials</string> </property> </widget> </item> @@ -317,7 +317,7 @@ <string>Use a custom proxy location if you installed a proxy manually.</string> </property> <property name="text"> - <string>Use a &custom proxy location</string> + <string comment="Meant is the proxy for KeePassXC-Browser">Use a &custom proxy location</string> </property> </widget> </item> @@ -336,7 +336,7 @@ <item> <widget class="QPushButton" name="customProxyLocationBrowseButton"> <property name="text"> - <string>Browse...</string> + <string extracomment="Button for opening file dialog">Browse...</string> </property> </widget> </item> diff --git a/src/cli/Clip.cpp b/src/cli/Clip.cpp index dd51d7f0b..6b458a673 100644 --- a/src/cli/Clip.cpp +++ b/src/cli/Clip.cpp @@ -53,7 +53,7 @@ int Clip::execute(QStringList arguments) QObject::tr("Key file of the database."), QObject::tr("path")); parser.addOption(keyFile); - parser.addPositionalArgument("entry", QObject::tr("Path of the entry to clip.")); + parser.addPositionalArgument("entry", QObject::tr("Path of the entry to clip.", "clip = copy to clipboard")); parser.addPositionalArgument( "timeout", QObject::tr("Timeout in seconds before clearing the clipboard."), QString("[timeout]")); parser.process(arguments); diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index 6169c1093..669be0ed1 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -671,7 +671,7 @@ Entry* Entry::clone(CloneFlags flags) const } if (flags & CloneRenameTitle) - entry->setTitle(entry->title() + tr(" - Clone")); + entry->setTitle(entry->title() + tr(" - Clone", "Suffix added to cloned entries")); return entry; } diff --git a/src/format/Kdbx4Reader.cpp b/src/format/Kdbx4Reader.cpp index 38063acf1..8b9d4ab2b 100644 --- a/src/format/Kdbx4Reader.cpp +++ b/src/format/Kdbx4Reader.cpp @@ -298,6 +298,7 @@ QVariantMap Kdbx4Reader::readVariantMap(QIODevice* device) & KeePass2::VARIANTMAP_CRITICAL_MASK; quint16 maxVersion = KeePass2::VARIANTMAP_VERSION & KeePass2::VARIANTMAP_CRITICAL_MASK; if (!ok || (version > maxVersion)) { + //: Translation: variant map = data structure for storing meta data raiseError(tr("Unsupported KeePass variant map version.")); return {}; } @@ -310,6 +311,7 @@ QVariantMap Kdbx4Reader::readVariantMap(QIODevice* device) != KeePass2::VariantMapFieldType::End)) { auto nameLen = Endian::readSizedInt<quint32>(device, KeePass2::BYTEORDER, &ok); if (!ok) { + //: Translation: variant map = data structure for storing meta data raiseError(tr("Invalid variant map entry name length")); return {}; } @@ -317,6 +319,7 @@ QVariantMap Kdbx4Reader::readVariantMap(QIODevice* device) if (nameLen != 0) { nameBytes = device->read(nameLen); if (static_cast<quint32>(nameBytes.size()) != nameLen) { + //: Translation: variant map = data structure for storing meta data raiseError(tr("Invalid variant map entry name data")); return {}; } @@ -325,6 +328,7 @@ QVariantMap Kdbx4Reader::readVariantMap(QIODevice* device) auto valueLen = Endian::readSizedInt<quint32>(device, KeePass2::BYTEORDER, &ok); if (!ok) { + //: Translation: variant map = data structure for storing meta data raiseError(tr("Invalid variant map entry value length")); return {}; } @@ -332,6 +336,7 @@ QVariantMap Kdbx4Reader::readVariantMap(QIODevice* device) if (valueLen != 0) { valueBytes = device->read(valueLen); if (static_cast<quint32>(valueBytes.size()) != valueLen) { + //: Translation comment: variant map = data structure for storing meta data raiseError(tr("Invalid variant map entry value data")); return {}; } @@ -342,6 +347,7 @@ QVariantMap Kdbx4Reader::readVariantMap(QIODevice* device) if (valueLen == 1) { vm.insert(name, QVariant(valueBytes.at(0) != 0)); } else { + //: Translation: variant map = data structure for storing meta data raiseError(tr("Invalid variant map Bool entry value length")); return {}; } @@ -351,6 +357,7 @@ QVariantMap Kdbx4Reader::readVariantMap(QIODevice* device) if (valueLen == 4) { vm.insert(name, QVariant(Endian::bytesToSizedInt<qint32>(valueBytes, KeePass2::BYTEORDER))); } else { + //: Translation: variant map = data structure for storing meta data raiseError(tr("Invalid variant map Int32 entry value length")); return {}; } @@ -360,6 +367,7 @@ QVariantMap Kdbx4Reader::readVariantMap(QIODevice* device) if (valueLen == 4) { vm.insert(name, QVariant(Endian::bytesToSizedInt<quint32>(valueBytes, KeePass2::BYTEORDER))); } else { + //: Translation: variant map = data structure for storing meta data raiseError(tr("Invalid variant map UInt32 entry value length")); return {}; } @@ -369,6 +377,7 @@ QVariantMap Kdbx4Reader::readVariantMap(QIODevice* device) if (valueLen == 8) { vm.insert(name, QVariant(Endian::bytesToSizedInt<qint64>(valueBytes, KeePass2::BYTEORDER))); } else { + //: Translation: variant map = data structure for storing meta data raiseError(tr("Invalid variant map Int64 entry value length")); return {}; } @@ -378,6 +387,7 @@ QVariantMap Kdbx4Reader::readVariantMap(QIODevice* device) if (valueLen == 8) { vm.insert(name, QVariant(Endian::bytesToSizedInt<quint64>(valueBytes, KeePass2::BYTEORDER))); } else { + //: Translation: variant map = data structure for storing meta data raiseError(tr("Invalid variant map UInt64 entry value length")); return {}; } @@ -392,12 +402,14 @@ QVariantMap Kdbx4Reader::readVariantMap(QIODevice* device) break; default: + //: Translation: variant map = data structure for storing meta data raiseError(tr("Invalid variant map entry type")); return {}; } } if (fieldTypeArray.size() != 1) { + //: Translation: variant map = data structure for storing meta data raiseError(tr("Invalid variant map field type size")); return {}; } diff --git a/src/format/Kdbx4Writer.cpp b/src/format/Kdbx4Writer.cpp index 7ce8bab1a..42cc3ecb5 100644 --- a/src/format/Kdbx4Writer.cpp +++ b/src/format/Kdbx4Writer.cpp @@ -41,7 +41,7 @@ bool Kdbx4Writer::writeDatabase(QIODevice* device, Database* db) } int ivSize = SymmetricCipher::algorithmIvSize(algo); if (ivSize < 0) { - raiseError(tr("Invalid symmetric cipher IV size.")); + raiseError(tr("Invalid symmetric cipher IV size.", "IV = Initialization Vector for symmetric cipher")); return false; } @@ -82,6 +82,7 @@ bool Kdbx4Writer::writeDatabase(QIODevice* device, Database* db) QVariantMap kdfParams = KeePass2::kdfToParameters(db->kdf()); QByteArray kdfParamBytes; if (!serializeVariantMap(kdfParams, kdfParamBytes)) { + //: Translation comment: variant map = data structure for storing meta data raiseError(tr("Failed to serialize KDF parameters variant map")); return false; } diff --git a/src/format/KdbxXmlReader.cpp b/src/format/KdbxXmlReader.cpp index 774bb00c7..0b09e8a2f 100644 --- a/src/format/KdbxXmlReader.cpp +++ b/src/format/KdbxXmlReader.cpp @@ -1120,6 +1120,7 @@ QByteArray KdbxXmlReader::readCompressedBinary() QByteArray result; if (!Tools::readAllFromDevice(&compressor, result)) { + //: Translator meant is a binary data inside an entry raiseError(tr("Unable to decompress binary")); } return result; diff --git a/src/format/KeePass1Reader.cpp b/src/format/KeePass1Reader.cpp index 20f9ff232..390857075 100644 --- a/src/format/KeePass1Reader.cpp +++ b/src/format/KeePass1Reader.cpp @@ -126,37 +126,37 @@ Database* KeePass1Reader::readDatabase(QIODevice* device, const QString& passwor m_encryptionIV = m_device->read(16); if (m_encryptionIV.size() != 16) { - raiseError("Unable to read encryption IV"); + raiseError(tr("Unable to read encryption IV", "IV = Initialization Vector for symmetric cipher")); return nullptr; } auto numGroups = Endian::readSizedInt<quint32>(m_device, KeePass1::BYTEORDER, &ok); if (!ok) { - raiseError("Invalid number of groups"); + raiseError(tr("Invalid number of groups")); return nullptr; } auto numEntries = Endian::readSizedInt<quint32>(m_device, KeePass1::BYTEORDER, &ok); if (!ok) { - raiseError("Invalid number of entries"); + raiseError(tr("Invalid number of entries")); return nullptr; } m_contentHashHeader = m_device->read(32); if (m_contentHashHeader.size() != 32) { - raiseError("Invalid content hash size"); + raiseError(tr("Invalid content hash size")); return nullptr; } m_transformSeed = m_device->read(32); if (m_transformSeed.size() != 32) { - raiseError("Invalid transform seed size"); + raiseError(tr("Invalid transform seed size")); return nullptr; } m_transformRounds = Endian::readSizedInt<quint32>(m_device, KeePass1::BYTEORDER, &ok); if (!ok) { - raiseError("Invalid number of transform rounds"); + raiseError(tr("Invalid number of transform rounds")); return nullptr; } auto kdf = QSharedPointer<AesKdf>::create(true); @@ -191,7 +191,7 @@ Database* KeePass1Reader::readDatabase(QIODevice* device, const QString& passwor } if (!constructGroupTree(groups)) { - raiseError("Unable to construct group tree"); + raiseError(tr("Unable to construct group tree")); return nullptr; } @@ -401,7 +401,7 @@ QByteArray KeePass1Reader::key(const QByteArray& password, const QByteArray& key bool result = key.transform(*m_db->kdf(), transformedKey); if (!result) { - raiseError("Key transformation failed"); + raiseError(tr("Key transformation failed")); return QByteArray(); } @@ -445,19 +445,19 @@ Group* KeePass1Reader::readGroup(QIODevice* cipherStream) do { quint16 fieldType = Endian::readSizedInt<quint16>(cipherStream, KeePass1::BYTEORDER, &ok); if (!ok) { - raiseError("Invalid group field type number"); + raiseError(tr("Invalid group field type number")); return nullptr; } int fieldSize = static_cast<int>(Endian::readSizedInt<quint32>(cipherStream, KeePass1::BYTEORDER, &ok)); if (!ok) { - raiseError("Invalid group field size"); + raiseError(tr("Invalid group field size")); return nullptr; } QByteArray fieldData = cipherStream->read(fieldSize); if (fieldData.size() != fieldSize) { - raiseError("Read group field data doesn't match size"); + raiseError(tr("Read group field data doesn't match size")); return nullptr; } @@ -467,7 +467,7 @@ Group* KeePass1Reader::readGroup(QIODevice* cipherStream) break; case 0x0001: if (fieldSize != 4) { - raiseError("Incorrect group id field size"); + raiseError(tr("Incorrect group id field size")); return nullptr; } groupId = Endian::bytesToSizedInt<quint32>(fieldData, KeePass1::BYTEORDER); @@ -479,7 +479,7 @@ Group* KeePass1Reader::readGroup(QIODevice* cipherStream) case 0x0003: { if (fieldSize != 5) { - raiseError("Incorrect group creation time field size"); + raiseError(tr("Incorrect group creation time field size")); return nullptr; } QDateTime dateTime = dateFromPackedStruct(fieldData); @@ -491,7 +491,7 @@ Group* KeePass1Reader::readGroup(QIODevice* cipherStream) case 0x0004: { if (fieldSize != 5) { - raiseError("Incorrect group modification time field size"); + raiseError(tr("Incorrect group modification time field size")); return nullptr; } QDateTime dateTime = dateFromPackedStruct(fieldData); @@ -503,7 +503,7 @@ Group* KeePass1Reader::readGroup(QIODevice* cipherStream) case 0x0005: { if (fieldSize != 5) { - raiseError("Incorrect group access time field size"); + raiseError(tr("Incorrect group access time field size")); } QDateTime dateTime = dateFromPackedStruct(fieldData); if (dateTime.isValid()) { @@ -514,7 +514,7 @@ Group* KeePass1Reader::readGroup(QIODevice* cipherStream) case 0x0006: { if (fieldSize != 5) { - raiseError("Incorrect group expiry time field size"); + raiseError(tr("Incorrect group expiry time field size")); } QDateTime dateTime = dateFromPackedStruct(fieldData); if (dateTime.isValid()) { @@ -526,7 +526,7 @@ Group* KeePass1Reader::readGroup(QIODevice* cipherStream) case 0x0007: { if (fieldSize != 4) { - raiseError("Incorrect group icon field size"); + raiseError(tr("Incorrect group icon field size")); return nullptr; } quint32 iconNumber = Endian::bytesToSizedInt<quint32>(fieldData, KeePass1::BYTEORDER); @@ -536,7 +536,7 @@ Group* KeePass1Reader::readGroup(QIODevice* cipherStream) case 0x0008: { if (fieldSize != 2) { - raiseError("Incorrect group level field size"); + raiseError(tr("Incorrect group level field size")); return nullptr; } groupLevel = Endian::bytesToSizedInt<quint16>(fieldData, KeePass1::BYTEORDER); @@ -551,13 +551,13 @@ Group* KeePass1Reader::readGroup(QIODevice* cipherStream) break; default: // invalid field - raiseError("Invalid group field type"); + raiseError(tr("Invalid group field type")); return nullptr; } } while (!reachedEnd); if (!groupIdSet || !groupLevelSet) { - raiseError("Missing group id or level"); + raiseError(tr("Missing group id or level")); return nullptr; } @@ -583,19 +583,19 @@ Entry* KeePass1Reader::readEntry(QIODevice* cipherStream) do { quint16 fieldType = Endian::readSizedInt<quint16>(cipherStream, KeePass1::BYTEORDER, &ok); if (!ok) { - raiseError("Missing entry field type number"); + raiseError(tr("Missing entry field type number")); return nullptr; } int fieldSize = static_cast<int>(Endian::readSizedInt<quint32>(cipherStream, KeePass1::BYTEORDER, &ok)); if (!ok) { - raiseError("Invalid entry field size"); + raiseError(tr("Invalid entry field size")); return nullptr; } QByteArray fieldData = cipherStream->read(fieldSize); if (fieldData.size() != fieldSize) { - raiseError("Read entry field data doesn't match size"); + raiseError(tr("Read entry field data doesn't match size")); return nullptr; } @@ -605,7 +605,7 @@ Entry* KeePass1Reader::readEntry(QIODevice* cipherStream) break; case 0x0001: if (fieldSize != 16) { - raiseError("Invalid entry uuid field size"); + raiseError(tr("Invalid entry uuid field size")); return nullptr; } m_entryUuids.insert(fieldData, entry.data()); @@ -613,7 +613,7 @@ Entry* KeePass1Reader::readEntry(QIODevice* cipherStream) case 0x0002: { if (fieldSize != 4) { - raiseError("Invalid entry group id field size"); + raiseError(tr("Invalid entry group id field size")); return nullptr; } quint32 groupId = Endian::bytesToSizedInt<quint32>(fieldData, KeePass1::BYTEORDER); @@ -623,7 +623,7 @@ Entry* KeePass1Reader::readEntry(QIODevice* cipherStream) case 0x0003: { if (fieldSize != 4) { - raiseError("Invalid entry icon field size"); + raiseError(tr("Invalid entry icon field size")); return nullptr; } quint32 iconNumber = Endian::bytesToSizedInt<quint32>(fieldData, KeePass1::BYTEORDER); @@ -648,7 +648,7 @@ Entry* KeePass1Reader::readEntry(QIODevice* cipherStream) case 0x0009: { if (fieldSize != 5) { - raiseError("Invalid entry creation time field size"); + raiseError(tr("Invalid entry creation time field size")); return nullptr; } QDateTime dateTime = dateFromPackedStruct(fieldData); @@ -660,7 +660,7 @@ Entry* KeePass1Reader::readEntry(QIODevice* cipherStream) case 0x000A: { if (fieldSize != 5) { - raiseError("Invalid entry modification time field size"); + raiseError(tr("Invalid entry modification time field size")); return nullptr; } QDateTime dateTime = dateFromPackedStruct(fieldData); @@ -672,7 +672,7 @@ Entry* KeePass1Reader::readEntry(QIODevice* cipherStream) case 0x000B: { if (fieldSize != 5) { - raiseError("Invalid entry creation time field size"); + raiseError(tr("Invalid entry creation time field size")); return nullptr; } QDateTime dateTime = dateFromPackedStruct(fieldData); @@ -684,7 +684,7 @@ Entry* KeePass1Reader::readEntry(QIODevice* cipherStream) case 0x000C: { if (fieldSize != 5) { - raiseError("Invalid entry expiry time field size"); + raiseError(tr("Invalid entry expiry time field size")); return nullptr; } QDateTime dateTime = dateFromPackedStruct(fieldData); @@ -707,7 +707,7 @@ Entry* KeePass1Reader::readEntry(QIODevice* cipherStream) break; default: // invalid field - raiseError("Invalid entry field type"); + raiseError(tr("Invalid entry field type")); return nullptr; } } while (!reachedEnd); diff --git a/src/gui/DatabaseSettingsWidget.cpp b/src/gui/DatabaseSettingsWidget.cpp index d145a2381..291887a97 100644 --- a/src/gui/DatabaseSettingsWidget.cpp +++ b/src/gui/DatabaseSettingsWidget.cpp @@ -142,7 +142,7 @@ void DatabaseSettingsWidget::save() if (kdf->uuid() == KeePass2::KDF_ARGON2 && m_uiEncryption->transformRoundsSpinBox->value() > 10000) { QMessageBox warning; warning.setIcon(QMessageBox::Warning); - warning.setWindowTitle(tr("Number of rounds too high")); + warning.setWindowTitle(tr("Number of rounds too high", "Key transformation rounds")); warning.setText(tr("You are using a very high number of key transform rounds with Argon2.\n\n" "If you keep this number, your database may take hours or days (or even longer) to open!")); auto ok = warning.addButton(tr("Understood, keep number"), QMessageBox::ButtonRole::AcceptRole); @@ -156,7 +156,7 @@ void DatabaseSettingsWidget::save() && m_uiEncryption->transformRoundsSpinBox->value() < 100000) { QMessageBox warning; warning.setIcon(QMessageBox::Warning); - warning.setWindowTitle(tr("Number of rounds too low")); + warning.setWindowTitle(tr("Number of rounds too low", "Key transformation rounds")); warning.setText(tr("You are using a very low number of key transform rounds with AES-KDF.\n\n" "If you keep this number, your database may be too easy to crack!")); auto ok = warning.addButton(tr("Understood, keep number"), QMessageBox::ButtonRole::AcceptRole); diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp index 09205fca4..c00a67d07 100644 --- a/src/gui/DatabaseTabWidget.cpp +++ b/src/gui/DatabaseTabWidget.cpp @@ -85,7 +85,7 @@ void DatabaseTabWidget::newDatabase() { DatabaseManagerStruct dbStruct; Database* db = new Database(); - db->rootGroup()->setName(tr("Root")); + db->rootGroup()->setName(tr("Root", "Root group")); dbStruct.dbWidget = new DatabaseWidget(db, this); CompositeKey emptyKey; diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 361ca36fe..5f6ee56bb 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -1277,7 +1277,7 @@ void DatabaseWidget::reloadDatabaseFile() if (! config()->get("AutoReloadOnChange").toBool()) { // Ask if we want to reload the db - QMessageBox::StandardButton mb = MessageBox::question(this, tr("Autoreload Request"), + QMessageBox::StandardButton mb = MessageBox::question(this, tr("File has changed"), tr("The database file has changed. Do you want to load the changes?"), QMessageBox::Yes | QMessageBox::No); diff --git a/src/gui/MainWindow.ui b/src/gui/MainWindow.ui index 0b39d0b3d..397f7c267 100644 --- a/src/gui/MainWindow.ui +++ b/src/gui/MainWindow.ui @@ -180,7 +180,7 @@ <x>0</x> <y>0</y> <width>800</width> - <height>21</height> + <height>34</height> </rect> </property> <widget class="QMenu" name="menuFile"> @@ -243,7 +243,7 @@ <bool>false</bool> </property> <property name="title"> - <string>Timed one-time password</string> + <string>Time-based one-time password</string> </property> <addaction name="actionEntryCopyTotp"/> <addaction name="actionEntryTotp"/> diff --git a/src/gui/PasswordGeneratorWidget.cpp b/src/gui/PasswordGeneratorWidget.cpp index 1c72bd353..08228ea1f 100644 --- a/src/gui/PasswordGeneratorWidget.cpp +++ b/src/gui/PasswordGeneratorWidget.cpp @@ -283,16 +283,16 @@ void PasswordGeneratorWidget::colorStrengthIndicator(double entropy) // <https://community.kde.org/KDE_Visual_Design_Group/HIG/Color> if (entropy < 40) { m_ui->entropyProgressBar->setStyleSheet(style.arg("#c0392b")); - m_ui->strengthLabel->setText(tr("Password Quality: %1").arg(tr("Poor"))); + m_ui->strengthLabel->setText(tr("Password Quality: %1").arg(tr("Poor", "Password quality"))); } else if (entropy >= 40 && entropy < 65) { m_ui->entropyProgressBar->setStyleSheet(style.arg("#f39c1f")); - m_ui->strengthLabel->setText(tr("Password Quality: %1").arg(tr("Weak"))); + m_ui->strengthLabel->setText(tr("Password Quality: %1").arg(tr("Weak", "Password quality"))); } else if (entropy >= 65 && entropy < 100) { m_ui->entropyProgressBar->setStyleSheet(style.arg("#11d116")); - m_ui->strengthLabel->setText(tr("Password Quality: %1").arg(tr("Good"))); + m_ui->strengthLabel->setText(tr("Password Quality: %1").arg(tr("Good", "Password quality"))); } else { m_ui->entropyProgressBar->setStyleSheet(style.arg("#27ae60")); - m_ui->strengthLabel->setText(tr("Password Quality: %1").arg(tr("Excellent"))); + m_ui->strengthLabel->setText(tr("Password Quality: %1").arg(tr("Excellent", "Password quality"))); } } diff --git a/src/gui/PasswordGeneratorWidget.ui b/src/gui/PasswordGeneratorWidget.ui index a7e485817..03f70806f 100644 --- a/src/gui/PasswordGeneratorWidget.ui +++ b/src/gui/PasswordGeneratorWidget.ui @@ -2,6 +2,14 @@ <ui version="4.0"> <class>PasswordGeneratorWidget</class> <widget class="QWidget" name="PasswordGeneratorWidget"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>547</width> + <height>352</height> + </rect> + </property> <property name="sizePolicy"> <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> <horstretch>0</horstretch> @@ -100,7 +108,7 @@ QProgressBar::chunk { </size> </property> <property name="text"> - <string>strength</string> + <string comment="Password strength">strength</string> </property> <property name="textFormat"> <enum>Qt::PlainText</enum> diff --git a/src/gui/SettingsWidgetGeneral.ui b/src/gui/SettingsWidgetGeneral.ui index 684cb4353..87af235d4 100644 --- a/src/gui/SettingsWidgetGeneral.ui +++ b/src/gui/SettingsWidgetGeneral.ui @@ -415,7 +415,7 @@ </sizepolicy> </property> <property name="suffix"> - <string> ms</string> + <string comment="Milliseconds"> ms</string> </property> <property name="prefix"> <string/> diff --git a/src/gui/SettingsWidgetSecurity.ui b/src/gui/SettingsWidgetSecurity.ui index 17d324f7b..b1c41338d 100644 --- a/src/gui/SettingsWidgetSecurity.ui +++ b/src/gui/SettingsWidgetSecurity.ui @@ -7,7 +7,7 @@ <x>0</x> <y>0</y> <width>595</width> - <height>443</height> + <height>446</height> </rect> </property> <layout class="QVBoxLayout" name="verticalLayout"> @@ -48,7 +48,7 @@ </sizepolicy> </property> <property name="suffix"> - <string> sec</string> + <string comment="Seconds"> sec</string> </property> <property name="minimum"> <number>1</number> @@ -86,7 +86,7 @@ </sizepolicy> </property> <property name="suffix"> - <string> sec</string> + <string comment="Seconds"> sec</string> </property> <property name="minimum"> <number>10</number> diff --git a/src/gui/SetupTotpDialog.ui b/src/gui/SetupTotpDialog.ui index c3a83e21d..327ca6d0a 100644 --- a/src/gui/SetupTotpDialog.ui +++ b/src/gui/SetupTotpDialog.ui @@ -132,7 +132,7 @@ <bool>false</bool> </property> <property name="suffix"> - <string> sec</string> + <string comment="Seconds"> sec</string> </property> <property name="minimum"> <number>1</number> diff --git a/src/gui/entry/EditEntryWidgetSSHAgent.ui b/src/gui/entry/EditEntryWidgetSSHAgent.ui index 34c8fae82..5957f6572 100644 --- a/src/gui/entry/EditEntryWidgetSSHAgent.ui +++ b/src/gui/entry/EditEntryWidgetSSHAgent.ui @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>471</width> - <height>480</height> + <width>498</width> + <height>518</height> </rect> </property> <property name="windowTitle"> @@ -166,7 +166,7 @@ <item row="3" column="2"> <widget class="QPushButton" name="browseButton"> <property name="text"> - <string>Browse...</string> + <string extracomment="Button for opening file dialog">Browse...</string> </property> </widget> </item> diff --git a/src/http/OptionDialog.ui b/src/http/OptionDialog.ui index 54f7bd70c..472f9f62a 100644 --- a/src/http/OptionDialog.ui +++ b/src/http/OptionDialog.ui @@ -52,7 +52,7 @@ <item> <widget class="QCheckBox" name="showNotification"> <property name="text"> - <string>Sh&ow a notification when credentials are requested</string> + <string extracomment="Credentials mean login data requested via browser extension">Sh&ow a notification when credentials are requested</string> </property> <property name="checked"> <bool>true</bool> From 3c98ce43c6999d9a941966274a99bad603dd3b31 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sat, 20 Jan 2018 13:15:03 +0100 Subject: [PATCH 289/402] Fix file selection filter on *nix systems --- src/browser/BrowserOptionDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/browser/BrowserOptionDialog.cpp b/src/browser/BrowserOptionDialog.cpp index c97ccdfd5..f6d634a82 100755 --- a/src/browser/BrowserOptionDialog.cpp +++ b/src/browser/BrowserOptionDialog.cpp @@ -117,7 +117,7 @@ void BrowserOptionDialog::showProxyLocationFileDialog() #ifdef Q_OS_WIN QString fileTypeFilter(tr("Executable Files (*.exe);;All Files (*.*)")); #else - QString fileTypeFilter(tr("Executable Files (*.*)")); + QString fileTypeFilter(tr("Executable Files (*)")); #endif auto proxyLocation = QFileDialog::getOpenFileName(this, tr("Select custom proxy location"), QFileInfo(QCoreApplication::applicationDirPath()).filePath(), From bbc5ff5103fd60d98dd6d7f6cba7b1b001be01a7 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sat, 20 Jan 2018 14:16:02 +0100 Subject: [PATCH 290/402] Use actual full en_US translation for English and drop en_plurals file --- share/translations/keepassx_en_plurals.ts | 41 ----------------------- share/translations/update.sh | 1 - src/core/Translator.cpp | 15 ++++++--- 3 files changed, 11 insertions(+), 46 deletions(-) delete mode 100644 share/translations/keepassx_en_plurals.ts diff --git a/share/translations/keepassx_en_plurals.ts b/share/translations/keepassx_en_plurals.ts deleted file mode 100644 index 02ed5541e..000000000 --- a/share/translations/keepassx_en_plurals.ts +++ /dev/null @@ -1,41 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!DOCTYPE TS> -<TS version="2.1" language="en_US"> -<context> - <name>DatabaseWidget</name> - <message numerus="yes"> - <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation> - <numerusform>Do you really want to move %n entry to the recycle bin?</numerusform> - <numerusform>Do you really want to move %n entries to the recycle bin?</numerusform> - </translation> - </message> -</context> -<context> - <name>EditEntryWidget</name> - <message numerus="yes"> - <source>%n week(s)</source> - <translation> - <numerusform>%n week</numerusform> - <numerusform>%n weeks</numerusform> - </translation> - </message> - <message numerus="yes"> - <source>%n month(s)</source> - <translation> - <numerusform>%n month</numerusform> - <numerusform>%n months</numerusform> - </translation> - </message> -</context> -<context> - <name>EditWidgetIcons</name> - <message numerus="yes"> - <source>Can't delete icon. Still used by %n item(s).</source> - <translation type="vanished"> - <numerusform>Can't delete icon. Still used by %n item.</numerusform> - <numerusform>Can't delete icon. Still used by %n items.</numerusform> - </translation> - </message> -</context> -</TS> diff --git a/share/translations/update.sh b/share/translations/update.sh index ed8a69f55..c8b7da40c 100755 --- a/share/translations/update.sh +++ b/share/translations/update.sh @@ -49,7 +49,6 @@ if $UPDATE; then LUPDATE=lupdate fi $LUPDATE -no-ui-lines -disable-heuristic similartext -locations none -no-obsolete src -ts share/translations/keepassx_en.ts - $LUPDATE -no-ui-lines -disable-heuristic similartext -locations none -pluralonly src -ts share/translations/keepassx_en_plurals.ts echo fi diff --git a/src/core/Translator.cpp b/src/core/Translator.cpp index bc75a0973..94aed3adf 100644 --- a/src/core/Translator.cpp +++ b/src/core/Translator.cpp @@ -38,6 +38,10 @@ void Translator::installTranslators() if (language == "system" || language.isEmpty()) { language = QLocale::system().name(); } + if (language == "en") { + // use actual English translation instead of the English locale source language + language = "en_US"; + } const QStringList paths = { #ifdef QT_DEBUG @@ -48,8 +52,7 @@ void Translator::installTranslators() bool translationsLoaded = false; for (const QString& path : paths) { - translationsLoaded |= installTranslator(language, path) || installTranslator("en_plurals", path); - installQtTranslator(language, path); + translationsLoaded |= installTranslator(language, path) || installTranslator("en_US", path); } if (!translationsLoaded) { // couldn't load configured language or fallback @@ -79,12 +82,16 @@ QList<QPair<QString, QString>> Translator::availableLanguages() QRegularExpressionMatch match = regExp.match(filename); if (match.hasMatch()) { QString langcode = match.captured(1); - if (langcode == "en_plurals") { - langcode = "en"; + if (langcode == "en") { + continue; } QLocale locale(langcode); QString languageStr = QLocale::languageToString(locale.language()); + if (langcode == "la") { + // langcode "la" (Latin) is translated into "C" by QLocale::languageToString() + languageStr = "Latin"; + } QString countryStr; if (langcode.contains("_")) { countryStr = QString(" (%1)").arg(QLocale::countryToString(locale.country())); From 36b4d5a12043a706e5014ed225493691128668c0 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sat, 20 Jan 2018 13:54:44 +0100 Subject: [PATCH 291/402] Update locale files and pull in latest translations --- share/translations/keepassx_ca.ts | 3282 ++++++++++++++++------ share/translations/keepassx_cs.ts | 2855 ++++++++++++++----- share/translations/keepassx_de.ts | 2890 ++++++++++++++----- share/translations/keepassx_el.ts | 2826 ++++++++++++++----- share/translations/keepassx_en.ts | 2719 +++++++++++++----- share/translations/keepassx_en_US.ts | 3872 ++++++++++++++++++++++++++ share/translations/keepassx_es.ts | 2858 ++++++++++++++----- share/translations/keepassx_eu.ts | 2849 ++++++++++++++----- share/translations/keepassx_fi.ts | 2870 ++++++++++++++----- share/translations/keepassx_fr.ts | 2869 ++++++++++++++----- share/translations/keepassx_hu.ts | 2934 ++++++++++++++----- share/translations/keepassx_id.ts | 2875 ++++++++++++++----- share/translations/keepassx_it.ts | 3018 ++++++++++++++------ share/translations/keepassx_ja.ts | 2887 ++++++++++++++----- share/translations/keepassx_ko.ts | 2862 ++++++++++++++----- share/translations/keepassx_lt.ts | 2846 ++++++++++++++----- share/translations/keepassx_nl_NL.ts | 2847 ++++++++++++++----- share/translations/keepassx_pl.ts | 2853 ++++++++++++++----- share/translations/keepassx_pt_BR.ts | 2882 ++++++++++++++----- share/translations/keepassx_pt_PT.ts | 2881 ++++++++++++++----- share/translations/keepassx_ru.ts | 2909 ++++++++++++++----- share/translations/keepassx_th.ts | 3831 +++++++++++++++++++++++++ share/translations/keepassx_tr.ts | 3059 ++++++++++++++------ share/translations/keepassx_uk.ts | 2849 ++++++++++++++----- share/translations/keepassx_zh_CN.ts | 2844 ++++++++++++++----- share/translations/keepassx_zh_TW.ts | 2885 ++++++++++++++----- 26 files changed, 59748 insertions(+), 17404 deletions(-) create mode 100644 share/translations/keepassx_en_US.ts create mode 100644 share/translations/keepassx_th.ts diff --git a/share/translations/keepassx_ca.ts b/share/translations/keepassx_ca.ts index 8d837c563..f76ace243 100644 --- a/share/translations/keepassx_ca.ts +++ b/share/translations/keepassx_ca.ts @@ -3,20 +3,40 @@ <name>AboutDialog</name> <message> <source>About KeePassXC</source> - <translation>Sobre KeePassXC</translation> + <translation>Quant al KeePassXC</translation> </message> <message> <source>About</source> - <translation>Sobre</translation> + <translation>Quant</translation> + </message> + <message> + <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> + <translation>Reportar errors a: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> + </message> + <message> + <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>KeepassXC es distribueix sota els termes de la Llicència Pública General GNU (GPL) versió 2 o (segons la vostra opció) versió 3.</translation> + </message> + <message> + <source>Project Maintainers:</source> + <translation>Mantenidors del projecte:</translation> </message> <message> <source>Contributors</source> <translation>Contribuïdors</translation> </message> + <message> + <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Veure els contribuïdors a GitHub</a></translation> + </message> <message> <source>Debug Info</source> <translation>Informació de depuració</translation> </message> + <message> + <source>Include the following information whenever you report a bug:</source> + <translation>Inclou la següent informació a l'hora de reportar un error:</translation> + </message> <message> <source>Copy to clipboard</source> <translation>Copia al porta-retalls</translation> @@ -31,6 +51,10 @@ <source>Revision: %1</source> <translation>Revisió: %1</translation> </message> + <message> + <source>Distribution: %1</source> + <translation>Distribució: %1</translation> + </message> <message> <source>Libraries:</source> <translation>Llibreries</translation> @@ -47,33 +71,13 @@ Nucli: %3 %4</translation> <source>Enabled extensions:</source> <translation>Extensions habilitades:</translation> </message> - <message> - <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> - <translation>Reportar errors a: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> - </message> - <message> - <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeepassXC es distribueix sota els termes de la Llicència Pública General GNU (GPL) versió 2 o (segons la vostra opció) versió 3.</translation> - </message> - <message> - <source>Project Maintainers:</source> - <translation>Mantenidors del projecte:</translation> - </message> - <message> - <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Veure els contribuïdors a GitHub</a></translation> - </message> - <message> - <source>Include the following information whenever you report a bug:</source> - <translation>Inclou la següent informació a l'hora de reportar un error:</translation> - </message> - <message> - <source>Distribution: %1</source> - <translation>Distribució: %1</translation> - </message> </context> <context> <name>AccessControlDialog</name> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>KeePassXC HTTP Confirmeu l'accés</translation> + </message> <message> <source>Remember this decision</source> <translation>Recorda aquesta decisió</translation> @@ -89,11 +93,15 @@ Nucli: %3 %4</translation> <message> <source>%1 has requested access to passwords for the following item(s). Please select whether you want to allow access.</source> - <translation type="unfinished"/> + <translation>%1 ha demanat l'accés a contrasenyes pels següents elements. +Seleccioneu si voleu permetre l'accés.</translation> </message> +</context> +<context> + <name>AgentSettingsWidget</name> <message> - <source>KeePassXC HTTP Confirm Access</source> - <translation>KeePassXC HTTP Confirmeu l'accés</translation> + <source>Enable SSH Agent (requires restart)</source> + <translation type="unfinished"/> </message> </context> <context> @@ -104,6 +112,26 @@ Please select whether you want to allow access.</source> </message> <message> <source>Auto-Type - KeePassXC</source> + <translation>Compleció automàtica - KeePassXC</translation> + </message> + <message> + <source>Auto-Type</source> + <translation>Compleció automàtica</translation> + </message> + <message> + <source>The Syntax of your Auto-Type statement is incorrect!</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> <translation type="unfinished"/> </message> </context> @@ -124,14 +152,291 @@ Please select whether you want to allow access.</source> </context> <context> <name>AutoTypeSelectDialog</name> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>Compleció automàtica - KeePassXC</translation> + </message> <message> <source>Select entry to Auto-Type:</source> + <translation>Seleccione l'entrada per a la compleció automàtica:</translation> + </message> +</context> +<context> + <name>BrowserAccessControlDialog</name> + <message> + <source>KeePassXC-Browser Confirm Access</source> <translation type="unfinished"/> </message> <message> - <source>Auto-Type - KeePassXC</source> + <source>Remember this decision</source> + <translation>Recorda aquesta decisió</translation> + </message> + <message> + <source>Allow</source> + <translation>Permet</translation> + </message> + <message> + <source>Deny</source> + <translation>Denega</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 ha demanat l'accés a contrasenyes pels següents elements. +Seleccioneu si voleu permetre l'accés.</translation> + </message> +</context> +<context> + <name>BrowserOptionDialog</name> + <message> + <source>Dialog</source> + <translation>Diàleg</translation> + </message> + <message> + <source>This is required for accessing your databases with KeePassXC-Browser</source> <translation type="unfinished"/> </message> + <message> + <source>Enable KeepassXC browser integration</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>General</translation> + </message> + <message> + <source>Enable integration for these browsers:</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Google Chrome</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Firefox</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Chromium</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Vivaldi</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show a &notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Sol·licitar el desbloqueig de la base de dades si està blocada</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Match URL scheme (e.g., https://...)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>Només retorna les millors coincidències per a una adreça URL específica en lloc de totes les entrades per al domini.</translation> + </message> + <message> + <source>&Return only best-matching credentials</source> + <translation type="unfinished"/> + </message> + <message> + <source>Sort &matching credentials by title</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Sort matching credentials by &username</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>&Disconnect all browsers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Forget all remembered &permissions</source> + <translation type="unfinished"/> + </message> + <message> + <source>Advanced</source> + <translation>Avançat</translation> + </message> + <message> + <source>Never &ask before accessing credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Never ask before &updating credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>Només s'ha de connectar amb un client, la base de dades seleccionada.</translation> + </message> + <message> + <source>Searc&h in all opened databases for matching credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>L'actualització o creació de camps de test no està suportada.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>Retorna camps avançats de text que comencen amb "KPH: "</translation> + </message> + <message> + <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Update &native messaging manifest files at startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Support a proxy application between KeePassXC and browser extension.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &proxy application between KeePassXC and browser extension</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a custom proxy location if you installed a proxy manually.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &custom proxy location</source> + <comment>Meant is the proxy for KeePassXC-Browser</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*.exe);;All Files (*.*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select custom proxy location</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>BrowserService</name> + <message> + <source>KeePassXC: New key association request</source> + <translation>KeePassXC: Nova petició de associació de clau</translation> + </message> + <message> + <source>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Save and allow access</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: Voleu sobreescriure la clau existent?</translation> + </message> + <message> + <source>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: Actualitza l'entrada</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Voleu actualitzar la informació en %1 - %2?</translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: Base de dades bloquejada!</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>La base de dades activa està bloquejada! +Per favor, desbloqueu la base de dades seleccionada o escolliu-ne una altra.</translation> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: La configuració no està disponible!</translation> + </message> + <message> + <source>The active database does not contain a settings entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: No s'han trobat claus</translation> + </message> + <message> + <source>No shared encryption keys found in KeePassXC Settings.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: Claus de la base de dades eliminades</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Removing stored permissions…</source> + <translation type="unfinished"/> + </message> + <message> + <source>Abort</source> + <translation>Avorta</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: Permisos eliminats</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entry(s).</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation>KeePassXC: No s'ha trobat cap entrada amb permisos!</translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>La base de dades activa no conté cap entrada amb permisos.</translation> + </message> </context> <context> <name>ChangeMasterKeyWidget</name> @@ -147,14 +452,26 @@ Please select whether you want to allow access.</source> <source>Repeat password:</source> <translation>Repetiu la contrasenya:</translation> </message> + <message> + <source>&Key file</source> + <translation>Arxiu clau</translation> + </message> <message> <source>Browse</source> - <translation>Navegar</translation> + <translation>Navega</translation> </message> <message> <source>Create</source> <translation>Crea</translation> </message> + <message> + <source>Cha&llenge Response</source> + <translation>Pregunta/resposta</translation> + </message> + <message> + <source>Refresh</source> + <translation>Actualitza</translation> + </message> <message> <source>Key files</source> <translation>Fitxers de clau</translation> @@ -169,12 +486,16 @@ Please select whether you want to allow access.</source> </message> <message> <source>Unable to create Key File : </source> - <translation type="unfinished"/> + <translation>No s'ha pogut de crear el fitxer clau: </translation> </message> <message> <source>Select a key file</source> <translation>Seleccioneu un arxiu clau</translation> </message> + <message> + <source>Empty password</source> + <translation>Contrasenya buida</translation> + </message> <message> <source>Do you really want to use an empty string as password?</source> <translation>Realment voleu utilitzar una cadena buida com a contrasenya?</translation> @@ -189,24 +510,19 @@ Please select whether you want to allow access.</source> <translation>No ha pogut definir %1 com a arxiu clau: %2</translation> </message> <message> - <source>&Key file</source> - <translation>Arxiu clau</translation> - </message> - <message> - <source>Cha&llenge Response</source> + <source>Legacy key file format</source> <translation type="unfinished"/> </message> <message> - <source>Refresh</source> - <translation>L'actualitza</translation> - </message> - <message> - <source>Empty password</source> - <translation>Contrasenya buida</translation> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> - <translation type="unfinished"/> + <translation>Ha fallat el canvi de clau mestra: cap YubiKey inserida.</translation> </message> </context> <context> @@ -215,6 +531,10 @@ Please select whether you want to allow access.</source> <source>Clone Options</source> <translation>Clona les opcions</translation> </message> + <message> + <source>Append ' - Clone' to title</source> + <translation>Afegeix '-clon' al títol</translation> + </message> <message> <source>Replace username and password with references</source> <translation>Substituir el nom d'usuari i contrasenya amb referències</translation> @@ -223,10 +543,6 @@ Please select whether you want to allow access.</source> <source>Copy history</source> <translation>Còpia el historial</translation> </message> - <message> - <source>Append ' - Clone' to title</source> - <translation>Afegeix '-clon' al títol</translation> - </message> </context> <context> <name>CsvImportWidget</name> @@ -284,7 +600,7 @@ Please select whether you want to allow access.</source> </message> <message> <source>Not present in CSV file</source> - <translation type="unfinished"/> + <translation>No apareix al fitxer CSV</translation> </message> <message> <source>Empty fieldname </source> @@ -308,7 +624,7 @@ Please select whether you want to allow access.</source> </message> <message> <source> more messages skipped]</source> - <translation type="unfinished"/> + <translation> més missatges omesos]</translation> </message> <message> <source>Error</source> @@ -317,15 +633,12 @@ Please select whether you want to allow access.</source> <message> <source>CSV import: writer has errors: </source> - <translation type="unfinished"/> + <translation>Importació CSV: el fitxer té errors: +</translation> </message> </context> <context> <name>CsvImportWizard</name> - <message> - <source>Import CSV file</source> - <translation type="unfinished"/> - </message> <message> <source>Error</source> <translation>Error</translation> @@ -337,17 +650,17 @@ Please select whether you want to allow access.</source> </context> <context> <name>CsvParserModel</name> - <message> - <source> byte, </source> - <translation> byte, </translation> + <message numerus="yes"> + <source>%n byte(s), </source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> - <message> - <source> rows, </source> - <translation> files, </translation> + <message numerus="yes"> + <source>%n row(s), </source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> - <message> - <source> columns</source> - <translation> columnes</translation> + <message numerus="yes"> + <source>%n column(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> </context> <context> @@ -368,6 +681,14 @@ Please select whether you want to allow access.</source> <source>Browse</source> <translation>Navega</translation> </message> + <message> + <source>Refresh</source> + <translation>Actualitza</translation> + </message> + <message> + <source>Challenge Response:</source> + <translation>Pregunta/resposta</translation> + </message> <message> <source>Unable to open the database.</source> <translation>No es pot obrir la base de dades.</translation> @@ -376,26 +697,33 @@ Please select whether you want to allow access.</source> <source>Can't open key file</source> <translation>No es pot obrir el fitxer de clau</translation> </message> + <message> + <source>Legacy key file format</source> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't show this warning again</source> + <translation type="unfinished"/> + </message> <message> <source>All files</source> <translation>Tots els fitxers</translation> </message> <message> <source>Key files</source> - <translation>Arxius de clau</translation> + <translation>Fitxers de clau</translation> </message> <message> <source>Select key file</source> <translation>Seleccioneu el fitxer de clau</translation> </message> - <message> - <source>Refresh</source> - <translation>Actualitza</translation> - </message> - <message> - <source>Challenge Response:</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DatabaseRepairWidget</name> @@ -411,22 +739,23 @@ Please select whether you want to allow access.</source> <source>Can't open key file</source> <translation>No es pot obrir el fitxer de clau</translation> </message> - <message> - <source>Database opened fine. Nothing to do.</source> - <translation type="unfinished"/> - </message> <message> <source>Unable to open the database.</source> <translation>No es pot obrir la base de dades.</translation> </message> + <message> + <source>Database opened fine. Nothing to do.</source> + <translation>Base de dades oberta correctament.</translation> + </message> <message> <source>Success</source> - <translation type="unfinished"/> + <translation>Completat amb èxit</translation> </message> <message> <source>The database has been successfully repaired You can now save it.</source> - <translation type="unfinished"/> + <translation>La base de dades ha estat reparada. + Ara es pot desar.</translation> </message> <message> <source>Unable to repair the database.</source> @@ -435,6 +764,102 @@ You can now save it.</source> </context> <context> <name>DatabaseSettingsWidget</name> + <message> + <source>General</source> + <translation>General</translation> + </message> + <message> + <source>Encryption</source> + <translation type="unfinished"/> + </message> + <message> + <source>Number of rounds too high</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Understood, keep number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cancel</source> + <translation type="unfinished"/> + </message> + <message> + <source>Number of rounds too low</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</source> + <translation type="unfinished"/> + </message> + <message> + <source>KDF unchanged</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetEncryption</name> + <message> + <source>Encryption Algorithm:</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES: 256 Bit (default)</source> + <translation>AES: 256 bits (per defecte)</translation> + </message> + <message> + <source>Twofish: 256 Bit</source> + <translation>Twofish: 256 bits</translation> + </message> + <message> + <source>Key Derivation Function:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Transform rounds:</source> + <translation>Transformar rondes:</translation> + </message> + <message> + <source>Benchmark 1-second delay</source> + <translation type="unfinished"/> + </message> + <message> + <source>Memory Usage:</source> + <translation type="unfinished"/> + </message> + <message> + <source> MB</source> + <translation type="unfinished"/> + </message> + <message> + <source>Parallelism:</source> + <translation type="unfinished"/> + </message> + <message> + <source> thread</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetGeneral</name> + <message> + <source>Database Meta Data</source> + <translation type="unfinished"/> + </message> <message> <source>Database name:</source> <translation>Nom de base de dades:</translation> @@ -443,20 +868,12 @@ You can now save it.</source> <source>Database description:</source> <translation>Descripció de la base de dades:</translation> </message> - <message> - <source>Transform rounds:</source> - <translation type="unfinished"/> - </message> <message> <source>Default username:</source> <translation>Usuari per defecte:</translation> </message> <message> - <source> MiB</source> - <translation> MiB</translation> - </message> - <message> - <source>Benchmark</source> + <source>History Settings</source> <translation type="unfinished"/> </message> <message> @@ -467,27 +884,20 @@ You can now save it.</source> <source>Max. history size:</source> <translation>Mida màx. del historial:</translation> </message> + <message> + <source> MiB</source> + <translation> MiB</translation> + </message> <message> <source>Use recycle bin</source> <translation>Utilitza la paperera</translation> </message> - <message> - <source>AES: 256 Bit (default)</source> - <translation>AES: 256 bits (per defecte)</translation> - </message> - <message> - <source>Twofish: 256 Bit</source> - <translation>Twofish: 256 bits</translation> - </message> - <message> - <source>Algorithm:</source> - <translation>Algoritme:</translation> - </message> </context> <context> <name>DatabaseTabWidget</name> <message> <source>Root</source> + <comment>Root group</comment> <translation>Arrel</translation> </message> <message> @@ -506,6 +916,30 @@ You can now save it.</source> <source>File not found!</source> <translation>No s'ha trobat el fitxer!</translation> </message> + <message> + <source>Unable to open the database.</source> + <translation>No es pot obrir la base de dades.</translation> + </message> + <message> + <source>File opened in read only mode.</source> + <translation>Arxiu obert en mode de només lectura.</translation> + </message> + <message> + <source>Open CSV file</source> + <translation>Obre arxiu CSV</translation> + </message> + <message> + <source>CSV file</source> + <translation>Fitxer CSV</translation> + </message> + <message> + <source>All files (*)</source> + <translation>Tots els arxius (*)</translation> + </message> + <message> + <source>Merge database</source> + <translation>Fusiona la base de dades</translation> + </message> <message> <source>Open KeePass 1 database</source> <translation>Obre base de dades de KeePass 1</translation> @@ -514,14 +948,16 @@ You can now save it.</source> <source>KeePass 1 database</source> <translation>Base de dades de KeePass 1</translation> </message> - <message> - <source>All files (*)</source> - <translation>Tots els arxius (*)</translation> - </message> <message> <source>Close?</source> <translation>Voleu tancar?</translation> </message> + <message> + <source>"%1" is in edit mode. +Discard changes and close anyway?</source> + <translation>"%1" està en mode d'edició. +Voleu descartar els canvis i tancar de totes maneres?</translation> + </message> <message> <source>Save changes?</source> <translation>Voleu desar els canvis?</translation> @@ -536,10 +972,22 @@ Voleu desar els canvis?</translation> <source>Writing the database failed.</source> <translation>Ha fallat l'escriptura en la base de dades.</translation> </message> + <message> + <source>Passwords</source> + <translation>Contrasenyes</translation> + </message> <message> <source>Save database as</source> <translation>Desa la base de dades com a</translation> </message> + <message> + <source>Export database to CSV file</source> + <translation>Exporta la base de dades a un fitxer CSV</translation> + </message> + <message> + <source>Writing the CSV file failed.</source> + <translation>Ha fallat l'escriptura al fitxer CSV.</translation> + </message> <message> <source>New database</source> <translation>Nova base de dades</translation> @@ -557,12 +1005,6 @@ Voleu desar els canvis?</translation> Please press cancel to finish your changes or discard them.</source> <translation>No es pot bloquejar la base de dades actualment en ús. Per favor, feu clic a cancel·la per a finalitzar els canvis o descarteu-los.</translation> - </message> - <message> - <source>This database has never been saved. -You can save the database or stop locking it.</source> - <translation>Aquesta base de dades no s'ha desat. -Podeu desar la base de dades o deixar de bloquejar-la.</translation> </message> <message> <source>This database has been modified. @@ -572,69 +1014,13 @@ Otherwise your changes are lost.</source> Voleu desar la base de dades abans de tancar-la? En cas contrari, es perderan els canvis.</translation> </message> - <message> - <source>"%1" is in edit mode. -Discard changes and close anyway?</source> - <translation>"%1" està en mode d'edició. -Voleu descartar els canvis i tancar de totes maneres?</translation> - </message> - <message> - <source>Export database to CSV file</source> - <translation>Exporta la base de dades a un fitxer CSV</translation> - </message> - <message> - <source>CSV file</source> - <translation>Fitxer CSV</translation> - </message> - <message> - <source>Writing the CSV file failed.</source> - <translation>Ha fallat l'escriptura al fitxer CSV.</translation> - </message> - <message> - <source>Unable to open the database.</source> - <translation>No es pot obrir la base de dades.</translation> - </message> - <message> - <source>Merge database</source> - <translation>Fusiona la base de dades</translation> - </message> - <message> - <source>The database you are trying to save as is locked by another instance of KeePassXC. -Do you want to save it anyway?</source> - <translation>La base de dades que està intentant salvar està bloquejada per una altra instància de KeePassXC. -Voleu desar-la igualment?</translation> - </message> - <message> - <source>Passwords</source> - <translation>Contrasenyes</translation> - </message> - <message> - <source>Database already opened</source> - <translation>La base de dades ja està oberta</translation> - </message> - <message> - <source>The database you are trying to open is locked by another instance of KeePassXC. - -Do you want to open it anyway?</source> - <translation>La base de dades que està intentant obrir està bloquejada per una altra instància de KeePassXC. - -Voleu obrir-la igualment?</translation> - </message> - <message> - <source>Open read-only</source> - <translation>Obre en mode només de lectura</translation> - </message> - <message> - <source>File opened in read only mode.</source> - <translation>Arxiu obert en mode de només lectura.</translation> - </message> - <message> - <source>Open CSV file</source> - <translation>Obre arxiu CSV</translation> - </message> </context> <context> <name>DatabaseWidget</name> + <message> + <source>Searching...</source> + <translation>Cercant...</translation> + </message> <message> <source>Change master key</source> <translation>Canvia la clau mestra</translation> @@ -655,26 +1041,6 @@ Voleu obrir-la igualment?</translation> <source>Do you really want to delete %1 entries for good?</source> <translation>Realment voleu suprimir %1 entrades per sempre?</translation> </message> - <message> - <source>Move entries to recycle bin?</source> - <translation>Moure les entrades a la paperera?</translation> - </message> - <message numerus="yes"> - <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>Realment voleu moure %n entry(s) a la Paperera de reciclatge?</numerusform><numerusform>Realment voleu moure %n entrada(es) a la paperera?</numerusform></translation> - </message> - <message> - <source>Delete group?</source> - <translation>Voleu suprimir el grup?</translation> - </message> - <message> - <source>Do you really want to delete the group "%1" for good?</source> - <translation>Realment voleu suprimir el grup "%1" per sempre?</translation> - </message> - <message> - <source>Unable to calculate master key</source> - <translation>No es pot calcular la clau mestra</translation> - </message> <message> <source>Move entry to recycle bin?</source> <translation>Moure l'entrada a la Paperera?</translation> @@ -684,24 +1050,12 @@ Voleu obrir-la igualment?</translation> <translation>Realment voleu moure l'entrada "%1" a la paperera?</translation> </message> <message> - <source>Searching...</source> - <translation>Cercant...</translation> + <source>Move entries to recycle bin?</source> + <translation>Moure les entrades a la paperera?</translation> </message> - <message> - <source>No current database.</source> - <translation>Cap base de dades actual.</translation> - </message> - <message> - <source>No source database, nothing to do.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Search Results (%1)</source> - <translation>Resultats de la cerca (%1)</translation> - </message> - <message> - <source>No Results</source> - <translation>No hi ha resultats</translation> + <message numerus="yes"> + <source>Do you really want to move %n entry(s) to the recycle bin?</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> <message> <source>Execute command?</source> @@ -716,8 +1070,36 @@ Voleu obrir-la igualment?</translation> <translation>Recordar la meva elecció</translation> </message> <message> - <source>Autoreload Request</source> - <translation>Tona a carregar la petició</translation> + <source>Delete group?</source> + <translation>Voleu suprimir el grup?</translation> + </message> + <message> + <source>Do you really want to delete the group "%1" for good?</source> + <translation>Realment voleu suprimir el grup "%1" per sempre?</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>No es pot calcular la clau mestra</translation> + </message> + <message> + <source>No current database.</source> + <translation>Cap base de dades actual.</translation> + </message> + <message> + <source>No source database, nothing to do.</source> + <translation>Cap base de dades, res a veure.</translation> + </message> + <message> + <source>Search Results (%1)</source> + <translation>Resultats de la cerca (%1)</translation> + </message> + <message> + <source>No Results</source> + <translation>No hi ha resultats</translation> + </message> + <message> + <source>File has changed</source> + <translation type="unfinished"/> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -725,15 +1107,16 @@ Voleu obrir-la igualment?</translation> </message> <message> <source>Merge Request</source> - <translation type="unfinished"/> + <translation>Petició de combinació</translation> </message> <message> - <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> - <translation>El fitxer de base de dades ha canviat i té canvis no desats. Voleu combinar els canvis?</translation> + <source>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</source> + <translation type="unfinished"/> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> - <translation type="unfinished"/> + <translation>No s'ha pogut obrir el nou fitxer de base de dades al intentar reobrir aquesta base de dades.</translation> </message> <message> <source>Empty recycle bin?</source> @@ -744,6 +1127,89 @@ Voleu obrir-la igualment?</translation> <translation>Esteu segur que voleu suprimir permanentment tot el contingut de la paperera?</translation> </message> </context> +<context> + <name>DetailsWidget</name> + <message> + <source>Generate TOTP Token</source> + <translation type="unfinished"/> + </message> + <message> + <source>Close</source> + <translation>Tanca</translation> + </message> + <message> + <source>General</source> + <translation>General</translation> + </message> + <message> + <source>Password</source> + <translation>Contrasenya</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Expiration</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username</source> + <translation>Nom d'usuari</translation> + </message> + <message> + <source>Autotype</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searching</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attributes</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation>Fitxers adjunts</translation> + </message> + <message> + <source>Notes</source> + <translation>Notes</translation> + </message> + <message> + <source>Window</source> + <translation>Finestra</translation> + </message> + <message> + <source>Sequence</source> + <translation>Seqüència</translation> + </message> + <message> + <source>Search</source> + <translation>Cerca</translation> + </message> + <message> + <source>Clear</source> + <translation>Neteja</translation> + </message> + <message> + <source>Never</source> + <translation type="unfinished"/> + </message> + <message> + <source>[PROTECTED]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Disabled</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enabled</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EditEntryWidget</name> <message> @@ -760,7 +1226,7 @@ Voleu obrir-la igualment?</translation> </message> <message> <source>Auto-Type</source> - <translation type="unfinished"/> + <translation>Compleció automàtica</translation> </message> <message> <source>Properties</source> @@ -770,6 +1236,30 @@ Voleu obrir-la igualment?</translation> <source>History</source> <translation>Historial</translation> </message> + <message> + <source>SSH Agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>(encrypted)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>File too large to be a private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open private key</source> + <translation type="unfinished"/> + </message> <message> <source>Entry history</source> <translation>Historial de l'entrada</translation> @@ -790,40 +1280,6 @@ Voleu obrir-la igualment?</translation> <source>New attribute</source> <translation>Nou atribut</translation> </message> - <message> - <source>Select file</source> - <translation>Seleccioneu el fitxer</translation> - </message> - <message> - <source>Unable to open file</source> - <translation>No es pot obrir el fitxer</translation> - </message> - <message> - <source>Save attachment</source> - <translation>Deseu el fitxer adjunt</translation> - </message> - <message> - <source>Unable to save the attachment: -</source> - <translation>No es por desar l'arxiu adjunt: -</translation> - </message> - <message> - <source>Tomorrow</source> - <translation>Demà</translation> - </message> - <message numerus="yes"> - <source>%n week(s)</source> - <translation><numerusform>%n setmanes</numerusform><numerusform>%n setmana(es)</numerusform></translation> - </message> - <message numerus="yes"> - <source>%n month(s)</source> - <translation><numerusform>%n mes (OS)</numerusform><numerusform>%n mes(os)</numerusform></translation> - </message> - <message> - <source>1 year</source> - <translation>1 any</translation> - </message> <message> <source>Confirm Remove</source> <translation>Confirma la supressió</translation> @@ -833,12 +1289,28 @@ Voleu obrir-la igualment?</translation> <translation>Esteu segur que voleu suprimir aquest atribut?</translation> </message> <message> - <source>[PROTECTED] Press reveal to view or edit</source> - <translation>[PROTEGIT] Premeu revelar per veure o editar</translation> + <source>[PROTECTED]</source> + <translation type="unfinished"/> </message> <message> - <source>Are you sure you want to remove this attachment?</source> - <translation>Esteu segur que voleu suprimir aquest fitxer adjunt?</translation> + <source>Press reveal to view or edit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Tomorrow</source> + <translation>Demà</translation> + </message> + <message numerus="yes"> + <source>%n week(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source>%n month(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>1 year</source> + <translation>1 any</translation> </message> </context> <context> @@ -855,18 +1327,6 @@ Voleu obrir-la igualment?</translation> <source>Remove</source> <translation>Suprimiu</translation> </message> - <message> - <source>Attachments</source> - <translation>Fitxers adjunts</translation> - </message> - <message> - <source>Save</source> - <translation>Desa</translation> - </message> - <message> - <source>Open</source> - <translation>Obre</translation> - </message> <message> <source>Edit Name</source> <translation>Edita el nom</translation> @@ -879,12 +1339,28 @@ Voleu obrir-la igualment?</translation> <source>Reveal</source> <translation>Revela</translation> </message> + <message> + <source>Attachments</source> + <translation>Fitxers adjunts</translation> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> <message> <source>Enable Auto-Type for this entry</source> - <translation type="unfinished"/> + <translation>Permetre la compleció automàtica per a aquesta entrada</translation> + </message> + <message> + <source>Inherit default Auto-Type sequence from the &group</source> + <translation>Hereta la seqüència de compleció automàtica per defecte de &grup</translation> + </message> + <message> + <source>&Use custom Auto-Type sequence:</source> + <translation>&Utilitza la seqüència personalitzada per a la compleció automàtica:</translation> + </message> + <message> + <source>Window Associations</source> + <translation>Associacions de finestra</translation> </message> <message> <source>+</source> @@ -898,25 +1374,13 @@ Voleu obrir-la igualment?</translation> <source>Window title:</source> <translation>Títol de la finestra:</translation> </message> - <message> - <source>Inherit default Auto-Type sequence from the &group</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Use custom Auto-Type sequence:</source> - <translation type="unfinished"/> - </message> <message> <source>Use default se&quence</source> - <translation type="unfinished"/> + <translation>Utilitza la se&qüència per defecte a la compleció automàtica </translation> </message> <message> <source>Set custo&m sequence:</source> - <translation type="unfinished"/> - </message> - <message> - <source>Window Associations</source> - <translation type="unfinished"/> + <translation>Estableix una seqüència personalitzada per a la compleció automàtica :</translation> </message> </context> <context> @@ -941,12 +1405,8 @@ Voleu obrir-la igualment?</translation> <context> <name>EditEntryWidgetMain</name> <message> - <source>Title:</source> - <translation>Títol:</translation> - </message> - <message> - <source>Username:</source> - <translation>Nom d'usuari:</translation> + <source>URL:</source> + <translation>URL:</translation> </message> <message> <source>Password:</source> @@ -957,20 +1417,104 @@ Voleu obrir-la igualment?</translation> <translation>Repeteix:</translation> </message> <message> - <source>URL:</source> - <translation>URL:</translation> + <source>Title:</source> + <translation>Títol:</translation> </message> <message> - <source>Expires</source> - <translation>Expira</translation> + <source>Notes</source> + <translation>Notes</translation> </message> <message> <source>Presets</source> <translation>Configuracions</translation> </message> <message> - <source>Notes:</source> - <translation>Notes:</translation> + <source>Toggle the checkbox to reveal the notes section.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username:</source> + <translation>Nom d'usuari:</translation> + </message> + <message> + <source>Expires</source> + <translation>Expira</translation> + </message> +</context> +<context> + <name>EditEntryWidgetSSHAgent</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent after</source> + <translation type="unfinished"/> + </message> + <message> + <source> seconds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fingerprint</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent when database is closed/locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add key to agent when database is opened/unlocked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Comment</source> + <translation type="unfinished"/> + </message> + <message> + <source>Decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy to clipboard</source> + <translation>Copia al porta-retalls</translation> + </message> + <message> + <source>Private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>External file</source> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Attachment</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add to agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove from agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Require user confirmation when this key is used</source> + <translation type="unfinished"/> </message> </context> <context> @@ -1028,19 +1572,27 @@ Voleu obrir-la igualment?</translation> </message> <message> <source>Auto-Type</source> - <translation type="unfinished"/> + <translation>Compleció automàtica</translation> </message> <message> <source>&Use default Auto-Type sequence of parent group</source> - <translation type="unfinished"/> + <translation>&Utilitza seqüència per defecte del grup pare per a lacompleció automàtica</translation> </message> <message> <source>Set default Auto-Type se&quence</source> - <translation type="unfinished"/> + <translation>Estableix la se&qüència per defecte per a la compleció automàtica</translation> </message> </context> <context> <name>EditWidgetIcons</name> + <message> + <source>&Use default icon</source> + <translation>&Utilitzar icona per defecte</translation> + </message> + <message> + <source>Use custo&m icon</source> + <translation>Utilitza una icona personalitzada</translation> + </message> <message> <source>Add custom icon</source> <translation>Afegeix una icona personalitzada</translation> @@ -1049,6 +1601,18 @@ Voleu obrir-la igualment?</translation> <source>Delete custom icon</source> <translation>Suprimeix la icona personalitzada</translation> </message> + <message> + <source>Download favicon</source> + <translation>Descarregua el favicon</translation> + </message> + <message> + <source>Unable to fetch favicon.</source> + <translation>No es pot descarregar el favicon.</translation> + </message> + <message> + <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> + <translation>Consell: Podeu activar Google com a recurs alternatiu a Eines > Configuració > Seguretat</translation> + </message> <message> <source>Images</source> <translation>Imatges</translation> @@ -1061,25 +1625,13 @@ Voleu obrir-la igualment?</translation> <source>Select Image</source> <translation>Seleccioneu la imatge</translation> </message> - <message> - <source>Download favicon</source> - <translation>Descarregua el favicon</translation> - </message> - <message> - <source>Unable to fetch favicon.</source> - <translation>No es pot descarregar el favicon.</translation> - </message> <message> <source>Can't read icon</source> <translation>No es pot llegir la icona</translation> </message> <message> - <source>&Use default icon</source> - <translation type="unfinished"/> - </message> - <message> - <source>Use custo&m icon</source> - <translation type="unfinished"/> + <source>Custom icon already exists</source> + <translation>Ja existeix una icona personalitzada</translation> </message> <message> <source>Confirm Delete</source> @@ -1089,14 +1641,6 @@ Voleu obrir-la igualment?</translation> <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> <translation>Aquesta icona s'utilitza en %1 entrades i serà substituïda per la icona per defecte. Esteu segur que voleu suprimir-la?</translation> </message> - <message> - <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation>Consell: Podeu activar Google com a recurs alternatiu a Eines > Configuració > Seguretat</translation> - </message> - <message> - <source>Custom icon already exists</source> - <translation>Ja existeix una icona personalitzada</translation> - </message> </context> <context> <name>EditWidgetProperties</name> @@ -1121,9 +1665,93 @@ Voleu obrir-la igualment?</translation> <name>Entry</name> <message> <source> - Clone</source> + <comment>Suffix added to cloned entries</comment> <translation> -Clon</translation> </message> </context> +<context> + <name>EntryAttachmentsModel</name> + <message> + <source>Name</source> + <translation>Nom</translation> + </message> + <message> + <source>Size</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EntryAttachmentsWidget</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add</source> + <translation>Afegiu</translation> + </message> + <message> + <source>Remove</source> + <translation>Suprimiu</translation> + </message> + <message> + <source>Open</source> + <translation>Obre</translation> + </message> + <message> + <source>Save</source> + <translation>Desa</translation> + </message> + <message> + <source>Select files</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <source>Are you sure you want to remove %n attachment(s)?</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>Confirma la supressió</translation> + </message> + <message> + <source>Save attachments</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to create directory: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Confirm overwrite</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to save attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachment: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open files: +%1</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EntryAttributesModel</name> <message> @@ -1152,6 +1780,11 @@ Voleu obrir-la igualment?</translation> </context> <context> <name>EntryModel</name> + <message> + <source>Ref: </source> + <comment>Reference abbreviation</comment> + <translation>Ref: </translation> + </message> <message> <source>Group</source> <translation>Grup</translation> @@ -1168,11 +1801,6 @@ Voleu obrir-la igualment?</translation> <source>URL</source> <translation>URL</translation> </message> - <message> - <source>Ref: </source> - <comment>Reference abbreviation</comment> - <translation>Ref: </translation> - </message> </context> <context> <name>Group</name> @@ -1181,6 +1809,17 @@ Voleu obrir-la igualment?</translation> <translation>Paperera</translation> </message> </context> +<context> + <name>HostInstaller</name> + <message> + <source>KeePassXC: Cannot save file!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot save the native messaging script file.</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>HttpPasswordGeneratorWidget</name> <message> @@ -1213,33 +1852,388 @@ Voleu obrir-la igualment?</translation> </message> <message> <source>0-9</source> - <translation type="unfinished"/> + <translation>0-9</translation> </message> <message> <source>Special Characters</source> - <translation type="unfinished"/> + <translation>Caràcters especials</translation> </message> <message> <source>/*_& ...</source> - <translation type="unfinished"/> + <translation>/*_& ...</translation> </message> <message> <source>Exclude look-alike characters</source> - <translation type="unfinished"/> + <translation>Excloure caràcters d'aspecte semblant</translation> </message> <message> <source>Ensure that the password contains characters from every group</source> - <translation type="unfinished"/> + <translation>Assegurar-se que la contrasenya conté caràcters de cada grup</translation> </message> </context> <context> <name>KMessageWidget</name> <message> <source>&Close</source> - <translation type="unfinished"/> + <translation>&Tancar</translation> </message> <message> <source>Close message</source> + <translation>Tancar missatge</translation> + </message> +</context> +<context> + <name>Kdbx3Reader</name> + <message> + <source>Unable to calculate master key</source> + <translation>No es pot calcular la clau mestra</translation> + </message> + <message> + <source>Unable to issue challenge-response.</source> + <translation>Incapaç d'emetre pregunta-resposta.</translation> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>Clau incorrecta o fitxer de base de dades corrupte.</translation> + </message> +</context> +<context> + <name>Kdbx3Writer</name> + <message> + <source>Unable to issue challenge-response.</source> + <translation>Incapaç d'emetre pregunta-resposta.</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>No es pot calcular la clau mestra</translation> + </message> +</context> +<context> + <name>Kdbx4Reader</name> + <message> + <source>missing database headers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>No es pot calcular la clau mestra</translation> + </message> + <message> + <source>Invalid header checksum size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Header SHA256 mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header data length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open buffer for KDF parameters in header</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported key derivation function (KDF) or invalid parameters</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy header fields found in KDBX4 file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header binary size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass variant map version.</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name data</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value data</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Bool entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry type</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map field type size</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Kdbx4Writer</name> + <message> + <source>Invalid symmetric cipher algorithm.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid symmetric cipher IV size.</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>No es pot calcular la clau mestra</translation> + </message> + <message> + <source>Failed to serialize KDF parameters variant map</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxReader</name> + <message> + <source>Invalid cipher uuid length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid compression flags length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported compression algorithm</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid master seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform rounds size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid start bytes size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid random stream id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner random stream cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>No és una base de dades KeePass.</translation> + </message> + <message> + <source>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> + <translation>El fitxer seleccionat és una base de dades KeePass 1 antiga (.kdb). + +Podeu importar-la fent clic a la base de dades > "importar base de dades KeePass 1...". +Es tracta d'una migració unidireccional. No obrir la base de dades importada amb la antiga versió KeePassX 0.4.</translation> + </message> + <message> + <source>Unsupported KeePass 2 database version.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxXmlReader</name> + <message> + <source>XML parsing failure: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>No root group</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing icon uuid or data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing custom data key or value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Multiple group elements</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null group uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableAutoType value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableSearching value</source> + <translation type="unfinished"/> + </message> + <message> + <source>No group uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null DeleteObject uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing DeletedObject uuid or time</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null entry uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element in history entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>No entry uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element with different uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decrypt entry string</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate custom attribute found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry string key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate attachment found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry binary key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-type association window or sequence missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid bool value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid date time value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color rgb part</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid uuid value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decompress binary</source> + <extracomment>Translator meant is a binary data inside an entry</extracomment> <translation type="unfinished"/> </message> </context> @@ -1247,7 +2241,7 @@ Voleu obrir-la igualment?</translation> <name>KeePass1OpenWidget</name> <message> <source>Import KeePass1 database</source> - <translation type="unfinished"/> + <translation>Importar base de dades KeePass1</translation> </message> <message> <source>Unable to open the database.</source> @@ -1258,18 +2252,47 @@ Voleu obrir-la igualment?</translation> <name>KeePass1Reader</name> <message> <source>Unable to read keyfile.</source> - <translation type="unfinished"/> + <translation>No es pot llegir el fitxer de claus.</translation> </message> <message> <source>Not a KeePass database.</source> - <translation type="unfinished"/> + <translation>No és una base de dades KeePass.</translation> </message> <message> <source>Unsupported encryption algorithm.</source> - <translation type="unfinished"/> + <translation>Algoritme d'encriptació no admès.</translation> </message> <message> <source>Unsupported KeePass database version.</source> + <translation>Versió de base de dades KeePass no admesa.</translation> + </message> + <message> + <source>Unable to read encryption IV</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of groups</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid content hash size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of transform rounds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to construct group tree</source> <translation type="unfinished"/> </message> <message> @@ -1282,106 +2305,357 @@ Voleu obrir-la igualment?</translation> </message> <message> <source>Wrong key or database file is corrupt.</source> - <translation type="unfinished"/> + <translation>Clau incorrecta o fitxer de base de dades corrupte.</translation> </message> -</context> -<context> - <name>KeePass2Reader</name> <message> - <source>Not a KeePass database.</source> + <source>Key transformation failed</source> <translation type="unfinished"/> </message> <message> - <source>Unsupported KeePass database version.</source> + <source>Invalid group field type number</source> <translation type="unfinished"/> </message> <message> - <source>Wrong key or database file is corrupt.</source> + <source>Invalid group field size</source> <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>No es pot calcular la clau mestra</translation> - </message> - <message> - <source>Unable to issue challenge-response.</source> + <source>Read group field data doesn't match size</source> <translation type="unfinished"/> </message> <message> - <source>The selected file is an old KeePass 1 database (.kdb). - -You can import it by clicking on Database > 'Import KeePass 1 database...'. -This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> - <translation type="unfinished"/> - </message> -</context> -<context> - <name>KeePass2Writer</name> - <message> - <source>Unable to issue challenge-response.</source> + <source>Incorrect group id field size</source> <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>No es pot calcular la clau mestra</translation> + <source>Incorrect group creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group access time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group level field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing group id or level</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing entry field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read entry field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry uuid field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field type</source> + <translation type="unfinished"/> </message> </context> <context> <name>Main</name> <message> - <source>Fatal error while testing the cryptographic functions.</source> - <translation type="unfinished"/> - </message> - <message> - <source>KeePassXC - Error</source> - <translation type="unfinished"/> + <source>Existing single-instance lock file is invalid. Launching new instance.</source> + <translation>El fitxer de bloqueig d'instància única no és vàlid. Execute una instància nova.</translation> </message> <message> <source>The lock file could not be created. Single-instance mode disabled.</source> - <translation type="unfinished"/> + <translation>No s'ha pogut crear l'arxiu de bloqueig. Inhabilitat el mode de instància única.</translation> </message> <message> <source>Another instance of KeePassXC is already running.</source> - <translation type="unfinished"/> + <translation>Ja s'està executant una altra instància de KeePassXC.</translation> </message> <message> - <source>Existing single-instance lock file is invalid. Launching new instance.</source> - <translation type="unfinished"/> + <source>Fatal error while testing the cryptographic functions.</source> + <translation>Error mentre es provava les funcions criptogràfiques.</translation> + </message> + <message> + <source>KeePassXC - Error</source> + <translation>KeePassXC - Error</translation> </message> </context> <context> <name>MainWindow</name> <message> - <source>Open database</source> - <translation>Obre la base de dades</translation> + <source>&Database</source> + <translation>&Base de dades</translation> + </message> + <message> + <source>&Recent databases</source> + <translation>Bases de dades &recents</translation> + </message> + <message> + <source>Import</source> + <translation>Importa</translation> + </message> + <message> + <source>&Help</source> + <translation>&Ajuda</translation> + </message> + <message> + <source>E&ntries</source> + <translation>E&ntrades</translation> + </message> + <message> + <source>Copy att&ribute to clipboard</source> + <translation>Copia l'at&ribut a porta-retalls</translation> + </message> + <message> + <source>Time-based one-time password</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Groups</source> + <translation>&Grups</translation> + </message> + <message> + <source>&Tools</source> + <translation>&Eines</translation> + </message> + <message> + <source>&Quit</source> + <translation>Tanca</translation> + </message> + <message> + <source>&About</source> + <translation>&Sobre</translation> + </message> + <message> + <source>&Open database...</source> + <translation>&Obre una base de dades...</translation> + </message> + <message> + <source>&Save database</source> + <translation>&Desa la base de dades</translation> + </message> + <message> + <source>&Close database</source> + <translation>Tanca base de dades</translation> + </message> + <message> + <source>&New database</source> + <translation>&Nova base de dades</translation> + </message> + <message> + <source>Merge from KeePassX database</source> + <translation>Combina base de dades KeePassX</translation> + </message> + <message> + <source>&Add new entry</source> + <translation>&Afegir entrada nova</translation> + </message> + <message> + <source>&View/Edit entry</source> + <translation>&Mostra/Edita l'entrada</translation> + </message> + <message> + <source>&Delete entry</source> + <translation>&Esborra l'entrada</translation> + </message> + <message> + <source>&Add new group</source> + <translation>&Afegeix un nou grup</translation> + </message> + <message> + <source>&Edit group</source> + <translation>&Edita el grup</translation> + </message> + <message> + <source>&Delete group</source> + <translation>&Suprimeix el grup</translation> + </message> + <message> + <source>Sa&ve database as...</source> + <translation>&Desa la base de dades com a...</translation> + </message> + <message> + <source>Change &master key...</source> + <translation>Canvia la clau &mestra...</translation> + </message> + <message> + <source>&Database settings</source> + <translation>&Configuració de la base de dades</translation> </message> <message> <source>Database settings</source> - <translation type="unfinished"/> + <translation>Configuració de la base de dades</translation> + </message> + <message> + <source>&Clone entry</source> + <translation>&Clona l'entrada</translation> + </message> + <message> + <source>&Find</source> + <translation>&Cercar</translation> + </message> + <message> + <source>Copy &username</source> + <translation>Còpia el nom d'&usuari</translation> </message> <message> <source>Copy username to clipboard</source> - <translation type="unfinished"/> + <translation>Còpia el nom d'usuari al porta-retalls</translation> + </message> + <message> + <source>Cop&y password</source> + <translation>Còpia la contrasen&ya</translation> </message> <message> <source>Copy password to clipboard</source> + <translation>Còpia la contrasenya al porta-retalls</translation> + </message> + <message> + <source>&Settings</source> + <translation>&Conficuració</translation> + </message> + <message> + <source>Password Generator</source> + <translation>Generador de contrasenyes</translation> + </message> + <message> + <source>&Perform Auto-Type</source> + <translation>Realitza complació automètica</translation> + </message> + <message> + <source>&Open URL</source> + <translation>&Obre URL</translation> + </message> + <message> + <source>&Lock databases</source> + <translation>&bloqueja la bases de dades</translation> + </message> + <message> + <source>&Title</source> + <translation>&Títol</translation> + </message> + <message> + <source>Copy title to clipboard</source> <translation type="unfinished"/> </message> <message> - <source>Settings</source> + <source>&URL</source> + <translation>&URL</translation> + </message> + <message> + <source>Copy URL to clipboard</source> <translation type="unfinished"/> </message> <message> - <source>Show toolbar</source> + <source>&Notes</source> + <translation>&Notes</translation> + </message> + <message> + <source>Copy notes to clipboard</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Export to CSV file...</source> + <translation>&Exporta a fitxer CSV.</translation> + </message> + <message> + <source>Import KeePass 1 database...</source> + <translation>Importa base de dades KeePass 1...</translation> + </message> + <message> + <source>Import CSV file...</source> + <translation>Importa fitxer CSV...</translation> + </message> + <message> + <source>Re&pair database...</source> + <translation>Re&para la base de dades...</translation> + </message> + <message> + <source>Show TOTP</source> + <translation>Mostra TOTP</translation> + </message> + <message> + <source>Set up TOTP...</source> + <translation>Configura TOTP...</translation> + </message> + <message> + <source>Copy &TOTP</source> + <translation>Còpia &TOTP</translation> + </message> + <message> + <source>E&mpty recycle bin</source> + <translation type="unfinished"/> + </message> + <message> + <source>Clear history</source> + <translation>Esborra l'historial</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation>Error d'accés al fitxer de configuració %1</translation> + </message> + <message> + <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> <translation type="unfinished"/> </message> <message> <source>read-only</source> - <translation type="unfinished"/> + <translation>Només de lectura</translation> + </message> + <message> + <source>Settings</source> + <translation>Configuració</translation> </message> <message> <source>Toggle window</source> - <translation type="unfinished"/> + <translation>Activar finestra</translation> + </message> + <message> + <source>Quit KeePassXC</source> + <translation>Tanca KeePassXC</translation> </message> <message> <source>KeePass 2 Database</source> @@ -1391,212 +2665,115 @@ This is a one-way migration. You won't be able to open the imported databas <source>All files</source> <translation>Tots els fitxers</translation> </message> + <message> + <source>Open database</source> + <translation>Obre la base de dades</translation> + </message> <message> <source>Save repaired database</source> - <translation type="unfinished"/> + <translation>Desa base de dades reparada</translation> </message> <message> <source>Writing the database failed.</source> <translation>Ha fallat l'escriptura en la base de dades.</translation> </message> - <message> - <source>&Recent databases</source> - <translation type="unfinished"/> - </message> - <message> - <source>E&ntries</source> - <translation type="unfinished"/> - </message> - <message> - <source>Copy att&ribute to clipboard</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Groups</source> - <translation type="unfinished"/> - </message> - <message> - <source>&View</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Quit</source> - <translation type="unfinished"/> - </message> - <message> - <source>&About</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Save database</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Close database</source> - <translation type="unfinished"/> - </message> - <message> - <source>&New database</source> - <translation type="unfinished"/> - </message> - <message> - <source>Merge from KeePassX database</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Add new entry</source> - <translation type="unfinished"/> - </message> - <message> - <source>&View/Edit entry</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Delete entry</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Add new group</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Edit group</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Delete group</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Database settings</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Clone entry</source> - <translation type="unfinished"/> - </message> - <message> - <source>Timed one-time password</source> - <translation type="unfinished"/> - </message> - <message> - <source>Copy &TOTP</source> - <translation type="unfinished"/> - </message> - <message> - <source>Show TOTP</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Find</source> - <translation type="unfinished"/> - </message> - <message> - <source>Copy &username</source> - <translation type="unfinished"/> - </message> - <message> - <source>Cop&y password</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Settings</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Perform Auto-Type</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Open URL</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Lock databases</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Title</source> - <translation type="unfinished"/> - </message> - <message> - <source>&URL</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Notes</source> - <translation type="unfinished"/> - </message> - <message> - <source>Password Generator</source> - <translation type="unfinished"/> - </message> - <message> - <source>Clear history</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Database</source> - <translation type="unfinished"/> - </message> - <message> - <source>Import</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Tools</source> - <translation type="unfinished"/> - </message> - <message> - <source>Empty recycle bin</source> - <translation type="unfinished"/> - </message> - <message> - <source>Access error for config file %1</source> - <translation type="unfinished"/> - </message> - <message> - <source>Quit KeePassXC</source> - <translation type="unfinished"/> - </message> <message> <source>Please touch the button on your YubiKey!</source> + <translation>Per favor, toqueu el botó en el seu YubiKey!</translation> + </message> +</context> +<context> + <name>OpenSSHKey</name> + <message> + <source>Invalid key file, expecting an OpenSSH key</source> <translation type="unfinished"/> </message> <message> - <source>&Help</source> + <source>PEM boundary mismatch</source> <translation type="unfinished"/> </message> <message> - <source>&Open database...</source> + <source>This is not an OpenSSH key, only modern keys are supported</source> <translation type="unfinished"/> </message> <message> - <source>Sa&ve database as...</source> + <source>Base64 decoding failed</source> <translation type="unfinished"/> </message> <message> - <source>Change &master key...</source> + <source>Key file way too small.</source> <translation type="unfinished"/> </message> <message> - <source>&Export to CSV file...</source> + <source>Key file magic header id invalid</source> <translation type="unfinished"/> </message> <message> - <source>Import KeePass 1 database...</source> + <source>Found zero keys</source> <translation type="unfinished"/> </message> <message> - <source>Import CSV file...</source> + <source>Failed to read public key.</source> <translation type="unfinished"/> </message> <message> - <source>Re&pair database...</source> + <source>Corrupted key file, reading private key failed</source> <translation type="unfinished"/> </message> <message> - <source>Set up TOTP...</source> + <source>No private key payload to decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Trying to run KDF without cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Passphrase is required to decrypt this key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key derivation failed, key file corrupted?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Decryption failed, wrong passphrase?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write public key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write private key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing private key</source> <translation type="unfinished"/> </message> </context> @@ -1604,23 +2781,64 @@ This is a one-way migration. You won't be able to open the imported databas <name>OptionDialog</name> <message> <source>Dialog</source> - <translation type="unfinished"/> + <translation>Diàleg</translation> + </message> + <message> + <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation>Requerit per a accedir a les seves bases de dades des de ChromeIPass o PassIFox</translation> + </message> + <message> + <source>Enable KeePassHTTP server</source> + <translation>Habilita el servidor KeePassHTTP</translation> </message> <message> <source>General</source> - <translation type="unfinished"/> + <translation>General</translation> </message> <message> <source>Sh&ow a notification when credentials are requested</source> - <translation type="unfinished"/> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>M&ostra una notificació quan es demanen credencials</translation> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>Només retorna les millors coincidències per a una adreça URL específica en lloc de totes les entrades per al domini.</translation> + </message> + <message> + <source>&Return only best matching entries</source> + <translation>Retorna només les millors coincidències de les entrades</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Sol·licitar el desbloqueig de la base de dades si està blocada</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> + <translation>Només s'han retornat les entrades amb el mateix patró (http://, https://, ftp: / /,...).</translation> + </message> + <message> + <source>&Match URL schemes</source> + <translation>Torna les coincidències amb patrons URL</translation> </message> <message> <source>Sort matching entries by &username</source> - <translation type="unfinished"/> + <translation>Ordena les entrades coincidents per nom d'&usuari</translation> + </message> + <message> + <source>Sort &matching entries by title</source> + <translation>Ordena les entrades coincidents per títol</translation> + </message> + <message> + <source>R&emove all shared encryption keys from active database</source> + <translation>Suprimeix totes les claus d'encriptació compartides de la base de dades activa</translation> </message> <message> <source>Re&move all stored permissions from entries in active database</source> - <translation type="unfinished"/> + <translation>Esbo&rra tots els permisos emmagatzemats de les entrades a la base de dades activa</translation> + </message> + <message> + <source>Password Generator</source> + <translation>Generador de contrasenyes</translation> </message> <message> <source>Advanced</source> @@ -1628,101 +2846,82 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Always allow &access to entries</source> - <translation type="unfinished"/> + <translation>Permet l'&accés a les entrades sempre</translation> </message> <message> <source>Always allow &updating entries</source> - <translation type="unfinished"/> + <translation>Permet l'act&ualització de les entrades, sempre</translation> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>Només s'ha de connectar amb un client, la base de dades seleccionada.</translation> </message> <message> <source>Searc&h in all opened databases for matching entries</source> - <translation type="unfinished"/> + <translation>&Cerca en totes les bases de dades obertes, entrades coincidents</translation> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>L'actualització o creació de camps de test no està suportada.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>Retorna camps avançats de text que comencen amb "KPH: "</translation> </message> <message> <source>HTTP Port:</source> - <translation type="unfinished"/> + <translation>HTTP Port:</translation> </message> <message> <source>Default port: 19455</source> - <translation type="unfinished"/> - </message> - <message> - <source>Re&quest to unlock the database if it is locked</source> - <translation type="unfinished"/> - </message> - <message> - <source>Sort &matching entries by title</source> - <translation type="unfinished"/> + <translation>Port per defecte: 19455</translation> </message> <message> <source>KeePassXC will listen to this port on 127.0.0.1</source> + <translation>KeePassXC escolta a aquest port en 127.0.0.1</translation> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> <translation type="unfinished"/> </message> <message> <source>Cannot bind to privileged ports</source> - <translation type="unfinished"/> + <translation>No podeu utilitzar ports privilegiats</translation> </message> <message> <source>Cannot bind to privileged ports below 1024! Using default port 19455.</source> - <translation type="unfinished"/> - </message> - <message> - <source>R&emove all shared encryption keys from active database</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Return advanced string fields which start with "KPH: "</source> - <translation type="unfinished"/> - </message> - <message> - <source>Automatically creating or updating string fields is not supported.</source> - <translation type="unfinished"/> - </message> - <message> - <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> - <translation type="unfinished"/> - </message> - <message> - <source>Enable KeePassHTTP server</source> - <translation type="unfinished"/> - </message> - <message> - <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Return only best matching entries</source> - <translation type="unfinished"/> - </message> - <message> - <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Match URL schemes</source> - <translation type="unfinished"/> - </message> - <message> - <source>Password Generator</source> - <translation type="unfinished"/> - </message> - <message> - <source>Only the selected database has to be connected with a client.</source> - <translation type="unfinished"/> - </message> - <message> - <source>The following options can be dangerous! -Change them only if you know what you are doing.</source> - <translation type="unfinished"/> + <translation>No es poden utilitzar ports privilegiats inferiors a 1024! +Utilitza per defecte port 19455.</translation> </message> </context> <context> <name>PasswordGeneratorWidget</name> + <message> + <source>%p%</source> + <translation>%p %</translation> + </message> <message> <source>Password:</source> <translation>Contrasenya:</translation> </message> + <message> + <source>strength</source> + <comment>Password strength</comment> + <translation>força</translation> + </message> + <message> + <source>entropy</source> + <translation>entropia</translation> + </message> + <message> + <source>Password</source> + <translation>Contrasenya</translation> + </message> <message> <source>Character Types</source> <translation>Tipus de caràcter</translation> @@ -1741,126 +2940,378 @@ Change them only if you know what you are doing.</source> </message> <message> <source>Special Characters</source> - <translation type="unfinished"/> - </message> - <message> - <source>Exclude look-alike characters</source> - <translation type="unfinished"/> - </message> - <message> - <source>Accept</source> - <translation type="unfinished"/> - </message> - <message> - <source>%p%</source> - <translation type="unfinished"/> - </message> - <message> - <source>strength</source> - <translation type="unfinished"/> - </message> - <message> - <source>entropy</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Length:</source> - <translation type="unfinished"/> - </message> - <message> - <source>Pick characters from every group</source> - <translation type="unfinished"/> - </message> - <message> - <source>Generate</source> - <translation type="unfinished"/> - </message> - <message> - <source>Close</source> - <translation type="unfinished"/> - </message> - <message> - <source>Apply</source> - <translation type="unfinished"/> - </message> - <message> - <source>Entropy: %1 bit</source> - <translation type="unfinished"/> - </message> - <message> - <source>Password Quality: %1</source> - <translation type="unfinished"/> - </message> - <message> - <source>Poor</source> - <translation type="unfinished"/> - </message> - <message> - <source>Weak</source> - <translation type="unfinished"/> - </message> - <message> - <source>Good</source> - <translation type="unfinished"/> - </message> - <message> - <source>Excellent</source> - <translation type="unfinished"/> - </message> - <message> - <source>Password</source> - <translation>Contrasenya</translation> + <translation>Caràcters especials</translation> </message> <message> <source>Extended ASCII</source> - <translation type="unfinished"/> + <translation>ASCII estès</translation> + </message> + <message> + <source>Exclude look-alike characters</source> + <translation>Excloure caràcters d'aspecte semblant</translation> + </message> + <message> + <source>Pick characters from every group</source> + <translation>Tria caràcters de tots els grups</translation> + </message> + <message> + <source>&Length:</source> + <translation>&Longitud:</translation> </message> <message> <source>Passphrase</source> - <translation type="unfinished"/> + <translation>Contrasenya</translation> </message> <message> <source>Wordlist:</source> - <translation type="unfinished"/> + <translation>Llista de paraules:</translation> </message> <message> <source>Word Count:</source> - <translation type="unfinished"/> + <translation>Nombre de paraules:</translation> </message> <message> <source>Word Separator:</source> - <translation type="unfinished"/> + <translation>Separador de paraula:</translation> + </message> + <message> + <source>Generate</source> + <translation>Genera</translation> </message> <message> <source>Copy</source> - <translation type="unfinished"/> + <translation>Còpia</translation> + </message> + <message> + <source>Accept</source> + <translation>Accepta</translation> + </message> + <message> + <source>Close</source> + <translation>Tanca</translation> + </message> + <message> + <source>Apply</source> + <translation>Aplica</translation> + </message> + <message> + <source>Entropy: %1 bit</source> + <translation>Entropia: %1 bit(s)</translation> + </message> + <message> + <source>Password Quality: %1</source> + <translation>Qualitat de la contrasenya: %1</translation> + </message> + <message> + <source>Poor</source> + <comment>Password quality</comment> + <translation>Pobre</translation> + </message> + <message> + <source>Weak</source> + <comment>Password quality</comment> + <translation>Feble</translation> + </message> + <message> + <source>Good</source> + <comment>Password quality</comment> + <translation>Bona</translation> + </message> + <message> + <source>Excellent</source> + <comment>Password quality</comment> + <translation>Excel·lent</translation> </message> </context> <context> <name>QObject</name> <message> - <source>NULL device</source> + <source>Database not opened</source> <translation type="unfinished"/> </message> <message> - <source>error reading from device</source> + <source>Database hash not available</source> <translation type="unfinished"/> </message> <message> - <source>file empty ! + <source>Client public key not received</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot decrypt message</source> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout or cannot connect to KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>Action cancelled or denied</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC association failed, try again</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key change was not successful</source> + <translation type="unfinished"/> + </message> + <message> + <source>Encryption key is not recognized</source> + <translation type="unfinished"/> + </message> + <message> + <source>No saved databases found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect action</source> + <translation type="unfinished"/> + </message> + <message> + <source>Empty message received</source> + <translation type="unfinished"/> + </message> + <message> + <source>No URL provided</source> + <translation type="unfinished"/> + </message> + <message> + <source>No logins found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown error</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add a new entry to a database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>Camí de la base de dades.</translation> + </message> + <message> + <source>Key file of the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>path</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>username</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Prompt for the entry's password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a password for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length for the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to add.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy an entry's password to the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to clip.</source> + <comment>clip = copy to clipboard</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout in seconds before clearing the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Edit an entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Title for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>title</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to edit.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Estimate the entropy of a password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password for which to estimate the entropy.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Perform advanced analysis on the password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Extract and print the content of a database.</source> + <translation>Extrau imprimeix el contingut d'una base de dades.</translation> + </message> + <message> + <source>Path of the database to extract.</source> + <translation>Camí de la base de dades a extreure.</translation> + </message> + <message> + <source>Insert password to unlock %1: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to load key file %1 : %2</source> + <translation type="unfinished"/> + </message> + <message> + <source>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source> + +Available commands: </source> <translation type="unfinished"/> </message> <message> - <source>malformed string</source> + <source>Name of the command to execute.</source> + <translation>Nom de l'ordre a executar.</translation> + </message> + <message> + <source>List database entries.</source> + <translation>Llista les entrades de la base de dades.</translation> + </message> + <message> + <source>Path of the group to list. Default is /</source> + <translation>Camí del grup a llistar. Per defecte és /</translation> + </message> + <message> + <source>Find entries quickly.</source> <translation type="unfinished"/> </message> + <message> + <source>Search term.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Merge two databases.</source> + <translation>Fusiona dues bases de dades</translation> + </message> + <message> + <source>Path of the database to merge into.</source> + <translation>Camí de la base de dades origen a fusionar.</translation> + </message> + <message> + <source>Path of the database to merge from.</source> + <translation>Camí de la base de dades de destí a fusionar.</translation> + </message> + <message> + <source>Use the same credentials for both database files.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file of the database to merge from.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show an entry's information.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> + <translation type="unfinished"/> + </message> + <message> + <source>attribute</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the entry to show.</source> + <translation>Nom de l'entrada a mostrar.</translation> + </message> + <message> + <source>NULL device</source> + <translation>Dispositiu nul</translation> + </message> + <message> + <source>error reading from device</source> + <translation>error de lectura del dispositiu</translation> + </message> + <message> + <source>file empty ! +</source> + <translation>fitxer buit! +</translation> + </message> + <message> + <source>malformed string</source> + <translation>cadena mal formada</translation> + </message> <message> <source>missing closing quote</source> + <translation>falta la cometa de tancament</translation> + </message> + <message> + <source>AES: 256-bit</source> <translation type="unfinished"/> </message> <message> - <source>INTERNAL - unget lower bound exceeded</source> + <source>Twofish: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>ChaCha20: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Argon2 (KDBX 4 – recommended)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 4)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 3.1)</source> <translation type="unfinished"/> </message> <message> @@ -1879,28 +3330,40 @@ Change them only if you know what you are doing.</source> <source>Password</source> <translation>Contrasenya</translation> </message> - <message> - <source>URL</source> - <translation>URL</translation> - </message> <message> <source>Notes</source> <translation>Notes</translation> </message> <message> - <source>Browser Integration</source> + <source>Last Modified</source> <translation type="unfinished"/> </message> + <message> + <source>Created</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy Browser Integration</source> + <translation type="unfinished"/> + </message> + <message> + <source>Browser Integration</source> + <translation>Integració amb el navegador</translation> + </message> <message> <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source> - <translation type="unfinished"/> + <translation>Resposta de YubiKey [%1] - Slot %2 - %3</translation> </message> <message> <source>Press</source> - <translation type="unfinished"/> + <translation>Prem</translation> </message> <message> <source>Passive</source> + <translation>Passiu</translation> + </message> + <message> + <source>SSH Agent</source> <translation type="unfinished"/> </message> </context> @@ -1908,41 +3371,41 @@ Change them only if you know what you are doing.</source> <name>QtIOCompressor</name> <message> <source>Internal zlib error when compressing: </source> - <translation type="unfinished"/> + <translation>Error intern de zlib mentre s'estava comprimint.</translation> </message> <message> <source>Error writing to underlying device: </source> - <translation type="unfinished"/> + <translation>Error d'escriptura al dispositiu subjacent: </translation> </message> <message> <source>Error opening underlying device: </source> - <translation type="unfinished"/> + <translation>Error a l'obrir el dispositiu subjacent: </translation> </message> <message> <source>Error reading data from underlying device: </source> - <translation type="unfinished"/> + <translation>Error de lectura al dispositiu subjacent: </translation> </message> <message> <source>Internal zlib error when decompressing: </source> - <translation type="unfinished"/> + <translation>Error intern de zlib al descomprimir: </translation> </message> </context> <context> <name>QtIOCompressor::open</name> <message> <source>The gzip format not supported in this version of zlib.</source> - <translation type="unfinished"/> + <translation>gzip no és un format compatible amb aquesta versió de zlib.</translation> </message> <message> <source>Internal zlib error: </source> - <translation type="unfinished"/> + <translation>Error intern de zlib:</translation> </message> </context> <context> <name>SearchWidget</name> <message> - <source>Case Sensitive</source> - <translation type="unfinished"/> + <source>Search...</source> + <translation>Cerca...</translation> </message> <message> <source>Search</source> @@ -1950,445 +3413,432 @@ Change them only if you know what you are doing.</source> </message> <message> <source>Clear</source> - <translation type="unfinished"/> + <translation>Neteja</translation> </message> <message> - <source>Search...</source> - <translation type="unfinished"/> + <source>Case Sensitive</source> + <translation>Distingeix entre majúscules i minúscules</translation> </message> <message> <source>Limit search to selected group</source> - <translation type="unfinished"/> + <translation>Limitar la cerca al grup seleccionat</translation> </message> </context> <context> <name>Service</name> - <message> - <source>A shared encryption-key with the name "%1" already exists. -Do you want to overwrite it?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Do you want to update the information in %1 - %2?</source> - <translation type="unfinished"/> - </message> - <message> - <source>The active database is locked! -Please unlock the selected database or choose another one which is unlocked.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Successfully removed %1 encryption-%2 from KeePassX/Http Settings.</source> - <translation type="unfinished"/> - </message> - <message> - <source>No shared encryption-keys found in KeePassHttp Settings.</source> - <translation type="unfinished"/> - </message> - <message> - <source>The active database does not contain an entry of KeePassHttp Settings.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Removing stored permissions...</source> - <translation type="unfinished"/> - </message> - <message> - <source>Abort</source> - <translation type="unfinished"/> - </message> - <message> - <source>Successfully removed permissions from %1 %2.</source> - <translation type="unfinished"/> - </message> - <message> - <source>The active database does not contain an entry with permissions.</source> - <translation type="unfinished"/> - </message> <message> <source>KeePassXC: New key association request</source> - <translation type="unfinished"/> + <translation>KeePassXC: Nova petició de associació de clau</translation> </message> <message> <source>You have received an association request for the above key. If you would like to allow it access to your KeePassXC database give it a unique name to identify and accept it.</source> - <translation type="unfinished"/> + <translation>S'ha rebut una sol·licitud d'associació per a la citada clau. +Voleu permetre l'accés a la base de dades KeePassXC? + Doneu-li un nom únic per a poder identificar-la i seleccione acceptar.</translation> </message> <message> <source>KeePassXC: Overwrite existing key?</source> - <translation type="unfinished"/> + <translation>KeePassXC: Voleu sobreescriure la clau existent?</translation> + </message> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>Ja existeix una clau de xifrat compartida amb el nom "%1". +Voleu sobreescriure-la?</translation> </message> <message> <source>KeePassXC: Update Entry</source> - <translation type="unfinished"/> + <translation>KeePassXC: Actualitza l'entrada</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Voleu actualitzar la informació en %1 - %2?</translation> </message> <message> <source>KeePassXC: Database locked!</source> - <translation type="unfinished"/> + <translation>KeePassXC: Base de dades bloquejada!</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>La base de dades activa està bloquejada! +Per favor, desbloqueu la base de dades seleccionada o escolliu-ne una altra.</translation> </message> <message> <source>KeePassXC: Removed keys from database</source> - <translation type="unfinished"/> + <translation>KeePassXC: Claus de la base de dades eliminades</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> <message> <source>KeePassXC: No keys found</source> - <translation type="unfinished"/> + <translation>KeePassXC: No s'han trobat claus</translation> + </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation>No s'han trobat claus d'encriptació compartides en la configuració de KeePassHttp.</translation> </message> <message> <source>KeePassXC: Settings not available!</source> - <translation type="unfinished"/> + <translation>KeePassXC: La configuració no està disponible!</translation> + </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation>La base de dades activa no conté cap entrada de configuració de KeePassHttp.</translation> + </message> + <message> + <source>Removing stored permissions...</source> + <translation>Eliminant permisos emmagatzemats...</translation> + </message> + <message> + <source>Abort</source> + <translation>Avorta</translation> </message> <message> <source>KeePassXC: Removed permissions</source> - <translation type="unfinished"/> + <translation>KeePassXC: Permisos eliminats</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entries.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> - <translation type="unfinished"/> + <translation>KeePassXC: No s'ha trobat cap entrada amb permisos!</translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>La base de dades activa no conté cap entrada amb permisos.</translation> </message> </context> <context> <name>SettingsWidget</name> <message> <source>Application Settings</source> - <translation type="unfinished"/> + <translation>Configuració de l'aplicació</translation> </message> <message> <source>General</source> - <translation type="unfinished"/> + <translation>General</translation> </message> <message> <source>Security</source> - <translation type="unfinished"/> + <translation>Seguretat</translation> </message> <message> <source>Access error for config file %1</source> - <translation type="unfinished"/> + <translation>Error d'accés al fitxer de configuració %1</translation> </message> </context> <context> <name>SettingsWidgetGeneral</name> + <message> + <source>Basic Settings</source> + <translation>Configuració bàsica</translation> + </message> + <message> + <source>Start only a single instance of KeePassXC</source> + <translation>Obriu només una sola instància del KeePassXC</translation> + </message> <message> <source>Remember last databases</source> - <translation type="unfinished"/> + <translation>Recordeu les últimes bases de dades</translation> + </message> + <message> + <source>Remember last key files and security dongles</source> + <translation>Recordeu els últims arxius clau i motxilles de seguretat</translation> + </message> + <message> + <source>Load previous databases on startup</source> + <translation>Carregueu les bases de dades anteriors a l'obrir el KeepassXC</translation> </message> <message> <source>Automatically save on exit</source> - <translation type="unfinished"/> + <translation>Deseu en tancar de forma automàtica</translation> </message> <message> <source>Automatically save after every change</source> - <translation type="unfinished"/> + <translation>Deseu després de cada canvi de forma automàtica</translation> + </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation>Torneu a carregar automàticament la base de dades quan siga modificada de forma externa</translation> </message> <message> <source>Minimize when copying to clipboard</source> - <translation type="unfinished"/> + <translation>Minimitzeu en copiar al porta-retalls</translation> + </message> + <message> + <source>Minimize window at application startup</source> + <translation>Minimitzeu la finestra a l'obrir l'aplicació</translation> </message> <message> <source>Use group icon on entry creation</source> - <translation type="unfinished"/> + <translation>Utilitzeu la icona del grup al crear una entrada</translation> </message> <message> - <source>Global Auto-Type shortcut</source> - <translation type="unfinished"/> + <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> + <translation>No marqueu la base de dades com a modificada si no han hagut canvis en les dades (per exemple, a l'expandir grups)</translation> </message> <message> - <source>Language</source> + <source>Hide the Details view</source> <translation type="unfinished"/> </message> <message> <source>Show a system tray icon</source> - <translation type="unfinished"/> + <translation>Mostreu una icona a la safata del sistema</translation> </message> <message> <source>Hide window to system tray when minimized</source> - <translation type="unfinished"/> - </message> - <message> - <source>Load previous databases on startup</source> - <translation type="unfinished"/> - </message> - <message> - <source>Automatically reload the database when modified externally</source> - <translation type="unfinished"/> + <translation>Amagueu la finestra a la safata del sistema quan es minimitze</translation> </message> <message> <source>Hide window to system tray instead of app exit</source> + <translation>Amagueu la finestra a la safata del sistema en lloc de tancar KeepassXC</translation> + </message> + <message> + <source>Dark system tray icon</source> <translation type="unfinished"/> </message> <message> - <source>Minimize window at application startup</source> - <translation type="unfinished"/> - </message> - <message> - <source>Basic Settings</source> - <translation type="unfinished"/> - </message> - <message> - <source>Remember last key files and security dongles</source> - <translation type="unfinished"/> - </message> - <message> - <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> - <translation type="unfinished"/> + <source>Language</source> + <translation>Idioma</translation> </message> <message> <source>Auto-Type</source> + <translation>Compleció automàtica</translation> + </message> + <message> + <source>Use entry title to match windows for global Auto-Type</source> <translation type="unfinished"/> </message> <message> - <source>Use entry title and URL to match windows for global Auto-Type</source> + <source>Use entry URL to match windows for global Auto-Type</source> <translation type="unfinished"/> </message> <message> <source>Always ask before performing Auto-Type</source> - <translation type="unfinished"/> + <translation>Pregunteu sempre abans d'efectuar la compleció automàtica</translation> + </message> + <message> + <source>Global Auto-Type shortcut</source> + <translation>Drecera global de compleció automàtica</translation> </message> <message> <source>Auto-Type delay</source> - <translation type="unfinished"/> + <translation>Retard de la compleció automàtica</translation> </message> <message> <source> ms</source> - <translation type="unfinished"/> - </message> - <message> - <source>Start only a single instance of KeePassXC</source> - <translation type="unfinished"/> + <comment>Milliseconds</comment> + <translation> ms</translation> </message> </context> <context> <name>SettingsWidgetSecurity</name> + <message> + <source>Timeouts</source> + <translation>Temps excedits</translation> + </message> <message> <source>Clear clipboard after</source> - <translation type="unfinished"/> + <translation>Neteja el porta-retalls després</translation> </message> <message> <source> sec</source> - <translation type="unfinished"/> + <comment>Seconds</comment> + <translation> sec</translation> </message> <message> <source>Lock databases after inactivity of</source> - <translation type="unfinished"/> - </message> - <message> - <source>Show passwords in cleartext by default</source> - <translation type="unfinished"/> - </message> - <message> - <source>Lock databases after minimizing the window</source> - <translation type="unfinished"/> - </message> - <message> - <source>Don't require password repeat when it is visible</source> - <translation type="unfinished"/> - </message> - <message> - <source>Timeouts</source> - <translation type="unfinished"/> + <translation>Bloquegeu les bases de dades després d'estar inactives per</translation> </message> <message> <source>Convenience</source> - <translation type="unfinished"/> + <translation>Conveniència</translation> </message> <message> <source>Lock databases when session is locked or lid is closed</source> + <translation>Bloquegeu les bases de dades quan sessió siga bloquejada o es tanque la tapa</translation> + </message> + <message> + <source>Lock databases after minimizing the window</source> + <translation>Bloquegeu les bases de dades després minimitzar la finestra</translation> + </message> + <message> + <source>Don't require password repeat when it is visible</source> + <translation>No requerir la repetició de la contrasenya quan aquesta és visible</translation> + </message> + <message> + <source>Show passwords in cleartext by default</source> + <translation>Mostreu per defecte les contrasenyes en text sense xifrar</translation> + </message> + <message> + <source>Hide passwords in the preview panel</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide entry notes by default</source> <translation type="unfinished"/> </message> <message> <source>Privacy</source> - <translation type="unfinished"/> + <translation>Privacitat</translation> </message> <message> <source>Use Google as fallback for downloading website icons</source> - <translation type="unfinished"/> + <translation>Utilitzeu Google com a alternativa per a descarregar icones de llocs web</translation> </message> </context> <context> <name>SetupTotpDialog</name> <message> <source>Setup TOTP</source> - <translation type="unfinished"/> + <translation>Organització TOTP</translation> </message> <message> <source>Key:</source> + <translation>Clau:</translation> + </message> + <message> + <source>Default RFC 6238 token settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Steam token settings</source> <translation type="unfinished"/> </message> <message> <source>Use custom settings</source> - <translation type="unfinished"/> + <translation>Utilitza la configuració personalitzada</translation> </message> <message> <source>Note: Change these settings only if you know what you are doing.</source> - <translation type="unfinished"/> + <translation>Nota: Canvieu aquesta configuració només si sabeu què esteu fent.</translation> </message> <message> <source>Time step:</source> - <translation type="unfinished"/> + <translation>Intervals:</translation> </message> <message> <source>8 digits</source> - <translation type="unfinished"/> + <translation>8 dígits</translation> </message> <message> <source>6 digits</source> - <translation type="unfinished"/> + <translation>6 dígits</translation> </message> <message> <source>Code size:</source> - <translation type="unfinished"/> + <translation>Mida del codi:</translation> </message> <message> <source> sec</source> - <translation type="unfinished"/> + <comment>Seconds</comment> + <translation> sec</translation> </message> </context> <context> <name>TotpDialog</name> <message> <source>Timed Password</source> - <translation type="unfinished"/> + <translation>Contrasenya per temps</translation> </message> <message> <source>000000</source> - <translation type="unfinished"/> + <translation>000000</translation> </message> <message> <source>Copy</source> - <translation type="unfinished"/> + <translation>Còpia</translation> </message> <message> <source>Expires in</source> - <translation type="unfinished"/> + <translation>Caduca el</translation> </message> <message> <source>seconds</source> - <translation type="unfinished"/> + <translation>segons</translation> </message> </context> <context> <name>UnlockDatabaseWidget</name> <message> <source>Unlock database</source> - <translation type="unfinished"/> + <translation>Desbloqueja la base de dades</translation> </message> </context> <context> <name>WelcomeWidget</name> <message> <source>Welcome to KeePassXC</source> - <translation type="unfinished"/> + <translation>Benvingut a KeePassXC</translation> </message> <message> <source>Start storing your passwords securely in a KeePassXC database</source> - <translation type="unfinished"/> + <translation>Comenceu a emmagatzemar les vostres contrasenyes de manera segura en una base de dades KeePassXC</translation> </message> <message> <source>Create new database</source> - <translation type="unfinished"/> + <translation>Crea una nova base de dades</translation> </message> <message> <source>Open existing database</source> - <translation type="unfinished"/> + <translation>Obre una base de dades existent</translation> </message> <message> <source>Import from KeePass 1</source> - <translation type="unfinished"/> + <translation>Importa de KeePass 1</translation> </message> <message> <source>Import from CSV</source> - <translation type="unfinished"/> + <translation>Importa d'un fitxer CSV</translation> </message> <message> <source>Recent databases</source> - <translation type="unfinished"/> + <translation>Bases de dades obertes recentment</translation> </message> </context> <context> <name>main</name> <message> - <source>path to a custom config file</source> - <translation type="unfinished"/> - </message> - <message> - <source>key file of the database</source> - <translation type="unfinished"/> - </message> - <message> - <source>KeePassXC - cross-platform password manager</source> - <translation type="unfinished"/> - </message> - <message> - <source>read password of the database from stdin</source> - <translation type="unfinished"/> - </message> - <message> - <source>filenames of the password databases to open (*.kdbx)</source> - <translation type="unfinished"/> - </message> - <message> - <source>Copy a password to the clipboard</source> + <source>Remove an entry from the database.</source> <translation type="unfinished"/> </message> <message> <source>Path of the database.</source> + <translation>Camí de la base de dades.</translation> + </message> + <message> + <source>Path of the entry to remove.</source> <translation type="unfinished"/> </message> <message> - <source>Use a GUI prompt unlocking the database.</source> - <translation type="unfinished"/> + <source>KeePassXC - cross-platform password manager</source> + <translation>KeePassXC - gestor de contrasenyes multi-plataforma</translation> </message> <message> - <source>Name of the entry to clip.</source> - <translation type="unfinished"/> + <source>filenames of the password databases to open (*.kdbx)</source> + <translation>Noms de les bases de dades de contrasenya per a obrir (*.kdbx)</translation> </message> <message> - <source>Extract and print the content of a database.</source> - <translation type="unfinished"/> + <source>path to a custom config file</source> + <translation>camí cap a un fitxer personalitzat de configuració</translation> </message> <message> - <source>Path of the database to extract.</source> - <translation type="unfinished"/> + <source>key file of the database</source> + <translation>Arxiu clau de la base de dades</translation> </message> <message> - <source>Name of the command to execute.</source> - <translation type="unfinished"/> + <source>read password of the database from stdin</source> + <translation>llegiu la contrasenya de la base de dades des de l'entrada estàndard (stdin)</translation> </message> <message> - <source>List database entries.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Path of the group to list. Default is /</source> - <translation type="unfinished"/> - </message> - <message> - <source>Print the UUIDs of the entries and groups.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Merge two databases.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Path of the database to merge into.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Path of the database to merge from.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Use the same password for both database files.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Show a password.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Name of the entry to show.</source> + <source>Parent window handle</source> <translation type="unfinished"/> </message> </context> diff --git a/share/translations/keepassx_cs.ts b/share/translations/keepassx_cs.ts index 737c2b03e..50fb01983 100644 --- a/share/translations/keepassx_cs.ts +++ b/share/translations/keepassx_cs.ts @@ -9,14 +9,34 @@ <source>About</source> <translation>O aplikaci</translation> </message> + <message> + <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> + <translation>Chyby hlaste na: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> + </message> + <message> + <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>KeePassXC je šířeno pod GNU obecnou veřejnou licencí (GPL) verze 2 a (případně) 3.</translation> + </message> + <message> + <source>Project Maintainers:</source> + <translation>Správci projektu:</translation> + </message> <message> <source>Contributors</source> <translation>Na vývoji se podíleli</translation> </message> + <message> + <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Viz přispěvatelé na portálu GitHub</a></translation> + </message> <message> <source>Debug Info</source> <translation>Ladící informace</translation> </message> + <message> + <source>Include the following information whenever you report a bug:</source> + <translation>K hlášení chyby vždy připojte následující údaje:</translation> + </message> <message> <source>Copy to clipboard</source> <translation>Zkopírovat do schránky</translation> @@ -31,6 +51,10 @@ <source>Revision: %1</source> <translation>Revize: %1</translation> </message> + <message> + <source>Distribution: %1</source> + <translation>Distribuce: %1</translation> + </message> <message> <source>Libraries:</source> <translation>Knihovny:</translation> @@ -47,33 +71,13 @@ Jádro systému: %3 %4</translation> <source>Enabled extensions:</source> <translation>Zapnutá rozšíření:</translation> </message> - <message> - <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> - <translation>Chyby hlaste na: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> - </message> - <message> - <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassXC je šířeno pod GNU obecnou veřejnou licencí (GPL) verze 2 a (případně) 3.</translation> - </message> - <message> - <source>Project Maintainers:</source> - <translation>Správci projektu:</translation> - </message> - <message> - <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Viz přispěvatelé na portálu GitHub</a></translation> - </message> - <message> - <source>Include the following information whenever you report a bug:</source> - <translation>K hlášení chyby vždy připojte následující údaje:</translation> - </message> - <message> - <source>Distribution: %1</source> - <translation>Distribuce: %1</translation> - </message> </context> <context> <name>AccessControlDialog</name> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>Potvrzení přístupu KeePassXC HTTP</translation> + </message> <message> <source>Remember this decision</source> <translation>Zapamatovat si toto rozhodnutí</translation> @@ -92,9 +96,12 @@ Please select whether you want to allow access.</source> <translation>%1 si vyžádalo přístup k heslům u následujících položek. Umožnit přístup?</translation> </message> +</context> +<context> + <name>AgentSettingsWidget</name> <message> - <source>KeePassXC HTTP Confirm Access</source> - <translation>Potvrzení přístupu KeePassXC HTTP</translation> + <source>Enable SSH Agent (requires restart)</source> + <translation>Povolit SSH agenta (vyžaduje restart)</translation> </message> </context> <context> @@ -107,6 +114,26 @@ Umožnit přístup?</translation> <source>Auto-Type - KeePassXC</source> <translation>Automatické vyplňování – KeePassXC</translation> </message> + <message> + <source>Auto-Type</source> + <translation>Automatické vyplňování</translation> + </message> + <message> + <source>The Syntax of your Auto-Type statement is incorrect!</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> </context> <context> <name>AutoTypeAssociationsModel</name> @@ -125,13 +152,290 @@ Umožnit přístup?</translation> </context> <context> <name>AutoTypeSelectDialog</name> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>Automatické vyplňování – KeePassXC</translation> + </message> <message> <source>Select entry to Auto-Type:</source> <translation>Vyberte záznam, kterým se bude automaticky vyplňovat:</translation> </message> +</context> +<context> + <name>BrowserAccessControlDialog</name> <message> - <source>Auto-Type - KeePassXC</source> - <translation>Automatické vyplňování – KeePassXC</translation> + <source>KeePassXC-Browser Confirm Access</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remember this decision</source> + <translation>Zapamatovat si toto rozhodnutí</translation> + </message> + <message> + <source>Allow</source> + <translation>Umožnit</translation> + </message> + <message> + <source>Deny</source> + <translation>Odepřít</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 si vyžádalo přístup k heslům u následujících položek. +Umožnit přístup?</translation> + </message> +</context> +<context> + <name>BrowserOptionDialog</name> + <message> + <source>Dialog</source> + <translation>Dialog</translation> + </message> + <message> + <source>This is required for accessing your databases with KeePassXC-Browser</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable KeepassXC browser integration</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>Obecné</translation> + </message> + <message> + <source>Enable integration for these browsers:</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Google Chrome</source> + <translation>&Google Chrome</translation> + </message> + <message> + <source>&Firefox</source> + <translation>&Firefox</translation> + </message> + <message> + <source>&Chromium</source> + <translation>&Chromium</translation> + </message> + <message> + <source>&Vivaldi</source> + <translation>&Vivaldi</translation> + </message> + <message> + <source>Show a &notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Vyžádat odemknutí zamčené databáze</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Match URL scheme (e.g., https://...)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>Vrátí pouze nejlepší shody pro konkrétní URL adresu namísto všech položek pro celou doménu.</translation> + </message> + <message> + <source>&Return only best-matching credentials</source> + <translation type="unfinished"/> + </message> + <message> + <source>Sort &matching credentials by title</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Sort matching credentials by &username</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>&Disconnect all browsers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Forget all remembered &permissions</source> + <translation type="unfinished"/> + </message> + <message> + <source>Advanced</source> + <translation>Pokročilé</translation> + </message> + <message> + <source>Never &ask before accessing credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Never ask before &updating credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>Pouze označené databáze budou spojeny s klientem.</translation> + </message> + <message> + <source>Searc&h in all opened databases for matching credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>Automatická vytváření nebo aktualizace nejsou u textových kolonek podporované!</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>Odpovědět také kolonkami pok&ročilých textových řetězců které začínají na „KPH:“</translation> + </message> + <message> + <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Update &native messaging manifest files at startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Support a proxy application between KeePassXC and browser extension.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &proxy application between KeePassXC and browser extension</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a custom proxy location if you installed a proxy manually.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &custom proxy location</source> + <comment>Meant is the proxy for KeePassXC-Browser</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Procházet…</translation> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*.exe);;All Files (*.*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select custom proxy location</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>BrowserService</name> + <message> + <source>KeePassXC: New key association request</source> + <translation>KeePassXC: nový požadavek na přiřazení klíče</translation> + </message> + <message> + <source>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Save and allow access</source> + <translation>Uložit a povolit přístup</translation> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: Přepsat stávající klíč?</translation> + </message> + <message> + <source>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: Aktualizovat záznam</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Chcete aktualizovat údaj v %1 – %2?</translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: Databáze uzamčena!</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>Právě otevřená databáze je uzamčená! +Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: Nastavení nejsou k dispozici!</translation> + </message> + <message> + <source>The active database does not contain a settings entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: Klíče nebyly nalezeny</translation> + </message> + <message> + <source>No shared encryption keys found in KeePassXC Settings.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: Klíče odebrány z databáze</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Removing stored permissions…</source> + <translation type="unfinished"/> + </message> + <message> + <source>Abort</source> + <translation>Přerušit</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: Odebraná oprávnění</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entry(s).</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation>KeePassXC: Nebyl nalezen záznam s oprávněními!</translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>Právě otevřená databáze neobsahuje záznam s oprávněními.</translation> </message> </context> <context> @@ -148,6 +452,10 @@ Umožnit přístup?</translation> <source>Repeat password:</source> <translation>Zopakujte heslo:</translation> </message> + <message> + <source>&Key file</source> + <translation>Soubor s &klíčem</translation> + </message> <message> <source>Browse</source> <translation>Procházet</translation> @@ -156,6 +464,14 @@ Umožnit přístup?</translation> <source>Create</source> <translation>Vytvořit</translation> </message> + <message> + <source>Cha&llenge Response</source> + <translation>Výzva–odpověď</translation> + </message> + <message> + <source>Refresh</source> + <translation>Načíst znovu</translation> + </message> <message> <source>Key files</source> <translation>Soubory s klíči</translation> @@ -176,6 +492,10 @@ Umožnit přístup?</translation> <source>Select a key file</source> <translation>Vyberte soubor s klíčem</translation> </message> + <message> + <source>Empty password</source> + <translation>Prázdné heslo</translation> + </message> <message> <source>Do you really want to use an empty string as password?</source> <translation>Opravdu ponechat bez hesla, tedy nechráněné?</translation> @@ -191,20 +511,15 @@ Umožnit přístup?</translation> %2</translation> </message> <message> - <source>&Key file</source> - <translation>Soubor s &klíčem</translation> + <source>Legacy key file format</source> + <translation type="unfinished"/> </message> <message> - <source>Cha&llenge Response</source> - <translation>Výzva–odpověď</translation> - </message> - <message> - <source>Refresh</source> - <translation>Načíst znovu</translation> - </message> - <message> - <source>Empty password</source> - <translation>Prázdné heslo</translation> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -217,6 +532,10 @@ Umožnit přístup?</translation> <source>Clone Options</source> <translation>Předvolby klonu</translation> </message> + <message> + <source>Append ' - Clone' to title</source> + <translation>Připojit k titulku „ – klon“</translation> + </message> <message> <source>Replace username and password with references</source> <translation>Nahradit uživatelské jméno a heslo těmi referenčními</translation> @@ -225,10 +544,6 @@ Umožnit přístup?</translation> <source>Copy history</source> <translation>Kopírovat historii</translation> </message> - <message> - <source>Append ' - Clone' to title</source> - <translation>Připojit k titulku „ – klon“</translation> - </message> </context> <context> <name>CsvImportWidget</name> @@ -325,10 +640,6 @@ Umožnit přístup?</translation> </context> <context> <name>CsvImportWizard</name> - <message> - <source>Import CSV file</source> - <translation>Importovat CSV soubor</translation> - </message> <message> <source>Error</source> <translation>Chyba</translation> @@ -340,17 +651,17 @@ Umožnit přístup?</translation> </context> <context> <name>CsvParserModel</name> - <message> - <source> byte, </source> - <translation>bajt,</translation> + <message numerus="yes"> + <source>%n byte(s), </source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> </message> - <message> - <source> rows, </source> - <translation>řádků,</translation> + <message numerus="yes"> + <source>%n row(s), </source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> </message> - <message> - <source> columns</source> - <translation>sloupců</translation> + <message numerus="yes"> + <source>%n column(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> </message> </context> <context> @@ -371,13 +682,36 @@ Umožnit přístup?</translation> <source>Browse</source> <translation>Procházet</translation> </message> + <message> + <source>Refresh</source> + <translation>Načíst znovu</translation> + </message> + <message> + <source>Challenge Response:</source> + <translation>Výzva–odpověď:</translation> + </message> <message> <source>Unable to open the database.</source> <translation>Databázi se nedaří otevřít.</translation> </message> <message> <source>Can't open key file</source> - <translation>Soubor s klíčem se nedaří otevřít</translation> + <translation>Nedaří se otevřít soubor s klíčem</translation> + </message> + <message> + <source>Legacy key file format</source> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't show this warning again</source> + <translation>Toto varování znovu nezobrazovat</translation> </message> <message> <source>All files</source> @@ -391,14 +725,6 @@ Umožnit přístup?</translation> <source>Select key file</source> <translation>Vyberte soubor s klíčem</translation> </message> - <message> - <source>Refresh</source> - <translation>Načíst znovu</translation> - </message> - <message> - <source>Challenge Response:</source> - <translation>Výzva–odpověď:</translation> - </message> </context> <context> <name>DatabaseRepairWidget</name> @@ -415,12 +741,12 @@ Umožnit přístup?</translation> <translation>Nedaří se otevřít soubor s klíčem</translation> </message> <message> - <source>Database opened fine. Nothing to do.</source> - <translation>Databázi se podařilo v pořádku otevřít. Není třeba žádného zásahu.</translation> + <source>Unable to open the database.</source> + <translation>Databázi se nedaří otevřít.</translation> </message> <message> - <source>Unable to open the database.</source> - <translation>Nedaří se otevřít databázi.</translation> + <source>Database opened fine. Nothing to do.</source> + <translation>Databázi se podařilo v pořádku otevřít. Není třeba žádného zásahu.</translation> </message> <message> <source>Success</source> @@ -440,40 +766,57 @@ Nyní je možné ji uložit.</translation> <context> <name>DatabaseSettingsWidget</name> <message> - <source>Database name:</source> - <translation>Název databáze:</translation> + <source>General</source> + <translation>Obecné</translation> </message> <message> - <source>Database description:</source> - <translation>Popis databáze:</translation> + <source>Encryption</source> + <translation type="unfinished"/> </message> <message> - <source>Transform rounds:</source> - <translation>Počet průchodů šifrovacího algoritmu:</translation> + <source>Number of rounds too high</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> </message> <message> - <source>Default username:</source> - <translation>Výchozí uživatelské jméno:</translation> + <source>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</source> + <translation type="unfinished"/> </message> <message> - <source> MiB</source> - <translation> MiB</translation> + <source>Understood, keep number</source> + <translation type="unfinished"/> </message> <message> - <source>Benchmark</source> - <translation>Výkonnostní test</translation> + <source>Cancel</source> + <translation>Zrušit</translation> </message> <message> - <source>Max. history items:</source> - <translation>Omezit počet uchovávaných předchozích verzí záznamů na:</translation> + <source>Number of rounds too low</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> </message> <message> - <source>Max. history size:</source> - <translation>Omezit datový objem uchovávaných předchozích verzí záznamů na:</translation> + <source>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</source> + <translation type="unfinished"/> </message> <message> - <source>Use recycle bin</source> - <translation>Namísto mazání přesouvat do Koše</translation> + <source>KDF unchanged</source> + <translation>KDF nezměněno</translation> + </message> + <message> + <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetEncryption</name> + <message> + <source>Encryption Algorithm:</source> + <translation type="unfinished"/> </message> <message> <source>AES: 256 Bit (default)</source> @@ -484,19 +827,83 @@ Nyní je možné ji uložit.</translation> <translation>Twofish: 256 Bit</translation> </message> <message> - <source>Algorithm:</source> - <translation>Algoritmus:</translation> + <source>Key Derivation Function:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Transform rounds:</source> + <translation>Počet průchodů šifrovacího algoritmu:</translation> + </message> + <message> + <source>Benchmark 1-second delay</source> + <translation type="unfinished"/> + </message> + <message> + <source>Memory Usage:</source> + <translation type="unfinished"/> + </message> + <message> + <source> MB</source> + <translation>MB</translation> + </message> + <message> + <source>Parallelism:</source> + <translation type="unfinished"/> + </message> + <message> + <source> thread</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetGeneral</name> + <message> + <source>Database Meta Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database name:</source> + <translation>Název databáze:</translation> + </message> + <message> + <source>Database description:</source> + <translation>Popis databáze:</translation> + </message> + <message> + <source>Default username:</source> + <translation>Výchozí uživatelské jméno:</translation> + </message> + <message> + <source>History Settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Max. history items:</source> + <translation>Omezit počet uchovávaných předchozích verzí záznamů na:</translation> + </message> + <message> + <source>Max. history size:</source> + <translation>Omezit datový objem uchovávaných předchozích verzí záznamů na:</translation> + </message> + <message> + <source> MiB</source> + <translation> MiB</translation> + </message> + <message> + <source>Use recycle bin</source> + <translation>Namísto mazání přesouvat do Koše</translation> </message> </context> <context> <name>DatabaseTabWidget</name> <message> <source>Root</source> + <comment>Root group</comment> <translation>Kořen</translation> </message> <message> <source>KeePass 2 Database</source> - <translation>Databáze ve formátu KeePass verze 2</translation> + <translation>Databáze ve formátu KeePass 2</translation> </message> <message> <source>All files</source> @@ -510,6 +917,30 @@ Nyní je možné ji uložit.</translation> <source>File not found!</source> <translation>Soubor nebyl nalezen!</translation> </message> + <message> + <source>Unable to open the database.</source> + <translation>Databázi se nedaří otevřít.</translation> + </message> + <message> + <source>File opened in read only mode.</source> + <translation>Soubor otevřen v režimu pouze pro čtení.</translation> + </message> + <message> + <source>Open CSV file</source> + <translation>Otevřít CSV soubor</translation> + </message> + <message> + <source>CSV file</source> + <translation>CSV soubor</translation> + </message> + <message> + <source>All files (*)</source> + <translation>Veškeré soubory (*)</translation> + </message> + <message> + <source>Merge database</source> + <translation>Sloučit databáze</translation> + </message> <message> <source>Open KeePass 1 database</source> <translation>Otevřít databázi ve formátu KeePass verze 1</translation> @@ -518,14 +949,16 @@ Nyní je možné ji uložit.</translation> <source>KeePass 1 database</source> <translation>Databáze ve formátu KeePass verze 1</translation> </message> - <message> - <source>All files (*)</source> - <translation>Veškeré soubory (*)</translation> - </message> <message> <source>Close?</source> <translation>Zavřít?</translation> </message> + <message> + <source>"%1" is in edit mode. +Discard changes and close anyway?</source> + <translation>„%1“ je právě upravováno. +Přesto zavřít a zahodit tak změny?</translation> + </message> <message> <source>Save changes?</source> <translation>Uložit změny?</translation> @@ -540,10 +973,22 @@ Uložit změny?</translation> <source>Writing the database failed.</source> <translation>Zápis do databáze se nezdařil.</translation> </message> + <message> + <source>Passwords</source> + <translation>Hesla</translation> + </message> <message> <source>Save database as</source> <translation>Uložit databázi jako</translation> </message> + <message> + <source>Export database to CSV file</source> + <translation>Exportovat databázi do CSV souboru</translation> + </message> + <message> + <source>Writing the CSV file failed.</source> + <translation>Zápis do CSV souboru se nezdařil.</translation> + </message> <message> <source>New database</source> <translation>Nová databáze</translation> @@ -561,12 +1006,6 @@ Uložit změny?</translation> Please press cancel to finish your changes or discard them.</source> <translation>Nelze uzamknout databázi, protože ji v tuto chvíli upravujete. Pokud chcete změny dokončit, klikněte na Storno. V opačném případě změny zahodíte.</translation> - </message> - <message> - <source>This database has never been saved. -You can save the database or stop locking it.</source> - <translation>Tato databáze doposud ještě nebyla uložena. -Buď ji můžete uložit, nebo neuzamknout.</translation> </message> <message> <source>This database has been modified. @@ -576,69 +1015,13 @@ Otherwise your changes are lost.</source> Chcete ji před uzamčením uložit? Pokud ne, provedené změny budou ztraceny.</translation> </message> - <message> - <source>"%1" is in edit mode. -Discard changes and close anyway?</source> - <translation>„%1“ je právě upravováno. -Přesto zavřít a zahodit tak změny?</translation> - </message> - <message> - <source>Export database to CSV file</source> - <translation>Exportovat databázi do CSV souboru</translation> - </message> - <message> - <source>CSV file</source> - <translation>CSV soubor</translation> - </message> - <message> - <source>Writing the CSV file failed.</source> - <translation>Zápis do CSV souboru se nezdařil.</translation> - </message> - <message> - <source>Unable to open the database.</source> - <translation>Databázi se nedaří otevřít.</translation> - </message> - <message> - <source>Merge database</source> - <translation>Sloučit databáze</translation> - </message> - <message> - <source>The database you are trying to save as is locked by another instance of KeePassXC. -Do you want to save it anyway?</source> - <translation>Databáze, kterou se pokoušíte uložit, je právě používaná jinou instancí KeePassXC. -Chcete ji přesto uložit?</translation> - </message> - <message> - <source>Passwords</source> - <translation>Hesla</translation> - </message> - <message> - <source>Database already opened</source> - <translation>Tato databáze je již otevřená</translation> - </message> - <message> - <source>The database you are trying to open is locked by another instance of KeePassXC. - -Do you want to open it anyway?</source> - <translation>Databáze kterou se pokoušíte otevřít je právě používaná jinou instancí KeePassXC. - -Chcete ji přesto otevřít?</translation> - </message> - <message> - <source>Open read-only</source> - <translation>Otevřít pouze pro čtení</translation> - </message> - <message> - <source>File opened in read only mode.</source> - <translation>Soubor otevřen v režimu pouze pro čtení.</translation> - </message> - <message> - <source>Open CSV file</source> - <translation>Otevřít CSV soubor</translation> - </message> </context> <context> <name>DatabaseWidget</name> + <message> + <source>Searching...</source> + <translation>Hledání…</translation> + </message> <message> <source>Change master key</source> <translation>Změnit hlavní klíč</translation> @@ -659,13 +1042,33 @@ Chcete ji přesto otevřít?</translation> <source>Do you really want to delete %1 entries for good?</source> <translation>Opravdu chcete nenávratně smazat %1 záznamů?</translation> </message> + <message> + <source>Move entry to recycle bin?</source> + <translation>Přesunout záznam do Koše?</translation> + </message> + <message> + <source>Do you really want to move entry "%1" to the recycle bin?</source> + <translation>Opravdu přesunout záznam "%1" do Koše?</translation> + </message> <message> <source>Move entries to recycle bin?</source> <translation>Přesunout záznamy do Koše?</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>Opravdu přesunout %n záznam do Koše? ()</numerusform><numerusform>Opravdu přesunout %n záznamy do Koše? ()</numerusform><numerusform>Opravdu přesunout %n záznamů do Koše?</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Execute command?</source> + <translation>Spustit příkaz?</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation>Opravdu spustit následující příkaz?<br><br>%1<br></translation> + </message> + <message> + <source>Remember my choice</source> + <translation>Zapamatovat si pro příště</translation> </message> <message> <source>Delete group?</source> @@ -679,18 +1082,6 @@ Chcete ji přesto otevřít?</translation> <source>Unable to calculate master key</source> <translation>Nedaří se spočítat hlavní klíč</translation> </message> - <message> - <source>Move entry to recycle bin?</source> - <translation>Přesunout záznam do Koše?</translation> - </message> - <message> - <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation>Opravdu přesunout záznam "%1" do Koše?</translation> - </message> - <message> - <source>Searching...</source> - <translation>Hledání…</translation> - </message> <message> <source>No current database.</source> <translation>Aktuálně žádná databáze.</translation> @@ -708,20 +1099,8 @@ Chcete ji přesto otevřít?</translation> <translation>Nic nenalezeno</translation> </message> <message> - <source>Execute command?</source> - <translation>Spustit příkaz?</translation> - </message> - <message> - <source>Do you really want to execute the following command?<br><br>%1<br></source> - <translation>Opravdu spustit následující příkaz?<br><br>%1<br></translation> - </message> - <message> - <source>Remember my choice</source> - <translation>Zapamatovat si pro příště</translation> - </message> - <message> - <source>Autoreload Request</source> - <translation>Požadavek na automatické opětovné načtení</translation> + <source>File has changed</source> + <translation type="unfinished"/> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -732,8 +1111,9 @@ Chcete ji přesto otevřít?</translation> <translation>Požadavek na sloučení</translation> </message> <message> - <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> - <translation>Soubor s databází byl změněn a vaše změny do něj nejsou uloženy. Přejete si své změny začlenit?</translation> + <source>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</source> + <translation type="unfinished"/> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -748,6 +1128,89 @@ Chcete ji přesto otevřít?</translation> <translation>Opravdu chcete natrvalo smazat všechno z Koše?</translation> </message> </context> +<context> + <name>DetailsWidget</name> + <message> + <source>Generate TOTP Token</source> + <translation type="unfinished"/> + </message> + <message> + <source>Close</source> + <translation>Zavřít</translation> + </message> + <message> + <source>General</source> + <translation>Obecné</translation> + </message> + <message> + <source>Password</source> + <translation>Heslo</translation> + </message> + <message> + <source>URL</source> + <translation>URL adresa</translation> + </message> + <message> + <source>Expiration</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username</source> + <translation>Uživatelské jméno</translation> + </message> + <message> + <source>Autotype</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searching</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attributes</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation>Přílohy</translation> + </message> + <message> + <source>Notes</source> + <translation>Poznámky</translation> + </message> + <message> + <source>Window</source> + <translation>Okno</translation> + </message> + <message> + <source>Sequence</source> + <translation>Pořadí</translation> + </message> + <message> + <source>Search</source> + <translation>Hledat</translation> + </message> + <message> + <source>Clear</source> + <translation>Vyčistit</translation> + </message> + <message> + <source>Never</source> + <translation>Nikdy</translation> + </message> + <message> + <source>[PROTECTED]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Disabled</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enabled</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EditEntryWidget</name> <message> @@ -774,6 +1237,30 @@ Chcete ji přesto otevřít?</translation> <source>History</source> <translation>Historie</translation> </message> + <message> + <source>SSH Agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>(encrypted)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>File too large to be a private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open private key</source> + <translation type="unfinished"/> + </message> <message> <source>Entry history</source> <translation>Historie záznamu</translation> @@ -794,40 +1281,6 @@ Chcete ji přesto otevřít?</translation> <source>New attribute</source> <translation>Nový atribut</translation> </message> - <message> - <source>Select file</source> - <translation>Vyberte soubor</translation> - </message> - <message> - <source>Unable to open file</source> - <translation>Soubor se nedaří otevřít</translation> - </message> - <message> - <source>Save attachment</source> - <translation>Uložit přílohu</translation> - </message> - <message> - <source>Unable to save the attachment: -</source> - <translation>Přílohu se nedaří uložit: -</translation> - </message> - <message> - <source>Tomorrow</source> - <translation>Zítra</translation> - </message> - <message numerus="yes"> - <source>%n week(s)</source> - <translation><numerusform>%n týden</numerusform><numerusform>%n týdny</numerusform><numerusform>%n týdnů</numerusform></translation> - </message> - <message numerus="yes"> - <source>%n month(s)</source> - <translation><numerusform>%n měsíc</numerusform><numerusform>%n měsíce</numerusform><numerusform>%n měsíců</numerusform></translation> - </message> - <message> - <source>1 year</source> - <translation>1 rok</translation> - </message> <message> <source>Confirm Remove</source> <translation>Potvrdit odebrání</translation> @@ -837,12 +1290,28 @@ Chcete ji přesto otevřít?</translation> <translation>Opravdu chcete odebrat tento atribut?</translation> </message> <message> - <source>[PROTECTED] Press reveal to view or edit</source> - <translation>[CHRÁNĚNO] Pro zobrazení nebo úpravu klikněte na Odhalit</translation> + <source>[PROTECTED]</source> + <translation type="unfinished"/> </message> <message> - <source>Are you sure you want to remove this attachment?</source> - <translation>Opravdu chcete tuto přílohu odebrat?</translation> + <source>Press reveal to view or edit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Tomorrow</source> + <translation>Zítra</translation> + </message> + <message numerus="yes"> + <source>%n week(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source>%n month(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>1 year</source> + <translation>1 rok</translation> </message> </context> <context> @@ -859,18 +1328,6 @@ Chcete ji přesto otevřít?</translation> <source>Remove</source> <translation>Odebrat</translation> </message> - <message> - <source>Attachments</source> - <translation>Přílohy</translation> - </message> - <message> - <source>Save</source> - <translation>Uložit</translation> - </message> - <message> - <source>Open</source> - <translation>Otevřít</translation> - </message> <message> <source>Edit Name</source> <translation>Upravit název</translation> @@ -883,6 +1340,10 @@ Chcete ji přesto otevřít?</translation> <source>Reveal</source> <translation>Odhalit</translation> </message> + <message> + <source>Attachments</source> + <translation>Přílohy</translation> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -890,6 +1351,18 @@ Chcete ji přesto otevřít?</translation> <source>Enable Auto-Type for this entry</source> <translation>Zapnout automatické vyplňování tohoto záznamu</translation> </message> + <message> + <source>Inherit default Auto-Type sequence from the &group</source> + <translation>Převzít výchozí pořadí automatického vyplňování od skupiny</translation> + </message> + <message> + <source>&Use custom Auto-Type sequence:</source> + <translation>Po&užít vlastní pořadí automatického vyplňování:</translation> + </message> + <message> + <source>Window Associations</source> + <translation>Přiřazení oken</translation> + </message> <message> <source>+</source> <translation>+</translation> @@ -902,14 +1375,6 @@ Chcete ji přesto otevřít?</translation> <source>Window title:</source> <translation>Titulek okna:</translation> </message> - <message> - <source>Inherit default Auto-Type sequence from the &group</source> - <translation>Převzít výchozí pořadí automatického vyplňování od skupiny</translation> - </message> - <message> - <source>&Use custom Auto-Type sequence:</source> - <translation>Po&užít vlastní pořadí automatického vyplňování:</translation> - </message> <message> <source>Use default se&quence</source> <translation>Použít výchozí pořadí</translation> @@ -918,10 +1383,6 @@ Chcete ji přesto otevřít?</translation> <source>Set custo&m sequence:</source> <translation>Nastavit vlastní pořadí:</translation> </message> - <message> - <source>Window Associations</source> - <translation>Přiřazení oken</translation> - </message> </context> <context> <name>EditEntryWidgetHistory</name> @@ -945,12 +1406,8 @@ Chcete ji přesto otevřít?</translation> <context> <name>EditEntryWidgetMain</name> <message> - <source>Title:</source> - <translation>Titulek:</translation> - </message> - <message> - <source>Username:</source> - <translation>Uživatelské jméno:</translation> + <source>URL:</source> + <translation>URL adresa:</translation> </message> <message> <source>Password:</source> @@ -961,20 +1418,104 @@ Chcete ji přesto otevřít?</translation> <translation>Zopakování hesla:</translation> </message> <message> - <source>URL:</source> - <translation>URL adresa:</translation> + <source>Title:</source> + <translation>Titulek:</translation> </message> <message> - <source>Expires</source> - <translation>Platnost skončí</translation> + <source>Notes</source> + <translation>Poznámky</translation> </message> <message> <source>Presets</source> <translation>Předpřipravené</translation> </message> <message> - <source>Notes:</source> - <translation>Poznámky:</translation> + <source>Toggle the checkbox to reveal the notes section.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username:</source> + <translation>Uživatelské jméno:</translation> + </message> + <message> + <source>Expires</source> + <translation>Platnost skončí</translation> + </message> +</context> +<context> + <name>EditEntryWidgetSSHAgent</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent after</source> + <translation type="unfinished"/> + </message> + <message> + <source> seconds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fingerprint</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent when database is closed/locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add key to agent when database is opened/unlocked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Comment</source> + <translation type="unfinished"/> + </message> + <message> + <source>Decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy to clipboard</source> + <translation>Zkopírovat do schránky</translation> + </message> + <message> + <source>Private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>External file</source> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Procházet…</translation> + </message> + <message> + <source>Attachment</source> + <translation>Příloha</translation> + </message> + <message> + <source>Add to agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove from agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Require user confirmation when this key is used</source> + <translation type="unfinished"/> </message> </context> <context> @@ -1045,6 +1586,14 @@ Chcete ji přesto otevřít?</translation> </context> <context> <name>EditWidgetIcons</name> + <message> + <source>&Use default icon</source> + <translation>Po&užít výchozí ikonu</translation> + </message> + <message> + <source>Use custo&m icon</source> + <translation>Použít svou vlastní ikonu</translation> + </message> <message> <source>Add custom icon</source> <translation>Přidat svou vlastní ikonu</translation> @@ -1053,6 +1602,18 @@ Chcete ji přesto otevřít?</translation> <source>Delete custom icon</source> <translation>Smazat svou vlastní ikonu</translation> </message> + <message> + <source>Download favicon</source> + <translation>Stáhnout ikonu webu (favicon)</translation> + </message> + <message> + <source>Unable to fetch favicon.</source> + <translation>Ikonu webu (favicon) se nedaří stáhnout.</translation> + </message> + <message> + <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> + <translation>Rada: Jako náhradní řešení můžete zapnout Google v Nástroje → Nastavení → Zabezpečení</translation> + </message> <message> <source>Images</source> <translation>Obrázky</translation> @@ -1065,25 +1626,13 @@ Chcete ji přesto otevřít?</translation> <source>Select Image</source> <translation>Vyberte obrázek</translation> </message> - <message> - <source>Download favicon</source> - <translation>Stáhnout ikonu webu (favicon)</translation> - </message> - <message> - <source>Unable to fetch favicon.</source> - <translation>Ikonu webu (favicon) se nedaří stáhnout.</translation> - </message> <message> <source>Can't read icon</source> <translation>Ikonu se nedaří načíst</translation> </message> <message> - <source>&Use default icon</source> - <translation>Po&užít výchozí ikonu</translation> - </message> - <message> - <source>Use custo&m icon</source> - <translation>Použít svou vlastní ikonu</translation> + <source>Custom icon already exists</source> + <translation>Tato vlastní ikona už existuje</translation> </message> <message> <source>Confirm Delete</source> @@ -1093,14 +1642,6 @@ Chcete ji přesto otevřít?</translation> <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> <translation>Tato ikona je používána %1 záznamy a bude nahrazena výchozí ikonou. Opravdu ji chcete smazat?</translation> </message> - <message> - <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation>Rada: Jako náhradní řešení můžete zapnout Google v Nástroje → Nastavení → Zabezpečení</translation> - </message> - <message> - <source>Custom icon already exists</source> - <translation>Tato vlastní ikona už existuje</translation> - </message> </context> <context> <name>EditWidgetProperties</name> @@ -1125,9 +1666,93 @@ Chcete ji přesto otevřít?</translation> <name>Entry</name> <message> <source> - Clone</source> + <comment>Suffix added to cloned entries</comment> <translation>- Klon</translation> </message> </context> +<context> + <name>EntryAttachmentsModel</name> + <message> + <source>Name</source> + <translation>Název</translation> + </message> + <message> + <source>Size</source> + <translation>Velikost</translation> + </message> +</context> +<context> + <name>EntryAttachmentsWidget</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add</source> + <translation>Přidat</translation> + </message> + <message> + <source>Remove</source> + <translation>Odebrat</translation> + </message> + <message> + <source>Open</source> + <translation>Otevřít</translation> + </message> + <message> + <source>Save</source> + <translation>Uložit</translation> + </message> + <message> + <source>Select files</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <source>Are you sure you want to remove %n attachment(s)?</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>Potvrdit odebrání</translation> + </message> + <message> + <source>Save attachments</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to create directory: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Confirm overwrite</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to save attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachment: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open files: +%1</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EntryAttributesModel</name> <message> @@ -1156,6 +1781,11 @@ Chcete ji přesto otevřít?</translation> </context> <context> <name>EntryModel</name> + <message> + <source>Ref: </source> + <comment>Reference abbreviation</comment> + <translation>Ref:</translation> + </message> <message> <source>Group</source> <translation>Skupina</translation> @@ -1172,11 +1802,6 @@ Chcete ji přesto otevřít?</translation> <source>URL</source> <translation>URL adresa</translation> </message> - <message> - <source>Ref: </source> - <comment>Reference abbreviation</comment> - <translation>Ref:</translation> - </message> </context> <context> <name>Group</name> @@ -1185,6 +1810,17 @@ Chcete ji přesto otevřít?</translation> <translation>Koš</translation> </message> </context> +<context> + <name>HostInstaller</name> + <message> + <source>KeePassXC: Cannot save file!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot save the native messaging script file.</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>HttpPasswordGeneratorWidget</name> <message> @@ -1247,6 +1883,361 @@ Chcete ji přesto otevřít?</translation> <translation>Uzavřít správu</translation> </message> </context> +<context> + <name>Kdbx3Reader</name> + <message> + <source>Unable to calculate master key</source> + <translation>Nedaří se spočítat hlavní klíč</translation> + </message> + <message> + <source>Unable to issue challenge-response.</source> + <translation>Nedaří se vyvolat výzva-odpověď.</translation> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>Byl zadán chybný klíč, nebo je poškozen databázový soubor.</translation> + </message> +</context> +<context> + <name>Kdbx3Writer</name> + <message> + <source>Unable to issue challenge-response.</source> + <translation>Nedaří se vyvolat výzva-odpověď.</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Nedaří se spočítat hlavní klíč</translation> + </message> +</context> +<context> + <name>Kdbx4Reader</name> + <message> + <source>missing database headers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Nedaří se spočítat hlavní klíč</translation> + </message> + <message> + <source>Invalid header checksum size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Header SHA256 mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header data length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open buffer for KDF parameters in header</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported key derivation function (KDF) or invalid parameters</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy header fields found in KDBX4 file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header binary size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass variant map version.</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name data</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value data</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Bool entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry type</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map field type size</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Kdbx4Writer</name> + <message> + <source>Invalid symmetric cipher algorithm.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid symmetric cipher IV size.</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Nedaří se spočítat hlavní klíč</translation> + </message> + <message> + <source>Failed to serialize KDF parameters variant map</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxReader</name> + <message> + <source>Invalid cipher uuid length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid compression flags length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported compression algorithm</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid master seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform rounds size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid start bytes size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid random stream id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner random stream cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>Nejedná se o databázi KeePass.</translation> + </message> + <message> + <source>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> + <translation>Zvolený soubor je databáze ve starém formátu KeePass 1 (.kdb). + +Můžete ho importovat pomocí Databáze → Importovat databázi ve formátu KeePass 1…. +Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otevřít ve staré verzi KeePassX 0.4.</translation> + </message> + <message> + <source>Unsupported KeePass 2 database version.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxXmlReader</name> + <message> + <source>XML parsing failure: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>No root group</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing icon uuid or data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing custom data key or value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Multiple group elements</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null group uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableAutoType value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableSearching value</source> + <translation type="unfinished"/> + </message> + <message> + <source>No group uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null DeleteObject uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing DeletedObject uuid or time</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null entry uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element in history entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>No entry uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element with different uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decrypt entry string</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate custom attribute found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry string key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate attachment found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry binary key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-type association window or sequence missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid bool value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid date time value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color rgb part</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid uuid value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decompress binary</source> + <extracomment>Translator meant is a binary data inside an entry</extracomment> + <translation type="unfinished"/> + </message> +</context> <context> <name>KeePass1OpenWidget</name> <message> @@ -1266,7 +2257,7 @@ Chcete ji přesto otevřít?</translation> </message> <message> <source>Not a KeePass database.</source> - <translation>Nejedná se o databázi Keepass.</translation> + <translation>Nejedná se o databázi KeePass.</translation> </message> <message> <source>Unsupported encryption algorithm.</source> @@ -1276,6 +2267,35 @@ Chcete ji přesto otevřít?</translation> <source>Unsupported KeePass database version.</source> <translation>Nepodporovaná verze databáze KeePass.</translation> </message> + <message> + <source>Unable to read encryption IV</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of groups</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid content hash size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of transform rounds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to construct group tree</source> + <translation type="unfinished"/> + </message> <message> <source>Root</source> <translation>Kořen</translation> @@ -1288,60 +2308,104 @@ Chcete ji přesto otevřít?</translation> <source>Wrong key or database file is corrupt.</source> <translation>Byl zadán chybný klíč, nebo je poškozen databázový soubor.</translation> </message> -</context> -<context> - <name>KeePass2Reader</name> <message> - <source>Not a KeePass database.</source> - <translation>Nejedná se o databázi KeePass.</translation> + <source>Key transformation failed</source> + <translation type="unfinished"/> </message> <message> - <source>Unsupported KeePass database version.</source> - <translation>Nepodporovaná verze databáze KeePass.</translation> + <source>Invalid group field type number</source> + <translation type="unfinished"/> </message> <message> - <source>Wrong key or database file is corrupt.</source> - <translation>Byl zadán chybný klíč, nebo je poškozen databázový soubor.</translation> + <source>Invalid group field size</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>Nedaří se spočítat hlavní klíč</translation> + <source>Read group field data doesn't match size</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to issue challenge-response.</source> - <translation>Nedaří se vyvolat výzva-odpověď.</translation> + <source>Incorrect group id field size</source> + <translation type="unfinished"/> </message> <message> - <source>The selected file is an old KeePass 1 database (.kdb). - -You can import it by clicking on Database > 'Import KeePass 1 database...'. -This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> - <translation>Zvolený soubor je databáze ve starém formátu KeePass 1 (.kdb). - -Můžete ho importovat pomocí Databáze → Importovat databázi ve formátu KeePass 1…. -Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otevřít ve staré verzi KeePassX 0.4.</translation> - </message> -</context> -<context> - <name>KeePass2Writer</name> - <message> - <source>Unable to issue challenge-response.</source> - <translation>Nedaří se vyvolat výzva-odpověď.</translation> + <source>Incorrect group creation time field size</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>Nedaří se spočítat hlavní klíč</translation> + <source>Incorrect group modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group access time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group level field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing group id or level</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing entry field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read entry field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry uuid field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field type</source> + <translation type="unfinished"/> </message> </context> <context> <name>Main</name> <message> - <source>Fatal error while testing the cryptographic functions.</source> - <translation>Při zkoušení šifrovacích funkcí byl zjištěn fatální nedostatek.</translation> - </message> - <message> - <source>KeePassXC - Error</source> - <translation>KeePassXC – chyba</translation> + <source>Existing single-instance lock file is invalid. Launching new instance.</source> + <translation>Existující uzamykací soubor, zajišťující spuštění pouze jedné instance, není platný. Spouští se nová instance.</translation> </message> <message> <source>The lock file could not be created. Single-instance mode disabled.</source> @@ -1352,64 +2416,32 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev <translation>Již je spuštěná jiná instance KeePassXC.</translation> </message> <message> - <source>Existing single-instance lock file is invalid. Launching new instance.</source> - <translation>Existující uzamykací soubor, zajišťující spuštění pouze jedné instance, není platný. Spouští se nová instance.</translation> + <source>Fatal error while testing the cryptographic functions.</source> + <translation>Při zkoušení šifrovacích funkcí byl zjištěn fatální nedostatek.</translation> + </message> + <message> + <source>KeePassXC - Error</source> + <translation>KeePassXC – chyba</translation> </message> </context> <context> <name>MainWindow</name> <message> - <source>Open database</source> - <translation>Otevřít databázi</translation> - </message> - <message> - <source>Database settings</source> - <translation>Nastavení databáze</translation> - </message> - <message> - <source>Copy username to clipboard</source> - <translation>Zkopírovat uživatelské jméno do schránky</translation> - </message> - <message> - <source>Copy password to clipboard</source> - <translation>Zkopírovat heslo do schránky</translation> - </message> - <message> - <source>Settings</source> - <translation>Nastavení</translation> - </message> - <message> - <source>Show toolbar</source> - <translation>Zobrazovat lištu nástrojů</translation> - </message> - <message> - <source>read-only</source> - <translation>pouze pro čtení</translation> - </message> - <message> - <source>Toggle window</source> - <translation>Zobrazit/skrýt okno</translation> - </message> - <message> - <source>KeePass 2 Database</source> - <translation>Databáze ve formátu KeePass 2</translation> - </message> - <message> - <source>All files</source> - <translation>Veškeré soubory</translation> - </message> - <message> - <source>Save repaired database</source> - <translation>Uložit opravenou databázi</translation> - </message> - <message> - <source>Writing the database failed.</source> - <translation>Zápis do databáze se nezdařil.</translation> + <source>&Database</source> + <translation>&Databáze</translation> </message> <message> <source>&Recent databases</source> <translation>&Nedávno otevřené databáze</translation> </message> + <message> + <source>Import</source> + <translation>Importovat</translation> + </message> + <message> + <source>&Help</source> + <translation>Nápověda</translation> + </message> <message> <source>E&ntries</source> <translation>Záz&namy</translation> @@ -1418,13 +2450,17 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev <source>Copy att&ribute to clipboard</source> <translation>Zkopí&rovat atribut do schránky</translation> </message> + <message> + <source>Time-based one-time password</source> + <translation type="unfinished"/> + </message> <message> <source>&Groups</source> <translation>Skupiny</translation> </message> <message> - <source>&View</source> - <translation>Zobrazit</translation> + <source>&Tools</source> + <translation>Nás&troje</translation> </message> <message> <source>&Quit</source> @@ -1434,6 +2470,10 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev <source>&About</source> <translation>O &aplikaci</translation> </message> + <message> + <source>&Open database...</source> + <translation>&Otevřít databázi…</translation> + </message> <message> <source>&Save database</source> <translation>Uložit databázi</translation> @@ -1474,26 +2514,26 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev <source>&Delete group</source> <translation>Smazat skupinu</translation> </message> + <message> + <source>Sa&ve database as...</source> + <translation>&Uložit databázi jako…</translation> + </message> + <message> + <source>Change &master key...</source> + <translation>Z&měnit hlavní klíč…</translation> + </message> <message> <source>&Database settings</source> <translation>Nastavení &databáze</translation> </message> + <message> + <source>Database settings</source> + <translation>Nastavení databáze</translation> + </message> <message> <source>&Clone entry</source> <translation>Klonovat záznam</translation> </message> - <message> - <source>Timed one-time password</source> - <translation>Časované jednorázové heslo</translation> - </message> - <message> - <source>Copy &TOTP</source> - <translation>Zkopírovat &TOTP</translation> - </message> - <message> - <source>Show TOTP</source> - <translation>Zobrazit TOTP</translation> - </message> <message> <source>&Find</source> <translation>Najít</translation> @@ -1502,14 +2542,26 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev <source>Copy &username</source> <translation>Zkopírovat &uživatelské jméno</translation> </message> + <message> + <source>Copy username to clipboard</source> + <translation>Zkopírovat uživatelské jméno do schránky</translation> + </message> <message> <source>Cop&y password</source> <translation>Zkopírovat heslo</translation> </message> + <message> + <source>Copy password to clipboard</source> + <translation>Zkopírovat heslo do schránky</translation> + </message> <message> <source>&Settings</source> <translation>Na&stavení</translation> </message> + <message> + <source>Password Generator</source> + <translation>Generátor hesel</translation> + </message> <message> <source>&Perform Auto-Type</source> <translation>&Provést automatické vyplnění</translation> @@ -1526,65 +2578,25 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev <source>&Title</source> <translation>&Titulek</translation> </message> + <message> + <source>Copy title to clipboard</source> + <translation type="unfinished"/> + </message> <message> <source>&URL</source> <translation>&URL adresa</translation> </message> + <message> + <source>Copy URL to clipboard</source> + <translation type="unfinished"/> + </message> <message> <source>&Notes</source> <translation>Poz&námky</translation> </message> <message> - <source>Password Generator</source> - <translation>Generátor hesel</translation> - </message> - <message> - <source>Clear history</source> - <translation>Vyčistit historii</translation> - </message> - <message> - <source>&Database</source> - <translation>&Databáze</translation> - </message> - <message> - <source>Import</source> - <translation>Importovat</translation> - </message> - <message> - <source>&Tools</source> - <translation>Nás&troje</translation> - </message> - <message> - <source>Empty recycle bin</source> - <translation>Vyprázdnit Koš</translation> - </message> - <message> - <source>Access error for config file %1</source> - <translation>Chyba přístupu k souboru s nastaveními %1</translation> - </message> - <message> - <source>Quit KeePassXC</source> - <translation>Ukončit KeePassXC</translation> - </message> - <message> - <source>Please touch the button on your YubiKey!</source> - <translation>Dotkněte se tlačítka na svém YubiKey zařízení!</translation> - </message> - <message> - <source>&Help</source> - <translation>Nápověda</translation> - </message> - <message> - <source>&Open database...</source> - <translation>&Otevřít databázi…</translation> - </message> - <message> - <source>Sa&ve database as...</source> - <translation>&Uložit databázi jako…</translation> - </message> - <message> - <source>Change &master key...</source> - <translation>Z&měnit hlavní klíč…</translation> + <source>Copy notes to clipboard</source> + <translation type="unfinished"/> </message> <message> <source>&Export to CSV file...</source> @@ -1602,10 +2614,169 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev <source>Re&pair database...</source> <translation>O&pravit databázi…</translation> </message> + <message> + <source>Show TOTP</source> + <translation>Zobrazit TOTP</translation> + </message> <message> <source>Set up TOTP...</source> <translation>Nastavit TOTP…</translation> </message> + <message> + <source>Copy &TOTP</source> + <translation>Zkopírovat &TOTP</translation> + </message> + <message> + <source>E&mpty recycle bin</source> + <translation type="unfinished"/> + </message> + <message> + <source>Clear history</source> + <translation>Vyčistit historii</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation>Chyba přístupu k souboru s nastaveními %1</translation> + </message> + <message> + <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> + <translation type="unfinished"/> + </message> + <message> + <source>read-only</source> + <translation>pouze pro čtení</translation> + </message> + <message> + <source>Settings</source> + <translation>Nastavení</translation> + </message> + <message> + <source>Toggle window</source> + <translation>Zobrazit/skrýt okno</translation> + </message> + <message> + <source>Quit KeePassXC</source> + <translation>Ukončit KeePassXC</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>Databáze ve formátu KeePass 2</translation> + </message> + <message> + <source>All files</source> + <translation>Veškeré soubory</translation> + </message> + <message> + <source>Open database</source> + <translation>Otevřít databázi</translation> + </message> + <message> + <source>Save repaired database</source> + <translation>Uložit opravenou databázi</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>Zápis do databáze se nezdařil.</translation> + </message> + <message> + <source>Please touch the button on your YubiKey!</source> + <translation>Dotkněte se tlačítka na svém YubiKey zařízení!</translation> + </message> +</context> +<context> + <name>OpenSSHKey</name> + <message> + <source>Invalid key file, expecting an OpenSSH key</source> + <translation type="unfinished"/> + </message> + <message> + <source>PEM boundary mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>This is not an OpenSSH key, only modern keys are supported</source> + <translation type="unfinished"/> + </message> + <message> + <source>Base64 decoding failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file way too small.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file magic header id invalid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Found zero keys</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to read public key.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Corrupted key file, reading private key failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>No private key payload to decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: </source> + <translation>Neznámá šifra:</translation> + </message> + <message> + <source>Trying to run KDF without cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Passphrase is required to decrypt this key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key derivation failed, key file corrupted?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: </source> + <translation>Neznámé KDF:</translation> + </message> + <message> + <source>Decryption failed, wrong passphrase?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write public key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write private key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing private key</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OptionDialog</name> @@ -1613,22 +2784,63 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev <source>Dialog</source> <translation>Dialog</translation> </message> + <message> + <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation>Toto je vyžadováno pro přístup k databázím z ChromeIPass nebo PassIFox</translation> + </message> + <message> + <source>Enable KeePassHTTP server</source> + <translation>Zapnout KeePassHTTP server</translation> + </message> <message> <source>General</source> <translation>Obecné</translation> </message> <message> <source>Sh&ow a notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> <translation>Z&obrazit oznámení když jsou požadovány přihlašovací údaje</translation> </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>Vrátí pouze nejlepší shody pro konkrétní URL adresu namísto všech položek pro celou doménu.</translation> + </message> + <message> + <source>&Return only best matching entries</source> + <translation>V&racet pouze nejlépe odpovídající položky</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Vyžádat odemknutí zamčené databáze</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> + <translation>Jsou vráceny pouze položky se stejným schématem (http://, https://, ftp://, …).</translation> + </message> + <message> + <source>&Match URL schemes</source> + <translation>&Hledat shodu s URL schématy</translation> + </message> <message> <source>Sort matching entries by &username</source> <translation>Seřadit odpovídající záznamy dle &uživatelského jména</translation> </message> + <message> + <source>Sort &matching entries by title</source> + <translation>Seřadit odpovídající zázna&my dle názvu</translation> + </message> + <message> + <source>R&emove all shared encryption keys from active database</source> + <translation>Z právě otevřené databáze od&ebrat veškeré sdílené šifrovací klíče</translation> + </message> <message> <source>Re&move all stored permissions from entries in active database</source> <translation>Z právě otevřené databáze odebrat veškerá uložená oprávnění</translation> </message> + <message> + <source>Password Generator</source> + <translation>Generátor hesel</translation> + </message> <message> <source>Advanced</source> <translation>Pokročilé</translation> @@ -1641,10 +2853,22 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev <source>Always allow &updating entries</source> <translation>Vždy umožnit akt&ualizovat záznamy</translation> </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>Pouze označené databáze budou spojeny s klientem.</translation> + </message> <message> <source>Searc&h in all opened databases for matching entries</source> <translation>Vy&hledat odpovídající záznamy ve všech otevřených databázích</translation> </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>Automatická vytváření nebo aktualizace nejsou u textových kolonek podporované!</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>Odpovědět také kolonkami pok&ročilých textových řetězců které začínají na „KPH:“</translation> + </message> <message> <source>HTTP Port:</source> <translation>HTTP port:</translation> @@ -1653,18 +2877,18 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev <source>Default port: 19455</source> <translation>Výchozí port: 19455</translation> </message> - <message> - <source>Re&quest to unlock the database if it is locked</source> - <translation>Vyžádat odemknutí zamčené databáze</translation> - </message> - <message> - <source>Sort &matching entries by title</source> - <translation>Seřadit odpovídající zázna&my dle názvu</translation> - </message> <message> <source>KeePassXC will listen to this port on 127.0.0.1</source> <translation>KeePassXC bude očekávat spojení na tomto portu na adrese 127.0.0.1</translation> </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> + <translation type="unfinished"/> + </message> <message> <source>Cannot bind to privileged ports</source> <translation>Není možné navázat se na privilegované porty</translation> @@ -1675,63 +2899,30 @@ Using default port 19455.</source> <translation>Není možné navázat na porty s číslem nižším, než 1024! Náhradně bude použit port 19455.</translation> </message> - <message> - <source>R&emove all shared encryption keys from active database</source> - <translation>Z právě otevřené databáze od&ebrat veškeré sdílené šifrovací klíče</translation> - </message> - <message> - <source>&Return advanced string fields which start with "KPH: "</source> - <translation>Odpovědět také kolonkami pok&ročilých textových řetězců které začínají na „KPH:“</translation> - </message> - <message> - <source>Automatically creating or updating string fields is not supported.</source> - <translation>Automatická vytváření nebo aktualizace nejsou u textových kolonek podporované!</translation> - </message> - <message> - <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> - <translation>Toto je vyžadováno pro přístup k databázím z ChromeIPass nebo PassIFox</translation> - </message> - <message> - <source>Enable KeePassHTTP server</source> - <translation>Zapnout KeePassHTTP server</translation> - </message> - <message> - <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation>Vrátí pouze nejlepší shody pro konkrétní URL adresu namísto všech položek pro celou doménu.</translation> - </message> - <message> - <source>&Return only best matching entries</source> - <translation>V&racet pouze nejlépe odpovídající položky</translation> - </message> - <message> - <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation>Jsou vráceny pouze položky se stejným schématem (http://, https://, ftp://, …).</translation> - </message> - <message> - <source>&Match URL schemes</source> - <translation>&Hledat shodu s URL schématy</translation> - </message> - <message> - <source>Password Generator</source> - <translation>Generátor hesel</translation> - </message> - <message> - <source>Only the selected database has to be connected with a client.</source> - <translation>Pouze označené databáze budou spojeny s klientem.</translation> - </message> - <message> - <source>The following options can be dangerous! -Change them only if you know what you are doing.</source> - <translation>Následující předvolby mohou být nebezpečné! -Měňte je pouze, pokud víte, co děláte.</translation> - </message> </context> <context> <name>PasswordGeneratorWidget</name> + <message> + <source>%p%</source> + <translation>%p%</translation> + </message> <message> <source>Password:</source> <translation>Heslo:</translation> </message> + <message> + <source>strength</source> + <comment>Password strength</comment> + <translation>odolnost</translation> + </message> + <message> + <source>entropy</source> + <translation>nahodilost</translation> + </message> + <message> + <source>Password</source> + <translation>Heslo</translation> + </message> <message> <source>Character Types</source> <translation>Typy znaků</translation> @@ -1752,38 +2943,50 @@ Měňte je pouze, pokud víte, co děláte.</translation> <source>Special Characters</source> <translation>Zvláštní znaky</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>Rozšířené ASCII</translation> + </message> <message> <source>Exclude look-alike characters</source> <translation>Vynechat podobně vypadající znaky (předejití záměně)</translation> </message> - <message> - <source>Accept</source> - <translation>Přijmout</translation> - </message> - <message> - <source>%p%</source> - <translation>%p%</translation> - </message> - <message> - <source>strength</source> - <translation>odolnost</translation> - </message> - <message> - <source>entropy</source> - <translation>nahodilost</translation> - </message> - <message> - <source>&Length:</source> - <translation>Dé&lka:</translation> - </message> <message> <source>Pick characters from every group</source> <translation>Zajistit přítomnost znaků ze všech zvolených skupin</translation> </message> + <message> + <source>&Length:</source> + <translation>Dé&lka:</translation> + </message> + <message> + <source>Passphrase</source> + <translation>Heslová fráze</translation> + </message> + <message> + <source>Wordlist:</source> + <translation>Slovník:</translation> + </message> + <message> + <source>Word Count:</source> + <translation>Počet slov:</translation> + </message> + <message> + <source>Word Separator:</source> + <translation>Oddělovač slov:</translation> + </message> <message> <source>Generate</source> <translation>Tvoř</translation> </message> + <message> + <source>Copy</source> + <translation>Kopírovat</translation> + </message> + <message> + <source>Accept</source> + <translation>Přijmout</translation> + </message> <message> <source>Close</source> <translation>Zavřít</translation> @@ -1802,51 +3005,270 @@ Měňte je pouze, pokud víte, co děláte.</translation> </message> <message> <source>Poor</source> + <comment>Password quality</comment> <translation>Velmi slabé</translation> </message> <message> <source>Weak</source> + <comment>Password quality</comment> <translation>Slabé</translation> </message> <message> <source>Good</source> + <comment>Password quality</comment> <translation>Dobré</translation> </message> <message> <source>Excellent</source> + <comment>Password quality</comment> <translation>Výborné</translation> </message> - <message> - <source>Password</source> - <translation>Heslo</translation> - </message> - <message> - <source>Extended ASCII</source> - <translation>Rozšířené ASCII</translation> - </message> - <message> - <source>Passphrase</source> - <translation>Heslová fráze</translation> - </message> - <message> - <source>Wordlist:</source> - <translation>Slovník:</translation> - </message> - <message> - <source>Word Count:</source> - <translation>Počet slov:</translation> - </message> - <message> - <source>Word Separator:</source> - <translation>Oddělovač slov:</translation> - </message> - <message> - <source>Copy</source> - <translation>Kopírovat</translation> - </message> </context> <context> <name>QObject</name> + <message> + <source>Database not opened</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database hash not available</source> + <translation type="unfinished"/> + </message> + <message> + <source>Client public key not received</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot decrypt message</source> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout or cannot connect to KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>Action cancelled or denied</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC association failed, try again</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key change was not successful</source> + <translation type="unfinished"/> + </message> + <message> + <source>Encryption key is not recognized</source> + <translation type="unfinished"/> + </message> + <message> + <source>No saved databases found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect action</source> + <translation type="unfinished"/> + </message> + <message> + <source>Empty message received</source> + <translation type="unfinished"/> + </message> + <message> + <source>No URL provided</source> + <translation type="unfinished"/> + </message> + <message> + <source>No logins found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown error</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add a new entry to a database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>Umístění databáze.</translation> + </message> + <message> + <source>Key file of the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>path</source> + <translation>cesta</translation> + </message> + <message> + <source>Username for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>username</source> + <translation>uživatelské jméno</translation> + </message> + <message> + <source>URL for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL</source> + <translation>URL adresa</translation> + </message> + <message> + <source>Prompt for the entry's password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a password for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length for the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>length</source> + <translation>délka</translation> + </message> + <message> + <source>Path of the entry to add.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy an entry's password to the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to clip.</source> + <comment>clip = copy to clipboard</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout in seconds before clearing the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Edit an entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Title for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>title</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to edit.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Estimate the entropy of a password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password for which to estimate the entropy.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Perform advanced analysis on the password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Extract and print the content of a database.</source> + <translation>Vytáhnout a vypsat obsah databáze.</translation> + </message> + <message> + <source>Path of the database to extract.</source> + <translation>Umístění extrahované databáze.</translation> + </message> + <message> + <source>Insert password to unlock %1: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to load key file %1 : %2</source> + <translation type="unfinished"/> + </message> + <message> + <source>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source> + +Available commands: +</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the command to execute.</source> + <translation>Název příkazu ke spuštění.</translation> + </message> + <message> + <source>List database entries.</source> + <translation>Vypsat položky databáze.</translation> + </message> + <message> + <source>Path of the group to list. Default is /</source> + <translation>Umístění seznamu skupin. Výchozí je /</translation> + </message> + <message> + <source>Find entries quickly.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Search term.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Merge two databases.</source> + <translation>Sloučit dvě databáze.</translation> + </message> + <message> + <source>Path of the database to merge into.</source> + <translation>Umístění sloučené databáze.</translation> + </message> + <message> + <source>Path of the database to merge from.</source> + <translation>Umístění výchozí databáze.</translation> + </message> + <message> + <source>Use the same credentials for both database files.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file of the database to merge from.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show an entry's information.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> + <translation type="unfinished"/> + </message> + <message> + <source>attribute</source> + <translation>atribut</translation> + </message> + <message> + <source>Name of the entry to show.</source> + <translation>Název položky k zobrazení.</translation> + </message> <message> <source>NULL device</source> <translation>NULL zařízení</translation> @@ -1870,8 +3292,28 @@ Měňte je pouze, pokud víte, co děláte.</translation> <translation>chybějící uzavírací uvozovka</translation> </message> <message> - <source>INTERNAL - unget lower bound exceeded</source> - <translation>VNITŘNÍ – unget lower bound překročeno</translation> + <source>AES: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Twofish: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>ChaCha20: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Argon2 (KDBX 4 – recommended)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 4)</source> + <translation>AES-KDF (KDBX 4)</translation> + </message> + <message> + <source>AES-KDF (KDBX 3.1)</source> + <translation>AES-KDF (KDBX 3.1)</translation> </message> <message> <source>Group</source> @@ -1889,14 +3331,22 @@ Měňte je pouze, pokud víte, co děláte.</translation> <source>Password</source> <translation>Heslo</translation> </message> - <message> - <source>URL</source> - <translation>URL adresa</translation> - </message> <message> <source>Notes</source> <translation>Poznámky</translation> </message> + <message> + <source>Last Modified</source> + <translation type="unfinished"/> + </message> + <message> + <source>Created</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy Browser Integration</source> + <translation type="unfinished"/> + </message> <message> <source>Browser Integration</source> <translation>Napojení na webový prohlížeč</translation> @@ -1913,6 +3363,10 @@ Měňte je pouze, pokud víte, co děláte.</translation> <source>Passive</source> <translation>Pasivní</translation> </message> + <message> + <source>SSH Agent</source> + <translation type="unfinished"/> + </message> </context> <context> <name>QtIOCompressor</name> @@ -1951,8 +3405,8 @@ Měňte je pouze, pokud víte, co děláte.</translation> <context> <name>SearchWidget</name> <message> - <source>Case Sensitive</source> - <translation>Rozlišovat velikost písmen</translation> + <source>Search...</source> + <translation>Hledat…</translation> </message> <message> <source>Search</source> @@ -1963,8 +3417,8 @@ Měňte je pouze, pokud víte, co děláte.</translation> <translation>Vyčistit</translation> </message> <message> - <source>Search...</source> - <translation>Hledat…</translation> + <source>Case Sensitive</source> + <translation>Rozlišovat velikost písmen</translation> </message> <message> <source>Limit search to selected group</source> @@ -1973,50 +3427,6 @@ Měňte je pouze, pokud víte, co děláte.</translation> </context> <context> <name>Service</name> - <message> - <source>A shared encryption-key with the name "%1" already exists. -Do you want to overwrite it?</source> - <translation>Již existuje sdílený šifrovací klíč s názvem „%1“. -Chcete ho přepsat?</translation> - </message> - <message> - <source>Do you want to update the information in %1 - %2?</source> - <translation>Chcete aktualizovat údaj v %1 – %2?</translation> - </message> - <message> - <source>The active database is locked! -Please unlock the selected database or choose another one which is unlocked.</source> - <translation>Právě otevřená databáze je uzamčená! -Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> - </message> - <message> - <source>Successfully removed %1 encryption-%2 from KeePassX/Http Settings.</source> - <translation>Z nastavení KeePassX/Http bylo úspěšně odebráno %1 šifrování-%2.</translation> - </message> - <message> - <source>No shared encryption-keys found in KeePassHttp Settings.</source> - <translation>V nastavení KeePassHttp nebyly nalezeny žádné sdílené šifrovací klíče.</translation> - </message> - <message> - <source>The active database does not contain an entry of KeePassHttp Settings.</source> - <translation>Právě otevřená databáze neobsahuje žádný záznam nastavení KeePassHttp.</translation> - </message> - <message> - <source>Removing stored permissions...</source> - <translation>Odstraňování uložených oprávnění…</translation> - </message> - <message> - <source>Abort</source> - <translation>Přerušit</translation> - </message> - <message> - <source>Successfully removed permissions from %1 %2.</source> - <translation>Oprávnění %1 %2 úspěšně odebrána.</translation> - </message> - <message> - <source>The active database does not contain an entry with permissions.</source> - <translation>Právě otevřená databáze neobsahuje záznam s oprávněními.</translation> - </message> <message> <source>KeePassXC: New key association request</source> <translation>KeePassXC: nový požadavek na přiřazení klíče</translation> @@ -2033,34 +3443,78 @@ neopakující se název pro identifikaci a potvrďte ho.</translation> <source>KeePassXC: Overwrite existing key?</source> <translation>KeePassXC: Přepsat stávající klíč?</translation> </message> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>Již existuje sdílený šifrovací klíč s názvem „%1“. +Chcete ho přepsat?</translation> + </message> <message> <source>KeePassXC: Update Entry</source> <translation>KeePassXC: Aktualizovat záznam</translation> </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Chcete aktualizovat údaj v %1 – %2?</translation> + </message> <message> <source>KeePassXC: Database locked!</source> <translation>KeePassXC: Databáze uzamčena!</translation> </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>Právě otevřená databáze je uzamčená! +Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> + </message> <message> <source>KeePassXC: Removed keys from database</source> <translation>KeePassXC: Klíče odebrány z databáze</translation> </message> + <message numerus="yes"> + <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No keys found</source> <translation>KeePassXC: Klíče nebyly nalezeny</translation> </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation>V nastavení KeePassHttp nebyly nalezeny žádné sdílené šifrovací klíče.</translation> + </message> <message> <source>KeePassXC: Settings not available!</source> <translation>KeePassXC: Nastavení nejsou k dispozici!</translation> </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation>Právě otevřená databáze neobsahuje žádný záznam nastavení KeePassHttp.</translation> + </message> + <message> + <source>Removing stored permissions...</source> + <translation>Odstraňování uložených oprávnění…</translation> + </message> + <message> + <source>Abort</source> + <translation>Přerušit</translation> + </message> <message> <source>KeePassXC: Removed permissions</source> <translation>KeePassXC: Odebraná oprávnění</translation> </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entries.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No entry with permissions found!</source> <translation>KeePassXC: Nebyl nalezen záznam s oprávněními!</translation> </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>Právě otevřená databáze neobsahuje záznam s oprávněními.</translation> + </message> </context> <context> <name>SettingsWidget</name> @@ -2078,15 +3532,31 @@ neopakující se název pro identifikaci a potvrďte ho.</translation> </message> <message> <source>Access error for config file %1</source> - <translation>Chyba přístupu pro soubor s nastaveními %1</translation> + <translation>Chyba přístupu k souboru s nastaveními %1</translation> </message> </context> <context> <name>SettingsWidgetGeneral</name> + <message> + <source>Basic Settings</source> + <translation>Základní nastavení</translation> + </message> + <message> + <source>Start only a single instance of KeePassXC</source> + <translation>Spouštět pouze jedinou instanci KeePassXC</translation> + </message> <message> <source>Remember last databases</source> <translation>Pamatovat si nedávno otevřené databáze</translation> </message> + <message> + <source>Remember last key files and security dongles</source> + <translation>Pamatovat si minule použité soubory s klíči a zabezpečovací klíčenky</translation> + </message> + <message> + <source>Load previous databases on startup</source> + <translation>Při spouštění aplikace načíst minule otevřené databáze</translation> + </message> <message> <source>Automatically save on exit</source> <translation>Před ukončením aplikace automaticky uložit případné změny</translation> @@ -2095,21 +3565,29 @@ neopakující se název pro identifikaci a potvrďte ho.</translation> <source>Automatically save after every change</source> <translation>Po každé změně hned automaticky uložit</translation> </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation>V případě úpravy zvenčí, automaticky opětovně načíst databázi</translation> + </message> <message> <source>Minimize when copying to clipboard</source> <translation>Po zkopírování údaje do schránky odklidit okno aplikace jeho automatickou minimalizací</translation> </message> + <message> + <source>Minimize window at application startup</source> + <translation>Spouštět aplikaci s minimalizovaným oknem</translation> + </message> <message> <source>Use group icon on entry creation</source> <translation>Pro vytvářený záznam použít ikonu skupiny, do které spadá</translation> </message> <message> - <source>Global Auto-Type shortcut</source> - <translation>Klávesová zkratka pro všeobecné automatické vyplňování</translation> + <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> + <translation>Neoznačovat databázi jako upravenou při změnách, nepostihujících údaje (např. rozšíření skupin)</translation> </message> <message> - <source>Language</source> - <translation>Jazyk</translation> + <source>Hide the Details view</source> + <translation type="unfinished"/> </message> <message> <source>Show a system tray icon</source> @@ -2119,67 +3597,61 @@ neopakující se název pro identifikaci a potvrďte ho.</translation> <source>Hide window to system tray when minimized</source> <translation>Minimalizovat okno aplikace do oznamovací oblasti systémového panelu</translation> </message> - <message> - <source>Load previous databases on startup</source> - <translation>Při spouštění aplikace načíst minule otevřené databáze</translation> - </message> - <message> - <source>Automatically reload the database when modified externally</source> - <translation>V případě úpravy zvenčí, automaticky opětovně načíst databázi</translation> - </message> <message> <source>Hide window to system tray instead of app exit</source> <translation>Namísto ukončení aplikace skrýt její okno do oznamovací oblasti systémového panelu</translation> </message> <message> - <source>Minimize window at application startup</source> - <translation>Spouštět aplikaci s minimalizovaným oknem</translation> + <source>Dark system tray icon</source> + <translation type="unfinished"/> </message> <message> - <source>Basic Settings</source> - <translation>Základní nastavení</translation> - </message> - <message> - <source>Remember last key files and security dongles</source> - <translation>Pamatovat si minule použité soubory s klíči a zabezpečovací klíčenky</translation> - </message> - <message> - <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> - <translation>Neoznačovat databázi jako upravenou při změnách, nepostihujících údaje (např. rozšíření skupin)</translation> + <source>Language</source> + <translation>Jazyk</translation> </message> <message> <source>Auto-Type</source> <translation>Automatické vyplňování</translation> </message> <message> - <source>Use entry title and URL to match windows for global Auto-Type</source> - <translation>Použít titulek záznamu a URL adresu pro hledání shod s okny pro globální automatické vyplňování</translation> + <source>Use entry title to match windows for global Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use entry URL to match windows for global Auto-Type</source> + <translation type="unfinished"/> </message> <message> <source>Always ask before performing Auto-Type</source> <translation>Vždy se zeptat před provedením automatického vyplnění</translation> </message> + <message> + <source>Global Auto-Type shortcut</source> + <translation>Klávesová zkratka pro všeobecné automatické vyplňování</translation> + </message> <message> <source>Auto-Type delay</source> <translation>Prodleva automatického vyplnění</translation> </message> <message> <source> ms</source> + <comment>Milliseconds</comment> <translation> ms</translation> </message> - <message> - <source>Start only a single instance of KeePassXC</source> - <translation>Spouštět pouze jedinou instanci KeePassXC</translation> - </message> </context> <context> <name>SettingsWidgetSecurity</name> + <message> + <source>Timeouts</source> + <translation>Časové limity</translation> + </message> <message> <source>Clear clipboard after</source> <translation>Vymazat obsah schránky po uplynutí</translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation>sek.</translation> </message> <message> @@ -2187,8 +3659,12 @@ neopakující se název pro identifikaci a potvrďte ho.</translation> <translation>Uzamknout databázi při nečinnosti delší než</translation> </message> <message> - <source>Show passwords in cleartext by default</source> - <translation>Hesla vždy viditelná (nezakrývat hvězdičkami)</translation> + <source>Convenience</source> + <translation>Pohodlí</translation> + </message> + <message> + <source>Lock databases when session is locked or lid is closed</source> + <translation>Zamknout databáze když je zamčena relace nebo je zavřeno víko notebooku</translation> </message> <message> <source>Lock databases after minimizing the window</source> @@ -2199,16 +3675,16 @@ neopakující se název pro identifikaci a potvrďte ho.</translation> <translation>Pokud je viditelné, nevyžadovat zopakování zadání hesla</translation> </message> <message> - <source>Timeouts</source> - <translation>Časové limity</translation> + <source>Show passwords in cleartext by default</source> + <translation>Hesla vždy viditelná (nezakrývat hvězdičkami)</translation> </message> <message> - <source>Convenience</source> - <translation>Pohodlí</translation> + <source>Hide passwords in the preview panel</source> + <translation type="unfinished"/> </message> <message> - <source>Lock databases when session is locked or lid is closed</source> - <translation>Zamknout databáze když je zamčena relace nebo je zavřeno víko notebooku</translation> + <source>Hide entry notes by default</source> + <translation type="unfinished"/> </message> <message> <source>Privacy</source> @@ -2229,6 +3705,14 @@ neopakující se název pro identifikaci a potvrďte ho.</translation> <source>Key:</source> <translation>Klíč:</translation> </message> + <message> + <source>Default RFC 6238 token settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Steam token settings</source> + <translation type="unfinished"/> + </message> <message> <source>Use custom settings</source> <translation>Použít vlastní nastavení</translation> @@ -2255,6 +3739,7 @@ neopakující se název pro identifikaci a potvrďte ho.</translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation>sek.</translation> </message> </context> @@ -2321,6 +3806,26 @@ neopakující se název pro identifikaci a potvrďte ho.</translation> </context> <context> <name>main</name> + <message> + <source>Remove an entry from the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>Umístění databáze.</translation> + </message> + <message> + <source>Path of the entry to remove.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation>KeePassXC – aplikace pro správu hesel, fungující na vícero operačních systémech</translation> + </message> + <message> + <source>filenames of the password databases to open (*.kdbx)</source> + <translation>soubory s databázemi hesel k otevření (*.kdbx)</translation> + </message> <message> <source>path to a custom config file</source> <translation>umístění vlastního souboru s nastaveními</translation> @@ -2329,81 +3834,13 @@ neopakující se název pro identifikaci a potvrďte ho.</translation> <source>key file of the database</source> <translation>soubor s klíčem k databázi</translation> </message> - <message> - <source>KeePassXC - cross-platform password manager</source> - <translation>KeePassXC – aplikace pro správu hesel, fungující na vícero operačních systémech</translation> - </message> <message> <source>read password of the database from stdin</source> <translation>načíst heslo k databázi ze standardního vstupu</translation> </message> <message> - <source>filenames of the password databases to open (*.kdbx)</source> - <translation>soubory s databázemi hesel k otevření (*.kdbx)</translation> - </message> - <message> - <source>Copy a password to the clipboard</source> - <translation>Zkopírovat heslo do schránky</translation> - </message> - <message> - <source>Path of the database.</source> - <translation>Umístění databáze.</translation> - </message> - <message> - <source>Use a GUI prompt unlocking the database.</source> - <translation>Použít grafickou výzvu pro odemykání databáze.</translation> - </message> - <message> - <source>Name of the entry to clip.</source> - <translation>Název záznamu který oříznout.</translation> - </message> - <message> - <source>Extract and print the content of a database.</source> - <translation>Vytáhnout a vypsat obsah databáze.</translation> - </message> - <message> - <source>Path of the database to extract.</source> - <translation>Umístění extrahované databáze.</translation> - </message> - <message> - <source>Name of the command to execute.</source> - <translation>Název příkazu ke spuštění.</translation> - </message> - <message> - <source>List database entries.</source> - <translation>Vypsat položky databáze.</translation> - </message> - <message> - <source>Path of the group to list. Default is /</source> - <translation>Umístění seznamu skupin. Výchozí je /</translation> - </message> - <message> - <source>Print the UUIDs of the entries and groups.</source> - <translation>Vypsat univerzálně jedinečné identifikátory záznamů a skupin.</translation> - </message> - <message> - <source>Merge two databases.</source> - <translation>Sloučit dvě databáze.</translation> - </message> - <message> - <source>Path of the database to merge into.</source> - <translation>Umístění sloučené databáze.</translation> - </message> - <message> - <source>Path of the database to merge from.</source> - <translation>Umístění výchozí databáze.</translation> - </message> - <message> - <source>Use the same password for both database files.</source> - <translation>Pro oba databázové soubory použít shodné heslo.</translation> - </message> - <message> - <source>Show a password.</source> - <translation>Zobrazit heslo.</translation> - </message> - <message> - <source>Name of the entry to show.</source> - <translation>Název položky k zobrazení.</translation> + <source>Parent window handle</source> + <translation type="unfinished"/> </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_de.ts b/share/translations/keepassx_de.ts index f3bd0e39f..0351d9e4b 100644 --- a/share/translations/keepassx_de.ts +++ b/share/translations/keepassx_de.ts @@ -9,14 +9,34 @@ <source>About</source> <translation>Über</translation> </message> + <message> + <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> + <translation>Melden Sie Bugs auf: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> + </message> + <message> + <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>KeePassXC wird unter den Bedingungen der GNU General Public License (GPL) Version 2 oder Version 3 (je nach Ihrer Auswahl) vertrieben.</translation> + </message> + <message> + <source>Project Maintainers:</source> + <translation>Projekt-Maintainer:</translation> + </message> <message> <source>Contributors</source> <translation>Mitwirkende</translation> </message> + <message> + <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Mitwirkende auf GitHub</a></translation> + </message> <message> <source>Debug Info</source> <translation>Debug-Info</translation> </message> + <message> + <source>Include the following information whenever you report a bug:</source> + <translation>Geben Sie folgende Informationen an, wenn Sie einen Bug melden:</translation> + </message> <message> <source>Copy to clipboard</source> <translation>In Zwischenablage kopieren</translation> @@ -31,6 +51,10 @@ <source>Revision: %1</source> <translation>Revision: %1</translation> </message> + <message> + <source>Distribution: %1</source> + <translation>Distribution: %1</translation> + </message> <message> <source>Libraries:</source> <translation>Bibliotheken:</translation> @@ -47,33 +71,13 @@ Kernel: %3 %4</translation> <source>Enabled extensions:</source> <translation>Aktivierte Erweiterungen:</translation> </message> - <message> - <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> - <translation>Melden Sie Bugs auf: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> - </message> - <message> - <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassXC wird unter den Bedingungen der GNU General Public License (GPL) Version 2 oder Version 3 (je nach Ihrer Auswahl) vertrieben.</translation> - </message> - <message> - <source>Project Maintainers:</source> - <translation>Projekt-Maintainer:</translation> - </message> - <message> - <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Mitwirkende auf GitHub</a></translation> - </message> - <message> - <source>Include the following information whenever you report a bug:</source> - <translation>Geben Sie folgende Informationen an, wenn Sie einen Bug melden:</translation> - </message> - <message> - <source>Distribution: %1</source> - <translation>Distribution: %1</translation> - </message> </context> <context> <name>AccessControlDialog</name> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>KeePassXC HTTP Zugriff bestätigen</translation> + </message> <message> <source>Remember this decision</source> <translation>Diese Entscheidung merken</translation> @@ -92,9 +96,12 @@ Please select whether you want to allow access.</source> <translation>%1 hat Zugriff auf Passwörter für folgende Element(e) angefordert. Bitte wählen Sie, ob Sie den Zugriff erlauben möchten.</translation> </message> +</context> +<context> + <name>AgentSettingsWidget</name> <message> - <source>KeePassXC HTTP Confirm Access</source> - <translation>KeePassXC HTTP Zugriff bestätigen</translation> + <source>Enable SSH Agent (requires restart)</source> + <translation>SSH Agent aktivieren (Neustart erforderlich)</translation> </message> </context> <context> @@ -107,6 +114,26 @@ Bitte wählen Sie, ob Sie den Zugriff erlauben möchten.</translation> <source>Auto-Type - KeePassXC</source> <translation>Auto-Type - KeePassXC</translation> </message> + <message> + <source>Auto-Type</source> + <translation>Auto-Type</translation> + </message> + <message> + <source>The Syntax of your Auto-Type statement is incorrect!</source> + <translation>Die Syntax Ihres Auto-Type-Befehls ist inkorrekt!</translation> + </message> + <message> + <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> + <translation>Dieses Auto-Type-Kommando enthält eine sehr lange Verzögerung. Möchten Sie wirklich fortfahren?</translation> + </message> + <message> + <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> + <translation>Dieses Auto-Type-Kommando enthält sehr langsame Tastendrücke. Möchten Sie wirklich fortfahren?</translation> + </message> + <message> + <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> + <translation>Dieses Auto-Type-Kommando enthält Argumente, die sehr häufig wiederholt werden. Möchten Sie wirklich fortfahren?</translation> + </message> </context> <context> <name>AutoTypeAssociationsModel</name> @@ -125,13 +152,294 @@ Bitte wählen Sie, ob Sie den Zugriff erlauben möchten.</translation> </context> <context> <name>AutoTypeSelectDialog</name> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>Auto-Type - KeePassXC</translation> + </message> <message> <source>Select entry to Auto-Type:</source> <translation>Wählen Sie einen Eintrag für Auto-Type:</translation> </message> +</context> +<context> + <name>BrowserAccessControlDialog</name> <message> - <source>Auto-Type - KeePassXC</source> - <translation>Auto-Type - KeePassXC</translation> + <source>KeePassXC-Browser Confirm Access</source> + <translation>KeePassXC-Browser: Zugriff bestätigen</translation> + </message> + <message> + <source>Remember this decision</source> + <translation>Diese Entscheidung merken</translation> + </message> + <message> + <source>Allow</source> + <translation>Erlauben</translation> + </message> + <message> + <source>Deny</source> + <translation>Ablehnen</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 hat Zugriff auf Passwörter für folgende Element(e) angefordert. +Bitte wählen Sie, ob Sie den Zugriff erlauben möchten.</translation> + </message> +</context> +<context> + <name>BrowserOptionDialog</name> + <message> + <source>Dialog</source> + <translation>Dialog</translation> + </message> + <message> + <source>This is required for accessing your databases with KeePassXC-Browser</source> + <translation>Dies ist notwendig, um mit KeePassXC-Browser auf Ihre Datenbank zuzugreifen</translation> + </message> + <message> + <source>Enable KeepassXC browser integration</source> + <translation>KeePassXC-Browser-Integration aktivieren</translation> + </message> + <message> + <source>General</source> + <translation>Allgemein</translation> + </message> + <message> + <source>Enable integration for these browsers:</source> + <translation>Integration für diese Browser aktivieren:</translation> + </message> + <message> + <source>&Google Chrome</source> + <translation>&Google Chrome</translation> + </message> + <message> + <source>&Firefox</source> + <translation>&Firefox</translation> + </message> + <message> + <source>&Chromium</source> + <translation>&Chromium</translation> + </message> + <message> + <source>&Vivaldi</source> + <translation>&Vivaldi</translation> + </message> + <message> + <source>Show a &notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Be&nachrichtigung anzeigen, wenn Anmeldedaten angefragt werden.</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Verlange Entsperrung, wenn die Datenbank gesperrt ist.</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> + <translation>Nur Einträge mit dem gleichen Schema (http://, https://, …) werden zurückgeliefert.</translation> + </message> + <message> + <source>&Match URL scheme (e.g., https://...)</source> + <translation>URL-Sche&ma abgleichen (z.B. https://…)</translation> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>Zeige nur die am besten passenden Einträge für eine URL anstatt aller Einträge der ganzen Domäne.</translation> + </message> + <message> + <source>&Return only best-matching credentials</source> + <translation>Nur am &besten passende Anmeldedaten zurückliefern</translation> + </message> + <message> + <source>Sort &matching credentials by title</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Passende Anmeldedaten nach &Titel sortieren</translation> + </message> + <message> + <source>Sort matching credentials by &username</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Passende Anmeldedaten nach &Nutzername sortieren</translation> + </message> + <message> + <source>&Disconnect all browsers</source> + <translation>Alle Browser &abmelden</translation> + </message> + <message> + <source>Forget all remembered &permissions</source> + <translation>Alle gemerkten Berechtigungen &vergessen</translation> + </message> + <message> + <source>Advanced</source> + <translation>Fortgeschritten</translation> + </message> + <message> + <source>Never &ask before accessing credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Niemals &fragen, bevor auf Anmeldedaten zugegriffen wird</translation> + </message> + <message> + <source>Never ask before &updating credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Niemals fragen, bevor Anmeldedaten a&ktualisiert werden.</translation> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>Nur die ausgewählte Datenbank muss mit dem Client verbunden sein.</translation> + </message> + <message> + <source>Searc&h in all opened databases for matching credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Suc&he in allen geöffneten Datenbanken nach passenden Anmeldedaten</translation> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>Automatisches Erstellen und Aktualisieren von erweiterten Attributen wird nicht unterstützt!</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>Zeige auch erweiterte Attribute, welche mit "KPH: " beginnen</translation> + </message> + <message> + <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> + <translation>Aktualisiert den KeePassXC- oder KeePassXC-Proxy-Pfad automatisch in den Native-Messaging-Skripts beim Start.</translation> + </message> + <message> + <source>Update &native messaging manifest files at startup</source> + <translation>Native-Messaging-Manifeste beim Start aktualisieren</translation> + </message> + <message> + <source>Support a proxy application between KeePassXC and browser extension.</source> + <translation>Proxy-Anwendung zwischen KeePassXC und Browser-Erweiterung unterstützen</translation> + </message> + <message> + <source>Use a &proxy application between KeePassXC and browser extension</source> + <translation>Verwende eine &Proxy-Anwendungen zwischen KeePassXC und Browser-Erweiterung</translation> + </message> + <message> + <source>Use a custom proxy location if you installed a proxy manually.</source> + <translation>Verwende benutzerdefinierten Proxy-Pfad, falls Proxy manuell installiert wurde.</translation> + </message> + <message> + <source>Use a &custom proxy location</source> + <comment>Meant is the proxy for KeePassXC-Browser</comment> + <translation>Verwende &benutzerdefinierten Proxy-Pfad</translation> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Durchsuchen...</translation> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation><b>Warnung:</b> Die folgenden Optionen können gefährlich sein!</translation> + </message> + <message> + <source>Executable Files (*.exe);;All Files (*.*)</source> + <translation>Ausführbare Dateien (*.exe);;Alle Dateien (*.*)</translation> + </message> + <message> + <source>Executable Files (*)</source> + <translation>Ausführbare Dateien (*)</translation> + </message> + <message> + <source>Select custom proxy location</source> + <translation>Benutzerdefinierten Proxy-Pfad auswählen</translation> + </message> +</context> +<context> + <name>BrowserService</name> + <message> + <source>KeePassXC: New key association request</source> + <translation>KeePassXC: Neue Schlüsselverbindungsanfrage</translation> + </message> + <message> + <source>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</source> + <translation>Sie haben eine neue Verbindungsanfrage für den obigen Schlüssel. + +Wenn Sie Zugriff auf Ihre KeePassXC-Datenbank zulassen wollen, +vergeben Sie bitte einen eindeutigen Namen und akzeptieren diese.</translation> + </message> + <message> + <source>Save and allow access</source> + <translation>Speichern und Zugriff erlauben</translation> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: Bestehenden Schlüssel überschreiben?</translation> + </message> + <message> + <source>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>Ein geteilter Schlüssel mit dem Namen „%1“ existiert bereits. +Möchten Sie diesen überschreiben?</translation> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: Eintrag aktualisiert</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Möchten Sie wirklich die Informationen in %1 - %2 aktualisieren?</translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: Datenbank gesperrt!</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>Die aktive Datenbank ist gesperrt! +Bitte entsperren Sie die ausgewählte Datenbank oder wählen Sie eine andere, die entsperrt ist.</translation> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: Einstellung nicht verfügbar!</translation> + </message> + <message> + <source>The active database does not contain a settings entry.</source> + <translation>Die aktive Datenbank enthält keinen Einstellungseintrag.</translation> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: Kein Schlüssel gefunden</translation> + </message> + <message> + <source>No shared encryption keys found in KeePassXC Settings.</source> + <translation>Kein geteilter Schlüssel in den KeePassXC-Einstellungen gefunden.</translation> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: Schlüssel aus der Datenbank entfernt</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> + <translation><numerusform>Es wurde erfolgreich %n Schlüssel aus den KeePassXC-Einstellungen entfernt.</numerusform><numerusform>Es wurden erfolgreich %n Schlüssel aus den KeePassXC-Einstellungen entfernt.</numerusform></translation> + </message> + <message> + <source>Removing stored permissions…</source> + <translation>Entferne gespeicherte Berechtigungen...</translation> + </message> + <message> + <source>Abort</source> + <translation>Abbrechen</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: Zugangsdaten entfernt</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entry(s).</source> + <translation><numerusform>Gespeicherte Berechtigungen wurden erfolgreich aus %n Eintrag entfernt.</numerusform><numerusform>Gespeicherte Berechtigungen wurden erfolgreich aus %n Einträgen entfernt.</numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation>KeePassXC: Kein Eintrag mit Zugangsdaten gefunden!</translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>The aktive Datenbank enthält keinen Eintrag mit Zugangsdaten.</translation> </message> </context> <context> @@ -148,6 +456,10 @@ Bitte wählen Sie, ob Sie den Zugriff erlauben möchten.</translation> <source>Repeat password:</source> <translation>Passwort wiederholen:</translation> </message> + <message> + <source>&Key file</source> + <translation>&Schlüsseldatei</translation> + </message> <message> <source>Browse</source> <translation>Durchsuchen</translation> @@ -156,6 +468,14 @@ Bitte wählen Sie, ob Sie den Zugriff erlauben möchten.</translation> <source>Create</source> <translation>Erstellen</translation> </message> + <message> + <source>Cha&llenge Response</source> + <translation>Cha&llenge-Response</translation> + </message> + <message> + <source>Refresh</source> + <translation>Neu laden</translation> + </message> <message> <source>Key files</source> <translation>Schlüsseldateien</translation> @@ -176,6 +496,10 @@ Bitte wählen Sie, ob Sie den Zugriff erlauben möchten.</translation> <source>Select a key file</source> <translation>Schlüsseldatei auswählen</translation> </message> + <message> + <source>Empty password</source> + <translation>Leeres Passwort</translation> + </message> <message> <source>Do you really want to use an empty string as password?</source> <translation>Wollen Sie wirklich eine leere Zeichenkette als Passwort verwenden?</translation> @@ -190,24 +514,21 @@ Bitte wählen Sie, ob Sie den Zugriff erlauben möchten.</translation> <translation>Festlegen von %1 als Schlüsseldatei nicht möglich: %2</translation> </message> <message> - <source>&Key file</source> - <translation>&Schlüsseldatei</translation> + <source>Legacy key file format</source> + <translation>Veraltetes Schlüsseldatei-Format</translation> </message> <message> - <source>Cha&llenge Response</source> - <translation>Cha&llenge-Response</translation> - </message> - <message> - <source>Refresh</source> - <translation>Neu laden</translation> - </message> - <message> - <source>Empty password</source> - <translation>Leeres Passwort</translation> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation>Sie verwenden ein veraltetes Schlüsseldatei-Format, welches in Zukunft evtl. nicht mehr unterstützt wird. + +Bitte denken Sie darüber nach, eine neue Schlüsseldatei zu generieren.</translation> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> - <translation>Ändern des Hauptschlüssels fehlgeschlagen: kein YubiKey eingesteckt.</translation> + <translation>Ändern des Master-Passworts fehlgeschlagen: kein YubiKey eingesteckt.</translation> </message> </context> <context> @@ -216,6 +537,10 @@ Bitte wählen Sie, ob Sie den Zugriff erlauben möchten.</translation> <source>Clone Options</source> <translation>Klon-Optionen</translation> </message> + <message> + <source>Append ' - Clone' to title</source> + <translation>„ - Klon“ zum Titel hinzufügen</translation> + </message> <message> <source>Replace username and password with references</source> <translation>Benutzernamen und Passwort mit Referencen ersetzen</translation> @@ -224,10 +549,6 @@ Bitte wählen Sie, ob Sie den Zugriff erlauben möchten.</translation> <source>Copy history</source> <translation>Verlauf kopieren</translation> </message> - <message> - <source>Append ' - Clone' to title</source> - <translation>„ - Klon“ zum Titel hinzufügen</translation> - </message> </context> <context> <name>CsvImportWidget</name> @@ -323,39 +644,35 @@ Bitte wählen Sie, ob Sie den Zugriff erlauben möchten.</translation> </context> <context> <name>CsvImportWizard</name> - <message> - <source>Import CSV file</source> - <translation>CSV-Datei importieren</translation> - </message> <message> <source>Error</source> <translation>Fehler</translation> </message> <message> <source>Unable to calculate master key</source> - <translation>Berechnung des Hauptschlüssels gescheitert</translation> + <translation>Berechnung des Master-Passworts gescheitert</translation> </message> </context> <context> <name>CsvParserModel</name> - <message> - <source> byte, </source> - <translation>Byte,</translation> + <message numerus="yes"> + <source>%n byte(s), </source> + <translation><numerusform>%n Byte</numerusform><numerusform>%n Bytes</numerusform></translation> </message> - <message> - <source> rows, </source> - <translation>Zeilen,</translation> + <message numerus="yes"> + <source>%n row(s), </source> + <translation><numerusform>%n Zeile,</numerusform><numerusform>%n Zeilen,</numerusform></translation> </message> - <message> - <source> columns</source> - <translation>Spalten</translation> + <message numerus="yes"> + <source>%n column(s)</source> + <translation><numerusform>%n Spalte</numerusform><numerusform>%n Spalten</numerusform></translation> </message> </context> <context> <name>DatabaseOpenWidget</name> <message> <source>Enter master key</source> - <translation>Hauptschlüssel eingeben</translation> + <translation>Master-Passwort eingeben</translation> </message> <message> <source>Key File:</source> @@ -369,14 +686,39 @@ Bitte wählen Sie, ob Sie den Zugriff erlauben möchten.</translation> <source>Browse</source> <translation>Durchsuchen</translation> </message> + <message> + <source>Refresh</source> + <translation>Neu laden</translation> + </message> + <message> + <source>Challenge Response:</source> + <translation>Challenge-Response</translation> + </message> <message> <source>Unable to open the database.</source> - <translation>Öffnen der Datenbank nicht möglich.</translation> + <translation>Öffnen der Datenbank ist nicht möglich.</translation> </message> <message> <source>Can't open key file</source> <translation>Schlüsseldatei kann nicht geöffnet werden</translation> </message> + <message> + <source>Legacy key file format</source> + <translation>Veraltetes Schlüsseldatei-Format</translation> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation>Sie verwenden ein veraltetes Schlüsseldatei-Format, welches in Zukunft evtl. nicht mehr unterstützt wird. + +Bitte denken Sie darüber nach, eine neue Schlüsseldatei zu generieren.</translation> + </message> + <message> + <source>Don't show this warning again</source> + <translation>Diese Warnungen nicht wieder anzeigen</translation> + </message> <message> <source>All files</source> <translation>Alle Dateien</translation> @@ -389,14 +731,6 @@ Bitte wählen Sie, ob Sie den Zugriff erlauben möchten.</translation> <source>Select key file</source> <translation>Schlüsseldatei auswählen</translation> </message> - <message> - <source>Refresh</source> - <translation>Neu laden</translation> - </message> - <message> - <source>Challenge Response:</source> - <translation>Challenge-Response</translation> - </message> </context> <context> <name>DatabaseRepairWidget</name> @@ -413,12 +747,12 @@ Bitte wählen Sie, ob Sie den Zugriff erlauben möchten.</translation> <translation>Schlüsseldatei kann nicht geöffnet werden</translation> </message> <message> - <source>Database opened fine. Nothing to do.</source> - <translation>Datenbank wurde ordnungsgemäß geöffnet. Es gibt nichts zu tun.</translation> + <source>Unable to open the database.</source> + <translation>Öffnen der Datenbank ist nicht möglich.</translation> </message> <message> - <source>Unable to open the database.</source> - <translation>Öffnen der Datenbank nicht möglich.</translation> + <source>Database opened fine. Nothing to do.</source> + <translation>Datenbank wurde ordnungsgemäß geöffnet. Es gibt nichts zu tun.</translation> </message> <message> <source>Success</source> @@ -438,40 +772,61 @@ sie kann nun gespeichert werden.</translation> <context> <name>DatabaseSettingsWidget</name> <message> - <source>Database name:</source> - <translation>Datenbankname:</translation> + <source>General</source> + <translation>Allgemein</translation> </message> <message> - <source>Database description:</source> - <translation>Datenbankbeschreibung:</translation> + <source>Encryption</source> + <translation>Verschlüsselung</translation> </message> <message> - <source>Transform rounds:</source> - <translation>Verschlüsselungsdurchläufe:</translation> + <source>Number of rounds too high</source> + <comment>Key transformation rounds</comment> + <translation>Anzahl Runden zu hoch</translation> </message> <message> - <source>Default username:</source> - <translation>Standardbenutzername:</translation> + <source>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</source> + <translation>Sie verwenden eine sehr hohe Rundenanzahl mit Argon2. + +Wenn Sie diese Anzahl beibehalten, könnte Ihre Datenbank Stunden oder Tage (oder noch länger) zum Öffnen benötigen.</translation> </message> <message> - <source> MiB</source> - <translation> MiB</translation> + <source>Understood, keep number</source> + <translation>Verstanden, Anzahl beibehalten</translation> </message> <message> - <source>Benchmark</source> - <translation>Benchmark</translation> + <source>Cancel</source> + <translation>Abbrechen</translation> </message> <message> - <source>Max. history items:</source> - <translation>Max. Einträge im Verlauf:</translation> + <source>Number of rounds too low</source> + <comment>Key transformation rounds</comment> + <translation>Anzahl Runden zu niedrig</translation> </message> <message> - <source>Max. history size:</source> - <translation>Max. Verlaufsgröße:</translation> + <source>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</source> + <translation>Sie verwenden eine sehr niedrige Rundenanzahl mit AES-KDF. + +Wenn Sie diese Anzahl beibehalten, könnte Ihre Datenbank zu einfach zu knacken sein!</translation> </message> <message> - <source>Use recycle bin</source> - <translation>Papierkorb verwenden</translation> + <source>KDF unchanged</source> + <translation>KDF unverändert</translation> + </message> + <message> + <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> + <translation>Konnte Schlüssel nicht mit den neuen KDF-Parametern transformieren; KDF unverändert.</translation> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetEncryption</name> + <message> + <source>Encryption Algorithm:</source> + <translation>Verschlüsselungs-Algorithmus.</translation> </message> <message> <source>AES: 256 Bit (default)</source> @@ -482,14 +837,78 @@ sie kann nun gespeichert werden.</translation> <translation>Twofish: 256 Bit</translation> </message> <message> - <source>Algorithm:</source> - <translation>Algorithmus:</translation> + <source>Key Derivation Function:</source> + <translation>Schlüssel-Ableitungsfunktion</translation> + </message> + <message> + <source>Transform rounds:</source> + <translation>Verschlüsselungsdurchläufe:</translation> + </message> + <message> + <source>Benchmark 1-second delay</source> + <translation>1-Sekunden-Verzögerung messen</translation> + </message> + <message> + <source>Memory Usage:</source> + <translation>Speicher-Verbrauch</translation> + </message> + <message> + <source> MB</source> + <translation>MB</translation> + </message> + <message> + <source>Parallelism:</source> + <translation>Parallelität:</translation> + </message> + <message> + <source> thread</source> + <translation>Thread</translation> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetGeneral</name> + <message> + <source>Database Meta Data</source> + <translation>Datenbank-Metadaten</translation> + </message> + <message> + <source>Database name:</source> + <translation>Datenbankname:</translation> + </message> + <message> + <source>Database description:</source> + <translation>Datenbankbeschreibung:</translation> + </message> + <message> + <source>Default username:</source> + <translation>Standardbenutzername:</translation> + </message> + <message> + <source>History Settings</source> + <translation>Verlaufseinstellungen</translation> + </message> + <message> + <source>Max. history items:</source> + <translation>Max. Einträge im Verlauf:</translation> + </message> + <message> + <source>Max. history size:</source> + <translation>Max. Verlaufsgröße:</translation> + </message> + <message> + <source> MiB</source> + <translation> MiB</translation> + </message> + <message> + <source>Use recycle bin</source> + <translation>Papierkorb verwenden</translation> </message> </context> <context> <name>DatabaseTabWidget</name> <message> <source>Root</source> + <comment>Root group</comment> <translation>Root</translation> </message> <message> @@ -509,21 +928,47 @@ sie kann nun gespeichert werden.</translation> <translation>Datei nicht gefunden!</translation> </message> <message> - <source>Open KeePass 1 database</source> - <translation>KeePass 1 Datenbank öffnen</translation> + <source>Unable to open the database.</source> + <translation>Öffnen der Datenbank ist nicht möglich.</translation> </message> <message> - <source>KeePass 1 database</source> - <translation>KeePass 1 Datenbank</translation> + <source>File opened in read only mode.</source> + <translation>Datei ist schreibgeschützt</translation> + </message> + <message> + <source>Open CSV file</source> + <translation>CSV-Datei öffnen</translation> + </message> + <message> + <source>CSV file</source> + <translation>CSV-Datei</translation> </message> <message> <source>All files (*)</source> <translation>Alle Dateien (*)</translation> </message> + <message> + <source>Merge database</source> + <translation>Datenbank zusammenführen</translation> + </message> + <message> + <source>Open KeePass 1 database</source> + <translation>KeePass 1-Datenbank öffnen</translation> + </message> + <message> + <source>KeePass 1 database</source> + <translation>KeePass 1-Datenbank</translation> + </message> <message> <source>Close?</source> <translation>Schließen?</translation> </message> + <message> + <source>"%1" is in edit mode. +Discard changes and close anyway?</source> + <translation>"%1" wird bearbeitet. +Änderungen verwerfen und trotzdem schließen?</translation> + </message> <message> <source>Save changes?</source> <translation>Änderungen speichern?</translation> @@ -538,9 +983,21 @@ Save changes?</source> <source>Writing the database failed.</source> <translation>Schreiben der Datenbank fehlgeschlagen.</translation> </message> + <message> + <source>Passwords</source> + <translation>Passwörter</translation> + </message> <message> <source>Save database as</source> - <translation>Datenbank speichern unter</translation> + <translation>Datenbank speichern als</translation> + </message> + <message> + <source>Export database to CSV file</source> + <translation>Datenbank als CSV-Datei exportieren.</translation> + </message> + <message> + <source>Writing the CSV file failed.</source> + <translation>Die CSV Datei konnte nicht gespeichert werden.</translation> </message> <message> <source>New database</source> @@ -559,12 +1016,6 @@ Save changes?</source> Please press cancel to finish your changes or discard them.</source> <translation>Datenbank kann nicht gesperrt werden, da sie gerade bearbeitet wird. Wählen sie „Abbrechen“, um die Änderungen zu speichern oder sie zurückzunehmen.</translation> - </message> - <message> - <source>This database has never been saved. -You can save the database or stop locking it.</source> - <translation>Diese Datenbank wurde noch nicht gespeichert. -Sie können sie speichern oder die Sperre freigeben.</translation> </message> <message> <source>This database has been modified. @@ -574,72 +1025,16 @@ Otherwise your changes are lost.</source> Soll sie gespeichert werden bevor sie gesperrt wird? Anderenfalls gehen Ihre Änderungen verloren.</translation> </message> - <message> - <source>"%1" is in edit mode. -Discard changes and close anyway?</source> - <translation>"%1" wird bearbeitet. -Änderungen verwerfen und trotzdem schließen?</translation> - </message> - <message> - <source>Export database to CSV file</source> - <translation>Datenbank als CSV-Datei exportieren.</translation> - </message> - <message> - <source>CSV file</source> - <translation>CSV-Datei</translation> - </message> - <message> - <source>Writing the CSV file failed.</source> - <translation>Die CSV Datei konnte nicht gespeichert werden.</translation> - </message> - <message> - <source>Unable to open the database.</source> - <translation>Öffnen der Datenbank ist nicht möglich.</translation> - </message> - <message> - <source>Merge database</source> - <translation>Datenbank zusammenführen</translation> - </message> - <message> - <source>The database you are trying to save as is locked by another instance of KeePassXC. -Do you want to save it anyway?</source> - <translation>Die Datenbank, die gespeichert werden soll, wird von einer anderen KeePassXC-Instanz verwendet. -Soll sie dennoch gespeichert werden? </translation> - </message> - <message> - <source>Passwords</source> - <translation>Passwörter</translation> - </message> - <message> - <source>Database already opened</source> - <translation>Datenbank bereits geöffnet</translation> - </message> - <message> - <source>The database you are trying to open is locked by another instance of KeePassXC. - -Do you want to open it anyway?</source> - <translation>Die Datenbank, die Sie versuchen, zu öffnen, wird bereits von einer anderen KeePassXC-Instanz verwendet. - -Möchten Sie diese dennoch öffnen?</translation> - </message> - <message> - <source>Open read-only</source> - <translation>Schreibgeschützt öffnen</translation> - </message> - <message> - <source>File opened in read only mode.</source> - <translation>Datei ist schreibgeschützt</translation> - </message> - <message> - <source>Open CSV file</source> - <translation>CSV-Datei öffnen</translation> - </message> </context> <context> <name>DatabaseWidget</name> + <message> + <source>Searching...</source> + <translation>Suche…</translation> + </message> <message> <source>Change master key</source> - <translation>Hauptschlüssel ändern</translation> + <translation>Master-Passwort ändern</translation> </message> <message> <source>Delete entry?</source> @@ -657,13 +1052,33 @@ Möchten Sie diese dennoch öffnen?</translation> <source>Do you really want to delete %1 entries for good?</source> <translation>Wollen Sie die Einträge "%1" wirklich löschen?</translation> </message> + <message> + <source>Move entry to recycle bin?</source> + <translation>Eintrag in den Papierkorb verschieben?</translation> + </message> + <message> + <source>Do you really want to move entry "%1" to the recycle bin?</source> + <translation>Möchten Sie wirklich den Eintrag "%1" in den Papierkorb verschieben?</translation> + </message> <message> <source>Move entries to recycle bin?</source> <translation>Einträge in den Papierkorb verschieben?</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>Wollen Sie wirklich %n Eintrag in den Papierkorb verschieben?</numerusform><numerusform>Wollen Sie wirklich %n Einträge in den Papierkorb verschieben?</numerusform></translation> + <translation><numerusform>Möchten Sie wirklich %n Eintrag aus dem Papierkorb löschen?</numerusform><numerusform>Möchten Sie wirklich %n Einträge aus dem Papierkorb löschen?</numerusform></translation> + </message> + <message> + <source>Execute command?</source> + <translation>Befehl ausführen?</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation>Folgenden Befehl ausführen? <br><br>%1<br></translation> + </message> + <message> + <source>Remember my choice</source> + <translation>Meine Auswahl merken</translation> </message> <message> <source>Delete group?</source> @@ -675,19 +1090,7 @@ Möchten Sie diese dennoch öffnen?</translation> </message> <message> <source>Unable to calculate master key</source> - <translation>Berechnung des Hauptschlüssels gescheitert</translation> - </message> - <message> - <source>Move entry to recycle bin?</source> - <translation>Eintrag in den Papierkorb verschieben?</translation> - </message> - <message> - <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation>Möchten Sie wirklich den Eintrag "%1" in den Papierkorb verschieben?</translation> - </message> - <message> - <source>Searching...</source> - <translation>Suche…</translation> + <translation>Berechnung des Master-Passworts gescheitert</translation> </message> <message> <source>No current database.</source> @@ -706,20 +1109,8 @@ Möchten Sie diese dennoch öffnen?</translation> <translation>Keine Ergebnisse</translation> </message> <message> - <source>Execute command?</source> - <translation>Befehl ausführen?</translation> - </message> - <message> - <source>Do you really want to execute the following command?<br><br>%1<br></source> - <translation>Folgenden Befehl ausführen? <br><br>%1<br></translation> - </message> - <message> - <source>Remember my choice</source> - <translation>Meine Auswahl merken</translation> - </message> - <message> - <source>Autoreload Request</source> - <translation>Automatisches Neuladen angefordert</translation> + <source>File has changed</source> + <translation>Datei hat sich geändert</translation> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -730,8 +1121,10 @@ Möchten Sie diese dennoch öffnen?</translation> <translation>Zusammenführungsanfrage</translation> </message> <message> - <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> - <translation>Die Datenbankdatei wurde geändert und Sie haben noch nicht gespeicherte Änderungen. Wollen Sie Ihre Änderungen zusammenführen?</translation> + <source>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</source> + <translation>Die Datenbank wurde verändert und Sie haben nicht gespeicherte Änderungen. +Möchten Sie Ihre Änderungen zusammenführen?</translation> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -746,6 +1139,89 @@ Möchten Sie diese dennoch öffnen?</translation> <translation>Sind Sie sicher, dass Sie den Inhalt des Papierkorbs unwiederbringlich löschen wollen?</translation> </message> </context> +<context> + <name>DetailsWidget</name> + <message> + <source>Generate TOTP Token</source> + <translation>TOTP-Token generieren</translation> + </message> + <message> + <source>Close</source> + <translation>Schließen</translation> + </message> + <message> + <source>General</source> + <translation>Allgemein</translation> + </message> + <message> + <source>Password</source> + <translation>Passwort</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Expiration</source> + <translation>Ablaufdatum</translation> + </message> + <message> + <source>Username</source> + <translation>Benutzername</translation> + </message> + <message> + <source>Autotype</source> + <translation>Auto-Type</translation> + </message> + <message> + <source>Searching</source> + <translation>Suche</translation> + </message> + <message> + <source>Attributes</source> + <translation>Attribute</translation> + </message> + <message> + <source>Attachments</source> + <translation>Anhänge</translation> + </message> + <message> + <source>Notes</source> + <translation>Notizen</translation> + </message> + <message> + <source>Window</source> + <translation>Fenster</translation> + </message> + <message> + <source>Sequence</source> + <translation>Sequenz</translation> + </message> + <message> + <source>Search</source> + <translation>Suche</translation> + </message> + <message> + <source>Clear</source> + <translation>Löschen</translation> + </message> + <message> + <source>Never</source> + <translation>Niemals</translation> + </message> + <message> + <source>[PROTECTED]</source> + <translation>[GESCHÜTZT]</translation> + </message> + <message> + <source>Disabled</source> + <translation>Deaktiviert</translation> + </message> + <message> + <source>Enabled</source> + <translation>Aktiviert</translation> + </message> +</context> <context> <name>EditEntryWidget</name> <message> @@ -772,6 +1248,30 @@ Möchten Sie diese dennoch öffnen?</translation> <source>History</source> <translation>Verlauf</translation> </message> + <message> + <source>SSH Agent</source> + <translation>SSH-Agent</translation> + </message> + <message> + <source>n/a</source> + <translation>n. a.</translation> + </message> + <message> + <source>(encrypted)</source> + <translation>(verschlüsselt)</translation> + </message> + <message> + <source>Select private key</source> + <translation>Privatschlüssel auswählen</translation> + </message> + <message> + <source>File too large to be a private key</source> + <translation>Datei zu groß, um ein Privatschlüssel zu sein</translation> + </message> + <message> + <source>Failed to open private key</source> + <translation>Privatschlüsel konnte nicht geöffnet werden</translation> + </message> <message> <source>Entry history</source> <translation>Eintragsverlauf</translation> @@ -786,45 +1286,12 @@ Möchten Sie diese dennoch öffnen?</translation> </message> <message> <source>Different passwords supplied.</source> - <translation>Unterschiedliche Passwörter eingegeben.</translation> + <translation>Passwörter sind unterschiedlich</translation> </message> <message> <source>New attribute</source> <translation>Neue Eigenschaft</translation> </message> - <message> - <source>Select file</source> - <translation>Datei wählen</translation> - </message> - <message> - <source>Unable to open file</source> - <translation>Öffnen der Datei nicht möglich</translation> - </message> - <message> - <source>Save attachment</source> - <translation>Anhang speichern</translation> - </message> - <message> - <source>Unable to save the attachment: -</source> - <translation>Speichern des Anhangs nicht möglich:</translation> - </message> - <message> - <source>Tomorrow</source> - <translation>Morgen</translation> - </message> - <message numerus="yes"> - <source>%n week(s)</source> - <translation><numerusform>%n Woche</numerusform><numerusform>%n Woche(n)</numerusform></translation> - </message> - <message numerus="yes"> - <source>%n month(s)</source> - <translation><numerusform>%n Monat</numerusform><numerusform>%n Monat(en)</numerusform></translation> - </message> - <message> - <source>1 year</source> - <translation>1 Jahr</translation> - </message> <message> <source>Confirm Remove</source> <translation>Entfernen bestätigen</translation> @@ -834,12 +1301,28 @@ Möchten Sie diese dennoch öffnen?</translation> <translation>Sind Sie sicher, dass Sie dieses Attribut entfernen möchten?</translation> </message> <message> - <source>[PROTECTED] Press reveal to view or edit</source> - <translation>[GESCHÜTZT] Klicken Sie „Zeigen“ zum Anzeigen oder Bearbeiten</translation> + <source>[PROTECTED]</source> + <translation>[GESCHÜTZT]</translation> </message> <message> - <source>Are you sure you want to remove this attachment?</source> - <translation>Sind Sie sicher, dass Sie diesen Anhang löschen wollen?</translation> + <source>Press reveal to view or edit</source> + <translation>Klicken zum Anzeigen oder Bearbeiten</translation> + </message> + <message> + <source>Tomorrow</source> + <translation>Morgen</translation> + </message> + <message numerus="yes"> + <source>%n week(s)</source> + <translation><numerusform>%n Woche</numerusform><numerusform>%n Wochen</numerusform></translation> + </message> + <message numerus="yes"> + <source>%n month(s)</source> + <translation><numerusform>%n Monat</numerusform><numerusform>%n Monate</numerusform></translation> + </message> + <message> + <source>1 year</source> + <translation>1 Jahr</translation> </message> </context> <context> @@ -856,18 +1339,6 @@ Möchten Sie diese dennoch öffnen?</translation> <source>Remove</source> <translation>Entfernen</translation> </message> - <message> - <source>Attachments</source> - <translation>Anhänge</translation> - </message> - <message> - <source>Save</source> - <translation>Speichern</translation> - </message> - <message> - <source>Open</source> - <translation>Offen</translation> - </message> <message> <source>Edit Name</source> <translation>Namen bearbeiten</translation> @@ -880,6 +1351,10 @@ Möchten Sie diese dennoch öffnen?</translation> <source>Reveal</source> <translation>Zeigen</translation> </message> + <message> + <source>Attachments</source> + <translation>Anhänge</translation> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -887,6 +1362,18 @@ Möchten Sie diese dennoch öffnen?</translation> <source>Enable Auto-Type for this entry</source> <translation>Auto-Type für diesen Eintrag aktivieren</translation> </message> + <message> + <source>Inherit default Auto-Type sequence from the &group</source> + <translation>Standard-Auto-Type-Sequenz der &Gruppe erben</translation> + </message> + <message> + <source>&Use custom Auto-Type sequence:</source> + <translation>Ben&utzerdefinierte Auto-Type-Sequenz verwenden:</translation> + </message> + <message> + <source>Window Associations</source> + <translation>Fenster-Einstellungen</translation> + </message> <message> <source>+</source> <translation>+</translation> @@ -899,14 +1386,6 @@ Möchten Sie diese dennoch öffnen?</translation> <source>Window title:</source> <translation>Fenstertitel:</translation> </message> - <message> - <source>Inherit default Auto-Type sequence from the &group</source> - <translation>Standard-Auto-Type-Sequenz der &Gruppe erben</translation> - </message> - <message> - <source>&Use custom Auto-Type sequence:</source> - <translation>Ben&utzerdefinierte Auto-Type-Sequenz verwenden:</translation> - </message> <message> <source>Use default se&quence</source> <translation>Standardse&quenz verwenden</translation> @@ -915,10 +1394,6 @@ Möchten Sie diese dennoch öffnen?</translation> <source>Set custo&m sequence:</source> <translation>B&enutzerdefinierte Sequenz:</translation> </message> - <message> - <source>Window Associations</source> - <translation>Fenster-Einstellungen</translation> - </message> </context> <context> <name>EditEntryWidgetHistory</name> @@ -942,12 +1417,8 @@ Möchten Sie diese dennoch öffnen?</translation> <context> <name>EditEntryWidgetMain</name> <message> - <source>Title:</source> - <translation>Titel:</translation> - </message> - <message> - <source>Username:</source> - <translation>Benutzername:</translation> + <source>URL:</source> + <translation>URL:</translation> </message> <message> <source>Password:</source> @@ -958,20 +1429,104 @@ Möchten Sie diese dennoch öffnen?</translation> <translation>Wiederholen:</translation> </message> <message> - <source>URL:</source> - <translation>URL:</translation> + <source>Title:</source> + <translation>Titel:</translation> </message> <message> - <source>Expires</source> - <translation>Verfällt</translation> + <source>Notes</source> + <translation>Notizen</translation> </message> <message> <source>Presets</source> <translation>Vorgaben</translation> </message> <message> - <source>Notes:</source> - <translation>Notizen:</translation> + <source>Toggle the checkbox to reveal the notes section.</source> + <translation>Klicken Sie das Kontrollkästchen, um die Notizen anzuzeigen.</translation> + </message> + <message> + <source>Username:</source> + <translation>Benutzername:</translation> + </message> + <message> + <source>Expires</source> + <translation>Verfällt</translation> + </message> +</context> +<context> + <name>EditEntryWidgetSSHAgent</name> + <message> + <source>Form</source> + <translation>Formular</translation> + </message> + <message> + <source>Remove key from agent after</source> + <translation>Entferne Schlüssel vom Agenten nach</translation> + </message> + <message> + <source> seconds</source> + <translation>Sekunden</translation> + </message> + <message> + <source>Fingerprint</source> + <translation>Fingerabdruck</translation> + </message> + <message> + <source>Remove key from agent when database is closed/locked</source> + <translation>Entferne Key vom Agenten wenn Datenbank geschlossen wird</translation> + </message> + <message> + <source>Public key</source> + <translation>Öffentlicher Schlüssel</translation> + </message> + <message> + <source>Add key to agent when database is opened/unlocked</source> + <translation>Key zum Agenten hinzufügen, wenn Datenbank geöffnet / entsperrt wird</translation> + </message> + <message> + <source>Comment</source> + <translation>Kommentar</translation> + </message> + <message> + <source>Decrypt</source> + <translation>Entschlüsseln</translation> + </message> + <message> + <source>n/a</source> + <translation>n. a.</translation> + </message> + <message> + <source>Copy to clipboard</source> + <translation>In Zwischenablage kopieren</translation> + </message> + <message> + <source>Private key</source> + <translation>Privatschlüssel</translation> + </message> + <message> + <source>External file</source> + <translation>Externe Datei</translation> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Durchsuchen...</translation> + </message> + <message> + <source>Attachment</source> + <translation>Anhang</translation> + </message> + <message> + <source>Add to agent</source> + <translation>Zum Agent hinzufügen</translation> + </message> + <message> + <source>Remove from agent</source> + <translation>Aus Agent löschen</translation> + </message> + <message> + <source>Require user confirmation when this key is used</source> + <translation>Verlange Benutzer-Bestätigung, wenn Schlüssel verwendet wird.</translation> </message> </context> <context> @@ -1021,7 +1576,7 @@ Möchten Sie diese dennoch öffnen?</translation> </message> <message> <source>Expires</source> - <translation>Erlischt</translation> + <translation>Verfällt</translation> </message> <message> <source>Search</source> @@ -1042,6 +1597,14 @@ Möchten Sie diese dennoch öffnen?</translation> </context> <context> <name>EditWidgetIcons</name> + <message> + <source>&Use default icon</source> + <translation>&Standardsymbol verwenden</translation> + </message> + <message> + <source>Use custo&m icon</source> + <translation>B&enutzerdefiniertes Symbol verwenden</translation> + </message> <message> <source>Add custom icon</source> <translation>Eigenes Symbol hinzufügen</translation> @@ -1050,6 +1613,18 @@ Möchten Sie diese dennoch öffnen?</translation> <source>Delete custom icon</source> <translation>Eigenes Symbol löschen</translation> </message> + <message> + <source>Download favicon</source> + <translation>Favicon herunterladen</translation> + </message> + <message> + <source>Unable to fetch favicon.</source> + <translation>Abrufen des Favicons nicht möglich</translation> + </message> + <message> + <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> + <translation>Tipp: Sie können Google als Fallback festlegen unter Werkzeuge>Einstellungen>Sicherheit</translation> + </message> <message> <source>Images</source> <translation>Bilder</translation> @@ -1062,25 +1637,13 @@ Möchten Sie diese dennoch öffnen?</translation> <source>Select Image</source> <translation>Bild auswählen</translation> </message> - <message> - <source>Download favicon</source> - <translation>Favicon herunterladen</translation> - </message> - <message> - <source>Unable to fetch favicon.</source> - <translation>Abrufen des Favicons nicht möglich</translation> - </message> <message> <source>Can't read icon</source> <translation>Icon kann nicht gelesen werden</translation> </message> <message> - <source>&Use default icon</source> - <translation>&Standardsymbol verwenden</translation> - </message> - <message> - <source>Use custo&m icon</source> - <translation>B&enutzerdefiniertes Symbol verwenden</translation> + <source>Custom icon already exists</source> + <translation>Es gibt bereits ein eigenes Symbol </translation> </message> <message> <source>Confirm Delete</source> @@ -1090,14 +1653,6 @@ Möchten Sie diese dennoch öffnen?</translation> <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> <translation>Dieses Icon wird noch von %1 Einträgen verwendet und würde mit dem Standard-Icon ersetzt. Sind Sie sicher, dass die fortfahren wollen?</translation> </message> - <message> - <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation>Tipp: Sie können Google als Fallback festlegen unter Werkzeuge>Einstellungen>Sicherheit</translation> - </message> - <message> - <source>Custom icon already exists</source> - <translation>Es gibt bereits ein eigenes Symbol </translation> - </message> </context> <context> <name>EditWidgetProperties</name> @@ -1122,9 +1677,97 @@ Möchten Sie diese dennoch öffnen?</translation> <name>Entry</name> <message> <source> - Clone</source> + <comment>Suffix added to cloned entries</comment> <translation>- Klon</translation> </message> </context> +<context> + <name>EntryAttachmentsModel</name> + <message> + <source>Name</source> + <translation>Name</translation> + </message> + <message> + <source>Size</source> + <translation>Größe</translation> + </message> +</context> +<context> + <name>EntryAttachmentsWidget</name> + <message> + <source>Form</source> + <translation>Formular</translation> + </message> + <message> + <source>Add</source> + <translation>Hinzufügen</translation> + </message> + <message> + <source>Remove</source> + <translation>Entfernen</translation> + </message> + <message> + <source>Open</source> + <translation>Offen</translation> + </message> + <message> + <source>Save</source> + <translation>Speichern</translation> + </message> + <message> + <source>Select files</source> + <translation>Dateien auswählen</translation> + </message> + <message numerus="yes"> + <source>Are you sure you want to remove %n attachment(s)?</source> + <translation><numerusform>Sind Sie sicher, dass sie einen Anhang löschen möchten?</numerusform><numerusform>Sind Sie sicher, dass sie %n Anhänge löschen möchten?</numerusform></translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>Entfernen bestätigen</translation> + </message> + <message> + <source>Save attachments</source> + <translation>Anhänge speichern</translation> + </message> + <message> + <source>Unable to create directory: +%1</source> + <translation>Konnte Verzeichnis nicht erstellen: +%1</translation> + </message> + <message> + <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> + <translation>Sind Sie sicher, dass sie die existierende Datei „%1“ mit dem Anhang überschreiben wollen?</translation> + </message> + <message> + <source>Confirm overwrite</source> + <translation>Überschreiben bestätigen</translation> + </message> + <message> + <source>Unable to save attachments: +%1</source> + <translation>Speichern der Anhänge nicht möglich: +%1</translation> + </message> + <message> + <source>Unable to open attachment: +%1</source> + <translation>Öffnen des Anhangs nicht möglich: +%1</translation> + </message> + <message> + <source>Unable to open attachments: +%1</source> + <translation>Öffnen des Anhangs nicht möglich: +%1</translation> + </message> + <message> + <source>Unable to open files: +%1</source> + <translation>Öffnen der Datei nicht möglich</translation> + </message> +</context> <context> <name>EntryAttributesModel</name> <message> @@ -1153,6 +1796,11 @@ Möchten Sie diese dennoch öffnen?</translation> </context> <context> <name>EntryModel</name> + <message> + <source>Ref: </source> + <comment>Reference abbreviation</comment> + <translation>Ref:</translation> + </message> <message> <source>Group</source> <translation>Gruppe</translation> @@ -1169,11 +1817,6 @@ Möchten Sie diese dennoch öffnen?</translation> <source>URL</source> <translation>URL</translation> </message> - <message> - <source>Ref: </source> - <comment>Reference abbreviation</comment> - <translation>Ref:</translation> - </message> </context> <context> <name>Group</name> @@ -1182,6 +1825,17 @@ Möchten Sie diese dennoch öffnen?</translation> <translation>Papierkorb</translation> </message> </context> +<context> + <name>HostInstaller</name> + <message> + <source>KeePassXC: Cannot save file!</source> + <translation>KeePassXC: Datei konnte nicht gespeichert werden!</translation> + </message> + <message> + <source>Cannot save the native messaging script file.</source> + <translation>Speichern des Native-Messaging-Skripts nicht möglich.</translation> + </message> +</context> <context> <name>HttpPasswordGeneratorWidget</name> <message> @@ -1244,6 +1898,361 @@ Möchten Sie diese dennoch öffnen?</translation> <translation>Meldung schließen</translation> </message> </context> +<context> + <name>Kdbx3Reader</name> + <message> + <source>Unable to calculate master key</source> + <translation>Berechnung des Master-Passworts gescheitert</translation> + </message> + <message> + <source>Unable to issue challenge-response.</source> + <translation>Fehler beim Ausführen des Challenge-Response-Verfahrens</translation> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>Falscher Schlüssel oder die Datenbank ist beschädigt.</translation> + </message> +</context> +<context> + <name>Kdbx3Writer</name> + <message> + <source>Unable to issue challenge-response.</source> + <translation>Fehler beim Ausführen des Challenge-Response-Verfahrens</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Berechnung des Master-Passworts gescheitert</translation> + </message> +</context> +<context> + <name>Kdbx4Reader</name> + <message> + <source>missing database headers</source> + <translation>fehlende Datenbank-Header</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Berechnung des Master-Passworts gescheitert</translation> + </message> + <message> + <source>Invalid header checksum size</source> + <translation>Ungültige Größe der Header-Prüfsumme</translation> + </message> + <message> + <source>Header SHA256 mismatch</source> + <translation>Ungültige SHA256-Prüfsumme für Header</translation> + </message> + <message> + <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> + <translation>Falscher Schlüssel oder Datei ist beschädigt (ungültiger HMAC)</translation> + </message> + <message> + <source>Unknown cipher</source> + <translation>Unbekannter Verschlüsselungsalgorithmus</translation> + </message> + <message> + <source>Invalid header id size</source> + <translation>Ungültige Größe der Header-ID</translation> + </message> + <message> + <source>Invalid header field length</source> + <translation>Ungültiger Header-Feldlänge</translation> + </message> + <message> + <source>Invalid header data length</source> + <translation>Ungültige Header-Datenlänge</translation> + </message> + <message> + <source>Failed to open buffer for KDF parameters in header</source> + <translation>Konnte Puffer mit KDF-Parametern im Header nicht öffnen</translation> + </message> + <message> + <source>Unsupported key derivation function (KDF) or invalid parameters</source> + <translation>Nicht unterstützte Schlüssel-Ableitungsfunktion (KDF) oder ungültige Parameter</translation> + </message> + <message> + <source>Legacy header fields found in KDBX4 file.</source> + <translation>Veraltete Header-Felder in KDBX4-Datei gefunden.</translation> + </message> + <message> + <source>Invalid inner header id size</source> + <translation>Ungültige Größer der Inner-Header-ID</translation> + </message> + <message> + <source>Invalid inner header field length</source> + <translation>Ungültige Inner-Header-Feldlänge</translation> + </message> + <message> + <source>Invalid inner header binary size</source> + <translation>Ungültige Inner-Header-Binärgröße</translation> + </message> + <message> + <source>Unsupported KeePass variant map version.</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>Ungültige KeePass-Variant-Map-Version</translation> + </message> + <message> + <source>Invalid variant map entry name length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>Ungültige Variant-Map-Eintragslänge</translation> + </message> + <message> + <source>Invalid variant map entry name data</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>Ungültige Variant-Map-Eintragsdaten</translation> + </message> + <message> + <source>Invalid variant map entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>Ungültige Variant-Map-Eintragslänge</translation> + </message> + <message> + <source>Invalid variant map entry value data</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation>Ungültige Variant-Map-Eintragsdaten</translation> + </message> + <message> + <source>Invalid variant map Bool entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>Ungültige Bool Variant-Map-Eintragslänge</translation> + </message> + <message> + <source>Invalid variant map Int32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>Ungültige Int32 Variant-Map-Eintragslänge</translation> + </message> + <message> + <source>Invalid variant map UInt32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>Ungültige UInt32 Variant-Map-Eintragslänge</translation> + </message> + <message> + <source>Invalid variant map Int64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>Ungültige Int64 Variant-Map-Eintragslänge</translation> + </message> + <message> + <source>Invalid variant map UInt64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>Ungültige UInt64 Variant-Map-Eintragslänge</translation> + </message> + <message> + <source>Invalid variant map entry type</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>Ungültiger Variant-Map-Eintragstyp</translation> + </message> + <message> + <source>Invalid variant map field type size</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>Falsche Feldgröße für Variant-Map-Feldtyp</translation> + </message> +</context> +<context> + <name>Kdbx4Writer</name> + <message> + <source>Invalid symmetric cipher algorithm.</source> + <translation>Ungültiger symmetrischer Verschlüsselungsalgorithmus</translation> + </message> + <message> + <source>Invalid symmetric cipher IV size.</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation>Ungültige symmetrische Verschlüsselungs-IV-Größe</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Berechnung des Master-Passworts gescheitert</translation> + </message> + <message> + <source>Failed to serialize KDF parameters variant map</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation>KDF-Parameter aus Variant-Map konnten nicht serialisiert werden</translation> + </message> +</context> +<context> + <name>KdbxReader</name> + <message> + <source>Invalid cipher uuid length</source> + <translation>Ungültige Länge der Algorithmus-UUID</translation> + </message> + <message> + <source>Unsupported cipher</source> + <translation>Nicht unterstützter Verschlüsselungsalgorithmus</translation> + </message> + <message> + <source>Invalid compression flags length</source> + <translation>Ungültige Kompressions-Flag-Fänge</translation> + </message> + <message> + <source>Unsupported compression algorithm</source> + <translation>Nicht unterstützter Kompressionsalgorithmus</translation> + </message> + <message> + <source>Invalid master seed size</source> + <translation>Ungültige Master-Seed-Länge</translation> + </message> + <message> + <source>Invalid transform seed size</source> + <translation>Ungültige Transform-Seed-Länge</translation> + </message> + <message> + <source>Invalid transform rounds size</source> + <translation>Ungültige Transformations-Runden-Länge</translation> + </message> + <message> + <source>Invalid start bytes size</source> + <translation>Ungültige Start-Byte-Länge</translation> + </message> + <message> + <source>Invalid random stream id size</source> + <translation>Ungültige Random-Stream-ID-Länge</translation> + </message> + <message> + <source>Invalid inner random stream cipher</source> + <translation>Ungültige Inner-Random-Stream-Cipher</translation> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>Keine KeePass-Datenbank.</translation> + </message> + <message> + <source>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> + <translation>Die ausgewählte Datei ist eine alte KeePass 1-Datenbank (.kdb). + +Zum Importieren gehen Sie auf Datenbank > 'KeePass 1-Datenbank importieren...'. +Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann später nicht mehr mit der alten KeePassX-Version 0.4 geöffnet werden.</translation> + </message> + <message> + <source>Unsupported KeePass 2 database version.</source> + <translation>Nicht unterstützte KeePass 2-Datenbank-Version</translation> + </message> +</context> +<context> + <name>KdbxXmlReader</name> + <message> + <source>XML parsing failure: %1</source> + <translation>XML-Parser-Fehler: %1</translation> + </message> + <message> + <source>No root group</source> + <translation>Keine Root-Gruppe</translation> + </message> + <message> + <source>Missing icon uuid or data</source> + <translation>Fehlende Icon-UUID oder -Daten</translation> + </message> + <message> + <source>Missing custom data key or value</source> + <translation>Fehlender benutzerdefinierter Datenschlüssel oder -wert</translation> + </message> + <message> + <source>Multiple group elements</source> + <translation>Mehrere Gruppen-Elemente</translation> + </message> + <message> + <source>Null group uuid</source> + <translation>Nicht gesetzte Gruppen-UUID</translation> + </message> + <message> + <source>Invalid group icon number</source> + <translation>Ungültige Gruppen-Icon-Anzahl</translation> + </message> + <message> + <source>Invalid EnableAutoType value</source> + <translation>Ungültiger Wert für EnableAutoType</translation> + </message> + <message> + <source>Invalid EnableSearching value</source> + <translation>Ungültiger Wert für EnableSearching</translation> + </message> + <message> + <source>No group uuid found</source> + <translation>Keine Gruppen-UUID gefunden</translation> + </message> + <message> + <source>Null DeleteObject uuid</source> + <translation>Fehlende DeleteObject-UUID</translation> + </message> + <message> + <source>Missing DeletedObject uuid or time</source> + <translation>Fehlende DeletedObject-UUID oder -Zeit</translation> + </message> + <message> + <source>Null entry uuid</source> + <translation>Fehlende Eintrags-UUID</translation> + </message> + <message> + <source>Invalid entry icon number</source> + <translation>Ungültige Eintrags-Icon-Anzahl</translation> + </message> + <message> + <source>History element in history entry</source> + <translation>Verlaufselement in Eintragsverlauf</translation> + </message> + <message> + <source>No entry uuid found</source> + <translation>Keine Eintrags-UUID gefunden</translation> + </message> + <message> + <source>History element with different uuid</source> + <translation>Verlaufselement mit anderer UUID</translation> + </message> + <message> + <source>Unable to decrypt entry string</source> + <translation>Eintrags-Zeichenfolge konnte nicht entschlüssel werden</translation> + </message> + <message> + <source>Duplicate custom attribute found</source> + <translation>Doppelte Benutzerattribut gefunden</translation> + </message> + <message> + <source>Entry string key or value missing</source> + <translation>Eintrags-Schlüssel oder -Wert fehlt</translation> + </message> + <message> + <source>Duplicate attachment found</source> + <translation>Doppelter Anhang gefunden</translation> + </message> + <message> + <source>Entry binary key or value missing</source> + <translation>Eintrags-Binärschlüssel oder -Wert fehlt</translation> + </message> + <message> + <source>Auto-type association window or sequence missing</source> + <translation>Auto-Type-Fensterangabe oder -Sequenz fehlt</translation> + </message> + <message> + <source>Invalid bool value</source> + <translation>Ungültiger Bool-Wert</translation> + </message> + <message> + <source>Invalid date time value</source> + <translation>Ungültiger Datums-Zeit-Wert</translation> + </message> + <message> + <source>Invalid color value</source> + <translation>Ungültiger Farbwert</translation> + </message> + <message> + <source>Invalid color rgb part</source> + <translation>Ungültiger RGB-Farbteil</translation> + </message> + <message> + <source>Invalid number value</source> + <translation>Ungültiger Zahlwert</translation> + </message> + <message> + <source>Invalid uuid value</source> + <translation>Ungültiger UUID-Wert</translation> + </message> + <message> + <source>Unable to decompress binary</source> + <extracomment>Translator meant is a binary data inside an entry</extracomment> + <translation>Binärdatei konnte nicht dekomprimiert werden</translation> + </message> +</context> <context> <name>KeePass1OpenWidget</name> <message> @@ -1252,7 +2261,7 @@ Möchten Sie diese dennoch öffnen?</translation> </message> <message> <source>Unable to open the database.</source> - <translation>Öffnen der Datenbank nicht möglich.</translation> + <translation>Öffnen der Datenbank ist nicht möglich.</translation> </message> </context> <context> @@ -1273,72 +2282,145 @@ Möchten Sie diese dennoch öffnen?</translation> <source>Unsupported KeePass database version.</source> <translation>Nicht unterstützte KeePass-Datenbankversion.</translation> </message> + <message> + <source>Unable to read encryption IV</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation>Verschlüsselungs-IV konnte nicht gelesen werden</translation> + </message> + <message> + <source>Invalid number of groups</source> + <translation>Ungültige Anzahl Gruppen</translation> + </message> + <message> + <source>Invalid number of entries</source> + <translation>Ungültige Anzahl Einträge</translation> + </message> + <message> + <source>Invalid content hash size</source> + <translation>Ungültige Inhalts-Hashlänge</translation> + </message> + <message> + <source>Invalid transform seed size</source> + <translation>Ungültige Transform-Seed-Länge</translation> + </message> + <message> + <source>Invalid number of transform rounds</source> + <translation>Ungültige Anzahl Transform-Runden</translation> + </message> + <message> + <source>Unable to construct group tree</source> + <translation>Gruppen-Baum konnte nicht erzeugt werden</translation> + </message> <message> <source>Root</source> <translation>Root</translation> </message> <message> <source>Unable to calculate master key</source> - <translation>Berechnung des Hauptschlüssels gescheitert</translation> + <translation>Berechnung des Master-Passworts gescheitert</translation> </message> <message> <source>Wrong key or database file is corrupt.</source> <translation>Falscher Schlüssel oder die Datenbank ist beschädigt.</translation> </message> -</context> -<context> - <name>KeePass2Reader</name> <message> - <source>Not a KeePass database.</source> - <translation>Keine KeePass-Datenbank.</translation> + <source>Key transformation failed</source> + <translation>Schlüssel-Transformation fehlgeschlagen</translation> </message> <message> - <source>Unsupported KeePass database version.</source> - <translation>Nicht unterstützte KeePass-Datenbankversion.</translation> + <source>Invalid group field type number</source> + <translation>Ungültige Gruppen-Typanzahl</translation> </message> <message> - <source>Wrong key or database file is corrupt.</source> - <translation>Falscher Schlüssel oder die Datei ist beschädigt.</translation> + <source>Invalid group field size</source> + <translation>Falsche Feldgröße für Gruppe</translation> </message> <message> - <source>Unable to calculate master key</source> - <translation>Berechnung des Hauptschlüssels gescheitert</translation> + <source>Read group field data doesn't match size</source> + <translation>Falsche Feldgröße für Gruppenfeld</translation> </message> <message> - <source>Unable to issue challenge-response.</source> - <translation>Fehler beim Ausführen des Challenge-Response-Verfahrens</translation> + <source>Incorrect group id field size</source> + <translation>Falsche Feldgröße für Gruppen-ID</translation> </message> <message> - <source>The selected file is an old KeePass 1 database (.kdb). - -You can import it by clicking on Database > 'Import KeePass 1 database...'. -This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> - <translation>Die ausgewählte Datei ist eine alte KeePass 1-Datenbank (.kdb). - -Zum Importieren gehen Sie auf Datenbank > 'KeePass 1-Datenbank importieren...'. -Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann später nicht mehr mit der alten KeePassX-Version 0.4 geöffnet werden.</translation> - </message> -</context> -<context> - <name>KeePass2Writer</name> - <message> - <source>Unable to issue challenge-response.</source> - <translation>Fehler beim Ausführen des Challenge-Response-Verfahrens</translation> + <source>Incorrect group creation time field size</source> + <translation>Falsche Feldgröße für Gruppen-Erstellungs-Zeit</translation> </message> <message> - <source>Unable to calculate master key</source> - <translation>Berechnung des Hauptschlüssels gescheitert</translation> + <source>Incorrect group modification time field size</source> + <translation>Falsche Feldgröße für Gruppen-Änderungszeit</translation> + </message> + <message> + <source>Incorrect group access time field size</source> + <translation>Falsche Feldgröße für Gruppen-Zugriffszeit</translation> + </message> + <message> + <source>Incorrect group expiry time field size</source> + <translation>Falsche Feldgröße für Gruppen-Verfallszeit</translation> + </message> + <message> + <source>Incorrect group icon field size</source> + <translation>Falsche Feldgröße für Gruppen-Icon</translation> + </message> + <message> + <source>Incorrect group level field size</source> + <translation>Falsche Feldgröße für Gruppen-Level</translation> + </message> + <message> + <source>Invalid group field type</source> + <translation>Falsche Feldtyp für Gruppe</translation> + </message> + <message> + <source>Missing group id or level</source> + <translation>Fehlende Gruppen-ID oder -Level</translation> + </message> + <message> + <source>Missing entry field type number</source> + <translation>Fehlende Eintragsfeld-Typeanzahl</translation> + </message> + <message> + <source>Invalid entry field size</source> + <translation>Falsche Feldgröße für Eintrag</translation> + </message> + <message> + <source>Read entry field data doesn't match size</source> + <translation>Gelesene Eintrags-Felddaten haben falsche Größe</translation> + </message> + <message> + <source>Invalid entry uuid field size</source> + <translation>Eintrags-UUID hat falsche Größe</translation> + </message> + <message> + <source>Invalid entry group id field size</source> + <translation>Falsche Feldgröße für Eintrags-Gruppen-ID</translation> + </message> + <message> + <source>Invalid entry icon field size</source> + <translation>Falsche Feldgröße für Eintrags-Icon</translation> + </message> + <message> + <source>Invalid entry creation time field size</source> + <translation>Falsche Feldgröße für Eintrags-Erstellungszeit</translation> + </message> + <message> + <source>Invalid entry modification time field size</source> + <translation>Falsche Feldgröße für Eintrags-Änderungszeit</translation> + </message> + <message> + <source>Invalid entry expiry time field size</source> + <translation>Falsche Feldgröße für Eintrags-Verfallszeit</translation> + </message> + <message> + <source>Invalid entry field type</source> + <translation>Ungültiger Eintrags-Feldtyp</translation> </message> </context> <context> <name>Main</name> <message> - <source>Fatal error while testing the cryptographic functions.</source> - <translation>Fataler Fehler beim Testen der kryptografischen Funktionen.</translation> - </message> - <message> - <source>KeePassXC - Error</source> - <translation>KeePassXC - Fehler</translation> + <source>Existing single-instance lock file is invalid. Launching new instance.</source> + <translation>Vorhandene einmal-Sperrdatei ist ungültig. Starte neuen Vorgang. </translation> </message> <message> <source>The lock file could not be created. Single-instance mode disabled.</source> @@ -1349,64 +2431,32 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann <translation>Eine andere KeePassXC-Instanz läuft bereits</translation> </message> <message> - <source>Existing single-instance lock file is invalid. Launching new instance.</source> - <translation>Vorhandene einmal-Sperrdatei ist ungültig. Starte neuen Vorgang. </translation> + <source>Fatal error while testing the cryptographic functions.</source> + <translation>Fataler Fehler beim Testen der kryptografischen Funktionen.</translation> + </message> + <message> + <source>KeePassXC - Error</source> + <translation>KeePassXC - Fehler</translation> </message> </context> <context> <name>MainWindow</name> <message> - <source>Open database</source> - <translation>Datenbank öffnen</translation> - </message> - <message> - <source>Database settings</source> - <translation>Datenbankeinstellungen</translation> - </message> - <message> - <source>Copy username to clipboard</source> - <translation>Benutzername in die Zwischenablage kopieren</translation> - </message> - <message> - <source>Copy password to clipboard</source> - <translation>Passwort in die Zwischenablage kopieren</translation> - </message> - <message> - <source>Settings</source> - <translation>Einstellungen</translation> - </message> - <message> - <source>Show toolbar</source> - <translation>Symbolleiste anzeigen</translation> - </message> - <message> - <source>read-only</source> - <translation>Nur Lesezugriff</translation> - </message> - <message> - <source>Toggle window</source> - <translation>Fenster zeigen / verstecken</translation> - </message> - <message> - <source>KeePass 2 Database</source> - <translation>KeePass 2 Datenbank</translation> - </message> - <message> - <source>All files</source> - <translation>Alle Dateien</translation> - </message> - <message> - <source>Save repaired database</source> - <translation>Reparierte Datenbank speichern</translation> - </message> - <message> - <source>Writing the database failed.</source> - <translation>Schreiben der Datenbank fehlgeschlagen.</translation> + <source>&Database</source> + <translation>&Datenbank</translation> </message> <message> <source>&Recent databases</source> <translation>&Zuletzt verwendete Datenbanken</translation> </message> + <message> + <source>Import</source> + <translation>Importieren</translation> + </message> + <message> + <source>&Help</source> + <translation>&Hilfe</translation> + </message> <message> <source>E&ntries</source> <translation>Ei&nträge</translation> @@ -1415,13 +2465,17 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann <source>Copy att&ribute to clipboard</source> <translation>Feld in &Zwischenablage kopieren</translation> </message> + <message> + <source>Time-based one-time password</source> + <translation>Zeitbasiertes Einmal-Passwort (TOTP)</translation> + </message> <message> <source>&Groups</source> <translation>&Gruppen</translation> </message> <message> - <source>&View</source> - <translation>&Ansicht</translation> + <source>&Tools</source> + <translation>&Werkzeuge</translation> </message> <message> <source>&Quit</source> @@ -1431,6 +2485,10 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann <source>&About</source> <translation>&Über</translation> </message> + <message> + <source>&Open database...</source> + <translation>Datenbank öffnen...</translation> + </message> <message> <source>&Save database</source> <translation>Datenbank &speichern</translation> @@ -1471,26 +2529,26 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann <source>&Delete group</source> <translation>Gruppe &löschen</translation> </message> + <message> + <source>Sa&ve database as...</source> + <translation>Datenbank speichern unter...</translation> + </message> + <message> + <source>Change &master key...</source> + <translation>&Master-Passwort ändern...</translation> + </message> <message> <source>&Database settings</source> <translation>&Datenbankeinstellungen</translation> </message> + <message> + <source>Database settings</source> + <translation>Datenbankeinstellungen</translation> + </message> <message> <source>&Clone entry</source> <translation>Eintrag &klonen</translation> </message> - <message> - <source>Timed one-time password</source> - <translation>Timed One-Time-Passwort</translation> - </message> - <message> - <source>Copy &TOTP</source> - <translation>&TOTP kopieren</translation> - </message> - <message> - <source>Show TOTP</source> - <translation>TOTP anzeigen</translation> - </message> <message> <source>&Find</source> <translation>&Suchen</translation> @@ -1499,14 +2557,26 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann <source>Copy &username</source> <translation>&Benutzernamen kopieren</translation> </message> + <message> + <source>Copy username to clipboard</source> + <translation>Benutzername in die Zwischenablage kopieren</translation> + </message> <message> <source>Cop&y password</source> <translation>Passwort kop&ieren</translation> </message> + <message> + <source>Copy password to clipboard</source> + <translation>Passwort in die Zwischenablage kopieren</translation> + </message> <message> <source>&Settings</source> <translation>&Einstellungen</translation> </message> + <message> + <source>Password Generator</source> + <translation>Passwortgenerator</translation> + </message> <message> <source>&Perform Auto-Type</source> <translation>&Auto-Type ausführen</translation> @@ -1523,65 +2593,25 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann <source>&Title</source> <translation>&Titel</translation> </message> + <message> + <source>Copy title to clipboard</source> + <translation>Titel in Zwischenablage kopieren</translation> + </message> <message> <source>&URL</source> <translation>&URL</translation> </message> + <message> + <source>Copy URL to clipboard</source> + <translation>URL in Zwischenablage kopieren</translation> + </message> <message> <source>&Notes</source> <translation>&Notizen</translation> </message> <message> - <source>Password Generator</source> - <translation>Passwortgenerator</translation> - </message> - <message> - <source>Clear history</source> - <translation>Verlauf löschen</translation> - </message> - <message> - <source>&Database</source> - <translation>&Datenbank</translation> - </message> - <message> - <source>Import</source> - <translation>Importieren</translation> - </message> - <message> - <source>&Tools</source> - <translation>&Werkzeuge</translation> - </message> - <message> - <source>Empty recycle bin</source> - <translation>Papierkorb leeren</translation> - </message> - <message> - <source>Access error for config file %1</source> - <translation>Zugriffsfehler für Konfigurations-Datei %1</translation> - </message> - <message> - <source>Quit KeePassXC</source> - <translation>KeePassXC beenden</translation> - </message> - <message> - <source>Please touch the button on your YubiKey!</source> - <translation>Bitte drücken Sie den Button Ihres YubiKeys</translation> - </message> - <message> - <source>&Help</source> - <translation>&Hilfe</translation> - </message> - <message> - <source>&Open database...</source> - <translation>Datenbank öffnen...</translation> - </message> - <message> - <source>Sa&ve database as...</source> - <translation>Datenbank speichern unter...</translation> - </message> - <message> - <source>Change &master key...</source> - <translation>Ha&uptschlüssel ändern...</translation> + <source>Copy notes to clipboard</source> + <translation>Notizen in Zwischenablage kopieren</translation> </message> <message> <source>&Export to CSV file...</source> @@ -1599,10 +2629,169 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann <source>Re&pair database...</source> <translation>Datenbank repar&ieren...</translation> </message> + <message> + <source>Show TOTP</source> + <translation>TOTP anzeigen</translation> + </message> <message> <source>Set up TOTP...</source> <translation>TOTP einrichten...</translation> </message> + <message> + <source>Copy &TOTP</source> + <translation>&TOTP kopieren</translation> + </message> + <message> + <source>E&mpty recycle bin</source> + <translation>Papierkorb l&eeren</translation> + </message> + <message> + <source>Clear history</source> + <translation>Verlauf löschen</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation>Zugriffsfehler für Konfigurations-Datei %1</translation> + </message> + <message> + <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> + <translation><p>Es sie aus, als ob Sie KeePassHTTP für Browser-Integration nutzen. Dieses Feature is veraltet und wird in Zukunft entfernt. <br>Bitte wechseln Sie zu KeePassXC-Browser! Für Hilfe bei der Migration, lesen Sie unseren <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">Migrations-Leitfaden</a> (Warnung %1 von 3).</translation> + </message> + <message> + <source>read-only</source> + <translation>Nur Lesezugriff</translation> + </message> + <message> + <source>Settings</source> + <translation>Einstellungen</translation> + </message> + <message> + <source>Toggle window</source> + <translation>Fenster zeigen / verstecken</translation> + </message> + <message> + <source>Quit KeePassXC</source> + <translation>KeePassXC beenden</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>KeePass 2 Datenbank</translation> + </message> + <message> + <source>All files</source> + <translation>Alle Dateien</translation> + </message> + <message> + <source>Open database</source> + <translation>Datenbank öffnen</translation> + </message> + <message> + <source>Save repaired database</source> + <translation>Reparierte Datenbank speichern</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>Schreiben der Datenbank fehlgeschlagen.</translation> + </message> + <message> + <source>Please touch the button on your YubiKey!</source> + <translation>Bitte drücken Sie den Button Ihres YubiKeys</translation> + </message> +</context> +<context> + <name>OpenSSHKey</name> + <message> + <source>Invalid key file, expecting an OpenSSH key</source> + <translation>Ungültige Schlüsseldatei, OpenSSH-Schlüssel erwartet</translation> + </message> + <message> + <source>PEM boundary mismatch</source> + <translation>Falsche PEM-Boundarys</translation> + </message> + <message> + <source>This is not an OpenSSH key, only modern keys are supported</source> + <translation>Dies ist kein OpenSSH-Schlüssel, nur moderne Schlüssel werden unterstützt</translation> + </message> + <message> + <source>Base64 decoding failed</source> + <translation>Base64-Dekodierung fehlgeschlagen</translation> + </message> + <message> + <source>Key file way too small.</source> + <translation>Schlüsseldatei ist viel zu klein</translation> + </message> + <message> + <source>Key file magic header id invalid</source> + <translation>Magic-Header-ID der Schlüsseldate ungültig</translation> + </message> + <message> + <source>Found zero keys</source> + <translation>Null Schlüssel gefunden</translation> + </message> + <message> + <source>Failed to read public key.</source> + <translation>Öffentlicher Schlüssel konnte nicht gelesen werden</translation> + </message> + <message> + <source>Corrupted key file, reading private key failed</source> + <translation>Korrupte Schlüsseldatei, lesen des Privatschlüssels fehlgeschlagen</translation> + </message> + <message> + <source>No private key payload to decrypt</source> + <translation>Keine Privatschlüssel-Nutzdaten zum Entschlüsseln</translation> + </message> + <message> + <source>Unknown cipher: </source> + <translation>Unbekannter Verschlüsselungsalgorithmus:</translation> + </message> + <message> + <source>Trying to run KDF without cipher</source> + <translation>Versuche, KDF ohne Verschlüsselungsalgorithmus anzuwenden</translation> + </message> + <message> + <source>Passphrase is required to decrypt this key</source> + <translation>Passphrase zum Entschlüsseln des Schlüssels benötigt</translation> + </message> + <message> + <source>Key derivation failed, key file corrupted?</source> + <translation>Schlüssel-Ableitung fehlgeschlagen, Schlüsseldatei korrupt?</translation> + </message> + <message> + <source>Unknown KDF: </source> + <translation>Unbekannte KDF:</translation> + </message> + <message> + <source>Decryption failed, wrong passphrase?</source> + <translation>Entschlüsselung fehlgeschlagen, falsche Passphrase?</translation> + </message> + <message> + <source>Unexpected EOF while reading public key</source> + <translation>Unerwartetes EOF beim Lesen des öffentlichen Schlüssels</translation> + </message> + <message> + <source>Unknown key type: </source> + <translation>Unbekannte Schlüsseltyp:</translation> + </message> + <message> + <source>Unexpected EOF while reading private key</source> + <translation>Unerwartetes EOF beim Lesen des Privatschlüssels</translation> + </message> + <message> + <source>Can't write public key as it is empty</source> + <translation>Öffentlicher Schlüssel konnte nicht geschrieben werden, da er leer ist</translation> + </message> + <message> + <source>Unexpected EOF when writing public key</source> + <translation>Unerwartetes EOF beim Schreiben des öffentlichen Schlüssels</translation> + </message> + <message> + <source>Can't write private key as it is empty</source> + <translation>Privatschlüssel konnte nicht geschrieben werden, da er leer ist</translation> + </message> + <message> + <source>Unexpected EOF when writing private key</source> + <translation>Unerwartetes EOF beim Schreiben des Privatschlüssels</translation> + </message> </context> <context> <name>OptionDialog</name> @@ -1610,22 +2799,63 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann <source>Dialog</source> <translation>Dialog</translation> </message> + <message> + <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation>Dies wird benötigt, um auf Ihre Datenbanken in ChromeIPass oder PassIFox zuzugreifen.</translation> + </message> + <message> + <source>Enable KeePassHTTP server</source> + <translation>KeePassHTTP-Server aktivieren</translation> + </message> <message> <source>General</source> <translation>Allgemein</translation> </message> <message> <source>Sh&ow a notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> <translation>Zeig&e eine Benachrichtigung, wenn Anmeldedaten angefordert werden.</translation> </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>Zeige nur die am besten passenden Einträge für eine URL anstatt aller Einträge der ganzen Domäne.</translation> + </message> + <message> + <source>&Return only best matching entries</source> + <translation>Nur beste Treffer anzeigen</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Verlange Entsperrung, wenn die Datenbank gesperrt ist.</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> + <translation>Nur Einträge mit dem gleichen Schema (http://, https://, ftp://, …) anzeigen</translation> + </message> + <message> + <source>&Match URL schemes</source> + <translation>URL-Schema verwenden</translation> + </message> <message> <source>Sort matching entries by &username</source> <translation>Sortiere gefundene Einträge nach &Benutzername</translation> </message> + <message> + <source>Sort &matching entries by title</source> + <translation>Sortiere gefundene Einträge nach Titel</translation> + </message> + <message> + <source>R&emove all shared encryption keys from active database</source> + <translation>&Entferne alle freigegebenen Chiffrierschlüssel aus der aktiven Datenbank</translation> + </message> <message> <source>Re&move all stored permissions from entries in active database</source> <translation>Entferne alle gespeicherten Berechtigungen für Einträge in der aktiven Datenbank</translation> </message> + <message> + <source>Password Generator</source> + <translation>Passwortgenerator</translation> + </message> <message> <source>Advanced</source> <translation>Fortgeschritten</translation> @@ -1638,10 +2868,22 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann <source>Always allow &updating entries</source> <translation>&Aktualisierung von Einträgen immer erlauben</translation> </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>Nur die ausgewählte Datenbank muss mit dem Client verbunden sein.</translation> + </message> <message> <source>Searc&h in all opened databases for matching entries</source> <translation>Suche in allen offenen Datenbanken nach übereinstimmenden Einträgen</translation> </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>Automatisches Erstellen und Aktualisieren von erweiterten Attributen wird nicht unterstützt!</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>Zeige auch erweiterte Attribute, welche mit "KPH: " beginnen</translation> + </message> <message> <source>HTTP Port:</source> <translation>HTTP-Port:</translation> @@ -1650,18 +2892,18 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann <source>Default port: 19455</source> <translation>Standard-Port: 19455</translation> </message> - <message> - <source>Re&quest to unlock the database if it is locked</source> - <translation>Verlange Entsperrung, wenn die Datenbank gesperrt ist.</translation> - </message> - <message> - <source>Sort &matching entries by title</source> - <translation>Sortiere gefundene Einträge nach Titel</translation> - </message> <message> <source>KeePassXC will listen to this port on 127.0.0.1</source> <translation>KeePassXC überwacht diesen Port auf 127.0.0.1</translation> </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation><b>Warnung:</b> Die folgenden Optionen können gefährlich sein!</translation> + </message> + <message> + <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> + <translation><p>KeePassHTTP ist veraltet und wird in Zukunft nicht mehr unterstützt. <br>Bitte wechseln Sie zu KeePassXC-Browser! Für Hilfe bei der Migration, lesen Sie unseren <a href="https://keepassxc.org/docs/keepassxc-browser-migration">Migrations-Leitfaden</a>.</p></translation> + </message> <message> <source>Cannot bind to privileged ports</source> <translation>Privilegierte Ports können nicht überwacht werden</translation> @@ -1672,63 +2914,30 @@ Using default port 19455.</source> <translation>Privilegierte Ports unterhalb von 1024 können nicht überwacht werden. Es wird der Standard-Port 19455 verwendet.</translation> </message> - <message> - <source>R&emove all shared encryption keys from active database</source> - <translation>&Entferne alle freigegebenen Chiffrierschlüssel aus der aktiven Datenbank</translation> - </message> - <message> - <source>&Return advanced string fields which start with "KPH: "</source> - <translation>Zeige auch erweiterte Attribute, welche mit "KPH: " beginnen</translation> - </message> - <message> - <source>Automatically creating or updating string fields is not supported.</source> - <translation>Automatisches Erstellen und Aktualisieren von erweiterten Attributen wird nicht unterstützt!</translation> - </message> - <message> - <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> - <translation>Dies wird benötigt, um auf Ihre Datenbanken in ChromeIPass oder PassIFox zuzugreifen.</translation> - </message> - <message> - <source>Enable KeePassHTTP server</source> - <translation>KeePassHTTP-Server aktivieren</translation> - </message> - <message> - <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation>Zeige nur die am besten passenden Einträge für eine URL anstatt aller Einträge der ganzen Domäne.</translation> - </message> - <message> - <source>&Return only best matching entries</source> - <translation>Nur beste Treffer anzeigen</translation> - </message> - <message> - <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation>Nur Einträge mit dem gleichen Schema (http://, https://, ftp://, …) anzeigen</translation> - </message> - <message> - <source>&Match URL schemes</source> - <translation>URL-Schema verwenden</translation> - </message> - <message> - <source>Password Generator</source> - <translation>Passwortgenerator</translation> - </message> - <message> - <source>Only the selected database has to be connected with a client.</source> - <translation>Nur die ausgewählte Datenbank muss mit dem Client verbunden sein.</translation> - </message> - <message> - <source>The following options can be dangerous! -Change them only if you know what you are doing.</source> - <translation>Die folgenden Optionen können gefährlich sein! -Ändern Sie diese nur, wenn Sie wissen, was Sie tun.</translation> - </message> </context> <context> <name>PasswordGeneratorWidget</name> + <message> + <source>%p%</source> + <translation>%p%</translation> + </message> <message> <source>Password:</source> <translation>Passwort:</translation> </message> + <message> + <source>strength</source> + <comment>Password strength</comment> + <translation>Stärke</translation> + </message> + <message> + <source>entropy</source> + <translation>Entropie</translation> + </message> + <message> + <source>Password</source> + <translation>Passwort</translation> + </message> <message> <source>Character Types</source> <translation>Zeichenarten</translation> @@ -1749,38 +2958,50 @@ Change them only if you know what you are doing.</source> <source>Special Characters</source> <translation>Sonderzeichen</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>Erweitertes ASCII</translation> + </message> <message> <source>Exclude look-alike characters</source> <translation>Gleich aussehende Zeichen ausschließen</translation> </message> - <message> - <source>Accept</source> - <translation>Akzeptieren</translation> - </message> - <message> - <source>%p%</source> - <translation>%p%</translation> - </message> - <message> - <source>strength</source> - <translation>Stärke</translation> - </message> - <message> - <source>entropy</source> - <translation>Entropie</translation> - </message> - <message> - <source>&Length:</source> - <translation>&Länge:</translation> - </message> <message> <source>Pick characters from every group</source> <translation>Zeichen aus allen Gruppen wählen</translation> </message> + <message> + <source>&Length:</source> + <translation>&Länge:</translation> + </message> + <message> + <source>Passphrase</source> + <translation>Passphrase</translation> + </message> + <message> + <source>Wordlist:</source> + <translation>Wortliste</translation> + </message> + <message> + <source>Word Count:</source> + <translation>Wort-Anzahl</translation> + </message> + <message> + <source>Word Separator:</source> + <translation>Wort-Trenner</translation> + </message> <message> <source>Generate</source> <translation>Generieren</translation> </message> + <message> + <source>Copy</source> + <translation>Kopieren</translation> + </message> + <message> + <source>Accept</source> + <translation>Akzeptieren</translation> + </message> <message> <source>Close</source> <translation>Schließen</translation> @@ -1799,51 +3020,275 @@ Change them only if you know what you are doing.</source> </message> <message> <source>Poor</source> + <comment>Password quality</comment> <translation>Schlecht</translation> </message> <message> <source>Weak</source> + <comment>Password quality</comment> <translation>Schwach</translation> </message> <message> <source>Good</source> + <comment>Password quality</comment> <translation>Gut</translation> </message> <message> <source>Excellent</source> + <comment>Password quality</comment> <translation>Ausgezeichnet</translation> </message> - <message> - <source>Password</source> - <translation>Passwort</translation> - </message> - <message> - <source>Extended ASCII</source> - <translation>Erweitertes ASCII</translation> - </message> - <message> - <source>Passphrase</source> - <translation>Passphrase</translation> - </message> - <message> - <source>Wordlist:</source> - <translation>Wortliste</translation> - </message> - <message> - <source>Word Count:</source> - <translation>Wort-Anzahl</translation> - </message> - <message> - <source>Word Separator:</source> - <translation>Wort-Trenner</translation> - </message> - <message> - <source>Copy</source> - <translation>Kopieren</translation> - </message> </context> <context> <name>QObject</name> + <message> + <source>Database not opened</source> + <translation>Datenbank nicht geöffnet</translation> + </message> + <message> + <source>Database hash not available</source> + <translation>Datenbank-Hash nicht verfügbar</translation> + </message> + <message> + <source>Client public key not received</source> + <translation>Öffentlicher Client-Schlüssel nicht empfangen</translation> + </message> + <message> + <source>Cannot decrypt message</source> + <translation>Nachricht konnte nicht entschlüsselt werden</translation> + </message> + <message> + <source>Timeout or cannot connect to KeePassXC</source> + <translation>Timeout oder Verbindung zu KeePassXC fehlgeschlagen</translation> + </message> + <message> + <source>Action cancelled or denied</source> + <translation>Aktion abgebrochen oder verweigert</translation> + </message> + <message> + <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> + <translation>Nachricht konnte nicht entschlüsselt werden oder öffentlicher Schlüssel wurde nicht gefunden. Ist Native-Messaging in KeePassXC aktiviert ?</translation> + </message> + <message> + <source>KeePassXC association failed, try again</source> + <translation>KeePassXC-Verbindung fehlgeschlagen, bitte erneut versuchen</translation> + </message> + <message> + <source>Key change was not successful</source> + <translation>Schlüsselaustausch nicht erfolgreich</translation> + </message> + <message> + <source>Encryption key is not recognized</source> + <translation>Schlüssel nicht erkannt</translation> + </message> + <message> + <source>No saved databases found</source> + <translation>Keine gespeicherten Datenbanken gefunden</translation> + </message> + <message> + <source>Incorrect action</source> + <translation>Falsche Aktion</translation> + </message> + <message> + <source>Empty message received</source> + <translation>Leere Nachricht erhalten</translation> + </message> + <message> + <source>No URL provided</source> + <translation>Keine URL angegeben</translation> + </message> + <message> + <source>No logins found</source> + <translation>Keine Anmeldedaten gefunden</translation> + </message> + <message> + <source>Unknown error</source> + <translation>Unbekannter Fehler</translation> + </message> + <message> + <source>Add a new entry to a database.</source> + <translation>Neuen Eintrag zur Datenbank hinzufügen</translation> + </message> + <message> + <source>Path of the database.</source> + <translation>Pfad zur Datenbank.</translation> + </message> + <message> + <source>Key file of the database.</source> + <translation>Schlüsseldatei der Datenbank</translation> + </message> + <message> + <source>path</source> + <translation>Pfad</translation> + </message> + <message> + <source>Username for the entry.</source> + <translation>Nutzername für den Eintrag</translation> + </message> + <message> + <source>username</source> + <translation>Nutzername</translation> + </message> + <message> + <source>URL for the entry.</source> + <translation>URL für den Eintrag</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Prompt for the entry's password.</source> + <translation>Nach dem Passwort des Eintrags fragen</translation> + </message> + <message> + <source>Generate a password for the entry.</source> + <translation>Passwort für den Eintrag generieren.</translation> + </message> + <message> + <source>Length for the generated password.</source> + <translation>Länge des generierten Passworts.</translation> + </message> + <message> + <source>length</source> + <translation>Länge</translation> + </message> + <message> + <source>Path of the entry to add.</source> + <translation>Pfad des hinzuzufügenden Eintrags.</translation> + </message> + <message> + <source>Copy an entry's password to the clipboard.</source> + <translation>Passwort eines Eintrags in die Zwischenablage kopieren.</translation> + </message> + <message> + <source>Path of the entry to clip.</source> + <comment>clip = copy to clipboard</comment> + <translation>Pfad des in die Zwischenablage zu kopierenden Eintrags</translation> + </message> + <message> + <source>Timeout in seconds before clearing the clipboard.</source> + <translation>Zeit in Sekunden, bevor die Zwischenablage geleert wird.</translation> + </message> + <message> + <source>Edit an entry.</source> + <translation>Einen Eintrag bearbeiten.</translation> + </message> + <message> + <source>Title for the entry.</source> + <translation>Titel für diesen Eintrag.</translation> + </message> + <message> + <source>title</source> + <translation>Titel</translation> + </message> + <message> + <source>Path of the entry to edit.</source> + <translation>Pfad des zu bearbeitenden Eintrags</translation> + </message> + <message> + <source>Estimate the entropy of a password.</source> + <translation>Entropy des Passworts abschätzen</translation> + </message> + <message> + <source>Password for which to estimate the entropy.</source> + <translation>Passwort, für das die Entropie abgeschätzt werden soll.</translation> + </message> + <message> + <source>Perform advanced analysis on the password.</source> + <translation>Fortgeschrittene Analyse des Passworts ausführen.</translation> + </message> + <message> + <source>Extract and print the content of a database.</source> + <translation>Inhalt der Datenbank extrahieren und anzeigen.</translation> + </message> + <message> + <source>Path of the database to extract.</source> + <translation>Pfad der zu extrahierenden Datenbank.</translation> + </message> + <message> + <source>Insert password to unlock %1: </source> + <translation>Passwort eingeben, um %1 zu entsperren:</translation> + </message> + <message> + <source>Failed to load key file %1 : %2</source> + <translation>Schlüsseldatei %1: konnte nicht geladen werden: %2</translation> + </message> + <message> + <source>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation>WARNUNG: Sie verwenden ein veraltetes Schlüsseldatei-Format, welches in Zukunft evtl. nicht mehr unterstützt wird. + +Bitte denken Sie darüber nach, eine neue Schlüsseldatei zu generieren.</translation> + </message> + <message> + <source> + +Available commands: +</source> + <translation> + +Verfügbare Kommandos: +</translation> + </message> + <message> + <source>Name of the command to execute.</source> + <translation>Name des auszuführenden Befehls.</translation> + </message> + <message> + <source>List database entries.</source> + <translation>Datenbankeinträge auflisten.</translation> + </message> + <message> + <source>Path of the group to list. Default is /</source> + <translation>Pfad der aufzulistenden Gruppe. Standard ist /.</translation> + </message> + <message> + <source>Find entries quickly.</source> + <translation>Einträge schnell finden.</translation> + </message> + <message> + <source>Search term.</source> + <translation>Suchbegriff.</translation> + </message> + <message> + <source>Merge two databases.</source> + <translation>Zwei Datenbanken zusammenführen</translation> + </message> + <message> + <source>Path of the database to merge into.</source> + <translation>Pfad der Datenbank, in die zusammengeführt werden soll.</translation> + </message> + <message> + <source>Path of the database to merge from.</source> + <translation>Pfad der Datenbank aus der zusammengeführt werden soll.</translation> + </message> + <message> + <source>Use the same credentials for both database files.</source> + <translation>Verwende dieselben Anmeldedaten für beide Datenbankdateien.</translation> + </message> + <message> + <source>Key file of the database to merge from.</source> + <translation>Schlüsseldatei der Datenbank, aus der zusammengeführt werden soll.</translation> + </message> + <message> + <source>Show an entry's information.</source> + <translation>Informationen eines Eintrags anzeigen.</translation> + </message> + <message> + <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> + <translation>Namen der anzuzeigenden Attribute. Diese Option kann mehr als einmal angegeben werden, wobei jedes Attribut in einer eigenen Zeile in der gegebenen Reihenfolge angegeben wird. Wenn keine Attribute angegeben sind, wird eine Zusammenfassung der Standardattribute gegeben.</translation> + </message> + <message> + <source>attribute</source> + <translation>Attribute</translation> + </message> + <message> + <source>Name of the entry to show.</source> + <translation>Name des anzuzeigenden Eintrags.</translation> + </message> <message> <source>NULL device</source> <translation>NULL-Gerät</translation> @@ -1866,8 +3311,28 @@ Change them only if you know what you are doing.</source> <translation>Schließendes Anführungszeichen fehlt</translation> </message> <message> - <source>INTERNAL - unget lower bound exceeded</source> - <translation>INTERN - unget untere Schranke überschritten</translation> + <source>AES: 256-bit</source> + <translation>AES: 256-bit</translation> + </message> + <message> + <source>Twofish: 256-bit</source> + <translation>Twofish: 256-bit</translation> + </message> + <message> + <source>ChaCha20: 256-bit</source> + <translation>ChaCha20: 256-bit</translation> + </message> + <message> + <source>Argon2 (KDBX 4 – recommended)</source> + <translation>Argon2 (KDBX 4 – empfohlen)</translation> + </message> + <message> + <source>AES-KDF (KDBX 4)</source> + <translation>AES-KDF (KDBX 4)</translation> + </message> + <message> + <source>AES-KDF (KDBX 3.1)</source> + <translation>AES-KDF (KDBX 3.1)</translation> </message> <message> <source>Group</source> @@ -1885,14 +3350,22 @@ Change them only if you know what you are doing.</source> <source>Password</source> <translation>Passwort</translation> </message> - <message> - <source>URL</source> - <translation>URL</translation> - </message> <message> <source>Notes</source> <translation>Notizen</translation> </message> + <message> + <source>Last Modified</source> + <translation>Zuletzt bearbeitet</translation> + </message> + <message> + <source>Created</source> + <translation>Erstellt</translation> + </message> + <message> + <source>Legacy Browser Integration</source> + <translation>Veraltete Browser-Integration</translation> + </message> <message> <source>Browser Integration</source> <translation>Browser-Integration</translation> @@ -1909,6 +3382,10 @@ Change them only if you know what you are doing.</source> <source>Passive</source> <translation>Passiv</translation> </message> + <message> + <source>SSH Agent</source> + <translation>SSH-Agent</translation> + </message> </context> <context> <name>QtIOCompressor</name> @@ -1947,8 +3424,8 @@ Change them only if you know what you are doing.</source> <context> <name>SearchWidget</name> <message> - <source>Case Sensitive</source> - <translation>Groß- /Kleinschreibung beachten</translation> + <source>Search...</source> + <translation>Suche…</translation> </message> <message> <source>Search</source> @@ -1959,8 +3436,8 @@ Change them only if you know what you are doing.</source> <translation>Löschen</translation> </message> <message> - <source>Search...</source> - <translation>Suche…</translation> + <source>Case Sensitive</source> + <translation>Groß- /Kleinschreibung beachten</translation> </message> <message> <source>Limit search to selected group</source> @@ -1969,50 +3446,6 @@ Change them only if you know what you are doing.</source> </context> <context> <name>Service</name> - <message> - <source>A shared encryption-key with the name "%1" already exists. -Do you want to overwrite it?</source> - <translation>Ein freigegebener Chiffrierschlüssel mit dem Namen "%1" existiert schon. -Möchten Sie ihn überschreiben?</translation> - </message> - <message> - <source>Do you want to update the information in %1 - %2?</source> - <translation>Möchten Sie wirklich die Informationen in %1 - %2 aktualisieren?</translation> - </message> - <message> - <source>The active database is locked! -Please unlock the selected database or choose another one which is unlocked.</source> - <translation>Die aktive Datenbank ist gesperrt! -Bitte entsperren Sie die ausgewählte Datenbank oder wählen Sie eine andere, die entsperrt ist.</translation> - </message> - <message> - <source>Successfully removed %1 encryption-%2 from KeePassX/Http Settings.</source> - <translation>%1 Verschlüsselungs-%2 erfolgreich aus KeePassXC/HTTP-Einstellungen entfernt.</translation> - </message> - <message> - <source>No shared encryption-keys found in KeePassHttp Settings.</source> - <translation>Kein freigegebener Chiffrierschlüssel in den KeePassHTTP-Einstellungen gefunden.</translation> - </message> - <message> - <source>The active database does not contain an entry of KeePassHttp Settings.</source> - <translation>Die aktive Datenbank enthält keinen Eintrag für KeePassHTTP Einstellungen.</translation> - </message> - <message> - <source>Removing stored permissions...</source> - <translation>Gespeicherte Berechtigungen werden gelöscht...</translation> - </message> - <message> - <source>Abort</source> - <translation>Abbrechen</translation> - </message> - <message> - <source>Successfully removed permissions from %1 %2.</source> - <translation>Berechtigungen wurden erfolgreich aus %1 %2 gelöscht.</translation> - </message> - <message> - <source>The active database does not contain an entry with permissions.</source> - <translation>The aktive Datenbank enthält keinen Eintrag mit Zugangsdaten.</translation> - </message> <message> <source>KeePassXC: New key association request</source> <translation>KeePassXC: Neue Schlüsselverbindungsanfrage</translation> @@ -2030,34 +3463,78 @@ Namen und akzeptieren Sie.</translation> <source>KeePassXC: Overwrite existing key?</source> <translation>KeePassXC: Bestehenden Schlüssel überschreiben?</translation> </message> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>Ein freigegebener Chiffrierschlüssel mit dem Namen "%1" existiert schon. +Möchten Sie ihn überschreiben?</translation> + </message> <message> <source>KeePassXC: Update Entry</source> <translation>KeePassXC: Eintrag aktualisiert</translation> </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Möchten Sie wirklich die Informationen in %1 - %2 aktualisieren?</translation> + </message> <message> <source>KeePassXC: Database locked!</source> <translation>KeePassXC: Datenbank gesperrt!</translation> </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>Die aktive Datenbank ist gesperrt! +Bitte entsperren Sie die ausgewählte Datenbank oder wählen Sie eine andere, die entsperrt ist.</translation> + </message> <message> <source>KeePassXC: Removed keys from database</source> <translation>KeePassXC: Schlüssel aus der Datenbank entfernt</translation> </message> + <message numerus="yes"> + <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> + <translation><numerusform>%n Schlüssel erfolgreich aus KeePassXC/HTTP-Einstellungen entfernt.</numerusform><numerusform>%n Schlüssel erfolgreich aus KeePassXC/HTTP-Einstellungen entfernt.</numerusform></translation> + </message> <message> <source>KeePassXC: No keys found</source> <translation>KeePassXC: Kein Schlüssel gefunden</translation> </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation>Kein freigegebener Chiffrierschlüssel in den KeePassHTTP-Einstellungen gefunden.</translation> + </message> <message> <source>KeePassXC: Settings not available!</source> <translation>KeePassXC: Einstellung nicht verfügbar!</translation> </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation>Die aktive Datenbank enthält keinen Eintrag für KeePassHTTP Einstellungen.</translation> + </message> + <message> + <source>Removing stored permissions...</source> + <translation>Gespeicherte Berechtigungen werden gelöscht...</translation> + </message> + <message> + <source>Abort</source> + <translation>Abbrechen</translation> + </message> <message> <source>KeePassXC: Removed permissions</source> <translation>KeePassXC: Zugangsdaten entfernt</translation> </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entries.</source> + <translation><numerusform>Gespeicherte Berechtigungen wurden erfolgreich aus %n Eintrag entfernt.</numerusform><numerusform>Gespeicherte Berechtigungen wurden erfolgreich aus %n Einträgen entfernt.</numerusform></translation> + </message> <message> <source>KeePassXC: No entry with permissions found!</source> <translation>KeePassXC: Kein Eintrag mit Zugangsdaten gefunden!</translation> </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>The aktive Datenbank enthält keinen Eintrag mit Zugangsdaten.</translation> + </message> </context> <context> <name>SettingsWidget</name> @@ -2080,10 +3557,26 @@ Namen und akzeptieren Sie.</translation> </context> <context> <name>SettingsWidgetGeneral</name> + <message> + <source>Basic Settings</source> + <translation>Grundeinstellungen</translation> + </message> + <message> + <source>Start only a single instance of KeePassXC</source> + <translation>Nur eine einzige KeePassXC-Instanz starten</translation> + </message> <message> <source>Remember last databases</source> <translation>Letzte Datenbank merken</translation> </message> + <message> + <source>Remember last key files and security dongles</source> + <translation>Letzte Schlüsseldateien und Sicherheits-Dongles merken</translation> + </message> + <message> + <source>Load previous databases on startup</source> + <translation>Letzte Datenbank beim Start laden</translation> + </message> <message> <source>Automatically save on exit</source> <translation>Automatisch speichern beim Schließen</translation> @@ -2092,21 +3585,29 @@ Namen und akzeptieren Sie.</translation> <source>Automatically save after every change</source> <translation>Automatisch nach jeder Änderung speichern</translation> </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation>Datenbank nach externer Änderung automatisch neu laden.</translation> + </message> <message> <source>Minimize when copying to clipboard</source> <translation>Minimieren beim Kopieren in die Zwischenablage</translation> </message> + <message> + <source>Minimize window at application startup</source> + <translation>Fenster beim Programmstart minimieren</translation> + </message> <message> <source>Use group icon on entry creation</source> <translation>Gruppensymbol für das Erstellen neuer Einträge verwenden</translation> </message> <message> - <source>Global Auto-Type shortcut</source> - <translation>Globale Tastenkombination für Auto-Type</translation> + <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> + <translation>Datenbank nicht als geändert markieren für geringfügige Änderungen (z.B. Ausklappen von Gruppen)</translation> </message> <message> - <source>Language</source> - <translation>Sprache</translation> + <source>Hide the Details view</source> + <translation>Detailansicht verstecken</translation> </message> <message> <source>Show a system tray icon</source> @@ -2116,67 +3617,61 @@ Namen und akzeptieren Sie.</translation> <source>Hide window to system tray when minimized</source> <translation>Fenster verstecken wenn minimiert</translation> </message> - <message> - <source>Load previous databases on startup</source> - <translation>Letzte Datenbank beim Start laden</translation> - </message> - <message> - <source>Automatically reload the database when modified externally</source> - <translation>Datenbank nach externer Änderung automatisch neu laden.</translation> - </message> <message> <source>Hide window to system tray instead of app exit</source> <translation>Fenster zur Taskleiste minimieren statt das Programm zu beenden</translation> </message> <message> - <source>Minimize window at application startup</source> - <translation>Fenster beim Programmstart minimieren</translation> + <source>Dark system tray icon</source> + <translation>Dunkles Taskleistensymbol</translation> </message> <message> - <source>Basic Settings</source> - <translation>Grundeinstellungen</translation> - </message> - <message> - <source>Remember last key files and security dongles</source> - <translation>Letzte Schlüsseldateien und Sicherheits-Dongles merken</translation> - </message> - <message> - <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> - <translation>Datenbank nicht als geändert markieren für geringfügige Änderungen (z.B. Ausklappen von Gruppen)</translation> + <source>Language</source> + <translation>Sprache</translation> </message> <message> <source>Auto-Type</source> <translation>Auto-Type</translation> </message> <message> - <source>Use entry title and URL to match windows for global Auto-Type</source> - <translation>Verwende Eintrags-Titel und URL, um Fenster für globales Auto-Type auszuwählen</translation> + <source>Use entry title to match windows for global Auto-Type</source> + <translation>Verwende Eintragstitel, um entsprechende Fenster für globales Auto-Type zu finden</translation> + </message> + <message> + <source>Use entry URL to match windows for global Auto-Type</source> + <translation>Verwende URL, um Fenster für globales Auto-Type zu finden.</translation> </message> <message> <source>Always ask before performing Auto-Type</source> <translation>Immer vor einem Auto-Type fragen</translation> </message> + <message> + <source>Global Auto-Type shortcut</source> + <translation>Globale Tastenkombination für Auto-Type</translation> + </message> <message> <source>Auto-Type delay</source> <translation>Auto-Type-Verzögerung</translation> </message> <message> <source> ms</source> + <comment>Milliseconds</comment> <translation>ms</translation> </message> - <message> - <source>Start only a single instance of KeePassXC</source> - <translation>Nur eine einzige KeePassXC-Instanz starten</translation> - </message> </context> <context> <name>SettingsWidgetSecurity</name> + <message> + <source>Timeouts</source> + <translation>Timeouts</translation> + </message> <message> <source>Clear clipboard after</source> <translation>Zwischenablage leeren nach</translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation> sek</translation> </message> <message> @@ -2184,8 +3679,12 @@ Namen und akzeptieren Sie.</translation> <translation>Datenbank sperren nach einer Inaktivität von</translation> </message> <message> - <source>Show passwords in cleartext by default</source> - <translation>Passwörter standardmäßig im Klartext anzeigen</translation> + <source>Convenience</source> + <translation>Komfort</translation> + </message> + <message> + <source>Lock databases when session is locked or lid is closed</source> + <translation>Datenbank schließen, wenn Sitzung geschlossen oder Deckel zugeklappt wird</translation> </message> <message> <source>Lock databases after minimizing the window</source> @@ -2196,16 +3695,16 @@ Namen und akzeptieren Sie.</translation> <translation>Keine erneute Passworteingabe verlangen, wenn das Passwort sichtbar ist.</translation> </message> <message> - <source>Timeouts</source> - <translation>Timeouts</translation> + <source>Show passwords in cleartext by default</source> + <translation>Passwörter standardmäßig im Klartext anzeigen</translation> </message> <message> - <source>Convenience</source> - <translation>Komfort</translation> + <source>Hide passwords in the preview panel</source> + <translation>Passwörter in Vorschau-Panel verstecken</translation> </message> <message> - <source>Lock databases when session is locked or lid is closed</source> - <translation>Datenbank schließen, wenn Sitzung geschlossen oder Deckel zugeklappt wird</translation> + <source>Hide entry notes by default</source> + <translation>Eintrags-Notizen standardmäßig verstecken</translation> </message> <message> <source>Privacy</source> @@ -2226,6 +3725,14 @@ Namen und akzeptieren Sie.</translation> <source>Key:</source> <translation>Schlüssel:</translation> </message> + <message> + <source>Default RFC 6238 token settings</source> + <translation>RFC 6238-Token-Standardeinstellungen</translation> + </message> + <message> + <source>Steam token settings</source> + <translation>Steam-Tokeneinstellungen</translation> + </message> <message> <source>Use custom settings</source> <translation>Verwende eigene Einstellungen</translation> @@ -2252,6 +3759,7 @@ Namen und akzeptieren Sie.</translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation> sek</translation> </message> </context> @@ -2318,6 +3826,26 @@ Namen und akzeptieren Sie.</translation> </context> <context> <name>main</name> + <message> + <source>Remove an entry from the database.</source> + <translation>Eintrag aus der Datenbank entfernen</translation> + </message> + <message> + <source>Path of the database.</source> + <translation>Pfad zur Datenbank.</translation> + </message> + <message> + <source>Path of the entry to remove.</source> + <translation>Pfad des zu entfernenden Eintrags.</translation> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation>KeePassXC - Plattformübergreifender Passwortmanager</translation> + </message> + <message> + <source>filenames of the password databases to open (*.kdbx)</source> + <translation>Dateinamen der zu öffnenden Datenbanken (*.kdbx)</translation> + </message> <message> <source>path to a custom config file</source> <translation>Pfad zu einer benutzerdefinierten Konfigurationsdatei</translation> @@ -2326,81 +3854,13 @@ Namen und akzeptieren Sie.</translation> <source>key file of the database</source> <translation>Schlüsseldatei der Datenbank</translation> </message> - <message> - <source>KeePassXC - cross-platform password manager</source> - <translation>KeePassXC - Plattformübergreifender Passwortmanager</translation> - </message> <message> <source>read password of the database from stdin</source> <translation>Passwort der Datenbank von stdin lesen</translation> </message> <message> - <source>filenames of the password databases to open (*.kdbx)</source> - <translation>Dateinamen der zu öffnenden Datenbanken (*.kdbx)</translation> - </message> - <message> - <source>Copy a password to the clipboard</source> - <translation>Passwort in die Zwischenablage kopieren</translation> - </message> - <message> - <source>Path of the database.</source> - <translation>Pfad zur Datenbank.</translation> - </message> - <message> - <source>Use a GUI prompt unlocking the database.</source> - <translation>Verwende grafische Eingabeaufforderung zum Entsperren der Datenbank</translation> - </message> - <message> - <source>Name of the entry to clip.</source> - <translation>Name des in die Zwischenablage zu kopierenden Eintrags.</translation> - </message> - <message> - <source>Extract and print the content of a database.</source> - <translation>Inhalt der Datenbank extrahieren und anzeigen.</translation> - </message> - <message> - <source>Path of the database to extract.</source> - <translation>Pfad der zu extrahierenden Datenbank.</translation> - </message> - <message> - <source>Name of the command to execute.</source> - <translation>Name des auszuführenden Befehls.</translation> - </message> - <message> - <source>List database entries.</source> - <translation>Datenbankeinträge auflisten.</translation> - </message> - <message> - <source>Path of the group to list. Default is /</source> - <translation>Pfad der aufzulistenden Gruppe. Standard ist /.</translation> - </message> - <message> - <source>Print the UUIDs of the entries and groups.</source> - <translation>UUIDs der Einträge und Gruppen anzeigen.</translation> - </message> - <message> - <source>Merge two databases.</source> - <translation>Zwei Datenbanken zusammenführen</translation> - </message> - <message> - <source>Path of the database to merge into.</source> - <translation>Pfad der Datenbank, in die zusammengeführt werden soll.</translation> - </message> - <message> - <source>Path of the database to merge from.</source> - <translation>Pfad der Datenbank aus der zusammengeführt werden soll.</translation> - </message> - <message> - <source>Use the same password for both database files.</source> - <translation>Verwende gleiches Passwort für beide Datenbank-Dateien.</translation> - </message> - <message> - <source>Show a password.</source> - <translation>Ein Passwort anzeigen</translation> - </message> - <message> - <source>Name of the entry to show.</source> - <translation>Name des anzuzeigenden Eintrags.</translation> + <source>Parent window handle</source> + <translation>Eltern-Fenster-Handle</translation> </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_el.ts b/share/translations/keepassx_el.ts index 5224c0242..c6a7f9cf9 100644 --- a/share/translations/keepassx_el.ts +++ b/share/translations/keepassx_el.ts @@ -9,14 +9,34 @@ <source>About</source> <translation>Σχετικά</translation> </message> + <message> + <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> + <translation>Αναφέρετε σφάλματα στο: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> + </message> + <message> + <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>Το KeePassXC διανέμεται υπό τους όρους του GNU General Public License (GPL) έκδοση 2 ή (κατά την επιλογή σας) έκδοση 3.</translation> + </message> + <message> + <source>Project Maintainers:</source> + <translation type="unfinished"/> + </message> <message> <source>Contributors</source> <translation>Συνεισφέροντες</translation> </message> + <message> + <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Δείτε τους Συνεισφέροντες στο GitHub</a></translation> + </message> <message> <source>Debug Info</source> <translation>Πληροφορίες Αποσφαλμάτωσης</translation> </message> + <message> + <source>Include the following information whenever you report a bug:</source> + <translation>Συμπεριλάβετε τις ακόλουθες πληροφορίες όποτε αναφέρετε κάποιο σφάλμα:</translation> + </message> <message> <source>Copy to clipboard</source> <translation>Αντιγραφή στο πρόχειρο</translation> @@ -31,6 +51,10 @@ <source>Revision: %1</source> <translation>Αναθεώρηση: %1</translation> </message> + <message> + <source>Distribution: %1</source> + <translation type="unfinished"/> + </message> <message> <source>Libraries:</source> <translation>Βιβλιοθήκες:</translation> @@ -47,33 +71,13 @@ Kernel: %3 %4</source> <source>Enabled extensions:</source> <translation>Ενεργοποιημένες επεκτάσεις:</translation> </message> - <message> - <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> - <translation>Αναφέρετε σφάλματα στο: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> - </message> - <message> - <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>Το KeePassXC διανέμεται υπό τους όρους του GNU General Public License (GPL) έκδοση 2 ή (κατά την επιλογή σας) έκδοση 3.</translation> - </message> - <message> - <source>Project Maintainers:</source> - <translation type="unfinished"/> - </message> - <message> - <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Δείτε τους Συνεισφέροντες στο GitHub</a></translation> - </message> - <message> - <source>Include the following information whenever you report a bug:</source> - <translation>Συμπεριλάβετε τις ακόλουθες πληροφορίες όποτε αναφέρετε κάποιο σφάλμα:</translation> - </message> - <message> - <source>Distribution: %1</source> - <translation type="unfinished"/> - </message> </context> <context> <name>AccessControlDialog</name> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>KeePassXC HTTP Επιβεβαίωση Πρόσβασης</translation> + </message> <message> <source>Remember this decision</source> <translation>Να θυμάσαι αυτή την απόφαση</translation> @@ -92,9 +96,12 @@ Please select whether you want to allow access.</source> <translation>%1 έχει ζητήσει πρόσβαση σε κωδικούς για το/τα ακόλουθο/α αντικείμενο/α. Παρακαλώ επιλέξετε εάν θέλετε να επιτρέψετε τη πρόσβαση.</translation> </message> +</context> +<context> + <name>AgentSettingsWidget</name> <message> - <source>KeePassXC HTTP Confirm Access</source> - <translation>KeePassXC HTTP Επιβεβαίωση Πρόσβασης</translation> + <source>Enable SSH Agent (requires restart)</source> + <translation type="unfinished"/> </message> </context> <context> @@ -107,6 +114,26 @@ Please select whether you want to allow access.</source> <source>Auto-Type - KeePassXC</source> <translation>Auto-Type - KeePassXC</translation> </message> + <message> + <source>Auto-Type</source> + <translation>Αυτόματη-Γραφή</translation> + </message> + <message> + <source>The Syntax of your Auto-Type statement is incorrect!</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> </context> <context> <name>AutoTypeAssociationsModel</name> @@ -125,13 +152,289 @@ Please select whether you want to allow access.</source> </context> <context> <name>AutoTypeSelectDialog</name> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>Auto-Type - KeePassXC</translation> + </message> <message> <source>Select entry to Auto-Type:</source> <translation>Επιλέξτε καταχώρηση για αυτόματη γραφή:</translation> </message> +</context> +<context> + <name>BrowserAccessControlDialog</name> <message> - <source>Auto-Type - KeePassXC</source> - <translation>Auto-Type - KeePassXC</translation> + <source>KeePassXC-Browser Confirm Access</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remember this decision</source> + <translation>Να θυμάσαι αυτή την απόφαση</translation> + </message> + <message> + <source>Allow</source> + <translation>Αποδοχή</translation> + </message> + <message> + <source>Deny</source> + <translation>Άρνηση</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 έχει ζητήσει πρόσβαση σε κωδικούς για το/τα ακόλουθο/α αντικείμενο/α. +Παρακαλώ επιλέξετε εάν θέλετε να επιτρέψετε τη πρόσβαση.</translation> + </message> +</context> +<context> + <name>BrowserOptionDialog</name> + <message> + <source>Dialog</source> + <translation>Διάλογος</translation> + </message> + <message> + <source>This is required for accessing your databases with KeePassXC-Browser</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable KeepassXC browser integration</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>Γενικά</translation> + </message> + <message> + <source>Enable integration for these browsers:</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Google Chrome</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Firefox</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Chromium</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Vivaldi</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show a &notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Match URL scheme (e.g., https://...)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return only best-matching credentials</source> + <translation type="unfinished"/> + </message> + <message> + <source>Sort &matching credentials by title</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Sort matching credentials by &username</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>&Disconnect all browsers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Forget all remembered &permissions</source> + <translation type="unfinished"/> + </message> + <message> + <source>Advanced</source> + <translation>Για προχωρημένους</translation> + </message> + <message> + <source>Never &ask before accessing credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Never ask before &updating credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searc&h in all opened databases for matching credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation type="unfinished"/> + </message> + <message> + <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Update &native messaging manifest files at startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Support a proxy application between KeePassXC and browser extension.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &proxy application between KeePassXC and browser extension</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a custom proxy location if you installed a proxy manually.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &custom proxy location</source> + <comment>Meant is the proxy for KeePassXC-Browser</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*.exe);;All Files (*.*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select custom proxy location</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>BrowserService</name> + <message> + <source>KeePassXC: New key association request</source> + <translation type="unfinished"/> + </message> + <message> + <source>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Save and allow access</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: Αντικατάσταση τρέχοντος κλειδιού;</translation> + </message> + <message> + <source>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: Ενημέρωση Καταχώρησης</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: Βάση δεδομένων κλειδωμένη!</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: Ρυθμισμένες μη διαθέσιμες!</translation> + </message> + <message> + <source>The active database does not contain a settings entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: Δε βρεθήκαν κλειδιά</translation> + </message> + <message> + <source>No shared encryption keys found in KeePassXC Settings.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: Κλειδιά αφαιρέθηκαν από τη βάση</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Removing stored permissions…</source> + <translation type="unfinished"/> + </message> + <message> + <source>Abort</source> + <translation>Διακοπή</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: Δικαιώματα αφαιρέθηκαν</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entry(s).</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation>KeePassXC: Δε βρέθηκε καταχώρηση με δικαιώματα!</translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation type="unfinished"/> </message> </context> <context> @@ -148,6 +451,10 @@ Please select whether you want to allow access.</source> <source>Repeat password:</source> <translation>Επαναλάβετε τον κωδικό:</translation> </message> + <message> + <source>&Key file</source> + <translation>&Αρχείο κλειδί</translation> + </message> <message> <source>Browse</source> <translation>Αναζήτηση</translation> @@ -156,6 +463,14 @@ Please select whether you want to allow access.</source> <source>Create</source> <translation>Δημιουργία</translation> </message> + <message> + <source>Cha&llenge Response</source> + <translation type="unfinished"/> + </message> + <message> + <source>Refresh</source> + <translation>Ανανέωση</translation> + </message> <message> <source>Key files</source> <translation>Αρχεία κλειδιά</translation> @@ -176,13 +491,17 @@ Please select whether you want to allow access.</source> <source>Select a key file</source> <translation>Επιλέξτε ένα αρχείο κλειδί</translation> </message> + <message> + <source>Empty password</source> + <translation>Κενός κωδικός</translation> + </message> <message> <source>Do you really want to use an empty string as password?</source> <translation>Θέλετε στα αλήθεια να χρησιμοποιήσετε μια άδεια σειρά σαν κωδικό;</translation> </message> <message> <source>Different passwords supplied.</source> - <translation>Έχετε εισάγει διαφορετικούς κωδικούς.</translation> + <translation>Παρέχονται διαφορετικοί κωδικοί.</translation> </message> <message> <source>Failed to set %1 as the Key file: @@ -190,20 +509,15 @@ Please select whether you want to allow access.</source> <translation>Αποτυχία ορισμού του %1 ως αρχείου κλειδιού</translation> </message> <message> - <source>&Key file</source> - <translation>&Αρχείο κλειδί</translation> - </message> - <message> - <source>Cha&llenge Response</source> + <source>Legacy key file format</source> <translation type="unfinished"/> </message> <message> - <source>Refresh</source> - <translation>Ανανέωση</translation> - </message> - <message> - <source>Empty password</source> - <translation>Κενός κωδικός</translation> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -216,6 +530,10 @@ Please select whether you want to allow access.</source> <source>Clone Options</source> <translation>Κλωνοποίηση Επιλογών</translation> </message> + <message> + <source>Append ' - Clone' to title</source> + <translation type="unfinished"/> + </message> <message> <source>Replace username and password with references</source> <translation>Αντικατάσταση του ονόματος χρήστη και του κωδικού με παραπομπές</translation> @@ -224,10 +542,6 @@ Please select whether you want to allow access.</source> <source>Copy history</source> <translation>Αντιγραφή ιστορικού</translation> </message> - <message> - <source>Append ' - Clone' to title</source> - <translation type="unfinished"/> - </message> </context> <context> <name>CsvImportWidget</name> @@ -323,10 +637,6 @@ Please select whether you want to allow access.</source> </context> <context> <name>CsvImportWizard</name> - <message> - <source>Import CSV file</source> - <translation>Εισαγωγή αρχείου CSV</translation> - </message> <message> <source>Error</source> <translation>Σφάλμα</translation> @@ -338,17 +648,17 @@ Please select whether you want to allow access.</source> </context> <context> <name>CsvParserModel</name> - <message> - <source> byte, </source> - <translation> byte, </translation> + <message numerus="yes"> + <source>%n byte(s), </source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> - <message> - <source> rows, </source> - <translation> γραμμές, </translation> + <message numerus="yes"> + <source>%n row(s), </source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> - <message> - <source> columns</source> - <translation> στήλες</translation> + <message numerus="yes"> + <source>%n column(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> </context> <context> @@ -369,17 +679,40 @@ Please select whether you want to allow access.</source> <source>Browse</source> <translation>Αναζήτηση</translation> </message> + <message> + <source>Refresh</source> + <translation>Ανανέωση</translation> + </message> + <message> + <source>Challenge Response:</source> + <translation>Απόκριση Πρόκλησης:</translation> + </message> <message> <source>Unable to open the database.</source> - <translation>Αδύνατο να ανοιχτεί η βάση δεδομένων.</translation> + <translation>Δεν είναι δυνατό να ανοίξει τη βάση δεδομένων.</translation> </message> <message> <source>Can't open key file</source> - <translation>Αποτυχία ανοίγματος αρχείο κλειδιού</translation> + <translation>Δεν είναι δυνατό να ανοίξει αρχείο κλειδιού</translation> + </message> + <message> + <source>Legacy key file format</source> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't show this warning again</source> + <translation type="unfinished"/> </message> <message> <source>All files</source> - <translation>Όλα τα αρχεία </translation> + <translation>Όλα τα αρχεία</translation> </message> <message> <source>Key files</source> @@ -389,14 +722,6 @@ Please select whether you want to allow access.</source> <source>Select key file</source> <translation>Επιλέξτε αρχείο κλειδί</translation> </message> - <message> - <source>Refresh</source> - <translation>Ανανέωση</translation> - </message> - <message> - <source>Challenge Response:</source> - <translation>Απόκριση Πρόκλησης:</translation> - </message> </context> <context> <name>DatabaseRepairWidget</name> @@ -412,14 +737,14 @@ Please select whether you want to allow access.</source> <source>Can't open key file</source> <translation>Δεν είναι δυνατό να ανοίξει αρχείο κλειδιού</translation> </message> - <message> - <source>Database opened fine. Nothing to do.</source> - <translation>Μια χαρά το άνοιγμα βάσης δεδομένων. Τίποτα να κάνει.</translation> - </message> <message> <source>Unable to open the database.</source> <translation>Δεν είναι δυνατό να ανοίξει τη βάση δεδομένων.</translation> </message> + <message> + <source>Database opened fine. Nothing to do.</source> + <translation>Μια χαρά το άνοιγμα βάσης δεδομένων. Τίποτα να κάνει.</translation> + </message> <message> <source>Success</source> <translation>Επιτυχία</translation> @@ -437,40 +762,57 @@ You can now save it.</source> <context> <name>DatabaseSettingsWidget</name> <message> - <source>Database name:</source> - <translation>Όνομα βάσης δεδομένων:</translation> + <source>General</source> + <translation>Γενικά</translation> </message> <message> - <source>Database description:</source> - <translation>Περιγραφή βάσης δεδομένων:</translation> + <source>Encryption</source> + <translation type="unfinished"/> </message> <message> - <source>Transform rounds:</source> - <translation>Μετατρεπόμενοι γύροι:</translation> + <source>Number of rounds too high</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> </message> <message> - <source>Default username:</source> - <translation>Προεπιλεγμένο όνομα χρήστη:</translation> + <source>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</source> + <translation type="unfinished"/> </message> <message> - <source> MiB</source> - <translation>MiB</translation> + <source>Understood, keep number</source> + <translation type="unfinished"/> </message> <message> - <source>Benchmark</source> - <translation>Σημείο αναφοράς</translation> + <source>Cancel</source> + <translation type="unfinished"/> </message> <message> - <source>Max. history items:</source> - <translation>Μέγιστα αντικείμενα ιστορικού:</translation> + <source>Number of rounds too low</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> </message> <message> - <source>Max. history size:</source> - <translation>Μέγιστο μέγεθος ιστορικού:</translation> + <source>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</source> + <translation type="unfinished"/> </message> <message> - <source>Use recycle bin</source> - <translation>Χρήση κάδου ανακύκλωσης</translation> + <source>KDF unchanged</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetEncryption</name> + <message> + <source>Encryption Algorithm:</source> + <translation type="unfinished"/> </message> <message> <source>AES: 256 Bit (default)</source> @@ -481,14 +823,78 @@ You can now save it.</source> <translation>Twofish: 256 Bit</translation> </message> <message> - <source>Algorithm:</source> - <translation>Αλγόριθμος:</translation> + <source>Key Derivation Function:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Transform rounds:</source> + <translation>Μετατρεπόμενοι γύροι:</translation> + </message> + <message> + <source>Benchmark 1-second delay</source> + <translation type="unfinished"/> + </message> + <message> + <source>Memory Usage:</source> + <translation type="unfinished"/> + </message> + <message> + <source> MB</source> + <translation type="unfinished"/> + </message> + <message> + <source>Parallelism:</source> + <translation type="unfinished"/> + </message> + <message> + <source> thread</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetGeneral</name> + <message> + <source>Database Meta Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database name:</source> + <translation>Όνομα βάσης δεδομένων:</translation> + </message> + <message> + <source>Database description:</source> + <translation>Περιγραφή βάσης δεδομένων:</translation> + </message> + <message> + <source>Default username:</source> + <translation>Προεπιλεγμένο όνομα χρήστη:</translation> + </message> + <message> + <source>History Settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Max. history items:</source> + <translation>Μέγιστα αντικείμενα ιστορικού:</translation> + </message> + <message> + <source>Max. history size:</source> + <translation>Μέγιστο μέγεθος ιστορικού:</translation> + </message> + <message> + <source> MiB</source> + <translation>MiB</translation> + </message> + <message> + <source>Use recycle bin</source> + <translation>Χρήση κάδου ανακύκλωσης</translation> </message> </context> <context> <name>DatabaseTabWidget</name> <message> <source>Root</source> + <comment>Root group</comment> <translation>Ρίζα</translation> </message> <message> @@ -501,12 +907,36 @@ You can now save it.</source> </message> <message> <source>Open database</source> - <translation>Άνοιγμα βάσης δεδομένων</translation> + <translation>Άνοιγμα Βάσης Δεδομένων</translation> </message> <message> <source>File not found!</source> <translation>Αρχείο δεν βρέθηκε!</translation> </message> + <message> + <source>Unable to open the database.</source> + <translation>Δεν είναι δυνατό να ανοίξει τη βάση δεδομένων.</translation> + </message> + <message> + <source>File opened in read only mode.</source> + <translation>Αρχείο ανοιχτό μόνο για ανάγνωση.</translation> + </message> + <message> + <source>Open CSV file</source> + <translation>Άνοιγμα αρχείου CSV</translation> + </message> + <message> + <source>CSV file</source> + <translation>αρχείο CSV</translation> + </message> + <message> + <source>All files (*)</source> + <translation>Όλα τα αρχεία (*)</translation> + </message> + <message> + <source>Merge database</source> + <translation>Συγχώνευση βάσης δεδομένων</translation> + </message> <message> <source>Open KeePass 1 database</source> <translation>Άνοιγμα βάσης δεδομένων KeePass 1</translation> @@ -515,14 +945,16 @@ You can now save it.</source> <source>KeePass 1 database</source> <translation>Βάση δεδομένων KeePass 1</translation> </message> - <message> - <source>All files (*)</source> - <translation>Όλα τα αρχεία (*)</translation> - </message> <message> <source>Close?</source> <translation>Κλείσιμο;</translation> </message> + <message> + <source>"%1" is in edit mode. +Discard changes and close anyway?</source> + <translation>"%1" είναι σε λειτουργεία επεξεργασίας. +Απόρριψη αλλαγών και κλείσιμο ούτως η άλλως;</translation> + </message> <message> <source>Save changes?</source> <translation>Αποθήκευση αλλαγών;</translation> @@ -537,13 +969,25 @@ Save changes?</source> <source>Writing the database failed.</source> <translation>Εγγραφή της βάσης δεδομένων απέτυχε.</translation> </message> + <message> + <source>Passwords</source> + <translation>Κωδικοί</translation> + </message> <message> <source>Save database as</source> - <translation>Αποθήκευση βάσης δεδομένων σαν</translation> + <translation>Αποθήκευση βάσης δεδομένων ως</translation> + </message> + <message> + <source>Export database to CSV file</source> + <translation>Εξαγωγή βάσης δεδομένων σε αρχείο CSV</translation> + </message> + <message> + <source>Writing the CSV file failed.</source> + <translation>Γράψιμο στο αρχείο CSV απέτυχε.</translation> </message> <message> <source>New database</source> - <translation>Νέα βάση δεδομένων</translation> + <translation>Νέα Βάση Δεδομένων</translation> </message> <message> <source>locked</source> @@ -558,12 +1002,6 @@ Save changes?</source> Please press cancel to finish your changes or discard them.</source> <translation>Η βάση δεδομένων δεν μπορεί να κλειδωθεί γιατί την επεξεργάζεται αυτην την στιγμή. Παρακαλώ πατήστε άκυρο για να αποθηκεύσετε τις αλλαγές σας η να τις απορρίψετε.</translation> - </message> - <message> - <source>This database has never been saved. -You can save the database or stop locking it.</source> - <translation>Αυτή η βάση δεδομένων δεν έχει αποθηκευτεί ποτέ. -Μπορείται να την αποθηκεύσετε ή να σταματήσετε να την κλειδώνετε.</translation> </message> <message> <source>This database has been modified. @@ -573,68 +1011,13 @@ Otherwise your changes are lost.</source> Θέλετε να αποθηκεύσετε τις αλλαγές σας πρίν την κλειδώσετε: Αλλιώς οι αλλαγές σας θα χαθούν.</translation> </message> - <message> - <source>"%1" is in edit mode. -Discard changes and close anyway?</source> - <translation>"%1" είναι σε λειτουργεία επεξεργασίας. -Απόρριψη αλλαγών και κλείσιμο ούτως η άλλως;</translation> - </message> - <message> - <source>Export database to CSV file</source> - <translation>Εξαγωγή βάσης δεδομένων σε αρχείο CSV</translation> - </message> - <message> - <source>CSV file</source> - <translation>αρχείο CSV</translation> - </message> - <message> - <source>Writing the CSV file failed.</source> - <translation>Γράψιμο στο αρχείο CSV απέτυχε.</translation> - </message> - <message> - <source>Unable to open the database.</source> - <translation>Δεν είναι δυνατό να ανοίξει τη βάση δεδομένων.</translation> - </message> - <message> - <source>Merge database</source> - <translation>Συγχώνευση βάσης δεδομένων</translation> - </message> - <message> - <source>The database you are trying to save as is locked by another instance of KeePassXC. -Do you want to save it anyway?</source> - <translation>Η βάση δεδομένων που προσπαθείτε να αποθηκεύσετε ως είναι κλειδωμένη από μία άλλη διεργασία του KeePassXC. -Θέλετε να την αποθηκεύσετε ούτως η άλλως;</translation> - </message> - <message> - <source>Passwords</source> - <translation>Κωδικοί</translation> - </message> - <message> - <source>Database already opened</source> - <translation>Βάση δεδομένων ήδη ανοιχτή</translation> - </message> - <message> - <source>The database you are trying to open is locked by another instance of KeePassXC. - -Do you want to open it anyway?</source> - <translation>Η βάση δεδομένων που προσπαθείτε να ανοίξετε είναι κλειδωμένη από μία άλλη διεργασία του KeePassXC. -Θέλετε να την ανοίξετε ούτως η άλλως;</translation> - </message> - <message> - <source>Open read-only</source> - <translation>Άνοιγμα μόνο για ανάγνωση</translation> - </message> - <message> - <source>File opened in read only mode.</source> - <translation>Αρχείο ανοιχτό μόνο για ανάγνωση.</translation> - </message> - <message> - <source>Open CSV file</source> - <translation>Άνοιγμα αρχείου CSV</translation> - </message> </context> <context> <name>DatabaseWidget</name> + <message> + <source>Searching...</source> + <translation>Αναζήτηση...</translation> + </message> <message> <source>Change master key</source> <translation>Αλλαγή πρωτεύοντος κλειδιού</translation> @@ -655,6 +1038,14 @@ Do you want to open it anyway?</source> <source>Do you really want to delete %1 entries for good?</source> <translation>Θέλετε πραγματικά να διαγράψετε %1 καταχωρήσεις για πάντα;</translation> </message> + <message> + <source>Move entry to recycle bin?</source> + <translation>Κίνηση εισόδου στον κάδο ανακύκλωσης;</translation> + </message> + <message> + <source>Do you really want to move entry "%1" to the recycle bin?</source> + <translation>Θέλετε πραγματικά να κινηθεί εισόδου "%1" στον κάδο ανακύκλωσης;</translation> + </message> <message> <source>Move entries to recycle bin?</source> <translation>Μετακίνηση καταχωρήσεων στο καλάθι των αχρήστων;</translation> @@ -663,6 +1054,18 @@ Do you want to open it anyway?</source> <source>Do you really want to move %n entry(s) to the recycle bin?</source> <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> + <message> + <source>Execute command?</source> + <translation>Εκτέλεση εντολής;</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation>Θέλετε πραγματικά να εκτελέσετε την ακόλουθη εντολή;<br><br>%1<br></translation> + </message> + <message> + <source>Remember my choice</source> + <translation>Να θυμάσαι αυτή την επιλογή</translation> + </message> <message> <source>Delete group?</source> <translation>Διαγραφή ομάδας;</translation> @@ -675,18 +1078,6 @@ Do you want to open it anyway?</source> <source>Unable to calculate master key</source> <translation>Σε θέση να υπολογίσει το κύριο κλειδί</translation> </message> - <message> - <source>Move entry to recycle bin?</source> - <translation>Κίνηση εισόδου στον κάδο ανακύκλωσης;</translation> - </message> - <message> - <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation>Θέλετε πραγματικά να κινηθεί εισόδου "%1" στον κάδο ανακύκλωσης;</translation> - </message> - <message> - <source>Searching...</source> - <translation>Αναζήτηση...</translation> - </message> <message> <source>No current database.</source> <translation>Καμία τρέχουσα βάση δεδομένων.</translation> @@ -704,20 +1095,8 @@ Do you want to open it anyway?</source> <translation>Δεν Υπάρχουν Αποτελέσματα</translation> </message> <message> - <source>Execute command?</source> - <translation>Εκτέλεση εντολής;</translation> - </message> - <message> - <source>Do you really want to execute the following command?<br><br>%1<br></source> - <translation>Θέλετε πραγματικά να εκτελέσετε την ακόλουθη εντολή;<br><br>%1<br></translation> - </message> - <message> - <source>Remember my choice</source> - <translation>Να θυμάσαι αυτή την επιλογή</translation> - </message> - <message> - <source>Autoreload Request</source> - <translation>Αίτημα Αυτόματης Επαναφόρτισης</translation> + <source>File has changed</source> + <translation type="unfinished"/> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -728,8 +1107,9 @@ Do you want to open it anyway?</source> <translation>Αίτημα Συγχώνευσης</translation> </message> <message> - <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> - <translation>Η βάση δεδομένων έχει αλλάξει και έχετε μη αποθηκευμένες αλλαγές. Θέλετε να ενσωματώσετε τις αλλαγές σας;</translation> + <source>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</source> + <translation type="unfinished"/> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -744,6 +1124,89 @@ Do you want to open it anyway?</source> <translation>Είστε σίγουροι ότι θέλετε να διαγράψετε μόνιμα τα πάντα από το κάδο ανακύκλωσής σας;</translation> </message> </context> +<context> + <name>DetailsWidget</name> + <message> + <source>Generate TOTP Token</source> + <translation type="unfinished"/> + </message> + <message> + <source>Close</source> + <translation>Κλείσιμο</translation> + </message> + <message> + <source>General</source> + <translation>Γενικά</translation> + </message> + <message> + <source>Password</source> + <translation>Κωδικός</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Expiration</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username</source> + <translation>Όνομα χρήστη</translation> + </message> + <message> + <source>Autotype</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searching</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attributes</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation>Συνημμένα</translation> + </message> + <message> + <source>Notes</source> + <translation>Σημειώσεις</translation> + </message> + <message> + <source>Window</source> + <translation>Παράθυρο</translation> + </message> + <message> + <source>Sequence</source> + <translation>Ακολουθία</translation> + </message> + <message> + <source>Search</source> + <translation>Αναζήτηση</translation> + </message> + <message> + <source>Clear</source> + <translation type="unfinished"/> + </message> + <message> + <source>Never</source> + <translation type="unfinished"/> + </message> + <message> + <source>[PROTECTED]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Disabled</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enabled</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EditEntryWidget</name> <message> @@ -770,6 +1233,30 @@ Do you want to open it anyway?</source> <source>History</source> <translation>Ιστορικό</translation> </message> + <message> + <source>SSH Agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>(encrypted)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>File too large to be a private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open private key</source> + <translation type="unfinished"/> + </message> <message> <source>Entry history</source> <translation>Ιστορικό καταχωρήσεων</translation> @@ -791,22 +1278,20 @@ Do you want to open it anyway?</source> <translation>Νέο χαρακτηριστικό</translation> </message> <message> - <source>Select file</source> - <translation>Επιλογή αρχείου</translation> + <source>Confirm Remove</source> + <translation>Επιβεβαίωση Αφαίρεσης</translation> </message> <message> - <source>Unable to open file</source> - <translation>Αποτυχία ανοίγματος αρχείου</translation> + <source>Are you sure you want to remove this attribute?</source> + <translation>Είστε σίγουροι ότι θέλετε να αφαιρέσετε αυτό το χαρακτηριστικό.</translation> </message> <message> - <source>Save attachment</source> - <translation>Αποθήκευση συνημμένου</translation> + <source>[PROTECTED]</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to save the attachment: -</source> - <translation>Αποτυχία αποθήκευσης συνημμένου. -</translation> + <source>Press reveal to view or edit</source> + <translation type="unfinished"/> </message> <message> <source>Tomorrow</source> @@ -824,22 +1309,6 @@ Do you want to open it anyway?</source> <source>1 year</source> <translation>1 χρόνο</translation> </message> - <message> - <source>Confirm Remove</source> - <translation>Επιβεβαίωση Αφαίρεσης</translation> - </message> - <message> - <source>Are you sure you want to remove this attribute?</source> - <translation>Είστε σίγουροι ότι θέλετε να αφαιρέσετε αυτό το χαρακτηριστικό.</translation> - </message> - <message> - <source>[PROTECTED] Press reveal to view or edit</source> - <translation>[ΠΡΟΣΤΑΤΕΥΜΕΝΟ] Πατήστε αποκάλυψη για προβολή ή επεξεργασία</translation> - </message> - <message> - <source>Are you sure you want to remove this attachment?</source> - <translation>Είστε σίγουροι ότι θέλετε να αφαιρέσετε αυτό το συνημμένο;</translation> - </message> </context> <context> <name>EditEntryWidgetAdvanced</name> @@ -855,18 +1324,6 @@ Do you want to open it anyway?</source> <source>Remove</source> <translation>Αφαίρεση</translation> </message> - <message> - <source>Attachments</source> - <translation>Συνημμένα</translation> - </message> - <message> - <source>Save</source> - <translation>Αποθήκευση</translation> - </message> - <message> - <source>Open</source> - <translation>Άνοιγμα</translation> - </message> <message> <source>Edit Name</source> <translation>Επεξεργασία Ονόματος</translation> @@ -879,6 +1336,10 @@ Do you want to open it anyway?</source> <source>Reveal</source> <translation>Αποκάλυψη</translation> </message> + <message> + <source>Attachments</source> + <translation>Συνημμένα</translation> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -886,6 +1347,18 @@ Do you want to open it anyway?</source> <source>Enable Auto-Type for this entry</source> <translation>Ενεργοποίηση Αυτόματης-Γραφής για αυτήν την καταχώρηση</translation> </message> + <message> + <source>Inherit default Auto-Type sequence from the &group</source> + <translation>Κληρονόμηση προεπιλεγμένης ακολουθίας Auto-Type από την &ομάδα</translation> + </message> + <message> + <source>&Use custom Auto-Type sequence:</source> + <translation>&Χρήση προσαρμοσμένης ακολουθίας Auto-Type:</translation> + </message> + <message> + <source>Window Associations</source> + <translation type="unfinished"/> + </message> <message> <source>+</source> <translation>+</translation> @@ -898,14 +1371,6 @@ Do you want to open it anyway?</source> <source>Window title:</source> <translation>Τίτλος Παραθύρου:</translation> </message> - <message> - <source>Inherit default Auto-Type sequence from the &group</source> - <translation>Κληρονόμηση προεπιλεγμένης ακολουθίας Auto-Type από την &ομάδα</translation> - </message> - <message> - <source>&Use custom Auto-Type sequence:</source> - <translation>&Χρήση προσαρμοσμένης ακολουθίας Auto-Type:</translation> - </message> <message> <source>Use default se&quence</source> <translation type="unfinished"/> @@ -914,10 +1379,6 @@ Do you want to open it anyway?</source> <source>Set custo&m sequence:</source> <translation>Χρήση προεπιλε&γμένης ακολουθίας:</translation> </message> - <message> - <source>Window Associations</source> - <translation type="unfinished"/> - </message> </context> <context> <name>EditEntryWidgetHistory</name> @@ -941,12 +1402,8 @@ Do you want to open it anyway?</source> <context> <name>EditEntryWidgetMain</name> <message> - <source>Title:</source> - <translation>Τίτλος:</translation> - </message> - <message> - <source>Username:</source> - <translation>Όνομα χρήστη:</translation> + <source>URL:</source> + <translation>URL:</translation> </message> <message> <source>Password:</source> @@ -957,20 +1414,104 @@ Do you want to open it anyway?</source> <translation>Επαναλάβετε:</translation> </message> <message> - <source>URL:</source> - <translation>URL:</translation> + <source>Title:</source> + <translation>Τίτλος:</translation> </message> <message> - <source>Expires</source> - <translation>Λήγει</translation> + <source>Notes</source> + <translation>Σημειώσεις</translation> </message> <message> <source>Presets</source> <translation>Προεπιλογές</translation> </message> <message> - <source>Notes:</source> - <translation>Σημειώσεις:</translation> + <source>Toggle the checkbox to reveal the notes section.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username:</source> + <translation>Όνομα χρήστη:</translation> + </message> + <message> + <source>Expires</source> + <translation>Λήγει</translation> + </message> +</context> +<context> + <name>EditEntryWidgetSSHAgent</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent after</source> + <translation type="unfinished"/> + </message> + <message> + <source> seconds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fingerprint</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent when database is closed/locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add key to agent when database is opened/unlocked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Comment</source> + <translation type="unfinished"/> + </message> + <message> + <source>Decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy to clipboard</source> + <translation>Αντιγραφή στο πρόχειρο</translation> + </message> + <message> + <source>Private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>External file</source> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Attachment</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add to agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove from agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Require user confirmation when this key is used</source> + <translation type="unfinished"/> </message> </context> <context> @@ -993,7 +1534,7 @@ Do you want to open it anyway?</source> </message> <message> <source>Edit group</source> - <translation>Επεξεργασία ομάδας</translation> + <translation>Επεξεργασία Ομάδας</translation> </message> <message> <source>Enable</source> @@ -1041,6 +1582,14 @@ Do you want to open it anyway?</source> </context> <context> <name>EditWidgetIcons</name> + <message> + <source>&Use default icon</source> + <translation>&Χρήση προεπιλεγμένου εικονιδίου</translation> + </message> + <message> + <source>Use custo&m icon</source> + <translation>Χρήση προσαρμο&σμένου εικονιδίου</translation> + </message> <message> <source>Add custom icon</source> <translation>Πρόσθεση προσαρμοσμένου εικονιδίου</translation> @@ -1049,6 +1598,18 @@ Do you want to open it anyway?</source> <source>Delete custom icon</source> <translation>Διαγραφή προσαρμοσμένου εικονιδίου</translation> </message> + <message> + <source>Download favicon</source> + <translation>Κατέβασμα favicon</translation> + </message> + <message> + <source>Unable to fetch favicon.</source> + <translation>Αδυναμία λήψης favicon.</translation> + </message> + <message> + <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> + <translation type="unfinished"/> + </message> <message> <source>Images</source> <translation>Εικόνες</translation> @@ -1061,25 +1622,13 @@ Do you want to open it anyway?</source> <source>Select Image</source> <translation>Επιλογή εικόνας</translation> </message> - <message> - <source>Download favicon</source> - <translation>Κατέβασμα favicon</translation> - </message> - <message> - <source>Unable to fetch favicon.</source> - <translation>Αδυναμία λήψης favicon.</translation> - </message> <message> <source>Can't read icon</source> <translation>Αδυναμία ανάγνωσης εικονιδίου</translation> </message> <message> - <source>&Use default icon</source> - <translation>&Χρήση προεπιλεγμένου εικονιδίου</translation> - </message> - <message> - <source>Use custo&m icon</source> - <translation>Χρήση προσαρμο&σμένου εικονιδίου</translation> + <source>Custom icon already exists</source> + <translation type="unfinished"/> </message> <message> <source>Confirm Delete</source> @@ -1089,14 +1638,6 @@ Do you want to open it anyway?</source> <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> <translation type="unfinished"/> </message> - <message> - <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation type="unfinished"/> - </message> - <message> - <source>Custom icon already exists</source> - <translation type="unfinished"/> - </message> </context> <context> <name>EditWidgetProperties</name> @@ -1121,9 +1662,93 @@ Do you want to open it anyway?</source> <name>Entry</name> <message> <source> - Clone</source> + <comment>Suffix added to cloned entries</comment> <translation> - Κλωνοποίηση</translation> </message> </context> +<context> + <name>EntryAttachmentsModel</name> + <message> + <source>Name</source> + <translation>Όνομα</translation> + </message> + <message> + <source>Size</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EntryAttachmentsWidget</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add</source> + <translation>Πρόσθεση</translation> + </message> + <message> + <source>Remove</source> + <translation>Αφαίρεση</translation> + </message> + <message> + <source>Open</source> + <translation>Άνοιγμα</translation> + </message> + <message> + <source>Save</source> + <translation>Αποθήκευση</translation> + </message> + <message> + <source>Select files</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <source>Are you sure you want to remove %n attachment(s)?</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>Επιβεβαίωση Αφαίρεσης</translation> + </message> + <message> + <source>Save attachments</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to create directory: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Confirm overwrite</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to save attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachment: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open files: +%1</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EntryAttributesModel</name> <message> @@ -1152,6 +1777,11 @@ Do you want to open it anyway?</source> </context> <context> <name>EntryModel</name> + <message> + <source>Ref: </source> + <comment>Reference abbreviation</comment> + <translation>Αναφ:</translation> + </message> <message> <source>Group</source> <translation>Όμαδα</translation> @@ -1168,11 +1798,6 @@ Do you want to open it anyway?</source> <source>URL</source> <translation>URL</translation> </message> - <message> - <source>Ref: </source> - <comment>Reference abbreviation</comment> - <translation>Αναφ:</translation> - </message> </context> <context> <name>Group</name> @@ -1181,6 +1806,17 @@ Do you want to open it anyway?</source> <translation>Καλάθι ανακύκλωσης</translation> </message> </context> +<context> + <name>HostInstaller</name> + <message> + <source>KeePassXC: Cannot save file!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot save the native messaging script file.</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>HttpPasswordGeneratorWidget</name> <message> @@ -1243,6 +1879,358 @@ Do you want to open it anyway?</source> <translation>Κλείσιμο Μηνύματος</translation> </message> </context> +<context> + <name>Kdbx3Reader</name> + <message> + <source>Unable to calculate master key</source> + <translation>Σε θέση να υπολογίσει το κύριο κλειδί</translation> + </message> + <message> + <source>Unable to issue challenge-response.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>Λάθος κλειδί ή βάση δεδομένων αρχείο είναι κατεστραμμένο.</translation> + </message> +</context> +<context> + <name>Kdbx3Writer</name> + <message> + <source>Unable to issue challenge-response.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Σε θέση να υπολογίσει το κύριο κλειδί</translation> + </message> +</context> +<context> + <name>Kdbx4Reader</name> + <message> + <source>missing database headers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Σε θέση να υπολογίσει το κύριο κλειδί</translation> + </message> + <message> + <source>Invalid header checksum size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Header SHA256 mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header data length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open buffer for KDF parameters in header</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported key derivation function (KDF) or invalid parameters</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy header fields found in KDBX4 file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header binary size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass variant map version.</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name data</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value data</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Bool entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry type</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map field type size</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Kdbx4Writer</name> + <message> + <source>Invalid symmetric cipher algorithm.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid symmetric cipher IV size.</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Σε θέση να υπολογίσει το κύριο κλειδί</translation> + </message> + <message> + <source>Failed to serialize KDF parameters variant map</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxReader</name> + <message> + <source>Invalid cipher uuid length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid compression flags length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported compression algorithm</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid master seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform rounds size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid start bytes size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid random stream id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner random stream cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>Δεν είναι βάση δεδομένων KeePass.</translation> + </message> + <message> + <source>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass 2 database version.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxXmlReader</name> + <message> + <source>XML parsing failure: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>No root group</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing icon uuid or data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing custom data key or value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Multiple group elements</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null group uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableAutoType value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableSearching value</source> + <translation type="unfinished"/> + </message> + <message> + <source>No group uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null DeleteObject uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing DeletedObject uuid or time</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null entry uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element in history entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>No entry uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element with different uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decrypt entry string</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate custom attribute found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry string key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate attachment found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry binary key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-type association window or sequence missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid bool value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid date time value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color rgb part</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid uuid value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decompress binary</source> + <extracomment>Translator meant is a binary data inside an entry</extracomment> + <translation type="unfinished"/> + </message> +</context> <context> <name>KeePass1OpenWidget</name> <message> @@ -1251,7 +2239,7 @@ Do you want to open it anyway?</source> </message> <message> <source>Unable to open the database.</source> - <translation>Αποτυχία ανοίγματος βάσης δεδομένων.</translation> + <translation>Δεν είναι δυνατό να ανοίξει τη βάση δεδομένων.</translation> </message> </context> <context> @@ -1262,7 +2250,7 @@ Do you want to open it anyway?</source> </message> <message> <source>Not a KeePass database.</source> - <translation>Δεν ειναι βάση δεδομένων KeePass.</translation> + <translation>Δεν είναι βάση δεδομένων KeePass.</translation> </message> <message> <source>Unsupported encryption algorithm.</source> @@ -1272,6 +2260,35 @@ Do you want to open it anyway?</source> <source>Unsupported KeePass database version.</source> <translation>Μη υποστηριζόμενη έκδοση βάσης δεδομένων KeePass.</translation> </message> + <message> + <source>Unable to read encryption IV</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of groups</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid content hash size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of transform rounds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to construct group tree</source> + <translation type="unfinished"/> + </message> <message> <source>Root</source> <translation>Ρίζα</translation> @@ -1284,57 +2301,104 @@ Do you want to open it anyway?</source> <source>Wrong key or database file is corrupt.</source> <translation>Λάθος κλειδί ή βάση δεδομένων αρχείο είναι κατεστραμμένο.</translation> </message> -</context> -<context> - <name>KeePass2Reader</name> <message> - <source>Not a KeePass database.</source> - <translation>Δεν είναι βάση δεδομένων KeePass.</translation> - </message> - <message> - <source>Unsupported KeePass database version.</source> - <translation>Μη υποστηριζόμενη έκδοση βάσης δεδομένων KeePass.</translation> - </message> - <message> - <source>Wrong key or database file is corrupt.</source> - <translation>Λάθος κλειδί ή το άρχειο της βάσης δεδομένων είναι κατεστραμένο.</translation> - </message> - <message> - <source>Unable to calculate master key</source> - <translation>Σε θέση να υπολογίσει το κύριο κλειδί</translation> - </message> - <message> - <source>Unable to issue challenge-response.</source> + <source>Key transformation failed</source> <translation type="unfinished"/> </message> <message> - <source>The selected file is an old KeePass 1 database (.kdb). - -You can import it by clicking on Database > 'Import KeePass 1 database...'. -This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> - <translation type="unfinished"/> - </message> -</context> -<context> - <name>KeePass2Writer</name> - <message> - <source>Unable to issue challenge-response.</source> + <source>Invalid group field type number</source> <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>Σε θέση να υπολογίσει το κύριο κλειδί</translation> + <source>Invalid group field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read group field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group access time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group level field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing group id or level</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing entry field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read entry field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry uuid field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field type</source> + <translation type="unfinished"/> </message> </context> <context> <name>Main</name> <message> - <source>Fatal error while testing the cryptographic functions.</source> - <translation>Ανεπανόρθωτο σφάλμα κατά τον έλεγχο των κρυπτογραφικών λειτουργιών.</translation> - </message> - <message> - <source>KeePassXC - Error</source> - <translation>KeePassXC - Σφάλμα</translation> + <source>Existing single-instance lock file is invalid. Launching new instance.</source> + <translation type="unfinished"/> </message> <message> <source>The lock file could not be created. Single-instance mode disabled.</source> @@ -1345,64 +2409,32 @@ This is a one-way migration. You won't be able to open the imported databas <translation>Μία άλλη διεργασία του KeePassXC ήδη τρέχει.</translation> </message> <message> - <source>Existing single-instance lock file is invalid. Launching new instance.</source> - <translation type="unfinished"/> + <source>Fatal error while testing the cryptographic functions.</source> + <translation>Ανεπανόρθωτο σφάλμα κατά τον έλεγχο των κρυπτογραφικών λειτουργιών.</translation> + </message> + <message> + <source>KeePassXC - Error</source> + <translation>KeePassXC - Σφάλμα</translation> </message> </context> <context> <name>MainWindow</name> <message> - <source>Open database</source> - <translation>Άνοιγμα Βάσης Δεδομένων</translation> - </message> - <message> - <source>Database settings</source> - <translation>Ρυθμίσεις βάσης δεδομένων</translation> - </message> - <message> - <source>Copy username to clipboard</source> - <translation>Αντιγραφή όνομα χρήστη στο πρόχειρο</translation> - </message> - <message> - <source>Copy password to clipboard</source> - <translation>Αντιγραφή κωδικού στο πρόχειρο</translation> - </message> - <message> - <source>Settings</source> - <translation>Ρύθμίσεις</translation> - </message> - <message> - <source>Show toolbar</source> - <translation>Εμφάνιση γραμμής εργαλείων</translation> - </message> - <message> - <source>read-only</source> - <translation>Μόνο για ανάγνωση</translation> - </message> - <message> - <source>Toggle window</source> - <translation>Εναλλαγή παραθύρων</translation> - </message> - <message> - <source>KeePass 2 Database</source> - <translation>Βάση Δεδομένων KeePass 2</translation> - </message> - <message> - <source>All files</source> - <translation>Όλα τα αρχεία</translation> - </message> - <message> - <source>Save repaired database</source> - <translation>Αποθήκευση επιδιορθωμένη βάση δεδομένων</translation> - </message> - <message> - <source>Writing the database failed.</source> - <translation>Εγγραφή της βάσης δεδομένων απέτυχε.</translation> + <source>&Database</source> + <translation>&Βάση Δεδομένων</translation> </message> <message> <source>&Recent databases</source> <translation>&Πρόσφατες βάσεις δεδομένων</translation> </message> + <message> + <source>Import</source> + <translation>Εισαγωγή</translation> + </message> + <message> + <source>&Help</source> + <translation type="unfinished"/> + </message> <message> <source>E&ntries</source> <translation>Ε&γγραφές</translation> @@ -1411,13 +2443,17 @@ This is a one-way migration. You won't be able to open the imported databas <source>Copy att&ribute to clipboard</source> <translation type="unfinished"/> </message> + <message> + <source>Time-based one-time password</source> + <translation type="unfinished"/> + </message> <message> <source>&Groups</source> <translation>&Ομάδες</translation> </message> <message> - <source>&View</source> - <translation>&Προβολή</translation> + <source>&Tools</source> + <translation>&Εργαλεία</translation> </message> <message> <source>&Quit</source> @@ -1427,6 +2463,10 @@ This is a one-way migration. You won't be able to open the imported databas <source>&About</source> <translation>&Σχετικά με</translation> </message> + <message> + <source>&Open database...</source> + <translation type="unfinished"/> + </message> <message> <source>&Save database</source> <translation>&Αποθήκευση βάσης δεδομένων</translation> @@ -1467,26 +2507,26 @@ This is a one-way migration. You won't be able to open the imported databas <source>&Delete group</source> <translation>&Διαγραφή ομάδας</translation> </message> + <message> + <source>Sa&ve database as...</source> + <translation type="unfinished"/> + </message> + <message> + <source>Change &master key...</source> + <translation type="unfinished"/> + </message> <message> <source>&Database settings</source> <translation type="unfinished"/> </message> + <message> + <source>Database settings</source> + <translation>Ρυθμίσεις βάσης δεδομένων</translation> + </message> <message> <source>&Clone entry</source> <translation>&Κλωνοποίηση καταχώρησης </translation> </message> - <message> - <source>Timed one-time password</source> - <translation type="unfinished"/> - </message> - <message> - <source>Copy &TOTP</source> - <translation type="unfinished"/> - </message> - <message> - <source>Show TOTP</source> - <translation type="unfinished"/> - </message> <message> <source>&Find</source> <translation type="unfinished"/> @@ -1495,14 +2535,26 @@ This is a one-way migration. You won't be able to open the imported databas <source>Copy &username</source> <translation>Αντιγραφή &ονόματος χρήστη</translation> </message> + <message> + <source>Copy username to clipboard</source> + <translation>Αντιγραφή όνομα χρήστη στο πρόχειρο</translation> + </message> <message> <source>Cop&y password</source> <translation>Αντιγρα&φή κωδικού </translation> </message> + <message> + <source>Copy password to clipboard</source> + <translation>Αντιγραφή κωδικού στο πρόχειρο</translation> + </message> <message> <source>&Settings</source> <translation>&Ρυθμίσεις</translation> </message> + <message> + <source>Password Generator</source> + <translation>Γεννήτρια Κωδικών</translation> + </message> <message> <source>&Perform Auto-Type</source> <translation type="unfinished"/> @@ -1519,64 +2571,24 @@ This is a one-way migration. You won't be able to open the imported databas <source>&Title</source> <translation>&Τίτλος</translation> </message> + <message> + <source>Copy title to clipboard</source> + <translation type="unfinished"/> + </message> <message> <source>&URL</source> <translation>&URL</translation> </message> + <message> + <source>Copy URL to clipboard</source> + <translation type="unfinished"/> + </message> <message> <source>&Notes</source> <translation>&Σημειώσεις</translation> </message> <message> - <source>Password Generator</source> - <translation>Γεννήτρια Κωδικών</translation> - </message> - <message> - <source>Clear history</source> - <translation>Καθαρισμός ιστορικού</translation> - </message> - <message> - <source>&Database</source> - <translation>&Βάση Δεδομένων</translation> - </message> - <message> - <source>Import</source> - <translation>Εισαγωγή</translation> - </message> - <message> - <source>&Tools</source> - <translation>&Εργαλεία</translation> - </message> - <message> - <source>Empty recycle bin</source> - <translation>Άδειασμα κάδου ανακύκλωσης</translation> - </message> - <message> - <source>Access error for config file %1</source> - <translation>Σφάλματος πρόσβασης για αρχείο ρυθμίσεων %1</translation> - </message> - <message> - <source>Quit KeePassXC</source> - <translation>Κλείσιμο KeePassXC</translation> - </message> - <message> - <source>Please touch the button on your YubiKey!</source> - <translation>Παρακαλώ αγγίξτε το κουμπί στο YubiKey σας!</translation> - </message> - <message> - <source>&Help</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Open database...</source> - <translation type="unfinished"/> - </message> - <message> - <source>Sa&ve database as...</source> - <translation type="unfinished"/> - </message> - <message> - <source>Change &master key...</source> + <source>Copy notes to clipboard</source> <translation type="unfinished"/> </message> <message> @@ -1595,10 +2607,169 @@ This is a one-way migration. You won't be able to open the imported databas <source>Re&pair database...</source> <translation type="unfinished"/> </message> + <message> + <source>Show TOTP</source> + <translation type="unfinished"/> + </message> <message> <source>Set up TOTP...</source> <translation type="unfinished"/> </message> + <message> + <source>Copy &TOTP</source> + <translation type="unfinished"/> + </message> + <message> + <source>E&mpty recycle bin</source> + <translation type="unfinished"/> + </message> + <message> + <source>Clear history</source> + <translation>Καθαρισμός ιστορικού</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation>Σφάλματος πρόσβασης για αρχείο ρυθμίσεων %1</translation> + </message> + <message> + <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> + <translation type="unfinished"/> + </message> + <message> + <source>read-only</source> + <translation>Μόνο για ανάγνωση</translation> + </message> + <message> + <source>Settings</source> + <translation>Ρύθμίσεις</translation> + </message> + <message> + <source>Toggle window</source> + <translation>Εναλλαγή παραθύρων</translation> + </message> + <message> + <source>Quit KeePassXC</source> + <translation>Κλείσιμο KeePassXC</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>Βάση Δεδομένων KeePass 2</translation> + </message> + <message> + <source>All files</source> + <translation>Όλα τα αρχεία</translation> + </message> + <message> + <source>Open database</source> + <translation>Άνοιγμα Βάσης Δεδομένων</translation> + </message> + <message> + <source>Save repaired database</source> + <translation>Αποθήκευση επιδιορθωμένη βάση δεδομένων</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>Εγγραφή της βάσης δεδομένων απέτυχε.</translation> + </message> + <message> + <source>Please touch the button on your YubiKey!</source> + <translation>Παρακαλώ αγγίξτε το κουμπί στο YubiKey σας!</translation> + </message> +</context> +<context> + <name>OpenSSHKey</name> + <message> + <source>Invalid key file, expecting an OpenSSH key</source> + <translation type="unfinished"/> + </message> + <message> + <source>PEM boundary mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>This is not an OpenSSH key, only modern keys are supported</source> + <translation type="unfinished"/> + </message> + <message> + <source>Base64 decoding failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file way too small.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file magic header id invalid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Found zero keys</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to read public key.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Corrupted key file, reading private key failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>No private key payload to decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Trying to run KDF without cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Passphrase is required to decrypt this key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key derivation failed, key file corrupted?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Decryption failed, wrong passphrase?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write public key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write private key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing private key</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OptionDialog</name> @@ -1606,22 +2777,63 @@ This is a one-way migration. You won't be able to open the imported databas <source>Dialog</source> <translation>Διάλογος</translation> </message> + <message> + <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation>Αυτό είναι απαραίτητο για τη πρόσβαση στις βάσεις δεδομένων σας, από το ChromeIPass ή το PassIFox</translation> + </message> + <message> + <source>Enable KeePassHTTP server</source> + <translation>Ενεργοποίηση του εξυπηρετητή KeePassHTTP</translation> + </message> <message> <source>General</source> <translation>Γενικά</translation> </message> <message> <source>Sh&ow a notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return only best matching entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Match URL schemes</source> <translation type="unfinished"/> </message> <message> <source>Sort matching entries by &username</source> <translation type="unfinished"/> </message> + <message> + <source>Sort &matching entries by title</source> + <translation type="unfinished"/> + </message> + <message> + <source>R&emove all shared encryption keys from active database</source> + <translation type="unfinished"/> + </message> <message> <source>Re&move all stored permissions from entries in active database</source> <translation type="unfinished"/> </message> + <message> + <source>Password Generator</source> + <translation>Γεννήτρια Κωδικών</translation> + </message> <message> <source>Advanced</source> <translation>Για προχωρημένους</translation> @@ -1634,10 +2846,22 @@ This is a one-way migration. You won't be able to open the imported databas <source>Always allow &updating entries</source> <translation type="unfinished"/> </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation type="unfinished"/> + </message> <message> <source>Searc&h in all opened databases for matching entries</source> <translation type="unfinished"/> </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation type="unfinished"/> + </message> <message> <source>HTTP Port:</source> <translation>HTTP Θύρα:</translation> @@ -1646,18 +2870,18 @@ This is a one-way migration. You won't be able to open the imported databas <source>Default port: 19455</source> <translation>Προεπιλεγμένη θύρα: 19455</translation> </message> - <message> - <source>Re&quest to unlock the database if it is locked</source> - <translation type="unfinished"/> - </message> - <message> - <source>Sort &matching entries by title</source> - <translation type="unfinished"/> - </message> <message> <source>KeePassXC will listen to this port on 127.0.0.1</source> <translation>Το KeePassXC θα ακούει σε αυτή τη θύρα στο 127.0.0.1</translation> </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> + <translation type="unfinished"/> + </message> <message> <source>Cannot bind to privileged ports</source> <translation type="unfinished"/> @@ -1667,62 +2891,30 @@ This is a one-way migration. You won't be able to open the imported databas Using default port 19455.</source> <translation type="unfinished"/> </message> - <message> - <source>R&emove all shared encryption keys from active database</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Return advanced string fields which start with "KPH: "</source> - <translation type="unfinished"/> - </message> - <message> - <source>Automatically creating or updating string fields is not supported.</source> - <translation type="unfinished"/> - </message> - <message> - <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> - <translation>Αυτό είναι απαραίτητο για τη πρόσβαση στις βάσεις δεδομένων σας, από το ChromeIPass ή το PassIFox</translation> - </message> - <message> - <source>Enable KeePassHTTP server</source> - <translation>Ενεργοποίηση του εξυπηρετητή KeePassHTTP</translation> - </message> - <message> - <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Return only best matching entries</source> - <translation type="unfinished"/> - </message> - <message> - <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Match URL schemes</source> - <translation type="unfinished"/> - </message> - <message> - <source>Password Generator</source> - <translation>Γεννήτρια Κωδικών</translation> - </message> - <message> - <source>Only the selected database has to be connected with a client.</source> - <translation type="unfinished"/> - </message> - <message> - <source>The following options can be dangerous! -Change them only if you know what you are doing.</source> - <translation type="unfinished"/> - </message> </context> <context> <name>PasswordGeneratorWidget</name> + <message> + <source>%p%</source> + <translation type="unfinished"/> + </message> <message> <source>Password:</source> <translation>Κωδικός:</translation> </message> + <message> + <source>strength</source> + <comment>Password strength</comment> + <translation>ισχύς</translation> + </message> + <message> + <source>entropy</source> + <translation>εντροπία</translation> + </message> + <message> + <source>Password</source> + <translation>Κωδικός</translation> + </message> <message> <source>Character Types</source> <translation>Τύποι χαρακτήρων</translation> @@ -1744,37 +2936,49 @@ Change them only if you know what you are doing.</source> <translation>Ειδικοί χαρακτήρες</translation> </message> <message> - <source>Exclude look-alike characters</source> - <translation>Εξαίρεση χαρακτήρων που μοίαζουν</translation> - </message> - <message> - <source>Accept</source> - <translation>Αποδοχή</translation> - </message> - <message> - <source>%p%</source> + <source>Extended ASCII</source> <translation type="unfinished"/> </message> <message> - <source>strength</source> - <translation>ισχύς</translation> - </message> - <message> - <source>entropy</source> - <translation>εντροπία</translation> - </message> - <message> - <source>&Length:</source> - <translation>&Μήκος:</translation> + <source>Exclude look-alike characters</source> + <translation>Εξαίρεση χαρακτήρων που μοίαζουν</translation> </message> <message> <source>Pick characters from every group</source> <translation type="unfinished"/> </message> + <message> + <source>&Length:</source> + <translation>&Μήκος:</translation> + </message> + <message> + <source>Passphrase</source> + <translation>Φράση Κλειδί</translation> + </message> + <message> + <source>Wordlist:</source> + <translation>Λίστα Λέξεων:</translation> + </message> + <message> + <source>Word Count:</source> + <translation>Αριθμός Λέξεων:</translation> + </message> + <message> + <source>Word Separator:</source> + <translation>Διαχωριστικό Λέξεων:</translation> + </message> <message> <source>Generate</source> <translation type="unfinished"/> </message> + <message> + <source>Copy</source> + <translation>Αντιγραφή</translation> + </message> + <message> + <source>Accept</source> + <translation>Αποδοχή</translation> + </message> <message> <source>Close</source> <translation>Κλείσιμο</translation> @@ -1793,51 +2997,270 @@ Change them only if you know what you are doing.</source> </message> <message> <source>Poor</source> + <comment>Password quality</comment> <translation>Φτωχή</translation> </message> <message> <source>Weak</source> + <comment>Password quality</comment> <translation>Αδύναμη</translation> </message> <message> <source>Good</source> + <comment>Password quality</comment> <translation>Καλή</translation> </message> <message> <source>Excellent</source> + <comment>Password quality</comment> <translation>Εξαιρετική</translation> </message> - <message> - <source>Password</source> - <translation>Κωδικός</translation> - </message> - <message> - <source>Extended ASCII</source> - <translation type="unfinished"/> - </message> - <message> - <source>Passphrase</source> - <translation>Φράση Κλειδί</translation> - </message> - <message> - <source>Wordlist:</source> - <translation>Λίστα Λέξεων:</translation> - </message> - <message> - <source>Word Count:</source> - <translation>Αριθμός Λέξεων:</translation> - </message> - <message> - <source>Word Separator:</source> - <translation>Διαχωριστικό Λέξεων:</translation> - </message> - <message> - <source>Copy</source> - <translation>Αντιγραφή</translation> - </message> </context> <context> <name>QObject</name> + <message> + <source>Database not opened</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database hash not available</source> + <translation type="unfinished"/> + </message> + <message> + <source>Client public key not received</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot decrypt message</source> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout or cannot connect to KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>Action cancelled or denied</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC association failed, try again</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key change was not successful</source> + <translation type="unfinished"/> + </message> + <message> + <source>Encryption key is not recognized</source> + <translation type="unfinished"/> + </message> + <message> + <source>No saved databases found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect action</source> + <translation type="unfinished"/> + </message> + <message> + <source>Empty message received</source> + <translation type="unfinished"/> + </message> + <message> + <source>No URL provided</source> + <translation type="unfinished"/> + </message> + <message> + <source>No logins found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown error</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add a new entry to a database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>Διαδρομή της βάσης δεδομένων.</translation> + </message> + <message> + <source>Key file of the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>path</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>username</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Prompt for the entry's password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a password for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length for the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to add.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy an entry's password to the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to clip.</source> + <comment>clip = copy to clipboard</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout in seconds before clearing the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Edit an entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Title for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>title</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to edit.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Estimate the entropy of a password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password for which to estimate the entropy.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Perform advanced analysis on the password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Extract and print the content of a database.</source> + <translation>Εξαγωγή και τύπωμα των περιεχομένων της βάσης δεδομένων.</translation> + </message> + <message> + <source>Path of the database to extract.</source> + <translation>Διαδρομή της βάσης δεδομένων προς εξαγωγή.</translation> + </message> + <message> + <source>Insert password to unlock %1: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to load key file %1 : %2</source> + <translation type="unfinished"/> + </message> + <message> + <source>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source> + +Available commands: +</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the command to execute.</source> + <translation>Όνομα εντολής προς εκτέλεση.</translation> + </message> + <message> + <source>List database entries.</source> + <translation>Προβολή καταχωρίσεων βάσης δεδομένων.</translation> + </message> + <message> + <source>Path of the group to list. Default is /</source> + <translation type="unfinished"/> + </message> + <message> + <source>Find entries quickly.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Search term.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Merge two databases.</source> + <translation>Συγχώνευση δύο βάσεων δεδομένων.</translation> + </message> + <message> + <source>Path of the database to merge into.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database to merge from.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use the same credentials for both database files.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file of the database to merge from.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show an entry's information.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> + <translation type="unfinished"/> + </message> + <message> + <source>attribute</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the entry to show.</source> + <translation>Όνομα καταχώρησης προς προβολή.</translation> + </message> <message> <source>NULL device</source> <translation type="unfinished"/> @@ -1861,7 +3284,27 @@ Change them only if you know what you are doing.</source> <translation type="unfinished"/> </message> <message> - <source>INTERNAL - unget lower bound exceeded</source> + <source>AES: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Twofish: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>ChaCha20: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Argon2 (KDBX 4 – recommended)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 4)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 3.1)</source> <translation type="unfinished"/> </message> <message> @@ -1880,14 +3323,22 @@ Change them only if you know what you are doing.</source> <source>Password</source> <translation>Κωδικός</translation> </message> - <message> - <source>URL</source> - <translation>URL</translation> - </message> <message> <source>Notes</source> <translation>Σημειώσεις</translation> </message> + <message> + <source>Last Modified</source> + <translation type="unfinished"/> + </message> + <message> + <source>Created</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy Browser Integration</source> + <translation type="unfinished"/> + </message> <message> <source>Browser Integration</source> <translation>Ενσωμάτωση Περιηγητή</translation> @@ -1904,6 +3355,10 @@ Change them only if you know what you are doing.</source> <source>Passive</source> <translation type="unfinished"/> </message> + <message> + <source>SSH Agent</source> + <translation type="unfinished"/> + </message> </context> <context> <name>QtIOCompressor</name> @@ -1942,8 +3397,8 @@ Change them only if you know what you are doing.</source> <context> <name>SearchWidget</name> <message> - <source>Case Sensitive</source> - <translation type="unfinished"/> + <source>Search...</source> + <translation>Αναζήτηση...</translation> </message> <message> <source>Search</source> @@ -1954,8 +3409,8 @@ Change them only if you know what you are doing.</source> <translation type="unfinished"/> </message> <message> - <source>Search...</source> - <translation>Αναζήτηση...</translation> + <source>Case Sensitive</source> + <translation type="unfinished"/> </message> <message> <source>Limit search to selected group</source> @@ -1964,48 +3419,6 @@ Change them only if you know what you are doing.</source> </context> <context> <name>Service</name> - <message> - <source>A shared encryption-key with the name "%1" already exists. -Do you want to overwrite it?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Do you want to update the information in %1 - %2?</source> - <translation type="unfinished"/> - </message> - <message> - <source>The active database is locked! -Please unlock the selected database or choose another one which is unlocked.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Successfully removed %1 encryption-%2 from KeePassX/Http Settings.</source> - <translation type="unfinished"/> - </message> - <message> - <source>No shared encryption-keys found in KeePassHttp Settings.</source> - <translation type="unfinished"/> - </message> - <message> - <source>The active database does not contain an entry of KeePassHttp Settings.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Removing stored permissions...</source> - <translation>Αφαίρεση αποθηκευμένων δικαιωμάτων...</translation> - </message> - <message> - <source>Abort</source> - <translation>Διακοπή</translation> - </message> - <message> - <source>Successfully removed permissions from %1 %2.</source> - <translation type="unfinished"/> - </message> - <message> - <source>The active database does not contain an entry with permissions.</source> - <translation type="unfinished"/> - </message> <message> <source>KeePassXC: New key association request</source> <translation type="unfinished"/> @@ -2020,34 +3433,76 @@ give it a unique name to identify and accept it.</source> <source>KeePassXC: Overwrite existing key?</source> <translation>KeePassXC: Αντικατάσταση τρέχοντος κλειδιού;</translation> </message> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"/> + </message> <message> <source>KeePassXC: Update Entry</source> <translation>KeePassXC: Ενημέρωση Καταχώρησης</translation> </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation type="unfinished"/> + </message> <message> <source>KeePassXC: Database locked!</source> <translation>KeePassXC: Βάση δεδομένων κλειδωμένη!</translation> </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation type="unfinished"/> + </message> <message> <source>KeePassXC: Removed keys from database</source> <translation>KeePassXC: Κλειδιά αφαιρέθηκαν από τη βάση</translation> </message> + <message numerus="yes"> + <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No keys found</source> <translation>KeePassXC: Δε βρεθήκαν κλειδιά</translation> </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation type="unfinished"/> + </message> <message> <source>KeePassXC: Settings not available!</source> <translation>KeePassXC: Ρυθμισμένες μη διαθέσιμες!</translation> </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Removing stored permissions...</source> + <translation>Αφαίρεση αποθηκευμένων δικαιωμάτων...</translation> + </message> + <message> + <source>Abort</source> + <translation>Διακοπή</translation> + </message> <message> <source>KeePassXC: Removed permissions</source> <translation>KeePassXC: Δικαιώματα αφαιρέθηκαν</translation> </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entries.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No entry with permissions found!</source> <translation>KeePassXC: Δε βρέθηκε καταχώρηση με δικαιώματα!</translation> </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>SettingsWidget</name> @@ -2070,10 +3525,26 @@ give it a unique name to identify and accept it.</source> </context> <context> <name>SettingsWidgetGeneral</name> + <message> + <source>Basic Settings</source> + <translation>Βασικές Ρυθμίσεις</translation> + </message> + <message> + <source>Start only a single instance of KeePassXC</source> + <translation type="unfinished"/> + </message> <message> <source>Remember last databases</source> <translation>Θυμηθείτε την τελευταία βάσεις δεδομένων</translation> </message> + <message> + <source>Remember last key files and security dongles</source> + <translation type="unfinished"/> + </message> + <message> + <source>Load previous databases on startup</source> + <translation>Φόρτωμα προηγούμενων βάσεων δεδομένων κατά την εκκίνηση</translation> + </message> <message> <source>Automatically save on exit</source> <translation>Αυτόματη αποθήκευση κατα την έξοδο</translation> @@ -2082,21 +3553,29 @@ give it a unique name to identify and accept it.</source> <source>Automatically save after every change</source> <translation>Αυτόματη Αποθήκευση μετά απο κάθε αλλαγή</translation> </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation>Αυτόματη επαναφόρτωση βάσης σε περίπτωση εξωτερικής τροποποίησης</translation> + </message> <message> <source>Minimize when copying to clipboard</source> <translation>Ελαχιστοποίηση οταν αντιγράφετε στο πρόχειρο</translation> </message> + <message> + <source>Minimize window at application startup</source> + <translation>Ελαχιστοποίηση παραθύρου κατά την εκκίνηση</translation> + </message> <message> <source>Use group icon on entry creation</source> <translation>Χρησιμοποίηση εικονιδίου ομάδας κατα την δημιουργία καταχώρησης</translation> </message> <message> - <source>Global Auto-Type shortcut</source> + <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> <translation type="unfinished"/> </message> <message> - <source>Language</source> - <translation>Γλώσσα</translation> + <source>Hide the Details view</source> + <translation type="unfinished"/> </message> <message> <source>Show a system tray icon</source> @@ -2106,67 +3585,61 @@ give it a unique name to identify and accept it.</source> <source>Hide window to system tray when minimized</source> <translation type="unfinished"/> </message> - <message> - <source>Load previous databases on startup</source> - <translation>Φόρτωμα προηγούμενων βάσεων δεδομένων κατά την εκκίνηση</translation> - </message> - <message> - <source>Automatically reload the database when modified externally</source> - <translation>Αυτόματη επαναφόρτωση βάσης σε περίπτωση εξωτερικής τροποποίησης</translation> - </message> <message> <source>Hide window to system tray instead of app exit</source> <translation type="unfinished"/> </message> <message> - <source>Minimize window at application startup</source> - <translation>Ελαχιστοποίηση παραθύρου κατά την εκκίνηση</translation> - </message> - <message> - <source>Basic Settings</source> - <translation>Βασικές Ρυθμίσεις</translation> - </message> - <message> - <source>Remember last key files and security dongles</source> + <source>Dark system tray icon</source> <translation type="unfinished"/> </message> <message> - <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> - <translation type="unfinished"/> + <source>Language</source> + <translation>Γλώσσα</translation> </message> <message> <source>Auto-Type</source> <translation>Αυτόματη-Γραφή</translation> </message> <message> - <source>Use entry title and URL to match windows for global Auto-Type</source> + <source>Use entry title to match windows for global Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use entry URL to match windows for global Auto-Type</source> <translation type="unfinished"/> </message> <message> <source>Always ask before performing Auto-Type</source> <translation>Πάντα ερώτηση για την εκτέλεση του Auto-Type</translation> </message> + <message> + <source>Global Auto-Type shortcut</source> + <translation type="unfinished"/> + </message> <message> <source>Auto-Type delay</source> <translation>Καθυστέρηση Auto-Type</translation> </message> <message> <source> ms</source> + <comment>Milliseconds</comment> <translation> ms</translation> </message> - <message> - <source>Start only a single instance of KeePassXC</source> - <translation type="unfinished"/> - </message> </context> <context> <name>SettingsWidgetSecurity</name> + <message> + <source>Timeouts</source> + <translation type="unfinished"/> + </message> <message> <source>Clear clipboard after</source> <translation>Εκκαθάριση πρόχειρου μετά από</translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation>δευτερόλεπτα</translation> </message> <message> @@ -2174,8 +3647,12 @@ give it a unique name to identify and accept it.</source> <translation>Κλείδωμα βάσης δεδομένων μετα απο ανενεργεία </translation> </message> <message> - <source>Show passwords in cleartext by default</source> - <translation>Εμφάνιση κωδίκων σε απλό κείμενο από προεπιλογή</translation> + <source>Convenience</source> + <translation>Ευκολία</translation> + </message> + <message> + <source>Lock databases when session is locked or lid is closed</source> + <translation>Κλείδωμα βάσεων δεδομένων κατά το κλείδωμα της συνεδρίας ή την αναδίπλωση της οθόνης</translation> </message> <message> <source>Lock databases after minimizing the window</source> @@ -2186,16 +3663,16 @@ give it a unique name to identify and accept it.</source> <translation type="unfinished"/> </message> <message> - <source>Timeouts</source> + <source>Show passwords in cleartext by default</source> + <translation>Εμφάνιση κωδίκων σε απλό κείμενο από προεπιλογή</translation> + </message> + <message> + <source>Hide passwords in the preview panel</source> <translation type="unfinished"/> </message> <message> - <source>Convenience</source> - <translation>Ευκολία</translation> - </message> - <message> - <source>Lock databases when session is locked or lid is closed</source> - <translation>Κλείδωμα βάσεων δεδομένων κατά το κλείδωμα της συνεδρίας ή την αναδίπλωση της οθόνης</translation> + <source>Hide entry notes by default</source> + <translation type="unfinished"/> </message> <message> <source>Privacy</source> @@ -2216,6 +3693,14 @@ give it a unique name to identify and accept it.</source> <source>Key:</source> <translation>Κλειδί:</translation> </message> + <message> + <source>Default RFC 6238 token settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Steam token settings</source> + <translation type="unfinished"/> + </message> <message> <source>Use custom settings</source> <translation>Χρήση προσαρμοσμένων ρυθμίσεων</translation> @@ -2242,6 +3727,7 @@ give it a unique name to identify and accept it.</source> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation>δευτερόλεπτα</translation> </message> </context> @@ -2308,6 +3794,26 @@ give it a unique name to identify and accept it.</source> </context> <context> <name>main</name> + <message> + <source>Remove an entry from the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>Διαδρομή της βάσης δεδομένων.</translation> + </message> + <message> + <source>Path of the entry to remove.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation type="unfinished"/> + </message> + <message> + <source>filenames of the password databases to open (*.kdbx)</source> + <translation>ονόματα αρχείων των βάσεων δεδομένων κωδικών προς άνοιγμα (*.kdbx)</translation> + </message> <message> <source>path to a custom config file</source> <translation>διαδρομή σε προσαρμοσμένο αρχείο ρυθμίσεων</translation> @@ -2316,81 +3822,13 @@ give it a unique name to identify and accept it.</source> <source>key file of the database</source> <translation>Αρχείο κλειδί της βάσεως δεδομένων</translation> </message> - <message> - <source>KeePassXC - cross-platform password manager</source> - <translation type="unfinished"/> - </message> <message> <source>read password of the database from stdin</source> <translation>Διάβασμα κωδικού βάσης από το stdin</translation> </message> <message> - <source>filenames of the password databases to open (*.kdbx)</source> - <translation>ονόματα αρχείων των βάσεων δεδομένων κωδικών προς άνοιγμα (*.kdbx)</translation> - </message> - <message> - <source>Copy a password to the clipboard</source> - <translation>Αντιγραφή ενός κωδικού στο πρόχειρο</translation> - </message> - <message> - <source>Path of the database.</source> - <translation>Διαδρομή της βάσης δεδομένων.</translation> - </message> - <message> - <source>Use a GUI prompt unlocking the database.</source> - <translation>Χρήση ενός γραφικού παραθύρου διαλόγου για το ξεκλείδωμα της βάσης δεδομένων.</translation> - </message> - <message> - <source>Name of the entry to clip.</source> - <translation>Όνομα καταχώρησης προς αντιγραφή.</translation> - </message> - <message> - <source>Extract and print the content of a database.</source> - <translation>Εξαγωγή και τύπωμα των περιεχομένων της βάσης δεδομένων.</translation> - </message> - <message> - <source>Path of the database to extract.</source> - <translation>Διαδρομή της βάσης δεδομένων προς εξαγωγή.</translation> - </message> - <message> - <source>Name of the command to execute.</source> - <translation>Όνομα εντολής προς εκτέλεση.</translation> - </message> - <message> - <source>List database entries.</source> - <translation>Προβολή καταχωρίσεων βάσης δεδομένων.</translation> - </message> - <message> - <source>Path of the group to list. Default is /</source> + <source>Parent window handle</source> <translation type="unfinished"/> </message> - <message> - <source>Print the UUIDs of the entries and groups.</source> - <translation>Εκτύπωση των UUID των καταχωρίσεων και των ομάδων.</translation> - </message> - <message> - <source>Merge two databases.</source> - <translation>Συγχώνευση δύο βάσεων δεδομένων.</translation> - </message> - <message> - <source>Path of the database to merge into.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Path of the database to merge from.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Use the same password for both database files.</source> - <translation>Χρήση το ίδιου κωδικού και για τις δύο βάσεις δεδομένων.</translation> - </message> - <message> - <source>Show a password.</source> - <translation>Εμφάνιση ενός κωδικού.</translation> - </message> - <message> - <source>Name of the entry to show.</source> - <translation>Όνομα καταχώρησης προς προβολή.</translation> - </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_en.ts b/share/translations/keepassx_en.ts index 7cc9fc3c3..677273187 100644 --- a/share/translations/keepassx_en.ts +++ b/share/translations/keepassx_en.ts @@ -11,14 +11,34 @@ <source>About</source> <translation type="unfinished"></translation> </message> + <message> + <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Project Maintainers:</source> + <translation type="unfinished"></translation> + </message> <message> <source>Contributors</source> <translation type="unfinished"></translation> </message> + <message> + <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> + <translation type="unfinished"></translation> + </message> <message> <source>Debug Info</source> <translation type="unfinished"></translation> </message> + <message> + <source>Include the following information whenever you report a bug:</source> + <translation type="unfinished"></translation> + </message> <message> <source>Copy to clipboard</source> <translation type="unfinished"></translation> @@ -32,6 +52,10 @@ <source>Revision: %1</source> <translation type="unfinished"></translation> </message> + <message> + <source>Distribution: %1</source> + <translation type="unfinished"></translation> + </message> <message> <source>Libraries:</source> <translation type="unfinished"></translation> @@ -46,33 +70,13 @@ Kernel: %3 %4</source> <source>Enabled extensions:</source> <translation type="unfinished"></translation> </message> - <message> - <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> - <translation type="unfinished"></translation> - </message> - <message> - <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Project Maintainers:</source> - <translation type="unfinished"></translation> - </message> - <message> - <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Include the following information whenever you report a bug:</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Distribution: %1</source> - <translation type="unfinished"></translation> - </message> </context> <context> <name>AccessControlDialog</name> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation type="unfinished"></translation> + </message> <message> <source>Remember this decision</source> <translation type="unfinished"></translation> @@ -90,8 +94,11 @@ Kernel: %3 %4</source> Please select whether you want to allow access.</source> <translation type="unfinished"></translation> </message> +</context> +<context> + <name>AgentSettingsWidget</name> <message> - <source>KeePassXC HTTP Confirm Access</source> + <source>Enable SSH Agent (requires restart)</source> <translation type="unfinished"></translation> </message> </context> @@ -105,6 +112,26 @@ Please select whether you want to allow access.</source> <source>Auto-Type - KeePassXC</source> <translation type="unfinished"></translation> </message> + <message> + <source>Auto-Type</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>The Syntax of your Auto-Type statement is incorrect!</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>AutoTypeAssociationsModel</name> @@ -124,11 +151,292 @@ Please select whether you want to allow access.</source> <context> <name>AutoTypeSelectDialog</name> <message> - <source>Select entry to Auto-Type:</source> + <source>Auto-Type - KeePassXC</source> <translation type="unfinished"></translation> </message> <message> - <source>Auto-Type - KeePassXC</source> + <source>Select entry to Auto-Type:</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>BrowserAccessControlDialog</name> + <message> + <source>KeePassXC-Browser Confirm Access</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remember this decision</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Allow</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Deny</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>BrowserOptionDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>This is required for accessing your databases with KeePassXC-Browser</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Enable KeepassXC browser integration</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>General</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Enable integration for these browsers:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Google Chrome</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Firefox</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Chromium</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Vivaldi</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show a &notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Match URL scheme (e.g., https://...)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Return only best-matching credentials</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Sort &matching credentials by title</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <source>Sort matching credentials by &username</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Disconnect all browsers</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Forget all remembered &permissions</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Advanced</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Never &ask before accessing credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <source>Never ask before &updating credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Searc&h in all opened databases for matching credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Update &native messaging manifest files at startup</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Support a proxy application between KeePassXC and browser extension.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Use a &proxy application between KeePassXC and browser extension</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Use a custom proxy location if you installed a proxy manually.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Use a &custom proxy location</source> + <comment>Meant is the proxy for KeePassXC-Browser</comment> + <translation type="unfinished"></translation> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Executable Files (*.exe);;All Files (*.*)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Executable Files (*)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select custom proxy location</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>BrowserService</name> + <message> + <source>KeePassXC: New key association request</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save and allow access</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>The active database does not contain a settings entry.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No shared encryption keys found in KeePassXC Settings.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> + <message> + <source>Removing stored permissions…</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Abort</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entry(s).</source> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> <translation type="unfinished"></translation> </message> </context> @@ -146,6 +454,10 @@ Please select whether you want to allow access.</source> <source>Repeat password:</source> <translation type="unfinished"></translation> </message> + <message> + <source>&Key file</source> + <translation type="unfinished"></translation> + </message> <message> <source>Browse</source> <translation type="unfinished"></translation> @@ -154,6 +466,14 @@ Please select whether you want to allow access.</source> <source>Create</source> <translation type="unfinished"></translation> </message> + <message> + <source>Cha&llenge Response</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Refresh</source> + <translation type="unfinished"></translation> + </message> <message> <source>Key files</source> <translation type="unfinished"></translation> @@ -174,6 +494,10 @@ Please select whether you want to allow access.</source> <source>Select a key file</source> <translation type="unfinished"></translation> </message> + <message> + <source>Empty password</source> + <translation type="unfinished"></translation> + </message> <message> <source>Do you really want to use an empty string as password?</source> <translation type="unfinished"></translation> @@ -188,19 +512,14 @@ Please select whether you want to allow access.</source> <translation type="unfinished"></translation> </message> <message> - <source>&Key file</source> + <source>Legacy key file format</source> <translation type="unfinished"></translation> </message> <message> - <source>Cha&llenge Response</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Refresh</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Empty password</source> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> <translation type="unfinished"></translation> </message> <message> @@ -214,6 +533,10 @@ Please select whether you want to allow access.</source> <source>Clone Options</source> <translation type="unfinished"></translation> </message> + <message> + <source>Append ' - Clone' to title</source> + <translation type="unfinished"></translation> + </message> <message> <source>Replace username and password with references</source> <translation type="unfinished"></translation> @@ -222,10 +545,6 @@ Please select whether you want to allow access.</source> <source>Copy history</source> <translation type="unfinished"></translation> </message> - <message> - <source>Append ' - Clone' to title</source> - <translation type="unfinished"></translation> - </message> </context> <context> <name>CsvImportWidget</name> @@ -321,10 +640,6 @@ Please select whether you want to allow access.</source> </context> <context> <name>CsvImportWizard</name> - <message> - <source>Import CSV file</source> - <translation type="unfinished"></translation> - </message> <message> <source>Error</source> <translation type="unfinished"></translation> @@ -336,17 +651,26 @@ Please select whether you want to allow access.</source> </context> <context> <name>CsvParserModel</name> - <message> - <source> byte, </source> - <translation type="unfinished"></translation> + <message numerus="yes"> + <source>%n byte(s), </source> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> </message> - <message> - <source> rows, </source> - <translation type="unfinished"></translation> + <message numerus="yes"> + <source>%n row(s), </source> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> </message> - <message> - <source> columns</source> - <translation type="unfinished"></translation> + <message numerus="yes"> + <source>%n column(s)</source> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> </message> </context> <context> @@ -367,6 +691,14 @@ Please select whether you want to allow access.</source> <source>Browse</source> <translation type="unfinished"></translation> </message> + <message> + <source>Refresh</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Challenge Response:</source> + <translation type="unfinished"></translation> + </message> <message> <source>Unable to open the database.</source> <translation type="unfinished"></translation> @@ -375,6 +707,21 @@ Please select whether you want to allow access.</source> <source>Can't open key file</source> <translation type="unfinished"></translation> </message> + <message> + <source>Legacy key file format</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Don't show this warning again</source> + <translation type="unfinished"></translation> + </message> <message> <source>All files</source> <translation type="unfinished"></translation> @@ -387,14 +734,6 @@ Please select whether you want to allow access.</source> <source>Select key file</source> <translation type="unfinished"></translation> </message> - <message> - <source>Refresh</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Challenge Response:</source> - <translation type="unfinished"></translation> - </message> </context> <context> <name>DatabaseRepairWidget</name> @@ -411,11 +750,11 @@ Please select whether you want to allow access.</source> <translation type="unfinished"></translation> </message> <message> - <source>Database opened fine. Nothing to do.</source> + <source>Unable to open the database.</source> <translation type="unfinished"></translation> </message> <message> - <source>Unable to open the database.</source> + <source>Database opened fine. Nothing to do.</source> <translation type="unfinished"></translation> </message> <message> @@ -435,39 +774,56 @@ You can now save it.</source> <context> <name>DatabaseSettingsWidget</name> <message> - <source>Database name:</source> + <source>General</source> <translation type="unfinished"></translation> </message> <message> - <source>Database description:</source> + <source>Encryption</source> <translation type="unfinished"></translation> </message> <message> - <source>Transform rounds:</source> + <source>Number of rounds too high</source> + <comment>Key transformation rounds</comment> <translation type="unfinished"></translation> </message> <message> - <source>Default username:</source> + <source>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</source> <translation type="unfinished"></translation> </message> <message> - <source> MiB</source> + <source>Understood, keep number</source> <translation type="unfinished"></translation> </message> <message> - <source>Benchmark</source> + <source>Cancel</source> <translation type="unfinished"></translation> </message> <message> - <source>Max. history items:</source> + <source>Number of rounds too low</source> + <comment>Key transformation rounds</comment> <translation type="unfinished"></translation> </message> <message> - <source>Max. history size:</source> + <source>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</source> <translation type="unfinished"></translation> </message> <message> - <source>Use recycle bin</source> + <source>KDF unchanged</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetEncryption</name> + <message> + <source>Encryption Algorithm:</source> <translation type="unfinished"></translation> </message> <message> @@ -479,7 +835,70 @@ You can now save it.</source> <translation type="unfinished"></translation> </message> <message> - <source>Algorithm:</source> + <source>Key Derivation Function:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Transform rounds:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Benchmark 1-second delay</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Memory Usage:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source> MB</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Parallelism:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source> thread</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetGeneral</name> + <message> + <source>Database Meta Data</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Database name:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Database description:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Default username:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>History Settings</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Max. history items:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Max. history size:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source> MiB</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Use recycle bin</source> <translation type="unfinished"></translation> </message> </context> @@ -487,6 +906,7 @@ You can now save it.</source> <name>DatabaseTabWidget</name> <message> <source>Root</source> + <comment>Root group</comment> <translation type="unfinished"></translation> </message> <message> @@ -505,6 +925,30 @@ You can now save it.</source> <source>File not found!</source> <translation type="unfinished"></translation> </message> + <message> + <source>Unable to open the database.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>File opened in read only mode.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open CSV file</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>CSV file</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>All files (*)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Merge database</source> + <translation type="unfinished"></translation> + </message> <message> <source>Open KeePass 1 database</source> <translation type="unfinished"></translation> @@ -514,11 +958,12 @@ You can now save it.</source> <translation type="unfinished"></translation> </message> <message> - <source>All files (*)</source> + <source>Close?</source> <translation type="unfinished"></translation> </message> <message> - <source>Close?</source> + <source>"%1" is in edit mode. +Discard changes and close anyway?</source> <translation type="unfinished"></translation> </message> <message> @@ -534,10 +979,22 @@ Save changes?</source> <source>Writing the database failed.</source> <translation type="unfinished"></translation> </message> + <message> + <source>Passwords</source> + <translation type="unfinished"></translation> + </message> <message> <source>Save database as</source> <translation type="unfinished"></translation> </message> + <message> + <source>Export database to CSV file</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Writing the CSV file failed.</source> + <translation type="unfinished"></translation> + </message> <message> <source>New database</source> <translation type="unfinished"></translation> @@ -555,76 +1012,19 @@ Save changes?</source> Please press cancel to finish your changes or discard them.</source> <translation type="unfinished"></translation> </message> - <message> - <source>This database has never been saved. -You can save the database or stop locking it.</source> - <translation type="unfinished"></translation> - </message> <message> <source>This database has been modified. Do you want to save the database before locking it? Otherwise your changes are lost.</source> <translation type="unfinished"></translation> </message> - <message> - <source>"%1" is in edit mode. -Discard changes and close anyway?</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Export database to CSV file</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>CSV file</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Writing the CSV file failed.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Unable to open the database.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Merge database</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>The database you are trying to save as is locked by another instance of KeePassXC. -Do you want to save it anyway?</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Passwords</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Database already opened</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>The database you are trying to open is locked by another instance of KeePassXC. - -Do you want to open it anyway?</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Open read-only</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>File opened in read only mode.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Open CSV file</source> - <translation type="unfinished"></translation> - </message> </context> <context> <name>DatabaseWidget</name> + <message> + <source>Searching...</source> + <translation type="unfinished"></translation> + </message> <message> <source>Change master key</source> <translation type="unfinished"></translation> @@ -645,6 +1045,14 @@ Do you want to open it anyway?</source> <source>Do you really want to delete %1 entries for good?</source> <translation type="unfinished"></translation> </message> + <message> + <source>Move entry to recycle bin?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Do you really want to move entry "%1" to the recycle bin?</source> + <translation type="unfinished"></translation> + </message> <message> <source>Move entries to recycle bin?</source> <translation type="unfinished"></translation> @@ -656,6 +1064,18 @@ Do you want to open it anyway?</source> <numerusform></numerusform> </translation> </message> + <message> + <source>Execute command?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remember my choice</source> + <translation type="unfinished"></translation> + </message> <message> <source>Delete group?</source> <translation type="unfinished"></translation> @@ -668,18 +1088,6 @@ Do you want to open it anyway?</source> <source>Unable to calculate master key</source> <translation type="unfinished"></translation> </message> - <message> - <source>Move entry to recycle bin?</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Searching...</source> - <translation type="unfinished"></translation> - </message> <message> <source>No current database.</source> <translation type="unfinished"></translation> @@ -697,19 +1105,7 @@ Do you want to open it anyway?</source> <translation type="unfinished"></translation> </message> <message> - <source>Execute command?</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Do you really want to execute the following command?<br><br>%1<br></source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Remember my choice</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Autoreload Request</source> + <source>File has changed</source> <translation type="unfinished"></translation> </message> <message> @@ -721,7 +1117,8 @@ Do you want to open it anyway?</source> <translation type="unfinished"></translation> </message> <message> - <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> + <source>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</source> <translation type="unfinished"></translation> </message> <message> @@ -737,6 +1134,89 @@ Do you want to open it anyway?</source> <translation type="unfinished"></translation> </message> </context> +<context> + <name>DetailsWidget</name> + <message> + <source>Generate TOTP Token</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Close</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>General</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Password</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>URL</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Expiration</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Username</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Autotype</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Searching</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Attributes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Attachments</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Notes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Window</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Sequence</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Search</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Clear</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Never</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>[PROTECTED]</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Disabled</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Enabled</source> + <translation type="unfinished"></translation> + </message> +</context> <context> <name>EditEntryWidget</name> <message> @@ -763,6 +1243,30 @@ Do you want to open it anyway?</source> <source>History</source> <translation type="unfinished"></translation> </message> + <message> + <source>SSH Agent</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>(encrypted)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select private key</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>File too large to be a private key</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Failed to open private key</source> + <translation type="unfinished"></translation> + </message> <message> <source>Entry history</source> <translation type="unfinished"></translation> @@ -784,20 +1288,19 @@ Do you want to open it anyway?</source> <translation type="unfinished"></translation> </message> <message> - <source>Select file</source> + <source>Confirm Remove</source> <translation type="unfinished"></translation> </message> <message> - <source>Unable to open file</source> + <source>Are you sure you want to remove this attribute?</source> <translation type="unfinished"></translation> </message> <message> - <source>Save attachment</source> + <source>[PROTECTED]</source> <translation type="unfinished"></translation> </message> <message> - <source>Unable to save the attachment: -</source> + <source>Press reveal to view or edit</source> <translation type="unfinished"></translation> </message> <message> @@ -822,22 +1325,6 @@ Do you want to open it anyway?</source> <source>1 year</source> <translation type="unfinished"></translation> </message> - <message> - <source>Confirm Remove</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Are you sure you want to remove this attribute?</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>[PROTECTED] Press reveal to view or edit</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Are you sure you want to remove this attachment?</source> - <translation type="unfinished"></translation> - </message> </context> <context> <name>EditEntryWidgetAdvanced</name> @@ -853,18 +1340,6 @@ Do you want to open it anyway?</source> <source>Remove</source> <translation type="unfinished"></translation> </message> - <message> - <source>Attachments</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Save</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Open</source> - <translation type="unfinished"></translation> - </message> <message> <source>Edit Name</source> <translation type="unfinished"></translation> @@ -877,6 +1352,10 @@ Do you want to open it anyway?</source> <source>Reveal</source> <translation type="unfinished"></translation> </message> + <message> + <source>Attachments</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -884,6 +1363,18 @@ Do you want to open it anyway?</source> <source>Enable Auto-Type for this entry</source> <translation type="unfinished"></translation> </message> + <message> + <source>Inherit default Auto-Type sequence from the &group</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Use custom Auto-Type sequence:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Window Associations</source> + <translation type="unfinished"></translation> + </message> <message> <source>+</source> <translation type="unfinished"></translation> @@ -896,14 +1387,6 @@ Do you want to open it anyway?</source> <source>Window title:</source> <translation type="unfinished"></translation> </message> - <message> - <source>Inherit default Auto-Type sequence from the &group</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Use custom Auto-Type sequence:</source> - <translation type="unfinished"></translation> - </message> <message> <source>Use default se&quence</source> <translation type="unfinished"></translation> @@ -912,10 +1395,6 @@ Do you want to open it anyway?</source> <source>Set custo&m sequence:</source> <translation type="unfinished"></translation> </message> - <message> - <source>Window Associations</source> - <translation type="unfinished"></translation> - </message> </context> <context> <name>EditEntryWidgetHistory</name> @@ -939,11 +1418,7 @@ Do you want to open it anyway?</source> <context> <name>EditEntryWidgetMain</name> <message> - <source>Title:</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Username:</source> + <source>URL:</source> <translation type="unfinished"></translation> </message> <message> @@ -955,11 +1430,11 @@ Do you want to open it anyway?</source> <translation type="unfinished"></translation> </message> <message> - <source>URL:</source> + <source>Title:</source> <translation type="unfinished"></translation> </message> <message> - <source>Expires</source> + <source>Notes</source> <translation type="unfinished"></translation> </message> <message> @@ -967,7 +1442,91 @@ Do you want to open it anyway?</source> <translation type="unfinished"></translation> </message> <message> - <source>Notes:</source> + <source>Toggle the checkbox to reveal the notes section.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Username:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Expires</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>EditEntryWidgetSSHAgent</name> + <message> + <source>Form</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove key from agent after</source> + <translation type="unfinished"></translation> + </message> + <message> + <source> seconds</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Fingerprint</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove key from agent when database is closed/locked</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Public key</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Add key to agent when database is opened/unlocked</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Comment</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Decrypt</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy to clipboard</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Private key</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>External file</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <source>Attachment</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Add to agent</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove from agent</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Require user confirmation when this key is used</source> <translation type="unfinished"></translation> </message> </context> @@ -1039,6 +1598,14 @@ Do you want to open it anyway?</source> </context> <context> <name>EditWidgetIcons</name> + <message> + <source>&Use default icon</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Use custo&m icon</source> + <translation type="unfinished"></translation> + </message> <message> <source>Add custom icon</source> <translation type="unfinished"></translation> @@ -1047,6 +1614,18 @@ Do you want to open it anyway?</source> <source>Delete custom icon</source> <translation type="unfinished"></translation> </message> + <message> + <source>Download favicon</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unable to fetch favicon.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> + <translation type="unfinished"></translation> + </message> <message> <source>Images</source> <translation type="unfinished"></translation> @@ -1059,24 +1638,12 @@ Do you want to open it anyway?</source> <source>Select Image</source> <translation type="unfinished"></translation> </message> - <message> - <source>Download favicon</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Unable to fetch favicon.</source> - <translation type="unfinished"></translation> - </message> <message> <source>Can't read icon</source> <translation type="unfinished"></translation> </message> <message> - <source>&Use default icon</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Use custo&m icon</source> + <source>Custom icon already exists</source> <translation type="unfinished"></translation> </message> <message> @@ -1087,14 +1654,6 @@ Do you want to open it anyway?</source> <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> <translation type="unfinished"></translation> </message> - <message> - <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Custom icon already exists</source> - <translation type="unfinished"></translation> - </message> </context> <context> <name>EditWidgetProperties</name> @@ -1119,6 +1678,93 @@ Do you want to open it anyway?</source> <name>Entry</name> <message> <source> - Clone</source> + <comment>Suffix added to cloned entries</comment> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>EntryAttachmentsModel</name> + <message> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Size</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>EntryAttachmentsWidget</name> + <message> + <source>Form</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Add</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Select files</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <source>Are you sure you want to remove %n attachment(s)?</source> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> + <message> + <source>Confirm Remove</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save attachments</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unable to create directory: +%1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Confirm overwrite</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unable to save attachments: +%1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unable to open attachment: +%1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unable to open attachments: +%1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unable to open files: +%1</source> <translation type="unfinished"></translation> </message> </context> @@ -1150,6 +1796,11 @@ Do you want to open it anyway?</source> </context> <context> <name>EntryModel</name> + <message> + <source>Ref: </source> + <comment>Reference abbreviation</comment> + <translation type="unfinished"></translation> + </message> <message> <source>Group</source> <translation type="unfinished"></translation> @@ -1166,11 +1817,6 @@ Do you want to open it anyway?</source> <source>URL</source> <translation type="unfinished"></translation> </message> - <message> - <source>Ref: </source> - <comment>Reference abbreviation</comment> - <translation type="unfinished"></translation> - </message> </context> <context> <name>Group</name> @@ -1179,6 +1825,17 @@ Do you want to open it anyway?</source> <translation type="unfinished"></translation> </message> </context> +<context> + <name>HostInstaller</name> + <message> + <source>KeePassXC: Cannot save file!</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Cannot save the native messaging script file.</source> + <translation type="unfinished"></translation> + </message> +</context> <context> <name>HttpPasswordGeneratorWidget</name> <message> @@ -1241,6 +1898,358 @@ Do you want to open it anyway?</source> <translation type="unfinished"></translation> </message> </context> +<context> + <name>Kdbx3Reader</name> + <message> + <source>Unable to calculate master key</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unable to issue challenge-response.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>Kdbx3Writer</name> + <message> + <source>Unable to issue challenge-response.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>Kdbx4Reader</name> + <message> + <source>missing database headers</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid header checksum size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Header SHA256 mismatch</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unknown cipher</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid header id size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid header field length</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid header data length</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Failed to open buffer for KDF parameters in header</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unsupported key derivation function (KDF) or invalid parameters</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Legacy header fields found in KDBX4 file.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid inner header id size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid inner header field length</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid inner header binary size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unsupported KeePass variant map version.</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid variant map entry name length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid variant map entry name data</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid variant map entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid variant map entry value data</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid variant map Bool entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid variant map Int32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid variant map UInt32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid variant map Int64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid variant map UInt64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid variant map entry type</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid variant map field type size</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>Kdbx4Writer</name> + <message> + <source>Invalid symmetric cipher algorithm.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid symmetric cipher IV size.</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Failed to serialize KDF parameters variant map</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>KdbxReader</name> + <message> + <source>Invalid cipher uuid length</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unsupported cipher</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid compression flags length</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unsupported compression algorithm</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid master seed size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid transform rounds size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid start bytes size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid random stream id size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid inner random stream cipher</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Not a KeePass database.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unsupported KeePass 2 database version.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>KdbxXmlReader</name> + <message> + <source>XML parsing failure: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No root group</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Missing icon uuid or data</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Missing custom data key or value</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Multiple group elements</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Null group uuid</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid group icon number</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid EnableAutoType value</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid EnableSearching value</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No group uuid found</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Null DeleteObject uuid</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Missing DeletedObject uuid or time</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Null entry uuid</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid entry icon number</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>History element in history entry</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No entry uuid found</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>History element with different uuid</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unable to decrypt entry string</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Duplicate custom attribute found</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Entry string key or value missing</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Duplicate attachment found</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Entry binary key or value missing</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Auto-type association window or sequence missing</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid bool value</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid date time value</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid color value</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid color rgb part</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid number value</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid uuid value</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unable to decompress binary</source> + <extracomment>Translator meant is a binary data inside an entry</extracomment> + <translation type="unfinished"></translation> + </message> +</context> <context> <name>KeePass1OpenWidget</name> <message> @@ -1270,6 +2279,35 @@ Do you want to open it anyway?</source> <source>Unsupported KeePass database version.</source> <translation type="unfinished"></translation> </message> + <message> + <source>Unable to read encryption IV</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid number of groups</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid number of entries</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid content hash size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid number of transform rounds</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unable to construct group tree</source> + <translation type="unfinished"></translation> + </message> <message> <source>Root</source> <translation type="unfinished"></translation> @@ -1282,56 +2320,103 @@ Do you want to open it anyway?</source> <source>Wrong key or database file is corrupt.</source> <translation type="unfinished"></translation> </message> -</context> -<context> - <name>KeePass2Reader</name> <message> - <source>Not a KeePass database.</source> + <source>Key transformation failed</source> <translation type="unfinished"></translation> </message> <message> - <source>Unsupported KeePass database version.</source> + <source>Invalid group field type number</source> <translation type="unfinished"></translation> </message> <message> - <source>Wrong key or database file is corrupt.</source> + <source>Invalid group field size</source> <translation type="unfinished"></translation> </message> <message> - <source>Unable to calculate master key</source> + <source>Read group field data doesn't match size</source> <translation type="unfinished"></translation> </message> <message> - <source>Unable to issue challenge-response.</source> + <source>Incorrect group id field size</source> <translation type="unfinished"></translation> </message> <message> - <source>The selected file is an old KeePass 1 database (.kdb). - -You can import it by clicking on Database > 'Import KeePass 1 database...'. -This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>KeePass2Writer</name> - <message> - <source>Unable to issue challenge-response.</source> + <source>Incorrect group creation time field size</source> <translation type="unfinished"></translation> </message> <message> - <source>Unable to calculate master key</source> + <source>Incorrect group modification time field size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Incorrect group access time field size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Incorrect group expiry time field size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Incorrect group icon field size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Incorrect group level field size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid group field type</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Missing group id or level</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Missing entry field type number</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid entry field size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Read entry field data doesn't match size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid entry uuid field size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid entry group id field size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid entry icon field size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid entry creation time field size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid entry modification time field size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid entry expiry time field size</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Invalid entry field type</source> <translation type="unfinished"></translation> </message> </context> <context> <name>Main</name> <message> - <source>Fatal error while testing the cryptographic functions.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>KeePassXC - Error</source> + <source>Existing single-instance lock file is invalid. Launching new instance.</source> <translation type="unfinished"></translation> </message> <message> @@ -1343,64 +2428,32 @@ This is a one-way migration. You won't be able to open the imported databas <translation type="unfinished"></translation> </message> <message> - <source>Existing single-instance lock file is invalid. Launching new instance.</source> + <source>Fatal error while testing the cryptographic functions.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>KeePassXC - Error</source> <translation type="unfinished"></translation> </message> </context> <context> <name>MainWindow</name> <message> - <source>Open database</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Database settings</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Copy username to clipboard</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Copy password to clipboard</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Settings</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Show toolbar</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>read-only</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Toggle window</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>KeePass 2 Database</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>All files</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Save repaired database</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Writing the database failed.</source> + <source>&Database</source> <translation type="unfinished"></translation> </message> <message> <source>&Recent databases</source> <translation type="unfinished"></translation> </message> + <message> + <source>Import</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Help</source> + <translation type="unfinished"></translation> + </message> <message> <source>E&ntries</source> <translation type="unfinished"></translation> @@ -1409,12 +2462,16 @@ This is a one-way migration. You won't be able to open the imported databas <source>Copy att&ribute to clipboard</source> <translation type="unfinished"></translation> </message> + <message> + <source>Time-based one-time password</source> + <translation type="unfinished"></translation> + </message> <message> <source>&Groups</source> <translation type="unfinished"></translation> </message> <message> - <source>&View</source> + <source>&Tools</source> <translation type="unfinished"></translation> </message> <message> @@ -1425,6 +2482,10 @@ This is a one-way migration. You won't be able to open the imported databas <source>&About</source> <translation type="unfinished"></translation> </message> + <message> + <source>&Open database...</source> + <translation type="unfinished"></translation> + </message> <message> <source>&Save database</source> <translation type="unfinished"></translation> @@ -1465,26 +2526,26 @@ This is a one-way migration. You won't be able to open the imported databas <source>&Delete group</source> <translation type="unfinished"></translation> </message> + <message> + <source>Sa&ve database as...</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Change &master key...</source> + <translation type="unfinished"></translation> + </message> <message> <source>&Database settings</source> <translation type="unfinished"></translation> </message> + <message> + <source>Database settings</source> + <translation type="unfinished"></translation> + </message> <message> <source>&Clone entry</source> <translation type="unfinished"></translation> </message> - <message> - <source>Timed one-time password</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Copy &TOTP</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Show TOTP</source> - <translation type="unfinished"></translation> - </message> <message> <source>&Find</source> <translation type="unfinished"></translation> @@ -1493,14 +2554,26 @@ This is a one-way migration. You won't be able to open the imported databas <source>Copy &username</source> <translation type="unfinished"></translation> </message> + <message> + <source>Copy username to clipboard</source> + <translation type="unfinished"></translation> + </message> <message> <source>Cop&y password</source> <translation type="unfinished"></translation> </message> + <message> + <source>Copy password to clipboard</source> + <translation type="unfinished"></translation> + </message> <message> <source>&Settings</source> <translation type="unfinished"></translation> </message> + <message> + <source>Password Generator</source> + <translation type="unfinished"></translation> + </message> <message> <source>&Perform Auto-Type</source> <translation type="unfinished"></translation> @@ -1517,64 +2590,24 @@ This is a one-way migration. You won't be able to open the imported databas <source>&Title</source> <translation type="unfinished"></translation> </message> + <message> + <source>Copy title to clipboard</source> + <translation type="unfinished"></translation> + </message> <message> <source>&URL</source> <translation type="unfinished"></translation> </message> + <message> + <source>Copy URL to clipboard</source> + <translation type="unfinished"></translation> + </message> <message> <source>&Notes</source> <translation type="unfinished"></translation> </message> <message> - <source>Password Generator</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Clear history</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Database</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Import</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Tools</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Empty recycle bin</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Access error for config file %1</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Quit KeePassXC</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Please touch the button on your YubiKey!</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Help</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Open database...</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Sa&ve database as...</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Change &master key...</source> + <source>Copy notes to clipboard</source> <translation type="unfinished"></translation> </message> <message> @@ -1593,10 +2626,169 @@ This is a one-way migration. You won't be able to open the imported databas <source>Re&pair database...</source> <translation type="unfinished"></translation> </message> + <message> + <source>Show TOTP</source> + <translation type="unfinished"></translation> + </message> <message> <source>Set up TOTP...</source> <translation type="unfinished"></translation> </message> + <message> + <source>Copy &TOTP</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>E&mpty recycle bin</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Clear history</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>read-only</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Settings</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Toggle window</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Quit KeePassXC</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>All files</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Open database</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Save repaired database</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Please touch the button on your YubiKey!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>OpenSSHKey</name> + <message> + <source>Invalid key file, expecting an OpenSSH key</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>PEM boundary mismatch</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>This is not an OpenSSH key, only modern keys are supported</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Base64 decoding failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Key file way too small.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Key file magic header id invalid</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Found zero keys</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Failed to read public key.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Corrupted key file, reading private key failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No private key payload to decrypt</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unknown cipher: </source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Trying to run KDF without cipher</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Passphrase is required to decrypt this key</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Key derivation failed, key file corrupted?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unknown KDF: </source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Decryption failed, wrong passphrase?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unexpected EOF while reading public key</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unknown key type: </source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unexpected EOF while reading private key</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Can't write public key as it is empty</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unexpected EOF when writing public key</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Can't write private key as it is empty</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unexpected EOF when writing private key</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>OptionDialog</name> @@ -1604,22 +2796,63 @@ This is a one-way migration. You won't be able to open the imported databas <source>Dialog</source> <translation type="unfinished"></translation> </message> + <message> + <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Enable KeePassHTTP server</source> + <translation type="unfinished"></translation> + </message> <message> <source>General</source> <translation type="unfinished"></translation> </message> <message> <source>Sh&ow a notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"></translation> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Return only best matching entries</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Match URL schemes</source> <translation type="unfinished"></translation> </message> <message> <source>Sort matching entries by &username</source> <translation type="unfinished"></translation> </message> + <message> + <source>Sort &matching entries by title</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>R&emove all shared encryption keys from active database</source> + <translation type="unfinished"></translation> + </message> <message> <source>Re&move all stored permissions from entries in active database</source> <translation type="unfinished"></translation> </message> + <message> + <source>Password Generator</source> + <translation type="unfinished"></translation> + </message> <message> <source>Advanced</source> <translation type="unfinished"></translation> @@ -1632,10 +2865,22 @@ This is a one-way migration. You won't be able to open the imported databas <source>Always allow &updating entries</source> <translation type="unfinished"></translation> </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation type="unfinished"></translation> + </message> <message> <source>Searc&h in all opened databases for matching entries</source> <translation type="unfinished"></translation> </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation type="unfinished"></translation> + </message> <message> <source>HTTP Port:</source> <translation type="unfinished"></translation> @@ -1644,18 +2889,18 @@ This is a one-way migration. You won't be able to open the imported databas <source>Default port: 19455</source> <translation type="unfinished"></translation> </message> - <message> - <source>Re&quest to unlock the database if it is locked</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Sort &matching entries by title</source> - <translation type="unfinished"></translation> - </message> <message> <source>KeePassXC will listen to this port on 127.0.0.1</source> <translation type="unfinished"></translation> </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> + <translation type="unfinished"></translation> + </message> <message> <source>Cannot bind to privileged ports</source> <translation type="unfinished"></translation> @@ -1665,62 +2910,30 @@ This is a one-way migration. You won't be able to open the imported databas Using default port 19455.</source> <translation type="unfinished"></translation> </message> - <message> - <source>R&emove all shared encryption keys from active database</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Return advanced string fields which start with "KPH: "</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Automatically creating or updating string fields is not supported.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Enable KeePassHTTP server</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Return only best matching entries</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Match URL schemes</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Password Generator</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Only the selected database has to be connected with a client.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>The following options can be dangerous! -Change them only if you know what you are doing.</source> - <translation type="unfinished"></translation> - </message> </context> <context> <name>PasswordGeneratorWidget</name> + <message> + <source>%p%</source> + <translation type="unfinished"></translation> + </message> <message> <source>Password:</source> <translation type="unfinished"></translation> </message> + <message> + <source>strength</source> + <comment>Password strength</comment> + <translation type="unfinished"></translation> + </message> + <message> + <source>entropy</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Password</source> + <translation type="unfinished"></translation> + </message> <message> <source>Character Types</source> <translation type="unfinished"></translation> @@ -1741,38 +2954,50 @@ Change them only if you know what you are doing.</source> <source>Special Characters</source> <translation type="unfinished"></translation> </message> + <message> + <source>Extended ASCII</source> + <translation type="unfinished"></translation> + </message> <message> <source>Exclude look-alike characters</source> <translation type="unfinished"></translation> </message> - <message> - <source>Accept</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>%p%</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>strength</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>entropy</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>&Length:</source> - <translation type="unfinished"></translation> - </message> <message> <source>Pick characters from every group</source> <translation type="unfinished"></translation> </message> + <message> + <source>&Length:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Passphrase</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Wordlist:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Word Count:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Word Separator:</source> + <translation type="unfinished"></translation> + </message> <message> <source>Generate</source> <translation type="unfinished"></translation> </message> + <message> + <source>Copy</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Accept</source> + <translation type="unfinished"></translation> + </message> <message> <source>Close</source> <translation type="unfinished"></translation> @@ -1791,51 +3016,270 @@ Change them only if you know what you are doing.</source> </message> <message> <source>Poor</source> + <comment>Password quality</comment> <translation type="unfinished"></translation> </message> <message> <source>Weak</source> + <comment>Password quality</comment> <translation type="unfinished"></translation> </message> <message> <source>Good</source> + <comment>Password quality</comment> <translation type="unfinished"></translation> </message> <message> <source>Excellent</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Password</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Extended ASCII</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Passphrase</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Wordlist:</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Word Count:</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Word Separator:</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Copy</source> + <comment>Password quality</comment> <translation type="unfinished"></translation> </message> </context> <context> <name>QObject</name> + <message> + <source>Database not opened</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Database hash not available</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Client public key not received</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Cannot decrypt message</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Timeout or cannot connect to KeePassXC</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Action cancelled or denied</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>KeePassXC association failed, try again</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Key change was not successful</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Encryption key is not recognized</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No saved databases found</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Incorrect action</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Empty message received</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No URL provided</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>No logins found</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unknown error</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Add a new entry to a database.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Path of the database.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Key file of the database.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>path</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Username for the entry.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>username</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>URL for the entry.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>URL</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Prompt for the entry's password.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Generate a password for the entry.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Length for the generated password.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>length</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Path of the entry to add.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Copy an entry's password to the clipboard.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Path of the entry to clip.</source> + <comment>clip = copy to clipboard</comment> + <translation type="unfinished"></translation> + </message> + <message> + <source>Timeout in seconds before clearing the clipboard.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Edit an entry.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Title for the entry.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>title</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Path of the entry to edit.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Estimate the entropy of a password.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Password for which to estimate the entropy.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Perform advanced analysis on the password.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Extract and print the content of a database.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Path of the database to extract.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Insert password to unlock %1: </source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Failed to load key file %1 : %2</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source> + +Available commands: +</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Name of the command to execute.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>List database entries.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Path of the group to list. Default is /</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Find entries quickly.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Search term.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Merge two databases.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Path of the database to merge into.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Path of the database to merge from.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Use the same credentials for both database files.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Key file of the database to merge from.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Show an entry's information.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>attribute</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Name of the entry to show.</source> + <translation type="unfinished"></translation> + </message> <message> <source>NULL device</source> <translation type="unfinished"></translation> @@ -1858,7 +3302,27 @@ Change them only if you know what you are doing.</source> <translation type="unfinished"></translation> </message> <message> - <source>INTERNAL - unget lower bound exceeded</source> + <source>AES: 256-bit</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Twofish: 256-bit</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>ChaCha20: 256-bit</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Argon2 (KDBX 4 – recommended)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>AES-KDF (KDBX 4)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>AES-KDF (KDBX 3.1)</source> <translation type="unfinished"></translation> </message> <message> @@ -1878,11 +3342,19 @@ Change them only if you know what you are doing.</source> <translation type="unfinished"></translation> </message> <message> - <source>URL</source> + <source>Notes</source> <translation type="unfinished"></translation> </message> <message> - <source>Notes</source> + <source>Last Modified</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Created</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Legacy Browser Integration</source> <translation type="unfinished"></translation> </message> <message> @@ -1901,6 +3373,10 @@ Change them only if you know what you are doing.</source> <source>Passive</source> <translation type="unfinished"></translation> </message> + <message> + <source>SSH Agent</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>QtIOCompressor</name> @@ -1939,7 +3415,7 @@ Change them only if you know what you are doing.</source> <context> <name>SearchWidget</name> <message> - <source>Case Sensitive</source> + <source>Search...</source> <translation type="unfinished"></translation> </message> <message> @@ -1951,7 +3427,7 @@ Change them only if you know what you are doing.</source> <translation type="unfinished"></translation> </message> <message> - <source>Search...</source> + <source>Case Sensitive</source> <translation type="unfinished"></translation> </message> <message> @@ -1961,48 +3437,6 @@ Change them only if you know what you are doing.</source> </context> <context> <name>Service</name> - <message> - <source>A shared encryption-key with the name "%1" already exists. -Do you want to overwrite it?</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Do you want to update the information in %1 - %2?</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>The active database is locked! -Please unlock the selected database or choose another one which is unlocked.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Successfully removed %1 encryption-%2 from KeePassX/Http Settings.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>No shared encryption-keys found in KeePassHttp Settings.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>The active database does not contain an entry of KeePassHttp Settings.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Removing stored permissions...</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Abort</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Successfully removed permissions from %1 %2.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>The active database does not contain an entry with permissions.</source> - <translation type="unfinished"></translation> - </message> <message> <source>KeePassXC: New key association request</source> <translation type="unfinished"></translation> @@ -2017,34 +3451,82 @@ give it a unique name to identify and accept it.</source> <source>KeePassXC: Overwrite existing key?</source> <translation type="unfinished"></translation> </message> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"></translation> + </message> <message> <source>KeePassXC: Update Entry</source> <translation type="unfinished"></translation> </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation type="unfinished"></translation> + </message> <message> <source>KeePassXC: Database locked!</source> <translation type="unfinished"></translation> </message> <message> - <source>KeePassXC: Removed keys from database</source> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> <translation type="unfinished"></translation> </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> <message> <source>KeePassXC: No keys found</source> <translation type="unfinished"></translation> </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation type="unfinished"></translation> + </message> <message> <source>KeePassXC: Settings not available!</source> <translation type="unfinished"></translation> </message> <message> - <source>KeePassXC: Removed permissions</source> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> <translation type="unfinished"></translation> </message> + <message> + <source>Removing stored permissions...</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Abort</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entries.</source> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> <message> <source>KeePassXC: No entry with permissions found!</source> <translation type="unfinished"></translation> </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>SettingsWidget</name> @@ -2067,10 +3549,26 @@ give it a unique name to identify and accept it.</source> </context> <context> <name>SettingsWidgetGeneral</name> + <message> + <source>Basic Settings</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Start only a single instance of KeePassXC</source> + <translation type="unfinished"></translation> + </message> <message> <source>Remember last databases</source> <translation type="unfinished"></translation> </message> + <message> + <source>Remember last key files and security dongles</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Load previous databases on startup</source> + <translation type="unfinished"></translation> + </message> <message> <source>Automatically save on exit</source> <translation type="unfinished"></translation> @@ -2079,20 +3577,28 @@ give it a unique name to identify and accept it.</source> <source>Automatically save after every change</source> <translation type="unfinished"></translation> </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation type="unfinished"></translation> + </message> <message> <source>Minimize when copying to clipboard</source> <translation type="unfinished"></translation> </message> + <message> + <source>Minimize window at application startup</source> + <translation type="unfinished"></translation> + </message> <message> <source>Use group icon on entry creation</source> <translation type="unfinished"></translation> </message> <message> - <source>Global Auto-Type shortcut</source> + <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> <translation type="unfinished"></translation> </message> <message> - <source>Language</source> + <source>Hide the Details view</source> <translation type="unfinished"></translation> </message> <message> @@ -2103,32 +3609,16 @@ give it a unique name to identify and accept it.</source> <source>Hide window to system tray when minimized</source> <translation type="unfinished"></translation> </message> - <message> - <source>Load previous databases on startup</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Automatically reload the database when modified externally</source> - <translation type="unfinished"></translation> - </message> <message> <source>Hide window to system tray instead of app exit</source> <translation type="unfinished"></translation> </message> <message> - <source>Minimize window at application startup</source> + <source>Dark system tray icon</source> <translation type="unfinished"></translation> </message> <message> - <source>Basic Settings</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Remember last key files and security dongles</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> + <source>Language</source> <translation type="unfinished"></translation> </message> <message> @@ -2136,34 +3626,44 @@ give it a unique name to identify and accept it.</source> <translation type="unfinished"></translation> </message> <message> - <source>Use entry title and URL to match windows for global Auto-Type</source> + <source>Use entry title to match windows for global Auto-Type</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Use entry URL to match windows for global Auto-Type</source> <translation type="unfinished"></translation> </message> <message> <source>Always ask before performing Auto-Type</source> <translation type="unfinished"></translation> </message> + <message> + <source>Global Auto-Type shortcut</source> + <translation type="unfinished"></translation> + </message> <message> <source>Auto-Type delay</source> <translation type="unfinished"></translation> </message> <message> <source> ms</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Start only a single instance of KeePassXC</source> + <comment>Milliseconds</comment> <translation type="unfinished"></translation> </message> </context> <context> <name>SettingsWidgetSecurity</name> + <message> + <source>Timeouts</source> + <translation type="unfinished"></translation> + </message> <message> <source>Clear clipboard after</source> <translation type="unfinished"></translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation type="unfinished"></translation> </message> <message> @@ -2171,7 +3671,11 @@ give it a unique name to identify and accept it.</source> <translation type="unfinished"></translation> </message> <message> - <source>Show passwords in cleartext by default</source> + <source>Convenience</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Lock databases when session is locked or lid is closed</source> <translation type="unfinished"></translation> </message> <message> @@ -2183,15 +3687,15 @@ give it a unique name to identify and accept it.</source> <translation type="unfinished"></translation> </message> <message> - <source>Timeouts</source> + <source>Show passwords in cleartext by default</source> <translation type="unfinished"></translation> </message> <message> - <source>Convenience</source> + <source>Hide passwords in the preview panel</source> <translation type="unfinished"></translation> </message> <message> - <source>Lock databases when session is locked or lid is closed</source> + <source>Hide entry notes by default</source> <translation type="unfinished"></translation> </message> <message> @@ -2213,6 +3717,14 @@ give it a unique name to identify and accept it.</source> <source>Key:</source> <translation type="unfinished"></translation> </message> + <message> + <source>Default RFC 6238 token settings</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Steam token settings</source> + <translation type="unfinished"></translation> + </message> <message> <source>Use custom settings</source> <translation type="unfinished"></translation> @@ -2239,6 +3751,7 @@ give it a unique name to identify and accept it.</source> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation type="unfinished"></translation> </message> </context> @@ -2305,6 +3818,26 @@ give it a unique name to identify and accept it.</source> </context> <context> <name>main</name> + <message> + <source>Remove an entry from the database.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Path of the database.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Path of the entry to remove.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>filenames of the password databases to open (*.kdbx)</source> + <translation type="unfinished"></translation> + </message> <message> <source>path to a custom config file</source> <translation type="unfinished"></translation> @@ -2313,80 +3846,12 @@ give it a unique name to identify and accept it.</source> <source>key file of the database</source> <translation type="unfinished"></translation> </message> - <message> - <source>KeePassXC - cross-platform password manager</source> - <translation type="unfinished"></translation> - </message> <message> <source>read password of the database from stdin</source> <translation type="unfinished"></translation> </message> <message> - <source>filenames of the password databases to open (*.kdbx)</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Copy a password to the clipboard</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Path of the database.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Use a GUI prompt unlocking the database.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Name of the entry to clip.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Extract and print the content of a database.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Path of the database to extract.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Name of the command to execute.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>List database entries.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Path of the group to list. Default is /</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Print the UUIDs of the entries and groups.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Merge two databases.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Path of the database to merge into.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Path of the database to merge from.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Use the same password for both database files.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Show a password.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Name of the entry to show.</source> + <source>Parent window handle</source> <translation type="unfinished"></translation> </message> </context> diff --git a/share/translations/keepassx_en_US.ts b/share/translations/keepassx_en_US.ts new file mode 100644 index 000000000..518390f5d --- /dev/null +++ b/share/translations/keepassx_en_US.ts @@ -0,0 +1,3872 @@ +<?xml version="1.0" ?><!DOCTYPE TS><TS language="en_US" version="2.1"> +<context> + <name>AboutDialog</name> + <message> + <source>About KeePassXC</source> + <translation>About KeePassXC</translation> + </message> + <message> + <source>About</source> + <translation>About</translation> + </message> + <message> + <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> + <translation>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> + </message> + <message> + <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</translation> + </message> + <message> + <source>Project Maintainers:</source> + <translation>Project Maintainers:</translation> + </message> + <message> + <source>Contributors</source> + <translation>Contributors</translation> + </message> + <message> + <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></translation> + </message> + <message> + <source>Debug Info</source> + <translation>Debug Info</translation> + </message> + <message> + <source>Include the following information whenever you report a bug:</source> + <translation>Include the following information whenever you report a bug:</translation> + </message> + <message> + <source>Copy to clipboard</source> + <translation>Copy to clipboard</translation> + </message> + <message> + <source>Version %1 +</source> + <translation>Version %1 +</translation> + </message> + <message> + <source>Revision: %1</source> + <translation>Revision: %1</translation> + </message> + <message> + <source>Distribution: %1</source> + <translation>Distribution: %1</translation> + </message> + <message> + <source>Libraries:</source> + <translation>Libraries:</translation> + </message> + <message> + <source>Operating system: %1 +CPU architecture: %2 +Kernel: %3 %4</source> + <translation>Operating system: %1 +CPU architecture: %2 +Kernel: %3 %4</translation> + </message> + <message> + <source>Enabled extensions:</source> + <translation>Enabled extensions:</translation> + </message> +</context> +<context> + <name>AccessControlDialog</name> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>KeePassXC HTTP Confirm Access</translation> + </message> + <message> + <source>Remember this decision</source> + <translation>Remember this decision</translation> + </message> + <message> + <source>Allow</source> + <translation>Allow</translation> + </message> + <message> + <source>Deny</source> + <translation>Deny</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</translation> + </message> +</context> +<context> + <name>AgentSettingsWidget</name> + <message> + <source>Enable SSH Agent (requires restart)</source> + <translation>Enable SSH Agent (requires restart)</translation> + </message> +</context> +<context> + <name>AutoType</name> + <message> + <source>Couldn't find an entry that matches the window title:</source> + <translation>Couldn't find an entry that matches the window title:</translation> + </message> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>Auto-Type - KeePassXC</translation> + </message> + <message> + <source>Auto-Type</source> + <translation>Auto-Type</translation> + </message> + <message> + <source>The Syntax of your Auto-Type statement is incorrect!</source> + <translation>The Syntax of your Auto-Type statement is incorrect!</translation> + </message> + <message> + <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> + <translation>This Auto-Type command contains a very long delay. Do you really want to proceed?</translation> + </message> + <message> + <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> + <translation>This Auto-Type command contains very slow key presses. Do you really want to proceed?</translation> + </message> + <message> + <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> + <translation>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</translation> + </message> +</context> +<context> + <name>AutoTypeAssociationsModel</name> + <message> + <source>Window</source> + <translation>Window</translation> + </message> + <message> + <source>Sequence</source> + <translation>Sequence</translation> + </message> + <message> + <source>Default sequence</source> + <translation>Default sequence</translation> + </message> +</context> +<context> + <name>AutoTypeSelectDialog</name> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>Auto-Type - KeePassXC</translation> + </message> + <message> + <source>Select entry to Auto-Type:</source> + <translation>Select entry to Auto-Type:</translation> + </message> +</context> +<context> + <name>BrowserAccessControlDialog</name> + <message> + <source>KeePassXC-Browser Confirm Access</source> + <translation>KeePassXC-Browser Confirm Access</translation> + </message> + <message> + <source>Remember this decision</source> + <translation>Remember this decision</translation> + </message> + <message> + <source>Allow</source> + <translation>Allow</translation> + </message> + <message> + <source>Deny</source> + <translation>Deny</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</translation> + </message> +</context> +<context> + <name>BrowserOptionDialog</name> + <message> + <source>Dialog</source> + <translation>Dialog</translation> + </message> + <message> + <source>This is required for accessing your databases with KeePassXC-Browser</source> + <translation>This is required for accessing your databases with KeePassXC-Browser</translation> + </message> + <message> + <source>Enable KeepassXC browser integration</source> + <translation>Enable KeepassXC browser integration</translation> + </message> + <message> + <source>General</source> + <translation>General</translation> + </message> + <message> + <source>Enable integration for these browsers:</source> + <translation>Enable integration for these browsers:</translation> + </message> + <message> + <source>&Google Chrome</source> + <translation>&Google Chrome</translation> + </message> + <message> + <source>&Firefox</source> + <translation>&Firefox</translation> + </message> + <message> + <source>&Chromium</source> + <translation>&Chromium</translation> + </message> + <message> + <source>&Vivaldi</source> + <translation>&Vivaldi</translation> + </message> + <message> + <source>Show a &notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Show a &notification when credentials are requested</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Re&quest to unlock the database if it is locked</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> + <translation>Only entries with the same scheme (http://, https://, ...) are returned.</translation> + </message> + <message> + <source>&Match URL scheme (e.g., https://...)</source> + <translation>&Match URL scheme (e.g., https://...)</translation> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>Only returns the best matches for a specific URL instead of all entries for the whole domain.</translation> + </message> + <message> + <source>&Return only best-matching credentials</source> + <translation>&Return only best-matching credentials</translation> + </message> + <message> + <source>Sort &matching credentials by title</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Sort &matching credentials by title</translation> + </message> + <message> + <source>Sort matching credentials by &username</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Sort matching credentials by &username</translation> + </message> + <message> + <source>&Disconnect all browsers</source> + <translation>&Disconnect all browsers</translation> + </message> + <message> + <source>Forget all remembered &permissions</source> + <translation>Forget all remembered &permissions</translation> + </message> + <message> + <source>Advanced</source> + <translation>Advanced</translation> + </message> + <message> + <source>Never &ask before accessing credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Never &ask before accessing credentials</translation> + </message> + <message> + <source>Never ask before &updating credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Never ask before &updating credentials</translation> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>Only the selected database has to be connected with a client.</translation> + </message> + <message> + <source>Searc&h in all opened databases for matching credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Searc&h in all opened databases for matching credentials</translation> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>Automatically creating or updating string fields is not supported.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>&Return advanced string fields which start with "KPH: "</translation> + </message> + <message> + <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> + <translation>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</translation> + </message> + <message> + <source>Update &native messaging manifest files at startup</source> + <translation>Update &native messaging manifest files at startup</translation> + </message> + <message> + <source>Support a proxy application between KeePassXC and browser extension.</source> + <translation>Support a proxy application between KeePassXC and browser extension.</translation> + </message> + <message> + <source>Use a &proxy application between KeePassXC and browser extension</source> + <translation>Use a &proxy application between KeePassXC and browser extension</translation> + </message> + <message> + <source>Use a custom proxy location if you installed a proxy manually.</source> + <translation>Use a custom proxy location if you installed a proxy manually.</translation> + </message> + <message> + <source>Use a &custom proxy location</source> + <comment>Meant is the proxy for KeePassXC-Browser</comment> + <translation>Use a &custom proxy location</translation> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Browse...</translation> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation><b>Warning:</b> The following options can be dangerous!</translation> + </message> + <message> + <source>Executable Files (*.exe);;All Files (*.*)</source> + <translation>Executable Files (*.exe);;All Files (*.*)</translation> + </message> + <message> + <source>Executable Files (*)</source> + <translation>Executable Files (*)</translation> + </message> + <message> + <source>Select custom proxy location</source> + <translation>Select custom proxy location</translation> + </message> +</context> +<context> + <name>BrowserService</name> + <message> + <source>KeePassXC: New key association request</source> + <translation>KeePassXC: New key association request</translation> + </message> + <message> + <source>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</source> + <translation>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</translation> + </message> + <message> + <source>Save and allow access</source> + <translation>Save and allow access</translation> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: Overwrite existing key?</translation> + </message> + <message> + <source>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</translation> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: Update Entry</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Do you want to update the information in %1 - %2?</translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: Database locked!</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</translation> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: Settings not available!</translation> + </message> + <message> + <source>The active database does not contain a settings entry.</source> + <translation>The active database does not contain a settings entry.</translation> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: No keys found</translation> + </message> + <message> + <source>No shared encryption keys found in KeePassXC Settings.</source> + <translation>No shared encryption keys found in KeePassXC Settings.</translation> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: Removed keys from database</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> + <translation><numerusform>Successfully removed %n encryption key from KeePassXC settings.</numerusform><numerusform>Successfully removed %n encryption keys from KeePassXC settings.</numerusform></translation> + </message> + <message> + <source>Removing stored permissions…</source> + <translation>Removing stored permissions…</translation> + </message> + <message> + <source>Abort</source> + <translation>Abort</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: Removed permissions</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entry(s).</source> + <translation><numerusform>Successfully removed permissions from %n entry.</numerusform><numerusform>Successfully removed permissions from %n entries.</numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation>KeePassXC: No entry with permissions found!</translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>The active database does not contain an entry with permissions.</translation> + </message> +</context> +<context> + <name>ChangeMasterKeyWidget</name> + <message> + <source>Password</source> + <translation>Password</translation> + </message> + <message> + <source>Enter password:</source> + <translation>Enter password:</translation> + </message> + <message> + <source>Repeat password:</source> + <translation>Repeat password:</translation> + </message> + <message> + <source>&Key file</source> + <translation>&Key file</translation> + </message> + <message> + <source>Browse</source> + <translation>Browse</translation> + </message> + <message> + <source>Create</source> + <translation>Create</translation> + </message> + <message> + <source>Cha&llenge Response</source> + <translation>Cha&llenge Response</translation> + </message> + <message> + <source>Refresh</source> + <translation>Refresh</translation> + </message> + <message> + <source>Key files</source> + <translation>Key files</translation> + </message> + <message> + <source>All files</source> + <translation>All files</translation> + </message> + <message> + <source>Create Key File...</source> + <translation>Create Key File...</translation> + </message> + <message> + <source>Unable to create Key File : </source> + <translation>Unable to create Key File : </translation> + </message> + <message> + <source>Select a key file</source> + <translation>Select a key file</translation> + </message> + <message> + <source>Empty password</source> + <translation>Empty password</translation> + </message> + <message> + <source>Do you really want to use an empty string as password?</source> + <translation>Do you really want to use an empty string as password?</translation> + </message> + <message> + <source>Different passwords supplied.</source> + <translation>Different passwords supplied.</translation> + </message> + <message> + <source>Failed to set %1 as the Key file: +%2</source> + <translation>Failed to set %1 as the Key file: +%2</translation> + </message> + <message> + <source>Legacy key file format</source> + <translation>Legacy key file format</translation> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</translation> + </message> + <message> + <source>Changing master key failed: no YubiKey inserted.</source> + <translation>Changing master key failed: no YubiKey inserted.</translation> + </message> +</context> +<context> + <name>CloneDialog</name> + <message> + <source>Clone Options</source> + <translation>Clone Options</translation> + </message> + <message> + <source>Append ' - Clone' to title</source> + <translation>Append ' - Clone' to title</translation> + </message> + <message> + <source>Replace username and password with references</source> + <translation>Replace username and password with references</translation> + </message> + <message> + <source>Copy history</source> + <translation>Copy history</translation> + </message> +</context> +<context> + <name>CsvImportWidget</name> + <message> + <source>Import CSV fields</source> + <translation>Import CSV fields</translation> + </message> + <message> + <source>filename</source> + <translation>filename</translation> + </message> + <message> + <source>size, rows, columns</source> + <translation>size, rows, columns</translation> + </message> + <message> + <source>Encoding</source> + <translation>Encoding</translation> + </message> + <message> + <source>Codec</source> + <translation>Codec</translation> + </message> + <message> + <source>Text is qualified by</source> + <translation>Text is qualified by</translation> + </message> + <message> + <source>Fields are separated by</source> + <translation>Fields are separated by</translation> + </message> + <message> + <source>Comments start with</source> + <translation>Comments start with</translation> + </message> + <message> + <source>First record has field names</source> + <translation>First record has field names</translation> + </message> + <message> + <source>Number of headers line to discard</source> + <translation>Number of headers line to discard</translation> + </message> + <message> + <source>Consider '\' an escape character</source> + <translation>Consider '\' an escape character</translation> + </message> + <message> + <source>Preview</source> + <translation>Preview</translation> + </message> + <message> + <source>Column layout</source> + <translation>Column layout</translation> + </message> + <message> + <source>Not present in CSV file</source> + <translation>Not present in CSV file</translation> + </message> + <message> + <source>Empty fieldname </source> + <translation>Empty fieldname </translation> + </message> + <message> + <source>column </source> + <translation>column </translation> + </message> + <message> + <source>Imported from CSV file</source> + <translation>Imported from CSV file</translation> + </message> + <message> + <source>Original data: </source> + <translation>Original data: </translation> + </message> + <message> + <source>Error(s) detected in CSV file !</source> + <translation>Error(s) detected in CSV file !</translation> + </message> + <message> + <source> more messages skipped]</source> + <translation> more messages skipped]</translation> + </message> + <message> + <source>Error</source> + <translation>Error</translation> + </message> + <message> + <source>CSV import: writer has errors: +</source> + <translation>CSV import: writer has errors: +</translation> + </message> +</context> +<context> + <name>CsvImportWizard</name> + <message> + <source>Error</source> + <translation>Error</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Unable to calculate master key</translation> + </message> +</context> +<context> + <name>CsvParserModel</name> + <message numerus="yes"> + <source>%n byte(s), </source> + <translation><numerusform>%n byte, </numerusform><numerusform>%n bytes, </numerusform></translation> + </message> + <message numerus="yes"> + <source>%n row(s), </source> + <translation><numerusform>%n row, </numerusform><numerusform>%n rows, </numerusform></translation> + </message> + <message numerus="yes"> + <source>%n column(s)</source> + <translation><numerusform>%n column</numerusform><numerusform>%n columns</numerusform></translation> + </message> +</context> +<context> + <name>DatabaseOpenWidget</name> + <message> + <source>Enter master key</source> + <translation>Enter master key</translation> + </message> + <message> + <source>Key File:</source> + <translation>Key File:</translation> + </message> + <message> + <source>Password:</source> + <translation>Password:</translation> + </message> + <message> + <source>Browse</source> + <translation>Browse</translation> + </message> + <message> + <source>Refresh</source> + <translation>Refresh</translation> + </message> + <message> + <source>Challenge Response:</source> + <translation>Challenge Response:</translation> + </message> + <message> + <source>Unable to open the database.</source> + <translation>Unable to open the database.</translation> + </message> + <message> + <source>Can't open key file</source> + <translation>Can't open key file</translation> + </message> + <message> + <source>Legacy key file format</source> + <translation>Legacy key file format</translation> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</translation> + </message> + <message> + <source>Don't show this warning again</source> + <translation>Don't show this warning again</translation> + </message> + <message> + <source>All files</source> + <translation>All files</translation> + </message> + <message> + <source>Key files</source> + <translation>Key files</translation> + </message> + <message> + <source>Select key file</source> + <translation>Select key file</translation> + </message> +</context> +<context> + <name>DatabaseRepairWidget</name> + <message> + <source>Repair database</source> + <translation>Repair database</translation> + </message> + <message> + <source>Error</source> + <translation>Error</translation> + </message> + <message> + <source>Can't open key file</source> + <translation>Can't open key file</translation> + </message> + <message> + <source>Unable to open the database.</source> + <translation>Unable to open the database.</translation> + </message> + <message> + <source>Database opened fine. Nothing to do.</source> + <translation>Database opened fine. Nothing to do.</translation> + </message> + <message> + <source>Success</source> + <translation>Success</translation> + </message> + <message> + <source>The database has been successfully repaired +You can now save it.</source> + <translation>The database has been successfully repaired +You can now save it.</translation> + </message> + <message> + <source>Unable to repair the database.</source> + <translation>Unable to repair the database.</translation> + </message> +</context> +<context> + <name>DatabaseSettingsWidget</name> + <message> + <source>General</source> + <translation>General</translation> + </message> + <message> + <source>Encryption</source> + <translation>Encryption</translation> + </message> + <message> + <source>Number of rounds too high</source> + <comment>Key transformation rounds</comment> + <translation>Number of rounds too high</translation> + </message> + <message> + <source>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</source> + <translation>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</translation> + </message> + <message> + <source>Understood, keep number</source> + <translation>Understood, keep number</translation> + </message> + <message> + <source>Cancel</source> + <translation>Cancel</translation> + </message> + <message> + <source>Number of rounds too low</source> + <comment>Key transformation rounds</comment> + <translation>Number of rounds too low</translation> + </message> + <message> + <source>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</source> + <translation>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</translation> + </message> + <message> + <source>KDF unchanged</source> + <translation>KDF unchanged</translation> + </message> + <message> + <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> + <translation>Failed to transform key with new KDF parameters; KDF unchanged.</translation> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetEncryption</name> + <message> + <source>Encryption Algorithm:</source> + <translation>Encryption Algorithm:</translation> + </message> + <message> + <source>AES: 256 Bit (default)</source> + <translation>AES: 256 Bit (default)</translation> + </message> + <message> + <source>Twofish: 256 Bit</source> + <translation>Twofish: 256 Bit</translation> + </message> + <message> + <source>Key Derivation Function:</source> + <translation>Key Derivation Function:</translation> + </message> + <message> + <source>Transform rounds:</source> + <translation>Transform rounds:</translation> + </message> + <message> + <source>Benchmark 1-second delay</source> + <translation>Benchmark 1-second delay</translation> + </message> + <message> + <source>Memory Usage:</source> + <translation>Memory Usage:</translation> + </message> + <message> + <source> MB</source> + <translation> MB</translation> + </message> + <message> + <source>Parallelism:</source> + <translation>Parallelism:</translation> + </message> + <message> + <source> thread</source> + <translation> thread</translation> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetGeneral</name> + <message> + <source>Database Meta Data</source> + <translation>Database Meta Data</translation> + </message> + <message> + <source>Database name:</source> + <translation>Database name:</translation> + </message> + <message> + <source>Database description:</source> + <translation>Database description:</translation> + </message> + <message> + <source>Default username:</source> + <translation>Default username:</translation> + </message> + <message> + <source>History Settings</source> + <translation>History Settings</translation> + </message> + <message> + <source>Max. history items:</source> + <translation>Max. history items:</translation> + </message> + <message> + <source>Max. history size:</source> + <translation>Max. history size:</translation> + </message> + <message> + <source> MiB</source> + <translation> MiB</translation> + </message> + <message> + <source>Use recycle bin</source> + <translation>Use recycle bin</translation> + </message> +</context> +<context> + <name>DatabaseTabWidget</name> + <message> + <source>Root</source> + <comment>Root group</comment> + <translation>Root</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>KeePass 2 Database</translation> + </message> + <message> + <source>All files</source> + <translation>All files</translation> + </message> + <message> + <source>Open database</source> + <translation>Open database</translation> + </message> + <message> + <source>File not found!</source> + <translation>File not found!</translation> + </message> + <message> + <source>Unable to open the database.</source> + <translation>Unable to open the database.</translation> + </message> + <message> + <source>File opened in read only mode.</source> + <translation>File opened in read only mode.</translation> + </message> + <message> + <source>Open CSV file</source> + <translation>Open CSV file</translation> + </message> + <message> + <source>CSV file</source> + <translation>CSV file</translation> + </message> + <message> + <source>All files (*)</source> + <translation>All files (*)</translation> + </message> + <message> + <source>Merge database</source> + <translation>Merge database</translation> + </message> + <message> + <source>Open KeePass 1 database</source> + <translation>Open KeePass 1 database</translation> + </message> + <message> + <source>KeePass 1 database</source> + <translation>KeePass 1 database</translation> + </message> + <message> + <source>Close?</source> + <translation>Close?</translation> + </message> + <message> + <source>"%1" is in edit mode. +Discard changes and close anyway?</source> + <translation>"%1" is in edit mode. +Discard changes and close anyway?</translation> + </message> + <message> + <source>Save changes?</source> + <translation>Save changes?</translation> + </message> + <message> + <source>"%1" was modified. +Save changes?</source> + <translation>"%1" was modified. +Save changes?</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>Writing the database failed.</translation> + </message> + <message> + <source>Passwords</source> + <translation>Passwords</translation> + </message> + <message> + <source>Save database as</source> + <translation>Save database as</translation> + </message> + <message> + <source>Export database to CSV file</source> + <translation>Export database to CSV file</translation> + </message> + <message> + <source>Writing the CSV file failed.</source> + <translation>Writing the CSV file failed.</translation> + </message> + <message> + <source>New database</source> + <translation>New database</translation> + </message> + <message> + <source>locked</source> + <translation>locked</translation> + </message> + <message> + <source>Lock database</source> + <translation>Lock database</translation> + </message> + <message> + <source>Can't lock the database as you are currently editing it. +Please press cancel to finish your changes or discard them.</source> + <translation>Can't lock the database as you are currently editing it. +Please press cancel to finish your changes or discard them.</translation> + </message> + <message> + <source>This database has been modified. +Do you want to save the database before locking it? +Otherwise your changes are lost.</source> + <translation>This database has been modified. +Do you want to save the database before locking it? +Otherwise your changes are lost.</translation> + </message> +</context> +<context> + <name>DatabaseWidget</name> + <message> + <source>Searching...</source> + <translation>Searching...</translation> + </message> + <message> + <source>Change master key</source> + <translation>Change master key</translation> + </message> + <message> + <source>Delete entry?</source> + <translation>Delete entry?</translation> + </message> + <message> + <source>Do you really want to delete the entry "%1" for good?</source> + <translation>Do you really want to delete the entry "%1" for good?</translation> + </message> + <message> + <source>Delete entries?</source> + <translation>Delete entries?</translation> + </message> + <message> + <source>Do you really want to delete %1 entries for good?</source> + <translation>Do you really want to delete %1 entries for good?</translation> + </message> + <message> + <source>Move entry to recycle bin?</source> + <translation>Move entry to recycle bin?</translation> + </message> + <message> + <source>Do you really want to move entry "%1" to the recycle bin?</source> + <translation>Do you really want to move entry "%1" to the recycle bin?</translation> + </message> + <message> + <source>Move entries to recycle bin?</source> + <translation>Move entries to recycle bin?</translation> + </message> + <message numerus="yes"> + <source>Do you really want to move %n entry(s) to the recycle bin?</source> + <translation><numerusform>Do you really want to move %n entry to the recycle bin?</numerusform><numerusform>Do you really want to move %n entries to the recycle bin?</numerusform></translation> + </message> + <message> + <source>Execute command?</source> + <translation>Execute command?</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation>Do you really want to execute the following command?<br><br>%1<br></translation> + </message> + <message> + <source>Remember my choice</source> + <translation>Remember my choice</translation> + </message> + <message> + <source>Delete group?</source> + <translation>Delete group?</translation> + </message> + <message> + <source>Do you really want to delete the group "%1" for good?</source> + <translation>Do you really want to delete the group "%1" for good?</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Unable to calculate master key</translation> + </message> + <message> + <source>No current database.</source> + <translation>No current database.</translation> + </message> + <message> + <source>No source database, nothing to do.</source> + <translation>No source database, nothing to do.</translation> + </message> + <message> + <source>Search Results (%1)</source> + <translation>Search Results (%1)</translation> + </message> + <message> + <source>No Results</source> + <translation>No Results</translation> + </message> + <message> + <source>File has changed</source> + <translation>File has changed</translation> + </message> + <message> + <source>The database file has changed. Do you want to load the changes?</source> + <translation>The database file has changed. Do you want to load the changes?</translation> + </message> + <message> + <source>Merge Request</source> + <translation>Merge Request</translation> + </message> + <message> + <source>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</source> + <translation>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</translation> + </message> + <message> + <source>Could not open the new database file while attempting to autoreload this database.</source> + <translation>Could not open the new database file while attempting to autoreload this database.</translation> + </message> + <message> + <source>Empty recycle bin?</source> + <translation>Empty recycle bin?</translation> + </message> + <message> + <source>Are you sure you want to permanently delete everything from your recycle bin?</source> + <translation>Are you sure you want to permanently delete everything from your recycle bin?</translation> + </message> +</context> +<context> + <name>DetailsWidget</name> + <message> + <source>Generate TOTP Token</source> + <translation>Generate TOTP Token</translation> + </message> + <message> + <source>Close</source> + <translation>Close</translation> + </message> + <message> + <source>General</source> + <translation>General</translation> + </message> + <message> + <source>Password</source> + <translation>Password</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Expiration</source> + <translation>Expiration</translation> + </message> + <message> + <source>Username</source> + <translation>Username</translation> + </message> + <message> + <source>Autotype</source> + <translation>Auto-Type</translation> + </message> + <message> + <source>Searching</source> + <translation>Searching</translation> + </message> + <message> + <source>Attributes</source> + <translation>Attributes</translation> + </message> + <message> + <source>Attachments</source> + <translation>Attachments</translation> + </message> + <message> + <source>Notes</source> + <translation>Notes</translation> + </message> + <message> + <source>Window</source> + <translation>Window</translation> + </message> + <message> + <source>Sequence</source> + <translation>Sequence</translation> + </message> + <message> + <source>Search</source> + <translation>Search</translation> + </message> + <message> + <source>Clear</source> + <translation>Clear</translation> + </message> + <message> + <source>Never</source> + <translation>Never</translation> + </message> + <message> + <source>[PROTECTED]</source> + <translation>[PROTECTED]</translation> + </message> + <message> + <source>Disabled</source> + <translation>Disabled</translation> + </message> + <message> + <source>Enabled</source> + <translation>Enabled</translation> + </message> +</context> +<context> + <name>EditEntryWidget</name> + <message> + <source>Entry</source> + <translation>Entry</translation> + </message> + <message> + <source>Advanced</source> + <translation>Advanced</translation> + </message> + <message> + <source>Icon</source> + <translation>Icon</translation> + </message> + <message> + <source>Auto-Type</source> + <translation>Auto-Type</translation> + </message> + <message> + <source>Properties</source> + <translation>Properties</translation> + </message> + <message> + <source>History</source> + <translation>History</translation> + </message> + <message> + <source>SSH Agent</source> + <translation>SSH Agent</translation> + </message> + <message> + <source>n/a</source> + <translation>n/a</translation> + </message> + <message> + <source>(encrypted)</source> + <translation>(encrypted)</translation> + </message> + <message> + <source>Select private key</source> + <translation>Select private key</translation> + </message> + <message> + <source>File too large to be a private key</source> + <translation>File too large to be a private key</translation> + </message> + <message> + <source>Failed to open private key</source> + <translation>Failed to open private key</translation> + </message> + <message> + <source>Entry history</source> + <translation>Entry history</translation> + </message> + <message> + <source>Add entry</source> + <translation>Add entry</translation> + </message> + <message> + <source>Edit entry</source> + <translation>Edit entry</translation> + </message> + <message> + <source>Different passwords supplied.</source> + <translation>Different passwords supplied.</translation> + </message> + <message> + <source>New attribute</source> + <translation>New attribute</translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>Confirm Remove</translation> + </message> + <message> + <source>Are you sure you want to remove this attribute?</source> + <translation>Are you sure you want to remove this attribute?</translation> + </message> + <message> + <source>[PROTECTED]</source> + <translation>[PROTECTED]</translation> + </message> + <message> + <source>Press reveal to view or edit</source> + <translation>Press reveal to view or edit</translation> + </message> + <message> + <source>Tomorrow</source> + <translation>Tomorrow</translation> + </message> + <message numerus="yes"> + <source>%n week(s)</source> + <translation><numerusform>%n week</numerusform><numerusform>%n weeks</numerusform></translation> + </message> + <message numerus="yes"> + <source>%n month(s)</source> + <translation><numerusform>%n month</numerusform><numerusform>%n months</numerusform></translation> + </message> + <message> + <source>1 year</source> + <translation>1 year</translation> + </message> +</context> +<context> + <name>EditEntryWidgetAdvanced</name> + <message> + <source>Additional attributes</source> + <translation>Additional attributes</translation> + </message> + <message> + <source>Add</source> + <translation>Add</translation> + </message> + <message> + <source>Remove</source> + <translation>Remove</translation> + </message> + <message> + <source>Edit Name</source> + <translation>Edit Name</translation> + </message> + <message> + <source>Protect</source> + <translation>Protect</translation> + </message> + <message> + <source>Reveal</source> + <translation>Reveal</translation> + </message> + <message> + <source>Attachments</source> + <translation>Attachments</translation> + </message> +</context> +<context> + <name>EditEntryWidgetAutoType</name> + <message> + <source>Enable Auto-Type for this entry</source> + <translation>Enable Auto-Type for this entry</translation> + </message> + <message> + <source>Inherit default Auto-Type sequence from the &group</source> + <translation>Inherit default Auto-Type sequence from the &group</translation> + </message> + <message> + <source>&Use custom Auto-Type sequence:</source> + <translation>&Use custom Auto-Type sequence:</translation> + </message> + <message> + <source>Window Associations</source> + <translation>Window Associations</translation> + </message> + <message> + <source>+</source> + <translation>+</translation> + </message> + <message> + <source>-</source> + <translation>-</translation> + </message> + <message> + <source>Window title:</source> + <translation>Window title:</translation> + </message> + <message> + <source>Use default se&quence</source> + <translation>Use default se&quence</translation> + </message> + <message> + <source>Set custo&m sequence:</source> + <translation>Set custo&m sequence:</translation> + </message> +</context> +<context> + <name>EditEntryWidgetHistory</name> + <message> + <source>Show</source> + <translation>Show</translation> + </message> + <message> + <source>Restore</source> + <translation>Restore</translation> + </message> + <message> + <source>Delete</source> + <translation>Delete</translation> + </message> + <message> + <source>Delete all</source> + <translation>Delete all</translation> + </message> +</context> +<context> + <name>EditEntryWidgetMain</name> + <message> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <source>Password:</source> + <translation>Password:</translation> + </message> + <message> + <source>Repeat:</source> + <translation>Repeat:</translation> + </message> + <message> + <source>Title:</source> + <translation>Title:</translation> + </message> + <message> + <source>Notes</source> + <translation>Notes</translation> + </message> + <message> + <source>Presets</source> + <translation>Presets</translation> + </message> + <message> + <source>Toggle the checkbox to reveal the notes section.</source> + <translation>Toggle the checkbox to reveal the notes section.</translation> + </message> + <message> + <source>Username:</source> + <translation>Username:</translation> + </message> + <message> + <source>Expires</source> + <translation>Expires</translation> + </message> +</context> +<context> + <name>EditEntryWidgetSSHAgent</name> + <message> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <source>Remove key from agent after</source> + <translation>Remove key from agent after</translation> + </message> + <message> + <source> seconds</source> + <translation> seconds</translation> + </message> + <message> + <source>Fingerprint</source> + <translation>Fingerprint</translation> + </message> + <message> + <source>Remove key from agent when database is closed/locked</source> + <translation>Remove key from agent when database is closed/locked</translation> + </message> + <message> + <source>Public key</source> + <translation>Public key</translation> + </message> + <message> + <source>Add key to agent when database is opened/unlocked</source> + <translation>Add key to agent when database is opened/unlocked</translation> + </message> + <message> + <source>Comment</source> + <translation>Comment</translation> + </message> + <message> + <source>Decrypt</source> + <translation>Decrypt</translation> + </message> + <message> + <source>n/a</source> + <translation>n/a</translation> + </message> + <message> + <source>Copy to clipboard</source> + <translation>Copy to clipboard</translation> + </message> + <message> + <source>Private key</source> + <translation>Private key</translation> + </message> + <message> + <source>External file</source> + <translation>External file</translation> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Browse...</translation> + </message> + <message> + <source>Attachment</source> + <translation>Attachment</translation> + </message> + <message> + <source>Add to agent</source> + <translation>Add to agent</translation> + </message> + <message> + <source>Remove from agent</source> + <translation>Remove from agent</translation> + </message> + <message> + <source>Require user confirmation when this key is used</source> + <translation>Require user confirmation when this key is used</translation> + </message> +</context> +<context> + <name>EditGroupWidget</name> + <message> + <source>Group</source> + <translation>Group</translation> + </message> + <message> + <source>Icon</source> + <translation>Icon</translation> + </message> + <message> + <source>Properties</source> + <translation>Properties</translation> + </message> + <message> + <source>Add group</source> + <translation>Add group</translation> + </message> + <message> + <source>Edit group</source> + <translation>Edit group</translation> + </message> + <message> + <source>Enable</source> + <translation>Enable</translation> + </message> + <message> + <source>Disable</source> + <translation>Disable</translation> + </message> + <message> + <source>Inherit from parent group (%1)</source> + <translation>Inherit from parent group (%1)</translation> + </message> +</context> +<context> + <name>EditGroupWidgetMain</name> + <message> + <source>Name</source> + <translation>Name</translation> + </message> + <message> + <source>Notes</source> + <translation>Notes</translation> + </message> + <message> + <source>Expires</source> + <translation>Expires</translation> + </message> + <message> + <source>Search</source> + <translation>Search</translation> + </message> + <message> + <source>Auto-Type</source> + <translation>Auto-Type</translation> + </message> + <message> + <source>&Use default Auto-Type sequence of parent group</source> + <translation>&Use default Auto-Type sequence of parent group</translation> + </message> + <message> + <source>Set default Auto-Type se&quence</source> + <translation>Set default Auto-Type se&quence</translation> + </message> +</context> +<context> + <name>EditWidgetIcons</name> + <message> + <source>&Use default icon</source> + <translation>&Use default icon</translation> + </message> + <message> + <source>Use custo&m icon</source> + <translation>Use custo&m icon</translation> + </message> + <message> + <source>Add custom icon</source> + <translation>Add custom icon</translation> + </message> + <message> + <source>Delete custom icon</source> + <translation>Delete custom icon</translation> + </message> + <message> + <source>Download favicon</source> + <translation>Download favicon</translation> + </message> + <message> + <source>Unable to fetch favicon.</source> + <translation>Unable to fetch favicon.</translation> + </message> + <message> + <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> + <translation>Hint: You can enable Google as a fallback under Tools>Settings>Security</translation> + </message> + <message> + <source>Images</source> + <translation>Images</translation> + </message> + <message> + <source>All files</source> + <translation>All files</translation> + </message> + <message> + <source>Select Image</source> + <translation>Select Image</translation> + </message> + <message> + <source>Can't read icon</source> + <translation>Can't read icon</translation> + </message> + <message> + <source>Custom icon already exists</source> + <translation>Custom icon already exists</translation> + </message> + <message> + <source>Confirm Delete</source> + <translation>Confirm Delete</translation> + </message> + <message> + <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> + <translation>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</translation> + </message> +</context> +<context> + <name>EditWidgetProperties</name> + <message> + <source>Created:</source> + <translation>Created:</translation> + </message> + <message> + <source>Modified:</source> + <translation>Modified:</translation> + </message> + <message> + <source>Accessed:</source> + <translation>Accessed:</translation> + </message> + <message> + <source>Uuid:</source> + <translation>UUID:</translation> + </message> +</context> +<context> + <name>Entry</name> + <message> + <source> - Clone</source> + <comment>Suffix added to cloned entries</comment> + <translation> - Clone</translation> + </message> +</context> +<context> + <name>EntryAttachmentsModel</name> + <message> + <source>Name</source> + <translation>Name</translation> + </message> + <message> + <source>Size</source> + <translation>Size</translation> + </message> +</context> +<context> + <name>EntryAttachmentsWidget</name> + <message> + <source>Form</source> + <translation>Form</translation> + </message> + <message> + <source>Add</source> + <translation>Add</translation> + </message> + <message> + <source>Remove</source> + <translation>Remove</translation> + </message> + <message> + <source>Open</source> + <translation>Open</translation> + </message> + <message> + <source>Save</source> + <translation>Save</translation> + </message> + <message> + <source>Select files</source> + <translation>Select files</translation> + </message> + <message numerus="yes"> + <source>Are you sure you want to remove %n attachment(s)?</source> + <translation><numerusform>Are you sure you want to remove %n attachment?</numerusform><numerusform>Are you sure you want to remove %n attachments?</numerusform></translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>Confirm Remove</translation> + </message> + <message> + <source>Save attachments</source> + <translation>Save attachments</translation> + </message> + <message> + <source>Unable to create directory: +%1</source> + <translation>Unable to create directory: +%1</translation> + </message> + <message> + <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> + <translation>Are you sure you want to overwrite the existing file "%1" with the attachment?</translation> + </message> + <message> + <source>Confirm overwrite</source> + <translation>Confirm overwrite</translation> + </message> + <message> + <source>Unable to save attachments: +%1</source> + <translation>Unable to save attachments: +%1</translation> + </message> + <message> + <source>Unable to open attachment: +%1</source> + <translation>Unable to open attachment: +%1</translation> + </message> + <message> + <source>Unable to open attachments: +%1</source> + <translation>Unable to open attachments: +%1</translation> + </message> + <message> + <source>Unable to open files: +%1</source> + <translation>Unable to open files: +%1</translation> + </message> +</context> +<context> + <name>EntryAttributesModel</name> + <message> + <source>Name</source> + <translation>Name</translation> + </message> +</context> +<context> + <name>EntryHistoryModel</name> + <message> + <source>Last modified</source> + <translation>Last modified</translation> + </message> + <message> + <source>Title</source> + <translation>Title</translation> + </message> + <message> + <source>Username</source> + <translation>Username</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> +</context> +<context> + <name>EntryModel</name> + <message> + <source>Ref: </source> + <comment>Reference abbreviation</comment> + <translation>Ref: </translation> + </message> + <message> + <source>Group</source> + <translation>Group</translation> + </message> + <message> + <source>Title</source> + <translation>Title</translation> + </message> + <message> + <source>Username</source> + <translation>Username</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> +</context> +<context> + <name>Group</name> + <message> + <source>Recycle Bin</source> + <translation>Recycle Bin</translation> + </message> +</context> +<context> + <name>HostInstaller</name> + <message> + <source>KeePassXC: Cannot save file!</source> + <translation>KeePassXC: Cannot save file!</translation> + </message> + <message> + <source>Cannot save the native messaging script file.</source> + <translation>Cannot save the native messaging script file.</translation> + </message> +</context> +<context> + <name>HttpPasswordGeneratorWidget</name> + <message> + <source>Length:</source> + <translation>Length:</translation> + </message> + <message> + <source>Character Types</source> + <translation>Character Types</translation> + </message> + <message> + <source>Upper Case Letters</source> + <translation>Upper Case Letters</translation> + </message> + <message> + <source>A-Z</source> + <translation>A-Z</translation> + </message> + <message> + <source>Lower Case Letters</source> + <translation>Lower Case Letters</translation> + </message> + <message> + <source>a-z</source> + <translation>a-z</translation> + </message> + <message> + <source>Numbers</source> + <translation>Numbers</translation> + </message> + <message> + <source>0-9</source> + <translation>0-9</translation> + </message> + <message> + <source>Special Characters</source> + <translation>Special Characters</translation> + </message> + <message> + <source>/*_& ...</source> + <translation>/*_& ...</translation> + </message> + <message> + <source>Exclude look-alike characters</source> + <translation>Exclude look-alike characters</translation> + </message> + <message> + <source>Ensure that the password contains characters from every group</source> + <translation>Ensure that the password contains characters from every group</translation> + </message> +</context> +<context> + <name>KMessageWidget</name> + <message> + <source>&Close</source> + <translation>&Close</translation> + </message> + <message> + <source>Close message</source> + <translation>Close message</translation> + </message> +</context> +<context> + <name>Kdbx3Reader</name> + <message> + <source>Unable to calculate master key</source> + <translation>Unable to calculate master key</translation> + </message> + <message> + <source>Unable to issue challenge-response.</source> + <translation>Unable to issue challenge-response.</translation> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>Wrong key or database file is corrupt.</translation> + </message> +</context> +<context> + <name>Kdbx3Writer</name> + <message> + <source>Unable to issue challenge-response.</source> + <translation>Unable to issue challenge-response.</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Unable to calculate master key</translation> + </message> +</context> +<context> + <name>Kdbx4Reader</name> + <message> + <source>missing database headers</source> + <translation>missing database headers</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Unable to calculate master key</translation> + </message> + <message> + <source>Invalid header checksum size</source> + <translation>Invalid header checksum size</translation> + </message> + <message> + <source>Header SHA256 mismatch</source> + <translation>Header SHA256 mismatch</translation> + </message> + <message> + <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> + <translation>Wrong key or database file is corrupt. (HMAC mismatch)</translation> + </message> + <message> + <source>Unknown cipher</source> + <translation>Unknown cipher</translation> + </message> + <message> + <source>Invalid header id size</source> + <translation>Invalid header id size</translation> + </message> + <message> + <source>Invalid header field length</source> + <translation>Invalid header field length</translation> + </message> + <message> + <source>Invalid header data length</source> + <translation>Invalid header data length</translation> + </message> + <message> + <source>Failed to open buffer for KDF parameters in header</source> + <translation>Failed to open buffer for KDF parameters in header</translation> + </message> + <message> + <source>Unsupported key derivation function (KDF) or invalid parameters</source> + <translation>Unsupported key derivation function (KDF) or invalid parameters</translation> + </message> + <message> + <source>Legacy header fields found in KDBX4 file.</source> + <translation>Legacy header fields found in KDBX4 file.</translation> + </message> + <message> + <source>Invalid inner header id size</source> + <translation>Invalid inner header id size</translation> + </message> + <message> + <source>Invalid inner header field length</source> + <translation>Invalid inner header field length</translation> + </message> + <message> + <source>Invalid inner header binary size</source> + <translation>Invalid inner header binary size</translation> + </message> + <message> + <source>Unsupported KeePass variant map version.</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>Unsupported KeePass variant map version.</translation> + </message> + <message> + <source>Invalid variant map entry name length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>Invalid variant map entry name length</translation> + </message> + <message> + <source>Invalid variant map entry name data</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>Invalid variant map entry name data</translation> + </message> + <message> + <source>Invalid variant map entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>Invalid variant map entry value length</translation> + </message> + <message> + <source>Invalid variant map entry value data</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation>Invalid variant map entry value data</translation> + </message> + <message> + <source>Invalid variant map Bool entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>Invalid variant map Bool entry value length</translation> + </message> + <message> + <source>Invalid variant map Int32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>Invalid variant map Int32 entry value length</translation> + </message> + <message> + <source>Invalid variant map UInt32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>Invalid variant map UInt32 entry value length</translation> + </message> + <message> + <source>Invalid variant map Int64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>Invalid variant map Int64 entry value length</translation> + </message> + <message> + <source>Invalid variant map UInt64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>Invalid variant map UInt64 entry value length</translation> + </message> + <message> + <source>Invalid variant map entry type</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>Invalid variant map entry type</translation> + </message> + <message> + <source>Invalid variant map field type size</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>Invalid variant map field type size</translation> + </message> +</context> +<context> + <name>Kdbx4Writer</name> + <message> + <source>Invalid symmetric cipher algorithm.</source> + <translation>Invalid symmetric cipher algorithm.</translation> + </message> + <message> + <source>Invalid symmetric cipher IV size.</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation>Invalid symmetric cipher IV size.</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Unable to calculate master key</translation> + </message> + <message> + <source>Failed to serialize KDF parameters variant map</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation>Failed to serialize KDF parameters variant map</translation> + </message> +</context> +<context> + <name>KdbxReader</name> + <message> + <source>Invalid cipher uuid length</source> + <translation>Invalid cipher UUID length</translation> + </message> + <message> + <source>Unsupported cipher</source> + <translation>Unsupported cipher</translation> + </message> + <message> + <source>Invalid compression flags length</source> + <translation>Invalid compression flags length</translation> + </message> + <message> + <source>Unsupported compression algorithm</source> + <translation>Unsupported compression algorithm</translation> + </message> + <message> + <source>Invalid master seed size</source> + <translation>Invalid master seed size</translation> + </message> + <message> + <source>Invalid transform seed size</source> + <translation>Invalid transform seed size</translation> + </message> + <message> + <source>Invalid transform rounds size</source> + <translation>Invalid transform rounds size</translation> + </message> + <message> + <source>Invalid start bytes size</source> + <translation>Invalid start bytes size</translation> + </message> + <message> + <source>Invalid random stream id size</source> + <translation>Invalid random stream id size</translation> + </message> + <message> + <source>Invalid inner random stream cipher</source> + <translation>Invalid inner random stream cipher</translation> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>Not a KeePass database.</translation> + </message> + <message> + <source>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> + <translation>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</translation> + </message> + <message> + <source>Unsupported KeePass 2 database version.</source> + <translation>Unsupported KeePass 2 database version.</translation> + </message> +</context> +<context> + <name>KdbxXmlReader</name> + <message> + <source>XML parsing failure: %1</source> + <translation>XML parsing failure: %1</translation> + </message> + <message> + <source>No root group</source> + <translation>No root group</translation> + </message> + <message> + <source>Missing icon uuid or data</source> + <translation>Missing icon UUID or data</translation> + </message> + <message> + <source>Missing custom data key or value</source> + <translation>Missing custom data key or value</translation> + </message> + <message> + <source>Multiple group elements</source> + <translation>Multiple group elements</translation> + </message> + <message> + <source>Null group uuid</source> + <translation>Null group UUID</translation> + </message> + <message> + <source>Invalid group icon number</source> + <translation>Invalid group icon number</translation> + </message> + <message> + <source>Invalid EnableAutoType value</source> + <translation>Invalid EnableAutoType value</translation> + </message> + <message> + <source>Invalid EnableSearching value</source> + <translation>Invalid EnableSearching value</translation> + </message> + <message> + <source>No group uuid found</source> + <translation>No group UUID found</translation> + </message> + <message> + <source>Null DeleteObject uuid</source> + <translation>Null DeleteObject UUID</translation> + </message> + <message> + <source>Missing DeletedObject uuid or time</source> + <translation>Missing DeletedObject UUID or time</translation> + </message> + <message> + <source>Null entry uuid</source> + <translation>Null entry UUID</translation> + </message> + <message> + <source>Invalid entry icon number</source> + <translation>Invalid entry icon number</translation> + </message> + <message> + <source>History element in history entry</source> + <translation>History element in history entry</translation> + </message> + <message> + <source>No entry uuid found</source> + <translation>No entry UUID found</translation> + </message> + <message> + <source>History element with different uuid</source> + <translation>History element with different UUID</translation> + </message> + <message> + <source>Unable to decrypt entry string</source> + <translation>Unable to decrypt entry string</translation> + </message> + <message> + <source>Duplicate custom attribute found</source> + <translation>Duplicate custom attribute found</translation> + </message> + <message> + <source>Entry string key or value missing</source> + <translation>Entry string key or value missing</translation> + </message> + <message> + <source>Duplicate attachment found</source> + <translation>Duplicate attachment found</translation> + </message> + <message> + <source>Entry binary key or value missing</source> + <translation>Entry binary key or value missing</translation> + </message> + <message> + <source>Auto-type association window or sequence missing</source> + <translation>Auto-Type association window or sequence missing</translation> + </message> + <message> + <source>Invalid bool value</source> + <translation>Invalid bool value</translation> + </message> + <message> + <source>Invalid date time value</source> + <translation>Invalid date time value</translation> + </message> + <message> + <source>Invalid color value</source> + <translation>Invalid color value</translation> + </message> + <message> + <source>Invalid color rgb part</source> + <translation>Invalid color rgb part</translation> + </message> + <message> + <source>Invalid number value</source> + <translation>Invalid number value</translation> + </message> + <message> + <source>Invalid uuid value</source> + <translation>Invalid UUID value</translation> + </message> + <message> + <source>Unable to decompress binary</source> + <extracomment>Translator meant is a binary data inside an entry</extracomment> + <translation>Unable to decompress binary</translation> + </message> +</context> +<context> + <name>KeePass1OpenWidget</name> + <message> + <source>Import KeePass1 database</source> + <translation>Import KeePass1 database</translation> + </message> + <message> + <source>Unable to open the database.</source> + <translation>Unable to open the database.</translation> + </message> +</context> +<context> + <name>KeePass1Reader</name> + <message> + <source>Unable to read keyfile.</source> + <translation>Unable to read keyfile.</translation> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>Not a KeePass database.</translation> + </message> + <message> + <source>Unsupported encryption algorithm.</source> + <translation>Unsupported encryption algorithm.</translation> + </message> + <message> + <source>Unsupported KeePass database version.</source> + <translation>Unsupported KeePass database version.</translation> + </message> + <message> + <source>Unable to read encryption IV</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation>Unable to read encryption IV</translation> + </message> + <message> + <source>Invalid number of groups</source> + <translation>Invalid number of groups</translation> + </message> + <message> + <source>Invalid number of entries</source> + <translation>Invalid number of entries</translation> + </message> + <message> + <source>Invalid content hash size</source> + <translation>Invalid content hash size</translation> + </message> + <message> + <source>Invalid transform seed size</source> + <translation>Invalid transform seed size</translation> + </message> + <message> + <source>Invalid number of transform rounds</source> + <translation>Invalid number of transform rounds</translation> + </message> + <message> + <source>Unable to construct group tree</source> + <translation>Unable to construct group tree</translation> + </message> + <message> + <source>Root</source> + <translation>Root</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Unable to calculate master key</translation> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>Wrong key or database file is corrupt.</translation> + </message> + <message> + <source>Key transformation failed</source> + <translation>Key transformation failed</translation> + </message> + <message> + <source>Invalid group field type number</source> + <translation>Invalid group field type number</translation> + </message> + <message> + <source>Invalid group field size</source> + <translation>Invalid group field size</translation> + </message> + <message> + <source>Read group field data doesn't match size</source> + <translation>Read group field data doesn't match size</translation> + </message> + <message> + <source>Incorrect group id field size</source> + <translation>Incorrect group id field size</translation> + </message> + <message> + <source>Incorrect group creation time field size</source> + <translation>Incorrect group creation time field size</translation> + </message> + <message> + <source>Incorrect group modification time field size</source> + <translation>Incorrect group modification time field size</translation> + </message> + <message> + <source>Incorrect group access time field size</source> + <translation>Incorrect group access time field size</translation> + </message> + <message> + <source>Incorrect group expiry time field size</source> + <translation>Incorrect group expiry time field size</translation> + </message> + <message> + <source>Incorrect group icon field size</source> + <translation>Incorrect group icon field size</translation> + </message> + <message> + <source>Incorrect group level field size</source> + <translation>Incorrect group level field size</translation> + </message> + <message> + <source>Invalid group field type</source> + <translation>Invalid group field type</translation> + </message> + <message> + <source>Missing group id or level</source> + <translation>Missing group id or level</translation> + </message> + <message> + <source>Missing entry field type number</source> + <translation>Missing entry field type number</translation> + </message> + <message> + <source>Invalid entry field size</source> + <translation>Invalid entry field size</translation> + </message> + <message> + <source>Read entry field data doesn't match size</source> + <translation>Read entry field data doesn't match size</translation> + </message> + <message> + <source>Invalid entry uuid field size</source> + <translation>Invalid entry uuid field size</translation> + </message> + <message> + <source>Invalid entry group id field size</source> + <translation>Invalid entry group id field size</translation> + </message> + <message> + <source>Invalid entry icon field size</source> + <translation>Invalid entry icon field size</translation> + </message> + <message> + <source>Invalid entry creation time field size</source> + <translation>Invalid entry creation time field size</translation> + </message> + <message> + <source>Invalid entry modification time field size</source> + <translation>Invalid entry modification time field size</translation> + </message> + <message> + <source>Invalid entry expiry time field size</source> + <translation>Invalid entry expiry time field size</translation> + </message> + <message> + <source>Invalid entry field type</source> + <translation>Invalid entry field type</translation> + </message> +</context> +<context> + <name>Main</name> + <message> + <source>Existing single-instance lock file is invalid. Launching new instance.</source> + <translation>Existing single-instance lock file is invalid. Launching new instance.</translation> + </message> + <message> + <source>The lock file could not be created. Single-instance mode disabled.</source> + <translation>The lock file could not be created. Single-instance mode disabled.</translation> + </message> + <message> + <source>Another instance of KeePassXC is already running.</source> + <translation>Another instance of KeePassXC is already running.</translation> + </message> + <message> + <source>Fatal error while testing the cryptographic functions.</source> + <translation>Fatal error while testing the cryptographic functions.</translation> + </message> + <message> + <source>KeePassXC - Error</source> + <translation>KeePassXC - Error</translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <source>&Database</source> + <translation>&Database</translation> + </message> + <message> + <source>&Recent databases</source> + <translation>&Recent databases</translation> + </message> + <message> + <source>Import</source> + <translation>Import</translation> + </message> + <message> + <source>&Help</source> + <translation>&Help</translation> + </message> + <message> + <source>E&ntries</source> + <translation>E&ntries</translation> + </message> + <message> + <source>Copy att&ribute to clipboard</source> + <translation>Copy att&ribute to clipboard</translation> + </message> + <message> + <source>Time-based one-time password</source> + <translation>Time-based one-time password</translation> + </message> + <message> + <source>&Groups</source> + <translation>&Groups</translation> + </message> + <message> + <source>&Tools</source> + <translation>&Tools</translation> + </message> + <message> + <source>&Quit</source> + <translation>&Quit</translation> + </message> + <message> + <source>&About</source> + <translation>&About</translation> + </message> + <message> + <source>&Open database...</source> + <translation>&Open database...</translation> + </message> + <message> + <source>&Save database</source> + <translation>&Save database</translation> + </message> + <message> + <source>&Close database</source> + <translation>&Close database</translation> + </message> + <message> + <source>&New database</source> + <translation>&New database</translation> + </message> + <message> + <source>Merge from KeePassX database</source> + <translation>Merge from KeePassX database</translation> + </message> + <message> + <source>&Add new entry</source> + <translation>&Add new entry</translation> + </message> + <message> + <source>&View/Edit entry</source> + <translation>&View/Edit entry</translation> + </message> + <message> + <source>&Delete entry</source> + <translation>&Delete entry</translation> + </message> + <message> + <source>&Add new group</source> + <translation>&Add new group</translation> + </message> + <message> + <source>&Edit group</source> + <translation>&Edit group</translation> + </message> + <message> + <source>&Delete group</source> + <translation>&Delete group</translation> + </message> + <message> + <source>Sa&ve database as...</source> + <translation>Sa&ve database as...</translation> + </message> + <message> + <source>Change &master key...</source> + <translation>Change &master key...</translation> + </message> + <message> + <source>&Database settings</source> + <translation>&Database settings</translation> + </message> + <message> + <source>Database settings</source> + <translation>Database settings</translation> + </message> + <message> + <source>&Clone entry</source> + <translation>&Clone entry</translation> + </message> + <message> + <source>&Find</source> + <translation>&Find</translation> + </message> + <message> + <source>Copy &username</source> + <translation>Copy &username</translation> + </message> + <message> + <source>Copy username to clipboard</source> + <translation>Copy username to clipboard</translation> + </message> + <message> + <source>Cop&y password</source> + <translation>Cop&y password</translation> + </message> + <message> + <source>Copy password to clipboard</source> + <translation>Copy password to clipboard</translation> + </message> + <message> + <source>&Settings</source> + <translation>&Settings</translation> + </message> + <message> + <source>Password Generator</source> + <translation>Password Generator</translation> + </message> + <message> + <source>&Perform Auto-Type</source> + <translation>&Perform Auto-Type</translation> + </message> + <message> + <source>&Open URL</source> + <translation>&Open URL</translation> + </message> + <message> + <source>&Lock databases</source> + <translation>&Lock databases</translation> + </message> + <message> + <source>&Title</source> + <translation>&Title</translation> + </message> + <message> + <source>Copy title to clipboard</source> + <translation>Copy title to clipboard</translation> + </message> + <message> + <source>&URL</source> + <translation>&URL</translation> + </message> + <message> + <source>Copy URL to clipboard</source> + <translation>Copy URL to clipboard</translation> + </message> + <message> + <source>&Notes</source> + <translation>&Notes</translation> + </message> + <message> + <source>Copy notes to clipboard</source> + <translation>Copy notes to clipboard</translation> + </message> + <message> + <source>&Export to CSV file...</source> + <translation>&Export to CSV file...</translation> + </message> + <message> + <source>Import KeePass 1 database...</source> + <translation>Import KeePass 1 database...</translation> + </message> + <message> + <source>Import CSV file...</source> + <translation>Import CSV file...</translation> + </message> + <message> + <source>Re&pair database...</source> + <translation>Re&pair database...</translation> + </message> + <message> + <source>Show TOTP</source> + <translation>Show TOTP</translation> + </message> + <message> + <source>Set up TOTP...</source> + <translation>Set up TOTP...</translation> + </message> + <message> + <source>Copy &TOTP</source> + <translation>Copy &TOTP</translation> + </message> + <message> + <source>E&mpty recycle bin</source> + <translation>E&mpty recycle bin</translation> + </message> + <message> + <source>Clear history</source> + <translation>Clear history</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation>Access error for config file %1</translation> + </message> + <message> + <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> + <translation><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></translation> + </message> + <message> + <source>read-only</source> + <translation>read-only</translation> + </message> + <message> + <source>Settings</source> + <translation>Settings</translation> + </message> + <message> + <source>Toggle window</source> + <translation>Toggle window</translation> + </message> + <message> + <source>Quit KeePassXC</source> + <translation>Quit KeePassXC</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>KeePass 2 Database</translation> + </message> + <message> + <source>All files</source> + <translation>All files</translation> + </message> + <message> + <source>Open database</source> + <translation>Open database</translation> + </message> + <message> + <source>Save repaired database</source> + <translation>Save repaired database</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>Writing the database failed.</translation> + </message> + <message> + <source>Please touch the button on your YubiKey!</source> + <translation>Please touch the button on your YubiKey!</translation> + </message> +</context> +<context> + <name>OpenSSHKey</name> + <message> + <source>Invalid key file, expecting an OpenSSH key</source> + <translation>Invalid key file, expecting an OpenSSH key</translation> + </message> + <message> + <source>PEM boundary mismatch</source> + <translation>PEM boundary mismatch</translation> + </message> + <message> + <source>This is not an OpenSSH key, only modern keys are supported</source> + <translation>This is not an OpenSSH key, only modern keys are supported</translation> + </message> + <message> + <source>Base64 decoding failed</source> + <translation>Base64 decoding failed</translation> + </message> + <message> + <source>Key file way too small.</source> + <translation>Key file way too small.</translation> + </message> + <message> + <source>Key file magic header id invalid</source> + <translation>Key file magic header id invalid</translation> + </message> + <message> + <source>Found zero keys</source> + <translation>Found zero keys</translation> + </message> + <message> + <source>Failed to read public key.</source> + <translation>Failed to read public key.</translation> + </message> + <message> + <source>Corrupted key file, reading private key failed</source> + <translation>Corrupted key file, reading private key failed</translation> + </message> + <message> + <source>No private key payload to decrypt</source> + <translation>No private key payload to decrypt</translation> + </message> + <message> + <source>Unknown cipher: </source> + <translation>Unknown cipher: </translation> + </message> + <message> + <source>Trying to run KDF without cipher</source> + <translation>Trying to run KDF without cipher</translation> + </message> + <message> + <source>Passphrase is required to decrypt this key</source> + <translation>Passphrase is required to decrypt this key</translation> + </message> + <message> + <source>Key derivation failed, key file corrupted?</source> + <translation>Key derivation failed, key file corrupted?</translation> + </message> + <message> + <source>Unknown KDF: </source> + <translation>Unknown KDF: </translation> + </message> + <message> + <source>Decryption failed, wrong passphrase?</source> + <translation>Decryption failed, wrong passphrase?</translation> + </message> + <message> + <source>Unexpected EOF while reading public key</source> + <translation>Unexpected EOF while reading public key</translation> + </message> + <message> + <source>Unknown key type: </source> + <translation>Unknown key type: </translation> + </message> + <message> + <source>Unexpected EOF while reading private key</source> + <translation>Unexpected EOF while reading private key</translation> + </message> + <message> + <source>Can't write public key as it is empty</source> + <translation>Can't write public key as it is empty</translation> + </message> + <message> + <source>Unexpected EOF when writing public key</source> + <translation>Unexpected EOF when writing public key</translation> + </message> + <message> + <source>Can't write private key as it is empty</source> + <translation>Can't write private key as it is empty</translation> + </message> + <message> + <source>Unexpected EOF when writing private key</source> + <translation>Unexpected EOF when writing private key</translation> + </message> +</context> +<context> + <name>OptionDialog</name> + <message> + <source>Dialog</source> + <translation>Dialog</translation> + </message> + <message> + <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation>This is required for accessing your databases from ChromeIPass or PassIFox</translation> + </message> + <message> + <source>Enable KeePassHTTP server</source> + <translation>Enable KeePassHTTP server</translation> + </message> + <message> + <source>General</source> + <translation>General</translation> + </message> + <message> + <source>Sh&ow a notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Sh&ow a notification when credentials are requested</translation> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>Only returns the best matches for a specific URL instead of all entries for the whole domain.</translation> + </message> + <message> + <source>&Return only best matching entries</source> + <translation>&Return only best matching entries</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Re&quest to unlock the database if it is locked</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> + <translation>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</translation> + </message> + <message> + <source>&Match URL schemes</source> + <translation>&Match URL schemes</translation> + </message> + <message> + <source>Sort matching entries by &username</source> + <translation>Sort matching entries by &username</translation> + </message> + <message> + <source>Sort &matching entries by title</source> + <translation>Sort &matching entries by title</translation> + </message> + <message> + <source>R&emove all shared encryption keys from active database</source> + <translation>R&emove all shared encryption keys from active database</translation> + </message> + <message> + <source>Re&move all stored permissions from entries in active database</source> + <translation>Re&move all stored permissions from entries in active database</translation> + </message> + <message> + <source>Password Generator</source> + <translation>Password Generator</translation> + </message> + <message> + <source>Advanced</source> + <translation>Advanced</translation> + </message> + <message> + <source>Always allow &access to entries</source> + <translation>Always allow &access to entries</translation> + </message> + <message> + <source>Always allow &updating entries</source> + <translation>Always allow &updating entries</translation> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>Only the selected database has to be connected with a client.</translation> + </message> + <message> + <source>Searc&h in all opened databases for matching entries</source> + <translation>Searc&h in all opened databases for matching entries</translation> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>Automatically creating or updating string fields is not supported.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>&Return advanced string fields which start with "KPH: "</translation> + </message> + <message> + <source>HTTP Port:</source> + <translation>HTTP Port:</translation> + </message> + <message> + <source>Default port: 19455</source> + <translation>Default port: 19455</translation> + </message> + <message> + <source>KeePassXC will listen to this port on 127.0.0.1</source> + <translation>KeePassXC will listen to this port on 127.0.0.1</translation> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation><b>Warning:</b> The following options can be dangerous!</translation> + </message> + <message> + <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> + <translation><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></translation> + </message> + <message> + <source>Cannot bind to privileged ports</source> + <translation>Cannot bind to privileged ports</translation> + </message> + <message> + <source>Cannot bind to privileged ports below 1024! +Using default port 19455.</source> + <translation>Cannot bind to privileged ports below 1024! +Using default port 19455.</translation> + </message> +</context> +<context> + <name>PasswordGeneratorWidget</name> + <message> + <source>%p%</source> + <translation>%p%</translation> + </message> + <message> + <source>Password:</source> + <translation>Password:</translation> + </message> + <message> + <source>strength</source> + <comment>Password strength</comment> + <translation>strength</translation> + </message> + <message> + <source>entropy</source> + <translation>entropy</translation> + </message> + <message> + <source>Password</source> + <translation>Password</translation> + </message> + <message> + <source>Character Types</source> + <translation>Character Types</translation> + </message> + <message> + <source>Upper Case Letters</source> + <translation>Upper Case Letters</translation> + </message> + <message> + <source>Lower Case Letters</source> + <translation>Lower Case Letters</translation> + </message> + <message> + <source>Numbers</source> + <translation>Numbers</translation> + </message> + <message> + <source>Special Characters</source> + <translation>Special Characters</translation> + </message> + <message> + <source>Extended ASCII</source> + <translation>Extended ASCII</translation> + </message> + <message> + <source>Exclude look-alike characters</source> + <translation>Exclude look-alike characters</translation> + </message> + <message> + <source>Pick characters from every group</source> + <translation>Pick characters from every group</translation> + </message> + <message> + <source>&Length:</source> + <translation>&Length:</translation> + </message> + <message> + <source>Passphrase</source> + <translation>Passphrase</translation> + </message> + <message> + <source>Wordlist:</source> + <translation>Wordlist:</translation> + </message> + <message> + <source>Word Count:</source> + <translation>Word Count:</translation> + </message> + <message> + <source>Word Separator:</source> + <translation>Word Separator:</translation> + </message> + <message> + <source>Generate</source> + <translation>Generate</translation> + </message> + <message> + <source>Copy</source> + <translation>Copy</translation> + </message> + <message> + <source>Accept</source> + <translation>Accept</translation> + </message> + <message> + <source>Close</source> + <translation>Close</translation> + </message> + <message> + <source>Apply</source> + <translation>Apply</translation> + </message> + <message> + <source>Entropy: %1 bit</source> + <translation>Entropy: %1 bit</translation> + </message> + <message> + <source>Password Quality: %1</source> + <translation>Password Quality: %1</translation> + </message> + <message> + <source>Poor</source> + <comment>Password quality</comment> + <translation>Poor</translation> + </message> + <message> + <source>Weak</source> + <comment>Password quality</comment> + <translation>Weak</translation> + </message> + <message> + <source>Good</source> + <comment>Password quality</comment> + <translation>Good</translation> + </message> + <message> + <source>Excellent</source> + <comment>Password quality</comment> + <translation>Excellent</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <source>Database not opened</source> + <translation>Database not opened</translation> + </message> + <message> + <source>Database hash not available</source> + <translation>Database hash not available</translation> + </message> + <message> + <source>Client public key not received</source> + <translation>Client public key not received</translation> + </message> + <message> + <source>Cannot decrypt message</source> + <translation>Cannot decrypt message</translation> + </message> + <message> + <source>Timeout or cannot connect to KeePassXC</source> + <translation>Timeout or cannot connect to KeePassXC</translation> + </message> + <message> + <source>Action cancelled or denied</source> + <translation>Action cancelled or denied</translation> + </message> + <message> + <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> + <translation>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</translation> + </message> + <message> + <source>KeePassXC association failed, try again</source> + <translation>KeePassXC association failed, try again</translation> + </message> + <message> + <source>Key change was not successful</source> + <translation>Key change was not successful</translation> + </message> + <message> + <source>Encryption key is not recognized</source> + <translation>Encryption key is not recognized</translation> + </message> + <message> + <source>No saved databases found</source> + <translation>No saved databases found</translation> + </message> + <message> + <source>Incorrect action</source> + <translation>Incorrect action</translation> + </message> + <message> + <source>Empty message received</source> + <translation>Empty message received</translation> + </message> + <message> + <source>No URL provided</source> + <translation>No URL provided</translation> + </message> + <message> + <source>No logins found</source> + <translation>No logins found</translation> + </message> + <message> + <source>Unknown error</source> + <translation>Unknown error</translation> + </message> + <message> + <source>Add a new entry to a database.</source> + <translation>Add a new entry to a database.</translation> + </message> + <message> + <source>Path of the database.</source> + <translation>Path of the database.</translation> + </message> + <message> + <source>Key file of the database.</source> + <translation>Key file of the database.</translation> + </message> + <message> + <source>path</source> + <translation>path</translation> + </message> + <message> + <source>Username for the entry.</source> + <translation>Username for the entry.</translation> + </message> + <message> + <source>username</source> + <translation>username</translation> + </message> + <message> + <source>URL for the entry.</source> + <translation>URL for the entry.</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Prompt for the entry's password.</source> + <translation>Prompt for the entry's password.</translation> + </message> + <message> + <source>Generate a password for the entry.</source> + <translation>Generate a password for the entry.</translation> + </message> + <message> + <source>Length for the generated password.</source> + <translation>Length for the generated password.</translation> + </message> + <message> + <source>length</source> + <translation>length</translation> + </message> + <message> + <source>Path of the entry to add.</source> + <translation>Path of the entry to add.</translation> + </message> + <message> + <source>Copy an entry's password to the clipboard.</source> + <translation>Copy an entry's password to the clipboard.</translation> + </message> + <message> + <source>Path of the entry to clip.</source> + <comment>clip = copy to clipboard</comment> + <translation>Path of the entry to clip.</translation> + </message> + <message> + <source>Timeout in seconds before clearing the clipboard.</source> + <translation>Timeout in seconds before clearing the clipboard.</translation> + </message> + <message> + <source>Edit an entry.</source> + <translation>Edit an entry.</translation> + </message> + <message> + <source>Title for the entry.</source> + <translation>Title for the entry.</translation> + </message> + <message> + <source>title</source> + <translation>title</translation> + </message> + <message> + <source>Path of the entry to edit.</source> + <translation>Path of the entry to edit.</translation> + </message> + <message> + <source>Estimate the entropy of a password.</source> + <translation>Estimate the entropy of a password.</translation> + </message> + <message> + <source>Password for which to estimate the entropy.</source> + <translation>Password for which to estimate the entropy.</translation> + </message> + <message> + <source>Perform advanced analysis on the password.</source> + <translation>Perform advanced analysis on the password.</translation> + </message> + <message> + <source>Extract and print the content of a database.</source> + <translation>Extract and print the content of a database.</translation> + </message> + <message> + <source>Path of the database to extract.</source> + <translation>Path of the database to extract.</translation> + </message> + <message> + <source>Insert password to unlock %1: </source> + <translation>Insert password to unlock %1: </translation> + </message> + <message> + <source>Failed to load key file %1 : %2</source> + <translation>Failed to load key file %1 : %2</translation> + </message> + <message> + <source>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</translation> + </message> + <message> + <source> + +Available commands: +</source> + <translation> + +Available commands: +</translation> + </message> + <message> + <source>Name of the command to execute.</source> + <translation>Name of the command to execute.</translation> + </message> + <message> + <source>List database entries.</source> + <translation>List database entries.</translation> + </message> + <message> + <source>Path of the group to list. Default is /</source> + <translation>Path of the group to list. Default is /</translation> + </message> + <message> + <source>Find entries quickly.</source> + <translation>Find entries quickly.</translation> + </message> + <message> + <source>Search term.</source> + <translation>Search term.</translation> + </message> + <message> + <source>Merge two databases.</source> + <translation>Merge two databases.</translation> + </message> + <message> + <source>Path of the database to merge into.</source> + <translation>Path of the database to merge into.</translation> + </message> + <message> + <source>Path of the database to merge from.</source> + <translation>Path of the database to merge from.</translation> + </message> + <message> + <source>Use the same credentials for both database files.</source> + <translation>Use the same credentials for both database files.</translation> + </message> + <message> + <source>Key file of the database to merge from.</source> + <translation>Key file of the database to merge from.</translation> + </message> + <message> + <source>Show an entry's information.</source> + <translation>Show an entry's information.</translation> + </message> + <message> + <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> + <translation>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</translation> + </message> + <message> + <source>attribute</source> + <translation>attribute</translation> + </message> + <message> + <source>Name of the entry to show.</source> + <translation>Name of the entry to show.</translation> + </message> + <message> + <source>NULL device</source> + <translation>NULL device</translation> + </message> + <message> + <source>error reading from device</source> + <translation>error reading from device</translation> + </message> + <message> + <source>file empty ! +</source> + <translation>file empty ! +</translation> + </message> + <message> + <source>malformed string</source> + <translation>malformed string</translation> + </message> + <message> + <source>missing closing quote</source> + <translation>missing closing quote</translation> + </message> + <message> + <source>AES: 256-bit</source> + <translation>AES: 256-bit</translation> + </message> + <message> + <source>Twofish: 256-bit</source> + <translation>Twofish: 256-bit</translation> + </message> + <message> + <source>ChaCha20: 256-bit</source> + <translation>ChaCha20: 256-bit</translation> + </message> + <message> + <source>Argon2 (KDBX 4 – recommended)</source> + <translation>Argon2 (KDBX 4 – recommended)</translation> + </message> + <message> + <source>AES-KDF (KDBX 4)</source> + <translation>AES-KDF (KDBX 4)</translation> + </message> + <message> + <source>AES-KDF (KDBX 3.1)</source> + <translation>AES-KDF (KDBX 3.1)</translation> + </message> + <message> + <source>Group</source> + <translation>Group</translation> + </message> + <message> + <source>Title</source> + <translation>Title</translation> + </message> + <message> + <source>Username</source> + <translation>Username</translation> + </message> + <message> + <source>Password</source> + <translation>Password</translation> + </message> + <message> + <source>Notes</source> + <translation>Notes</translation> + </message> + <message> + <source>Last Modified</source> + <translation>Last Modified</translation> + </message> + <message> + <source>Created</source> + <translation>Created</translation> + </message> + <message> + <source>Legacy Browser Integration</source> + <translation>Legacy Browser Integration</translation> + </message> + <message> + <source>Browser Integration</source> + <translation>Browser Integration</translation> + </message> + <message> + <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source> + <translation>YubiKey[%1] Challenge Response - Slot %2 - %3</translation> + </message> + <message> + <source>Press</source> + <translation>Press</translation> + </message> + <message> + <source>Passive</source> + <translation>Passive</translation> + </message> + <message> + <source>SSH Agent</source> + <translation>SSH Agent</translation> + </message> +</context> +<context> + <name>QtIOCompressor</name> + <message> + <source>Internal zlib error when compressing: </source> + <translation>Internal zlib error when compressing: </translation> + </message> + <message> + <source>Error writing to underlying device: </source> + <translation>Error writing to underlying device: </translation> + </message> + <message> + <source>Error opening underlying device: </source> + <translation>Error opening underlying device: </translation> + </message> + <message> + <source>Error reading data from underlying device: </source> + <translation>Error reading data from underlying device: </translation> + </message> + <message> + <source>Internal zlib error when decompressing: </source> + <translation>Internal zlib error when decompressing: </translation> + </message> +</context> +<context> + <name>QtIOCompressor::open</name> + <message> + <source>The gzip format not supported in this version of zlib.</source> + <translation>The gzip format not supported in this version of zlib.</translation> + </message> + <message> + <source>Internal zlib error: </source> + <translation>Internal zlib error: </translation> + </message> +</context> +<context> + <name>SearchWidget</name> + <message> + <source>Search...</source> + <translation>Search...</translation> + </message> + <message> + <source>Search</source> + <translation>Search</translation> + </message> + <message> + <source>Clear</source> + <translation>Clear</translation> + </message> + <message> + <source>Case Sensitive</source> + <translation>Case Sensitive</translation> + </message> + <message> + <source>Limit search to selected group</source> + <translation>Limit search to selected group</translation> + </message> +</context> +<context> + <name>Service</name> + <message> + <source>KeePassXC: New key association request</source> + <translation>KeePassXC: New key association request</translation> + </message> + <message> + <source>You have received an association request for the above key. +If you would like to allow it access to your KeePassXC database +give it a unique name to identify and accept it.</source> + <translation>You have received an association request for the above key. +If you would like to allow it access to your KeePassXC database +give it a unique name to identify and accept it.</translation> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: Overwrite existing key?</translation> + </message> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</translation> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: Update Entry</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Do you want to update the information in %1 - %2?</translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: Database locked!</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</translation> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: Removed keys from database</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> + <translation><numerusform>Successfully removed %n encryption key from KeePassXC/HTTP Settings.</numerusform><numerusform>Successfully removed %n encryption keys from KeePassXC/HTTP Settings.</numerusform></translation> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: No keys found</translation> + </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation>No shared encryption-keys found in KeePassHttp Settings.</translation> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: Settings not available!</translation> + </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation>The active database does not contain an entry of KeePassHttp Settings.</translation> + </message> + <message> + <source>Removing stored permissions...</source> + <translation>Removing stored permissions...</translation> + </message> + <message> + <source>Abort</source> + <translation>Abort</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: Removed permissions</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entries.</source> + <translation><numerusform>Successfully removed permissions from %n entry.</numerusform><numerusform>Successfully removed permissions from %n entries.</numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation>KeePassXC: No entry with permissions found!</translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>The active database does not contain an entry with permissions.</translation> + </message> +</context> +<context> + <name>SettingsWidget</name> + <message> + <source>Application Settings</source> + <translation>Application Settings</translation> + </message> + <message> + <source>General</source> + <translation>General</translation> + </message> + <message> + <source>Security</source> + <translation>Security</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation>Access error for config file %1</translation> + </message> +</context> +<context> + <name>SettingsWidgetGeneral</name> + <message> + <source>Basic Settings</source> + <translation>Basic Settings</translation> + </message> + <message> + <source>Start only a single instance of KeePassXC</source> + <translation>Start only a single instance of KeePassXC</translation> + </message> + <message> + <source>Remember last databases</source> + <translation>Remember last databases</translation> + </message> + <message> + <source>Remember last key files and security dongles</source> + <translation>Remember last key files and security dongles</translation> + </message> + <message> + <source>Load previous databases on startup</source> + <translation>Load previous databases on startup</translation> + </message> + <message> + <source>Automatically save on exit</source> + <translation>Automatically save on exit</translation> + </message> + <message> + <source>Automatically save after every change</source> + <translation>Automatically save after every change</translation> + </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation>Automatically reload the database when modified externally</translation> + </message> + <message> + <source>Minimize when copying to clipboard</source> + <translation>Minimize when copying to clipboard</translation> + </message> + <message> + <source>Minimize window at application startup</source> + <translation>Minimize window at application startup</translation> + </message> + <message> + <source>Use group icon on entry creation</source> + <translation>Use group icon on entry creation</translation> + </message> + <message> + <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> + <translation>Don't mark database as modified for non-data changes (e.g., expanding groups)</translation> + </message> + <message> + <source>Hide the Details view</source> + <translation>Hide the Details view</translation> + </message> + <message> + <source>Show a system tray icon</source> + <translation>Show a system tray icon</translation> + </message> + <message> + <source>Hide window to system tray when minimized</source> + <translation>Hide window to system tray when minimized</translation> + </message> + <message> + <source>Hide window to system tray instead of app exit</source> + <translation>Hide window to system tray instead of app exit</translation> + </message> + <message> + <source>Dark system tray icon</source> + <translation>Dark system tray icon</translation> + </message> + <message> + <source>Language</source> + <translation>Language</translation> + </message> + <message> + <source>Auto-Type</source> + <translation>Auto-Type</translation> + </message> + <message> + <source>Use entry title to match windows for global Auto-Type</source> + <translation>Use entry title to match windows for global Auto-Type</translation> + </message> + <message> + <source>Use entry URL to match windows for global Auto-Type</source> + <translation>Use entry URL to match windows for global Auto-Type</translation> + </message> + <message> + <source>Always ask before performing Auto-Type</source> + <translation>Always ask before performing Auto-Type</translation> + </message> + <message> + <source>Global Auto-Type shortcut</source> + <translation>Global Auto-Type shortcut</translation> + </message> + <message> + <source>Auto-Type delay</source> + <translation>Auto-Type delay</translation> + </message> + <message> + <source> ms</source> + <comment>Milliseconds</comment> + <translation> ms</translation> + </message> +</context> +<context> + <name>SettingsWidgetSecurity</name> + <message> + <source>Timeouts</source> + <translation>Timeouts</translation> + </message> + <message> + <source>Clear clipboard after</source> + <translation>Clear clipboard after</translation> + </message> + <message> + <source> sec</source> + <comment>Seconds</comment> + <translation> sec</translation> + </message> + <message> + <source>Lock databases after inactivity of</source> + <translation>Lock databases after inactivity of</translation> + </message> + <message> + <source>Convenience</source> + <translation>Convenience</translation> + </message> + <message> + <source>Lock databases when session is locked or lid is closed</source> + <translation>Lock databases when session is locked or lid is closed</translation> + </message> + <message> + <source>Lock databases after minimizing the window</source> + <translation>Lock databases after minimizing the window</translation> + </message> + <message> + <source>Don't require password repeat when it is visible</source> + <translation>Don't require password repeat when it is visible</translation> + </message> + <message> + <source>Show passwords in cleartext by default</source> + <translation>Show passwords in cleartext by default</translation> + </message> + <message> + <source>Hide passwords in the preview panel</source> + <translation>Hide passwords in the preview panel</translation> + </message> + <message> + <source>Hide entry notes by default</source> + <translation>Hide entry notes by default</translation> + </message> + <message> + <source>Privacy</source> + <translation>Privacy</translation> + </message> + <message> + <source>Use Google as fallback for downloading website icons</source> + <translation>Use Google as fallback for downloading website icons</translation> + </message> +</context> +<context> + <name>SetupTotpDialog</name> + <message> + <source>Setup TOTP</source> + <translation>Setup TOTP</translation> + </message> + <message> + <source>Key:</source> + <translation>Key:</translation> + </message> + <message> + <source>Default RFC 6238 token settings</source> + <translation>Default RFC 6238 token settings</translation> + </message> + <message> + <source>Steam token settings</source> + <translation>Steam token settings</translation> + </message> + <message> + <source>Use custom settings</source> + <translation>Use custom settings</translation> + </message> + <message> + <source>Note: Change these settings only if you know what you are doing.</source> + <translation>Note: Change these settings only if you know what you are doing.</translation> + </message> + <message> + <source>Time step:</source> + <translation>Time step:</translation> + </message> + <message> + <source>8 digits</source> + <translation>8 digits</translation> + </message> + <message> + <source>6 digits</source> + <translation>6 digits</translation> + </message> + <message> + <source>Code size:</source> + <translation>Code size:</translation> + </message> + <message> + <source> sec</source> + <comment>Seconds</comment> + <translation> sec</translation> + </message> +</context> +<context> + <name>TotpDialog</name> + <message> + <source>Timed Password</source> + <translation>Timed Password</translation> + </message> + <message> + <source>000000</source> + <translation>000000</translation> + </message> + <message> + <source>Copy</source> + <translation>Copy</translation> + </message> + <message> + <source>Expires in</source> + <translation>Expires in</translation> + </message> + <message> + <source>seconds</source> + <translation>seconds</translation> + </message> +</context> +<context> + <name>UnlockDatabaseWidget</name> + <message> + <source>Unlock database</source> + <translation>Unlock database</translation> + </message> +</context> +<context> + <name>WelcomeWidget</name> + <message> + <source>Welcome to KeePassXC</source> + <translation>Welcome to KeePassXC</translation> + </message> + <message> + <source>Start storing your passwords securely in a KeePassXC database</source> + <translation>Start storing your passwords securely in a KeePassXC database</translation> + </message> + <message> + <source>Create new database</source> + <translation>Create new database</translation> + </message> + <message> + <source>Open existing database</source> + <translation>Open existing database</translation> + </message> + <message> + <source>Import from KeePass 1</source> + <translation>Import from KeePass 1</translation> + </message> + <message> + <source>Import from CSV</source> + <translation>Import from CSV</translation> + </message> + <message> + <source>Recent databases</source> + <translation>Recent databases</translation> + </message> +</context> +<context> + <name>main</name> + <message> + <source>Remove an entry from the database.</source> + <translation>Remove an entry from the database.</translation> + </message> + <message> + <source>Path of the database.</source> + <translation>Path of the database.</translation> + </message> + <message> + <source>Path of the entry to remove.</source> + <translation>Path of the entry to remove.</translation> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation>KeePassXC - cross-platform password manager</translation> + </message> + <message> + <source>filenames of the password databases to open (*.kdbx)</source> + <translation>filenames of the password databases to open (*.kdbx)</translation> + </message> + <message> + <source>path to a custom config file</source> + <translation>path to a custom config file</translation> + </message> + <message> + <source>key file of the database</source> + <translation>key file of the database</translation> + </message> + <message> + <source>read password of the database from stdin</source> + <translation>read password of the database from stdin</translation> + </message> + <message> + <source>Parent window handle</source> + <translation>Parent window handle</translation> + </message> +</context> +</TS> \ No newline at end of file diff --git a/share/translations/keepassx_es.ts b/share/translations/keepassx_es.ts index 479284898..1b925e7c0 100644 --- a/share/translations/keepassx_es.ts +++ b/share/translations/keepassx_es.ts @@ -9,13 +9,33 @@ <source>About</source> <translation>Acerca de</translation> </message> + <message> + <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> + <translation>Reporte errores al: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> + </message> + <message> + <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>KeePassXC se distribuye bajo la Licencia Pública General de GNU (GPL) versión 2 o versión 3 (si así lo prefiere).</translation> + </message> + <message> + <source>Project Maintainers:</source> + <translation>Mantenedores del proyecto:</translation> + </message> <message> <source>Contributors</source> <translation>Contribuidores</translation> </message> + <message> + <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Ver contribuciones en GitHub</a></translation> + </message> <message> <source>Debug Info</source> - <translation>Información de Depuración</translation> + <translation>Información de depuración</translation> + </message> + <message> + <source>Include the following information whenever you report a bug:</source> + <translation>Incluya la información siguiente cuando informe sobre un error:</translation> </message> <message> <source>Copy to clipboard</source> @@ -31,6 +51,10 @@ <source>Revision: %1</source> <translation>Revisión: %1</translation> </message> + <message> + <source>Distribution: %1</source> + <translation>Distribución: %1</translation> + </message> <message> <source>Libraries:</source> <translation>Librerías:</translation> @@ -47,33 +71,13 @@ Núcleo: %3 %4</translation> <source>Enabled extensions:</source> <translation>Extensiones habilitadas:</translation> </message> - <message> - <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> - <translation>Reporte errores al: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> - </message> - <message> - <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassXC se distribuye bajo la Licencia Pública General de GNU (GPL) versión 2 o versión 3 (si así lo prefiere).</translation> - </message> - <message> - <source>Project Maintainers:</source> - <translation>Mantenedores del proyecto:</translation> - </message> - <message> - <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Ver contribuciones en GitHub</a></translation> - </message> - <message> - <source>Include the following information whenever you report a bug:</source> - <translation>Incluya la información siguiente cuando informe sobre un error:</translation> - </message> - <message> - <source>Distribution: %1</source> - <translation>Distribución: %1</translation> - </message> </context> <context> <name>AccessControlDialog</name> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>Confirmar acceso para KeePassXC HTTP</translation> + </message> <message> <source>Remember this decision</source> <translation>Recordar esta decisión</translation> @@ -92,9 +96,12 @@ Please select whether you want to allow access.</source> <translation>%1 ha solicitado acceso a las contraseñas de los siguientes item(s). Por favor seleccione si desea autorizar su acceso.</translation> </message> +</context> +<context> + <name>AgentSettingsWidget</name> <message> - <source>KeePassXC HTTP Confirm Access</source> - <translation>Confirmar acceso para KeePassXC HTTP</translation> + <source>Enable SSH Agent (requires restart)</source> + <translation>Habilitar el Agente SSH (requiere reinicio)</translation> </message> </context> <context> @@ -107,6 +114,26 @@ Por favor seleccione si desea autorizar su acceso.</translation> <source>Auto-Type - KeePassXC</source> <translation>Auto-Escritura - KeePassXC</translation> </message> + <message> + <source>Auto-Type</source> + <translation>Auto-Escritura</translation> + </message> + <message> + <source>The Syntax of your Auto-Type statement is incorrect!</source> + <translation>¡La sintaxis de la declaración de tu auto-escritura es incorrecta!</translation> + </message> + <message> + <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> + <translation>Este comando de Auto-Escritura contiene un retraso muy largo. ¿De verdad quieres continuar?</translation> + </message> + <message> + <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> + <translation>Este comando de Auto-Escritura contiene pulsaciones de teclas muy lentas. ¿De verdad quieres continuar?</translation> + </message> + <message> + <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> + <translation>Este comando de Auto-Escritura contiene argumentos que se repiten muy a menudo. ¿De verdad quieres continuar?</translation> + </message> </context> <context> <name>AutoTypeAssociationsModel</name> @@ -125,13 +152,290 @@ Por favor seleccione si desea autorizar su acceso.</translation> </context> <context> <name>AutoTypeSelectDialog</name> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>Auto-Escritura - KeePassXC</translation> + </message> <message> <source>Select entry to Auto-Type:</source> <translation>Seleccionar entrada para Auto-Escritura:</translation> </message> +</context> +<context> + <name>BrowserAccessControlDialog</name> <message> - <source>Auto-Type - KeePassXC</source> - <translation>Auto-Escritura - KeePassXC</translation> + <source>KeePassXC-Browser Confirm Access</source> + <translation>KeePassXC-Navegador Confirmar Acceso</translation> + </message> + <message> + <source>Remember this decision</source> + <translation>Recordar esta decisión</translation> + </message> + <message> + <source>Allow</source> + <translation>Permitir</translation> + </message> + <message> + <source>Deny</source> + <translation>Denegar</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 ha solicitado acceso a las contraseñas de los siguientes ítems. +Por favor seleccione si desea autorizar su acceso.</translation> + </message> +</context> +<context> + <name>BrowserOptionDialog</name> + <message> + <source>Dialog</source> + <translation>Cuadro de diálogo</translation> + </message> + <message> + <source>This is required for accessing your databases with KeePassXC-Browser</source> + <translation>Esto es necesario para acceder a las bases de datos con KeePassXC-Navegador</translation> + </message> + <message> + <source>Enable KeepassXC browser integration</source> + <translation>Permitir la integración de KeepassXC con el Navegador </translation> + </message> + <message> + <source>General</source> + <translation>General</translation> + </message> + <message> + <source>Enable integration for these browsers:</source> + <translation>Permitir la integración con estos navegadores:</translation> + </message> + <message> + <source>&Google Chrome</source> + <translation>&Google Chrome</translation> + </message> + <message> + <source>&Firefox</source> + <translation>&Firefox</translation> + </message> + <message> + <source>&Chromium</source> + <translation>&Chromium</translation> + </message> + <message> + <source>&Vivaldi</source> + <translation>&Vivaldi</translation> + </message> + <message> + <source>Show a &notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Mostrar una &notificación cuando las credenciales son requeridas</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Solicitar el desblo&queo de la base de datos si se encuentra bloqueada</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> + <translation>Sólo se muestran las entradas con el mismo esquema (http://, https://,...)</translation> + </message> + <message> + <source>&Match URL scheme (e.g., https://...)</source> + <translation>&Coinciden con el esquema de URL (ej. https://...)</translation> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>Sólo devolver los resultados similares para una URL específica en vez de todas las entradas para todo el dominio.</translation> + </message> + <message> + <source>&Return only best-matching credentials</source> + <translation>&Mostrar sólo las mejores credenciales</translation> + </message> + <message> + <source>Sort &matching credentials by title</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Ordenar las credenciales por &título</translation> + </message> + <message> + <source>Sort matching credentials by &username</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Ordenar las credenciales por &usuario</translation> + </message> + <message> + <source>&Disconnect all browsers</source> + <translation>&Desconectar todos los navegadores</translation> + </message> + <message> + <source>Forget all remembered &permissions</source> + <translation>Olvidar todos las &permisos recordados</translation> + </message> + <message> + <source>Advanced</source> + <translation>Avanzado</translation> + </message> + <message> + <source>Never &ask before accessing credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Nunca &pregunte antes de acceder a las credenciales</translation> + </message> + <message> + <source>Never ask before &updating credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>Sólo las bases de datos seleccionadas se conectaran con el cliente.</translation> + </message> + <message> + <source>Searc&h in all opened databases for matching credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>No se permite crear o actualizar campos de caracteres automáticamente.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>Mostra&r campos de caracteres avanzados que comiencen con "KPH: "</translation> + </message> + <message> + <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Update &native messaging manifest files at startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Support a proxy application between KeePassXC and browser extension.</source> + <translation>Apoya una aplicación proxy entre KeePassXC y una extensión de navegador.</translation> + </message> + <message> + <source>Use a &proxy application between KeePassXC and browser extension</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a custom proxy location if you installed a proxy manually.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &custom proxy location</source> + <comment>Meant is the proxy for KeePassXC-Browser</comment> + <translation>Usar una ubicación proxy &personalizada</translation> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Navegar...</translation> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation><b>Advertencia:</b> Las siguientes opciones pueden ser peligrosas.</translation> + </message> + <message> + <source>Executable Files (*.exe);;All Files (*.*)</source> + <translation>Archivos ejecutables (*.exe); Todos los archivos (*. *)</translation> + </message> + <message> + <source>Executable Files (*)</source> + <translation>Archivos ejecutables (*)</translation> + </message> + <message> + <source>Select custom proxy location</source> + <translation>Elegir una ubicación de proxy personalizada</translation> + </message> +</context> +<context> + <name>BrowserService</name> + <message> + <source>KeePassXC: New key association request</source> + <translation>KeePassXC: Solicitud de asociación de nueva clave</translation> + </message> + <message> + <source>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Save and allow access</source> + <translation>Guardar y permitir acceso</translation> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: ¿Sobrescribir clave existente?</translation> + </message> + <message> + <source>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: Actualizar entrada</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>¿Desea actualizar la información en %1 - %2?</translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: ¡Base de datos bloqueada!</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>¡La base de datos activa está bloqueada! +Por favor desbloquee la base de datos seleccionada o elija otra que esté desbloqueada.</translation> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: ¡Configuraciones no disponibles!</translation> + </message> + <message> + <source>The active database does not contain a settings entry.</source> + <translation>La base de datos activa no contiene una entrada de configuraciones.</translation> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: No se encontró ninguna clave</translation> + </message> + <message> + <source>No shared encryption keys found in KeePassXC Settings.</source> + <translation>No se encontraron claves de cifrado en las configuraciones de KeePassXC.</translation> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: Las claves se eliminaron de la base de datos</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Removing stored permissions…</source> + <translation>Eliminando permisos almacenados...</translation> + </message> + <message> + <source>Abort</source> + <translation>Abortar</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: Permisos eliminados</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entry(s).</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation>KeePassXC: ¡No se encontró ninguna entrada con permisos!</translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>La base de datos activa no contiene una entrada con permisos.</translation> </message> </context> <context> @@ -148,14 +452,26 @@ Por favor seleccione si desea autorizar su acceso.</translation> <source>Repeat password:</source> <translation>Repita la contraseña:</translation> </message> + <message> + <source>&Key file</source> + <translation>&Archivo llave</translation> + </message> <message> <source>Browse</source> - <translation>Abrir archivo</translation> + <translation>Navegar</translation> </message> <message> <source>Create</source> <translation>Crear</translation> </message> + <message> + <source>Cha&llenge Response</source> + <translation>Desa&fío/Respuesta</translation> + </message> + <message> + <source>Refresh</source> + <translation>Actualizar</translation> + </message> <message> <source>Key files</source> <translation>Archivos llave</translation> @@ -176,6 +492,10 @@ Por favor seleccione si desea autorizar su acceso.</translation> <source>Select a key file</source> <translation>Seleccione un archivo llave</translation> </message> + <message> + <source>Empty password</source> + <translation>Contraseña vacía</translation> + </message> <message> <source>Do you really want to use an empty string as password?</source> <translation>¿Realmente desea usar una cadena vacía como contraseña?</translation> @@ -191,20 +511,15 @@ Por favor seleccione si desea autorizar su acceso.</translation> %2</translation> </message> <message> - <source>&Key file</source> - <translation>&Archivo llave</translation> + <source>Legacy key file format</source> + <translation type="unfinished"/> </message> <message> - <source>Cha&llenge Response</source> - <translation>Desa&fío/Respuesta</translation> - </message> - <message> - <source>Refresh</source> - <translation>Actualizar</translation> - </message> - <message> - <source>Empty password</source> - <translation>Contraseña vacía</translation> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -217,6 +532,10 @@ Por favor seleccione si desea autorizar su acceso.</translation> <source>Clone Options</source> <translation>Opciones de Clonado</translation> </message> + <message> + <source>Append ' - Clone' to title</source> + <translation>Añadir ' - Clon' a título</translation> + </message> <message> <source>Replace username and password with references</source> <translation>Reemplaza nombre de usuario y contraseña con referencias</translation> @@ -225,10 +544,6 @@ Por favor seleccione si desea autorizar su acceso.</translation> <source>Copy history</source> <translation>Copiar historial</translation> </message> - <message> - <source>Append ' - Clone' to title</source> - <translation>Añadir ' - Clon' a título</translation> - </message> </context> <context> <name>CsvImportWidget</name> @@ -325,10 +640,6 @@ Por favor seleccione si desea autorizar su acceso.</translation> </context> <context> <name>CsvImportWizard</name> - <message> - <source>Import CSV file</source> - <translation>Importar archivo CSV</translation> - </message> <message> <source>Error</source> <translation>Error</translation> @@ -340,17 +651,17 @@ Por favor seleccione si desea autorizar su acceso.</translation> </context> <context> <name>CsvParserModel</name> - <message> - <source> byte, </source> - <translation>byte,</translation> + <message numerus="yes"> + <source>%n byte(s), </source> + <translation><numerusform>%n byte(s), </numerusform><numerusform>%n byte(s), </numerusform></translation> </message> - <message> - <source> rows, </source> - <translation>filas,</translation> + <message numerus="yes"> + <source>%n row(s), </source> + <translation><numerusform>%n fila(s), </numerusform><numerusform>%n fila(s), </numerusform></translation> </message> - <message> - <source> columns</source> - <translation>columnas</translation> + <message numerus="yes"> + <source>%n column(s)</source> + <translation><numerusform>%n columna(s)</numerusform><numerusform>%n columna(s) </numerusform></translation> </message> </context> <context> @@ -371,14 +682,37 @@ Por favor seleccione si desea autorizar su acceso.</translation> <source>Browse</source> <translation>Navegar</translation> </message> + <message> + <source>Refresh</source> + <translation>Actualizar</translation> + </message> + <message> + <source>Challenge Response:</source> + <translation>Desafío/respuesta:</translation> + </message> <message> <source>Unable to open the database.</source> - <translation>Incapaz de abrir la base de datos.</translation> + <translation>No se pudo abrir la base de datos.</translation> </message> <message> <source>Can't open key file</source> <translation>No se puede abrir el archivo llave</translation> </message> + <message> + <source>Legacy key file format</source> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't show this warning again</source> + <translation type="unfinished"/> + </message> <message> <source>All files</source> <translation>Todos los archivos</translation> @@ -391,20 +725,12 @@ Por favor seleccione si desea autorizar su acceso.</translation> <source>Select key file</source> <translation>Seleccionar archivo llave</translation> </message> - <message> - <source>Refresh</source> - <translation>Actualizar</translation> - </message> - <message> - <source>Challenge Response:</source> - <translation>Desafío/respuesta:</translation> - </message> </context> <context> <name>DatabaseRepairWidget</name> <message> <source>Repair database</source> - <translation>Reparar base de datos</translation> + <translation>Reparar la base de datos</translation> </message> <message> <source>Error</source> @@ -414,14 +740,14 @@ Por favor seleccione si desea autorizar su acceso.</translation> <source>Can't open key file</source> <translation>No se puede abrir el archivo llave</translation> </message> - <message> - <source>Database opened fine. Nothing to do.</source> - <translation>Base de datos abierta correctamente. Nada que hacer.</translation> - </message> <message> <source>Unable to open the database.</source> <translation>No se pudo abrir la base de datos.</translation> </message> + <message> + <source>Database opened fine. Nothing to do.</source> + <translation>Base de datos abierta correctamente. Nada que hacer.</translation> + </message> <message> <source>Success</source> <translation>Éxito</translation> @@ -440,40 +766,57 @@ Ahora puede guardarla.</translation> <context> <name>DatabaseSettingsWidget</name> <message> - <source>Database name:</source> - <translation>Nombre de la base de datos:</translation> + <source>General</source> + <translation>General</translation> </message> <message> - <source>Database description:</source> - <translation>Descripción de la base de datos:</translation> + <source>Encryption</source> + <translation>Cifrado</translation> </message> <message> - <source>Transform rounds:</source> - <translation>Rondas de transformación:</translation> + <source>Number of rounds too high</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> </message> <message> - <source>Default username:</source> - <translation>Nombre de usuario por defecto:</translation> + <source>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</source> + <translation type="unfinished"/> </message> <message> - <source> MiB</source> - <translation>MiB</translation> + <source>Understood, keep number</source> + <translation type="unfinished"/> </message> <message> - <source>Benchmark</source> - <translation>Prueba de rendimiento</translation> + <source>Cancel</source> + <translation type="unfinished"/> </message> <message> - <source>Max. history items:</source> - <translation>Elementos máximos del historial:</translation> + <source>Number of rounds too low</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> </message> <message> - <source>Max. history size:</source> - <translation>Tamaño máximo del historial:</translation> + <source>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</source> + <translation type="unfinished"/> </message> <message> - <source>Use recycle bin</source> - <translation>Usar papelera de reciclaje</translation> + <source>KDF unchanged</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetEncryption</name> + <message> + <source>Encryption Algorithm:</source> + <translation type="unfinished"/> </message> <message> <source>AES: 256 Bit (default)</source> @@ -484,19 +827,83 @@ Ahora puede guardarla.</translation> <translation>Twofish: 256 Bit</translation> </message> <message> - <source>Algorithm:</source> - <translation>Algoritmo:</translation> + <source>Key Derivation Function:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Transform rounds:</source> + <translation>Rondas de transformación:</translation> + </message> + <message> + <source>Benchmark 1-second delay</source> + <translation type="unfinished"/> + </message> + <message> + <source>Memory Usage:</source> + <translation type="unfinished"/> + </message> + <message> + <source> MB</source> + <translation type="unfinished"/> + </message> + <message> + <source>Parallelism:</source> + <translation type="unfinished"/> + </message> + <message> + <source> thread</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetGeneral</name> + <message> + <source>Database Meta Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database name:</source> + <translation>Nombre de la base de datos:</translation> + </message> + <message> + <source>Database description:</source> + <translation>Descripción de la base de datos:</translation> + </message> + <message> + <source>Default username:</source> + <translation>Nombre de usuario por defecto:</translation> + </message> + <message> + <source>History Settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Max. history items:</source> + <translation>Elementos máximos del historial:</translation> + </message> + <message> + <source>Max. history size:</source> + <translation>Tamaño máximo del historial:</translation> + </message> + <message> + <source> MiB</source> + <translation>MiB</translation> + </message> + <message> + <source>Use recycle bin</source> + <translation>Usar papelera de reciclaje</translation> </message> </context> <context> <name>DatabaseTabWidget</name> <message> <source>Root</source> + <comment>Root group</comment> <translation>Raíz</translation> </message> <message> <source>KeePass 2 Database</source> - <translation>Base de datos KeePass 2</translation> + <translation>Base de datos de KeePass 2</translation> </message> <message> <source>All files</source> @@ -510,6 +917,30 @@ Ahora puede guardarla.</translation> <source>File not found!</source> <translation>¡Archivo no encontrado!</translation> </message> + <message> + <source>Unable to open the database.</source> + <translation>No se pudo abrir la base de datos.</translation> + </message> + <message> + <source>File opened in read only mode.</source> + <translation>Archivo abierto en modo sólo lectura.</translation> + </message> + <message> + <source>Open CSV file</source> + <translation>Abrir archivo CSV</translation> + </message> + <message> + <source>CSV file</source> + <translation>Archivo CSV</translation> + </message> + <message> + <source>All files (*)</source> + <translation>Todos los archivos (*)</translation> + </message> + <message> + <source>Merge database</source> + <translation>Unir base de datos</translation> + </message> <message> <source>Open KeePass 1 database</source> <translation>Abrir base de datos KeePass 1</translation> @@ -518,14 +949,16 @@ Ahora puede guardarla.</translation> <source>KeePass 1 database</source> <translation>Base de datos KeePass 1</translation> </message> - <message> - <source>All files (*)</source> - <translation>Todos los archivos (*)</translation> - </message> <message> <source>Close?</source> <translation>¿Cerrar?</translation> </message> + <message> + <source>"%1" is in edit mode. +Discard changes and close anyway?</source> + <translation>"% 1" está en el modo de edición. +¿Descartar cambios y cerrar de todos modos?</translation> + </message> <message> <source>Save changes?</source> <translation>¿Guardar cambios?</translation> @@ -538,12 +971,24 @@ Save changes?</source> </message> <message> <source>Writing the database failed.</source> - <translation>La escritura de la base de datos falló.</translation> + <translation>Fallo al escribir la base de datos.</translation> + </message> + <message> + <source>Passwords</source> + <translation>Contraseñas</translation> </message> <message> <source>Save database as</source> <translation>Guardar base de datos como</translation> </message> + <message> + <source>Export database to CSV file</source> + <translation>Exportar base de datos a un archivo CSV</translation> + </message> + <message> + <source>Writing the CSV file failed.</source> + <translation>La escritura del archivo CSV falló.</translation> + </message> <message> <source>New database</source> <translation>Nueva base de datos</translation> @@ -561,12 +1006,6 @@ Save changes?</source> Please press cancel to finish your changes or discard them.</source> <translation>No se puede bloquear la base de datos porque actualmente está editándola. Por favor, pulse cancelar para terminar sus cambios o descartarlos.</translation> - </message> - <message> - <source>This database has never been saved. -You can save the database or stop locking it.</source> - <translation>Esta base de datos nunca ha sido guardada. -Puede guardar la base de datos o dejar de bloquearla.</translation> </message> <message> <source>This database has been modified. @@ -576,68 +1015,13 @@ Otherwise your changes are lost.</source> ¿Desea guardar la base de datos antes de bloquearla? De lo contrario se perderán los cambios.</translation> </message> - <message> - <source>"%1" is in edit mode. -Discard changes and close anyway?</source> - <translation>"% 1" está en el modo de edición. -¿Descartar cambios y cerrar de todos modos?</translation> - </message> - <message> - <source>Export database to CSV file</source> - <translation>Exportar base de datos a un archivo CSV</translation> - </message> - <message> - <source>CSV file</source> - <translation>Archivo CSV</translation> - </message> - <message> - <source>Writing the CSV file failed.</source> - <translation>La escritura del archivo CSV falló.</translation> - </message> - <message> - <source>Unable to open the database.</source> - <translation>No se pudo abrir la base de datos.</translation> - </message> - <message> - <source>Merge database</source> - <translation>Unir base de datos</translation> - </message> - <message> - <source>The database you are trying to save as is locked by another instance of KeePassXC. -Do you want to save it anyway?</source> - <translation>La base de datos que intenta guardar está bloqueada por otra instancia de KeePassXC. -¿Desea guardarla de todas formas?</translation> - </message> - <message> - <source>Passwords</source> - <translation>Contraseñas</translation> - </message> - <message> - <source>Database already opened</source> - <translation>La base de datos ya está abierta</translation> - </message> - <message> - <source>The database you are trying to open is locked by another instance of KeePassXC. - -Do you want to open it anyway?</source> - <translation>La base de datos que intenta abrir está bloqueada por otra instancia de KeePassXC. -¿Desea abrirla de todas formas?</translation> - </message> - <message> - <source>Open read-only</source> - <translation>Abrir como sólo lectura</translation> - </message> - <message> - <source>File opened in read only mode.</source> - <translation>Archivo abierto en modo sólo lectura.</translation> - </message> - <message> - <source>Open CSV file</source> - <translation>Abrir archivo CSV</translation> - </message> </context> <context> <name>DatabaseWidget</name> + <message> + <source>Searching...</source> + <translation>Buscando...</translation> + </message> <message> <source>Change master key</source> <translation>Cambiar la clave maestra</translation> @@ -658,13 +1042,33 @@ Do you want to open it anyway?</source> <source>Do you really want to delete %1 entries for good?</source> <translation>¿Realmente quiere eliminar las entradas "%1" de forma definitiva?</translation> </message> + <message> + <source>Move entry to recycle bin?</source> + <translation>¿Mover entrada a la papelera de reciclaje?</translation> + </message> + <message> + <source>Do you really want to move entry "%1" to the recycle bin?</source> + <translation>¿Realmente quiere mover la entrada "%1" a la papelera de reciclaje?</translation> + </message> <message> <source>Move entries to recycle bin?</source> <translation>¿Mover entradas a la papelera de reciclaje?</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>¿Realmente quiere mover la entrada "%1" a la papelera de reciclaje?</numerusform><numerusform>¿Realmente quiere mover las entradas "%1" a la papelera de reciclaje?</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Execute command?</source> + <translation>¿Ejecutar comando?</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation>¿Realmente desea ejecutar el siguiente comando?<br><br>%1<br></translation> + </message> + <message> + <source>Remember my choice</source> + <translation>Recordar mi elección</translation> </message> <message> <source>Delete group?</source> @@ -676,19 +1080,7 @@ Do you want to open it anyway?</source> </message> <message> <source>Unable to calculate master key</source> - <translation>No se puede calcular la llave maestra</translation> - </message> - <message> - <source>Move entry to recycle bin?</source> - <translation>¿Mover entrada a la papelera de reciclaje?</translation> - </message> - <message> - <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation>¿Realmente quiere mover la entrada "%1" a la papelera de reciclaje?</translation> - </message> - <message> - <source>Searching...</source> - <translation>Buscando...</translation> + <translation>No se puede calcular la clave maestra</translation> </message> <message> <source>No current database.</source> @@ -707,20 +1099,8 @@ Do you want to open it anyway?</source> <translation>No hay resultados</translation> </message> <message> - <source>Execute command?</source> - <translation>¿Ejecutar comando?</translation> - </message> - <message> - <source>Do you really want to execute the following command?<br><br>%1<br></source> - <translation>¿Realmente desea ejecutar el siguiente comando?<br><br>%1<br></translation> - </message> - <message> - <source>Remember my choice</source> - <translation>Recordar mi elección</translation> - </message> - <message> - <source>Autoreload Request</source> - <translation>Solicitud de recarga automática</translation> + <source>File has changed</source> + <translation type="unfinished"/> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -731,8 +1111,9 @@ Do you want to open it anyway?</source> <translation>Solicitud de Unión</translation> </message> <message> - <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> - <translation>El archivo de la base de datos ha cambiado y usted tiene modificaciones sin guardar. ¿Desea unir sus modificaciones?</translation> + <source>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</source> + <translation type="unfinished"/> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -747,6 +1128,89 @@ Do you want to open it anyway?</source> <translation>¿Está seguro que quiere eliminar permanentemente todo de su papelera de reciclaje?</translation> </message> </context> +<context> + <name>DetailsWidget</name> + <message> + <source>Generate TOTP Token</source> + <translation type="unfinished"/> + </message> + <message> + <source>Close</source> + <translation>Cerrar</translation> + </message> + <message> + <source>General</source> + <translation>General</translation> + </message> + <message> + <source>Password</source> + <translation>Contraseña</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Expiration</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username</source> + <translation>Nombre de usuario:</translation> + </message> + <message> + <source>Autotype</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searching</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attributes</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation>Adjuntos</translation> + </message> + <message> + <source>Notes</source> + <translation>Notas</translation> + </message> + <message> + <source>Window</source> + <translation>Ventana</translation> + </message> + <message> + <source>Sequence</source> + <translation>Secuencia</translation> + </message> + <message> + <source>Search</source> + <translation>Buscar</translation> + </message> + <message> + <source>Clear</source> + <translation>Limpiar</translation> + </message> + <message> + <source>Never</source> + <translation type="unfinished"/> + </message> + <message> + <source>[PROTECTED]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Disabled</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enabled</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EditEntryWidget</name> <message> @@ -773,6 +1237,30 @@ Do you want to open it anyway?</source> <source>History</source> <translation>Historial</translation> </message> + <message> + <source>SSH Agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>(encrypted)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>File too large to be a private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open private key</source> + <translation type="unfinished"/> + </message> <message> <source>Entry history</source> <translation>Historial de entradas</translation> @@ -793,40 +1281,6 @@ Do you want to open it anyway?</source> <source>New attribute</source> <translation>Nuevo atributo</translation> </message> - <message> - <source>Select file</source> - <translation>Seleccionar archivo</translation> - </message> - <message> - <source>Unable to open file</source> - <translation>Incapaz de abrir el archivo</translation> - </message> - <message> - <source>Save attachment</source> - <translation>Guardar adjunto</translation> - </message> - <message> - <source>Unable to save the attachment: -</source> - <translation>Incapaz de guardar el adjunto: -</translation> - </message> - <message> - <source>Tomorrow</source> - <translation>Mañana</translation> - </message> - <message numerus="yes"> - <source>%n week(s)</source> - <translation><numerusform>%n semana</numerusform><numerusform>%n semana(s)</numerusform></translation> - </message> - <message numerus="yes"> - <source>%n month(s)</source> - <translation><numerusform>%n mes</numerusform><numerusform>%n mes(es)</numerusform></translation> - </message> - <message> - <source>1 year</source> - <translation>1 año</translation> - </message> <message> <source>Confirm Remove</source> <translation>Confirmar eliminación</translation> @@ -836,12 +1290,28 @@ Do you want to open it anyway?</source> <translation>¿Está seguro que desea eliminar este atributo?</translation> </message> <message> - <source>[PROTECTED] Press reveal to view or edit</source> - <translation>[PROTEGIDO] Presione revelar para ver o editar</translation> + <source>[PROTECTED]</source> + <translation type="unfinished"/> </message> <message> - <source>Are you sure you want to remove this attachment?</source> - <translation>¿Está seguro que desea eliminar este adjunto?</translation> + <source>Press reveal to view or edit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Tomorrow</source> + <translation>Mañana</translation> + </message> + <message numerus="yes"> + <source>%n week(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source>%n month(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>1 year</source> + <translation>1 año</translation> </message> </context> <context> @@ -858,18 +1328,6 @@ Do you want to open it anyway?</source> <source>Remove</source> <translation>Eliminar</translation> </message> - <message> - <source>Attachments</source> - <translation>Adjuntos</translation> - </message> - <message> - <source>Save</source> - <translation>Guardar</translation> - </message> - <message> - <source>Open</source> - <translation>Abrir</translation> - </message> <message> <source>Edit Name</source> <translation>Editar Nombre</translation> @@ -882,6 +1340,10 @@ Do you want to open it anyway?</source> <source>Reveal</source> <translation>Revelar</translation> </message> + <message> + <source>Attachments</source> + <translation>Adjuntos</translation> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -889,6 +1351,18 @@ Do you want to open it anyway?</source> <source>Enable Auto-Type for this entry</source> <translation>Activar Auto-Escritura para esta entrada</translation> </message> + <message> + <source>Inherit default Auto-Type sequence from the &group</source> + <translation>Heredar la secuencia de Auto-Escritura por defecto del &grupo</translation> + </message> + <message> + <source>&Use custom Auto-Type sequence:</source> + <translation>&Usar secuencia de Auto-Escritura personalizada:</translation> + </message> + <message> + <source>Window Associations</source> + <translation>Ventanas Asociadas</translation> + </message> <message> <source>+</source> <translation>+</translation> @@ -901,14 +1375,6 @@ Do you want to open it anyway?</source> <source>Window title:</source> <translation>Título de la ventana:</translation> </message> - <message> - <source>Inherit default Auto-Type sequence from the &group</source> - <translation>Heredar la secuencia de Auto-Escritura por defecto del &grupo</translation> - </message> - <message> - <source>&Use custom Auto-Type sequence:</source> - <translation>&Usar secuencia de Auto-Escritura personalizada:</translation> - </message> <message> <source>Use default se&quence</source> <translation>Usar secuencia por &defecto</translation> @@ -917,10 +1383,6 @@ Do you want to open it anyway?</source> <source>Set custo&m sequence:</source> <translation>Definir secuencia personalizada:</translation> </message> - <message> - <source>Window Associations</source> - <translation>Ventanas Asociadas</translation> - </message> </context> <context> <name>EditEntryWidgetHistory</name> @@ -944,12 +1406,8 @@ Do you want to open it anyway?</source> <context> <name>EditEntryWidgetMain</name> <message> - <source>Title:</source> - <translation>Título:</translation> - </message> - <message> - <source>Username:</source> - <translation>Nombre de usuario:</translation> + <source>URL:</source> + <translation>URL:</translation> </message> <message> <source>Password:</source> @@ -960,20 +1418,104 @@ Do you want to open it anyway?</source> <translation>Repetir:</translation> </message> <message> - <source>URL:</source> - <translation>URL:</translation> + <source>Title:</source> + <translation>Título:</translation> </message> <message> - <source>Expires</source> - <translation>Expira</translation> + <source>Notes</source> + <translation>Notas</translation> </message> <message> <source>Presets</source> <translation>Programar</translation> </message> <message> - <source>Notes:</source> - <translation>Notas:</translation> + <source>Toggle the checkbox to reveal the notes section.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username:</source> + <translation>Nombre de usuario:</translation> + </message> + <message> + <source>Expires</source> + <translation>Expira</translation> + </message> +</context> +<context> + <name>EditEntryWidgetSSHAgent</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent after</source> + <translation type="unfinished"/> + </message> + <message> + <source> seconds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fingerprint</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent when database is closed/locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add key to agent when database is opened/unlocked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Comment</source> + <translation type="unfinished"/> + </message> + <message> + <source>Decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy to clipboard</source> + <translation>Copiar al portapapeles</translation> + </message> + <message> + <source>Private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>External file</source> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Navegar...</translation> + </message> + <message> + <source>Attachment</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add to agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove from agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Require user confirmation when this key is used</source> + <translation type="unfinished"/> </message> </context> <context> @@ -1044,6 +1586,14 @@ Do you want to open it anyway?</source> </context> <context> <name>EditWidgetIcons</name> + <message> + <source>&Use default icon</source> + <translation>&Usar icono por defecto</translation> + </message> + <message> + <source>Use custo&m icon</source> + <translation>Usar icono &personalizado</translation> + </message> <message> <source>Add custom icon</source> <translation>Añadir icono personalizado</translation> @@ -1052,6 +1602,18 @@ Do you want to open it anyway?</source> <source>Delete custom icon</source> <translation>Eliminar icono personalizado</translation> </message> + <message> + <source>Download favicon</source> + <translation>Descargar favicon</translation> + </message> + <message> + <source>Unable to fetch favicon.</source> + <translation>No se pudo descargar el favicon</translation> + </message> + <message> + <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> + <translation>Consejo: Puede activar Google como una alternativa en Herramientas > Configuración > Seguridad</translation> + </message> <message> <source>Images</source> <translation>Imágenes</translation> @@ -1064,25 +1626,13 @@ Do you want to open it anyway?</source> <source>Select Image</source> <translation>Seleccionar imagen</translation> </message> - <message> - <source>Download favicon</source> - <translation>Descargar favicon</translation> - </message> - <message> - <source>Unable to fetch favicon.</source> - <translation>No se pudo descargar el favicon</translation> - </message> <message> <source>Can't read icon</source> <translation>No se puede leer el ícono</translation> </message> <message> - <source>&Use default icon</source> - <translation>&Usar icono por defecto</translation> - </message> - <message> - <source>Use custo&m icon</source> - <translation>Usar icono &personalizado</translation> + <source>Custom icon already exists</source> + <translation>El icono personalizado ya existe</translation> </message> <message> <source>Confirm Delete</source> @@ -1092,14 +1642,6 @@ Do you want to open it anyway?</source> <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> <translation>Este ícono se utiliza en %1 entradas, y será modificado por el ícono por defecto. ¿Está seguro que desea eliminarlo?</translation> </message> - <message> - <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation>Consejo: Puede activar Google como una alternativa en Herramientas > Configuración > Seguridad</translation> - </message> - <message> - <source>Custom icon already exists</source> - <translation>El icono personalizado ya existe</translation> - </message> </context> <context> <name>EditWidgetProperties</name> @@ -1124,9 +1666,93 @@ Do you want to open it anyway?</source> <name>Entry</name> <message> <source> - Clone</source> + <comment>Suffix added to cloned entries</comment> <translation>- Clon</translation> </message> </context> +<context> + <name>EntryAttachmentsModel</name> + <message> + <source>Name</source> + <translation>Nombre</translation> + </message> + <message> + <source>Size</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EntryAttachmentsWidget</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add</source> + <translation>Añadir</translation> + </message> + <message> + <source>Remove</source> + <translation>Eliminar</translation> + </message> + <message> + <source>Open</source> + <translation>Abrir</translation> + </message> + <message> + <source>Save</source> + <translation>Guardar</translation> + </message> + <message> + <source>Select files</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <source>Are you sure you want to remove %n attachment(s)?</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>Confirmar eliminación</translation> + </message> + <message> + <source>Save attachments</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to create directory: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Confirm overwrite</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to save attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachment: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open files: +%1</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EntryAttributesModel</name> <message> @@ -1146,7 +1772,7 @@ Do you want to open it anyway?</source> </message> <message> <source>Username</source> - <translation>Nombre de usuario</translation> + <translation>Nombre de usuario:</translation> </message> <message> <source>URL</source> @@ -1155,6 +1781,11 @@ Do you want to open it anyway?</source> </context> <context> <name>EntryModel</name> + <message> + <source>Ref: </source> + <comment>Reference abbreviation</comment> + <translation>Ref:</translation> + </message> <message> <source>Group</source> <translation>Grupo</translation> @@ -1171,11 +1802,6 @@ Do you want to open it anyway?</source> <source>URL</source> <translation>URL</translation> </message> - <message> - <source>Ref: </source> - <comment>Reference abbreviation</comment> - <translation>Ref:</translation> - </message> </context> <context> <name>Group</name> @@ -1184,6 +1810,17 @@ Do you want to open it anyway?</source> <translation>Papelera de reciclaje</translation> </message> </context> +<context> + <name>HostInstaller</name> + <message> + <source>KeePassXC: Cannot save file!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot save the native messaging script file.</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>HttpPasswordGeneratorWidget</name> <message> @@ -1246,6 +1883,361 @@ Do you want to open it anyway?</source> <translation>Cerrar mensaje</translation> </message> </context> +<context> + <name>Kdbx3Reader</name> + <message> + <source>Unable to calculate master key</source> + <translation>No se puede calcular la clave maestra</translation> + </message> + <message> + <source>Unable to issue challenge-response.</source> + <translation>No se pudo hacer el desafío/respuesta:</translation> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>La contraseña es incorrecta o el archivo de la base de datos está dañado.</translation> + </message> +</context> +<context> + <name>Kdbx3Writer</name> + <message> + <source>Unable to issue challenge-response.</source> + <translation>No se pudo hacer el desafío/respuesta:</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>No se puede calcular la clave maestra</translation> + </message> +</context> +<context> + <name>Kdbx4Reader</name> + <message> + <source>missing database headers</source> + <translation>faltan las cabeceras de la base de datos</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>No se puede calcular la clave maestra</translation> + </message> + <message> + <source>Invalid header checksum size</source> + <translation>Suma de verificación incorrecta de la cabecera</translation> + </message> + <message> + <source>Header SHA256 mismatch</source> + <translation>Cabecera SHA256 diferente</translation> + </message> + <message> + <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> + <translation>Clave equivocada o base de datos corrupta. (HMAC distinta)</translation> + </message> + <message> + <source>Unknown cipher</source> + <translation>Algoritmo de cifrado desconocido</translation> + </message> + <message> + <source>Invalid header id size</source> + <translation>Tamaño id de la cabecera inválido</translation> + </message> + <message> + <source>Invalid header field length</source> + <translation>Tamaño del campo en la cabecera inválido</translation> + </message> + <message> + <source>Invalid header data length</source> + <translation>Tamaño del campo de datos en la cabecera incorrecto</translation> + </message> + <message> + <source>Failed to open buffer for KDF parameters in header</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported key derivation function (KDF) or invalid parameters</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy header fields found in KDBX4 file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header binary size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass variant map version.</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name data</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value data</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Bool entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry type</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map field type size</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Kdbx4Writer</name> + <message> + <source>Invalid symmetric cipher algorithm.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid symmetric cipher IV size.</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>No se puede calcular la clave maestra</translation> + </message> + <message> + <source>Failed to serialize KDF parameters variant map</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxReader</name> + <message> + <source>Invalid cipher uuid length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid compression flags length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported compression algorithm</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid master seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform rounds size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid start bytes size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid random stream id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner random stream cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>No es una base de datos KeePass.</translation> + </message> + <message> + <source>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> + <translation>El archivo seleccionado es una vieja base de datos de KeePass 1 (.kdb). + +Puede importarla haciendo clic en Base de datos > 'Importar base de datos KeePass 1...'. +Esta migración es en único sentido. No podrá abrir la base de datos importada con la vieja versión 0.4 de KeePassX.</translation> + </message> + <message> + <source>Unsupported KeePass 2 database version.</source> + <translation>Version de la base de datos de KeePass 2 no soportada.</translation> + </message> +</context> +<context> + <name>KdbxXmlReader</name> + <message> + <source>XML parsing failure: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>No root group</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing icon uuid or data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing custom data key or value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Multiple group elements</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null group uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableAutoType value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableSearching value</source> + <translation type="unfinished"/> + </message> + <message> + <source>No group uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null DeleteObject uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing DeletedObject uuid or time</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null entry uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element in history entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>No entry uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element with different uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decrypt entry string</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate custom attribute found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry string key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate attachment found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry binary key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-type association window or sequence missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid bool value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid date time value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color rgb part</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid uuid value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decompress binary</source> + <extracomment>Translator meant is a binary data inside an entry</extracomment> + <translation type="unfinished"/> + </message> +</context> <context> <name>KeePass1OpenWidget</name> <message> @@ -1254,7 +2246,7 @@ Do you want to open it anyway?</source> </message> <message> <source>Unable to open the database.</source> - <translation>Incapaz de abrir la base de datos.</translation> + <translation>No se pudo abrir la base de datos.</translation> </message> </context> <context> @@ -1275,6 +2267,35 @@ Do you want to open it anyway?</source> <source>Unsupported KeePass database version.</source> <translation>Versión de la base de datos KeePass no soportada.</translation> </message> + <message> + <source>Unable to read encryption IV</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of groups</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid content hash size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of transform rounds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to construct group tree</source> + <translation type="unfinished"/> + </message> <message> <source>Root</source> <translation>Raíz</translation> @@ -1287,60 +2308,104 @@ Do you want to open it anyway?</source> <source>Wrong key or database file is corrupt.</source> <translation>La contraseña es incorrecta o el archivo de la base de datos está dañado.</translation> </message> -</context> -<context> - <name>KeePass2Reader</name> <message> - <source>Not a KeePass database.</source> - <translation>No es una base de datos KeePass.</translation> + <source>Key transformation failed</source> + <translation type="unfinished"/> </message> <message> - <source>Unsupported KeePass database version.</source> - <translation>Versión de la base de datos KeePass no soportada.</translation> + <source>Invalid group field type number</source> + <translation type="unfinished"/> </message> <message> - <source>Wrong key or database file is corrupt.</source> - <translation>La contraseña es incorrecta o el archivo está dañado</translation> + <source>Invalid group field size</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>No se puede calcular la clave maestra</translation> + <source>Read group field data doesn't match size</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to issue challenge-response.</source> - <translation>No se pudo hacer el desafío/respuesta:</translation> + <source>Incorrect group id field size</source> + <translation type="unfinished"/> </message> <message> - <source>The selected file is an old KeePass 1 database (.kdb). - -You can import it by clicking on Database > 'Import KeePass 1 database...'. -This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> - <translation>El archivo seleccionado es una vieja base de datos de KeePass 1 (.kdb). - -Puede importarla haciendo clic en Base de datos > 'Importar base de datos KeePass 1...'. -Esta migración es en único sentido. No podrá abrir la base de datos importada con la vieja versión 0.4 de KeePassX.</translation> - </message> -</context> -<context> - <name>KeePass2Writer</name> - <message> - <source>Unable to issue challenge-response.</source> - <translation>No se pudo hacer el desafío/respuesta:</translation> + <source>Incorrect group creation time field size</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>No se puede calcular la clave maestra</translation> + <source>Incorrect group modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group access time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group level field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing group id or level</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing entry field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read entry field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry uuid field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field type</source> + <translation type="unfinished"/> </message> </context> <context> <name>Main</name> <message> - <source>Fatal error while testing the cryptographic functions.</source> - <translation>Error fatal comprobando las funciones criptográficas.</translation> - </message> - <message> - <source>KeePassXC - Error</source> - <translation>KeePassXC - Error</translation> + <source>Existing single-instance lock file is invalid. Launching new instance.</source> + <translation>El archivo de bloqueo de instancia única existente no es válido. Lanzando nueva instancia.</translation> </message> <message> <source>The lock file could not be created. Single-instance mode disabled.</source> @@ -1351,64 +2416,32 @@ Esta migración es en único sentido. No podrá abrir la base de datos importada <translation>Otra instancia de KeePassXC ya se está ejecutando.</translation> </message> <message> - <source>Existing single-instance lock file is invalid. Launching new instance.</source> - <translation>El archivo de bloqueo de instancia única existente no es válido. Lanzando nueva instancia.</translation> + <source>Fatal error while testing the cryptographic functions.</source> + <translation>Error fatal comprobando las funciones criptográficas.</translation> + </message> + <message> + <source>KeePassXC - Error</source> + <translation>KeePassXC - Error</translation> </message> </context> <context> <name>MainWindow</name> <message> - <source>Open database</source> - <translation>Abrir base de datos</translation> - </message> - <message> - <source>Database settings</source> - <translation>Configuración de la base de datos</translation> - </message> - <message> - <source>Copy username to clipboard</source> - <translation>Copiar nombre de usuario al portapapeles</translation> - </message> - <message> - <source>Copy password to clipboard</source> - <translation>Copiar contraseña al portapapeles</translation> - </message> - <message> - <source>Settings</source> - <translation>Configuración</translation> - </message> - <message> - <source>Show toolbar</source> - <translation>Mostrar barra de herramientas</translation> - </message> - <message> - <source>read-only</source> - <translation>sólo lectura</translation> - </message> - <message> - <source>Toggle window</source> - <translation>Cambiar a ventana</translation> - </message> - <message> - <source>KeePass 2 Database</source> - <translation>Base de datos de KeePass 2</translation> - </message> - <message> - <source>All files</source> - <translation>Todos los archivos</translation> - </message> - <message> - <source>Save repaired database</source> - <translation>Guardar base de datos reparada</translation> - </message> - <message> - <source>Writing the database failed.</source> - <translation>Fallo al escribir la base de datos.</translation> + <source>&Database</source> + <translation>Base de &Datos</translation> </message> <message> <source>&Recent databases</source> <translation>Bases de datos &recientes</translation> </message> + <message> + <source>Import</source> + <translation>Importar</translation> + </message> + <message> + <source>&Help</source> + <translation>&Ayuda</translation> + </message> <message> <source>E&ntries</source> <translation>E&ntradas</translation> @@ -1417,13 +2450,17 @@ Esta migración es en único sentido. No podrá abrir la base de datos importada <source>Copy att&ribute to clipboard</source> <translation>Copiar at&ributo al portapapeles</translation> </message> + <message> + <source>Time-based one-time password</source> + <translation type="unfinished"/> + </message> <message> <source>&Groups</source> <translation>&Grupos</translation> </message> <message> - <source>&View</source> - <translation>&Ver</translation> + <source>&Tools</source> + <translation>&Herramientas</translation> </message> <message> <source>&Quit</source> @@ -1433,6 +2470,10 @@ Esta migración es en único sentido. No podrá abrir la base de datos importada <source>&About</source> <translation>&Acerca de</translation> </message> + <message> + <source>&Open database...</source> + <translation>&Abrir base de datos...</translation> + </message> <message> <source>&Save database</source> <translation>&Guardar base de datos</translation> @@ -1473,26 +2514,26 @@ Esta migración es en único sentido. No podrá abrir la base de datos importada <source>&Delete group</source> <translation>&Eliminar grupo</translation> </message> + <message> + <source>Sa&ve database as...</source> + <translation>&Guardar base de datos como...</translation> + </message> + <message> + <source>Change &master key...</source> + <translation>Cambiar la clave &maestra...</translation> + </message> <message> <source>&Database settings</source> <translation>Configuración de la base de &datos</translation> </message> + <message> + <source>Database settings</source> + <translation>Configuración de la base de datos</translation> + </message> <message> <source>&Clone entry</source> <translation>&Clonar entrada</translation> </message> - <message> - <source>Timed one-time password</source> - <translation>Contraseña programada de único uso</translation> - </message> - <message> - <source>Copy &TOTP</source> - <translation>Copiar &TOTP</translation> - </message> - <message> - <source>Show TOTP</source> - <translation>Mostrar TOTP</translation> - </message> <message> <source>&Find</source> <translation>&Buscar</translation> @@ -1501,14 +2542,26 @@ Esta migración es en único sentido. No podrá abrir la base de datos importada <source>Copy &username</source> <translation>Copiar nombre de &usuario</translation> </message> + <message> + <source>Copy username to clipboard</source> + <translation>Copiar nombre de usuario al portapapeles</translation> + </message> <message> <source>Cop&y password</source> <translation>Cop&iar contraseña</translation> </message> + <message> + <source>Copy password to clipboard</source> + <translation>Copiar contraseña al portapapeles</translation> + </message> <message> <source>&Settings</source> <translation>&Configuración</translation> </message> + <message> + <source>Password Generator</source> + <translation>Generador de contraseñas</translation> + </message> <message> <source>&Perform Auto-Type</source> <translation>Realizar Auto-&Escritura</translation> @@ -1525,65 +2578,25 @@ Esta migración es en único sentido. No podrá abrir la base de datos importada <source>&Title</source> <translation>&Título</translation> </message> + <message> + <source>Copy title to clipboard</source> + <translation type="unfinished"/> + </message> <message> <source>&URL</source> <translation>&URL</translation> </message> + <message> + <source>Copy URL to clipboard</source> + <translation type="unfinished"/> + </message> <message> <source>&Notes</source> <translation>&Notas</translation> </message> <message> - <source>Password Generator</source> - <translation>Generador de contraseñas</translation> - </message> - <message> - <source>Clear history</source> - <translation>Limpiar historial</translation> - </message> - <message> - <source>&Database</source> - <translation>Base de &Datos</translation> - </message> - <message> - <source>Import</source> - <translation>Importar</translation> - </message> - <message> - <source>&Tools</source> - <translation>&Herramientas</translation> - </message> - <message> - <source>Empty recycle bin</source> - <translation>Vaciar papelera de reciclaje</translation> - </message> - <message> - <source>Access error for config file %1</source> - <translation>Error de acceso al archivo de configuración %1</translation> - </message> - <message> - <source>Quit KeePassXC</source> - <translation>Salir de KeePassXC</translation> - </message> - <message> - <source>Please touch the button on your YubiKey!</source> - <translation>Por favor presione el botón en su YubiKey!</translation> - </message> - <message> - <source>&Help</source> - <translation>&Ayuda</translation> - </message> - <message> - <source>&Open database...</source> - <translation>&Abrir base de datos...</translation> - </message> - <message> - <source>Sa&ve database as...</source> - <translation>&Guardar base de datos como...</translation> - </message> - <message> - <source>Change &master key...</source> - <translation>Cambiar la clave &maestra...</translation> + <source>Copy notes to clipboard</source> + <translation type="unfinished"/> </message> <message> <source>&Export to CSV file...</source> @@ -1601,10 +2614,169 @@ Esta migración es en único sentido. No podrá abrir la base de datos importada <source>Re&pair database...</source> <translation>&Reparar base de datos...</translation> </message> + <message> + <source>Show TOTP</source> + <translation>Mostrar TOTP</translation> + </message> <message> <source>Set up TOTP...</source> <translation>Configurar TOTP...</translation> </message> + <message> + <source>Copy &TOTP</source> + <translation>Copiar &TOTP</translation> + </message> + <message> + <source>E&mpty recycle bin</source> + <translation type="unfinished"/> + </message> + <message> + <source>Clear history</source> + <translation>Limpiar historial</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation>Error de acceso al archivo de configuración %1</translation> + </message> + <message> + <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> + <translation type="unfinished"/> + </message> + <message> + <source>read-only</source> + <translation>sólo lectura</translation> + </message> + <message> + <source>Settings</source> + <translation>Configuración</translation> + </message> + <message> + <source>Toggle window</source> + <translation>Cambiar a ventana</translation> + </message> + <message> + <source>Quit KeePassXC</source> + <translation>Salir de KeePassXC</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>Base de datos de KeePass 2</translation> + </message> + <message> + <source>All files</source> + <translation>Todos los archivos</translation> + </message> + <message> + <source>Open database</source> + <translation>Abrir base de datos</translation> + </message> + <message> + <source>Save repaired database</source> + <translation>Guardar base de datos reparada</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>Fallo al escribir la base de datos.</translation> + </message> + <message> + <source>Please touch the button on your YubiKey!</source> + <translation>Por favor presione el botón en su YubiKey!</translation> + </message> +</context> +<context> + <name>OpenSSHKey</name> + <message> + <source>Invalid key file, expecting an OpenSSH key</source> + <translation type="unfinished"/> + </message> + <message> + <source>PEM boundary mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>This is not an OpenSSH key, only modern keys are supported</source> + <translation type="unfinished"/> + </message> + <message> + <source>Base64 decoding failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file way too small.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file magic header id invalid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Found zero keys</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to read public key.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Corrupted key file, reading private key failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>No private key payload to decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Trying to run KDF without cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Passphrase is required to decrypt this key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key derivation failed, key file corrupted?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Decryption failed, wrong passphrase?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write public key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write private key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing private key</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OptionDialog</name> @@ -1612,22 +2784,63 @@ Esta migración es en único sentido. No podrá abrir la base de datos importada <source>Dialog</source> <translation>Cuadro de diálogo</translation> </message> + <message> + <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation>Esto se requiere para acceder a sus bases de datos desde ChromeIPass o PassIFox</translation> + </message> + <message> + <source>Enable KeePassHTTP server</source> + <translation>Habilitar el servidor de KeePassHTTP</translation> + </message> <message> <source>General</source> <translation>General</translation> </message> <message> <source>Sh&ow a notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> <translation>M&ostrar una notificación cuando se pidan credenciales</translation> </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>Sólo devolver los resultados similares para una URL específica en vez de todas las entradas para todo el dominio.</translation> + </message> + <message> + <source>&Return only best matching entries</source> + <translation>&Devolver sólo las entradas más relevantes</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Solicitar el desblo&queo de la base de datos si se encuentra bloqueada</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> + <translation>Sólo se devuelven las entradas con el mismo esquema (http://, https://, ftp://, ...)</translation> + </message> + <message> + <source>&Match URL schemes</source> + <translation>&Validar los esquemas de las URL</translation> + </message> <message> <source>Sort matching entries by &username</source> <translation>Ordenar entradas por nombre de &usuario</translation> </message> + <message> + <source>Sort &matching entries by title</source> + <translation>Ordenar entradas por &título</translation> + </message> + <message> + <source>R&emove all shared encryption keys from active database</source> + <translation>&Eliminar todas las claves de cifrado compartidas de la base de datos activa</translation> + </message> <message> <source>Re&move all stored permissions from entries in active database</source> <translation>Eli&minar todos los permisos guardados de las entradas de la base de datos activa</translation> </message> + <message> + <source>Password Generator</source> + <translation>Generador de contraseñas</translation> + </message> <message> <source>Advanced</source> <translation>Avanzado</translation> @@ -1640,10 +2853,22 @@ Esta migración es en único sentido. No podrá abrir la base de datos importada <source>Always allow &updating entries</source> <translation>Siempre permitir act&ualizaciones de las entradas</translation> </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>Sólo las bases de datos seleccionadas se conectaran con el cliente.</translation> + </message> <message> <source>Searc&h in all opened databases for matching entries</source> <translation>Busca&r entradas que coincidan en todas las bases de datos abiertas</translation> </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>No se permite crear o actualizar campos de caracteres automáticamente.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>Mostra&r campos de caracteres avanzados que comiencen con "KPH: "</translation> + </message> <message> <source>HTTP Port:</source> <translation>Puerto HTTP:</translation> @@ -1652,18 +2877,18 @@ Esta migración es en único sentido. No podrá abrir la base de datos importada <source>Default port: 19455</source> <translation>Puerto por defecto: 19455</translation> </message> - <message> - <source>Re&quest to unlock the database if it is locked</source> - <translation>Solicitar el desblo&queo de la base de datos si se encuentra bloqueada</translation> - </message> - <message> - <source>Sort &matching entries by title</source> - <translation>Ordenar entradas por &título</translation> - </message> <message> <source>KeePassXC will listen to this port on 127.0.0.1</source> <translation>KeePassXC escuchará por este puerto en 127.0.0.1</translation> </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation><b>Advertencia:</b> Las siguientes opciones pueden ser peligrosas.</translation> + </message> + <message> + <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> + <translation type="unfinished"/> + </message> <message> <source>Cannot bind to privileged ports</source> <translation>No se puede asociar a puertos con privilegios</translation> @@ -1674,63 +2899,30 @@ Using default port 19455.</source> <translation>¡No se puede asociar a puertos con privilegios debajo de 1024! Usando el puerto por defecto 19455</translation> </message> - <message> - <source>R&emove all shared encryption keys from active database</source> - <translation>&Eliminar todas las claves de cifrado compartidas de la base de datos activa</translation> - </message> - <message> - <source>&Return advanced string fields which start with "KPH: "</source> - <translation>Mostra&r campos de caracteres avanzados que comiencen con "KPH: "</translation> - </message> - <message> - <source>Automatically creating or updating string fields is not supported.</source> - <translation>No se permite crear o actualizar campos de caracteres automáticamente.</translation> - </message> - <message> - <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> - <translation>Esto se requiere para acceder a sus bases de datos desde ChromeIPass o PassIFox</translation> - </message> - <message> - <source>Enable KeePassHTTP server</source> - <translation>Habilitar el servidor de KeePassHTTP</translation> - </message> - <message> - <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation>Sólo devolver los resultados similares para una URL específica en vez de todas las entradas para todo el dominio.</translation> - </message> - <message> - <source>&Return only best matching entries</source> - <translation>&Devolver sólo las entradas más relevantes</translation> - </message> - <message> - <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation>Sólo se devuelven las entradas con el mismo esquema (http://, https://, ftp://, ...)</translation> - </message> - <message> - <source>&Match URL schemes</source> - <translation>&Validar los esquemas de las URL</translation> - </message> - <message> - <source>Password Generator</source> - <translation>Generador de contraseñas</translation> - </message> - <message> - <source>Only the selected database has to be connected with a client.</source> - <translation>Sólo las bases de datos seleccionadas se conectaran con el cliente.</translation> - </message> - <message> - <source>The following options can be dangerous! -Change them only if you know what you are doing.</source> - <translation>¡Las siguientes opciones son peligrosas! -Cámbielas sólo si sabe lo que está haciendo.</translation> - </message> </context> <context> <name>PasswordGeneratorWidget</name> + <message> + <source>%p%</source> + <translation>%p%</translation> + </message> <message> <source>Password:</source> <translation>Contraseña:</translation> </message> + <message> + <source>strength</source> + <comment>Password strength</comment> + <translation>seguridad</translation> + </message> + <message> + <source>entropy</source> + <translation>entropía</translation> + </message> + <message> + <source>Password</source> + <translation>Contraseña</translation> + </message> <message> <source>Character Types</source> <translation>Tipos de caracteres</translation> @@ -1749,40 +2941,52 @@ Cámbielas sólo si sabe lo que está haciendo.</translation> </message> <message> <source>Special Characters</source> - <translation>Caracteres especiales:</translation> + <translation>Caracteres especiales</translation> + </message> + <message> + <source>Extended ASCII</source> + <translation>ASCII Extendido</translation> </message> <message> <source>Exclude look-alike characters</source> <translation>Excluir caracteres similares</translation> </message> <message> - <source>Accept</source> - <translation>Aceptar</translation> - </message> - <message> - <source>%p%</source> - <translation>%p%</translation> - </message> - <message> - <source>strength</source> - <translation>seguridad</translation> - </message> - <message> - <source>entropy</source> - <translation>entropía</translation> + <source>Pick characters from every group</source> + <translation>Elegir caracteres de todos los grupos</translation> </message> <message> <source>&Length:</source> <translation>&Longitud:</translation> </message> <message> - <source>Pick characters from every group</source> - <translation>Elegir caracteres de todos los grupos</translation> + <source>Passphrase</source> + <translation>Frase de contraseña</translation> + </message> + <message> + <source>Wordlist:</source> + <translation>Lista de palabras:</translation> + </message> + <message> + <source>Word Count:</source> + <translation>Cantidad de Palabras:</translation> + </message> + <message> + <source>Word Separator:</source> + <translation>Separador de Palabras:</translation> </message> <message> <source>Generate</source> <translation>Generar</translation> </message> + <message> + <source>Copy</source> + <translation>Copiar</translation> + </message> + <message> + <source>Accept</source> + <translation>Aceptar</translation> + </message> <message> <source>Close</source> <translation>Cerrar</translation> @@ -1801,51 +3005,270 @@ Cámbielas sólo si sabe lo que está haciendo.</translation> </message> <message> <source>Poor</source> + <comment>Password quality</comment> <translation>Pobre</translation> </message> <message> <source>Weak</source> + <comment>Password quality</comment> <translation>Débil</translation> </message> <message> <source>Good</source> + <comment>Password quality</comment> <translation>Buena</translation> </message> <message> <source>Excellent</source> + <comment>Password quality</comment> <translation>Excelente</translation> </message> - <message> - <source>Password</source> - <translation>Contraseña</translation> - </message> - <message> - <source>Extended ASCII</source> - <translation>ASCII Extendido</translation> - </message> - <message> - <source>Passphrase</source> - <translation>Frase de contraseña</translation> - </message> - <message> - <source>Wordlist:</source> - <translation>Lista de palabras:</translation> - </message> - <message> - <source>Word Count:</source> - <translation>Cantidad de Palabras:</translation> - </message> - <message> - <source>Word Separator:</source> - <translation>Separador de Palabras:</translation> - </message> - <message> - <source>Copy</source> - <translation>Copiar</translation> - </message> </context> <context> <name>QObject</name> + <message> + <source>Database not opened</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database hash not available</source> + <translation type="unfinished"/> + </message> + <message> + <source>Client public key not received</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot decrypt message</source> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout or cannot connect to KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>Action cancelled or denied</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC association failed, try again</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key change was not successful</source> + <translation type="unfinished"/> + </message> + <message> + <source>Encryption key is not recognized</source> + <translation type="unfinished"/> + </message> + <message> + <source>No saved databases found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect action</source> + <translation type="unfinished"/> + </message> + <message> + <source>Empty message received</source> + <translation type="unfinished"/> + </message> + <message> + <source>No URL provided</source> + <translation type="unfinished"/> + </message> + <message> + <source>No logins found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown error</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add a new entry to a database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>Ruta a la base de datos.</translation> + </message> + <message> + <source>Key file of the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>path</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>username</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Prompt for the entry's password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a password for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length for the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to add.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy an entry's password to the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to clip.</source> + <comment>clip = copy to clipboard</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout in seconds before clearing the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Edit an entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Title for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>title</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to edit.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Estimate the entropy of a password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password for which to estimate the entropy.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Perform advanced analysis on the password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Extract and print the content of a database.</source> + <translation>Extraer e imprimir el contenido de la base de datos.</translation> + </message> + <message> + <source>Path of the database to extract.</source> + <translation>Ruta a la base de datos a extraer.</translation> + </message> + <message> + <source>Insert password to unlock %1: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to load key file %1 : %2</source> + <translation type="unfinished"/> + </message> + <message> + <source>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source> + +Available commands: +</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the command to execute.</source> + <translation>Nombre del comando a ejecutar.</translation> + </message> + <message> + <source>List database entries.</source> + <translation>Listar las entradas de la base de datos.</translation> + </message> + <message> + <source>Path of the group to list. Default is /</source> + <translation>Ruta del grupo a listar. Por defecto es /</translation> + </message> + <message> + <source>Find entries quickly.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Search term.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Merge two databases.</source> + <translation>Mezclar dos bases de datos.</translation> + </message> + <message> + <source>Path of the database to merge into.</source> + <translation>Ruta de la base de datos resultado de la mezcla.</translation> + </message> + <message> + <source>Path of the database to merge from.</source> + <translation>Ruta de la base de datos de inicio de la mezcla.</translation> + </message> + <message> + <source>Use the same credentials for both database files.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file of the database to merge from.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show an entry's information.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> + <translation type="unfinished"/> + </message> + <message> + <source>attribute</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the entry to show.</source> + <translation>Nombre de la entrada para mostrar.</translation> + </message> <message> <source>NULL device</source> <translation>Dispositivo NULL</translation> @@ -1869,8 +3292,28 @@ Cámbielas sólo si sabe lo que está haciendo.</translation> <translation>comilla de cierre faltante</translation> </message> <message> - <source>INTERNAL - unget lower bound exceeded</source> - <translation>INTERNO - unget límite excedido</translation> + <source>AES: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Twofish: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>ChaCha20: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Argon2 (KDBX 4 – recommended)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 4)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 3.1)</source> + <translation type="unfinished"/> </message> <message> <source>Group</source> @@ -1888,14 +3331,22 @@ Cámbielas sólo si sabe lo que está haciendo.</translation> <source>Password</source> <translation>Contraseña</translation> </message> - <message> - <source>URL</source> - <translation>URL</translation> - </message> <message> <source>Notes</source> <translation>Notas</translation> </message> + <message> + <source>Last Modified</source> + <translation type="unfinished"/> + </message> + <message> + <source>Created</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy Browser Integration</source> + <translation type="unfinished"/> + </message> <message> <source>Browser Integration</source> <translation>Integración con Navegadores</translation> @@ -1912,6 +3363,10 @@ Cámbielas sólo si sabe lo que está haciendo.</translation> <source>Passive</source> <translation>Pasivo</translation> </message> + <message> + <source>SSH Agent</source> + <translation type="unfinished"/> + </message> </context> <context> <name>QtIOCompressor</name> @@ -1950,8 +3405,8 @@ Cámbielas sólo si sabe lo que está haciendo.</translation> <context> <name>SearchWidget</name> <message> - <source>Case Sensitive</source> - <translation>Distinguir mayúsculas/minúsculas</translation> + <source>Search...</source> + <translation>Buscar...</translation> </message> <message> <source>Search</source> @@ -1962,8 +3417,8 @@ Cámbielas sólo si sabe lo que está haciendo.</translation> <translation>Limpiar</translation> </message> <message> - <source>Search...</source> - <translation>Buscar...</translation> + <source>Case Sensitive</source> + <translation>Distinguir mayúsculas/minúsculas</translation> </message> <message> <source>Limit search to selected group</source> @@ -1972,50 +3427,6 @@ Cámbielas sólo si sabe lo que está haciendo.</translation> </context> <context> <name>Service</name> - <message> - <source>A shared encryption-key with the name "%1" already exists. -Do you want to overwrite it?</source> - <translation>Ya existe una clave de cifrado con el nombre %1. -¿Desea sobrescribirla?</translation> - </message> - <message> - <source>Do you want to update the information in %1 - %2?</source> - <translation>¿Desea actualizar la información en %1 - %2?</translation> - </message> - <message> - <source>The active database is locked! -Please unlock the selected database or choose another one which is unlocked.</source> - <translation>¡La base de datos activa está bloqueada! -Por favor desbloquee la base de datos seleccionada o elija otra que esté desbloqueada.</translation> - </message> - <message> - <source>Successfully removed %1 encryption-%2 from KeePassX/Http Settings.</source> - <translation>Se eliminó con éxito %1 %2 de cifrado de la configuración de KeePassX/Http.</translation> - </message> - <message> - <source>No shared encryption-keys found in KeePassHttp Settings.</source> - <translation>No se encontraron claves de cifrado en la configuración de KeePassHttp.</translation> - </message> - <message> - <source>The active database does not contain an entry of KeePassHttp Settings.</source> - <translation>La base de datos activa no contiene una entrada de configuración de KeePassHttp.</translation> - </message> - <message> - <source>Removing stored permissions...</source> - <translation>Eliminando los permisos guardados...</translation> - </message> - <message> - <source>Abort</source> - <translation>Abortar</translation> - </message> - <message> - <source>Successfully removed permissions from %1 %2.</source> - <translation>Los permisos de %1 %2 fueron eliminados exitosamente.</translation> - </message> - <message> - <source>The active database does not contain an entry with permissions.</source> - <translation>La base de datos activa no contiene una entrada con permisos.</translation> - </message> <message> <source>KeePassXC: New key association request</source> <translation>KeePassXC: Solicitud de asociación de nueva clave</translation> @@ -2032,34 +3443,78 @@ asigne un nombre único para identificarla y acepte.</translation> <source>KeePassXC: Overwrite existing key?</source> <translation>KeePassXC: ¿Sobrescribir clave existente?</translation> </message> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>Ya existe una clave de cifrado con el nombre %1. +¿Desea sobrescribirla?</translation> + </message> <message> <source>KeePassXC: Update Entry</source> <translation>KeePassXC: Actualizar entrada</translation> </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>¿Desea actualizar la información en %1 - %2?</translation> + </message> <message> <source>KeePassXC: Database locked!</source> <translation>KeePassXC: ¡Base de datos bloqueada!</translation> </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>¡La base de datos activa está bloqueada! +Por favor desbloquee la base de datos seleccionada o elija otra que esté desbloqueada.</translation> + </message> <message> <source>KeePassXC: Removed keys from database</source> <translation>KeePassXC: Las claves se eliminaron de la base de datos</translation> </message> + <message numerus="yes"> + <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No keys found</source> <translation>KeePassXC: No se encontró ninguna clave</translation> </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation>No se encontraron claves de cifrado en la configuración de KeePassHttp.</translation> + </message> <message> <source>KeePassXC: Settings not available!</source> <translation>KeePassXC: ¡Configuraciones no disponibles!</translation> </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation>La base de datos activa no contiene una entrada de configuración de KeePassHttp.</translation> + </message> + <message> + <source>Removing stored permissions...</source> + <translation>Eliminando los permisos guardados...</translation> + </message> + <message> + <source>Abort</source> + <translation>Abortar</translation> + </message> <message> <source>KeePassXC: Removed permissions</source> <translation>KeePassXC: Permisos eliminados</translation> </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entries.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No entry with permissions found!</source> <translation>KeePassXC: ¡No se encontró ninguna entrada con permisos!</translation> </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>La base de datos activa no contiene una entrada con permisos.</translation> + </message> </context> <context> <name>SettingsWidget</name> @@ -2082,10 +3537,26 @@ asigne un nombre único para identificarla y acepte.</translation> </context> <context> <name>SettingsWidgetGeneral</name> + <message> + <source>Basic Settings</source> + <translation>Configuraciones Básicas</translation> + </message> + <message> + <source>Start only a single instance of KeePassXC</source> + <translation>Inicie sólo una instancia de KeePassXC</translation> + </message> <message> <source>Remember last databases</source> <translation>Recordar última base de datos</translation> </message> + <message> + <source>Remember last key files and security dongles</source> + <translation>Recordar los últimos archivos de llaves y el dongle de seguridad</translation> + </message> + <message> + <source>Load previous databases on startup</source> + <translation>Abrir base de datos anterior al inicio</translation> + </message> <message> <source>Automatically save on exit</source> <translation>Guardar automáticamente al salir</translation> @@ -2094,21 +3565,29 @@ asigne un nombre único para identificarla y acepte.</translation> <source>Automatically save after every change</source> <translation>Guardar automáticamente después de cada cambio</translation> </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation>Recargar automáticamente la base de datos cuando sea modificada externamente</translation> + </message> <message> <source>Minimize when copying to clipboard</source> <translation>Minimizar al copiar al portapapeles</translation> </message> + <message> + <source>Minimize window at application startup</source> + <translation>Minimizar la ventana al iniciar</translation> + </message> <message> <source>Use group icon on entry creation</source> <translation>Usar icono del grupo en la creación de entrada</translation> </message> <message> - <source>Global Auto-Type shortcut</source> - <translation>Atajo global de Auto-Escritura</translation> + <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> + <translation>No marcar la base de datos como modificada cuando los cambios no afecten a los datos (ej. expandir grupos)</translation> </message> <message> - <source>Language</source> - <translation>Idioma</translation> + <source>Hide the Details view</source> + <translation type="unfinished"/> </message> <message> <source>Show a system tray icon</source> @@ -2118,67 +3597,61 @@ asigne un nombre único para identificarla y acepte.</translation> <source>Hide window to system tray when minimized</source> <translation>Ocultar la ventana a la bandeja del sistema cuando se minimiza</translation> </message> - <message> - <source>Load previous databases on startup</source> - <translation>Abrir base de datos anterior al inicio</translation> - </message> - <message> - <source>Automatically reload the database when modified externally</source> - <translation>Recargar automáticamente la base de datos cuando sea modificada externamente</translation> - </message> <message> <source>Hide window to system tray instead of app exit</source> <translation>Ocultar la ventana a la bandeja del sistema en vez de cerrar</translation> </message> <message> - <source>Minimize window at application startup</source> - <translation>Minimizar la ventana al iniciar</translation> + <source>Dark system tray icon</source> + <translation type="unfinished"/> </message> <message> - <source>Basic Settings</source> - <translation>Configuraciones Básicas</translation> - </message> - <message> - <source>Remember last key files and security dongles</source> - <translation>Recordar los últimos archivos de llaves y el dongle de seguridad</translation> - </message> - <message> - <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> - <translation>No marcar la base de datos como modificada cuando los cambios no afecten a los datos (ej. expandir grupos)</translation> + <source>Language</source> + <translation>Idioma</translation> </message> <message> <source>Auto-Type</source> <translation>Auto-Escritura</translation> </message> <message> - <source>Use entry title and URL to match windows for global Auto-Type</source> - <translation>Usar URL y título de la entrada para igualar ventanas para Auto-Escritura global</translation> + <source>Use entry title to match windows for global Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use entry URL to match windows for global Auto-Type</source> + <translation type="unfinished"/> </message> <message> <source>Always ask before performing Auto-Type</source> <translation>Siempre preguntar antes de hacer Auto-Escritura</translation> </message> + <message> + <source>Global Auto-Type shortcut</source> + <translation>Atajo global de Auto-Escritura</translation> + </message> <message> <source>Auto-Type delay</source> <translation>Retardo de Auto-Escritura</translation> </message> <message> <source> ms</source> + <comment>Milliseconds</comment> <translation>Micro segundo</translation> </message> - <message> - <source>Start only a single instance of KeePassXC</source> - <translation>Inicie sólo una instancia de KeePassXC</translation> - </message> </context> <context> <name>SettingsWidgetSecurity</name> + <message> + <source>Timeouts</source> + <translation>Intervalos</translation> + </message> <message> <source>Clear clipboard after</source> <translation>Limpiar el portapapeles después de</translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation>segundos</translation> </message> <message> @@ -2186,8 +3659,12 @@ asigne un nombre único para identificarla y acepte.</translation> <translation>Bloquear base de datos tras un periodo de inactividad de</translation> </message> <message> - <source>Show passwords in cleartext by default</source> - <translation>Mostrar contraseñas en texto claro por defecto</translation> + <source>Convenience</source> + <translation>Conveniencia</translation> + </message> + <message> + <source>Lock databases when session is locked or lid is closed</source> + <translation>Bloquear base de datos cuando la sesión está bloqueada o la pantalla esté cerrada</translation> </message> <message> <source>Lock databases after minimizing the window</source> @@ -2198,16 +3675,16 @@ asigne un nombre único para identificarla y acepte.</translation> <translation>No pedir repetición de la contraseña cuando está visible</translation> </message> <message> - <source>Timeouts</source> - <translation>Intervalos</translation> + <source>Show passwords in cleartext by default</source> + <translation>Mostrar contraseñas en texto claro por defecto</translation> </message> <message> - <source>Convenience</source> - <translation>Conveniencia</translation> + <source>Hide passwords in the preview panel</source> + <translation type="unfinished"/> </message> <message> - <source>Lock databases when session is locked or lid is closed</source> - <translation>Bloquear base de datos cuando la sesión está bloqueada o la pantalla esté cerrada</translation> + <source>Hide entry notes by default</source> + <translation type="unfinished"/> </message> <message> <source>Privacy</source> @@ -2228,6 +3705,14 @@ asigne un nombre único para identificarla y acepte.</translation> <source>Key:</source> <translation>Clave:</translation> </message> + <message> + <source>Default RFC 6238 token settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Steam token settings</source> + <translation type="unfinished"/> + </message> <message> <source>Use custom settings</source> <translation>Usar configuración personalizada</translation> @@ -2254,6 +3739,7 @@ asigne un nombre único para identificarla y acepte.</translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation>segundos</translation> </message> </context> @@ -2320,6 +3806,26 @@ asigne un nombre único para identificarla y acepte.</translation> </context> <context> <name>main</name> + <message> + <source>Remove an entry from the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>Ruta a la base de datos.</translation> + </message> + <message> + <source>Path of the entry to remove.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation>KeePassXC - gestor de claves multiplataforma</translation> + </message> + <message> + <source>filenames of the password databases to open (*.kdbx)</source> + <translation>nombre de archivo de la base de datos de contraseñas a abrir (*.kdbx)</translation> + </message> <message> <source>path to a custom config file</source> <translation>ruta a un archivo de configuración personalizado</translation> @@ -2328,81 +3834,13 @@ asigne un nombre único para identificarla y acepte.</translation> <source>key file of the database</source> <translation>archivo llave de la base de datos</translation> </message> - <message> - <source>KeePassXC - cross-platform password manager</source> - <translation>KeePassXC - gestor de claves multiplataforma</translation> - </message> <message> <source>read password of the database from stdin</source> <translation>leer contraseña de la base de datos desde la entrada estándar</translation> </message> <message> - <source>filenames of the password databases to open (*.kdbx)</source> - <translation>nombre de archivo de la base de datos de contraseñas a abrir (*.kdbx)</translation> - </message> - <message> - <source>Copy a password to the clipboard</source> - <translation>Copiar contraseña al portapapeles</translation> - </message> - <message> - <source>Path of the database.</source> - <translation>Ruta a la base de datos.</translation> - </message> - <message> - <source>Use a GUI prompt unlocking the database.</source> - <translation>Usar una ventana de diálogo para desbloquear la base de datos.</translation> - </message> - <message> - <source>Name of the entry to clip.</source> - <translation>Nombre de la entrada para cortar.</translation> - </message> - <message> - <source>Extract and print the content of a database.</source> - <translation>Extraer e imprimir el contenido de la base de datos.</translation> - </message> - <message> - <source>Path of the database to extract.</source> - <translation>Ruta a la base de datos a extraer.</translation> - </message> - <message> - <source>Name of the command to execute.</source> - <translation>Nombre del comando a ejecutar.</translation> - </message> - <message> - <source>List database entries.</source> - <translation>Listar las entradas de la base de datos.</translation> - </message> - <message> - <source>Path of the group to list. Default is /</source> - <translation>Ruta del grupo a listar. Por defecto es /</translation> - </message> - <message> - <source>Print the UUIDs of the entries and groups.</source> - <translation> Imprimir los UUIDs de las entradas y grupos.</translation> - </message> - <message> - <source>Merge two databases.</source> - <translation>Mezclar dos bases de datos.</translation> - </message> - <message> - <source>Path of the database to merge into.</source> - <translation>Ruta de la base de datos resultado de la mezcla.</translation> - </message> - <message> - <source>Path of the database to merge from.</source> - <translation>Ruta de la base de datos de inicio de la mezcla.</translation> - </message> - <message> - <source>Use the same password for both database files.</source> - <translation>Usar la misma contraseña para ambas bases de datos.</translation> - </message> - <message> - <source>Show a password.</source> - <translation>Mostrar contraseña.</translation> - </message> - <message> - <source>Name of the entry to show.</source> - <translation>Nombre de la entrada para mostrar.</translation> + <source>Parent window handle</source> + <translation type="unfinished"/> </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_eu.ts b/share/translations/keepassx_eu.ts index ffbb4a9a5..7d7dbd32d 100644 --- a/share/translations/keepassx_eu.ts +++ b/share/translations/keepassx_eu.ts @@ -10,11 +10,31 @@ <translation>Honi buruz</translation> </message> <message> - <source>Contributors</source> + <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> + <translation>Akatsen berri eman hemen: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> + </message> + <message> + <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> <translation type="unfinished"/> </message> + <message> + <source>Project Maintainers:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Contributors</source> + <translation>Lankideak</translation> + </message> + <message> + <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Ikusi ekarpenak GitHub-en</a></translation> + </message> <message> <source>Debug Info</source> + <translation>Arazketa informazioa</translation> + </message> + <message> + <source>Include the following information whenever you report a bug:</source> <translation type="unfinished"/> </message> <message> @@ -29,7 +49,11 @@ </message> <message> <source>Revision: %1</source> - <translation type="unfinished"/> + <translation>Berrikuspena: %1</translation> + </message> + <message> + <source>Distribution: %1</source> + <translation>Banaketa: %1</translation> </message> <message> <source>Libraries:</source> @@ -39,39 +63,21 @@ <source>Operating system: %1 CPU architecture: %2 Kernel: %3 %4</source> - <translation type="unfinished"/> + <translation>Sistema eragilea: %1 +CPU arkitektura: %2 +Kernel: %3 %4</translation> </message> <message> <source>Enabled extensions:</source> <translation>Gaitutako hedapenak:</translation> </message> - <message> - <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> - <translation type="unfinished"/> - </message> - <message> - <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Project Maintainers:</source> - <translation type="unfinished"/> - </message> - <message> - <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Ikusi ekarpenak GitHub-en</a></translation> - </message> - <message> - <source>Include the following information whenever you report a bug:</source> - <translation type="unfinished"/> - </message> - <message> - <source>Distribution: %1</source> - <translation type="unfinished"/> - </message> </context> <context> <name>AccessControlDialog</name> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation type="unfinished"/> + </message> <message> <source>Remember this decision</source> <translation>Gogoratu erabaki hau</translation> @@ -89,8 +95,11 @@ Kernel: %3 %4</source> Please select whether you want to allow access.</source> <translation type="unfinished"/> </message> +</context> +<context> + <name>AgentSettingsWidget</name> <message> - <source>KeePassXC HTTP Confirm Access</source> + <source>Enable SSH Agent (requires restart)</source> <translation type="unfinished"/> </message> </context> @@ -104,6 +113,26 @@ Please select whether you want to allow access.</source> <source>Auto-Type - KeePassXC</source> <translation type="unfinished"/> </message> + <message> + <source>Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>The Syntax of your Auto-Type statement is incorrect!</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> </context> <context> <name>AutoTypeAssociationsModel</name> @@ -123,11 +152,286 @@ Please select whether you want to allow access.</source> <context> <name>AutoTypeSelectDialog</name> <message> - <source>Select entry to Auto-Type:</source> + <source>Auto-Type - KeePassXC</source> <translation type="unfinished"/> </message> <message> - <source>Auto-Type - KeePassXC</source> + <source>Select entry to Auto-Type:</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>BrowserAccessControlDialog</name> + <message> + <source>KeePassXC-Browser Confirm Access</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remember this decision</source> + <translation>Gogoratu erabaki hau</translation> + </message> + <message> + <source>Allow</source> + <translation>Onartu</translation> + </message> + <message> + <source>Deny</source> + <translation>Debekatu</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>BrowserOptionDialog</name> + <message> + <source>Dialog</source> + <translation>Elkarrizketa</translation> + </message> + <message> + <source>This is required for accessing your databases with KeePassXC-Browser</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable KeepassXC browser integration</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>Orokorra</translation> + </message> + <message> + <source>Enable integration for these browsers:</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Google Chrome</source> + <translation>&Google Chrome</translation> + </message> + <message> + <source>&Firefox</source> + <translation>&Firefox</translation> + </message> + <message> + <source>&Chromium</source> + <translation>&Chromium</translation> + </message> + <message> + <source>&Vivaldi</source> + <translation>&Vivaldi</translation> + </message> + <message> + <source>Show a &notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Match URL scheme (e.g., https://...)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return only best-matching credentials</source> + <translation type="unfinished"/> + </message> + <message> + <source>Sort &matching credentials by title</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Sort matching credentials by &username</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>&Disconnect all browsers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Forget all remembered &permissions</source> + <translation type="unfinished"/> + </message> + <message> + <source>Advanced</source> + <translation>Aurreratua</translation> + </message> + <message> + <source>Never &ask before accessing credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Never ask before &updating credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searc&h in all opened databases for matching credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation type="unfinished"/> + </message> + <message> + <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Update &native messaging manifest files at startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Support a proxy application between KeePassXC and browser extension.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &proxy application between KeePassXC and browser extension</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a custom proxy location if you installed a proxy manually.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &custom proxy location</source> + <comment>Meant is the proxy for KeePassXC-Browser</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Arakatu...</translation> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*.exe);;All Files (*.*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select custom proxy location</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>BrowserService</name> + <message> + <source>KeePassXC: New key association request</source> + <translation type="unfinished"/> + </message> + <message> + <source>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Save and allow access</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: Gainidatzi aurreko gakoa?</translation> + </message> + <message> + <source>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: Eguneratu sarrera</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation type="unfinished"/> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation type="unfinished"/> + </message> + <message> + <source>The active database does not contain a settings entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: Ez da gakorik aurkitu</translation> + </message> + <message> + <source>No shared encryption keys found in KeePassXC Settings.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Removing stored permissions…</source> + <translation>Gordetako baimenak kentzen...</translation> + </message> + <message> + <source>Abort</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: Kendutako baimenak</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entry(s).</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation type="unfinished"/> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> <translation type="unfinished"/> </message> </context> @@ -145,14 +449,26 @@ Please select whether you want to allow access.</source> <source>Repeat password:</source> <translation>Errepikatu pasahitza:</translation> </message> + <message> + <source>&Key file</source> + <translation>&Gako fitxategia</translation> + </message> <message> <source>Browse</source> - <translation type="unfinished"/> + <translation>Arakatu</translation> </message> <message> <source>Create</source> <translation>Sortu</translation> </message> + <message> + <source>Cha&llenge Response</source> + <translation type="unfinished"/> + </message> + <message> + <source>Refresh</source> + <translation>Freskatu</translation> + </message> <message> <source>Key files</source> <translation>Gako fitxategiak</translation> @@ -173,6 +489,10 @@ Please select whether you want to allow access.</source> <source>Select a key file</source> <translation>Aukeratu gako fitxategia</translation> </message> + <message> + <source>Empty password</source> + <translation>Hustu pasahitza</translation> + </message> <message> <source>Do you really want to use an empty string as password?</source> <translation>Kate hutsa pasahitz modura erabili?</translation> @@ -187,20 +507,15 @@ Please select whether you want to allow access.</source> <translation type="unfinished"/> </message> <message> - <source>&Key file</source> - <translation>&Gako fitxategia</translation> - </message> - <message> - <source>Cha&llenge Response</source> + <source>Legacy key file format</source> <translation type="unfinished"/> </message> <message> - <source>Refresh</source> - <translation>Freskatu</translation> - </message> - <message> - <source>Empty password</source> - <translation>Hustu pasahitza</translation> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -211,6 +526,10 @@ Please select whether you want to allow access.</source> <name>CloneDialog</name> <message> <source>Clone Options</source> + <translation>Klonatu aukerak</translation> + </message> + <message> + <source>Append ' - Clone' to title</source> <translation type="unfinished"/> </message> <message> @@ -221,10 +540,6 @@ Please select whether you want to allow access.</source> <source>Copy history</source> <translation>Kopiatu historia</translation> </message> - <message> - <source>Append ' - Clone' to title</source> - <translation type="unfinished"/> - </message> </context> <context> <name>CsvImportWidget</name> @@ -320,10 +635,6 @@ Please select whether you want to allow access.</source> </context> <context> <name>CsvImportWizard</name> - <message> - <source>Import CSV file</source> - <translation>Inportatu CSV fitxategia</translation> - </message> <message> <source>Error</source> <translation>Errorea</translation> @@ -335,17 +646,17 @@ Please select whether you want to allow access.</source> </context> <context> <name>CsvParserModel</name> - <message> - <source> byte, </source> - <translation>byte,</translation> + <message numerus="yes"> + <source>%n byte(s), </source> + <translation><numerusform>byte %n</numerusform><numerusform>%n byte</numerusform></translation> </message> - <message> - <source> rows, </source> - <translation>errenkada,</translation> + <message numerus="yes"> + <source>%n row(s), </source> + <translation><numerusform>lerro %n</numerusform><numerusform>%n lerro</numerusform></translation> </message> - <message> - <source> columns</source> - <translation>zutabe,</translation> + <message numerus="yes"> + <source>%n column(s)</source> + <translation><numerusform>zutabe %n</numerusform><numerusform>%n zutabe</numerusform></translation> </message> </context> <context> @@ -364,6 +675,14 @@ Please select whether you want to allow access.</source> </message> <message> <source>Browse</source> + <translation>Arakatu</translation> + </message> + <message> + <source>Refresh</source> + <translation>Freskatu</translation> + </message> + <message> + <source>Challenge Response:</source> <translation type="unfinished"/> </message> <message> @@ -374,6 +693,21 @@ Please select whether you want to allow access.</source> <source>Can't open key file</source> <translation>Ezin da gako fitxategia ireki</translation> </message> + <message> + <source>Legacy key file format</source> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't show this warning again</source> + <translation type="unfinished"/> + </message> <message> <source>All files</source> <translation>Fitxategi guztiak</translation> @@ -386,14 +720,6 @@ Please select whether you want to allow access.</source> <source>Select key file</source> <translation>Aukeratu gako-fitxategia</translation> </message> - <message> - <source>Refresh</source> - <translation>Freskatu</translation> - </message> - <message> - <source>Challenge Response:</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DatabaseRepairWidget</name> @@ -409,14 +735,14 @@ Please select whether you want to allow access.</source> <source>Can't open key file</source> <translation>Ezin da gako fitxategia ireki</translation> </message> - <message> - <source>Database opened fine. Nothing to do.</source> - <translation type="unfinished"/> - </message> <message> <source>Unable to open the database.</source> <translation>Ezin izan da datu-basea ireki.</translation> </message> + <message> + <source>Database opened fine. Nothing to do.</source> + <translation type="unfinished"/> + </message> <message> <source>Success</source> <translation type="unfinished"/> @@ -434,6 +760,102 @@ Gorde daiteke orain.</translation> </context> <context> <name>DatabaseSettingsWidget</name> + <message> + <source>General</source> + <translation>Orokorra</translation> + </message> + <message> + <source>Encryption</source> + <translation>Zifraketa</translation> + </message> + <message> + <source>Number of rounds too high</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Understood, keep number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cancel</source> + <translation>Utzi</translation> + </message> + <message> + <source>Number of rounds too low</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</source> + <translation type="unfinished"/> + </message> + <message> + <source>KDF unchanged</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetEncryption</name> + <message> + <source>Encryption Algorithm:</source> + <translation>Zifraketa algoritmoa</translation> + </message> + <message> + <source>AES: 256 Bit (default)</source> + <translation>AES: 256 Bit (lehenetsia)</translation> + </message> + <message> + <source>Twofish: 256 Bit</source> + <translation>Twofish: 256 Bit</translation> + </message> + <message> + <source>Key Derivation Function:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Transform rounds:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Benchmark 1-second delay</source> + <translation type="unfinished"/> + </message> + <message> + <source>Memory Usage:</source> + <translation>Memoria erabilera:</translation> + </message> + <message> + <source> MB</source> + <translation> MB</translation> + </message> + <message> + <source>Parallelism:</source> + <translation>Paralelismoa:</translation> + </message> + <message> + <source> thread</source> + <translation>haria</translation> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetGeneral</name> + <message> + <source>Database Meta Data</source> + <translation type="unfinished"/> + </message> <message> <source>Database name:</source> <translation>Datu-basearen izena:</translation> @@ -442,20 +864,12 @@ Gorde daiteke orain.</translation> <source>Database description:</source> <translation>Datu-basearen deskribapena:</translation> </message> - <message> - <source>Transform rounds:</source> - <translation type="unfinished"/> - </message> <message> <source>Default username:</source> <translation>Lehenetsitako erabiltzaile-izena:</translation> </message> <message> - <source> MiB</source> - <translation> MiB</translation> - </message> - <message> - <source>Benchmark</source> + <source>History Settings</source> <translation type="unfinished"/> </message> <message> @@ -466,27 +880,20 @@ Gorde daiteke orain.</translation> <source>Max. history size:</source> <translation type="unfinished"/> </message> + <message> + <source> MiB</source> + <translation> MiB</translation> + </message> <message> <source>Use recycle bin</source> <translation type="unfinished"/> </message> - <message> - <source>AES: 256 Bit (default)</source> - <translation>AES: 256 Bit (lehenetsia)</translation> - </message> - <message> - <source>Twofish: 256 Bit</source> - <translation>Twofish: 256 Bit</translation> - </message> - <message> - <source>Algorithm:</source> - <translation>Algoritmoa:</translation> - </message> </context> <context> <name>DatabaseTabWidget</name> <message> <source>Root</source> + <comment>Root group</comment> <translation type="unfinished"/> </message> <message> @@ -505,6 +912,30 @@ Gorde daiteke orain.</translation> <source>File not found!</source> <translation>Fitxategia ez da aurkitu!</translation> </message> + <message> + <source>Unable to open the database.</source> + <translation>Ezin izan da datu-basea ireki.</translation> + </message> + <message> + <source>File opened in read only mode.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Open CSV file</source> + <translation>Ireki CSV fitxategia</translation> + </message> + <message> + <source>CSV file</source> + <translation>CSV fitxategia</translation> + </message> + <message> + <source>All files (*)</source> + <translation>Fitxategi guztiak (*)</translation> + </message> + <message> + <source>Merge database</source> + <translation>Bateratu datu-basea</translation> + </message> <message> <source>Open KeePass 1 database</source> <translation>Ireki KeePass 1 datu-basea</translation> @@ -513,14 +944,15 @@ Gorde daiteke orain.</translation> <source>KeePass 1 database</source> <translation>KeePass 1 datu-basea</translation> </message> - <message> - <source>All files (*)</source> - <translation>Fitxategi guztiak (*)</translation> - </message> <message> <source>Close?</source> <translation>Itxi?</translation> </message> + <message> + <source>"%1" is in edit mode. +Discard changes and close anyway?</source> + <translation type="unfinished"/> + </message> <message> <source>Save changes?</source> <translation>Aldaketak gorde?</translation> @@ -534,10 +966,22 @@ Save changes?</source> <source>Writing the database failed.</source> <translation type="unfinished"/> </message> + <message> + <source>Passwords</source> + <translation>Pasahitzak</translation> + </message> <message> <source>Save database as</source> <translation>Gorde datu-basea honela</translation> </message> + <message> + <source>Export database to CSV file</source> + <translation>Esportatu datu-basea CSV fitxategira</translation> + </message> + <message> + <source>Writing the CSV file failed.</source> + <translation type="unfinished"/> + </message> <message> <source>New database</source> <translation>Datu-base berria</translation> @@ -555,76 +999,19 @@ Save changes?</source> Please press cancel to finish your changes or discard them.</source> <translation type="unfinished"/> </message> - <message> - <source>This database has never been saved. -You can save the database or stop locking it.</source> - <translation type="unfinished"/> - </message> <message> <source>This database has been modified. Do you want to save the database before locking it? Otherwise your changes are lost.</source> <translation type="unfinished"/> </message> - <message> - <source>"%1" is in edit mode. -Discard changes and close anyway?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Export database to CSV file</source> - <translation>Esportatu datu-basea CSV fitxategira</translation> - </message> - <message> - <source>CSV file</source> - <translation>CSV fitxategia</translation> - </message> - <message> - <source>Writing the CSV file failed.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unable to open the database.</source> - <translation>Ezin izan da datu-basea ireki.</translation> - </message> - <message> - <source>Merge database</source> - <translation>Bateratu datu-basea</translation> - </message> - <message> - <source>The database you are trying to save as is locked by another instance of KeePassXC. -Do you want to save it anyway?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Passwords</source> - <translation type="unfinished"/> - </message> - <message> - <source>Database already opened</source> - <translation type="unfinished"/> - </message> - <message> - <source>The database you are trying to open is locked by another instance of KeePassXC. - -Do you want to open it anyway?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Open read-only</source> - <translation type="unfinished"/> - </message> - <message> - <source>File opened in read only mode.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Open CSV file</source> - <translation>Ireki CSV fitxategia</translation> - </message> </context> <context> <name>DatabaseWidget</name> + <message> + <source>Searching...</source> + <translation>Bilatzen...</translation> + </message> <message> <source>Change master key</source> <translation>Aldatu gako nagusia</translation> @@ -645,13 +1032,33 @@ Do you want to open it anyway?</source> <source>Do you really want to delete %1 entries for good?</source> <translation type="unfinished"/> </message> + <message> + <source>Move entry to recycle bin?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to move entry "%1" to the recycle bin?</source> + <translation type="unfinished"/> + </message> <message> <source>Move entries to recycle bin?</source> <translation type="unfinished"/> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Ziur zaude sarrera %n zakarrontzira mugitu nahi duzula?</numerusform><numerusform>Ziur zaude %n sarrera zakarrontzira mugitu nahi dituzula?</numerusform></translation> + </message> + <message> + <source>Execute command?</source> + <translation>Exekutatu komandoa?</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation type="unfinished"/> + </message> + <message> + <source>Remember my choice</source> + <translation type="unfinished"/> </message> <message> <source>Delete group?</source> @@ -665,18 +1072,6 @@ Do you want to open it anyway?</source> <source>Unable to calculate master key</source> <translation>Ezin izan da gako nagusia kalkulatu</translation> </message> - <message> - <source>Move entry to recycle bin?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Searching...</source> - <translation>Bilatzen...</translation> - </message> <message> <source>No current database.</source> <translation type="unfinished"/> @@ -694,19 +1089,7 @@ Do you want to open it anyway?</source> <translation>Emaitzarik ez</translation> </message> <message> - <source>Execute command?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Do you really want to execute the following command?<br><br>%1<br></source> - <translation type="unfinished"/> - </message> - <message> - <source>Remember my choice</source> - <translation type="unfinished"/> - </message> - <message> - <source>Autoreload Request</source> + <source>File has changed</source> <translation type="unfinished"/> </message> <message> @@ -718,7 +1101,8 @@ Do you want to open it anyway?</source> <translation type="unfinished"/> </message> <message> - <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> + <source>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</source> <translation type="unfinished"/> </message> <message> @@ -734,6 +1118,89 @@ Do you want to open it anyway?</source> <translation type="unfinished"/> </message> </context> +<context> + <name>DetailsWidget</name> + <message> + <source>Generate TOTP Token</source> + <translation type="unfinished"/> + </message> + <message> + <source>Close</source> + <translation>Itxi</translation> + </message> + <message> + <source>General</source> + <translation>Orokorra</translation> + </message> + <message> + <source>Password</source> + <translation>Pasahitza</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Expiration</source> + <translation>Iraungitzea</translation> + </message> + <message> + <source>Username</source> + <translation>Erabiltzaile-izena</translation> + </message> + <message> + <source>Autotype</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searching</source> + <translation>Bilatzen</translation> + </message> + <message> + <source>Attributes</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation type="unfinished"/> + </message> + <message> + <source>Notes</source> + <translation>Oharrak</translation> + </message> + <message> + <source>Window</source> + <translation>Leihoa</translation> + </message> + <message> + <source>Sequence</source> + <translation>Sekuentzia</translation> + </message> + <message> + <source>Search</source> + <translation>Bilatu</translation> + </message> + <message> + <source>Clear</source> + <translation>Garbitu</translation> + </message> + <message> + <source>Never</source> + <translation>Inoiz</translation> + </message> + <message> + <source>[PROTECTED]</source> + <translation>[BABESTUA]</translation> + </message> + <message> + <source>Disabled</source> + <translation>Ezgaitua</translation> + </message> + <message> + <source>Enabled</source> + <translation>Gaitua</translation> + </message> +</context> <context> <name>EditEntryWidget</name> <message> @@ -761,9 +1228,33 @@ Do you want to open it anyway?</source> <translation>Historia</translation> </message> <message> - <source>Entry history</source> + <source>SSH Agent</source> <translation type="unfinished"/> </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>(encrypted)</source> + <translation>(zifratua)</translation> + </message> + <message> + <source>Select private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>File too large to be a private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry history</source> + <translation>Sarrera historia</translation> + </message> <message> <source>Add entry</source> <translation>Gehitu sarrera</translation> @@ -778,23 +1269,22 @@ Do you want to open it anyway?</source> </message> <message> <source>New attribute</source> + <translation>Gehitu ezaugarria</translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>Baieztatu kentzea</translation> + </message> + <message> + <source>Are you sure you want to remove this attribute?</source> <translation type="unfinished"/> </message> <message> - <source>Select file</source> - <translation>Aukeratu fitxategia</translation> + <source>[PROTECTED]</source> + <translation>[BABESTUA]</translation> </message> <message> - <source>Unable to open file</source> - <translation type="unfinished"/> - </message> - <message> - <source>Save attachment</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unable to save the attachment: -</source> + <source>Press reveal to view or edit</source> <translation type="unfinished"/> </message> <message> @@ -803,32 +1293,16 @@ Do you want to open it anyway?</source> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>aste %n</numerusform><numerusform>%n aste</numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>hilabete %n</numerusform><numerusform>%n hilabete</numerusform></translation> </message> <message> <source>1 year</source> <translation>urte 1</translation> </message> - <message> - <source>Confirm Remove</source> - <translation type="unfinished"/> - </message> - <message> - <source>Are you sure you want to remove this attribute?</source> - <translation type="unfinished"/> - </message> - <message> - <source>[PROTECTED] Press reveal to view or edit</source> - <translation type="unfinished"/> - </message> - <message> - <source>Are you sure you want to remove this attachment?</source> - <translation type="unfinished"/> - </message> </context> <context> <name>EditEntryWidgetAdvanced</name> @@ -844,18 +1318,6 @@ Do you want to open it anyway?</source> <source>Remove</source> <translation>Kendu</translation> </message> - <message> - <source>Attachments</source> - <translation type="unfinished"/> - </message> - <message> - <source>Save</source> - <translation>Gorde</translation> - </message> - <message> - <source>Open</source> - <translation>Ireki</translation> - </message> <message> <source>Edit Name</source> <translation>Izena editatu</translation> @@ -868,6 +1330,10 @@ Do you want to open it anyway?</source> <source>Reveal</source> <translation type="unfinished"/> </message> + <message> + <source>Attachments</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -875,6 +1341,18 @@ Do you want to open it anyway?</source> <source>Enable Auto-Type for this entry</source> <translation type="unfinished"/> </message> + <message> + <source>Inherit default Auto-Type sequence from the &group</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Use custom Auto-Type sequence:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Window Associations</source> + <translation type="unfinished"/> + </message> <message> <source>+</source> <translation>+</translation> @@ -885,15 +1363,7 @@ Do you want to open it anyway?</source> </message> <message> <source>Window title:</source> - <translation type="unfinished"/> - </message> - <message> - <source>Inherit default Auto-Type sequence from the &group</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Use custom Auto-Type sequence:</source> - <translation type="unfinished"/> + <translation>Leihoaren izenburua:</translation> </message> <message> <source>Use default se&quence</source> @@ -903,10 +1373,6 @@ Do you want to open it anyway?</source> <source>Set custo&m sequence:</source> <translation type="unfinished"/> </message> - <message> - <source>Window Associations</source> - <translation type="unfinished"/> - </message> </context> <context> <name>EditEntryWidgetHistory</name> @@ -916,7 +1382,7 @@ Do you want to open it anyway?</source> </message> <message> <source>Restore</source> - <translation type="unfinished"/> + <translation>Berrezarri</translation> </message> <message> <source>Delete</source> @@ -930,12 +1396,8 @@ Do you want to open it anyway?</source> <context> <name>EditEntryWidgetMain</name> <message> - <source>Title:</source> - <translation>Izenburua:</translation> - </message> - <message> - <source>Username:</source> - <translation>Erabitzaile-izena:</translation> + <source>URL:</source> + <translation>URL:</translation> </message> <message> <source>Password:</source> @@ -946,20 +1408,104 @@ Do you want to open it anyway?</source> <translation>Errepikatu:</translation> </message> <message> - <source>URL:</source> - <translation>URL:</translation> + <source>Title:</source> + <translation>Izenburua:</translation> </message> <message> - <source>Expires</source> - <translation type="unfinished"/> + <source>Notes</source> + <translation>Oharrak</translation> </message> <message> <source>Presets</source> <translation type="unfinished"/> </message> <message> - <source>Notes:</source> - <translation>Oharrak:</translation> + <source>Toggle the checkbox to reveal the notes section.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username:</source> + <translation>Erabitzaile-izena:</translation> + </message> + <message> + <source>Expires</source> + <translation>Iraungitzea</translation> + </message> +</context> +<context> + <name>EditEntryWidgetSSHAgent</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent after</source> + <translation type="unfinished"/> + </message> + <message> + <source> seconds</source> + <translation>segundu</translation> + </message> + <message> + <source>Fingerprint</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent when database is closed/locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Public key</source> + <translation>Gako publikoa</translation> + </message> + <message> + <source>Add key to agent when database is opened/unlocked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Comment</source> + <translation>Iruzkina</translation> + </message> + <message> + <source>Decrypt</source> + <translation>Deszifratu</translation> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy to clipboard</source> + <translation>Kopiatu arbelera</translation> + </message> + <message> + <source>Private key</source> + <translation>Gako pribatua</translation> + </message> + <message> + <source>External file</source> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Arakatu...</translation> + </message> + <message> + <source>Attachment</source> + <translation>Eranskina</translation> + </message> + <message> + <source>Add to agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove from agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Require user confirmation when this key is used</source> + <translation type="unfinished"/> </message> </context> <context> @@ -1009,7 +1555,7 @@ Do you want to open it anyway?</source> </message> <message> <source>Expires</source> - <translation type="unfinished"/> + <translation>Iraungitzea</translation> </message> <message> <source>Search</source> @@ -1030,6 +1576,14 @@ Do you want to open it anyway?</source> </context> <context> <name>EditWidgetIcons</name> + <message> + <source>&Use default icon</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use custo&m icon</source> + <translation type="unfinished"/> + </message> <message> <source>Add custom icon</source> <translation>Gehitu ikono pertsonalizatua</translation> @@ -1038,6 +1592,18 @@ Do you want to open it anyway?</source> <source>Delete custom icon</source> <translation>Ezabatu ikono pertsonalizatua</translation> </message> + <message> + <source>Download favicon</source> + <translation>Deskargatu favicon-a</translation> + </message> + <message> + <source>Unable to fetch favicon.</source> + <translation>Ezin izan da favicon-a atzitu.</translation> + </message> + <message> + <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> + <translation type="unfinished"/> + </message> <message> <source>Images</source> <translation>Irudiak</translation> @@ -1050,24 +1616,12 @@ Do you want to open it anyway?</source> <source>Select Image</source> <translation>Aukeratu irudia</translation> </message> - <message> - <source>Download favicon</source> - <translation>Deskargatu favicon-a</translation> - </message> - <message> - <source>Unable to fetch favicon.</source> - <translation>Ezin izan da favicon-a atzitu.</translation> - </message> <message> <source>Can't read icon</source> <translation type="unfinished"/> </message> <message> - <source>&Use default icon</source> - <translation type="unfinished"/> - </message> - <message> - <source>Use custo&m icon</source> + <source>Custom icon already exists</source> <translation type="unfinished"/> </message> <message> @@ -1078,14 +1632,6 @@ Do you want to open it anyway?</source> <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> <translation type="unfinished"/> </message> - <message> - <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation type="unfinished"/> - </message> - <message> - <source>Custom icon already exists</source> - <translation type="unfinished"/> - </message> </context> <context> <name>EditWidgetProperties</name> @@ -1110,6 +1656,90 @@ Do you want to open it anyway?</source> <name>Entry</name> <message> <source> - Clone</source> + <comment>Suffix added to cloned entries</comment> + <translation> - Klonatu</translation> + </message> +</context> +<context> + <name>EntryAttachmentsModel</name> + <message> + <source>Name</source> + <translation>Izena</translation> + </message> + <message> + <source>Size</source> + <translation>Tamainua</translation> + </message> +</context> +<context> + <name>EntryAttachmentsWidget</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add</source> + <translation>Gehitu</translation> + </message> + <message> + <source>Remove</source> + <translation>Kendu</translation> + </message> + <message> + <source>Open</source> + <translation>Ireki</translation> + </message> + <message> + <source>Save</source> + <translation>Gorde</translation> + </message> + <message> + <source>Select files</source> + <translation>Aukeratu fitxategiak</translation> + </message> + <message numerus="yes"> + <source>Are you sure you want to remove %n attachment(s)?</source> + <translation><numerusform>Ziur zaude eranskin %n kendu nahi duzula?</numerusform><numerusform>Ziur zaude %n eranskin kendu nahi dituzula?</numerusform></translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>Baieztatu kentzea</translation> + </message> + <message> + <source>Save attachments</source> + <translation>Gorde eranskinak</translation> + </message> + <message> + <source>Unable to create directory: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Confirm overwrite</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to save attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachment: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open files: +%1</source> <translation type="unfinished"/> </message> </context> @@ -1141,6 +1771,11 @@ Do you want to open it anyway?</source> </context> <context> <name>EntryModel</name> + <message> + <source>Ref: </source> + <comment>Reference abbreviation</comment> + <translation type="unfinished"/> + </message> <message> <source>Group</source> <translation>Taldea</translation> @@ -1157,16 +1792,22 @@ Do you want to open it anyway?</source> <source>URL</source> <translation>URL</translation> </message> - <message> - <source>Ref: </source> - <comment>Reference abbreviation</comment> - <translation type="unfinished"/> - </message> </context> <context> <name>Group</name> <message> <source>Recycle Bin</source> + <translation>Zakarrontzia</translation> + </message> +</context> +<context> + <name>HostInstaller</name> + <message> + <source>KeePassXC: Cannot save file!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot save the native messaging script file.</source> <translation type="unfinished"/> </message> </context> @@ -1232,6 +1873,358 @@ Do you want to open it anyway?</source> <translation>Itxi mezua</translation> </message> </context> +<context> + <name>Kdbx3Reader</name> + <message> + <source>Unable to calculate master key</source> + <translation>Ezin izan da gako nagusia kalkulatu</translation> + </message> + <message> + <source>Unable to issue challenge-response.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Kdbx3Writer</name> + <message> + <source>Unable to issue challenge-response.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Ezin izan da gako nagusia kalkulatu</translation> + </message> +</context> +<context> + <name>Kdbx4Reader</name> + <message> + <source>missing database headers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Ezin izan da gako nagusia kalkulatu</translation> + </message> + <message> + <source>Invalid header checksum size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Header SHA256 mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header data length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open buffer for KDF parameters in header</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported key derivation function (KDF) or invalid parameters</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy header fields found in KDBX4 file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header binary size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass variant map version.</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name data</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value data</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Bool entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry type</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map field type size</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Kdbx4Writer</name> + <message> + <source>Invalid symmetric cipher algorithm.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid symmetric cipher IV size.</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Ezin izan da gako nagusia kalkulatu</translation> + </message> + <message> + <source>Failed to serialize KDF parameters variant map</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxReader</name> + <message> + <source>Invalid cipher uuid length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid compression flags length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported compression algorithm</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid master seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform rounds size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid start bytes size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid random stream id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner random stream cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>Ez da KeePass datu-basea.</translation> + </message> + <message> + <source>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass 2 database version.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxXmlReader</name> + <message> + <source>XML parsing failure: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>No root group</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing icon uuid or data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing custom data key or value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Multiple group elements</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null group uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableAutoType value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableSearching value</source> + <translation type="unfinished"/> + </message> + <message> + <source>No group uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null DeleteObject uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing DeletedObject uuid or time</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null entry uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element in history entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>No entry uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element with different uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decrypt entry string</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate custom attribute found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry string key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate attachment found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry binary key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-type association window or sequence missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid bool value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid date time value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color rgb part</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid uuid value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decompress binary</source> + <extracomment>Translator meant is a binary data inside an entry</extracomment> + <translation type="unfinished"/> + </message> +</context> <context> <name>KeePass1OpenWidget</name> <message> @@ -1261,6 +2254,35 @@ Do you want to open it anyway?</source> <source>Unsupported KeePass database version.</source> <translation type="unfinished"/> </message> + <message> + <source>Unable to read encryption IV</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of groups</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid content hash size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of transform rounds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to construct group tree</source> + <translation type="unfinished"/> + </message> <message> <source>Root</source> <translation type="unfinished"/> @@ -1273,58 +2295,105 @@ Do you want to open it anyway?</source> <source>Wrong key or database file is corrupt.</source> <translation type="unfinished"/> </message> -</context> -<context> - <name>KeePass2Reader</name> <message> - <source>Not a KeePass database.</source> - <translation>Ez da KeePass datu-basea.</translation> - </message> - <message> - <source>Unsupported KeePass database version.</source> + <source>Key transformation failed</source> <translation type="unfinished"/> </message> <message> - <source>Wrong key or database file is corrupt.</source> + <source>Invalid group field type number</source> <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>Ezin izan da gako nagusia kalkulatu</translation> - </message> - <message> - <source>Unable to issue challenge-response.</source> + <source>Invalid group field size</source> <translation type="unfinished"/> </message> <message> - <source>The selected file is an old KeePass 1 database (.kdb). - -You can import it by clicking on Database > 'Import KeePass 1 database...'. -This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> - <translation type="unfinished"/> - </message> -</context> -<context> - <name>KeePass2Writer</name> - <message> - <source>Unable to issue challenge-response.</source> + <source>Read group field data doesn't match size</source> <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>Ezin izan da gako nagusia kalkulatu</translation> + <source>Incorrect group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group access time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group level field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing group id or level</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing entry field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read entry field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry uuid field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field type</source> + <translation type="unfinished"/> </message> </context> <context> <name>Main</name> <message> - <source>Fatal error while testing the cryptographic functions.</source> + <source>Existing single-instance lock file is invalid. Launching new instance.</source> <translation type="unfinished"/> </message> - <message> - <source>KeePassXC - Error</source> - <translation>KeePassXC - Errorea</translation> - </message> <message> <source>The lock file could not be created. Single-instance mode disabled.</source> <translation type="unfinished"/> @@ -1334,99 +2403,75 @@ This is a one-way migration. You won't be able to open the imported databas <translation type="unfinished"/> </message> <message> - <source>Existing single-instance lock file is invalid. Launching new instance.</source> + <source>Fatal error while testing the cryptographic functions.</source> <translation type="unfinished"/> </message> + <message> + <source>KeePassXC - Error</source> + <translation>KeePassXC - Errorea</translation> + </message> </context> <context> <name>MainWindow</name> <message> - <source>Open database</source> - <translation>Ireki datu-basea</translation> - </message> - <message> - <source>Database settings</source> - <translation>Datu-basearen ezarpenak</translation> - </message> - <message> - <source>Copy username to clipboard</source> - <translation>Kopiatu erabiltzaile-izena arbelera</translation> - </message> - <message> - <source>Copy password to clipboard</source> - <translation>Kopiatu pasahitza arbelera</translation> - </message> - <message> - <source>Settings</source> - <translation>Ezarpenak</translation> - </message> - <message> - <source>Show toolbar</source> - <translation>Erakutsi tresna-barra</translation> - </message> - <message> - <source>read-only</source> - <translation type="unfinished"/> - </message> - <message> - <source>Toggle window</source> - <translation type="unfinished"/> - </message> - <message> - <source>KeePass 2 Database</source> - <translation>KeePass 2 datu-basea</translation> - </message> - <message> - <source>All files</source> - <translation>Fitxategi guztiak</translation> - </message> - <message> - <source>Save repaired database</source> - <translation type="unfinished"/> - </message> - <message> - <source>Writing the database failed.</source> - <translation type="unfinished"/> + <source>&Database</source> + <translation>&Datu-basea</translation> </message> <message> <source>&Recent databases</source> <translation type="unfinished"/> </message> + <message> + <source>Import</source> + <translation>Inportatu</translation> + </message> + <message> + <source>&Help</source> + <translation>&Laguntza</translation> + </message> <message> <source>E&ntries</source> - <translation type="unfinished"/> + <translation>Sa&rrerak</translation> </message> <message> <source>Copy att&ribute to clipboard</source> <translation type="unfinished"/> </message> <message> - <source>&Groups</source> + <source>Time-based one-time password</source> <translation type="unfinished"/> </message> <message> - <source>&View</source> - <translation type="unfinished"/> + <source>&Groups</source> + <translation>&Taldeak</translation> + </message> + <message> + <source>&Tools</source> + <translation>&Tresnak</translation> </message> <message> <source>&Quit</source> - <translation type="unfinished"/> + <translation>&Irten</translation> </message> <message> <source>&About</source> + <translation>&Honi buruz</translation> + </message> + <message> + <source>&Open database...</source> <translation type="unfinished"/> </message> <message> <source>&Save database</source> - <translation type="unfinished"/> + <translation>&Gorde datubasea</translation> </message> <message> <source>&Close database</source> - <translation type="unfinished"/> + <translation>&Itxi datubasea</translation> </message> <message> <source>&New database</source> - <translation type="unfinished"/> + <translation>&Datu-base berria</translation> </message> <message> <source>Merge from KeePassX database</source> @@ -1434,63 +2479,75 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>&Add new entry</source> - <translation type="unfinished"/> + <translation>&Gehitu sarrera berria</translation> </message> <message> <source>&View/Edit entry</source> - <translation type="unfinished"/> + <translation>&Ikusi/Editatu sarrera</translation> </message> <message> <source>&Delete entry</source> - <translation type="unfinished"/> + <translation>&Ezabatu sarrera</translation> </message> <message> <source>&Add new group</source> - <translation type="unfinished"/> + <translation>&Gehitu talde berria</translation> </message> <message> <source>&Edit group</source> - <translation type="unfinished"/> + <translation>&Editatu taldea</translation> </message> <message> <source>&Delete group</source> + <translation>&Ezabatu taldea</translation> + </message> + <message> + <source>Sa&ve database as...</source> + <translation type="unfinished"/> + </message> + <message> + <source>Change &master key...</source> <translation type="unfinished"/> </message> <message> <source>&Database settings</source> - <translation type="unfinished"/> + <translation>&Datu-basearen ezarpenak</translation> + </message> + <message> + <source>Database settings</source> + <translation>Datu-basearen ezarpenak</translation> </message> <message> <source>&Clone entry</source> - <translation type="unfinished"/> - </message> - <message> - <source>Timed one-time password</source> - <translation type="unfinished"/> - </message> - <message> - <source>Copy &TOTP</source> - <translation type="unfinished"/> - </message> - <message> - <source>Show TOTP</source> - <translation type="unfinished"/> + <translation>&Klonatu sarrera</translation> </message> <message> <source>&Find</source> - <translation type="unfinished"/> + <translation>&Bilatu</translation> </message> <message> <source>Copy &username</source> - <translation type="unfinished"/> + <translation>Kopiatu &erabiltzailea</translation> + </message> + <message> + <source>Copy username to clipboard</source> + <translation>Kopiatu erabiltzaile-izena arbelera</translation> </message> <message> <source>Cop&y password</source> - <translation type="unfinished"/> + <translation>Kopiatu pasahitza</translation> + </message> + <message> + <source>Copy password to clipboard</source> + <translation>Kopiatu pasahitza arbelera</translation> </message> <message> <source>&Settings</source> - <translation type="unfinished"/> + <translation>&Ezarpenak</translation> + </message> + <message> + <source>Password Generator</source> + <translation>Pasahitz sortzailea</translation> </message> <message> <source>&Perform Auto-Type</source> @@ -1506,66 +2563,26 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>&Title</source> + <translation>&Izenburua</translation> + </message> + <message> + <source>Copy title to clipboard</source> <translation type="unfinished"/> </message> <message> <source>&URL</source> + <translation>&URL</translation> + </message> + <message> + <source>Copy URL to clipboard</source> <translation type="unfinished"/> </message> <message> <source>&Notes</source> - <translation type="unfinished"/> + <translation>&Oharrak</translation> </message> <message> - <source>Password Generator</source> - <translation>Pasahitz sortzailea</translation> - </message> - <message> - <source>Clear history</source> - <translation>Garbitu historia</translation> - </message> - <message> - <source>&Database</source> - <translation type="unfinished"/> - </message> - <message> - <source>Import</source> - <translation>Inportatu</translation> - </message> - <message> - <source>&Tools</source> - <translation type="unfinished"/> - </message> - <message> - <source>Empty recycle bin</source> - <translation type="unfinished"/> - </message> - <message> - <source>Access error for config file %1</source> - <translation type="unfinished"/> - </message> - <message> - <source>Quit KeePassXC</source> - <translation>Irten KeePassXC-tik</translation> - </message> - <message> - <source>Please touch the button on your YubiKey!</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Help</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Open database...</source> - <translation type="unfinished"/> - </message> - <message> - <source>Sa&ve database as...</source> - <translation type="unfinished"/> - </message> - <message> - <source>Change &master key...</source> + <source>Copy notes to clipboard</source> <translation type="unfinished"/> </message> <message> @@ -1584,10 +2601,169 @@ This is a one-way migration. You won't be able to open the imported databas <source>Re&pair database...</source> <translation type="unfinished"/> </message> + <message> + <source>Show TOTP</source> + <translation type="unfinished"/> + </message> <message> <source>Set up TOTP...</source> <translation type="unfinished"/> </message> + <message> + <source>Copy &TOTP</source> + <translation type="unfinished"/> + </message> + <message> + <source>E&mpty recycle bin</source> + <translation type="unfinished"/> + </message> + <message> + <source>Clear history</source> + <translation>Garbitu historia</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation type="unfinished"/> + </message> + <message> + <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> + <translation type="unfinished"/> + </message> + <message> + <source>read-only</source> + <translation type="unfinished"/> + </message> + <message> + <source>Settings</source> + <translation>Ezarpenak</translation> + </message> + <message> + <source>Toggle window</source> + <translation type="unfinished"/> + </message> + <message> + <source>Quit KeePassXC</source> + <translation>Irten KeePassXC-tik</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>KeePass 2 datu-basea</translation> + </message> + <message> + <source>All files</source> + <translation>Fitxategi guztiak</translation> + </message> + <message> + <source>Open database</source> + <translation>Ireki datu-basea</translation> + </message> + <message> + <source>Save repaired database</source> + <translation type="unfinished"/> + </message> + <message> + <source>Writing the database failed.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Please touch the button on your YubiKey!</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>OpenSSHKey</name> + <message> + <source>Invalid key file, expecting an OpenSSH key</source> + <translation type="unfinished"/> + </message> + <message> + <source>PEM boundary mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>This is not an OpenSSH key, only modern keys are supported</source> + <translation type="unfinished"/> + </message> + <message> + <source>Base64 decoding failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file way too small.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file magic header id invalid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Found zero keys</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to read public key.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Corrupted key file, reading private key failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>No private key payload to decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Trying to run KDF without cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Passphrase is required to decrypt this key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key derivation failed, key file corrupted?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: </source> + <translation>KDF ezezaguna:</translation> + </message> + <message> + <source>Decryption failed, wrong passphrase?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write public key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write private key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing private key</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OptionDialog</name> @@ -1595,22 +2771,63 @@ This is a one-way migration. You won't be able to open the imported databas <source>Dialog</source> <translation>Elkarrizketa</translation> </message> + <message> + <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation>Hau beharrezkoa da ChromeIPass edo PassIFox erabilita datu-baseetara sarbidea izateko</translation> + </message> + <message> + <source>Enable KeePassHTTP server</source> + <translation>Gaitu KeePassHTTP zerbitzaria</translation> + </message> <message> <source>General</source> <translation>Orokorra</translation> </message> <message> <source>Sh&ow a notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return only best matching entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Match URL schemes</source> <translation type="unfinished"/> </message> <message> <source>Sort matching entries by &username</source> <translation type="unfinished"/> </message> + <message> + <source>Sort &matching entries by title</source> + <translation type="unfinished"/> + </message> + <message> + <source>R&emove all shared encryption keys from active database</source> + <translation type="unfinished"/> + </message> <message> <source>Re&move all stored permissions from entries in active database</source> <translation type="unfinished"/> </message> + <message> + <source>Password Generator</source> + <translation>Pasahitz sortzailea</translation> + </message> <message> <source>Advanced</source> <translation>Aurreratua</translation> @@ -1623,10 +2840,22 @@ This is a one-way migration. You won't be able to open the imported databas <source>Always allow &updating entries</source> <translation type="unfinished"/> </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation type="unfinished"/> + </message> <message> <source>Searc&h in all opened databases for matching entries</source> <translation type="unfinished"/> </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation type="unfinished"/> + </message> <message> <source>HTTP Port:</source> <translation>HTTP portua:</translation> @@ -1635,18 +2864,18 @@ This is a one-way migration. You won't be able to open the imported databas <source>Default port: 19455</source> <translation>Portu lehenetsia: 19455</translation> </message> - <message> - <source>Re&quest to unlock the database if it is locked</source> - <translation type="unfinished"/> - </message> - <message> - <source>Sort &matching entries by title</source> - <translation type="unfinished"/> - </message> <message> <source>KeePassXC will listen to this port on 127.0.0.1</source> <translation type="unfinished"/> </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> + <translation type="unfinished"/> + </message> <message> <source>Cannot bind to privileged ports</source> <translation type="unfinished"/> @@ -1656,62 +2885,30 @@ This is a one-way migration. You won't be able to open the imported databas Using default port 19455.</source> <translation type="unfinished"/> </message> - <message> - <source>R&emove all shared encryption keys from active database</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Return advanced string fields which start with "KPH: "</source> - <translation type="unfinished"/> - </message> - <message> - <source>Automatically creating or updating string fields is not supported.</source> - <translation type="unfinished"/> - </message> - <message> - <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> - <translation>Hau beharrezkoa da ChromeIPass edo PassIFox erabilita datu-baseetara sarbidea izateko</translation> - </message> - <message> - <source>Enable KeePassHTTP server</source> - <translation>Gaitu KeePassHTTP zerbitzaria</translation> - </message> - <message> - <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Return only best matching entries</source> - <translation type="unfinished"/> - </message> - <message> - <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Match URL schemes</source> - <translation type="unfinished"/> - </message> - <message> - <source>Password Generator</source> - <translation>Pasahitz sortzailea</translation> - </message> - <message> - <source>Only the selected database has to be connected with a client.</source> - <translation type="unfinished"/> - </message> - <message> - <source>The following options can be dangerous! -Change them only if you know what you are doing.</source> - <translation type="unfinished"/> - </message> </context> <context> <name>PasswordGeneratorWidget</name> + <message> + <source>%p%</source> + <translation type="unfinished"/> + </message> <message> <source>Password:</source> <translation>Pasahitza:</translation> </message> + <message> + <source>strength</source> + <comment>Password strength</comment> + <translation>sendotasuna</translation> + </message> + <message> + <source>entropy</source> + <translation>entropia</translation> + </message> + <message> + <source>Password</source> + <translation>Pasahitza</translation> + </message> <message> <source>Character Types</source> <translation>Karaktere motak</translation> @@ -1732,38 +2929,50 @@ Change them only if you know what you are doing.</source> <source>Special Characters</source> <translation>Karaktere bereziak</translation> </message> + <message> + <source>Extended ASCII</source> + <translation type="unfinished"/> + </message> <message> <source>Exclude look-alike characters</source> <translation type="unfinished"/> </message> - <message> - <source>Accept</source> - <translation>Onartu</translation> - </message> - <message> - <source>%p%</source> - <translation type="unfinished"/> - </message> - <message> - <source>strength</source> - <translation>sendotasuna</translation> - </message> - <message> - <source>entropy</source> - <translation>entropia</translation> - </message> - <message> - <source>&Length:</source> - <translation type="unfinished"/> - </message> <message> <source>Pick characters from every group</source> <translation type="unfinished"/> </message> + <message> + <source>&Length:</source> + <translation>&Luzeera:</translation> + </message> + <message> + <source>Passphrase</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wordlist:</source> + <translation>Hitz zerrenda:</translation> + </message> + <message> + <source>Word Count:</source> + <translation>Hitz kopurua:</translation> + </message> + <message> + <source>Word Separator:</source> + <translation>Hitz banatzailea:</translation> + </message> <message> <source>Generate</source> <translation>Sortu</translation> </message> + <message> + <source>Copy</source> + <translation>Kopiatu</translation> + </message> + <message> + <source>Accept</source> + <translation>Onartu</translation> + </message> <message> <source>Close</source> <translation>Itxi</translation> @@ -1782,51 +2991,270 @@ Change them only if you know what you are doing.</source> </message> <message> <source>Poor</source> + <comment>Password quality</comment> <translation>Txarra</translation> </message> <message> <source>Weak</source> + <comment>Password quality</comment> <translation>Ahula</translation> </message> <message> <source>Good</source> + <comment>Password quality</comment> <translation>Ona</translation> </message> <message> <source>Excellent</source> + <comment>Password quality</comment> <translation>Bikaina</translation> </message> - <message> - <source>Password</source> - <translation>Pasahitza</translation> - </message> - <message> - <source>Extended ASCII</source> - <translation type="unfinished"/> - </message> - <message> - <source>Passphrase</source> - <translation type="unfinished"/> - </message> - <message> - <source>Wordlist:</source> - <translation type="unfinished"/> - </message> - <message> - <source>Word Count:</source> - <translation type="unfinished"/> - </message> - <message> - <source>Word Separator:</source> - <translation type="unfinished"/> - </message> - <message> - <source>Copy</source> - <translation>Kopiatu</translation> - </message> </context> <context> <name>QObject</name> + <message> + <source>Database not opened</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database hash not available</source> + <translation type="unfinished"/> + </message> + <message> + <source>Client public key not received</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot decrypt message</source> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout or cannot connect to KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>Action cancelled or denied</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC association failed, try again</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key change was not successful</source> + <translation type="unfinished"/> + </message> + <message> + <source>Encryption key is not recognized</source> + <translation type="unfinished"/> + </message> + <message> + <source>No saved databases found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect action</source> + <translation type="unfinished"/> + </message> + <message> + <source>Empty message received</source> + <translation type="unfinished"/> + </message> + <message> + <source>No URL provided</source> + <translation type="unfinished"/> + </message> + <message> + <source>No logins found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown error</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add a new entry to a database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file of the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>path</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>username</source> + <translation>erabiltzaile-izena</translation> + </message> + <message> + <source>URL for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Prompt for the entry's password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a password for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length for the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>length</source> + <translation>luzeera</translation> + </message> + <message> + <source>Path of the entry to add.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy an entry's password to the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to clip.</source> + <comment>clip = copy to clipboard</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout in seconds before clearing the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Edit an entry.</source> + <translation>Editatu sarrera bat.</translation> + </message> + <message> + <source>Title for the entry.</source> + <translation>Sarreraren izenburua.</translation> + </message> + <message> + <source>title</source> + <translation>Izenburua</translation> + </message> + <message> + <source>Path of the entry to edit.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Estimate the entropy of a password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password for which to estimate the entropy.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Perform advanced analysis on the password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Extract and print the content of a database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database to extract.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Insert password to unlock %1: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to load key file %1 : %2</source> + <translation type="unfinished"/> + </message> + <message> + <source>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source> + +Available commands: +</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the command to execute.</source> + <translation type="unfinished"/> + </message> + <message> + <source>List database entries.</source> + <translation>Zerrendatu datu-baseko sarrerak.</translation> + </message> + <message> + <source>Path of the group to list. Default is /</source> + <translation type="unfinished"/> + </message> + <message> + <source>Find entries quickly.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Search term.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Merge two databases.</source> + <translation>Bateratu bi datu-base.</translation> + </message> + <message> + <source>Path of the database to merge into.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database to merge from.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use the same credentials for both database files.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file of the database to merge from.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show an entry's information.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> + <translation type="unfinished"/> + </message> + <message> + <source>attribute</source> + <translation>ezaugarria</translation> + </message> + <message> + <source>Name of the entry to show.</source> + <translation>Erakutsiko den sarreraren izena.</translation> + </message> <message> <source>NULL device</source> <translation type="unfinished"/> @@ -1838,7 +3266,7 @@ Change them only if you know what you are doing.</source> <message> <source>file empty ! </source> - <translation type="unfinished"/> + <translation>fitxategia hutsik dago!</translation> </message> <message> <source>malformed string</source> @@ -1849,8 +3277,28 @@ Change them only if you know what you are doing.</source> <translation type="unfinished"/> </message> <message> - <source>INTERNAL - unget lower bound exceeded</source> - <translation type="unfinished"/> + <source>AES: 256-bit</source> + <translation>AES: 256-bit</translation> + </message> + <message> + <source>Twofish: 256-bit</source> + <translation>Twofish: 256-bit</translation> + </message> + <message> + <source>ChaCha20: 256-bit</source> + <translation>ChaCha20: 256-bit</translation> + </message> + <message> + <source>Argon2 (KDBX 4 – recommended)</source> + <translation>Argon2 (KDBX 4 – gomendatua)</translation> + </message> + <message> + <source>AES-KDF (KDBX 4)</source> + <translation>AES-KDF (KDBX 4)</translation> + </message> + <message> + <source>AES-KDF (KDBX 3.1)</source> + <translation>AES-KDF (KDBX 3.1)</translation> </message> <message> <source>Group</source> @@ -1868,14 +3316,22 @@ Change them only if you know what you are doing.</source> <source>Password</source> <translation>Pasahitza</translation> </message> - <message> - <source>URL</source> - <translation>URL</translation> - </message> <message> <source>Notes</source> <translation>Oharrak</translation> </message> + <message> + <source>Last Modified</source> + <translation>Azken aldaketa</translation> + </message> + <message> + <source>Created</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy Browser Integration</source> + <translation type="unfinished"/> + </message> <message> <source>Browser Integration</source> <translation type="unfinished"/> @@ -1886,12 +3342,16 @@ Change them only if you know what you are doing.</source> </message> <message> <source>Press</source> - <translation type="unfinished"/> + <translation>Sakatu</translation> </message> <message> <source>Passive</source> <translation type="unfinished"/> </message> + <message> + <source>SSH Agent</source> + <translation type="unfinished"/> + </message> </context> <context> <name>QtIOCompressor</name> @@ -1930,8 +3390,8 @@ Change them only if you know what you are doing.</source> <context> <name>SearchWidget</name> <message> - <source>Case Sensitive</source> - <translation type="unfinished"/> + <source>Search...</source> + <translation>Bilatu...</translation> </message> <message> <source>Search</source> @@ -1942,8 +3402,8 @@ Change them only if you know what you are doing.</source> <translation>Garbitu</translation> </message> <message> - <source>Search...</source> - <translation>Bilatu...</translation> + <source>Case Sensitive</source> + <translation type="unfinished"/> </message> <message> <source>Limit search to selected group</source> @@ -1952,48 +3412,6 @@ Change them only if you know what you are doing.</source> </context> <context> <name>Service</name> - <message> - <source>A shared encryption-key with the name "%1" already exists. -Do you want to overwrite it?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Do you want to update the information in %1 - %2?</source> - <translation type="unfinished"/> - </message> - <message> - <source>The active database is locked! -Please unlock the selected database or choose another one which is unlocked.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Successfully removed %1 encryption-%2 from KeePassX/Http Settings.</source> - <translation type="unfinished"/> - </message> - <message> - <source>No shared encryption-keys found in KeePassHttp Settings.</source> - <translation type="unfinished"/> - </message> - <message> - <source>The active database does not contain an entry of KeePassHttp Settings.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Removing stored permissions...</source> - <translation type="unfinished"/> - </message> - <message> - <source>Abort</source> - <translation type="unfinished"/> - </message> - <message> - <source>Successfully removed permissions from %1 %2.</source> - <translation type="unfinished"/> - </message> - <message> - <source>The active database does not contain an entry with permissions.</source> - <translation type="unfinished"/> - </message> <message> <source>KeePassXC: New key association request</source> <translation type="unfinished"/> @@ -2008,34 +3426,76 @@ give it a unique name to identify and accept it.</source> <source>KeePassXC: Overwrite existing key?</source> <translation>KeePassXC: Gainidatzi aurreko gakoa?</translation> </message> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"/> + </message> <message> <source>KeePassXC: Update Entry</source> <translation>KeePassXC: Eguneratu sarrera</translation> </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation type="unfinished"/> + </message> <message> <source>KeePassXC: Database locked!</source> <translation type="unfinished"/> </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation type="unfinished"/> + </message> <message> <source>KeePassXC: Removed keys from database</source> <translation type="unfinished"/> </message> + <message numerus="yes"> + <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No keys found</source> <translation>KeePassXC: Ez da gakorik aurkitu</translation> </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation type="unfinished"/> + </message> <message> <source>KeePassXC: Settings not available!</source> <translation type="unfinished"/> </message> <message> - <source>KeePassXC: Removed permissions</source> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> <translation type="unfinished"/> </message> + <message> + <source>Removing stored permissions...</source> + <translation>Gordetako baimenak kentzen...</translation> + </message> + <message> + <source>Abort</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: Kendutako baimenak</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entries.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No entry with permissions found!</source> <translation type="unfinished"/> </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>SettingsWidget</name> @@ -2058,10 +3518,26 @@ give it a unique name to identify and accept it.</source> </context> <context> <name>SettingsWidgetGeneral</name> + <message> + <source>Basic Settings</source> + <translation>Oinarrizko ezarpenak</translation> + </message> + <message> + <source>Start only a single instance of KeePassXC</source> + <translation type="unfinished"/> + </message> <message> <source>Remember last databases</source> <translation>Gogoratu azken datu-baseak</translation> </message> + <message> + <source>Remember last key files and security dongles</source> + <translation type="unfinished"/> + </message> + <message> + <source>Load previous databases on startup</source> + <translation type="unfinished"/> + </message> <message> <source>Automatically save on exit</source> <translation>Automatikoki gorde irtetean</translation> @@ -2070,21 +3546,29 @@ give it a unique name to identify and accept it.</source> <source>Automatically save after every change</source> <translation>Automatikoki gorde aldaketa oro eta gero</translation> </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation type="unfinished"/> + </message> <message> <source>Minimize when copying to clipboard</source> <translation>Minimizatu arbelera kopiatzean</translation> </message> + <message> + <source>Minimize window at application startup</source> + <translation type="unfinished"/> + </message> <message> <source>Use group icon on entry creation</source> <translation>Erabili taldearen ikonoa sarrera sortzean</translation> </message> <message> - <source>Global Auto-Type shortcut</source> + <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> <translation type="unfinished"/> </message> <message> - <source>Language</source> - <translation>Hizkuntza</translation> + <source>Hide the Details view</source> + <translation type="unfinished"/> </message> <message> <source>Show a system tray icon</source> @@ -2094,67 +3578,61 @@ give it a unique name to identify and accept it.</source> <source>Hide window to system tray when minimized</source> <translation type="unfinished"/> </message> - <message> - <source>Load previous databases on startup</source> - <translation type="unfinished"/> - </message> - <message> - <source>Automatically reload the database when modified externally</source> - <translation type="unfinished"/> - </message> <message> <source>Hide window to system tray instead of app exit</source> <translation type="unfinished"/> </message> <message> - <source>Minimize window at application startup</source> + <source>Dark system tray icon</source> <translation type="unfinished"/> </message> <message> - <source>Basic Settings</source> - <translation>Oinarrizko ezarpenak</translation> - </message> - <message> - <source>Remember last key files and security dongles</source> - <translation type="unfinished"/> - </message> - <message> - <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> - <translation type="unfinished"/> + <source>Language</source> + <translation>Hizkuntza</translation> </message> <message> <source>Auto-Type</source> <translation type="unfinished"/> </message> <message> - <source>Use entry title and URL to match windows for global Auto-Type</source> + <source>Use entry title to match windows for global Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use entry URL to match windows for global Auto-Type</source> <translation type="unfinished"/> </message> <message> <source>Always ask before performing Auto-Type</source> <translation type="unfinished"/> </message> + <message> + <source>Global Auto-Type shortcut</source> + <translation type="unfinished"/> + </message> <message> <source>Auto-Type delay</source> <translation type="unfinished"/> </message> <message> <source> ms</source> - <translation type="unfinished"/> - </message> - <message> - <source>Start only a single instance of KeePassXC</source> - <translation type="unfinished"/> + <comment>Milliseconds</comment> + <translation> ms</translation> </message> </context> <context> <name>SettingsWidgetSecurity</name> + <message> + <source>Timeouts</source> + <translation type="unfinished"/> + </message> <message> <source>Clear clipboard after</source> <translation type="unfinished"/> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation type="unfinished"/> </message> <message> @@ -2162,7 +3640,11 @@ give it a unique name to identify and accept it.</source> <translation type="unfinished"/> </message> <message> - <source>Show passwords in cleartext by default</source> + <source>Convenience</source> + <translation type="unfinished"/> + </message> + <message> + <source>Lock databases when session is locked or lid is closed</source> <translation type="unfinished"/> </message> <message> @@ -2174,15 +3656,15 @@ give it a unique name to identify and accept it.</source> <translation type="unfinished"/> </message> <message> - <source>Timeouts</source> + <source>Show passwords in cleartext by default</source> <translation type="unfinished"/> </message> <message> - <source>Convenience</source> + <source>Hide passwords in the preview panel</source> <translation type="unfinished"/> </message> <message> - <source>Lock databases when session is locked or lid is closed</source> + <source>Hide entry notes by default</source> <translation type="unfinished"/> </message> <message> @@ -2202,6 +3684,14 @@ give it a unique name to identify and accept it.</source> </message> <message> <source>Key:</source> + <translation>Gakoa:</translation> + </message> + <message> + <source>Default RFC 6238 token settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Steam token settings</source> <translation type="unfinished"/> </message> <message> @@ -2218,11 +3708,11 @@ give it a unique name to identify and accept it.</source> </message> <message> <source>8 digits</source> - <translation type="unfinished"/> + <translation>8 zifra</translation> </message> <message> <source>6 digits</source> - <translation type="unfinished"/> + <translation>6 zifra</translation> </message> <message> <source>Code size:</source> @@ -2230,6 +3720,7 @@ give it a unique name to identify and accept it.</source> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation type="unfinished"/> </message> </context> @@ -2296,6 +3787,26 @@ give it a unique name to identify and accept it.</source> </context> <context> <name>main</name> + <message> + <source>Remove an entry from the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to remove.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation>KeePassXC - plataforma anitzeko pasahitz kudeatzailea</translation> + </message> + <message> + <source>filenames of the password databases to open (*.kdbx)</source> + <translation type="unfinished"/> + </message> <message> <source>path to a custom config file</source> <translation type="unfinished"/> @@ -2304,81 +3815,13 @@ give it a unique name to identify and accept it.</source> <source>key file of the database</source> <translation>datu-basearen gako-fitxategia</translation> </message> - <message> - <source>KeePassXC - cross-platform password manager</source> - <translation>KeePassXC - plataforma anitzeko pasahitz kudeatzailea</translation> - </message> <message> <source>read password of the database from stdin</source> <translation type="unfinished"/> </message> <message> - <source>filenames of the password databases to open (*.kdbx)</source> + <source>Parent window handle</source> <translation type="unfinished"/> </message> - <message> - <source>Copy a password to the clipboard</source> - <translation type="unfinished"/> - </message> - <message> - <source>Path of the database.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Use a GUI prompt unlocking the database.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Name of the entry to clip.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Extract and print the content of a database.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Path of the database to extract.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Name of the command to execute.</source> - <translation type="unfinished"/> - </message> - <message> - <source>List database entries.</source> - <translation>Zerrendatu datu-baseko sarrerak.</translation> - </message> - <message> - <source>Path of the group to list. Default is /</source> - <translation type="unfinished"/> - </message> - <message> - <source>Print the UUIDs of the entries and groups.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Merge two databases.</source> - <translation>Bateratu bi datu-base.</translation> - </message> - <message> - <source>Path of the database to merge into.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Path of the database to merge from.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Use the same password for both database files.</source> - <translation>Erabili pasahitz bera bi datu-base fitxategietarako.</translation> - </message> - <message> - <source>Show a password.</source> - <translation>Erakutsi pasahitz bat.</translation> - </message> - <message> - <source>Name of the entry to show.</source> - <translation>Erakutsiko den sarreraren izena.</translation> - </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_fi.ts b/share/translations/keepassx_fi.ts index c7d61473e..cfff0d35a 100644 --- a/share/translations/keepassx_fi.ts +++ b/share/translations/keepassx_fi.ts @@ -9,14 +9,34 @@ <source>About</source> <translation>Tietoja</translation> </message> + <message> + <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> + <translation>Ilmoita ongelmista: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> + </message> + <message> + <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>KeePassXC:tä jaellaan GPL-lisenssin (GNU General Public License) version 2 tai (valintasi mukaan) version 3 ehtojen mukaisesti.</translation> + </message> + <message> + <source>Project Maintainers:</source> + <translation>Projektin ylläpitäjät:</translation> + </message> <message> <source>Contributors</source> <translation>Osallistujat</translation> </message> + <message> + <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Katso osallistujat GitHubista</a></translation> + </message> <message> <source>Debug Info</source> <translation>Vianjäljitystiedot</translation> </message> + <message> + <source>Include the following information whenever you report a bug:</source> + <translation>Sisällytä seuraavat tiedot aina kun ilmoitat ongelmasta:</translation> + </message> <message> <source>Copy to clipboard</source> <translation>Kopioi leikepöydälle</translation> @@ -31,6 +51,10 @@ <source>Revision: %1</source> <translation>Revisio: %1</translation> </message> + <message> + <source>Distribution: %1</source> + <translation>Jakelu: %1</translation> + </message> <message> <source>Libraries:</source> <translation>Kirjastot:</translation> @@ -47,33 +71,13 @@ Kernel: %3 %4</translation> <source>Enabled extensions:</source> <translation>Käytössä olevat laajennukset:</translation> </message> - <message> - <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> - <translation>Ilmoita ongelmista: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> - </message> - <message> - <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassXC:tä jaellaan GPL-lisenssin (GNU General Public License) version 2 tai (valintasi mukaan) version 3 ehtojen mukaisesti.</translation> - </message> - <message> - <source>Project Maintainers:</source> - <translation>Projektin ylläpitäjät:</translation> - </message> - <message> - <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Katso osallistujat GitHubista</a></translation> - </message> - <message> - <source>Include the following information whenever you report a bug:</source> - <translation>Sisällytä seuraavat tiedot aina kun ilmoitat ongelmasta:</translation> - </message> - <message> - <source>Distribution: %1</source> - <translation type="unfinished"/> - </message> </context> <context> <name>AccessControlDialog</name> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>KeePassXC HTTP - Vahvista pääsy</translation> + </message> <message> <source>Remember this decision</source> <translation>Muista tämä valinta</translation> @@ -89,12 +93,15 @@ Kernel: %3 %4</translation> <message> <source>%1 has requested access to passwords for the following item(s). Please select whether you want to allow access.</source> - <translation>%1 pyytää pääsyä seuraavien alkioiden salasanoihin. -Ole hyvä ja valitse sallitaanko pääsy.</translation> + <translation>%1 pyytää pääsyä seuraavien kohteiden salasanoihin. +Valitse sallitaanko pääsy.</translation> </message> +</context> +<context> + <name>AgentSettingsWidget</name> <message> - <source>KeePassXC HTTP Confirm Access</source> - <translation>KeePassXC HTTP - Vahvista pääsy</translation> + <source>Enable SSH Agent (requires restart)</source> + <translation>Käytä SSH-agenttia (vaatii uudelleenkäynnistyksen)</translation> </message> </context> <context> @@ -107,6 +114,26 @@ Ole hyvä ja valitse sallitaanko pääsy.</translation> <source>Auto-Type - KeePassXC</source> <translation>Automaattitäydennys - KeePassXC</translation> </message> + <message> + <source>Auto-Type</source> + <translation>Automaattitäydennys</translation> + </message> + <message> + <source>The Syntax of your Auto-Type statement is incorrect!</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> </context> <context> <name>AutoTypeAssociationsModel</name> @@ -125,13 +152,291 @@ Ole hyvä ja valitse sallitaanko pääsy.</translation> </context> <context> <name>AutoTypeSelectDialog</name> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>Automaattitäydennys - KeePassXC</translation> + </message> <message> <source>Select entry to Auto-Type:</source> <translation>Valitse merkintä automaattitäydennystä varten:</translation> </message> +</context> +<context> + <name>BrowserAccessControlDialog</name> <message> - <source>Auto-Type - KeePassXC</source> - <translation>Automaattitäydennys - KeePassXC</translation> + <source>KeePassXC-Browser Confirm Access</source> + <translation>KeePassXC-Browser - Vahvista pääsy</translation> + </message> + <message> + <source>Remember this decision</source> + <translation>Muista tämä valinta</translation> + </message> + <message> + <source>Allow</source> + <translation>Salli</translation> + </message> + <message> + <source>Deny</source> + <translation>Estä</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 pyytää pääsyä seuraavien alkioiden salasanoihin. +Ole hyvä ja valitse sallitaanko pääsy.</translation> + </message> +</context> +<context> + <name>BrowserOptionDialog</name> + <message> + <source>Dialog</source> + <translation>Dialogi</translation> + </message> + <message> + <source>This is required for accessing your databases with KeePassXC-Browser</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable KeepassXC browser integration</source> + <translation>Käytä KeepassXC:n selainintegraatiota</translation> + </message> + <message> + <source>General</source> + <translation>Yleistä</translation> + </message> + <message> + <source>Enable integration for these browsers:</source> + <translation>Käytä integraatiota seuraaville selaimille:</translation> + </message> + <message> + <source>&Google Chrome</source> + <translation>&Google Chrome</translation> + </message> + <message> + <source>&Firefox</source> + <translation>&Firefox</translation> + </message> + <message> + <source>&Chromium</source> + <translation>&Chromium</translation> + </message> + <message> + <source>&Vivaldi</source> + <translation>&Vivaldi</translation> + </message> + <message> + <source>Show a &notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Näytä &ilmoitus kun tilitietoja pyydetään</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Pyyd&ä tietokannan lukituksen avaamista jos se on lukittu</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Match URL scheme (e.g., https://...)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return only best-matching credentials</source> + <translation>&Paluta vain parhaiten vastaavat tilitiedot</translation> + </message> + <message> + <source>Sort &matching credentials by title</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Järjestä &vastaavat tilitiedot nimen mukaan</translation> + </message> + <message> + <source>Sort matching credentials by &username</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Jä&rjestä vastaavat tilitiedot käyttäjätunnuksen mukaan</translation> + </message> + <message> + <source>&Disconnect all browsers</source> + <translation>&Katkaise yhteys kaikkiin selaimiin</translation> + </message> + <message> + <source>Forget all remembered &permissions</source> + <translation>Unohda kaikki muistetut &oikeudet</translation> + </message> + <message> + <source>Advanced</source> + <translation>Lisäasetukset</translation> + </message> + <message> + <source>Never &ask before accessing credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>&Älä koskaan kysy ennen pääsyä tilitietoihin</translation> + </message> + <message> + <source>Never ask before &updating credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Älä koskaan k&ysy ennen tilitietojen päivittämistä</translation> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>Vain valittu tietokanta tulee olla yhdistetty asiakkaan kanssa.</translation> + </message> + <message> + <source>Searc&h in all opened databases for matching credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>%Etsi kaikista avoinna olevista tietokannoista vastaavia tilitietoja</translation> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation type="unfinished"/> + </message> + <message> + <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Update &native messaging manifest files at startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Support a proxy application between KeePassXC and browser extension.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &proxy application between KeePassXC and browser extension</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a custom proxy location if you installed a proxy manually.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &custom proxy location</source> + <comment>Meant is the proxy for KeePassXC-Browser</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Selaa...</translation> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation><b>Varoitus:</b> Seuraavat valinnat voivat olla vaarallisia!</translation> + </message> + <message> + <source>Executable Files (*.exe);;All Files (*.*)</source> + <translation>Suoritettavat tiedostot (*.exe);;Kaikki tiedostot (*.*)</translation> + </message> + <message> + <source>Executable Files (*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select custom proxy location</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>BrowserService</name> + <message> + <source>KeePassXC: New key association request</source> + <translation type="unfinished"/> + </message> + <message> + <source>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Save and allow access</source> + <translation>Tallenna ja salli pääsy</translation> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: Korvataanko olemassa oleva avain?</translation> + </message> + <message> + <source>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>Jaettu salausavain samalla nimellä "%1" on jo olemassa. +Haluatko korvata sen?</translation> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: Päivitä merkintä</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: tietokanta lukittu!</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>Aktiivinen tietokanta on lukittu! +Avaa valittu tietokanta tai valitse toinen avattu tietokanta.</translation> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: Asetukset eivät ole käytettävissä!</translation> + </message> + <message> + <source>The active database does not contain a settings entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: Avaimia ei löytynyt</translation> + </message> + <message> + <source>No shared encryption keys found in KeePassXC Settings.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: Poistettiin avaimet tietokannasta</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Removing stored permissions…</source> + <translation>Poistetaan talletettuja oikeuksia…</translation> + </message> + <message> + <source>Abort</source> + <translation>Keskeytä</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: Poistetut käyttöoikeudet</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entry(s).</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation type="unfinished"/> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation type="unfinished"/> </message> </context> <context> @@ -148,6 +453,10 @@ Ole hyvä ja valitse sallitaanko pääsy.</translation> <source>Repeat password:</source> <translation>Toista salasana:</translation> </message> + <message> + <source>&Key file</source> + <translation>Avaintiedosto</translation> + </message> <message> <source>Browse</source> <translation>Selaa</translation> @@ -156,6 +465,14 @@ Ole hyvä ja valitse sallitaanko pääsy.</translation> <source>Create</source> <translation>Luo</translation> </message> + <message> + <source>Cha&llenge Response</source> + <translation>&Haaste ja vastaus</translation> + </message> + <message> + <source>Refresh</source> + <translation>Päivitä</translation> + </message> <message> <source>Key files</source> <translation>Avaintiedostot</translation> @@ -176,6 +493,10 @@ Ole hyvä ja valitse sallitaanko pääsy.</translation> <source>Select a key file</source> <translation>Valitse avaintiedosto</translation> </message> + <message> + <source>Empty password</source> + <translation>Tyhjä salasana</translation> + </message> <message> <source>Do you really want to use an empty string as password?</source> <translation>Haluatko varmasti asettaa tyhjän merkkijonon salasanaksi?</translation> @@ -191,20 +512,15 @@ Ole hyvä ja valitse sallitaanko pääsy.</translation> %2</translation> </message> <message> - <source>&Key file</source> - <translation>Avaintiedosto</translation> + <source>Legacy key file format</source> + <translation>Vanha avaintiedostomuoto</translation> </message> <message> - <source>Cha&llenge Response</source> - <translation>&Haaste ja vastaus</translation> - </message> - <message> - <source>Refresh</source> - <translation>Päivitä</translation> - </message> - <message> - <source>Empty password</source> - <translation>Tyhjä salasana</translation> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -217,6 +533,10 @@ Ole hyvä ja valitse sallitaanko pääsy.</translation> <source>Clone Options</source> <translation>Kopiointiasetukset</translation> </message> + <message> + <source>Append ' - Clone' to title</source> + <translation>Lisää ' - Klooni' otsikkoon</translation> + </message> <message> <source>Replace username and password with references</source> <translation type="unfinished"/> @@ -225,10 +545,6 @@ Ole hyvä ja valitse sallitaanko pääsy.</translation> <source>Copy history</source> <translation>Kopiointi historia</translation> </message> - <message> - <source>Append ' - Clone' to title</source> - <translation>Lisää ' - Klooni' otsikkoon</translation> - </message> </context> <context> <name>CsvImportWidget</name> @@ -324,10 +640,6 @@ Ole hyvä ja valitse sallitaanko pääsy.</translation> </context> <context> <name>CsvImportWizard</name> - <message> - <source>Import CSV file</source> - <translation>Tuo CSV-tiedosto</translation> - </message> <message> <source>Error</source> <translation>Virhe</translation> @@ -339,17 +651,17 @@ Ole hyvä ja valitse sallitaanko pääsy.</translation> </context> <context> <name>CsvParserModel</name> - <message> - <source> byte, </source> - <translation> tavu, </translation> + <message numerus="yes"> + <source>%n byte(s), </source> + <translation><numerusform>%n tavu.</numerusform><numerusform>%n tavua.</numerusform></translation> </message> - <message> - <source> rows, </source> - <translation>rivit,</translation> + <message numerus="yes"> + <source>%n row(s), </source> + <translation><numerusform>%n rivi.</numerusform><numerusform>%n riviä.</numerusform></translation> </message> - <message> - <source> columns</source> - <translation>sarakkeet</translation> + <message numerus="yes"> + <source>%n column(s)</source> + <translation><numerusform>%n sarake.</numerusform><numerusform>%n saraketta.</numerusform></translation> </message> </context> <context> @@ -364,19 +676,42 @@ Ole hyvä ja valitse sallitaanko pääsy.</translation> </message> <message> <source>Password:</source> - <translation>Salasana</translation> + <translation>Salasana:</translation> </message> <message> <source>Browse</source> <translation>Selaa</translation> </message> + <message> + <source>Refresh</source> + <translation>Päivitä</translation> + </message> + <message> + <source>Challenge Response:</source> + <translation>Haaste/vastaus:</translation> + </message> <message> <source>Unable to open the database.</source> - <translation>Tietokannan avaaminen ei onnistunut.</translation> + <translation>Tietokannan avaaminen epäonnistui.</translation> </message> <message> <source>Can't open key file</source> - <translation>Avaintiedostoa ei voitu avata</translation> + <translation>Avaintiedoston avaaminen epäonnistui</translation> + </message> + <message> + <source>Legacy key file format</source> + <translation>Vanha avaintiedostomuoto</translation> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't show this warning again</source> + <translation>Älä näytä tätä varoitusta uudelleen</translation> </message> <message> <source>All files</source> @@ -390,14 +725,6 @@ Ole hyvä ja valitse sallitaanko pääsy.</translation> <source>Select key file</source> <translation>Valitse avaintiedosto</translation> </message> - <message> - <source>Refresh</source> - <translation>Päivitä</translation> - </message> - <message> - <source>Challenge Response:</source> - <translation>Haaste/vastaus:</translation> - </message> </context> <context> <name>DatabaseRepairWidget</name> @@ -413,14 +740,14 @@ Ole hyvä ja valitse sallitaanko pääsy.</translation> <source>Can't open key file</source> <translation>Avaintiedoston avaaminen epäonnistui</translation> </message> - <message> - <source>Database opened fine. Nothing to do.</source> - <translation>Tietokannan avaaminen onnistui. Ei tehtävää.</translation> - </message> <message> <source>Unable to open the database.</source> <translation>Tietokannan avaaminen epäonnistui.</translation> </message> + <message> + <source>Database opened fine. Nothing to do.</source> + <translation>Tietokannan avaaminen onnistui. Ei tehtävää.</translation> + </message> <message> <source>Success</source> <translation>Onnistui!</translation> @@ -439,40 +766,57 @@ Voit nyt tallentaa sen.</translation> <context> <name>DatabaseSettingsWidget</name> <message> - <source>Database name:</source> - <translation>Tietokannan nimi:</translation> + <source>General</source> + <translation>Yleistä</translation> </message> <message> - <source>Database description:</source> - <translation>Tietokannan kuvaus:</translation> + <source>Encryption</source> + <translation>Salaus</translation> </message> <message> - <source>Transform rounds:</source> - <translation>Muunnoskierroksia:</translation> + <source>Number of rounds too high</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> </message> <message> - <source>Default username:</source> - <translation>Oletuskäyttäjänimi:</translation> + <source>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</source> + <translation type="unfinished"/> </message> <message> - <source> MiB</source> - <translation>MiB</translation> + <source>Understood, keep number</source> + <translation>Ymmärrän, säilytä numero</translation> </message> <message> - <source>Benchmark</source> - <translation>Suorituskykytesti</translation> + <source>Cancel</source> + <translation>Peru</translation> </message> <message> - <source>Max. history items:</source> - <translation>Maks. historia-alkioiden lukumäärä:</translation> + <source>Number of rounds too low</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> </message> <message> - <source>Max. history size:</source> - <translation>Maks. historian koko:</translation> + <source>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</source> + <translation type="unfinished"/> </message> <message> - <source>Use recycle bin</source> - <translation>Käytä roskakoria</translation> + <source>KDF unchanged</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetEncryption</name> + <message> + <source>Encryption Algorithm:</source> + <translation>Salausalgoritmi:</translation> </message> <message> <source>AES: 256 Bit (default)</source> @@ -483,14 +827,78 @@ Voit nyt tallentaa sen.</translation> <translation>Twofish: 256 Bit</translation> </message> <message> - <source>Algorithm:</source> - <translation>Algoritmi:</translation> + <source>Key Derivation Function:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Transform rounds:</source> + <translation>Muunnoskierroksia:</translation> + </message> + <message> + <source>Benchmark 1-second delay</source> + <translation type="unfinished"/> + </message> + <message> + <source>Memory Usage:</source> + <translation>Muistin käyttö:</translation> + </message> + <message> + <source> MB</source> + <translation> Mt</translation> + </message> + <message> + <source>Parallelism:</source> + <translation type="unfinished"/> + </message> + <message> + <source> thread</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetGeneral</name> + <message> + <source>Database Meta Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database name:</source> + <translation>Tietokannan nimi:</translation> + </message> + <message> + <source>Database description:</source> + <translation>Tietokannan kuvaus:</translation> + </message> + <message> + <source>Default username:</source> + <translation>Oletuskäyttäjänimi:</translation> + </message> + <message> + <source>History Settings</source> + <translation>Historia-asetukset</translation> + </message> + <message> + <source>Max. history items:</source> + <translation>Maks. historia-alkioiden lukumäärä:</translation> + </message> + <message> + <source>Max. history size:</source> + <translation>Maks. historian koko:</translation> + </message> + <message> + <source> MiB</source> + <translation>MiB</translation> + </message> + <message> + <source>Use recycle bin</source> + <translation>Käytä roskakoria</translation> </message> </context> <context> <name>DatabaseTabWidget</name> <message> <source>Root</source> + <comment>Root group</comment> <translation>Juuri</translation> </message> <message> @@ -509,6 +917,30 @@ Voit nyt tallentaa sen.</translation> <source>File not found!</source> <translation>Tiedostoa ei löytynyt!</translation> </message> + <message> + <source>Unable to open the database.</source> + <translation>Tietokannan avaaminen epäonnistui.</translation> + </message> + <message> + <source>File opened in read only mode.</source> + <translation>Tiedosto on avattu "vain luku"-tilassa.</translation> + </message> + <message> + <source>Open CSV file</source> + <translation>Avaa CSV-tiedosto</translation> + </message> + <message> + <source>CSV file</source> + <translation>CSV-tiedosto</translation> + </message> + <message> + <source>All files (*)</source> + <translation>Kaikki tiedostot(*)</translation> + </message> + <message> + <source>Merge database</source> + <translation>Yhdistä tietokanta</translation> + </message> <message> <source>Open KeePass 1 database</source> <translation>Avaa KeePass 1 -tietokanta</translation> @@ -517,14 +949,16 @@ Voit nyt tallentaa sen.</translation> <source>KeePass 1 database</source> <translation>KeePass 1 -tietokanta</translation> </message> - <message> - <source>All files (*)</source> - <translation>Kaikki tiedostot(*)</translation> - </message> <message> <source>Close?</source> <translation>Sulje?</translation> </message> + <message> + <source>"%1" is in edit mode. +Discard changes and close anyway?</source> + <translation>"%1" on muokkaustilassa. +Hylkää muutokset ja sulje?</translation> + </message> <message> <source>Save changes?</source> <translation>Tallenna muutokset?</translation> @@ -539,10 +973,22 @@ Tallennetaanko muutokset?</translation> <source>Writing the database failed.</source> <translation>Tietokannan kirjoitus levylle epäonnistui.</translation> </message> + <message> + <source>Passwords</source> + <translation>Salasanat</translation> + </message> <message> <source>Save database as</source> <translation>Tallenna tietokanta nimellä</translation> </message> + <message> + <source>Export database to CSV file</source> + <translation>Vie tietokanta CSV-tiedostoon</translation> + </message> + <message> + <source>Writing the CSV file failed.</source> + <translation>CSV-tiedoston kirjoitus levylle epäonnistui.</translation> + </message> <message> <source>New database</source> <translation>Uusi tietokanta</translation> @@ -560,12 +1006,6 @@ Tallennetaanko muutokset?</translation> Please press cancel to finish your changes or discard them.</source> <translation>Tietokantaa ei voida lukita, sillä se on muokkaustilassa. Paina Peruuta jos haluat viimeistellä muutoksesi, muussa tapauksessa muutoksesi hylätään.</translation> - </message> - <message> - <source>This database has never been saved. -You can save the database or stop locking it.</source> - <translation>Tätä tietokantaa ei ole koskaan tallennettu. -Voit tallentaa tietokannan tai lopettaa sen lukituksen.</translation> </message> <message> <source>This database has been modified. @@ -575,69 +1015,13 @@ Otherwise your changes are lost.</source> Haluatko tallentaa tietokannan ennen sen lukitsemista? Jos et tallenna, muutokset hylätään.</translation> </message> - <message> - <source>"%1" is in edit mode. -Discard changes and close anyway?</source> - <translation>"%1" on muokkaustilassa. -Hylkää muutokset ja sulje?</translation> - </message> - <message> - <source>Export database to CSV file</source> - <translation>Vie tietokanta CSV-tiedostoon</translation> - </message> - <message> - <source>CSV file</source> - <translation>CSV-tiedosto</translation> - </message> - <message> - <source>Writing the CSV file failed.</source> - <translation>CSV-tiedoston kirjoitus levylle epäonnistui.</translation> - </message> - <message> - <source>Unable to open the database.</source> - <translation>Tietokannan avaaminen ei onnistunut.</translation> - </message> - <message> - <source>Merge database</source> - <translation>Yhdistä tietokanta</translation> - </message> - <message> - <source>The database you are trying to save as is locked by another instance of KeePassXC. -Do you want to save it anyway?</source> - <translation>Tietokanta jota yrität avata on avoinna toisessa KeePassXC-ikkunassa. -Haluatko tallentaa tietokannan siitä huolimatta?</translation> - </message> - <message> - <source>Passwords</source> - <translation>Salasanat</translation> - </message> - <message> - <source>Database already opened</source> - <translation>Tietokanta on jo avattu</translation> - </message> - <message> - <source>The database you are trying to open is locked by another instance of KeePassXC. - -Do you want to open it anyway?</source> - <translation>Tietokanta, jota yrität avata, on jo avattu toisessa KeePassXC-instanssissa. - -Haluatko avata tietokannan silti?</translation> - </message> - <message> - <source>Open read-only</source> - <translation>Avaa "vain luku"-tilassa</translation> - </message> - <message> - <source>File opened in read only mode.</source> - <translation>Tiedosto on avattu "vain luku"-tilassa.</translation> - </message> - <message> - <source>Open CSV file</source> - <translation>Avaa CSV-tiedosto</translation> - </message> </context> <context> <name>DatabaseWidget</name> + <message> + <source>Searching...</source> + <translation>Etsitään...</translation> + </message> <message> <source>Change master key</source> <translation>Vaihda pääsalasana</translation> @@ -658,13 +1042,33 @@ Haluatko avata tietokannan silti?</translation> <source>Do you really want to delete %1 entries for good?</source> <translation>Haluatko varmasti poistaa alkiot %1, lopullisesti?</translation> </message> + <message> + <source>Move entry to recycle bin?</source> + <translation>Siirrä merkintä roskakoriin?</translation> + </message> + <message> + <source>Do you really want to move entry "%1" to the recycle bin?</source> + <translation>Haluatko varmasti siirtää tietueen "%1" roskakoriin?</translation> + </message> <message> <source>Move entries to recycle bin?</source> <translation>Siirrä alkiot roskakoriin?</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>Haluatko varmasti siirtää %n kappaletta alkioita roskakoriin?</numerusform><numerusform>Haluatko varmasti siirtää %n merkintää roskakoriin?</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Execute command?</source> + <translation>Suorita komento?</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation>Haluatko varmasti suorittaa seuraavan komennon?<br><br>%1<br></translation> + </message> + <message> + <source>Remember my choice</source> + <translation>Muista valintani</translation> </message> <message> <source>Delete group?</source> @@ -678,18 +1082,6 @@ Haluatko avata tietokannan silti?</translation> <source>Unable to calculate master key</source> <translation>Pääavaimen laskeminen ei onnistu</translation> </message> - <message> - <source>Move entry to recycle bin?</source> - <translation>Siirrä merkintä roskakoriin?</translation> - </message> - <message> - <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation>Haluatko varmasti siirtää tietueen "%1" roskakoriin?</translation> - </message> - <message> - <source>Searching...</source> - <translation>Etsitään...</translation> - </message> <message> <source>No current database.</source> <translation>Ei nykyistä tietokantaa.</translation> @@ -707,20 +1099,8 @@ Haluatko avata tietokannan silti?</translation> <translation>Ei tuloksia.</translation> </message> <message> - <source>Execute command?</source> - <translation>Suorita komento?</translation> - </message> - <message> - <source>Do you really want to execute the following command?<br><br>%1<br></source> - <translation>Haluatko varmasti suorittaa seuraavan komennon?<br><br>%1<br></translation> - </message> - <message> - <source>Remember my choice</source> - <translation>Muista valintani</translation> - </message> - <message> - <source>Autoreload Request</source> - <translation>Automaattilatauksen pyyntö</translation> + <source>File has changed</source> + <translation type="unfinished"/> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -731,8 +1111,10 @@ Haluatko avata tietokannan silti?</translation> <translation>Yhdistämispyyntö</translation> </message> <message> - <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> - <translation>Tietokantatiedosto on muuttunut ja sinulla on tallentamattomia muutoksia. Haluatko yhdistää tekemäsi muutokset?</translation> + <source>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</source> + <translation>Tietokantatiedosto on muuttunut, ja sinulla on tallentamattomia muutoksia. +Haluatko yhdistää muutoksesi?</translation> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -747,6 +1129,89 @@ Haluatko avata tietokannan silti?</translation> <translation>Haluatko varmasti tyhjentää kaiken pysyvästi roskakorista?</translation> </message> </context> +<context> + <name>DetailsWidget</name> + <message> + <source>Generate TOTP Token</source> + <translation type="unfinished"/> + </message> + <message> + <source>Close</source> + <translation>Sulje</translation> + </message> + <message> + <source>General</source> + <translation>Yleistä</translation> + </message> + <message> + <source>Password</source> + <translation>Salasana</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Expiration</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username</source> + <translation>Käyttäjätunnus</translation> + </message> + <message> + <source>Autotype</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searching</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attributes</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation>Liitteet</translation> + </message> + <message> + <source>Notes</source> + <translation>Muistiinpanot</translation> + </message> + <message> + <source>Window</source> + <translation>Ikkuna</translation> + </message> + <message> + <source>Sequence</source> + <translation>Sekvenssi</translation> + </message> + <message> + <source>Search</source> + <translation>Etsi</translation> + </message> + <message> + <source>Clear</source> + <translation>Tyhjennä</translation> + </message> + <message> + <source>Never</source> + <translation>Ei koskaan</translation> + </message> + <message> + <source>[PROTECTED]</source> + <translation>[SUOJATTU]</translation> + </message> + <message> + <source>Disabled</source> + <translation>Pois käytöstä</translation> + </message> + <message> + <source>Enabled</source> + <translation>Käytössä</translation> + </message> +</context> <context> <name>EditEntryWidget</name> <message> @@ -773,6 +1238,30 @@ Haluatko avata tietokannan silti?</translation> <source>History</source> <translation>Historia</translation> </message> + <message> + <source>SSH Agent</source> + <translation>SSH-agentti</translation> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>(encrypted)</source> + <translation>(salattu)</translation> + </message> + <message> + <source>Select private key</source> + <translation>Valitse yksityinen avain</translation> + </message> + <message> + <source>File too large to be a private key</source> + <translation>Tiedosto on liian suuri ollakseen yksityinen avain</translation> + </message> + <message> + <source>Failed to open private key</source> + <translation>Yksityisen avaimen avaaminen epäonnistui</translation> + </message> <message> <source>Entry history</source> <translation>Alkioiden historia</translation> @@ -793,40 +1282,6 @@ Haluatko avata tietokannan silti?</translation> <source>New attribute</source> <translation>Uusi attribuutti</translation> </message> - <message> - <source>Select file</source> - <translation>Valitse tiedosto</translation> - </message> - <message> - <source>Unable to open file</source> - <translation>Tiedoston avaus ei onnistu</translation> - </message> - <message> - <source>Save attachment</source> - <translation>Tallenna liite</translation> - </message> - <message> - <source>Unable to save the attachment: -</source> - <translation>Liitteen tallentaminen ei onnistu: -</translation> - </message> - <message> - <source>Tomorrow</source> - <translation>Huomenna</translation> - </message> - <message numerus="yes"> - <source>%n week(s)</source> - <translation><numerusform>%n viikkoa</numerusform><numerusform>%n viikkoa</numerusform></translation> - </message> - <message numerus="yes"> - <source>%n month(s)</source> - <translation><numerusform>%n kuukautta</numerusform><numerusform>%n kuukautta</numerusform></translation> - </message> - <message> - <source>1 year</source> - <translation>1 vuosi</translation> - </message> <message> <source>Confirm Remove</source> <translation>Vahvista poisto</translation> @@ -836,12 +1291,28 @@ Haluatko avata tietokannan silti?</translation> <translation>Haluatko varmasti poistaa tämän attribuutin?</translation> </message> <message> - <source>[PROTECTED] Press reveal to view or edit</source> + <source>[PROTECTED]</source> + <translation>[SUOJATTU]</translation> + </message> + <message> + <source>Press reveal to view or edit</source> <translation type="unfinished"/> </message> <message> - <source>Are you sure you want to remove this attachment?</source> - <translation>Haluatko varmasti poistaa tämän liitteen?</translation> + <source>Tomorrow</source> + <translation>Huomenna</translation> + </message> + <message numerus="yes"> + <source>%n week(s)</source> + <translation><numerusform>%n viikko</numerusform><numerusform>%n viikkoa</numerusform></translation> + </message> + <message numerus="yes"> + <source>%n month(s)</source> + <translation><numerusform>%n kuukausi</numerusform><numerusform>%n kuukautta</numerusform></translation> + </message> + <message> + <source>1 year</source> + <translation>1 vuosi</translation> </message> </context> <context> @@ -858,18 +1329,6 @@ Haluatko avata tietokannan silti?</translation> <source>Remove</source> <translation>Poista</translation> </message> - <message> - <source>Attachments</source> - <translation>Liitteet</translation> - </message> - <message> - <source>Save</source> - <translation>Tallenna</translation> - </message> - <message> - <source>Open</source> - <translation>Avaa</translation> - </message> <message> <source>Edit Name</source> <translation>Muokkaa nimeä</translation> @@ -882,6 +1341,10 @@ Haluatko avata tietokannan silti?</translation> <source>Reveal</source> <translation>Paljasta</translation> </message> + <message> + <source>Attachments</source> + <translation>Liitteet</translation> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -889,6 +1352,18 @@ Haluatko avata tietokannan silti?</translation> <source>Enable Auto-Type for this entry</source> <translation>Salli automaattitäydennys tälle merkinnälle</translation> </message> + <message> + <source>Inherit default Auto-Type sequence from the &group</source> + <translation>Peri automaattitäydennyksen oletussekvenssi &ryhmältä</translation> + </message> + <message> + <source>&Use custom Auto-Type sequence:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Window Associations</source> + <translation type="unfinished"/> + </message> <message> <source>+</source> <translation>+</translation> @@ -901,25 +1376,13 @@ Haluatko avata tietokannan silti?</translation> <source>Window title:</source> <translation>Ikkunan otsikko:</translation> </message> - <message> - <source>Inherit default Auto-Type sequence from the &group</source> - <translation>Peri automaattitäydennyksen oletussekvenssi &ryhmältä</translation> - </message> - <message> - <source>&Use custom Auto-Type sequence:</source> - <translation type="unfinished"/> - </message> <message> <source>Use default se&quence</source> - <translation type="unfinished"/> + <translation>Käytä oletuss&ekvenssiä</translation> </message> <message> <source>Set custo&m sequence:</source> - <translation type="unfinished"/> - </message> - <message> - <source>Window Associations</source> - <translation type="unfinished"/> + <translation>Aseta mukautettu se&kvenssi:</translation> </message> </context> <context> @@ -944,12 +1407,8 @@ Haluatko avata tietokannan silti?</translation> <context> <name>EditEntryWidgetMain</name> <message> - <source>Title:</source> - <translation>Otsikko:</translation> - </message> - <message> - <source>Username:</source> - <translation>Käyttäjänimi</translation> + <source>URL:</source> + <translation>URL:</translation> </message> <message> <source>Password:</source> @@ -960,20 +1419,104 @@ Haluatko avata tietokannan silti?</translation> <translation>Toista:</translation> </message> <message> - <source>URL:</source> - <translation>URL:</translation> + <source>Title:</source> + <translation>Otsikko:</translation> </message> <message> - <source>Expires</source> - <translation>Erääntyy</translation> + <source>Notes</source> + <translation>Muistiinpanot</translation> </message> <message> <source>Presets</source> <translation>Esiasetus</translation> </message> <message> - <source>Notes:</source> - <translation>Muistiinpanot:</translation> + <source>Toggle the checkbox to reveal the notes section.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username:</source> + <translation>Käyttäjänimi</translation> + </message> + <message> + <source>Expires</source> + <translation>Erääntyy</translation> + </message> +</context> +<context> + <name>EditEntryWidgetSSHAgent</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent after</source> + <translation>Poista avain agentilta viiveellä</translation> + </message> + <message> + <source> seconds</source> + <translation>s</translation> + </message> + <message> + <source>Fingerprint</source> + <translation>Sormenjälki</translation> + </message> + <message> + <source>Remove key from agent when database is closed/locked</source> + <translation>Poista avain agentista kun tietokanta on suljettu/lukittu</translation> + </message> + <message> + <source>Public key</source> + <translation>Julkinen avain</translation> + </message> + <message> + <source>Add key to agent when database is opened/unlocked</source> + <translation>Lisää avain agenttiin kun tietokanta on avattu/lukitus avattu</translation> + </message> + <message> + <source>Comment</source> + <translation>Kommentti</translation> + </message> + <message> + <source>Decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy to clipboard</source> + <translation>Kopioi leikepöydälle</translation> + </message> + <message> + <source>Private key</source> + <translation>Yksityinen avain</translation> + </message> + <message> + <source>External file</source> + <translation>Ulkoinen tiedosto</translation> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Selaa...</translation> + </message> + <message> + <source>Attachment</source> + <translation>Liite</translation> + </message> + <message> + <source>Add to agent</source> + <translation>Lisää agenttiin</translation> + </message> + <message> + <source>Remove from agent</source> + <translation>Poista agentista</translation> + </message> + <message> + <source>Require user confirmation when this key is used</source> + <translation>Vaadi käyttäjävahvistusta kun avainta käytetään</translation> </message> </context> <context> @@ -1044,6 +1587,14 @@ Haluatko avata tietokannan silti?</translation> </context> <context> <name>EditWidgetIcons</name> + <message> + <source>&Use default icon</source> + <translation>&Käytä oletuskuvaketta</translation> + </message> + <message> + <source>Use custo&m icon</source> + <translation>Kä&ytä mukautettua kuvaketta</translation> + </message> <message> <source>Add custom icon</source> <translation>Lisää mukautettu kuvake</translation> @@ -1052,6 +1603,18 @@ Haluatko avata tietokannan silti?</translation> <source>Delete custom icon</source> <translation>Poista mukautettu kuvake</translation> </message> + <message> + <source>Download favicon</source> + <translation>Lataa favicon</translation> + </message> + <message> + <source>Unable to fetch favicon.</source> + <translation>Faviconin noutaminen ei onnistu</translation> + </message> + <message> + <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> + <translation>Vinkki: voit asettaa Googlen varajärjestelmäksi kohdassa Työkalut > Asetukset > Turvallisuus</translation> + </message> <message> <source>Images</source> <translation>Kuvat</translation> @@ -1064,25 +1627,13 @@ Haluatko avata tietokannan silti?</translation> <source>Select Image</source> <translation>Valitse kuva</translation> </message> - <message> - <source>Download favicon</source> - <translation>Lataa favicon</translation> - </message> - <message> - <source>Unable to fetch favicon.</source> - <translation>Faviconin noutaminen ei onnistu</translation> - </message> <message> <source>Can't read icon</source> <translation>Kuvaketta ei voida lukea</translation> </message> <message> - <source>&Use default icon</source> - <translation>&Käytä oletuskuvaketta</translation> - </message> - <message> - <source>Use custo&m icon</source> - <translation>Kä&ytä mukautettua kuvaketta</translation> + <source>Custom icon already exists</source> + <translation>Mukautettu kuvake on jo olemassa</translation> </message> <message> <source>Confirm Delete</source> @@ -1092,14 +1643,6 @@ Haluatko avata tietokannan silti?</translation> <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> <translation>Tämä kuvake on %1 tietueen käytössä, ja se korvataan oletuskuvakkeella. Haluatko varmasti poistaa tämän kuvakkeen?</translation> </message> - <message> - <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation>Vinkki: voit asettaa Googlen varajärjestelmäksi kohdassa Työkalut > Asetukset > Turvallisuus</translation> - </message> - <message> - <source>Custom icon already exists</source> - <translation type="unfinished"/> - </message> </context> <context> <name>EditWidgetProperties</name> @@ -1124,9 +1667,98 @@ Haluatko avata tietokannan silti?</translation> <name>Entry</name> <message> <source> - Clone</source> + <comment>Suffix added to cloned entries</comment> <translation>- Klooni</translation> </message> </context> +<context> + <name>EntryAttachmentsModel</name> + <message> + <source>Name</source> + <translation>Nimi</translation> + </message> + <message> + <source>Size</source> + <translation>Koko</translation> + </message> +</context> +<context> + <name>EntryAttachmentsWidget</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add</source> + <translation>Lisää</translation> + </message> + <message> + <source>Remove</source> + <translation>Poista</translation> + </message> + <message> + <source>Open</source> + <translation>Avaa</translation> + </message> + <message> + <source>Save</source> + <translation>Tallenna</translation> + </message> + <message> + <source>Select files</source> + <translation>Valitse tiedostot</translation> + </message> + <message numerus="yes"> + <source>Are you sure you want to remove %n attachment(s)?</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>Vahvista poisto</translation> + </message> + <message> + <source>Save attachments</source> + <translation>Tallenna liitteet</translation> + </message> + <message> + <source>Unable to create directory: +%1</source> + <translation>Hakemiston luominen epäonnistui: +%1</translation> + </message> + <message> + <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Confirm overwrite</source> + <translation>Vahvista korvaaminen</translation> + </message> + <message> + <source>Unable to save attachments: +%1</source> + <translation>Liitteiden tallentaminen epäonnistui: +%1</translation> + </message> + <message> + <source>Unable to open attachment: +%1</source> + <translation>Liitteen avaaminen epäonnistui: +%1</translation> + </message> + <message> + <source>Unable to open attachments: +%1</source> + <translation>Liitteiden avaaminen epäonnistui: +%1</translation> + </message> + <message> + <source>Unable to open files: +%1</source> + <translation>Tiedostojen avaaminen epäonnistui: +%1</translation> + </message> +</context> <context> <name>EntryAttributesModel</name> <message> @@ -1155,6 +1787,11 @@ Haluatko avata tietokannan silti?</translation> </context> <context> <name>EntryModel</name> + <message> + <source>Ref: </source> + <comment>Reference abbreviation</comment> + <translation type="unfinished"/> + </message> <message> <source>Group</source> <translation>Ryhmä</translation> @@ -1171,11 +1808,6 @@ Haluatko avata tietokannan silti?</translation> <source>URL</source> <translation>URL</translation> </message> - <message> - <source>Ref: </source> - <comment>Reference abbreviation</comment> - <translation type="unfinished"/> - </message> </context> <context> <name>Group</name> @@ -1184,6 +1816,17 @@ Haluatko avata tietokannan silti?</translation> <translation>Roskakori</translation> </message> </context> +<context> + <name>HostInstaller</name> + <message> + <source>KeePassXC: Cannot save file!</source> + <translation>KeePassXC: Tiedostoa ei voi tallentaa!</translation> + </message> + <message> + <source>Cannot save the native messaging script file.</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>HttpPasswordGeneratorWidget</name> <message> @@ -1246,6 +1889,358 @@ Haluatko avata tietokannan silti?</translation> <translation>Sulje viesti</translation> </message> </context> +<context> + <name>Kdbx3Reader</name> + <message> + <source>Unable to calculate master key</source> + <translation>Pääavaimen laskeminen ei onnistu</translation> + </message> + <message> + <source>Unable to issue challenge-response.</source> + <translation>Haaste-vastauksen tekeminen epäonnistui.</translation> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>Väärä avain tai tietokanta on korruptoitunut.</translation> + </message> +</context> +<context> + <name>Kdbx3Writer</name> + <message> + <source>Unable to issue challenge-response.</source> + <translation>Haaste-vastauksen tekeminen epäonnistui.</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Pääavaimen laskeminen ei onnistu</translation> + </message> +</context> +<context> + <name>Kdbx4Reader</name> + <message> + <source>missing database headers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Pääavaimen laskeminen ei onnistu</translation> + </message> + <message> + <source>Invalid header checksum size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Header SHA256 mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> + <translation>Väärä avain tai tietokantatiedosto on rikki. (HMAC ei täsmää)</translation> + </message> + <message> + <source>Unknown cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header data length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open buffer for KDF parameters in header</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported key derivation function (KDF) or invalid parameters</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy header fields found in KDBX4 file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header binary size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass variant map version.</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name data</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value data</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Bool entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry type</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map field type size</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Kdbx4Writer</name> + <message> + <source>Invalid symmetric cipher algorithm.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid symmetric cipher IV size.</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Pääavaimen laskeminen ei onnistu</translation> + </message> + <message> + <source>Failed to serialize KDF parameters variant map</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxReader</name> + <message> + <source>Invalid cipher uuid length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid compression flags length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported compression algorithm</source> + <translation>Ei-tuettu pakkausalgoritmi</translation> + </message> + <message> + <source>Invalid master seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform rounds size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid start bytes size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid random stream id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner random stream cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>Tiedosto ei ole KeePass-tietokanta</translation> + </message> + <message> + <source>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass 2 database version.</source> + <translation>Ei-tuettu KeePass 2 -tietokantaversio.</translation> + </message> +</context> +<context> + <name>KdbxXmlReader</name> + <message> + <source>XML parsing failure: %1</source> + <translation>XML-jäsentämisen virhe: %1</translation> + </message> + <message> + <source>No root group</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing icon uuid or data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing custom data key or value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Multiple group elements</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null group uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableAutoType value</source> + <translation>Virheellinen EnableAutoType-arvo</translation> + </message> + <message> + <source>Invalid EnableSearching value</source> + <translation>Virheellinen EnableSearching-arvo</translation> + </message> + <message> + <source>No group uuid found</source> + <translation>Ryhmän uuid:tä ei löydy</translation> + </message> + <message> + <source>Null DeleteObject uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing DeletedObject uuid or time</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null entry uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element in history entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>No entry uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element with different uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decrypt entry string</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate custom attribute found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry string key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate attachment found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry binary key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-type association window or sequence missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid bool value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid date time value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color value</source> + <translation>Virheellinen väriarvo</translation> + </message> + <message> + <source>Invalid color rgb part</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number value</source> + <translation>Virheellinen numeroarvo</translation> + </message> + <message> + <source>Invalid uuid value</source> + <translation>Virheellinen uuid-arvo</translation> + </message> + <message> + <source>Unable to decompress binary</source> + <extracomment>Translator meant is a binary data inside an entry</extracomment> + <translation type="unfinished"/> + </message> +</context> <context> <name>KeePass1OpenWidget</name> <message> @@ -1254,7 +2249,7 @@ Haluatko avata tietokannan silti?</translation> </message> <message> <source>Unable to open the database.</source> - <translation>Tietokannan avaaminen ei onnistunut.</translation> + <translation>Tietokannan avaaminen epäonnistui.</translation> </message> </context> <context> @@ -1275,6 +2270,35 @@ Haluatko avata tietokannan silti?</translation> <source>Unsupported KeePass database version.</source> <translation>Tukematon KeePass-tietokantaversio</translation> </message> + <message> + <source>Unable to read encryption IV</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of groups</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid content hash size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of transform rounds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to construct group tree</source> + <translation type="unfinished"/> + </message> <message> <source>Root</source> <translation>Juuri</translation> @@ -1287,58 +2311,105 @@ Haluatko avata tietokannan silti?</translation> <source>Wrong key or database file is corrupt.</source> <translation>Väärä avain tai tietokanta on korruptoitunut.</translation> </message> -</context> -<context> - <name>KeePass2Reader</name> <message> - <source>Not a KeePass database.</source> - <translation>Tiedosto ei ole KeePass-tietokanta</translation> - </message> - <message> - <source>Unsupported KeePass database version.</source> - <translation>Tukematon KeePass-tietokantaversio</translation> - </message> - <message> - <source>Wrong key or database file is corrupt.</source> - <translation>Väärä avain tai tietokanta on korruptoitunut.</translation> - </message> - <message> - <source>Unable to calculate master key</source> - <translation>Pääavaimen laskeminen ei onnistu</translation> - </message> - <message> - <source>Unable to issue challenge-response.</source> + <source>Key transformation failed</source> <translation type="unfinished"/> </message> <message> - <source>The selected file is an old KeePass 1 database (.kdb). - -You can import it by clicking on Database > 'Import KeePass 1 database...'. -This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> - <translation type="unfinished"/> - </message> -</context> -<context> - <name>KeePass2Writer</name> - <message> - <source>Unable to issue challenge-response.</source> + <source>Invalid group field type number</source> <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>Pääavaimen laskeminen ei onnistu</translation> + <source>Invalid group field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read group field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group access time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group level field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing group id or level</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing entry field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read entry field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry uuid field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field type</source> + <translation type="unfinished"/> </message> </context> <context> <name>Main</name> <message> - <source>Fatal error while testing the cryptographic functions.</source> + <source>Existing single-instance lock file is invalid. Launching new instance.</source> <translation type="unfinished"/> </message> - <message> - <source>KeePassXC - Error</source> - <translation>KeePassXC - Virhe</translation> - </message> <message> <source>The lock file could not be created. Single-instance mode disabled.</source> <translation type="unfinished"/> @@ -1348,64 +2419,32 @@ This is a one-way migration. You won't be able to open the imported databas <translation>Toinen KeePassXC-instanssi on jo käynnissä.</translation> </message> <message> - <source>Existing single-instance lock file is invalid. Launching new instance.</source> + <source>Fatal error while testing the cryptographic functions.</source> <translation type="unfinished"/> </message> + <message> + <source>KeePassXC - Error</source> + <translation>KeePassXC - Virhe</translation> + </message> </context> <context> <name>MainWindow</name> <message> - <source>Open database</source> - <translation>Avaa tietokanta</translation> - </message> - <message> - <source>Database settings</source> - <translation>Tietokannan asetukset</translation> - </message> - <message> - <source>Copy username to clipboard</source> - <translation>Kopioi käyttäjätunnus leikepöydälle</translation> - </message> - <message> - <source>Copy password to clipboard</source> - <translation>Kopioi salasana leikepöydälle</translation> - </message> - <message> - <source>Settings</source> - <translation>Asetukset</translation> - </message> - <message> - <source>Show toolbar</source> - <translation>Näytä työkalupalkki</translation> - </message> - <message> - <source>read-only</source> - <translation>vain-luku</translation> - </message> - <message> - <source>Toggle window</source> - <translation type="unfinished"/> - </message> - <message> - <source>KeePass 2 Database</source> - <translation>Keepass 2 -tietokanta</translation> - </message> - <message> - <source>All files</source> - <translation>Kaikki tiedostot</translation> - </message> - <message> - <source>Save repaired database</source> - <translation>Tallenna korjattu tietokanta</translation> - </message> - <message> - <source>Writing the database failed.</source> - <translation>Tietokannan kirjoitus levylle epäonnistui.</translation> + <source>&Database</source> + <translation>&Tietokanta</translation> </message> <message> <source>&Recent databases</source> <translation>Viimeisimmät tietokannat</translation> </message> + <message> + <source>Import</source> + <translation>Tuo</translation> + </message> + <message> + <source>&Help</source> + <translation>&Ohje</translation> + </message> <message> <source>E&ntries</source> <translation>Ti&etueet</translation> @@ -1414,13 +2453,17 @@ This is a one-way migration. You won't be able to open the imported databas <source>Copy att&ribute to clipboard</source> <translation>Kopioi att&ribuutti leikepöydälle</translation> </message> + <message> + <source>Time-based one-time password</source> + <translation type="unfinished"/> + </message> <message> <source>&Groups</source> <translation>Ryhmät</translation> </message> <message> - <source>&View</source> - <translation>Näkymä</translation> + <source>&Tools</source> + <translation>T&yökalut</translation> </message> <message> <source>&Quit</source> @@ -1430,6 +2473,10 @@ This is a one-way migration. You won't be able to open the imported databas <source>&About</source> <translation>Tietoja</translation> </message> + <message> + <source>&Open database...</source> + <translation>&Avaa tietokanta...</translation> + </message> <message> <source>&Save database</source> <translation>Tallenna tietokanta</translation> @@ -1470,26 +2517,26 @@ This is a one-way migration. You won't be able to open the imported databas <source>&Delete group</source> <translation>Poista ryhmä</translation> </message> + <message> + <source>Sa&ve database as...</source> + <translation>Ta&llenna tietokanta nimellä...</translation> + </message> + <message> + <source>Change &master key...</source> + <translation>Vaih&da pääsalasana...</translation> + </message> <message> <source>&Database settings</source> <translation>Tietokannan asetukset</translation> </message> + <message> + <source>Database settings</source> + <translation>Tietokannan asetukset</translation> + </message> <message> <source>&Clone entry</source> <translation>Kloonaa merkintä</translation> </message> - <message> - <source>Timed one-time password</source> - <translation>Ajastettu kertakäyttöinen salasana (TOTP)</translation> - </message> - <message> - <source>Copy &TOTP</source> - <translation>Kopioi &TOTP</translation> - </message> - <message> - <source>Show TOTP</source> - <translation>Näytä TOTP</translation> - </message> <message> <source>&Find</source> <translation>Etsi</translation> @@ -1498,14 +2545,26 @@ This is a one-way migration. You won't be able to open the imported databas <source>Copy &username</source> <translation>Kopioi käyttäjätunnus</translation> </message> + <message> + <source>Copy username to clipboard</source> + <translation>Kopioi käyttäjätunnus leikepöydälle</translation> + </message> <message> <source>Cop&y password</source> <translation>Kopioi salasana</translation> </message> + <message> + <source>Copy password to clipboard</source> + <translation>Kopioi salasana leikepöydälle</translation> + </message> <message> <source>&Settings</source> <translation>Asetukset</translation> </message> + <message> + <source>Password Generator</source> + <translation>Salasanageneraattori</translation> + </message> <message> <source>&Perform Auto-Type</source> <translation>Suorita automaattitäydennys</translation> @@ -1522,65 +2581,25 @@ This is a one-way migration. You won't be able to open the imported databas <source>&Title</source> <translation>Otsikko</translation> </message> + <message> + <source>Copy title to clipboard</source> + <translation type="unfinished"/> + </message> <message> <source>&URL</source> <translation>URL</translation> </message> + <message> + <source>Copy URL to clipboard</source> + <translation>Kopioi osoite leikepöydälle</translation> + </message> <message> <source>&Notes</source> <translation>Muistiinpanot</translation> </message> <message> - <source>Password Generator</source> - <translation>Salasanageneraattori</translation> - </message> - <message> - <source>Clear history</source> - <translation>Tyhjennä historia</translation> - </message> - <message> - <source>&Database</source> - <translation>&Tietokanta</translation> - </message> - <message> - <source>Import</source> - <translation>Tuo</translation> - </message> - <message> - <source>&Tools</source> - <translation>T&yökalut</translation> - </message> - <message> - <source>Empty recycle bin</source> - <translation>Tyhjennä roskakori</translation> - </message> - <message> - <source>Access error for config file %1</source> - <translation>Pääsyvirhe asetustiedostoon %1</translation> - </message> - <message> - <source>Quit KeePassXC</source> - <translation>Sulje KeePassXC</translation> - </message> - <message> - <source>Please touch the button on your YubiKey!</source> - <translation>Kosketa YubiKeyssa olevaa painiketta!</translation> - </message> - <message> - <source>&Help</source> - <translation>&Ohje</translation> - </message> - <message> - <source>&Open database...</source> - <translation>&Avaa tietokanta...</translation> - </message> - <message> - <source>Sa&ve database as...</source> - <translation>Ta&llenna tietokanta nimellä...</translation> - </message> - <message> - <source>Change &master key...</source> - <translation>Vaih&da pääsalasana...</translation> + <source>Copy notes to clipboard</source> + <translation type="unfinished"/> </message> <message> <source>&Export to CSV file...</source> @@ -1598,10 +2617,169 @@ This is a one-way migration. You won't be able to open the imported databas <source>Re&pair database...</source> <translation>Ko&rjaa tietokanta...</translation> </message> + <message> + <source>Show TOTP</source> + <translation>Näytä TOTP</translation> + </message> <message> <source>Set up TOTP...</source> <translation>Aseta TOTP...</translation> </message> + <message> + <source>Copy &TOTP</source> + <translation>Kopioi &TOTP</translation> + </message> + <message> + <source>E&mpty recycle bin</source> + <translation>&Tyhjennä roskakori</translation> + </message> + <message> + <source>Clear history</source> + <translation>Tyhjennä historia</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation>Pääsyvirhe asetustiedostoon %1</translation> + </message> + <message> + <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> + <translation type="unfinished"/> + </message> + <message> + <source>read-only</source> + <translation>vain-luku</translation> + </message> + <message> + <source>Settings</source> + <translation>Asetukset</translation> + </message> + <message> + <source>Toggle window</source> + <translation type="unfinished"/> + </message> + <message> + <source>Quit KeePassXC</source> + <translation>Sulje KeePassXC</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>KeePass 2 -tietokanta</translation> + </message> + <message> + <source>All files</source> + <translation>Kaikki tiedostot</translation> + </message> + <message> + <source>Open database</source> + <translation>Avaa tietokanta</translation> + </message> + <message> + <source>Save repaired database</source> + <translation>Tallenna korjattu tietokanta</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>Tietokannan kirjoitus levylle epäonnistui.</translation> + </message> + <message> + <source>Please touch the button on your YubiKey!</source> + <translation>Kosketa YubiKeyssa olevaa painiketta!</translation> + </message> +</context> +<context> + <name>OpenSSHKey</name> + <message> + <source>Invalid key file, expecting an OpenSSH key</source> + <translation>Virheellinen avaintiedosto, odotetaan OpenSSH-avainta</translation> + </message> + <message> + <source>PEM boundary mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>This is not an OpenSSH key, only modern keys are supported</source> + <translation type="unfinished"/> + </message> + <message> + <source>Base64 decoding failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file way too small.</source> + <translation>Avaintiedosto aivan liian pieni.</translation> + </message> + <message> + <source>Key file magic header id invalid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Found zero keys</source> + <translation>Löytyi nolla avainta</translation> + </message> + <message> + <source>Failed to read public key.</source> + <translation>Julkisen avaimen lukeminen epäonnistui.</translation> + </message> + <message> + <source>Corrupted key file, reading private key failed</source> + <translation>Rikkinäinen avaintiedosto, yksityisen avaimen lukeminen epäonnistui</translation> + </message> + <message> + <source>No private key payload to decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Trying to run KDF without cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Passphrase is required to decrypt this key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key derivation failed, key file corrupted?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Decryption failed, wrong passphrase?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading public key</source> + <translation>Odottamaton EOF julkista avainta luettaessa</translation> + </message> + <message> + <source>Unknown key type: </source> + <translation>Tuntematon avaintyyppi:</translation> + </message> + <message> + <source>Unexpected EOF while reading private key</source> + <translation>Odottamaton EOF yksityistä avainta luettaessa</translation> + </message> + <message> + <source>Can't write public key as it is empty</source> + <translation>Ei voida kirjoittaa julkista avainta, koska se on tyhjä</translation> + </message> + <message> + <source>Unexpected EOF when writing public key</source> + <translation>Odottamaton EOF julkista avainta kirjoittaessa</translation> + </message> + <message> + <source>Can't write private key as it is empty</source> + <translation>Ei voida kirjoittaa yksityistä avainta, koska se on tyhjä</translation> + </message> + <message> + <source>Unexpected EOF when writing private key</source> + <translation>Odottamaton EOF yksityistä avainta kirjoittaessa</translation> + </message> </context> <context> <name>OptionDialog</name> @@ -1609,25 +2787,66 @@ This is a one-way migration. You won't be able to open the imported databas <source>Dialog</source> <translation>Dialogi</translation> </message> + <message> + <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation>Tämä vaaditaan, jotta tietokantoja voidaan käyttää ChromeIPassilla or PassIFoxilla</translation> + </message> + <message> + <source>Enable KeePassHTTP server</source> + <translation>Ota käyttöön KeePassHTTP-palvelin</translation> + </message> <message> <source>General</source> <translation>Yleistä</translation> </message> <message> <source>Sh&ow a notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> <translation>Nä&ytä ilmoitus kun tilitietoja pyydetään</translation> </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return only best matching entries</source> + <translation>&Palauta vain parhaiten vastaavat tietueet</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Pyyd&ä tietokannan lukituksen avaamista jos se on lukittu</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> + <translation>Vain tietueet samalla skeemalla (http://, https://, ftp://, ...) palautetaan.</translation> + </message> + <message> + <source>&Match URL schemes</source> + <translation type="unfinished"/> + </message> <message> <source>Sort matching entries by &username</source> <translation type="unfinished"/> </message> + <message> + <source>Sort &matching entries by title</source> + <translation type="unfinished"/> + </message> + <message> + <source>R&emove all shared encryption keys from active database</source> + <translation>&Poista kaikki jaetut salausavaimet aktiivisesta tietokannasta</translation> + </message> <message> <source>Re&move all stored permissions from entries in active database</source> <translation type="unfinished"/> </message> + <message> + <source>Password Generator</source> + <translation>Salasanageneraattori</translation> + </message> <message> <source>Advanced</source> - <translation>Lisää..</translation> + <translation>Lisäasetukset</translation> </message> <message> <source>Always allow &access to entries</source> @@ -1637,10 +2856,22 @@ This is a one-way migration. You won't be able to open the imported databas <source>Always allow &updating entries</source> <translation>Salli aina tietueiden p&äivittäminen</translation> </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>Vain valittu tietokanta tulee olla yhdistetty asiakkaan kanssa.</translation> + </message> <message> <source>Searc&h in all opened databases for matching entries</source> <translation>E&tsi kaikista avatuista tietokannoista vastaavia tietueita</translation> </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation type="unfinished"/> + </message> <message> <source>HTTP Port:</source> <translation>HTTP-portti:</translation> @@ -1649,18 +2880,18 @@ This is a one-way migration. You won't be able to open the imported databas <source>Default port: 19455</source> <translation>Oletusportti: 19455</translation> </message> - <message> - <source>Re&quest to unlock the database if it is locked</source> - <translation>Pyyd&ä tietokannan lukituksen avaamista jos se on lukittu</translation> - </message> - <message> - <source>Sort &matching entries by title</source> - <translation type="unfinished"/> - </message> <message> <source>KeePassXC will listen to this port on 127.0.0.1</source> <translation>KeePassXC kuuntelee tätä porttia osoitteessa 127.0.0.1</translation> </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation><b>Varoitus:</b> Seuraavat valinnat voivat olla vaarallisia!</translation> + </message> + <message> + <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> + <translation><p>KeePassHTTP on vanhennettu ja se poistetaan tulevaisuudessa.<br>Vaihda KeePassXC-Browseriin! Ohjeita siirtymiseen on tarjolla <a href="https://keepassxc.org/docs/keepassxc-browser-migration">siirtymäohjeessa</a>.</p></translation> + </message> <message> <source>Cannot bind to privileged ports</source> <translation>Ei voida sitoutua etuoikeutettuihin portteihin</translation> @@ -1671,63 +2902,30 @@ Using default port 19455.</source> <translation>Ei voida sitoutua etuoikeutettuihin portteihin, jotka ovat alle 1024! Käytetään oletusporttia 19455.</translation> </message> - <message> - <source>R&emove all shared encryption keys from active database</source> - <translation>&Poista kaikki jaetut salausavaimet aktiivisesta tietokannasta</translation> - </message> - <message> - <source>&Return advanced string fields which start with "KPH: "</source> - <translation type="unfinished"/> - </message> - <message> - <source>Automatically creating or updating string fields is not supported.</source> - <translation type="unfinished"/> - </message> - <message> - <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> - <translation>Tämä vaaditaan, jotta tietokantoja voidaan käyttää ChromeIPassilla or PassIFoxilla</translation> - </message> - <message> - <source>Enable KeePassHTTP server</source> - <translation>Ota käyttöön KeePassHTTP-palvelin</translation> - </message> - <message> - <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Return only best matching entries</source> - <translation>&Palauta vain parhaiten vastaavat tietueet</translation> - </message> - <message> - <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation>Vain tietueet samalla skeemalla (http://, https://, ftp://, ...) palautetaan.</translation> - </message> - <message> - <source>&Match URL schemes</source> - <translation type="unfinished"/> - </message> - <message> - <source>Password Generator</source> - <translation>Salasanageneraattori</translation> - </message> - <message> - <source>Only the selected database has to be connected with a client.</source> - <translation type="unfinished"/> - </message> - <message> - <source>The following options can be dangerous! -Change them only if you know what you are doing.</source> - <translation>Seuraavat valinnat voivat olla vaarallisia! -Muuta niitä vain, jos tiedät mitä olet tekemässä.</translation> - </message> </context> <context> <name>PasswordGeneratorWidget</name> + <message> + <source>%p%</source> + <translation type="unfinished"/> + </message> <message> <source>Password:</source> <translation>Salasana</translation> </message> + <message> + <source>strength</source> + <comment>Password strength</comment> + <translation>vahvuus</translation> + </message> + <message> + <source>entropy</source> + <translation>entropia</translation> + </message> + <message> + <source>Password</source> + <translation>Salasana</translation> + </message> <message> <source>Character Types</source> <translation>Merkkityypit</translation> @@ -1748,38 +2946,50 @@ Muuta niitä vain, jos tiedät mitä olet tekemässä.</translation> <source>Special Characters</source> <translation>Erikoismerkit</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>Laajennettu ASCII</translation> + </message> <message> <source>Exclude look-alike characters</source> <translation>Poissulje samannäköiset merkit</translation> </message> - <message> - <source>Accept</source> - <translation>Hyväksy</translation> - </message> - <message> - <source>%p%</source> - <translation type="unfinished"/> - </message> - <message> - <source>strength</source> - <translation>vahvuus</translation> - </message> - <message> - <source>entropy</source> - <translation>entropia</translation> - </message> - <message> - <source>&Length:</source> - <translation>&Pituus:</translation> - </message> <message> <source>Pick characters from every group</source> <translation>Poimi merkkejä jokaisesta ryhmästä</translation> </message> + <message> + <source>&Length:</source> + <translation>&Pituus:</translation> + </message> + <message> + <source>Passphrase</source> + <translation>Tunnuslause</translation> + </message> + <message> + <source>Wordlist:</source> + <translation>Sanalista:</translation> + </message> + <message> + <source>Word Count:</source> + <translation>Sanamäärä:</translation> + </message> + <message> + <source>Word Separator:</source> + <translation>Sanaerotin:</translation> + </message> <message> <source>Generate</source> <translation>Generoi</translation> </message> + <message> + <source>Copy</source> + <translation>Kopioi</translation> + </message> + <message> + <source>Accept</source> + <translation>Hyväksy</translation> + </message> <message> <source>Close</source> <translation>Sulje</translation> @@ -1798,51 +3008,273 @@ Muuta niitä vain, jos tiedät mitä olet tekemässä.</translation> </message> <message> <source>Poor</source> + <comment>Password quality</comment> <translation>Huono</translation> </message> <message> <source>Weak</source> + <comment>Password quality</comment> <translation>Heikko</translation> </message> <message> <source>Good</source> + <comment>Password quality</comment> <translation>Hyvä</translation> </message> <message> <source>Excellent</source> + <comment>Password quality</comment> <translation>Erinomainen</translation> </message> - <message> - <source>Password</source> - <translation>Salasana</translation> - </message> - <message> - <source>Extended ASCII</source> - <translation>Laajennettu ASCII</translation> - </message> - <message> - <source>Passphrase</source> - <translation>Tunnuslause</translation> - </message> - <message> - <source>Wordlist:</source> - <translation>Sanalista:</translation> - </message> - <message> - <source>Word Count:</source> - <translation>Sanamäärä:</translation> - </message> - <message> - <source>Word Separator:</source> - <translation>Sanaerotin:</translation> - </message> - <message> - <source>Copy</source> - <translation>Kopioi</translation> - </message> </context> <context> <name>QObject</name> + <message> + <source>Database not opened</source> + <translation>Tietokanta ei avattu</translation> + </message> + <message> + <source>Database hash not available</source> + <translation type="unfinished"/> + </message> + <message> + <source>Client public key not received</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot decrypt message</source> + <translation>Viestin salauksen purkaminen ei onnistu</translation> + </message> + <message> + <source>Timeout or cannot connect to KeePassXC</source> + <translation>Aikakatkaisu tai yhteys KeePassXC:hen ei onnistu</translation> + </message> + <message> + <source>Action cancelled or denied</source> + <translation>Toiminto peruttiin tai estettiin</translation> + </message> + <message> + <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> + <translation>Viestin salauksen purkaminen ei onnistu tai julkista avainta ei löydy. Onko Native Messaging käytössä KeePassXC:ssä?</translation> + </message> + <message> + <source>KeePassXC association failed, try again</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key change was not successful</source> + <translation>Avainvaihto ei onnistunut</translation> + </message> + <message> + <source>Encryption key is not recognized</source> + <translation>Salausavainta ei tunnistettu</translation> + </message> + <message> + <source>No saved databases found</source> + <translation>Tallennettuja tietokantoja ei löytynyt</translation> + </message> + <message> + <source>Incorrect action</source> + <translation>Virheellinen toiminto</translation> + </message> + <message> + <source>Empty message received</source> + <translation>Vastaanotettiin tyhjä viesti</translation> + </message> + <message> + <source>No URL provided</source> + <translation type="unfinished"/> + </message> + <message> + <source>No logins found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown error</source> + <translation>Tuntematon virhe</translation> + </message> + <message> + <source>Add a new entry to a database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>Tietokannan polku.</translation> + </message> + <message> + <source>Key file of the database.</source> + <translation>Tietokannan avaintiedosto.</translation> + </message> + <message> + <source>path</source> + <translation>polku</translation> + </message> + <message> + <source>Username for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>username</source> + <translation>käyttäjätunnus</translation> + </message> + <message> + <source>URL for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Prompt for the entry's password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a password for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length for the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to add.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy an entry's password to the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to clip.</source> + <comment>clip = copy to clipboard</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout in seconds before clearing the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Edit an entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Title for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>title</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to edit.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Estimate the entropy of a password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password for which to estimate the entropy.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Perform advanced analysis on the password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Extract and print the content of a database.</source> + <translation>Pura ja tulosta tietokannan sisältö.</translation> + </message> + <message> + <source>Path of the database to extract.</source> + <translation>Purettavan tietokannan polku.</translation> + </message> + <message> + <source>Insert password to unlock %1: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to load key file %1 : %2</source> + <translation>Avaintiedoston %1 lataaminen epäonnistui : %2</translation> + </message> + <message> + <source>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source> + +Available commands: +</source> + <translation> + +Käytettävissä olevat komennot: +</translation> + </message> + <message> + <source>Name of the command to execute.</source> + <translation>Suoritettavan komennon nimi.</translation> + </message> + <message> + <source>List database entries.</source> + <translation>Listaa tietokannan tietueet.</translation> + </message> + <message> + <source>Path of the group to list. Default is /</source> + <translation type="unfinished"/> + </message> + <message> + <source>Find entries quickly.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Search term.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Merge two databases.</source> + <translation>Yhdistä kaksi tietokantaa.</translation> + </message> + <message> + <source>Path of the database to merge into.</source> + <translation>Tietokannan polku, johon yhdistetään.</translation> + </message> + <message> + <source>Path of the database to merge from.</source> + <translation>Tietokannan polku, josta yhdistetään.</translation> + </message> + <message> + <source>Use the same credentials for both database files.</source> + <translation>Käytä samoja tilitietoja molemmille tietokantatiedostoille.</translation> + </message> + <message> + <source>Key file of the database to merge from.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show an entry's information.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> + <translation type="unfinished"/> + </message> + <message> + <source>attribute</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the entry to show.</source> + <translation>Näytettävän tietueen nimi.</translation> + </message> <message> <source>NULL device</source> <translation type="unfinished"/> @@ -1866,8 +3298,28 @@ Muuta niitä vain, jos tiedät mitä olet tekemässä.</translation> <translation type="unfinished"/> </message> <message> - <source>INTERNAL - unget lower bound exceeded</source> - <translation type="unfinished"/> + <source>AES: 256-bit</source> + <translation>AES: 256-bit</translation> + </message> + <message> + <source>Twofish: 256-bit</source> + <translation>Twofish: 256-bit</translation> + </message> + <message> + <source>ChaCha20: 256-bit</source> + <translation>ChaCha20: 256-bit</translation> + </message> + <message> + <source>Argon2 (KDBX 4 – recommended)</source> + <translation>Argon2 (KDBX 4 – suositeltu)</translation> + </message> + <message> + <source>AES-KDF (KDBX 4)</source> + <translation>AES-KDF (KDBX 4)</translation> + </message> + <message> + <source>AES-KDF (KDBX 3.1)</source> + <translation>AES-KDF (KDBX 3.1)</translation> </message> <message> <source>Group</source> @@ -1885,14 +3337,22 @@ Muuta niitä vain, jos tiedät mitä olet tekemässä.</translation> <source>Password</source> <translation>Salasana</translation> </message> - <message> - <source>URL</source> - <translation>URL</translation> - </message> <message> <source>Notes</source> <translation>Muistiinpanot</translation> </message> + <message> + <source>Last Modified</source> + <translation>Viimeksi muokattu</translation> + </message> + <message> + <source>Created</source> + <translation>Luotu</translation> + </message> + <message> + <source>Legacy Browser Integration</source> + <translation type="unfinished"/> + </message> <message> <source>Browser Integration</source> <translation>Selainintegraatio</translation> @@ -1909,6 +3369,10 @@ Muuta niitä vain, jos tiedät mitä olet tekemässä.</translation> <source>Passive</source> <translation>Passiivi</translation> </message> + <message> + <source>SSH Agent</source> + <translation>SSH-agentti</translation> + </message> </context> <context> <name>QtIOCompressor</name> @@ -1947,8 +3411,8 @@ Muuta niitä vain, jos tiedät mitä olet tekemässä.</translation> <context> <name>SearchWidget</name> <message> - <source>Case Sensitive</source> - <translation>Kirjainkoko on merkitsevä</translation> + <source>Search...</source> + <translation>Etsi...</translation> </message> <message> <source>Search</source> @@ -1959,8 +3423,8 @@ Muuta niitä vain, jos tiedät mitä olet tekemässä.</translation> <translation>Tyhjennä</translation> </message> <message> - <source>Search...</source> - <translation>Etsi...</translation> + <source>Case Sensitive</source> + <translation>Kirjainkoko on merkitsevä</translation> </message> <message> <source>Limit search to selected group</source> @@ -1969,49 +3433,6 @@ Muuta niitä vain, jos tiedät mitä olet tekemässä.</translation> </context> <context> <name>Service</name> - <message> - <source>A shared encryption-key with the name "%1" already exists. -Do you want to overwrite it?</source> - <translation>Jaettu salausavain nimeltä "%1" on jo olemassa. -Haluatko korvata sen?</translation> - </message> - <message> - <source>Do you want to update the information in %1 - %2?</source> - <translation type="unfinished"/> - </message> - <message> - <source>The active database is locked! -Please unlock the selected database or choose another one which is unlocked.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Successfully removed %1 encryption-%2 from KeePassX/Http Settings.</source> - <translation type="unfinished"/> - </message> - <message> - <source>No shared encryption-keys found in KeePassHttp Settings.</source> - <translation>Jaettuja salausavaimia ei löytynyt KeePassHttp-asetuksista.</translation> - </message> - <message> - <source>The active database does not contain an entry of KeePassHttp Settings.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Removing stored permissions...</source> - <translation type="unfinished"/> - </message> - <message> - <source>Abort</source> - <translation>Keskeytä</translation> - </message> - <message> - <source>Successfully removed permissions from %1 %2.</source> - <translation type="unfinished"/> - </message> - <message> - <source>The active database does not contain an entry with permissions.</source> - <translation type="unfinished"/> - </message> <message> <source>KeePassXC: New key association request</source> <translation type="unfinished"/> @@ -2026,34 +3447,78 @@ give it a unique name to identify and accept it.</source> <source>KeePassXC: Overwrite existing key?</source> <translation>KeePassXC: Korvataanko olemassa oleva avain?</translation> </message> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>Jaettu salausavain nimeltä "%1" on jo olemassa. +Haluatko korvata sen?</translation> + </message> <message> <source>KeePassXC: Update Entry</source> <translation>KeePassXC: Päivitä merkintä</translation> </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation type="unfinished"/> + </message> <message> <source>KeePassXC: Database locked!</source> <translation>KeePassXC: tietokanta lukittu!</translation> </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>Aktiivinen tietokanta on lukittu! +Avaa valittu tietokanta tai valitse toinen avattu tietokanta.</translation> + </message> <message> <source>KeePassXC: Removed keys from database</source> <translation>KeePassXC: Poistettiin avaimet tietokannasta</translation> </message> + <message numerus="yes"> + <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No keys found</source> <translation>KeePassXC: Avaimia ei löytynyt</translation> </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation>Jaettuja salausavaimia ei löytynyt KeePassHttp-asetuksista.</translation> + </message> <message> <source>KeePassXC: Settings not available!</source> <translation>KeePassXC: Asetukset eivät ole käytettävissä!</translation> </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Removing stored permissions...</source> + <translation>Poistetaan talletettuja oikeuksia...</translation> + </message> + <message> + <source>Abort</source> + <translation>Keskeytä</translation> + </message> <message> <source>KeePassXC: Removed permissions</source> <translation>KeePassXC: Poistetut käyttöoikeudet</translation> </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entries.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No entry with permissions found!</source> <translation type="unfinished"/> </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>SettingsWidget</name> @@ -2076,10 +3541,26 @@ give it a unique name to identify and accept it.</source> </context> <context> <name>SettingsWidgetGeneral</name> + <message> + <source>Basic Settings</source> + <translation>Perusasetukset</translation> + </message> + <message> + <source>Start only a single instance of KeePassXC</source> + <translation>Käynnistä vain yksi KeePassXC-instanssi</translation> + </message> <message> <source>Remember last databases</source> <translation>Muista viimeisimmät tietokannat</translation> </message> + <message> + <source>Remember last key files and security dongles</source> + <translation>Muista viimeisimmät avaintiedostot ja tietoturva-avainlaitteet (donglet)</translation> + </message> + <message> + <source>Load previous databases on startup</source> + <translation>Lataa edelliset tietokannat käynnistäessä</translation> + </message> <message> <source>Automatically save on exit</source> <translation>Tallenna automaattisesti suljettaessa</translation> @@ -2088,21 +3569,29 @@ give it a unique name to identify and accept it.</source> <source>Automatically save after every change</source> <translation>Tallenna automaattisesti jokaisen muutoksen jälkeen</translation> </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation>Lataa tietokanta automaattisesti uudelleen jos tietokantaa muokattiin muualla</translation> + </message> <message> <source>Minimize when copying to clipboard</source> <translation>Pienennä ikkuna kopioidessa leikepöydälle</translation> </message> + <message> + <source>Minimize window at application startup</source> + <translation>Pienennä ikkuna ohjelman käynnistyessä</translation> + </message> <message> <source>Use group icon on entry creation</source> <translation>Käytä ryhmän kuvaketta merkintää luodessa</translation> </message> <message> - <source>Global Auto-Type shortcut</source> - <translation>Globaalin automaattitäydennyksen pikanäppäin</translation> + <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> + <translation type="unfinished"/> </message> <message> - <source>Language</source> - <translation>Kieli</translation> + <source>Hide the Details view</source> + <translation type="unfinished"/> </message> <message> <source>Show a system tray icon</source> @@ -2112,67 +3601,61 @@ give it a unique name to identify and accept it.</source> <source>Hide window to system tray when minimized</source> <translation>Piiloita pienennetty ikkuna ilmoitusalueelle</translation> </message> - <message> - <source>Load previous databases on startup</source> - <translation>Lataa edelliset tietokannat käynnistäessä</translation> - </message> - <message> - <source>Automatically reload the database when modified externally</source> - <translation>Lataa tietokanta automaattisesti uudelleen jos tietokantaa muokattiin muualla</translation> - </message> <message> <source>Hide window to system tray instead of app exit</source> <translation>Piiloita ikkuna ilmoitusalueelle sulkemisen sijaan</translation> </message> <message> - <source>Minimize window at application startup</source> - <translation>Pienennä ikkuna ohjelman käynnistyessä</translation> + <source>Dark system tray icon</source> + <translation>Tumma ilmoitusalueen kuvake</translation> </message> <message> - <source>Basic Settings</source> - <translation>Perusasetukset</translation> - </message> - <message> - <source>Remember last key files and security dongles</source> - <translation>Muista viimeisimmät avaintiedostot ja tietoturva-avainlaitteet (donglet)</translation> - </message> - <message> - <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> - <translation type="unfinished"/> + <source>Language</source> + <translation>Kieli</translation> </message> <message> <source>Auto-Type</source> <translation>Automaattitäydennys</translation> </message> <message> - <source>Use entry title and URL to match windows for global Auto-Type</source> + <source>Use entry title to match windows for global Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use entry URL to match windows for global Auto-Type</source> <translation type="unfinished"/> </message> <message> <source>Always ask before performing Auto-Type</source> <translation>Kysy aina ennen automaattitäydennyksen käyttämistä</translation> </message> + <message> + <source>Global Auto-Type shortcut</source> + <translation>Globaalin automaattitäydennyksen pikanäppäin</translation> + </message> <message> <source>Auto-Type delay</source> <translation>Automaattitäydennyksen viive</translation> </message> <message> <source> ms</source> + <comment>Milliseconds</comment> <translation> ms</translation> </message> - <message> - <source>Start only a single instance of KeePassXC</source> - <translation>Käynnistä vain yksi KeePassXC-instanssi</translation> - </message> </context> <context> <name>SettingsWidgetSecurity</name> + <message> + <source>Timeouts</source> + <translation>Aikakatkaisut</translation> + </message> <message> <source>Clear clipboard after</source> <translation>Tyhjennä leikepöytä kun on kulunut</translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation>s.</translation> </message> <message> @@ -2180,8 +3663,12 @@ give it a unique name to identify and accept it.</source> <translation>Lukitse tietokannat jos on oltu joutilaana</translation> </message> <message> - <source>Show passwords in cleartext by default</source> - <translation>Näytä salasanat oletuksena selkokielisenä</translation> + <source>Convenience</source> + <translation>Mukavuus</translation> + </message> + <message> + <source>Lock databases when session is locked or lid is closed</source> + <translation>Lukitse tietokannat kun istunto lukitaan tai kansi suljetaan</translation> </message> <message> <source>Lock databases after minimizing the window</source> @@ -2192,16 +3679,16 @@ give it a unique name to identify and accept it.</source> <translation>Älä vaadi salasanan toistoa jos salasana on näkyvillä</translation> </message> <message> - <source>Timeouts</source> - <translation>Aikakatkaisut</translation> + <source>Show passwords in cleartext by default</source> + <translation>Näytä salasanat oletuksena selkokielisenä</translation> </message> <message> - <source>Convenience</source> - <translation>Mukavuus</translation> + <source>Hide passwords in the preview panel</source> + <translation type="unfinished"/> </message> <message> - <source>Lock databases when session is locked or lid is closed</source> - <translation>Lukitse tietokannat kun istunto lukitaan tai kansi suljetaan</translation> + <source>Hide entry notes by default</source> + <translation type="unfinished"/> </message> <message> <source>Privacy</source> @@ -2222,6 +3709,14 @@ give it a unique name to identify and accept it.</source> <source>Key:</source> <translation>Avain:</translation> </message> + <message> + <source>Default RFC 6238 token settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Steam token settings</source> + <translation type="unfinished"/> + </message> <message> <source>Use custom settings</source> <translation>Käytä mukautettuja asetuksia</translation> @@ -2248,6 +3743,7 @@ give it a unique name to identify and accept it.</source> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation>s.</translation> </message> </context> @@ -2314,6 +3810,26 @@ give it a unique name to identify and accept it.</source> </context> <context> <name>main</name> + <message> + <source>Remove an entry from the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>Tietokannan polku.</translation> + </message> + <message> + <source>Path of the entry to remove.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation>KeePassXC - järjestelmäriippumaton salasanojen hallintasovellus</translation> + </message> + <message> + <source>filenames of the password databases to open (*.kdbx)</source> + <translation>avattavien salasanatietokantojen tiedostonimet (*.kdbx)</translation> + </message> <message> <source>path to a custom config file</source> <translation>polku mukautettuun asetustiedostoon</translation> @@ -2322,81 +3838,13 @@ give it a unique name to identify and accept it.</source> <source>key file of the database</source> <translation>tietokannan avaintiedosto</translation> </message> - <message> - <source>KeePassXC - cross-platform password manager</source> - <translation>KeePassXC - järjestelmäriippumaton salasanojen hallintasovellus</translation> - </message> <message> <source>read password of the database from stdin</source> <translation>lue tietokannan salasana stdin:istä</translation> </message> <message> - <source>filenames of the password databases to open (*.kdbx)</source> + <source>Parent window handle</source> <translation type="unfinished"/> </message> - <message> - <source>Copy a password to the clipboard</source> - <translation>Kopioi salasana leikepöydälle</translation> - </message> - <message> - <source>Path of the database.</source> - <translation>Tietokannan polku.</translation> - </message> - <message> - <source>Use a GUI prompt unlocking the database.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Name of the entry to clip.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Extract and print the content of a database.</source> - <translation>Pura ja tulosta tietokannan sisältö.</translation> - </message> - <message> - <source>Path of the database to extract.</source> - <translation>Purettavan tietokannan polku.</translation> - </message> - <message> - <source>Name of the command to execute.</source> - <translation>Suoritettavan komennon nimi.</translation> - </message> - <message> - <source>List database entries.</source> - <translation>Listaa tietokannan tietueet.</translation> - </message> - <message> - <source>Path of the group to list. Default is /</source> - <translation type="unfinished"/> - </message> - <message> - <source>Print the UUIDs of the entries and groups.</source> - <translation>Tulosat tietueiden ja ryhmien UUID:t.</translation> - </message> - <message> - <source>Merge two databases.</source> - <translation>Yhdistä kaksi tietokantaa.</translation> - </message> - <message> - <source>Path of the database to merge into.</source> - <translation>Tietokannan polku, johon yhdistetään.</translation> - </message> - <message> - <source>Path of the database to merge from.</source> - <translation>Tietokannan polku, josta yhdistetään.</translation> - </message> - <message> - <source>Use the same password for both database files.</source> - <translation>Käytä samaa salasanaa molemmille tietokantatiedostoille.</translation> - </message> - <message> - <source>Show a password.</source> - <translation>Näytä salasana.</translation> - </message> - <message> - <source>Name of the entry to show.</source> - <translation>Näytettävän tietueen nimi.</translation> - </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_fr.ts b/share/translations/keepassx_fr.ts index f3fa01920..ece9cd5b0 100644 --- a/share/translations/keepassx_fr.ts +++ b/share/translations/keepassx_fr.ts @@ -9,14 +9,34 @@ <source>About</source> <translation>À propos</translation> </message> + <message> + <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> + <translation>Signaler les bugs sur : <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> + </message> + <message> + <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>KeePassXC est distribué suivant les termes de la GNU Licence Publique Générale (GNU GPL) version 2 ou version 3 de la licence (à votre choix).</translation> + </message> + <message> + <source>Project Maintainers:</source> + <translation>Mainteneurs du projet :</translation> + </message> <message> <source>Contributors</source> <translation>Contributeurs</translation> </message> + <message> + <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Voir Contributions sur GitHub</a></translation> + </message> <message> <source>Debug Info</source> <translation>Informations de débogage</translation> </message> + <message> + <source>Include the following information whenever you report a bug:</source> + <translation>Inclure l'information suivante lorsque vous signaler un bug :</translation> + </message> <message> <source>Copy to clipboard</source> <translation>Copier dans le presse-papier</translation> @@ -31,6 +51,10 @@ <source>Revision: %1</source> <translation>Révision : %1</translation> </message> + <message> + <source>Distribution: %1</source> + <translation>Distribution : %1</translation> + </message> <message> <source>Libraries:</source> <translation>Bibliothèques :</translation> @@ -47,33 +71,13 @@ Kernel : %3 %4</translation> <source>Enabled extensions:</source> <translation>Extensions activées :</translation> </message> - <message> - <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> - <translation>Signaler les bugs sur : <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> - </message> - <message> - <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassXC est distribué suivant les termes de la GNU Licence Publique Générale (GNU GPL) version 2 ou version 3 de la licence (à votre choix).</translation> - </message> - <message> - <source>Project Maintainers:</source> - <translation>Mainteneurs du projet :</translation> - </message> - <message> - <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Voir Contributions sur GitHub</a></translation> - </message> - <message> - <source>Include the following information whenever you report a bug:</source> - <translation>Inclure l'information suivante lorsque vous signaler un bug :</translation> - </message> - <message> - <source>Distribution: %1</source> - <translation>Distribution : %1</translation> - </message> </context> <context> <name>AccessControlDialog</name> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>Accès KeePassXC HTTP confirmé</translation> + </message> <message> <source>Remember this decision</source> <translation>Se souvenir de ce choix</translation> @@ -92,9 +96,12 @@ Please select whether you want to allow access.</source> <translation>%1 a demandé l’accès aux mots de passe pour l'élément suivant (ou les éléments suivants). Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> </message> +</context> +<context> + <name>AgentSettingsWidget</name> <message> - <source>KeePassXC HTTP Confirm Access</source> - <translation>Accès KeePassXC HTTP confirmé</translation> + <source>Enable SSH Agent (requires restart)</source> + <translation>Activer l'agent SSH (redémarrage nécessaire)</translation> </message> </context> <context> @@ -105,7 +112,27 @@ Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> </message> <message> <source>Auto-Type - KeePassXC</source> - <translation>Remplissage automatique - KeePassXC</translation> + <translation> Remplissage automatique - KeePassXC</translation> + </message> + <message> + <source>Auto-Type</source> + <translation>Saisie-Automatique</translation> + </message> + <message> + <source>The Syntax of your Auto-Type statement is incorrect!</source> + <translation>La syntaxe de votre séquence de saisie automatique est incorrecte.</translation> + </message> + <message> + <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> + <translation>Cette commande de saisie automatique contient un délai très long. Êtes-vous sûr ?</translation> + </message> + <message> + <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> + <translation>Cette commande de saisie automatique contient des touches très lentes. Êtes-vous sûr?</translation> + </message> + <message> + <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> + <translation>Cette commande de saisie automatique contient des arguments souvent répétés. Êtes-vous sûr ?</translation> </message> </context> <context> @@ -125,13 +152,290 @@ Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> </context> <context> <name>AutoTypeSelectDialog</name> + <message> + <source>Auto-Type - KeePassXC</source> + <translation> Remplissage automatique - KeePassXC</translation> + </message> <message> <source>Select entry to Auto-Type:</source> <translation>Choisissez un champ pour Auto-Type :</translation> </message> +</context> +<context> + <name>BrowserAccessControlDialog</name> <message> - <source>Auto-Type - KeePassXC</source> - <translation> Remplissage automatique - KeePassXC</translation> + <source>KeePassXC-Browser Confirm Access</source> + <translation>KeePassXC - Navigateur Confirmer l’accès</translation> + </message> + <message> + <source>Remember this decision</source> + <translation>Se souvenir de ce choix</translation> + </message> + <message> + <source>Allow</source> + <translation>Autoriser</translation> + </message> + <message> + <source>Deny</source> + <translation>Refuser</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 a demandé l’accès aux mots de passe pour l'élément suivant (ou les éléments suivants). +Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> + </message> +</context> +<context> + <name>BrowserOptionDialog</name> + <message> + <source>Dialog</source> + <translation>Dialogue</translation> + </message> + <message> + <source>This is required for accessing your databases with KeePassXC-Browser</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable KeepassXC browser integration</source> + <translation>Activer l'intégration KeepassXC au navigateur</translation> + </message> + <message> + <source>General</source> + <translation>Général</translation> + </message> + <message> + <source>Enable integration for these browsers:</source> + <translation>Activer l'intégration avec ces navigateurs:</translation> + </message> + <message> + <source>&Google Chrome</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Firefox</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Chromium</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Vivaldi</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show a &notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Demander de déverrouiller la base de données lorsque celle-ci est verrouillée</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> + <translation>Seules les entrées avec le même schéma (http://, https://, ...) sont retournées.</translation> + </message> + <message> + <source>&Match URL scheme (e.g., https://...)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>Renvoie seulement les meilleures correspondances pour une URL spécifique au lieu des entrées pour tout le domaine.</translation> + </message> + <message> + <source>&Return only best-matching credentials</source> + <translation type="unfinished"/> + </message> + <message> + <source>Sort &matching credentials by title</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Sort matching credentials by &username</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>&Disconnect all browsers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Forget all remembered &permissions</source> + <translation type="unfinished"/> + </message> + <message> + <source>Advanced</source> + <translation>Avancé</translation> + </message> + <message> + <source>Never &ask before accessing credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Never ask before &updating credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>Seule la base de données sélectionnée doit être connectée avec un client.</translation> + </message> + <message> + <source>Searc&h in all opened databases for matching credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>La création ou la mise a jour automatique ne sont pas pris en charge pour les champs de chaines de caractères !</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>& Retourne les champs avancés de type chaîne qui commencent par "KPH :"</translation> + </message> + <message> + <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Update &native messaging manifest files at startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Support a proxy application between KeePassXC and browser extension.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &proxy application between KeePassXC and browser extension</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a custom proxy location if you installed a proxy manually.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &custom proxy location</source> + <comment>Meant is the proxy for KeePassXC-Browser</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Explorer...</translation> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*.exe);;All Files (*.*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select custom proxy location</source> + <translation>Configurer manuellement un proxy</translation> + </message> +</context> +<context> + <name>BrowserService</name> + <message> + <source>KeePassXC: New key association request</source> + <translation>KeePassXC : nouvelle demande d'association</translation> + </message> + <message> + <source>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Save and allow access</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC : Écraser la clé existante ?</translation> + </message> + <message> + <source>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC : Mettre à jour l'entrée</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Voulez-vous mettre à jour l'information dans %1 - %2 ?</translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC : Base de données verrouillée !</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>La base de données actuelle est verrouillée ! +Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui est déverrouillée. </translation> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: Paramètre indisponible !</translation> + </message> + <message> + <source>The active database does not contain a settings entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC : Aucune clé trouvée</translation> + </message> + <message> + <source>No shared encryption keys found in KeePassXC Settings.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC : Les clés ont été effacées de la base de donnée</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Removing stored permissions…</source> + <translation>Effacement des permissions enregistrées...</translation> + </message> + <message> + <source>Abort</source> + <translation>Annuler</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC : Permissions retirées</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entry(s).</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation>KeePassXC : Aucune entrée avec permissions trouvée !</translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>La base de données actuelle ne contient pas d'entrée avec des permissions.</translation> </message> </context> <context> @@ -148,6 +452,10 @@ Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> <source>Repeat password:</source> <translation>Confirmez le mot de passe :</translation> </message> + <message> + <source>&Key file</source> + <translation>Fichier-clé</translation> + </message> <message> <source>Browse</source> <translation>Naviguer</translation> @@ -156,6 +464,14 @@ Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> <source>Create</source> <translation>Créer</translation> </message> + <message> + <source>Cha&llenge Response</source> + <translation>Cha&llenge-réponse</translation> + </message> + <message> + <source>Refresh</source> + <translation>Rafraîchir</translation> + </message> <message> <source>Key files</source> <translation>Fichiers-clés</translation> @@ -176,6 +492,10 @@ Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> <source>Select a key file</source> <translation>Choisir un fichier-clé</translation> </message> + <message> + <source>Empty password</source> + <translation>Mot de passe vide</translation> + </message> <message> <source>Do you really want to use an empty string as password?</source> <translation>Voulez-vous vraiment utiliser une chaîne vide comme mot de passe ?</translation> @@ -191,20 +511,15 @@ Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> %2</translation> </message> <message> - <source>&Key file</source> - <translation>Fichier-clé</translation> + <source>Legacy key file format</source> + <translation type="unfinished"/> </message> <message> - <source>Cha&llenge Response</source> - <translation>Cha&llenge-réponse</translation> - </message> - <message> - <source>Refresh</source> - <translation>Rafraîchir</translation> - </message> - <message> - <source>Empty password</source> - <translation>Mot de passe vide</translation> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -217,6 +532,10 @@ Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> <source>Clone Options</source> <translation>Options de clonage</translation> </message> + <message> + <source>Append ' - Clone' to title</source> + <translation>Ajouter ' - Clone' au titre</translation> + </message> <message> <source>Replace username and password with references</source> <translation>Remplacer le nom d'utilisateur et le mot de passe par des références</translation> @@ -225,10 +544,6 @@ Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> <source>Copy history</source> <translation>Copie de l'historique</translation> </message> - <message> - <source>Append ' - Clone' to title</source> - <translation>Ajouter ' - Clone' au titre</translation> - </message> </context> <context> <name>CsvImportWidget</name> @@ -325,10 +640,6 @@ Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> </context> <context> <name>CsvImportWizard</name> - <message> - <source>Import CSV file</source> - <translation>Importer un fichier CSV</translation> - </message> <message> <source>Error</source> <translation>Erreur</translation> @@ -340,17 +651,17 @@ Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> </context> <context> <name>CsvParserModel</name> - <message> - <source> byte, </source> - <translation>octet,</translation> + <message numerus="yes"> + <source>%n byte(s), </source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> - <message> - <source> rows, </source> - <translation>lignes,</translation> + <message numerus="yes"> + <source>%n row(s), </source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> - <message> - <source> columns</source> - <translation>colonnes</translation> + <message numerus="yes"> + <source>%n column(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> </context> <context> @@ -371,6 +682,14 @@ Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> <source>Browse</source> <translation>Naviguer</translation> </message> + <message> + <source>Refresh</source> + <translation>Rafraîchir</translation> + </message> + <message> + <source>Challenge Response:</source> + <translation>Challenge-réponse :</translation> + </message> <message> <source>Unable to open the database.</source> <translation>Impossible d'ouvrir la base de données.</translation> @@ -379,6 +698,21 @@ Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> <source>Can't open key file</source> <translation>Impossible d'ouvrir le fichier-clé</translation> </message> + <message> + <source>Legacy key file format</source> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't show this warning again</source> + <translation type="unfinished"/> + </message> <message> <source>All files</source> <translation>Tous les fichiers</translation> @@ -391,14 +725,6 @@ Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> <source>Select key file</source> <translation>Choisissez un fichier-clé</translation> </message> - <message> - <source>Refresh</source> - <translation>Rafraîchir</translation> - </message> - <message> - <source>Challenge Response:</source> - <translation>Challenge-réponse :</translation> - </message> </context> <context> <name>DatabaseRepairWidget</name> @@ -414,14 +740,14 @@ Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> <source>Can't open key file</source> <translation>Impossible d'ouvrir le fichier-clé</translation> </message> - <message> - <source>Database opened fine. Nothing to do.</source> - <translation>La base de données s'est bien ouverte. Aucune action nécéssaire.</translation> - </message> <message> <source>Unable to open the database.</source> <translation>Impossible d'ouvrir la base de données.</translation> </message> + <message> + <source>Database opened fine. Nothing to do.</source> + <translation>La base de données s'est bien ouverte. Aucune action nécéssaire.</translation> + </message> <message> <source>Success</source> <translation>Réussite</translation> @@ -440,40 +766,57 @@ Vous pouvez maintenant la sauvegarder.</translation> <context> <name>DatabaseSettingsWidget</name> <message> - <source>Database name:</source> - <translation>Nom de la base de données :</translation> + <source>General</source> + <translation>Général</translation> </message> <message> - <source>Database description:</source> - <translation>Description de la base de données :</translation> + <source>Encryption</source> + <translation>Chiffrement</translation> </message> <message> - <source>Transform rounds:</source> - <translation>Passes de transformation :</translation> + <source>Number of rounds too high</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> </message> <message> - <source>Default username:</source> - <translation>Nom d'utilisateur par défaut :</translation> + <source>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</source> + <translation type="unfinished"/> </message> <message> - <source> MiB</source> - <translation> MiB</translation> + <source>Understood, keep number</source> + <translation type="unfinished"/> </message> <message> - <source>Benchmark</source> - <translation>Base de référence</translation> + <source>Cancel</source> + <translation>Annulé</translation> </message> <message> - <source>Max. history items:</source> - <translation>Nombre max. d'éléments dans l'historique :</translation> + <source>Number of rounds too low</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> </message> <message> - <source>Max. history size:</source> - <translation>Taille max. de l'historique :</translation> + <source>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</source> + <translation type="unfinished"/> </message> <message> - <source>Use recycle bin</source> - <translation>Utiliser la corbeille</translation> + <source>KDF unchanged</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetEncryption</name> + <message> + <source>Encryption Algorithm:</source> + <translation>Algorithme de chiffrement:</translation> </message> <message> <source>AES: 256 Bit (default)</source> @@ -484,14 +827,78 @@ Vous pouvez maintenant la sauvegarder.</translation> <translation>Twofish : 256 bits</translation> </message> <message> - <source>Algorithm:</source> - <translation>Algorithme :</translation> + <source>Key Derivation Function:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Transform rounds:</source> + <translation>Passes de transformation :</translation> + </message> + <message> + <source>Benchmark 1-second delay</source> + <translation type="unfinished"/> + </message> + <message> + <source>Memory Usage:</source> + <translation>Utilisation mémoire:</translation> + </message> + <message> + <source> MB</source> + <translation>Mo</translation> + </message> + <message> + <source>Parallelism:</source> + <translation type="unfinished"/> + </message> + <message> + <source> thread</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetGeneral</name> + <message> + <source>Database Meta Data</source> + <translation>Métadonnées de la base de données</translation> + </message> + <message> + <source>Database name:</source> + <translation>Nom de la base de données :</translation> + </message> + <message> + <source>Database description:</source> + <translation>Description de la base de données :</translation> + </message> + <message> + <source>Default username:</source> + <translation>Nom d'utilisateur par défaut :</translation> + </message> + <message> + <source>History Settings</source> + <translation>Paramètres de l'historique</translation> + </message> + <message> + <source>Max. history items:</source> + <translation>Nombre max. d'éléments dans l'historique :</translation> + </message> + <message> + <source>Max. history size:</source> + <translation>Taille max. de l'historique :</translation> + </message> + <message> + <source> MiB</source> + <translation> MiB</translation> + </message> + <message> + <source>Use recycle bin</source> + <translation>Utiliser la corbeille</translation> </message> </context> <context> <name>DatabaseTabWidget</name> <message> <source>Root</source> + <comment>Root group</comment> <translation>Racine</translation> </message> <message> @@ -510,6 +917,30 @@ Vous pouvez maintenant la sauvegarder.</translation> <source>File not found!</source> <translation>Fichier introuvable !</translation> </message> + <message> + <source>Unable to open the database.</source> + <translation>Impossible d'ouvrir la base de données.</translation> + </message> + <message> + <source>File opened in read only mode.</source> + <translation>Fichier ouvert en lecture seule.</translation> + </message> + <message> + <source>Open CSV file</source> + <translation>Ouvrir le fichier CSV</translation> + </message> + <message> + <source>CSV file</source> + <translation>Fichier CSV</translation> + </message> + <message> + <source>All files (*)</source> + <translation>Tous les fichiers (*)</translation> + </message> + <message> + <source>Merge database</source> + <translation>Fusionner les bases de données</translation> + </message> <message> <source>Open KeePass 1 database</source> <translation>Ouvrir une base de données KeePass 1</translation> @@ -518,14 +949,16 @@ Vous pouvez maintenant la sauvegarder.</translation> <source>KeePass 1 database</source> <translation>Base de données Keepass 1</translation> </message> - <message> - <source>All files (*)</source> - <translation>Tous les fichiers (*)</translation> - </message> <message> <source>Close?</source> <translation>Fermer ?</translation> </message> + <message> + <source>"%1" is in edit mode. +Discard changes and close anyway?</source> + <translation>"%1" est en mode édition. +Ignorer les changements et fermer ?</translation> + </message> <message> <source>Save changes?</source> <translation>Enregistrer les modifications ?</translation> @@ -540,10 +973,22 @@ Enregistrer les modifications ?</translation> <source>Writing the database failed.</source> <translation>Une erreur s'est produite lors de l'écriture de la base de données.</translation> </message> + <message> + <source>Passwords</source> + <translation>Mots de passe</translation> + </message> <message> <source>Save database as</source> <translation>Enregistrer comme nouvelle base de données</translation> </message> + <message> + <source>Export database to CSV file</source> + <translation>Exporter la base de données au format CSV</translation> + </message> + <message> + <source>Writing the CSV file failed.</source> + <translation>Échec de l'écriture du fichier CSV.</translation> + </message> <message> <source>New database</source> <translation>Nouvelle base de données</translation> @@ -561,12 +1006,6 @@ Enregistrer les modifications ?</translation> Please press cancel to finish your changes or discard them.</source> <translation>Impossible de verrouiller la base de données lors de modifications. Cliquez sur Annuler pour finir vos modifications ou abandonnez-les.</translation> - </message> - <message> - <source>This database has never been saved. -You can save the database or stop locking it.</source> - <translation>Cette base de données n'a pas encore été sauvegardée. -Vous devez la sauvegarder ou annuler son verrouillage.</translation> </message> <message> <source>This database has been modified. @@ -576,72 +1015,16 @@ Otherwise your changes are lost.</source> Voulez-vous l'enregistrer avant de la verrouiller ? Autrement, vos modifications seront perdues.</translation> </message> - <message> - <source>"%1" is in edit mode. -Discard changes and close anyway?</source> - <translation>"%1" est en mode édition. -Ignorer les changements et fermer ?</translation> - </message> - <message> - <source>Export database to CSV file</source> - <translation>Exporter la base de données au format CSV</translation> - </message> - <message> - <source>CSV file</source> - <translation>Fichier CSV</translation> - </message> - <message> - <source>Writing the CSV file failed.</source> - <translation>Échec de l'écriture du fichier CSV.</translation> - </message> - <message> - <source>Unable to open the database.</source> - <translation>Impossible d'ouvrir la base de données.</translation> - </message> - <message> - <source>Merge database</source> - <translation>Fusionner les bases de données</translation> - </message> - <message> - <source>The database you are trying to save as is locked by another instance of KeePassXC. -Do you want to save it anyway?</source> - <translation>La base de données que vous essayez d'enregistrer est verrouillée par une autre instance de KeePassXC. -Voulez vous l'enregistrer quand même ?</translation> - </message> - <message> - <source>Passwords</source> - <translation>Mots de passe</translation> - </message> - <message> - <source>Database already opened</source> - <translation>La base de données est déjà ouverte</translation> - </message> - <message> - <source>The database you are trying to open is locked by another instance of KeePassXC. - -Do you want to open it anyway?</source> - <translation>La base de données que vous essayez d'ouvrir est verrouillée par une autre instance de KeePassXC. - -Voulez vous l'ouvrir quand même ?</translation> - </message> - <message> - <source>Open read-only</source> - <translation>Ouvrir en lecture seule</translation> - </message> - <message> - <source>File opened in read only mode.</source> - <translation>Fichier ouvert en lecture seule.</translation> - </message> - <message> - <source>Open CSV file</source> - <translation>Ouvrir le fichier CSV</translation> - </message> </context> <context> <name>DatabaseWidget</name> + <message> + <source>Searching...</source> + <translation>Recherche...</translation> + </message> <message> <source>Change master key</source> - <translation>Changer la clé maître</translation> + <translation>Modifier la clé maître</translation> </message> <message> <source>Delete entry?</source> @@ -659,13 +1042,33 @@ Voulez vous l'ouvrir quand même ?</translation> <source>Do you really want to delete %1 entries for good?</source> <translation>Voulez-vous supprimer "%1" entrées définitivement ?</translation> </message> + <message> + <source>Move entry to recycle bin?</source> + <translation>Déplacer l'entrée dans la corbeille ?</translation> + </message> + <message> + <source>Do you really want to move entry "%1" to the recycle bin?</source> + <translation>Êtes-vous sûr de vouloir déplacer l'entrée "%1" dans la corbeille ?</translation> + </message> <message> <source>Move entries to recycle bin?</source> <translation>Déplacer les entrées vers la corbeille ?</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>Voulez-vous déplacer %n entrée(s) vers la corbeille ?</numerusform><numerusform>Voulez-vous déplacer %n entrée(s) vers la corbeille ?</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Execute command?</source> + <translation>Exécuter la commande ?</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation>Voulez-vous vraiment exécuter la commande suivante ?<br><br>%1<br></translation> + </message> + <message> + <source>Remember my choice</source> + <translation>Se souvenir de mon choix</translation> </message> <message> <source>Delete group?</source> @@ -679,18 +1082,6 @@ Voulez vous l'ouvrir quand même ?</translation> <source>Unable to calculate master key</source> <translation>Impossible de calculer la clé maître</translation> </message> - <message> - <source>Move entry to recycle bin?</source> - <translation>Déplacer l'entrée dans la corbeille ?</translation> - </message> - <message> - <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation>Êtes-vous sûr de vouloir déplacer l'entrée "%1" dans la corbeille ?</translation> - </message> - <message> - <source>Searching...</source> - <translation>Recherche...</translation> - </message> <message> <source>No current database.</source> <translation>Pas de base de données.</translation> @@ -708,20 +1099,8 @@ Voulez vous l'ouvrir quand même ?</translation> <translation>Pas de résultats</translation> </message> <message> - <source>Execute command?</source> - <translation>Exécuter la commande ?</translation> - </message> - <message> - <source>Do you really want to execute the following command?<br><br>%1<br></source> - <translation>Voulez-vous vraiment exécuter la commande suivante ?<br><br>%1<br></translation> - </message> - <message> - <source>Remember my choice</source> - <translation>Se souvenir de mon choix</translation> - </message> - <message> - <source>Autoreload Request</source> - <translation>Demande de rafraîchissement automatique</translation> + <source>File has changed</source> + <translation type="unfinished"/> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -732,8 +1111,9 @@ Voulez vous l'ouvrir quand même ?</translation> <translation>Demande de fusion</translation> </message> <message> - <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> - <translation>Le fichier de la base de données à changé et vous avez des modification non-enregistrés. Voulez-vous fusionner vos modifications?</translation> + <source>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</source> + <translation type="unfinished"/> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -748,6 +1128,89 @@ Voulez vous l'ouvrir quand même ?</translation> <translation>Êtes-vous certain de vouloir vider définitivement votre corbeille?</translation> </message> </context> +<context> + <name>DetailsWidget</name> + <message> + <source>Generate TOTP Token</source> + <translation type="unfinished"/> + </message> + <message> + <source>Close</source> + <translation>Fermer</translation> + </message> + <message> + <source>General</source> + <translation>Général</translation> + </message> + <message> + <source>Password</source> + <translation>Mot de passe</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Expiration</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username</source> + <translation>Nom d'utilisateur</translation> + </message> + <message> + <source>Autotype</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searching</source> + <translation>Recherche...</translation> + </message> + <message> + <source>Attributes</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation>Affichage</translation> + </message> + <message> + <source>Notes</source> + <translation>Notes</translation> + </message> + <message> + <source>Window</source> + <translation>Fenêtre</translation> + </message> + <message> + <source>Sequence</source> + <translation>Séquence</translation> + </message> + <message> + <source>Search</source> + <translation>Chercher</translation> + </message> + <message> + <source>Clear</source> + <translation>Effacer</translation> + </message> + <message> + <source>Never</source> + <translation type="unfinished"/> + </message> + <message> + <source>[PROTECTED]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Disabled</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enabled</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EditEntryWidget</name> <message> @@ -764,7 +1227,7 @@ Voulez vous l'ouvrir quand même ?</translation> </message> <message> <source>Auto-Type</source> - <translation>Remplissage automatique</translation> + <translation>Saisie-Automatique</translation> </message> <message> <source>Properties</source> @@ -774,6 +1237,30 @@ Voulez vous l'ouvrir quand même ?</translation> <source>History</source> <translation>Historique</translation> </message> + <message> + <source>SSH Agent</source> + <translation>SSH Agent</translation> + </message> + <message> + <source>n/a</source> + <translation>n/a</translation> + </message> + <message> + <source>(encrypted)</source> + <translation>(chiffré)</translation> + </message> + <message> + <source>Select private key</source> + <translation>Choisir un fichier-clé</translation> + </message> + <message> + <source>File too large to be a private key</source> + <translation>Fichier trop lourd pour être un fichier-clé</translation> + </message> + <message> + <source>Failed to open private key</source> + <translation type="unfinished"/> + </message> <message> <source>Entry history</source> <translation>Historique de l'entrée</translation> @@ -788,46 +1275,12 @@ Voulez vous l'ouvrir quand même ?</translation> </message> <message> <source>Different passwords supplied.</source> - <translation>Les mots de passe ne sont pas identiques.</translation> + <translation>Les mots de passe insérés sont différents.</translation> </message> <message> <source>New attribute</source> <translation>Nouvel attribut</translation> </message> - <message> - <source>Select file</source> - <translation>Choisissez un fichier</translation> - </message> - <message> - <source>Unable to open file</source> - <translation>Impossible d'ouvrir le fichier</translation> - </message> - <message> - <source>Save attachment</source> - <translation>Enregistrer le fichier attaché</translation> - </message> - <message> - <source>Unable to save the attachment: -</source> - <translation>Impossible d'enregistrer le fichier attaché : -</translation> - </message> - <message> - <source>Tomorrow</source> - <translation>Demain</translation> - </message> - <message numerus="yes"> - <source>%n week(s)</source> - <translation><numerusform>%n semaine(s)</numerusform><numerusform>%n semaine(s)</numerusform></translation> - </message> - <message numerus="yes"> - <source>%n month(s)</source> - <translation><numerusform>%n mois</numerusform><numerusform>%n mois</numerusform></translation> - </message> - <message> - <source>1 year</source> - <translation>1 an</translation> - </message> <message> <source>Confirm Remove</source> <translation>Confirmez la suppression</translation> @@ -837,12 +1290,28 @@ Voulez vous l'ouvrir quand même ?</translation> <translation>Êtes-vous sûr de vouloir supprimer cet attribut?</translation> </message> <message> - <source>[PROTECTED] Press reveal to view or edit</source> - <translation>[PROTÉGÉ] Appuyez pour révéler ou éditer</translation> + <source>[PROTECTED]</source> + <translation type="unfinished"/> </message> <message> - <source>Are you sure you want to remove this attachment?</source> - <translation>Êtes-vous sûr de vouloir supprimer cette pièce jointe?</translation> + <source>Press reveal to view or edit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Tomorrow</source> + <translation>Demain</translation> + </message> + <message numerus="yes"> + <source>%n week(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source>%n month(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>1 year</source> + <translation>1 an</translation> </message> </context> <context> @@ -859,18 +1328,6 @@ Voulez vous l'ouvrir quand même ?</translation> <source>Remove</source> <translation>Supprimer</translation> </message> - <message> - <source>Attachments</source> - <translation>Affichage</translation> - </message> - <message> - <source>Save</source> - <translation>Enregistrer le fichier</translation> - </message> - <message> - <source>Open</source> - <translation>Ouvrir</translation> - </message> <message> <source>Edit Name</source> <translation>Éditer le nom</translation> @@ -883,6 +1340,10 @@ Voulez vous l'ouvrir quand même ?</translation> <source>Reveal</source> <translation>Révéler</translation> </message> + <message> + <source>Attachments</source> + <translation>Affichage</translation> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -890,6 +1351,18 @@ Voulez vous l'ouvrir quand même ?</translation> <source>Enable Auto-Type for this entry</source> <translation>Activer le remplissage automatique pour cette entrée</translation> </message> + <message> + <source>Inherit default Auto-Type sequence from the &group</source> + <translation>Utiliser la séquence de remplissage automatique par défaut du groupe</translation> + </message> + <message> + <source>&Use custom Auto-Type sequence:</source> + <translation>Utiliser une séquence de remplissage automatique personnalisée :</translation> + </message> + <message> + <source>Window Associations</source> + <translation>Associations de fenêtre</translation> + </message> <message> <source>+</source> <translation>+</translation> @@ -902,14 +1375,6 @@ Voulez vous l'ouvrir quand même ?</translation> <source>Window title:</source> <translation>Titre de la fenêtre :</translation> </message> - <message> - <source>Inherit default Auto-Type sequence from the &group</source> - <translation>Utiliser la séquence de remplissage automatique par défaut du groupe</translation> - </message> - <message> - <source>&Use custom Auto-Type sequence:</source> - <translation>Utiliser une séquence de remplissage automatique personnalisée :</translation> - </message> <message> <source>Use default se&quence</source> <translation>Utiliser la séquence par défaut</translation> @@ -918,10 +1383,6 @@ Voulez vous l'ouvrir quand même ?</translation> <source>Set custo&m sequence:</source> <translation>Définir une séquence personnalisée :</translation> </message> - <message> - <source>Window Associations</source> - <translation>Associations de fenêtre</translation> - </message> </context> <context> <name>EditEntryWidgetHistory</name> @@ -945,12 +1406,8 @@ Voulez vous l'ouvrir quand même ?</translation> <context> <name>EditEntryWidgetMain</name> <message> - <source>Title:</source> - <translation>Titre :</translation> - </message> - <message> - <source>Username:</source> - <translation>Nom d'utilisateur :</translation> + <source>URL:</source> + <translation>URL :</translation> </message> <message> <source>Password:</source> @@ -961,20 +1418,104 @@ Voulez vous l'ouvrir quand même ?</translation> <translation>Confirmation :</translation> </message> <message> - <source>URL:</source> - <translation>URL :</translation> + <source>Title:</source> + <translation>Titre :</translation> </message> <message> - <source>Expires</source> - <translation>Expiration</translation> + <source>Notes</source> + <translation>Notes</translation> </message> <message> <source>Presets</source> <translation>Valeurs par défaut</translation> </message> <message> - <source>Notes:</source> - <translation>Notes :</translation> + <source>Toggle the checkbox to reveal the notes section.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username:</source> + <translation>Nom d'utilisateur :</translation> + </message> + <message> + <source>Expires</source> + <translation>Expiration</translation> + </message> +</context> +<context> + <name>EditEntryWidgetSSHAgent</name> + <message> + <source>Form</source> + <translation>Formulaire</translation> + </message> + <message> + <source>Remove key from agent after</source> + <translation type="unfinished"/> + </message> + <message> + <source> seconds</source> + <translation>secondes</translation> + </message> + <message> + <source>Fingerprint</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent when database is closed/locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Public key</source> + <translation>Clé publique</translation> + </message> + <message> + <source>Add key to agent when database is opened/unlocked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Comment</source> + <translation>Commentaire</translation> + </message> + <message> + <source>Decrypt</source> + <translation>Déchiffré</translation> + </message> + <message> + <source>n/a</source> + <translation>n/a</translation> + </message> + <message> + <source>Copy to clipboard</source> + <translation>Copier dans le presse-papier</translation> + </message> + <message> + <source>Private key</source> + <translation>Clé privée</translation> + </message> + <message> + <source>External file</source> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Explorer...</translation> + </message> + <message> + <source>Attachment</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add to agent</source> + <translation>Ajouter à l'agent</translation> + </message> + <message> + <source>Remove from agent</source> + <translation>Retirer de l'agent</translation> + </message> + <message> + <source>Require user confirmation when this key is used</source> + <translation type="unfinished"/> </message> </context> <context> @@ -1045,6 +1586,14 @@ Voulez vous l'ouvrir quand même ?</translation> </context> <context> <name>EditWidgetIcons</name> + <message> + <source>&Use default icon</source> + <translation>Utiliser l'icône par défaut</translation> + </message> + <message> + <source>Use custo&m icon</source> + <translation>Utiliser une icône personnalisée</translation> + </message> <message> <source>Add custom icon</source> <translation>Ajouter une icône personnalisée</translation> @@ -1053,18 +1602,6 @@ Voulez vous l'ouvrir quand même ?</translation> <source>Delete custom icon</source> <translation>Supprimer une icône personnalisée</translation> </message> - <message> - <source>Images</source> - <translation>Images</translation> - </message> - <message> - <source>All files</source> - <translation>Tous les dossiers</translation> - </message> - <message> - <source>Select Image</source> - <translation>Choisir une image</translation> - </message> <message> <source>Download favicon</source> <translation>Télécharger la favicône</translation> @@ -1073,17 +1610,29 @@ Voulez vous l'ouvrir quand même ?</translation> <source>Unable to fetch favicon.</source> <translation>Impossible de récupérer la favicône</translation> </message> + <message> + <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> + <translation>Astuce : Vous pouvez activer Google en tant que repli sous Outils>Paramètres>Sécurité</translation> + </message> + <message> + <source>Images</source> + <translation>Images</translation> + </message> + <message> + <source>All files</source> + <translation>Tous les fichiers</translation> + </message> + <message> + <source>Select Image</source> + <translation>Choisir une image</translation> + </message> <message> <source>Can't read icon</source> <translation>Impossible de lire l'icône</translation> </message> <message> - <source>&Use default icon</source> - <translation>Utiliser l'icône par défaut</translation> - </message> - <message> - <source>Use custo&m icon</source> - <translation>Utiliser une icône personnalisée</translation> + <source>Custom icon already exists</source> + <translation>L'icône personnalisée existe déjà</translation> </message> <message> <source>Confirm Delete</source> @@ -1093,14 +1642,6 @@ Voulez vous l'ouvrir quand même ?</translation> <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> <translation>Cette icône est utilisée par %1 entrée et sera remplacée par l'icône par défaut. Êtes-vous sûr de vouloir l'effacer?</translation> </message> - <message> - <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation>Astuce : Vous pouvez activer Google en tant que repli sous Outils>Paramètres>Sécurité</translation> - </message> - <message> - <source>Custom icon already exists</source> - <translation>L'icône personnalisée existe déjà</translation> - </message> </context> <context> <name>EditWidgetProperties</name> @@ -1125,9 +1666,93 @@ Voulez vous l'ouvrir quand même ?</translation> <name>Entry</name> <message> <source> - Clone</source> + <comment>Suffix added to cloned entries</comment> <translation> - Cloner</translation> </message> </context> +<context> + <name>EntryAttachmentsModel</name> + <message> + <source>Name</source> + <translation>Nom</translation> + </message> + <message> + <source>Size</source> + <translation>Taille</translation> + </message> +</context> +<context> + <name>EntryAttachmentsWidget</name> + <message> + <source>Form</source> + <translation>Formulaire</translation> + </message> + <message> + <source>Add</source> + <translation>Ajouter</translation> + </message> + <message> + <source>Remove</source> + <translation>Supprimer</translation> + </message> + <message> + <source>Open</source> + <translation>Ouvrir</translation> + </message> + <message> + <source>Save</source> + <translation>Enregistrer le fichier</translation> + </message> + <message> + <source>Select files</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <source>Are you sure you want to remove %n attachment(s)?</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>Confirmez la suppression</translation> + </message> + <message> + <source>Save attachments</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to create directory: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Confirm overwrite</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to save attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachment: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open files: +%1</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EntryAttributesModel</name> <message> @@ -1156,6 +1781,11 @@ Voulez vous l'ouvrir quand même ?</translation> </context> <context> <name>EntryModel</name> + <message> + <source>Ref: </source> + <comment>Reference abbreviation</comment> + <translation>Réf : </translation> + </message> <message> <source>Group</source> <translation>Groupe</translation> @@ -1172,11 +1802,6 @@ Voulez vous l'ouvrir quand même ?</translation> <source>URL</source> <translation>URL</translation> </message> - <message> - <source>Ref: </source> - <comment>Reference abbreviation</comment> - <translation>Réf : </translation> - </message> </context> <context> <name>Group</name> @@ -1185,6 +1810,17 @@ Voulez vous l'ouvrir quand même ?</translation> <translation>Corbeille</translation> </message> </context> +<context> + <name>HostInstaller</name> + <message> + <source>KeePassXC: Cannot save file!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot save the native messaging script file.</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>HttpPasswordGeneratorWidget</name> <message> @@ -1247,6 +1883,361 @@ Voulez vous l'ouvrir quand même ?</translation> <translation>Fermer le message</translation> </message> </context> +<context> + <name>Kdbx3Reader</name> + <message> + <source>Unable to calculate master key</source> + <translation>Impossible de calculer la clé maître</translation> + </message> + <message> + <source>Unable to issue challenge-response.</source> + <translation>Impossible de lancer une challenge-réponse.</translation> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>Clé incorrecte ou la base de données est corrompue.</translation> + </message> +</context> +<context> + <name>Kdbx3Writer</name> + <message> + <source>Unable to issue challenge-response.</source> + <translation>Impossible de lancer une challenge-réponse.</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Impossible de calculer la clé maître</translation> + </message> +</context> +<context> + <name>Kdbx4Reader</name> + <message> + <source>missing database headers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Impossible de calculer la clé maître</translation> + </message> + <message> + <source>Invalid header checksum size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Header SHA256 mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher</source> + <translation>Chiffrement inconnu</translation> + </message> + <message> + <source>Invalid header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header data length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open buffer for KDF parameters in header</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported key derivation function (KDF) or invalid parameters</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy header fields found in KDBX4 file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header binary size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass variant map version.</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name data</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value data</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Bool entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry type</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map field type size</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Kdbx4Writer</name> + <message> + <source>Invalid symmetric cipher algorithm.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid symmetric cipher IV size.</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Impossible de calculer la clé maître</translation> + </message> + <message> + <source>Failed to serialize KDF parameters variant map</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxReader</name> + <message> + <source>Invalid cipher uuid length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid compression flags length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported compression algorithm</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid master seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform rounds size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid start bytes size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid random stream id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner random stream cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>Ce n'est pas une base de données KeePass.</translation> + </message> + <message> + <source>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> + <translation>Le fichier sélectionné est une ancienne base de données KeePass 1 (.kdb). + +Vous pouvez l'importer en cliquant sur Base de données>'Importer une base de données KeePass 1 ...' +Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir la base de données importée avec l'ancienne version de KeePassX 0.4.</translation> + </message> + <message> + <source>Unsupported KeePass 2 database version.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxXmlReader</name> + <message> + <source>XML parsing failure: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>No root group</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing icon uuid or data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing custom data key or value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Multiple group elements</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null group uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableAutoType value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableSearching value</source> + <translation type="unfinished"/> + </message> + <message> + <source>No group uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null DeleteObject uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing DeletedObject uuid or time</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null entry uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element in history entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>No entry uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element with different uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decrypt entry string</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate custom attribute found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry string key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate attachment found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry binary key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-type association window or sequence missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid bool value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid date time value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color rgb part</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid uuid value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decompress binary</source> + <extracomment>Translator meant is a binary data inside an entry</extracomment> + <translation type="unfinished"/> + </message> +</context> <context> <name>KeePass1OpenWidget</name> <message> @@ -1276,6 +2267,35 @@ Voulez vous l'ouvrir quand même ?</translation> <source>Unsupported KeePass database version.</source> <translation>Version de base de données KeePass non supportée.</translation> </message> + <message> + <source>Unable to read encryption IV</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of groups</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid content hash size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of transform rounds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to construct group tree</source> + <translation type="unfinished"/> + </message> <message> <source>Root</source> <translation>Racine</translation> @@ -1288,60 +2308,104 @@ Voulez vous l'ouvrir quand même ?</translation> <source>Wrong key or database file is corrupt.</source> <translation>Clé incorrecte ou la base de données est corrompue.</translation> </message> -</context> -<context> - <name>KeePass2Reader</name> <message> - <source>Not a KeePass database.</source> - <translation>Ce n'est pas une base de données KeePass.</translation> + <source>Key transformation failed</source> + <translation type="unfinished"/> </message> <message> - <source>Unsupported KeePass database version.</source> - <translation>Version de base de données KeePass non supportée.</translation> + <source>Invalid group field type number</source> + <translation type="unfinished"/> </message> <message> - <source>Wrong key or database file is corrupt.</source> - <translation>Mauvaise clé ou fichier de base de données corrompu.</translation> + <source>Invalid group field size</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>Impossible de calculer la clé maître</translation> + <source>Read group field data doesn't match size</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to issue challenge-response.</source> - <translation>Impossible de lancer une challenge-réponse.</translation> + <source>Incorrect group id field size</source> + <translation type="unfinished"/> </message> <message> - <source>The selected file is an old KeePass 1 database (.kdb). - -You can import it by clicking on Database > 'Import KeePass 1 database...'. -This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> - <translation>Le fichier sélectionné est une ancienne base de données KeePass 1 (.kdb). - -Vous pouvez l'importer en cliquant sur Base de données>'Importer une base de données KeePass 1 ...' -Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir la base de données importée avec l'ancienne version de KeePassX 0.4.</translation> - </message> -</context> -<context> - <name>KeePass2Writer</name> - <message> - <source>Unable to issue challenge-response.</source> - <translation>Impossible de lancer une challenge-réponse.</translation> + <source>Incorrect group creation time field size</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>Impossible de calculer la clé maître</translation> + <source>Incorrect group modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group access time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group level field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing group id or level</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing entry field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read entry field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry uuid field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field type</source> + <translation type="unfinished"/> </message> </context> <context> <name>Main</name> <message> - <source>Fatal error while testing the cryptographic functions.</source> - <translation>Erreur fatale lors des tests des fonctions cryptographiques.</translation> - </message> - <message> - <source>KeePassXC - Error</source> - <translation>KeePassXC - Erreur</translation> + <source>Existing single-instance lock file is invalid. Launching new instance.</source> + <translation>Le fichier de verrouillage de l’instance unique existant n’est pas valide. Lancement d'une nouvelle instance.</translation> </message> <message> <source>The lock file could not be created. Single-instance mode disabled.</source> @@ -1352,64 +2416,32 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l <translation>Une autre instance de KeePassXC est déjà en cours d'exécution.</translation> </message> <message> - <source>Existing single-instance lock file is invalid. Launching new instance.</source> - <translation>Le fichier de verrouillage de l’instance unique existant n’est pas valide. Lancement d'une nouvelle instance.</translation> + <source>Fatal error while testing the cryptographic functions.</source> + <translation>Erreur fatale lors des tests des fonctions cryptographiques.</translation> + </message> + <message> + <source>KeePassXC - Error</source> + <translation>KeePassXC - Erreur</translation> </message> </context> <context> <name>MainWindow</name> <message> - <source>Open database</source> - <translation>Ouvrir une base de données</translation> - </message> - <message> - <source>Database settings</source> - <translation>Paramètres de la base de données</translation> - </message> - <message> - <source>Copy username to clipboard</source> - <translation>Copier le nom d'utilisateur dans le presse-papier</translation> - </message> - <message> - <source>Copy password to clipboard</source> - <translation>Copier le mot de passe dans le presse-papier</translation> - </message> - <message> - <source>Settings</source> - <translation>Paramètres</translation> - </message> - <message> - <source>Show toolbar</source> - <translation>Afficher la barre d'outils</translation> - </message> - <message> - <source>read-only</source> - <translation>Lecture seulement</translation> - </message> - <message> - <source>Toggle window</source> - <translation>Basculer de fenêtre</translation> - </message> - <message> - <source>KeePass 2 Database</source> - <translation>Base de données KeePass 2</translation> - </message> - <message> - <source>All files</source> - <translation>Tous les fichiers</translation> - </message> - <message> - <source>Save repaired database</source> - <translation>Sauvegarder la base de données réparée</translation> - </message> - <message> - <source>Writing the database failed.</source> - <translation>Une erreur s'est produite lors de l'écriture de la base de données.</translation> + <source>&Database</source> + <translation>&Base de données</translation> </message> <message> <source>&Recent databases</source> <translation>Bases de données récentes</translation> </message> + <message> + <source>Import</source> + <translation>Importer</translation> + </message> + <message> + <source>&Help</source> + <translation>Aide</translation> + </message> <message> <source>E&ntries</source> <translation>Entrées</translation> @@ -1418,13 +2450,17 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l <source>Copy att&ribute to clipboard</source> <translation>Copier l'attribut dans le presse-papier</translation> </message> + <message> + <source>Time-based one-time password</source> + <translation type="unfinished"/> + </message> <message> <source>&Groups</source> <translation>Groupes</translation> </message> <message> - <source>&View</source> - <translation>Affichage</translation> + <source>&Tools</source> + <translation>&Outils</translation> </message> <message> <source>&Quit</source> @@ -1434,6 +2470,10 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l <source>&About</source> <translation>&À propos</translation> </message> + <message> + <source>&Open database...</source> + <translation>&Ouvrir la base de donnée...</translation> + </message> <message> <source>&Save database</source> <translation>Enregistrer la base de données</translation> @@ -1474,26 +2514,26 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l <source>&Delete group</source> <translation>&Supprimer le groupe</translation> </message> + <message> + <source>Sa&ve database as...</source> + <translation>Sau&ver la base de données sous...</translation> + </message> + <message> + <source>Change &master key...</source> + <translation>Changer la clé &maître...</translation> + </message> <message> <source>&Database settings</source> <translation>Paramètre de la base de &données</translation> </message> + <message> + <source>Database settings</source> + <translation>Paramètres de la base de données</translation> + </message> <message> <source>&Clone entry</source> <translation>Cloner l'entrée</translation> </message> - <message> - <source>Timed one-time password</source> - <translation>Mot de passe à usage unique</translation> - </message> - <message> - <source>Copy &TOTP</source> - <translation>Copie &TOTP</translation> - </message> - <message> - <source>Show TOTP</source> - <translation>Afficher TOTP</translation> - </message> <message> <source>&Find</source> <translation>Trouver</translation> @@ -1502,14 +2542,26 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l <source>Copy &username</source> <translation>Copier le nom d'utilisateur</translation> </message> + <message> + <source>Copy username to clipboard</source> + <translation>Copier le nom d'utilisateur dans le presse-papier</translation> + </message> <message> <source>Cop&y password</source> <translation>Copier le mot de passe</translation> </message> + <message> + <source>Copy password to clipboard</source> + <translation>Copier le mot de passe dans le presse-papier</translation> + </message> <message> <source>&Settings</source> <translation>Paramètres</translation> </message> + <message> + <source>Password Generator</source> + <translation>Générateur de mot de passe</translation> + </message> <message> <source>&Perform Auto-Type</source> <translation>Exécuter la saisie semi-automatique</translation> @@ -1526,65 +2578,25 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l <source>&Title</source> <translation>&Titre</translation> </message> + <message> + <source>Copy title to clipboard</source> + <translation type="unfinished"/> + </message> <message> <source>&URL</source> <translation>&URL</translation> </message> + <message> + <source>Copy URL to clipboard</source> + <translation type="unfinished"/> + </message> <message> <source>&Notes</source> <translation>&Notes</translation> </message> <message> - <source>Password Generator</source> - <translation>Générateur de mot de passe</translation> - </message> - <message> - <source>Clear history</source> - <translation>Effacer l'historique</translation> - </message> - <message> - <source>&Database</source> - <translation>&Base de données</translation> - </message> - <message> - <source>Import</source> - <translation>Importer</translation> - </message> - <message> - <source>&Tools</source> - <translation>&Outils</translation> - </message> - <message> - <source>Empty recycle bin</source> - <translation>Vider la corbeille</translation> - </message> - <message> - <source>Access error for config file %1</source> - <translation>Erreur d'accès au fichier de configuration %1</translation> - </message> - <message> - <source>Quit KeePassXC</source> - <translation>Quitter KeePass XC</translation> - </message> - <message> - <source>Please touch the button on your YubiKey!</source> - <translation>Veuillez presser le bouton de votre YubiKey!</translation> - </message> - <message> - <source>&Help</source> - <translation>Aide</translation> - </message> - <message> - <source>&Open database...</source> - <translation>&Ouvrir la base de donnée...</translation> - </message> - <message> - <source>Sa&ve database as...</source> - <translation>Sau&ver la base de données sous...</translation> - </message> - <message> - <source>Change &master key...</source> - <translation>Changer la clé &maître...</translation> + <source>Copy notes to clipboard</source> + <translation type="unfinished"/> </message> <message> <source>&Export to CSV file...</source> @@ -1602,10 +2614,169 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l <source>Re&pair database...</source> <translation>Ré&parer la base de données...</translation> </message> + <message> + <source>Show TOTP</source> + <translation>Afficher TOTP</translation> + </message> <message> <source>Set up TOTP...</source> <translation>Configurer TOTP...</translation> </message> + <message> + <source>Copy &TOTP</source> + <translation>Copie &TOTP</translation> + </message> + <message> + <source>E&mpty recycle bin</source> + <translation type="unfinished"/> + </message> + <message> + <source>Clear history</source> + <translation>Effacer l'historique</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation>Erreur d'accès au fichier de configuration %1</translation> + </message> + <message> + <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> + <translation type="unfinished"/> + </message> + <message> + <source>read-only</source> + <translation>Lecture seulement</translation> + </message> + <message> + <source>Settings</source> + <translation>Paramètres</translation> + </message> + <message> + <source>Toggle window</source> + <translation>Basculer de fenêtre</translation> + </message> + <message> + <source>Quit KeePassXC</source> + <translation>Quitter KeePass XC</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>Base de données Keepass 2</translation> + </message> + <message> + <source>All files</source> + <translation>Tous les fichiers</translation> + </message> + <message> + <source>Open database</source> + <translation>Ouvrir la base de données</translation> + </message> + <message> + <source>Save repaired database</source> + <translation>Sauvegarder la base de données réparée</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>Une erreur s'est produite lors de l'écriture de la base de données.</translation> + </message> + <message> + <source>Please touch the button on your YubiKey!</source> + <translation>Veuillez presser le bouton de votre YubiKey!</translation> + </message> +</context> +<context> + <name>OpenSSHKey</name> + <message> + <source>Invalid key file, expecting an OpenSSH key</source> + <translation type="unfinished"/> + </message> + <message> + <source>PEM boundary mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>This is not an OpenSSH key, only modern keys are supported</source> + <translation type="unfinished"/> + </message> + <message> + <source>Base64 decoding failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file way too small.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file magic header id invalid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Found zero keys</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to read public key.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Corrupted key file, reading private key failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>No private key payload to decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Trying to run KDF without cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Passphrase is required to decrypt this key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key derivation failed, key file corrupted?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Decryption failed, wrong passphrase?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write public key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write private key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing private key</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OptionDialog</name> @@ -1613,22 +2784,63 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l <source>Dialog</source> <translation>Dialogue</translation> </message> + <message> + <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation>Ceci est requis pour accéder à vos bases de données à partir de ChromeIPass ou PassIFox</translation> + </message> + <message> + <source>Enable KeePassHTTP server</source> + <translation>Activer le serveur KeePassHTTP</translation> + </message> <message> <source>General</source> <translation>Général</translation> </message> <message> <source>Sh&ow a notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> <translation>Montrer une notification quand les références sont demandées</translation> </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>Renvoie seulement les meilleures correspondances pour une URL spécifique au lieu des entrées pour tout le domaine.</translation> + </message> + <message> + <source>&Return only best matching entries</source> + <translation>&Retourner seulement les meilleurs entrées</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Demander de déverrouiller la base de données lorsque celle-ci est verrouillée</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> + <translation>Seules les entrées avec le même schéma (http://, https://, ftp://, ...) sont retournées.</translation> + </message> + <message> + <source>&Match URL schemes</source> + <translation>&Schémas de correspondance URL</translation> + </message> <message> <source>Sort matching entries by &username</source> <translation>Trier les entrées correspondantes par nom d'&utilisateur</translation> </message> + <message> + <source>Sort &matching entries by title</source> + <translation>Trier les entrées correspondantes par titre</translation> + </message> + <message> + <source>R&emove all shared encryption keys from active database</source> + <translation>Supprimer toutes les clés de chiffrement partagées de la base de données active</translation> + </message> <message> <source>Re&move all stored permissions from entries in active database</source> <translation>Supprimer toutes les permissions enregistrées des entrées de la base de données active</translation> </message> + <message> + <source>Password Generator</source> + <translation>Générateur de mot de passe</translation> + </message> <message> <source>Advanced</source> <translation>Avancé</translation> @@ -1641,10 +2853,22 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l <source>Always allow &updating entries</source> <translation>Toujours autoriser la mise à jour des entrées</translation> </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>Seule la base de données sélectionnée doit être connectée avec un client.</translation> + </message> <message> <source>Searc&h in all opened databases for matching entries</source> <translation>Cherc&her dans toutes les bases de données ouvertes les entrées correspondantes</translation> </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>La création ou la mise a jour automatique ne sont pas pris en charge pour les champs de chaines de caractères !</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>& Retourne les champs avancés de type chaîne qui commencent par "KPH :"</translation> + </message> <message> <source>HTTP Port:</source> <translation>Port HTTP :</translation> @@ -1653,18 +2877,18 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l <source>Default port: 19455</source> <translation>Port par défaut : 19455</translation> </message> - <message> - <source>Re&quest to unlock the database if it is locked</source> - <translation>Demander de déverrouiller la base de données lorsque celle-ci est verrouillée</translation> - </message> - <message> - <source>Sort &matching entries by title</source> - <translation>Trier les entrées correspondantes par titre</translation> - </message> <message> <source>KeePassXC will listen to this port on 127.0.0.1</source> <translation>KeepassXC va écouter ce port sur 127.0.0.1</translation> </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> + <translation type="unfinished"/> + </message> <message> <source>Cannot bind to privileged ports</source> <translation>Liaison impossible avec les ports privilégiés</translation> @@ -1675,66 +2899,33 @@ Using default port 19455.</source> <translation>Liaison impossible avec les ports privilégiés, ceux avant 1024 ! Restauration du port 19455 par défaut.</translation> </message> - <message> - <source>R&emove all shared encryption keys from active database</source> - <translation>Supprimer toutes les clés de chiffrement partagées de la base de données active</translation> - </message> - <message> - <source>&Return advanced string fields which start with "KPH: "</source> - <translation>& Retourne les champs avancés de type chaîne qui commencent par "KPH :"</translation> - </message> - <message> - <source>Automatically creating or updating string fields is not supported.</source> - <translation>La création ou la mise a jour automatique ne sont pas pris en charge pour les champs de chaines de caractères !</translation> - </message> - <message> - <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> - <translation>Ceci est requis pour accéder à vos bases de données à partir de ChromeIPass ou PassIFox</translation> - </message> - <message> - <source>Enable KeePassHTTP server</source> - <translation>Activer le serveur KeePassHTTP</translation> - </message> - <message> - <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation>Renvoie seulement les meilleures correspondances pour une URL spécifique au lieu des entrées pour tout le domaine.</translation> - </message> - <message> - <source>&Return only best matching entries</source> - <translation>&Retourner seulement les meilleurs entrées</translation> - </message> - <message> - <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation>Seules les entrées avec le même schéma (http://, https://, ftp://, ...) sont retournées.</translation> - </message> - <message> - <source>&Match URL schemes</source> - <translation>&Schémas de correspondance URL</translation> - </message> - <message> - <source>Password Generator</source> - <translation>Générateur de mot de passe</translation> - </message> - <message> - <source>Only the selected database has to be connected with a client.</source> - <translation>Seule la base de données sélectionnée doit être connectée avec un client.</translation> - </message> - <message> - <source>The following options can be dangerous! -Change them only if you know what you are doing.</source> - <translation>Les options suivantes pourraient être dangereuses! -Ne les changez que si vous savez ce que vous faites.</translation> - </message> </context> <context> <name>PasswordGeneratorWidget</name> + <message> + <source>%p%</source> + <translation>%p%</translation> + </message> <message> <source>Password:</source> <translation>Mot de passe :</translation> </message> + <message> + <source>strength</source> + <comment>Password strength</comment> + <translation>force</translation> + </message> + <message> + <source>entropy</source> + <translation>entropie</translation> + </message> + <message> + <source>Password</source> + <translation>Mot de passe</translation> + </message> <message> <source>Character Types</source> - <translation>Types de caractères</translation> + <translation>Types de caractères:</translation> </message> <message> <source>Upper Case Letters</source> @@ -1746,44 +2937,56 @@ Ne les changez que si vous savez ce que vous faites.</translation> </message> <message> <source>Numbers</source> - <translation>Nombres</translation> + <translation>Chiffres</translation> </message> <message> <source>Special Characters</source> <translation>Caractères spéciaux</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>ASCII étendu</translation> + </message> <message> <source>Exclude look-alike characters</source> - <translation>Exclure les caractères se ressemblant</translation> - </message> - <message> - <source>Accept</source> - <translation>Accepter</translation> - </message> - <message> - <source>%p%</source> - <translation>%p%</translation> - </message> - <message> - <source>strength</source> - <translation>force</translation> - </message> - <message> - <source>entropy</source> - <translation>entropie</translation> - </message> - <message> - <source>&Length:</source> - <translation>&Longueur :</translation> + <translation>Exclure les caractères qui se ressemblent</translation> </message> <message> <source>Pick characters from every group</source> <translation>Inclure des caractères de chaque groupe</translation> </message> + <message> + <source>&Length:</source> + <translation>&Longueur :</translation> + </message> + <message> + <source>Passphrase</source> + <translation>Phrase secrète</translation> + </message> + <message> + <source>Wordlist:</source> + <translation>Liste de mots :</translation> + </message> + <message> + <source>Word Count:</source> + <translation>Nombre de mots :</translation> + </message> + <message> + <source>Word Separator:</source> + <translation>Séparateur de mot :</translation> + </message> <message> <source>Generate</source> <translation>Générer</translation> </message> + <message> + <source>Copy</source> + <translation>Copie</translation> + </message> + <message> + <source>Accept</source> + <translation>Accepter</translation> + </message> <message> <source>Close</source> <translation>Fermer</translation> @@ -1802,51 +3005,270 @@ Ne les changez que si vous savez ce que vous faites.</translation> </message> <message> <source>Poor</source> + <comment>Password quality</comment> <translation>Pauvre</translation> </message> <message> <source>Weak</source> + <comment>Password quality</comment> <translation>Faible</translation> </message> <message> <source>Good</source> + <comment>Password quality</comment> <translation>Bon</translation> </message> <message> <source>Excellent</source> + <comment>Password quality</comment> <translation>Excellent</translation> </message> - <message> - <source>Password</source> - <translation>Mot de passe</translation> - </message> - <message> - <source>Extended ASCII</source> - <translation>ASCII étendu</translation> - </message> - <message> - <source>Passphrase</source> - <translation>Phrase secrète</translation> - </message> - <message> - <source>Wordlist:</source> - <translation>Liste de mots :</translation> - </message> - <message> - <source>Word Count:</source> - <translation>Nombre de mots :</translation> - </message> - <message> - <source>Word Separator:</source> - <translation>Séparateur de mot :</translation> - </message> - <message> - <source>Copy</source> - <translation>Copie</translation> - </message> </context> <context> <name>QObject</name> + <message> + <source>Database not opened</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database hash not available</source> + <translation type="unfinished"/> + </message> + <message> + <source>Client public key not received</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot decrypt message</source> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout or cannot connect to KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>Action cancelled or denied</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC association failed, try again</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key change was not successful</source> + <translation type="unfinished"/> + </message> + <message> + <source>Encryption key is not recognized</source> + <translation type="unfinished"/> + </message> + <message> + <source>No saved databases found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect action</source> + <translation type="unfinished"/> + </message> + <message> + <source>Empty message received</source> + <translation type="unfinished"/> + </message> + <message> + <source>No URL provided</source> + <translation type="unfinished"/> + </message> + <message> + <source>No logins found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown error</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add a new entry to a database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>Chemin d'accès de la base de données.</translation> + </message> + <message> + <source>Key file of the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>path</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>username</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Prompt for the entry's password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a password for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length for the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to add.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy an entry's password to the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to clip.</source> + <comment>clip = copy to clipboard</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout in seconds before clearing the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Edit an entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Title for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>title</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to edit.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Estimate the entropy of a password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password for which to estimate the entropy.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Perform advanced analysis on the password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Extract and print the content of a database.</source> + <translation>Extraire et imprimer le contenu d'une base de données.</translation> + </message> + <message> + <source>Path of the database to extract.</source> + <translation>Chemin de la base de données à extraire.</translation> + </message> + <message> + <source>Insert password to unlock %1: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to load key file %1 : %2</source> + <translation type="unfinished"/> + </message> + <message> + <source>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source> + +Available commands: +</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the command to execute.</source> + <translation>Nom de la commande à exécuter.</translation> + </message> + <message> + <source>List database entries.</source> + <translation>Lister les entrées de la base.</translation> + </message> + <message> + <source>Path of the group to list. Default is /</source> + <translation>Chemin du groupe à lister. Par défaut : /</translation> + </message> + <message> + <source>Find entries quickly.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Search term.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Merge two databases.</source> + <translation>Fusionner deux bases de données.</translation> + </message> + <message> + <source>Path of the database to merge into.</source> + <translation>Chemin de la base de données cible.</translation> + </message> + <message> + <source>Path of the database to merge from.</source> + <translation>Chemin de la base de données source.</translation> + </message> + <message> + <source>Use the same credentials for both database files.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file of the database to merge from.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show an entry's information.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> + <translation type="unfinished"/> + </message> + <message> + <source>attribute</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the entry to show.</source> + <translation>Nom de l'entrée à afficher.</translation> + </message> <message> <source>NULL device</source> <translation>Périphérique NULL</translation> @@ -1870,8 +3292,28 @@ Ne les changez que si vous savez ce que vous faites.</translation> <translation>fermeture de citation manquante</translation> </message> <message> - <source>INTERNAL - unget lower bound exceeded</source> - <translation>INTERNE - dépassement de la limite inférieure</translation> + <source>AES: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Twofish: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>ChaCha20: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Argon2 (KDBX 4 – recommended)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 4)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 3.1)</source> + <translation type="unfinished"/> </message> <message> <source>Group</source> @@ -1889,14 +3331,22 @@ Ne les changez que si vous savez ce que vous faites.</translation> <source>Password</source> <translation>Mot de passe</translation> </message> - <message> - <source>URL</source> - <translation>URL</translation> - </message> <message> <source>Notes</source> <translation>Notes</translation> </message> + <message> + <source>Last Modified</source> + <translation type="unfinished"/> + </message> + <message> + <source>Created</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy Browser Integration</source> + <translation type="unfinished"/> + </message> <message> <source>Browser Integration</source> <translation>Intégration Navigateur</translation> @@ -1913,6 +3363,10 @@ Ne les changez que si vous savez ce que vous faites.</translation> <source>Passive</source> <translation>Passif</translation> </message> + <message> + <source>SSH Agent</source> + <translation>SSH Agent</translation> + </message> </context> <context> <name>QtIOCompressor</name> @@ -1951,8 +3405,8 @@ Ne les changez que si vous savez ce que vous faites.</translation> <context> <name>SearchWidget</name> <message> - <source>Case Sensitive</source> - <translation>Sensible à la casse</translation> + <source>Search...</source> + <translation>Recherche...</translation> </message> <message> <source>Search</source> @@ -1963,8 +3417,8 @@ Ne les changez que si vous savez ce que vous faites.</translation> <translation>Effacer</translation> </message> <message> - <source>Search...</source> - <translation>Recherche...</translation> + <source>Case Sensitive</source> + <translation>Sensible à la casse</translation> </message> <message> <source>Limit search to selected group</source> @@ -1973,50 +3427,6 @@ Ne les changez que si vous savez ce que vous faites.</translation> </context> <context> <name>Service</name> - <message> - <source>A shared encryption-key with the name "%1" already exists. -Do you want to overwrite it?</source> - <translation>Une clé de chiffrement partagée avec le nom "%1" existe déjà. -Voulez-vous l'écraser ?</translation> - </message> - <message> - <source>Do you want to update the information in %1 - %2?</source> - <translation>Voulez-vous mettre à jour l'information dans %1 - %2 ?</translation> - </message> - <message> - <source>The active database is locked! -Please unlock the selected database or choose another one which is unlocked.</source> - <translation>La base de données actuelle est verrouillée ! -Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui est déverrouillée. </translation> - </message> - <message> - <source>Successfully removed %1 encryption-%2 from KeePassX/Http Settings.</source> - <translation>%1 %2 de chiffrement ont été retirés avec succès des paramètres de KeePassX/Http.</translation> - </message> - <message> - <source>No shared encryption-keys found in KeePassHttp Settings.</source> - <translation>Aucune clé de chiffrement partagée trouvée dans les paramètres de KeePassHttp.</translation> - </message> - <message> - <source>The active database does not contain an entry of KeePassHttp Settings.</source> - <translation>La base de données actuelle ne contient pas d'entrée de paramètres KeePassHttp.</translation> - </message> - <message> - <source>Removing stored permissions...</source> - <translation>Effacement des permissions enregistrées...</translation> - </message> - <message> - <source>Abort</source> - <translation>Annuler</translation> - </message> - <message> - <source>Successfully removed permissions from %1 %2.</source> - <translation>Les permissions de %1 %2 ont été retirées avec succès.</translation> - </message> - <message> - <source>The active database does not contain an entry with permissions.</source> - <translation>La base de données actuelle ne contient pas d'entrée avec des permissions.</translation> - </message> <message> <source>KeePassXC: New key association request</source> <translation>KeePassXC : nouvelle demande d'association</translation> @@ -2033,34 +3443,78 @@ attribuez lui un nom unique pour l'identifier et acceptez la.</translation> <source>KeePassXC: Overwrite existing key?</source> <translation>KeePassXC : Écraser la clé existante ?</translation> </message> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>Une clé de chiffrement partagée avec le nom "%1" existe déjà. +Voulez-vous l'écraser ?</translation> + </message> <message> <source>KeePassXC: Update Entry</source> <translation>KeePassXC : Mettre à jour l'entrée</translation> </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Voulez-vous mettre à jour l'information dans %1 - %2 ?</translation> + </message> <message> <source>KeePassXC: Database locked!</source> <translation>KeePassXC : Base de données verrouillée !</translation> </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>La base de données actuelle est verrouillée ! +Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui est déverrouillée. </translation> + </message> <message> <source>KeePassXC: Removed keys from database</source> <translation>KeePassXC : Les clés ont été effacées de la base de donnée</translation> </message> + <message numerus="yes"> + <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No keys found</source> <translation>KeePassXC : Aucune clé trouvée</translation> </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation>Aucune clé de chiffrement partagée trouvée dans les paramètres de KeePassHttp.</translation> + </message> <message> <source>KeePassXC: Settings not available!</source> <translation>KeePassXC: Paramètre indisponible !</translation> </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation>La base de données actuelle ne contient pas d'entrée de paramètres KeePassHttp.</translation> + </message> + <message> + <source>Removing stored permissions...</source> + <translation>Effacement des permissions enregistrées...</translation> + </message> + <message> + <source>Abort</source> + <translation>Annuler</translation> + </message> <message> <source>KeePassXC: Removed permissions</source> <translation>KeePassXC : Permissions retirées</translation> </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entries.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No entry with permissions found!</source> <translation>KeePassXC : Aucune entrée avec permissions trouvée !</translation> </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>La base de données actuelle ne contient pas d'entrée avec des permissions.</translation> + </message> </context> <context> <name>SettingsWidget</name> @@ -2083,10 +3537,26 @@ attribuez lui un nom unique pour l'identifier et acceptez la.</translation> </context> <context> <name>SettingsWidgetGeneral</name> + <message> + <source>Basic Settings</source> + <translation>Paramètres de base</translation> + </message> + <message> + <source>Start only a single instance of KeePassXC</source> + <translation>Démarrer uniquement une seule instance de KeePassXC</translation> + </message> <message> <source>Remember last databases</source> <translation>Se souvenir des dernières bases de données</translation> </message> + <message> + <source>Remember last key files and security dongles</source> + <translation>Se souvenir des derniers fichiers clé et des dongles de sécurité</translation> + </message> + <message> + <source>Load previous databases on startup</source> + <translation>Charger les bases de données précédentes au démarrage</translation> + </message> <message> <source>Automatically save on exit</source> <translation>Sauvegarder automatiquement à la sortie</translation> @@ -2095,21 +3565,29 @@ attribuez lui un nom unique pour l'identifier et acceptez la.</translation> <source>Automatically save after every change</source> <translation>Sauvegarder automatiquement après chaque modification</translation> </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation>Recharger automatiquement la base de données quand celle-ci est modifiée depuis l'extérieur</translation> + </message> <message> <source>Minimize when copying to clipboard</source> <translation>Réduire lors de la copie dans le presse-papier</translation> </message> + <message> + <source>Minimize window at application startup</source> + <translation>Minimiser la fenêtre lors du démarrage de l'application</translation> + </message> <message> <source>Use group icon on entry creation</source> <translation>Utiliser l'icône de groupe à la création d'une entrée</translation> </message> <message> - <source>Global Auto-Type shortcut</source> - <translation>Raccourci de la Saisie-Automatique</translation> + <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> + <translation>Ne pas indiquer la base de données comme modifiée pour les changements hors-données (par exemple : groupes développés)</translation> </message> <message> - <source>Language</source> - <translation>Langue</translation> + <source>Hide the Details view</source> + <translation type="unfinished"/> </message> <message> <source>Show a system tray icon</source> @@ -2119,67 +3597,61 @@ attribuez lui un nom unique pour l'identifier et acceptez la.</translation> <source>Hide window to system tray when minimized</source> <translation>Réduire la fenêtre vers la zone de notification lors de sa réduction</translation> </message> - <message> - <source>Load previous databases on startup</source> - <translation>Charger les bases de données précédentes au démarrage</translation> - </message> - <message> - <source>Automatically reload the database when modified externally</source> - <translation>Recharger automatiquement la base de données quand celle-ci est modifiée depuis l'extérieur</translation> - </message> <message> <source>Hide window to system tray instead of app exit</source> <translation>Envoyer la fenêtre dans la zone de notification au lieu de quitter l'application</translation> </message> <message> - <source>Minimize window at application startup</source> - <translation>Minimiser la fenêtre lors du démarrage de l'application</translation> + <source>Dark system tray icon</source> + <translation type="unfinished"/> </message> <message> - <source>Basic Settings</source> - <translation>Paramètres de base</translation> - </message> - <message> - <source>Remember last key files and security dongles</source> - <translation>Se souvenir des derniers fichiers clé et des dongles de sécurité</translation> - </message> - <message> - <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> - <translation>Ne pas indiquer la base de données comme modifiée pour les changements hors-données (par exemple : groupes développés)</translation> + <source>Language</source> + <translation>Langue</translation> </message> <message> <source>Auto-Type</source> <translation>Saisie-Automatique</translation> </message> <message> - <source>Use entry title and URL to match windows for global Auto-Type</source> - <translation>Utilisez le titre de l'entrée et l'URL dans la correspondance des fenêtres pour la Saisie-Automatique globale.</translation> + <source>Use entry title to match windows for global Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use entry URL to match windows for global Auto-Type</source> + <translation type="unfinished"/> </message> <message> <source>Always ask before performing Auto-Type</source> <translation>Toujours demander avant de procéder à une Saisie-Automatique</translation> </message> + <message> + <source>Global Auto-Type shortcut</source> + <translation>Raccourci de la Saisie-Automatique</translation> + </message> <message> <source>Auto-Type delay</source> <translation>Délais de Remplissage de la Saisie-Automatique</translation> </message> <message> <source> ms</source> + <comment>Milliseconds</comment> <translation>ms</translation> </message> - <message> - <source>Start only a single instance of KeePassXC</source> - <translation>Démarrer uniquement une seule instance de KeePassXC</translation> - </message> </context> <context> <name>SettingsWidgetSecurity</name> + <message> + <source>Timeouts</source> + <translation>Timeouts</translation> + </message> <message> <source>Clear clipboard after</source> <translation>Vider le presse-papier après</translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation> s</translation> </message> <message> @@ -2187,8 +3659,12 @@ attribuez lui un nom unique pour l'identifier et acceptez la.</translation> <translation>Verrouiller les bases de données après une inactivité de</translation> </message> <message> - <source>Show passwords in cleartext by default</source> - <translation>Afficher les mots de passe en clair par défaut</translation> + <source>Convenience</source> + <translation>Convenance</translation> + </message> + <message> + <source>Lock databases when session is locked or lid is closed</source> + <translation>Verrouiller les bases de données quand la session est verrouillée ou le capot fermé</translation> </message> <message> <source>Lock databases after minimizing the window</source> @@ -2199,16 +3675,16 @@ attribuez lui un nom unique pour l'identifier et acceptez la.</translation> <translation>Ne pas demander de répéter le mot de passe lorsque celui-ci est visible</translation> </message> <message> - <source>Timeouts</source> - <translation>Timeouts</translation> + <source>Show passwords in cleartext by default</source> + <translation>Afficher les mots de passe en clair par défaut</translation> </message> <message> - <source>Convenience</source> - <translation>Convenance</translation> + <source>Hide passwords in the preview panel</source> + <translation type="unfinished"/> </message> <message> - <source>Lock databases when session is locked or lid is closed</source> - <translation>Verrouiller les bases de données quand la session est verrouillée ou le capot fermé</translation> + <source>Hide entry notes by default</source> + <translation type="unfinished"/> </message> <message> <source>Privacy</source> @@ -2229,6 +3705,14 @@ attribuez lui un nom unique pour l'identifier et acceptez la.</translation> <source>Key:</source> <translation>Clé :</translation> </message> + <message> + <source>Default RFC 6238 token settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Steam token settings</source> + <translation type="unfinished"/> + </message> <message> <source>Use custom settings</source> <translation>Utiliser les paramètres personnalisés</translation> @@ -2255,6 +3739,7 @@ attribuez lui un nom unique pour l'identifier et acceptez la.</translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation> s</translation> </message> </context> @@ -2321,6 +3806,26 @@ attribuez lui un nom unique pour l'identifier et acceptez la.</translation> </context> <context> <name>main</name> + <message> + <source>Remove an entry from the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>Chemin d'accès de la base de données.</translation> + </message> + <message> + <source>Path of the entry to remove.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation>KeePassXC - Gestionnaire de mots de passe multiplateforme</translation> + </message> + <message> + <source>filenames of the password databases to open (*.kdbx)</source> + <translation>noms de fichiers des bases de données de mot de passe à ouvrir (*.kdbx)</translation> + </message> <message> <source>path to a custom config file</source> <translation>Chemin vers un fichier de configuration personnalisé</translation> @@ -2329,81 +3834,13 @@ attribuez lui un nom unique pour l'identifier et acceptez la.</translation> <source>key file of the database</source> <translation>Fichier-clé de la base de données</translation> </message> - <message> - <source>KeePassXC - cross-platform password manager</source> - <translation>KeePassXC - Gestionnaire de mots de passe multiplateforme</translation> - </message> <message> <source>read password of the database from stdin</source> <translation>Lire le mot de passe de la base de données sur l'entrée standard</translation> </message> <message> - <source>filenames of the password databases to open (*.kdbx)</source> - <translation>noms de fichiers des bases de données de mot de passe à ouvrir (*.kdbx)</translation> - </message> - <message> - <source>Copy a password to the clipboard</source> - <translation>Copier un mot de passe dans le presse papier</translation> - </message> - <message> - <source>Path of the database.</source> - <translation>Chemin d'accès de la base de données.</translation> - </message> - <message> - <source>Use a GUI prompt unlocking the database.</source> - <translation>Utiliser une invite graphique pour déverrouiller la base de données.</translation> - </message> - <message> - <source>Name of the entry to clip.</source> - <translation>Nom de l'entrée épingler.</translation> - </message> - <message> - <source>Extract and print the content of a database.</source> - <translation>Extraire et imprimer le contenu d'une base de données.</translation> - </message> - <message> - <source>Path of the database to extract.</source> - <translation>Chemin de la base de données à extraire.</translation> - </message> - <message> - <source>Name of the command to execute.</source> - <translation>Nom de la commande à exécuter.</translation> - </message> - <message> - <source>List database entries.</source> - <translation>Lister les entrées de la base.</translation> - </message> - <message> - <source>Path of the group to list. Default is /</source> - <translation>Chemin du groupe à lister. Par défaut : /</translation> - </message> - <message> - <source>Print the UUIDs of the entries and groups.</source> - <translation>Imprimer les UUIDs des entrées et des groupes.</translation> - </message> - <message> - <source>Merge two databases.</source> - <translation>Fusionner deux bases de données.</translation> - </message> - <message> - <source>Path of the database to merge into.</source> - <translation>Chemin de la base de données cible.</translation> - </message> - <message> - <source>Path of the database to merge from.</source> - <translation>Chemin de la base de données source.</translation> - </message> - <message> - <source>Use the same password for both database files.</source> - <translation>Utiliser le même mot de passe pour les deux bases de données. </translation> - </message> - <message> - <source>Show a password.</source> - <translation>Afficher un mot de passe.</translation> - </message> - <message> - <source>Name of the entry to show.</source> - <translation>Nom de l'entrée à afficher.</translation> + <source>Parent window handle</source> + <translation type="unfinished"/> </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_hu.ts b/share/translations/keepassx_hu.ts index dc9877054..033f77ef2 100644 --- a/share/translations/keepassx_hu.ts +++ b/share/translations/keepassx_hu.ts @@ -9,14 +9,34 @@ <source>About</source> <translation>Névjegy</translation> </message> + <message> + <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> + <translation>Hibajelentés: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> + </message> + <message> + <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>A KeePassXC a GNU General Public License (GPL) 2. vagy (válaszhatóan ) 3. verziója szerint kerül terjesztésre.</translation> + </message> + <message> + <source>Project Maintainers:</source> + <translation>Projektkarbantartók:</translation> + </message> <message> <source>Contributors</source> <translation>Közreműködők</translation> </message> + <message> + <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Közreműködők megtekintése a GitHubon</a></translation> + </message> <message> <source>Debug Info</source> <translation>Hibakeresési információk</translation> </message> + <message> + <source>Include the following information whenever you report a bug:</source> + <translation>Minden hibajelentésnél legyenek mellékelve ezek az információk:</translation> + </message> <message> <source>Copy to clipboard</source> <translation>Vágólapra másolás</translation> @@ -31,6 +51,10 @@ <source>Revision: %1</source> <translation>Revízió: %1</translation> </message> + <message> + <source>Distribution: %1</source> + <translation>Disztribúció: %1</translation> + </message> <message> <source>Libraries:</source> <translation>Függvénykönyvtárak:</translation> @@ -47,33 +71,13 @@ Kernel: %3 %4</translation> <source>Enabled extensions:</source> <translation>Engedélyezett kiterjesztések:</translation> </message> - <message> - <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> - <translation>Hibajelentés: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> - </message> - <message> - <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>A KeePassXC a GNU General Public License (GPL) 2. vagy (válaszhatóan ) 3. verziója szerint kerül terjesztésre.</translation> - </message> - <message> - <source>Project Maintainers:</source> - <translation>Projektkarbantartók:</translation> - </message> - <message> - <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Közreműködők megtekintése a GitHubon</a></translation> - </message> - <message> - <source>Include the following information whenever you report a bug:</source> - <translation>Minden hibajelentésnél legyenek mellékelve ezek az információk:</translation> - </message> - <message> - <source>Distribution: %1</source> - <translation>Disztribúció: %1</translation> - </message> </context> <context> <name>AccessControlDialog</name> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>KeePassXC HTTP hozzáférési engedély</translation> + </message> <message> <source>Remember this decision</source> <translation>Döntés megjegyzése</translation> @@ -92,21 +96,44 @@ Please select whether you want to allow access.</source> <translation>A %1 jelszóengedélyt kér a következő elem(ek) számára. Válassza ki, hogy engedélyezi-e a hozzáférést.</translation> </message> +</context> +<context> + <name>AgentSettingsWidget</name> <message> - <source>KeePassXC HTTP Confirm Access</source> - <translation>KeePassXC HTTP hozzáférési engedély</translation> + <source>Enable SSH Agent (requires restart)</source> + <translation>SSH-ügynök engedélyezése (újraindítást igényel)</translation> </message> </context> <context> <name>AutoType</name> <message> <source>Couldn't find an entry that matches the window title:</source> - <translation>Nem található egyetlen elem sem, amely illeszkedik az ablak címsorára:</translation> + <translation>Nem található olyan bejegyzés, amely illeszkedik az ablak címsorára:</translation> </message> <message> <source>Auto-Type - KeePassXC</source> <translation>Automatikus beírás – KeePassXC</translation> </message> + <message> + <source>Auto-Type</source> + <translation>Automatikus beírás</translation> + </message> + <message> + <source>The Syntax of your Auto-Type statement is incorrect!</source> + <translation>Az automatikus beírás utasításszintaxisa helytelen!</translation> + </message> + <message> + <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> + <translation>Ez az automatikus beírás parancs nagyon hosszú késleltetést tartalmaz. Valóban folytatható?</translation> + </message> + <message> + <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> + <translation>Ez az automatikus beírás parancs nagyon lassú billentyűlenyomásokat tartalmaz. Valóban folytatható?</translation> + </message> + <message> + <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> + <translation>Ez az automatikus beírás parancs nagyon gyakran ismétlődő paramétert tartalmaz. Valóban folytatható?</translation> + </message> </context> <context> <name>AutoTypeAssociationsModel</name> @@ -125,14 +152,291 @@ Válassza ki, hogy engedélyezi-e a hozzáférést.</translation> </context> <context> <name>AutoTypeSelectDialog</name> - <message> - <source>Select entry to Auto-Type:</source> - <translation>Elem kijelölése automatikus beírásra:</translation> - </message> <message> <source>Auto-Type - KeePassXC</source> <translation>Automatikus beírás – KeePassXC</translation> </message> + <message> + <source>Select entry to Auto-Type:</source> + <translation>Bejegyzés kijelölése automatikus beírásra:</translation> + </message> +</context> +<context> + <name>BrowserAccessControlDialog</name> + <message> + <source>KeePassXC-Browser Confirm Access</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remember this decision</source> + <translation>Döntés megjegyzése</translation> + </message> + <message> + <source>Allow</source> + <translation>Engedélyezés</translation> + </message> + <message> + <source>Deny</source> + <translation>Megtagadás</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>A %1 jelszóengedélyt kér a következő elem(ek) számára. +Válassza ki, hogy engedélyezi-e a hozzáférést.</translation> + </message> +</context> +<context> + <name>BrowserOptionDialog</name> + <message> + <source>Dialog</source> + <translation>Párbeszédablak</translation> + </message> + <message> + <source>This is required for accessing your databases with KeePassXC-Browser</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable KeepassXC browser integration</source> + <translation>KeepassXC böngészőintegráció engedélyezése</translation> + </message> + <message> + <source>General</source> + <translation>Általános</translation> + </message> + <message> + <source>Enable integration for these browsers:</source> + <translation>Böngészőintegráció engedélyezése a következőkhöz:</translation> + </message> + <message> + <source>&Google Chrome</source> + <translation>&Google Chrome</translation> + </message> + <message> + <source>&Firefox</source> + <translation>&Firefox</translation> + </message> + <message> + <source>&Chromium</source> + <translation>&Chromium</translation> + </message> + <message> + <source>&Vivaldi</source> + <translation>&Vivaldi</translation> + </message> + <message> + <source>Show a &notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>É&rtesítés megjelenítése hitelesítési adatok kérésekor</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Adatbázis feloldási &kérelem, ha zárolva van</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> + <translation>Csak az azonos sémájú (http://, https://, ...) bejegyzések visszaadása.</translation> + </message> + <message> + <source>&Match URL scheme (e.g., https://...)</source> + <translation>&URL sémákra illeszkedés (pl. https://...)</translation> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>Egy konkrét URL-hez tartozó legjobb találatokat adja vissza, a teljes domainhoz tartozó összes bejegyzés helyett.</translation> + </message> + <message> + <source>&Return only best-matching credentials</source> + <translation>Csak a &legjobb hitelesítési adatok visszaadása</translation> + </message> + <message> + <source>Sort &matching credentials by title</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Illeszkedő hitelesítési adatok rendezése &cím szerint</translation> + </message> + <message> + <source>Sort matching credentials by &username</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Illeszkedő hitelesítési adatok rendezése &felhasználónév szerint</translation> + </message> + <message> + <source>&Disconnect all browsers</source> + <translation>Minden böngésző &leválasztása</translation> + </message> + <message> + <source>Forget all remembered &permissions</source> + <translation>Minden tárolt hozzáférés törlése</translation> + </message> + <message> + <source>Advanced</source> + <translation>Speciális</translation> + </message> + <message> + <source>Never &ask before accessing credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Hozzáférési adatok elérése előtt soha ne &kérdezzen</translation> + </message> + <message> + <source>Never ask before &updating credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Hozzáférési adatok &frissítése előtt soha ne kérdezzen</translation> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>Csak a kijelölt adatbázishoz kell kapcsolódnia egy klienssel.</translation> + </message> + <message> + <source>Searc&h in all opened databases for matching credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>&Keresés minden megnyitott adatbázis hitelesítési adataiban</translation> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>A karakterlánc mezők automatikus létrehozása vagy frissítése nem támogatott.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>A „KPH:”-val kezdődő fejlett karakterlánc mezők &visszaadása</translation> + </message> + <message> + <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Update &native messaging manifest files at startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Support a proxy application between KeePassXC and browser extension.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &proxy application between KeePassXC and browser extension</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a custom proxy location if you installed a proxy manually.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &custom proxy location</source> + <comment>Meant is the proxy for KeePassXC-Browser</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*.exe);;All Files (*.*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select custom proxy location</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>BrowserService</name> + <message> + <source>KeePassXC: New key association request</source> + <translation>KeePassXC: Új kulcstársítási kérés</translation> + </message> + <message> + <source>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Save and allow access</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: Felülírja a létező kulcsot?</translation> + </message> + <message> + <source>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: Bejegyzés frissítése</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Frissíti az információt ebben: %1 – %2?</translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: Adatbázis zárolva!</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>Az aktív adatbázis zárolt. +Fel kell oldani a kijelölt adatbázist, vagy egy másik nem zároltat kell választania.</translation> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: Nincs ilyen beállítás!</translation> + </message> + <message> + <source>The active database does not contain a settings entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: Nincs találat a kulcsok között</translation> + </message> + <message> + <source>No shared encryption keys found in KeePassXC Settings.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: Kulcsok eltávolítva az adatbázisból</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Removing stored permissions…</source> + <translation type="unfinished"/> + </message> + <message> + <source>Abort</source> + <translation>Megszakítás</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: Jogosultságok eltávolítva</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entry(s).</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation>KeePassXC: Nem található bejegyzés ilyen jogosultsággal!</translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>Az aktív adatbázisban nincs egyetlen jogosultsági bejegyzés sem.</translation> + </message> </context> <context> <name>ChangeMasterKeyWidget</name> @@ -148,6 +452,10 @@ Válassza ki, hogy engedélyezi-e a hozzáférést.</translation> <source>Repeat password:</source> <translation>Jelszó ismétlése:</translation> </message> + <message> + <source>&Key file</source> + <translation>&Kulcsfájl</translation> + </message> <message> <source>Browse</source> <translation>Tallózás</translation> @@ -156,6 +464,14 @@ Válassza ki, hogy engedélyezi-e a hozzáférést.</translation> <source>Create</source> <translation>Létrehozás</translation> </message> + <message> + <source>Cha&llenge Response</source> + <translation>Ki&hívás-válasz</translation> + </message> + <message> + <source>Refresh</source> + <translation>Frissítés</translation> + </message> <message> <source>Key files</source> <translation>Kulcsfájlok</translation> @@ -170,15 +486,19 @@ Válassza ki, hogy engedélyezi-e a hozzáférést.</translation> </message> <message> <source>Unable to create Key File : </source> - <translation>Nem hozható létre kulcsfájl:</translation> + <translation>Nem hozható létre kulcsfájl: </translation> </message> <message> <source>Select a key file</source> - <translation>Kulcsfájl kijelölése</translation> + <translation>Kulcsfájl kiválasztása</translation> + </message> + <message> + <source>Empty password</source> + <translation>Üres jelszó</translation> </message> <message> <source>Do you really want to use an empty string as password?</source> - <translation>Valóban üres legyen a jelszó?</translation> + <translation>Valóban üres szöveget szeretne használni jelszóként?</translation> </message> <message> <source>Different passwords supplied.</source> @@ -187,24 +507,19 @@ Válassza ki, hogy engedélyezi-e a hozzáférést.</translation> <message> <source>Failed to set %1 as the Key file: %2</source> - <translation>A(z) %1 kulcsfájl beállítása meghiúsult: + <translation>A(z) %1 kulcsfájl beállítása sikertelen: %2</translation> </message> <message> - <source>&Key file</source> - <translation>&Kulcsfájl</translation> + <source>Legacy key file format</source> + <translation type="unfinished"/> </message> <message> - <source>Cha&llenge Response</source> - <translation>Ki&hívás-válasz</translation> - </message> - <message> - <source>Refresh</source> - <translation>Frissítés</translation> - </message> - <message> - <source>Empty password</source> - <translation>Üres jelszó</translation> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -217,6 +532,10 @@ Válassza ki, hogy engedélyezi-e a hozzáférést.</translation> <source>Clone Options</source> <translation>Beállítások klónozása</translation> </message> + <message> + <source>Append ' - Clone' to title</source> + <translation>„- klón” hozzáfűzése a címhez</translation> + </message> <message> <source>Replace username and password with references</source> <translation>A felhasználónév és a jelszó cseréje hivatkozásokra</translation> @@ -225,10 +544,6 @@ Válassza ki, hogy engedélyezi-e a hozzáférést.</translation> <source>Copy history</source> <translation>Előzmények másolása</translation> </message> - <message> - <source>Append ' - Clone' to title</source> - <translation>„- klón” hozzáfűzése a címhez</translation> - </message> </context> <context> <name>CsvImportWidget</name> @@ -325,10 +640,6 @@ Válassza ki, hogy engedélyezi-e a hozzáférést.</translation> </context> <context> <name>CsvImportWizard</name> - <message> - <source>Import CSV file</source> - <translation>CSV-fájl importálása</translation> - </message> <message> <source>Error</source> <translation>Hiba</translation> @@ -340,17 +651,17 @@ Válassza ki, hogy engedélyezi-e a hozzáférést.</translation> </context> <context> <name>CsvParserModel</name> - <message> - <source> byte, </source> - <translation>bájt,</translation> + <message numerus="yes"> + <source>%n byte(s), </source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> - <message> - <source> rows, </source> - <translation>sor,</translation> + <message numerus="yes"> + <source>%n row(s), </source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> - <message> - <source> columns</source> - <translation>oszlop</translation> + <message numerus="yes"> + <source>%n column(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> </context> <context> @@ -371,6 +682,14 @@ Válassza ki, hogy engedélyezi-e a hozzáférést.</translation> <source>Browse</source> <translation>Tallózás</translation> </message> + <message> + <source>Refresh</source> + <translation>Frissítés</translation> + </message> + <message> + <source>Challenge Response:</source> + <translation>Kihívás-válasz:</translation> + </message> <message> <source>Unable to open the database.</source> <translation>Nem lehet megnyitni az adatbázist.</translation> @@ -379,6 +698,21 @@ Válassza ki, hogy engedélyezi-e a hozzáférést.</translation> <source>Can't open key file</source> <translation>Nem lehet megnyitni a kulcsfájlt</translation> </message> + <message> + <source>Legacy key file format</source> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't show this warning again</source> + <translation type="unfinished"/> + </message> <message> <source>All files</source> <translation>Minden fájl</translation> @@ -389,15 +723,7 @@ Válassza ki, hogy engedélyezi-e a hozzáférést.</translation> </message> <message> <source>Select key file</source> - <translation>Kulcsfájl kijelölése</translation> - </message> - <message> - <source>Refresh</source> - <translation>Frissítés</translation> - </message> - <message> - <source>Challenge Response:</source> - <translation>Kihívás-válasz:</translation> + <translation>Kulcsfájl kiválasztása</translation> </message> </context> <context> @@ -412,16 +738,16 @@ Válassza ki, hogy engedélyezi-e a hozzáférést.</translation> </message> <message> <source>Can't open key file</source> - <translation>Nem lehet megnyitni a kulcsfájl</translation> - </message> - <message> - <source>Database opened fine. Nothing to do.</source> - <translation>Az adatbázis megnyitása sikeres. Nincs további teendő.</translation> + <translation>Nem lehet megnyitni a kulcsfájlt</translation> </message> <message> <source>Unable to open the database.</source> <translation>Nem lehet megnyitni az adatbázist.</translation> </message> + <message> + <source>Database opened fine. Nothing to do.</source> + <translation>Az adatbázis megnyitása sikeres. Nincs további teendő.</translation> + </message> <message> <source>Success</source> <translation>Sikeres</translation> @@ -429,8 +755,8 @@ Válassza ki, hogy engedélyezi-e a hozzáférést.</translation> <message> <source>The database has been successfully repaired You can now save it.</source> - <translation>Az adatbázis sikeresen helyre lett állítva. -El lehet menteni.</translation> + <translation>Az adatbázis sikeresen meg lett javítva. +Most már el lehet menteni.</translation> </message> <message> <source>Unable to repair the database.</source> @@ -440,40 +766,57 @@ El lehet menteni.</translation> <context> <name>DatabaseSettingsWidget</name> <message> - <source>Database name:</source> - <translation>Adatbázisnév:</translation> + <source>General</source> + <translation>Általános</translation> </message> <message> - <source>Database description:</source> - <translation>Adatbázis leírása:</translation> + <source>Encryption</source> + <translation type="unfinished"/> </message> <message> - <source>Transform rounds:</source> - <translation>Átalakítási körök száma:</translation> + <source>Number of rounds too high</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> </message> <message> - <source>Default username:</source> - <translation>Alapértelmezett felhasználónév:</translation> + <source>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</source> + <translation type="unfinished"/> </message> <message> - <source> MiB</source> - <translation> MiB</translation> + <source>Understood, keep number</source> + <translation type="unfinished"/> </message> <message> - <source>Benchmark</source> - <translation>Teljesítménymérés</translation> + <source>Cancel</source> + <translation type="unfinished"/> </message> <message> - <source>Max. history items:</source> - <translation>Előzmények max. száma:</translation> + <source>Number of rounds too low</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> </message> <message> - <source>Max. history size:</source> - <translation>Előzmények max. mérete:</translation> + <source>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</source> + <translation type="unfinished"/> </message> <message> - <source>Use recycle bin</source> - <translation>Kuka használata</translation> + <source>KDF unchanged</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetEncryption</name> + <message> + <source>Encryption Algorithm:</source> + <translation type="unfinished"/> </message> <message> <source>AES: 256 Bit (default)</source> @@ -484,14 +827,78 @@ El lehet menteni.</translation> <translation>Twofish: 256 bit</translation> </message> <message> - <source>Algorithm:</source> - <translation>Algoritmus:</translation> + <source>Key Derivation Function:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Transform rounds:</source> + <translation>Átalakítási körök száma:</translation> + </message> + <message> + <source>Benchmark 1-second delay</source> + <translation type="unfinished"/> + </message> + <message> + <source>Memory Usage:</source> + <translation type="unfinished"/> + </message> + <message> + <source> MB</source> + <translation type="unfinished"/> + </message> + <message> + <source>Parallelism:</source> + <translation type="unfinished"/> + </message> + <message> + <source> thread</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetGeneral</name> + <message> + <source>Database Meta Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database name:</source> + <translation>Adatbázisnév:</translation> + </message> + <message> + <source>Database description:</source> + <translation>Adatbázis leírása:</translation> + </message> + <message> + <source>Default username:</source> + <translation>Alapértelmezett felhasználónév:</translation> + </message> + <message> + <source>History Settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Max. history items:</source> + <translation>Előzmények legnagyobb száma:</translation> + </message> + <message> + <source>Max. history size:</source> + <translation>Előzmények legnagyobb mérete:</translation> + </message> + <message> + <source> MiB</source> + <translation> MiB</translation> + </message> + <message> + <source>Use recycle bin</source> + <translation>Kuka használata</translation> </message> </context> <context> <name>DatabaseTabWidget</name> <message> <source>Root</source> + <comment>Root group</comment> <translation>Gyökér</translation> </message> <message> @@ -510,6 +917,30 @@ El lehet menteni.</translation> <source>File not found!</source> <translation>A fájl nem található!</translation> </message> + <message> + <source>Unable to open the database.</source> + <translation>Nem lehet megnyitni az adatbázist.</translation> + </message> + <message> + <source>File opened in read only mode.</source> + <translation>Fájl megnyitva csak olvashatóként</translation> + </message> + <message> + <source>Open CSV file</source> + <translation>CSV-fájl megnyitása</translation> + </message> + <message> + <source>CSV file</source> + <translation>CSV-fájl</translation> + </message> + <message> + <source>All files (*)</source> + <translation>Minden fájl (*)</translation> + </message> + <message> + <source>Merge database</source> + <translation>Adatbázis összeolvasztása</translation> + </message> <message> <source>Open KeePass 1 database</source> <translation>KeePass 1 adatbázis megnyitása</translation> @@ -518,14 +949,16 @@ El lehet menteni.</translation> <source>KeePass 1 database</source> <translation>KeePass 1 adatbázis</translation> </message> - <message> - <source>All files (*)</source> - <translation>Minden fájl (*)</translation> - </message> <message> <source>Close?</source> <translation>Bezárja?</translation> </message> + <message> + <source>"%1" is in edit mode. +Discard changes and close anyway?</source> + <translation>A(z) „%1” szerkesztési módban van. +Elveti a módosításokat és mindenképp bezárja? </translation> + </message> <message> <source>Save changes?</source> <translation>Menti a módosításokat?</translation> @@ -533,17 +966,29 @@ El lehet menteni.</translation> <message> <source>"%1" was modified. Save changes?</source> - <translation>„%1” módosítva lett. -El legyen mentve?</translation> + <translation>A(z) „%1” módosítva lett. +Menti a módosításokat?</translation> </message> <message> <source>Writing the database failed.</source> - <translation>Az adatbázis mentése sikertelen.</translation> + <translation>Az adatbázis kiírása sikertelen.</translation> + </message> + <message> + <source>Passwords</source> + <translation>Jelszavak</translation> </message> <message> <source>Save database as</source> <translation>Adatbázis mentése más néven</translation> </message> + <message> + <source>Export database to CSV file</source> + <translation>Adatbázis exportálása CSV-fájlba</translation> + </message> + <message> + <source>Writing the CSV file failed.</source> + <translation>A CSV-fájl mentése sikertelen.</translation> + </message> <message> <source>New database</source> <translation>Új adatbázis</translation> @@ -559,85 +1004,24 @@ El legyen mentve?</translation> <message> <source>Can't lock the database as you are currently editing it. Please press cancel to finish your changes or discard them.</source> - <translation>Szerkesztés közben nem lehet zárolni az adatbázist. -A „Mégse” gombbal befejezhető vagy elvethető a módosítás.</translation> - </message> - <message> - <source>This database has never been saved. -You can save the database or stop locking it.</source> - <translation>Ez az adatbázis még soha nem lett elmentve. -Elmentheti az adatbázist vagy leállíthatja a zárolást.</translation> + <translation>Nem lehet zárolni az adatbázist, mivel jelenleg azt szerkeszti. +Nyomja meg a „Mégse” gombot a módosítások befejezéshez vagy dobja el azokat.</translation> </message> <message> <source>This database has been modified. Do you want to save the database before locking it? Otherwise your changes are lost.</source> <translation>Ez az adatbázis módosítva lett. -Elmenti az adatbázist a zárolás előtt? +Szeretné elmenteni az adatbázist zárolás előtt? Különben a módosítások elvesznek.</translation> </message> - <message> - <source>"%1" is in edit mode. -Discard changes and close anyway?</source> - <translation>„%1” szerkesztési módban van. -Elveti a módosításokat és mindenképp bezárja? </translation> - </message> - <message> - <source>Export database to CSV file</source> - <translation>Adatbázis exportálása CSV-fájlba</translation> - </message> - <message> - <source>CSV file</source> - <translation>CSV-fájl</translation> - </message> - <message> - <source>Writing the CSV file failed.</source> - <translation>A CSV-fájl mentése sikertelen.</translation> - </message> - <message> - <source>Unable to open the database.</source> - <translation>Nem lehet megnyitni az adatbázist.</translation> - </message> - <message> - <source>Merge database</source> - <translation>Adatbázis összeolvasztása</translation> - </message> - <message> - <source>The database you are trying to save as is locked by another instance of KeePassXC. -Do you want to save it anyway?</source> - <translation>A mentés alatt álló adatbázist egy másik KeePassXC példány zárolta. -Mindenképp elmenti?</translation> - </message> - <message> - <source>Passwords</source> - <translation>Jelszavak</translation> - </message> - <message> - <source>Database already opened</source> - <translation>Az adatbázis már meg lett nyitva</translation> - </message> - <message> - <source>The database you are trying to open is locked by another instance of KeePassXC. - -Do you want to open it anyway?</source> - <translation>A megnyitás alatt álló adatbázist egy másik KeePassXC példány zárolta. -Mindenképp megnyitja?</translation> - </message> - <message> - <source>Open read-only</source> - <translation>Megnyitás csak olvashatóként</translation> - </message> - <message> - <source>File opened in read only mode.</source> - <translation>Fájl megnyitva csak olvashatóként</translation> - </message> - <message> - <source>Open CSV file</source> - <translation>CSV-fájl megnyitása</translation> - </message> </context> <context> <name>DatabaseWidget</name> + <message> + <source>Searching...</source> + <translation>Keresés…</translation> + </message> <message> <source>Change master key</source> <translation>Mesterkulcs módosítása</translation> @@ -648,7 +1032,7 @@ Mindenképp megnyitja?</translation> </message> <message> <source>Do you really want to delete the entry "%1" for good?</source> - <translation>Valóban végleg törli a bejegyzést: „%1”?</translation> + <translation>Valóban végleg szeretné törölni a bejegyzést: „%1”?</translation> </message> <message> <source>Delete entries?</source> @@ -656,27 +1040,7 @@ Mindenképp megnyitja?</translation> </message> <message> <source>Do you really want to delete %1 entries for good?</source> - <translation>Valóban végleg törli a(z) %1 bejegyzést?</translation> - </message> - <message> - <source>Move entries to recycle bin?</source> - <translation>Kukába dobja a bejegyzéseket?</translation> - </message> - <message numerus="yes"> - <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>Valóban a kukába dobja az %n elemet?</numerusform><numerusform>Valóban a kukába dobja a(z) %n elemet?</numerusform></translation> - </message> - <message> - <source>Delete group?</source> - <translation>Törli a csoportot?</translation> - </message> - <message> - <source>Do you really want to delete the group "%1" for good?</source> - <translation>Valóban végleg törli a csoportot: „%1”?</translation> - </message> - <message> - <source>Unable to calculate master key</source> - <translation>Nem lehet kiszámítani a mesterkulcsot</translation> + <translation>Valóban végleg szeretne törölni %1 bejegyzést?</translation> </message> <message> <source>Move entry to recycle bin?</source> @@ -684,11 +1048,39 @@ Mindenképp megnyitja?</translation> </message> <message> <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation>Valóban kukába dobja az elemet: „%1”?</translation> + <translation>Valóban kukába szeretné dobni a bejegyzést: „%1”?</translation> </message> <message> - <source>Searching...</source> - <translation>Keresés…</translation> + <source>Move entries to recycle bin?</source> + <translation>Kukába dobja a bejegyzéseket?</translation> + </message> + <message numerus="yes"> + <source>Do you really want to move %n entry(s) to the recycle bin?</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Execute command?</source> + <translation>Végrehajtja a parancsot?</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation>Valóban végrehajtja a következő parancsot? <br><br>%1<br></translation> + </message> + <message> + <source>Remember my choice</source> + <translation>Válasz megjegyzése</translation> + </message> + <message> + <source>Delete group?</source> + <translation>Törli a csoportot?</translation> + </message> + <message> + <source>Do you really want to delete the group "%1" for good?</source> + <translation>Valóban végleg szeretné törölni a csoportot: „%1”?</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Nem lehet kiszámítani a mesterkulcsot</translation> </message> <message> <source>No current database.</source> @@ -707,20 +1099,8 @@ Mindenképp megnyitja?</translation> <translation>Nincs találat</translation> </message> <message> - <source>Execute command?</source> - <translation>Végrehajtja a parancsot?</translation> - </message> - <message> - <source>Do you really want to execute the following command?<br><br>%1<br></source> - <translation>Valóban végrehajtja a következő parancsot? <br><br>%1<br></translation> - </message> - <message> - <source>Remember my choice</source> - <translation>Válasz megjegyzése</translation> - </message> - <message> - <source>Autoreload Request</source> - <translation>Automatikus beolvasási kérelem</translation> + <source>File has changed</source> + <translation type="unfinished"/> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -731,8 +1111,9 @@ Mindenképp megnyitja?</translation> <translation>Összeolvasztási kérelem</translation> </message> <message> - <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> - <translation>Az adatbázisfájl módosult és vannak nem mentett változások. Összeolvasztja a módosításokat?</translation> + <source>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</source> + <translation type="unfinished"/> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -747,6 +1128,89 @@ Mindenképp megnyitja?</translation> <translation>Valóban véglegesen töröl mindent a kukából?</translation> </message> </context> +<context> + <name>DetailsWidget</name> + <message> + <source>Generate TOTP Token</source> + <translation type="unfinished"/> + </message> + <message> + <source>Close</source> + <translation>Bezárás</translation> + </message> + <message> + <source>General</source> + <translation>Általános</translation> + </message> + <message> + <source>Password</source> + <translation>Jelszó</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Expiration</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username</source> + <translation>Felhasználónév</translation> + </message> + <message> + <source>Autotype</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searching</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attributes</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation>Mellékletek</translation> + </message> + <message> + <source>Notes</source> + <translation>Jegyzetek</translation> + </message> + <message> + <source>Window</source> + <translation>Ablak</translation> + </message> + <message> + <source>Sequence</source> + <translation>Sorrend</translation> + </message> + <message> + <source>Search</source> + <translation>Keresés</translation> + </message> + <message> + <source>Clear</source> + <translation>Törlés</translation> + </message> + <message> + <source>Never</source> + <translation type="unfinished"/> + </message> + <message> + <source>[PROTECTED]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Disabled</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enabled</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EditEntryWidget</name> <message> @@ -773,6 +1237,30 @@ Mindenképp megnyitja?</translation> <source>History</source> <translation>Előzmények</translation> </message> + <message> + <source>SSH Agent</source> + <translation>SSH ügynök</translation> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>(encrypted)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>File too large to be a private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open private key</source> + <translation type="unfinished"/> + </message> <message> <source>Entry history</source> <translation>Előzmény-bejegyzés</translation> @@ -793,40 +1281,6 @@ Mindenképp megnyitja?</translation> <source>New attribute</source> <translation>Új attribútum</translation> </message> - <message> - <source>Select file</source> - <translation>Válasszon fájlt</translation> - </message> - <message> - <source>Unable to open file</source> - <translation>A fájl nem nyitható meg</translation> - </message> - <message> - <source>Save attachment</source> - <translation>Melléklet mentése</translation> - </message> - <message> - <source>Unable to save the attachment: -</source> - <translation>Nem lehet menteni a mellékletet: -</translation> - </message> - <message> - <source>Tomorrow</source> - <translation>Holnap</translation> - </message> - <message numerus="yes"> - <source>%n week(s)</source> - <translation><numerusform>%n hét</numerusform><numerusform>%n hét</numerusform></translation> - </message> - <message numerus="yes"> - <source>%n month(s)</source> - <translation><numerusform>%n hónap</numerusform><numerusform>%n hónap</numerusform></translation> - </message> - <message> - <source>1 year</source> - <translation>1 év</translation> - </message> <message> <source>Confirm Remove</source> <translation>Törlés megerősítése</translation> @@ -836,12 +1290,28 @@ Mindenképp megnyitja?</translation> <translation>Valóban eltávolítja ezt az attribútumot?</translation> </message> <message> - <source>[PROTECTED] Press reveal to view or edit</source> - <translation>[VÉDETT] A megjelenítés vagy a szerkesztés a „Felfedés” gombbal érhető el</translation> + <source>[PROTECTED]</source> + <translation type="unfinished"/> </message> <message> - <source>Are you sure you want to remove this attachment?</source> - <translation>Valóban eltávolítja a mellékletet?</translation> + <source>Press reveal to view or edit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Tomorrow</source> + <translation>Holnap</translation> + </message> + <message numerus="yes"> + <source>%n week(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source>%n month(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>1 year</source> + <translation>1 év</translation> </message> </context> <context> @@ -856,19 +1326,7 @@ Mindenképp megnyitja?</translation> </message> <message> <source>Remove</source> - <translation>Törlés</translation> - </message> - <message> - <source>Attachments</source> - <translation>Mellékletek</translation> - </message> - <message> - <source>Save</source> - <translation>Mentés</translation> - </message> - <message> - <source>Open</source> - <translation>Megnyitás</translation> + <translation>Eltávolítás</translation> </message> <message> <source>Edit Name</source> @@ -882,12 +1340,28 @@ Mindenképp megnyitja?</translation> <source>Reveal</source> <translation>Felfedés</translation> </message> + <message> + <source>Attachments</source> + <translation>Mellékletek</translation> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> <message> <source>Enable Auto-Type for this entry</source> - <translation>Automatikus beírás engedélyezése a bejegyzés számára</translation> + <translation>Automatikus beírás engedélyezése ennél a bejegyzésnél</translation> + </message> + <message> + <source>Inherit default Auto-Type sequence from the &group</source> + <translation>Az alapértelmezett automatikus beírási sorrend öröklése a cso&porttól</translation> + </message> + <message> + <source>&Use custom Auto-Type sequence:</source> + <translation>Egyéni automatikus beírási sorrend használata:</translation> + </message> + <message> + <source>Window Associations</source> + <translation>Ablaktársítások</translation> </message> <message> <source>+</source> @@ -901,14 +1375,6 @@ Mindenképp megnyitja?</translation> <source>Window title:</source> <translation>Ablakcím:</translation> </message> - <message> - <source>Inherit default Auto-Type sequence from the &group</source> - <translation>Az alapértelmezett automatikus beírási sorrend öröklése a cso&porttól</translation> - </message> - <message> - <source>&Use custom Auto-Type sequence:</source> - <translation>Egyéni automatikus beírási sorrend használata:</translation> - </message> <message> <source>Use default se&quence</source> <translation>&Alapértelmezett sorrend használata</translation> @@ -917,10 +1383,6 @@ Mindenképp megnyitja?</translation> <source>Set custo&m sequence:</source> <translation>&Egyéni sorrend használata:</translation> </message> - <message> - <source>Window Associations</source> - <translation>Ablaktársítások</translation> - </message> </context> <context> <name>EditEntryWidgetHistory</name> @@ -938,18 +1400,14 @@ Mindenképp megnyitja?</translation> </message> <message> <source>Delete all</source> - <translation>Minden törlése </translation> + <translation>Összes törlése</translation> </message> </context> <context> <name>EditEntryWidgetMain</name> <message> - <source>Title:</source> - <translation>Cím:</translation> - </message> - <message> - <source>Username:</source> - <translation>Felhasználónév:</translation> + <source>URL:</source> + <translation>URL:</translation> </message> <message> <source>Password:</source> @@ -960,20 +1418,104 @@ Mindenképp megnyitja?</translation> <translation>Ismétlés:</translation> </message> <message> - <source>URL:</source> - <translation>URL:</translation> + <source>Title:</source> + <translation>Cím:</translation> </message> <message> - <source>Expires</source> - <translation>Lejárat</translation> + <source>Notes</source> + <translation>Jegyzetek</translation> </message> <message> <source>Presets</source> <translation>Előbeállítások</translation> </message> <message> - <source>Notes:</source> - <translation>Jegyzetek:</translation> + <source>Toggle the checkbox to reveal the notes section.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username:</source> + <translation>Felhasználónév:</translation> + </message> + <message> + <source>Expires</source> + <translation>Lejárat</translation> + </message> +</context> +<context> + <name>EditEntryWidgetSSHAgent</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent after</source> + <translation type="unfinished"/> + </message> + <message> + <source> seconds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fingerprint</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent when database is closed/locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add key to agent when database is opened/unlocked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Comment</source> + <translation type="unfinished"/> + </message> + <message> + <source>Decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy to clipboard</source> + <translation>Vágólapra másolás</translation> + </message> + <message> + <source>Private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>External file</source> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Attachment</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add to agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove from agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Require user confirmation when this key is used</source> + <translation type="unfinished"/> </message> </context> <context> @@ -1044,6 +1586,14 @@ Mindenképp megnyitja?</translation> </context> <context> <name>EditWidgetIcons</name> + <message> + <source>&Use default icon</source> + <translation>Alapértelmezett &ikon használata</translation> + </message> + <message> + <source>Use custo&m icon</source> + <translation>&Egyéni ikon használata</translation> + </message> <message> <source>Add custom icon</source> <translation>Egyéni ikon hozzáadása</translation> @@ -1052,6 +1602,18 @@ Mindenképp megnyitja?</translation> <source>Delete custom icon</source> <translation>Egyéni ikon törlése</translation> </message> + <message> + <source>Download favicon</source> + <translation>Favicon letöltése</translation> + </message> + <message> + <source>Unable to fetch favicon.</source> + <translation>A favicon letöltése sikertelen.</translation> + </message> + <message> + <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> + <translation>Tipp: A Google-t tartalékként az Eszközök>Beállítások>Biztonság menüpontban engedélyezheti</translation> + </message> <message> <source>Images</source> <translation>Képek</translation> @@ -1062,27 +1624,15 @@ Mindenképp megnyitja?</translation> </message> <message> <source>Select Image</source> - <translation>Kép kijelölése</translation> - </message> - <message> - <source>Download favicon</source> - <translation>Favicon letöltése</translation> - </message> - <message> - <source>Unable to fetch favicon.</source> - <translation>A favicon letöltése sikertelen.</translation> + <translation>Kép kiválasztása</translation> </message> <message> <source>Can't read icon</source> <translation>Az ikon nem olvasható</translation> </message> <message> - <source>&Use default icon</source> - <translation>Alapértelmezett &ikon használata</translation> - </message> - <message> - <source>Use custo&m icon</source> - <translation>&Egyéni ikon használata</translation> + <source>Custom icon already exists</source> + <translation>Az egyéni ikon már létezik</translation> </message> <message> <source>Confirm Delete</source> @@ -1092,14 +1642,6 @@ Mindenképp megnyitja?</translation> <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> <translation>Ezt az ikont %1 elem használja, és le lesz cserélve az alapértelmezett ikonra. Valóban törli?</translation> </message> - <message> - <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation>Tipp: A Google-t tartalékként az Eszközök>Beállítások>Biztonság menüpontban engedélyezheti</translation> - </message> - <message> - <source>Custom icon already exists</source> - <translation>Az egyéni ikon már létezik</translation> - </message> </context> <context> <name>EditWidgetProperties</name> @@ -1124,9 +1666,93 @@ Mindenképp megnyitja?</translation> <name>Entry</name> <message> <source> - Clone</source> + <comment>Suffix added to cloned entries</comment> <translation> - klón</translation> </message> </context> +<context> + <name>EntryAttachmentsModel</name> + <message> + <source>Name</source> + <translation>Név</translation> + </message> + <message> + <source>Size</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EntryAttachmentsWidget</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add</source> + <translation>Hozzáadás</translation> + </message> + <message> + <source>Remove</source> + <translation>Eltávolítás</translation> + </message> + <message> + <source>Open</source> + <translation>Megnyitás</translation> + </message> + <message> + <source>Save</source> + <translation>Mentés</translation> + </message> + <message> + <source>Select files</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <source>Are you sure you want to remove %n attachment(s)?</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>Törlés megerősítése</translation> + </message> + <message> + <source>Save attachments</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to create directory: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Confirm overwrite</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to save attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachment: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open files: +%1</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EntryAttributesModel</name> <message> @@ -1155,6 +1781,11 @@ Mindenképp megnyitja?</translation> </context> <context> <name>EntryModel</name> + <message> + <source>Ref: </source> + <comment>Reference abbreviation</comment> + <translation>Hivatkozás:</translation> + </message> <message> <source>Group</source> <translation>Csoport</translation> @@ -1171,11 +1802,6 @@ Mindenképp megnyitja?</translation> <source>URL</source> <translation>URL</translation> </message> - <message> - <source>Ref: </source> - <comment>Reference abbreviation</comment> - <translation>Hivatkozás:</translation> - </message> </context> <context> <name>Group</name> @@ -1184,6 +1810,17 @@ Mindenképp megnyitja?</translation> <translation>Kuka</translation> </message> </context> +<context> + <name>HostInstaller</name> + <message> + <source>KeePassXC: Cannot save file!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot save the native messaging script file.</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>HttpPasswordGeneratorWidget</name> <message> @@ -1246,11 +1883,366 @@ Mindenképp megnyitja?</translation> <translation>Bezárási üzenet</translation> </message> </context> +<context> + <name>Kdbx3Reader</name> + <message> + <source>Unable to calculate master key</source> + <translation>Nem lehet kiszámítani a mesterkulcsot</translation> + </message> + <message> + <source>Unable to issue challenge-response.</source> + <translation>Nem lehet kiutalni a kihívás-választ.</translation> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>Rossz kulcs vagy sérült adatbázisfájl.</translation> + </message> +</context> +<context> + <name>Kdbx3Writer</name> + <message> + <source>Unable to issue challenge-response.</source> + <translation>Nem lehet kiutalni a kihívás-választ.</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Nem lehet kiszámítani a mesterkulcsot</translation> + </message> +</context> +<context> + <name>Kdbx4Reader</name> + <message> + <source>missing database headers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Nem lehet kiszámítani a mesterkulcsot</translation> + </message> + <message> + <source>Invalid header checksum size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Header SHA256 mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header data length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open buffer for KDF parameters in header</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported key derivation function (KDF) or invalid parameters</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy header fields found in KDBX4 file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header binary size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass variant map version.</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name data</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value data</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Bool entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry type</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map field type size</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Kdbx4Writer</name> + <message> + <source>Invalid symmetric cipher algorithm.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid symmetric cipher IV size.</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Nem lehet kiszámítani a mesterkulcsot</translation> + </message> + <message> + <source>Failed to serialize KDF parameters variant map</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxReader</name> + <message> + <source>Invalid cipher uuid length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid compression flags length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported compression algorithm</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid master seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform rounds size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid start bytes size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid random stream id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner random stream cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>Nem KeePass adatbázis.</translation> + </message> + <message> + <source>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> + <translation>A kijelölt fájl egy régi KeePass 1 adatbázis (.kdb). + +Be lehet importálni az Adatbázis > „KeePass 1 adatbázis importálása…” menüpontban. +Ez egyirányú migráció. Nem lehet majd megnyitni az importált adatbázist a régi KeePassX 0.4 verzióval.</translation> + </message> + <message> + <source>Unsupported KeePass 2 database version.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxXmlReader</name> + <message> + <source>XML parsing failure: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>No root group</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing icon uuid or data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing custom data key or value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Multiple group elements</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null group uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableAutoType value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableSearching value</source> + <translation type="unfinished"/> + </message> + <message> + <source>No group uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null DeleteObject uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing DeletedObject uuid or time</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null entry uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element in history entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>No entry uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element with different uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decrypt entry string</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate custom attribute found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry string key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate attachment found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry binary key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-type association window or sequence missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid bool value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid date time value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color rgb part</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid uuid value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decompress binary</source> + <extracomment>Translator meant is a binary data inside an entry</extracomment> + <translation type="unfinished"/> + </message> +</context> <context> <name>KeePass1OpenWidget</name> <message> <source>Import KeePass1 database</source> - <translation>Keepass1 adatbázis importálása</translation> + <translation>KeePass1 adatbázis importálása</translation> </message> <message> <source>Unable to open the database.</source> @@ -1275,6 +2267,35 @@ Mindenképp megnyitja?</translation> <source>Unsupported KeePass database version.</source> <translation>Nem támogatott KeePass adatbázis-verzió.</translation> </message> + <message> + <source>Unable to read encryption IV</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of groups</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid content hash size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of transform rounds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to construct group tree</source> + <translation type="unfinished"/> + </message> <message> <source>Root</source> <translation>Gyökér</translation> @@ -1287,60 +2308,104 @@ Mindenképp megnyitja?</translation> <source>Wrong key or database file is corrupt.</source> <translation>Rossz kulcs vagy sérült adatbázisfájl.</translation> </message> -</context> -<context> - <name>KeePass2Reader</name> <message> - <source>Not a KeePass database.</source> - <translation>Nem KeePass adatbázis.</translation> + <source>Key transformation failed</source> + <translation type="unfinished"/> </message> <message> - <source>Unsupported KeePass database version.</source> - <translation>Nem támogatott KeePass adatbázis-verzió.</translation> + <source>Invalid group field type number</source> + <translation type="unfinished"/> </message> <message> - <source>Wrong key or database file is corrupt.</source> - <translation>Rossz kulcs vagy sérült adatbázisfájl.</translation> + <source>Invalid group field size</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>Nem lehet kiszámítani a mesterkulcsot</translation> + <source>Read group field data doesn't match size</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to issue challenge-response.</source> - <translation>Nem lehet kiutalni a kihívás-választ.</translation> + <source>Incorrect group id field size</source> + <translation type="unfinished"/> </message> <message> - <source>The selected file is an old KeePass 1 database (.kdb). - -You can import it by clicking on Database > 'Import KeePass 1 database...'. -This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> - <translation>A kijelölt fájl egy régi KeePass 1 adatbázis (.kdb). - -Be lehet importálni az Adatbázis > „KeePass 1 adatbázis importálása…” menüpontban. -Ez egyirányú migráció. Nem lehet majd megnyitni az importált adatbázist a régi KeePassX 0.4 verzióval.</translation> - </message> -</context> -<context> - <name>KeePass2Writer</name> - <message> - <source>Unable to issue challenge-response.</source> - <translation>Nem lehet kiutalni a kihívás-választ.</translation> + <source>Incorrect group creation time field size</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>Nem lehet kiszámítani a mesterkulcsot</translation> + <source>Incorrect group modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group access time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group level field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing group id or level</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing entry field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read entry field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry uuid field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field type</source> + <translation type="unfinished"/> </message> </context> <context> <name>Main</name> <message> - <source>Fatal error while testing the cryptographic functions.</source> - <translation>Végzetes hiba a titkosítási funkciók tesztelése közben.</translation> - </message> - <message> - <source>KeePassXC - Error</source> - <translation>KeePassXC – Hiba</translation> + <source>Existing single-instance lock file is invalid. Launching new instance.</source> + <translation>A meglévő egypéldányos zárolási fájl érvénytelen. Új példány indítása.</translation> </message> <message> <source>The lock file could not be created. Single-instance mode disabled.</source> @@ -1351,64 +2416,32 @@ Ez egyirányú migráció. Nem lehet majd megnyitni az importált adatbázist a <translation>A KeePassXC egy másik példánya is fut.</translation> </message> <message> - <source>Existing single-instance lock file is invalid. Launching new instance.</source> - <translation>A meglévő egypéldányos zárolási fájl érvénytelen. Új példány indítása.</translation> + <source>Fatal error while testing the cryptographic functions.</source> + <translation>Végzetes hiba a kriptográfiai funkciók tesztelése közben.</translation> + </message> + <message> + <source>KeePassXC - Error</source> + <translation>KeePassXC – Hiba</translation> </message> </context> <context> <name>MainWindow</name> <message> - <source>Open database</source> - <translation>Adatbázis megnyitása</translation> - </message> - <message> - <source>Database settings</source> - <translation>Adatbázis-beállítások</translation> - </message> - <message> - <source>Copy username to clipboard</source> - <translation>Felhasználónév másolása vágólapra</translation> - </message> - <message> - <source>Copy password to clipboard</source> - <translation>Jelszó másolása a vágólapra</translation> - </message> - <message> - <source>Settings</source> - <translation>Beállítások</translation> - </message> - <message> - <source>Show toolbar</source> - <translation>Eszköztár megjelenítése</translation> - </message> - <message> - <source>read-only</source> - <translation>Csak olvasható</translation> - </message> - <message> - <source>Toggle window</source> - <translation>Ablak átváltása</translation> - </message> - <message> - <source>KeePass 2 Database</source> - <translation>KeePass 2 adatbázis</translation> - </message> - <message> - <source>All files</source> - <translation>Minden fájl</translation> - </message> - <message> - <source>Save repaired database</source> - <translation>Javított adatbázis mentése</translation> - </message> - <message> - <source>Writing the database failed.</source> - <translation>Az adatbázis írása sikertelen.</translation> + <source>&Database</source> + <translation>&Adatbázis</translation> </message> <message> <source>&Recent databases</source> <translation>&Friss adatbázisok</translation> </message> + <message> + <source>Import</source> + <translation>Importálás</translation> + </message> + <message> + <source>&Help</source> + <translation>&Súgó</translation> + </message> <message> <source>E&ntries</source> <translation>Be&jegyzések</translation> @@ -1417,13 +2450,17 @@ Ez egyirányú migráció. Nem lehet majd megnyitni az importált adatbázist a <source>Copy att&ribute to clipboard</source> <translation>&Attribútum másolása a vágólapra</translation> </message> + <message> + <source>Time-based one-time password</source> + <translation type="unfinished"/> + </message> <message> <source>&Groups</source> <translation>Cso&portok</translation> </message> <message> - <source>&View</source> - <translation>&Nézet</translation> + <source>&Tools</source> + <translation>&Eszközök</translation> </message> <message> <source>&Quit</source> @@ -1433,6 +2470,10 @@ Ez egyirányú migráció. Nem lehet majd megnyitni az importált adatbázist a <source>&About</source> <translation>&Névjegy</translation> </message> + <message> + <source>&Open database...</source> + <translation>&Adatbázis megnyitása…</translation> + </message> <message> <source>&Save database</source> <translation>Adatbázis &mentése</translation> @@ -1473,26 +2514,26 @@ Ez egyirányú migráció. Nem lehet majd megnyitni az importált adatbázist a <source>&Delete group</source> <translation>Csoport &törlése</translation> </message> + <message> + <source>Sa&ve database as...</source> + <translation>Adatbázis mentése más &néven…</translation> + </message> + <message> + <source>Change &master key...</source> + <translation>&Mesterkulcs módosítása…</translation> + </message> <message> <source>&Database settings</source> <translation>Adatbázis-&beállítások</translation> </message> + <message> + <source>Database settings</source> + <translation>Adatbázis-beállítások</translation> + </message> <message> <source>&Clone entry</source> <translation>Bejegyzés &klónozása</translation> </message> - <message> - <source>Timed one-time password</source> - <translation>Időalapú, egyszer használatos jelszó</translation> - </message> - <message> - <source>Copy &TOTP</source> - <translation>&TOTP másolása</translation> - </message> - <message> - <source>Show TOTP</source> - <translation>TOTP megjelenítése</translation> - </message> <message> <source>&Find</source> <translation>&Keresés</translation> @@ -1501,14 +2542,26 @@ Ez egyirányú migráció. Nem lehet majd megnyitni az importált adatbázist a <source>Copy &username</source> <translation>&Felhasználónév másolása</translation> </message> + <message> + <source>Copy username to clipboard</source> + <translation>Felhasználónév másolása a vágólapra</translation> + </message> <message> <source>Cop&y password</source> <translation>&Jelszó másolása</translation> </message> + <message> + <source>Copy password to clipboard</source> + <translation>Jelszó másolása a vágólapra</translation> + </message> <message> <source>&Settings</source> <translation>&Beállítások</translation> </message> + <message> + <source>Password Generator</source> + <translation>Jelszógenerátor</translation> + </message> <message> <source>&Perform Auto-Type</source> <translation>&Automatikus beírás</translation> @@ -1525,65 +2578,25 @@ Ez egyirányú migráció. Nem lehet majd megnyitni az importált adatbázist a <source>&Title</source> <translation>&Cím</translation> </message> + <message> + <source>Copy title to clipboard</source> + <translation type="unfinished"/> + </message> <message> <source>&URL</source> <translation>&URL</translation> </message> + <message> + <source>Copy URL to clipboard</source> + <translation type="unfinished"/> + </message> <message> <source>&Notes</source> <translation>&Jegyzetek</translation> </message> <message> - <source>Password Generator</source> - <translation>Jelszógenerátor</translation> - </message> - <message> - <source>Clear history</source> - <translation>Előzmények törlése</translation> - </message> - <message> - <source>&Database</source> - <translation>&Adatbázis</translation> - </message> - <message> - <source>Import</source> - <translation>Importálás</translation> - </message> - <message> - <source>&Tools</source> - <translation>&Eszközök</translation> - </message> - <message> - <source>Empty recycle bin</source> - <translation>Kuka ürítése</translation> - </message> - <message> - <source>Access error for config file %1</source> - <translation>Hozzáférési hiba a beállítási fájlhoz: %1</translation> - </message> - <message> - <source>Quit KeePassXC</source> - <translation>Kilépés a KeePassXC-ből</translation> - </message> - <message> - <source>Please touch the button on your YubiKey!</source> - <translation>Meg kell érinteni a gombot a YubiKeyen!</translation> - </message> - <message> - <source>&Help</source> - <translation>&Súgó</translation> - </message> - <message> - <source>&Open database...</source> - <translation>&Adatbázis megnyitása…</translation> - </message> - <message> - <source>Sa&ve database as...</source> - <translation>Adatbázis mentése más &néven…</translation> - </message> - <message> - <source>Change &master key...</source> - <translation>&Mesterkulcs módosítása…</translation> + <source>Copy notes to clipboard</source> + <translation type="unfinished"/> </message> <message> <source>&Export to CSV file...</source> @@ -1601,10 +2614,169 @@ Ez egyirányú migráció. Nem lehet majd megnyitni az importált adatbázist a <source>Re&pair database...</source> <translation>Adatbázis &javítása…</translation> </message> + <message> + <source>Show TOTP</source> + <translation>TOTP megjelenítése</translation> + </message> <message> <source>Set up TOTP...</source> <translation>TOTP beállítása…</translation> </message> + <message> + <source>Copy &TOTP</source> + <translation>&TOTP másolása</translation> + </message> + <message> + <source>E&mpty recycle bin</source> + <translation type="unfinished"/> + </message> + <message> + <source>Clear history</source> + <translation>Előzmények törlése</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation>Hozzáférési hiba a beállítási fájlhoz: %1</translation> + </message> + <message> + <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> + <translation type="unfinished"/> + </message> + <message> + <source>read-only</source> + <translation>csak olvasható</translation> + </message> + <message> + <source>Settings</source> + <translation>Beállítások</translation> + </message> + <message> + <source>Toggle window</source> + <translation>Ablak átváltása</translation> + </message> + <message> + <source>Quit KeePassXC</source> + <translation>Kilépés a KeePassXC-ből</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>KeePass 2 adatbázis</translation> + </message> + <message> + <source>All files</source> + <translation>Minden fájl</translation> + </message> + <message> + <source>Open database</source> + <translation>Adatbázis megnyitása</translation> + </message> + <message> + <source>Save repaired database</source> + <translation>Javított adatbázis mentése</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>Az adatbázis kiírása sikertelen.</translation> + </message> + <message> + <source>Please touch the button on your YubiKey!</source> + <translation>Meg kell érinteni a gombot a YubiKeyen!</translation> + </message> +</context> +<context> + <name>OpenSSHKey</name> + <message> + <source>Invalid key file, expecting an OpenSSH key</source> + <translation type="unfinished"/> + </message> + <message> + <source>PEM boundary mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>This is not an OpenSSH key, only modern keys are supported</source> + <translation type="unfinished"/> + </message> + <message> + <source>Base64 decoding failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file way too small.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file magic header id invalid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Found zero keys</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to read public key.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Corrupted key file, reading private key failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>No private key payload to decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Trying to run KDF without cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Passphrase is required to decrypt this key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key derivation failed, key file corrupted?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Decryption failed, wrong passphrase?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write public key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write private key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing private key</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OptionDialog</name> @@ -1612,22 +2784,63 @@ Ez egyirányú migráció. Nem lehet majd megnyitni az importált adatbázist a <source>Dialog</source> <translation>Párbeszédablak</translation> </message> + <message> + <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation>Ez szükséges az adatbázis ChromeIPassból vagy PassIFoxból történő eléréséhez</translation> + </message> + <message> + <source>Enable KeePassHTTP server</source> + <translation>KeePassHTTP kiszolgáló engedélyezése</translation> + </message> <message> <source>General</source> <translation>Általános</translation> </message> <message> <source>Sh&ow a notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> <translation>É&rtesítés megjelenítése hitelesítési adatok kérésekor</translation> </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>Egy konkrét URL-hez tartozó legjobb találatokat adja vissza, a teljes domainhoz tartozó összes bejegyzés helyett.</translation> + </message> + <message> + <source>&Return only best matching entries</source> + <translation>Csak a &legjobb találatok visszaadása</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Adatbázis feloldási &kérelem, ha zárolva van</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> + <translation>Csak az azonos sémájú (http://, https://, ftp://, …) bejegyzések visszaadása.</translation> + </message> + <message> + <source>&Match URL schemes</source> + <translation>&URL sémákra illeszkedés</translation> + </message> <message> <source>Sort matching entries by &username</source> <translation>Találatok rendezése &felhasználónév szerint</translation> </message> + <message> + <source>Sort &matching entries by title</source> + <translation>Találatok rendezése &cím szerint</translation> + </message> + <message> + <source>R&emove all shared encryption keys from active database</source> + <translation>Az összes megosztott titkosítási kulcs &eltávolítása az aktív adatbázisból</translation> + </message> <message> <source>Re&move all stored permissions from entries in active database</source> <translation>Az összes tárolt bejegyzés jogosultságának &törlése az aktív adatbázisból</translation> </message> + <message> + <source>Password Generator</source> + <translation>Jelszógenerátor</translation> + </message> <message> <source>Advanced</source> <translation>Speciális</translation> @@ -1640,10 +2853,22 @@ Ez egyirányú migráció. Nem lehet majd megnyitni az importált adatbázist a <source>Always allow &updating entries</source> <translation>Bejegyzések &frissítésének mindenkori engedélyezése</translation> </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>Csak a kijelölt adatbázishoz kell kapcsolódnia egy klienssel.</translation> + </message> <message> <source>Searc&h in all opened databases for matching entries</source> <translation>&Keresés minden megnyitott adatbázis bejegyzéseiben</translation> </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>A karakterlánc mezők automatikus létrehozása vagy frissítése nem támogatott.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>A „KPH:”-val kezdődő fejlett karakterlánc mezők &visszaadása</translation> + </message> <message> <source>HTTP Port:</source> <translation>HTTP port:</translation> @@ -1652,18 +2877,18 @@ Ez egyirányú migráció. Nem lehet majd megnyitni az importált adatbázist a <source>Default port: 19455</source> <translation>Alapértelmezett port: 19455</translation> </message> - <message> - <source>Re&quest to unlock the database if it is locked</source> - <translation>Adatbázis feloldási &kérelem, ha zárolva van</translation> - </message> - <message> - <source>Sort &matching entries by title</source> - <translation>Találatok rendezése &cím szerint</translation> - </message> <message> <source>KeePassXC will listen to this port on 127.0.0.1</source> <translation>A KeePassXC ezen a porton fog figyelni: 127.0.0.1</translation> </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> + <translation type="unfinished"/> + </message> <message> <source>Cannot bind to privileged ports</source> <translation>Nem lehet privilegizált portokhoz kötődni</translation> @@ -1674,63 +2899,30 @@ Using default port 19455.</source> <translation>Nem lehet az 1024 alatti, privilegizált portokhoz kötődni! Az alapértelmezett 19455 port lesz használva.</translation> </message> - <message> - <source>R&emove all shared encryption keys from active database</source> - <translation>Az összes megosztott titkosítási kulcs &eltávolítása az aktív adatbázisból</translation> - </message> - <message> - <source>&Return advanced string fields which start with "KPH: "</source> - <translation>A „KPH:”-val kezdődő fejlett karakterlánc mezők &visszaadása</translation> - </message> - <message> - <source>Automatically creating or updating string fields is not supported.</source> - <translation>A karakterlánc mezők automatikus létrehozása vagy frissítése nem támogatott.</translation> - </message> - <message> - <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> - <translation>Ez szükséges az adatbázis ChromeIPassból vagy PassIFoxból történő eléréséhez</translation> - </message> - <message> - <source>Enable KeePassHTTP server</source> - <translation>KeePassHTTP kiszolgáló engedélyezése</translation> - </message> - <message> - <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation>Egy konkrét URL-hez tartozó legjobb találatokat adja vissza, a teljes domainhoz tartozó összes bejegyzés helyett.</translation> - </message> - <message> - <source>&Return only best matching entries</source> - <translation>Csak a &legjobb találatok visszaadása</translation> - </message> - <message> - <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation>Csak az azonos sémájú (http://, https://, ftp://, …) bejegyzések visszaadása.</translation> - </message> - <message> - <source>&Match URL schemes</source> - <translation>&URL sémákra illeszkedés</translation> - </message> - <message> - <source>Password Generator</source> - <translation>Jelszógenerátor</translation> - </message> - <message> - <source>Only the selected database has to be connected with a client.</source> - <translation>Csak a kijelölt adatbázishoz kell kapcsolódnia egy klienssel.</translation> - </message> - <message> - <source>The following options can be dangerous! -Change them only if you know what you are doing.</source> - <translation>A következő beállítások veszélyesek! -Csak a hatásuk pontos ismeretében érdemes megváltoztatni őket.</translation> - </message> </context> <context> <name>PasswordGeneratorWidget</name> + <message> + <source>%p%</source> + <translation>%p%</translation> + </message> <message> <source>Password:</source> <translation>Jelszó:</translation> </message> + <message> + <source>strength</source> + <comment>Password strength</comment> + <translation>erősség</translation> + </message> + <message> + <source>entropy</source> + <translation>entrópia</translation> + </message> + <message> + <source>Password</source> + <translation>Jelszó</translation> + </message> <message> <source>Character Types</source> <translation>Karaktertípusok</translation> @@ -1751,38 +2943,50 @@ Csak a hatásuk pontos ismeretében érdemes megváltoztatni őket.</translation <source>Special Characters</source> <translation>Speciális karakterek</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>Bővített ASCII</translation> + </message> <message> <source>Exclude look-alike characters</source> <translation>Hasonlóan kinéző karakterek kizárása</translation> </message> - <message> - <source>Accept</source> - <translation>Elfogadás</translation> - </message> - <message> - <source>%p%</source> - <translation>%p%</translation> - </message> - <message> - <source>strength</source> - <translation>erősség</translation> - </message> - <message> - <source>entropy</source> - <translation>entrópia</translation> - </message> - <message> - <source>&Length:</source> - <translation>&Hossz:</translation> - </message> <message> <source>Pick characters from every group</source> <translation>Karakterek minden csoportból</translation> </message> + <message> + <source>&Length:</source> + <translation>&Hossz:</translation> + </message> + <message> + <source>Passphrase</source> + <translation>Jelmondat</translation> + </message> + <message> + <source>Wordlist:</source> + <translation>Szólista:</translation> + </message> + <message> + <source>Word Count:</source> + <translation>Szavak száma:</translation> + </message> + <message> + <source>Word Separator:</source> + <translation>Szóelválasztó:</translation> + </message> <message> <source>Generate</source> <translation>Előállítás</translation> </message> + <message> + <source>Copy</source> + <translation>Másolás</translation> + </message> + <message> + <source>Accept</source> + <translation>Elfogadás</translation> + </message> <message> <source>Close</source> <translation>Bezárás</translation> @@ -1801,51 +3005,270 @@ Csak a hatásuk pontos ismeretében érdemes megváltoztatni őket.</translation </message> <message> <source>Poor</source> + <comment>Password quality</comment> <translation>Silány</translation> </message> <message> <source>Weak</source> + <comment>Password quality</comment> <translation>Gyenge</translation> </message> <message> <source>Good</source> + <comment>Password quality</comment> <translation>Jó</translation> </message> <message> <source>Excellent</source> + <comment>Password quality</comment> <translation>Kiváló</translation> </message> - <message> - <source>Password</source> - <translation>Jelszó</translation> - </message> - <message> - <source>Extended ASCII</source> - <translation>Bővített ASCII</translation> - </message> - <message> - <source>Passphrase</source> - <translation>Jelmondat</translation> - </message> - <message> - <source>Wordlist:</source> - <translation>Szólista:</translation> - </message> - <message> - <source>Word Count:</source> - <translation>Szavak száma:</translation> - </message> - <message> - <source>Word Separator:</source> - <translation>Szóelválasztó:</translation> - </message> - <message> - <source>Copy</source> - <translation>Másolás</translation> - </message> </context> <context> <name>QObject</name> + <message> + <source>Database not opened</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database hash not available</source> + <translation type="unfinished"/> + </message> + <message> + <source>Client public key not received</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot decrypt message</source> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout or cannot connect to KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>Action cancelled or denied</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC association failed, try again</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key change was not successful</source> + <translation type="unfinished"/> + </message> + <message> + <source>Encryption key is not recognized</source> + <translation type="unfinished"/> + </message> + <message> + <source>No saved databases found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect action</source> + <translation type="unfinished"/> + </message> + <message> + <source>Empty message received</source> + <translation type="unfinished"/> + </message> + <message> + <source>No URL provided</source> + <translation type="unfinished"/> + </message> + <message> + <source>No logins found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown error</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add a new entry to a database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>Adatbázis útvonala.</translation> + </message> + <message> + <source>Key file of the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>path</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>username</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Prompt for the entry's password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a password for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length for the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to add.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy an entry's password to the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to clip.</source> + <comment>clip = copy to clipboard</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout in seconds before clearing the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Edit an entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Title for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>title</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to edit.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Estimate the entropy of a password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password for which to estimate the entropy.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Perform advanced analysis on the password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Extract and print the content of a database.</source> + <translation>Adatbázis tartalmának kinyerése és kiírása.</translation> + </message> + <message> + <source>Path of the database to extract.</source> + <translation>Kinyerendő adatbázis útvonala.</translation> + </message> + <message> + <source>Insert password to unlock %1: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to load key file %1 : %2</source> + <translation type="unfinished"/> + </message> + <message> + <source>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source> + +Available commands: +</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the command to execute.</source> + <translation>Végrehajtandó parancs neve.</translation> + </message> + <message> + <source>List database entries.</source> + <translation>Adatbázis-bejegyzések felsorolása.</translation> + </message> + <message> + <source>Path of the group to list. Default is /</source> + <translation>Felsorolandó csoport útvonala. Az alapértelezett: /</translation> + </message> + <message> + <source>Find entries quickly.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Search term.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Merge two databases.</source> + <translation>Két adatbázis összeolvasztása.</translation> + </message> + <message> + <source>Path of the database to merge into.</source> + <translation>Az összeolvasztás céladatbázisának útvonala.</translation> + </message> + <message> + <source>Path of the database to merge from.</source> + <translation>Az összeolvasztás forrásadatbázisának útvonala.</translation> + </message> + <message> + <source>Use the same credentials for both database files.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file of the database to merge from.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show an entry's information.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> + <translation type="unfinished"/> + </message> + <message> + <source>attribute</source> + <translation>attribútum</translation> + </message> + <message> + <source>Name of the entry to show.</source> + <translation>A megjelenítendő bejegyzés neve.</translation> + </message> <message> <source>NULL device</source> <translation>NULL eszkösz</translation> @@ -1869,8 +3292,28 @@ Csak a hatásuk pontos ismeretében érdemes megváltoztatni őket.</translation <translation>hiányzó lezáró idézőjel</translation> </message> <message> - <source>INTERNAL - unget lower bound exceeded</source> - <translation>BELSŐ - megközelíthetetlen alsó határ átlépve</translation> + <source>AES: 256-bit</source> + <translation>AES: 256 bites</translation> + </message> + <message> + <source>Twofish: 256-bit</source> + <translation>Twofish: 256 bites</translation> + </message> + <message> + <source>ChaCha20: 256-bit</source> + <translation>ChaCha20: 256 bites</translation> + </message> + <message> + <source>Argon2 (KDBX 4 – recommended)</source> + <translation>Argon2 (KDBX 4 – ajánlott)</translation> + </message> + <message> + <source>AES-KDF (KDBX 4)</source> + <translation>AES-KDF (KDBX 4)</translation> + </message> + <message> + <source>AES-KDF (KDBX 3.1)</source> + <translation>AES-KDF (KDBX 3.1)</translation> </message> <message> <source>Group</source> @@ -1888,14 +3331,22 @@ Csak a hatásuk pontos ismeretében érdemes megváltoztatni őket.</translation <source>Password</source> <translation>Jelszó</translation> </message> - <message> - <source>URL</source> - <translation>URL</translation> - </message> <message> <source>Notes</source> <translation>Jegyzetek</translation> </message> + <message> + <source>Last Modified</source> + <translation>Legutóbb módosítva</translation> + </message> + <message> + <source>Created</source> + <translation>Létrehozva</translation> + </message> + <message> + <source>Legacy Browser Integration</source> + <translation>Hagyományos böngészőintegráció</translation> + </message> <message> <source>Browser Integration</source> <translation>Böngészőintegráció</translation> @@ -1912,28 +3363,32 @@ Csak a hatásuk pontos ismeretében érdemes megváltoztatni őket.</translation <source>Passive</source> <translation>Passzív</translation> </message> + <message> + <source>SSH Agent</source> + <translation>SSH ügynök</translation> + </message> </context> <context> <name>QtIOCompressor</name> <message> <source>Internal zlib error when compressing: </source> - <translation>Belső zlib hiba a tömörítés közben:</translation> + <translation>Belső zlib hiba a tömörítés közben: </translation> </message> <message> <source>Error writing to underlying device: </source> - <translation>Hiba az alárendelt eszközre való írás közben:</translation> + <translation>Hiba az alárendelt eszközre való írás közben: </translation> </message> <message> <source>Error opening underlying device: </source> - <translation>Hiba az alárendelt eszköz megnyitásakor:</translation> + <translation>Hiba az alárendelt eszköz megnyitásakor: </translation> </message> <message> <source>Error reading data from underlying device: </source> - <translation>Hiba az alárendelt eszközről történő adatolvasás során:</translation> + <translation>Hiba az alárendelt eszközről történő adatolvasás során: </translation> </message> <message> <source>Internal zlib error when decompressing: </source> - <translation>Belső zlib hiba kibontás közben:</translation> + <translation>Belső zlib hiba kibontás közben: </translation> </message> </context> <context> @@ -1944,14 +3399,14 @@ Csak a hatásuk pontos ismeretében érdemes megváltoztatni őket.</translation </message> <message> <source>Internal zlib error: </source> - <translation>Belső zlib hiba:</translation> + <translation>Belső zlib hiba: </translation> </message> </context> <context> <name>SearchWidget</name> <message> - <source>Case Sensitive</source> - <translation>Nagy- és kisbetű érzékeny</translation> + <source>Search...</source> + <translation>Keresés…</translation> </message> <message> <source>Search</source> @@ -1962,8 +3417,8 @@ Csak a hatásuk pontos ismeretében érdemes megváltoztatni őket.</translation <translation>Törlés</translation> </message> <message> - <source>Search...</source> - <translation>Keresés…</translation> + <source>Case Sensitive</source> + <translation>Nagy- és kisbetű érzékeny</translation> </message> <message> <source>Limit search to selected group</source> @@ -1972,50 +3427,6 @@ Csak a hatásuk pontos ismeretében érdemes megváltoztatni őket.</translation </context> <context> <name>Service</name> - <message> - <source>A shared encryption-key with the name "%1" already exists. -Do you want to overwrite it?</source> - <translation>Létezik már egy megosztott titkosítási kulcs ezzel a névvel: „%1”. -Valóban felülírja?</translation> - </message> - <message> - <source>Do you want to update the information in %1 - %2?</source> - <translation>Frissíti az információt ebben: %1 – %2?</translation> - </message> - <message> - <source>The active database is locked! -Please unlock the selected database or choose another one which is unlocked.</source> - <translation>Az aktív adatbázis zárolt. -Fel kell oldani a kijelölt adatbázist, vagy egy másik nem zároltat kell választania.</translation> - </message> - <message> - <source>Successfully removed %1 encryption-%2 from KeePassX/Http Settings.</source> - <translation>Sikeresen eltávolításra került %1 titkosítási kulcs a KeePassX/HTTP beállításokból.</translation> - </message> - <message> - <source>No shared encryption-keys found in KeePassHttp Settings.</source> - <translation>Nem található megosztott titkosítási kulcs a KeePassHTTP beállításokban.</translation> - </message> - <message> - <source>The active database does not contain an entry of KeePassHttp Settings.</source> - <translation>Az aktív adatbázisban nincs egyetlen KeePassHTTP beállítási bejegyzés sem.</translation> - </message> - <message> - <source>Removing stored permissions...</source> - <translation>Tárolt jogosultságok törlése…</translation> - </message> - <message> - <source>Abort</source> - <translation>Megszakítás</translation> - </message> - <message> - <source>Successfully removed permissions from %1 %2.</source> - <translation>Sikeresen el lett távolítva a jogosultság innen: %1 %2.</translation> - </message> - <message> - <source>The active database does not contain an entry with permissions.</source> - <translation>Az aktív adatbázisban nincs egyetlen jogosultsági bejegyzés sem.</translation> - </message> <message> <source>KeePassXC: New key association request</source> <translation>KeePassXC: Új kulcstársítási kérés</translation> @@ -2031,34 +3442,78 @@ A KeePassXC adatbázishoz való hozzáférés engedélyezéséhez egy egyedi né <source>KeePassXC: Overwrite existing key?</source> <translation>KeePassXC: Felülírja a létező kulcsot?</translation> </message> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>Létezik már egy megosztott titkosítási kulcs ezzel a névvel: „%1”. +Valóban felülírja?</translation> + </message> <message> <source>KeePassXC: Update Entry</source> <translation>KeePassXC: Bejegyzés frissítése</translation> </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Frissíti az információt ebben: %1 – %2?</translation> + </message> <message> <source>KeePassXC: Database locked!</source> <translation>KeePassXC: Adatbázis zárolva!</translation> </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>Az aktív adatbázis zárolt. +Fel kell oldani a kijelölt adatbázist, vagy egy másik nem zároltat kell választania.</translation> + </message> <message> <source>KeePassXC: Removed keys from database</source> <translation>KeePassXC: Kulcsok eltávolítva az adatbázisból</translation> </message> + <message numerus="yes"> + <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> + <translation><numerusform>Sikeresen eltávolításra került %n titkosítási kulcs a KeePassX/HTTP beállításokból.</numerusform><numerusform>Sikeresen eltávolításra került %n titkosítási kulcs a KeePassX/HTTP beállításokból.</numerusform></translation> + </message> <message> <source>KeePassXC: No keys found</source> <translation>KeePassXC: Nincs találat a kulcsok között</translation> </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation>Nem található megosztott titkosítási kulcs a KeePassHTTP beállításokban.</translation> + </message> <message> <source>KeePassXC: Settings not available!</source> <translation>KeePassXC: Nincs ilyen beállítás!</translation> </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation>Az aktív adatbázisban nincs egyetlen KeePassHTTP beállítási bejegyzés sem.</translation> + </message> + <message> + <source>Removing stored permissions...</source> + <translation>Tárolt jogosultságok törlése…</translation> + </message> + <message> + <source>Abort</source> + <translation>Megszakítás</translation> + </message> <message> <source>KeePassXC: Removed permissions</source> <translation>KeePassXC: Jogosultságok eltávolítva</translation> </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entries.</source> + <translation><numerusform>Sikeresen el lett távolítva a jogosultság %n elemről.</numerusform><numerusform>Sikeresen el lett távolítva a jogosultság %n elemről.</numerusform></translation> + </message> <message> <source>KeePassXC: No entry with permissions found!</source> <translation>KeePassXC: Nem található bejegyzés ilyen jogosultsággal!</translation> </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>Az aktív adatbázisban nincs egyetlen jogosultsági bejegyzés sem.</translation> + </message> </context> <context> <name>SettingsWidget</name> @@ -2081,10 +3536,26 @@ A KeePassXC adatbázishoz való hozzáférés engedélyezéséhez egy egyedi né </context> <context> <name>SettingsWidgetGeneral</name> + <message> + <source>Basic Settings</source> + <translation>Alapvető beállítások</translation> + </message> + <message> + <source>Start only a single instance of KeePassXC</source> + <translation>A KeePassXC többszörös indításának tiltása</translation> + </message> <message> <source>Remember last databases</source> <translation>Utolsó adatbázis megjegyzése</translation> </message> + <message> + <source>Remember last key files and security dongles</source> + <translation>Az utolsó kulcsfájlok és biztonsági hardverkulcsok megjegyzése</translation> + </message> + <message> + <source>Load previous databases on startup</source> + <translation>Előző adatbázisok betöltése indításkor</translation> + </message> <message> <source>Automatically save on exit</source> <translation>Automatikus mentés kilépéskor</translation> @@ -2093,21 +3564,29 @@ A KeePassXC adatbázishoz való hozzáférés engedélyezéséhez egy egyedi né <source>Automatically save after every change</source> <translation>Automatikus mentés minden módosítás után</translation> </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation>Külső módosításkor az adatbázis automatikus újratöltése</translation> + </message> <message> <source>Minimize when copying to clipboard</source> - <translation>Kicsinyítés válapra való másoláskor</translation> + <translation>Kicsinyítés a vágólapra történő másoláskor</translation> + </message> + <message> + <source>Minimize window at application startup</source> + <translation>Indításkor az ablak kicsinyítése</translation> </message> <message> <source>Use group icon on entry creation</source> <translation>A csoport ikonjának használata a bejegyzés létrehozásakor</translation> </message> <message> - <source>Global Auto-Type shortcut</source> - <translation>Globális automatikus beírás gyorsbillentyűje</translation> + <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> + <translation>Nem adatjellegű változások (pl. csoport lenyitása) esetén az adatbázis módosított állapotba kerülésének megakadályozása</translation> </message> <message> - <source>Language</source> - <translation>Nyelv</translation> + <source>Hide the Details view</source> + <translation type="unfinished"/> </message> <message> <source>Show a system tray icon</source> @@ -2117,76 +3596,74 @@ A KeePassXC adatbázishoz való hozzáférés engedélyezéséhez egy egyedi né <source>Hide window to system tray when minimized</source> <translation>Az ablak rendszertálcára rejtése kicsinyítéskor</translation> </message> - <message> - <source>Load previous databases on startup</source> - <translation>Előző adatbázisok betöltése indításkor</translation> - </message> - <message> - <source>Automatically reload the database when modified externally</source> - <translation>Külső módosításkor az adatbázis automatikus újratöltése</translation> - </message> <message> <source>Hide window to system tray instead of app exit</source> <translation>Kilépés helyett rendszertálcára való rejtés</translation> </message> <message> - <source>Minimize window at application startup</source> - <translation>Indításkor az ablak kicsinyítése</translation> + <source>Dark system tray icon</source> + <translation type="unfinished"/> </message> <message> - <source>Basic Settings</source> - <translation>Alapvető beállítások</translation> - </message> - <message> - <source>Remember last key files and security dongles</source> - <translation>Az utolsó kulcsfájlok és biztonsági hardverkulcsok megjegyzése</translation> - </message> - <message> - <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> - <translation>Nem adatjellegű változások (pl. csoport lenyitása) esetén az adatbázis módosított állapotba kerülésének megakadályozása</translation> + <source>Language</source> + <translation>Nyelv</translation> </message> <message> <source>Auto-Type</source> <translation>Automatikus beírás</translation> </message> <message> - <source>Use entry title and URL to match windows for global Auto-Type</source> - <translation>Bejegyzések címének és URL-jének alkalmazása az ablakok illesztésénél a globális automatikus beírás számára. </translation> + <source>Use entry title to match windows for global Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use entry URL to match windows for global Auto-Type</source> + <translation type="unfinished"/> </message> <message> <source>Always ask before performing Auto-Type</source> <translation>Mindig kérdezzen az automatikus beírás megkezdése előtt</translation> </message> + <message> + <source>Global Auto-Type shortcut</source> + <translation>Globális automatikus beírás gyorsbillentyűje</translation> + </message> <message> <source>Auto-Type delay</source> <translation>Automatikus beírás késleltetése</translation> </message> <message> <source> ms</source> + <comment>Milliseconds</comment> <translation>ms</translation> </message> - <message> - <source>Start only a single instance of KeePassXC</source> - <translation>A KeePassXC többszörös indításának tiltása</translation> - </message> </context> <context> <name>SettingsWidgetSecurity</name> + <message> + <source>Timeouts</source> + <translation>Időtúllépések</translation> + </message> <message> <source>Clear clipboard after</source> - <translation>Vágólap törlése ennyi idő után: </translation> + <translation>Vágólap törlése ennyi idő után</translation> </message> <message> <source> sec</source> - <translation>mp</translation> + <comment>Seconds</comment> + <translation> mp</translation> </message> <message> <source>Lock databases after inactivity of</source> <translation>Adatbázis zárolása ennyi inaktivitás után</translation> </message> <message> - <source>Show passwords in cleartext by default</source> - <translation>Jelszavak alapértelmezetten egyszerű szövegként megjelenítése</translation> + <source>Convenience</source> + <translation>Kényelem</translation> + </message> + <message> + <source>Lock databases when session is locked or lid is closed</source> + <translation>Adatbázis zárolása munkamenet zárolásakor vagy a fedél lecsukásakor</translation> </message> <message> <source>Lock databases after minimizing the window</source> @@ -2197,16 +3674,16 @@ A KeePassXC adatbázishoz való hozzáférés engedélyezéséhez egy egyedi né <translation>Jelszóismétlés elkerülése látható jelszó esetén</translation> </message> <message> - <source>Timeouts</source> - <translation>Időtúllépések</translation> + <source>Show passwords in cleartext by default</source> + <translation>Jelszavak megjelenítése alapértelmezetten egyszerű szövegként</translation> </message> <message> - <source>Convenience</source> - <translation>Kényelem</translation> + <source>Hide passwords in the preview panel</source> + <translation type="unfinished"/> </message> <message> - <source>Lock databases when session is locked or lid is closed</source> - <translation>Adatbázis zárolása munkamenet zárolásakor vagy a fedél lecsukásakor</translation> + <source>Hide entry notes by default</source> + <translation type="unfinished"/> </message> <message> <source>Privacy</source> @@ -2227,6 +3704,14 @@ A KeePassXC adatbázishoz való hozzáférés engedélyezéséhez egy egyedi né <source>Key:</source> <translation>Kulcs:</translation> </message> + <message> + <source>Default RFC 6238 token settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Steam token settings</source> + <translation type="unfinished"/> + </message> <message> <source>Use custom settings</source> <translation>Egyéni beállítások alkalmazása</translation> @@ -2253,7 +3738,8 @@ A KeePassXC adatbázishoz való hozzáférés engedélyezéséhez egy egyedi né </message> <message> <source> sec</source> - <translation>mp</translation> + <comment>Seconds</comment> + <translation> mp</translation> </message> </context> <context> @@ -2319,6 +3805,26 @@ A KeePassXC adatbázishoz való hozzáférés engedélyezéséhez egy egyedi né </context> <context> <name>main</name> + <message> + <source>Remove an entry from the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>Adatbázis útvonala.</translation> + </message> + <message> + <source>Path of the entry to remove.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation>KeePassXC – keresztplatformos jelszókezelő</translation> + </message> + <message> + <source>filenames of the password databases to open (*.kdbx)</source> + <translation>megnyitandó jelszóadatbázisok fájlnevei (*.kdbx)</translation> + </message> <message> <source>path to a custom config file</source> <translation>útvonal az egyéni beállítófájlhoz</translation> @@ -2327,81 +3833,13 @@ A KeePassXC adatbázishoz való hozzáférés engedélyezéséhez egy egyedi né <source>key file of the database</source> <translation>adatbázis kulcsfájlja</translation> </message> - <message> - <source>KeePassXC - cross-platform password manager</source> - <translation>KeePassXC – keresztplatformos jelszókezelő</translation> - </message> <message> <source>read password of the database from stdin</source> <translation>adatbázis jelszó beolvasása az stdin-ről</translation> </message> <message> - <source>filenames of the password databases to open (*.kdbx)</source> - <translation>megnyitandó jelszóadatbázisok fájlnevei (*.kdbx)</translation> - </message> - <message> - <source>Copy a password to the clipboard</source> - <translation>Jelszó másolása vágólapra</translation> - </message> - <message> - <source>Path of the database.</source> - <translation>Adatbázis útvonala.</translation> - </message> - <message> - <source>Use a GUI prompt unlocking the database.</source> - <translation>Felugró ablak használata az adatbázis feloldásához.</translation> - </message> - <message> - <source>Name of the entry to clip.</source> - <translation>Levágandó bejegyzés neve.</translation> - </message> - <message> - <source>Extract and print the content of a database.</source> - <translation>Adatbázis tartalmának kinyerése és kiírása.</translation> - </message> - <message> - <source>Path of the database to extract.</source> - <translation>Kinyerendő adatbázis útvonala.</translation> - </message> - <message> - <source>Name of the command to execute.</source> - <translation>Végrehajtandó parancs neve.</translation> - </message> - <message> - <source>List database entries.</source> - <translation>Adatbázis-bejegyzések felsorolása.</translation> - </message> - <message> - <source>Path of the group to list. Default is /</source> - <translation>Felsorolandó csoport útvonala. Az alapértelezett: /</translation> - </message> - <message> - <source>Print the UUIDs of the entries and groups.</source> - <translation>Bejegyzések és csoportok UUID-inek kiírása.</translation> - </message> - <message> - <source>Merge two databases.</source> - <translation>Két adatbázis összeolvasztása.</translation> - </message> - <message> - <source>Path of the database to merge into.</source> - <translation>Az összeolvasztás céladatbázisának útvonala.</translation> - </message> - <message> - <source>Path of the database to merge from.</source> - <translation>Az összeolvasztás forrásadatbázisának útvonala.</translation> - </message> - <message> - <source>Use the same password for both database files.</source> - <translation>Azonos jelszó használat mindkét adatbázis fájlhoz.</translation> - </message> - <message> - <source>Show a password.</source> - <translation>Jelszó megjelenítése.</translation> - </message> - <message> - <source>Name of the entry to show.</source> - <translation>A megjelenítendő bejegyzés neve.</translation> + <source>Parent window handle</source> + <translation type="unfinished"/> </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_id.ts b/share/translations/keepassx_id.ts index 1e04aeb4c..c31659692 100644 --- a/share/translations/keepassx_id.ts +++ b/share/translations/keepassx_id.ts @@ -9,14 +9,34 @@ <source>About</source> <translation>Tentang</translation> </message> + <message> + <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> + <translation>Laporkan bug di: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> + </message> + <message> + <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>KeePassXC didistribusikan di bawah GNU General Public License (GPL) versi 2 atau (terserah pilihan Anda) versi 3.</translation> + </message> + <message> + <source>Project Maintainers:</source> + <translation>Pengelola Proyek:</translation> + </message> <message> <source>Contributors</source> <translation>Kontributor</translation> </message> + <message> + <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Lihat Semua Kontribusi pada GitHub</a></translation> + </message> <message> <source>Debug Info</source> <translation>Info Awakutu</translation> </message> + <message> + <source>Include the following information whenever you report a bug:</source> + <translation>Sertakan informasi berikut setiap Anda melaporkan bug:</translation> + </message> <message> <source>Copy to clipboard</source> <translation>Salin ke papan klip</translation> @@ -31,6 +51,10 @@ <source>Revision: %1</source> <translation>Revisi: %1</translation> </message> + <message> + <source>Distribution: %1</source> + <translation>Distribusi: %1</translation> + </message> <message> <source>Libraries:</source> <translation>Pustaka:</translation> @@ -47,33 +71,13 @@ Kernel: %3 %4</translation> <source>Enabled extensions:</source> <translation>Ekstensi aktif:</translation> </message> - <message> - <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> - <translation>Laporkan bug di: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> - </message> - <message> - <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassXC didistribusikan di bawah GNU General Public License (GPL) versi 2 atau (terserah pilihan Anda) versi 3.</translation> - </message> - <message> - <source>Project Maintainers:</source> - <translation>Pengelola Proyek:</translation> - </message> - <message> - <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Lihat Semua Kontribusi pada GitHub</a></translation> - </message> - <message> - <source>Include the following information whenever you report a bug:</source> - <translation>Sertakan informasi berikut setiap Anda melaporkan bug:</translation> - </message> - <message> - <source>Distribution: %1</source> - <translation>Distribusi: %1</translation> - </message> </context> <context> <name>AccessControlDialog</name> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>Konfirmasi Akses KeePassXC HTTP</translation> + </message> <message> <source>Remember this decision</source> <translation>Ingat tindakan ini</translation> @@ -92,9 +96,12 @@ Please select whether you want to allow access.</source> <translation>%1 telah meminta akses sandi untuk item berikut. Silakan pilih apakah Anda ingin mengizinkannya.</translation> </message> +</context> +<context> + <name>AgentSettingsWidget</name> <message> - <source>KeePassXC HTTP Confirm Access</source> - <translation>Konfirmasi Akses KeePassXC HTTP</translation> + <source>Enable SSH Agent (requires restart)</source> + <translation type="unfinished"/> </message> </context> <context> @@ -107,6 +114,26 @@ Silakan pilih apakah Anda ingin mengizinkannya.</translation> <source>Auto-Type - KeePassXC</source> <translation>Ketik-Otomatis - KeePassXC</translation> </message> + <message> + <source>Auto-Type</source> + <translation>Ketik-Otomatis</translation> + </message> + <message> + <source>The Syntax of your Auto-Type statement is incorrect!</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> </context> <context> <name>AutoTypeAssociationsModel</name> @@ -125,13 +152,290 @@ Silakan pilih apakah Anda ingin mengizinkannya.</translation> </context> <context> <name>AutoTypeSelectDialog</name> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>Ketik-Otomatis - KeePassXC</translation> + </message> <message> <source>Select entry to Auto-Type:</source> <translation>Pilih entri untuk Ketik-Otomatis:</translation> </message> +</context> +<context> + <name>BrowserAccessControlDialog</name> <message> - <source>Auto-Type - KeePassXC</source> - <translation>Ketik-Otomatis - KeePassXC</translation> + <source>KeePassXC-Browser Confirm Access</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remember this decision</source> + <translation>Ingat tindakan ini</translation> + </message> + <message> + <source>Allow</source> + <translation>Izinkan</translation> + </message> + <message> + <source>Deny</source> + <translation>Tolak</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 telah meminta akses sandi untuk item berikut. +Silakan pilih apakah Anda ingin mengizinkannya.</translation> + </message> +</context> +<context> + <name>BrowserOptionDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"/> + </message> + <message> + <source>This is required for accessing your databases with KeePassXC-Browser</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable KeepassXC browser integration</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>Umum</translation> + </message> + <message> + <source>Enable integration for these browsers:</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Google Chrome</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Firefox</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Chromium</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Vivaldi</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show a &notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>&Minta untuk membuka basis data jika terkunci</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Match URL scheme (e.g., https://...)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return only best-matching credentials</source> + <translation type="unfinished"/> + </message> + <message> + <source>Sort &matching credentials by title</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Sort matching credentials by &username</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>&Disconnect all browsers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Forget all remembered &permissions</source> + <translation type="unfinished"/> + </message> + <message> + <source>Advanced</source> + <translation>Tingkat Lanjut</translation> + </message> + <message> + <source>Never &ask before accessing credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Never ask before &updating credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searc&h in all opened databases for matching credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>Membuat atau memperbarui ruas lema secara otomatis tidak didukung.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation type="unfinished"/> + </message> + <message> + <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Update &native messaging manifest files at startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Support a proxy application between KeePassXC and browser extension.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &proxy application between KeePassXC and browser extension</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a custom proxy location if you installed a proxy manually.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &custom proxy location</source> + <comment>Meant is the proxy for KeePassXC-Browser</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*.exe);;All Files (*.*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select custom proxy location</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>BrowserService</name> + <message> + <source>KeePassXC: New key association request</source> + <translation>KeePassXC: Permintaan asosiasi kunci baru</translation> + </message> + <message> + <source>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Save and allow access</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: Timpa kunci yang ada?</translation> + </message> + <message> + <source>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: Perbarui Entri</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Apakah Anda ingin memperbarui informasi dalam %1 - %2?</translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: Basis data dikunci!</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>Basis data aktif dikunci! +Silakan buka kunci atau pilih yang lainnya yang tidak terkunci.</translation> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: Pengaturan tidak tersedia!</translation> + </message> + <message> + <source>The active database does not contain a settings entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: Tidak ada kunci yang ditemukan</translation> + </message> + <message> + <source>No shared encryption keys found in KeePassXC Settings.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: Buang kunci dari basis data</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <source>Removing stored permissions…</source> + <translation type="unfinished"/> + </message> + <message> + <source>Abort</source> + <translation>Batal</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: Buang izin</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entry(s).</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation>KeePassXC: Tidak entri dengan izin yang ditemukan!</translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>Basis data aktif tidak berisi entri dengan izin.</translation> </message> </context> <context> @@ -148,6 +452,10 @@ Silakan pilih apakah Anda ingin mengizinkannya.</translation> <source>Repeat password:</source> <translation>Ulangi sandi:</translation> </message> + <message> + <source>&Key file</source> + <translation>Berkas &kunci</translation> + </message> <message> <source>Browse</source> <translation>Telusuri</translation> @@ -156,13 +464,21 @@ Silakan pilih apakah Anda ingin mengizinkannya.</translation> <source>Create</source> <translation>Buat</translation> </message> + <message> + <source>Cha&llenge Response</source> + <translation type="unfinished"/> + </message> + <message> + <source>Refresh</source> + <translation>Segarkan</translation> + </message> <message> <source>Key files</source> <translation>Berkas kunci</translation> </message> <message> <source>All files</source> - <translation>Semua berkas</translation> + <translation>Semua Berkas</translation> </message> <message> <source>Create Key File...</source> @@ -176,6 +492,10 @@ Silakan pilih apakah Anda ingin mengizinkannya.</translation> <source>Select a key file</source> <translation>Pilih berkas kunci</translation> </message> + <message> + <source>Empty password</source> + <translation>Sandi kosong</translation> + </message> <message> <source>Do you really want to use an empty string as password?</source> <translation>Apakah Anda benar-benar ingin menggunakan lema kosong sebagai sandi?</translation> @@ -191,20 +511,15 @@ Silakan pilih apakah Anda ingin mengizinkannya.</translation> %2</translation> </message> <message> - <source>&Key file</source> - <translation>Berkas &kunci</translation> - </message> - <message> - <source>Cha&llenge Response</source> + <source>Legacy key file format</source> <translation type="unfinished"/> </message> <message> - <source>Refresh</source> - <translation>Segarkan</translation> - </message> - <message> - <source>Empty password</source> - <translation>Sandi kosong</translation> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -217,6 +532,10 @@ Silakan pilih apakah Anda ingin mengizinkannya.</translation> <source>Clone Options</source> <translation>Opsi Penggandaan</translation> </message> + <message> + <source>Append ' - Clone' to title</source> + <translation>Tambahkan ' - Salinan' ke judul</translation> + </message> <message> <source>Replace username and password with references</source> <translation>Ganti nama pengguna dan sandi dengan referensi</translation> @@ -225,10 +544,6 @@ Silakan pilih apakah Anda ingin mengizinkannya.</translation> <source>Copy history</source> <translation>Salin riwayat</translation> </message> - <message> - <source>Append ' - Clone' to title</source> - <translation>Tambahkan ' - Salinan' ke judul</translation> - </message> </context> <context> <name>CsvImportWidget</name> @@ -324,10 +639,6 @@ Silakan pilih apakah Anda ingin mengizinkannya.</translation> </context> <context> <name>CsvImportWizard</name> - <message> - <source>Import CSV file</source> - <translation>Impor berkas CSV</translation> - </message> <message> <source>Error</source> <translation>Galat</translation> @@ -339,17 +650,17 @@ Silakan pilih apakah Anda ingin mengizinkannya.</translation> </context> <context> <name>CsvParserModel</name> - <message> - <source> byte, </source> - <translation> bita, </translation> + <message numerus="yes"> + <source>%n byte(s), </source> + <translation type="unfinished"><numerusform></numerusform></translation> </message> - <message> - <source> rows, </source> - <translation> baris, </translation> + <message numerus="yes"> + <source>%n row(s), </source> + <translation type="unfinished"><numerusform></numerusform></translation> </message> - <message> - <source> columns</source> - <translation> kolom</translation> + <message numerus="yes"> + <source>%n column(s)</source> + <translation type="unfinished"><numerusform></numerusform></translation> </message> </context> <context> @@ -370,6 +681,14 @@ Silakan pilih apakah Anda ingin mengizinkannya.</translation> <source>Browse</source> <translation>Telusuri</translation> </message> + <message> + <source>Refresh</source> + <translation>Segarkan</translation> + </message> + <message> + <source>Challenge Response:</source> + <translation type="unfinished"/> + </message> <message> <source>Unable to open the database.</source> <translation>Tidak bisa membuka basis data.</translation> @@ -378,9 +697,24 @@ Silakan pilih apakah Anda ingin mengizinkannya.</translation> <source>Can't open key file</source> <translation>Tidak bisa membuka berkas kunci</translation> </message> + <message> + <source>Legacy key file format</source> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't show this warning again</source> + <translation type="unfinished"/> + </message> <message> <source>All files</source> - <translation>Semua berkas</translation> + <translation>Semua Berkas</translation> </message> <message> <source>Key files</source> @@ -390,14 +724,6 @@ Silakan pilih apakah Anda ingin mengizinkannya.</translation> <source>Select key file</source> <translation>Pilih berkas kunci</translation> </message> - <message> - <source>Refresh</source> - <translation>Segarkan</translation> - </message> - <message> - <source>Challenge Response:</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DatabaseRepairWidget</name> @@ -413,14 +739,14 @@ Silakan pilih apakah Anda ingin mengizinkannya.</translation> <source>Can't open key file</source> <translation>Tidak bisa membuka berkas kunci</translation> </message> - <message> - <source>Database opened fine. Nothing to do.</source> - <translation>Basis data terbuka dengan baik. Tidak perlu melakukan apa-apa.</translation> - </message> <message> <source>Unable to open the database.</source> <translation>Tidak bisa membuka basis data.</translation> </message> + <message> + <source>Database opened fine. Nothing to do.</source> + <translation>Basis data terbuka dengan baik. Tidak perlu melakukan apa-apa.</translation> + </message> <message> <source>Success</source> <translation>Sukses</translation> @@ -438,6 +764,102 @@ Anda bisa menyimpannya sekarang.</translation> </context> <context> <name>DatabaseSettingsWidget</name> + <message> + <source>General</source> + <translation>Umum</translation> + </message> + <message> + <source>Encryption</source> + <translation type="unfinished"/> + </message> + <message> + <source>Number of rounds too high</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Understood, keep number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cancel</source> + <translation type="unfinished"/> + </message> + <message> + <source>Number of rounds too low</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</source> + <translation type="unfinished"/> + </message> + <message> + <source>KDF unchanged</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetEncryption</name> + <message> + <source>Encryption Algorithm:</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES: 256 Bit (default)</source> + <translation>AES: 256 Bit (bawaan)</translation> + </message> + <message> + <source>Twofish: 256 Bit</source> + <translation>Twofish: 256 Bit</translation> + </message> + <message> + <source>Key Derivation Function:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Transform rounds:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Benchmark 1-second delay</source> + <translation type="unfinished"/> + </message> + <message> + <source>Memory Usage:</source> + <translation type="unfinished"/> + </message> + <message> + <source> MB</source> + <translation type="unfinished"/> + </message> + <message> + <source>Parallelism:</source> + <translation type="unfinished"/> + </message> + <message> + <source> thread</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetGeneral</name> + <message> + <source>Database Meta Data</source> + <translation type="unfinished"/> + </message> <message> <source>Database name:</source> <translation>Nama basis data:</translation> @@ -446,20 +868,12 @@ Anda bisa menyimpannya sekarang.</translation> <source>Database description:</source> <translation>Deskripsi basis data:</translation> </message> - <message> - <source>Transform rounds:</source> - <translation type="unfinished"/> - </message> <message> <source>Default username:</source> <translation>Nama pengguna baku:</translation> </message> <message> - <source> MiB</source> - <translation> MiB</translation> - </message> - <message> - <source>Benchmark</source> + <source>History Settings</source> <translation type="unfinished"/> </message> <message> @@ -470,36 +884,29 @@ Anda bisa menyimpannya sekarang.</translation> <source>Max. history size:</source> <translation>Maks. ukuran riwayat:</translation> </message> + <message> + <source> MiB</source> + <translation> MiB</translation> + </message> <message> <source>Use recycle bin</source> <translation>Gunakan keranjang sampah</translation> </message> - <message> - <source>AES: 256 Bit (default)</source> - <translation>AES: 256 Bit (bawaan)</translation> - </message> - <message> - <source>Twofish: 256 Bit</source> - <translation>Twofish: 256 Bit</translation> - </message> - <message> - <source>Algorithm:</source> - <translation>Algoritma:</translation> - </message> </context> <context> <name>DatabaseTabWidget</name> <message> <source>Root</source> + <comment>Root group</comment> <translation>Root</translation> </message> <message> <source>KeePass 2 Database</source> - <translation>Basis data KeePass 2</translation> + <translation>Basis Data KeePass 2</translation> </message> <message> <source>All files</source> - <translation>Semua berkas</translation> + <translation>Semua Berkas</translation> </message> <message> <source>Open database</source> @@ -509,6 +916,30 @@ Anda bisa menyimpannya sekarang.</translation> <source>File not found!</source> <translation>Berkas tidak ditemukan!</translation> </message> + <message> + <source>Unable to open the database.</source> + <translation>Tidak bisa membuka basis data.</translation> + </message> + <message> + <source>File opened in read only mode.</source> + <translation>Berkas terbuka dalam mode baca-saja.</translation> + </message> + <message> + <source>Open CSV file</source> + <translation>Buka berkas CSV</translation> + </message> + <message> + <source>CSV file</source> + <translation>Berkas CSV</translation> + </message> + <message> + <source>All files (*)</source> + <translation>Semua berkas (*)</translation> + </message> + <message> + <source>Merge database</source> + <translation>Gabung basis data</translation> + </message> <message> <source>Open KeePass 1 database</source> <translation>Buka basis data KeePass 1</translation> @@ -517,14 +948,16 @@ Anda bisa menyimpannya sekarang.</translation> <source>KeePass 1 database</source> <translation>Basis data KeePass 1</translation> </message> - <message> - <source>All files (*)</source> - <translation>Semua berkas (*)</translation> - </message> <message> <source>Close?</source> <translation>Tutup?</translation> </message> + <message> + <source>"%1" is in edit mode. +Discard changes and close anyway?</source> + <translation>"%1" dalam mode penyuntingan. +Tetap buang ubahan dan tutup?</translation> + </message> <message> <source>Save changes?</source> <translation>Simpan perubahan?</translation> @@ -537,12 +970,24 @@ Simpan perubahan?</translation> </message> <message> <source>Writing the database failed.</source> - <translation>Gagal membuat basis data.</translation> + <translation>Gagal menyimpan basis data.</translation> + </message> + <message> + <source>Passwords</source> + <translation>Sandi</translation> </message> <message> <source>Save database as</source> <translation>Simpan basis data sebagai</translation> </message> + <message> + <source>Export database to CSV file</source> + <translation>Ekspor basis data ke berkas CSV</translation> + </message> + <message> + <source>Writing the CSV file failed.</source> + <translation>Gagal membuat berkas CSV.</translation> + </message> <message> <source>New database</source> <translation>Basis data baru</translation> @@ -560,12 +1005,6 @@ Simpan perubahan?</translation> Please press cancel to finish your changes or discard them.</source> <translation>Tidak bisa mengunci basis data karena Anda sedang menyuntingnya. Harap tekan batal untuk menyelesaikan ubahan Anda atau membuangnya.</translation> - </message> - <message> - <source>This database has never been saved. -You can save the database or stop locking it.</source> - <translation>Basis data ini belum pernah disimpan. -Anda bisa menyimpan basis data atau berhenti menguncinya.</translation> </message> <message> <source>This database has been modified. @@ -575,69 +1014,13 @@ Otherwise your changes are lost.</source> Apakah Anda ingin menyimpan basis data sebelum menguncinya? Kalau tidak, ubahan Anda akan hilang.</translation> </message> - <message> - <source>"%1" is in edit mode. -Discard changes and close anyway?</source> - <translation>"%1" dalam mode penyuntingan. -Tetap buang ubahan dan tutup?</translation> - </message> - <message> - <source>Export database to CSV file</source> - <translation>Ekspor basis data ke berkas CSV</translation> - </message> - <message> - <source>CSV file</source> - <translation>Berkas CSV</translation> - </message> - <message> - <source>Writing the CSV file failed.</source> - <translation>Gagal membuat berkas CSV.</translation> - </message> - <message> - <source>Unable to open the database.</source> - <translation>Tidak bisa membuka basis data.</translation> - </message> - <message> - <source>Merge database</source> - <translation>Gabung basis data</translation> - </message> - <message> - <source>The database you are trying to save as is locked by another instance of KeePassXC. -Do you want to save it anyway?</source> - <translation>Basis data yang ingin Anda simpan dikunci oleh aplikasi KeePassXC yang telah berjalan. -Apakah Anda tetap ingin menyimpannya?</translation> - </message> - <message> - <source>Passwords</source> - <translation>Sandi</translation> - </message> - <message> - <source>Database already opened</source> - <translation>Basis data sudah terbuka</translation> - </message> - <message> - <source>The database you are trying to open is locked by another instance of KeePassXC. - -Do you want to open it anyway?</source> - <translation>Basis data yang ingin Anda simpan dikunci oleh aplikasi KeePassXC yang telah berjalan. - -Apakah Anda ingin tetap menyimpannya?</translation> - </message> - <message> - <source>Open read-only</source> - <translation>Buka baca-saja</translation> - </message> - <message> - <source>File opened in read only mode.</source> - <translation>Berkas terbuka dalam mode baca-saja.</translation> - </message> - <message> - <source>Open CSV file</source> - <translation>Buka berkas CSV</translation> - </message> </context> <context> <name>DatabaseWidget</name> + <message> + <source>Searching...</source> + <translation>Mencari...</translation> + </message> <message> <source>Change master key</source> <translation>Ubah kunci utama</translation> @@ -658,13 +1041,33 @@ Apakah Anda ingin tetap menyimpannya?</translation> <source>Do you really want to delete %1 entries for good?</source> <translation>Apakah Anda benar-benar ingin menghapus entri %1 untuk selamanya?</translation> </message> + <message> + <source>Move entry to recycle bin?</source> + <translation>Pindahkan entri ke keranjang sampah?</translation> + </message> + <message> + <source>Do you really want to move entry "%1" to the recycle bin?</source> + <translation>Apakah Anda benar-benar ingin memindahkan "%1" ke keranjang sampah?</translation> + </message> <message> <source>Move entries to recycle bin?</source> <translation>Pindah entri ke keranjang sampah?</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>Apakah Anda benar-benar ingin memindahkan %n entri ke keranjang sampah?</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <source>Execute command?</source> + <translation>Jalankan perintah?</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation>Apakah Anda benar-benar ingin menjalankan perintah berikut?<br><br>%1<br></translation> + </message> + <message> + <source>Remember my choice</source> + <translation>Ingat pilihan saya</translation> </message> <message> <source>Delete group?</source> @@ -678,18 +1081,6 @@ Apakah Anda ingin tetap menyimpannya?</translation> <source>Unable to calculate master key</source> <translation>Tidak bisa mengkalkulasi kunci utama</translation> </message> - <message> - <source>Move entry to recycle bin?</source> - <translation>Pindahkan entri ke keranjang sampah?</translation> - </message> - <message> - <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation>Apakah Anda benar-benar ingin memindahkan "%1" ke keranjang sampah?</translation> - </message> - <message> - <source>Searching...</source> - <translation>Mencari...</translation> - </message> <message> <source>No current database.</source> <translation>Tidak ada basis data.</translation> @@ -707,20 +1098,8 @@ Apakah Anda ingin tetap menyimpannya?</translation> <translation>Tidak Ada Hasil</translation> </message> <message> - <source>Execute command?</source> - <translation>Jalankan perintah?</translation> - </message> - <message> - <source>Do you really want to execute the following command?<br><br>%1<br></source> - <translation>Apakah Anda benar-benar ingin menjalankan perintah berikut?<br><br>%1<br></translation> - </message> - <message> - <source>Remember my choice</source> - <translation>Ingat pilihan saya</translation> - </message> - <message> - <source>Autoreload Request</source> - <translation>Otomatis Muat Ulang Permintaan</translation> + <source>File has changed</source> + <translation type="unfinished"/> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -731,8 +1110,9 @@ Apakah Anda ingin tetap menyimpannya?</translation> <translation>Permintaan Penggabungan</translation> </message> <message> - <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> - <translation>Basis data telah berubah dan Anda memiliki ubahan yang belum disimpan. Apakah Anda ingin menggabungkan ubahan Anda?</translation> + <source>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</source> + <translation type="unfinished"/> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -747,6 +1127,89 @@ Apakah Anda ingin tetap menyimpannya?</translation> <translation>Apakah Anda yakin ingin menghapus semuanya secara permanen dari keranjang sampah?</translation> </message> </context> +<context> + <name>DetailsWidget</name> + <message> + <source>Generate TOTP Token</source> + <translation type="unfinished"/> + </message> + <message> + <source>Close</source> + <translation>Tutup</translation> + </message> + <message> + <source>General</source> + <translation>Umum</translation> + </message> + <message> + <source>Password</source> + <translation>Sandi</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Expiration</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username</source> + <translation>Nama pengguna</translation> + </message> + <message> + <source>Autotype</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searching</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attributes</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation>Lampiran</translation> + </message> + <message> + <source>Notes</source> + <translation>Catatan</translation> + </message> + <message> + <source>Window</source> + <translation>Jendela</translation> + </message> + <message> + <source>Sequence</source> + <translation>Urutan</translation> + </message> + <message> + <source>Search</source> + <translation>Cari</translation> + </message> + <message> + <source>Clear</source> + <translation>Bersihkan</translation> + </message> + <message> + <source>Never</source> + <translation type="unfinished"/> + </message> + <message> + <source>[PROTECTED]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Disabled</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enabled</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EditEntryWidget</name> <message> @@ -773,6 +1236,30 @@ Apakah Anda ingin tetap menyimpannya?</translation> <source>History</source> <translation>Riwayat</translation> </message> + <message> + <source>SSH Agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>(encrypted)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>File too large to be a private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open private key</source> + <translation type="unfinished"/> + </message> <message> <source>Entry history</source> <translation>Riwayat entri</translation> @@ -793,40 +1280,6 @@ Apakah Anda ingin tetap menyimpannya?</translation> <source>New attribute</source> <translation>Atribut baru</translation> </message> - <message> - <source>Select file</source> - <translation>Pilih berkas</translation> - </message> - <message> - <source>Unable to open file</source> - <translation>Tidak bisa membuka berkas</translation> - </message> - <message> - <source>Save attachment</source> - <translation>Simpan lampiran</translation> - </message> - <message> - <source>Unable to save the attachment: -</source> - <translation>Tidak bisa menyimpan lampiran: -</translation> - </message> - <message> - <source>Tomorrow</source> - <translation>Besok</translation> - </message> - <message numerus="yes"> - <source>%n week(s)</source> - <translation><numerusform>%n minggu</numerusform></translation> - </message> - <message numerus="yes"> - <source>%n month(s)</source> - <translation><numerusform>%n bulan</numerusform></translation> - </message> - <message> - <source>1 year</source> - <translation>1 tahun</translation> - </message> <message> <source>Confirm Remove</source> <translation>Konfirmasi Buang</translation> @@ -836,12 +1289,28 @@ Apakah Anda ingin tetap menyimpannya?</translation> <translation>Apakah Anda yakin ingin membuang atribut ini?</translation> </message> <message> - <source>[PROTECTED] Press reveal to view or edit</source> - <translation>[DILINDUNGI] Tekan tampilkan untuk meninjau atau mnyunting</translation> + <source>[PROTECTED]</source> + <translation type="unfinished"/> </message> <message> - <source>Are you sure you want to remove this attachment?</source> - <translation>Apakah Anda yakin ingin membuang lampiran ini?</translation> + <source>Press reveal to view or edit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Tomorrow</source> + <translation>Besok</translation> + </message> + <message numerus="yes"> + <source>%n week(s)</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source>%n month(s)</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <source>1 year</source> + <translation>1 tahun</translation> </message> </context> <context> @@ -858,18 +1327,6 @@ Apakah Anda ingin tetap menyimpannya?</translation> <source>Remove</source> <translation>Buang</translation> </message> - <message> - <source>Attachments</source> - <translation>Lampiran</translation> - </message> - <message> - <source>Save</source> - <translation>Simpan</translation> - </message> - <message> - <source>Open</source> - <translation>Buka</translation> - </message> <message> <source>Edit Name</source> <translation>Sunting Nama</translation> @@ -882,6 +1339,10 @@ Apakah Anda ingin tetap menyimpannya?</translation> <source>Reveal</source> <translation>Tampilkan</translation> </message> + <message> + <source>Attachments</source> + <translation>Lampiran</translation> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -889,6 +1350,18 @@ Apakah Anda ingin tetap menyimpannya?</translation> <source>Enable Auto-Type for this entry</source> <translation>Aktifkan Ketik-Otomatis untuk entri ini</translation> </message> + <message> + <source>Inherit default Auto-Type sequence from the &group</source> + <translation>Ikuti urutan Ketik-Otomatis bawaan &grup</translation> + </message> + <message> + <source>&Use custom Auto-Type sequence:</source> + <translation>Gunakan &urutan Ketik-Otomatis khusus:</translation> + </message> + <message> + <source>Window Associations</source> + <translation>Asosiasi Jendela</translation> + </message> <message> <source>+</source> <translation>+</translation> @@ -901,14 +1374,6 @@ Apakah Anda ingin tetap menyimpannya?</translation> <source>Window title:</source> <translation>Judul jendela:</translation> </message> - <message> - <source>Inherit default Auto-Type sequence from the &group</source> - <translation>Ikuti urutan Ketik-Otomatis bawaan &grup</translation> - </message> - <message> - <source>&Use custom Auto-Type sequence:</source> - <translation>Gunakan &urutan Ketik-Otomatis khusus:</translation> - </message> <message> <source>Use default se&quence</source> <translation>Gunakan uru&tan bawaan</translation> @@ -917,10 +1382,6 @@ Apakah Anda ingin tetap menyimpannya?</translation> <source>Set custo&m sequence:</source> <translation>Tetapkan urutan &khusus:</translation> </message> - <message> - <source>Window Associations</source> - <translation>Asosiasi Jendela</translation> - </message> </context> <context> <name>EditEntryWidgetHistory</name> @@ -944,12 +1405,8 @@ Apakah Anda ingin tetap menyimpannya?</translation> <context> <name>EditEntryWidgetMain</name> <message> - <source>Title:</source> - <translation>Judul:</translation> - </message> - <message> - <source>Username:</source> - <translation>Nama pengguna:</translation> + <source>URL:</source> + <translation>URL:</translation> </message> <message> <source>Password:</source> @@ -960,20 +1417,104 @@ Apakah Anda ingin tetap menyimpannya?</translation> <translation>Ulangi:</translation> </message> <message> - <source>URL:</source> - <translation>URL:</translation> + <source>Title:</source> + <translation>Judul:</translation> </message> <message> - <source>Expires</source> - <translation>Kedaluwarsa</translation> + <source>Notes</source> + <translation>Catatan</translation> </message> <message> <source>Presets</source> <translation>Prasetel</translation> </message> <message> - <source>Notes:</source> - <translation>Catatan:</translation> + <source>Toggle the checkbox to reveal the notes section.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username:</source> + <translation>Nama pengguna:</translation> + </message> + <message> + <source>Expires</source> + <translation>Kedaluwarsa</translation> + </message> +</context> +<context> + <name>EditEntryWidgetSSHAgent</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent after</source> + <translation type="unfinished"/> + </message> + <message> + <source> seconds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fingerprint</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent when database is closed/locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add key to agent when database is opened/unlocked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Comment</source> + <translation type="unfinished"/> + </message> + <message> + <source>Decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy to clipboard</source> + <translation>Salin ke papan klip</translation> + </message> + <message> + <source>Private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>External file</source> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Attachment</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add to agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove from agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Require user confirmation when this key is used</source> + <translation type="unfinished"/> </message> </context> <context> @@ -1044,6 +1585,14 @@ Apakah Anda ingin tetap menyimpannya?</translation> </context> <context> <name>EditWidgetIcons</name> + <message> + <source>&Use default icon</source> + <translation>G&unakan ikon bawaan</translation> + </message> + <message> + <source>Use custo&m icon</source> + <translation>Gunakan ikon &khusus</translation> + </message> <message> <source>Add custom icon</source> <translation>Tambah ikon khusus</translation> @@ -1052,18 +1601,6 @@ Apakah Anda ingin tetap menyimpannya?</translation> <source>Delete custom icon</source> <translation>Hapus ikon khusus</translation> </message> - <message> - <source>Images</source> - <translation>Gambar</translation> - </message> - <message> - <source>All files</source> - <translation>Semua berkas</translation> - </message> - <message> - <source>Select Image</source> - <translation>Pilih gambar</translation> - </message> <message> <source>Download favicon</source> <translation>Unduh favicon</translation> @@ -1072,17 +1609,29 @@ Apakah Anda ingin tetap menyimpannya?</translation> <source>Unable to fetch favicon.</source> <translation>Tidak bisa mengunduh favicon.</translation> </message> + <message> + <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> + <translation>Petunjuk: Anda bisa mengaktifkan Google sebagai cadangan di Perkakas>Pengaturan>Keamanan</translation> + </message> + <message> + <source>Images</source> + <translation>Gambar</translation> + </message> + <message> + <source>All files</source> + <translation>Semua Berkas</translation> + </message> + <message> + <source>Select Image</source> + <translation>Pilih gambar</translation> + </message> <message> <source>Can't read icon</source> <translation>Tidak bisa membaca ikon</translation> </message> <message> - <source>&Use default icon</source> - <translation>G&unakan ikon bawaan</translation> - </message> - <message> - <source>Use custo&m icon</source> - <translation>Gunakan ikon &khusus</translation> + <source>Custom icon already exists</source> + <translation type="unfinished"/> </message> <message> <source>Confirm Delete</source> @@ -1092,14 +1641,6 @@ Apakah Anda ingin tetap menyimpannya?</translation> <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> <translation>Ikon ini digunakan oleh %1 entri, dan akan diganti oleh ikon bawaan. Apakah Anda yakin ingin menghapusnya?</translation> </message> - <message> - <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation>Petunjuk: Anda bisa mengaktifkan Google sebagai cadangan di Perkakas>Pengaturan>Keamanan</translation> - </message> - <message> - <source>Custom icon already exists</source> - <translation type="unfinished"/> - </message> </context> <context> <name>EditWidgetProperties</name> @@ -1124,9 +1665,93 @@ Apakah Anda ingin tetap menyimpannya?</translation> <name>Entry</name> <message> <source> - Clone</source> + <comment>Suffix added to cloned entries</comment> <translation> - Salinan</translation> </message> </context> +<context> + <name>EntryAttachmentsModel</name> + <message> + <source>Name</source> + <translation>Nama</translation> + </message> + <message> + <source>Size</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EntryAttachmentsWidget</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add</source> + <translation>Tambah</translation> + </message> + <message> + <source>Remove</source> + <translation>Buang</translation> + </message> + <message> + <source>Open</source> + <translation>Buka</translation> + </message> + <message> + <source>Save</source> + <translation>Simpan</translation> + </message> + <message> + <source>Select files</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <source>Are you sure you want to remove %n attachment(s)?</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>Konfirmasi Buang</translation> + </message> + <message> + <source>Save attachments</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to create directory: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Confirm overwrite</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to save attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachment: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open files: +%1</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EntryAttributesModel</name> <message> @@ -1155,6 +1780,11 @@ Apakah Anda ingin tetap menyimpannya?</translation> </context> <context> <name>EntryModel</name> + <message> + <source>Ref: </source> + <comment>Reference abbreviation</comment> + <translation>Ref: </translation> + </message> <message> <source>Group</source> <translation>Grup</translation> @@ -1171,11 +1801,6 @@ Apakah Anda ingin tetap menyimpannya?</translation> <source>URL</source> <translation>URL</translation> </message> - <message> - <source>Ref: </source> - <comment>Reference abbreviation</comment> - <translation>Ref: </translation> - </message> </context> <context> <name>Group</name> @@ -1184,6 +1809,17 @@ Apakah Anda ingin tetap menyimpannya?</translation> <translation>Tong Sampah</translation> </message> </context> +<context> + <name>HostInstaller</name> + <message> + <source>KeePassXC: Cannot save file!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot save the native messaging script file.</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>HttpPasswordGeneratorWidget</name> <message> @@ -1246,6 +1882,361 @@ Apakah Anda ingin tetap menyimpannya?</translation> <translation>Tutup pesan</translation> </message> </context> +<context> + <name>Kdbx3Reader</name> + <message> + <source>Unable to calculate master key</source> + <translation>Tidak bisa mengkalkulasi kunci utama</translation> + </message> + <message> + <source>Unable to issue challenge-response.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>Kunci salah atau berkas basis data rusak.</translation> + </message> +</context> +<context> + <name>Kdbx3Writer</name> + <message> + <source>Unable to issue challenge-response.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Tidak bisa mengkalkulasi kunci utama</translation> + </message> +</context> +<context> + <name>Kdbx4Reader</name> + <message> + <source>missing database headers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Tidak bisa mengkalkulasi kunci utama</translation> + </message> + <message> + <source>Invalid header checksum size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Header SHA256 mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header data length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open buffer for KDF parameters in header</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported key derivation function (KDF) or invalid parameters</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy header fields found in KDBX4 file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header binary size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass variant map version.</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name data</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value data</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Bool entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry type</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map field type size</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Kdbx4Writer</name> + <message> + <source>Invalid symmetric cipher algorithm.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid symmetric cipher IV size.</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Tidak bisa mengkalkulasi kunci utama</translation> + </message> + <message> + <source>Failed to serialize KDF parameters variant map</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxReader</name> + <message> + <source>Invalid cipher uuid length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid compression flags length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported compression algorithm</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid master seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform rounds size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid start bytes size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid random stream id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner random stream cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>Bukan basis data KeePass.</translation> + </message> + <message> + <source>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> + <translation>Berkas yang dipilih adalah basis data lama KeePass 1 (.kdb). + +Anda bisa mengimpornya dengan mengklik Basis Data > 'Impor basis data KeePass 1...'. +Ini adalah migrasi satu arah. Anda tidak akan bisa membuka basis data yang diimpor dengan versi lama KeePassX 0.4.</translation> + </message> + <message> + <source>Unsupported KeePass 2 database version.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxXmlReader</name> + <message> + <source>XML parsing failure: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>No root group</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing icon uuid or data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing custom data key or value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Multiple group elements</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null group uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableAutoType value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableSearching value</source> + <translation type="unfinished"/> + </message> + <message> + <source>No group uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null DeleteObject uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing DeletedObject uuid or time</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null entry uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element in history entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>No entry uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element with different uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decrypt entry string</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate custom attribute found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry string key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate attachment found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry binary key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-type association window or sequence missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid bool value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid date time value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color rgb part</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid uuid value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decompress binary</source> + <extracomment>Translator meant is a binary data inside an entry</extracomment> + <translation type="unfinished"/> + </message> +</context> <context> <name>KeePass1OpenWidget</name> <message> @@ -1275,6 +2266,35 @@ Apakah Anda ingin tetap menyimpannya?</translation> <source>Unsupported KeePass database version.</source> <translation>Versi basis data KeePass tidak didukung.</translation> </message> + <message> + <source>Unable to read encryption IV</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of groups</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid content hash size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of transform rounds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to construct group tree</source> + <translation type="unfinished"/> + </message> <message> <source>Root</source> <translation>Root</translation> @@ -1287,60 +2307,104 @@ Apakah Anda ingin tetap menyimpannya?</translation> <source>Wrong key or database file is corrupt.</source> <translation>Kunci salah atau berkas basis data rusak.</translation> </message> -</context> -<context> - <name>KeePass2Reader</name> <message> - <source>Not a KeePass database.</source> - <translation>Bukan basis data KeePass.</translation> - </message> - <message> - <source>Unsupported KeePass database version.</source> - <translation>Versi basis data KeePass tidak didukung.</translation> - </message> - <message> - <source>Wrong key or database file is corrupt.</source> - <translation>Kunci salah atau berkas basis data rusak.</translation> - </message> - <message> - <source>Unable to calculate master key</source> - <translation>Tidak bisa mengkalkulasi kunci utama</translation> - </message> - <message> - <source>Unable to issue challenge-response.</source> + <source>Key transformation failed</source> <translation type="unfinished"/> </message> <message> - <source>The selected file is an old KeePass 1 database (.kdb). - -You can import it by clicking on Database > 'Import KeePass 1 database...'. -This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> - <translation>Berkas yang dipilih adalah basis data lama KeePass 1 (.kdb). - -Anda bisa mengimpornya dengan mengklik Basis Data > 'Impor basis data KeePass 1...'. -Ini adalah migrasi satu arah. Anda tidak akan bisa membuka basis data yang diimpor dengan versi lama KeePassX 0.4.</translation> - </message> -</context> -<context> - <name>KeePass2Writer</name> - <message> - <source>Unable to issue challenge-response.</source> + <source>Invalid group field type number</source> <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>Tidak bisa mengkalkulasi kunci utama</translation> + <source>Invalid group field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read group field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group access time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group level field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing group id or level</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing entry field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read entry field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry uuid field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field type</source> + <translation type="unfinished"/> </message> </context> <context> <name>Main</name> <message> - <source>Fatal error while testing the cryptographic functions.</source> - <translation>Galat saat menguji fungsi kriptografi.</translation> - </message> - <message> - <source>KeePassXC - Error</source> - <translation>KeePassXC - Galat</translation> + <source>Existing single-instance lock file is invalid. Launching new instance.</source> + <translation type="unfinished"/> </message> <message> <source>The lock file could not be created. Single-instance mode disabled.</source> @@ -1351,64 +2415,32 @@ Ini adalah migrasi satu arah. Anda tidak akan bisa membuka basis data yang diimp <translation>Aplikasi KeePassXC lainnya sudah berjalan.</translation> </message> <message> - <source>Existing single-instance lock file is invalid. Launching new instance.</source> - <translation type="unfinished"/> + <source>Fatal error while testing the cryptographic functions.</source> + <translation>Galat saat menguji fungsi kriptografi.</translation> + </message> + <message> + <source>KeePassXC - Error</source> + <translation>KeePassXC - Galat</translation> </message> </context> <context> <name>MainWindow</name> <message> - <source>Open database</source> - <translation>Buka basis data</translation> - </message> - <message> - <source>Database settings</source> - <translation>Pengaturan basis data</translation> - </message> - <message> - <source>Copy username to clipboard</source> - <translation>Salin nama pengguna ke papan klip</translation> - </message> - <message> - <source>Copy password to clipboard</source> - <translation>Salin sandi ke papan klip</translation> - </message> - <message> - <source>Settings</source> - <translation>Pengaturan</translation> - </message> - <message> - <source>Show toolbar</source> - <translation>Tampilkan bilah alat</translation> - </message> - <message> - <source>read-only</source> - <translation>baca-saja</translation> - </message> - <message> - <source>Toggle window</source> - <translation>Jungkit jendela</translation> - </message> - <message> - <source>KeePass 2 Database</source> - <translation>Basis Data KeePass 2</translation> - </message> - <message> - <source>All files</source> - <translation>Semua Berkas</translation> - </message> - <message> - <source>Save repaired database</source> - <translation>Simpan basis data yang sudah diperbaiki</translation> - </message> - <message> - <source>Writing the database failed.</source> - <translation>Gagal menyimpan basis data.</translation> + <source>&Database</source> + <translation>Basis &data</translation> </message> <message> <source>&Recent databases</source> <translation>Basis data ba&ru-baru ini</translation> </message> + <message> + <source>Import</source> + <translation>Impor</translation> + </message> + <message> + <source>&Help</source> + <translation>&Bantuan</translation> + </message> <message> <source>E&ntries</source> <translation>E&ntri</translation> @@ -1417,13 +2449,17 @@ Ini adalah migrasi satu arah. Anda tidak akan bisa membuka basis data yang diimp <source>Copy att&ribute to clipboard</source> <translation>Salin at&ribut ke papan klip</translation> </message> + <message> + <source>Time-based one-time password</source> + <translation type="unfinished"/> + </message> <message> <source>&Groups</source> <translation>&Grup</translation> </message> <message> - <source>&View</source> - <translation>&Tampilan</translation> + <source>&Tools</source> + <translation>&Perkakas</translation> </message> <message> <source>&Quit</source> @@ -1433,6 +2469,10 @@ Ini adalah migrasi satu arah. Anda tidak akan bisa membuka basis data yang diimp <source>&About</source> <translation>&Tentang</translation> </message> + <message> + <source>&Open database...</source> + <translation>&Buka basis data...</translation> + </message> <message> <source>&Save database</source> <translation>&Simpan basis data</translation> @@ -1473,26 +2513,26 @@ Ini adalah migrasi satu arah. Anda tidak akan bisa membuka basis data yang diimp <source>&Delete group</source> <translation>&Hapus grup</translation> </message> + <message> + <source>Sa&ve database as...</source> + <translation>&Simpan basis data sebagai...</translation> + </message> + <message> + <source>Change &master key...</source> + <translation>Ubah kunci &utama...</translation> + </message> <message> <source>&Database settings</source> <translation>Pengaturan &basis data</translation> </message> + <message> + <source>Database settings</source> + <translation>Pengaturan basis data</translation> + </message> <message> <source>&Clone entry</source> <translation>&Gandakan entri</translation> </message> - <message> - <source>Timed one-time password</source> - <translation type="unfinished"/> - </message> - <message> - <source>Copy &TOTP</source> - <translation>Salin &TOTP</translation> - </message> - <message> - <source>Show TOTP</source> - <translation>Tampilkan TOTP</translation> - </message> <message> <source>&Find</source> <translation>&Temukan</translation> @@ -1501,14 +2541,26 @@ Ini adalah migrasi satu arah. Anda tidak akan bisa membuka basis data yang diimp <source>Copy &username</source> <translation>Salin &nama pengguna</translation> </message> + <message> + <source>Copy username to clipboard</source> + <translation>Salin nama pengguna ke papan klip</translation> + </message> <message> <source>Cop&y password</source> <translation>Salin &sandi</translation> </message> + <message> + <source>Copy password to clipboard</source> + <translation>Salin sandi ke papan klip</translation> + </message> <message> <source>&Settings</source> <translation>&Pengaturan</translation> </message> + <message> + <source>Password Generator</source> + <translation>Pembuat Sandi</translation> + </message> <message> <source>&Perform Auto-Type</source> <translation>Jalankan &Ketik-Otomatis</translation> @@ -1525,65 +2577,25 @@ Ini adalah migrasi satu arah. Anda tidak akan bisa membuka basis data yang diimp <source>&Title</source> <translation>&Judul</translation> </message> + <message> + <source>Copy title to clipboard</source> + <translation type="unfinished"/> + </message> <message> <source>&URL</source> <translation>&URL</translation> </message> + <message> + <source>Copy URL to clipboard</source> + <translation type="unfinished"/> + </message> <message> <source>&Notes</source> <translation>&Catatan</translation> </message> <message> - <source>Password Generator</source> - <translation>Pembuat Sandi</translation> - </message> - <message> - <source>Clear history</source> - <translation>Bersihkan riwayat</translation> - </message> - <message> - <source>&Database</source> - <translation>Basis &data</translation> - </message> - <message> - <source>Import</source> - <translation>Impor</translation> - </message> - <message> - <source>&Tools</source> - <translation>&Perkakas</translation> - </message> - <message> - <source>Empty recycle bin</source> - <translation>Kosongkan keranjang sampah</translation> - </message> - <message> - <source>Access error for config file %1</source> - <translation>Galat akses untuk berkas konfigurasi %1</translation> - </message> - <message> - <source>Quit KeePassXC</source> - <translation>Keluar KeePassXC</translation> - </message> - <message> - <source>Please touch the button on your YubiKey!</source> - <translation>Silakan sentuh tombol pada YubiKey Anda!</translation> - </message> - <message> - <source>&Help</source> - <translation>&Bantuan</translation> - </message> - <message> - <source>&Open database...</source> - <translation>&Buka basis data...</translation> - </message> - <message> - <source>Sa&ve database as...</source> - <translation>&Simpan basis data sebagai...</translation> - </message> - <message> - <source>Change &master key...</source> - <translation>Ubah kunci &utama...</translation> + <source>Copy notes to clipboard</source> + <translation type="unfinished"/> </message> <message> <source>&Export to CSV file...</source> @@ -1601,10 +2613,169 @@ Ini adalah migrasi satu arah. Anda tidak akan bisa membuka basis data yang diimp <source>Re&pair database...</source> <translation>Per&baiki basis data...</translation> </message> + <message> + <source>Show TOTP</source> + <translation>Tampilkan TOTP</translation> + </message> <message> <source>Set up TOTP...</source> <translation>Siapkan TOTP...</translation> </message> + <message> + <source>Copy &TOTP</source> + <translation>Salin &TOTP</translation> + </message> + <message> + <source>E&mpty recycle bin</source> + <translation type="unfinished"/> + </message> + <message> + <source>Clear history</source> + <translation>Bersihkan riwayat</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation>Galat akses untuk berkas konfigurasi %1</translation> + </message> + <message> + <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> + <translation type="unfinished"/> + </message> + <message> + <source>read-only</source> + <translation>baca-saja</translation> + </message> + <message> + <source>Settings</source> + <translation>Pengaturan</translation> + </message> + <message> + <source>Toggle window</source> + <translation>Jungkit jendela</translation> + </message> + <message> + <source>Quit KeePassXC</source> + <translation>Keluar KeePassXC</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>Basis Data KeePass 2</translation> + </message> + <message> + <source>All files</source> + <translation>Semua Berkas</translation> + </message> + <message> + <source>Open database</source> + <translation>Buka basis data</translation> + </message> + <message> + <source>Save repaired database</source> + <translation>Simpan basis data yang sudah diperbaiki</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>Gagal menyimpan basis data.</translation> + </message> + <message> + <source>Please touch the button on your YubiKey!</source> + <translation>Silakan sentuh tombol pada YubiKey Anda!</translation> + </message> +</context> +<context> + <name>OpenSSHKey</name> + <message> + <source>Invalid key file, expecting an OpenSSH key</source> + <translation type="unfinished"/> + </message> + <message> + <source>PEM boundary mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>This is not an OpenSSH key, only modern keys are supported</source> + <translation type="unfinished"/> + </message> + <message> + <source>Base64 decoding failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file way too small.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file magic header id invalid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Found zero keys</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to read public key.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Corrupted key file, reading private key failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>No private key payload to decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Trying to run KDF without cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Passphrase is required to decrypt this key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key derivation failed, key file corrupted?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Decryption failed, wrong passphrase?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write public key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write private key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing private key</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OptionDialog</name> @@ -1612,22 +2783,63 @@ Ini adalah migrasi satu arah. Anda tidak akan bisa membuka basis data yang diimp <source>Dialog</source> <translation type="unfinished"/> </message> + <message> + <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation>Ini dibutuhkan untuk mengakses basis data Anda dari ChromeIPass atau PassIFox</translation> + </message> + <message> + <source>Enable KeePassHTTP server</source> + <translation>Aktifkan server KeePassHTTP</translation> + </message> <message> <source>General</source> <translation>Umum</translation> </message> <message> <source>Sh&ow a notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> <translation>&Tampilkan notifikasi ketika ada permintaan kredensial</translation> </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return only best matching entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>&Minta untuk membuka basis data jika terkunci</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Match URL schemes</source> + <translation>&Cocok skema URL</translation> + </message> <message> <source>Sort matching entries by &username</source> <translation>Urutkan entri yang cocok berdasarkan &nama pengguna</translation> </message> + <message> + <source>Sort &matching entries by title</source> + <translation>Urutkan entri yang cocok berdasarkan &judul</translation> + </message> + <message> + <source>R&emove all shared encryption keys from active database</source> + <translation>&Buang semua kunci enkripsi bersama dari basis data aktif</translation> + </message> <message> <source>Re&move all stored permissions from entries in active database</source> <translation>&Buang semua izin yang tersimpan dari entri di dalam basis data aktif</translation> </message> + <message> + <source>Password Generator</source> + <translation>Pembuat Sandi</translation> + </message> <message> <source>Advanced</source> <translation>Tingkat Lanjut</translation> @@ -1640,10 +2852,22 @@ Ini adalah migrasi satu arah. Anda tidak akan bisa membuka basis data yang diimp <source>Always allow &updating entries</source> <translation>Selalu izinkan pembar&uan entri</translation> </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation type="unfinished"/> + </message> <message> <source>Searc&h in all opened databases for matching entries</source> <translation>&Cari di dalam semua basis data yang terbuka untuk entri yang cocok</translation> </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>Membuat atau memperbarui ruas lema secara otomatis tidak didukung.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation type="unfinished"/> + </message> <message> <source>HTTP Port:</source> <translation>Port HTTP:</translation> @@ -1652,18 +2876,18 @@ Ini adalah migrasi satu arah. Anda tidak akan bisa membuka basis data yang diimp <source>Default port: 19455</source> <translation>Port bawaan: 19455</translation> </message> - <message> - <source>Re&quest to unlock the database if it is locked</source> - <translation>&Minta untuk membuka basis data jika terkunci</translation> - </message> - <message> - <source>Sort &matching entries by title</source> - <translation>Urutkan entri yang cocok berdasarkan &judul</translation> - </message> <message> <source>KeePassXC will listen to this port on 127.0.0.1</source> <translation>KeePassXC akan mendengarkan port ini pada 127.0.0.1</translation> </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> + <translation type="unfinished"/> + </message> <message> <source>Cannot bind to privileged ports</source> <translation type="unfinished"/> @@ -1673,63 +2897,30 @@ Ini adalah migrasi satu arah. Anda tidak akan bisa membuka basis data yang diimp Using default port 19455.</source> <translation type="unfinished"/> </message> - <message> - <source>R&emove all shared encryption keys from active database</source> - <translation>&Buang semua kunci enkripsi bersama dari basis data aktif</translation> - </message> - <message> - <source>&Return advanced string fields which start with "KPH: "</source> - <translation type="unfinished"/> - </message> - <message> - <source>Automatically creating or updating string fields is not supported.</source> - <translation>Membuat atau memperbarui ruas lema secara otomatis tidak didukung.</translation> - </message> - <message> - <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> - <translation>Ini dibutuhkan untuk mengakses basis data Anda dari ChromeIPass atau PassIFox</translation> - </message> - <message> - <source>Enable KeePassHTTP server</source> - <translation>Aktifkan server KeePassHTTP</translation> - </message> - <message> - <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Return only best matching entries</source> - <translation type="unfinished"/> - </message> - <message> - <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Match URL schemes</source> - <translation>&Cocok skema URL</translation> - </message> - <message> - <source>Password Generator</source> - <translation>Pembuat Sandi</translation> - </message> - <message> - <source>Only the selected database has to be connected with a client.</source> - <translation type="unfinished"/> - </message> - <message> - <source>The following options can be dangerous! -Change them only if you know what you are doing.</source> - <translation>Opsi berikut bisa sangat berbahaya! -Hanya ubah jika Anda tahu apa yang Anda lakukan.</translation> - </message> </context> <context> <name>PasswordGeneratorWidget</name> + <message> + <source>%p%</source> + <translation>%p%</translation> + </message> <message> <source>Password:</source> <translation>Sandi:</translation> </message> + <message> + <source>strength</source> + <comment>Password strength</comment> + <translation>kekuatan</translation> + </message> + <message> + <source>entropy</source> + <translation>entropi</translation> + </message> + <message> + <source>Password</source> + <translation>Sandi</translation> + </message> <message> <source>Character Types</source> <translation>Tipe Karakter</translation> @@ -1750,38 +2941,50 @@ Hanya ubah jika Anda tahu apa yang Anda lakukan.</translation> <source>Special Characters</source> <translation>Karakter Spesial</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>ASCII Lanjutan</translation> + </message> <message> <source>Exclude look-alike characters</source> <translation>Kecualikan karakter mirip</translation> </message> - <message> - <source>Accept</source> - <translation>Terima</translation> - </message> - <message> - <source>%p%</source> - <translation>%p%</translation> - </message> - <message> - <source>strength</source> - <translation>kekuatan</translation> - </message> - <message> - <source>entropy</source> - <translation>entropi</translation> - </message> - <message> - <source>&Length:</source> - <translation>&Panjang:</translation> - </message> <message> <source>Pick characters from every group</source> <translation>Pilih karakter dari setiap grup</translation> </message> + <message> + <source>&Length:</source> + <translation>&Panjang:</translation> + </message> + <message> + <source>Passphrase</source> + <translation>Frasa Sandi</translation> + </message> + <message> + <source>Wordlist:</source> + <translation>Daftar Kata:</translation> + </message> + <message> + <source>Word Count:</source> + <translation>Jumlah Kata:</translation> + </message> + <message> + <source>Word Separator:</source> + <translation>Pemisah Kata:</translation> + </message> <message> <source>Generate</source> <translation>Buat</translation> </message> + <message> + <source>Copy</source> + <translation>Salin</translation> + </message> + <message> + <source>Accept</source> + <translation>Terima</translation> + </message> <message> <source>Close</source> <translation>Tutup</translation> @@ -1800,51 +3003,270 @@ Hanya ubah jika Anda tahu apa yang Anda lakukan.</translation> </message> <message> <source>Poor</source> + <comment>Password quality</comment> <translation>Buruk</translation> </message> <message> <source>Weak</source> + <comment>Password quality</comment> <translation>Lemah</translation> </message> <message> <source>Good</source> + <comment>Password quality</comment> <translation>Baik</translation> </message> <message> <source>Excellent</source> + <comment>Password quality</comment> <translation>Sempurna</translation> </message> - <message> - <source>Password</source> - <translation>Sandi</translation> - </message> - <message> - <source>Extended ASCII</source> - <translation>ASCII Lanjutan</translation> - </message> - <message> - <source>Passphrase</source> - <translation>Frasa Sandi</translation> - </message> - <message> - <source>Wordlist:</source> - <translation>Daftar Kata:</translation> - </message> - <message> - <source>Word Count:</source> - <translation>Jumlah Kata:</translation> - </message> - <message> - <source>Word Separator:</source> - <translation>Pemisah Kata:</translation> - </message> - <message> - <source>Copy</source> - <translation>Salin</translation> - </message> </context> <context> <name>QObject</name> + <message> + <source>Database not opened</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database hash not available</source> + <translation type="unfinished"/> + </message> + <message> + <source>Client public key not received</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot decrypt message</source> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout or cannot connect to KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>Action cancelled or denied</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC association failed, try again</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key change was not successful</source> + <translation type="unfinished"/> + </message> + <message> + <source>Encryption key is not recognized</source> + <translation type="unfinished"/> + </message> + <message> + <source>No saved databases found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect action</source> + <translation type="unfinished"/> + </message> + <message> + <source>Empty message received</source> + <translation type="unfinished"/> + </message> + <message> + <source>No URL provided</source> + <translation type="unfinished"/> + </message> + <message> + <source>No logins found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown error</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add a new entry to a database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>Jalur ke basis data.</translation> + </message> + <message> + <source>Key file of the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>path</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>username</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Prompt for the entry's password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a password for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length for the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to add.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy an entry's password to the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to clip.</source> + <comment>clip = copy to clipboard</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout in seconds before clearing the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Edit an entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Title for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>title</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to edit.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Estimate the entropy of a password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password for which to estimate the entropy.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Perform advanced analysis on the password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Extract and print the content of a database.</source> + <translation>Ekstrak dan tampilkan isi basis data.</translation> + </message> + <message> + <source>Path of the database to extract.</source> + <translation>Jalur basis data untuk diekstrak.</translation> + </message> + <message> + <source>Insert password to unlock %1: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to load key file %1 : %2</source> + <translation type="unfinished"/> + </message> + <message> + <source>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source> + +Available commands: +</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the command to execute.</source> + <translation>Nama perintah untuk dijalankan.</translation> + </message> + <message> + <source>List database entries.</source> + <translation>Daftar entri basis data.</translation> + </message> + <message> + <source>Path of the group to list. Default is /</source> + <translation>Jalur grup untuk ditampilkan. Bawaan adalah /</translation> + </message> + <message> + <source>Find entries quickly.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Search term.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Merge two databases.</source> + <translation>Gabungkan dua basis data.</translation> + </message> + <message> + <source>Path of the database to merge into.</source> + <translation>Jalur tujuan basis data untuk digabungkan.</translation> + </message> + <message> + <source>Path of the database to merge from.</source> + <translation>Jalur sumber basis data untuk digabungkan.</translation> + </message> + <message> + <source>Use the same credentials for both database files.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file of the database to merge from.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show an entry's information.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> + <translation type="unfinished"/> + </message> + <message> + <source>attribute</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the entry to show.</source> + <translation>Nama entri untuk ditampilkan.</translation> + </message> <message> <source>NULL device</source> <translation>Perangkat NULL</translation> @@ -1868,7 +3290,27 @@ Hanya ubah jika Anda tahu apa yang Anda lakukan.</translation> <translation>kehilangan tanda kutip tutup</translation> </message> <message> - <source>INTERNAL - unget lower bound exceeded</source> + <source>AES: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Twofish: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>ChaCha20: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Argon2 (KDBX 4 – recommended)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 4)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 3.1)</source> <translation type="unfinished"/> </message> <message> @@ -1887,14 +3329,22 @@ Hanya ubah jika Anda tahu apa yang Anda lakukan.</translation> <source>Password</source> <translation>Sandi</translation> </message> - <message> - <source>URL</source> - <translation>URL</translation> - </message> <message> <source>Notes</source> <translation>Catatan</translation> </message> + <message> + <source>Last Modified</source> + <translation type="unfinished"/> + </message> + <message> + <source>Created</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy Browser Integration</source> + <translation type="unfinished"/> + </message> <message> <source>Browser Integration</source> <translation>Integrasi Peramban</translation> @@ -1911,6 +3361,10 @@ Hanya ubah jika Anda tahu apa yang Anda lakukan.</translation> <source>Passive</source> <translation>Pasif</translation> </message> + <message> + <source>SSH Agent</source> + <translation type="unfinished"/> + </message> </context> <context> <name>QtIOCompressor</name> @@ -1949,8 +3403,8 @@ Hanya ubah jika Anda tahu apa yang Anda lakukan.</translation> <context> <name>SearchWidget</name> <message> - <source>Case Sensitive</source> - <translation>Sensitif Besar Kecil</translation> + <source>Search...</source> + <translation>Cari...</translation> </message> <message> <source>Search</source> @@ -1961,8 +3415,8 @@ Hanya ubah jika Anda tahu apa yang Anda lakukan.</translation> <translation>Bersihkan</translation> </message> <message> - <source>Search...</source> - <translation>Cari...</translation> + <source>Case Sensitive</source> + <translation>Sensitif Besar Kecil</translation> </message> <message> <source>Limit search to selected group</source> @@ -1971,50 +3425,6 @@ Hanya ubah jika Anda tahu apa yang Anda lakukan.</translation> </context> <context> <name>Service</name> - <message> - <source>A shared encryption-key with the name "%1" already exists. -Do you want to overwrite it?</source> - <translation>Kunci enkripsi bersama dengan nama "%1" sudah ada. -Apakah Anda ingin menimpanya?</translation> - </message> - <message> - <source>Do you want to update the information in %1 - %2?</source> - <translation>Apakah Anda ingin memperbarui informasi dalam %1 - %2?</translation> - </message> - <message> - <source>The active database is locked! -Please unlock the selected database or choose another one which is unlocked.</source> - <translation>Basis data aktif dikunci! -Silakan buka kunci atau pilih yang lainnya yang tidak terkunci.</translation> - </message> - <message> - <source>Successfully removed %1 encryption-%2 from KeePassX/Http Settings.</source> - <translation>Berhasil membuang %2-enkripsi %1 dari Pengaturan KeePassX/Http.</translation> - </message> - <message> - <source>No shared encryption-keys found in KeePassHttp Settings.</source> - <translation>Tidak ada kunci-enkripsi bersama yang ditemukan di dalam Pengaturan KeePassHttp.</translation> - </message> - <message> - <source>The active database does not contain an entry of KeePassHttp Settings.</source> - <translation>Basis data aktif tidak berisi entri Pengaturan KeePassHttp.</translation> - </message> - <message> - <source>Removing stored permissions...</source> - <translation>Membuang izin yang tersimpan...</translation> - </message> - <message> - <source>Abort</source> - <translation>Batal</translation> - </message> - <message> - <source>Successfully removed permissions from %1 %2.</source> - <translation>Berhasil membuang izin dari %1 %2.</translation> - </message> - <message> - <source>The active database does not contain an entry with permissions.</source> - <translation>Basis data aktif tidak berisi entri dengan izin.</translation> - </message> <message> <source>KeePassXC: New key association request</source> <translation>KeePassXC: Permintaan asosiasi kunci baru</translation> @@ -2031,34 +3441,78 @@ beri nama yang unik untuk identifikasi dan terimalah.</translation> <source>KeePassXC: Overwrite existing key?</source> <translation>KeePassXC: Timpa kunci yang ada?</translation> </message> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>Kunci enkripsi bersama dengan nama "%1" sudah ada. +Apakah Anda ingin menimpanya?</translation> + </message> <message> <source>KeePassXC: Update Entry</source> <translation>KeePassXC: Perbarui Entri</translation> </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Apakah Anda ingin memperbarui informasi dalam %1 - %2?</translation> + </message> <message> <source>KeePassXC: Database locked!</source> <translation>KeePassXC: Basis data dikunci!</translation> </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>Basis data aktif dikunci! +Silakan buka kunci atau pilih yang lainnya yang tidak terkunci.</translation> + </message> <message> <source>KeePassXC: Removed keys from database</source> <translation>KeePassXC: Buang kunci dari basis data</translation> </message> + <message numerus="yes"> + <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No keys found</source> <translation>KeePassXC: Tidak ada kunci yang ditemukan</translation> </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation>Tidak ada kunci-enkripsi bersama yang ditemukan di dalam Pengaturan KeePassHttp.</translation> + </message> <message> <source>KeePassXC: Settings not available!</source> <translation>KeePassXC: Pengaturan tidak tersedia!</translation> </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation>Basis data aktif tidak berisi entri Pengaturan KeePassHttp.</translation> + </message> + <message> + <source>Removing stored permissions...</source> + <translation>Membuang izin yang tersimpan...</translation> + </message> + <message> + <source>Abort</source> + <translation>Batal</translation> + </message> <message> <source>KeePassXC: Removed permissions</source> <translation>KeePassXC: Buang izin</translation> </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entries.</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No entry with permissions found!</source> <translation>KeePassXC: Tidak entri dengan izin yang ditemukan!</translation> </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>Basis data aktif tidak berisi entri dengan izin.</translation> + </message> </context> <context> <name>SettingsWidget</name> @@ -2081,10 +3535,26 @@ beri nama yang unik untuk identifikasi dan terimalah.</translation> </context> <context> <name>SettingsWidgetGeneral</name> + <message> + <source>Basic Settings</source> + <translation>Pengaturan Dasar</translation> + </message> + <message> + <source>Start only a single instance of KeePassXC</source> + <translation>Hanya mulai satu aplikasi KeePassXC</translation> + </message> <message> <source>Remember last databases</source> <translation>Ingat basis data terakhir</translation> </message> + <message> + <source>Remember last key files and security dongles</source> + <translation>Ingat berkas kunci dan dongle keamanan terakhir</translation> + </message> + <message> + <source>Load previous databases on startup</source> + <translation>Muat basis data sebelumnya saat mulai</translation> + </message> <message> <source>Automatically save on exit</source> <translation>Otomatis simpan ketika keluar</translation> @@ -2093,21 +3563,29 @@ beri nama yang unik untuk identifikasi dan terimalah.</translation> <source>Automatically save after every change</source> <translation>Otomatis simpan setelah setiap perubahan</translation> </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation>Muat ulang basis data secara otomatis ketika diubah secara eksternal</translation> + </message> <message> <source>Minimize when copying to clipboard</source> <translation>Minimalkan ketika menyalin ke papan klip</translation> </message> + <message> + <source>Minimize window at application startup</source> + <translation>Minimalkan jendela saat memulai aplikasi</translation> + </message> <message> <source>Use group icon on entry creation</source> <translation>Gunakan ikon grup pada pembuatan entri</translation> </message> <message> - <source>Global Auto-Type shortcut</source> - <translation>Pintasan global Ketik-Otomatis</translation> + <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> + <translation>Jangan tandai basis data telah diubah untuk perubahan non-data (mis. melebarkan grup)</translation> </message> <message> - <source>Language</source> - <translation>Bahasa</translation> + <source>Hide the Details view</source> + <translation type="unfinished"/> </message> <message> <source>Show a system tray icon</source> @@ -2117,67 +3595,61 @@ beri nama yang unik untuk identifikasi dan terimalah.</translation> <source>Hide window to system tray when minimized</source> <translation>Sembunyikan jendela ke baki sistem ketika diminimalkan</translation> </message> - <message> - <source>Load previous databases on startup</source> - <translation>Muat basis data sebelumnya saat mulai</translation> - </message> - <message> - <source>Automatically reload the database when modified externally</source> - <translation>Muat ulang basis data secara otomatis ketika diubah secara eksternal</translation> - </message> <message> <source>Hide window to system tray instead of app exit</source> <translation>Daripada keluar, sembunyikan jendela ke baki sistem</translation> </message> <message> - <source>Minimize window at application startup</source> - <translation>Minimalkan jendela saat memulai aplikasi</translation> + <source>Dark system tray icon</source> + <translation type="unfinished"/> </message> <message> - <source>Basic Settings</source> - <translation>Pengaturan Dasar</translation> - </message> - <message> - <source>Remember last key files and security dongles</source> - <translation>Ingat berkas kunci dan dongle keamanan terakhir</translation> - </message> - <message> - <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> - <translation>Jangan tandai basis data telah diubah untuk perubahan non-data (mis. melebarkan grup)</translation> + <source>Language</source> + <translation>Bahasa</translation> </message> <message> <source>Auto-Type</source> <translation>Ketik-Otomatis</translation> </message> <message> - <source>Use entry title and URL to match windows for global Auto-Type</source> - <translation>Gunakan pencocokan judul entri dan URL untuk Ketik-Otomatis global</translation> + <source>Use entry title to match windows for global Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use entry URL to match windows for global Auto-Type</source> + <translation type="unfinished"/> </message> <message> <source>Always ask before performing Auto-Type</source> <translation>Selalu bertanya sebelum menjalankan Ketik-Otomatis</translation> </message> + <message> + <source>Global Auto-Type shortcut</source> + <translation>Pintasan global Ketik-Otomatis</translation> + </message> <message> <source>Auto-Type delay</source> <translation>Tundaan Ketik-Otomatis</translation> </message> <message> <source> ms</source> + <comment>Milliseconds</comment> <translation>md</translation> </message> - <message> - <source>Start only a single instance of KeePassXC</source> - <translation>Hanya mulai satu aplikasi KeePassXC</translation> - </message> </context> <context> <name>SettingsWidgetSecurity</name> + <message> + <source>Timeouts</source> + <translation type="unfinished"/> + </message> <message> <source>Clear clipboard after</source> <translation>Kosongkan papan klip setelah</translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation>det</translation> </message> <message> @@ -2185,8 +3657,12 @@ beri nama yang unik untuk identifikasi dan terimalah.</translation> <translation>Kunci basis data setelah tidak aktif selama</translation> </message> <message> - <source>Show passwords in cleartext by default</source> - <translation>Tampilkan teks sandi secara baku</translation> + <source>Convenience</source> + <translation type="unfinished"/> + </message> + <message> + <source>Lock databases when session is locked or lid is closed</source> + <translation>Kunci basis data ketika sesi dikunci atau lid ditutup</translation> </message> <message> <source>Lock databases after minimizing the window</source> @@ -2197,17 +3673,17 @@ beri nama yang unik untuk identifikasi dan terimalah.</translation> <translation>Tidak membutuhkan pengulangan sandi ketika ruas bisa dilihat</translation> </message> <message> - <source>Timeouts</source> + <source>Show passwords in cleartext by default</source> + <translation>Tampilkan teks sandi secara baku</translation> + </message> + <message> + <source>Hide passwords in the preview panel</source> <translation type="unfinished"/> </message> <message> - <source>Convenience</source> + <source>Hide entry notes by default</source> <translation type="unfinished"/> </message> - <message> - <source>Lock databases when session is locked or lid is closed</source> - <translation>Kunci basis data ketika sesi dikunci atau lid ditutup</translation> - </message> <message> <source>Privacy</source> <translation>Privasi</translation> @@ -2227,6 +3703,14 @@ beri nama yang unik untuk identifikasi dan terimalah.</translation> <source>Key:</source> <translation>Kunci:</translation> </message> + <message> + <source>Default RFC 6238 token settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Steam token settings</source> + <translation type="unfinished"/> + </message> <message> <source>Use custom settings</source> <translation>Gunakan pengaturan khusus</translation> @@ -2253,6 +3737,7 @@ beri nama yang unik untuk identifikasi dan terimalah.</translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation>det</translation> </message> </context> @@ -2319,6 +3804,26 @@ beri nama yang unik untuk identifikasi dan terimalah.</translation> </context> <context> <name>main</name> + <message> + <source>Remove an entry from the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>Jalur ke basis data.</translation> + </message> + <message> + <source>Path of the entry to remove.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation>KeePassXC - pengelola sandi lintas platform</translation> + </message> + <message> + <source>filenames of the password databases to open (*.kdbx)</source> + <translation>nama berkas basis data sandi untuk dibuka (*.kdbx)</translation> + </message> <message> <source>path to a custom config file</source> <translation>jalur ke berkas konfigurasi khusus</translation> @@ -2327,81 +3832,13 @@ beri nama yang unik untuk identifikasi dan terimalah.</translation> <source>key file of the database</source> <translation>berkas kunci basis data</translation> </message> - <message> - <source>KeePassXC - cross-platform password manager</source> - <translation>KeePassXC - pengelola sandi lintas platform</translation> - </message> <message> <source>read password of the database from stdin</source> <translation>baca sandi basis data dari stdin</translation> </message> <message> - <source>filenames of the password databases to open (*.kdbx)</source> - <translation>nama berkas basis data sandi untuk dibuka (*.kdbx)</translation> - </message> - <message> - <source>Copy a password to the clipboard</source> - <translation>Salin sandi ke papan klip</translation> - </message> - <message> - <source>Path of the database.</source> - <translation>Jalur ke basis data.</translation> - </message> - <message> - <source>Use a GUI prompt unlocking the database.</source> - <translation>Gunakan tampilan GUI untuk membuka kunci basis data.</translation> - </message> - <message> - <source>Name of the entry to clip.</source> - <translation>Nama entri untuk disalin.</translation> - </message> - <message> - <source>Extract and print the content of a database.</source> - <translation>Ekstrak dan tampilkan isi basis data.</translation> - </message> - <message> - <source>Path of the database to extract.</source> - <translation>Jalur basis data untuk diekstrak.</translation> - </message> - <message> - <source>Name of the command to execute.</source> - <translation>Nama perintah untuk dijalankan.</translation> - </message> - <message> - <source>List database entries.</source> - <translation>Daftar entri basis data.</translation> - </message> - <message> - <source>Path of the group to list. Default is /</source> - <translation>Jalur grup untuk ditampilkan. Bawaan adalah /</translation> - </message> - <message> - <source>Print the UUIDs of the entries and groups.</source> - <translation>Tampilkan UUID entri dan grup.</translation> - </message> - <message> - <source>Merge two databases.</source> - <translation>Gabungkan dua basis data.</translation> - </message> - <message> - <source>Path of the database to merge into.</source> - <translation>Jalur tujuan basis data untuk digabungkan.</translation> - </message> - <message> - <source>Path of the database to merge from.</source> - <translation>Jalur sumber basis data untuk digabungkan.</translation> - </message> - <message> - <source>Use the same password for both database files.</source> - <translation>Gunakan sandi yang sama untuk kedua berkas basis data.</translation> - </message> - <message> - <source>Show a password.</source> - <translation>Tampilkan sandi.</translation> - </message> - <message> - <source>Name of the entry to show.</source> - <translation>Nama entri untuk ditampilkan.</translation> + <source>Parent window handle</source> + <translation type="unfinished"/> </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_it.ts b/share/translations/keepassx_it.ts index 582d18970..280d12b19 100644 --- a/share/translations/keepassx_it.ts +++ b/share/translations/keepassx_it.ts @@ -9,17 +9,37 @@ <source>About</source> <translation>Informazioni</translation> </message> + <message> + <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> + <translation>Segnala eventuali problemi su: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> + </message> + <message> + <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>KeePassXC è distribuito sotto i termini della licenza GNU General Public License (GPL) versione 2 o (come opzione) versione 3.</translation> + </message> + <message> + <source>Project Maintainers:</source> + <translation>Responsabili del progetto:</translation> + </message> <message> <source>Contributors</source> <translation>Collaboratori</translation> </message> + <message> + <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors"> vedere i contributi su GitHub</a></translation> + </message> <message> <source>Debug Info</source> <translation>Informazioni debug</translation> </message> + <message> + <source>Include the following information whenever you report a bug:</source> + <translation>Quando segnali un problema includi le seguenti informazioni:</translation> + </message> <message> <source>Copy to clipboard</source> - <translation>Copia negli Appunti</translation> + <translation>Copia negli appunti</translation> </message> <message> <source>Version %1 @@ -31,6 +51,10 @@ <source>Revision: %1</source> <translation>Revisione: %1</translation> </message> + <message> + <source>Distribution: %1</source> + <translation>Distribuzione: %1</translation> + </message> <message> <source>Libraries:</source> <translation>Librerie:</translation> @@ -47,33 +71,13 @@ Kernel: %3 %4</translation> <source>Enabled extensions:</source> <translation>Estensioni abilitate:</translation> </message> - <message> - <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> - <translation>Segnala eventuali problemi in: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> - </message> - <message> - <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassXC è distribuito sotto i termini della licenza GNU General Public License (GPL) versione 2 o (come opzione) versione 3.</translation> - </message> - <message> - <source>Project Maintainers:</source> - <translation>Manutenzione progetto:</translation> - </message> - <message> - <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors"> vedere i contributi su GitHub</a></translation> - </message> - <message> - <source>Include the following information whenever you report a bug:</source> - <translation>Quando segnali un problema includi le seguenti informazioni:</translation> - </message> - <message> - <source>Distribution: %1</source> - <translation>Distribuzione: %1</translation> - </message> </context> <context> <name>AccessControlDialog</name> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>KeePassXC HTTP conferma accesso</translation> + </message> <message> <source>Remember this decision</source> <translation>Ricorda questa decisione</translation> @@ -89,23 +93,46 @@ Kernel: %3 %4</translation> <message> <source>%1 has requested access to passwords for the following item(s). Please select whether you want to allow access.</source> - <translation>%1 ha richiesto accesso alle passwords per il seguente elemento/i. + <translation>%1 ha richiesto accesso alle password per il seguente elemento/i. Seleziona se vuoi consentire l'accesso.</translation> </message> +</context> +<context> + <name>AgentSettingsWidget</name> <message> - <source>KeePassXC HTTP Confirm Access</source> - <translation>KeePassXC HTTP conferma accesso</translation> + <source>Enable SSH Agent (requires restart)</source> + <translation>Abilita agente SSH (richiede un riavvio)</translation> </message> </context> <context> <name>AutoType</name> <message> <source>Couldn't find an entry that matches the window title:</source> - <translation>Impossibile trovare un elemento che corrisponda al titolo della finestra:</translation> + <translation>Impossibile trovare una voce che corrisponda al titolo della finestra:</translation> </message> <message> <source>Auto-Type - KeePassXC</source> - <translation>Auto completamento - KeePassXC</translation> + <translation>KeePassXC - Completamento automatico</translation> + </message> + <message> + <source>Auto-Type</source> + <translation>Completamento automatico</translation> + </message> + <message> + <source>The Syntax of your Auto-Type statement is incorrect!</source> + <translation>La sintassi del tuo comando di auto-completamento non è corretta!</translation> + </message> + <message> + <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> + <translation>Questo comando di auto-completamento contiene un ritardo molto lungo. Si desidera veramente procedere?</translation> + </message> + <message> + <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> + <translation>Questo comando di auto-completamento contiene pressioni dei tasti molto lente. Si desidera veramente procedere?</translation> + </message> + <message> + <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> + <translation>Questo comando di auto-completamento contiene argomenti che molto spesso si ripetono. Si desidera veramente procedere?</translation> </message> </context> <context> @@ -126,12 +153,289 @@ Seleziona se vuoi consentire l'accesso.</translation> <context> <name>AutoTypeSelectDialog</name> <message> - <source>Select entry to Auto-Type:</source> - <translation>Seleziona un elemento per l'auto completamento:</translation> + <source>Auto-Type - KeePassXC</source> + <translation>KeePassXC - Completamento automatico</translation> </message> <message> - <source>Auto-Type - KeePassXC</source> - <translation>KeePassXC - Auto completamento</translation> + <source>Select entry to Auto-Type:</source> + <translation>Seleziona una voce per il completamento automatico:</translation> + </message> +</context> +<context> + <name>BrowserAccessControlDialog</name> + <message> + <source>KeePassXC-Browser Confirm Access</source> + <translation>KeePassXC-Browser confermare l'accesso</translation> + </message> + <message> + <source>Remember this decision</source> + <translation>Ricorda questa decisione</translation> + </message> + <message> + <source>Allow</source> + <translation>Consenti</translation> + </message> + <message> + <source>Deny</source> + <translation>Nega</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 ha richiesto accesso alle password per il seguente elemento/i. +Seleziona se vuoi consentire l'accesso.</translation> + </message> +</context> +<context> + <name>BrowserOptionDialog</name> + <message> + <source>Dialog</source> + <translation>Finestra</translation> + </message> + <message> + <source>This is required for accessing your databases with KeePassXC-Browser</source> + <translation>Questo è necessario per accedere al tuo database con KeePassXC-Browser</translation> + </message> + <message> + <source>Enable KeepassXC browser integration</source> + <translation>Abilita l'integrazione con i browser di KeepassXC</translation> + </message> + <message> + <source>General</source> + <translation>Generale</translation> + </message> + <message> + <source>Enable integration for these browsers:</source> + <translation>Abilita l'integrazione per i seguenti browser:</translation> + </message> + <message> + <source>&Google Chrome</source> + <translation>&Google Chrome</translation> + </message> + <message> + <source>&Firefox</source> + <translation>&Firefox</translation> + </message> + <message> + <source>&Chromium</source> + <translation>&Chromium</translation> + </message> + <message> + <source>&Vivaldi</source> + <translation>&Vivaldi</translation> + </message> + <message> + <source>Show a &notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Visualizza una &notifica quando sono richieste le credenziali</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Ri&chiedi di sbloccare il database se bloccato</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> + <translation>Vengono restituiti solo voci con lo stesso schema (http://, https://, ...)</translation> + </message> + <message> + <source>&Match URL scheme (e.g., https://...)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>Restituisci solo le corrispondenze migliori per un'URL specifica invece di tutte le voci per l'intero dominio.</translation> + </message> + <message> + <source>&Return only best-matching credentials</source> + <translation type="unfinished"/> + </message> + <message> + <source>Sort &matching credentials by title</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Sort matching credentials by &username</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>&Disconnect all browsers</source> + <translation>&Disconnetti tutti i browser</translation> + </message> + <message> + <source>Forget all remembered &permissions</source> + <translation type="unfinished"/> + </message> + <message> + <source>Advanced</source> + <translation>Avanzate</translation> + </message> + <message> + <source>Never &ask before accessing credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Never ask before &updating credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>Solo il database selezionato deve essere collegato con un client.</translation> + </message> + <message> + <source>Searc&h in all opened databases for matching credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>La creazione o l'aggiornamento automatico dei campi stringa non è supportato.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>&Seleziona i campi stringa avanzati che iniziano con "KPH: "</translation> + </message> + <message> + <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Update &native messaging manifest files at startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Support a proxy application between KeePassXC and browser extension.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &proxy application between KeePassXC and browser extension</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a custom proxy location if you installed a proxy manually.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &custom proxy location</source> + <comment>Meant is the proxy for KeePassXC-Browser</comment> + <translation>Utilizzare una posizione &personalizzata per il proxy</translation> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Sfoglia...</translation> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation><b>Avviso:</b> le seguenti opzioni possono essere pericolose.</translation> + </message> + <message> + <source>Executable Files (*.exe);;All Files (*.*)</source> + <translation>File eseguibili (*.exe);;Tutti i file (*.*)</translation> + </message> + <message> + <source>Executable Files (*)</source> + <translation>File eseguibili (*)</translation> + </message> + <message> + <source>Select custom proxy location</source> + <translation>Selezionare una posizione personalizzata per il proxy</translation> + </message> +</context> +<context> + <name>BrowserService</name> + <message> + <source>KeePassXC: New key association request</source> + <translation>KeePassXC: nuova richiesta di associazione chiave</translation> + </message> + <message> + <source>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Save and allow access</source> + <translation>Salva e permetti l'accesso</translation> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: Vuoi sovrascrivere la chiave esistente?</translation> + </message> + <message> + <source>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: aggiorna voce</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Vuoi aggiornare le informazioni in %1 - %2?</translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: database bloccato!</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>Il database attivo è bloccato! +Sblocca il database selezionato o scegline un altro che sia sbloccato.</translation> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: impostazioni non disponibili!</translation> + </message> + <message> + <source>The active database does not contain a settings entry.</source> + <translation>Il database attivo non contiene una voce per le impostazioni.</translation> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: nessuna chiave trovata</translation> + </message> + <message> + <source>No shared encryption keys found in KeePassXC Settings.</source> + <translation>Nessun chiave condivisa di cifratura è stata trovata nelle impostazioni di KeePassXC.</translation> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: chiavi rimosse dal database</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> + <translation><numerusform>Rimossa con successo %n chiave di cifratura dalle impostazioni di KeePassXC.</numerusform><numerusform>Rimosse con successo %n chiavi di cifratura dalle impostazioni di KeePassXC.</numerusform></translation> + </message> + <message> + <source>Removing stored permissions…</source> + <translation>Rimozione dei permessi salvati...</translation> + </message> + <message> + <source>Abort</source> + <translation>Interrompi</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: permessi rimossi</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entry(s).</source> + <translation><numerusform>Permessi rimossi con successo da %n voce.</numerusform><numerusform>Permessi rimossi con successo da %n voci.</numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation>KeePassXC: nessuna voce con permessi trovata!</translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>Il database attivo non contiene una voce con permessi.</translation> </message> </context> <context> @@ -148,6 +452,10 @@ Seleziona se vuoi consentire l'accesso.</translation> <source>Repeat password:</source> <translation>Ripeti password:</translation> </message> + <message> + <source>&Key file</source> + <translation>&File chiave</translation> + </message> <message> <source>Browse</source> <translation>Sfoglia</translation> @@ -156,6 +464,14 @@ Seleziona se vuoi consentire l'accesso.</translation> <source>Create</source> <translation>Crea</translation> </message> + <message> + <source>Cha&llenge Response</source> + <translation>Risposta di ve&rifica</translation> + </message> + <message> + <source>Refresh</source> + <translation>Aggiorna</translation> + </message> <message> <source>Key files</source> <translation>File chiave</translation> @@ -176,6 +492,10 @@ Seleziona se vuoi consentire l'accesso.</translation> <source>Select a key file</source> <translation>Seleziona un file chiave</translation> </message> + <message> + <source>Empty password</source> + <translation>Password vuota</translation> + </message> <message> <source>Do you really want to use an empty string as password?</source> <translation>Vuoi veramente usare una stringa vuota come password?</translation> @@ -191,24 +511,19 @@ Seleziona se vuoi consentire l'accesso.</translation> %2</translation> </message> <message> - <source>&Key file</source> - <translation>&File chiave</translation> + <source>Legacy key file format</source> + <translation>Formato di file chiave legacy</translation> </message> <message> - <source>Cha&llenge Response</source> - <translation>Risposta di ve&rifica</translation> - </message> - <message> - <source>Refresh</source> - <translation>Aggiorna</translation> - </message> - <message> - <source>Empty password</source> - <translation>Password vuota</translation> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> - <translation>Modifica password principale fallitoa. Nessuna YubiKey inserita.</translation> + <translation>Modifica non riuscita della password principale: nessuna YubiKey inserita.</translation> </message> </context> <context> @@ -217,6 +532,10 @@ Seleziona se vuoi consentire l'accesso.</translation> <source>Clone Options</source> <translation>Opzioni clonazione</translation> </message> + <message> + <source>Append ' - Clone' to title</source> + <translation>Aggiungi ' - Clone' al titolo</translation> + </message> <message> <source>Replace username and password with references</source> <translation>Sostituisci nome utente e password con riferimenti</translation> @@ -225,10 +544,6 @@ Seleziona se vuoi consentire l'accesso.</translation> <source>Copy history</source> <translation>Copia cronologia</translation> </message> - <message> - <source>Append ' - Clone' to title</source> - <translation>Aggiungi '-clone' al titolo</translation> - </message> </context> <context> <name>CsvImportWidget</name> @@ -274,7 +589,7 @@ Seleziona se vuoi consentire l'accesso.</translation> </message> <message> <source>Consider '\' an escape character</source> - <translation>Considera ' \' un carattere escape</translation> + <translation>Considera '\' un carattere escape</translation> </message> <message> <source>Preview</source> @@ -282,7 +597,7 @@ Seleziona se vuoi consentire l'accesso.</translation> </message> <message> <source>Column layout</source> - <translation>Disposizione colonna</translation> + <translation>Disposizione colonne</translation> </message> <message> <source>Not present in CSV file</source> @@ -310,7 +625,7 @@ Seleziona se vuoi consentire l'accesso.</translation> </message> <message> <source> more messages skipped]</source> - <translation> più messaggi ignorati]</translation> + <translation> ulteriori messaggi ignorati]</translation> </message> <message> <source>Error</source> @@ -325,10 +640,6 @@ Seleziona se vuoi consentire l'accesso.</translation> </context> <context> <name>CsvImportWizard</name> - <message> - <source>Import CSV file</source> - <translation>Importa file CSV</translation> - </message> <message> <source>Error</source> <translation>Errore</translation> @@ -340,17 +651,17 @@ Seleziona se vuoi consentire l'accesso.</translation> </context> <context> <name>CsvParserModel</name> - <message> - <source> byte, </source> - <translation> byte, </translation> + <message numerus="yes"> + <source>%n byte(s), </source> + <translation><numerusform>%n byte, </numerusform><numerusform>%n byte, </numerusform></translation> </message> - <message> - <source> rows, </source> - <translation> righe, </translation> + <message numerus="yes"> + <source>%n row(s), </source> + <translation><numerusform>%n riga, </numerusform><numerusform>%n righe, </numerusform></translation> </message> - <message> - <source> columns</source> - <translation> colonne</translation> + <message numerus="yes"> + <source>%n column(s)</source> + <translation><numerusform>%n colonna</numerusform><numerusform>%n colonne</numerusform></translation> </message> </context> <context> @@ -371,6 +682,14 @@ Seleziona se vuoi consentire l'accesso.</translation> <source>Browse</source> <translation>Sfoglia</translation> </message> + <message> + <source>Refresh</source> + <translation>Aggiorna</translation> + </message> + <message> + <source>Challenge Response:</source> + <translation>Risposta di verifica:</translation> + </message> <message> <source>Unable to open the database.</source> <translation>Impossibile aprire il database.</translation> @@ -379,6 +698,21 @@ Seleziona se vuoi consentire l'accesso.</translation> <source>Can't open key file</source> <translation>Impossibile aprire il file chiave</translation> </message> + <message> + <source>Legacy key file format</source> + <translation>Formato di file chiave legacy</translation> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't show this warning again</source> + <translation>Non mostrare nuovamente questo avviso</translation> + </message> <message> <source>All files</source> <translation>Tutti i file</translation> @@ -391,14 +725,6 @@ Seleziona se vuoi consentire l'accesso.</translation> <source>Select key file</source> <translation>Seleziona file chiave</translation> </message> - <message> - <source>Refresh</source> - <translation>Aggiorna</translation> - </message> - <message> - <source>Challenge Response:</source> - <translation>Risposta di verifica:</translation> - </message> </context> <context> <name>DatabaseRepairWidget</name> @@ -414,14 +740,14 @@ Seleziona se vuoi consentire l'accesso.</translation> <source>Can't open key file</source> <translation>Impossibile aprire il file chiave</translation> </message> - <message> - <source>Database opened fine. Nothing to do.</source> - <translation>Database aperto correttamente. Nessuna operazione da eseguire.</translation> - </message> <message> <source>Unable to open the database.</source> <translation>Impossibile aprire il database.</translation> </message> + <message> + <source>Database opened fine. Nothing to do.</source> + <translation>Database aperto correttamente. Nessuna operazione da eseguire.</translation> + </message> <message> <source>Success</source> <translation>Completato</translation> @@ -440,40 +766,57 @@ Adesso puoi salvarlo.</translation> <context> <name>DatabaseSettingsWidget</name> <message> - <source>Database name:</source> - <translation>Nome database:</translation> + <source>General</source> + <translation>Generale</translation> </message> <message> - <source>Database description:</source> - <translation>Descrizione database:</translation> + <source>Encryption</source> + <translation>Cifratura</translation> </message> <message> - <source>Transform rounds:</source> - <translation>Arrotondamenti trasformazione:</translation> + <source>Number of rounds too high</source> + <comment>Key transformation rounds</comment> + <translation>Numero di giri troppo elevato</translation> </message> <message> - <source>Default username:</source> - <translation>Nome utente predefinito:</translation> + <source>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</source> + <translation type="unfinished"/> </message> <message> - <source> MiB</source> - <translation> MB</translation> + <source>Understood, keep number</source> + <translation>D'accordo, mantieni il valore</translation> </message> <message> - <source>Benchmark</source> - <translation>Prestazioni</translation> + <source>Cancel</source> + <translation>Annulla</translation> </message> <message> - <source>Max. history items:</source> - <translation>Oggetti max. nella cronologia:</translation> + <source>Number of rounds too low</source> + <comment>Key transformation rounds</comment> + <translation>Numero di giri troppo basso</translation> </message> <message> - <source>Max. history size:</source> - <translation>Grandezza max. cronologia:</translation> + <source>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</source> + <translation type="unfinished"/> </message> <message> - <source>Use recycle bin</source> - <translation>Usa il Cestino</translation> + <source>KDF unchanged</source> + <translation>KDF invariato</translation> + </message> + <message> + <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetEncryption</name> + <message> + <source>Encryption Algorithm:</source> + <translation>Algoritmo di cifratura:</translation> </message> <message> <source>AES: 256 Bit (default)</source> @@ -484,14 +827,78 @@ Adesso puoi salvarlo.</translation> <translation>Twofish: 256 Bit</translation> </message> <message> - <source>Algorithm:</source> - <translation>Algoritmo:</translation> + <source>Key Derivation Function:</source> + <translation>Funzione di derivazione di chiave:</translation> + </message> + <message> + <source>Transform rounds:</source> + <translation>Arrotondamenti trasformazione:</translation> + </message> + <message> + <source>Benchmark 1-second delay</source> + <translation>Ritardo di 1 secondo di benchmark</translation> + </message> + <message> + <source>Memory Usage:</source> + <translation>Uso della memoria:</translation> + </message> + <message> + <source> MB</source> + <translation> MB</translation> + </message> + <message> + <source>Parallelism:</source> + <translation>Parallelismo:</translation> + </message> + <message> + <source> thread</source> + <translation>thread</translation> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetGeneral</name> + <message> + <source>Database Meta Data</source> + <translation>Metadati del database</translation> + </message> + <message> + <source>Database name:</source> + <translation>Nome database:</translation> + </message> + <message> + <source>Database description:</source> + <translation>Descrizione database:</translation> + </message> + <message> + <source>Default username:</source> + <translation>Nome utente predefinito:</translation> + </message> + <message> + <source>History Settings</source> + <translation>Impostazioni cronologia</translation> + </message> + <message> + <source>Max. history items:</source> + <translation>Oggetti max. nella cronologia:</translation> + </message> + <message> + <source>Max. history size:</source> + <translation>Grandezza max. cronologia:</translation> + </message> + <message> + <source> MiB</source> + <translation> MB</translation> + </message> + <message> + <source>Use recycle bin</source> + <translation>Usa il cestino</translation> </message> </context> <context> <name>DatabaseTabWidget</name> <message> <source>Root</source> + <comment>Root group</comment> <translation>Radice</translation> </message> <message> @@ -510,6 +917,30 @@ Adesso puoi salvarlo.</translation> <source>File not found!</source> <translation>File non trovato!</translation> </message> + <message> + <source>Unable to open the database.</source> + <translation>Impossibile aprire il database.</translation> + </message> + <message> + <source>File opened in read only mode.</source> + <translation>File aperto in modalità di sola lettura.</translation> + </message> + <message> + <source>Open CSV file</source> + <translation>Apri file CSV</translation> + </message> + <message> + <source>CSV file</source> + <translation>File CSV</translation> + </message> + <message> + <source>All files (*)</source> + <translation>Tutti i file (*)</translation> + </message> + <message> + <source>Merge database</source> + <translation>Unisci database</translation> + </message> <message> <source>Open KeePass 1 database</source> <translation>Apri database KeePass 1</translation> @@ -518,17 +949,19 @@ Adesso puoi salvarlo.</translation> <source>KeePass 1 database</source> <translation>Database KeePass 1</translation> </message> - <message> - <source>All files (*)</source> - <translation>Tutti i file (*)</translation> - </message> <message> <source>Close?</source> <translation>Vuoi chiudere?</translation> </message> + <message> + <source>"%1" is in edit mode. +Discard changes and close anyway?</source> + <translation>"%1" è in modalità modifica. +Vuoi annullare le modifiche e chiudere comunque?</translation> + </message> <message> <source>Save changes?</source> - <translation>Vuoi salvare modifiche?</translation> + <translation>Salvare le modifiche?</translation> </message> <message> <source>"%1" was modified. @@ -538,12 +971,24 @@ Vuoi salvare le modifiche?</translation> </message> <message> <source>Writing the database failed.</source> - <translation>Scrittura del database fallita.</translation> + <translation>Scrittura database non riuscita.</translation> + </message> + <message> + <source>Passwords</source> + <translation>Password</translation> </message> <message> <source>Save database as</source> <translation>Salva database come</translation> </message> + <message> + <source>Export database to CSV file</source> + <translation>Esporta database come file CSV</translation> + </message> + <message> + <source>Writing the CSV file failed.</source> + <translation>Scrittura file CSV non riuscita.</translation> + </message> <message> <source>New database</source> <translation>Nuovo database</translation> @@ -561,12 +1006,6 @@ Vuoi salvare le modifiche?</translation> Please press cancel to finish your changes or discard them.</source> <translation>Non è possibile bloccare il database dato che lo stai modificando. Seleziona 'Annulla' per completare le modifiche o scartarle.</translation> - </message> - <message> - <source>This database has never been saved. -You can save the database or stop locking it.</source> - <translation>Questo database non è mai stato salvato. -È possibile salvare il database o interrompere il blocco.</translation> </message> <message> <source>This database has been modified. @@ -576,95 +1015,60 @@ Otherwise your changes are lost.</source> Vuoi salvare il database prima di bloccarlo? Altrimenti le modifiche verranno perse.</translation> </message> - <message> - <source>"%1" is in edit mode. -Discard changes and close anyway?</source> - <translation>"%1" è in modalità modifica. -Vuoi annullare le modifiche e chiudere comunque?</translation> - </message> - <message> - <source>Export database to CSV file</source> - <translation>Esporta database come file CSV</translation> - </message> - <message> - <source>CSV file</source> - <translation>File CSV</translation> - </message> - <message> - <source>Writing the CSV file failed.</source> - <translation>Scrittura file CSV fallita.</translation> - </message> - <message> - <source>Unable to open the database.</source> - <translation>Impossibile aprire il database.</translation> - </message> - <message> - <source>Merge database</source> - <translation>Unisci database</translation> - </message> - <message> - <source>The database you are trying to save as is locked by another instance of KeePassXC. -Do you want to save it anyway?</source> - <translation>Il database che stai tentando di salvare è bloccato da un'altra istanza di KeePassXC. -Vuoi salvare comunque?</translation> - </message> - <message> - <source>Passwords</source> - <translation>Password</translation> - </message> - <message> - <source>Database already opened</source> - <translation>Database già aperto</translation> - </message> - <message> - <source>The database you are trying to open is locked by another instance of KeePassXC. - -Do you want to open it anyway?</source> - <translation>Il database che stai cercando di aprire è bloccato da un'altra instanza di KeePassXC. -Vuoi aprilo comunque?</translation> - </message> - <message> - <source>Open read-only</source> - <translation>Apri in sola lettura</translation> - </message> - <message> - <source>File opened in read only mode.</source> - <translation>File aperto in modalità di sola lettura.</translation> - </message> - <message> - <source>Open CSV file</source> - <translation>Apri file CSV</translation> - </message> </context> <context> <name>DatabaseWidget</name> + <message> + <source>Searching...</source> + <translation>Ricerca...</translation> + </message> <message> <source>Change master key</source> <translation>Modifica chiave principale</translation> </message> <message> <source>Delete entry?</source> - <translation>Vuoi eliminare l'elemento?</translation> + <translation>Vuoi eliminare la voce?</translation> </message> <message> <source>Do you really want to delete the entry "%1" for good?</source> - <translation>Vuoi veramente eliminare l'elemento "%1"?</translation> + <translation>Vuoi veramente eliminare la voce "%1"?</translation> </message> <message> <source>Delete entries?</source> - <translation>Vuoi eliminare gli elementi?</translation> + <translation>Vuoi eliminare le voci?</translation> </message> <message> <source>Do you really want to delete %1 entries for good?</source> - <translation>Vuoi veramente eliminare %1 elementi?</translation> + <translation>Vuoi veramente eliminare %1 voci?</translation> + </message> + <message> + <source>Move entry to recycle bin?</source> + <translation>Vuoi cestinare la voce?</translation> + </message> + <message> + <source>Do you really want to move entry "%1" to the recycle bin?</source> + <translation>Vuoi davvero cestinare la voce "%1"?</translation> </message> <message> <source>Move entries to recycle bin?</source> - <translation>Vuoi spostare gli elementi nel Cestino?</translation> + <translation>Vuoi spostare le voci nel Cestino?</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>Vuoi veramente spostare %n elemento nel Cestino?</numerusform><numerusform>Vuoi veramente spostare %n elementi nel Cestino?</numerusform></translation> + <translation><numerusform>Vuoi veramente cestinare %n voce?</numerusform><numerusform>Vuoi veramente cestinare %n voci?</numerusform></translation> + </message> + <message> + <source>Execute command?</source> + <translation>Vuoi eseguire il comando?</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation>Sei sicuro di voler eseguire il seguente comando?<br><br>%1<br></translation> + </message> + <message> + <source>Remember my choice</source> + <translation>Ricorda la mia scelta</translation> </message> <message> <source>Delete group?</source> @@ -678,18 +1082,6 @@ Vuoi aprilo comunque?</translation> <source>Unable to calculate master key</source> <translation>Impossibile calcolare la chiave principale</translation> </message> - <message> - <source>Move entry to recycle bin?</source> - <translation>Vuoi spostare l'elemento nel Cestino?</translation> - </message> - <message> - <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation>Vuoi veramente spostare l'elemento "%1" nel Cestino?</translation> - </message> - <message> - <source>Searching...</source> - <translation>Ricerca...</translation> - </message> <message> <source>No current database.</source> <translation>Nessun database attuale.</translation> @@ -707,20 +1099,8 @@ Vuoi aprilo comunque?</translation> <translation>Nessun risultato</translation> </message> <message> - <source>Execute command?</source> - <translation>Vuoi eseguire il comando?</translation> - </message> - <message> - <source>Do you really want to execute the following command?<br><br>%1<br></source> - <translation>Sei sicuro di voler eseguire il seguente comando?<br><br>%1<br></translation> - </message> - <message> - <source>Remember my choice</source> - <translation>Ricorda la mia scelta</translation> - </message> - <message> - <source>Autoreload Request</source> - <translation>Ricaricamento automatico richieste</translation> + <source>File has changed</source> + <translation>Il file è stato modificato</translation> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -731,8 +1111,9 @@ Vuoi aprilo comunque?</translation> <translation>Richiesta di unione</translation> </message> <message> - <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> - <translation>Il file del database è stato modificato e ci sono delle modifiche non salvate. Vuoi unire i tuoi cambiamenti?</translation> + <source>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</source> + <translation type="unfinished"/> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -740,18 +1121,101 @@ Vuoi aprilo comunque?</translation> </message> <message> <source>Empty recycle bin?</source> - <translation>Vuoi svuotare il Cestino?</translation> + <translation>Svuotare il cestino?</translation> </message> <message> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> - <translation>Sei sicuro di voler eliminare tutto definitivamente dal Cestino?</translation> + <translation>Sei sicuro di voler eliminare definitivamente tutto dal cestino?</translation> + </message> +</context> +<context> + <name>DetailsWidget</name> + <message> + <source>Generate TOTP Token</source> + <translation>Generare un token TOTP</translation> + </message> + <message> + <source>Close</source> + <translation>Chiudi</translation> + </message> + <message> + <source>General</source> + <translation>Generale</translation> + </message> + <message> + <source>Password</source> + <translation>Password</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Expiration</source> + <translation>Scadenza</translation> + </message> + <message> + <source>Username</source> + <translation>Nome utente</translation> + </message> + <message> + <source>Autotype</source> + <translation>Completamento automatico</translation> + </message> + <message> + <source>Searching</source> + <translation>Ricerca</translation> + </message> + <message> + <source>Attributes</source> + <translation>Attributi</translation> + </message> + <message> + <source>Attachments</source> + <translation>Allegati</translation> + </message> + <message> + <source>Notes</source> + <translation>Note</translation> + </message> + <message> + <source>Window</source> + <translation>Finestra</translation> + </message> + <message> + <source>Sequence</source> + <translation>Sequenza</translation> + </message> + <message> + <source>Search</source> + <translation>Cerca</translation> + </message> + <message> + <source>Clear</source> + <translation>Azzera</translation> + </message> + <message> + <source>Never</source> + <translation>Mai</translation> + </message> + <message> + <source>[PROTECTED]</source> + <translation>[PROTETTO]</translation> + </message> + <message> + <source>Disabled</source> + <translation>Disabilitato</translation> + </message> + <message> + <source>Enabled</source> + <translation>Abilitato</translation> </message> </context> <context> <name>EditEntryWidget</name> <message> <source>Entry</source> - <translation>Elemento</translation> + <translation>Voce</translation> </message> <message> <source>Advanced</source> @@ -773,17 +1237,41 @@ Vuoi aprilo comunque?</translation> <source>History</source> <translation>Cronologia</translation> </message> + <message> + <source>SSH Agent</source> + <translation>Agente SSH</translation> + </message> + <message> + <source>n/a</source> + <translation>n/a</translation> + </message> + <message> + <source>(encrypted)</source> + <translation>(cifrato)</translation> + </message> + <message> + <source>Select private key</source> + <translation>Seleziona chiave privata</translation> + </message> + <message> + <source>File too large to be a private key</source> + <translation>File troppo grande per essere una chiave privata</translation> + </message> + <message> + <source>Failed to open private key</source> + <translation>Impossibile aprire la chiave privata</translation> + </message> <message> <source>Entry history</source> - <translation>Cronologia elemento</translation> + <translation>Cronologia voce</translation> </message> <message> <source>Add entry</source> - <translation>Aggiungi elemento</translation> + <translation>Aggiungi voce</translation> </message> <message> <source>Edit entry</source> - <translation>Modifica elemento</translation> + <translation>Modifica voce</translation> </message> <message> <source>Different passwords supplied.</source> @@ -794,22 +1282,20 @@ Vuoi aprilo comunque?</translation> <translation>Nuovo attributo</translation> </message> <message> - <source>Select file</source> - <translation>Seleziona file</translation> + <source>Confirm Remove</source> + <translation>Conferma eliminazione</translation> </message> <message> - <source>Unable to open file</source> - <translation>Impossibile aprire il file</translation> + <source>Are you sure you want to remove this attribute?</source> + <translation>Sei sicuro di voler rimuovere questo attributo?</translation> </message> <message> - <source>Save attachment</source> - <translation>Salva allegato</translation> + <source>[PROTECTED]</source> + <translation>[PROTETTO]</translation> </message> <message> - <source>Unable to save the attachment: -</source> - <translation>Impossibile salvare l'allegato: -</translation> + <source>Press reveal to view or edit</source> + <translation>Premere rivela per visualizzare o modificare</translation> </message> <message> <source>Tomorrow</source> @@ -827,22 +1313,6 @@ Vuoi aprilo comunque?</translation> <source>1 year</source> <translation>Un anno</translation> </message> - <message> - <source>Confirm Remove</source> - <translation>Conferma eliminazione</translation> - </message> - <message> - <source>Are you sure you want to remove this attribute?</source> - <translation>Sei sicuro di voler rimuovere questo attributo?</translation> - </message> - <message> - <source>[PROTECTED] Press reveal to view or edit</source> - <translation>[PROTETTO] Seleziona 'Rileva' per visualizzare o modificare</translation> - </message> - <message> - <source>Are you sure you want to remove this attachment?</source> - <translation>Sei sicuro di voler rimuovere questo allegato?</translation> - </message> </context> <context> <name>EditEntryWidgetAdvanced</name> @@ -858,18 +1328,6 @@ Vuoi aprilo comunque?</translation> <source>Remove</source> <translation>Rimuovi</translation> </message> - <message> - <source>Attachments</source> - <translation>Allegati</translation> - </message> - <message> - <source>Save</source> - <translation>Salva</translation> - </message> - <message> - <source>Open</source> - <translation>Apri</translation> - </message> <message> <source>Edit Name</source> <translation>Modifica nome</translation> @@ -882,12 +1340,28 @@ Vuoi aprilo comunque?</translation> <source>Reveal</source> <translation>Rivela</translation> </message> + <message> + <source>Attachments</source> + <translation>Allegati</translation> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> <message> <source>Enable Auto-Type for this entry</source> - <translation>Abilita completamento automatico per questo elemento</translation> + <translation>Abilita completamento automatico per questa voce</translation> + </message> + <message> + <source>Inherit default Auto-Type sequence from the &group</source> + <translation>Eredita la sequenza per il completamento automatico dal &gruppo</translation> + </message> + <message> + <source>&Use custom Auto-Type sequence:</source> + <translation>&Usa sequenza di completamento automatico personalizzata:</translation> + </message> + <message> + <source>Window Associations</source> + <translation>Associazioni finestra</translation> </message> <message> <source>+</source> @@ -901,14 +1375,6 @@ Vuoi aprilo comunque?</translation> <source>Window title:</source> <translation>Titolo finestra:</translation> </message> - <message> - <source>Inherit default Auto-Type sequence from the &group</source> - <translation>Eredita la sequenza per il completamento automatico dal &gruppo</translation> - </message> - <message> - <source>&Use custom Auto-Type sequence:</source> - <translation>&Usa sequenza di compeltamento automatico personalizzata:</translation> - </message> <message> <source>Use default se&quence</source> <translation>Usa se&quenza predefinita</translation> @@ -917,10 +1383,6 @@ Vuoi aprilo comunque?</translation> <source>Set custo&m sequence:</source> <translation>Imposta sequenza &personalizzata:</translation> </message> - <message> - <source>Window Associations</source> - <translation>Associazioni finestra</translation> - </message> </context> <context> <name>EditEntryWidgetHistory</name> @@ -944,12 +1406,8 @@ Vuoi aprilo comunque?</translation> <context> <name>EditEntryWidgetMain</name> <message> - <source>Title:</source> - <translation>Titolo:</translation> - </message> - <message> - <source>Username:</source> - <translation>Nome utente:</translation> + <source>URL:</source> + <translation>URL:</translation> </message> <message> <source>Password:</source> @@ -960,20 +1418,104 @@ Vuoi aprilo comunque?</translation> <translation>Ripeti:</translation> </message> <message> - <source>URL:</source> - <translation>URL:</translation> + <source>Title:</source> + <translation>Titolo:</translation> </message> <message> - <source>Expires</source> - <translation>Scade</translation> + <source>Notes</source> + <translation>Note</translation> </message> <message> <source>Presets</source> <translation>Preimpostazioni</translation> </message> <message> - <source>Notes:</source> - <translation>Note:</translation> + <source>Toggle the checkbox to reveal the notes section.</source> + <translation>Attivare o disattivare la casella di controllo per rivelare la sezione note.</translation> + </message> + <message> + <source>Username:</source> + <translation>Nome utente:</translation> + </message> + <message> + <source>Expires</source> + <translation>Scade</translation> + </message> +</context> +<context> + <name>EditEntryWidgetSSHAgent</name> + <message> + <source>Form</source> + <translation>Modulo</translation> + </message> + <message> + <source>Remove key from agent after</source> + <translation>Rimuovi chiave dall'agente dopo</translation> + </message> + <message> + <source> seconds</source> + <translation> secondi</translation> + </message> + <message> + <source>Fingerprint</source> + <translation>Impronta digitale</translation> + </message> + <message> + <source>Remove key from agent when database is closed/locked</source> + <translation>Rimuovi chiave dall'agente quando il database viene chiuso/bloccato</translation> + </message> + <message> + <source>Public key</source> + <translation>Chiave pubblica</translation> + </message> + <message> + <source>Add key to agent when database is opened/unlocked</source> + <translation>Aggiungi chiave all'agente quando il database viene aperto/sbloccato</translation> + </message> + <message> + <source>Comment</source> + <translation>Commento</translation> + </message> + <message> + <source>Decrypt</source> + <translation>Decifra</translation> + </message> + <message> + <source>n/a</source> + <translation>n/a</translation> + </message> + <message> + <source>Copy to clipboard</source> + <translation>Copia negli appunti</translation> + </message> + <message> + <source>Private key</source> + <translation>Chiave privata</translation> + </message> + <message> + <source>External file</source> + <translation>File esterno</translation> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Sfoglia...</translation> + </message> + <message> + <source>Attachment</source> + <translation>Allegato</translation> + </message> + <message> + <source>Add to agent</source> + <translation>Aggiungi all'agente</translation> + </message> + <message> + <source>Remove from agent</source> + <translation>Rimuovi dall'agente</translation> + </message> + <message> + <source>Require user confirmation when this key is used</source> + <translation>Richiesta conferma dell'utente quando questa chiave è usata</translation> </message> </context> <context> @@ -1044,6 +1586,14 @@ Vuoi aprilo comunque?</translation> </context> <context> <name>EditWidgetIcons</name> + <message> + <source>&Use default icon</source> + <translation>&Usa icona predefinita</translation> + </message> + <message> + <source>Use custo&m icon</source> + <translation>Usa &icona personalizzata</translation> + </message> <message> <source>Add custom icon</source> <translation>Aggiungi icona personalizzata</translation> @@ -1052,6 +1602,18 @@ Vuoi aprilo comunque?</translation> <source>Delete custom icon</source> <translation>Rimuovi icona personalizzata</translation> </message> + <message> + <source>Download favicon</source> + <translation>Scarica favicon</translation> + </message> + <message> + <source>Unable to fetch favicon.</source> + <translation>Impossibile scaricare favicon.</translation> + </message> + <message> + <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> + <translation>Suggerimento: è possibile abilitare Google come alternativa in 'Strumenti'>'Impostazioni'>'Sicurezza'</translation> + </message> <message> <source>Images</source> <translation>Immagini</translation> @@ -1064,25 +1626,13 @@ Vuoi aprilo comunque?</translation> <source>Select Image</source> <translation>Seleziona immagine</translation> </message> - <message> - <source>Download favicon</source> - <translation>Scarica favicon</translation> - </message> - <message> - <source>Unable to fetch favicon.</source> - <translation>Impossibile scaricare favicon.</translation> - </message> <message> <source>Can't read icon</source> <translation>Impossibile leggere l'icona</translation> </message> <message> - <source>&Use default icon</source> - <translation>&Usa icona predefinita</translation> - </message> - <message> - <source>Use custo&m icon</source> - <translation>Usa &icona personalizzata</translation> + <source>Custom icon already exists</source> + <translation>L'icona personalizzata esiste già</translation> </message> <message> <source>Confirm Delete</source> @@ -1090,15 +1640,7 @@ Vuoi aprilo comunque?</translation> </message> <message> <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> - <translation>Questa icona viene usata da %1 elementi, e sarà sostituita dall'icona predefinita. Sei sicuro di volerla eliminare?</translation> - </message> - <message> - <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation>Suggerimento: è possibile abilitare Google come alternativa in 'Strumenti'>'Impostazioni'>'Sicurezza'</translation> - </message> - <message> - <source>Custom icon already exists</source> - <translation>L'icona personalizzata esiste già</translation> + <translation>Questa icona viene usata da %1 voce, e sarà sostituita dall'icona predefinita. Sei sicuro di volerla eliminare?</translation> </message> </context> <context> @@ -1124,9 +1666,98 @@ Vuoi aprilo comunque?</translation> <name>Entry</name> <message> <source> - Clone</source> + <comment>Suffix added to cloned entries</comment> <translation> - Clona</translation> </message> </context> +<context> + <name>EntryAttachmentsModel</name> + <message> + <source>Name</source> + <translation>Nome</translation> + </message> + <message> + <source>Size</source> + <translation>Dimensione</translation> + </message> +</context> +<context> + <name>EntryAttachmentsWidget</name> + <message> + <source>Form</source> + <translation>Modulo</translation> + </message> + <message> + <source>Add</source> + <translation>Aggiungi</translation> + </message> + <message> + <source>Remove</source> + <translation>Rimuovi</translation> + </message> + <message> + <source>Open</source> + <translation>Apri</translation> + </message> + <message> + <source>Save</source> + <translation>Salva</translation> + </message> + <message> + <source>Select files</source> + <translation>Seleziona file</translation> + </message> + <message numerus="yes"> + <source>Are you sure you want to remove %n attachment(s)?</source> + <translation><numerusform>Sei sicuro di voler rimuovere %n allegato?</numerusform><numerusform>Sei sicuro di voler rimuovere %n allegati?</numerusform></translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>Conferma eliminazione</translation> + </message> + <message> + <source>Save attachments</source> + <translation>Salva allegati</translation> + </message> + <message> + <source>Unable to create directory: +%1</source> + <translation>Impossibile creare la directory: +%1</translation> + </message> + <message> + <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> + <translation>Sei sicuro di sovrascrivere il file "%1" esistente con l'allegato?</translation> + </message> + <message> + <source>Confirm overwrite</source> + <translation>Confermare la sovrascrittura</translation> + </message> + <message> + <source>Unable to save attachments: +%1</source> + <translation>Impossibile salvare l'allegato: +%1</translation> + </message> + <message> + <source>Unable to open attachment: +%1</source> + <translation>Impossibile aprire l'allegato: +%1</translation> + </message> + <message> + <source>Unable to open attachments: +%1</source> + <translation>Impossibile aprire gli allegati: +%1</translation> + </message> + <message> + <source>Unable to open files: +%1</source> + <translation>Impossibile aprire i file: +%1</translation> + </message> +</context> <context> <name>EntryAttributesModel</name> <message> @@ -1155,6 +1786,11 @@ Vuoi aprilo comunque?</translation> </context> <context> <name>EntryModel</name> + <message> + <source>Ref: </source> + <comment>Reference abbreviation</comment> + <translation>Rif.: </translation> + </message> <message> <source>Group</source> <translation>Gruppo</translation> @@ -1171,11 +1807,6 @@ Vuoi aprilo comunque?</translation> <source>URL</source> <translation>URL</translation> </message> - <message> - <source>Ref: </source> - <comment>Reference abbreviation</comment> - <translation>Rif.: </translation> - </message> </context> <context> <name>Group</name> @@ -1184,6 +1815,17 @@ Vuoi aprilo comunque?</translation> <translation>Cestino</translation> </message> </context> +<context> + <name>HostInstaller</name> + <message> + <source>KeePassXC: Cannot save file!</source> + <translation>KeePassXC: impossibile salvare il file.</translation> + </message> + <message> + <source>Cannot save the native messaging script file.</source> + <translation>Impossibile salvare il file di script nativo di messaggistica.</translation> + </message> +</context> <context> <name>HttpPasswordGeneratorWidget</name> <message> @@ -1192,7 +1834,7 @@ Vuoi aprilo comunque?</translation> </message> <message> <source>Character Types</source> - <translation>Tipi carattere</translation> + <translation>Tipi di carattere</translation> </message> <message> <source>Upper Case Letters</source> @@ -1246,6 +1888,361 @@ Vuoi aprilo comunque?</translation> <translation>Chiudi messaggio</translation> </message> </context> +<context> + <name>Kdbx3Reader</name> + <message> + <source>Unable to calculate master key</source> + <translation>Impossibile calcolare la chiave principale</translation> + </message> + <message> + <source>Unable to issue challenge-response.</source> + <translation>Non in grado dare la risposta di verifica.</translation> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>Chiave errata o file del database danneggiato.</translation> + </message> +</context> +<context> + <name>Kdbx3Writer</name> + <message> + <source>Unable to issue challenge-response.</source> + <translation>Non in grado dare la risposta di verifica.</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Impossibile calcolare la chiave principale</translation> + </message> +</context> +<context> + <name>Kdbx4Reader</name> + <message> + <source>missing database headers</source> + <translation>intestazioni del database mancanti</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Impossibile calcolare la chiave principale</translation> + </message> + <message> + <source>Invalid header checksum size</source> + <translation>Dimensione di checksum dell'intestazione non valida</translation> + </message> + <message> + <source>Header SHA256 mismatch</source> + <translation>Corrispondenza errata dell'intestazione SHA256</translation> + </message> + <message> + <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher</source> + <translation>Cifrario sconosciuto</translation> + </message> + <message> + <source>Invalid header id size</source> + <translation>Dimensione dell'id dell'intestazione non valida</translation> + </message> + <message> + <source>Invalid header field length</source> + <translation>Lunghezza del campo di intestazione non valida</translation> + </message> + <message> + <source>Invalid header data length</source> + <translation>Lunghezza dei dati di intestazione non valida</translation> + </message> + <message> + <source>Failed to open buffer for KDF parameters in header</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported key derivation function (KDF) or invalid parameters</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy header fields found in KDBX4 file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header id size</source> + <translation>Dimensione dell'id dell'intestazione interna non valida</translation> + </message> + <message> + <source>Invalid inner header field length</source> + <translation>Lunghezza del campo di intestazione interna non valida</translation> + </message> + <message> + <source>Invalid inner header binary size</source> + <translation>Dimensione binaria dell'intestazione interna non valida</translation> + </message> + <message> + <source>Unsupported KeePass variant map version.</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>Variante di mappa KeePass non supportata.</translation> + </message> + <message> + <source>Invalid variant map entry name length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name data</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value data</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Bool entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry type</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map field type size</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Kdbx4Writer</name> + <message> + <source>Invalid symmetric cipher algorithm.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid symmetric cipher IV size.</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Impossibile calcolare la chiave principale</translation> + </message> + <message> + <source>Failed to serialize KDF parameters variant map</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxReader</name> + <message> + <source>Invalid cipher uuid length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported cipher</source> + <translation>Cifrario non supportato</translation> + </message> + <message> + <source>Invalid compression flags length</source> + <translation>Lunghezza dei flag di compressione non valida</translation> + </message> + <message> + <source>Unsupported compression algorithm</source> + <translation>Algoritmo di compressione non supportato</translation> + </message> + <message> + <source>Invalid master seed size</source> + <translation>Dimensione del seme principale non valido</translation> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform rounds size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid start bytes size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid random stream id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner random stream cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>Non è un database KeePass.</translation> + </message> + <message> + <source>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> + <translation>Il file selezionato è un vecchio database di KeePass 1 (.kdb). + +È possibile importarlo facendo clic su 'Database' > 'Importa database KeePass 1...'. +Si tratta di una migrazione unidirezionale. Non sarà possibile aprire il database importato con la vecchia versione di KeePassX 0.4.</translation> + </message> + <message> + <source>Unsupported KeePass 2 database version.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxXmlReader</name> + <message> + <source>XML parsing failure: %1</source> + <translation>Errore nell'analisi XML: %1</translation> + </message> + <message> + <source>No root group</source> + <translation>Nessun gruppo radice</translation> + </message> + <message> + <source>Missing icon uuid or data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing custom data key or value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Multiple group elements</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null group uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableAutoType value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableSearching value</source> + <translation type="unfinished"/> + </message> + <message> + <source>No group uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null DeleteObject uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing DeletedObject uuid or time</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null entry uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element in history entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>No entry uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element with different uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decrypt entry string</source> + <translation>Impossibile decrittografare la stringa della voce</translation> + </message> + <message> + <source>Duplicate custom attribute found</source> + <translation>Trovato attributo personalizzato duplicato</translation> + </message> + <message> + <source>Entry string key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate attachment found</source> + <translation>Trovato allegato duplicato</translation> + </message> + <message> + <source>Entry binary key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-type association window or sequence missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid bool value</source> + <translation>Valore booleano non valido</translation> + </message> + <message> + <source>Invalid date time value</source> + <translation>Valore di data e tempo non valido</translation> + </message> + <message> + <source>Invalid color value</source> + <translation>Valore di colore non valido</translation> + </message> + <message> + <source>Invalid color rgb part</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number value</source> + <translation>Valore numerico non valido</translation> + </message> + <message> + <source>Invalid uuid value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decompress binary</source> + <extracomment>Translator meant is a binary data inside an entry</extracomment> + <translation>Impossibile decomprimere il binario</translation> + </message> +</context> <context> <name>KeePass1OpenWidget</name> <message> @@ -1275,6 +2272,35 @@ Vuoi aprilo comunque?</translation> <source>Unsupported KeePass database version.</source> <translation>Versione database KeePass non supportata.</translation> </message> + <message> + <source>Unable to read encryption IV</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of groups</source> + <translation>Numero di gruppi non valido</translation> + </message> + <message> + <source>Invalid number of entries</source> + <translation>Numero di voci non valido</translation> + </message> + <message> + <source>Invalid content hash size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of transform rounds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to construct group tree</source> + <translation>Impossibile costruire la struttura ad albero dei gruppi</translation> + </message> <message> <source>Root</source> <translation>Radice</translation> @@ -1287,53 +2313,113 @@ Vuoi aprilo comunque?</translation> <source>Wrong key or database file is corrupt.</source> <translation>Chiave errata o file del database danneggiato.</translation> </message> -</context> -<context> - <name>KeePass2Reader</name> <message> - <source>Not a KeePass database.</source> - <translation>Non è un database KeePass.</translation> + <source>Key transformation failed</source> + <translation>Trasformazione della chiave non riuscita</translation> </message> <message> - <source>Unsupported KeePass database version.</source> - <translation>Versione database KeePass non supportata.</translation> + <source>Invalid group field type number</source> + <translation type="unfinished"/> </message> <message> - <source>Wrong key or database file is corrupt.</source> - <translation>Chiave errata o file del database danneggiato.</translation> + <source>Invalid group field size</source> + <translation>Dimensione del campo di gruppo non valida</translation> </message> <message> - <source>Unable to calculate master key</source> - <translation>Impossibile calcolare la chiave principale</translation> + <source>Read group field data doesn't match size</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to issue challenge-response.</source> - <translation>Non in grado dare la risposta di verifica.</translation> + <source>Incorrect group id field size</source> + <translation type="unfinished"/> </message> <message> - <source>The selected file is an old KeePass 1 database (.kdb). - -You can import it by clicking on Database > 'Import KeePass 1 database...'. -This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> - <translation>Il file selezionato è un vecchio database di KeePass 1 (.kdb). - -È possibile importarlo facendo clic su 'Database' > 'Importa database KeePass 1...'. -Si tratta di una migrazione unidirezionale. Non sarà possibile aprire il database importato con la vecchia versione di KeePassX 0.4.</translation> - </message> -</context> -<context> - <name>KeePass2Writer</name> - <message> - <source>Unable to issue challenge-response.</source> - <translation>Non in grado dare la risposta di verifica.</translation> + <source>Incorrect group creation time field size</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>Impossibile calcolare la chiave principale</translation> + <source>Incorrect group modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group access time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group level field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing group id or level</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing entry field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field size</source> + <translation>Dimensione del campo di immissione non valida</translation> + </message> + <message> + <source>Read entry field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry uuid field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field type</source> + <translation type="unfinished"/> </message> </context> <context> <name>Main</name> + <message> + <source>Existing single-instance lock file is invalid. Launching new instance.</source> + <translation>Il file di blocco singola istanza non è valido. Viene eseguita una nuova istanza.</translation> + </message> + <message> + <source>The lock file could not be created. Single-instance mode disabled.</source> + <translation>Il file di blocco non può essere creato. La modalità a istanza singola è disattivata.</translation> + </message> + <message> + <source>Another instance of KeePassXC is already running.</source> + <translation>È già in esecuzione un'altra istanza di KeePassXC.</translation> + </message> <message> <source>Fatal error while testing the cryptographic functions.</source> <translation>Errore fatale durante il test delle funzioni di crittografia.</translation> @@ -1342,88 +2428,44 @@ Si tratta di una migrazione unidirezionale. Non sarà possibile aprire il databa <source>KeePassXC - Error</source> <translation>KeePassXC - Errore</translation> </message> - <message> - <source>The lock file could not be created. Single-instance mode disabled.</source> - <translation>Il file di blocco non può essere creato. La modalità di istanza singola è disattivata.</translation> - </message> - <message> - <source>Another instance of KeePassXC is already running.</source> - <translation>È già in esecuzione un'altra istanza di KeePassXC.</translation> - </message> - <message> - <source>Existing single-instance lock file is invalid. Launching new instance.</source> - <translation>Il file di blocco singola istanza non è valido. Esegui una nuova istanza.</translation> - </message> </context> <context> <name>MainWindow</name> <message> - <source>Open database</source> - <translation>Apri database</translation> - </message> - <message> - <source>Database settings</source> - <translation>Impostazioni database</translation> - </message> - <message> - <source>Copy username to clipboard</source> - <translation>Copia nome utente negli Appunti</translation> - </message> - <message> - <source>Copy password to clipboard</source> - <translation>Copia password negli Appunti</translation> - </message> - <message> - <source>Settings</source> - <translation>Impostazioni</translation> - </message> - <message> - <source>Show toolbar</source> - <translation>Visualizza barra strumenti</translation> - </message> - <message> - <source>read-only</source> - <translation>sola lettura</translation> - </message> - <message> - <source>Toggle window</source> - <translation>Abilita/disabilita finestra</translation> - </message> - <message> - <source>KeePass 2 Database</source> - <translation>Database KeePass 2</translation> - </message> - <message> - <source>All files</source> - <translation>Tutti i file</translation> - </message> - <message> - <source>Save repaired database</source> - <translation>Salva database riparato</translation> - </message> - <message> - <source>Writing the database failed.</source> - <translation>Scrittura database fallita.</translation> + <source>&Database</source> + <translation>&Database</translation> </message> <message> <source>&Recent databases</source> <translation>&Database recenti</translation> </message> + <message> + <source>Import</source> + <translation>Importazione</translation> + </message> + <message> + <source>&Help</source> + <translation>&Aiuto</translation> + </message> <message> <source>E&ntries</source> - <translation>Eleme&nti</translation> + <translation>&Voci</translation> </message> <message> <source>Copy att&ribute to clipboard</source> - <translation>Copia gli att&ributi negli Appunti</translation> + <translation>Copia gli att&ributi negli appunti</translation> + </message> + <message> + <source>Time-based one-time password</source> + <translation type="unfinished"/> </message> <message> <source>&Groups</source> <translation>&Gruppi</translation> </message> <message> - <source>&View</source> - <translation>&Visualizza</translation> + <source>&Tools</source> + <translation>S&trumenti</translation> </message> <message> <source>&Quit</source> @@ -1433,6 +2475,10 @@ Si tratta di una migrazione unidirezionale. Non sarà possibile aprire il databa <source>&About</source> <translation>&Informazioni</translation> </message> + <message> + <source>&Open database...</source> + <translation>Apri &database...</translation> + </message> <message> <source>&Save database</source> <translation>&Salva database</translation> @@ -1451,15 +2497,15 @@ Si tratta di una migrazione unidirezionale. Non sarà possibile aprire il databa </message> <message> <source>&Add new entry</source> - <translation>&Aggiungi nuovo elemento</translation> + <translation>&Aggiungi nuova voce</translation> </message> <message> <source>&View/Edit entry</source> - <translation>&Visualizza/modifica elemento</translation> + <translation>&Visualizza/modifica voce</translation> </message> <message> <source>&Delete entry</source> - <translation>&Elimina elemento</translation> + <translation>&Elimina voce</translation> </message> <message> <source>&Add new group</source> @@ -1473,25 +2519,25 @@ Si tratta di una migrazione unidirezionale. Non sarà possibile aprire il databa <source>&Delete group</source> <translation>&Elimina gruppo</translation> </message> + <message> + <source>Sa&ve database as...</source> + <translation>Sal&va database come...</translation> + </message> + <message> + <source>Change &master key...</source> + <translation>&Modifica chiave principale...</translation> + </message> <message> <source>&Database settings</source> <translation>Impostazioni &database</translation> </message> + <message> + <source>Database settings</source> + <translation>Impostazioni database</translation> + </message> <message> <source>&Clone entry</source> - <translation>&Clona elemento</translation> - </message> - <message> - <source>Timed one-time password</source> - <translation>Password monouso temporizzata</translation> - </message> - <message> - <source>Copy &TOTP</source> - <translation>Copia &TOTP</translation> - </message> - <message> - <source>Show TOTP</source> - <translation>Visualizza TOTP</translation> + <translation>&Clona voce</translation> </message> <message> <source>&Find</source> @@ -1501,14 +2547,26 @@ Si tratta di una migrazione unidirezionale. Non sarà possibile aprire il databa <source>Copy &username</source> <translation>Copia &nome utente</translation> </message> + <message> + <source>Copy username to clipboard</source> + <translation>Copia nome utente negli appunti</translation> + </message> <message> <source>Cop&y password</source> <translation>Copi&a password</translation> </message> + <message> + <source>Copy password to clipboard</source> + <translation>Copia password negli appunti</translation> + </message> <message> <source>&Settings</source> <translation>&Impostazioni</translation> </message> + <message> + <source>Password Generator</source> + <translation>Genera password</translation> + </message> <message> <source>&Perform Auto-Type</source> <translation>&Esegui completamento automatico</translation> @@ -1525,65 +2583,25 @@ Si tratta di una migrazione unidirezionale. Non sarà possibile aprire il databa <source>&Title</source> <translation>&Titolo</translation> </message> + <message> + <source>Copy title to clipboard</source> + <translation>Copia titolo negli appunti</translation> + </message> <message> <source>&URL</source> <translation>&URL</translation> </message> + <message> + <source>Copy URL to clipboard</source> + <translation>Copia URL negli appunti</translation> + </message> <message> <source>&Notes</source> <translation>&Note</translation> </message> <message> - <source>Password Generator</source> - <translation>Genera password</translation> - </message> - <message> - <source>Clear history</source> - <translation>Azzera cronologia</translation> - </message> - <message> - <source>&Database</source> - <translation>&Database</translation> - </message> - <message> - <source>Import</source> - <translation>Importazione</translation> - </message> - <message> - <source>&Tools</source> - <translation>S&trumenti</translation> - </message> - <message> - <source>Empty recycle bin</source> - <translation>Svuota il Cestino</translation> - </message> - <message> - <source>Access error for config file %1</source> - <translation>Errore di accesso per il file di configurazione %1</translation> - </message> - <message> - <source>Quit KeePassXC</source> - <translation>Esci da KeePassXC</translation> - </message> - <message> - <source>Please touch the button on your YubiKey!</source> - <translation>Seleziona il pulsante nelal YubiKey!</translation> - </message> - <message> - <source>&Help</source> - <translation>&Aiuto</translation> - </message> - <message> - <source>&Open database...</source> - <translation>Apri &database...</translation> - </message> - <message> - <source>Sa&ve database as...</source> - <translation>Sal&va database come...</translation> - </message> - <message> - <source>Change &master key...</source> - <translation>&Modifica chiave principale...</translation> + <source>Copy notes to clipboard</source> + <translation>Copia note negli appunti</translation> </message> <message> <source>&Export to CSV file...</source> @@ -1601,10 +2619,169 @@ Si tratta di una migrazione unidirezionale. Non sarà possibile aprire il databa <source>Re&pair database...</source> <translation>Ri&para database...</translation> </message> + <message> + <source>Show TOTP</source> + <translation>Visualizza TOTP</translation> + </message> <message> <source>Set up TOTP...</source> <translation>Imposta TOTP...</translation> </message> + <message> + <source>Copy &TOTP</source> + <translation>Copia &TOTP</translation> + </message> + <message> + <source>E&mpty recycle bin</source> + <translation>Svuota il cesti&no</translation> + </message> + <message> + <source>Clear history</source> + <translation>Azzera cronologia</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation>Errore di accesso per il file di configurazione %1</translation> + </message> + <message> + <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> + <translation type="unfinished"/> + </message> + <message> + <source>read-only</source> + <translation>sola lettura</translation> + </message> + <message> + <source>Settings</source> + <translation>Impostazioni</translation> + </message> + <message> + <source>Toggle window</source> + <translation>Abilita/disabilita finestra</translation> + </message> + <message> + <source>Quit KeePassXC</source> + <translation>Esci da KeePassXC</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>Database KeePass 2</translation> + </message> + <message> + <source>All files</source> + <translation>Tutti i file</translation> + </message> + <message> + <source>Open database</source> + <translation>Apri database</translation> + </message> + <message> + <source>Save repaired database</source> + <translation>Salva database riparato</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>Scrittura database non riuscita.</translation> + </message> + <message> + <source>Please touch the button on your YubiKey!</source> + <translation>Premi il pulsante della YubiKey!</translation> + </message> +</context> +<context> + <name>OpenSSHKey</name> + <message> + <source>Invalid key file, expecting an OpenSSH key</source> + <translation>File di chiave non valido, era attesa una chiave OpenSSH</translation> + </message> + <message> + <source>PEM boundary mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>This is not an OpenSSH key, only modern keys are supported</source> + <translation>Questa non è una chiave OpenSSH, sono supportate solo chiavi moderne</translation> + </message> + <message> + <source>Base64 decoding failed</source> + <translation>Decodifica base64 non riuscita</translation> + </message> + <message> + <source>Key file way too small.</source> + <translation>File chiave decisamente troppo piccolo.</translation> + </message> + <message> + <source>Key file magic header id invalid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Found zero keys</source> + <translation>Trovate zero chiavi</translation> + </message> + <message> + <source>Failed to read public key.</source> + <translation>Impossibile leggere la chiave privata.</translation> + </message> + <message> + <source>Corrupted key file, reading private key failed</source> + <translation>File della chiave rovinato, impossibile leggere la chiave privata</translation> + </message> + <message> + <source>No private key payload to decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: </source> + <translation>Cifrario sconosciuto:</translation> + </message> + <message> + <source>Trying to run KDF without cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Passphrase is required to decrypt this key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key derivation failed, key file corrupted?</source> + <translation>Derivazione della chiave non riuscita, file della chiave rovinato?</translation> + </message> + <message> + <source>Unknown KDF: </source> + <translation>KDF sconosciuto: </translation> + </message> + <message> + <source>Decryption failed, wrong passphrase?</source> + <translation>Decifrazione non riuscita, passpharse non corretta?</translation> + </message> + <message> + <source>Unexpected EOF while reading public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: </source> + <translation>Tipo di chiave sconosciuto:</translation> + </message> + <message> + <source>Unexpected EOF while reading private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write public key as it is empty</source> + <translation>Impossibile scrivere la chiave pubblica perché è vuota</translation> + </message> + <message> + <source>Unexpected EOF when writing public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write private key as it is empty</source> + <translation>Impossibile scrivere la chiave privata perché è vuota</translation> + </message> + <message> + <source>Unexpected EOF when writing private key</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OptionDialog</name> @@ -1612,80 +2789,6 @@ Si tratta di una migrazione unidirezionale. Non sarà possibile aprire il databa <source>Dialog</source> <translation>Finestra</translation> </message> - <message> - <source>General</source> - <translation>Generale</translation> - </message> - <message> - <source>Sh&ow a notification when credentials are requested</source> - <translation>Visualizza una n&otifica quando sono richeste le credenziali</translation> - </message> - <message> - <source>Sort matching entries by &username</source> - <translation>Ordina elementi trovati per &nome utente</translation> - </message> - <message> - <source>Re&move all stored permissions from entries in active database</source> - <translation>R&imuovi tutti i permessi presenti negli elementi nel database attivo</translation> - </message> - <message> - <source>Advanced</source> - <translation>Avanzate</translation> - </message> - <message> - <source>Always allow &access to entries</source> - <translation>Permetti sempre di &accedere agli elementi</translation> - </message> - <message> - <source>Always allow &updating entries</source> - <translation>Permetti sempre di &aggiornare gli elementi</translation> - </message> - <message> - <source>Searc&h in all opened databases for matching entries</source> - <translation>Cerc&a in tutti i database aperti gli elementi corrispondenti</translation> - </message> - <message> - <source>HTTP Port:</source> - <translation>Porta HTTP:</translation> - </message> - <message> - <source>Default port: 19455</source> - <translation>Porta predefinita: 19455</translation> - </message> - <message> - <source>Re&quest to unlock the database if it is locked</source> - <translation>Ri&chiedi di sbloccare il database se bloccato</translation> - </message> - <message> - <source>Sort &matching entries by title</source> - <translation>Ordina gli elementi per &titolo</translation> - </message> - <message> - <source>KeePassXC will listen to this port on 127.0.0.1</source> - <translation>KeePassXC rimarrà in ascolto su questa porta su 127.0.0.1</translation> - </message> - <message> - <source>Cannot bind to privileged ports</source> - <translation>Non è stato possibile collegarsi ad una porta privilegiata</translation> - </message> - <message> - <source>Cannot bind to privileged ports below 1024! -Using default port 19455.</source> - <translation>Non è possibile usare porte sotto la 1024! -Usa la porta predefinita 19455.</translation> - </message> - <message> - <source>R&emove all shared encryption keys from active database</source> - <translation>R&imuovi tutte le chiavi condivise di cifratura dal database attivo</translation> - </message> - <message> - <source>&Return advanced string fields which start with "KPH: "</source> - <translation>&Seleziona i campi stringa avanzati che iniziano con "KPH: "</translation> - </message> - <message> - <source>Automatically creating or updating string fields is not supported.</source> - <translation>La creazione o l'aggiornamento automatico dei campi stringa non è supportato.</translation> - </message> <message> <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> <translation>Questo è necessario per accedere ai database da ChromeIPass o PassIFox</translation> @@ -1694,46 +2797,140 @@ Usa la porta predefinita 19455.</translation> <source>Enable KeePassHTTP server</source> <translation>Atttiva il server KeePassHTTP</translation> </message> + <message> + <source>General</source> + <translation>Generale</translation> + </message> + <message> + <source>Sh&ow a notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Visualizza una n&otifica quando sono richieste le credenziali</translation> + </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation>Restituisci solo le corrispondenze migliori per un'URL specifica invece di tutte gli elementi per l'intero dominio.</translation> + <translation>Restituisci solo le corrispondenze migliori per un'URL specifica invece di tutte le voci per l'intero dominio.</translation> </message> <message> <source>&Return only best matching entries</source> - <translation>&Restituisci solo gli elementi corrispondenti migliori</translation> + <translation>&Restituisci solo le corrispondenti migliori</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Ri&chiedi di sbloccare il database se bloccato</translation> </message> <message> <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation>Solo gli elementi con lo stesso schema (http://, https://, ftp: //, ...) vengono restituite.</translation> + <translation>Solo le voci con lo stesso schema (http://, https://, ftp: //, ...) vengono restituite.</translation> </message> <message> <source>&Match URL schemes</source> - <translation>Sche&ma corrispndenza URL</translation> + <translation>Corrispondenza sche&mi URL</translation> + </message> + <message> + <source>Sort matching entries by &username</source> + <translation>Ordina voci trovate per nome &utente</translation> + </message> + <message> + <source>Sort &matching entries by title</source> + <translation>Ordina le voci per &titolo</translation> + </message> + <message> + <source>R&emove all shared encryption keys from active database</source> + <translation>R&imuovi tutte le chiavi condivise di cifratura dal database attivo</translation> + </message> + <message> + <source>Re&move all stored permissions from entries in active database</source> + <translation>R&imuovi tutti i permessi presenti nelle voci nel database attivo</translation> </message> <message> <source>Password Generator</source> <translation>Genera password</translation> </message> + <message> + <source>Advanced</source> + <translation>Avanzate</translation> + </message> + <message> + <source>Always allow &access to entries</source> + <translation>Permetti sempre di &accedere alle voci</translation> + </message> + <message> + <source>Always allow &updating entries</source> + <translation>Permetti sempre di &aggiornare le voci</translation> + </message> <message> <source>Only the selected database has to be connected with a client.</source> <translation>Solo il database selezionato deve essere collegato con un client.</translation> </message> <message> - <source>The following options can be dangerous! -Change them only if you know what you are doing.</source> - <translation>Le seguenti opzioni possono essere pericolose! -Modificale solo se sai quello che stai facendo.</translation> + <source>Searc&h in all opened databases for matching entries</source> + <translation>Cerc&a in tutti i database aperti le voci corrispondenti</translation> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>La creazione o l'aggiornamento automatico dei campi stringa non è supportato.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>&Seleziona i campi stringa avanzati che iniziano con "KPH: "</translation> + </message> + <message> + <source>HTTP Port:</source> + <translation>Porta HTTP:</translation> + </message> + <message> + <source>Default port: 19455</source> + <translation>Porta predefinita: 19455</translation> + </message> + <message> + <source>KeePassXC will listen to this port on 127.0.0.1</source> + <translation>KeePassXC rimarrà in ascolto su questa porta su 127.0.0.1</translation> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation><b>Avviso:</b> le seguenti opzioni possono essere pericolose.</translation> + </message> + <message> + <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot bind to privileged ports</source> + <translation>Non è stato possibile collegarsi ad una porta privilegiata</translation> + </message> + <message> + <source>Cannot bind to privileged ports below 1024! +Using default port 19455.</source> + <translation>Non è possibile usare porte sotto la 1024! +Viene usata la porta predefinita 19455.</translation> </message> </context> <context> <name>PasswordGeneratorWidget</name> + <message> + <source>%p%</source> + <translation>%p%</translation> + </message> <message> <source>Password:</source> <translation>Password:</translation> </message> + <message> + <source>strength</source> + <comment>Password strength</comment> + <translation>affidabilità</translation> + </message> + <message> + <source>entropy</source> + <translation>entropia</translation> + </message> + <message> + <source>Password</source> + <translation>Password</translation> + </message> <message> <source>Character Types</source> - <translation>Tipi carattere</translation> + <translation>Tipi di carattere</translation> </message> <message> <source>Upper Case Letters</source> @@ -1751,38 +2948,50 @@ Modificale solo se sai quello che stai facendo.</translation> <source>Special Characters</source> <translation>Caratteri speciali</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>ASCII esteso</translation> + </message> <message> <source>Exclude look-alike characters</source> <translation>Escludi caratteri simili</translation> </message> - <message> - <source>Accept</source> - <translation>Accetta</translation> - </message> - <message> - <source>%p%</source> - <translation>%p%</translation> - </message> - <message> - <source>strength</source> - <translation>affidabilità</translation> - </message> - <message> - <source>entropy</source> - <translation>entropia</translation> - </message> - <message> - <source>&Length:</source> - <translation>&Lunghezza:</translation> - </message> <message> <source>Pick characters from every group</source> <translation>Seleziona caratteri da ogni gruppo</translation> </message> + <message> + <source>&Length:</source> + <translation>&Lunghezza:</translation> + </message> + <message> + <source>Passphrase</source> + <translation>Frase accesso</translation> + </message> + <message> + <source>Wordlist:</source> + <translation>Elenco termini:</translation> + </message> + <message> + <source>Word Count:</source> + <translation>Conteggio parole:</translation> + </message> + <message> + <source>Word Separator:</source> + <translation>Separatore parole:</translation> + </message> <message> <source>Generate</source> <translation>Genera</translation> </message> + <message> + <source>Copy</source> + <translation>Copia</translation> + </message> + <message> + <source>Accept</source> + <translation>Accetta</translation> + </message> <message> <source>Close</source> <translation>Chiudi</translation> @@ -1801,51 +3010,273 @@ Modificale solo se sai quello che stai facendo.</translation> </message> <message> <source>Poor</source> + <comment>Password quality</comment> <translation>Debole</translation> </message> <message> <source>Weak</source> + <comment>Password quality</comment> <translation>Intermedia</translation> </message> <message> <source>Good</source> + <comment>Password quality</comment> <translation>Buona</translation> </message> <message> <source>Excellent</source> + <comment>Password quality</comment> <translation>Eccellente</translation> </message> - <message> - <source>Password</source> - <translation>Password</translation> - </message> - <message> - <source>Extended ASCII</source> - <translation>ASCII esteso</translation> - </message> - <message> - <source>Passphrase</source> - <translation>Frase accesso</translation> - </message> - <message> - <source>Wordlist:</source> - <translation>Elenco termini:</translation> - </message> - <message> - <source>Word Count:</source> - <translation>Conteggio parole:</translation> - </message> - <message> - <source>Word Separator:</source> - <translation>Separatore parole:</translation> - </message> - <message> - <source>Copy</source> - <translation>Copia</translation> - </message> </context> <context> <name>QObject</name> + <message> + <source>Database not opened</source> + <translation>Database non aperto</translation> + </message> + <message> + <source>Database hash not available</source> + <translation type="unfinished"/> + </message> + <message> + <source>Client public key not received</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot decrypt message</source> + <translation>Impossibile decrittografare il messaggio</translation> + </message> + <message> + <source>Timeout or cannot connect to KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>Action cancelled or denied</source> + <translation>Azione annullata o negata</translation> + </message> + <message> + <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC association failed, try again</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key change was not successful</source> + <translation type="unfinished"/> + </message> + <message> + <source>Encryption key is not recognized</source> + <translation>Chiave di crittografia non riconosciuta</translation> + </message> + <message> + <source>No saved databases found</source> + <translation>Nessun database salvato trovato</translation> + </message> + <message> + <source>Incorrect action</source> + <translation>Azione non corretta</translation> + </message> + <message> + <source>Empty message received</source> + <translation>Ricevuto un messaggio vuoto</translation> + </message> + <message> + <source>No URL provided</source> + <translation>Nessun URL fornito</translation> + </message> + <message> + <source>No logins found</source> + <translation>Nessun login trovato</translation> + </message> + <message> + <source>Unknown error</source> + <translation>Errore sconosciuto</translation> + </message> + <message> + <source>Add a new entry to a database.</source> + <translation>Aggiungi una nuova voce al database.</translation> + </message> + <message> + <source>Path of the database.</source> + <translation>Percorso del database.</translation> + </message> + <message> + <source>Key file of the database.</source> + <translation>File chiave del database.</translation> + </message> + <message> + <source>path</source> + <translation>percorso</translation> + </message> + <message> + <source>Username for the entry.</source> + <translation>Nome utente della voce.</translation> + </message> + <message> + <source>username</source> + <translation>nome utente</translation> + </message> + <message> + <source>URL for the entry.</source> + <translation>URL della voce.</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Prompt for the entry's password.</source> + <translation>Richiedi la password della voce.</translation> + </message> + <message> + <source>Generate a password for the entry.</source> + <translation>Genera una password per questa voce.</translation> + </message> + <message> + <source>Length for the generated password.</source> + <translation>Lunghezza della password generata.</translation> + </message> + <message> + <source>length</source> + <translation>lunghezza</translation> + </message> + <message> + <source>Path of the entry to add.</source> + <translation>Percorso della voce da aggiungere.</translation> + </message> + <message> + <source>Copy an entry's password to the clipboard.</source> + <translation>Copia la password di una voce negli appunti.</translation> + </message> + <message> + <source>Path of the entry to clip.</source> + <comment>clip = copy to clipboard</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout in seconds before clearing the clipboard.</source> + <translation>Intervallo di tempo in secondi prima di ripulire gli appunti.</translation> + </message> + <message> + <source>Edit an entry.</source> + <translation>Modifica una voce.</translation> + </message> + <message> + <source>Title for the entry.</source> + <translation>Titolo di una voce.</translation> + </message> + <message> + <source>title</source> + <translation>titolo</translation> + </message> + <message> + <source>Path of the entry to edit.</source> + <translation>Percorso della voce da modificare.</translation> + </message> + <message> + <source>Estimate the entropy of a password.</source> + <translation>Stima l'entropia di una password.</translation> + </message> + <message> + <source>Password for which to estimate the entropy.</source> + <translation>Password di cui stimare l'entropia.</translation> + </message> + <message> + <source>Perform advanced analysis on the password.</source> + <translation>Esegui un'analisi avanzata sulla password.</translation> + </message> + <message> + <source>Extract and print the content of a database.</source> + <translation>Estrai e stampa il contenuto di un database.</translation> + </message> + <message> + <source>Path of the database to extract.</source> + <translation>Percorso del database da estrarre.</translation> + </message> + <message> + <source>Insert password to unlock %1: </source> + <translation>Inserisci la password per sbloccare %1:</translation> + </message> + <message> + <source>Failed to load key file %1 : %2</source> + <translation>Impossibile caricare il file chiave %1: %2</translation> + </message> + <message> + <source>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source> + +Available commands: +</source> + <translation> + +Comandi disponibili: +</translation> + </message> + <message> + <source>Name of the command to execute.</source> + <translation>Nome del comando da eseguire.</translation> + </message> + <message> + <source>List database entries.</source> + <translation>Elenco delle voci del database.</translation> + </message> + <message> + <source>Path of the group to list. Default is /</source> + <translation>Percorso del gruppo da elencare. L'impostazione predefinita è /</translation> + </message> + <message> + <source>Find entries quickly.</source> + <translation>Cerca voci rapidamente.</translation> + </message> + <message> + <source>Search term.</source> + <translation>Termine di ricerca.</translation> + </message> + <message> + <source>Merge two databases.</source> + <translation>Unisci due database.</translation> + </message> + <message> + <source>Path of the database to merge into.</source> + <translation>Percorso del database destinazione da unire.</translation> + </message> + <message> + <source>Path of the database to merge from.</source> + <translation>Percorso del database sorgente da unire.</translation> + </message> + <message> + <source>Use the same credentials for both database files.</source> + <translation>Usa le stesse credenziali per entrambi i file di database.</translation> + </message> + <message> + <source>Key file of the database to merge from.</source> + <translation>File chiave del database da unire</translation> + </message> + <message> + <source>Show an entry's information.</source> + <translation>Mostra la informazioni di una voce.</translation> + </message> + <message> + <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> + <translation type="unfinished"/> + </message> + <message> + <source>attribute</source> + <translation>attributo</translation> + </message> + <message> + <source>Name of the entry to show.</source> + <translation>Nome della voce da visualizzare.</translation> + </message> <message> <source>NULL device</source> <translation>Periferica NULL</translation> @@ -1869,8 +3300,28 @@ Modificale solo se sai quello che stai facendo.</translation> <translation>virgoletta di chiusura mancante</translation> </message> <message> - <source>INTERNAL - unget lower bound exceeded</source> - <translation>INTERNO - limite unget inferiore superato</translation> + <source>AES: 256-bit</source> + <translation>AES: 256 bit</translation> + </message> + <message> + <source>Twofish: 256-bit</source> + <translation>Twofish: 256 bit</translation> + </message> + <message> + <source>ChaCha20: 256-bit</source> + <translation>ChaCha20: 256 bit</translation> + </message> + <message> + <source>Argon2 (KDBX 4 – recommended)</source> + <translation>Argon2 (KDBX 4 – raccomandato)</translation> + </message> + <message> + <source>AES-KDF (KDBX 4)</source> + <translation>AES-KDF (KDBX 4)</translation> + </message> + <message> + <source>AES-KDF (KDBX 3.1)</source> + <translation>AES-KDF (KDBX 3.1)</translation> </message> <message> <source>Group</source> @@ -1888,21 +3339,29 @@ Modificale solo se sai quello che stai facendo.</translation> <source>Password</source> <translation>Password</translation> </message> - <message> - <source>URL</source> - <translation>URL</translation> - </message> <message> <source>Notes</source> <translation>Note</translation> </message> + <message> + <source>Last Modified</source> + <translation>Ultima modifica</translation> + </message> + <message> + <source>Created</source> + <translation>Creazione</translation> + </message> + <message> + <source>Legacy Browser Integration</source> + <translation type="unfinished"/> + </message> <message> <source>Browser Integration</source> <translation>Integrazione con i browser</translation> </message> <message> <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source> - <translation>YubiKey [%1] risposta di verifica - slot %2 - %3</translation> + <translation>Risposta di verifica da YubiKey[%1] - slot %2 - %3</translation> </message> <message> <source>Press</source> @@ -1912,6 +3371,10 @@ Modificale solo se sai quello che stai facendo.</translation> <source>Passive</source> <translation>Passiva</translation> </message> + <message> + <source>SSH Agent</source> + <translation>Agente SSH</translation> + </message> </context> <context> <name>QtIOCompressor</name> @@ -1925,7 +3388,7 @@ Modificale solo se sai quello che stai facendo.</translation> </message> <message> <source>Error opening underlying device: </source> - <translation>Errore durante l'apertura dal dispositivo: </translation> + <translation>Errore durante l'apertura del dispositivo: </translation> </message> <message> <source>Error reading data from underlying device: </source> @@ -1950,8 +3413,8 @@ Modificale solo se sai quello che stai facendo.</translation> <context> <name>SearchWidget</name> <message> - <source>Case Sensitive</source> - <translation>Sensibile maiuscole/minuscole</translation> + <source>Search...</source> + <translation>Ricerca...</translation> </message> <message> <source>Search</source> @@ -1962,8 +3425,8 @@ Modificale solo se sai quello che stai facendo.</translation> <translation>Azzera</translation> </message> <message> - <source>Search...</source> - <translation>Ricerca...</translation> + <source>Case Sensitive</source> + <translation>Distingui maiuscole</translation> </message> <message> <source>Limit search to selected group</source> @@ -1972,53 +3435,9 @@ Modificale solo se sai quello che stai facendo.</translation> </context> <context> <name>Service</name> - <message> - <source>A shared encryption-key with the name "%1" already exists. -Do you want to overwrite it?</source> - <translation>Una chiave di criptazione condivisa con il nome "%1" esiste già. -Vuoi sovrascriverla?</translation> - </message> - <message> - <source>Do you want to update the information in %1 - %2?</source> - <translation>Vuoi aggiornare le informazioni in %1 - %2?</translation> - </message> - <message> - <source>The active database is locked! -Please unlock the selected database or choose another one which is unlocked.</source> - <translation>Il database attivo è bloccato! -Sblocca il database selezionato o scegli un altro database sbloccato.</translation> - </message> - <message> - <source>Successfully removed %1 encryption-%2 from KeePassX/Http Settings.</source> - <translation>Rimosso correttamente %1 encryption-%2 dalle impostazioni KeePassX/Http.</translation> - </message> - <message> - <source>No shared encryption-keys found in KeePassHttp Settings.</source> - <translation>Nessuna chiave di criptazione condivisa è stata trovata nelle impostazioni di KeePassHttp.</translation> - </message> - <message> - <source>The active database does not contain an entry of KeePassHttp Settings.</source> - <translation>Il database attivo non contiene nessun elemento delle impostazioni di KeePassHttp.</translation> - </message> - <message> - <source>Removing stored permissions...</source> - <translation>Rimozione dei permessi salvati...</translation> - </message> - <message> - <source>Abort</source> - <translation>Annulla</translation> - </message> - <message> - <source>Successfully removed permissions from %1 %2.</source> - <translation>Permessi rimossi correttamente da %1 %2.</translation> - </message> - <message> - <source>The active database does not contain an entry with permissions.</source> - <translation>Il database attivo non contiene un elemento con permessi.</translation> - </message> <message> <source>KeePassXC: New key association request</source> - <translation>KeePassXC: Nuova richiesta di associazione chiave</translation> + <translation>KeePassXC: nuova richiesta di associazione chiave</translation> </message> <message> <source>You have received an association request for the above key. @@ -2030,35 +3449,79 @@ imposta un nome unico per identificarla ed accettarla.</translation> </message> <message> <source>KeePassXC: Overwrite existing key?</source> - <translation>KeePassXC- Vuoi sovrascrivere la chiave esistente?</translation> + <translation>KeePassXC: Vuoi sovrascrivere la chiave esistente?</translation> + </message> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>Una chiave di cifratura condivisa con il nome "%1" esiste già. +Vuoi sovrascriverla?</translation> </message> <message> <source>KeePassXC: Update Entry</source> - <translation>KeePassXC- Aggiorna elemento</translation> + <translation>KeePassXC: aggiorna voce</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Vuoi aggiornare le informazioni in %1 - %2?</translation> </message> <message> <source>KeePassXC: Database locked!</source> - <translation>KeePassXC- Database bloccato!</translation> + <translation>KeePassXC: database bloccato!</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>Il database attivo è bloccato! +Sblocca il database selezionato o scegline un altro che sia sbloccato.</translation> </message> <message> <source>KeePassXC: Removed keys from database</source> - <translation>KeePassXC - Chiavi rimosse dal database</translation> + <translation>KeePassXC: chiavi rimosse dal database</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> <message> <source>KeePassXC: No keys found</source> - <translation>KeePassXC - Nessuna chiave trovata</translation> + <translation>KeePassXC: nessuna chiave trovata</translation> + </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation>Nessun chiave condivisa di cifratura è stata trovata nelle impostazioni di KeePassHttp.</translation> </message> <message> <source>KeePassXC: Settings not available!</source> - <translation>KeePassXC - Impostazioni non disponibili!</translation> + <translation>KeePassXC: impostazioni non disponibili!</translation> + </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation>Il database attivo non contiene nessun voce delle impostazioni di KeePassHttp.</translation> + </message> + <message> + <source>Removing stored permissions...</source> + <translation>Rimozione dei permessi salvati...</translation> + </message> + <message> + <source>Abort</source> + <translation>Interrompi</translation> </message> <message> <source>KeePassXC: Removed permissions</source> - <translation>KeePassXC - Permessi rimossi</translation> + <translation>KeePassXC: permessi rimossi</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entries.</source> + <translation><numerusform>Permessi rimossi con successo da %n voce.</numerusform><numerusform>Permessi rimossi con successo da %n voci.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> - <translation>KeePassXC - Nessun elemento con permessi trovata!</translation> + <translation>KeePassXC: nessuna voce con permessi trovata!</translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>Il database attivo non contiene una voce con permessi.</translation> </message> </context> <context> @@ -2082,10 +3545,26 @@ imposta un nome unico per identificarla ed accettarla.</translation> </context> <context> <name>SettingsWidgetGeneral</name> + <message> + <source>Basic Settings</source> + <translation>Impostazioni di base</translation> + </message> + <message> + <source>Start only a single instance of KeePassXC</source> + <translation>Avvia una sola istanza di KeePassXC</translation> + </message> <message> <source>Remember last databases</source> <translation>Ricorda ultimo database</translation> </message> + <message> + <source>Remember last key files and security dongles</source> + <translation>Ricorda gli ultimi file chiave e dongle di sicurezza</translation> + </message> + <message> + <source>Load previous databases on startup</source> + <translation>Carica i database precedenti all'avvio</translation> + </message> <message> <source>Automatically save on exit</source> <translation>Salva automaticamente all'uscita</translation> @@ -2094,113 +3573,99 @@ imposta un nome unico per identificarla ed accettarla.</translation> <source>Automatically save after every change</source> <translation>Salva automaticamente dopo ogni modifica</translation> </message> - <message> - <source>Minimize when copying to clipboard</source> - <translation>Minimizza quando si copia negli Appunti</translation> - </message> - <message> - <source>Use group icon on entry creation</source> - <translation>Usa icona del gruppo alla creazione di un elemento</translation> - </message> - <message> - <source>Global Auto-Type shortcut</source> - <translation>Scorciatoia completamento automatico globale</translation> - </message> - <message> - <source>Language</source> - <translation>Lingua</translation> - </message> - <message> - <source>Show a system tray icon</source> - <translation>Visualizza un'icona nell'area di notifica del sistema</translation> - </message> - <message> - <source>Hide window to system tray when minimized</source> - <translation>Nascondi la finestra nell'area di notifica del sistema quando viene minimizzata</translation> - </message> - <message> - <source>Load previous databases on startup</source> - <translation>All'avvio carica i database precedenti</translation> - </message> <message> <source>Automatically reload the database when modified externally</source> <translation>Ricarica automaticamente il database quando ci sono modifiche esterne</translation> </message> <message> - <source>Hide window to system tray instead of app exit</source> - <translation>Nascondi la finestra nella barra di sistema invece di chiudere l'applicazione</translation> + <source>Minimize when copying to clipboard</source> + <translation>Minimizza quando si copia negli appunti</translation> </message> <message> <source>Minimize window at application startup</source> <translation>Minimizza la finestra all'avvio della applicazione</translation> </message> <message> - <source>Basic Settings</source> - <translation>Impostazioni di base</translation> - </message> - <message> - <source>Remember last key files and security dongles</source> - <translation>Ricorda gli ultimi file chiave e dongle di sicurezza</translation> + <source>Use group icon on entry creation</source> + <translation>Usa icona del gruppo alla creazione di una voce</translation> </message> <message> <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> <translation>Non contrassegnare il database come modificato per modifiche non riguardanti i dati (ad es. espansione dei gruppi)</translation> </message> + <message> + <source>Hide the Details view</source> + <translation>Nascondere la vista dei dettagli</translation> + </message> + <message> + <source>Show a system tray icon</source> + <translation>Visualizza un'icona nell'area di notifica di sistema</translation> + </message> + <message> + <source>Hide window to system tray when minimized</source> + <translation>Nascondi la finestra nell'area di notifica di sistema quando viene minimizzata</translation> + </message> + <message> + <source>Hide window to system tray instead of app exit</source> + <translation>Nascondi la finestra nell'area di notifica di sistema invece di chiudere l'applicazione</translation> + </message> + <message> + <source>Dark system tray icon</source> + <translation>Icona scura per l'area di notifica di sistema</translation> + </message> + <message> + <source>Language</source> + <translation>Lingua</translation> + </message> <message> <source>Auto-Type</source> <translation>Completamento automatico</translation> </message> <message> - <source>Use entry title and URL to match windows for global Auto-Type</source> - <translation>Usa il titolo dell'elemento e l'URL per abbinare le finestre per il completamento automatico globale</translation> + <source>Use entry title to match windows for global Auto-Type</source> + <translation>Usa il titolo della voce per la corrispondenza con le finestre per il completamento automatico globale</translation> + </message> + <message> + <source>Use entry URL to match windows for global Auto-Type</source> + <translation>Usa URL della voce per la corrispondenza con le finestre per il completamento automatico globale</translation> </message> <message> <source>Always ask before performing Auto-Type</source> <translation>Chiedi sempre prima di effettuare il completamento automatico</translation> </message> + <message> + <source>Global Auto-Type shortcut</source> + <translation>Scorciatoia globale per l'auto-completamento</translation> + </message> <message> <source>Auto-Type delay</source> <translation>Ritardo completamento automatico</translation> </message> <message> <source> ms</source> + <comment>Milliseconds</comment> <translation> ms</translation> </message> - <message> - <source>Start only a single instance of KeePassXC</source> - <translation>Avvia una sola istanza di KeePassXC</translation> - </message> </context> <context> <name>SettingsWidgetSecurity</name> + <message> + <source>Timeouts</source> + <translation>Timeout</translation> + </message> <message> <source>Clear clipboard after</source> - <translation>Svuota Appunti dopo</translation> + <translation>Svuota gli appunti dopo</translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation> sec</translation> </message> <message> <source>Lock databases after inactivity of</source> <translation>Blocca i database dopo un'inattività di</translation> </message> - <message> - <source>Show passwords in cleartext by default</source> - <translation>Visualizza la password in chiaro in maniera predefinita</translation> - </message> - <message> - <source>Lock databases after minimizing the window</source> - <translation>Blocca il database dopo la minimizzazione della finestra</translation> - </message> - <message> - <source>Don't require password repeat when it is visible</source> - <translation>Non richiedere di ripetere la password quando è visibile</translation> - </message> - <message> - <source>Timeouts</source> - <translation>Timeout</translation> - </message> <message> <source>Convenience</source> <translation>Comodità</translation> @@ -2209,9 +3674,29 @@ imposta un nome unico per identificarla ed accettarla.</translation> <source>Lock databases when session is locked or lid is closed</source> <translation>Blocca i database quando la sessione è bloccata o il coperchio è chiuso</translation> </message> + <message> + <source>Lock databases after minimizing the window</source> + <translation>Blocca il database dopo la minimizzazione della finestra</translation> + </message> + <message> + <source>Don't require password repeat when it is visible</source> + <translation>Non richiedere di ripetere la password quando è visibile</translation> + </message> + <message> + <source>Show passwords in cleartext by default</source> + <translation>Visualizza la password in chiaro in maniera predefinita</translation> + </message> + <message> + <source>Hide passwords in the preview panel</source> + <translation>Nascondere le password nel pannello di anteprima</translation> + </message> + <message> + <source>Hide entry notes by default</source> + <translation>Nascondere le note della voce per impostazione predefinita</translation> + </message> <message> <source>Privacy</source> - <translation>Privacy</translation> + <translation>Riservatezza</translation> </message> <message> <source>Use Google as fallback for downloading website icons</source> @@ -2228,6 +3713,14 @@ imposta un nome unico per identificarla ed accettarla.</translation> <source>Key:</source> <translation>Chiave:</translation> </message> + <message> + <source>Default RFC 6238 token settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Steam token settings</source> + <translation type="unfinished"/> + </message> <message> <source>Use custom settings</source> <translation>Usa le impostazioni personalizzate</translation> @@ -2254,6 +3747,7 @@ imposta un nome unico per identificarla ed accettarla.</translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation> sec</translation> </message> </context> @@ -2320,6 +3814,26 @@ imposta un nome unico per identificarla ed accettarla.</translation> </context> <context> <name>main</name> + <message> + <source>Remove an entry from the database.</source> + <translation>Rimuovi una voce dal database.</translation> + </message> + <message> + <source>Path of the database.</source> + <translation>Percorso del database.</translation> + </message> + <message> + <source>Path of the entry to remove.</source> + <translation>Percorso della voce da rimuovere.</translation> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation>KeePassXC - gestore di password multipiattaforma</translation> + </message> + <message> + <source>filenames of the password databases to open (*.kdbx)</source> + <translation>i nomi dei file di database delle password da aprire (*.kdbx)</translation> + </message> <message> <source>path to a custom config file</source> <translation>percorso ad un file di configurazione personalizzato</translation> @@ -2328,81 +3842,13 @@ imposta un nome unico per identificarla ed accettarla.</translation> <source>key file of the database</source> <translation>file chiave del database</translation> </message> - <message> - <source>KeePassXC - cross-platform password manager</source> - <translation>KeePassXC - Gestore password multipiattaforma</translation> - </message> <message> <source>read password of the database from stdin</source> <translation>leggi la password del database da stdin</translation> </message> <message> - <source>filenames of the password databases to open (*.kdbx)</source> - <translation>i nomi dei file dei database delle password da aprire (*.kdbx)</translation> - </message> - <message> - <source>Copy a password to the clipboard</source> - <translation>Copia una password negli Appunti</translation> - </message> - <message> - <source>Path of the database.</source> - <translation>Percorso del database.</translation> - </message> - <message> - <source>Use a GUI prompt unlocking the database.</source> - <translation>Usa una richiesta grafica per lo sblocco del database.</translation> - </message> - <message> - <source>Name of the entry to clip.</source> - <translation>Nome dell'elemento da tagliare.</translation> - </message> - <message> - <source>Extract and print the content of a database.</source> - <translation>Estrai e stampa il contenuto di un database.</translation> - </message> - <message> - <source>Path of the database to extract.</source> - <translation>Percorso del database da estrarre.</translation> - </message> - <message> - <source>Name of the command to execute.</source> - <translation>Nome del comando da eseguire.</translation> - </message> - <message> - <source>List database entries.</source> - <translation>Elenco degli elementi del database.</translation> - </message> - <message> - <source>Path of the group to list. Default is /</source> - <translation>Percorso del gruppo da elencare. L'impostazione predefinita è /</translation> - </message> - <message> - <source>Print the UUIDs of the entries and groups.</source> - <translation>Stampa gli UUID degli elementi e dei gruppi.</translation> - </message> - <message> - <source>Merge two databases.</source> - <translation>Unisci due database.</translation> - </message> - <message> - <source>Path of the database to merge into.</source> - <translation>Percorso del database destinazione da unire.</translation> - </message> - <message> - <source>Path of the database to merge from.</source> - <translation>Percorso del database sorgente da unire.</translation> - </message> - <message> - <source>Use the same password for both database files.</source> - <translation>Usa la stessa password per entrambi i file dei database.</translation> - </message> - <message> - <source>Show a password.</source> - <translation>Visualizza una password.</translation> - </message> - <message> - <source>Name of the entry to show.</source> - <translation>Nome dell'elemento da visualizzare.</translation> + <source>Parent window handle</source> + <translation type="unfinished"/> </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_ja.ts b/share/translations/keepassx_ja.ts index dd349640f..c2bf7e52c 100644 --- a/share/translations/keepassx_ja.ts +++ b/share/translations/keepassx_ja.ts @@ -9,14 +9,34 @@ <source>About</source> <translation>このソフトウェアについて</translation> </message> + <message> + <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> + <translation>バグ報告先: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> + </message> + <message> + <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>KeePassXC は GNU General Public License (GPL) version 2 または version 3 (どちらかを選択)の条件で配布されます。</translation> + </message> + <message> + <source>Project Maintainers:</source> + <translation>プロジェクトメンテナ:</translation> + </message> <message> <source>Contributors</source> <translation>貢献者</translation> </message> + <message> + <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">GitHub で貢献を確認する</a></translation> + </message> <message> <source>Debug Info</source> <translation>デバッグ情報</translation> </message> + <message> + <source>Include the following information whenever you report a bug:</source> + <translation>バグを報告する際に下記の情報を含めてください:</translation> + </message> <message> <source>Copy to clipboard</source> <translation>クリップボードにコピー</translation> @@ -31,6 +51,10 @@ <source>Revision: %1</source> <translation>リビジョン: %1</translation> </message> + <message> + <source>Distribution: %1</source> + <translation>配布形式: %1</translation> + </message> <message> <source>Libraries:</source> <translation>ライブラリ:</translation> @@ -47,33 +71,13 @@ CPU アーキテクチャ: %2 <source>Enabled extensions:</source> <translation>有効化された拡張機能:</translation> </message> - <message> - <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> - <translation>バグ報告先: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> - </message> - <message> - <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassXC は GNU General Public License (GPL) version 2 または version 3 (どちらかを選択)の条件で配布されます。</translation> - </message> - <message> - <source>Project Maintainers:</source> - <translation>プロジェクトメンテナ:</translation> - </message> - <message> - <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">GitHub で貢献を確認する</a></translation> - </message> - <message> - <source>Include the following information whenever you report a bug:</source> - <translation>バグを報告する際に下記の情報を含めてください:</translation> - </message> - <message> - <source>Distribution: %1</source> - <translation>配布形式: %1</translation> - </message> </context> <context> <name>AccessControlDialog</name> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>KeePassXC HTTP アクセス確認</translation> + </message> <message> <source>Remember this decision</source> <translation>この決定を記憶する</translation> @@ -92,9 +96,12 @@ Please select whether you want to allow access.</source> <translation>%1 が以下の項目のパスワードへのアクセスを要求しました。 アクセスを許可するかどうかを選択してください。</translation> </message> +</context> +<context> + <name>AgentSettingsWidget</name> <message> - <source>KeePassXC HTTP Confirm Access</source> - <translation>KeePassXC HTTP アクセス確認</translation> + <source>Enable SSH Agent (requires restart)</source> + <translation>SSH エージェントを有効にする (再起動が必要)</translation> </message> </context> <context> @@ -107,6 +114,26 @@ Please select whether you want to allow access.</source> <source>Auto-Type - KeePassXC</source> <translation>自動入力 - KeePassXC</translation> </message> + <message> + <source>Auto-Type</source> + <translation>自動入力</translation> + </message> + <message> + <source>The Syntax of your Auto-Type statement is incorrect!</source> + <translation>自動入力ステートメントの構文が正しくありません。</translation> + </message> + <message> + <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> + <translation>この自動入力コマンドは非常に長い遅延を含みます。本当に続行しますか?</translation> + </message> + <message> + <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> + <translation>この自動入力コマンドは非常に遅いキー押下を含みます。本当に続行しますか?</translation> + </message> + <message> + <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> </context> <context> <name>AutoTypeAssociationsModel</name> @@ -125,13 +152,294 @@ Please select whether you want to allow access.</source> </context> <context> <name>AutoTypeSelectDialog</name> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>自動入力 - KeePassXC</translation> + </message> <message> <source>Select entry to Auto-Type:</source> <translation>自動入力するエントリーを選択してください:</translation> </message> +</context> +<context> + <name>BrowserAccessControlDialog</name> <message> - <source>Auto-Type - KeePassXC</source> - <translation>自動入力 - KeePassXC</translation> + <source>KeePassXC-Browser Confirm Access</source> + <translation>KeePassXC-Browser アクセス確認</translation> + </message> + <message> + <source>Remember this decision</source> + <translation>この決定を記憶する</translation> + </message> + <message> + <source>Allow</source> + <translation>許可</translation> + </message> + <message> + <source>Deny</source> + <translation>拒否</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 が以下の項目のパスワードへのアクセスを要求しました。 +アクセスを許可するかどうかを選択してください。</translation> + </message> +</context> +<context> + <name>BrowserOptionDialog</name> + <message> + <source>Dialog</source> + <translation>ダイアログ</translation> + </message> + <message> + <source>This is required for accessing your databases with KeePassXC-Browser</source> + <translation>このオプションは KeePassXC-Browser からデータベースにアクセスするために必要です</translation> + </message> + <message> + <source>Enable KeepassXC browser integration</source> + <translation>KeepassXC のブラウザ統合を有効にする</translation> + </message> + <message> + <source>General</source> + <translation>一般</translation> + </message> + <message> + <source>Enable integration for these browsers:</source> + <translation>これらのブラウザの統合を有効にする:</translation> + </message> + <message> + <source>&Google Chrome</source> + <translation>Google Chrome(&G)</translation> + </message> + <message> + <source>&Firefox</source> + <translation>Firefox(&F)</translation> + </message> + <message> + <source>&Chromium</source> + <translation>Chromium(&C)</translation> + </message> + <message> + <source>&Vivaldi</source> + <translation>Vivaldi(&V)</translation> + </message> + <message> + <source>Show a &notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>クレデンシャルを要求された際に通知を表示する(&N)</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>データベースがロックされている場合はロックの解除を要求する(&Q)</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> + <translation>同じスキーム (http://, https://, ...) を持つエントリーのみが返されます。</translation> + </message> + <message> + <source>&Match URL scheme (e.g., https://...)</source> + <translation>URL スキーム (例えば https://...) のマッチ(&M)</translation> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>ドメイン全体にマッチする全てのエントリーの代わりに、特定の URL に最もマッチするエントリーのみが返されます。</translation> + </message> + <message> + <source>&Return only best-matching credentials</source> + <translation>最もマッチするクレデンシャルのみを返す(&R)</translation> + </message> + <message> + <source>Sort &matching credentials by title</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>マッチするクレデンシャルをタイトルで並べ替える(&M)</translation> + </message> + <message> + <source>Sort matching credentials by &username</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>マッチするクレデンシャルをユーザー名で並べ替える(&U)</translation> + </message> + <message> + <source>&Disconnect all browsers</source> + <translation>全てのブラウザの接続を断つ(&D)</translation> + </message> + <message> + <source>Forget all remembered &permissions</source> + <translation>記憶された全てのアクセス許可を破棄する(&P)</translation> + </message> + <message> + <source>Advanced</source> + <translation>詳細設定</translation> + </message> + <message> + <source>Never &ask before accessing credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>クレデンシャルにアクセスする前に確認しない(&A)</translation> + </message> + <message> + <source>Never ask before &updating credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>クレデンシャルをアップデートする前に確認しない(&U)</translation> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>選択されたデータベースのみがクライアントと接続する必要があります。</translation> + </message> + <message> + <source>Searc&h in all opened databases for matching credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>全ての開かれたデータベースからマッチするクレデンシャルを検索する(&H)</translation> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>文字列フィールドの自動作成や自動更新はサポートされていません。</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>"KPH: " から始まる拡張された文字列フィールドを返す(&R)</translation> + </message> + <message> + <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> + <translation>起動時に、KeePassXC または keepassxc-proxy のバイナリーパスを自動的に Native messaging スクリプトに更新します。</translation> + </message> + <message> + <source>Update &native messaging manifest files at startup</source> + <translation>起動時に Native messaging のマニフェストファイルを更新する(&N)</translation> + </message> + <message> + <source>Support a proxy application between KeePassXC and browser extension.</source> + <translation>KeePassXC とブラウザの拡張機能との間でプロキシアプリケーションをサポートします。</translation> + </message> + <message> + <source>Use a &proxy application between KeePassXC and browser extension</source> + <translation>KeePassXC とブラウザの拡張機能との間でプロキシアプリケーションを使用する(&P)</translation> + </message> + <message> + <source>Use a custom proxy location if you installed a proxy manually.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &custom proxy location</source> + <comment>Meant is the proxy for KeePassXC-Browser</comment> + <translation>カスタムプロキシを使用する(&C)</translation> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>参照...</translation> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation><b>警告:</b> 以下は危険なオプションです。</translation> + </message> + <message> + <source>Executable Files (*.exe);;All Files (*.*)</source> + <translation>実行ファイル (*.exe);;全てのファイル (*.*)</translation> + </message> + <message> + <source>Executable Files (*)</source> + <translation>実行ファイル (*)</translation> + </message> + <message> + <source>Select custom proxy location</source> + <translation>カスタムプロキシを選択する</translation> + </message> +</context> +<context> + <name>BrowserService</name> + <message> + <source>KeePassXC: New key association request</source> + <translation>KeePassXC: 新しいキーのアソシエーション要求</translation> + </message> + <message> + <source>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</source> + <translation>他のアプリケーションからのアソシエーション要求を受け取りました。 + +KeePassXC のデータベースへのアクセスを許可したい場合は、 +要求元を識別して受け入れるためのユニークな名前を付けてください。</translation> + </message> + <message> + <source>Save and allow access</source> + <translation>アクセスを許可して保存</translation> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: 既存のキーを上書きしますか?</translation> + </message> + <message> + <source>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>共有暗号化キー "%1" は既に存在します。 +上書きしますか?</translation> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: エントリーを更新</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>%1 - %2 の情報を更新しますか?</translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: データベースはロックされています</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>アクティブなデータベースがロックされています。 +選択されたデータベースのロックを解除するか、別のロックされていないデータベースを選択してください。</translation> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: 設定は利用できません</translation> + </message> + <message> + <source>The active database does not contain a settings entry.</source> + <translation>アクティブなデータベースに設定のエントリーが含まれていません。</translation> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: キーが見つかりません</translation> + </message> + <message> + <source>No shared encryption keys found in KeePassXC Settings.</source> + <translation>KeePassXC の設定内に共有暗号化キーは見つかりませんでした。</translation> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: データベースからキーが削除されました</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> + <translation><numerusform>KeePassXC の設定から %n 個の暗号化キーが無事に削除されました。</numerusform></translation> + </message> + <message> + <source>Removing stored permissions…</source> + <translation>保存されたアクセス許可を削除しています…</translation> + </message> + <message> + <source>Abort</source> + <translation>中止</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: アクセス許可が削除されました</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entry(s).</source> + <translation><numerusform>%n 個のエントリーから無事にアクセス許可が削除されました。</numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation>KeePassXC: アクセス許可があるエントリーは見つかりません</translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>アクティブなデータベースにはアクセス許可があるエントリーは含まれていません。</translation> </message> </context> <context> @@ -148,6 +456,10 @@ Please select whether you want to allow access.</source> <source>Repeat password:</source> <translation>パスワードを再入力:</translation> </message> + <message> + <source>&Key file</source> + <translation>キーファイル(&K)</translation> + </message> <message> <source>Browse</source> <translation>参照</translation> @@ -156,6 +468,14 @@ Please select whether you want to allow access.</source> <source>Create</source> <translation>作成</translation> </message> + <message> + <source>Cha&llenge Response</source> + <translation>チャレンジレスポンス(&L)</translation> + </message> + <message> + <source>Refresh</source> + <translation>再読み込み</translation> + </message> <message> <source>Key files</source> <translation>キーファイル</translation> @@ -176,6 +496,10 @@ Please select whether you want to allow access.</source> <source>Select a key file</source> <translation>キーファイルを選択</translation> </message> + <message> + <source>Empty password</source> + <translation>空パスワード</translation> + </message> <message> <source>Do you really want to use an empty string as password?</source> <translation>本当にパスワードとして空の文字列を使用しますか?</translation> @@ -191,20 +515,18 @@ Please select whether you want to allow access.</source> %2</translation> </message> <message> - <source>&Key file</source> - <translation>キーファイル(&K)</translation> + <source>Legacy key file format</source> + <translation>レガシーなキーファイル形式</translation> </message> <message> - <source>Cha&llenge Response</source> - <translation>チャレンジレスポンス(&L)</translation> - </message> - <message> - <source>Refresh</source> - <translation>再読み込み</translation> - </message> - <message> - <source>Empty password</source> - <translation>空パスワード</translation> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation>レガシーなキーファイル形式は、将来的に、 +サポートされなくなる可能性があります。 + +新しいキーファイルの生成を検討してください。</translation> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -217,6 +539,10 @@ Please select whether you want to allow access.</source> <source>Clone Options</source> <translation>複製のオプション</translation> </message> + <message> + <source>Append ' - Clone' to title</source> + <translation>タイトルに ' - 複製' を追加</translation> + </message> <message> <source>Replace username and password with references</source> <translation>ユーザー名とパスワードを参照で置き換える</translation> @@ -225,10 +551,6 @@ Please select whether you want to allow access.</source> <source>Copy history</source> <translation>履歴をコピー</translation> </message> - <message> - <source>Append ' - Clone' to title</source> - <translation>タイトルに ' - 複製' を追加</translation> - </message> </context> <context> <name>CsvImportWidget</name> @@ -325,10 +647,6 @@ Please select whether you want to allow access.</source> </context> <context> <name>CsvImportWizard</name> - <message> - <source>Import CSV file</source> - <translation>CSV ファイルをインポート</translation> - </message> <message> <source>Error</source> <translation>エラー</translation> @@ -340,17 +658,17 @@ Please select whether you want to allow access.</source> </context> <context> <name>CsvParserModel</name> - <message> - <source> byte, </source> - <translation>バイト、</translation> + <message numerus="yes"> + <source>%n byte(s), </source> + <translation><numerusform>%n バイト、</numerusform></translation> </message> - <message> - <source> rows, </source> - <translation>行、</translation> + <message numerus="yes"> + <source>%n row(s), </source> + <translation><numerusform>%n 行、</numerusform></translation> </message> - <message> - <source> columns</source> - <translation>列</translation> + <message numerus="yes"> + <source>%n column(s)</source> + <translation><numerusform>%n 列</numerusform></translation> </message> </context> <context> @@ -371,6 +689,14 @@ Please select whether you want to allow access.</source> <source>Browse</source> <translation>参照</translation> </message> + <message> + <source>Refresh</source> + <translation>再読み込み</translation> + </message> + <message> + <source>Challenge Response:</source> + <translation>チャレンジレスポンス:</translation> + </message> <message> <source>Unable to open the database.</source> <translation>データベースを開けませんでした。</translation> @@ -379,6 +705,24 @@ Please select whether you want to allow access.</source> <source>Can't open key file</source> <translation>キーファイルを開けませんでした</translation> </message> + <message> + <source>Legacy key file format</source> + <translation>レガシーなキーファイル形式</translation> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation>レガシーなキーファイル形式は、将来的に、 +サポートされなくなる可能性があります。 + +新しいキーファイルの生成を検討してください。</translation> + </message> + <message> + <source>Don't show this warning again</source> + <translation>今後この警告を表示しない</translation> + </message> <message> <source>All files</source> <translation>全てのファイル</translation> @@ -391,14 +735,6 @@ Please select whether you want to allow access.</source> <source>Select key file</source> <translation>キーファイルを選択</translation> </message> - <message> - <source>Refresh</source> - <translation>再読み込み</translation> - </message> - <message> - <source>Challenge Response:</source> - <translation>チャレンジレスポンス:</translation> - </message> </context> <context> <name>DatabaseRepairWidget</name> @@ -414,14 +750,14 @@ Please select whether you want to allow access.</source> <source>Can't open key file</source> <translation>キーファイルを開けませんでした</translation> </message> - <message> - <source>Database opened fine. Nothing to do.</source> - <translation>データベースは正常に開かれています。行うべきことはありません。</translation> - </message> <message> <source>Unable to open the database.</source> <translation>データベースを開けませんでした。</translation> </message> + <message> + <source>Database opened fine. Nothing to do.</source> + <translation>データベースは正常に開かれています。行うべきことはありません。</translation> + </message> <message> <source>Success</source> <translation>成功</translation> @@ -440,40 +776,61 @@ You can now save it.</source> <context> <name>DatabaseSettingsWidget</name> <message> - <source>Database name:</source> - <translation>データベース名:</translation> + <source>General</source> + <translation>一般</translation> </message> <message> - <source>Database description:</source> - <translation>データベースの概要:</translation> + <source>Encryption</source> + <translation>暗号化</translation> </message> <message> - <source>Transform rounds:</source> - <translation>変換回数:</translation> + <source>Number of rounds too high</source> + <comment>Key transformation rounds</comment> + <translation>ラウンド数が大きすぎます</translation> </message> <message> - <source>Default username:</source> - <translation>デフォルトのユーザー名:</translation> + <source>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</source> + <translation>Argon2 のキー変換ラウンド数に非常に大きな値を使用しています。 + +この値を維持すると、データベースを開くのに数時間または数日 (もしくはそれ以上) かかる可能性があります。</translation> </message> <message> - <source> MiB</source> - <translation> MiB</translation> + <source>Understood, keep number</source> + <translation>理解した上で値を維持する</translation> </message> <message> - <source>Benchmark</source> - <translation>ベンチマーク</translation> + <source>Cancel</source> + <translation>キャンセル</translation> </message> <message> - <source>Max. history items:</source> - <translation>最大履歴数:</translation> + <source>Number of rounds too low</source> + <comment>Key transformation rounds</comment> + <translation>ラウンド数が小さすぎます</translation> </message> <message> - <source>Max. history size:</source> - <translation>最大履歴データサイズ:</translation> + <source>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</source> + <translation>AES-KDF のキー変換ラウンド数に非常に小さな値を使用しています。 + +この値を維持すると、データベースが簡単にクラックされる可能性があります。</translation> </message> <message> - <source>Use recycle bin</source> - <translation>ゴミ箱を使用する</translation> + <source>KDF unchanged</source> + <translation>KDF は変更されません</translation> + </message> + <message> + <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> + <translation>新しい KDF のパラメーターでのキー変換に失敗しました。KDF は変更されません。</translation> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetEncryption</name> + <message> + <source>Encryption Algorithm:</source> + <translation>暗号化アルゴリズム:</translation> </message> <message> <source>AES: 256 Bit (default)</source> @@ -484,14 +841,78 @@ You can now save it.</source> <translation>Twofish: 256 ビット</translation> </message> <message> - <source>Algorithm:</source> - <translation>アルゴリズム:</translation> + <source>Key Derivation Function:</source> + <translation>鍵導出関数:</translation> + </message> + <message> + <source>Transform rounds:</source> + <translation>変換回数:</translation> + </message> + <message> + <source>Benchmark 1-second delay</source> + <translation type="unfinished"/> + </message> + <message> + <source>Memory Usage:</source> + <translation>メモリ使用量:</translation> + </message> + <message> + <source> MB</source> + <translation> MB</translation> + </message> + <message> + <source>Parallelism:</source> + <translation>並列処理:</translation> + </message> + <message> + <source> thread</source> + <translation> スレッド</translation> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetGeneral</name> + <message> + <source>Database Meta Data</source> + <translation>データベースのメタデータ</translation> + </message> + <message> + <source>Database name:</source> + <translation>データベース名:</translation> + </message> + <message> + <source>Database description:</source> + <translation>データベースの概要:</translation> + </message> + <message> + <source>Default username:</source> + <translation>デフォルトのユーザー名:</translation> + </message> + <message> + <source>History Settings</source> + <translation>履歴の設定</translation> + </message> + <message> + <source>Max. history items:</source> + <translation>最大履歴数:</translation> + </message> + <message> + <source>Max. history size:</source> + <translation>最大履歴データサイズ:</translation> + </message> + <message> + <source> MiB</source> + <translation> MiB</translation> + </message> + <message> + <source>Use recycle bin</source> + <translation>ゴミ箱を使用する</translation> </message> </context> <context> <name>DatabaseTabWidget</name> <message> <source>Root</source> + <comment>Root group</comment> <translation>ルート</translation> </message> <message> @@ -510,6 +931,30 @@ You can now save it.</source> <source>File not found!</source> <translation>ファイルが見つかりません</translation> </message> + <message> + <source>Unable to open the database.</source> + <translation>データベースを開けませんでした。</translation> + </message> + <message> + <source>File opened in read only mode.</source> + <translation>読み取り専用でファイルを開きました。</translation> + </message> + <message> + <source>Open CSV file</source> + <translation>CSV ファイルを開く</translation> + </message> + <message> + <source>CSV file</source> + <translation>CSV ファイル</translation> + </message> + <message> + <source>All files (*)</source> + <translation>全てのファイル (*)</translation> + </message> + <message> + <source>Merge database</source> + <translation>データベースをマージする</translation> + </message> <message> <source>Open KeePass 1 database</source> <translation>KeePass 1 データベースを開く</translation> @@ -518,14 +963,16 @@ You can now save it.</source> <source>KeePass 1 database</source> <translation>KeePass 1 データベース</translation> </message> - <message> - <source>All files (*)</source> - <translation>全てのファイル (*)</translation> - </message> <message> <source>Close?</source> <translation>閉じますか?</translation> </message> + <message> + <source>"%1" is in edit mode. +Discard changes and close anyway?</source> + <translation>"%1" は現在編集モードです。 +変更を破棄して閉じてしまってもよろしいですか?</translation> + </message> <message> <source>Save changes?</source> <translation>変更を保存しますか?</translation> @@ -538,15 +985,27 @@ Save changes?</source> </message> <message> <source>Writing the database failed.</source> - <translation>データベースが保存できませんでした。</translation> + <translation>データベースの書き込みに失敗しました。</translation> + </message> + <message> + <source>Passwords</source> + <translation>パスワード</translation> </message> <message> <source>Save database as</source> - <translation>データベースを別名で保存</translation> + <translation>ファイル名をつけてデータベースを保存</translation> + </message> + <message> + <source>Export database to CSV file</source> + <translation>データベースを CSV ファイルにエクスポートする</translation> + </message> + <message> + <source>Writing the CSV file failed.</source> + <translation>CSV ファイルの書き込みに失敗しました。</translation> </message> <message> <source>New database</source> - <translation>新しいデータベース</translation> + <translation>新規データベース</translation> </message> <message> <source>locked</source> @@ -561,12 +1020,6 @@ Save changes?</source> Please press cancel to finish your changes or discard them.</source> <translation>現在編集中のため、データベースをロックすることができませんでした。 キャンセルボタンを押し、変更を完了させるか破棄してください。</translation> - </message> - <message> - <source>This database has never been saved. -You can save the database or stop locking it.</source> - <translation>このデータベースは一度も保存されていません。 -データベースを保存してロックを解除してください。</translation> </message> <message> <source>This database has been modified. @@ -576,68 +1029,13 @@ Otherwise your changes are lost.</source> ロックを行う前にデータベースを保存しますか? 保存しない場合には変更点は失われます。</translation> </message> - <message> - <source>"%1" is in edit mode. -Discard changes and close anyway?</source> - <translation>"%1" は現在編集モードです。 -変更を破棄して閉じてしまってもよろしいですか?</translation> - </message> - <message> - <source>Export database to CSV file</source> - <translation>データベースを CSV ファイルにエクスポートする</translation> - </message> - <message> - <source>CSV file</source> - <translation>CSV ファイル</translation> - </message> - <message> - <source>Writing the CSV file failed.</source> - <translation>CSV ファイルの書き込みに失敗しました。</translation> - </message> - <message> - <source>Unable to open the database.</source> - <translation>データベースを開けませんでした。</translation> - </message> - <message> - <source>Merge database</source> - <translation>データベースをマージする</translation> - </message> - <message> - <source>The database you are trying to save as is locked by another instance of KeePassXC. -Do you want to save it anyway?</source> - <translation>保存しようとしたデータベースは KeePassXC の別インスタンスによってロックされています。 -強制的に保存しますか?</translation> - </message> - <message> - <source>Passwords</source> - <translation>パスワード</translation> - </message> - <message> - <source>Database already opened</source> - <translation>データベースを既に開いています</translation> - </message> - <message> - <source>The database you are trying to open is locked by another instance of KeePassXC. - -Do you want to open it anyway?</source> - <translation>開こうとしたデータベースは KeePassXC の別インスタンスによってロックされています。 -強制的に開きますか?</translation> - </message> - <message> - <source>Open read-only</source> - <translation>読み取り専用で開く</translation> - </message> - <message> - <source>File opened in read only mode.</source> - <translation>読み取り専用でファイルを開きました。</translation> - </message> - <message> - <source>Open CSV file</source> - <translation>CSV ファイルを開く</translation> - </message> </context> <context> <name>DatabaseWidget</name> + <message> + <source>Searching...</source> + <translation>検索中…</translation> + </message> <message> <source>Change master key</source> <translation>マスターキーを変更</translation> @@ -658,6 +1056,14 @@ Do you want to open it anyway?</source> <source>Do you really want to delete %1 entries for good?</source> <translation>本当に %1 個のエントリーを永久に削除しますか?</translation> </message> + <message> + <source>Move entry to recycle bin?</source> + <translation>エントリーをゴミ箱に移動しますか?</translation> + </message> + <message> + <source>Do you really want to move entry "%1" to the recycle bin?</source> + <translation>本当にエントリー "%1" をゴミ箱に移動しますか?</translation> + </message> <message> <source>Move entries to recycle bin?</source> <translation>エントリーをゴミ箱に移動しますか?</translation> @@ -666,6 +1072,18 @@ Do you want to open it anyway?</source> <source>Do you really want to move %n entry(s) to the recycle bin?</source> <translation><numerusform>本当に %n 個のエントリーをゴミ箱に移動しますか?</numerusform></translation> </message> + <message> + <source>Execute command?</source> + <translation>コマンドを実行しますか?</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation>本当に次のコマンドを実行しますか?<br><br>%1<br></translation> + </message> + <message> + <source>Remember my choice</source> + <translation>選択を記憶する</translation> + </message> <message> <source>Delete group?</source> <translation>グループを削除しますか?</translation> @@ -676,19 +1094,7 @@ Do you want to open it anyway?</source> </message> <message> <source>Unable to calculate master key</source> - <translation>マスターキーを計算できませんでした</translation> - </message> - <message> - <source>Move entry to recycle bin?</source> - <translation>エントリーをゴミ箱に移動しますか?</translation> - </message> - <message> - <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation>本当にエントリー "%1" をゴミ箱に移動しますか?</translation> - </message> - <message> - <source>Searching...</source> - <translation>検索中…</translation> + <translation>マスターキーを計算できません</translation> </message> <message> <source>No current database.</source> @@ -707,20 +1113,8 @@ Do you want to open it anyway?</source> <translation>見つかりません</translation> </message> <message> - <source>Execute command?</source> - <translation>コマンドを実行しますか?</translation> - </message> - <message> - <source>Do you really want to execute the following command?<br><br>%1<br></source> - <translation>本当に次のコマンドを実行しますか?<br><br>%1<br></translation> - </message> - <message> - <source>Remember my choice</source> - <translation>選択を記憶する</translation> - </message> - <message> - <source>Autoreload Request</source> - <translation>自動再読み込みリクエスト</translation> + <source>File has changed</source> + <translation>ファイルが変更されました</translation> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -731,8 +1125,10 @@ Do you want to open it anyway?</source> <translation>マージリクエスト</translation> </message> <message> - <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> - <translation>データベースファイルが変更され、未保存の変更があります。変更をマージしますか?</translation> + <source>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</source> + <translation>データベースファイルが変更され、未保存の変更があります。 +変更をマージしますか?</translation> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -747,6 +1143,89 @@ Do you want to open it anyway?</source> <translation>ゴミ箱にある全項目を永久に削除してもよろしいですか?</translation> </message> </context> +<context> + <name>DetailsWidget</name> + <message> + <source>Generate TOTP Token</source> + <translation>TOTP トークンを生成</translation> + </message> + <message> + <source>Close</source> + <translation>閉じる</translation> + </message> + <message> + <source>General</source> + <translation>一般</translation> + </message> + <message> + <source>Password</source> + <translation>パスワード</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Expiration</source> + <translation>有効期限</translation> + </message> + <message> + <source>Username</source> + <translation>ユーザー名</translation> + </message> + <message> + <source>Autotype</source> + <translation>自動入力</translation> + </message> + <message> + <source>Searching</source> + <translation>検索</translation> + </message> + <message> + <source>Attributes</source> + <translation>属性</translation> + </message> + <message> + <source>Attachments</source> + <translation>添付ファイル</translation> + </message> + <message> + <source>Notes</source> + <translation>メモ</translation> + </message> + <message> + <source>Window</source> + <translation>ウィンドウ</translation> + </message> + <message> + <source>Sequence</source> + <translation>シーケンス</translation> + </message> + <message> + <source>Search</source> + <translation>検索</translation> + </message> + <message> + <source>Clear</source> + <translation>消去</translation> + </message> + <message> + <source>Never</source> + <translation>なし</translation> + </message> + <message> + <source>[PROTECTED]</source> + <translation>[保護]</translation> + </message> + <message> + <source>Disabled</source> + <translation>無効</translation> + </message> + <message> + <source>Enabled</source> + <translation>有効</translation> + </message> +</context> <context> <name>EditEntryWidget</name> <message> @@ -773,6 +1252,30 @@ Do you want to open it anyway?</source> <source>History</source> <translation>履歴</translation> </message> + <message> + <source>SSH Agent</source> + <translation>SSH エージェント</translation> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>(encrypted)</source> + <translation>(暗号化)</translation> + </message> + <message> + <source>Select private key</source> + <translation>私有鍵を選択</translation> + </message> + <message> + <source>File too large to be a private key</source> + <translation>ファイルが大きすぎるため私有鍵にできません</translation> + </message> + <message> + <source>Failed to open private key</source> + <translation>私有鍵を開くのに失敗しました</translation> + </message> <message> <source>Entry history</source> <translation>エントリーの履歴</translation> @@ -793,40 +1296,6 @@ Do you want to open it anyway?</source> <source>New attribute</source> <translation>新しい属性</translation> </message> - <message> - <source>Select file</source> - <translation>ファイルを選択</translation> - </message> - <message> - <source>Unable to open file</source> - <translation>ファイルを開けませんでした</translation> - </message> - <message> - <source>Save attachment</source> - <translation>添付を保存</translation> - </message> - <message> - <source>Unable to save the attachment: -</source> - <translation>添付を保存できませんでした: -</translation> - </message> - <message> - <source>Tomorrow</source> - <translation>明日</translation> - </message> - <message numerus="yes"> - <source>%n week(s)</source> - <translation><numerusform>%n週間</numerusform></translation> - </message> - <message numerus="yes"> - <source>%n month(s)</source> - <translation><numerusform>%nヶ月</numerusform></translation> - </message> - <message> - <source>1 year</source> - <translation>1年</translation> - </message> <message> <source>Confirm Remove</source> <translation>削除の確認</translation> @@ -836,12 +1305,28 @@ Do you want to open it anyway?</source> <translation>この属性を削除してもよろしいですか?</translation> </message> <message> - <source>[PROTECTED] Press reveal to view or edit</source> - <translation>[保護] 表示または編集する場合は開示をクリックしてください</translation> + <source>[PROTECTED]</source> + <translation>[保護]</translation> </message> <message> - <source>Are you sure you want to remove this attachment?</source> - <translation>この添付を削除してもよろしいですか?</translation> + <source>Press reveal to view or edit</source> + <translation>表示または編集する場合は開示をクリックしてください</translation> + </message> + <message> + <source>Tomorrow</source> + <translation>明日</translation> + </message> + <message numerus="yes"> + <source>%n week(s)</source> + <translation><numerusform>%n 週間</numerusform></translation> + </message> + <message numerus="yes"> + <source>%n month(s)</source> + <translation><numerusform>%n ヶ月</numerusform></translation> + </message> + <message> + <source>1 year</source> + <translation>1年</translation> </message> </context> <context> @@ -858,18 +1343,6 @@ Do you want to open it anyway?</source> <source>Remove</source> <translation>削除</translation> </message> - <message> - <source>Attachments</source> - <translation>添付ファイル</translation> - </message> - <message> - <source>Save</source> - <translation>保存</translation> - </message> - <message> - <source>Open</source> - <translation>開く</translation> - </message> <message> <source>Edit Name</source> <translation>名前を編集</translation> @@ -882,6 +1355,10 @@ Do you want to open it anyway?</source> <source>Reveal</source> <translation>開示</translation> </message> + <message> + <source>Attachments</source> + <translation>添付ファイル</translation> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -889,6 +1366,18 @@ Do you want to open it anyway?</source> <source>Enable Auto-Type for this entry</source> <translation>このエントリーの自動入力を有効にする</translation> </message> + <message> + <source>Inherit default Auto-Type sequence from the &group</source> + <translation>自動入力シーケンスをグループから引き継ぐ(&G)</translation> + </message> + <message> + <source>&Use custom Auto-Type sequence:</source> + <translation>カスタムした自動入力シーケンスを使用する(&U):</translation> + </message> + <message> + <source>Window Associations</source> + <translation>ウィンドウの関連付け</translation> + </message> <message> <source>+</source> <translation>+</translation> @@ -901,14 +1390,6 @@ Do you want to open it anyway?</source> <source>Window title:</source> <translation>ウィンドウタイトル:</translation> </message> - <message> - <source>Inherit default Auto-Type sequence from the &group</source> - <translation>自動入力シーケンスをグループから引き継ぐ(&G)</translation> - </message> - <message> - <source>&Use custom Auto-Type sequence:</source> - <translation>カスタムした自動入力シーケンスを使用する(&U):</translation> - </message> <message> <source>Use default se&quence</source> <translation>デフォルトのシーケンスを使用する(&Q)</translation> @@ -917,10 +1398,6 @@ Do you want to open it anyway?</source> <source>Set custo&m sequence:</source> <translation>カスタムしたシーケンスを設定する(&M):</translation> </message> - <message> - <source>Window Associations</source> - <translation>ウィンドウの関連付け</translation> - </message> </context> <context> <name>EditEntryWidgetHistory</name> @@ -944,12 +1421,8 @@ Do you want to open it anyway?</source> <context> <name>EditEntryWidgetMain</name> <message> - <source>Title:</source> - <translation>タイトル:</translation> - </message> - <message> - <source>Username:</source> - <translation>ユーザー名:</translation> + <source>URL:</source> + <translation>URL:</translation> </message> <message> <source>Password:</source> @@ -960,20 +1433,104 @@ Do you want to open it anyway?</source> <translation>パスワード確認:</translation> </message> <message> - <source>URL:</source> - <translation>URL:</translation> + <source>Title:</source> + <translation>タイトル:</translation> </message> <message> - <source>Expires</source> - <translation>期限</translation> + <source>Notes</source> + <translation>メモ</translation> </message> <message> <source>Presets</source> <translation>プリセット</translation> </message> <message> - <source>Notes:</source> - <translation>メモ:</translation> + <source>Toggle the checkbox to reveal the notes section.</source> + <translation>チェックボックスを切り替えるとメモを表示します。</translation> + </message> + <message> + <source>Username:</source> + <translation>ユーザー名:</translation> + </message> + <message> + <source>Expires</source> + <translation>期限</translation> + </message> +</context> +<context> + <name>EditEntryWidgetSSHAgent</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent after</source> + <translation>次の時間が過ぎたらエージェントからキーを削除</translation> + </message> + <message> + <source> seconds</source> + <translation> 秒</translation> + </message> + <message> + <source>Fingerprint</source> + <translation>フィンガープリント</translation> + </message> + <message> + <source>Remove key from agent when database is closed/locked</source> + <translation>データベースが閉じられたりロックされた際にエージェントからキーを削除する</translation> + </message> + <message> + <source>Public key</source> + <translation>公開鍵</translation> + </message> + <message> + <source>Add key to agent when database is opened/unlocked</source> + <translation>データベースが開かれたりロックが解除された際にエージェントにキーを追加する</translation> + </message> + <message> + <source>Comment</source> + <translation>コメント</translation> + </message> + <message> + <source>Decrypt</source> + <translation>復号</translation> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy to clipboard</source> + <translation>クリップボードにコピー</translation> + </message> + <message> + <source>Private key</source> + <translation>私有鍵</translation> + </message> + <message> + <source>External file</source> + <translation>外部ファイル</translation> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>参照...</translation> + </message> + <message> + <source>Attachment</source> + <translation>添付ファイル</translation> + </message> + <message> + <source>Add to agent</source> + <translation>エージェントに追加</translation> + </message> + <message> + <source>Remove from agent</source> + <translation>エージェントから削除</translation> + </message> + <message> + <source>Require user confirmation when this key is used</source> + <translation>このキーが使用される際にユーザーの確認を必要とする</translation> </message> </context> <context> @@ -1015,7 +1572,7 @@ Do you want to open it anyway?</source> <name>EditGroupWidgetMain</name> <message> <source>Name</source> - <translation>グループ名</translation> + <translation>名前</translation> </message> <message> <source>Notes</source> @@ -1044,6 +1601,14 @@ Do you want to open it anyway?</source> </context> <context> <name>EditWidgetIcons</name> + <message> + <source>&Use default icon</source> + <translation>デフォルトアイコンから選択(&U)</translation> + </message> + <message> + <source>Use custo&m icon</source> + <translation>カスタムアイコンから選択(&M)</translation> + </message> <message> <source>Add custom icon</source> <translation>カスタムアイコンを追加</translation> @@ -1052,6 +1617,18 @@ Do you want to open it anyway?</source> <source>Delete custom icon</source> <translation>カスタムアイコンを削除</translation> </message> + <message> + <source>Download favicon</source> + <translation>ファビコンをダウンロード</translation> + </message> + <message> + <source>Unable to fetch favicon.</source> + <translation>ファビコンを取得できません。</translation> + </message> + <message> + <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> + <translation>ヒント: ツール > 設定 > セキュリティから Google をフォールバックとして有効にすることができます</translation> + </message> <message> <source>Images</source> <translation>画像</translation> @@ -1064,25 +1641,13 @@ Do you want to open it anyway?</source> <source>Select Image</source> <translation>画像を選択</translation> </message> - <message> - <source>Download favicon</source> - <translation>ファビコンをダウンロード</translation> - </message> - <message> - <source>Unable to fetch favicon.</source> - <translation>ファビコンを取得できません。</translation> - </message> <message> <source>Can't read icon</source> <translation>アイコンを読み取ることができません</translation> </message> <message> - <source>&Use default icon</source> - <translation>デフォルトアイコンから選択(&U)</translation> - </message> - <message> - <source>Use custo&m icon</source> - <translation>カスタムアイコンから選択(&M)</translation> + <source>Custom icon already exists</source> + <translation>カスタムアイコンは既に存在します</translation> </message> <message> <source>Confirm Delete</source> @@ -1092,14 +1657,6 @@ Do you want to open it anyway?</source> <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> <translation>このアイコンは %1 個のエントリーで使用されており、デフォルトのアイコンに置き換えられます。本当に削除してもよろしいですか?</translation> </message> - <message> - <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation>ヒント: ツール > 設定 > セキュリティから Google をフォールバックとして有効にすることができます</translation> - </message> - <message> - <source>Custom icon already exists</source> - <translation>カスタムアイコンは既に存在します</translation> - </message> </context> <context> <name>EditWidgetProperties</name> @@ -1124,9 +1681,98 @@ Do you want to open it anyway?</source> <name>Entry</name> <message> <source> - Clone</source> + <comment>Suffix added to cloned entries</comment> <translation> - 複製</translation> </message> </context> +<context> + <name>EntryAttachmentsModel</name> + <message> + <source>Name</source> + <translation>名前</translation> + </message> + <message> + <source>Size</source> + <translation>サイズ</translation> + </message> +</context> +<context> + <name>EntryAttachmentsWidget</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add</source> + <translation>追加</translation> + </message> + <message> + <source>Remove</source> + <translation>削除</translation> + </message> + <message> + <source>Open</source> + <translation>開く</translation> + </message> + <message> + <source>Save</source> + <translation>保存</translation> + </message> + <message> + <source>Select files</source> + <translation>ファイルを選択</translation> + </message> + <message numerus="yes"> + <source>Are you sure you want to remove %n attachment(s)?</source> + <translation><numerusform>%n 個の添付を削除してもよろしいですか?</numerusform></translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>削除の確認</translation> + </message> + <message> + <source>Save attachments</source> + <translation>添付を保存</translation> + </message> + <message> + <source>Unable to create directory: +%1</source> + <translation>ディレクトリを作成できませんでした: +%1</translation> + </message> + <message> + <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> + <translation>既存のファイル "%1" を上書きしてもよろしいですか?</translation> + </message> + <message> + <source>Confirm overwrite</source> + <translation>上書きの確認</translation> + </message> + <message> + <source>Unable to save attachments: +%1</source> + <translation>添付を保存できませんでした: +%1</translation> + </message> + <message> + <source>Unable to open attachment: +%1</source> + <translation>添付を開けませんでした: +%1</translation> + </message> + <message> + <source>Unable to open attachments: +%1</source> + <translation>添付を開けませんでした: +%1</translation> + </message> + <message> + <source>Unable to open files: +%1</source> + <translation>ファイルを開けませんでした: +%1</translation> + </message> +</context> <context> <name>EntryAttributesModel</name> <message> @@ -1155,6 +1801,11 @@ Do you want to open it anyway?</source> </context> <context> <name>EntryModel</name> + <message> + <source>Ref: </source> + <comment>Reference abbreviation</comment> + <translation>参照:</translation> + </message> <message> <source>Group</source> <translation>グループ</translation> @@ -1171,11 +1822,6 @@ Do you want to open it anyway?</source> <source>URL</source> <translation>URL</translation> </message> - <message> - <source>Ref: </source> - <comment>Reference abbreviation</comment> - <translation>参照:</translation> - </message> </context> <context> <name>Group</name> @@ -1184,6 +1830,17 @@ Do you want to open it anyway?</source> <translation>ゴミ箱</translation> </message> </context> +<context> + <name>HostInstaller</name> + <message> + <source>KeePassXC: Cannot save file!</source> + <translation>KeePassXC: ファイルを保存できません</translation> + </message> + <message> + <source>Cannot save the native messaging script file.</source> + <translation>Native messaging スクリプトファイルを保存できません。</translation> + </message> +</context> <context> <name>HttpPasswordGeneratorWidget</name> <message> @@ -1246,6 +1903,361 @@ Do you want to open it anyway?</source> <translation>メッセージを閉じる</translation> </message> </context> +<context> + <name>Kdbx3Reader</name> + <message> + <source>Unable to calculate master key</source> + <translation>マスターキーを計算できません</translation> + </message> + <message> + <source>Unable to issue challenge-response.</source> + <translation>チャレンジレスポンスを発行することができません。</translation> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>キーが間違っているかデータベースファイルが破損しています。</translation> + </message> +</context> +<context> + <name>Kdbx3Writer</name> + <message> + <source>Unable to issue challenge-response.</source> + <translation>チャレンジレスポンスを発行することができません。</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>マスターキーを計算できません</translation> + </message> +</context> +<context> + <name>Kdbx4Reader</name> + <message> + <source>missing database headers</source> + <translation>データベースのヘッダーがありません</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>マスターキーを計算できません</translation> + </message> + <message> + <source>Invalid header checksum size</source> + <translation>ヘッダーのチェックサムのサイズが不正です</translation> + </message> + <message> + <source>Header SHA256 mismatch</source> + <translation>ヘッダー SHA256 が一致しません</translation> + </message> + <message> + <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> + <translation>キーが間違っているかデータベースファイルが破損しています (HMAC の不一致)。</translation> + </message> + <message> + <source>Unknown cipher</source> + <translation>不明な暗号です</translation> + </message> + <message> + <source>Invalid header id size</source> + <translation>ヘッダー ID サイズが不正です</translation> + </message> + <message> + <source>Invalid header field length</source> + <translation>ヘッダーフィールド長が不正です</translation> + </message> + <message> + <source>Invalid header data length</source> + <translation>ヘッダーデータ長が不正です</translation> + </message> + <message> + <source>Failed to open buffer for KDF parameters in header</source> + <translation>ヘッダーの KDF パラメーターのバッファーを開くのに失敗しました</translation> + </message> + <message> + <source>Unsupported key derivation function (KDF) or invalid parameters</source> + <translation>サポートしていない鍵導出関数 (KDF) または不正なパラメーターです</translation> + </message> + <message> + <source>Legacy header fields found in KDBX4 file.</source> + <translation>KDBX4 ファイル内にレガシーなヘッダーフィールドが見つかりました。</translation> + </message> + <message> + <source>Invalid inner header id size</source> + <translation>内部ヘッダー ID サイズが不正です</translation> + </message> + <message> + <source>Invalid inner header field length</source> + <translation>内部ヘッダーフィールド長が不正です</translation> + </message> + <message> + <source>Invalid inner header binary size</source> + <translation>内部ヘッダーバイナリーサイズが不正です</translation> + </message> + <message> + <source>Unsupported KeePass variant map version.</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>サポートしていないバージョンの KeePass VariantMap です。</translation> + </message> + <message> + <source>Invalid variant map entry name length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>VariantMap のエントリー名の長さが不正です</translation> + </message> + <message> + <source>Invalid variant map entry name data</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>VariantMap のエントリー名データが不正です</translation> + </message> + <message> + <source>Invalid variant map entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>VariantMap のエントリー値の長さが不正です</translation> + </message> + <message> + <source>Invalid variant map entry value data</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation>VariantMap のエントリー値データが不正です</translation> + </message> + <message> + <source>Invalid variant map Bool entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>VariantMap の Bool エントリー値の長さが不正です</translation> + </message> + <message> + <source>Invalid variant map Int32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>VariantMap の Int32 エントリー値の長さが不正です</translation> + </message> + <message> + <source>Invalid variant map UInt32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>VariantMap の UInt32 エントリー値の長さが不正です</translation> + </message> + <message> + <source>Invalid variant map Int64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>VariantMap の Int64 エントリー値の長さが不正です</translation> + </message> + <message> + <source>Invalid variant map UInt64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>VariantMap の UInt64 エントリー値の長さが不正です</translation> + </message> + <message> + <source>Invalid variant map entry type</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>VariantMap のエントリータイプが不正です</translation> + </message> + <message> + <source>Invalid variant map field type size</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>VariantMap のフィールドタイプのサイズが不正です</translation> + </message> +</context> +<context> + <name>Kdbx4Writer</name> + <message> + <source>Invalid symmetric cipher algorithm.</source> + <translation>対称暗号アルゴリズムが不正です。</translation> + </message> + <message> + <source>Invalid symmetric cipher IV size.</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation>対称暗号の初期化ベクトルのサイズが不正です。</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>マスターキーを計算できません</translation> + </message> + <message> + <source>Failed to serialize KDF parameters variant map</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation>KDF パラメーター VariantMap のシリアル化に失敗しました</translation> + </message> +</context> +<context> + <name>KdbxReader</name> + <message> + <source>Invalid cipher uuid length</source> + <translation>暗号の UUID の長さが不正です</translation> + </message> + <message> + <source>Unsupported cipher</source> + <translation>サポートしていない暗号です</translation> + </message> + <message> + <source>Invalid compression flags length</source> + <translation>圧縮フラグの長さが不正です</translation> + </message> + <message> + <source>Unsupported compression algorithm</source> + <translation>サポートしていない圧縮アルゴリズムです</translation> + </message> + <message> + <source>Invalid master seed size</source> + <translation>Master Seed のサイズが不正です</translation> + </message> + <message> + <source>Invalid transform seed size</source> + <translation>Transform Seed のサイズが不正です</translation> + </message> + <message> + <source>Invalid transform rounds size</source> + <translation>変換回数のサイズが不正です</translation> + </message> + <message> + <source>Invalid start bytes size</source> + <translation>StreamStartBytes のサイズが不正です</translation> + </message> + <message> + <source>Invalid random stream id size</source> + <translation>Random Stream ID のサイズが不正です</translation> + </message> + <message> + <source>Invalid inner random stream cipher</source> + <translation>内部 Random Stream 暗号が不正です</translation> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>KeePass データベースではありません。</translation> + </message> + <message> + <source>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> + <translation>選択されたファイルは古い KeePass 1 のデータベース (.kdb) です。 + +データベース > 'KeePass 1 データベースをインポート...' をクリックすることでインポートできます。 +これは一方向の移行操作であり、インポートされたデータベースは古い KeePassX 0.4 のバージョンでは開くことはできません。</translation> + </message> + <message> + <source>Unsupported KeePass 2 database version.</source> + <translation>サポートしていないバージョンの KeePass 2 データベースです。</translation> + </message> +</context> +<context> + <name>KdbxXmlReader</name> + <message> + <source>XML parsing failure: %1</source> + <translation>XML の構文解析エラー: %1</translation> + </message> + <message> + <source>No root group</source> + <translation>ルートグループがありません</translation> + </message> + <message> + <source>Missing icon uuid or data</source> + <translation>アイコンの UUID またはデータがありません</translation> + </message> + <message> + <source>Missing custom data key or value</source> + <translation>カスタムデータの Key または Value がありません</translation> + </message> + <message> + <source>Multiple group elements</source> + <translation>グループ要素が複数あります</translation> + </message> + <message> + <source>Null group uuid</source> + <translation>グループの UUID が NULL です</translation> + </message> + <message> + <source>Invalid group icon number</source> + <translation>グループアイコン番号が不正です</translation> + </message> + <message> + <source>Invalid EnableAutoType value</source> + <translation>EnableAutoType の値が不正です</translation> + </message> + <message> + <source>Invalid EnableSearching value</source> + <translation>EnableSearching の値が不正です</translation> + </message> + <message> + <source>No group uuid found</source> + <translation>グループの UUID がありません</translation> + </message> + <message> + <source>Null DeleteObject uuid</source> + <translation>DeletedObject の UUID が NULL です</translation> + </message> + <message> + <source>Missing DeletedObject uuid or time</source> + <translation>DeletedObject の UUID または DeletionTime がありません</translation> + </message> + <message> + <source>Null entry uuid</source> + <translation>エントリーの UUID が NULL です</translation> + </message> + <message> + <source>Invalid entry icon number</source> + <translation>エントリーアイコン番号が不正です</translation> + </message> + <message> + <source>History element in history entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>No entry uuid found</source> + <translation>エントリーの UUID が見つかりません</translation> + </message> + <message> + <source>History element with different uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decrypt entry string</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate custom attribute found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry string key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate attachment found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry binary key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-type association window or sequence missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid bool value</source> + <translation>真偽値が不正です</translation> + </message> + <message> + <source>Invalid date time value</source> + <translation>日時が不正です</translation> + </message> + <message> + <source>Invalid color value</source> + <translation>色が不正です</translation> + </message> + <message> + <source>Invalid color rgb part</source> + <translation>色の RGB が不正です</translation> + </message> + <message> + <source>Invalid number value</source> + <translation>数値が不正です</translation> + </message> + <message> + <source>Invalid uuid value</source> + <translation>UUID の値が不正です</translation> + </message> + <message> + <source>Unable to decompress binary</source> + <extracomment>Translator meant is a binary data inside an entry</extracomment> + <translation type="unfinished"/> + </message> +</context> <context> <name>KeePass1OpenWidget</name> <message> @@ -1275,72 +2287,145 @@ Do you want to open it anyway?</source> <source>Unsupported KeePass database version.</source> <translation>サポートしていないバージョンの KeePass データベースです。</translation> </message> + <message> + <source>Unable to read encryption IV</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of groups</source> + <translation>グループの数が不正です</translation> + </message> + <message> + <source>Invalid number of entries</source> + <translation>エントリーの数が不正です</translation> + </message> + <message> + <source>Invalid content hash size</source> + <translation>コンテンツハッシュサイズが無効です</translation> + </message> + <message> + <source>Invalid transform seed size</source> + <translation>Transform Seed のサイズが不正です</translation> + </message> + <message> + <source>Invalid number of transform rounds</source> + <translation>変換回数の数が不正です</translation> + </message> + <message> + <source>Unable to construct group tree</source> + <translation type="unfinished"/> + </message> <message> <source>Root</source> <translation>ルート</translation> </message> <message> <source>Unable to calculate master key</source> - <translation>マスターキーを計算できませんでした</translation> - </message> - <message> - <source>Wrong key or database file is corrupt.</source> - <translation>キーが間違っているかデータベースファイルが破損しています。</translation> - </message> -</context> -<context> - <name>KeePass2Reader</name> - <message> - <source>Not a KeePass database.</source> - <translation>KeePass データベースではありません。</translation> - </message> - <message> - <source>Unsupported KeePass database version.</source> - <translation>サポートしていないバージョンの KeePass データベースです。</translation> + <translation>マスターキーを計算できません</translation> </message> <message> <source>Wrong key or database file is corrupt.</source> <translation>キーが間違っているかデータベースファイルが破損しています。</translation> </message> <message> - <source>Unable to calculate master key</source> - <translation>マスターキーを計算できません</translation> + <source>Key transformation failed</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to issue challenge-response.</source> - <translation>チャレンジレスポンスを発行することができません。</translation> + <source>Invalid group field type number</source> + <translation>グループフィールドタイプの数が不正です</translation> </message> <message> - <source>The selected file is an old KeePass 1 database (.kdb). - -You can import it by clicking on Database > 'Import KeePass 1 database...'. -This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> - <translation>選択されたファイルは古い KeePass 1 のデータベース (.kdb) です。 - -データベース > 'KeePass 1 データベースをインポート...' をクリックすることでインポートできます。 -これは一方向の移行操作であり、インポートされたデータベースは古い KeePassX 0.4 のバージョンでは開くことはできません。</translation> - </message> -</context> -<context> - <name>KeePass2Writer</name> - <message> - <source>Unable to issue challenge-response.</source> - <translation>チャレンジレスポンスを発行することができません。</translation> + <source>Invalid group field size</source> + <translation>グループフィールドのサイズが不正です</translation> </message> <message> - <source>Unable to calculate master key</source> - <translation>マスターキーを計算できません</translation> + <source>Read group field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group access time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group level field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type</source> + <translation>グループフィールドのタイプが不正です</translation> + </message> + <message> + <source>Missing group id or level</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing entry field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field size</source> + <translation>エントリーフィールドのサイズが不正です</translation> + </message> + <message> + <source>Read entry field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry uuid field size</source> + <translation>エントリーの UUID フィールドのサイズが不正です</translation> + </message> + <message> + <source>Invalid entry group id field size</source> + <translation>エントリーのグループ ID フィールドのサイズが不正です</translation> + </message> + <message> + <source>Invalid entry icon field size</source> + <translation>エントリーのアイコンフィールドのサイズが不正です</translation> + </message> + <message> + <source>Invalid entry creation time field size</source> + <translation>エントリーの作成日時フィールドのサイズが不正です</translation> + </message> + <message> + <source>Invalid entry modification time field size</source> + <translation>エントリーの編集日時フィールドのサイズが不正です</translation> + </message> + <message> + <source>Invalid entry expiry time field size</source> + <translation>エントリーの有効期限フィールドのサイズが不正です</translation> + </message> + <message> + <source>Invalid entry field type</source> + <translation>エントリーのフィールドタイプが不正です</translation> </message> </context> <context> <name>Main</name> <message> - <source>Fatal error while testing the cryptographic functions.</source> - <translation>暗号化機能のテスト中に致命的なエラーが発生しました。</translation> - </message> - <message> - <source>KeePassXC - Error</source> - <translation>KeePassXC - エラー</translation> + <source>Existing single-instance lock file is invalid. Launching new instance.</source> + <translation>既存のシングルインスタンスロックファイルは無効です。新しいインスタンスを起動します。</translation> </message> <message> <source>The lock file could not be created. Single-instance mode disabled.</source> @@ -1351,64 +2436,32 @@ This is a one-way migration. You won't be able to open the imported databas <translation>KeePassXC の別インスタンスが既に起動しています。</translation> </message> <message> - <source>Existing single-instance lock file is invalid. Launching new instance.</source> - <translation>既存のシングルインスタンスロックファイルは無効です。新しいインスタンスを起動します。</translation> + <source>Fatal error while testing the cryptographic functions.</source> + <translation>暗号化機能のテスト中に致命的なエラーが発生しました。</translation> + </message> + <message> + <source>KeePassXC - Error</source> + <translation>KeePassXC - エラー</translation> </message> </context> <context> <name>MainWindow</name> <message> - <source>Open database</source> - <translation>データベースを開く</translation> - </message> - <message> - <source>Database settings</source> - <translation>データベースの設定</translation> - </message> - <message> - <source>Copy username to clipboard</source> - <translation>ユーザー名をコピー</translation> - </message> - <message> - <source>Copy password to clipboard</source> - <translation>パスワードをコピー</translation> - </message> - <message> - <source>Settings</source> - <translation>設定</translation> - </message> - <message> - <source>Show toolbar</source> - <translation>ツールバーを表示</translation> - </message> - <message> - <source>read-only</source> - <translation>読み取り専用</translation> - </message> - <message> - <source>Toggle window</source> - <translation>ウィンドウ切替</translation> - </message> - <message> - <source>KeePass 2 Database</source> - <translation>KeePass 2 データベース</translation> - </message> - <message> - <source>All files</source> - <translation>全てのファイル</translation> - </message> - <message> - <source>Save repaired database</source> - <translation>修復されたデータベースを保存する</translation> - </message> - <message> - <source>Writing the database failed.</source> - <translation>データベースの書き込みに失敗しました。</translation> + <source>&Database</source> + <translation>データベース(&D)</translation> </message> <message> <source>&Recent databases</source> <translation>最近使用したデータベース(&R)</translation> </message> + <message> + <source>Import</source> + <translation>インポート</translation> + </message> + <message> + <source>&Help</source> + <translation>ヘルプ(&H)</translation> + </message> <message> <source>E&ntries</source> <translation>エントリー(&N)</translation> @@ -1417,13 +2470,17 @@ This is a one-way migration. You won't be able to open the imported databas <source>Copy att&ribute to clipboard</source> <translation>クリップボードにコピー(&R)</translation> </message> + <message> + <source>Time-based one-time password</source> + <translation type="unfinished"/> + </message> <message> <source>&Groups</source> <translation>グループ(&G)</translation> </message> <message> - <source>&View</source> - <translation>表示(&V)</translation> + <source>&Tools</source> + <translation>ツール(&T)</translation> </message> <message> <source>&Quit</source> @@ -1433,6 +2490,10 @@ This is a one-way migration. You won't be able to open the imported databas <source>&About</source> <translation>このソフトウェアについて(&A)</translation> </message> + <message> + <source>&Open database...</source> + <translation>データベースを開く(&O)...</translation> + </message> <message> <source>&Save database</source> <translation>データベースを保存(&S)</translation> @@ -1473,26 +2534,26 @@ This is a one-way migration. You won't be able to open the imported databas <source>&Delete group</source> <translation>グループを削除(&D)</translation> </message> + <message> + <source>Sa&ve database as...</source> + <translation>データベースを別名で保存(&V)...</translation> + </message> + <message> + <source>Change &master key...</source> + <translation>マスターキーを変更(&M)...</translation> + </message> <message> <source>&Database settings</source> <translation>データベースの設定(&D)</translation> </message> + <message> + <source>Database settings</source> + <translation>データベースの設定</translation> + </message> <message> <source>&Clone entry</source> <translation>エントリーを複製(&C)</translation> </message> - <message> - <source>Timed one-time password</source> - <translation>時限ワンタイムパスワード</translation> - </message> - <message> - <source>Copy &TOTP</source> - <translation>TOTP をコピー(&T)</translation> - </message> - <message> - <source>Show TOTP</source> - <translation>TOTP を表示</translation> - </message> <message> <source>&Find</source> <translation>検索(&F)</translation> @@ -1501,14 +2562,26 @@ This is a one-way migration. You won't be able to open the imported databas <source>Copy &username</source> <translation>ユーザー名をコピー(&U)</translation> </message> + <message> + <source>Copy username to clipboard</source> + <translation>ユーザー名をコピー</translation> + </message> <message> <source>Cop&y password</source> <translation>パスワードをコピー(&Y)</translation> </message> + <message> + <source>Copy password to clipboard</source> + <translation>パスワードをコピー</translation> + </message> <message> <source>&Settings</source> <translation>設定(&S)</translation> </message> + <message> + <source>Password Generator</source> + <translation>パスワード生成</translation> + </message> <message> <source>&Perform Auto-Type</source> <translation>自動入力を実行(&P)</translation> @@ -1525,65 +2598,25 @@ This is a one-way migration. You won't be able to open the imported databas <source>&Title</source> <translation>タイトル(&T)</translation> </message> + <message> + <source>Copy title to clipboard</source> + <translation>タイトルをコピー</translation> + </message> <message> <source>&URL</source> <translation>URL(&U)</translation> </message> + <message> + <source>Copy URL to clipboard</source> + <translation>URL をコピー</translation> + </message> <message> <source>&Notes</source> <translation>メモ(&N)</translation> </message> <message> - <source>Password Generator</source> - <translation>パスワード生成</translation> - </message> - <message> - <source>Clear history</source> - <translation>履歴を消去</translation> - </message> - <message> - <source>&Database</source> - <translation>データベース(&D)</translation> - </message> - <message> - <source>Import</source> - <translation>インポート</translation> - </message> - <message> - <source>&Tools</source> - <translation>ツール(&T)</translation> - </message> - <message> - <source>Empty recycle bin</source> - <translation>ゴミ箱を空にする</translation> - </message> - <message> - <source>Access error for config file %1</source> - <translation>設定ファイル %1 へのアクセスエラー</translation> - </message> - <message> - <source>Quit KeePassXC</source> - <translation>KeePassXC を終了</translation> - </message> - <message> - <source>Please touch the button on your YubiKey!</source> - <translation>YubiKey のボタンにタッチしてください</translation> - </message> - <message> - <source>&Help</source> - <translation>ヘルプ(&H)</translation> - </message> - <message> - <source>&Open database...</source> - <translation>データベースを開く(&O)...</translation> - </message> - <message> - <source>Sa&ve database as...</source> - <translation>データベースを別名で保存(&V)...</translation> - </message> - <message> - <source>Change &master key...</source> - <translation>マスターキーを変更(&M)...</translation> + <source>Copy notes to clipboard</source> + <translation>メモをコピー</translation> </message> <message> <source>&Export to CSV file...</source> @@ -1601,10 +2634,169 @@ This is a one-way migration. You won't be able to open the imported databas <source>Re&pair database...</source> <translation>データベースを修復(&P)...</translation> </message> + <message> + <source>Show TOTP</source> + <translation>TOTP を表示</translation> + </message> <message> <source>Set up TOTP...</source> <translation>TOTP の設定...</translation> </message> + <message> + <source>Copy &TOTP</source> + <translation>TOTP をコピー(&T)</translation> + </message> + <message> + <source>E&mpty recycle bin</source> + <translation>ゴミ箱を空にする(&M)</translation> + </message> + <message> + <source>Clear history</source> + <translation>履歴を消去</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation>設定ファイル %1 へのアクセスエラー</translation> + </message> + <message> + <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> + <translation type="unfinished"/> + </message> + <message> + <source>read-only</source> + <translation>読み取り専用</translation> + </message> + <message> + <source>Settings</source> + <translation>設定</translation> + </message> + <message> + <source>Toggle window</source> + <translation>ウィンドウ切替</translation> + </message> + <message> + <source>Quit KeePassXC</source> + <translation>KeePassXC を終了</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>KeePass 2 データベース</translation> + </message> + <message> + <source>All files</source> + <translation>全てのファイル</translation> + </message> + <message> + <source>Open database</source> + <translation>データベースを開く</translation> + </message> + <message> + <source>Save repaired database</source> + <translation>修復されたデータベースを保存する</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>データベースの書き込みに失敗しました。</translation> + </message> + <message> + <source>Please touch the button on your YubiKey!</source> + <translation>YubiKey のボタンにタッチしてください</translation> + </message> +</context> +<context> + <name>OpenSSHKey</name> + <message> + <source>Invalid key file, expecting an OpenSSH key</source> + <translation>OpenSSH の鍵ファイルではありません</translation> + </message> + <message> + <source>PEM boundary mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>This is not an OpenSSH key, only modern keys are supported</source> + <translation type="unfinished"/> + </message> + <message> + <source>Base64 decoding failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file way too small.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file magic header id invalid</source> + <translation>キーファイルのマジックヘッダー ID が不正です</translation> + </message> + <message> + <source>Found zero keys</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to read public key.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Corrupted key file, reading private key failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>No private key payload to decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Trying to run KDF without cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Passphrase is required to decrypt this key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key derivation failed, key file corrupted?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Decryption failed, wrong passphrase?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write public key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write private key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing private key</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OptionDialog</name> @@ -1612,21 +2804,62 @@ This is a one-way migration. You won't be able to open the imported databas <source>Dialog</source> <translation>ダイアログ</translation> </message> + <message> + <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation>このオプションは ChromeIPass や PassIFox からデータベースにアクセスするために必要です</translation> + </message> + <message> + <source>Enable KeePassHTTP server</source> + <translation>KeePassHTTP サーバーを有効にする</translation> + </message> <message> <source>General</source> <translation>一般</translation> </message> <message> <source>Sh&ow a notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> <translation>クレデンシャルを要求された際に通知を表示する(&O)</translation> </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>ドメイン全体にマッチする全てのエントリーの代わりに、特定の URL に最もマッチするエントリーのみが返されます。</translation> + </message> + <message> + <source>&Return only best matching entries</source> + <translation>最もマッチするエントリーのみを返す(&R)</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>データベースがロックされている場合はロックの解除を要求する(&Q)</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> + <translation>同じスキーム (http://, https://, ftp://, ...) を持つエントリーのみが返されます。</translation> + </message> + <message> + <source>&Match URL schemes</source> + <translation>URL スキームのマッチ(&M)</translation> + </message> <message> <source>Sort matching entries by &username</source> <translation>マッチするエントリーをユーザー名で並べ替える(&U)</translation> </message> + <message> + <source>Sort &matching entries by title</source> + <translation>マッチするエントリーをタイトルで並べ替える(&M)</translation> + </message> + <message> + <source>R&emove all shared encryption keys from active database</source> + <translation>アクティブなデータベースから共有暗号化キーを全て削除する(&E)</translation> + </message> <message> <source>Re&move all stored permissions from entries in active database</source> - <translation>アクティブなデータベースのエントリーに保存されたアクセス許可をすべて削除する(&M)</translation> + <translation>アクティブなデータベースのエントリーに保存されたアクセス許可を全て削除する(&M)</translation> + </message> + <message> + <source>Password Generator</source> + <translation>パスワード生成</translation> </message> <message> <source>Advanced</source> @@ -1640,9 +2873,21 @@ This is a one-way migration. You won't be able to open the imported databas <source>Always allow &updating entries</source> <translation>常にエントリーの更新を許可する(&U)</translation> </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>選択されたデータベースのみがクライアントと接続する必要があります。</translation> + </message> <message> <source>Searc&h in all opened databases for matching entries</source> - <translation>すべての開かれたデータベースからマッチするエントリーを検索する(&H)</translation> + <translation>全ての開かれたデータベースからマッチするエントリーを検索する(&H)</translation> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>文字列フィールドの自動作成や自動更新はサポートされていません。</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>"KPH: " から始まる拡張された文字列フィールドを返す(&R)</translation> </message> <message> <source>HTTP Port:</source> @@ -1652,18 +2897,18 @@ This is a one-way migration. You won't be able to open the imported databas <source>Default port: 19455</source> <translation>デフォルトのポート: 19455</translation> </message> - <message> - <source>Re&quest to unlock the database if it is locked</source> - <translation>データベースがロックされている場合はロックの解除を要求する(&Q)</translation> - </message> - <message> - <source>Sort &matching entries by title</source> - <translation>マッチするエントリーをタイトルで並べ替える(&M)</translation> - </message> <message> <source>KeePassXC will listen to this port on 127.0.0.1</source> <translation>KeePassXC は 127.0.0.1 のこのポートをリッスンします</translation> </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation><b>警告:</b> 以下は危険なオプションです。</translation> + </message> + <message> + <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> + <translation type="unfinished"/> + </message> <message> <source>Cannot bind to privileged ports</source> <translation>特権ポートにバインドできません</translation> @@ -1674,63 +2919,30 @@ Using default port 19455.</source> <translation>1024 以下の特権ポートにバインドできません。 デフォルトのポート 19455 を使用します。</translation> </message> - <message> - <source>R&emove all shared encryption keys from active database</source> - <translation>アクティブなデータベースから共有暗号化キーをすべて削除する(&E)</translation> - </message> - <message> - <source>&Return advanced string fields which start with "KPH: "</source> - <translation>"KPH: " から始まる拡張された文字列フィールドを返す(&R)</translation> - </message> - <message> - <source>Automatically creating or updating string fields is not supported.</source> - <translation>文字列フィールドの自動作成や自動更新はサポートされていません。</translation> - </message> - <message> - <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> - <translation>このオプションは ChromeIPass や PassIFox からデータベースにアクセスするために必要です</translation> - </message> - <message> - <source>Enable KeePassHTTP server</source> - <translation>KeePassHTTP サーバーを有効にする</translation> - </message> - <message> - <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation>ドメイン全体にマッチするすべてのエントリーの代わりに、特定の URL に最もマッチするエントリーのみが返されます。</translation> - </message> - <message> - <source>&Return only best matching entries</source> - <translation>最もマッチするエントリーのみを返す(&R)</translation> - </message> - <message> - <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation>同じスキーム (http://, https://, ftp://, ...) を持つエントリーのみが返されます。</translation> - </message> - <message> - <source>&Match URL schemes</source> - <translation>URL スキームのマッチ(&M)</translation> - </message> - <message> - <source>Password Generator</source> - <translation>パスワード生成</translation> - </message> - <message> - <source>Only the selected database has to be connected with a client.</source> - <translation>選択されたデータベースのみがクライアントと接続する必要があります。</translation> - </message> - <message> - <source>The following options can be dangerous! -Change them only if you know what you are doing.</source> - <translation>以下は危険なオプションです。 -設定の内容を理解している場合にのみ、変更を行ってください。</translation> - </message> </context> <context> <name>PasswordGeneratorWidget</name> + <message> + <source>%p%</source> + <translation>%p%</translation> + </message> <message> <source>Password:</source> <translation>パスワード:</translation> </message> + <message> + <source>strength</source> + <comment>Password strength</comment> + <translation>強度</translation> + </message> + <message> + <source>entropy</source> + <translation>エントロピー</translation> + </message> + <message> + <source>Password</source> + <translation>パスワード</translation> + </message> <message> <source>Character Types</source> <translation>文字種</translation> @@ -1751,38 +2963,50 @@ Change them only if you know what you are doing.</source> <source>Special Characters</source> <translation>特殊な文字</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>拡張 ASCII</translation> + </message> <message> <source>Exclude look-alike characters</source> <translation>よく似た文字を除外する</translation> </message> <message> - <source>Accept</source> - <translation>適用</translation> - </message> - <message> - <source>%p%</source> - <translation>%p%</translation> - </message> - <message> - <source>strength</source> - <translation>強度</translation> - </message> - <message> - <source>entropy</source> - <translation>エントロピー</translation> + <source>Pick characters from every group</source> + <translation>全ての使用する文字種から文字を選ぶ</translation> </message> <message> <source>&Length:</source> <translation>長さ(&L):</translation> </message> <message> - <source>Pick characters from every group</source> - <translation>すべての使用する文字種から文字を選ぶ</translation> + <source>Passphrase</source> + <translation>パスフレーズ</translation> + </message> + <message> + <source>Wordlist:</source> + <translation>単語リスト:</translation> + </message> + <message> + <source>Word Count:</source> + <translation>単語数:</translation> + </message> + <message> + <source>Word Separator:</source> + <translation>単語の区切り文字:</translation> </message> <message> <source>Generate</source> <translation>生成</translation> </message> + <message> + <source>Copy</source> + <translation>コピー</translation> + </message> + <message> + <source>Accept</source> + <translation>適用</translation> + </message> <message> <source>Close</source> <translation>閉じる</translation> @@ -1801,51 +3025,273 @@ Change them only if you know what you are doing.</source> </message> <message> <source>Poor</source> + <comment>Password quality</comment> <translation>貧弱</translation> </message> <message> <source>Weak</source> + <comment>Password quality</comment> <translation>弱い</translation> </message> <message> <source>Good</source> + <comment>Password quality</comment> <translation>良い</translation> </message> <message> <source>Excellent</source> + <comment>Password quality</comment> <translation>すばらしい</translation> </message> - <message> - <source>Password</source> - <translation>パスワード</translation> - </message> - <message> - <source>Extended ASCII</source> - <translation>拡張 ASCII</translation> - </message> - <message> - <source>Passphrase</source> - <translation>パスフレーズ</translation> - </message> - <message> - <source>Wordlist:</source> - <translation>単語リスト:</translation> - </message> - <message> - <source>Word Count:</source> - <translation>単語数:</translation> - </message> - <message> - <source>Word Separator:</source> - <translation>単語の区切り文字:</translation> - </message> - <message> - <source>Copy</source> - <translation>コピー</translation> - </message> </context> <context> <name>QObject</name> + <message> + <source>Database not opened</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database hash not available</source> + <translation type="unfinished"/> + </message> + <message> + <source>Client public key not received</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot decrypt message</source> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout or cannot connect to KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>Action cancelled or denied</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC association failed, try again</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key change was not successful</source> + <translation type="unfinished"/> + </message> + <message> + <source>Encryption key is not recognized</source> + <translation type="unfinished"/> + </message> + <message> + <source>No saved databases found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect action</source> + <translation type="unfinished"/> + </message> + <message> + <source>Empty message received</source> + <translation type="unfinished"/> + </message> + <message> + <source>No URL provided</source> + <translation type="unfinished"/> + </message> + <message> + <source>No logins found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown error</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add a new entry to a database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>データベースのパス。</translation> + </message> + <message> + <source>Key file of the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>path</source> + <translation>パス</translation> + </message> + <message> + <source>Username for the entry.</source> + <translation>エントリーのユーザー名。</translation> + </message> + <message> + <source>username</source> + <translation>ユーザー名</translation> + </message> + <message> + <source>URL for the entry.</source> + <translation>エントリーの URL。</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Prompt for the entry's password.</source> + <translation>エントリーのパスワードを要求する。</translation> + </message> + <message> + <source>Generate a password for the entry.</source> + <translation>エントリーのパスワードを生成する。</translation> + </message> + <message> + <source>Length for the generated password.</source> + <translation>生成するパスワードの長さ。</translation> + </message> + <message> + <source>length</source> + <translation>長さ</translation> + </message> + <message> + <source>Path of the entry to add.</source> + <translation>追加するエントリーのパス。</translation> + </message> + <message> + <source>Copy an entry's password to the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to clip.</source> + <comment>clip = copy to clipboard</comment> + <translation>クリップするエントリーのパス。</translation> + </message> + <message> + <source>Timeout in seconds before clearing the clipboard.</source> + <translation>クリップボードを消去するまでの時間 (秒)</translation> + </message> + <message> + <source>Edit an entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Title for the entry.</source> + <translation>エントリーのタイトル。</translation> + </message> + <message> + <source>title</source> + <translation>タイトル</translation> + </message> + <message> + <source>Path of the entry to edit.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Estimate the entropy of a password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password for which to estimate the entropy.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Perform advanced analysis on the password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Extract and print the content of a database.</source> + <translation>データベースの内容を展開して出力する。</translation> + </message> + <message> + <source>Path of the database to extract.</source> + <translation>展開するデータベースのパス。</translation> + </message> + <message> + <source>Insert password to unlock %1: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to load key file %1 : %2</source> + <translation type="unfinished"/> + </message> + <message> + <source>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation>警告: レガシーなキーファイル形式は、将来的に、 +サポートされなくなる可能性があります。 + +新しいキーファイルの生成を検討してください。</translation> + </message> + <message> + <source> + +Available commands: +</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the command to execute.</source> + <translation>実行するコマンドの名前。</translation> + </message> + <message> + <source>List database entries.</source> + <translation>データベースのエントリーのリストを表示する。</translation> + </message> + <message> + <source>Path of the group to list. Default is /</source> + <translation>リストを表示するグループのパス。デフォルトは / (ルート)</translation> + </message> + <message> + <source>Find entries quickly.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Search term.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Merge two databases.</source> + <translation>2つのデータベースをマージする。</translation> + </message> + <message> + <source>Path of the database to merge into.</source> + <translation>マージ先のデータベースのパス。</translation> + </message> + <message> + <source>Path of the database to merge from.</source> + <translation>マージ元のデータベースのパス。</translation> + </message> + <message> + <source>Use the same credentials for both database files.</source> + <translation>両方のデータベースファイルに対して同一のクレデンシャルを使用する。</translation> + </message> + <message> + <source>Key file of the database to merge from.</source> + <translation>マージ元のデータベースのキーファイル。</translation> + </message> + <message> + <source>Show an entry's information.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> + <translation type="unfinished"/> + </message> + <message> + <source>attribute</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the entry to show.</source> + <translation>表示するエントリーの名前。</translation> + </message> <message> <source>NULL device</source> <translation>NULL デバイス</translation> @@ -1868,8 +3314,28 @@ Change them only if you know what you are doing.</source> <translation>閉じ引用符がありません</translation> </message> <message> - <source>INTERNAL - unget lower bound exceeded</source> - <translation>INTERNAL - unget が下限を超過しました</translation> + <source>AES: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Twofish: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>ChaCha20: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Argon2 (KDBX 4 – recommended)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 4)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 3.1)</source> + <translation type="unfinished"/> </message> <message> <source>Group</source> @@ -1887,14 +3353,22 @@ Change them only if you know what you are doing.</source> <source>Password</source> <translation>パスワード</translation> </message> - <message> - <source>URL</source> - <translation>URL</translation> - </message> <message> <source>Notes</source> <translation>メモ</translation> </message> + <message> + <source>Last Modified</source> + <translation>最終更新日時</translation> + </message> + <message> + <source>Created</source> + <translation>作成日時</translation> + </message> + <message> + <source>Legacy Browser Integration</source> + <translation type="unfinished"/> + </message> <message> <source>Browser Integration</source> <translation>ブラウザ統合</translation> @@ -1911,6 +3385,10 @@ Change them only if you know what you are doing.</source> <source>Passive</source> <translation>Passive</translation> </message> + <message> + <source>SSH Agent</source> + <translation>SSH エージェント</translation> + </message> </context> <context> <name>QtIOCompressor</name> @@ -1949,8 +3427,8 @@ Change them only if you know what you are doing.</source> <context> <name>SearchWidget</name> <message> - <source>Case Sensitive</source> - <translation>大文字と小文字の区別</translation> + <source>Search...</source> + <translation>検索...</translation> </message> <message> <source>Search</source> @@ -1961,8 +3439,8 @@ Change them only if you know what you are doing.</source> <translation>消去</translation> </message> <message> - <source>Search...</source> - <translation>検索...</translation> + <source>Case Sensitive</source> + <translation>大文字と小文字の区別</translation> </message> <message> <source>Limit search to selected group</source> @@ -1971,50 +3449,6 @@ Change them only if you know what you are doing.</source> </context> <context> <name>Service</name> - <message> - <source>A shared encryption-key with the name "%1" already exists. -Do you want to overwrite it?</source> - <translation>共有暗号化キー "%1" は既に存在します。 -上書きしますか?</translation> - </message> - <message> - <source>Do you want to update the information in %1 - %2?</source> - <translation>%1 - %2 の情報を更新しますか?</translation> - </message> - <message> - <source>The active database is locked! -Please unlock the selected database or choose another one which is unlocked.</source> - <translation>アクティブなデータベースがロックされています。 -選択されたデータベースのロックを解除するか、別のロックされていないデータベースを選択してください。</translation> - </message> - <message> - <source>Successfully removed %1 encryption-%2 from KeePassX/Http Settings.</source> - <translation>KeePassX/Http の設定から %1 個の暗号化%2が無事に削除されました。</translation> - </message> - <message> - <source>No shared encryption-keys found in KeePassHttp Settings.</source> - <translation>KeePassHttp の設定内に共有暗号化キーは見つかりませんでした。</translation> - </message> - <message> - <source>The active database does not contain an entry of KeePassHttp Settings.</source> - <translation>アクティブなデータベースに KeePassHttp の設定のエントリーが含まれていません。</translation> - </message> - <message> - <source>Removing stored permissions...</source> - <translation>保存されたアクセス許可を削除しています…</translation> - </message> - <message> - <source>Abort</source> - <translation>中止</translation> - </message> - <message> - <source>Successfully removed permissions from %1 %2.</source> - <translation>%1 個の%2から無事にアクセス許可が削除されました。</translation> - </message> - <message> - <source>The active database does not contain an entry with permissions.</source> - <translation>アクティブなデータベースにはアクセス許可があるエントリーは含まれていません。</translation> - </message> <message> <source>KeePassXC: New key association request</source> <translation>KeePassXC: 新しいキーのアソシエーション要求</translation> @@ -2031,34 +3465,78 @@ KeePassXC のデータベースへのアクセスを許可したい場合は、 <source>KeePassXC: Overwrite existing key?</source> <translation>KeePassXC: 既存のキーを上書きしますか?</translation> </message> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>共有暗号化キー "%1" は既に存在します。 +上書きしますか?</translation> + </message> <message> <source>KeePassXC: Update Entry</source> <translation>KeePassXC: エントリーを更新</translation> </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>%1 - %2 の情報を更新しますか?</translation> + </message> <message> <source>KeePassXC: Database locked!</source> <translation>KeePassXC: データベースはロックされています</translation> </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>アクティブなデータベースがロックされています。 +選択されたデータベースのロックを解除するか、別のロックされていないデータベースを選択してください。</translation> + </message> <message> <source>KeePassXC: Removed keys from database</source> <translation>KeePassXC: データベースからキーが削除されました</translation> </message> + <message numerus="yes"> + <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> + <translation><numerusform>KeePassX/Http の設定から %n 個の暗号化キーが無事に削除されました。</numerusform></translation> + </message> <message> <source>KeePassXC: No keys found</source> <translation>KeePassXC: キーが見つかりません</translation> </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation>KeePassHttp の設定内に共有暗号化キーは見つかりませんでした。</translation> + </message> <message> <source>KeePassXC: Settings not available!</source> <translation>KeePassXC: 設定は利用できません</translation> </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation>アクティブなデータベースに KeePassHttp の設定のエントリーが含まれていません。</translation> + </message> + <message> + <source>Removing stored permissions...</source> + <translation>保存されたアクセス許可を削除しています…</translation> + </message> + <message> + <source>Abort</source> + <translation>中止</translation> + </message> <message> <source>KeePassXC: Removed permissions</source> <translation>KeePassXC: アクセス許可が削除されました</translation> </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entries.</source> + <translation><numerusform>%n 個のエントリーから無事にアクセス許可が削除されました。</numerusform></translation> + </message> <message> <source>KeePassXC: No entry with permissions found!</source> <translation>KeePassXC: アクセス許可があるエントリーは見つかりません</translation> </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>アクティブなデータベースにはアクセス許可があるエントリーは含まれていません。</translation> + </message> </context> <context> <name>SettingsWidget</name> @@ -2081,10 +3559,26 @@ KeePassXC のデータベースへのアクセスを許可したい場合は、 </context> <context> <name>SettingsWidgetGeneral</name> + <message> + <source>Basic Settings</source> + <translation>基本設定</translation> + </message> + <message> + <source>Start only a single instance of KeePassXC</source> + <translation>KeePassXC のインスタンスを一つだけ起動する</translation> + </message> <message> <source>Remember last databases</source> <translation>最近使用したデータベースを記憶する</translation> </message> + <message> + <source>Remember last key files and security dongles</source> + <translation>最近使用したキーファイルとセキュリティードングルを記憶する</translation> + </message> + <message> + <source>Load previous databases on startup</source> + <translation>起動時に前回のデータベースを読み込む</translation> + </message> <message> <source>Automatically save on exit</source> <translation>終了時に自動的に保存する</translation> @@ -2093,21 +3587,29 @@ KeePassXC のデータベースへのアクセスを許可したい場合は、 <source>Automatically save after every change</source> <translation>変更するたびに自動的に保存する</translation> </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation>編集された際に自動でデータベースを再読み込みする</translation> + </message> <message> <source>Minimize when copying to clipboard</source> <translation>クリップボードにコピーしたら最小化する</translation> </message> + <message> + <source>Minimize window at application startup</source> + <translation>アプリケーション起動時にウィンドウを最小化する</translation> + </message> <message> <source>Use group icon on entry creation</source> <translation>エントリー作成時にグループのアイコンを使用する</translation> </message> <message> - <source>Global Auto-Type shortcut</source> - <translation>グローバル自動入力のショートカット</translation> + <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> + <translation>データ以外の変更(例えばグループの展開)に対して、データベースを修正済みとしてマークしないようにする</translation> </message> <message> - <source>Language</source> - <translation>言語</translation> + <source>Hide the Details view</source> + <translation>詳細を非表示にする</translation> </message> <message> <source>Show a system tray icon</source> @@ -2117,67 +3619,61 @@ KeePassXC のデータベースへのアクセスを許可したい場合は、 <source>Hide window to system tray when minimized</source> <translation>最小化された際にシステムトレイへ格納する</translation> </message> - <message> - <source>Load previous databases on startup</source> - <translation>起動時に前回のデータベースを読み込む</translation> - </message> - <message> - <source>Automatically reload the database when modified externally</source> - <translation>編集された際に自動でデータベースを再読み込みする</translation> - </message> <message> <source>Hide window to system tray instead of app exit</source> <translation>アプリケーション終了ではなくシステムトレイへ格納する</translation> </message> <message> - <source>Minimize window at application startup</source> - <translation>アプリケーション起動時にウィンドウを最小化する</translation> + <source>Dark system tray icon</source> + <translation>ダークシステムトレイアイコン</translation> </message> <message> - <source>Basic Settings</source> - <translation>基本設定</translation> - </message> - <message> - <source>Remember last key files and security dongles</source> - <translation>最近使用したキーファイルとセキュリティードングルを記憶する</translation> - </message> - <message> - <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> - <translation>データ以外の変更(例えばグループの展開)に対して、データベースを修正済みとしてマークしないようにする</translation> + <source>Language</source> + <translation>言語</translation> </message> <message> <source>Auto-Type</source> <translation>自動入力</translation> </message> <message> - <source>Use entry title and URL to match windows for global Auto-Type</source> - <translation>グローバル自動入力のウィンドウの照合にエントリーのタイトルと URL を使用する</translation> + <source>Use entry title to match windows for global Auto-Type</source> + <translation>グローバル自動入力の際に、エントリーのタイトルとウィンドウのマッチングを行う</translation> + </message> + <message> + <source>Use entry URL to match windows for global Auto-Type</source> + <translation>グローバル自動入力のウィンドウの照合にエントリーの URL を使用する</translation> </message> <message> <source>Always ask before performing Auto-Type</source> <translation>自動入力を行う前に毎回確認する</translation> </message> + <message> + <source>Global Auto-Type shortcut</source> + <translation>グローバル自動入力のショートカット</translation> + </message> <message> <source>Auto-Type delay</source> <translation>自動入力の遅延</translation> </message> <message> <source> ms</source> + <comment>Milliseconds</comment> <translation>ミリ秒</translation> </message> - <message> - <source>Start only a single instance of KeePassXC</source> - <translation>KeePassXC のインスタンスを一つだけ起動する</translation> - </message> </context> <context> <name>SettingsWidgetSecurity</name> + <message> + <source>Timeouts</source> + <translation>タイムアウト</translation> + </message> <message> <source>Clear clipboard after</source> <translation>次の時間が過ぎたらクリップボードを消去</translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation>秒</translation> </message> <message> @@ -2185,8 +3681,12 @@ KeePassXC のデータベースへのアクセスを許可したい場合は、 <translation>未操作の時間が続いたらデータベースをロック</translation> </message> <message> - <source>Show passwords in cleartext by default</source> - <translation>パスワードはデフォルトで平文表示にする</translation> + <source>Convenience</source> + <translation>利便性</translation> + </message> + <message> + <source>Lock databases when session is locked or lid is closed</source> + <translation>セッションがロックされたりラップトップが閉じられた際にデータベースをロックする</translation> </message> <message> <source>Lock databases after minimizing the window</source> @@ -2197,16 +3697,16 @@ KeePassXC のデータベースへのアクセスを許可したい場合は、 <translation>パスワードが表示されている場合は、パスワードの再入力を必要としないようにする</translation> </message> <message> - <source>Timeouts</source> - <translation>タイムアウト</translation> + <source>Show passwords in cleartext by default</source> + <translation>パスワードはデフォルトで平文表示にする</translation> </message> <message> - <source>Convenience</source> - <translation>利便性</translation> + <source>Hide passwords in the preview panel</source> + <translation>プレビューパネルではパスワードを非表示にする</translation> </message> <message> - <source>Lock databases when session is locked or lid is closed</source> - <translation>セッションがロックされたりラップトップが閉じられた際にデータベースをロックする</translation> + <source>Hide entry notes by default</source> + <translation>エントリーのメモはデフォルトで非表示にする</translation> </message> <message> <source>Privacy</source> @@ -2227,6 +3727,14 @@ KeePassXC のデータベースへのアクセスを許可したい場合は、 <source>Key:</source> <translation>キー:</translation> </message> + <message> + <source>Default RFC 6238 token settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Steam token settings</source> + <translation type="unfinished"/> + </message> <message> <source>Use custom settings</source> <translation>カスタム設定を使用する</translation> @@ -2253,6 +3761,7 @@ KeePassXC のデータベースへのアクセスを許可したい場合は、 </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation>秒</translation> </message> </context> @@ -2319,6 +3828,26 @@ KeePassXC のデータベースへのアクセスを許可したい場合は、 </context> <context> <name>main</name> + <message> + <source>Remove an entry from the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>データベースのパス。</translation> + </message> + <message> + <source>Path of the entry to remove.</source> + <translation>削除するエントリーのパス。</translation> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation>KeePassXC - クロスプラットフォームのパスワードマネージャー</translation> + </message> + <message> + <source>filenames of the password databases to open (*.kdbx)</source> + <translation>開くパスワードデータベースのファイル名 (*.kdbx)</translation> + </message> <message> <source>path to a custom config file</source> <translation>カスタム設定ファイルへのパス</translation> @@ -2327,81 +3856,13 @@ KeePassXC のデータベースへのアクセスを許可したい場合は、 <source>key file of the database</source> <translation>データベースのキーファイル</translation> </message> - <message> - <source>KeePassXC - cross-platform password manager</source> - <translation>KeePassXC - クロスプラットフォームのパスワードマネージャー</translation> - </message> <message> <source>read password of the database from stdin</source> <translation>標準入力からデータベースのパスワードを読み込む</translation> </message> <message> - <source>filenames of the password databases to open (*.kdbx)</source> - <translation>開くパスワードデータベースのファイル名 (*.kdbx)</translation> - </message> - <message> - <source>Copy a password to the clipboard</source> - <translation>クリップボードにパスワードをコピーする</translation> - </message> - <message> - <source>Path of the database.</source> - <translation>データベースのパス。</translation> - </message> - <message> - <source>Use a GUI prompt unlocking the database.</source> - <translation>データベースのロックを解除する際に GUI プロンプトを使用する。</translation> - </message> - <message> - <source>Name of the entry to clip.</source> - <translation>クリップするエントリーの名前。</translation> - </message> - <message> - <source>Extract and print the content of a database.</source> - <translation>データベースの内容を展開して出力する。</translation> - </message> - <message> - <source>Path of the database to extract.</source> - <translation>展開するデータベースのパス。</translation> - </message> - <message> - <source>Name of the command to execute.</source> - <translation>実行するコマンドの名前。</translation> - </message> - <message> - <source>List database entries.</source> - <translation>データベースのエントリーのリストを表示する。</translation> - </message> - <message> - <source>Path of the group to list. Default is /</source> - <translation>リストを表示するグループのパス。デフォルトは / (ルート)</translation> - </message> - <message> - <source>Print the UUIDs of the entries and groups.</source> - <translation>エントリーとグループの UUID を出力する。</translation> - </message> - <message> - <source>Merge two databases.</source> - <translation>2つのデータベースをマージする。</translation> - </message> - <message> - <source>Path of the database to merge into.</source> - <translation>マージ先のデータベースのパス。</translation> - </message> - <message> - <source>Path of the database to merge from.</source> - <translation>マージ元のデータベースのパス。</translation> - </message> - <message> - <source>Use the same password for both database files.</source> - <translation>両方のデータベースファイルに対して同一のパスワードを使用する。</translation> - </message> - <message> - <source>Show a password.</source> - <translation>パスワードを表示する。</translation> - </message> - <message> - <source>Name of the entry to show.</source> - <translation>表示するエントリーの名前。</translation> + <source>Parent window handle</source> + <translation type="unfinished"/> </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_ko.ts b/share/translations/keepassx_ko.ts index 9b00bbc2f..bcfb1a27e 100644 --- a/share/translations/keepassx_ko.ts +++ b/share/translations/keepassx_ko.ts @@ -9,14 +9,34 @@ <source>About</source> <translation>정보</translation> </message> + <message> + <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> + <translation> <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a> 사이트에 버그를 보고해 주십시오</translation> + </message> + <message> + <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>KeePassXC는 GNU 일반 공중 라이선스(GPL) 버전 2 및 (선택적으로) 버전 3으로 배포됩니다.</translation> + </message> + <message> + <source>Project Maintainers:</source> + <translation>프로젝트 관리자:</translation> + </message> <message> <source>Contributors</source> <translation>기여자</translation> </message> + <message> + <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">GitHub에서 기여자 보기</a></translation> + </message> <message> <source>Debug Info</source> <translation>디버그 정보</translation> </message> + <message> + <source>Include the following information whenever you report a bug:</source> + <translation>버그를 보고할 때 다음 정보를 포함하십시오:</translation> + </message> <message> <source>Copy to clipboard</source> <translation>클립보드에 복사</translation> @@ -31,6 +51,10 @@ <source>Revision: %1</source> <translation>리비전: %1</translation> </message> + <message> + <source>Distribution: %1</source> + <translation>배포판: %1</translation> + </message> <message> <source>Libraries:</source> <translation>라이브러리:</translation> @@ -47,33 +71,13 @@ CPU 아키텍처: %2 <source>Enabled extensions:</source> <translation>활성화된 확장 기능:</translation> </message> - <message> - <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> - <translation> <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a> 사이트에 버그를 보고해 주십시오</translation> - </message> - <message> - <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassXC는 GNU 일반 공중 라이선스(GPL) 버전 2 및 (선택적으로) 버전 3으로 배포됩니다.</translation> - </message> - <message> - <source>Project Maintainers:</source> - <translation>프로젝트 관리자:</translation> - </message> - <message> - <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">GitHub에서 기여자 보기</a></translation> - </message> - <message> - <source>Include the following information whenever you report a bug:</source> - <translation>버그를 보고할 때 다음 정보를 포함하십시오:</translation> - </message> - <message> - <source>Distribution: %1</source> - <translation>배포판: %1</translation> - </message> </context> <context> <name>AccessControlDialog</name> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>KeePassXC HTTP 접근 확인</translation> + </message> <message> <source>Remember this decision</source> <translation>이 선택 기억하기</translation> @@ -92,9 +96,12 @@ Please select whether you want to allow access.</source> <translation>%1에서 다음 항목의 암호를 요청했습니다. 접근을 허용할 지 여부를 선택하십시오.</translation> </message> +</context> +<context> + <name>AgentSettingsWidget</name> <message> - <source>KeePassXC HTTP Confirm Access</source> - <translation>KeePassXC HTTP 접근 확인</translation> + <source>Enable SSH Agent (requires restart)</source> + <translation type="unfinished"/> </message> </context> <context> @@ -107,6 +114,26 @@ Please select whether you want to allow access.</source> <source>Auto-Type - KeePassXC</source> <translation>자동 입력 - KeePassXC</translation> </message> + <message> + <source>Auto-Type</source> + <translation>자동 입력</translation> + </message> + <message> + <source>The Syntax of your Auto-Type statement is incorrect!</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> </context> <context> <name>AutoTypeAssociationsModel</name> @@ -125,13 +152,290 @@ Please select whether you want to allow access.</source> </context> <context> <name>AutoTypeSelectDialog</name> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>자동 입력 - KeePassXC</translation> + </message> <message> <source>Select entry to Auto-Type:</source> <translation>자동으로 입력할 항목 선택:</translation> </message> +</context> +<context> + <name>BrowserAccessControlDialog</name> <message> - <source>Auto-Type - KeePassXC</source> - <translation>자동 입력 - KeePassXC</translation> + <source>KeePassXC-Browser Confirm Access</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remember this decision</source> + <translation>이 선택 기억하기</translation> + </message> + <message> + <source>Allow</source> + <translation>허용</translation> + </message> + <message> + <source>Deny</source> + <translation>거부</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1에서 다음 항목의 암호를 요청했습니다. +접근을 허용할 지 여부를 선택하십시오.</translation> + </message> +</context> +<context> + <name>BrowserOptionDialog</name> + <message> + <source>Dialog</source> + <translation>대화 상자</translation> + </message> + <message> + <source>This is required for accessing your databases with KeePassXC-Browser</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable KeepassXC browser integration</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>일반</translation> + </message> + <message> + <source>Enable integration for these browsers:</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Google Chrome</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Firefox</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Chromium</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Vivaldi</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show a &notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>데이터베이스가 잠겼을 때 잠금 해제 요청(&Q)</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Match URL scheme (e.g., https://...)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>도메인이 일치하는 모든 항목 대신 지정한 URL과 일치하는 항목만 반환합니다.</translation> + </message> + <message> + <source>&Return only best-matching credentials</source> + <translation type="unfinished"/> + </message> + <message> + <source>Sort &matching credentials by title</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Sort matching credentials by &username</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>&Disconnect all browsers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Forget all remembered &permissions</source> + <translation type="unfinished"/> + </message> + <message> + <source>Advanced</source> + <translation>고급</translation> + </message> + <message> + <source>Never &ask before accessing credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Never ask before &updating credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>선택한 데이터베이스만 클라이언트와 연결할 수 있습니다.</translation> + </message> + <message> + <source>Searc&h in all opened databases for matching credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>문자열 필드를 자동으로 만들거나 업데이트하는 것은 지원되지 않습니다.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>"KPH: "로 시작하는 고급 문자열 필드 반환(&R)</translation> + </message> + <message> + <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Update &native messaging manifest files at startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Support a proxy application between KeePassXC and browser extension.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &proxy application between KeePassXC and browser extension</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a custom proxy location if you installed a proxy manually.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &custom proxy location</source> + <comment>Meant is the proxy for KeePassXC-Browser</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*.exe);;All Files (*.*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select custom proxy location</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>BrowserService</name> + <message> + <source>KeePassXC: New key association request</source> + <translation>KeePassXC: 새 키 연결 요청</translation> + </message> + <message> + <source>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Save and allow access</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: 기존 키를 덮어쓰시겠습니까?</translation> + </message> + <message> + <source>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: 항목 업데이트</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>%1 - %2의 정보를 업데이트하시겠습니까?</translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: 데이터베이스 잠김!</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>활성 데이터베이스가 잠겨 있습니다! +선택한 데이터베이스의 잠금을 풀거나 잠금이 풀린 데이터베이스를 선택하십시오.</translation> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: 설정을 사용할 수 없음!</translation> + </message> + <message> + <source>The active database does not contain a settings entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: 키를 찾을 수 없음</translation> + </message> + <message> + <source>No shared encryption keys found in KeePassXC Settings.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: 데이터베이스에서 키 삭제됨</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <source>Removing stored permissions…</source> + <translation type="unfinished"/> + </message> + <message> + <source>Abort</source> + <translation>중지</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: 권한 삭제됨</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entry(s).</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation>KeePassXC: 권한이 있는 항목을 찾을 수 없음!</translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>활성 데이터베이스에 권한이 부여된 항목이 없습니다.</translation> </message> </context> <context> @@ -148,6 +452,10 @@ Please select whether you want to allow access.</source> <source>Repeat password:</source> <translation>암호 확인:</translation> </message> + <message> + <source>&Key file</source> + <translation>키 파일(&K)</translation> + </message> <message> <source>Browse</source> <translation>찾아보기</translation> @@ -156,6 +464,14 @@ Please select whether you want to allow access.</source> <source>Create</source> <translation>만들기</translation> </message> + <message> + <source>Cha&llenge Response</source> + <translation>질의 응답(&L)</translation> + </message> + <message> + <source>Refresh</source> + <translation>새로 고침</translation> + </message> <message> <source>Key files</source> <translation>키 파일</translation> @@ -176,6 +492,10 @@ Please select whether you want to allow access.</source> <source>Select a key file</source> <translation>키 파일 선택</translation> </message> + <message> + <source>Empty password</source> + <translation>빈 암호</translation> + </message> <message> <source>Do you really want to use an empty string as password?</source> <translation>빈 문자열을 암호로 사용하시겠습니까?</translation> @@ -190,20 +510,15 @@ Please select whether you want to allow access.</source> <translation>%1을(를) 키 파일로 설정할 수 없습니다: %2</translation> </message> <message> - <source>&Key file</source> - <translation>키 파일(&K)</translation> + <source>Legacy key file format</source> + <translation type="unfinished"/> </message> <message> - <source>Cha&llenge Response</source> - <translation>질의 응답(&L)</translation> - </message> - <message> - <source>Refresh</source> - <translation>새로 고침</translation> - </message> - <message> - <source>Empty password</source> - <translation>빈 암호</translation> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -216,6 +531,10 @@ Please select whether you want to allow access.</source> <source>Clone Options</source> <translation>복제 옵션</translation> </message> + <message> + <source>Append ' - Clone' to title</source> + <translation>제목에 ' - 사본' 추가</translation> + </message> <message> <source>Replace username and password with references</source> <translation>사용자 이름과 암호를 참조로 대체</translation> @@ -224,10 +543,6 @@ Please select whether you want to allow access.</source> <source>Copy history</source> <translation>과거 기록 복사</translation> </message> - <message> - <source>Append ' - Clone' to title</source> - <translation>제목에 ' - 사본' 추가</translation> - </message> </context> <context> <name>CsvImportWidget</name> @@ -324,10 +639,6 @@ Please select whether you want to allow access.</source> </context> <context> <name>CsvImportWizard</name> - <message> - <source>Import CSV file</source> - <translation>CSV 파일 가져오기</translation> - </message> <message> <source>Error</source> <translation>오류</translation> @@ -339,17 +650,17 @@ Please select whether you want to allow access.</source> </context> <context> <name>CsvParserModel</name> - <message> - <source> byte, </source> - <translation>바이트, </translation> + <message numerus="yes"> + <source>%n byte(s), </source> + <translation type="unfinished"><numerusform></numerusform></translation> </message> - <message> - <source> rows, </source> - <translation>줄, </translation> + <message numerus="yes"> + <source>%n row(s), </source> + <translation type="unfinished"><numerusform></numerusform></translation> </message> - <message> - <source> columns</source> - <translation>칸</translation> + <message numerus="yes"> + <source>%n column(s)</source> + <translation type="unfinished"><numerusform></numerusform></translation> </message> </context> <context> @@ -370,6 +681,14 @@ Please select whether you want to allow access.</source> <source>Browse</source> <translation>찾아보기</translation> </message> + <message> + <source>Refresh</source> + <translation>새로 고침</translation> + </message> + <message> + <source>Challenge Response:</source> + <translation>질의 응답:</translation> + </message> <message> <source>Unable to open the database.</source> <translation>데이터베이스를 열 수 없습니다.</translation> @@ -378,6 +697,21 @@ Please select whether you want to allow access.</source> <source>Can't open key file</source> <translation>키 파일을 열 수 없음</translation> </message> + <message> + <source>Legacy key file format</source> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't show this warning again</source> + <translation type="unfinished"/> + </message> <message> <source>All files</source> <translation>모든 파일</translation> @@ -390,14 +724,6 @@ Please select whether you want to allow access.</source> <source>Select key file</source> <translation>키 파일 선택</translation> </message> - <message> - <source>Refresh</source> - <translation>새로 고침</translation> - </message> - <message> - <source>Challenge Response:</source> - <translation>질의 응답:</translation> - </message> </context> <context> <name>DatabaseRepairWidget</name> @@ -413,14 +739,14 @@ Please select whether you want to allow access.</source> <source>Can't open key file</source> <translation>키 파일을 열 수 없음</translation> </message> - <message> - <source>Database opened fine. Nothing to do.</source> - <translation>데이터베이스를 열었습니다. 할 일이 없습니다.</translation> - </message> <message> <source>Unable to open the database.</source> <translation>데이터베이스를 열 수 없습니다.</translation> </message> + <message> + <source>Database opened fine. Nothing to do.</source> + <translation>데이터베이스를 열었습니다. 할 일이 없습니다.</translation> + </message> <message> <source>Success</source> <translation>성공</translation> @@ -439,40 +765,57 @@ You can now save it.</source> <context> <name>DatabaseSettingsWidget</name> <message> - <source>Database name:</source> - <translation>데이터베이스 이름:</translation> + <source>General</source> + <translation>일반</translation> </message> <message> - <source>Database description:</source> - <translation>데이터베이스 설명:</translation> + <source>Encryption</source> + <translation type="unfinished"/> </message> <message> - <source>Transform rounds:</source> - <translation>변환 횟수:</translation> + <source>Number of rounds too high</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> </message> <message> - <source>Default username:</source> - <translation>기본 사용자 이름:</translation> + <source>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</source> + <translation type="unfinished"/> </message> <message> - <source> MiB</source> - <translation>MiB</translation> + <source>Understood, keep number</source> + <translation type="unfinished"/> </message> <message> - <source>Benchmark</source> - <translation>벤치마크</translation> + <source>Cancel</source> + <translation type="unfinished"/> </message> <message> - <source>Max. history items:</source> - <translation>최대 과거 항목 수:</translation> + <source>Number of rounds too low</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> </message> <message> - <source>Max. history size:</source> - <translation>최대 과거 항목 크기:</translation> + <source>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</source> + <translation type="unfinished"/> </message> <message> - <source>Use recycle bin</source> - <translation>휴지통 사용</translation> + <source>KDF unchanged</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetEncryption</name> + <message> + <source>Encryption Algorithm:</source> + <translation type="unfinished"/> </message> <message> <source>AES: 256 Bit (default)</source> @@ -483,14 +826,78 @@ You can now save it.</source> <translation>Twofish: 256비트</translation> </message> <message> - <source>Algorithm:</source> - <translation>알고리즘:</translation> + <source>Key Derivation Function:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Transform rounds:</source> + <translation>변환 횟수:</translation> + </message> + <message> + <source>Benchmark 1-second delay</source> + <translation type="unfinished"/> + </message> + <message> + <source>Memory Usage:</source> + <translation type="unfinished"/> + </message> + <message> + <source> MB</source> + <translation type="unfinished"/> + </message> + <message> + <source>Parallelism:</source> + <translation type="unfinished"/> + </message> + <message> + <source> thread</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetGeneral</name> + <message> + <source>Database Meta Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database name:</source> + <translation>데이터베이스 이름:</translation> + </message> + <message> + <source>Database description:</source> + <translation>데이터베이스 설명:</translation> + </message> + <message> + <source>Default username:</source> + <translation>기본 사용자 이름:</translation> + </message> + <message> + <source>History Settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Max. history items:</source> + <translation>최대 과거 항목 수:</translation> + </message> + <message> + <source>Max. history size:</source> + <translation>최대 과거 항목 크기:</translation> + </message> + <message> + <source> MiB</source> + <translation>MiB</translation> + </message> + <message> + <source>Use recycle bin</source> + <translation>휴지통 사용</translation> </message> </context> <context> <name>DatabaseTabWidget</name> <message> <source>Root</source> + <comment>Root group</comment> <translation>루트</translation> </message> <message> @@ -509,6 +916,30 @@ You can now save it.</source> <source>File not found!</source> <translation>파일을 찾을 수 없습니다!</translation> </message> + <message> + <source>Unable to open the database.</source> + <translation>데이터베이스를 열 수 없습니다.</translation> + </message> + <message> + <source>File opened in read only mode.</source> + <translation>파일을 읽기 전용 모드로 열었습니다.</translation> + </message> + <message> + <source>Open CSV file</source> + <translation>CSV 파일 열기</translation> + </message> + <message> + <source>CSV file</source> + <translation>CSV 파일</translation> + </message> + <message> + <source>All files (*)</source> + <translation>모든 파일 (*)</translation> + </message> + <message> + <source>Merge database</source> + <translation>데이터베이스 합치기</translation> + </message> <message> <source>Open KeePass 1 database</source> <translation>KeePass 1 데이터베이스 열기</translation> @@ -517,14 +948,16 @@ You can now save it.</source> <source>KeePass 1 database</source> <translation>KeePass 1 데이터베이스</translation> </message> - <message> - <source>All files (*)</source> - <translation>모든 파일 (*)</translation> - </message> <message> <source>Close?</source> <translation>닫기 확인?</translation> </message> + <message> + <source>"%1" is in edit mode. +Discard changes and close anyway?</source> + <translation>"%1"이(가) 현재 편집 모드입니다. +변경 사항을 무시하고 닫으시겠습니까?</translation> + </message> <message> <source>Save changes?</source> <translation>변경 사항 저장 확인?</translation> @@ -538,10 +971,22 @@ Save changes?</source> <source>Writing the database failed.</source> <translation>데이터베이스에 쓸 수 없습니다.</translation> </message> + <message> + <source>Passwords</source> + <translation>암호</translation> + </message> <message> <source>Save database as</source> <translation>다른 이름으로 데이터베이스 저장</translation> </message> + <message> + <source>Export database to CSV file</source> + <translation>데이터베이스를 CSV 파일로 내보내기</translation> + </message> + <message> + <source>Writing the CSV file failed.</source> + <translation>CSV 파일에 기록할 수 없습니다.</translation> + </message> <message> <source>New database</source> <translation>새 데이터베이스</translation> @@ -559,12 +1004,6 @@ Save changes?</source> Please press cancel to finish your changes or discard them.</source> <translation>데이터베이스를 편집하고 있어서 잠글 수 없습니다. 취소를 눌러서 변경 사항을 저장하거나 무시하십시오.</translation> - </message> - <message> - <source>This database has never been saved. -You can save the database or stop locking it.</source> - <translation>이 데이터베이스가 저장되지 않았습니다. -데이터베이스를 저장하거나 잠금을 풀 수 있습니다.</translation> </message> <message> <source>This database has been modified. @@ -574,69 +1013,13 @@ Otherwise your changes are lost.</source> 잠그기 전에 데이터베이스를 저장하시겠습니까? 저장하지 않은 변경 사항은 손실됩니다.</translation> </message> - <message> - <source>"%1" is in edit mode. -Discard changes and close anyway?</source> - <translation>"%1"이(가) 현재 편집 모드입니다. -변경 사항을 무시하고 닫으시겠습니까?</translation> - </message> - <message> - <source>Export database to CSV file</source> - <translation>데이터베이스를 CSV 파일로 내보내기</translation> - </message> - <message> - <source>CSV file</source> - <translation>CSV 파일</translation> - </message> - <message> - <source>Writing the CSV file failed.</source> - <translation>CSV 파일에 기록할 수 없습니다.</translation> - </message> - <message> - <source>Unable to open the database.</source> - <translation>데이터베이스를 열 수 없습니다.</translation> - </message> - <message> - <source>Merge database</source> - <translation>데이터베이스 합치기</translation> - </message> - <message> - <source>The database you are trying to save as is locked by another instance of KeePassXC. -Do you want to save it anyway?</source> - <translation>저장하려는 데이터베이스를 다른 KeePassXC 인스턴스에서 잠갔습니다. -그래도 저장하시겠습니까?</translation> - </message> - <message> - <source>Passwords</source> - <translation>암호</translation> - </message> - <message> - <source>Database already opened</source> - <translation>데이터베이스가 이미 열림</translation> - </message> - <message> - <source>The database you are trying to open is locked by another instance of KeePassXC. - -Do you want to open it anyway?</source> - <translation>열려는 데이터베이스를 다른 KeePassXC 인스턴스에서 잠갔습니다. - -그래도 여시겠습니까?</translation> - </message> - <message> - <source>Open read-only</source> - <translation>읽기 전용으로 열기</translation> - </message> - <message> - <source>File opened in read only mode.</source> - <translation>파일을 읽기 전용 모드로 열었습니다.</translation> - </message> - <message> - <source>Open CSV file</source> - <translation>CSV 파일 열기</translation> - </message> </context> <context> <name>DatabaseWidget</name> + <message> + <source>Searching...</source> + <translation>찾는 중...</translation> + </message> <message> <source>Change master key</source> <translation>마스터 키 변경</translation> @@ -657,13 +1040,33 @@ Do you want to open it anyway?</source> <source>Do you really want to delete %1 entries for good?</source> <translation>정말 항목 %1개를 삭제하시겠습니까?</translation> </message> + <message> + <source>Move entry to recycle bin?</source> + <translation>항목을 휴지통으로 이동하시겠습니까?</translation> + </message> + <message> + <source>Do you really want to move entry "%1" to the recycle bin?</source> + <translation>항목 "%1"을(를) 휴지통으로 이동하시겠습니까?</translation> + </message> <message> <source>Move entries to recycle bin?</source> <translation>항목을 휴지통으로 이동하시겠습니까?</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>항목 %n개를 휴지통으로 이동하시겠습니까?</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <source>Execute command?</source> + <translation>명령을 실행하시겠습니까?</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation>다음 명령을 실행하시겠습니까?<br><br>%1<br></translation> + </message> + <message> + <source>Remember my choice</source> + <translation>이 선택 기억하기</translation> </message> <message> <source>Delete group?</source> @@ -675,19 +1078,7 @@ Do you want to open it anyway?</source> </message> <message> <source>Unable to calculate master key</source> - <translation>마스터 키를 계산할 수 없음</translation> - </message> - <message> - <source>Move entry to recycle bin?</source> - <translation>항목을 휴지통으로 이동하시겠습니까?</translation> - </message> - <message> - <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation>항목 "%1"을(를) 휴지통으로 이동하시겠습니까?</translation> - </message> - <message> - <source>Searching...</source> - <translation>찾는 중...</translation> + <translation>마스터 키를 계산할 수 없습니다</translation> </message> <message> <source>No current database.</source> @@ -706,20 +1097,8 @@ Do you want to open it anyway?</source> <translation>결과 없음</translation> </message> <message> - <source>Execute command?</source> - <translation>명령을 실행하시겠습니까?</translation> - </message> - <message> - <source>Do you really want to execute the following command?<br><br>%1<br></source> - <translation>다음 명령을 실행하시겠습니까?<br><br>%1<br></translation> - </message> - <message> - <source>Remember my choice</source> - <translation>이 선택 기억하기</translation> - </message> - <message> - <source>Autoreload Request</source> - <translation>요청 자동으로 새로 고침</translation> + <source>File has changed</source> + <translation type="unfinished"/> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -730,8 +1109,9 @@ Do you want to open it anyway?</source> <translation>요청 합치기</translation> </message> <message> - <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> - <translation>데이터베이스 파일이 변경되었고 저장하지 않은 변경 사항이 있습니다. 변경 사항을 합치겠습니까?</translation> + <source>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</source> + <translation type="unfinished"/> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -746,6 +1126,89 @@ Do you want to open it anyway?</source> <translation>휴지통에 있는 항목을 영원히 삭제하시겠습니까?</translation> </message> </context> +<context> + <name>DetailsWidget</name> + <message> + <source>Generate TOTP Token</source> + <translation type="unfinished"/> + </message> + <message> + <source>Close</source> + <translation>닫기</translation> + </message> + <message> + <source>General</source> + <translation>일반</translation> + </message> + <message> + <source>Password</source> + <translation>암호</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Expiration</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username</source> + <translation>사용자 이름</translation> + </message> + <message> + <source>Autotype</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searching</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attributes</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation>첨부</translation> + </message> + <message> + <source>Notes</source> + <translation>메모</translation> + </message> + <message> + <source>Window</source> + <translation>창</translation> + </message> + <message> + <source>Sequence</source> + <translation>시퀀스</translation> + </message> + <message> + <source>Search</source> + <translation>찾기</translation> + </message> + <message> + <source>Clear</source> + <translation>비우기</translation> + </message> + <message> + <source>Never</source> + <translation type="unfinished"/> + </message> + <message> + <source>[PROTECTED]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Disabled</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enabled</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EditEntryWidget</name> <message> @@ -772,6 +1235,30 @@ Do you want to open it anyway?</source> <source>History</source> <translation>과거 기록</translation> </message> + <message> + <source>SSH Agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>(encrypted)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>File too large to be a private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open private key</source> + <translation type="unfinished"/> + </message> <message> <source>Entry history</source> <translation>항목 과거 기록</translation> @@ -792,39 +1279,6 @@ Do you want to open it anyway?</source> <source>New attribute</source> <translation>새 속성</translation> </message> - <message> - <source>Select file</source> - <translation>파일 선택</translation> - </message> - <message> - <source>Unable to open file</source> - <translation>파일을 열 수 없습니다</translation> - </message> - <message> - <source>Save attachment</source> - <translation>첨부 항목 저장</translation> - </message> - <message> - <source>Unable to save the attachment: -</source> - <translation>첨부 항목을 저장할 수 없습니다:</translation> - </message> - <message> - <source>Tomorrow</source> - <translation>내일</translation> - </message> - <message numerus="yes"> - <source>%n week(s)</source> - <translation><numerusform>%n주</numerusform></translation> - </message> - <message numerus="yes"> - <source>%n month(s)</source> - <translation><numerusform>%n개월</numerusform></translation> - </message> - <message> - <source>1 year</source> - <translation>1년</translation> - </message> <message> <source>Confirm Remove</source> <translation>삭제 확인</translation> @@ -834,12 +1288,28 @@ Do you want to open it anyway?</source> <translation>이 속성을 삭제하시겠습니까?</translation> </message> <message> - <source>[PROTECTED] Press reveal to view or edit</source> - <translation>[보호됨] 보거나 편집하려면 누르십시오</translation> + <source>[PROTECTED]</source> + <translation type="unfinished"/> </message> <message> - <source>Are you sure you want to remove this attachment?</source> - <translation>이 첨부 항목을 삭제하시겠습니까?</translation> + <source>Press reveal to view or edit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Tomorrow</source> + <translation>내일</translation> + </message> + <message numerus="yes"> + <source>%n week(s)</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source>%n month(s)</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <source>1 year</source> + <translation>1년</translation> </message> </context> <context> @@ -856,18 +1326,6 @@ Do you want to open it anyway?</source> <source>Remove</source> <translation>삭제</translation> </message> - <message> - <source>Attachments</source> - <translation>첨부</translation> - </message> - <message> - <source>Save</source> - <translation>저장</translation> - </message> - <message> - <source>Open</source> - <translation>열기</translation> - </message> <message> <source>Edit Name</source> <translation>이름 편집</translation> @@ -880,6 +1338,10 @@ Do you want to open it anyway?</source> <source>Reveal</source> <translation>보이기</translation> </message> + <message> + <source>Attachments</source> + <translation>첨부</translation> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -887,6 +1349,18 @@ Do you want to open it anyway?</source> <source>Enable Auto-Type for this entry</source> <translation>이 항목 자동 입력 사용</translation> </message> + <message> + <source>Inherit default Auto-Type sequence from the &group</source> + <translation>그룹의 기본 자동 입력 시퀀스 사용(&G)</translation> + </message> + <message> + <source>&Use custom Auto-Type sequence:</source> + <translation>사용자 정의 자동 입력 시퀀스 사용(&U):</translation> + </message> + <message> + <source>Window Associations</source> + <translation>창 연결</translation> + </message> <message> <source>+</source> <translation>+</translation> @@ -899,14 +1373,6 @@ Do you want to open it anyway?</source> <source>Window title:</source> <translation>창 제목:</translation> </message> - <message> - <source>Inherit default Auto-Type sequence from the &group</source> - <translation>그룹의 기본 자동 입력 시퀀스 사용(&G)</translation> - </message> - <message> - <source>&Use custom Auto-Type sequence:</source> - <translation>사용자 정의 자동 입력 시퀀스 사용(&U):</translation> - </message> <message> <source>Use default se&quence</source> <translation>기본 시퀀스 사용(&Q)</translation> @@ -915,10 +1381,6 @@ Do you want to open it anyway?</source> <source>Set custo&m sequence:</source> <translation>사용자 정의 시퀀스 설정(&M):</translation> </message> - <message> - <source>Window Associations</source> - <translation>창 연결</translation> - </message> </context> <context> <name>EditEntryWidgetHistory</name> @@ -942,12 +1404,8 @@ Do you want to open it anyway?</source> <context> <name>EditEntryWidgetMain</name> <message> - <source>Title:</source> - <translation>제목:</translation> - </message> - <message> - <source>Username:</source> - <translation>사용자 이름:</translation> + <source>URL:</source> + <translation>URL:</translation> </message> <message> <source>Password:</source> @@ -958,20 +1416,104 @@ Do you want to open it anyway?</source> <translation>암호 확인:</translation> </message> <message> - <source>URL:</source> - <translation>URL:</translation> + <source>Title:</source> + <translation>제목:</translation> </message> <message> - <source>Expires</source> - <translation>만료 기간</translation> + <source>Notes</source> + <translation>메모</translation> </message> <message> <source>Presets</source> <translation>사전 설정</translation> </message> <message> - <source>Notes:</source> - <translation>메모:</translation> + <source>Toggle the checkbox to reveal the notes section.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username:</source> + <translation>사용자 이름:</translation> + </message> + <message> + <source>Expires</source> + <translation>만료 기간</translation> + </message> +</context> +<context> + <name>EditEntryWidgetSSHAgent</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent after</source> + <translation type="unfinished"/> + </message> + <message> + <source> seconds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fingerprint</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent when database is closed/locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add key to agent when database is opened/unlocked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Comment</source> + <translation type="unfinished"/> + </message> + <message> + <source>Decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy to clipboard</source> + <translation>클립보드에 복사</translation> + </message> + <message> + <source>Private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>External file</source> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Attachment</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add to agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove from agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Require user confirmation when this key is used</source> + <translation type="unfinished"/> </message> </context> <context> @@ -1042,6 +1584,14 @@ Do you want to open it anyway?</source> </context> <context> <name>EditWidgetIcons</name> + <message> + <source>&Use default icon</source> + <translation>기본 아이콘 사용(&U)</translation> + </message> + <message> + <source>Use custo&m icon</source> + <translation>사용자 정의 아이콘 사용(&M)</translation> + </message> <message> <source>Add custom icon</source> <translation>사용자 정의 아이콘 추가</translation> @@ -1050,6 +1600,18 @@ Do you want to open it anyway?</source> <source>Delete custom icon</source> <translation>사용자 정의 아이콘 삭제</translation> </message> + <message> + <source>Download favicon</source> + <translation>파비콘 다운로드</translation> + </message> + <message> + <source>Unable to fetch favicon.</source> + <translation>파비콘을 다운로드할 수 없습니다.</translation> + </message> + <message> + <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> + <translation>힌트: 도구 > 설정 > 보안에서 Google을 대체 항목으로 사용할 수 있습니다</translation> + </message> <message> <source>Images</source> <translation>그림</translation> @@ -1062,25 +1624,13 @@ Do you want to open it anyway?</source> <source>Select Image</source> <translation>그림 선택</translation> </message> - <message> - <source>Download favicon</source> - <translation>파비콘 다운로드</translation> - </message> - <message> - <source>Unable to fetch favicon.</source> - <translation>파비콘을 다운로드할 수 없습니다.</translation> - </message> <message> <source>Can't read icon</source> <translation>아이콘을 읽을 수 없음</translation> </message> <message> - <source>&Use default icon</source> - <translation>기본 아이콘 사용(&U)</translation> - </message> - <message> - <source>Use custo&m icon</source> - <translation>사용자 정의 아이콘 사용(&M)</translation> + <source>Custom icon already exists</source> + <translation>사용자 정의 아이콘이 이미 존재함</translation> </message> <message> <source>Confirm Delete</source> @@ -1090,14 +1640,6 @@ Do you want to open it anyway?</source> <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> <translation>이 아이콘을 항목 %1개에서 사용하고 있으며, 삭제 시 기본 아이콘으로 대체됩니다. 그래도 삭제하시겠습니까?</translation> </message> - <message> - <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation>힌트: 도구 > 설정 > 보안에서 Google을 대체 항목으로 사용할 수 있습니다</translation> - </message> - <message> - <source>Custom icon already exists</source> - <translation>사용자 정의 아이콘이 이미 존재함</translation> - </message> </context> <context> <name>EditWidgetProperties</name> @@ -1122,9 +1664,93 @@ Do you want to open it anyway?</source> <name>Entry</name> <message> <source> - Clone</source> + <comment>Suffix added to cloned entries</comment> <translation> - 사본</translation> </message> </context> +<context> + <name>EntryAttachmentsModel</name> + <message> + <source>Name</source> + <translation>이름</translation> + </message> + <message> + <source>Size</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EntryAttachmentsWidget</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add</source> + <translation>추가</translation> + </message> + <message> + <source>Remove</source> + <translation>삭제</translation> + </message> + <message> + <source>Open</source> + <translation>열기</translation> + </message> + <message> + <source>Save</source> + <translation>저장</translation> + </message> + <message> + <source>Select files</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <source>Are you sure you want to remove %n attachment(s)?</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>삭제 확인</translation> + </message> + <message> + <source>Save attachments</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to create directory: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Confirm overwrite</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to save attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachment: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open files: +%1</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EntryAttributesModel</name> <message> @@ -1153,6 +1779,11 @@ Do you want to open it anyway?</source> </context> <context> <name>EntryModel</name> + <message> + <source>Ref: </source> + <comment>Reference abbreviation</comment> + <translation>참조: </translation> + </message> <message> <source>Group</source> <translation>그룹</translation> @@ -1169,11 +1800,6 @@ Do you want to open it anyway?</source> <source>URL</source> <translation>URL</translation> </message> - <message> - <source>Ref: </source> - <comment>Reference abbreviation</comment> - <translation>참조: </translation> - </message> </context> <context> <name>Group</name> @@ -1182,6 +1808,17 @@ Do you want to open it anyway?</source> <translation>휴지통</translation> </message> </context> +<context> + <name>HostInstaller</name> + <message> + <source>KeePassXC: Cannot save file!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot save the native messaging script file.</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>HttpPasswordGeneratorWidget</name> <message> @@ -1244,6 +1881,361 @@ Do you want to open it anyway?</source> <translation>메시지 닫기</translation> </message> </context> +<context> + <name>Kdbx3Reader</name> + <message> + <source>Unable to calculate master key</source> + <translation>마스터 키를 계산할 수 없습니다</translation> + </message> + <message> + <source>Unable to issue challenge-response.</source> + <translation>질의 응답을 실행할 수 없습니다.</translation> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>키가 잘못되었거나 데이터베이스가 손상되었습니다.</translation> + </message> +</context> +<context> + <name>Kdbx3Writer</name> + <message> + <source>Unable to issue challenge-response.</source> + <translation>질의 응답을 실행할 수 없습니다.</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>마스터 키를 계산할 수 없습니다</translation> + </message> +</context> +<context> + <name>Kdbx4Reader</name> + <message> + <source>missing database headers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>마스터 키를 계산할 수 없습니다</translation> + </message> + <message> + <source>Invalid header checksum size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Header SHA256 mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header data length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open buffer for KDF parameters in header</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported key derivation function (KDF) or invalid parameters</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy header fields found in KDBX4 file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header binary size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass variant map version.</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name data</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value data</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Bool entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry type</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map field type size</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Kdbx4Writer</name> + <message> + <source>Invalid symmetric cipher algorithm.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid symmetric cipher IV size.</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>마스터 키를 계산할 수 없습니다</translation> + </message> + <message> + <source>Failed to serialize KDF parameters variant map</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxReader</name> + <message> + <source>Invalid cipher uuid length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid compression flags length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported compression algorithm</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid master seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform rounds size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid start bytes size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid random stream id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner random stream cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>KeePass 데이터베이스가 아닙니다.</translation> + </message> + <message> + <source>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> + <translation>선택한 파일은 KeePass 1 데이터베이스(.kdb)입니다. + +데이터베이스 > 'KeePass 1 데이터베이스 가져오기...' 메뉴에서 항목을 가져올 수 있습니다. +이 작업은 한 방향으로만 이뤄집니다. 가져온 데이터베이스는 KeePassX 0.4 버전에서 열 수 없습니다.</translation> + </message> + <message> + <source>Unsupported KeePass 2 database version.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxXmlReader</name> + <message> + <source>XML parsing failure: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>No root group</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing icon uuid or data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing custom data key or value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Multiple group elements</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null group uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableAutoType value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableSearching value</source> + <translation type="unfinished"/> + </message> + <message> + <source>No group uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null DeleteObject uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing DeletedObject uuid or time</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null entry uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element in history entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>No entry uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element with different uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decrypt entry string</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate custom attribute found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry string key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate attachment found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry binary key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-type association window or sequence missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid bool value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid date time value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color rgb part</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid uuid value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decompress binary</source> + <extracomment>Translator meant is a binary data inside an entry</extracomment> + <translation type="unfinished"/> + </message> +</context> <context> <name>KeePass1OpenWidget</name> <message> @@ -1273,72 +2265,145 @@ Do you want to open it anyway?</source> <source>Unsupported KeePass database version.</source> <translation>지원하지 않는 KeePass 데이터베이스 버전입니다.</translation> </message> + <message> + <source>Unable to read encryption IV</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of groups</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid content hash size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of transform rounds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to construct group tree</source> + <translation type="unfinished"/> + </message> <message> <source>Root</source> <translation>루트</translation> </message> <message> <source>Unable to calculate master key</source> - <translation>마스터 키를 계산할 수 없음</translation> - </message> - <message> - <source>Wrong key or database file is corrupt.</source> - <translation>키가 잘못되었거나 데이터베이스가 손상되었습니다.</translation> - </message> -</context> -<context> - <name>KeePass2Reader</name> - <message> - <source>Not a KeePass database.</source> - <translation>KeePass 데이터베이스가 아닙니다.</translation> - </message> - <message> - <source>Unsupported KeePass database version.</source> - <translation>지원하지 않는 KeePass 데이터베이스 버전입니다.</translation> + <translation>마스터 키를 계산할 수 없습니다</translation> </message> <message> <source>Wrong key or database file is corrupt.</source> <translation>키가 잘못되었거나 데이터베이스가 손상되었습니다.</translation> </message> <message> - <source>Unable to calculate master key</source> - <translation>마스터 키를 계산할 수 없습니다</translation> + <source>Key transformation failed</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to issue challenge-response.</source> - <translation>질의 응답을 실행할 수 없습니다.</translation> + <source>Invalid group field type number</source> + <translation type="unfinished"/> </message> <message> - <source>The selected file is an old KeePass 1 database (.kdb). - -You can import it by clicking on Database > 'Import KeePass 1 database...'. -This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> - <translation>선택한 파일은 KeePass 1 데이터베이스(.kdb)입니다. - -데이터베이스 > 'KeePass 1 데이터베이스 가져오기...' 메뉴에서 항목을 가져올 수 있습니다. -이 작업은 한 방향으로만 이뤄집니다. 가져온 데이터베이스는 KeePassX 0.4 버전에서 열 수 없습니다.</translation> - </message> -</context> -<context> - <name>KeePass2Writer</name> - <message> - <source>Unable to issue challenge-response.</source> - <translation>질의 응답을 실행할 수 없습니다.</translation> + <source>Invalid group field size</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>마스터 키를 계산할 수 없습니다</translation> + <source>Read group field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group access time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group level field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing group id or level</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing entry field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read entry field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry uuid field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field type</source> + <translation type="unfinished"/> </message> </context> <context> <name>Main</name> <message> - <source>Fatal error while testing the cryptographic functions.</source> - <translation>암호화 함수를 시험하는 중 오류가 발생하였습니다.</translation> - </message> - <message> - <source>KeePassXC - Error</source> - <translation>KeePassXC - 오류</translation> + <source>Existing single-instance lock file is invalid. Launching new instance.</source> + <translation>존재하는 단일 인스턴스 잠금 파일이 잘못되었습니다. 새 인스턴스를 실행합니다.</translation> </message> <message> <source>The lock file could not be created. Single-instance mode disabled.</source> @@ -1349,64 +2414,32 @@ This is a one-way migration. You won't be able to open the imported databas <translation>다른 KeePassXC 인스턴스가 이미 실행 중입니다.</translation> </message> <message> - <source>Existing single-instance lock file is invalid. Launching new instance.</source> - <translation>존재하는 단일 인스턴스 잠금 파일이 잘못되었습니다. 새 인스턴스를 실행합니다.</translation> + <source>Fatal error while testing the cryptographic functions.</source> + <translation>암호화 함수를 시험하는 중 오류가 발생하였습니다.</translation> + </message> + <message> + <source>KeePassXC - Error</source> + <translation>KeePassXC - 오류</translation> </message> </context> <context> <name>MainWindow</name> <message> - <source>Open database</source> - <translation>데이터베이스 열기</translation> - </message> - <message> - <source>Database settings</source> - <translation>데이터베이스 설정</translation> - </message> - <message> - <source>Copy username to clipboard</source> - <translation>클립보드에 사용자 이름 복사</translation> - </message> - <message> - <source>Copy password to clipboard</source> - <translation>클립보드에 암호 복사</translation> - </message> - <message> - <source>Settings</source> - <translation>설정</translation> - </message> - <message> - <source>Show toolbar</source> - <translation>도구 모음 보이기</translation> - </message> - <message> - <source>read-only</source> - <translation>읽기 전용</translation> - </message> - <message> - <source>Toggle window</source> - <translation>창 전환</translation> - </message> - <message> - <source>KeePass 2 Database</source> - <translation>KeePass 2 데이터베이스</translation> - </message> - <message> - <source>All files</source> - <translation>모든 파일</translation> - </message> - <message> - <source>Save repaired database</source> - <translation>복구한 데이터베이스 저장</translation> - </message> - <message> - <source>Writing the database failed.</source> - <translation>데이터베이스에 쓸 수 없습니다.</translation> + <source>&Database</source> + <translation>데이터베이스(&D)</translation> </message> <message> <source>&Recent databases</source> <translation>최근 데이터베이스(&R)</translation> </message> + <message> + <source>Import</source> + <translation>가져오기</translation> + </message> + <message> + <source>&Help</source> + <translation>도움말(&H)</translation> + </message> <message> <source>E&ntries</source> <translation>항목(&N)</translation> @@ -1415,13 +2448,17 @@ This is a one-way migration. You won't be able to open the imported databas <source>Copy att&ribute to clipboard</source> <translation>속성을 클립보드에 복사(&R)</translation> </message> + <message> + <source>Time-based one-time password</source> + <translation type="unfinished"/> + </message> <message> <source>&Groups</source> <translation>그룹(&G)</translation> </message> <message> - <source>&View</source> - <translation>보기(&V)</translation> + <source>&Tools</source> + <translation>도구(&T)</translation> </message> <message> <source>&Quit</source> @@ -1431,6 +2468,10 @@ This is a one-way migration. You won't be able to open the imported databas <source>&About</source> <translation>정보(&A)</translation> </message> + <message> + <source>&Open database...</source> + <translation>데이터베이스 열기(&O)...</translation> + </message> <message> <source>&Save database</source> <translation>데이터베이스 저장(&S)</translation> @@ -1471,26 +2512,26 @@ This is a one-way migration. You won't be able to open the imported databas <source>&Delete group</source> <translation>그룹 삭제(&D)</translation> </message> + <message> + <source>Sa&ve database as...</source> + <translation>다른 이름으로 데이터베이스 저장(&V)...</translation> + </message> + <message> + <source>Change &master key...</source> + <translation>마스터 키 변경(&M)...</translation> + </message> <message> <source>&Database settings</source> <translation>데이터베이스 설정(&D)</translation> </message> + <message> + <source>Database settings</source> + <translation>데이터베이스 설정</translation> + </message> <message> <source>&Clone entry</source> <translation>항목 복제(&C)</translation> </message> - <message> - <source>Timed one-time password</source> - <translation>시간 동기 일회용 암호</translation> - </message> - <message> - <source>Copy &TOTP</source> - <translation>TOTP 복사(&T)</translation> - </message> - <message> - <source>Show TOTP</source> - <translation>TOTP 보이기</translation> - </message> <message> <source>&Find</source> <translation>찾기(&F)</translation> @@ -1499,14 +2540,26 @@ This is a one-way migration. You won't be able to open the imported databas <source>Copy &username</source> <translation>사용자 이름 복사(&U)</translation> </message> + <message> + <source>Copy username to clipboard</source> + <translation>클립보드에 사용자 이름 복사</translation> + </message> <message> <source>Cop&y password</source> <translation>암호 복사(&Y)</translation> </message> + <message> + <source>Copy password to clipboard</source> + <translation>클립보드에 암호 복사</translation> + </message> <message> <source>&Settings</source> <translation>설정(&S)</translation> </message> + <message> + <source>Password Generator</source> + <translation>암호 생성기</translation> + </message> <message> <source>&Perform Auto-Type</source> <translation>자동 입력 실행(&P)</translation> @@ -1523,65 +2576,25 @@ This is a one-way migration. You won't be able to open the imported databas <source>&Title</source> <translation>제목(&T)</translation> </message> + <message> + <source>Copy title to clipboard</source> + <translation type="unfinished"/> + </message> <message> <source>&URL</source> <translation>URL(&U)</translation> </message> + <message> + <source>Copy URL to clipboard</source> + <translation type="unfinished"/> + </message> <message> <source>&Notes</source> <translation>메모(&N)</translation> </message> <message> - <source>Password Generator</source> - <translation>암호 생성기</translation> - </message> - <message> - <source>Clear history</source> - <translation>과거 기록 삭제</translation> - </message> - <message> - <source>&Database</source> - <translation>데이터베이스(&D)</translation> - </message> - <message> - <source>Import</source> - <translation>가져오기</translation> - </message> - <message> - <source>&Tools</source> - <translation>도구(&T)</translation> - </message> - <message> - <source>Empty recycle bin</source> - <translation>휴지통 비우기</translation> - </message> - <message> - <source>Access error for config file %1</source> - <translation>설정 파일 %1에 접근할 수 없음</translation> - </message> - <message> - <source>Quit KeePassXC</source> - <translation>KeePassXC 끝내기</translation> - </message> - <message> - <source>Please touch the button on your YubiKey!</source> - <translation>YubiKey의 단추를 누르십시오!</translation> - </message> - <message> - <source>&Help</source> - <translation>도움말(&H)</translation> - </message> - <message> - <source>&Open database...</source> - <translation>데이터베이스 열기(&O)...</translation> - </message> - <message> - <source>Sa&ve database as...</source> - <translation>다른 이름으로 데이터베이스 저장(&V)...</translation> - </message> - <message> - <source>Change &master key...</source> - <translation>마스터 키 변경(&M)...</translation> + <source>Copy notes to clipboard</source> + <translation type="unfinished"/> </message> <message> <source>&Export to CSV file...</source> @@ -1599,10 +2612,169 @@ This is a one-way migration. You won't be able to open the imported databas <source>Re&pair database...</source> <translation>데이터베이스 복구(&P)...</translation> </message> + <message> + <source>Show TOTP</source> + <translation>TOTP 보이기</translation> + </message> <message> <source>Set up TOTP...</source> <translation>TOTP 설정...</translation> </message> + <message> + <source>Copy &TOTP</source> + <translation>TOTP 복사(&T)</translation> + </message> + <message> + <source>E&mpty recycle bin</source> + <translation type="unfinished"/> + </message> + <message> + <source>Clear history</source> + <translation>과거 기록 삭제</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation>설정 파일 %1에 접근할 수 없음</translation> + </message> + <message> + <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> + <translation type="unfinished"/> + </message> + <message> + <source>read-only</source> + <translation>읽기 전용</translation> + </message> + <message> + <source>Settings</source> + <translation>설정</translation> + </message> + <message> + <source>Toggle window</source> + <translation>창 전환</translation> + </message> + <message> + <source>Quit KeePassXC</source> + <translation>KeePassXC 끝내기</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>KeePass 2 데이터베이스</translation> + </message> + <message> + <source>All files</source> + <translation>모든 파일</translation> + </message> + <message> + <source>Open database</source> + <translation>데이터베이스 열기</translation> + </message> + <message> + <source>Save repaired database</source> + <translation>복구한 데이터베이스 저장</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>데이터베이스에 쓸 수 없습니다.</translation> + </message> + <message> + <source>Please touch the button on your YubiKey!</source> + <translation>YubiKey의 단추를 누르십시오!</translation> + </message> +</context> +<context> + <name>OpenSSHKey</name> + <message> + <source>Invalid key file, expecting an OpenSSH key</source> + <translation type="unfinished"/> + </message> + <message> + <source>PEM boundary mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>This is not an OpenSSH key, only modern keys are supported</source> + <translation type="unfinished"/> + </message> + <message> + <source>Base64 decoding failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file way too small.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file magic header id invalid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Found zero keys</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to read public key.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Corrupted key file, reading private key failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>No private key payload to decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Trying to run KDF without cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Passphrase is required to decrypt this key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key derivation failed, key file corrupted?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Decryption failed, wrong passphrase?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write public key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write private key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing private key</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OptionDialog</name> @@ -1610,22 +2782,63 @@ This is a one-way migration. You won't be able to open the imported databas <source>Dialog</source> <translation>대화 상자</translation> </message> + <message> + <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation>ChromeIPass나 PassIFox에서 데이터베이스에 접근하려면 필요합니다</translation> + </message> + <message> + <source>Enable KeePassHTTP server</source> + <translation>KeePassHTTP 서버 사용</translation> + </message> <message> <source>General</source> <translation>일반</translation> </message> <message> <source>Sh&ow a notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> <translation>인증 정보가 필요할 때 알림 표시(&O)</translation> </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>도메인이 일치하는 모든 항목 대신 지정한 URL과 일치하는 항목만 반환합니다.</translation> + </message> + <message> + <source>&Return only best matching entries</source> + <translation>URL과 일치하는 항목만 반환(&R)</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>데이터베이스가 잠겼을 때 잠금 해제 요청(&Q)</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> + <translation>같은 스키마(http://, https://, ftp://)를 사용하는 항목만 반환합니다.</translation> + </message> + <message> + <source>&Match URL schemes</source> + <translation>URL 스키마 일치(&M)</translation> + </message> <message> <source>Sort matching entries by &username</source> <translation>사용자 이름 순으로 일치하는 항목 정렬(&U)</translation> </message> + <message> + <source>Sort &matching entries by title</source> + <translation>제목 순으로 일치하는 항목 정렬(&M)</translation> + </message> + <message> + <source>R&emove all shared encryption keys from active database</source> + <translation>활성 데이터베이스에 있는 모든 공유된 암호화 키 삭제(&E)</translation> + </message> <message> <source>Re&move all stored permissions from entries in active database</source> <translation>활성 데이터베이스에 있는 항목에서 모든 저장된 권한 삭제(&M)</translation> </message> + <message> + <source>Password Generator</source> + <translation>암호 생성기</translation> + </message> <message> <source>Advanced</source> <translation>고급</translation> @@ -1638,10 +2851,22 @@ This is a one-way migration. You won't be able to open the imported databas <source>Always allow &updating entries</source> <translation>항상 항목 업데이트 허용(&U)</translation> </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>선택한 데이터베이스만 클라이언트와 연결할 수 있습니다.</translation> + </message> <message> <source>Searc&h in all opened databases for matching entries</source> <translation>모든 열린 데이터베이스에서 일치하는 항목 검색(&H)</translation> </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>문자열 필드를 자동으로 만들거나 업데이트하는 것은 지원되지 않습니다.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>"KPH: "로 시작하는 고급 문자열 필드 반환(&R)</translation> + </message> <message> <source>HTTP Port:</source> <translation>HTTP 포트:</translation> @@ -1650,18 +2875,18 @@ This is a one-way migration. You won't be able to open the imported databas <source>Default port: 19455</source> <translation>기본 포트: 19455</translation> </message> - <message> - <source>Re&quest to unlock the database if it is locked</source> - <translation>데이터베이스가 잠겼을 때 잠금 해제 요청(&Q)</translation> - </message> - <message> - <source>Sort &matching entries by title</source> - <translation>제목 순으로 일치하는 항목 정렬(&M)</translation> - </message> <message> <source>KeePassXC will listen to this port on 127.0.0.1</source> <translation>KeePassXC는 127.0.0.1의 다음 포트에서 응답을 기다립니다</translation> </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> + <translation type="unfinished"/> + </message> <message> <source>Cannot bind to privileged ports</source> <translation>권한 있는 포트에 바인드할 수 없음</translation> @@ -1672,63 +2897,30 @@ Using default port 19455.</source> <translation>1024 이하의 권한이 필요한 포트에 바인드할 수 없습니다! 기본 포트 19455를 사용합니다.</translation> </message> - <message> - <source>R&emove all shared encryption keys from active database</source> - <translation>활성 데이터베이스에 있는 모든 공유된 암호화 키 삭제(&E)</translation> - </message> - <message> - <source>&Return advanced string fields which start with "KPH: "</source> - <translation>"KPH: "로 시작하는 고급 문자열 필드 반환(&R)</translation> - </message> - <message> - <source>Automatically creating or updating string fields is not supported.</source> - <translation>문자열 필드를 자동으로 만들거나 업데이트하는 것은 지원되지 않습니다.</translation> - </message> - <message> - <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> - <translation>ChromeIPass나 PassIFox에서 데이터베이스에 접근하려면 필요합니다</translation> - </message> - <message> - <source>Enable KeePassHTTP server</source> - <translation>KeePassHTTP 서버 사용</translation> - </message> - <message> - <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation>도메인이 일치하는 모든 항목 대신 지정한 URL과 일치하는 항목만 반환합니다.</translation> - </message> - <message> - <source>&Return only best matching entries</source> - <translation>URL과 일치하는 항목만 반환(&R)</translation> - </message> - <message> - <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation>같은 스키마(http://, https://, ftp://)를 사용하는 항목만 반환합니다.</translation> - </message> - <message> - <source>&Match URL schemes</source> - <translation>URL 스키마 일치(&M)</translation> - </message> - <message> - <source>Password Generator</source> - <translation>암호 생성기</translation> - </message> - <message> - <source>Only the selected database has to be connected with a client.</source> - <translation>선택한 데이터베이스만 클라이언트와 연결할 수 있습니다.</translation> - </message> - <message> - <source>The following options can be dangerous! -Change them only if you know what you are doing.</source> - <translation>다음 옵션은 위험할 수도 있습니다! -무엇을 하는 지 알고 있는 경우에만 변경하십시오.</translation> - </message> </context> <context> <name>PasswordGeneratorWidget</name> + <message> + <source>%p%</source> + <translation>%p%</translation> + </message> <message> <source>Password:</source> <translation>암호:</translation> </message> + <message> + <source>strength</source> + <comment>Password strength</comment> + <translation>강도</translation> + </message> + <message> + <source>entropy</source> + <translation>엔트로피</translation> + </message> + <message> + <source>Password</source> + <translation>암호</translation> + </message> <message> <source>Character Types</source> <translation>문자 종류</translation> @@ -1749,38 +2941,50 @@ Change them only if you know what you are doing.</source> <source>Special Characters</source> <translation>특수 문자</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>확장 ASCII</translation> + </message> <message> <source>Exclude look-alike characters</source> <translation>비슷하게 생긴 문자 제외</translation> </message> - <message> - <source>Accept</source> - <translation>사용</translation> - </message> - <message> - <source>%p%</source> - <translation>%p%</translation> - </message> - <message> - <source>strength</source> - <translation>강도</translation> - </message> - <message> - <source>entropy</source> - <translation>엔트로피</translation> - </message> - <message> - <source>&Length:</source> - <translation>길이(&L):</translation> - </message> <message> <source>Pick characters from every group</source> <translation>모든 그룹에서 글자 선택</translation> </message> + <message> + <source>&Length:</source> + <translation>길이(&L):</translation> + </message> + <message> + <source>Passphrase</source> + <translation>암구호</translation> + </message> + <message> + <source>Wordlist:</source> + <translation>단어 목록:</translation> + </message> + <message> + <source>Word Count:</source> + <translation>단어 개수:</translation> + </message> + <message> + <source>Word Separator:</source> + <translation>단어 구분자:</translation> + </message> <message> <source>Generate</source> <translation>생성</translation> </message> + <message> + <source>Copy</source> + <translation>복사</translation> + </message> + <message> + <source>Accept</source> + <translation>사용</translation> + </message> <message> <source>Close</source> <translation>닫기</translation> @@ -1799,51 +3003,270 @@ Change them only if you know what you are doing.</source> </message> <message> <source>Poor</source> + <comment>Password quality</comment> <translation>매우 약함</translation> </message> <message> <source>Weak</source> + <comment>Password quality</comment> <translation>약함</translation> </message> <message> <source>Good</source> + <comment>Password quality</comment> <translation>좋음</translation> </message> <message> <source>Excellent</source> + <comment>Password quality</comment> <translation>매우 좋음</translation> </message> - <message> - <source>Password</source> - <translation>암호</translation> - </message> - <message> - <source>Extended ASCII</source> - <translation>확장 ASCII</translation> - </message> - <message> - <source>Passphrase</source> - <translation>암구호</translation> - </message> - <message> - <source>Wordlist:</source> - <translation>단어 목록:</translation> - </message> - <message> - <source>Word Count:</source> - <translation>단어 개수:</translation> - </message> - <message> - <source>Word Separator:</source> - <translation>단어 구분자:</translation> - </message> - <message> - <source>Copy</source> - <translation>복사</translation> - </message> </context> <context> <name>QObject</name> + <message> + <source>Database not opened</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database hash not available</source> + <translation type="unfinished"/> + </message> + <message> + <source>Client public key not received</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot decrypt message</source> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout or cannot connect to KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>Action cancelled or denied</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC association failed, try again</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key change was not successful</source> + <translation type="unfinished"/> + </message> + <message> + <source>Encryption key is not recognized</source> + <translation type="unfinished"/> + </message> + <message> + <source>No saved databases found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect action</source> + <translation type="unfinished"/> + </message> + <message> + <source>Empty message received</source> + <translation type="unfinished"/> + </message> + <message> + <source>No URL provided</source> + <translation type="unfinished"/> + </message> + <message> + <source>No logins found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown error</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add a new entry to a database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>데이터베이스의 경로입니다.</translation> + </message> + <message> + <source>Key file of the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>path</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>username</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Prompt for the entry's password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a password for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length for the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to add.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy an entry's password to the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to clip.</source> + <comment>clip = copy to clipboard</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout in seconds before clearing the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Edit an entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Title for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>title</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to edit.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Estimate the entropy of a password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password for which to estimate the entropy.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Perform advanced analysis on the password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Extract and print the content of a database.</source> + <translation>데이터베이스의 내용을 추출하고 표시합니다.</translation> + </message> + <message> + <source>Path of the database to extract.</source> + <translation>표시할 데이터베이스 경로입니다.</translation> + </message> + <message> + <source>Insert password to unlock %1: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to load key file %1 : %2</source> + <translation type="unfinished"/> + </message> + <message> + <source>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source> + +Available commands: +</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the command to execute.</source> + <translation>실행할 명령 이름입니다.</translation> + </message> + <message> + <source>List database entries.</source> + <translation>데이터베이스 항목을 표시합니다.</translation> + </message> + <message> + <source>Path of the group to list. Default is /</source> + <translation>표시할 그룹의 경로입니다. 기본값은 /입니다</translation> + </message> + <message> + <source>Find entries quickly.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Search term.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Merge two databases.</source> + <translation>두 데이터베이스를 합칩니다.</translation> + </message> + <message> + <source>Path of the database to merge into.</source> + <translation>합칠 대상 데이터베이스 경로입니다.</translation> + </message> + <message> + <source>Path of the database to merge from.</source> + <translation>합칠 원본 데이터베이스 경로입니다.</translation> + </message> + <message> + <source>Use the same credentials for both database files.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file of the database to merge from.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show an entry's information.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> + <translation type="unfinished"/> + </message> + <message> + <source>attribute</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the entry to show.</source> + <translation>표시할 항목 이름입니다.</translation> + </message> <message> <source>NULL device</source> <translation>NULL 장치</translation> @@ -1867,8 +3290,28 @@ Change them only if you know what you are doing.</source> <translation>닫는 따옴표 없음</translation> </message> <message> - <source>INTERNAL - unget lower bound exceeded</source> - <translation>내부 - unget 최소값을 벗어남</translation> + <source>AES: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Twofish: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>ChaCha20: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Argon2 (KDBX 4 – recommended)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 4)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 3.1)</source> + <translation type="unfinished"/> </message> <message> <source>Group</source> @@ -1886,14 +3329,22 @@ Change them only if you know what you are doing.</source> <source>Password</source> <translation>암호</translation> </message> - <message> - <source>URL</source> - <translation>URL</translation> - </message> <message> <source>Notes</source> <translation>메모</translation> </message> + <message> + <source>Last Modified</source> + <translation type="unfinished"/> + </message> + <message> + <source>Created</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy Browser Integration</source> + <translation type="unfinished"/> + </message> <message> <source>Browser Integration</source> <translation>브라우저 통합</translation> @@ -1910,6 +3361,10 @@ Change them only if you know what you are doing.</source> <source>Passive</source> <translation>수동적</translation> </message> + <message> + <source>SSH Agent</source> + <translation type="unfinished"/> + </message> </context> <context> <name>QtIOCompressor</name> @@ -1948,8 +3403,8 @@ Change them only if you know what you are doing.</source> <context> <name>SearchWidget</name> <message> - <source>Case Sensitive</source> - <translation>대소문자 구분</translation> + <source>Search...</source> + <translation>찾기...</translation> </message> <message> <source>Search</source> @@ -1960,8 +3415,8 @@ Change them only if you know what you are doing.</source> <translation>비우기</translation> </message> <message> - <source>Search...</source> - <translation>찾기...</translation> + <source>Case Sensitive</source> + <translation>대소문자 구분</translation> </message> <message> <source>Limit search to selected group</source> @@ -1970,50 +3425,6 @@ Change them only if you know what you are doing.</source> </context> <context> <name>Service</name> - <message> - <source>A shared encryption-key with the name "%1" already exists. -Do you want to overwrite it?</source> - <translation>이름이 "%1"인 공유 암호화 키가 이미 있습니다. -덮어쓰시겠습니까?</translation> - </message> - <message> - <source>Do you want to update the information in %1 - %2?</source> - <translation>%1 - %2의 정보를 업데이트하시겠습니까?</translation> - </message> - <message> - <source>The active database is locked! -Please unlock the selected database or choose another one which is unlocked.</source> - <translation>활성 데이터베이스가 잠겨 있습니다! -선택한 데이터베이스의 잠금을 풀거나 잠금이 풀린 데이터베이스를 선택하십시오.</translation> - </message> - <message> - <source>Successfully removed %1 encryption-%2 from KeePassX/Http Settings.</source> - <translation>KeePassX/HTTP 설정에서 %1 암호화-%2을(를) 삭제했습니다.</translation> - </message> - <message> - <source>No shared encryption-keys found in KeePassHttp Settings.</source> - <translation>KeePassHttp 설정에서 공유 암호화 키를 찾을 수 없습니다.</translation> - </message> - <message> - <source>The active database does not contain an entry of KeePassHttp Settings.</source> - <translation>활성 데이터베이스에 KeePassHttp 설정 항목이 없습니다.</translation> - </message> - <message> - <source>Removing stored permissions...</source> - <translation>저장된 권한 삭제 중...</translation> - </message> - <message> - <source>Abort</source> - <translation>중지</translation> - </message> - <message> - <source>Successfully removed permissions from %1 %2.</source> - <translation>%1 %2에서 권한을 삭제했습니다.</translation> - </message> - <message> - <source>The active database does not contain an entry with permissions.</source> - <translation>활성 데이터베이스에 권한이 부여된 항목이 없습니다.</translation> - </message> <message> <source>KeePassXC: New key association request</source> <translation>KeePassXC: 새 키 연결 요청</translation> @@ -2030,34 +3441,78 @@ give it a unique name to identify and accept it.</source> <source>KeePassXC: Overwrite existing key?</source> <translation>KeePassXC: 기존 키를 덮어쓰시겠습니까?</translation> </message> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>이름이 "%1"인 공유 암호화 키가 이미 있습니다. +덮어쓰시겠습니까?</translation> + </message> <message> <source>KeePassXC: Update Entry</source> <translation>KeePassXC: 항목 업데이트</translation> </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>%1 - %2의 정보를 업데이트하시겠습니까?</translation> + </message> <message> <source>KeePassXC: Database locked!</source> <translation>KeePassXC: 데이터베이스 잠김!</translation> </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>활성 데이터베이스가 잠겨 있습니다! +선택한 데이터베이스의 잠금을 풀거나 잠금이 풀린 데이터베이스를 선택하십시오.</translation> + </message> <message> <source>KeePassXC: Removed keys from database</source> <translation>KeePassXC: 데이터베이스에서 키 삭제됨</translation> </message> + <message numerus="yes"> + <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No keys found</source> <translation>KeePassXC: 키를 찾을 수 없음</translation> </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation>KeePassHttp 설정에서 공유 암호화 키를 찾을 수 없습니다.</translation> + </message> <message> <source>KeePassXC: Settings not available!</source> <translation>KeePassXC: 설정을 사용할 수 없음!</translation> </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation>활성 데이터베이스에 KeePassHttp 설정 항목이 없습니다.</translation> + </message> + <message> + <source>Removing stored permissions...</source> + <translation>저장된 권한 삭제 중...</translation> + </message> + <message> + <source>Abort</source> + <translation>중지</translation> + </message> <message> <source>KeePassXC: Removed permissions</source> <translation>KeePassXC: 권한 삭제됨</translation> </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entries.</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No entry with permissions found!</source> <translation>KeePassXC: 권한이 있는 항목을 찾을 수 없음!</translation> </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>활성 데이터베이스에 권한이 부여된 항목이 없습니다.</translation> + </message> </context> <context> <name>SettingsWidget</name> @@ -2080,10 +3535,26 @@ give it a unique name to identify and accept it.</source> </context> <context> <name>SettingsWidgetGeneral</name> + <message> + <source>Basic Settings</source> + <translation>기본 설정</translation> + </message> + <message> + <source>Start only a single instance of KeePassXC</source> + <translation>KeePassXC 단일 인스턴스만 사용</translation> + </message> <message> <source>Remember last databases</source> <translation>마지막 데이터베이스 기억</translation> </message> + <message> + <source>Remember last key files and security dongles</source> + <translation>마지막 키 파일과 보안 동글 기억</translation> + </message> + <message> + <source>Load previous databases on startup</source> + <translation>시작할 때 이전 데이터베이스 불러오기</translation> + </message> <message> <source>Automatically save on exit</source> <translation>끝낼 때 자동 저장</translation> @@ -2092,21 +3563,29 @@ give it a unique name to identify and accept it.</source> <source>Automatically save after every change</source> <translation>항목을 변경할 때 자동 저장</translation> </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation>외부에서 데이터베이스를 수정했을 때 자동으로 새로 고침</translation> + </message> <message> <source>Minimize when copying to clipboard</source> <translation>클립보드에 복사할 때 최소화</translation> </message> + <message> + <source>Minimize window at application startup</source> + <translation>프로그램 시작 시 창 최소화</translation> + </message> <message> <source>Use group icon on entry creation</source> <translation>항목을 만들 때 그룹 아이콘 사용</translation> </message> <message> - <source>Global Auto-Type shortcut</source> - <translation>전역 자동 입력 단축키</translation> + <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> + <translation>데이터가 변경되지 않았을 때 데이터베이스를 수정된 것으로 표시하지 않음(예: 그룹 확장)</translation> </message> <message> - <source>Language</source> - <translation>언어</translation> + <source>Hide the Details view</source> + <translation type="unfinished"/> </message> <message> <source>Show a system tray icon</source> @@ -2116,67 +3595,61 @@ give it a unique name to identify and accept it.</source> <source>Hide window to system tray when minimized</source> <translation>시스템 트레이로 최소화</translation> </message> - <message> - <source>Load previous databases on startup</source> - <translation>시작할 때 이전 데이터베이스 불러오기</translation> - </message> - <message> - <source>Automatically reload the database when modified externally</source> - <translation>외부에서 데이터베이스를 수정했을 때 자동으로 새로 고침</translation> - </message> <message> <source>Hide window to system tray instead of app exit</source> <translation>프로그램을 끝내지 않고 시스템 트레이로 창 숨기기</translation> </message> <message> - <source>Minimize window at application startup</source> - <translation>프로그램 시작 시 창 최소화</translation> + <source>Dark system tray icon</source> + <translation type="unfinished"/> </message> <message> - <source>Basic Settings</source> - <translation>기본 설정</translation> - </message> - <message> - <source>Remember last key files and security dongles</source> - <translation>마지막 키 파일과 보안 동글 기억</translation> - </message> - <message> - <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> - <translation>데이터가 변경되지 않았을 때 데이터베이스를 수정된 것으로 표시하지 않음(예: 그룹 확장)</translation> + <source>Language</source> + <translation>언어</translation> </message> <message> <source>Auto-Type</source> <translation>자동 입력</translation> </message> <message> - <source>Use entry title and URL to match windows for global Auto-Type</source> - <translation>전역 자동 입력 창을 검사할 때 항목 제목과 URL 사용</translation> + <source>Use entry title to match windows for global Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use entry URL to match windows for global Auto-Type</source> + <translation type="unfinished"/> </message> <message> <source>Always ask before performing Auto-Type</source> <translation>자동 입력 시 항상 묻기</translation> </message> + <message> + <source>Global Auto-Type shortcut</source> + <translation>전역 자동 입력 단축키</translation> + </message> <message> <source>Auto-Type delay</source> <translation>자동 입력 지연 시간</translation> </message> <message> <source> ms</source> + <comment>Milliseconds</comment> <translation>ms</translation> </message> - <message> - <source>Start only a single instance of KeePassXC</source> - <translation>KeePassXC 단일 인스턴스만 사용</translation> - </message> </context> <context> <name>SettingsWidgetSecurity</name> + <message> + <source>Timeouts</source> + <translation>시간 제한</translation> + </message> <message> <source>Clear clipboard after</source> <translation>다음 시간 이후 클립보드 비우기</translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation>초</translation> </message> <message> @@ -2184,8 +3657,12 @@ give it a unique name to identify and accept it.</source> <translation>다음 시간 동안 활동이 없을 때 데이터베이스 잠금</translation> </message> <message> - <source>Show passwords in cleartext by default</source> - <translation>기본값으로 암호를 평문으로 표시</translation> + <source>Convenience</source> + <translation>편의성</translation> + </message> + <message> + <source>Lock databases when session is locked or lid is closed</source> + <translation>세션이 잠겼을 때나 덮개를 닫았을 때 데이터베이스 잠금</translation> </message> <message> <source>Lock databases after minimizing the window</source> @@ -2196,16 +3673,16 @@ give it a unique name to identify and accept it.</source> <translation>암호가 보일 때 반복하지 않음</translation> </message> <message> - <source>Timeouts</source> - <translation>시간 제한</translation> + <source>Show passwords in cleartext by default</source> + <translation>기본값으로 암호를 평문으로 표시</translation> </message> <message> - <source>Convenience</source> - <translation>편의성</translation> + <source>Hide passwords in the preview panel</source> + <translation type="unfinished"/> </message> <message> - <source>Lock databases when session is locked or lid is closed</source> - <translation>세션이 잠겼을 때나 덮개를 닫았을 때 데이터베이스 잠금</translation> + <source>Hide entry notes by default</source> + <translation type="unfinished"/> </message> <message> <source>Privacy</source> @@ -2226,6 +3703,14 @@ give it a unique name to identify and accept it.</source> <source>Key:</source> <translation>키:</translation> </message> + <message> + <source>Default RFC 6238 token settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Steam token settings</source> + <translation type="unfinished"/> + </message> <message> <source>Use custom settings</source> <translation>사용자 정의 설정 사용</translation> @@ -2252,6 +3737,7 @@ give it a unique name to identify and accept it.</source> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation>초</translation> </message> </context> @@ -2318,6 +3804,26 @@ give it a unique name to identify and accept it.</source> </context> <context> <name>main</name> + <message> + <source>Remove an entry from the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>데이터베이스의 경로입니다.</translation> + </message> + <message> + <source>Path of the entry to remove.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation>KeePassXC - 크로스 플랫폼 암호 관리자</translation> + </message> + <message> + <source>filenames of the password databases to open (*.kdbx)</source> + <translation>열 암호 데이터베이스 파일 이름(*.kdbx)</translation> + </message> <message> <source>path to a custom config file</source> <translation>사용자 정의 설정 파일 경로</translation> @@ -2326,81 +3832,13 @@ give it a unique name to identify and accept it.</source> <source>key file of the database</source> <translation>데이터베이스 키 파일</translation> </message> - <message> - <source>KeePassXC - cross-platform password manager</source> - <translation>KeePassXC - 크로스 플랫폼 암호 관리자</translation> - </message> <message> <source>read password of the database from stdin</source> <translation>표준 입력에서 데이터베이스 암호 읽기</translation> </message> <message> - <source>filenames of the password databases to open (*.kdbx)</source> - <translation>열 암호 데이터베이스 파일 이름(*.kdbx)</translation> - </message> - <message> - <source>Copy a password to the clipboard</source> - <translation>클립보드에 암호 복사</translation> - </message> - <message> - <source>Path of the database.</source> - <translation>데이터베이스의 경로입니다.</translation> - </message> - <message> - <source>Use a GUI prompt unlocking the database.</source> - <translation>데이터베이스 잠금을 해제할 GUI 프롬프트를 표시합니다.</translation> - </message> - <message> - <source>Name of the entry to clip.</source> - <translation>클립보드에 복사할 항목 이름입니다.</translation> - </message> - <message> - <source>Extract and print the content of a database.</source> - <translation>데이터베이스의 내용을 추출하고 표시합니다.</translation> - </message> - <message> - <source>Path of the database to extract.</source> - <translation>표시할 데이터베이스 경로입니다.</translation> - </message> - <message> - <source>Name of the command to execute.</source> - <translation>실행할 명령 이름입니다.</translation> - </message> - <message> - <source>List database entries.</source> - <translation>데이터베이스 항목을 표시합니다.</translation> - </message> - <message> - <source>Path of the group to list. Default is /</source> - <translation>표시할 그룹의 경로입니다. 기본값은 /입니다</translation> - </message> - <message> - <source>Print the UUIDs of the entries and groups.</source> - <translation>항목과 그룹의 UUID를 표시합니다.</translation> - </message> - <message> - <source>Merge two databases.</source> - <translation>두 데이터베이스를 합칩니다.</translation> - </message> - <message> - <source>Path of the database to merge into.</source> - <translation>합칠 대상 데이터베이스 경로입니다.</translation> - </message> - <message> - <source>Path of the database to merge from.</source> - <translation>합칠 원본 데이터베이스 경로입니다.</translation> - </message> - <message> - <source>Use the same password for both database files.</source> - <translation>두 데이터베이스에 같은 암호를 사용합니다.</translation> - </message> - <message> - <source>Show a password.</source> - <translation>암호를 표시합니다.</translation> - </message> - <message> - <source>Name of the entry to show.</source> - <translation>표시할 항목 이름입니다.</translation> + <source>Parent window handle</source> + <translation type="unfinished"/> </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_lt.ts b/share/translations/keepassx_lt.ts index a9a483836..37737035c 100644 --- a/share/translations/keepassx_lt.ts +++ b/share/translations/keepassx_lt.ts @@ -9,14 +9,34 @@ <source>About</source> <translation>Apie</translation> </message> + <message> + <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> + <translation>Apie klaidas praneškite adresu: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> + </message> + <message> + <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>KeePassXC yra platinama GNU Bendrosios Viešosios Licencijos (GPL) versijos 2 arba (jūsų pasirinkimu) versijos 3 sąlygomis.</translation> + </message> + <message> + <source>Project Maintainers:</source> + <translation>Projektą prižiūri:</translation> + </message> <message> <source>Contributors</source> <translation>Talkininkai</translation> </message> + <message> + <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Žiūrėti talkinimus GitHub puslapyje</a></translation> + </message> <message> <source>Debug Info</source> <translation>Derinimo informacija</translation> </message> + <message> + <source>Include the following information whenever you report a bug:</source> + <translation>Pranešdami apie klaidą, visuomet pateikite ir šią informaciją:</translation> + </message> <message> <source>Copy to clipboard</source> <translation>Kopijuoti į iškarpinę</translation> @@ -31,6 +51,10 @@ <source>Revision: %1</source> <translation>Poversijis: %1</translation> </message> + <message> + <source>Distribution: %1</source> + <translation>Platinimas: %1</translation> + </message> <message> <source>Libraries:</source> <translation>Bibliotekos:</translation> @@ -47,33 +71,13 @@ Branduolys: %3 %4</translation> <source>Enabled extensions:</source> <translation>Įjungti plėtiniai:</translation> </message> - <message> - <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> - <translation>Apie klaidas praneškite adresu: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> - </message> - <message> - <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassXC yra platinama GNU Bendrosios Viešosios Licencijos (GPL) versijos 2 arba (jūsų pasirinkimu) versijos 3 sąlygomis.</translation> - </message> - <message> - <source>Project Maintainers:</source> - <translation>Projektą prižiūri:</translation> - </message> - <message> - <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Žiūrėti talkinimus GitHub puslapyje</a></translation> - </message> - <message> - <source>Include the following information whenever you report a bug:</source> - <translation>Pranešdami apie klaidą, visuomet pateikite ir šią informaciją:</translation> - </message> - <message> - <source>Distribution: %1</source> - <translation>Platinimas: %1</translation> - </message> </context> <context> <name>AccessControlDialog</name> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>KeePassXC HTTP prieigos patvirtinimas</translation> + </message> <message> <source>Remember this decision</source> <translation>Prisiminti šį sprendimą</translation> @@ -92,9 +96,12 @@ Please select whether you want to allow access.</source> <translation>%1 užklausė prieigos prie slaptažodžių šiam elementui(-ams). Pasirinkite, ar norite leisti prieigą.</translation> </message> +</context> +<context> + <name>AgentSettingsWidget</name> <message> - <source>KeePassXC HTTP Confirm Access</source> - <translation>KeePassXC HTTP prieigos patvirtinimas</translation> + <source>Enable SSH Agent (requires restart)</source> + <translation type="unfinished"/> </message> </context> <context> @@ -107,6 +114,26 @@ Pasirinkite, ar norite leisti prieigą.</translation> <source>Auto-Type - KeePassXC</source> <translation>Automatinis rinkimas - KeePassXC</translation> </message> + <message> + <source>Auto-Type</source> + <translation>Automatinis rinkimas</translation> + </message> + <message> + <source>The Syntax of your Auto-Type statement is incorrect!</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> </context> <context> <name>AutoTypeAssociationsModel</name> @@ -125,13 +152,290 @@ Pasirinkite, ar norite leisti prieigą.</translation> </context> <context> <name>AutoTypeSelectDialog</name> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>Automatinis rinkimas - KeePassXC</translation> + </message> <message> <source>Select entry to Auto-Type:</source> <translation>Pasirinkite įrašą automatiniam rinkimui:</translation> </message> +</context> +<context> + <name>BrowserAccessControlDialog</name> <message> - <source>Auto-Type - KeePassXC</source> - <translation>Automatinis rinkimas - KeePassXC</translation> + <source>KeePassXC-Browser Confirm Access</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remember this decision</source> + <translation>Prisiminti šį sprendimą</translation> + </message> + <message> + <source>Allow</source> + <translation>Leisti</translation> + </message> + <message> + <source>Deny</source> + <translation>Atmesti</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 užklausė prieigos prie slaptažodžių šiam elementui(-ams). +Pasirinkite, ar norite leisti prieigą.</translation> + </message> +</context> +<context> + <name>BrowserOptionDialog</name> + <message> + <source>Dialog</source> + <translation>Dialogas</translation> + </message> + <message> + <source>This is required for accessing your databases with KeePassXC-Browser</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable KeepassXC browser integration</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>Bendra</translation> + </message> + <message> + <source>Enable integration for these browsers:</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Google Chrome</source> + <translation>&Google Chrome</translation> + </message> + <message> + <source>&Firefox</source> + <translation>&Firefox</translation> + </message> + <message> + <source>&Chromium</source> + <translation>&Chromium</translation> + </message> + <message> + <source>&Vivaldi</source> + <translation>&Vivaldi</translation> + </message> + <message> + <source>Show a &notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Už&klausti atrakinti duomenų bazę, jeigu ji yra užrakinta</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Match URL scheme (e.g., https://...)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>Vietoj visos srities visų įrašų, grąžina tik geriausiai tam tikrą URL atitinkančius įrašus.</translation> + </message> + <message> + <source>&Return only best-matching credentials</source> + <translation type="unfinished"/> + </message> + <message> + <source>Sort &matching credentials by title</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Sort matching credentials by &username</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>&Disconnect all browsers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Forget all remembered &permissions</source> + <translation type="unfinished"/> + </message> + <message> + <source>Advanced</source> + <translation>Išplėstiniai</translation> + </message> + <message> + <source>Never &ask before accessing credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Never ask before &updating credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>Su klientu turi būti sujungta tik pasirinkta duomenų bazė.</translation> + </message> + <message> + <source>Searc&h in all opened databases for matching credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>Automatinis eilutės laukų kūrimas ar atnaujinimas nėra palaikomas.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>&Grąžinti išplėstines eilutes, kurios prasideda "KPH: "</translation> + </message> + <message> + <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Update &native messaging manifest files at startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Support a proxy application between KeePassXC and browser extension.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &proxy application between KeePassXC and browser extension</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a custom proxy location if you installed a proxy manually.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &custom proxy location</source> + <comment>Meant is the proxy for KeePassXC-Browser</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Naršyti...</translation> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*.exe);;All Files (*.*)</source> + <translation>Vykdomieji failai (*.exe);;Visi failai (*.*)</translation> + </message> + <message> + <source>Executable Files (*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select custom proxy location</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>BrowserService</name> + <message> + <source>KeePassXC: New key association request</source> + <translation>KeePassXC: Naujo rakto susiejimo užklausa</translation> + </message> + <message> + <source>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Save and allow access</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: Perrašyti esamą raktą?</translation> + </message> + <message> + <source>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: Atnaujinti įrašą</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Ar norite atnaujinti informaciją ties %1 - %2?</translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: Duomenų bazė užrakinta!</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>Aktyvi duomenų bazė yra užrakinta! +Prašome atrakinti pasirinktą duomenų bazę arba pasirinkti kitą, kuri būtų atrakinta.</translation> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: Nustatymai neprieinami!</translation> + </message> + <message> + <source>The active database does not contain a settings entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: Raktų nerasta</translation> + </message> + <message> + <source>No shared encryption keys found in KeePassXC Settings.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: Pašalinti raktai iš duomenų bazės</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Removing stored permissions…</source> + <translation type="unfinished"/> + </message> + <message> + <source>Abort</source> + <translation>Nutraukti</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: Pašalinti leidimai</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entry(s).</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation>KeePassXC: Nerasta jokių įrašų su leidimais!</translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>Aktyvioje duomenų bazėje nėra įrašo su leidimais.</translation> </message> </context> <context> @@ -148,6 +452,10 @@ Pasirinkite, ar norite leisti prieigą.</translation> <source>Repeat password:</source> <translation>Pakartokite slaptažodį:</translation> </message> + <message> + <source>&Key file</source> + <translation>&Rakto failas</translation> + </message> <message> <source>Browse</source> <translation>Naršyti</translation> @@ -156,6 +464,14 @@ Pasirinkite, ar norite leisti prieigą.</translation> <source>Create</source> <translation>Kurti</translation> </message> + <message> + <source>Cha&llenge Response</source> + <translation>Iššū&kio atsakymas</translation> + </message> + <message> + <source>Refresh</source> + <translation>Įkelti iš naujo</translation> + </message> <message> <source>Key files</source> <translation>Rakto failai</translation> @@ -176,6 +492,10 @@ Pasirinkite, ar norite leisti prieigą.</translation> <source>Select a key file</source> <translation>Pasirinkite rakto failą</translation> </message> + <message> + <source>Empty password</source> + <translation>Tuščias slaptažodis</translation> + </message> <message> <source>Do you really want to use an empty string as password?</source> <translation>Ar tikrai norite naudoti tuščią eilutę kaip slaptažodį?</translation> @@ -191,20 +511,15 @@ Pasirinkite, ar norite leisti prieigą.</translation> %2</translation> </message> <message> - <source>&Key file</source> - <translation>&Rakto failas</translation> + <source>Legacy key file format</source> + <translation type="unfinished"/> </message> <message> - <source>Cha&llenge Response</source> - <translation>Iššū&kio atsakymas</translation> - </message> - <message> - <source>Refresh</source> - <translation>Įkelti iš naujo</translation> - </message> - <message> - <source>Empty password</source> - <translation>Tuščias slaptažodis</translation> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -217,6 +532,10 @@ Pasirinkite, ar norite leisti prieigą.</translation> <source>Clone Options</source> <translation>Dubliavimo parinktys</translation> </message> + <message> + <source>Append ' - Clone' to title</source> + <translation>Pridėti prie pavadinimo " - Dublikatas"</translation> + </message> <message> <source>Replace username and password with references</source> <translation>Pakeisti naudotojo vardą ir slaptažodį nuorodomis</translation> @@ -225,10 +544,6 @@ Pasirinkite, ar norite leisti prieigą.</translation> <source>Copy history</source> <translation>Kopijuoti istoriją</translation> </message> - <message> - <source>Append ' - Clone' to title</source> - <translation>Pridėti prie pavadinimo " - Dublikatas"</translation> - </message> </context> <context> <name>CsvImportWidget</name> @@ -325,10 +640,6 @@ Pasirinkite, ar norite leisti prieigą.</translation> </context> <context> <name>CsvImportWizard</name> - <message> - <source>Import CSV file</source> - <translation>Importuoti CSV failą</translation> - </message> <message> <source>Error</source> <translation>Klaida</translation> @@ -340,17 +651,17 @@ Pasirinkite, ar norite leisti prieigą.</translation> </context> <context> <name>CsvParserModel</name> - <message> - <source> byte, </source> - <translation> baitų, </translation> + <message numerus="yes"> + <source>%n byte(s), </source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> </message> - <message> - <source> rows, </source> - <translation> eilučių, </translation> + <message numerus="yes"> + <source>%n row(s), </source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> </message> - <message> - <source> columns</source> - <translation> stulpelių</translation> + <message numerus="yes"> + <source>%n column(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> </message> </context> <context> @@ -371,6 +682,14 @@ Pasirinkite, ar norite leisti prieigą.</translation> <source>Browse</source> <translation>Naršyti</translation> </message> + <message> + <source>Refresh</source> + <translation>Įkelti iš naujo</translation> + </message> + <message> + <source>Challenge Response:</source> + <translation>Iššūkio atsakymas:</translation> + </message> <message> <source>Unable to open the database.</source> <translation>Nepavyko atverti duomenų bazės.</translation> @@ -379,6 +698,21 @@ Pasirinkite, ar norite leisti prieigą.</translation> <source>Can't open key file</source> <translation>Nepavyksta atverti rakto failo</translation> </message> + <message> + <source>Legacy key file format</source> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't show this warning again</source> + <translation>Daugiau neberodyti šio įspėjimo</translation> + </message> <message> <source>All files</source> <translation>Visi failai</translation> @@ -391,14 +725,6 @@ Pasirinkite, ar norite leisti prieigą.</translation> <source>Select key file</source> <translation>Pasirinkite rakto failą</translation> </message> - <message> - <source>Refresh</source> - <translation>Įkelti iš naujo</translation> - </message> - <message> - <source>Challenge Response:</source> - <translation>Iššūkio atsakymas:</translation> - </message> </context> <context> <name>DatabaseRepairWidget</name> @@ -414,14 +740,14 @@ Pasirinkite, ar norite leisti prieigą.</translation> <source>Can't open key file</source> <translation>Nepavyksta atverti rakto failo</translation> </message> - <message> - <source>Database opened fine. Nothing to do.</source> - <translation>Duomenų bazė atsivėrė tvarkingai. Nėra ką atlikti.</translation> - </message> <message> <source>Unable to open the database.</source> <translation>Nepavyko atverti duomenų bazės.</translation> </message> + <message> + <source>Database opened fine. Nothing to do.</source> + <translation>Duomenų bazė atsivėrė tvarkingai. Nėra ką atlikti.</translation> + </message> <message> <source>Success</source> <translation>Pavyko</translation> @@ -440,40 +766,57 @@ Dabar galite ją įrašyti.</translation> <context> <name>DatabaseSettingsWidget</name> <message> - <source>Database name:</source> - <translation>Duomenų bazės pavadinimas:</translation> + <source>General</source> + <translation>Bendra</translation> </message> <message> - <source>Database description:</source> - <translation>Duomenų bazės aprašas:</translation> + <source>Encryption</source> + <translation>Šifravimas</translation> </message> <message> - <source>Transform rounds:</source> - <translation>Pasikeitimo ciklų:</translation> + <source>Number of rounds too high</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> </message> <message> - <source>Default username:</source> - <translation>Numatytasis naudotojo vardas:</translation> + <source>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</source> + <translation type="unfinished"/> </message> <message> - <source> MiB</source> - <translation> MiB</translation> + <source>Understood, keep number</source> + <translation type="unfinished"/> </message> <message> - <source>Benchmark</source> - <translation>Našumo testas</translation> + <source>Cancel</source> + <translation>Atsisakyti</translation> </message> <message> - <source>Max. history items:</source> - <translation>Daugiausia istorijos elementų:</translation> + <source>Number of rounds too low</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> </message> <message> - <source>Max. history size:</source> - <translation>Didžiausias istorijos dydis:</translation> + <source>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</source> + <translation type="unfinished"/> </message> <message> - <source>Use recycle bin</source> - <translation>Naudoti šiukšlinę</translation> + <source>KDF unchanged</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetEncryption</name> + <message> + <source>Encryption Algorithm:</source> + <translation type="unfinished"/> </message> <message> <source>AES: 256 Bit (default)</source> @@ -484,14 +827,78 @@ Dabar galite ją įrašyti.</translation> <translation>Twofish: 256 Bitų</translation> </message> <message> - <source>Algorithm:</source> - <translation>Algoritmas:</translation> + <source>Key Derivation Function:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Transform rounds:</source> + <translation>Pasikeitimo ciklų:</translation> + </message> + <message> + <source>Benchmark 1-second delay</source> + <translation type="unfinished"/> + </message> + <message> + <source>Memory Usage:</source> + <translation type="unfinished"/> + </message> + <message> + <source> MB</source> + <translation> MB</translation> + </message> + <message> + <source>Parallelism:</source> + <translation type="unfinished"/> + </message> + <message> + <source> thread</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetGeneral</name> + <message> + <source>Database Meta Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database name:</source> + <translation>Duomenų bazės pavadinimas:</translation> + </message> + <message> + <source>Database description:</source> + <translation>Duomenų bazės aprašas:</translation> + </message> + <message> + <source>Default username:</source> + <translation>Numatytasis naudotojo vardas:</translation> + </message> + <message> + <source>History Settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Max. history items:</source> + <translation>Daugiausia istorijos elementų:</translation> + </message> + <message> + <source>Max. history size:</source> + <translation>Didžiausias istorijos dydis:</translation> + </message> + <message> + <source> MiB</source> + <translation> MiB</translation> + </message> + <message> + <source>Use recycle bin</source> + <translation>Naudoti šiukšlinę</translation> </message> </context> <context> <name>DatabaseTabWidget</name> <message> <source>Root</source> + <comment>Root group</comment> <translation>Šaknis</translation> </message> <message> @@ -510,6 +917,30 @@ Dabar galite ją įrašyti.</translation> <source>File not found!</source> <translation>Failas nerastas!</translation> </message> + <message> + <source>Unable to open the database.</source> + <translation>Nepavyko atverti duomenų bazės.</translation> + </message> + <message> + <source>File opened in read only mode.</source> + <translation>Failas atvertas tik skaitymo veiksenoje.</translation> + </message> + <message> + <source>Open CSV file</source> + <translation>Atverti CSV failą</translation> + </message> + <message> + <source>CSV file</source> + <translation>CSV failas</translation> + </message> + <message> + <source>All files (*)</source> + <translation>Visi failai (*)</translation> + </message> + <message> + <source>Merge database</source> + <translation>Sulieti duomenų bazę</translation> + </message> <message> <source>Open KeePass 1 database</source> <translation>Atverkite KeePass 1 duomenų bazę</translation> @@ -518,14 +949,16 @@ Dabar galite ją įrašyti.</translation> <source>KeePass 1 database</source> <translation>KeePass 1 duomenų bazė</translation> </message> - <message> - <source>All files (*)</source> - <translation>Visi failai (*)</translation> - </message> <message> <source>Close?</source> <translation>Užverti?</translation> </message> + <message> + <source>"%1" is in edit mode. +Discard changes and close anyway?</source> + <translation>"%1" yra redagavimo veiksenoje. +Vis tiek atmesti pakeitimus ir užverti?</translation> + </message> <message> <source>Save changes?</source> <translation>Įrašyti pakeitimus?</translation> @@ -540,10 +973,22 @@ Save changes?</source> <source>Writing the database failed.</source> <translation>Duomenų bazės rašymas nepavyko.</translation> </message> + <message> + <source>Passwords</source> + <translation>Slaptažodžiai</translation> + </message> <message> <source>Save database as</source> <translation>Įrašyti duomenų bazę kaip</translation> </message> + <message> + <source>Export database to CSV file</source> + <translation>Eksportuoti duomenų bazę į CSV failą</translation> + </message> + <message> + <source>Writing the CSV file failed.</source> + <translation>CSV failo įrašymas nepavyko.</translation> + </message> <message> <source>New database</source> <translation>Nauja duomenų bazė</translation> @@ -561,12 +1006,6 @@ Save changes?</source> Please press cancel to finish your changes or discard them.</source> <translation>Nepavyksta užrakinti duomenų bazės, kadangi šiuo metu ją redaguojate. Spauskite atšaukti, kad užbaigtumėte savo pakeitimus arba juos atmestumėte.</translation> - </message> - <message> - <source>This database has never been saved. -You can save the database or stop locking it.</source> - <translation>Ši duomenų bazė niekada nebuvo įrašyta. -Galite duomenų bazę įrašyti arba atsisakyti ją užrakinti.</translation> </message> <message> <source>This database has been modified. @@ -576,68 +1015,13 @@ Otherwise your changes are lost.</source> Ar prieš užrakinant, norite įrašyti duomenų bazę? Kitu atveju jūsų pakeitimai bus prarasti.</translation> </message> - <message> - <source>"%1" is in edit mode. -Discard changes and close anyway?</source> - <translation>"%1" yra redagavimo veiksenoje. -Vis tiek atmesti pakeitimus ir užverti?</translation> - </message> - <message> - <source>Export database to CSV file</source> - <translation>Eksportuoti duomenų bazę į CSV failą</translation> - </message> - <message> - <source>CSV file</source> - <translation>CSV failas</translation> - </message> - <message> - <source>Writing the CSV file failed.</source> - <translation>CSV failo įrašymas nepavyko.</translation> - </message> - <message> - <source>Unable to open the database.</source> - <translation>Nepavyko atverti duomenų bazės.</translation> - </message> - <message> - <source>Merge database</source> - <translation>Sulieti duomenų bazę</translation> - </message> - <message> - <source>The database you are trying to save as is locked by another instance of KeePassXC. -Do you want to save it anyway?</source> - <translation>Duomenų bazė, kurią bandote įrašyti yra užrakinta kito KeePassXC programos egzemplioriaus. -Ar vis tiek norite ją įrašyti?</translation> - </message> - <message> - <source>Passwords</source> - <translation>Slaptažodžiai</translation> - </message> - <message> - <source>Database already opened</source> - <translation>Duomenų bazė jau atverta</translation> - </message> - <message> - <source>The database you are trying to open is locked by another instance of KeePassXC. - -Do you want to open it anyway?</source> - <translation>Duomenų bazė, kurią bandote atverti yra užrakinta kito KeePassXC programos egzemplioriaus. -Ar vis tiek norite ją atverti?</translation> - </message> - <message> - <source>Open read-only</source> - <translation>Atverti tik skaitymui</translation> - </message> - <message> - <source>File opened in read only mode.</source> - <translation>Failas atvertas tik skaitymo veiksenoje.</translation> - </message> - <message> - <source>Open CSV file</source> - <translation>Atverti CSV failą</translation> - </message> </context> <context> <name>DatabaseWidget</name> + <message> + <source>Searching...</source> + <translation>Ieškoma...</translation> + </message> <message> <source>Change master key</source> <translation>Pakeisti pagrindinį raktą</translation> @@ -658,13 +1042,33 @@ Ar vis tiek norite ją atverti?</translation> <source>Do you really want to delete %1 entries for good?</source> <translation>Ar tikrai norite ištrinti %1 įrašų?</translation> </message> + <message> + <source>Move entry to recycle bin?</source> + <translation>Perkelti įrašą į šiukšlinę?</translation> + </message> + <message> + <source>Do you really want to move entry "%1" to the recycle bin?</source> + <translation>Ar tikrai norite perkelti įrašą "%1" į šiukšlinę?</translation> + </message> <message> <source>Move entries to recycle bin?</source> <translation>Perkelti įrašus į šiukšlinę?</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>Ar tikrai norite perkelti %n įrašą į šiukšlinę?</numerusform><numerusform>Ar tikrai norite perkelti %n įrašus į šiukšlinę?</numerusform><numerusform>Ar tikrai norite perkelti %n įrašų į šiukšlinę?</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Execute command?</source> + <translation>Vykdyti komandą?</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation>Ar tikrai norite vykdyti šią komandą?<br><br>%1<br></translation> + </message> + <message> + <source>Remember my choice</source> + <translation>Prisiminti mano pasirinkimą</translation> </message> <message> <source>Delete group?</source> @@ -678,18 +1082,6 @@ Ar vis tiek norite ją atverti?</translation> <source>Unable to calculate master key</source> <translation>Nepavyko apskaičiuoti pagrindinio rakto</translation> </message> - <message> - <source>Move entry to recycle bin?</source> - <translation>Perkelti įrašą į šiukšlinę?</translation> - </message> - <message> - <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation>Ar tikrai norite perkelti įrašą "%1" į šiukšlinę?</translation> - </message> - <message> - <source>Searching...</source> - <translation>Ieškoma...</translation> - </message> <message> <source>No current database.</source> <translation>Nėra esamos duomenų bazės.</translation> @@ -707,20 +1099,8 @@ Ar vis tiek norite ją atverti?</translation> <translation>Nėra rezultatų</translation> </message> <message> - <source>Execute command?</source> - <translation>Vykdyti komandą?</translation> - </message> - <message> - <source>Do you really want to execute the following command?<br><br>%1<br></source> - <translation>Ar tikrai norite vykdyti šią komandą?<br><br>%1<br></translation> - </message> - <message> - <source>Remember my choice</source> - <translation>Prisiminti mano pasirinkimą</translation> - </message> - <message> - <source>Autoreload Request</source> - <translation>Automatinio įkėlimo iš naujo užklausa</translation> + <source>File has changed</source> + <translation type="unfinished"/> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -731,8 +1111,9 @@ Ar vis tiek norite ją atverti?</translation> <translation>Suliejimo užklausa</translation> </message> <message> - <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> - <translation>Duomenų bazės failas pasikeitė ir jūs turite neįrašytų pakeitimų. Ar norite sulieti savo pakeitimus?</translation> + <source>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</source> + <translation type="unfinished"/> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -747,6 +1128,89 @@ Ar vis tiek norite ją atverti?</translation> <translation>Ar tikrai norite negrįžtamai viską ištrinti iš savo šiukšlinės?</translation> </message> </context> +<context> + <name>DetailsWidget</name> + <message> + <source>Generate TOTP Token</source> + <translation type="unfinished"/> + </message> + <message> + <source>Close</source> + <translation>Užverti</translation> + </message> + <message> + <source>General</source> + <translation>Bendra</translation> + </message> + <message> + <source>Password</source> + <translation>Slaptažodis</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Expiration</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username</source> + <translation>Naudotojo vardas</translation> + </message> + <message> + <source>Autotype</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searching</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attributes</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation>Priedai</translation> + </message> + <message> + <source>Notes</source> + <translation>Pastabos</translation> + </message> + <message> + <source>Window</source> + <translation>Langas</translation> + </message> + <message> + <source>Sequence</source> + <translation>Seka</translation> + </message> + <message> + <source>Search</source> + <translation>Paieška</translation> + </message> + <message> + <source>Clear</source> + <translation>Išvalyti</translation> + </message> + <message> + <source>Never</source> + <translation>Niekada</translation> + </message> + <message> + <source>[PROTECTED]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Disabled</source> + <translation>Išjungta</translation> + </message> + <message> + <source>Enabled</source> + <translation>Įjungta</translation> + </message> +</context> <context> <name>EditEntryWidget</name> <message> @@ -773,6 +1237,30 @@ Ar vis tiek norite ją atverti?</translation> <source>History</source> <translation>Istorija</translation> </message> + <message> + <source>SSH Agent</source> + <translation>SSH agentas</translation> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>(encrypted)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>File too large to be a private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open private key</source> + <translation type="unfinished"/> + </message> <message> <source>Entry history</source> <translation>Įrašo istorija</translation> @@ -793,40 +1281,6 @@ Ar vis tiek norite ją atverti?</translation> <source>New attribute</source> <translation>Naujas požymis</translation> </message> - <message> - <source>Select file</source> - <translation>Pasirinkite failą</translation> - </message> - <message> - <source>Unable to open file</source> - <translation>Nepavyko atverti failo</translation> - </message> - <message> - <source>Save attachment</source> - <translation>Įrašyti priedą</translation> - </message> - <message> - <source>Unable to save the attachment: -</source> - <translation>Nepavyko įrašyti priedo: -</translation> - </message> - <message> - <source>Tomorrow</source> - <translation>Rytoj</translation> - </message> - <message numerus="yes"> - <source>%n week(s)</source> - <translation><numerusform>%n savaitė</numerusform><numerusform>%n savaitės</numerusform><numerusform>%n savaičių</numerusform></translation> - </message> - <message numerus="yes"> - <source>%n month(s)</source> - <translation><numerusform>%n mėnesis</numerusform><numerusform>%n mėnesiai</numerusform><numerusform>%n mėnesių</numerusform></translation> - </message> - <message> - <source>1 year</source> - <translation>1 metai</translation> - </message> <message> <source>Confirm Remove</source> <translation>Patvirtinti šalinimą</translation> @@ -836,12 +1290,28 @@ Ar vis tiek norite ją atverti?</translation> <translation>Ar tikrai norite pašalinti šį požymi?</translation> </message> <message> - <source>[PROTECTED] Press reveal to view or edit</source> - <translation>[APSAUGOTA] Norėdami rodyti ar redaguoti, paspauskite atskleisti</translation> + <source>[PROTECTED]</source> + <translation type="unfinished"/> </message> <message> - <source>Are you sure you want to remove this attachment?</source> - <translation>Ar tikrai norite pašalinti šį priedą?</translation> + <source>Press reveal to view or edit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Tomorrow</source> + <translation>Rytoj</translation> + </message> + <message numerus="yes"> + <source>%n week(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source>%n month(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>1 year</source> + <translation>1 metai</translation> </message> </context> <context> @@ -858,18 +1328,6 @@ Ar vis tiek norite ją atverti?</translation> <source>Remove</source> <translation>Šalinti</translation> </message> - <message> - <source>Attachments</source> - <translation>Priedai</translation> - </message> - <message> - <source>Save</source> - <translation>Įrašyti</translation> - </message> - <message> - <source>Open</source> - <translation>Atverti</translation> - </message> <message> <source>Edit Name</source> <translation>Taisyti pavadinimą</translation> @@ -882,6 +1340,10 @@ Ar vis tiek norite ją atverti?</translation> <source>Reveal</source> <translation>Atskleisti</translation> </message> + <message> + <source>Attachments</source> + <translation>Priedai</translation> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -889,6 +1351,18 @@ Ar vis tiek norite ją atverti?</translation> <source>Enable Auto-Type for this entry</source> <translation>Įjungti šiam įrašui automatinį rinkimą</translation> </message> + <message> + <source>Inherit default Auto-Type sequence from the &group</source> + <translation>Paveldėti numatytąją automatinio rinkimo seką iš &grupės</translation> + </message> + <message> + <source>&Use custom Auto-Type sequence:</source> + <translation>Na&udoti tinkintą automatinio rinkimo seka:</translation> + </message> + <message> + <source>Window Associations</source> + <translation>Lango asociacijos</translation> + </message> <message> <source>+</source> <translation>+</translation> @@ -901,14 +1375,6 @@ Ar vis tiek norite ją atverti?</translation> <source>Window title:</source> <translation>Lango antraštė:</translation> </message> - <message> - <source>Inherit default Auto-Type sequence from the &group</source> - <translation>Paveldėti numatytąją automatinio rinkimo seką iš &grupės</translation> - </message> - <message> - <source>&Use custom Auto-Type sequence:</source> - <translation>Na&udoti tinkintą automatinio rinkimo seka:</translation> - </message> <message> <source>Use default se&quence</source> <translation>Naudoti numatytąją se&ką</translation> @@ -917,10 +1383,6 @@ Ar vis tiek norite ją atverti?</translation> <source>Set custo&m sequence:</source> <translation>Nustatyti tinkintą s&eką:</translation> </message> - <message> - <source>Window Associations</source> - <translation>Lango asociacijos</translation> - </message> </context> <context> <name>EditEntryWidgetHistory</name> @@ -944,12 +1406,8 @@ Ar vis tiek norite ją atverti?</translation> <context> <name>EditEntryWidgetMain</name> <message> - <source>Title:</source> - <translation>Antraštė:</translation> - </message> - <message> - <source>Username:</source> - <translation>Naudotojo vardas:</translation> + <source>URL:</source> + <translation>URL:</translation> </message> <message> <source>Password:</source> @@ -960,20 +1418,104 @@ Ar vis tiek norite ją atverti?</translation> <translation>Pakartokite:</translation> </message> <message> - <source>URL:</source> - <translation>URL:</translation> + <source>Title:</source> + <translation>Antraštė:</translation> </message> <message> - <source>Expires</source> - <translation>Baigia galioti</translation> + <source>Notes</source> + <translation>Pastabos</translation> </message> <message> <source>Presets</source> <translation>Parinktys</translation> </message> <message> - <source>Notes:</source> - <translation>Pastabos:</translation> + <source>Toggle the checkbox to reveal the notes section.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username:</source> + <translation>Naudotojo vardas:</translation> + </message> + <message> + <source>Expires</source> + <translation>Baigia galioti</translation> + </message> +</context> +<context> + <name>EditEntryWidgetSSHAgent</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent after</source> + <translation type="unfinished"/> + </message> + <message> + <source> seconds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fingerprint</source> + <translation>Kontrolinis kodas</translation> + </message> + <message> + <source>Remove key from agent when database is closed/locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Public key</source> + <translation>Viešasis raktas</translation> + </message> + <message> + <source>Add key to agent when database is opened/unlocked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Comment</source> + <translation>Komentaras</translation> + </message> + <message> + <source>Decrypt</source> + <translation>Iššifruoti</translation> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy to clipboard</source> + <translation>Kopijuoti į iškarpinę</translation> + </message> + <message> + <source>Private key</source> + <translation>Privatusis raktas</translation> + </message> + <message> + <source>External file</source> + <translation>Išorinis failas</translation> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Naršyti...</translation> + </message> + <message> + <source>Attachment</source> + <translation>Priedas</translation> + </message> + <message> + <source>Add to agent</source> + <translation>Pridėti į agentą</translation> + </message> + <message> + <source>Remove from agent</source> + <translation>Šalinti iš agento</translation> + </message> + <message> + <source>Require user confirmation when this key is used</source> + <translation type="unfinished"/> </message> </context> <context> @@ -1044,6 +1586,14 @@ Ar vis tiek norite ją atverti?</translation> </context> <context> <name>EditWidgetIcons</name> + <message> + <source>&Use default icon</source> + <translation>Na&udoti numatytąją piktogramą</translation> + </message> + <message> + <source>Use custo&m icon</source> + <translation>Naudoti tinkintą piktogra&mą</translation> + </message> <message> <source>Add custom icon</source> <translation>Pridėti tinkintą piktogramą</translation> @@ -1052,6 +1602,18 @@ Ar vis tiek norite ją atverti?</translation> <source>Delete custom icon</source> <translation>Ištrinti tinkintą piktogramą</translation> </message> + <message> + <source>Download favicon</source> + <translation>Atsisiųsti svetainės piktogramą</translation> + </message> + <message> + <source>Unable to fetch favicon.</source> + <translation>Nepavyko gauti svetainės piktogramos.</translation> + </message> + <message> + <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> + <translation>Patarimas: Jūs galite įjungti Google kaip surogatą, perėję į Įrankiai>Nustatymai>Saugumas</translation> + </message> <message> <source>Images</source> <translation>Paveikslai</translation> @@ -1064,25 +1626,13 @@ Ar vis tiek norite ją atverti?</translation> <source>Select Image</source> <translation>Pasirinkite paveikslą</translation> </message> - <message> - <source>Download favicon</source> - <translation>Atsisiųsti svetainės piktogramą</translation> - </message> - <message> - <source>Unable to fetch favicon.</source> - <translation>Nepavyko gauti svetainės piktogramos.</translation> - </message> <message> <source>Can't read icon</source> <translation>Nepavyksta perskaityti piktogramos</translation> </message> <message> - <source>&Use default icon</source> - <translation>Na&udoti numatytąją piktogramą</translation> - </message> - <message> - <source>Use custo&m icon</source> - <translation>Naudoti tinkintą piktogra&mą</translation> + <source>Custom icon already exists</source> + <translation>Tinkinta piktograma jau yra</translation> </message> <message> <source>Confirm Delete</source> @@ -1092,14 +1642,6 @@ Ar vis tiek norite ją atverti?</translation> <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> <translation>Šią piktogramą naudoja %1 įrašai ir ji bus pakeista numatytąja piktograma. Ar tikrai norite ją ištrinti?</translation> </message> - <message> - <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation>Patarimas: Jūs galite įjungti Google kaip surogatą, perėję į Įrankiai>Nustatymai>Saugumas</translation> - </message> - <message> - <source>Custom icon already exists</source> - <translation>Tinkinta piktograma jau yra</translation> - </message> </context> <context> <name>EditWidgetProperties</name> @@ -1124,9 +1666,93 @@ Ar vis tiek norite ją atverti?</translation> <name>Entry</name> <message> <source> - Clone</source> + <comment>Suffix added to cloned entries</comment> <translation> - Dublikatas</translation> </message> </context> +<context> + <name>EntryAttachmentsModel</name> + <message> + <source>Name</source> + <translation>Pavadinimas</translation> + </message> + <message> + <source>Size</source> + <translation>Dydis</translation> + </message> +</context> +<context> + <name>EntryAttachmentsWidget</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add</source> + <translation>Pridėti</translation> + </message> + <message> + <source>Remove</source> + <translation>Šalinti</translation> + </message> + <message> + <source>Open</source> + <translation>Atverti</translation> + </message> + <message> + <source>Save</source> + <translation>Įrašyti</translation> + </message> + <message> + <source>Select files</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <source>Are you sure you want to remove %n attachment(s)?</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>Patvirtinti šalinimą</translation> + </message> + <message> + <source>Save attachments</source> + <translation>Įrašyti priedus</translation> + </message> + <message> + <source>Unable to create directory: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Confirm overwrite</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to save attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachment: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open files: +%1</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EntryAttributesModel</name> <message> @@ -1155,6 +1781,11 @@ Ar vis tiek norite ją atverti?</translation> </context> <context> <name>EntryModel</name> + <message> + <source>Ref: </source> + <comment>Reference abbreviation</comment> + <translation>Nuoroda: </translation> + </message> <message> <source>Group</source> <translation>Grupė</translation> @@ -1171,11 +1802,6 @@ Ar vis tiek norite ją atverti?</translation> <source>URL</source> <translation>URL</translation> </message> - <message> - <source>Ref: </source> - <comment>Reference abbreviation</comment> - <translation>Nuoroda: </translation> - </message> </context> <context> <name>Group</name> @@ -1184,6 +1810,17 @@ Ar vis tiek norite ją atverti?</translation> <translation>Šiukšlinė</translation> </message> </context> +<context> + <name>HostInstaller</name> + <message> + <source>KeePassXC: Cannot save file!</source> + <translation>KeePassXC: Nepavyksta įrašyti failo!</translation> + </message> + <message> + <source>Cannot save the native messaging script file.</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>HttpPasswordGeneratorWidget</name> <message> @@ -1246,6 +1883,361 @@ Ar vis tiek norite ją atverti?</translation> <translation>Užverti žinutę</translation> </message> </context> +<context> + <name>Kdbx3Reader</name> + <message> + <source>Unable to calculate master key</source> + <translation>Nepavyko apskaičiuoti pagrindinio rakto</translation> + </message> + <message> + <source>Unable to issue challenge-response.</source> + <translation>Nepavyko išduoti iššūkio atsakymo.</translation> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>Neteisingas raktas arba duomenų bazės failas yra pažeistas.</translation> + </message> +</context> +<context> + <name>Kdbx3Writer</name> + <message> + <source>Unable to issue challenge-response.</source> + <translation>Nepavyko išduoti iššūkio atsakymo.</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Nepavyko apskaičiuoti pagrindinio rakto</translation> + </message> +</context> +<context> + <name>Kdbx4Reader</name> + <message> + <source>missing database headers</source> + <translation>trūksta duomenų bazės antraščių</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Nepavyko apskaičiuoti pagrindinio rakto</translation> + </message> + <message> + <source>Invalid header checksum size</source> + <translation>Neteisingas antraštės kontrolinės sumos dydis</translation> + </message> + <message> + <source>Header SHA256 mismatch</source> + <translation>Antraštės SHA256 neatitikimas</translation> + </message> + <message> + <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher</source> + <translation>Nežinomas šifras</translation> + </message> + <message> + <source>Invalid header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header data length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open buffer for KDF parameters in header</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported key derivation function (KDF) or invalid parameters</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy header fields found in KDBX4 file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header binary size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass variant map version.</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name data</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value data</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Bool entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry type</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map field type size</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Kdbx4Writer</name> + <message> + <source>Invalid symmetric cipher algorithm.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid symmetric cipher IV size.</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Nepavyko apskaičiuoti pagrindinio rakto</translation> + </message> + <message> + <source>Failed to serialize KDF parameters variant map</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxReader</name> + <message> + <source>Invalid cipher uuid length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid compression flags length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported compression algorithm</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid master seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform rounds size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid start bytes size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid random stream id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner random stream cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>Ne KeePass duomenų bazė.</translation> + </message> + <message> + <source>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> + <translation>Pasirinktas failas yra sena KeePass 1 duomenų bazė (.kdb). + +Jūs galite ją importuoti, nuspausdami Duomenų bazė > "Importuoti KeePass 1 duomenų bazę...". +Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų bazės, naudodami senąją KeePassX 0.4 versija.</translation> + </message> + <message> + <source>Unsupported KeePass 2 database version.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxXmlReader</name> + <message> + <source>XML parsing failure: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>No root group</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing icon uuid or data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing custom data key or value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Multiple group elements</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null group uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableAutoType value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableSearching value</source> + <translation type="unfinished"/> + </message> + <message> + <source>No group uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null DeleteObject uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing DeletedObject uuid or time</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null entry uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element in history entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>No entry uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element with different uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decrypt entry string</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate custom attribute found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry string key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate attachment found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry binary key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-type association window or sequence missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid bool value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid date time value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color rgb part</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid uuid value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decompress binary</source> + <extracomment>Translator meant is a binary data inside an entry</extracomment> + <translation type="unfinished"/> + </message> +</context> <context> <name>KeePass1OpenWidget</name> <message> @@ -1275,6 +2267,35 @@ Ar vis tiek norite ją atverti?</translation> <source>Unsupported KeePass database version.</source> <translation>Nepalaikoma KeePass duomenų bazės versija.</translation> </message> + <message> + <source>Unable to read encryption IV</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of groups</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid content hash size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of transform rounds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to construct group tree</source> + <translation type="unfinished"/> + </message> <message> <source>Root</source> <translation>Šaknis</translation> @@ -1287,60 +2308,104 @@ Ar vis tiek norite ją atverti?</translation> <source>Wrong key or database file is corrupt.</source> <translation>Neteisingas raktas arba duomenų bazės failas yra pažeistas.</translation> </message> -</context> -<context> - <name>KeePass2Reader</name> <message> - <source>Not a KeePass database.</source> - <translation>Ne KeePass duomenų bazė.</translation> + <source>Key transformation failed</source> + <translation type="unfinished"/> </message> <message> - <source>Unsupported KeePass database version.</source> - <translation>Nepalaikoma KeePass duomenų bazės versija.</translation> + <source>Invalid group field type number</source> + <translation type="unfinished"/> </message> <message> - <source>Wrong key or database file is corrupt.</source> - <translation>Neteisingas raktas arba duomenų bazės failas yra pažeistas.</translation> + <source>Invalid group field size</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>Nepavyko apskaičiuoti pagrindinio rakto</translation> + <source>Read group field data doesn't match size</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to issue challenge-response.</source> - <translation>Nepavyko išduoti iššūkio atsakymo.</translation> + <source>Incorrect group id field size</source> + <translation type="unfinished"/> </message> <message> - <source>The selected file is an old KeePass 1 database (.kdb). - -You can import it by clicking on Database > 'Import KeePass 1 database...'. -This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> - <translation>Pasirinktas failas yra sena KeePass 1 duomenų bazė (.kdb). - -Jūs galite ją importuoti, nuspausdami Duomenų bazė > "Importuoti KeePass 1 duomenų bazę...". -Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų bazės, naudodami senąją KeePassX 0.4 versija.</translation> - </message> -</context> -<context> - <name>KeePass2Writer</name> - <message> - <source>Unable to issue challenge-response.</source> - <translation>Nepavyko išduoti iššūkio atsakymo.</translation> + <source>Incorrect group creation time field size</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>Nepavyko apskaičiuoti pagrindinio rakto</translation> + <source>Incorrect group modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group access time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group level field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing group id or level</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing entry field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read entry field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry uuid field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field type</source> + <translation type="unfinished"/> </message> </context> <context> <name>Main</name> <message> - <source>Fatal error while testing the cryptographic functions.</source> - <translation>Lemtingoji klaida, testuojant šifravimo funkcijas.</translation> - </message> - <message> - <source>KeePassXC - Error</source> - <translation>KeePassXC - Klaida</translation> + <source>Existing single-instance lock file is invalid. Launching new instance.</source> + <translation>Esamas vieno egzemplioriaus užrakto failas yra neteisingas. Paleidžiamas naujas egzempliorius.</translation> </message> <message> <source>The lock file could not be created. Single-instance mode disabled.</source> @@ -1351,64 +2416,32 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų <translation>Jau yra paleistas kitas KeePassXC egzempliorius.</translation> </message> <message> - <source>Existing single-instance lock file is invalid. Launching new instance.</source> - <translation>Esamas vieno egzemplioriaus užrakto failas yra neteisingas. Paleidžiamas naujas egzempliorius.</translation> + <source>Fatal error while testing the cryptographic functions.</source> + <translation>Lemtingoji klaida, testuojant šifravimo funkcijas.</translation> + </message> + <message> + <source>KeePassXC - Error</source> + <translation>KeePassXC - Klaida</translation> </message> </context> <context> <name>MainWindow</name> <message> - <source>Open database</source> - <translation>Atverti duomenų bazę</translation> - </message> - <message> - <source>Database settings</source> - <translation>Duomenų bazės nustatymai</translation> - </message> - <message> - <source>Copy username to clipboard</source> - <translation>Kopijuoti naudotojo vardą į iškarpinę</translation> - </message> - <message> - <source>Copy password to clipboard</source> - <translation>Kopijuoti slaptažodį į iškarpinę</translation> - </message> - <message> - <source>Settings</source> - <translation>Nustatymai</translation> - </message> - <message> - <source>Show toolbar</source> - <translation>Rodyti įrankių juostą</translation> - </message> - <message> - <source>read-only</source> - <translation>tik skaitymui</translation> - </message> - <message> - <source>Toggle window</source> - <translation>Perjungti langą</translation> - </message> - <message> - <source>KeePass 2 Database</source> - <translation>KeePass 2 duomenų bazė</translation> - </message> - <message> - <source>All files</source> - <translation>Visi failai</translation> - </message> - <message> - <source>Save repaired database</source> - <translation>Įrašyti pataisytą duomenų bazę</translation> - </message> - <message> - <source>Writing the database failed.</source> - <translation>Duomenų bazės rašymas nepavyko.</translation> + <source>&Database</source> + <translation>&Duomenų bazė</translation> </message> <message> <source>&Recent databases</source> <translation>&Paskiausiai naudotos duomenų bazės</translation> </message> + <message> + <source>Import</source> + <translation>Importuoti</translation> + </message> + <message> + <source>&Help</source> + <translation>Ž&inynas</translation> + </message> <message> <source>E&ntries</source> <translation>Į&rašai</translation> @@ -1417,13 +2450,17 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų <source>Copy att&ribute to clipboard</source> <translation>Kopijuoti &požymį į iškarpinę</translation> </message> + <message> + <source>Time-based one-time password</source> + <translation type="unfinished"/> + </message> <message> <source>&Groups</source> <translation>&Grupės</translation> </message> <message> - <source>&View</source> - <translation>R&odinys</translation> + <source>&Tools</source> + <translation>Į&rankiai</translation> </message> <message> <source>&Quit</source> @@ -1433,6 +2470,10 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų <source>&About</source> <translation>&Apie</translation> </message> + <message> + <source>&Open database...</source> + <translation>&Atverti duomenų bazę...</translation> + </message> <message> <source>&Save database</source> <translation>Į&rašyti duomenų bazę</translation> @@ -1473,26 +2514,26 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų <source>&Delete group</source> <translation>&Ištrinti grupę</translation> </message> + <message> + <source>Sa&ve database as...</source> + <translation>Įraš&yti duomenų bazę kaip...</translation> + </message> + <message> + <source>Change &master key...</source> + <translation>Pakeisti &pagrindinį raktą...</translation> + </message> <message> <source>&Database settings</source> <translation>&Duomenų bazės nustatymai</translation> </message> + <message> + <source>Database settings</source> + <translation>Duomenų bazės nustatymai</translation> + </message> <message> <source>&Clone entry</source> <translation>&Dubliuoti įrašą</translation> </message> - <message> - <source>Timed one-time password</source> - <translation>Numatytosios trukmės vienkartinis slaptažodis</translation> - </message> - <message> - <source>Copy &TOTP</source> - <translation>Kopijuoti &NTVS</translation> - </message> - <message> - <source>Show TOTP</source> - <translation>Rodyti NTVS</translation> - </message> <message> <source>&Find</source> <translation>&Rasti</translation> @@ -1501,14 +2542,26 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų <source>Copy &username</source> <translation>Kopijuoti &naudotojo vardą</translation> </message> + <message> + <source>Copy username to clipboard</source> + <translation>Kopijuoti naudotojo vardą į iškarpinę</translation> + </message> <message> <source>Cop&y password</source> <translation>Kopijuoti &slaptažodį</translation> </message> + <message> + <source>Copy password to clipboard</source> + <translation>Kopijuoti slaptažodį į iškarpinę</translation> + </message> <message> <source>&Settings</source> <translation>&Nustatymai</translation> </message> + <message> + <source>Password Generator</source> + <translation>Slaptažodžių generatorius</translation> + </message> <message> <source>&Perform Auto-Type</source> <translation>&Atlikti automatinį rinkimą</translation> @@ -1525,65 +2578,25 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų <source>&Title</source> <translation>&Antraštė</translation> </message> + <message> + <source>Copy title to clipboard</source> + <translation type="unfinished"/> + </message> <message> <source>&URL</source> <translation>&URL</translation> </message> + <message> + <source>Copy URL to clipboard</source> + <translation type="unfinished"/> + </message> <message> <source>&Notes</source> <translation>&Pastabos</translation> </message> <message> - <source>Password Generator</source> - <translation>Slaptažodžių generatorius</translation> - </message> - <message> - <source>Clear history</source> - <translation>Išvalyti istoriją</translation> - </message> - <message> - <source>&Database</source> - <translation>&Duomenų bazė</translation> - </message> - <message> - <source>Import</source> - <translation>Importuoti</translation> - </message> - <message> - <source>&Tools</source> - <translation>Į&rankiai</translation> - </message> - <message> - <source>Empty recycle bin</source> - <translation>Išvalyti šiukšlinę</translation> - </message> - <message> - <source>Access error for config file %1</source> - <translation>Konfigūracijos failo %1 prieigos klaida</translation> - </message> - <message> - <source>Quit KeePassXC</source> - <translation>Išeiti iš KeePassXC</translation> - </message> - <message> - <source>Please touch the button on your YubiKey!</source> - <translation>Prašome priliesti mygtuką ant savo YubiKey!</translation> - </message> - <message> - <source>&Help</source> - <translation>Ž&inynas</translation> - </message> - <message> - <source>&Open database...</source> - <translation>&Atverti duomenų bazę...</translation> - </message> - <message> - <source>Sa&ve database as...</source> - <translation>Įraš&yti duomenų bazę kaip...</translation> - </message> - <message> - <source>Change &master key...</source> - <translation>Pakeisti &pagrindinį raktą...</translation> + <source>Copy notes to clipboard</source> + <translation type="unfinished"/> </message> <message> <source>&Export to CSV file...</source> @@ -1601,10 +2614,169 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų <source>Re&pair database...</source> <translation>Pa&taisyti duomenų bazę...</translation> </message> + <message> + <source>Show TOTP</source> + <translation>Rodyti NTVS</translation> + </message> <message> <source>Set up TOTP...</source> <translation>Nustatyti NTVS...</translation> </message> + <message> + <source>Copy &TOTP</source> + <translation>Kopijuoti &NTVS</translation> + </message> + <message> + <source>E&mpty recycle bin</source> + <translation type="unfinished"/> + </message> + <message> + <source>Clear history</source> + <translation>Išvalyti istoriją</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation>Konfigūracijos failo %1 prieigos klaida</translation> + </message> + <message> + <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> + <translation type="unfinished"/> + </message> + <message> + <source>read-only</source> + <translation>tik skaitymui</translation> + </message> + <message> + <source>Settings</source> + <translation>Nustatymai</translation> + </message> + <message> + <source>Toggle window</source> + <translation>Perjungti langą</translation> + </message> + <message> + <source>Quit KeePassXC</source> + <translation>Išeiti iš KeePassXC</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>KeePass 2 duomenų bazė</translation> + </message> + <message> + <source>All files</source> + <translation>Visi failai</translation> + </message> + <message> + <source>Open database</source> + <translation>Atverti duomenų bazę</translation> + </message> + <message> + <source>Save repaired database</source> + <translation>Įrašyti pataisytą duomenų bazę</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>Duomenų bazės rašymas nepavyko.</translation> + </message> + <message> + <source>Please touch the button on your YubiKey!</source> + <translation>Prašome priliesti mygtuką ant savo YubiKey!</translation> + </message> +</context> +<context> + <name>OpenSSHKey</name> + <message> + <source>Invalid key file, expecting an OpenSSH key</source> + <translation type="unfinished"/> + </message> + <message> + <source>PEM boundary mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>This is not an OpenSSH key, only modern keys are supported</source> + <translation type="unfinished"/> + </message> + <message> + <source>Base64 decoding failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file way too small.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file magic header id invalid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Found zero keys</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to read public key.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Corrupted key file, reading private key failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>No private key payload to decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Trying to run KDF without cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Passphrase is required to decrypt this key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key derivation failed, key file corrupted?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Decryption failed, wrong passphrase?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write public key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write private key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing private key</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OptionDialog</name> @@ -1612,22 +2784,63 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų <source>Dialog</source> <translation>Dialogas</translation> </message> + <message> + <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation>Tai reikalinga, norint prie savo duomenų bazių gauti prieigą iš ChromeIPass ar PassIFox</translation> + </message> + <message> + <source>Enable KeePassHTTP server</source> + <translation>Įjungti KeePassHTTP serverį</translation> + </message> <message> <source>General</source> <translation>Bendra</translation> </message> <message> <source>Sh&ow a notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> <translation>R&odyti pranešimą, kai reikalaujama prisijungimo duomenų</translation> </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>Vietoj visos srities visų įrašų, grąžina tik geriausiai tam tikrą URL atitinkančius įrašus.</translation> + </message> + <message> + <source>&Return only best matching entries</source> + <translation>&Grąžinti tik labiausiai atitinkančius įrašus</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Už&klausti atrakinti duomenų bazę, jeigu ji yra užrakinta</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> + <translation>Bus grąžinami įrašai tik su ta pačia schema (http://, https://, ftp://, ...).</translation> + </message> + <message> + <source>&Match URL schemes</source> + <translation>&Atitikti URL schemas</translation> + </message> <message> <source>Sort matching entries by &username</source> <translation>Rikiuoti atitinkančius įrašus pagal na&udotojo vardą</translation> </message> + <message> + <source>Sort &matching entries by title</source> + <translation>Rikiuoti atitinkančius įrašus pagal &antraštę</translation> + </message> + <message> + <source>R&emove all shared encryption keys from active database</source> + <translation>Ša&linti iš aktyvios duomenų bazės visus bendrinamus šifravimo raktus</translation> + </message> <message> <source>Re&move all stored permissions from entries in active database</source> <translation>Šal&inti iš įrašų aktyvioje duomenų bazėje visus saugomus leidimus</translation> </message> + <message> + <source>Password Generator</source> + <translation>Slaptažodžių generatorius</translation> + </message> <message> <source>Advanced</source> <translation>Išplėstiniai</translation> @@ -1640,10 +2853,22 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų <source>Always allow &updating entries</source> <translation>Visada leisti įrašų at&naujinimą</translation> </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>Su klientu turi būti sujungta tik pasirinkta duomenų bazė.</translation> + </message> <message> <source>Searc&h in all opened databases for matching entries</source> <translation>Ieš&koti atitinkančių įrašų visose atvertose duomenų bazėse</translation> </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>Automatinis eilutės laukų kūrimas ar atnaujinimas nėra palaikomas.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>&Grąžinti išplėstines eilutes, kurios prasideda "KPH: "</translation> + </message> <message> <source>HTTP Port:</source> <translation>HTTP prievadas:</translation> @@ -1652,18 +2877,18 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų <source>Default port: 19455</source> <translation>Numatytasis prievadas: 19455</translation> </message> - <message> - <source>Re&quest to unlock the database if it is locked</source> - <translation>Už&klausti atrakinti duomenų bazę, jeigu ji yra užrakinta</translation> - </message> - <message> - <source>Sort &matching entries by title</source> - <translation>Rikiuoti atitinkančius įrašus pagal &antraštę</translation> - </message> <message> <source>KeePassXC will listen to this port on 127.0.0.1</source> <translation>KeePassXC klausysis šio prievado ties 127.0.0.1</translation> </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> + <translation type="unfinished"/> + </message> <message> <source>Cannot bind to privileged ports</source> <translation>Nepavyksta susieti su privilegijuotais prievadais</translation> @@ -1674,63 +2899,30 @@ Using default port 19455.</source> <translation>Nepavyksta susieti su privilegijuotais prievadais žemiau 1024! Naudojamas numatytasis prievadas 19455.</translation> </message> - <message> - <source>R&emove all shared encryption keys from active database</source> - <translation>Ša&linti iš aktyvios duomenų bazės visus bendrinamus šifravimo raktus</translation> - </message> - <message> - <source>&Return advanced string fields which start with "KPH: "</source> - <translation>&Grąžinti išplėstines eilutes, kurios prasideda "KPH: "</translation> - </message> - <message> - <source>Automatically creating or updating string fields is not supported.</source> - <translation>Automatinis eilutės laukų kūrimas ar atnaujinimas nėra palaikomas.</translation> - </message> - <message> - <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> - <translation>Tai reikalinga, norint prie savo duomenų bazių gauti prieigą iš ChromeIPass ar PassIFox</translation> - </message> - <message> - <source>Enable KeePassHTTP server</source> - <translation>Įjungti KeePassHTTP serverį</translation> - </message> - <message> - <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation>Vietoj visos srities visų įrašų, grąžina tik geriausiai tam tikrą URL atitinkančius įrašus.</translation> - </message> - <message> - <source>&Return only best matching entries</source> - <translation>&Grąžinti tik labiausiai atitinkančius įrašus</translation> - </message> - <message> - <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation>Bus grąžinami įrašai tik su ta pačia schema (http://, https://, ftp://, ...).</translation> - </message> - <message> - <source>&Match URL schemes</source> - <translation>&Atitikti URL schemas</translation> - </message> - <message> - <source>Password Generator</source> - <translation>Slaptažodžių generatorius</translation> - </message> - <message> - <source>Only the selected database has to be connected with a client.</source> - <translation>Su klientu turi būti sujungta tik pasirinkta duomenų bazė.</translation> - </message> - <message> - <source>The following options can be dangerous! -Change them only if you know what you are doing.</source> - <translation>Šie parametrai gali būti pavojingi! -Keiskite juos tik tuo atveju, jeigu žinote ką darote.</translation> - </message> </context> <context> <name>PasswordGeneratorWidget</name> + <message> + <source>%p%</source> + <translation>%p%</translation> + </message> <message> <source>Password:</source> <translation>Slaptažodis:</translation> </message> + <message> + <source>strength</source> + <comment>Password strength</comment> + <translation>stiprumas</translation> + </message> + <message> + <source>entropy</source> + <translation>entropija</translation> + </message> + <message> + <source>Password</source> + <translation>Slaptažodis</translation> + </message> <message> <source>Character Types</source> <translation>Simbolių tipai</translation> @@ -1751,38 +2943,50 @@ Keiskite juos tik tuo atveju, jeigu žinote ką darote.</translation> <source>Special Characters</source> <translation>Specialūs simboliai</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>Papildomi ASCII</translation> + </message> <message> <source>Exclude look-alike characters</source> <translation>Pašalinti panašiai atrodančius simbolius</translation> </message> - <message> - <source>Accept</source> - <translation>Priimti</translation> - </message> - <message> - <source>%p%</source> - <translation>%p%</translation> - </message> - <message> - <source>strength</source> - <translation>stiprumas</translation> - </message> - <message> - <source>entropy</source> - <translation>entropija</translation> - </message> - <message> - <source>&Length:</source> - <translation>&Ilgis:</translation> - </message> <message> <source>Pick characters from every group</source> <translation>Parinkti simbolius iš kiekvienos grupės</translation> </message> + <message> + <source>&Length:</source> + <translation>&Ilgis:</translation> + </message> + <message> + <source>Passphrase</source> + <translation>Slaptafrazė</translation> + </message> + <message> + <source>Wordlist:</source> + <translation>Žodžių sąrašas:</translation> + </message> + <message> + <source>Word Count:</source> + <translation>Žodžių skaičius:</translation> + </message> + <message> + <source>Word Separator:</source> + <translation>Žodžių skirtukas:</translation> + </message> <message> <source>Generate</source> <translation>Generuoti</translation> </message> + <message> + <source>Copy</source> + <translation>Kopijuoti</translation> + </message> + <message> + <source>Accept</source> + <translation>Priimti</translation> + </message> <message> <source>Close</source> <translation>Užverti</translation> @@ -1801,51 +3005,270 @@ Keiskite juos tik tuo atveju, jeigu žinote ką darote.</translation> </message> <message> <source>Poor</source> + <comment>Password quality</comment> <translation>Blogas</translation> </message> <message> <source>Weak</source> + <comment>Password quality</comment> <translation>Silpnas</translation> </message> <message> <source>Good</source> + <comment>Password quality</comment> <translation>Geras</translation> </message> <message> <source>Excellent</source> + <comment>Password quality</comment> <translation>Puikus</translation> </message> - <message> - <source>Password</source> - <translation>Slaptažodis</translation> - </message> - <message> - <source>Extended ASCII</source> - <translation>Papildomi ASCII</translation> - </message> - <message> - <source>Passphrase</source> - <translation>Slaptafrazė</translation> - </message> - <message> - <source>Wordlist:</source> - <translation>Žodžių sąrašas:</translation> - </message> - <message> - <source>Word Count:</source> - <translation>Žodžių skaičius:</translation> - </message> - <message> - <source>Word Separator:</source> - <translation>Žodžių skirtukas:</translation> - </message> - <message> - <source>Copy</source> - <translation>Kopijuoti</translation> - </message> </context> <context> <name>QObject</name> + <message> + <source>Database not opened</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database hash not available</source> + <translation type="unfinished"/> + </message> + <message> + <source>Client public key not received</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot decrypt message</source> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout or cannot connect to KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>Action cancelled or denied</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC association failed, try again</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key change was not successful</source> + <translation type="unfinished"/> + </message> + <message> + <source>Encryption key is not recognized</source> + <translation type="unfinished"/> + </message> + <message> + <source>No saved databases found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect action</source> + <translation type="unfinished"/> + </message> + <message> + <source>Empty message received</source> + <translation type="unfinished"/> + </message> + <message> + <source>No URL provided</source> + <translation type="unfinished"/> + </message> + <message> + <source>No logins found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown error</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add a new entry to a database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>Duomenų bazės kelias.</translation> + </message> + <message> + <source>Key file of the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>path</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>username</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Prompt for the entry's password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a password for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length for the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to add.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy an entry's password to the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to clip.</source> + <comment>clip = copy to clipboard</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout in seconds before clearing the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Edit an entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Title for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>title</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to edit.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Estimate the entropy of a password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password for which to estimate the entropy.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Perform advanced analysis on the password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Extract and print the content of a database.</source> + <translation>Išskleisti ir spausdinti duomenų bazės turinį.</translation> + </message> + <message> + <source>Path of the database to extract.</source> + <translation>Duomenų bazės, kurią išskleisti, kelias.</translation> + </message> + <message> + <source>Insert password to unlock %1: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to load key file %1 : %2</source> + <translation type="unfinished"/> + </message> + <message> + <source>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source> + +Available commands: +</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the command to execute.</source> + <translation>Komandos, kurią vykdyti, pavadinimas.</translation> + </message> + <message> + <source>List database entries.</source> + <translation>Išvardyti duomenų bazės įrašus.</translation> + </message> + <message> + <source>Path of the group to list. Default is /</source> + <translation>Grupės, kurią išvardyti, kelias. Numatytasis yra /</translation> + </message> + <message> + <source>Find entries quickly.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Search term.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Merge two databases.</source> + <translation>Sulieti dvi duomenų bazes.</translation> + </message> + <message> + <source>Path of the database to merge into.</source> + <translation>Duomenų bazės, į kurią sulieti, kelias.</translation> + </message> + <message> + <source>Path of the database to merge from.</source> + <translation>Duomenų bazės, iš kurios sulieti, kelias.</translation> + </message> + <message> + <source>Use the same credentials for both database files.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file of the database to merge from.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show an entry's information.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> + <translation type="unfinished"/> + </message> + <message> + <source>attribute</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the entry to show.</source> + <translation>Įrašo, kurį rodyti, pavadinimas.</translation> + </message> <message> <source>NULL device</source> <translation>NIEKINIS įrenginys</translation> @@ -1869,8 +3292,28 @@ Keiskite juos tik tuo atveju, jeigu žinote ką darote.</translation> <translation>trūksta užveriamosios kabutės</translation> </message> <message> - <source>INTERNAL - unget lower bound exceeded</source> - <translation>VIDINIS - viršyta apatinė negavimo riba</translation> + <source>AES: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Twofish: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>ChaCha20: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Argon2 (KDBX 4 – recommended)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 4)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 3.1)</source> + <translation type="unfinished"/> </message> <message> <source>Group</source> @@ -1888,14 +3331,22 @@ Keiskite juos tik tuo atveju, jeigu žinote ką darote.</translation> <source>Password</source> <translation>Slaptažodis</translation> </message> - <message> - <source>URL</source> - <translation>URL</translation> - </message> <message> <source>Notes</source> <translation>Pastabos</translation> </message> + <message> + <source>Last Modified</source> + <translation type="unfinished"/> + </message> + <message> + <source>Created</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy Browser Integration</source> + <translation type="unfinished"/> + </message> <message> <source>Browser Integration</source> <translation>Naršyklės integracija</translation> @@ -1912,6 +3363,10 @@ Keiskite juos tik tuo atveju, jeigu žinote ką darote.</translation> <source>Passive</source> <translation>Pasyvus</translation> </message> + <message> + <source>SSH Agent</source> + <translation>SSH agentas</translation> + </message> </context> <context> <name>QtIOCompressor</name> @@ -1950,8 +3405,8 @@ Keiskite juos tik tuo atveju, jeigu žinote ką darote.</translation> <context> <name>SearchWidget</name> <message> - <source>Case Sensitive</source> - <translation>Skirti raidžių dydį</translation> + <source>Search...</source> + <translation>Ieškoti...</translation> </message> <message> <source>Search</source> @@ -1962,8 +3417,8 @@ Keiskite juos tik tuo atveju, jeigu žinote ką darote.</translation> <translation>Išvalyti</translation> </message> <message> - <source>Search...</source> - <translation>Ieškoti...</translation> + <source>Case Sensitive</source> + <translation>Skirti raidžių dydį</translation> </message> <message> <source>Limit search to selected group</source> @@ -1972,50 +3427,6 @@ Keiskite juos tik tuo atveju, jeigu žinote ką darote.</translation> </context> <context> <name>Service</name> - <message> - <source>A shared encryption-key with the name "%1" already exists. -Do you want to overwrite it?</source> - <translation>Bendrinamas šifravimo raktas, pavadinimu "%1" jau yra. -Ar norite jį perrašyti?</translation> - </message> - <message> - <source>Do you want to update the information in %1 - %2?</source> - <translation>Ar norite atnaujinti informaciją ties %1 - %2?</translation> - </message> - <message> - <source>The active database is locked! -Please unlock the selected database or choose another one which is unlocked.</source> - <translation>Aktyvi duomenų bazė yra užrakinta! -Prašome atrakinti pasirinktą duomenų bazę arba pasirinkti kitą, kuri būtų atrakinta.</translation> - </message> - <message> - <source>Successfully removed %1 encryption-%2 from KeePassX/Http Settings.</source> - <translation>Sėkmingai pašalinta %1 šifravimo-%2 iš KeePassX/Http nustatymų.</translation> - </message> - <message> - <source>No shared encryption-keys found in KeePassHttp Settings.</source> - <translation>KeePassHttp nustatymuose nerasta jokių bendrinamų šifravimo raktų.</translation> - </message> - <message> - <source>The active database does not contain an entry of KeePassHttp Settings.</source> - <translation>Aktyvioje duomenų bazėje nėra KeePassHttp nustatymų įrašo.</translation> - </message> - <message> - <source>Removing stored permissions...</source> - <translation>Šalinami saugomi leidimai...</translation> - </message> - <message> - <source>Abort</source> - <translation>Nutraukti</translation> - </message> - <message> - <source>Successfully removed permissions from %1 %2.</source> - <translation>Leidimai sėkmingai pašalinti iš %1 %2.</translation> - </message> - <message> - <source>The active database does not contain an entry with permissions.</source> - <translation>Aktyvioje duomenų bazėje nėra įrašo su leidimais.</translation> - </message> <message> <source>KeePassXC: New key association request</source> <translation>KeePassXC: Naujo rakto susiejimo užklausa</translation> @@ -2033,34 +3444,78 @@ ir priimtumėte jį.</translation> <source>KeePassXC: Overwrite existing key?</source> <translation>KeePassXC: Perrašyti esamą raktą?</translation> </message> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>Bendrinamas šifravimo raktas, pavadinimu "%1" jau yra. +Ar norite jį perrašyti?</translation> + </message> <message> <source>KeePassXC: Update Entry</source> <translation>KeePassXC: Atnaujinti įrašą</translation> </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Ar norite atnaujinti informaciją ties %1 - %2?</translation> + </message> <message> <source>KeePassXC: Database locked!</source> <translation>KeePassXC: Duomenų bazė užrakinta!</translation> </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>Aktyvi duomenų bazė yra užrakinta! +Prašome atrakinti pasirinktą duomenų bazę arba pasirinkti kitą, kuri būtų atrakinta.</translation> + </message> <message> <source>KeePassXC: Removed keys from database</source> <translation>KeePassXC: Pašalinti raktai iš duomenų bazės</translation> </message> + <message numerus="yes"> + <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No keys found</source> <translation>KeePassXC: Raktų nerasta</translation> </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation>KeePassHttp nustatymuose nerasta jokių bendrinamų šifravimo raktų.</translation> + </message> <message> <source>KeePassXC: Settings not available!</source> <translation>KeePassXC: Nustatymai neprieinami!</translation> </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation>Aktyvioje duomenų bazėje nėra KeePassHttp nustatymų įrašo.</translation> + </message> + <message> + <source>Removing stored permissions...</source> + <translation>Šalinami saugomi leidimai...</translation> + </message> + <message> + <source>Abort</source> + <translation>Nutraukti</translation> + </message> <message> <source>KeePassXC: Removed permissions</source> <translation>KeePassXC: Pašalinti leidimai</translation> </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entries.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No entry with permissions found!</source> <translation>KeePassXC: Nerasta jokių įrašų su leidimais!</translation> </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>Aktyvioje duomenų bazėje nėra įrašo su leidimais.</translation> + </message> </context> <context> <name>SettingsWidget</name> @@ -2083,10 +3538,26 @@ ir priimtumėte jį.</translation> </context> <context> <name>SettingsWidgetGeneral</name> + <message> + <source>Basic Settings</source> + <translation>Pagrindiniai nustatymai</translation> + </message> + <message> + <source>Start only a single instance of KeePassXC</source> + <translation>Paleisti tik vieną KeePassXC egzempliorių</translation> + </message> <message> <source>Remember last databases</source> <translation>Prisiminti paskutines duomenų bazes</translation> </message> + <message> + <source>Remember last key files and security dongles</source> + <translation>Prisiminti paskutinius rakto failus ir saugumo saugiklius</translation> + </message> + <message> + <source>Load previous databases on startup</source> + <translation>Paleidžiant programą, įkelti ankstesnes duomenų bazes</translation> + </message> <message> <source>Automatically save on exit</source> <translation>Išeinant, automatiškai įrašyti</translation> @@ -2095,21 +3566,29 @@ ir priimtumėte jį.</translation> <source>Automatically save after every change</source> <translation>Automatiškai įrašyti po kiekvieno pakeitimo</translation> </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation>Išoriškai modifikavus duomenų bazę, automatiškai įkelti ją iš naujo</translation> + </message> <message> <source>Minimize when copying to clipboard</source> <translation>Kopijuojant į iškarpinę, suskleisti langą</translation> </message> + <message> + <source>Minimize window at application startup</source> + <translation>Paleidus programą, suskleisti langą</translation> + </message> <message> <source>Use group icon on entry creation</source> <translation>Kuriant įrašus, naudoti grupės piktogramą</translation> </message> <message> - <source>Global Auto-Type shortcut</source> - <translation>Visuotinis automatinio rinkimo spartusis klavišas</translation> + <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> + <translation>Nežymėti duomenų bazė kaip pakeistą, jei buvo keičiami ne duomenys, o kita (pvz., išskleidžiamos grupės)</translation> </message> <message> - <source>Language</source> - <translation>Kalba</translation> + <source>Hide the Details view</source> + <translation type="unfinished"/> </message> <message> <source>Show a system tray icon</source> @@ -2119,67 +3598,61 @@ ir priimtumėte jį.</translation> <source>Hide window to system tray when minimized</source> <translation>Suskleidus langą, slėpti jį į sistemos dėklą</translation> </message> - <message> - <source>Load previous databases on startup</source> - <translation>Paleidžiant programą, įkelti ankstesnes duomenų bazes</translation> - </message> - <message> - <source>Automatically reload the database when modified externally</source> - <translation>Išoriškai modifikavus duomenų bazę, automatiškai įkelti ją iš naujo</translation> - </message> <message> <source>Hide window to system tray instead of app exit</source> <translation>Neužverti lango, bet vietoj to, suskleisti jį į sistemos dėklą</translation> </message> <message> - <source>Minimize window at application startup</source> - <translation>Paleidus programą, suskleisti langą</translation> + <source>Dark system tray icon</source> + <translation type="unfinished"/> </message> <message> - <source>Basic Settings</source> - <translation>Pagrindiniai nustatymai</translation> - </message> - <message> - <source>Remember last key files and security dongles</source> - <translation>Prisiminti paskutinius rakto failus ir saugumo saugiklius</translation> - </message> - <message> - <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> - <translation>Nežymėti duomenų bazė kaip pakeistą, jei buvo keičiami ne duomenys, o kita (pvz., išskleidžiamos grupės)</translation> + <source>Language</source> + <translation>Kalba</translation> </message> <message> <source>Auto-Type</source> <translation>Automatinis rinkimas</translation> </message> <message> - <source>Use entry title and URL to match windows for global Auto-Type</source> - <translation>Naudoti įrašo antraštę ir URL, norint sutapatinti langus visuotiniam automatiniam rinkimui</translation> + <source>Use entry title to match windows for global Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use entry URL to match windows for global Auto-Type</source> + <translation type="unfinished"/> </message> <message> <source>Always ask before performing Auto-Type</source> <translation>Visada klausti prieš atliekant automatinį rinkimą</translation> </message> + <message> + <source>Global Auto-Type shortcut</source> + <translation>Visuotinis automatinio rinkimo spartusis klavišas</translation> + </message> <message> <source>Auto-Type delay</source> <translation>Automatinio rinkimo delsa</translation> </message> <message> <source> ms</source> + <comment>Milliseconds</comment> <translation> ms</translation> </message> - <message> - <source>Start only a single instance of KeePassXC</source> - <translation>Paleisti tik vieną KeePassXC egzempliorių</translation> - </message> </context> <context> <name>SettingsWidgetSecurity</name> + <message> + <source>Timeouts</source> + <translation>Laiko limitai</translation> + </message> <message> <source>Clear clipboard after</source> <translation>Išvalyti iškarpinę po</translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation>sek.</translation> </message> <message> @@ -2187,8 +3660,12 @@ ir priimtumėte jį.</translation> <translation>Užrakinti duomenų bazes, kai kompiuteris neaktyvus</translation> </message> <message> - <source>Show passwords in cleartext by default</source> - <translation>Pagal numatymą, rodyti slaptažodžius atviruoju tekstu</translation> + <source>Convenience</source> + <translation>Patogumas</translation> + </message> + <message> + <source>Lock databases when session is locked or lid is closed</source> + <translation>Užrakinti duomenų bazes, kai yra užrakinamas ekranas ar uždaromas nešiojamojo kompiuterio dangtis</translation> </message> <message> <source>Lock databases after minimizing the window</source> @@ -2199,16 +3676,16 @@ ir priimtumėte jį.</translation> <translation>Nereikalauti pakartoti slaptažodį, kai šis yra matomas</translation> </message> <message> - <source>Timeouts</source> - <translation>Laiko limitai</translation> + <source>Show passwords in cleartext by default</source> + <translation>Pagal numatymą, rodyti slaptažodžius atviruoju tekstu</translation> </message> <message> - <source>Convenience</source> - <translation>Patogumas</translation> + <source>Hide passwords in the preview panel</source> + <translation type="unfinished"/> </message> <message> - <source>Lock databases when session is locked or lid is closed</source> - <translation>Užrakinti duomenų bazes, kai yra užrakinamas ekranas ar uždaromas nešiojamojo kompiuterio dangtis</translation> + <source>Hide entry notes by default</source> + <translation type="unfinished"/> </message> <message> <source>Privacy</source> @@ -2229,6 +3706,14 @@ ir priimtumėte jį.</translation> <source>Key:</source> <translation>Raktas:</translation> </message> + <message> + <source>Default RFC 6238 token settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Steam token settings</source> + <translation type="unfinished"/> + </message> <message> <source>Use custom settings</source> <translation>Naudoti tinkintus nustatymus</translation> @@ -2255,6 +3740,7 @@ ir priimtumėte jį.</translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation>sek.</translation> </message> </context> @@ -2321,6 +3807,26 @@ ir priimtumėte jį.</translation> </context> <context> <name>main</name> + <message> + <source>Remove an entry from the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>Duomenų bazės kelias.</translation> + </message> + <message> + <source>Path of the entry to remove.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation>KeePassXC - daugiaplatformė slaptažodžių tvarkytuvė</translation> + </message> + <message> + <source>filenames of the password databases to open (*.kdbx)</source> + <translation>norimų atverti slaptažodžių duomenų bazių failų pavadinimai (*.kdbx)</translation> + </message> <message> <source>path to a custom config file</source> <translation>kelias į tinkintą konfigūracijos failą</translation> @@ -2329,81 +3835,13 @@ ir priimtumėte jį.</translation> <source>key file of the database</source> <translation>duomenų bazės rakto failas</translation> </message> - <message> - <source>KeePassXC - cross-platform password manager</source> - <translation>KeePassXC - daugiaplatformė slaptažodžių tvarkytuvė</translation> - </message> <message> <source>read password of the database from stdin</source> <translation>nuskaityti duomenų bazės slaptažodį iš stdin</translation> </message> <message> - <source>filenames of the password databases to open (*.kdbx)</source> - <translation>norimų atverti slaptažodžių duomenų bazių failų pavadinimai (*.kdbx)</translation> - </message> - <message> - <source>Copy a password to the clipboard</source> - <translation>Kopijuoti slaptažodį į iškarpinę</translation> - </message> - <message> - <source>Path of the database.</source> - <translation>Duomenų bazės kelias.</translation> - </message> - <message> - <source>Use a GUI prompt unlocking the database.</source> - <translation>Naudoti grafinę duomenų bazės atrakinimo užklausą.</translation> - </message> - <message> - <source>Name of the entry to clip.</source> - <translation>Įrašo, kurį apkirpti, pavadinimas.</translation> - </message> - <message> - <source>Extract and print the content of a database.</source> - <translation>Išskleisti ir spausdinti duomenų bazės turinį.</translation> - </message> - <message> - <source>Path of the database to extract.</source> - <translation>Duomenų bazės, kurią išskleisti, kelias.</translation> - </message> - <message> - <source>Name of the command to execute.</source> - <translation>Komandos, kurią vykdyti, pavadinimas.</translation> - </message> - <message> - <source>List database entries.</source> - <translation>Išvardyti duomenų bazės įrašus.</translation> - </message> - <message> - <source>Path of the group to list. Default is /</source> - <translation>Grupės, kurią išvardyti, kelias. Numatytasis yra /</translation> - </message> - <message> - <source>Print the UUIDs of the entries and groups.</source> - <translation>Spausdinti įrašų ir grupių UUID.</translation> - </message> - <message> - <source>Merge two databases.</source> - <translation>Sulieti dvi duomenų bazes.</translation> - </message> - <message> - <source>Path of the database to merge into.</source> - <translation>Duomenų bazės, į kurią sulieti, kelias.</translation> - </message> - <message> - <source>Path of the database to merge from.</source> - <translation>Duomenų bazės, iš kurios sulieti, kelias.</translation> - </message> - <message> - <source>Use the same password for both database files.</source> - <translation>Abiems duomenų bazių failams naudoti tą patį slaptažodį.</translation> - </message> - <message> - <source>Show a password.</source> - <translation>Rodyti slaptažodį.</translation> - </message> - <message> - <source>Name of the entry to show.</source> - <translation>Įrašo, kurį rodyti, pavadinimas.</translation> + <source>Parent window handle</source> + <translation type="unfinished"/> </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_nl_NL.ts b/share/translations/keepassx_nl_NL.ts index e18f1a908..3191bf949 100644 --- a/share/translations/keepassx_nl_NL.ts +++ b/share/translations/keepassx_nl_NL.ts @@ -9,14 +9,34 @@ <source>About</source> <translation>Over</translation> </message> + <message> + <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>KeePassXC wordt verspreid onder de voorwaarden van de GNU General Public License (GPL) versie 2 of (als u wenst) versie 3.</translation> + </message> + <message> + <source>Project Maintainers:</source> + <translation type="unfinished"/> + </message> <message> <source>Contributors</source> <translation type="unfinished"/> </message> + <message> + <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> + <translation type="unfinished"/> + </message> <message> <source>Debug Info</source> <translation type="unfinished"/> </message> + <message> + <source>Include the following information whenever you report a bug:</source> + <translation type="unfinished"/> + </message> <message> <source>Copy to clipboard</source> <translation type="unfinished"/> @@ -30,6 +50,10 @@ <source>Revision: %1</source> <translation type="unfinished"/> </message> + <message> + <source>Distribution: %1</source> + <translation type="unfinished"/> + </message> <message> <source>Libraries:</source> <translation type="unfinished"/> @@ -44,33 +68,13 @@ Kernel: %3 %4</source> <source>Enabled extensions:</source> <translation type="unfinished"/> </message> - <message> - <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> - <translation type="unfinished"/> - </message> - <message> - <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassXC wordt verspreid onder de voorwaarden van de GNU General Public License (GPL) versie 2 of (als u wenst) versie 3.</translation> - </message> - <message> - <source>Project Maintainers:</source> - <translation type="unfinished"/> - </message> - <message> - <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation type="unfinished"/> - </message> - <message> - <source>Include the following information whenever you report a bug:</source> - <translation type="unfinished"/> - </message> - <message> - <source>Distribution: %1</source> - <translation type="unfinished"/> - </message> </context> <context> <name>AccessControlDialog</name> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>KeePassXC HTTP-toegang bevestigen</translation> + </message> <message> <source>Remember this decision</source> <translation>Deze keuze onthouden</translation> @@ -89,9 +93,12 @@ Please select whether you want to allow access.</source> <translation>%1 vraagt toegang tot uw wachtwoorden voor het/de volgende item(s). Geef aan of u toegang wilt toestaan of niet.</translation> </message> +</context> +<context> + <name>AgentSettingsWidget</name> <message> - <source>KeePassXC HTTP Confirm Access</source> - <translation>KeePassXC HTTP-toegang bevestigen</translation> + <source>Enable SSH Agent (requires restart)</source> + <translation type="unfinished"/> </message> </context> <context> @@ -104,6 +111,26 @@ Geef aan of u toegang wilt toestaan of niet.</translation> <source>Auto-Type - KeePassXC</source> <translation>Auto-typen - KeePassXC</translation> </message> + <message> + <source>Auto-Type</source> + <translation>Auto-typen - KeePassX</translation> + </message> + <message> + <source>The Syntax of your Auto-Type statement is incorrect!</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> </context> <context> <name>AutoTypeAssociationsModel</name> @@ -122,13 +149,290 @@ Geef aan of u toegang wilt toestaan of niet.</translation> </context> <context> <name>AutoTypeSelectDialog</name> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>Auto-typen - KeePassXC</translation> + </message> <message> <source>Select entry to Auto-Type:</source> <translation>Kies item om automatisch te typen:</translation> </message> +</context> +<context> + <name>BrowserAccessControlDialog</name> <message> - <source>Auto-Type - KeePassXC</source> - <translation>Auto-typen - KeePassXC</translation> + <source>KeePassXC-Browser Confirm Access</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remember this decision</source> + <translation>Deze keuze onthouden</translation> + </message> + <message> + <source>Allow</source> + <translation>Toestaan</translation> + </message> + <message> + <source>Deny</source> + <translation>Weigeren</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 vraagt toegang tot uw wachtwoorden voor het/de volgende item(s). +Geef aan of u toegang wilt toestaan of niet.</translation> + </message> +</context> +<context> + <name>BrowserOptionDialog</name> + <message> + <source>Dialog</source> + <translation>Dialoog</translation> + </message> + <message> + <source>This is required for accessing your databases with KeePassXC-Browser</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable KeepassXC browser integration</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>Algemeen</translation> + </message> + <message> + <source>Enable integration for these browsers:</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Google Chrome</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Firefox</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Chromium</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Vivaldi</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show a &notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Verzoek om database te ontgrendelen als deze vergrendeld is</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Match URL scheme (e.g., https://...)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return only best-matching credentials</source> + <translation type="unfinished"/> + </message> + <message> + <source>Sort &matching credentials by title</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Sort matching credentials by &username</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>&Disconnect all browsers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Forget all remembered &permissions</source> + <translation type="unfinished"/> + </message> + <message> + <source>Advanced</source> + <translation>Geavanceerd</translation> + </message> + <message> + <source>Never &ask before accessing credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Never ask before &updating credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searc&h in all opened databases for matching credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>Het automatisch aanmaken of wijzigen van tekenreeks velden wordt niet ondersteund.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>&Geef geadvanceerde tekenreeks velden terug die met "KH: " beginnen.</translation> + </message> + <message> + <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Update &native messaging manifest files at startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Support a proxy application between KeePassXC and browser extension.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &proxy application between KeePassXC and browser extension</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a custom proxy location if you installed a proxy manually.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &custom proxy location</source> + <comment>Meant is the proxy for KeePassXC-Browser</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*.exe);;All Files (*.*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select custom proxy location</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>BrowserService</name> + <message> + <source>KeePassXC: New key association request</source> + <translation>KeePassXC: Nieuw verzoek voor sleutel associatie</translation> + </message> + <message> + <source>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Save and allow access</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: Huidige sleutel overschrijven?</translation> + </message> + <message> + <source>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: Item bijwerken</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Wil je de gegevens in %1 - %2 bijwerken?</translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: Database vergrendeld!</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>De actieve database is vergrendeld! +Ontgrendel de geselecteerde database of kies een ontgrendelde database.</translation> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: Instellingen niet beschikbaar!</translation> + </message> + <message> + <source>The active database does not contain a settings entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: Geen sleutels gevonden</translation> + </message> + <message> + <source>No shared encryption keys found in KeePassXC Settings.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: Sleutels uit database verwijderd</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Removing stored permissions…</source> + <translation type="unfinished"/> + </message> + <message> + <source>Abort</source> + <translation>Afbreken</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: Permissies verwijderd</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entry(s).</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation>KeePassXC: Geen item met permissies gevonden!</translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>De actieve database bevat geen items met permissies.</translation> </message> </context> <context> @@ -145,6 +449,10 @@ Geef aan of u toegang wilt toestaan of niet.</translation> <source>Repeat password:</source> <translation>Wachtwoord herhalen:</translation> </message> + <message> + <source>&Key file</source> + <translation>&Sleutelbestand</translation> + </message> <message> <source>Browse</source> <translation>Bladeren</translation> @@ -153,6 +461,14 @@ Geef aan of u toegang wilt toestaan of niet.</translation> <source>Create</source> <translation>Creëren</translation> </message> + <message> + <source>Cha&llenge Response</source> + <translation type="unfinished"/> + </message> + <message> + <source>Refresh</source> + <translation type="unfinished"/> + </message> <message> <source>Key files</source> <translation>Sleutelbestanden</translation> @@ -173,6 +489,10 @@ Geef aan of u toegang wilt toestaan of niet.</translation> <source>Select a key file</source> <translation>Kies een sleutelbestand</translation> </message> + <message> + <source>Empty password</source> + <translation type="unfinished"/> + </message> <message> <source>Do you really want to use an empty string as password?</source> <translation>Weet u zeker dat u een leeg veld als wachtwoord wilt gebruiken?</translation> @@ -188,19 +508,14 @@ Geef aan of u toegang wilt toestaan of niet.</translation> %2</translation> </message> <message> - <source>&Key file</source> - <translation>&Sleutelbestand</translation> - </message> - <message> - <source>Cha&llenge Response</source> + <source>Legacy key file format</source> <translation type="unfinished"/> </message> <message> - <source>Refresh</source> - <translation type="unfinished"/> - </message> - <message> - <source>Empty password</source> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> <translation type="unfinished"/> </message> <message> @@ -214,6 +529,10 @@ Geef aan of u toegang wilt toestaan of niet.</translation> <source>Clone Options</source> <translation type="unfinished"/> </message> + <message> + <source>Append ' - Clone' to title</source> + <translation type="unfinished"/> + </message> <message> <source>Replace username and password with references</source> <translation type="unfinished"/> @@ -222,10 +541,6 @@ Geef aan of u toegang wilt toestaan of niet.</translation> <source>Copy history</source> <translation type="unfinished"/> </message> - <message> - <source>Append ' - Clone' to title</source> - <translation type="unfinished"/> - </message> </context> <context> <name>CsvImportWidget</name> @@ -321,10 +636,6 @@ Geef aan of u toegang wilt toestaan of niet.</translation> </context> <context> <name>CsvImportWizard</name> - <message> - <source>Import CSV file</source> - <translation type="unfinished"/> - </message> <message> <source>Error</source> <translation>Fout</translation> @@ -336,17 +647,17 @@ Geef aan of u toegang wilt toestaan of niet.</translation> </context> <context> <name>CsvParserModel</name> - <message> - <source> byte, </source> - <translation type="unfinished"/> + <message numerus="yes"> + <source>%n byte(s), </source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> - <message> - <source> rows, </source> - <translation type="unfinished"/> + <message numerus="yes"> + <source>%n row(s), </source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> - <message> - <source> columns</source> - <translation type="unfinished"/> + <message numerus="yes"> + <source>%n column(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> </context> <context> @@ -367,14 +678,37 @@ Geef aan of u toegang wilt toestaan of niet.</translation> <source>Browse</source> <translation>Bladeren</translation> </message> + <message> + <source>Refresh</source> + <translation type="unfinished"/> + </message> + <message> + <source>Challenge Response:</source> + <translation type="unfinished"/> + </message> <message> <source>Unable to open the database.</source> - <translation>Niet mogelijk om de database te openen.</translation> + <translation>Het is niet mogelijk om de database te openen.</translation> </message> <message> <source>Can't open key file</source> <translation>Niet mogelijk om het sleutelbestand te openen</translation> </message> + <message> + <source>Legacy key file format</source> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't show this warning again</source> + <translation type="unfinished"/> + </message> <message> <source>All files</source> <translation>Alle bestanden</translation> @@ -387,14 +721,6 @@ Geef aan of u toegang wilt toestaan of niet.</translation> <source>Select key file</source> <translation>Kies sleutelbestand</translation> </message> - <message> - <source>Refresh</source> - <translation type="unfinished"/> - </message> - <message> - <source>Challenge Response:</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DatabaseRepairWidget</name> @@ -411,12 +737,12 @@ Geef aan of u toegang wilt toestaan of niet.</translation> <translation>Niet mogelijk om het sleutelbestand te openen</translation> </message> <message> - <source>Database opened fine. Nothing to do.</source> - <translation>Database werd zonder problemen geopend. Niets te doen.</translation> + <source>Unable to open the database.</source> + <translation>Het is niet mogelijk om de database te openen.</translation> </message> <message> - <source>Unable to open the database.</source> - <translation>Niet mogelijk om de database te openen.</translation> + <source>Database opened fine. Nothing to do.</source> + <translation>Database werd zonder problemen geopend. Niets te doen.</translation> </message> <message> <source>Success</source> @@ -436,40 +762,57 @@ U kunt deze nu opslaan.</translation> <context> <name>DatabaseSettingsWidget</name> <message> - <source>Database name:</source> - <translation>Naam van de database:</translation> + <source>General</source> + <translation>Algemeen</translation> </message> <message> - <source>Database description:</source> - <translation>Beschrijving van de database:</translation> + <source>Encryption</source> + <translation type="unfinished"/> </message> <message> - <source>Transform rounds:</source> - <translation>Transformatierondes:</translation> + <source>Number of rounds too high</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> </message> <message> - <source>Default username:</source> - <translation>Standaard gebruikersnaam:</translation> + <source>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</source> + <translation type="unfinished"/> </message> <message> - <source> MiB</source> - <translation>MiB</translation> + <source>Understood, keep number</source> + <translation type="unfinished"/> </message> <message> - <source>Benchmark</source> - <translation>Test</translation> + <source>Cancel</source> + <translation type="unfinished"/> </message> <message> - <source>Max. history items:</source> - <translation>Max. items in geschiedenis:</translation> + <source>Number of rounds too low</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> </message> <message> - <source>Max. history size:</source> - <translation>Max. geschiedenisgrootte:</translation> + <source>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</source> + <translation type="unfinished"/> </message> <message> - <source>Use recycle bin</source> - <translation>Prullenbak gebruiken</translation> + <source>KDF unchanged</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetEncryption</name> + <message> + <source>Encryption Algorithm:</source> + <translation type="unfinished"/> </message> <message> <source>AES: 256 Bit (default)</source> @@ -480,14 +823,78 @@ U kunt deze nu opslaan.</translation> <translation type="unfinished"/> </message> <message> - <source>Algorithm:</source> + <source>Key Derivation Function:</source> <translation type="unfinished"/> </message> + <message> + <source>Transform rounds:</source> + <translation>Transformatierondes:</translation> + </message> + <message> + <source>Benchmark 1-second delay</source> + <translation type="unfinished"/> + </message> + <message> + <source>Memory Usage:</source> + <translation type="unfinished"/> + </message> + <message> + <source> MB</source> + <translation type="unfinished"/> + </message> + <message> + <source>Parallelism:</source> + <translation type="unfinished"/> + </message> + <message> + <source> thread</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetGeneral</name> + <message> + <source>Database Meta Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database name:</source> + <translation>Naam van de database:</translation> + </message> + <message> + <source>Database description:</source> + <translation>Beschrijving van de database:</translation> + </message> + <message> + <source>Default username:</source> + <translation>Standaard gebruikersnaam:</translation> + </message> + <message> + <source>History Settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Max. history items:</source> + <translation>Max. items in geschiedenis:</translation> + </message> + <message> + <source>Max. history size:</source> + <translation>Max. geschiedenisgrootte:</translation> + </message> + <message> + <source> MiB</source> + <translation>MiB</translation> + </message> + <message> + <source>Use recycle bin</source> + <translation>Prullenbak gebruiken</translation> + </message> </context> <context> <name>DatabaseTabWidget</name> <message> <source>Root</source> + <comment>Root group</comment> <translation>Alles</translation> </message> <message> @@ -506,6 +913,30 @@ U kunt deze nu opslaan.</translation> <source>File not found!</source> <translation>Bestand niet gevonden!</translation> </message> + <message> + <source>Unable to open the database.</source> + <translation>Het is niet mogelijk om de database te openen.</translation> + </message> + <message> + <source>File opened in read only mode.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Open CSV file</source> + <translation type="unfinished"/> + </message> + <message> + <source>CSV file</source> + <translation>CSV-bestand</translation> + </message> + <message> + <source>All files (*)</source> + <translation>Alle bestanden (*)</translation> + </message> + <message> + <source>Merge database</source> + <translation>Database samenvoegen</translation> + </message> <message> <source>Open KeePass 1 database</source> <translation>KeePass 1-database openen</translation> @@ -514,14 +945,16 @@ U kunt deze nu opslaan.</translation> <source>KeePass 1 database</source> <translation>KeePass 1-database</translation> </message> - <message> - <source>All files (*)</source> - <translation>Alle bestanden (*)</translation> - </message> <message> <source>Close?</source> <translation>Sluiten?</translation> </message> + <message> + <source>"%1" is in edit mode. +Discard changes and close anyway?</source> + <translation>"%1" is gewijzigd. +Wijzigingen ongedaan maken en doorgaan met sluiten?</translation> + </message> <message> <source>Save changes?</source> <translation>Wijzigingen opslaan?</translation> @@ -536,10 +969,22 @@ Opslaan?</translation> <source>Writing the database failed.</source> <translation>Het opslaan van de database is mislukt.</translation> </message> + <message> + <source>Passwords</source> + <translation>Wachtwoorden</translation> + </message> <message> <source>Save database as</source> <translation>Database opslaan als</translation> </message> + <message> + <source>Export database to CSV file</source> + <translation>Database exporteren naar CSV-bestand</translation> + </message> + <message> + <source>Writing the CSV file failed.</source> + <translation>Schrijven van het CSV-bestand mislukt.</translation> + </message> <message> <source>New database</source> <translation>Nieuwe database</translation> @@ -557,12 +1002,6 @@ Opslaan?</translation> Please press cancel to finish your changes or discard them.</source> <translation>Kan de database niet vergrendelen omdat u deze momenteel aan het bewerken bent. Druk op annuleren om uw wijzigingen aan te passen of gooi de wijzigingen weg.</translation> - </message> - <message> - <source>This database has never been saved. -You can save the database or stop locking it.</source> - <translation>Deze database is nog niet opgeslagen. -U kunt de database opslaan of het vergrendelen annuleren.</translation> </message> <message> <source>This database has been modified. @@ -572,71 +1011,16 @@ Otherwise your changes are lost.</source> Wilt u de database opslaan voordat u deze vergrendelt? Zo nee, dan gaan de wijzigingen verloren.</translation> </message> - <message> - <source>"%1" is in edit mode. -Discard changes and close anyway?</source> - <translation>"%1" is gewijzigd. -Wijzigingen ongedaan maken en doorgaan met sluiten?</translation> - </message> - <message> - <source>Export database to CSV file</source> - <translation>Database exporteren naar CSV-bestand</translation> - </message> - <message> - <source>CSV file</source> - <translation>CSV-bestand</translation> - </message> - <message> - <source>Writing the CSV file failed.</source> - <translation>Schrijven van het CSV-bestand mislukt.</translation> - </message> - <message> - <source>Unable to open the database.</source> - <translation>Het is niet mogelijk om de database te openen.</translation> - </message> - <message> - <source>Merge database</source> - <translation>Database samenvoegen</translation> - </message> - <message> - <source>The database you are trying to save as is locked by another instance of KeePassXC. -Do you want to save it anyway?</source> - <translation>De database die u op probeert te slaan is vergrendeld door een andere instantie van KeePassXC. -Wilt u toch doorgaan met opslaan?</translation> - </message> - <message> - <source>Passwords</source> - <translation>Wachtwoorden</translation> - </message> - <message> - <source>Database already opened</source> - <translation>Database is al geopend</translation> - </message> - <message> - <source>The database you are trying to open is locked by another instance of KeePassXC. - -Do you want to open it anyway?</source> - <translation>De database die u probeert te openen is vergrendeld door een andere instantie van KeePassXC. -Wilt u toch doorgaan met openen?</translation> - </message> - <message> - <source>Open read-only</source> - <translation>Openen als alleen-lezen</translation> - </message> - <message> - <source>File opened in read only mode.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Open CSV file</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DatabaseWidget</name> + <message> + <source>Searching...</source> + <translation>Bezig met zoeken...</translation> + </message> <message> <source>Change master key</source> - <translation>Wijzig hoofdsleutel</translation> + <translation>Hoofdsleutel wijzigen</translation> </message> <message> <source>Delete entry?</source> @@ -654,13 +1038,33 @@ Wilt u toch doorgaan met openen?</translation> <source>Do you really want to delete %1 entries for good?</source> <translation>Weet u zeker dat u %1 elementen wilt wissen?</translation> </message> + <message> + <source>Move entry to recycle bin?</source> + <translation>Wilt u het item naar de prullenbak verplaatsen?</translation> + </message> + <message> + <source>Do you really want to move entry "%1" to the recycle bin?</source> + <translation>Weet u zeker dat u item "%1" naar de prullenbak wilt verplaatsen?</translation> + </message> <message> <source>Move entries to recycle bin?</source> <translation>Elementen naar de prullenbak verplaatsen?</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>Weet u zeker dat u %n element naar de prullenbak wilt verplaatsen?</numerusform><numerusform>Weet u zeker dat u %n elementen naar de prullenbak wilt verplaatsen?</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Execute command?</source> + <translation>Commando uitvoeren?</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation>Weet u zeker dat u het volgende commando wilt uitvoeren? <br><br>%1<br></translation> + </message> + <message> + <source>Remember my choice</source> + <translation>Mijn keuze onthouden</translation> </message> <message> <source>Delete group?</source> @@ -674,18 +1078,6 @@ Wilt u toch doorgaan met openen?</translation> <source>Unable to calculate master key</source> <translation>Niet mogelijk om hoofdsleutel te berekenen</translation> </message> - <message> - <source>Move entry to recycle bin?</source> - <translation>Wilt u het item naar de prullenbak verplaatsen?</translation> - </message> - <message> - <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation>Weet u zeker dat u item "%1" naar de prullenbak wilt verplaatsen?</translation> - </message> - <message> - <source>Searching...</source> - <translation>Bezig met zoeken...</translation> - </message> <message> <source>No current database.</source> <translation>Geen huidige database.</translation> @@ -703,20 +1095,8 @@ Wilt u toch doorgaan met openen?</translation> <translation>Geen resultaten</translation> </message> <message> - <source>Execute command?</source> - <translation>Commando uitvoeren?</translation> - </message> - <message> - <source>Do you really want to execute the following command?<br><br>%1<br></source> - <translation>Weet u zeker dat u het volgende commando wilt uitvoeren? <br><br>%1<br></translation> - </message> - <message> - <source>Remember my choice</source> - <translation>Mijn keuze onthouden</translation> - </message> - <message> - <source>Autoreload Request</source> - <translation>Automatisch herladen-verzoeken</translation> + <source>File has changed</source> + <translation type="unfinished"/> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -727,8 +1107,9 @@ Wilt u toch doorgaan met openen?</translation> <translation>Samenvoegingsverzoek</translation> </message> <message> - <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> - <translation>Het database-bestand is gewijzigd en u heeft niet-opgeslagen wijzigingen. Wilt u uw wijzigingen samenvoegen?</translation> + <source>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</source> + <translation type="unfinished"/> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -743,6 +1124,89 @@ Wilt u toch doorgaan met openen?</translation> <translation type="unfinished"/> </message> </context> +<context> + <name>DetailsWidget</name> + <message> + <source>Generate TOTP Token</source> + <translation type="unfinished"/> + </message> + <message> + <source>Close</source> + <translation>Sluiten</translation> + </message> + <message> + <source>General</source> + <translation>Algemeen</translation> + </message> + <message> + <source>Password</source> + <translation>Wachtwoord</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Expiration</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username</source> + <translation>Gebruikersnaam</translation> + </message> + <message> + <source>Autotype</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searching</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attributes</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation>Bijlagen</translation> + </message> + <message> + <source>Notes</source> + <translation>Opmerkingen</translation> + </message> + <message> + <source>Window</source> + <translation>Venster</translation> + </message> + <message> + <source>Sequence</source> + <translation>Volgorde</translation> + </message> + <message> + <source>Search</source> + <translation>Zoeken</translation> + </message> + <message> + <source>Clear</source> + <translation>Wissen</translation> + </message> + <message> + <source>Never</source> + <translation type="unfinished"/> + </message> + <message> + <source>[PROTECTED]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Disabled</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enabled</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EditEntryWidget</name> <message> @@ -769,6 +1233,30 @@ Wilt u toch doorgaan met openen?</translation> <source>History</source> <translation>Geschiedenis</translation> </message> + <message> + <source>SSH Agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>(encrypted)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>File too large to be a private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open private key</source> + <translation type="unfinished"/> + </message> <message> <source>Entry history</source> <translation>Geschiedenis van element</translation> @@ -783,46 +1271,12 @@ Wilt u toch doorgaan met openen?</translation> </message> <message> <source>Different passwords supplied.</source> - <translation>Verschillende wachtwoorden opgegeven.</translation> + <translation>U heeft verschillende wachtwoorden opgegeven.</translation> </message> <message> <source>New attribute</source> <translation>Nieuwe eigenschap</translation> </message> - <message> - <source>Select file</source> - <translation>Kies bestand</translation> - </message> - <message> - <source>Unable to open file</source> - <translation>Niet mogelijk om bestand te openen</translation> - </message> - <message> - <source>Save attachment</source> - <translation>Bijlage opslaan</translation> - </message> - <message> - <source>Unable to save the attachment: -</source> - <translation>Niet mogelijk om de bijlage op te slaan: -</translation> - </message> - <message> - <source>Tomorrow</source> - <translation>Morgen</translation> - </message> - <message numerus="yes"> - <source>%n week(s)</source> - <translation><numerusform>%n week</numerusform><numerusform>%n weken</numerusform></translation> - </message> - <message numerus="yes"> - <source>%n month(s)</source> - <translation><numerusform>%n maand</numerusform><numerusform>%n maanden</numerusform></translation> - </message> - <message> - <source>1 year</source> - <translation>1 jaar</translation> - </message> <message> <source>Confirm Remove</source> <translation type="unfinished"/> @@ -832,13 +1286,29 @@ Wilt u toch doorgaan met openen?</translation> <translation type="unfinished"/> </message> <message> - <source>[PROTECTED] Press reveal to view or edit</source> + <source>[PROTECTED]</source> <translation type="unfinished"/> </message> <message> - <source>Are you sure you want to remove this attachment?</source> + <source>Press reveal to view or edit</source> <translation type="unfinished"/> </message> + <message> + <source>Tomorrow</source> + <translation>Morgen</translation> + </message> + <message numerus="yes"> + <source>%n week(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source>%n month(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>1 year</source> + <translation>1 jaar</translation> + </message> </context> <context> <name>EditEntryWidgetAdvanced</name> @@ -854,18 +1324,6 @@ Wilt u toch doorgaan met openen?</translation> <source>Remove</source> <translation>Verwijderen</translation> </message> - <message> - <source>Attachments</source> - <translation>Bijlagen</translation> - </message> - <message> - <source>Save</source> - <translation>Opslaan</translation> - </message> - <message> - <source>Open</source> - <translation>Open</translation> - </message> <message> <source>Edit Name</source> <translation type="unfinished"/> @@ -878,6 +1336,10 @@ Wilt u toch doorgaan met openen?</translation> <source>Reveal</source> <translation type="unfinished"/> </message> + <message> + <source>Attachments</source> + <translation>Bijlagen</translation> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -885,6 +1347,18 @@ Wilt u toch doorgaan met openen?</translation> <source>Enable Auto-Type for this entry</source> <translation>Auto-typen inschakelen voor dit element</translation> </message> + <message> + <source>Inherit default Auto-Type sequence from the &group</source> + <translation>Erf standaard auto-typevolgorde van de &groep</translation> + </message> + <message> + <source>&Use custom Auto-Type sequence:</source> + <translation>&Gebruik aangepaste auto-typevolgorde:</translation> + </message> + <message> + <source>Window Associations</source> + <translation type="unfinished"/> + </message> <message> <source>+</source> <translation>+</translation> @@ -897,14 +1371,6 @@ Wilt u toch doorgaan met openen?</translation> <source>Window title:</source> <translation>Venstertitel:</translation> </message> - <message> - <source>Inherit default Auto-Type sequence from the &group</source> - <translation>Erf standaard auto-typevolgorde van de &groep</translation> - </message> - <message> - <source>&Use custom Auto-Type sequence:</source> - <translation>&Gebruik aangepaste auto-typevolgorde:</translation> - </message> <message> <source>Use default se&quence</source> <translation>Gebruik standaardvolgorde</translation> @@ -913,10 +1379,6 @@ Wilt u toch doorgaan met openen?</translation> <source>Set custo&m sequence:</source> <translation>Stel aangepaste volgorde in:</translation> </message> - <message> - <source>Window Associations</source> - <translation type="unfinished"/> - </message> </context> <context> <name>EditEntryWidgetHistory</name> @@ -940,12 +1402,8 @@ Wilt u toch doorgaan met openen?</translation> <context> <name>EditEntryWidgetMain</name> <message> - <source>Title:</source> - <translation>Titel:</translation> - </message> - <message> - <source>Username:</source> - <translation>Gebruikersnaam:</translation> + <source>URL:</source> + <translation>URL:</translation> </message> <message> <source>Password:</source> @@ -956,20 +1414,104 @@ Wilt u toch doorgaan met openen?</translation> <translation>Herhalen:</translation> </message> <message> - <source>URL:</source> - <translation>URL:</translation> + <source>Title:</source> + <translation>Titel:</translation> </message> <message> - <source>Expires</source> - <translation>Verloopt</translation> + <source>Notes</source> + <translation>Opmerkingen</translation> </message> <message> <source>Presets</source> <translation>Ingebouwd</translation> </message> <message> - <source>Notes:</source> - <translation>Opmerkingen:</translation> + <source>Toggle the checkbox to reveal the notes section.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username:</source> + <translation>Gebruikersnaam:</translation> + </message> + <message> + <source>Expires</source> + <translation>Verloopt</translation> + </message> +</context> +<context> + <name>EditEntryWidgetSSHAgent</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent after</source> + <translation type="unfinished"/> + </message> + <message> + <source> seconds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fingerprint</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent when database is closed/locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add key to agent when database is opened/unlocked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Comment</source> + <translation type="unfinished"/> + </message> + <message> + <source>Decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy to clipboard</source> + <translation type="unfinished"/> + </message> + <message> + <source>Private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>External file</source> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Attachment</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add to agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove from agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Require user confirmation when this key is used</source> + <translation type="unfinished"/> </message> </context> <context> @@ -992,7 +1534,7 @@ Wilt u toch doorgaan met openen?</translation> </message> <message> <source>Edit group</source> - <translation>Groep wijzigen</translation> + <translation>Bewerk groep</translation> </message> <message> <source>Enable</source> @@ -1040,6 +1582,14 @@ Wilt u toch doorgaan met openen?</translation> </context> <context> <name>EditWidgetIcons</name> + <message> + <source>&Use default icon</source> + <translation>&Gebruik standaardicoon</translation> + </message> + <message> + <source>Use custo&m icon</source> + <translation>Gebruik aangepast icoon</translation> + </message> <message> <source>Add custom icon</source> <translation>Voeg icoon toe</translation> @@ -1048,6 +1598,18 @@ Wilt u toch doorgaan met openen?</translation> <source>Delete custom icon</source> <translation>Verwijder icoon</translation> </message> + <message> + <source>Download favicon</source> + <translation>Favicon downloaden</translation> + </message> + <message> + <source>Unable to fetch favicon.</source> + <translation>Favicon kan niet worden opgehaald.</translation> + </message> + <message> + <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> + <translation type="unfinished"/> + </message> <message> <source>Images</source> <translation>Afbeeldingen</translation> @@ -1060,25 +1622,13 @@ Wilt u toch doorgaan met openen?</translation> <source>Select Image</source> <translation>Kies afbeelding</translation> </message> - <message> - <source>Download favicon</source> - <translation>Favicon downloaden</translation> - </message> - <message> - <source>Unable to fetch favicon.</source> - <translation>Favicon kan niet worden opgehaald.</translation> - </message> <message> <source>Can't read icon</source> <translation>Kan icoon niet lezen</translation> </message> <message> - <source>&Use default icon</source> - <translation>&Gebruik standaardicoon</translation> - </message> - <message> - <source>Use custo&m icon</source> - <translation>Gebruik aangepast icoon</translation> + <source>Custom icon already exists</source> + <translation type="unfinished"/> </message> <message> <source>Confirm Delete</source> @@ -1088,14 +1638,6 @@ Wilt u toch doorgaan met openen?</translation> <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> <translation type="unfinished"/> </message> - <message> - <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation type="unfinished"/> - </message> - <message> - <source>Custom icon already exists</source> - <translation type="unfinished"/> - </message> </context> <context> <name>EditWidgetProperties</name> @@ -1120,9 +1662,93 @@ Wilt u toch doorgaan met openen?</translation> <name>Entry</name> <message> <source> - Clone</source> + <comment>Suffix added to cloned entries</comment> <translation>- Kloon</translation> </message> </context> +<context> + <name>EntryAttachmentsModel</name> + <message> + <source>Name</source> + <translation>Naam</translation> + </message> + <message> + <source>Size</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EntryAttachmentsWidget</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add</source> + <translation>Toevoegen</translation> + </message> + <message> + <source>Remove</source> + <translation>Verwijderen</translation> + </message> + <message> + <source>Open</source> + <translation>Open</translation> + </message> + <message> + <source>Save</source> + <translation>Opslaan</translation> + </message> + <message> + <source>Select files</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <source>Are you sure you want to remove %n attachment(s)?</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Confirm Remove</source> + <translation type="unfinished"/> + </message> + <message> + <source>Save attachments</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to create directory: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Confirm overwrite</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to save attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachment: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open files: +%1</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EntryAttributesModel</name> <message> @@ -1151,6 +1777,11 @@ Wilt u toch doorgaan met openen?</translation> </context> <context> <name>EntryModel</name> + <message> + <source>Ref: </source> + <comment>Reference abbreviation</comment> + <translation type="unfinished"/> + </message> <message> <source>Group</source> <translation>Groep</translation> @@ -1167,11 +1798,6 @@ Wilt u toch doorgaan met openen?</translation> <source>URL</source> <translation>URL</translation> </message> - <message> - <source>Ref: </source> - <comment>Reference abbreviation</comment> - <translation type="unfinished"/> - </message> </context> <context> <name>Group</name> @@ -1180,6 +1806,17 @@ Wilt u toch doorgaan met openen?</translation> <translation>Prullenbak</translation> </message> </context> +<context> + <name>HostInstaller</name> + <message> + <source>KeePassXC: Cannot save file!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot save the native messaging script file.</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>HttpPasswordGeneratorWidget</name> <message> @@ -1242,6 +1879,358 @@ Wilt u toch doorgaan met openen?</translation> <translation type="unfinished"/> </message> </context> +<context> + <name>Kdbx3Reader</name> + <message> + <source>Unable to calculate master key</source> + <translation>Niet mogelijk om hoofdsleutel te berekenen</translation> + </message> + <message> + <source>Unable to issue challenge-response.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>Verkeerde sleutel of corrupte database.</translation> + </message> +</context> +<context> + <name>Kdbx3Writer</name> + <message> + <source>Unable to issue challenge-response.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Niet mogelijk om hoofdsleutel te berekenen</translation> + </message> +</context> +<context> + <name>Kdbx4Reader</name> + <message> + <source>missing database headers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Niet mogelijk om hoofdsleutel te berekenen</translation> + </message> + <message> + <source>Invalid header checksum size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Header SHA256 mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header data length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open buffer for KDF parameters in header</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported key derivation function (KDF) or invalid parameters</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy header fields found in KDBX4 file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header binary size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass variant map version.</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name data</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value data</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Bool entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry type</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map field type size</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Kdbx4Writer</name> + <message> + <source>Invalid symmetric cipher algorithm.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid symmetric cipher IV size.</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Niet mogelijk om hoofdsleutel te berekenen</translation> + </message> + <message> + <source>Failed to serialize KDF parameters variant map</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxReader</name> + <message> + <source>Invalid cipher uuid length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid compression flags length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported compression algorithm</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid master seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform rounds size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid start bytes size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid random stream id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner random stream cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>Geen Keepass-database.</translation> + </message> + <message> + <source>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass 2 database version.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxXmlReader</name> + <message> + <source>XML parsing failure: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>No root group</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing icon uuid or data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing custom data key or value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Multiple group elements</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null group uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableAutoType value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableSearching value</source> + <translation type="unfinished"/> + </message> + <message> + <source>No group uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null DeleteObject uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing DeletedObject uuid or time</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null entry uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element in history entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>No entry uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element with different uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decrypt entry string</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate custom attribute found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry string key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate attachment found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry binary key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-type association window or sequence missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid bool value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid date time value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color rgb part</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid uuid value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decompress binary</source> + <extracomment>Translator meant is a binary data inside an entry</extracomment> + <translation type="unfinished"/> + </message> +</context> <context> <name>KeePass1OpenWidget</name> <message> @@ -1250,7 +2239,7 @@ Wilt u toch doorgaan met openen?</translation> </message> <message> <source>Unable to open the database.</source> - <translation>Niet mogelijk om de database te openen.</translation> + <translation>Het is niet mogelijk om de database te openen.</translation> </message> </context> <context> @@ -1261,7 +2250,7 @@ Wilt u toch doorgaan met openen?</translation> </message> <message> <source>Not a KeePass database.</source> - <translation>Geen Keepass-database</translation> + <translation>Geen Keepass-database.</translation> </message> <message> <source>Unsupported encryption algorithm.</source> @@ -1269,7 +2258,36 @@ Wilt u toch doorgaan met openen?</translation> </message> <message> <source>Unsupported KeePass database version.</source> - <translation>Niet-ondersteunde versie van Keepass-database</translation> + <translation>Niet-ondersteunde versie van Keepass-database.</translation> + </message> + <message> + <source>Unable to read encryption IV</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of groups</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid content hash size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of transform rounds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to construct group tree</source> + <translation type="unfinished"/> </message> <message> <source>Root</source> @@ -1283,57 +2301,104 @@ Wilt u toch doorgaan met openen?</translation> <source>Wrong key or database file is corrupt.</source> <translation>Verkeerde sleutel of corrupte database.</translation> </message> -</context> -<context> - <name>KeePass2Reader</name> <message> - <source>Not a KeePass database.</source> - <translation>Geen Keepass-database.</translation> - </message> - <message> - <source>Unsupported KeePass database version.</source> - <translation>Niet-ondersteunde versie van Keepass-database.</translation> - </message> - <message> - <source>Wrong key or database file is corrupt.</source> - <translation>Verkeerde sleutel of corrupte database.</translation> - </message> - <message> - <source>Unable to calculate master key</source> - <translation>Niet mogelijk om hoofdsleutel te berekenen</translation> - </message> - <message> - <source>Unable to issue challenge-response.</source> + <source>Key transformation failed</source> <translation type="unfinished"/> </message> <message> - <source>The selected file is an old KeePass 1 database (.kdb). - -You can import it by clicking on Database > 'Import KeePass 1 database...'. -This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> - <translation type="unfinished"/> - </message> -</context> -<context> - <name>KeePass2Writer</name> - <message> - <source>Unable to issue challenge-response.</source> + <source>Invalid group field type number</source> <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>Niet mogelijk om hoofdsleutel te berekenen</translation> + <source>Invalid group field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read group field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group access time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group level field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing group id or level</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing entry field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read entry field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry uuid field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field type</source> + <translation type="unfinished"/> </message> </context> <context> <name>Main</name> <message> - <source>Fatal error while testing the cryptographic functions.</source> - <translation>Fatale fout bij het testen van de cryptografische functies.</translation> - </message> - <message> - <source>KeePassXC - Error</source> - <translation>KeePassX - Fout</translation> + <source>Existing single-instance lock file is invalid. Launching new instance.</source> + <translation type="unfinished"/> </message> <message> <source>The lock file could not be created. Single-instance mode disabled.</source> @@ -1344,64 +2409,32 @@ This is a one-way migration. You won't be able to open the imported databas <translation type="unfinished"/> </message> <message> - <source>Existing single-instance lock file is invalid. Launching new instance.</source> - <translation type="unfinished"/> + <source>Fatal error while testing the cryptographic functions.</source> + <translation>Fatale fout bij het testen van de cryptografische functies.</translation> + </message> + <message> + <source>KeePassXC - Error</source> + <translation>KeePassX - Fout</translation> </message> </context> <context> <name>MainWindow</name> <message> - <source>Open database</source> - <translation>Open database</translation> - </message> - <message> - <source>Database settings</source> - <translation>Database-instellingen</translation> - </message> - <message> - <source>Copy username to clipboard</source> - <translation>Kopieer gebruikersnaam naar klembord</translation> - </message> - <message> - <source>Copy password to clipboard</source> - <translation>Kopieer wachtwoord naar klembord</translation> - </message> - <message> - <source>Settings</source> - <translation>Instellingen</translation> - </message> - <message> - <source>Show toolbar</source> - <translation>Werkbalk weergeven</translation> - </message> - <message> - <source>read-only</source> - <translation>alleen-lezen</translation> - </message> - <message> - <source>Toggle window</source> - <translation>Wissel venster</translation> - </message> - <message> - <source>KeePass 2 Database</source> - <translation>KeePass 2 Database</translation> - </message> - <message> - <source>All files</source> - <translation>Alle bestanden</translation> - </message> - <message> - <source>Save repaired database</source> - <translation>Gerepareerde database opslaan</translation> - </message> - <message> - <source>Writing the database failed.</source> - <translation>Opslaan van de database is mislukt.</translation> + <source>&Database</source> + <translation type="unfinished"/> </message> <message> <source>&Recent databases</source> <translation>&Recente databases</translation> </message> + <message> + <source>Import</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Help</source> + <translation type="unfinished"/> + </message> <message> <source>E&ntries</source> <translation>Items</translation> @@ -1410,13 +2443,17 @@ This is a one-way migration. You won't be able to open the imported databas <source>Copy att&ribute to clipboard</source> <translation>Kopieer eigenschap naar klembord</translation> </message> + <message> + <source>Time-based one-time password</source> + <translation type="unfinished"/> + </message> <message> <source>&Groups</source> <translation>&Groepen</translation> </message> <message> - <source>&View</source> - <translation>&Beeld</translation> + <source>&Tools</source> + <translation type="unfinished"/> </message> <message> <source>&Quit</source> @@ -1426,6 +2463,10 @@ This is a one-way migration. You won't be able to open the imported databas <source>&About</source> <translation>&Over</translation> </message> + <message> + <source>&Open database...</source> + <translation type="unfinished"/> + </message> <message> <source>&Save database</source> <translation>&Sla database op</translation> @@ -1466,26 +2507,26 @@ This is a one-way migration. You won't be able to open the imported databas <source>&Delete group</source> <translation>&Verwijder groep</translation> </message> + <message> + <source>Sa&ve database as...</source> + <translation type="unfinished"/> + </message> + <message> + <source>Change &master key...</source> + <translation type="unfinished"/> + </message> <message> <source>&Database settings</source> <translation>&Database-instellingen</translation> </message> + <message> + <source>Database settings</source> + <translation>Database-instellingen</translation> + </message> <message> <source>&Clone entry</source> <translation>&Kloon item</translation> </message> - <message> - <source>Timed one-time password</source> - <translation type="unfinished"/> - </message> - <message> - <source>Copy &TOTP</source> - <translation type="unfinished"/> - </message> - <message> - <source>Show TOTP</source> - <translation type="unfinished"/> - </message> <message> <source>&Find</source> <translation>&Zoeken</translation> @@ -1494,14 +2535,26 @@ This is a one-way migration. You won't be able to open the imported databas <source>Copy &username</source> <translation>Kopieer &gebruikersnaam</translation> </message> + <message> + <source>Copy username to clipboard</source> + <translation>Kopieer gebruikersnaam naar klembord</translation> + </message> <message> <source>Cop&y password</source> <translation>Kopieer wachtwoord</translation> </message> + <message> + <source>Copy password to clipboard</source> + <translation>Kopieer wachtwoord naar klembord</translation> + </message> <message> <source>&Settings</source> <translation>&Instellingen</translation> </message> + <message> + <source>Password Generator</source> + <translation>Wachtwoord generator</translation> + </message> <message> <source>&Perform Auto-Type</source> <translation>&Voer auto-typen uit</translation> @@ -1518,64 +2571,24 @@ This is a one-way migration. You won't be able to open the imported databas <source>&Title</source> <translation>&Titel</translation> </message> + <message> + <source>Copy title to clipboard</source> + <translation type="unfinished"/> + </message> <message> <source>&URL</source> <translation>&URL</translation> </message> + <message> + <source>Copy URL to clipboard</source> + <translation type="unfinished"/> + </message> <message> <source>&Notes</source> <translation>&Opmerkingen</translation> </message> <message> - <source>Password Generator</source> - <translation>Wachtwoord generator</translation> - </message> - <message> - <source>Clear history</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Database</source> - <translation type="unfinished"/> - </message> - <message> - <source>Import</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Tools</source> - <translation type="unfinished"/> - </message> - <message> - <source>Empty recycle bin</source> - <translation type="unfinished"/> - </message> - <message> - <source>Access error for config file %1</source> - <translation type="unfinished"/> - </message> - <message> - <source>Quit KeePassXC</source> - <translation type="unfinished"/> - </message> - <message> - <source>Please touch the button on your YubiKey!</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Help</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Open database...</source> - <translation type="unfinished"/> - </message> - <message> - <source>Sa&ve database as...</source> - <translation type="unfinished"/> - </message> - <message> - <source>Change &master key...</source> + <source>Copy notes to clipboard</source> <translation type="unfinished"/> </message> <message> @@ -1594,10 +2607,169 @@ This is a one-way migration. You won't be able to open the imported databas <source>Re&pair database...</source> <translation type="unfinished"/> </message> + <message> + <source>Show TOTP</source> + <translation type="unfinished"/> + </message> <message> <source>Set up TOTP...</source> <translation type="unfinished"/> </message> + <message> + <source>Copy &TOTP</source> + <translation type="unfinished"/> + </message> + <message> + <source>E&mpty recycle bin</source> + <translation type="unfinished"/> + </message> + <message> + <source>Clear history</source> + <translation type="unfinished"/> + </message> + <message> + <source>Access error for config file %1</source> + <translation type="unfinished"/> + </message> + <message> + <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> + <translation type="unfinished"/> + </message> + <message> + <source>read-only</source> + <translation>alleen-lezen</translation> + </message> + <message> + <source>Settings</source> + <translation>Instellingen</translation> + </message> + <message> + <source>Toggle window</source> + <translation>Wissel venster</translation> + </message> + <message> + <source>Quit KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>KeePass 2-database</translation> + </message> + <message> + <source>All files</source> + <translation>Alle bestanden</translation> + </message> + <message> + <source>Open database</source> + <translation>Database openen</translation> + </message> + <message> + <source>Save repaired database</source> + <translation>Gerepareerde database opslaan</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>Het opslaan van de database is mislukt.</translation> + </message> + <message> + <source>Please touch the button on your YubiKey!</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>OpenSSHKey</name> + <message> + <source>Invalid key file, expecting an OpenSSH key</source> + <translation type="unfinished"/> + </message> + <message> + <source>PEM boundary mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>This is not an OpenSSH key, only modern keys are supported</source> + <translation type="unfinished"/> + </message> + <message> + <source>Base64 decoding failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file way too small.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file magic header id invalid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Found zero keys</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to read public key.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Corrupted key file, reading private key failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>No private key payload to decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Trying to run KDF without cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Passphrase is required to decrypt this key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key derivation failed, key file corrupted?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Decryption failed, wrong passphrase?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write public key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write private key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing private key</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OptionDialog</name> @@ -1605,22 +2777,63 @@ This is a one-way migration. You won't be able to open the imported databas <source>Dialog</source> <translation>Dialoog</translation> </message> + <message> + <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable KeePassHTTP server</source> + <translation type="unfinished"/> + </message> <message> <source>General</source> <translation>Algemeen</translation> </message> <message> <source>Sh&ow a notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> <translation>Toon een notificatie wanneer inloggegevens worden aangevraagd</translation> </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return only best matching entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Verzoek om database te ontgrendelen als deze vergrendeld is</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Match URL schemes</source> + <translation type="unfinished"/> + </message> <message> <source>Sort matching entries by &username</source> <translation>Sorteer gegeven items op $gebruikersnaam</translation> </message> + <message> + <source>Sort &matching entries by title</source> + <translation>Sorteer &overeenkomende items op titel</translation> + </message> + <message> + <source>R&emove all shared encryption keys from active database</source> + <translation>Verwijder alle gedeelde encryptiesleutels uit de actieve database</translation> + </message> <message> <source>Re&move all stored permissions from entries in active database</source> <translation>Verwijder alle opgeslagen permissies van items uit de actieve database</translation> </message> + <message> + <source>Password Generator</source> + <translation>Wachtwoord generator</translation> + </message> <message> <source>Advanced</source> <translation>Geavanceerd</translation> @@ -1633,10 +2846,22 @@ This is a one-way migration. You won't be able to open the imported databas <source>Always allow &updating entries</source> <translation>Altijd &bewerken toestaan op items</translation> </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation type="unfinished"/> + </message> <message> <source>Searc&h in all opened databases for matching entries</source> <translation>Zoek in alle geopende databases naar overeenkomende items</translation> </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>Het automatisch aanmaken of wijzigen van tekenreeks velden wordt niet ondersteund.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>&Geef geadvanceerde tekenreeks velden terug die met "KH: " beginnen.</translation> + </message> <message> <source>HTTP Port:</source> <translation>HTTP-poort:</translation> @@ -1645,18 +2870,18 @@ This is a one-way migration. You won't be able to open the imported databas <source>Default port: 19455</source> <translation>Standaard poort: 19455</translation> </message> - <message> - <source>Re&quest to unlock the database if it is locked</source> - <translation>Verzoek om database te ontgrendelen als deze vergrendeld is</translation> - </message> - <message> - <source>Sort &matching entries by title</source> - <translation>Sorteer &overeenkomende items op titel</translation> - </message> <message> <source>KeePassXC will listen to this port on 127.0.0.1</source> <translation>KeePassXC zal op deze poort op 127.0.0.1 luisteren</translation> </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> + <translation type="unfinished"/> + </message> <message> <source>Cannot bind to privileged ports</source> <translation>Kan niet binden op bevoorrechte poorten</translation> @@ -1667,62 +2892,30 @@ Using default port 19455.</source> <translation>Kan niet binden naar bevoorrechte poorten onder 1024! Standaardpoort 19455 wordt gebruikt.</translation> </message> - <message> - <source>R&emove all shared encryption keys from active database</source> - <translation>Verwijder alle gedeelde encryptiesleutels uit de actieve database</translation> - </message> - <message> - <source>&Return advanced string fields which start with "KPH: "</source> - <translation>&Geef geadvanceerde tekenreeks velden terug die met "KH: " beginnen.</translation> - </message> - <message> - <source>Automatically creating or updating string fields is not supported.</source> - <translation>Het automatisch aanmaken of wijzigen van tekenreeks velden wordt niet ondersteund.</translation> - </message> - <message> - <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> - <translation type="unfinished"/> - </message> - <message> - <source>Enable KeePassHTTP server</source> - <translation type="unfinished"/> - </message> - <message> - <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Return only best matching entries</source> - <translation type="unfinished"/> - </message> - <message> - <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Match URL schemes</source> - <translation type="unfinished"/> - </message> - <message> - <source>Password Generator</source> - <translation>Wachtwoord generator</translation> - </message> - <message> - <source>Only the selected database has to be connected with a client.</source> - <translation type="unfinished"/> - </message> - <message> - <source>The following options can be dangerous! -Change them only if you know what you are doing.</source> - <translation type="unfinished"/> - </message> </context> <context> <name>PasswordGeneratorWidget</name> + <message> + <source>%p%</source> + <translation>%p%</translation> + </message> <message> <source>Password:</source> <translation>Wachtwoord:</translation> </message> + <message> + <source>strength</source> + <comment>Password strength</comment> + <translation>sterkte</translation> + </message> + <message> + <source>entropy</source> + <translation>entropie</translation> + </message> + <message> + <source>Password</source> + <translation>Wachtwoord</translation> + </message> <message> <source>Character Types</source> <translation>Tekens</translation> @@ -1743,38 +2936,50 @@ Change them only if you know what you are doing.</source> <source>Special Characters</source> <translation>Speciale tekens</translation> </message> + <message> + <source>Extended ASCII</source> + <translation type="unfinished"/> + </message> <message> <source>Exclude look-alike characters</source> - <translation>Geen op elkaar lijkende tekens</translation> - </message> - <message> - <source>Accept</source> - <translation>Accepteren</translation> - </message> - <message> - <source>%p%</source> - <translation>%p%</translation> - </message> - <message> - <source>strength</source> - <translation>sterkte</translation> - </message> - <message> - <source>entropy</source> - <translation>entropie</translation> - </message> - <message> - <source>&Length:</source> - <translation>&Lengte:</translation> + <translation>Sluit op elkaar lijkende tekens uit</translation> </message> <message> <source>Pick characters from every group</source> <translation>Zorg dat het wachtwoord tekens uit iedere groep bevat</translation> </message> + <message> + <source>&Length:</source> + <translation>&Lengte:</translation> + </message> + <message> + <source>Passphrase</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wordlist:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Word Count:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Word Separator:</source> + <translation type="unfinished"/> + </message> <message> <source>Generate</source> <translation>Genereren</translation> </message> + <message> + <source>Copy</source> + <translation type="unfinished"/> + </message> + <message> + <source>Accept</source> + <translation>Accepteren</translation> + </message> <message> <source>Close</source> <translation>Sluiten</translation> @@ -1793,51 +2998,270 @@ Change them only if you know what you are doing.</source> </message> <message> <source>Poor</source> + <comment>Password quality</comment> <translation>Slecht</translation> </message> <message> <source>Weak</source> + <comment>Password quality</comment> <translation>Zwak</translation> </message> <message> <source>Good</source> + <comment>Password quality</comment> <translation>Goed</translation> </message> <message> <source>Excellent</source> + <comment>Password quality</comment> <translation>Uitstekend</translation> </message> - <message> - <source>Password</source> - <translation>Wachtwoord</translation> - </message> - <message> - <source>Extended ASCII</source> - <translation type="unfinished"/> - </message> - <message> - <source>Passphrase</source> - <translation type="unfinished"/> - </message> - <message> - <source>Wordlist:</source> - <translation type="unfinished"/> - </message> - <message> - <source>Word Count:</source> - <translation type="unfinished"/> - </message> - <message> - <source>Word Separator:</source> - <translation type="unfinished"/> - </message> - <message> - <source>Copy</source> - <translation type="unfinished"/> - </message> </context> <context> <name>QObject</name> + <message> + <source>Database not opened</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database hash not available</source> + <translation type="unfinished"/> + </message> + <message> + <source>Client public key not received</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot decrypt message</source> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout or cannot connect to KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>Action cancelled or denied</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC association failed, try again</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key change was not successful</source> + <translation type="unfinished"/> + </message> + <message> + <source>Encryption key is not recognized</source> + <translation type="unfinished"/> + </message> + <message> + <source>No saved databases found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect action</source> + <translation type="unfinished"/> + </message> + <message> + <source>Empty message received</source> + <translation type="unfinished"/> + </message> + <message> + <source>No URL provided</source> + <translation type="unfinished"/> + </message> + <message> + <source>No logins found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown error</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add a new entry to a database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file of the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>path</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>username</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Prompt for the entry's password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a password for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length for the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to add.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy an entry's password to the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to clip.</source> + <comment>clip = copy to clipboard</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout in seconds before clearing the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Edit an entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Title for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>title</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to edit.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Estimate the entropy of a password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password for which to estimate the entropy.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Perform advanced analysis on the password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Extract and print the content of a database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database to extract.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Insert password to unlock %1: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to load key file %1 : %2</source> + <translation type="unfinished"/> + </message> + <message> + <source>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source> + +Available commands: +</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the command to execute.</source> + <translation type="unfinished"/> + </message> + <message> + <source>List database entries.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the group to list. Default is /</source> + <translation type="unfinished"/> + </message> + <message> + <source>Find entries quickly.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Search term.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Merge two databases.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database to merge into.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database to merge from.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use the same credentials for both database files.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file of the database to merge from.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show an entry's information.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> + <translation type="unfinished"/> + </message> + <message> + <source>attribute</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the entry to show.</source> + <translation type="unfinished"/> + </message> <message> <source>NULL device</source> <translation type="unfinished"/> @@ -1860,7 +3284,27 @@ Change them only if you know what you are doing.</source> <translation type="unfinished"/> </message> <message> - <source>INTERNAL - unget lower bound exceeded</source> + <source>AES: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Twofish: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>ChaCha20: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Argon2 (KDBX 4 – recommended)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 4)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 3.1)</source> <translation type="unfinished"/> </message> <message> @@ -1879,14 +3323,22 @@ Change them only if you know what you are doing.</source> <source>Password</source> <translation>Wachtwoord</translation> </message> - <message> - <source>URL</source> - <translation>URL</translation> - </message> <message> <source>Notes</source> <translation>Opmerkingen</translation> </message> + <message> + <source>Last Modified</source> + <translation type="unfinished"/> + </message> + <message> + <source>Created</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy Browser Integration</source> + <translation type="unfinished"/> + </message> <message> <source>Browser Integration</source> <translation type="unfinished"/> @@ -1903,6 +3355,10 @@ Change them only if you know what you are doing.</source> <source>Passive</source> <translation type="unfinished"/> </message> + <message> + <source>SSH Agent</source> + <translation type="unfinished"/> + </message> </context> <context> <name>QtIOCompressor</name> @@ -1941,8 +3397,8 @@ Change them only if you know what you are doing.</source> <context> <name>SearchWidget</name> <message> - <source>Case Sensitive</source> - <translation>Hoofdlettergevoelig</translation> + <source>Search...</source> + <translation type="unfinished"/> </message> <message> <source>Search</source> @@ -1953,8 +3409,8 @@ Change them only if you know what you are doing.</source> <translation>Wissen</translation> </message> <message> - <source>Search...</source> - <translation type="unfinished"/> + <source>Case Sensitive</source> + <translation>Hoofdlettergevoelig</translation> </message> <message> <source>Limit search to selected group</source> @@ -1963,50 +3419,6 @@ Change them only if you know what you are doing.</source> </context> <context> <name>Service</name> - <message> - <source>A shared encryption-key with the name "%1" already exists. -Do you want to overwrite it?</source> - <translation>Een gedeelde encryptiesleutel met de naam "%1" bestaat al. -Wil je deze overschrjiven?</translation> - </message> - <message> - <source>Do you want to update the information in %1 - %2?</source> - <translation>Wil je de gegevens in %1 - %2 bijwerken?</translation> - </message> - <message> - <source>The active database is locked! -Please unlock the selected database or choose another one which is unlocked.</source> - <translation>De actieve database is vergrendeld! -Ontgrendel de geselecteerde database of kies een ontgrendelde database.</translation> - </message> - <message> - <source>Successfully removed %1 encryption-%2 from KeePassX/Http Settings.</source> - <translation>%1 encryptie%2 succesvol verwijderd uit de KeePassX/Http instellingen.</translation> - </message> - <message> - <source>No shared encryption-keys found in KeePassHttp Settings.</source> - <translation>Geen gedeelde encryptiesleutels gevonen in de KeePassHttp instellingen.</translation> - </message> - <message> - <source>The active database does not contain an entry of KeePassHttp Settings.</source> - <translation>De actieve database bevat geen KeePassHttp instellingen.</translation> - </message> - <message> - <source>Removing stored permissions...</source> - <translation>Opgeslagen permissies verwijderen...</translation> - </message> - <message> - <source>Abort</source> - <translation>Afbreken</translation> - </message> - <message> - <source>Successfully removed permissions from %1 %2.</source> - <translation>De permissies zijn met succes verwijderd uit %1 %2.</translation> - </message> - <message> - <source>The active database does not contain an entry with permissions.</source> - <translation>De actieve database bevat geen items met permissies.</translation> - </message> <message> <source>KeePassXC: New key association request</source> <translation>KeePassXC: Nieuw verzoek voor sleutel associatie</translation> @@ -2022,34 +3434,78 @@ Geef het een unieke identificerende naam en accepteer de associate wanneer je de <source>KeePassXC: Overwrite existing key?</source> <translation>KeePassXC: Huidige sleutel overschrijven?</translation> </message> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>Een gedeelde encryptiesleutel met de naam "%1" bestaat al. +Wil je deze overschrjiven?</translation> + </message> <message> <source>KeePassXC: Update Entry</source> <translation>KeePassXC: Item bijwerken</translation> </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Wil je de gegevens in %1 - %2 bijwerken?</translation> + </message> <message> <source>KeePassXC: Database locked!</source> <translation>KeePassXC: Database vergrendeld!</translation> </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>De actieve database is vergrendeld! +Ontgrendel de geselecteerde database of kies een ontgrendelde database.</translation> + </message> <message> <source>KeePassXC: Removed keys from database</source> <translation>KeePassXC: Sleutels uit database verwijderd</translation> </message> + <message numerus="yes"> + <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No keys found</source> <translation>KeePassXC: Geen sleutels gevonden</translation> </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation>Geen gedeelde encryptiesleutels gevonen in de KeePassHttp instellingen.</translation> + </message> <message> <source>KeePassXC: Settings not available!</source> <translation>KeePassXC: Instellingen niet beschikbaar!</translation> </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation>De actieve database bevat geen KeePassHttp instellingen.</translation> + </message> + <message> + <source>Removing stored permissions...</source> + <translation>Opgeslagen permissies verwijderen...</translation> + </message> + <message> + <source>Abort</source> + <translation>Afbreken</translation> + </message> <message> <source>KeePassXC: Removed permissions</source> <translation>KeePassXC: Permissies verwijderd</translation> </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entries.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No entry with permissions found!</source> <translation>KeePassXC: Geen item met permissies gevonden!</translation> </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>De actieve database bevat geen items met permissies.</translation> + </message> </context> <context> <name>SettingsWidget</name> @@ -2072,10 +3528,26 @@ Geef het een unieke identificerende naam en accepteer de associate wanneer je de </context> <context> <name>SettingsWidgetGeneral</name> + <message> + <source>Basic Settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Start only a single instance of KeePassXC</source> + <translation type="unfinished"/> + </message> <message> <source>Remember last databases</source> <translation>Onthoud laatste databases</translation> </message> + <message> + <source>Remember last key files and security dongles</source> + <translation type="unfinished"/> + </message> + <message> + <source>Load previous databases on startup</source> + <translation>Open vorige databases bij starten</translation> + </message> <message> <source>Automatically save on exit</source> <translation>Automatisch opslaan bij afsluiten</translation> @@ -2084,21 +3556,29 @@ Geef het een unieke identificerende naam en accepteer de associate wanneer je de <source>Automatically save after every change</source> <translation>Automatisch opslaan na iedere wijziging</translation> </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation>Herlaad database automatisch als deze van buitenaf is gewijzigd</translation> + </message> <message> <source>Minimize when copying to clipboard</source> <translation>Minimaliseer bij kopiëren naar klembord</translation> </message> + <message> + <source>Minimize window at application startup</source> + <translation>Scherm minimaliseren bij het opstarten</translation> + </message> <message> <source>Use group icon on entry creation</source> <translation>Gebruik icoon van de groep voor nieuwe elementen</translation> </message> <message> - <source>Global Auto-Type shortcut</source> - <translation>Globale sneltoets voor auto-typen</translation> + <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> + <translation type="unfinished"/> </message> <message> - <source>Language</source> - <translation>Taal</translation> + <source>Hide the Details view</source> + <translation type="unfinished"/> </message> <message> <source>Show a system tray icon</source> @@ -2108,67 +3588,61 @@ Geef het een unieke identificerende naam en accepteer de associate wanneer je de <source>Hide window to system tray when minimized</source> <translation>Bij minimaliseren enkel icoon in systray tonen</translation> </message> - <message> - <source>Load previous databases on startup</source> - <translation>Open vorige databases bij starten</translation> - </message> - <message> - <source>Automatically reload the database when modified externally</source> - <translation>Herlaad database automatisch als deze van buitenaf is gewijzigd</translation> - </message> <message> <source>Hide window to system tray instead of app exit</source> <translation>Bij sluiten icoon in systray tonen in plaats van volledig afsluiten</translation> </message> <message> - <source>Minimize window at application startup</source> - <translation>Scherm minimaliseren bij het opstarten</translation> - </message> - <message> - <source>Basic Settings</source> + <source>Dark system tray icon</source> <translation type="unfinished"/> </message> <message> - <source>Remember last key files and security dongles</source> - <translation type="unfinished"/> - </message> - <message> - <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> - <translation type="unfinished"/> + <source>Language</source> + <translation>Taal</translation> </message> <message> <source>Auto-Type</source> <translation>Auto-typen - KeePassX</translation> </message> <message> - <source>Use entry title and URL to match windows for global Auto-Type</source> + <source>Use entry title to match windows for global Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use entry URL to match windows for global Auto-Type</source> <translation type="unfinished"/> </message> <message> <source>Always ask before performing Auto-Type</source> <translation type="unfinished"/> </message> + <message> + <source>Global Auto-Type shortcut</source> + <translation>Globale sneltoets voor auto-typen</translation> + </message> <message> <source>Auto-Type delay</source> <translation type="unfinished"/> </message> <message> <source> ms</source> - <translation type="unfinished"/> - </message> - <message> - <source>Start only a single instance of KeePassXC</source> + <comment>Milliseconds</comment> <translation type="unfinished"/> </message> </context> <context> <name>SettingsWidgetSecurity</name> + <message> + <source>Timeouts</source> + <translation type="unfinished"/> + </message> <message> <source>Clear clipboard after</source> <translation>Leeg klembord na</translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation>sec</translation> </message> <message> @@ -2176,8 +3650,12 @@ Geef het een unieke identificerende naam en accepteer de associate wanneer je de <translation>Vergrendel databases na inactiviteit van</translation> </message> <message> - <source>Show passwords in cleartext by default</source> - <translation>Laat wachtwoorden standaard zien</translation> + <source>Convenience</source> + <translation type="unfinished"/> + </message> + <message> + <source>Lock databases when session is locked or lid is closed</source> + <translation type="unfinished"/> </message> <message> <source>Lock databases after minimizing the window</source> @@ -2188,15 +3666,15 @@ Geef het een unieke identificerende naam en accepteer de associate wanneer je de <translation>Herhalen van wachtwoord niet vereisen als deze zichtbaar is</translation> </message> <message> - <source>Timeouts</source> + <source>Show passwords in cleartext by default</source> + <translation>Laat wachtwoorden standaard zien</translation> + </message> + <message> + <source>Hide passwords in the preview panel</source> <translation type="unfinished"/> </message> <message> - <source>Convenience</source> - <translation type="unfinished"/> - </message> - <message> - <source>Lock databases when session is locked or lid is closed</source> + <source>Hide entry notes by default</source> <translation type="unfinished"/> </message> <message> @@ -2218,6 +3696,14 @@ Geef het een unieke identificerende naam en accepteer de associate wanneer je de <source>Key:</source> <translation type="unfinished"/> </message> + <message> + <source>Default RFC 6238 token settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Steam token settings</source> + <translation type="unfinished"/> + </message> <message> <source>Use custom settings</source> <translation type="unfinished"/> @@ -2244,6 +3730,7 @@ Geef het een unieke identificerende naam en accepteer de associate wanneer je de </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation>sec</translation> </message> </context> @@ -2310,6 +3797,26 @@ Geef het een unieke identificerende naam en accepteer de associate wanneer je de </context> <context> <name>main</name> + <message> + <source>Remove an entry from the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to remove.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation>KeepassX - multi-platform wachtwoordbeheerder</translation> + </message> + <message> + <source>filenames of the password databases to open (*.kdbx)</source> + <translation>bestandsnamen van de te openen wachtwoorddatabases (*.kdbx)</translation> + </message> <message> <source>path to a custom config file</source> <translation>pad naar een configuratiebestand</translation> @@ -2318,80 +3825,12 @@ Geef het een unieke identificerende naam en accepteer de associate wanneer je de <source>key file of the database</source> <translation>sleutelbestand van de database</translation> </message> - <message> - <source>KeePassXC - cross-platform password manager</source> - <translation>KeepassX - multi-platform wachtwoordbeheerder</translation> - </message> <message> <source>read password of the database from stdin</source> <translation>lees wachtwoord van de database uit stdin</translation> </message> <message> - <source>filenames of the password databases to open (*.kdbx)</source> - <translation>bestandsnamen van de te openen wachtwoorddatabases (*.kdbx)</translation> - </message> - <message> - <source>Copy a password to the clipboard</source> - <translation type="unfinished"/> - </message> - <message> - <source>Path of the database.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Use a GUI prompt unlocking the database.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Name of the entry to clip.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Extract and print the content of a database.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Path of the database to extract.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Name of the command to execute.</source> - <translation type="unfinished"/> - </message> - <message> - <source>List database entries.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Path of the group to list. Default is /</source> - <translation type="unfinished"/> - </message> - <message> - <source>Print the UUIDs of the entries and groups.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Merge two databases.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Path of the database to merge into.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Path of the database to merge from.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Use the same password for both database files.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Show a password.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Name of the entry to show.</source> + <source>Parent window handle</source> <translation type="unfinished"/> </message> </context> diff --git a/share/translations/keepassx_pl.ts b/share/translations/keepassx_pl.ts index 66574202f..9abb6eb88 100644 --- a/share/translations/keepassx_pl.ts +++ b/share/translations/keepassx_pl.ts @@ -9,14 +9,34 @@ <source>About</source> <translation>O programie</translation> </message> + <message> + <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> + <translation>Zgłoś błędy na: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> + </message> + <message> + <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>KeePassXC jest dystrybuowany zgodnie z warunkami licencji GNU General Public License (GPL) w wersji 2 lub (opcjonalnie) w wersji 3.</translation> + </message> + <message> + <source>Project Maintainers:</source> + <translation>Opiekunowie projektu:</translation> + </message> <message> <source>Contributors</source> <translation>Współtwórcy</translation> </message> + <message> + <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Zobacz wkłady na GitHubie</a></translation> + </message> <message> <source>Debug Info</source> <translation>Informacje debugowania</translation> </message> + <message> + <source>Include the following information whenever you report a bug:</source> + <translation>Uwzględnij następujące informacje, gdy zgłaszasz błąd:</translation> + </message> <message> <source>Copy to clipboard</source> <translation>Skopiuj do schowka</translation> @@ -31,6 +51,10 @@ <source>Revision: %1</source> <translation>Rewizja: %1</translation> </message> + <message> + <source>Distribution: %1</source> + <translation>Dystrybucja: %1</translation> + </message> <message> <source>Libraries:</source> <translation>Biblioteki:</translation> @@ -47,33 +71,13 @@ Jądro: %3 %4</translation> <source>Enabled extensions:</source> <translation>Włączone rozszerzenia:</translation> </message> - <message> - <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> - <translation>Zgłoś błędy na: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> - </message> - <message> - <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassXC jest dystrybuowany zgodnie z warunkami licencji GNU General Public License (GPL) w wersji 2 lub (opcjonalnie) w wersji 3.</translation> - </message> - <message> - <source>Project Maintainers:</source> - <translation>Opiekunowie projektu:</translation> - </message> - <message> - <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Zobacz wkłady na GitHubie</a></translation> - </message> - <message> - <source>Include the following information whenever you report a bug:</source> - <translation>Uwzględnij następujące informacje, gdy zgłaszasz błąd:</translation> - </message> - <message> - <source>Distribution: %1</source> - <translation>Dystrybucja: %1</translation> - </message> </context> <context> <name>AccessControlDialog</name> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>Potwierdź dostęp KeePassXC HTTP</translation> + </message> <message> <source>Remember this decision</source> <translation>Zapamiętaj tę decyzję</translation> @@ -92,9 +96,12 @@ Please select whether you want to allow access.</source> <translation>%1 zażądał dostępu do haseł dla następujących element(ów). Wybierz, czy chcesz zezwolić na dostęp.</translation> </message> +</context> +<context> + <name>AgentSettingsWidget</name> <message> - <source>KeePassXC HTTP Confirm Access</source> - <translation>Potwierdź dostęp KeePassXC HTTP</translation> + <source>Enable SSH Agent (requires restart)</source> + <translation>Włącz agenta SSH (wymaga ponownego uruchomienia)</translation> </message> </context> <context> @@ -107,6 +114,26 @@ Wybierz, czy chcesz zezwolić na dostęp.</translation> <source>Auto-Type - KeePassXC</source> <translation>Auto-uzupełnianie - KeePassXC</translation> </message> + <message> + <source>Auto-Type</source> + <translation>Auto-uzupełnianie</translation> + </message> + <message> + <source>The Syntax of your Auto-Type statement is incorrect!</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> </context> <context> <name>AutoTypeAssociationsModel</name> @@ -125,13 +152,290 @@ Wybierz, czy chcesz zezwolić na dostęp.</translation> </context> <context> <name>AutoTypeSelectDialog</name> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>Auto-uzupełnianie - KeePassXC</translation> + </message> <message> <source>Select entry to Auto-Type:</source> <translation>Wybierz wpis do auto-uzupełniania:</translation> </message> +</context> +<context> + <name>BrowserAccessControlDialog</name> <message> - <source>Auto-Type - KeePassXC</source> - <translation>Auto-uzupełnianie - KeePassXC</translation> + <source>KeePassXC-Browser Confirm Access</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remember this decision</source> + <translation>Zapamiętaj tę decyzję</translation> + </message> + <message> + <source>Allow</source> + <translation>Zezwól</translation> + </message> + <message> + <source>Deny</source> + <translation>Odmów</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 zażądał dostępu do haseł dla następujących element(ów). +Wybierz, czy chcesz zezwolić na dostęp.</translation> + </message> +</context> +<context> + <name>BrowserOptionDialog</name> + <message> + <source>Dialog</source> + <translation>Dialog</translation> + </message> + <message> + <source>This is required for accessing your databases with KeePassXC-Browser</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable KeepassXC browser integration</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>Ogólne</translation> + </message> + <message> + <source>Enable integration for these browsers:</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Google Chrome</source> + <translation>&Google Chrome</translation> + </message> + <message> + <source>&Firefox</source> + <translation>&Firefox</translation> + </message> + <message> + <source>&Chromium</source> + <translation>&Chromium</translation> + </message> + <message> + <source>&Vivaldi</source> + <translation>&Vivaldi</translation> + </message> + <message> + <source>Show a &notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Żąda&j odblokowania bazy danych, jeżeli jest zablokowana</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Match URL scheme (e.g., https://...)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>Zwracaj tylko najlepsze dopasowania wpisów dla URL zamiast wszystkich wpisów całej domeny.</translation> + </message> + <message> + <source>&Return only best-matching credentials</source> + <translation type="unfinished"/> + </message> + <message> + <source>Sort &matching credentials by title</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Sort matching credentials by &username</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>&Disconnect all browsers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Forget all remembered &permissions</source> + <translation type="unfinished"/> + </message> + <message> + <source>Advanced</source> + <translation>Zaawansowane</translation> + </message> + <message> + <source>Never &ask before accessing credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Never ask before &updating credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>Tylko wybrana baza danych musi być podłączona do klienta.</translation> + </message> + <message> + <source>Searc&h in all opened databases for matching credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>Automatyczne tworzenie albo aktualizowanie pól ciągów znaków nie jest obsługiwane.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>&Zwracaj zaawansowane pola ciągów znaków, które zaczynają się od "KPH: "</translation> + </message> + <message> + <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Update &native messaging manifest files at startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Support a proxy application between KeePassXC and browser extension.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &proxy application between KeePassXC and browser extension</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a custom proxy location if you installed a proxy manually.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &custom proxy location</source> + <comment>Meant is the proxy for KeePassXC-Browser</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Przeglądaj...</translation> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*.exe);;All Files (*.*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select custom proxy location</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>BrowserService</name> + <message> + <source>KeePassXC: New key association request</source> + <translation>KeePassXC: Nowe żądanie skojarzenia klucza</translation> + </message> + <message> + <source>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Save and allow access</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: Nadpisać istniejący klucz?</translation> + </message> + <message> + <source>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: Aktualizacja wpisu</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Czy chcesz uaktualnić informację w %1 - %2?</translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: Baza danych zablokowana!</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>Aktywna baza danych jest zablokowana! +Proszę odblokować wybraną bazę albo wybrać inną, która jest odblokowana.</translation> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: Ustawienia niedostępne!</translation> + </message> + <message> + <source>The active database does not contain a settings entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: Nie znaleziono kluczy</translation> + </message> + <message> + <source>No shared encryption keys found in KeePassXC Settings.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: Usunięto klucze z bazy danych</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Removing stored permissions…</source> + <translation type="unfinished"/> + </message> + <message> + <source>Abort</source> + <translation>Zaniechaj</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: Usunięto uprawnienia</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entry(s).</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation>KeePassXC: Nie znaleziono wpisu z uprawnieniami!</translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>Aktywna baza danych nie zawiera wpisu z uprawnieniami.</translation> </message> </context> <context> @@ -148,6 +452,10 @@ Wybierz, czy chcesz zezwolić na dostęp.</translation> <source>Repeat password:</source> <translation>Wprowadź ponownie hasło:</translation> </message> + <message> + <source>&Key file</source> + <translation>&Plik klucza</translation> + </message> <message> <source>Browse</source> <translation>Przeglądaj</translation> @@ -156,6 +464,14 @@ Wybierz, czy chcesz zezwolić na dostęp.</translation> <source>Create</source> <translation>Stwórz</translation> </message> + <message> + <source>Cha&llenge Response</source> + <translation>&Wyzwanie-odpowiedź</translation> + </message> + <message> + <source>Refresh</source> + <translation>Odśwież</translation> + </message> <message> <source>Key files</source> <translation>Pliki kluczy</translation> @@ -176,6 +492,10 @@ Wybierz, czy chcesz zezwolić na dostęp.</translation> <source>Select a key file</source> <translation>Wybierz plik z kluczem</translation> </message> + <message> + <source>Empty password</source> + <translation>Puste hasło</translation> + </message> <message> <source>Do you really want to use an empty string as password?</source> <translation>Czy na pewno chcesz używać pustego ciągu jako hasła?</translation> @@ -191,20 +511,15 @@ Wybierz, czy chcesz zezwolić na dostęp.</translation> %2</translation> </message> <message> - <source>&Key file</source> - <translation>&Plik klucza</translation> + <source>Legacy key file format</source> + <translation type="unfinished"/> </message> <message> - <source>Cha&llenge Response</source> - <translation>&Wyzwanie-odpowiedź</translation> - </message> - <message> - <source>Refresh</source> - <translation>Odśwież</translation> - </message> - <message> - <source>Empty password</source> - <translation>Puste hasło</translation> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -217,6 +532,10 @@ Wybierz, czy chcesz zezwolić na dostęp.</translation> <source>Clone Options</source> <translation>Opcje klonowania</translation> </message> + <message> + <source>Append ' - Clone' to title</source> + <translation>Dodaj ' - Klon' do nazwy</translation> + </message> <message> <source>Replace username and password with references</source> <translation>Wymień nazwę użytkownika i hasło z odniesieniami</translation> @@ -225,10 +544,6 @@ Wybierz, czy chcesz zezwolić na dostęp.</translation> <source>Copy history</source> <translation>Skopiuj historię</translation> </message> - <message> - <source>Append ' - Clone' to title</source> - <translation>Dodaj ' - Klon' do nazwy</translation> - </message> </context> <context> <name>CsvImportWidget</name> @@ -325,10 +640,6 @@ Wybierz, czy chcesz zezwolić na dostęp.</translation> </context> <context> <name>CsvImportWizard</name> - <message> - <source>Import CSV file</source> - <translation>Importuj plik CSV</translation> - </message> <message> <source>Error</source> <translation>Błąd</translation> @@ -340,17 +651,17 @@ Wybierz, czy chcesz zezwolić na dostęp.</translation> </context> <context> <name>CsvParserModel</name> - <message> - <source> byte, </source> - <translation> bajt, </translation> + <message numerus="yes"> + <source>%n byte(s), </source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> </message> - <message> - <source> rows, </source> - <translation> rzędy, </translation> + <message numerus="yes"> + <source>%n row(s), </source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> </message> - <message> - <source> columns</source> - <translation> kolumny</translation> + <message numerus="yes"> + <source>%n column(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> </message> </context> <context> @@ -371,6 +682,14 @@ Wybierz, czy chcesz zezwolić na dostęp.</translation> <source>Browse</source> <translation>Przeglądaj</translation> </message> + <message> + <source>Refresh</source> + <translation>Odśwież</translation> + </message> + <message> + <source>Challenge Response:</source> + <translation>Wyzwanie-odpowiedź:</translation> + </message> <message> <source>Unable to open the database.</source> <translation>Nie można otworzyć bazy danych.</translation> @@ -379,6 +698,21 @@ Wybierz, czy chcesz zezwolić na dostęp.</translation> <source>Can't open key file</source> <translation>Nie mogę otworzyć pliku z kluczem</translation> </message> + <message> + <source>Legacy key file format</source> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't show this warning again</source> + <translation type="unfinished"/> + </message> <message> <source>All files</source> <translation>Wszystkie pliki</translation> @@ -391,14 +725,6 @@ Wybierz, czy chcesz zezwolić na dostęp.</translation> <source>Select key file</source> <translation>Wybierz plik z kluczem</translation> </message> - <message> - <source>Refresh</source> - <translation>Odśwież</translation> - </message> - <message> - <source>Challenge Response:</source> - <translation>Wyzwanie-odpowiedź:</translation> - </message> </context> <context> <name>DatabaseRepairWidget</name> @@ -414,14 +740,14 @@ Wybierz, czy chcesz zezwolić na dostęp.</translation> <source>Can't open key file</source> <translation>Nie mogę otworzyć pliku z kluczem</translation> </message> - <message> - <source>Database opened fine. Nothing to do.</source> - <translation>Pomyślnie otworzono bazę danych. Nic do zrobienia.</translation> - </message> <message> <source>Unable to open the database.</source> <translation>Nie można otworzyć bazy danych.</translation> </message> + <message> + <source>Database opened fine. Nothing to do.</source> + <translation>Pomyślnie otworzono bazę danych. Nic do zrobienia.</translation> + </message> <message> <source>Success</source> <translation>Sukces</translation> @@ -440,40 +766,57 @@ Możesz teraz ją już zapisać.</translation> <context> <name>DatabaseSettingsWidget</name> <message> - <source>Database name:</source> - <translation>Nazwa bazy danych:</translation> + <source>General</source> + <translation>Ogólne</translation> </message> <message> - <source>Database description:</source> - <translation>Opis bazy danych:</translation> + <source>Encryption</source> + <translation>Szyfrowanie</translation> </message> <message> - <source>Transform rounds:</source> - <translation>Liczba rund szyfrowania:</translation> + <source>Number of rounds too high</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> </message> <message> - <source>Default username:</source> - <translation>Domyślny użytkownik:</translation> + <source>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</source> + <translation type="unfinished"/> </message> <message> - <source> MiB</source> - <translation>MiB</translation> + <source>Understood, keep number</source> + <translation type="unfinished"/> </message> <message> - <source>Benchmark</source> - <translation>Test sprawności</translation> + <source>Cancel</source> + <translation>Anuluj</translation> </message> <message> - <source>Max. history items:</source> - <translation>Maks. liczba wpisów w historii:</translation> + <source>Number of rounds too low</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> </message> <message> - <source>Max. history size:</source> - <translation>Maks. rozmiar historii:</translation> + <source>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</source> + <translation type="unfinished"/> </message> <message> - <source>Use recycle bin</source> - <translation>Użyj kosza</translation> + <source>KDF unchanged</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetEncryption</name> + <message> + <source>Encryption Algorithm:</source> + <translation type="unfinished"/> </message> <message> <source>AES: 256 Bit (default)</source> @@ -484,14 +827,78 @@ Możesz teraz ją już zapisać.</translation> <translation>Twofish: 256-bitowy</translation> </message> <message> - <source>Algorithm:</source> - <translation>Algorytm:</translation> + <source>Key Derivation Function:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Transform rounds:</source> + <translation>Liczba rund szyfrowania:</translation> + </message> + <message> + <source>Benchmark 1-second delay</source> + <translation type="unfinished"/> + </message> + <message> + <source>Memory Usage:</source> + <translation type="unfinished"/> + </message> + <message> + <source> MB</source> + <translation> MB</translation> + </message> + <message> + <source>Parallelism:</source> + <translation type="unfinished"/> + </message> + <message> + <source> thread</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetGeneral</name> + <message> + <source>Database Meta Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database name:</source> + <translation>Nazwa bazy danych:</translation> + </message> + <message> + <source>Database description:</source> + <translation>Opis bazy danych:</translation> + </message> + <message> + <source>Default username:</source> + <translation>Domyślny użytkownik:</translation> + </message> + <message> + <source>History Settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Max. history items:</source> + <translation>Maks. liczba wpisów w historii:</translation> + </message> + <message> + <source>Max. history size:</source> + <translation>Maks. rozmiar historii:</translation> + </message> + <message> + <source> MiB</source> + <translation>MiB</translation> + </message> + <message> + <source>Use recycle bin</source> + <translation>Użyj kosza</translation> </message> </context> <context> <name>DatabaseTabWidget</name> <message> <source>Root</source> + <comment>Root group</comment> <translation>Główna</translation> </message> <message> @@ -510,6 +917,30 @@ Możesz teraz ją już zapisać.</translation> <source>File not found!</source> <translation>Nie znaleziono pliku!</translation> </message> + <message> + <source>Unable to open the database.</source> + <translation>Nie można otworzyć bazy danych.</translation> + </message> + <message> + <source>File opened in read only mode.</source> + <translation>Plik otwarty w trybie tylko do odczytu.</translation> + </message> + <message> + <source>Open CSV file</source> + <translation>Otwieranie pliku CSV</translation> + </message> + <message> + <source>CSV file</source> + <translation>plik CSV</translation> + </message> + <message> + <source>All files (*)</source> + <translation>Wszystkie pliki (*)</translation> + </message> + <message> + <source>Merge database</source> + <translation>Połączenie baz danych</translation> + </message> <message> <source>Open KeePass 1 database</source> <translation>Otwieranie bazy danych KeePass 1</translation> @@ -518,14 +949,16 @@ Możesz teraz ją już zapisać.</translation> <source>KeePass 1 database</source> <translation>Baza danych KeePass 1</translation> </message> - <message> - <source>All files (*)</source> - <translation>Wszystkie pliki (*)</translation> - </message> <message> <source>Close?</source> <translation>Zamknąć?</translation> </message> + <message> + <source>"%1" is in edit mode. +Discard changes and close anyway?</source> + <translation>"%1" jest w trybie edytowania. +Odrzucić zmiany i zamknąć?</translation> + </message> <message> <source>Save changes?</source> <translation>Zapisać zmiany?</translation> @@ -538,12 +971,24 @@ Zapisać zmiany?</translation> </message> <message> <source>Writing the database failed.</source> - <translation>Błąd w zapisywaniu bazy danych.</translation> + <translation>Błąd przy zapisie bazy danych.</translation> + </message> + <message> + <source>Passwords</source> + <translation>Hasła</translation> </message> <message> <source>Save database as</source> <translation>Zapisz bazę danych jako</translation> </message> + <message> + <source>Export database to CSV file</source> + <translation>Eksportowanie bazy danych do pliku CSV</translation> + </message> + <message> + <source>Writing the CSV file failed.</source> + <translation>Błąd przy zapisywaniu pliku CSV.</translation> + </message> <message> <source>New database</source> <translation>Nowa baza danych</translation> @@ -561,12 +1006,6 @@ Zapisać zmiany?</translation> Please press cancel to finish your changes or discard them.</source> <translation>Nie można zablokować bazy danych, którą edytujesz. Naciśnij anuluj, aby zakończyć zmiany albo porzucić je.</translation> - </message> - <message> - <source>This database has never been saved. -You can save the database or stop locking it.</source> - <translation>Baza danych nie została nigdy zapisana. -Możesz ją zapisać albo przestać blokować.</translation> </message> <message> <source>This database has been modified. @@ -576,69 +1015,13 @@ Otherwise your changes are lost.</source> Czy chcesz zapisać przed zablokowaniem jej? W przeciwnym wypadku zmiany zostaną porzucone.</translation> </message> - <message> - <source>"%1" is in edit mode. -Discard changes and close anyway?</source> - <translation>"%1" jest w trybie edytowania. -Odrzucić zmiany i zamknąć?</translation> - </message> - <message> - <source>Export database to CSV file</source> - <translation>Eksportowanie bazy danych do pliku CSV</translation> - </message> - <message> - <source>CSV file</source> - <translation>plik CSV</translation> - </message> - <message> - <source>Writing the CSV file failed.</source> - <translation>Błąd przy zapisywaniu pliku CSV.</translation> - </message> - <message> - <source>Unable to open the database.</source> - <translation>Nie można otworzyć bazy danych.</translation> - </message> - <message> - <source>Merge database</source> - <translation>Połączenie baz danych</translation> - </message> - <message> - <source>The database you are trying to save as is locked by another instance of KeePassXC. -Do you want to save it anyway?</source> - <translation>Baza danyh, którą próbujesz zapisać, jest zablokowana przez inną instancję KeePassXC. -Czy chcesz zapisać mimo to?</translation> - </message> - <message> - <source>Passwords</source> - <translation>Hasła</translation> - </message> - <message> - <source>Database already opened</source> - <translation>Baza danych jest już otwarta</translation> - </message> - <message> - <source>The database you are trying to open is locked by another instance of KeePassXC. - -Do you want to open it anyway?</source> - <translation>Baza danych, którą próbujesz otworzyć, jest zablokowana przez inną instancję KeePassXC. - -Czy chcesz ją otworzyć mimo to?</translation> - </message> - <message> - <source>Open read-only</source> - <translation>Otwórz tylko do odczytu</translation> - </message> - <message> - <source>File opened in read only mode.</source> - <translation>Plik otwarty w trybie tylko do odczytu.</translation> - </message> - <message> - <source>Open CSV file</source> - <translation>Otwieranie pliku CSV</translation> - </message> </context> <context> <name>DatabaseWidget</name> + <message> + <source>Searching...</source> + <translation>Wyszukiwanie...</translation> + </message> <message> <source>Change master key</source> <translation>Zmień główne hasło</translation> @@ -659,13 +1042,33 @@ Czy chcesz ją otworzyć mimo to?</translation> <source>Do you really want to delete %1 entries for good?</source> <translation>Czy na prawdę chcesz usunąć %1 wpisów na dobre?</translation> </message> + <message> + <source>Move entry to recycle bin?</source> + <translation>Przenieść wpis do kosza?</translation> + </message> + <message> + <source>Do you really want to move entry "%1" to the recycle bin?</source> + <translation>Czy na pewno chcesz przenieść wpis" %1" do kosza?</translation> + </message> <message> <source>Move entries to recycle bin?</source> <translation>Przenieść wpisy do kosza?</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>Czy na pewno chcesz przenieść %n wpis do kosza?</numerusform><numerusform>Czy na pewno chcesz przenieść %n wpisów do kosza?</numerusform><numerusform>Czy na pewno chcesz przenieść %n wpisów do kosza?</numerusform><numerusform>Czy na pewno chcesz przenieść %n wpisów do kosza?</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Execute command?</source> + <translation>Wykonać polecenie?</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation>Czy na pewno chcesz wykonać następujące polecenie?<br><br>%1<br></translation> + </message> + <message> + <source>Remember my choice</source> + <translation>Zapamiętaj mój wybór</translation> </message> <message> <source>Delete group?</source> @@ -679,18 +1082,6 @@ Czy chcesz ją otworzyć mimo to?</translation> <source>Unable to calculate master key</source> <translation>Nie mogę wyliczyć głównego klucza</translation> </message> - <message> - <source>Move entry to recycle bin?</source> - <translation>Przenieść wpis do kosza?</translation> - </message> - <message> - <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation>Czy na pewno chcesz przenieść wpis" %1" do kosza?</translation> - </message> - <message> - <source>Searching...</source> - <translation>Wyszukiwanie...</translation> - </message> <message> <source>No current database.</source> <translation>Brak bieżącej bazy danych.</translation> @@ -708,20 +1099,8 @@ Czy chcesz ją otworzyć mimo to?</translation> <translation>Brak wyników</translation> </message> <message> - <source>Execute command?</source> - <translation>Wykonać polecenie?</translation> - </message> - <message> - <source>Do you really want to execute the following command?<br><br>%1<br></source> - <translation>Czy na pewno chcesz wykonać następujące polecenie?<br><br>%1<br></translation> - </message> - <message> - <source>Remember my choice</source> - <translation>Zapamiętaj mój wybór</translation> - </message> - <message> - <source>Autoreload Request</source> - <translation>Żądanie automatycznego przeładowania</translation> + <source>File has changed</source> + <translation type="unfinished"/> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -732,8 +1111,9 @@ Czy chcesz ją otworzyć mimo to?</translation> <translation>Połącz żądanie</translation> </message> <message> - <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> - <translation>Plik bazy danych został zmieniony, a masz niezapisane zmiany. Czy chcesz połączyć twoje zmiany?</translation> + <source>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</source> + <translation type="unfinished"/> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -748,6 +1128,89 @@ Czy chcesz ją otworzyć mimo to?</translation> <translation>Czy na pewno chcesz nieodwracalnie usunąć wszystko z twojego kosza?</translation> </message> </context> +<context> + <name>DetailsWidget</name> + <message> + <source>Generate TOTP Token</source> + <translation type="unfinished"/> + </message> + <message> + <source>Close</source> + <translation>Zamknij</translation> + </message> + <message> + <source>General</source> + <translation>Ogólne</translation> + </message> + <message> + <source>Password</source> + <translation>Hasło</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Expiration</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username</source> + <translation>Użytkownik</translation> + </message> + <message> + <source>Autotype</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searching</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attributes</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation>Załączniki</translation> + </message> + <message> + <source>Notes</source> + <translation>Notatki</translation> + </message> + <message> + <source>Window</source> + <translation>Okno</translation> + </message> + <message> + <source>Sequence</source> + <translation>Sekwencja</translation> + </message> + <message> + <source>Search</source> + <translation>Szukaj</translation> + </message> + <message> + <source>Clear</source> + <translation>Wyczyść</translation> + </message> + <message> + <source>Never</source> + <translation type="unfinished"/> + </message> + <message> + <source>[PROTECTED]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Disabled</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enabled</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EditEntryWidget</name> <message> @@ -774,6 +1237,30 @@ Czy chcesz ją otworzyć mimo to?</translation> <source>History</source> <translation>Historia</translation> </message> + <message> + <source>SSH Agent</source> + <translation>Agent SSH</translation> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>(encrypted)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>File too large to be a private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open private key</source> + <translation type="unfinished"/> + </message> <message> <source>Entry history</source> <translation>Historia wpisu</translation> @@ -794,40 +1281,6 @@ Czy chcesz ją otworzyć mimo to?</translation> <source>New attribute</source> <translation>Nowy atrybut</translation> </message> - <message> - <source>Select file</source> - <translation>Wybierz plik</translation> - </message> - <message> - <source>Unable to open file</source> - <translation>Nie można otworzyć pliku</translation> - </message> - <message> - <source>Save attachment</source> - <translation>Zapisz załącznik</translation> - </message> - <message> - <source>Unable to save the attachment: -</source> - <translation>Nie można zapisać załącznika: -</translation> - </message> - <message> - <source>Tomorrow</source> - <translation>Jutro</translation> - </message> - <message numerus="yes"> - <source>%n week(s)</source> - <translation><numerusform>%n tydzień</numerusform><numerusform>%n tygodni(e)</numerusform><numerusform>%n tygodni(e)</numerusform><numerusform>%n tygodni(e)</numerusform></translation> - </message> - <message numerus="yes"> - <source>%n month(s)</source> - <translation><numerusform>%n miesiąc</numerusform><numerusform>%n miesiąc(e)</numerusform><numerusform>%n miesiąc(e)</numerusform><numerusform>%n miesiąc(e)</numerusform></translation> - </message> - <message> - <source>1 year</source> - <translation>1 rok</translation> - </message> <message> <source>Confirm Remove</source> <translation>Potwierdź usunięcie</translation> @@ -837,12 +1290,28 @@ Czy chcesz ją otworzyć mimo to?</translation> <translation>Czy na pewno chcesz usunąć ten atrybut?</translation> </message> <message> - <source>[PROTECTED] Press reveal to view or edit</source> - <translation>[CHRONIONE] Wciśnij Odsłoń, aby zobaczyć albo edytować</translation> + <source>[PROTECTED]</source> + <translation type="unfinished"/> </message> <message> - <source>Are you sure you want to remove this attachment?</source> - <translation>Czy na pewno chcesz usunąć ten załącznik?</translation> + <source>Press reveal to view or edit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Tomorrow</source> + <translation>Jutro</translation> + </message> + <message numerus="yes"> + <source>%n week(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source>%n month(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>1 year</source> + <translation>1 rok</translation> </message> </context> <context> @@ -859,18 +1328,6 @@ Czy chcesz ją otworzyć mimo to?</translation> <source>Remove</source> <translation>Usuń</translation> </message> - <message> - <source>Attachments</source> - <translation>Załączniki</translation> - </message> - <message> - <source>Save</source> - <translation>Zapisz</translation> - </message> - <message> - <source>Open</source> - <translation>Otwórz</translation> - </message> <message> <source>Edit Name</source> <translation>Edytuj nazwę</translation> @@ -883,6 +1340,10 @@ Czy chcesz ją otworzyć mimo to?</translation> <source>Reveal</source> <translation>Odsłoń</translation> </message> + <message> + <source>Attachments</source> + <translation>Załączniki</translation> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -890,6 +1351,18 @@ Czy chcesz ją otworzyć mimo to?</translation> <source>Enable Auto-Type for this entry</source> <translation>Włącz auto-uzupełnianie dla tego wpisu</translation> </message> + <message> + <source>Inherit default Auto-Type sequence from the &group</source> + <translation>Dziedzicz domyślną sekwencję auto-uzupełniania z &grupy</translation> + </message> + <message> + <source>&Use custom Auto-Type sequence:</source> + <translation>&Używaj niestandardowej sekwencji auto-uzupełniania:</translation> + </message> + <message> + <source>Window Associations</source> + <translation>Skojarzone okna</translation> + </message> <message> <source>+</source> <translation>+</translation> @@ -902,14 +1375,6 @@ Czy chcesz ją otworzyć mimo to?</translation> <source>Window title:</source> <translation>Tytuł okna:</translation> </message> - <message> - <source>Inherit default Auto-Type sequence from the &group</source> - <translation>Dziedzicz domyślną sekwencję auto-uzupełniania z &grupy</translation> - </message> - <message> - <source>&Use custom Auto-Type sequence:</source> - <translation>&Używaj niestandardowej sekwencji auto-uzupełniania:</translation> - </message> <message> <source>Use default se&quence</source> <translation>Korzystaj z dom&yślnej sekwencji</translation> @@ -918,10 +1383,6 @@ Czy chcesz ją otworzyć mimo to?</translation> <source>Set custo&m sequence:</source> <translation>Ustaw niest&andardową sekwencję:</translation> </message> - <message> - <source>Window Associations</source> - <translation>Skojarzone okna</translation> - </message> </context> <context> <name>EditEntryWidgetHistory</name> @@ -945,12 +1406,8 @@ Czy chcesz ją otworzyć mimo to?</translation> <context> <name>EditEntryWidgetMain</name> <message> - <source>Title:</source> - <translation>Tytuł:</translation> - </message> - <message> - <source>Username:</source> - <translation>Użytkownik:</translation> + <source>URL:</source> + <translation>URL:</translation> </message> <message> <source>Password:</source> @@ -961,20 +1418,104 @@ Czy chcesz ją otworzyć mimo to?</translation> <translation>Powtórz:</translation> </message> <message> - <source>URL:</source> - <translation>URL:</translation> + <source>Title:</source> + <translation>Tytuł:</translation> </message> <message> - <source>Expires</source> - <translation>Wygasa</translation> + <source>Notes</source> + <translation>Notatki</translation> </message> <message> <source>Presets</source> <translation>Ustawienia</translation> </message> <message> - <source>Notes:</source> - <translation>Notatki:</translation> + <source>Toggle the checkbox to reveal the notes section.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username:</source> + <translation>Użytkownik:</translation> + </message> + <message> + <source>Expires</source> + <translation>Wygasa</translation> + </message> +</context> +<context> + <name>EditEntryWidgetSSHAgent</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent after</source> + <translation type="unfinished"/> + </message> + <message> + <source> seconds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fingerprint</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent when database is closed/locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add key to agent when database is opened/unlocked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Comment</source> + <translation type="unfinished"/> + </message> + <message> + <source>Decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy to clipboard</source> + <translation>Skopiuj do schowka</translation> + </message> + <message> + <source>Private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>External file</source> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Przeglądaj...</translation> + </message> + <message> + <source>Attachment</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add to agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove from agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Require user confirmation when this key is used</source> + <translation type="unfinished"/> </message> </context> <context> @@ -1045,6 +1586,14 @@ Czy chcesz ją otworzyć mimo to?</translation> </context> <context> <name>EditWidgetIcons</name> + <message> + <source>&Use default icon</source> + <translation>&Użyj ikony domyślnej</translation> + </message> + <message> + <source>Use custo&m icon</source> + <translation>Użyj niesta&ndardowej ikony</translation> + </message> <message> <source>Add custom icon</source> <translation>Dodaj niestandardową ikonę</translation> @@ -1053,6 +1602,18 @@ Czy chcesz ją otworzyć mimo to?</translation> <source>Delete custom icon</source> <translation>Usuń niestandardową ikonę</translation> </message> + <message> + <source>Download favicon</source> + <translation>Pobierz ikonę ulubionych</translation> + </message> + <message> + <source>Unable to fetch favicon.</source> + <translation>Nie można pobrać ikony ulubionych.</translation> + </message> + <message> + <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> + <translation>Wskazówka: możesz włączyć Google jako zastępstwo w menu Narzędzia>Ustawienia>Bezpieczeństwo</translation> + </message> <message> <source>Images</source> <translation>Obrazy</translation> @@ -1065,25 +1626,13 @@ Czy chcesz ją otworzyć mimo to?</translation> <source>Select Image</source> <translation>Wybierz obraz</translation> </message> - <message> - <source>Download favicon</source> - <translation>Pobierz ikonę ulubionych</translation> - </message> - <message> - <source>Unable to fetch favicon.</source> - <translation>Nie można pobrać ikony ulubionych.</translation> - </message> <message> <source>Can't read icon</source> <translation>Nie można odczytać ikony</translation> </message> <message> - <source>&Use default icon</source> - <translation>&Użyj ikony domyślnej</translation> - </message> - <message> - <source>Use custo&m icon</source> - <translation>Użyj niesta&ndardowej ikony</translation> + <source>Custom icon already exists</source> + <translation>Ikona niestandardowa już istnieje</translation> </message> <message> <source>Confirm Delete</source> @@ -1093,14 +1642,6 @@ Czy chcesz ją otworzyć mimo to?</translation> <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> <translation>Ta ikona używana jest przez %1 wpisów i zostanie zamieniona na ikonę domyślną. Czy na pewno chcesz ją usunąć?</translation> </message> - <message> - <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation>Wskazówka: możesz włączyć Google jako zastępstwo w menu Narzędzia>Ustawienia>Bezpieczeństwo</translation> - </message> - <message> - <source>Custom icon already exists</source> - <translation>Ikona niestandardowa już istnieje</translation> - </message> </context> <context> <name>EditWidgetProperties</name> @@ -1125,9 +1666,93 @@ Czy chcesz ją otworzyć mimo to?</translation> <name>Entry</name> <message> <source> - Clone</source> + <comment>Suffix added to cloned entries</comment> <translation>- Klon</translation> </message> </context> +<context> + <name>EntryAttachmentsModel</name> + <message> + <source>Name</source> + <translation>Nazwa</translation> + </message> + <message> + <source>Size</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EntryAttachmentsWidget</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add</source> + <translation>Dodaj</translation> + </message> + <message> + <source>Remove</source> + <translation>Usuń</translation> + </message> + <message> + <source>Open</source> + <translation>Otwórz</translation> + </message> + <message> + <source>Save</source> + <translation>Zapisz</translation> + </message> + <message> + <source>Select files</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <source>Are you sure you want to remove %n attachment(s)?</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>Potwierdź usunięcie</translation> + </message> + <message> + <source>Save attachments</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to create directory: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Confirm overwrite</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to save attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachment: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open files: +%1</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EntryAttributesModel</name> <message> @@ -1156,6 +1781,11 @@ Czy chcesz ją otworzyć mimo to?</translation> </context> <context> <name>EntryModel</name> + <message> + <source>Ref: </source> + <comment>Reference abbreviation</comment> + <translation>Odniesienie:</translation> + </message> <message> <source>Group</source> <translation>Grupa</translation> @@ -1172,11 +1802,6 @@ Czy chcesz ją otworzyć mimo to?</translation> <source>URL</source> <translation>URL</translation> </message> - <message> - <source>Ref: </source> - <comment>Reference abbreviation</comment> - <translation>Odniesienie:</translation> - </message> </context> <context> <name>Group</name> @@ -1185,6 +1810,17 @@ Czy chcesz ją otworzyć mimo to?</translation> <translation>Kosz</translation> </message> </context> +<context> + <name>HostInstaller</name> + <message> + <source>KeePassXC: Cannot save file!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot save the native messaging script file.</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>HttpPasswordGeneratorWidget</name> <message> @@ -1247,6 +1883,361 @@ Czy chcesz ją otworzyć mimo to?</translation> <translation>Zamknij komunikat</translation> </message> </context> +<context> + <name>Kdbx3Reader</name> + <message> + <source>Unable to calculate master key</source> + <translation>Nie mogę wyliczyć głównego klucza</translation> + </message> + <message> + <source>Unable to issue challenge-response.</source> + <translation>Nie można wywołać wyzwania-odpowiedzi.</translation> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>Błędny klucz lub baza danych jest uszkodzona.</translation> + </message> +</context> +<context> + <name>Kdbx3Writer</name> + <message> + <source>Unable to issue challenge-response.</source> + <translation>Nie można wywołać wyzwania-odpowiedzi.</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Nie mogę wyliczyć głównego klucza</translation> + </message> +</context> +<context> + <name>Kdbx4Reader</name> + <message> + <source>missing database headers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Nie mogę wyliczyć głównego klucza</translation> + </message> + <message> + <source>Invalid header checksum size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Header SHA256 mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header data length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open buffer for KDF parameters in header</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported key derivation function (KDF) or invalid parameters</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy header fields found in KDBX4 file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header binary size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass variant map version.</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name data</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value data</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Bool entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry type</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map field type size</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Kdbx4Writer</name> + <message> + <source>Invalid symmetric cipher algorithm.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid symmetric cipher IV size.</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Nie mogę wyliczyć głównego klucza</translation> + </message> + <message> + <source>Failed to serialize KDF parameters variant map</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxReader</name> + <message> + <source>Invalid cipher uuid length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid compression flags length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported compression algorithm</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid master seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform rounds size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid start bytes size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid random stream id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner random stream cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>To nie baza danych KeePass.</translation> + </message> + <message> + <source>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> + <translation>Wybrany plik jest starą bazą danych KeePassX 1 (.kdb). + +Możesz zaimportować ją przez wybranie Baza danych > 'Importuj bazę danych KeePass 1...'. +Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej bazy danych za pomocą starej wersji KeePassX 0.4.</translation> + </message> + <message> + <source>Unsupported KeePass 2 database version.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxXmlReader</name> + <message> + <source>XML parsing failure: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>No root group</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing icon uuid or data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing custom data key or value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Multiple group elements</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null group uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableAutoType value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableSearching value</source> + <translation type="unfinished"/> + </message> + <message> + <source>No group uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null DeleteObject uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing DeletedObject uuid or time</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null entry uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element in history entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>No entry uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element with different uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decrypt entry string</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate custom attribute found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry string key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate attachment found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry binary key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-type association window or sequence missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid bool value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid date time value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color rgb part</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid uuid value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decompress binary</source> + <extracomment>Translator meant is a binary data inside an entry</extracomment> + <translation type="unfinished"/> + </message> +</context> <context> <name>KeePass1OpenWidget</name> <message> @@ -1276,6 +2267,35 @@ Czy chcesz ją otworzyć mimo to?</translation> <source>Unsupported KeePass database version.</source> <translation>Niewspierana wersja bazy danych KeePass.</translation> </message> + <message> + <source>Unable to read encryption IV</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of groups</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid content hash size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of transform rounds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to construct group tree</source> + <translation type="unfinished"/> + </message> <message> <source>Root</source> <translation>Główna</translation> @@ -1288,60 +2308,104 @@ Czy chcesz ją otworzyć mimo to?</translation> <source>Wrong key or database file is corrupt.</source> <translation>Błędny klucz lub baza danych jest uszkodzona.</translation> </message> -</context> -<context> - <name>KeePass2Reader</name> <message> - <source>Not a KeePass database.</source> - <translation>To nie baza danych KeePass.</translation> + <source>Key transformation failed</source> + <translation type="unfinished"/> </message> <message> - <source>Unsupported KeePass database version.</source> - <translation>Niewspierana wersja bazy danych KeePass.</translation> + <source>Invalid group field type number</source> + <translation type="unfinished"/> </message> <message> - <source>Wrong key or database file is corrupt.</source> - <translation>Błędny klucz lub baza danych jest uszkodzona.</translation> + <source>Invalid group field size</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>Nie mogę wyliczyć głównego klucza</translation> + <source>Read group field data doesn't match size</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to issue challenge-response.</source> - <translation>Nie można wywołać wyzwania-odpowiedzi.</translation> + <source>Incorrect group id field size</source> + <translation type="unfinished"/> </message> <message> - <source>The selected file is an old KeePass 1 database (.kdb). - -You can import it by clicking on Database > 'Import KeePass 1 database...'. -This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> - <translation>Wybrany plik jest starą bazą danych KeePassX 1 (.kdb). - -Możesz zaimportować ją przez wybranie Baza danych > 'Importuj bazę danych KeePass 1...'. -Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej bazy danych za pomocą starej wersji KeePassX 0.4.</translation> - </message> -</context> -<context> - <name>KeePass2Writer</name> - <message> - <source>Unable to issue challenge-response.</source> - <translation>Nie można wywołać wyzwania-odpowiedzi.</translation> + <source>Incorrect group creation time field size</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>Nie mogę wyliczyć głównego klucza</translation> + <source>Incorrect group modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group access time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group level field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing group id or level</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing entry field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read entry field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry uuid field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field type</source> + <translation type="unfinished"/> </message> </context> <context> <name>Main</name> <message> - <source>Fatal error while testing the cryptographic functions.</source> - <translation>Błąd krytyczny podczas testowania funkcji kryptograficznych.</translation> - </message> - <message> - <source>KeePassXC - Error</source> - <translation>KeePassXC - Błąd</translation> + <source>Existing single-instance lock file is invalid. Launching new instance.</source> + <translation>Istniejący plik blokady pojedynczego wystąpienia jest nieprawidłowy. Uruchamianie nowego wystąpienia.</translation> </message> <message> <source>The lock file could not be created. Single-instance mode disabled.</source> @@ -1352,64 +2416,32 @@ Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej baz <translation>Inna instancja KeePassXC jest już uruchomiona.</translation> </message> <message> - <source>Existing single-instance lock file is invalid. Launching new instance.</source> - <translation>Istniejący plik blokady pojedynczego wystąpienia jest nieprawidłowy. Uruchamianie nowego wystąpienia.</translation> + <source>Fatal error while testing the cryptographic functions.</source> + <translation>Błąd krytyczny podczas testowania funkcji kryptograficznych.</translation> + </message> + <message> + <source>KeePassXC - Error</source> + <translation>KeePassXC - Błąd</translation> </message> </context> <context> <name>MainWindow</name> <message> - <source>Open database</source> - <translation>Otwieranie bazy danych</translation> - </message> - <message> - <source>Database settings</source> - <translation>Ustawienia bazy danych</translation> - </message> - <message> - <source>Copy username to clipboard</source> - <translation>Skopiuj użytkownika do schowka</translation> - </message> - <message> - <source>Copy password to clipboard</source> - <translation>Skopiuj hasło do schowka</translation> - </message> - <message> - <source>Settings</source> - <translation>Ustawienia</translation> - </message> - <message> - <source>Show toolbar</source> - <translation>Pokaż pasek narzędziowy</translation> - </message> - <message> - <source>read-only</source> - <translation>Tylko do odczytu</translation> - </message> - <message> - <source>Toggle window</source> - <translation>Pokaż/ukryj okno</translation> - </message> - <message> - <source>KeePass 2 Database</source> - <translation>Baza danych KeePass 2</translation> - </message> - <message> - <source>All files</source> - <translation>Wszystkie pliki</translation> - </message> - <message> - <source>Save repaired database</source> - <translation>Zapisz naprawioną bazę danych</translation> - </message> - <message> - <source>Writing the database failed.</source> - <translation>Błąd przy zapisie bazy danych.</translation> + <source>&Database</source> + <translation>&Baza danych</translation> </message> <message> <source>&Recent databases</source> <translation>&Ostatnie bazy danych</translation> </message> + <message> + <source>Import</source> + <translation>Importuj</translation> + </message> + <message> + <source>&Help</source> + <translation>Pomoc</translation> + </message> <message> <source>E&ntries</source> <translation>W&pisy</translation> @@ -1418,13 +2450,17 @@ Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej baz <source>Copy att&ribute to clipboard</source> <translation>Skopiuj atry&but do schowka</translation> </message> + <message> + <source>Time-based one-time password</source> + <translation type="unfinished"/> + </message> <message> <source>&Groups</source> <translation>&Grupy</translation> </message> <message> - <source>&View</source> - <translation>Wi&dok</translation> + <source>&Tools</source> + <translation>&Narzędzia</translation> </message> <message> <source>&Quit</source> @@ -1434,6 +2470,10 @@ Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej baz <source>&About</source> <translation>&O programie</translation> </message> + <message> + <source>&Open database...</source> + <translation>Ot&wórz bazę danych...</translation> + </message> <message> <source>&Save database</source> <translation>&Zapisz bazę danych</translation> @@ -1474,26 +2514,26 @@ Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej baz <source>&Delete group</source> <translation>U&suń grupę</translation> </message> + <message> + <source>Sa&ve database as...</source> + <translation>&Zapisz bazę danych jako...</translation> + </message> + <message> + <source>Change &master key...</source> + <translation>Zmień główne &hasło...</translation> + </message> <message> <source>&Database settings</source> <translation>Ustawienia bazy &danych</translation> </message> + <message> + <source>Database settings</source> + <translation>Ustawienia bazy danych</translation> + </message> <message> <source>&Clone entry</source> <translation>&Sklonuj wpis</translation> </message> - <message> - <source>Timed one-time password</source> - <translation>Hasło jednorazowe zależne od czasu – TOTP</translation> - </message> - <message> - <source>Copy &TOTP</source> - <translation>Skopiuj &TOTP</translation> - </message> - <message> - <source>Show TOTP</source> - <translation>Pokaż TOTP</translation> - </message> <message> <source>&Find</source> <translation>&Znajdź</translation> @@ -1502,14 +2542,26 @@ Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej baz <source>Copy &username</source> <translation>Skopi&uj użytkownika</translation> </message> + <message> + <source>Copy username to clipboard</source> + <translation>Skopiuj użytkownika do schowka</translation> + </message> <message> <source>Cop&y password</source> <translation>Sko&piuj hasło</translation> </message> + <message> + <source>Copy password to clipboard</source> + <translation>Skopiuj hasło do schowka</translation> + </message> <message> <source>&Settings</source> <translation>&Ustawienia</translation> </message> + <message> + <source>Password Generator</source> + <translation>Generator hasła</translation> + </message> <message> <source>&Perform Auto-Type</source> <translation>&Wykonaj auto-uzupełnianie</translation> @@ -1526,65 +2578,25 @@ Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej baz <source>&Title</source> <translation>&Tytuł</translation> </message> + <message> + <source>Copy title to clipboard</source> + <translation type="unfinished"/> + </message> <message> <source>&URL</source> <translation>&URL</translation> </message> + <message> + <source>Copy URL to clipboard</source> + <translation type="unfinished"/> + </message> <message> <source>&Notes</source> <translation>&Notatki</translation> </message> <message> - <source>Password Generator</source> - <translation>Generator hasła</translation> - </message> - <message> - <source>Clear history</source> - <translation>Wyczyść historię</translation> - </message> - <message> - <source>&Database</source> - <translation>&Baza danych</translation> - </message> - <message> - <source>Import</source> - <translation>Importuj</translation> - </message> - <message> - <source>&Tools</source> - <translation>&Narzędzia</translation> - </message> - <message> - <source>Empty recycle bin</source> - <translation>Opróżnij kosz</translation> - </message> - <message> - <source>Access error for config file %1</source> - <translation>Błąd dostępu pliku konfiguracyjnego %1</translation> - </message> - <message> - <source>Quit KeePassXC</source> - <translation>Zakończ KeePassXC</translation> - </message> - <message> - <source>Please touch the button on your YubiKey!</source> - <translation>Proszę dotknąć przycisku na twoim YubiKey!</translation> - </message> - <message> - <source>&Help</source> - <translation>Pomoc</translation> - </message> - <message> - <source>&Open database...</source> - <translation>Ot&wórz bazę danych...</translation> - </message> - <message> - <source>Sa&ve database as...</source> - <translation>&Zapisz bazę danych jako...</translation> - </message> - <message> - <source>Change &master key...</source> - <translation>Zmień główne &hasło...</translation> + <source>Copy notes to clipboard</source> + <translation type="unfinished"/> </message> <message> <source>&Export to CSV file...</source> @@ -1602,10 +2614,169 @@ Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej baz <source>Re&pair database...</source> <translation>Na&praw bazę danych...</translation> </message> + <message> + <source>Show TOTP</source> + <translation>Pokaż TOTP</translation> + </message> <message> <source>Set up TOTP...</source> <translation>Ustaw TOTP...</translation> </message> + <message> + <source>Copy &TOTP</source> + <translation>Skopiuj &TOTP</translation> + </message> + <message> + <source>E&mpty recycle bin</source> + <translation type="unfinished"/> + </message> + <message> + <source>Clear history</source> + <translation>Wyczyść historię</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation>Błąd dostępu pliku konfiguracyjnego %1</translation> + </message> + <message> + <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> + <translation type="unfinished"/> + </message> + <message> + <source>read-only</source> + <translation>Tylko do odczytu</translation> + </message> + <message> + <source>Settings</source> + <translation>Ustawienia</translation> + </message> + <message> + <source>Toggle window</source> + <translation>Pokaż/ukryj okno</translation> + </message> + <message> + <source>Quit KeePassXC</source> + <translation>Zakończ KeePassXC</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>Baza danych KeePass 2</translation> + </message> + <message> + <source>All files</source> + <translation>Wszystkie pliki</translation> + </message> + <message> + <source>Open database</source> + <translation>Otwieranie bazy danych</translation> + </message> + <message> + <source>Save repaired database</source> + <translation>Zapisz naprawioną bazę danych</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>Błąd przy zapisie bazy danych.</translation> + </message> + <message> + <source>Please touch the button on your YubiKey!</source> + <translation>Proszę dotknąć przycisku na twoim YubiKey!</translation> + </message> +</context> +<context> + <name>OpenSSHKey</name> + <message> + <source>Invalid key file, expecting an OpenSSH key</source> + <translation type="unfinished"/> + </message> + <message> + <source>PEM boundary mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>This is not an OpenSSH key, only modern keys are supported</source> + <translation type="unfinished"/> + </message> + <message> + <source>Base64 decoding failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file way too small.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file magic header id invalid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Found zero keys</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to read public key.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Corrupted key file, reading private key failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>No private key payload to decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Trying to run KDF without cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Passphrase is required to decrypt this key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key derivation failed, key file corrupted?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Decryption failed, wrong passphrase?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write public key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write private key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing private key</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OptionDialog</name> @@ -1613,22 +2784,63 @@ Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej baz <source>Dialog</source> <translation>Dialog</translation> </message> + <message> + <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation>Wymagane jest to w celu uzyskania dostępu do baz danych z ChromeIPass albo PassIFox</translation> + </message> + <message> + <source>Enable KeePassHTTP server</source> + <translation>Włącz serwer KeePassHTTP</translation> + </message> <message> <source>General</source> <translation>Ogólne</translation> </message> <message> <source>Sh&ow a notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> <translation>P&okaż powiadomienie, gdy wymagane są poświadczenia</translation> </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>Zwracaj tylko najlepsze dopasowania wpisów dla URL zamiast wszystkich wpisów całej domeny.</translation> + </message> + <message> + <source>&Return only best matching entries</source> + <translation>Z&wróć tylko najlepiej pasujące wpisy</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Żąda&j odblokowania bazy danych, jeżeli jest zablokowana</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> + <translation>Tylko wpisy z tym samym schematem (http://, https://, ftp://, ...) są zwracane.</translation> + </message> + <message> + <source>&Match URL schemes</source> + <translation>&Dopasuj schematy adresów URL</translation> + </message> <message> <source>Sort matching entries by &username</source> <translation>Sortuj dopasowane wpisy według &użytkownika</translation> </message> + <message> + <source>Sort &matching entries by title</source> + <translation>Sortuj dopasowane wpisy według &tytułu</translation> + </message> + <message> + <source>R&emove all shared encryption keys from active database</source> + <translation>U&suń wszystkie współdzielone klucze szyfrujące z aktywnej bazy danych</translation> + </message> <message> <source>Re&move all stored permissions from entries in active database</source> <translation>U&suń wszystkie przechowywane uprawnienia z wpisów w aktywnej bazie danych</translation> </message> + <message> + <source>Password Generator</source> + <translation>Generator hasła</translation> + </message> <message> <source>Advanced</source> <translation>Zaawansowane</translation> @@ -1641,10 +2853,22 @@ Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej baz <source>Always allow &updating entries</source> <translation>Zawsze zezwalaj na a&ktualizowanie wpisów</translation> </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>Tylko wybrana baza danych musi być podłączona do klienta.</translation> + </message> <message> <source>Searc&h in all opened databases for matching entries</source> <translation>Szuk&aj we wszystkich otwartych bazach danych dopasowanych wpisów</translation> </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>Automatyczne tworzenie albo aktualizowanie pól ciągów znaków nie jest obsługiwane.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>&Zwracaj zaawansowane pola ciągów znaków, które zaczynają się od "KPH: "</translation> + </message> <message> <source>HTTP Port:</source> <translation>Port HTTP:</translation> @@ -1653,18 +2877,18 @@ Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej baz <source>Default port: 19455</source> <translation>Port domyślny: 19455</translation> </message> - <message> - <source>Re&quest to unlock the database if it is locked</source> - <translation>Żąda&j odblokowania bazy danych, jeżeli jest zablokowana</translation> - </message> - <message> - <source>Sort &matching entries by title</source> - <translation>Sortuj dopasowane wpisy według &tytułu</translation> - </message> <message> <source>KeePassXC will listen to this port on 127.0.0.1</source> <translation>KeePassXC będzie nasłuchiwać ten port na 127.0.0.1</translation> </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> + <translation type="unfinished"/> + </message> <message> <source>Cannot bind to privileged ports</source> <translation>Nie można powiązać do uprzywilejowanych portów</translation> @@ -1675,70 +2899,37 @@ Using default port 19455.</source> <translation>Nie można powiązać do uprzywilejowanych portów poniżej 1024! Używam domyślnego portu 19455.</translation> </message> - <message> - <source>R&emove all shared encryption keys from active database</source> - <translation>U&suń wszystkie współdzielone klucze szyfrujące z aktywnej bazy danych</translation> - </message> - <message> - <source>&Return advanced string fields which start with "KPH: "</source> - <translation>&Zwracaj zaawansowane pola ciągów znaków, które zaczynają się od "KPH: "</translation> - </message> - <message> - <source>Automatically creating or updating string fields is not supported.</source> - <translation>Automatyczne tworzenie albo aktualizowanie pól ciągów znaków nie jest obsługiwane.</translation> - </message> - <message> - <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> - <translation>Wymagane jest to w celu uzyskania dostępu do baz danych z ChromeIPass albo PassIFox</translation> - </message> - <message> - <source>Enable KeePassHTTP server</source> - <translation>Włącz serwer KeePassHTTP</translation> - </message> - <message> - <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation>Zwracaj tylko najlepsze dopasowania wpisów dla URL zamiast wszystkich wpisów całej domeny.</translation> - </message> - <message> - <source>&Return only best matching entries</source> - <translation>Z&wróć tylko najlepiej pasujące wpisy</translation> - </message> - <message> - <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation>Tylko wpisy z tym samym schematem (http://, https://, ftp://, ...) są zwracane.</translation> - </message> - <message> - <source>&Match URL schemes</source> - <translation>&Dopasuj schematy adresów URL</translation> - </message> - <message> - <source>Password Generator</source> - <translation>Generator hasła</translation> - </message> - <message> - <source>Only the selected database has to be connected with a client.</source> - <translation>Tylko wybrana baza danych musi być podłączona do klienta.</translation> - </message> - <message> - <source>The following options can be dangerous! -Change them only if you know what you are doing.</source> - <translation>Poniższe opcje mogą być niebezpieczne! -Zmieniaj je tylko wtedy, gdy wiesz, co robisz.</translation> - </message> </context> <context> <name>PasswordGeneratorWidget</name> + <message> + <source>%p%</source> + <translation>%p%</translation> + </message> <message> <source>Password:</source> <translation>Hasło:</translation> </message> + <message> + <source>strength</source> + <comment>Password strength</comment> + <translation>siła</translation> + </message> + <message> + <source>entropy</source> + <translation>entropia</translation> + </message> + <message> + <source>Password</source> + <translation>Hasło</translation> + </message> <message> <source>Character Types</source> <translation>Typy znaków</translation> </message> <message> <source>Upper Case Letters</source> - <translation>Duże litery</translation> + <translation>Wielkie litery</translation> </message> <message> <source>Lower Case Letters</source> @@ -1752,38 +2943,50 @@ Zmieniaj je tylko wtedy, gdy wiesz, co robisz.</translation> <source>Special Characters</source> <translation>Znaki specjalne</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>Rozszerzony ASCII</translation> + </message> <message> <source>Exclude look-alike characters</source> <translation>Wyklucz podobnie wyglądające znaki</translation> </message> - <message> - <source>Accept</source> - <translation>Zaakceptuj</translation> - </message> - <message> - <source>%p%</source> - <translation>%p%</translation> - </message> - <message> - <source>strength</source> - <translation>siła</translation> - </message> - <message> - <source>entropy</source> - <translation>entropia</translation> - </message> - <message> - <source>&Length:</source> - <translation>&Długość:</translation> - </message> <message> <source>Pick characters from every group</source> <translation>Wybierz znaki ze wszystkich grup</translation> </message> + <message> + <source>&Length:</source> + <translation>&Długość:</translation> + </message> + <message> + <source>Passphrase</source> + <translation>Tekst szyfrujący</translation> + </message> + <message> + <source>Wordlist:</source> + <translation>Lista słów:</translation> + </message> + <message> + <source>Word Count:</source> + <translation>Liczba słów:</translation> + </message> + <message> + <source>Word Separator:</source> + <translation>Separator słów:</translation> + </message> <message> <source>Generate</source> <translation>Wygeneruj</translation> </message> + <message> + <source>Copy</source> + <translation>Skopiuj</translation> + </message> + <message> + <source>Accept</source> + <translation>Zaakceptuj</translation> + </message> <message> <source>Close</source> <translation>Zamknij</translation> @@ -1802,51 +3005,270 @@ Zmieniaj je tylko wtedy, gdy wiesz, co robisz.</translation> </message> <message> <source>Poor</source> + <comment>Password quality</comment> <translation>Kiepska</translation> </message> <message> <source>Weak</source> + <comment>Password quality</comment> <translation>Słaba</translation> </message> <message> <source>Good</source> + <comment>Password quality</comment> <translation>Dobra</translation> </message> <message> <source>Excellent</source> + <comment>Password quality</comment> <translation>Znakomita</translation> </message> - <message> - <source>Password</source> - <translation>Hasło</translation> - </message> - <message> - <source>Extended ASCII</source> - <translation>Rozszerzony ASCII</translation> - </message> - <message> - <source>Passphrase</source> - <translation>Tekst szyfrujący</translation> - </message> - <message> - <source>Wordlist:</source> - <translation>Lista słów:</translation> - </message> - <message> - <source>Word Count:</source> - <translation>Liczba słów:</translation> - </message> - <message> - <source>Word Separator:</source> - <translation>Separator słów:</translation> - </message> - <message> - <source>Copy</source> - <translation>Skopiuj</translation> - </message> </context> <context> <name>QObject</name> + <message> + <source>Database not opened</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database hash not available</source> + <translation type="unfinished"/> + </message> + <message> + <source>Client public key not received</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot decrypt message</source> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout or cannot connect to KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>Action cancelled or denied</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC association failed, try again</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key change was not successful</source> + <translation type="unfinished"/> + </message> + <message> + <source>Encryption key is not recognized</source> + <translation type="unfinished"/> + </message> + <message> + <source>No saved databases found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect action</source> + <translation type="unfinished"/> + </message> + <message> + <source>Empty message received</source> + <translation type="unfinished"/> + </message> + <message> + <source>No URL provided</source> + <translation type="unfinished"/> + </message> + <message> + <source>No logins found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown error</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add a new entry to a database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>Ścieżka bazy danych.</translation> + </message> + <message> + <source>Key file of the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>path</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>username</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Prompt for the entry's password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a password for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length for the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to add.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy an entry's password to the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to clip.</source> + <comment>clip = copy to clipboard</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout in seconds before clearing the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Edit an entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Title for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>title</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to edit.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Estimate the entropy of a password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password for which to estimate the entropy.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Perform advanced analysis on the password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Extract and print the content of a database.</source> + <translation>Wyodrębnij i drukuj zawartość bazy danych.</translation> + </message> + <message> + <source>Path of the database to extract.</source> + <translation>Ścieżka bazy danych do wyodrębnienia.</translation> + </message> + <message> + <source>Insert password to unlock %1: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to load key file %1 : %2</source> + <translation type="unfinished"/> + </message> + <message> + <source>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source> + +Available commands: +</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the command to execute.</source> + <translation>Nazwa polecenia do wykonania.</translation> + </message> + <message> + <source>List database entries.</source> + <translation>Wypisz wpisy bazy danych.</translation> + </message> + <message> + <source>Path of the group to list. Default is /</source> + <translation>Ścieżka grupy do wymienienia. Domyślna to /</translation> + </message> + <message> + <source>Find entries quickly.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Search term.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Merge two databases.</source> + <translation>Połącz dwie bazy danych.</translation> + </message> + <message> + <source>Path of the database to merge into.</source> + <translation>Ścieżka bazy danych, do której scalić.</translation> + </message> + <message> + <source>Path of the database to merge from.</source> + <translation>Ścieżka bazy danych, z której scalić.</translation> + </message> + <message> + <source>Use the same credentials for both database files.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file of the database to merge from.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show an entry's information.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> + <translation type="unfinished"/> + </message> + <message> + <source>attribute</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the entry to show.</source> + <translation>Nazwa wpisu do pokazania.</translation> + </message> <message> <source>NULL device</source> <translation>Urządzenie NULL</translation> @@ -1870,8 +3292,28 @@ Zmieniaj je tylko wtedy, gdy wiesz, co robisz.</translation> <translation>brak cytatu zamknięcia</translation> </message> <message> - <source>INTERNAL - unget lower bound exceeded</source> - <translation>WEWNĘTRZNE - przekroczono dolny limit unget</translation> + <source>AES: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Twofish: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>ChaCha20: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Argon2 (KDBX 4 – recommended)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 4)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 3.1)</source> + <translation type="unfinished"/> </message> <message> <source>Group</source> @@ -1889,14 +3331,22 @@ Zmieniaj je tylko wtedy, gdy wiesz, co robisz.</translation> <source>Password</source> <translation>Hasło</translation> </message> - <message> - <source>URL</source> - <translation>URL</translation> - </message> <message> <source>Notes</source> <translation>Notatki</translation> </message> + <message> + <source>Last Modified</source> + <translation type="unfinished"/> + </message> + <message> + <source>Created</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy Browser Integration</source> + <translation type="unfinished"/> + </message> <message> <source>Browser Integration</source> <translation>Integracja z przeglądarką</translation> @@ -1913,6 +3363,10 @@ Zmieniaj je tylko wtedy, gdy wiesz, co robisz.</translation> <source>Passive</source> <translation>Pasywny</translation> </message> + <message> + <source>SSH Agent</source> + <translation>Agent SSH</translation> + </message> </context> <context> <name>QtIOCompressor</name> @@ -1951,8 +3405,8 @@ Zmieniaj je tylko wtedy, gdy wiesz, co robisz.</translation> <context> <name>SearchWidget</name> <message> - <source>Case Sensitive</source> - <translation>Rozróżniaj wielkość znaków</translation> + <source>Search...</source> + <translation>Szukaj...</translation> </message> <message> <source>Search</source> @@ -1963,8 +3417,8 @@ Zmieniaj je tylko wtedy, gdy wiesz, co robisz.</translation> <translation>Wyczyść</translation> </message> <message> - <source>Search...</source> - <translation>Szukaj...</translation> + <source>Case Sensitive</source> + <translation>Rozróżniaj wielkość znaków</translation> </message> <message> <source>Limit search to selected group</source> @@ -1973,50 +3427,6 @@ Zmieniaj je tylko wtedy, gdy wiesz, co robisz.</translation> </context> <context> <name>Service</name> - <message> - <source>A shared encryption-key with the name "%1" already exists. -Do you want to overwrite it?</source> - <translation>Współdzielony klucz szyfrujący o nazwie "%1" już istnieje. -Czy chcesz go nadpisać?</translation> - </message> - <message> - <source>Do you want to update the information in %1 - %2?</source> - <translation>Czy chcesz uaktualnić informację w %1 - %2?</translation> - </message> - <message> - <source>The active database is locked! -Please unlock the selected database or choose another one which is unlocked.</source> - <translation>Aktywna baza danych jest zablokowana! -Proszę odblokować wybraną bazę albo wybrać inną, która jest odblokowana.</translation> - </message> - <message> - <source>Successfully removed %1 encryption-%2 from KeePassX/Http Settings.</source> - <translation>Pomyślnie usunięto %1 szyfrowanie-%2 z ustawień KeePassX/HTTP.</translation> - </message> - <message> - <source>No shared encryption-keys found in KeePassHttp Settings.</source> - <translation>Nie znaleziono współdzielonych kluczy szyfrujących w ustawieniach KeePassHTTP.</translation> - </message> - <message> - <source>The active database does not contain an entry of KeePassHttp Settings.</source> - <translation>Aktywna baza danych nie zawiera wpisu z ustawieniami KeePassHTTP.</translation> - </message> - <message> - <source>Removing stored permissions...</source> - <translation>Usuwanie przechowywanych uprawnień...</translation> - </message> - <message> - <source>Abort</source> - <translation>Zaniechaj</translation> - </message> - <message> - <source>Successfully removed permissions from %1 %2.</source> - <translation>Udanie usunięto uprawnienia z %1 %2.</translation> - </message> - <message> - <source>The active database does not contain an entry with permissions.</source> - <translation>Aktywna baza danych nie zawiera wpisu z uprawnieniami.</translation> - </message> <message> <source>KeePassXC: New key association request</source> <translation>KeePassXC: Nowe żądanie skojarzenia klucza</translation> @@ -2033,34 +3443,78 @@ nadaj unikatową nazwę do zidentyfikowania i zaakceptuj.</translation> <source>KeePassXC: Overwrite existing key?</source> <translation>KeePassXC: Nadpisać istniejący klucz?</translation> </message> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>Współdzielony klucz szyfrujący o nazwie "%1" już istnieje. +Czy chcesz go nadpisać?</translation> + </message> <message> <source>KeePassXC: Update Entry</source> <translation>KeePassXC: Aktualizacja wpisu</translation> </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Czy chcesz uaktualnić informację w %1 - %2?</translation> + </message> <message> <source>KeePassXC: Database locked!</source> <translation>KeePassXC: Baza danych zablokowana!</translation> </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>Aktywna baza danych jest zablokowana! +Proszę odblokować wybraną bazę albo wybrać inną, która jest odblokowana.</translation> + </message> <message> <source>KeePassXC: Removed keys from database</source> <translation>KeePassXC: Usunięto klucze z bazy danych</translation> </message> + <message numerus="yes"> + <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No keys found</source> <translation>KeePassXC: Nie znaleziono kluczy</translation> </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation>Nie znaleziono współdzielonych kluczy szyfrujących w ustawieniach KeePassHTTP.</translation> + </message> <message> <source>KeePassXC: Settings not available!</source> <translation>KeePassXC: Ustawienia niedostępne!</translation> </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation>Aktywna baza danych nie zawiera wpisu z ustawieniami KeePassHTTP.</translation> + </message> + <message> + <source>Removing stored permissions...</source> + <translation>Usuwanie przechowywanych uprawnień...</translation> + </message> + <message> + <source>Abort</source> + <translation>Zaniechaj</translation> + </message> <message> <source>KeePassXC: Removed permissions</source> <translation>KeePassXC: Usunięto uprawnienia</translation> </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entries.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No entry with permissions found!</source> <translation>KeePassXC: Nie znaleziono wpisu z uprawnieniami!</translation> </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>Aktywna baza danych nie zawiera wpisu z uprawnieniami.</translation> + </message> </context> <context> <name>SettingsWidget</name> @@ -2070,7 +3524,7 @@ nadaj unikatową nazwę do zidentyfikowania i zaakceptuj.</translation> </message> <message> <source>General</source> - <translation>Główne</translation> + <translation>Ogólne</translation> </message> <message> <source>Security</source> @@ -2083,10 +3537,26 @@ nadaj unikatową nazwę do zidentyfikowania i zaakceptuj.</translation> </context> <context> <name>SettingsWidgetGeneral</name> + <message> + <source>Basic Settings</source> + <translation>Ustawienia podstawowe</translation> + </message> + <message> + <source>Start only a single instance of KeePassXC</source> + <translation>Uruchom tylko jedną instancję KeePassXC</translation> + </message> <message> <source>Remember last databases</source> <translation>Pamiętaj ostatnią bazę danych</translation> </message> + <message> + <source>Remember last key files and security dongles</source> + <translation>Zapamiętaj ostatnie pliki klucze i klucze sprzętowe</translation> + </message> + <message> + <source>Load previous databases on startup</source> + <translation>Załaduj poprzednie bazy danych podczas uruchomienia</translation> + </message> <message> <source>Automatically save on exit</source> <translation>Automatycznie zapisz przy wyjściu</translation> @@ -2095,21 +3565,29 @@ nadaj unikatową nazwę do zidentyfikowania i zaakceptuj.</translation> <source>Automatically save after every change</source> <translation>Automatycznie zapisz po każdej zmianie</translation> </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation>Automatycznie przeładuj bazę danych, gdy zostanie zmodyfikowana zewnętrznie</translation> + </message> <message> <source>Minimize when copying to clipboard</source> <translation>Zminimalizuj po skopiowaniu do schowka</translation> </message> + <message> + <source>Minimize window at application startup</source> + <translation>Minimalizuj okno podczas uruchomienia aplikacji</translation> + </message> <message> <source>Use group icon on entry creation</source> <translation>Użyj ikony grupy podczas tworzenia wpisu</translation> </message> <message> - <source>Global Auto-Type shortcut</source> - <translation>Globalny skrót auto-uzupełnianie</translation> + <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> + <translation>Nie zaznaczaj bazy danych jako zmodyfikowanej dla zmian innych niż dane (np. rozwijanie grup)</translation> </message> <message> - <source>Language</source> - <translation>Język</translation> + <source>Hide the Details view</source> + <translation type="unfinished"/> </message> <message> <source>Show a system tray icon</source> @@ -2119,67 +3597,61 @@ nadaj unikatową nazwę do zidentyfikowania i zaakceptuj.</translation> <source>Hide window to system tray when minimized</source> <translation>Schowaj okno do zasobnika podczas minimalizacji</translation> </message> - <message> - <source>Load previous databases on startup</source> - <translation>Załaduj poprzednie bazy danych podczas uruchomienia</translation> - </message> - <message> - <source>Automatically reload the database when modified externally</source> - <translation>Automatycznie przeładuj bazę danych, gdy zostanie zmodyfikowana zewnętrznie</translation> - </message> <message> <source>Hide window to system tray instead of app exit</source> <translation>Schowaj okno do zasobnika zamiast wyłączenia aplikacji</translation> </message> <message> - <source>Minimize window at application startup</source> - <translation>Minimalizuj okno podczas uruchomienia aplikacji</translation> + <source>Dark system tray icon</source> + <translation type="unfinished"/> </message> <message> - <source>Basic Settings</source> - <translation>Ustawienia podstawowe</translation> - </message> - <message> - <source>Remember last key files and security dongles</source> - <translation>Zapamiętaj ostatnie pliki klucze i klucze sprzętowe</translation> - </message> - <message> - <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> - <translation>Nie zaznaczaj bazy danych jako zmodyfikowanej dla zmian innych niż dane (np. rozwijanie grup)</translation> + <source>Language</source> + <translation>Język</translation> </message> <message> <source>Auto-Type</source> <translation>Auto-uzupełnianie</translation> </message> <message> - <source>Use entry title and URL to match windows for global Auto-Type</source> - <translation>Wykorzystaj tytuł wpisu oraz URL do dopasowania okien dla globalnego auto-uzupełniania</translation> + <source>Use entry title to match windows for global Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use entry URL to match windows for global Auto-Type</source> + <translation type="unfinished"/> </message> <message> <source>Always ask before performing Auto-Type</source> <translation>Zawsze pytaj przed wykonaniem auto-uzupełninia</translation> </message> + <message> + <source>Global Auto-Type shortcut</source> + <translation>Globalny skrót auto-uzupełnianie</translation> + </message> <message> <source>Auto-Type delay</source> <translation>Opóźnienie auto-uzupełniania</translation> </message> <message> <source> ms</source> + <comment>Milliseconds</comment> <translation> ms</translation> </message> - <message> - <source>Start only a single instance of KeePassXC</source> - <translation>Uruchom tylko jedną instancję KeePassXC</translation> - </message> </context> <context> <name>SettingsWidgetSecurity</name> + <message> + <source>Timeouts</source> + <translation>Limity czasowe</translation> + </message> <message> <source>Clear clipboard after</source> <translation>Wyczyść schowek po</translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation>s</translation> </message> <message> @@ -2187,8 +3659,12 @@ nadaj unikatową nazwę do zidentyfikowania i zaakceptuj.</translation> <translation>Zablokuj bazę danych po nieaktywności</translation> </message> <message> - <source>Show passwords in cleartext by default</source> - <translation>Domyślnie pokazuj hasła</translation> + <source>Convenience</source> + <translation>Poręczność</translation> + </message> + <message> + <source>Lock databases when session is locked or lid is closed</source> + <translation>Zablokuj bazy danych, gdy sesja jest zablokowana albo pokrywa jest zamknięta</translation> </message> <message> <source>Lock databases after minimizing the window</source> @@ -2199,16 +3675,16 @@ nadaj unikatową nazwę do zidentyfikowania i zaakceptuj.</translation> <translation>Nie wymagaj powtarzania hasła, gdy jest widoczne</translation> </message> <message> - <source>Timeouts</source> - <translation>Limity czasowe</translation> + <source>Show passwords in cleartext by default</source> + <translation>Domyślnie pokazuj hasła</translation> </message> <message> - <source>Convenience</source> - <translation>Poręczność</translation> + <source>Hide passwords in the preview panel</source> + <translation type="unfinished"/> </message> <message> - <source>Lock databases when session is locked or lid is closed</source> - <translation>Zablokuj bazy danych, gdy sesja jest zablokowana albo pokrywa jest zamknięta</translation> + <source>Hide entry notes by default</source> + <translation type="unfinished"/> </message> <message> <source>Privacy</source> @@ -2229,6 +3705,14 @@ nadaj unikatową nazwę do zidentyfikowania i zaakceptuj.</translation> <source>Key:</source> <translation>Klucz:</translation> </message> + <message> + <source>Default RFC 6238 token settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Steam token settings</source> + <translation type="unfinished"/> + </message> <message> <source>Use custom settings</source> <translation>Użyj niestandardowych ustawień</translation> @@ -2255,6 +3739,7 @@ nadaj unikatową nazwę do zidentyfikowania i zaakceptuj.</translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation>s</translation> </message> </context> @@ -2321,6 +3806,26 @@ nadaj unikatową nazwę do zidentyfikowania i zaakceptuj.</translation> </context> <context> <name>main</name> + <message> + <source>Remove an entry from the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>Ścieżka bazy danych.</translation> + </message> + <message> + <source>Path of the entry to remove.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation>KeePassXC - wieloplatformowy menedżer haseł</translation> + </message> + <message> + <source>filenames of the password databases to open (*.kdbx)</source> + <translation>nazwy plików baz danych haseł do otwarcia (*.kdbx)</translation> + </message> <message> <source>path to a custom config file</source> <translation>ścieżka do pliku z ustawieniami</translation> @@ -2329,81 +3834,13 @@ nadaj unikatową nazwę do zidentyfikowania i zaakceptuj.</translation> <source>key file of the database</source> <translation>plik klucza bazy danych</translation> </message> - <message> - <source>KeePassXC - cross-platform password manager</source> - <translation>KeePassXC - wieloplatformowy menedżer haseł</translation> - </message> <message> <source>read password of the database from stdin</source> <translation>odczytaj hasło bazy danych z stdin</translation> </message> <message> - <source>filenames of the password databases to open (*.kdbx)</source> - <translation>nazwy plików baz danych haseł do otwarcia (*.kdbx)</translation> - </message> - <message> - <source>Copy a password to the clipboard</source> - <translation>Skopiuj hasło do schowka</translation> - </message> - <message> - <source>Path of the database.</source> - <translation>Ścieżka bazy danych.</translation> - </message> - <message> - <source>Use a GUI prompt unlocking the database.</source> - <translation>Użyj graficznego interfejsu, aby odblokować bazę danych.</translation> - </message> - <message> - <source>Name of the entry to clip.</source> - <translation>Nazwa wpisu do wycięcia.</translation> - </message> - <message> - <source>Extract and print the content of a database.</source> - <translation>Wyodrębnij i drukuj zawartość bazy danych.</translation> - </message> - <message> - <source>Path of the database to extract.</source> - <translation>Ścieżka bazy danych do wyodrębnienia.</translation> - </message> - <message> - <source>Name of the command to execute.</source> - <translation>Nazwa polecenia do wykonania.</translation> - </message> - <message> - <source>List database entries.</source> - <translation>Wypisz wpisy bazy danych.</translation> - </message> - <message> - <source>Path of the group to list. Default is /</source> - <translation>Ścieżka grupy do wymienienia. Domyślna to /</translation> - </message> - <message> - <source>Print the UUIDs of the entries and groups.</source> - <translation>Pokaż UUID-y wpisów i grup.</translation> - </message> - <message> - <source>Merge two databases.</source> - <translation>Połącz dwie bazy danych.</translation> - </message> - <message> - <source>Path of the database to merge into.</source> - <translation>Ścieżka bazy danych, do której scalić.</translation> - </message> - <message> - <source>Path of the database to merge from.</source> - <translation>Ścieżka bazy danych, z której scalić.</translation> - </message> - <message> - <source>Use the same password for both database files.</source> - <translation>Użyj tego samego hasła dla obu plików bazy danych.</translation> - </message> - <message> - <source>Show a password.</source> - <translation>Pokaż hasło.</translation> - </message> - <message> - <source>Name of the entry to show.</source> - <translation>Nazwa wpisu do pokazania.</translation> + <source>Parent window handle</source> + <translation type="unfinished"/> </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_pt_BR.ts b/share/translations/keepassx_pt_BR.ts index 1ea54d854..c842ae335 100644 --- a/share/translations/keepassx_pt_BR.ts +++ b/share/translations/keepassx_pt_BR.ts @@ -9,14 +9,34 @@ <source>About</source> <translation>Sobre</translation> </message> + <message> + <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> + <translation>Reporte erros em: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> + </message> + <message> + <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>KeePassXC é distribuído nos termos da Licença Pública Geral (GPL), versão 2 ou (à sua escolha) versão 3, do GNU.</translation> + </message> + <message> + <source>Project Maintainers:</source> + <translation>Mantedores do Projeto:</translation> + </message> <message> <source>Contributors</source> <translation>Colaboradores</translation> </message> + <message> + <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Ver Colaborações no GitHub</a></translation> + </message> <message> <source>Debug Info</source> <translation>Informações de Depuração</translation> </message> + <message> + <source>Include the following information whenever you report a bug:</source> + <translation>Inclua as informações abaixo quando reportar um erro:</translation> + </message> <message> <source>Copy to clipboard</source> <translation>Copiar para a área de transferência</translation> @@ -31,6 +51,10 @@ <source>Revision: %1</source> <translation>Revisão: %1</translation> </message> + <message> + <source>Distribution: %1</source> + <translation type="unfinished"/> + </message> <message> <source>Libraries:</source> <translation>Bibliotecas:</translation> @@ -47,33 +71,13 @@ Kernel: %3 %4</translation> <source>Enabled extensions:</source> <translation>Extensões habilitadas:</translation> </message> - <message> - <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> - <translation>Reporte erros em: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> - </message> - <message> - <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassXC é distribuído nos termos da Licença Pública Geral (GPL), versão 2 ou (à sua escolha) versão 3, do GNU.</translation> - </message> - <message> - <source>Project Maintainers:</source> - <translation>Mantedores do Projeto:</translation> - </message> - <message> - <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Ver Colaborações no GitHub</a></translation> - </message> - <message> - <source>Include the following information whenever you report a bug:</source> - <translation>Inclua as informações abaixo quando reportar um erro:</translation> - </message> - <message> - <source>Distribution: %1</source> - <translation type="unfinished"/> - </message> </context> <context> <name>AccessControlDialog</name> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>KeePassXC HTTP Confirmar Acesso</translation> + </message> <message> <source>Remember this decision</source> <translation>Lembrar esta escolha</translation> @@ -92,9 +96,12 @@ Please select whether you want to allow access.</source> <translation>%1 solicitou acesso a senhas para o(s) seguinte(s) iten(s). Selecione se deseja permitir o acesso.</translation> </message> +</context> +<context> + <name>AgentSettingsWidget</name> <message> - <source>KeePassXC HTTP Confirm Access</source> - <translation>KeePassXC HTTP Confirmar Acesso</translation> + <source>Enable SSH Agent (requires restart)</source> + <translation>Habilitar Agente SSH (requer reinicialização)</translation> </message> </context> <context> @@ -107,6 +114,26 @@ Selecione se deseja permitir o acesso.</translation> <source>Auto-Type - KeePassXC</source> <translation>Auto-Digitação - KeePassXC</translation> </message> + <message> + <source>Auto-Type</source> + <translation>Auto-Digitação</translation> + </message> + <message> + <source>The Syntax of your Auto-Type statement is incorrect!</source> + <translation>A sintaxe da sua sequência de Auto-Digitação está incorreta!</translation> + </message> + <message> + <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> + <translation>Este comando de Auto-Digitação contém um tempo de espera muito longo. Você tem certeza que deseja continuar?</translation> + </message> + <message> + <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> </context> <context> <name>AutoTypeAssociationsModel</name> @@ -125,13 +152,290 @@ Selecione se deseja permitir o acesso.</translation> </context> <context> <name>AutoTypeSelectDialog</name> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>Auto-Digitação - KeePassXC</translation> + </message> <message> <source>Select entry to Auto-Type:</source> <translation>Escolha uma entrada para Auto-Digitar:</translation> </message> +</context> +<context> + <name>BrowserAccessControlDialog</name> <message> - <source>Auto-Type - KeePassXC</source> - <translation>Auto-Digitação - KeePassXC</translation> + <source>KeePassXC-Browser Confirm Access</source> + <translation>KeePassXC-Browser Confirmar Acesso</translation> + </message> + <message> + <source>Remember this decision</source> + <translation>Lembrar esta escolha</translation> + </message> + <message> + <source>Allow</source> + <translation>Permitir</translation> + </message> + <message> + <source>Deny</source> + <translation>Negar</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 solicitou acesso a senhas para o(s) seguinte(s) iten(s). +Selecione se deseja permitir o acesso.</translation> + </message> +</context> +<context> + <name>BrowserOptionDialog</name> + <message> + <source>Dialog</source> + <translation>Diálogo</translation> + </message> + <message> + <source>This is required for accessing your databases with KeePassXC-Browser</source> + <translation>Isso é necessário para acessar os seus bancos de dados usando o KeePassXC-Browser</translation> + </message> + <message> + <source>Enable KeepassXC browser integration</source> + <translation>Habilitar integração do KeepassXC com navegadores</translation> + </message> + <message> + <source>General</source> + <translation>Geral</translation> + </message> + <message> + <source>Enable integration for these browsers:</source> + <translation>Habilitar integração para estes navegadores:</translation> + </message> + <message> + <source>&Google Chrome</source> + <translation>&Google Chrome</translation> + </message> + <message> + <source>&Firefox</source> + <translation>&Firefox</translation> + </message> + <message> + <source>&Chromium</source> + <translation>&Chromium</translation> + </message> + <message> + <source>&Vivaldi</source> + <translation>&Vivaldi</translation> + </message> + <message> + <source>Show a &notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Pe&dir para desbloquear a base de dados se estiver bloqueada</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Match URL scheme (e.g., https://...)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return only best-matching credentials</source> + <translation type="unfinished"/> + </message> + <message> + <source>Sort &matching credentials by title</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Sort matching credentials by &username</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>&Disconnect all browsers</source> + <translation>&Desconectar todos os navegadores</translation> + </message> + <message> + <source>Forget all remembered &permissions</source> + <translation type="unfinished"/> + </message> + <message> + <source>Advanced</source> + <translation>Avançado</translation> + </message> + <message> + <source>Never &ask before accessing credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Never ask before &updating credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searc&h in all opened databases for matching credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>Criação automática ou atualizações não são suportadas para os valores dos campos.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>&Mostrar também campos avançados que começam com "KPH: "</translation> + </message> + <message> + <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Update &native messaging manifest files at startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Support a proxy application between KeePassXC and browser extension.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &proxy application between KeePassXC and browser extension</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a custom proxy location if you installed a proxy manually.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &custom proxy location</source> + <comment>Meant is the proxy for KeePassXC-Browser</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Navegar...</translation> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*.exe);;All Files (*.*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*)</source> + <translation>Arquivos Executáveis (*)</translation> + </message> + <message> + <source>Select custom proxy location</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>BrowserService</name> + <message> + <source>KeePassXC: New key association request</source> + <translation>KeePassXC: Nova associação de chaves requisitada</translation> + </message> + <message> + <source>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Save and allow access</source> + <translation>Salvar e permitir acesso</translation> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: Substituir chave existente?</translation> + </message> + <message> + <source>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: Atualizar entrada</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Deseja atualizar as informações em %1 - %2?</translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: Banco de dados bloqueado!</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>A base de dados ativa está bloqueada! +Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.</translation> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: Configurações não disponíveis!</translation> + </message> + <message> + <source>The active database does not contain a settings entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: Nenhuma chave localizada</translation> + </message> + <message> + <source>No shared encryption keys found in KeePassXC Settings.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: Chaves removidas do banco de dados</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Removing stored permissions…</source> + <translation>Removendo permissões armazenadas...</translation> + </message> + <message> + <source>Abort</source> + <translation>Cancelar</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: Permissões removidas</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entry(s).</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation>KeePassXC: Nenhuma entrada com permissões localizada!</translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>A base de dados ativa não contém uma entrada com permissões.</translation> </message> </context> <context> @@ -148,6 +452,10 @@ Selecione se deseja permitir o acesso.</translation> <source>Repeat password:</source> <translation>Repita senha:</translation> </message> + <message> + <source>&Key file</source> + <translation>&Arquivo-Chave</translation> + </message> <message> <source>Browse</source> <translation>Navegar</translation> @@ -156,13 +464,21 @@ Selecione se deseja permitir o acesso.</translation> <source>Create</source> <translation>Criar</translation> </message> + <message> + <source>Cha&llenge Response</source> + <translation type="unfinished"/> + </message> + <message> + <source>Refresh</source> + <translation>Atualizar</translation> + </message> <message> <source>Key files</source> - <translation>Arquivos-Chave</translation> + <translation>Arquivos-chave</translation> </message> <message> <source>All files</source> - <translation>Todos os Arquivos</translation> + <translation>Todos arquivos</translation> </message> <message> <source>Create Key File...</source> @@ -176,6 +492,10 @@ Selecione se deseja permitir o acesso.</translation> <source>Select a key file</source> <translation>Escolha um arquivo-chave</translation> </message> + <message> + <source>Empty password</source> + <translation>Senha vazia</translation> + </message> <message> <source>Do you really want to use an empty string as password?</source> <translation>Você realmente quer usar uma sequência vazia como senha?</translation> @@ -191,20 +511,15 @@ Selecione se deseja permitir o acesso.</translation> %2</translation> </message> <message> - <source>&Key file</source> - <translation>&Arquivo-Chave</translation> - </message> - <message> - <source>Cha&llenge Response</source> + <source>Legacy key file format</source> <translation type="unfinished"/> </message> <message> - <source>Refresh</source> - <translation>Atualizar</translation> - </message> - <message> - <source>Empty password</source> - <translation>Senha vazia</translation> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -217,6 +532,10 @@ Selecione se deseja permitir o acesso.</translation> <source>Clone Options</source> <translation>Opções de Clonagem</translation> </message> + <message> + <source>Append ' - Clone' to title</source> + <translation type="unfinished"/> + </message> <message> <source>Replace username and password with references</source> <translation>Substituir o usuário e senha com referências</translation> @@ -225,10 +544,6 @@ Selecione se deseja permitir o acesso.</translation> <source>Copy history</source> <translation>Copiar histórico</translation> </message> - <message> - <source>Append ' - Clone' to title</source> - <translation type="unfinished"/> - </message> </context> <context> <name>CsvImportWidget</name> @@ -258,15 +573,15 @@ Selecione se deseja permitir o acesso.</translation> </message> <message> <source>Fields are separated by</source> - <translation type="unfinished"/> + <translation>Campos são separados por</translation> </message> <message> <source>Comments start with</source> - <translation type="unfinished"/> + <translation>Comentários começam com</translation> </message> <message> <source>First record has field names</source> - <translation type="unfinished"/> + <translation>O primeiro registro contém os nomes dos campos</translation> </message> <message> <source>Number of headers line to discard</source> @@ -282,15 +597,15 @@ Selecione se deseja permitir o acesso.</translation> </message> <message> <source>Column layout</source> - <translation type="unfinished"/> + <translation>Organização das colunas</translation> </message> <message> <source>Not present in CSV file</source> - <translation type="unfinished"/> + <translation>Não existe no arquivo CSV</translation> </message> <message> <source>Empty fieldname </source> - <translation type="unfinished"/> + <translation>Nome de campo vazio</translation> </message> <message> <source>column </source> @@ -324,10 +639,6 @@ Selecione se deseja permitir o acesso.</translation> </context> <context> <name>CsvImportWizard</name> - <message> - <source>Import CSV file</source> - <translation>Importar arquivo CSV</translation> - </message> <message> <source>Error</source> <translation>Erro</translation> @@ -339,17 +650,17 @@ Selecione se deseja permitir o acesso.</translation> </context> <context> <name>CsvParserModel</name> - <message> - <source> byte, </source> - <translation type="unfinished"/> + <message numerus="yes"> + <source>%n byte(s), </source> + <translation><numerusform>%n byte(s), </numerusform><numerusform>%n byte(s), </numerusform></translation> </message> - <message> - <source> rows, </source> - <translation type="unfinished"/> + <message numerus="yes"> + <source>%n row(s), </source> + <translation><numerusform>%n linha(s), </numerusform><numerusform>%n linha(s), </numerusform></translation> </message> - <message> - <source> columns</source> - <translation>colunas</translation> + <message numerus="yes"> + <source>%n column(s)</source> + <translation><numerusform>%n coluna(s)</numerusform><numerusform>%n coluna(s)</numerusform></translation> </message> </context> <context> @@ -370,17 +681,40 @@ Selecione se deseja permitir o acesso.</translation> <source>Browse</source> <translation>Navegar</translation> </message> + <message> + <source>Refresh</source> + <translation>Atualizar</translation> + </message> + <message> + <source>Challenge Response:</source> + <translation type="unfinished"/> + </message> <message> <source>Unable to open the database.</source> <translation>Não foi possível abrir o banco de dados.</translation> </message> <message> <source>Can't open key file</source> - <translation>Não foi possível abrir o arquivo-chave</translation> + <translation>Não foi possível abrir arquivo-chave</translation> + </message> + <message> + <source>Legacy key file format</source> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't show this warning again</source> + <translation type="unfinished"/> </message> <message> <source>All files</source> - <translation>Todos os arquivos</translation> + <translation>Todos arquivos</translation> </message> <message> <source>Key files</source> @@ -390,14 +724,6 @@ Selecione se deseja permitir o acesso.</translation> <source>Select key file</source> <translation>Escolha o arquivo-chave</translation> </message> - <message> - <source>Refresh</source> - <translation>Atualizar</translation> - </message> - <message> - <source>Challenge Response:</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DatabaseRepairWidget</name> @@ -413,14 +739,14 @@ Selecione se deseja permitir o acesso.</translation> <source>Can't open key file</source> <translation>Não foi possível abrir arquivo-chave</translation> </message> - <message> - <source>Database opened fine. Nothing to do.</source> - <translation>Banco de dados aberto com sucesso. Nada para fazer.</translation> - </message> <message> <source>Unable to open the database.</source> <translation>Não foi possível abrir o banco de dados.</translation> </message> + <message> + <source>Database opened fine. Nothing to do.</source> + <translation>Banco de dados aberto com sucesso. Nada para fazer.</translation> + </message> <message> <source>Success</source> <translation>Sucesso</translation> @@ -438,6 +764,102 @@ Você pode salvá-lo agora.</translation> </context> <context> <name>DatabaseSettingsWidget</name> + <message> + <source>General</source> + <translation>Geral</translation> + </message> + <message> + <source>Encryption</source> + <translation>Encriptação</translation> + </message> + <message> + <source>Number of rounds too high</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Understood, keep number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cancel</source> + <translation>Cancelar</translation> + </message> + <message> + <source>Number of rounds too low</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</source> + <translation type="unfinished"/> + </message> + <message> + <source>KDF unchanged</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetEncryption</name> + <message> + <source>Encryption Algorithm:</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES: 256 Bit (default)</source> + <translation>AES: 256 Bit (padrão)</translation> + </message> + <message> + <source>Twofish: 256 Bit</source> + <translation>Twofish: 256 Bit</translation> + </message> + <message> + <source>Key Derivation Function:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Transform rounds:</source> + <translation>Rodadas de transformação:</translation> + </message> + <message> + <source>Benchmark 1-second delay</source> + <translation type="unfinished"/> + </message> + <message> + <source>Memory Usage:</source> + <translation>Uso de Memória:</translation> + </message> + <message> + <source> MB</source> + <translation>MB</translation> + </message> + <message> + <source>Parallelism:</source> + <translation>Paralelismo:</translation> + </message> + <message> + <source> thread</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetGeneral</name> + <message> + <source>Database Meta Data</source> + <translation type="unfinished"/> + </message> <message> <source>Database name:</source> <translation>Nome do banco de dados:</translation> @@ -446,21 +868,13 @@ Você pode salvá-lo agora.</translation> <source>Database description:</source> <translation>Descrição do banco de dados:</translation> </message> - <message> - <source>Transform rounds:</source> - <translation>Rodadas de transformação:</translation> - </message> <message> <source>Default username:</source> <translation>Usuário padrão:</translation> </message> <message> - <source> MiB</source> - <translation> MB</translation> - </message> - <message> - <source>Benchmark</source> - <translation>Benchmark</translation> + <source>History Settings</source> + <translation>Configurações de Histórico</translation> </message> <message> <source>Max. history items:</source> @@ -470,36 +884,29 @@ Você pode salvá-lo agora.</translation> <source>Max. history size:</source> <translation>Tamanho máx. do histórico:</translation> </message> + <message> + <source> MiB</source> + <translation> MB</translation> + </message> <message> <source>Use recycle bin</source> <translation>Usar lixeira</translation> </message> - <message> - <source>AES: 256 Bit (default)</source> - <translation type="unfinished"/> - </message> - <message> - <source>Twofish: 256 Bit</source> - <translation type="unfinished"/> - </message> - <message> - <source>Algorithm:</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DatabaseTabWidget</name> <message> <source>Root</source> - <translation>Raiz</translation> + <comment>Root group</comment> + <translation>Raíz</translation> </message> <message> <source>KeePass 2 Database</source> - <translation>Banco de Dados KeePass 2</translation> + <translation>Banco de dados Keepass 2</translation> </message> <message> <source>All files</source> - <translation>Todos os arquivos</translation> + <translation>Todos arquivos</translation> </message> <message> <source>Open database</source> @@ -509,6 +916,30 @@ Você pode salvá-lo agora.</translation> <source>File not found!</source> <translation>Arquivo não localizado!</translation> </message> + <message> + <source>Unable to open the database.</source> + <translation>Não foi possível abrir o banco de dados.</translation> + </message> + <message> + <source>File opened in read only mode.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Open CSV file</source> + <translation>Abrir arquivo CSV</translation> + </message> + <message> + <source>CSV file</source> + <translation>Arquivo CSV</translation> + </message> + <message> + <source>All files (*)</source> + <translation>Todos os arquivos (*)</translation> + </message> + <message> + <source>Merge database</source> + <translation>Juntar banco de dados</translation> + </message> <message> <source>Open KeePass 1 database</source> <translation>Abrir banco de dados KeePass 1</translation> @@ -517,14 +948,16 @@ Você pode salvá-lo agora.</translation> <source>KeePass 1 database</source> <translation>Banco de dados KeePass 1</translation> </message> - <message> - <source>All files (*)</source> - <translation>Todos os arquivos (*)</translation> - </message> <message> <source>Close?</source> <translation>Fechar?</translation> </message> + <message> + <source>"%1" is in edit mode. +Discard changes and close anyway?</source> + <translation>"%1" está em modo de edição. +Descartar alterações e fechar mesmo assim?</translation> + </message> <message> <source>Save changes?</source> <translation>Salvar alterações?</translation> @@ -537,12 +970,24 @@ Salvar alterações?</translation> </message> <message> <source>Writing the database failed.</source> - <translation>Escrever no banco de dados falhou.</translation> + <translation>Escrita do banco de dados falhou.</translation> + </message> + <message> + <source>Passwords</source> + <translation>Senhas</translation> </message> <message> <source>Save database as</source> <translation>Salvar banco de dados como</translation> </message> + <message> + <source>Export database to CSV file</source> + <translation>Exportar banco de dados para arquivo CSV</translation> + </message> + <message> + <source>Writing the CSV file failed.</source> + <translation>Falha ao gravar arquivo CSV.</translation> + </message> <message> <source>New database</source> <translation>Novo banco de dados</translation> @@ -560,12 +1005,6 @@ Salvar alterações?</translation> Please press cancel to finish your changes or discard them.</source> <translation>Não é possível trancar o banco de dados uma vez que você o está editando. Por favor, aperte cancelar para finalizar suas alterações ou descartá-las.</translation> - </message> - <message> - <source>This database has never been saved. -You can save the database or stop locking it.</source> - <translation>Esse banco de dados nunca foi salvo. -Você pode salvar o banco de dados ou parar de trancá-lo.</translation> </message> <message> <source>This database has been modified. @@ -575,72 +1014,16 @@ Otherwise your changes are lost.</source> Você deseja salvar o banco de dados antes de travá-lo? Do contrário, suas alterações serão perdidas.</translation> </message> - <message> - <source>"%1" is in edit mode. -Discard changes and close anyway?</source> - <translation>"%1" está em modo de edição. -Descartar alterações e fechar mesmo assim?</translation> - </message> - <message> - <source>Export database to CSV file</source> - <translation>Exportar banco de dados para arquivo CSV</translation> - </message> - <message> - <source>CSV file</source> - <translation>Arquivo CSV</translation> - </message> - <message> - <source>Writing the CSV file failed.</source> - <translation>Falha ao gravar arquivo CSV.</translation> - </message> - <message> - <source>Unable to open the database.</source> - <translation>Não foi possível abrir o banco de dados.</translation> - </message> - <message> - <source>Merge database</source> - <translation>Juntar banco de dados</translation> - </message> - <message> - <source>The database you are trying to save as is locked by another instance of KeePassXC. -Do you want to save it anyway?</source> - <translation>A base de dados que você está tentando abrir está bloqueada por outra instância de KeePassXC. -Mesmo assim deseja salvá-la?</translation> - </message> - <message> - <source>Passwords</source> - <translation>Senhas</translation> - </message> - <message> - <source>Database already opened</source> - <translation>Banco de dados já aberto</translation> - </message> - <message> - <source>The database you are trying to open is locked by another instance of KeePassXC. - -Do you want to open it anyway?</source> - <translation>O banco de dados que você está tentando abrir está bloqueada por outra instância do KeePassXC. - -Mesmo assim deseja salvá-la?</translation> - </message> - <message> - <source>Open read-only</source> - <translation>Abrir somente leitura</translation> - </message> - <message> - <source>File opened in read only mode.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Open CSV file</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DatabaseWidget</name> + <message> + <source>Searching...</source> + <translation>Pesquisando...</translation> + </message> <message> <source>Change master key</source> - <translation>Alterar chave mestra</translation> + <translation>Alterar chave-mestra</translation> </message> <message> <source>Delete entry?</source> @@ -658,13 +1041,33 @@ Mesmo assim deseja salvá-la?</translation> <source>Do you really want to delete %1 entries for good?</source> <translation>Você realmente quer apagar %1 entradas para sempre?</translation> </message> + <message> + <source>Move entry to recycle bin?</source> + <translation>Mover entrada para a lixeira?</translation> + </message> + <message> + <source>Do you really want to move entry "%1" to the recycle bin?</source> + <translation>Pretende realmente mover a entrada "%1" para a lixeira?</translation> + </message> <message> <source>Move entries to recycle bin?</source> <translation>Mover entradas para lixeira?</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>Você realmente deseja mover %n entrada para a lixeira?</numerusform><numerusform>Você realmente deseja mover %n entradas para a lixeira?</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Execute command?</source> + <translation>Executar comando?</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation>Você quer realmente executar o comando seguinte?<br><br>%1<br></translation> + </message> + <message> + <source>Remember my choice</source> + <translation>Lembrar minha escolha</translation> </message> <message> <source>Delete group?</source> @@ -676,19 +1079,7 @@ Mesmo assim deseja salvá-la?</translation> </message> <message> <source>Unable to calculate master key</source> - <translation>Não foi possível calcular chave mestra</translation> - </message> - <message> - <source>Move entry to recycle bin?</source> - <translation>Mover entrada para a lixeira?</translation> - </message> - <message> - <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation>Pretende realmente mover a entrada "%1" para a lixeira?</translation> - </message> - <message> - <source>Searching...</source> - <translation>Pesquisando...</translation> + <translation>Não foi possível calcular a chave mestre</translation> </message> <message> <source>No current database.</source> @@ -707,20 +1098,8 @@ Mesmo assim deseja salvá-la?</translation> <translation>Sem Resultados</translation> </message> <message> - <source>Execute command?</source> - <translation>Executar comando?</translation> - </message> - <message> - <source>Do you really want to execute the following command?<br><br>%1<br></source> - <translation>Você quer realmente executar o comando seguinte?<br><br>%1<br></translation> - </message> - <message> - <source>Remember my choice</source> - <translation>Lembrar minha escolha</translation> - </message> - <message> - <source>Autoreload Request</source> - <translation>Recarregar Automaticamente Pedido</translation> + <source>File has changed</source> + <translation type="unfinished"/> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -731,8 +1110,9 @@ Mesmo assim deseja salvá-la?</translation> <translation>Juntar Pedido</translation> </message> <message> - <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> - <translation>A base de dados foi alterada e tem alterações não gravadas. Deseja juntar as suas alterações?</translation> + <source>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</source> + <translation type="unfinished"/> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -747,6 +1127,89 @@ Mesmo assim deseja salvá-la?</translation> <translation type="unfinished"/> </message> </context> +<context> + <name>DetailsWidget</name> + <message> + <source>Generate TOTP Token</source> + <translation>Gerar Token TOTP</translation> + </message> + <message> + <source>Close</source> + <translation>Fechar</translation> + </message> + <message> + <source>General</source> + <translation>Geral</translation> + </message> + <message> + <source>Password</source> + <translation>Senha</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Expiration</source> + <translation>Expiração</translation> + </message> + <message> + <source>Username</source> + <translation>Nome de usuário</translation> + </message> + <message> + <source>Autotype</source> + <translation>Auto-Digitação</translation> + </message> + <message> + <source>Searching</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attributes</source> + <translation>Atributos</translation> + </message> + <message> + <source>Attachments</source> + <translation>Anexos</translation> + </message> + <message> + <source>Notes</source> + <translation>Notas</translation> + </message> + <message> + <source>Window</source> + <translation>Janela</translation> + </message> + <message> + <source>Sequence</source> + <translation>Sequência</translation> + </message> + <message> + <source>Search</source> + <translation>Pesquisar</translation> + </message> + <message> + <source>Clear</source> + <translation>Limpar</translation> + </message> + <message> + <source>Never</source> + <translation>Nunca</translation> + </message> + <message> + <source>[PROTECTED]</source> + <translation>[PROTEGIDO]</translation> + </message> + <message> + <source>Disabled</source> + <translation>Desabilitado</translation> + </message> + <message> + <source>Enabled</source> + <translation>Habilitado</translation> + </message> +</context> <context> <name>EditEntryWidget</name> <message> @@ -773,6 +1236,30 @@ Mesmo assim deseja salvá-la?</translation> <source>History</source> <translation>Histórico</translation> </message> + <message> + <source>SSH Agent</source> + <translation>Agente SSH</translation> + </message> + <message> + <source>n/a</source> + <translation>n/d</translation> + </message> + <message> + <source>(encrypted)</source> + <translation>(criptografado)</translation> + </message> + <message> + <source>Select private key</source> + <translation>Escolha uma chave privada</translation> + </message> + <message> + <source>File too large to be a private key</source> + <translation>Este arquivo é muito grande para ser uma chave privada</translation> + </message> + <message> + <source>Failed to open private key</source> + <translation>Falha ao abrir chave privada</translation> + </message> <message> <source>Entry history</source> <translation>Histórico de Entradas</translation> @@ -794,22 +1281,20 @@ Mesmo assim deseja salvá-la?</translation> <translation>Novo atributo</translation> </message> <message> - <source>Select file</source> - <translation>Selecionar arquivo</translation> + <source>Confirm Remove</source> + <translation>Confirmar Exclusão</translation> </message> <message> - <source>Unable to open file</source> - <translation>Não foi possível abrir o arquivo</translation> + <source>Are you sure you want to remove this attribute?</source> + <translation>Você tem certeza que deseja remover este atributo?</translation> </message> <message> - <source>Save attachment</source> - <translation>Salvar anexo</translation> + <source>[PROTECTED]</source> + <translation>[PROTEGIDO]</translation> </message> <message> - <source>Unable to save the attachment: -</source> - <translation>Não foi possível salvar o anexo: -</translation> + <source>Press reveal to view or edit</source> + <translation>Aperte revelar para ver ou editar</translation> </message> <message> <source>Tomorrow</source> @@ -817,32 +1302,16 @@ Mesmo assim deseja salvá-la?</translation> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation><numerusform>%n semana(s)</numerusform><numerusform>%n semana(s)</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation><numerusform>%n mês</numerusform><numerusform>%n mese(s)</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> <message> <source>1 year</source> <translation>1 ano</translation> </message> - <message> - <source>Confirm Remove</source> - <translation type="unfinished"/> - </message> - <message> - <source>Are you sure you want to remove this attribute?</source> - <translation type="unfinished"/> - </message> - <message> - <source>[PROTECTED] Press reveal to view or edit</source> - <translation type="unfinished"/> - </message> - <message> - <source>Are you sure you want to remove this attachment?</source> - <translation type="unfinished"/> - </message> </context> <context> <name>EditEntryWidgetAdvanced</name> @@ -858,18 +1327,6 @@ Mesmo assim deseja salvá-la?</translation> <source>Remove</source> <translation>Remover</translation> </message> - <message> - <source>Attachments</source> - <translation>Anexos</translation> - </message> - <message> - <source>Save</source> - <translation>Salvar</translation> - </message> - <message> - <source>Open</source> - <translation>Abrir</translation> - </message> <message> <source>Edit Name</source> <translation>Editar Nome</translation> @@ -882,6 +1339,10 @@ Mesmo assim deseja salvá-la?</translation> <source>Reveal</source> <translation>Revelar</translation> </message> + <message> + <source>Attachments</source> + <translation>Anexos</translation> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -889,6 +1350,18 @@ Mesmo assim deseja salvá-la?</translation> <source>Enable Auto-Type for this entry</source> <translation>Habilitar Auto-Digitação para esta entrada</translation> </message> + <message> + <source>Inherit default Auto-Type sequence from the &group</source> + <translation>Herdar sequência pré-definida de Auto-Digitação do &grupo</translation> + </message> + <message> + <source>&Use custom Auto-Type sequence:</source> + <translation>&Usar sequência de Auto-Digitação personalizada:</translation> + </message> + <message> + <source>Window Associations</source> + <translation>Associações de Janela</translation> + </message> <message> <source>+</source> <translation>+</translation> @@ -901,14 +1374,6 @@ Mesmo assim deseja salvá-la?</translation> <source>Window title:</source> <translation>Título da Janela:</translation> </message> - <message> - <source>Inherit default Auto-Type sequence from the &group</source> - <translation>Herdar sequência pré-definida de Auto-Digitação do &grupo</translation> - </message> - <message> - <source>&Use custom Auto-Type sequence:</source> - <translation>&Usar sequência de Auto-Digitação personalizada:</translation> - </message> <message> <source>Use default se&quence</source> <translation>Usar se&quência pré-definida</translation> @@ -917,10 +1382,6 @@ Mesmo assim deseja salvá-la?</translation> <source>Set custo&m sequence:</source> <translation>Definir sequência &personalizada:</translation> </message> - <message> - <source>Window Associations</source> - <translation>Associações de Janela</translation> - </message> </context> <context> <name>EditEntryWidgetHistory</name> @@ -944,12 +1405,8 @@ Mesmo assim deseja salvá-la?</translation> <context> <name>EditEntryWidgetMain</name> <message> - <source>Title:</source> - <translation>Título:</translation> - </message> - <message> - <source>Username:</source> - <translation>Nome de Usuário:</translation> + <source>URL:</source> + <translation>URL:</translation> </message> <message> <source>Password:</source> @@ -960,20 +1417,104 @@ Mesmo assim deseja salvá-la?</translation> <translation>Repetir:</translation> </message> <message> - <source>URL:</source> - <translation>URL:</translation> + <source>Title:</source> + <translation>Título:</translation> </message> <message> - <source>Expires</source> - <translation>Expira em</translation> + <source>Notes</source> + <translation>Notas</translation> </message> <message> <source>Presets</source> <translation>Pré-definidos</translation> </message> <message> - <source>Notes:</source> - <translation>Notas:</translation> + <source>Toggle the checkbox to reveal the notes section.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username:</source> + <translation>Nome de Usuário:</translation> + </message> + <message> + <source>Expires</source> + <translation>Expira em</translation> + </message> +</context> +<context> + <name>EditEntryWidgetSSHAgent</name> + <message> + <source>Form</source> + <translation>Formulário</translation> + </message> + <message> + <source>Remove key from agent after</source> + <translation type="unfinished"/> + </message> + <message> + <source> seconds</source> + <translation>segundos</translation> + </message> + <message> + <source>Fingerprint</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent when database is closed/locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Public key</source> + <translation>Chave pública</translation> + </message> + <message> + <source>Add key to agent when database is opened/unlocked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Comment</source> + <translation>Comentário</translation> + </message> + <message> + <source>Decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation>n/d</translation> + </message> + <message> + <source>Copy to clipboard</source> + <translation>Copiar para a área de transferência</translation> + </message> + <message> + <source>Private key</source> + <translation>Chave privada</translation> + </message> + <message> + <source>External file</source> + <translation>Arquivo externo</translation> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Navegar...</translation> + </message> + <message> + <source>Attachment</source> + <translation>Anexo</translation> + </message> + <message> + <source>Add to agent</source> + <translation>Adicionar ao agente</translation> + </message> + <message> + <source>Remove from agent</source> + <translation>Remover do agente</translation> + </message> + <message> + <source>Require user confirmation when this key is used</source> + <translation type="unfinished"/> </message> </context> <context> @@ -1015,7 +1556,7 @@ Mesmo assim deseja salvá-la?</translation> <name>EditGroupWidgetMain</name> <message> <source>Name</source> - <translation>Nom</translation> + <translation>Nome</translation> </message> <message> <source>Notes</source> @@ -1027,7 +1568,7 @@ Mesmo assim deseja salvá-la?</translation> </message> <message> <source>Search</source> - <translation>Buscar</translation> + <translation>Pesquisar</translation> </message> <message> <source>Auto-Type</source> @@ -1044,6 +1585,14 @@ Mesmo assim deseja salvá-la?</translation> </context> <context> <name>EditWidgetIcons</name> + <message> + <source>&Use default icon</source> + <translation>&Usar ícone padrão</translation> + </message> + <message> + <source>Use custo&m icon</source> + <translation>Usar ícone &personalizado</translation> + </message> <message> <source>Add custom icon</source> <translation>Adicionar ícone personalizado</translation> @@ -1052,18 +1601,6 @@ Mesmo assim deseja salvá-la?</translation> <source>Delete custom icon</source> <translation>Excluir ícone personalizado</translation> </message> - <message> - <source>Images</source> - <translation>Imagens</translation> - </message> - <message> - <source>All files</source> - <translation>Todos os arquivos</translation> - </message> - <message> - <source>Select Image</source> - <translation>Selecionar imagem</translation> - </message> <message> <source>Download favicon</source> <translation>Baixar favicon</translation> @@ -1072,17 +1609,29 @@ Mesmo assim deseja salvá-la?</translation> <source>Unable to fetch favicon.</source> <translation>Não foi possível obter favicon.</translation> </message> + <message> + <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> + <translation type="unfinished"/> + </message> + <message> + <source>Images</source> + <translation>Imagens</translation> + </message> + <message> + <source>All files</source> + <translation>Todos arquivos</translation> + </message> + <message> + <source>Select Image</source> + <translation>Selecionar imagem</translation> + </message> <message> <source>Can't read icon</source> <translation>Não foi possível ler ícone</translation> </message> <message> - <source>&Use default icon</source> - <translation>&Usar ícone padrão</translation> - </message> - <message> - <source>Use custo&m icon</source> - <translation>Usar ícone &personalizado</translation> + <source>Custom icon already exists</source> + <translation>Ícone personalizado já existe</translation> </message> <message> <source>Confirm Delete</source> @@ -1092,14 +1641,6 @@ Mesmo assim deseja salvá-la?</translation> <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> <translation type="unfinished"/> </message> - <message> - <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation type="unfinished"/> - </message> - <message> - <source>Custom icon already exists</source> - <translation type="unfinished"/> - </message> </context> <context> <name>EditWidgetProperties</name> @@ -1124,9 +1665,93 @@ Mesmo assim deseja salvá-la?</translation> <name>Entry</name> <message> <source> - Clone</source> + <comment>Suffix added to cloned entries</comment> <translation> - Clone</translation> </message> </context> +<context> + <name>EntryAttachmentsModel</name> + <message> + <source>Name</source> + <translation>Nome</translation> + </message> + <message> + <source>Size</source> + <translation>Tamanho</translation> + </message> +</context> +<context> + <name>EntryAttachmentsWidget</name> + <message> + <source>Form</source> + <translation>Formulário</translation> + </message> + <message> + <source>Add</source> + <translation>Adicionar</translation> + </message> + <message> + <source>Remove</source> + <translation>Remover</translation> + </message> + <message> + <source>Open</source> + <translation>Abrir</translation> + </message> + <message> + <source>Save</source> + <translation>Salvar</translation> + </message> + <message> + <source>Select files</source> + <translation>Selecionar arquivos</translation> + </message> + <message numerus="yes"> + <source>Are you sure you want to remove %n attachment(s)?</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>Confirmar Exclusão</translation> + </message> + <message> + <source>Save attachments</source> + <translation>Salvar anexos</translation> + </message> + <message> + <source>Unable to create directory: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Confirm overwrite</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to save attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachment: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open files: +%1</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EntryAttributesModel</name> <message> @@ -1155,6 +1780,11 @@ Mesmo assim deseja salvá-la?</translation> </context> <context> <name>EntryModel</name> + <message> + <source>Ref: </source> + <comment>Reference abbreviation</comment> + <translation>Ref:</translation> + </message> <message> <source>Group</source> <translation>Grupo</translation> @@ -1171,11 +1801,6 @@ Mesmo assim deseja salvá-la?</translation> <source>URL</source> <translation>URL</translation> </message> - <message> - <source>Ref: </source> - <comment>Reference abbreviation</comment> - <translation>Ref:</translation> - </message> </context> <context> <name>Group</name> @@ -1184,6 +1809,17 @@ Mesmo assim deseja salvá-la?</translation> <translation>Lixeira</translation> </message> </context> +<context> + <name>HostInstaller</name> + <message> + <source>KeePassXC: Cannot save file!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot save the native messaging script file.</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>HttpPasswordGeneratorWidget</name> <message> @@ -1246,6 +1882,358 @@ Mesmo assim deseja salvá-la?</translation> <translation>Fechar mensagem</translation> </message> </context> +<context> + <name>Kdbx3Reader</name> + <message> + <source>Unable to calculate master key</source> + <translation>Não foi possível calcular a chave mestre</translation> + </message> + <message> + <source>Unable to issue challenge-response.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>Chave errada ou base de dados corrompida.</translation> + </message> +</context> +<context> + <name>Kdbx3Writer</name> + <message> + <source>Unable to issue challenge-response.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Não foi possível calcular a chave mestre</translation> + </message> +</context> +<context> + <name>Kdbx4Reader</name> + <message> + <source>missing database headers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Não foi possível calcular a chave mestre</translation> + </message> + <message> + <source>Invalid header checksum size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Header SHA256 mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher</source> + <translation>Cifra desconhecida</translation> + </message> + <message> + <source>Invalid header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header data length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open buffer for KDF parameters in header</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported key derivation function (KDF) or invalid parameters</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy header fields found in KDBX4 file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header binary size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass variant map version.</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name data</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value data</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Bool entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry type</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map field type size</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Kdbx4Writer</name> + <message> + <source>Invalid symmetric cipher algorithm.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid symmetric cipher IV size.</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Não foi possível calcular a chave mestre</translation> + </message> + <message> + <source>Failed to serialize KDF parameters variant map</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxReader</name> + <message> + <source>Invalid cipher uuid length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid compression flags length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported compression algorithm</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid master seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform rounds size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid start bytes size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid random stream id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner random stream cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>Não é um banco de dados KeePass.</translation> + </message> + <message> + <source>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass 2 database version.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxXmlReader</name> + <message> + <source>XML parsing failure: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>No root group</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing icon uuid or data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing custom data key or value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Multiple group elements</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null group uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableAutoType value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableSearching value</source> + <translation type="unfinished"/> + </message> + <message> + <source>No group uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null DeleteObject uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing DeletedObject uuid or time</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null entry uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element in history entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>No entry uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element with different uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decrypt entry string</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate custom attribute found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry string key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate attachment found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry binary key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-type association window or sequence missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid bool value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid date time value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color rgb part</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid uuid value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decompress binary</source> + <extracomment>Translator meant is a binary data inside an entry</extracomment> + <translation type="unfinished"/> + </message> +</context> <context> <name>KeePass1OpenWidget</name> <message> @@ -1273,7 +2261,36 @@ Mesmo assim deseja salvá-la?</translation> </message> <message> <source>Unsupported KeePass database version.</source> - <translation>Versão do banco de dados KeePass não suportada.</translation> + <translation>Versão não suportada do banco de dados KeePass.</translation> + </message> + <message> + <source>Unable to read encryption IV</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of groups</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid content hash size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of transform rounds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to construct group tree</source> + <translation type="unfinished"/> </message> <message> <source>Root</source> @@ -1281,63 +2298,110 @@ Mesmo assim deseja salvá-la?</translation> </message> <message> <source>Unable to calculate master key</source> - <translation>Não foi possível calcular a chave mestra</translation> + <translation>Não foi possível calcular a chave mestre</translation> </message> <message> <source>Wrong key or database file is corrupt.</source> <translation>Chave errada ou base de dados corrompida.</translation> </message> -</context> -<context> - <name>KeePass2Reader</name> <message> - <source>Not a KeePass database.</source> - <translation>Não é um banco de dados KeePass.</translation> - </message> - <message> - <source>Unsupported KeePass database version.</source> - <translation>Versão não suportada do banco de dados KeePass.</translation> - </message> - <message> - <source>Wrong key or database file is corrupt.</source> - <translation>Chave errada ou arquivo de banco de dados está corrompido.</translation> - </message> - <message> - <source>Unable to calculate master key</source> - <translation>Não foi possível calcular a chave mestre</translation> - </message> - <message> - <source>Unable to issue challenge-response.</source> + <source>Key transformation failed</source> <translation type="unfinished"/> </message> <message> - <source>The selected file is an old KeePass 1 database (.kdb). - -You can import it by clicking on Database > 'Import KeePass 1 database...'. -This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> - <translation type="unfinished"/> - </message> -</context> -<context> - <name>KeePass2Writer</name> - <message> - <source>Unable to issue challenge-response.</source> + <source>Invalid group field type number</source> <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>Não foi possível calcular a chave mestre</translation> + <source>Invalid group field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read group field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group access time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group level field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing group id or level</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing entry field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read entry field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry uuid field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field type</source> + <translation type="unfinished"/> </message> </context> <context> <name>Main</name> <message> - <source>Fatal error while testing the cryptographic functions.</source> - <translation>Erro fatal enquanto testava as funções criptográficas.</translation> - </message> - <message> - <source>KeePassXC - Error</source> - <translation>KeePassXC - Erro</translation> + <source>Existing single-instance lock file is invalid. Launching new instance.</source> + <translation type="unfinished"/> </message> <message> <source>The lock file could not be created. Single-instance mode disabled.</source> @@ -1348,64 +2412,32 @@ This is a one-way migration. You won't be able to open the imported databas <translation type="unfinished"/> </message> <message> - <source>Existing single-instance lock file is invalid. Launching new instance.</source> - <translation type="unfinished"/> + <source>Fatal error while testing the cryptographic functions.</source> + <translation>Erro fatal enquanto testava as funções criptográficas.</translation> + </message> + <message> + <source>KeePassXC - Error</source> + <translation>KeePassXC - Erro</translation> </message> </context> <context> <name>MainWindow</name> <message> - <source>Open database</source> - <translation>Abrir banco de dados</translation> - </message> - <message> - <source>Database settings</source> - <translation>Configurações do Banco de Dados</translation> - </message> - <message> - <source>Copy username to clipboard</source> - <translation>Copiar nome de usuário para área de transferência</translation> - </message> - <message> - <source>Copy password to clipboard</source> - <translation>Copiar senha para área de transferência</translation> - </message> - <message> - <source>Settings</source> - <translation>Configurações</translation> - </message> - <message> - <source>Show toolbar</source> - <translation>Mostrar barra de ferramentas</translation> - </message> - <message> - <source>read-only</source> - <translation>somente leitura</translation> - </message> - <message> - <source>Toggle window</source> - <translation>Alternar Janela</translation> - </message> - <message> - <source>KeePass 2 Database</source> - <translation>Banco de dados Keepass 2</translation> - </message> - <message> - <source>All files</source> - <translation>Todos arquivos</translation> - </message> - <message> - <source>Save repaired database</source> - <translation>Salvar banco de dados reparado</translation> - </message> - <message> - <source>Writing the database failed.</source> - <translation>Escrita do banco de dados falhou.</translation> + <source>&Database</source> + <translation>Banco de &dados</translation> </message> <message> <source>&Recent databases</source> <translation>&Bancos de dados recentes</translation> </message> + <message> + <source>Import</source> + <translation>Importar</translation> + </message> + <message> + <source>&Help</source> + <translation type="unfinished"/> + </message> <message> <source>E&ntries</source> <translation>E&ntradas</translation> @@ -1414,13 +2446,17 @@ This is a one-way migration. You won't be able to open the imported databas <source>Copy att&ribute to clipboard</source> <translation>Copiar at&ributo para área de transferência</translation> </message> + <message> + <source>Time-based one-time password</source> + <translation type="unfinished"/> + </message> <message> <source>&Groups</source> <translation>&Grupos</translation> </message> <message> - <source>&View</source> - <translation>&Ver</translation> + <source>&Tools</source> + <translation>&Ferramentas</translation> </message> <message> <source>&Quit</source> @@ -1430,6 +2466,10 @@ This is a one-way migration. You won't be able to open the imported databas <source>&About</source> <translation>&Sobre</translation> </message> + <message> + <source>&Open database...</source> + <translation type="unfinished"/> + </message> <message> <source>&Save database</source> <translation>&Salvar base de dados</translation> @@ -1470,26 +2510,26 @@ This is a one-way migration. You won't be able to open the imported databas <source>&Delete group</source> <translation>&Apagar grupo</translation> </message> + <message> + <source>Sa&ve database as...</source> + <translation type="unfinished"/> + </message> + <message> + <source>Change &master key...</source> + <translation type="unfinished"/> + </message> <message> <source>&Database settings</source> <translation>&Definições da base de dados</translation> </message> + <message> + <source>Database settings</source> + <translation>Configurações do Banco de Dados</translation> + </message> <message> <source>&Clone entry</source> <translation>&Clonar entrada</translation> </message> - <message> - <source>Timed one-time password</source> - <translation>Senha temporária de uso único</translation> - </message> - <message> - <source>Copy &TOTP</source> - <translation>Copiar &TOTP</translation> - </message> - <message> - <source>Show TOTP</source> - <translation>Mostrar TOTP</translation> - </message> <message> <source>&Find</source> <translation>&Encontrar</translation> @@ -1498,14 +2538,26 @@ This is a one-way migration. You won't be able to open the imported databas <source>Copy &username</source> <translation>Copiar nome de &usuário</translation> </message> + <message> + <source>Copy username to clipboard</source> + <translation>Copiar nome de usuário para área de transferência</translation> + </message> <message> <source>Cop&y password</source> <translation>Cop&iar senha</translation> </message> + <message> + <source>Copy password to clipboard</source> + <translation>Copiar senha para área de transferência</translation> + </message> <message> <source>&Settings</source> <translation>&Configurações</translation> </message> + <message> + <source>Password Generator</source> + <translation>Gerador de Senha</translation> + </message> <message> <source>&Perform Auto-Type</source> <translation>&Executar escrita automática</translation> @@ -1522,64 +2574,24 @@ This is a one-way migration. You won't be able to open the imported databas <source>&Title</source> <translation>&Título</translation> </message> + <message> + <source>Copy title to clipboard</source> + <translation type="unfinished"/> + </message> <message> <source>&URL</source> <translation>&URL</translation> </message> + <message> + <source>Copy URL to clipboard</source> + <translation type="unfinished"/> + </message> <message> <source>&Notes</source> <translation>&Notas</translation> </message> <message> - <source>Password Generator</source> - <translation>Gerador de Senha</translation> - </message> - <message> - <source>Clear history</source> - <translation>Limpar histórico</translation> - </message> - <message> - <source>&Database</source> - <translation>Banco de &dados</translation> - </message> - <message> - <source>Import</source> - <translation>Importar</translation> - </message> - <message> - <source>&Tools</source> - <translation>&Ferramentas</translation> - </message> - <message> - <source>Empty recycle bin</source> - <translation>Esvaziar lixeira</translation> - </message> - <message> - <source>Access error for config file %1</source> - <translation type="unfinished"/> - </message> - <message> - <source>Quit KeePassXC</source> - <translation>Fechar KeePassXC</translation> - </message> - <message> - <source>Please touch the button on your YubiKey!</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Help</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Open database...</source> - <translation type="unfinished"/> - </message> - <message> - <source>Sa&ve database as...</source> - <translation type="unfinished"/> - </message> - <message> - <source>Change &master key...</source> + <source>Copy notes to clipboard</source> <translation type="unfinished"/> </message> <message> @@ -1588,7 +2600,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Import KeePass 1 database...</source> - <translation type="unfinished"/> + <translation>Importar banco de dados KeePass1...</translation> </message> <message> <source>Import CSV file...</source> @@ -1596,10 +2608,169 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Re&pair database...</source> - <translation type="unfinished"/> + <translation>Re&parar banco de dados...</translation> + </message> + <message> + <source>Show TOTP</source> + <translation>Mostrar TOTP</translation> </message> <message> <source>Set up TOTP...</source> + <translation>Configurar TOTP...</translation> + </message> + <message> + <source>Copy &TOTP</source> + <translation>Copiar &TOTP</translation> + </message> + <message> + <source>E&mpty recycle bin</source> + <translation>Esvaziar &lixeira</translation> + </message> + <message> + <source>Clear history</source> + <translation>Limpar histórico</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation type="unfinished"/> + </message> + <message> + <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> + <translation type="unfinished"/> + </message> + <message> + <source>read-only</source> + <translation>somente leitura</translation> + </message> + <message> + <source>Settings</source> + <translation>Configurações</translation> + </message> + <message> + <source>Toggle window</source> + <translation>Alternar Janela</translation> + </message> + <message> + <source>Quit KeePassXC</source> + <translation>Fechar KeePassXC</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>Banco de dados Keepass 2</translation> + </message> + <message> + <source>All files</source> + <translation>Todos arquivos</translation> + </message> + <message> + <source>Open database</source> + <translation>Abrir banco de dados</translation> + </message> + <message> + <source>Save repaired database</source> + <translation>Salvar banco de dados reparado</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>Escrita do banco de dados falhou.</translation> + </message> + <message> + <source>Please touch the button on your YubiKey!</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>OpenSSHKey</name> + <message> + <source>Invalid key file, expecting an OpenSSH key</source> + <translation type="unfinished"/> + </message> + <message> + <source>PEM boundary mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>This is not an OpenSSH key, only modern keys are supported</source> + <translation type="unfinished"/> + </message> + <message> + <source>Base64 decoding failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file way too small.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file magic header id invalid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Found zero keys</source> + <translation>Nenhuma chave encontrada</translation> + </message> + <message> + <source>Failed to read public key.</source> + <translation>Falha ao ler chave pública</translation> + </message> + <message> + <source>Corrupted key file, reading private key failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>No private key payload to decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: </source> + <translation>Cifra desconhecida:</translation> + </message> + <message> + <source>Trying to run KDF without cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Passphrase is required to decrypt this key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key derivation failed, key file corrupted?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Decryption failed, wrong passphrase?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write public key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write private key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing private key</source> <translation type="unfinished"/> </message> </context> @@ -1609,22 +2780,63 @@ This is a one-way migration. You won't be able to open the imported databas <source>Dialog</source> <translation>Diálogo</translation> </message> + <message> + <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable KeePassHTTP server</source> + <translation>Habilitar servidor KeePassHTTP</translation> + </message> <message> <source>General</source> <translation>Geral</translation> </message> <message> <source>Sh&ow a notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> <translation>M&ostrar uma notificação quando as credenciais forem solicitadas</translation> </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return only best matching entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Pe&dir para desbloquear a base de dados se estiver bloqueada</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Match URL schemes</source> + <translation type="unfinished"/> + </message> <message> <source>Sort matching entries by &username</source> <translation>Ordenar entradas coincidentes por nome de &usuário</translation> </message> + <message> + <source>Sort &matching entries by title</source> + <translation>Ordenar &entradas por título</translation> + </message> + <message> + <source>R&emove all shared encryption keys from active database</source> + <translation>R&emover todas as chaves criptografadas compartilhadas da base de dados ativa</translation> + </message> <message> <source>Re&move all stored permissions from entries in active database</source> <translation>R&emover todas as permissões armazenadas de entradas na base de dados ativa</translation> </message> + <message> + <source>Password Generator</source> + <translation>Gerador de Senha</translation> + </message> <message> <source>Advanced</source> <translation>Avançado</translation> @@ -1637,10 +2849,22 @@ This is a one-way migration. You won't be able to open the imported databas <source>Always allow &updating entries</source> <translation>Permitir sempre &atualizar as entradas</translation> </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation type="unfinished"/> + </message> <message> <source>Searc&h in all opened databases for matching entries</source> <translation>Procurar em todas as base de dados abertas por entradas semel&hantes</translation> </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>Criação automática ou atualizações não são suportadas para os valores dos campos.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>&Mostrar também campos avançados que começam com "KPH: "</translation> + </message> <message> <source>HTTP Port:</source> <translation>Porta HTTP:</translation> @@ -1649,18 +2873,18 @@ This is a one-way migration. You won't be able to open the imported databas <source>Default port: 19455</source> <translation>Porta padrão: 19455</translation> </message> - <message> - <source>Re&quest to unlock the database if it is locked</source> - <translation>Pe&dir para desbloquear a base de dados se estiver bloqueada</translation> - </message> - <message> - <source>Sort &matching entries by title</source> - <translation>Ordenar &entradas por título</translation> - </message> <message> <source>KeePassXC will listen to this port on 127.0.0.1</source> <translation>KeePassXC irá escutar esta porta em 127.0.0.1</translation> </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> + <translation type="unfinished"/> + </message> <message> <source>Cannot bind to privileged ports</source> <translation>Não é possível ligar a portas privilegiadas</translation> @@ -1671,65 +2895,33 @@ Using default port 19455.</source> <translation>Não é possível ligar a portas privilegiadas abaixo de 1024! Usando porta padrão 19455.</translation> </message> - <message> - <source>R&emove all shared encryption keys from active database</source> - <translation>R&emover todas as chaves criptografadas compartilhadas da base de dados ativa</translation> - </message> - <message> - <source>&Return advanced string fields which start with "KPH: "</source> - <translation>&Mostrar também campos avançados que começam com "KPH: "</translation> - </message> - <message> - <source>Automatically creating or updating string fields is not supported.</source> - <translation>Criação automática ou atualizações não são suportadas para os valores dos campos.</translation> - </message> - <message> - <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> - <translation type="unfinished"/> - </message> - <message> - <source>Enable KeePassHTTP server</source> - <translation>Habilitar servidor KeePassHTTP</translation> - </message> - <message> - <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Return only best matching entries</source> - <translation type="unfinished"/> - </message> - <message> - <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Match URL schemes</source> - <translation type="unfinished"/> - </message> - <message> - <source>Password Generator</source> - <translation>Gerador de Senha</translation> - </message> - <message> - <source>Only the selected database has to be connected with a client.</source> - <translation type="unfinished"/> - </message> - <message> - <source>The following options can be dangerous! -Change them only if you know what you are doing.</source> - <translation type="unfinished"/> - </message> </context> <context> <name>PasswordGeneratorWidget</name> + <message> + <source>%p%</source> + <translation>%p%</translation> + </message> <message> <source>Password:</source> <translation>Senha:</translation> </message> + <message> + <source>strength</source> + <comment>Password strength</comment> + <translation>força</translation> + </message> + <message> + <source>entropy</source> + <translation>entropia</translation> + </message> + <message> + <source>Password</source> + <translation>Senha</translation> + </message> <message> <source>Character Types</source> - <translation>Tipos de Caracteres</translation> + <translation>Tipo de Caracteres</translation> </message> <message> <source>Upper Case Letters</source> @@ -1747,38 +2939,50 @@ Change them only if you know what you are doing.</source> <source>Special Characters</source> <translation>Caracteres Especiais</translation> </message> + <message> + <source>Extended ASCII</source> + <translation type="unfinished"/> + </message> <message> <source>Exclude look-alike characters</source> - <translation>Excluir caracteres similares</translation> - </message> - <message> - <source>Accept</source> - <translation>Aceitar</translation> - </message> - <message> - <source>%p%</source> - <translation>%p%</translation> - </message> - <message> - <source>strength</source> - <translation>força</translation> - </message> - <message> - <source>entropy</source> - <translation>entropia</translation> - </message> - <message> - <source>&Length:</source> - <translation>&Tamanho:</translation> + <translation>Excluir caracteres semelhantes</translation> </message> <message> <source>Pick characters from every group</source> <translation>Selecione caracteres de todos os grupos</translation> </message> + <message> + <source>&Length:</source> + <translation>&Tamanho:</translation> + </message> + <message> + <source>Passphrase</source> + <translation>Senha</translation> + </message> + <message> + <source>Wordlist:</source> + <translation>Lista de palavras:</translation> + </message> + <message> + <source>Word Count:</source> + <translation>Número de Palavras:</translation> + </message> + <message> + <source>Word Separator:</source> + <translation>Separador de Palavras:</translation> + </message> <message> <source>Generate</source> <translation>Gerar</translation> </message> + <message> + <source>Copy</source> + <translation>Copiar</translation> + </message> + <message> + <source>Accept</source> + <translation>Aceitar</translation> + </message> <message> <source>Close</source> <translation>Fechar</translation> @@ -1797,51 +3001,270 @@ Change them only if you know what you are doing.</source> </message> <message> <source>Poor</source> + <comment>Password quality</comment> <translation>Pobre</translation> </message> <message> <source>Weak</source> + <comment>Password quality</comment> <translation>Fraco</translation> </message> <message> <source>Good</source> + <comment>Password quality</comment> <translation>Bom</translation> </message> <message> <source>Excellent</source> + <comment>Password quality</comment> <translation>Excelente</translation> </message> - <message> - <source>Password</source> - <translation>Senha</translation> - </message> - <message> - <source>Extended ASCII</source> - <translation type="unfinished"/> - </message> - <message> - <source>Passphrase</source> - <translation>Senha</translation> - </message> - <message> - <source>Wordlist:</source> - <translation>Lista de palavras:</translation> - </message> - <message> - <source>Word Count:</source> - <translation>Número de Palavras:</translation> - </message> - <message> - <source>Word Separator:</source> - <translation>Separador de Palavras:</translation> - </message> - <message> - <source>Copy</source> - <translation>Copiar</translation> - </message> </context> <context> <name>QObject</name> + <message> + <source>Database not opened</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database hash not available</source> + <translation type="unfinished"/> + </message> + <message> + <source>Client public key not received</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot decrypt message</source> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout or cannot connect to KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>Action cancelled or denied</source> + <translation>Ação cancelada ou negada</translation> + </message> + <message> + <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC association failed, try again</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key change was not successful</source> + <translation type="unfinished"/> + </message> + <message> + <source>Encryption key is not recognized</source> + <translation type="unfinished"/> + </message> + <message> + <source>No saved databases found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect action</source> + <translation type="unfinished"/> + </message> + <message> + <source>Empty message received</source> + <translation type="unfinished"/> + </message> + <message> + <source>No URL provided</source> + <translation>Nenhuma URL informada</translation> + </message> + <message> + <source>No logins found</source> + <translation>Nenhum login encontrado</translation> + </message> + <message> + <source>Unknown error</source> + <translation>Erro desconhecido</translation> + </message> + <message> + <source>Add a new entry to a database.</source> + <translation>Adicionar uma nova entrada ao banco de dados.</translation> + </message> + <message> + <source>Path of the database.</source> + <translation>Caminho do banco de dados</translation> + </message> + <message> + <source>Key file of the database.</source> + <translation>Arquivo-chave do banco de dados.</translation> + </message> + <message> + <source>path</source> + <translation>caminho</translation> + </message> + <message> + <source>Username for the entry.</source> + <translation>Usuário para a entrada.</translation> + </message> + <message> + <source>username</source> + <translation>usuário</translation> + </message> + <message> + <source>URL for the entry.</source> + <translation>URL para a entrada.</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Prompt for the entry's password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a password for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length for the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>length</source> + <translation>tamanho</translation> + </message> + <message> + <source>Path of the entry to add.</source> + <translation>Caminho da entrada para adicionar.</translation> + </message> + <message> + <source>Copy an entry's password to the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to clip.</source> + <comment>clip = copy to clipboard</comment> + <translation>Caminho da entrada para copiar.</translation> + </message> + <message> + <source>Timeout in seconds before clearing the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Edit an entry.</source> + <translation>Editar uma entrada.</translation> + </message> + <message> + <source>Title for the entry.</source> + <translation>Título para a entrada.</translation> + </message> + <message> + <source>title</source> + <translation>título</translation> + </message> + <message> + <source>Path of the entry to edit.</source> + <translation>Caminho da entrada para editar.</translation> + </message> + <message> + <source>Estimate the entropy of a password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password for which to estimate the entropy.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Perform advanced analysis on the password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Extract and print the content of a database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database to extract.</source> + <translation>Caminho do banco de dados para extração.</translation> + </message> + <message> + <source>Insert password to unlock %1: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to load key file %1 : %2</source> + <translation type="unfinished"/> + </message> + <message> + <source>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source> + +Available commands: +</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the command to execute.</source> + <translation>Nome do comando para executar.</translation> + </message> + <message> + <source>List database entries.</source> + <translation>Listar entradas do banco de dados.</translation> + </message> + <message> + <source>Path of the group to list. Default is /</source> + <translation type="unfinished"/> + </message> + <message> + <source>Find entries quickly.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Search term.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Merge two databases.</source> + <translation>Juntar dois bancos de dados.</translation> + </message> + <message> + <source>Path of the database to merge into.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database to merge from.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use the same credentials for both database files.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file of the database to merge from.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show an entry's information.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> + <translation type="unfinished"/> + </message> + <message> + <source>attribute</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the entry to show.</source> + <translation>Nome da entrada para mostrar.</translation> + </message> <message> <source>NULL device</source> <translation type="unfinished"/> @@ -1864,7 +3287,27 @@ Change them only if you know what you are doing.</source> <translation type="unfinished"/> </message> <message> - <source>INTERNAL - unget lower bound exceeded</source> + <source>AES: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Twofish: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>ChaCha20: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Argon2 (KDBX 4 – recommended)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 4)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 3.1)</source> <translation type="unfinished"/> </message> <message> @@ -1883,14 +3326,22 @@ Change them only if you know what you are doing.</source> <source>Password</source> <translation>Senha</translation> </message> - <message> - <source>URL</source> - <translation>URL</translation> - </message> <message> <source>Notes</source> <translation>Notas</translation> </message> + <message> + <source>Last Modified</source> + <translation type="unfinished"/> + </message> + <message> + <source>Created</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy Browser Integration</source> + <translation type="unfinished"/> + </message> <message> <source>Browser Integration</source> <translation>Integração com o Navegador</translation> @@ -1907,6 +3358,10 @@ Change them only if you know what you are doing.</source> <source>Passive</source> <translation>Passivo</translation> </message> + <message> + <source>SSH Agent</source> + <translation>Agente SSH</translation> + </message> </context> <context> <name>QtIOCompressor</name> @@ -1945,8 +3400,8 @@ Change them only if you know what you are doing.</source> <context> <name>SearchWidget</name> <message> - <source>Case Sensitive</source> - <translation>Diferenciar maiúsculas e minúsculas</translation> + <source>Search...</source> + <translation>Buscar...</translation> </message> <message> <source>Search</source> @@ -1957,8 +3412,8 @@ Change them only if you know what you are doing.</source> <translation>Limpar</translation> </message> <message> - <source>Search...</source> - <translation>Buscar...</translation> + <source>Case Sensitive</source> + <translation>Diferenciar maiúsculas e minúsculas</translation> </message> <message> <source>Limit search to selected group</source> @@ -1967,50 +3422,6 @@ Change them only if you know what you are doing.</source> </context> <context> <name>Service</name> - <message> - <source>A shared encryption-key with the name "%1" already exists. -Do you want to overwrite it?</source> - <translation>Já existe uma chave de criptografia compartilhada com o nome "%1". -Deseja substituí-la?</translation> - </message> - <message> - <source>Do you want to update the information in %1 - %2?</source> - <translation>Deseja atualizar as informações em %1 - %2?</translation> - </message> - <message> - <source>The active database is locked! -Please unlock the selected database or choose another one which is unlocked.</source> - <translation>A base de dados ativa está bloqueada! -Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.</translation> - </message> - <message> - <source>Successfully removed %1 encryption-%2 from KeePassX/Http Settings.</source> - <translation>Removido com sucesso %1 criptografia-%2 do KeePassX/Http Configurações.</translation> - </message> - <message> - <source>No shared encryption-keys found in KeePassHttp Settings.</source> - <translation>Nenhuma chave de criptografia compartilhada encontrada nas Configurações do KeePassHttp.</translation> - </message> - <message> - <source>The active database does not contain an entry of KeePassHttp Settings.</source> - <translation>A base de dados ativa não contém uma entrada de Configurações KeePassHttp.</translation> - </message> - <message> - <source>Removing stored permissions...</source> - <translation>Removendo permissões armazenadas...</translation> - </message> - <message> - <source>Abort</source> - <translation>Cancelar</translation> - </message> - <message> - <source>Successfully removed permissions from %1 %2.</source> - <translation>Foram removidas com êxito as permissões de %1 %2.</translation> - </message> - <message> - <source>The active database does not contain an entry with permissions.</source> - <translation>A base de dados ativa não contém uma entrada com permissões.</translation> - </message> <message> <source>KeePassXC: New key association request</source> <translation>KeePassXC: Nova associação de chaves requisitada</translation> @@ -2027,34 +3438,78 @@ dar-lhe um nome único para identificá-lo e aceitá-lo.</translation> <source>KeePassXC: Overwrite existing key?</source> <translation>KeePassXC: Substituir chave existente?</translation> </message> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>Já existe uma chave de criptografia compartilhada com o nome "%1". +Deseja substituí-la?</translation> + </message> <message> <source>KeePassXC: Update Entry</source> <translation>KeePassXC: Atualizar entrada</translation> </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Deseja atualizar as informações em %1 - %2?</translation> + </message> <message> <source>KeePassXC: Database locked!</source> <translation>KeePassXC: Banco de dados bloqueado!</translation> </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>A base de dados ativa está bloqueada! +Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.</translation> + </message> <message> <source>KeePassXC: Removed keys from database</source> <translation>KeePassXC: Chaves removidas do banco de dados</translation> </message> + <message numerus="yes"> + <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No keys found</source> <translation>KeePassXC: Nenhuma chave localizada</translation> </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation>Nenhuma chave de criptografia compartilhada encontrada nas Configurações do KeePassHttp.</translation> + </message> <message> <source>KeePassXC: Settings not available!</source> <translation>KeePassXC: Configurações não disponíveis!</translation> </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation>A base de dados ativa não contém uma entrada de Configurações KeePassHttp.</translation> + </message> + <message> + <source>Removing stored permissions...</source> + <translation>Removendo permissões armazenadas...</translation> + </message> + <message> + <source>Abort</source> + <translation>Cancelar</translation> + </message> <message> <source>KeePassXC: Removed permissions</source> <translation>KeePassXC: Permissões removidas</translation> </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entries.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No entry with permissions found!</source> <translation>KeePassXC: Nenhuma entrada com permissões localizada!</translation> </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>A base de dados ativa não contém uma entrada com permissões.</translation> + </message> </context> <context> <name>SettingsWidget</name> @@ -2077,10 +3532,26 @@ dar-lhe um nome único para identificá-lo e aceitá-lo.</translation> </context> <context> <name>SettingsWidgetGeneral</name> + <message> + <source>Basic Settings</source> + <translation>Configurações Básicas</translation> + </message> + <message> + <source>Start only a single instance of KeePassXC</source> + <translation>Iniciar apenas uma única instância do KeePassXC</translation> + </message> <message> <source>Remember last databases</source> <translation>Lembrar dos últimos bancos de dados</translation> </message> + <message> + <source>Remember last key files and security dongles</source> + <translation type="unfinished"/> + </message> + <message> + <source>Load previous databases on startup</source> + <translation>Carregar bancos de dados anteriores na inicialização</translation> + </message> <message> <source>Automatically save on exit</source> <translation>Salvar automaticamente ao sair</translation> @@ -2089,21 +3560,29 @@ dar-lhe um nome único para identificá-lo e aceitá-lo.</translation> <source>Automatically save after every change</source> <translation>Salvar automaticamente depois de cada alteração</translation> </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation>Automaticamente recarregar o banco de dados quando houver modificações externas</translation> + </message> <message> <source>Minimize when copying to clipboard</source> <translation>Minimizar ao copiar para área de transferência</translation> </message> + <message> + <source>Minimize window at application startup</source> + <translation>Iniciar programa com janela minimizada</translation> + </message> <message> <source>Use group icon on entry creation</source> <translation>Usar ícone de grupo na criação da entrada</translation> </message> <message> - <source>Global Auto-Type shortcut</source> - <translation>Atalho para Auto-Digitação Global</translation> + <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> + <translation type="unfinished"/> </message> <message> - <source>Language</source> - <translation>Idioma</translation> + <source>Hide the Details view</source> + <translation type="unfinished"/> </message> <message> <source>Show a system tray icon</source> @@ -2113,67 +3592,61 @@ dar-lhe um nome único para identificá-lo e aceitá-lo.</translation> <source>Hide window to system tray when minimized</source> <translation>Ocultar janela na bandeja de sistema quando minimizada</translation> </message> - <message> - <source>Load previous databases on startup</source> - <translation>Carregar bancos de dados anteriores na inicialização</translation> - </message> - <message> - <source>Automatically reload the database when modified externally</source> - <translation>Automaticamente recarregar o banco de dados quando houver modificações externas</translation> - </message> <message> <source>Hide window to system tray instead of app exit</source> <translation>Ocultar janela na bandeja de sistema em vez de sair do programa</translation> </message> <message> - <source>Minimize window at application startup</source> - <translation>Iniciar programa com janela minimizada</translation> - </message> - <message> - <source>Basic Settings</source> - <translation>Configurações Básicas</translation> - </message> - <message> - <source>Remember last key files and security dongles</source> + <source>Dark system tray icon</source> <translation type="unfinished"/> </message> <message> - <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> - <translation type="unfinished"/> + <source>Language</source> + <translation>Idioma</translation> </message> <message> <source>Auto-Type</source> <translation>Auto-Digitação</translation> </message> <message> - <source>Use entry title and URL to match windows for global Auto-Type</source> + <source>Use entry title to match windows for global Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use entry URL to match windows for global Auto-Type</source> <translation type="unfinished"/> </message> <message> <source>Always ask before performing Auto-Type</source> <translation type="unfinished"/> </message> + <message> + <source>Global Auto-Type shortcut</source> + <translation>Atalho para Auto-Digitação Global</translation> + </message> <message> <source>Auto-Type delay</source> <translation type="unfinished"/> </message> <message> <source> ms</source> + <comment>Milliseconds</comment> <translation>ms</translation> </message> - <message> - <source>Start only a single instance of KeePassXC</source> - <translation type="unfinished"/> - </message> </context> <context> <name>SettingsWidgetSecurity</name> + <message> + <source>Timeouts</source> + <translation type="unfinished"/> + </message> <message> <source>Clear clipboard after</source> <translation>Limpar área de transferência após</translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation> seg</translation> </message> <message> @@ -2181,8 +3654,12 @@ dar-lhe um nome único para identificá-lo e aceitá-lo.</translation> <translation>Travar bancos de dados após inatividade de</translation> </message> <message> - <source>Show passwords in cleartext by default</source> - <translation>Mostrar senhas em texto claro por padrão</translation> + <source>Convenience</source> + <translation>Conveniência</translation> + </message> + <message> + <source>Lock databases when session is locked or lid is closed</source> + <translation type="unfinished"/> </message> <message> <source>Lock databases after minimizing the window</source> @@ -2193,15 +3670,15 @@ dar-lhe um nome único para identificá-lo e aceitá-lo.</translation> <translation>Quando a senha for visível não pedir para repeti-la</translation> </message> <message> - <source>Timeouts</source> + <source>Show passwords in cleartext by default</source> + <translation>Mostrar senhas em texto claro por padrão</translation> + </message> + <message> + <source>Hide passwords in the preview panel</source> <translation type="unfinished"/> </message> <message> - <source>Convenience</source> - <translation>Conveniência</translation> - </message> - <message> - <source>Lock databases when session is locked or lid is closed</source> + <source>Hide entry notes by default</source> <translation type="unfinished"/> </message> <message> @@ -2223,6 +3700,14 @@ dar-lhe um nome único para identificá-lo e aceitá-lo.</translation> <source>Key:</source> <translation>Chave:</translation> </message> + <message> + <source>Default RFC 6238 token settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Steam token settings</source> + <translation type="unfinished"/> + </message> <message> <source>Use custom settings</source> <translation>Usar configurações personalizadas</translation> @@ -2249,6 +3734,7 @@ dar-lhe um nome único para identificá-lo e aceitá-lo.</translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation> seg</translation> </message> </context> @@ -2290,7 +3776,7 @@ dar-lhe um nome único para identificá-lo e aceitá-lo.</translation> </message> <message> <source>Start storing your passwords securely in a KeePassXC database</source> - <translation type="unfinished"/> + <translation>Começe a guardar suas senhas de maneira segura em um banco de dados do KeePassXC</translation> </message> <message> <source>Create new database</source> @@ -2315,6 +3801,26 @@ dar-lhe um nome único para identificá-lo e aceitá-lo.</translation> </context> <context> <name>main</name> + <message> + <source>Remove an entry from the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>Caminho do banco de dados</translation> + </message> + <message> + <source>Path of the entry to remove.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation>KeePassXC - gerenciador de senhas multiplataforma</translation> + </message> + <message> + <source>filenames of the password databases to open (*.kdbx)</source> + <translation>nome de arquivo do banco de dados de senhas a ser aberto (*.kdbx)</translation> + </message> <message> <source>path to a custom config file</source> <translation>caminho para um arquivo de configuração personalizado</translation> @@ -2323,81 +3829,13 @@ dar-lhe um nome único para identificá-lo e aceitá-lo.</translation> <source>key file of the database</source> <translation>arquivo-chave do banco de dados</translation> </message> - <message> - <source>KeePassXC - cross-platform password manager</source> - <translation>KeePassXC - gerenciador de senhas multiplataforma</translation> - </message> <message> <source>read password of the database from stdin</source> <translation>ler a senha do banco de dados da entrada padrão</translation> </message> <message> - <source>filenames of the password databases to open (*.kdbx)</source> - <translation>nome de arquivo do banco de dados de senhas a ser aberto (*.kdbx)</translation> - </message> - <message> - <source>Copy a password to the clipboard</source> + <source>Parent window handle</source> <translation type="unfinished"/> </message> - <message> - <source>Path of the database.</source> - <translation>Caminho do banco de dados</translation> - </message> - <message> - <source>Use a GUI prompt unlocking the database.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Name of the entry to clip.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Extract and print the content of a database.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Path of the database to extract.</source> - <translation>Caminho do banco de dados para extração.</translation> - </message> - <message> - <source>Name of the command to execute.</source> - <translation>Nome do comando para executar.</translation> - </message> - <message> - <source>List database entries.</source> - <translation>Listar entradas do banco de dados.</translation> - </message> - <message> - <source>Path of the group to list. Default is /</source> - <translation type="unfinished"/> - </message> - <message> - <source>Print the UUIDs of the entries and groups.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Merge two databases.</source> - <translation>Juntar dois bancos de dados.</translation> - </message> - <message> - <source>Path of the database to merge into.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Path of the database to merge from.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Use the same password for both database files.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Show a password.</source> - <translation>Mostrar uma senha.</translation> - </message> - <message> - <source>Name of the entry to show.</source> - <translation>Nome da entrada para mostrar.</translation> - </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_pt_PT.ts b/share/translations/keepassx_pt_PT.ts index 0a671ed70..ed1ddbaaa 100644 --- a/share/translations/keepassx_pt_PT.ts +++ b/share/translations/keepassx_pt_PT.ts @@ -9,14 +9,34 @@ <source>About</source> <translation>Acerca</translation> </message> + <message> + <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> + <translation>Reporte os erros em: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> + </message> + <message> + <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>KeePassXC é distribuído sob os termos da GNU General Public License (GPL) versão 2 ou (em sua opção) versão 3.</translation> + </message> + <message> + <source>Project Maintainers:</source> + <translation>Manutenção do projeto:</translation> + </message> <message> <source>Contributors</source> <translation>Colaboradores</translation> </message> + <message> + <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Consulte os contributos no GitHub</a></translation> + </message> <message> <source>Debug Info</source> <translation>Informação de depuração</translation> </message> + <message> + <source>Include the following information whenever you report a bug:</source> + <translation>Inclua as seguintes informações sempre que reportar um erro:</translation> + </message> <message> <source>Copy to clipboard</source> <translation>Copiar para a área de transferência</translation> @@ -31,6 +51,10 @@ <source>Revision: %1</source> <translation>Revisão: %1</translation> </message> + <message> + <source>Distribution: %1</source> + <translation>Distribuição: %1</translation> + </message> <message> <source>Libraries:</source> <translation>Bibliotecas:</translation> @@ -47,33 +71,13 @@ Kernel: %3 %4</translation> <source>Enabled extensions:</source> <translation>Extensões ativas:</translation> </message> - <message> - <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> - <translation>Reporte os erros em: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> - </message> - <message> - <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassXC é distribuído sob os termos da GNU General Public License (GPL) versão 2 ou (em sua opção) versão 3.</translation> - </message> - <message> - <source>Project Maintainers:</source> - <translation>Manutenção do projeto:</translation> - </message> - <message> - <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Consulte os contributos no GitHub</a></translation> - </message> - <message> - <source>Include the following information whenever you report a bug:</source> - <translation>Inclua as seguintes informações sempre que reportar um erro:</translation> - </message> - <message> - <source>Distribution: %1</source> - <translation>Distribuição: %1</translation> - </message> </context> <context> <name>AccessControlDialog</name> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>KeePassXC HTTP - Confirmar acesso</translation> + </message> <message> <source>Remember this decision</source> <translation>Memorizar esta escolha</translation> @@ -92,9 +96,12 @@ Please select whether you want to allow access.</source> <translation>%1 solicitou o acesso a palavras-passe para o(s) seguinte(s) iten(s). Selecione se deseja permitir o acesso.</translation> </message> +</context> +<context> + <name>AgentSettingsWidget</name> <message> - <source>KeePassXC HTTP Confirm Access</source> - <translation>KeePassXC HTTP - Confirmar acesso</translation> + <source>Enable SSH Agent (requires restart)</source> + <translation type="unfinished"/> </message> </context> <context> @@ -107,6 +114,26 @@ Selecione se deseja permitir o acesso.</translation> <source>Auto-Type - KeePassXC</source> <translation>Escrita automática - KeePassXC</translation> </message> + <message> + <source>Auto-Type</source> + <translation>Escrita automática</translation> + </message> + <message> + <source>The Syntax of your Auto-Type statement is incorrect!</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> </context> <context> <name>AutoTypeAssociationsModel</name> @@ -125,13 +152,290 @@ Selecione se deseja permitir o acesso.</translation> </context> <context> <name>AutoTypeSelectDialog</name> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>Escrita automática - KeePassXC</translation> + </message> <message> <source>Select entry to Auto-Type:</source> <translation>Selecionar entrada para escrita automática:</translation> </message> +</context> +<context> + <name>BrowserAccessControlDialog</name> <message> - <source>Auto-Type - KeePassXC</source> - <translation>Escrita automática - KeePassXC</translation> + <source>KeePassXC-Browser Confirm Access</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remember this decision</source> + <translation>Memorizar esta escolha</translation> + </message> + <message> + <source>Allow</source> + <translation>Permitir</translation> + </message> + <message> + <source>Deny</source> + <translation>Recusar</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 solicitou o acesso a palavras-passe para o(s) seguinte(s) iten(s). +Selecione se deseja permitir o acesso.</translation> + </message> +</context> +<context> + <name>BrowserOptionDialog</name> + <message> + <source>Dialog</source> + <translation>Diálogo</translation> + </message> + <message> + <source>This is required for accessing your databases with KeePassXC-Browser</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable KeepassXC browser integration</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>Geral</translation> + </message> + <message> + <source>Enable integration for these browsers:</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Google Chrome</source> + <translation>&Google Chrome</translation> + </message> + <message> + <source>&Firefox</source> + <translation>&Firefox</translation> + </message> + <message> + <source>&Chromium</source> + <translation>&Chromium</translation> + </message> + <message> + <source>&Vivaldi</source> + <translation>&Vivaldi</translation> + </message> + <message> + <source>Show a &notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Pe&dir para desbloquear a base de dados se esta estiver bloqueada</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Match URL scheme (e.g., https://...)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>Apenas devolve as melhores entradas para o URL específico em vez das entradas para o domínio.</translation> + </message> + <message> + <source>&Return only best-matching credentials</source> + <translation type="unfinished"/> + </message> + <message> + <source>Sort &matching credentials by title</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Sort matching credentials by &username</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>&Disconnect all browsers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Forget all remembered &permissions</source> + <translation type="unfinished"/> + </message> + <message> + <source>Advanced</source> + <translation>Avançado</translation> + </message> + <message> + <source>Never &ask before accessing credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Never ask before &updating credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>Apenas a base de dados selecionada tem que estar conectada a um cliente.</translation> + </message> + <message> + <source>Searc&h in all opened databases for matching credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>A criação ou atualização dos campos de cadeias não é suportada.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>Most&rar campos avançados que começam com "KPH: "</translation> + </message> + <message> + <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Update &native messaging manifest files at startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Support a proxy application between KeePassXC and browser extension.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &proxy application between KeePassXC and browser extension</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a custom proxy location if you installed a proxy manually.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &custom proxy location</source> + <comment>Meant is the proxy for KeePassXC-Browser</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Procurar...</translation> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*.exe);;All Files (*.*)</source> + <translation>Ficheiros executáveis (*.exe);;Todos os ficheiros (*.*)</translation> + </message> + <message> + <source>Executable Files (*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select custom proxy location</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>BrowserService</name> + <message> + <source>KeePassXC: New key association request</source> + <translation>KeePassXC: Pedido de associação de nova chave</translation> + </message> + <message> + <source>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Save and allow access</source> + <translation>Guardar e permitir acesso</translation> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: Substituir chave existente?</translation> + </message> + <message> + <source>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: Atualizar entrada</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Deseja atualizar as informações em %1 - %2?</translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: Base de dados bloqueada!</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>A base de dados ativa está bloqueada! +Desbloqueie a base de dados selecionada ou escolha outra que esteja desbloqueada.</translation> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: Definições indisponíveis!</translation> + </message> + <message> + <source>The active database does not contain a settings entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: Nenhuma chave encontrada</translation> + </message> + <message> + <source>No shared encryption keys found in KeePassXC Settings.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: Remover chaves da base de dados</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Removing stored permissions…</source> + <translation type="unfinished"/> + </message> + <message> + <source>Abort</source> + <translation>Abortar</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: Permissões removidas</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entry(s).</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation>KeePassXC: Não existem entradas com permissões!</translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>A base de dados ativa não contém uma entrada com permissões.</translation> </message> </context> <context> @@ -148,6 +452,10 @@ Selecione se deseja permitir o acesso.</translation> <source>Repeat password:</source> <translation>Repita a palavra-passe:</translation> </message> + <message> + <source>&Key file</source> + <translation>Ficheiro-&chave</translation> + </message> <message> <source>Browse</source> <translation>Procurar</translation> @@ -156,6 +464,14 @@ Selecione se deseja permitir o acesso.</translation> <source>Create</source> <translation>Criar</translation> </message> + <message> + <source>Cha&llenge Response</source> + <translation>Pergunta de &segurança</translation> + </message> + <message> + <source>Refresh</source> + <translation>Recarregar</translation> + </message> <message> <source>Key files</source> <translation>Ficheiros-chave</translation> @@ -176,6 +492,10 @@ Selecione se deseja permitir o acesso.</translation> <source>Select a key file</source> <translation>Selecione o ficheiro-chave</translation> </message> + <message> + <source>Empty password</source> + <translation>Palavra-passe vazia</translation> + </message> <message> <source>Do you really want to use an empty string as password?</source> <translation>Deseja mesmo utilizar uma cadeia vazia como palavra-passe?</translation> @@ -191,20 +511,15 @@ Selecione se deseja permitir o acesso.</translation> %2</translation> </message> <message> - <source>&Key file</source> - <translation>Ficheiro-&chave</translation> + <source>Legacy key file format</source> + <translation type="unfinished"/> </message> <message> - <source>Cha&llenge Response</source> - <translation>Pergunta de &segurança</translation> - </message> - <message> - <source>Refresh</source> - <translation>Recarregar</translation> - </message> - <message> - <source>Empty password</source> - <translation>Palavra-passe vazia</translation> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -217,6 +532,10 @@ Selecione se deseja permitir o acesso.</translation> <source>Clone Options</source> <translation>Opções de clonagem</translation> </message> + <message> + <source>Append ' - Clone' to title</source> + <translation>Adicionar ' -Clone' ao título</translation> + </message> <message> <source>Replace username and password with references</source> <translation>Substituir nome de utilizador e palavra-passe por referências</translation> @@ -225,10 +544,6 @@ Selecione se deseja permitir o acesso.</translation> <source>Copy history</source> <translation>Histórico de cópias</translation> </message> - <message> - <source>Append ' - Clone' to title</source> - <translation>Adicionar ' -Clone' ao título</translation> - </message> </context> <context> <name>CsvImportWidget</name> @@ -325,10 +640,6 @@ Selecione se deseja permitir o acesso.</translation> </context> <context> <name>CsvImportWizard</name> - <message> - <source>Import CSV file</source> - <translation>Importar ficheiro CSV</translation> - </message> <message> <source>Error</source> <translation>Erro</translation> @@ -340,17 +651,17 @@ Selecione se deseja permitir o acesso.</translation> </context> <context> <name>CsvParserModel</name> - <message> - <source> byte, </source> - <translation> byte, </translation> + <message numerus="yes"> + <source>%n byte(s), </source> + <translation><numerusform>%n byte,</numerusform><numerusform>%n byte(s), </numerusform></translation> </message> - <message> - <source> rows, </source> - <translation>linhas, </translation> + <message numerus="yes"> + <source>%n row(s), </source> + <translation><numerusform>%n linha,</numerusform><numerusform>%n linhas,</numerusform></translation> </message> - <message> - <source> columns</source> - <translation>colunas</translation> + <message numerus="yes"> + <source>%n column(s)</source> + <translation><numerusform>%n coluna</numerusform><numerusform>%n colunas</numerusform></translation> </message> </context> <context> @@ -371,6 +682,14 @@ Selecione se deseja permitir o acesso.</translation> <source>Browse</source> <translation>Procurar</translation> </message> + <message> + <source>Refresh</source> + <translation>Recarregar</translation> + </message> + <message> + <source>Challenge Response:</source> + <translation>Pergunta de segurança:</translation> + </message> <message> <source>Unable to open the database.</source> <translation>Incapaz de abrir a base de dados.</translation> @@ -379,6 +698,21 @@ Selecione se deseja permitir o acesso.</translation> <source>Can't open key file</source> <translation>Incapaz de abrir o ficheiro-chave</translation> </message> + <message> + <source>Legacy key file format</source> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't show this warning again</source> + <translation type="unfinished"/> + </message> <message> <source>All files</source> <translation>Todos os ficheiros</translation> @@ -391,14 +725,6 @@ Selecione se deseja permitir o acesso.</translation> <source>Select key file</source> <translation>Selecione o ficheiro-chave</translation> </message> - <message> - <source>Refresh</source> - <translation>Recarregar</translation> - </message> - <message> - <source>Challenge Response:</source> - <translation>Pergunta de segurança:</translation> - </message> </context> <context> <name>DatabaseRepairWidget</name> @@ -414,14 +740,14 @@ Selecione se deseja permitir o acesso.</translation> <source>Can't open key file</source> <translation>Incapaz de abrir o ficheiro-chave</translation> </message> - <message> - <source>Database opened fine. Nothing to do.</source> - <translation>Base de dados aberta. Nada para fazer.</translation> - </message> <message> <source>Unable to open the database.</source> <translation>Incapaz de abrir a base de dados.</translation> </message> + <message> + <source>Database opened fine. Nothing to do.</source> + <translation>Base de dados aberta. Nada para fazer.</translation> + </message> <message> <source>Success</source> <translation>Sucesso</translation> @@ -440,40 +766,57 @@ Agora já a pode guardar.</translation> <context> <name>DatabaseSettingsWidget</name> <message> - <source>Database name:</source> - <translation>Nome da base de dados:</translation> + <source>General</source> + <translation>Geral</translation> </message> <message> - <source>Database description:</source> - <translation>Descrição da base de dados:</translation> + <source>Encryption</source> + <translation>Cifra</translation> </message> <message> - <source>Transform rounds:</source> - <translation>Ciclos de transformação:</translation> + <source>Number of rounds too high</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> </message> <message> - <source>Default username:</source> - <translation>Nome de utilizador padrão:</translation> + <source>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</source> + <translation type="unfinished"/> </message> <message> - <source> MiB</source> - <translation> MiB</translation> + <source>Understood, keep number</source> + <translation type="unfinished"/> </message> <message> - <source>Benchmark</source> - <translation>Desempenho</translation> + <source>Cancel</source> + <translation>Cancelar</translation> </message> <message> - <source>Max. history items:</source> - <translation>Número máximo de itens no histórico:</translation> + <source>Number of rounds too low</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> </message> <message> - <source>Max. history size:</source> - <translation>Tamanho máximo para o histórico:</translation> + <source>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</source> + <translation type="unfinished"/> </message> <message> - <source>Use recycle bin</source> - <translation>Utilizar reciclagem</translation> + <source>KDF unchanged</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetEncryption</name> + <message> + <source>Encryption Algorithm:</source> + <translation>Algoritmo de cifra:</translation> </message> <message> <source>AES: 256 Bit (default)</source> @@ -484,14 +827,78 @@ Agora já a pode guardar.</translation> <translation>Twofish: 256 bits</translation> </message> <message> - <source>Algorithm:</source> - <translation>Algoritmo:</translation> + <source>Key Derivation Function:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Transform rounds:</source> + <translation>Ciclos de transformação:</translation> + </message> + <message> + <source>Benchmark 1-second delay</source> + <translation type="unfinished"/> + </message> + <message> + <source>Memory Usage:</source> + <translation>Utilização de memória:</translation> + </message> + <message> + <source> MB</source> + <translation> MB</translation> + </message> + <message> + <source>Parallelism:</source> + <translation>Paralelismo:</translation> + </message> + <message> + <source> thread</source> + <translation>processo</translation> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetGeneral</name> + <message> + <source>Database Meta Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database name:</source> + <translation>Nome da base de dados:</translation> + </message> + <message> + <source>Database description:</source> + <translation>Descrição da base de dados:</translation> + </message> + <message> + <source>Default username:</source> + <translation>Nome de utilizador padrão:</translation> + </message> + <message> + <source>History Settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Max. history items:</source> + <translation>Número máximo de itens no histórico:</translation> + </message> + <message> + <source>Max. history size:</source> + <translation>Tamanho máximo para o histórico:</translation> + </message> + <message> + <source> MiB</source> + <translation> MiB</translation> + </message> + <message> + <source>Use recycle bin</source> + <translation>Utilizar reciclagem</translation> </message> </context> <context> <name>DatabaseTabWidget</name> <message> <source>Root</source> + <comment>Root group</comment> <translation>Raiz</translation> </message> <message> @@ -510,6 +917,30 @@ Agora já a pode guardar.</translation> <source>File not found!</source> <translation>Ficheiro não encontrado!</translation> </message> + <message> + <source>Unable to open the database.</source> + <translation>Incapaz de abrir a base de dados.</translation> + </message> + <message> + <source>File opened in read only mode.</source> + <translation>Ficheiro aberto no modo de leitura.</translation> + </message> + <message> + <source>Open CSV file</source> + <translation>Abrir ficheiro CSV</translation> + </message> + <message> + <source>CSV file</source> + <translation>Ficheiro CSV</translation> + </message> + <message> + <source>All files (*)</source> + <translation>Todos os ficheiros (*)</translation> + </message> + <message> + <source>Merge database</source> + <translation>Combinar base de dados</translation> + </message> <message> <source>Open KeePass 1 database</source> <translation>Abrir base de dados do KeePass 1</translation> @@ -518,14 +949,16 @@ Agora já a pode guardar.</translation> <source>KeePass 1 database</source> <translation>Base de dados do KeePass 1</translation> </message> - <message> - <source>All files (*)</source> - <translation>Todos os ficheiros (*)</translation> - </message> <message> <source>Close?</source> <translation>Fechar?</translation> </message> + <message> + <source>"%1" is in edit mode. +Discard changes and close anyway?</source> + <translation>%1 está em modo de edição. +Deseja fechar e perder as alterações?</translation> + </message> <message> <source>Save changes?</source> <translation>Guardar alterações?</translation> @@ -540,10 +973,22 @@ Guardar alterações?</translation> <source>Writing the database failed.</source> <translation>Falha ao escrever na base de dados.</translation> </message> + <message> + <source>Passwords</source> + <translation>Palavras-passe</translation> + </message> <message> <source>Save database as</source> <translation>Guardar base de dados como</translation> </message> + <message> + <source>Export database to CSV file</source> + <translation>Exportar base de dados para ficheiro CSV</translation> + </message> + <message> + <source>Writing the CSV file failed.</source> + <translation>Falha ao escrever no ficheiro CSV.</translation> + </message> <message> <source>New database</source> <translation>Nova base de dados</translation> @@ -561,12 +1006,6 @@ Guardar alterações?</translation> Please press cancel to finish your changes or discard them.</source> <translation>Não é possível bloquear a base de dados, porque esta está a ser editada. Prima Cancelar para finalizar as alterações ou descarte-as.</translation> - </message> - <message> - <source>This database has never been saved. -You can save the database or stop locking it.</source> - <translation>Esta base de dados nunca foi guardada. -Pode guardar a base de dados ou parar de a bloquear.</translation> </message> <message> <source>This database has been modified. @@ -576,69 +1015,13 @@ Otherwise your changes are lost.</source> Deseja guardar a base de dados antes de a bloquear ? Se não o fizer, perderá as suas alterações.</translation> </message> - <message> - <source>"%1" is in edit mode. -Discard changes and close anyway?</source> - <translation>%1 está em modo de edição. -Deseja fechar e perder as alterações?</translation> - </message> - <message> - <source>Export database to CSV file</source> - <translation>Exportar base de dados para ficheiro CSV</translation> - </message> - <message> - <source>CSV file</source> - <translation>Ficheiro CSV</translation> - </message> - <message> - <source>Writing the CSV file failed.</source> - <translation>Falha ao escrever no ficheiro CSV.</translation> - </message> - <message> - <source>Unable to open the database.</source> - <translation>Incapaz de abrir a base de dados.</translation> - </message> - <message> - <source>Merge database</source> - <translation>Combinar base de dados</translation> - </message> - <message> - <source>The database you are trying to save as is locked by another instance of KeePassXC. -Do you want to save it anyway?</source> - <translation>A base de dados que está a tentar abrir está bloqueada por outra instância do KeePassXC. -Ainda assim deseja guardar as alterações?</translation> - </message> - <message> - <source>Passwords</source> - <translation>Palavras-passe</translation> - </message> - <message> - <source>Database already opened</source> - <translation>Base de dados já aberta</translation> - </message> - <message> - <source>The database you are trying to open is locked by another instance of KeePassXC. - -Do you want to open it anyway?</source> - <translation>A base de dados que está a tentar abrir está bloqueada por outra instância do KeePassXC. - -Ainda assim deseja abrir a base de dados?</translation> - </message> - <message> - <source>Open read-only</source> - <translation>Abrir no modo de leitura</translation> - </message> - <message> - <source>File opened in read only mode.</source> - <translation>Ficheiro aberto no modo de leitura.</translation> - </message> - <message> - <source>Open CSV file</source> - <translation>Abrir ficheiro CSV</translation> - </message> </context> <context> <name>DatabaseWidget</name> + <message> + <source>Searching...</source> + <translation>A procurar...</translation> + </message> <message> <source>Change master key</source> <translation>Alterar chave-mestre</translation> @@ -659,13 +1042,33 @@ Ainda assim deseja abrir a base de dados?</translation> <source>Do you really want to delete %1 entries for good?</source> <translation>Deseja mesmo apagar permanentemente %1 entradas?</translation> </message> + <message> + <source>Move entry to recycle bin?</source> + <translation>Mover entrada para a reciclagem?</translation> + </message> + <message> + <source>Do you really want to move entry "%1" to the recycle bin?</source> + <translation>Deseja mesmo mover a entrada "%1" para a reciclagem?</translation> + </message> <message> <source>Move entries to recycle bin?</source> <translation>Mover entradas para a reciclagem?</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>Pretende realmente mover a entrada(s) %n para a reciclagem ?</numerusform><numerusform>Deseja mesmo mover %n entrada(s) para a reciclagem?</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Execute command?</source> + <translation>Executar comando?</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation>Deseja mesmo executar o seguinte comando?<br><br>%1<br></translation> + </message> + <message> + <source>Remember my choice</source> + <translation>Memorizar escolha</translation> </message> <message> <source>Delete group?</source> @@ -679,18 +1082,6 @@ Ainda assim deseja abrir a base de dados?</translation> <source>Unable to calculate master key</source> <translation>Impossível de calcular a chave-mestre</translation> </message> - <message> - <source>Move entry to recycle bin?</source> - <translation>Mover entrada para a reciclagem?</translation> - </message> - <message> - <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation>Deseja mesmo mover a entrada "%1" para a reciclagem?</translation> - </message> - <message> - <source>Searching...</source> - <translation>A procurar...</translation> - </message> <message> <source>No current database.</source> <translation>Nenhuma base de dados.</translation> @@ -708,20 +1099,8 @@ Ainda assim deseja abrir a base de dados?</translation> <translation>Sem resultados</translation> </message> <message> - <source>Execute command?</source> - <translation>Executar comando?</translation> - </message> - <message> - <source>Do you really want to execute the following command?<br><br>%1<br></source> - <translation>Deseja mesmo executar o seguinte comando?<br><br>%1<br></translation> - </message> - <message> - <source>Remember my choice</source> - <translation>Memorizar escolha</translation> - </message> - <message> - <source>Autoreload Request</source> - <translation>Pedido de recarregamento automático</translation> + <source>File has changed</source> + <translation type="unfinished"/> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -732,8 +1111,9 @@ Ainda assim deseja abrir a base de dados?</translation> <translation>Pedido de união</translation> </message> <message> - <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> - <translation>O ficheiro da base de dados foi alterado e tem alterações por guardar. Deseja combinar as alterações?</translation> + <source>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</source> + <translation type="unfinished"/> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -748,6 +1128,89 @@ Ainda assim deseja abrir a base de dados?</translation> <translation>Tem a certeza de que deseja apagar permanentemente os itens da reciclagem?</translation> </message> </context> +<context> + <name>DetailsWidget</name> + <message> + <source>Generate TOTP Token</source> + <translation type="unfinished"/> + </message> + <message> + <source>Close</source> + <translation>Fechar</translation> + </message> + <message> + <source>General</source> + <translation>Geral</translation> + </message> + <message> + <source>Password</source> + <translation>Palavra-passe</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Expiration</source> + <translation>Expira</translation> + </message> + <message> + <source>Username</source> + <translation>Nome de utilizador</translation> + </message> + <message> + <source>Autotype</source> + <translation>Escrita automática</translation> + </message> + <message> + <source>Searching</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attributes</source> + <translation>Atributos</translation> + </message> + <message> + <source>Attachments</source> + <translation>Anexos</translation> + </message> + <message> + <source>Notes</source> + <translation>Notas</translation> + </message> + <message> + <source>Window</source> + <translation>Janela</translation> + </message> + <message> + <source>Sequence</source> + <translation>Sequência</translation> + </message> + <message> + <source>Search</source> + <translation>Pesquisa</translation> + </message> + <message> + <source>Clear</source> + <translation>Limpar</translation> + </message> + <message> + <source>Never</source> + <translation>Nunca</translation> + </message> + <message> + <source>[PROTECTED]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Disabled</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enabled</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EditEntryWidget</name> <message> @@ -774,6 +1237,30 @@ Ainda assim deseja abrir a base de dados?</translation> <source>History</source> <translation>Histórico</translation> </message> + <message> + <source>SSH Agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation>n/d</translation> + </message> + <message> + <source>(encrypted)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>File too large to be a private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open private key</source> + <translation type="unfinished"/> + </message> <message> <source>Entry history</source> <translation>Histórico da entrada</translation> @@ -794,40 +1281,6 @@ Ainda assim deseja abrir a base de dados?</translation> <source>New attribute</source> <translation>Novo atributo</translation> </message> - <message> - <source>Select file</source> - <translation>Selecionar ficheiro</translation> - </message> - <message> - <source>Unable to open file</source> - <translation>Incapaz de abrir o ficheiro</translation> - </message> - <message> - <source>Save attachment</source> - <translation>Guardar anexo</translation> - </message> - <message> - <source>Unable to save the attachment: -</source> - <translation>Incapaz de guardar o anexo: -</translation> - </message> - <message> - <source>Tomorrow</source> - <translation>Amanhã</translation> - </message> - <message numerus="yes"> - <source>%n week(s)</source> - <translation><numerusform>%n semana(s)</numerusform><numerusform>%n semana(s)</numerusform></translation> - </message> - <message numerus="yes"> - <source>%n month(s)</source> - <translation><numerusform>%n mês</numerusform><numerusform>%n mês(es)</numerusform></translation> - </message> - <message> - <source>1 year</source> - <translation>1 ano</translation> - </message> <message> <source>Confirm Remove</source> <translation>Confirmação de remoção</translation> @@ -837,12 +1290,28 @@ Ainda assim deseja abrir a base de dados?</translation> <translation>Tem a certeza de que deseja remover este atributo?</translation> </message> <message> - <source>[PROTECTED] Press reveal to view or edit</source> - <translation>[PROTEGIDA] Por favor revele para ver ou editar</translation> + <source>[PROTECTED]</source> + <translation type="unfinished"/> </message> <message> - <source>Are you sure you want to remove this attachment?</source> - <translation>Tem a certeza de que deseja remover este anexo?</translation> + <source>Press reveal to view or edit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Tomorrow</source> + <translation>Amanhã</translation> + </message> + <message numerus="yes"> + <source>%n week(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source>%n month(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>1 year</source> + <translation>1 ano</translation> </message> </context> <context> @@ -859,18 +1328,6 @@ Ainda assim deseja abrir a base de dados?</translation> <source>Remove</source> <translation>Remover</translation> </message> - <message> - <source>Attachments</source> - <translation>Anexos</translation> - </message> - <message> - <source>Save</source> - <translation>Guardar</translation> - </message> - <message> - <source>Open</source> - <translation>Abrir</translation> - </message> <message> <source>Edit Name</source> <translation>Editar nome</translation> @@ -883,6 +1340,10 @@ Ainda assim deseja abrir a base de dados?</translation> <source>Reveal</source> <translation>Revelar</translation> </message> + <message> + <source>Attachments</source> + <translation>Anexos</translation> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -890,6 +1351,18 @@ Ainda assim deseja abrir a base de dados?</translation> <source>Enable Auto-Type for this entry</source> <translation>Ativar escrita automática para esta entrada</translation> </message> + <message> + <source>Inherit default Auto-Type sequence from the &group</source> + <translation>Herdar sequência de escrita automática deste &grupo</translation> + </message> + <message> + <source>&Use custom Auto-Type sequence:</source> + <translation>&Usar sequência personalizada de escrita automática:</translation> + </message> + <message> + <source>Window Associations</source> + <translation>Associação de janelas</translation> + </message> <message> <source>+</source> <translation>+</translation> @@ -902,14 +1375,6 @@ Ainda assim deseja abrir a base de dados?</translation> <source>Window title:</source> <translation>Título da janela:</translation> </message> - <message> - <source>Inherit default Auto-Type sequence from the &group</source> - <translation>Herdar sequência de escrita automática deste &grupo</translation> - </message> - <message> - <source>&Use custom Auto-Type sequence:</source> - <translation>&Usar sequência personalizada de escrita automática:</translation> - </message> <message> <source>Use default se&quence</source> <translation>Utilizar se&quência padrão</translation> @@ -918,10 +1383,6 @@ Ainda assim deseja abrir a base de dados?</translation> <source>Set custo&m sequence:</source> <translation>Definir sequê&ncia personalizada:</translation> </message> - <message> - <source>Window Associations</source> - <translation>Associação de janelas</translation> - </message> </context> <context> <name>EditEntryWidgetHistory</name> @@ -945,12 +1406,8 @@ Ainda assim deseja abrir a base de dados?</translation> <context> <name>EditEntryWidgetMain</name> <message> - <source>Title:</source> - <translation>Título:</translation> - </message> - <message> - <source>Username:</source> - <translation>Nome de utilizador:</translation> + <source>URL:</source> + <translation>URL:</translation> </message> <message> <source>Password:</source> @@ -961,20 +1418,104 @@ Ainda assim deseja abrir a base de dados?</translation> <translation>Repetição:</translation> </message> <message> - <source>URL:</source> - <translation>URL:</translation> + <source>Title:</source> + <translation>Título:</translation> </message> <message> - <source>Expires</source> - <translation>Expira</translation> + <source>Notes</source> + <translation>Notas</translation> </message> <message> <source>Presets</source> <translation>Predefinições</translation> </message> <message> - <source>Notes:</source> - <translation>Notas:</translation> + <source>Toggle the checkbox to reveal the notes section.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username:</source> + <translation>Nome de utilizador:</translation> + </message> + <message> + <source>Expires</source> + <translation>Expira</translation> + </message> +</context> +<context> + <name>EditEntryWidgetSSHAgent</name> + <message> + <source>Form</source> + <translation>Formulário</translation> + </message> + <message> + <source>Remove key from agent after</source> + <translation type="unfinished"/> + </message> + <message> + <source> seconds</source> + <translation>segundos</translation> + </message> + <message> + <source>Fingerprint</source> + <translation>Impressão digital</translation> + </message> + <message> + <source>Remove key from agent when database is closed/locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Public key</source> + <translation>Chave pública</translation> + </message> + <message> + <source>Add key to agent when database is opened/unlocked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Comment</source> + <translation>Comentário</translation> + </message> + <message> + <source>Decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation>n/d</translation> + </message> + <message> + <source>Copy to clipboard</source> + <translation>Copiar para a área de transferência</translation> + </message> + <message> + <source>Private key</source> + <translation>Chave privada</translation> + </message> + <message> + <source>External file</source> + <translation>Ficheiro externo</translation> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Procurar...</translation> + </message> + <message> + <source>Attachment</source> + <translation>Anexo</translation> + </message> + <message> + <source>Add to agent</source> + <translation>Adicionar ao agente</translation> + </message> + <message> + <source>Remove from agent</source> + <translation>Remover do agente</translation> + </message> + <message> + <source>Require user confirmation when this key is used</source> + <translation type="unfinished"/> </message> </context> <context> @@ -1028,7 +1569,7 @@ Ainda assim deseja abrir a base de dados?</translation> </message> <message> <source>Search</source> - <translation>Procurar</translation> + <translation>Pesquisa</translation> </message> <message> <source>Auto-Type</source> @@ -1045,6 +1586,14 @@ Ainda assim deseja abrir a base de dados?</translation> </context> <context> <name>EditWidgetIcons</name> + <message> + <source>&Use default icon</source> + <translation>&Utilizar ícone padrão</translation> + </message> + <message> + <source>Use custo&m icon</source> + <translation>Utilizar íco&ne personalizado</translation> + </message> <message> <source>Add custom icon</source> <translation>Adicionar ícone personalizado</translation> @@ -1053,6 +1602,18 @@ Ainda assim deseja abrir a base de dados?</translation> <source>Delete custom icon</source> <translation>Apagar ícone personalizado</translation> </message> + <message> + <source>Download favicon</source> + <translation>Descarregar 'favicon'</translation> + </message> + <message> + <source>Unable to fetch favicon.</source> + <translation>Incapaz de obter o 'favicon'.</translation> + </message> + <message> + <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> + <translation>Dica: pode ativar o Google como recurso em Ferramentas -> Definições -> Segurança</translation> + </message> <message> <source>Images</source> <translation>Imagens</translation> @@ -1065,25 +1626,13 @@ Ainda assim deseja abrir a base de dados?</translation> <source>Select Image</source> <translation>Selecionar imagem</translation> </message> - <message> - <source>Download favicon</source> - <translation>Descarregar 'favicon'</translation> - </message> - <message> - <source>Unable to fetch favicon.</source> - <translation>Incapaz de obter o 'favicon'.</translation> - </message> <message> <source>Can't read icon</source> <translation>Incapaz de ler o ícone</translation> </message> <message> - <source>&Use default icon</source> - <translation>&Utilizar ícone padrão</translation> - </message> - <message> - <source>Use custo&m icon</source> - <translation>Utilizar íco&ne personalizado</translation> + <source>Custom icon already exists</source> + <translation>Já existe um ícone personalizado</translation> </message> <message> <source>Confirm Delete</source> @@ -1093,14 +1642,6 @@ Ainda assim deseja abrir a base de dados?</translation> <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> <translation>Este ícone está a ser utilizado por %1 entradas e será substituído pelo ícone padrão. Tem a certeza de que deseja apagar o ícone?</translation> </message> - <message> - <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation>Dica: pode ativar o Google como recurso em Ferramentas -> Definições -> Segurança</translation> - </message> - <message> - <source>Custom icon already exists</source> - <translation>Já existe um ícone personalizado</translation> - </message> </context> <context> <name>EditWidgetProperties</name> @@ -1125,9 +1666,93 @@ Ainda assim deseja abrir a base de dados?</translation> <name>Entry</name> <message> <source> - Clone</source> + <comment>Suffix added to cloned entries</comment> <translation>- Cópia</translation> </message> </context> +<context> + <name>EntryAttachmentsModel</name> + <message> + <source>Name</source> + <translation>Nome</translation> + </message> + <message> + <source>Size</source> + <translation>Tamanho</translation> + </message> +</context> +<context> + <name>EntryAttachmentsWidget</name> + <message> + <source>Form</source> + <translation>Formulário</translation> + </message> + <message> + <source>Add</source> + <translation>Adicionar</translation> + </message> + <message> + <source>Remove</source> + <translation>Remover</translation> + </message> + <message> + <source>Open</source> + <translation>Abrir</translation> + </message> + <message> + <source>Save</source> + <translation>Guardar</translation> + </message> + <message> + <source>Select files</source> + <translation>Selecionar ficheiros</translation> + </message> + <message numerus="yes"> + <source>Are you sure you want to remove %n attachment(s)?</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>Confirmação de remoção</translation> + </message> + <message> + <source>Save attachments</source> + <translation>Guardar anexos</translation> + </message> + <message> + <source>Unable to create directory: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Confirm overwrite</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to save attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachment: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open files: +%1</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EntryAttributesModel</name> <message> @@ -1156,6 +1781,11 @@ Ainda assim deseja abrir a base de dados?</translation> </context> <context> <name>EntryModel</name> + <message> + <source>Ref: </source> + <comment>Reference abbreviation</comment> + <translation>Ref: </translation> + </message> <message> <source>Group</source> <translation>Grupo</translation> @@ -1172,11 +1802,6 @@ Ainda assim deseja abrir a base de dados?</translation> <source>URL</source> <translation>URL</translation> </message> - <message> - <source>Ref: </source> - <comment>Reference abbreviation</comment> - <translation>Ref: </translation> - </message> </context> <context> <name>Group</name> @@ -1185,6 +1810,17 @@ Ainda assim deseja abrir a base de dados?</translation> <translation>Reciclagem</translation> </message> </context> +<context> + <name>HostInstaller</name> + <message> + <source>KeePassXC: Cannot save file!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot save the native messaging script file.</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>HttpPasswordGeneratorWidget</name> <message> @@ -1247,6 +1883,361 @@ Ainda assim deseja abrir a base de dados?</translation> <translation>Fechar mensagem</translation> </message> </context> +<context> + <name>Kdbx3Reader</name> + <message> + <source>Unable to calculate master key</source> + <translation>Impossível de calcular a chave-mestre</translation> + </message> + <message> + <source>Unable to issue challenge-response.</source> + <translation>Incapaz de emitir a pergunta de segurança.</translation> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>Chave errada ou base de dados danificada.</translation> + </message> +</context> +<context> + <name>Kdbx3Writer</name> + <message> + <source>Unable to issue challenge-response.</source> + <translation>Incapaz de emitir a pergunta de segurança.</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Impossível de calcular a chave-mestre</translation> + </message> +</context> +<context> + <name>Kdbx4Reader</name> + <message> + <source>missing database headers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Impossível de calcular a chave-mestre</translation> + </message> + <message> + <source>Invalid header checksum size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Header SHA256 mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header data length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open buffer for KDF parameters in header</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported key derivation function (KDF) or invalid parameters</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy header fields found in KDBX4 file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header binary size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass variant map version.</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name data</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value data</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Bool entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry type</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map field type size</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Kdbx4Writer</name> + <message> + <source>Invalid symmetric cipher algorithm.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid symmetric cipher IV size.</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Impossível de calcular a chave-mestre</translation> + </message> + <message> + <source>Failed to serialize KDF parameters variant map</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxReader</name> + <message> + <source>Invalid cipher uuid length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid compression flags length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported compression algorithm</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid master seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform rounds size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid start bytes size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid random stream id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner random stream cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>Não é uma base de dados do KeePass.</translation> + </message> + <message> + <source>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> + <translation>O ficheiro selecionado é uma base de dados do KeePass 1 (.kdb). + +Pode importá-lo clicando em Base de dados - > 'Importar base de dados do KeePass 1...'. +Esta é uma migração unidirecional. Não será possível abrir a base de dados importada com a versão 0.4 do KeePassX.</translation> + </message> + <message> + <source>Unsupported KeePass 2 database version.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxXmlReader</name> + <message> + <source>XML parsing failure: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>No root group</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing icon uuid or data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing custom data key or value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Multiple group elements</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null group uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableAutoType value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableSearching value</source> + <translation type="unfinished"/> + </message> + <message> + <source>No group uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null DeleteObject uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing DeletedObject uuid or time</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null entry uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element in history entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>No entry uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element with different uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decrypt entry string</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate custom attribute found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry string key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate attachment found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry binary key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-type association window or sequence missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid bool value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid date time value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color rgb part</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid uuid value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decompress binary</source> + <extracomment>Translator meant is a binary data inside an entry</extracomment> + <translation type="unfinished"/> + </message> +</context> <context> <name>KeePass1OpenWidget</name> <message> @@ -1276,72 +2267,145 @@ Ainda assim deseja abrir a base de dados?</translation> <source>Unsupported KeePass database version.</source> <translation>Versão da base de dados KeePass não suportada.</translation> </message> + <message> + <source>Unable to read encryption IV</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of groups</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid content hash size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of transform rounds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to construct group tree</source> + <translation type="unfinished"/> + </message> <message> <source>Root</source> <translation>Raiz</translation> </message> - <message> - <source>Unable to calculate master key</source> - <translation>Incapaz de calcular a chave-mestre</translation> - </message> - <message> - <source>Wrong key or database file is corrupt.</source> - <translation>Chave errada ou base de dados danificada.</translation> - </message> -</context> -<context> - <name>KeePass2Reader</name> - <message> - <source>Not a KeePass database.</source> - <translation>Não é uma base de dados do KeePass.</translation> - </message> - <message> - <source>Unsupported KeePass database version.</source> - <translation>Versão da base de dados KeePass não suportada.</translation> - </message> - <message> - <source>Wrong key or database file is corrupt.</source> - <translation>Chave errada ou base de dados danificada.</translation> - </message> - <message> - <source>Unable to calculate master key</source> - <translation>Incapaz de calcular a chave-mestre</translation> - </message> - <message> - <source>Unable to issue challenge-response.</source> - <translation>Incapaz de emitir a pergunta de segurança.</translation> - </message> - <message> - <source>The selected file is an old KeePass 1 database (.kdb). - -You can import it by clicking on Database > 'Import KeePass 1 database...'. -This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> - <translation>O ficheiro selecionado é uma base de dados do KeePass 1 (.kdb). - -Pode importá-lo clicando em Base de dados - > 'Importar base de dados do KeePass 1...'. -Esta é uma migração unidirecional. Não será possível abrir a base de dados importada com a versão 0.4 do KeePassX.</translation> - </message> -</context> -<context> - <name>KeePass2Writer</name> - <message> - <source>Unable to issue challenge-response.</source> - <translation>Incapaz de emitir a pergunta de segurança.</translation> - </message> <message> <source>Unable to calculate master key</source> <translation>Impossível de calcular a chave-mestre</translation> </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>Chave errada ou base de dados danificada.</translation> + </message> + <message> + <source>Key transformation failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read group field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group access time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group level field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing group id or level</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing entry field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read entry field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry uuid field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field type</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Main</name> <message> - <source>Fatal error while testing the cryptographic functions.</source> - <translation>Erro fatal ao testar as funções de criptografia.</translation> - </message> - <message> - <source>KeePassXC - Error</source> - <translation>KeePassXC - Erro</translation> + <source>Existing single-instance lock file is invalid. Launching new instance.</source> + <translation>O ficheiro de bloqueio da instância única é inválido. A iniciar nova instância.</translation> </message> <message> <source>The lock file could not be created. Single-instance mode disabled.</source> @@ -1352,64 +2416,32 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados <translation>Já está em execução uma instância do KeePassXC.</translation> </message> <message> - <source>Existing single-instance lock file is invalid. Launching new instance.</source> - <translation>O ficheiro de bloqueio da instância única é inválido. A iniciar nova instância.</translation> + <source>Fatal error while testing the cryptographic functions.</source> + <translation>Erro fatal ao testar as funções de criptografia.</translation> + </message> + <message> + <source>KeePassXC - Error</source> + <translation>KeePassXC - Erro</translation> </message> </context> <context> <name>MainWindow</name> <message> - <source>Open database</source> - <translation>Abrir base de dados</translation> - </message> - <message> - <source>Database settings</source> - <translation>Definições da base de dados</translation> - </message> - <message> - <source>Copy username to clipboard</source> - <translation>Copiar nome de utilizador para a área de transferência</translation> - </message> - <message> - <source>Copy password to clipboard</source> - <translation>Copiar palavra-passe para a área de transferência</translation> - </message> - <message> - <source>Settings</source> - <translation>Definições</translation> - </message> - <message> - <source>Show toolbar</source> - <translation>Mostrar barra de ferramentas</translation> - </message> - <message> - <source>read-only</source> - <translation>apenas leitura</translation> - </message> - <message> - <source>Toggle window</source> - <translation>Alternar janela</translation> - </message> - <message> - <source>KeePass 2 Database</source> - <translation>Base de dados do KeePass 2</translation> - </message> - <message> - <source>All files</source> - <translation>Todos os ficheiros</translation> - </message> - <message> - <source>Save repaired database</source> - <translation>Guardar base de dados reparada</translation> - </message> - <message> - <source>Writing the database failed.</source> - <translation>Falha ao escrever na base de dados.</translation> + <source>&Database</source> + <translation>Base &de dados</translation> </message> <message> <source>&Recent databases</source> <translation>Bases de dados &recentes</translation> </message> + <message> + <source>Import</source> + <translation>Importar</translation> + </message> + <message> + <source>&Help</source> + <translation>Aj&uda</translation> + </message> <message> <source>E&ntries</source> <translation>E&ntradas</translation> @@ -1418,13 +2450,17 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados <source>Copy att&ribute to clipboard</source> <translation>Copiar at&ributo para a área de transferência</translation> </message> + <message> + <source>Time-based one-time password</source> + <translation type="unfinished"/> + </message> <message> <source>&Groups</source> <translation>&Grupos</translation> </message> <message> - <source>&View</source> - <translation>&Ver</translation> + <source>&Tools</source> + <translation>Ferramen&tas</translation> </message> <message> <source>&Quit</source> @@ -1434,6 +2470,10 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados <source>&About</source> <translation>&Acerca</translation> </message> + <message> + <source>&Open database...</source> + <translation>Abrir base de dad&os...</translation> + </message> <message> <source>&Save database</source> <translation>Guardar base de dado&s</translation> @@ -1474,26 +2514,26 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados <source>&Delete group</source> <translation>Apagar g&rupo</translation> </message> + <message> + <source>Sa&ve database as...</source> + <translation>G&uardar base de dados como...</translation> + </message> + <message> + <source>Change &master key...</source> + <translation>Alterar chave-&mestre...</translation> + </message> <message> <source>&Database settings</source> <translation>&Definições da base de dados</translation> </message> + <message> + <source>Database settings</source> + <translation>Definições da base de dados</translation> + </message> <message> <source>&Clone entry</source> <translation>&Clonar entrada</translation> </message> - <message> - <source>Timed one-time password</source> - <translation>Palavra-passe 'timed one-time'</translation> - </message> - <message> - <source>Copy &TOTP</source> - <translation>Copiar &TOTP</translation> - </message> - <message> - <source>Show TOTP</source> - <translation>Mostrar TOTP</translation> - </message> <message> <source>&Find</source> <translation>Locali&zar</translation> @@ -1502,14 +2542,26 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados <source>Copy &username</source> <translation>Copiar nome de &utilizador</translation> </message> + <message> + <source>Copy username to clipboard</source> + <translation>Copiar nome de utilizador para a área de transferência</translation> + </message> <message> <source>Cop&y password</source> <translation>Cop&iar palavra-passe</translation> </message> + <message> + <source>Copy password to clipboard</source> + <translation>Copiar palavra-passe para a área de transferência</translation> + </message> <message> <source>&Settings</source> <translation>Definiçõe&s</translation> </message> + <message> + <source>Password Generator</source> + <translation>Gerador de palavra-passe</translation> + </message> <message> <source>&Perform Auto-Type</source> <translation>E&xecutar escrita automática</translation> @@ -1526,65 +2578,25 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados <source>&Title</source> <translation>&Título</translation> </message> + <message> + <source>Copy title to clipboard</source> + <translation>Copiar título para a área de transferência</translation> + </message> <message> <source>&URL</source> <translation>&URL</translation> </message> + <message> + <source>Copy URL to clipboard</source> + <translation>Copiar URL para a área de transferência</translation> + </message> <message> <source>&Notes</source> <translation>&Notas</translation> </message> <message> - <source>Password Generator</source> - <translation>Gerador de palavras-passe</translation> - </message> - <message> - <source>Clear history</source> - <translation>Limpar histórico</translation> - </message> - <message> - <source>&Database</source> - <translation>Base &de dados</translation> - </message> - <message> - <source>Import</source> - <translation>Importar</translation> - </message> - <message> - <source>&Tools</source> - <translation>Ferramen&tas</translation> - </message> - <message> - <source>Empty recycle bin</source> - <translation>Limpar reciclagem</translation> - </message> - <message> - <source>Access error for config file %1</source> - <translation>Erro de acesso ao ficheiro %1</translation> - </message> - <message> - <source>Quit KeePassXC</source> - <translation>Sair do KeePassXC</translation> - </message> - <message> - <source>Please touch the button on your YubiKey!</source> - <translation>Toque no botão da sua YubiKey!</translation> - </message> - <message> - <source>&Help</source> - <translation>Aj&uda</translation> - </message> - <message> - <source>&Open database...</source> - <translation>Abrir base de dad&os...</translation> - </message> - <message> - <source>Sa&ve database as...</source> - <translation>G&uardar base de dados como...</translation> - </message> - <message> - <source>Change &master key...</source> - <translation>Alterar chave-&mestre...</translation> + <source>Copy notes to clipboard</source> + <translation>Copiar notas para a área de transferência</translation> </message> <message> <source>&Export to CSV file...</source> @@ -1602,10 +2614,169 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados <source>Re&pair database...</source> <translation>Re&parar base de dados...</translation> </message> + <message> + <source>Show TOTP</source> + <translation>Mostrar TOTP</translation> + </message> <message> <source>Set up TOTP...</source> <translation>Configurar TOTP...</translation> </message> + <message> + <source>Copy &TOTP</source> + <translation>Copiar &TOTP</translation> + </message> + <message> + <source>E&mpty recycle bin</source> + <translation>Limpar reciclage&m</translation> + </message> + <message> + <source>Clear history</source> + <translation>Limpar histórico</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation>Erro de acesso ao ficheiro %1</translation> + </message> + <message> + <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> + <translation type="unfinished"/> + </message> + <message> + <source>read-only</source> + <translation>apenas leitura</translation> + </message> + <message> + <source>Settings</source> + <translation>Definições</translation> + </message> + <message> + <source>Toggle window</source> + <translation>Alternar janela</translation> + </message> + <message> + <source>Quit KeePassXC</source> + <translation>Sair do KeePassXC</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>Base de dados do KeePass 2</translation> + </message> + <message> + <source>All files</source> + <translation>Todos os ficheiros</translation> + </message> + <message> + <source>Open database</source> + <translation>Abrir base de dados</translation> + </message> + <message> + <source>Save repaired database</source> + <translation>Guardar base de dados reparada</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>Falha ao escrever na base de dados.</translation> + </message> + <message> + <source>Please touch the button on your YubiKey!</source> + <translation>Toque no botão da sua YubiKey!</translation> + </message> +</context> +<context> + <name>OpenSSHKey</name> + <message> + <source>Invalid key file, expecting an OpenSSH key</source> + <translation type="unfinished"/> + </message> + <message> + <source>PEM boundary mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>This is not an OpenSSH key, only modern keys are supported</source> + <translation type="unfinished"/> + </message> + <message> + <source>Base64 decoding failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file way too small.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file magic header id invalid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Found zero keys</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to read public key.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Corrupted key file, reading private key failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>No private key payload to decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Trying to run KDF without cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Passphrase is required to decrypt this key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key derivation failed, key file corrupted?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Decryption failed, wrong passphrase?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write public key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write private key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing private key</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OptionDialog</name> @@ -1613,22 +2784,63 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados <source>Dialog</source> <translation>Diálogo</translation> </message> + <message> + <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation>Necessária para aceder às bases de dados através do ChromeIPass ou do PassIFox</translation> + </message> + <message> + <source>Enable KeePassHTTP server</source> + <translation>Ativar servidor KeePassHTTP</translation> + </message> <message> <source>General</source> <translation>Geral</translation> </message> <message> <source>Sh&ow a notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> <translation>M&ostrar notificação se as credenciais forem solicitadas</translation> </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>Apenas devolve as melhores entradas para o URL específico em vez das entradas para o domínio.</translation> + </message> + <message> + <source>&Return only best matching entries</source> + <translation>Devolve&r apenas as entradas coincidentes</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Pe&dir para desbloquear a base de dados se esta estiver bloqueada</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> + <translation>Apenas serão devolvidas as entradas com o mesmo esquema (http://, https://, ftp://, ...).</translation> + </message> + <message> + <source>&Match URL schemes</source> + <translation>Corresponder com os esque&mas do URL</translation> + </message> <message> <source>Sort matching entries by &username</source> <translation>Ordenar entradas coincidentes por nome de &utilizador</translation> </message> + <message> + <source>Sort &matching entries by title</source> + <translation>Ordenar &entradas por título</translation> + </message> + <message> + <source>R&emove all shared encryption keys from active database</source> + <translation>R&emover todas as chaves de cifra partilhadas da base de dados ativa</translation> + </message> <message> <source>Re&move all stored permissions from entries in active database</source> <translation>Re&mover todas as permissões guardadas para as entradas da base de dados ativa</translation> </message> + <message> + <source>Password Generator</source> + <translation>Gerador de palavra-passe</translation> + </message> <message> <source>Advanced</source> <translation>Avançado</translation> @@ -1641,10 +2853,22 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados <source>Always allow &updating entries</source> <translation>Permitir sempre at&ualizar as entradas</translation> </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>Apenas a base de dados selecionada tem que estar conectada a um cliente.</translation> + </message> <message> <source>Searc&h in all opened databases for matching entries</source> <translation>Procurar em todas as base de dados abertas por entradas semel&hantes</translation> </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>A criação ou atualização dos campos de cadeias não é suportada.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>Most&rar campos avançados que começam com "KPH: "</translation> + </message> <message> <source>HTTP Port:</source> <translation>Porta HTTP:</translation> @@ -1653,18 +2877,18 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados <source>Default port: 19455</source> <translation>Porta padrão: 19455</translation> </message> - <message> - <source>Re&quest to unlock the database if it is locked</source> - <translation>Pe&dir para desbloquear a base de dados se esta estiver bloqueada</translation> - </message> - <message> - <source>Sort &matching entries by title</source> - <translation>Ordenar &entradas por título</translation> - </message> <message> <source>KeePassXC will listen to this port on 127.0.0.1</source> <translation>O KeePassXC vai escutar nesta porta em 127.0.0.1</translation> </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> + <translation type="unfinished"/> + </message> <message> <source>Cannot bind to privileged ports</source> <translation>Incapaz de associar às portas privilegiadas </translation> @@ -1675,63 +2899,30 @@ Using default port 19455.</source> <translation>Não é possível associar a portas privilegiadas inferiores à 1024! Será utilizada a porta 19455 (padrão).</translation> </message> - <message> - <source>R&emove all shared encryption keys from active database</source> - <translation>R&emover todas as chaves cifradas partilhadas da base de dados ativa</translation> - </message> - <message> - <source>&Return advanced string fields which start with "KPH: "</source> - <translation>Most&rar campos avançados que começam com "KPH: "</translation> - </message> - <message> - <source>Automatically creating or updating string fields is not supported.</source> - <translation>A criação ou atualização dos campos de cadeias não é suportada.</translation> - </message> - <message> - <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> - <translation>Necessária para aceder às bases de dados através do ChromeIPass ou do PassIFox</translation> - </message> - <message> - <source>Enable KeePassHTTP server</source> - <translation>Ativar servidor KeePassHTTP</translation> - </message> - <message> - <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation>Apenas devolve as melhores entradas para o URL específico em vez das entradas para o domínio.</translation> - </message> - <message> - <source>&Return only best matching entries</source> - <translation>Devolve&r apenas as entradas coincidentes</translation> - </message> - <message> - <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation>Apenas serão devolvidas as entradas com o mesmo esquema (http://, https://, ftp://, ...).</translation> - </message> - <message> - <source>&Match URL schemes</source> - <translation>Corresponder com os esque&mas do URL</translation> - </message> - <message> - <source>Password Generator</source> - <translation>Gerador de palavra-passe</translation> - </message> - <message> - <source>Only the selected database has to be connected with a client.</source> - <translation>Apenas a base de dados selecionada tem que estar conectada a um cliente.</translation> - </message> - <message> - <source>The following options can be dangerous! -Change them only if you know what you are doing.</source> - <translation>As opções seguintes podem ser perigosas! -Apenas as deve alterar se souber o que está a fazer.</translation> - </message> </context> <context> <name>PasswordGeneratorWidget</name> + <message> + <source>%p%</source> + <translation>%p%</translation> + </message> <message> <source>Password:</source> <translation>Palavra-passe:</translation> </message> + <message> + <source>strength</source> + <comment>Password strength</comment> + <translation>qualidade</translation> + </message> + <message> + <source>entropy</source> + <translation>entropia</translation> + </message> + <message> + <source>Password</source> + <translation>Palavra-passe</translation> + </message> <message> <source>Character Types</source> <translation>Tipos de caracteres</translation> @@ -1750,40 +2941,52 @@ Apenas as deve alterar se souber o que está a fazer.</translation> </message> <message> <source>Special Characters</source> - <translation>Caracteres especiais</translation> + <translation>Caracteres especiais</translation> + </message> + <message> + <source>Extended ASCII</source> + <translation>ASCII expandido</translation> </message> <message> <source>Exclude look-alike characters</source> <translation>Excluir caracteres semelhantes</translation> </message> <message> - <source>Accept</source> - <translation>Aceitar</translation> - </message> - <message> - <source>%p%</source> - <translation>%p%</translation> - </message> - <message> - <source>strength</source> - <translation>qualidade</translation> - </message> - <message> - <source>entropy</source> - <translation>entropia</translation> + <source>Pick characters from every group</source> + <translation>Obter caracteres de todos os grupos</translation> </message> <message> <source>&Length:</source> <translation>&Comprimento:</translation> </message> <message> - <source>Pick characters from every group</source> - <translation>Obter caracteres de todos os grupos</translation> + <source>Passphrase</source> + <translation>Frase-chave</translation> + </message> + <message> + <source>Wordlist:</source> + <translation>Lista de palavras:</translation> + </message> + <message> + <source>Word Count:</source> + <translation>Número de palavras:</translation> + </message> + <message> + <source>Word Separator:</source> + <translation>Separador de palavras:</translation> </message> <message> <source>Generate</source> <translation>Gerar</translation> </message> + <message> + <source>Copy</source> + <translation>Copiar</translation> + </message> + <message> + <source>Accept</source> + <translation>Aceitar</translation> + </message> <message> <source>Close</source> <translation>Fechar</translation> @@ -1802,51 +3005,270 @@ Apenas as deve alterar se souber o que está a fazer.</translation> </message> <message> <source>Poor</source> + <comment>Password quality</comment> <translation>Má</translation> </message> <message> <source>Weak</source> + <comment>Password quality</comment> <translation>Fraca</translation> </message> <message> <source>Good</source> + <comment>Password quality</comment> <translation>Boa</translation> </message> <message> <source>Excellent</source> + <comment>Password quality</comment> <translation>Excelente</translation> </message> - <message> - <source>Password</source> - <translation>Palavra-passe</translation> - </message> - <message> - <source>Extended ASCII</source> - <translation>ASCII expandido</translation> - </message> - <message> - <source>Passphrase</source> - <translation>Frase-chave</translation> - </message> - <message> - <source>Wordlist:</source> - <translation>Lista de palavras:</translation> - </message> - <message> - <source>Word Count:</source> - <translation>Número de palavras:</translation> - </message> - <message> - <source>Word Separator:</source> - <translation>Separador de palavras:</translation> - </message> - <message> - <source>Copy</source> - <translation>Copiar</translation> - </message> </context> <context> <name>QObject</name> + <message> + <source>Database not opened</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database hash not available</source> + <translation type="unfinished"/> + </message> + <message> + <source>Client public key not received</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot decrypt message</source> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout or cannot connect to KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>Action cancelled or denied</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC association failed, try again</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key change was not successful</source> + <translation type="unfinished"/> + </message> + <message> + <source>Encryption key is not recognized</source> + <translation type="unfinished"/> + </message> + <message> + <source>No saved databases found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect action</source> + <translation type="unfinished"/> + </message> + <message> + <source>Empty message received</source> + <translation type="unfinished"/> + </message> + <message> + <source>No URL provided</source> + <translation type="unfinished"/> + </message> + <message> + <source>No logins found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown error</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add a new entry to a database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>Caminho da base de dados.</translation> + </message> + <message> + <source>Key file of the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>path</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>username</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Prompt for the entry's password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a password for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length for the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to add.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy an entry's password to the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to clip.</source> + <comment>clip = copy to clipboard</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout in seconds before clearing the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Edit an entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Title for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>title</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to edit.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Estimate the entropy of a password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password for which to estimate the entropy.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Perform advanced analysis on the password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Extract and print the content of a database.</source> + <translation>Extrair e mostrar o conteúdo da base de dados.</translation> + </message> + <message> + <source>Path of the database to extract.</source> + <translation>Caminho da base de dados a extrair.</translation> + </message> + <message> + <source>Insert password to unlock %1: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to load key file %1 : %2</source> + <translation type="unfinished"/> + </message> + <message> + <source>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source> + +Available commands: +</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the command to execute.</source> + <translation>Nome do comando a executar.</translation> + </message> + <message> + <source>List database entries.</source> + <translation>Listar entradas da base de dados.</translation> + </message> + <message> + <source>Path of the group to list. Default is /</source> + <translation>Caminho do grupo a listar. Padrão é /</translation> + </message> + <message> + <source>Find entries quickly.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Search term.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Merge two databases.</source> + <translation>Combinar duas bases de dados.</translation> + </message> + <message> + <source>Path of the database to merge into.</source> + <translation>Caminho da base de dados de destino da combinação.</translation> + </message> + <message> + <source>Path of the database to merge from.</source> + <translation>Caminho da base de dados de origem da combinação.</translation> + </message> + <message> + <source>Use the same credentials for both database files.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file of the database to merge from.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show an entry's information.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> + <translation type="unfinished"/> + </message> + <message> + <source>attribute</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the entry to show.</source> + <translation>Nome da entrada a mostrar.</translation> + </message> <message> <source>NULL device</source> <translation>Dispositivo NULL</translation> @@ -1870,8 +3292,28 @@ Apenas as deve alterar se souber o que está a fazer.</translation> <translation>carácter de fecho em falta</translation> </message> <message> - <source>INTERNAL - unget lower bound exceeded</source> - <translation>INTERNO - limite inferior 'unget' excedido</translation> + <source>AES: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Twofish: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>ChaCha20: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Argon2 (KDBX 4 – recommended)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 4)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 3.1)</source> + <translation type="unfinished"/> </message> <message> <source>Group</source> @@ -1889,14 +3331,22 @@ Apenas as deve alterar se souber o que está a fazer.</translation> <source>Password</source> <translation>Palavra-passe</translation> </message> - <message> - <source>URL</source> - <translation>URL</translation> - </message> <message> <source>Notes</source> <translation>Notas</translation> </message> + <message> + <source>Last Modified</source> + <translation type="unfinished"/> + </message> + <message> + <source>Created</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy Browser Integration</source> + <translation type="unfinished"/> + </message> <message> <source>Browser Integration</source> <translation>Integração com navegador</translation> @@ -1913,6 +3363,10 @@ Apenas as deve alterar se souber o que está a fazer.</translation> <source>Passive</source> <translation>Passiva</translation> </message> + <message> + <source>SSH Agent</source> + <translation type="unfinished"/> + </message> </context> <context> <name>QtIOCompressor</name> @@ -1951,8 +3405,8 @@ Apenas as deve alterar se souber o que está a fazer.</translation> <context> <name>SearchWidget</name> <message> - <source>Case Sensitive</source> - <translation>Maiúsculas/minúsculas</translation> + <source>Search...</source> + <translation>Pesquisa...</translation> </message> <message> <source>Search</source> @@ -1963,8 +3417,8 @@ Apenas as deve alterar se souber o que está a fazer.</translation> <translation>Limpar</translation> </message> <message> - <source>Search...</source> - <translation>Pesquisa...</translation> + <source>Case Sensitive</source> + <translation>Maiúsculas/minúsculas</translation> </message> <message> <source>Limit search to selected group</source> @@ -1973,50 +3427,6 @@ Apenas as deve alterar se souber o que está a fazer.</translation> </context> <context> <name>Service</name> - <message> - <source>A shared encryption-key with the name "%1" already exists. -Do you want to overwrite it?</source> - <translation>Já existe uma chave de cifra partilhada com o nome "%1". -Deseja substituir a chave de cifra?</translation> - </message> - <message> - <source>Do you want to update the information in %1 - %2?</source> - <translation>Deseja atualizar as informações em %1 - %2?</translation> - </message> - <message> - <source>The active database is locked! -Please unlock the selected database or choose another one which is unlocked.</source> - <translation>A base de dados ativa está bloqueada! -Desbloqueie a base de dados selecionada ou escolha outra que esteja desbloqueada.</translation> - </message> - <message> - <source>Successfully removed %1 encryption-%2 from KeePassX/Http Settings.</source> - <translation>Removidas com sucesso %1 de cifra - %2 das definições do KeePassXHttp.</translation> - </message> - <message> - <source>No shared encryption-keys found in KeePassHttp Settings.</source> - <translation>Nenhuma chaves de cifra partilhadas encontrada nas definições do KeePassHttp.</translation> - </message> - <message> - <source>The active database does not contain an entry of KeePassHttp Settings.</source> - <translation>A base de dados ativa não contém uma entrada de definições KeePassHttp.</translation> - </message> - <message> - <source>Removing stored permissions...</source> - <translation>A remover permissões guardadas...</translation> - </message> - <message> - <source>Abort</source> - <translation>Abortar</translation> - </message> - <message> - <source>Successfully removed permissions from %1 %2.</source> - <translation>Removidas com sucesso as permissões de %1 %2.</translation> - </message> - <message> - <source>The active database does not contain an entry with permissions.</source> - <translation>A base de dados ativa não contém uma entrada com permissões.</translation> - </message> <message> <source>KeePassXC: New key association request</source> <translation>KeePassXC: Pedido de associação de nova chave</translation> @@ -2033,34 +3443,78 @@ KeePassXC, atribua um nome único para a identificar e aceitar.</translation> <source>KeePassXC: Overwrite existing key?</source> <translation>KeePassXC: Substituir chave existente?</translation> </message> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>Já existe uma chave de cifra partilhada com o nome "%1". +Deseja substituir a chave atual?</translation> + </message> <message> <source>KeePassXC: Update Entry</source> <translation>KeePassXC: Atualizar entrada</translation> </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Deseja atualizar as informações em %1 - %2?</translation> + </message> <message> <source>KeePassXC: Database locked!</source> <translation>KeePassXC: Base de dados bloqueada!</translation> </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>A base de dados ativa está bloqueada! +Desbloqueie a base de dados selecionada ou escolha outra que esteja desbloqueada.</translation> + </message> <message> <source>KeePassXC: Removed keys from database</source> <translation>KeePassXC: Remover chaves da base de dados</translation> </message> + <message numerus="yes"> + <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No keys found</source> <translation>KeePassXC: Nenhuma chave encontrada</translation> </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation>Não existem chaves de cifra partilhadas nas definições do KeePassHttp.</translation> + </message> <message> <source>KeePassXC: Settings not available!</source> <translation>KeePassXC: Definições indisponíveis!</translation> </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation>A base de dados ativa não contém uma entrada de definições KeePassHttp.</translation> + </message> + <message> + <source>Removing stored permissions...</source> + <translation>A remover permissões guardadas...</translation> + </message> + <message> + <source>Abort</source> + <translation>Abortar</translation> + </message> <message> <source>KeePassXC: Removed permissions</source> <translation>KeePassXC: Permissões removidas</translation> </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entries.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No entry with permissions found!</source> <translation>KeePassXC: Não existem entradas com permissões!</translation> </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>A base de dados ativa não contém uma entrada com permissões.</translation> + </message> </context> <context> <name>SettingsWidget</name> @@ -2083,10 +3537,26 @@ KeePassXC, atribua um nome único para a identificar e aceitar.</translation> </context> <context> <name>SettingsWidgetGeneral</name> + <message> + <source>Basic Settings</source> + <translation>Definições básicas</translation> + </message> + <message> + <source>Start only a single instance of KeePassXC</source> + <translation>Abrir apenas uma instância do KeepassXC</translation> + </message> <message> <source>Remember last databases</source> <translation>Memorizar últimas bases de dados</translation> </message> + <message> + <source>Remember last key files and security dongles</source> + <translation>Memorizar últimos ficheiros-chave e dispositivos de segurança</translation> + </message> + <message> + <source>Load previous databases on startup</source> + <translation>Ao iniciar, carregar a última base de dados utilizada</translation> + </message> <message> <source>Automatically save on exit</source> <translation>Guardar automaticamente ao fechar</translation> @@ -2095,21 +3565,29 @@ KeePassXC, atribua um nome único para a identificar e aceitar.</translation> <source>Automatically save after every change</source> <translation>Guardar automaticamente a cada alteração</translation> </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation>Recarregar base de dados se esta for modificada externamente</translation> + </message> <message> <source>Minimize when copying to clipboard</source> <translation>Minimizar ao copiar para a área de transferência</translation> </message> + <message> + <source>Minimize window at application startup</source> + <translation>Minimizar janela ao iniciar a aplicação</translation> + </message> <message> <source>Use group icon on entry creation</source> <translation>Utilizar ícone do grupo ao criar a entrada</translation> </message> <message> - <source>Global Auto-Type shortcut</source> - <translation>Atalho global de escrita automática</translation> + <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> + <translation>Não marcar base de dados como alterada para modificações não efetuadas em dados (ex.: expansão de grupos)</translation> </message> <message> - <source>Language</source> - <translation>Idioma</translation> + <source>Hide the Details view</source> + <translation type="unfinished"/> </message> <message> <source>Show a system tray icon</source> @@ -2119,76 +3597,74 @@ KeePassXC, atribua um nome único para a identificar e aceitar.</translation> <source>Hide window to system tray when minimized</source> <translation>Ao minimizar, ocultar a janela na bandeja do sistema</translation> </message> - <message> - <source>Load previous databases on startup</source> - <translation>Ao iniciar, carregar a última base de dados utilizada</translation> - </message> - <message> - <source>Automatically reload the database when modified externally</source> - <translation>Recarregar base de dados se esta for modificada externamente</translation> - </message> <message> <source>Hide window to system tray instead of app exit</source> <translation>Ao fechar, ocultar a janela na bandeja do sistema</translation> </message> <message> - <source>Minimize window at application startup</source> - <translation>Minimizar janela ao iniciar a aplicação</translation> + <source>Dark system tray icon</source> + <translation type="unfinished"/> </message> <message> - <source>Basic Settings</source> - <translation>Definições básicas</translation> - </message> - <message> - <source>Remember last key files and security dongles</source> - <translation>Memorizar últimos ficheiros-chave e dispositivos de segurança</translation> - </message> - <message> - <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> - <translation>Não marcar base de dados como alterada para modificações não efetuadas em dados (ex.: expansão de grupos)</translation> + <source>Language</source> + <translation>Idioma</translation> </message> <message> <source>Auto-Type</source> <translation>Escrita automática</translation> </message> <message> - <source>Use entry title and URL to match windows for global Auto-Type</source> - <translation>Utilizar título da entrada e URL para correspondência entre as janelas e a escrita automática</translation> + <source>Use entry title to match windows for global Auto-Type</source> + <translation>Utilizar título da entrada para fazer coincidir com a escrita automática</translation> + </message> + <message> + <source>Use entry URL to match windows for global Auto-Type</source> + <translation>Utilizar URL da entrada para fazer coincidir com a escrita automática</translation> </message> <message> <source>Always ask before performing Auto-Type</source> <translation>Perguntar antes de executar a escrita automática</translation> </message> + <message> + <source>Global Auto-Type shortcut</source> + <translation>Atalho global de escrita automática</translation> + </message> <message> <source>Auto-Type delay</source> <translation>Atraso de escrita automática</translation> </message> <message> <source> ms</source> + <comment>Milliseconds</comment> <translation> ms</translation> </message> - <message> - <source>Start only a single instance of KeePassXC</source> - <translation>Abrir apenas uma instância do KeepassXC</translation> - </message> </context> <context> <name>SettingsWidgetSecurity</name> + <message> + <source>Timeouts</source> + <translation>Tempo limite</translation> + </message> <message> <source>Clear clipboard after</source> <translation>Limpar área de transferência após</translation> </message> <message> <source> sec</source> - <translation> seg</translation> + <comment>Seconds</comment> + <translation> seg.</translation> </message> <message> <source>Lock databases after inactivity of</source> <translation>Bloquear base de dados se inativa durante</translation> </message> <message> - <source>Show passwords in cleartext by default</source> - <translation>Mostrar palavras-passe em texto simples</translation> + <source>Convenience</source> + <translation>Conveniência</translation> + </message> + <message> + <source>Lock databases when session is locked or lid is closed</source> + <translation>Bloquear base de dados ao bloquear a sessão ou ao fechar a tampa do portátil</translation> </message> <message> <source>Lock databases after minimizing the window</source> @@ -2199,16 +3675,16 @@ KeePassXC, atribua um nome único para a identificar e aceitar.</translation> <translation>Não pedir repetição da palavra-passe se esta estiver visível</translation> </message> <message> - <source>Timeouts</source> - <translation>Tempo limite</translation> + <source>Show passwords in cleartext by default</source> + <translation>Mostrar palavras-passe em texto simples</translation> </message> <message> - <source>Convenience</source> - <translation>Conveniência</translation> + <source>Hide passwords in the preview panel</source> + <translation type="unfinished"/> </message> <message> - <source>Lock databases when session is locked or lid is closed</source> - <translation>Bloquear base de dados ao bloquear a sessão ou ao fechar a tampa do portátil</translation> + <source>Hide entry notes by default</source> + <translation type="unfinished"/> </message> <message> <source>Privacy</source> @@ -2229,6 +3705,14 @@ KeePassXC, atribua um nome único para a identificar e aceitar.</translation> <source>Key:</source> <translation>Chave:</translation> </message> + <message> + <source>Default RFC 6238 token settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Steam token settings</source> + <translation type="unfinished"/> + </message> <message> <source>Use custom settings</source> <translation>Usar definições personalizadas</translation> @@ -2255,6 +3739,7 @@ KeePassXC, atribua um nome único para a identificar e aceitar.</translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation> seg.</translation> </message> </context> @@ -2321,6 +3806,26 @@ KeePassXC, atribua um nome único para a identificar e aceitar.</translation> </context> <context> <name>main</name> + <message> + <source>Remove an entry from the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>Caminho da base de dados.</translation> + </message> + <message> + <source>Path of the entry to remove.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation>KeePassXC - Gestor de palavras-passe multi-plataforma</translation> + </message> + <message> + <source>filenames of the password databases to open (*.kdbx)</source> + <translation>nome de ficheiro das bases de dados a abrir (*.kdbx)</translation> + </message> <message> <source>path to a custom config file</source> <translation>caminho para um ficheiro de configuração personalizado</translation> @@ -2329,81 +3834,13 @@ KeePassXC, atribua um nome único para a identificar e aceitar.</translation> <source>key file of the database</source> <translation>ficheiro-chave da base de dados</translation> </message> - <message> - <source>KeePassXC - cross-platform password manager</source> - <translation>KeePassXC - Gestor de palavras-passe multi-plataforma</translation> - </message> <message> <source>read password of the database from stdin</source> <translation>ler palavra-passe da base de dados a partir de stdin</translation> </message> <message> - <source>filenames of the password databases to open (*.kdbx)</source> - <translation>nome de ficheiro das bases de dados a abrir (*.kdbx)</translation> - </message> - <message> - <source>Copy a password to the clipboard</source> - <translation>Copiar palavra-passe para a área de transferência</translation> - </message> - <message> - <source>Path of the database.</source> - <translation>Caminho da base de dados.</translation> - </message> - <message> - <source>Use a GUI prompt unlocking the database.</source> - <translation>Usar um GUI para desbloquear a base de dados.</translation> - </message> - <message> - <source>Name of the entry to clip.</source> - <translation>Nome da entrada a copiar.</translation> - </message> - <message> - <source>Extract and print the content of a database.</source> - <translation>Extrair e mostrar o conteúdo da base de dados.</translation> - </message> - <message> - <source>Path of the database to extract.</source> - <translation>Caminho da base de dados a extrair.</translation> - </message> - <message> - <source>Name of the command to execute.</source> - <translation>Nome do comando a executar.</translation> - </message> - <message> - <source>List database entries.</source> - <translation>Listar entradas da base de dados.</translation> - </message> - <message> - <source>Path of the group to list. Default is /</source> - <translation>Caminho do grupo a listar. Padrão é /</translation> - </message> - <message> - <source>Print the UUIDs of the entries and groups.</source> - <translation>Mostrar os UUID das entradas e dos grupos.</translation> - </message> - <message> - <source>Merge two databases.</source> - <translation>Combinar duas bases de dados.</translation> - </message> - <message> - <source>Path of the database to merge into.</source> - <translation>Caminho da base de dados de destino da combinação.</translation> - </message> - <message> - <source>Path of the database to merge from.</source> - <translation>Caminho da base de dados de origem da combinação.</translation> - </message> - <message> - <source>Use the same password for both database files.</source> - <translation>Utilizar a mesma palavra-passe para ambas as bases de dados.</translation> - </message> - <message> - <source>Show a password.</source> - <translation>Mostrar palavra-passe.</translation> - </message> - <message> - <source>Name of the entry to show.</source> - <translation>Nome da entrada a mostrar.</translation> + <source>Parent window handle</source> + <translation type="unfinished"/> </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_ru.ts b/share/translations/keepassx_ru.ts index 3058bcf14..6fbe2c430 100644 --- a/share/translations/keepassx_ru.ts +++ b/share/translations/keepassx_ru.ts @@ -9,14 +9,34 @@ <source>About</source> <translation>О программе</translation> </message> + <message> + <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> + <translation>Сообщать об ошибках: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> + </message> + <message> + <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>KeePassXC распространяется на условиях Стандартной общественной лицензии GNU (GPL) версии 2 или (на ваше усмотрение) версии 3.</translation> + </message> + <message> + <source>Project Maintainers:</source> + <translation>Проект сопровождают:</translation> + </message> <message> <source>Contributors</source> <translation>Участники</translation> </message> + <message> + <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Посмотреть вклад на GitHub</a></translation> + </message> <message> <source>Debug Info</source> <translation>Отладочная информация</translation> </message> + <message> + <source>Include the following information whenever you report a bug:</source> + <translation>Включите следующую информацию, когда сообщаете об ошибке:</translation> + </message> <message> <source>Copy to clipboard</source> <translation>Скопировать в буфер обмена</translation> @@ -31,6 +51,10 @@ <source>Revision: %1</source> <translation>Ревизия: %1</translation> </message> + <message> + <source>Distribution: %1</source> + <translation>Дистрибутив: %1</translation> + </message> <message> <source>Libraries:</source> <translation>Библиотеки:</translation> @@ -47,33 +71,13 @@ Kernel: %3 %4</source> <source>Enabled extensions:</source> <translation>Включенные расширения:</translation> </message> - <message> - <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> - <translation>Сообщать об ошибках: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> - </message> - <message> - <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassXC распространяется на условиях Стандартной общественной лицензии GNU (GPL) версии 2 или (на ваше усмотрение) версии 3.</translation> - </message> - <message> - <source>Project Maintainers:</source> - <translation>Сопровождающие проекта:</translation> - </message> - <message> - <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Посмотреть вклад на GitHub</a></translation> - </message> - <message> - <source>Include the following information whenever you report a bug:</source> - <translation>Включите следующую информацию, когда сообщаете об ошибке:</translation> - </message> - <message> - <source>Distribution: %1</source> - <translation>Дистрибутив: %1</translation> - </message> </context> <context> <name>AccessControlDialog</name> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>Подтверждение доступа к KeePassXC HTTP</translation> + </message> <message> <source>Remember this decision</source> <translation>Запомнить это решение</translation> @@ -92,9 +96,12 @@ Please select whether you want to allow access.</source> <translation>%1 запросил доступ к паролям для следующего элемента(ов). Разрешить доступ?</translation> </message> +</context> +<context> + <name>AgentSettingsWidget</name> <message> - <source>KeePassXC HTTP Confirm Access</source> - <translation>Подтверждение доступа к KeePassXC HTTP</translation> + <source>Enable SSH Agent (requires restart)</source> + <translation>Включить агент SSH (требуется перезапуск)</translation> </message> </context> <context> @@ -107,6 +114,26 @@ Please select whether you want to allow access.</source> <source>Auto-Type - KeePassXC</source> <translation>Автоввод - KeePassXC</translation> </message> + <message> + <source>Auto-Type</source> + <translation>Автоввод</translation> + </message> + <message> + <source>The Syntax of your Auto-Type statement is incorrect!</source> + <translation>Неверная инструкции автоввода!</translation> + </message> + <message> + <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> + <translation>Слишком большая задержка в инструкции автоввода. Вы действительно хотите продолжить?</translation> + </message> + <message> + <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> + <translation>Инструкция автоввода содержит очень медленные нажатия клавиш. Вы действительно хотите продолжить?</translation> + </message> + <message> + <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> + <translation>Эта команда автоввода содержит часто повторяющиеся аргументы. Вы действительно хотите продолжить?</translation> + </message> </context> <context> <name>AutoTypeAssociationsModel</name> @@ -125,13 +152,294 @@ Please select whether you want to allow access.</source> </context> <context> <name>AutoTypeSelectDialog</name> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>Автоввод - KeePassXC</translation> + </message> <message> <source>Select entry to Auto-Type:</source> <translation>Выберите запись для автоввода:</translation> </message> +</context> +<context> + <name>BrowserAccessControlDialog</name> <message> - <source>Auto-Type - KeePassXC</source> - <translation>Автоввод - KeePassXC</translation> + <source>KeePassXC-Browser Confirm Access</source> + <translation>Подтверждение доступа для KeePassXC-Browser</translation> + </message> + <message> + <source>Remember this decision</source> + <translation>Запомнить это решение</translation> + </message> + <message> + <source>Allow</source> + <translation>Разрешить</translation> + </message> + <message> + <source>Deny</source> + <translation>Запретить</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 запросил доступ к паролям для следующего элемента(ов). +Разрешить доступ?</translation> + </message> +</context> +<context> + <name>BrowserOptionDialog</name> + <message> + <source>Dialog</source> + <translation>Диалог</translation> + </message> + <message> + <source>This is required for accessing your databases with KeePassXC-Browser</source> + <translation>Это требуется для доступа к вашей базы данных с KeePassXC-Browser</translation> + </message> + <message> + <source>Enable KeepassXC browser integration</source> + <translation>Включить интеграцию с браузером</translation> + </message> + <message> + <source>General</source> + <translation>Общие</translation> + </message> + <message> + <source>Enable integration for these browsers:</source> + <translation>Включить интеграцию для браузеров:</translation> + </message> + <message> + <source>&Google Chrome</source> + <translation>&Google Chrome</translation> + </message> + <message> + <source>&Firefox</source> + <translation>&Firefox</translation> + </message> + <message> + <source>&Chromium</source> + <translation>&Chromium</translation> + </message> + <message> + <source>&Vivaldi</source> + <translation>&Vivaldi</translation> + </message> + <message> + <source>Show a &notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Показывать &уведомление при запросе учётных данных</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Запрашивать разблокировку базы данных, если она заблокирована</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> + <translation>Возвращаются только записи с той же схемой (http://, https://,...).</translation> + </message> + <message> + <source>&Match URL scheme (e.g., https://...)</source> + <translation>&Совпадение схем URL-адресов (например: https://...)</translation> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>Возвращает только лучшие совпадения для определенного URL-адреса вместо всех записей для всего домена.</translation> + </message> + <message> + <source>&Return only best-matching credentials</source> + <translation>&Возвращать только наиболее подходящие совпадения</translation> + </message> + <message> + <source>Sort &matching credentials by title</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Сортировать &подходящие учетные данные по названию</translation> + </message> + <message> + <source>Sort matching credentials by &username</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Сортировать по &имени пользователя</translation> + </message> + <message> + <source>&Disconnect all browsers</source> + <translation>&Отключить все браузеры</translation> + </message> + <message> + <source>Forget all remembered &permissions</source> + <translation>Забыть все &разрешения</translation> + </message> + <message> + <source>Advanced</source> + <translation>Продвинутые</translation> + </message> + <message> + <source>Never &ask before accessing credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Не &запрашивать доступ к записям</translation> + </message> + <message> + <source>Never ask before &updating credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Никогда не спрашивать перед &обновлением учетных данных</translation> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>К клиенту должна быть подключена только выбранная база данных.</translation> + </message> + <message> + <source>Searc&h in all opened databases for matching credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>Автоматическое создание или обновление полей, содержащих строки, не поддерживается.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>Возвращать продвинутые стро&ковые поля, начинающиеся с «KPH: »</translation> + </message> + <message> + <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Update &native messaging manifest files at startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Support a proxy application between KeePassXC and browser extension.</source> + <translation>Поддержка прокси приложения между KeePassXC и расширением браузера.</translation> + </message> + <message> + <source>Use a &proxy application between KeePassXC and browser extension</source> + <translation>Использование &прокси приложения между KeePassXC и расширением браузера</translation> + </message> + <message> + <source>Use a custom proxy location if you installed a proxy manually.</source> + <translation>Использовать пользовательский путь к прокси, если вы установили прокси вручную.</translation> + </message> + <message> + <source>Use a &custom proxy location</source> + <comment>Meant is the proxy for KeePassXC-Browser</comment> + <translation>Использовать &пользовательское местоположение прокси</translation> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Обзор...</translation> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation><b>Предупреждение:</b> Следующие параметры могут быть опасны!</translation> + </message> + <message> + <source>Executable Files (*.exe);;All Files (*.*)</source> + <translation>Исполняемые файлы (*.exe);;Все файлы (*.*)</translation> + </message> + <message> + <source>Executable Files (*)</source> + <translation>Исполняемые файлы (*)</translation> + </message> + <message> + <source>Select custom proxy location</source> + <translation>Выбрать другое расположение прокси</translation> + </message> +</context> +<context> + <name>BrowserService</name> + <message> + <source>KeePassXC: New key association request</source> + <translation>KeePassXC: Запрос на ассоциацию нового ключа</translation> + </message> + <message> + <source>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</source> + <translation>Получен запрос на ассоциацию вышеуказанного ключа. + +Если хотите разрешить доступ к базе данных KeePassXC, +дайте ему уникальное имя, чтобы распознать и принять ключ.</translation> + </message> + <message> + <source>Save and allow access</source> + <translation>Сохранить и разрешить доступ</translation> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: Перезаписать существующий ключ?</translation> + </message> + <message> + <source>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>Разделяемый секретный ключ с именем "%1" уже существует. +Вы действительно хотите перезаписать его?</translation> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: Обновить запись</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Обновить информацию в %1 - %2?</translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: База данных заблокирована!</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>Активная база данных заблокирована! +Разблокируйте выбранную базу данных или выберите другую, незаблокированную.</translation> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: Настройки недоступны!</translation> + </message> + <message> + <source>The active database does not contain a settings entry.</source> + <translation>В базе данных отсутствует запись с настройками.</translation> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: Ключи не найдены</translation> + </message> + <message> + <source>No shared encryption keys found in KeePassXC Settings.</source> + <translation>Разделяемые секретные ключи не найдены в настройках KeePassXC.</translation> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: Ключи удалены из базы данных</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> + <translation><numerusform>Успешно удалена %n ключ(и) шифрования от KeePassXC параметров.</numerusform><numerusform>Успешно удалена %n ключ(и) шифрования от KeePassXC параметров.</numerusform><numerusform>Успешно удалена %n ключ(и) шифрования от KeePassXC параметров.</numerusform><numerusform>Успешно удалено %n ключей шифрования из параметров KeePassXC.</numerusform></translation> + </message> + <message> + <source>Removing stored permissions…</source> + <translation>Удаление сохраненных разрешений...</translation> + </message> + <message> + <source>Abort</source> + <translation>Прервать</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: Права доступа удалены</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entry(s).</source> + <translation><numerusform>Успешно удалены разрешения от %n entry(s).</numerusform><numerusform>Успешно удалены разрешения от %n entry(s).</numerusform><numerusform>Успешно удалены разрешения от %n entry(s).</numerusform><numerusform>Успешно удалены доступы для %n записей.</numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation>KeePassXC: Не найдена запись с правами доступа!</translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>Активная база данных не содержит записей с назначенными правами доступа.</translation> </message> </context> <context> @@ -148,6 +456,10 @@ Please select whether you want to allow access.</source> <source>Repeat password:</source> <translation>Повторите пароль:</translation> </message> + <message> + <source>&Key file</source> + <translation>Файл-&ключ</translation> + </message> <message> <source>Browse</source> <translation>Обзор</translation> @@ -156,6 +468,14 @@ Please select whether you want to allow access.</source> <source>Create</source> <translation>Создать</translation> </message> + <message> + <source>Cha&llenge Response</source> + <translation>Запрос ответа</translation> + </message> + <message> + <source>Refresh</source> + <translation>Обновить</translation> + </message> <message> <source>Key files</source> <translation>Файлы-ключи</translation> @@ -166,15 +486,19 @@ Please select whether you want to allow access.</source> </message> <message> <source>Create Key File...</source> - <translation>Создать файл-ключ...</translation> + <translation>Создать ключ-файл...</translation> </message> <message> <source>Unable to create Key File : </source> - <translation>Невозможно создать файл-ключ:</translation> + <translation>Невозможно создать ключ-файл:</translation> </message> <message> <source>Select a key file</source> - <translation>Выбрать файл-ключ</translation> + <translation>Выбрать ключ-файл</translation> + </message> + <message> + <source>Empty password</source> + <translation>Пустой пароль</translation> </message> <message> <source>Do you really want to use an empty string as password?</source> @@ -187,24 +511,21 @@ Please select whether you want to allow access.</source> <message> <source>Failed to set %1 as the Key file: %2</source> - <translation>Не удалось установить %1 как файл-ключ: + <translation>Не удалось установить %1 как ключ-файл: %2</translation> </message> <message> - <source>&Key file</source> - <translation>Файл-&ключ</translation> + <source>Legacy key file format</source> + <translation>Формат файла устаревшего ключа</translation> </message> <message> - <source>Cha&llenge Response</source> - <translation>Запрос ответа</translation> - </message> - <message> - <source>Refresh</source> - <translation>Обновить</translation> - </message> - <message> - <source>Empty password</source> - <translation>Пустой пароль</translation> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation>Вы используете устаревший формат файл ключа, поддержка которого может быть прекращена в будущем. + +Рассмотрите возможность создания нового файла ключа.</translation> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -217,6 +538,10 @@ Please select whether you want to allow access.</source> <source>Clone Options</source> <translation>Параметры клонирования</translation> </message> + <message> + <source>Append ' - Clone' to title</source> + <translation>Добавить к названию « - клон»</translation> + </message> <message> <source>Replace username and password with references</source> <translation>Использовать ссылки для имени пользователя и пароля</translation> @@ -225,10 +550,6 @@ Please select whether you want to allow access.</source> <source>Copy history</source> <translation>История копирования</translation> </message> - <message> - <source>Append ' - Clone' to title</source> - <translation>Добавить к названию « - клон»</translation> - </message> </context> <context> <name>CsvImportWidget</name> @@ -325,10 +646,6 @@ Please select whether you want to allow access.</source> </context> <context> <name>CsvImportWizard</name> - <message> - <source>Import CSV file</source> - <translation>Импорт CSV-файла</translation> - </message> <message> <source>Error</source> <translation>Ошибка</translation> @@ -340,17 +657,17 @@ Please select whether you want to allow access.</source> </context> <context> <name>CsvParserModel</name> - <message> - <source> byte, </source> - <translation> байт, </translation> + <message numerus="yes"> + <source>%n byte(s), </source> + <translation><numerusform>%n байт(а), </numerusform><numerusform>%n байт(а), </numerusform><numerusform>%n байт(а), </numerusform><numerusform>%n байт(а), </numerusform></translation> </message> - <message> - <source> rows, </source> - <translation> строк, </translation> + <message numerus="yes"> + <source>%n row(s), </source> + <translation><numerusform>%n строк, </numerusform><numerusform>%n строк, </numerusform><numerusform>%n строк, </numerusform><numerusform>%n строк, </numerusform></translation> </message> - <message> - <source> columns</source> - <translation> столбцов</translation> + <message numerus="yes"> + <source>%n column(s)</source> + <translation><numerusform>%n столбцов</numerusform><numerusform>%n столбцов</numerusform><numerusform>%n столбцов</numerusform><numerusform>%n столбцов</numerusform></translation> </message> </context> <context> @@ -361,7 +678,7 @@ Please select whether you want to allow access.</source> </message> <message> <source>Key File:</source> - <translation>Файл-ключ:</translation> + <translation>Ключ-файл:</translation> </message> <message> <source>Password:</source> @@ -371,13 +688,38 @@ Please select whether you want to allow access.</source> <source>Browse</source> <translation>Обзор</translation> </message> + <message> + <source>Refresh</source> + <translation>Обновить</translation> + </message> + <message> + <source>Challenge Response:</source> + <translation>Запрос ответа:</translation> + </message> <message> <source>Unable to open the database.</source> <translation>Невозможно открыть базу данных.</translation> </message> <message> <source>Can't open key file</source> - <translation>Не могу открыть файл-ключ</translation> + <translation>Не могу открыть ключ-файл</translation> + </message> + <message> + <source>Legacy key file format</source> + <translation>Формат файла устаревшего ключа</translation> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation>Вы используете устаревший формат файл ключа, поддержка которого может быть прекращена в будущем. + +Рассмотрите возможность создания нового файла ключа.</translation> + </message> + <message> + <source>Don't show this warning again</source> + <translation>Не показывать это предупреждение</translation> </message> <message> <source>All files</source> @@ -389,15 +731,7 @@ Please select whether you want to allow access.</source> </message> <message> <source>Select key file</source> - <translation>Выберите файл-ключ</translation> - </message> - <message> - <source>Refresh</source> - <translation>Обновить</translation> - </message> - <message> - <source>Challenge Response:</source> - <translation>Запрос ответа:</translation> + <translation>Выберите ключ-файл</translation> </message> </context> <context> @@ -412,16 +746,16 @@ Please select whether you want to allow access.</source> </message> <message> <source>Can't open key file</source> - <translation>Не могу открыть файл-ключ</translation> - </message> - <message> - <source>Database opened fine. Nothing to do.</source> - <translation>База данных открылось прекрасно. Больше нечего делать.</translation> + <translation>Не могу открыть ключ-файл</translation> </message> <message> <source>Unable to open the database.</source> <translation>Невозможно открыть базу данных.</translation> </message> + <message> + <source>Database opened fine. Nothing to do.</source> + <translation>База данных открылось прекрасно. Больше нечего делать.</translation> + </message> <message> <source>Success</source> <translation>Успешно</translation> @@ -440,40 +774,61 @@ You can now save it.</source> <context> <name>DatabaseSettingsWidget</name> <message> - <source>Database name:</source> - <translation>Название базы данных:</translation> + <source>General</source> + <translation>Общие</translation> </message> <message> - <source>Database description:</source> - <translation>Описание базы данных:</translation> + <source>Encryption</source> + <translation>Шифрование</translation> </message> <message> - <source>Transform rounds:</source> - <translation>Раундов преобразований:</translation> + <source>Number of rounds too high</source> + <comment>Key transformation rounds</comment> + <translation>Слишком много раундов</translation> </message> <message> - <source>Default username:</source> - <translation>Имя пользователя по умолчанию:</translation> + <source>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</source> + <translation>Вы используете очень большое количество раундов преобразования ключа с Argon2. + +Если вы сохранить это значение, открытие базы данных может занять часы или дни (или даже больше)!</translation> </message> <message> - <source> MiB</source> - <translation>МиБ</translation> + <source>Understood, keep number</source> + <translation>Понятно, сохраните номер</translation> </message> <message> - <source>Benchmark</source> - <translation>Проверка</translation> + <source>Cancel</source> + <translation>Отмена</translation> </message> <message> - <source>Max. history items:</source> - <translation>Максимум записей истории:</translation> + <source>Number of rounds too low</source> + <comment>Key transformation rounds</comment> + <translation>Слишком мало раундов</translation> </message> <message> - <source>Max. history size:</source> - <translation>Максимальный размер истории:</translation> + <source>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</source> + <translation>Вы используете очень мало раундов ключевых преобразований с AES-KDF. + +Если вы сохраните это значение, база данных может быть взломана слишком легко!</translation> </message> <message> - <source>Use recycle bin</source> - <translation>Использовать корзину</translation> + <source>KDF unchanged</source> + <translation>ФФК не изменена</translation> + </message> + <message> + <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> + <translation>Ошибка преобразования ФФК с новыми параметрами; ФФК не изменена.</translation> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetEncryption</name> + <message> + <source>Encryption Algorithm:</source> + <translation>Алгоритм шифрования:</translation> </message> <message> <source>AES: 256 Bit (default)</source> @@ -484,14 +839,78 @@ You can now save it.</source> <translation>Twofish: 256 бит</translation> </message> <message> - <source>Algorithm:</source> - <translation>Алгоритм:</translation> + <source>Key Derivation Function:</source> + <translation>Функция формирования ключа:</translation> + </message> + <message> + <source>Transform rounds:</source> + <translation>Раундов преобразований:</translation> + </message> + <message> + <source>Benchmark 1-second delay</source> + <translation>Тест 1-секундной задержки</translation> + </message> + <message> + <source>Memory Usage:</source> + <translation>Использование памяти:</translation> + </message> + <message> + <source> MB</source> + <translation> МБ</translation> + </message> + <message> + <source>Parallelism:</source> + <translation>Параллелизм:</translation> + </message> + <message> + <source> thread</source> + <translation> поток</translation> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetGeneral</name> + <message> + <source>Database Meta Data</source> + <translation>Метаданные базы данных</translation> + </message> + <message> + <source>Database name:</source> + <translation>Название базы данных:</translation> + </message> + <message> + <source>Database description:</source> + <translation>Описание базы данных:</translation> + </message> + <message> + <source>Default username:</source> + <translation>Имя пользователя по умолчанию:</translation> + </message> + <message> + <source>History Settings</source> + <translation>Настройки истории</translation> + </message> + <message> + <source>Max. history items:</source> + <translation>Максимум записей истории:</translation> + </message> + <message> + <source>Max. history size:</source> + <translation>Максимальный размер истории:</translation> + </message> + <message> + <source> MiB</source> + <translation>МиБ</translation> + </message> + <message> + <source>Use recycle bin</source> + <translation>Использовать корзину</translation> </message> </context> <context> <name>DatabaseTabWidget</name> <message> <source>Root</source> + <comment>Root group</comment> <translation>Корень</translation> </message> <message> @@ -510,6 +929,30 @@ You can now save it.</source> <source>File not found!</source> <translation>Файл не найден!</translation> </message> + <message> + <source>Unable to open the database.</source> + <translation>Невозможно открыть базу данных.</translation> + </message> + <message> + <source>File opened in read only mode.</source> + <translation>Файл открыт в режиме только для чтения.</translation> + </message> + <message> + <source>Open CSV file</source> + <translation>Открыть файл CSV</translation> + </message> + <message> + <source>CSV file</source> + <translation>Файл CSV</translation> + </message> + <message> + <source>All files (*)</source> + <translation>Все файлы (*)</translation> + </message> + <message> + <source>Merge database</source> + <translation>Объединить базу данных</translation> + </message> <message> <source>Open KeePass 1 database</source> <translation>Открыть базу данных KeePass 1</translation> @@ -518,14 +961,16 @@ You can now save it.</source> <source>KeePass 1 database</source> <translation>База данных KeePass 1</translation> </message> - <message> - <source>All files (*)</source> - <translation>Все файлы (*)</translation> - </message> <message> <source>Close?</source> <translation>Закрыть?</translation> </message> + <message> + <source>"%1" is in edit mode. +Discard changes and close anyway?</source> + <translation>«%1» в режиме правки. +Отменить изменения и всё равно закрыть?</translation> + </message> <message> <source>Save changes?</source> <translation>Сохранить изменения?</translation> @@ -540,10 +985,22 @@ Save changes?</source> <source>Writing the database failed.</source> <translation>Не удалось записать базу данных.</translation> </message> + <message> + <source>Passwords</source> + <translation>Пароли</translation> + </message> <message> <source>Save database as</source> <translation>Сохранить базу данных как</translation> </message> + <message> + <source>Export database to CSV file</source> + <translation>Экспортировать базу данных в файл CSV</translation> + </message> + <message> + <source>Writing the CSV file failed.</source> + <translation>Не удалось записать CSV файл.</translation> + </message> <message> <source>New database</source> <translation>Новая база данных</translation> @@ -561,12 +1018,6 @@ Save changes?</source> Please press cancel to finish your changes or discard them.</source> <translation>Невозможно заблокировать базу данных, так как вы в настоящее время редактируете её. Нажмите Отмена, чтобы завершить изменения или отклонить их.</translation> - </message> - <message> - <source>This database has never been saved. -You can save the database or stop locking it.</source> - <translation>Эта база данных никогда не была сохранена. -Можно сохранить базу данных или остановить её заблокированной.</translation> </message> <message> <source>This database has been modified. @@ -576,72 +1027,16 @@ Otherwise your changes are lost.</source> Сохранить её перед тем, как заблокировать? В противном случае все изменения будут потеряны.</translation> </message> - <message> - <source>"%1" is in edit mode. -Discard changes and close anyway?</source> - <translation>«%1» в режиме правки. -Отменить изменения и всё равно закрыть?</translation> - </message> - <message> - <source>Export database to CSV file</source> - <translation>Экспортировать базу данных в файл CSV</translation> - </message> - <message> - <source>CSV file</source> - <translation>Файл CSV</translation> - </message> - <message> - <source>Writing the CSV file failed.</source> - <translation>Не удалось записать CSV файл.</translation> - </message> - <message> - <source>Unable to open the database.</source> - <translation>Не удаётся открыть базу данных.</translation> - </message> - <message> - <source>Merge database</source> - <translation>Объединить базу данных</translation> - </message> - <message> - <source>The database you are trying to save as is locked by another instance of KeePassXC. -Do you want to save it anyway?</source> - <translation>База данных, в которую пытаетесь сохранить, заблокирована другим экземпляром KeePassXC. -Сохранить в любом случае?</translation> - </message> - <message> - <source>Passwords</source> - <translation>Пароли</translation> - </message> - <message> - <source>Database already opened</source> - <translation>База данных уже открыта</translation> - </message> - <message> - <source>The database you are trying to open is locked by another instance of KeePassXC. - -Do you want to open it anyway?</source> - <translation>База данных, которую пытаетесь открыть, заблокирована другим экземпляром KeePassXC. - -Открыть в любом случае?</translation> - </message> - <message> - <source>Open read-only</source> - <translation>Открыть в режиме «только чтение»</translation> - </message> - <message> - <source>File opened in read only mode.</source> - <translation>Файл открыт в режиме только для чтения.</translation> - </message> - <message> - <source>Open CSV file</source> - <translation>Открыть файл CSV</translation> - </message> </context> <context> <name>DatabaseWidget</name> + <message> + <source>Searching...</source> + <translation>Поиск...</translation> + </message> <message> <source>Change master key</source> - <translation>Изменить мастер-пароль</translation> + <translation>Сменить мастер-пароль</translation> </message> <message> <source>Delete entry?</source> @@ -659,13 +1054,33 @@ Do you want to open it anyway?</source> <source>Do you really want to delete %1 entries for good?</source> <translation>Удалить навсегда %1 записей?</translation> </message> + <message> + <source>Move entry to recycle bin?</source> + <translation>Переместить запись в корзину?</translation> + </message> + <message> + <source>Do you really want to move entry "%1" to the recycle bin?</source> + <translation>Переместить запись «%1» в корзину?</translation> + </message> <message> <source>Move entries to recycle bin?</source> <translation>Поместить записи в корзину?</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>Вы действительно хотите поместить %n запись в корзину?</numerusform><numerusform>Вы действительно хотите поместить %n записи в корзину?</numerusform><numerusform>Вы действительно хотите поместить %n записей в корзину?</numerusform><numerusform>Вы действительно хотите поместить %n записей в корзину?</numerusform></translation> + <translation><numerusform>Вы действительно хотите переместить %n entry(s) в корзину?</numerusform><numerusform>Вы действительно хотите переместить %n entry(s) в корзину?</numerusform><numerusform>Вы действительно хотите переместить %n entry(s) в корзину?</numerusform><numerusform>Вы действительно хотите переместить %n записей в корзину?</numerusform></translation> + </message> + <message> + <source>Execute command?</source> + <translation>Выполнить команду?</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation>Выполнить следующую команду?<br><br>%1<br></translation> + </message> + <message> + <source>Remember my choice</source> + <translation>Запомнить мой выбор</translation> </message> <message> <source>Delete group?</source> @@ -679,18 +1094,6 @@ Do you want to open it anyway?</source> <source>Unable to calculate master key</source> <translation>Невозможно вычислить мастер-пароль</translation> </message> - <message> - <source>Move entry to recycle bin?</source> - <translation>Переместить запись в корзину?</translation> - </message> - <message> - <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation>Переместить запись «%1» в корзину?</translation> - </message> - <message> - <source>Searching...</source> - <translation>Поиск...</translation> - </message> <message> <source>No current database.</source> <translation>Нет текущей базы данных.</translation> @@ -708,20 +1111,8 @@ Do you want to open it anyway?</source> <translation>Нет результатов</translation> </message> <message> - <source>Execute command?</source> - <translation>Выполнить команду?</translation> - </message> - <message> - <source>Do you really want to execute the following command?<br><br>%1<br></source> - <translation>Выполнить следующую команду?<br><br>%1<br></translation> - </message> - <message> - <source>Remember my choice</source> - <translation>Запомнить мой выбор</translation> - </message> - <message> - <source>Autoreload Request</source> - <translation>Запрос на автозагрузку</translation> + <source>File has changed</source> + <translation>Файл был изменен</translation> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -732,8 +1123,10 @@ Do you want to open it anyway?</source> <translation>Запрос на слияние</translation> </message> <message> - <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> - <translation>Файл базы данных изменился, а также присутствуют несохранённые изменения. Объединить изменения?</translation> + <source>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</source> + <translation>База данных была изменена, а также присутствуют несохраненные изменения. +Вы хотите объединить изменения?</translation> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -748,6 +1141,89 @@ Do you want to open it anyway?</source> <translation>Удалить все из корзины?</translation> </message> </context> +<context> + <name>DetailsWidget</name> + <message> + <source>Generate TOTP Token</source> + <translation>Генерировать TOTP токен</translation> + </message> + <message> + <source>Close</source> + <translation>Закрыть</translation> + </message> + <message> + <source>General</source> + <translation>Общие</translation> + </message> + <message> + <source>Password</source> + <translation>Пароль</translation> + </message> + <message> + <source>URL</source> + <translation>URL-адрес</translation> + </message> + <message> + <source>Expiration</source> + <translation>Срок действия</translation> + </message> + <message> + <source>Username</source> + <translation>Имя пользователя</translation> + </message> + <message> + <source>Autotype</source> + <translation>Автоввод</translation> + </message> + <message> + <source>Searching</source> + <translation>Поиск</translation> + </message> + <message> + <source>Attributes</source> + <translation>Атрибуты</translation> + </message> + <message> + <source>Attachments</source> + <translation>Вложения</translation> + </message> + <message> + <source>Notes</source> + <translation>Примечания</translation> + </message> + <message> + <source>Window</source> + <translation>Окно</translation> + </message> + <message> + <source>Sequence</source> + <translation>Последовательность</translation> + </message> + <message> + <source>Search</source> + <translation>Поиск</translation> + </message> + <message> + <source>Clear</source> + <translation>Очистить</translation> + </message> + <message> + <source>Never</source> + <translation>Никогда</translation> + </message> + <message> + <source>[PROTECTED]</source> + <translation>[Защищённый]</translation> + </message> + <message> + <source>Disabled</source> + <translation>Отключено</translation> + </message> + <message> + <source>Enabled</source> + <translation>Включено</translation> + </message> +</context> <context> <name>EditEntryWidget</name> <message> @@ -756,7 +1232,7 @@ Do you want to open it anyway?</source> </message> <message> <source>Advanced</source> - <translation>Расширенные</translation> + <translation>Продвинутые</translation> </message> <message> <source>Icon</source> @@ -774,6 +1250,30 @@ Do you want to open it anyway?</source> <source>History</source> <translation>История</translation> </message> + <message> + <source>SSH Agent</source> + <translation>SSH Агент</translation> + </message> + <message> + <source>n/a</source> + <translation>н/д</translation> + </message> + <message> + <source>(encrypted)</source> + <translation> (зашифровано)</translation> + </message> + <message> + <source>Select private key</source> + <translation>Выберите личный ключ</translation> + </message> + <message> + <source>File too large to be a private key</source> + <translation>Файл слишком большой, чтобы быть личным ключом</translation> + </message> + <message> + <source>Failed to open private key</source> + <translation>Не удалось открыть личный ключ</translation> + </message> <message> <source>Entry history</source> <translation>История записи</translation> @@ -794,40 +1294,6 @@ Do you want to open it anyway?</source> <source>New attribute</source> <translation>Новый атрибут</translation> </message> - <message> - <source>Select file</source> - <translation>Выбрать файл</translation> - </message> - <message> - <source>Unable to open file</source> - <translation>Невозможно открыть файл</translation> - </message> - <message> - <source>Save attachment</source> - <translation>Сохранить вложение</translation> - </message> - <message> - <source>Unable to save the attachment: -</source> - <translation>Невозможно сохранить вложение: -</translation> - </message> - <message> - <source>Tomorrow</source> - <translation>Завтра</translation> - </message> - <message numerus="yes"> - <source>%n week(s)</source> - <translation><numerusform>%n неделя</numerusform><numerusform>%n недели</numerusform><numerusform>%n недель</numerusform><numerusform>%n недель</numerusform></translation> - </message> - <message numerus="yes"> - <source>%n month(s)</source> - <translation><numerusform>%n месяц</numerusform><numerusform>%n месяца</numerusform><numerusform>%n месяцев</numerusform><numerusform>%n месяцев</numerusform></translation> - </message> - <message> - <source>1 year</source> - <translation>1 год</translation> - </message> <message> <source>Confirm Remove</source> <translation>Подтверждение удаления</translation> @@ -837,12 +1303,28 @@ Do you want to open it anyway?</source> <translation>Удалить этот атрибут?</translation> </message> <message> - <source>[PROTECTED] Press reveal to view or edit</source> - <translation>[Защищён] Нажмите для открытия просмотра или правки</translation> + <source>[PROTECTED]</source> + <translation>[ЗАЩИЩЕННЫЙ]</translation> </message> <message> - <source>Are you sure you want to remove this attachment?</source> - <translation>Удалить это вложение?</translation> + <source>Press reveal to view or edit</source> + <translation>Нажмите Показать для просмотра или редактирования</translation> + </message> + <message> + <source>Tomorrow</source> + <translation>Завтра</translation> + </message> + <message numerus="yes"> + <source>%n week(s)</source> + <translation><numerusform>%n нед</numerusform><numerusform>%n нед</numerusform><numerusform>%n нед</numerusform><numerusform>%n недель</numerusform></translation> + </message> + <message numerus="yes"> + <source>%n month(s)</source> + <translation><numerusform>%n месяц(-а)(-ев)</numerusform><numerusform>%n месяц(-а)(-ев)</numerusform><numerusform>%n месяц(-а)(-ев)</numerusform><numerusform>%n месяцев</numerusform></translation> + </message> + <message> + <source>1 year</source> + <translation>1 год</translation> </message> </context> <context> @@ -859,18 +1341,6 @@ Do you want to open it anyway?</source> <source>Remove</source> <translation>Удалить</translation> </message> - <message> - <source>Attachments</source> - <translation>Вложения</translation> - </message> - <message> - <source>Save</source> - <translation>Сохранить</translation> - </message> - <message> - <source>Open</source> - <translation>Открыть</translation> - </message> <message> <source>Edit Name</source> <translation>Изменить имя</translation> @@ -883,6 +1353,10 @@ Do you want to open it anyway?</source> <source>Reveal</source> <translation>Открытие</translation> </message> + <message> + <source>Attachments</source> + <translation>Вложения</translation> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -890,6 +1364,18 @@ Do you want to open it anyway?</source> <source>Enable Auto-Type for this entry</source> <translation>Включить автоввод для этой записи</translation> </message> + <message> + <source>Inherit default Auto-Type sequence from the &group</source> + <translation>Унаследовать стандартную последовательность автоввода от &группы</translation> + </message> + <message> + <source>&Use custom Auto-Type sequence:</source> + <translation>Использовать сво&ю последовательность автоввода:</translation> + </message> + <message> + <source>Window Associations</source> + <translation>Ассоциации окон</translation> + </message> <message> <source>+</source> <translation>+</translation> @@ -902,14 +1388,6 @@ Do you want to open it anyway?</source> <source>Window title:</source> <translation>Заголовок окна:</translation> </message> - <message> - <source>Inherit default Auto-Type sequence from the &group</source> - <translation>Унаследовать стандартную последовательность автоввода от &группы</translation> - </message> - <message> - <source>&Use custom Auto-Type sequence:</source> - <translation>Использовать сво&ю последовательность автоввода:</translation> - </message> <message> <source>Use default se&quence</source> <translation>Использовать стан&дартную последовательность</translation> @@ -918,10 +1396,6 @@ Do you want to open it anyway?</source> <source>Set custo&m sequence:</source> <translation>Установить сво&ю последовательность:</translation> </message> - <message> - <source>Window Associations</source> - <translation>Ассоциации окон</translation> - </message> </context> <context> <name>EditEntryWidgetHistory</name> @@ -945,12 +1419,8 @@ Do you want to open it anyway?</source> <context> <name>EditEntryWidgetMain</name> <message> - <source>Title:</source> - <translation>Название:</translation> - </message> - <message> - <source>Username:</source> - <translation>Имя пользователя:</translation> + <source>URL:</source> + <translation>URL-адрес:</translation> </message> <message> <source>Password:</source> @@ -961,20 +1431,104 @@ Do you want to open it anyway?</source> <translation>Пароль ещё раз:</translation> </message> <message> - <source>URL:</source> - <translation>Адрес:</translation> + <source>Title:</source> + <translation>Название:</translation> </message> <message> - <source>Expires</source> - <translation>Истекает</translation> + <source>Notes</source> + <translation>Примечания</translation> </message> <message> <source>Presets</source> <translation>Предустановки</translation> </message> <message> - <source>Notes:</source> - <translation>Примечания:</translation> + <source>Toggle the checkbox to reveal the notes section.</source> + <translation>Установите для отображения раздела примечаний.</translation> + </message> + <message> + <source>Username:</source> + <translation>Имя пользователя:</translation> + </message> + <message> + <source>Expires</source> + <translation>Истекает</translation> + </message> +</context> +<context> + <name>EditEntryWidgetSSHAgent</name> + <message> + <source>Form</source> + <translation>Форма</translation> + </message> + <message> + <source>Remove key from agent after</source> + <translation>Убрать ключ из агента после</translation> + </message> + <message> + <source> seconds</source> + <translation> секунд</translation> + </message> + <message> + <source>Fingerprint</source> + <translation>Отпечаток</translation> + </message> + <message> + <source>Remove key from agent when database is closed/locked</source> + <translation>Убрать ключ из агента при закрытии/блокировании базы данных</translation> + </message> + <message> + <source>Public key</source> + <translation>Открытый ключ</translation> + </message> + <message> + <source>Add key to agent when database is opened/unlocked</source> + <translation>Добавить ключ в агент, после открытия/разблокировки базы данных</translation> + </message> + <message> + <source>Comment</source> + <translation>Комментарий</translation> + </message> + <message> + <source>Decrypt</source> + <translation>Расшифровать</translation> + </message> + <message> + <source>n/a</source> + <translation>н/д</translation> + </message> + <message> + <source>Copy to clipboard</source> + <translation>Скопировать в буфер обмена</translation> + </message> + <message> + <source>Private key</source> + <translation>Личный ключ</translation> + </message> + <message> + <source>External file</source> + <translation>Внешний файл</translation> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Просмотр...</translation> + </message> + <message> + <source>Attachment</source> + <translation>Вложение</translation> + </message> + <message> + <source>Add to agent</source> + <translation>Добавить в агент</translation> + </message> + <message> + <source>Remove from agent</source> + <translation>Убрать из агента</translation> + </message> + <message> + <source>Require user confirmation when this key is used</source> + <translation>Требовать подтверждения пользователя, когда этот ключ используется</translation> </message> </context> <context> @@ -1045,6 +1599,14 @@ Do you want to open it anyway?</source> </context> <context> <name>EditWidgetIcons</name> + <message> + <source>&Use default icon</source> + <translation>Использовать с&тандартный значок</translation> + </message> + <message> + <source>Use custo&m icon</source> + <translation>Использовать св&ой значок</translation> + </message> <message> <source>Add custom icon</source> <translation>Добавить свой значок</translation> @@ -1053,6 +1615,18 @@ Do you want to open it anyway?</source> <source>Delete custom icon</source> <translation>Удалить свой значок</translation> </message> + <message> + <source>Download favicon</source> + <translation>Скачать значок сайта</translation> + </message> + <message> + <source>Unable to fetch favicon.</source> + <translation>Не удалось получить значок.</translation> + </message> + <message> + <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> + <translation>Подсказка: в качестве резервного варианта для получения значков сайтов возможно использовать Google. Включите этот параметр в меню «Инструменты» -> «Настройки» -> «Безопасность»</translation> + </message> <message> <source>Images</source> <translation>Изображения</translation> @@ -1065,25 +1639,13 @@ Do you want to open it anyway?</source> <source>Select Image</source> <translation>Выбор изображения</translation> </message> - <message> - <source>Download favicon</source> - <translation>Скачать значок сайта</translation> - </message> - <message> - <source>Unable to fetch favicon.</source> - <translation>Не удалось получить значок.</translation> - </message> <message> <source>Can't read icon</source> <translation>Не могу прочитать значок</translation> </message> <message> - <source>&Use default icon</source> - <translation>Использовать с&тандартный значок</translation> - </message> - <message> - <source>Use custo&m icon</source> - <translation>Использовать св&ой значок</translation> + <source>Custom icon already exists</source> + <translation>Пользовательский значок уже существует</translation> </message> <message> <source>Confirm Delete</source> @@ -1093,14 +1655,6 @@ Do you want to open it anyway?</source> <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> <translation>Этот значок использует %1 записей и будет заменен значком по умолчанию. Хотите удалить его?</translation> </message> - <message> - <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation>Подсказка: в качестве резервного варианта для получения значков сайтов возможно использовать Google. Включите этот параметр в меню «Инструменты» -> «Настройки» -> «Безопасность»</translation> - </message> - <message> - <source>Custom icon already exists</source> - <translation>Пользовательский значок уже существует</translation> - </message> </context> <context> <name>EditWidgetProperties</name> @@ -1125,9 +1679,97 @@ Do you want to open it anyway?</source> <name>Entry</name> <message> <source> - Clone</source> + <comment>Suffix added to cloned entries</comment> <translation> - клон</translation> </message> </context> +<context> + <name>EntryAttachmentsModel</name> + <message> + <source>Name</source> + <translation>Имя</translation> + </message> + <message> + <source>Size</source> + <translation>Размер</translation> + </message> +</context> +<context> + <name>EntryAttachmentsWidget</name> + <message> + <source>Form</source> + <translation>Форма</translation> + </message> + <message> + <source>Add</source> + <translation>Создать</translation> + </message> + <message> + <source>Remove</source> + <translation>Удалить</translation> + </message> + <message> + <source>Open</source> + <translation>Открыть</translation> + </message> + <message> + <source>Save</source> + <translation>Сохранить</translation> + </message> + <message> + <source>Select files</source> + <translation>Выберите файлы</translation> + </message> + <message numerus="yes"> + <source>Are you sure you want to remove %n attachment(s)?</source> + <translation><numerusform>Вы уверены, что вы хотите удалить %n вложения?</numerusform><numerusform>Вы уверены, что вы хотите удалить %n вложения?</numerusform><numerusform>Вы уверены, что вы хотите удалить %n вложения?</numerusform><numerusform>Вы уверены, что вы хотите удалить %n вложений?</numerusform></translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>Подтверждение удаления</translation> + </message> + <message> + <source>Save attachments</source> + <translation>Сохранить вложения</translation> + </message> + <message> + <source>Unable to create directory: +%1</source> + <translation>Не удается создать каталог: %1</translation> + </message> + <message> + <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> + <translation>Вы уверены, что вы хотите, перезаписать существующий файл "%1" с вложением?</translation> + </message> + <message> + <source>Confirm overwrite</source> + <translation>Подтвердить перезапись</translation> + </message> + <message> + <source>Unable to save attachments: +%1</source> + <translation>Не удается сохранить вложение: +%1</translation> + </message> + <message> + <source>Unable to open attachment: +%1</source> + <translation>Не удается открыть вложение: +%1</translation> + </message> + <message> + <source>Unable to open attachments: +%1</source> + <translation>Не удается открыть вложение: +%1</translation> + </message> + <message> + <source>Unable to open files: +%1</source> + <translation>Не удается открыть файлы: +%1</translation> + </message> +</context> <context> <name>EntryAttributesModel</name> <message> @@ -1151,11 +1793,16 @@ Do you want to open it anyway?</source> </message> <message> <source>URL</source> - <translation>Адрес</translation> + <translation>URL-адрес</translation> </message> </context> <context> <name>EntryModel</name> + <message> + <source>Ref: </source> + <comment>Reference abbreviation</comment> + <translation>Ссылка: </translation> + </message> <message> <source>Group</source> <translation>Группа</translation> @@ -1170,12 +1817,7 @@ Do you want to open it anyway?</source> </message> <message> <source>URL</source> - <translation>Адрес</translation> - </message> - <message> - <source>Ref: </source> - <comment>Reference abbreviation</comment> - <translation>Ссылка: </translation> + <translation>URL-адрес</translation> </message> </context> <context> @@ -1185,6 +1827,17 @@ Do you want to open it anyway?</source> <translation>Корзина</translation> </message> </context> +<context> + <name>HostInstaller</name> + <message> + <source>KeePassXC: Cannot save file!</source> + <translation>KeePassXC: Не удается сохранить файл!</translation> + </message> + <message> + <source>Cannot save the native messaging script file.</source> + <translation>Не удается сохранить файл сценария для механизма native messaging.</translation> + </message> +</context> <context> <name>HttpPasswordGeneratorWidget</name> <message> @@ -1247,6 +1900,361 @@ Do you want to open it anyway?</source> <translation>Закрыть сообщение</translation> </message> </context> +<context> + <name>Kdbx3Reader</name> + <message> + <source>Unable to calculate master key</source> + <translation>Невозможно вычислить мастер-пароль</translation> + </message> + <message> + <source>Unable to issue challenge-response.</source> + <translation>Не удалось выполнить запрос ответа.</translation> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>Неверный ключ или файл базы данных повреждён.</translation> + </message> +</context> +<context> + <name>Kdbx3Writer</name> + <message> + <source>Unable to issue challenge-response.</source> + <translation>Не удалось выполнить запрос ответа.</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Невозможно вычислить мастер-пароль</translation> + </message> +</context> +<context> + <name>Kdbx4Reader</name> + <message> + <source>missing database headers</source> + <translation>отсутствуют заголовки базы данных</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Невозможно вычислить мастер-пароль</translation> + </message> + <message> + <source>Invalid header checksum size</source> + <translation>Неправильный размер контрольной суммы заголовка</translation> + </message> + <message> + <source>Header SHA256 mismatch</source> + <translation>Несоответствие SHA256 заголовка</translation> + </message> + <message> + <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> + <translation>Неправильный ключ или файл базы данных поврежден. (несоответствие HMAC)</translation> + </message> + <message> + <source>Unknown cipher</source> + <translation>Неизвестные шифр</translation> + </message> + <message> + <source>Invalid header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header data length</source> + <translation>Неправильная длинна заголовка</translation> + </message> + <message> + <source>Failed to open buffer for KDF parameters in header</source> + <translation>Не удалось открыть буфер для ФФК параметров в заголовке</translation> + </message> + <message> + <source>Unsupported key derivation function (KDF) or invalid parameters</source> + <translation>Функция формирования ключа (ФФК) не поддерживается или неверные параметры</translation> + </message> + <message> + <source>Legacy header fields found in KDBX4 file.</source> + <translation>Устаревшие поля заголовков найденные в файле KDBX4.</translation> + </message> + <message> + <source>Invalid inner header id size</source> + <translation>Недопустимый внутренний идентификатор заголовка</translation> + </message> + <message> + <source>Invalid inner header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header binary size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass variant map version.</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation>Неподдерживаемая версия структуры метаданных KeePass.</translation> + </message> + <message> + <source>Invalid variant map entry name length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name data</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value data</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Bool entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry type</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map field type size</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Kdbx4Writer</name> + <message> + <source>Invalid symmetric cipher algorithm.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid symmetric cipher IV size.</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Невозможно вычислить мастер-пароль</translation> + </message> + <message> + <source>Failed to serialize KDF parameters variant map</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxReader</name> + <message> + <source>Invalid cipher uuid length</source> + <translation>Недопустимая длина uuid шифра</translation> + </message> + <message> + <source>Unsupported cipher</source> + <translation>Неподдерживаемые шифр</translation> + </message> + <message> + <source>Invalid compression flags length</source> + <translation>Недопустимая длина флагов сжатия</translation> + </message> + <message> + <source>Unsupported compression algorithm</source> + <translation>Неподдерживаемый алгоритм сжатия</translation> + </message> + <message> + <source>Invalid master seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform rounds size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid start bytes size</source> + <translation>Недопустимый начальный размер байт</translation> + </message> + <message> + <source>Invalid random stream id size</source> + <translation>Недопустимый размер индентификатора случайного потока</translation> + </message> + <message> + <source>Invalid inner random stream cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>Не база данных KeePass.</translation> + </message> + <message> + <source>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> + <translation>Выбранный файл от старой KeePass 1 базы данных (.kdb). + +Вы можете импортировать его, нажав на База Данных > «Импорт KeePass 1 базы данных...». +Это одностороннее перемещение. Вы не сможете открыть импортированную базу данных на старой версии KeePassX 0,4.</translation> + </message> + <message> + <source>Unsupported KeePass 2 database version.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxXmlReader</name> + <message> + <source>XML parsing failure: %1</source> + <translation>Ошибка разбора XML: %1</translation> + </message> + <message> + <source>No root group</source> + <translation>Нет root группы</translation> + </message> + <message> + <source>Missing icon uuid or data</source> + <translation>Нет значка uuid или данных</translation> + </message> + <message> + <source>Missing custom data key or value</source> + <translation>Отсутствует ключ пользовательских данных или значение</translation> + </message> + <message> + <source>Multiple group elements</source> + <translation>Несколько элементов группы</translation> + </message> + <message> + <source>Null group uuid</source> + <translation>Значение uuid для NULL группы</translation> + </message> + <message> + <source>Invalid group icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableAutoType value</source> + <translation>Недопустимое значение EnableAutoType</translation> + </message> + <message> + <source>Invalid EnableSearching value</source> + <translation type="unfinished"/> + </message> + <message> + <source>No group uuid found</source> + <translation>Отсутствует групповой uuid</translation> + </message> + <message> + <source>Null DeleteObject uuid</source> + <translation>Null DeleteObject uuid</translation> + </message> + <message> + <source>Missing DeletedObject uuid or time</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null entry uuid</source> + <translation>Null uuid для записи</translation> + </message> + <message> + <source>Invalid entry icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element in history entry</source> + <translation>Элемент истории в истории записи</translation> + </message> + <message> + <source>No entry uuid found</source> + <translation>Нет uuid для записи</translation> + </message> + <message> + <source>History element with different uuid</source> + <translation>Элемент истории с отличающимся uuid</translation> + </message> + <message> + <source>Unable to decrypt entry string</source> + <translation>Не удается расшифровать строку записи</translation> + </message> + <message> + <source>Duplicate custom attribute found</source> + <translation>Найден повторяющиеся пользовательский атрибут</translation> + </message> + <message> + <source>Entry string key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate attachment found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry binary key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-type association window or sequence missing</source> + <translation>Отсутствует окно или последовательность для автоввода</translation> + </message> + <message> + <source>Invalid bool value</source> + <translation>Недопустимое логическое значение</translation> + </message> + <message> + <source>Invalid date time value</source> + <translation>Недопустимое значение даты времени </translation> + </message> + <message> + <source>Invalid color value</source> + <translation>Недопустимое значение цвета</translation> + </message> + <message> + <source>Invalid color rgb part</source> + <translation>Недопустимое значение части цвета rgb</translation> + </message> + <message> + <source>Invalid number value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid uuid value</source> + <translation>Недопустимое значение uuid</translation> + </message> + <message> + <source>Unable to decompress binary</source> + <extracomment>Translator meant is a binary data inside an entry</extracomment> + <translation>Не удается распаковать двоичные данные</translation> + </message> +</context> <context> <name>KeePass1OpenWidget</name> <message> @@ -1262,7 +2270,7 @@ Do you want to open it anyway?</source> <name>KeePass1Reader</name> <message> <source>Unable to read keyfile.</source> - <translation>Невозможно прочесть файл-ключ.</translation> + <translation>Невозможно прочесть ключ-файл.</translation> </message> <message> <source>Not a KeePass database.</source> @@ -1276,6 +2284,35 @@ Do you want to open it anyway?</source> <source>Unsupported KeePass database version.</source> <translation>Версия базы данных KeePass не поддерживается.</translation> </message> + <message> + <source>Unable to read encryption IV</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation>Не удается прочитать шифрования IV</translation> + </message> + <message> + <source>Invalid number of groups</source> + <translation>Недопустимое количество групп</translation> + </message> + <message> + <source>Invalid number of entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid content hash size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of transform rounds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to construct group tree</source> + <translation type="unfinished"/> + </message> <message> <source>Root</source> <translation>Корень</translation> @@ -1288,60 +2325,104 @@ Do you want to open it anyway?</source> <source>Wrong key or database file is corrupt.</source> <translation>Неверный ключ или файл базы данных повреждён.</translation> </message> -</context> -<context> - <name>KeePass2Reader</name> <message> - <source>Not a KeePass database.</source> - <translation>Не база данных KeePass.</translation> + <source>Key transformation failed</source> + <translation>Не удалось выполнить преобразование ключа </translation> </message> <message> - <source>Unsupported KeePass database version.</source> - <translation>Версия базы данных KeePass не поддерживается.</translation> + <source>Invalid group field type number</source> + <translation type="unfinished"/> </message> <message> - <source>Wrong key or database file is corrupt.</source> - <translation>Неверный ключ или файл базы данных повреждён.</translation> + <source>Invalid group field size</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>Невозможно вычислить мастер-пароль</translation> + <source>Read group field data doesn't match size</source> + <translation>Не соответствует размер области данных группы</translation> </message> <message> - <source>Unable to issue challenge-response.</source> - <translation>Не удалось выполнить запрос ответа.</translation> + <source>Incorrect group id field size</source> + <translation type="unfinished"/> </message> <message> - <source>The selected file is an old KeePass 1 database (.kdb). - -You can import it by clicking on Database > 'Import KeePass 1 database...'. -This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> - <translation>Выбранный файл от старой KeePass 1 базы данных (.kdb). - -Вы можете импортировать его, нажав на База Данных > «Импорт KeePass 1 базы данных...». -Это одностороннее перемещение. Вы не сможете открыть импортированную базу данных на старой версии KeePassX 0,4.</translation> - </message> -</context> -<context> - <name>KeePass2Writer</name> - <message> - <source>Unable to issue challenge-response.</source> - <translation>Не удалось выполнить запрос ответа.</translation> + <source>Incorrect group creation time field size</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>Невозможно вычислить мастер-пароль</translation> + <source>Incorrect group modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group access time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group level field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing group id or level</source> + <translation>Отсутствует групповой идентификатор или уровень</translation> + </message> + <message> + <source>Missing entry field type number</source> + <translation>Отсутствует номер типа поля записи</translation> + </message> + <message> + <source>Invalid entry field size</source> + <translation>Недопустимый размер поля записи</translation> + </message> + <message> + <source>Read entry field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry uuid field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field type</source> + <translation type="unfinished"/> </message> </context> <context> <name>Main</name> <message> - <source>Fatal error while testing the cryptographic functions.</source> - <translation>Неисправимая ошибка в процессе тестирования криптографических функций.</translation> - </message> - <message> - <source>KeePassXC - Error</source> - <translation>Ошибка - KeePassXC</translation> + <source>Existing single-instance lock file is invalid. Launching new instance.</source> + <translation>Запускается новый экземпляр программы, т.к. файл блокировки запуска повреждён.</translation> </message> <message> <source>The lock file could not be created. Single-instance mode disabled.</source> @@ -1352,64 +2433,32 @@ This is a one-way migration. You won't be able to open the imported databas <translation>Другой экземпляр KeePassXC уже запущен.</translation> </message> <message> - <source>Existing single-instance lock file is invalid. Launching new instance.</source> - <translation>Запускается новый экземпляр программы, т.к. файл блокировки запуска повреждён.</translation> + <source>Fatal error while testing the cryptographic functions.</source> + <translation>Неисправимая ошибка в процессе тестирования криптографических функций.</translation> + </message> + <message> + <source>KeePassXC - Error</source> + <translation>Ошибка - KeePassXC</translation> </message> </context> <context> <name>MainWindow</name> <message> - <source>Open database</source> - <translation>Открыть базу данных</translation> - </message> - <message> - <source>Database settings</source> - <translation>Параметры базы данных</translation> - </message> - <message> - <source>Copy username to clipboard</source> - <translation>Скопировать имя пользователя в буфер обмена</translation> - </message> - <message> - <source>Copy password to clipboard</source> - <translation>Скопировать пароль в буфер обмена</translation> - </message> - <message> - <source>Settings</source> - <translation>Настройки</translation> - </message> - <message> - <source>Show toolbar</source> - <translation>Показать панель инструментов</translation> - </message> - <message> - <source>read-only</source> - <translation>только для чтения</translation> - </message> - <message> - <source>Toggle window</source> - <translation>Переключить окно</translation> - </message> - <message> - <source>KeePass 2 Database</source> - <translation>База данных KeePass 2</translation> - </message> - <message> - <source>All files</source> - <translation>Все файлы</translation> - </message> - <message> - <source>Save repaired database</source> - <translation>Сохранить восстановленную базу данных</translation> - </message> - <message> - <source>Writing the database failed.</source> - <translation>Не удалось записать базу данных.</translation> + <source>&Database</source> + <translation>&База данных</translation> </message> <message> <source>&Recent databases</source> <translation>&Недавние базы данных</translation> </message> + <message> + <source>Import</source> + <translation>Импорт</translation> + </message> + <message> + <source>&Help</source> + <translation>Помощь</translation> + </message> <message> <source>E&ntries</source> <translation>&Записи</translation> @@ -1418,13 +2467,17 @@ This is a one-way migration. You won't be able to open the imported databas <source>Copy att&ribute to clipboard</source> <translation>Скопировать &атрибут в буфер обмена</translation> </message> + <message> + <source>Time-based one-time password</source> + <translation>Временной одноразовый пароль</translation> + </message> <message> <source>&Groups</source> <translation>&Группы</translation> </message> <message> - <source>&View</source> - <translation>&Вид</translation> + <source>&Tools</source> + <translation>&Инструменты</translation> </message> <message> <source>&Quit</source> @@ -1434,6 +2487,10 @@ This is a one-way migration. You won't be able to open the imported databas <source>&About</source> <translation>&О программе</translation> </message> + <message> + <source>&Open database...</source> + <translation>&Открыть базу данных...</translation> + </message> <message> <source>&Save database</source> <translation>&Сохранить базу данных</translation> @@ -1474,26 +2531,26 @@ This is a one-way migration. You won't be able to open the imported databas <source>&Delete group</source> <translation>&Удалить группу</translation> </message> + <message> + <source>Sa&ve database as...</source> + <translation>&Сохранить базу данных как...</translation> + </message> + <message> + <source>Change &master key...</source> + <translation>Изменение &мастер-пароля...</translation> + </message> <message> <source>&Database settings</source> <translation>Настройки базы данных</translation> </message> + <message> + <source>Database settings</source> + <translation>Параметры базы данных</translation> + </message> <message> <source>&Clone entry</source> <translation>&Клонировать запись</translation> </message> - <message> - <source>Timed one-time password</source> - <translation>Временный разовый пароль</translation> - </message> - <message> - <source>Copy &TOTP</source> - <translation>Копировать &ВРП</translation> - </message> - <message> - <source>Show TOTP</source> - <translation>Показать ВРП</translation> - </message> <message> <source>&Find</source> <translation>&Найти</translation> @@ -1502,21 +2559,33 @@ This is a one-way migration. You won't be able to open the imported databas <source>Copy &username</source> <translation>Скопировать &имя пользователя</translation> </message> + <message> + <source>Copy username to clipboard</source> + <translation>Скопировать имя пользователя в буфер обмена</translation> + </message> <message> <source>Cop&y password</source> <translation>&Скопировать пароль</translation> </message> + <message> + <source>Copy password to clipboard</source> + <translation>Скопировать пароль в буфер обмена</translation> + </message> <message> <source>&Settings</source> <translation>&Настройки</translation> </message> + <message> + <source>Password Generator</source> + <translation>Генератор паролей</translation> + </message> <message> <source>&Perform Auto-Type</source> <translation>&Произвести автоввод</translation> </message> <message> <source>&Open URL</source> - <translation>&Открыть адрес</translation> + <translation>&Открыть URL-адрес</translation> </message> <message> <source>&Lock databases</source> @@ -1526,65 +2595,25 @@ This is a one-way migration. You won't be able to open the imported databas <source>&Title</source> <translation>&Имя записи</translation> </message> + <message> + <source>Copy title to clipboard</source> + <translation>Скопировать название в буфер обмена</translation> + </message> <message> <source>&URL</source> - <translation>&Адрес</translation> + <translation>&URL-адрес</translation> + </message> + <message> + <source>Copy URL to clipboard</source> + <translation>Скопировать URL-адрес в буфер обмена</translation> </message> <message> <source>&Notes</source> <translation>&Примечания</translation> </message> <message> - <source>Password Generator</source> - <translation>Генератор паролей</translation> - </message> - <message> - <source>Clear history</source> - <translation>Очистить историю</translation> - </message> - <message> - <source>&Database</source> - <translation>&База данных</translation> - </message> - <message> - <source>Import</source> - <translation>Импорт</translation> - </message> - <message> - <source>&Tools</source> - <translation>&Инструменты</translation> - </message> - <message> - <source>Empty recycle bin</source> - <translation>Очистить корзину</translation> - </message> - <message> - <source>Access error for config file %1</source> - <translation>Ошибка доступа к файлу конфигурации %1</translation> - </message> - <message> - <source>Quit KeePassXC</source> - <translation>Закрыть KeePassXC</translation> - </message> - <message> - <source>Please touch the button on your YubiKey!</source> - <translation>Нажмите кнопку на YubiKey!</translation> - </message> - <message> - <source>&Help</source> - <translation>Помощь</translation> - </message> - <message> - <source>&Open database...</source> - <translation>&Открыть базу данных...</translation> - </message> - <message> - <source>Sa&ve database as...</source> - <translation>&Сохранить базу данных как...</translation> - </message> - <message> - <source>Change &master key...</source> - <translation>Изменение &мастер-пароля...</translation> + <source>Copy notes to clipboard</source> + <translation>Скопировать примечания в буфер обмена</translation> </message> <message> <source>&Export to CSV file...</source> @@ -1602,9 +2631,168 @@ This is a one-way migration. You won't be able to open the imported databas <source>Re&pair database...</source> <translation>Во&сстановить базу данных...</translation> </message> + <message> + <source>Show TOTP</source> + <translation>Показать TOTP</translation> + </message> <message> <source>Set up TOTP...</source> - <translation>Установить ВРП...</translation> + <translation>Установить TOTP...</translation> + </message> + <message> + <source>Copy &TOTP</source> + <translation>Копировать &TOTP</translation> + </message> + <message> + <source>E&mpty recycle bin</source> + <translation type="unfinished"/> + </message> + <message> + <source>Clear history</source> + <translation>Очистить историю</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation>Ошибка доступа к файлу конфигурации %1</translation> + </message> + <message> + <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> + <translation><p>Похоже вы используете KeePassHTTP для интеграции с браузером. Эта функция является устаревшей и будет удалена в будущем.<br>Пожалуйста перейдите на KeePassXC-Browser! Чтобы получить помощь прочтите наше <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">руководство по миграции</a> (предупреждение %1 of 3).</p></translation> + </message> + <message> + <source>read-only</source> + <translation>только для чтения</translation> + </message> + <message> + <source>Settings</source> + <translation>Настройки</translation> + </message> + <message> + <source>Toggle window</source> + <translation>Переключить окно</translation> + </message> + <message> + <source>Quit KeePassXC</source> + <translation>Закрыть KeePassXC</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>База данных KeePass 2</translation> + </message> + <message> + <source>All files</source> + <translation>Все файлы</translation> + </message> + <message> + <source>Open database</source> + <translation>Открыть базу данных</translation> + </message> + <message> + <source>Save repaired database</source> + <translation>Сохранить восстановленную базу данных</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>Не удалось записать базу данных.</translation> + </message> + <message> + <source>Please touch the button on your YubiKey!</source> + <translation>Нажмите кнопку на YubiKey!</translation> + </message> +</context> +<context> + <name>OpenSSHKey</name> + <message> + <source>Invalid key file, expecting an OpenSSH key</source> + <translation>Недопустимый файл ключа, ожидается OpenSSH ключ</translation> + </message> + <message> + <source>PEM boundary mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>This is not an OpenSSH key, only modern keys are supported</source> + <translation>Это не ключ OpenSSH, поддерживаются только современные ключи</translation> + </message> + <message> + <source>Base64 decoding failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file way too small.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file magic header id invalid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Found zero keys</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to read public key.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Corrupted key file, reading private key failed</source> + <translation>Поврежденный файл ключа, чтение личного ключа не удалось</translation> + </message> + <message> + <source>No private key payload to decrypt</source> + <translation>В личном ключе нет сведений для дешифрования</translation> + </message> + <message> + <source>Unknown cipher: </source> + <translation>Неизвестный шифр: </translation> + </message> + <message> + <source>Trying to run KDF without cipher</source> + <translation>Попытка запустить ФФК без шифрования</translation> + </message> + <message> + <source>Passphrase is required to decrypt this key</source> + <translation>Пароль требуется для расшифровки этого ключа</translation> + </message> + <message> + <source>Key derivation failed, key file corrupted?</source> + <translation>Формирования ключа не удалось, ключевой файл поврежден?</translation> + </message> + <message> + <source>Unknown KDF: </source> + <translation>Неизвестные ФФК: </translation> + </message> + <message> + <source>Decryption failed, wrong passphrase?</source> + <translation>Расшифровка не удалась, неправильный пароль?</translation> + </message> + <message> + <source>Unexpected EOF while reading public key</source> + <translation>Неожиданное EOF при чтении открытого ключа</translation> + </message> + <message> + <source>Unknown key type: </source> + <translation>Неизвестный тип ключа: </translation> + </message> + <message> + <source>Unexpected EOF while reading private key</source> + <translation>Неожиданный EOF при чтении личного ключа</translation> + </message> + <message> + <source>Can't write public key as it is empty</source> + <translation>Не удается записать публичный ключ, так как он пуст</translation> + </message> + <message> + <source>Unexpected EOF when writing public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write private key as it is empty</source> + <translation>Нельзя записать личный ключ, поскольку он пустой</translation> + </message> + <message> + <source>Unexpected EOF when writing private key</source> + <translation>Неожиданный EOF при записи личного ключа</translation> </message> </context> <context> @@ -1613,22 +2801,63 @@ This is a one-way migration. You won't be able to open the imported databas <source>Dialog</source> <translation>Диалог</translation> </message> + <message> + <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation>Это необходимо для доступа к вашим базам данных из ChromeIPass или PassIFox</translation> + </message> + <message> + <source>Enable KeePassHTTP server</source> + <translation>Включить сервер KeePassHTTP</translation> + </message> <message> <source>General</source> <translation>Общие</translation> </message> <message> <source>Sh&ow a notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> <translation>Показывать уведомление при запросе учётных данных</translation> </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>Возвращает только лучшие совпадения для определенного URL-адрес вместо всех записей для всего домена.</translation> + </message> + <message> + <source>&Return only best matching entries</source> + <translation>&Показывать только лучшие совпадения</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Запрашивать разблокировку базы данных, если она заблокирована</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> + <translation>Будут отобраны только записи с совпадающим протоколом (http://, https://, ftp://, ...).</translation> + </message> + <message> + <source>&Match URL schemes</source> + <translation>&Проверять протокол URL</translation> + </message> <message> <source>Sort matching entries by &username</source> <translation>Сортировать совпавшие записи по &имени пользователя</translation> </message> + <message> + <source>Sort &matching entries by title</source> + <translation>Сортировать совпадающие записи по названию</translation> + </message> + <message> + <source>R&emove all shared encryption keys from active database</source> + <translation>&Удалить все общие ключи шифрования из активной базы данных</translation> + </message> <message> <source>Re&move all stored permissions from entries in active database</source> <translation>Удалить все сохранённые права доступа из записей активной базы данных</translation> </message> + <message> + <source>Password Generator</source> + <translation>Генератор паролей</translation> + </message> <message> <source>Advanced</source> <translation>Продвинутые</translation> @@ -1641,10 +2870,22 @@ This is a one-way migration. You won't be able to open the imported databas <source>Always allow &updating entries</source> <translation>Всегда разрешать обновление записей</translation> </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>К клиенту должна быть подключена только выбранная база данных.</translation> + </message> <message> <source>Searc&h in all opened databases for matching entries</source> <translation>Искать подходящие записи во всех открытых базах данных</translation> </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>Автоматическое создание или обновление полей, содержащих строки, не поддерживается.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>Возвращать продвинутые стро&ковые поля, начинающиеся с «KPH: »</translation> + </message> <message> <source>HTTP Port:</source> <translation>Порт HTTP:</translation> @@ -1653,18 +2894,18 @@ This is a one-way migration. You won't be able to open the imported databas <source>Default port: 19455</source> <translation>Порт по умолчанию: 19455</translation> </message> - <message> - <source>Re&quest to unlock the database if it is locked</source> - <translation>Запрашивать разблокировку базы данных, если она заблокирована</translation> - </message> - <message> - <source>Sort &matching entries by title</source> - <translation>Сортировать совпадающие записи по названию</translation> - </message> <message> <source>KeePassXC will listen to this port on 127.0.0.1</source> <translation>KeePassXC будет слушать этот порт на 127.0.0.1</translation> </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation><b>Внимание:</b> Следующие параметры могут быть опасны!</translation> + </message> + <message> + <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> + <translation><p>KeePassHTTP устарел и будет удален в будущем.<br>Поажлуйста перейдите на KeePassXC-Browser! Чтобы получить помощь прочтите наше <a href="https://keepassxc.org/docs/keepassxc-browser-migration">руководство по миграции</a>.</p></translation> + </message> <message> <source>Cannot bind to privileged ports</source> <translation>Не удаётся выполнить привязку к привилегированным портам</translation> @@ -1675,63 +2916,30 @@ Using default port 19455.</source> <translation>Не удаётся привязать к привилегированным портам с номерами меньше 1024! Используется порт по умолчанию: 19455.</translation> </message> - <message> - <source>R&emove all shared encryption keys from active database</source> - <translation>&Удалить все общие ключи шифрования из активной базы данных</translation> - </message> - <message> - <source>&Return advanced string fields which start with "KPH: "</source> - <translation>Возвращать продвинутые стро&ковые поля, начинающиеся с «KPH: »</translation> - </message> - <message> - <source>Automatically creating or updating string fields is not supported.</source> - <translation>Автоматическое создание или обновление полей, содержащих строки, не поддерживается.</translation> - </message> - <message> - <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> - <translation>Это необходимо для доступа к вашим базам данных из ChromeIPass или PassIFox</translation> - </message> - <message> - <source>Enable KeePassHTTP server</source> - <translation>Включить сервер KeePassHTTP</translation> - </message> - <message> - <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation>Возвращает только лучшие совпадения для определенного URL вместо всех записей для всего домена.</translation> - </message> - <message> - <source>&Return only best matching entries</source> - <translation>&Показывать только лучшие совпадения</translation> - </message> - <message> - <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation>Будут отобраны только записи с совпадающим протоколом (http://, https://, ftp://, ...).</translation> - </message> - <message> - <source>&Match URL schemes</source> - <translation>&Проверять протокол</translation> - </message> - <message> - <source>Password Generator</source> - <translation>Генератор паролей</translation> - </message> - <message> - <source>Only the selected database has to be connected with a client.</source> - <translation>К клиенту должна быть подключена только выбранная база данных.</translation> - </message> - <message> - <source>The following options can be dangerous! -Change them only if you know what you are doing.</source> - <translation>Следующие параметры могут быть опасны! -Меняйте их, только если знаете, что делаете.</translation> - </message> </context> <context> <name>PasswordGeneratorWidget</name> + <message> + <source>%p%</source> + <translation>%p%</translation> + </message> <message> <source>Password:</source> <translation>Пароль:</translation> </message> + <message> + <source>strength</source> + <comment>Password strength</comment> + <translation>надёжность</translation> + </message> + <message> + <source>entropy</source> + <translation>энтропия</translation> + </message> + <message> + <source>Password</source> + <translation>Пароль</translation> + </message> <message> <source>Character Types</source> <translation>Виды символов</translation> @@ -1750,40 +2958,52 @@ Change them only if you know what you are doing.</source> </message> <message> <source>Special Characters</source> - <translation>Особые символы</translation> + <translation>Специальные символы</translation> + </message> + <message> + <source>Extended ASCII</source> + <translation>Расширенный ASCII</translation> </message> <message> <source>Exclude look-alike characters</source> - <translation>Исключить похожие символы</translation> - </message> - <message> - <source>Accept</source> - <translation>Принять</translation> - </message> - <message> - <source>%p%</source> - <translation>%p%</translation> - </message> - <message> - <source>strength</source> - <translation>надёжность</translation> - </message> - <message> - <source>entropy</source> - <translation>энтропия</translation> - </message> - <message> - <source>&Length:</source> - <translation>&Длина:</translation> + <translation>Исключить визуально схожие символы</translation> </message> <message> <source>Pick characters from every group</source> <translation>Подобрать символы из каждой группы</translation> </message> + <message> + <source>&Length:</source> + <translation>&Длина:</translation> + </message> + <message> + <source>Passphrase</source> + <translation>Парольная фраза</translation> + </message> + <message> + <source>Wordlist:</source> + <translation>Список слов:</translation> + </message> + <message> + <source>Word Count:</source> + <translation>Количество слов:</translation> + </message> + <message> + <source>Word Separator:</source> + <translation>Разделитель слов:</translation> + </message> <message> <source>Generate</source> <translation>Генерировать</translation> </message> + <message> + <source>Copy</source> + <translation>Копировать</translation> + </message> + <message> + <source>Accept</source> + <translation>Принять</translation> + </message> <message> <source>Close</source> <translation>Закрыть</translation> @@ -1802,51 +3022,273 @@ Change them only if you know what you are doing.</source> </message> <message> <source>Poor</source> + <comment>Password quality</comment> <translation>Плохое</translation> </message> <message> <source>Weak</source> + <comment>Password quality</comment> <translation>Слабое</translation> </message> <message> <source>Good</source> + <comment>Password quality</comment> <translation>Хорошее</translation> </message> <message> <source>Excellent</source> + <comment>Password quality</comment> <translation>Отличное</translation> </message> - <message> - <source>Password</source> - <translation>Пароль</translation> - </message> - <message> - <source>Extended ASCII</source> - <translation>Расширенный ASCII</translation> - </message> - <message> - <source>Passphrase</source> - <translation>Парольная фраза</translation> - </message> - <message> - <source>Wordlist:</source> - <translation>Список слов:</translation> - </message> - <message> - <source>Word Count:</source> - <translation>Количество слов:</translation> - </message> - <message> - <source>Word Separator:</source> - <translation>Разделитель слов:</translation> - </message> - <message> - <source>Copy</source> - <translation>Копировать</translation> - </message> </context> <context> <name>QObject</name> + <message> + <source>Database not opened</source> + <translation>База данных не открыта</translation> + </message> + <message> + <source>Database hash not available</source> + <translation>Отсутствует хэш базы данных</translation> + </message> + <message> + <source>Client public key not received</source> + <translation>Не получен открытый ключ клиента</translation> + </message> + <message> + <source>Cannot decrypt message</source> + <translation>Не удается расшифровать сообщение</translation> + </message> + <message> + <source>Timeout or cannot connect to KeePassXC</source> + <translation>Истекло время ожидания или невозможно подключиться к KeePassXC</translation> + </message> + <message> + <source>Action cancelled or denied</source> + <translation>Действие отменено или запрещено</translation> + </message> + <message> + <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> + <translation>Не удается зашифровать сообщение или открытый ключ не найден. Механизм Native Messaging включен в KeePassXC?</translation> + </message> + <message> + <source>KeePassXC association failed, try again</source> + <translation>KeePassXC объединение не удалось, попробуйте еще раз</translation> + </message> + <message> + <source>Key change was not successful</source> + <translation>Изменение ключа не было успешным</translation> + </message> + <message> + <source>Encryption key is not recognized</source> + <translation>Ключ шифрования не распознан</translation> + </message> + <message> + <source>No saved databases found</source> + <translation>Сохраненная база данных не найдена</translation> + </message> + <message> + <source>Incorrect action</source> + <translation>Неправильное действие</translation> + </message> + <message> + <source>Empty message received</source> + <translation>Получено пустое сообщение</translation> + </message> + <message> + <source>No URL provided</source> + <translation>Отсутствует URL-адрес</translation> + </message> + <message> + <source>No logins found</source> + <translation>Логины не найдены</translation> + </message> + <message> + <source>Unknown error</source> + <translation>Неизвестная ошибка</translation> + </message> + <message> + <source>Add a new entry to a database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>Путь к базе данных.</translation> + </message> + <message> + <source>Key file of the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>path</source> + <translation>путь</translation> + </message> + <message> + <source>Username for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>username</source> + <translation>имя пользователя</translation> + </message> + <message> + <source>URL for the entry.</source> + <translation>URL-адрес для записи</translation> + </message> + <message> + <source>URL</source> + <translation>URL-адрес</translation> + </message> + <message> + <source>Prompt for the entry's password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a password for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length for the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>length</source> + <translation>длина</translation> + </message> + <message> + <source>Path of the entry to add.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy an entry's password to the clipboard.</source> + <translation>Скопировать пароль в буфер обмена.</translation> + </message> + <message> + <source>Path of the entry to clip.</source> + <comment>clip = copy to clipboard</comment> + <translation>Скопировать путь до записи.</translation> + </message> + <message> + <source>Timeout in seconds before clearing the clipboard.</source> + <translation>Время ожидания в секундах до очистки буфера обмена.</translation> + </message> + <message> + <source>Edit an entry.</source> + <translation>Редактирование записи.</translation> + </message> + <message> + <source>Title for the entry.</source> + <translation>Название для записи.</translation> + </message> + <message> + <source>title</source> + <translation>название</translation> + </message> + <message> + <source>Path of the entry to edit.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Estimate the entropy of a password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password for which to estimate the entropy.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Perform advanced analysis on the password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Extract and print the content of a database.</source> + <translation>Извлечь и распечатать содержимое базы данных.</translation> + </message> + <message> + <source>Path of the database to extract.</source> + <translation>Путь к базе данных для извлечения.</translation> + </message> + <message> + <source>Insert password to unlock %1: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to load key file %1 : %2</source> + <translation type="unfinished"/> + </message> + <message> + <source>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source> + +Available commands: +</source> + <translation> + +Доступные команды: +</translation> + </message> + <message> + <source>Name of the command to execute.</source> + <translation>Имя выполняемой команды.</translation> + </message> + <message> + <source>List database entries.</source> + <translation>Список записей в базе данных.</translation> + </message> + <message> + <source>Path of the group to list. Default is /</source> + <translation>Путь к списку группы. Значение по умолчанию /</translation> + </message> + <message> + <source>Find entries quickly.</source> + <translation>Найти записи быстро.</translation> + </message> + <message> + <source>Search term.</source> + <translation>Поисковый запрос.</translation> + </message> + <message> + <source>Merge two databases.</source> + <translation>Объединить две базы данных.</translation> + </message> + <message> + <source>Path of the database to merge into.</source> + <translation>Путь к базе данных для объединения в.</translation> + </message> + <message> + <source>Path of the database to merge from.</source> + <translation>Путь к базе данных для слияния.</translation> + </message> + <message> + <source>Use the same credentials for both database files.</source> + <translation>Используйте те же учетные данные для обоих файлов базы данных.</translation> + </message> + <message> + <source>Key file of the database to merge from.</source> + <translation>Файл ключа базы данных для слияния.</translation> + </message> + <message> + <source>Show an entry's information.</source> + <translation>Показать сведения о записях.</translation> + </message> + <message> + <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> + <translation type="unfinished"/> + </message> + <message> + <source>attribute</source> + <translation>атрибут</translation> + </message> + <message> + <source>Name of the entry to show.</source> + <translation>Название записи для отображения.</translation> + </message> <message> <source>NULL device</source> <translation>Устройство NULL</translation> @@ -1870,8 +3312,28 @@ Change them only if you know what you are doing.</source> <translation>Отсутствует закрывающая цитата</translation> </message> <message> - <source>INTERNAL - unget lower bound exceeded</source> - <translation>Внутренний - превышение нижней границы</translation> + <source>AES: 256-bit</source> + <translation>AES: 256-бит</translation> + </message> + <message> + <source>Twofish: 256-bit</source> + <translation>Twofish: 256-бит</translation> + </message> + <message> + <source>ChaCha20: 256-bit</source> + <translation>ChaCha20: 256-бит</translation> + </message> + <message> + <source>Argon2 (KDBX 4 – recommended)</source> + <translation>Argon2 (KDBX 4 – рекомендуемый)</translation> + </message> + <message> + <source>AES-KDF (KDBX 4)</source> + <translation>AES-KDF (KDBX 4)</translation> + </message> + <message> + <source>AES-KDF (KDBX 3.1)</source> + <translation>AES-KDF (KDBX 3.1)</translation> </message> <message> <source>Group</source> @@ -1889,14 +3351,22 @@ Change them only if you know what you are doing.</source> <source>Password</source> <translation>Пароль</translation> </message> - <message> - <source>URL</source> - <translation>Адрес</translation> - </message> <message> <source>Notes</source> <translation>Примечания</translation> </message> + <message> + <source>Last Modified</source> + <translation>Последнее изменение</translation> + </message> + <message> + <source>Created</source> + <translation>Создан</translation> + </message> + <message> + <source>Legacy Browser Integration</source> + <translation>Устаревшая интеграция с браузером</translation> + </message> <message> <source>Browser Integration</source> <translation>Интеграция с браузером</translation> @@ -1913,6 +3383,10 @@ Change them only if you know what you are doing.</source> <source>Passive</source> <translation>Пассивная</translation> </message> + <message> + <source>SSH Agent</source> + <translation>SSH Агент</translation> + </message> </context> <context> <name>QtIOCompressor</name> @@ -1951,8 +3425,8 @@ Change them only if you know what you are doing.</source> <context> <name>SearchWidget</name> <message> - <source>Case Sensitive</source> - <translation>Чувствительно к регистру</translation> + <source>Search...</source> + <translation>Поиск...</translation> </message> <message> <source>Search</source> @@ -1963,8 +3437,8 @@ Change them only if you know what you are doing.</source> <translation>Очистить</translation> </message> <message> - <source>Search...</source> - <translation>Поиск...</translation> + <source>Case Sensitive</source> + <translation>Чувствительно к регистру</translation> </message> <message> <source>Limit search to selected group</source> @@ -1973,50 +3447,6 @@ Change them only if you know what you are doing.</source> </context> <context> <name>Service</name> - <message> - <source>A shared encryption-key with the name "%1" already exists. -Do you want to overwrite it?</source> - <translation>Общий ключ шифрования с именем «%1» уже существует. -Перезаписать его?</translation> - </message> - <message> - <source>Do you want to update the information in %1 - %2?</source> - <translation>Обновить информацию в %1 - %2?</translation> - </message> - <message> - <source>The active database is locked! -Please unlock the selected database or choose another one which is unlocked.</source> - <translation>Активная база данных заблокирована! -Разблокируйте выбранную базу данных или выберите другую, незаблокированную.</translation> - </message> - <message> - <source>Successfully removed %1 encryption-%2 from KeePassX/Http Settings.</source> - <translation>Успешно удалено %1 шифрование-%2 из настроек KeePassXC/Http.</translation> - </message> - <message> - <source>No shared encryption-keys found in KeePassHttp Settings.</source> - <translation>Не найдено общих ключей шифрования в настройках KeePassHttp.</translation> - </message> - <message> - <source>The active database does not contain an entry of KeePassHttp Settings.</source> - <translation>Активная база данных не содержит записей настроек KeePassHttp.</translation> - </message> - <message> - <source>Removing stored permissions...</source> - <translation>Удаляю сохранённые права доступа...</translation> - </message> - <message> - <source>Abort</source> - <translation>Прервать</translation> - </message> - <message> - <source>Successfully removed permissions from %1 %2.</source> - <translation>Права доступа из %1 %2 успешно удалены.</translation> - </message> - <message> - <source>The active database does not contain an entry with permissions.</source> - <translation>Активная база данных не содержит записей с назначенными правами доступа.</translation> - </message> <message> <source>KeePassXC: New key association request</source> <translation>KeePassXC: Запрос на ассоциацию нового ключа</translation> @@ -2033,34 +3463,78 @@ give it a unique name to identify and accept it.</source> <source>KeePassXC: Overwrite existing key?</source> <translation>KeePassXC: Перезаписать существующий ключ?</translation> </message> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>Общий ключ шифрования с именем «%1» уже существует. +Перезаписать его?</translation> + </message> <message> <source>KeePassXC: Update Entry</source> <translation>KeePassXC: Обновить запись</translation> </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Обновить информацию в %1 - %2?</translation> + </message> <message> <source>KeePassXC: Database locked!</source> <translation>KeePassXC: База данных заблокирована!</translation> </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>Активная база данных заблокирована! +Разблокируйте выбранную базу данных или выберите другую, незаблокированную.</translation> + </message> <message> <source>KeePassXC: Removed keys from database</source> <translation>KeePassXC: Ключи удалены из базы данных</translation> </message> + <message numerus="yes"> + <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> + <translation><numerusform>Успешно удалена %n шифрования-ключи от параметров KeePassX/Http.</numerusform><numerusform>Успешно удалена %n шифрования-ключи от параметров KeePassX/Http.</numerusform><numerusform>Успешно удалена %n шифрования-ключи от параметров KeePassX/Http.</numerusform><numerusform>Успешно удалено %n ключей шифрования из параметров KeePassX/Http.</numerusform></translation> + </message> <message> <source>KeePassXC: No keys found</source> <translation>KeePassXC: Ключи не найдены</translation> </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation>Не найдено общих ключей шифрования в настройках KeePassHttp.</translation> + </message> <message> <source>KeePassXC: Settings not available!</source> <translation>KeePassXC: Настройки недоступны!</translation> </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation>Активная база данных не содержит записей настроек KeePassHttp.</translation> + </message> + <message> + <source>Removing stored permissions...</source> + <translation>Удаляю сохранённые права доступа...</translation> + </message> + <message> + <source>Abort</source> + <translation>Прервать</translation> + </message> <message> <source>KeePassXC: Removed permissions</source> <translation>KeePassXC: Права доступа удалены</translation> </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entries.</source> + <translation><numerusform>Успешно удалены разрешения %n записей.</numerusform><numerusform>Успешно удалены разрешения %n записей.</numerusform><numerusform>Успешно удалены разрешения %n записей.</numerusform><numerusform>Успешно удалены доступы для %n записей.</numerusform></translation> + </message> <message> <source>KeePassXC: No entry with permissions found!</source> <translation>KeePassXC: Не найдена запись с правами доступа!</translation> </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>Активная база данных не содержит записей с назначенными правами доступа.</translation> + </message> </context> <context> <name>SettingsWidget</name> @@ -2083,10 +3557,26 @@ give it a unique name to identify and accept it.</source> </context> <context> <name>SettingsWidgetGeneral</name> + <message> + <source>Basic Settings</source> + <translation>Основные параметры</translation> + </message> + <message> + <source>Start only a single instance of KeePassXC</source> + <translation>Запускать только один экземпляр KeePassXC</translation> + </message> <message> <source>Remember last databases</source> <translation>Запоминать последнюю базу данных</translation> </message> + <message> + <source>Remember last key files and security dongles</source> + <translation>Запоминать последние использованные файлы ключей и устройства</translation> + </message> + <message> + <source>Load previous databases on startup</source> + <translation>Загружать предыдущие базы данных при запуске</translation> + </message> <message> <source>Automatically save on exit</source> <translation>Автоматически сохранять при выходе</translation> @@ -2095,21 +3585,29 @@ give it a unique name to identify and accept it.</source> <source>Automatically save after every change</source> <translation>Автоматически сохранять после каждого изменения</translation> </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation>Автоматически перезагружать базу данных при её изменении извне</translation> + </message> <message> <source>Minimize when copying to clipboard</source> <translation>Сворачивать при копировании в буфер обмена</translation> </message> + <message> + <source>Minimize window at application startup</source> + <translation>Сворачивать окно при запуске приложения</translation> + </message> <message> <source>Use group icon on entry creation</source> <translation>Использовать значок группы для новых записей</translation> </message> <message> - <source>Global Auto-Type shortcut</source> - <translation>Глобальная комбинация клавиш для автоввода</translation> + <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> + <translation>Не помечать базу данных изменённой при действиях, не связанных с изменением данных (например, при распахивании групп)</translation> </message> <message> - <source>Language</source> - <translation>Язык</translation> + <source>Hide the Details view</source> + <translation>Скрыть подробную информацию</translation> </message> <message> <source>Show a system tray icon</source> @@ -2119,89 +3617,67 @@ give it a unique name to identify and accept it.</source> <source>Hide window to system tray when minimized</source> <translation>При сворачивании скрывать окно в системный лоток</translation> </message> - <message> - <source>Load previous databases on startup</source> - <translation>Загружать предыдущие базы данных при запуске</translation> - </message> - <message> - <source>Automatically reload the database when modified externally</source> - <translation>Автоматически перезагружать базу данных при её изменении извне</translation> - </message> <message> <source>Hide window to system tray instead of app exit</source> <translation>Скрывать окно в системный лоток вместо выхода</translation> </message> <message> - <source>Minimize window at application startup</source> - <translation>Сворачивать окно при запуске приложения</translation> + <source>Dark system tray icon</source> + <translation>Темная иконка в системном трее</translation> </message> <message> - <source>Basic Settings</source> - <translation>Основные параметры</translation> - </message> - <message> - <source>Remember last key files and security dongles</source> - <translation>Запоминать последние использованные файлы ключей и устройства</translation> - </message> - <message> - <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> - <translation>Не помечать базу данных изменённой при действиях, не связанных с изменением данных (например, при распахивании групп)</translation> + <source>Language</source> + <translation>Язык</translation> </message> <message> <source>Auto-Type</source> <translation>Автоввод</translation> </message> <message> - <source>Use entry title and URL to match windows for global Auto-Type</source> - <translation>Использовать для поиска URL и название записи</translation> + <source>Use entry title to match windows for global Auto-Type</source> + <translation>Использовать название записи, для глобального автоввода</translation> + </message> + <message> + <source>Use entry URL to match windows for global Auto-Type</source> + <translation>Использовать URL-адрес для глобального автоввода</translation> </message> <message> <source>Always ask before performing Auto-Type</source> <translation>Всегда спрашивать перед выполнением автоввода</translation> </message> + <message> + <source>Global Auto-Type shortcut</source> + <translation>Глобальная комбинация клавиш для автоввода</translation> + </message> <message> <source>Auto-Type delay</source> <translation>Задержка автоввода</translation> </message> <message> <source> ms</source> + <comment>Milliseconds</comment> <translation> мс</translation> </message> - <message> - <source>Start only a single instance of KeePassXC</source> - <translation>Запускать только один экземпляр KeePassXC</translation> - </message> </context> <context> <name>SettingsWidgetSecurity</name> + <message> + <source>Timeouts</source> + <translation>Таймауты</translation> + </message> <message> <source>Clear clipboard after</source> <translation>Очищать буфер обмена через</translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation>сек</translation> </message> <message> <source>Lock databases after inactivity of</source> <translation>Блокировать базу данных при отсутствии активности длительностью</translation> </message> - <message> - <source>Show passwords in cleartext by default</source> - <translation>По умолчанию показывать пароль в открытую</translation> - </message> - <message> - <source>Lock databases after minimizing the window</source> - <translation>Блокировать базу данных при сворачивания окна</translation> - </message> - <message> - <source>Don't require password repeat when it is visible</source> - <translation>Не требовать повторный ввод пароля, когда он показывается</translation> - </message> - <message> - <source>Timeouts</source> - <translation>Таймауты</translation> - </message> <message> <source>Convenience</source> <translation>Удобство</translation> @@ -2210,6 +3686,26 @@ give it a unique name to identify and accept it.</source> <source>Lock databases when session is locked or lid is closed</source> <translation>Блокировать базу данных при закрытии сеанса или закрытии крышки</translation> </message> + <message> + <source>Lock databases after minimizing the window</source> + <translation>Блокировать базу данных при сворачивание окна</translation> + </message> + <message> + <source>Don't require password repeat when it is visible</source> + <translation>Не требовать повторный ввод пароля, когда он показывается</translation> + </message> + <message> + <source>Show passwords in cleartext by default</source> + <translation>По умолчанию показывать пароль в открытую</translation> + </message> + <message> + <source>Hide passwords in the preview panel</source> + <translation>Скрыть пароли в панели предварительного просмотра</translation> + </message> + <message> + <source>Hide entry notes by default</source> + <translation>Скрыть примечания записи по умолчанию</translation> + </message> <message> <source>Privacy</source> <translation>Конфиденциальность</translation> @@ -2223,12 +3719,20 @@ give it a unique name to identify and accept it.</source> <name>SetupTotpDialog</name> <message> <source>Setup TOTP</source> - <translation>Настроить ВРП</translation> + <translation>Настроить TOTP</translation> </message> <message> <source>Key:</source> <translation>Ключ:</translation> </message> + <message> + <source>Default RFC 6238 token settings</source> + <translation>Стандартные настройки токена RFC 6238</translation> + </message> + <message> + <source>Steam token settings</source> + <translation>Настройки Steam токена</translation> + </message> <message> <source>Use custom settings</source> <translation>Использовать пользовательские настройки</translation> @@ -2255,6 +3759,7 @@ give it a unique name to identify and accept it.</source> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation>сек</translation> </message> </context> @@ -2322,88 +3827,40 @@ give it a unique name to identify and accept it.</source> <context> <name>main</name> <message> - <source>path to a custom config file</source> - <translation>путь к своему файлу настроек</translation> - </message> - <message> - <source>key file of the database</source> - <translation>файл-ключ базы данных</translation> - </message> - <message> - <source>KeePassXC - cross-platform password manager</source> - <translation>KeePassXC - кроссплатформенный менеджер паролей</translation> - </message> - <message> - <source>read password of the database from stdin</source> - <translation>читать пароли базы данных из стандартного ввода «stdin»</translation> - </message> - <message> - <source>filenames of the password databases to open (*.kdbx)</source> - <translation>имена файлов открываемой базы данных паролей (*.kdbx)</translation> - </message> - <message> - <source>Copy a password to the clipboard</source> - <translation>Скопировать пароль в буфер обмена</translation> + <source>Remove an entry from the database.</source> + <translation>Удалить запись из базы данных.</translation> </message> <message> <source>Path of the database.</source> <translation>Путь к базе данных.</translation> </message> <message> - <source>Use a GUI prompt unlocking the database.</source> - <translation>Использовать подсказку GUI для разблокировки базы данных.</translation> + <source>Path of the entry to remove.</source> + <translation>Путь к записи, для удаления.</translation> </message> <message> - <source>Name of the entry to clip.</source> - <translation>Имя записи для отсечения.</translation> + <source>KeePassXC - cross-platform password manager</source> + <translation>KeePassXC - кроссплатформенный менеджер паролей</translation> </message> <message> - <source>Extract and print the content of a database.</source> - <translation>Извлечь и распечатать содержимое базы данных.</translation> + <source>filenames of the password databases to open (*.kdbx)</source> + <translation>имена файлов открываемой базы данных паролей (*.kdbx)</translation> </message> <message> - <source>Path of the database to extract.</source> - <translation>Путь к базе данных для извлечения.</translation> + <source>path to a custom config file</source> + <translation>путь к своему файлу настроек</translation> </message> <message> - <source>Name of the command to execute.</source> - <translation>Имя выполняемой команды.</translation> + <source>key file of the database</source> + <translation>ключ-файл базы данных</translation> </message> <message> - <source>List database entries.</source> - <translation>Список записей в базе данных.</translation> + <source>read password of the database from stdin</source> + <translation>читать пароли базы данных из стандартного ввода «stdin»</translation> </message> <message> - <source>Path of the group to list. Default is /</source> - <translation>Путь к списку группы. Значение по умолчанию /</translation> - </message> - <message> - <source>Print the UUIDs of the entries and groups.</source> - <translation>Распечатать UUID записей и групп.</translation> - </message> - <message> - <source>Merge two databases.</source> - <translation>Объединить две базы данных.</translation> - </message> - <message> - <source>Path of the database to merge into.</source> - <translation>Путь к базе данных для объединения в.</translation> - </message> - <message> - <source>Path of the database to merge from.</source> - <translation>Путь к базе данных для слияния.</translation> - </message> - <message> - <source>Use the same password for both database files.</source> - <translation>Использовать тот же пароль для обоих файлов базы данных.</translation> - </message> - <message> - <source>Show a password.</source> - <translation>Показать пароль.</translation> - </message> - <message> - <source>Name of the entry to show.</source> - <translation>Название записи для отображения.</translation> + <source>Parent window handle</source> + <translation>Дескриптор родительского окна</translation> </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_th.ts b/share/translations/keepassx_th.ts new file mode 100644 index 000000000..9e4df6055 --- /dev/null +++ b/share/translations/keepassx_th.ts @@ -0,0 +1,3831 @@ +<?xml version="1.0" ?><!DOCTYPE TS><TS language="th" version="2.1"> +<context> + <name>AboutDialog</name> + <message> + <source>About KeePassXC</source> + <translation>เกี่ยวกับ KeePassXC</translation> + </message> + <message> + <source>About</source> + <translation>เกี่ยวกับ</translation> + </message> + <message> + <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> + <translation>รายงานข้อผิดพลาดที่: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> + </message> + <message> + <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>KeePassXC เผยแพร่ภายใต้เงื่อนไขของสัญญาอนุญาตสาธารณะทั่วไปของกนู (GNU GPL) +รุ่น 2 หรือรุ่น 3 (คุณสามารถเลือกได้)</translation> + </message> + <message> + <source>Project Maintainers:</source> + <translation>ผู้บำรุงรักษาโครงการ:</translation> + </message> + <message> + <source>Contributors</source> + <translation>ผู้ร่วมสมทบ</translation> + </message> + <message> + <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">ดูรายชื่อผู้สมทบบน GitHub</a></translation> + </message> + <message> + <source>Debug Info</source> + <translation>ข้อมูลดีบัก</translation> + </message> + <message> + <source>Include the following information whenever you report a bug:</source> + <translation>ใส่ข้อมูลดังต่อไปนี้ทุกครั้งที่คุณรายงานข้อผิดปกติของซอฟต์แวร์:</translation> + </message> + <message> + <source>Copy to clipboard</source> + <translation>คัดลอกไปยังคลิปบอร์ด:</translation> + </message> + <message> + <source>Version %1 +</source> + <translation>รุ่น %1 +</translation> + </message> + <message> + <source>Revision: %1</source> + <translation>การปรับปรุง: %1</translation> + </message> + <message> + <source>Distribution: %1</source> + <translation>การจัดจำหน่าย: %1</translation> + </message> + <message> + <source>Libraries:</source> + <translation>ไลบรารี:</translation> + </message> + <message> + <source>Operating system: %1 +CPU architecture: %2 +Kernel: %3 %4</source> + <translation>ระบบปฏิบัติการ: %1 +สถาปัตยกรรม CPU: %2 +เคอร์เนล: %3 %4</translation> + </message> + <message> + <source>Enabled extensions:</source> + <translation>ส่วนขยายที่เปิดใช้:</translation> + </message> +</context> +<context> + <name>AccessControlDialog</name> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remember this decision</source> + <translation>จำการตัดสินใจนี้</translation> + </message> + <message> + <source>Allow</source> + <translation>อนุญาต</translation> + </message> + <message> + <source>Deny</source> + <translation>ปฏิเสธ</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>AgentSettingsWidget</name> + <message> + <source>Enable SSH Agent (requires restart)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>AutoType</name> + <message> + <source>Couldn't find an entry that matches the window title:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>Auto-Type - KeePassXC</translation> + </message> + <message> + <source>Auto-Type</source> + <translation>Auto-Type</translation> + </message> + <message> + <source>The Syntax of your Auto-Type statement is incorrect!</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>AutoTypeAssociationsModel</name> + <message> + <source>Window</source> + <translation>หน้าต่าง</translation> + </message> + <message> + <source>Sequence</source> + <translation>ลำดับ</translation> + </message> + <message> + <source>Default sequence</source> + <translation>ลำดับมาตรฐาน</translation> + </message> +</context> +<context> + <name>AutoTypeSelectDialog</name> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>Auto-Type - KeePassXC</translation> + </message> + <message> + <source>Select entry to Auto-Type:</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>BrowserAccessControlDialog</name> + <message> + <source>KeePassXC-Browser Confirm Access</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remember this decision</source> + <translation>จำการตัดสินใจนี้</translation> + </message> + <message> + <source>Allow</source> + <translation>อนุญาต</translation> + </message> + <message> + <source>Deny</source> + <translation>ปฏิเสธ</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>BrowserOptionDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"/> + </message> + <message> + <source>This is required for accessing your databases with KeePassXC-Browser</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable KeepassXC browser integration</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>ทั่วไป</translation> + </message> + <message> + <source>Enable integration for these browsers:</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Google Chrome</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Firefox</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Chromium</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Vivaldi</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show a &notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Match URL scheme (e.g., https://...)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return only best-matching credentials</source> + <translation type="unfinished"/> + </message> + <message> + <source>Sort &matching credentials by title</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Sort matching credentials by &username</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>&Disconnect all browsers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Forget all remembered &permissions</source> + <translation type="unfinished"/> + </message> + <message> + <source>Advanced</source> + <translation>ขั้นสูง</translation> + </message> + <message> + <source>Never &ask before accessing credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Never ask before &updating credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searc&h in all opened databases for matching credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation type="unfinished"/> + </message> + <message> + <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Update &native messaging manifest files at startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Support a proxy application between KeePassXC and browser extension.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &proxy application between KeePassXC and browser extension</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a custom proxy location if you installed a proxy manually.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &custom proxy location</source> + <comment>Meant is the proxy for KeePassXC-Browser</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*.exe);;All Files (*.*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select custom proxy location</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>BrowserService</name> + <message> + <source>KeePassXC: New key association request</source> + <translation type="unfinished"/> + </message> + <message> + <source>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Save and allow access</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: เขียนทับกุญแจที่มีอยู่เดิม?</translation> + </message> + <message> + <source>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: ปรับปรุงรายการ</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: ฐานข้อมูลล็อกอยู่!</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: ไม่มีการตั้งค่าที่ใช้ได้!</translation> + </message> + <message> + <source>The active database does not contain a settings entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: ไม่พบกุญแจ</translation> + </message> + <message> + <source>No shared encryption keys found in KeePassXC Settings.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: เอากุญแจออกจากฐานข้อมูล</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <source>Removing stored permissions…</source> + <translation type="unfinished"/> + </message> + <message> + <source>Abort</source> + <translation>หยุด</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: การอนุญาตถูกนำออก</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entry(s).</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation type="unfinished"/> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>ChangeMasterKeyWidget</name> + <message> + <source>Password</source> + <translation>รหัสผ่าน</translation> + </message> + <message> + <source>Enter password:</source> + <translation>ป้อนรหัสผ่าน:</translation> + </message> + <message> + <source>Repeat password:</source> + <translation>ทวนรหัสผ่าน:</translation> + </message> + <message> + <source>&Key file</source> + <translation>แฟ้มกุญแจ (&K)</translation> + </message> + <message> + <source>Browse</source> + <translation>ดู</translation> + </message> + <message> + <source>Create</source> + <translation>สร้าง</translation> + </message> + <message> + <source>Cha&llenge Response</source> + <translation>รหัสสอบถาม รหัสตอบกลับ (&L)</translation> + </message> + <message> + <source>Refresh</source> + <translation>เรียกใหม่</translation> + </message> + <message> + <source>Key files</source> + <translation>แฟ้มกุญแจ</translation> + </message> + <message> + <source>All files</source> + <translation>ทุกแฟ้ม</translation> + </message> + <message> + <source>Create Key File...</source> + <translation>สร้างแฟ้มกุญแจ...</translation> + </message> + <message> + <source>Unable to create Key File : </source> + <translation>ไม่สามารถสร้างแฟ้มกุญแจได้ :</translation> + </message> + <message> + <source>Select a key file</source> + <translation>เลือกแฟ้มกุญแจ</translation> + </message> + <message> + <source>Empty password</source> + <translation>รหัสผ่านว่างเปล่า</translation> + </message> + <message> + <source>Do you really want to use an empty string as password?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Different passwords supplied.</source> + <translation>รหัสผ่านที่ให้มาไม่ตรงกัน</translation> + </message> + <message> + <source>Failed to set %1 as the Key file: +%2</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy key file format</source> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Changing master key failed: no YubiKey inserted.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CloneDialog</name> + <message> + <source>Clone Options</source> + <translation>ตัวเลือกการโคลน</translation> + </message> + <message> + <source>Append ' - Clone' to title</source> + <translation>เติม '- โคลน' ต่อท้ายชื่อ</translation> + </message> + <message> + <source>Replace username and password with references</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy history</source> + <translation>ทำสำเนาประวัติ</translation> + </message> +</context> +<context> + <name>CsvImportWidget</name> + <message> + <source>Import CSV fields</source> + <translation>นำเข้าฟิลด์ CSV</translation> + </message> + <message> + <source>filename</source> + <translation>ชื่อแฟ้ม</translation> + </message> + <message> + <source>size, rows, columns</source> + <translation>ขนาด, แถว, หลัก</translation> + </message> + <message> + <source>Encoding</source> + <translation>การเข้ารหัส</translation> + </message> + <message> + <source>Codec</source> + <translation>ตัวเข้ารหัส</translation> + </message> + <message> + <source>Text is qualified by</source> + <translation>ข้อความถูกกำกับด้วย</translation> + </message> + <message> + <source>Fields are separated by</source> + <translation>ฟิลด์ถูกแบ่งด้วย</translation> + </message> + <message> + <source>Comments start with</source> + <translation>บันทึกความเห็นเริ่มต้นด้วย</translation> + </message> + <message> + <source>First record has field names</source> + <translation>เรคคอร์ดแรกมีชื่อฟิลด์</translation> + </message> + <message> + <source>Number of headers line to discard</source> + <translation>จำนวนบรรทัดส่วนหัวที่จะไม่สนใจ</translation> + </message> + <message> + <source>Consider '\' an escape character</source> + <translation>ให้นับ '\' เป็น escape character</translation> + </message> + <message> + <source>Preview</source> + <translation>ดูตัวอย่าง</translation> + </message> + <message> + <source>Column layout</source> + <translation type="unfinished"/> + </message> + <message> + <source>Not present in CSV file</source> + <translation type="unfinished"/> + </message> + <message> + <source>Empty fieldname </source> + <translation>ชื่อฟิลด์ว่างเปล่า</translation> + </message> + <message> + <source>column </source> + <translation>หลัก</translation> + </message> + <message> + <source>Imported from CSV file</source> + <translation>นำเข้าจากแฟ้ม CSV แล้ว</translation> + </message> + <message> + <source>Original data: </source> + <translation>ข้อมูลต้นฉบับ:</translation> + </message> + <message> + <source>Error(s) detected in CSV file !</source> + <translation>พบข้อผิดพลาดในแฟ้ม CSV !</translation> + </message> + <message> + <source> more messages skipped]</source> + <translation>มีข้อความอีกมากที่ถูกข้ามไป]</translation> + </message> + <message> + <source>Error</source> + <translation>ผิดพลาด</translation> + </message> + <message> + <source>CSV import: writer has errors: +</source> + <translation>การนำเข้า CSV: ตัวเขียนมีข้อผิดพลาด: +</translation> + </message> +</context> +<context> + <name>CsvImportWizard</name> + <message> + <source>Error</source> + <translation>ผิดพลาด</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>ไม่สามารถคำนวญกุญแมาสเตอร์ได้</translation> + </message> +</context> +<context> + <name>CsvParserModel</name> + <message numerus="yes"> + <source>%n byte(s), </source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source>%n row(s), </source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source>%n column(s)</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> +</context> +<context> + <name>DatabaseOpenWidget</name> + <message> + <source>Enter master key</source> + <translation>ใส่กุญแจมาสเตอร์</translation> + </message> + <message> + <source>Key File:</source> + <translation>แฟ้มกุญแจ:</translation> + </message> + <message> + <source>Password:</source> + <translation>รหัสผ่าน:</translation> + </message> + <message> + <source>Browse</source> + <translation>ดู</translation> + </message> + <message> + <source>Refresh</source> + <translation>เรียกใหม่</translation> + </message> + <message> + <source>Challenge Response:</source> + <translation>รหัสสอบถาม รหัสตอบกลับ:</translation> + </message> + <message> + <source>Unable to open the database.</source> + <translation>ไม่สามารถเปิดฐานข้อมูลดังกล่าว</translation> + </message> + <message> + <source>Can't open key file</source> + <translation>ไม่สามารถเปิดแฟ้มกุญแจ</translation> + </message> + <message> + <source>Legacy key file format</source> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't show this warning again</source> + <translation type="unfinished"/> + </message> + <message> + <source>All files</source> + <translation>ทุกแฟ้ม</translation> + </message> + <message> + <source>Key files</source> + <translation>แฟ้มกุญแจ</translation> + </message> + <message> + <source>Select key file</source> + <translation>เลือกแฟ้มกุญแจ</translation> + </message> +</context> +<context> + <name>DatabaseRepairWidget</name> + <message> + <source>Repair database</source> + <translation>ซ่อมฐานข้อมูล</translation> + </message> + <message> + <source>Error</source> + <translation>ผิดพลาด</translation> + </message> + <message> + <source>Can't open key file</source> + <translation>ไม่สามารถเปิดแฟ้มกุญแจ</translation> + </message> + <message> + <source>Unable to open the database.</source> + <translation>ไม่สามารถเปิดฐานข้อมูลดังกล่าว</translation> + </message> + <message> + <source>Database opened fine. Nothing to do.</source> + <translation>ฐานข้อมูลเปิดได้ปกติ ไม่ต้องทำอะไร</translation> + </message> + <message> + <source>Success</source> + <translation>สำเร็จ</translation> + </message> + <message> + <source>The database has been successfully repaired +You can now save it.</source> + <translation>ฐานข้อมูลดังกล่าวถูกซ่อมสำเร็จแล้ว +ตอนนี้คุณสามารถบันทึกมันได้</translation> + </message> + <message> + <source>Unable to repair the database.</source> + <translation>ไม่สามารถซ่อมฐานข้อมูลดังกล่าว</translation> + </message> +</context> +<context> + <name>DatabaseSettingsWidget</name> + <message> + <source>General</source> + <translation>ทั่วไป</translation> + </message> + <message> + <source>Encryption</source> + <translation type="unfinished"/> + </message> + <message> + <source>Number of rounds too high</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Understood, keep number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cancel</source> + <translation type="unfinished"/> + </message> + <message> + <source>Number of rounds too low</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</source> + <translation type="unfinished"/> + </message> + <message> + <source>KDF unchanged</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetEncryption</name> + <message> + <source>Encryption Algorithm:</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES: 256 Bit (default)</source> + <translation>AES: 256 บิต (ค่าปริยาย)</translation> + </message> + <message> + <source>Twofish: 256 Bit</source> + <translation>Twofish: 256 บิต</translation> + </message> + <message> + <source>Key Derivation Function:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Transform rounds:</source> + <translation>รอบเปลี่ยนรูป:</translation> + </message> + <message> + <source>Benchmark 1-second delay</source> + <translation type="unfinished"/> + </message> + <message> + <source>Memory Usage:</source> + <translation type="unfinished"/> + </message> + <message> + <source> MB</source> + <translation type="unfinished"/> + </message> + <message> + <source>Parallelism:</source> + <translation type="unfinished"/> + </message> + <message> + <source> thread</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetGeneral</name> + <message> + <source>Database Meta Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database name:</source> + <translation>ชื่อฐานข้อมูล:</translation> + </message> + <message> + <source>Database description:</source> + <translation>รายละเอียดฐานข้อมูล:</translation> + </message> + <message> + <source>Default username:</source> + <translation>ชื่อผู้ใช้มาตรฐาน:</translation> + </message> + <message> + <source>History Settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Max. history items:</source> + <translation>จำนวนมากสุดของรายการประวัติ:</translation> + </message> + <message> + <source>Max. history size:</source> + <translation>ขนาดมากสุดของรายการประวัติ:</translation> + </message> + <message> + <source> MiB</source> + <translation> MiB</translation> + </message> + <message> + <source>Use recycle bin</source> + <translation>ใช้ถังขยะรีไซเคิล</translation> + </message> +</context> +<context> + <name>DatabaseTabWidget</name> + <message> + <source>Root</source> + <comment>Root group</comment> + <translation>รูต</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>ฐานข้อมูล KeePass 2</translation> + </message> + <message> + <source>All files</source> + <translation>ทุกแฟ้ม</translation> + </message> + <message> + <source>Open database</source> + <translation>เปิดฐานข้อมูล</translation> + </message> + <message> + <source>File not found!</source> + <translation>ไม่พบแฟ้ม!</translation> + </message> + <message> + <source>Unable to open the database.</source> + <translation>ไม่สามารถเปิดฐานข้อมูลดังกล่าว</translation> + </message> + <message> + <source>File opened in read only mode.</source> + <translation>เปิดแฟ้มแล้วในแบบอ่านอย่างเดียว</translation> + </message> + <message> + <source>Open CSV file</source> + <translation>เปิดแฟ้ม CSV</translation> + </message> + <message> + <source>CSV file</source> + <translation>แฟ้ม CSV</translation> + </message> + <message> + <source>All files (*)</source> + <translation>ทุกแฟ้ม ()</translation> + </message> + <message> + <source>Merge database</source> + <translation>ผสานฐานข้อมูล</translation> + </message> + <message> + <source>Open KeePass 1 database</source> + <translation>เปิดฐานข้อมูล KeePass 1</translation> + </message> + <message> + <source>KeePass 1 database</source> + <translation>ฐานข้อมูล KeePass 1</translation> + </message> + <message> + <source>Close?</source> + <translation>ปิด?</translation> + </message> + <message> + <source>"%1" is in edit mode. +Discard changes and close anyway?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Save changes?</source> + <translation>บันทึกความเปลี่ยนแปลง?</translation> + </message> + <message> + <source>"%1" was modified. +Save changes?</source> + <translation>"%1" ถูกแก้ไข +บันทึกการเปลี่ยนแปลง?</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>การเขียนฐานข้อมูลล้มเหลว</translation> + </message> + <message> + <source>Passwords</source> + <translation>รหัสผ่าน</translation> + </message> + <message> + <source>Save database as</source> + <translation>บันทึกฐานข้อมูลเป็น</translation> + </message> + <message> + <source>Export database to CSV file</source> + <translation>ส่งออกฐานข้อมูลเป็นแฟ้ม CSV</translation> + </message> + <message> + <source>Writing the CSV file failed.</source> + <translation>การเขียนแฟ้ม CSV ล้มเหลว</translation> + </message> + <message> + <source>New database</source> + <translation>ฐานข้อมูลใหม่</translation> + </message> + <message> + <source>locked</source> + <translation>ถูกล็อก</translation> + </message> + <message> + <source>Lock database</source> + <translation>ล็อกฐานข้อมูล</translation> + </message> + <message> + <source>Can't lock the database as you are currently editing it. +Please press cancel to finish your changes or discard them.</source> + <translation type="unfinished"/> + </message> + <message> + <source>This database has been modified. +Do you want to save the database before locking it? +Otherwise your changes are lost.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseWidget</name> + <message> + <source>Searching...</source> + <translation>ค้นหา...</translation> + </message> + <message> + <source>Change master key</source> + <translation>เปลี่ยนกุญแจมาสเตอร์</translation> + </message> + <message> + <source>Delete entry?</source> + <translation>ลบรายการ?</translation> + </message> + <message> + <source>Do you really want to delete the entry "%1" for good?</source> + <translation>คุณต้องการจะลบรายการ "%1" ให้หายไปตลอดกาลจริงๆ?</translation> + </message> + <message> + <source>Delete entries?</source> + <translation>ลบรายการ?</translation> + </message> + <message> + <source>Do you really want to delete %1 entries for good?</source> + <translation>คุณต้องการจะลบรายการ %1 รายการให้หายไปตลอดกาลจริงๆ?</translation> + </message> + <message> + <source>Move entry to recycle bin?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to move entry "%1" to the recycle bin?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Move entries to recycle bin?</source> + <translation>ย้ายรายการไปถังขยะ?</translation> + </message> + <message numerus="yes"> + <source>Do you really want to move %n entry(s) to the recycle bin?</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <source>Execute command?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation type="unfinished"/> + </message> + <message> + <source>Remember my choice</source> + <translation>จำที่ฉันเลือก</translation> + </message> + <message> + <source>Delete group?</source> + <translation>ลบกลุ่ม?</translation> + </message> + <message> + <source>Do you really want to delete the group "%1" for good?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>ไม่สามารถคำนวญกุญแมาสเตอร์ได้</translation> + </message> + <message> + <source>No current database.</source> + <translation>ไม่มีฐานข้อมูลขณะนี้</translation> + </message> + <message> + <source>No source database, nothing to do.</source> + <translation>ไม่มีฐานข้อมูลต้นทาง ไม่มีงานให้ทำ</translation> + </message> + <message> + <source>Search Results (%1)</source> + <translation>ผลลัพธ์การค้นหา (%1)</translation> + </message> + <message> + <source>No Results</source> + <translation>ไม่มีผลลัพธ์</translation> + </message> + <message> + <source>File has changed</source> + <translation type="unfinished"/> + </message> + <message> + <source>The database file has changed. Do you want to load the changes?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Merge Request</source> + <translation>ผสานคำร้อง</translation> + </message> + <message> + <source>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Could not open the new database file while attempting to autoreload this database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Empty recycle bin?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Are you sure you want to permanently delete everything from your recycle bin?</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DetailsWidget</name> + <message> + <source>Generate TOTP Token</source> + <translation type="unfinished"/> + </message> + <message> + <source>Close</source> + <translation>ปิด</translation> + </message> + <message> + <source>General</source> + <translation>ทั่วไป</translation> + </message> + <message> + <source>Password</source> + <translation>รหัสผ่าน</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Expiration</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username</source> + <translation>ชื่อผู้ใช้</translation> + </message> + <message> + <source>Autotype</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searching</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attributes</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation>แฟ้มแนบ</translation> + </message> + <message> + <source>Notes</source> + <translation>บันทึก</translation> + </message> + <message> + <source>Window</source> + <translation>หน้าต่าง</translation> + </message> + <message> + <source>Sequence</source> + <translation>ลำดับ</translation> + </message> + <message> + <source>Search</source> + <translation>ค้นหา</translation> + </message> + <message> + <source>Clear</source> + <translation>ล้าง</translation> + </message> + <message> + <source>Never</source> + <translation type="unfinished"/> + </message> + <message> + <source>[PROTECTED]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Disabled</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enabled</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EditEntryWidget</name> + <message> + <source>Entry</source> + <translation>รายการ</translation> + </message> + <message> + <source>Advanced</source> + <translation>ขั้นสูง</translation> + </message> + <message> + <source>Icon</source> + <translation>ไอคอน</translation> + </message> + <message> + <source>Auto-Type</source> + <translation>Auto-Type</translation> + </message> + <message> + <source>Properties</source> + <translation>คุณสมบัติ</translation> + </message> + <message> + <source>History</source> + <translation>ประวัติ</translation> + </message> + <message> + <source>SSH Agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>(encrypted)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>File too large to be a private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry history</source> + <translation>ประวัติรายการ</translation> + </message> + <message> + <source>Add entry</source> + <translation>เพิ่มรายการ</translation> + </message> + <message> + <source>Edit entry</source> + <translation>แก้ไขรายการ</translation> + </message> + <message> + <source>Different passwords supplied.</source> + <translation>รหัสผ่านที่ให้มาไม่ตรงกัน</translation> + </message> + <message> + <source>New attribute</source> + <translation type="unfinished"/> + </message> + <message> + <source>Confirm Remove</source> + <translation>ยืนยันการนำออก</translation> + </message> + <message> + <source>Are you sure you want to remove this attribute?</source> + <translation type="unfinished"/> + </message> + <message> + <source>[PROTECTED]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Press reveal to view or edit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Tomorrow</source> + <translation>พรุ่งนี้</translation> + </message> + <message numerus="yes"> + <source>%n week(s)</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source>%n month(s)</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <source>1 year</source> + <translation>1 ปี</translation> + </message> +</context> +<context> + <name>EditEntryWidgetAdvanced</name> + <message> + <source>Additional attributes</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add</source> + <translation>เพิ่ม</translation> + </message> + <message> + <source>Remove</source> + <translation>นำออก</translation> + </message> + <message> + <source>Edit Name</source> + <translation> แก้ไขชื่อ</translation> + </message> + <message> + <source>Protect</source> + <translation>ป้องกัน</translation> + </message> + <message> + <source>Reveal</source> + <translation>เปิดเผย</translation> + </message> + <message> + <source>Attachments</source> + <translation>แฟ้มแนบ</translation> + </message> +</context> +<context> + <name>EditEntryWidgetAutoType</name> + <message> + <source>Enable Auto-Type for this entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>Inherit default Auto-Type sequence from the &group</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Use custom Auto-Type sequence:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Window Associations</source> + <translation type="unfinished"/> + </message> + <message> + <source>+</source> + <translation>+</translation> + </message> + <message> + <source>-</source> + <translation>-</translation> + </message> + <message> + <source>Window title:</source> + <translation>หัวเรื่องของหน้าต่าง:</translation> + </message> + <message> + <source>Use default se&quence</source> + <translation type="unfinished"/> + </message> + <message> + <source>Set custo&m sequence:</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EditEntryWidgetHistory</name> + <message> + <source>Show</source> + <translation>แสดง</translation> + </message> + <message> + <source>Restore</source> + <translation>เรียกคืน</translation> + </message> + <message> + <source>Delete</source> + <translation>ลบ</translation> + </message> + <message> + <source>Delete all</source> + <translation>ลบทั้งหมด</translation> + </message> +</context> +<context> + <name>EditEntryWidgetMain</name> + <message> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <source>Password:</source> + <translation>รหัสผ่าน:</translation> + </message> + <message> + <source>Repeat:</source> + <translation>ทำซ้ำ:</translation> + </message> + <message> + <source>Title:</source> + <translation>หัวเรื่อง:</translation> + </message> + <message> + <source>Notes</source> + <translation>บันทึก</translation> + </message> + <message> + <source>Presets</source> + <translation>ค่าปรับแต่งสำเร็จรูป</translation> + </message> + <message> + <source>Toggle the checkbox to reveal the notes section.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username:</source> + <translation>ชื่อผู้ใช้:</translation> + </message> + <message> + <source>Expires</source> + <translation>หมดอายุ</translation> + </message> +</context> +<context> + <name>EditEntryWidgetSSHAgent</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent after</source> + <translation type="unfinished"/> + </message> + <message> + <source> seconds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fingerprint</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent when database is closed/locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add key to agent when database is opened/unlocked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Comment</source> + <translation type="unfinished"/> + </message> + <message> + <source>Decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy to clipboard</source> + <translation>คัดลอกไปยังคลิปบอร์ด:</translation> + </message> + <message> + <source>Private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>External file</source> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Attachment</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add to agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove from agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Require user confirmation when this key is used</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EditGroupWidget</name> + <message> + <source>Group</source> + <translation>กลุ่ม</translation> + </message> + <message> + <source>Icon</source> + <translation>ไอคอน</translation> + </message> + <message> + <source>Properties</source> + <translation>คุณสมบัติ</translation> + </message> + <message> + <source>Add group</source> + <translation>เพิ่มกลุ่ม</translation> + </message> + <message> + <source>Edit group</source> + <translation>แก้ไขกลุ่ม</translation> + </message> + <message> + <source>Enable</source> + <translation>เปิดใช้</translation> + </message> + <message> + <source>Disable</source> + <translation>ปิดใช้</translation> + </message> + <message> + <source>Inherit from parent group (%1)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EditGroupWidgetMain</name> + <message> + <source>Name</source> + <translation>ชื่อ</translation> + </message> + <message> + <source>Notes</source> + <translation>บันทึก</translation> + </message> + <message> + <source>Expires</source> + <translation>หมดอายุ</translation> + </message> + <message> + <source>Search</source> + <translation>ค้นหา</translation> + </message> + <message> + <source>Auto-Type</source> + <translation>Auto-Type</translation> + </message> + <message> + <source>&Use default Auto-Type sequence of parent group</source> + <translation type="unfinished"/> + </message> + <message> + <source>Set default Auto-Type se&quence</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EditWidgetIcons</name> + <message> + <source>&Use default icon</source> + <translation>ใช้ไอคอนมาตรฐาน (&U)</translation> + </message> + <message> + <source>Use custo&m icon</source> + <translation>ใช้ไอคอนที่กำหนดเอง (&M)</translation> + </message> + <message> + <source>Add custom icon</source> + <translation>เพิ่มไอคอนที่กำหนดเอง</translation> + </message> + <message> + <source>Delete custom icon</source> + <translation>ลบไอคอนที่กำหนดเอง</translation> + </message> + <message> + <source>Download favicon</source> + <translation>ดาวน์โหลด favicon</translation> + </message> + <message> + <source>Unable to fetch favicon.</source> + <translation>ไม่สามารถดึง favicon ได้</translation> + </message> + <message> + <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> + <translation type="unfinished"/> + </message> + <message> + <source>Images</source> + <translation>ภาพ</translation> + </message> + <message> + <source>All files</source> + <translation>ทุกแฟ้ม</translation> + </message> + <message> + <source>Select Image</source> + <translation>เลือกภาพ</translation> + </message> + <message> + <source>Can't read icon</source> + <translation>ไม่สามารถอ่านไอคอน</translation> + </message> + <message> + <source>Custom icon already exists</source> + <translation>มีไอคอนที่กำหนดเองอยู่แล้ว</translation> + </message> + <message> + <source>Confirm Delete</source> + <translation>ยืนยันการลบ</translation> + </message> + <message> + <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EditWidgetProperties</name> + <message> + <source>Created:</source> + <translation>สร้าง:</translation> + </message> + <message> + <source>Modified:</source> + <translation>แก้ไข:</translation> + </message> + <message> + <source>Accessed:</source> + <translation>เข้าถึง:</translation> + </message> + <message> + <source>Uuid:</source> + <translation>Uuid:</translation> + </message> +</context> +<context> + <name>Entry</name> + <message> + <source> - Clone</source> + <comment>Suffix added to cloned entries</comment> + <translation> - โคลน</translation> + </message> +</context> +<context> + <name>EntryAttachmentsModel</name> + <message> + <source>Name</source> + <translation>ชื่อ</translation> + </message> + <message> + <source>Size</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EntryAttachmentsWidget</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add</source> + <translation>เพิ่ม</translation> + </message> + <message> + <source>Remove</source> + <translation>นำออก</translation> + </message> + <message> + <source>Open</source> + <translation>เปิด</translation> + </message> + <message> + <source>Save</source> + <translation>บันทึก</translation> + </message> + <message> + <source>Select files</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <source>Are you sure you want to remove %n attachment(s)?</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>ยืนยันการนำออก</translation> + </message> + <message> + <source>Save attachments</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to create directory: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Confirm overwrite</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to save attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachment: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open files: +%1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EntryAttributesModel</name> + <message> + <source>Name</source> + <translation>ชื่อ</translation> + </message> +</context> +<context> + <name>EntryHistoryModel</name> + <message> + <source>Last modified</source> + <translation>ถูกแก้ไขครั้งสุดท้าย</translation> + </message> + <message> + <source>Title</source> + <translation>หัวเรื่อง</translation> + </message> + <message> + <source>Username</source> + <translation>ชื่อผู้ใช้</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> +</context> +<context> + <name>EntryModel</name> + <message> + <source>Ref: </source> + <comment>Reference abbreviation</comment> + <translation>อ้างอิง:</translation> + </message> + <message> + <source>Group</source> + <translation>กลุ่ม</translation> + </message> + <message> + <source>Title</source> + <translation>หัวเรื่อง</translation> + </message> + <message> + <source>Username</source> + <translation>ชื่อผู้ใช้</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> +</context> +<context> + <name>Group</name> + <message> + <source>Recycle Bin</source> + <translation>ถังขยะ</translation> + </message> +</context> +<context> + <name>HostInstaller</name> + <message> + <source>KeePassXC: Cannot save file!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot save the native messaging script file.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>HttpPasswordGeneratorWidget</name> + <message> + <source>Length:</source> + <translation>ความยาว:</translation> + </message> + <message> + <source>Character Types</source> + <translation>ชนิดอักขระ</translation> + </message> + <message> + <source>Upper Case Letters</source> + <translation>อักษรตัวพิมพ์ใหญ่</translation> + </message> + <message> + <source>A-Z</source> + <translation>A-Z</translation> + </message> + <message> + <source>Lower Case Letters</source> + <translation>อักษรตัวพิมพ์เล็ก</translation> + </message> + <message> + <source>a-z</source> + <translation>a-z</translation> + </message> + <message> + <source>Numbers</source> + <translation>ตัวเลข</translation> + </message> + <message> + <source>0-9</source> + <translation>0-9</translation> + </message> + <message> + <source>Special Characters</source> + <translation>อักขระพิเศษ</translation> + </message> + <message> + <source>/*_& ...</source> + <translation>/*_& ...</translation> + </message> + <message> + <source>Exclude look-alike characters</source> + <translation>ไม่ใช้อักขระที่หน้าตาคล้ายกัน</translation> + </message> + <message> + <source>Ensure that the password contains characters from every group</source> + <translation>ทำให้แน่ใจว่ารหัสผ่านมีอักขระจากทุกกลุ่ม</translation> + </message> +</context> +<context> + <name>KMessageWidget</name> + <message> + <source>&Close</source> + <translation>ปิด (&C)</translation> + </message> + <message> + <source>Close message</source> + <translation>ปิดข้อความ</translation> + </message> +</context> +<context> + <name>Kdbx3Reader</name> + <message> + <source>Unable to calculate master key</source> + <translation>ไม่สามารถคำนวญกุญแมาสเตอร์ได้</translation> + </message> + <message> + <source>Unable to issue challenge-response.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Kdbx3Writer</name> + <message> + <source>Unable to issue challenge-response.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>ไม่สามารถคำนวญกุญแมาสเตอร์ได้</translation> + </message> +</context> +<context> + <name>Kdbx4Reader</name> + <message> + <source>missing database headers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>ไม่สามารถคำนวญกุญแมาสเตอร์ได้</translation> + </message> + <message> + <source>Invalid header checksum size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Header SHA256 mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header data length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open buffer for KDF parameters in header</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported key derivation function (KDF) or invalid parameters</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy header fields found in KDBX4 file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header binary size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass variant map version.</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name data</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value data</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Bool entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry type</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map field type size</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Kdbx4Writer</name> + <message> + <source>Invalid symmetric cipher algorithm.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid symmetric cipher IV size.</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>ไม่สามารถคำนวญกุญแมาสเตอร์ได้</translation> + </message> + <message> + <source>Failed to serialize KDF parameters variant map</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxReader</name> + <message> + <source>Invalid cipher uuid length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid compression flags length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported compression algorithm</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid master seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform rounds size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid start bytes size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid random stream id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner random stream cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>ไม่ใช่ฐานข้อมูล KeePass</translation> + </message> + <message> + <source>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass 2 database version.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxXmlReader</name> + <message> + <source>XML parsing failure: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>No root group</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing icon uuid or data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing custom data key or value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Multiple group elements</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null group uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableAutoType value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableSearching value</source> + <translation type="unfinished"/> + </message> + <message> + <source>No group uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null DeleteObject uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing DeletedObject uuid or time</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null entry uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element in history entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>No entry uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element with different uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decrypt entry string</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate custom attribute found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry string key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate attachment found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry binary key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-type association window or sequence missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid bool value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid date time value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color rgb part</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid uuid value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decompress binary</source> + <extracomment>Translator meant is a binary data inside an entry</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KeePass1OpenWidget</name> + <message> + <source>Import KeePass1 database</source> + <translation>นำเข้าฐานข้อมูล KeePass1</translation> + </message> + <message> + <source>Unable to open the database.</source> + <translation>ไม่สามารถเปิดฐานข้อมูลดังกล่าว</translation> + </message> +</context> +<context> + <name>KeePass1Reader</name> + <message> + <source>Unable to read keyfile.</source> + <translation>ไม่สามารถอ่านแฟ้มกุญแจได้</translation> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>ไม่ใช่ฐานข้อมูล KeePass</translation> + </message> + <message> + <source>Unsupported encryption algorithm.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass database version.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to read encryption IV</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of groups</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid content hash size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of transform rounds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to construct group tree</source> + <translation type="unfinished"/> + </message> + <message> + <source>Root</source> + <translation>รูต</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>ไม่สามารถคำนวญกุญแมาสเตอร์ได้</translation> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key transformation failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read group field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group access time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group level field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing group id or level</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing entry field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read entry field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry uuid field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field type</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Main</name> + <message> + <source>Existing single-instance lock file is invalid. Launching new instance.</source> + <translation type="unfinished"/> + </message> + <message> + <source>The lock file could not be created. Single-instance mode disabled.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Another instance of KeePassXC is already running.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fatal error while testing the cryptographic functions.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC - Error</source> + <translation>KeePassXC - ข้อผิดพลาด</translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <source>&Database</source> + <translation>ฐานข้อมูล (&D)</translation> + </message> + <message> + <source>&Recent databases</source> + <translation>ฐานข้อมูลที่เพิ่งใช้ (&R)</translation> + </message> + <message> + <source>Import</source> + <translation>นำเข้า</translation> + </message> + <message> + <source>&Help</source> + <translation>ช่วยเหลือ (&H)</translation> + </message> + <message> + <source>E&ntries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy att&ribute to clipboard</source> + <translation type="unfinished"/> + </message> + <message> + <source>Time-based one-time password</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Groups</source> + <translation>กลุ่ม (&G)</translation> + </message> + <message> + <source>&Tools</source> + <translation>เครื่องมือ (&T)</translation> + </message> + <message> + <source>&Quit</source> + <translation>ออก (&Q)</translation> + </message> + <message> + <source>&About</source> + <translation>เกี่ยวกับ (&A)</translation> + </message> + <message> + <source>&Open database...</source> + <translation>เปิดฐานข้อมูล (&O)...</translation> + </message> + <message> + <source>&Save database</source> + <translation>บันทึกฐานข้อมูล (&S)</translation> + </message> + <message> + <source>&Close database</source> + <translation>ปิดฐานข้อมูล (&C)</translation> + </message> + <message> + <source>&New database</source> + <translation>ฐานข้อมูลใหม่ (&N)</translation> + </message> + <message> + <source>Merge from KeePassX database</source> + <translation>ผสานจากฐานข้อมูล KeePassX</translation> + </message> + <message> + <source>&Add new entry</source> + <translation>เพิ่มรายการใหม่ (&A)</translation> + </message> + <message> + <source>&View/Edit entry</source> + <translation>ดูและแก้ไขรายการ (&V)</translation> + </message> + <message> + <source>&Delete entry</source> + <translation>ลบรายการ (&D)</translation> + </message> + <message> + <source>&Add new group</source> + <translation>เพิ่มกลุ่มใหม่ (&A)</translation> + </message> + <message> + <source>&Edit group</source> + <translation>แก้ไขกลุ่ม (&E)</translation> + </message> + <message> + <source>&Delete group</source> + <translation>ลบกลุ่ม (&D)</translation> + </message> + <message> + <source>Sa&ve database as...</source> + <translation>บันทึกฐานข้อมูลเป็น (&V)...</translation> + </message> + <message> + <source>Change &master key...</source> + <translation>เปลี่ยนกุญแจมาสเตอร์ (&M)</translation> + </message> + <message> + <source>&Database settings</source> + <translation>การตั้งค่าฐานข้อมูล (&D)</translation> + </message> + <message> + <source>Database settings</source> + <translation>การตั้งค่าฐานข้อมูล</translation> + </message> + <message> + <source>&Clone entry</source> + <translation>โคลนรายการ (&C)</translation> + </message> + <message> + <source>&Find</source> + <translation>ค้นหา (&F)</translation> + </message> + <message> + <source>Copy &username</source> + <translation>คัดลอกชื่อผู้ใช้ (&U)</translation> + </message> + <message> + <source>Copy username to clipboard</source> + <translation>คัดลอกชื่อผู้ใช้ไปคลิปบอร์ด</translation> + </message> + <message> + <source>Cop&y password</source> + <translation>คัดลอกรหัสผ่าน (&Y)</translation> + </message> + <message> + <source>Copy password to clipboard</source> + <translation>คัดลอกรหัสผ่านไปคลิปบอร์ด</translation> + </message> + <message> + <source>&Settings</source> + <translation>การตั้งค่า (&S)</translation> + </message> + <message> + <source>Password Generator</source> + <translation>ตัวสร้างรหัสผ่าน</translation> + </message> + <message> + <source>&Perform Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Open URL</source> + <translation>เปิด URL (&O)</translation> + </message> + <message> + <source>&Lock databases</source> + <translation>ล็อกฐานข้อมูล (&L)</translation> + </message> + <message> + <source>&Title</source> + <translation>หัวเรื่อง (&T)</translation> + </message> + <message> + <source>Copy title to clipboard</source> + <translation type="unfinished"/> + </message> + <message> + <source>&URL</source> + <translation>URL (&U)</translation> + </message> + <message> + <source>Copy URL to clipboard</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Notes</source> + <translation>บันทึก (&N)</translation> + </message> + <message> + <source>Copy notes to clipboard</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Export to CSV file...</source> + <translation>ส่งออกไปเป็นแฟ้ม CSV... (&E)</translation> + </message> + <message> + <source>Import KeePass 1 database...</source> + <translation>นำเข้าฐานข้อมูล KeePass1...</translation> + </message> + <message> + <source>Import CSV file...</source> + <translation>นำเข้าแฟ้ม CSV...</translation> + </message> + <message> + <source>Re&pair database...</source> + <translation>ซ่อมฐานข้อมูล... (&P)</translation> + </message> + <message> + <source>Show TOTP</source> + <translation>แสดง TOTP</translation> + </message> + <message> + <source>Set up TOTP...</source> + <translation>ติดตั้ง TOTP...</translation> + </message> + <message> + <source>Copy &TOTP</source> + <translation>คัดลอก &TOTP</translation> + </message> + <message> + <source>E&mpty recycle bin</source> + <translation type="unfinished"/> + </message> + <message> + <source>Clear history</source> + <translation>ล้างประวัติ</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation>มีข้อผิดพลาดในการเข้าถึงแฟ้มตั้งค่า %1</translation> + </message> + <message> + <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> + <translation type="unfinished"/> + </message> + <message> + <source>read-only</source> + <translation>อ่านอย่างเดียว</translation> + </message> + <message> + <source>Settings</source> + <translation>ตั้งค่า</translation> + </message> + <message> + <source>Toggle window</source> + <translation>สลับหน้าต่าง</translation> + </message> + <message> + <source>Quit KeePassXC</source> + <translation>ออกจาก KeePassXC</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>ฐานข้อมูล KeePass 2</translation> + </message> + <message> + <source>All files</source> + <translation>ทุกแฟ้ม</translation> + </message> + <message> + <source>Open database</source> + <translation>เปิดฐานข้อมูล</translation> + </message> + <message> + <source>Save repaired database</source> + <translation>บันทึกฐานข้อมูลที่ซ่อมแล้ว</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>การเขียนฐานข้อมูลล้มเหลว</translation> + </message> + <message> + <source>Please touch the button on your YubiKey!</source> + <translation>กรุณาแตะปุ่มบน YubiKey ของคุณ!</translation> + </message> +</context> +<context> + <name>OpenSSHKey</name> + <message> + <source>Invalid key file, expecting an OpenSSH key</source> + <translation type="unfinished"/> + </message> + <message> + <source>PEM boundary mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>This is not an OpenSSH key, only modern keys are supported</source> + <translation type="unfinished"/> + </message> + <message> + <source>Base64 decoding failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file way too small.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file magic header id invalid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Found zero keys</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to read public key.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Corrupted key file, reading private key failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>No private key payload to decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Trying to run KDF without cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Passphrase is required to decrypt this key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key derivation failed, key file corrupted?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Decryption failed, wrong passphrase?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write public key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write private key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing private key</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>OptionDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"/> + </message> + <message> + <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable KeePassHTTP server</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>ทั่วไป</translation> + </message> + <message> + <source>Sh&ow a notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return only best matching entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Match URL schemes</source> + <translation type="unfinished"/> + </message> + <message> + <source>Sort matching entries by &username</source> + <translation type="unfinished"/> + </message> + <message> + <source>Sort &matching entries by title</source> + <translation type="unfinished"/> + </message> + <message> + <source>R&emove all shared encryption keys from active database</source> + <translation type="unfinished"/> + </message> + <message> + <source>Re&move all stored permissions from entries in active database</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password Generator</source> + <translation>ตัวสร้างรหัสผ่าน</translation> + </message> + <message> + <source>Advanced</source> + <translation>ขั้นสูง</translation> + </message> + <message> + <source>Always allow &access to entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Always allow &updating entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searc&h in all opened databases for matching entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation type="unfinished"/> + </message> + <message> + <source>HTTP Port:</source> + <translation>พอร์ต HTTP:</translation> + </message> + <message> + <source>Default port: 19455</source> + <translation>พอร์ตมาตรฐาน: 19455</translation> + </message> + <message> + <source>KeePassXC will listen to this port on 127.0.0.1</source> + <translation type="unfinished"/> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot bind to privileged ports</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot bind to privileged ports below 1024! +Using default port 19455.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>PasswordGeneratorWidget</name> + <message> + <source>%p%</source> + <translation>%p%</translation> + </message> + <message> + <source>Password:</source> + <translation>รหัสผ่าน:</translation> + </message> + <message> + <source>strength</source> + <comment>Password strength</comment> + <translation>ความแข็งแรง</translation> + </message> + <message> + <source>entropy</source> + <translation>เอนโทรปี</translation> + </message> + <message> + <source>Password</source> + <translation>รหัสผ่าน</translation> + </message> + <message> + <source>Character Types</source> + <translation>ชนิดอักขระ</translation> + </message> + <message> + <source>Upper Case Letters</source> + <translation>อักษรตัวพิมพ์ใหญ่</translation> + </message> + <message> + <source>Lower Case Letters</source> + <translation>อักษรตัวพิมพ์เล็ก</translation> + </message> + <message> + <source>Numbers</source> + <translation>ตัวเลข</translation> + </message> + <message> + <source>Special Characters</source> + <translation>อักขระพิเศษ</translation> + </message> + <message> + <source>Extended ASCII</source> + <translation type="unfinished"/> + </message> + <message> + <source>Exclude look-alike characters</source> + <translation>ไม่ใช้อักขระที่หน้าตาคล้ายกัน</translation> + </message> + <message> + <source>Pick characters from every group</source> + <translation>เลือกใช้ตัวอักขระจากทุกกลุ่ม</translation> + </message> + <message> + <source>&Length:</source> + <translation>ความยาว (&L):</translation> + </message> + <message> + <source>Passphrase</source> + <translation>วลีรหัสผ่าน</translation> + </message> + <message> + <source>Wordlist:</source> + <translation>รายการคำ:</translation> + </message> + <message> + <source>Word Count:</source> + <translation>จำนวนคำ:</translation> + </message> + <message> + <source>Word Separator:</source> + <translation>ตัวแบ่งคำ:</translation> + </message> + <message> + <source>Generate</source> + <translation>สร้าง</translation> + </message> + <message> + <source>Copy</source> + <translation>คัดลอก</translation> + </message> + <message> + <source>Accept</source> + <translation>ตกลง</translation> + </message> + <message> + <source>Close</source> + <translation>ปิด</translation> + </message> + <message> + <source>Apply</source> + <translation>ใช้</translation> + </message> + <message> + <source>Entropy: %1 bit</source> + <translation>เอนโทรปี: %1 บิต</translation> + </message> + <message> + <source>Password Quality: %1</source> + <translation>คุณภาพรหัสผ่าน: %1</translation> + </message> + <message> + <source>Poor</source> + <comment>Password quality</comment> + <translation>แย่</translation> + </message> + <message> + <source>Weak</source> + <comment>Password quality</comment> + <translation>อ่อนแอ</translation> + </message> + <message> + <source>Good</source> + <comment>Password quality</comment> + <translation>ดี</translation> + </message> + <message> + <source>Excellent</source> + <comment>Password quality</comment> + <translation>ดีมาก</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <source>Database not opened</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database hash not available</source> + <translation type="unfinished"/> + </message> + <message> + <source>Client public key not received</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot decrypt message</source> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout or cannot connect to KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>Action cancelled or denied</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC association failed, try again</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key change was not successful</source> + <translation type="unfinished"/> + </message> + <message> + <source>Encryption key is not recognized</source> + <translation type="unfinished"/> + </message> + <message> + <source>No saved databases found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect action</source> + <translation type="unfinished"/> + </message> + <message> + <source>Empty message received</source> + <translation type="unfinished"/> + </message> + <message> + <source>No URL provided</source> + <translation type="unfinished"/> + </message> + <message> + <source>No logins found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown error</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add a new entry to a database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file of the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>path</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>username</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Prompt for the entry's password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a password for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length for the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to add.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy an entry's password to the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to clip.</source> + <comment>clip = copy to clipboard</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout in seconds before clearing the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Edit an entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Title for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>title</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to edit.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Estimate the entropy of a password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password for which to estimate the entropy.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Perform advanced analysis on the password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Extract and print the content of a database.</source> + <translation>สกัดและพิมพ์เนื้อหาของฐานข้อมูล</translation> + </message> + <message> + <source>Path of the database to extract.</source> + <translation>path ของฐานข้อมูลที่จะสกัดเนื้อหา</translation> + </message> + <message> + <source>Insert password to unlock %1: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to load key file %1 : %2</source> + <translation type="unfinished"/> + </message> + <message> + <source>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source> + +Available commands: +</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the command to execute.</source> + <translation>ชื่อของคำสั่งที่จะดำเนินการ</translation> + </message> + <message> + <source>List database entries.</source> + <translation>แจงรายการฐานข้อมูล</translation> + </message> + <message> + <source>Path of the group to list. Default is /</source> + <translation type="unfinished"/> + </message> + <message> + <source>Find entries quickly.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Search term.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Merge two databases.</source> + <translation>ผสานสองฐานข้อมูล</translation> + </message> + <message> + <source>Path of the database to merge into.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database to merge from.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use the same credentials for both database files.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file of the database to merge from.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show an entry's information.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> + <translation type="unfinished"/> + </message> + <message> + <source>attribute</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the entry to show.</source> + <translation>ชื่อของรายการที่จะแสดง</translation> + </message> + <message> + <source>NULL device</source> + <translation>อุปกรณ์ NULL</translation> + </message> + <message> + <source>error reading from device</source> + <translation type="unfinished"/> + </message> + <message> + <source>file empty ! +</source> + <translation>แฟ้มว่างเปล่า! +</translation> + </message> + <message> + <source>malformed string</source> + <translation>รูปแบบสตริงไม่ถูกต้อง</translation> + </message> + <message> + <source>missing closing quote</source> + <translation>ไม่มีเครื่องหมายคำพูดปิด</translation> + </message> + <message> + <source>AES: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Twofish: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>ChaCha20: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Argon2 (KDBX 4 – recommended)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 4)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 3.1)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Group</source> + <translation>กลุ่ม</translation> + </message> + <message> + <source>Title</source> + <translation>หัวเรื่อง</translation> + </message> + <message> + <source>Username</source> + <translation>ชื่อผู้ใช้</translation> + </message> + <message> + <source>Password</source> + <translation>รหัสผ่าน</translation> + </message> + <message> + <source>Notes</source> + <translation>บันทึก</translation> + </message> + <message> + <source>Last Modified</source> + <translation type="unfinished"/> + </message> + <message> + <source>Created</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy Browser Integration</source> + <translation type="unfinished"/> + </message> + <message> + <source>Browser Integration</source> + <translation>การทำงานร่วมกับเบราว์เซอร์</translation> + </message> + <message> + <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source> + <translation type="unfinished"/> + </message> + <message> + <source>Press</source> + <translation type="unfinished"/> + </message> + <message> + <source>Passive</source> + <translation type="unfinished"/> + </message> + <message> + <source>SSH Agent</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QtIOCompressor</name> + <message> + <source>Internal zlib error when compressing: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Error writing to underlying device: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Error opening underlying device: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Error reading data from underlying device: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Internal zlib error when decompressing: </source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QtIOCompressor::open</name> + <message> + <source>The gzip format not supported in this version of zlib.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Internal zlib error: </source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SearchWidget</name> + <message> + <source>Search...</source> + <translation>ค้นหา...</translation> + </message> + <message> + <source>Search</source> + <translation>ค้นหา</translation> + </message> + <message> + <source>Clear</source> + <translation>ล้าง</translation> + </message> + <message> + <source>Case Sensitive</source> + <translation>คำนึงถึงอักษรตัวใหญ่เล็ก</translation> + </message> + <message> + <source>Limit search to selected group</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Service</name> + <message> + <source>KeePassXC: New key association request</source> + <translation type="unfinished"/> + </message> + <message> + <source>You have received an association request for the above key. +If you would like to allow it access to your KeePassXC database +give it a unique name to identify and accept it.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: เขียนทับกุญแจที่มีอยู่เดิม?</translation> + </message> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: ปรับปรุงรายการ</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: ฐานข้อมูลล็อกอยู่!</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: เอากุญแจออกจากฐานข้อมูล</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: ไม่พบกุญแจ</translation> + </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: ไม่มีการตั้งค่าที่ใช้ได้!</translation> + </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Removing stored permissions...</source> + <translation type="unfinished"/> + </message> + <message> + <source>Abort</source> + <translation>หยุด</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: การอนุญาตถูกนำออก</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entries.</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation type="unfinished"/> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SettingsWidget</name> + <message> + <source>Application Settings</source> + <translation>การตั้งค่าแอป</translation> + </message> + <message> + <source>General</source> + <translation>ทั่วไป</translation> + </message> + <message> + <source>Security</source> + <translation>ความมั่นคง</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation>มีข้อผิดพลาดในการเข้าถึงแฟ้มตั้งค่า %1</translation> + </message> +</context> +<context> + <name>SettingsWidgetGeneral</name> + <message> + <source>Basic Settings</source> + <translation>การตั้งค่าพื้นฐาน</translation> + </message> + <message> + <source>Start only a single instance of KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remember last databases</source> + <translation>จำฐานข้อมูลล่าสุด</translation> + </message> + <message> + <source>Remember last key files and security dongles</source> + <translation type="unfinished"/> + </message> + <message> + <source>Load previous databases on startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically save on exit</source> + <translation>บันทึกอัตโนมัติตอนออก</translation> + </message> + <message> + <source>Automatically save after every change</source> + <translation>บันทึกอัตโนมัติทุกครั้งที่มีการเปลี่ยนแปลง</translation> + </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation type="unfinished"/> + </message> + <message> + <source>Minimize when copying to clipboard</source> + <translation>ย่อหน้าต่างเมื่อคัดลอกไปยังคลิปบอร์ด</translation> + </message> + <message> + <source>Minimize window at application startup</source> + <translation>ย่อหน้าต่างลงเล็กสุดตอนเริ่มแอป</translation> + </message> + <message> + <source>Use group icon on entry creation</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide the Details view</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show a system tray icon</source> + <translation>แสดงไอคอนสำหรับ system tray</translation> + </message> + <message> + <source>Hide window to system tray when minimized</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide window to system tray instead of app exit</source> + <translation>ซ่อนหน้าต่างไว้ที่ system tray แทนการออกจากแอป</translation> + </message> + <message> + <source>Dark system tray icon</source> + <translation type="unfinished"/> + </message> + <message> + <source>Language</source> + <translation>ภาษา</translation> + </message> + <message> + <source>Auto-Type</source> + <translation>Auto-Type</translation> + </message> + <message> + <source>Use entry title to match windows for global Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use entry URL to match windows for global Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Always ask before performing Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Global Auto-Type shortcut</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-Type delay</source> + <translation>การหน่วง Auto-Type</translation> + </message> + <message> + <source> ms</source> + <comment>Milliseconds</comment> + <translation>มิลลิวิ</translation> + </message> +</context> +<context> + <name>SettingsWidgetSecurity</name> + <message> + <source>Timeouts</source> + <translation type="unfinished"/> + </message> + <message> + <source>Clear clipboard after</source> + <translation>ล้างคลิปบอร์ดหลัง</translation> + </message> + <message> + <source> sec</source> + <comment>Seconds</comment> + <translation>วิ</translation> + </message> + <message> + <source>Lock databases after inactivity of</source> + <translation>ล็อกฐานข้อมูลหลังไม่มีการใช้งาน</translation> + </message> + <message> + <source>Convenience</source> + <translation>ความสะดวก</translation> + </message> + <message> + <source>Lock databases when session is locked or lid is closed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Lock databases after minimizing the window</source> + <translation>ล็อกฐานข้อมูลหลังย่อหน้าต่างลงเล็กสุด</translation> + </message> + <message> + <source>Don't require password repeat when it is visible</source> + <translation>ไม่ต้องถามรหัสผ่านซ้ำถ้ามองเห็นรหัสผ่านอยู่</translation> + </message> + <message> + <source>Show passwords in cleartext by default</source> + <translation>แสดงรหัสผ่านอย่างเปิดเผยโดยปริยาย</translation> + </message> + <message> + <source>Hide passwords in the preview panel</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide entry notes by default</source> + <translation type="unfinished"/> + </message> + <message> + <source>Privacy</source> + <translation>ความเป็นส่วนตัว</translation> + </message> + <message> + <source>Use Google as fallback for downloading website icons</source> + <translation>ใช้กูเกิลเป็นวิธีสำรองเพื่อดาวน์โหลดไอคอนเว็บไซต์</translation> + </message> +</context> +<context> + <name>SetupTotpDialog</name> + <message> + <source>Setup TOTP</source> + <translation>ติดตั้ง TOTP</translation> + </message> + <message> + <source>Key:</source> + <translation>กุญแจ:</translation> + </message> + <message> + <source>Default RFC 6238 token settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Steam token settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use custom settings</source> + <translation>ใช้การตั้งค่าที่กำหนดเอง</translation> + </message> + <message> + <source>Note: Change these settings only if you know what you are doing.</source> + <translation>หมายเหตุ: เปลี่ยนแปลงการตั้งค่าเหล่านี้ก็ต่อเมื่อคุณรู้ว่าคุณกำลังทำอะไรอยู่</translation> + </message> + <message> + <source>Time step:</source> + <translation>ขั้นเวลา:</translation> + </message> + <message> + <source>8 digits</source> + <translation>8 หลัก</translation> + </message> + <message> + <source>6 digits</source> + <translation>6 หลัก</translation> + </message> + <message> + <source>Code size:</source> + <translation>ขนาดรหัส:</translation> + </message> + <message> + <source> sec</source> + <comment>Seconds</comment> + <translation>วิ</translation> + </message> +</context> +<context> + <name>TotpDialog</name> + <message> + <source>Timed Password</source> + <translation>รหัสผ่านกำหนดเวลา</translation> + </message> + <message> + <source>000000</source> + <translation>000000</translation> + </message> + <message> + <source>Copy</source> + <translation>คัดลอก</translation> + </message> + <message> + <source>Expires in</source> + <translation>หมดอายุใน</translation> + </message> + <message> + <source>seconds</source> + <translation>วินาที</translation> + </message> +</context> +<context> + <name>UnlockDatabaseWidget</name> + <message> + <source>Unlock database</source> + <translation>ปลดล็อกฐานข้อมูล</translation> + </message> +</context> +<context> + <name>WelcomeWidget</name> + <message> + <source>Welcome to KeePassXC</source> + <translation>ยินดีต้อนรับสู่ KeePassXC</translation> + </message> + <message> + <source>Start storing your passwords securely in a KeePassXC database</source> + <translation type="unfinished"/> + </message> + <message> + <source>Create new database</source> + <translation>สร้างฐานข้อมูลใหม่</translation> + </message> + <message> + <source>Open existing database</source> + <translation>เปิดฐานข้อมูลที่มีอยู่</translation> + </message> + <message> + <source>Import from KeePass 1</source> + <translation>นำเข้าจาก KeePass 1</translation> + </message> + <message> + <source>Import from CSV</source> + <translation>นำเข้าจาก CSV</translation> + </message> + <message> + <source>Recent databases</source> + <translation>ฐานข้อมูลที่เพิ่งใช้</translation> + </message> +</context> +<context> + <name>main</name> + <message> + <source>Remove an entry from the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to remove.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation>KeePassXC - แอปจัดการรหัสผ่านข้ามแพลตฟอร์ม</translation> + </message> + <message> + <source>filenames of the password databases to open (*.kdbx)</source> + <translation type="unfinished"/> + </message> + <message> + <source>path to a custom config file</source> + <translation type="unfinished"/> + </message> + <message> + <source>key file of the database</source> + <translation>แฟ้มกุญแจสำหรับฐานข้อมูลดังกล่าว</translation> + </message> + <message> + <source>read password of the database from stdin</source> + <translation type="unfinished"/> + </message> + <message> + <source>Parent window handle</source> + <translation type="unfinished"/> + </message> +</context> +</TS> \ No newline at end of file diff --git a/share/translations/keepassx_tr.ts b/share/translations/keepassx_tr.ts index 4514a4204..7dc4d409f 100644 --- a/share/translations/keepassx_tr.ts +++ b/share/translations/keepassx_tr.ts @@ -9,14 +9,34 @@ <source>About</source> <translation>Hakkında</translation> </message> + <message> + <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> + <translation>Hataları bildir: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> + </message> + <message> + <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>KeePassXC GNU Genel Kamu Lisansı (GPL) sürüm 2 veya (isteğinize göre) sürüm 3 şartları altında dağıtılmıştır.</translation> + </message> + <message> + <source>Project Maintainers:</source> + <translation>Tasarı Bakımcıları:</translation> + </message> <message> <source>Contributors</source> <translation>Katkıcılar</translation> </message> + <message> + <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Katkıları GitHub'da Gör</a></translation> + </message> <message> <source>Debug Info</source> <translation>Hata Ayıklama Bilgisi</translation> </message> + <message> + <source>Include the following information whenever you report a bug:</source> + <translation>Bir hata bildirirken şu bilgileri ekleyin:</translation> + </message> <message> <source>Copy to clipboard</source> <translation>Panoya kopyala</translation> @@ -31,6 +51,10 @@ <source>Revision: %1</source> <translation>Düzeltme: %1</translation> </message> + <message> + <source>Distribution: %1</source> + <translation>Dağıtım: %1</translation> + </message> <message> <source>Libraries:</source> <translation>Kütüphaneler:</translation> @@ -47,33 +71,13 @@ MİB mimarisi: %2 <source>Enabled extensions:</source> <translation>Etkin eklentiler:</translation> </message> - <message> - <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> - <translation>Hataları bildir: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> - </message> - <message> - <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassXC GNU Genel Kamu Lisansı (GPL) sürüm 2 veya (isteğinize göre) sürüm 3 şartları altında dağıtılmıştır.</translation> - </message> - <message> - <source>Project Maintainers:</source> - <translation>Tasarı Bakımcıları:</translation> - </message> - <message> - <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Katkıları GitHub'da Gör</a></translation> - </message> - <message> - <source>Include the following information whenever you report a bug:</source> - <translation>Bir hata bildirirken şu bilgileri ekleyin:</translation> - </message> - <message> - <source>Distribution: %1</source> - <translation type="unfinished"/> - </message> </context> <context> <name>AccessControlDialog</name> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>KeePassXC HTTP Erişim Onayı</translation> + </message> <message> <source>Remember this decision</source> <translation>Bu kararı anımsa</translation> @@ -92,9 +96,12 @@ Please select whether you want to allow access.</source> <translation>%1, şu öge(ler) için parolalara erişim izni istedi. Lütfen erişime izin vermek istediklerinizi seçin.</translation> </message> +</context> +<context> + <name>AgentSettingsWidget</name> <message> - <source>KeePassXC HTTP Confirm Access</source> - <translation>KeePassXC HTTP Erişim Onayı</translation> + <source>Enable SSH Agent (requires restart)</source> + <translation type="unfinished"/> </message> </context> <context> @@ -105,7 +112,27 @@ Lütfen erişime izin vermek istediklerinizi seçin.</translation> </message> <message> <source>Auto-Type - KeePassXC</source> - <translation>Oto-Yaz - KeePassXC</translation> + <translation>Oto-Yazım - KeePassXC</translation> + </message> + <message> + <source>Auto-Type</source> + <translation>Oto-Yazım</translation> + </message> + <message> + <source>The Syntax of your Auto-Type statement is incorrect!</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> + <translation type="unfinished"/> </message> </context> <context> @@ -126,12 +153,289 @@ Lütfen erişime izin vermek istediklerinizi seçin.</translation> <context> <name>AutoTypeSelectDialog</name> <message> - <source>Select entry to Auto-Type:</source> - <translation>Oto-Yazmak için girdi seçiniz:</translation> + <source>Auto-Type - KeePassXC</source> + <translation>Oto-Yazım - KeePassXC</translation> </message> <message> - <source>Auto-Type - KeePassXC</source> - <translation>Oto-Yaz - KeePassXC</translation> + <source>Select entry to Auto-Type:</source> + <translation>Oto-Yazım için girdi seçiniz:</translation> + </message> +</context> +<context> + <name>BrowserAccessControlDialog</name> + <message> + <source>KeePassXC-Browser Confirm Access</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remember this decision</source> + <translation>Bu kararı anımsa</translation> + </message> + <message> + <source>Allow</source> + <translation>İzin ver</translation> + </message> + <message> + <source>Deny</source> + <translation>Reddet</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1, şu öge(ler) için parolalara erişim izni istedi. +Lütfen erişime izin vermek istediklerinizi seçin.</translation> + </message> +</context> +<context> + <name>BrowserOptionDialog</name> + <message> + <source>Dialog</source> + <translation>Diyalog</translation> + </message> + <message> + <source>This is required for accessing your databases with KeePassXC-Browser</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable KeepassXC browser integration</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>Genel</translation> + </message> + <message> + <source>Enable integration for these browsers:</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Google Chrome</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Firefox</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Chromium</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Vivaldi</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show a &notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Eğer kilitliyse veri tabanını açmayı is&te</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Match URL scheme (e.g., https://...)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>Tüm alan adı için tüm girdilerin yerine belirli bir URL için yalnızca en iyi eşleşmeyi döndürür.</translation> + </message> + <message> + <source>&Return only best-matching credentials</source> + <translation type="unfinished"/> + </message> + <message> + <source>Sort &matching credentials by title</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Sort matching credentials by &username</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>&Disconnect all browsers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Forget all remembered &permissions</source> + <translation type="unfinished"/> + </message> + <message> + <source>Advanced</source> + <translation>Gelişmiş</translation> + </message> + <message> + <source>Never &ask before accessing credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Never ask before &updating credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>Yalnızca seçilen veri tabanı istemciyle bağlanmış olmalıdır.</translation> + </message> + <message> + <source>Searc&h in all opened databases for matching credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>Dizge alanlarını kendiliğinden oluşturma ve güncelleme desteklenmiyor.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>"KPH: " ile başlayan gelişmiş dizge alanları &döndür</translation> + </message> + <message> + <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Update &native messaging manifest files at startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Support a proxy application between KeePassXC and browser extension.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &proxy application between KeePassXC and browser extension</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a custom proxy location if you installed a proxy manually.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &custom proxy location</source> + <comment>Meant is the proxy for KeePassXC-Browser</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*.exe);;All Files (*.*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select custom proxy location</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>BrowserService</name> + <message> + <source>KeePassXC: New key association request</source> + <translation>KeePassXC: Yeni anahtar ilişkilendirme isteği</translation> + </message> + <message> + <source>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Save and allow access</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: Var olan anahtarın üstüne yaz?</translation> + </message> + <message> + <source>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: Girdi Güncelle</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: Veri tabanı kilitli!</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>Etkin veri tabanı kilitli! +Lütfen seçilen veri tabanının kilidini kaldırın veya kilitli olmayan birini seçin.</translation> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: Ayarlar kullanılabilir değil!</translation> + </message> + <message> + <source>The active database does not contain a settings entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: Anahtar bulunamadı</translation> + </message> + <message> + <source>No shared encryption keys found in KeePassXC Settings.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: Anahtarlar veri tabanından kaldırıldı</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Removing stored permissions…</source> + <translation type="unfinished"/> + </message> + <message> + <source>Abort</source> + <translation>İptal</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: Silinen yetkiler</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entry(s).</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation>KeePassXC: İzinli girdi bulunamadı!</translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>Etkin veri tabanı izinleri olan girdi barındırmıyor.</translation> </message> </context> <context> @@ -148,6 +452,10 @@ Lütfen erişime izin vermek istediklerinizi seçin.</translation> <source>Repeat password:</source> <translation>Parolayı yinele:</translation> </message> + <message> + <source>&Key file</source> + <translation>&Anahtar dosyası</translation> + </message> <message> <source>Browse</source> <translation>Gözat</translation> @@ -156,6 +464,14 @@ Lütfen erişime izin vermek istediklerinizi seçin.</translation> <source>Create</source> <translation>Oluştur</translation> </message> + <message> + <source>Cha&llenge Response</source> + <translation type="unfinished"/> + </message> + <message> + <source>Refresh</source> + <translation>Yenile</translation> + </message> <message> <source>Key files</source> <translation>Anahtar dosyaları</translation> @@ -176,6 +492,10 @@ Lütfen erişime izin vermek istediklerinizi seçin.</translation> <source>Select a key file</source> <translation>Bir anahtar dosyası seç</translation> </message> + <message> + <source>Empty password</source> + <translation>Boş parola</translation> + </message> <message> <source>Do you really want to use an empty string as password?</source> <translation>Boş bir dizgeyi parola olarak kullanmak istediğinize emin misiniz?</translation> @@ -191,20 +511,15 @@ Lütfen erişime izin vermek istediklerinizi seçin.</translation> %2</translation> </message> <message> - <source>&Key file</source> - <translation>&Anahtar dosyası</translation> - </message> - <message> - <source>Cha&llenge Response</source> + <source>Legacy key file format</source> <translation type="unfinished"/> </message> <message> - <source>Refresh</source> - <translation>Yenile</translation> - </message> - <message> - <source>Empty password</source> - <translation>Boş parola</translation> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -217,6 +532,10 @@ Lütfen erişime izin vermek istediklerinizi seçin.</translation> <source>Clone Options</source> <translation>Klonlama Ayarları</translation> </message> + <message> + <source>Append ' - Clone' to title</source> + <translation>Başlık sonuna ' - Klon' ekle</translation> + </message> <message> <source>Replace username and password with references</source> <translation type="unfinished"/> @@ -225,10 +544,6 @@ Lütfen erişime izin vermek istediklerinizi seçin.</translation> <source>Copy history</source> <translation>Kopyalama Geçmişi</translation> </message> - <message> - <source>Append ' - Clone' to title</source> - <translation>Başlık sonuna ' - Klon' ekle</translation> - </message> </context> <context> <name>CsvImportWidget</name> @@ -270,7 +585,7 @@ Lütfen erişime izin vermek istediklerinizi seçin.</translation> </message> <message> <source>Number of headers line to discard</source> - <translation>Kaldırılacak başlık satırı adedi</translation> + <translation>Vazgeçilecek başlık satırı adedi</translation> </message> <message> <source>Consider '\' an escape character</source> @@ -325,10 +640,6 @@ Lütfen erişime izin vermek istediklerinizi seçin.</translation> </context> <context> <name>CsvImportWizard</name> - <message> - <source>Import CSV file</source> - <translation>CSV dosyası içe aktar</translation> - </message> <message> <source>Error</source> <translation>Hata</translation> @@ -340,17 +651,17 @@ Lütfen erişime izin vermek istediklerinizi seçin.</translation> </context> <context> <name>CsvParserModel</name> - <message> - <source> byte, </source> - <translation>bayt,</translation> + <message numerus="yes"> + <source>%n byte(s), </source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> - <message> - <source> rows, </source> - <translation>satır,</translation> + <message numerus="yes"> + <source>%n row(s), </source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> - <message> - <source> columns</source> - <translation>sütun,</translation> + <message numerus="yes"> + <source>%n column(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> </context> <context> @@ -371,6 +682,14 @@ Lütfen erişime izin vermek istediklerinizi seçin.</translation> <source>Browse</source> <translation>Gözat</translation> </message> + <message> + <source>Refresh</source> + <translation>Yenile</translation> + </message> + <message> + <source>Challenge Response:</source> + <translation type="unfinished"/> + </message> <message> <source>Unable to open the database.</source> <translation>Veri tabanı açılamıyor.</translation> @@ -379,6 +698,21 @@ Lütfen erişime izin vermek istediklerinizi seçin.</translation> <source>Can't open key file</source> <translation>Anahtar dosya açılamıyor</translation> </message> + <message> + <source>Legacy key file format</source> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't show this warning again</source> + <translation type="unfinished"/> + </message> <message> <source>All files</source> <translation>Tüm dosyalar</translation> @@ -391,14 +725,6 @@ Lütfen erişime izin vermek istediklerinizi seçin.</translation> <source>Select key file</source> <translation>Anahtar dosyası seç</translation> </message> - <message> - <source>Refresh</source> - <translation>Yenile</translation> - </message> - <message> - <source>Challenge Response:</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DatabaseRepairWidget</name> @@ -414,14 +740,14 @@ Lütfen erişime izin vermek istediklerinizi seçin.</translation> <source>Can't open key file</source> <translation>Anahtar dosya açılamıyor</translation> </message> - <message> - <source>Database opened fine. Nothing to do.</source> - <translation>Veri tabanı açıldı. Yapılacak bir şey yok.</translation> - </message> <message> <source>Unable to open the database.</source> <translation>Veri tabanı açılamıyor.</translation> </message> + <message> + <source>Database opened fine. Nothing to do.</source> + <translation>Veri tabanı açıldı. Yapılacak bir şey yok.</translation> + </message> <message> <source>Success</source> <translation>Başarılı</translation> @@ -440,40 +766,57 @@ Artık kaydedebilirsiniz.</translation> <context> <name>DatabaseSettingsWidget</name> <message> - <source>Database name:</source> - <translation>Veri tabanı adı:</translation> + <source>General</source> + <translation>Genel</translation> </message> <message> - <source>Database description:</source> - <translation>Veri tabanı ayrıntısı:</translation> - </message> - <message> - <source>Transform rounds:</source> + <source>Encryption</source> <translation type="unfinished"/> </message> <message> - <source>Default username:</source> - <translation>Öntanımlı kullanıcı adı:</translation> + <source>Number of rounds too high</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> </message> <message> - <source> MiB</source> - <translation>MiB</translation> + <source>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</source> + <translation type="unfinished"/> </message> <message> - <source>Benchmark</source> - <translation>Karşılaştırmalı Değerlendirme</translation> + <source>Understood, keep number</source> + <translation type="unfinished"/> </message> <message> - <source>Max. history items:</source> - <translation>Azami geçmiş ögesi:</translation> + <source>Cancel</source> + <translation type="unfinished"/> </message> <message> - <source>Max. history size:</source> - <translation>Azami geçmiş boyutu:</translation> + <source>Number of rounds too low</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> </message> <message> - <source>Use recycle bin</source> - <translation>Geri dönüşüm kutusunu kullan</translation> + <source>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</source> + <translation type="unfinished"/> + </message> + <message> + <source>KDF unchanged</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetEncryption</name> + <message> + <source>Encryption Algorithm:</source> + <translation type="unfinished"/> </message> <message> <source>AES: 256 Bit (default)</source> @@ -484,14 +827,78 @@ Artık kaydedebilirsiniz.</translation> <translation>Twofish: 256 Bit</translation> </message> <message> - <source>Algorithm:</source> - <translation>Algoritma:</translation> + <source>Key Derivation Function:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Transform rounds:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Benchmark 1-second delay</source> + <translation type="unfinished"/> + </message> + <message> + <source>Memory Usage:</source> + <translation type="unfinished"/> + </message> + <message> + <source> MB</source> + <translation type="unfinished"/> + </message> + <message> + <source>Parallelism:</source> + <translation type="unfinished"/> + </message> + <message> + <source> thread</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetGeneral</name> + <message> + <source>Database Meta Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database name:</source> + <translation>Veri tabanı adı:</translation> + </message> + <message> + <source>Database description:</source> + <translation>Veri tabanı ayrıntısı:</translation> + </message> + <message> + <source>Default username:</source> + <translation>Öntanımlı kullanıcı adı:</translation> + </message> + <message> + <source>History Settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Max. history items:</source> + <translation>Azami geçmiş ögesi:</translation> + </message> + <message> + <source>Max. history size:</source> + <translation>Azami geçmiş boyutu:</translation> + </message> + <message> + <source> MiB</source> + <translation>MiB</translation> + </message> + <message> + <source>Use recycle bin</source> + <translation>Geri dönüşüm kutusunu kullan</translation> </message> </context> <context> <name>DatabaseTabWidget</name> <message> <source>Root</source> + <comment>Root group</comment> <translation>Kök</translation> </message> <message> @@ -504,12 +911,36 @@ Artık kaydedebilirsiniz.</translation> </message> <message> <source>Open database</source> - <translation>Veritabanı aç</translation> + <translation>Veri tabanı aç</translation> </message> <message> <source>File not found!</source> <translation>Dosya bulunamadı!</translation> </message> + <message> + <source>Unable to open the database.</source> + <translation>Veri tabanı açılamıyor.</translation> + </message> + <message> + <source>File opened in read only mode.</source> + <translation>Dosya salt okunur kipte açıldı.</translation> + </message> + <message> + <source>Open CSV file</source> + <translation>CSV dosyası aç</translation> + </message> + <message> + <source>CSV file</source> + <translation>CSV dosyası</translation> + </message> + <message> + <source>All files (*)</source> + <translation>Tüm dosyalar (*)</translation> + </message> + <message> + <source>Merge database</source> + <translation>Veri tabanı birleştir</translation> + </message> <message> <source>Open KeePass 1 database</source> <translation>KeePass 1 veri tabanı aç</translation> @@ -518,14 +949,16 @@ Artık kaydedebilirsiniz.</translation> <source>KeePass 1 database</source> <translation>KeePass 1 veri tabanı</translation> </message> - <message> - <source>All files (*)</source> - <translation>Tüm dosyalar (*)</translation> - </message> <message> <source>Close?</source> <translation>Kapat?</translation> </message> + <message> + <source>"%1" is in edit mode. +Discard changes and close anyway?</source> + <translation>"%1", düzenleme kipinde. +Değişikliklerden vazgeç ve her durumda kapat?</translation> + </message> <message> <source>Save changes?</source> <translation>Değişiklikleri kaydet?</translation> @@ -540,10 +973,22 @@ Değişiklikleri kaydet?</translation> <source>Writing the database failed.</source> <translation>Veri tabanına yazma başarısız.</translation> </message> + <message> + <source>Passwords</source> + <translation>Parolalar</translation> + </message> <message> <source>Save database as</source> <translation>Veri tabanını farklı kaydet</translation> </message> + <message> + <source>Export database to CSV file</source> + <translation>Veri tabanını CSV dosyasına dışa aktar</translation> + </message> + <message> + <source>Writing the CSV file failed.</source> + <translation>CSV dosyasına yazma başarısız.</translation> + </message> <message> <source>New database</source> <translation>Yeni veri tabanı</translation> @@ -562,11 +1007,6 @@ Please press cancel to finish your changes or discard them.</source> <translation>Şu anda düzenlediğiniz için veri tabanı kilitlenemez. Lütfen değişikliklerinizi bitirmek için iptale basın veya onlardan vazgeçin.</translation> </message> - <message> - <source>This database has never been saved. -You can save the database or stop locking it.</source> - <translation type="unfinished"/> - </message> <message> <source>This database has been modified. Do you want to save the database before locking it? @@ -575,65 +1015,13 @@ Otherwise your changes are lost.</source> Kilitlemeden önce veri tabanını kaydetmek ister misiniz? Aksi halde değişiklikleriniz kaybolacak.</translation> </message> - <message> - <source>"%1" is in edit mode. -Discard changes and close anyway?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Export database to CSV file</source> - <translation>Veri tabanını CSV dosyasına dışa aktar</translation> - </message> - <message> - <source>CSV file</source> - <translation>CSV dosyası</translation> - </message> - <message> - <source>Writing the CSV file failed.</source> - <translation>CSV dosyasına yazma başarısız.</translation> - </message> - <message> - <source>Unable to open the database.</source> - <translation>Veri tabanı açılamıyor.</translation> - </message> - <message> - <source>Merge database</source> - <translation>Veri tabanı birleştir</translation> - </message> - <message> - <source>The database you are trying to save as is locked by another instance of KeePassXC. -Do you want to save it anyway?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Passwords</source> - <translation>Parolalar</translation> - </message> - <message> - <source>Database already opened</source> - <translation>Veri tabanı zaten açıldı</translation> - </message> - <message> - <source>The database you are trying to open is locked by another instance of KeePassXC. - -Do you want to open it anyway?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Open read-only</source> - <translation>Salt okunur aç</translation> - </message> - <message> - <source>File opened in read only mode.</source> - <translation>Dosya salt okunur kipte açıldı.</translation> - </message> - <message> - <source>Open CSV file</source> - <translation>CSV dosyası aç</translation> - </message> </context> <context> <name>DatabaseWidget</name> + <message> + <source>Searching...</source> + <translation>Aranıyor...</translation> + </message> <message> <source>Change master key</source> <translation>Ana anahtarı değiştir</translation> @@ -644,7 +1032,7 @@ Do you want to open it anyway?</source> </message> <message> <source>Do you really want to delete the entry "%1" for good?</source> - <translation type="unfinished"/> + <translation>"%1" girdisini tümüyle silmek istediğinize emin misiniz?</translation> </message> <message> <source>Delete entries?</source> @@ -652,27 +1040,7 @@ Do you want to open it anyway?</source> </message> <message> <source>Do you really want to delete %1 entries for good?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Move entries to recycle bin?</source> - <translation>Girdileri geri dönüşüm kutusuna taşı?</translation> - </message> - <message numerus="yes"> - <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> - </message> - <message> - <source>Delete group?</source> - <translation>Kümeyi sil?</translation> - </message> - <message> - <source>Do you really want to delete the group "%1" for good?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unable to calculate master key</source> - <translation>Ana anahtar hesaplanamıyor</translation> + <translation>%1 girdiyi tümüyle silmek istediğinize emin misiniz?</translation> </message> <message> <source>Move entry to recycle bin?</source> @@ -683,8 +1051,36 @@ Do you want to open it anyway?</source> <translation>"%1" girdisini geri dönüşüm kutusuna taşımak istediğinize emin misiniz?</translation> </message> <message> - <source>Searching...</source> - <translation>Aranıyor...</translation> + <source>Move entries to recycle bin?</source> + <translation>Girdileri geri dönüşüm kutusuna taşı?</translation> + </message> + <message numerus="yes"> + <source>Do you really want to move %n entry(s) to the recycle bin?</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Execute command?</source> + <translation>Komut çalıştır?</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation>Şu komutu çalıştırmak istediğinize emin misiniz?<br><br>%1<br></translation> + </message> + <message> + <source>Remember my choice</source> + <translation>Seçimimi anımsa</translation> + </message> + <message> + <source>Delete group?</source> + <translation>Kümeyi sil?</translation> + </message> + <message> + <source>Do you really want to delete the group "%1" for good?</source> + <translation>"%1" kümesini tümüyle silmek istediğinize emin misiniz?</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Ana anahtar hesaplanamıyor</translation> </message> <message> <source>No current database.</source> @@ -703,20 +1099,8 @@ Do you want to open it anyway?</source> <translation>Sonuç Yok</translation> </message> <message> - <source>Execute command?</source> - <translation>Komut çalıştır?</translation> - </message> - <message> - <source>Do you really want to execute the following command?<br><br>%1<br></source> - <translation>Şu komutu çalıştırmak istediğinize emin misiniz?<br><br>%1<br></translation> - </message> - <message> - <source>Remember my choice</source> - <translation>Seçimimi anımsa</translation> - </message> - <message> - <source>Autoreload Request</source> - <translation>Kendinden yeniden yükleme isteği</translation> + <source>File has changed</source> + <translation type="unfinished"/> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -727,12 +1111,13 @@ Do you want to open it anyway?</source> <translation>Birleştirme İsteği</translation> </message> <message> - <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> - <translation>Veri tabanı dosyası değiştirildi ve kaydedilmemiş değişiklikleriniz var. Değişikliklerinizi birleştirmek ister misiniz?</translation> + <source>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</source> + <translation type="unfinished"/> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> - <translation type="unfinished"/> + <translation>Bu veri tabanını kendiliğinden yeniden yüklenirken yeni veri tabanı dosyası açılamadı.</translation> </message> <message> <source>Empty recycle bin?</source> @@ -743,6 +1128,89 @@ Do you want to open it anyway?</source> <translation>Geri dönüşüm kutunuzdaki her şeyi kalıcı olarak silmek istediğinize emin misiniz?</translation> </message> </context> +<context> + <name>DetailsWidget</name> + <message> + <source>Generate TOTP Token</source> + <translation type="unfinished"/> + </message> + <message> + <source>Close</source> + <translation>Kapat</translation> + </message> + <message> + <source>General</source> + <translation>Genel</translation> + </message> + <message> + <source>Password</source> + <translation>Parola</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Expiration</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username</source> + <translation>Kullanıcı adı</translation> + </message> + <message> + <source>Autotype</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searching</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attributes</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation>Ekler</translation> + </message> + <message> + <source>Notes</source> + <translation>Notlar</translation> + </message> + <message> + <source>Window</source> + <translation>Pencere</translation> + </message> + <message> + <source>Sequence</source> + <translation>Sıra</translation> + </message> + <message> + <source>Search</source> + <translation>Ara</translation> + </message> + <message> + <source>Clear</source> + <translation>Temizle</translation> + </message> + <message> + <source>Never</source> + <translation type="unfinished"/> + </message> + <message> + <source>[PROTECTED]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Disabled</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enabled</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EditEntryWidget</name> <message> @@ -759,7 +1227,7 @@ Do you want to open it anyway?</source> </message> <message> <source>Auto-Type</source> - <translation>Oto-Yazma</translation> + <translation>Oto-Yazım</translation> </message> <message> <source>Properties</source> @@ -769,6 +1237,30 @@ Do you want to open it anyway?</source> <source>History</source> <translation>Geçmiş</translation> </message> + <message> + <source>SSH Agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>(encrypted)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>File too large to be a private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open private key</source> + <translation type="unfinished"/> + </message> <message> <source>Entry history</source> <translation>Girdi geçmişi</translation> @@ -779,7 +1271,7 @@ Do you want to open it anyway?</source> </message> <message> <source>Edit entry</source> - <translation>Girdi düzenle</translation> + <translation>Girdiyi düzenle</translation> </message> <message> <source>Different passwords supplied.</source> @@ -789,40 +1281,6 @@ Do you want to open it anyway?</source> <source>New attribute</source> <translation>Yeni öznitelik</translation> </message> - <message> - <source>Select file</source> - <translation>Dosya seç</translation> - </message> - <message> - <source>Unable to open file</source> - <translation>Dosya açılamıyor</translation> - </message> - <message> - <source>Save attachment</source> - <translation>Eki kaydet</translation> - </message> - <message> - <source>Unable to save the attachment: -</source> - <translation>Ek kaydedilemiyor: -</translation> - </message> - <message> - <source>Tomorrow</source> - <translation>Yarın</translation> - </message> - <message numerus="yes"> - <source>%n week(s)</source> - <translation><numerusform>%n hafta</numerusform><numerusform>%n hafta</numerusform></translation> - </message> - <message numerus="yes"> - <source>%n month(s)</source> - <translation><numerusform>%n ay</numerusform><numerusform>%n ay</numerusform></translation> - </message> - <message> - <source>1 year</source> - <translation>1 yıl</translation> - </message> <message> <source>Confirm Remove</source> <translation>Kaldırmayı Onayla</translation> @@ -832,12 +1290,28 @@ Do you want to open it anyway?</source> <translation>Bu özniteliği silmek istediğinizden emin misiniz?</translation> </message> <message> - <source>[PROTECTED] Press reveal to view or edit</source> - <translation>[KORUMALI] Görmek veya düzenlemek için göstere bas</translation> + <source>[PROTECTED]</source> + <translation type="unfinished"/> </message> <message> - <source>Are you sure you want to remove this attachment?</source> - <translation>Bu eki kaldırmak istediğinizden emin misiniz?</translation> + <source>Press reveal to view or edit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Tomorrow</source> + <translation>Yarın</translation> + </message> + <message numerus="yes"> + <source>%n week(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source>%n month(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>1 year</source> + <translation>1 yıl</translation> </message> </context> <context> @@ -854,18 +1328,6 @@ Do you want to open it anyway?</source> <source>Remove</source> <translation>Kaldır</translation> </message> - <message> - <source>Attachments</source> - <translation>Ekler</translation> - </message> - <message> - <source>Save</source> - <translation>Kaydet</translation> - </message> - <message> - <source>Open</source> - <translation>Aç</translation> - </message> <message> <source>Edit Name</source> <translation>Adı Düzenle</translation> @@ -878,12 +1340,28 @@ Do you want to open it anyway?</source> <source>Reveal</source> <translation>Göster</translation> </message> + <message> + <source>Attachments</source> + <translation>Ekler</translation> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> <message> <source>Enable Auto-Type for this entry</source> - <translation type="unfinished"/> + <translation>Bu girdi için Oto-Yazımı etkinleştir</translation> + </message> + <message> + <source>Inherit default Auto-Type sequence from the &group</source> + <translation>Öntanımlı Oto-Yazım dizilişini &kümeden devral</translation> + </message> + <message> + <source>&Use custom Auto-Type sequence:</source> + <translation>Özel Oto-Yazım dizilişi k&ullan:</translation> + </message> + <message> + <source>Window Associations</source> + <translation>Pencere İlişkilendirmeleri</translation> </message> <message> <source>+</source> @@ -897,25 +1375,13 @@ Do you want to open it anyway?</source> <source>Window title:</source> <translation>Pencere başlığı:</translation> </message> - <message> - <source>Inherit default Auto-Type sequence from the &group</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Use custom Auto-Type sequence:</source> - <translation type="unfinished"/> - </message> <message> <source>Use default se&quence</source> - <translation type="unfinished"/> + <translation>Öntanımlı &dizilişi kullan</translation> </message> <message> <source>Set custo&m sequence:</source> - <translation type="unfinished"/> - </message> - <message> - <source>Window Associations</source> - <translation type="unfinished"/> + <translation>Öze&l diziliş belirle:</translation> </message> </context> <context> @@ -926,7 +1392,7 @@ Do you want to open it anyway?</source> </message> <message> <source>Restore</source> - <translation type="unfinished"/> + <translation>Geri yükle</translation> </message> <message> <source>Delete</source> @@ -940,12 +1406,8 @@ Do you want to open it anyway?</source> <context> <name>EditEntryWidgetMain</name> <message> - <source>Title:</source> - <translation>Başlık:</translation> - </message> - <message> - <source>Username:</source> - <translation>Kullanıcı adı:</translation> + <source>URL:</source> + <translation>URL:</translation> </message> <message> <source>Password:</source> @@ -956,20 +1418,104 @@ Do you want to open it anyway?</source> <translation>Yinele:</translation> </message> <message> - <source>URL:</source> - <translation>URL:</translation> + <source>Title:</source> + <translation>Başlık:</translation> </message> <message> - <source>Expires</source> - <translation type="unfinished"/> + <source>Notes</source> + <translation>Notlar</translation> </message> <message> <source>Presets</source> + <translation>Öndeğerler</translation> + </message> + <message> + <source>Toggle the checkbox to reveal the notes section.</source> <translation type="unfinished"/> </message> <message> - <source>Notes:</source> - <translation>Notlar</translation> + <source>Username:</source> + <translation>Kullanıcı adı:</translation> + </message> + <message> + <source>Expires</source> + <translation>Biter</translation> + </message> +</context> +<context> + <name>EditEntryWidgetSSHAgent</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent after</source> + <translation type="unfinished"/> + </message> + <message> + <source> seconds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fingerprint</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent when database is closed/locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add key to agent when database is opened/unlocked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Comment</source> + <translation type="unfinished"/> + </message> + <message> + <source>Decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy to clipboard</source> + <translation>Panoya kopyala</translation> + </message> + <message> + <source>Private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>External file</source> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Attachment</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add to agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove from agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Require user confirmation when this key is used</source> + <translation type="unfinished"/> </message> </context> <context> @@ -992,7 +1538,7 @@ Do you want to open it anyway?</source> </message> <message> <source>Edit group</source> - <translation>Küme düzenle</translation> + <translation>Kümeyi düzenle</translation> </message> <message> <source>Enable</source> @@ -1004,7 +1550,7 @@ Do you want to open it anyway?</source> </message> <message> <source>Inherit from parent group (%1)</source> - <translation type="unfinished"/> + <translation>Üst kümeden devral (%1)</translation> </message> </context> <context> @@ -1019,27 +1565,35 @@ Do you want to open it anyway?</source> </message> <message> <source>Expires</source> - <translation type="unfinished"/> + <translation>Biter</translation> </message> <message> <source>Search</source> - <translation>Arama</translation> + <translation>Ara</translation> </message> <message> <source>Auto-Type</source> - <translation>Oto-Yazma</translation> + <translation>Oto-Yazım</translation> </message> <message> <source>&Use default Auto-Type sequence of parent group</source> - <translation type="unfinished"/> + <translation>Üst kümenin öntanımlı Oto-Yazım dizilişini k&ullan</translation> </message> <message> <source>Set default Auto-Type se&quence</source> - <translation type="unfinished"/> + <translation>Öntanımlı Oto-Yazım &dizilişi belirle</translation> </message> </context> <context> <name>EditWidgetIcons</name> + <message> + <source>&Use default icon</source> + <translation>&Öntanımlı simge kullan</translation> + </message> + <message> + <source>Use custo&m icon</source> + <translation>Öze&l simge kullan</translation> + </message> <message> <source>Add custom icon</source> <translation>Özel simge ekle</translation> @@ -1048,6 +1602,18 @@ Do you want to open it anyway?</source> <source>Delete custom icon</source> <translation>Özel simgeyi sil</translation> </message> + <message> + <source>Download favicon</source> + <translation>Simge indir</translation> + </message> + <message> + <source>Unable to fetch favicon.</source> + <translation>Simge alınamadı.</translation> + </message> + <message> + <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> + <translation>İpucu: Araçlar>Ayarlar>Güvenlik altından Google'ı yedek olarak etkinleştirebilirsiniz</translation> + </message> <message> <source>Images</source> <translation>Resimler</translation> @@ -1060,25 +1626,13 @@ Do you want to open it anyway?</source> <source>Select Image</source> <translation>Resim Seç</translation> </message> - <message> - <source>Download favicon</source> - <translation>Simge indir</translation> - </message> - <message> - <source>Unable to fetch favicon.</source> - <translation>Simge alınamadı.</translation> - </message> <message> <source>Can't read icon</source> <translation>Simge okunamadı</translation> </message> <message> - <source>&Use default icon</source> - <translation>&Öntanımlı simgeyi kullan</translation> - </message> - <message> - <source>Use custo&m icon</source> - <translation>Öze&l simge kullan</translation> + <source>Custom icon already exists</source> + <translation>Özel simge zaten var</translation> </message> <message> <source>Confirm Delete</source> @@ -1088,14 +1642,6 @@ Do you want to open it anyway?</source> <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> <translation>Bu simge %1 girdi tarafından kullanılıyor ve öntanımlı simge tarafından değiştirilecek. Silmek istediğinize emin misiniz?</translation> </message> - <message> - <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation type="unfinished"/> - </message> - <message> - <source>Custom icon already exists</source> - <translation type="unfinished"/> - </message> </context> <context> <name>EditWidgetProperties</name> @@ -1120,9 +1666,93 @@ Do you want to open it anyway?</source> <name>Entry</name> <message> <source> - Clone</source> + <comment>Suffix added to cloned entries</comment> <translation>- Klon</translation> </message> </context> +<context> + <name>EntryAttachmentsModel</name> + <message> + <source>Name</source> + <translation>Ad</translation> + </message> + <message> + <source>Size</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EntryAttachmentsWidget</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add</source> + <translation>Ekle</translation> + </message> + <message> + <source>Remove</source> + <translation>Kaldır</translation> + </message> + <message> + <source>Open</source> + <translation>Aç</translation> + </message> + <message> + <source>Save</source> + <translation>Kaydet</translation> + </message> + <message> + <source>Select files</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <source>Are you sure you want to remove %n attachment(s)?</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>Kaldırmayı Onayla</translation> + </message> + <message> + <source>Save attachments</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to create directory: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Confirm overwrite</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to save attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachment: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open files: +%1</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EntryAttributesModel</name> <message> @@ -1151,6 +1781,11 @@ Do you want to open it anyway?</source> </context> <context> <name>EntryModel</name> + <message> + <source>Ref: </source> + <comment>Reference abbreviation</comment> + <translation>Ref: </translation> + </message> <message> <source>Group</source> <translation>Küme</translation> @@ -1167,11 +1802,6 @@ Do you want to open it anyway?</source> <source>URL</source> <translation>URL</translation> </message> - <message> - <source>Ref: </source> - <comment>Reference abbreviation</comment> - <translation>Ref: </translation> - </message> </context> <context> <name>Group</name> @@ -1180,6 +1810,17 @@ Do you want to open it anyway?</source> <translation>Geri Dönüşüm Kutusu</translation> </message> </context> +<context> + <name>HostInstaller</name> + <message> + <source>KeePassXC: Cannot save file!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot save the native messaging script file.</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>HttpPasswordGeneratorWidget</name> <message> @@ -1208,7 +1849,7 @@ Do you want to open it anyway?</source> </message> <message> <source>Numbers</source> - <translation>Sayılar</translation> + <translation>Rakamlar</translation> </message> <message> <source>0-9</source> @@ -1228,7 +1869,7 @@ Do you want to open it anyway?</source> </message> <message> <source>Ensure that the password contains characters from every group</source> - <translation>Parolanın her kümeden karakter içerdiğine emin olun</translation> + <translation>Parolanın her kümeden karakter içerdiğine emin ol</translation> </message> </context> <context> @@ -1242,6 +1883,361 @@ Do you want to open it anyway?</source> <translation>İletiyi kapat</translation> </message> </context> +<context> + <name>Kdbx3Reader</name> + <message> + <source>Unable to calculate master key</source> + <translation>Ana anahtar hesaplanamıyor</translation> + </message> + <message> + <source>Unable to issue challenge-response.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>Yanlış anahtar veya veri tabanı dosyası bozuk.</translation> + </message> +</context> +<context> + <name>Kdbx3Writer</name> + <message> + <source>Unable to issue challenge-response.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Ana anahtar hesaplanamıyor</translation> + </message> +</context> +<context> + <name>Kdbx4Reader</name> + <message> + <source>missing database headers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Ana anahtar hesaplanamıyor</translation> + </message> + <message> + <source>Invalid header checksum size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Header SHA256 mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header data length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open buffer for KDF parameters in header</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported key derivation function (KDF) or invalid parameters</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy header fields found in KDBX4 file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header binary size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass variant map version.</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name data</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value data</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Bool entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry type</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map field type size</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Kdbx4Writer</name> + <message> + <source>Invalid symmetric cipher algorithm.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid symmetric cipher IV size.</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Ana anahtar hesaplanamıyor</translation> + </message> + <message> + <source>Failed to serialize KDF parameters variant map</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxReader</name> + <message> + <source>Invalid cipher uuid length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid compression flags length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported compression algorithm</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid master seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform rounds size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid start bytes size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid random stream id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner random stream cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>KeePass veri tabanı değil.</translation> + </message> + <message> + <source>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> + <translation>Seçilen dosya eski bir KeePass1 veri tabanıdır (.kdb). + +Veri tabanı > 'KeePass1 veri tabanı içe aktar...'a tıklayarak içe aktarabilirsiniz. +Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veri tabanını eski KeePassX 0.4 sürümüyle açamayacaksınız.</translation> + </message> + <message> + <source>Unsupported KeePass 2 database version.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxXmlReader</name> + <message> + <source>XML parsing failure: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>No root group</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing icon uuid or data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing custom data key or value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Multiple group elements</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null group uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableAutoType value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableSearching value</source> + <translation type="unfinished"/> + </message> + <message> + <source>No group uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null DeleteObject uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing DeletedObject uuid or time</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null entry uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element in history entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>No entry uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element with different uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decrypt entry string</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate custom attribute found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry string key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate attachment found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry binary key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-type association window or sequence missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid bool value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid date time value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color rgb part</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid uuid value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decompress binary</source> + <extracomment>Translator meant is a binary data inside an entry</extracomment> + <translation type="unfinished"/> + </message> +</context> <context> <name>KeePass1OpenWidget</name> <message> @@ -1271,65 +2267,154 @@ Do you want to open it anyway?</source> <source>Unsupported KeePass database version.</source> <translation>Desteklenmeyen KeePass veri tabanı sürümü.</translation> </message> + <message> + <source>Unable to read encryption IV</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of groups</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid content hash size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of transform rounds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to construct group tree</source> + <translation type="unfinished"/> + </message> <message> <source>Root</source> <translation>Kök</translation> </message> - <message> - <source>Unable to calculate master key</source> - <translation>Ana anahtar hesaplanamaz</translation> - </message> - <message> - <source>Wrong key or database file is corrupt.</source> - <translation>Yanlış anahtar veya veri tabanı dosyası bozuk.</translation> - </message> -</context> -<context> - <name>KeePass2Reader</name> - <message> - <source>Not a KeePass database.</source> - <translation>KeePass veri tabanı değil.</translation> - </message> - <message> - <source>Unsupported KeePass database version.</source> - <translation>Desteklenmeyen KeePass veri tabanı sürümü.</translation> - </message> - <message> - <source>Wrong key or database file is corrupt.</source> - <translation>Yanlış anahtar veya veri tabanı dosyası bozuk.</translation> - </message> - <message> - <source>Unable to calculate master key</source> - <translation>Ana anahtar hesaplanamaz</translation> - </message> - <message> - <source>Unable to issue challenge-response.</source> - <translation type="unfinished"/> - </message> - <message> - <source>The selected file is an old KeePass 1 database (.kdb). - -You can import it by clicking on Database > 'Import KeePass 1 database...'. -This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> - <translation>Seçilen dosya eski bir KeePass1 veri tabanıdır (.kdb). - -Veri tabanı > 'KeePass1 veri tabanı içe aktar...'a tıklayarak içe aktarabilirsiniz. -Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veri tabanını eski KeePassX 0.4 sürümüyle açamayacaksınız.</translation> - </message> -</context> -<context> - <name>KeePass2Writer</name> - <message> - <source>Unable to issue challenge-response.</source> - <translation type="unfinished"/> - </message> <message> <source>Unable to calculate master key</source> <translation>Ana anahtar hesaplanamıyor</translation> </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>Yanlış anahtar veya veri tabanı dosyası bozuk.</translation> + </message> + <message> + <source>Key transformation failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read group field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group access time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group level field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing group id or level</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing entry field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read entry field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry uuid field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field type</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Main</name> + <message> + <source>Existing single-instance lock file is invalid. Launching new instance.</source> + <translation>Var olan tekil oluşum kilit dosyası geçersiz. Yeni oluşum başlatılıyor.</translation> + </message> + <message> + <source>The lock file could not be created. Single-instance mode disabled.</source> + <translation>Kilit dosyası oluşturulamadı. Tekil oluşum kipi devre dışı bırakıldı.</translation> + </message> + <message> + <source>Another instance of KeePassXC is already running.</source> + <translation>Başka bir KeePassXC oluşumu zaten çalışıyor.</translation> + </message> <message> <source>Fatal error while testing the cryptographic functions.</source> <translation>Kriptografik işlevler sınanırken ölümcül hata.</translation> @@ -1338,73 +2423,25 @@ Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veri tabanını eski Ke <source>KeePassXC - Error</source> <translation>KeePassXC - Hata</translation> </message> - <message> - <source>The lock file could not be created. Single-instance mode disabled.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Another instance of KeePassXC is already running.</source> - <translation>Başka bir KeePassXC oluşumu zaten çalışıyor.</translation> - </message> - <message> - <source>Existing single-instance lock file is invalid. Launching new instance.</source> - <translation type="unfinished"/> - </message> </context> <context> <name>MainWindow</name> <message> - <source>Open database</source> - <translation>Veritabanı aç</translation> - </message> - <message> - <source>Database settings</source> - <translation>Veri tabnı ayarları</translation> - </message> - <message> - <source>Copy username to clipboard</source> - <translation>Kullanıcı adını panoya kopyala</translation> - </message> - <message> - <source>Copy password to clipboard</source> - <translation>Parolayı panoya kopyala</translation> - </message> - <message> - <source>Settings</source> - <translation>Ayarlar</translation> - </message> - <message> - <source>Show toolbar</source> - <translation>Araç çubuğunu göster</translation> - </message> - <message> - <source>read-only</source> - <translation>salt okunur</translation> - </message> - <message> - <source>Toggle window</source> - <translation type="unfinished"/> - </message> - <message> - <source>KeePass 2 Database</source> - <translation>KeePass 2 Veri Tabanı</translation> - </message> - <message> - <source>All files</source> - <translation>Tüm dosyalar</translation> - </message> - <message> - <source>Save repaired database</source> - <translation>Onarılan veri tabanını kaydet</translation> - </message> - <message> - <source>Writing the database failed.</source> - <translation>Veri tabanına yazma başarısız.</translation> + <source>&Database</source> + <translation>&Veri tabanı</translation> </message> <message> <source>&Recent databases</source> <translation>&Son veri tabanları</translation> </message> + <message> + <source>Import</source> + <translation>İçe aktar</translation> + </message> + <message> + <source>&Help</source> + <translation>&Yardım</translation> + </message> <message> <source>E&ntries</source> <translation>G&irdiler</translation> @@ -1413,13 +2450,17 @@ Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veri tabanını eski Ke <source>Copy att&ribute to clipboard</source> <translation>Öznite&liği panoya kopyala</translation> </message> + <message> + <source>Time-based one-time password</source> + <translation type="unfinished"/> + </message> <message> <source>&Groups</source> <translation>&Kümeler</translation> </message> <message> - <source>&View</source> - <translation type="unfinished"/> + <source>&Tools</source> + <translation>&Araçlar</translation> </message> <message> <source>&Quit</source> @@ -1429,6 +2470,10 @@ Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veri tabanını eski Ke <source>&About</source> <translation>&Hakkında</translation> </message> + <message> + <source>&Open database...</source> + <translation>&Veri tabanı aç...</translation> + </message> <message> <source>&Save database</source> <translation>Veri tabanını k&aydet</translation> @@ -1451,11 +2496,11 @@ Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veri tabanını eski Ke </message> <message> <source>&View/Edit entry</source> - <translation type="unfinished"/> + <translation>Girdiyi &göster/düzenle</translation> </message> <message> <source>&Delete entry</source> - <translation type="unfinished"/> + <translation>Girdiyi &sil</translation> </message> <message> <source>&Add new group</source> @@ -1463,31 +2508,31 @@ Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veri tabanını eski Ke </message> <message> <source>&Edit group</source> - <translation type="unfinished"/> + <translation>Kümeyi &düzenle</translation> </message> <message> <source>&Delete group</source> - <translation type="unfinished"/> + <translation>Kümeyi &sil</translation> + </message> + <message> + <source>Sa&ve database as...</source> + <translation>Veri tabanını farklı ka&ydet...</translation> + </message> + <message> + <source>Change &master key...</source> + <translation>Ana anahtarı değiştir...</translation> </message> <message> <source>&Database settings</source> <translation>&Veri tabanı ayarları</translation> </message> + <message> + <source>Database settings</source> + <translation>Veri tabnı ayarları</translation> + </message> <message> <source>&Clone entry</source> - <translation>&Girdi Klonla</translation> - </message> - <message> - <source>Timed one-time password</source> - <translation>Zamanlanmış tek seferlik parola</translation> - </message> - <message> - <source>Copy &TOTP</source> - <translation>&ZTSP'yi kopyala</translation> - </message> - <message> - <source>Show TOTP</source> - <translation>ZTSP'yi göster</translation> + <translation>Girdiyi &klonla</translation> </message> <message> <source>&Find</source> @@ -1497,21 +2542,33 @@ Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veri tabanını eski Ke <source>Copy &username</source> <translation>&Kullanıcı adını kopyala</translation> </message> + <message> + <source>Copy username to clipboard</source> + <translation>Kullanıcı adını panoya kopyala</translation> + </message> <message> <source>Cop&y password</source> <translation>Parolayı kop&yala</translation> </message> + <message> + <source>Copy password to clipboard</source> + <translation>Parolayı panoya kopyala</translation> + </message> <message> <source>&Settings</source> <translation>&Ayarlar</translation> </message> + <message> + <source>Password Generator</source> + <translation>Parola Oluşturucu</translation> + </message> <message> <source>&Perform Auto-Type</source> - <translation type="unfinished"/> + <translation>Oto-Yazım &gerçekleştir</translation> </message> <message> <source>&Open URL</source> - <translation type="unfinished"/> + <translation>URL'yi &aç</translation> </message> <message> <source>&Lock databases</source> @@ -1521,73 +2578,33 @@ Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veri tabanını eski Ke <source>&Title</source> <translation>&Başlık</translation> </message> + <message> + <source>Copy title to clipboard</source> + <translation type="unfinished"/> + </message> <message> <source>&URL</source> <translation>&URL</translation> </message> + <message> + <source>Copy URL to clipboard</source> + <translation type="unfinished"/> + </message> <message> <source>&Notes</source> <translation>&Notlar</translation> </message> <message> - <source>Password Generator</source> - <translation>Parola Oluşturucu</translation> - </message> - <message> - <source>Clear history</source> - <translation>Geçmişi temizle</translation> - </message> - <message> - <source>&Database</source> - <translation>&Veri tabanı</translation> - </message> - <message> - <source>Import</source> - <translation>İçe aktar</translation> - </message> - <message> - <source>&Tools</source> - <translation>&Araçlar</translation> - </message> - <message> - <source>Empty recycle bin</source> + <source>Copy notes to clipboard</source> <translation type="unfinished"/> </message> - <message> - <source>Access error for config file %1</source> - <translation>%1 yapılandırma dosyası için erişim hatası</translation> - </message> - <message> - <source>Quit KeePassXC</source> - <translation>KeePassXC'den Çık</translation> - </message> - <message> - <source>Please touch the button on your YubiKey!</source> - <translation>Lütfen YubiKey'inizdeki düğmeye dokunun!</translation> - </message> - <message> - <source>&Help</source> - <translation>&Yardım</translation> - </message> - <message> - <source>&Open database...</source> - <translation>&Veritabanı aç...</translation> - </message> - <message> - <source>Sa&ve database as...</source> - <translation>Veribanını kaydet...</translation> - </message> - <message> - <source>Change &master key...</source> - <translation>Ana anahtarı değiştir...</translation> - </message> <message> <source>&Export to CSV file...</source> <translation>&CSV dosyasına aktar...</translation> </message> <message> <source>Import KeePass 1 database...</source> - <translation>KeePass 1 veritabanını içe aktar</translation> + <translation>KeePass 1 veri tabanını içe aktar</translation> </message> <message> <source>Import CSV file...</source> @@ -1595,12 +2612,171 @@ Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veri tabanını eski Ke </message> <message> <source>Re&pair database...</source> - <translation>Veritabanını onar...</translation> + <translation>Veri tabanını onar...</translation> + </message> + <message> + <source>Show TOTP</source> + <translation>ZTSP'yi göster</translation> </message> <message> <source>Set up TOTP...</source> <translation>TOTP kurulumu yap...</translation> </message> + <message> + <source>Copy &TOTP</source> + <translation>&ZTSP'yi kopyala</translation> + </message> + <message> + <source>E&mpty recycle bin</source> + <translation type="unfinished"/> + </message> + <message> + <source>Clear history</source> + <translation>Geçmişi temizle</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation>%1 yapılandırma dosyası için erişim hatası</translation> + </message> + <message> + <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> + <translation type="unfinished"/> + </message> + <message> + <source>read-only</source> + <translation>salt okunur</translation> + </message> + <message> + <source>Settings</source> + <translation>Ayarlar</translation> + </message> + <message> + <source>Toggle window</source> + <translation type="unfinished"/> + </message> + <message> + <source>Quit KeePassXC</source> + <translation>KeePassXC'den Çık</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>KeePass 2 Veri Tabanı</translation> + </message> + <message> + <source>All files</source> + <translation>Tüm dosyalar</translation> + </message> + <message> + <source>Open database</source> + <translation>Veri tabanı aç</translation> + </message> + <message> + <source>Save repaired database</source> + <translation>Onarılan veri tabanını kaydet</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>Veri tabanına yazma başarısız.</translation> + </message> + <message> + <source>Please touch the button on your YubiKey!</source> + <translation>Lütfen YubiKey'inizdeki düğmeye dokunun!</translation> + </message> +</context> +<context> + <name>OpenSSHKey</name> + <message> + <source>Invalid key file, expecting an OpenSSH key</source> + <translation type="unfinished"/> + </message> + <message> + <source>PEM boundary mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>This is not an OpenSSH key, only modern keys are supported</source> + <translation type="unfinished"/> + </message> + <message> + <source>Base64 decoding failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file way too small.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file magic header id invalid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Found zero keys</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to read public key.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Corrupted key file, reading private key failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>No private key payload to decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Trying to run KDF without cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Passphrase is required to decrypt this key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key derivation failed, key file corrupted?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Decryption failed, wrong passphrase?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write public key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write private key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing private key</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OptionDialog</name> @@ -1608,21 +2784,62 @@ Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veri tabanını eski Ke <source>Dialog</source> <translation>Diyalog</translation> </message> + <message> + <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation>Bu, ChromeIPass veya PassIFox'tan veri tabanlarınıza erişirken gereklidir</translation> + </message> + <message> + <source>Enable KeePassHTTP server</source> + <translation>KeePassHTTP sunucusunu etkinleştir</translation> + </message> <message> <source>General</source> <translation>Genel</translation> </message> <message> <source>Sh&ow a notification when credentials are requested</source> - <translation type="unfinished"/> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Kimlik bilgisi istendiğinde bildirim g&öster</translation> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>Tüm alan adı için tüm girdilerin yerine belirli bir URL için yalnızca en iyi eşleşmeyi döndürür.</translation> + </message> + <message> + <source>&Return only best matching entries</source> + <translation>Yalnızca en iyi eşleşen girdileri &döndür</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Eğer kilitliyse veri tabanını açmayı is&te</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> + <translation>Yalnızca aynı şemalı girdiler (http://, https://, ftp://, ...) döndürülür.</translation> + </message> + <message> + <source>&Match URL schemes</source> + <translation>URL şemalarını &eşle</translation> </message> <message> <source>Sort matching entries by &username</source> - <translation type="unfinished"/> + <translation>Eşleşen girdileri &kullanıcı adına göre sırala</translation> + </message> + <message> + <source>Sort &matching entries by title</source> + <translation>&Eşleşen girdileri başlığa göre sırala</translation> + </message> + <message> + <source>R&emove all shared encryption keys from active database</source> + <translation>Paylaşılan tüm anahtarları etkin veri tabanından ka&ldır</translation> </message> <message> <source>Re&move all stored permissions from entries in active database</source> - <translation type="unfinished"/> + <translation>Saklanan tüm izinleri etkin veri tabanındaki girdilerden kal&dır</translation> + </message> + <message> + <source>Password Generator</source> + <translation>Parola Oluşturucu</translation> </message> <message> <source>Advanced</source> @@ -1630,15 +2847,27 @@ Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veri tabanını eski Ke </message> <message> <source>Always allow &access to entries</source> - <translation type="unfinished"/> + <translation>Her zaman girdilere &erişime izin ver</translation> </message> <message> <source>Always allow &updating entries</source> - <translation type="unfinished"/> + <translation>Her zaman girdileri g&üncellemeye izin ver</translation> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>Yalnızca seçilen veri tabanı istemciyle bağlanmış olmalıdır.</translation> </message> <message> <source>Searc&h in all opened databases for matching entries</source> - <translation type="unfinished"/> + <translation>Eşleşen girdiler için tüm açık veri tabanlarını a&ra</translation> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>Dizge alanlarını kendiliğinden oluşturma ve güncelleme desteklenmiyor.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>"KPH: " ile başlayan gelişmiş dizge alanları &döndür</translation> </message> <message> <source>HTTP Port:</source> @@ -1648,18 +2877,18 @@ Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veri tabanını eski Ke <source>Default port: 19455</source> <translation>Öntanımlı bağlantı noktası: 19455</translation> </message> - <message> - <source>Re&quest to unlock the database if it is locked</source> - <translation type="unfinished"/> - </message> - <message> - <source>Sort &matching entries by title</source> - <translation type="unfinished"/> - </message> <message> <source>KeePassXC will listen to this port on 127.0.0.1</source> <translation>KeePassXC, 127.0.0.1 üzerinde bu bağlantı noktasını dinleyecek.</translation> </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> + <translation type="unfinished"/> + </message> <message> <source>Cannot bind to privileged ports</source> <translation type="unfinished"/> @@ -1667,65 +2896,33 @@ Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veri tabanını eski Ke <message> <source>Cannot bind to privileged ports below 1024! Using default port 19455.</source> - <translation type="unfinished"/> - </message> - <message> - <source>R&emove all shared encryption keys from active database</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Return advanced string fields which start with "KPH: "</source> - <translation type="unfinished"/> - </message> - <message> - <source>Automatically creating or updating string fields is not supported.</source> - <translation type="unfinished"/> - </message> - <message> - <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> - <translation type="unfinished"/> - </message> - <message> - <source>Enable KeePassHTTP server</source> - <translation>KeePassHTTP sunucusunu etkinleştir</translation> - </message> - <message> - <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Return only best matching entries</source> - <translation type="unfinished"/> - </message> - <message> - <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Match URL schemes</source> - <translation type="unfinished"/> - </message> - <message> - <source>Password Generator</source> - <translation>Parola Oluşturucu</translation> - </message> - <message> - <source>Only the selected database has to be connected with a client.</source> - <translation type="unfinished"/> - </message> - <message> - <source>The following options can be dangerous! -Change them only if you know what you are doing.</source> - <translation>Aşağıdaki seçenekler tehlikeli olabilir! -Yalnızca ne yaptığınızı biliyorsanız onları değiştirin.</translation> + <translation>1024'ün altındaki ayrıcalıklı bağlantı noktalarına bağlanamaz! +Öntanımlı bağlantı noktası olan 19455 kullanılıyor.</translation> </message> </context> <context> <name>PasswordGeneratorWidget</name> + <message> + <source>%p%</source> + <translation>%%p</translation> + </message> <message> <source>Password:</source> <translation>Parola:</translation> </message> + <message> + <source>strength</source> + <comment>Password strength</comment> + <translation>güç</translation> + </message> + <message> + <source>entropy</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password</source> + <translation>Parola</translation> + </message> <message> <source>Character Types</source> <translation>Karakter Türleri</translation> @@ -1740,87 +2937,31 @@ Yalnızca ne yaptığınızı biliyorsanız onları değiştirin.</translation> </message> <message> <source>Numbers</source> - <translation>Sayılar</translation> + <translation>Rakamlar</translation> </message> <message> <source>Special Characters</source> <translation>Özel Karakterler</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>Genişletilmiş ASCII</translation> + </message> <message> <source>Exclude look-alike characters</source> <translation>Benzer karakterleri dışla</translation> </message> - <message> - <source>Accept</source> - <translation>Onayla</translation> - </message> - <message> - <source>%p%</source> - <translation>%%p</translation> - </message> - <message> - <source>strength</source> - <translation>güç</translation> - </message> - <message> - <source>entropy</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Length:</source> - <translation>&Uzunluk:</translation> - </message> <message> <source>Pick characters from every group</source> <translation>Her kümeden karakter seç</translation> </message> <message> - <source>Generate</source> - <translation>Oluştur</translation> - </message> - <message> - <source>Close</source> - <translation>Kapat</translation> - </message> - <message> - <source>Apply</source> - <translation>Uygula</translation> - </message> - <message> - <source>Entropy: %1 bit</source> - <translation type="unfinished"/> - </message> - <message> - <source>Password Quality: %1</source> - <translation>Parola Niteliği: %1</translation> - </message> - <message> - <source>Poor</source> - <translation>Kötü</translation> - </message> - <message> - <source>Weak</source> - <translation>Zayıf</translation> - </message> - <message> - <source>Good</source> - <translation>İyi</translation> - </message> - <message> - <source>Excellent</source> - <translation>Harika</translation> - </message> - <message> - <source>Password</source> - <translation>Parola</translation> - </message> - <message> - <source>Extended ASCII</source> - <translation>Genişletilmiş ASCII</translation> + <source>&Length:</source> + <translation>&Uzunluk:</translation> </message> <message> <source>Passphrase</source> - <translation type="unfinished"/> + <translation>Parola Öbeği</translation> </message> <message> <source>Wordlist:</source> @@ -1834,13 +2975,300 @@ Yalnızca ne yaptığınızı biliyorsanız onları değiştirin.</translation> <source>Word Separator:</source> <translation>Sözcük Ayırıcı:</translation> </message> + <message> + <source>Generate</source> + <translation>Oluştur</translation> + </message> <message> <source>Copy</source> <translation>Kopyala</translation> </message> + <message> + <source>Accept</source> + <translation>Onayla</translation> + </message> + <message> + <source>Close</source> + <translation>Kapat</translation> + </message> + <message> + <source>Apply</source> + <translation>Uygula</translation> + </message> + <message> + <source>Entropy: %1 bit</source> + <translation>Entropi: %1 bit</translation> + </message> + <message> + <source>Password Quality: %1</source> + <translation>Parola Niteliği: %1</translation> + </message> + <message> + <source>Poor</source> + <comment>Password quality</comment> + <translation>Kötü</translation> + </message> + <message> + <source>Weak</source> + <comment>Password quality</comment> + <translation>Zayıf</translation> + </message> + <message> + <source>Good</source> + <comment>Password quality</comment> + <translation>İyi</translation> + </message> + <message> + <source>Excellent</source> + <comment>Password quality</comment> + <translation>Harika</translation> + </message> </context> <context> <name>QObject</name> + <message> + <source>Database not opened</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database hash not available</source> + <translation type="unfinished"/> + </message> + <message> + <source>Client public key not received</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot decrypt message</source> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout or cannot connect to KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>Action cancelled or denied</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC association failed, try again</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key change was not successful</source> + <translation type="unfinished"/> + </message> + <message> + <source>Encryption key is not recognized</source> + <translation type="unfinished"/> + </message> + <message> + <source>No saved databases found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect action</source> + <translation type="unfinished"/> + </message> + <message> + <source>Empty message received</source> + <translation type="unfinished"/> + </message> + <message> + <source>No URL provided</source> + <translation type="unfinished"/> + </message> + <message> + <source>No logins found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown error</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add a new entry to a database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>Veri tabanının yolu.</translation> + </message> + <message> + <source>Key file of the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>path</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>username</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Prompt for the entry's password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a password for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length for the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to add.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy an entry's password to the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to clip.</source> + <comment>clip = copy to clipboard</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout in seconds before clearing the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Edit an entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Title for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>title</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to edit.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Estimate the entropy of a password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password for which to estimate the entropy.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Perform advanced analysis on the password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Extract and print the content of a database.</source> + <translation>Veri tabanının içeriğini çıkar ve yazdır.</translation> + </message> + <message> + <source>Path of the database to extract.</source> + <translation>Veri tabanının çıkarılacağı yol.</translation> + </message> + <message> + <source>Insert password to unlock %1: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to load key file %1 : %2</source> + <translation type="unfinished"/> + </message> + <message> + <source>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source> + +Available commands: +</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the command to execute.</source> + <translation>Çalıştırılacak komutun adı.</translation> + </message> + <message> + <source>List database entries.</source> + <translation>Veri tabanı girdilerini listele.</translation> + </message> + <message> + <source>Path of the group to list. Default is /</source> + <translation>Listelenecek kümenin yolu. Öntanımlı: /</translation> + </message> + <message> + <source>Find entries quickly.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Search term.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Merge two databases.</source> + <translation>İki veri tabanını birleştir.</translation> + </message> + <message> + <source>Path of the database to merge into.</source> + <translation>Veri tabanının nereye birleştirileceği.</translation> + </message> + <message> + <source>Path of the database to merge from.</source> + <translation>Veri tabanının nereden birleştirileceği.</translation> + </message> + <message> + <source>Use the same credentials for both database files.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file of the database to merge from.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show an entry's information.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> + <translation type="unfinished"/> + </message> + <message> + <source>attribute</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the entry to show.</source> + <translation>Gösterilecek girdinin adı.</translation> + </message> <message> <source>NULL device</source> <translation>NULL aygıtı</translation> @@ -1857,14 +3285,34 @@ Yalnızca ne yaptığınızı biliyorsanız onları değiştirin.</translation> </message> <message> <source>malformed string</source> - <translation type="unfinished"/> + <translation>kusurlu dizge</translation> </message> <message> <source>missing closing quote</source> <translation type="unfinished"/> </message> <message> - <source>INTERNAL - unget lower bound exceeded</source> + <source>AES: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Twofish: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>ChaCha20: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Argon2 (KDBX 4 – recommended)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 4)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 3.1)</source> <translation type="unfinished"/> </message> <message> @@ -1883,18 +3331,26 @@ Yalnızca ne yaptığınızı biliyorsanız onları değiştirin.</translation> <source>Password</source> <translation>Parola</translation> </message> - <message> - <source>URL</source> - <translation>URL</translation> - </message> <message> <source>Notes</source> <translation>Notlar</translation> </message> <message> - <source>Browser Integration</source> + <source>Last Modified</source> <translation type="unfinished"/> </message> + <message> + <source>Created</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy Browser Integration</source> + <translation type="unfinished"/> + </message> + <message> + <source>Browser Integration</source> + <translation>Tarayıcı Tümleşmesi</translation> + </message> <message> <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source> <translation type="unfinished"/> @@ -1907,12 +3363,16 @@ Yalnızca ne yaptığınızı biliyorsanız onları değiştirin.</translation> <source>Passive</source> <translation type="unfinished"/> </message> + <message> + <source>SSH Agent</source> + <translation type="unfinished"/> + </message> </context> <context> <name>QtIOCompressor</name> <message> <source>Internal zlib error when compressing: </source> - <translation type="unfinished"/> + <translation>Sıkıştırılırken iç zlib hatası:</translation> </message> <message> <source>Error writing to underlying device: </source> @@ -1928,14 +3388,14 @@ Yalnızca ne yaptığınızı biliyorsanız onları değiştirin.</translation> </message> <message> <source>Internal zlib error when decompressing: </source> - <translation type="unfinished"/> + <translation>Sıkıştırma açılırken iç zlib hatası:</translation> </message> </context> <context> <name>QtIOCompressor::open</name> <message> <source>The gzip format not supported in this version of zlib.</source> - <translation type="unfinished"/> + <translation>gzip biçimi zlib'in bu sürümünde desteklenmiyor.</translation> </message> <message> <source>Internal zlib error: </source> @@ -1945,8 +3405,8 @@ Yalnızca ne yaptığınızı biliyorsanız onları değiştirin.</translation> <context> <name>SearchWidget</name> <message> - <source>Case Sensitive</source> - <translation>Büyük Küçük Harfe Duyarlı</translation> + <source>Search...</source> + <translation>Ara...</translation> </message> <message> <source>Search</source> @@ -1957,99 +3417,103 @@ Yalnızca ne yaptığınızı biliyorsanız onları değiştirin.</translation> <translation>Temizle</translation> </message> <message> - <source>Search...</source> - <translation>Ara...</translation> + <source>Case Sensitive</source> + <translation>Büyük Küçük Harfe Duyarlı</translation> </message> <message> <source>Limit search to selected group</source> - <translation type="unfinished"/> + <translation>Aramayı seçilen kümeye sınırla</translation> </message> </context> <context> <name>Service</name> - <message> - <source>A shared encryption-key with the name "%1" already exists. -Do you want to overwrite it?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Do you want to update the information in %1 - %2?</source> - <translation type="unfinished"/> - </message> - <message> - <source>The active database is locked! -Please unlock the selected database or choose another one which is unlocked.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Successfully removed %1 encryption-%2 from KeePassX/Http Settings.</source> - <translation type="unfinished"/> - </message> - <message> - <source>No shared encryption-keys found in KeePassHttp Settings.</source> - <translation type="unfinished"/> - </message> - <message> - <source>The active database does not contain an entry of KeePassHttp Settings.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Removing stored permissions...</source> - <translation type="unfinished"/> - </message> - <message> - <source>Abort</source> - <translation>İptal</translation> - </message> - <message> - <source>Successfully removed permissions from %1 %2.</source> - <translation type="unfinished"/> - </message> - <message> - <source>The active database does not contain an entry with permissions.</source> - <translation type="unfinished"/> - </message> <message> <source>KeePassXC: New key association request</source> - <translation type="unfinished"/> + <translation>KeePassXC: Yeni anahtar ilişkilendirme isteği</translation> </message> <message> <source>You have received an association request for the above key. If you would like to allow it access to your KeePassXC database give it a unique name to identify and accept it.</source> - <translation type="unfinished"/> + <translation>Yukarıdaki anahtar için ilişkilendirme isteği aldınız. +Eğer KeePassXC veri tabanınıza erişmesine izin vermek isterseniz +tanımlamak için ona eşsiz bir ad verin ve kabul edin.</translation> </message> <message> <source>KeePassXC: Overwrite existing key?</source> <translation>KeePassXC: Var olan anahtarın üstüne yaz?</translation> </message> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>"%1" adlı bir paylaşılan şifreleme anahtarı zaten var. +Üzerine yazmak ister misiniz?</translation> + </message> <message> <source>KeePassXC: Update Entry</source> <translation>KeePassXC: Girdi Güncelle</translation> </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation type="unfinished"/> + </message> <message> <source>KeePassXC: Database locked!</source> - <translation>KeePassXC: Veritabanı kitli!</translation> + <translation>KeePassXC: Veri tabanı kilitli!</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>Etkin veri tabanı kilitli! +Lütfen seçilen veri tabanının kilidini kaldırın veya kilitli olmayan birini seçin.</translation> </message> <message> <source>KeePassXC: Removed keys from database</source> <translation>KeePassXC: Anahtarlar veri tabanından kaldırıldı</translation> </message> + <message numerus="yes"> + <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No keys found</source> <translation>KeePassXC: Anahtar bulunamadı</translation> </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation>KeePassHttp Ayarlarında paylaşılan şifreleme anahtarı bulunamadı.</translation> + </message> <message> <source>KeePassXC: Settings not available!</source> <translation>KeePassXC: Ayarlar kullanılabilir değil!</translation> </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation>Etkin veri tabanı KeePassHttp Ayarlarının girdisini barındırmıyor.</translation> + </message> + <message> + <source>Removing stored permissions...</source> + <translation>Saklanan izinler kaldırılıyor...</translation> + </message> + <message> + <source>Abort</source> + <translation>İptal</translation> + </message> <message> <source>KeePassXC: Removed permissions</source> <translation>KeePassXC: Silinen yetkiler</translation> </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entries.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No entry with permissions found!</source> - <translation type="unfinished"/> + <translation>KeePassXC: İzinli girdi bulunamadı!</translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>Etkin veri tabanı izinleri olan girdi barındırmıyor.</translation> </message> </context> <context> @@ -2073,10 +3537,26 @@ give it a unique name to identify and accept it.</source> </context> <context> <name>SettingsWidgetGeneral</name> + <message> + <source>Basic Settings</source> + <translation>Temel Ayarlar</translation> + </message> + <message> + <source>Start only a single instance of KeePassXC</source> + <translation>Yalnızca tek KeePassXC oluşumu başlat</translation> + </message> <message> <source>Remember last databases</source> <translation>Son veri tabanlarını anımsa</translation> </message> + <message> + <source>Remember last key files and security dongles</source> + <translation>Son anahtar dosyalarını ve güvenlik aygıtlarını anımsa</translation> + </message> + <message> + <source>Load previous databases on startup</source> + <translation>Başlangıçta önceki veri tabanlarını yükle</translation> + </message> <message> <source>Automatically save on exit</source> <translation>Çıkışta kendiliğinden kaydet</translation> @@ -2085,21 +3565,29 @@ give it a unique name to identify and accept it.</source> <source>Automatically save after every change</source> <translation>Her değişiklik sonrası kendiliğinden kaydet</translation> </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation>Veri tabanı dışarıdan değiştirildiğinde kendiliğinden yeniden yükle</translation> + </message> <message> <source>Minimize when copying to clipboard</source> <translation>Panoya kopyalarken simge durumuna küçült</translation> </message> + <message> + <source>Minimize window at application startup</source> + <translation>Uygulama başlangıcında pencereyi simge durumuna küçült</translation> + </message> <message> <source>Use group icon on entry creation</source> <translation>Girdi oluşturmada küme simgesini kullan</translation> </message> <message> - <source>Global Auto-Type shortcut</source> - <translation type="unfinished"/> + <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> + <translation>Veri dışı değişiklikler (kümeleri genişletmek gibi) için veri tabanını değiştirildi olarak imleme</translation> </message> <message> - <source>Language</source> - <translation>Dil</translation> + <source>Hide the Details view</source> + <translation type="unfinished"/> </message> <message> <source>Show a system tray icon</source> @@ -2109,104 +3597,102 @@ give it a unique name to identify and accept it.</source> <source>Hide window to system tray when minimized</source> <translation>Simge durumuna küçültüldüğünde pencereyi sistem tepsisine gizle</translation> </message> - <message> - <source>Load previous databases on startup</source> - <translation>Başlangıçta önceki veri tabanlarını yükle</translation> - </message> - <message> - <source>Automatically reload the database when modified externally</source> - <translation>Veri tabanı dışarıdan değiştirildiğinde kendiliğinden yeniden yükle</translation> - </message> <message> <source>Hide window to system tray instead of app exit</source> <translation>Uygulamadan çıkmak yerine pencereyi sistem tepsisine gizle</translation> </message> <message> - <source>Minimize window at application startup</source> - <translation>Uygulama başlangıcında pencereyi simge durumuna küçült</translation> - </message> - <message> - <source>Basic Settings</source> - <translation>Temel Ayarlar</translation> - </message> - <message> - <source>Remember last key files and security dongles</source> + <source>Dark system tray icon</source> <translation type="unfinished"/> </message> <message> - <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> - <translation type="unfinished"/> + <source>Language</source> + <translation>Dil</translation> </message> <message> <source>Auto-Type</source> - <translation>Oto-Yazma</translation> + <translation>Oto-Yazım</translation> </message> <message> - <source>Use entry title and URL to match windows for global Auto-Type</source> + <source>Use entry title to match windows for global Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use entry URL to match windows for global Auto-Type</source> <translation type="unfinished"/> </message> <message> <source>Always ask before performing Auto-Type</source> - <translation type="unfinished"/> + <translation>Oto-Yazım gerçekleştirmeden önce her zaman sor</translation> + </message> + <message> + <source>Global Auto-Type shortcut</source> + <translation>Küresel Oto-Yazım kısayolu</translation> </message> <message> <source>Auto-Type delay</source> - <translation type="unfinished"/> + <translation>Oto-Yazım gecikmesi</translation> </message> <message> <source> ms</source> - <translation type="unfinished"/> - </message> - <message> - <source>Start only a single instance of KeePassXC</source> - <translation type="unfinished"/> + <comment>Milliseconds</comment> + <translation>ms</translation> </message> </context> <context> <name>SettingsWidgetSecurity</name> + <message> + <source>Timeouts</source> + <translation>Zaman Aşımları</translation> + </message> <message> <source>Clear clipboard after</source> - <translation type="unfinished"/> + <translation>Şundan sonra panoyu temizle</translation> </message> <message> <source> sec</source> - <translation type="unfinished"/> + <comment>Seconds</comment> + <translation>san</translation> </message> <message> <source>Lock databases after inactivity of</source> - <translation type="unfinished"/> + <translation>Şu kadar hareketsizlikten sonra veri tabanlarını kilitle</translation> + </message> + <message> + <source>Convenience</source> + <translation>Elverişlilik</translation> + </message> + <message> + <source>Lock databases when session is locked or lid is closed</source> + <translation>Oturum kilitlendiğinde veya kapak kapandığında veri tabanlarını kilitle</translation> + </message> + <message> + <source>Lock databases after minimizing the window</source> + <translation>Pencereyi küçülttükten sonra veri tabanlarını kilitle</translation> + </message> + <message> + <source>Don't require password repeat when it is visible</source> + <translation>Parola görünür olduğunda yineleme gerektirme</translation> </message> <message> <source>Show passwords in cleartext by default</source> <translation>Parolaları öntanımlı olarak düz metinde göster</translation> </message> <message> - <source>Lock databases after minimizing the window</source> + <source>Hide passwords in the preview panel</source> <translation type="unfinished"/> </message> <message> - <source>Don't require password repeat when it is visible</source> + <source>Hide entry notes by default</source> <translation type="unfinished"/> </message> - <message> - <source>Timeouts</source> - <translation type="unfinished"/> - </message> - <message> - <source>Convenience</source> - <translation type="unfinished"/> - </message> - <message> - <source>Lock databases when session is locked or lid is closed</source> - <translation>Oturum kilitlendiğinde veya kapak kapandığında veri tabanlarını kilitle</translation> - </message> <message> <source>Privacy</source> <translation>Gizlilik</translation> </message> <message> <source>Use Google as fallback for downloading website icons</source> - <translation type="unfinished"/> + <translation>Web site simgelerini indirmek için Google'ı yedek olarak kullan</translation> </message> </context> <context> @@ -2219,6 +3705,14 @@ give it a unique name to identify and accept it.</source> <source>Key:</source> <translation>Anahtar:</translation> </message> + <message> + <source>Default RFC 6238 token settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Steam token settings</source> + <translation type="unfinished"/> + </message> <message> <source>Use custom settings</source> <translation>Özel ayarlar kullan</translation> @@ -2245,7 +3739,8 @@ give it a unique name to identify and accept it.</source> </message> <message> <source> sec</source> - <translation type="unfinished"/> + <comment>Seconds</comment> + <translation>san</translation> </message> </context> <context> @@ -2312,27 +3807,7 @@ give it a unique name to identify and accept it.</source> <context> <name>main</name> <message> - <source>path to a custom config file</source> - <translation type="unfinished"/> - </message> - <message> - <source>key file of the database</source> - <translation type="unfinished"/> - </message> - <message> - <source>KeePassXC - cross-platform password manager</source> - <translation type="unfinished"/> - </message> - <message> - <source>read password of the database from stdin</source> - <translation type="unfinished"/> - </message> - <message> - <source>filenames of the password databases to open (*.kdbx)</source> - <translation type="unfinished"/> - </message> - <message> - <source>Copy a password to the clipboard</source> + <source>Remove an entry from the database.</source> <translation type="unfinished"/> </message> <message> @@ -2340,60 +3815,32 @@ give it a unique name to identify and accept it.</source> <translation>Veri tabanının yolu.</translation> </message> <message> - <source>Use a GUI prompt unlocking the database.</source> + <source>Path of the entry to remove.</source> <translation type="unfinished"/> </message> <message> - <source>Name of the entry to clip.</source> + <source>KeePassXC - cross-platform password manager</source> + <translation>KeePassXC - çapraz platformlu parola yöneticisi</translation> + </message> + <message> + <source>filenames of the password databases to open (*.kdbx)</source> + <translation>açılacak parola veri tabanlarının dosya adları (*.kdbx)</translation> + </message> + <message> + <source>path to a custom config file</source> + <translation>özel yapılandırma dosyası yolu</translation> + </message> + <message> + <source>key file of the database</source> + <translation>veri tabanının anahtar dosyası</translation> + </message> + <message> + <source>read password of the database from stdin</source> + <translation>veri tabanının parolasını stdin'den oku</translation> + </message> + <message> + <source>Parent window handle</source> <translation type="unfinished"/> </message> - <message> - <source>Extract and print the content of a database.</source> - <translation>Veri tabanının içeriğini çıkar ve yazdır.</translation> - </message> - <message> - <source>Path of the database to extract.</source> - <translation>Veri tabanının çıkarılacağı yol.</translation> - </message> - <message> - <source>Name of the command to execute.</source> - <translation>Çalıştırılacak komutun adı.</translation> - </message> - <message> - <source>List database entries.</source> - <translation>Veri tabanı girdilerini listele.</translation> - </message> - <message> - <source>Path of the group to list. Default is /</source> - <translation type="unfinished"/> - </message> - <message> - <source>Print the UUIDs of the entries and groups.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Merge two databases.</source> - <translation>İki veri tabanını birleştir.</translation> - </message> - <message> - <source>Path of the database to merge into.</source> - <translation>Veri tabanının nereye birleştirileceği.</translation> - </message> - <message> - <source>Path of the database to merge from.</source> - <translation>Veri tabanının nereden birleştirileceği.</translation> - </message> - <message> - <source>Use the same password for both database files.</source> - <translation>Her iki veri tabanı dosyası için aynı parolayı kullan.</translation> - </message> - <message> - <source>Show a password.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Name of the entry to show.</source> - <translation>Gösterilecek girdinin adı.</translation> - </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_uk.ts b/share/translations/keepassx_uk.ts index c8abb87fb..e0d9266f4 100644 --- a/share/translations/keepassx_uk.ts +++ b/share/translations/keepassx_uk.ts @@ -9,14 +9,34 @@ <source>About</source> <translation>Про програму</translation> </message> + <message> + <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> + <translation>Повідомляйте про вади на <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> + </message> + <message> + <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>KeePassXC розповсюджується на умовах Загальної публічної ліцензії GNU (GPL) версії 2 або (на ваш вибір) версії 3.</translation> + </message> + <message> + <source>Project Maintainers:</source> + <translation>Супровідники проекту: </translation> + </message> <message> <source>Contributors</source> <translation>Спільнота</translation> </message> + <message> + <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Переглянути внесок на GitHub</a></translation> + </message> <message> <source>Debug Info</source> <translation>Інформація щодо зневадження</translation> </message> + <message> + <source>Include the following information whenever you report a bug:</source> + <translation>Коли Ви повідомляєте про ваду, завжди долучайте таку інформацію:</translation> + </message> <message> <source>Copy to clipboard</source> <translation>Скопіювати у буфер обміну</translation> @@ -31,6 +51,10 @@ <source>Revision: %1</source> <translation>Ревізія: %1</translation> </message> + <message> + <source>Distribution: %1</source> + <translation type="unfinished"/> + </message> <message> <source>Libraries:</source> <translation>Бібліотеки:</translation> @@ -47,33 +71,13 @@ Kernel: %3 %4</source> <source>Enabled extensions:</source> <translation>Увімкнені розширення:</translation> </message> - <message> - <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> - <translation>Повідомляйте про вади на <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> - </message> - <message> - <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassXC розповсюджується на умовах Загальної публічної ліцензії GNU (GPL) версії 2 або (на ваш вибір) версії 3.</translation> - </message> - <message> - <source>Project Maintainers:</source> - <translation>Супровідники проекту: </translation> - </message> - <message> - <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Переглянути внесок на GitHub</a></translation> - </message> - <message> - <source>Include the following information whenever you report a bug:</source> - <translation>Коли Ви повідомляєте про ваду, завжди долучайте таку інформацію:</translation> - </message> - <message> - <source>Distribution: %1</source> - <translation type="unfinished"/> - </message> </context> <context> <name>AccessControlDialog</name> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>Підтвердити доступ KeePassXC до HTTP</translation> + </message> <message> <source>Remember this decision</source> <translation>Запам'ятати цей вибір</translation> @@ -92,9 +96,12 @@ Please select whether you want to allow access.</source> <translation>%1 запросила доступ до гасел для таких записів(-у). Будь ласка, вкажіть чи хочете ви дозволити доступ?</translation> </message> +</context> +<context> + <name>AgentSettingsWidget</name> <message> - <source>KeePassXC HTTP Confirm Access</source> - <translation>Підтвердити доступ KeePassXC до HTTP</translation> + <source>Enable SSH Agent (requires restart)</source> + <translation type="unfinished"/> </message> </context> <context> @@ -107,6 +114,26 @@ Please select whether you want to allow access.</source> <source>Auto-Type - KeePassXC</source> <translation>Автозаповнення – KeePassXC</translation> </message> + <message> + <source>Auto-Type</source> + <translation>Автозаповнення</translation> + </message> + <message> + <source>The Syntax of your Auto-Type statement is incorrect!</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> </context> <context> <name>AutoTypeAssociationsModel</name> @@ -125,13 +152,290 @@ Please select whether you want to allow access.</source> </context> <context> <name>AutoTypeSelectDialog</name> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>Автозаповнення – KeePassXC</translation> + </message> <message> <source>Select entry to Auto-Type:</source> <translation>Виберіть запис для автозаповнення:</translation> </message> +</context> +<context> + <name>BrowserAccessControlDialog</name> <message> - <source>Auto-Type - KeePassXC</source> - <translation>Автозаповнення – KeePassXC</translation> + <source>KeePassXC-Browser Confirm Access</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remember this decision</source> + <translation>Запам'ятати цей вибір</translation> + </message> + <message> + <source>Allow</source> + <translation>Дозволити</translation> + </message> + <message> + <source>Deny</source> + <translation>Заборонити</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 запросила доступ до гасел для таких записів(-у). +Будь ласка, вкажіть чи хочете ви дозволити доступ?</translation> + </message> +</context> +<context> + <name>BrowserOptionDialog</name> + <message> + <source>Dialog</source> + <translation>Діалог</translation> + </message> + <message> + <source>This is required for accessing your databases with KeePassXC-Browser</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable KeepassXC browser integration</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>Загальні</translation> + </message> + <message> + <source>Enable integration for these browsers:</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Google Chrome</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Firefox</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Chromium</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Vivaldi</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show a &notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Запитувати щодо розблокування сховища, якщо воно заблоковане</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Match URL scheme (e.g., https://...)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>Показувати лише найкращі збіги для певного URL замість усіх записів для всієї області. </translation> + </message> + <message> + <source>&Return only best-matching credentials</source> + <translation type="unfinished"/> + </message> + <message> + <source>Sort &matching credentials by title</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Sort matching credentials by &username</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>&Disconnect all browsers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Forget all remembered &permissions</source> + <translation type="unfinished"/> + </message> + <message> + <source>Advanced</source> + <translation>Розширені</translation> + </message> + <message> + <source>Never &ask before accessing credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Never ask before &updating credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>Тільки вибране сховище має бути під'єднаним через клієнта.</translation> + </message> + <message> + <source>Searc&h in all opened databases for matching credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>Автоматичне створення та оновлення текстових полів не втілене.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>Показати розширені текстові поля, що починаються з «KPH: »</translation> + </message> + <message> + <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Update &native messaging manifest files at startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Support a proxy application between KeePassXC and browser extension.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &proxy application between KeePassXC and browser extension</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a custom proxy location if you installed a proxy manually.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &custom proxy location</source> + <comment>Meant is the proxy for KeePassXC-Browser</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*.exe);;All Files (*.*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select custom proxy location</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>BrowserService</name> + <message> + <source>KeePassXC: New key association request</source> + <translation>KeePassXC: новий запит на прив'язку ключа</translation> + </message> + <message> + <source>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Save and allow access</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: перезаписати наявний ключ?</translation> + </message> + <message> + <source>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: оновити запис</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Бажаєте оновити інформацію у %1 – %2?</translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: сховище заблоковане!</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>Чинне сховище заблоковане! +Будь ласка, розблокуйте обране сховище або виберіть інше незаблоковане.</translation> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: налаштування недоступні!</translation> + </message> + <message> + <source>The active database does not contain a settings entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: жодного ключа не знайдено</translation> + </message> + <message> + <source>No shared encryption keys found in KeePassXC Settings.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: ключі видалені зі сховища</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Removing stored permissions…</source> + <translation type="unfinished"/> + </message> + <message> + <source>Abort</source> + <translation>Скасувати</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: привілеї видалені</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entry(s).</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation>KeePassXC: запис з привілеями не знайдено!</translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>Поточне сховище не містить записів з привілеями…</translation> </message> </context> <context> @@ -148,6 +452,10 @@ Please select whether you want to allow access.</source> <source>Repeat password:</source> <translation>Повторіть гасло:</translation> </message> + <message> + <source>&Key file</source> + <translation>Файл-&ключ</translation> + </message> <message> <source>Browse</source> <translation>Огляд</translation> @@ -156,6 +464,14 @@ Please select whether you want to allow access.</source> <source>Create</source> <translation>Створити</translation> </message> + <message> + <source>Cha&llenge Response</source> + <translation>Виклик-відповідь</translation> + </message> + <message> + <source>Refresh</source> + <translation>Оновити</translation> + </message> <message> <source>Key files</source> <translation>Файли-ключі</translation> @@ -176,6 +492,10 @@ Please select whether you want to allow access.</source> <source>Select a key file</source> <translation>Обрати файл-ключ</translation> </message> + <message> + <source>Empty password</source> + <translation>Порожнє гасло</translation> + </message> <message> <source>Do you really want to use an empty string as password?</source> <translation>Ви дійсно хочете використати порожній рядок у якості гасла?</translation> @@ -191,20 +511,15 @@ Please select whether you want to allow access.</source> %2</translation> </message> <message> - <source>&Key file</source> - <translation>Файл-&ключ</translation> + <source>Legacy key file format</source> + <translation type="unfinished"/> </message> <message> - <source>Cha&llenge Response</source> - <translation>Виклик-відповідь</translation> - </message> - <message> - <source>Refresh</source> - <translation>Оновити</translation> - </message> - <message> - <source>Empty password</source> - <translation>Порожнє гасло</translation> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -217,6 +532,10 @@ Please select whether you want to allow access.</source> <source>Clone Options</source> <translation>Параметри клонування</translation> </message> + <message> + <source>Append ' - Clone' to title</source> + <translation>Додавати « – клон» до заголовка</translation> + </message> <message> <source>Replace username and password with references</source> <translation>Замінити ім'я користувача і гасло посиланнями</translation> @@ -225,10 +544,6 @@ Please select whether you want to allow access.</source> <source>Copy history</source> <translation>Скопіювати журнал</translation> </message> - <message> - <source>Append ' - Clone' to title</source> - <translation>Додавати « – клон» до заголовка</translation> - </message> </context> <context> <name>CsvImportWidget</name> @@ -325,10 +640,6 @@ Please select whether you want to allow access.</source> </context> <context> <name>CsvImportWizard</name> - <message> - <source>Import CSV file</source> - <translation>Імпортувати файл CSV</translation> - </message> <message> <source>Error</source> <translation>Помилка</translation> @@ -340,17 +651,17 @@ Please select whether you want to allow access.</source> </context> <context> <name>CsvParserModel</name> - <message> - <source> byte, </source> - <translation>байт,</translation> + <message numerus="yes"> + <source>%n byte(s), </source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> </message> - <message> - <source> rows, </source> - <translation>рядки,</translation> + <message numerus="yes"> + <source>%n row(s), </source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> </message> - <message> - <source> columns</source> - <translation>колонки</translation> + <message numerus="yes"> + <source>%n column(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> </message> </context> <context> @@ -371,6 +682,14 @@ Please select whether you want to allow access.</source> <source>Browse</source> <translation>Огляд</translation> </message> + <message> + <source>Refresh</source> + <translation>Оновити</translation> + </message> + <message> + <source>Challenge Response:</source> + <translation>Виклик-відповідь:</translation> + </message> <message> <source>Unable to open the database.</source> <translation>Неможливо відкрити сховище.</translation> @@ -379,6 +698,21 @@ Please select whether you want to allow access.</source> <source>Can't open key file</source> <translation>Не вдається відкрити файл-ключ</translation> </message> + <message> + <source>Legacy key file format</source> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't show this warning again</source> + <translation type="unfinished"/> + </message> <message> <source>All files</source> <translation>Всі файли</translation> @@ -391,14 +725,6 @@ Please select whether you want to allow access.</source> <source>Select key file</source> <translation>Оберіть файл-ключ</translation> </message> - <message> - <source>Refresh</source> - <translation>Оновити</translation> - </message> - <message> - <source>Challenge Response:</source> - <translation>Виклик-відповідь:</translation> - </message> </context> <context> <name>DatabaseRepairWidget</name> @@ -414,14 +740,14 @@ Please select whether you want to allow access.</source> <source>Can't open key file</source> <translation>Не вдається відкрити файл-ключ</translation> </message> - <message> - <source>Database opened fine. Nothing to do.</source> - <translation>Сховище відкрите без помилок. Обробка не потрібна.</translation> - </message> <message> <source>Unable to open the database.</source> <translation>Неможливо відкрити сховище.</translation> </message> + <message> + <source>Database opened fine. Nothing to do.</source> + <translation>Сховище відкрите без помилок. Обробка не потрібна.</translation> + </message> <message> <source>Success</source> <translation>Успішно</translation> @@ -440,40 +766,57 @@ You can now save it.</source> <context> <name>DatabaseSettingsWidget</name> <message> - <source>Database name:</source> - <translation>Назва сховища:</translation> + <source>General</source> + <translation>Загальні</translation> </message> <message> - <source>Database description:</source> - <translation>Опис сховища:</translation> + <source>Encryption</source> + <translation type="unfinished"/> </message> <message> - <source>Transform rounds:</source> - <translation>Раундів перетворень:</translation> + <source>Number of rounds too high</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> </message> <message> - <source>Default username:</source> - <translation>Типове ім’я користувача:</translation> + <source>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</source> + <translation type="unfinished"/> </message> <message> - <source> MiB</source> - <translation> МіБ</translation> + <source>Understood, keep number</source> + <translation type="unfinished"/> </message> <message> - <source>Benchmark</source> - <translation>Перевірка</translation> + <source>Cancel</source> + <translation type="unfinished"/> </message> <message> - <source>Max. history items:</source> - <translation>Макс. записів журналу:</translation> + <source>Number of rounds too low</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> </message> <message> - <source>Max. history size:</source> - <translation>Макс. розмір журналу:</translation> + <source>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</source> + <translation type="unfinished"/> </message> <message> - <source>Use recycle bin</source> - <translation>Використовувати смітник</translation> + <source>KDF unchanged</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetEncryption</name> + <message> + <source>Encryption Algorithm:</source> + <translation type="unfinished"/> </message> <message> <source>AES: 256 Bit (default)</source> @@ -484,14 +827,78 @@ You can now save it.</source> <translation>Twofish: 256 біт</translation> </message> <message> - <source>Algorithm:</source> - <translation>Алгоритм:</translation> + <source>Key Derivation Function:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Transform rounds:</source> + <translation>Раундів перетворень:</translation> + </message> + <message> + <source>Benchmark 1-second delay</source> + <translation type="unfinished"/> + </message> + <message> + <source>Memory Usage:</source> + <translation type="unfinished"/> + </message> + <message> + <source> MB</source> + <translation type="unfinished"/> + </message> + <message> + <source>Parallelism:</source> + <translation type="unfinished"/> + </message> + <message> + <source> thread</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetGeneral</name> + <message> + <source>Database Meta Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database name:</source> + <translation>Назва сховища:</translation> + </message> + <message> + <source>Database description:</source> + <translation>Опис сховища:</translation> + </message> + <message> + <source>Default username:</source> + <translation>Типове ім’я користувача:</translation> + </message> + <message> + <source>History Settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Max. history items:</source> + <translation>Макс. записів журналу:</translation> + </message> + <message> + <source>Max. history size:</source> + <translation>Макс. розмір журналу:</translation> + </message> + <message> + <source> MiB</source> + <translation> МіБ</translation> + </message> + <message> + <source>Use recycle bin</source> + <translation>Використовувати смітник</translation> </message> </context> <context> <name>DatabaseTabWidget</name> <message> <source>Root</source> + <comment>Root group</comment> <translation>Корінь</translation> </message> <message> @@ -510,6 +917,30 @@ You can now save it.</source> <source>File not found!</source> <translation>Файл не знайдено!</translation> </message> + <message> + <source>Unable to open the database.</source> + <translation>Неможливо відкрити сховище.</translation> + </message> + <message> + <source>File opened in read only mode.</source> + <translation>Файл відкритий лише для читання.</translation> + </message> + <message> + <source>Open CSV file</source> + <translation>Відкрити CSV файл</translation> + </message> + <message> + <source>CSV file</source> + <translation>Файл CSV</translation> + </message> + <message> + <source>All files (*)</source> + <translation>Усі файли (*)</translation> + </message> + <message> + <source>Merge database</source> + <translation>Об'єднати сховище</translation> + </message> <message> <source>Open KeePass 1 database</source> <translation>Відкрити сховище KeePass 1</translation> @@ -518,14 +949,16 @@ You can now save it.</source> <source>KeePass 1 database</source> <translation>Сховище KeePass 1</translation> </message> - <message> - <source>All files (*)</source> - <translation>Усі файли (*)</translation> - </message> <message> <source>Close?</source> <translation>Закрити?</translation> </message> + <message> + <source>"%1" is in edit mode. +Discard changes and close anyway?</source> + <translation>«%1» в режимі редагування. +Відхилити зміни і все одно закрити?</translation> + </message> <message> <source>Save changes?</source> <translation>Зберегти зміни?</translation> @@ -540,10 +973,22 @@ Save changes?</source> <source>Writing the database failed.</source> <translation>Записати сховище не вдалося.</translation> </message> + <message> + <source>Passwords</source> + <translation>Гасла</translation> + </message> <message> <source>Save database as</source> <translation>Зберегти сховище як</translation> </message> + <message> + <source>Export database to CSV file</source> + <translation>Експортувати сховище у файл CSV</translation> + </message> + <message> + <source>Writing the CSV file failed.</source> + <translation>Не вдалось записати CSV файл.</translation> + </message> <message> <source>New database</source> <translation>Нове сховище</translation> @@ -561,12 +1006,6 @@ Save changes?</source> Please press cancel to finish your changes or discard them.</source> <translation>Неможливо заблокувати сховище, яке Ви зараз редагуєте. Натисніть «скасувати», щоб завершити зміни або відкинути їх.</translation> - </message> - <message> - <source>This database has never been saved. -You can save the database or stop locking it.</source> - <translation>Це сховище не було збережене. -Ви можете зберегти сховище або зупинити його блокування.</translation> </message> <message> <source>This database has been modified. @@ -576,69 +1015,13 @@ Otherwise your changes are lost.</source> Ви хочете зберегти його перед блокуванням? Інакше внесені зміни буде втрачено.</translation> </message> - <message> - <source>"%1" is in edit mode. -Discard changes and close anyway?</source> - <translation>«%1» в режимі редагування. -Відхилити зміни і все одно закрити?</translation> - </message> - <message> - <source>Export database to CSV file</source> - <translation>Експортувати сховище у файл CSV</translation> - </message> - <message> - <source>CSV file</source> - <translation>Файл CSV</translation> - </message> - <message> - <source>Writing the CSV file failed.</source> - <translation>Не вдалось записати CSV файл.</translation> - </message> - <message> - <source>Unable to open the database.</source> - <translation>Неможливо відкрити сховище.</translation> - </message> - <message> - <source>Merge database</source> - <translation>Об'єднати сховище</translation> - </message> - <message> - <source>The database you are trying to save as is locked by another instance of KeePassXC. -Do you want to save it anyway?</source> - <translation>Сховище, яке Ви намагаєтесь зберегти, заблоковане іншим примірником KeePassXC. -Все одно зберегти?</translation> - </message> - <message> - <source>Passwords</source> - <translation>Гасла</translation> - </message> - <message> - <source>Database already opened</source> - <translation>Сховище вже відкрите</translation> - </message> - <message> - <source>The database you are trying to open is locked by another instance of KeePassXC. - -Do you want to open it anyway?</source> - <translation>Сховище, яке Ви намагаєтесь відкрити, заблоковане іншим примірником KeePassXC. - -Все одно відкрити?</translation> - </message> - <message> - <source>Open read-only</source> - <translation>Відкрити лише для читання</translation> - </message> - <message> - <source>File opened in read only mode.</source> - <translation>Файл відкритий лише для читання.</translation> - </message> - <message> - <source>Open CSV file</source> - <translation>Відкрити CSV файл</translation> - </message> </context> <context> <name>DatabaseWidget</name> + <message> + <source>Searching...</source> + <translation>Шукаю…</translation> + </message> <message> <source>Change master key</source> <translation>Змінити головний ключ</translation> @@ -659,13 +1042,33 @@ Do you want to open it anyway?</source> <source>Do you really want to delete %1 entries for good?</source> <translation>Ви дійсно хочете остаточно видалити %1 записи(-ів)?</translation> </message> + <message> + <source>Move entry to recycle bin?</source> + <translation>Перемістити запис у смітник?</translation> + </message> + <message> + <source>Do you really want to move entry "%1" to the recycle bin?</source> + <translation>Ви справді хочете перемістити запис «%1» у смітник?</translation> + </message> <message> <source>Move entries to recycle bin?</source> <translation>Перемістити записи до смітника?</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>Ви дійсно хочете перемістити %n запис у смітник?</numerusform><numerusform>Ви дійсно хочете перемістити %n записи в смітник?</numerusform><numerusform>Ви дійсно хочете перемістити %n записів у смітник?</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Execute command?</source> + <translation>Виконати команду?</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation>Ви справді хочете виконати таку команду? <br><br>%1<br></translation> + </message> + <message> + <source>Remember my choice</source> + <translation>Запам'ятати мій вибір</translation> </message> <message> <source>Delete group?</source> @@ -679,18 +1082,6 @@ Do you want to open it anyway?</source> <source>Unable to calculate master key</source> <translation>Неможливо вирахувати головний ключ</translation> </message> - <message> - <source>Move entry to recycle bin?</source> - <translation>Перемістити запис у смітник?</translation> - </message> - <message> - <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation>Ви справді хочете перемістити запис «%1» у смітник?</translation> - </message> - <message> - <source>Searching...</source> - <translation>Шукаю…</translation> - </message> <message> <source>No current database.</source> <translation>Сховище не обране.</translation> @@ -708,20 +1099,8 @@ Do you want to open it anyway?</source> <translation>Збіги відсутні</translation> </message> <message> - <source>Execute command?</source> - <translation>Виконати команду?</translation> - </message> - <message> - <source>Do you really want to execute the following command?<br><br>%1<br></source> - <translation>Ви справді хочете виконати таку команду? <br><br>%1<br></translation> - </message> - <message> - <source>Remember my choice</source> - <translation>Запам'ятати мій вибір</translation> - </message> - <message> - <source>Autoreload Request</source> - <translation>Запит на автозавантаження</translation> + <source>File has changed</source> + <translation type="unfinished"/> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -732,8 +1111,9 @@ Do you want to open it anyway?</source> <translation>Запит на об'єднання</translation> </message> <message> - <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> - <translation>Файл сховища змінено, але Ви маєте незбережені зміни. Об'єднати Ваші зміни зі змінами у файлі?</translation> + <source>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</source> + <translation type="unfinished"/> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -748,6 +1128,89 @@ Do you want to open it anyway?</source> <translation>Ви дійсно бажаєте остаточно видалити все зі смітника?</translation> </message> </context> +<context> + <name>DetailsWidget</name> + <message> + <source>Generate TOTP Token</source> + <translation type="unfinished"/> + </message> + <message> + <source>Close</source> + <translation>Закрити</translation> + </message> + <message> + <source>General</source> + <translation>Загальні</translation> + </message> + <message> + <source>Password</source> + <translation>Гасло</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Expiration</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username</source> + <translation>Ім’я користувача</translation> + </message> + <message> + <source>Autotype</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searching</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attributes</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation>Вкладення</translation> + </message> + <message> + <source>Notes</source> + <translation>Примітки</translation> + </message> + <message> + <source>Window</source> + <translation>Вікно</translation> + </message> + <message> + <source>Sequence</source> + <translation>Послідовність</translation> + </message> + <message> + <source>Search</source> + <translation>Пошук</translation> + </message> + <message> + <source>Clear</source> + <translation>Очистити</translation> + </message> + <message> + <source>Never</source> + <translation type="unfinished"/> + </message> + <message> + <source>[PROTECTED]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Disabled</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enabled</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EditEntryWidget</name> <message> @@ -774,6 +1237,30 @@ Do you want to open it anyway?</source> <source>History</source> <translation>Журнал</translation> </message> + <message> + <source>SSH Agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>(encrypted)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>File too large to be a private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open private key</source> + <translation type="unfinished"/> + </message> <message> <source>Entry history</source> <translation>Журнал запису</translation> @@ -794,40 +1281,6 @@ Do you want to open it anyway?</source> <source>New attribute</source> <translation>Новий атрибут</translation> </message> - <message> - <source>Select file</source> - <translation>Вибрати файл</translation> - </message> - <message> - <source>Unable to open file</source> - <translation>Неможливо відкрити файл</translation> - </message> - <message> - <source>Save attachment</source> - <translation>Зберегти вкладення</translation> - </message> - <message> - <source>Unable to save the attachment: -</source> - <translation>Неможливо зберегти вкладення: -</translation> - </message> - <message> - <source>Tomorrow</source> - <translation>Завтра</translation> - </message> - <message numerus="yes"> - <source>%n week(s)</source> - <translation><numerusform>%n тиждень</numerusform><numerusform>%n тижні</numerusform><numerusform>%n тижнів</numerusform></translation> - </message> - <message numerus="yes"> - <source>%n month(s)</source> - <translation><numerusform>%n місяць</numerusform><numerusform>%n місяці</numerusform><numerusform>%n місяців</numerusform></translation> - </message> - <message> - <source>1 year</source> - <translation>1 рік</translation> - </message> <message> <source>Confirm Remove</source> <translation>Схваліть видалення</translation> @@ -837,12 +1290,28 @@ Do you want to open it anyway?</source> <translation>Ви дійсно бажаєте видалити цей атрибут?</translation> </message> <message> - <source>[PROTECTED] Press reveal to view or edit</source> - <translation>[ЗАХИЩЕНО] Натисніть «показати», щоб переглянути або змінити</translation> + <source>[PROTECTED]</source> + <translation type="unfinished"/> </message> <message> - <source>Are you sure you want to remove this attachment?</source> - <translation>Ви дійсно бажаєте видалити це вкладення?</translation> + <source>Press reveal to view or edit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Tomorrow</source> + <translation>Завтра</translation> + </message> + <message numerus="yes"> + <source>%n week(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source>%n month(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>1 year</source> + <translation>1 рік</translation> </message> </context> <context> @@ -859,18 +1328,6 @@ Do you want to open it anyway?</source> <source>Remove</source> <translation>Видалити</translation> </message> - <message> - <source>Attachments</source> - <translation>Вкладення</translation> - </message> - <message> - <source>Save</source> - <translation>Зберегти</translation> - </message> - <message> - <source>Open</source> - <translation>Відкрити</translation> - </message> <message> <source>Edit Name</source> <translation>Змінити назву</translation> @@ -883,6 +1340,10 @@ Do you want to open it anyway?</source> <source>Reveal</source> <translation>Показати</translation> </message> + <message> + <source>Attachments</source> + <translation>Вкладення</translation> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -890,6 +1351,18 @@ Do you want to open it anyway?</source> <source>Enable Auto-Type for this entry</source> <translation>Увімкнути автозаповнення для цього запису</translation> </message> + <message> + <source>Inherit default Auto-Type sequence from the &group</source> + <translation>Успадкувати типову послідовність автозаповнення від &групи</translation> + </message> + <message> + <source>&Use custom Auto-Type sequence:</source> + <translation>Використати власну послідовність автозаповнення</translation> + </message> + <message> + <source>Window Associations</source> + <translation>Прив'язки вікон</translation> + </message> <message> <source>+</source> <translation>+</translation> @@ -902,14 +1375,6 @@ Do you want to open it anyway?</source> <source>Window title:</source> <translation>Заголовок вікна:</translation> </message> - <message> - <source>Inherit default Auto-Type sequence from the &group</source> - <translation>Успадкувати типову послідовність автозаповнення від &групи</translation> - </message> - <message> - <source>&Use custom Auto-Type sequence:</source> - <translation>Використати власну послідовність автозаповнення</translation> - </message> <message> <source>Use default se&quence</source> <translation>Використати типову послідовність</translation> @@ -918,10 +1383,6 @@ Do you want to open it anyway?</source> <source>Set custo&m sequence:</source> <translation>Установити власну послідовність:</translation> </message> - <message> - <source>Window Associations</source> - <translation>Прив'язки вікон</translation> - </message> </context> <context> <name>EditEntryWidgetHistory</name> @@ -945,12 +1406,8 @@ Do you want to open it anyway?</source> <context> <name>EditEntryWidgetMain</name> <message> - <source>Title:</source> - <translation>Заголовок:</translation> - </message> - <message> - <source>Username:</source> - <translation>Ім’я користувача:</translation> + <source>URL:</source> + <translation>URL:</translation> </message> <message> <source>Password:</source> @@ -961,20 +1418,104 @@ Do you want to open it anyway?</source> <translation>Гасло ще раз:</translation> </message> <message> - <source>URL:</source> - <translation>URL:</translation> + <source>Title:</source> + <translation>Заголовок:</translation> </message> <message> - <source>Expires</source> - <translation>Закінчується</translation> + <source>Notes</source> + <translation>Примітки</translation> </message> <message> <source>Presets</source> <translation>Заготовки</translation> </message> <message> - <source>Notes:</source> - <translation>Примітки:</translation> + <source>Toggle the checkbox to reveal the notes section.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username:</source> + <translation>Ім’я користувача:</translation> + </message> + <message> + <source>Expires</source> + <translation>Закінчується</translation> + </message> +</context> +<context> + <name>EditEntryWidgetSSHAgent</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent after</source> + <translation type="unfinished"/> + </message> + <message> + <source> seconds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fingerprint</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent when database is closed/locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add key to agent when database is opened/unlocked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Comment</source> + <translation type="unfinished"/> + </message> + <message> + <source>Decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy to clipboard</source> + <translation>Скопіювати у буфер обміну</translation> + </message> + <message> + <source>Private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>External file</source> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Attachment</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add to agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove from agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Require user confirmation when this key is used</source> + <translation type="unfinished"/> </message> </context> <context> @@ -1045,6 +1586,14 @@ Do you want to open it anyway?</source> </context> <context> <name>EditWidgetIcons</name> + <message> + <source>&Use default icon</source> + <translation>Використати типовий значок</translation> + </message> + <message> + <source>Use custo&m icon</source> + <translation>Використати власний значок</translation> + </message> <message> <source>Add custom icon</source> <translation>Додати свій значок</translation> @@ -1053,6 +1602,18 @@ Do you want to open it anyway?</source> <source>Delete custom icon</source> <translation>Видалити свій значок</translation> </message> + <message> + <source>Download favicon</source> + <translation>Завантажити фавікон</translation> + </message> + <message> + <source>Unable to fetch favicon.</source> + <translation>Неможливо дістати фавікон</translation> + </message> + <message> + <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> + <translation>Порада: Ви можете увімкнути Google у якості запасного варіанту шляхом вибору Інструменти>Налаштування>Безпека</translation> + </message> <message> <source>Images</source> <translation>Зображення</translation> @@ -1065,25 +1626,13 @@ Do you want to open it anyway?</source> <source>Select Image</source> <translation>Вибір зображення</translation> </message> - <message> - <source>Download favicon</source> - <translation>Завантажити фавікон</translation> - </message> - <message> - <source>Unable to fetch favicon.</source> - <translation>Неможливо дістати фавікон</translation> - </message> <message> <source>Can't read icon</source> <translation>Неможливо прочитати значок</translation> </message> <message> - <source>&Use default icon</source> - <translation>Використати типовий значок</translation> - </message> - <message> - <source>Use custo&m icon</source> - <translation>Використати власний значок</translation> + <source>Custom icon already exists</source> + <translation type="unfinished"/> </message> <message> <source>Confirm Delete</source> @@ -1093,14 +1642,6 @@ Do you want to open it anyway?</source> <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> <translation>Цей значок використовують %1 записи. Він буде замінений типовим значком. Ви дійсно бажаєте видалити його?</translation> </message> - <message> - <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation>Порада: Ви можете увімкнути Google у якості запасного варіанту шляхом вибору Інструменти>Налаштування>Безпека</translation> - </message> - <message> - <source>Custom icon already exists</source> - <translation type="unfinished"/> - </message> </context> <context> <name>EditWidgetProperties</name> @@ -1125,9 +1666,93 @@ Do you want to open it anyway?</source> <name>Entry</name> <message> <source> - Clone</source> + <comment>Suffix added to cloned entries</comment> <translation>– клон</translation> </message> </context> +<context> + <name>EntryAttachmentsModel</name> + <message> + <source>Name</source> + <translation>Назва</translation> + </message> + <message> + <source>Size</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EntryAttachmentsWidget</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add</source> + <translation>Додати</translation> + </message> + <message> + <source>Remove</source> + <translation>Видалити</translation> + </message> + <message> + <source>Open</source> + <translation>Відкрити</translation> + </message> + <message> + <source>Save</source> + <translation>Зберегти</translation> + </message> + <message> + <source>Select files</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <source>Are you sure you want to remove %n attachment(s)?</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>Схваліть видалення</translation> + </message> + <message> + <source>Save attachments</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to create directory: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Confirm overwrite</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to save attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachment: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open files: +%1</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EntryAttributesModel</name> <message> @@ -1156,6 +1781,11 @@ Do you want to open it anyway?</source> </context> <context> <name>EntryModel</name> + <message> + <source>Ref: </source> + <comment>Reference abbreviation</comment> + <translation>Пос.:</translation> + </message> <message> <source>Group</source> <translation>Група</translation> @@ -1172,11 +1802,6 @@ Do you want to open it anyway?</source> <source>URL</source> <translation>URL</translation> </message> - <message> - <source>Ref: </source> - <comment>Reference abbreviation</comment> - <translation>Пос.:</translation> - </message> </context> <context> <name>Group</name> @@ -1185,6 +1810,17 @@ Do you want to open it anyway?</source> <translation>Смітник</translation> </message> </context> +<context> + <name>HostInstaller</name> + <message> + <source>KeePassXC: Cannot save file!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot save the native messaging script file.</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>HttpPasswordGeneratorWidget</name> <message> @@ -1247,6 +1883,361 @@ Do you want to open it anyway?</source> <translation>Закрити повідомлення</translation> </message> </context> +<context> + <name>Kdbx3Reader</name> + <message> + <source>Unable to calculate master key</source> + <translation>Неможливо вирахувати головний ключ</translation> + </message> + <message> + <source>Unable to issue challenge-response.</source> + <translation>Неможливо видати виклик-відповідь.</translation> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>Неправильний ключ або файл сховища пошкоджено.</translation> + </message> +</context> +<context> + <name>Kdbx3Writer</name> + <message> + <source>Unable to issue challenge-response.</source> + <translation>Неможливо видати виклик-відповідь.</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Неможливо вирахувати головний ключ</translation> + </message> +</context> +<context> + <name>Kdbx4Reader</name> + <message> + <source>missing database headers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Неможливо вирахувати головний ключ</translation> + </message> + <message> + <source>Invalid header checksum size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Header SHA256 mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header data length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open buffer for KDF parameters in header</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported key derivation function (KDF) or invalid parameters</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy header fields found in KDBX4 file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header binary size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass variant map version.</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name data</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value data</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Bool entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry type</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map field type size</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Kdbx4Writer</name> + <message> + <source>Invalid symmetric cipher algorithm.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid symmetric cipher IV size.</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Неможливо вирахувати головний ключ</translation> + </message> + <message> + <source>Failed to serialize KDF parameters variant map</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxReader</name> + <message> + <source>Invalid cipher uuid length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid compression flags length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported compression algorithm</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid master seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform rounds size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid start bytes size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid random stream id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner random stream cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>Не сховище KeePass.</translation> + </message> + <message> + <source>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> + <translation>Вибраний файл є старим сховищем для KeePass 1 (.kdb). + +Щоб імпортувати його, виберіть пункт меню «Сховище > Імпортувати сховище KeePass 1…». +Перетворення можливе лише в одному напрямку. Ви не зможете відкрити імпортоване сховище старою версією KeePassX 0.4.</translation> + </message> + <message> + <source>Unsupported KeePass 2 database version.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxXmlReader</name> + <message> + <source>XML parsing failure: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>No root group</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing icon uuid or data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing custom data key or value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Multiple group elements</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null group uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableAutoType value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableSearching value</source> + <translation type="unfinished"/> + </message> + <message> + <source>No group uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null DeleteObject uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing DeletedObject uuid or time</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null entry uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element in history entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>No entry uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element with different uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decrypt entry string</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate custom attribute found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry string key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate attachment found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry binary key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-type association window or sequence missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid bool value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid date time value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color rgb part</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid uuid value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decompress binary</source> + <extracomment>Translator meant is a binary data inside an entry</extracomment> + <translation type="unfinished"/> + </message> +</context> <context> <name>KeePass1OpenWidget</name> <message> @@ -1266,7 +2257,7 @@ Do you want to open it anyway?</source> </message> <message> <source>Not a KeePass database.</source> - <translation>Це не сховище KeePass.</translation> + <translation>Не сховище KeePass.</translation> </message> <message> <source>Unsupported encryption algorithm.</source> @@ -1276,6 +2267,35 @@ Do you want to open it anyway?</source> <source>Unsupported KeePass database version.</source> <translation>Версія сховища KeePass не підтримується.</translation> </message> + <message> + <source>Unable to read encryption IV</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of groups</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid content hash size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of transform rounds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to construct group tree</source> + <translation type="unfinished"/> + </message> <message> <source>Root</source> <translation>Корінь</translation> @@ -1288,60 +2308,104 @@ Do you want to open it anyway?</source> <source>Wrong key or database file is corrupt.</source> <translation>Неправильний ключ або файл сховища пошкоджено.</translation> </message> -</context> -<context> - <name>KeePass2Reader</name> <message> - <source>Not a KeePass database.</source> - <translation>Не сховище KeePass.</translation> + <source>Key transformation failed</source> + <translation type="unfinished"/> </message> <message> - <source>Unsupported KeePass database version.</source> - <translation>Версія сховища KeePass не підтримується.</translation> + <source>Invalid group field type number</source> + <translation type="unfinished"/> </message> <message> - <source>Wrong key or database file is corrupt.</source> - <translation>Неправильний ключ або файл сховища пошкоджено.</translation> + <source>Invalid group field size</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>Неможливо вирахувати головний ключ</translation> + <source>Read group field data doesn't match size</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to issue challenge-response.</source> - <translation>Неможливо видати виклик-відповідь.</translation> + <source>Incorrect group id field size</source> + <translation type="unfinished"/> </message> <message> - <source>The selected file is an old KeePass 1 database (.kdb). - -You can import it by clicking on Database > 'Import KeePass 1 database...'. -This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> - <translation>Вибраний файл є старим сховищем для KeePass 1 (.kdb). - -Щоб імпортувати його, виберіть пункт меню «Сховище > Імпортувати сховище KeePass 1…». -Перетворення можливе лише в одному напрямку. Ви не зможете відкрити імпортоване сховище старою версією KeePassX 0.4.</translation> - </message> -</context> -<context> - <name>KeePass2Writer</name> - <message> - <source>Unable to issue challenge-response.</source> - <translation>Неможливо видати виклик-відповідь.</translation> + <source>Incorrect group creation time field size</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>Неможливо вирахувати головний ключ</translation> + <source>Incorrect group modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group access time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group level field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing group id or level</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing entry field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read entry field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry uuid field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field type</source> + <translation type="unfinished"/> </message> </context> <context> <name>Main</name> <message> - <source>Fatal error while testing the cryptographic functions.</source> - <translation>Невиправна помилка в процесі тестування криптографічних функцій.</translation> - </message> - <message> - <source>KeePassXC - Error</source> - <translation>KeePassXC – помилка</translation> + <source>Existing single-instance lock file is invalid. Launching new instance.</source> + <translation type="unfinished"/> </message> <message> <source>The lock file could not be created. Single-instance mode disabled.</source> @@ -1352,64 +2416,32 @@ This is a one-way migration. You won't be able to open the imported databas <translation>Інший примірник KeePassXC вже запущений.</translation> </message> <message> - <source>Existing single-instance lock file is invalid. Launching new instance.</source> - <translation type="unfinished"/> + <source>Fatal error while testing the cryptographic functions.</source> + <translation>Невиправна помилка в процесі тестування криптографічних функцій.</translation> + </message> + <message> + <source>KeePassXC - Error</source> + <translation>KeePassXC – помилка</translation> </message> </context> <context> <name>MainWindow</name> <message> - <source>Open database</source> - <translation>Відкрити сховище</translation> - </message> - <message> - <source>Database settings</source> - <translation>Параметри сховища</translation> - </message> - <message> - <source>Copy username to clipboard</source> - <translation>Копіювати ім’я користувача в буфер обміну</translation> - </message> - <message> - <source>Copy password to clipboard</source> - <translation>Копіювати гасло в буфер обміну</translation> - </message> - <message> - <source>Settings</source> - <translation>Налаштування</translation> - </message> - <message> - <source>Show toolbar</source> - <translation>Показати панель инструментів</translation> - </message> - <message> - <source>read-only</source> - <translation>тільки для читання</translation> - </message> - <message> - <source>Toggle window</source> - <translation>Перемкнути вікно</translation> - </message> - <message> - <source>KeePass 2 Database</source> - <translation>Сховище KeePass 2</translation> - </message> - <message> - <source>All files</source> - <translation>Всі файли</translation> - </message> - <message> - <source>Save repaired database</source> - <translation>Зберегти налагоджене сховище</translation> - </message> - <message> - <source>Writing the database failed.</source> - <translation>Записати сховище не вдалося.</translation> + <source>&Database</source> + <translation>Сховище</translation> </message> <message> <source>&Recent databases</source> <translation>Останні сховища</translation> </message> + <message> + <source>Import</source> + <translation>Імпорт</translation> + </message> + <message> + <source>&Help</source> + <translation>Довідка</translation> + </message> <message> <source>E&ntries</source> <translation>Записи</translation> @@ -1418,13 +2450,17 @@ This is a one-way migration. You won't be able to open the imported databas <source>Copy att&ribute to clipboard</source> <translation>Копіювати атрибут до буферу обміну</translation> </message> + <message> + <source>Time-based one-time password</source> + <translation type="unfinished"/> + </message> <message> <source>&Groups</source> <translation>Групи</translation> </message> <message> - <source>&View</source> - <translation>Перегляд</translation> + <source>&Tools</source> + <translation>Інструменти</translation> </message> <message> <source>&Quit</source> @@ -1434,6 +2470,10 @@ This is a one-way migration. You won't be able to open the imported databas <source>&About</source> <translation>Про KeePassXC</translation> </message> + <message> + <source>&Open database...</source> + <translation>Відкрити сховище…</translation> + </message> <message> <source>&Save database</source> <translation>Зберігти сховище</translation> @@ -1474,26 +2514,26 @@ This is a one-way migration. You won't be able to open the imported databas <source>&Delete group</source> <translation>Видалити групу</translation> </message> + <message> + <source>Sa&ve database as...</source> + <translation>Зберегти сховище як…</translation> + </message> + <message> + <source>Change &master key...</source> + <translation>Змінити головний ключ…</translation> + </message> <message> <source>&Database settings</source> <translation>Налаштування сховища</translation> </message> + <message> + <source>Database settings</source> + <translation>Параметри сховища</translation> + </message> <message> <source>&Clone entry</source> <translation>Клонувати запис</translation> </message> - <message> - <source>Timed one-time password</source> - <translation>Тимчасове одноразове гасло</translation> - </message> - <message> - <source>Copy &TOTP</source> - <translation>Скопіювати ТОГ</translation> - </message> - <message> - <source>Show TOTP</source> - <translation>Показати ТОГ</translation> - </message> <message> <source>&Find</source> <translation>Пошук</translation> @@ -1502,14 +2542,26 @@ This is a one-way migration. You won't be able to open the imported databas <source>Copy &username</source> <translation>Копіювати ім'я користувача</translation> </message> + <message> + <source>Copy username to clipboard</source> + <translation>Копіювати ім’я користувача в буфер обміну</translation> + </message> <message> <source>Cop&y password</source> <translation>Копіювати гасло</translation> </message> + <message> + <source>Copy password to clipboard</source> + <translation>Копіювати гасло в буфер обміну</translation> + </message> <message> <source>&Settings</source> <translation>Налаштування</translation> </message> + <message> + <source>Password Generator</source> + <translation>Виробник гасел</translation> + </message> <message> <source>&Perform Auto-Type</source> <translation>Виконати автозаповнення</translation> @@ -1526,65 +2578,25 @@ This is a one-way migration. You won't be able to open the imported databas <source>&Title</source> <translation>Заголовок</translation> </message> + <message> + <source>Copy title to clipboard</source> + <translation type="unfinished"/> + </message> <message> <source>&URL</source> <translation>&URL</translation> </message> + <message> + <source>Copy URL to clipboard</source> + <translation type="unfinished"/> + </message> <message> <source>&Notes</source> <translation>Нотатки</translation> </message> <message> - <source>Password Generator</source> - <translation>Виробник гасел</translation> - </message> - <message> - <source>Clear history</source> - <translation>Очистити журнал</translation> - </message> - <message> - <source>&Database</source> - <translation>Сховище</translation> - </message> - <message> - <source>Import</source> - <translation>Імпорт</translation> - </message> - <message> - <source>&Tools</source> - <translation>Інструменти</translation> - </message> - <message> - <source>Empty recycle bin</source> - <translation>Спорожнити смітник</translation> - </message> - <message> - <source>Access error for config file %1</source> - <translation>Помилка доступу до файлу конфігурації %1</translation> - </message> - <message> - <source>Quit KeePassXC</source> - <translation>Вийти з KeePassXC</translation> - </message> - <message> - <source>Please touch the button on your YubiKey!</source> - <translation>Натисніть, будь ласка, кнопку на вашому YubiKey!</translation> - </message> - <message> - <source>&Help</source> - <translation>Довідка</translation> - </message> - <message> - <source>&Open database...</source> - <translation>Відкрити сховище…</translation> - </message> - <message> - <source>Sa&ve database as...</source> - <translation>Зберегти сховище як…</translation> - </message> - <message> - <source>Change &master key...</source> - <translation>Змінити головний ключ…</translation> + <source>Copy notes to clipboard</source> + <translation type="unfinished"/> </message> <message> <source>&Export to CSV file...</source> @@ -1602,10 +2614,169 @@ This is a one-way migration. You won't be able to open the imported databas <source>Re&pair database...</source> <translation>Полагодити сховище…</translation> </message> + <message> + <source>Show TOTP</source> + <translation>Показати ТОГ</translation> + </message> <message> <source>Set up TOTP...</source> <translation>Налаштувати ТОГ…</translation> </message> + <message> + <source>Copy &TOTP</source> + <translation>Скопіювати ТОГ</translation> + </message> + <message> + <source>E&mpty recycle bin</source> + <translation type="unfinished"/> + </message> + <message> + <source>Clear history</source> + <translation>Очистити журнал</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation>Помилка доступу до файлу конфігурації %1</translation> + </message> + <message> + <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> + <translation type="unfinished"/> + </message> + <message> + <source>read-only</source> + <translation>тільки для читання</translation> + </message> + <message> + <source>Settings</source> + <translation>Налаштування</translation> + </message> + <message> + <source>Toggle window</source> + <translation>Перемкнути вікно</translation> + </message> + <message> + <source>Quit KeePassXC</source> + <translation>Вийти з KeePassXC</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>Сховище KeePass 2</translation> + </message> + <message> + <source>All files</source> + <translation>Всі файли</translation> + </message> + <message> + <source>Open database</source> + <translation>Відкрити сховище</translation> + </message> + <message> + <source>Save repaired database</source> + <translation>Зберегти налагоджене сховище</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>Записати сховище не вдалося.</translation> + </message> + <message> + <source>Please touch the button on your YubiKey!</source> + <translation>Натисніть, будь ласка, кнопку на вашому YubiKey!</translation> + </message> +</context> +<context> + <name>OpenSSHKey</name> + <message> + <source>Invalid key file, expecting an OpenSSH key</source> + <translation type="unfinished"/> + </message> + <message> + <source>PEM boundary mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>This is not an OpenSSH key, only modern keys are supported</source> + <translation type="unfinished"/> + </message> + <message> + <source>Base64 decoding failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file way too small.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file magic header id invalid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Found zero keys</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to read public key.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Corrupted key file, reading private key failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>No private key payload to decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Trying to run KDF without cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Passphrase is required to decrypt this key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key derivation failed, key file corrupted?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Decryption failed, wrong passphrase?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write public key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write private key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing private key</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OptionDialog</name> @@ -1613,22 +2784,63 @@ This is a one-way migration. You won't be able to open the imported databas <source>Dialog</source> <translation>Діалог</translation> </message> + <message> + <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation>Це необхідно, щоб надати ChromeIPass або PassIFox доступ до вашого сховища</translation> + </message> + <message> + <source>Enable KeePassHTTP server</source> + <translation>Увімкнути сервер KeePassHTTP</translation> + </message> <message> <source>General</source> <translation>Загальні</translation> </message> <message> <source>Sh&ow a notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> <translation>Показувати повідомлення, коли надходить запит на реєстраційні дані</translation> </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>Показувати лише найкращі збіги для певного URL замість усіх записів для всієї області. </translation> + </message> + <message> + <source>&Return only best matching entries</source> + <translation>Показувати лише найкращі збіги</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Запитувати щодо розблокування сховища, якщо воно заблоковане</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> + <translation>Показані тільки записи з такою самою схемою (http://, https://, ftp://, …).</translation> + </message> + <message> + <source>&Match URL schemes</source> + <translation>Узгодити зі схемами URL</translation> + </message> <message> <source>Sort matching entries by &username</source> <translation>Сортувати збіги за ім'ям користувача</translation> </message> + <message> + <source>Sort &matching entries by title</source> + <translation>Сортувати збіги за заголовком</translation> + </message> + <message> + <source>R&emove all shared encryption keys from active database</source> + <translation>Видалити всі спільні шифрувальні ключі з активного сховища</translation> + </message> <message> <source>Re&move all stored permissions from entries in active database</source> <translation>Видалити всі збережені привілеї для записів у активному сховищу</translation> </message> + <message> + <source>Password Generator</source> + <translation>Виробник гасел</translation> + </message> <message> <source>Advanced</source> <translation>Розширені</translation> @@ -1641,10 +2853,22 @@ This is a one-way migration. You won't be able to open the imported databas <source>Always allow &updating entries</source> <translation>Завжди дозволяти оновлення записів</translation> </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>Тільки вибране сховище має бути під'єднаним через клієнта.</translation> + </message> <message> <source>Searc&h in all opened databases for matching entries</source> <translation>Шукати збіги у всіх відкритих сховищах</translation> </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>Автоматичне створення та оновлення текстових полів не втілене.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>Показати розширені текстові поля, що починаються з «KPH: »</translation> + </message> <message> <source>HTTP Port:</source> <translation>Шлюз HTTP:</translation> @@ -1653,18 +2877,18 @@ This is a one-way migration. You won't be able to open the imported databas <source>Default port: 19455</source> <translation> Типовий шлюз: 19455</translation> </message> - <message> - <source>Re&quest to unlock the database if it is locked</source> - <translation>Запитувати щодо розблокування сховища, якщо воно заблоковане</translation> - </message> - <message> - <source>Sort &matching entries by title</source> - <translation>Сортувати збіги за заголовком</translation> - </message> <message> <source>KeePassXC will listen to this port on 127.0.0.1</source> <translation>KeePassXC чекатиме на сигнали через цей шлюз за адресою 127.0.0.1</translation> </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> + <translation type="unfinished"/> + </message> <message> <source>Cannot bind to privileged ports</source> <translation>Неможливо приєднатись до привілейованих шлюзів</translation> @@ -1675,63 +2899,30 @@ Using default port 19455.</source> <translation>Неможливо приєднатись до привілейованих шлюзів нижче 1024! Натомість буде використано шлюз 19455.</translation> </message> - <message> - <source>R&emove all shared encryption keys from active database</source> - <translation>Видалити всі спільні шифрувальні ключі з активного сховища</translation> - </message> - <message> - <source>&Return advanced string fields which start with "KPH: "</source> - <translation>Показати розширені текстові поля, що починаються з «KPH: »</translation> - </message> - <message> - <source>Automatically creating or updating string fields is not supported.</source> - <translation>Автоматичне створення та оновлення текстових полів не втілене.</translation> - </message> - <message> - <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> - <translation>Це необхідно, щоб надати ChromeIPass або PassIFox доступ до вашого сховища</translation> - </message> - <message> - <source>Enable KeePassHTTP server</source> - <translation>Увімкнути сервер KeePassHTTP</translation> - </message> - <message> - <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation>Показувати лише найкращі збіги для певного URL замість усіх записів для всієї області. </translation> - </message> - <message> - <source>&Return only best matching entries</source> - <translation>Показувати лише найкращі збіги</translation> - </message> - <message> - <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation>Показані тільки записи з такою самою схемою (http://, https://, ftp://, …).</translation> - </message> - <message> - <source>&Match URL schemes</source> - <translation>Узгодити зі схемами URL</translation> - </message> - <message> - <source>Password Generator</source> - <translation>Виробник гасел</translation> - </message> - <message> - <source>Only the selected database has to be connected with a client.</source> - <translation>Тільки вибране сховище має бути під'єднаним через клієнта.</translation> - </message> - <message> - <source>The following options can be dangerous! -Change them only if you know what you are doing.</source> - <translation>Змінення цих налаштувань може бути небезпечним! -Змінюйте тільки якщо Ви певно знаєте, що ви робите.</translation> - </message> </context> <context> <name>PasswordGeneratorWidget</name> + <message> + <source>%p%</source> + <translation>%p%</translation> + </message> <message> <source>Password:</source> <translation>Гасло:</translation> </message> + <message> + <source>strength</source> + <comment>Password strength</comment> + <translation>надійність</translation> + </message> + <message> + <source>entropy</source> + <translation>ентропія</translation> + </message> + <message> + <source>Password</source> + <translation>Гасло</translation> + </message> <message> <source>Character Types</source> <translation>Види символів</translation> @@ -1752,38 +2943,50 @@ Change them only if you know what you are doing.</source> <source>Special Characters</source> <translation>Спеціальні символи</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>Розширені ASCII</translation> + </message> <message> <source>Exclude look-alike characters</source> <translation>Виключити неоднозначні символи</translation> </message> - <message> - <source>Accept</source> - <translation>Прийняти</translation> - </message> - <message> - <source>%p%</source> - <translation>%p%</translation> - </message> - <message> - <source>strength</source> - <translation>надійність</translation> - </message> - <message> - <source>entropy</source> - <translation>ентропія</translation> - </message> - <message> - <source>&Length:</source> - <translation>Довжина:</translation> - </message> <message> <source>Pick characters from every group</source> <translation>Використати символи з кожної групи</translation> </message> + <message> + <source>&Length:</source> + <translation>Довжина:</translation> + </message> + <message> + <source>Passphrase</source> + <translation>Вираз гасла</translation> + </message> + <message> + <source>Wordlist:</source> + <translation>Перелік слів:</translation> + </message> + <message> + <source>Word Count:</source> + <translation>Кількість слів</translation> + </message> + <message> + <source>Word Separator:</source> + <translation>Розділювач слів</translation> + </message> <message> <source>Generate</source> <translation>Створити</translation> </message> + <message> + <source>Copy</source> + <translation>Копіювати</translation> + </message> + <message> + <source>Accept</source> + <translation>Прийняти</translation> + </message> <message> <source>Close</source> <translation>Закрити</translation> @@ -1802,51 +3005,270 @@ Change them only if you know what you are doing.</source> </message> <message> <source>Poor</source> + <comment>Password quality</comment> <translation>Погана</translation> </message> <message> <source>Weak</source> + <comment>Password quality</comment> <translation>Низька</translation> </message> <message> <source>Good</source> + <comment>Password quality</comment> <translation>Добра</translation> </message> <message> <source>Excellent</source> + <comment>Password quality</comment> <translation>Відмінна</translation> </message> - <message> - <source>Password</source> - <translation>Гасло</translation> - </message> - <message> - <source>Extended ASCII</source> - <translation>Розширені ASCII</translation> - </message> - <message> - <source>Passphrase</source> - <translation>Вираз гасла</translation> - </message> - <message> - <source>Wordlist:</source> - <translation>Перелік слів:</translation> - </message> - <message> - <source>Word Count:</source> - <translation>Кількість слів</translation> - </message> - <message> - <source>Word Separator:</source> - <translation>Розділювач слів</translation> - </message> - <message> - <source>Copy</source> - <translation>Копіювати</translation> - </message> </context> <context> <name>QObject</name> + <message> + <source>Database not opened</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database hash not available</source> + <translation type="unfinished"/> + </message> + <message> + <source>Client public key not received</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot decrypt message</source> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout or cannot connect to KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>Action cancelled or denied</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC association failed, try again</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key change was not successful</source> + <translation type="unfinished"/> + </message> + <message> + <source>Encryption key is not recognized</source> + <translation type="unfinished"/> + </message> + <message> + <source>No saved databases found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect action</source> + <translation type="unfinished"/> + </message> + <message> + <source>Empty message received</source> + <translation type="unfinished"/> + </message> + <message> + <source>No URL provided</source> + <translation type="unfinished"/> + </message> + <message> + <source>No logins found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown error</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add a new entry to a database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>Шлях до сховища.</translation> + </message> + <message> + <source>Key file of the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>path</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>username</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Prompt for the entry's password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a password for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length for the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to add.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy an entry's password to the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to clip.</source> + <comment>clip = copy to clipboard</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout in seconds before clearing the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Edit an entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Title for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>title</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to edit.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Estimate the entropy of a password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password for which to estimate the entropy.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Perform advanced analysis on the password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Extract and print the content of a database.</source> + <translation>Видобути і надрукувати вміст сховища.</translation> + </message> + <message> + <source>Path of the database to extract.</source> + <translation>Шлях до сховища, щоб відкрити.</translation> + </message> + <message> + <source>Insert password to unlock %1: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to load key file %1 : %2</source> + <translation type="unfinished"/> + </message> + <message> + <source>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source> + +Available commands: +</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the command to execute.</source> + <translation>Назва команди до виконання.</translation> + </message> + <message> + <source>List database entries.</source> + <translation>Показати перелік сховищ.</translation> + </message> + <message> + <source>Path of the group to list. Default is /</source> + <translation>Шлях групи. Типовим є /</translation> + </message> + <message> + <source>Find entries quickly.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Search term.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Merge two databases.</source> + <translation>Об'єднати два сховища.</translation> + </message> + <message> + <source>Path of the database to merge into.</source> + <translation>Шлях до сховища, з яким об'єднати.</translation> + </message> + <message> + <source>Path of the database to merge from.</source> + <translation>Шлях до сховища, яке об'єднати.</translation> + </message> + <message> + <source>Use the same credentials for both database files.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file of the database to merge from.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show an entry's information.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> + <translation type="unfinished"/> + </message> + <message> + <source>attribute</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the entry to show.</source> + <translation>Назва запису для показу.</translation> + </message> <message> <source>NULL device</source> <translation>NULL пристрій</translation> @@ -1870,8 +3292,28 @@ Change them only if you know what you are doing.</source> <translation>бракує закривальних лапок</translation> </message> <message> - <source>INTERNAL - unget lower bound exceeded</source> - <translation>ВНУТРІШНЯ: успішне звільнення нижньої межі</translation> + <source>AES: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Twofish: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>ChaCha20: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Argon2 (KDBX 4 – recommended)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 4)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 3.1)</source> + <translation type="unfinished"/> </message> <message> <source>Group</source> @@ -1889,14 +3331,22 @@ Change them only if you know what you are doing.</source> <source>Password</source> <translation>Гасло</translation> </message> - <message> - <source>URL</source> - <translation>URL</translation> - </message> <message> <source>Notes</source> <translation>Примітки</translation> </message> + <message> + <source>Last Modified</source> + <translation type="unfinished"/> + </message> + <message> + <source>Created</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy Browser Integration</source> + <translation type="unfinished"/> + </message> <message> <source>Browser Integration</source> <translation>Підключення до переглядача</translation> @@ -1913,6 +3363,10 @@ Change them only if you know what you are doing.</source> <source>Passive</source> <translation>Пасивне</translation> </message> + <message> + <source>SSH Agent</source> + <translation type="unfinished"/> + </message> </context> <context> <name>QtIOCompressor</name> @@ -1951,8 +3405,8 @@ Change them only if you know what you are doing.</source> <context> <name>SearchWidget</name> <message> - <source>Case Sensitive</source> - <translation>Чутливість до регістру</translation> + <source>Search...</source> + <translation>Шукати...</translation> </message> <message> <source>Search</source> @@ -1963,8 +3417,8 @@ Change them only if you know what you are doing.</source> <translation>Очистити</translation> </message> <message> - <source>Search...</source> - <translation>Шукати...</translation> + <source>Case Sensitive</source> + <translation>Чутливість до регістру</translation> </message> <message> <source>Limit search to selected group</source> @@ -1973,50 +3427,6 @@ Change them only if you know what you are doing.</source> </context> <context> <name>Service</name> - <message> - <source>A shared encryption-key with the name "%1" already exists. -Do you want to overwrite it?</source> - <translation>Спільний ключ шифрування з назвою «%1» вже існує. -Перезаписати його?</translation> - </message> - <message> - <source>Do you want to update the information in %1 - %2?</source> - <translation>Бажаєте оновити інформацію у %1 – %2?</translation> - </message> - <message> - <source>The active database is locked! -Please unlock the selected database or choose another one which is unlocked.</source> - <translation>Чинне сховище заблоковане! -Будь ласка, розблокуйте обране сховище або виберіть інше незаблоковане.</translation> - </message> - <message> - <source>Successfully removed %1 encryption-%2 from KeePassX/Http Settings.</source> - <translation>Успішно видалив %1 шифрування-%2 з налаштувань KeePassX/KeePassHttp.</translation> - </message> - <message> - <source>No shared encryption-keys found in KeePassHttp Settings.</source> - <translation>Не знайдено спільних ключів шифрування у налаштуваннях KeePassHttp.</translation> - </message> - <message> - <source>The active database does not contain an entry of KeePassHttp Settings.</source> - <translation>Поточне сховище не містить налаштувань KeePassHttp.</translation> - </message> - <message> - <source>Removing stored permissions...</source> - <translation>Видалення збережених привілеїв…</translation> - </message> - <message> - <source>Abort</source> - <translation>Скасувати</translation> - </message> - <message> - <source>Successfully removed permissions from %1 %2.</source> - <translation>Успішно видалив привелеї для %1 %2.</translation> - </message> - <message> - <source>The active database does not contain an entry with permissions.</source> - <translation>Поточне сховище не містить записів з привілеями…</translation> - </message> <message> <source>KeePassXC: New key association request</source> <translation>KeePassXC: новий запит на прив'язку ключа</translation> @@ -2033,34 +3443,78 @@ give it a unique name to identify and accept it.</source> <source>KeePassXC: Overwrite existing key?</source> <translation>KeePassXC: перезаписати наявний ключ?</translation> </message> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>Спільний ключ шифрування з назвою «%1» вже існує. +Перезаписати його?</translation> + </message> <message> <source>KeePassXC: Update Entry</source> <translation>KeePassXC: оновити запис</translation> </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Бажаєте оновити інформацію у %1 – %2?</translation> + </message> <message> <source>KeePassXC: Database locked!</source> <translation>KeePassXC: сховище заблоковане!</translation> </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>Чинне сховище заблоковане! +Будь ласка, розблокуйте обране сховище або виберіть інше незаблоковане.</translation> + </message> <message> <source>KeePassXC: Removed keys from database</source> <translation>KeePassXC: ключі видалені зі сховища</translation> </message> + <message numerus="yes"> + <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No keys found</source> <translation>KeePassXC: жодного ключа не знайдено</translation> </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation>Не знайдено спільних ключів шифрування у налаштуваннях KeePassHttp.</translation> + </message> <message> <source>KeePassXC: Settings not available!</source> <translation>KeePassXC: налаштування недоступні!</translation> </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation>Поточне сховище не містить налаштувань KeePassHttp.</translation> + </message> + <message> + <source>Removing stored permissions...</source> + <translation>Видалення збережених привілеїв…</translation> + </message> + <message> + <source>Abort</source> + <translation>Скасувати</translation> + </message> <message> <source>KeePassXC: Removed permissions</source> <translation>KeePassXC: привілеї видалені</translation> </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entries.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No entry with permissions found!</source> <translation>KeePassXC: запис з привілеями не знайдено!</translation> </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>Поточне сховище не містить записів з привілеями…</translation> + </message> </context> <context> <name>SettingsWidget</name> @@ -2083,10 +3537,26 @@ give it a unique name to identify and accept it.</source> </context> <context> <name>SettingsWidgetGeneral</name> + <message> + <source>Basic Settings</source> + <translation>Базові налаштування</translation> + </message> + <message> + <source>Start only a single instance of KeePassXC</source> + <translation>Запускати лише один примірник KeePassXC</translation> + </message> <message> <source>Remember last databases</source> <translation>Пам’ятати останнє сховище</translation> </message> + <message> + <source>Remember last key files and security dongles</source> + <translation>Пам'ятати останні файли ключів і механізми захисту</translation> + </message> + <message> + <source>Load previous databases on startup</source> + <translation>Завантажувати попереднє сховище під час запуску</translation> + </message> <message> <source>Automatically save on exit</source> <translation>Автоматично зберігати при виході</translation> @@ -2095,21 +3565,29 @@ give it a unique name to identify and accept it.</source> <source>Automatically save after every change</source> <translation>Автоматично зберігати після кожної зміни</translation> </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation>Автоматично перезавантажувати сховище після зовнішніх змін</translation> + </message> <message> <source>Minimize when copying to clipboard</source> <translation>Згортати при копіюванні до буфера обміну</translation> </message> + <message> + <source>Minimize window at application startup</source> + <translation>Згорнути вікно після запуску застосунку</translation> + </message> <message> <source>Use group icon on entry creation</source> <translation>Використовувати для нових записів значок групи</translation> </message> <message> - <source>Global Auto-Type shortcut</source> - <translation>Глобальні сполучення клавіш для автозаповнення</translation> + <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> + <translation>Не помічати сховище зміненим після змін, що не стосуються даних (напр. розкриття груп)</translation> </message> <message> - <source>Language</source> - <translation>Мова</translation> + <source>Hide the Details view</source> + <translation type="unfinished"/> </message> <message> <source>Show a system tray icon</source> @@ -2119,67 +3597,61 @@ give it a unique name to identify and accept it.</source> <source>Hide window to system tray when minimized</source> <translation>При згортанні ховати вікно в область системних повідомлень</translation> </message> - <message> - <source>Load previous databases on startup</source> - <translation>Завантажувати попереднє сховище під час запуску</translation> - </message> - <message> - <source>Automatically reload the database when modified externally</source> - <translation>Автоматично перезавантажувати сховище після зовнішніх змін</translation> - </message> <message> <source>Hide window to system tray instead of app exit</source> <translation>Ховати вікно у системний лоток замість закриття застосунку.</translation> </message> <message> - <source>Minimize window at application startup</source> - <translation>Згорнути вікно після запуску застосунку</translation> + <source>Dark system tray icon</source> + <translation type="unfinished"/> </message> <message> - <source>Basic Settings</source> - <translation>Базові налаштування</translation> - </message> - <message> - <source>Remember last key files and security dongles</source> - <translation>Пам'ятати останні файли ключів і механізми захисту</translation> - </message> - <message> - <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> - <translation>Не помічати сховище зміненим після змін, що не стосуються даних (напр. розкриття груп)</translation> + <source>Language</source> + <translation>Мова</translation> </message> <message> <source>Auto-Type</source> <translation>Автозаповнення</translation> </message> <message> - <source>Use entry title and URL to match windows for global Auto-Type</source> - <translation>Використовувати заголовок запису і URL для добору вікон у загальному автозаповненні</translation> + <source>Use entry title to match windows for global Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use entry URL to match windows for global Auto-Type</source> + <translation type="unfinished"/> </message> <message> <source>Always ask before performing Auto-Type</source> <translation>Завжди питати перед автозаповненням</translation> </message> + <message> + <source>Global Auto-Type shortcut</source> + <translation>Глобальні сполучення клавіш для автозаповнення</translation> + </message> <message> <source>Auto-Type delay</source> <translation>Затримка автозаповнення</translation> </message> <message> <source> ms</source> + <comment>Milliseconds</comment> <translation>мс</translation> </message> - <message> - <source>Start only a single instance of KeePassXC</source> - <translation>Запускати лише один примірник KeePassXC</translation> - </message> </context> <context> <name>SettingsWidgetSecurity</name> + <message> + <source>Timeouts</source> + <translation>Час очикування</translation> + </message> <message> <source>Clear clipboard after</source> <translation>Очищати буфер обміну через</translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation>сек</translation> </message> <message> @@ -2187,8 +3659,12 @@ give it a unique name to identify and accept it.</source> <translation>Заблокувати сховище, неактивне протягом</translation> </message> <message> - <source>Show passwords in cleartext by default</source> - <translation>Типово показувати гасло у відкритому вигляді</translation> + <source>Convenience</source> + <translation>Зручність</translation> + </message> + <message> + <source>Lock databases when session is locked or lid is closed</source> + <translation>Блокувати сховища після блокування сесії або закриття кришки пристрою</translation> </message> <message> <source>Lock databases after minimizing the window</source> @@ -2199,16 +3675,16 @@ give it a unique name to identify and accept it.</source> <translation>Не запитувати підтвердження гасла, якщо воно не приховане</translation> </message> <message> - <source>Timeouts</source> - <translation>Час очикування</translation> + <source>Show passwords in cleartext by default</source> + <translation>Типово показувати гасло у відкритому вигляді</translation> </message> <message> - <source>Convenience</source> - <translation>Зручність</translation> + <source>Hide passwords in the preview panel</source> + <translation type="unfinished"/> </message> <message> - <source>Lock databases when session is locked or lid is closed</source> - <translation>Блокувати сховища після блокування сесії або закриття кришки пристрою</translation> + <source>Hide entry notes by default</source> + <translation type="unfinished"/> </message> <message> <source>Privacy</source> @@ -2229,6 +3705,14 @@ give it a unique name to identify and accept it.</source> <source>Key:</source> <translation>Ключ:</translation> </message> + <message> + <source>Default RFC 6238 token settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Steam token settings</source> + <translation type="unfinished"/> + </message> <message> <source>Use custom settings</source> <translation>Використовувати власні налаштування</translation> @@ -2255,6 +3739,7 @@ give it a unique name to identify and accept it.</source> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation>сек</translation> </message> </context> @@ -2321,6 +3806,26 @@ give it a unique name to identify and accept it.</source> </context> <context> <name>main</name> + <message> + <source>Remove an entry from the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>Шлях до сховища.</translation> + </message> + <message> + <source>Path of the entry to remove.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation>KeePassXC – багатоплатформовий керманич гасел</translation> + </message> + <message> + <source>filenames of the password databases to open (*.kdbx)</source> + <translation>Назви файлів сховищ, які треба відкрити (*.kdbx)</translation> + </message> <message> <source>path to a custom config file</source> <translation>шлях до власного файла налаштувань</translation> @@ -2329,81 +3834,13 @@ give it a unique name to identify and accept it.</source> <source>key file of the database</source> <translation>файл-ключ сховища</translation> </message> - <message> - <source>KeePassXC - cross-platform password manager</source> - <translation>KeePassXC – багатоплатформовий керманич гасел</translation> - </message> <message> <source>read password of the database from stdin</source> <translation>прочитати гасло для сховища зі stdin</translation> </message> <message> - <source>filenames of the password databases to open (*.kdbx)</source> - <translation>Назви файлів сховищ, які треба відкрити (*.kdbx)</translation> - </message> - <message> - <source>Copy a password to the clipboard</source> - <translation>Скопіювати гасло до буферу обміну</translation> - </message> - <message> - <source>Path of the database.</source> - <translation>Шлях до сховища.</translation> - </message> - <message> - <source>Use a GUI prompt unlocking the database.</source> - <translation>Використовувати графічний інтерфейс для розблокування сховища.</translation> - </message> - <message> - <source>Name of the entry to clip.</source> - <translation>Назва запису для відтинання.</translation> - </message> - <message> - <source>Extract and print the content of a database.</source> - <translation>Видобути і надрукувати вміст сховища.</translation> - </message> - <message> - <source>Path of the database to extract.</source> - <translation>Шлях до сховища, щоб відкрити.</translation> - </message> - <message> - <source>Name of the command to execute.</source> - <translation>Назва команди до виконання.</translation> - </message> - <message> - <source>List database entries.</source> - <translation>Показати перелік сховищ.</translation> - </message> - <message> - <source>Path of the group to list. Default is /</source> - <translation>Шлях групи. Типовим є /</translation> - </message> - <message> - <source>Print the UUIDs of the entries and groups.</source> - <translation>Показувати UUID для записів і груп.</translation> - </message> - <message> - <source>Merge two databases.</source> - <translation>Об'єднати два сховища.</translation> - </message> - <message> - <source>Path of the database to merge into.</source> - <translation>Шлях до сховища, з яким об'єднати.</translation> - </message> - <message> - <source>Path of the database to merge from.</source> - <translation>Шлях до сховища, яке об'єднати.</translation> - </message> - <message> - <source>Use the same password for both database files.</source> - <translation>Використовувати те саме гасло для обох сховищ.</translation> - </message> - <message> - <source>Show a password.</source> - <translation>Показати гасло.</translation> - </message> - <message> - <source>Name of the entry to show.</source> - <translation>Назва запису для показу.</translation> + <source>Parent window handle</source> + <translation type="unfinished"/> </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_zh_CN.ts b/share/translations/keepassx_zh_CN.ts index 0d5e2806f..1cc8b409b 100644 --- a/share/translations/keepassx_zh_CN.ts +++ b/share/translations/keepassx_zh_CN.ts @@ -9,14 +9,34 @@ <source>About</source> <translation>关于</translation> </message> + <message> + <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> + <translation>前往报告 bug:<a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> + </message> + <message> + <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>KeePassXC 使用第 2 版 GNU 通用公共授权协议(GPL)分发,你也可以根据需要选用第 3 版。</translation> + </message> + <message> + <source>Project Maintainers:</source> + <translation>项目维护者:</translation> + </message> <message> <source>Contributors</source> <translation>贡献者</translation> </message> + <message> + <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">在 GitHub 上查阅贡献信息</a></translation> + </message> <message> <source>Debug Info</source> <translation>调试信息</translation> </message> + <message> + <source>Include the following information whenever you report a bug:</source> + <translation>报告任何 bug 时,请包含以下信息:</translation> + </message> <message> <source>Copy to clipboard</source> <translation>复制到剪贴板</translation> @@ -31,6 +51,10 @@ <source>Revision: %1</source> <translation>修订版本:%1</translation> </message> + <message> + <source>Distribution: %1</source> + <translation>发行版: %1</translation> + </message> <message> <source>Libraries:</source> <translation>库:</translation> @@ -47,33 +71,13 @@ CPU 架构:%2 <source>Enabled extensions:</source> <translation>已启用的扩展:</translation> </message> - <message> - <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> - <translation>前往报告 bug:<a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> - </message> - <message> - <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassXC 使用第 2 版 GNU 通用公共授权协议(GPL)分发,你也可以根据需要选用第 3 版。</translation> - </message> - <message> - <source>Project Maintainers:</source> - <translation>项目维护者:</translation> - </message> - <message> - <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">在 GitHub 上查阅贡献信息</a></translation> - </message> - <message> - <source>Include the following information whenever you report a bug:</source> - <translation>报告任何 bug 时,请包含以下信息:</translation> - </message> - <message> - <source>Distribution: %1</source> - <translation type="unfinished"/> - </message> </context> <context> <name>AccessControlDialog</name> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>KeePassXC HTTP 确认访问</translation> + </message> <message> <source>Remember this decision</source> <translation>记住此选项</translation> @@ -92,9 +96,12 @@ Please select whether you want to allow access.</source> <translation>%1 请求获取这些条目的密码。 请选择是否允许。</translation> </message> +</context> +<context> + <name>AgentSettingsWidget</name> <message> - <source>KeePassXC HTTP Confirm Access</source> - <translation>KeePassXC HTTP 确认访问</translation> + <source>Enable SSH Agent (requires restart)</source> + <translation type="unfinished"/> </message> </context> <context> @@ -107,6 +114,26 @@ Please select whether you want to allow access.</source> <source>Auto-Type - KeePassXC</source> <translation>KeePassXC - 自动输入</translation> </message> + <message> + <source>Auto-Type</source> + <translation>自动输入</translation> + </message> + <message> + <source>The Syntax of your Auto-Type statement is incorrect!</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> </context> <context> <name>AutoTypeAssociationsModel</name> @@ -125,13 +152,290 @@ Please select whether you want to allow access.</source> </context> <context> <name>AutoTypeSelectDialog</name> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>KeePassXC - 自动输入</translation> + </message> <message> <source>Select entry to Auto-Type:</source> <translation>选择自动输入的项目</translation> </message> +</context> +<context> + <name>BrowserAccessControlDialog</name> <message> - <source>Auto-Type - KeePassXC</source> - <translation>KeePassXC - 自动输入</translation> + <source>KeePassXC-Browser Confirm Access</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remember this decision</source> + <translation>记住此选项</translation> + </message> + <message> + <source>Allow</source> + <translation>允许</translation> + </message> + <message> + <source>Deny</source> + <translation>拒绝</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 请求获取这些条目的密码。 +请选择是否允许。</translation> + </message> +</context> +<context> + <name>BrowserOptionDialog</name> + <message> + <source>Dialog</source> + <translation>对话框</translation> + </message> + <message> + <source>This is required for accessing your databases with KeePassXC-Browser</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable KeepassXC browser integration</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>常规</translation> + </message> + <message> + <source>Enable integration for these browsers:</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Google Chrome</source> + <translation>&Google Chrome</translation> + </message> + <message> + <source>&Firefox</source> + <translation>&Firefox</translation> + </message> + <message> + <source>&Chromium</source> + <translation>&Chromium</translation> + </message> + <message> + <source>&Vivaldi</source> + <translation>&Vivaldi</translation> + </message> + <message> + <source>Show a &notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>数据库锁定时请求解锁(Q)</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Match URL scheme (e.g., https://...)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>只返回特定网址的最佳匹配,而不是整个域名的所有条目。</translation> + </message> + <message> + <source>&Return only best-matching credentials</source> + <translation type="unfinished"/> + </message> + <message> + <source>Sort &matching credentials by title</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Sort matching credentials by &username</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>&Disconnect all browsers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Forget all remembered &permissions</source> + <translation type="unfinished"/> + </message> + <message> + <source>Advanced</source> + <translation>高级</translation> + </message> + <message> + <source>Never &ask before accessing credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Never ask before &updating credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>只有选定的数据库必须与一个客户端连接。</translation> + </message> + <message> + <source>Searc&h in all opened databases for matching credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>不支持自动创建或更新字符串字段。</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>返回以“KPH:”开头的高级字符串字段(R)</translation> + </message> + <message> + <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Update &native messaging manifest files at startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Support a proxy application between KeePassXC and browser extension.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &proxy application between KeePassXC and browser extension</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a custom proxy location if you installed a proxy manually.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &custom proxy location</source> + <comment>Meant is the proxy for KeePassXC-Browser</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*.exe);;All Files (*.*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select custom proxy location</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>BrowserService</name> + <message> + <source>KeePassXC: New key association request</source> + <translation>KeePassXC: 新的密钥关联请求</translation> + </message> + <message> + <source>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Save and allow access</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC︰ 覆盖现有的密钥吗?</translation> + </message> + <message> + <source>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC︰ 更新条目</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>你想更新 %1-%2 中的信息吗?</translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC︰ 数据库被锁定 !</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>激活的数据库被锁定 ! +请解锁选定的数据库或选择另一已解锁的数据库。</translation> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC︰ 设置不可用 !</translation> + </message> + <message> + <source>The active database does not contain a settings entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC︰ 未找到键</translation> + </message> + <message> + <source>No shared encryption keys found in KeePassXC Settings.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC︰ 从数据库中删除键</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <source>Removing stored permissions…</source> + <translation type="unfinished"/> + </message> + <message> + <source>Abort</source> + <translation>中断</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC︰ 已删除的权限</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entry(s).</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation>KeePassXC: 未找到权限的条目!</translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>当前数据库中不包含具有权限的条目。</translation> </message> </context> <context> @@ -148,6 +452,10 @@ Please select whether you want to allow access.</source> <source>Repeat password:</source> <translation>重复密码:</translation> </message> + <message> + <source>&Key file</source> + <translation>密钥文件(K)</translation> + </message> <message> <source>Browse</source> <translation>浏览</translation> @@ -156,6 +464,14 @@ Please select whether you want to allow access.</source> <source>Create</source> <translation>创建</translation> </message> + <message> + <source>Cha&llenge Response</source> + <translation>挑战应答(L)</translation> + </message> + <message> + <source>Refresh</source> + <translation>刷新</translation> + </message> <message> <source>Key files</source> <translation>密钥文件</translation> @@ -176,6 +492,10 @@ Please select whether you want to allow access.</source> <source>Select a key file</source> <translation>选择密钥文件</translation> </message> + <message> + <source>Empty password</source> + <translation>空密码</translation> + </message> <message> <source>Do you really want to use an empty string as password?</source> <translation>你确定要使用空密码?</translation> @@ -191,20 +511,15 @@ Please select whether you want to allow access.</source> %2</translation> </message> <message> - <source>&Key file</source> - <translation>密钥文件(K)</translation> + <source>Legacy key file format</source> + <translation type="unfinished"/> </message> <message> - <source>Cha&llenge Response</source> - <translation>挑战应答(L)</translation> - </message> - <message> - <source>Refresh</source> - <translation>刷新</translation> - </message> - <message> - <source>Empty password</source> - <translation>空密码</translation> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -217,6 +532,10 @@ Please select whether you want to allow access.</source> <source>Clone Options</source> <translation>复制选项</translation> </message> + <message> + <source>Append ' - Clone' to title</source> + <translation>标题后附加 “ - 副本”</translation> + </message> <message> <source>Replace username and password with references</source> <translation>用参考条目替换用户名和密码</translation> @@ -225,10 +544,6 @@ Please select whether you want to allow access.</source> <source>Copy history</source> <translation>复制历史</translation> </message> - <message> - <source>Append ' - Clone' to title</source> - <translation>标题后附加 “ - 副本”</translation> - </message> </context> <context> <name>CsvImportWidget</name> @@ -325,10 +640,6 @@ Please select whether you want to allow access.</source> </context> <context> <name>CsvImportWizard</name> - <message> - <source>Import CSV file</source> - <translation>导入 CSV 文件</translation> - </message> <message> <source>Error</source> <translation>错误</translation> @@ -340,17 +651,17 @@ Please select whether you want to allow access.</source> </context> <context> <name>CsvParserModel</name> - <message> - <source> byte, </source> - <translation>字节,</translation> + <message numerus="yes"> + <source>%n byte(s), </source> + <translation type="unfinished"><numerusform></numerusform></translation> </message> - <message> - <source> rows, </source> - <translation>行,</translation> + <message numerus="yes"> + <source>%n row(s), </source> + <translation type="unfinished"><numerusform></numerusform></translation> </message> - <message> - <source> columns</source> - <translation>列</translation> + <message numerus="yes"> + <source>%n column(s)</source> + <translation type="unfinished"><numerusform></numerusform></translation> </message> </context> <context> @@ -371,6 +682,14 @@ Please select whether you want to allow access.</source> <source>Browse</source> <translation>浏览</translation> </message> + <message> + <source>Refresh</source> + <translation>刷新</translation> + </message> + <message> + <source>Challenge Response:</source> + <translation>挑战应答:</translation> + </message> <message> <source>Unable to open the database.</source> <translation>无法打开数据库</translation> @@ -379,6 +698,21 @@ Please select whether you want to allow access.</source> <source>Can't open key file</source> <translation>无法打开密钥文件</translation> </message> + <message> + <source>Legacy key file format</source> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't show this warning again</source> + <translation type="unfinished"/> + </message> <message> <source>All files</source> <translation>所有文件</translation> @@ -391,14 +725,6 @@ Please select whether you want to allow access.</source> <source>Select key file</source> <translation>选择密钥文件</translation> </message> - <message> - <source>Refresh</source> - <translation>刷新</translation> - </message> - <message> - <source>Challenge Response:</source> - <translation>挑战应答:</translation> - </message> </context> <context> <name>DatabaseRepairWidget</name> @@ -414,14 +740,14 @@ Please select whether you want to allow access.</source> <source>Can't open key file</source> <translation>无法打开密钥文件</translation> </message> - <message> - <source>Database opened fine. Nothing to do.</source> - <translation>数据库打开正常。没什么可做的。</translation> - </message> <message> <source>Unable to open the database.</source> <translation>无法打开数据库</translation> </message> + <message> + <source>Database opened fine. Nothing to do.</source> + <translation>数据库打开正常。没什么可做的。</translation> + </message> <message> <source>Success</source> <translation>成功</translation> @@ -440,40 +766,57 @@ You can now save it.</source> <context> <name>DatabaseSettingsWidget</name> <message> - <source>Database name:</source> - <translation>数据库名称:</translation> + <source>General</source> + <translation>常规</translation> </message> <message> - <source>Database description:</source> - <translation>数据库描述:</translation> + <source>Encryption</source> + <translation type="unfinished"/> </message> <message> - <source>Transform rounds:</source> - <translation>加密次数:</translation> + <source>Number of rounds too high</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> </message> <message> - <source>Default username:</source> - <translation>默认用户名:</translation> + <source>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</source> + <translation type="unfinished"/> </message> <message> - <source> MiB</source> - <translation>MiB</translation> + <source>Understood, keep number</source> + <translation type="unfinished"/> </message> <message> - <source>Benchmark</source> - <translation>基准测试</translation> + <source>Cancel</source> + <translation type="unfinished"/> </message> <message> - <source>Max. history items:</source> - <translation>最大历史记录数:</translation> + <source>Number of rounds too low</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> </message> <message> - <source>Max. history size:</source> - <translation>最大历史记录大小:</translation> + <source>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</source> + <translation type="unfinished"/> </message> <message> - <source>Use recycle bin</source> - <translation>启用回收站</translation> + <source>KDF unchanged</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetEncryption</name> + <message> + <source>Encryption Algorithm:</source> + <translation type="unfinished"/> </message> <message> <source>AES: 256 Bit (default)</source> @@ -484,14 +827,78 @@ You can now save it.</source> <translation>Twofish: 256 位</translation> </message> <message> - <source>Algorithm:</source> - <translation>算法:</translation> + <source>Key Derivation Function:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Transform rounds:</source> + <translation>加密次数:</translation> + </message> + <message> + <source>Benchmark 1-second delay</source> + <translation type="unfinished"/> + </message> + <message> + <source>Memory Usage:</source> + <translation type="unfinished"/> + </message> + <message> + <source> MB</source> + <translation>MB</translation> + </message> + <message> + <source>Parallelism:</source> + <translation type="unfinished"/> + </message> + <message> + <source> thread</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetGeneral</name> + <message> + <source>Database Meta Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database name:</source> + <translation>数据库名称:</translation> + </message> + <message> + <source>Database description:</source> + <translation>数据库描述:</translation> + </message> + <message> + <source>Default username:</source> + <translation>默认用户名:</translation> + </message> + <message> + <source>History Settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Max. history items:</source> + <translation>最大历史记录数:</translation> + </message> + <message> + <source>Max. history size:</source> + <translation>最大历史记录大小:</translation> + </message> + <message> + <source> MiB</source> + <translation>MiB</translation> + </message> + <message> + <source>Use recycle bin</source> + <translation>启用回收站</translation> </message> </context> <context> <name>DatabaseTabWidget</name> <message> <source>Root</source> + <comment>Root group</comment> <translation>根群组</translation> </message> <message> @@ -510,6 +917,30 @@ You can now save it.</source> <source>File not found!</source> <translation>找不到文件!</translation> </message> + <message> + <source>Unable to open the database.</source> + <translation>无法打开数据库</translation> + </message> + <message> + <source>File opened in read only mode.</source> + <translation>文件在只读模式下打开。</translation> + </message> + <message> + <source>Open CSV file</source> + <translation>打开 CSV 文件</translation> + </message> + <message> + <source>CSV file</source> + <translation>CSV 文件</translation> + </message> + <message> + <source>All files (*)</source> + <translation>所有文件 (*)</translation> + </message> + <message> + <source>Merge database</source> + <translation>合并数据库</translation> + </message> <message> <source>Open KeePass 1 database</source> <translation>打开 KeePass 1 数据库</translation> @@ -518,14 +949,16 @@ You can now save it.</source> <source>KeePass 1 database</source> <translation>KeePass 1 数据库</translation> </message> - <message> - <source>All files (*)</source> - <translation>所有文件 (*)</translation> - </message> <message> <source>Close?</source> <translation>关闭?</translation> </message> + <message> + <source>"%1" is in edit mode. +Discard changes and close anyway?</source> + <translation>正在编辑 "%1" 。 +仍然要放弃修改并且关闭吗?</translation> + </message> <message> <source>Save changes?</source> <translation>保存修改?</translation> @@ -540,10 +973,22 @@ Save changes?</source> <source>Writing the database failed.</source> <translation>数据库写入失败</translation> </message> + <message> + <source>Passwords</source> + <translation>密码</translation> + </message> <message> <source>Save database as</source> <translation>数据库另存为</translation> </message> + <message> + <source>Export database to CSV file</source> + <translation>导出数据库为 CSV 文件</translation> + </message> + <message> + <source>Writing the CSV file failed.</source> + <translation>写入 CSV 文件失败</translation> + </message> <message> <source>New database</source> <translation>新建数据库</translation> @@ -561,12 +1006,6 @@ Save changes?</source> Please press cancel to finish your changes or discard them.</source> <translation>不能锁定正在编辑的数据库。 点击“取消”继续编辑, 点击“确定”丢弃更改。</translation> - </message> - <message> - <source>This database has never been saved. -You can save the database or stop locking it.</source> - <translation>数据库尚未保存。 -你可以保存数据库或者取消锁定。</translation> </message> <message> <source>This database has been modified. @@ -576,68 +1015,13 @@ Otherwise your changes are lost.</source> 你想在锁定它之前保存修改吗? 否则修改将会丢失。</translation> </message> - <message> - <source>"%1" is in edit mode. -Discard changes and close anyway?</source> - <translation>正在编辑 "%1" 。 -仍然要放弃修改并且关闭吗?</translation> - </message> - <message> - <source>Export database to CSV file</source> - <translation>导出数据库为 CSV 文件</translation> - </message> - <message> - <source>CSV file</source> - <translation>CSV 文件</translation> - </message> - <message> - <source>Writing the CSV file failed.</source> - <translation>写入 CSV 文件失败</translation> - </message> - <message> - <source>Unable to open the database.</source> - <translation>无法打开数据库</translation> - </message> - <message> - <source>Merge database</source> - <translation>合并数据库</translation> - </message> - <message> - <source>The database you are trying to save as is locked by another instance of KeePassXC. -Do you want to save it anyway?</source> - <translation>你要保存的数据库已被另一个 KeePassXC 实例锁定。 -你仍然要保存吗?</translation> - </message> - <message> - <source>Passwords</source> - <translation>密码</translation> - </message> - <message> - <source>Database already opened</source> - <translation>数据库已经打开</translation> - </message> - <message> - <source>The database you are trying to open is locked by another instance of KeePassXC. - -Do you want to open it anyway?</source> - <translation>你要打开的数据库已被另一个 KeePassXC 实例锁定。 -你仍然要打开吗?</translation> - </message> - <message> - <source>Open read-only</source> - <translation>以只读方式打开</translation> - </message> - <message> - <source>File opened in read only mode.</source> - <translation>文件在只读模式下打开。</translation> - </message> - <message> - <source>Open CSV file</source> - <translation>打开 CSV 文件</translation> - </message> </context> <context> <name>DatabaseWidget</name> + <message> + <source>Searching...</source> + <translation>搜索中...</translation> + </message> <message> <source>Change master key</source> <translation>更改主密码</translation> @@ -658,13 +1042,33 @@ Do you want to open it anyway?</source> <source>Do you really want to delete %1 entries for good?</source> <translation>你确定永远删除 "%1" 项目吗?</translation> </message> + <message> + <source>Move entry to recycle bin?</source> + <translation>移动项目到回收站?</translation> + </message> + <message> + <source>Do you really want to move entry "%1" to the recycle bin?</source> + <translation>是否删除 "%1" 项目到回收站?</translation> + </message> <message> <source>Move entries to recycle bin?</source> <translation>移动项目到垃圾桶?</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>你确定要将 %n 个项目移到垃圾桶?</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <source>Execute command?</source> + <translation>执行命令?</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation>你确定要执行以下命令?<br><br>%1<br></translation> + </message> + <message> + <source>Remember my choice</source> + <translation>记住我的选择</translation> </message> <message> <source>Delete group?</source> @@ -678,18 +1082,6 @@ Do you want to open it anyway?</source> <source>Unable to calculate master key</source> <translation>无法计算主密码</translation> </message> - <message> - <source>Move entry to recycle bin?</source> - <translation>移动项目到回收站?</translation> - </message> - <message> - <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation>是否删除 "%1" 项目到回收站?</translation> - </message> - <message> - <source>Searching...</source> - <translation>搜索中...</translation> - </message> <message> <source>No current database.</source> <translation>没有当前的数据库。</translation> @@ -707,20 +1099,8 @@ Do you want to open it anyway?</source> <translation>无结果</translation> </message> <message> - <source>Execute command?</source> - <translation>执行命令?</translation> - </message> - <message> - <source>Do you really want to execute the following command?<br><br>%1<br></source> - <translation>你确定要执行以下命令?<br><br>%1<br></translation> - </message> - <message> - <source>Remember my choice</source> - <translation>记住我的选择</translation> - </message> - <message> - <source>Autoreload Request</source> - <translation>自动加载请求</translation> + <source>File has changed</source> + <translation type="unfinished"/> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -731,8 +1111,9 @@ Do you want to open it anyway?</source> <translation>合并请求</translation> </message> <message> - <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> - <translation>数据库文件已更改,您有未保存的更改。是否合并您的更改?</translation> + <source>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</source> + <translation type="unfinished"/> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -747,6 +1128,89 @@ Do you want to open it anyway?</source> <translation>你确定要永久删除回收站中的所有内容?</translation> </message> </context> +<context> + <name>DetailsWidget</name> + <message> + <source>Generate TOTP Token</source> + <translation type="unfinished"/> + </message> + <message> + <source>Close</source> + <translation>关闭</translation> + </message> + <message> + <source>General</source> + <translation>常规</translation> + </message> + <message> + <source>Password</source> + <translation>密码</translation> + </message> + <message> + <source>URL</source> + <translation>网址</translation> + </message> + <message> + <source>Expiration</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username</source> + <translation>用户名</translation> + </message> + <message> + <source>Autotype</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searching</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attributes</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation>附件</translation> + </message> + <message> + <source>Notes</source> + <translation>备注</translation> + </message> + <message> + <source>Window</source> + <translation>窗口</translation> + </message> + <message> + <source>Sequence</source> + <translation>顺序</translation> + </message> + <message> + <source>Search</source> + <translation>搜索</translation> + </message> + <message> + <source>Clear</source> + <translation>清除</translation> + </message> + <message> + <source>Never</source> + <translation type="unfinished"/> + </message> + <message> + <source>[PROTECTED]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Disabled</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enabled</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EditEntryWidget</name> <message> @@ -773,6 +1237,30 @@ Do you want to open it anyway?</source> <source>History</source> <translation>历史记录</translation> </message> + <message> + <source>SSH Agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>(encrypted)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>File too large to be a private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open private key</source> + <translation type="unfinished"/> + </message> <message> <source>Entry history</source> <translation>项目历史</translation> @@ -793,40 +1281,6 @@ Do you want to open it anyway?</source> <source>New attribute</source> <translation>添加属性</translation> </message> - <message> - <source>Select file</source> - <translation>选择文件</translation> - </message> - <message> - <source>Unable to open file</source> - <translation>无法打开文件</translation> - </message> - <message> - <source>Save attachment</source> - <translation>保存附件</translation> - </message> - <message> - <source>Unable to save the attachment: -</source> - <translation>无法保存附件: -</translation> - </message> - <message> - <source>Tomorrow</source> - <translation>明天</translation> - </message> - <message numerus="yes"> - <source>%n week(s)</source> - <translation><numerusform>%n 周</numerusform></translation> - </message> - <message numerus="yes"> - <source>%n month(s)</source> - <translation><numerusform>%n 个月</numerusform></translation> - </message> - <message> - <source>1 year</source> - <translation>1 年</translation> - </message> <message> <source>Confirm Remove</source> <translation>确认删除</translation> @@ -836,12 +1290,28 @@ Do you want to open it anyway?</source> <translation>你确定要移除这个属性?</translation> </message> <message> - <source>[PROTECTED] Press reveal to view or edit</source> - <translation>[受保护的内容] 点击“揭示”来查看或编辑</translation> + <source>[PROTECTED]</source> + <translation type="unfinished"/> </message> <message> - <source>Are you sure you want to remove this attachment?</source> - <translation>你确定要移除这个附加内容?</translation> + <source>Press reveal to view or edit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Tomorrow</source> + <translation>明天</translation> + </message> + <message numerus="yes"> + <source>%n week(s)</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source>%n month(s)</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <source>1 year</source> + <translation>1 年</translation> </message> </context> <context> @@ -858,18 +1328,6 @@ Do you want to open it anyway?</source> <source>Remove</source> <translation>移除</translation> </message> - <message> - <source>Attachments</source> - <translation>附件</translation> - </message> - <message> - <source>Save</source> - <translation>保存</translation> - </message> - <message> - <source>Open</source> - <translation>打开</translation> - </message> <message> <source>Edit Name</source> <translation>编辑名称</translation> @@ -882,6 +1340,10 @@ Do you want to open it anyway?</source> <source>Reveal</source> <translation>揭示</translation> </message> + <message> + <source>Attachments</source> + <translation>附件</translation> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -889,6 +1351,18 @@ Do you want to open it anyway?</source> <source>Enable Auto-Type for this entry</source> <translation>为此项目启用自动输入</translation> </message> + <message> + <source>Inherit default Auto-Type sequence from the &group</source> + <translation>从父群组继承默认的自动输入顺序(G)</translation> + </message> + <message> + <source>&Use custom Auto-Type sequence:</source> + <translation>使用自定义自动输入顺序(U)</translation> + </message> + <message> + <source>Window Associations</source> + <translation>窗口组合</translation> + </message> <message> <source>+</source> <translation>+</translation> @@ -901,14 +1375,6 @@ Do you want to open it anyway?</source> <source>Window title:</source> <translation>窗口标题:</translation> </message> - <message> - <source>Inherit default Auto-Type sequence from the &group</source> - <translation>从父群组继承默认的自动输入顺序(G)</translation> - </message> - <message> - <source>&Use custom Auto-Type sequence:</source> - <translation>使用自定义自动输入顺序(U)</translation> - </message> <message> <source>Use default se&quence</source> <translation>使用默认顺序(Q)</translation> @@ -917,10 +1383,6 @@ Do you want to open it anyway?</source> <source>Set custo&m sequence:</source> <translation>设置自定义顺序(M)</translation> </message> - <message> - <source>Window Associations</source> - <translation>窗口组合</translation> - </message> </context> <context> <name>EditEntryWidgetHistory</name> @@ -944,12 +1406,8 @@ Do you want to open it anyway?</source> <context> <name>EditEntryWidgetMain</name> <message> - <source>Title:</source> - <translation>标题:</translation> - </message> - <message> - <source>Username:</source> - <translation>用户名:</translation> + <source>URL:</source> + <translation>网址:</translation> </message> <message> <source>Password:</source> @@ -960,20 +1418,104 @@ Do you want to open it anyway?</source> <translation>重复密码:</translation> </message> <message> - <source>URL:</source> - <translation>网址:</translation> + <source>Title:</source> + <translation>标题:</translation> </message> <message> - <source>Expires</source> - <translation>过期</translation> + <source>Notes</source> + <translation>备注</translation> </message> <message> <source>Presets</source> <translation>预设</translation> </message> <message> - <source>Notes:</source> - <translation>备注:</translation> + <source>Toggle the checkbox to reveal the notes section.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username:</source> + <translation>用户名:</translation> + </message> + <message> + <source>Expires</source> + <translation>过期</translation> + </message> +</context> +<context> + <name>EditEntryWidgetSSHAgent</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent after</source> + <translation type="unfinished"/> + </message> + <message> + <source> seconds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fingerprint</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent when database is closed/locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add key to agent when database is opened/unlocked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Comment</source> + <translation type="unfinished"/> + </message> + <message> + <source>Decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy to clipboard</source> + <translation>复制到剪贴板</translation> + </message> + <message> + <source>Private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>External file</source> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Attachment</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add to agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove from agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Require user confirmation when this key is used</source> + <translation type="unfinished"/> </message> </context> <context> @@ -1044,6 +1586,14 @@ Do you want to open it anyway?</source> </context> <context> <name>EditWidgetIcons</name> + <message> + <source>&Use default icon</source> + <translation>使用默认图标(U)</translation> + </message> + <message> + <source>Use custo&m icon</source> + <translation>使用自定义图标(M)</translation> + </message> <message> <source>Add custom icon</source> <translation>添加自定义图标</translation> @@ -1052,6 +1602,18 @@ Do you want to open it anyway?</source> <source>Delete custom icon</source> <translation>删除自定义图标</translation> </message> + <message> + <source>Download favicon</source> + <translation>下载网站图标</translation> + </message> + <message> + <source>Unable to fetch favicon.</source> + <translation>无法获取网站图标</translation> + </message> + <message> + <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> + <translation>提示:你可以在 工具 > 设置 > 安全 中启用 Google 作为备选</translation> + </message> <message> <source>Images</source> <translation>图片</translation> @@ -1064,25 +1626,13 @@ Do you want to open it anyway?</source> <source>Select Image</source> <translation>选择图片</translation> </message> - <message> - <source>Download favicon</source> - <translation>下载网站图标</translation> - </message> - <message> - <source>Unable to fetch favicon.</source> - <translation>无法获取网站图标</translation> - </message> <message> <source>Can't read icon</source> <translation>无法读取图标</translation> </message> <message> - <source>&Use default icon</source> - <translation>使用默认图标(U)</translation> - </message> - <message> - <source>Use custo&m icon</source> - <translation>使用自定义图标(M)</translation> + <source>Custom icon already exists</source> + <translation>已经存在自定义图标</translation> </message> <message> <source>Confirm Delete</source> @@ -1092,14 +1642,6 @@ Do you want to open it anyway?</source> <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> <translation>这个图标被 %1 个条目使用,将会被默认图标替换。你确定要删除它吗?</translation> </message> - <message> - <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation>提示:你可以在 工具 > 设置 > 安全 中启用 Google 作为备选</translation> - </message> - <message> - <source>Custom icon already exists</source> - <translation type="unfinished"/> - </message> </context> <context> <name>EditWidgetProperties</name> @@ -1124,9 +1666,93 @@ Do you want to open it anyway?</source> <name>Entry</name> <message> <source> - Clone</source> + <comment>Suffix added to cloned entries</comment> <translation>- 副本</translation> </message> </context> +<context> + <name>EntryAttachmentsModel</name> + <message> + <source>Name</source> + <translation>名称</translation> + </message> + <message> + <source>Size</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EntryAttachmentsWidget</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add</source> + <translation>添加</translation> + </message> + <message> + <source>Remove</source> + <translation>移除</translation> + </message> + <message> + <source>Open</source> + <translation>打开</translation> + </message> + <message> + <source>Save</source> + <translation>保存</translation> + </message> + <message> + <source>Select files</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <source>Are you sure you want to remove %n attachment(s)?</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>确认删除</translation> + </message> + <message> + <source>Save attachments</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to create directory: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Confirm overwrite</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to save attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachment: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open files: +%1</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EntryAttributesModel</name> <message> @@ -1155,6 +1781,11 @@ Do you want to open it anyway?</source> </context> <context> <name>EntryModel</name> + <message> + <source>Ref: </source> + <comment>Reference abbreviation</comment> + <translation>参考条目:</translation> + </message> <message> <source>Group</source> <translation>群组</translation> @@ -1171,11 +1802,6 @@ Do you want to open it anyway?</source> <source>URL</source> <translation>网址</translation> </message> - <message> - <source>Ref: </source> - <comment>Reference abbreviation</comment> - <translation>参考条目:</translation> - </message> </context> <context> <name>Group</name> @@ -1184,6 +1810,17 @@ Do you want to open it anyway?</source> <translation>回收站</translation> </message> </context> +<context> + <name>HostInstaller</name> + <message> + <source>KeePassXC: Cannot save file!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot save the native messaging script file.</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>HttpPasswordGeneratorWidget</name> <message> @@ -1246,6 +1883,360 @@ Do you want to open it anyway?</source> <translation>关闭信息</translation> </message> </context> +<context> + <name>Kdbx3Reader</name> + <message> + <source>Unable to calculate master key</source> + <translation>无法计算主密码</translation> + </message> + <message> + <source>Unable to issue challenge-response.</source> + <translation>无法发出挑战应答</translation> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>密钥错误或数据库损坏</translation> + </message> +</context> +<context> + <name>Kdbx3Writer</name> + <message> + <source>Unable to issue challenge-response.</source> + <translation>无法发出挑战应答</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>无法计算主密码</translation> + </message> +</context> +<context> + <name>Kdbx4Reader</name> + <message> + <source>missing database headers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>无法计算主密码</translation> + </message> + <message> + <source>Invalid header checksum size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Header SHA256 mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header data length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open buffer for KDF parameters in header</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported key derivation function (KDF) or invalid parameters</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy header fields found in KDBX4 file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header binary size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass variant map version.</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name data</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value data</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Bool entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry type</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map field type size</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Kdbx4Writer</name> + <message> + <source>Invalid symmetric cipher algorithm.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid symmetric cipher IV size.</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>无法计算主密码</translation> + </message> + <message> + <source>Failed to serialize KDF parameters variant map</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxReader</name> + <message> + <source>Invalid cipher uuid length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid compression flags length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported compression algorithm</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid master seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform rounds size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid start bytes size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid random stream id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner random stream cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>不是 KeePass 数据库</translation> + </message> + <message> + <source>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> + <translation>当前选择的文件是旧版本的 KeePass 1 数据库(.kdb)。 +你可以通过点击 数据库 > 导入 KeePass 1 数据库 来导入。 +这是不可逆的迁移,导入后的数据库将无法由旧版本的 KeePassX 0.4 打开。</translation> + </message> + <message> + <source>Unsupported KeePass 2 database version.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxXmlReader</name> + <message> + <source>XML parsing failure: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>No root group</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing icon uuid or data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing custom data key or value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Multiple group elements</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null group uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableAutoType value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableSearching value</source> + <translation type="unfinished"/> + </message> + <message> + <source>No group uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null DeleteObject uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing DeletedObject uuid or time</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null entry uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element in history entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>No entry uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element with different uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decrypt entry string</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate custom attribute found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry string key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate attachment found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry binary key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-type association window or sequence missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid bool value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid date time value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color rgb part</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid uuid value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decompress binary</source> + <extracomment>Translator meant is a binary data inside an entry</extracomment> + <translation type="unfinished"/> + </message> +</context> <context> <name>KeePass1OpenWidget</name> <message> @@ -1275,6 +2266,35 @@ Do you want to open it anyway?</source> <source>Unsupported KeePass database version.</source> <translation>不支持的 KeePass 数据库版本</translation> </message> + <message> + <source>Unable to read encryption IV</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of groups</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid content hash size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of transform rounds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to construct group tree</source> + <translation type="unfinished"/> + </message> <message> <source>Root</source> <translation>根群组</translation> @@ -1287,59 +2307,104 @@ Do you want to open it anyway?</source> <source>Wrong key or database file is corrupt.</source> <translation>密钥错误或数据库损坏</translation> </message> -</context> -<context> - <name>KeePass2Reader</name> <message> - <source>Not a KeePass database.</source> - <translation>不是 KeePass 数据库</translation> + <source>Key transformation failed</source> + <translation type="unfinished"/> </message> <message> - <source>Unsupported KeePass database version.</source> - <translation>不支持的 KeePass 数据库版本</translation> + <source>Invalid group field type number</source> + <translation type="unfinished"/> </message> <message> - <source>Wrong key or database file is corrupt.</source> - <translation>密钥错误或数据库损坏</translation> + <source>Invalid group field size</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>无法计算主密码</translation> + <source>Read group field data doesn't match size</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to issue challenge-response.</source> - <translation>无法发出挑战应答</translation> + <source>Incorrect group id field size</source> + <translation type="unfinished"/> </message> <message> - <source>The selected file is an old KeePass 1 database (.kdb). - -You can import it by clicking on Database > 'Import KeePass 1 database...'. -This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> - <translation>当前选择的文件是旧版本的 KeePass 1 数据库(.kdb)。 -你可以通过点击 数据库 > 导入 KeePass 1 数据库 来导入。 -这是不可逆的迁移,导入后的数据库将无法由旧版本的 KeePassX 0.4 打开。</translation> - </message> -</context> -<context> - <name>KeePass2Writer</name> - <message> - <source>Unable to issue challenge-response.</source> - <translation>无法发出挑战应答</translation> + <source>Incorrect group creation time field size</source> + <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>无法计算主密码</translation> + <source>Incorrect group modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group access time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group level field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing group id or level</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing entry field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read entry field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry uuid field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field type</source> + <translation type="unfinished"/> </message> </context> <context> <name>Main</name> <message> - <source>Fatal error while testing the cryptographic functions.</source> - <translation>在测试加密函数时发生重大错误。</translation> - </message> - <message> - <source>KeePassXC - Error</source> - <translation>KeePassXC - 错误</translation> + <source>Existing single-instance lock file is invalid. Launching new instance.</source> + <translation>单实例锁无效,正在重启实例</translation> </message> <message> <source>The lock file could not be created. Single-instance mode disabled.</source> @@ -1350,64 +2415,32 @@ This is a one-way migration. You won't be able to open the imported databas <translation>另一个 KeePassXC 实例已在运行</translation> </message> <message> - <source>Existing single-instance lock file is invalid. Launching new instance.</source> - <translation type="unfinished"/> + <source>Fatal error while testing the cryptographic functions.</source> + <translation>在测试加密函数时发生重大错误。</translation> + </message> + <message> + <source>KeePassXC - Error</source> + <translation>KeePassXC - 错误</translation> </message> </context> <context> <name>MainWindow</name> <message> - <source>Open database</source> - <translation>打开数据库</translation> - </message> - <message> - <source>Database settings</source> - <translation>数据库设置</translation> - </message> - <message> - <source>Copy username to clipboard</source> - <translation>将用户名复制到剪贴板</translation> - </message> - <message> - <source>Copy password to clipboard</source> - <translation>将密码复制到剪贴板</translation> - </message> - <message> - <source>Settings</source> - <translation>设置</translation> - </message> - <message> - <source>Show toolbar</source> - <translation>显示工具栏</translation> - </message> - <message> - <source>read-only</source> - <translation>只读</translation> - </message> - <message> - <source>Toggle window</source> - <translation>切换窗口</translation> - </message> - <message> - <source>KeePass 2 Database</source> - <translation>KeePass 2 数据库</translation> - </message> - <message> - <source>All files</source> - <translation>所有文件</translation> - </message> - <message> - <source>Save repaired database</source> - <translation>保存修复后的数据库</translation> - </message> - <message> - <source>Writing the database failed.</source> - <translation>数据库写入失败</translation> + <source>&Database</source> + <translation>数据库(D)</translation> </message> <message> <source>&Recent databases</source> <translation>最近的数据库(R)</translation> </message> + <message> + <source>Import</source> + <translation>导入</translation> + </message> + <message> + <source>&Help</source> + <translation>帮助(H)</translation> + </message> <message> <source>E&ntries</source> <translation>项目(N)</translation> @@ -1416,13 +2449,17 @@ This is a one-way migration. You won't be able to open the imported databas <source>Copy att&ribute to clipboard</source> <translation>将属性复制到剪贴板(R)</translation> </message> + <message> + <source>Time-based one-time password</source> + <translation type="unfinished"/> + </message> <message> <source>&Groups</source> <translation>群组(G)</translation> </message> <message> - <source>&View</source> - <translation>显示(V)</translation> + <source>&Tools</source> + <translation>工具(T)</translation> </message> <message> <source>&Quit</source> @@ -1432,6 +2469,10 @@ This is a one-way migration. You won't be able to open the imported databas <source>&About</source> <translation>关于(A)</translation> </message> + <message> + <source>&Open database...</source> + <translation>打开数据库(O)...</translation> + </message> <message> <source>&Save database</source> <translation>保存数据库(S)</translation> @@ -1472,26 +2513,26 @@ This is a one-way migration. You won't be able to open the imported databas <source>&Delete group</source> <translation>删除群组(D)</translation> </message> + <message> + <source>Sa&ve database as...</source> + <translation>数据库另存为(V)...</translation> + </message> + <message> + <source>Change &master key...</source> + <translation>更改主密码(M),,,</translation> + </message> <message> <source>&Database settings</source> <translation>数据库设置(D)</translation> </message> + <message> + <source>Database settings</source> + <translation>数据库设置</translation> + </message> <message> <source>&Clone entry</source> <translation>复制项目(C)</translation> </message> - <message> - <source>Timed one-time password</source> - <translation>动态密码 TOTP</translation> - </message> - <message> - <source>Copy &TOTP</source> - <translation>复制 TOTP 密码(T)</translation> - </message> - <message> - <source>Show TOTP</source> - <translation>显示 TOTP 密码</translation> - </message> <message> <source>&Find</source> <translation>查找(F)</translation> @@ -1500,14 +2541,26 @@ This is a one-way migration. You won't be able to open the imported databas <source>Copy &username</source> <translation>复制用户名(U)</translation> </message> + <message> + <source>Copy username to clipboard</source> + <translation>将用户名复制到剪贴板</translation> + </message> <message> <source>Cop&y password</source> <translation>复制密码(Y)</translation> </message> + <message> + <source>Copy password to clipboard</source> + <translation>将密码复制到剪贴板</translation> + </message> <message> <source>&Settings</source> <translation>设置(S)</translation> </message> + <message> + <source>Password Generator</source> + <translation>密码生成器</translation> + </message> <message> <source>&Perform Auto-Type</source> <translation>执行自动输入(P)</translation> @@ -1524,65 +2577,25 @@ This is a one-way migration. You won't be able to open the imported databas <source>&Title</source> <translation>标题(T)</translation> </message> + <message> + <source>Copy title to clipboard</source> + <translation type="unfinished"/> + </message> <message> <source>&URL</source> <translation>网址(U)</translation> </message> + <message> + <source>Copy URL to clipboard</source> + <translation type="unfinished"/> + </message> <message> <source>&Notes</source> <translation>备注(N)</translation> </message> <message> - <source>Password Generator</source> - <translation>密码生成器</translation> - </message> - <message> - <source>Clear history</source> - <translation>清除历史</translation> - </message> - <message> - <source>&Database</source> - <translation>数据库(D)</translation> - </message> - <message> - <source>Import</source> - <translation>导入</translation> - </message> - <message> - <source>&Tools</source> - <translation>工具(T)</translation> - </message> - <message> - <source>Empty recycle bin</source> - <translation>清空回收站</translation> - </message> - <message> - <source>Access error for config file %1</source> - <translation>访问配置文件出错 %1</translation> - </message> - <message> - <source>Quit KeePassXC</source> - <translation>退出 KeePassXC</translation> - </message> - <message> - <source>Please touch the button on your YubiKey!</source> - <translation>请触摸你 YubiKey 上的按键!</translation> - </message> - <message> - <source>&Help</source> - <translation>帮助(H)</translation> - </message> - <message> - <source>&Open database...</source> - <translation>打开数据库(O)...</translation> - </message> - <message> - <source>Sa&ve database as...</source> - <translation>数据库另存为(V)...</translation> - </message> - <message> - <source>Change &master key...</source> - <translation>更改主密码(M),,,</translation> + <source>Copy notes to clipboard</source> + <translation type="unfinished"/> </message> <message> <source>&Export to CSV file...</source> @@ -1600,10 +2613,169 @@ This is a one-way migration. You won't be able to open the imported databas <source>Re&pair database...</source> <translation>修复数据库(P)...</translation> </message> + <message> + <source>Show TOTP</source> + <translation>显示 TOTP 密码</translation> + </message> <message> <source>Set up TOTP...</source> <translation>设置 TOTP 密码...</translation> </message> + <message> + <source>Copy &TOTP</source> + <translation>复制 TOTP 密码(T)</translation> + </message> + <message> + <source>E&mpty recycle bin</source> + <translation type="unfinished"/> + </message> + <message> + <source>Clear history</source> + <translation>清除历史</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation>访问配置文件出错 %1</translation> + </message> + <message> + <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> + <translation type="unfinished"/> + </message> + <message> + <source>read-only</source> + <translation>只读</translation> + </message> + <message> + <source>Settings</source> + <translation>设置</translation> + </message> + <message> + <source>Toggle window</source> + <translation>切换窗口</translation> + </message> + <message> + <source>Quit KeePassXC</source> + <translation>退出 KeePassXC</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>KeePass 2 数据库</translation> + </message> + <message> + <source>All files</source> + <translation>所有文件</translation> + </message> + <message> + <source>Open database</source> + <translation>打开数据库</translation> + </message> + <message> + <source>Save repaired database</source> + <translation>保存修复后的数据库</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>数据库写入失败</translation> + </message> + <message> + <source>Please touch the button on your YubiKey!</source> + <translation>请触摸你 YubiKey 上的按键!</translation> + </message> +</context> +<context> + <name>OpenSSHKey</name> + <message> + <source>Invalid key file, expecting an OpenSSH key</source> + <translation type="unfinished"/> + </message> + <message> + <source>PEM boundary mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>This is not an OpenSSH key, only modern keys are supported</source> + <translation type="unfinished"/> + </message> + <message> + <source>Base64 decoding failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file way too small.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file magic header id invalid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Found zero keys</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to read public key.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Corrupted key file, reading private key failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>No private key payload to decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Trying to run KDF without cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Passphrase is required to decrypt this key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key derivation failed, key file corrupted?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Decryption failed, wrong passphrase?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write public key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write private key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing private key</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OptionDialog</name> @@ -1611,22 +2783,63 @@ This is a one-way migration. You won't be able to open the imported databas <source>Dialog</source> <translation>对话框</translation> </message> + <message> + <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation>通过 ChromelPass 或 PasslFox 访问数据库需要此设置</translation> + </message> + <message> + <source>Enable KeePassHTTP server</source> + <translation>启用 KeePassHTTP 服务</translation> + </message> <message> <source>General</source> <translation>常规</translation> </message> <message> <source>Sh&ow a notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> <translation>当请求凭证时显示通知(O)</translation> </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>只返回特定网址的最佳匹配,而不是整个域名的所有条目。</translation> + </message> + <message> + <source>&Return only best matching entries</source> + <translation>只返回最匹配的条目</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>数据库锁定时请求解锁(Q)</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> + <translation>仅返回具有相同协议 (http://, https://, ftp://, ...) 的条目</translation> + </message> + <message> + <source>&Match URL schemes</source> + <translation>匹配 URL 协议(M)</translation> + </message> <message> <source>Sort matching entries by &username</source> <translation>根据用户名排序匹配项(U)</translation> </message> + <message> + <source>Sort &matching entries by title</source> + <translation>根据标题排序匹配项(M)</translation> + </message> + <message> + <source>R&emove all shared encryption keys from active database</source> + <translation>移除所有激活数据库共享的加密密钥(E)</translation> + </message> <message> <source>Re&move all stored permissions from entries in active database</source> <translation>从活动数据库的条目中移除已存储的所有权限(M)</translation> </message> + <message> + <source>Password Generator</source> + <translation>密码生成器</translation> + </message> <message> <source>Advanced</source> <translation>高级</translation> @@ -1639,10 +2852,22 @@ This is a one-way migration. You won't be able to open the imported databas <source>Always allow &updating entries</source> <translation>永远允许更新项目(U)</translation> </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>只有选定的数据库必须与一个客户端连接。</translation> + </message> <message> <source>Searc&h in all opened databases for matching entries</source> <translation>在所有打开的数据库中查找匹配项目(H)</translation> </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>不支持自动创建或更新字符串字段。</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>返回以“KPH:”开头的高级字符串字段(R)</translation> + </message> <message> <source>HTTP Port:</source> <translation>HTTP 端口:</translation> @@ -1651,18 +2876,18 @@ This is a one-way migration. You won't be able to open the imported databas <source>Default port: 19455</source> <translation>默认端口:19455</translation> </message> - <message> - <source>Re&quest to unlock the database if it is locked</source> - <translation>数据库锁定时请求解锁(Q)</translation> - </message> - <message> - <source>Sort &matching entries by title</source> - <translation>根据标题排序匹配项(M)</translation> - </message> <message> <source>KeePassXC will listen to this port on 127.0.0.1</source> <translation>KeePassXC 将监听 127.0.0.1 上的此端口</translation> </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> + <translation type="unfinished"/> + </message> <message> <source>Cannot bind to privileged ports</source> <translation>无法绑定到特权端口</translation> @@ -1673,63 +2898,30 @@ Using default port 19455.</source> <translation>无法绑定低于 1024 的特权端口 ! 使用默认端口 19455</translation> </message> - <message> - <source>R&emove all shared encryption keys from active database</source> - <translation>移除所有激活数据库共享的加密密钥(E)</translation> - </message> - <message> - <source>&Return advanced string fields which start with "KPH: "</source> - <translation>返回以“KPH:”开头的高级字符串字段(R)</translation> - </message> - <message> - <source>Automatically creating or updating string fields is not supported.</source> - <translation>不支持自动创建或更新字符串字段。</translation> - </message> - <message> - <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> - <translation>通过 ChromelPass 或 PasslFox 访问数据库需要此设置</translation> - </message> - <message> - <source>Enable KeePassHTTP server</source> - <translation>启用 KeePassHTTP 服务</translation> - </message> - <message> - <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation>只返回特定网址的最佳匹配,而不是整个域名的所有条目。</translation> - </message> - <message> - <source>&Return only best matching entries</source> - <translation>只返回最匹配的条目</translation> - </message> - <message> - <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation>仅返回具有相同协议 (http://, https://, ftp://, ...) 的条目</translation> - </message> - <message> - <source>&Match URL schemes</source> - <translation>匹配 URL 协议(M)</translation> - </message> - <message> - <source>Password Generator</source> - <translation>密码生成器</translation> - </message> - <message> - <source>Only the selected database has to be connected with a client.</source> - <translation>只有选定的数据库必须与一个客户端连接。</translation> - </message> - <message> - <source>The following options can be dangerous! -Change them only if you know what you are doing.</source> - <translation>以下选项可能很危险! -除非你知道自己在做什么,否则不要更改这些设置</translation> - </message> </context> <context> <name>PasswordGeneratorWidget</name> + <message> + <source>%p%</source> + <translation>%p%</translation> + </message> <message> <source>Password:</source> <translation>密码:</translation> </message> + <message> + <source>strength</source> + <comment>Password strength</comment> + <translation>强度</translation> + </message> + <message> + <source>entropy</source> + <translation>熵</translation> + </message> + <message> + <source>Password</source> + <translation>密码</translation> + </message> <message> <source>Character Types</source> <translation>字符类型</translation> @@ -1750,38 +2942,50 @@ Change them only if you know what you are doing.</source> <source>Special Characters</source> <translation>特殊字符</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>扩展 ASCII</translation> + </message> <message> <source>Exclude look-alike characters</source> <translation>排除相似的字符</translation> </message> - <message> - <source>Accept</source> - <translation>接受</translation> - </message> - <message> - <source>%p%</source> - <translation>%p%</translation> - </message> - <message> - <source>strength</source> - <translation>强度</translation> - </message> - <message> - <source>entropy</source> - <translation>熵</translation> - </message> - <message> - <source>&Length:</source> - <translation>长度(L)︰</translation> - </message> <message> <source>Pick characters from every group</source> <translation>包含每一种字符</translation> </message> + <message> + <source>&Length:</source> + <translation>长度(L)︰</translation> + </message> + <message> + <source>Passphrase</source> + <translation>口令</translation> + </message> + <message> + <source>Wordlist:</source> + <translation>字符列表:</translation> + </message> + <message> + <source>Word Count:</source> + <translation>字数:</translation> + </message> + <message> + <source>Word Separator:</source> + <translation>字符分隔符:</translation> + </message> <message> <source>Generate</source> <translation>生成</translation> </message> + <message> + <source>Copy</source> + <translation>复制</translation> + </message> + <message> + <source>Accept</source> + <translation>接受</translation> + </message> <message> <source>Close</source> <translation>关闭</translation> @@ -1800,51 +3004,270 @@ Change them only if you know what you are doing.</source> </message> <message> <source>Poor</source> + <comment>Password quality</comment> <translation>差</translation> </message> <message> <source>Weak</source> + <comment>Password quality</comment> <translation>弱</translation> </message> <message> <source>Good</source> + <comment>Password quality</comment> <translation>好</translation> </message> <message> <source>Excellent</source> + <comment>Password quality</comment> <translation>优秀</translation> </message> - <message> - <source>Password</source> - <translation>密码</translation> - </message> - <message> - <source>Extended ASCII</source> - <translation>扩展 ASCII</translation> - </message> - <message> - <source>Passphrase</source> - <translation>口令</translation> - </message> - <message> - <source>Wordlist:</source> - <translation>字符列表:</translation> - </message> - <message> - <source>Word Count:</source> - <translation>字数:</translation> - </message> - <message> - <source>Word Separator:</source> - <translation>字符分隔符:</translation> - </message> - <message> - <source>Copy</source> - <translation>复制</translation> - </message> </context> <context> <name>QObject</name> + <message> + <source>Database not opened</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database hash not available</source> + <translation type="unfinished"/> + </message> + <message> + <source>Client public key not received</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot decrypt message</source> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout or cannot connect to KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>Action cancelled or denied</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC association failed, try again</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key change was not successful</source> + <translation type="unfinished"/> + </message> + <message> + <source>Encryption key is not recognized</source> + <translation type="unfinished"/> + </message> + <message> + <source>No saved databases found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect action</source> + <translation type="unfinished"/> + </message> + <message> + <source>Empty message received</source> + <translation type="unfinished"/> + </message> + <message> + <source>No URL provided</source> + <translation type="unfinished"/> + </message> + <message> + <source>No logins found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown error</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add a new entry to a database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>数据库路径</translation> + </message> + <message> + <source>Key file of the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>path</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>username</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL</source> + <translation>网址</translation> + </message> + <message> + <source>Prompt for the entry's password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a password for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length for the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to add.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy an entry's password to the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to clip.</source> + <comment>clip = copy to clipboard</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout in seconds before clearing the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Edit an entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Title for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>title</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to edit.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Estimate the entropy of a password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password for which to estimate the entropy.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Perform advanced analysis on the password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Extract and print the content of a database.</source> + <translation>提取并打印数据库内容</translation> + </message> + <message> + <source>Path of the database to extract.</source> + <translation>将提取的数据库路径</translation> + </message> + <message> + <source>Insert password to unlock %1: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to load key file %1 : %2</source> + <translation type="unfinished"/> + </message> + <message> + <source>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source> + +Available commands: +</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the command to execute.</source> + <translation>将执行的命令名称</translation> + </message> + <message> + <source>List database entries.</source> + <translation>列出数据库项目</translation> + </message> + <message> + <source>Path of the group to list. Default is /</source> + <translation>要将列出的群组路径,默认为 /</translation> + </message> + <message> + <source>Find entries quickly.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Search term.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Merge two databases.</source> + <translation>合并两个数据库</translation> + </message> + <message> + <source>Path of the database to merge into.</source> + <translation>合并成的数据库路径</translation> + </message> + <message> + <source>Path of the database to merge from.</source> + <translation>将合并的数据库路径</translation> + </message> + <message> + <source>Use the same credentials for both database files.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file of the database to merge from.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show an entry's information.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> + <translation type="unfinished"/> + </message> + <message> + <source>attribute</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the entry to show.</source> + <translation>项目名称</translation> + </message> <message> <source>NULL device</source> <translation>空设备</translation> @@ -1868,8 +3291,28 @@ Change them only if you know what you are doing.</source> <translation>缺少后引号</translation> </message> <message> - <source>INTERNAL - unget lower bound exceeded</source> - <translation>内部信息 - 未定义的下溢</translation> + <source>AES: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Twofish: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>ChaCha20: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Argon2 (KDBX 4 – recommended)</source> + <translation>Argon2(推荐 KDBX 4)</translation> + </message> + <message> + <source>AES-KDF (KDBX 4)</source> + <translation>AES-KDF(KDBX 4)</translation> + </message> + <message> + <source>AES-KDF (KDBX 3.1)</source> + <translation>AES-KDF(KDBX 3.1)</translation> </message> <message> <source>Group</source> @@ -1887,14 +3330,22 @@ Change them only if you know what you are doing.</source> <source>Password</source> <translation>密码</translation> </message> - <message> - <source>URL</source> - <translation>网址</translation> - </message> <message> <source>Notes</source> <translation>备注</translation> </message> + <message> + <source>Last Modified</source> + <translation type="unfinished"/> + </message> + <message> + <source>Created</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy Browser Integration</source> + <translation type="unfinished"/> + </message> <message> <source>Browser Integration</source> <translation>浏览器配合</translation> @@ -1911,6 +3362,10 @@ Change them only if you know what you are doing.</source> <source>Passive</source> <translation>被动</translation> </message> + <message> + <source>SSH Agent</source> + <translation type="unfinished"/> + </message> </context> <context> <name>QtIOCompressor</name> @@ -1949,8 +3404,8 @@ Change them only if you know what you are doing.</source> <context> <name>SearchWidget</name> <message> - <source>Case Sensitive</source> - <translation>区分大小写</translation> + <source>Search...</source> + <translation>搜索……</translation> </message> <message> <source>Search</source> @@ -1961,8 +3416,8 @@ Change them only if you know what you are doing.</source> <translation>清除</translation> </message> <message> - <source>Search...</source> - <translation>搜索……</translation> + <source>Case Sensitive</source> + <translation>区分大小写</translation> </message> <message> <source>Limit search to selected group</source> @@ -1971,50 +3426,6 @@ Change them only if you know what you are doing.</source> </context> <context> <name>Service</name> - <message> - <source>A shared encryption-key with the name "%1" already exists. -Do you want to overwrite it?</source> - <translation>一个共享的加密密钥,名为"%1"已存在。 -你想要覆盖它吗?</translation> - </message> - <message> - <source>Do you want to update the information in %1 - %2?</source> - <translation>你想更新 %1-%2 中的信息吗?</translation> - </message> - <message> - <source>The active database is locked! -Please unlock the selected database or choose another one which is unlocked.</source> - <translation>激活的数据库被锁定 ! -请解锁选定的数据库或选择另一已解锁的数据库。</translation> - </message> - <message> - <source>Successfully removed %1 encryption-%2 from KeePassX/Http Settings.</source> - <translation>成功移除 %1 加密 - %2 在 KeePassX/Http 设置中。</translation> - </message> - <message> - <source>No shared encryption-keys found in KeePassHttp Settings.</source> - <translation>没有在 KeePassHttp 设置中找到共享加密密钥。</translation> - </message> - <message> - <source>The active database does not contain an entry of KeePassHttp Settings.</source> - <translation>当前数据库中没有 KeePassHttp 设置的条目。</translation> - </message> - <message> - <source>Removing stored permissions...</source> - <translation>正在删除存储的权限...</translation> - </message> - <message> - <source>Abort</source> - <translation>中断</translation> - </message> - <message> - <source>Successfully removed permissions from %1 %2.</source> - <translation>成功移除 %1 %2 的权限。</translation> - </message> - <message> - <source>The active database does not contain an entry with permissions.</source> - <translation>当前数据库中不包含具有权限的条目。</translation> - </message> <message> <source>KeePassXC: New key association request</source> <translation>KeePassXC: 新的密钥关联请求</translation> @@ -2031,34 +3442,78 @@ give it a unique name to identify and accept it.</source> <source>KeePassXC: Overwrite existing key?</source> <translation>KeePassXC︰ 覆盖现有的密钥吗?</translation> </message> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>一个共享的加密密钥,名为"%1"已存在。 +你想要覆盖它吗?</translation> + </message> <message> <source>KeePassXC: Update Entry</source> <translation>KeePassXC︰ 更新条目</translation> </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>你想更新 %1-%2 中的信息吗?</translation> + </message> <message> <source>KeePassXC: Database locked!</source> <translation>KeePassXC︰ 数据库被锁定 !</translation> </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>激活的数据库被锁定 ! +请解锁选定的数据库或选择另一已解锁的数据库。</translation> + </message> <message> <source>KeePassXC: Removed keys from database</source> <translation>KeePassXC︰ 从数据库中删除键</translation> </message> + <message numerus="yes"> + <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No keys found</source> <translation>KeePassXC︰ 未找到键</translation> </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation>没有在 KeePassHttp 设置中找到共享加密密钥。</translation> + </message> <message> <source>KeePassXC: Settings not available!</source> <translation>KeePassXC︰ 设置不可用 !</translation> </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation>当前数据库中没有 KeePassHttp 设置的条目。</translation> + </message> + <message> + <source>Removing stored permissions...</source> + <translation>正在删除存储的权限...</translation> + </message> + <message> + <source>Abort</source> + <translation>中断</translation> + </message> <message> <source>KeePassXC: Removed permissions</source> <translation>KeePassXC︰ 已删除的权限</translation> </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entries.</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No entry with permissions found!</source> <translation>KeePassXC: 未找到权限的条目!</translation> </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>当前数据库中不包含具有权限的条目。</translation> + </message> </context> <context> <name>SettingsWidget</name> @@ -2081,10 +3536,26 @@ give it a unique name to identify and accept it.</source> </context> <context> <name>SettingsWidgetGeneral</name> + <message> + <source>Basic Settings</source> + <translation>基础设置</translation> + </message> + <message> + <source>Start only a single instance of KeePassXC</source> + <translation>只启动一个 KeePassXC 实例</translation> + </message> <message> <source>Remember last databases</source> <translation>记住最近的数据库</translation> </message> + <message> + <source>Remember last key files and security dongles</source> + <translation>记住上次的密钥文件和安全模块</translation> + </message> + <message> + <source>Load previous databases on startup</source> + <translation>在启动时加载最近的数据库</translation> + </message> <message> <source>Automatically save on exit</source> <translation>离开后自动保存</translation> @@ -2093,21 +3564,29 @@ give it a unique name to identify and accept it.</source> <source>Automatically save after every change</source> <translation>修改后自动保存</translation> </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation>当外部修改时自动重新加载数据库</translation> + </message> <message> <source>Minimize when copying to clipboard</source> <translation>复制到剪贴板后最小化</translation> </message> + <message> + <source>Minimize window at application startup</source> + <translation>在应用程序启动时窗口最小化</translation> + </message> <message> <source>Use group icon on entry creation</source> <translation>新增项目时使用群组图标</translation> </message> <message> - <source>Global Auto-Type shortcut</source> - <translation>自动输入全局快捷键</translation> + <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> + <translation>不要因非数据的更改而将数据库标记为已修改 (比如增加群组)</translation> </message> <message> - <source>Language</source> - <translation>语言</translation> + <source>Hide the Details view</source> + <translation type="unfinished"/> </message> <message> <source>Show a system tray icon</source> @@ -2117,67 +3596,61 @@ give it a unique name to identify and accept it.</source> <source>Hide window to system tray when minimized</source> <translation>将窗口最小化至任务栏</translation> </message> - <message> - <source>Load previous databases on startup</source> - <translation>在启动时加载最近的数据库</translation> - </message> - <message> - <source>Automatically reload the database when modified externally</source> - <translation>当外部修改时自动重新加载数据库</translation> - </message> <message> <source>Hide window to system tray instead of app exit</source> <translation>退出时将窗口最小化至任务栏</translation> </message> <message> - <source>Minimize window at application startup</source> - <translation>在应用程序启动时窗口最小化</translation> + <source>Dark system tray icon</source> + <translation type="unfinished"/> </message> <message> - <source>Basic Settings</source> - <translation>基础设置</translation> - </message> - <message> - <source>Remember last key files and security dongles</source> - <translation>记住上次的密钥文件和安全模块</translation> - </message> - <message> - <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> - <translation>不要因非数据的更改而将数据库标记为已修改 (比如增加群组)</translation> + <source>Language</source> + <translation>语言</translation> </message> <message> <source>Auto-Type</source> <translation>自动输入</translation> </message> <message> - <source>Use entry title and URL to match windows for global Auto-Type</source> - <translation>使用项目标题和 URL 来匹配自动输入的窗口</translation> + <source>Use entry title to match windows for global Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use entry URL to match windows for global Auto-Type</source> + <translation type="unfinished"/> </message> <message> <source>Always ask before performing Auto-Type</source> <translation>总在执行自动输入前询问</translation> </message> + <message> + <source>Global Auto-Type shortcut</source> + <translation>自动输入全局快捷键</translation> + </message> <message> <source>Auto-Type delay</source> <translation>自动输入延迟</translation> </message> <message> <source> ms</source> + <comment>Milliseconds</comment> <translation>毫秒</translation> </message> - <message> - <source>Start only a single instance of KeePassXC</source> - <translation>只启动一个 KeePassXC 实例</translation> - </message> </context> <context> <name>SettingsWidgetSecurity</name> + <message> + <source>Timeouts</source> + <translation>超时</translation> + </message> <message> <source>Clear clipboard after</source> <translation>在多久后清除剪贴板</translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation>秒</translation> </message> <message> @@ -2185,8 +3658,12 @@ give it a unique name to identify and accept it.</source> <translation>在多久没有动作之后锁住数据库</translation> </message> <message> - <source>Show passwords in cleartext by default</source> - <translation>默认以明码显示密码</translation> + <source>Convenience</source> + <translation>便利性</translation> + </message> + <message> + <source>Lock databases when session is locked or lid is closed</source> + <translation>系统锁定或盖子合上时锁定数据库</translation> </message> <message> <source>Lock databases after minimizing the window</source> @@ -2197,16 +3674,16 @@ give it a unique name to identify and accept it.</source> <translation>可见时不需要重复输入密码</translation> </message> <message> - <source>Timeouts</source> - <translation>超时</translation> + <source>Show passwords in cleartext by default</source> + <translation>默认以明码显示密码</translation> </message> <message> - <source>Convenience</source> - <translation>便利性</translation> + <source>Hide passwords in the preview panel</source> + <translation type="unfinished"/> </message> <message> - <source>Lock databases when session is locked or lid is closed</source> - <translation>系统锁定或盖子合上时锁定数据库</translation> + <source>Hide entry notes by default</source> + <translation type="unfinished"/> </message> <message> <source>Privacy</source> @@ -2227,6 +3704,14 @@ give it a unique name to identify and accept it.</source> <source>Key:</source> <translation>密钥:</translation> </message> + <message> + <source>Default RFC 6238 token settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Steam token settings</source> + <translation type="unfinished"/> + </message> <message> <source>Use custom settings</source> <translation>使用自定义设置</translation> @@ -2253,6 +3738,7 @@ give it a unique name to identify and accept it.</source> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation>秒</translation> </message> </context> @@ -2319,6 +3805,26 @@ give it a unique name to identify and accept it.</source> </context> <context> <name>main</name> + <message> + <source>Remove an entry from the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>数据库路径</translation> + </message> + <message> + <source>Path of the entry to remove.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation>KeePassXC - 跨平台密码管理软件</translation> + </message> + <message> + <source>filenames of the password databases to open (*.kdbx)</source> + <translation>将打开的密码数据库文件名(*.kdbx)</translation> + </message> <message> <source>path to a custom config file</source> <translation>自定义配置文件路径</translation> @@ -2327,81 +3833,13 @@ give it a unique name to identify and accept it.</source> <source>key file of the database</source> <translation>数据库密钥文件</translation> </message> - <message> - <source>KeePassXC - cross-platform password manager</source> - <translation>KeePassXC - 跨平台密码管理软件</translation> - </message> <message> <source>read password of the database from stdin</source> <translation>从标准输入读取数据库的密码</translation> </message> <message> - <source>filenames of the password databases to open (*.kdbx)</source> - <translation>将打开的密码数据库文件名(*.kdbx)</translation> - </message> - <message> - <source>Copy a password to the clipboard</source> - <translation>将密码复制到剪贴板</translation> - </message> - <message> - <source>Path of the database.</source> - <translation>数据库路径</translation> - </message> - <message> - <source>Use a GUI prompt unlocking the database.</source> - <translation>使用图形界面解锁数据库</translation> - </message> - <message> - <source>Name of the entry to clip.</source> - <translation>将复制的项目名称</translation> - </message> - <message> - <source>Extract and print the content of a database.</source> - <translation>提取并打印数据库内容</translation> - </message> - <message> - <source>Path of the database to extract.</source> - <translation>将提取的数据库路径</translation> - </message> - <message> - <source>Name of the command to execute.</source> - <translation>将执行的命令名称</translation> - </message> - <message> - <source>List database entries.</source> - <translation>列出数据库项目</translation> - </message> - <message> - <source>Path of the group to list. Default is /</source> - <translation>要将列出的群组路径,默认为 /</translation> - </message> - <message> - <source>Print the UUIDs of the entries and groups.</source> - <translation>打印项目和群组的 UUID</translation> - </message> - <message> - <source>Merge two databases.</source> - <translation>合并两个数据库</translation> - </message> - <message> - <source>Path of the database to merge into.</source> - <translation>合并成的数据库路径</translation> - </message> - <message> - <source>Path of the database to merge from.</source> - <translation>将合并的数据库路径</translation> - </message> - <message> - <source>Use the same password for both database files.</source> - <translation>两个数据库使用相同密码</translation> - </message> - <message> - <source>Show a password.</source> - <translation>显示密码</translation> - </message> - <message> - <source>Name of the entry to show.</source> - <translation>项目名称</translation> + <source>Parent window handle</source> + <translation type="unfinished"/> </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_zh_TW.ts b/share/translations/keepassx_zh_TW.ts index 54614e5cc..d84b9e0d0 100644 --- a/share/translations/keepassx_zh_TW.ts +++ b/share/translations/keepassx_zh_TW.ts @@ -9,14 +9,34 @@ <source>About</source> <translation>關於</translation> </message> + <message> + <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> + <translation>回報 Bug 請至:<a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> + </message> + <message> + <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>KeePassXC 遵循 GNU 通用公共許可證 (GPL) 第二版 或(依你的需求)以第三版發行。</translation> + </message> + <message> + <source>Project Maintainers:</source> + <translation>專案維護者:</translation> + </message> <message> <source>Contributors</source> <translation>貢獻者</translation> </message> + <message> + <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">在 GitHub 上看看有哪些貢獻者</a></translation> + </message> <message> <source>Debug Info</source> <translation>除錯資訊</translation> </message> + <message> + <source>Include the following information whenever you report a bug:</source> + <translation>回報 Bug 時會包含以下資訊:</translation> + </message> <message> <source>Copy to clipboard</source> <translation>複製到剪貼簿</translation> @@ -31,6 +51,10 @@ <source>Revision: %1</source> <translation>修訂:%1</translation> </message> + <message> + <source>Distribution: %1</source> + <translation>散佈:%1</translation> + </message> <message> <source>Libraries:</source> <translation>函式庫:</translation> @@ -47,33 +71,13 @@ Kernel: %3 %4</source> <source>Enabled extensions:</source> <translation>已啟用的擴充元件:</translation> </message> - <message> - <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> - <translation>回報 Bug 請至:<a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> - </message> - <message> - <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassXC 遵循 GNU 通用公共許可證 (GPL) 第二版 或(依你的需求)以第三版發行。</translation> - </message> - <message> - <source>Project Maintainers:</source> - <translation>專案維護者:</translation> - </message> - <message> - <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">在 GitHub 上看看有哪些貢獻者</a></translation> - </message> - <message> - <source>Include the following information whenever you report a bug:</source> - <translation>回報 Bug 時會包含以下資訊:</translation> - </message> - <message> - <source>Distribution: %1</source> - <translation>散佈:%1</translation> - </message> </context> <context> <name>AccessControlDialog</name> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>KeePassXC HTTP 確認存取</translation> + </message> <message> <source>Remember this decision</source> <translation>記住此決定</translation> @@ -92,9 +96,12 @@ Please select whether you want to allow access.</source> <translation>%1 要求存取下列項目的密碼。 請選擇是否允許存取。</translation> </message> +</context> +<context> + <name>AgentSettingsWidget</name> <message> - <source>KeePassXC HTTP Confirm Access</source> - <translation>KeePassXC HTTP 確認存取</translation> + <source>Enable SSH Agent (requires restart)</source> + <translation type="unfinished"/> </message> </context> <context> @@ -107,6 +114,26 @@ Please select whether you want to allow access.</source> <source>Auto-Type - KeePassXC</source> <translation>自動輸入 - KeePassXC</translation> </message> + <message> + <source>Auto-Type</source> + <translation>自動輸入</translation> + </message> + <message> + <source>The Syntax of your Auto-Type statement is incorrect!</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> </context> <context> <name>AutoTypeAssociationsModel</name> @@ -125,13 +152,290 @@ Please select whether you want to allow access.</source> </context> <context> <name>AutoTypeSelectDialog</name> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>自動輸入 - KeePassXC</translation> + </message> <message> <source>Select entry to Auto-Type:</source> <translation>選擇要自動輸入的項目</translation> </message> +</context> +<context> + <name>BrowserAccessControlDialog</name> <message> - <source>Auto-Type - KeePassXC</source> - <translation>自動輸入 - KeePassXC</translation> + <source>KeePassXC-Browser Confirm Access</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remember this decision</source> + <translation>記住此決定</translation> + </message> + <message> + <source>Allow</source> + <translation>允許</translation> + </message> + <message> + <source>Deny</source> + <translation>禁止</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 要求存取下列項目的密碼。 +請選擇是否允許存取。</translation> + </message> +</context> +<context> + <name>BrowserOptionDialog</name> + <message> + <source>Dialog</source> + <translation>對話方塊</translation> + </message> + <message> + <source>This is required for accessing your databases with KeePassXC-Browser</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable KeepassXC browser integration</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>一般</translation> + </message> + <message> + <source>Enable integration for these browsers:</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Google Chrome</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Firefox</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Chromium</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Vivaldi</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show a &notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>若資料庫已鎖定,則請求解鎖 (&Q)</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Match URL scheme (e.g., https://...)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>只回傳最佳的網址相符項目而非所有網址相符的項目。(&R)</translation> + </message> + <message> + <source>&Return only best-matching credentials</source> + <translation type="unfinished"/> + </message> + <message> + <source>Sort &matching credentials by title</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Sort matching credentials by &username</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>&Disconnect all browsers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Forget all remembered &permissions</source> + <translation type="unfinished"/> + </message> + <message> + <source>Advanced</source> + <translation>進階</translation> + </message> + <message> + <source>Never &ask before accessing credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Never ask before &updating credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>只有所選的資料庫能連接到客戶端。</translation> + </message> + <message> + <source>Searc&h in all opened databases for matching credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>不支援自動建立或更新文字欄位。</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>回傳 「KPH: 」 起首的進階文字欄位 (&R)</translation> + </message> + <message> + <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Update &native messaging manifest files at startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Support a proxy application between KeePassXC and browser extension.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &proxy application between KeePassXC and browser extension</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a custom proxy location if you installed a proxy manually.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &custom proxy location</source> + <comment>Meant is the proxy for KeePassXC-Browser</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*.exe);;All Files (*.*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select custom proxy location</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>BrowserService</name> + <message> + <source>KeePassXC: New key association request</source> + <translation>KeePassXC:新的金鑰關聯請求</translation> + </message> + <message> + <source>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Save and allow access</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC:覆蓋現有的金鑰?</translation> + </message> + <message> + <source>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC:更新項目</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>更新 %1 到 %2 的資訊?</translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC:資料庫已鎖定!</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>目前的資料庫已鎖定! +請解鎖所選的資料庫或選擇其他已解鎖的資料庫。</translation> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC:設定不可用!</translation> + </message> + <message> + <source>The active database does not contain a settings entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC:找不到金鑰</translation> + </message> + <message> + <source>No shared encryption keys found in KeePassXC Settings.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC:從資料庫中移除金鑰</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <source>Removing stored permissions…</source> + <translation type="unfinished"/> + </message> + <message> + <source>Abort</source> + <translation>中止</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC:已移除權限</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entry(s).</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation>KeePassXC:找不到帶有權限的項目!</translation> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>目前的資料庫中沒有帶有權限的項目。</translation> </message> </context> <context> @@ -148,6 +452,10 @@ Please select whether you want to allow access.</source> <source>Repeat password:</source> <translation>再次輸入密碼:</translation> </message> + <message> + <source>&Key file</source> + <translation>金鑰檔案 (&K)</translation> + </message> <message> <source>Browse</source> <translation>瀏覽</translation> @@ -156,6 +464,14 @@ Please select whether you want to allow access.</source> <source>Create</source> <translation>建立</translation> </message> + <message> + <source>Cha&llenge Response</source> + <translation>挑戰回應</translation> + </message> + <message> + <source>Refresh</source> + <translation>重新整理</translation> + </message> <message> <source>Key files</source> <translation>金鑰檔案</translation> @@ -176,6 +492,10 @@ Please select whether you want to allow access.</source> <source>Select a key file</source> <translation>選擇金鑰檔案</translation> </message> + <message> + <source>Empty password</source> + <translation>清空密碼</translation> + </message> <message> <source>Do you really want to use an empty string as password?</source> <translation>真的要使用空白密碼?</translation> @@ -191,20 +511,15 @@ Please select whether you want to allow access.</source> %2</translation> </message> <message> - <source>&Key file</source> - <translation>金鑰檔案 (&K)</translation> + <source>Legacy key file format</source> + <translation type="unfinished"/> </message> <message> - <source>Cha&llenge Response</source> - <translation>挑戰回應</translation> - </message> - <message> - <source>Refresh</source> - <translation>重新整理</translation> - </message> - <message> - <source>Empty password</source> - <translation>清空密碼</translation> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -217,6 +532,10 @@ Please select whether you want to allow access.</source> <source>Clone Options</source> <translation>複製選項</translation> </message> + <message> + <source>Append ' - Clone' to title</source> + <translation>在標題後追加「 - 複製」字樣</translation> + </message> <message> <source>Replace username and password with references</source> <translation>以引用資料取代使用者名稱與密碼</translation> @@ -225,10 +544,6 @@ Please select whether you want to allow access.</source> <source>Copy history</source> <translation>複製歷史記錄</translation> </message> - <message> - <source>Append ' - Clone' to title</source> - <translation>在標題後追加「 - 複製」字樣</translation> - </message> </context> <context> <name>CsvImportWidget</name> @@ -325,10 +640,6 @@ Please select whether you want to allow access.</source> </context> <context> <name>CsvImportWizard</name> - <message> - <source>Import CSV file</source> - <translation>匯入 CSV 檔</translation> - </message> <message> <source>Error</source> <translation>錯誤</translation> @@ -340,17 +651,17 @@ Please select whether you want to allow access.</source> </context> <context> <name>CsvParserModel</name> - <message> - <source> byte, </source> - <translation> 位元組, </translation> + <message numerus="yes"> + <source>%n byte(s), </source> + <translation type="unfinished"><numerusform></numerusform></translation> </message> - <message> - <source> rows, </source> - <translation> 行, </translation> + <message numerus="yes"> + <source>%n row(s), </source> + <translation type="unfinished"><numerusform></numerusform></translation> </message> - <message> - <source> columns</source> - <translation> 列</translation> + <message numerus="yes"> + <source>%n column(s)</source> + <translation type="unfinished"><numerusform></numerusform></translation> </message> </context> <context> @@ -371,6 +682,14 @@ Please select whether you want to allow access.</source> <source>Browse</source> <translation>瀏覽</translation> </message> + <message> + <source>Refresh</source> + <translation>重新整理</translation> + </message> + <message> + <source>Challenge Response:</source> + <translation>挑戰驗證:</translation> + </message> <message> <source>Unable to open the database.</source> <translation>無法開啟資料庫。</translation> @@ -379,6 +698,21 @@ Please select whether you want to allow access.</source> <source>Can't open key file</source> <translation>無法開啟金鑰檔案</translation> </message> + <message> + <source>Legacy key file format</source> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't show this warning again</source> + <translation type="unfinished"/> + </message> <message> <source>All files</source> <translation>所有檔案</translation> @@ -391,14 +725,6 @@ Please select whether you want to allow access.</source> <source>Select key file</source> <translation>選擇金鑰檔案</translation> </message> - <message> - <source>Refresh</source> - <translation>重新整理</translation> - </message> - <message> - <source>Challenge Response:</source> - <translation>挑戰驗證:</translation> - </message> </context> <context> <name>DatabaseRepairWidget</name> @@ -414,14 +740,14 @@ Please select whether you want to allow access.</source> <source>Can't open key file</source> <translation>無法開啟金鑰檔案</translation> </message> - <message> - <source>Database opened fine. Nothing to do.</source> - <translation>資料庫正常開啟。什麼都不做。</translation> - </message> <message> <source>Unable to open the database.</source> <translation>無法開啟資料庫。</translation> </message> + <message> + <source>Database opened fine. Nothing to do.</source> + <translation>資料庫正常開啟。什麼都不做。</translation> + </message> <message> <source>Success</source> <translation>成功</translation> @@ -439,40 +765,57 @@ You can now save it.</source> <context> <name>DatabaseSettingsWidget</name> <message> - <source>Database name:</source> - <translation>資料庫名稱:</translation> + <source>General</source> + <translation>一般</translation> </message> <message> - <source>Database description:</source> - <translation>資料庫描述:</translation> + <source>Encryption</source> + <translation type="unfinished"/> </message> <message> - <source>Transform rounds:</source> - <translation>加密轉換次數:</translation> + <source>Number of rounds too high</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> </message> <message> - <source>Default username:</source> - <translation>預設的使用者名稱:</translation> + <source>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</source> + <translation type="unfinished"/> </message> <message> - <source> MiB</source> - <translation> MiB</translation> + <source>Understood, keep number</source> + <translation type="unfinished"/> </message> <message> - <source>Benchmark</source> - <translation>效能測試</translation> + <source>Cancel</source> + <translation type="unfinished"/> </message> <message> - <source>Max. history items:</source> - <translation>最大歷史記錄項目:</translation> + <source>Number of rounds too low</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> </message> <message> - <source>Max. history size:</source> - <translation>最大歷史記錄大小:</translation> + <source>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</source> + <translation type="unfinished"/> </message> <message> - <source>Use recycle bin</source> - <translation>使用回收桶</translation> + <source>KDF unchanged</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetEncryption</name> + <message> + <source>Encryption Algorithm:</source> + <translation type="unfinished"/> </message> <message> <source>AES: 256 Bit (default)</source> @@ -483,14 +826,78 @@ You can now save it.</source> <translation>Twofish:256 位元</translation> </message> <message> - <source>Algorithm:</source> - <translation>演算法:</translation> + <source>Key Derivation Function:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Transform rounds:</source> + <translation>加密轉換次數:</translation> + </message> + <message> + <source>Benchmark 1-second delay</source> + <translation type="unfinished"/> + </message> + <message> + <source>Memory Usage:</source> + <translation type="unfinished"/> + </message> + <message> + <source> MB</source> + <translation type="unfinished"/> + </message> + <message> + <source>Parallelism:</source> + <translation type="unfinished"/> + </message> + <message> + <source> thread</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetGeneral</name> + <message> + <source>Database Meta Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database name:</source> + <translation>資料庫名稱:</translation> + </message> + <message> + <source>Database description:</source> + <translation>資料庫描述:</translation> + </message> + <message> + <source>Default username:</source> + <translation>預設的使用者名稱:</translation> + </message> + <message> + <source>History Settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Max. history items:</source> + <translation>最大歷史記錄項目:</translation> + </message> + <message> + <source>Max. history size:</source> + <translation>最大歷史記錄大小:</translation> + </message> + <message> + <source> MiB</source> + <translation> MiB</translation> + </message> + <message> + <source>Use recycle bin</source> + <translation>使用回收桶</translation> </message> </context> <context> <name>DatabaseTabWidget</name> <message> <source>Root</source> + <comment>Root group</comment> <translation>根</translation> </message> <message> @@ -509,6 +916,30 @@ You can now save it.</source> <source>File not found!</source> <translation>找不到檔案!</translation> </message> + <message> + <source>Unable to open the database.</source> + <translation>無法開啟資料庫。</translation> + </message> + <message> + <source>File opened in read only mode.</source> + <translation>已將檔案以唯讀模式開啟。</translation> + </message> + <message> + <source>Open CSV file</source> + <translation>開啟 CSV 檔</translation> + </message> + <message> + <source>CSV file</source> + <translation>CSV 檔案</translation> + </message> + <message> + <source>All files (*)</source> + <translation>所有檔案 (*)</translation> + </message> + <message> + <source>Merge database</source> + <translation>合併資料庫</translation> + </message> <message> <source>Open KeePass 1 database</source> <translation>開啟 KeePass 1 資料庫</translation> @@ -517,14 +948,16 @@ You can now save it.</source> <source>KeePass 1 database</source> <translation>KeePass 1 資料庫</translation> </message> - <message> - <source>All files (*)</source> - <translation>所有檔案 (*)</translation> - </message> <message> <source>Close?</source> <translation>關閉?</translation> </message> + <message> + <source>"%1" is in edit mode. +Discard changes and close anyway?</source> + <translation>「%1」 正在編輯模式中。 +是否要捨棄變更並關閉?</translation> + </message> <message> <source>Save changes?</source> <translation>儲存修改?</translation> @@ -539,13 +972,25 @@ Save changes?</source> <source>Writing the database failed.</source> <translation>寫入資料庫失敗。</translation> </message> + <message> + <source>Passwords</source> + <translation>密碼</translation> + </message> <message> <source>Save database as</source> <translation>資料庫另存為</translation> </message> + <message> + <source>Export database to CSV file</source> + <translation>將資料庫輸出成 CSV 檔案</translation> + </message> + <message> + <source>Writing the CSV file failed.</source> + <translation>寫入 CSV 檔案失敗。</translation> + </message> <message> <source>New database</source> - <translation>新的資料庫</translation> + <translation>新增資料庫</translation> </message> <message> <source>locked</source> @@ -560,12 +1005,6 @@ Save changes?</source> Please press cancel to finish your changes or discard them.</source> <translation>目前正在編輯中,所以無法鎖定資料庫。 請按取消以完成修改或捨棄修改。</translation> - </message> - <message> - <source>This database has never been saved. -You can save the database or stop locking it.</source> - <translation>資料庫尚未儲存。 -可以先儲存資料庫或是停止鎖定資料庫</translation> </message> <message> <source>This database has been modified. @@ -575,69 +1014,13 @@ Otherwise your changes are lost.</source> 要在鎖定之前儲存資料庫? 不然則會遺失所有修改。</translation> </message> - <message> - <source>"%1" is in edit mode. -Discard changes and close anyway?</source> - <translation>「%1」 正在編輯模式中。 -是否要捨棄變更並關閉?</translation> - </message> - <message> - <source>Export database to CSV file</source> - <translation>將資料庫輸出成 CSV 檔案</translation> - </message> - <message> - <source>CSV file</source> - <translation>CSV 檔案</translation> - </message> - <message> - <source>Writing the CSV file failed.</source> - <translation>寫入 CSV 檔案失敗。</translation> - </message> - <message> - <source>Unable to open the database.</source> - <translation>無法開啟資料庫。</translation> - </message> - <message> - <source>Merge database</source> - <translation>合併資料庫</translation> - </message> - <message> - <source>The database you are trying to save as is locked by another instance of KeePassXC. -Do you want to save it anyway?</source> - <translation>欲儲存的資料庫已由其他 KeePassXC 程式鎖定。 -仍要繼續儲存?</translation> - </message> - <message> - <source>Passwords</source> - <translation>密碼</translation> - </message> - <message> - <source>Database already opened</source> - <translation>資料庫已開啟</translation> - </message> - <message> - <source>The database you are trying to open is locked by another instance of KeePassXC. - -Do you want to open it anyway?</source> - <translation>欲開啟的資料庫已由其他 KeePassXC 程式鎖定。 - -仍要繼續開啟?</translation> - </message> - <message> - <source>Open read-only</source> - <translation>以唯讀模式開啟</translation> - </message> - <message> - <source>File opened in read only mode.</source> - <translation>已將檔案以唯讀模式開啟。</translation> - </message> - <message> - <source>Open CSV file</source> - <translation>開啟 CSV 檔</translation> - </message> </context> <context> <name>DatabaseWidget</name> + <message> + <source>Searching...</source> + <translation>搜尋中……</translation> + </message> <message> <source>Change master key</source> <translation>變更主金鑰</translation> @@ -658,13 +1041,33 @@ Do you want to open it anyway?</source> <source>Do you really want to delete %1 entries for good?</source> <translation>真的要永久刪除 %1 個項目?</translation> </message> + <message> + <source>Move entry to recycle bin?</source> + <translation>將項目移到回收桶?</translation> + </message> + <message> + <source>Do you really want to move entry "%1" to the recycle bin?</source> + <translation>真的要將「%1」移到回收桶?</translation> + </message> <message> <source>Move entries to recycle bin?</source> <translation>將項目移到回收桶?</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>真的要將 %n 個項目移到回收桶?</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <source>Execute command?</source> + <translation>執行命令?</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation>真的要執行下列命令?<br><br>%1<br></translation> + </message> + <message> + <source>Remember my choice</source> + <translation>記住我的選擇</translation> </message> <message> <source>Delete group?</source> @@ -678,18 +1081,6 @@ Do you want to open it anyway?</source> <source>Unable to calculate master key</source> <translation>無法計算主金鑰</translation> </message> - <message> - <source>Move entry to recycle bin?</source> - <translation>將項目移到回收桶?</translation> - </message> - <message> - <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation>真的要將「%1」移到回收桶?</translation> - </message> - <message> - <source>Searching...</source> - <translation>搜尋中……</translation> - </message> <message> <source>No current database.</source> <translation>無目前資料庫。</translation> @@ -707,20 +1098,8 @@ Do you want to open it anyway?</source> <translation>無結果</translation> </message> <message> - <source>Execute command?</source> - <translation>執行命令?</translation> - </message> - <message> - <source>Do you really want to execute the following command?<br><br>%1<br></source> - <translation>真的要執行下列命令?<br><br>%1<br></translation> - </message> - <message> - <source>Remember my choice</source> - <translation>記住我的選擇</translation> - </message> - <message> - <source>Autoreload Request</source> - <translation>自動重新讀取請求</translation> + <source>File has changed</source> + <translation type="unfinished"/> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -731,8 +1110,9 @@ Do you want to open it anyway?</source> <translation>合併請求</translation> </message> <message> - <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> - <translation>資料庫檔案已變更,且有尚未儲存的變更。合併變更?</translation> + <source>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</source> + <translation type="unfinished"/> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -747,6 +1127,89 @@ Do you want to open it anyway?</source> <translation>確定要永久刪除回收桶內的項目?</translation> </message> </context> +<context> + <name>DetailsWidget</name> + <message> + <source>Generate TOTP Token</source> + <translation type="unfinished"/> + </message> + <message> + <source>Close</source> + <translation>關閉</translation> + </message> + <message> + <source>General</source> + <translation>一般</translation> + </message> + <message> + <source>Password</source> + <translation>密碼</translation> + </message> + <message> + <source>URL</source> + <translation>網址</translation> + </message> + <message> + <source>Expiration</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username</source> + <translation>使用者名稱</translation> + </message> + <message> + <source>Autotype</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searching</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attributes</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation>附件</translation> + </message> + <message> + <source>Notes</source> + <translation>附註</translation> + </message> + <message> + <source>Window</source> + <translation>視窗</translation> + </message> + <message> + <source>Sequence</source> + <translation>序列</translation> + </message> + <message> + <source>Search</source> + <translation>搜尋</translation> + </message> + <message> + <source>Clear</source> + <translation>清除</translation> + </message> + <message> + <source>Never</source> + <translation type="unfinished"/> + </message> + <message> + <source>[PROTECTED]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Disabled</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enabled</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EditEntryWidget</name> <message> @@ -773,6 +1236,30 @@ Do you want to open it anyway?</source> <source>History</source> <translation>歷史記錄</translation> </message> + <message> + <source>SSH Agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>(encrypted)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>File too large to be a private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open private key</source> + <translation type="unfinished"/> + </message> <message> <source>Entry history</source> <translation>項目歷史記錄</translation> @@ -793,40 +1280,6 @@ Do you want to open it anyway?</source> <source>New attribute</source> <translation>新的屬性</translation> </message> - <message> - <source>Select file</source> - <translation>選擇檔案</translation> - </message> - <message> - <source>Unable to open file</source> - <translation>無法開啟檔案</translation> - </message> - <message> - <source>Save attachment</source> - <translation>儲存附件</translation> - </message> - <message> - <source>Unable to save the attachment: -</source> - <translation>無法儲存附件: -</translation> - </message> - <message> - <source>Tomorrow</source> - <translation>明天</translation> - </message> - <message numerus="yes"> - <source>%n week(s)</source> - <translation><numerusform>%n 個禮拜</numerusform></translation> - </message> - <message numerus="yes"> - <source>%n month(s)</source> - <translation><numerusform>%n 個月</numerusform></translation> - </message> - <message> - <source>1 year</source> - <translation>1 年</translation> - </message> <message> <source>Confirm Remove</source> <translation>確認移除</translation> @@ -836,12 +1289,28 @@ Do you want to open it anyway?</source> <translation>確定要移除此屬性?</translation> </message> <message> - <source>[PROTECTED] Press reveal to view or edit</source> - <translation>[受保護的內容] 請按「揭示」以檢視或編輯</translation> + <source>[PROTECTED]</source> + <translation type="unfinished"/> </message> <message> - <source>Are you sure you want to remove this attachment?</source> - <translation>確定要移除此附件?</translation> + <source>Press reveal to view or edit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Tomorrow</source> + <translation>明天</translation> + </message> + <message numerus="yes"> + <source>%n week(s)</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source>%n month(s)</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <source>1 year</source> + <translation>1 年</translation> </message> </context> <context> @@ -858,18 +1327,6 @@ Do you want to open it anyway?</source> <source>Remove</source> <translation>移除</translation> </message> - <message> - <source>Attachments</source> - <translation>附件</translation> - </message> - <message> - <source>Save</source> - <translation>儲存</translation> - </message> - <message> - <source>Open</source> - <translation>開啟</translation> - </message> <message> <source>Edit Name</source> <translation>編輯名稱</translation> @@ -882,6 +1339,10 @@ Do you want to open it anyway?</source> <source>Reveal</source> <translation>揭示</translation> </message> + <message> + <source>Attachments</source> + <translation>附件</translation> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -889,6 +1350,18 @@ Do you want to open it anyway?</source> <source>Enable Auto-Type for this entry</source> <translation>啟用此項目的自動輸入</translation> </message> + <message> + <source>Inherit default Auto-Type sequence from the &group</source> + <translation>從群組中繼承預設的自動輸入序列 (&G)</translation> + </message> + <message> + <source>&Use custom Auto-Type sequence:</source> + <translation>使用自訂的自動輸入序列 (&U):</translation> + </message> + <message> + <source>Window Associations</source> + <translation>視窗關聯</translation> + </message> <message> <source>+</source> <translation>+</translation> @@ -901,14 +1374,6 @@ Do you want to open it anyway?</source> <source>Window title:</source> <translation>視窗標題:</translation> </message> - <message> - <source>Inherit default Auto-Type sequence from the &group</source> - <translation>從群組中繼承預設的自動輸入序列 (&G)</translation> - </message> - <message> - <source>&Use custom Auto-Type sequence:</source> - <translation>使用自訂的自動輸入序列 (&U):</translation> - </message> <message> <source>Use default se&quence</source> <translation>使用預設序列 (&Q)</translation> @@ -917,10 +1382,6 @@ Do you want to open it anyway?</source> <source>Set custo&m sequence:</source> <translation>設定自訂序列 (&M):</translation> </message> - <message> - <source>Window Associations</source> - <translation>視窗關聯</translation> - </message> </context> <context> <name>EditEntryWidgetHistory</name> @@ -944,12 +1405,8 @@ Do you want to open it anyway?</source> <context> <name>EditEntryWidgetMain</name> <message> - <source>Title:</source> - <translation>標題:</translation> - </message> - <message> - <source>Username:</source> - <translation>使用者名稱:</translation> + <source>URL:</source> + <translation>網址:</translation> </message> <message> <source>Password:</source> @@ -960,20 +1417,104 @@ Do you want to open it anyway?</source> <translation>重複:</translation> </message> <message> - <source>URL:</source> - <translation>網址:</translation> + <source>Title:</source> + <translation>標題:</translation> </message> <message> - <source>Expires</source> - <translation>過期</translation> + <source>Notes</source> + <translation>附註</translation> </message> <message> <source>Presets</source> <translation>預設</translation> </message> <message> - <source>Notes:</source> - <translation>附註:</translation> + <source>Toggle the checkbox to reveal the notes section.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username:</source> + <translation>使用者名稱:</translation> + </message> + <message> + <source>Expires</source> + <translation>過期</translation> + </message> +</context> +<context> + <name>EditEntryWidgetSSHAgent</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent after</source> + <translation type="unfinished"/> + </message> + <message> + <source> seconds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fingerprint</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent when database is closed/locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add key to agent when database is opened/unlocked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Comment</source> + <translation type="unfinished"/> + </message> + <message> + <source>Decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy to clipboard</source> + <translation>複製到剪貼簿</translation> + </message> + <message> + <source>Private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>External file</source> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Attachment</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add to agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove from agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Require user confirmation when this key is used</source> + <translation type="unfinished"/> </message> </context> <context> @@ -1044,6 +1585,14 @@ Do you want to open it anyway?</source> </context> <context> <name>EditWidgetIcons</name> + <message> + <source>&Use default icon</source> + <translation>使用預設圖示 (&U)</translation> + </message> + <message> + <source>Use custo&m icon</source> + <translation>使用自訂圖示 (&M)</translation> + </message> <message> <source>Add custom icon</source> <translation>加入自訂圖示</translation> @@ -1052,6 +1601,18 @@ Do you want to open it anyway?</source> <source>Delete custom icon</source> <translation>刪除自訂圖示</translation> </message> + <message> + <source>Download favicon</source> + <translation>下載圖示</translation> + </message> + <message> + <source>Unable to fetch favicon.</source> + <translation>無法擷取圖示。</translation> + </message> + <message> + <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> + <translation>提示:可以啟用 Google 當作備案。選項請至 工具>設定>安全性</translation> + </message> <message> <source>Images</source> <translation>圖片</translation> @@ -1064,25 +1625,13 @@ Do you want to open it anyway?</source> <source>Select Image</source> <translation>選擇圖片</translation> </message> - <message> - <source>Download favicon</source> - <translation>下載圖示</translation> - </message> - <message> - <source>Unable to fetch favicon.</source> - <translation>無法擷取圖示。</translation> - </message> <message> <source>Can't read icon</source> <translation>無法讀取圖示</translation> </message> <message> - <source>&Use default icon</source> - <translation>使用預設圖示 (&U)</translation> - </message> - <message> - <source>Use custo&m icon</source> - <translation>使用自訂圖示 (&M)</translation> + <source>Custom icon already exists</source> + <translation>自訂圖示已經存在</translation> </message> <message> <source>Confirm Delete</source> @@ -1092,14 +1641,6 @@ Do you want to open it anyway?</source> <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> <translation>有 %1 個項目使用此圖示,並將以預設圖示取代。確定要刪除圖示?</translation> </message> - <message> - <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation>提示:可以啟用 Google 當作備案。選項請至 工具>設定>安全性</translation> - </message> - <message> - <source>Custom icon already exists</source> - <translation>自訂圖示已經存在</translation> - </message> </context> <context> <name>EditWidgetProperties</name> @@ -1124,9 +1665,93 @@ Do you want to open it anyway?</source> <name>Entry</name> <message> <source> - Clone</source> + <comment>Suffix added to cloned entries</comment> <translation> - 複製</translation> </message> </context> +<context> + <name>EntryAttachmentsModel</name> + <message> + <source>Name</source> + <translation>名稱</translation> + </message> + <message> + <source>Size</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EntryAttachmentsWidget</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add</source> + <translation>加入</translation> + </message> + <message> + <source>Remove</source> + <translation>移除</translation> + </message> + <message> + <source>Open</source> + <translation>開啟</translation> + </message> + <message> + <source>Save</source> + <translation>儲存</translation> + </message> + <message> + <source>Select files</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <source>Are you sure you want to remove %n attachment(s)?</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>確認移除</translation> + </message> + <message> + <source>Save attachments</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to create directory: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Confirm overwrite</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to save attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachment: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open files: +%1</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>EntryAttributesModel</name> <message> @@ -1155,6 +1780,11 @@ Do you want to open it anyway?</source> </context> <context> <name>EntryModel</name> + <message> + <source>Ref: </source> + <comment>Reference abbreviation</comment> + <translation>引用: </translation> + </message> <message> <source>Group</source> <translation>群組</translation> @@ -1171,11 +1801,6 @@ Do you want to open it anyway?</source> <source>URL</source> <translation>網址</translation> </message> - <message> - <source>Ref: </source> - <comment>Reference abbreviation</comment> - <translation>引用: </translation> - </message> </context> <context> <name>Group</name> @@ -1184,6 +1809,17 @@ Do you want to open it anyway?</source> <translation>回收桶</translation> </message> </context> +<context> + <name>HostInstaller</name> + <message> + <source>KeePassXC: Cannot save file!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot save the native messaging script file.</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>HttpPasswordGeneratorWidget</name> <message> @@ -1246,6 +1882,361 @@ Do you want to open it anyway?</source> <translation>關閉訊息</translation> </message> </context> +<context> + <name>Kdbx3Reader</name> + <message> + <source>Unable to calculate master key</source> + <translation>無法計算主金鑰</translation> + </message> + <message> + <source>Unable to issue challenge-response.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>金鑰不正確或是資料庫損壞。</translation> + </message> +</context> +<context> + <name>Kdbx3Writer</name> + <message> + <source>Unable to issue challenge-response.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>無法計算主金鑰</translation> + </message> +</context> +<context> + <name>Kdbx4Reader</name> + <message> + <source>missing database headers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>無法計算主金鑰</translation> + </message> + <message> + <source>Invalid header checksum size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Header SHA256 mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header data length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open buffer for KDF parameters in header</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported key derivation function (KDF) or invalid parameters</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy header fields found in KDBX4 file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header binary size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass variant map version.</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name data</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value data</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Bool entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry type</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map field type size</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Kdbx4Writer</name> + <message> + <source>Invalid symmetric cipher algorithm.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid symmetric cipher IV size.</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>無法計算主金鑰</translation> + </message> + <message> + <source>Failed to serialize KDF parameters variant map</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxReader</name> + <message> + <source>Invalid cipher uuid length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid compression flags length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported compression algorithm</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid master seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform rounds size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid start bytes size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid random stream id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner random stream cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>並非 KeePass 資料庫。</translation> + </message> + <message> + <source>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> + <translation>選擇的檔案是舊的 KeePass 1 資料庫 (.kdb)。 + +你可以點選 資料庫 > 「匯入 KeePass 1 資料庫……」。 +這是單向遷移。你無法用舊的 KeePassX 0.4 的版本開啟已匯入的資料庫。</translation> + </message> + <message> + <source>Unsupported KeePass 2 database version.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxXmlReader</name> + <message> + <source>XML parsing failure: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>No root group</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing icon uuid or data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing custom data key or value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Multiple group elements</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null group uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableAutoType value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableSearching value</source> + <translation type="unfinished"/> + </message> + <message> + <source>No group uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null DeleteObject uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing DeletedObject uuid or time</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null entry uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element in history entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>No entry uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element with different uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decrypt entry string</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate custom attribute found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry string key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate attachment found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry binary key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-type association window or sequence missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid bool value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid date time value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color rgb part</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid uuid value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decompress binary</source> + <extracomment>Translator meant is a binary data inside an entry</extracomment> + <translation type="unfinished"/> + </message> +</context> <context> <name>KeePass1OpenWidget</name> <message> @@ -1275,6 +2266,35 @@ Do you want to open it anyway?</source> <source>Unsupported KeePass database version.</source> <translation>不支援的 KeePass 資料庫版本。</translation> </message> + <message> + <source>Unable to read encryption IV</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of groups</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid content hash size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of transform rounds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to construct group tree</source> + <translation type="unfinished"/> + </message> <message> <source>Root</source> <translation>根</translation> @@ -1287,60 +2307,104 @@ Do you want to open it anyway?</source> <source>Wrong key or database file is corrupt.</source> <translation>金鑰不正確或是資料庫損壞。</translation> </message> -</context> -<context> - <name>KeePass2Reader</name> <message> - <source>Not a KeePass database.</source> - <translation>並非 KeePass 資料庫。</translation> - </message> - <message> - <source>Unsupported KeePass database version.</source> - <translation>不支援的 KeePass 資料庫版本。</translation> - </message> - <message> - <source>Wrong key or database file is corrupt.</source> - <translation>金鑰不正確或是資料庫損壞。</translation> - </message> - <message> - <source>Unable to calculate master key</source> - <translation>無法計算主金鑰</translation> - </message> - <message> - <source>Unable to issue challenge-response.</source> + <source>Key transformation failed</source> <translation type="unfinished"/> </message> <message> - <source>The selected file is an old KeePass 1 database (.kdb). - -You can import it by clicking on Database > 'Import KeePass 1 database...'. -This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> - <translation>選擇的檔案是舊的 KeePass 1 資料庫 (.kdb)。 - -你可以點選 資料庫 > 「匯入 KeePass 1 資料庫……」。 -這是單向遷移。你無法用舊的 KeePassX 0.4 的版本開啟已匯入的資料庫。</translation> - </message> -</context> -<context> - <name>KeePass2Writer</name> - <message> - <source>Unable to issue challenge-response.</source> + <source>Invalid group field type number</source> <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>無法計算主金鑰</translation> + <source>Invalid group field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read group field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group access time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group level field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing group id or level</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing entry field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read entry field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry uuid field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field type</source> + <translation type="unfinished"/> </message> </context> <context> <name>Main</name> <message> - <source>Fatal error while testing the cryptographic functions.</source> - <translation>測試加密函數時發生重大錯誤。</translation> - </message> - <message> - <source>KeePassXC - Error</source> - <translation>KeePassXC - 錯誤</translation> + <source>Existing single-instance lock file is invalid. Launching new instance.</source> + <translation type="unfinished"/> </message> <message> <source>The lock file could not be created. Single-instance mode disabled.</source> @@ -1351,64 +2415,32 @@ This is a one-way migration. You won't be able to open the imported databas <translation>其他 KeePassXC 程式正在運行中。</translation> </message> <message> - <source>Existing single-instance lock file is invalid. Launching new instance.</source> - <translation type="unfinished"/> + <source>Fatal error while testing the cryptographic functions.</source> + <translation>測試加密函數時發生重大錯誤。</translation> + </message> + <message> + <source>KeePassXC - Error</source> + <translation>KeePassXC - 錯誤</translation> </message> </context> <context> <name>MainWindow</name> <message> - <source>Open database</source> - <translation>開啟資料庫</translation> - </message> - <message> - <source>Database settings</source> - <translation>資料庫設定</translation> - </message> - <message> - <source>Copy username to clipboard</source> - <translation>將使用者名稱複製到剪貼簿</translation> - </message> - <message> - <source>Copy password to clipboard</source> - <translation>將密碼複製到剪貼簿</translation> - </message> - <message> - <source>Settings</source> - <translation>設定</translation> - </message> - <message> - <source>Show toolbar</source> - <translation>顯示工具列</translation> - </message> - <message> - <source>read-only</source> - <translation>唯讀</translation> - </message> - <message> - <source>Toggle window</source> - <translation>切換視窗</translation> - </message> - <message> - <source>KeePass 2 Database</source> - <translation>KeePass 2 資料庫</translation> - </message> - <message> - <source>All files</source> - <translation>所有檔案</translation> - </message> - <message> - <source>Save repaired database</source> - <translation>儲存已修復的資料庫</translation> - </message> - <message> - <source>Writing the database failed.</source> - <translation>寫入資料庫失敗。</translation> + <source>&Database</source> + <translation>資料庫 (&D)</translation> </message> <message> <source>&Recent databases</source> <translation>最近的資料庫 (&R)</translation> </message> + <message> + <source>Import</source> + <translation>匯入</translation> + </message> + <message> + <source>&Help</source> + <translation>幫助 (&H)</translation> + </message> <message> <source>E&ntries</source> <translation>項目 (&N)</translation> @@ -1417,13 +2449,17 @@ This is a one-way migration. You won't be able to open the imported databas <source>Copy att&ribute to clipboard</source> <translation>複製屬性到剪貼簿 (&R)</translation> </message> + <message> + <source>Time-based one-time password</source> + <translation type="unfinished"/> + </message> <message> <source>&Groups</source> <translation>群組 (&G)</translation> </message> <message> - <source>&View</source> - <translation>檢視 (&V)</translation> + <source>&Tools</source> + <translation>工具 (&T)</translation> </message> <message> <source>&Quit</source> @@ -1433,6 +2469,10 @@ This is a one-way migration. You won't be able to open the imported databas <source>&About</source> <translation>關於 (&A)</translation> </message> + <message> + <source>&Open database...</source> + <translation>開啟資料庫…… (&O)</translation> + </message> <message> <source>&Save database</source> <translation>儲存資料庫 (&S)</translation> @@ -1473,26 +2513,26 @@ This is a one-way migration. You won't be able to open the imported databas <source>&Delete group</source> <translation>刪除群組 (&D)</translation> </message> + <message> + <source>Sa&ve database as...</source> + <translation>將資料庫儲存為…… (&V)</translation> + </message> + <message> + <source>Change &master key...</source> + <translation>變更主金鑰…… (&M)</translation> + </message> <message> <source>&Database settings</source> <translation>資料庫設定 (&D)</translation> </message> + <message> + <source>Database settings</source> + <translation>資料庫設定</translation> + </message> <message> <source>&Clone entry</source> <translation>複製項目 (&C)</translation> </message> - <message> - <source>Timed one-time password</source> - <translation>定時型一次性密碼 (TOTP)</translation> - </message> - <message> - <source>Copy &TOTP</source> - <translation>複製 TOTP (&T)</translation> - </message> - <message> - <source>Show TOTP</source> - <translation>顯示 TOTP</translation> - </message> <message> <source>&Find</source> <translation>尋找 (&F)</translation> @@ -1501,14 +2541,26 @@ This is a one-way migration. You won't be able to open the imported databas <source>Copy &username</source> <translation>複製使用者名稱 (&U)</translation> </message> + <message> + <source>Copy username to clipboard</source> + <translation>將使用者名稱複製到剪貼簿</translation> + </message> <message> <source>Cop&y password</source> <translation>複製密碼 (&Y)</translation> </message> + <message> + <source>Copy password to clipboard</source> + <translation>將密碼複製到剪貼簿</translation> + </message> <message> <source>&Settings</source> <translation>設定 (&S)</translation> </message> + <message> + <source>Password Generator</source> + <translation>密碼產生器</translation> + </message> <message> <source>&Perform Auto-Type</source> <translation>執行自動輸入 (&P)</translation> @@ -1525,65 +2577,25 @@ This is a one-way migration. You won't be able to open the imported databas <source>&Title</source> <translation>標題 (&T)</translation> </message> + <message> + <source>Copy title to clipboard</source> + <translation type="unfinished"/> + </message> <message> <source>&URL</source> <translation>網址 (&U)</translation> </message> + <message> + <source>Copy URL to clipboard</source> + <translation type="unfinished"/> + </message> <message> <source>&Notes</source> <translation>附註 (&N)</translation> </message> <message> - <source>Password Generator</source> - <translation>密碼產生器</translation> - </message> - <message> - <source>Clear history</source> - <translation>清除歷史記錄</translation> - </message> - <message> - <source>&Database</source> - <translation>資料庫 (&D)</translation> - </message> - <message> - <source>Import</source> - <translation>匯入</translation> - </message> - <message> - <source>&Tools</source> - <translation>工具 (&T)</translation> - </message> - <message> - <source>Empty recycle bin</source> - <translation>清空回收桶</translation> - </message> - <message> - <source>Access error for config file %1</source> - <translation>設定檔存取錯誤:%1</translation> - </message> - <message> - <source>Quit KeePassXC</source> - <translation>退出 KeePassXC</translation> - </message> - <message> - <source>Please touch the button on your YubiKey!</source> - <translation>請觸摸你 YubiKey 上的按鈕!</translation> - </message> - <message> - <source>&Help</source> - <translation>幫助 (&H)</translation> - </message> - <message> - <source>&Open database...</source> - <translation>開啟資料庫…… (&O)</translation> - </message> - <message> - <source>Sa&ve database as...</source> - <translation>將資料庫儲存為…… (&V)</translation> - </message> - <message> - <source>Change &master key...</source> - <translation>變更主金鑰…… (&M)</translation> + <source>Copy notes to clipboard</source> + <translation type="unfinished"/> </message> <message> <source>&Export to CSV file...</source> @@ -1601,10 +2613,169 @@ This is a one-way migration. You won't be able to open the imported databas <source>Re&pair database...</source> <translation>修復資料庫…… (&P)</translation> </message> + <message> + <source>Show TOTP</source> + <translation>顯示 TOTP</translation> + </message> <message> <source>Set up TOTP...</source> <translation>安裝 TOTP</translation> </message> + <message> + <source>Copy &TOTP</source> + <translation>複製 TOTP (&T)</translation> + </message> + <message> + <source>E&mpty recycle bin</source> + <translation type="unfinished"/> + </message> + <message> + <source>Clear history</source> + <translation>清除歷史記錄</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation>設定檔存取錯誤:%1</translation> + </message> + <message> + <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> + <translation type="unfinished"/> + </message> + <message> + <source>read-only</source> + <translation>唯讀</translation> + </message> + <message> + <source>Settings</source> + <translation>設定</translation> + </message> + <message> + <source>Toggle window</source> + <translation>切換視窗</translation> + </message> + <message> + <source>Quit KeePassXC</source> + <translation>退出 KeePassXC</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>KeePass 2 資料庫</translation> + </message> + <message> + <source>All files</source> + <translation>所有檔案</translation> + </message> + <message> + <source>Open database</source> + <translation>開啟資料庫</translation> + </message> + <message> + <source>Save repaired database</source> + <translation>儲存已修復的資料庫</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>寫入資料庫失敗。</translation> + </message> + <message> + <source>Please touch the button on your YubiKey!</source> + <translation>請觸摸你 YubiKey 上的按鈕!</translation> + </message> +</context> +<context> + <name>OpenSSHKey</name> + <message> + <source>Invalid key file, expecting an OpenSSH key</source> + <translation type="unfinished"/> + </message> + <message> + <source>PEM boundary mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>This is not an OpenSSH key, only modern keys are supported</source> + <translation type="unfinished"/> + </message> + <message> + <source>Base64 decoding failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file way too small.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file magic header id invalid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Found zero keys</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to read public key.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Corrupted key file, reading private key failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>No private key payload to decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Trying to run KDF without cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Passphrase is required to decrypt this key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key derivation failed, key file corrupted?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Decryption failed, wrong passphrase?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write public key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write private key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing private key</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OptionDialog</name> @@ -1612,22 +2783,63 @@ This is a one-way migration. You won't be able to open the imported databas <source>Dialog</source> <translation>對話方塊</translation> </message> + <message> + <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation>啟用後才能讓 ChromeIPass 或 PassIFox 存取你的資料庫</translation> + </message> + <message> + <source>Enable KeePassHTTP server</source> + <translation>啟用 KeePassHTTP 伺服器</translation> + </message> <message> <source>General</source> <translation>一般</translation> </message> <message> <source>Sh&ow a notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> <translation>要求憑證時顯示通知 (&O)</translation> </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>只回傳最佳的網址相符項目而非所有網址相符的項目。(&R)</translation> + </message> + <message> + <source>&Return only best matching entries</source> + <translation>只回傳最佳的相符項目 (&R)</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>若資料庫已鎖定,則請求解鎖 (&Q)</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> + <translation>只顯示相同協定的項目。(http://, https://, ftp://, ...)</translation> + </message> + <message> + <source>&Match URL schemes</source> + <translation>符合網址協定 (&M)</translation> + </message> <message> <source>Sort matching entries by &username</source> <translation>依使用者名稱排序符合項目 (&U)</translation> </message> + <message> + <source>Sort &matching entries by title</source> + <translation>依名稱排序符合項目 (&M)</translation> + </message> + <message> + <source>R&emove all shared encryption keys from active database</source> + <translation>從目前的資料庫移除所有共用的加密金鑰 (&E)</translation> + </message> <message> <source>Re&move all stored permissions from entries in active database</source> <translation>從目前的資料庫項目中移除所有權限。</translation> </message> + <message> + <source>Password Generator</source> + <translation>密碼產生器</translation> + </message> <message> <source>Advanced</source> <translation>進階</translation> @@ -1640,10 +2852,22 @@ This is a one-way migration. You won't be able to open the imported databas <source>Always allow &updating entries</source> <translation>總是允許更新項目 (&U)</translation> </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>只有所選的資料庫能連接到客戶端。</translation> + </message> <message> <source>Searc&h in all opened databases for matching entries</source> <translation>在所有開啟的資料庫內搜尋相符的項目 (&H)</translation> </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>不支援自動建立或更新文字欄位。</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation>回傳 「KPH: 」 起首的進階文字欄位 (&R)</translation> + </message> <message> <source>HTTP Port:</source> <translation>HTTP 埠:</translation> @@ -1652,18 +2876,18 @@ This is a one-way migration. You won't be able to open the imported databas <source>Default port: 19455</source> <translation>預設埠:19455</translation> </message> - <message> - <source>Re&quest to unlock the database if it is locked</source> - <translation>若資料庫已鎖定,則請求解鎖 (&Q)</translation> - </message> - <message> - <source>Sort &matching entries by title</source> - <translation>依名稱排序符合項目 (&M)</translation> - </message> <message> <source>KeePassXC will listen to this port on 127.0.0.1</source> <translation>KeePassXC 會在 127.0.0.1 上監聽此埠</translation> </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> + <translation type="unfinished"/> + </message> <message> <source>Cannot bind to privileged ports</source> <translation>無法綁定到特殊權限埠</translation> @@ -1674,63 +2898,30 @@ Using default port 19455.</source> <translation>無法綁定到 1024 以下的特殊權限埠! 將使用預設埠 19455。</translation> </message> - <message> - <source>R&emove all shared encryption keys from active database</source> - <translation>從目前的資料庫移除所有共用的加密金鑰 (&E)</translation> - </message> - <message> - <source>&Return advanced string fields which start with "KPH: "</source> - <translation>回傳 「KPH: 」 起首的進階文字欄位 (&R)</translation> - </message> - <message> - <source>Automatically creating or updating string fields is not supported.</source> - <translation>不支援自動建立或更新文字欄位。</translation> - </message> - <message> - <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> - <translation>啟用後才能讓 ChromeIPass 或 PassIFox 存取你的資料庫</translation> - </message> - <message> - <source>Enable KeePassHTTP server</source> - <translation>啟用 KeePassHTTP 伺服器</translation> - </message> - <message> - <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation>只回傳最佳的網址相符項目而非所有網址相符的項目。(&R)</translation> - </message> - <message> - <source>&Return only best matching entries</source> - <translation>只回傳最佳的相符項目 (&R)</translation> - </message> - <message> - <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation>只顯示相同協定的項目。(http://, https://, ftp://, ...)</translation> - </message> - <message> - <source>&Match URL schemes</source> - <translation>符合網址協定 (&M)</translation> - </message> - <message> - <source>Password Generator</source> - <translation>密碼產生器</translation> - </message> - <message> - <source>Only the selected database has to be connected with a client.</source> - <translation>只有所選的資料庫能連接到客戶端。</translation> - </message> - <message> - <source>The following options can be dangerous! -Change them only if you know what you are doing.</source> - <translation>下列選項具有相當風險! -了解其作用前切勿變更。</translation> - </message> </context> <context> <name>PasswordGeneratorWidget</name> + <message> + <source>%p%</source> + <translation>%p%</translation> + </message> <message> <source>Password:</source> <translation>密碼:</translation> </message> + <message> + <source>strength</source> + <comment>Password strength</comment> + <translation>強度</translation> + </message> + <message> + <source>entropy</source> + <translation>entropy</translation> + </message> + <message> + <source>Password</source> + <translation>密碼</translation> + </message> <message> <source>Character Types</source> <translation>字元類型</translation> @@ -1751,77 +2942,21 @@ Change them only if you know what you are doing.</source> <source>Special Characters</source> <translation>特殊字元</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>擴展 ASCII 碼</translation> + </message> <message> <source>Exclude look-alike characters</source> <translation>去除相似的字元</translation> </message> - <message> - <source>Accept</source> - <translation>接受</translation> - </message> - <message> - <source>%p%</source> - <translation>%p%</translation> - </message> - <message> - <source>strength</source> - <translation>強度</translation> - </message> - <message> - <source>entropy</source> - <translation>entropy</translation> - </message> - <message> - <source>&Length:</source> - <translation>長度 (&L):</translation> - </message> <message> <source>Pick characters from every group</source> <translation>從每一組中選擇字元</translation> </message> <message> - <source>Generate</source> - <translation>產生</translation> - </message> - <message> - <source>Close</source> - <translation>關閉</translation> - </message> - <message> - <source>Apply</source> - <translation>套用</translation> - </message> - <message> - <source>Entropy: %1 bit</source> - <translation type="unfinished"/> - </message> - <message> - <source>Password Quality: %1</source> - <translation>密碼素質:%1</translation> - </message> - <message> - <source>Poor</source> - <translation>極弱</translation> - </message> - <message> - <source>Weak</source> - <translation>較弱</translation> - </message> - <message> - <source>Good</source> - <translation>較好</translation> - </message> - <message> - <source>Excellent</source> - <translation>極好</translation> - </message> - <message> - <source>Password</source> - <translation>密碼</translation> - </message> - <message> - <source>Extended ASCII</source> - <translation>擴展 ASCII 碼</translation> + <source>&Length:</source> + <translation>長度 (&L):</translation> </message> <message> <source>Passphrase</source> @@ -1839,13 +2974,300 @@ Change them only if you know what you are doing.</source> <source>Word Separator:</source> <translation>單詞分隔符號:</translation> </message> + <message> + <source>Generate</source> + <translation>產生</translation> + </message> <message> <source>Copy</source> <translation>複製</translation> </message> + <message> + <source>Accept</source> + <translation>接受</translation> + </message> + <message> + <source>Close</source> + <translation>關閉</translation> + </message> + <message> + <source>Apply</source> + <translation>套用</translation> + </message> + <message> + <source>Entropy: %1 bit</source> + <translation>Entropy: %1 bit</translation> + </message> + <message> + <source>Password Quality: %1</source> + <translation>密碼素質:%1</translation> + </message> + <message> + <source>Poor</source> + <comment>Password quality</comment> + <translation>極弱</translation> + </message> + <message> + <source>Weak</source> + <comment>Password quality</comment> + <translation>較弱</translation> + </message> + <message> + <source>Good</source> + <comment>Password quality</comment> + <translation>較好</translation> + </message> + <message> + <source>Excellent</source> + <comment>Password quality</comment> + <translation>極好</translation> + </message> </context> <context> <name>QObject</name> + <message> + <source>Database not opened</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database hash not available</source> + <translation type="unfinished"/> + </message> + <message> + <source>Client public key not received</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot decrypt message</source> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout or cannot connect to KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>Action cancelled or denied</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC association failed, try again</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key change was not successful</source> + <translation type="unfinished"/> + </message> + <message> + <source>Encryption key is not recognized</source> + <translation type="unfinished"/> + </message> + <message> + <source>No saved databases found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect action</source> + <translation type="unfinished"/> + </message> + <message> + <source>Empty message received</source> + <translation type="unfinished"/> + </message> + <message> + <source>No URL provided</source> + <translation type="unfinished"/> + </message> + <message> + <source>No logins found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown error</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add a new entry to a database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>資料庫的路徑。</translation> + </message> + <message> + <source>Key file of the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>path</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>username</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL</source> + <translation>網址</translation> + </message> + <message> + <source>Prompt for the entry's password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a password for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length for the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to add.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy an entry's password to the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to clip.</source> + <comment>clip = copy to clipboard</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout in seconds before clearing the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Edit an entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Title for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>title</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to edit.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Estimate the entropy of a password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password for which to estimate the entropy.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Perform advanced analysis on the password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Extract and print the content of a database.</source> + <translation>提取與列印資料庫內容。</translation> + </message> + <message> + <source>Path of the database to extract.</source> + <translation>要提取的資料庫路徑。</translation> + </message> + <message> + <source>Insert password to unlock %1: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to load key file %1 : %2</source> + <translation type="unfinished"/> + </message> + <message> + <source>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source> + +Available commands: +</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the command to execute.</source> + <translation>要執行的命令的名稱。</translation> + </message> + <message> + <source>List database entries.</source> + <translation>列出資料庫項目。</translation> + </message> + <message> + <source>Path of the group to list. Default is /</source> + <translation>要列出的群組路徑。預設是 /</translation> + </message> + <message> + <source>Find entries quickly.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Search term.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Merge two databases.</source> + <translation>合併兩個資料庫。</translation> + </message> + <message> + <source>Path of the database to merge into.</source> + <translation>合併時的目標資料庫路徑。</translation> + </message> + <message> + <source>Path of the database to merge from.</source> + <translation>合併時的來源資料庫路徑。</translation> + </message> + <message> + <source>Use the same credentials for both database files.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file of the database to merge from.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show an entry's information.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> + <translation type="unfinished"/> + </message> + <message> + <source>attribute</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the entry to show.</source> + <translation>要顯示的項目名稱。</translation> + </message> <message> <source>NULL device</source> <translation>NULL 裝置</translation> @@ -1869,7 +3291,27 @@ Change them only if you know what you are doing.</source> <translation>缺少右引號</translation> </message> <message> - <source>INTERNAL - unget lower bound exceeded</source> + <source>AES: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Twofish: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>ChaCha20: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Argon2 (KDBX 4 – recommended)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 4)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 3.1)</source> <translation type="unfinished"/> </message> <message> @@ -1888,14 +3330,22 @@ Change them only if you know what you are doing.</source> <source>Password</source> <translation>密碼</translation> </message> - <message> - <source>URL</source> - <translation>網址</translation> - </message> <message> <source>Notes</source> <translation>附註</translation> </message> + <message> + <source>Last Modified</source> + <translation type="unfinished"/> + </message> + <message> + <source>Created</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy Browser Integration</source> + <translation type="unfinished"/> + </message> <message> <source>Browser Integration</source> <translation>瀏覽器整合</translation> @@ -1912,6 +3362,10 @@ Change them only if you know what you are doing.</source> <source>Passive</source> <translation type="unfinished"/> </message> + <message> + <source>SSH Agent</source> + <translation type="unfinished"/> + </message> </context> <context> <name>QtIOCompressor</name> @@ -1950,8 +3404,8 @@ Change them only if you know what you are doing.</source> <context> <name>SearchWidget</name> <message> - <source>Case Sensitive</source> - <translation>區分大小寫</translation> + <source>Search...</source> + <translation>搜尋……</translation> </message> <message> <source>Search</source> @@ -1962,8 +3416,8 @@ Change them only if you know what you are doing.</source> <translation>清除</translation> </message> <message> - <source>Search...</source> - <translation>搜尋……</translation> + <source>Case Sensitive</source> + <translation>區分大小寫</translation> </message> <message> <source>Limit search to selected group</source> @@ -1972,50 +3426,6 @@ Change them only if you know what you are doing.</source> </context> <context> <name>Service</name> - <message> - <source>A shared encryption-key with the name "%1" already exists. -Do you want to overwrite it?</source> - <translation>已存在名為「%1」的共用加密金鑰。 -進行覆蓋?</translation> - </message> - <message> - <source>Do you want to update the information in %1 - %2?</source> - <translation>更新 %1 到 %2 的資訊?</translation> - </message> - <message> - <source>The active database is locked! -Please unlock the selected database or choose another one which is unlocked.</source> - <translation>目前的資料庫已鎖定! -請解鎖所選的資料庫或選擇其他已解鎖的資料庫。</translation> - </message> - <message> - <source>Successfully removed %1 encryption-%2 from KeePassX/Http Settings.</source> - <translation>成功從 KeePassX/Http Settings 移除 %1 encryption-%2。</translation> - </message> - <message> - <source>No shared encryption-keys found in KeePassHttp Settings.</source> - <translation>KeePassHttp Settings 中找不到共享加密金鑰。</translation> - </message> - <message> - <source>The active database does not contain an entry of KeePassHttp Settings.</source> - <translation>目前的資料庫沒有 KeePassHttp Settings 項目。</translation> - </message> - <message> - <source>Removing stored permissions...</source> - <translation>正在移除所有已儲存的權限……</translation> - </message> - <message> - <source>Abort</source> - <translation>中止</translation> - </message> - <message> - <source>Successfully removed permissions from %1 %2.</source> - <translation>成功從 %1 %2 移除權限。</translation> - </message> - <message> - <source>The active database does not contain an entry with permissions.</source> - <translation>目前的資料庫中沒有帶有權限的項目。</translation> - </message> <message> <source>KeePassXC: New key association request</source> <translation>KeePassXC:新的金鑰關聯請求</translation> @@ -2032,34 +3442,78 @@ give it a unique name to identify and accept it.</source> <source>KeePassXC: Overwrite existing key?</source> <translation>KeePassXC:覆蓋現有的金鑰?</translation> </message> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>已存在名為「%1」的共用加密金鑰。 +進行覆蓋?</translation> + </message> <message> <source>KeePassXC: Update Entry</source> <translation>KeePassXC:更新項目</translation> </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>更新 %1 到 %2 的資訊?</translation> + </message> <message> <source>KeePassXC: Database locked!</source> <translation>KeePassXC:資料庫已鎖定!</translation> </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>目前的資料庫已鎖定! +請解鎖所選的資料庫或選擇其他已解鎖的資料庫。</translation> + </message> <message> <source>KeePassXC: Removed keys from database</source> <translation>KeePassXC:從資料庫中移除金鑰</translation> </message> + <message numerus="yes"> + <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No keys found</source> <translation>KeePassXC:找不到金鑰</translation> </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation>KeePassHttp Settings 中找不到共享加密金鑰。</translation> + </message> <message> <source>KeePassXC: Settings not available!</source> <translation>KeePassXC:設定不可用!</translation> </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation>目前的資料庫沒有 KeePassHttp Settings 項目。</translation> + </message> + <message> + <source>Removing stored permissions...</source> + <translation>正在移除所有已儲存的權限……</translation> + </message> + <message> + <source>Abort</source> + <translation>中止</translation> + </message> <message> <source>KeePassXC: Removed permissions</source> <translation>KeePassXC:已移除權限</translation> </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entries.</source> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> <message> <source>KeePassXC: No entry with permissions found!</source> <translation>KeePassXC:找不到帶有權限的項目!</translation> </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>目前的資料庫中沒有帶有權限的項目。</translation> + </message> </context> <context> <name>SettingsWidget</name> @@ -2082,10 +3536,26 @@ give it a unique name to identify and accept it.</source> </context> <context> <name>SettingsWidgetGeneral</name> + <message> + <source>Basic Settings</source> + <translation>基本設定</translation> + </message> + <message> + <source>Start only a single instance of KeePassXC</source> + <translation type="unfinished"/> + </message> <message> <source>Remember last databases</source> <translation>記住最近的資料庫</translation> </message> + <message> + <source>Remember last key files and security dongles</source> + <translation>記住最近的金鑰檔案與安全鎖</translation> + </message> + <message> + <source>Load previous databases on startup</source> + <translation>啟動時載入之前的資料庫</translation> + </message> <message> <source>Automatically save on exit</source> <translation>離開時,自動儲存</translation> @@ -2094,21 +3564,29 @@ give it a unique name to identify and accept it.</source> <source>Automatically save after every change</source> <translation>修改後,自動儲存</translation> </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation>當有外部修改時自動重新載入資料庫</translation> + </message> <message> <source>Minimize when copying to clipboard</source> <translation>在複製到剪貼簿時最小化</translation> </message> + <message> + <source>Minimize window at application startup</source> + <translation>程式啟動時視窗最小化</translation> + </message> <message> <source>Use group icon on entry creation</source> <translation>新增項目時使用群組圖示</translation> </message> <message> - <source>Global Auto-Type shortcut</source> - <translation>全域自動輸入快捷鍵</translation> + <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> + <translation>未變更資料時(例如:擴展群組時)不要將資料庫標記為已修改</translation> </message> <message> - <source>Language</source> - <translation>語言</translation> + <source>Hide the Details view</source> + <translation type="unfinished"/> </message> <message> <source>Show a system tray icon</source> @@ -2118,67 +3596,61 @@ give it a unique name to identify and accept it.</source> <source>Hide window to system tray when minimized</source> <translation>將視窗最小化至工作列</translation> </message> - <message> - <source>Load previous databases on startup</source> - <translation>啟動時載入之前的資料庫</translation> - </message> - <message> - <source>Automatically reload the database when modified externally</source> - <translation>當有外部修改時自動重新載入資料庫</translation> - </message> <message> <source>Hide window to system tray instead of app exit</source> <translation>將視窗最小化至工作列而非關閉程式</translation> </message> <message> - <source>Minimize window at application startup</source> - <translation>程式啟動時視窗最小化</translation> + <source>Dark system tray icon</source> + <translation type="unfinished"/> </message> <message> - <source>Basic Settings</source> - <translation>基本設定</translation> - </message> - <message> - <source>Remember last key files and security dongles</source> - <translation>記住最近的金鑰檔案與安全鎖</translation> - </message> - <message> - <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> - <translation>未變更資料時(例如:擴展群組時)不要將資料庫標記為已修改</translation> + <source>Language</source> + <translation>語言</translation> </message> <message> <source>Auto-Type</source> <translation>自動輸入</translation> </message> <message> - <source>Use entry title and URL to match windows for global Auto-Type</source> - <translation>使用項目標題與網址來找尋自動輸入的目標視窗</translation> + <source>Use entry title to match windows for global Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use entry URL to match windows for global Auto-Type</source> + <translation type="unfinished"/> </message> <message> <source>Always ask before performing Auto-Type</source> <translation>在執行自動輸入前始終詢問</translation> </message> + <message> + <source>Global Auto-Type shortcut</source> + <translation>全域自動輸入快捷鍵</translation> + </message> <message> <source>Auto-Type delay</source> <translation>自動輸入延遲</translation> </message> <message> <source> ms</source> + <comment>Milliseconds</comment> <translation>毫秒</translation> </message> - <message> - <source>Start only a single instance of KeePassXC</source> - <translation type="unfinished"/> - </message> </context> <context> <name>SettingsWidgetSecurity</name> + <message> + <source>Timeouts</source> + <translation>超時</translation> + </message> <message> <source>Clear clipboard after</source> <translation>多久後清除剪貼簿</translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation> 秒</translation> </message> <message> @@ -2186,8 +3658,12 @@ give it a unique name to identify and accept it.</source> <translation>多久沒有動作之後鎖定資料庫</translation> </message> <message> - <source>Show passwords in cleartext by default</source> - <translation>預設以明碼顯示密碼</translation> + <source>Convenience</source> + <translation>便利</translation> + </message> + <message> + <source>Lock databases when session is locked or lid is closed</source> + <translation>當工作階段鎖定或蓋上螢幕時鎖定資料庫</translation> </message> <message> <source>Lock databases after minimizing the window</source> @@ -2198,16 +3674,16 @@ give it a unique name to identify and accept it.</source> <translation>顯示密碼時不需要重複輸入密碼</translation> </message> <message> - <source>Timeouts</source> - <translation>超時</translation> + <source>Show passwords in cleartext by default</source> + <translation>預設以明碼顯示密碼</translation> </message> <message> - <source>Convenience</source> - <translation>便利</translation> + <source>Hide passwords in the preview panel</source> + <translation type="unfinished"/> </message> <message> - <source>Lock databases when session is locked or lid is closed</source> - <translation>當工作階段鎖定或蓋上螢幕時鎖定資料庫</translation> + <source>Hide entry notes by default</source> + <translation type="unfinished"/> </message> <message> <source>Privacy</source> @@ -2228,6 +3704,14 @@ give it a unique name to identify and accept it.</source> <source>Key:</source> <translation>金鑰:</translation> </message> + <message> + <source>Default RFC 6238 token settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Steam token settings</source> + <translation type="unfinished"/> + </message> <message> <source>Use custom settings</source> <translation>使用自訂設定</translation> @@ -2254,6 +3738,7 @@ give it a unique name to identify and accept it.</source> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation> 秒</translation> </message> </context> @@ -2320,6 +3805,26 @@ give it a unique name to identify and accept it.</source> </context> <context> <name>main</name> + <message> + <source>Remove an entry from the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>資料庫的路徑。</translation> + </message> + <message> + <source>Path of the entry to remove.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation>KeePassXC - 跨平台的密碼管理工具</translation> + </message> + <message> + <source>filenames of the password databases to open (*.kdbx)</source> + <translation>欲開啟的密碼資料庫檔名 (*.kdbx)</translation> + </message> <message> <source>path to a custom config file</source> <translation>自訂設定檔路徑</translation> @@ -2328,81 +3833,13 @@ give it a unique name to identify and accept it.</source> <source>key file of the database</source> <translation>資料庫的金鑰檔案</translation> </message> - <message> - <source>KeePassXC - cross-platform password manager</source> - <translation>KeePassXC - 跨平台的密碼管理工具</translation> - </message> <message> <source>read password of the database from stdin</source> <translation>從 stdin 讀取資料庫密碼</translation> </message> <message> - <source>filenames of the password databases to open (*.kdbx)</source> - <translation>欲開啟的密碼資料庫檔名 (*.kdbx)</translation> - </message> - <message> - <source>Copy a password to the clipboard</source> - <translation>將密碼複製到剪貼簿</translation> - </message> - <message> - <source>Path of the database.</source> - <translation>資料庫的路徑。</translation> - </message> - <message> - <source>Use a GUI prompt unlocking the database.</source> - <translation>使用 GUI 提示來解鎖資料庫。</translation> - </message> - <message> - <source>Name of the entry to clip.</source> + <source>Parent window handle</source> <translation type="unfinished"/> </message> - <message> - <source>Extract and print the content of a database.</source> - <translation>提取與列印資料庫內容。</translation> - </message> - <message> - <source>Path of the database to extract.</source> - <translation>要提取的資料庫路徑。</translation> - </message> - <message> - <source>Name of the command to execute.</source> - <translation>要執行的命令的名稱。</translation> - </message> - <message> - <source>List database entries.</source> - <translation>列出資料庫項目。</translation> - </message> - <message> - <source>Path of the group to list. Default is /</source> - <translation>要列出的群組路徑。預設是 /</translation> - </message> - <message> - <source>Print the UUIDs of the entries and groups.</source> - <translation>列印項目與群組的 UUID</translation> - </message> - <message> - <source>Merge two databases.</source> - <translation>合併兩個資料庫。</translation> - </message> - <message> - <source>Path of the database to merge into.</source> - <translation>合併時的目標資料庫路徑。</translation> - </message> - <message> - <source>Path of the database to merge from.</source> - <translation>合併時的來源資料庫路徑。</translation> - </message> - <message> - <source>Use the same password for both database files.</source> - <translation>在這兩個資料庫檔案使用相同的密碼。</translation> - </message> - <message> - <source>Show a password.</source> - <translation>顯示密碼。</translation> - </message> - <message> - <source>Name of the entry to show.</source> - <translation>要顯示的項目名稱。</translation> - </message> </context> </TS> \ No newline at end of file From c824b0694e062c3c88b8e94eb9533146d956007f Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sat, 20 Jan 2018 17:05:29 +0100 Subject: [PATCH 292/402] Only update source files and pull in translations, don't push anything --- release-tool | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/release-tool b/release-tool index 492f7c08c..601e66474 100755 --- a/release-tool +++ b/release-tool @@ -458,7 +458,8 @@ merge() { performChecks logInfo "Updating language files..." - ./share/translations/update.sh + ./share/translations/update.sh update + ./share/translations/update.sh pull if [ 0 -ne $? ]; then exitError "Updating translations failed!" fi From e4088d5e6cdbb231d54f0ceaa66d6af3bc526f45 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Mon, 22 Jan 2018 15:44:42 +0100 Subject: [PATCH 293/402] quit autotype dialog with esc key --- src/autotype/AutoTypeSelectDialog.cpp | 1 + src/autotype/AutoTypeSelectView.cpp | 17 +++++++++++++++++ src/autotype/AutoTypeSelectView.h | 4 ++++ 3 files changed, 22 insertions(+) diff --git a/src/autotype/AutoTypeSelectDialog.cpp b/src/autotype/AutoTypeSelectDialog.cpp index 240dd723b..b39c78e1d 100644 --- a/src/autotype/AutoTypeSelectDialog.cpp +++ b/src/autotype/AutoTypeSelectDialog.cpp @@ -58,6 +58,7 @@ AutoTypeSelectDialog::AutoTypeSelectDialog(QWidget* parent) connect(m_view, SIGNAL(activated(QModelIndex)), SLOT(emitEntryActivated(QModelIndex))); connect(m_view, SIGNAL(clicked(QModelIndex)), SLOT(emitEntryActivated(QModelIndex))); + connect(m_view, SIGNAL(rejected()), SLOT(reject())); connect(m_view->model(), SIGNAL(rowsRemoved(QModelIndex,int,int)), SLOT(entryRemoved())); layout->addWidget(m_view); diff --git a/src/autotype/AutoTypeSelectView.cpp b/src/autotype/AutoTypeSelectView.cpp index 717e20a31..76d57ec60 100644 --- a/src/autotype/AutoTypeSelectView.cpp +++ b/src/autotype/AutoTypeSelectView.cpp @@ -17,7 +17,9 @@ #include "AutoTypeSelectView.h" +#include <QKeyEvent> #include <QMouseEvent> +#include <QDebug> AutoTypeSelectView::AutoTypeSelectView(QWidget* parent) : EntryView(parent) @@ -54,3 +56,18 @@ void AutoTypeSelectView::selectFirstEntry() setCurrentIndex(index); } } + +void AutoTypeSelectView::keyReleaseEvent(QKeyEvent* e) +{ + qDebug() << e->key(); + + if (!e->modifiers() || (e->modifiers() & Qt::KeypadModifier && e->key() == Qt::Key_Enter)) { + if (e->key() == Qt::Key_Escape) { + emit rejected(); + } else { + e->ignore(); + } + } else { + e->ignore(); + } +} \ No newline at end of file diff --git a/src/autotype/AutoTypeSelectView.h b/src/autotype/AutoTypeSelectView.h index a781757b8..aadf99fa6 100644 --- a/src/autotype/AutoTypeSelectView.h +++ b/src/autotype/AutoTypeSelectView.h @@ -31,9 +31,13 @@ public: protected: void mouseMoveEvent(QMouseEvent* event) override; + void keyReleaseEvent(QKeyEvent* e) override; private slots: void selectFirstEntry(); + +signals: + void rejected(); }; #endif // KEEPASSX_AUTOTYPESELECTVIEW_H From 745d255808b41b216484be0b42875c87ae8f491e Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Mon, 22 Jan 2018 21:51:09 +0100 Subject: [PATCH 294/402] add cyclic arrowkey navigation for entryview --- src/autotype/AutoTypeSelectView.cpp | 11 ++--------- src/gui/PasswordGeneratorWidget.cpp | 8 ++------ src/gui/entry/EntryView.cpp | 14 ++++++++++++++ 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/autotype/AutoTypeSelectView.cpp b/src/autotype/AutoTypeSelectView.cpp index 76d57ec60..7d9db4130 100644 --- a/src/autotype/AutoTypeSelectView.cpp +++ b/src/autotype/AutoTypeSelectView.cpp @@ -19,7 +19,6 @@ #include <QKeyEvent> #include <QMouseEvent> -#include <QDebug> AutoTypeSelectView::AutoTypeSelectView(QWidget* parent) : EntryView(parent) @@ -59,14 +58,8 @@ void AutoTypeSelectView::selectFirstEntry() void AutoTypeSelectView::keyReleaseEvent(QKeyEvent* e) { - qDebug() << e->key(); - - if (!e->modifiers() || (e->modifiers() & Qt::KeypadModifier && e->key() == Qt::Key_Enter)) { - if (e->key() == Qt::Key_Escape) { - emit rejected(); - } else { - e->ignore(); - } + if (e->key() == Qt::Key_Escape) { + emit rejected(); } else { e->ignore(); } diff --git a/src/gui/PasswordGeneratorWidget.cpp b/src/gui/PasswordGeneratorWidget.cpp index 08228ea1f..c9c10aa56 100644 --- a/src/gui/PasswordGeneratorWidget.cpp +++ b/src/gui/PasswordGeneratorWidget.cpp @@ -153,12 +153,8 @@ void PasswordGeneratorWidget::setStandaloneMode(bool standalone) void PasswordGeneratorWidget::keyPressEvent(QKeyEvent* e) { - if (!e->modifiers() || (e->modifiers() & Qt::KeypadModifier && e->key() == Qt::Key_Enter)) { - if (e->key() == Qt::Key_Escape && m_standalone == true) { - emit dialogTerminated(); - } else { - e->ignore(); - } + if (e->key() == Qt::Key_Escape && m_standalone == true) { + emit dialogTerminated(); } else { e->ignore(); } diff --git a/src/gui/entry/EntryView.cpp b/src/gui/entry/EntryView.cpp index ceb3c64a0..36d60ced5 100644 --- a/src/gui/entry/EntryView.cpp +++ b/src/gui/entry/EntryView.cpp @@ -121,6 +121,20 @@ void EntryView::keyPressEvent(QKeyEvent* event) #endif } + int last = m_model->rowCount() - 1; + + if (event->key() == Qt::Key_Up && currentIndex().row() == 0) { + QModelIndex index = m_sortModel->mapToSource(m_sortModel->index(last, 0)); + setCurrentEntry(m_model->entryFromIndex(index)); + return; + } + + if (event->key() == Qt::Key_Down && currentIndex().row() == last) { + QModelIndex index = m_sortModel->mapToSource(m_sortModel->index(0, 0)); + setCurrentEntry(m_model->entryFromIndex(index)); + return; + } + QTreeView::keyPressEvent(event); } From 0f5307437c1571537ffc9d44838d76de50c0aa47 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Mon, 22 Jan 2018 21:42:22 +0100 Subject: [PATCH 295/402] Fix multiple TOTP issues, resolves #1360 - Fix crash when deleting TOTP entry - Fix memory leak when selecting TOTP entries - Fix TOTP update timeout on DetailsWidget - Fix TOTP settings attributes not being applied before first call to totpSeed() --- src/core/Entry.cpp | 48 +++++++++++++++++++++++---------------- src/core/Entry.h | 1 + src/gui/DetailsWidget.cpp | 17 +++++++------- src/gui/DetailsWidget.h | 3 ++- src/gui/TotpDialog.cpp | 26 ++++++++------------- src/gui/TotpDialog.h | 6 +++-- 6 files changed, 54 insertions(+), 47 deletions(-) diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index 669be0ed1..ed8860835 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -45,6 +45,7 @@ Entry::Entry() m_data.totpStep = Totp::defaultStep; m_data.totpDigits = Totp::defaultDigits; + connect(m_attributes, SIGNAL(modified()), SLOT(updateTotp())); connect(m_attributes, SIGNAL(modified()), this, SIGNAL(modified())); connect(m_attributes, SIGNAL(defaultKeyModified()), SLOT(emitDataChanged())); connect(m_attachments, SIGNAL(modified()), this, SIGNAL(modified())); @@ -343,9 +344,8 @@ QString Entry::totp() const QString output = Totp::generateTotp(seed.toLatin1(), time, m_data.totpDigits, m_data.totpStep); return QString(output); - } else { - return QString(""); } + return {}; } void Entry::setTotp(const QString& seed, quint8& step, quint8& digits) @@ -388,23 +388,6 @@ QString Entry::totpSeed() const secret = m_attributes->value("TOTP Seed"); } - m_data.totpDigits = Totp::defaultDigits; - m_data.totpStep = Totp::defaultStep; - - if (m_attributes->hasKey("TOTP Settings")) { - // this regex must be kept in sync with the set of allowed short names Totp::shortNameToEncoder - QRegularExpression rx(QString("(\\d+);((?:\\d+)|S)")); - QRegularExpressionMatch m = rx.match(m_attributes->value("TOTP Settings")); - if (m.hasMatch()) { - m_data.totpStep = m.captured(1).toUInt(); - if (Totp::shortNameToEncoder.contains(m.captured(2))) { - m_data.totpDigits = Totp::shortNameToEncoder[m.captured(2)]; - } else { - m_data.totpDigits = m.captured(2).toUInt(); - } - } - } - return Totp::parseOtpString(secret, m_data.totpDigits, m_data.totpStep); } @@ -722,6 +705,33 @@ void Entry::updateModifiedSinceBegin() m_modifiedSinceBegin = true; } +/** + * Update TOTP data whenever entry attributes have changed. + */ +void Entry::updateTotp() +{ + m_data.totpDigits = Totp::defaultDigits; + m_data.totpStep = Totp::defaultStep; + + if (!m_attributes->hasKey("TOTP Settings")) { + return; + } + + // this regex must be kept in sync with the set of allowed short names Totp::shortNameToEncoder + QRegularExpression rx(QString("(\\d+);((?:\\d+)|S)")); + QRegularExpressionMatch m = rx.match(m_attributes->value("TOTP Settings")); + if (!m.hasMatch()) { + return; + } + + m_data.totpStep = static_cast<quint8>(m.captured(1).toUInt()); + if (Totp::shortNameToEncoder.contains(m.captured(2))) { + m_data.totpDigits = Totp::shortNameToEncoder[m.captured(2)]; + } else { + m_data.totpDigits = static_cast<quint8>(m.captured(2).toUInt()); + } +} + QString Entry::resolveMultiplePlaceholdersRecursive(const QString& str, int maxDepth) const { if (maxDepth <= 0) { diff --git a/src/core/Entry.h b/src/core/Entry.h index 266254e65..7b995b7ae 100644 --- a/src/core/Entry.h +++ b/src/core/Entry.h @@ -210,6 +210,7 @@ private slots: void emitDataChanged(); void updateTimeinfo(); void updateModifiedSinceBegin(); + void updateTotp(); private: QString resolveMultiplePlaceholdersRecursive(const QString& str, int maxDepth) const; diff --git a/src/gui/DetailsWidget.cpp b/src/gui/DetailsWidget.cpp index 44c29f8f8..9f0d2bfd8 100644 --- a/src/gui/DetailsWidget.cpp +++ b/src/gui/DetailsWidget.cpp @@ -20,16 +20,12 @@ #include "ui_DetailsWidget.h" #include <QDebug> -#include <QTimer> #include <QDir> #include <QDesktopServices> -#include <QTemporaryFile> #include "core/Config.h" #include "core/FilePath.h" -#include "core/TimeInfo.h" #include "gui/Clipboard.h" -#include "gui/DatabaseWidget.h" #include "entry/EntryAttachmentsModel.h" DetailsWidget::DetailsWidget(QWidget* parent) @@ -70,6 +66,9 @@ DetailsWidget::DetailsWidget(QWidget* parent) DetailsWidget::~DetailsWidget() { + if (m_timer) { + delete m_timer; + } } void DetailsWidget::getSelectedEntry(Entry* selectedEntry) @@ -154,13 +153,13 @@ void DetailsWidget::getSelectedEntry(Entry* selectedEntry) if (m_currentEntry->hasTotp()) { m_step = m_currentEntry->totpStep(); - if (nullptr != m_timer) { - m_timer->stop(); + if (m_timer) { + delete m_timer; } - m_timer = new QTimer(this); + m_timer = new QTimer(selectedEntry); connect(m_timer, SIGNAL(timeout()), this, SLOT(updateTotp())); updateTotp(); - m_timer->start(m_step * 10); + m_timer->start(m_step * 1000); m_ui->totpButton->show(); } @@ -288,7 +287,7 @@ void DetailsWidget::updateTotp() QString firstHalf = totpCode.left(totpCode.size() / 2); QString secondHalf = totpCode.mid(totpCode.size() / 2); m_ui->totpLabel->setText(firstHalf + " " + secondHalf); - } else if (nullptr != m_timer) { + } else if (m_timer) { m_timer->stop(); } } diff --git a/src/gui/DetailsWidget.h b/src/gui/DetailsWidget.h index 832839bbb..2af184c48 100644 --- a/src/gui/DetailsWidget.h +++ b/src/gui/DetailsWidget.h @@ -20,6 +20,7 @@ #include "gui/DatabaseWidget.h" #include <QWidget> +#include <QTimer> namespace Ui { class DetailsWidget; @@ -67,7 +68,7 @@ private: Entry* m_currentEntry; Group* m_currentGroup; quint8 m_step; - QTimer* m_timer; + QPointer<QTimer> m_timer = nullptr; QWidget* m_attributesTabWidget; QWidget* m_attachmentsTabWidget; QWidget* m_autotypeTabWidget; diff --git a/src/gui/TotpDialog.cpp b/src/gui/TotpDialog.cpp index 474acf773..7325d2536 100644 --- a/src/gui/TotpDialog.cpp +++ b/src/gui/TotpDialog.cpp @@ -20,33 +20,24 @@ #include "ui_TotpDialog.h" #include "core/Config.h" -#include "core/Entry.h" -#include "gui/DatabaseWidget.h" #include "gui/Clipboard.h" -#include <QTimer> -#include <QDateTime> -#include <QPushButton> - TotpDialog::TotpDialog(DatabaseWidget* parent, Entry* entry) : QDialog(parent) , m_ui(new Ui::TotpDialog()) + , m_totpUpdateTimer(new QTimer(entry)) + , m_entry(entry) { - m_entry = entry; - m_parent = parent; - m_step = m_entry->totpStep(); - m_ui->setupUi(this); + m_step = m_entry->totpStep(); uCounter = resetCounter(); updateProgressBar(); - QTimer* timer = new QTimer(this); - connect(timer, SIGNAL(timeout()), this, SLOT(updateProgressBar())); - connect(timer, SIGNAL(timeout()), this, SLOT(updateSeconds())); - timer->start(m_step * 10); - + connect(m_totpUpdateTimer, SIGNAL(timeout()), this, SLOT(updateProgressBar())); + connect(m_totpUpdateTimer, SIGNAL(timeout()), this, SLOT(updateSeconds())); + m_totpUpdateTimer->start(m_step * 10); updateTotp(); setAttribute(Qt::WA_DeleteOnClose); @@ -61,7 +52,7 @@ void TotpDialog::copyToClipboard() { clipboard()->setText(m_entry->totp()); if (config()->get("MinimizeOnCopy").toBool()) { - m_parent->window()->showMinimized(); + qobject_cast<DatabaseWidget*>(parent())->window()->showMinimized(); } } @@ -101,4 +92,7 @@ double TotpDialog::resetCounter() TotpDialog::~TotpDialog() { + if (m_totpUpdateTimer) { + delete m_totpUpdateTimer; + } } diff --git a/src/gui/TotpDialog.h b/src/gui/TotpDialog.h index 33eac6658..ce21a66fd 100644 --- a/src/gui/TotpDialog.h +++ b/src/gui/TotpDialog.h @@ -21,6 +21,8 @@ #include <QDialog> #include <QScopedPointer> +#include <QTimer> +#include <totp/totp.h> #include "core/Entry.h" #include "core/Database.h" #include "gui/DatabaseWidget.h" @@ -39,8 +41,9 @@ public: private: double uCounter; - quint8 m_step; + quint8 m_step = Totp::defaultStep; QScopedPointer<Ui::TotpDialog> m_ui; + QPointer<QTimer> m_totpUpdateTimer; private Q_SLOTS: void updateTotp(); @@ -51,7 +54,6 @@ private Q_SLOTS: protected: Entry* m_entry; - DatabaseWidget* m_parent; }; #endif // KEEPASSX_TOTPDIALOG_H From 045f157a6384dc68342cc709c9154c52f6ed95dd Mon Sep 17 00:00:00 2001 From: Christian Kieschnick <christian.kieschnick@hicknhack-software.com> Date: Mon, 15 Jan 2018 17:20:16 +0100 Subject: [PATCH 296/402] Add extend entry-size calculation (resolved #1387) Extended the calculation for the size of history items to match KeePass2 Small refactoring regarding readability in EntryAttachements --- src/core/AutoTypeAssociations.cpp | 9 +++++++++ src/core/AutoTypeAssociations.h | 1 + src/core/Entry.cpp | 12 ++++++------ src/core/EntryAttachments.cpp | 15 +++++++++++++-- src/core/EntryAttachments.h | 3 ++- src/core/EntryAttributes.cpp | 4 ++-- src/core/EntryAttributes.h | 2 +- 7 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/core/AutoTypeAssociations.cpp b/src/core/AutoTypeAssociations.cpp index 5ec4eb3b3..3d7a2c36f 100644 --- a/src/core/AutoTypeAssociations.cpp +++ b/src/core/AutoTypeAssociations.cpp @@ -103,6 +103,15 @@ int AutoTypeAssociations::size() const return m_associations.size(); } +int AutoTypeAssociations::associationsSize() const +{ + int size = 0; + foreach (const Association &association, m_associations) { + size += association.sequence.toUtf8().size() + association.window.toUtf8().size(); + } + return size; +} + void AutoTypeAssociations::clear() { m_associations.clear(); diff --git a/src/core/AutoTypeAssociations.h b/src/core/AutoTypeAssociations.h index 61ef3fd4a..31e58cda0 100644 --- a/src/core/AutoTypeAssociations.h +++ b/src/core/AutoTypeAssociations.h @@ -43,6 +43,7 @@ public: AutoTypeAssociations::Association get(int index) const; QList<AutoTypeAssociations::Association> getAll() const; int size() const; + int associationsSize() const; void clear(); private: diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index ed8860835..b8e589291 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -582,7 +582,7 @@ void Entry::truncateHistory() int histMaxSize = db->metadata()->historyMaxSize(); if (histMaxSize > -1) { int size = 0; - QSet<QByteArray> foundAttachments = attachments()->values().toSet(); + QSet<QByteArray> foundAttachments = attachments()->values(); QMutableListIterator<Entry*> i(m_history); i.toBack(); @@ -592,12 +592,12 @@ void Entry::truncateHistory() // don't calculate size if it's already above the maximum if (size <= histMaxSize) { size += historyItem->attributes()->attributesSize(); - - const QSet<QByteArray> newAttachments = historyItem->attachments()->values().toSet() - foundAttachments; - for (const QByteArray& attachment : newAttachments) { - size += attachment.size(); + size += historyItem->autoTypeAssociations()->associationsSize(); + size += historyItem->attachments()->attachmentsSize(foundAttachments); + foreach( const QString &tag, historyItem->tags().split(QRegExp(",|;|:"), QString::SkipEmptyParts)){ + size += tag.toUtf8().size(); } - foundAttachments += newAttachments; + foundAttachments += historyItem->attachments()->values(); } if (size > histMaxSize) { diff --git a/src/core/EntryAttachments.cpp b/src/core/EntryAttachments.cpp index 957558609..6d3e38bbb 100644 --- a/src/core/EntryAttachments.cpp +++ b/src/core/EntryAttachments.cpp @@ -18,6 +18,7 @@ #include "EntryAttachments.h" #include <QStringList> +#include <QSet> EntryAttachments::EntryAttachments(QObject* parent) : QObject(parent) @@ -34,9 +35,9 @@ bool EntryAttachments::hasKey(const QString& key) const return m_attachments.contains(key); } -QList<QByteArray> EntryAttachments::values() const +QSet<QByteArray> EntryAttachments::values() const { - return m_attachments.values(); + return m_attachments.values().toSet(); } QByteArray EntryAttachments::value(const QString& key) const @@ -151,3 +152,13 @@ bool EntryAttachments::operator!=(const EntryAttachments& other) const { return m_attachments != other.m_attachments; } + +int EntryAttachments::attachmentsSize(const QSet<QByteArray> &ignoredAttachments) const +{ + int size = 0; + const QSet<QByteArray> consideredAttachments = m_attachments.values().toSet() - ignoredAttachments; + for (const QByteArray& attachment : consideredAttachments) { + size += attachment.size(); + } + return size; +} diff --git a/src/core/EntryAttachments.h b/src/core/EntryAttachments.h index 0dba9543f..835a13dc8 100644 --- a/src/core/EntryAttachments.h +++ b/src/core/EntryAttachments.h @@ -31,7 +31,7 @@ public: explicit EntryAttachments(QObject* parent = nullptr); QList<QString> keys() const; bool hasKey(const QString& key) const; - QList<QByteArray> values() const; + QSet<QByteArray> values() const; QByteArray value(const QString& key) const; void set(const QString& key, const QByteArray& value); void remove(const QString& key); @@ -41,6 +41,7 @@ public: void copyDataFrom(const EntryAttachments* other); bool operator==(const EntryAttachments& other) const; bool operator!=(const EntryAttachments& other) const; + int attachmentsSize(const QSet<QByteArray> &ignoredAttachments) const; signals: void modified(); diff --git a/src/core/EntryAttributes.cpp b/src/core/EntryAttributes.cpp index 8cc7f2f0a..4297f10ac 100644 --- a/src/core/EntryAttributes.cpp +++ b/src/core/EntryAttributes.cpp @@ -283,14 +283,14 @@ void EntryAttributes::clear() emit modified(); } -int EntryAttributes::attributesSize() +int EntryAttributes::attributesSize() const { int size = 0; QMapIterator<QString, QString> i(m_attributes); while (i.hasNext()) { i.next(); - size += i.value().toUtf8().size(); + size += i.key().toUtf8().size() + i.value().toUtf8().size(); } return size; } diff --git a/src/core/EntryAttributes.h b/src/core/EntryAttributes.h index f483b8a9b..3eca9171c 100644 --- a/src/core/EntryAttributes.h +++ b/src/core/EntryAttributes.h @@ -45,7 +45,7 @@ public: void copyCustomKeysFrom(const EntryAttributes* other); bool areCustomKeysDifferent(const EntryAttributes* other); void clear(); - int attributesSize(); + int attributesSize() const; void copyDataFrom(const EntryAttributes* other); bool operator==(const EntryAttributes& other) const; bool operator!=(const EntryAttributes& other) const; From 943dc6cdd603fae915c8f3cb476b8374e908c4a7 Mon Sep 17 00:00:00 2001 From: Christian Kieschnick <christian.kieschnick@hicknhack-software.com> Date: Mon, 15 Jan 2018 18:17:56 +0100 Subject: [PATCH 297/402] Add tests for modified, fix history for autotype Added tests to ensure #1387 works Fixed issue detected during testing - AutoTypeAssociations were not pushed to history --- src/core/Entry.cpp | 3 ++- src/core/EntryAttachments.cpp | 10 +++++--- tests/TestEntry.cpp | 2 +- tests/TestModified.cpp | 47 +++++++++++++++++++++++++++++++++++ 4 files changed, 57 insertions(+), 5 deletions(-) diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index b8e589291..0e327dc40 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -633,7 +633,7 @@ Entry* Entry::clone(CloneFlags flags) const entry->m_attributes->set(EntryAttributes::PasswordKey, password.toUpper(), m_attributes->isProtected(EntryAttributes::PasswordKey)); } - entry->m_autoTypeAssociations->copyDataFrom(this->m_autoTypeAssociations); + entry->m_autoTypeAssociations->copyDataFrom(m_autoTypeAssociations); if (flags & CloneIncludeHistory) { for (Entry* historyItem : m_history) { Entry* historyItemClone = historyItem->clone(flags & ~CloneIncludeHistory & ~CloneNewUuid); @@ -679,6 +679,7 @@ void Entry::beginUpdate() m_tmpHistoryItem->m_data = m_data; m_tmpHistoryItem->m_attributes->copyDataFrom(m_attributes); m_tmpHistoryItem->m_attachments->copyDataFrom(m_attachments); + m_tmpHistoryItem->m_autoTypeAssociations->copyDataFrom(m_autoTypeAssociations); m_modifiedSinceBegin = false; } diff --git a/src/core/EntryAttachments.cpp b/src/core/EntryAttachments.cpp index 6d3e38bbb..625cbd424 100644 --- a/src/core/EntryAttachments.cpp +++ b/src/core/EntryAttachments.cpp @@ -156,9 +156,13 @@ bool EntryAttachments::operator!=(const EntryAttachments& other) const int EntryAttachments::attachmentsSize(const QSet<QByteArray> &ignoredAttachments) const { int size = 0; - const QSet<QByteArray> consideredAttachments = m_attachments.values().toSet() - ignoredAttachments; - for (const QByteArray& attachment : consideredAttachments) { - size += attachment.size(); + + QMapIterator<QString, QByteArray> i(m_attachments); + while (i.hasNext()) { + i.next(); + if( ! ignoredAttachments.contains( i.value() )){ + size += i.key().toUtf8().size() + i.value().size(); + } } return size; } diff --git a/tests/TestEntry.cpp b/tests/TestEntry.cpp index 47082d12f..598ad33fd 100644 --- a/tests/TestEntry.cpp +++ b/tests/TestEntry.cpp @@ -20,7 +20,6 @@ #include <QTest> -#include "core/Database.h" #include "core/Entry.h" #include "core/Group.h" #include "crypto/Crypto.h" @@ -48,6 +47,7 @@ void TestEntry::testHistoryItemDeletion() delete entry; } + void TestEntry::testCopyDataFrom() { Entry* entry = new Entry(); diff --git a/tests/TestModified.cpp b/tests/TestModified.cpp index 70a4a4844..9ae28b80c 100644 --- a/tests/TestModified.cpp +++ b/tests/TestModified.cpp @@ -465,5 +465,52 @@ void TestModified::testHistoryItem() entry3->endUpdate(); QCOMPARE(entry3->historyItems().size(), 2); + Entry* entry4 = new Entry(); + entry4->setGroup(root); + QCOMPARE(entry4->historyItems().size(), 0); + + int reservedSize = entry4->attributes()->attributesSize(); + entry4->beginUpdate(); + entry4->attachments()->set("test1", QByteArray(17000 - 5 - reservedSize + 1, 'a')); + entry4->endUpdate(); + QCOMPARE(entry4->historyItems().size(), 1); + + entry4->beginUpdate(); + entry4->attachments()->remove("test1"); + entry4->endUpdate(); + QCOMPARE(entry4->historyItems().size(), 0); + + entry4->beginUpdate(); + entry4->setTags(QByteArray(17000 - reservedSize + 1, 'a')); + entry4->endUpdate(); + QCOMPARE(entry4->historyItems().size(), 1); + + entry4->beginUpdate(); + entry4->setTags(""); + entry4->endUpdate(); + QCOMPARE(entry4->historyItems().size(), 0); + + entry4->beginUpdate(); + entry4->attributes()->set("test3", QByteArray(17000 - 5 - reservedSize + 1, 'a')); + entry4->endUpdate(); + QCOMPARE(entry4->historyItems().size(), 1); + + entry4->beginUpdate(); + entry4->attributes()->remove("test3"); + entry4->endUpdate(); + QCOMPARE(entry4->historyItems().size(), 0); + + entry4->beginUpdate(); + AutoTypeAssociations::Association association; + association.window = "test3"; + association.sequence = QByteArray(17000 - 5 - reservedSize + 1, 'a'); + entry4->autoTypeAssociations()->add(association); + entry4->endUpdate(); + QCOMPARE(entry4->historyItems().size(), 1); + + entry4->beginUpdate(); + entry4->autoTypeAssociations()->remove(0); + entry4->endUpdate(); + QCOMPARE(entry4->historyItems().size(), 0); delete db; } From 258438f01fdf4c33fee41fd242e561acff3ef9fa Mon Sep 17 00:00:00 2001 From: Christian Kieschnick <christian.kieschnick@hicknhack-software.com> Date: Tue, 16 Jan 2018 08:34:56 +0100 Subject: [PATCH 298/402] Fix code-style issues Fixed issues pointed out during review --- src/core/AutoTypeAssociations.cpp | 2 +- src/core/Entry.cpp | 4 +++- src/core/EntryAttachments.cpp | 13 +++++-------- src/core/EntryAttachments.h | 2 +- src/core/EntryAttributes.cpp | 7 ++----- tests/TestModified.cpp | 20 ++++++++++++-------- 6 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/core/AutoTypeAssociations.cpp b/src/core/AutoTypeAssociations.cpp index 3d7a2c36f..04221733f 100644 --- a/src/core/AutoTypeAssociations.cpp +++ b/src/core/AutoTypeAssociations.cpp @@ -106,7 +106,7 @@ int AutoTypeAssociations::size() const int AutoTypeAssociations::associationsSize() const { int size = 0; - foreach (const Association &association, m_associations) { + for (const Association &association : m_associations) { size += association.sequence.toUtf8().size() + association.window.toUtf8().size(); } return size; diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index 0e327dc40..53e27a6a8 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -586,6 +586,7 @@ void Entry::truncateHistory() QMutableListIterator<Entry*> i(m_history); i.toBack(); + const QRegularExpression delimiter(",|:|;"); while (i.hasPrevious()) { Entry* historyItem = i.previous(); @@ -594,7 +595,8 @@ void Entry::truncateHistory() size += historyItem->attributes()->attributesSize(); size += historyItem->autoTypeAssociations()->associationsSize(); size += historyItem->attachments()->attachmentsSize(foundAttachments); - foreach( const QString &tag, historyItem->tags().split(QRegExp(",|;|:"), QString::SkipEmptyParts)){ + const QStringList tags = historyItem->tags().split(delimiter, QString::SkipEmptyParts); + for (const QString& tag : tags) { size += tag.toUtf8().size(); } foundAttachments += historyItem->attachments()->values(); diff --git a/src/core/EntryAttachments.cpp b/src/core/EntryAttachments.cpp index 625cbd424..70fe86ddf 100644 --- a/src/core/EntryAttachments.cpp +++ b/src/core/EntryAttachments.cpp @@ -153,16 +153,13 @@ bool EntryAttachments::operator!=(const EntryAttachments& other) const return m_attachments != other.m_attachments; } -int EntryAttachments::attachmentsSize(const QSet<QByteArray> &ignoredAttachments) const +int EntryAttachments::attachmentsSize(const QSet<QByteArray>& ignoredAttachments) const { int size = 0; - - QMapIterator<QString, QByteArray> i(m_attachments); - while (i.hasNext()) { - i.next(); - if( ! ignoredAttachments.contains( i.value() )){ - size += i.key().toUtf8().size() + i.value().size(); - } + for (auto it = m_attachments.constBegin(); it != m_attachments.constEnd(); ++it) { + if (!ignoredAttachments.contains(it.value())) { + size += it.key().toUtf8().size() + it.value().size(); + } } return size; } diff --git a/src/core/EntryAttachments.h b/src/core/EntryAttachments.h index 835a13dc8..3cdd43253 100644 --- a/src/core/EntryAttachments.h +++ b/src/core/EntryAttachments.h @@ -41,7 +41,7 @@ public: void copyDataFrom(const EntryAttachments* other); bool operator==(const EntryAttachments& other) const; bool operator!=(const EntryAttachments& other) const; - int attachmentsSize(const QSet<QByteArray> &ignoredAttachments) const; + int attachmentsSize(const QSet<QByteArray>& ignoredAttachments) const; signals: void modified(); diff --git a/src/core/EntryAttributes.cpp b/src/core/EntryAttributes.cpp index 4297f10ac..629d8e802 100644 --- a/src/core/EntryAttributes.cpp +++ b/src/core/EntryAttributes.cpp @@ -286,11 +286,8 @@ void EntryAttributes::clear() int EntryAttributes::attributesSize() const { int size = 0; - - QMapIterator<QString, QString> i(m_attributes); - while (i.hasNext()) { - i.next(); - size += i.key().toUtf8().size() + i.value().toUtf8().size(); + for (auto it = m_attributes.constBegin(); it != m_attributes.constEnd(); ++it) { + size += it.key().toUtf8().size() + it.value().toUtf8().size(); } return size; } diff --git a/tests/TestModified.cpp b/tests/TestModified.cpp index 9ae28b80c..4c5ce1c2b 100644 --- a/tests/TestModified.cpp +++ b/tests/TestModified.cpp @@ -400,8 +400,10 @@ void TestModified::testHistoryItem() entry2->endUpdate(); QCOMPARE(entry2->historyItems().size(), 0); + const int historyMaxSize = 17000; + db->metadata()->setHistoryMaxItems(-1); - db->metadata()->setHistoryMaxSize(17000); + db->metadata()->setHistoryMaxSize(historyMaxSize); entry2->beginUpdate(); entry2->attachments()->set("test", QByteArray(18000, 'X')); @@ -469,19 +471,21 @@ void TestModified::testHistoryItem() entry4->setGroup(root); QCOMPARE(entry4->historyItems().size(), 0); + const QString key("test"); + int reservedSize = entry4->attributes()->attributesSize(); entry4->beginUpdate(); - entry4->attachments()->set("test1", QByteArray(17000 - 5 - reservedSize + 1, 'a')); + entry4->attachments()->set(key, QByteArray(historyMaxSize - key.size() - reservedSize + 1, 'a')); entry4->endUpdate(); QCOMPARE(entry4->historyItems().size(), 1); entry4->beginUpdate(); - entry4->attachments()->remove("test1"); + entry4->attachments()->remove(key); entry4->endUpdate(); QCOMPARE(entry4->historyItems().size(), 0); entry4->beginUpdate(); - entry4->setTags(QByteArray(17000 - reservedSize + 1, 'a')); + entry4->setTags(QByteArray(historyMaxSize - reservedSize + 1, 'a')); entry4->endUpdate(); QCOMPARE(entry4->historyItems().size(), 1); @@ -491,19 +495,19 @@ void TestModified::testHistoryItem() QCOMPARE(entry4->historyItems().size(), 0); entry4->beginUpdate(); - entry4->attributes()->set("test3", QByteArray(17000 - 5 - reservedSize + 1, 'a')); + entry4->attributes()->set(key, QByteArray(historyMaxSize - key.size() - reservedSize + 1, 'a')); entry4->endUpdate(); QCOMPARE(entry4->historyItems().size(), 1); entry4->beginUpdate(); - entry4->attributes()->remove("test3"); + entry4->attributes()->remove(key); entry4->endUpdate(); QCOMPARE(entry4->historyItems().size(), 0); entry4->beginUpdate(); AutoTypeAssociations::Association association; - association.window = "test3"; - association.sequence = QByteArray(17000 - 5 - reservedSize + 1, 'a'); + association.window = key; + association.sequence = QByteArray(historyMaxSize - key.size() - reservedSize + 1, 'a'); entry4->autoTypeAssociations()->add(association); entry4->endUpdate(); QCOMPARE(entry4->historyItems().size(), 1); From 8dd6cdeb698c4ca92c3641a135c935e22a3ded94 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Tue, 23 Jan 2018 02:31:29 +0100 Subject: [PATCH 299/402] Fix history truncation based on max size and extend unit tests --- src/core/Entry.cpp | 2 +- src/core/EntryAttachments.cpp | 6 +- src/core/EntryAttachments.h | 2 +- tests/TestModified.cpp | 218 ++++++++++++++++++++++------------ tests/TestModified.h | 3 +- 5 files changed, 147 insertions(+), 84 deletions(-) diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index 53e27a6a8..2f4105fc6 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -594,7 +594,7 @@ void Entry::truncateHistory() if (size <= histMaxSize) { size += historyItem->attributes()->attributesSize(); size += historyItem->autoTypeAssociations()->associationsSize(); - size += historyItem->attachments()->attachmentsSize(foundAttachments); + size += historyItem->attachments()->attachmentsSize(); const QStringList tags = historyItem->tags().split(delimiter, QString::SkipEmptyParts); for (const QString& tag : tags) { size += tag.toUtf8().size(); diff --git a/src/core/EntryAttachments.cpp b/src/core/EntryAttachments.cpp index 70fe86ddf..4dcc0262b 100644 --- a/src/core/EntryAttachments.cpp +++ b/src/core/EntryAttachments.cpp @@ -153,13 +153,11 @@ bool EntryAttachments::operator!=(const EntryAttachments& other) const return m_attachments != other.m_attachments; } -int EntryAttachments::attachmentsSize(const QSet<QByteArray>& ignoredAttachments) const +int EntryAttachments::attachmentsSize() const { int size = 0; for (auto it = m_attachments.constBegin(); it != m_attachments.constEnd(); ++it) { - if (!ignoredAttachments.contains(it.value())) { - size += it.key().toUtf8().size() + it.value().size(); - } + size += it.key().toUtf8().size() + it.value().size(); } return size; } diff --git a/src/core/EntryAttachments.h b/src/core/EntryAttachments.h index 3cdd43253..c2fa55b44 100644 --- a/src/core/EntryAttachments.h +++ b/src/core/EntryAttachments.h @@ -41,7 +41,7 @@ public: void copyDataFrom(const EntryAttachments* other); bool operator==(const EntryAttachments& other) const; bool operator!=(const EntryAttachments& other) const; - int attachmentsSize(const QSet<QByteArray>& ignoredAttachments) const; + int attachmentsSize() const; signals: void modified(); diff --git a/tests/TestModified.cpp b/tests/TestModified.cpp index 4c5ce1c2b..6bc447270 100644 --- a/tests/TestModified.cpp +++ b/tests/TestModified.cpp @@ -288,14 +288,14 @@ void TestModified::testEntrySets() delete db; } -void TestModified::testHistoryItem() +void TestModified::testHistoryItems() { - Entry* entry = new Entry(); + QScopedPointer<Entry> entry(new Entry()); QDateTime created = entry->timeInfo().creationTime(); entry->setUuid(Uuid::random()); entry->setTitle("a"); entry->setTags("a"); - EntryAttributes* attributes = new EntryAttributes(); + QScopedPointer<EntryAttributes> attributes(new EntryAttributes()); attributes->copyCustomKeysFrom(entry->attributes()); Entry* historyEntry; @@ -338,15 +338,12 @@ void TestModified::testHistoryItem() attributes->set("k", "myvalue"); entry->beginUpdate(); - entry->attributes()->copyCustomKeysFrom(attributes); + entry->attributes()->copyCustomKeysFrom(attributes.data()); entry->endUpdate(); QCOMPARE(entry->historyItems().size(), ++historyItemsSize); QVERIFY(!entry->historyItems().at(historyItemsSize - 1)->attributes()->keys().contains("k")); - delete attributes; - delete entry; - - Database* db = new Database(); + QScopedPointer<Database> db(new Database()); Group* root = db->rootGroup(); db->metadata()->setHistoryMaxItems(3); db->metadata()->setHistoryMaxSize(-1); @@ -400,14 +397,16 @@ void TestModified::testHistoryItem() entry2->endUpdate(); QCOMPARE(entry2->historyItems().size(), 0); - const int historyMaxSize = 17000; + const int historyMaxSize = 19000; db->metadata()->setHistoryMaxItems(-1); db->metadata()->setHistoryMaxSize(historyMaxSize); + const QString key("test"); entry2->beginUpdate(); - entry2->attachments()->set("test", QByteArray(18000, 'X')); + entry2->attachments()->set(key, QByteArray(18000, 'X')); entry2->endUpdate(); + QCOMPARE(entry2->attachments()->attachmentsSize(), 18000 + key.size()); QCOMPARE(entry2->historyItems().size(), 1); historyEntry2 = entry2->historyItems().at(0); @@ -419,102 +418,167 @@ void TestModified::testHistoryItem() QCOMPARE(entry2->historyItems().size(), 2); entry2->beginUpdate(); - entry2->attachments()->remove("test"); + entry2->attachments()->remove(key); entry2->endUpdate(); - QCOMPARE(entry2->historyItems().size(), 0); + QCOMPARE(entry2->attachments()->attachmentsSize(), 0); + QCOMPARE(entry2->historyItems().size(), 1); entry2->beginUpdate(); entry2->attachments()->set("test2", QByteArray(6000, 'a')); entry2->endUpdate(); - QCOMPARE(entry2->historyItems().size(), 1); + QCOMPARE(entry2->attachments()->attachmentsSize(), 6000 + key.size() + 1); + QCOMPARE(entry2->historyItems().size(), 2); entry2->beginUpdate(); entry2->attachments()->set("test3", QByteArray(6000, 'b')); entry2->endUpdate(); + QCOMPARE(entry2->attachments()->attachmentsSize(), 12000 + (key.size() + 1) * 2); QCOMPARE(entry2->historyItems().size(), 2); entry2->beginUpdate(); entry2->attachments()->set("test4", QByteArray(6000, 'c')); entry2->endUpdate(); + QCOMPARE(entry2->attachments()->attachmentsSize(), 18000 + (key.size() + 1) * 3); QCOMPARE(entry2->historyItems().size(), 3); entry2->beginUpdate(); entry2->attachments()->set("test5", QByteArray(6000, 'd')); entry2->endUpdate(); - QCOMPARE(entry2->historyItems().size(), 4); - - Entry* entry3 = new Entry(); - entry3->setGroup(root); - QCOMPARE(entry3->historyItems().size(), 0); - - entry3->beginUpdate(); - entry3->attachments()->set("test", QByteArray(6000, 'a')); - entry3->endUpdate(); - QCOMPARE(entry3->historyItems().size(), 1); - - entry3->beginUpdate(); - entry3->attachments()->set("test", QByteArray(6000, 'b')); - entry3->endUpdate(); - QCOMPARE(entry3->historyItems().size(), 2); - - entry3->beginUpdate(); - entry3->attachments()->set("test", QByteArray(6000, 'c')); - entry3->endUpdate(); - QCOMPARE(entry3->historyItems().size(), 3); - - entry3->beginUpdate(); - entry3->attachments()->set("test", QByteArray(6000, 'd')); - entry3->endUpdate(); - QCOMPARE(entry3->historyItems().size(), 2); - - Entry* entry4 = new Entry(); - entry4->setGroup(root); - QCOMPARE(entry4->historyItems().size(), 0); + QCOMPARE(entry2->attachments()->attachmentsSize(), 24000 + (key.size() + 1) * 4); + QCOMPARE(entry2->historyItems().size(), 1); +} +void TestModified::testHistoryMaxSize() +{ + QScopedPointer<Database> db(new Database()); const QString key("test"); - int reservedSize = entry4->attributes()->attributesSize(); - entry4->beginUpdate(); - entry4->attachments()->set(key, QByteArray(historyMaxSize - key.size() - reservedSize + 1, 'a')); - entry4->endUpdate(); - QCOMPARE(entry4->historyItems().size(), 1); - entry4->beginUpdate(); - entry4->attachments()->remove(key); - entry4->endUpdate(); - QCOMPARE(entry4->historyItems().size(), 0); + auto entry1 = new Entry(); + entry1->setGroup(db->rootGroup()); + QCOMPARE(entry1->historyItems().size(), 0); - entry4->beginUpdate(); - entry4->setTags(QByteArray(historyMaxSize - reservedSize + 1, 'a')); - entry4->endUpdate(); - QCOMPARE(entry4->historyItems().size(), 1); + const int reservedSize1 = entry1->attributes()->attributesSize(); + db->metadata()->setHistoryMaxItems(-1); + db->metadata()->setHistoryMaxSize(18000 + key.size() * 3 + reservedSize1 * 4); - entry4->beginUpdate(); - entry4->setTags(""); - entry4->endUpdate(); - QCOMPARE(entry4->historyItems().size(), 0); + entry1->beginUpdate(); + entry1->attachments()->set(key, QByteArray(6000, 'a')); + entry1->endUpdate(); + QCOMPARE(entry1->attachments()->attachmentsSize(), 6000 + key.size()); + QCOMPARE(entry1->historyItems().size(), 1); - entry4->beginUpdate(); - entry4->attributes()->set(key, QByteArray(historyMaxSize - key.size() - reservedSize + 1, 'a')); - entry4->endUpdate(); - QCOMPARE(entry4->historyItems().size(), 1); + entry1->beginUpdate(); + entry1->attachments()->set(key, QByteArray(6000, 'b')); + entry1->endUpdate(); + QCOMPARE(entry1->attachments()->attachmentsSize(), 6000 + key.size()); + QCOMPARE(entry1->historyItems().size(), 2); - entry4->beginUpdate(); - entry4->attributes()->remove(key); - entry4->endUpdate(); - QCOMPARE(entry4->historyItems().size(), 0); + entry1->beginUpdate(); + entry1->attachments()->set(key, QByteArray(6000, 'c')); + entry1->endUpdate(); + QCOMPARE(entry1->attachments()->attachmentsSize(), 6000 + key.size()); + QCOMPARE(entry1->historyItems().size(), 3); - entry4->beginUpdate(); + entry1->beginUpdate(); + entry1->attachments()->set(key, QByteArray(6000, 'd')); + entry1->endUpdate(); + QCOMPARE(entry1->attachments()->attachmentsSize(), 6000 + key.size()); + QCOMPARE(entry1->historyItems().size(), 4); + + + auto entry2 = new Entry(); + entry2->setGroup(db->rootGroup()); + QCOMPARE(entry2->historyItems().size(), 0); + + const int historyMaxSize = 17000; + const int reservedSize2 = entry2->attributes()->attributesSize(); + db->metadata()->setHistoryMaxSize(historyMaxSize); + + entry2->beginUpdate(); + entry2->attachments()->set(key, QByteArray(historyMaxSize - key.size() - reservedSize2 + 1, 'a')); + entry2->endUpdate(); + QCOMPARE(entry2->attachments()->attachmentsSize(), historyMaxSize - reservedSize2 + 1); + QCOMPARE(entry2->historyItems().size(), 1); + + // history size overflow + entry2->beginUpdate(); + entry2->attachments()->set(key, QByteArray(historyMaxSize - key.size() - reservedSize2 + 1, 'b')); + entry2->endUpdate(); + QCOMPARE(entry2->historyItems().size(), 0); + + entry2->beginUpdate(); + entry2->attachments()->remove(key); + entry2->endUpdate(); + QCOMPARE(entry2->attachments()->attachmentsSize(), 0); + QCOMPARE(entry2->historyItems().size(), 0); + + entry2->beginUpdate(); + entry2->attachments()->set(key, QByteArray(historyMaxSize - key.size() - reservedSize2 + 1, 'a')); + entry2->endUpdate(); + QCOMPARE(entry2->attachments()->attachmentsSize(), historyMaxSize - reservedSize2 + 1); + QCOMPARE(entry2->historyItems().size(), 1); + + // history size overflow + entry2->beginUpdate(); + entry2->attachments()->set(key, QByteArray(historyMaxSize - key.size() - reservedSize2 + 1, 'b')); + entry2->endUpdate(); + QCOMPARE(entry2->historyItems().size(), 0); + + entry2->beginUpdate(); + entry2->attachments()->remove(key); + entry2->endUpdate(); + QCOMPARE(entry2->attachments()->attachmentsSize(), 0); + QCOMPARE(entry2->historyItems().size(), 0); + + entry2->beginUpdate(); + entry2->setTags(QByteArray(historyMaxSize - reservedSize2 + 1, 'a')); + entry2->endUpdate(); + QCOMPARE(entry2->tags().size(), historyMaxSize - reservedSize2 + 1); + QCOMPARE(entry2->historyItems().size(), 1); + + // history size overflow + entry2->beginUpdate(); + entry2->setTags(QByteArray(historyMaxSize - reservedSize2 + 1, 'b')); + entry2->endUpdate(); + QCOMPARE(entry2->historyItems().size(), 0); + + entry2->beginUpdate(); + entry2->setTags(""); + entry2->endUpdate(); + QCOMPARE(entry2->historyItems().size(), 0); + + entry2->beginUpdate(); + entry2->attributes()->set(key, QByteArray(historyMaxSize - key.size() - reservedSize2 + 1, 'a')); + entry2->endUpdate(); + QCOMPARE(entry2->attributes()->attributesSize(), historyMaxSize + 1); + QCOMPARE(entry2->historyItems().size(), 1); + + // history size overflow + entry2->beginUpdate(); + entry2->attributes()->set(key, QByteArray(historyMaxSize - key.size() - reservedSize2 + 1, 'b')); + entry2->endUpdate(); + QCOMPARE(entry2->attributes()->attributesSize(), historyMaxSize + 1); + QCOMPARE(entry2->historyItems().size(), 0); + + entry2->beginUpdate(); + entry2->attributes()->remove(key); + entry2->endUpdate(); + QCOMPARE(entry2->attributes()->attributesSize(), reservedSize2); + QCOMPARE(entry2->historyItems().size(), 0); + + entry2->beginUpdate(); AutoTypeAssociations::Association association; association.window = key; - association.sequence = QByteArray(historyMaxSize - key.size() - reservedSize + 1, 'a'); - entry4->autoTypeAssociations()->add(association); - entry4->endUpdate(); - QCOMPARE(entry4->historyItems().size(), 1); + association.sequence = QByteArray(historyMaxSize - key.size() - reservedSize2 + 1, 'a'); + entry2->autoTypeAssociations()->add(association); + entry2->endUpdate(); + QCOMPARE(entry2->autoTypeAssociations()->associationsSize(), historyMaxSize - reservedSize2 + 1); + QCOMPARE(entry2->historyItems().size(), 1); - entry4->beginUpdate(); - entry4->autoTypeAssociations()->remove(0); - entry4->endUpdate(); - QCOMPARE(entry4->historyItems().size(), 0); - delete db; + entry2->beginUpdate(); + entry2->autoTypeAssociations()->remove(0); + entry2->endUpdate(); + QCOMPARE(entry2->autoTypeAssociations()->associationsSize(), 0); + QCOMPARE(entry2->historyItems().size(), 0); } diff --git a/tests/TestModified.h b/tests/TestModified.h index 518bea7c0..51c429871 100644 --- a/tests/TestModified.h +++ b/tests/TestModified.h @@ -29,7 +29,8 @@ private slots: void testSignals(); void testGroupSets(); void testEntrySets(); - void testHistoryItem(); + void testHistoryItems(); + void testHistoryMaxSize(); }; #endif // KEEPASSX_TESTMODIFIED_H From 75d2895db648bd7a6ca85bc044ef477dbdbae361 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Tue, 23 Jan 2018 21:03:19 +0100 Subject: [PATCH 300/402] Add compression option to database settings --- src/gui/DatabaseSettingsWidget.cpp | 4 ++++ src/gui/DatabaseSettingsWidgetGeneral.ui | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/gui/DatabaseSettingsWidget.cpp b/src/gui/DatabaseSettingsWidget.cpp index 291887a97..baea2558a 100644 --- a/src/gui/DatabaseSettingsWidget.cpp +++ b/src/gui/DatabaseSettingsWidget.cpp @@ -79,6 +79,8 @@ void DatabaseSettingsWidget::load(Database* db) m_uiGeneral->dbDescriptionEdit->setText(meta->description()); m_uiGeneral->recycleBinEnabledCheckBox->setChecked(meta->recycleBinEnabled()); m_uiGeneral->defaultUsernameEdit->setText(meta->defaultUserName()); + m_uiGeneral->compressionCheckbox->setChecked(m_db->compressionAlgo() != Database::CompressionNone); + if (meta->historyMaxItems() > -1) { m_uiGeneral->historyMaxItemsSpinBox->setValue(meta->historyMaxItems()); m_uiGeneral->historyMaxItemsCheckBox->setChecked(true); @@ -168,6 +170,8 @@ void DatabaseSettingsWidget::save() } } + m_db->setCompressionAlgo(m_uiGeneral->compressionCheckbox->isChecked() ? Database::CompressionGZip : Database::CompressionNone); + Metadata* meta = m_db->metadata(); meta->setName(m_uiGeneral->dbNameEdit->text()); diff --git a/src/gui/DatabaseSettingsWidgetGeneral.ui b/src/gui/DatabaseSettingsWidgetGeneral.ui index c072c1d8d..751143507 100644 --- a/src/gui/DatabaseSettingsWidgetGeneral.ui +++ b/src/gui/DatabaseSettingsWidgetGeneral.ui @@ -134,6 +134,25 @@ </layout> </widget> </item> + <item> + <widget class="QGroupBox" name="groupBox_3"> + <property name="title"> + <string>Additional Database Settings</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <widget class="QCheckBox" name="compressionCheckbox"> + <property name="text"> + <string>Enable &compression (recommended)</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </widget> + </item> <item> <spacer name="verticalSpacer"> <property name="orientation"> From aabf5f09ab5a33b5d7347cc783b749472a88875b Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Wed, 24 Jan 2018 00:47:33 +0100 Subject: [PATCH 301/402] Unset explicit label alignment to let platform choose --- src/gui/DatabaseSettingsWidgetGeneral.ui | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/gui/DatabaseSettingsWidgetGeneral.ui b/src/gui/DatabaseSettingsWidgetGeneral.ui index 751143507..d3baf6132 100644 --- a/src/gui/DatabaseSettingsWidgetGeneral.ui +++ b/src/gui/DatabaseSettingsWidgetGeneral.ui @@ -26,9 +26,6 @@ <property name="text"> <string>Database name:</string> </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> </widget> </item> <item row="0" column="1"> @@ -39,9 +36,6 @@ <property name="text"> <string>Database description:</string> </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> </widget> </item> <item row="1" column="1"> @@ -52,9 +46,6 @@ <property name="text"> <string>Default username:</string> </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> </widget> </item> <item row="2" column="1"> From 7a6850d5fe38b4e19f12d0dc658c8b05ad0ea3bb Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Wed, 24 Jan 2018 13:22:20 +0100 Subject: [PATCH 302/402] Move useful QTest template specializations to global header file Fix KDBX test linker errors on Windows --- tests/CMakeLists.txt | 5 +- tests/TestAutoType.cpp | 4 +- tests/TestBase32.cpp | 2 +- tests/TestCryptoHash.cpp | 3 +- tests/TestCsvExporter.cpp | 5 +- tests/TestDatabase.cpp | 4 +- tests/TestDeletedObjects.cpp | 5 +- tests/TestEntry.cpp | 7 +- tests/TestEntryModel.cpp | 2 +- tests/TestEntrySearcher.cpp | 3 +- tests/TestGlobal.h | 69 ++++++++++++++++ tests/TestGroup.cpp | 7 +- tests/TestGroupModel.cpp | 4 +- tests/TestHashedBlockStream.cpp | 2 +- tests/TestKdbx2.cpp | 6 +- tests/TestKdbx3.cpp | 3 +- tests/TestKdbx4.cpp | 3 +- tests/TestKeePass1Reader.cpp | 5 +- tests/TestKeePass2Format.cpp | 117 +++++++-------------------- tests/TestKeePass2Format.h | 3 - tests/TestKeePass2RandomStream.cpp | 4 +- tests/TestKeys.cpp | 3 +- tests/TestMerge.cpp | 6 +- tests/TestOpenSSHKey.cpp | 4 +- tests/TestRandom.cpp | 3 +- tests/TestSymmetricCipher.cpp | 2 +- tests/TestTotp.cpp | 7 +- tests/TestWildcardMatcher.cpp | 4 +- tests/TestYkChallengeResponseKey.cpp | 25 ++---- tests/TestYkChallengeResponseKey.h | 6 +- tests/gui/CMakeLists.txt | 2 + tests/gui/TestGui.cpp | 2 +- tests/gui/TestGuiPixmaps.cpp | 7 +- 33 files changed, 143 insertions(+), 191 deletions(-) create mode 100644 tests/TestGlobal.h diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 5e6043609..3b8ada32d 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -82,7 +82,6 @@ macro(add_unit_test) endif() endmacro(add_unit_test) - set(TEST_LIBRARIES keepassx_core ${keepasshttp_LIB} @@ -96,7 +95,7 @@ set(TEST_LIBRARIES ${ZLIB_LIBRARIES} ) -set(testsupport_SOURCES modeltest.cpp FailDevice.cpp) +set(testsupport_SOURCES TestGlobal.h modeltest.cpp FailDevice.cpp) add_library(testsupport STATIC ${testsupport_SOURCES}) target_link_libraries(testsupport Qt5::Core Qt5::Concurrent Qt5::Widgets Qt5::Test) @@ -185,7 +184,7 @@ add_unit_test(NAME testcsvexporter SOURCES TestCsvExporter.cpp LIBS ${TEST_LIBRARIES}) add_unit_test(NAME testykchallengeresponsekey - SOURCES TestYkChallengeResponseKey.cpp TestYkChallengeResponseKey.h + SOURCES TestYkChallengeResponseKey.cpp LIBS ${TEST_LIBRARIES}) add_unit_test(NAME testdatabase SOURCES TestDatabase.cpp diff --git a/tests/TestAutoType.cpp b/tests/TestAutoType.cpp index 2f980e546..9d2f063e8 100644 --- a/tests/TestAutoType.cpp +++ b/tests/TestAutoType.cpp @@ -17,14 +17,12 @@ */ #include "TestAutoType.h" +#include "TestGlobal.h" #include <QPluginLoader> -#include <QTest> #include "core/Config.h" #include "core/FilePath.h" -#include "core/Entry.h" -#include "core/Group.h" #include "crypto/Crypto.h" #include "autotype/AutoType.h" #include "autotype/AutoTypePlatformPlugin.h" diff --git a/tests/TestBase32.cpp b/tests/TestBase32.cpp index 1d30e7817..1fe61f9f3 100644 --- a/tests/TestBase32.cpp +++ b/tests/TestBase32.cpp @@ -16,8 +16,8 @@ */ #include "TestBase32.h" +#include "TestGlobal.h" #include "core/Base32.h" -#include <QTest> QTEST_GUILESS_MAIN(TestBase32) diff --git a/tests/TestCryptoHash.cpp b/tests/TestCryptoHash.cpp index 469ce8192..914bcf193 100644 --- a/tests/TestCryptoHash.cpp +++ b/tests/TestCryptoHash.cpp @@ -16,8 +16,7 @@ */ #include "TestCryptoHash.h" - -#include <QTest> +#include "TestGlobal.h" #include "crypto/Crypto.h" #include "crypto/CryptoHash.h" diff --git a/tests/TestCsvExporter.cpp b/tests/TestCsvExporter.cpp index 6515c39c2..b85dbf268 100644 --- a/tests/TestCsvExporter.cpp +++ b/tests/TestCsvExporter.cpp @@ -17,13 +17,10 @@ */ #include "TestCsvExporter.h" +#include "TestGlobal.h" #include <QBuffer> -#include <QTest> -#include "core/Database.h" -#include "core/Entry.h" -#include "core/Group.h" #include "crypto/Crypto.h" #include "format/CsvExporter.h" diff --git a/tests/TestDatabase.cpp b/tests/TestDatabase.cpp index 284ba4bfb..4aae91dc2 100644 --- a/tests/TestDatabase.cpp +++ b/tests/TestDatabase.cpp @@ -17,17 +17,15 @@ */ #include "TestDatabase.h" +#include "TestGlobal.h" -#include <QTest> #include <QSignalSpy> #include <QTemporaryFile> #include "config-keepassx-tests.h" -#include "core/Database.h" #include "crypto/Crypto.h" #include "keys/PasswordKey.h" #include "core/Metadata.h" -#include "core/Group.h" #include "format/KeePass2Writer.h" QTEST_GUILESS_MAIN(TestDatabase) diff --git a/tests/TestDeletedObjects.cpp b/tests/TestDeletedObjects.cpp index 63dab0edf..ee9d8de2c 100644 --- a/tests/TestDeletedObjects.cpp +++ b/tests/TestDeletedObjects.cpp @@ -16,11 +16,8 @@ */ #include "TestDeletedObjects.h" +#include "TestGlobal.h" -#include <QTest> - -#include "core/Database.h" -#include "core/Group.h" #include "crypto/Crypto.h" #include "format/KeePass2.h" #include "format/KdbxXmlReader.h" diff --git a/tests/TestEntry.cpp b/tests/TestEntry.cpp index 598ad33fd..264f202d1 100644 --- a/tests/TestEntry.cpp +++ b/tests/TestEntry.cpp @@ -16,12 +16,7 @@ */ #include "TestEntry.h" -#include "config-keepassx-tests.h" - -#include <QTest> - -#include "core/Entry.h" -#include "core/Group.h" +#include "TestGlobal.h" #include "crypto/Crypto.h" QTEST_GUILESS_MAIN(TestEntry) diff --git a/tests/TestEntryModel.cpp b/tests/TestEntryModel.cpp index ab4ecf754..d290507f1 100644 --- a/tests/TestEntryModel.cpp +++ b/tests/TestEntryModel.cpp @@ -16,9 +16,9 @@ */ #include "TestEntryModel.h" +#include "TestGlobal.h" #include <QSignalSpy> -#include <QTest> #include "modeltest.h" #include "core/DatabaseIcons.h" diff --git a/tests/TestEntrySearcher.cpp b/tests/TestEntrySearcher.cpp index 6b951c703..25d83e4d2 100644 --- a/tests/TestEntrySearcher.cpp +++ b/tests/TestEntrySearcher.cpp @@ -16,8 +16,7 @@ */ #include "TestEntrySearcher.h" - -#include <QTest> +#include "TestGlobal.h" QTEST_GUILESS_MAIN(TestEntrySearcher) diff --git a/tests/TestGlobal.h b/tests/TestGlobal.h new file mode 100644 index 000000000..017fbd5f9 --- /dev/null +++ b/tests/TestGlobal.h @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef KEEPASSXC_TESTGLOBAL_H +#define KEEPASSXC_TESTGLOBAL_H + +#include "core/Uuid.h" +#include "core/Group.h" + +#include <QTest> +#include <QDateTime> + +namespace QTest { + +template<> +inline char* toString(const Uuid& uuid) +{ + QByteArray ba = "Uuid("; + ba += uuid.toHex().toLatin1().constData(); + ba += ")"; + return qstrdup(ba.constData()); +} + +template<> +inline char* toString(const Group::TriState& triState) +{ + QString value; + + if (triState == Group::Inherit) { + value = "null"; + } else if (triState == Group::Enable) { + value = "true"; + } else { + value = "false"; + } + + return qstrdup(value.toLocal8Bit().constData()); +} + +} // namespace QTest + + +namespace Test { + +inline QDateTime datetime(int year, int month, int day, int hour, int min, int second) +{ + return QDateTime( + QDate(year, month, day), + QTime(hour, min, second), + Qt::UTC); +} + +} // namespace Test + +#endif //KEEPASSXC_TESTGLOBAL_H diff --git a/tests/TestGroup.cpp b/tests/TestGroup.cpp index 24bdfeb5a..d9eb2c765 100644 --- a/tests/TestGroup.cpp +++ b/tests/TestGroup.cpp @@ -17,15 +17,10 @@ */ #include "TestGroup.h" +#include "TestGlobal.h" -#include <QDebug> -#include <QPointer> -#include <QScopedPointer> #include <QSignalSpy> -#include <QTest> -#include "core/Database.h" -#include "core/Group.h" #include "core/Metadata.h" #include "crypto/Crypto.h" diff --git a/tests/TestGroupModel.cpp b/tests/TestGroupModel.cpp index 1faf82aa2..f9f55e247 100644 --- a/tests/TestGroupModel.cpp +++ b/tests/TestGroupModel.cpp @@ -16,13 +16,11 @@ */ #include "TestGroupModel.h" +#include "TestGlobal.h" #include <QSignalSpy> -#include <QTest> #include "modeltest.h" -#include "core/Database.h" -#include "core/Group.h" #include "crypto/Crypto.h" #include "gui/group/GroupModel.h" diff --git a/tests/TestHashedBlockStream.cpp b/tests/TestHashedBlockStream.cpp index b78a46ba8..90c96582f 100644 --- a/tests/TestHashedBlockStream.cpp +++ b/tests/TestHashedBlockStream.cpp @@ -16,9 +16,9 @@ */ #include "TestHashedBlockStream.h" +#include "TestGlobal.h" #include <QBuffer> -#include <QTest> #include "FailDevice.h" #include "crypto/Crypto.h" diff --git a/tests/TestKdbx2.cpp b/tests/TestKdbx2.cpp index f10f10b94..c0a0b3074 100644 --- a/tests/TestKdbx2.cpp +++ b/tests/TestKdbx2.cpp @@ -16,17 +16,15 @@ */ #include "TestKdbx2.h" +#include "TestGlobal.h" + #include "crypto/Crypto.h" -#include "keys/CompositeKey.h" #include "keys/PasswordKey.h" #include "format/KeePass2Reader.h" #include "format/KeePass2Writer.h" -#include "core/Entry.h" -#include "core/Group.h" #include "core/Metadata.h" #include "config-keepassx-tests.h" -#include <QTest> #include <QBuffer> QTEST_GUILESS_MAIN(TestKdbx2) diff --git a/tests/TestKdbx3.cpp b/tests/TestKdbx3.cpp index 210ddc752..94ceafb5d 100644 --- a/tests/TestKdbx3.cpp +++ b/tests/TestKdbx3.cpp @@ -16,6 +16,8 @@ */ #include "TestKdbx3.h" +#include "TestGlobal.h" + #include "core/Metadata.h" #include "keys/PasswordKey.h" #include "format/KeePass2.h" @@ -26,7 +28,6 @@ #include "format/KeePass2Repair.h" #include "config-keepassx-tests.h" -#include <QTest> QTEST_GUILESS_MAIN(TestKdbx3) diff --git a/tests/TestKdbx4.cpp b/tests/TestKdbx4.cpp index 0a21215ac..8fb0f219b 100644 --- a/tests/TestKdbx4.cpp +++ b/tests/TestKdbx4.cpp @@ -16,6 +16,8 @@ */ #include "TestKdbx4.h" +#include "TestGlobal.h" + #include "core/Metadata.h" #include "keys/PasswordKey.h" #include "format/KeePass2.h" @@ -25,7 +27,6 @@ #include "format/KdbxXmlWriter.h" #include "config-keepassx-tests.h" -#include <QTest> QTEST_GUILESS_MAIN(TestKdbx4) diff --git a/tests/TestKeePass1Reader.cpp b/tests/TestKeePass1Reader.cpp index a4ad56ca6..892f746e4 100644 --- a/tests/TestKeePass1Reader.cpp +++ b/tests/TestKeePass1Reader.cpp @@ -16,14 +16,11 @@ */ #include "TestKeePass1Reader.h" +#include "TestGlobal.h" #include <QBuffer> -#include <QTest> #include "config-keepassx-tests.h" -#include "core/Database.h" -#include "core/Entry.h" -#include "core/Group.h" #include "core/Metadata.h" #include "crypto/Crypto.h" #include "format/KeePass1Reader.h" diff --git a/tests/TestKeePass2Format.cpp b/tests/TestKeePass2Format.cpp index 6c3777387..34daea879 100644 --- a/tests/TestKeePass2Format.cpp +++ b/tests/TestKeePass2Format.cpp @@ -16,8 +16,8 @@ */ #include "TestKeePass2Format.h" +#include "TestGlobal.h" -#include "core/Group.h" #include "core/Metadata.h" #include "crypto/Crypto.h" #include "keys/PasswordKey.h" @@ -26,9 +26,6 @@ #include "FailDevice.h" #include "config-keepassx-tests.h" -#include <QFile> -#include <QTest> - void TestKeePass2Format::initTestCase() { QVERIFY(Crypto::init()); @@ -80,14 +77,14 @@ void TestKeePass2Format::testXmlMetadata() { QCOMPARE(m_xmlDb->metadata()->generator(), QString("KeePass")); QCOMPARE(m_xmlDb->metadata()->name(), QString("ANAME")); - QCOMPARE(m_xmlDb->metadata()->nameChanged(), genDT(2010, 8, 8, 17, 24, 53)); + QCOMPARE(m_xmlDb->metadata()->nameChanged(), Test::datetime(2010, 8, 8, 17, 24, 53)); QCOMPARE(m_xmlDb->metadata()->description(), QString("ADESC")); - QCOMPARE(m_xmlDb->metadata()->descriptionChanged(), genDT(2010, 8, 8, 17, 27, 12)); + QCOMPARE(m_xmlDb->metadata()->descriptionChanged(), Test::datetime(2010, 8, 8, 17, 27, 12)); QCOMPARE(m_xmlDb->metadata()->defaultUserName(), QString("DEFUSERNAME")); - QCOMPARE(m_xmlDb->metadata()->defaultUserNameChanged(), genDT(2010, 8, 8, 17, 27, 45)); + QCOMPARE(m_xmlDb->metadata()->defaultUserNameChanged(), Test::datetime(2010, 8, 8, 17, 27, 45)); QCOMPARE(m_xmlDb->metadata()->maintenanceHistoryDays(), 127); QCOMPARE(m_xmlDb->metadata()->color(), QColor(0xff, 0xef, 0x00)); - QCOMPARE(m_xmlDb->metadata()->masterKeyChanged(), genDT(2012, 4, 5, 17, 9, 34)); + QCOMPARE(m_xmlDb->metadata()->masterKeyChanged(), Test::datetime(2012, 4, 5, 17, 9, 34)); QCOMPARE(m_xmlDb->metadata()->masterKeyChangeRec(), 101); QCOMPARE(m_xmlDb->metadata()->masterKeyChangeForce(), -1); QCOMPARE(m_xmlDb->metadata()->protectTitle(), false); @@ -98,9 +95,9 @@ void TestKeePass2Format::testXmlMetadata() QCOMPARE(m_xmlDb->metadata()->recycleBinEnabled(), true); QVERIFY(m_xmlDb->metadata()->recycleBin() != nullptr); QCOMPARE(m_xmlDb->metadata()->recycleBin()->name(), QString("Recycle Bin")); - QCOMPARE(m_xmlDb->metadata()->recycleBinChanged(), genDT(2010, 8, 25, 16, 12, 57)); + QCOMPARE(m_xmlDb->metadata()->recycleBinChanged(), Test::datetime(2010, 8, 25, 16, 12, 57)); QVERIFY(m_xmlDb->metadata()->entryTemplatesGroup() == nullptr); - QCOMPARE(m_xmlDb->metadata()->entryTemplatesGroupChanged(), genDT(2010, 8, 8, 17, 24, 19)); + QCOMPARE(m_xmlDb->metadata()->entryTemplatesGroupChanged(), Test::datetime(2010, 8, 8, 17, 24, 19)); QVERIFY(m_xmlDb->metadata()->lastSelectedGroup() != nullptr); QCOMPARE(m_xmlDb->metadata()->lastSelectedGroup()->name(), QString("NewDatabase")); QVERIFY(m_xmlDb->metadata()->lastTopVisibleGroup() == m_xmlDb->metadata()->lastSelectedGroup()); @@ -147,13 +144,13 @@ void TestKeePass2Format::testXmlGroupRoot() QCOMPARE(group->iconUuid(), Uuid()); QVERIFY(group->isExpanded()); TimeInfo ti = group->timeInfo(); - QCOMPARE(ti.lastModificationTime(), genDT(2010, 8, 8, 17, 24, 27)); - QCOMPARE(ti.creationTime(), genDT(2010, 8, 7, 17, 24, 27)); - QCOMPARE(ti.lastAccessTime(), genDT(2010, 8, 9, 9, 9, 44)); - QCOMPARE(ti.expiryTime(), genDT(2010, 8, 8, 17, 24, 17)); + QCOMPARE(ti.lastModificationTime(), Test::datetime(2010, 8, 8, 17, 24, 27)); + QCOMPARE(ti.creationTime(), Test::datetime(2010, 8, 7, 17, 24, 27)); + QCOMPARE(ti.lastAccessTime(), Test::datetime(2010, 8, 9, 9, 9, 44)); + QCOMPARE(ti.expiryTime(), Test::datetime(2010, 8, 8, 17, 24, 17)); QVERIFY(!ti.expires()); QCOMPARE(ti.usageCount(), 52); - QCOMPARE(ti.locationChanged(), genDT(2010, 8, 8, 17, 24, 27)); + QCOMPARE(ti.locationChanged(), Test::datetime(2010, 8, 8, 17, 24, 27)); QCOMPARE(group->defaultAutoTypeSequence(), QString("")); QCOMPARE(group->autoTypeEnabled(), Group::Inherit); QCOMPARE(group->searchingEnabled(), Group::Inherit); @@ -215,13 +212,13 @@ void TestKeePass2Format::testXmlEntry1() QCOMPARE(entry->tags(), QString("a b c")); const TimeInfo ti = entry->timeInfo(); - QCOMPARE(ti.lastModificationTime(), genDT(2010, 8, 25, 16, 19, 25)); - QCOMPARE(ti.creationTime(), genDT(2010, 8, 25, 16, 13, 54)); - QCOMPARE(ti.lastAccessTime(), genDT(2010, 8, 25, 16, 19, 25)); - QCOMPARE(ti.expiryTime(), genDT(2010, 8, 25, 16, 12, 57)); + QCOMPARE(ti.lastModificationTime(), Test::datetime(2010, 8, 25, 16, 19, 25)); + QCOMPARE(ti.creationTime(), Test::datetime(2010, 8, 25, 16, 13, 54)); + QCOMPARE(ti.lastAccessTime(), Test::datetime(2010, 8, 25, 16, 19, 25)); + QCOMPARE(ti.expiryTime(), Test::datetime(2010, 8, 25, 16, 12, 57)); QVERIFY(!ti.expires()); QCOMPARE(ti.usageCount(), 8); - QCOMPARE(ti.locationChanged(), genDT(2010, 8, 25, 16, 13, 54)); + QCOMPARE(ti.locationChanged(), Test::datetime(2010, 8, 25, 16, 13, 54)); QList<QString> attrs = entry->attributes()->keys(); QCOMPARE(entry->attributes()->value("Notes"), QString("Notes")); @@ -320,7 +317,7 @@ void TestKeePass2Format::testXmlEntryHistory() const Entry* entry = entryMain->historyItems().at(0); QCOMPARE(entry->uuid(), entryMain->uuid()); QVERIFY(!entry->parent()); - QCOMPARE(entry->timeInfo().lastModificationTime(), genDT(2010, 8, 25, 16, 13, 54)); + QCOMPARE(entry->timeInfo().lastModificationTime(), Test::datetime(2010, 8, 25, 16, 13, 54)); QCOMPARE(entry->timeInfo().usageCount(), 3); QCOMPARE(entry->title(), QString("Sample Entry")); QCOMPARE(entry->url(), QString("http://www.somesite.com/")); @@ -330,7 +327,7 @@ void TestKeePass2Format::testXmlEntryHistory() const Entry* entry = entryMain->historyItems().at(1); QCOMPARE(entry->uuid(), entryMain->uuid()); QVERIFY(!entry->parent()); - QCOMPARE(entry->timeInfo().lastModificationTime(), genDT(2010, 8, 25, 16, 15, 43)); + QCOMPARE(entry->timeInfo().lastModificationTime(), Test::datetime(2010, 8, 25, 16, 15, 43)); QCOMPARE(entry->timeInfo().usageCount(), 7); QCOMPARE(entry->title(), QString("Sample Entry 1")); QCOMPARE(entry->url(), QString("http://www.somesite.com/")); @@ -344,11 +341,11 @@ void TestKeePass2Format::testXmlDeletedObjects() delObj = objList.takeFirst(); QCOMPARE(delObj.uuid.toBase64(), QString("5K/bzWCSmkCv5OZxYl4N/w==")); - QCOMPARE(delObj.deletionTime, genDT(2010, 8, 25, 16, 14, 12)); + QCOMPARE(delObj.deletionTime, Test::datetime(2010, 8, 25, 16, 14, 12)); delObj = objList.takeFirst(); QCOMPARE(delObj.uuid.toBase64(), QString("80h8uSNWgkKhKCp1TgXF7g==")); - QCOMPARE(delObj.deletionTime, genDT(2010, 8, 25, 16, 14, 14)); + QCOMPARE(delObj.deletionTime, Test::datetime(2010, 8, 25, 16, 14, 14)); QVERIFY(objList.isEmpty()); } @@ -462,16 +459,16 @@ void TestKeePass2Format::testXmlInvalidXmlChars() Entry* entryRead = dbRead->rootGroup()->entries().at(0); EntryAttributes* attrRead = entryRead->attributes(); - QCOMPARE(strToBytes(attrRead->value("PlainInvalid")), QByteArray()); - QCOMPARE(strToBytes(attrRead->value("PlainValid")), strToBytes(strPlainValid)); - QCOMPARE(strToBytes(attrRead->value("SingleHighSurrogate1")), QByteArray()); - QCOMPARE(strToBytes(attrRead->value("SingleHighSurrogate2")), strToBytes(QString("12"))); - QCOMPARE(strToBytes(attrRead->value("HighHighSurrogate")), QByteArray()); - QCOMPARE(strToBytes(attrRead->value("SingleLowSurrogate1")), QByteArray()); - QCOMPARE(strToBytes(attrRead->value("SingleLowSurrogate2")), strToBytes(QString("12"))); - QCOMPARE(strToBytes(attrRead->value("LowLowSurrogate")), QByteArray()); - QCOMPARE(strToBytes(attrRead->value("SurrogateValid1")), strToBytes(strSurrogateValid1)); - QCOMPARE(strToBytes(attrRead->value("SurrogateValid2")), strToBytes(strSurrogateValid2)); + QCOMPARE(attrRead->value("PlainInvalid"), QString()); + QCOMPARE(attrRead->value("PlainValid"), strPlainValid); + QCOMPARE(attrRead->value("SingleHighSurrogate1"), QString()); + QCOMPARE(attrRead->value("SingleHighSurrogate2"), QString("12")); + QCOMPARE(attrRead->value("HighHighSurrogate"), QString()); + QCOMPARE(attrRead->value("SingleLowSurrogate1"), QString()); + QCOMPARE(attrRead->value("SingleLowSurrogate2"), QString("12")); + QCOMPARE(attrRead->value("LowLowSurrogate"), QString()); + QCOMPARE(attrRead->value("SurrogateValid1"), strSurrogateValid1); + QCOMPARE(attrRead->value("SurrogateValid2"), strSurrogateValid2); } void TestKeePass2Format::testXmlRepairUuidHistoryItem() @@ -568,55 +565,3 @@ void TestKeePass2Format::testKdbxDeviceFailure() QVERIFY(hasError); QCOMPARE(errorString, QString("FAILDEVICE")); } - - - -// ==================================================================================================== -// Helper functions -// ==================================================================================================== - -namespace QTest { -template<> -char* toString(const Uuid& uuid) -{ - QByteArray ba = "Uuid("; - ba += uuid.toBase64().toLatin1().constData(); - ba += ")"; - return qstrdup(ba.constData()); -} - -template<> -char* toString(const Group::TriState& triState) -{ - QString value; - - if (triState == Group::Inherit) { - value = "null"; - } else if (triState == Group::Enable) { - value = "true"; - } else { - value = "false"; - } - - return qstrdup(value.toLocal8Bit().constData()); -} -} - -QDateTime TestKeePass2Format::genDT(int year, int month, int day, int hour, int min, int second) -{ - QDate date(year, month, day); - QTime time(hour, min, second); - return QDateTime(date, time, Qt::UTC); -} - -QByteArray TestKeePass2Format::strToBytes(const QString& str) -{ - QByteArray result; - - for (auto i : str) { - result.append(static_cast<char>(i.unicode() >> 8)); - result.append(static_cast<char>(i.unicode() & 0xFF)); - } - - return result; -} diff --git a/tests/TestKeePass2Format.h b/tests/TestKeePass2Format.h index 11420bab0..a2bdd4f49 100644 --- a/tests/TestKeePass2Format.h +++ b/tests/TestKeePass2Format.h @@ -77,9 +77,6 @@ protected: bool& hasError, QString& errorString) = 0; virtual void writeKdbx(QIODevice* device, Database* db, bool& hasError, QString& errorString) = 0; - static QDateTime genDT(int year, int month, int day, int hour, int min, int second); - static QByteArray strToBytes(const QString& str); - QScopedPointer<Database> m_xmlDb; QScopedPointer<Database> m_kdbxSourceDb; QScopedPointer<Database> m_kdbxTargetDb; diff --git a/tests/TestKeePass2RandomStream.cpp b/tests/TestKeePass2RandomStream.cpp index 53852e82d..edb95b6c6 100644 --- a/tests/TestKeePass2RandomStream.cpp +++ b/tests/TestKeePass2RandomStream.cpp @@ -16,13 +16,11 @@ */ #include "TestKeePass2RandomStream.h" - -#include <QTest> +#include "TestGlobal.h" #include "crypto/Crypto.h" #include "crypto/CryptoHash.h" #include "crypto/SymmetricCipher.h" -#include "format/KeePass2.h" #include "format/KeePass2RandomStream.h" QTEST_GUILESS_MAIN(TestKeePass2RandomStream) diff --git a/tests/TestKeys.cpp b/tests/TestKeys.cpp index 811a7688f..094a397d7 100644 --- a/tests/TestKeys.cpp +++ b/tests/TestKeys.cpp @@ -17,13 +17,12 @@ */ #include "TestKeys.h" +#include "TestGlobal.h" #include <QBuffer> -#include <QTest> #include "config-keepassx-tests.h" -#include "core/Database.h" #include "core/Metadata.h" #include "core/Tools.h" #include "crypto/Crypto.h" diff --git a/tests/TestMerge.cpp b/tests/TestMerge.cpp index d68c4f102..8f38a2f85 100644 --- a/tests/TestMerge.cpp +++ b/tests/TestMerge.cpp @@ -16,12 +16,8 @@ */ #include "TestMerge.h" +#include "TestGlobal.h" -#include <QDebug> -#include <QTest> - -#include "core/Database.h" -#include "core/Group.h" #include "core/Metadata.h" #include "crypto/Crypto.h" diff --git a/tests/TestOpenSSHKey.cpp b/tests/TestOpenSSHKey.cpp index 949c708cf..55033d7e1 100644 --- a/tests/TestOpenSSHKey.cpp +++ b/tests/TestOpenSSHKey.cpp @@ -16,9 +16,9 @@ */ #include "TestOpenSSHKey.h" -#include "crypto/Crypto.h" +#include "TestGlobal.h" #include "sshagent/OpenSSHKey.h" -#include <QTest> +#include "crypto/Crypto.h" QTEST_GUILESS_MAIN(TestOpenSSHKey) diff --git a/tests/TestRandom.cpp b/tests/TestRandom.cpp index 69f0fcb7c..7575e3a58 100644 --- a/tests/TestRandom.cpp +++ b/tests/TestRandom.cpp @@ -16,11 +16,10 @@ */ #include "TestRandom.h" - +#include "TestGlobal.h" #include "core/Endian.h" #include "core/Global.h" -#include <QTest> QTEST_GUILESS_MAIN(TestRandom) diff --git a/tests/TestSymmetricCipher.cpp b/tests/TestSymmetricCipher.cpp index bfa3c3db8..f1e7c0e06 100644 --- a/tests/TestSymmetricCipher.cpp +++ b/tests/TestSymmetricCipher.cpp @@ -17,9 +17,9 @@ */ #include "TestSymmetricCipher.h" +#include "TestGlobal.h" #include <QBuffer> -#include <QTest> #include "crypto/Crypto.h" #include "crypto/SymmetricCipher.h" diff --git a/tests/TestTotp.cpp b/tests/TestTotp.cpp index 06e360148..dd69a076d 100644 --- a/tests/TestTotp.cpp +++ b/tests/TestTotp.cpp @@ -17,12 +17,7 @@ */ #include "TestTotp.h" - -#include <QDateTime> -#include <QTest> -#include <QTextCodec> -#include <QTime> -#include <QtEndian> +#include "TestGlobal.h" #include "crypto/Crypto.h" #include "totp/totp.h" diff --git a/tests/TestWildcardMatcher.cpp b/tests/TestWildcardMatcher.cpp index 621dc898e..e5d1d117d 100644 --- a/tests/TestWildcardMatcher.cpp +++ b/tests/TestWildcardMatcher.cpp @@ -16,9 +16,7 @@ */ #include "TestWildcardMatcher.h" - -#include <QTest> - +#include "TestGlobal.h" #include "autotype/WildcardMatcher.h" QTEST_GUILESS_MAIN(TestWildcardMatcher) diff --git a/tests/TestYkChallengeResponseKey.cpp b/tests/TestYkChallengeResponseKey.cpp index 558920f4a..276ba7325 100644 --- a/tests/TestYkChallengeResponseKey.cpp +++ b/tests/TestYkChallengeResponseKey.cpp @@ -18,36 +18,23 @@ */ #include "TestYkChallengeResponseKey.h" - -#include <QTest> -#include <QtConcurrentRun> - +#include "TestGlobal.h" #include "crypto/Crypto.h" -#include "keys/YkChallengeResponseKey.h" + +#include <QtConcurrentRun> QTEST_GUILESS_MAIN(TestYubiKeyChalResp) void TestYubiKeyChalResp::initTestCase() { - m_detected = 0; - m_key = NULL; - // crypto subsystem needs to be initialized for YubiKey testing QVERIFY(Crypto::init()); } -void TestYubiKeyChalResp::cleanupTestCase() -{ - if (m_key) - delete m_key; -} - void TestYubiKeyChalResp::init() { - bool result = YubiKey::instance()->init(); - - if (!result) { - QSKIP("Unable to connect to YubiKey", SkipAll); + if (!YubiKey::instance()->init()) { + QSKIP("Unable to connect to YubiKey"); } } @@ -104,7 +91,7 @@ void TestYubiKeyChalResp::ykDetected(int slot, bool blocking) /* Key used for later testing */ if (!m_key) - m_key = new YkChallengeResponseKey(slot, blocking); + m_key.reset(new YkChallengeResponseKey(slot, blocking)); } void TestYubiKeyChalResp::deinit() diff --git a/tests/TestYkChallengeResponseKey.h b/tests/TestYkChallengeResponseKey.h index 2bc344ec0..82223ec35 100644 --- a/tests/TestYkChallengeResponseKey.h +++ b/tests/TestYkChallengeResponseKey.h @@ -20,6 +20,7 @@ #define KEEPASSX_TESTYUBIKEYCHALRESP_H #include <QObject> +#include <QScopedPointer> #include "keys/YkChallengeResponseKey.h" @@ -29,7 +30,6 @@ class TestYubiKeyChalResp: public QObject private slots: void initTestCase(); - void cleanupTestCase(); void init(); @@ -48,8 +48,8 @@ private slots: void ykDetected(int slot, bool blocking); private: - int m_detected; - YkChallengeResponseKey *m_key; + int m_detected = 0; + QScopedPointer<YkChallengeResponseKey> m_key; }; #endif // KEEPASSX_TESTYUBIKEYCHALRESP_H diff --git a/tests/gui/CMakeLists.txt b/tests/gui/CMakeLists.txt index 4c0eebbe6..6cae88830 100644 --- a/tests/gui/CMakeLists.txt +++ b/tests/gui/CMakeLists.txt @@ -13,6 +13,8 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/..) + add_unit_test(NAME testgui SOURCES TestGui.cpp TemporaryFile.cpp LIBS ${TEST_LIBRARIES}) add_unit_test(NAME testguipixmaps SOURCES TestGuiPixmaps.cpp LIBS ${TEST_LIBRARIES}) diff --git a/tests/gui/TestGui.cpp b/tests/gui/TestGui.cpp index a663b30a3..44b1d0664 100644 --- a/tests/gui/TestGui.cpp +++ b/tests/gui/TestGui.cpp @@ -17,6 +17,7 @@ */ #include "TestGui.h" +#include "TestGlobal.h" #include <QAction> #include <QApplication> @@ -29,7 +30,6 @@ #include <QPlainTextEdit> #include <QComboBox> #include <QTemporaryFile> -#include <QTest> #include <QToolBar> #include <QToolButton> #include <QTimer> diff --git a/tests/gui/TestGuiPixmaps.cpp b/tests/gui/TestGuiPixmaps.cpp index 363749474..c71fe51b9 100644 --- a/tests/gui/TestGuiPixmaps.cpp +++ b/tests/gui/TestGuiPixmaps.cpp @@ -16,13 +16,8 @@ */ #include "TestGuiPixmaps.h" - -#include <QTest> - -#include "core/Database.h" +#include "TestGlobal.h" #include "core/DatabaseIcons.h" -#include "core/Entry.h" -#include "core/Group.h" #include "core/Metadata.h" #include "crypto/Crypto.h" From c18d6b5ae5a37a2c3a62efdfa9a7386699b942f3 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Thu, 25 Jan 2018 00:41:24 +0100 Subject: [PATCH 303/402] Fix KDBX4 reader/writer attachment mapping error Write duplicate attachments to the binary inner header only once and skip duplicate entries when reading a KDBX4 file. This fixes a an attachment mapping problem when an attachment appears more than once in a database (which occurs frequently when editing attachment entries and history is turned on) --- src/format/Kdbx4Reader.cpp | 32 ++++++++++++++++++++++++++------ src/format/Kdbx4Reader.h | 3 ++- src/format/Kdbx4Writer.cpp | 12 ++++++++++-- src/format/KdbxXmlReader.cpp | 2 +- src/format/KdbxXmlReader.h | 2 +- 5 files changed, 40 insertions(+), 11 deletions(-) diff --git a/src/format/Kdbx4Reader.cpp b/src/format/Kdbx4Reader.cpp index 8b9d4ab2b..4a9649a62 100644 --- a/src/format/Kdbx4Reader.cpp +++ b/src/format/Kdbx4Reader.cpp @@ -22,7 +22,6 @@ #include "core/Group.h" #include "core/Endian.h" #include "crypto/CryptoHash.h" -#include "crypto/kdf/AesKdf.h" #include "format/KeePass2RandomStream.h" #include "format/KdbxXmlReader.h" #include "streams/HmacBlockStream.h" @@ -34,7 +33,7 @@ Database* Kdbx4Reader::readDatabaseImpl(QIODevice* device, const QByteArray& hea { Q_ASSERT(m_kdbxVersion == KeePass2::FILE_VERSION_4); - m_binaryPool.clear(); + m_binaryPoolInverse.clear(); if (hasError()) { return nullptr; @@ -135,7 +134,7 @@ Database* Kdbx4Reader::readDatabaseImpl(QIODevice* device, const QByteArray& hea Q_ASSERT(xmlDevice); - KdbxXmlReader xmlReader(KeePass2::FILE_VERSION_4, m_binaryPool); + KdbxXmlReader xmlReader(KeePass2::FILE_VERSION_4, binaryPool()); xmlReader.readDatabase(xmlDevice, m_db.data(), &randomStream); if (xmlReader.hasError()) { @@ -273,14 +272,20 @@ bool Kdbx4Reader::readInnerHeaderField(QIODevice* device) setProtectedStreamKey(fieldData); break; - case KeePass2::InnerHeaderFieldID::Binary: + case KeePass2::InnerHeaderFieldID::Binary: { if (fieldLen < 1) { raiseError(tr("Invalid inner header binary size")); return false; } - m_binaryPool.insert(QString::number(m_binaryPool.size()), fieldData.mid(1)); + auto data = fieldData.mid(1); + if (m_binaryPoolInverse.contains(data)) { + qWarning("Skipping duplicate binary record"); + break; + } + m_binaryPoolInverse.insert(data, QString::number(m_binaryPoolInverse.size())); break; } + } return true; } @@ -417,7 +422,22 @@ QVariantMap Kdbx4Reader::readVariantMap(QIODevice* device) return vm; } +/** + * @return mapping from attachment keys to binary data + */ QHash<QString, QByteArray> Kdbx4Reader::binaryPool() const { - return m_binaryPool; + QHash<QString, QByteArray> binaryPool; + for (auto it = m_binaryPoolInverse.cbegin(); it != m_binaryPoolInverse.cend(); ++it) { + binaryPool.insert(it.value(), it.key()); + } + return binaryPool; +} + +/** + * @return mapping from binary data to attachment keys + */ +QHash<QByteArray, QString> Kdbx4Reader::binaryPoolInverse() const +{ + return m_binaryPoolInverse; } diff --git a/src/format/Kdbx4Reader.h b/src/format/Kdbx4Reader.h index 9764ed886..24d4a9142 100644 --- a/src/format/Kdbx4Reader.h +++ b/src/format/Kdbx4Reader.h @@ -32,6 +32,7 @@ Q_DECLARE_TR_FUNCTIONS(Kdbx4Reader) public: Database* readDatabaseImpl(QIODevice* device, const QByteArray& headerData, const CompositeKey& key, bool keepDatabase) override; + QHash<QByteArray, QString> binaryPoolInverse() const; QHash<QString, QByteArray> binaryPool() const; protected: @@ -41,7 +42,7 @@ private: bool readInnerHeaderField(QIODevice* device); QVariantMap readVariantMap(QIODevice* device); - QHash<QString, QByteArray> m_binaryPool; + QHash<QByteArray, QString> m_binaryPoolInverse; }; #endif // KEEPASSX_KDBX4READER_H diff --git a/src/format/Kdbx4Writer.cpp b/src/format/Kdbx4Writer.cpp index 42cc3ecb5..760baa545 100644 --- a/src/format/Kdbx4Writer.cpp +++ b/src/format/Kdbx4Writer.cpp @@ -211,12 +211,20 @@ bool Kdbx4Writer::writeInnerHeaderField(QIODevice* device, KeePass2::InnerHeader void Kdbx4Writer::writeAttachments(QIODevice* device, Database* db) { const QList<Entry*> allEntries = db->rootGroup()->entriesRecursive(true); + QSet<QByteArray> writtenAttachments; + for (Entry* entry : allEntries) { const QList<QString> attachmentKeys = entry->attachments()->keys(); for (const QString& key : attachmentKeys) { - QByteArray data = entry->attachments()->value(key); - data.prepend("\x01"); + QByteArray data("\x01"); + data.append(entry->attachments()->value(key)); + + if (writtenAttachments.contains(data)) { + continue; + } + writeInnerHeaderField(device, KeePass2::InnerHeaderFieldID::Binary, data); + writtenAttachments.insert(data); } } } diff --git a/src/format/KdbxXmlReader.cpp b/src/format/KdbxXmlReader.cpp index 0b09e8a2f..3d08bb55e 100644 --- a/src/format/KdbxXmlReader.cpp +++ b/src/format/KdbxXmlReader.cpp @@ -40,7 +40,7 @@ KdbxXmlReader::KdbxXmlReader(quint32 version) * @param version KDBX version * @param binaryPool binary pool */ -KdbxXmlReader::KdbxXmlReader(quint32 version, QHash<QString, QByteArray>& binaryPool) +KdbxXmlReader::KdbxXmlReader(quint32 version, const QHash<QString, QByteArray>& binaryPool) : m_kdbxVersion(version) , m_binaryPool(binaryPool) { diff --git a/src/format/KdbxXmlReader.h b/src/format/KdbxXmlReader.h index e31757ccf..7ec592eb4 100644 --- a/src/format/KdbxXmlReader.h +++ b/src/format/KdbxXmlReader.h @@ -42,7 +42,7 @@ Q_DECLARE_TR_FUNCTIONS(KdbxXmlReader) public: explicit KdbxXmlReader(quint32 version); - explicit KdbxXmlReader(quint32 version, QHash<QString, QByteArray>& binaryPool); + explicit KdbxXmlReader(quint32 version, const QHash<QString, QByteArray>& binaryPool); virtual ~KdbxXmlReader() = default; virtual Database* readDatabase(const QString& filename); From 6a97a6dafc26852137530b55182dbdf369aa0e75 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Thu, 25 Jan 2018 01:10:56 +0100 Subject: [PATCH 304/402] Add test for catching KDBX4 attachment mapping errors --- tests/TestKdbx4.cpp | 70 +++++++++++++++++++++++++++++++++++++++++++++ tests/TestKdbx4.h | 1 + 2 files changed, 71 insertions(+) diff --git a/tests/TestKdbx4.cpp b/tests/TestKdbx4.cpp index 8fb0f219b..26937540a 100644 --- a/tests/TestKdbx4.cpp +++ b/tests/TestKdbx4.cpp @@ -188,3 +188,73 @@ void TestKdbx4::testFormat400Upgrade_data() QTest::newRow("AES-KDF + Twofish") << KeePass2::KDF_AES_KDBX4 << KeePass2::CIPHER_TWOFISH << kdbx4; QTest::newRow("AES-KDF (legacy) + Twofish") << KeePass2::KDF_AES_KDBX3 << KeePass2::CIPHER_TWOFISH << kdbx3; } + +/** + * Test for catching mapping errors with duplicate attachments. + */ +void TestKdbx4::testDuplicateAttachments() +{ + QScopedPointer<Database> db(new Database()); + db->setKey(CompositeKey()); + db->setKdf(KeePass2::uuidToKdf(KeePass2::KDF_ARGON2)); + + const QByteArray attachment1("abc"); + const QByteArray attachment2("def"); + const QByteArray attachment3("ghi"); + + auto entry1 = new Entry(); + entry1->setGroup(db->rootGroup()); + entry1->setUuid(Uuid("aaaaaaaaaaaaaaaa")); + entry1->attachments()->set("a", attachment1); + + auto entry2 = new Entry(); + entry2->setGroup(db->rootGroup()); + entry2->setUuid(Uuid("bbbbbbbbbbbbbbbb")); + entry2->attachments()->set("b1", attachment1); + entry2->beginUpdate(); + entry2->attachments()->set("b2", attachment1); + entry2->endUpdate(); + entry2->beginUpdate(); + entry2->attachments()->set("b3", attachment2); + entry2->endUpdate(); + entry2->beginUpdate(); + entry2->attachments()->set("b4", attachment2); + entry2->endUpdate(); + + auto entry3 = new Entry(); + entry3->setGroup(db->rootGroup()); + entry3->setUuid(Uuid("cccccccccccccccc")); + entry3->attachments()->set("c1", attachment2); + entry3->attachments()->set("c2", attachment2); + entry3->attachments()->set("c3", attachment3); + + QBuffer buffer; + buffer.open(QBuffer::ReadWrite); + + KeePass2Writer writer; + writer.writeDatabase(&buffer, db.data()); + if (writer.hasError()) { + QFAIL(qPrintable(QString("Error while writing database: %1").arg(writer.errorString()))); + } + + buffer.seek(0); + KeePass2Reader reader; + db.reset(reader.readDatabase(&buffer, CompositeKey())); + if (reader.hasError()) { + QFAIL(qPrintable(QString("Error while reading database: %1").arg(reader.errorString()))); + } + + QCOMPARE(db->rootGroup()->entries()[0]->attachments()->value("a"), attachment1); + + QCOMPARE(db->rootGroup()->entries()[1]->attachments()->value("b1"), attachment1); + QCOMPARE(db->rootGroup()->entries()[1]->attachments()->value("b2"), attachment1); + QCOMPARE(db->rootGroup()->entries()[1]->attachments()->value("b3"), attachment2); + QCOMPARE(db->rootGroup()->entries()[1]->attachments()->value("b4"), attachment2); + QCOMPARE(db->rootGroup()->entries()[1]->historyItems()[0]->attachments()->value("b1"), attachment1); + QCOMPARE(db->rootGroup()->entries()[1]->historyItems()[1]->attachments()->value("b2"), attachment1); + QCOMPARE(db->rootGroup()->entries()[1]->historyItems()[2]->attachments()->value("b3"), attachment2); + + QCOMPARE(db->rootGroup()->entries()[2]->attachments()->value("c1"), attachment2); + QCOMPARE(db->rootGroup()->entries()[2]->attachments()->value("c2"), attachment2); + QCOMPARE(db->rootGroup()->entries()[2]->attachments()->value("c3"), attachment3); +} diff --git a/tests/TestKdbx4.h b/tests/TestKdbx4.h index 59864b70e..ceceefcb7 100644 --- a/tests/TestKdbx4.h +++ b/tests/TestKdbx4.h @@ -28,6 +28,7 @@ private slots: void testFormat400(); void testFormat400Upgrade(); void testFormat400Upgrade_data(); + void testDuplicateAttachments(); protected: void initTestCaseImpl() override; From b7c5283a660476c76a97642e90f4ec819d8d598d Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Thu, 25 Jan 2018 02:16:18 +0100 Subject: [PATCH 305/402] Move duplicate attachment test to TestKeePass2Format, so it's also run for KDBX3 --- tests/TestKdbx4.cpp | 70 ----------------------------------- tests/TestKdbx4.h | 1 - tests/TestKeePass2Format.cpp | 72 ++++++++++++++++++++++++++++++++++++ tests/TestKeePass2Format.h | 1 + 4 files changed, 73 insertions(+), 71 deletions(-) diff --git a/tests/TestKdbx4.cpp b/tests/TestKdbx4.cpp index 26937540a..8fb0f219b 100644 --- a/tests/TestKdbx4.cpp +++ b/tests/TestKdbx4.cpp @@ -188,73 +188,3 @@ void TestKdbx4::testFormat400Upgrade_data() QTest::newRow("AES-KDF + Twofish") << KeePass2::KDF_AES_KDBX4 << KeePass2::CIPHER_TWOFISH << kdbx4; QTest::newRow("AES-KDF (legacy) + Twofish") << KeePass2::KDF_AES_KDBX3 << KeePass2::CIPHER_TWOFISH << kdbx3; } - -/** - * Test for catching mapping errors with duplicate attachments. - */ -void TestKdbx4::testDuplicateAttachments() -{ - QScopedPointer<Database> db(new Database()); - db->setKey(CompositeKey()); - db->setKdf(KeePass2::uuidToKdf(KeePass2::KDF_ARGON2)); - - const QByteArray attachment1("abc"); - const QByteArray attachment2("def"); - const QByteArray attachment3("ghi"); - - auto entry1 = new Entry(); - entry1->setGroup(db->rootGroup()); - entry1->setUuid(Uuid("aaaaaaaaaaaaaaaa")); - entry1->attachments()->set("a", attachment1); - - auto entry2 = new Entry(); - entry2->setGroup(db->rootGroup()); - entry2->setUuid(Uuid("bbbbbbbbbbbbbbbb")); - entry2->attachments()->set("b1", attachment1); - entry2->beginUpdate(); - entry2->attachments()->set("b2", attachment1); - entry2->endUpdate(); - entry2->beginUpdate(); - entry2->attachments()->set("b3", attachment2); - entry2->endUpdate(); - entry2->beginUpdate(); - entry2->attachments()->set("b4", attachment2); - entry2->endUpdate(); - - auto entry3 = new Entry(); - entry3->setGroup(db->rootGroup()); - entry3->setUuid(Uuid("cccccccccccccccc")); - entry3->attachments()->set("c1", attachment2); - entry3->attachments()->set("c2", attachment2); - entry3->attachments()->set("c3", attachment3); - - QBuffer buffer; - buffer.open(QBuffer::ReadWrite); - - KeePass2Writer writer; - writer.writeDatabase(&buffer, db.data()); - if (writer.hasError()) { - QFAIL(qPrintable(QString("Error while writing database: %1").arg(writer.errorString()))); - } - - buffer.seek(0); - KeePass2Reader reader; - db.reset(reader.readDatabase(&buffer, CompositeKey())); - if (reader.hasError()) { - QFAIL(qPrintable(QString("Error while reading database: %1").arg(reader.errorString()))); - } - - QCOMPARE(db->rootGroup()->entries()[0]->attachments()->value("a"), attachment1); - - QCOMPARE(db->rootGroup()->entries()[1]->attachments()->value("b1"), attachment1); - QCOMPARE(db->rootGroup()->entries()[1]->attachments()->value("b2"), attachment1); - QCOMPARE(db->rootGroup()->entries()[1]->attachments()->value("b3"), attachment2); - QCOMPARE(db->rootGroup()->entries()[1]->attachments()->value("b4"), attachment2); - QCOMPARE(db->rootGroup()->entries()[1]->historyItems()[0]->attachments()->value("b1"), attachment1); - QCOMPARE(db->rootGroup()->entries()[1]->historyItems()[1]->attachments()->value("b2"), attachment1); - QCOMPARE(db->rootGroup()->entries()[1]->historyItems()[2]->attachments()->value("b3"), attachment2); - - QCOMPARE(db->rootGroup()->entries()[2]->attachments()->value("c1"), attachment2); - QCOMPARE(db->rootGroup()->entries()[2]->attachments()->value("c2"), attachment2); - QCOMPARE(db->rootGroup()->entries()[2]->attachments()->value("c3"), attachment3); -} diff --git a/tests/TestKdbx4.h b/tests/TestKdbx4.h index ceceefcb7..59864b70e 100644 --- a/tests/TestKdbx4.h +++ b/tests/TestKdbx4.h @@ -28,7 +28,6 @@ private slots: void testFormat400(); void testFormat400Upgrade(); void testFormat400Upgrade_data(); - void testDuplicateAttachments(); protected: void initTestCaseImpl() override; diff --git a/tests/TestKeePass2Format.cpp b/tests/TestKeePass2Format.cpp index 34daea879..790f0d802 100644 --- a/tests/TestKeePass2Format.cpp +++ b/tests/TestKeePass2Format.cpp @@ -565,3 +565,75 @@ void TestKeePass2Format::testKdbxDeviceFailure() QVERIFY(hasError); QCOMPARE(errorString, QString("FAILDEVICE")); } + +/** + * Test for catching mapping errors with duplicate attachments. + */ +void TestKeePass2Format::testDuplicateAttachments() +{ + QScopedPointer<Database> db(new Database()); + db->setKey(CompositeKey()); + + const QByteArray attachment1("abc"); + const QByteArray attachment2("def"); + const QByteArray attachment3("ghi"); + + auto entry1 = new Entry(); + entry1->setGroup(db->rootGroup()); + entry1->setUuid(Uuid("aaaaaaaaaaaaaaaa")); + entry1->attachments()->set("a", attachment1); + + auto entry2 = new Entry(); + entry2->setGroup(db->rootGroup()); + entry2->setUuid(Uuid("bbbbbbbbbbbbbbbb")); + entry2->attachments()->set("b1", attachment1); + entry2->beginUpdate(); + entry2->attachments()->set("b2", attachment1); + entry2->endUpdate(); + entry2->beginUpdate(); + entry2->attachments()->set("b3", attachment2); + entry2->endUpdate(); + entry2->beginUpdate(); + entry2->attachments()->set("b4", attachment2); + entry2->endUpdate(); + + auto entry3 = new Entry(); + entry3->setGroup(db->rootGroup()); + entry3->setUuid(Uuid("cccccccccccccccc")); + entry3->attachments()->set("c1", attachment2); + entry3->attachments()->set("c2", attachment2); + entry3->attachments()->set("c3", attachment3); + + QBuffer buffer; + buffer.open(QBuffer::ReadWrite); + + bool hasError = false; + QString errorString; + writeKdbx(&buffer, db.data(), hasError, errorString); + if (hasError) { + QFAIL(qPrintable(QString("Error while writing database: %1").arg(errorString))); + } + + buffer.seek(0); + readKdbx(&buffer, CompositeKey(), db, hasError, errorString); + if (hasError) { + QFAIL(qPrintable(QString("Error while reading database: %1").arg(errorString))); + } + + QCOMPARE(db->rootGroup()->entries()[0]->attachments()->value("a"), attachment1); + + QCOMPARE(db->rootGroup()->entries()[1]->attachments()->value("b1"), attachment1); + QCOMPARE(db->rootGroup()->entries()[1]->attachments()->value("b2"), attachment1); + QCOMPARE(db->rootGroup()->entries()[1]->attachments()->value("b3"), attachment2); + QCOMPARE(db->rootGroup()->entries()[1]->attachments()->value("b4"), attachment2); + QCOMPARE(db->rootGroup()->entries()[1]->historyItems()[0]->attachments()->value("b1"), attachment1); + QCOMPARE(db->rootGroup()->entries()[1]->historyItems()[1]->attachments()->value("b1"), attachment1); + QCOMPARE(db->rootGroup()->entries()[1]->historyItems()[1]->attachments()->value("b2"), attachment1); + QCOMPARE(db->rootGroup()->entries()[1]->historyItems()[2]->attachments()->value("b1"), attachment1); + QCOMPARE(db->rootGroup()->entries()[1]->historyItems()[2]->attachments()->value("b2"), attachment1); + QCOMPARE(db->rootGroup()->entries()[1]->historyItems()[2]->attachments()->value("b3"), attachment2); + + QCOMPARE(db->rootGroup()->entries()[2]->attachments()->value("c1"), attachment2); + QCOMPARE(db->rootGroup()->entries()[2]->attachments()->value("c2"), attachment2); + QCOMPARE(db->rootGroup()->entries()[2]->attachments()->value("c3"), attachment3); +} diff --git a/tests/TestKeePass2Format.h b/tests/TestKeePass2Format.h index a2bdd4f49..2a30d92b2 100644 --- a/tests/TestKeePass2Format.h +++ b/tests/TestKeePass2Format.h @@ -63,6 +63,7 @@ private slots: void testKdbxAttachments(); void testKdbxNonAsciiPasswords(); void testKdbxDeviceFailure(); + void testDuplicateAttachments(); protected: virtual void initTestCaseImpl() = 0; From e560650bf3d5d6d7649b3e107a4c8488e36c0be0 Mon Sep 17 00:00:00 2001 From: Didier Fabert <dfabert@b2pweb.com> Date: Fri, 10 Feb 2017 15:42:18 +0100 Subject: [PATCH 306/402] Add DBus support: control keepassxc on desktop events (load database when log in, close all databases when log out) --- CMakeLists.txt | 1 + README-DBus.md | 40 +++++++++++++++++ src/CMakeLists.txt | 9 +++- src/config-keepassx.h.cmake | 1 + src/gui/MainWindow.cpp | 22 ++++++++++ src/gui/MainWindow.h | 5 +++ src/gui/MainWindowAdaptor.cpp | 65 ++++++++++++++++++++++++++++ src/gui/MainWindowAdaptor.h | 63 +++++++++++++++++++++++++++ src/gui/org.keepassxc.MainWindow.xml | 21 +++++++++ 9 files changed, 226 insertions(+), 1 deletion(-) create mode 100644 README-DBus.md create mode 100644 src/gui/MainWindowAdaptor.cpp create mode 100644 src/gui/MainWindowAdaptor.h create mode 100644 src/gui/org.keepassxc.MainWindow.xml diff --git a/CMakeLists.txt b/CMakeLists.txt index 3708667a7..ef8d0b01f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,6 +46,7 @@ option(WITH_XC_BROWSER "Include browser integration with keepassxc-browser." OFF option(WITH_XC_HTTP "Include KeePassHTTP-compatible browser integration (deprecated, implies WITH_NETWORKING)." OFF) option(WITH_XC_YUBIKEY "Include YubiKey support." OFF) option(WITH_XC_SSHAGENT "Include SSH agent support." OFF) +option(WITH_XC_DBUS "Include DBus support." OFF) if(WITH_XC_HTTP) message(WARNING "KeePassHTTP support has been deprecated and will be removed in a future version. Please use WITH_XC_BROWSER instead!\n" diff --git a/README-DBus.md b/README-DBus.md new file mode 100644 index 000000000..ae99e13ae --- /dev/null +++ b/README-DBus.md @@ -0,0 +1,40 @@ +## Using D-BUS feature + +* Open keepassxc database: without password and key file + + qdbus org.keepassxc.MainWindow /keepassxc org.keepassxc.MainWindow.openDatabase /path/to/database.kdbx + +* Open keepassxc database: with password but without key file + + qdbus org.keepassxc.MainWindow /keepassxc org.keepassxc.MainWindow.openDatabase /path/to/database.kdbx passwd + +* Open keepassxc database: with password and key file + + qdbus org.keepassxc.MainWindow /keepassxc org.keepassxc.MainWindow.openDatabase /path/to/database.kdbx passwd /path/to/key + +* Close all keepassxc databases + + qdbus org.keepassxc.MainWindow /keepassxc org.keepassxc.MainWindow.closeAllDatabases + +* Exit keepassxc + + qdbus org.keepassxc.MainWindow /keepassxc org.keepassxc.MainWindow.exit + +## Develop + +* Regenerate XML file for DBus ( If MainWindow class public methods were modified ) + + cd src/gui + + qdbusxml2cpp -c MainWindowAdaptor -a MainWindowAdaptor.h:MainWindowAdaptor.cpp org.keepassxc.MainWindow.xml + +* It can be usefull to know how to generate the XML adaptor + +* * Generate template from sources + + qdbuscpp2xml -M -s MainWindow.h -o org.keepassxc.MainWindow.xml + +* * Make sure interface name is org.keepassxc.MainWindow + + <interface name="org.keepassxc.MainWindow"> + diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 80ca54a49..eebb52710 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -193,7 +193,7 @@ add_feature_info(KeePassXC-Browser WITH_XC_BROWSER "Browser integration with Kee add_feature_info(KeePassHTTP WITH_XC_HTTP "Browser integration compatible with ChromeIPass and PassIFox (deprecated, implies Networking)") add_feature_info(SSHAgent WITH_XC_SSHAGENT "SSH agent integration compatible with KeeAgent") add_feature_info(YubiKey WITH_XC_YUBIKEY "YubiKey HMAC-SHA1 challenge-response") - +add_feature_info(DBus WITH_XC_DBUS "Take keepassxc control by DBus") if(WITH_XC_HTTP) add_subdirectory(http) @@ -211,6 +211,13 @@ if(WITH_XC_BROWSER) set(keepassxcbrowser_LIB keepassxcbrowser) endif() +if(UNIX AND NOT APPLE AND WITH_XC_DBUS) + set(keepassx_SOURCES + ${keepassx_SOURCES} + gui/MainWindowAdaptor.cpp + ) +endif() + add_subdirectory(autotype) add_subdirectory(cli) diff --git a/src/config-keepassx.h.cmake b/src/config-keepassx.h.cmake index e98830b09..9b4252ebf 100644 --- a/src/config-keepassx.h.cmake +++ b/src/config-keepassx.h.cmake @@ -18,6 +18,7 @@ #cmakedefine WITH_XC_HTTP #cmakedefine WITH_XC_YUBIKEY #cmakedefine WITH_XC_SSHAGENT +#cmakedefine WITH_XC_DBUS #cmakedefine KEEPASSXC_DIST #cmakedefine KEEPASSXC_DIST_TYPE "@KEEPASSXC_DIST_TYPE@" diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 915676e3c..0b8e83bb0 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -64,6 +64,13 @@ #include "gui/SettingsWidget.h" #include "gui/PasswordGeneratorWidget.h" +#ifdef WITH_XC_DBUS +#if defined(Q_OS_LINUX) +#include <QtDBus> +#include "gui/MainWindowAdaptor.h" +#endif +#endif + #ifdef WITH_XC_HTTP class HttpPlugin: public ISettingsPage { @@ -168,6 +175,16 @@ MainWindow::MainWindow() , m_appExiting(false) { m_ui->setupUi(this); + #ifdef WITH_XC_DBUS + #if defined(Q_OS_LINUX) + new MainWindowAdaptor(this); + QDBusConnection dbus = QDBusConnection::sessionBus(); + dbus.registerObject("/keepassxc", this); + dbus.registerService("org.keepassxc.MainWindow"); + #else + qWarning("DBus is not available on this system"); + #endif + #endif setAcceptDrops(true); @@ -1123,3 +1140,8 @@ void MainWindow::dropEvent(QDropEvent* event) } } } + +void MainWindow::closeAllDatabases() +{ + m_ui->tabWidget->closeAllDatabases(); +} diff --git a/src/gui/MainWindow.h b/src/gui/MainWindow.h index f3b288003..a616d878f 100644 --- a/src/gui/MainWindow.h +++ b/src/gui/MainWindow.h @@ -37,6 +37,10 @@ class InactivityTimer; class MainWindow : public QMainWindow { Q_OBJECT + +#if defined(Q_OS_LINUX) + Q_CLASSINFO("D-Bus Interface", "org.keepassxc.MainWindow") +#endif public: MainWindow(); @@ -62,6 +66,7 @@ public slots: void showYubiKeyPopup(); void hideYubiKeyPopup(); void bringToFront(); + void closeAllDatabases(); protected: void closeEvent(QCloseEvent* event) override; diff --git a/src/gui/MainWindowAdaptor.cpp b/src/gui/MainWindowAdaptor.cpp new file mode 100644 index 000000000..5d1838d27 --- /dev/null +++ b/src/gui/MainWindowAdaptor.cpp @@ -0,0 +1,65 @@ +/* + * This file was generated by qdbusxml2cpp version 0.7 + * Command line was: qdbusxml2cpp -c MainWindowAdaptor -a MainWindowAdaptor.h:MainWindowAdaptor.cpp org.keepassxc.MainWindow.xml + * + * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. + * + * This is an auto-generated file. + * Do not edit! All changes made to it will be lost. + */ + +#include "MainWindowAdaptor.h" +#include <QtCore/QMetaObject> +#include <QtCore/QByteArray> +#include <QtCore/QList> +#include <QtCore/QMap> +#include <QtCore/QString> +#include <QtCore/QStringList> +#include <QtCore/QVariant> + +/* + * Implementation of adaptor class MainWindowAdaptor + */ + +MainWindowAdaptor::MainWindowAdaptor(QObject *parent) + : QDBusAbstractAdaptor(parent) +{ + // constructor + setAutoRelaySignals(true); +} + +MainWindowAdaptor::~MainWindowAdaptor() +{ + // destructor +} + +void MainWindowAdaptor::appExit() +{ + // handle method call org.keepassxc.MainWindow.appExit + QMetaObject::invokeMethod(parent(), "appExit"); +} + +void MainWindowAdaptor::closeAllDatabases() +{ + // handle method call org.keepassxc.MainWindow.closeAllDatabases + QMetaObject::invokeMethod(parent(), "closeAllDatabases"); +} + +void MainWindowAdaptor::openDatabase(const QString &fileName) +{ + // handle method call org.keepassxc.MainWindow.openDatabase + QMetaObject::invokeMethod(parent(), "openDatabase", Q_ARG(QString, fileName)); +} + +void MainWindowAdaptor::openDatabase(const QString &fileName, const QString &pw) +{ + // handle method call org.keepassxc.MainWindow.openDatabase + QMetaObject::invokeMethod(parent(), "openDatabase", Q_ARG(QString, fileName), Q_ARG(QString, pw)); +} + +void MainWindowAdaptor::openDatabase(const QString &fileName, const QString &pw, const QString &keyFile) +{ + // handle method call org.keepassxc.MainWindow.openDatabase + QMetaObject::invokeMethod(parent(), "openDatabase", Q_ARG(QString, fileName), Q_ARG(QString, pw), Q_ARG(QString, keyFile)); +} + diff --git a/src/gui/MainWindowAdaptor.h b/src/gui/MainWindowAdaptor.h new file mode 100644 index 000000000..32af2819e --- /dev/null +++ b/src/gui/MainWindowAdaptor.h @@ -0,0 +1,63 @@ +/* + * This file was generated by qdbusxml2cpp version 0.7 + * Command line was: qdbusxml2cpp -c MainWindowAdaptor -a MainWindowAdaptor.h:MainWindowAdaptor.cpp org.keepassxc.MainWindow.xml + * + * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. + * + * This is an auto-generated file. + * This file may have been hand-edited. Look for HAND-EDIT comments + * before re-generating it. + */ + +#ifndef MAINWINDOWADAPTOR_H_1486736200 +#define MAINWINDOWADAPTOR_H_1486736200 + +#include <QtCore/QObject> +#include <QtDBus/QtDBus> +class QByteArray; +template<class T> class QList; +template<class Key, class Value> class QMap; +class QString; +class QStringList; +class QVariant; + +/* + * Adaptor class for interface org.keepassxc.MainWindow + */ +class MainWindowAdaptor: public QDBusAbstractAdaptor +{ + Q_OBJECT + Q_CLASSINFO("D-Bus Interface", "org.keepassxc.MainWindow") + Q_CLASSINFO("D-Bus Introspection", "" +" <interface name=\"org.keepassxc.MainWindow\">\n" +" <method name=\"openDatabase\">\n" +" <arg direction=\"in\" type=\"s\" name=\"fileName\"/>\n" +" <arg direction=\"in\" type=\"s\" name=\"pw\"/>\n" +" <arg direction=\"in\" type=\"s\" name=\"keyFile\"/>\n" +" </method>\n" +" <method name=\"openDatabase\">\n" +" <arg direction=\"in\" type=\"s\" name=\"fileName\"/>\n" +" <arg direction=\"in\" type=\"s\" name=\"pw\"/>\n" +" </method>\n" +" <method name=\"openDatabase\">\n" +" <arg direction=\"in\" type=\"s\" name=\"fileName\"/>\n" +" </method>\n" +" <method name=\"appExit\"/>\n" +" <method name=\"closeAllDatabases\"/>\n" +" </interface>\n" + "") +public: + MainWindowAdaptor(QObject *parent); + virtual ~MainWindowAdaptor(); + +public: // PROPERTIES +public Q_SLOTS: // METHODS + void appExit(); + void closeAllDatabases(); + void openDatabase(const QString &fileName); + void openDatabase(const QString &fileName, const QString &pw); + void openDatabase(const QString &fileName, const QString &pw, const QString &keyFile); +Q_SIGNALS: // SIGNALS +}; + +#endif diff --git a/src/gui/org.keepassxc.MainWindow.xml b/src/gui/org.keepassxc.MainWindow.xml new file mode 100644 index 000000000..506339e2c --- /dev/null +++ b/src/gui/org.keepassxc.MainWindow.xml @@ -0,0 +1,21 @@ +<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> +<node> + <interface name="org.keepassxc.MainWindow"> + <method name="openDatabase"> + <arg name="fileName" type="s" direction="in"/> + <arg name="pw" type="s" direction="in"/> + <arg name="keyFile" type="s" direction="in"/> + </method> + <method name="openDatabase"> + <arg name="fileName" type="s" direction="in"/> + <arg name="pw" type="s" direction="in"/> + </method> + <method name="openDatabase"> + <arg name="fileName" type="s" direction="in"/> + </method> + <method name="appExit"> + </method> + <method name="closeAllDatabases"> + </method> + </interface> +</node> From 98a89e4f2c973683aef8f57eb527d3b7110d6287 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Tue, 16 Jan 2018 00:49:32 +0100 Subject: [PATCH 307/402] add function for locking DBs from DBus, fix #687 --- CMakeLists.txt | 1 - README-DBus.md | 40 ------------------- src/CMakeLists.txt | 9 +---- src/config-keepassx.h.cmake | 1 - src/gui/MainWindow.cpp | 34 +++++++--------- src/gui/MainWindow.h | 9 +++-- src/gui/MainWindowAdaptor.cpp | 14 +++---- src/gui/MainWindowAdaptor.h | 16 +++++--- ...=> org.keepassxc.KeePassXC.MainWindow.xml} | 4 +- 9 files changed, 40 insertions(+), 88 deletions(-) delete mode 100644 README-DBus.md rename src/gui/{org.keepassxc.MainWindow.xml => org.keepassxc.KeePassXC.MainWindow.xml} (86%) diff --git a/CMakeLists.txt b/CMakeLists.txt index ef8d0b01f..3708667a7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,7 +46,6 @@ option(WITH_XC_BROWSER "Include browser integration with keepassxc-browser." OFF option(WITH_XC_HTTP "Include KeePassHTTP-compatible browser integration (deprecated, implies WITH_NETWORKING)." OFF) option(WITH_XC_YUBIKEY "Include YubiKey support." OFF) option(WITH_XC_SSHAGENT "Include SSH agent support." OFF) -option(WITH_XC_DBUS "Include DBus support." OFF) if(WITH_XC_HTTP) message(WARNING "KeePassHTTP support has been deprecated and will be removed in a future version. Please use WITH_XC_BROWSER instead!\n" diff --git a/README-DBus.md b/README-DBus.md deleted file mode 100644 index ae99e13ae..000000000 --- a/README-DBus.md +++ /dev/null @@ -1,40 +0,0 @@ -## Using D-BUS feature - -* Open keepassxc database: without password and key file - - qdbus org.keepassxc.MainWindow /keepassxc org.keepassxc.MainWindow.openDatabase /path/to/database.kdbx - -* Open keepassxc database: with password but without key file - - qdbus org.keepassxc.MainWindow /keepassxc org.keepassxc.MainWindow.openDatabase /path/to/database.kdbx passwd - -* Open keepassxc database: with password and key file - - qdbus org.keepassxc.MainWindow /keepassxc org.keepassxc.MainWindow.openDatabase /path/to/database.kdbx passwd /path/to/key - -* Close all keepassxc databases - - qdbus org.keepassxc.MainWindow /keepassxc org.keepassxc.MainWindow.closeAllDatabases - -* Exit keepassxc - - qdbus org.keepassxc.MainWindow /keepassxc org.keepassxc.MainWindow.exit - -## Develop - -* Regenerate XML file for DBus ( If MainWindow class public methods were modified ) - - cd src/gui - - qdbusxml2cpp -c MainWindowAdaptor -a MainWindowAdaptor.h:MainWindowAdaptor.cpp org.keepassxc.MainWindow.xml - -* It can be usefull to know how to generate the XML adaptor - -* * Generate template from sources - - qdbuscpp2xml -M -s MainWindow.h -o org.keepassxc.MainWindow.xml - -* * Make sure interface name is org.keepassxc.MainWindow - - <interface name="org.keepassxc.MainWindow"> - diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index eebb52710..acc01e2bc 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -174,6 +174,7 @@ if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux" OR ${CMAKE_SYSTEM_NAME} STREQUAL "OpenB set(keepassx_SOURCES ${keepassx_SOURCES} core/ScreenLockListenerDBus.h core/ScreenLockListenerDBus.cpp + gui/MainWindowAdaptor.cpp ) endif() if(MINGW) @@ -193,7 +194,6 @@ add_feature_info(KeePassXC-Browser WITH_XC_BROWSER "Browser integration with Kee add_feature_info(KeePassHTTP WITH_XC_HTTP "Browser integration compatible with ChromeIPass and PassIFox (deprecated, implies Networking)") add_feature_info(SSHAgent WITH_XC_SSHAGENT "SSH agent integration compatible with KeeAgent") add_feature_info(YubiKey WITH_XC_YUBIKEY "YubiKey HMAC-SHA1 challenge-response") -add_feature_info(DBus WITH_XC_DBUS "Take keepassxc control by DBus") if(WITH_XC_HTTP) add_subdirectory(http) @@ -211,13 +211,6 @@ if(WITH_XC_BROWSER) set(keepassxcbrowser_LIB keepassxcbrowser) endif() -if(UNIX AND NOT APPLE AND WITH_XC_DBUS) - set(keepassx_SOURCES - ${keepassx_SOURCES} - gui/MainWindowAdaptor.cpp - ) -endif() - add_subdirectory(autotype) add_subdirectory(cli) diff --git a/src/config-keepassx.h.cmake b/src/config-keepassx.h.cmake index 9b4252ebf..e98830b09 100644 --- a/src/config-keepassx.h.cmake +++ b/src/config-keepassx.h.cmake @@ -18,7 +18,6 @@ #cmakedefine WITH_XC_HTTP #cmakedefine WITH_XC_YUBIKEY #cmakedefine WITH_XC_SSHAGENT -#cmakedefine WITH_XC_DBUS #cmakedefine KEEPASSXC_DIST #cmakedefine KEEPASSXC_DIST_TYPE "@KEEPASSXC_DIST_TYPE@" diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 0b8e83bb0..b25f9d554 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -24,11 +24,6 @@ #include <QShortcut> #include <QTimer> -#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(QT_NO_DBUS) -#include <QList> -#include <QtDBus/QtDBus> -#endif - #include "config-keepassx.h" #include "autotype/AutoType.h" @@ -61,15 +56,14 @@ #include "browser/BrowserOptionDialog.h" #endif -#include "gui/SettingsWidget.h" -#include "gui/PasswordGeneratorWidget.h" - -#ifdef WITH_XC_DBUS -#if defined(Q_OS_LINUX) -#include <QtDBus> +#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(QT_NO_DBUS) +#include <QList> +#include <QtDBus/QtDBus> #include "gui/MainWindowAdaptor.h" #endif -#endif + +#include "gui/SettingsWidget.h" +#include "gui/PasswordGeneratorWidget.h" #ifdef WITH_XC_HTTP class HttpPlugin: public ISettingsPage @@ -175,16 +169,13 @@ MainWindow::MainWindow() , m_appExiting(false) { m_ui->setupUi(this); - #ifdef WITH_XC_DBUS - #if defined(Q_OS_LINUX) + +#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(QT_NO_DBUS) new MainWindowAdaptor(this); QDBusConnection dbus = QDBusConnection::sessionBus(); dbus.registerObject("/keepassxc", this); - dbus.registerService("org.keepassxc.MainWindow"); - #else - qWarning("DBus is not available on this system"); - #endif - #endif + dbus.registerService("org.keepassxc.KeePassXC.MainWindow"); +#endif setAcceptDrops(true); @@ -1145,3 +1136,8 @@ void MainWindow::closeAllDatabases() { m_ui->tabWidget->closeAllDatabases(); } + +void MainWindow::lockAllDatabases() +{ + lockDatabasesAfterInactivity(); +} \ No newline at end of file diff --git a/src/gui/MainWindow.h b/src/gui/MainWindow.h index a616d878f..fd31fab0b 100644 --- a/src/gui/MainWindow.h +++ b/src/gui/MainWindow.h @@ -38,8 +38,8 @@ class MainWindow : public QMainWindow { Q_OBJECT -#if defined(Q_OS_LINUX) - Q_CLASSINFO("D-Bus Interface", "org.keepassxc.MainWindow") +#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(QT_NO_DBUS) + Q_CLASSINFO("D-Bus Interface", "org.keepassxc.KeePassXC.MainWindow") #endif public: @@ -67,10 +67,11 @@ public slots: void hideYubiKeyPopup(); void bringToFront(); void closeAllDatabases(); + void lockAllDatabases(); protected: - void closeEvent(QCloseEvent* event) override; - void changeEvent(QEvent* event) override; + void closeEvent(QCloseEvent* event) override; + void changeEvent(QEvent* event) override; private slots: void setMenuActionState(DatabaseWidget::Mode mode = DatabaseWidget::None); diff --git a/src/gui/MainWindowAdaptor.cpp b/src/gui/MainWindowAdaptor.cpp index 5d1838d27..8b229ce34 100644 --- a/src/gui/MainWindowAdaptor.cpp +++ b/src/gui/MainWindowAdaptor.cpp @@ -1,5 +1,5 @@ /* - * This file was generated by qdbusxml2cpp version 0.7 + * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -c MainWindowAdaptor -a MainWindowAdaptor.h:MainWindowAdaptor.cpp org.keepassxc.MainWindow.xml * * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. @@ -24,42 +24,40 @@ MainWindowAdaptor::MainWindowAdaptor(QObject *parent) : QDBusAbstractAdaptor(parent) { - // constructor setAutoRelaySignals(true); } MainWindowAdaptor::~MainWindowAdaptor() { - // destructor } void MainWindowAdaptor::appExit() { - // handle method call org.keepassxc.MainWindow.appExit QMetaObject::invokeMethod(parent(), "appExit"); } void MainWindowAdaptor::closeAllDatabases() { - // handle method call org.keepassxc.MainWindow.closeAllDatabases QMetaObject::invokeMethod(parent(), "closeAllDatabases"); } +void MainWindowAdaptor::lockAllDatabases() +{ + QMetaObject::invokeMethod(parent(), "lockAllDatabases"); +} + void MainWindowAdaptor::openDatabase(const QString &fileName) { - // handle method call org.keepassxc.MainWindow.openDatabase QMetaObject::invokeMethod(parent(), "openDatabase", Q_ARG(QString, fileName)); } void MainWindowAdaptor::openDatabase(const QString &fileName, const QString &pw) { - // handle method call org.keepassxc.MainWindow.openDatabase QMetaObject::invokeMethod(parent(), "openDatabase", Q_ARG(QString, fileName), Q_ARG(QString, pw)); } void MainWindowAdaptor::openDatabase(const QString &fileName, const QString &pw, const QString &keyFile) { - // handle method call org.keepassxc.MainWindow.openDatabase QMetaObject::invokeMethod(parent(), "openDatabase", Q_ARG(QString, fileName), Q_ARG(QString, pw), Q_ARG(QString, keyFile)); } diff --git a/src/gui/MainWindowAdaptor.h b/src/gui/MainWindowAdaptor.h index 32af2819e..06e0ce87e 100644 --- a/src/gui/MainWindowAdaptor.h +++ b/src/gui/MainWindowAdaptor.h @@ -1,5 +1,5 @@ /* - * This file was generated by qdbusxml2cpp version 0.7 + * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -c MainWindowAdaptor -a MainWindowAdaptor.h:MainWindowAdaptor.cpp org.keepassxc.MainWindow.xml * * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. @@ -9,17 +9,19 @@ * before re-generating it. */ -#ifndef MAINWINDOWADAPTOR_H_1486736200 -#define MAINWINDOWADAPTOR_H_1486736200 +#ifndef MAINWINDOWADAPTOR_H +#define MAINWINDOWADAPTOR_H #include <QtCore/QObject> #include <QtDBus/QtDBus> +QT_BEGIN_NAMESPACE class QByteArray; template<class T> class QList; template<class Key, class Value> class QMap; class QString; class QStringList; class QVariant; +QT_END_NAMESPACE /* * Adaptor class for interface org.keepassxc.MainWindow @@ -43,6 +45,7 @@ class MainWindowAdaptor: public QDBusAbstractAdaptor " <arg direction=\"in\" type=\"s\" name=\"fileName\"/>\n" " </method>\n" " <method name=\"appExit\"/>\n" +" <method name=\"lockAllDatabases\"/>\n" " <method name=\"closeAllDatabases\"/>\n" " </interface>\n" "") @@ -50,14 +53,15 @@ public: MainWindowAdaptor(QObject *parent); virtual ~MainWindowAdaptor(); -public: // PROPERTIES -public Q_SLOTS: // METHODS +public: +public slots: void appExit(); void closeAllDatabases(); + void lockAllDatabases(); void openDatabase(const QString &fileName); void openDatabase(const QString &fileName, const QString &pw); void openDatabase(const QString &fileName, const QString &pw, const QString &keyFile); -Q_SIGNALS: // SIGNALS +signals: }; #endif diff --git a/src/gui/org.keepassxc.MainWindow.xml b/src/gui/org.keepassxc.KeePassXC.MainWindow.xml similarity index 86% rename from src/gui/org.keepassxc.MainWindow.xml rename to src/gui/org.keepassxc.KeePassXC.MainWindow.xml index 506339e2c..635a66b93 100644 --- a/src/gui/org.keepassxc.MainWindow.xml +++ b/src/gui/org.keepassxc.KeePassXC.MainWindow.xml @@ -1,6 +1,6 @@ <!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> <node> - <interface name="org.keepassxc.MainWindow"> + <interface name="org.keepassxc.KeePassXC.MainWindow"> <method name="openDatabase"> <arg name="fileName" type="s" direction="in"/> <arg name="pw" type="s" direction="in"/> @@ -15,6 +15,8 @@ </method> <method name="appExit"> </method> + <method name="lockAllDatabases"> + </method> <method name="closeAllDatabases"> </method> </interface> From 07a2077c1edac73ba6c8478b2b1fc1bc039892f2 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sun, 28 Jan 2018 16:42:46 +0100 Subject: [PATCH 308/402] Make 'Welcome to KeePassXC $VERSION' string properly translatable, resolves #1236 --- src/gui/WelcomeWidget.cpp | 2 +- src/gui/WelcomeWidget.ui | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/gui/WelcomeWidget.cpp b/src/gui/WelcomeWidget.cpp index 9dc23d528..5a2251490 100644 --- a/src/gui/WelcomeWidget.cpp +++ b/src/gui/WelcomeWidget.cpp @@ -29,7 +29,7 @@ WelcomeWidget::WelcomeWidget(QWidget* parent) { m_ui->setupUi(this); - m_ui->welcomeLabel->setText(m_ui->welcomeLabel->text() + " " + KEEPASSX_VERSION); + m_ui->welcomeLabel->setText(tr("Welcome to KeePassXC %1").arg(KEEPASSX_VERSION)); QFont welcomeLabelFont = m_ui->welcomeLabel->font(); welcomeLabelFont.setBold(true); welcomeLabelFont.setPointSize(welcomeLabelFont.pointSize() + 4); diff --git a/src/gui/WelcomeWidget.ui b/src/gui/WelcomeWidget.ui index da6bc859c..a842ff41b 100644 --- a/src/gui/WelcomeWidget.ui +++ b/src/gui/WelcomeWidget.ui @@ -72,9 +72,6 @@ </item> <item> <widget class="QLabel" name="welcomeLabel"> - <property name="text"> - <string>Welcome to KeePassXC</string> - </property> <property name="alignment"> <set>Qt::AlignCenter</set> </property> From d7f408e4553c8d0e36de519b418b15d61132b487 Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Sun, 14 Jan 2018 18:04:33 -0500 Subject: [PATCH 309/402] Correct saving files to DropBox/Drive/OneDrive * Replaces QSaveFile with QTemporaryFile * Added backup before save config setting * This method may cause data loss (see comments) --- src/core/Config.cpp | 1 + src/core/Database.cpp | 46 +++++++++++++++++++++++--------- src/core/Database.h | 2 +- src/gui/DatabaseTabWidget.cpp | 4 ++- src/gui/SettingsWidget.cpp | 2 ++ src/gui/SettingsWidgetGeneral.ui | 7 +++++ 6 files changed, 48 insertions(+), 14 deletions(-) diff --git a/src/core/Config.cpp b/src/core/Config.cpp index fafb3cfd4..3f49bafef 100644 --- a/src/core/Config.cpp +++ b/src/core/Config.cpp @@ -114,6 +114,7 @@ void Config::init(const QString& fileName) m_defaults.insert("AutoSaveAfterEveryChange", false); m_defaults.insert("AutoReloadOnChange", true); m_defaults.insert("AutoSaveOnExit", false); + m_defaults.insert("BackupBeforeSave", false); m_defaults.insert("SearchLimitGroup", false); m_defaults.insert("MinimizeOnCopy", false); m_defaults.insert("UseGroupIconOnEntryCreation", false); diff --git a/src/core/Database.cpp b/src/core/Database.cpp index 75b91a5c5..c65c566f9 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -19,7 +19,7 @@ #include "Database.h" #include <QFile> -#include <QSaveFile> +#include <QTemporaryFile> #include <QTextStream> #include <QTimer> #include <QXmlStreamReader> @@ -470,30 +470,52 @@ Database* Database::unlockFromStdin(QString databaseFilename, QString keyFilenam return Database::openDatabaseFile(databaseFilename, compositeKey); } -QString Database::saveToFile(QString filePath) +/** + * Save the database to a file. + * + * This function uses QTemporaryFile instead of QSaveFile due to a bug + * in Qt (https://bugreports.qt.io/browse/QTBUG-57299) that may prevent + * the QSaveFile from renaming itself when using DropBox, Drive, or OneDrive. + * + * The risk in using QTemporaryFile is that the rename function is not atomic + * and may result in loss of data if there is a crash or power loss at the + * wrong moment. + * + * @param filePath Absolute path of the file to save + * @param keepOld Rename the original database file instead of deleting + * @return error string, if any + */ +QString Database::saveToFile(QString filePath, bool keepOld) { KeePass2Writer writer; - QSaveFile saveFile(filePath); - if (saveFile.open(QIODevice::WriteOnly)) { - + QTemporaryFile saveFile; + if (saveFile.open()) { // write the database to the file setEmitModified(false); writer.writeDatabase(&saveFile, this); setEmitModified(true); if (writer.hasError()) { + // the writer failed return writer.errorString(); } - if (saveFile.commit()) { - // successfully saved database file - return QString(); - } else { - return saveFile.errorString(); + saveFile.close(); // flush to disk + + if (keepOld) { + QFile::remove(filePath + ".old"); + QFile::rename(filePath, filePath + ".old"); + } + + QFile::remove(filePath); + if (saveFile.rename(filePath)) { + // successfully saved database file + saveFile.setAutoRemove(false); + return {}; } - } else { - return saveFile.errorString(); } + + return saveFile.errorString(); } QSharedPointer<Kdf> Database::kdf() const diff --git a/src/core/Database.h b/src/core/Database.h index 3bf43f62d..31d190877 100644 --- a/src/core/Database.h +++ b/src/core/Database.h @@ -111,7 +111,7 @@ public: void emptyRecycleBin(); void setEmitModified(bool value); void merge(const Database* other); - QString saveToFile(QString filePath); + QString saveToFile(QString filePath, bool keepOld = false); /** * Returns a unique id that is only valid as long as the Database exists. diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp index c00a67d07..06ff84ed3 100644 --- a/src/gui/DatabaseTabWidget.cpp +++ b/src/gui/DatabaseTabWidget.cpp @@ -28,6 +28,7 @@ #include "core/Database.h" #include "core/Group.h" #include "core/Metadata.h" +#include "core/AsyncTask.h" #include "format/CsvExporter.h" #include "gui/Clipboard.h" #include "gui/DatabaseWidget.h" @@ -322,7 +323,8 @@ bool DatabaseTabWidget::saveDatabase(Database* db, QString filePath) } dbStruct.dbWidget->blockAutoReload(true); - QString errorMessage = db->saveToFile(filePath); + // TODO: Make this async, but lock out the database widget to prevent re-entrance + QString errorMessage = db->saveToFile(filePath, config()->get("BackupBeforeSave").toBool()); dbStruct.dbWidget->blockAutoReload(false); if (errorMessage.isEmpty()) { diff --git a/src/gui/SettingsWidget.cpp b/src/gui/SettingsWidget.cpp index 7d3f65f81..12c970882 100644 --- a/src/gui/SettingsWidget.cpp +++ b/src/gui/SettingsWidget.cpp @@ -117,6 +117,7 @@ void SettingsWidget::loadSettings() config()->get("OpenPreviousDatabasesOnStartup").toBool()); m_generalUi->autoSaveAfterEveryChangeCheckBox->setChecked(config()->get("AutoSaveAfterEveryChange").toBool()); m_generalUi->autoSaveOnExitCheckBox->setChecked(config()->get("AutoSaveOnExit").toBool()); + m_generalUi->backupBeforeSaveCheckBox->setChecked(config()->get("BackupBeforeSave").toBool()); m_generalUi->autoReloadOnChangeCheckBox->setChecked(config()->get("AutoReloadOnChange").toBool()); m_generalUi->minimizeOnCopyCheckBox->setChecked(config()->get("MinimizeOnCopy").toBool()); m_generalUi->useGroupIconOnEntryCreationCheckBox->setChecked(config()->get("UseGroupIconOnEntryCreation").toBool()); @@ -193,6 +194,7 @@ void SettingsWidget::saveSettings() config()->set("AutoSaveAfterEveryChange", m_generalUi->autoSaveAfterEveryChangeCheckBox->isChecked()); config()->set("AutoSaveOnExit", m_generalUi->autoSaveOnExitCheckBox->isChecked()); + config()->set("BackupBeforeSave", m_generalUi->backupBeforeSaveCheckBox->isChecked()); config()->set("AutoReloadOnChange", m_generalUi->autoReloadOnChangeCheckBox->isChecked()); config()->set("MinimizeOnCopy", m_generalUi->minimizeOnCopyCheckBox->isChecked()); config()->set("UseGroupIconOnEntryCreation", diff --git a/src/gui/SettingsWidgetGeneral.ui b/src/gui/SettingsWidgetGeneral.ui index 87af235d4..a80c8c2f9 100644 --- a/src/gui/SettingsWidgetGeneral.ui +++ b/src/gui/SettingsWidgetGeneral.ui @@ -84,6 +84,13 @@ </property> </widget> </item> + <item> + <widget class="QCheckBox" name="backupBeforeSaveCheckBox"> + <property name="text"> + <string>Backup database file before saving</string> + </property> + </widget> + </item> <item> <widget class="QCheckBox" name="autoReloadOnChangeCheckBox"> <property name="text"> From 3db9a86a4c89151dd0eb0f8929e0a0a8b9ff6af8 Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Wed, 17 Jan 2018 20:13:13 -0500 Subject: [PATCH 310/402] After 3 failed saves, offer to disable safe saves * User is prompted to disable safe saves after three failed attempts * Completely retooled basic settings to group settings logically * Added setting for "atomic saves" --- src/core/Config.cpp | 1 + src/core/Database.cpp | 107 ++++-- src/core/Database.h | 5 +- src/gui/DatabaseTabWidget.cpp | 21 +- src/gui/DatabaseTabWidget.h | 1 + src/gui/SettingsWidget.cpp | 2 + src/gui/SettingsWidgetGeneral.ui | 538 ++++++++++++++++--------------- 7 files changed, 384 insertions(+), 291 deletions(-) diff --git a/src/core/Config.cpp b/src/core/Config.cpp index 3f49bafef..328dfaed8 100644 --- a/src/core/Config.cpp +++ b/src/core/Config.cpp @@ -115,6 +115,7 @@ void Config::init(const QString& fileName) m_defaults.insert("AutoReloadOnChange", true); m_defaults.insert("AutoSaveOnExit", false); m_defaults.insert("BackupBeforeSave", false); + m_defaults.insert("UseAtomicSaves", true); m_defaults.insert("SearchLimitGroup", false); m_defaults.insert("MinimizeOnCopy", false); m_defaults.insert("UseGroupIconOnEntryCreation", false); diff --git a/src/core/Database.cpp b/src/core/Database.cpp index c65c566f9..9a1fe0b3d 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -19,6 +19,7 @@ #include "Database.h" #include <QFile> +#include <QSaveFile> #include <QTemporaryFile> #include <QTextStream> #include <QTimer> @@ -482,40 +483,92 @@ Database* Database::unlockFromStdin(QString databaseFilename, QString keyFilenam * wrong moment. * * @param filePath Absolute path of the file to save - * @param keepOld Rename the original database file instead of deleting + * @param atomic Use atomic file transactions + * @param backup Backup the existing database file, if exists * @return error string, if any */ -QString Database::saveToFile(QString filePath, bool keepOld) +QString Database::saveToFile(QString filePath, bool atomic, bool backup) +{ + QString error; + if (atomic) { + QSaveFile saveFile(filePath); + if (saveFile.open(QIODevice::WriteOnly)) { + // write the database to the file + error = writeDatabase(&saveFile); + if (!error.isEmpty()) { + return error; + } + + if (backup) { + backupDatabase(filePath); + } + + if (saveFile.commit()) { + // successfully saved database file + return {}; + } + } + error = saveFile.errorString(); + } else { + QTemporaryFile tempFile; + if (tempFile.open()) { + // write the database to the file + error = writeDatabase(&tempFile); + if (!error.isEmpty()) { + return error; + } + + tempFile.close(); // flush to disk + + if (backup) { + backupDatabase(filePath); + } + + // Delete the original db and move the temp file in place + QFile::remove(filePath); + if (tempFile.rename(filePath)) { + // successfully saved database file + tempFile.setAutoRemove(false); + return {}; + } + } + error = tempFile.errorString(); + } + // Saving failed + return error; +} + +QString Database::writeDatabase(QIODevice* device) { KeePass2Writer writer; - QTemporaryFile saveFile; - if (saveFile.open()) { - // write the database to the file - setEmitModified(false); - writer.writeDatabase(&saveFile, this); - setEmitModified(true); + setEmitModified(false); + writer.writeDatabase(device, this); + setEmitModified(true); - if (writer.hasError()) { - // the writer failed - return writer.errorString(); - } - - saveFile.close(); // flush to disk - - if (keepOld) { - QFile::remove(filePath + ".old"); - QFile::rename(filePath, filePath + ".old"); - } - - QFile::remove(filePath); - if (saveFile.rename(filePath)) { - // successfully saved database file - saveFile.setAutoRemove(false); - return {}; - } + if (writer.hasError()) { + // the writer failed + return writer.errorString(); } + return {}; +} - return saveFile.errorString(); +/** + * Remove the old backup and replace it with a new one + * backups are named <filename>.old.kdbx4 + * + * @param filePath Path to the file to backup + * @return + */ +bool Database::backupDatabase(QString filePath) +{ + QString backupFilePath = filePath; + backupFilePath.replace(".kdbx", ".old.kdbx", Qt::CaseInsensitive); + if (!backupFilePath.endsWith(".old.kdbx")) { + // Fallback in case of poorly named file + backupFilePath = filePath + ".old"; + } + QFile::remove(backupFilePath); + return QFile::copy(filePath, backupFilePath); } QSharedPointer<Kdf> Database::kdf() const diff --git a/src/core/Database.h b/src/core/Database.h index 31d190877..384ca814e 100644 --- a/src/core/Database.h +++ b/src/core/Database.h @@ -32,6 +32,7 @@ enum class EntryReferenceType; class Group; class Metadata; class QTimer; +class QIODevice; struct DeletedObject { @@ -111,7 +112,7 @@ public: void emptyRecycleBin(); void setEmitModified(bool value); void merge(const Database* other); - QString saveToFile(QString filePath, bool keepOld = false); + QString saveToFile(QString filePath, bool atomic = true, bool backup = false); /** * Returns a unique id that is only valid as long as the Database exists. @@ -144,6 +145,8 @@ private: Group* findGroupRecursive(const Uuid& uuid, Group* group); void createRecycleBin(); + QString writeDatabase(QIODevice* device); + bool backupDatabase(QString filePath); Metadata* const m_metadata; Group* m_rootGroup; diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp index 06ff84ed3..1765a9cdf 100644 --- a/src/gui/DatabaseTabWidget.cpp +++ b/src/gui/DatabaseTabWidget.cpp @@ -44,6 +44,7 @@ DatabaseManagerStruct::DatabaseManagerStruct() : dbWidget(nullptr) , modified(false) , readOnly(false) + , saveAttempts(0) { } @@ -324,12 +325,14 @@ bool DatabaseTabWidget::saveDatabase(Database* db, QString filePath) dbStruct.dbWidget->blockAutoReload(true); // TODO: Make this async, but lock out the database widget to prevent re-entrance - QString errorMessage = db->saveToFile(filePath, config()->get("BackupBeforeSave").toBool()); + bool useAtomicSaves = config()->get("UseAtomicSaves").toBool(); + QString errorMessage = db->saveToFile(filePath, useAtomicSaves, config()->get("BackupBeforeSave").toBool()); dbStruct.dbWidget->blockAutoReload(false); if (errorMessage.isEmpty()) { // successfully saved database file dbStruct.modified = false; + dbStruct.saveAttempts = 0; dbStruct.fileInfo = QFileInfo(filePath); dbStruct.dbWidget->databaseSaved(); updateTabName(db); @@ -338,6 +341,22 @@ bool DatabaseTabWidget::saveDatabase(Database* db, QString filePath) } else { dbStruct.modified = true; updateTabName(db); + + if (++dbStruct.saveAttempts > 2 && useAtomicSaves) { + // Saving failed 3 times, issue a warning and attempt to resolve + auto choice = MessageBox::question(this, tr("Disable safe saves?"), + tr("KeePassXC has failed to save the database multiple times. " + "This is likely caused by file sync services holding a lock on " + "the save file.\nDisable safe saves and try again?"), + QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); + if (choice == QMessageBox::Yes) { + config()->set("UseAtomicSaves", false); + return saveDatabase(db, filePath); + } + // Reset save attempts without changing anything + dbStruct.saveAttempts = 0; + } + emit messageTab(tr("Writing the database failed.").append("\n").append(errorMessage), MessageWidget::Error); return false; diff --git a/src/gui/DatabaseTabWidget.h b/src/gui/DatabaseTabWidget.h index 875c3c904..b216750ea 100644 --- a/src/gui/DatabaseTabWidget.h +++ b/src/gui/DatabaseTabWidget.h @@ -40,6 +40,7 @@ struct DatabaseManagerStruct QFileInfo fileInfo; bool modified; bool readOnly; + int saveAttempts; }; Q_DECLARE_TYPEINFO(DatabaseManagerStruct, Q_MOVABLE_TYPE); diff --git a/src/gui/SettingsWidget.cpp b/src/gui/SettingsWidget.cpp index 12c970882..919edf9fd 100644 --- a/src/gui/SettingsWidget.cpp +++ b/src/gui/SettingsWidget.cpp @@ -118,6 +118,7 @@ void SettingsWidget::loadSettings() m_generalUi->autoSaveAfterEveryChangeCheckBox->setChecked(config()->get("AutoSaveAfterEveryChange").toBool()); m_generalUi->autoSaveOnExitCheckBox->setChecked(config()->get("AutoSaveOnExit").toBool()); m_generalUi->backupBeforeSaveCheckBox->setChecked(config()->get("BackupBeforeSave").toBool()); + m_generalUi->useAtomicSavesCheckBox->setChecked(config()->get("UseAtomicSaves").toBool()); m_generalUi->autoReloadOnChangeCheckBox->setChecked(config()->get("AutoReloadOnChange").toBool()); m_generalUi->minimizeOnCopyCheckBox->setChecked(config()->get("MinimizeOnCopy").toBool()); m_generalUi->useGroupIconOnEntryCreationCheckBox->setChecked(config()->get("UseGroupIconOnEntryCreation").toBool()); @@ -195,6 +196,7 @@ void SettingsWidget::saveSettings() m_generalUi->autoSaveAfterEveryChangeCheckBox->isChecked()); config()->set("AutoSaveOnExit", m_generalUi->autoSaveOnExitCheckBox->isChecked()); config()->set("BackupBeforeSave", m_generalUi->backupBeforeSaveCheckBox->isChecked()); + config()->set("UseAtomicSaves", m_generalUi->useAtomicSavesCheckBox->isChecked()); config()->set("AutoReloadOnChange", m_generalUi->autoReloadOnChangeCheckBox->isChecked()); config()->set("MinimizeOnCopy", m_generalUi->minimizeOnCopyCheckBox->isChecked()); config()->set("UseGroupIconOnEntryCreation", diff --git a/src/gui/SettingsWidgetGeneral.ui b/src/gui/SettingsWidgetGeneral.ui index a80c8c2f9..f8414f07c 100644 --- a/src/gui/SettingsWidgetGeneral.ui +++ b/src/gui/SettingsWidgetGeneral.ui @@ -34,131 +34,134 @@ </attribute> <layout class="QVBoxLayout" name="verticalLayout"> <item> - <widget class="QCheckBox" name="singleInstanceCheckBox"> - <property name="text"> - <string>Start only a single instance of KeePassXC</string> + <widget class="QGroupBox" name="startupGroup"> + <property name="title"> + <string>Startup</string> </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="rememberLastDatabasesCheckBox"> - <property name="text"> - <string>Remember last databases</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="rememberLastKeyFilesCheckBox"> - <property name="text"> - <string>Remember last key files and security dongles</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="openPreviousDatabasesOnStartupCheckBox"> - <property name="text"> - <string>Load previous databases on startup</string> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="autoSaveOnExitCheckBox"> - <property name="text"> - <string>Automatically save on exit</string> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="autoSaveAfterEveryChangeCheckBox"> - <property name="text"> - <string>Automatically save after every change</string> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="backupBeforeSaveCheckBox"> - <property name="text"> - <string>Backup database file before saving</string> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="autoReloadOnChangeCheckBox"> - <property name="text"> - <string>Automatically reload the database when modified externally</string> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="minimizeOnCopyCheckBox"> - <property name="text"> - <string>Minimize when copying to clipboard</string> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="systrayMinimizeOnStartup"> - <property name="text"> - <string>Minimize window at application startup</string> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="useGroupIconOnEntryCreationCheckBox"> - <property name="text"> - <string>Use group icon on entry creation</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="ignoreGroupExpansionCheckBox"> - <property name="text"> - <string>Don't mark database as modified for non-data changes (e.g., expanding groups)</string> - </property> - </widget> - </item> - <item> - <widget class="QWidget" name="systraySettings" native="true"> - <layout class="QVBoxLayout" name="systrayLayout"> - <property name="leftMargin"> - <number>0</number> - </property> - <property name="topMargin"> - <number>0</number> - </property> - <property name="rightMargin"> - <number>0</number> - </property> - <property name="bottomMargin"> - <number>0</number> - </property> + <layout class="QVBoxLayout" name="verticalLayout_4"> <item> - <spacer name="verticalSpacer"> - <property name="orientation"> - <enum>Qt::Vertical</enum> + <widget class="QCheckBox" name="singleInstanceCheckBox"> + <property name="text"> + <string>Start only a single instance of KeePassXC</string> </property> - <property name="sizeType"> - <enum>QSizePolicy::Fixed</enum> + <property name="checked"> + <bool>true</bool> </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>30</height> - </size> + </widget> + </item> + <item> + <widget class="QCheckBox" name="rememberLastDatabasesCheckBox"> + <property name="text"> + <string>Remember last databases</string> </property> - </spacer> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="rememberLastKeyFilesCheckBox"> + <property name="text"> + <string>Remember last key files and security dongles</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="openPreviousDatabasesOnStartupCheckBox"> + <property name="text"> + <string>Load previous databases on startup</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="systrayMinimizeOnStartup"> + <property name="text"> + <string>Minimize window at application startup</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="saveGroup"> + <property name="title"> + <string>File Management</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_5"> + <item> + <widget class="QCheckBox" name="useAtomicSavesCheckBox"> + <property name="text"> + <string>Safely save database files (may be incompatible with DropBox, etc)</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="backupBeforeSaveCheckBox"> + <property name="text"> + <string>Backup database file before saving</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="autoSaveAfterEveryChangeCheckBox"> + <property name="text"> + <string>Automatically save after every change</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="autoSaveOnExitCheckBox"> + <property name="text"> + <string>Automatically save on exit</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="ignoreGroupExpansionCheckBox"> + <property name="text"> + <string>Don't mark database as modified for non-data changes (e.g., expanding groups)</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="autoReloadOnChangeCheckBox"> + <property name="text"> + <string>Automatically reload the database when modified externally</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="entryGroup"> + <property name="title"> + <string>Entry Management</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_6"> + <item> + <widget class="QCheckBox" name="useGroupIconOnEntryCreationCheckBox"> + <property name="text"> + <string>Use group icon on entry creation</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="minimizeOnCopyCheckBox"> + <property name="text"> + <string>Minimize when copying to clipboard</string> + </property> + </widget> </item> <item> <widget class="QCheckBox" name="detailsHideCheckBox"> @@ -167,6 +170,15 @@ </property> </widget> </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="generalGroup"> + <property name="title"> + <string>General</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_7"> <item> <widget class="QCheckBox" name="systrayShowCheckBox"> <property name="text"> @@ -175,114 +187,162 @@ </widget> </item> <item> - <layout class="QHBoxLayout" name="horizontalLayout_2"> + <widget class="QWidget" name="systraySettings" native="true"> + <layout class="QVBoxLayout" name="systrayLayout"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <property name="spacing"> + <number>0</number> + </property> + <property name="sizeConstraint"> + <enum>QLayout::SetMaximumSize</enum> + </property> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Fixed</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QCheckBox" name="systrayMinimizeToTrayCheckBox"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Hide window to system tray when minimized</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <property name="spacing"> + <number>0</number> + </property> + <property name="sizeConstraint"> + <enum>QLayout::SetMaximumSize</enum> + </property> + <item> + <spacer name="horizontalSpacer_2"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Fixed</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QCheckBox" name="systrayMinimizeOnCloseCheckBox"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Hide window to system tray instead of app exit</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_4"> + <property name="spacing"> + <number>0</number> + </property> + <property name="sizeConstraint"> + <enum>QLayout::SetMaximumSize</enum> + </property> + <item> + <spacer name="horizontalSpacer_3"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Fixed</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QCheckBox" name="systrayDarkIconCheckBox"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Dark system tray icon</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="languageLabelLayout_2"> <property name="spacing"> - <number>0</number> + <number>15</number> </property> - <property name="sizeConstraint"> - <enum>QLayout::SetMaximumSize</enum> - </property> - <item> - <spacer name="horizontalSpacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeType"> - <enum>QSizePolicy::Fixed</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QCheckBox" name="systrayMinimizeToTrayCheckBox"> - <property name="enabled"> - <bool>false</bool> - </property> + <item alignment="Qt::AlignRight"> + <widget class="QLabel" name="languageLabel_2"> <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text"> - <string>Hide window to system tray when minimized</string> + <string>Language</string> </property> </widget> </item> - </layout> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_3"> - <property name="spacing"> - <number>0</number> - </property> - <property name="sizeConstraint"> - <enum>QLayout::SetMaximumSize</enum> - </property> <item> - <spacer name="horizontalSpacer_2"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeType"> - <enum>QSizePolicy::Fixed</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QCheckBox" name="systrayMinimizeOnCloseCheckBox"> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="text"> - <string>Hide window to system tray instead of app exit</string> - </property> - </widget> - </item> - </layout> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_4"> - <property name="spacing"> - <number>0</number> - </property> - <property name="sizeConstraint"> - <enum>QLayout::SetMaximumSize</enum> - </property> - <item> - <spacer name="horizontalSpacer_3"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeType"> - <enum>QSizePolicy::Fixed</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QCheckBox" name="systrayDarkIconCheckBox"> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="text"> - <string>Dark system tray icon</string> + <widget class="QComboBox" name="languageComboBox"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> </property> </widget> </item> @@ -291,52 +351,6 @@ </layout> </widget> </item> - <item> - <spacer name="trayIconSpacer_2"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeType"> - <enum>QSizePolicy::Fixed</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>30</height> - </size> - </property> - </spacer> - </item> - <item> - <layout class="QHBoxLayout" name="languageLabelLayout_2"> - <property name="spacing"> - <number>15</number> - </property> - <item alignment="Qt::AlignRight"> - <widget class="QLabel" name="languageLabel_2"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Language</string> - </property> - </widget> - </item> - <item> - <widget class="QComboBox" name="languageComboBox"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - </widget> - </item> - </layout> - </item> <item> <spacer name="verticalSpacer_2"> <property name="orientation"> From 6a4b275d40e98a5b4b2dbd4e586c9531a2f6a5fa Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Sun, 28 Jan 2018 10:14:36 -0500 Subject: [PATCH 311/402] Minor changes to address comments --- src/core/Config.cpp | 2 +- src/core/Database.cpp | 11 ++++------- src/gui/DatabaseTabWidget.cpp | 2 +- src/gui/SettingsWidgetGeneral.ui | 2 +- 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/core/Config.cpp b/src/core/Config.cpp index 328dfaed8..f42bb6044 100644 --- a/src/core/Config.cpp +++ b/src/core/Config.cpp @@ -111,7 +111,7 @@ void Config::init(const QString& fileName) m_defaults.insert("RememberLastDatabases", true); m_defaults.insert("RememberLastKeyFiles", true); m_defaults.insert("OpenPreviousDatabasesOnStartup", true); - m_defaults.insert("AutoSaveAfterEveryChange", false); + m_defaults.insert("AutoSaveAfterEveryChange", true); m_defaults.insert("AutoReloadOnChange", true); m_defaults.insert("AutoSaveOnExit", false); m_defaults.insert("BackupBeforeSave", false); diff --git a/src/core/Database.cpp b/src/core/Database.cpp index 9a1fe0b3d..70affdc58 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -476,7 +476,7 @@ Database* Database::unlockFromStdin(QString databaseFilename, QString keyFilenam * * This function uses QTemporaryFile instead of QSaveFile due to a bug * in Qt (https://bugreports.qt.io/browse/QTBUG-57299) that may prevent - * the QSaveFile from renaming itself when using DropBox, Drive, or OneDrive. + * the QSaveFile from renaming itself when using Dropbox, Drive, or OneDrive. * * The risk in using QTemporaryFile is that the rename function is not atomic * and may result in loss of data if there is a crash or power loss at the @@ -554,7 +554,7 @@ QString Database::writeDatabase(QIODevice* device) /** * Remove the old backup and replace it with a new one - * backups are named <filename>.old.kdbx4 + * backups are named <filename>.old.kdbx * * @param filePath Path to the file to backup * @return @@ -562,11 +562,8 @@ QString Database::writeDatabase(QIODevice* device) bool Database::backupDatabase(QString filePath) { QString backupFilePath = filePath; - backupFilePath.replace(".kdbx", ".old.kdbx", Qt::CaseInsensitive); - if (!backupFilePath.endsWith(".old.kdbx")) { - // Fallback in case of poorly named file - backupFilePath = filePath + ".old"; - } + auto re = QRegularExpression("(?:\\.kdbx)?$", QRegularExpression::CaseInsensitiveOption); + backupFilePath.replace(re, ".old.kdbx"); QFile::remove(backupFilePath); return QFile::copy(filePath, backupFilePath); } diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp index 1765a9cdf..47ff597b8 100644 --- a/src/gui/DatabaseTabWidget.cpp +++ b/src/gui/DatabaseTabWidget.cpp @@ -325,7 +325,7 @@ bool DatabaseTabWidget::saveDatabase(Database* db, QString filePath) dbStruct.dbWidget->blockAutoReload(true); // TODO: Make this async, but lock out the database widget to prevent re-entrance - bool useAtomicSaves = config()->get("UseAtomicSaves").toBool(); + bool useAtomicSaves = config()->get("UseAtomicSaves", true).toBool(); QString errorMessage = db->saveToFile(filePath, useAtomicSaves, config()->get("BackupBeforeSave").toBool()); dbStruct.dbWidget->blockAutoReload(false); diff --git a/src/gui/SettingsWidgetGeneral.ui b/src/gui/SettingsWidgetGeneral.ui index f8414f07c..5ed952f1f 100644 --- a/src/gui/SettingsWidgetGeneral.ui +++ b/src/gui/SettingsWidgetGeneral.ui @@ -95,7 +95,7 @@ <item> <widget class="QCheckBox" name="useAtomicSavesCheckBox"> <property name="text"> - <string>Safely save database files (may be incompatible with DropBox, etc)</string> + <string>Safely save database files (may be incompatible with Dropbox, etc)</string> </property> <property name="checked"> <bool>true</bool> From 8c8a61ddfe55b0dcdb13751b4ce144b6ae91a398 Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Sun, 28 Jan 2018 14:06:17 -0500 Subject: [PATCH 312/402] Disable auto save for GUI tests --- tests/gui/TestGui.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/gui/TestGui.cpp b/tests/gui/TestGui.cpp index 44b1d0664..cf7b969e1 100644 --- a/tests/gui/TestGui.cpp +++ b/tests/gui/TestGui.cpp @@ -67,6 +67,9 @@ void TestGui::initTestCase() { QVERIFY(Crypto::init()); Config::createTempFileInstance(); + // Disable autosave so we can test the modified file indicator + Config::instance()->set("AutoSaveAfterEveryChange", false); + m_mainWindow = new MainWindow(); m_tabWidget = m_mainWindow->findChild<DatabaseTabWidget*>("tabWidget"); m_mainWindow->show(); @@ -141,7 +144,6 @@ void TestGui::testCreateDatabase() DatabaseWidget* dbWidget = m_tabWidget->currentDatabaseWidget(); QWidget* databaseNewWidget = dbWidget->findChild<QWidget*>("changeMasterKeyWidget"); - QList<QWidget*> databaseNewWidgets = dbWidget->findChildren<QWidget*>("changeMasterKeyWidget"); PasswordEdit* editPassword = databaseNewWidget->findChild<PasswordEdit*>("enterPasswordEdit"); QVERIFY(editPassword->isVisible()); @@ -154,6 +156,7 @@ void TestGui::testCreateDatabase() QTest::keyClicks(editPasswordRepeat, "test"); QTest::keyClick(editPasswordRepeat, Qt::Key_Enter); + // Auto-save after every change is enabled by default, ensure the db saves right away QTRY_VERIFY(m_tabWidget->tabText(m_tabWidget->currentIndex()).contains("*")); m_db = m_tabWidget->currentDatabaseWidget()->database(); From 3e2443a8618a9c7a657f707b72f234c5aa038022 Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Mon, 27 Nov 2017 22:46:03 -0500 Subject: [PATCH 313/402] Add support for nightly builds to release tool --- CMakeLists.txt | 23 ++++++++++++++-- Dockerfile | 1 + cmake/FindArgon2.cmake | 2 +- release-tool | 44 ++++++++++++++++++++++++++----- share/translations/CMakeLists.txt | 2 +- src/CMakeLists.txt | 4 ++- src/config-keepassx.h.cmake | 2 ++ src/gui/AboutDialog.cpp | 3 +++ src/gui/DatabaseTabWidget.cpp | 3 ++- src/gui/MainWindow.cpp | 7 +++++ 10 files changed, 79 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3708667a7..4c5709404 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,6 +40,8 @@ option(WITH_ASAN "Enable address sanitizer checks (Linux / macOS only)" OFF) option(WITH_COVERAGE "Use to build with coverage tests (GCC only)." OFF) option(WITH_APP_BUNDLE "Enable Application Bundle for macOS" ON) +set(WITH_XC_ALL OFF CACHE BOOLEAN "Build in all available plugins") + option(WITH_XC_AUTOTYPE "Include Auto-Type." ON) option(WITH_XC_NETWORKING "Include networking code (e.g. for downlading website icons)." OFF) option(WITH_XC_BROWSER "Include browser integration with keepassxc-browser." OFF) @@ -53,14 +55,31 @@ if(WITH_XC_HTTP) set(WITH_XC_NETWORKING ON CACHE BOOL "Include networking code (e.g. for downlading website icons)." FORCE) endif() +if(WITH_XC_ALL) + # Enable all options + set(WITH_XC_AUTOTYPE ON) + set(WITH_XC_NETWORKING ON) + set(WITH_XC_BROWSER ON) + set(WITH_XC_HTTP ON) # Deprecated + set(WITH_XC_YUBIKEY ON) + set(WITH_XC_SSHAGENT ON) +endif() + # Process ui files automatically from source files set(CMAKE_AUTOUIC ON) set(KEEPASSXC_VERSION_MAJOR "2") -set(KEEPASSXC_VERSION_MINOR "2") -set(KEEPASSXC_VERSION_PATCH "4") +set(KEEPASSXC_VERSION_MINOR "3") +set(KEEPASSXC_VERSION_PATCH "0") set(KEEPASSXC_VERSION "${KEEPASSXC_VERSION_MAJOR}.${KEEPASSXC_VERSION_MINOR}.${KEEPASSXC_VERSION_PATCH}") +set(KEEPASSXC_RELEASE_BUILD OFF CACHE BOOLEAN "Remove stability warnings") +if(NOT KEEPASSXC_RELEASE_BUILD) + set(KEEPASSXC_VERSION "${KEEPASSXC_VERSION}-snapshot") +endif() + +message(STATUS "Setting up build for KeePassXC v${KEEPASSXC_VERSION}\n") + # Distribution info set(KEEPASSXC_DIST True) set(KEEPASSXC_DIST_TYPE "Other" CACHE STRING "KeePassXC Distribution type") diff --git a/Dockerfile b/Dockerfile index 69db2ac1f..6b3132772 100644 --- a/Dockerfile +++ b/Dockerfile @@ -38,6 +38,7 @@ RUN set -x \ && apt-get install -y \ cmake3 \ g++ \ + git \ libgcrypt20-18-dev \ libargon2-0-dev \ libsodium-dev \ diff --git a/cmake/FindArgon2.cmake b/cmake/FindArgon2.cmake index 5f196fc8d..c0fb53b41 100644 --- a/cmake/FindArgon2.cmake +++ b/cmake/FindArgon2.cmake @@ -18,7 +18,7 @@ if (MINGW) # find static library on Windows, and redefine used symbols to # avoid definition name conflicts with libsodium find_library(ARGON2_SYS_LIBRARIES libargon2.a) - message(STATUS "Patching libargon2...") + message(STATUS "Patching libargon2...\n") execute_process(COMMAND objcopy --redefine-sym argon2_hash=libargon2_argon2_hash --redefine-sym argon2_error_message=libargon2_argon2_error_message diff --git a/release-tool b/release-tool index 601e66474..10e25522c 100755 --- a/release-tool +++ b/release-tool @@ -37,9 +37,10 @@ DOCKER_CONTAINER_NAME="keepassxc-build-container" CMAKE_OPTIONS="" COMPILER="g++" MAKE_OPTIONS="-j8" -BUILD_PLUGINS="autotype http yubikey" +BUILD_PLUGINS="all" INSTALL_PREFIX="/usr/local" BUILD_SOURCE_TARBALL=true +BUILD_SNAPSHOT=false ORIG_BRANCH="" ORIG_CWD="$(pwd)" @@ -111,6 +112,7 @@ Options: -i, --install-prefix Install prefix (default: '${INSTALL_PREFIX}') -p, --plugins Space-separated list of plugins to build (default: ${BUILD_PLUGINS}) + --snapshot Don't checkout the release tag -n, --no-source-tarball Don't build source tarball -h, --help Show this help EOF @@ -310,6 +312,13 @@ checkOsslsigncodeCommandExists() { fi } +checkSigntoolCommandExists() { + command -v signtool > /dev/null + if [ 0 -ne $? ]; then + exitError "signtool command not found on the PATH! Add the Windows SDK binary folder to your PATH." + fi +} + checkCodesignCommandExists() { command -v codesign > /dev/null if [ 0 -ne $? ]; then @@ -556,6 +565,9 @@ build() { -n|--no-source-tarball) BUILD_SOURCE_TARBALL=false ;; + + --snapshot) + BUILD_SNAPSHOT=true ;; -h|--help) printUsage "build" @@ -574,8 +586,16 @@ build() { OUTPUT_DIR="$(realpath "$OUTPUT_DIR")" - logInfo "Checking out release tag '${TAG_NAME}'..." - git checkout "$TAG_NAME" + if $BUILD_SNAPSHOT; then + TAG_NAME="HEAD" + local branch=`git rev-parse --abbrev-ref HEAD` + logInfo "Using current branch ${branch} to build..." + RELEASE_NAME="${RELEASE_NAME}-snapshot" + else + logInfo "Checking out release tag '${TAG_NAME}'..." + git checkout "$TAG_NAME" + CMAKE_OPTIONS="${CMAKE_OPTIONS} -DKEEPASSXC_RELEASE_BUILD=ON" + fi logInfo "Creating output directory..." mkdir -p "$OUTPUT_DIR" @@ -866,10 +886,10 @@ appsign() { echo for f in "${sign_files[@]}"; do - if [[ ${f: -4} == '.exe' ]]; then + if [[ ${f: -4} == ".exe" ]]; then logInfo "Signing file '${f}' using osslsigncode..." # output a signed exe; we have to use a different name due to osslsigntool limitations - osslsigncode sign -pkcs12 "${signtool_key}" -pass "${password}" \ + osslsigncode sign -pkcs12 "${signtool_key}" -pass "${password}" -n "KeePassXC" \ -t "http://timestamp.comodoca.com/authenticode" -in "${f}" -out "${f}.signed" if [ 0 -ne $? ]; then @@ -879,8 +899,20 @@ appsign() { # overwrite the original exe with the signed exe mv -f "${f}.signed" "${f}" + elif [[ ${f: -4} == ".msi" ]]; then + # Make sure we can find the signtool + checkSigntoolCommandExists + + # osslsigncode does not succeed at signing MSI files at this time... + logInfo "Signing file '${f}' using Microsoft signtool..." + signtool sign -f "${signtool_key}" -p "${password}" -d "KeePassXC" \ + -t "http://timestamp.comodoca.com/authenticode" "${f}" + + if [ 0 -ne $? ]; then + exitError "Signing failed!" + fi else - logInfo "Skipping non-EXE file '${f}'..." + logInfo "Skipping non-executable file '${f}'..." fi done diff --git a/share/translations/CMakeLists.txt b/share/translations/CMakeLists.txt index c0b1a49b8..78ff0bcc4 100644 --- a/share/translations/CMakeLists.txt +++ b/share/translations/CMakeLists.txt @@ -18,7 +18,7 @@ file(GLOB TRANSLATION_FILES *.ts) get_filename_component(TRANSLATION_EN_ABS keepassx_en.ts ABSOLUTE) list(REMOVE_ITEM TRANSLATION_FILES keepassx_en.ts) list(REMOVE_ITEM TRANSLATION_FILES ${TRANSLATION_EN_ABS}) -message(STATUS "${TRANSLATION_FILES}") +message(STATUS "Including translations...\n") qt5_add_translation(QM_FILES ${TRANSLATION_FILES}) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index acc01e2bc..f00e93531 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -345,11 +345,13 @@ if(MINGW) "${CMAKE_SOURCE_DIR}/LICENSE.GPL-2" "${CMAKE_CURRENT_BINARY_DIR}/INSTALLER_LICENSE.txt") + string(REGEX REPLACE "-snapshot$" "" KEEPASSXC_VERSION_CLEAN ${KEEPASSXC_VERSION}) + set(CPACK_GENERATOR "ZIP;NSIS") set(CPACK_STRIP_FILES ON) set(CPACK_PACKAGE_FILE_NAME "${PROGNAME}-${KEEPASSXC_VERSION}-${OUTPUT_FILE_POSTFIX}") set(CPACK_PACKAGE_INSTALL_DIRECTORY ${PROGNAME}) - set(CPACK_PACKAGE_VERSION ${KEEPASSXC_VERSION}) + set(CPACK_PACKAGE_VERSION ${KEEPASSXC_VERSION_CLEAN}) set(CPACK_PACKAGE_VENDOR "${PROGNAME} Team") string(REGEX REPLACE "/" "\\\\\\\\" CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/share/windows/installer-header.bmp") set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_BINARY_DIR}/INSTALLER_LICENSE.txt") diff --git a/src/config-keepassx.h.cmake b/src/config-keepassx.h.cmake index e98830b09..805438b1a 100644 --- a/src/config-keepassx.h.cmake +++ b/src/config-keepassx.h.cmake @@ -24,6 +24,8 @@ #cmakedefine KEEPASSXC_DIST_SNAP #cmakedefine KEEPASSXC_DIST_APPIMAGE +#cmakedefine KEEPASSXC_RELEASE_BUILD + #cmakedefine HAVE_PR_SET_DUMPABLE 1 #cmakedefine HAVE_RLIMIT_CORE 1 #cmakedefine HAVE_PT_DENY_ATTACH 1 diff --git a/src/gui/AboutDialog.cpp b/src/gui/AboutDialog.cpp index 9ce3eda5d..4481dd82d 100644 --- a/src/gui/AboutDialog.cpp +++ b/src/gui/AboutDialog.cpp @@ -54,6 +54,9 @@ AboutDialog::AboutDialog(QWidget* parent) QString debugInfo = "KeePassXC - "; debugInfo.append(tr("Version %1\n").arg(KEEPASSX_VERSION)); +#ifndef KEEPASSXC_RELEASE_BUILD + debugInfo.append(tr("Build Type: Snapshot\n")); +#endif if (!commitHash.isEmpty()) { debugInfo.append(tr("Revision: %1").arg(commitHash.left(7)).append("\n")); } diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp index 47ff597b8..f9b7fbd72 100644 --- a/src/gui/DatabaseTabWidget.cpp +++ b/src/gui/DatabaseTabWidget.cpp @@ -173,7 +173,8 @@ void DatabaseTabWidget::openDatabase(const QString& fileName, const QString& pw, } else { dbStruct.dbWidget->switchToOpenDatabase(dbStruct.fileInfo.absoluteFilePath()); } - emit messageDismissGlobal(); + + emit messageDismissTab(); } void DatabaseTabWidget::importCsv() diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index b25f9d554..302a81eb5 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -424,6 +424,13 @@ MainWindow::MainWindow() connect(m_ui->tabWidget, SIGNAL(messageDismissGlobal()), this, SLOT(showKeePassHTTPDeprecationNotice())); } #endif + +#ifndef KEEPASSXC_RELEASE_BUILD + m_ui->globalMessageWidget->showMessage(tr("WARNING: You are using an unstable build of KeePassXC!\n" + "There is a high risk of corruption, maintain a backup of your databases.\n" + "This version is not meant for production use."), + MessageWidget::Warning, -1); +#endif } MainWindow::~MainWindow() From 5b72407746fbff4d569c417d6fe312b980b94a3e Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Sat, 27 Jan 2018 23:10:03 -0500 Subject: [PATCH 314/402] Deconflict snapshot warning with http deprecation warning --- src/gui/MainWindow.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 302a81eb5..def6e6575 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -420,8 +420,8 @@ MainWindow::MainWindow() } #ifdef WITH_XC_HTTP if (config()->get("Http/Enabled", false).toBool() && config()->get("Http/DeprecationNoticeShown", 0).toInt() < 3) { - // show message after tab widget dismissed all messages - connect(m_ui->tabWidget, SIGNAL(messageDismissGlobal()), this, SLOT(showKeePassHTTPDeprecationNotice())); + // show message after global widget dismissed all messages + connect(m_ui->globalMessageWidget, SIGNAL(hideAnimationFinished()), this, SLOT(showKeePassHTTPDeprecationNotice())); } #endif @@ -430,6 +430,9 @@ MainWindow::MainWindow() "There is a high risk of corruption, maintain a backup of your databases.\n" "This version is not meant for production use."), MessageWidget::Warning, -1); +#else + // Show the HTTP deprecation message if enabled above + emit m_ui->globalMessageWidget->hideAnimationFinished(); #endif } @@ -448,7 +451,7 @@ void MainWindow::showKeePassHTTPDeprecationNotice() MessageWidget::Warning, true, -1); config()->set("Http/DeprecationNoticeShown", warningNum + 1); - disconnect(m_ui->tabWidget, SIGNAL(messageDismissGlobal()), this, SLOT(showKeePassHTTPDeprecationNotice())); + disconnect(m_ui->globalMessageWidget, SIGNAL(hideAnimationFinished()), this, SLOT(showKeePassHTTPDeprecationNotice())); } void MainWindow::appExit() From d8649f7a6088a2234acbebf4cbc9edd8f8357a8a Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Mon, 29 Jan 2018 23:00:52 -0500 Subject: [PATCH 315/402] Check for tag to automatically determine release build --- CMakeLists.txt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4c5709404..e63c6d29a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -74,7 +74,13 @@ set(KEEPASSXC_VERSION_PATCH "0") set(KEEPASSXC_VERSION "${KEEPASSXC_VERSION_MAJOR}.${KEEPASSXC_VERSION_MINOR}.${KEEPASSXC_VERSION_PATCH}") set(KEEPASSXC_RELEASE_BUILD OFF CACHE BOOLEAN "Remove stability warnings") -if(NOT KEEPASSXC_RELEASE_BUILD) +# Check if on a tag, if so build as a release +execute_process(COMMAND git tag --points-at HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_TAG) +if(GIT_TAG) + set(KEEPASSXC_RELEASE_BUILD ON) +elseif(NOT KEEPASSXC_RELEASE_BUILD) set(KEEPASSXC_VERSION "${KEEPASSXC_VERSION}-snapshot") endif() From 053d9981039c5623d84d7e88083bef635035a92f Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Sun, 28 Jan 2018 22:26:12 -0500 Subject: [PATCH 316/402] Appimage docker container bump to resolve dependencies --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 6b3132772..91eb6f395 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,7 +16,7 @@ FROM ubuntu:14.04 -ENV REBUILD_COUNTER=2 +ENV REBUILD_COUNTER=4 ENV QT5_VERSION=59 ENV QT5_PPA_VERSION=${QT5_VERSION}2 From a326d72be99cf4e4cb7a561705e1d8052370a3d6 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Wed, 31 Jan 2018 00:24:51 +0100 Subject: [PATCH 317/402] Update list of contributors --- COPYING | 2 +- src/gui/AboutDialog.ui | 95 +++++++++++++++++++++++------------------- 2 files changed, 53 insertions(+), 44 deletions(-) diff --git a/COPYING b/COPYING index fe199fcd4..075188e6f 100644 --- a/COPYING +++ b/COPYING @@ -27,7 +27,7 @@ Copyright: 2010-2012, Felix Geyer <debfx@fobos.de> 2000-2008, Tom Sato <VEF00200@nifty.ne.jp> 2013, Laszlo Papp <lpapp@kde.org> 2013, David Faure <faure@kde.org> - 2016-2017, KeePassXC Team <team@keepassxc.org> + 2016-2018, KeePassXC Team <team@keepassxc.org> License: GPL-2 or GPL-3 Comment: The "KeePassXC Team" in every copyright notice is formed by the following people: diff --git a/src/gui/AboutDialog.ui b/src/gui/AboutDialog.ui index 3671934dc..43c3da3f9 100644 --- a/src/gui/AboutDialog.ui +++ b/src/gui/AboutDialog.ui @@ -147,13 +147,6 @@ </property> </spacer> </item> - <item> - <widget class="QLabel" name="label_7"> - <property name="text"> - <string>Project Maintainers:</string> - </property> - </widget> - </item> <item> <widget class="QLabel" name="label_4"> <property name="sizePolicy"> @@ -163,14 +156,15 @@ </sizepolicy> </property> <property name="text"> - <string notr="true"><ul> + <string notr="true"><p>Project Maintainers:</p> +<ul> <li>droidmonkey</li> <li>phoerious</li> <li>TheZ3ro</li> <li>louib</li> - <li>Weslly</li> - <li>debfx (KeePassX)</li> -</ul></string> + <li>weslly</li> +</ul> +<p>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</></string> </property> </widget> </item> @@ -204,8 +198,8 @@ <rect> <x>0</x> <y>0</y> - <width>591</width> - <height>760</height> + <width>423</width> + <height>816</height> </rect> </property> <layout class="QVBoxLayout" name="verticalLayout_5"> @@ -221,40 +215,55 @@ <cursorShape>IBeamCursor</cursorShape> </property> <property name="text"> - <string notr="true"><h2>Code:</h2> + <string notr="true"><h3>Notable Code Contributions:</h3> <ul> -<li>debfx (KeePassX) </li> -<li>BlueIce (KeePassX) </li> -<li>droidmonkey </li> -<li>phoerious </li> -<li>TheZ3ro </li> -<li>louib </li> -<li >weslly </li> -<li>keithbennett (KeePassHTTP) </li> -<li>Typz (KeePassHTTP) </li> -<li>denk-mal (KeePassHTTP) </li> -<li>kylemanna (YubiKey) </li> -<li>seatedscribe (CSV Importer) </li> -<li>pgalves (Inline Messages) </li> +<li>droidmonkey</li> +<li>phoerious</li> +<li>TheZ3ro</li> +<li>louib</li> +<li >weslly</li> +<li>varjolintu (KeePassXC-Browser)</li> +<li>hifi (SSH Agent)</li> +<li>frostasm</li> +<li>fonic (Entry Table View)</li> +<li>kylemanna (YubiKey)</li> +<li>keithbennett (KeePassHTTP)</li> +<li>Typz (KeePassHTTP)</li> +<li>denk-mal (KeePassHTTP)</li> +<li>angelsl (KDBX 4)</li> +<li>seatedscribe (CSV Import)</li> +<li>debfx (KeePassX)</li> +<li>BlueIce (KeePassX)</li> </ul> -<h2>Translations:</h2> +<h3>Translations:</h3> <ul> -<li><b>Chinese:</b> Biggulu, ligyxy, BestSteve </li> -<li><b>Czech:</b> pavelb, JosefVitu </li> -<li><b>Dutch:</b> Vistaus, KnooL, apie </li> -<li><b>Finnish:</b> MawKKe </li> -<li><b>French:</b> Scrat15, frgnca, gilbsgilbs, gtalbot, iannick, kyodev, logut </li> -<li><b>German:</b> Calyrx, DavidHamburg, antsas, codejunky, jensrutschmann, montilo, omnisome4, origin_de, pcrcoding, phoerious, rgloor, vlenzer </li> -<li><b>Greek:</b> nplatis </li> -<li><b>Italian:</b> TheZ3ro, FranzMari, Mte90, tosky </li> -<li><b>Kazakh:</b> sotrud_nik </li> -<li><b>Lithuanian:</b> Moo </li> -<li><b>Polish:</b> konradmb, mrerexx </li> -<li><b>Portuguese: </b>vitor895, weslly, American_Jesus, mihai.ile </li> -<li><b>Russian:</b> vsvyatski, KekcuHa, wkill95 </li> -<li><b>Spanish:</b> EdwardNavarro, antifaz, piegope, pquin, vsvyatski </li> -<li><b>Swedish:</b> henziger </li> +<li><b>Basque:</b> azken_tximinoa, Hey_neken</li> +<li><b>Catalan:</b> capitantrueno, dsoms, mcus, raulua, ZJaume</li> +<li><b>Chinese (China):</b> Biggulu, Brandon_c, hoilc, ligyxy, vc5, Small_Ku</li> +<li><b>Chinese (Taiwan):</b> BestSteve, MiauLightouch, Small_Ku, yan12125, ymhuang0808</li> +<li><b>Czech:</b> DanielMilde, JosefVitu, pavelb, tpavelek</li> +<li><b>Danish:</b> nlkl</li> +<li><b>Dutch:</b> apie, bartlibert, evanoosten, fvw, KnooL, srgvg, Vistaus, wanderingidea</li> +<li><b>Finnish:</b> artnay, Jarppi, MawKKe </li> +<li><b>French:</b> A1RO, aghilas.messara, bisaloo, frgnca, ggtr1138, gilbsgilbs, gtalbot, Gui13, iannick, jlutran, kyodev, logut, MartialBis, narzb, pBouillon, plunkets, Raphi111, Scrat15, tl_pierre, wilfriedroset</li> +<li><b>German:</b> antsas, BasicBaer, Calyrx, codejunky, DavidHamburg, eth0, for1real, jensrutschmann, joe776, kflesch, MarcEdinger, marcbone, mcliquid, mfernau77, montilo, nursoda, omnisome4, origin_de, pcrcoding, phoerious, rgloor, transi_222, vlenzer, waster</li> +<li><b>Greek:</b> magkopian, nplatis, tassos.b, xinomilo</li> +<li><b>Hungarian:</b> bubu, meskobalazs, urbalazs</li> +<li><b>Indonesian:</b> zk</li> +<li><b>Italian:</b> amaxis, bovirus, duncanmid, FranzMari, lucaim, Mte90, Peo, TheZ3ro, tosky, VosaxAlo</li> +<li><b>Japanese:</b> masoo, metalic_cat, p2635, Shinichirou_Yamada, vargas.peniel, vmemjp, yukinakato</li> +<li><b>Korean:</b> cancantun, peremen</li> +<li><b>Lithuanian:</b> Moo</li> +<li><b>Polish:</b> keypress, konradmb, mrerexx, psobczak</li> +<li><b>Portuguese (Brazil): </b> danielbibit, fabiom, flaviobn, vitor895, weslly</li> +<li><b>Portuguese (Portugal): </b> American_Jesus, hds, mihai.ile, VictorR2007, smarquespt</li> +<li><b>Russian:</b> _nomoretears_, agag11507, anm, denoos, KekcuHa, Mogost, NcNZllQnHVU, netforhack, NetWormKido, RKuchma, VictorR2007, vsvyatski, wkill95</li> +<li><b>Spanish:</b> antifaz, EdwardNavarro, eliluminado, gonrial, jojobrambs, LeoBeltran, piegope, pquin, puchrojo, vargas.peniel, vsvyatski, Zranz</li> +<li><b>Swedish:</b> Anders_Bergqvist, LIINdd, henziger, jpyllman, peron</li> +<li><b>Thai:</b> arthit</li> +<li><b>Turkish:</b> etc, N3pp</li> +<li><b>Ukrainian:</b> brisk022, netforhack, zoresvit</li> </ul></string> </property> <property name="textFormat"> From 17e3f1c21f2981ab350705cc30808ffc65cec39f Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Thu, 1 Feb 2018 17:58:15 +0100 Subject: [PATCH 318/402] Create history item when setting up a TOTP seed, resolves #1445 --- src/core/Entry.cpp | 2 ++ tests/TestTotp.cpp | 12 ++++++++++++ tests/TestTotp.h | 1 + 3 files changed, 15 insertions(+) diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index 2f4105fc6..d30adeeca 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -350,6 +350,7 @@ QString Entry::totp() const void Entry::setTotp(const QString& seed, quint8& step, quint8& digits) { + beginUpdate(); if (step == 0) { step = Totp::defaultStep; } @@ -376,6 +377,7 @@ void Entry::setTotp(const QString& seed, quint8& step, quint8& digits) } m_attributes->set("TOTP Settings", data); } + endUpdate(); } QString Entry::totpSeed() const diff --git a/tests/TestTotp.cpp b/tests/TestTotp.cpp index dd69a076d..02af663a1 100644 --- a/tests/TestTotp.cpp +++ b/tests/TestTotp.cpp @@ -164,3 +164,15 @@ void TestTotp::testSteamTotp() time = 1511200714; QCOMPARE(Totp::generateTotp(seed, time, Totp::ENCODER_STEAM, 30), QString("9P3VP")); } + +void TestTotp::testEntryHistory() +{ + Entry entry; + quint8 step = 16; + quint8 digits = 6; + QCOMPARE(entry.historyItems().size(), 0); + entry.setTotp("GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ", step, digits); + QCOMPARE(entry.historyItems().size(), 1); + entry.setTotp("foo", step, digits); + QCOMPARE(entry.historyItems().size(), 2); +} diff --git a/tests/TestTotp.h b/tests/TestTotp.h index 3bf2de93f..784eb8f22 100644 --- a/tests/TestTotp.h +++ b/tests/TestTotp.h @@ -33,6 +33,7 @@ private slots: void testTotpCode(); void testEncoderData(); void testSteamTotp(); + void testEntryHistory(); }; #endif // KEEPASSX_TESTTOTP_H From d9119877872101493dbf5ad44d14afcd10afcd26 Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Sat, 27 Jan 2018 08:11:59 -0500 Subject: [PATCH 319/402] Ensure yubikey libs are dynamic; bump to c99 --- CMakeLists.txt | 3 +-- cmake/FindYubiKey.cmake | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e63c6d29a..686db7362 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -197,14 +197,13 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux") set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-z,relro,-z,now") endif() +add_gcc_compiler_cflags("-std=c99") add_gcc_compiler_cxxflags("-std=c++11") if(APPLE) add_gcc_compiler_cxxflags("-stdlib=libc++") endif() -add_gcc_compiler_cflags("-ansi") - if(WITH_DEV_BUILD) add_definitions(-DQT_DEPRECATED_WARNINGS -DGCRYPT_NO_DEPRECATED) endif() diff --git a/cmake/FindYubiKey.cmake b/cmake/FindYubiKey.cmake index e5e0bb681..d2266b407 100644 --- a/cmake/FindYubiKey.cmake +++ b/cmake/FindYubiKey.cmake @@ -17,8 +17,8 @@ find_path(YUBIKEY_CORE_INCLUDE_DIR yubikey.h) find_path(YUBIKEY_PERS_INCLUDE_DIR ykcore.h PATH_SUFFIXES ykpers-1) set(YUBIKEY_INCLUDE_DIRS ${YUBIKEY_CORE_INCLUDE_DIR} ${YUBIKEY_PERS_INCLUDE_DIR}) -find_library(YUBIKEY_CORE_LIBRARY yubikey) -find_library(YUBIKEY_PERS_LIBRARY ykpers-1) +find_library(YUBIKEY_CORE_LIBRARY NAMES yubikey.dll libyubikey.so yubikey) +find_library(YUBIKEY_PERS_LIBRARY NAMES ykpers-1.dll libykpers-1.so ykpers-1) set(YUBIKEY_LIBRARIES ${YUBIKEY_CORE_LIBRARY} ${YUBIKEY_PERS_LIBRARY}) include(FindPackageHandleStandardArgs) From e987479d041a28d2f3ba24982af3c1d44d2ee006 Mon Sep 17 00:00:00 2001 From: Toni Spets <toni.spets@iki.fi> Date: Sat, 3 Feb 2018 08:17:38 +0200 Subject: [PATCH 320/402] SSH Agent: Always use freshly selected key --- src/gui/entry/EditEntryWidget.cpp | 10 +++++++++- src/gui/entry/EditEntryWidget.h | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index 707d2f6d2..eef1b5ed8 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -271,7 +271,7 @@ void EditEntryWidget::setupSSHAgent() m_sshAgentUi->publicKeyEdit->setFont(fixedFont); connect(m_sshAgentUi->attachmentRadioButton, SIGNAL(clicked(bool)), SLOT(updateSSHAgentKeyInfo())); - connect(m_sshAgentUi->attachmentComboBox, SIGNAL(currentIndexChanged(int)), SLOT(updateSSHAgentKeyInfo())); + connect(m_sshAgentUi->attachmentComboBox, SIGNAL(currentIndexChanged(int)), SLOT(updateSSHAgentAttachment())); connect(m_sshAgentUi->externalFileRadioButton, SIGNAL(clicked(bool)), SLOT(updateSSHAgentKeyInfo())); connect(m_sshAgentUi->externalFileEdit, SIGNAL(textChanged(QString)), SLOT(updateSSHAgentKeyInfo())); connect(m_sshAgentUi->browseButton, SIGNAL(clicked()), SLOT(browsePrivateKey())); @@ -323,6 +323,12 @@ void EditEntryWidget::updateSSHAgent() updateSSHAgentKeyInfo(); } +void EditEntryWidget::updateSSHAgentAttachment() +{ + m_sshAgentUi->attachmentRadioButton->setChecked(true); + updateSSHAgentKeyInfo(); +} + void EditEntryWidget::updateSSHAgentKeyInfo() { m_sshAgentUi->addToAgentButton->setEnabled(false); @@ -398,6 +404,8 @@ void EditEntryWidget::browsePrivateKey() QString fileName = QFileDialog::getOpenFileName(this, tr("Select private key"), ""); if (!fileName.isEmpty()) { m_sshAgentUi->externalFileEdit->setText(fileName); + m_sshAgentUi->externalFileRadioButton->setChecked(true); + updateSSHAgentKeyInfo(); } } diff --git a/src/gui/entry/EditEntryWidget.h b/src/gui/entry/EditEntryWidget.h index b23f7b658..bd9f5cd0f 100644 --- a/src/gui/entry/EditEntryWidget.h +++ b/src/gui/entry/EditEntryWidget.h @@ -101,6 +101,7 @@ private slots: void toggleHideNotes(bool visible); #ifdef WITH_XC_SSHAGENT void updateSSHAgent(); + void updateSSHAgentAttachment(); void updateSSHAgentKeyInfo(); void browsePrivateKey(); void addKeyToAgent(); From 527868a6b30153302fe1becb732fd5835328df4d Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sun, 4 Feb 2018 13:18:59 +0100 Subject: [PATCH 321/402] Guarantee that configuration values are committed to disk on exit --- src/core/Config.cpp | 16 ++++++++++-- src/core/Config.h | 9 ++++--- src/gui/DatabaseTabWidget.h | 28 ++++++++++----------- src/gui/DatabaseWidget.cpp | 24 +++++++++--------- src/gui/DatabaseWidgetStateSync.cpp | 38 +++++++++++++++++++---------- src/gui/DatabaseWidgetStateSync.h | 30 ++++++++++++----------- src/gui/entry/EntryView.cpp | 33 +++++++++++++------------ src/gui/entry/EntryView.h | 23 ++++++++--------- 8 files changed, 115 insertions(+), 86 deletions(-) diff --git a/src/core/Config.cpp b/src/core/Config.cpp index f42bb6044..c83c1e720 100644 --- a/src/core/Config.cpp +++ b/src/core/Config.cpp @@ -21,7 +21,6 @@ #include <QCoreApplication> #include <QDir> #include <QSettings> -#include <QStandardPaths> #include <QTemporaryFile> Config* Config::m_instance(nullptr); @@ -51,6 +50,18 @@ void Config::set(const QString& key, const QVariant& value) m_settings->setValue(key, value); } +/** + * Sync configuration with persistent storage. + * + * Usually, you don't need to call this method manually, but if you are writing + * configurations after an emitted \link QCoreApplication::aboutToQuit() signal, + * use it to guarantee your config values are persisted. + */ +void Config::sync() +{ + m_settings->sync(); +} + Config::Config(const QString& fileName, QObject* parent) : QObject(parent) { @@ -106,6 +117,7 @@ Config::~Config() void Config::init(const QString& fileName) { m_settings.reset(new QSettings(fileName, QSettings::IniFormat)); + connect(qApp, &QCoreApplication::aboutToQuit, this, &Config::sync); m_defaults.insert("SingleInstance", true); m_defaults.insert("RememberLastDatabases", true); @@ -162,7 +174,7 @@ void Config::createConfigFromFile(const QString& file) void Config::createTempFileInstance() { Q_ASSERT(!m_instance); - QTemporaryFile* tmpFile = new QTemporaryFile(); + auto* tmpFile = new QTemporaryFile(); bool openResult = tmpFile->open(); Q_ASSERT(openResult); Q_UNUSED(openResult); diff --git a/src/core/Config.h b/src/core/Config.h index 2ee3f4dce..eb7978622 100644 --- a/src/core/Config.h +++ b/src/core/Config.h @@ -26,15 +26,18 @@ class QSettings; class Config : public QObject { - Q_OBJECT +Q_OBJECT public: - ~Config(); + Q_DISABLE_COPY(Config) + + ~Config() override; QVariant get(const QString& key); QVariant get(const QString& key, const QVariant& defaultValue); QString getFileName(); void set(const QString& key, const QVariant& value); bool hasAccessError(); + void sync(); static Config* instance(); static void createConfigFromFile(const QString& file); @@ -49,8 +52,6 @@ private: QScopedPointer<QSettings> m_settings; QHash<QString, QVariant> m_defaults; - - Q_DISABLE_COPY(Config) }; inline Config* config() { diff --git a/src/gui/DatabaseTabWidget.h b/src/gui/DatabaseTabWidget.h index b216750ea..b839fb3ab 100644 --- a/src/gui/DatabaseTabWidget.h +++ b/src/gui/DatabaseTabWidget.h @@ -1,19 +1,19 @@ /* - * Copyright (C) 2011 Felix Geyer <debfx@fobos.de> - * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * Copyright (C) 2011 Felix Geyer <debfx@fobos.de> * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 or (at your option) - * version 3 of the License. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #ifndef KEEPASSX_DATABASETABWIDGET_H @@ -51,7 +51,7 @@ class DatabaseTabWidget : public QTabWidget public: explicit DatabaseTabWidget(QWidget* parent = nullptr); - ~DatabaseTabWidget(); + ~DatabaseTabWidget() override; void openDatabase(const QString& fileName, const QString& pw = QString(), const QString& keyFile = QString()); void mergeDatabase(const QString& fileName); @@ -116,7 +116,7 @@ private: void connectDatabase(Database* newDb, Database* oldDb = nullptr); QHash<Database*, DatabaseManagerStruct> m_dbList; - DatabaseWidgetStateSync* m_dbWidgetStateSync; + QPointer<DatabaseWidgetStateSync> m_dbWidgetStateSync; }; #endif // KEEPASSX_DATABASETABWIDGET_H diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 5f6ee56bb..b7a622b19 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -1,19 +1,19 @@ /* - * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> - * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 or (at your option) - * version 3 of the License. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include "DatabaseWidget.h" diff --git a/src/gui/DatabaseWidgetStateSync.cpp b/src/gui/DatabaseWidgetStateSync.cpp index 39904ed99..9b89412ea 100644 --- a/src/gui/DatabaseWidgetStateSync.cpp +++ b/src/gui/DatabaseWidgetStateSync.cpp @@ -1,24 +1,26 @@ /* - * Copyright (C) 2014 Felix Geyer <debfx@fobos.de> - * Copyright (C) 2014 Florian Geyer <blueice@fobos.de> + * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org> + * Copyright (C) 2014 Felix Geyer <debfx@fobos.de> + * Copyright (C) 2014 Florian Geyer <blueice@fobos.de> * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 or (at your option) - * version 3 of the License. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include "DatabaseWidgetStateSync.h" #include "core/Config.h" +#include <QCoreApplication> DatabaseWidgetStateSync::DatabaseWidgetStateSync(QObject* parent) : QObject(parent) @@ -31,9 +33,18 @@ DatabaseWidgetStateSync::DatabaseWidgetStateSync(QObject* parent) m_hidePasswords = config()->get("GUI/HidePasswords").toBool(); m_listViewState = config()->get("GUI/ListViewState").toByteArray(); m_searchViewState = config()->get("GUI/SearchViewState").toByteArray(); + + connect(qApp, &QCoreApplication::aboutToQuit, this, &DatabaseWidgetStateSync::sync); } DatabaseWidgetStateSync::~DatabaseWidgetStateSync() +{ +} + +/** + * Sync state with persistent storage. + */ +void DatabaseWidgetStateSync::sync() { config()->set("GUI/SplitterState", intListToVariant(m_mainSplitterSizes)); config()->set("GUI/DetailSplitterState", intListToVariant(m_detailSplitterSizes)); @@ -41,12 +52,13 @@ DatabaseWidgetStateSync::~DatabaseWidgetStateSync() config()->set("GUI/HidePasswords", m_hidePasswords); config()->set("GUI/ListViewState", m_listViewState); config()->set("GUI/SearchViewState", m_searchViewState); + config()->sync(); } void DatabaseWidgetStateSync::setActive(DatabaseWidget* dbWidget) { if (m_activeDbWidget) { - disconnect(m_activeDbWidget, 0, this, 0); + disconnect(m_activeDbWidget, nullptr, this, nullptr); } m_activeDbWidget = dbWidget; diff --git a/src/gui/DatabaseWidgetStateSync.h b/src/gui/DatabaseWidgetStateSync.h index aca593f1f..0b1c9b7cb 100644 --- a/src/gui/DatabaseWidgetStateSync.h +++ b/src/gui/DatabaseWidgetStateSync.h @@ -1,19 +1,20 @@ /* - * Copyright (C) 2014 Felix Geyer <debfx@fobos.de> - * Copyright (C) 2014 Florian Geyer <blueice@fobos.de> + * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org> + * Copyright (C) 2014 Felix Geyer <debfx@fobos.de> + * Copyright (C) 2014 Florian Geyer <blueice@fobos.de> * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 or (at your option) - * version 3 of the License. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #ifndef KEEPASSX_DATABASEWIDGETSTATESYNC_H @@ -27,7 +28,7 @@ class DatabaseWidgetStateSync : public QObject public: explicit DatabaseWidgetStateSync(QObject* parent = nullptr); - ~DatabaseWidgetStateSync(); + ~DatabaseWidgetStateSync() override; public slots: void setActive(DatabaseWidget* dbWidget); @@ -38,12 +39,13 @@ private slots: void blockUpdates(); void updateSplitterSizes(); void updateViewState(); + void sync(); private: static QList<int> variantToIntList(const QVariant& variant); static QVariant intListToVariant(const QList<int>& list); - DatabaseWidget* m_activeDbWidget; + QPointer<DatabaseWidget> m_activeDbWidget; bool m_blockUpdates; QList<int> m_mainSplitterSizes; diff --git a/src/gui/entry/EntryView.cpp b/src/gui/entry/EntryView.cpp index 36d60ced5..67169d27f 100644 --- a/src/gui/entry/EntryView.cpp +++ b/src/gui/entry/EntryView.cpp @@ -1,18 +1,19 @@ /* - * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> + * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org> + * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 or (at your option) - * version 3 of the License. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include "EntryView.h" @@ -88,11 +89,11 @@ EntryView::EntryView(QWidget* parent) // Stretching of last section interferes with fitting columns to window header()->setStretchLastSection(false); header()->setContextMenuPolicy(Qt::CustomContextMenu); - connect(header(), SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showHeaderMenu(QPoint))); - connect(header(), SIGNAL(sectionCountChanged(int, int)), this, SIGNAL(viewStateChanged())); - connect(header(), SIGNAL(sectionMoved(int, int, int)), this, SIGNAL(viewStateChanged())); - connect(header(), SIGNAL(sectionResized(int, int, int)), this, SIGNAL(viewStateChanged())); - connect(header(), SIGNAL(sortIndicatorChanged(int, Qt::SortOrder)), this, SIGNAL(viewStateChanged())); + connect(header(), SIGNAL(customContextMenuRequested(QPoint)), SLOT(showHeaderMenu(QPoint))); + connect(header(), SIGNAL(sectionCountChanged(int, int)), SIGNAL(viewStateChanged())); + connect(header(), SIGNAL(sectionMoved(int, int, int)), SIGNAL(viewStateChanged())); + connect(header(), SIGNAL(sectionResized(int, int, int)), SIGNAL(viewStateChanged())); + connect(header(), SIGNAL(sortIndicatorChanged(int, Qt::SortOrder)), SIGNAL(viewStateChanged())); // TODO: not working as expected, columns will end up being very small, // most likely due to the widget not being sized properly at this time diff --git a/src/gui/entry/EntryView.h b/src/gui/entry/EntryView.h index 1bea22f49..26672a665 100644 --- a/src/gui/entry/EntryView.h +++ b/src/gui/entry/EntryView.h @@ -1,18 +1,19 @@ /* - * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> + * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org> + * Copyright (C) 2010 Felix Geyer <debfx@fobos.de> * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 or (at your option) - * version 3 of the License. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #ifndef KEEPASSX_ENTRYVIEW_H From 7cc3d911ba43f540a12e016efc25caec31c2bb78 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sun, 4 Feb 2018 13:45:41 +0100 Subject: [PATCH 322/402] Fix plural handling in KDF settings --- src/gui/DatabaseSettingsWidget.cpp | 23 ++++++++++++++++++++- src/gui/DatabaseSettingsWidget.h | 2 ++ src/gui/DatabaseSettingsWidgetEncryption.ui | 9 -------- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/gui/DatabaseSettingsWidget.cpp b/src/gui/DatabaseSettingsWidget.cpp index baea2558a..cad04b297 100644 --- a/src/gui/DatabaseSettingsWidget.cpp +++ b/src/gui/DatabaseSettingsWidget.cpp @@ -57,6 +57,9 @@ DatabaseSettingsWidget::DatabaseSettingsWidget(QWidget* parent) connect(m_uiEncryption->transformBenchmarkButton, SIGNAL(clicked()), SLOT(transformRoundsBenchmark())); connect(m_uiEncryption->kdfComboBox, SIGNAL(currentIndexChanged(int)), SLOT(kdfChanged(int))); + connect(m_uiEncryption->memorySpinBox, SIGNAL(valueChanged(int)), this, SLOT(memoryChanged(int))); + connect(m_uiEncryption->parallelismSpinBox, SIGNAL(valueChanged(int)), this, SLOT(parallelismChanged(int))); + m_ui->categoryList->addCategory(tr("General"), FilePath::instance()->icon("categories", "preferences-other")); m_ui->categoryList->addCategory(tr("Encryption"), FilePath::instance()->icon("actions", "document-encrypt")); m_ui->stackedWidget->addWidget(m_uiGeneralPage); @@ -121,7 +124,7 @@ void DatabaseSettingsWidget::load(Database* db) kdfChanged(kdfIndex); } - // properly initialize parallelism spin box (may be overwritten by actual KDF values) + m_uiEncryption->memorySpinBox->setValue(64); m_uiEncryption->parallelismSpinBox->setValue(QThread::idealThreadCount()); // Setup kdf parameters @@ -289,3 +292,21 @@ void DatabaseSettingsWidget::kdfChanged(int index) transformRoundsBenchmark(); } + +/** + * Update memory spin box suffix on value change. + */ +void DatabaseSettingsWidget::memoryChanged(int value) +{ + m_uiEncryption->memorySpinBox->setSuffix( + tr(" MiB", "Abbreviation for Mebibytes (KDF settings)", value)); +} + +/** + * Update parallelism spin box suffix on value change. + */ +void DatabaseSettingsWidget::parallelismChanged(int value) +{ + m_uiEncryption->parallelismSpinBox->setSuffix( + tr(" thread(s)", "Threads for parallel execution (KDF settings)", value)); +} diff --git a/src/gui/DatabaseSettingsWidget.h b/src/gui/DatabaseSettingsWidget.h index 8410af37e..b0cae5dbc 100644 --- a/src/gui/DatabaseSettingsWidget.h +++ b/src/gui/DatabaseSettingsWidget.h @@ -54,6 +54,8 @@ private slots: void reject(); void transformRoundsBenchmark(); void kdfChanged(int index); + void memoryChanged(int value); + void parallelismChanged(int value); private: void truncateHistories(); diff --git a/src/gui/DatabaseSettingsWidgetEncryption.ui b/src/gui/DatabaseSettingsWidgetEncryption.ui index 4c4d2aed2..502bc012c 100644 --- a/src/gui/DatabaseSettingsWidgetEncryption.ui +++ b/src/gui/DatabaseSettingsWidgetEncryption.ui @@ -139,18 +139,12 @@ <height>16777215</height> </size> </property> - <property name="suffix"> - <string> MB</string> - </property> <property name="minimum"> <number>1</number> </property> <property name="maximum"> <number>1048576</number> </property> - <property name="value"> - <number>64</number> - </property> </widget> </item> <item row="4" column="0"> @@ -174,9 +168,6 @@ <height>16777215</height> </size> </property> - <property name="suffix"> - <string> thread</string> - </property> <property name="minimum"> <number>1</number> </property> From 3443c36087065feffa8249b9c70c2f8b53c5400f Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sun, 4 Feb 2018 13:46:36 +0100 Subject: [PATCH 323/402] Update translation source file --- share/translations/keepassx_en.ts | 147 ++++++++++++++++++++++++++---- 1 file changed, 131 insertions(+), 16 deletions(-) diff --git a/share/translations/keepassx_en.ts b/share/translations/keepassx_en.ts index 677273187..694c27c9b 100644 --- a/share/translations/keepassx_en.ts +++ b/share/translations/keepassx_en.ts @@ -19,10 +19,6 @@ <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> <translation type="unfinished"></translation> </message> - <message> - <source>Project Maintainers:</source> - <translation type="unfinished"></translation> - </message> <message> <source>Contributors</source> <translation type="unfinished"></translation> @@ -70,6 +66,11 @@ Kernel: %3 %4</source> <source>Enabled extensions:</source> <translation type="unfinished"></translation> </message> + <message> + <source>Build Type: Snapshot +</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>AccessControlDialog</name> @@ -819,6 +820,22 @@ If you keep this number, your database may be too easy to crack!</source> <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> <translation type="unfinished"></translation> </message> + <message numerus="yes"> + <source> MiB</source> + <comment>Abbreviation for Mebibytes (KDF settings)</comment> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> + <message numerus="yes"> + <source> thread(s)</source> + <comment>Threads for parallel execution (KDF settings)</comment> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> </context> <context> <name>DatabaseSettingsWidgetEncryption</name> @@ -850,18 +867,10 @@ If you keep this number, your database may be too easy to crack!</source> <source>Memory Usage:</source> <translation type="unfinished"></translation> </message> - <message> - <source> MB</source> - <translation type="unfinished"></translation> - </message> <message> <source>Parallelism:</source> <translation type="unfinished"></translation> </message> - <message> - <source> thread</source> - <translation type="unfinished"></translation> - </message> </context> <context> <name>DatabaseSettingsWidgetGeneral</name> @@ -901,6 +910,14 @@ If you keep this number, your database may be too easy to crack!</source> <source>Use recycle bin</source> <translation type="unfinished"></translation> </message> + <message> + <source>Additional Database Settings</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Enable &compression (recommended)</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>DatabaseTabWidget</name> @@ -1018,6 +1035,15 @@ Do you want to save the database before locking it? Otherwise your changes are lost.</source> <translation type="unfinished"></translation> </message> + <message> + <source>Disable safe saves?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>DatabaseWidget</name> @@ -1817,6 +1843,65 @@ Do you want to merge your changes?</source> <source>URL</source> <translation type="unfinished"></translation> </message> + <message> + <source>Never</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Password</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Notes</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Expires</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Created</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Modified</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Accessed</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Attachments</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>EntryView</name> + <message> + <source>Customize View</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Hide Usernames</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Hide Passwords</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Fit to window</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Fit to contents</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Reset to defaults</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>Group</name> @@ -2694,6 +2779,12 @@ This is a one-way migration. You won't be able to open the imported databas <source>Please touch the button on your YubiKey!</source> <translation type="unfinished"></translation> </message> + <message> + <source>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>OpenSSHKey</name> @@ -3650,6 +3741,30 @@ Please unlock the selected database or choose another one which is unlocked.</so <comment>Milliseconds</comment> <translation type="unfinished"></translation> </message> + <message> + <source>Startup</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>File Management</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Safely save database files (may be incompatible with Dropbox, etc)</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Backup database file before saving</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Entry Management</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>General</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>SettingsWidgetSecurity</name> @@ -3787,10 +3902,6 @@ Please unlock the selected database or choose another one which is unlocked.</so </context> <context> <name>WelcomeWidget</name> - <message> - <source>Welcome to KeePassXC</source> - <translation type="unfinished"></translation> - </message> <message> <source>Start storing your passwords securely in a KeePassXC database</source> <translation type="unfinished"></translation> @@ -3815,6 +3926,10 @@ Please unlock the selected database or choose another one which is unlocked.</so <source>Recent databases</source> <translation type="unfinished"></translation> </message> + <message> + <source>Welcome to KeePassXC %1</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>main</name> From 6007e0de715bf670e4e0bf74ef36c3cad57ba415 Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Mon, 25 Dec 2017 15:53:22 +0200 Subject: [PATCH 324/402] Refactor DetailsWidget --- src/core/EntryAttributes.cpp | 2 +- src/core/EntryAttributes.h | 2 +- src/core/Group.cpp | 6 +- src/core/Group.h | 2 +- src/gui/DatabaseWidget.cpp | 15 +- src/gui/DatabaseWidget.h | 1 + src/gui/DetailsWidget.cpp | 449 +++++++------- src/gui/DetailsWidget.h | 57 +- src/gui/DetailsWidget.ui | 1077 +++++++++++++++++++--------------- 9 files changed, 872 insertions(+), 739 deletions(-) diff --git a/src/core/EntryAttributes.cpp b/src/core/EntryAttributes.cpp index 629d8e802..772a56611 100644 --- a/src/core/EntryAttributes.cpp +++ b/src/core/EntryAttributes.cpp @@ -48,7 +48,7 @@ bool EntryAttributes::hasKey(const QString& key) const return m_attributes.contains(key); } -QList<QString> EntryAttributes::customKeys() +QList<QString> EntryAttributes::customKeys() const { QList<QString> customKeys; const QList<QString> keyList = keys(); diff --git a/src/core/EntryAttributes.h b/src/core/EntryAttributes.h index 3eca9171c..91cc50879 100644 --- a/src/core/EntryAttributes.h +++ b/src/core/EntryAttributes.h @@ -33,7 +33,7 @@ public: explicit EntryAttributes(QObject* parent = nullptr); QList<QString> keys() const; bool hasKey(const QString& key) const; - QList<QString> customKeys(); + QList<QString> customKeys() const; QString value(const QString& key) const; bool contains(const QString& key) const; bool containsValue(const QString& value) const; diff --git a/src/core/Group.cpp b/src/core/Group.cpp index c7c12bfea..bdcfeff73 100644 --- a/src/core/Group.cpp +++ b/src/core/Group.cpp @@ -439,11 +439,11 @@ void Group::setParent(Database* db) QObject::setParent(db); } -QStringList Group::hierarchy() +QStringList Group::hierarchy() const { QStringList hierarchy; - Group* group = this; - Group* parent = m_parent; + const Group* group = this; + const Group* parent = m_parent; hierarchy.prepend(group->name()); while (parent) { diff --git a/src/core/Group.h b/src/core/Group.h index 57d503a85..70f033196 100644 --- a/src/core/Group.h +++ b/src/core/Group.h @@ -117,7 +117,7 @@ public: Group* parentGroup(); const Group* parentGroup() const; void setParent(Group* parent, int index = -1); - QStringList hierarchy(); + QStringList hierarchy() const; Database* database(); const Database* database() const; diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index b7a622b19..cd57f6292 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -111,9 +111,13 @@ DatabaseWidget::DatabaseWidget(Database* db, QWidget* parent) "border-radius: 5px;"); m_detailsView = new DetailsWidget(this); - connect(m_detailsView, &DetailsWidget::errorOccurred, this, [this](const QString& error) { - showMessage(error, MessageWidget::MessageType::Error); - }); + m_detailsView->hide(); + connect(this, SIGNAL(pressedEntry(Entry*)), m_detailsView, SLOT(setEntry(Entry*))); + connect(this, SIGNAL(pressedGroup(Group*)), m_detailsView, SLOT(setGroup(Group*))); + connect(this, SIGNAL(currentModeChanged(DatabaseWidget::Mode)), + m_detailsView, SLOT(setDatabaseMode(DatabaseWidget::Mode))); + connect(m_detailsView, SIGNAL(errorOccurred(QString)), this, SLOT(showErrorMessage(QString))); + QVBoxLayout* vLayout = new QVBoxLayout(rightHandSideWidget); vLayout->setMargin(0); @@ -1488,6 +1492,11 @@ void DatabaseWidget::showMessage(const QString& text, MessageWidget::MessageType m_messageWidget->showMessage(text, type, autoHideTimeout); } +void DatabaseWidget::showErrorMessage(const QString& errorMessage) +{ + showMessage(errorMessage, MessageWidget::MessageType::Error); +} + void DatabaseWidget::hideMessage() { if (m_messageWidget->isVisible()) { diff --git a/src/gui/DatabaseWidget.h b/src/gui/DatabaseWidget.h index ba799893a..464a543ab 100644 --- a/src/gui/DatabaseWidget.h +++ b/src/gui/DatabaseWidget.h @@ -178,6 +178,7 @@ public slots: void showMessage(const QString& text, MessageWidget::MessageType type, bool showClosebutton = true, int autoHideTimeout = MessageWidget::DefaultAutoHideTimeout); + void showErrorMessage(const QString& errorMessage); void hideMessage(); private slots: diff --git a/src/gui/DetailsWidget.cpp b/src/gui/DetailsWidget.cpp index 9f0d2bfd8..01519cbd0 100644 --- a/src/gui/DetailsWidget.cpp +++ b/src/gui/DetailsWidget.cpp @@ -28,105 +28,150 @@ #include "gui/Clipboard.h" #include "entry/EntryAttachmentsModel.h" +namespace { +constexpr int GeneralTabIndex = 0; +const QString hierarchySeparator(" / "); +} + DetailsWidget::DetailsWidget(QWidget* parent) : QWidget(parent) , m_ui(new Ui::DetailsWidget()) , m_locked(false) , m_currentEntry(nullptr) , m_currentGroup(nullptr) - , m_timer(nullptr) - , m_attributesTabWidget(nullptr) - , m_attachmentsTabWidget(nullptr) - , m_autotypeTabWidget(nullptr) + , m_step(0) + , m_totpTimer(nullptr) , m_selectedTabEntry(0) , m_selectedTabGroup(0) { m_ui->setupUi(this); - connect(parent, SIGNAL(pressedEntry(Entry*)), SLOT(getSelectedEntry(Entry*))); - connect(parent, SIGNAL(pressedGroup(Group*)), SLOT(getSelectedGroup(Group*))); - connect(parent, SIGNAL(currentModeChanged(DatabaseWidget::Mode)), SLOT(setDatabaseMode(DatabaseWidget::Mode))); + // Entry + m_ui->entryTotpButton->setIcon(filePath()->icon("actions", "chronometer")); + m_ui->entryCloseButton->setIcon(filePath()->icon("actions", "dialog-close")); - m_ui->totpButton->setIcon(filePath()->icon("actions", "chronometer")); - m_ui->closeButton->setIcon(filePath()->icon("actions", "dialog-close")); + m_ui->entryAttachmentsWidget->setReadOnly(true); + m_ui->entryAttachmentsWidget->setButtonsVisible(false); - connect(m_ui->totpButton, SIGNAL(toggled(bool)), SLOT(showTotp(bool))); - connect(m_ui->closeButton, SIGNAL(toggled(bool)), SLOT(hideDetails())); - connect(m_ui->tabWidget, SIGNAL(tabBarClicked(int)), SLOT(updateTabIndex(int))); + connect(m_ui->entryTotpButton, SIGNAL(toggled(bool)), m_ui->entryTotpWidget, SLOT(setVisible(bool))); + connect(m_ui->entryCloseButton, SIGNAL(toggled(bool)), SLOT(hide())); + connect(m_ui->entryTabWidget, SIGNAL(tabBarClicked(int)), SLOT(updateTabIndexes()), Qt::QueuedConnection); - m_ui->attachmentsWidget->setReadOnly(true); - m_ui->attachmentsWidget->setButtonsVisible(false); - - m_attributesTabWidget = m_ui->tabWidget->widget(AttributesTab); - m_attachmentsTabWidget = m_ui->tabWidget->widget(AttachmentsTab); - m_autotypeTabWidget = m_ui->tabWidget->widget(AutotypeTab); - - this->hide(); + // Group + m_ui->groupCloseButton->setIcon(filePath()->icon("actions", "dialog-close")); + connect(m_ui->groupCloseButton, SIGNAL(toggled(bool)), SLOT(hide())); + connect(m_ui->groupTabWidget, SIGNAL(tabBarClicked(int)), SLOT(updateTabIndexes()), Qt::QueuedConnection); } DetailsWidget::~DetailsWidget() { - if (m_timer) { - delete m_timer; - } + deleteTotpTimer(); } -void DetailsWidget::getSelectedEntry(Entry* selectedEntry) +void DetailsWidget::setEntry(Entry* selectedEntry) { if (!selectedEntry) { - hideDetails(); + hide(); return; } m_currentEntry = selectedEntry; - if (!config()->get("GUI/HideDetailsView").toBool()) { - this->show(); + updateEntryHeaderLine(); + updateEntryTotp(); + updateEntryGeneralTab(); + updateEntryNotesTab(); + updateEntryAttributesTab(); + updateEntryAttachmentsTab(); + updateEntryAutotypeTab(); + + setVisible(!config()->get("GUI/HideDetailsView").toBool()); + + m_ui->stackedWidget->setCurrentWidget(m_ui->pageEntry); + const int tabIndex = m_ui->entryTabWidget->isTabEnabled(m_selectedTabEntry) ? m_selectedTabEntry + : GeneralTabIndex; + Q_ASSERT(m_ui->entryTabWidget->isTabEnabled(GeneralTabIndex)); + m_ui->entryTabWidget->setCurrentIndex(tabIndex); +} + +void DetailsWidget::setGroup(Group* selectedGroup) +{ + if (!selectedGroup) { + hide(); + return; } - m_ui->stackedWidget->setCurrentIndex(EntryPreview); + m_currentGroup = selectedGroup; + updateGroupHeaderLine(); + updateGroupGeneralTab(); + updateGroupNotesTab(); - if (m_ui->tabWidget->count() < 5) { - m_ui->tabWidget->insertTab(static_cast<int>(AttributesTab), m_attributesTabWidget, tr("Attributes")); - m_ui->tabWidget->insertTab(static_cast<int>(AttachmentsTab), m_attachmentsTabWidget, tr("Attachments")); - m_ui->tabWidget->insertTab(static_cast<int>(AutotypeTab), m_autotypeTabWidget, tr("Autotype")); + setVisible(!config()->get("GUI/HideDetailsView").toBool()); + + m_ui->stackedWidget->setCurrentWidget(m_ui->pageGroup); + const int tabIndex = m_ui->groupTabWidget->isTabEnabled(m_selectedTabGroup) ? m_selectedTabGroup + : GeneralTabIndex; + Q_ASSERT(m_ui->groupTabWidget->isTabEnabled(GeneralTabIndex)); + m_ui->groupTabWidget->setCurrentIndex(tabIndex); +} + +void DetailsWidget::setDatabaseMode(DatabaseWidget::Mode mode) +{ + m_locked = mode == DatabaseWidget::LockedMode; + if (m_locked) { + return; } - m_ui->tabWidget->setTabEnabled(AttributesTab, false); - m_ui->tabWidget->setTabEnabled(NotesTab, false); - m_ui->tabWidget->setTabEnabled(AutotypeTab, false); - - m_ui->totpButton->hide(); - m_ui->totpWidget->hide(); - m_ui->totpButton->setChecked(false); - - auto icon = m_currentEntry->iconPixmap(); - if (icon.width() > 16 || icon.height() > 16) { - icon = icon.scaled(16, 16); - } - m_ui->entryIcon->setPixmap(icon); - - QString title = QString(" / "); - Group* entry_group = m_currentEntry->group(); - if (entry_group) { - QStringList hierarchy = entry_group->hierarchy(); - hierarchy.removeFirst(); - title += hierarchy.join(" / "); - if (hierarchy.size() > 0) { - title += " / "; + if (mode == DatabaseWidget::ViewMode) { + if (m_ui->stackedWidget->currentWidget() == m_ui->pageGroup) { + setGroup(m_currentGroup); + } else { + setEntry(m_currentEntry); } } - title.append(m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->title())); - m_ui->titleLabel->setText(title); +} - m_ui->usernameLabel->setText(m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->username())); +void DetailsWidget::updateEntryHeaderLine() +{ + Q_ASSERT(m_currentEntry); + const QString title = m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->title()); + m_ui->entryTitleLabel->setText(hierarchy(m_currentEntry->group(), title)); + m_ui->entryIcon->setPixmap(preparePixmap(m_currentEntry->iconPixmap(), 16)); +} + +void DetailsWidget::updateEntryTotp() +{ + Q_ASSERT(m_currentEntry); + const bool hasTotp = m_currentEntry->hasTotp(); + m_ui->entryTotpButton->setVisible(hasTotp); + m_ui->entryTotpWidget->hide(); + m_ui->entryTotpButton->setChecked(false); + + if (hasTotp) { + deleteTotpTimer(); + m_totpTimer = new QTimer(m_currentEntry); + connect(m_totpTimer, SIGNAL(timeout()), this, SLOT(updateTotpLabel())); + m_totpTimer->start(1000); + + m_step = m_currentEntry->totpStep(); + updateTotpLabel(); + } else { + m_ui->entryTotpLabel->clear(); + stopTotpTimer(); + } +} + +void DetailsWidget::updateEntryGeneralTab() +{ + Q_ASSERT(m_currentEntry); + m_ui->entryUsernameLabel->setText(m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->username())); if (!config()->get("security/hidepassworddetails").toBool()) { - m_ui->passwordLabel->setText( - shortPassword(m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->password()))); - m_ui->passwordLabel->setToolTip(m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->password())); + const QString password = m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->password()); + m_ui->entryPasswordLabel->setText(shortPassword(password)); + m_ui->entryPasswordLabel->setToolTip(password); } else { - m_ui->passwordLabel->setText(QString("\u25cf").repeated(6)); + m_ui->entryPasswordLabel->setText(QString("\u25cf").repeated(6)); } QString url = m_currentEntry->webUrl(); @@ -135,46 +180,38 @@ void DetailsWidget::getSelectedEntry(Entry* selectedEntry) // create a new display url that masks password placeholders // the actual link will use the password url = QString("<a href=\"%1\">%2</a>").arg(url).arg(shortUrl(m_currentEntry->displayUrl())); - m_ui->urlLabel->setOpenExternalLinks(true); + m_ui->entryUrlLabel->setOpenExternalLinks(true); } else { // Fallback to the raw url string url = shortUrl(m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->url())); - m_ui->urlLabel->setOpenExternalLinks(false); + m_ui->entryUrlLabel->setOpenExternalLinks(false); } - m_ui->urlLabel->setText(url); + m_ui->entryUrlLabel->setText(url); - TimeInfo entryTime = m_currentEntry->timeInfo(); - if (entryTime.expires()) { - m_ui->expirationLabel->setText(entryTime.expiryTime().toString(Qt::DefaultLocaleShortDate)); - } else { - m_ui->expirationLabel->setText(tr("Never")); - } + const TimeInfo entryTime = m_currentEntry->timeInfo(); + const QString expires = entryTime.expires() ? entryTime.expiryTime().toString(Qt::DefaultLocaleShortDate) + : tr("Never"); + m_ui->entryExpirationLabel->setText(expires); +} - if (m_currentEntry->hasTotp()) { - m_step = m_currentEntry->totpStep(); +void DetailsWidget::updateEntryNotesTab() +{ + Q_ASSERT(m_currentEntry); + const QString notes = m_currentEntry->notes(); + setTabEnabled(m_ui->entryTabWidget, m_ui->entryNotesTab, !notes.isEmpty()); + m_ui->entryNotesEdit->setText(m_currentEntry->resolveMultiplePlaceholders(notes)); +} - if (m_timer) { - delete m_timer; - } - m_timer = new QTimer(selectedEntry); - connect(m_timer, SIGNAL(timeout()), this, SLOT(updateTotp())); - updateTotp(); - m_timer->start(m_step * 1000); - m_ui->totpButton->show(); - } - - QString notes = m_currentEntry->notes(); - if (!notes.isEmpty()) { - m_ui->tabWidget->setTabEnabled(NotesTab, true); - m_ui->notesEdit->setText(m_currentEntry->resolveMultiplePlaceholders(notes)); - } - - QStringList customAttributes = m_currentEntry->attributes()->customKeys(); - if (customAttributes.size() > 0) { - m_ui->tabWidget->setTabEnabled(AttributesTab, true); - m_ui->attributesEdit->clear(); - - QString attributesText = QString(); +void DetailsWidget::updateEntryAttributesTab() +{ + Q_ASSERT(m_currentEntry); + m_ui->entryAttributesEdit->clear(); + const EntryAttributes* attributes = m_currentEntry->attributes(); + const QStringList customAttributes = attributes->customKeys(); + const bool haveAttributes = customAttributes.size() > 0; + setTabEnabled(m_ui->entryTabWidget, m_ui->entryAttributesTab, haveAttributes); + if (haveAttributes) { + QString attributesText; for (const QString& key : customAttributes) { QString value = m_currentEntry->attributes()->value(key); if (m_currentEntry->attributes()->isProtected(key)) { @@ -182,127 +219,117 @@ void DetailsWidget::getSelectedEntry(Entry* selectedEntry) } attributesText.append(QString("<b>%1</b>: %2<br/>").arg(key, value)); } - m_ui->attributesEdit->setText(attributesText); + m_ui->entryAttributesEdit->setText(attributesText); } +} +void DetailsWidget::updateEntryAttachmentsTab() +{ + Q_ASSERT(m_currentEntry); const bool hasAttachments = !m_currentEntry->attachments()->isEmpty(); - m_ui->tabWidget->setTabEnabled(AttachmentsTab, hasAttachments); - m_ui->attachmentsWidget->setEntryAttachments(m_currentEntry->attachments()); + setTabEnabled(m_ui->entryTabWidget, m_ui->entryAttachmentsTab, hasAttachments); + m_ui->entryAttachmentsWidget->setEntryAttachments(m_currentEntry->attachments()); +} - m_ui->autotypeTree->clear(); - AutoTypeAssociations* autotypeAssociations = m_currentEntry->autoTypeAssociations(); +void DetailsWidget::updateEntryAutotypeTab() +{ + Q_ASSERT(m_currentEntry); + m_ui->entryAutotypeTree->clear(); QList<QTreeWidgetItem*> items; - for (auto assoc : autotypeAssociations->getAll()) { - QStringList association = QStringList() << assoc.window << assoc.sequence; - if (association.at(1).isEmpty()) { - association.replace(1, m_currentEntry->effectiveAutoTypeSequence()); - } - items.append(new QTreeWidgetItem(m_ui->autotypeTree, association)); - } - if (items.count() > 0) { - m_ui->autotypeTree->addTopLevelItems(items); - m_ui->tabWidget->setTabEnabled(AutotypeTab, true); + const AutoTypeAssociations* autotypeAssociations = m_currentEntry->autoTypeAssociations(); + const auto associations = autotypeAssociations->getAll(); + for (const auto& assoc : associations) { + const QString sequence = assoc.sequence.isEmpty() ? m_currentEntry->effectiveAutoTypeSequence() + : assoc.sequence; + items.append(new QTreeWidgetItem(m_ui->entryAutotypeTree, {assoc.window, sequence})); } - if (m_ui->tabWidget->isTabEnabled(m_selectedTabEntry)) { - m_ui->tabWidget->setCurrentIndex(m_selectedTabEntry); + m_ui->entryAutotypeTree->addTopLevelItems(items); + setTabEnabled(m_ui->entryTabWidget, m_ui->entryAutotypeTab, !items.isEmpty()); +} + +void DetailsWidget::updateGroupHeaderLine() +{ + Q_ASSERT(m_currentGroup); + m_ui->groupTitleLabel->setText(hierarchy(m_currentGroup, QString())); + m_ui->groupIcon->setPixmap(preparePixmap(m_currentGroup->iconPixmap(), 32)); +} + +void DetailsWidget::updateGroupGeneralTab() +{ + Q_ASSERT(m_currentGroup); + const QString searchingText = m_currentGroup->resolveSearchingEnabled() ? tr("Enabled") : tr("Disabled"); + m_ui->groupSearchingLabel->setText(searchingText); + + const QString autotypeText = m_currentGroup->resolveAutoTypeEnabled() ? tr("Enabled") : tr("Disabled"); + m_ui->groupAutotypeLabel->setText(autotypeText); + + const TimeInfo groupTime = m_currentGroup->timeInfo(); + const QString expiresText = groupTime.expires() ? groupTime.expiryTime().toString(Qt::DefaultLocaleShortDate) + : tr("Never"); + m_ui->groupExpirationLabel->setText(expiresText); +} + +void DetailsWidget::updateGroupNotesTab() +{ + Q_ASSERT(m_currentGroup); + const QString notes = m_currentGroup->notes(); + setTabEnabled(m_ui->groupTabWidget, m_ui->groupNotesTab, !notes.isEmpty()); + m_ui->groupNotesEdit->setText(notes); +} + +void DetailsWidget::stopTotpTimer() +{ + if (m_totpTimer) { + m_totpTimer->stop(); } } -void DetailsWidget::getSelectedGroup(Group* selectedGroup) +void DetailsWidget::deleteTotpTimer() { - if (!selectedGroup) { - hideDetails(); - return; + if (m_totpTimer) { + delete m_totpTimer; } +} - m_currentGroup = selectedGroup; - - if (!config()->get("GUI/HideDetailsView").toBool()) { - this->show(); - } - - m_ui->stackedWidget->setCurrentIndex(GroupPreview); - - if (m_ui->tabWidget->count() > 2) { - m_ui->tabWidget->removeTab(AutotypeTab); - m_ui->tabWidget->removeTab(AttachmentsTab); - m_ui->tabWidget->removeTab(AttributesTab); - } - - m_ui->tabWidget->setTabEnabled(GroupNotesTab, false); - - m_ui->totpButton->hide(); - m_ui->totpWidget->hide(); - - auto icon = m_currentGroup->iconPixmap(); - if (icon.width() > 32 || icon.height() > 32) { - icon = icon.scaled(32, 32); - } - m_ui->entryIcon->setPixmap(icon); - - QString title = " / "; - QStringList hierarchy = m_currentGroup->hierarchy(); - hierarchy.removeFirst(); - title += hierarchy.join(" / "); - if (hierarchy.size() > 0) { - title += " / "; - } - m_ui->titleLabel->setText(title); - - QString notes = m_currentGroup->notes(); - if (!notes.isEmpty()) { - m_ui->tabWidget->setTabEnabled(GroupNotesTab, true); - m_ui->notesEdit->setText(notes); - } - - QString searching = tr("Disabled"); - if (m_currentGroup->resolveSearchingEnabled()) { - searching = tr("Enabled"); - } - m_ui->searchingLabel->setText(searching); - - QString autotype = tr("Disabled"); - if (m_currentGroup->resolveAutoTypeEnabled()) { - autotype = tr("Enabled"); - } - m_ui->autotypeLabel->setText(autotype); - - TimeInfo groupTime = m_currentGroup->timeInfo(); - if (groupTime.expires()) { - m_ui->groupExpirationLabel->setText(groupTime.expiryTime().toString(Qt::DefaultLocaleShortDate)); +void DetailsWidget::updateTotpLabel() +{ + if (!m_locked && m_currentEntry) { + const QString totpCode = m_currentEntry->totp(); + const QString firstHalf = totpCode.left(totpCode.size() / 2); + const QString secondHalf = totpCode.mid(totpCode.size() / 2); + m_ui->entryTotpLabel->setText(firstHalf + " " + secondHalf); } else { - m_ui->groupExpirationLabel->setText(tr("Never")); - } - - if (m_ui->tabWidget->isTabEnabled(m_selectedTabGroup)) { - m_ui->tabWidget->setCurrentIndex(m_selectedTabGroup); + m_ui->entryTotpLabel->clear(); + stopTotpTimer(); } } -void DetailsWidget::updateTotp() +void DetailsWidget::updateTabIndexes() { - if (!m_locked) { - QString totpCode = m_currentEntry->totp(); - QString firstHalf = totpCode.left(totpCode.size() / 2); - QString secondHalf = totpCode.mid(totpCode.size() / 2); - m_ui->totpLabel->setText(firstHalf + " " + secondHalf); - } else if (m_timer) { - m_timer->stop(); - } + m_selectedTabEntry = m_ui->entryTabWidget->currentIndex(); + m_selectedTabGroup = m_ui->groupTabWidget->currentIndex(); } -void DetailsWidget::showTotp(bool visible) +void DetailsWidget::setTabEnabled(QTabWidget* tabWidget, QWidget* widget, bool enabled) { - if (visible) { - m_ui->totpWidget->show(); - } else { - m_ui->totpWidget->hide(); - } + const int tabIndex = tabWidget->indexOf(widget); + Q_ASSERT(tabIndex != -1); + tabWidget->setTabEnabled(tabIndex, enabled); } -QString DetailsWidget::shortUrl(QString url) +QPixmap DetailsWidget::preparePixmap(const QPixmap& pixmap, int size) { + if (pixmap.width() > size || pixmap.height() > size) { + return pixmap.scaled(size, size, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); + } + return pixmap; +} + + +QString DetailsWidget::shortUrl(const QString& url) +{ + // TODO: create elided text QString newurl = ""; if (url.length() > 60) { newurl.append(url.left(20)); @@ -313,43 +340,19 @@ QString DetailsWidget::shortUrl(QString url) return url; } -QString DetailsWidget::shortPassword(QString password) +QString DetailsWidget::shortPassword(const QString& password) { - QString newpassword = ""; + // TODO: create elided text if (password.length() > 60) { - newpassword.append(password.left(50)); - newpassword.append("…"); - return newpassword; + return QString("%1…").arg(password.left(60)); } return password; } -void DetailsWidget::hideDetails() +QString DetailsWidget::hierarchy(const Group* group, const QString& title) { - this->hide(); -} - -void DetailsWidget::setDatabaseMode(DatabaseWidget::Mode mode) -{ - m_locked = false; - if (mode == DatabaseWidget::LockedMode) { - m_locked = true; - return; - } - if (mode == DatabaseWidget::ViewMode) { - if (m_ui->stackedWidget->currentIndex() == GroupPreview) { - getSelectedGroup(m_currentGroup); - } else { - getSelectedEntry(m_currentEntry); - } - } -} - -void DetailsWidget::updateTabIndex(int index) -{ - if (m_ui->stackedWidget->currentIndex() == GroupPreview) { - m_selectedTabGroup = index; - } else { - m_selectedTabEntry = index; - } + QStringList hierarchy = group->hierarchy(); + hierarchy.removeFirst(); + hierarchy.append(title); + return QString("%1%2").arg(hierarchySeparator, hierarchy.join(hierarchySeparator)); } diff --git a/src/gui/DetailsWidget.h b/src/gui/DetailsWidget.h index 2af184c48..cc0ac779a 100644 --- a/src/gui/DetailsWidget.h +++ b/src/gui/DetailsWidget.h @@ -19,8 +19,8 @@ #define KEEPASSX_DETAILSWIDGET_H #include "gui/DatabaseWidget.h" + #include <QWidget> -#include <QTimer> namespace Ui { class DetailsWidget; @@ -34,48 +34,47 @@ public: explicit DetailsWidget(QWidget* parent = nullptr); ~DetailsWidget(); - enum StackedWidgetIndex - { - EntryPreview = 0, - GroupPreview = 1, - }; - - enum TabWidgetIndex - { - GeneralTab = 0, - AttributesTab = 1, - GroupNotesTab = 1, - AttachmentsTab = 2, - NotesTab = 3, - AutotypeTab = 4, - }; +public slots: + void setEntry(Entry* selectedEntry); + void setGroup(Group* selectedGroup); + void setDatabaseMode(DatabaseWidget::Mode mode); signals: void errorOccurred(const QString& error); private slots: - void getSelectedEntry(Entry* selectedEntry); - void getSelectedGroup(Group* selectedGroup); - void showTotp(bool visible); - void updateTotp(); - void hideDetails(); - void setDatabaseMode(DatabaseWidget::Mode mode); - void updateTabIndex(int index); + void updateEntryHeaderLine(); + void updateEntryTotp(); + void updateEntryGeneralTab(); + void updateEntryNotesTab(); + void updateEntryAttributesTab(); + void updateEntryAttachmentsTab(); + void updateEntryAutotypeTab(); + + void updateGroupHeaderLine(); + void updateGroupGeneralTab(); + void updateGroupNotesTab(); + + void stopTotpTimer(); + void deleteTotpTimer(); + void updateTotpLabel(); + void updateTabIndexes(); private: + void setTabEnabled(QTabWidget *tabWidget, QWidget* widget, bool enabled); + static QPixmap preparePixmap(const QPixmap& pixmap, int size); + static QString shortUrl(const QString& url); + static QString shortPassword(const QString& password); + static QString hierarchy(const Group* group, const QString& title); + const QScopedPointer<Ui::DetailsWidget> m_ui; bool m_locked; Entry* m_currentEntry; Group* m_currentGroup; quint8 m_step; - QPointer<QTimer> m_timer = nullptr; - QWidget* m_attributesTabWidget; - QWidget* m_attachmentsTabWidget; - QWidget* m_autotypeTabWidget; + QPointer<QTimer> m_totpTimer; quint8 m_selectedTabEntry; quint8 m_selectedTabGroup; - QString shortUrl(QString url); - QString shortPassword(QString password); }; #endif // KEEPASSX_DETAILSWIDGET_H diff --git a/src/gui/DetailsWidget.ui b/src/gui/DetailsWidget.ui index 9c705569d..88c84ad43 100644 --- a/src/gui/DetailsWidget.ui +++ b/src/gui/DetailsWidget.ui @@ -2,521 +2,642 @@ <ui version="4.0"> <class>DetailsWidget</class> <widget class="QWidget" name="DetailsWidget"> - <layout class="QVBoxLayout" name="verticalLayout_3"> + <layout class="QVBoxLayout" name="verticalLayout_7"> + <property name="spacing"> + <number>0</number> + </property> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> <item> - <layout class="QHBoxLayout" name="horizontalLayout" stretch="0,0,0,0,0,0,0"> - <property name="sizeConstraint"> - <enum>QLayout::SetDefaultConstraint</enum> - </property> - <item> - <widget class="QLabel" name="entryIcon"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string/> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="titleLabel"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="font"> - <font> - <pointsize>12</pointsize> - </font> - </property> - <property name="textFormat"> - <enum>Qt::AutoText</enum> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QWidget" name="totpWidget" native="true"> - <layout class="QGridLayout" name="gridLayout_3"> - <property name="leftMargin"> - <number>0</number> - </property> - <property name="topMargin"> - <number>0</number> - </property> - <property name="bottomMargin"> - <number>0</number> - </property> - <item row="0" column="0"> - <widget class="QLabel" name="totpLabel"> - <property name="font"> - <font> - <pointsize>10</pointsize> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string/> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QToolButton" name="totpButton"> - <property name="toolTip"> - <string>Generate TOTP Token</string> - </property> - <property name="text"> - <string/> - </property> - <property name="checkable"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QToolButton" name="closeButton"> - <property name="toolTip"> - <string>Close</string> - </property> - <property name="text"> - <string/> - </property> - <property name="checkable"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QFrame" name="frame"> - <property name="frameShape"> - <enum>QFrame::StyledPanel</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Raised</enum> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="QTabWidget" name="tabWidget"> + <widget class="QStackedWidget" name="stackedWidget"> <property name="currentIndex"> <number>0</number> </property> - <property name="documentMode"> - <bool>false</bool> - </property> - <property name="tabsClosable"> - <bool>false</bool> - </property> - <property name="movable"> - <bool>false</bool> - </property> - <widget class="QWidget" name="generalTab"> - <attribute name="title"> - <string>General</string> - </attribute> - <layout class="QVBoxLayout" name="verticalLayout_5"> + <widget class="QWidget" name="pageEntry"> + <layout class="QVBoxLayout" name="verticalLayout_3"> <item> - <widget class="QStackedWidget" name="stackedWidget"> + <layout class="QHBoxLayout" name="entryHorizontalLayout" stretch="0,0,0,0,0,0"> + <property name="sizeConstraint"> + <enum>QLayout::SetDefaultConstraint</enum> + </property> + <item> + <widget class="QLabel" name="entryIcon"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="entryTitleLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="font"> + <font> + <pointsize>12</pointsize> + </font> + </property> + <property name="textFormat"> + <enum>Qt::AutoText</enum> + </property> + </widget> + </item> + <item> + <spacer name="entryHorizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QWidget" name="entryTotpWidget" native="true"> + <layout class="QGridLayout" name="gridLayout_3"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item row="0" column="0"> + <widget class="QLabel" name="entryTotpLabel"> + <property name="font"> + <font> + <pointsize>10</pointsize> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QToolButton" name="entryTotpButton"> + <property name="toolTip"> + <string>Generate TOTP Token</string> + </property> + <property name="text"> + <string/> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="entryCloseButton"> + <property name="toolTip"> + <string>Close</string> + </property> + <property name="text"> + <string/> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QTabWidget" name="entryTabWidget"> <property name="currentIndex"> <number>0</number> </property> - <widget class="QWidget" name="entryPage"> - <layout class="QGridLayout" name="gridLayout" columnstretch="0,0,1"> - <item row="0" column="2"> - <widget class="QLabel" name="usernameLabel"> - <property name="textInteractionFlags"> - <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set> - </property> + <property name="documentMode"> + <bool>false</bool> + </property> + <property name="tabsClosable"> + <bool>false</bool> + </property> + <property name="movable"> + <bool>false</bool> + </property> + <widget class="QWidget" name="entryGeneralTab"> + <attribute name="title"> + <string>General</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_5"> + <item> + <widget class="QWidget" name="entryGeneralWidget" native="true"> + <layout class="QGridLayout" name="gridLayout" columnstretch="0,0,1"> + <item row="0" column="0"> + <spacer name="entryLeftHorizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Fixed</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item row="0" column="1"> + <widget class="QLabel" name="entryUsernameTitleLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="layoutDirection"> + <enum>Qt::LeftToRight</enum> + </property> + <property name="text"> + <string>Username</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="0" column="2"> + <widget class="QLabel" name="entryUsernameLabel"> + <property name="textInteractionFlags"> + <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLabel" name="entryPasswordTitleLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Password</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="1" column="2"> + <widget class="QLabel" name="entryPasswordLabel"/> + </item> + <item row="2" column="1"> + <widget class="QLabel" name="entryUrlTitleLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>URL</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="2" column="2"> + <widget class="QLabel" name="entryUrlLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="cursor"> + <cursorShape>PointingHandCursor</cursorShape> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QLabel" name="entryExpirationTitleLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Expiration</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="3" column="2"> + <widget class="QLabel" name="entryExpirationLabel"/> + </item> + <item row="4" column="2"> + <spacer name="entryBottomVerticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> </widget> </item> - <item row="1" column="1"> - <widget class="QLabel" name="passwordLabel_2"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> + </layout> + </widget> + <widget class="QWidget" name="entryAttributesTab"> + <attribute name="title"> + <string>Attributes</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QTextEdit" name="entryAttributesEdit"> + <property name="focusPolicy"> + <enum>Qt::ClickFocus</enum> </property> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Password</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item row="0" column="0"> - <spacer name="horizontalSpacer_2"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeType"> - <enum>QSizePolicy::Fixed</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item row="3" column="2"> - <widget class="QLabel" name="expirationLabel"/> - </item> - <item row="4" column="2"> - <spacer name="verticalSpacer_2"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>0</height> - </size> - </property> - </spacer> - </item> - <item row="2" column="1"> - <widget class="QLabel" name="urlLabel_2"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>URL</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item row="2" column="2"> - <widget class="QLabel" name="urlLabel"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="cursor"> - <cursorShape>PointingHandCursor</cursorShape> - </property> - <property name="text"> - <string/> - </property> - </widget> - </item> - <item row="3" column="1"> - <widget class="QLabel" name="expirationLabel_2"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Expiration</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item row="1" column="2"> - <widget class="QLabel" name="passwordLabel"/> - </item> - <item row="0" column="1"> - <widget class="QLabel" name="usernameLabel_2"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="layoutDirection"> - <enum>Qt::LeftToRight</enum> - </property> - <property name="text"> - <string>Username</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + <property name="readOnly"> + <bool>true</bool> </property> </widget> </item> </layout> </widget> - <widget class="QWidget" name="groupPage"> - <layout class="QGridLayout" name="gridLayout_4" columnstretch="0,0,1"> - <item row="0" column="1"> - <widget class="QLabel" name="autotypeLabel_2"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> + <widget class="QWidget" name="entryAttachmentsTab"> + <attribute name="title"> + <string>Attachments</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_6"> + <item> + <widget class="EntryAttachmentsWidget" name="entryAttachmentsWidget" native="true"/> + </item> + </layout> + </widget> + <widget class="QWidget" name="entryNotesTab"> + <attribute name="title"> + <string>Notes</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <widget class="QTextEdit" name="entryNotesEdit"> + <property name="focusPolicy"> + <enum>Qt::ClickFocus</enum> </property> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Autotype</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + <property name="readOnly"> + <bool>true</bool> </property> </widget> </item> - <item row="2" column="2"> - <widget class="QLabel" name="groupExpirationLabel"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> + </layout> + </widget> + <widget class="QWidget" name="entryAutotypeTab"> + <attribute name="title"> + <string>Autotype</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_4"> + <item> + <widget class="QTreeWidget" name="entryAutotypeTree"> + <property name="frameShadow"> + <enum>QFrame::Sunken</enum> </property> + <property name="showDropIndicator" stdset="0"> + <bool>true</bool> + </property> + <property name="rootIsDecorated"> + <bool>true</bool> + </property> + <property name="wordWrap"> + <bool>false</bool> + </property> + <property name="columnCount"> + <number>2</number> + </property> + <attribute name="headerCascadingSectionResizes"> + <bool>false</bool> + </attribute> + <attribute name="headerDefaultSectionSize"> + <number>250</number> + </attribute> + <attribute name="headerMinimumSectionSize"> + <number>50</number> + </attribute> + <attribute name="headerStretchLastSection"> + <bool>true</bool> + </attribute> + <column> + <property name="text"> + <string>Window</string> + </property> + </column> + <column> + <property name="text"> + <string>Sequence</string> + </property> + </column> </widget> </item> - <item row="3" column="2"> - <spacer name="verticalSpacer"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>0</height> - </size> - </property> - </spacer> - </item> - <item row="1" column="2"> - <widget class="QLabel" name="searchingLabel"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QLabel" name="searchingLabel_2"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Searching</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item row="0" column="2"> - <widget class="QLabel" name="autotypeLabel"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - </widget> - </item> - <item row="2" column="1"> - <widget class="QLabel" name="groupExpirationLabel_2"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Expiration</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item row="0" column="0"> - <spacer name="horizontalSpacer_3"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeType"> - <enum>QSizePolicy::Fixed</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - </spacer> - </item> </layout> </widget> </widget> </item> </layout> </widget> - <widget class="QWidget" name="attributesTab"> - <attribute name="title"> - <string>Attributes</string> - </attribute> - <layout class="QVBoxLayout" name="verticalLayout"> + <widget class="QWidget" name="pageGroup"> + <layout class="QVBoxLayout" name="verticalLayout_13"> <item> - <widget class="QTextEdit" name="attributesEdit"> - <property name="focusPolicy"> - <enum>Qt::ClickFocus</enum> + <layout class="QHBoxLayout" name="groupHorizontalLayout" stretch="0,0,0,0"> + <property name="sizeConstraint"> + <enum>QLayout::SetDefaultConstraint</enum> </property> - <property name="readOnly"> - <bool>true</bool> - </property> - </widget> + <item> + <widget class="QLabel" name="groupIcon"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="groupTitleLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="font"> + <font> + <pointsize>12</pointsize> + </font> + </property> + <property name="textFormat"> + <enum>Qt::AutoText</enum> + </property> + </widget> + </item> + <item> + <spacer name="groupHorizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QToolButton" name="groupCloseButton"> + <property name="toolTip"> + <string>Close</string> + </property> + <property name="text"> + <string/> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> </item> - </layout> - </widget> - <widget class="QWidget" name="attachmentsTab"> - <attribute name="title"> - <string>Attachments</string> - </attribute> - <layout class="QVBoxLayout" name="verticalLayout_6"> <item> - <widget class="EntryAttachmentsWidget" name="attachmentsWidget" native="true"/> - </item> - </layout> - </widget> - <widget class="QWidget" name="notesTab"> - <attribute name="title"> - <string>Notes</string> - </attribute> - <layout class="QVBoxLayout" name="verticalLayout_2"> - <item> - <widget class="QTextEdit" name="notesEdit"> - <property name="focusPolicy"> - <enum>Qt::ClickFocus</enum> + <widget class="QTabWidget" name="groupTabWidget"> + <property name="currentIndex"> + <number>0</number> </property> - <property name="readOnly"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </widget> - <widget class="QWidget" name="autotypeTab"> - <attribute name="title"> - <string>Autotype</string> - </attribute> - <layout class="QVBoxLayout" name="verticalLayout_4"> - <item> - <widget class="QTreeWidget" name="autotypeTree"> - <property name="frameShadow"> - <enum>QFrame::Sunken</enum> - </property> - <property name="showDropIndicator" stdset="0"> - <bool>true</bool> - </property> - <property name="rootIsDecorated"> - <bool>true</bool> - </property> - <property name="wordWrap"> + <property name="documentMode"> <bool>false</bool> </property> - <property name="columnCount"> - <number>2</number> - </property> - <attribute name="headerCascadingSectionResizes"> + <property name="tabsClosable"> <bool>false</bool> - </attribute> - <attribute name="headerDefaultSectionSize"> - <number>250</number> - </attribute> - <attribute name="headerMinimumSectionSize"> - <number>50</number> - </attribute> - <attribute name="headerStretchLastSection"> - <bool>true</bool> - </attribute> - <column> - <property name="text"> - <string>Window</string> - </property> - </column> - <column> - <property name="text"> - <string>Sequence</string> - </property> - </column> + </property> + <property name="movable"> + <bool>false</bool> + </property> + <widget class="QWidget" name="groupGeneralTab"> + <attribute name="title"> + <string>General</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_8"> + <item> + <widget class="QWidget" name="groupGeneralWidget" native="true"> + <layout class="QGridLayout" name="gridLayout_2" columnstretch="0,0,1"> + <item row="0" column="0"> + <spacer name="groupLeftHorizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Fixed</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item row="0" column="1"> + <widget class="QLabel" name="groupAutotypeTitleLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Autotype</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="0" column="2"> + <widget class="QLabel" name="groupAutotypeLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLabel" name="groupSearchingTitleLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Searching</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="1" column="2"> + <widget class="QLabel" name="groupSearchingLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLabel" name="groupExpirationTitleLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Expiration</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="2" column="2"> + <widget class="QLabel" name="groupExpirationLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="3" column="2"> + <spacer name="groupBottomVerticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + </item> + </layout> + </widget> + <widget class="QWidget" name="groupNotesTab"> + <attribute name="title"> + <string>Notes</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_11"> + <item> + <widget class="QTextEdit" name="groupNotesEdit"> + <property name="focusPolicy"> + <enum>Qt::ClickFocus</enum> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </widget> </widget> </item> </layout> From b264614b9d55f9ab8f1e399d663f632660733385 Mon Sep 17 00:00:00 2001 From: frostasm <frost.asm@gmail.com> Date: Fri, 29 Dec 2017 10:46:16 +0200 Subject: [PATCH 325/402] Use ElidedLabel in DetailsWidget --- src/CMakeLists.txt | 1 + src/gui/DetailsWidget.cpp | 45 +++---------- src/gui/DetailsWidget.h | 5 +- src/gui/DetailsWidget.ui | 65 +++++++++--------- src/gui/widgets/ElidedLabel.cpp | 116 ++++++++++++++++++++++++++++++++ src/gui/widgets/ElidedLabel.h | 61 +++++++++++++++++ 6 files changed, 222 insertions(+), 71 deletions(-) create mode 100644 src/gui/widgets/ElidedLabel.cpp create mode 100644 src/gui/widgets/ElidedLabel.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f00e93531..ccdc955f2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -132,6 +132,7 @@ set(keepassx_SOURCES gui/UnlockDatabaseWidget.cpp gui/UnlockDatabaseDialog.cpp gui/WelcomeWidget.cpp + gui/widgets/ElidedLabel.cpp gui/csvImport/CsvImportWidget.cpp gui/csvImport/CsvImportWizard.cpp gui/csvImport/CsvParserModel.cpp diff --git a/src/gui/DetailsWidget.cpp b/src/gui/DetailsWidget.cpp index 01519cbd0..1ac20c9d8 100644 --- a/src/gui/DetailsWidget.cpp +++ b/src/gui/DetailsWidget.cpp @@ -30,7 +30,6 @@ namespace { constexpr int GeneralTabIndex = 0; -const QString hierarchySeparator(" / "); } DetailsWidget::DetailsWidget(QWidget* parent) @@ -168,25 +167,25 @@ void DetailsWidget::updateEntryGeneralTab() if (!config()->get("security/hidepassworddetails").toBool()) { const QString password = m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->password()); - m_ui->entryPasswordLabel->setText(shortPassword(password)); + m_ui->entryPasswordLabel->setRawText(password); m_ui->entryPasswordLabel->setToolTip(password); } else { - m_ui->entryPasswordLabel->setText(QString("\u25cf").repeated(6)); + m_ui->entryPasswordLabel->setRawText(QString("\u25cf").repeated(6)); + m_ui->entryPasswordLabel->setToolTip({}); } - QString url = m_currentEntry->webUrl(); + const QString url = m_currentEntry->webUrl(); if (!url.isEmpty()) { // URL is well formed and can be opened in a browser // create a new display url that masks password placeholders // the actual link will use the password - url = QString("<a href=\"%1\">%2</a>").arg(url).arg(shortUrl(m_currentEntry->displayUrl())); - m_ui->entryUrlLabel->setOpenExternalLinks(true); + m_ui->entryUrlLabel->setRawText(m_currentEntry->displayUrl()); + m_ui->entryUrlLabel->setUrl(url); } else { // Fallback to the raw url string - url = shortUrl(m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->url())); - m_ui->entryUrlLabel->setOpenExternalLinks(false); + m_ui->entryUrlLabel->setRawText(m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->url())); + m_ui->entryUrlLabel->setUrl({}); } - m_ui->entryUrlLabel->setText(url); const TimeInfo entryTime = m_currentEntry->timeInfo(); const QString expires = entryTime.expires() ? entryTime.expiryTime().toString(Qt::DefaultLocaleShortDate) @@ -251,7 +250,7 @@ void DetailsWidget::updateEntryAutotypeTab() void DetailsWidget::updateGroupHeaderLine() { Q_ASSERT(m_currentGroup); - m_ui->groupTitleLabel->setText(hierarchy(m_currentGroup, QString())); + m_ui->groupTitleLabel->setText(hierarchy(m_currentGroup, {})); m_ui->groupIcon->setPixmap(preparePixmap(m_currentGroup->iconPixmap(), 32)); } @@ -326,33 +325,11 @@ QPixmap DetailsWidget::preparePixmap(const QPixmap& pixmap, int size) return pixmap; } - -QString DetailsWidget::shortUrl(const QString& url) -{ - // TODO: create elided text - QString newurl = ""; - if (url.length() > 60) { - newurl.append(url.left(20)); - newurl.append("…"); - newurl.append(url.right(20)); - return newurl; - } - return url; -} - -QString DetailsWidget::shortPassword(const QString& password) -{ - // TODO: create elided text - if (password.length() > 60) { - return QString("%1…").arg(password.left(60)); - } - return password; -} - QString DetailsWidget::hierarchy(const Group* group, const QString& title) { + const QString separator(" / "); QStringList hierarchy = group->hierarchy(); hierarchy.removeFirst(); hierarchy.append(title); - return QString("%1%2").arg(hierarchySeparator, hierarchy.join(hierarchySeparator)); + return QString("%1%2").arg(separator, hierarchy.join(separator)); } diff --git a/src/gui/DetailsWidget.h b/src/gui/DetailsWidget.h index cc0ac779a..abec33400 100644 --- a/src/gui/DetailsWidget.h +++ b/src/gui/DetailsWidget.h @@ -61,10 +61,9 @@ private slots: void updateTabIndexes(); private: - void setTabEnabled(QTabWidget *tabWidget, QWidget* widget, bool enabled); + void setTabEnabled(QTabWidget* tabWidget, QWidget* widget, bool enabled); + static QPixmap preparePixmap(const QPixmap& pixmap, int size); - static QString shortUrl(const QString& url); - static QString shortPassword(const QString& password); static QString hierarchy(const Group* group, const QString& title); const QScopedPointer<Ui::DetailsWidget> m_ui; diff --git a/src/gui/DetailsWidget.ui b/src/gui/DetailsWidget.ui index 88c84ad43..5446f6510 100644 --- a/src/gui/DetailsWidget.ui +++ b/src/gui/DetailsWidget.ui @@ -152,7 +152,7 @@ <layout class="QVBoxLayout" name="verticalLayout_5"> <item> <widget class="QWidget" name="entryGeneralWidget" native="true"> - <layout class="QGridLayout" name="gridLayout" columnstretch="0,0,1"> + <layout class="QGridLayout" name="gridLayout" rowstretch="0,0,0,0,1" columnstretch="0,0,1"> <item row="0" column="0"> <spacer name="entryLeftHorizontalSpacer"> <property name="orientation"> @@ -196,6 +196,12 @@ </item> <item row="0" column="2"> <widget class="QLabel" name="entryUsernameLabel"> + <property name="minimumSize"> + <size> + <width>100</width> + <height>0</height> + </size> + </property> <property name="textInteractionFlags"> <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set> </property> @@ -224,7 +230,14 @@ </widget> </item> <item row="1" column="2"> - <widget class="QLabel" name="entryPasswordLabel"/> + <widget class="ElidedLabel" name="entryPasswordLabel"> + <property name="minimumSize"> + <size> + <width>100</width> + <height>0</height> + </size> + </property> + </widget> </item> <item row="2" column="1"> <widget class="QLabel" name="entryUrlTitleLabel"> @@ -249,12 +262,12 @@ </widget> </item> <item row="2" column="2"> - <widget class="QLabel" name="entryUrlLabel"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> + <widget class="ElidedLabel" name="entryUrlLabel"> + <property name="minimumSize"> + <size> + <width>100</width> + <height>0</height> + </size> </property> <property name="cursor"> <cursorShape>PointingHandCursor</cursorShape> @@ -297,7 +310,7 @@ <property name="sizeHint" stdset="0"> <size> <width>20</width> - <height>40</height> + <height>10</height> </size> </property> </spacer> @@ -530,14 +543,7 @@ </widget> </item> <item row="0" column="2"> - <widget class="QLabel" name="groupAutotypeLabel"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - </widget> + <widget class="QLabel" name="groupAutotypeLabel"/> </item> <item row="1" column="1"> <widget class="QLabel" name="groupSearchingTitleLabel"> @@ -562,14 +568,7 @@ </widget> </item> <item row="1" column="2"> - <widget class="QLabel" name="groupSearchingLabel"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - </widget> + <widget class="QLabel" name="groupSearchingLabel"/> </item> <item row="2" column="1"> <widget class="QLabel" name="groupExpirationTitleLabel"> @@ -594,14 +593,7 @@ </widget> </item> <item row="2" column="2"> - <widget class="QLabel" name="groupExpirationLabel"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - </widget> + <widget class="QLabel" name="groupExpirationLabel"/> </item> <item row="3" column="2"> <spacer name="groupBottomVerticalSpacer"> @@ -611,7 +603,7 @@ <property name="sizeHint" stdset="0"> <size> <width>20</width> - <height>40</height> + <height>10</height> </size> </property> </spacer> @@ -663,6 +655,11 @@ <header>gui/entry/EntryAttachmentsWidget.h</header> <container>1</container> </customwidget> + <customwidget> + <class>ElidedLabel</class> + <extends>QLabel</extends> + <header>gui/widgets/ElidedLabel.h</header> + </customwidget> </customwidgets> <resources/> <connections/> diff --git a/src/gui/widgets/ElidedLabel.cpp b/src/gui/widgets/ElidedLabel.cpp new file mode 100644 index 000000000..1642bdec8 --- /dev/null +++ b/src/gui/widgets/ElidedLabel.cpp @@ -0,0 +1,116 @@ +/* + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "ElidedLabel.h" + +#include <QResizeEvent> +#include <QDebug> + +namespace { +const QString htmlLinkTemplate("<a href=\"%1\">%2</a>"); +} + +ElidedLabel::ElidedLabel(QWidget* parent, Qt::WindowFlags f) + : QLabel(parent, f) + , m_elideMode(Qt::ElideMiddle) +{ + connect(this, SIGNAL(elideModeChanged(Qt::TextElideMode)), this, SLOT(updateElidedText())); + connect(this, SIGNAL(rawTextChanged(QString)), this, SLOT(updateElidedText())); + connect(this, SIGNAL(urlChanged(QString)), this, SLOT(updateElidedText())); +} + +ElidedLabel::ElidedLabel(const QString& text, QWidget* parent, Qt::WindowFlags f) + : ElidedLabel(parent, f) +{ + setText(text); +} + +Qt::TextElideMode ElidedLabel::elideMode() const +{ + return m_elideMode; +} + +QString ElidedLabel::rawText() const +{ + return m_rawText; +} + +QString ElidedLabel::url() const +{ + return m_url; +} + +void ElidedLabel::setElideMode(Qt::TextElideMode elideMode) +{ + if (m_elideMode == elideMode) + return; + + if (m_elideMode != Qt::ElideNone) { + setWordWrap(false); + } + + m_elideMode = elideMode; + emit elideModeChanged(m_elideMode); +} + +void ElidedLabel::setRawText(const QString& elidedText) +{ + if (m_rawText == elidedText) + return; + + m_rawText = elidedText; + emit rawTextChanged(m_rawText); +} + +void ElidedLabel::setUrl(const QString& url) +{ + if (m_url == url) + return; + + m_url = url; + emit urlChanged(m_url); +} + +void ElidedLabel::clear() +{ + setRawText(QString()); + setElideMode(Qt::ElideMiddle); + setUrl(QString()); + QLabel::clear(); +} + +void ElidedLabel::updateElidedText() +{ + if (m_rawText.isEmpty()) { + QLabel::clear(); + return; + } + + QString displayText = m_rawText; + if (m_elideMode != Qt::ElideNone) { + const QFontMetrics metrix(font()); + displayText = metrix.elidedText(m_rawText, m_elideMode, width() - 2); + } + setText(m_url.isEmpty() ? displayText : htmlLinkTemplate.arg(m_url, displayText)); + setOpenExternalLinks(!m_url.isEmpty()); +} + +void ElidedLabel::resizeEvent(QResizeEvent* event) +{ + updateElidedText(); + QLabel::resizeEvent(event); +} diff --git a/src/gui/widgets/ElidedLabel.h b/src/gui/widgets/ElidedLabel.h new file mode 100644 index 000000000..c7694b5a1 --- /dev/null +++ b/src/gui/widgets/ElidedLabel.h @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef KEEPASSX_ELIDEDLABEL_H +#define KEEPASSX_ELIDEDLABEL_H + +#include <QLabel> + +class QResizeEvent; + +class ElidedLabel : public QLabel +{ + Q_OBJECT + Q_PROPERTY(Qt::TextElideMode elideMode READ elideMode WRITE setElideMode NOTIFY elideModeChanged) + Q_PROPERTY(QString rawText READ rawText WRITE setRawText NOTIFY rawTextChanged) + Q_PROPERTY(QString url READ url WRITE setUrl NOTIFY urlChanged) +public: + explicit ElidedLabel(QWidget *parent=nullptr, Qt::WindowFlags f=Qt::WindowFlags()); + explicit ElidedLabel(const QString &text, QWidget *parent=nullptr, Qt::WindowFlags f=Qt::WindowFlags()); + + Qt::TextElideMode elideMode() const; + QString rawText() const; + QString url() const; + +public slots: + void setElideMode(Qt::TextElideMode elideMode); + void setRawText(const QString& rawText); + void setUrl(const QString& url); + void clear(); + +signals: + void elideModeChanged(Qt::TextElideMode elideMode); + void rawTextChanged(QString rawText); + void urlChanged(QString url); + +private slots: + void updateElidedText(); + +private: + void resizeEvent(QResizeEvent* event); + + Qt::TextElideMode m_elideMode; + QString m_rawText; + QString m_url; +}; + +#endif // KEEPASSX_ELIDEDLABEL_H From cbb70cdc7c714354a9f5af2cf76875dc48e3978a Mon Sep 17 00:00:00 2001 From: Toni Spets <toni.spets@iki.fi> Date: Thu, 1 Feb 2018 19:00:35 +0200 Subject: [PATCH 326/402] SSH Agent: Support old unencrypted DSA and RSA keys --- src/gui/entry/EditEntryWidget.cpp | 4 + src/sshagent/ASN1Key.cpp | 186 ++++++++++++++++++++++++++++++ src/sshagent/ASN1Key.h | 31 +++++ src/sshagent/CMakeLists.txt | 1 + src/sshagent/OpenSSHKey.cpp | 162 +++++++++++++++++--------- src/sshagent/OpenSSHKey.h | 5 + src/sshagent/SSHAgent.cpp | 4 + tests/TestOpenSSHKey.cpp | 72 ++++++++++++ tests/TestOpenSSHKey.h | 2 + 9 files changed, 413 insertions(+), 54 deletions(-) create mode 100644 src/sshagent/ASN1Key.cpp create mode 100644 src/sshagent/ASN1Key.h diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index eef1b5ed8..c146da691 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -444,6 +444,10 @@ bool EditEntryWidget::getOpenSSHKey(OpenSSHKey& key) return false; } + if (key.comment().isEmpty()) { + key.setComment(m_entry->username()); + } + return true; } diff --git a/src/sshagent/ASN1Key.cpp b/src/sshagent/ASN1Key.cpp new file mode 100644 index 000000000..c46b8fa0b --- /dev/null +++ b/src/sshagent/ASN1Key.cpp @@ -0,0 +1,186 @@ +/* + * Copyright (C) 2018 Toni Spets <toni.spets@iki.fi> + * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "ASN1Key.h" +#include <gcrypt.h> + +namespace { + constexpr quint8 TAG_INT = 0x02; + constexpr quint8 TAG_SEQUENCE = 0x30; + constexpr quint8 KEY_ZERO = 0x0; + + bool nextTag(BinaryStream& stream, quint8& tag, quint32& len) + { + stream.read(tag); + + quint8 lenByte; + stream.read(lenByte); + + if (lenByte & 0x80) { + quint32 bytes = lenByte & ~0x80; + if (bytes == 1) { + stream.read(lenByte); + len = lenByte; + } else if (bytes == 2) { + quint16 lenShort; + stream.read(lenShort); + len = lenShort; + } else if (bytes == 4) { + stream.read(len); + } else { + return false; + } + } else { + len = lenByte; + } + + return true; + } + + bool parseHeader(BinaryStream& stream, quint8 wantedType) + { + quint8 tag; + quint32 len; + + nextTag(stream, tag, len); + + if (tag != TAG_SEQUENCE) { + return false; + } + + nextTag(stream, tag, len); + + if (tag != TAG_INT || len != 1) { + return false; + } + + quint8 keyType; + stream.read(keyType); + + return (keyType == wantedType); + } + + bool readInt(BinaryStream& stream, QByteArray& target) + { + quint8 tag; + quint32 len; + + nextTag(stream, tag, len); + + if (tag != TAG_INT) { + return false; + } + + target.resize(len); + stream.read(target); + return true; + } + + QByteArray calculateIqmp(QByteArray& bap, QByteArray& baq) + { + gcry_mpi_t u, p, q; + QByteArray iqmp_hex; + + u = gcry_mpi_snew(bap.length() * 8); + gcry_mpi_scan(&p, GCRYMPI_FMT_HEX, bap.toHex().data(), 0, nullptr); + gcry_mpi_scan(&q, GCRYMPI_FMT_HEX, baq.toHex().data(), 0, nullptr); + + mpi_invm(u, q, p); + + iqmp_hex.resize((bap.length() + 1) * 2); + gcry_mpi_print(GCRYMPI_FMT_HEX, reinterpret_cast<unsigned char*>(iqmp_hex.data()), iqmp_hex.length(), nullptr, u); + + gcry_mpi_release(u); + gcry_mpi_release(p); + gcry_mpi_release(q); + + return QByteArray::fromHex(iqmp_hex); + } +} + +bool ASN1Key::parseDSA(QByteArray& ba, OpenSSHKey& key) +{ + BinaryStream stream(&ba); + + if (!parseHeader(stream, KEY_ZERO)) { + return false; + } + + QByteArray p,q,g,y,x; + readInt(stream, p); + readInt(stream, q); + readInt(stream, g); + readInt(stream, y); + readInt(stream, x); + + QList<QByteArray> publicData; + publicData.append(p); + publicData.append(q); + publicData.append(g); + publicData.append(y); + + QList<QByteArray> privateData; + privateData.append(p); + privateData.append(q); + privateData.append(g); + privateData.append(y); + privateData.append(x); + + key.setType("ssh-dss"); + key.setPublicData(publicData); + key.setPrivateData(privateData); + key.setComment(""); + return true; +} + +bool ASN1Key::parseRSA(QByteArray& ba, OpenSSHKey& key) +{ + BinaryStream stream(&ba); + + if (!parseHeader(stream, KEY_ZERO)) { + return false; + } + + QByteArray n,e,d,p,q,dp,dq,qinv; + readInt(stream, n); + readInt(stream, e); + readInt(stream, d); + readInt(stream, p); + readInt(stream, q); + readInt(stream, dp); + readInt(stream, dq); + readInt(stream, qinv); + + QList<QByteArray> publicData; + publicData.append(e); + publicData.append(n); + + QList<QByteArray> privateData; + privateData.append(n); + privateData.append(e); + privateData.append(d); + privateData.append(calculateIqmp(p, q)); + privateData.append(p); + privateData.append(q); + + key.setType("ssh-rsa"); + key.setPublicData(publicData); + key.setPrivateData(privateData); + key.setComment(""); + return true; +} diff --git a/src/sshagent/ASN1Key.h b/src/sshagent/ASN1Key.h new file mode 100644 index 000000000..59f8d4e81 --- /dev/null +++ b/src/sshagent/ASN1Key.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2018 Toni Spets <toni.spets@iki.fi> + * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef ASN1KEY_H +#define ASN1KEY_H + +#include "OpenSSHKey.h" +#include <QtCore> + +namespace ASN1Key +{ + bool parseDSA(QByteArray& ba, OpenSSHKey& key); + bool parseRSA(QByteArray& ba, OpenSSHKey& key); +} + +#endif // ASN1KEY_H diff --git a/src/sshagent/CMakeLists.txt b/src/sshagent/CMakeLists.txt index 5d2ad6e3b..a612ff076 100644 --- a/src/sshagent/CMakeLists.txt +++ b/src/sshagent/CMakeLists.txt @@ -9,6 +9,7 @@ if(WITH_XC_SSHAGENT) BinaryStream.cpp KeeAgentSettings.cpp OpenSSHKey.cpp + ASN1Key.cpp SSHAgent.cpp ) diff --git a/src/sshagent/OpenSSHKey.cpp b/src/sshagent/OpenSSHKey.cpp index 2c51ee459..808408ab6 100644 --- a/src/sshagent/OpenSSHKey.cpp +++ b/src/sshagent/OpenSSHKey.cpp @@ -17,11 +17,16 @@ */ #include "OpenSSHKey.h" +#include "ASN1Key.h" #include <QRegularExpression> #include <QStringList> #include <QCryptographicHash> #include "crypto/SymmetricCipher.h" +const QString OpenSSHKey::TYPE_DSA = "DSA PRIVATE KEY"; +const QString OpenSSHKey::TYPE_RSA = "RSA PRIVATE KEY"; +const QString OpenSSHKey::TYPE_OPENSSH = "OPENSSH PRIVATE KEY"; + // bcrypt_pbkdf.cpp int bcrypt_pbkdf(const QByteArray& pass, const QByteArray& salt, QByteArray& key, quint32 rounds); @@ -34,6 +39,7 @@ OpenSSHKey::OpenSSHKey(QObject *parent) , m_rawPrivateData(QByteArray()) , m_publicData(QList<QByteArray>()) , m_privateData(QList<QByteArray>()) + , m_privateType(QString()) , m_comment(QString()) , m_error(QString()) { @@ -178,14 +184,31 @@ bool OpenSSHKey::parsePEM(const QByteArray& in, QByteArray& out) return false; } - if (beginMatch.captured(1) != "OPENSSH PRIVATE KEY") { - m_error = tr("This is not an OpenSSH key, only modern keys are supported"); - return false; - } + m_privateType = beginMatch.captured(1); rows.removeFirst(); rows.removeLast(); + QRegularExpression keyValueExpr = QRegularExpression("^([A-Za-z0-9-]+): (.+)$"); + QMap<QString, QString> pemOptions; + + do { + QRegularExpressionMatch keyValueMatch = keyValueExpr.match(rows.first()); + + if (!keyValueMatch.hasMatch()) { + break; + } + + pemOptions.insert(keyValueMatch.captured(1), keyValueMatch.captured(2)); + + rows.removeFirst(); + } while (!rows.isEmpty()); + + if (pemOptions.contains("Proc-Type")) { + m_error = tr("Encrypted keys are not yet supported"); + return false; + } + out = QByteArray::fromBase64(rows.join("").toLatin1()); if (out.isEmpty()) { @@ -204,51 +227,58 @@ bool OpenSSHKey::parse(const QByteArray& in) return false; } - BinaryStream stream(&data); + if (m_privateType == TYPE_DSA || m_privateType == TYPE_RSA) { + m_rawPrivateData = data; + } else if (m_privateType == TYPE_OPENSSH) { + BinaryStream stream(&data); - QByteArray magic; - magic.resize(15); + QByteArray magic; + magic.resize(15); - if (!stream.read(magic)) { - m_error = tr("Key file way too small."); - return false; - } - - if (QString::fromLatin1(magic) != "openssh-key-v1") { - m_error = tr("Key file magic header id invalid"); - return false; - } - - stream.readString(m_cipherName); - stream.readString(m_kdfName); - stream.readString(m_kdfOptions); - - quint32 numberOfKeys; - stream.read(numberOfKeys); - - if (numberOfKeys == 0) { - m_error = tr("Found zero keys"); - return false; - } - - for (quint32 i = 0; i < numberOfKeys; ++i) { - QByteArray publicKey; - if (!stream.readString(publicKey)) { - m_error = tr("Failed to read public key."); + if (!stream.read(magic)) { + m_error = tr("Key file way too small."); return false; } - if (i == 0) { - BinaryStream publicStream(&publicKey); - if (!readPublic(publicStream)) { + if (QString::fromLatin1(magic) != "openssh-key-v1") { + m_error = tr("Key file magic header id invalid"); + return false; + } + + stream.readString(m_cipherName); + stream.readString(m_kdfName); + stream.readString(m_kdfOptions); + + quint32 numberOfKeys; + stream.read(numberOfKeys); + + if (numberOfKeys == 0) { + m_error = tr("Found zero keys"); + return false; + } + + for (quint32 i = 0; i < numberOfKeys; ++i) { + QByteArray publicKey; + if (!stream.readString(publicKey)) { + m_error = tr("Failed to read public key."); return false; } - } - } - // padded list of keys - if (!stream.readString(m_rawPrivateData)) { - m_error = tr("Corrupted key file, reading private key failed"); + if (i == 0) { + BinaryStream publicStream(&publicKey); + if (!readPublic(publicStream)) { + return false; + } + } + } + + // padded list of keys + if (!stream.readString(m_rawPrivateData)) { + m_error = tr("Corrupted key file, reading private key failed"); + return false; + } + } else { + m_error = tr("Unsupported key type: %s").arg(m_privateType); return false; } @@ -283,7 +313,7 @@ bool OpenSSHKey::openPrivateKey(const QString& passphrase) } else if (m_cipherName == "aes256-ctr") { cipher.reset(new SymmetricCipher(SymmetricCipher::Aes256, SymmetricCipher::Ctr, SymmetricCipher::Decrypt)); } else if (m_cipherName != "none") { - m_error = tr("Unknown cipher: ") + m_cipherName; + m_error = tr("Unknown cipher: %s").arg(m_cipherName); return false; } @@ -320,8 +350,13 @@ bool OpenSSHKey::openPrivateKey(const QString& passphrase) ivData.setRawData(decryptKey.data() + cipher->keySize(), cipher->blockSize()); cipher->init(keyData, ivData); + + if (!cipher->init(keyData, ivData)) { + m_error = cipher->errorString(); + return false; + } } else if (m_kdfName != "none") { - m_error = tr("Unknown KDF: ") + m_kdfName; + m_error = tr("Unknown KDF: %s").arg(m_kdfName); return false; } @@ -336,20 +371,39 @@ bool OpenSSHKey::openPrivateKey(const QString& passphrase) } } - BinaryStream keyStream(&rawPrivateData); + if (m_privateType == TYPE_DSA) { + if (!ASN1Key::parseDSA(rawPrivateData, *this)) { + m_error = tr("Reading DSA private key failed, only unencrypted keys are supported at this time"); + return false; + } - quint32 checkInt1; - quint32 checkInt2; + return true; + } else if (m_privateType == TYPE_RSA) { + if (!ASN1Key::parseRSA(rawPrivateData, *this)) { + m_error = tr("Reading RSA private key failed, only unencrypted keys are supported at this time"); + return false; + } - keyStream.read(checkInt1); - keyStream.read(checkInt2); + return true; + } else if (m_privateType == TYPE_OPENSSH) { + BinaryStream keyStream(&rawPrivateData); - if (checkInt1 != checkInt2) { - m_error = tr("Decryption failed, wrong passphrase?"); - return false; + quint32 checkInt1; + quint32 checkInt2; + + keyStream.read(checkInt1); + keyStream.read(checkInt2); + + if (checkInt1 != checkInt2) { + m_error = tr("Decryption failed, wrong passphrase?"); + return false; + } + + return readPrivate(keyStream); } - return readPrivate(keyStream); + m_error = tr("Unsupported key type: %s").arg(m_privateType); + return false; } bool OpenSSHKey::readPublic(BinaryStream& stream) @@ -371,7 +425,7 @@ bool OpenSSHKey::readPublic(BinaryStream& stream) } else if (m_type == "ssh-ed25519") { keyParts = 1; } else { - m_error = tr("Unknown key type: ") + m_type; + m_error = tr("Unknown key type: %s").arg(m_type); return false; } @@ -408,7 +462,7 @@ bool OpenSSHKey::readPrivate(BinaryStream& stream) } else if (m_type == "ssh-ed25519") { keyParts = 2; } else { - m_error = tr("Unknown key type: ") + m_type; + m_error = tr("Unknown key type: %s").arg(m_type); return false; } diff --git a/src/sshagent/OpenSSHKey.h b/src/sshagent/OpenSSHKey.h index eca6c9edd..539d01892 100644 --- a/src/sshagent/OpenSSHKey.h +++ b/src/sshagent/OpenSSHKey.h @@ -55,6 +55,10 @@ public: bool writePrivate(BinaryStream& stream); private: + static const QString TYPE_DSA; + static const QString TYPE_RSA; + static const QString TYPE_OPENSSH; + bool parsePEM(const QByteArray& in, QByteArray& out); QString m_type; @@ -64,6 +68,7 @@ private: QByteArray m_rawPrivateData; QList<QByteArray> m_publicData; QList<QByteArray> m_privateData; + QString m_privateType; QString m_comment; QString m_error; }; diff --git a/src/sshagent/SSHAgent.cpp b/src/sshagent/SSHAgent.cpp index 2424bc97f..a65c6e4f1 100644 --- a/src/sshagent/SSHAgent.cpp +++ b/src/sshagent/SSHAgent.cpp @@ -260,6 +260,10 @@ void SSHAgent::databaseModeChanged(DatabaseWidget::Mode mode) continue; } + if (key.comment().isEmpty()) { + key.setComment(e->username()); + } + if (settings.removeAtDatabaseClose()) { removeIdentityAtLock(key, uuid); } diff --git a/tests/TestOpenSSHKey.cpp b/tests/TestOpenSSHKey.cpp index 55033d7e1..7f94365e7 100644 --- a/tests/TestOpenSSHKey.cpp +++ b/tests/TestOpenSSHKey.cpp @@ -50,6 +50,7 @@ void TestOpenSSHKey::testParse() QCOMPARE(key.cipherName(), QString("none")); QCOMPARE(key.type(), QString("ssh-ed25519")); QCOMPARE(key.comment(), QString("opensshkey-test-parse@keepassxc")); + QCOMPARE(key.fingerprint(), QString("SHA256:D1fVmA15YXzaJ5sdO9dXxo5coHL/pnNaIfCvokHzTA4")); QByteArray publicKey, privateKey; BinaryStream publicStream(&publicKey), privateStream(&privateKey); @@ -61,6 +62,77 @@ void TestOpenSSHKey::testParse() QVERIFY(privateKey.length() == 154); } +void TestOpenSSHKey::testParseDSA() +{ + const QString keyString = QString( + "-----BEGIN DSA PRIVATE KEY-----\n" + "MIIBuwIBAAKBgQCudjbvSh8JxQOr2laCqZM1t4kNWBETVOXz5vgk9iw6Z5opB9/k\n" + "g4nFc1PVq7fdAIc8W/5WCAjugKcxPb9PIHfcwY2fimmiPWFK68/eHKLoCuIn2wxB\n" + "63ig2hAhx5U5aYG9QHkNCaT6VX7rc19nToSeZXlpja4x54/DaQaqOEWYsQIVAOer\n" + "UQWfccz7KXUu6+x7heGob6I3AoGAVDRFJIlL0DI/4nePIcgwgwbfgs2ojSu21g4w\n" + "dQoXvqU34XydPgPQ985XIIuiDkaomRw4yYd/Sh4ZapFcrP++iJ1V+WS6kLcWPHMq\n" + "poYwk8mq6GLbPFLEjr+n6HgX5ln15n3i4WAopNH7mEl0glY9L0rxmcN0XOpqw6Ux\n" + "ETGEfAwCgYAiOeYwblMkkTIGtVx5NvNsOlfrBYL4GqUP9oQMO5I+xLZLWQIf+7Jp\n" + "8t6mwxSBz0RHjNVQ11vZowNjq3587aLy57bVwf2lIm9KSvS6z9HoNbHgQimcBorR\n" + "J9l9RUrj7TnsZgiVw66j2r34nHRHRtggiO+qrMtw7MJc0Q7jiuTmzgIVAMXbk0T9\n" + "nBfSLWQz/L8RexU2GR4e\n" + "-----END DSA PRIVATE KEY-----\n" + ); + + const QByteArray keyData = keyString.toLatin1(); + + OpenSSHKey key; + QVERIFY(key.parse(keyData)); + QVERIFY(!key.encrypted()); + QCOMPARE(key.cipherName(), QString("none")); + QCOMPARE(key.type(), QString("ssh-dss")); + QCOMPARE(key.comment(), QString("")); + QCOMPARE(key.fingerprint(), QString("SHA256:tbbNuLN1hja8JNASDTlLOZQsbTlJDzJlz/oAGK3sX18")); +} + +void TestOpenSSHKey::testParseRSA() +{ + const QString keyString = QString( + "-----BEGIN RSA PRIVATE KEY-----\n" + "MIIEpAIBAAKCAQEAsCHtJicDPWnvHSIKbnTZaJkIB9vgE0pmLdK580JUqBuonVbB\n" + "y1QTy0ZQ7/TtqvLPgwPK88TR46OLO/QGCzo2+XxgJ85uy0xfuyUYRmSuw0drsErN\n" + "mH8vU91lSBxsGDp9LtBbgHKoR23vMWZ34IxFRc55XphrIH48ijsMaL6bXBwF/3tD\n" + "9T3lm2MpP1huyVNnIY9+GRRWCy4f9LMj/UGu/n4RtwwfpOZBBRwYkq5QkzA9lPm/\n" + "VzF3MP1rKTMkvAw+Nfb383mkmc6MRnsa6uh6iDa9aVB7naegM13UJQX/PY1Ks6pO\n" + "XDpy/MQ7iCh+HmYNq5dRmARyaNl9xIXJNhz1cQIDAQABAoIBAQCnEUc1LUQxeM5K\n" + "wANNCqE+SgoIClPdeHC7fmrLh1ttqe6ib6ybBUFRS31yXs0hnfefunVEDKlaV8K2\n" + "N52UAMAsngFHQNRvGh6kEWeZPd9Xc+N98TZbNCjcT+DGKc+Om8wqH5DrodZlCq4c\n" + "GaoT4HnE4TjWtZTH2XXrWF9I66PKFWf070R44nvyVcvaZi4pC2YmURRPuGF6K1iK\n" + "dH8zM6HHG1UGu2W6hLNn+K01IulG0Lb8eWNaNYMmtQWaxyp7I2IWkkecUs3nCuiR\n" + "byFOoomCjdh8r9yZFvwxjGUhgtkALN9GCU0Mwve+s11IB2gevruN+q9/Qejbyfdm\n" + "IlgLAeTRAoGBANRcVzW9CYeobCf+U9hKJFEOur8XO+J2mTMaELA0EjWpTJFAeIT7\n" + "KeRpCRG4/vOSklxxRF6vP1EACA4Z+5BlN+FTipHHs+bSEgqkPZiiANDH7Zot5Iqv\n" + "1q0fRyldNRZNZK7DWp08BPNVWGA/EnEuKJiURxnxBaxNXbUyMCdjxvMvAoGBANRT\n" + "utbrqS/bAa/DcHKn3V6DRqBl3TDOfvCNjiKC84a67F2uXgzLIdMktr4d1NyCZVJd\n" + "7/zVgWORLIdg1eAi6rYGoOvNV39wwga7CF+m9sBY0wAaKYCELe6L26r4aQHVCX6n\n" + "rnIgUv+4o4itmU2iP0r3wlmDC9pDRQP82vfvQPlfAoGASwhleANW/quvq2HdViq8\n" + "Mje2HBalfhrRfpDTHK8JUBSFjTzuWG42GxJRtgVbb8x2ElujAKGDCaetMO5VSGu7\n" + "Fs5hw6iAFCpdXY0yhl+XUi2R8kwM2EPQ4lKO3jqkq0ClNmqn9a5jQWcCVt9yMLNS\n" + "fLbHeI8EpiCf34ngIcrLXNkCgYEAzlcEZuKkC46xB+dNew8pMTUwSKZVm53BfPKD\n" + "44QRN6imFbBjU9mAaJnwQbfp6dWKs834cGPolyM4++MeVfB42iZ88ksesgmZdUMD\n" + "szkl6O0pOJs0I+HQZVdjRbadDZvD22MHQ3+oST1dJ3FVXz3Cdo9qPuT8esMO6f4r\n" + "qfDH2s8CgYAXC/lWWHQ//PGP0pH4oiEXisx1K0X1u0xMGgrChxBRGRiKZUwNMIvJ\n" + "TqUu7IKizK19cLHF/NBvxHYHFw+m7puNjn6T1RtRCUjRZT7Dx1VHfVosL9ih5DA8\n" + "tpbZA5KGKcvHtB5DDgT0MHwzBZnb4Q//Rhovzn+HXZPsJTTgHHy3NQ==\n" + "-----END RSA PRIVATE KEY-----\n" + ); + + const QByteArray keyData = keyString.toLatin1(); + + OpenSSHKey key; + QVERIFY(key.parse(keyData)); + QVERIFY(!key.encrypted()); + QCOMPARE(key.cipherName(), QString("none")); + QCOMPARE(key.type(), QString("ssh-rsa")); + QCOMPARE(key.comment(), QString("")); + QCOMPARE(key.fingerprint(), QString("SHA256:DYdaZciYNxCejr+/8x+OKYxeTU1D5UsuIFUG4PWRFkk")); +} + void TestOpenSSHKey::testDecryptAES256CBC() { const QString keyString = QString( diff --git a/tests/TestOpenSSHKey.h b/tests/TestOpenSSHKey.h index f2d6d1fb9..6c2041074 100644 --- a/tests/TestOpenSSHKey.h +++ b/tests/TestOpenSSHKey.h @@ -29,6 +29,8 @@ class TestOpenSSHKey : public QObject private slots: void initTestCase(); void testParse(); + void testParseDSA(); + void testParseRSA(); void testDecryptAES256CBC(); void testDecryptAES256CTR(); }; From 78e962e30a1c232c0ce07637c0d9f2636c76141a Mon Sep 17 00:00:00 2001 From: Matthew Thode <mthode@mthode.org> Date: Sun, 4 Feb 2018 15:43:45 -0600 Subject: [PATCH 327/402] Fix keepass-browser based popups on tiling WMs If we set the window flags after showing/activating the window the window will not pop up. Fixes: https://github.com/keepassxreboot/keepassxc/issues/1452 --- src/browser/BrowserService.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/browser/BrowserService.cpp b/src/browser/BrowserService.cpp index 0a0ff2961..fb89e8bcb 100644 --- a/src/browser/BrowserService.cpp +++ b/src/browser/BrowserService.cpp @@ -188,10 +188,10 @@ QString BrowserService::storeKey(const QString& key) "If you would like to allow it access to your KeePassXC database,\n" "give it a unique name to identify and accept it.")); keyDialog.setOkButtonText(tr("Save and allow access")); + keyDialog.setWindowFlags(keyDialog.windowFlags() | Qt::WindowStaysOnTopHint); keyDialog.show(); keyDialog.activateWindow(); keyDialog.raise(); - keyDialog.setWindowFlags(keyDialog.windowFlags() | Qt::WindowStaysOnTopHint); auto ok = keyDialog.exec(); id = keyDialog.textValue(); From a8471f161781ff0a1cdc496c2b46d7bfebf15757 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sun, 4 Feb 2018 22:55:07 +0100 Subject: [PATCH 328/402] Re-add QStandardPaths include to fix compilation error on macOS, resolves #1455 --- src/core/Config.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/core/Config.cpp b/src/core/Config.cpp index c83c1e720..461ab1f74 100644 --- a/src/core/Config.cpp +++ b/src/core/Config.cpp @@ -22,6 +22,7 @@ #include <QDir> #include <QSettings> #include <QTemporaryFile> +#include <QStandardPaths> Config* Config::m_instance(nullptr); From 065a85e05c9422df33a936b30f871abb8655b5f4 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Tue, 16 Jan 2018 17:23:29 +0100 Subject: [PATCH 329/402] fix effective autotype sequence --- src/core/Entry.cpp | 38 ++++++++++---------- src/core/Group.cpp | 4 +++ tests/TestAutoType.cpp | 80 ++++++++++++++++++++++++++++++++++++++++++ tests/TestAutoType.h | 1 + 4 files changed, 103 insertions(+), 20 deletions(-) diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index d30adeeca..951c2184b 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -218,31 +218,29 @@ QString Entry::defaultAutoTypeSequence() const return m_data.defaultAutoTypeSequence; } +/** + * Determine the effective sequence that will be injected + * This function return an empty string if a parent group has autotype disabled or if the entry has no parent + */ QString Entry::effectiveAutoTypeSequence() const { + if (autoTypeEnabled() == false) { + return QString(); + } + + const Group* parent = group(); + if (!parent) { + return QString(); + } + + QString sequence = parent->effectiveAutoTypeSequence(); + if (sequence.isEmpty()) { + return QString(); + } + if (!m_data.defaultAutoTypeSequence.isEmpty()) { return m_data.defaultAutoTypeSequence; } - QString sequence; - - const Group* grp = group(); - if(grp) { - sequence = grp->effectiveAutoTypeSequence(); - } else { - return QString(); - } - - if (sequence.isEmpty() && (!username().isEmpty() || !password().isEmpty())) { - if (username().isEmpty()) { - sequence = "{PASSWORD}{ENTER}"; - } - else if (password().isEmpty()) { - sequence = "{USERNAME}{ENTER}"; - } - else { - sequence = "{USERNAME}{TAB}{PASSWORD}{ENTER}"; - } - } return sequence; } diff --git a/src/core/Group.cpp b/src/core/Group.cpp index bdcfeff73..e75f45268 100644 --- a/src/core/Group.cpp +++ b/src/core/Group.cpp @@ -192,6 +192,10 @@ QString Group::defaultAutoTypeSequence() const return m_data.defaultAutoTypeSequence; } +/** + * Determine the effective sequence that will be injected + * This function return an empty string if the current group or any parent has autotype disabled + */ QString Group::effectiveAutoTypeSequence() const { QString sequence; diff --git a/tests/TestAutoType.cpp b/tests/TestAutoType.cpp index 9d2f063e8..7d26a6afe 100644 --- a/tests/TestAutoType.cpp +++ b/tests/TestAutoType.cpp @@ -310,4 +310,84 @@ void TestAutoType::testAutoTypeSyntaxChecks() QCOMPARE(true, AutoType::checkHighRepetition("{LEFT 50000000}")); QCOMPARE(false, AutoType::checkHighRepetition("{SPACE 10}{TAB 3}{RIGHT 50}")); QCOMPARE(false, AutoType::checkHighRepetition("{delay 5000000000}")); +} + +void TestAutoType::testAutoTypeEffectiveSequences() +{ + QString defaultSequence("{USERNAME}{TAB}{PASSWORD}{ENTER}"); + QString sequenceG1("{TEST_GROUP1}"); + QString sequenceG3("{TEST_GROUP3}"); + QString sequenceE2("{TEST_ENTRY2}"); + QString sequenceDisabled("{TEST_DISABLED}"); + QString sequenceOrphan("{TEST_ORPHAN}"); + + Database* db = new Database(); + QPointer<Group> rootGroup = db->rootGroup(); + + // Group with autotype enabled and custom default sequence + QPointer<Group> group1 = new Group(); + group1->setParent(rootGroup); + group1->setDefaultAutoTypeSequence(sequenceG1); + + // Child group with inherit + QPointer<Group> group2 = new Group(); + group2->setParent(group1); + + // Group with autotype disabled and custom default sequence + QPointer<Group> group3 = new Group(); + group3->setParent(group1); + group3->setAutoTypeEnabled(Group::Disable); + group3->setDefaultAutoTypeSequence(sequenceG3); + + QCOMPARE(rootGroup->defaultAutoTypeSequence(), QString()); + QCOMPARE(rootGroup->effectiveAutoTypeSequence(), defaultSequence); + QCOMPARE(group1->defaultAutoTypeSequence(), sequenceG1); + QCOMPARE(group1->effectiveAutoTypeSequence(), sequenceG1); + QCOMPARE(group2->defaultAutoTypeSequence(), QString()); + QCOMPARE(group2->effectiveAutoTypeSequence(), sequenceG1); + QCOMPARE(group3->defaultAutoTypeSequence(), sequenceG3); + QCOMPARE(group3->effectiveAutoTypeSequence(), QString()); + + // Entry from root group + QPointer<Entry> entry1 = new Entry(); + entry1->setGroup(rootGroup); + + // Entry with custom default sequence + QPointer<Entry> entry2 = new Entry(); + entry2->setDefaultAutoTypeSequence(sequenceE2); + entry2->setGroup(rootGroup); + + // Entry from enabled child group + QPointer<Entry> entry3 = new Entry(); + entry3->setGroup(group2); + + // Entry from disabled group + QPointer<Entry> entry4 = new Entry(); + entry4->setDefaultAutoTypeSequence(sequenceDisabled); + entry4->setGroup(group3); + + // Entry from enabled group with disabled autotype + QPointer<Entry> entry5 = new Entry(); + entry5->setGroup(group2); + entry5->setDefaultAutoTypeSequence(sequenceDisabled); + entry5->setAutoTypeEnabled(false); + + // Entry with no parent + QPointer<Entry> entry6 = new Entry(); + entry6->setDefaultAutoTypeSequence(sequenceOrphan); + + QCOMPARE(entry1->defaultAutoTypeSequence(), QString()); + QCOMPARE(entry1->effectiveAutoTypeSequence(), defaultSequence); + QCOMPARE(entry2->defaultAutoTypeSequence(), sequenceE2); + QCOMPARE(entry2->effectiveAutoTypeSequence(), sequenceE2); + QCOMPARE(entry3->defaultAutoTypeSequence(), QString()); + QCOMPARE(entry3->effectiveAutoTypeSequence(), sequenceG1); + QCOMPARE(entry4->defaultAutoTypeSequence(), sequenceDisabled); + QCOMPARE(entry4->effectiveAutoTypeSequence(), QString()); + QCOMPARE(entry5->defaultAutoTypeSequence(), sequenceDisabled); + QCOMPARE(entry5->effectiveAutoTypeSequence(), QString()); + QCOMPARE(entry6->defaultAutoTypeSequence(), sequenceOrphan); + QCOMPARE(entry6->effectiveAutoTypeSequence(), QString()); + + delete db; } \ No newline at end of file diff --git a/tests/TestAutoType.h b/tests/TestAutoType.h index b7c33823b..516481282 100644 --- a/tests/TestAutoType.h +++ b/tests/TestAutoType.h @@ -48,6 +48,7 @@ private slots: void testGlobalAutoTypeTitleMatchDisabled(); void testGlobalAutoTypeRegExp(); void testAutoTypeSyntaxChecks(); + void testAutoTypeEffectiveSequences(); private: AutoTypePlatformInterface* m_platform; From b5cabbeb43fb655a93d2a4cd14fc98a40e356f58 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Tue, 16 Jan 2018 22:05:58 +0100 Subject: [PATCH 330/402] add support for multiple autotype sequence, fix #559 --- src/CMakeLists.txt | 3 + src/autotype/AutoType.cpp | 96 +++++------- src/autotype/AutoType.h | 6 +- src/autotype/AutoTypeSelectDialog.cpp | 31 ++-- src/autotype/AutoTypeSelectDialog.h | 14 +- src/autotype/AutoTypeSelectView.cpp | 11 +- src/autotype/AutoTypeSelectView.h | 8 +- src/core/AutoTypeMatch.cpp | 39 +++++ src/core/AutoTypeMatch.h | 41 ++++++ src/gui/entry/AutoTypeMatchModel.cpp | 202 ++++++++++++++++++++++++++ src/gui/entry/AutoTypeMatchModel.h | 66 +++++++++ src/gui/entry/AutoTypeMatchView.cpp | 116 +++++++++++++++ src/gui/entry/AutoTypeMatchView.h | 58 ++++++++ 13 files changed, 599 insertions(+), 92 deletions(-) create mode 100644 src/core/AutoTypeMatch.cpp create mode 100644 src/core/AutoTypeMatch.h create mode 100644 src/gui/entry/AutoTypeMatchModel.cpp create mode 100644 src/gui/entry/AutoTypeMatchModel.h create mode 100644 src/gui/entry/AutoTypeMatchView.cpp create mode 100644 src/gui/entry/AutoTypeMatchView.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ccdc955f2..4b7c07cd6 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -39,6 +39,7 @@ configure_file(version.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/version.h @ONLY) set(keepassx_SOURCES core/AutoTypeAssociations.cpp core/AsyncTask.h + core/AutoTypeMatch.cpp core/Config.cpp core/CsvParser.cpp core/Database.cpp @@ -137,6 +138,8 @@ set(keepassx_SOURCES gui/csvImport/CsvImportWizard.cpp gui/csvImport/CsvParserModel.cpp gui/entry/AutoTypeAssociationsModel.cpp + gui/entry/AutoTypeMatchModel.cpp + gui/entry/AutoTypeMatchView.cpp gui/entry/EditEntryWidget.cpp gui/entry/EditEntryWidget_p.h gui/entry/EntryAttachmentsModel.cpp diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp index 2a77c4c1d..e3b5b54c0 100644 --- a/src/autotype/AutoType.cpp +++ b/src/autotype/AutoType.cpp @@ -27,6 +27,7 @@ #include "autotype/AutoTypePlatformPlugin.h" #include "autotype/AutoTypeSelectDialog.h" #include "autotype/WildcardMatcher.h" +#include "core/AutoTypeMatch.h" #include "core/Config.h" #include "core/Database.h" #include "core/Entry.h" @@ -136,7 +137,12 @@ void AutoType::executeAutoTypeActions(const Entry* entry, QWidget* hideWindow, c QString sequence; if (customSequence.isEmpty()) { - sequence = autoTypeSequence(entry); + QList<QString> sequences = autoTypeSequences(entry); + if(sequences.isEmpty()) { + sequence = ""; + } else { + sequence = sequences.first(); + } } else { sequence = customSequence; } @@ -199,36 +205,36 @@ void AutoType::performGlobalAutoType(const QList<Database*>& dbList) m_inAutoType = true; - QList<Entry*> entryList; - QHash<Entry*, QString> sequenceHash; + QList<AutoTypeMatch> matchList; for (Database* db : dbList) { const QList<Entry*> dbEntries = db->rootGroup()->entriesRecursive(); for (Entry* entry : dbEntries) { - QString sequence = autoTypeSequence(entry, windowTitle); - if (!sequence.isEmpty()) { - entryList << entry; - sequenceHash.insert(entry, sequence); + const QList<QString> sequences = autoTypeSequences(entry, windowTitle); + for (QString sequence : sequences) { + if (!sequence.isEmpty()) { + matchList << AutoTypeMatch(entry,sequence); + } } } } - if (entryList.isEmpty()) { + if (matchList.isEmpty()) { m_inAutoType = false; QString message = tr("Couldn't find an entry that matches the window title:"); message.append("\n\n"); message.append(windowTitle); MessageBox::information(nullptr, tr("Auto-Type - KeePassXC"), message); - } else if ((entryList.size() == 1) && !config()->get("security/autotypeask").toBool()) { + } else if ((matchList.size() == 1) && !config()->get("security/autotypeask").toBool()) { m_inAutoType = false; - performAutoType(entryList.first(), nullptr, sequenceHash[entryList.first()]); + performAutoType(matchList.first().entry, nullptr, matchList.first().sequence); } else { m_windowFromGlobal = m_plugin->activeWindow(); AutoTypeSelectDialog* selectDialog = new AutoTypeSelectDialog(); - connect( - selectDialog, SIGNAL(entryActivated(Entry*, QString)), SLOT(performAutoTypeFromGlobal(Entry*, QString))); + connect(selectDialog, SIGNAL(matchActivated(AutoTypeMatch)), + SLOT(performAutoTypeFromGlobal(AutoTypeMatch))); connect(selectDialog, SIGNAL(rejected()), SLOT(resetInAutoType())); - selectDialog->setEntries(entryList, sequenceHash); + selectDialog->setMatchList(matchList); #if defined(Q_OS_MAC) m_plugin->raiseOwnWindow(); Tools::wait(500); @@ -239,7 +245,7 @@ void AutoType::performGlobalAutoType(const QList<Database*>& dbList) } } -void AutoType::performAutoTypeFromGlobal(Entry* entry, const QString& sequence) +void AutoType::performAutoTypeFromGlobal(AutoTypeMatch match) { Q_ASSERT(m_inAutoType); @@ -247,7 +253,7 @@ void AutoType::performAutoTypeFromGlobal(Entry* entry, const QString& sequence) m_inAutoType = false; - performAutoType(entry, nullptr, sequence, m_windowFromGlobal); + performAutoType(match.entry, nullptr, match.sequence, m_windowFromGlobal); } void AutoType::resetInAutoType() @@ -506,78 +512,56 @@ QList<AutoTypeAction*> AutoType::createActionFromTemplate(const QString& tmpl, c return list; } -QString AutoType::autoTypeSequence(const Entry* entry, const QString& windowTitle) +QList<QString> AutoType::autoTypeSequences(const Entry* entry, const QString& windowTitle) { + QList<QString> sequenceList; + if (!entry->autoTypeEnabled()) { - return QString(); + return sequenceList; } - bool enableSet = false; - QString sequence; if (!windowTitle.isEmpty()) { - bool match = false; const QList<AutoTypeAssociations::Association> assocList = entry->autoTypeAssociations()->getAll(); for (const AutoTypeAssociations::Association& assoc : assocList) { const QString window = entry->resolveMultiplePlaceholders(assoc.window); if (windowMatches(windowTitle, window)) { if (!assoc.sequence.isEmpty()) { - sequence = assoc.sequence; + sequenceList.append(assoc.sequence); } else { - sequence = entry->defaultAutoTypeSequence(); + sequenceList.append(entry->effectiveAutoTypeSequence()); } - match = true; - break; } } - if (!match && config()->get("AutoTypeEntryTitleMatch").toBool() && + if (config()->get("AutoTypeEntryTitleMatch").toBool() && windowMatchesTitle(windowTitle, entry->resolvePlaceholder(entry->title()))) { - sequence = entry->defaultAutoTypeSequence(); - match = true; + sequenceList.append(entry->effectiveAutoTypeSequence()); } - if (!match && config()->get("AutoTypeEntryURLMatch").toBool() && + if (config()->get("AutoTypeEntryURLMatch").toBool() && windowMatchesUrl(windowTitle, entry->resolvePlaceholder(entry->url()))) { - sequence = entry->defaultAutoTypeSequence(); - match = true; + sequenceList.append(entry->effectiveAutoTypeSequence()); } - if (!match) { - return QString(); + if (sequenceList.isEmpty()) { + return sequenceList; } } else { - sequence = entry->defaultAutoTypeSequence(); + sequenceList.append(entry->effectiveAutoTypeSequence()); } const Group* group = entry->group(); do { - if (!enableSet) { - if (group->autoTypeEnabled() == Group::Disable) { - return QString(); - } else if (group->autoTypeEnabled() == Group::Enable) { - enableSet = true; - } + if (group->autoTypeEnabled() == Group::Disable) { + return QList<QString>(); + } else if (group->autoTypeEnabled() == Group::Enable) { + return sequenceList; } - - if (sequence.isEmpty()) { - sequence = group->defaultAutoTypeSequence(); - } - group = group->parentGroup(); - } while (group && (!enableSet || sequence.isEmpty())); - if (sequence.isEmpty() && (!entry->resolvePlaceholder(entry->username()).isEmpty() || - !entry->resolvePlaceholder(entry->password()).isEmpty())) { - if (entry->resolvePlaceholder(entry->username()).isEmpty()) { - sequence = "{PASSWORD}{ENTER}"; - } else if (entry->resolvePlaceholder(entry->password()).isEmpty()) { - sequence = "{USERNAME}{ENTER}"; - } else { - sequence = "{USERNAME}{TAB}{PASSWORD}{ENTER}"; - } - } + } while (group); - return sequence; + return sequenceList; } bool AutoType::windowMatches(const QString& windowTitle, const QString& windowPattern) diff --git a/src/autotype/AutoType.h b/src/autotype/AutoType.h index eb366ae9c..5c89b4fa6 100644 --- a/src/autotype/AutoType.h +++ b/src/autotype/AutoType.h @@ -23,6 +23,8 @@ #include <QStringList> #include <QWidget> +#include "core/AutoTypeMatch.h" + class AutoTypeAction; class AutoTypeExecutor; class AutoTypePlatformInterface; @@ -69,7 +71,7 @@ signals: void globalShortcutTriggered(); private slots: - void performAutoTypeFromGlobal(Entry* entry, const QString& sequence); + void performAutoTypeFromGlobal(AutoTypeMatch match); void resetInAutoType(); void unloadPlugin(); @@ -79,7 +81,7 @@ private: void loadPlugin(const QString& pluginPath); bool parseActions(const QString& sequence, const Entry* entry, QList<AutoTypeAction*>& actions); QList<AutoTypeAction*> createActionFromTemplate(const QString& tmpl, const Entry* entry); - QString autoTypeSequence(const Entry* entry, const QString& windowTitle = QString()); + QList<QString> autoTypeSequences(const Entry* entry, const QString& windowTitle = QString()); bool windowMatchesTitle(const QString& windowTitle, const QString& resolvedTitle); bool windowMatchesUrl(const QString& windowTitle, const QString& resolvedUrl); bool windowMatches(const QString& windowTitle, const QString& windowPattern); diff --git a/src/autotype/AutoTypeSelectDialog.cpp b/src/autotype/AutoTypeSelectDialog.cpp index b39c78e1d..3ef086481 100644 --- a/src/autotype/AutoTypeSelectDialog.cpp +++ b/src/autotype/AutoTypeSelectDialog.cpp @@ -1,5 +1,6 @@ /* * Copyright (C) 2012 Felix Geyer <debfx@fobos.de> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,14 +26,15 @@ #include <QVBoxLayout> #include "autotype/AutoTypeSelectView.h" +#include "core/AutoTypeMatch.h" #include "core/Config.h" #include "core/FilePath.h" -#include "gui/entry/EntryModel.h" +#include "gui/entry/AutoTypeMatchModel.h" AutoTypeSelectDialog::AutoTypeSelectDialog(QWidget* parent) : QDialog(parent) , m_view(new AutoTypeSelectView(this)) - , m_entryActivatedEmitted(false) + , m_matchActivatedEmitted(false) { setAttribute(Qt::WA_DeleteOnClose); // Places the window on the active (virtual) desktop instead of where the main window is. @@ -42,7 +44,7 @@ AutoTypeSelectDialog::AutoTypeSelectDialog(QWidget* parent) setWindowIcon(filePath()->applicationIcon()); QRect screenGeometry = QApplication::desktop()->availableGeometry(QCursor::pos()); - QSize size = config()->get("GUI/AutoTypeSelectDialogSize", QSize(400, 250)).toSize(); + QSize size = config()->get("GUI/AutoTypeSelectDialogSize", QSize(600, 250)).toSize(); size.setWidth(qMin(size.width(), screenGeometry.width())); size.setHeight(qMin(size.height(), screenGeometry.height())); resize(size); @@ -56,10 +58,10 @@ AutoTypeSelectDialog::AutoTypeSelectDialog(QWidget* parent) QLabel* descriptionLabel = new QLabel(tr("Select entry to Auto-Type:"), this); layout->addWidget(descriptionLabel); - connect(m_view, SIGNAL(activated(QModelIndex)), SLOT(emitEntryActivated(QModelIndex))); - connect(m_view, SIGNAL(clicked(QModelIndex)), SLOT(emitEntryActivated(QModelIndex))); + connect(m_view, SIGNAL(activated(QModelIndex)), SLOT(emitMatchActivated(QModelIndex))); + connect(m_view, SIGNAL(clicked(QModelIndex)), SLOT(emitMatchActivated(QModelIndex))); + connect(m_view->model(), SIGNAL(rowsRemoved(QModelIndex,int,int)), SLOT(matchRemoved())); connect(m_view, SIGNAL(rejected()), SLOT(reject())); - connect(m_view->model(), SIGNAL(rowsRemoved(QModelIndex,int,int)), SLOT(entryRemoved())); layout->addWidget(m_view); QDialogButtonBox* buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel, Qt::Horizontal, this); @@ -67,10 +69,9 @@ AutoTypeSelectDialog::AutoTypeSelectDialog(QWidget* parent) layout->addWidget(buttonBox); } -void AutoTypeSelectDialog::setEntries(const QList<Entry*>& entries, const QHash<Entry*, QString>& sequences) +void AutoTypeSelectDialog::setMatchList(const QList<AutoTypeMatch>& matchList) { - m_sequences = sequences; - m_view->setEntryList(entries); + m_view->setMatchList(matchList); m_view->header()->resizeSections(QHeaderView::ResizeToContents); } @@ -82,20 +83,20 @@ void AutoTypeSelectDialog::done(int r) QDialog::done(r); } -void AutoTypeSelectDialog::emitEntryActivated(const QModelIndex& index) +void AutoTypeSelectDialog::emitMatchActivated(const QModelIndex& index) { // make sure we don't emit the signal twice when both activated() and clicked() are triggered - if (m_entryActivatedEmitted) { + if (m_matchActivatedEmitted) { return; } - m_entryActivatedEmitted = true; + m_matchActivatedEmitted = true; - Entry* entry = m_view->entryFromIndex(index); + AutoTypeMatch match = m_view->matchFromIndex(index); accept(); - emit entryActivated(entry, m_sequences[entry]); + emit matchActivated(match); } -void AutoTypeSelectDialog::entryRemoved() +void AutoTypeSelectDialog::matchRemoved() { if (m_view->model()->rowCount() == 0) { reject(); diff --git a/src/autotype/AutoTypeSelectDialog.h b/src/autotype/AutoTypeSelectDialog.h index 3d9c684ed..83abd2d80 100644 --- a/src/autotype/AutoTypeSelectDialog.h +++ b/src/autotype/AutoTypeSelectDialog.h @@ -22,8 +22,9 @@ #include <QDialog> #include <QHash> +#include "core/AutoTypeMatch.h" + class AutoTypeSelectView; -class Entry; class AutoTypeSelectDialog : public QDialog { @@ -31,22 +32,21 @@ class AutoTypeSelectDialog : public QDialog public: explicit AutoTypeSelectDialog(QWidget* parent = nullptr); - void setEntries(const QList<Entry*>& entries, const QHash<Entry*, QString>& sequences); + void setMatchList(const QList<AutoTypeMatch>& matchList); signals: - void entryActivated(Entry* entry, const QString& sequence); + void matchActivated(AutoTypeMatch match); public slots: void done(int r) override; private slots: - void emitEntryActivated(const QModelIndex& index); - void entryRemoved(); + void emitMatchActivated(const QModelIndex& index); + void matchRemoved(); private: AutoTypeSelectView* const m_view; - QHash<Entry*, QString> m_sequences; - bool m_entryActivatedEmitted; + bool m_matchActivatedEmitted; }; #endif // KEEPASSX_AUTOTYPESELECTDIALOG_H diff --git a/src/autotype/AutoTypeSelectView.cpp b/src/autotype/AutoTypeSelectView.cpp index 7d9db4130..e4dba0515 100644 --- a/src/autotype/AutoTypeSelectView.cpp +++ b/src/autotype/AutoTypeSelectView.cpp @@ -21,15 +21,12 @@ #include <QMouseEvent> AutoTypeSelectView::AutoTypeSelectView(QWidget* parent) - : EntryView(parent) + : AutoTypeMatchView(parent) { - hideColumn(3); setMouseTracking(true); setAllColumnsShowFocus(true); - setDragEnabled(false); - setSelectionMode(QAbstractItemView::SingleSelection); - connect(model(), SIGNAL(modelReset()), SLOT(selectFirstEntry())); + connect(model(), SIGNAL(modelReset()), SLOT(selectFirstMatch())); } void AutoTypeSelectView::mouseMoveEvent(QMouseEvent* event) @@ -44,10 +41,10 @@ void AutoTypeSelectView::mouseMoveEvent(QMouseEvent* event) unsetCursor(); } - EntryView::mouseMoveEvent(event); + AutoTypeMatchView::mouseMoveEvent(event); } -void AutoTypeSelectView::selectFirstEntry() +void AutoTypeSelectView::selectFirstMatch() { QModelIndex index = model()->index(0, 0); diff --git a/src/autotype/AutoTypeSelectView.h b/src/autotype/AutoTypeSelectView.h index aadf99fa6..e6a2ec652 100644 --- a/src/autotype/AutoTypeSelectView.h +++ b/src/autotype/AutoTypeSelectView.h @@ -18,11 +18,9 @@ #ifndef KEEPASSX_AUTOTYPESELECTVIEW_H #define KEEPASSX_AUTOTYPESELECTVIEW_H -#include "gui/entry/EntryView.h" +#include "gui/entry/AutoTypeMatchView.h" -class Entry; - -class AutoTypeSelectView : public EntryView +class AutoTypeSelectView : public AutoTypeMatchView { Q_OBJECT @@ -34,7 +32,7 @@ protected: void keyReleaseEvent(QKeyEvent* e) override; private slots: - void selectFirstEntry(); + void selectFirstMatch(); signals: void rejected(); diff --git a/src/core/AutoTypeMatch.cpp b/src/core/AutoTypeMatch.cpp new file mode 100644 index 000000000..c1faab9e6 --- /dev/null +++ b/src/core/AutoTypeMatch.cpp @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2015 David Wu <lightvector@gmail.com> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "AutoTypeMatch.h" + +AutoTypeMatch::AutoTypeMatch() + : entry(nullptr), + sequence() +{} + +AutoTypeMatch::AutoTypeMatch(Entry* entry, QString sequence) + : entry(entry), + sequence(sequence) +{} + +bool AutoTypeMatch::operator==(const AutoTypeMatch& other) const +{ + return entry == other.entry && sequence == other.sequence; +} + +bool AutoTypeMatch::operator!=(const AutoTypeMatch& other) const +{ + return entry != other.entry || sequence != other.sequence; +} diff --git a/src/core/AutoTypeMatch.h b/src/core/AutoTypeMatch.h new file mode 100644 index 000000000..768cf1682 --- /dev/null +++ b/src/core/AutoTypeMatch.h @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2015 David Wu <lightvector@gmail.com> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef KEEPASSX_AUTOTYPEMATCH_H +#define KEEPASSX_AUTOTYPEMATCH_H + +#include <QObject> +#include <QString> + +class Entry; + +struct AutoTypeMatch +{ + Entry* entry; + QString sequence; + + AutoTypeMatch(); + AutoTypeMatch(Entry* entry, QString sequence); + + bool operator==(const AutoTypeMatch& other) const; + bool operator!=(const AutoTypeMatch& other) const; +}; + +Q_DECLARE_TYPEINFO(AutoTypeMatch, Q_MOVABLE_TYPE); + +#endif // KEEPASSX_AUTOTYPEMATCH_H diff --git a/src/gui/entry/AutoTypeMatchModel.cpp b/src/gui/entry/AutoTypeMatchModel.cpp new file mode 100644 index 000000000..3a48e1737 --- /dev/null +++ b/src/gui/entry/AutoTypeMatchModel.cpp @@ -0,0 +1,202 @@ +/* + * Copyright (C) 2015 David Wu <lightvector@gmail.com> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "AutoTypeMatchModel.h" + +#include <QFont> + +#include "core/DatabaseIcons.h" +#include "core/Entry.h" +#include "core/Global.h" +#include "core/Group.h" +#include "core/Metadata.h" + +AutoTypeMatchModel::AutoTypeMatchModel(QObject* parent) + : QAbstractTableModel(parent) +{ +} + +AutoTypeMatch AutoTypeMatchModel::matchFromIndex(const QModelIndex& index) const +{ + Q_ASSERT(index.isValid() && index.row() < m_matches.size()); + return m_matches.at(index.row()); +} + +QModelIndex AutoTypeMatchModel::indexFromMatch(AutoTypeMatch match) const +{ + int row = m_matches.indexOf(match); + Q_ASSERT(row != -1); + return index(row, 1); +} + +void AutoTypeMatchModel::setMatchList(const QList<AutoTypeMatch>& matches) +{ + beginResetModel(); + + severConnections(); + + m_allGroups.clear(); + m_matches = matches; + + QSet<Database*> databases; + + for (AutoTypeMatch match : asConst(m_matches)) { + databases.insert(match.entry->group()->database()); + } + + for (Database* db : asConst(databases)) { + Q_ASSERT(db); + for (const Group* group : db->rootGroup()->groupsRecursive(true)) { + m_allGroups.append(group); + } + + if (db->metadata()->recycleBin()) { + m_allGroups.removeOne(db->metadata()->recycleBin()); + } + } + + for (const Group* group : asConst(m_allGroups)) { + makeConnections(group); + } + + endResetModel(); +} + +int AutoTypeMatchModel::rowCount(const QModelIndex& parent) const +{ + if (parent.isValid()) { + return 0; + } else { + return m_matches.size(); + } +} + +int AutoTypeMatchModel::columnCount(const QModelIndex& parent) const +{ + Q_UNUSED(parent); + + return 4; +} + +QVariant AutoTypeMatchModel::data(const QModelIndex& index, int role) const +{ + if (!index.isValid()) { + return QVariant(); + } + + AutoTypeMatch match = matchFromIndex(index); + + if (role == Qt::DisplayRole) { + QString result; + switch (index.column()) { + case ParentGroup: + if (match.entry->group()) { + return match.entry->group()->name(); + } + break; + case Title: + return match.entry->resolveMultiplePlaceholders(match.entry->title()); + case Username: + return match.entry->resolveMultiplePlaceholders(match.entry->username()); + case Sequence: + return match.sequence; + } + } else if (role == Qt::DecorationRole) { + switch (index.column()) { + case ParentGroup: + if (match.entry->group()) { + return match.entry->group()->iconScaledPixmap(); + } + break; + case Title: + if (match.entry->isExpired()) { + return databaseIcons()->iconPixmap(DatabaseIcons::ExpiredIconIndex); + } else { + return match.entry->iconScaledPixmap(); + } + } + } else if (role == Qt::FontRole) { + QFont font; + if (match.entry->isExpired()) { + font.setStrikeOut(true); + } + return font; + } + + return QVariant(); +} + +QVariant AutoTypeMatchModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { + switch (section) { + case ParentGroup: + return tr("Group"); + case Title: + return tr("Title"); + case Username: + return tr("Username"); + case Sequence: + return tr("Sequence"); + } + } + + return QVariant(); +} + +void AutoTypeMatchModel::entryDataChanged(Entry* entry) +{ + for (int row = 0; row < m_matches.size(); row++) { + AutoTypeMatch match = m_matches[row]; + if (match.entry == entry) { + emit dataChanged(index(row, 0), index(row, columnCount()-1)); + } + } +} + + +void AutoTypeMatchModel::entryAboutToRemove(Entry* entry) +{ + for (int row = 0; row < m_matches.size(); row++) { + AutoTypeMatch match = m_matches[row]; + if (match.entry == entry) { + beginRemoveRows(QModelIndex(), row, row); + m_matches.removeAt(row); + endRemoveRows(); + row--; + } + } +} + +void AutoTypeMatchModel::entryRemoved() +{ +} + +void AutoTypeMatchModel::severConnections() +{ + for (const Group* group : asConst(m_allGroups)) { + disconnect(group, nullptr, this, nullptr); + } +} + +void AutoTypeMatchModel::makeConnections(const Group* group) +{ + connect(group, SIGNAL(entryAboutToRemove(Entry*)), SLOT(entryAboutToRemove(Entry*))); + connect(group, SIGNAL(entryRemoved(Entry*)), SLOT(entryRemoved())); + connect(group, SIGNAL(entryDataChanged(Entry*)), SLOT(entryDataChanged(Entry*))); +} diff --git a/src/gui/entry/AutoTypeMatchModel.h b/src/gui/entry/AutoTypeMatchModel.h new file mode 100644 index 000000000..8d341f5f4 --- /dev/null +++ b/src/gui/entry/AutoTypeMatchModel.h @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2015 David Wu <lightvector@gmail.com> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef KEEPASSX_AUTOTYPEMATCHMODEL_H +#define KEEPASSX_AUTOTYPEMATCHMODEL_H + +#include <QAbstractTableModel> + +#include "core/AutoTypeMatch.h" + +class Entry; +class Group; + +class AutoTypeMatchModel : public QAbstractTableModel +{ + Q_OBJECT + +public: + enum ModelColumn + { + ParentGroup = 0, + Title = 1, + Username = 2, + Sequence = 3 + }; + + explicit AutoTypeMatchModel(QObject* parent = nullptr); + AutoTypeMatch matchFromIndex(const QModelIndex& index) const; + QModelIndex indexFromMatch(AutoTypeMatch match) const; + + int rowCount(const QModelIndex& parent = QModelIndex()) const override; + int columnCount(const QModelIndex& parent = QModelIndex()) const override; + QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; + + void setMatchList(const QList<AutoTypeMatch>& matches); + +private Q_SLOTS: + void entryAboutToRemove(Entry* entry); + void entryRemoved(); + void entryDataChanged(Entry* entry); + +private: + void severConnections(); + void makeConnections(const Group* group); + + QList<AutoTypeMatch> m_matches; + QList<const Group*> m_allGroups; +}; + +#endif // KEEPASSX_AUTOTYPEMATCHMODEL_H diff --git a/src/gui/entry/AutoTypeMatchView.cpp b/src/gui/entry/AutoTypeMatchView.cpp new file mode 100644 index 000000000..013d192fc --- /dev/null +++ b/src/gui/entry/AutoTypeMatchView.cpp @@ -0,0 +1,116 @@ +/* + * Copyright (C) 2015 David Wu <lightvector@gmail.com> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "AutoTypeMatchView.h" + +#include <QHeaderView> +#include <QKeyEvent> + +#include "gui/SortFilterHideProxyModel.h" + +AutoTypeMatchView::AutoTypeMatchView(QWidget* parent) + : QTreeView(parent) + , m_model(new AutoTypeMatchModel(this)) + , m_sortModel(new SortFilterHideProxyModel(this)) +{ + m_sortModel->setSourceModel(m_model); + m_sortModel->setDynamicSortFilter(true); + m_sortModel->setSortLocaleAware(true); + m_sortModel->setSortCaseSensitivity(Qt::CaseInsensitive); + QTreeView::setModel(m_sortModel); + + setUniformRowHeights(true); + setRootIsDecorated(false); + setAlternatingRowColors(true); + setDragEnabled(false); + setSortingEnabled(true); + setSelectionMode(QAbstractItemView::SingleSelection); + header()->setDefaultSectionSize(150); + + connect(this, SIGNAL(doubleClicked(QModelIndex)), SLOT(emitMatchActivated(QModelIndex))); + connect(selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), SIGNAL(matchSelectionChanged())); +} + +void AutoTypeMatchView::keyPressEvent(QKeyEvent* event) +{ + if ((event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return) && currentIndex().isValid()) { + emitMatchActivated(currentIndex()); + } + + QTreeView::keyPressEvent(event); +} + +void AutoTypeMatchView::setMatchList(const QList<AutoTypeMatch>& matches) +{ + m_model->setMatchList(matches); + for (int i = 0; i < m_model->columnCount(); ++i) { + resizeColumnToContents(i); + if (columnWidth(i) > 250) { + setColumnWidth(i, 250); + } + } + setFirstMatchActive(); +} + +void AutoTypeMatchView::setFirstMatchActive() +{ + if (m_model->rowCount() > 0) { + QModelIndex index = m_sortModel->mapToSource(m_sortModel->index(0, 0)); + setCurrentMatch(m_model->matchFromIndex(index)); + } else { + emit matchSelectionChanged(); + } +} + +void AutoTypeMatchView::emitMatchActivated(const QModelIndex& index) +{ + AutoTypeMatch match = matchFromIndex(index); + + emit matchActivated(match); +} + +void AutoTypeMatchView::setModel(QAbstractItemModel* model) +{ + Q_UNUSED(model); + Q_ASSERT(false); +} + +AutoTypeMatch AutoTypeMatchView::currentMatch() +{ + QModelIndexList list = selectionModel()->selectedRows(); + if (list.size() == 1) { + return m_model->matchFromIndex(m_sortModel->mapToSource(list.first())); + } else { + return AutoTypeMatch(); + } +} + +void AutoTypeMatchView::setCurrentMatch(AutoTypeMatch match) +{ + selectionModel()->setCurrentIndex(m_sortModel->mapFromSource(m_model->indexFromMatch(match)), + QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); +} + +AutoTypeMatch AutoTypeMatchView::matchFromIndex(const QModelIndex& index) +{ + if (index.isValid()) { + return m_model->matchFromIndex(m_sortModel->mapToSource(index)); + } else { + return AutoTypeMatch(); + } +} diff --git a/src/gui/entry/AutoTypeMatchView.h b/src/gui/entry/AutoTypeMatchView.h new file mode 100644 index 000000000..08c177005 --- /dev/null +++ b/src/gui/entry/AutoTypeMatchView.h @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2015 David Wu <lightvector@gmail.com> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef KEEPASSX_AUTOTYPEMATCHVIEW_H +#define KEEPASSX_AUTOTYPEMATCHVIEW_H + +#include <QTreeView> + +#include "core/AutoTypeMatch.h" + +#include "gui/entry/AutoTypeMatchModel.h" + +class SortFilterHideProxyModel; + +class AutoTypeMatchView : public QTreeView +{ + Q_OBJECT + +public: + explicit AutoTypeMatchView(QWidget* parent = nullptr); + void setModel(QAbstractItemModel* model) override; + AutoTypeMatch currentMatch(); + void setCurrentMatch(AutoTypeMatch match); + AutoTypeMatch matchFromIndex(const QModelIndex& index); + void setMatchList(const QList<AutoTypeMatch>& matches); + void setFirstMatchActive(); + +Q_SIGNALS: + void matchActivated(AutoTypeMatch match); + void matchSelectionChanged(); + +protected: + void keyPressEvent(QKeyEvent* event) override; + +private Q_SLOTS: + void emitMatchActivated(const QModelIndex& index); + +private: + AutoTypeMatchModel* const m_model; + SortFilterHideProxyModel* const m_sortModel; +}; + +#endif // KEEPASSX_AUTOTYPEMATCHVIEW_H From a9479fd66260495133a4f516b69b31ff91495040 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Thu, 18 Jan 2018 23:45:09 +0100 Subject: [PATCH 331/402] refactor autotype sequences and entry-point functions --- src/autotype/AutoType.cpp | 108 ++++++++++++++++++++++++++------------ src/autotype/AutoType.h | 12 ++--- src/core/Entry.cpp | 13 ++++- src/core/Entry.h | 3 ++ src/core/Group.cpp | 3 +- src/core/Group.h | 1 + tests/TestAutoType.cpp | 13 +---- tests/TestAutoType.h | 3 +- 8 files changed, 99 insertions(+), 57 deletions(-) diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp index e3b5b54c0..c72b61ef6 100644 --- a/src/autotype/AutoType.cpp +++ b/src/autotype/AutoType.cpp @@ -128,31 +128,16 @@ QStringList AutoType::windowTitles() return m_plugin->windowTitles(); } -void AutoType::executeAutoTypeActions(const Entry* entry, QWidget* hideWindow, const QString& customSequence, WId window) +/** + * Core Autotype function that will execute actions + */ +void AutoType::executeAutoTypeActions(const Entry* entry, QWidget* hideWindow, const QString& sequence, WId window) { - if (m_inAutoType || !m_plugin) { + // no edit to the sequence beyond this point + if (!verifyAutoTypeSyntax(sequence)) { + m_inAutoType = false; // TODO: make this automatic return; } - m_inAutoType = true; - - QString sequence; - if (customSequence.isEmpty()) { - QList<QString> sequences = autoTypeSequences(entry); - if(sequences.isEmpty()) { - sequence = ""; - } else { - sequence = sequences.first(); - } - } else { - sequence = customSequence; - } - - if (!checkSyntax(sequence)) { - return; - } - - sequence.replace("{{}", "{LEFTBRACE}"); - sequence.replace("{}}", "{RIGHTBRACE}"); QList<AutoTypeAction*> actions; ListDeleter<AutoTypeAction*> actionsDeleter(&actions); @@ -191,6 +176,30 @@ void AutoType::executeAutoTypeActions(const Entry* entry, QWidget* hideWindow, c m_inAutoType = false; } +/** + * Single Autotype entry-point function + * Perfom autotype sequence in the active window + */ +void AutoType::performAutoType(const Entry* entry, QWidget* hideWindow) +{ + if (m_inAutoType || !m_plugin) { + return; + } + + QList<QString> sequences = autoTypeSequences(entry); + if(sequences.isEmpty()) { + return; + } + + m_inAutoType = true; + + executeAutoTypeActions(entry, hideWindow, sequences.first()); +} + +/** + * Global Autotype entry-point funcion + * Perform global autotype on the active window + */ void AutoType::performGlobalAutoType(const QList<Database*>& dbList) { if (m_inAutoType || !m_plugin) { @@ -227,7 +236,7 @@ void AutoType::performGlobalAutoType(const QList<Database*>& dbList) MessageBox::information(nullptr, tr("Auto-Type - KeePassXC"), message); } else if ((matchList.size() == 1) && !config()->get("security/autotypeask").toBool()) { m_inAutoType = false; - performAutoType(matchList.first().entry, nullptr, matchList.first().sequence); + executeAutoTypeActions(matchList.first().entry, nullptr, matchList.first().sequence); } else { m_windowFromGlobal = m_plugin->activeWindow(); AutoTypeSelectDialog* selectDialog = new AutoTypeSelectDialog(); @@ -253,7 +262,7 @@ void AutoType::performAutoTypeFromGlobal(AutoTypeMatch match) m_inAutoType = false; - performAutoType(match.entry, nullptr, match.sequence, m_windowFromGlobal); + executeAutoTypeActions(match.entry, nullptr, match.sequence, m_windowFromGlobal); } void AutoType::resetInAutoType() @@ -283,6 +292,7 @@ void AutoType::unloadPlugin() } } + bool AutoType::registerGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers) { Q_ASSERT(key); @@ -325,12 +335,19 @@ int AutoType::callEventFilter(void* event) return m_plugin->platformEventFilter(event); } -bool AutoType::parseActions(const QString& sequence, const Entry* entry, QList<AutoTypeAction*>& actions) +/** + * Parse an autotype sequence and resolve its Template/command inside as AutoTypeActions + */ +bool AutoType::parseActions(const QString& actionSequence, const Entry* entry, QList<AutoTypeAction*>& actions) { QString tmpl; bool inTmpl = false; m_autoTypeDelay = config()->get("AutoTypeDelay").toInt(); + QString sequence = actionSequence; + sequence.replace("{{}", "{LEFTBRACE}"); + sequence.replace("{}}", "{RIGHTBRACE}"); + for (const QChar& ch : sequence) { if (inTmpl) { if (ch == '{') { @@ -369,6 +386,9 @@ bool AutoType::parseActions(const QString& sequence, const Entry* entry, QList<A return true; } +/** + * Convert an autotype Template/command to its AutoTypeAction that will be executed by the plugin executor + */ QList<AutoTypeAction*> AutoType::createActionFromTemplate(const QString& tmpl, const Entry* entry) { QString tmplName = tmpl; @@ -512,6 +532,9 @@ QList<AutoTypeAction*> AutoType::createActionFromTemplate(const QString& tmpl, c return list; } +/** + * Retrive the autotype sequences matches for a given windowTitle + */ QList<QString> AutoType::autoTypeSequences(const Entry* entry, const QString& windowTitle) { QList<QString> sequenceList; @@ -564,6 +587,9 @@ QList<QString> AutoType::autoTypeSequences(const Entry* entry, const QString& wi return sequenceList; } +/** + * Checks if a window title matches a pattern + */ bool AutoType::windowMatches(const QString& windowTitle, const QString& windowPattern) { if (windowPattern.startsWith("//") && windowPattern.endsWith("//") && windowPattern.size() >= 4) { @@ -574,11 +600,19 @@ bool AutoType::windowMatches(const QString& windowTitle, const QString& windowPa } } +/** + * Checks if a window title matches an entry Title + * The entry title should be Spr-compiled by the caller + */ bool AutoType::windowMatchesTitle(const QString& windowTitle, const QString& resolvedTitle) { return !resolvedTitle.isEmpty() && windowTitle.contains(resolvedTitle, Qt::CaseInsensitive); } +/** + * Checks if a window title matches an entry URL + * The entry URL should be Spr-compiled by the caller + */ bool AutoType::windowMatchesUrl(const QString& windowTitle, const QString& resolvedUrl) { if (!resolvedUrl.isEmpty() && windowTitle.contains(resolvedUrl, Qt::CaseInsensitive)) { @@ -593,6 +627,9 @@ bool AutoType::windowMatchesUrl(const QString& windowTitle, const QString& resol return false; } +/** + * Checks if the overall syntax of an autotype sequence is fine + */ bool AutoType::checkSyntax(const QString& string) { QString allowRepetition = "(?:\\s\\d+)?"; @@ -618,6 +655,9 @@ bool AutoType::checkSyntax(const QString& string) return match.hasMatch(); } +/** + * Checks an autotype sequence for high delay + */ bool AutoType::checkHighDelay(const QString& string) { // 5 digit numbers(10 seconds) are too much @@ -626,6 +666,9 @@ bool AutoType::checkHighDelay(const QString& string) return match.hasMatch(); } +/** + * Checks an autotype sequence for slow keypress + */ bool AutoType::checkSlowKeypress(const QString& string) { // 3 digit numbers(100 milliseconds) are too much @@ -634,6 +677,9 @@ bool AutoType::checkSlowKeypress(const QString& string) return match.hasMatch(); } +/** + * Checks an autotype sequence for high repetition command + */ bool AutoType::checkHighRepetition(const QString& string) { // 3 digit numbers are too much @@ -642,6 +688,9 @@ bool AutoType::checkHighRepetition(const QString& string) return match.hasMatch(); } +/** + * Verify if the syntax of an autotype sequence is correct and doesn't have silly parameters + */ bool AutoType::verifyAutoTypeSyntax(const QString& sequence) { if (!AutoType::checkSyntax(sequence)) { @@ -675,12 +724,3 @@ bool AutoType::verifyAutoTypeSyntax(const QString& sequence) } return true; } - - -void AutoType::performAutoType(const Entry* entry, QWidget* hideWindow, const QString& customSequence, WId window) -{ - auto sequence = entry->effectiveAutoTypeSequence(); - if (verifyAutoTypeSyntax(sequence)) { - executeAutoTypeActions(entry, hideWindow, customSequence, window); - } -} diff --git a/src/autotype/AutoType.h b/src/autotype/AutoType.h index 5c89b4fa6..db60133ae 100644 --- a/src/autotype/AutoType.h +++ b/src/autotype/AutoType.h @@ -38,10 +38,6 @@ class AutoType : public QObject public: QStringList windowTitles(); - void executeAutoTypeActions(const Entry* entry, - QWidget* hideWindow = nullptr, - const QString& customSequence = QString(), - WId window = 0); bool registerGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers); void unregisterGlobalShortcut(); int callEventFilter(void* event); @@ -51,9 +47,7 @@ public: static bool checkHighDelay(const QString& string); static bool verifyAutoTypeSyntax(const QString& sequence); void performAutoType(const Entry* entry, - QWidget* hideWindow = nullptr, - const QString& customSequence = QString(), - WId window = 0); + QWidget* hideWindow = nullptr); inline bool isAvailable() { @@ -79,6 +73,10 @@ private: explicit AutoType(QObject* parent = nullptr, bool test = false); ~AutoType(); void loadPlugin(const QString& pluginPath); + void executeAutoTypeActions(const Entry* entry, + QWidget* hideWindow = nullptr, + const QString& customSequence = QString(), + WId window = 0); bool parseActions(const QString& sequence, const Entry* entry, QList<AutoTypeAction*>& actions); QList<AutoTypeAction*> createActionFromTemplate(const QString& tmpl, const Entry* entry); QList<QString> autoTypeSequences(const Entry* entry, const QString& windowTitle = QString()); diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index 951c2184b..e4c9e720e 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -29,6 +29,8 @@ const int Entry::DefaultIconNumber = 0; const int Entry::ResolveMaximumDepth = 10; +const QString Entry::AutoTypeSequenceUsername = "{USERNAME}{ENTER}"; +const QString Entry::AutoTypeSequencePassword = "{PASSWORD}{ENTER}"; Entry::Entry() @@ -232,7 +234,7 @@ QString Entry::effectiveAutoTypeSequence() const if (!parent) { return QString(); } - + QString sequence = parent->effectiveAutoTypeSequence(); if (sequence.isEmpty()) { return QString(); @@ -242,6 +244,15 @@ QString Entry::effectiveAutoTypeSequence() const return m_data.defaultAutoTypeSequence; } + if (sequence == Group::RootAutoTypeSequence && (!username().isEmpty() || !password().isEmpty())) { + if (username().isEmpty()) { + return AutoTypeSequencePassword; + } else if (password().isEmpty()) { + return AutoTypeSequenceUsername; + } + return Group::RootAutoTypeSequence; + } + return sequence; } diff --git a/src/core/Entry.h b/src/core/Entry.h index 7b995b7ae..8579f9533 100644 --- a/src/core/Entry.h +++ b/src/core/Entry.h @@ -85,6 +85,7 @@ public: int autoTypeObfuscation() const; QString defaultAutoTypeSequence() const; QString effectiveAutoTypeSequence() const; + QString effectiveNewAutoTypeSequence() const; AutoTypeAssociations* autoTypeAssociations(); const AutoTypeAssociations* autoTypeAssociations() const; QString title() const; @@ -109,6 +110,8 @@ public: static const int DefaultIconNumber; static const int ResolveMaximumDepth; + static const QString AutoTypeSequenceUsername; + static const QString AutoTypeSequencePassword; void setUuid(const Uuid& uuid); void setIcon(int iconNumber); diff --git a/src/core/Group.cpp b/src/core/Group.cpp index e75f45268..51b24c199 100644 --- a/src/core/Group.cpp +++ b/src/core/Group.cpp @@ -25,6 +25,7 @@ const int Group::DefaultIconNumber = 48; const int Group::RecycleBinIconNumber = 43; +const QString Group::RootAutoTypeSequence = "{USERNAME}{TAB}{PASSWORD}{ENTER}"; Group::CloneFlags Group::DefaultCloneFlags = static_cast<Group::CloneFlags>( Group::CloneNewUuid | Group::CloneResetTimeInfo | Group::CloneIncludeEntries); @@ -211,7 +212,7 @@ QString Group::effectiveAutoTypeSequence() const } while (group && sequence.isEmpty()); if (sequence.isEmpty()) { - sequence = "{USERNAME}{TAB}{PASSWORD}{ENTER}"; + sequence = RootAutoTypeSequence; } return sequence; diff --git a/src/core/Group.h b/src/core/Group.h index 70f033196..b1654a236 100644 --- a/src/core/Group.h +++ b/src/core/Group.h @@ -88,6 +88,7 @@ public: static const int RecycleBinIconNumber; static CloneFlags DefaultCloneFlags; static Entry::CloneFlags DefaultEntryCloneFlags; + static const QString RootAutoTypeSequence; Group* findChildByName(const QString& name); Group* findChildByUuid(const Uuid& uuid); diff --git a/tests/TestAutoType.cpp b/tests/TestAutoType.cpp index 7d26a6afe..53f455ce6 100644 --- a/tests/TestAutoType.cpp +++ b/tests/TestAutoType.cpp @@ -136,7 +136,7 @@ void TestAutoType::testInternal() QCOMPARE(m_platform->activeWindowTitle(), QString("Test")); } -void TestAutoType::testAutoTypeWithoutSequence() +void TestAutoType::testSingleAutoType() { m_autoType->performAutoType(m_entry1, nullptr); @@ -147,17 +147,6 @@ void TestAutoType::testAutoTypeWithoutSequence() .arg(m_test->keyToString(Qt::Key_Enter))); } -void TestAutoType::testAutoTypeWithSequence() -{ - m_autoType->performAutoType(m_entry1, nullptr, "{Username}abc{PaSsWoRd}"); - - QCOMPARE(m_test->actionCount(), 15); - QCOMPARE(m_test->actionChars(), - QString("%1abc%2") - .arg(m_entry1->username()) - .arg(m_entry1->password())); -} - void TestAutoType::testGlobalAutoTypeWithNoMatch() { m_test->setActiveWindowTitle("nomatch"); diff --git a/tests/TestAutoType.h b/tests/TestAutoType.h index 516481282..93a7d682c 100644 --- a/tests/TestAutoType.h +++ b/tests/TestAutoType.h @@ -38,8 +38,7 @@ private slots: void cleanup(); void testInternal(); - void testAutoTypeWithoutSequence(); - void testAutoTypeWithSequence(); + void testSingleAutoType(); void testGlobalAutoTypeWithNoMatch(); void testGlobalAutoTypeWithOneMatch(); void testGlobalAutoTypeTitleMatch(); From 12a4b9aaa3bdbb2ca6036b17244bd19d32e493dc Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Thu, 18 Jan 2018 23:47:24 +0100 Subject: [PATCH 332/402] reorder functions by logic --- src/autotype/AutoType.cpp | 139 +++++++++++++++++++------------------- 1 file changed, 69 insertions(+), 70 deletions(-) diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp index c72b61ef6..5c936bf13 100644 --- a/src/autotype/AutoType.cpp +++ b/src/autotype/AutoType.cpp @@ -103,6 +103,19 @@ void AutoType::loadPlugin(const QString& pluginPath) } } +void AutoType::unloadPlugin() +{ + if (m_executor) { + delete m_executor; + m_executor = nullptr; + } + + if (m_plugin) { + m_plugin->unload(); + m_plugin = nullptr; + } +} + AutoType* AutoType::instance() { if (!m_instance) { @@ -128,6 +141,62 @@ QStringList AutoType::windowTitles() return m_plugin->windowTitles(); } +void AutoType::resetInAutoType() +{ + Q_ASSERT(m_inAutoType); + + m_inAutoType = false; +} + +void AutoType::raiseWindow() +{ +#if defined(Q_OS_MAC) + m_plugin->raiseOwnWindow(); +#endif +} + +bool AutoType::registerGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers) +{ + Q_ASSERT(key); + Q_ASSERT(modifiers); + + if (!m_plugin) { + return false; + } + + if (key != m_currentGlobalKey || modifiers != m_currentGlobalModifiers) { + if (m_currentGlobalKey && m_currentGlobalModifiers) { + m_plugin->unregisterGlobalShortcut(m_currentGlobalKey, m_currentGlobalModifiers); + } + + if (m_plugin->registerGlobalShortcut(key, modifiers)) { + m_currentGlobalKey = key; + m_currentGlobalModifiers = modifiers; + return true; + } else { + return false; + } + } else { + return true; + } +} + +void AutoType::unregisterGlobalShortcut() +{ + if (m_plugin && m_currentGlobalKey && m_currentGlobalModifiers) { + m_plugin->unregisterGlobalShortcut(m_currentGlobalKey, m_currentGlobalModifiers); + } +} + +int AutoType::callEventFilter(void* event) +{ + if (!m_plugin) { + return -1; + } + + return m_plugin->platformEventFilter(event); +} + /** * Core Autotype function that will execute actions */ @@ -265,76 +334,6 @@ void AutoType::performAutoTypeFromGlobal(AutoTypeMatch match) executeAutoTypeActions(match.entry, nullptr, match.sequence, m_windowFromGlobal); } -void AutoType::resetInAutoType() -{ - Q_ASSERT(m_inAutoType); - - m_inAutoType = false; -} - -void AutoType::raiseWindow() -{ -#if defined(Q_OS_MAC) - m_plugin->raiseOwnWindow(); -#endif -} - -void AutoType::unloadPlugin() -{ - if (m_executor) { - delete m_executor; - m_executor = nullptr; - } - - if (m_plugin) { - m_plugin->unload(); - m_plugin = nullptr; - } -} - - -bool AutoType::registerGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers) -{ - Q_ASSERT(key); - Q_ASSERT(modifiers); - - if (!m_plugin) { - return false; - } - - if (key != m_currentGlobalKey || modifiers != m_currentGlobalModifiers) { - if (m_currentGlobalKey && m_currentGlobalModifiers) { - m_plugin->unregisterGlobalShortcut(m_currentGlobalKey, m_currentGlobalModifiers); - } - - if (m_plugin->registerGlobalShortcut(key, modifiers)) { - m_currentGlobalKey = key; - m_currentGlobalModifiers = modifiers; - return true; - } else { - return false; - } - } else { - return true; - } -} - -void AutoType::unregisterGlobalShortcut() -{ - if (m_plugin && m_currentGlobalKey && m_currentGlobalModifiers) { - m_plugin->unregisterGlobalShortcut(m_currentGlobalKey, m_currentGlobalModifiers); - } -} - -int AutoType::callEventFilter(void* event) -{ - if (!m_plugin) { - return -1; - } - - return m_plugin->platformEventFilter(event); -} - /** * Parse an autotype sequence and resolve its Template/command inside as AutoTypeActions */ From ba4ef52e9ead8d33edb30d4bd23796706c6f3ba8 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Fri, 19 Jan 2018 00:50:22 +0100 Subject: [PATCH 333/402] improve Window Associations UI/UX --- src/gui/entry/EditEntryWidget.cpp | 21 ++++++++------------- src/gui/entry/EditEntryWidgetAutoType.ui | 12 ++---------- 2 files changed, 10 insertions(+), 23 deletions(-) diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index c146da691..71366651f 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -170,8 +170,7 @@ void EditEntryWidget::setupAutoType() m_autoTypeDefaultSequenceGroup->addButton(m_autoTypeUi->inheritSequenceButton); m_autoTypeDefaultSequenceGroup->addButton(m_autoTypeUi->customSequenceButton); - m_autoTypeWindowSequenceGroup->addButton(m_autoTypeUi->defaultWindowSequenceButton); - m_autoTypeWindowSequenceGroup->addButton(m_autoTypeUi->customWindowSequenceButton); + //m_autoTypeWindowSequenceGroup->addButton(m_autoTypeUi->customWindowSequenceButton); m_autoTypeAssocModel->setAutoTypeAssociations(m_autoTypeAssoc); m_autoTypeUi->assocView->setModel(m_autoTypeAssocModel); m_autoTypeUi->assocView->setColumnHidden(1, true); @@ -190,8 +189,6 @@ void EditEntryWidget::setupAutoType() connect(m_autoTypeAssocModel, SIGNAL(modelReset()), SLOT(clearCurrentAssoc())); connect(m_autoTypeUi->windowTitleCombo, SIGNAL(editTextChanged(QString)), SLOT(applyCurrentAssoc())); - connect(m_autoTypeUi->defaultWindowSequenceButton, SIGNAL(toggled(bool)), - SLOT(applyCurrentAssoc())); connect(m_autoTypeUi->windowSequenceEdit, SIGNAL(textChanged(QString)), SLOT(applyCurrentAssoc())); } @@ -644,7 +641,7 @@ void EditEntryWidget::setForms(const Entry* entry, bool restore) } m_autoTypeUi->sequenceEdit->setText(entry->effectiveAutoTypeSequence()); m_autoTypeUi->windowTitleCombo->lineEdit()->clear(); - m_autoTypeUi->defaultWindowSequenceButton->setChecked(true); + m_autoTypeUi->customWindowSequenceButton->setChecked(false); m_autoTypeUi->windowSequenceEdit->setText(""); m_autoTypeAssoc->copyDataFrom(entry->autoTypeAssociations()); m_autoTypeAssocModel->setEntry(entry); @@ -998,7 +995,6 @@ void EditEntryWidget::updateAutoTypeEnabled() m_autoTypeUi->windowTitleLabel->setEnabled(autoTypeEnabled && validIndex); m_autoTypeUi->windowTitleCombo->setEnabled(autoTypeEnabled && validIndex); - m_autoTypeUi->defaultWindowSequenceButton->setEnabled(!m_history && autoTypeEnabled && validIndex); m_autoTypeUi->customWindowSequenceButton->setEnabled(!m_history && autoTypeEnabled && validIndex); m_autoTypeUi->windowSequenceEdit->setEnabled(autoTypeEnabled && validIndex && m_autoTypeUi->customWindowSequenceButton->isChecked()); @@ -1029,16 +1025,15 @@ void EditEntryWidget::loadCurrentAssoc(const QModelIndex& current) AutoTypeAssociations::Association assoc = m_autoTypeAssoc->get(current.row()); m_autoTypeUi->windowTitleCombo->setEditText(assoc.window); if (assoc.sequence.isEmpty()) { - m_autoTypeUi->defaultWindowSequenceButton->setChecked(true); - } - else { + m_autoTypeUi->customWindowSequenceButton->setChecked(false); + m_autoTypeUi->windowSequenceEdit->setText(m_entry->effectiveAutoTypeSequence()); + } else { m_autoTypeUi->customWindowSequenceButton->setChecked(true); + m_autoTypeUi->windowSequenceEdit->setText(assoc.sequence); } - m_autoTypeUi->windowSequenceEdit->setText(assoc.sequence); updateAutoTypeEnabled(); - } - else { + } else { clearCurrentAssoc(); } } @@ -1047,7 +1042,7 @@ void EditEntryWidget::clearCurrentAssoc() { m_autoTypeUi->windowTitleCombo->setEditText(""); - m_autoTypeUi->defaultWindowSequenceButton->setChecked(true); + m_autoTypeUi->customWindowSequenceButton->setChecked(false); m_autoTypeUi->windowSequenceEdit->setText(""); updateAutoTypeEnabled(); diff --git a/src/gui/entry/EditEntryWidgetAutoType.ui b/src/gui/entry/EditEntryWidgetAutoType.ui index a8090f768..3d4ec7a3e 100644 --- a/src/gui/entry/EditEntryWidgetAutoType.ui +++ b/src/gui/entry/EditEntryWidgetAutoType.ui @@ -203,16 +203,9 @@ </spacer> </item> <item> - <widget class="QRadioButton" name="defaultWindowSequenceButton"> + <widget class="QCheckBox" name="customWindowSequenceButton"> <property name="text"> - <string>Use default se&quence</string> - </property> - </widget> - </item> - <item> - <widget class="QRadioButton" name="customWindowSequenceButton"> - <property name="text"> - <string>Set custo&m sequence:</string> + <string>Use a specific sequence for this association:</string> </property> </widget> </item> @@ -277,7 +270,6 @@ <tabstop>sequenceEdit</tabstop> <tabstop>assocView</tabstop> <tabstop>windowTitleCombo</tabstop> - <tabstop>defaultWindowSequenceButton</tabstop> <tabstop>customWindowSequenceButton</tabstop> <tabstop>windowSequenceEdit</tabstop> <tabstop>assocAddButton</tabstop> From a76c92ed9a3eb9d087b6a3f06836bbcac77fc492 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Wed, 24 Jan 2018 20:08:56 +0100 Subject: [PATCH 334/402] change inAutotype logic, preventing multiple autotype call --- src/autotype/AutoType.cpp | 47 ++++++++++++++-------------- src/core/Entry.cpp | 8 ++--- src/gui/entry/AutoTypeMatchModel.cpp | 17 +++++----- src/gui/entry/AutoTypeMatchModel.h | 2 +- src/gui/entry/AutoTypeMatchView.cpp | 14 ++------- src/gui/entry/AutoTypeMatchView.h | 5 ++- src/gui/entry/EditEntryWidget.cpp | 1 - tests/TestAutoType.cpp | 6 ++-- 8 files changed, 44 insertions(+), 56 deletions(-) diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp index 5c936bf13..5bd10115a 100644 --- a/src/autotype/AutoType.cpp +++ b/src/autotype/AutoType.cpp @@ -173,12 +173,10 @@ bool AutoType::registerGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifie m_currentGlobalKey = key; m_currentGlobalModifiers = modifiers; return true; - } else { - return false; } - } else { - return true; + return false; } + return true; } void AutoType::unregisterGlobalShortcut() @@ -202,9 +200,13 @@ int AutoType::callEventFilter(void* event) */ void AutoType::executeAutoTypeActions(const Entry* entry, QWidget* hideWindow, const QString& sequence, WId window) { + Q_ASSERT(m_inAutoType); + if (!m_inAutoType) { + return; + } + // no edit to the sequence beyond this point if (!verifyAutoTypeSyntax(sequence)) { - m_inAutoType = false; // TODO: make this automatic return; } @@ -212,7 +214,6 @@ void AutoType::executeAutoTypeActions(const Entry* entry, QWidget* hideWindow, c ListDeleter<AutoTypeAction*> actionsDeleter(&actions); if (!parseActions(sequence, entry, actions)) { - m_inAutoType = false; // TODO: make this automatic return; } @@ -241,8 +242,6 @@ void AutoType::executeAutoTypeActions(const Entry* entry, QWidget* hideWindow, c action->accept(m_executor); QCoreApplication::processEvents(QEventLoop::AllEvents, 10); } - - m_inAutoType = false; } /** @@ -256,13 +255,15 @@ void AutoType::performAutoType(const Entry* entry, QWidget* hideWindow) } QList<QString> sequences = autoTypeSequences(entry); - if(sequences.isEmpty()) { + if (sequences.isEmpty()) { return; } m_inAutoType = true; executeAutoTypeActions(entry, hideWindow, sequences.first()); + + m_inAutoType = false; } /** @@ -304,8 +305,8 @@ void AutoType::performGlobalAutoType(const QList<Database*>& dbList) message.append(windowTitle); MessageBox::information(nullptr, tr("Auto-Type - KeePassXC"), message); } else if ((matchList.size() == 1) && !config()->get("security/autotypeask").toBool()) { - m_inAutoType = false; executeAutoTypeActions(matchList.first().entry, nullptr, matchList.first().sequence); + m_inAutoType = false; } else { m_windowFromGlobal = m_plugin->activeWindow(); AutoTypeSelectDialog* selectDialog = new AutoTypeSelectDialog(); @@ -329,9 +330,9 @@ void AutoType::performAutoTypeFromGlobal(AutoTypeMatch match) m_plugin->raiseWindow(m_windowFromGlobal); - m_inAutoType = false; - executeAutoTypeActions(match.entry, nullptr, match.sequence, m_windowFromGlobal); + + m_inAutoType = false; } /** @@ -542,6 +543,17 @@ QList<QString> AutoType::autoTypeSequences(const Entry* entry, const QString& wi return sequenceList; } + const Group* group = entry->group(); + do { + if (group->autoTypeEnabled() == Group::Disable) { + return sequenceList; + } else if (group->autoTypeEnabled() == Group::Enable) { + break; + } + group = group->parentGroup(); + + } while (group); + if (!windowTitle.isEmpty()) { const QList<AutoTypeAssociations::Association> assocList = entry->autoTypeAssociations()->getAll(); for (const AutoTypeAssociations::Association& assoc : assocList) { @@ -572,17 +584,6 @@ QList<QString> AutoType::autoTypeSequences(const Entry* entry, const QString& wi sequenceList.append(entry->effectiveAutoTypeSequence()); } - const Group* group = entry->group(); - do { - if (group->autoTypeEnabled() == Group::Disable) { - return QList<QString>(); - } else if (group->autoTypeEnabled() == Group::Enable) { - return sequenceList; - } - group = group->parentGroup(); - - } while (group); - return sequenceList; } diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index e4c9e720e..8db955c93 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -226,18 +226,18 @@ QString Entry::defaultAutoTypeSequence() const */ QString Entry::effectiveAutoTypeSequence() const { - if (autoTypeEnabled() == false) { - return QString(); + if (!autoTypeEnabled()) { + return {}; } const Group* parent = group(); if (!parent) { - return QString(); + return {}; } QString sequence = parent->effectiveAutoTypeSequence(); if (sequence.isEmpty()) { - return QString(); + return {}; } if (!m_data.defaultAutoTypeSequence.isEmpty()) { diff --git a/src/gui/entry/AutoTypeMatchModel.cpp b/src/gui/entry/AutoTypeMatchModel.cpp index 3a48e1737..6a370dea5 100644 --- a/src/gui/entry/AutoTypeMatchModel.cpp +++ b/src/gui/entry/AutoTypeMatchModel.cpp @@ -55,7 +55,7 @@ void AutoTypeMatchModel::setMatchList(const QList<AutoTypeMatch>& matches) QSet<Database*> databases; - for (AutoTypeMatch match : asConst(m_matches)) { + for (AutoTypeMatch& match : m_matches) { databases.insert(match.entry->group()->database()); } @@ -81,9 +81,8 @@ int AutoTypeMatchModel::rowCount(const QModelIndex& parent) const { if (parent.isValid()) { return 0; - } else { - return m_matches.size(); } + return m_matches.size(); } int AutoTypeMatchModel::columnCount(const QModelIndex& parent) const @@ -96,7 +95,7 @@ int AutoTypeMatchModel::columnCount(const QModelIndex& parent) const QVariant AutoTypeMatchModel::data(const QModelIndex& index, int role) const { if (!index.isValid()) { - return QVariant(); + return {}; } AutoTypeMatch match = matchFromIndex(index); @@ -138,7 +137,7 @@ QVariant AutoTypeMatchModel::data(const QModelIndex& index, int role) const return font; } - return QVariant(); + return {}; } QVariant AutoTypeMatchModel::headerData(int section, Qt::Orientation orientation, int role) const @@ -156,12 +155,12 @@ QVariant AutoTypeMatchModel::headerData(int section, Qt::Orientation orientation } } - return QVariant(); + return {}; } void AutoTypeMatchModel::entryDataChanged(Entry* entry) { - for (int row = 0; row < m_matches.size(); row++) { + for (int row = 0; row < m_matches.size(); ++row) { AutoTypeMatch match = m_matches[row]; if (match.entry == entry) { emit dataChanged(index(row, 0), index(row, columnCount()-1)); @@ -172,13 +171,13 @@ void AutoTypeMatchModel::entryDataChanged(Entry* entry) void AutoTypeMatchModel::entryAboutToRemove(Entry* entry) { - for (int row = 0; row < m_matches.size(); row++) { + for (int row = 0; row < m_matches.size(); ++row) { AutoTypeMatch match = m_matches[row]; if (match.entry == entry) { beginRemoveRows(QModelIndex(), row, row); m_matches.removeAt(row); endRemoveRows(); - row--; + --row; } } } diff --git a/src/gui/entry/AutoTypeMatchModel.h b/src/gui/entry/AutoTypeMatchModel.h index 8d341f5f4..791dbc3df 100644 --- a/src/gui/entry/AutoTypeMatchModel.h +++ b/src/gui/entry/AutoTypeMatchModel.h @@ -50,7 +50,7 @@ public: void setMatchList(const QList<AutoTypeMatch>& matches); -private Q_SLOTS: +private slots: void entryAboutToRemove(Entry* entry); void entryRemoved(); void entryDataChanged(Entry* entry); diff --git a/src/gui/entry/AutoTypeMatchView.cpp b/src/gui/entry/AutoTypeMatchView.cpp index 013d192fc..ad7d16ddc 100644 --- a/src/gui/entry/AutoTypeMatchView.cpp +++ b/src/gui/entry/AutoTypeMatchView.cpp @@ -61,7 +61,7 @@ void AutoTypeMatchView::setMatchList(const QList<AutoTypeMatch>& matches) for (int i = 0; i < m_model->columnCount(); ++i) { resizeColumnToContents(i); if (columnWidth(i) > 250) { - setColumnWidth(i, 250); + setColumnWidth(i, 250); } } setFirstMatchActive(); @@ -84,20 +84,13 @@ void AutoTypeMatchView::emitMatchActivated(const QModelIndex& index) emit matchActivated(match); } -void AutoTypeMatchView::setModel(QAbstractItemModel* model) -{ - Q_UNUSED(model); - Q_ASSERT(false); -} - AutoTypeMatch AutoTypeMatchView::currentMatch() { QModelIndexList list = selectionModel()->selectedRows(); if (list.size() == 1) { return m_model->matchFromIndex(m_sortModel->mapToSource(list.first())); - } else { - return AutoTypeMatch(); } + return AutoTypeMatch(); } void AutoTypeMatchView::setCurrentMatch(AutoTypeMatch match) @@ -110,7 +103,6 @@ AutoTypeMatch AutoTypeMatchView::matchFromIndex(const QModelIndex& index) { if (index.isValid()) { return m_model->matchFromIndex(m_sortModel->mapToSource(index)); - } else { - return AutoTypeMatch(); } + return AutoTypeMatch(); } diff --git a/src/gui/entry/AutoTypeMatchView.h b/src/gui/entry/AutoTypeMatchView.h index 08c177005..14ad9ea2a 100644 --- a/src/gui/entry/AutoTypeMatchView.h +++ b/src/gui/entry/AutoTypeMatchView.h @@ -33,21 +33,20 @@ class AutoTypeMatchView : public QTreeView public: explicit AutoTypeMatchView(QWidget* parent = nullptr); - void setModel(QAbstractItemModel* model) override; AutoTypeMatch currentMatch(); void setCurrentMatch(AutoTypeMatch match); AutoTypeMatch matchFromIndex(const QModelIndex& index); void setMatchList(const QList<AutoTypeMatch>& matches); void setFirstMatchActive(); -Q_SIGNALS: +signals: void matchActivated(AutoTypeMatch match); void matchSelectionChanged(); protected: void keyPressEvent(QKeyEvent* event) override; -private Q_SLOTS: +private slots: void emitMatchActivated(const QModelIndex& index); private: diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index 71366651f..bab5a0728 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -170,7 +170,6 @@ void EditEntryWidget::setupAutoType() m_autoTypeDefaultSequenceGroup->addButton(m_autoTypeUi->inheritSequenceButton); m_autoTypeDefaultSequenceGroup->addButton(m_autoTypeUi->customSequenceButton); - //m_autoTypeWindowSequenceGroup->addButton(m_autoTypeUi->customWindowSequenceButton); m_autoTypeAssocModel->setAutoTypeAssociations(m_autoTypeAssoc); m_autoTypeUi->assocView->setModel(m_autoTypeAssocModel); m_autoTypeUi->assocView->setColumnHidden(1, true); diff --git a/tests/TestAutoType.cpp b/tests/TestAutoType.cpp index 53f455ce6..7590bc613 100644 --- a/tests/TestAutoType.cpp +++ b/tests/TestAutoType.cpp @@ -310,7 +310,7 @@ void TestAutoType::testAutoTypeEffectiveSequences() QString sequenceDisabled("{TEST_DISABLED}"); QString sequenceOrphan("{TEST_ORPHAN}"); - Database* db = new Database(); + QScopedPointer<Database> db(new Database()); QPointer<Group> rootGroup = db->rootGroup(); // Group with autotype enabled and custom default sequence @@ -362,7 +362,7 @@ void TestAutoType::testAutoTypeEffectiveSequences() entry5->setAutoTypeEnabled(false); // Entry with no parent - QPointer<Entry> entry6 = new Entry(); + QScopedPointer<Entry> entry6(new Entry()); entry6->setDefaultAutoTypeSequence(sequenceOrphan); QCOMPARE(entry1->defaultAutoTypeSequence(), QString()); @@ -377,6 +377,4 @@ void TestAutoType::testAutoTypeEffectiveSequences() QCOMPARE(entry5->effectiveAutoTypeSequence(), QString()); QCOMPARE(entry6->defaultAutoTypeSequence(), sequenceOrphan); QCOMPARE(entry6->effectiveAutoTypeSequence(), QString()); - - delete db; } \ No newline at end of file From b4cf98998e579704c453f03897c354e5d01a1f49 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Mon, 29 Jan 2018 19:44:32 +0100 Subject: [PATCH 335/402] convert inAutoType from boolean block to QMutex --- src/autotype/AutoType.cpp | 35 ++++++++++++++++------------------- src/autotype/AutoType.h | 5 +++-- src/autotype/AutoTypeAction.h | 1 + 3 files changed, 20 insertions(+), 21 deletions(-) diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp index 5bd10115a..73bb3ef4b 100644 --- a/src/autotype/AutoType.cpp +++ b/src/autotype/AutoType.cpp @@ -41,7 +41,6 @@ AutoType* AutoType::m_instance = nullptr; AutoType::AutoType(QObject* parent, bool test) : QObject(parent) - , m_inAutoType(false) , m_autoTypeDelay(0) , m_currentGlobalKey(static_cast<Qt::Key>(0)) , m_currentGlobalModifiers(0) @@ -143,9 +142,7 @@ QStringList AutoType::windowTitles() void AutoType::resetInAutoType() { - Q_ASSERT(m_inAutoType); - - m_inAutoType = false; + m_inAutoType.unlock(); } void AutoType::raiseWindow() @@ -200,11 +197,6 @@ int AutoType::callEventFilter(void* event) */ void AutoType::executeAutoTypeActions(const Entry* entry, QWidget* hideWindow, const QString& sequence, WId window) { - Q_ASSERT(m_inAutoType); - if (!m_inAutoType) { - return; - } - // no edit to the sequence beyond this point if (!verifyAutoTypeSyntax(sequence)) { return; @@ -250,7 +242,7 @@ void AutoType::executeAutoTypeActions(const Entry* entry, QWidget* hideWindow, c */ void AutoType::performAutoType(const Entry* entry, QWidget* hideWindow) { - if (m_inAutoType || !m_plugin) { + if (!m_plugin) { return; } @@ -259,11 +251,13 @@ void AutoType::performAutoType(const Entry* entry, QWidget* hideWindow) return; } - m_inAutoType = true; + if (!m_inAutoType.tryLock()) { + return; + } executeAutoTypeActions(entry, hideWindow, sequences.first()); - m_inAutoType = false; + m_inAutoType.unlock(); } /** @@ -272,7 +266,7 @@ void AutoType::performAutoType(const Entry* entry, QWidget* hideWindow) */ void AutoType::performGlobalAutoType(const QList<Database*>& dbList) { - if (m_inAutoType || !m_plugin) { + if (!m_plugin) { return; } @@ -282,7 +276,9 @@ void AutoType::performGlobalAutoType(const QList<Database*>& dbList) return; } - m_inAutoType = true; + if (!m_inAutoType.tryLock()) { + return; + } QList<AutoTypeMatch> matchList; @@ -290,7 +286,7 @@ void AutoType::performGlobalAutoType(const QList<Database*>& dbList) const QList<Entry*> dbEntries = db->rootGroup()->entriesRecursive(); for (Entry* entry : dbEntries) { const QList<QString> sequences = autoTypeSequences(entry, windowTitle); - for (QString sequence : sequences) { + for (const QString& sequence : sequences) { if (!sequence.isEmpty()) { matchList << AutoTypeMatch(entry,sequence); } @@ -299,14 +295,14 @@ void AutoType::performGlobalAutoType(const QList<Database*>& dbList) } if (matchList.isEmpty()) { - m_inAutoType = false; + m_inAutoType.unlock(); QString message = tr("Couldn't find an entry that matches the window title:"); message.append("\n\n"); message.append(windowTitle); MessageBox::information(nullptr, tr("Auto-Type - KeePassXC"), message); } else if ((matchList.size() == 1) && !config()->get("security/autotypeask").toBool()) { executeAutoTypeActions(matchList.first().entry, nullptr, matchList.first().sequence); - m_inAutoType = false; + m_inAutoType.unlock(); } else { m_windowFromGlobal = m_plugin->activeWindow(); AutoTypeSelectDialog* selectDialog = new AutoTypeSelectDialog(); @@ -326,13 +322,14 @@ void AutoType::performGlobalAutoType(const QList<Database*>& dbList) void AutoType::performAutoTypeFromGlobal(AutoTypeMatch match) { - Q_ASSERT(m_inAutoType); + // We don't care about the result here, the mutex should already be locked. Now it's locked for sure + m_inAutoType.tryLock(); m_plugin->raiseWindow(m_windowFromGlobal); executeAutoTypeActions(match.entry, nullptr, match.sequence, m_windowFromGlobal); - m_inAutoType = false; + m_inAutoType.unlock(); } /** diff --git a/src/autotype/AutoType.h b/src/autotype/AutoType.h index db60133ae..3b22106bd 100644 --- a/src/autotype/AutoType.h +++ b/src/autotype/AutoType.h @@ -1,4 +1,4 @@ -/* + /* * Copyright (C) 2012 Felix Geyer <debfx@fobos.de> * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> * @@ -22,6 +22,7 @@ #include <QObject> #include <QStringList> #include <QWidget> +#include <QMutex> #include "core/AutoTypeMatch.h" @@ -84,7 +85,7 @@ private: bool windowMatchesUrl(const QString& windowTitle, const QString& resolvedUrl); bool windowMatches(const QString& windowTitle, const QString& windowPattern); - bool m_inAutoType; + QMutex m_inAutoType; int m_autoTypeDelay; Qt::Key m_currentGlobalKey; Qt::KeyboardModifiers m_currentGlobalModifiers; diff --git a/src/autotype/AutoTypeAction.h b/src/autotype/AutoTypeAction.h index 490f0d89f..7f0d829c0 100644 --- a/src/autotype/AutoTypeAction.h +++ b/src/autotype/AutoTypeAction.h @@ -20,6 +20,7 @@ #include <QChar> #include <Qt> +#include <QObject> #include "core/Global.h" From 16fad1aba155573cd417caace672ffb286800c8c Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Wed, 31 Jan 2018 21:53:53 +0100 Subject: [PATCH 336/402] fix duplicate autotype sequences --- src/autotype/AutoType.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp index 73bb3ef4b..0dfdedaec 100644 --- a/src/autotype/AutoType.cpp +++ b/src/autotype/AutoType.cpp @@ -285,10 +285,10 @@ void AutoType::performGlobalAutoType(const QList<Database*>& dbList) for (Database* db : dbList) { const QList<Entry*> dbEntries = db->rootGroup()->entriesRecursive(); for (Entry* entry : dbEntries) { - const QList<QString> sequences = autoTypeSequences(entry, windowTitle); + const QSet<QString> sequences = autoTypeSequences(entry, windowTitle).toSet(); for (const QString& sequence : sequences) { if (!sequence.isEmpty()) { - matchList << AutoTypeMatch(entry,sequence); + matchList << AutoTypeMatch(entry, sequence); } } } @@ -531,6 +531,7 @@ QList<AutoTypeAction*> AutoType::createActionFromTemplate(const QString& tmpl, c /** * Retrive the autotype sequences matches for a given windowTitle + * This returns a list with priority ordering. If you don't want duplicates call .toSet() on it. */ QList<QString> AutoType::autoTypeSequences(const Entry* entry, const QString& windowTitle) { From aa54c7b6b372100a56eb1772be3f87b0e57a94fd Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Sun, 4 Feb 2018 23:32:51 +0100 Subject: [PATCH 337/402] fix MatchView activation with Enter/Return on macOS --- src/gui/entry/AutoTypeMatchView.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/gui/entry/AutoTypeMatchView.cpp b/src/gui/entry/AutoTypeMatchView.cpp index ad7d16ddc..67f38c79e 100644 --- a/src/gui/entry/AutoTypeMatchView.cpp +++ b/src/gui/entry/AutoTypeMatchView.cpp @@ -50,6 +50,10 @@ void AutoTypeMatchView::keyPressEvent(QKeyEvent* event) { if ((event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return) && currentIndex().isValid()) { emitMatchActivated(currentIndex()); +#ifdef Q_OS_MAC + // Pressing return does not emit the QTreeView::activated signal on mac os + emit activated(currentIndex()); +#endif } QTreeView::keyPressEvent(event); From b33259b1f2383602509ae97dc05d98661000f741 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Mon, 5 Feb 2018 13:25:16 +0100 Subject: [PATCH 338/402] relock database after successful autotype --- src/autotype/AutoType.cpp | 12 +++++++++++- src/autotype/AutoType.h | 2 ++ src/autotype/AutoTypeSelectDialog.cpp | 12 ++++++++++++ src/autotype/AutoTypeSelectDialog.h | 2 ++ src/gui/DatabaseTabWidget.cpp | 26 +++++++++++++++++++++++++- src/gui/DatabaseTabWidget.h | 2 ++ src/gui/SettingsWidget.cpp | 2 ++ src/gui/SettingsWidgetSecurity.ui | 7 +++++++ 8 files changed, 63 insertions(+), 2 deletions(-) diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp index 0dfdedaec..e1f14d5bc 100644 --- a/src/autotype/AutoType.cpp +++ b/src/autotype/AutoType.cpp @@ -143,6 +143,8 @@ QStringList AutoType::windowTitles() void AutoType::resetInAutoType() { m_inAutoType.unlock(); + + emit autotypeRejected(); } void AutoType::raiseWindow() @@ -199,6 +201,7 @@ void AutoType::executeAutoTypeActions(const Entry* entry, QWidget* hideWindow, c { // no edit to the sequence beyond this point if (!verifyAutoTypeSyntax(sequence)) { + emit autotypeRejected(); return; } @@ -206,6 +209,7 @@ void AutoType::executeAutoTypeActions(const Entry* entry, QWidget* hideWindow, c ListDeleter<AutoTypeAction*> actionsDeleter(&actions); if (!parseActions(sequence, entry, actions)) { + emit autotypeRejected(); return; } @@ -228,12 +232,16 @@ void AutoType::executeAutoTypeActions(const Entry* entry, QWidget* hideWindow, c for (AutoTypeAction* action : asConst(actions)) { if (m_plugin->activeWindow() != window) { qWarning("Active window changed, interrupting auto-type."); - break; + emit autotypeRejected(); + return; } action->accept(m_executor); QCoreApplication::processEvents(QEventLoop::AllEvents, 10); } + + // emit signal only if autotype performed correctly + emit autotypePerformed(); } /** @@ -300,6 +308,8 @@ void AutoType::performGlobalAutoType(const QList<Database*>& dbList) message.append("\n\n"); message.append(windowTitle); MessageBox::information(nullptr, tr("Auto-Type - KeePassXC"), message); + + emit autotypeRejected(); } else if ((matchList.size() == 1) && !config()->get("security/autotypeask").toBool()) { executeAutoTypeActions(matchList.first().entry, nullptr, matchList.first().sequence); m_inAutoType.unlock(); diff --git a/src/autotype/AutoType.h b/src/autotype/AutoType.h index 3b22106bd..98a7bd7fa 100644 --- a/src/autotype/AutoType.h +++ b/src/autotype/AutoType.h @@ -64,6 +64,8 @@ public slots: signals: void globalShortcutTriggered(); + void autotypePerformed(); + void autotypeRejected(); private slots: void performAutoTypeFromGlobal(AutoTypeMatch match); diff --git a/src/autotype/AutoTypeSelectDialog.cpp b/src/autotype/AutoTypeSelectDialog.cpp index 3ef086481..eae9e6ffb 100644 --- a/src/autotype/AutoTypeSelectDialog.cpp +++ b/src/autotype/AutoTypeSelectDialog.cpp @@ -35,6 +35,7 @@ AutoTypeSelectDialog::AutoTypeSelectDialog(QWidget* parent) : QDialog(parent) , m_view(new AutoTypeSelectView(this)) , m_matchActivatedEmitted(false) + , m_rejected(false) { setAttribute(Qt::WA_DeleteOnClose); // Places the window on the active (virtual) desktop instead of where the main window is. @@ -83,6 +84,13 @@ void AutoTypeSelectDialog::done(int r) QDialog::done(r); } +void AutoTypeSelectDialog::reject() +{ + m_rejected = true; + + QDialog::reject(); +} + void AutoTypeSelectDialog::emitMatchActivated(const QModelIndex& index) { // make sure we don't emit the signal twice when both activated() and clicked() are triggered @@ -98,6 +106,10 @@ void AutoTypeSelectDialog::emitMatchActivated(const QModelIndex& index) void AutoTypeSelectDialog::matchRemoved() { + if (m_rejected) { + return; + } + if (m_view->model()->rowCount() == 0) { reject(); } diff --git a/src/autotype/AutoTypeSelectDialog.h b/src/autotype/AutoTypeSelectDialog.h index 83abd2d80..cee3c4087 100644 --- a/src/autotype/AutoTypeSelectDialog.h +++ b/src/autotype/AutoTypeSelectDialog.h @@ -39,6 +39,7 @@ signals: public slots: void done(int r) override; + void reject() override; private slots: void emitMatchActivated(const QModelIndex& index); @@ -47,6 +48,7 @@ private slots: private: AutoTypeSelectView* const m_view; bool m_matchActivatedEmitted; + bool m_rejected; }; #endif // KEEPASSX_AUTOTYPESELECTDIALOG_H diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp index f9b7fbd72..b3963f7b1 100644 --- a/src/gui/DatabaseTabWidget.cpp +++ b/src/gui/DatabaseTabWidget.cpp @@ -54,6 +54,7 @@ const int DatabaseTabWidget::LastDatabasesCount = 5; DatabaseTabWidget::DatabaseTabWidget(QWidget* parent) : QTabWidget(parent) , m_dbWidgetStateSync(new DatabaseWidgetStateSync(this)) + , m_dbPendingLock(nullptr) { DragTabBar* tabBar = new DragTabBar(this); setTabBar(tabBar); @@ -63,6 +64,7 @@ DatabaseTabWidget::DatabaseTabWidget(QWidget* parent) connect(this, SIGNAL(currentChanged(int)), SLOT(emitActivateDatabaseChanged())); connect(this, SIGNAL(activateDatabaseChanged(DatabaseWidget*)), m_dbWidgetStateSync, SLOT(setActive(DatabaseWidget*))); connect(autoType(), SIGNAL(globalShortcutTriggered()), SLOT(performGlobalAutoType())); + connect(autoType(), SIGNAL(autotypePerformed()), SLOT(relockPendingDatabase())); } DatabaseTabWidget::~DatabaseTabWidget() @@ -737,6 +739,27 @@ void DatabaseTabWidget::lockDatabases() } } +/** + * This function relock the pending database when autotype has been performed successfully + * A database is marked as pending when it's unlocked after a global Auto-Type invocation + */ +void DatabaseTabWidget::relockPendingDatabase() +{ + if (!m_dbPendingLock || !config()->get("security/relockautotype").toBool()) { + return; + } + + if (m_dbPendingLock->currentMode() == DatabaseWidget::LockedMode || !m_dbPendingLock->dbHasKey()) { + m_dbPendingLock = nullptr; + return; + } + + m_dbPendingLock->lock(); + + emit databaseLocked(m_dbPendingLock); + m_dbPendingLock = nullptr; +} + void DatabaseTabWidget::modified() { Q_ASSERT(qobject_cast<Database*>(sender())); @@ -827,6 +850,7 @@ void DatabaseTabWidget::performGlobalAutoType() if (unlockedDatabases.size() > 0) { autoType()->performGlobalAutoType(unlockedDatabases); } else if (m_dbList.size() > 0){ - indexDatabaseManagerStruct(0).dbWidget->showUnlockDialog(); + m_dbPendingLock = indexDatabaseManagerStruct(0).dbWidget; + m_dbPendingLock->showUnlockDialog(); } } diff --git a/src/gui/DatabaseTabWidget.h b/src/gui/DatabaseTabWidget.h index b839fb3ab..38f9b8474 100644 --- a/src/gui/DatabaseTabWidget.h +++ b/src/gui/DatabaseTabWidget.h @@ -79,6 +79,7 @@ public slots: bool isModified(int index = -1); void performGlobalAutoType(); void lockDatabases(); + void relockPendingDatabase(); QString databasePath(int index = -1); signals: @@ -117,6 +118,7 @@ private: QHash<Database*, DatabaseManagerStruct> m_dbList; QPointer<DatabaseWidgetStateSync> m_dbWidgetStateSync; + QPointer<DatabaseWidget> m_dbPendingLock; }; #endif // KEEPASSX_DATABASETABWIDGET_H diff --git a/src/gui/SettingsWidget.cpp b/src/gui/SettingsWidget.cpp index 919edf9fd..9e4152e25 100644 --- a/src/gui/SettingsWidget.cpp +++ b/src/gui/SettingsWidget.cpp @@ -161,6 +161,7 @@ void SettingsWidget::loadSettings() m_secUi->lockDatabaseIdleSpinBox->setValue(config()->get("security/lockdatabaseidlesec").toInt()); m_secUi->lockDatabaseMinimizeCheckBox->setChecked(config()->get("security/lockdatabaseminimize").toBool()); m_secUi->lockDatabaseOnScreenLockCheckBox->setChecked(config()->get("security/lockdatabasescreenlock").toBool()); + m_secUi->relockDatabaseAutoTypeCheckBox->setChecked(config()->get("security/relockautotype").toBool()); m_secUi->fallbackToGoogle->setChecked(config()->get("security/IconDownloadFallbackToGoogle").toBool()); m_secUi->passwordCleartextCheckBox->setChecked(config()->get("security/passwordscleartext").toBool()); @@ -233,6 +234,7 @@ void SettingsWidget::saveSettings() config()->set("security/lockdatabaseidlesec", m_secUi->lockDatabaseIdleSpinBox->value()); config()->set("security/lockdatabaseminimize", m_secUi->lockDatabaseMinimizeCheckBox->isChecked()); config()->set("security/lockdatabasescreenlock", m_secUi->lockDatabaseOnScreenLockCheckBox->isChecked()); + config()->set("security/relockautotype", m_secUi->relockDatabaseAutoTypeCheckBox->isChecked()); config()->set("security/IconDownloadFallbackToGoogle", m_secUi->fallbackToGoogle->isChecked()); config()->set("security/passwordscleartext", m_secUi->passwordCleartextCheckBox->isChecked()); diff --git a/src/gui/SettingsWidgetSecurity.ui b/src/gui/SettingsWidgetSecurity.ui index b1c41338d..da3def868 100644 --- a/src/gui/SettingsWidgetSecurity.ui +++ b/src/gui/SettingsWidgetSecurity.ui @@ -122,6 +122,13 @@ </property> </widget> </item> + <item row="6" column="0"> + <widget class="QCheckBox" name="relockDatabaseAutoTypeCheckBox"> + <property name="text"> + <string>Re-lock previously locked database after performing Auto-Type</string> + </property> + </widget> + </item> <item> <widget class="QCheckBox" name="passwordRepeatCheckBox"> <property name="text"> From 490e92167db2b23e79d802e7b59cfe18ae3f8759 Mon Sep 17 00:00:00 2001 From: Jonathan White <droidmonkey@users.noreply.github.com> Date: Wed, 7 Feb 2018 07:10:56 -0500 Subject: [PATCH 339/402] Replace qhttp client with curl for favicon downloading (#1460) Replace qhttp client with curl for favicon downloading --- .travis.yml | 47 ---------- Dockerfile | 5 +- ci/trusty/Dockerfile | 1 + snapcraft.yaml | 1 + src/CMakeLists.txt | 20 ++--- src/gui/EditWidgetIcons.cpp | 173 +++++++++++++----------------------- src/gui/EditWidgetIcons.h | 18 +--- src/gui/MainWindow.cpp | 10 +-- src/http/CMakeLists.txt | 6 +- 9 files changed, 87 insertions(+), 194 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 7183e19f5..000000000 --- a/.travis.yml +++ /dev/null @@ -1,47 +0,0 @@ -language: cpp -sudo: required -dist: trusty -# FIXME : remove when (https://github.com/google/sanitizers/issues/837) is resolved. -group: deprecated-2017Q3 -services: [docker] - -os: - - linux -# - osx - -# Define clang compiler without any frills -compiler: - - clang - - gcc - -env: - - CONFIG=Release ASAN_OPTIONS=detect_odr_violation=1 - - CONFIG=Debug ASAN_OPTIONS=detect_odr_violation=1 - -git: - depth: 3 - -before_install: - - if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo apt-get -qq update; fi - - if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo apt-get -qq install cmake3 libclang-common-3.5-dev libxi-dev qtbase5-dev libqt5x11extras5-dev qttools5-dev qttools5-dev-tools libgcrypt20-dev zlib1g-dev libxtst-dev xvfb libyubikey-dev libykpers-1-dev; fi - - if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew update; fi - - if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew ls | grep -wq cmake || brew install cmake; fi - - if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew ls | grep -wq qt5 || brew install qt5; fi - - if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew ls | grep -wq libgcrypt || brew install libgcrypt; fi - -before_script: - - if [ "$TRAVIS_OS_NAME" = "osx" ]; then CMAKE_ARGS="-DCMAKE_PREFIX_PATH=/usr/local/opt/qt5"; fi - - mkdir build && pushd build - -script: - - cmake -DCMAKE_BUILD_TYPE=${CONFIG} -DWITH_GUI_TESTS=ON -DWITH_ASAN=ON -DWITH_XC_HTTP=ON -DWITH_XC_AUTOTYPE=ON -DWITH_XC_YUBIKEY=ON -DWITH_XC_SSHAGENT=ON $CMAKE_ARGS .. - - make -j2 - - if [ "$TRAVIS_OS_NAME" = "linux" ]; then make test ARGS+="-E testgui --output-on-failure"; fi - - if [ "$TRAVIS_OS_NAME" = "linux" ]; then ASAN_OPTIONS=${ASAN_OPTIONS}:leak_check_at_exit=0 xvfb-run -a --server-args="-screen 0 800x600x24" make test ARGS+="-R testgui --output-on-failure"; fi - - if [ "$TRAVIS_OS_NAME" = "osx" ]; then make test ARGS+="--output-on-failure"; fi - -# Generate snapcraft build when merging into master/develop branches -#after_success: -# - popd -# - "[[ $DEPLOY = 1 ]] && [[ $CONFIG = Release ]] && [[ $TRAVIS_BRANCH =~ (master|develop) ]] && [[ $TRAVIS_PULL_REQUEST = false ]] \ -# && docker run -v $(pwd):/cwd snapcore/snapcraft sh -c 'cd /cwd && apt update && snapcraft'" diff --git a/Dockerfile b/Dockerfile index 91eb6f395..0a5c464bd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,7 +16,7 @@ FROM ubuntu:14.04 -ENV REBUILD_COUNTER=4 +ENV REBUILD_COUNTER=5 ENV QT5_VERSION=59 ENV QT5_PPA_VERSION=${QT5_VERSION}2 @@ -51,7 +51,8 @@ RUN set -x \ libxtst-dev \ mesa-common-dev \ libyubikey-dev \ - libykpers-1-dev + libykpers-1-dev \ + libcurl4-openssl-dev ENV CMAKE_PREFIX_PATH="/opt/qt${QT5_VERSION}/lib/cmake" ENV CMAKE_INCLUDE_PATH="/opt/libgcrypt20-18/include:/opt/gpg-error-127/include" diff --git a/ci/trusty/Dockerfile b/ci/trusty/Dockerfile index cdaba3a07..5ef9cac23 100644 --- a/ci/trusty/Dockerfile +++ b/ci/trusty/Dockerfile @@ -43,6 +43,7 @@ RUN set -x \ libgcrypt20-18-dev \ libargon2-0-dev \ libsodium-dev \ + libcurl4-openssl-dev \ qt${QT5_VERSION}base \ qt${QT5_VERSION}tools \ qt${QT5_VERSION}x11extras \ diff --git a/snapcraft.yaml b/snapcraft.yaml index d614c354f..81d4ae3b3 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -42,6 +42,7 @@ parts: - libxtst-dev - libyubikey-dev - libykpers-1-dev + - libcurl4-openssl-dev - libsodium-dev stage-packages: - dbus diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4b7c07cd6..f01780baa 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -199,13 +199,9 @@ add_feature_info(KeePassHTTP WITH_XC_HTTP "Browser integration compatible with C add_feature_info(SSHAgent WITH_XC_SSHAGENT "SSH agent integration compatible with KeeAgent") add_feature_info(YubiKey WITH_XC_YUBIKEY "YubiKey HMAC-SHA1 challenge-response") -if(WITH_XC_HTTP) - add_subdirectory(http) - set(keepasshttp_LIB keepasshttp) -endif() +add_subdirectory(http) if(WITH_XC_NETWORKING) - add_subdirectory(http/qhttp) - set(keepassxcnetwork_LIB qhttp Qt5::Network) + find_package(CURL REQUIRED) endif() set(BROWSER_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/browser) @@ -251,23 +247,21 @@ endif() add_library(autotype STATIC ${autotype_SOURCES}) target_link_libraries(autotype Qt5::Core Qt5::Widgets) -set(autotype_LIB autotype) - add_library(keepassx_core STATIC ${keepassx_SOURCES}) set_target_properties(keepassx_core PROPERTIES COMPILE_DEFINITIONS KEEPASSX_BUILDING_CORE) target_link_libraries(keepassx_core + autotype + ${keepassxchttp_LIB} ${keepassxcbrowser_LIB} - ${keepasshttp_LIB} - ${keepassxcnetwork_LIB} - ${autotype_LIB} ${sshagent_LIB} - ${YUBIKEY_LIBRARIES} - ${ZXCVBN_LIBRARIES} Qt5::Core Qt5::Network Qt5::Concurrent Qt5::Widgets + ${CURL_LIBRARIES} + ${YUBIKEY_LIBRARIES} + ${ZXCVBN_LIBRARIES} ${ARGON2_LIBRARIES} ${GCRYPT_LIBRARIES} ${GPGERROR_LIBRARIES} diff --git a/src/gui/EditWidgetIcons.cpp b/src/gui/EditWidgetIcons.cpp index 6f5e7ee13..9a73c293c 100644 --- a/src/gui/EditWidgetIcons.cpp +++ b/src/gui/EditWidgetIcons.cpp @@ -31,10 +31,9 @@ #include "gui/MessageBox.h" #ifdef WITH_XC_NETWORKING -#include "http/qhttp/qhttpclient.hpp" -#include "http/qhttp/qhttpclientresponse.hpp" - -using namespace qhttp::client; +#include <curl/curl.h> +#include "core/AsyncTask.h" +#undef MessageBox #endif IconStruct::IconStruct() @@ -49,10 +48,6 @@ EditWidgetIcons::EditWidgetIcons(QWidget* parent) , m_database(nullptr) , m_defaultIconModel(new DefaultIconModel(this)) , m_customIconModel(new CustomIconModel(this)) -#ifdef WITH_XC_NETWORKING - , m_fallbackToGoogle(true) - , m_redirectCount(0) -#endif { m_ui->setupUi(this); @@ -88,17 +83,14 @@ IconStruct EditWidgetIcons::state() QModelIndex index = m_ui->defaultIconsView->currentIndex(); if (index.isValid()) { iconStruct.number = index.row(); - } - else { + } else { Q_ASSERT(false); } - } - else { + } else { QModelIndex index = m_ui->customIconsView->currentIndex(); if (index.isValid()) { iconStruct.uuid = m_customIconModel->uuidFromIndex(m_ui->customIconsView->currentIndex()); - } - else { + } else { iconStruct.number = -1; } } @@ -129,14 +121,12 @@ void EditWidgetIcons::load(const Uuid& currentUuid, Database* database, const Ic int iconNumber = iconStruct.number; m_ui->defaultIconsView->setCurrentIndex(m_defaultIconModel->index(iconNumber, 0)); m_ui->defaultIconsRadio->setChecked(true); - } - else { + } else { QModelIndex index = m_customIconModel->indexFromUuid(iconUuid); if (index.isValid()) { m_ui->customIconsView->setCurrentIndex(index); m_ui->customIconsRadio->setChecked(true); - } - else { + } else { m_ui->defaultIconsView->setCurrentIndex(m_defaultIconModel->index(0, 0)); m_ui->defaultIconsRadio->setChecked(true); } @@ -148,7 +138,6 @@ void EditWidgetIcons::setUrl(const QString& url) #ifdef WITH_XC_NETWORKING m_url = url; m_ui->faviconButton->setVisible(!url.isEmpty()); - resetFaviconDownload(); #else Q_UNUSED(url); m_ui->faviconButton->setVisible(false); @@ -158,107 +147,75 @@ void EditWidgetIcons::setUrl(const QString& url) void EditWidgetIcons::downloadFavicon() { #ifdef WITH_XC_NETWORKING + m_ui->faviconButton->setDisabled(true); + QUrl url = QUrl(m_url); url.setPath("/favicon.ico"); - fetchFavicon(url); + // Attempt to simply load the favicon.ico file + QImage image = fetchFavicon(url); + if (!image.isNull()) { + addCustomIcon(image); + } else if (config()->get("security/IconDownloadFallbackToGoogle", false).toBool()) { + QUrl faviconUrl = QUrl("https://www.google.com/s2/favicons"); + faviconUrl.setQuery("domain=" + QUrl::toPercentEncoding(url.host())); + // Attempt to load favicon from Google + image = fetchFavicon(faviconUrl); + if (!image.isNull()) { + addCustomIcon(image); + } else { + emit messageEditEntry(tr("Unable to fetch favicon."), MessageWidget::Error); + } + } else { + emit messageEditEntry(tr("Unable to fetch favicon.") + "\n" + + tr("Hint: You can enable Google as a fallback under Tools>Settings>Security"), + MessageWidget::Error); + } + + m_ui->faviconButton->setDisabled(false); #endif } #ifdef WITH_XC_NETWORKING -void EditWidgetIcons::fetchFavicon(const QUrl& url) +namespace { +std::size_t writeCurlResponse(char* ptr, std::size_t size, std::size_t nmemb, void* data) { - if (nullptr == m_httpClient) { - m_httpClient = new QHttpClient(this); - } + QByteArray* response = static_cast<QByteArray*>(data); + std::size_t realsize = size * nmemb; + response->append(ptr, realsize); + return realsize; +} +} - bool requestMade = m_httpClient->request(qhttp::EHTTP_GET, url, [this, url](QHttpResponse* response) { - if (m_database == nullptr) { - return; - } +QImage EditWidgetIcons::fetchFavicon(const QUrl& url) +{ + QImage image; + CURL* curl = curl_easy_init(); + if (curl) { + QByteArray imagedata; + QByteArray baUrl = url.url().toLatin1(); - response->collectData(); - response->onEnd([this, response, &url]() { - int status = response->status(); - if (200 == status) { - QImage image; - image.loadFromData(response->collectedData()); + curl_easy_setopt(curl, CURLOPT_URL, baUrl.data()); + curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 5L); + curl_easy_setopt(curl, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 5L); + curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &imagedata); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &writeCurlResponse); - if (!image.isNull()) { - addCustomIcon(image); - resetFaviconDownload(); - } else { - fetchFaviconFromGoogle(url.host()); - } - } else if (301 == status || 302 == status) { - // Check if server has sent a redirect - QUrl possibleRedirectUrl(response->headers().value("location", "")); - if (!possibleRedirectUrl.isEmpty() && possibleRedirectUrl != m_redirectUrl && m_redirectCount < 3) { - resetFaviconDownload(false); - m_redirectUrl = possibleRedirectUrl; - ++m_redirectCount; - fetchFavicon(m_redirectUrl); - } else { - // website is trying to redirect to itself or - // maximum number of redirects has been reached, fall back to Google - fetchFaviconFromGoogle(url.host()); - } - } else { - fetchFaviconFromGoogle(url.host()); - } + // Perform the request in another thread + CURLcode result = AsyncTask::runAndWaitForFuture([curl]() { + return curl_easy_perform(curl); }); - }); - if (!requestMade) { - resetFaviconDownload(); - return; - } - - m_httpClient->setConnectingTimeOut(5000, [this]() { - QUrl tempurl = QUrl(m_url); - if (tempurl.scheme() == "http") { - resetFaviconDownload(); - emit messageEditEntry(tr("Unable to fetch favicon.") + "\n" + - tr("Hint: You can enable Google as a fallback under Tools>Settings>Security"), - MessageWidget::Error); - } else { - tempurl.setScheme("http"); - m_url = tempurl.url(); - tempurl.setPath("/favicon.ico"); - fetchFavicon(tempurl); + if (result == CURLE_OK) { + image.loadFromData(imagedata); } - }); - m_ui->faviconButton->setDisabled(true); -} - -void EditWidgetIcons::fetchFaviconFromGoogle(const QString& domain) -{ - if (config()->get("security/IconDownloadFallbackToGoogle", false).toBool() && m_fallbackToGoogle) { - resetFaviconDownload(); - m_fallbackToGoogle = false; - QUrl faviconUrl = QUrl("https://www.google.com/s2/favicons"); - faviconUrl.setQuery("domain=" + QUrl::toPercentEncoding(domain)); - fetchFavicon(faviconUrl); - } else { - resetFaviconDownload(); - emit messageEditEntry(tr("Unable to fetch favicon."), MessageWidget::Error); - } -} - -void EditWidgetIcons::resetFaviconDownload(bool clearRedirect) -{ - if (clearRedirect) { - m_redirectUrl.clear(); - m_redirectCount = 0; + curl_easy_cleanup(curl); } - if (nullptr != m_httpClient) { - m_httpClient->deleteLater(); - m_httpClient = nullptr; - } - - m_fallbackToGoogle = true; - m_ui->faviconButton->setDisabled(false); + return image; } #endif @@ -281,7 +238,7 @@ void EditWidgetIcons::addCustomIconFromFile() } } -void EditWidgetIcons::addCustomIcon(const QImage &icon) +void EditWidgetIcons::addCustomIcon(const QImage& icon) { if (m_database) { Uuid uuid = m_database->metadata()->findCustomIcon(icon); @@ -392,8 +349,7 @@ void EditWidgetIcons::updateWidgetsDefaultIcons(bool check) QModelIndex index = m_ui->defaultIconsView->currentIndex(); if (!index.isValid()) { m_ui->defaultIconsView->setCurrentIndex(m_defaultIconModel->index(0, 0)); - } - else { + } else { m_ui->defaultIconsView->setCurrentIndex(index); } m_ui->customIconsView->selectionModel()->clearSelection(); @@ -408,8 +364,7 @@ void EditWidgetIcons::updateWidgetsCustomIcons(bool check) QModelIndex index = m_ui->customIconsView->currentIndex(); if (!index.isValid()) { m_ui->customIconsView->setCurrentIndex(m_customIconModel->index(0, 0)); - } - else { + } else { m_ui->customIconsView->setCurrentIndex(index); } m_ui->defaultIconsView->selectionModel()->clearSelection(); diff --git a/src/gui/EditWidgetIcons.h b/src/gui/EditWidgetIcons.h index 796dd5939..7b5edf80c 100644 --- a/src/gui/EditWidgetIcons.h +++ b/src/gui/EditWidgetIcons.h @@ -32,14 +32,6 @@ class Database; class DefaultIconModel; class CustomIconModel; -#ifdef WITH_XC_NETWORKING -namespace qhttp { - namespace client { - class QHttpClient; - } -} -#endif - namespace Ui { class EditWidgetIcons; } @@ -74,9 +66,7 @@ signals: private slots: void downloadFavicon(); #ifdef WITH_XC_NETWORKING - void fetchFavicon(const QUrl& url); - void fetchFaviconFromGoogle(const QString& domain); - void resetFaviconDownload(bool clearRedirect = true); + QImage fetchFavicon(const QUrl& url); #endif void addCustomIconFromFile(); void addCustomIcon(const QImage& icon); @@ -93,12 +83,6 @@ private: QString m_url; DefaultIconModel* const m_defaultIconModel; CustomIconModel* const m_customIconModel; -#ifdef WITH_XC_NETWORKING - QUrl m_redirectUrl; - bool m_fallbackToGoogle; - unsigned short m_redirectCount; - qhttp::client::QHttpClient* m_httpClient = nullptr; -#endif Q_DISABLE_COPY(EditWidgetIcons) }; diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index def6e6575..6fad65859 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -69,7 +69,7 @@ class HttpPlugin: public ISettingsPage { public: - HttpPlugin(DatabaseTabWidget * tabWidget) + HttpPlugin(DatabaseTabWidget* tabWidget) { m_service = new Service(tabWidget); } @@ -88,18 +88,18 @@ public: QWidget * createWidget() override { - OptionDialog * dlg = new OptionDialog(); + OptionDialog* dlg = new OptionDialog(); QObject::connect(dlg, SIGNAL(removeSharedEncryptionKeys()), m_service, SLOT(removeSharedEncryptionKeys())); QObject::connect(dlg, SIGNAL(removeStoredPermissions()), m_service, SLOT(removeStoredPermissions())); return dlg; } - void loadSettings(QWidget * widget) override + void loadSettings(QWidget* widget) override { qobject_cast<OptionDialog*>(widget)->loadSettings(); } - void saveSettings(QWidget * widget) override + void saveSettings(QWidget* widget) override { qobject_cast<OptionDialog*>(widget)->saveSettings(); if (HttpSettings::isEnabled()) @@ -108,7 +108,7 @@ public: m_service->stop(); } private: - Service *m_service; + Service* m_service; }; #endif diff --git a/src/http/CMakeLists.txt b/src/http/CMakeLists.txt index db9f5dfb3..962f78c36 100644 --- a/src/http/CMakeLists.txt +++ b/src/http/CMakeLists.txt @@ -1,4 +1,6 @@ if(WITH_XC_HTTP) + add_subdirectory(qhttp) + include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) set(keepasshttp_SOURCES @@ -13,5 +15,7 @@ if(WITH_XC_HTTP) ) add_library(keepasshttp STATIC ${keepasshttp_SOURCES}) - target_link_libraries(keepasshttp qhttp Qt5::Core Qt5::Concurrent Qt5::Widgets Qt5::Network) + target_link_libraries(keepasshttp PUBLIC qhttp Qt5::Core Qt5::Concurrent Qt5::Widgets Qt5::Network) + + set(keepassxchttp_LIB keepasshttp PARENT_SCOPE) endif() From 27f8aa095a26f3d6021525b3c27b3b25e5143320 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Fri, 19 Jan 2018 15:48:40 +0100 Subject: [PATCH 340/402] add diceware and passgen to the cli interface --- src/cli/CMakeLists.txt | 4 ++ src/cli/Command.cpp | 4 ++ src/cli/Diceware.cpp | 79 +++++++++++++++++++++++++++++ src/cli/Diceware.h | 31 ++++++++++++ src/cli/PassGen.cpp | 108 ++++++++++++++++++++++++++++++++++++++++ src/cli/PassGen.h | 31 ++++++++++++ src/cli/keepassxc-cli.1 | 35 ++++++++++++- 7 files changed, 291 insertions(+), 1 deletion(-) create mode 100644 src/cli/Diceware.cpp create mode 100644 src/cli/Diceware.h create mode 100644 src/cli/PassGen.cpp create mode 100644 src/cli/PassGen.h diff --git a/src/cli/CMakeLists.txt b/src/cli/CMakeLists.txt index 225ce47dc..92277811b 100644 --- a/src/cli/CMakeLists.txt +++ b/src/cli/CMakeLists.txt @@ -20,6 +20,8 @@ set(cli_SOURCES Clip.h Command.cpp Command.h + Diceware.cpp + Diceware.h Edit.cpp Edit.h Estimate.cpp @@ -32,6 +34,8 @@ set(cli_SOURCES Locate.h Merge.cpp Merge.h + PassGen.cpp + PassGen.h Remove.cpp Remove.h Show.cpp diff --git a/src/cli/Command.cpp b/src/cli/Command.cpp index 6ec07b7af..a9a53449e 100644 --- a/src/cli/Command.cpp +++ b/src/cli/Command.cpp @@ -24,12 +24,14 @@ #include "Add.h" #include "Clip.h" +#include "Diceware.h" #include "Edit.h" #include "Estimate.h" #include "Extract.h" #include "List.h" #include "Locate.h" #include "Merge.h" +#include "PassGen.h" #include "Remove.h" #include "Show.h" @@ -61,12 +63,14 @@ void populateCommands() if (commands.isEmpty()) { commands.insert(QString("add"), new Add()); commands.insert(QString("clip"), new Clip()); + commands.insert(QString("diceware"), new Diceware()); commands.insert(QString("edit"), new Edit()); commands.insert(QString("estimate"), new Estimate()); commands.insert(QString("extract"), new Extract()); commands.insert(QString("locate"), new Locate()); commands.insert(QString("ls"), new List()); commands.insert(QString("merge"), new Merge()); + commands.insert(QString("passgen"), new PassGen()); commands.insert(QString("rm"), new Remove()); commands.insert(QString("show"), new Show()); } diff --git a/src/cli/Diceware.cpp b/src/cli/Diceware.cpp new file mode 100644 index 000000000..ddc8f43a5 --- /dev/null +++ b/src/cli/Diceware.cpp @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <cstdlib> +#include <stdio.h> + +#include "Diceware.h" + +#include <QCommandLineParser> +#include <QTextStream> + +#include "core/PassphraseGenerator.h" + +Diceware::Diceware() +{ + this->name = QString("diceware"); + this->description = QObject::tr("Generate a new random password."); +} + +Diceware::~Diceware() +{ +} + +int Diceware::execute(QStringList arguments) +{ + QTextStream inputTextStream(stdin, QIODevice::ReadOnly); + QTextStream outputTextStream(stdout, QIODevice::WriteOnly); + + QCommandLineParser parser; + parser.setApplicationDescription(this->description); + QCommandLineOption wordlistFile(QStringList() << "w" + << "wordlist", + QObject::tr("Wordlist fot the diceware generator.\n[Default: EFF English]"), + QObject::tr("path")); + parser.addOption(wordlistFile); + parser.addPositionalArgument("words", QObject::tr("Word count for the diceware generator.")); + parser.process(arguments); + + const QStringList args = parser.positionalArguments(); + if (args.size() != 1) { + outputTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli diceware"); + return EXIT_FAILURE; + } + + PassphraseGenerator dicewareGenerator; + + int words = args.at(0).toInt(); + dicewareGenerator.setWordCount(words); + + if (!parser.value(wordlistFile).isEmpty()) { + dicewareGenerator.setWordList(parser.value(wordlistFile)); + } else { + dicewareGenerator.setDefaultWordList(); + } + + if (!dicewareGenerator.isValid()) { + outputTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli passgen"); + return EXIT_FAILURE; + } + + QString password = dicewareGenerator.generatePassphrase(); + outputTextStream << password << endl; + + return EXIT_SUCCESS; +} diff --git a/src/cli/Diceware.h b/src/cli/Diceware.h new file mode 100644 index 000000000..b6d71b6c6 --- /dev/null +++ b/src/cli/Diceware.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef KEEPASSXC_DICEWARE_H +#define KEEPASSXC_DICEWARE_H + +#include "Command.h" + +class Diceware : public Command +{ +public: + Diceware(); + ~Diceware(); + int execute(QStringList arguments); +}; + +#endif // KEEPASSXC_DICEWARE_H diff --git a/src/cli/PassGen.cpp b/src/cli/PassGen.cpp new file mode 100644 index 000000000..036f08db9 --- /dev/null +++ b/src/cli/PassGen.cpp @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <cstdlib> +#include <stdio.h> + +#include "PassGen.h" + +#include <QCommandLineParser> +#include <QTextStream> + +#include "core/PasswordGenerator.h" + +PassGen::PassGen() +{ + this->name = QString("passgen"); + this->description = QObject::tr("Generate a new random password."); +} + +PassGen::~PassGen() +{ +} + +int PassGen::execute(QStringList arguments) +{ + QTextStream inputTextStream(stdin, QIODevice::ReadOnly); + QTextStream outputTextStream(stdout, QIODevice::WriteOnly); + + QCommandLineParser parser; + parser.setApplicationDescription(this->description); + QCommandLineOption lower(QStringList() << "l", + QObject::tr("Use lowercase in the generated password.")); + parser.addOption(lower); + QCommandLineOption upper(QStringList() << "u", + QObject::tr("Use uppercase in the generated password.")); + parser.addOption(upper); + QCommandLineOption numeric(QStringList() << "n", + QObject::tr("Use numbers in the generated password.")); + parser.addOption(numeric); + QCommandLineOption special(QStringList() << "s", + QObject::tr("Use special characters in the generated password.")); + parser.addOption(special); + QCommandLineOption extended(QStringList() << "e", + QObject::tr("Use extended ascii in the generated password.")); + parser.addOption(extended); + parser.addPositionalArgument("length", QObject::tr("Length of the generated password.")); + parser.process(arguments); + + const QStringList args = parser.positionalArguments(); + if (args.size() != 1) { + outputTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli passgen"); + return EXIT_FAILURE; + } + + PasswordGenerator passwordGenerator; + + int length = args.at(0).toInt(); + passwordGenerator.setLength(length); + + PasswordGenerator::CharClasses classes = 0x0; + + if (parser.isSet(lower)) { + classes |= PasswordGenerator::LowerLetters; + } + if (parser.isSet(upper)) { + classes |= PasswordGenerator::UpperLetters; + } + if (parser.isSet(numeric)) { + classes |= PasswordGenerator::Numbers; + } + if (parser.isSet(special)) { + classes |= PasswordGenerator::SpecialCharacters; + } + if (parser.isSet(extended)) { + classes |= PasswordGenerator::EASCII; + } + + if (classes == 0x0) { + passwordGenerator.setCharClasses(PasswordGenerator::LowerLetters | PasswordGenerator::UpperLetters | + PasswordGenerator::Numbers); + } else { + passwordGenerator.setCharClasses(classes); + } + + if (!passwordGenerator.isValid()) { + outputTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli passgen"); + return EXIT_FAILURE; + } + + QString password = passwordGenerator.generatePassword(); + outputTextStream << password << endl; + + return EXIT_SUCCESS; +} diff --git a/src/cli/PassGen.h b/src/cli/PassGen.h new file mode 100644 index 000000000..5c0b33aeb --- /dev/null +++ b/src/cli/PassGen.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef KEEPASSXC_PASSGEN_H +#define KEEPASSXC_PASSGEN_H + +#include "Command.h" + +class PassGen : public Command +{ +public: + PassGen(); + ~PassGen(); + int execute(QStringList arguments); +}; + +#endif // KEEPASSXC_PASSGEN_H diff --git a/src/cli/keepassxc-cli.1 b/src/cli/keepassxc-cli.1 index a9145b27e..6a772e7cd 100644 --- a/src/cli/keepassxc-cli.1 +++ b/src/cli/keepassxc-cli.1 @@ -1,4 +1,4 @@ -.TH KEEPASSXC-CLI 1 "Aug 22, 2017" +.TH KEEPASSXC-CLI 1 "Jan 19, 2018" .SH NAME keepassxc-cli \- command line interface for the \fBKeePassXC\fP password manager. @@ -19,6 +19,9 @@ Adds a new entry to a database. A password can be generated (\fI-g\fP option), o .IP "clip [options] <database> <entry> [timeout]" Copies the password of a database entry to the clipboard. If multiple entries with the same name exist in different groups, only the password for the first one is going to be copied. For copying the password of an entry in a specific group, the group path to the entry should be specified as well, instead of just the name. Optionally, a timeout in seconds can be specified to automatically clear the clipboard. +.IP "diceware [options] <words>" +Generate a random diceware passphrase. + .IP "edit [options] <database> <entry>" Edits a database entry. A password can be generated (\fI-g\fP option), or a prompt can be displayed to input the password (\fI-p\fP option). @@ -37,6 +40,9 @@ Lists the contents of a group in a database. If no group is specified, it will d .IP "merge [options] <database1> <database2>" Merges two databases together. The first database file is going to be replaced by the result of the merge, for that reason it is advisable to keep a backup of the two database files before attempting a merge. In the case that both databases make use of the same credentials, the \fI--same-credentials\fP or \fI-s\fP option can be used. +.IP "passgen [options] <length>" +Generate a random password + .IP "rm [options] <database> <entry>" Removes an entry from a database. If the database has a recycle bin, the entry will be moved there. If the entry is already in the recycle bin, it will be removed permanently. @@ -104,6 +110,33 @@ with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given. +.SS "Diceware options" + +.IP "-w, --wordlist <path>" +Path of the wordlist for the diceware generator. The wordlist must have > 1000 words, +otherwise the program will fail. If the wordlist has < 4000 words a warning will +be printed to STDERR. + + +.SS "PassGen options" + +.IP "-l" +Use lowercase characters for the password generator + +.IP "-u" +Use uppercase characters for the password generator + +.IP "-n" +Use numbers characters for the password generator + +.IP "-s" +Use special characters for the password generator + +.IP "-e" +Use extended ascii characters for the password generator + + + .SH REPORTING BUGS Bugs and feature requests can be reported on GitHub at https://github.com/keepassxreboot/keepassxc/issues. From e9612ee9e6fcb14e43102c2636f5f8b4d2e1d968 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Sun, 21 Jan 2018 02:32:46 +0100 Subject: [PATCH 341/402] use default password lenght + minor fixes --- src/cli/Diceware.cpp | 4 ++-- src/cli/PassGen.cpp | 15 +++++++++++---- src/cli/keepassxc-cli.1 | 2 +- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/cli/Diceware.cpp b/src/cli/Diceware.cpp index ddc8f43a5..361be1625 100644 --- a/src/cli/Diceware.cpp +++ b/src/cli/Diceware.cpp @@ -43,7 +43,7 @@ int Diceware::execute(QStringList arguments) QCommandLineParser parser; parser.setApplicationDescription(this->description); QCommandLineOption wordlistFile(QStringList() << "w" - << "wordlist", + << "word-list", QObject::tr("Wordlist fot the diceware generator.\n[Default: EFF English]"), QObject::tr("path")); parser.addOption(wordlistFile); @@ -68,7 +68,7 @@ int Diceware::execute(QStringList arguments) } if (!dicewareGenerator.isValid()) { - outputTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli passgen"); + outputTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli diceware"); return EXIT_FAILURE; } diff --git a/src/cli/PassGen.cpp b/src/cli/PassGen.cpp index 036f08db9..428554dc6 100644 --- a/src/cli/PassGen.cpp +++ b/src/cli/PassGen.cpp @@ -42,6 +42,10 @@ int PassGen::execute(QStringList arguments) QCommandLineParser parser; parser.setApplicationDescription(this->description); + QCommandLineOption len(QStringList() << "L" << "length", + QObject::tr("Length of the generated password."), + QObject::tr("length")); + parser.addOption(len); QCommandLineOption lower(QStringList() << "l", QObject::tr("Use lowercase in the generated password.")); parser.addOption(lower); @@ -57,19 +61,22 @@ int PassGen::execute(QStringList arguments) QCommandLineOption extended(QStringList() << "e", QObject::tr("Use extended ascii in the generated password.")); parser.addOption(extended); - parser.addPositionalArgument("length", QObject::tr("Length of the generated password.")); parser.process(arguments); const QStringList args = parser.positionalArguments(); - if (args.size() != 1) { + if (args.size() != 0) { outputTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli passgen"); return EXIT_FAILURE; } PasswordGenerator passwordGenerator; - int length = args.at(0).toInt(); - passwordGenerator.setLength(length); + if (parser.value(len).isEmpty()) { + passwordGenerator.setLength(PasswordGenerator::DefaultLength); + } else { + int length = parser.value(len).toInt(); + passwordGenerator.setLength(length); + } PasswordGenerator::CharClasses classes = 0x0; diff --git a/src/cli/keepassxc-cli.1 b/src/cli/keepassxc-cli.1 index 6a772e7cd..ec8d35c4c 100644 --- a/src/cli/keepassxc-cli.1 +++ b/src/cli/keepassxc-cli.1 @@ -112,7 +112,7 @@ specified, a summary of the default attributes is given. .SS "Diceware options" -.IP "-w, --wordlist <path>" +.IP "-w, --word-list <path>" Path of the wordlist for the diceware generator. The wordlist must have > 1000 words, otherwise the program will fail. If the wordlist has < 4000 words a warning will be printed to STDERR. From e57a2e0fa943c161841141467715cb9b8bd5cbce Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Mon, 22 Jan 2018 13:47:20 +0100 Subject: [PATCH 342/402] add default charset when not specified explicitly state the wordcount default value --- src/cli/Add.cpp | 3 +-- src/cli/Edit.cpp | 3 +-- src/cli/PassGen.cpp | 7 +------ src/core/PassphraseGenerator.cpp | 2 +- src/core/PassphraseGenerator.h | 2 ++ src/core/PasswordGenerator.cpp | 8 ++++++++ src/core/PasswordGenerator.h | 3 ++- 7 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/cli/Add.cpp b/src/cli/Add.cpp index 13023b5bb..6954532cd 100644 --- a/src/cli/Add.cpp +++ b/src/cli/Add.cpp @@ -133,8 +133,7 @@ int Add::execute(QStringList arguments) passwordGenerator.setLength(passwordLength.toInt()); } - passwordGenerator.setCharClasses(PasswordGenerator::LowerLetters | PasswordGenerator::UpperLetters | - PasswordGenerator::Numbers); + passwordGenerator.setCharClasses(PasswordGenerator::DefaultCharset); QString password = passwordGenerator.generatePassword(); entry->setPassword(password); } diff --git a/src/cli/Edit.cpp b/src/cli/Edit.cpp index 25d2fd456..675ec7def 100644 --- a/src/cli/Edit.cpp +++ b/src/cli/Edit.cpp @@ -149,8 +149,7 @@ int Edit::execute(QStringList arguments) passwordGenerator.setLength(passwordLength.toInt()); } - passwordGenerator.setCharClasses(PasswordGenerator::LowerLetters | PasswordGenerator::UpperLetters | - PasswordGenerator::Numbers); + passwordGenerator.setCharClasses(PasswordGenerator::DefaultCharset); QString password = passwordGenerator.generatePassword(); entry->setPassword(password); } diff --git a/src/cli/PassGen.cpp b/src/cli/PassGen.cpp index 428554dc6..900909559 100644 --- a/src/cli/PassGen.cpp +++ b/src/cli/PassGen.cpp @@ -96,12 +96,7 @@ int PassGen::execute(QStringList arguments) classes |= PasswordGenerator::EASCII; } - if (classes == 0x0) { - passwordGenerator.setCharClasses(PasswordGenerator::LowerLetters | PasswordGenerator::UpperLetters | - PasswordGenerator::Numbers); - } else { - passwordGenerator.setCharClasses(classes); - } + passwordGenerator.setCharClasses(classes); if (!passwordGenerator.isValid()) { outputTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli passgen"); diff --git a/src/core/PassphraseGenerator.cpp b/src/core/PassphraseGenerator.cpp index 115c70d6d..941ba5f38 100644 --- a/src/core/PassphraseGenerator.cpp +++ b/src/core/PassphraseGenerator.cpp @@ -48,7 +48,7 @@ void PassphraseGenerator::setWordCount(int wordCount) m_wordCount = wordCount; } else { // safe default if something goes wrong - m_wordCount = 7; + m_wordCount = DefaultWordCount; } } diff --git a/src/core/PassphraseGenerator.h b/src/core/PassphraseGenerator.h index 20845ff21..7df4b4a74 100644 --- a/src/core/PassphraseGenerator.h +++ b/src/core/PassphraseGenerator.h @@ -36,6 +36,8 @@ public: QString generatePassphrase() const; + static const int DefaultWordCount = 7; + private: int m_wordCount; QString m_separator; diff --git a/src/core/PasswordGenerator.cpp b/src/core/PasswordGenerator.cpp index 21aa590e0..740fb5467 100644 --- a/src/core/PasswordGenerator.cpp +++ b/src/core/PasswordGenerator.cpp @@ -35,11 +35,19 @@ double PasswordGenerator::calculateEntropy(QString password) void PasswordGenerator::setLength(int length) { + if (length <= 0) { + m_length = DefaultLength; + return; + } m_length = length; } void PasswordGenerator::setCharClasses(const CharClasses& classes) { + if (classes == 0) { + m_classes = DefaultCharset; + return; + } m_classes = classes; } diff --git a/src/core/PasswordGenerator.h b/src/core/PasswordGenerator.h index 98bb58b6a..0c13bac05 100644 --- a/src/core/PasswordGenerator.h +++ b/src/core/PasswordGenerator.h @@ -34,7 +34,8 @@ public: UpperLetters = 0x2, Numbers = 0x4, SpecialCharacters = 0x8, - EASCII = 0x10 + EASCII = 0x10, + DefaultCharset = LowerLetters | UpperLetters | Numbers }; Q_DECLARE_FLAGS(CharClasses, CharClass) From 4782b20d6144769e35d5bdec9e23b9677e844344 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Wed, 31 Jan 2018 00:50:02 +0100 Subject: [PATCH 343/402] renamed passgen to generate and use diceware default wordcount --- src/cli/CMakeLists.txt | 4 ++-- src/cli/Command.cpp | 4 ++-- src/cli/Diceware.cpp | 15 +++++++++++---- src/cli/{PassGen.cpp => Generate.cpp} | 14 +++++++------- src/cli/{PassGen.h => Generate.h} | 12 ++++++------ 5 files changed, 28 insertions(+), 21 deletions(-) rename src/cli/{PassGen.cpp => Generate.cpp} (94%) rename src/cli/{PassGen.h => Generate.h} (83%) diff --git a/src/cli/CMakeLists.txt b/src/cli/CMakeLists.txt index 92277811b..a5126f999 100644 --- a/src/cli/CMakeLists.txt +++ b/src/cli/CMakeLists.txt @@ -28,14 +28,14 @@ set(cli_SOURCES Estimate.h Extract.cpp Extract.h + Generate.cpp + Generate.h List.cpp List.h Locate.cpp Locate.h Merge.cpp Merge.h - PassGen.cpp - PassGen.h Remove.cpp Remove.h Show.cpp diff --git a/src/cli/Command.cpp b/src/cli/Command.cpp index a9a53449e..f0441fd7f 100644 --- a/src/cli/Command.cpp +++ b/src/cli/Command.cpp @@ -28,10 +28,10 @@ #include "Edit.h" #include "Estimate.h" #include "Extract.h" +#include "Generate.h" #include "List.h" #include "Locate.h" #include "Merge.h" -#include "PassGen.h" #include "Remove.h" #include "Show.h" @@ -67,10 +67,10 @@ void populateCommands() commands.insert(QString("edit"), new Edit()); commands.insert(QString("estimate"), new Estimate()); commands.insert(QString("extract"), new Extract()); + commands.insert(QString("generate"), new Generate()); commands.insert(QString("locate"), new Locate()); commands.insert(QString("ls"), new List()); commands.insert(QString("merge"), new Merge()); - commands.insert(QString("passgen"), new PassGen()); commands.insert(QString("rm"), new Remove()); commands.insert(QString("show"), new Show()); } diff --git a/src/cli/Diceware.cpp b/src/cli/Diceware.cpp index 361be1625..080a21c1f 100644 --- a/src/cli/Diceware.cpp +++ b/src/cli/Diceware.cpp @@ -42,24 +42,31 @@ int Diceware::execute(QStringList arguments) QCommandLineParser parser; parser.setApplicationDescription(this->description); + QCommandLineOption words(QStringList() << "W" << "words", + QObject::tr("Word count for the diceware passphrase."), + QObject::tr("count")); + parser.addOption(words); QCommandLineOption wordlistFile(QStringList() << "w" << "word-list", QObject::tr("Wordlist fot the diceware generator.\n[Default: EFF English]"), QObject::tr("path")); parser.addOption(wordlistFile); - parser.addPositionalArgument("words", QObject::tr("Word count for the diceware generator.")); parser.process(arguments); const QStringList args = parser.positionalArguments(); - if (args.size() != 1) { + if (args.size() != 0) { outputTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli diceware"); return EXIT_FAILURE; } PassphraseGenerator dicewareGenerator; - int words = args.at(0).toInt(); - dicewareGenerator.setWordCount(words); + if (parser.value(words).isEmpty()) { + dicewareGenerator.setWordCount(PassphraseGenerator::DefaultWordCount); + } else { + int wordcount = parser.value(words).toInt(); + dicewareGenerator.setWordCount(wordcount); + } if (!parser.value(wordlistFile).isEmpty()) { dicewareGenerator.setWordList(parser.value(wordlistFile)); diff --git a/src/cli/PassGen.cpp b/src/cli/Generate.cpp similarity index 94% rename from src/cli/PassGen.cpp rename to src/cli/Generate.cpp index 900909559..3588cb421 100644 --- a/src/cli/PassGen.cpp +++ b/src/cli/Generate.cpp @@ -18,24 +18,24 @@ #include <cstdlib> #include <stdio.h> -#include "PassGen.h" +#include "Generate.h" #include <QCommandLineParser> #include <QTextStream> #include "core/PasswordGenerator.h" -PassGen::PassGen() +Generate::Generate() { - this->name = QString("passgen"); + this->name = QString("generate"); this->description = QObject::tr("Generate a new random password."); } -PassGen::~PassGen() +Generate::~Generate() { } -int PassGen::execute(QStringList arguments) +int Generate::execute(QStringList arguments) { QTextStream inputTextStream(stdin, QIODevice::ReadOnly); QTextStream outputTextStream(stdout, QIODevice::WriteOnly); @@ -65,7 +65,7 @@ int PassGen::execute(QStringList arguments) const QStringList args = parser.positionalArguments(); if (args.size() != 0) { - outputTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli passgen"); + outputTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli generate"); return EXIT_FAILURE; } @@ -99,7 +99,7 @@ int PassGen::execute(QStringList arguments) passwordGenerator.setCharClasses(classes); if (!passwordGenerator.isValid()) { - outputTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli passgen"); + outputTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli generate"); return EXIT_FAILURE; } diff --git a/src/cli/PassGen.h b/src/cli/Generate.h similarity index 83% rename from src/cli/PassGen.h rename to src/cli/Generate.h index 5c0b33aeb..de6a8ea11 100644 --- a/src/cli/PassGen.h +++ b/src/cli/Generate.h @@ -15,17 +15,17 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef KEEPASSXC_PASSGEN_H -#define KEEPASSXC_PASSGEN_H +#ifndef KEEPASSXC_GENERATE_H +#define KEEPASSXC_GENERATE_H #include "Command.h" -class PassGen : public Command +class Generate : public Command { public: - PassGen(); - ~PassGen(); + Generate(); + ~Generate(); int execute(QStringList arguments); }; -#endif // KEEPASSXC_PASSGEN_H +#endif // KEEPASSXC_GENERATE_H From 33b95836b97664a1442aa015b4a440cf8177bd41 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Wed, 31 Jan 2018 11:15:23 +0100 Subject: [PATCH 344/402] update cli manpage --- src/cli/keepassxc-cli.1 | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/cli/keepassxc-cli.1 b/src/cli/keepassxc-cli.1 index ec8d35c4c..ebd3ea3da 100644 --- a/src/cli/keepassxc-cli.1 +++ b/src/cli/keepassxc-cli.1 @@ -19,7 +19,7 @@ Adds a new entry to a database. A password can be generated (\fI-g\fP option), o .IP "clip [options] <database> <entry> [timeout]" Copies the password of a database entry to the clipboard. If multiple entries with the same name exist in different groups, only the password for the first one is going to be copied. For copying the password of an entry in a specific group, the group path to the entry should be specified as well, instead of just the name. Optionally, a timeout in seconds can be specified to automatically clear the clipboard. -.IP "diceware [options] <words>" +.IP "diceware [options]" Generate a random diceware passphrase. .IP "edit [options] <database> <entry>" @@ -31,6 +31,9 @@ Estimates the entropy of a password. The password to estimate can be provided as .IP "extract [options] <database>" Extracts and prints the contents of a database to standard output in XML format. +.IP "generate [options]" +Generate a random password + .IP "locate [options] <database> <term>" Locates all the entries that match a specific search term in a database. @@ -40,9 +43,6 @@ Lists the contents of a group in a database. If no group is specified, it will d .IP "merge [options] <database1> <database2>" Merges two databases together. The first database file is going to be replaced by the result of the merge, for that reason it is advisable to keep a backup of the two database files before attempting a merge. In the case that both databases make use of the same credentials, the \fI--same-credentials\fP or \fI-s\fP option can be used. -.IP "passgen [options] <length>" -Generate a random password - .IP "rm [options] <database> <entry>" Removes an entry from a database. If the database has a recycle bin, the entry will be moved there. If the entry is already in the recycle bin, it will be removed permanently. @@ -112,28 +112,34 @@ specified, a summary of the default attributes is given. .SS "Diceware options" +.IP "-W, --words <count>" +Desired number of words for the generated passphrase. [Default: 7] + .IP "-w, --word-list <path>" Path of the wordlist for the diceware generator. The wordlist must have > 1000 words, otherwise the program will fail. If the wordlist has < 4000 words a warning will be printed to STDERR. -.SS "PassGen options" +.SS "Generate options" + +.IP "-L, --length <length>" +Desired length for the generated password. [Default: 16] .IP "-l" -Use lowercase characters for the password generator +Use lowercase characters for the generated password. [Default: Enabled] .IP "-u" -Use uppercase characters for the password generator +Use uppercase characters for the generated password. [Default: Enabled] .IP "-n" -Use numbers characters for the password generator +Use numbers characters for the generated password. [Default: Enabled] .IP "-s" -Use special characters for the password generator +Use special characters for the generated password. [Default: Disabled] .IP "-e" -Use extended ascii characters for the password generator +Use extended ascii characters for the generated password. [Default: Disabled] From 6723f4215aafbae4c4fe69e975e21caaad66f636 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Mon, 5 Feb 2018 12:31:13 +0100 Subject: [PATCH 345/402] centralize every password generator default option. add extended ASCII to XC_HTTP generator --- src/browser/BrowserSettings.cpp | 20 ++++++------ src/core/FilePath.cpp | 5 +++ src/core/FilePath.h | 1 + src/core/PassphraseGenerator.cpp | 7 +++-- src/core/PassphraseGenerator.h | 2 ++ src/core/PasswordGenerator.h | 10 +++++- src/gui/PasswordGeneratorWidget.cpp | 26 ++++++++-------- src/http/HttpPasswordGeneratorWidget.cpp | 18 +++++++---- src/http/HttpPasswordGeneratorWidget.ui | 16 ++++++++++ src/http/HttpSettings.cpp | 39 +++++++++++++++++------- src/http/HttpSettings.h | 2 ++ 11 files changed, 103 insertions(+), 43 deletions(-) diff --git a/src/browser/BrowserSettings.cpp b/src/browser/BrowserSettings.cpp index 2df7fc1c5..ecaf8e23e 100755 --- a/src/browser/BrowserSettings.cpp +++ b/src/browser/BrowserSettings.cpp @@ -211,7 +211,7 @@ void BrowserSettings::setVivaldiSupport(bool enabled) { bool BrowserSettings::passwordUseNumbers() { - return config()->get("generator/Numbers", true).toBool(); + return config()->get("generator/Numbers", PasswordGenerator::DefaultNumbers).toBool(); } void BrowserSettings::setPasswordUseNumbers(bool useNumbers) @@ -221,7 +221,7 @@ void BrowserSettings::setPasswordUseNumbers(bool useNumbers) bool BrowserSettings::passwordUseLowercase() { - return config()->get("generator/LowerCase", true).toBool(); + return config()->get("generator/LowerCase", PasswordGenerator::DefaultLower).toBool(); } void BrowserSettings::setPasswordUseLowercase(bool useLowercase) @@ -231,7 +231,7 @@ void BrowserSettings::setPasswordUseLowercase(bool useLowercase) bool BrowserSettings::passwordUseUppercase() { - return config()->get("generator/UpperCase", true).toBool(); + return config()->get("generator/UpperCase", PasswordGenerator::DefaultUpper).toBool(); } void BrowserSettings::setPasswordUseUppercase(bool useUppercase) @@ -241,7 +241,7 @@ void BrowserSettings::setPasswordUseUppercase(bool useUppercase) bool BrowserSettings::passwordUseSpecial() { - return config()->get("generator/SpecialChars", false).toBool(); + return config()->get("generator/SpecialChars", PasswordGenerator::DefaultSpecial).toBool(); } void BrowserSettings::setPasswordUseSpecial(bool useSpecial) @@ -251,7 +251,7 @@ void BrowserSettings::setPasswordUseSpecial(bool useSpecial) bool BrowserSettings::passwordUseEASCII() { - return config()->get("generator/EASCII", false).toBool(); + return config()->get("generator/EASCII", PasswordGenerator::DefaultEASCII).toBool(); } void BrowserSettings::setPasswordUseEASCII(bool useEASCII) @@ -261,7 +261,7 @@ void BrowserSettings::setPasswordUseEASCII(bool useEASCII) int BrowserSettings::passPhraseWordCount() { - return config()->get("generator/WordCount", 6).toInt(); + return config()->get("generator/WordCount", PassphraseGenerator::DefaultWordCount).toInt(); } void BrowserSettings::setPassPhraseWordCount(int wordCount) @@ -271,7 +271,7 @@ void BrowserSettings::setPassPhraseWordCount(int wordCount) QString BrowserSettings::passPhraseWordSeparator() { - return config()->get("generator/WordSeparator", " ").toString(); + return config()->get("generator/WordSeparator", PassphraseGenerator::DefaultSeparator).toString(); } void BrowserSettings::setPassPhraseWordSeparator(QString separator) @@ -291,7 +291,7 @@ void BrowserSettings::setGeneratorType(int type) bool BrowserSettings::passwordEveryGroup() { - return config()->get("generator/EnsureEvery", true).toBool(); + return config()->get("generator/EnsureEvery", PasswordGenerator::DefaultFromEveryGroup).toBool(); } void BrowserSettings::setPasswordEveryGroup(bool everyGroup) @@ -301,7 +301,7 @@ void BrowserSettings::setPasswordEveryGroup(bool everyGroup) bool BrowserSettings::passwordExcludeAlike() { - return config()->get("generator/ExcludeAlike", true).toBool(); + return config()->get("generator/ExcludeAlike", PasswordGenerator::DefaultLookAlike).toBool(); } void BrowserSettings::setPasswordExcludeAlike(bool excludeAlike) @@ -311,7 +311,7 @@ void BrowserSettings::setPasswordExcludeAlike(bool excludeAlike) int BrowserSettings::passwordLength() { - return config()->get("generator/Length", 20).toInt(); + return config()->get("generator/Length", PasswordGenerator::DefaultLength).toInt(); } void BrowserSettings::setPasswordLength(int length) diff --git a/src/core/FilePath.cpp b/src/core/FilePath.cpp index f694f548b..6b555075a 100644 --- a/src/core/FilePath.cpp +++ b/src/core/FilePath.cpp @@ -91,6 +91,11 @@ QString FilePath::pluginPath(const QString& name) return QString(); } +QString FilePath::wordlistPath(const QString& name) +{ + return m_instance->dataPath("wordlists/" + name); +} + QIcon FilePath::applicationIcon() { bool darkIcon = useDarkIcon(); diff --git a/src/core/FilePath.h b/src/core/FilePath.h index 2db496937..f84f84e0e 100644 --- a/src/core/FilePath.h +++ b/src/core/FilePath.h @@ -27,6 +27,7 @@ class FilePath public: QString dataPath(const QString& name); QString pluginPath(const QString& name); + QString wordlistPath(const QString& name); QIcon applicationIcon(); QIcon trayIconLocked(); QIcon trayIconUnlocked(); diff --git a/src/core/PassphraseGenerator.cpp b/src/core/PassphraseGenerator.cpp index 941ba5f38..2bc2be56d 100644 --- a/src/core/PassphraseGenerator.cpp +++ b/src/core/PassphraseGenerator.cpp @@ -24,9 +24,12 @@ #include "crypto/Random.h" #include "core/FilePath.h" +const QString PassphraseGenerator::DefaultSeparator = " "; +const QString PassphraseGenerator::DefaultWordList = "eff_large.wordlist"; + PassphraseGenerator::PassphraseGenerator() : m_wordCount(0) - , m_separator(' ') + , m_separator(PassphraseGenerator::DefaultSeparator) { } @@ -76,7 +79,7 @@ void PassphraseGenerator::setWordList(QString path) void PassphraseGenerator::setDefaultWordList() { - const QString path = filePath()->dataPath("wordlists/eff_large.wordlist"); + const QString path = filePath()->wordlistPath(PassphraseGenerator::DefaultWordList); setWordList(path); } diff --git a/src/core/PassphraseGenerator.h b/src/core/PassphraseGenerator.h index 7df4b4a74..4a489827d 100644 --- a/src/core/PassphraseGenerator.h +++ b/src/core/PassphraseGenerator.h @@ -37,6 +37,8 @@ public: QString generatePassphrase() const; static const int DefaultWordCount = 7; + static const QString DefaultSeparator; + static const QString DefaultWordList; private: int m_wordCount; diff --git a/src/core/PasswordGenerator.h b/src/core/PasswordGenerator.h index 0c13bac05..d1b2a0b39 100644 --- a/src/core/PasswordGenerator.h +++ b/src/core/PasswordGenerator.h @@ -42,7 +42,8 @@ public: enum GeneratorFlag { ExcludeLookAlike = 0x1, - CharFromEveryGroup = 0x2 + CharFromEveryGroup = 0x2, + DefaultFlags = ExcludeLookAlike | CharFromEveryGroup }; Q_DECLARE_FLAGS(GeneratorFlags, GeneratorFlag) @@ -60,6 +61,13 @@ public: int getbits() const; static const int DefaultLength = 16; + static const bool DefaultLower = (DefaultCharset & LowerLetters) != 0; + static const bool DefaultUpper = (DefaultCharset & UpperLetters) != 0; + static const bool DefaultNumbers = (DefaultCharset & Numbers) != 0; + static const bool DefaultSpecial = (DefaultCharset & SpecialCharacters) != 0; + static const bool DefaultEASCII = (DefaultCharset & EASCII) != 0; + static const bool DefaultLookAlike = (DefaultFlags & ExcludeLookAlike) != 0; + static const bool DefaultFromEveryGroup = (DefaultFlags & CharFromEveryGroup) != 0; private: QVector<PasswordGroup> passwordGroups() const; diff --git a/src/gui/PasswordGeneratorWidget.cpp b/src/gui/PasswordGeneratorWidget.cpp index c9c10aa56..e6cb0a92d 100644 --- a/src/gui/PasswordGeneratorWidget.cpp +++ b/src/gui/PasswordGeneratorWidget.cpp @@ -68,9 +68,9 @@ PasswordGeneratorWidget::PasswordGeneratorWidget(QWidget* parent) } // set default separator to Space - m_ui->editWordSeparator->setText(" "); + m_ui->editWordSeparator->setText(PassphraseGenerator::DefaultSeparator); - QDir path(filePath()->dataPath("wordlists/")); + QDir path(filePath()->wordlistPath("")); QStringList files = path.entryList(QDir::Files); m_ui->comboBoxWordList->addItems(files); if (files.size() > 1) { @@ -93,19 +93,19 @@ PasswordGeneratorWidget::~PasswordGeneratorWidget() void PasswordGeneratorWidget::loadSettings() { // Password config - m_ui->checkBoxLower->setChecked(config()->get("generator/LowerCase", true).toBool()); - m_ui->checkBoxUpper->setChecked(config()->get("generator/UpperCase", true).toBool()); - m_ui->checkBoxNumbers->setChecked(config()->get("generator/Numbers", true).toBool()); - m_ui->checkBoxSpecialChars->setChecked(config()->get("generator/SpecialChars", false).toBool()); - m_ui->checkBoxExtASCII->setChecked(config()->get("generator/EASCII", false).toBool()); - m_ui->checkBoxExcludeAlike->setChecked(config()->get("generator/ExcludeAlike", true).toBool()); - m_ui->checkBoxEnsureEvery->setChecked(config()->get("generator/EnsureEvery", true).toBool()); + m_ui->checkBoxLower->setChecked(config()->get("generator/LowerCase", PasswordGenerator::DefaultLower).toBool()); + m_ui->checkBoxUpper->setChecked(config()->get("generator/UpperCase", PasswordGenerator::DefaultUpper).toBool()); + m_ui->checkBoxNumbers->setChecked(config()->get("generator/Numbers", PasswordGenerator::DefaultNumbers).toBool()); + m_ui->checkBoxSpecialChars->setChecked(config()->get("generator/SpecialChars", PasswordGenerator::DefaultSpecial).toBool()); + m_ui->checkBoxExtASCII->setChecked(config()->get("generator/EASCII", PasswordGenerator::DefaultEASCII).toBool()); + m_ui->checkBoxExcludeAlike->setChecked(config()->get("generator/ExcludeAlike", PasswordGenerator::DefaultLookAlike).toBool()); + m_ui->checkBoxEnsureEvery->setChecked(config()->get("generator/EnsureEvery", PasswordGenerator::DefaultFromEveryGroup).toBool()); m_ui->spinBoxLength->setValue(config()->get("generator/Length", PasswordGenerator::DefaultLength).toInt()); // Diceware config - m_ui->spinBoxWordCount->setValue(config()->get("generator/WordCount", 6).toInt()); - m_ui->editWordSeparator->setText(config()->get("generator/WordSeparator", " ").toString()); - m_ui->comboBoxWordList->setCurrentText(config()->get("generator/WordList", "eff_large.wordlist").toString()); + m_ui->spinBoxWordCount->setValue(config()->get("generator/WordCount", PassphraseGenerator::DefaultWordCount).toInt()); + m_ui->editWordSeparator->setText(config()->get("generator/WordSeparator", PassphraseGenerator::DefaultSeparator).toString()); + m_ui->comboBoxWordList->setCurrentText(config()->get("generator/WordList", PassphraseGenerator::DefaultWordList).toString()); // Password or diceware? m_ui->tabWidget->setCurrentIndex(config()->get("generator/Type", 0).toInt()); @@ -394,7 +394,7 @@ void PasswordGeneratorWidget::updateGenerator() m_dicewareGenerator->setWordCount(m_ui->spinBoxWordCount->value()); if (!m_ui->comboBoxWordList->currentText().isEmpty()) { - QString path = filePath()->dataPath("wordlists/" + m_ui->comboBoxWordList->currentText()); + QString path = filePath()->wordlistPath(m_ui->comboBoxWordList->currentText()); m_dicewareGenerator->setWordList(path); } m_dicewareGenerator->setWordSeparator(m_ui->editWordSeparator->text()); diff --git a/src/http/HttpPasswordGeneratorWidget.cpp b/src/http/HttpPasswordGeneratorWidget.cpp index b722a85f3..f08bc3d36 100644 --- a/src/http/HttpPasswordGeneratorWidget.cpp +++ b/src/http/HttpPasswordGeneratorWidget.cpp @@ -48,13 +48,14 @@ HttpPasswordGeneratorWidget::~HttpPasswordGeneratorWidget() void HttpPasswordGeneratorWidget::loadSettings() { - m_ui->checkBoxLower->setChecked(config()->get("Http/generator/LowerCase", true).toBool()); - m_ui->checkBoxUpper->setChecked(config()->get("Http/generator/UpperCase", true).toBool()); - m_ui->checkBoxNumbers->setChecked(config()->get("Http/generator/Numbers", true).toBool()); - m_ui->checkBoxSpecialChars->setChecked(config()->get("Http/generator/SpecialChars", false).toBool()); + m_ui->checkBoxLower->setChecked(config()->get("Http/generator/LowerCase", PasswordGenerator::DefaultLower).toBool()); + m_ui->checkBoxUpper->setChecked(config()->get("Http/generator/UpperCase", PasswordGenerator::DefaultUpper).toBool()); + m_ui->checkBoxNumbers->setChecked(config()->get("Http/generator/Numbers", PasswordGenerator::DefaultNumbers).toBool()); + m_ui->checkBoxSpecialChars->setChecked(config()->get("Http/generator/SpecialChars", PasswordGenerator::DefaultSpecial).toBool()); + m_ui->checkBoxSpecialChars->setChecked(config()->get("Http/generator/EASCII", PasswordGenerator::DefaultEASCII).toBool()); - m_ui->checkBoxExcludeAlike->setChecked(config()->get("Http/generator/ExcludeAlike", true).toBool()); - m_ui->checkBoxEnsureEvery->setChecked(config()->get("Http/generator/EnsureEvery", true).toBool()); + m_ui->checkBoxExcludeAlike->setChecked(config()->get("Http/generator/ExcludeAlike", PasswordGenerator::DefaultLookAlike).toBool()); + m_ui->checkBoxEnsureEvery->setChecked(config()->get("Http/generator/EnsureEvery", PasswordGenerator::DefaultFromEveryGroup).toBool()); m_ui->spinBoxLength->setValue(config()->get("Http/generator/Length", PasswordGenerator::DefaultLength).toInt()); } @@ -65,6 +66,7 @@ void HttpPasswordGeneratorWidget::saveSettings() config()->set("Http/generator/UpperCase", m_ui->checkBoxUpper->isChecked()); config()->set("Http/generator/Numbers", m_ui->checkBoxNumbers->isChecked()); config()->set("Http/generator/SpecialChars", m_ui->checkBoxSpecialChars->isChecked()); + config()->set("Http/generator/EASCII", m_ui->checkBoxExtASCII->isChecked()); config()->set("Http/generator/ExcludeAlike", m_ui->checkBoxExcludeAlike->isChecked()); config()->set("Http/generator/EnsureEvery", m_ui->checkBoxEnsureEvery->isChecked()); @@ -120,6 +122,10 @@ PasswordGenerator::CharClasses HttpPasswordGeneratorWidget::charClasses() classes |= PasswordGenerator::SpecialCharacters; } + if (m_ui->checkBoxExtASCII->isChecked()) { + classes |= PasswordGenerator::EASCII; + } + return classes; } diff --git a/src/http/HttpPasswordGeneratorWidget.ui b/src/http/HttpPasswordGeneratorWidget.ui index 066b9c512..71df88730 100644 --- a/src/http/HttpPasswordGeneratorWidget.ui +++ b/src/http/HttpPasswordGeneratorWidget.ui @@ -142,6 +142,22 @@ </attribute> </widget> </item> + <item> + <widget class="QToolButton" name="checkBoxExtASCII"> + <property name="toolTip"> + <string>Extended ASCII</string> + </property> + <property name="text"> + <string>Extended ASCII</string> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + <attribute name="buttonGroup"> + <string notr="true">optionButtons</string> + </attribute> + </widget> + </item> <item> <spacer name="horizontalSpacer"> <property name="orientation"> diff --git a/src/http/HttpSettings.cpp b/src/http/HttpSettings.cpp index 60a35940c..7ff0dbaa4 100644 --- a/src/http/HttpSettings.cpp +++ b/src/http/HttpSettings.cpp @@ -145,7 +145,7 @@ void HttpSettings::setHttpPort(int port) bool HttpSettings::passwordUseNumbers() { - return config()->get("Http/generator/Numbers", true).toBool(); + return config()->get("Http/generator/Numbers", PasswordGenerator::DefaultNumbers).toBool(); } void HttpSettings::setPasswordUseNumbers(bool useNumbers) @@ -155,7 +155,7 @@ void HttpSettings::setPasswordUseNumbers(bool useNumbers) bool HttpSettings::passwordUseLowercase() { - return config()->get("Http/generator/LowerCase", true).toBool(); + return config()->get("Http/generator/LowerCase", PasswordGenerator::DefaultLower).toBool(); } void HttpSettings::setPasswordUseLowercase(bool useLowercase) @@ -165,7 +165,7 @@ void HttpSettings::setPasswordUseLowercase(bool useLowercase) bool HttpSettings::passwordUseUppercase() { - return config()->get("Http/generator/UpperCase", true).toBool(); + return config()->get("Http/generator/UpperCase", PasswordGenerator::DefaultUpper).toBool(); } void HttpSettings::setPasswordUseUppercase(bool useUppercase) @@ -175,7 +175,7 @@ void HttpSettings::setPasswordUseUppercase(bool useUppercase) bool HttpSettings::passwordUseSpecial() { - return config()->get("Http/generator/SpecialChars", false).toBool(); + return config()->get("Http/generator/SpecialChars", PasswordGenerator::DefaultSpecial).toBool(); } void HttpSettings::setPasswordUseSpecial(bool useSpecial) @@ -183,9 +183,19 @@ void HttpSettings::setPasswordUseSpecial(bool useSpecial) config()->set("Http/generator/SpecialChars", useSpecial); } +bool HttpSettings::passwordUseEASCII() +{ + return config()->get("Http/generator/EASCII", PasswordGenerator::DefaultEASCII).toBool(); +} + +void HttpSettings::setPasswordUseEASCII(bool useExtended) +{ + config()->set("Http/generator/EASCII", useExtended); +} + bool HttpSettings::passwordEveryGroup() { - return config()->get("Http/generator/EnsureEvery", true).toBool(); + return config()->get("Http/generator/EnsureEvery", PasswordGenerator::DefaultFromEveryGroup).toBool(); } void HttpSettings::setPasswordEveryGroup(bool everyGroup) @@ -195,7 +205,7 @@ void HttpSettings::setPasswordEveryGroup(bool everyGroup) bool HttpSettings::passwordExcludeAlike() { - return config()->get("Http/generator/ExcludeAlike", true).toBool(); + return config()->get("Http/generator/ExcludeAlike", PasswordGenerator::DefaultLookAlike).toBool(); } void HttpSettings::setPasswordExcludeAlike(bool excludeAlike) @@ -205,7 +215,7 @@ void HttpSettings::setPasswordExcludeAlike(bool excludeAlike) int HttpSettings::passwordLength() { - return config()->get("Http/generator/Length", 20).toInt(); + return config()->get("Http/generator/Length", PasswordGenerator::DefaultLength).toInt(); } void HttpSettings::setPasswordLength(int length) @@ -217,14 +227,21 @@ void HttpSettings::setPasswordLength(int length) PasswordGenerator::CharClasses HttpSettings::passwordCharClasses() { PasswordGenerator::CharClasses classes; - if (passwordUseLowercase()) + if (passwordUseLowercase()) { classes |= PasswordGenerator::LowerLetters; - if (passwordUseUppercase()) + } + if (passwordUseUppercase()) { classes |= PasswordGenerator::UpperLetters; - if (passwordUseNumbers()) + } + if (passwordUseNumbers()) { classes |= PasswordGenerator::Numbers; - if (passwordUseSpecial()) + } + if (passwordUseSpecial()) { classes |= PasswordGenerator::SpecialCharacters; + } + if (passwordUseEASCII()) { + classes |= PasswordGenerator::EASCII; + } return classes; } diff --git a/src/http/HttpSettings.h b/src/http/HttpSettings.h index a4aee1a63..63c2963cf 100644 --- a/src/http/HttpSettings.h +++ b/src/http/HttpSettings.h @@ -58,6 +58,8 @@ public: static void setPasswordUseUppercase(bool useUppercase); static bool passwordUseSpecial(); static void setPasswordUseSpecial(bool useSpecial); + static bool passwordUseEASCII(); + static void setPasswordUseEASCII(bool useExtended); static bool passwordEveryGroup(); static void setPasswordEveryGroup(bool everyGroup); static bool passwordExcludeAlike(); From 1bfbb9242c8747bb192ce05d94e4c4a28219d9b0 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Tue, 6 Feb 2018 01:17:36 +0100 Subject: [PATCH 346/402] fix cli commands, translations and codestyle --- src/cli/Add.cpp | 7 ++++--- src/cli/Add.h | 2 +- src/cli/Clip.cpp | 6 +++--- src/cli/Clip.h | 2 +- src/cli/Command.cpp | 2 +- src/cli/Command.h | 2 +- src/cli/Diceware.cpp | 10 +++++----- src/cli/Diceware.h | 2 +- src/cli/Edit.cpp | 7 ++++--- src/cli/Edit.h | 2 +- src/cli/Estimate.cpp | 6 +++--- src/cli/Estimate.h | 2 +- src/cli/Extract.cpp | 6 +++--- src/cli/Extract.h | 2 +- src/cli/Generate.cpp | 15 ++++++++------- src/cli/Generate.h | 2 +- src/cli/List.cpp | 6 +++--- src/cli/List.h | 2 +- src/cli/Locate.cpp | 6 +++--- src/cli/Locate.h | 2 +- src/cli/Merge.cpp | 6 +++--- src/cli/Merge.h | 2 +- src/cli/Remove.cpp | 6 +++--- src/cli/Remove.h | 2 +- src/cli/Show.cpp | 6 +++--- src/cli/Show.h | 2 +- src/cli/Utils.cpp | 2 +- src/cli/Utils.h | 2 +- src/cli/keepassxc-cli.1 | 4 ++-- src/core/PasswordGenerator.h | 14 +++++++------- 30 files changed, 70 insertions(+), 67 deletions(-) diff --git a/src/cli/Add.cpp b/src/cli/Add.cpp index 6954532cd..5c97299b8 100644 --- a/src/cli/Add.cpp +++ b/src/cli/Add.cpp @@ -31,15 +31,15 @@ Add::Add() { - this->name = QString("add"); - this->description = QObject::tr("Add a new entry to a database."); + name = QString("add"); + description = QObject::tr("Add a new entry to a database."); } Add::~Add() { } -int Add::execute(QStringList arguments) +int Add::execute(const QStringList& arguments) { QTextStream inputTextStream(stdin, QIODevice::ReadOnly); @@ -134,6 +134,7 @@ int Add::execute(QStringList arguments) } passwordGenerator.setCharClasses(PasswordGenerator::DefaultCharset); + passwordGenerator.setFlags(PasswordGenerator::DefaultFlags); QString password = passwordGenerator.generatePassword(); entry->setPassword(password); } diff --git a/src/cli/Add.h b/src/cli/Add.h index 14356c418..5769249c9 100644 --- a/src/cli/Add.h +++ b/src/cli/Add.h @@ -25,7 +25,7 @@ class Add : public Command public: Add(); ~Add(); - int execute(QStringList arguments); + int execute(const QStringList& arguments); }; #endif // KEEPASSXC_ADD_H diff --git a/src/cli/Clip.cpp b/src/cli/Clip.cpp index 6b458a673..886f8ecc7 100644 --- a/src/cli/Clip.cpp +++ b/src/cli/Clip.cpp @@ -32,15 +32,15 @@ Clip::Clip() { - this->name = QString("clip"); - this->description = QObject::tr("Copy an entry's password to the clipboard."); + name = QString("clip"); + description = QObject::tr("Copy an entry's password to the clipboard."); } Clip::~Clip() { } -int Clip::execute(QStringList arguments) +int Clip::execute(const QStringList& arguments) { QTextStream out(stdout); diff --git a/src/cli/Clip.h b/src/cli/Clip.h index a9e24faee..e94231236 100644 --- a/src/cli/Clip.h +++ b/src/cli/Clip.h @@ -25,7 +25,7 @@ class Clip : public Command public: Clip(); ~Clip(); - int execute(QStringList arguments); + int execute(const QStringList& arguments); int clipEntry(Database* database, QString entryPath, QString timeout); }; diff --git a/src/cli/Command.cpp b/src/cli/Command.cpp index f0441fd7f..ef6948888 100644 --- a/src/cli/Command.cpp +++ b/src/cli/Command.cpp @@ -41,7 +41,7 @@ Command::~Command() { } -int Command::execute(QStringList) +int Command::execute(const QStringList&) { return EXIT_FAILURE; } diff --git a/src/cli/Command.h b/src/cli/Command.h index b751c4a8e..2ebdd77b9 100644 --- a/src/cli/Command.h +++ b/src/cli/Command.h @@ -29,7 +29,7 @@ class Command { public: virtual ~Command(); - virtual int execute(QStringList arguments); + virtual int execute(const QStringList& arguments); QString name; QString description; QString getDescriptionLine(); diff --git a/src/cli/Diceware.cpp b/src/cli/Diceware.cpp index 080a21c1f..c71b57d7e 100644 --- a/src/cli/Diceware.cpp +++ b/src/cli/Diceware.cpp @@ -27,15 +27,15 @@ Diceware::Diceware() { - this->name = QString("diceware"); - this->description = QObject::tr("Generate a new random password."); + name = QString("diceware"); + description = QObject::tr("Generate a new random diceware passphrase."); } Diceware::~Diceware() { } -int Diceware::execute(QStringList arguments) +int Diceware::execute(const QStringList& arguments) { QTextStream inputTextStream(stdin, QIODevice::ReadOnly); QTextStream outputTextStream(stdout, QIODevice::WriteOnly); @@ -48,13 +48,13 @@ int Diceware::execute(QStringList arguments) parser.addOption(words); QCommandLineOption wordlistFile(QStringList() << "w" << "word-list", - QObject::tr("Wordlist fot the diceware generator.\n[Default: EFF English]"), + QObject::tr("Wordlist for the diceware generator.\n[Default: EFF English]"), QObject::tr("path")); parser.addOption(wordlistFile); parser.process(arguments); const QStringList args = parser.positionalArguments(); - if (args.size() != 0) { + if (!args.isEmpty()) { outputTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli diceware"); return EXIT_FAILURE; } diff --git a/src/cli/Diceware.h b/src/cli/Diceware.h index b6d71b6c6..61fe724ca 100644 --- a/src/cli/Diceware.h +++ b/src/cli/Diceware.h @@ -25,7 +25,7 @@ class Diceware : public Command public: Diceware(); ~Diceware(); - int execute(QStringList arguments); + int execute(const QStringList& arguments); }; #endif // KEEPASSXC_DICEWARE_H diff --git a/src/cli/Edit.cpp b/src/cli/Edit.cpp index 675ec7def..967ddd8ed 100644 --- a/src/cli/Edit.cpp +++ b/src/cli/Edit.cpp @@ -31,15 +31,15 @@ Edit::Edit() { - this->name = QString("edit"); - this->description = QObject::tr("Edit an entry."); + name = QString("edit"); + description = QObject::tr("Edit an entry."); } Edit::~Edit() { } -int Edit::execute(QStringList arguments) +int Edit::execute(const QStringList& arguments) { QTextStream inputTextStream(stdin, QIODevice::ReadOnly); @@ -150,6 +150,7 @@ int Edit::execute(QStringList arguments) } passwordGenerator.setCharClasses(PasswordGenerator::DefaultCharset); + passwordGenerator.setFlags(PasswordGenerator::DefaultFlags); QString password = passwordGenerator.generatePassword(); entry->setPassword(password); } diff --git a/src/cli/Edit.h b/src/cli/Edit.h index e52069ff0..2c413bea0 100644 --- a/src/cli/Edit.h +++ b/src/cli/Edit.h @@ -25,7 +25,7 @@ class Edit : public Command public: Edit(); ~Edit(); - int execute(QStringList arguments); + int execute(const QStringList& arguments); }; #endif // KEEPASSXC_EDIT_H diff --git a/src/cli/Estimate.cpp b/src/cli/Estimate.cpp index 80226a27e..9a2ab0b0f 100644 --- a/src/cli/Estimate.cpp +++ b/src/cli/Estimate.cpp @@ -34,8 +34,8 @@ Estimate::Estimate() { - this->name = QString("estimate"); - this->description = QObject::tr("Estimate the entropy of a password."); + name = QString("estimate"); + description = QObject::tr("Estimate the entropy of a password."); } Estimate::~Estimate() @@ -138,7 +138,7 @@ static void estimate(const char* pwd, bool advanced) } } -int Estimate::execute(QStringList arguments) +int Estimate::execute(const QStringList& arguments) { QTextStream inputTextStream(stdin, QIODevice::ReadOnly); QTextStream outputTextStream(stdout, QIODevice::WriteOnly); diff --git a/src/cli/Estimate.h b/src/cli/Estimate.h index 2cbe49104..15f922752 100644 --- a/src/cli/Estimate.h +++ b/src/cli/Estimate.h @@ -25,7 +25,7 @@ class Estimate : public Command public: Estimate(); ~Estimate(); - int execute(QStringList arguments); + int execute(const QStringList& arguments); }; #endif // KEEPASSXC_ESTIMATE_H diff --git a/src/cli/Extract.cpp b/src/cli/Extract.cpp index 477f2b0e2..b48d5a6aa 100644 --- a/src/cli/Extract.cpp +++ b/src/cli/Extract.cpp @@ -33,15 +33,15 @@ Extract::Extract() { - this->name = QString("extract"); - this->description = QObject::tr("Extract and print the content of a database."); + name = QString("extract"); + description = QObject::tr("Extract and print the content of a database."); } Extract::~Extract() { } -int Extract::execute(QStringList arguments) +int Extract::execute(const QStringList& arguments) { QTextStream out(stdout); QTextStream errorTextStream(stderr); diff --git a/src/cli/Extract.h b/src/cli/Extract.h index bef6a7821..2939afddb 100644 --- a/src/cli/Extract.h +++ b/src/cli/Extract.h @@ -25,7 +25,7 @@ class Extract : public Command public: Extract(); ~Extract(); - int execute(QStringList arguments); + int execute(const QStringList& arguments); }; #endif // KEEPASSXC_EXTRACT_H diff --git a/src/cli/Generate.cpp b/src/cli/Generate.cpp index 3588cb421..eb8fea5e8 100644 --- a/src/cli/Generate.cpp +++ b/src/cli/Generate.cpp @@ -27,15 +27,15 @@ Generate::Generate() { - this->name = QString("generate"); - this->description = QObject::tr("Generate a new random password."); + name = QString("generate"); + description = QObject::tr("Generate a new random password."); } Generate::~Generate() { } -int Generate::execute(QStringList arguments) +int Generate::execute(const QStringList& arguments) { QTextStream inputTextStream(stdin, QIODevice::ReadOnly); QTextStream outputTextStream(stdout, QIODevice::WriteOnly); @@ -47,10 +47,10 @@ int Generate::execute(QStringList arguments) QObject::tr("length")); parser.addOption(len); QCommandLineOption lower(QStringList() << "l", - QObject::tr("Use lowercase in the generated password.")); + QObject::tr("Use lowercase characters in the generated password.")); parser.addOption(lower); QCommandLineOption upper(QStringList() << "u", - QObject::tr("Use uppercase in the generated password.")); + QObject::tr("Use uppercase characters in the generated password.")); parser.addOption(upper); QCommandLineOption numeric(QStringList() << "n", QObject::tr("Use numbers in the generated password.")); @@ -59,12 +59,12 @@ int Generate::execute(QStringList arguments) QObject::tr("Use special characters in the generated password.")); parser.addOption(special); QCommandLineOption extended(QStringList() << "e", - QObject::tr("Use extended ascii in the generated password.")); + QObject::tr("Use extended ASCII in the generated password.")); parser.addOption(extended); parser.process(arguments); const QStringList args = parser.positionalArguments(); - if (args.size() != 0) { + if (!args.isEmpty()) { outputTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli generate"); return EXIT_FAILURE; } @@ -97,6 +97,7 @@ int Generate::execute(QStringList arguments) } passwordGenerator.setCharClasses(classes); + passwordGenerator.setFlags(PasswordGenerator::DefaultFlags); if (!passwordGenerator.isValid()) { outputTextStream << parser.helpText().replace("keepassxc-cli", "keepassxc-cli generate"); diff --git a/src/cli/Generate.h b/src/cli/Generate.h index de6a8ea11..607fc105c 100644 --- a/src/cli/Generate.h +++ b/src/cli/Generate.h @@ -25,7 +25,7 @@ class Generate : public Command public: Generate(); ~Generate(); - int execute(QStringList arguments); + int execute(const QStringList& arguments); }; #endif // KEEPASSXC_GENERATE_H diff --git a/src/cli/List.cpp b/src/cli/List.cpp index 73830cab8..bdedaf210 100644 --- a/src/cli/List.cpp +++ b/src/cli/List.cpp @@ -29,15 +29,15 @@ List::List() { - this->name = QString("ls"); - this->description = QObject::tr("List database entries."); + name = QString("ls"); + description = QObject::tr("List database entries."); } List::~List() { } -int List::execute(QStringList arguments) +int List::execute(const QStringList& arguments) { QTextStream out(stdout); diff --git a/src/cli/List.h b/src/cli/List.h index d12105f3c..98b8b5a45 100644 --- a/src/cli/List.h +++ b/src/cli/List.h @@ -25,7 +25,7 @@ class List : public Command public: List(); ~List(); - int execute(QStringList arguments); + int execute(const QStringList& arguments); int listGroup(Database* database, QString groupPath = QString("")); }; diff --git a/src/cli/Locate.cpp b/src/cli/Locate.cpp index 83a3c5ce0..f80372885 100644 --- a/src/cli/Locate.cpp +++ b/src/cli/Locate.cpp @@ -31,15 +31,15 @@ Locate::Locate() { - this->name = QString("locate"); - this->description = QObject::tr("Find entries quickly."); + name = QString("locate"); + description = QObject::tr("Find entries quickly."); } Locate::~Locate() { } -int Locate::execute(QStringList arguments) +int Locate::execute(const QStringList& arguments) { QTextStream out(stdout); diff --git a/src/cli/Locate.h b/src/cli/Locate.h index c919b0cb3..3677a034d 100644 --- a/src/cli/Locate.h +++ b/src/cli/Locate.h @@ -25,7 +25,7 @@ class Locate : public Command public: Locate(); ~Locate(); - int execute(QStringList arguments); + int execute(const QStringList& arguments); int locateEntry(Database* database, QString searchTerm); }; diff --git a/src/cli/Merge.cpp b/src/cli/Merge.cpp index 5df6b0188..6b114bff3 100644 --- a/src/cli/Merge.cpp +++ b/src/cli/Merge.cpp @@ -26,15 +26,15 @@ Merge::Merge() { - this->name = QString("merge"); - this->description = QObject::tr("Merge two databases."); + name = QString("merge"); + description = QObject::tr("Merge two databases."); } Merge::~Merge() { } -int Merge::execute(QStringList arguments) +int Merge::execute(const QStringList& arguments) { QTextStream out(stdout); diff --git a/src/cli/Merge.h b/src/cli/Merge.h index 4f0b42836..496c66b86 100644 --- a/src/cli/Merge.h +++ b/src/cli/Merge.h @@ -25,7 +25,7 @@ class Merge : public Command public: Merge(); ~Merge(); - int execute(QStringList arguments); + int execute(const QStringList& arguments); }; #endif // KEEPASSXC_MERGE_H diff --git a/src/cli/Remove.cpp b/src/cli/Remove.cpp index 6abb68f1c..64a5976e9 100644 --- a/src/cli/Remove.cpp +++ b/src/cli/Remove.cpp @@ -34,15 +34,15 @@ Remove::Remove() { - this->name = QString("rm"); - this->description = QString("Remove an entry from the database."); + name = QString("rm"); + description = QString("Remove an entry from the database."); } Remove::~Remove() { } -int Remove::execute(QStringList arguments) +int Remove::execute(const QStringList& arguments) { QTextStream outputTextStream(stdout, QIODevice::WriteOnly); diff --git a/src/cli/Remove.h b/src/cli/Remove.h index 2440c201c..5465530ed 100644 --- a/src/cli/Remove.h +++ b/src/cli/Remove.h @@ -27,7 +27,7 @@ class Remove : public Command public: Remove(); ~Remove(); - int execute(QStringList arguments); + int execute(const QStringList& arguments); int removeEntry(Database* database, QString databasePath, QString entryPath); }; diff --git a/src/cli/Show.cpp b/src/cli/Show.cpp index 66225c56a..54561b1f7 100644 --- a/src/cli/Show.cpp +++ b/src/cli/Show.cpp @@ -29,15 +29,15 @@ Show::Show() { - this->name = QString("show"); - this->description = QObject::tr("Show an entry's information."); + name = QString("show"); + description = QObject::tr("Show an entry's information."); } Show::~Show() { } -int Show::execute(QStringList arguments) +int Show::execute(const QStringList& arguments) { QTextStream out(stdout); diff --git a/src/cli/Show.h b/src/cli/Show.h index f2caefdbf..18b6d7049 100644 --- a/src/cli/Show.h +++ b/src/cli/Show.h @@ -25,7 +25,7 @@ class Show : public Command public: Show(); ~Show(); - int execute(QStringList arguments); + int execute(const QStringList& arguments); int showEntry(Database* database, QStringList attributes, QString entryPath); }; diff --git a/src/cli/Utils.cpp b/src/cli/Utils.cpp index f42095cbb..35e7cce38 100644 --- a/src/cli/Utils.cpp +++ b/src/cli/Utils.cpp @@ -76,7 +76,7 @@ QString Utils::getPassword() * A valid and running event loop is needed to use the global QClipboard, * so we need to use this from the CLI. */ -int Utils::clipText(QString text) +int Utils::clipText(const QString& text) { QString programName = ""; diff --git a/src/cli/Utils.h b/src/cli/Utils.h index 0c6b749a3..1f8051183 100644 --- a/src/cli/Utils.h +++ b/src/cli/Utils.h @@ -25,7 +25,7 @@ class Utils public: static void setStdinEcho(bool enable); static QString getPassword(); - static int clipText(QString text); + static int clipText(const QString& text); }; #endif // KEEPASSXC_UTILS_H diff --git a/src/cli/keepassxc-cli.1 b/src/cli/keepassxc-cli.1 index ebd3ea3da..cc1e7b8d7 100644 --- a/src/cli/keepassxc-cli.1 +++ b/src/cli/keepassxc-cli.1 @@ -32,7 +32,7 @@ Estimates the entropy of a password. The password to estimate can be provided as Extracts and prints the contents of a database to standard output in XML format. .IP "generate [options]" -Generate a random password +Generate a random password. .IP "locate [options] <database> <term>" Locates all the entries that match a specific search term in a database. @@ -139,7 +139,7 @@ Use numbers characters for the generated password. [Default: Enabled] Use special characters for the generated password. [Default: Disabled] .IP "-e" -Use extended ascii characters for the generated password. [Default: Disabled] +Use extended ASCII characters for the generated password. [Default: Disabled] diff --git a/src/core/PasswordGenerator.h b/src/core/PasswordGenerator.h index d1b2a0b39..15a0dcefe 100644 --- a/src/core/PasswordGenerator.h +++ b/src/core/PasswordGenerator.h @@ -61,13 +61,13 @@ public: int getbits() const; static const int DefaultLength = 16; - static const bool DefaultLower = (DefaultCharset & LowerLetters) != 0; - static const bool DefaultUpper = (DefaultCharset & UpperLetters) != 0; - static const bool DefaultNumbers = (DefaultCharset & Numbers) != 0; - static const bool DefaultSpecial = (DefaultCharset & SpecialCharacters) != 0; - static const bool DefaultEASCII = (DefaultCharset & EASCII) != 0; - static const bool DefaultLookAlike = (DefaultFlags & ExcludeLookAlike) != 0; - static const bool DefaultFromEveryGroup = (DefaultFlags & CharFromEveryGroup) != 0; + static constexpr bool DefaultLower = (DefaultCharset & LowerLetters) != 0; + static constexpr bool DefaultUpper = (DefaultCharset & UpperLetters) != 0; + static constexpr bool DefaultNumbers = (DefaultCharset & Numbers) != 0; + static constexpr bool DefaultSpecial = (DefaultCharset & SpecialCharacters) != 0; + static constexpr bool DefaultEASCII = (DefaultCharset & EASCII) != 0; + static constexpr bool DefaultLookAlike = (DefaultFlags & ExcludeLookAlike) != 0; + static constexpr bool DefaultFromEveryGroup = (DefaultFlags & CharFromEveryGroup) != 0; private: QVector<PasswordGroup> passwordGroups() const; From ab3775d4c5bda89db948b0efaafd264a2ce9466c Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sun, 11 Feb 2018 15:08:07 +0100 Subject: [PATCH 347/402] Fix regression introduced in 6723f42 Use of QString for static DefaultSeparator lead to crashes on Windows --- src/core/FilePath.cpp | 2 +- src/core/PassphraseGenerator.cpp | 29 ++++++++++++----------------- src/core/PassphraseGenerator.h | 15 +++++++-------- 3 files changed, 20 insertions(+), 26 deletions(-) diff --git a/src/core/FilePath.cpp b/src/core/FilePath.cpp index 6b555075a..330542eb9 100644 --- a/src/core/FilePath.cpp +++ b/src/core/FilePath.cpp @@ -93,7 +93,7 @@ QString FilePath::pluginPath(const QString& name) QString FilePath::wordlistPath(const QString& name) { - return m_instance->dataPath("wordlists/" + name); + return dataPath("wordlists/" + name); } QIcon FilePath::applicationIcon() diff --git a/src/core/PassphraseGenerator.cpp b/src/core/PassphraseGenerator.cpp index 2bc2be56d..88871eb8c 100644 --- a/src/core/PassphraseGenerator.cpp +++ b/src/core/PassphraseGenerator.cpp @@ -17,32 +17,31 @@ #include "PassphraseGenerator.h" -#include <math.h> +#include <cmath> #include <QFile> #include <QTextStream> #include "crypto/Random.h" #include "core/FilePath.h" -const QString PassphraseGenerator::DefaultSeparator = " "; -const QString PassphraseGenerator::DefaultWordList = "eff_large.wordlist"; +const char* PassphraseGenerator::DefaultSeparator = " "; +const char* PassphraseGenerator::DefaultWordList = "eff_large.wordlist"; PassphraseGenerator::PassphraseGenerator() : m_wordCount(0) , m_separator(PassphraseGenerator::DefaultSeparator) { - } -double PassphraseGenerator::calculateEntropy(QString passphrase) +double PassphraseGenerator::calculateEntropy(const QString& passphrase) { Q_UNUSED(passphrase); - if (m_wordlist.size() == 0) { - return 0; + if (m_wordlist.isEmpty()) { + return 0.0; } - return log(m_wordlist.size()) / log(2.0) * m_wordCount; + return std::log2(m_wordlist.size()) * m_wordCount; } void PassphraseGenerator::setWordCount(int wordCount) @@ -56,7 +55,7 @@ void PassphraseGenerator::setWordCount(int wordCount) } -void PassphraseGenerator::setWordList(QString path) +void PassphraseGenerator::setWordList(const QString& path) { m_wordlist.clear(); @@ -83,7 +82,7 @@ void PassphraseGenerator::setDefaultWordList() setWordList(path); } -void PassphraseGenerator::setWordSeparator(QString separator) { +void PassphraseGenerator::setWordSeparator(const QString& separator) { m_separator = separator; } @@ -97,8 +96,8 @@ QString PassphraseGenerator::generatePassphrase() const } QStringList words; - for (int i = 0; i < m_wordCount; i++) { - int wordIndex = randomGen()->randomUInt(m_wordlist.length()); + for (int i = 0; i < m_wordCount; ++i) { + int wordIndex = randomGen()->randomUInt(static_cast<quint32>(m_wordlist.length())); words.append(m_wordlist.at(wordIndex)); } @@ -111,9 +110,5 @@ bool PassphraseGenerator::isValid() const return false; } - if (m_wordlist.size() < 1000) { - return false; - } - - return true; + return m_wordlist.size() >= 1000; } diff --git a/src/core/PassphraseGenerator.h b/src/core/PassphraseGenerator.h index 4a489827d..a4e0e426b 100644 --- a/src/core/PassphraseGenerator.h +++ b/src/core/PassphraseGenerator.h @@ -26,26 +26,25 @@ class PassphraseGenerator { public: PassphraseGenerator(); + Q_DISABLE_COPY(PassphraseGenerator) - double calculateEntropy(QString passphrase); + double calculateEntropy(const QString& passphrase); void setWordCount(int wordCount); - void setWordList(QString path); + void setWordList(const QString& path); void setDefaultWordList(); - void setWordSeparator(QString separator); + void setWordSeparator(const QString& separator); bool isValid() const; QString generatePassphrase() const; - static const int DefaultWordCount = 7; - static const QString DefaultSeparator; - static const QString DefaultWordList; + static constexpr int DefaultWordCount = 7; + static const char* DefaultSeparator; + static const char* DefaultWordList; private: int m_wordCount; QString m_separator; QVector<QString> m_wordlist; - - Q_DISABLE_COPY(PassphraseGenerator) }; #endif // KEEPASSX_PASSPHRASEGENERATOR_H From 80d85965e922f3741a5483b10d8b3d212e3eee24 Mon Sep 17 00:00:00 2001 From: Toni Spets <toni.spets@iki.fi> Date: Tue, 6 Feb 2018 19:22:21 +0200 Subject: [PATCH 348/402] SSH Agent: Fix translation arguments --- src/sshagent/OpenSSHKey.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/sshagent/OpenSSHKey.cpp b/src/sshagent/OpenSSHKey.cpp index 808408ab6..08110291a 100644 --- a/src/sshagent/OpenSSHKey.cpp +++ b/src/sshagent/OpenSSHKey.cpp @@ -278,7 +278,7 @@ bool OpenSSHKey::parse(const QByteArray& in) return false; } } else { - m_error = tr("Unsupported key type: %s").arg(m_privateType); + m_error = tr("Unsupported key type: %1").arg(m_privateType); return false; } @@ -313,7 +313,7 @@ bool OpenSSHKey::openPrivateKey(const QString& passphrase) } else if (m_cipherName == "aes256-ctr") { cipher.reset(new SymmetricCipher(SymmetricCipher::Aes256, SymmetricCipher::Ctr, SymmetricCipher::Decrypt)); } else if (m_cipherName != "none") { - m_error = tr("Unknown cipher: %s").arg(m_cipherName); + m_error = tr("Unknown cipher: %1").arg(m_cipherName); return false; } @@ -356,7 +356,7 @@ bool OpenSSHKey::openPrivateKey(const QString& passphrase) return false; } } else if (m_kdfName != "none") { - m_error = tr("Unknown KDF: %s").arg(m_kdfName); + m_error = tr("Unknown KDF: %1").arg(m_kdfName); return false; } @@ -402,7 +402,7 @@ bool OpenSSHKey::openPrivateKey(const QString& passphrase) return readPrivate(keyStream); } - m_error = tr("Unsupported key type: %s").arg(m_privateType); + m_error = tr("Unsupported key type: %1").arg(m_privateType); return false; } @@ -425,7 +425,7 @@ bool OpenSSHKey::readPublic(BinaryStream& stream) } else if (m_type == "ssh-ed25519") { keyParts = 1; } else { - m_error = tr("Unknown key type: %s").arg(m_type); + m_error = tr("Unknown key type: %1").arg(m_type); return false; } @@ -462,7 +462,7 @@ bool OpenSSHKey::readPrivate(BinaryStream& stream) } else if (m_type == "ssh-ed25519") { keyParts = 2; } else { - m_error = tr("Unknown key type: %s").arg(m_type); + m_error = tr("Unknown key type: %1").arg(m_type); return false; } From d2359df2b06676530fb08923884b2f15f302aea2 Mon Sep 17 00:00:00 2001 From: Toni Spets <toni.spets@iki.fi> Date: Tue, 6 Feb 2018 19:20:10 +0200 Subject: [PATCH 349/402] SymmetricCipher: Add support for AES-128-CBC --- src/crypto/SymmetricCipher.cpp | 1 + src/crypto/SymmetricCipher.h | 1 + src/crypto/SymmetricCipherGcrypt.cpp | 3 + tests/TestSymmetricCipher.cpp | 84 ++++++++++++++++++++++++++++ tests/TestSymmetricCipher.h | 2 + 5 files changed, 91 insertions(+) diff --git a/src/crypto/SymmetricCipher.cpp b/src/crypto/SymmetricCipher.cpp index 1ec8a2cf6..1ba42a537 100644 --- a/src/crypto/SymmetricCipher.cpp +++ b/src/crypto/SymmetricCipher.cpp @@ -57,6 +57,7 @@ bool SymmetricCipher::isInitalized() const SymmetricCipherBackend* SymmetricCipher::createBackend(Algorithm algo, Mode mode, Direction direction) { switch (algo) { + case Aes128: case Aes256: case Twofish: case Salsa20: diff --git a/src/crypto/SymmetricCipher.h b/src/crypto/SymmetricCipher.h index eab834956..0c683d224 100644 --- a/src/crypto/SymmetricCipher.h +++ b/src/crypto/SymmetricCipher.h @@ -31,6 +31,7 @@ class SymmetricCipher public: enum Algorithm { + Aes128, Aes256, Twofish, Salsa20, diff --git a/src/crypto/SymmetricCipherGcrypt.cpp b/src/crypto/SymmetricCipherGcrypt.cpp index b1abd5250..97d53cd83 100644 --- a/src/crypto/SymmetricCipherGcrypt.cpp +++ b/src/crypto/SymmetricCipherGcrypt.cpp @@ -37,6 +37,9 @@ SymmetricCipherGcrypt::~SymmetricCipherGcrypt() int SymmetricCipherGcrypt::gcryptAlgo(SymmetricCipher::Algorithm algo) { switch (algo) { + case SymmetricCipher::Aes128: + return GCRY_CIPHER_AES128; + case SymmetricCipher::Aes256: return GCRY_CIPHER_AES256; diff --git a/tests/TestSymmetricCipher.cpp b/tests/TestSymmetricCipher.cpp index f1e7c0e06..a5159e0d6 100644 --- a/tests/TestSymmetricCipher.cpp +++ b/tests/TestSymmetricCipher.cpp @@ -32,6 +32,90 @@ void TestSymmetricCipher::initTestCase() QVERIFY(Crypto::init()); } +void TestSymmetricCipher::testAes128CbcEncryption() +{ + // http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf + + QByteArray key = QByteArray::fromHex("2b7e151628aed2a6abf7158809cf4f3c"); + QByteArray iv = QByteArray::fromHex("000102030405060708090a0b0c0d0e0f"); + QByteArray plainText = QByteArray::fromHex("6bc1bee22e409f96e93d7e117393172a"); + plainText.append(QByteArray::fromHex("ae2d8a571e03ac9c9eb76fac45af8e51")); + QByteArray cipherText = QByteArray::fromHex("7649abac8119b246cee98e9b12e9197d"); + cipherText.append(QByteArray::fromHex("5086cb9b507219ee95db113a917678b2")); + bool ok; + + SymmetricCipher cipher(SymmetricCipher::Aes128, SymmetricCipher::Cbc, SymmetricCipher::Encrypt); + QVERIFY(cipher.init(key, iv)); + QCOMPARE(cipher.blockSize(), 16); + QCOMPARE(cipher.process(plainText, &ok), cipherText); + QVERIFY(ok); + + QBuffer buffer; + SymmetricCipherStream stream(&buffer, SymmetricCipher::Aes128, SymmetricCipher::Cbc, + SymmetricCipher::Encrypt); + QVERIFY(stream.init(key, iv)); + buffer.open(QIODevice::WriteOnly); + QVERIFY(stream.open(QIODevice::WriteOnly)); + QVERIFY(stream.reset()); + + buffer.reset(); + buffer.buffer().clear(); + QCOMPARE(stream.write(plainText.left(16)), qint64(16)); + QCOMPARE(buffer.data(), cipherText.left(16)); + QVERIFY(stream.reset()); + // make sure padding is written + QCOMPARE(buffer.data().size(), 32); + + buffer.reset(); + buffer.buffer().clear(); + QCOMPARE(stream.write(plainText.left(10)), qint64(10)); + QVERIFY(buffer.data().isEmpty()); + + QVERIFY(stream.reset()); + buffer.reset(); + buffer.buffer().clear(); + QCOMPARE(stream.write(plainText.left(10)), qint64(10)); + stream.close(); + QCOMPARE(buffer.data().size(), 16); +} + +void TestSymmetricCipher::testAes128CbcDecryption() +{ + QByteArray key = QByteArray::fromHex("2b7e151628aed2a6abf7158809cf4f3c"); + QByteArray iv = QByteArray::fromHex("000102030405060708090a0b0c0d0e0f"); + QByteArray cipherText = QByteArray::fromHex("7649abac8119b246cee98e9b12e9197d"); + cipherText.append(QByteArray::fromHex("5086cb9b507219ee95db113a917678b2")); + QByteArray plainText = QByteArray::fromHex("6bc1bee22e409f96e93d7e117393172a"); + plainText.append(QByteArray::fromHex("ae2d8a571e03ac9c9eb76fac45af8e51")); + bool ok; + + SymmetricCipher cipher(SymmetricCipher::Aes128, SymmetricCipher::Cbc, SymmetricCipher::Decrypt); + QVERIFY(cipher.init(key, iv)); + QCOMPARE(cipher.blockSize(), 16); + QCOMPARE(cipher.process(cipherText, &ok), plainText); + QVERIFY(ok); + + // padded with 16 0x10 bytes + QByteArray cipherTextPadded = cipherText + QByteArray::fromHex("55e21d7100b988ffec32feeafaf23538"); + QBuffer buffer(&cipherTextPadded); + SymmetricCipherStream stream(&buffer, SymmetricCipher::Aes128, SymmetricCipher::Cbc, + SymmetricCipher::Decrypt); + QVERIFY(stream.init(key, iv)); + buffer.open(QIODevice::ReadOnly); + QVERIFY(stream.open(QIODevice::ReadOnly)); + + QCOMPARE(stream.read(10), plainText.left(10)); + buffer.reset(); + QVERIFY(stream.reset()); + QCOMPARE(stream.read(20), plainText.left(20)); + buffer.reset(); + QVERIFY(stream.reset()); + QCOMPARE(stream.read(16), plainText.left(16)); + buffer.reset(); + QVERIFY(stream.reset()); + QCOMPARE(stream.read(100), plainText); +} + void TestSymmetricCipher::testAes256CbcEncryption() { // http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf diff --git a/tests/TestSymmetricCipher.h b/tests/TestSymmetricCipher.h index 40e3b49cf..9b82fd88a 100644 --- a/tests/TestSymmetricCipher.h +++ b/tests/TestSymmetricCipher.h @@ -27,6 +27,8 @@ class TestSymmetricCipher : public QObject private slots: void initTestCase(); + void testAes128CbcEncryption(); + void testAes128CbcDecryption(); void testAes256CbcEncryption(); void testAes256CbcDecryption(); void testAes256CtrEncryption(); From d58e3ca34dd97707facc2e8b40da24b9cda97c15 Mon Sep 17 00:00:00 2001 From: Toni Spets <toni.spets@iki.fi> Date: Tue, 6 Feb 2018 19:23:03 +0200 Subject: [PATCH 350/402] SSH Agent: Support old AES-128-CBC encrypted keys --- src/sshagent/OpenSSHKey.cpp | 30 ++++++++++++++++++----- src/sshagent/OpenSSHKey.h | 1 + tests/TestOpenSSHKey.cpp | 48 +++++++++++++++++++++++++++++++++++++ tests/TestOpenSSHKey.h | 1 + 4 files changed, 74 insertions(+), 6 deletions(-) diff --git a/src/sshagent/OpenSSHKey.cpp b/src/sshagent/OpenSSHKey.cpp index 08110291a..ce867a95f 100644 --- a/src/sshagent/OpenSSHKey.cpp +++ b/src/sshagent/OpenSSHKey.cpp @@ -204,9 +204,10 @@ bool OpenSSHKey::parsePEM(const QByteArray& in, QByteArray& out) rows.removeFirst(); } while (!rows.isEmpty()); - if (pemOptions.contains("Proc-Type")) { - m_error = tr("Encrypted keys are not yet supported"); - return false; + if (pemOptions.value("Proc-Type").compare("4,encrypted", Qt::CaseInsensitive) == 0) { + m_kdfName = "md5"; + m_cipherName = pemOptions.value("DEK-Info").section(",", 0, 0); + m_cipherIV = QByteArray::fromHex(pemOptions.value("DEK-Info").section(",", 1, 1).toLatin1()); } out = QByteArray::fromBase64(rows.join("").toLatin1()); @@ -308,7 +309,9 @@ bool OpenSSHKey::openPrivateKey(const QString& passphrase) return false; } - if (m_cipherName == "aes256-cbc") { + if (m_cipherName.compare("aes-128-cbc", Qt::CaseInsensitive) == 0) { + cipher.reset(new SymmetricCipher(SymmetricCipher::Aes128, SymmetricCipher::Cbc, SymmetricCipher::Decrypt)); + } else if (m_cipherName == "aes256-cbc") { cipher.reset(new SymmetricCipher(SymmetricCipher::Aes256, SymmetricCipher::Cbc, SymmetricCipher::Decrypt)); } else if (m_cipherName == "aes256-ctr") { cipher.reset(new SymmetricCipher(SymmetricCipher::Aes256, SymmetricCipher::Ctr, SymmetricCipher::Decrypt)); @@ -355,6 +358,21 @@ bool OpenSSHKey::openPrivateKey(const QString& passphrase) m_error = cipher->errorString(); return false; } + } else if (m_kdfName == "md5") { + if (m_cipherIV.length() < 8) { + m_error = tr("Cipher IV is too short for MD5 kdf"); + return false; + } + + QCryptographicHash hash(QCryptographicHash::Md5); + hash.addData(passphrase.toUtf8()); + hash.addData(m_cipherIV.data(), 8); + QByteArray keyData = hash.result(); + + if (!cipher->init(keyData, m_cipherIV)) { + m_error = cipher->errorString(); + return false; + } } else if (m_kdfName != "none") { m_error = tr("Unknown KDF: %1").arg(m_kdfName); return false; @@ -373,14 +391,14 @@ bool OpenSSHKey::openPrivateKey(const QString& passphrase) if (m_privateType == TYPE_DSA) { if (!ASN1Key::parseDSA(rawPrivateData, *this)) { - m_error = tr("Reading DSA private key failed, only unencrypted keys are supported at this time"); + m_error = tr("Decryption failed, wrong passphrase?"); return false; } return true; } else if (m_privateType == TYPE_RSA) { if (!ASN1Key::parseRSA(rawPrivateData, *this)) { - m_error = tr("Reading RSA private key failed, only unencrypted keys are supported at this time"); + m_error = tr("Decryption failed, wrong passphrase?"); return false; } diff --git a/src/sshagent/OpenSSHKey.h b/src/sshagent/OpenSSHKey.h index 539d01892..e06af2201 100644 --- a/src/sshagent/OpenSSHKey.h +++ b/src/sshagent/OpenSSHKey.h @@ -63,6 +63,7 @@ private: QString m_type; QString m_cipherName; + QByteArray m_cipherIV; QString m_kdfName; QByteArray m_kdfOptions; QByteArray m_rawPrivateData; diff --git a/tests/TestOpenSSHKey.cpp b/tests/TestOpenSSHKey.cpp index 7f94365e7..8ac129866 100644 --- a/tests/TestOpenSSHKey.cpp +++ b/tests/TestOpenSSHKey.cpp @@ -90,6 +90,54 @@ void TestOpenSSHKey::testParseDSA() QCOMPARE(key.fingerprint(), QString("SHA256:tbbNuLN1hja8JNASDTlLOZQsbTlJDzJlz/oAGK3sX18")); } +void TestOpenSSHKey::testDecryptAES128CBC() +{ + const QString keyString = QString( + "-----BEGIN RSA PRIVATE KEY-----\n" + "Proc-Type: 4,ENCRYPTED\n" + "DEK-Info: AES-128-CBC,804E4D214D1263FF94E3743FE799DBB4\n" + "\n" + "lM9TDfOTbiRhaGGDh7Hn+rqw8CCWcYBZYu7smyYLdnWKXKPmbne8CQFZBAS1FJwZ\n" + "6Mj6n075yFGyzN9/OfeqKiUA4adlbwLbGwB+yyKsC2FlsvRIEr4hup02WWM47vHj\n" + "DS4TRmNkE7MKFLhpNCyt5OGGM45s+/lwVTw51K0Hm99TBd72IrX4jfY9ZxAVbL3l\n" + "aTohL8x6oOTe7q318QgJoFi+DjJhDWLGLLJ7fBqD2imz2fmrY4j8Jpw2sDe1rj82\n" + "gMqqNG3FrfN0S4uYlWYH5pAh+BUcB1UdmTU/rV5wJMK1oUytmZv/J2+X/0k3Y93F\n" + "aw6JWOy28OizW+TQXvv8gREWsp5PEclqUZhhGQbVbCQCiDOxg+xiXNySdRH1IqjR\n" + "zQiKgD4SPzkxQekExPaIQT/KutWZdMNYybEqooCx8YyeDoN31z7Wa2rv6OulOn/j\n" + "wJFvyd2PT/6brHKI4ky8RYroDf4FbVYKfyEW5CSAg2OyL/tY/kSPgy/k0WT7fDwq\n" + "dPSuYM9yeWNL6kAhDqDOv8+s3xvOVEljktBvQvItQwVLmHszC3E2AcnaxzdblKPu\n" + "e3+mBT80NXHjERK2ht+/9JYseK1ujNbNAaG8SbKfU3FF0VlyJ0QW6TuIEdpNnymT\n" + "0fm0cDfKNaoeJIFnBRZhgIOJAic9DM0cTe/vSG69DaUYsaQPp36al7Fbux3GpFHS\n" + "OtJEySYGro/6zvJ9dDIEfIGZjA3RaMt6+DuyJZXQdT2RNXa9j60xW7dXh0En4n82\n" + "JUKTxYhDPLS5c8BzpJqoopxpKwElmrJ7Y3xpd6z2vIlD8ftuZrkk6siTMNQ2s7MI\n" + "Xl332O+0H4k7uSfczHPOOw36TFhNjGQAP0b7O+0/RVG0ttOIoAn7ZkX3nfdbtG5B\n" + "DWKvDaopvrcC2/scQ5uLUnqnBiGw1XiYpdg5ang7knHNzHZAIekVaYYZigpCAKp+\n" + "OtoaDeUEzqFhYVmF8ad1fgvC9ZUsuxS4XUHCKl0H6CJcvW9MJPVbveqYoK+j9qKd\n" + "iMIkQBP1kE2rzGZVGUkZTpM9LVD9nP0nsbr6E8BatFcNgRirsg2BTJglNpXlCmY6\n" + "ldzJ/ELBbzoXIn+0wTGai0o4eBPx55baef69JfPuZqEB9pLNE+mHstrqIwcfqYu4\n" + "M+Vzun1QshRMj9a1PVkIHfs1fLeebI4QCHO0vJlc9K4iYPM4rsDNO3YaAgGRuARS\n" + "f3McGiGFxkv5zxe8i05ZBnn+exE77jpRKxd223jAMe2wu4WiFB7ZVo4Db6b5Oo2T\n" + "TPh3VuY7TNMEKkcUi+mGLKjroocQ5j8WQYlfnyOaTalUVQDzOTNb67QIIoiszR0U\n" + "+AXGyxHj0QtotZFoPME+AbS9Zqy3SgSOuIzPBPU5zS4uoKNdD5NPE5YAuafCjsDy\n" + "MT4DVy+cPOQYUK022S7T2nsA1btmvUvD5LL2Mc8VuKsWOn/7FKZua6OCfipt6oX0\n" + "1tzYrw0/ALK+CIdVdYIiPPfxGZkr+JSLOOg7u50tpmen9GzxgNTv63miygwUAIDF\n" + "u0GbQwOueoA453/N75FcXOgrbqTdivyadUbRP+l7YJk/SfIytyJMOigejp+Z1lzF\n" + "-----END RSA PRIVATE KEY-----\n" + ); + + const QByteArray keyData = keyString.toLatin1(); + + OpenSSHKey key; + QVERIFY(key.parse(keyData)); + QVERIFY(key.encrypted()); + QCOMPARE(key.cipherName(), QString("AES-128-CBC")); + QVERIFY(!key.openPrivateKey("incorrectpassphrase")); + QVERIFY(key.openPrivateKey("correctpassphrase")); + QCOMPARE(key.type(), QString("ssh-rsa")); + QCOMPARE(key.comment(), QString("")); + QCOMPARE(key.fingerprint(), QString("SHA256:1Hsebt2WWnmc72FERsUOgvaajIGHkrMONxXylcmk87U")); +} + void TestOpenSSHKey::testParseRSA() { const QString keyString = QString( diff --git a/tests/TestOpenSSHKey.h b/tests/TestOpenSSHKey.h index 6c2041074..5d2724410 100644 --- a/tests/TestOpenSSHKey.h +++ b/tests/TestOpenSSHKey.h @@ -31,6 +31,7 @@ private slots: void testParse(); void testParseDSA(); void testParseRSA(); + void testDecryptAES128CBC(); void testDecryptAES256CBC(); void testDecryptAES256CTR(); }; From 536db062f4bcf7e2505c16c34b9240df9b95d7ff Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sat, 17 Feb 2018 14:05:32 +0100 Subject: [PATCH 351/402] Fix Auto-Type message not raised when no matching entry was found --- src/autotype/AutoType.cpp | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp index e1f14d5bc..92dab488a 100644 --- a/src/autotype/AutoType.cpp +++ b/src/autotype/AutoType.cpp @@ -269,8 +269,8 @@ void AutoType::performAutoType(const Entry* entry, QWidget* hideWindow) } /** - * Global Autotype entry-point funcion - * Perform global autotype on the active window + * Global Autotype entry-point function + * Perform global Auto-Type on the active window */ void AutoType::performGlobalAutoType(const QList<Database*>& dbList) { @@ -304,10 +304,19 @@ void AutoType::performGlobalAutoType(const QList<Database*>& dbList) if (matchList.isEmpty()) { m_inAutoType.unlock(); - QString message = tr("Couldn't find an entry that matches the window title:"); - message.append("\n\n"); - message.append(windowTitle); - MessageBox::information(nullptr, tr("Auto-Type - KeePassXC"), message); + + if (qobject_cast<QApplication*>(QCoreApplication::instance())) { + auto* msgBox = new QMessageBox(); + msgBox->setAttribute(Qt::WA_DeleteOnClose); + msgBox->setWindowTitle(tr("Auto-Type - KeePassXC")); + msgBox->setText(tr("Couldn't find an entry that matches the window title:").append("\n\n") + .append(windowTitle)); + msgBox->setIcon(QMessageBox::Information); + msgBox->setStandardButtons(QMessageBox::Ok); + msgBox->show(); + msgBox->raise(); + msgBox->activateWindow(); + } emit autotypeRejected(); } else if ((matchList.size() == 1) && !config()->get("security/autotypeask").toBool()) { @@ -315,7 +324,7 @@ void AutoType::performGlobalAutoType(const QList<Database*>& dbList) m_inAutoType.unlock(); } else { m_windowFromGlobal = m_plugin->activeWindow(); - AutoTypeSelectDialog* selectDialog = new AutoTypeSelectDialog(); + auto* selectDialog = new AutoTypeSelectDialog(); connect(selectDialog, SIGNAL(matchActivated(AutoTypeMatch)), SLOT(performAutoTypeFromGlobal(AutoTypeMatch))); connect(selectDialog, SIGNAL(rejected()), SLOT(resetInAutoType())); From c5dd64d18a59d6d6cd93627fda4df2d62ca868d4 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Thu, 15 Feb 2018 00:21:07 +0100 Subject: [PATCH 352/402] Resolve reference in entry field, prevent recorsive loop, fix EditEntry association bug --- src/core/Entry.cpp | 30 +++++++++++++++++++++++------- src/gui/entry/EditEntryWidget.cpp | 2 ++ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index 8db955c93..a245d7027 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -778,17 +778,30 @@ QString Entry::resolvePlaceholderRecursive(const QString& placeholder, int maxDe case PlaceholderType::Unknown: return placeholder; case PlaceholderType::Title: - return title(); + if (placeholderType(title()) == PlaceholderType::Title) { + return title(); + } + return resolvePlaceholderRecursive(title(), maxDepth - 1); case PlaceholderType::UserName: - return username(); + if (placeholderType(username()) == PlaceholderType::UserName) { + return username(); + } + return resolvePlaceholderRecursive(username(), maxDepth - 1); case PlaceholderType::Password: - return password(); + if (placeholderType(password()) == PlaceholderType::Password) { + return password(); + } + return resolvePlaceholderRecursive(password(), maxDepth - 1); case PlaceholderType::Notes: - return notes(); - case PlaceholderType::Totp: - return totp(); + if (placeholderType(notes()) == PlaceholderType::Notes) { + return notes(); + } + return resolvePlaceholderRecursive(notes(), maxDepth - 1); case PlaceholderType::Url: - return url(); + if (placeholderType(url()) == PlaceholderType::Url) { + return url(); + } + return resolvePlaceholderRecursive(url(), maxDepth - 1); case PlaceholderType::UrlWithoutScheme: case PlaceholderType::UrlScheme: case PlaceholderType::UrlHost: @@ -802,6 +815,9 @@ QString Entry::resolvePlaceholderRecursive(const QString& placeholder, int maxDe const QString strUrl = resolveMultiplePlaceholdersRecursive(url(), maxDepth - 1); return resolveUrlPlaceholder(strUrl, typeOfPlaceholder); } + case PlaceholderType::Totp: + // totp can't have placeholder inside + return totp(); case PlaceholderType::CustomAttribute: { const QString key = placeholder.mid(3, placeholder.length() - 4); // {S:attr} => mid(3, len - 4) return attributes()->hasKey(key) ? attributes()->value(key) : QString(); diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index bab5a0728..ab2a85f81 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -188,6 +188,8 @@ void EditEntryWidget::setupAutoType() connect(m_autoTypeAssocModel, SIGNAL(modelReset()), SLOT(clearCurrentAssoc())); connect(m_autoTypeUi->windowTitleCombo, SIGNAL(editTextChanged(QString)), SLOT(applyCurrentAssoc())); + connect(m_autoTypeUi->customWindowSequenceButton, SIGNAL(toggled(bool)), + SLOT(applyCurrentAssoc())); connect(m_autoTypeUi->windowSequenceEdit, SIGNAL(textChanged(QString)), SLOT(applyCurrentAssoc())); } From 4c52aa9c88ad5d36fe00bd8129f4f1158c277136 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sat, 17 Feb 2018 16:38:27 +0100 Subject: [PATCH 353/402] Check maxDepth on placeholder resolution to avoid infinite recursion --- src/core/Entry.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index a245d7027..1dfc614e5 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -772,6 +772,11 @@ QString Entry::resolveMultiplePlaceholdersRecursive(const QString& str, int maxD QString Entry::resolvePlaceholderRecursive(const QString& placeholder, int maxDepth) const { + if (maxDepth <= 0) { + qWarning("Maximum depth of replacement has been reached. Entry uuid: %s", qPrintable(uuid().toHex())); + return placeholder; + } + const PlaceholderType typeOfPlaceholder = placeholderType(placeholder); switch (typeOfPlaceholder) { case PlaceholderType::NotPlaceholder: @@ -831,6 +836,11 @@ QString Entry::resolvePlaceholderRecursive(const QString& placeholder, int maxDe QString Entry::resolveReferencePlaceholderRecursive(const QString& placeholder, int maxDepth) const { + if (maxDepth <= 0) { + qWarning("Maximum depth of replacement has been reached. Entry uuid: %s", qPrintable(uuid().toHex())); + return placeholder; + } + // resolving references in format: {REF:<WantedField>@<SearchIn>:<SearchText>} // using format from http://keepass.info/help/base/fieldrefs.html at the time of writing @@ -844,6 +854,9 @@ QString Entry::resolveReferencePlaceholderRecursive(const QString& placeholder, const QString searchText = match.captured(EntryAttributes::SearchTextGroupName); const EntryReferenceType searchInType = Entry::referenceType(searchIn); + + Q_ASSERT(m_group); + Q_ASSERT(m_group->database()); const Entry* refEntry = m_group->database()->resolveEntry(searchText, searchInType); if (refEntry) { From 7713a7b7501d32cfd3d9ddac4aebb23d561646a3 Mon Sep 17 00:00:00 2001 From: thez3ro <io@thezero.org> Date: Thu, 15 Feb 2018 23:56:17 +0100 Subject: [PATCH 354/402] Add test case for reference resolution in cloned entries Improve test suite to use smart pointers where possible --- tests/TestEntry.cpp | 157 +++++++++++++++++++++++++------------------- 1 file changed, 90 insertions(+), 67 deletions(-) diff --git a/tests/TestEntry.cpp b/tests/TestEntry.cpp index 264f202d1..94100c0a6 100644 --- a/tests/TestEntry.cpp +++ b/tests/TestEntry.cpp @@ -1,4 +1,5 @@ /* + * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org> * Copyright (C) 2013 Felix Geyer <debfx@fobos.de> * * This program is free software: you can redistribute it and/or modify @@ -15,6 +16,8 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include <QScopedPointer> + #include "TestEntry.h" #include "TestGlobal.h" #include "crypto/Crypto.h" @@ -28,7 +31,7 @@ void TestEntry::initTestCase() void TestEntry::testHistoryItemDeletion() { - Entry* entry = new Entry(); + QScopedPointer<Entry> entry(new Entry()); QPointer<Entry> historyEntry = new Entry(); entry->addHistoryItem(historyEntry); @@ -39,13 +42,11 @@ void TestEntry::testHistoryItemDeletion() entry->removeHistoryItems(historyEntriesToRemove); QCOMPARE(entry->historyItems().size(), 0); QVERIFY(historyEntry.isNull()); - - delete entry; } void TestEntry::testCopyDataFrom() { - Entry* entry = new Entry(); + QScopedPointer<Entry> entry(new Entry()); entry->setTitle("testtitle"); entry->attributes()->set("attr1", "abc"); @@ -62,9 +63,8 @@ void TestEntry::testCopyDataFrom() assoc.sequence = "4"; entry->autoTypeAssociations()->add(assoc); - Entry* entry2 = new Entry(); - entry2->copyDataFrom(entry); - delete entry; + QScopedPointer<Entry> entry2(new Entry()); + entry2->copyDataFrom(entry.data()); QCOMPARE(entry2->title(), QString("testtitle")); QCOMPARE(entry2->attributes()->value("attr1"), QString("abc")); @@ -77,13 +77,11 @@ void TestEntry::testCopyDataFrom() QCOMPARE(entry2->autoTypeAssociations()->size(), 2); QCOMPARE(entry2->autoTypeAssociations()->get(0).window, QString("1")); QCOMPARE(entry2->autoTypeAssociations()->get(1).window, QString("3")); - - delete entry2; } void TestEntry::testClone() { - Entry* entryOrg = new Entry(); + QScopedPointer<Entry> entryOrg(new Entry()); entryOrg->setUuid(Uuid::random()); entryOrg->setTitle("Original Title"); entryOrg->beginUpdate(); @@ -96,42 +94,58 @@ void TestEntry::testClone() entryOrgTime.setCreationTime(dateTime); entryOrg->setTimeInfo(entryOrgTime); - Entry* entryCloneNone = entryOrg->clone(Entry::CloneNoFlags); + QScopedPointer<Entry> entryCloneNone(entryOrg->clone(Entry::CloneNoFlags)); QCOMPARE(entryCloneNone->uuid(), entryOrg->uuid()); QCOMPARE(entryCloneNone->title(), QString("New Title")); QCOMPARE(entryCloneNone->historyItems().size(), 0); QCOMPARE(entryCloneNone->timeInfo().creationTime(), entryOrg->timeInfo().creationTime()); - delete entryCloneNone; - Entry* entryCloneNewUuid = entryOrg->clone(Entry::CloneNewUuid); + QScopedPointer<Entry> entryCloneNewUuid(entryOrg->clone(Entry::CloneNewUuid)); QVERIFY(entryCloneNewUuid->uuid() != entryOrg->uuid()); QVERIFY(!entryCloneNewUuid->uuid().isNull()); QCOMPARE(entryCloneNewUuid->title(), QString("New Title")); QCOMPARE(entryCloneNewUuid->historyItems().size(), 0); QCOMPARE(entryCloneNewUuid->timeInfo().creationTime(), entryOrg->timeInfo().creationTime()); - delete entryCloneNewUuid; - Entry* entryCloneResetTime = entryOrg->clone(Entry::CloneResetTimeInfo); + QScopedPointer<Entry> entryCloneResetTime(entryOrg->clone(Entry::CloneResetTimeInfo)); QCOMPARE(entryCloneResetTime->uuid(), entryOrg->uuid()); QCOMPARE(entryCloneResetTime->title(), QString("New Title")); QCOMPARE(entryCloneResetTime->historyItems().size(), 0); QVERIFY(entryCloneResetTime->timeInfo().creationTime() != entryOrg->timeInfo().creationTime()); - delete entryCloneResetTime; - Entry* entryCloneHistory = entryOrg->clone(Entry::CloneIncludeHistory); + QScopedPointer<Entry> entryCloneHistory(entryOrg->clone(Entry::CloneIncludeHistory)); QCOMPARE(entryCloneHistory->uuid(), entryOrg->uuid()); QCOMPARE(entryCloneHistory->title(), QString("New Title")); QCOMPARE(entryCloneHistory->historyItems().size(), 1); QCOMPARE(entryCloneHistory->historyItems().at(0)->title(), QString("Original Title")); QCOMPARE(entryCloneHistory->timeInfo().creationTime(), entryOrg->timeInfo().creationTime()); - delete entryCloneHistory; - delete entryOrg; + Database db; + auto* entryOrgClone = entryOrg->clone(Entry::CloneNoFlags); + entryOrgClone->setGroup(db.rootGroup()); + + Entry* entryCloneUserRef = entryOrgClone->clone(Entry::CloneUserAsRef); + entryCloneUserRef->setGroup(db.rootGroup()); + QCOMPARE(entryCloneUserRef->uuid(), entryOrgClone->uuid()); + QCOMPARE(entryCloneUserRef->title(), QString("New Title")); + QCOMPARE(entryCloneUserRef->historyItems().size(), 0); + QCOMPARE(entryCloneUserRef->timeInfo().creationTime(), entryOrgClone->timeInfo().creationTime()); + QVERIFY(entryCloneUserRef->attributes()->isReference(EntryAttributes::UserNameKey)); + QCOMPARE(entryCloneUserRef->resolvePlaceholder(entryCloneUserRef->username()), entryOrgClone->username()); + + Entry* entryClonePassRef = entryOrgClone->clone(Entry::ClonePassAsRef); + entryClonePassRef->setGroup(db.rootGroup()); + QCOMPARE(entryClonePassRef->uuid(), entryOrgClone->uuid()); + QCOMPARE(entryClonePassRef->title(), QString("New Title")); + QCOMPARE(entryClonePassRef->historyItems().size(), 0); + QCOMPARE(entryClonePassRef->timeInfo().creationTime(), entryOrgClone->timeInfo().creationTime()); + QVERIFY(entryClonePassRef->attributes()->isReference(EntryAttributes::PasswordKey)); + QCOMPARE(entryClonePassRef->resolvePlaceholder(entryCloneUserRef->password()), entryOrg->password()); } void TestEntry::testResolveUrl() { - Entry* entry = new Entry(); + QScopedPointer<Entry> entry(new Entry()); QString testUrl("www.google.com"); QString testCmd("cmd://firefox " + testUrl); QString testComplexCmd("cmd://firefox --start-now --url 'http://" + testUrl + "' --quit"); @@ -152,8 +166,6 @@ void TestEntry::testResolveUrl() QCOMPARE(entry->resolveUrl(nonHttpUrl), QString("")); // Test no URL QCOMPARE(entry->resolveUrl(noUrl), QString("")); - - delete entry; } void TestEntry::testResolveUrlPlaceholders() @@ -189,9 +201,9 @@ void TestEntry::testResolveUrlPlaceholders() void TestEntry::testResolveRecursivePlaceholders() { Database db; - Group* root = db.rootGroup(); + auto* root = db.rootGroup(); - Entry* entry1 = new Entry(); + auto* entry1 = new Entry(); entry1->setGroup(root); entry1->setUuid(Uuid::random()); entry1->setTitle("{USERNAME}"); @@ -201,7 +213,7 @@ void TestEntry::testResolveRecursivePlaceholders() entry1->attributes()->set("CustomTitle", "RecursiveValue"); QCOMPARE(entry1->resolveMultiplePlaceholders(entry1->title()), QString("RecursiveValue")); - Entry* entry2 = new Entry(); + auto* entry2 = new Entry(); entry2->setGroup(root); entry2->setUuid(Uuid::random()); entry2->setTitle("Entry2Title"); @@ -213,7 +225,7 @@ void TestEntry::testResolveRecursivePlaceholders() entry2->attributes()->set("Port", "1234"); entry2->attributes()->set("Uri", "uri/path"); - Entry* entry3 = new Entry(); + auto* entry3 = new Entry(); entry3->setGroup(root); entry3->setUuid(Uuid::random()); entry3->setTitle(QString("{REF:T@I:%1}").arg(entry2->uuid().toHex())); @@ -226,7 +238,7 @@ void TestEntry::testResolveRecursivePlaceholders() QCOMPARE(entry3->resolveMultiplePlaceholders(entry3->password()), QString("RecursiveValue")); QCOMPARE(entry3->resolveMultiplePlaceholders(entry3->url()), QString("http://127.0.0.1:1234/uri/path")); - Entry* entry4 = new Entry(); + auto* entry4 = new Entry(); entry4->setGroup(root); entry4->setUuid(Uuid::random()); entry4->setTitle(QString("{REF:T@I:%1}").arg(entry3->uuid().toHex())); @@ -239,7 +251,7 @@ void TestEntry::testResolveRecursivePlaceholders() QCOMPARE(entry4->resolveMultiplePlaceholders(entry4->password()), QString("RecursiveValue")); QCOMPARE(entry4->resolveMultiplePlaceholders(entry4->url()), QString("http://127.0.0.1:1234/uri/path")); - Entry* entry5 = new Entry(); + auto* entry5 = new Entry(); entry5->setGroup(root); entry5->setUuid(Uuid::random()); entry5->attributes()->set("Scheme", "http"); @@ -256,14 +268,25 @@ void TestEntry::testResolveRecursivePlaceholders() const QString url("http://username:password@host.org:2017/some/path?q=e&t=s#fragment"); QCOMPARE(entry5->resolveMultiplePlaceholders(entry5->url()), url); QCOMPARE(entry5->resolveMultiplePlaceholders(entry5->title()), QString("title+/some/path+fragment+title")); + + auto* entry6 = new Entry(); + entry6->setGroup(root); + entry6->setUuid(Uuid::random()); + entry6->setTitle(QString("{REF:T@I:%1}").arg(entry3->uuid().toHex())); + entry6->setUsername(QString("{TITLE}")); + entry6->setPassword(QString("{PASSWORD}")); + + QCOMPARE(entry6->resolvePlaceholder(entry6->title()), QString("Entry2Title")); + QCOMPARE(entry6->resolvePlaceholder(entry6->username()), QString("Entry2Title")); + QCOMPARE(entry6->resolvePlaceholder(entry6->password()), QString("{PASSWORD}")); } void TestEntry::testResolveReferencePlaceholders() { Database db; - Group* root = db.rootGroup(); + auto* root = db.rootGroup(); - Entry* entry1 = new Entry(); + auto* entry1 = new Entry(); entry1->setGroup(root); entry1->setUuid(Uuid::random()); entry1->setTitle("Title1"); @@ -273,9 +296,9 @@ void TestEntry::testResolveReferencePlaceholders() entry1->setNotes("Notes1"); entry1->attributes()->set("CustomAttribute1", "CustomAttributeValue1"); - Group* group = new Group(); + auto* group = new Group(); group->setParent(root); - Entry* entry2 = new Entry(); + auto* entry2 = new Entry(); entry2->setGroup(group); entry2->setUuid(Uuid::random()); entry2->setTitle("Title2"); @@ -285,7 +308,7 @@ void TestEntry::testResolveReferencePlaceholders() entry2->setNotes("Notes2"); entry2->attributes()->set("CustomAttribute2", "CustomAttributeValue2"); - Entry* entry3 = new Entry(); + auto* entry3 = new Entry(); entry3->setGroup(group); entry3->setUuid(Uuid::random()); entry3->setTitle("{S:AttributeTitle}"); @@ -299,7 +322,7 @@ void TestEntry::testResolveReferencePlaceholders() entry3->attributes()->set("AttributeUrl", "UrlValue"); entry3->attributes()->set("AttributeNotes", "NotesValue"); - Entry* tstEntry = new Entry(); + auto* tstEntry = new Entry(); tstEntry->setGroup(root); tstEntry->setUuid(Uuid::random()); @@ -356,67 +379,67 @@ void TestEntry::testResolveNonIdPlaceholdersToUuid() Database db; auto* root = db.rootGroup(); - Entry referencedEntryTitle; - referencedEntryTitle.setGroup(root); - referencedEntryTitle.setTitle("myTitle"); - referencedEntryTitle.setUuid(Uuid::random()); + auto* referencedEntryTitle = new Entry(); + referencedEntryTitle->setGroup(root); + referencedEntryTitle->setTitle("myTitle"); + referencedEntryTitle->setUuid(Uuid::random()); - Entry referencedEntryUsername; - referencedEntryUsername.setGroup(root); - referencedEntryUsername.setUsername("myUser"); - referencedEntryUsername.setUuid(Uuid::random()); + auto* referencedEntryUsername = new Entry(); + referencedEntryUsername->setGroup(root); + referencedEntryUsername->setUsername("myUser"); + referencedEntryUsername->setUuid(Uuid::random()); - Entry referencedEntryPassword; - referencedEntryPassword.setGroup(root); - referencedEntryPassword.setPassword("myPassword"); - referencedEntryPassword.setUuid(Uuid::random()); + auto* referencedEntryPassword = new Entry(); + referencedEntryPassword->setGroup(root); + referencedEntryPassword->setPassword("myPassword"); + referencedEntryPassword->setUuid(Uuid::random()); - Entry referencedEntryUrl; - referencedEntryUrl.setGroup(root); - referencedEntryUrl.setUrl("myUrl"); - referencedEntryUrl.setUuid(Uuid::random()); + auto* referencedEntryUrl = new Entry(); + referencedEntryUrl->setGroup(root); + referencedEntryUrl->setUrl("myUrl"); + referencedEntryUrl->setUuid(Uuid::random()); - Entry referencedEntryNotes; - referencedEntryNotes.setGroup(root); - referencedEntryNotes.setNotes("myNotes"); - referencedEntryNotes.setUuid(Uuid::random()); + auto* referencedEntryNotes = new Entry(); + referencedEntryNotes->setGroup(root); + referencedEntryNotes->setNotes("myNotes"); + referencedEntryNotes->setUuid(Uuid::random()); const QList<QChar> placeholders{'T', 'U', 'P', 'A', 'N'}; - for (const QChar searchIn : placeholders) { + for (const QChar& searchIn : placeholders) { const Entry* referencedEntry = nullptr; QString newEntryNotesRaw("{REF:I@%1:%2}"); switch(searchIn.toLatin1()) { case 'T': - referencedEntry = &referencedEntryTitle; + referencedEntry = referencedEntryTitle; newEntryNotesRaw = newEntryNotesRaw.arg(searchIn, referencedEntry->title()); break; case 'U': - referencedEntry = &referencedEntryUsername; + referencedEntry = referencedEntryUsername; newEntryNotesRaw = newEntryNotesRaw.arg(searchIn, referencedEntry->username()); break; case 'P': - referencedEntry = &referencedEntryPassword; + referencedEntry = referencedEntryPassword; newEntryNotesRaw = newEntryNotesRaw.arg(searchIn, referencedEntry->password()); break; case 'A': - referencedEntry = &referencedEntryUrl; + referencedEntry = referencedEntryUrl; newEntryNotesRaw = newEntryNotesRaw.arg(searchIn, referencedEntry->url()); break; case 'N': - referencedEntry = &referencedEntryNotes; + referencedEntry = referencedEntryNotes; newEntryNotesRaw = newEntryNotesRaw.arg(searchIn, referencedEntry->notes()); break; default: break; } - Entry newEntry; - newEntry.setGroup(root); - newEntry.setNotes(newEntryNotesRaw); + auto* newEntry = new Entry(); + newEntry->setGroup(root); + newEntry->setNotes(newEntryNotesRaw); - const auto newEntryNotesResolved = - newEntry.resolveMultiplePlaceholders(newEntry.notes()); + const QString newEntryNotesResolved = + newEntry->resolveMultiplePlaceholders(newEntry->notes()); QCOMPARE(newEntryNotesResolved, QString(referencedEntry->uuid().toHex())); } } @@ -424,9 +447,9 @@ void TestEntry::testResolveNonIdPlaceholdersToUuid() void TestEntry::testResolveClonedEntry() { Database db; - Group* root = db.rootGroup(); + auto* root = db.rootGroup(); - Entry* original = new Entry(); + auto* original = new Entry(); original->setGroup(root); original->setUuid(Uuid::random()); original->setTitle("Title"); From d36e9875c5d29c351a2277b5d4915d75f9b4a8d8 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sat, 17 Feb 2018 19:26:20 +0100 Subject: [PATCH 355/402] Enable word wrap for long lines Make all text except contributor names translatable --- src/gui/AboutDialog.ui | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/gui/AboutDialog.ui b/src/gui/AboutDialog.ui index 43c3da3f9..cc4a67d04 100644 --- a/src/gui/AboutDialog.ui +++ b/src/gui/AboutDialog.ui @@ -147,6 +147,13 @@ </property> </spacer> </item> + <item> + <widget class="QLabel" name="label_8"> + <property name="text"> + <string>Project Maintainers:</string> + </property> + </widget> + </item> <item> <widget class="QLabel" name="label_4"> <property name="sizePolicy"> @@ -156,15 +163,23 @@ </sizepolicy> </property> <property name="text"> - <string notr="true"><p>Project Maintainers:</p> -<ul> + <string notr="true"><ul> <li>droidmonkey</li> <li>phoerious</li> <li>TheZ3ro</li> <li>louib</li> <li>weslly</li> -</ul> -<p>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</></string> +</ul></string> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="label_7"> + <property name="text"> + <string>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</string> + </property> + <property name="wordWrap"> + <bool>true</bool> </property> </widget> </item> @@ -198,8 +213,8 @@ <rect> <x>0</x> <y>0</y> - <width>423</width> - <height>816</height> + <width>449</width> + <height>803</height> </rect> </property> <layout class="QVBoxLayout" name="verticalLayout_5"> From 924d472de515c476efaa9a517acd8d124981e750 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sat, 17 Feb 2018 17:46:19 +0100 Subject: [PATCH 356/402] Add support for pre-releases --- CMakeLists.txt | 36 +++++++++++++++++++++++++++------- release-tool | 39 +++++++++++++++++++++++++------------ src/config-keepassx.h.cmake | 19 ++++++++++-------- src/gui/AboutDialog.cpp | 4 ++-- src/gui/MainWindow.cpp | 2 +- 5 files changed, 70 insertions(+), 30 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 686db7362..3fb00a023 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -73,27 +73,49 @@ set(KEEPASSXC_VERSION_MINOR "3") set(KEEPASSXC_VERSION_PATCH "0") set(KEEPASSXC_VERSION "${KEEPASSXC_VERSION_MAJOR}.${KEEPASSXC_VERSION_MINOR}.${KEEPASSXC_VERSION_PATCH}") -set(KEEPASSXC_RELEASE_BUILD OFF CACHE BOOLEAN "Remove stability warnings") +set(KEEPASSXC_BUILD_TYPE "Snapshot" CACHE STRING "Set KeePassXC build type to distinguish between stable releases and snapshots") +set_property(CACHE KEEPASSXC_BUILD_TYPE PROPERTY STRINGS Snapshot Release PreRelease) + # Check if on a tag, if so build as a release execute_process(COMMAND git tag --points-at HEAD WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE GIT_TAG) if(GIT_TAG) - set(KEEPASSXC_RELEASE_BUILD ON) -elseif(NOT KEEPASSXC_RELEASE_BUILD) + string(REGEX REPLACE "\r?\n$" "" GIT_TAG "${GIT_TAG}") + + if(GIT_TAG MATCHES "^[\\.0-9]+-(alpha|beta)[0-9]+$") + set(KEEPASSXC_BUILD_TYPE PreRelease) + set(KEEPASSXC_VERSION ${GIT_TAG}) + elseif(GIT_TAG MATCHES "^[\\.0-9]+$") + set(KEEPASSXC_BUILD_TYPE Release) + set(KEEPASSXC_VERSION ${GIT_TAG}) + endif() +endif() + +if(KEEPASSXC_BUILD_TYPE STREQUAL "PreRelease" AND NOT GIT_TAG) + set(KEEPASSXC_VERSION "${KEEPASSXC_VERSION}-preview") +elseif(KEEPASSXC_BUILD_TYPE STREQUAL "Snapshot") set(KEEPASSXC_VERSION "${KEEPASSXC_VERSION}-snapshot") endif() +if(KEEPASSXC_BUILD_TYPE STREQUAL "Release") + set(KEEPASSXC_BUILD_TYPE_RELEASE ON) +elseif(KEEPASSXC_BUILD_TYPE STREQUAL "PreRelease") + set(KEEPASSXC_BUILD_TYPE_PRE_RELEASE ON) +else() + set(KEEPASSXC_BUILD_TYPE_SNAPSHOT ON) +endif() + message(STATUS "Setting up build for KeePassXC v${KEEPASSXC_VERSION}\n") # Distribution info -set(KEEPASSXC_DIST True) -set(KEEPASSXC_DIST_TYPE "Other" CACHE STRING "KeePassXC Distribution type") +set(KEEPASSXC_DIST ON) +set(KEEPASSXC_DIST_TYPE "Other" CACHE STRING "KeePassXC Distribution Type") set_property(CACHE KEEPASSXC_DIST_TYPE PROPERTY STRINGS Snap AppImage Other) if(KEEPASSXC_DIST_TYPE STREQUAL "Snap") - set(KEEPASSXC_DIST_SNAP True) + set(KEEPASSXC_DIST_SNAP ON) elseif(KEEPASSXC_DIST_TYPE STREQUAL "AppImage") - set(KEEPASSXC_DIST_APPIMAGE True) + set(KEEPASSXC_DIST_APPIMAGE ON) elseif(KEEPASSXC_DIST_TYPE STREQUAL "Other") unset(KEEPASSXC_DIST) endif() diff --git a/release-tool b/release-tool index 10e25522c..08e788e13 100755 --- a/release-tool +++ b/release-tool @@ -246,7 +246,7 @@ checkVersionInCMake() { local app_name_upper="$(echo "$APP_NAME" | tr '[:lower:]' '[:upper:]')" local major_num="$(echo ${RELEASE_NAME} | cut -f1 -d.)" local minor_num="$(echo ${RELEASE_NAME} | cut -f2 -d.)" - local patch_num="$(echo ${RELEASE_NAME} | cut -f3 -d.)" + local patch_num="$(echo ${RELEASE_NAME} | cut -f3 -d. | cut -f1 -d-)" grep -q "${app_name_upper}_VERSION_MAJOR \"${major_num}\"" CMakeLists.txt if [ $? -ne 0 ]; then @@ -582,19 +582,26 @@ build() { done init - checkWorkingTreeClean OUTPUT_DIR="$(realpath "$OUTPUT_DIR")" - if $BUILD_SNAPSHOT; then + if ${BUILD_SNAPSHOT}; then TAG_NAME="HEAD" local branch=`git rev-parse --abbrev-ref HEAD` logInfo "Using current branch ${branch} to build..." RELEASE_NAME="${RELEASE_NAME}-snapshot" + CMAKE_OPTIONS="${CMAKE_OPTIONS} -DKEEPASSXC_BUILD_TYPE=Snapshot" else - logInfo "Checking out release tag '${TAG_NAME}'..." + checkWorkingTreeClean + + if $(echo "$TAG_NAME" | grep -qP "\-(alpha|beta)\\d+\$"); then + CMAKE_OPTIONS="${CMAKE_OPTIONS} -DKEEPASSXC_BUILD_TYPE=PreRelease" + logInfo "Checking out pre-release tag '${TAG_NAME}'..." + else + CMAKE_OPTIONS="${CMAKE_OPTIONS} -DKEEPASSXC_BUILD_TYPE=Release" + logInfo "Checking out release tag '${TAG_NAME}'..." + fi git checkout "$TAG_NAME" - CMAKE_OPTIONS="${CMAKE_OPTIONS} -DKEEPASSXC_RELEASE_BUILD=ON" fi logInfo "Creating output directory..." @@ -604,20 +611,28 @@ build() { exitError "Failed to create output directory!" fi - if $BUILD_SOURCE_TARBALL; then + if ${BUILD_SOURCE_TARBALL}; then logInfo "Creating source tarball..." local app_name_lower="$(echo "$APP_NAME" | tr '[:upper:]' '[:lower:]')" TARBALL_NAME="${app_name_lower}-${RELEASE_NAME}-src.tar.xz" git archive --format=tar "$TAG_NAME" --prefix="${app_name_lower}-${RELEASE_NAME}/" \ - | xz -6 > "${OUTPUT_DIR}/${TARBALL_NAME}" + | xz -6 > "${OUTPUT_DIR}/${TARBALL_NAME}" fi - + + if [ -e "${OUTPUT_DIR}/build-release" ]; then + logInfo "Cleaning existing build directory..." + rm -r "${OUTPUT_DIR}/build-release" 2> /dev/null + if [ $? -ne 0 ]; then + exitError "Failed to clean existing build directory, please do it manually." + fi + fi + logInfo "Creating build directory..." mkdir -p "${OUTPUT_DIR}/build-release" cd "${OUTPUT_DIR}/build-release" logInfo "Configuring sources..." - for p in $BUILD_PLUGINS; do + for p in ${BUILD_PLUGINS}; do CMAKE_OPTIONS="${CMAKE_OPTIONS} -DWITH_XC_$(echo $p | tr '[:lower:]' '[:upper:]')=On" done @@ -654,13 +669,13 @@ build() { -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" $CMAKE_OPTIONS "$SRC_DIR" logInfo "Compiling and packaging sources..." - make $MAKE_OPTIONS preinstall + mingw32-make $MAKE_OPTIONS preinstall # Call cpack directly instead of calling make package. # This is important because we want to build the MSI when making a # release. - cpack -G "NSIS;WIX;ZIP" + cpack -G "NSIS;ZIP;${CPACK_GENERATORS}" - mv "./${APP_NAME}-${RELEASE_NAME}-"*.{exe,msi,zip} ../ + mv "./${APP_NAME}-${RELEASE_NAME}-"*.* ../ else mkdir -p "${OUTPUT_DIR}/bin-release" diff --git a/src/config-keepassx.h.cmake b/src/config-keepassx.h.cmake index 805438b1a..9f3952b04 100644 --- a/src/config-keepassx.h.cmake +++ b/src/config-keepassx.h.cmake @@ -3,14 +3,14 @@ #ifndef KEEPASSX_CONFIG_KEEPASSX_H #define KEEPASSX_CONFIG_KEEPASSX_H -#define KEEPASSX_VERSION "${KEEPASSXC_VERSION}" +#define KEEPASSX_VERSION "@KEEPASSXC_VERSION@" -#define KEEPASSX_SOURCE_DIR "${CMAKE_SOURCE_DIR}" -#define KEEPASSX_BINARY_DIR "${CMAKE_BINARY_DIR}" +#define KEEPASSX_SOURCE_DIR "@CMAKE_SOURCE_DIR@" +#define KEEPASSX_BINARY_DIR "@CMAKE_BINARY_DIR@" -#define KEEPASSX_PREFIX_DIR "${CMAKE_INSTALL_PREFIX}" -#define KEEPASSX_PLUGIN_DIR "${PLUGIN_INSTALL_DIR}" -#define KEEPASSX_DATA_DIR "${DATA_INSTALL_DIR}" +#define KEEPASSX_PREFIX_DIR "@CMAKE_INSTALL_PREFIX@" +#define KEEPASSX_PLUGIN_DIR "@PLUGIN_INSTALL_DIR@" +#define KEEPASSX_DATA_DIR "@DATA_INSTALL_DIR@" #cmakedefine WITH_XC_AUTOTYPE #cmakedefine WITH_XC_NETWORKING @@ -19,13 +19,16 @@ #cmakedefine WITH_XC_YUBIKEY #cmakedefine WITH_XC_SSHAGENT +#cmakedefine KEEPASSXC_BUILD_TYPE "@KEEPASSXC_BUILD_TYPE@" +#cmakedefine KEEPASSXC_BUILD_TYPE_RELEASE +#cmakedefine KEEPASSXC_BUILD_TYPE_PRE_RELEASE +#cmakedefine KEEPASSXC_BUILD_TYPE_SNAPSHOT + #cmakedefine KEEPASSXC_DIST #cmakedefine KEEPASSXC_DIST_TYPE "@KEEPASSXC_DIST_TYPE@" #cmakedefine KEEPASSXC_DIST_SNAP #cmakedefine KEEPASSXC_DIST_APPIMAGE -#cmakedefine KEEPASSXC_RELEASE_BUILD - #cmakedefine HAVE_PR_SET_DUMPABLE 1 #cmakedefine HAVE_RLIMIT_CORE 1 #cmakedefine HAVE_PT_DENY_ATTACH 1 diff --git a/src/gui/AboutDialog.cpp b/src/gui/AboutDialog.cpp index 4481dd82d..adfdea0a7 100644 --- a/src/gui/AboutDialog.cpp +++ b/src/gui/AboutDialog.cpp @@ -54,8 +54,8 @@ AboutDialog::AboutDialog(QWidget* parent) QString debugInfo = "KeePassXC - "; debugInfo.append(tr("Version %1\n").arg(KEEPASSX_VERSION)); -#ifndef KEEPASSXC_RELEASE_BUILD - debugInfo.append(tr("Build Type: Snapshot\n")); +#ifndef KEEPASSXC_BUILD_TYPE_RELEASE + debugInfo.append(tr("Build Type: %1\n").arg(KEEPASSXC_BUILD_TYPE)); #endif if (!commitHash.isEmpty()) { debugInfo.append(tr("Revision: %1").arg(commitHash.left(7)).append("\n")); diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 6fad65859..76f1ffb60 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -425,7 +425,7 @@ MainWindow::MainWindow() } #endif -#ifndef KEEPASSXC_RELEASE_BUILD +#ifndef KEEPASSXC_BUILD_TYPE_RELEASE m_ui->globalMessageWidget->showMessage(tr("WARNING: You are using an unstable build of KeePassXC!\n" "There is a high risk of corruption, maintain a backup of your databases.\n" "This version is not meant for production use."), From 5c51d116514578fa35f64a4aeea09a9b132d779b Mon Sep 17 00:00:00 2001 From: Nick Spain <nicholas.spain96@gmail.com> Date: Tue, 13 Feb 2018 00:11:26 +1100 Subject: [PATCH 357/402] Fix Issue #1447 by using entry's group when not creating entry --- src/gui/DatabaseWidget.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index cd57f6292..23760668a 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -819,7 +819,16 @@ void DatabaseWidget::switchToEntryEdit(Entry* entry) void DatabaseWidget::switchToEntryEdit(Entry* entry, bool create) { - Group* group = currentGroup(); + // If creating an entry, it will be in `currentGroup()` so it's + // okay to use but when editing, the entry may not be in + // `currentGroup()` so we get the entry's group. + Group* group; + if (create) { + group = currentGroup(); + } else { + group = entry->group(); + } + Q_ASSERT(group); m_editEntryWidget->loadEntry(entry, create, false, group->name(), m_db); From 7dfcad6f8f6ce4e1370db5ebe79178e242e90e98 Mon Sep 17 00:00:00 2001 From: Nick Spain <nicholas.spain96@gmail.com> Date: Sat, 17 Feb 2018 15:30:24 +1100 Subject: [PATCH 358/402] Write regression test for #1447 --- tests/gui/TestGui.cpp | 53 +++++++++++++++++++++++++++++++++++++++++++ tests/gui/TestGui.h | 1 + 2 files changed, 54 insertions(+) diff --git a/tests/gui/TestGui.cpp b/tests/gui/TestGui.cpp index cf7b969e1..b56589315 100644 --- a/tests/gui/TestGui.cpp +++ b/tests/gui/TestGui.cpp @@ -61,6 +61,7 @@ #include "gui/entry/EntryView.h" #include "gui/group/GroupModel.h" #include "gui/group/GroupView.h" +#include "gui/group/EditGroupWidget.h" #include "keys/PasswordKey.h" void TestGui::initTestCase() @@ -342,6 +343,58 @@ void TestGui::testEditEntry() QTRY_COMPARE(m_tabWidget->tabText(m_tabWidget->currentIndex()), QString("%1*").arg(m_dbFileName)); } +void TestGui::testSearchEditEntry() +{ + // Regression test for Issue #1447 -- Uses example from issue description + + // Find buttons for group creation + EditGroupWidget* editGroupWidget = m_dbWidget->findChild<EditGroupWidget*>("editGroupWidget"); + QLineEdit* nameEdit = editGroupWidget->findChild<QLineEdit*>("nameEdit"); + QDialogButtonBox* editGroupWidgetButtonBox = editGroupWidget->findChild<QDialogButtonBox*>("buttonBox"); + + // Add groups "Good" and "Bad" + m_dbWidget->createGroup(); + QTest::keyClicks(nameEdit, "Good"); + QTest::mouseClick(editGroupWidgetButtonBox->button(QDialogButtonBox::Ok), Qt::LeftButton); + m_dbWidget->groupView()->setCurrentGroup(m_db->rootGroup()); // Makes "Good" and "Bad" on the same level + m_dbWidget->createGroup(); + QTest::keyClicks(nameEdit, "Bad"); + QTest::mouseClick(editGroupWidgetButtonBox->button(QDialogButtonBox::Ok), Qt::LeftButton); + m_dbWidget->groupView()->setCurrentGroup(m_db->rootGroup()); + + // Find buttons for entry creation + QToolBar* toolBar = m_mainWindow->findChild<QToolBar*>("toolBar"); + QWidget* entryNewWidget = toolBar->widgetForAction(m_mainWindow->findChild<QAction*>("actionEntryNew")); + EditEntryWidget* editEntryWidget = m_dbWidget->findChild<EditEntryWidget*>("editEntryWidget"); + QLineEdit* titleEdit = editEntryWidget->findChild<QLineEdit*>("titleEdit"); + QDialogButtonBox* editEntryWidgetButtonBox = editEntryWidget->findChild<QDialogButtonBox*>("buttonBox"); + + // Create "Doggy" in "Good" + Group* goodGroup = m_dbWidget->currentGroup()->findChildByName(QString("Good")); + m_dbWidget->groupView()->setCurrentGroup(goodGroup); + QTest::mouseClick(entryNewWidget, Qt::LeftButton); + QTest::keyClicks(titleEdit, "Doggy"); + QTest::mouseClick(editEntryWidgetButtonBox->button(QDialogButtonBox::Ok), Qt::LeftButton); + // Select "Bad" group in groupView + Group* badGroup = m_db->rootGroup()->findChildByName(QString("Bad")); + m_dbWidget->groupView()->setCurrentGroup(badGroup); + + // Search for "Doggy" entry + SearchWidget* searchWidget = toolBar->findChild<SearchWidget*>("SearchWidget"); + QLineEdit* searchTextEdit = searchWidget->findChild<QLineEdit*>("searchEdit"); + QTest::mouseClick(searchTextEdit, Qt::LeftButton); + QTest::keyClicks(searchTextEdit, "Doggy"); + QTRY_VERIFY(m_dbWidget->isInSearchMode()); + + // Goto "Doggy"'s edit view + QTest::keyClick(searchTextEdit, Qt::Key_Return); + QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::EditMode); + + // Check the path in header is "parent-group > entry" + QCOMPARE(m_dbWidget->findChild<EditEntryWidget*>("editEntryWidget")->findChild<QLabel*>("headerLabel")->text(), + QString("Good > Doggy > Edit entry")); +} + void TestGui::testAddEntry() { QToolBar* toolBar = m_mainWindow->findChild<QToolBar*>("toolBar"); diff --git a/tests/gui/TestGui.h b/tests/gui/TestGui.h index b8d3ce1fc..0b403731d 100644 --- a/tests/gui/TestGui.h +++ b/tests/gui/TestGui.h @@ -46,6 +46,7 @@ private slots: void testAutoreloadDatabase(); void testTabs(); void testEditEntry(); + void testSearchEditEntry(); void testAddEntry(); void testPasswordEntryEntropy(); void testDicewareEntryEntropy(); From 6a85556b33faefc4628c24965e1b5d60ed81a98b Mon Sep 17 00:00:00 2001 From: Weslly <weslly@users.noreply.github.com> Date: Sun, 18 Feb 2018 19:00:52 -0300 Subject: [PATCH 359/402] Fix about dialog size policy --- src/gui/AboutDialog.ui | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/gui/AboutDialog.ui b/src/gui/AboutDialog.ui index cc4a67d04..39963c121 100644 --- a/src/gui/AboutDialog.ui +++ b/src/gui/AboutDialog.ui @@ -175,6 +175,12 @@ </item> <item> <widget class="QLabel" name="label_7"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> <property name="text"> <string>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</string> </property> From ca30d1832de9640ae8f1d5c118f83143458a31d7 Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Mon, 19 Feb 2018 14:59:04 -0500 Subject: [PATCH 360/402] Add support for foreground and background entry colors * Add foreground/background color elements to advanced tab * Center paperclip icon --- src/format/KdbxXmlReader.cpp | 3 +- src/gui/entry/EditEntryWidget.cpp | 67 ++++++++++++-- src/gui/entry/EditEntryWidget.h | 2 + src/gui/entry/EditEntryWidgetAdvanced.ui | 110 ++++++++++++++++++++--- src/gui/entry/EntryModel.cpp | 28 +++++- 5 files changed, 186 insertions(+), 24 deletions(-) diff --git a/src/format/KdbxXmlReader.cpp b/src/format/KdbxXmlReader.cpp index 3d08bb55e..f30dc64b4 100644 --- a/src/format/KdbxXmlReader.cpp +++ b/src/format/KdbxXmlReader.cpp @@ -700,7 +700,8 @@ Entry* KdbxXmlReader::parseEntry(bool history) entry->setIcon(uuid); } continue; - }if (m_xml.name() == "ForegroundColor") { + } + if (m_xml.name() == "ForegroundColor") { entry->setForegroundColor(readColor()); continue; } diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index ab2a85f81..e54ceb625 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -31,6 +31,7 @@ #include <QTemporaryFile> #include <QMimeData> #include <QEvent> +#include <QColorDialog> #include "autotype/AutoType.h" #include "core/Config.h" @@ -156,6 +157,8 @@ void EditEntryWidget::setupAdvanced() connect(m_advancedUi->attributesView->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), SLOT(updateCurrentAttribute())); + connect(m_advancedUi->fgColorButton, SIGNAL(clicked()), SLOT(pickColor())); + connect(m_advancedUi->bgColorButton, SIGNAL(clicked()), SLOT(pickColor())); } void EditEntryWidget::setupIcon() @@ -593,6 +596,8 @@ void EditEntryWidget::setForms(const Entry* entry, bool restore) editTriggers = QAbstractItemView::DoubleClicked; } m_advancedUi->attributesView->setEditTriggers(editTriggers); + setupColorButton(true, entry->foregroundColor()); + setupColorButton(false, entry->backgroundColor()); m_iconsWidget->setEnabled(!m_history); m_autoTypeUi->sequenceEdit->setReadOnly(m_history); m_autoTypeUi->windowTitleCombo->lineEdit()->setReadOnly(m_history); @@ -758,26 +763,35 @@ void EditEntryWidget::updateEntryData(Entry* entry) const entry->setNotes(m_mainUi->notesEdit->toPlainText()); + if (m_advancedUi->fgColorCheckBox->isChecked() && + m_advancedUi->fgColorButton->property("color").isValid()) { + entry->setForegroundColor(QColor(m_advancedUi->fgColorButton->property("color").toString())); + } else { + entry->setForegroundColor(QColor()); + } + + if (m_advancedUi->bgColorCheckBox->isChecked() && + m_advancedUi->bgColorButton->property("color").isValid()) { + entry->setBackgroundColor(QColor(m_advancedUi->bgColorButton->property("color").toString())); + } else { + entry->setBackgroundColor(QColor()); + } + IconStruct iconStruct = m_iconsWidget->state(); if (iconStruct.number < 0) { entry->setIcon(Entry::DefaultIconNumber); - } - else if (iconStruct.uuid.isNull()) { + } else if (iconStruct.uuid.isNull()) { entry->setIcon(iconStruct.number); - } - else { + } else { entry->setIcon(iconStruct.uuid); } entry->setAutoTypeEnabled(m_autoTypeUi->enableButton->isChecked()); if (m_autoTypeUi->inheritSequenceButton->isChecked()) { entry->setDefaultAutoTypeSequence(QString()); - } - else { - if (AutoType::verifyAutoTypeSyntax(m_autoTypeUi->sequenceEdit->text())) { - entry->setDefaultAutoTypeSequence(m_autoTypeUi->sequenceEdit->text()); - } + } else if (AutoType::verifyAutoTypeSyntax(m_autoTypeUi->sequenceEdit->text())) { + entry->setDefaultAutoTypeSequence(m_autoTypeUi->sequenceEdit->text()); } entry->autoTypeAssociations()->copyDataFrom(m_autoTypeAssoc); @@ -1122,3 +1136,38 @@ QMenu* EditEntryWidget::createPresetsMenu() expirePresetsMenu->addAction(tr("1 year"))->setData(QVariant::fromValue(TimeDelta::fromYears(1))); return expirePresetsMenu; } + +void EditEntryWidget::setupColorButton(bool foreground, QColor color) +{ + QWidget* button = m_advancedUi->fgColorButton; + QCheckBox* checkBox = m_advancedUi->fgColorCheckBox; + if (!foreground) { + button = m_advancedUi->bgColorButton; + checkBox = m_advancedUi->bgColorCheckBox; + } + + if (color.isValid()) { + button->setStyleSheet(QString("background-color:%1").arg(color.name())); + button->setProperty("color", color.name()); + checkBox->setChecked(true); + } else { + button->setStyleSheet(""); + button->setProperty("color", QVariant()); + checkBox->setChecked(false); + } +} + +void EditEntryWidget::pickColor() +{ + bool isForeground = (sender() == m_advancedUi->fgColorButton); + QColor oldColor = QColor(m_advancedUi->fgColorButton->property("color").toString()); + if (!isForeground) { + oldColor = QColor(m_advancedUi->bgColorButton->property("color").toString()); + } + + QColorDialog colorDialog; + QColor newColor = colorDialog.getColor(oldColor); + if (newColor.isValid()) { + setupColorButton(isForeground, newColor); + } +} diff --git a/src/gui/entry/EditEntryWidget.h b/src/gui/entry/EditEntryWidget.h index bd9f5cd0f..19c2ebe15 100644 --- a/src/gui/entry/EditEntryWidget.h +++ b/src/gui/entry/EditEntryWidget.h @@ -99,6 +99,7 @@ private slots: void updateHistoryButtons(const QModelIndex& current, const QModelIndex& previous); void useExpiryPreset(QAction* action); void toggleHideNotes(bool visible); + void pickColor(); #ifdef WITH_XC_SSHAGENT void updateSSHAgent(); void updateSSHAgentAttachment(); @@ -120,6 +121,7 @@ private: #endif void setupProperties(); void setupHistory(); + void setupColorButton(bool foreground, QColor color); bool passwordsEqual(); void setForms(const Entry* entry, bool restore = false); diff --git a/src/gui/entry/EditEntryWidgetAdvanced.ui b/src/gui/entry/EditEntryWidgetAdvanced.ui index 8c729fd7c..9556eee19 100644 --- a/src/gui/entry/EditEntryWidgetAdvanced.ui +++ b/src/gui/entry/EditEntryWidgetAdvanced.ui @@ -2,19 +2,15 @@ <ui version="4.0"> <class>EditEntryWidgetAdvanced</class> <widget class="QWidget" name="EditEntryWidgetAdvanced"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>532</width> + <height>364</height> + </rect> + </property> <layout class="QVBoxLayout" name="verticalLayout"> - <property name="leftMargin"> - <number>0</number> - </property> - <property name="topMargin"> - <number>0</number> - </property> - <property name="rightMargin"> - <number>0</number> - </property> - <property name="bottomMargin"> - <number>0</number> - </property> <item> <widget class="QGroupBox" name="attributesBox"> <property name="title"> @@ -157,6 +153,96 @@ </layout> </widget> </item> + <item> + <widget class="QWidget" name="colorsBox" native="true"> + <layout class="QHBoxLayout" name="horizontalLayout_4"> + <item> + <widget class="QCheckBox" name="fgColorCheckBox"> + <property name="text"> + <string>Foreground Color:</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="fgColorButton"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>25</width> + <height>25</height> + </size> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_2"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Maximum</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>30</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QCheckBox" name="bgColorCheckBox"> + <property name="text"> + <string>Background Color:</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="bgColorButton"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>25</width> + <height>25</height> + </size> + </property> + <property name="text"> + <string/> + </property> + <property name="flat"> + <bool>false</bool> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + </item> </layout> </widget> <customwidgets> diff --git a/src/gui/entry/EntryModel.cpp b/src/gui/entry/EntryModel.cpp index 4a583b30e..71828c6ed 100644 --- a/src/gui/entry/EntryModel.cpp +++ b/src/gui/entry/EntryModel.cpp @@ -18,6 +18,7 @@ #include "EntryModel.h" #include <QFont> +#include <QFontMetrics> #include <QMimeData> #include <QPalette> #include <QDateTime> @@ -263,10 +264,26 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const font.setStrikeOut(true); } return font; - } else if (role == Qt::TextColorRole) { + } else if (role == Qt::ForegroundRole) { if (entry->hasReferences()) { QPalette p; return QVariant(p.color(QPalette::Active, QPalette::Mid)); + } else if (entry->foregroundColor().isValid()) { + return QVariant(entry->foregroundColor()); + } + } else if (role == Qt::BackgroundRole) { + if (entry->backgroundColor().isValid()) { + return QVariant(entry->backgroundColor()); + } + } else if (role == Qt::TextAlignmentRole) { + if (index.column() == Paperclip) { + return Qt::AlignCenter; + } + } else if (role == Qt::SizeHintRole) { + if (index.column() == Paperclip) { + QFont font; + QFontMetrics fm(font); + return fm.width(PaperClipDisplay) / 2; } } @@ -275,7 +292,9 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const QVariant EntryModel::headerData(int section, Qt::Orientation orientation, int role) const { - if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { + Q_UNUSED(orientation); + + if (role == Qt::DisplayRole) { switch (section) { case ParentGroup: return tr("Group"); @@ -302,6 +321,11 @@ QVariant EntryModel::headerData(int section, Qt::Orientation orientation, int ro case Attachments: return tr("Attachments"); } + } else if (role == Qt::TextAlignmentRole) { + switch (section) { + case Paperclip: + return Qt::AlignCenter; + } } return QVariant(); From 397d804cddf4a4a0b2eb267b81fccfb384273533 Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Mon, 19 Feb 2018 18:22:49 -0500 Subject: [PATCH 361/402] Add tests & minor edits --- src/gui/entry/EditEntryWidget.cpp | 4 ++-- src/gui/entry/EditEntryWidget.h | 2 +- tests/gui/TestGui.cpp | 27 +++++++++++++++++++++++++-- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index e54ceb625..4cb5e21e2 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -1137,7 +1137,7 @@ QMenu* EditEntryWidget::createPresetsMenu() return expirePresetsMenu; } -void EditEntryWidget::setupColorButton(bool foreground, QColor color) +void EditEntryWidget::setupColorButton(bool foreground, const QColor& color) { QWidget* button = m_advancedUi->fgColorButton; QCheckBox* checkBox = m_advancedUi->fgColorCheckBox; @@ -1165,7 +1165,7 @@ void EditEntryWidget::pickColor() oldColor = QColor(m_advancedUi->bgColorButton->property("color").toString()); } - QColorDialog colorDialog; + QColorDialog colorDialog(this); QColor newColor = colorDialog.getColor(oldColor); if (newColor.isValid()) { setupColorButton(isForeground, newColor); diff --git a/src/gui/entry/EditEntryWidget.h b/src/gui/entry/EditEntryWidget.h index 19c2ebe15..63b77323d 100644 --- a/src/gui/entry/EditEntryWidget.h +++ b/src/gui/entry/EditEntryWidget.h @@ -121,7 +121,7 @@ private: #endif void setupProperties(); void setupHistory(); - void setupColorButton(bool foreground, QColor color); + void setupColorButton(bool foreground, const QColor& color); bool passwordsEqual(); void setForms(const Entry* entry, bool restore = false); diff --git a/tests/gui/TestGui.cpp b/tests/gui/TestGui.cpp index b56589315..2e11fcf59 100644 --- a/tests/gui/TestGui.cpp +++ b/tests/gui/TestGui.cpp @@ -26,6 +26,7 @@ #include <QLabel> #include <QMimeData> #include <QPushButton> +#include <QCheckBox> #include <QSpinBox> #include <QPlainTextEdit> #include <QComboBox> @@ -279,6 +280,7 @@ void TestGui::testTabs() void TestGui::testEditEntry() { QToolBar* toolBar = m_mainWindow->findChild<QToolBar*>("toolBar"); + int editCount = 0; // Select the first entry in the database EntryView* entryView = m_dbWidget->findChild<EntryView*>("entryView"); @@ -305,7 +307,24 @@ void TestGui::testEditEntry() QTest::mouseClick(editEntryWidgetButtonBox->button(QDialogButtonBox::Apply), Qt::LeftButton); QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::EditMode); QCOMPARE(entry->title(), QString("Sample Entry_test")); - QCOMPARE(entry->historyItems().size(), 1); + QCOMPARE(entry->historyItems().size(), ++editCount); + + // Test entry colors (simulate choosing a color) + editEntryWidget->setCurrentPage(1); + auto fgColor = QColor(Qt::red); + auto bgColor = QColor(Qt::blue); + // Set foreground color + auto colorButton = editEntryWidget->findChild<QPushButton*>("fgColorButton"); + auto colorCheckBox = editEntryWidget->findChild<QCheckBox*>("fgColorCheckBox"); + colorButton->setProperty("color", fgColor); + colorCheckBox->setChecked(true); + // Set background color + colorButton = editEntryWidget->findChild<QPushButton*>("bgColorButton"); + colorCheckBox = editEntryWidget->findChild<QCheckBox*>("bgColorCheckBox"); + colorButton->setProperty("color", bgColor); + colorCheckBox->setChecked(true); + QTest::mouseClick(editEntryWidgetButtonBox->button(QDialogButtonBox::Apply), Qt::LeftButton); + QCOMPARE(entry->historyItems().size(), ++editCount); // Test protected attributes editEntryWidget->setCurrentPage(1); @@ -337,7 +356,11 @@ void TestGui::testEditEntry() // Confirm edit was made QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::ViewMode); QCOMPARE(entry->title(), QString("Sample Entry_test")); - QCOMPARE(entry->historyItems().size(), 2); + QCOMPARE(entry->foregroundColor(), fgColor); + QCOMPARE(entryItem.data(Qt::ForegroundRole), QVariant(fgColor)); + QCOMPARE(entry->backgroundColor(), bgColor); + QCOMPARE(entryItem.data(Qt::BackgroundRole), QVariant(bgColor)); + QCOMPARE(entry->historyItems().size(), ++editCount); // Confirm modified indicator is showing QTRY_COMPARE(m_tabWidget->tabText(m_tabWidget->currentIndex()), QString("%1*").arg(m_dbFileName)); From cd3e1fc27e8baa51e0a0ab1a662cc8650f330721 Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Sat, 17 Feb 2018 22:16:45 -0500 Subject: [PATCH 362/402] Ask to apply generated password when commiting an entry edit * Rename saveEntry to commitEntry to accurately capture its purpose * Add message to user when commit is successful * Made all inline messages in edit entry view 2 sec visibility --- src/gui/DatabaseWidget.cpp | 13 +++++---- src/gui/EditWidget.cpp | 3 +- src/gui/PasswordGeneratorWidget.cpp | 5 ++++ src/gui/PasswordGeneratorWidget.h | 8 ++++-- src/gui/entry/EditEntryWidget.cpp | 44 ++++++++++++++++++++--------- src/gui/entry/EditEntryWidget.h | 2 +- 6 files changed, 51 insertions(+), 24 deletions(-) diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 23760668a..fda7586d7 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -776,21 +776,18 @@ void DatabaseWidget::switchToView(bool accepted) m_newGroup->setParent(m_newParent); m_groupView->setCurrentGroup(m_newGroup); m_groupView->expandGroup(m_newParent); - } - else { + } else { delete m_newGroup; } m_newGroup = nullptr; m_newParent = nullptr; - } - else if (m_newEntry) { + } else if (m_newEntry) { if (accepted) { m_newEntry->setGroup(m_newParent); m_entryView->setFocus(); m_entryView->setCurrentEntry(m_newEntry); - } - else { + } else { delete m_newEntry; } @@ -798,6 +795,10 @@ void DatabaseWidget::switchToView(bool accepted) m_newParent = nullptr; } + if (accepted) { + showMessage(tr("Entry updated successfully."), MessageWidget::Positive, false, 2000); + } + setCurrentWidget(m_mainWidget); } diff --git a/src/gui/EditWidget.cpp b/src/gui/EditWidget.cpp index daa2f7922..65c6306e1 100644 --- a/src/gui/EditWidget.cpp +++ b/src/gui/EditWidget.cpp @@ -119,7 +119,8 @@ bool EditWidget::readOnly() const void EditWidget::showMessage(const QString& text, MessageWidget::MessageType type) { - m_ui->messageWidget->showMessage(text, type); + m_ui->messageWidget->setCloseButtonVisible(false); + m_ui->messageWidget->showMessage(text, type, 2000); } void EditWidget::hideMessage() diff --git a/src/gui/PasswordGeneratorWidget.cpp b/src/gui/PasswordGeneratorWidget.cpp index e6cb0a92d..7a93f86bd 100644 --- a/src/gui/PasswordGeneratorWidget.cpp +++ b/src/gui/PasswordGeneratorWidget.cpp @@ -151,6 +151,11 @@ void PasswordGeneratorWidget::setStandaloneMode(bool standalone) } } +QString PasswordGeneratorWidget::getGeneratedPassword() +{ + return m_ui->editNewPassword->text(); +} + void PasswordGeneratorWidget::keyPressEvent(QKeyEvent* e) { if (e->key() == Qt::Key_Escape && m_standalone == true) { diff --git a/src/gui/PasswordGeneratorWidget.h b/src/gui/PasswordGeneratorWidget.h index 3d6d27a55..ed4414377 100644 --- a/src/gui/PasswordGeneratorWidget.h +++ b/src/gui/PasswordGeneratorWidget.h @@ -49,16 +49,18 @@ public: void saveSettings(); void reset(); void setStandaloneMode(bool standalone); -public Q_SLOTS: + QString getGeneratedPassword(); + +public slots: void regeneratePassword(); + void applyPassword(); + void copyPassword(); signals: void appliedPassword(const QString& password); void dialogTerminated(); private slots: - void applyPassword(); - void copyPassword(); void updateButtonsEnabled(const QString& password); void updatePasswordStrength(const QString& password); void togglePasswordShown(bool hidden); diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index 4cb5e21e2..c30557574 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -98,7 +98,7 @@ EditEntryWidget::EditEntryWidget(QWidget* parent) connect(this, SIGNAL(accepted()), SLOT(acceptEntry())); connect(this, SIGNAL(rejected()), SLOT(cancel())); - connect(this, SIGNAL(apply()), SLOT(saveEntry())); + connect(this, SIGNAL(apply()), SLOT(commitEntry())); connect(m_iconsWidget, SIGNAL(messageEditEntry(QString, MessageWidget::MessageType)), SLOT(showMessage(QString, MessageWidget::MessageType))); connect(m_iconsWidget, SIGNAL(messageEditEntryDismiss()), SLOT(hideMessage())); @@ -128,7 +128,7 @@ void EditEntryWidget::setupMain() QAction *action = new QAction(this); action->setShortcut(Qt::CTRL | Qt::Key_Return); - connect(action, SIGNAL(triggered()), this, SLOT(saveEntry())); + connect(action, SIGNAL(triggered()), this, SLOT(commitEntry())); this->addAction(action); m_mainUi->passwordGenerator->hide(); @@ -683,20 +683,39 @@ void EditEntryWidget::setForms(const Entry* entry, bool restore) m_mainUi->titleEdit->setFocus(); } -void EditEntryWidget::saveEntry() +/** + * Commit the form values to in-memory database representation + * + * @return true is commit successful, otherwise false + */ +bool EditEntryWidget::commitEntry() { if (m_history) { clear(); hideMessage(); emit editFinished(false); - return; + return true; } if (!passwordsEqual()) { showMessage(tr("Different passwords supplied."), MessageWidget::Error); - return; + return false; } + // Ask the user to apply the generator password, if open + if (m_mainUi->togglePasswordGeneratorButton->isChecked() && + m_mainUi->passwordGenerator->getGeneratedPassword() != m_mainUi->passwordEdit->text()) { + auto answer = MessageBox::question(this, tr("Apply generated password?"), + tr("Do you want to apply the generated password to this entry?"), + QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); + if (answer == QMessageBox::Yes) { + m_mainUi->passwordGenerator->applyPassword(); + } + } + + // Hide the password generator + m_mainUi->togglePasswordGeneratorButton->setChecked(false); + if (m_advancedUi->attributesView->currentIndex().isValid() && m_advancedUi->attributesEdit->isEnabled()) { QString key = m_attributesModel->keyByIndex(m_advancedUi->attributesView->currentIndex()); m_entryAttributes->set(key, m_advancedUi->attributesEdit->toPlainText(), @@ -734,19 +753,18 @@ void EditEntryWidget::saveEntry() updateSSHAgent(); } #endif + + showMessage(tr("Entry updated successfully."), MessageWidget::Positive); + return true; } void EditEntryWidget::acceptEntry() { - // Check if passwords are mismatched first to prevent saving - if (!passwordsEqual()) { - showMessage(tr("Different passwords supplied."), MessageWidget::Error); - return; + if (commitEntry()) { + clear(); + hideMessage(); + emit editFinished(true); } - - saveEntry(); - clear(); - emit editFinished(true); } void EditEntryWidget::updateEntryData(Entry* entry) const diff --git a/src/gui/entry/EditEntryWidget.h b/src/gui/entry/EditEntryWidget.h index 63b77323d..66d89dbfb 100644 --- a/src/gui/entry/EditEntryWidget.h +++ b/src/gui/entry/EditEntryWidget.h @@ -74,7 +74,7 @@ signals: private slots: void acceptEntry(); - void saveEntry(); + bool commitEntry(); void cancel(); void togglePasswordGeneratorButton(bool checked); void setGeneratedPassword(const QString& password); From 698b44f71c628662b94d238159e408e9d2f15de0 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Mon, 19 Feb 2018 19:10:30 +0100 Subject: [PATCH 363/402] Update zxcvbn library --- COPYING | 4 +- src/CMakeLists.txt | 2 +- src/zxcvbn/dict-src.h | 26174 +++++++++++++------------- src/zxcvbn/{zxcvbn.cpp => zxcvbn.c} | 101 +- src/zxcvbn/zxcvbn.h | 40 +- tests/gui/TestGui.cpp | 4 +- 6 files changed, 13153 insertions(+), 13172 deletions(-) rename src/zxcvbn/{zxcvbn.cpp => zxcvbn.c} (95%) diff --git a/COPYING b/COPYING index 075188e6f..195650551 100644 --- a/COPYING +++ b/COPYING @@ -223,8 +223,8 @@ Copyright: 2009-2010, Iowa State University License: Boost-1.0 Files: src/zxcvbn/zxcvbn.* -Copyright: 2015, Tony Evans -License: BSD 3-clause +Copyright: 2015-2017, Tony Evans +License: MIT Files: src/http/qhttp/* Copyright: 2014, Amir Zamani diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f01780baa..b2444faa5 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -29,7 +29,7 @@ endif() find_library(ZXCVBN_LIBRARIES zxcvbn) if(NOT ZXCVBN_LIBRARIES) - add_library(zxcvbn STATIC zxcvbn/zxcvbn.cpp) + add_library(zxcvbn STATIC zxcvbn/zxcvbn.c) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/zxcvbn) set(ZXCVBN_LIBRARIES zxcvbn) endif(NOT ZXCVBN_LIBRARIES) diff --git a/src/zxcvbn/dict-src.h b/src/zxcvbn/dict-src.h index 3f890e504..495cc7843 100644 --- a/src/zxcvbn/dict-src.h +++ b/src/zxcvbn/dict-src.h @@ -1,8 +1,3 @@ -/* -This file is autogenerated by dictgen from zxcvbn-c -For more info visit: https://github.com/tsyrogit/zxcvbn-c -*/ - #define ROOT_NODE_LOC 0 #define BITS_CHILD_PATT_INDEX 14 #define BITS_CHILD_MAP_INDEX 18 @@ -10,12 +5,12 @@ For more info visit: https://github.com/tsyrogit/zxcvbn-c #define SHIFT_WORD_ENDING_BIT (SHIFT_CHILD_MAP_INDEX + BITS_CHILD_MAP_INDEX) static const unsigned int DictNodes[84251] = { - 0, 7766135, 15548619, 21217533, 22479111, 23937299, 24428822, 57672227, 104104744, 109380421, 120275860, 130630613, 145753146, 160777371, 174671103, - 187303246, 197363087, 214894070, 222512664, 230868551, 252724930, 265094915, 270567208, 287983495, 289261455, 302696413, 309741569, 314542111, 325453919, 337086629, - 337528998, 350210288, 356567314, 362219827, 378390933, 383879608, 402590246, 402754087, 419121039, 439175935, 454331212, 454724430, 463784837, 470076330, 476122062, - 483478513, 488459276, 502090831, 515935376, 517295254, 524209343, 530140382, 534039794, 544066853, 556567908, 562679169, 572100016, 581832155, 582274524, 595349025, - 602656335, 619531939, 628657875, 628821716, 642174746, 650645311, 658198366, 666636156, 688394177, 698748913, 706465810, 706695187, 717361230, 725389431, 741560511, - 744786085, 753225968, 767299892, 785011079, 793399719, 806801884, 819991062, 838832740, 853332628, 873321185, 884036373, 902075247, 903041906, 924881868, 936219636, + 0, 7766135, 15548619, 21217533, 22479111, 23937299, 24428822, 57672227, 104104744, 109380421, 120275860, 130630613, 145753146, 160777371, 174671103, + 187303246, 197363087, 214894070, 222512664, 230868551, 252724930, 265094915, 270567208, 287983495, 289261455, 302696413, 309741569, 314542111, 325453919, 337086629, + 337528998, 350210288, 356567314, 362219827, 378390933, 383879608, 402590246, 402754087, 419121039, 439175935, 454331212, 454724430, 463784837, 470076330, 476122062, + 483478513, 488459276, 502090831, 515935376, 517295254, 524209343, 530140382, 534039794, 544066853, 556567908, 562679169, 572100016, 581832155, 582274524, 595349025, + 602656335, 619531939, 628657875, 628821716, 642174746, 650645311, 658198366, 666636156, 688394177, 698748913, 706465810, 706695187, 717361230, 725389431, 741560511, + 744786085, 753225968, 767299892, 785011079, 793399719, 806801884, 819991062, 838832740, 853332628, 873321185, 884036373, 902075247, 903041906, 924881868, 936219636, 941673551, 956273727, 961320018, 973952133, 978064534, 988091559, 989222059, 1008178430,1016337702,1023169859,1039029641,1049990584,1055610321,1066063354,1066292731, 1071273491,1084053062,1095620212,1096503830,1100584585,1108935783,1120130786,1141184310,1154537325,1163663255,1184733172,1184995317,1192990746,1198479410,1202247747, 1209505893,1226692782,1227888820,1243158773,1249220875,1268193637,1279007125,1288327105,1298254229,1312510612,1319279157,1343902230,1356602064,1361713886,1375771416, @@ -30,2092 +25,2092 @@ static const unsigned int DictNodes[84251] = 2540737172,2558537173,2558815702,2562108900,2577362474,2577870379,2589912670,2599333502,2603314831,2609704615,2619043543,2623162773,2623680234,2638556952,2648409657, 2655448915,2662575977,2663427947,2684359316,2703044605,2705174159,2719789127,2732300645,2751033548,2751295693,2759127272,2763321592,2777116972,2792223072,2800251267, 2831446496,2832019937,2838400545,2854498848,2860321008,2869080665,2885595803,2896556742,2897761451,2902749634,2918036242,2934600520,2937697113,2943005549,2947740545, - 2953573269,2963927998,2986259482,2987155375,2993385447,2999202894,3007231086,3008074388,3016897686,3022550193,786433, 802818, 819203, 835588, 868357, - 884742, 901127, 8, 917510, 933893, 901129, 950282, 966658, 983051, 999436, 901133, 1015822, 1048591, 1064962, 1081350, - 1097734, 1114117, 901136, 1130505, 1146897, 1163282, 1179657, 1196049, 1212418, 901139, 1228820, 1753109, 1769494, 901132, 1785879, - 901126, 1802264, 1900569, 1785858, 1933333, 1949708, 901146, 1966107, 1998850, 2015260, 2031618, 901149, 901136, 2048030, 2080794, - 2097183, 2113555, 2129922, 901130, 2146336, 901151, 2179105, 901148, 2228258, 2342947, 901156, 901157, 2408469, 1769510, 2424871, - 2457640, 2474005, 2490399, 2506793, 2523176, 901158, 901141, 901162, 2539563, 2359315, 2326568, 2572319, 2588693, 2605087, 2621446, - 901142, 2637868, 2719784, 1769478, 2736159, 2752524, 901161, 2342933, 2768898, 2785286, 2801670, 1212447, 2818059, 2834477, 2129936, - 2867246, 2359322, 2916354, 2932768, 2965551, 2408476, 2998320, 2326534, 3047466, 2588710, 3063857, 3145778, 3178527, 2342950, 1933334, - 3194931, 3227700, 3260469, 3293238, 3325964, 3342365, 3309584, 901131, 2523174, 3358775, 3424312, 3457036, 3473434, 2523138, 1769529, - 3489850, 3538973, 2129932, 3555387, 2031626, 3588155, 3620924, 3702845, 2342927, 3751998, 3801151, 3833877, 3850256, 2342938, 3866688, - 2113547, 3948554, 3964949, 3981324, 3997722, 4014090, 4030466, 4046869, 4063263, 4079632, 3473418, 4096065, 2129942, 4145218, 4177932, - 1933327, 2261002, 4194371, 4276292, 3244101, 4325446, 2326550, 4407362, 4440135, 4554824, 4620361, 1785862, 4685898, 4751372, 2129946, - 4767819, 4833301, 4849740, 4882458, 4898818, 4915210, 4931626, 4947990, 4964364, 4980757, 901122, 4997197, 5029966, 5095474, 5128271, - 5259305, 5275679, 5292051, 3473439, 5308496, 5341265, 2129932, 5373983, 5390378, 4079647, 5406802, 5439494, 5455893, 5472258, 5488650, - 5505053, 4161567, 5521491, 5603412, 1769491, 2408463, 5603330, 5636181, 5701663, 5718037, 5734431, 3473427, 5750815, 5603338, 5767254, - 2801702, 5799976, 5177356, 5816407, 5865560, 4341802, 5898329, 5947482, 1769513, 6111254, 6127632, 2523152, 6144091, 6176860, 2326540, - 6209629, 1933369, 2408490, 3129346, 6258782, 2621461, 5275660, 6340610, 6357087, 6406173, 6422530, 2031642, 6439008, 1769509, 3309570, - 6553697, 3211362, 6619235, 1769484, 6373476, 2195557, 6651947, 6684701, 4030495, 6701158, 1949698, 1933341, 6733836, 2342938, 6750311, - 6832232, 6881385, 6914154, 6373483, 1769493, 6996076, 2195565, 7028846, 2031654, 7061558, 7094311, 7127080, 7143531, 7176202, 3129384, - 7192687, 7225456, 7241840, 7258225, 7307280, 901160, 7323677, 7340044, 7356426, 7372816, 7389205, 1785868, 7405682, 1785971, 7520285, - 7536682, 7553140, 7569419, 7585807, 7602197, 901125, 7618676, 7634951, 2752538, 7651445, 7684214, 7634955, 7634975, 7716886, 7733314, - 8093719, 8110200, 8126487, 8142969, 8175639, 8159255, 901143, 8192122, 8355963, 8503420, 8585341, 8749182, 8847487, 8896640, 8929303, - 2195585, 8945794, 8962178, 901250, 8978434, 4980738, 8994947, 901251, 9011332, 9027716, 9044009, 9060393, 4980777, 9076869, 9109638, - 934023, 9126018, 9142290, 9158674, 901138, 9175176, 901257, 9240714, 8175750, 9175179, 8175731, 8175746, 9273484, 9355287, 8388749, - 9371763, 9207943, 3555344, 9388174, 7389195, 9175183, 9420944, 9453586, 9469961, 8159369, 9486479, 9519122, 9535620, 901252, 9551884, - 5177401, 9568401, 9699474, 9830547, 9896066, 9912468, 2195605, 10027158, 10027158, 8601751, 10190871, 10207381, 10240149, 10272905, 10289280, - 10322054, 10338327, 10354803, 10371095, 901255, 10387586, 8159362, 10403971, 10420354, 10436626, 8388760, 10453123, 10469506, 10485778, 2195609, - 10502275, 10518658, 10535066, 10567811, 10584194, 10371090, 10600579, 10616962, 10633234, 10649754, 10682499, 10698882, 10715154, 2195611, 10731529, - 10748060, 10780802, 10797074, 2195613, 9158771, 10813598, 10846367, 10879091, 10895495, 10911876, 10928146, 10944642, 8159363, 10961056, 10993798, - 11010180, 8962066, 11026450, 11042948, 11059334, 901235, 3309608, 11075745, 8962180, 11124870, 11059218, 11141135, 11157545, 4980739, 11174020, - 11190434, 11239433, 11255923, 11272210, 11288599, 11305097, 8962183, 11321459, 11288594, 11337888, 11370505, 11387043, 11419783, 11436169, 11059209, - 11452548, 11468915, 8994950, 11485193, 11501586, 11518089, 11534468, 11550854, 11059335, 11567116, 11583526, 11599884, 11616267, 11632671, 11649061, - 11665420, 8994839, 11681956, 11763877, 11911299, 11927682, 11944074, 2195622, 11976853, 12009602, 12026023, 8388776, 10027173, 12075139, 12091522, - 12107914, 8601769, 10027178, 12140675, 12157058, 12173450, 8601771, 12206211, 12222594, 12238986, 8601772, 12271747, 12288130, 12304522, 8601773, - 10027182, 12337283, 12353666, 12370058, 8601775, 10027184, 12402819, 12419202, 12435594, 8601777, 12468355, 12484738, 12501130, 8601778, 8601779, - 12533940, 12566659, 12583042, 12599434, 8388789, 8601782, 12632201, 12648471, 10371095, 12664967, 8159250, 12681369, 12714115, 12730503, 8159364, - 12746770, 12763251, 8159241, 12779635, 10371081, 12796067, 12828855, 12878008, 12910723, 12927106, 12943514, 12632073, 12976151, 12992521, 13008914, - 7602191, 13025465, 13107386, 13172867, 13189250, 13205658, 13238403, 9158786, 13254843, 13287539, 13303938, 10371187, 1114138, 13320324, 13336691, - 13303940, 13352983, 13369532, 13402296, 13435010, 13451282, 8388797, 13467671, 13484147, 13500442, 13516816, 13533190, 13549589, 2359327, 13566142, - 13631623, 13648063, 13697154, 13713426, 901255, 13729815, 13746306, 3309703, 13762752, 13795443, 9470082, 13811843, 12648579, 13828125, 13844516, - 13860980, 2342952, 13877441, 13959323, 13992127, 14041218, 14057610, 10256515, 11665542, 14090377, 14106758, 14123139, 2359428, 14139529, 14155907, - 14172275, 11059223, 14188738, 14270659, 14319747, 14336130, 14352402, 2195644, 14368917, 9142402, 14401728, 14434438, 14450820, 8994947, 14467268, - 14499849, 12664947, 14516227, 14532611, 2162689, 14549126, 8994825, 14450711, 14565519, 14598296, 14647427, 11042946, 14663703, 14680202, 14712833, - 1769477, 14729239, 2326658, 14745797, 9207817, 14811334, 14844019, 14860422, 14876809, 14893065, 14909571, 2195655, 10387474, 2162704, 14925853, - 14942230, 14958615, 14975033, 14991490, 15007874, 1769512, 2261004, 15024146, 15040549, 15056915, 15073302, 2359308, 15089864, 15122463, 15138834, - 15155240, 15171716, 15188004, 2326663, 15204363, 15220866, 15237151, 2130036, 15253705, 15286288, 15302674, 15319071, 7307396, 15335426, 15352010, - 1769514, 15384607, 15400972, 8159270, 15417375, 15433734, 15450133, 15466508, 8159258, 15482898, 934019, 15499274, 15515654, 15532068, 8159248, - 16203799, 16220183, 6324247, 16236560, 2326547, 16253132, 901254, 16302285, 933899, 16351438, 16662735, 16892112, 16941205, 901143, 16974033, - 2129951, 17022999, 17039383, 8175753, 14385283, 901138, 17055893, 17088642, 9535506, 17105080, 901131, 17137676, 17154050, 1785882, 17170642, - 17268947, 17350868, 17383558, 2342948, 3309699, 17399939, 17416405, 9207939, 17449174, 901177, 17481943, 17580169, 17596565, 17629400, 17678359, - 17694835, 17711127, 8159367, 17727625, 17743890, 17760390, 17776772, 17793241, 17825927, 901121, 901135, 17842394, 17875163, 17907721, 17924114, - 901121, 17940530, 17973468, 18006237, 18039006, 2195679, 2932960, 18087959, 18104343, 16597217, 18120714, 18137107, 18153494, 1785868, 18169866, - 8994828, 18186466, 18481379, 18645123, 11665431, 18661385, 18677875, 10371207, 18694288, 2261123, 18727043, 18743426, 18759834, 18792579, 11124866, - 18808963, 11010178, 18825444, 19021847, 19038231, 901123, 19054821, 19153126, 19235047, 19333352, 19398889, 19431555, 19447811, 901123, 901122, - 19070985, 19464201, 933897, 8568834, 19480710, 16269446, 19496961, 17924097, 19513557, 19546346, 19579011, 19595398, 11059331, 19611657, 19628267, - 19677321, 19693705, 19710188, 19759238, 19775622, 18890867, 11059315, 9207945, 19792105, 19824877, 1933315, 17924097, 19857411, 19431427, 19874030, - 19972335, 20021379, 20037641, 14450697, 20054153, 20070640, 20168838, 20185305, 20217971, 10371207, 20234241, 7602181, 20250865, 20283507, 20299911, - 901252, 20316178, 20332675, 20349065, 20365321, 901251, 20381827, 19464326, 20398322, 20447475, 20496499, 20512900, 20529284, 8962178, 20545702, - 20578548, 20611317, 20660470, 20693239, 20726008, 20775161, 20807930, 20856981, 20889731, 20906007, 2179187, 20922616, 20971654, 20988036, 16269335, - 21004539, 21053692, 21086234, 21102594, 1114169, 21119111, 21135494, 21151859, 2752541, 2539522, 21168129, 21184725, 20234249, 21528830, 17072259, - 14385283, 21676163, 21692546, 21708818, 2195711, 10371204, 21725440, 21856387, 21872774, 934018, 21889155, 21905417, 4980873, 21922049, 21987586, - 8601859, 22020250, 22053124, 22085641, 14549123, 16269449, 22102276, 22134918, 22151299, 22167667, 10371203, 22184067, 22200455, 9158787, 22216732, - 2342914, 22233349, 22315145, 22331526, 9207942, 22347913, 22364422, 22397062, 22413446, 22429830, 22446214, 22462579, 19775603, 14745731, 22970632, - 23019529, 23036041, 23052553, 23248905, 14909577, 8994825, 13713523, 2031622, 23265546, 23298060, 14712833, 23314699, 23363852, 23413005, 17825929, - 11042953, 23461906, 23478542, 23511311, 23576707, 23593232, 23789577, 901257, 23806067, 23822471, 23838855, 16269427, 2195729, 23855378, 23904268, - 23920652, 17924101, 2195648, 24182996, 24215561, 24232073, 24248580, 24281251, 24314132, 24346901, 24395785, 24412291, 2195655, 24936578, 21610514, - 24952841, 24969495, 901254, 25002147, 25034889, 20365321, 25051295, 25084041, 24395785, 25100568, 23773397, 25673887, 14549129, 25706684, 25739398, - 14549129, 25755929, 26099847, 26116211, 25673862, 26132762, 26378372, 26099847, 26394907, 26902812, 27099348, 26476562, 26378372, 27132189, 27164684, - 2670618, 19447811, 27181195, 26476562, 27214110, 901149, 27263250, 27312140, 27328538, 2342933, 27345183, 901139, 1769477, 27377669, 27394060, - 27410458, 27426837, 7307300, 2195611, 27443354, 27476254, 27525394, 27574284, 27590682, 27607061, 901156, 27623477, 901126, 27656479, 27688979, - 27705401, 2129948, 27721885, 901250, 27754650, 27787550, 27836435, 27852829, 901132, 27869213, 2261033, 3375120, 27885842, 27934723, 868357, - 27951116, 27967514, 27983893, 2195744, 28000398, 23920652, 28033031, 28049427, 2179129, 23478527, 28065810, 8159362, 11550852, 28082194, 10371204, - 28098846, 27246611, 28147741, 901161, 28164108, 1212453, 28180754, 28229644, 28246042, 28262689, 28295174, 28311581, 28327977, 24166403, 28344327, - 17448979, 28360749, 2179129, 28393762, 28475547, 8962066, 28508314, 28541058, 8994931, 28557576, 23085193, 28606755, 28688518, 28705060, 28786706, - 28803202, 2195584, 28819610, 28852376, 28901508, 28918053, 2195622, 28950822, 28999810, 29016305, 13713523, 29048984, 29098279, 29163652, 13303942, - 29180200, 29294889, 29327658, 884748, 29360426, 14745731, 29393195, 29442064, 29458453, 8994822, 29474900, 29507884, 29540353, 29556738, 29573126, - 29589533, 29605907, 19447815, 29622509, 1949736, 29655341, 3702799, 29687924, 29704221, 29720613, 29737091, 9535622, 29753646, 1933349, 29786415, - 29819182, 22478886, 29851952, 29901105, 4980758, 6701085, 29933874, 30015491, 30032179, 29327668, 30064949, 30113798, 884739, 30130486, 30228595, - 27164807, 30244870, 30261277, 30277635, 27344903, 30294037, 29376548, 30310711, 30359611, 2998284, 30392632, 4980773, 30425401, 30458170, 30490742, - 30523707, 30556447, 29376531, 30589244, 9158793, 30687420, 30720135, 9535506, 30736701, 30785554, 30802050, 23789703, 30818435, 30834823, 934025, - 30851390, 9535623, 29049151, 30998695, 30802050, 31048000, 31080579, 31096963, 10371202, 31113537, 31162506, 13238407, 31195458, 31244611, 31277066, - 31293469, 31309850, 31326239, 31342628, 16269443, 31359113, 31375372, 13303942, 31391760, 31408147, 31424549, 2031628, 31440912, 31457290, 31473701, - 31490060, 24838180, 31506756, 31555909, 31588486, 31604741, 31621235, 1769607, 31637830, 31703049, 7602177, 31719558, 31735820, 31752218, 31768691, - 2670727, 31784966, 31801347, 901127, 27328538, 31817947, 31850517, 31867014, 18890767, 31883294, 31916359, 32096584, 32227459, 32243842, 32260114, - 2195594, 32276809, 32358730, 20365449, 32391334, 9535619, 32424267, 32522572, 32571507, 32587910, 32604295, 9535603, 32620742, 9158788, 9158791, - 32653427, 13238404, 10371206, 32669712, 32686106, 6209548, 32702797, 32768166, 32800902, 32817283, 16269321, 32833546, 32849949, 1769498, 32866638, - 32932095, 32964738, 32981327, 33063104, 16941065, 33095683, 33112092, 17809439, 33128784, 33226889, 33243251, 2179074, 8994953, 934022, 33259857, - 33341571, 9207939, 33357958, 16728199, 33374342, 33390930, 33423699, 33570959, 33177735, 33603740, 901235, 33636486, 33652871, 16941074, 33161331, - 33177735, 33505412, 33669460, 33734674, 8159366, 33751370, 33783939, 2326570, 23380298, 33800341, 33833301, 12664841, 33882353, 33915126, 33947990, - 34177367, 34275512, 34308227, 34324610, 8994946, 34341048, 34373976, 34455561, 34472067, 11059337, 34488567, 34521097, 11059335, 9535497, 34537817, - 34586787, 34619527, 11010180, 9535603, 34636122, 34701659, 34734214, 31342729, 34750812, 34799965, 10371209, 11042947, 29049182, 34865353, 34898271, - 35045491, 35061778, 35078281, 28786823, 35094663, 35111042, 32981179, 35127530, 20693344, 35160224, 35192841, 35209569, 27738247, 35258503, 35275106, - 28917769, 35307655, 35324041, 10764297, 35340510, 35389795, 9142406, 35438948, 8159255, 35504146, 11124871, 9142278, 35520521, 17448970, 35536924, - 35553281, 35569701, 17809538, 35586405, 35799398, 2195815, 35913912, 35946626, 35963034, 8994834, 35996008, 36094083, 36110468, 9158787, 36126727, - 36143220, 2326539, 36159849, 36225161, 36241523, 11059334, 36257804, 36274195, 2129923, 36290922, 1785884, 8994931, 8962163, 36421995, 36487303, - 32620681, 36503594, 36519948, 7307295, 36536684, 36618371, 36634759, 934025, 36651328, 36684141, 9207923, 36749675, 934020, 36814860, 1900585, - 36831598, 36995439, 37044339, 37060740, 37077360, 37208252, 934003, 20627609, 37240969, 37257408, 37290137, 37322889, 37339505, 23789577, 37503346, - 37552316, 37585031, 37158930, 37601535, 37634289, 20349065, 37667004, 37699715, 36388995, 37716098, 37732367, 37748776, 9207831, 37765491, 37978484, - 38027637, 38076790, 38125943, 38158712, 38224220, 25034889, 38273401, 38322554, 38371354, 38387724, 2179093, 38404423, 38584699, 38699388, 38748291, - 38764674, 38781058, 4980870, 38797693, 38862871, 38879366, 901236, 38895747, 38912132, 38928515, 8978564, 8962179, 38945150, 39043204, 933906, - 23838857, 39059593, 29163650, 39076217, 22069380, 39125375, 39207043, 39223428, 39239812, 1785987, 39256436, 39305600, 39354560, 39387521, 39584130, - 39682232, 39715203, 8061059, 39764356, 39846022, 9142281, 39862409, 11042951, 39879045, 8994951, 39928192, 39977095, 36765811, 39993734, 40042524, - 1949722, 40059271, 40124808, 40173699, 14549001, 40189961, 40206354, 40222730, 38780937, 40239497, 40452490, 40534225, 17105291, 8994818, 40583564, - 40648839, 40665106, 20856981, 40681609, 40697988, 40714374, 40730759, 40747123, 2195673, 40763789, 40861828, 40878103, 40894601, 40910963, 40927367, - 18874391, 40943829, 40976386, 38879268, 32456722, 40992791, 22200343, 41009542, 41058447, 41091087, 41107482, 3686416, 41124238, 41238690, 34324615, - 41288007, 41468113, 41517268, 12730386, 41550223, 41582614, 17448972, 41599139, 34324612, 41632144, 2195857, 41664661, 39157972, 41697303, 2195595, - 41713814, 41877906, 41943170, 41959442, 2195732, 41975957, 42008706, 9207826, 42025363, 8389012, 34324498, 42074517, 2195856, 42123670, 42172823, - 42238164, 42270738, 17809523, 42287512, 2195619, 42385434, 42401794, 42418195, 30392342, 42434572, 1785877, 42451214, 8388735, 42483903, 8389017, - 42533274, 42614996, 42647963, 42811804, 2195636, 42877077, 21872770, 42910099, 42958978, 9207938, 42975641, 43024514, 10371203, 43041181, 2195615, - 43122711, 43139095, 31342726, 43155870, 2195599, 43204631, 43221015, 43237506, 4980742, 43254175, 43319431, 43335811, 43352087, 43368479, 43384870, - 4980852, 34308228, 43401403, 43433996, 4964390, 43450389, 43466767, 43483178, 43499522, 38830091, 43515926, 43532310, 2408464, 43549088, 43745566, - 43794569, 43810818, 43827334, 43843586, 43860083, 43876354, 4980871, 43892873, 43909139, 43925638, 43941917, 1769587, 43958409, 43974685, 43991174, - 44007465, 44023923, 44040234, 2621575, 44056578, 44072962, 44089346, 19267586, 44105747, 44122529, 44154892, 44171305, 901162, 44187667, 44204086, - 44236802, 15482891, 44253602, 44285964, 2326554, 44302343, 1785887, 44319139, 44351498, 4980765, 44368292, 44400732, 3178506, 44433420, 2195741, - 44449804, 44466214, 2195495, 44482784, 4079628, 29622294, 44515749, 44564521, 44580906, 44597270, 901236, 44613670, 2342924, 44630438, 6422544, - 44663207, 2998312, 17006613, 44711952, 1900559, 44728744, 44859817, 44990890, 1785894, 45023320, 4980746, 2326559, 44613642, 45056427, 3473436, - 45088796, 45105180, 45121564, 45137948, 901148, 45154363, 45187123, 30343234, 45220268, 45285805, 45351342, 2031645, 45400066, 2195887, 42434591, - 45416486, 45433264, 45465629, 1769503, 45482417, 1769483, 45514817, 45564338, 2031632, 45597107, 45629876, 1114128, 2850837, 45679022, 45728181, - 2850845, 3162133, 45760950, 4980764, 2342941, 45842470, 45859255, 2261008, 2162710, 45891605, 45907990, 4980748, 45924792, 46039481, 13074434, - 46088634, 1785872, 17006630, 46137396, 46170131, 46186515, 46202899, 1212435, 46219302, 2801685, 46235745, 46301291, 46333990, 46350402, 46383547, - 45907974, 46448659, 5177381, 46465055, 46481414, 2162709, 46497832, 46514197, 2621459, 46531004, 4980762, 6602793, 46645263, 6946856, 46662077, - 46694457, 46710796, 2326549, 46727196, 31490064, 46743998, 46809535, 46841858, 46858261, 17448991, 46874643, 6193189, 46891014, 3473429, 46907840, - 47006145, 4964368, 1900582, 47104450, 2523148, 17842242, 47136797, 47153181, 27246621, 47169987, 47202756, 47251909, 1114150, 46891039, 47284315, - 47317013, 1949712, 47333830, 17006614, 47366599, 2850858, 47415307, 1933323, 47432136, 47530026, 47546406, 24838156, 6406149, 47562764, 47579148, - 47595532, 1769484, 47611961, 1785887, 47628307, 47644688, 47661084, 47677442, 933914, 47693839, 47710246, 32849936, 47727049, 47857691, 2850835, - 47890539, 47923226, 47939586, 2162714, 47956009, 47972393, 28147753, 47988835, 48021526, 4161567, 48038346, 48070956, 44351519, 17154060, 48103516, - 45056021, 6209548, 48136651, 2359306, 48185804, 3342365, 48218572, 48250899, 48267301, 7258225, 48284109, 48398798, 48447514, 47120415, 48463901, - 48480258, 2752550, 48496652, 22216709, 48513487, 48545823, 2162698, 15351834, 48562218, 48578602, 48594986, 44171306, 48611792, 42434570, 1933354, - 48660518, 48676905, 1949708, 48693707, 48742403, 3178499, 48758815, 6701077, 48775633, 48873938, 48939475, 48988628, 49020930, 2162719, 49037781, - 49086492, 1933343, 49102870, 49119254, 49135638, 2621462, 49152470, 44613669, 3867095, 45858845, 49250314, 49266720, 31424538, 49299484, 49315856, - 49332225, 49348650, 24838153, 49365464, 3686412, 49430559, 49446943, 49463327, 2162719, 49479686, 49496095, 1769501, 49512921, 49610764, 49627268, - 49643561, 2752647, 49660378, 49725477, 49742299, 49774603, 49791007, 1769482, 49807836, 49872937, 44613658, 49889290, 5947423, 49906141, 49938463, - 4980755, 49954932, 49971316, 49987700, 44597364, 50004446, 50069514, 50086359, 2113565, 50119135, 2621455, 4980776, 50151895, 47317023, 50184672, - 45465621, 17006649, 50266593, 1933350, 50315301, 2359333, 5832735, 50332130, 50429981, 50446372, 50462748, 2261032, 50479587, 3555340, 50511883, - 17006604, 50528740, 3129382, 50577845, 50610188, 50626658, 50659347, 2342949, 50676197, 50774502, 50889191, 50937868, 1114133, 48627714, 50954728, - 50987090, 884767, 51019798, 7602188, 51036172, 2801690, 51053033, 51101727, 43237382, 1933340, 51118171, 49496076, 51151338, 51200491, 51232827, - 51265574, 51281986, 51314699, 3309579, 51331564, 51429869, 51495406, 51528175, 2113578, 51560919, 51593237, 2162690, 51610096, 17006633, 51658767, - 2342934, 51675157, 4161538, 51692017, 51773446, 6701075, 51789829, 49889318, 51806642, 2113542, 51838986, 2129930, 51855381, 51871746, 2326538, - 51888626, 6209567, 45629456, 51937282, 15351818, 51954163, 52117520, 2162825, 52134388, 48054309, 52215820, 4980774, 52232213, 52249077, 52281350, - 52298035, 52330511, 15351810, 52346896, 27246618, 52363290, 2539551, 52380150, 52445615, 7389206, 52477994, 17006632, 52494352, 52510732, 50987018, - 52527607, 52576294, 7602192, 6602762, 52592699, 1933348, 2719746, 52625912, 45465637, 52674566, 1753107, 52690975, 52707765, 6946818, 52740132, - 52756499, 1114134, 52773305, 52822031, 17006629, 2342918, 52838905, 52936705, 52953219, 8994817, 52969978, 19447945, 53051529, 53067777, 53084294, - 53100545, 17924211, 1212553, 53117065, 53133324, 53149830, 53166106, 53182579, 53198869, 2343047, 53215244, 53231731, 53248021, 53264516, 53280808, - 1114242, 53297659, 53362693, 53379078, 53395593, 53411852, 53428253, 53444742, 53461018, 53477417, 53493875, 2261013, 53510149, 53526537, 31424649, - 53543420, 53690369, 19447810, 53706768, 3309605, 53723141, 53739526, 53755911, 53772425, 53788684, 53805085, 53821459, 53837958, 53854234, 17449001, - 53870604, 1212445, 16269324, 53886982, 53903367, 53870604, 53920253, 11059226, 53968901, 53985289, 54001801, 54018060, 54034461, 54050835, 54067257, - 54083625, 16269338, 52953090, 18956289, 54100478, 54132873, 54149132, 16269338, 54166015, 54198293, 54214692, 54231552, 54296607, 17809424, 54313020, - 54395393, 45039644, 47120406, 54460930, 54493196, 24838170, 52576284, 54460458, 49217565, 54509587, 6406166, 54526467, 54575141, 54592004, 54640652, - 54657052, 2031656, 54673513, 54706693, 54919190, 54935683, 54951948, 54968451, 8994857, 54985222, 47317030, 55050242, 6324234, 2621442, 55066640, - 55083527, 55132175, 1114143, 55149064, 6193178, 55197753, 5603359, 55214601, 31424538, 55246894, 55296522, 3178534, 933909, 55329291, 46530586, - 55377935, 2850822, 55394347, 6324255, 55427088, 3702800, 55443980, 1933331, 45465622, 55476683, 55525483, 55558577, 55591437, 55640090, 55656974, - 55689743, 5177366, 55754762, 1933322, 55771664, 55869969, 4571148, 27623476, 47349766, 55902220, 55918618, 4980747, 1933353, 55935506, 54984740, - 56050195, 47611914, 56099348, 56148078, 2539536, 1900555, 6717450, 56181269, 56246313, 56262658, 2342922, 56279574, 56311819, 2342923, 56328429, - 2965544, 56360986, 56377879, 56410648, 52985874, 56492063, 31424533, 56508536, 3342355, 56524840, 7307304, 56541721, 56607258, 56639503, 32849951, - 6946837, 56656411, 1114124, 50806820, 56689180, 56787485, 56836233, 56852506, 2326662, 56869001, 56885274, 1769606, 56901769, 56918021, 7602310, - 56934426, 50151450, 6946847, 56951326, 57000045, 57032723, 2326530, 6455327, 57049631, 7045146, 20234245, 57098784, 57180163, 57196581, 57212970, - 7602194, 49086521, 57229354, 57245830, 57262117, 17924115, 57278471, 57294855, 57311239, 31801351, 57328161, 57376870, 29900802, 57409573, 7389196, - 52527142, 17383460, 57426466, 57475359, 57507977, 57524243, 57540742, 57557049, 2179187, 57573395, 57589817, 57606172, 16826378, 57622531, 57638915, - 57655299, 19038211, 58212900, 9207849, 58245669, 58311206, 58507815, 58704424, 8388735, 58769420, 17809420, 58785922, 58802199, 7307290, 49020949, - 17105080, 58819113, 58851459, 58867861, 901674, 58900664, 58933803, 58966025, 58982423, 8962071, 58998915, 59015298, 59031706, 24248474, 59064876, - 7602177, 59179017, 59195415, 59211907, 59228295, 17809448, 59244556, 59260957, 19447846, 59277321, 10764418, 33734679, 59293719, 8159367, 59310563, - 2162709, 59342863, 59359234, 59375626, 1785893, 59392557, 59556398, 59621507, 59637890, 59654298, 59686930, 2130050, 59703435, 59736459, 59769391, - 59818115, 8159347, 2605096, 19447844, 59834928, 59916311, 59932802, 59949187, 16269447, 59965449, 59981955, 59998769, 11059209, 12648563, 60031538, - 60096646, 60113031, 11075602, 60129285, 60112908, 60145801, 60162183, 60178547, 60194834, 60211332, 8962071, 17088646, 60227721, 3309594, 60244156, - 17924105, 18399258, 60277299, 60473908, 60571779, 60588162, 60604434, 2195589, 60620931, 60637314, 16269330, 60653699, 11468930, 60670083, 60686570, - 60719219, 1785861, 60735659, 60867125, 14450819, 60948748, 24281216, 18874505, 60998198, 61047351, 61128838, 11059315, 9109619, 61145251, 11075719, - 61177990, 61194808, 61259911, 9158674, 61276406, 29049401, 61276295, 61309066, 61341827, 61358089, 17924230, 19464210, 61374487, 61390982, 61407237, - 61423746, 1769495, 61440002, 61456394, 1114154, 61473338, 61686331, 38879243, 61767927, 61800585, 9535511, 61816850, 60243977, 61833331, 19447940, - 61850172, 61882503, 61898781, 61915252, 61931551, 61947961, 61964290, 61980682, 61997097, 46088218, 62013711, 36634633, 8962057, 62079549, 62111956, - 62144753, 62177854, 62210623, 62259223, 62275602, 4980867, 62292102, 62308489, 62324765, 62341151, 4980747, 62357519, 884870, 62373904, 50036762, - 62390309, 62406687, 45629469, 62423616, 62455814, 62472221, 1212423, 62488592, 62504962, 62521367, 62537769, 62554127, 62570628, 62586898, 2359325, - 62603841, 62833218, 62882371, 62914572, 13074461, 62931204, 62963972, 62996615, 63012873, 34799731, 63029286, 63045672, 63062057, 17924111, 63078980, - 63128133, 63209621, 63242377, 11075699, 63258787, 934019, 63291507, 27738244, 8962183, 11550857, 63308358, 63357141, 42958980, 63389812, 63406090, - 2359337, 48054284, 63422480, 45727770, 6209552, 63438858, 63455235, 28164231, 63472199, 63652424, 63799881, 63848563, 63864947, 2162820, 63881802, - 2621451, 21528585, 63914235, 36388999, 63963349, 59883657, 934003, 22069383, 63995911, 64012309, 4571151, 64029259, 1114249, 64094796, 64209485, - 37142671, 64274708, 33652851, 64307359, 64340100, 64356483, 16269444, 64373326, 64488015, 64586058, 64618630, 64634889, 46530596, 64651274, 64667669, - 1212431, 64684169, 9535618, 64700425, 64716930, 64733241, 64749570, 64765981, 3309599, 22331527, 64782928, 64815110, 64831524, 2752628, 64847879, - 17809445, 64864849, 64995485, 65028228, 65044617, 901714, 65060882, 9158665, 62062610, 65077379, 11059331, 65093769, 64880771, 65110148, 65126537, - 8962182, 65143379, 65274452, 65323139, 65339522, 41697410, 59293714, 65355891, 42958982, 18890887, 65372182, 65388585, 65405060, 2621571, 65421322, - 4685865, 65438293, 65520214, 41992323, 65618052, 36339721, 65634436, 65650818, 65667081, 10764422, 65683458, 65699878, 1785867, 65716243, 55869459, - 65733207, 65830941, 65847306, 868409, 65863706, 65880095, 65896460, 2326557, 65912941, 7307398, 65945642, 65962228, 65994844, 66027530, 66043920, - 66060309, 45137929, 66076695, 2179081, 66093656, 66125855, 66142246, 66158621, 5177370, 66174992, 65912870, 66191961, 66224139, 66240540, 66256905, - 66273318, 3375135, 1818634, 66290266, 66322438, 65912853, 66338838, 2261020, 66355287, 44908570, 66404368, 65912861, 66421339, 66453525, 45498502, - 66469909, 66486406, 66503260, 66551923, 66568233, 66584605, 66600986, 17449000, 66617770, 66650118, 66666518, 66683015, 17924099, 51593221, 66699276, - 66716131, 66748456, 66764819, 65912854, 66781789, 18890775, 66846725, 17924153, 66863393, 66896009, 56885253, 66912862, 66961415, 66977828, 66994452, - 44285968, 6193164, 67027551, 67059743, 1785866, 67076122, 10371101, 67093088, 67158028, 67174534, 67190810, 2326643, 67207305, 67223668, 67239951, - 16269314, 67256329, 67272741, 67289218, 38879248, 67305479, 67322465, 67420189, 9207820, 67436581, 67452938, 67469427, 67485715, 2752531, 67502690, - 67928675, 68108900, 68338277, 10567811, 18792579, 68386823, 2326549, 33161348, 68403814, 68435973, 68452355, 1949734, 68468932, 68501638, 8175748, - 68518414, 68550668, 68567059, 68583440, 68599818, 1785885, 68616807, 68763861, 68796547, 59949193, 68813416, 2785320, 68846154, 68878468, 68894729, - 68911113, 68927619, 68943895, 68960265, 14434436, 68976832, 69009538, 21872663, 69026409, 69058675, 69075074, 69091337, 69107910, 24969331, 69141098, - 12763159, 11059332, 69190251, 8994948, 69255788, 69386861, 69484799, 69517447, 17088642, 69533951, 69566598, 69582978, 20299794, 69599854, 69648393, - 30867587, 69664780, 36634645, 14745609, 69681286, 15483014, 61014148, 69697803, 69746803, 69763202, 69779590, 69795858, 69812847, 69845008, 65699866, - 34422802, 69862000, 22069257, 70041609, 70058140, 70091377, 70254601, 70271189, 14450819, 70304370, 5325427, 70353030, 24969350, 70369415, 70385799, - 8945794, 70402182, 70418786, 20217971, 70451315, 70467934, 70500489, 4980738, 70516895, 32636951, 70549738, 18874500, 14450825, 70582278, 884851, - 70599284, 70631446, 68599924, 18874389, 70648437, 70779140, 70811671, 50659462, 11042825, 70828055, 36765827, 70844659, 70893830, 37159046, 65077266, - 70926451, 70942727, 884743, 9158788, 70959130, 70975517, 28344361, 70992502, 30950007, 71123576, 36339842, 2260994, 71205497, 71237669, 17809444, - 71254650, 71451162, 71483408, 5177373, 71500106, 71532660, 71548947, 2261003, 71565947, 71614595, 4980851, 19480691, 71631089, 71664017, 71696519, - 71712791, 11468937, 71729490, 65126515, 71761932, 71778420, 71794710, 2621471, 71811708, 71925875, 71942162, 71958659, 20299910, 71975167, 71942153, - 72007814, 72024195, 33619977, 72040605, 72073853, 72138936, 72171657, 30867474, 72187906, 45629443, 72204926, 72335363, 72351782, 72368159, 2162725, - 72384647, 70729860, 72401137, 72434303, 72466562, 72482931, 72499315, 933911, 72515613, 72532084, 2523193, 72548992, 21610611, 72581129, 34324503, - 72597620, 72613930, 72630284, 72646696, 72663081, 2031637, 72680065, 35864708, 72728710, 33734665, 72745075, 44285983, 72761986, 72810525, 19447924, - 72827194, 11042828, 72860291, 72908805, 17924227, 72925210, 2326643, 72941587, 72958596, 72990857, 73007145, 73023503, 73039894, 73056277, 54296708, - 73072863, 73105423, 73121924, 73138311, 933925, 73154591, 73171589, 884745, 1785898, 73204326, 73236483, 1949830, 9207810, 73252921, 45531137, - 73269876, 73302022, 73318531, 73334822, 73351170, 73367684, 1769473, 73384582, 73433104, 73449488, 7389226, 73465857, 73482256, 73498755, 73515123, - 73531414, 2523167, 73548423, 73596947, 73613334, 73629702, 2523162, 73646090, 38879244, 73663112, 73695247, 1949703, 73711632, 73728028, 73744400, - 1114140, 73761417, 74269322, 74416779, 74530834, 19464322, 74547380, 61800582, 74579991, 74597004, 74629760, 74661899, 2605058, 74678925, 2195640, - 74776585, 74793092, 74809479, 74825859, 72908930, 22331401, 74842325, 74875017, 33177623, 74891282, 74907667, 74924061, 74940546, 74956818, 74973225, - 74989591, 2179095, 75006606, 75186831, 75284489, 75300887, 934022, 75317381, 75350150, 75366409, 75382807, 75399186, 75415686, 75431945, 75448343, - 19775506, 75464715, 6438928, 38830211, 75481106, 75497603, 11059330, 75513878, 75530252, 2162699, 75547280, 75579408, 46530588, 23838743, 75595910, - 75612290, 75628679, 75645060, 31096841, 75661317, 75677708, 75694106, 75710485, 33177636, 75727505, 75792956, 75825287, 14549124, 75841667, 75858051, - 72908931, 75874435, 75891346, 75940499, 76087634, 76120724, 76153012, 76185737, 76201993, 8372233, 76219029, 76365977, 61128819, 76398707, 76415091, - 18677895, 76431475, 76447879, 76464263, 9535620, 76480649, 76496908, 44351516, 76513282, 76529706, 10829834, 76546710, 76743057, 18890886, 76775442, - 76791831, 4980745, 76808201, 34603145, 76824599, 76841092, 2326665, 76858007, 76890153, 57262091, 11042950, 76907160, 77070345, 77086857, 77103769, - 77135987, 11042951, 77152274, 77168770, 37355651, 77185378, 77217946, 2031622, 50937896, 77250576, 2326566, 77266953, 77283357, 77299728, 36307059, - 3309583, 77316762, 77414532, 32817289, 77430941, 70893703, 77463684, 77480051, 69156979, 77496330, 933917, 77512720, 47611930, 77529755, 77660292, - 12730483, 77676660, 77692957, 77709369, 2752553, 11304978, 11468823, 77725812, 77742121, 77758470, 2359299, 77774985, 9207940, 77791238, 884754, - 77808284, 77906050, 77922419, 61358210, 77938803, 77955203, 77971591, 77987849, 78004361, 78020742, 78037001, 78054045, 78103198, 18890761, 78135305, - 78151795, 78168090, 1212435, 78185119, 78282886, 78299142, 78315655, 78332036, 78348420, 69156887, 62062707, 78364884, 78398112, 78446724, 22331410, - 78463016, 38830086, 78479386, 20365318, 78496417, 78544906, 47120403, 78561282, 29769738, 78577978, 78610489, 38879348, 78627490, 78659600, 78676008, - 78692392, 9158663, 78708748, 24969242, 78725795, 78774290, 78790665, 78807062, 884772, 3293196, 78824100, 78872607, 78888963, 78905366, 884752, - 78921754, 78938115, 78954508, 17924107, 52740212, 68599839, 78971557, 79037094, 79069863, 52576266, 79102009, 2621452, 79119016, 79151239, 2326537, - 79167507, 9158693, 79184553, 79265833, 79282194, 43384842, 52805638, 79299242, 79413260, 72859657, 79429653, 2343047, 79446073, 79462754, 79495189, - 2179114, 79511567, 2326565, 79527951, 79544338, 79560706, 9535516, 79577771, 79659692, 79691782, 67059728, 79708163, 2261122, 79724582, 79740944, - 2850827, 31424524, 79757997, 67059724, 31424569, 79807150, 15237121, 47120396, 6946873, 79856303, 79921175, 16826391, 79937541, 1949812, 79954608, - 79987377, 80019494, 42434583, 80035842, 2752552, 80052914, 80494707, 80511111, 80527367, 80543878, 51314803, 80560819, 80741044, 16941749, 80888242, - 80920588, 80936970, 24838165, 80954038, 81035424, 81068163, 81084439, 81100915, 81117315, 36339735, 81133702, 81149981, 81166367, 2162717, 29737095, - 81182859, 81216183, 15483011, 81313907, 81330313, 16269427, 81346694, 81362953, 22331507, 81380024, 34734211, 37158921, 81510534, 81526899, 13303826, - 81543865, 81592338, 9519239, 37159042, 81608715, 884738, 81625786, 81690642, 81707278, 9158679, 81739906, 81756201, 19447839, 81772659, 81789065, - 81805321, 8978563, 81822395, 81936652, 81985551, 82001951, 1114123, 82018441, 82034825, 82051206, 81969289, 82067465, 33177734, 70729863, 82084540, - 82133123, 82150077, 82198537, 11042953, 82215614, 82264085, 82280469, 2342969, 82296854, 82280460, 82313273, 32637060, 82330303, 82510219, 82542611, - 82558978, 2162694, 82575929, 82608482, 82641028, 82657298, 81707031, 82674368, 82723170, 82755721, 76201993, 82772083, 32456836, 82788355, 2015247, - 82805441, 82985666, 83034325, 83067587, 83116224, 83148988, 83182276, 2195544, 18677895, 83329159, 83346060, 9519236, 83378331, 83411079, 83428037, - 61259908, 83492996, 83509866, 83558537, 83574793, 14450706, 83591210, 7372802, 83608262, 83722355, 83738754, 10387479, 83755139, 10944643, 83772103, - 83820582, 83836970, 1114113, 83854024, 83918884, 1949717, 83935242, 83951637, 3309625, 83968156, 21872777, 84000903, 37748754, 84017174, 1785863, - 84034249, 84148354, 36618249, 84164738, 84181122, 22069382, 84197385, 10387588, 84214333, 21610519, 84246543, 8962185, 84263158, 84295837, 84328563, - 23838729, 84344850, 84361331, 84377715, 84393986, 1212444, 84410587, 84443154, 84459529, 84476035, 84492419, 84508809, 84525093, 84541452, 84557881, - 84574239, 17809418, 84590615, 76709911, 84607106, 84623369, 84639801, 84656243, 10371094, 84672571, 2179079, 84705318, 84721676, 84738059, 51871756, - 84754567, 84770834, 8962069, 84787221, 84803626, 84819999, 84836354, 3309575, 84852742, 84869160, 84885636, 84902003, 84918309, 84934671, 2326544, - 84951076, 84967436, 2129949, 84983839, 11157507, 85000202, 85016579, 884852, 85032967, 85049380, 2129935, 85066442, 85114917, 9535494, 5505050, - 85131979, 85196826, 79298697, 85213220, 85229700, 85245992, 2162706, 85262364, 85279436, 4112420, 85311510, 10371108, 85327914, 14532636, 85344266, - 85360646, 49774614, 85377741, 85409927, 85426202, 85442570, 17809409, 85458953, 85475359, 85491844, 9158678, 85508814, 85852879, 85983952, 86048899, - 11305092, 86065289, 86081565, 2752549, 86097943, 33177618, 86115025, 86179994, 86212631, 86229010, 39895058, 86246098, 86343795, 86360075, 86376479, - 86392870, 86409218, 86425735, 65077257, 14549107, 86442041, 86458394, 66338832, 86474883, 86491268, 65077385, 56557580, 86508243, 86605954, 86622227, - 86638602, 2621469, 10993779, 11468809, 36634761, 86655700, 86720519, 86736901, 86753321, 17448997, 86770233, 86802435, 86818826, 4980868, 86835925, - 59818099, 86934230, 86999049, 87015555, 8389335, 87031848, 87048198, 2113557, 87064692, 19464249, 87081688, 87261207, 87277683, 22200450, 18677897, - 87294681, 87343263, 60637319, 87376602, 87589132, 87638346, 87671060, 87703685, 87736455, 8389339, 87752834, 76415106, 3129356, 87048194, 87769220, - 87785629, 20529170, 87818972, 87851123, 18169993, 87867432, 87883782, 87900181, 87916546, 44171274, 87933661, 88096809, 88113158, 88129538, 88146052, - 88162419, 2326564, 88178818, 88195095, 34799750, 12746883, 88211586, 88228087, 88261102, 46039051, 88294110, 88408439, 88440844, 88457258, 2621477, - 88473735, 88490021, 88506410, 1949833, 88522759, 88539137, 88555527, 2261033, 17088530, 88260610, 88572639, 88785027, 32800905, 17072137, 88801410, - 88817862, 13713538, 88850565, 88883209, 4980759, 49496104, 79249448, 88899747, 88932468, 88948793, 1769487, 88965142, 88981535, 9158685, 88997907, - 89014313, 89030791, 89047177, 2162823, 89063434, 52445203, 89079830, 89096197, 89112587, 89128961, 7307301, 85098517, 89145382, 89161757, 9158713, - 89178124, 89194514, 89210996, 89227273, 16269315, 89244384, 89276456, 2162706, 89292810, 89309316, 89325608, 3309684, 89342689, 89784455, 89800713, - 89817826, 89849971, 51314819, 89866979, 90014436, 9535511, 36339844, 90079366, 90095746, 90112130, 2621481, 90128402, 90144791, 90161175, 90177668, - 90193943, 12664964, 90210704, 90243202, 19267607, 90259593, 16269442, 90276581, 90341511, 11010179, 90357769, 90374276, 64356489, 42958857, 90391270, - 90488966, 9371780, 90505239, 19447923, 90521715, 2129941, 90538727, 90587536, 81707143, 90620648, 90735337, 90866233, 90898547, 90800146, 9371778, - 90915170, 90947719, 90964098, 33619986, 90980467, 90996745, 91013320, 91046023, 16941193, 91062407, 37585033, 91079230, 20381828, 91111555, 91127940, - 91144215, 91160599, 91176983, 34422807, 91193542, 9535625, 91226246, 19447942, 83918857, 91243242, 2179100, 91308198, 91340915, 91357314, 9371657, - 91374315, 89882759, 91472579, 91521139, 91537539, 91554144, 91586910, 91619462, 91635735, 8159274, 91652844, 11042931, 75497604, 884777, 91718381, - 91783430, 91815938, 91832436, 8994854, 91848841, 62275593, 91865838, 91897986, 75497481, 91914282, 91930662, 2342913, 91947759, 92110979, 92127241, - 92143746, 2162804, 92160134, 92177024, 92209506, 34324611, 72040798, 92242055, 92258559, 92291824, 92504087, 2195726, 70058197, 92520563, 92536947, - 18874505, 92553354, 92586737, 92635251, 92651651, 60243991, 92668569, 8602354, 92700690, 70385682, 92717290, 92749834, 47120426, 2015270, 92766346, - 9519234, 92799016, 92815370, 6193158, 92832499, 15482995, 93012369, 93045492, 93094019, 14745737, 93110426, 93143195, 93175962, 9158786, 93209333, - 93372425, 29163657, 93388915, 93405319, 93421699, 93437961, 93454473, 8389366, 93470963, 93520226, 93552649, 93569155, 93585542, 2195711, 29376646, - 93601810, 70729858, 93618935, 22478979, 73629727, 93667465, 93683718, 93700211, 2752514, 93716724, 93749383, 93765763, 93782153, 93798969, 93831210, - 93847583, 2359297, 93864696, 93896716, 93913849, 93945878, 93962242, 93978634, 24838165, 93995029, 94011432, 68599945, 94028128, 94060573, 94076969, - 36339846, 44285958, 94093404, 94126106, 87539717, 2293776, 94142490, 94158877, 94175242, 14745605, 94191718, 94224500, 94240809, 7585798, 94257168, - 94273573, 94289927, 94306436, 94322716, 94339202, 7307293, 94355484, 94371852, 2031746, 94388476, 94421018, 9207844, 71188491, 94438138, 49774602, - 94470165, 94486570, 94502943, 1212427, 94519353, 56852490, 94535726, 94584843, 94601256, 51593242, 94617657, 94633996, 20299786, 45760523, 94651131, - 94699551, 94716034, 94732304, 17809431, 78807061, 94748701, 94765171, 94781462, 94797855, 94814223, 38879241, 94830951, 94863475, 17924122, 94879749, - 94896131, 17924098, 94913276, 95290109, 95421182, 95518743, 95535239, 95551625, 64667785, 95568007, 95584387, 95600775, 84361351, 95617161, 95633540, - 95649810, 95666291, 95682569, 9470084, 95698950, 52723733, 95715623, 95780998, 95797383, 95813650, 95830151, 61358214, 95846409, 95862919, 14418050, - 95879186, 95895561, 95912067, 95928338, 12779651, 95945471, 96010255, 96026626, 1212438, 96043017, 38994055, 96059432, 28164133, 96076544, 96157714, - 96174116, 96190471, 19447849, 9109636, 96207500, 96239731, 96256018, 36716659, 96272393, 96288902, 1785874, 96305921, 96387090, 33161347, 96403593, - 96419852, 45776925, 38830195, 96436359, 17448975, 96453249, 7045138, 70516867, 96502530, 96600835, 96714932, 10764297, 72040724, 96747920, 96780306, - 19464327, 96797324, 37158930, 20988038, 96829555, 82657289, 96846596, 96927746, 96944156, 96960554, 2260998, 96977011, 96993417, 97009687, 27738242, - 97026070, 97042444, 78807097, 97059589, 97173639, 97189897, 97206403, 97222793, 33620102, 97239066, 97255462, 97271827, 1114153, 97288307, 97304710, - 97321097, 97337353, 97353859, 97370886, 97402917, 97419283, 97435685, 2342919, 97452147, 97468426, 97484819, 97501222, 97517599, 3850243, 97534727, - 21151766, 97567496, 97714317, 97763337, 97779735, 97796119, 97812503, 8175751, 33161239, 97828979, 97845379, 36634755, 19464307, 97861764, 97878173, - 97911561, 98009255, 9519236, 98058370, 98074767, 98107404, 1785892, 6438943, 98124554, 98255627, 98353282, 14827538, 98369651, 98386051, 98402436, - 98418825, 23838854, 21872772, 98435081, 98451479, 98467972, 98484361, 32637059, 98500740, 98517015, 98533399, 98549897, 22331529, 98566281, 98582551, - 98599049, 98615305, 98631689, 98648073, 3309591, 98665228, 98713609, 98730119, 98746503, 9453702, 98762761, 98779268, 98795657, 98812019, 36765714, - 98828419, 98844787, 98861079, 98877449, 22069385, 98894446, 98943107, 98959497, 98975876, 98992243, 36388996, 99008643, 99024905, 99041414, 99057801, - 99074183, 96288883, 99090563, 88883330, 14745735, 99106965, 99139607, 99156083, 99172375, 99188871, 11075716, 99205254, 99221636, 99238020, 99254406, - 35864707, 99270788, 99287175, 99303447, 99319943, 99336307, 99352599, 99369090, 99385481, 81608730, 99401740, 99418123, 99434517, 99450886, 99467290, - 99483679, 2670632, 99500034, 99516454, 24838182, 99532866, 99565590, 10371091, 99582733, 99614854, 99631140, 99647500, 99664009, 19447848, 99680268, - 99696661, 48054293, 99713046, 99729434, 99745808, 99762181, 99778563, 99795079, 41959433, 99811359, 99827714, 17809411, 99844878, 99876886, 2752522, - 99893251, 1785896, 99909648, 98107403, 99926056, 99942440, 99958800, 53624860, 99975951, 100320016, 100467473, 32637063, 100565123, 16941079, 82313331, - 62062727, 100581776, 100614545, 100646930, 62029958, 100663319, 18661513, 100680466, 100810886, 17088627, 100827923, 39895170, 1949702, 100892712, 73744410, - 96796806, 100909065, 100925458, 70729865, 100941955, 100958338, 18956311, 100974601, 100991108, 77136009, 101007369, 89948290, 101024532, 101105795, 67485701, - 91193481, 101122071, 101138441, 11010183, 101154953, 101171332, 101187607, 101204098, 17432604, 101221141, 101269634, 101286018, 101302402, 24412169, 69156874, - 101319446, 100876309, 88948741, 101368599, 101450520, 101531801, 37585033, 101564551, 34471959, 24936457, 101581593, 101647130, 101729051, 101777542, 90964100, - 101793810, 11468932, 101810972, 101842953, 101859460, 101875846, 16941187, 64356467, 101892893, 101990531, 102006899, 102023283, 102039689, 64684163, 10944649, - 33161350, 102055954, 59293826, 102073118, 69140611, 102219891, 102236295, 22200435, 36634739, 102253343, 102367241, 23822467, 102383782, 102416393, 102432905, - 33620103, 102449287, 102465673, 101875721, 102482108, 102514822, 102531228, 102563849, 102580355, 8389408, 102596626, 13238404, 102613001, 102629510, 102645894, - 102662281, 76791942, 62062594, 102679329, 102842505, 9109635, 102859106, 2179098, 102891655, 32768234, 102908102, 8142857, 102940690, 102957858, 103006340, - 103022727, 61128839, 103039779, 103186563, 103202947, 103219330, 103235714, 17924226, 103252103, 92536967, 103268370, 83361810, 103284738, 48627722, 103301141, - 103317530, 103333900, 5832714, 103350435, 103383503, 103415846, 103432207, 103448612, 2031732, 103464981, 103481359, 17006608, 103497764, 103514113, 103530631, - 15351849, 103546911, 7389241, 103563280, 103579679, 103596035, 8962060, 103612453, 103628805, 2261107, 103645315, 51314818, 103661683, 103678009, 103694348, - 103710850, 103727130, 103743514, 19447827, 103759878, 103776277, 103792642, 103809050, 103825429, 901924, 103842597, 2736166, 1196058, 103956482, 47317108, - 103972876, 103989286, 104005634, 66273301, 45498399, 104022018, 104039206, 104071197, 104087592, 2523943, 104727337, 104760106, 901240, 1212536, 3309688, - 4980856, 104956024, 104759308, 27246712, 104972311, 8142871, 104989483, 105136341, 105169027, 105185411, 20365443, 18874377, 105201820, 15482889, 105235244, - 105300781, 105349341, 105382702, 105447442, 16941186, 105463974, 17432713, 105496706, 105513310, 105545766, 105562243, 12664962, 105578505, 105594882, 105611401, - 105627650, 105644166, 11059202, 105660629, 8994835, 105693203, 105709705, 105725981, 105742470, 11059212, 105758729, 105775116, 105791625, 16269319, 105807881, - 105824285, 105840777, 105857065, 105873542, 105889834, 105906291, 10371094, 105923133, 105955462, 105971827, 32620679, 105988911, 2195668, 106152256, 106184761, - 44908562, 106201251, 106233993, 106250263, 69189747, 106266655, 106283046, 106299403, 106315785, 106332166, 2342921, 48545813, 106348565, 46514188, 106365169, - 106398512, 83165319, 106446879, 2031638, 106464049, 106512516, 98009220, 106528898, 106545286, 106561651, 22478983, 106577923, 106594322, 32456819, 106611506, - 106643587, 43024407, 106659869, 106676358, 106692740, 11059257, 106709150, 106741778, 106758276, 106774663, 88883332, 106791731, 107070260, 107118723, 107135107, - 107151593, 107184265, 107201138, 107249779, 107266183, 77103925, 107283254, 107512021, 107544713, 107561649, 107593990, 107627319, 107708547, 20447445, 107725624, - 107791161, 107856698, 107905026, 107921902, 8978434, 901142, 107954627, 107986970, 108003354, 108019738, 108036122, 108052522, 108068906, 108085290, 108101654, - 2621462, 91275292, 106905622, 107757590, 4571142, 108118044, 108134428, 78168083, 2621482, 1785862, 108151611, 108199955, 108216339, 2031645, 2261018, - 108233532, 108282685, 3555330, 108348222, 2523164, 108413070, 108446527, 108576822, 108609548, 108625946, 48136223, 108642775, 3555368, 55033892, 108675609, - 901146, 3244064, 108741068, 108773388, 54657050, 108789867, 108823360, 3244865, 108987202, 2867202, 109035526, 2015253, 109052398, 109084682, 109101891, - 2129936, 109183033, 7045136, 109200196, 901130, 109264984, 109297693, 2752553, 109314074, 109330434, 109346857, 2752523, 109363205, 7602181, 109772809, - 109790022, 23101574, 22069277, 109822067, 60637318, 109839175, 5308701, 110084936, 99893269, 110183241, 73531394, 110231982, 110280720, 110297930, 110346660, - 110379024, 110395402, 110412619, 110478156, 110527309, 110575647, 110592029, 1769475, 110609230, 110674458, 3129356, 110707535, 1949727, 110740304, 110773073, - 110904146, 111001654, 111034384, 6946826, 111051603, 24838173, 111116354, 111149068, 47251494, 111166292, 111034370, 18153478, 111247391, 2408486, 111264597, - 4980752, 111313750, 111362474, 59310090, 111395671, 111427808, 44646441, 111460391, 111493721, 111525945, 111542303, 111558658, 111575061, 111591490, 111624208, - 24838154, 111640579, 111656963, 2719756, 111673642, 111706968, 111837193, 111853922, 111887025, 111919219, 34619527, 1212444, 111935516, 18890771, 111952729, - 111984649, 109789321, 112001882, 112033801, 36241545, 112051035, 112083004, 112164902, 112181275, 107757570, 112214054, 112231260, 112362333, 112394242, 5177380, - 112410626, 112427019, 2031647, 6717442, 59310120, 112443394, 3686422, 112459778, 31424534, 112476591, 112508930, 112525333, 112541762, 112575326, 55033894, - 112656450, 112689162, 112706011, 112738314, 112754690, 901158, 112771110, 112787458, 1769508, 112804703, 112869397, 112886624, 7733708, 112952161, 112984930, - 81756163, 113082370, 64765978, 113098754, 113116003, 901151, 113164813, 5799957, 112427027, 113213450, 113229855, 3309580, 112328730, 113247076, 113459266, - 55033894, 113492076, 113525605, 113639450, 1982493, 113656267, 113705048, 113737754, 6324240, 113754149, 4964392, 113771366, 2850873, 113950812, 113983598, - 45465628, 114016272, 114032651, 114049052, 3211696, 114065467, 114098188, 114114570, 114130950, 56639510, 114147330, 114163769, 114180108, 56262666, 44285954, - 114196539, 114229269, 114245654, 2196327, 51658773, 114262018, 114278456, 111607839, 114311174, 114327573, 114343941, 6324260, 114361192, 48545794, 110411842, - 114426145, 114459153, 114492265, 114557802, 114638870, 114655234, 62341146, 114671618, 27426826, 17448962, 114688501, 114720794, 114737178, 114753548, 114770434, - 3211895, 4980737, 114803563, 114967404, 115015779, 115048450, 115065709, 20365350, 115114862, 3211466, 115179541, 115196336, 115229098, 115261472, 115295087, - 2129960, 115344240, 2162716, 16236556, 115393393, 115442546, 2343028, 115474443, 49086476, 115490818, 115507203, 115523615, 109215746, 115540851, 115622772, - 115703839, 115721077, 115753846, 901141, 2130807, 115818517, 2850847, 115835011, 32817161, 115851318, 8389496, 115884058, 115900427, 115916802, 115933222, - 115949595, 115983225, 116162562, 1114141, 116179834, 116228137, 4980767, 116244704, 116277270, 110412423, 116293663, 116310032, 116326410, 116342815, 116359174, - 116375602, 116408351, 116424714, 116441090, 116458007, 2195488, 116490728, 116523050, 116539423, 116555786, 116572219, 116604994, 116638581, 116670486, 116686879, - 116703254, 4964354, 116720507, 116801839, 116834326, 54657040, 51822598, 116850717, 116867964, 116916226, 79101990, 116933501, 116965388, 116982654, 6406160, - 117014554, 108658704, 117031718, 117063682, 117080074, 117096450, 17809446, 117112892, 117195647, 117342702, 117375005, 117391362, 46530588, 117407775, 117424138, - 50659334, 117440514, 117456907, 117473755, 2130522, 117506102, 117538818, 117555229, 75579394, 117572448, 117638016, 117686575, 117719671, 117752283, 19447829, - 117784607, 117801845, 117833730, 47120394, 117851009, 3244509, 117998466, 118063146, 118079533, 110674458, 118113155, 46088214, 118195076, 118243349, 2342950, - 1114118, 118259715, 118276183, 1114122, 118326149, 118456358, 118472720, 2195558, 118489142, 118521862, 18153478, 118538250, 31424541, 118554634, 118571639, - 118603842, 118636556, 118652959, 3309574, 118669378, 27623566, 7258142, 1228810, 118702173, 118752134, 118784021, 118801287, 118850440, 48136232, 118899593, - 2195506, 118947894, 118981514, 119014283, 119079820, 119128973, 119210015, 119226378, 110411842, 119242762, 114294805, 119259146, 5750796, 119275522, 119291923, - 119308309, 119325582, 119390234, 119406621, 119423003, 119455968, 119488564, 119521311, 119537702, 4161576, 119554959, 4964383, 119767042, 118669349, 17449001, - 119783462, 119800111, 116178946, 119832664, 119865647, 119898122, 119915127, 2196368, 119948177, 119997330, 120046005, 120078377, 45039618, 120095635, 93962252, - 120143884, 1949718, 120160695, 120193383, 120226095, 120258570, 115523615, 120635395, 120651783, 2670621, 120669077, 120799263, 7733291, 120815682, 120848395, - 120865686, 120914839, 120963992, 118243366, 111624194, 121012226, 44466186, 121028623, 46530576, 121045013, 99893270, 121061416, 121077798, 1114131, 121094154, - 121110530, 116228106, 52215830, 121127833, 121258906, 19480713, 121323532, 116228107, 121339933, 2196303, 121357211, 121454658, 121487372, 121503770, 121520212, - 121552952, 121585751, 2195895, 121634827, 121651212, 54460437, 121667605, 121684892, 121733262, 121765909, 121783197, 121865118, 121896987, 121929766, 2670623, - 121946118, 121963423, 122110880, 2195595, 2195895, 122176417, 122224666, 122241456, 122274722, 122306581, 122322987, 122356643, 122404876, 122421258, 122437653, - 122454948, 122503206, 119357545, 122519583, 122535957, 122552350, 122585119, 122601501, 1769474, 122618159, 122651557, 122683403, 2031628, 115589122, 122699787, - 122716162, 122732565, 27246604, 122749862, 122847234, 47546397, 122864551, 122913199, 122945552, 122961949, 122978306, 122994709, 121585730, 123012008, 123043850, - 123060656, 123093929, 123142175, 123158962, 123191318, 123208327, 123257346, 123290538, 123372385, 118243370, 123404298, 2998747, 13074444, 123420693, 17842235, - 123437112, 123469845, 123487147, 123585438, 123617911, 123650086, 1212432, 123666458, 123682828, 123699211, 48611340, 123716524, 123781152, 123813919, 123830293, - 123847563, 123912258, 123944970, 45613098, 123961803, 124011437, 124092437, 124108840, 122667034, 124126126, 124157990, 124174338, 121569301, 124190759, 124224119, - 118243340, 6619190, 124257199, 124321813, 116621343, 124338192, 31424523, 124354572, 45711362, 124371377, 124403724, 2113558, 124421040, 124666259, 34701468, - 66600998, 124715062, 124748721, 124780565, 124796968, 1114122, 55132179, 124814258, 51019807, 124928947, 107462687, 124961716, 125027253, 125075485, 125091852, - 125108246, 49496100, 125124639, 125141002, 125157392, 55721999, 125173770, 125190210, 125222933, 125239322, 2408479, 125255718, 125273014, 125337622, 125354000, - 125370406, 125386783, 125403146, 125419532, 125435910, 125452309, 125468684, 52609050, 125485082, 125501442, 125517834, 125534214, 125452329, 116162572, 125550651, - 125583799, 2195540, 111247362, 125617079, 125764536, 125812988, 24838154, 125845516, 112427018, 4980772, 125862841, 126009355, 126025743, 4161552, 2113567, - 126042530, 46514178, 126074918, 2113548, 126092218, 126156857, 126173643, 126223291, 126287910, 24838156, 118243370, 126304754, 2195970, 126353424, 126369803, - 46219266, 126386777, 126418970, 126435350, 2752528, 126451778, 126485436, 126567357, 126648363, 126682046, 126730271, 122667027, 47611910, 17006594, 124796954, - 126746640, 2801721, 126763967, 126796736, 126926955, 126960577, 119358402, 127025154, 109215754, 127042499, 2130355, 127091147, 8389572, 127139856, 127156229, - 127172646, 127189004, 127205405, 127221802, 127238791, 127288261, 127336464, 2031652, 127353798, 2621449, 127435211, 16269449, 127483942, 127500290, 20365322, - 127517639, 127681088, 52215846, 127713316, 47546389, 127729683, 127746050, 50135082, 127762500, 125583381, 127812063, 127844358, 127860757, 127877151, 127893523, - 127909927, 118243366, 127942696, 127959343, 127992120, 128024586, 128040981, 128057403, 128090122, 47546387, 128106527, 4980793, 128123848, 128204806, 128221203, - 128237580, 128254466, 128286786, 119242783, 128319509, 128335931, 128368746, 128451529, 128516634, 128548880, 128565258, 128582064, 99893264, 128615370, 128712706, - 128729312, 128762331, 24838163, 128794636, 128811034, 128827411, 128843792, 1785871, 128860176, 121045007, 128876976, 4964371, 24838155, 128909328, 128926456, - 128958688, 1212447, 128991270, 128761887, 129008587, 129139660, 129221288, 47546397, 129253386, 129270733, 129335298, 129351709, 129368121, 129384460, 129400842, - 129417237, 32849960, 129433619, 129450010, 129466399, 2326543, 129483211, 119358414, 129532128, 129565647, 129613931, 129647568, 129679389, 129695775, 129712154, - 129728524, 47284243, 129744950, 30588937, 129777703, 129811409, 129859611, 129892469, 129925552, 129957947, 129990743, 130040786, 130203674, 1982495, 130220098, - 130252810, 130269186, 130285589, 2195515, 130302931, 130334741, 884867, 130351144, 130367498, 130383891, 130400277, 130416680, 130433050, 78102594, 130449410, - 130466772, 130531350, 6193162, 130547771, 130580496, 6324250, 130596955, 125321237, 131006473, 131022985, 131039366, 81838195, 131056598, 2162710, 131334210, - 131367895, 131416076, 131432474, 1982485, 131449816, 131612681, 24969353, 131630041, 47611925, 131694613, 131711003, 131744059, 131777383, 8389594, 131810267, - 131875804, 72368134, 131908573, 2195888, 44302346, 132005904, 2129925, 8389598, 132022293, 132039581, 132121111, 132154335, 132203488, 2932788, 46530581, - 132252116, 2360289, 132285410, 132449251, 132498404, 10829853, 132579433, 132613093, 132711398, 132744060, 1114154, 132792362, 2850837, 132809172, 132841488, - 132857867, 1769500, 132874271, 132891509, 127893514, 132923404, 110232090, 4571138, 132939788, 132956166, 132972550, 132989387, 8389607, 133038099, 133055464, - 27623859, 133104617, 133284143, 1114148, 133317610, 133497777, 130285597, 133529681, 112427020, 133563371, 2162691, 2195515, 133627947, 133660694, 19267615, - 133678060, 108167180, 133742604, 48627738, 133759981, 133841729, 118145045, 133874670, 133955586, 133971994, 133988371, 134004767, 134021130, 62341136, 134037535, - 99893274, 52723750, 134053928, 124190722, 134071279, 134135824, 134152230, 134168608, 125583366, 134201346, 2506778, 82001932, 134218736, 134266891, 134283279, - 134299669, 901125, 134316910, 113115147, 134382009, 134430786, 134463556, 134513271, 47923237, 134546417, 134791199, 11059229, 126369820, 7389221, 134807554, - 134823942, 134841330, 2195669, 901160, 134905868, 134923251, 134938630, 134955048, 134971421, 134987797, 135004191, 6127642, 135021556, 135069780, 135102502, - 2162729, 2719760, 135118864, 135135242, 135151645, 135168002, 135184403, 24838181, 5308848, 3686402, 135201781, 135267318, 135299084, 135315466, 119358071, - 135332290, 135364629, 135381023, 135397433, 135413819, 135446604, 135479306, 135496695, 135561242, 135577610, 135594029, 135627768, 135709352, 135741459, 135757826, - 135774229, 135790679, 135840609, 93978643, 135872533, 135889913, 2195978, 135970882, 55377946, 136004055, 109166598, 110182835, 136036889, 2196389, 136102906, - 132661258, 136152059, 2195927, 136250364, 136332285, 136397369, 136429683, 136446089, 136462473, 9109641, 136478726, 136495125, 136511518, 116850714, 136544258, - 136561271, 136593495, 136643552, 136692171, 136741886, 136790054, 2196418, 8700927, 136806406, 136822815, 136840192, 136872160, 136905163, 118243357, 136953866, - 136970271, 136986848, 137019414, 122044428, 137035835, 137069569, 2195554, 137118722, 137249795, 137297926, 137314323, 137330700, 134479882, 2834867, 137347094, - 137364380, 117506102, 137412610, 131629087, 137429295, 20365318, 137461781, 137479036, 137527607, 137577476, 137642519, 137675781, 137757209, 51495363, 137822218, - 137838638, 137887782, 137904603, 27852810, 137936922, 2801706, 137954310, 138036231, 138101768, 136118331, 2408463, 138199071, 1982483, 138215434, 6374409, - 138232842, 138281995, 3211296, 138346522, 138363786, 138395674, 6455308, 138413068, 87539741, 138478605, 138544142, 138608666, 138626063, 123797525, 45531152, - 138674178, 73646109, 138691600, 34422914, 138788873, 69156996, 138806193, 138839057, 138887234, 138920978, 138985474, 139001898, 139018252, 139035667, 139084820, - 139132949, 139149388, 139182304, 128581663, 139214874, 139231319, 139281429, 139330582, 3473883, 139379147, 129826842, 139428315, 139460614, 126189634, 139478039, - 139526681, 139592635, 139657242, 115196952, 139674649, 139722754, 139740186, 139788347, 139821137, 139853836, 139870246, 17088643, 139887018, 139919382, 139935746, - 139952156, 139968514, 139984933, 2113572, 140002331, 140230678, 45907979, 140247519, 140279895, 140329102, 5325271, 140362030, 27607080, 140394584, 140428316, - 140461085, 140510117, 120668198, 140542018, 38125871, 140575774, 140607564, 140641311, 123797525, 140787796, 140820769, 140854304, 141001007, 128991253, 141033570, - 141066256, 47546379, 141082634, 141099010, 141115403, 141131807, 141148179, 141164583, 141197614, 141230111, 141246474, 1900556, 141262860, 141280289, 121077791, - 141312002, 141328424, 141344789, 141361183, 141378594, 141410343, 141443110, 141459458, 47546378, 141476899, 141541407, 107757589, 141557762, 141574775, 141606943, - 2408450, 141623338, 141639711, 141656074, 43237392, 141673508, 141770774, 141788197, 141836290, 3162131, 141852703, 126877707, 99893286, 141869068, 51593245, - 141885462, 141901836, 141115413, 141919270, 141983756, 142001173, 142050343, 142114875, 4341786, 142147821, 120258598, 142180362, 1949724, 142196738, 142213157, - 142229515, 142245919, 142262403, 9207817, 142279720, 142574633, 128106498, 142639106, 142655927, 142688287, 77709324, 142704756, 27705366, 142722090, 142820395, - 50937858, 142868506, 140247092, 142885932, 142934037, 142951307, 143016928, 143065098, 143081511, 124239893, 143114272, 102793242, 143148077, 143228930, 143245369, - 93978655, 122961951, 143261762, 143294688, 143327243, 143344523, 143410065, 143458323, 143475686, 119324738, 143507468, 114786314, 143524600, 143557068, 143590283, - 121864220, 143654918, 122667029, 143671726, 143720467, 127713282, 143736842, 143753237, 2195522, 143769622, 143785986, 143802378, 143819227, 87048198, 143852282, - 143884329, 143900677, 84967445, 143918126, 143982623, 143998992, 144015370, 144031746, 144048157, 24838160, 144064596, 144098351, 144146460, 2752569, 144163888, - 1114118, 144244748, 144262035, 144310284, 144326666, 144343061, 144359455, 144375824, 31424522, 112427010, 144392214, 144408592, 5832744, 144426033, 2031647, - 144507954, 144588802, 144606259, 27852810, 144655412, 144736258, 144753717, 72499223, 144802870, 144900102, 126369823, 57032716, 130269215, 144916506, 144932880, - 5718031, 144950327, 1769483, 144982319, 113115162, 145015864, 145080427, 145113103, 145129488, 145145862, 5177365, 145163321, 145293352, 55754778, 145309734, - 134299664, 145326082, 145342546, 111607824, 145376311, 145408084, 145441262, 6946822, 145473620, 145506330, 24838173, 145522698, 145539100, 145555494, 145571842, - 6193181, 145588984, 145621008, 145637386, 145653797, 145670146, 145686554, 145702914, 145719318, 145735711, 6701062, 146063495, 59375750, 146080827, 146260034, - 43384834, 146292746, 3228043, 146309179, 2195891, 146341899, 146358282, 109215760, 146374710, 10764345, 146408508, 146489363, 1785896, 52215810, 146505952, - 19038239, 146539581, 146604078, 146653615, 7389222, 146686793, 114393124, 113180710, 45039622, 146735106, 146751504, 146767903, 2162726, 146784715, 131629062, - 146834494, 4571148, 146981951, 147063702, 24838146, 147113024, 147210464, 147243062, 147275807, 147292198, 99893250, 147309633, 147390563, 3473413, 147423244, - 2195851, 147439853, 147472395, 147488780, 147505178, 119242754, 147521557, 147537951, 147554314, 147570690, 115654677, 147588162, 147652665, 147668994, 147685397, - 135790658, 147701823, 147734534, 147751759, 147784565, 147816460, 147833886, 79790092, 147865602, 3228739, 147883076, 148013515, 3227862, 148063301, 148111376, - 44285992, 148127969, 148160533, 148176983, 54296602, 148226507, 148275260, 148358214, 121339942, 148455903, 148488198, 30392323, 148504592, 47939605, 148521059, - 148554216, 148586527, 148602899, 148619739, 148653127, 148735048, 111149087, 148816784, 148849737, 148881429, 148897804, 50987034, 148914260, 148948042, 148979734, - 148996112, 116228124, 149012501, 149029294, 149078026, 149095499, 146767910, 149160018, 111280130, 149193241, 149259340, 149324877, 118292482, 149390414, 149471260, - 149487654, 149504012, 55869450, 149520405, 8389145, 149537871, 149635112, 149651462, 149667871, 55869450, 149684461, 130285606, 149717030, 149733397, 149749800, - 149766170, 149782987, 149831718, 149848091, 93978630, 59310086, 149880844, 50937866, 149897439, 149930287, 149963856, 150028304, 150044698, 150061068, 150077446, - 3850261, 150093840, 150110219, 2998704, 6701078, 150126594, 150143002, 17809410, 150160465, 150324306, 150389166, 150437907, 150454274, 150470694, 150487071, - 150503436, 7372810, 150519854, 150569427, 150619219, 150684756, 2195555, 19267610, 150732846, 150782382, 150832213, 4980778, 6373406, 150864982, 150914135, - 19447820, 2195931, 150962465, 150995399, 151044101, 151060492, 151076870, 151093269, 108298278, 151109642, 8388654, 151127128, 151175184, 1212442, 151192665, - 151487578, 5309531, 151634807, 151666698, 148636495, 151684188, 118882826, 151732234, 2195508, 151748644, 151764997, 19447836, 151781855, 151814166, 151830550, - 107429910, 151848028, 63816157, 151896101, 151912564, 28147741, 151929949, 152126558, 152174604, 4341779, 152192095, 52592652, 152256543, 7045132, 64765964, - 2129922, 152272936, 2998303, 152289301, 152305694, 152338437, 152354818, 116228134, 152371246, 152421472, 152487009, 152552388, 152600588, 2015348, 152616962, - 6701098, 2834903, 152633376, 152667234, 152715276, 5866232, 152732771, 152814596, 2195566, 152879114, 152896612, 152962149, 153010192, 153026598, 23855221, - 153042965, 153059344, 77709338, 153076015, 153108783, 153141254, 47923202, 153158758, 44351490, 153223222, 153257063, 153633896, 2359307, 153699433, 153747522, - 5177382, 153781354, 153862154, 2195689, 153878596, 153928811, 146767888, 153961580, 154043304, 154076269, 154109038, 4980741, 25560175, 154190338, 154222594, - 154238986, 9158799, 154256496, 154371185, 154453106, 154502259, 154567796, 153878839, 154697740, 154714118, 118243334, 154731637, 154895478, 154943504, 107462696, - 3866690, 6602778, 153191454, 154961015, 155010168, 114393126, 155041804, 155058202, 155074566, 126042127, 155092089, 116228102, 155403386, 155467839, 155500570, - 155516938, 2196313, 155533355, 7389221, 155567160, 155631675, 2326569, 24838149, 155664526, 155697999, 155729932, 155746320, 155762698, 155779103, 67059714, - 3212411, 155796604, 2408450, 155845757, 155926540, 145506342, 155943721, 155975699, 20365324, 141066242, 155992123, 156024842, 156041258, 2834656, 156057616, - 156074010, 115523613, 156090798, 156140670, 122683413, 156188684, 25559139, 156205102, 117900415, 125239324, 156255360, 156303362, 139478127, 156320044, 156353665, - 156435279, 24838159, 156467259, 156500110, 156532802, 156565949, 156599426, 4342893, 156663892, 156697731, 156746488, 156778517, 156794902, 156811696, 156845188, - 156943493, 156991509, 58802188, 157007874, 125796378, 13074472, 157025414, 1769487, 157106198, 157122626, 157155394, 131334251, 157188128, 1114114, 157221389, - 2523141, 157271175, 157435016, 5308904, 8994839, 157564968, 157581343, 157597753, 157614109, 11010057, 150536292, 157630474, 157646860, 2752548, 157663291, - 2196510, 157696116, 157712424, 157728790, 157745193, 157761538, 19447836, 157779081, 157827101, 7602187, 157844618, 158138500, 158154901, 31096962, 158188683, - 158416908, 158433291, 158449695, 8389772, 158466086, 7962655, 158482463, 150585451, 158499981, 149128334, 158548462, 158581039, 158613510, 72368168, 158629890, - 158646282, 45465603, 158663345, 158695450, 111460655, 158712975, 124796944, 4980774, 158844048, 158925400, 158958737, 159072693, 159105034, 145145858, 159121410, - 159137813, 128106512, 159155346, 159350810, 159367180, 159383583, 5177350, 159400239, 159432732, 46530562, 159449170, 159481858, 2196627, 159499412, 151520405, - 7307276, 159564950, 41582604, 159645708, 2850857, 159662096, 112787472, 4980746, 142245890, 25559124, 159678548, 45875206, 159711691, 159760413, 2113567, - 3686426, 159776778, 48545804, 159793211, 2195977, 159825922, 5079800, 159843479, 159891993, 159957412, 159989816, 47939615, 160023704, 160122009, 160170403, - 160202781, 160219174, 160235522, 160251910, 160268317, 160284674, 160301093, 160317556, 160333842, 60113026, 160350219, 6946847, 160367439, 160399414, 160432138, - 160448554, 160464908, 160481286, 160497676, 160514086, 160530470, 160546822, 160563219, 160579606, 155631618, 160597146, 160677900, 47939620, 160694274, 160710698, - 160727042, 4980741, 160743426, 160759834, 10829855, 2146363, 161236124, 31375497, 161284227, 134299783, 161300482, 2031658, 161318045, 161644546, 161662110, - 142245890, 161726485, 108707852, 161743521, 161793183, 1982474, 161825633, 161858720, 127680543, 161923112, 161939468, 161955878, 161972283, 2719754, 162004994, - 6455299, 162022561, 162152458, 162169263, 162202783, 5325314, 162235554, 125583398, 162299967, 162332688, 116162586, 162350243, 51658754, 162546852, 7733551, - 162611425, 162644008, 29900803, 162661541, 144621584, 8389798, 162710396, 162759127, 162792615, 110723074, 162840578, 116375766, 162857044, 162890920, 162938979, - 162972162, 17006621, 163004458, 163020815, 125796354, 152945099, 163038367, 47546389, 5309609, 163071146, 163202219, 163333292, 163381250, 163397661, 163414028, - 1114228, 163431597, 3212176, 125812738, 163529902, 163595439, 163627010, 163643823, 163676252, 163708944, 111198214, 163726512, 163856386, 2408474, 19447839, - 163873969, 4407599, 164020240, 59310101, 2195914, 164037810, 901129, 7733462, 164200458, 8389067, 2195670, 157155382, 164218035, 164364300, 164380682, - 125927430, 164397128, 3309574, 164462630, 164478988, 5947433, 5324876, 164495386, 164512948, 19447824, 164561433, 164626866, 164659729, 164692451, 164725623, - 164757588, 107462696, 164791477, 2130395, 164888616, 164904972, 164921370, 164937729, 1769512, 164955318, 165070007, 6373464, 165199893, 165216315, 19267683, - 49790992, 165249054, 165281891, 165314572, 165330955, 165347760, 165380530, 165414072, 165478431, 165494786, 7389213, 165512377, 27624000, 165658640, 165675046, - 165691867, 165724594, 165756956, 50249754, 165774522, 3850280, 165807291, 165855298, 165889212, 166053053, 5308558, 166215696, 116162570, 166232080, 154894362, - 166249662, 166346795, 115523610, 107462682, 129237028, 6455318, 166380735, 166543386, 3375120, 166559803, 166592983, 166626496, 166674442, 166691350, 51282347, - 166724801, 166805530, 166821890, 166838282, 48513053, 2719746, 166854677, 166871052, 165134362, 166887511, 166937794, 1769514, 166986947, 167051722, 167085252, - 1769478, 167445701, 167494854, 5308482, 167560391, 10829864, 4981960, 167624788, 167657482, 167673885, 167690266, 167707161, 167773385, 167821771, 167870474, - 167886877, 167904458, 167952468, 167985229, 46514207, 168018838, 19267641, 168067084, 167985209, 168083458, 168101067, 168133836, 168181791, 2196058, 168199373, - 168313045, 168345858, 10944535, 147243092, 42418182, 168379598, 168427744, 168461519, 168527056, 168641502, 6373518, 168690123, 168738826, 168755229, 168771610, - 168788398, 2147497, 2162698, 2195540, 168837614, 168231371, 168869909, 120979487, 168887505, 45023263, 168951839, 137102546, 168969427, 169280724, 169346261, - 169443465, 33620102, 169460950, 8602839, 8602840, 8602841, 169526490, 169623701, 33620083, 169657563, 169705766, 8389846, 169755868, 24838175, 169821343, - 169854173, 169902106, 169919710, 169967654, 117751810, 169984060, 170067113, 170099935, 2506768, 170148785, 170181836, 170231008, 8389857, 37437589, 170311695, - 170328080, 170344488, 46088230, 170360834, 170377226, 170393629, 27623454, 56131586, 170409986, 170426378, 170442781, 150913050, 170460386, 170591459, 170672369, - 170705025, 170737680, 170754059, 1982476, 170770514, 170803246, 170852404, 170885338, 170917995, 170951568, 170983511, 171032588, 171050212, 171099365, 2850822, - 171181286, 171279591, 115720504, 171328744, 171409434, 171425794, 171443433, 171491347, 55263234, 171507743, 1900570, 171525041, 171556923, 171589634, 81166347, - 171606046, 116375659, 1901004, 171640042, 171720705, 171737128, 171753503, 2131113, 171769922, 171802645, 171819030, 171835403, 42598875, 171851842, 171884570, - 171900934, 47923240, 171917767, 171967723, 2015261, 172016034, 13549579, 172048390, 172064774, 48513036, 172082412, 172459245, 19252462, 172524423, 172573209, - 172639471, 15073283, 172672240, 172769336, 172802080, 172836081, 20365314, 5177372, 172901618, 172967155, 173016308, 173080658, 173113832, 47939596, 173147381, - 173228792, 155631628, 173260831, 173277226, 173293590, 173309973, 173327606, 7356473, 173342749, 173359106, 19447834, 173375542, 173408266, 173424661, 173441108, - 119357877, 173475063, 173555925, 173588738, 173621378, 8389880, 173637655, 173654165, 8389881, 173688058, 173719608, 5309303, 173753595, 173801512, 173818703, - 173850639, 4980751, 173867020, 19252112, 173884668, 174015741, 174047238, 1900581, 174064075, 20365322, 162857019, 174112852, 116228134, 174146061, 174194747, - 79101981, 174227468, 3473419, 174245118, 174359703, 174408527, 174440458, 174456898, 145506335, 174489659, 174522409, 22478869, 174538854, 46350443, 6701058, - 174571562, 174587920, 13549606, 174605342, 174637058, 174653461, 135807007, 175015168, 175080705, 175146242, 175357954, 107447105, 175375619, 175439874, 175456293, - 6701084, 175472724, 175506692, 175571032, 5603364, 175603766, 45023248, 119357743, 175637765, 3227678, 7389194, 175702047, 175718883, 137379861, 175751184, - 175768566, 175801546, 175849484, 15351837, 175867142, 176047367, 176144440, 176177591, 176209979, 115179530, 176243881, 176275466, 139477623, 176291932, 176325040, - 176357809, 176390204, 176472085, 176488469, 2195759, 176504851, 2162707, 176522129, 176570452, 27246602, 176604424, 176734270, 176784649, 176816174, 176866570, - 176899339, 176997270, 177046796, 177094659, 1114115, 177111987, 2637840, 177144111, 1114133, 177177869, 31490050, 177259033, 177325326, 1933352, 177390863, - 49774604, 68583426, 177440016, 177586186, 177603857, 8389906, 177651796, 177684501, 177700880, 24838170, 177718547, 177767700, 177816439, 177848332, 147554330, - 177864764, 177946634, 177963037, 103284767, 177979829, 178012166, 178028575, 178044947, 56508536, 178061388, 178095381, 178291990, 178339862, 141459472, 178356513, - 134037544, 178389042, 178422667, 178488599, 178537752, 178602071, 178652441, 178782234, 178798608, 135184400, 133382166, 178814991, 901135, 178831663, 178864212, - 178896978, 3227704, 178929676, 178946058, 178962438, 2113573, 178979915, 179044411, 2196683, 179078426, 111607839, 179159071, 179175467, 179208276, 179241058, - 179275035, 179373340, 179504413, 118882363, 179651870, 179699734, 179716112, 2179112, 179733791, 179781651, 2195951, 108707842, 179799328, 179863773, 179897633, - 180028706, 170442754, 180077003, 131334746, 49905685, 3260475, 180126147, 2670614, 180158548, 6946826, 5325854, 180192547, 180273168, 179765305, 145506306, - 180290852, 180338690, 174424121, 180356296, 180387856, 180404264, 47546374, 180420620, 180436994, 115785757, 180454693, 3227872, 180520230, 180764729, 46530572, - 180781140, 121028619, 158253095, 180815143, 180929404, 180977676, 116228115, 5308705, 4980757, 180995368, 127713301, 181043206, 99893279, 181060905, 181142793, - 181174575, 181208362, 181257515, 181322282, 181338141, 181354508, 181371434, 181387286, 181403650, 181420072, 181436437, 181452812, 181469738, 181485583, 181501978, - 181518352, 119259193, 181535257, 181601580, 2195786, 181862973, 181895283, 181911684, 181928066, 181944329, 32637062, 181960734, 181993493, 182010776, 182059455, - 127909890, 182091816, 50872331, 182108262, 182140940, 4980778, 182157324, 4964373, 2261023, 182174749, 182222858, 182239238, 110133780, 182256458, 182305708, - 182370344, 182386754, 4964358, 182420781, 46530591, 182469145, 182535470, 44646441, 182584623, 182632470, 27607061, 182650160, 182846769, 47317021, 182912286, - 3850266, 182960182, 47415327, 182994123, 2195882, 183025693, 183042164, 183058473, 44171286, 183076146, 176734210, 183125299, 17220609, 183174452, 183403829, - 183566390, 45023242, 183599130, 180977666, 2196470, 183615918, 183664666, 183681067, 183715126, 183762975, 128090124, 183779359, 183795817, 7634960, 183829815, - 183944504, 184025613, 2113574, 184074256, 5177385, 184090655, 184107034, 55722003, 184124729, 114294805, 131334564, 7144289, 178880514, 184238082, 184255078, - 184287234, 184303654, 184320016, 11157520, 184336471, 184386874, 184435680, 122486843, 184483900, 184567099, 48676870, 184598831, 47088087, 184632636, 184680511, - 184713222, 1933318, 184730941, 184860698, 2195888, 184877581, 184926246, 124796930, 184942632, 184959005, 184975426, 185008431, 185041003, 185074424, 185107774, - 185237516, 185253926, 185270310, 2196303, 45711372, 185286740, 185319450, 2195522, 118882363, 884738, 185337151, 185401354, 185419072, 6455318, 15351850, - 185450527, 185466886, 185483314, 185517377, 185532438, 50266152, 185581570, 6897696, 1818626, 7389215, 185599298, 185729050, 185745467, 185778479, 185810970, - 20365341, 185827412, 185861443, 154943490, 185942026, 185958855, 186007568, 186023952, 186040341, 73531413, 186057159, 55033885, 186105962, 186189124, 186270155, - 186319296, 1114141, 186417994, 125583402, 186467653, 186597414, 27623727, 186615110, 124863663, 3244944, 186729799, 8389960, 170803259, 186826778, 170803660, - 186844489, 186893642, 115785757, 186959179, 187072983, 187106636, 187204941, 150569443, 6947931, 182960140, 187269162, 187285506, 22216730, 3309609, 187678742, - 187695241, 187711618, 187727901, 187744274, 2621450, 10993799, 187761999, 188055579, 188088811, 188121625, 188186861, 188219398, 188236355, 188268565, 188284969, - 47317011, 19252560, 188301913, 188335441, 188432415, 184926229, 188448770, 188465163, 188481538, 188497941, 148176962, 188515666, 188662063, 188695891, 188761428, - 188825681, 126599178, 188859733, 189007190, 189054997, 8389975, 59310082, 50937877, 189071376, 4980742, 189088680, 189120550, 25559124, 189136898, 2621461, - 901157, 189153318, 189169702, 189186079, 189202871, 189235202, 189251603, 122601484, 189268973, 189349948, 189431861, 189464578, 7307270, 189480986, 189498712, - 159481862, 150241311, 189546526, 129876050, 189579295, 49938438, 189596185, 110674885, 189662553, 189693994, 5342554, 189710346, 189728091, 189825058, 189941084, - 190038022, 190054402, 190070813, 190087184, 190103578, 190120411, 33112086, 190154077, 6701093, 190203230, 47611930, 190366658, 190399839, 190513164, 190529543, - 190545941, 128581658, 190562344, 190579535, 154714152, 190611487, 190627856, 190645057, 190676994, 143441958, 190693388, 180944995, 190711136, 3212297, 190775383, - 190825825, 190874978, 190939223, 190989667, 191053855, 2359298, 191071588, 2523158, 191135746, 191152184, 126287891, 132580697, 191184918, 123207746, 191201289, - 191217687, 9519113, 191234094, 191284581, 191546654, 2195510, 2195563, 191594512, 116015130, 130859023, 191612262, 2261002, 191677799, 112476186, 125796383, - 191743336, 191857669, 191938571, 57032726, 191954960, 58769429, 191972480, 192021865, 192120170, 192217160, 192284011, 192365932, 192463760, 142950459, 128843802, - 192496076, 120979487, 1212428, 192529773, 66928656, 192578926, 192626728, 192643103, 192659883, 192693615, 2998308, 192759152, 119570472, 192807644, 192839739, - 192872474, 127795503, 192888858, 192905222, 192921621, 192938012, 108167208, 192955761, 2408476, 193152370, 136740892, 1769482, 193233821, 5309811, 2195931, - 193316040, 128843807, 110134644, 193347668, 193381749, 8390006, 182288475, 193447287, 2015260, 193529208, 193593363, 2523172, 193610648, 193660281, 193709434, - 193790036, 113115165, 193824123, 193888284, 19267606, 2621459, 111214649, 49496066, 193904943, 2179103, 193937468, 194019435, 194053330, 194084890, 2113547, - 194102474, 99893258, 194150402, 194166805, 8389038, 194183178, 194200956, 194266493, 128172042, 194315339, 194379782, 194396648, 27344898, 194428944, 194445943, - 194478092, 194494474, 194510869, 126599180, 194527298, 194561406, 131334635, 194757608, 4980764, 46514182, 194807167, 2326534, 194889088, 131432479, 195052929, - 195102082, 118292511, 195166685, 8388695, 128581654, 195199007, 192479235, 195216682, 116850709, 195264564, 884776, 195298691, 195446148, 170999892, 195511685, - 195559476, 195593606, 195657749, 195674114, 195690507, 141459487, 195707884, 195772447, 195788884, 195821584, 195838061, 195872135, 195903500, 195919874, 118685717, - 195936286, 27852802, 195969043, 195985439, 46120998, 196002710, 120602665, 196051013, 196084144, 196116913, 119997330, 129237032, 196149270, 3129375, 196165740, - 196198459, 196231189, 196247618, 196280423, 196363656, 196396219, 180600871, 196445577, 196575291, 196608012, 5866526, 196625438, 137052172, 196657236, 196691338, - 196756875, 5799993, 196804637, 196820994, 20365323, 110411860, 196837468, 1933317, 196871564, 93978636, 196952586, 137379846, 196984919, 197034043, 112608341, - 197068173, 146456605, 197182862, 197247007, 197263389, 126599184, 1900565, 197279765, 197296210, 197328912, 197345295, 2801686, 128843817, 197804169, 197820531, - 197836934, 197853319, 197869698, 197885961, 197902467, 197918722, 17432586, 197936528, 198231441, 198295567, 198311957, 149815327, 198328358, 1769510, 198346130, - 198426650, 198443037, 189202463, 198459418, 198475792, 198492170, 198508575, 198524934, 198541362, 198575492, 116228117, 2850828, 198641043, 198721562, 1114149, - 7307302, 198737936, 198754404, 198788500, 198852624, 2801692, 198869013, 198885398, 198901772, 198918368, 198950943, 194691506, 198968725, 199016464, 199032838, - 199049237, 7307280, 128892930, 199066513, 199115182, 45908006, 199163914, 33390839, 199181718, 42434579, 2539560, 199327756, 199344134, 199360543, 116376154, - 199376980, 199409706, 199427479, 199508049, 199542168, 199590888, 8389522, 7143895, 199639106, 124272706, 199673241, 133660698, 199737370, 199753743, 128974870, - 199771546, 199868641, 199902377, 29622287, 199933974, 199951375, 199999526, 200015874, 200033249, 200066459, 200130582, 200148380, 200196530, 200228914, 200262503, - 200295837, 200344990, 149569538, 200376404, 200409522, 168722463, 200442288, 200476063, 7389213, 200556903, 126599184, 200590587, 62341132, 200638564, 200672150, - 171000679, 200720396, 200736825, 46514207, 200753584, 200786354, 200818830, 2326636, 200851458, 4964374, 200867842, 1966106, 200885664, 201032725, 1918152, - 201080937, 201115041, 933890, 201162773, 201179228, 201213257, 201261143, 5308498, 201311650, 201360377, 201441763, 201475491, 201555978, 122503189, 201572390, - 3850242, 201589929, 126763609, 201622264, 201655716, 201835941, 201933332, 201982386, 202014751, 125812738, 202031106, 202047498, 2719756, 202063884, 49496090, - 202081702, 202163623, 2261034, 202309648, 3309606, 202326082, 202360232, 202440714, 202458537, 202490703, 202522645, 127795266, 202539038, 202573226, 8390059, - 202687916, 202768687, 202802605, 115523610, 202851758, 202999215, 203080171, 203112494, 2196368, 203162280, 2342918, 203195824, 203425201, 8389011, 203572658, - 2129986, 203638195, 203703732, 203752885, 51871760, 203818422, 203867575, 204064184, 8388876, 204144642, 52625427, 204162489, 204210434, 204244410, 2195947, - 204374022, 5177350, 5325759, 204391627, 204424635, 204571586, 171835402, 128581642, 204603404, 204619781, 103743519, 204636219, 204668957, 27852802, 204685343, - 204702682, 17448976, 204751377, 204783632, 204800042, 17006634, 204817852, 204866448, 204898341, 204914719, 204931084, 2801669, 204947468, 204963956, 204980657, - 131760131, 131891205, 205014461, 27623508, 205063614, 24281227, 2342928, 19464221, 205193292, 47611942, 205227455, 205424064, 205471760, 135397397, 205489601, - 205521743, 2196058, 205555138, 205602818, 205619210, 44531718, 205636184, 205668364, 205684960, 205717535, 205733972, 205766694, 205783056, 150110250, 205800899, - 133709852, 205848602, 205865392, 128892934, 77250562, 205897759, 205915075, 185810982, 5309892, 205964741, 206210452, 3178498, 118030420, 206276038, 206325191, - 206667925, 206702024, 206799251, 206848149, 206880901, 20299908, 164036739, 206913595, 206947785, 207012143, 27852819, 2932835, 207046090, 207192129, 8389145, - 27852840, 207241262, 59310101, 207291851, 207488055, 180602316, 118883789, 207520178, 207553998, 207650875, 151715871, 207685071, 8389461, 207782996, 207831800, - 207865296, 207962142, 194510858, 207994882, 208012411, 208044098, 208076838, 208093186, 2670598, 208109583, 208125964, 128892954, 208142348, 208158730, 17006598, - 208175164, 208258513, 208307666, 208453662, 208486402, 65896458, 208503655, 2342924, 208537043, 208585007, 148602890, 208618384, 208651732, 208700885, 208830495, - 121077779, 208848342, 208896021, 46530600, 208912422, 45498380, 208930121, 208979415, 209043477, 152305806, 209061208, 209109924, 122683414, 209158228, 209190994, - 209224703, 209272863, 209289517, 152354832, 184926239, 209323480, 184713256, 209420310, 113229840, 3588856, 209437132, 209469466, 209486671, 113229864, 209520089, - 209748459, 49791007, 209780796, 209864154, 209946075, 8175639, 46219270, 199492441, 210026527, 210042882, 1785875, 210059286, 115294210, 210075703, 210141200, - 128991242, 172835211, 210157574, 128958514, 210174051, 210206735, 1785878, 210224604, 183975938, 210273310, 2359308, 29261862, 210305067, 210337821, 29902301, - 210355678, 210469167, 210501642, 210518018, 132857858, 204537867, 210534421, 210550810, 210567184, 210583567, 42598832, 210601240, 210665532, 210747485, 210796603, - 210830427, 210862118, 210878767, 210911709, 210945503, 211058714, 211075074, 211091498, 211107880, 7307283, 211124331, 110249440, 211157051, 2195680, 211189825, - 17809423, 29769759, 211240417, 211355106, 211551715, 36241545, 211615911, 8603108, 8603109, 211665602, 211714197, 211747924, 211796945, 133414950, 211845163, - 211878795, 2195508, 130285574, 211943426, 211961063, 133414943, 155795485, 212009197, 169787430, 45023258, 212043238, 212090891, 124862927, 212108775, 5505062, - 212256232, 212304871, 27852806, 212353026, 212369434, 27852831, 133677084, 154797545, 212385813, 24297531, 212402635, 212452842, 212600299, 212631574, 212664351, - 212680706, 141295642, 212698604, 212795423, 135741478, 212811788, 212828186, 212844550, 212860930, 115179546, 212877314, 45465626, 212895213, 212959535, 189251603, - 212992010, 139460627, 213009291, 123371530, 213075438, 213188646, 213206360, 31424515, 213255663, 213320127, 122667039, 116703263, 30392342, 4161552, 213353968, - 213598274, 213630986, 119226389, 213647426, 2359730, 213680431, 213712934, 213730716, 213778864, 19267595, 213811211, 213828927, 213893160, 118243334, 213909526, - 146653196, 213926315, 213958663, 205520927, 200556566, 213975062, 213991436, 20365338, 214009329, 2621478, 214040616, 186040332, 214056972, 214073360, 133611523, - 214091250, 214286429, 2195759, 214335630, 214368275, 48676886, 214385240, 214418931, 4571176, 214450284, 214483044, 214516167, 214564951, 2130205, 214615209, - 214646805, 214663180, 214679594, 2162728, 5325275, 214697460, 214746613, 45711400, 214794252, 214810650, 214827915, 215156215, 215269392, 215285770, 215302175, - 215319440, 4980772, 215352186, 215400919, 215433218, 215449626, 215466015, 215482425, 2195693, 215499671, 215547925, 215564319, 19267603, 6422559, 191053827, - 215582200, 215745474, 215777318, 10829862, 215794143, 120094749, 215826434, 51068939, 215843118, 47546383, 215875596, 5292061, 215893347, 215957506, 8390121, - 180764712, 215974735, 216006672, 118243354, 216023082, 193134618, 216040953, 216122874, 216203739, 7734537, 160760247, 216237563, 216285220, 216301570, 67043338, - 216317968, 216334378, 216351152, 216384418, 216417788, 216450557, 216596564, 216630241, 216662031, 216679247, 216712702, 216776716, 2801674, 216793104, 165330986, - 216809488, 197328922, 216825872, 216842255, 216858646, 216875440, 216909311, 217219103, 217235482, 217251859, 160579610, 217268761, 217333779, 217350165, 217366540, - 5292058, 141000720, 115179549, 217384448, 55443466, 217497692, 217530406, 217546783, 217563146, 137854988, 217579535, 217595906, 217612309, 217628759, 217677911, - 5718042, 217727078, 217759746, 46219283, 217776147, 217792549, 217808901, 2719775, 217825328, 217874474, 217890856, 93945894, 217907211, 217923624, 152272906, - 217940025, 217956392, 217972774, 93945862, 217989139, 165134374, 218005558, 218038287, 218054682, 218071052, 217972742, 6455317, 218088961, 218152966, 152272915, - 218169356, 110592012, 218185738, 3473450, 218202789, 218267658, 218284945, 218333250, 195592198, 218366888, 218398766, 2129959, 218448302, 218497132, 217366530, - 218529811, 218546202, 218562576, 5292060, 218579028, 218611738, 149094412, 218628149, 218662402, 218742806, 140607564, 218759180, 6946837, 116228136, 218775583, - 93945885, 218793475, 218873960, 218923010, 218939430, 47120422, 208994783, 218957316, 118652959, 219004964, 219021331, 217301014, 219037736, 219054539, 219103314, - 219136432, 219168827, 219201592, 219234316, 219250709, 219267098, 219283472, 219299897, 3457055, 219317765, 219416070, 219463711, 219480085, 219496479, 126763442, - 219512834, 219529273, 3850252, 219545628, 219561995, 219578370, 49774618, 219594763, 219611147, 219627532, 51036181, 219645447, 219725836, 219742432, 17006599, - 47317003, 219775042, 219807754, 219824975, 219856922, 129957931, 219873296, 219889669, 191053855, 219906060, 25559138, 219923976, 220037122, 220053546, 182386690, - 220069898, 218759180, 220086702, 158253735, 220136969, 220267025, 130203667, 220300810, 220348454, 119996846, 220364821, 8389054, 220382731, 2197004, 220496398, - 220528700, 220612109, 2195951, 220742393, 220774703, 220807190, 5309892, 220824399, 220857870, 220906802, 220954640, 220971046, 220987408, 116228138, 158744607, - 221003786, 221020219, 221053387, 221102106, 221118479, 118883161, 221136399, 137445407, 221233164, 55033882, 213778434, 221249538, 221266340, 221298710, 221315074, - 208896015, 205946902, 99516447, 137052162, 221331487, 221347894, 221382131, 46219300, 221414928, 221560842, 5309969, 221577232, 221593629, 221610020, 2032423, - 221626384, 2196746, 5537830, 221644306, 221692849, 221724683, 221741068, 221757461, 221773840, 22216733, 221790702, 32849932, 221824531, 221906452, 221954177, - 5308653, 221986945, 222019726, 222052494, 44351526, 222086677, 222299670, 222332439, 222396456, 222413793, 47939600, 2196480, 222446056, 222478348, 222494722, - 111280154, 62341122, 222807577, 222953951, 222986252, 223004186, 223051860, 223084546, 223101559, 223133718, 223150146, 223182867, 52215824, 223200795, 48070675, - 223282323, 223315195, 223364034, 223396828, 178356226, 223430172, 223544861, 223608848, 4751376, 195690506, 223626782, 223674384, 2801693, 223690792, 223707162, - 116375611, 45039638, 112607291, 223724429, 116228102, 223806414, 25559479, 223838234, 205881375, 223854608, 223871005, 223887391, 223903968, 1196063, 223938079, - 224018491, 44302374, 191905897, 224051266, 224084505, 224149975, 224182282, 132792362, 2179083, 5308475, 224200224, 224362558, 224411686, 224428068, 224444431, - 224461024, 224493604, 224509967, 112738326, 189202442, 224526766, 130285587, 224577057, 224608272, 224624666, 224641035, 224657420, 224673798, 224690217, 224706562, - 3145739, 224723028, 224755750, 224772127, 126599183, 193314854, 224790050, 224839203, 224886800, 224903183, 224919578, 224935952, 50511893, 216875855, 224953167, - 224985098, 225001474, 225018665, 225052196, 8390181, 134037520, 225116191, 225132587, 225166681, 225198998, 225248806, 225313768, 4980767, 225363495, 97435660, - 225427472, 225444064, 225476629, 225494568, 225560074, 225607718, 225624494, 225673232, 1753103, 225689622, 225705996, 225722836, 225755439, 225789481, 225935453, - 225985664, 226033683, 226050070, 202014751, 166936578, 226066891, 226115605, 118521896, 118178846, 226133546, 226214933, 226263947, 226328642, 226362923, 10829826, - 226476174, 226508884, 226541624, 226574402, 2129951, 226608303, 226640331, 47546410, 226690604, 226721813, 56311824, 226739757, 226787394, 226820108, 226836518, - 48676902, 226854446, 226902026, 3178517, 226918431, 226934901, 226967618, 227001903, 2197040, 227065962, 227147816, 227164599, 227198513, 122110220, 227460658, - 227524638, 227557378, 227573842, 227606571, 227639327, 1769491, 227657267, 5603368, 227722804, 227770390, 227787055, 227821109, 227901442, 227918286, 45465610, - 227967494, 228032522, 228048917, 228066123, 116376012, 228131118, 228163586, 228179989, 78905365, 228196373, 228212767, 228229136, 228245514, 135594029, 46497794, - 228262425, 228327455, 228343814, 228360251, 116376074, 228394550, 228442143, 228458498, 228475415, 228507714, 228541408, 228589580, 228605962, 228622775, 228655125, - 228671519, 228687891, 228704268, 228721079, 228753430, 156434463, 31424518, 228771383, 228851731, 228868118, 228884939, 228933658, 228950047, 228966402, 228982805, - 228999234, 229033528, 229097931, 229146655, 229163019, 229179394, 229195832, 229228610, 229262905, 116228103, 19251239, 229361210, 93978640, 206176294, 229410363, - 22216715, 10027669, 8603196, 229606603, 229639741, 2195977, 3473437, 1212437, 229738046, 4980773, 229802000, 88948762, 229819967, 229869120, 229949446, - 147013653, 229965890, 99893279, 229998623, 1196043, 121339907, 2113576, 230016577, 230131266, 230162437, 230178825, 67420189, 230195485, 230227997, 230244364, - 1949737, 230261195, 230311491, 42434562, 230457384, 129400870, 230473730, 230490219, 230522911, 230540868, 25559399, 230604831, 44466195, 230622789, 135643176, - 230688326, 230769099, 2195486, 153191209, 125583370, 140247124, 230817794, 230835121, 53641219, 231309348, 231325736, 9207845, 231343688, 231671369, 125927540, - 231751785, 15007745, 231786058, 224772112, 231899615, 231933515, 25559472, 231982668, 232030237, 216776720, 232046658, 74072080, 232079444, 1900554, 232112171, - 232144961, 232195661, 232243307, 232276034, 1769493, 232310350, 4980739, 232358191, 232392271, 232440991, 232474192, 42598888, 232554733, 232587291, 108315095, - 232621649, 148996127, 232767725, 4980743, 232800258, 232816662, 27852816, 2326530, 232833046, 232849439, 1114138, 110133313, 232867410, 232915028, 232947819, - 232982099, 233047636, 233145941, 233195094, 48676885, 29900821, 233260631, 233324574, 233357396, 233390508, 233456048, 147833886, 233488471, 233539160, 233619499, - 233652290, 233685004, 233701665, 233734602, 6324226, 233768537, 233816593, 233850458, 84934666, 233883227, 234047068, 234127426, 234161757, 49790978, 234210910, - 234307596, 1982502, 234325599, 234438668, 195264514, 234456672, 234636897, 234717268, 234750406, 234782736, 234799146, 234815920, 234848690, 127909890, 234881045, - 234897420, 78807066, 234913820, 234930235, 77250600, 234962946, 234979368, 2326566, 234996138, 235028492, 24838182, 235044951, 235094022, 235110422, 235126800, - 235143183, 235159651, 235193260, 235257858, 235274259, 235290640, 235307018, 119357539, 235323408, 235339795, 235356172, 235372550, 235388987, 235422225, 55869462, - 235456098, 56311820, 216727590, 235618306, 235634714, 51658771, 8390243, 235651108, 235667471, 235684299, 235734628, 235880494, 27246630, 235930179, 235962399, - 235978758, 235995155, 236011536, 3473423, 5309352, 236027963, 236060682, 236077085, 56721434, 236093469, 218415116, 153944079, 236109876, 236142630, 236158978, - 144048170, 236175390, 236208147, 236224533, 236242533, 236290074, 236306491, 236339202, 47546425, 236356043, 236405207, 236437975, 236470274, 17154088, 236486682, - 22888479, 236503071, 3473465, 236519532, 236552204, 180699157, 236570214, 236701287, 150241292, 236750440, 176504834, 68550668, 236815216, 236863938, 236896262, - 236912661, 236929026, 236945423, 236961814, 170344484, 236979817, 237045354, 237241963, 110723094, 237356652, 237471208, 237519702, 237569645, 8389883, 237651182, - 237682772, 237717102, 124796959, 150241316, 237782639, 44613670, 237830991, 121339914, 237864560, 37439089, 238141499, 238175318, 165134365, 238223362, 6537323, - 238240017, 150241282, 238272550, 238288955, 238321674, 140247094, 238339698, 238519923, 157220880, 184042073, 238585460, 238665833, 2195537, 238698553, 238714882, - 2195555, 238732151, 238764072, 173850655, 1114131, 238780895, 238813227, 238845954, 144048166, 238862573, 238895141, 238911500, 1212422, 238928196, 238978677, - 239109750, 239157273, 239191671, 239257208, 239321148, 73531432, 239404665, 239452697, 2129959, 177963014, 239518297, 239551416, 239600159, 239649961, 93978664, - 239681620, 239715962, 136740892, 2130767, 239847035, 239910950, 163545142, 239928956, 179814481, 239976460, 239993346, 240025621, 240042023, 240075512, 240107601, - 240140304, 240156896, 240189442, 121110540, 240206349, 240255083, 48627750, 240289405, 240567934, 130285578, 240682623, 240780928, 240828418, 146456604, 240845103, - 240879233, 6374746, 240943592, 240977536, 154042671, 204374045, 241025108, 241058016, 241092226, 241157763, 241223300, 2195927, 112936105, 241352716, 241369098, - 150913053, 241385902, 241434650, 121045011, 241452207, 45056002, 241485445, 141819944, 241582106, 241598466, 241615479, 241647632, 241664019, 116228118, 241680406, - 175669250, 241696849, 125927462, 241730030, 241762315, 241778700, 241795093, 241811487, 241827859, 2523138, 241844308, 29622310, 241878662, 241942540, 81166346, - 241959966, 241992693, 2196591, 242057226, 170999867, 242075271, 242188356, 242238358, 242286630, 241664015, 242303039, 242337416, 133677084, 242384898, 242401382, - 242434090, 242450444, 242466854, 2359302, 242483210, 2195519, 242499594, 242516257, 50659330, 242550409, 242647050, 4980765, 242665098, 242795720, 242828939, - 242894099, 242943176, 119799864, 242976396, 243205773, 2998288, 243368239, 3211369, 243400742, 243417126, 24838160, 243435150, 243499037, 243515521, 243549839, - 243597742, 94109722, 99893269, 243647610, 5488642, 3211363, 243712142, 243744875, 243778449, 1818630, 233193478, 162791446, 243828368, 243925029, 243941392, - 128843802, 109215775, 243959441, 244023298, 244039706, 244056130, 244089741, 244170764, 7389210, 152256543, 244188818, 198328322, 244334630, 244351035, 244383770, - 5325232, 244401811, 244482091, 118636554, 94109722, 244515703, 244547650, 244582036, 244680341, 244744274, 244777878, 244827798, 244875276, 244891650, 1933338, - 244909150, 6619278, 244957200, 244973578, 24838186, 244990415, 245022761, 118883789, 245040791, 245237400, 124862573, 245301357, 2326540, 245335705, 55853082, - 245384858, 133414933, 245497902, 245547046, 167706656, 245565083, 7389205, 2195729, 245663388, 245760029, 8390301, 245778078, 48627743, 245841932, 245859113, - 245892504, 245940262, 1982505, 245958303, 246120942, 8388654, 246153519, 246186527, 246236246, 246284300, 246300698, 3702786, 246318412, 77250562, 246416256, - 246466208, 117751839, 246498167, 246530054, 246546453, 246562832, 2359312, 246579233, 246628363, 45023244, 246646058, 246694347, 45023234, 246743947, 246810065, - 246857770, 246874154, 144048159, 246890536, 246906946, 246941345, 6373665, 247005292, 155762726, 247038482, 247154338, 247251903, 49479708, 247285411, 54820875, - 6619188, 247350948, 247529923, 247562542, 247595046, 247611695, 247644189, 247660598, 247693333, 247710560, 52215824, 247776194, 229965834, 247808021, 247824406, - 247840779, 147013663, 247858853, 248039078, 193200144, 248086948, 180174864, 248119755, 248168887, 248201228, 176504858, 248217684, 248252071, 125583382, 143507458, - 248414235, 248447005, 248463391, 248479750, 248496134, 248512524, 120094731, 49479695, 248530600, 248610828, 111067138, 248628694, 248678057, 248791059, 38125634, - 248807446, 248823846, 248840208, 107757587, 248857801, 248906187, 248956501, 249005738, 23380244, 234962946, 249120427, 249200642, 249218732, 249266186, 1769488, - 249282562, 159760394, 249298954, 149815327, 249317037, 249610813, 105463939, 249644718, 249708556, 1114228, 249724940, 249741338, 7389191, 249757698, 55279622, - 249775791, 135643138, 249890480, 250020098, 250052738, 8603313, 250069015, 9912469, 250085402, 113229845, 250102195, 5310130, 250136243, 250200665, 241991706, - 250232878, 250282089, 250314771, 250331174, 250347532, 200556570, 250364392, 250396909, 10829850, 250431156, 250512207, 250545226, 145506320, 250576915, 250593296, - 2801679, 250609771, 250644149, 250709686, 250906295, 250970128, 126287909, 121585676, 250986534, 251002882, 251019346, 251052119, 251101487, 251133971, 234831938, - 251150417, 251183116, 251199514, 251216304, 5177355, 251249320, 251281437, 251297794, 251314195, 251330581, 52215844, 251348136, 251396106, 5865511, 251414200, - 251494419, 251510786, 3178534, 251528889, 6701061, 251609520, 251643578, 251691107, 251725499, 251789328, 135184410, 3309584, 251805762, 251840188, 52215848, - 251986832, 252018776, 252051475, 252067862, 252084226, 252100646, 3309570, 252117471, 112754726, 252151485, 252233406, 131629087, 252282300, 252331711, 136019974, - 252428389, 252461094, 65912838, 92454914, 252478548, 252527518, 252561088, 252659393, 252706847, 79101988, 253132809, 253150163, 14745603, 253181993, 253198377, - 253214723, 63864963, 253232835, 193445890, 253493291, 153190499, 6455298, 253526863, 253560516, 118882607, 253624412, 253658821, 253756437, 46088213, 175849503, - 253806278, 253920967, 125583391, 253984863, 254035656, 254116747, 254181890, 2342931, 254215881, 254263317, 119128066, 254281418, 254379218, 254410793, 254427148, - 254443530, 192938012, 254461081, 254509084, 254525582, 254558220, 254574602, 254592009, 51838978, 147063272, 254623756, 229965839, 254641867, 3915842, 254738468, - 47022099, 254754831, 244170768, 254771231, 128155676, 254789324, 255016969, 255033481, 255049944, 255098886, 255115293, 255133389, 255182542, 255394005, 255426914, - 255459460, 3309578, 255475718, 255492125, 20365353, 43237405, 255510223, 169377801, 255542992, 255590409, 29163657, 255608332, 142245926, 255639589, 255655974, - 2197201, 255672357, 107757684, 29605907, 255688711, 255705107, 901177, 2523173, 38879269, 255721477, 255737868, 37355651, 255754247, 29376531, 255772370, - 255934753, 255968979, 256032784, 116228122, 234848296, 256050017, 256081942, 18677802, 256100052, 256147482, 159760413, 256165589, 256493270, 256589855, 256606218, - 256622613, 256639016, 115343388, 256655419, 256689879, 256787721, 256819240, 49791002, 256835610, 256853720, 256901146, 256917588, 256950288, 118884057, 256968410, - 257048617, 257064972, 1818662, 257081774, 257130638, 57032732, 257164425, 132776362, 257212428, 257229281, 257277954, 257294339, 257311152, 2197211, 257343594, - 6619243, 257425854, 257492180, 188761820, 2195732, 113247241, 109215754, 257556526, 6620329, 257606392, 257640157, 109215746, 257703938, 132155102, 257721651, - 257769558, 257802322, 257835294, 257884162, 257900554, 236011551, 2605072, 257917015, 113115146, 257966172, 258000607, 258180832, 258277392, 258293779, 121094156, - 258311905, 258408463, 258424834, 258441235, 258457631, 2801705, 258474093, 1785858, 17448976, 258506773, 258523148, 180977674, 258541282, 158253166, 258672355, - 258770553, 2261023, 258818507, 258867302, 258901732, 258965514, 1933354, 258982901, 19251307, 259047453, 259063820, 259081957, 259129803, 2179084, 259178929, - 259211793, 259244063, 259260418, 115818515, 259278566, 259409639, 259473697, 259506218, 259522636, 259555631, 137101362, 259589864, 259671785, 259735618, 141819942, - 259769191, 259801095, 259817503, 259833858, 115818517, 259850347, 259883293, 259916235, 259964984, 259997762, 251346960, 260030474, 8390378, 260047761, 160760943, - 119357506, 260097771, 260128852, 260163308, 260441837, 260620297, 24969353, 260636710, 260653115, 137101795, 260686299, 260720306, 260751370, 260767783, 195215398, - 260801010, 260851438, 260981711, 261029916, 261046310, 261063102, 261129967, 219186185, 261195504, 117506107, 261226546, 261259285, 261276540, 261325792, 261373958, - 261392113, 261455915, 261488659, 261505061, 132432729, 261521454, 123912481, 261570598, 261586956, 172836594, 261605107, 261701672, 261718032, 261734440, 3178502, - 261750794, 261768011, 2195916, 261832735, 147652646, 261849768, 261881884, 261898256, 261914655, 6374569, 261931496, 261964683, 262030159, 262062099, 262078501, - 108707852, 262094913, 262144471, 6438922, 46514186, 262177782, 262209567, 262225922, 262243601, 262291522, 262325216, 165134367, 228245525, 262373428, 262407924, - 262473461, 262521291, 262570831, 226050074, 262604534, 262784759, 262897666, 262914105, 182386719, 262931305, 262995994, 263014136, 189252018, 263096057, 25560826, - 263159819, 263176194, 2801685, 263194363, 263241739, 263258114, 218841109, 123273254, 27607052, 263276284, 2162729, 263341821, 263389190, 263405590, 263422599, - 263471106, 263487514, 17006613, 263503903, 158744614, 263520936, 131335337, 263553034, 119226397, 263571001, 263669502, 263815305, 18661510, 141819906, 263831564, - 263847946, 49938444, 263866111, 84738090, 263915264, 264094543, 264126480, 264142886, 264159248, 2342954, 7372836, 264175632, 6374509, 264192084, 264224810, - 264242566, 264306747, 264339540, 264372264, 264388629, 264405467, 264437779, 5865511, 264454155, 264242070, 264470550, 264486948, 264503302, 264519711, 264536083, - 264553368, 7634984, 264603393, 264650783, 136183810, 264668930, 264734252, 264765499, 2195970, 264799390, 128892968, 264864891, 264896524, 264912917, 264929306, - 264946096, 182059027, 264978453, 264994832, 265011250, 171458591, 265043987, 265060374, 265076762, 204587024, 43532309, 265453610, 265469993, 265486357, 7602214, - 265502722, 17809414, 265520900, 265682984, 265699330, 173850662, 265716648, 4964362, 265748783, 265781258, 265797651, 265814019, 2359332, 265830402, 132481458, - 24838175, 2867240, 265848581, 265912387, 265994281, 266010626, 163020838, 2834531, 266027551, 2670613, 266076182, 53706793, 266094342, 54460447, 266209031, - 266258184, 266356489, 266452994, 266469382, 266486289, 266518567, 266551302, 266567711, 266584301, 2195933, 1769501, 266618634, 200212486, 266716939, 266797913, - 35799080, 3309608, 266831628, 250298374, 165134357, 266911798, 266944533, 266960962, 266993683, 267010968, 267059210, 223020813, 267076993, 267126542, 11157514, - 267224148, 267272251, 267306767, 266027107, 267355920, 267436503, 267468821, 267485643, 111624194, 267536145, 8390418, 47546408, 152946451, 267601684, 267665439, - 125583379, 267681814, 21151860, 267699989, 267763811, 267796495, 267812886, 267829260, 267845658, 267862082, 267896598, 268044055, 224133136, 165724594, 268091451, - 84738059, 268124697, 268190171, 268224280, 268289817, 268353593, 268369932, 268386314, 268402709, 268419098, 268435487, 268451859, 268468264, 6701094, 268486426, - 268533791, 268551031, 253788191, 268583413, 216400304, 268616969, 268650267, 268699420, 268879645, 269009387, 269042311, 269092638, 116376074, 269156362, 269174559, - 269287426, 55132166, 269305632, 269386329, 269418522, 119357538, 195215375, 269436705, 269501323, 269565962, 156566135, 269582367, 269599605, 269631490, 269647893, - 269664715, 269715234, 269746777, 14712848, 269780771, 111656970, 110135076, 131334447, 269893663, 55377926, 269910028, 269928229, 269975568, 269991962, 164610064, - 270009334, 31473674, 270041391, 270073875, 270090261, 270107488, 270173152, 270223142, 270270504, 270286869, 270303691, 31424522, 270352438, 270385689, 270450780, - 270485287, 7307266, 270533109, 270927657, 271024888, 271058730, 2196489, 271107010, 159975211, 271140652, 2850838, 271187978, 271204650, 271238957, 271336357, - 271368202, 271384614, 2539532, 271400976, 45776912, 271417425, 271450171, 271482890, 271499293, 168329225, 271515714, 271548432, 271564810, 271582076, 271630796, - 271664942, 271763247, 271826975, 271844215, 271876577, 271925270, 2359336, 271943472, 8390449, 272089169, 272121866, 272138259, 272154690, 272189234, 272318521, - 272334879, 56655901, 125239318, 272351270, 3375106, 88948738, 272367647, 272384006, 3473448, 272402227, 2934010, 272434996, 272515937, 116850698, 272547866, - 272565272, 272613613, 272646590, 2196327, 272712704, 272745208, 272779042, 272809989, 7045122, 272828213, 272875532, 272891930, 272908310, 49479692, 272926518, - 273072221, 224935942, 273121346, 273155895, 273203210, 185860124, 273219694, 273252811, 110592031, 273301516, 273317898, 273334293, 273351563, 273417098, 273449000, - 273465370, 48676906, 133742632, 273481827, 273514517, 273532728, 273727494, 273743884, 273760271, 273776661, 215826444, 8603449, 8603450, 273793461, 273825802, - 273842713, 190922762, 273907750, 7733307, 273925947, 17809419, 273973347, 274007868, 185860124, 274138941, 119799890, 110249790, 274186699, 274236758, 274284554, - 2195488, 274301019, 2195947, 274335551, 45907994, 274450240, 45776936, 274515064, 163856396, 274548545, 274646167, 274694564, 274727185, 274761538, 47611942, - 274825247, 274842613, 274908995, 274990916, 55132182, 275039761, 275071007, 275087398, 229965862, 275105605, 166215711, 275152955, 2196826, 275185695, 274989075, - 275203910, 275384135, 275431440, 59375632, 275447830, 275464197, 117751839, 275480588, 47710219, 159727628, 275497019, 275529830, 48676893, 249987115, 275562527, - 275578899, 275595330, 147341343, 275629896, 275742813, 275793737, 182910988, 275874846, 275908426, 13713539, 276038062, 276086889, 276120089, 120258566, 276185127, - 276217871, 276234271, 276250645, 276267030, 276283404, 99893267, 276300969, 164380684, 276334411, 73744424, 276465484, 32849942, 135414569, 276531021, 49496080, - 276595865, 276643861, 276660255, 276676627, 276693295, 276725868, 276758554, 276775804, 276825934, 276906443, 276956489, 277006159, 277053471, 277069826, 118636554, - 212402635, 277088080, 277137233, 277364746, 277381141, 277397535, 277413916, 277430288, 183369757, 277446716, 277528592, 277545002, 277561370, 277577730, 277594127, - 176308246, 123617312, 277612370, 277709708, 2850826, 277757967, 277774358, 277790722, 128581670, 277807125, 265076758, 277823514, 277839898, 277856268, 122667046, - 277872642, 277889655, 277923316, 277970973, 16236546, 82001936, 276283408, 277989203, 278036482, 278052879, 247234582, 278069259, 278085643, 278102056, 174440458, - 278118416, 128581674, 278134868, 278169428, 278217241, 278284117, 278349654, 278396959, 278413350, 25559106, 278429711, 278446102, 278462495, 272613810, 278479306, - 278511627, 278528948, 3228082, 278595415, 278659078, 2195851, 264159234, 278675561, 46645264, 278710104, 153174042, 263536671, 278757921, 278808200, 278855690, - 112607465, 278872130, 278904858, 49791018, 278921218, 278937630, 1818650, 278970434, 32849946, 279004532, 279052319, 279068731, 279101494, 4407349, 279136059, - 49790986, 279185241, 279380100, 279396489, 17448989, 279412745, 4571271, 279431002, 279527462, 143589435, 279544960, 279592970, 279609363, 126287894, 279626889, - 279674911, 279691285, 279707660, 279724038, 159432761, 279742299, 159268876, 124796959, 279840604, 202063874, 279905971, 46514216, 279969794, 147423258, 279986242, - 280018975, 30392377, 280037213, 280282974, 280346634, 8390495, 280363438, 280412267, 280444982, 256032770, 280479584, 280608834, 147407370, 5309789, 280641612, - 3211735, 280676193, 128155690, 280838203, 280872458, 27852821, 280920172, 7389200, 280953291, 2196073, 115523605, 281002015, 139984902, 2850842, 2998312, - 281020258, 281249635, 4980755, 130007887, 281314193, 281362434, 45023272, 281379330, 281412692, 281462187, 2621446, 281509898, 210042911, 281526727, 281576230, - 27623490, 281610084, 281706555, 281739296, 62914562, 281772061, 281789323, 281854878, 281888613, 281935888, 6324264, 281954150, 282036071, 282083366, 282099750, - 282116098, 282132537, 278904863, 282150279, 282181716, 282214510, 282247199, 6193173, 282265448, 282558599, 10371100, 282576745, 158253550, 116850709, 282755084, - 282771927, 282805116, 282853386, 24838186, 282870220, 269517692, 282902554, 282920810, 282951716, 282968180, 117096479, 282984516, 283033616, 283049995, 283066380, - 172835029, 127909928, 280445036, 283083037, 2031642, 283115522, 283131930, 147816477, 72368130, 283148720, 283182955, 283246618, 283262983, 283279497, 283295749, - 283312130, 2326546, 109215756, 1097744, 283328944, 283361334, 1949725, 126959642, 283394333, 283428716, 283461485, 283608942, 283673621, 283721812, 283756399, - 283836521, 283869195, 223363111, 283887092, 283935774, 283967504, 2523157, 283985776, 202309644, 284051313, 284329842, 284493683, 284524584, 189579266, 284542080, - 284591737, 2162699, 5309328, 284639248, 113459238, 284657524, 284688412, 284704784, 4751400, 284723061, 284786726, 46710800, 284804117, 194084870, 284852250, - 284868624, 283722160, 284886902, 284999779, 285034359, 2360310, 120602629, 285081903, 285114452, 19251307, 285147166, 285181816, 125796374, 285279333, 285329273, - 110166070, 285378426, 285507605, 285523970, 285540363, 149585951, 285556793, 285573132, 192872477, 285589525, 163020822, 285605931, 285640571, 115523599, 285687810, - 45875203, 285704220, 145506335, 285722492, 286031881, 286048393, 29016198, 286066557, 286195778, 286228546, 25559099, 5309287, 286261674, 286294018, 2621466, - 149880863, 286310487, 30392330, 286361470, 286394239, 286426001, 286474324, 286507023, 286523408, 286539797, 286556163, 121061378, 286574464, 286656385, 286720002, - 286736816, 286769268, 286785538, 265601034, 286801956, 286819581, 286851103, 17809424, 286867471, 101908499, 286883924, 286918530, 14712863, 286982220, 287014933, - 241827862, 207290787, 287031298, 2113564, 287049156, 287080457, 11468931, 287097057, 287129651, 29622288, 49479706, 287164291, 239468556, 22216742, 287244347, - 2523148, 287277063, 287293469, 287309843, 287327066, 287359033, 2179114, 287377284, 287441889, 170984691, 287473676, 287490064, 6455306, 287508357, 287622487, - 2342914, 287670284, 287686684, 287703071, 152338453, 287721350, 287818905, 287867417, 287932431, 287948802, 81166362, 287965210, 194166810, 288524168, 288587782, - 288604172, 113229862, 288622473, 901240, 288769930, 19267704, 2261112, 2179192, 2197387, 288801715, 288835468, 288915892, 288964745, 2179113, 288981030, - 288997399, 59375635, 289015693, 289046550, 2015244, 289064846, 289112201, 289128582, 289144947, 20299911, 46530601, 289161353, 9207819, 289177611, 271925290, - 289193993, 289210498, 289226764, 289243139, 2621443, 289718274, 289734764, 289767446, 2998303, 289783923, 29737075, 289802128, 289964084, 289996842, 6406146, - 15073308, 7733472, 2197393, 290015122, 290228115, 290373869, 5325102, 48070698, 290406440, 49496074, 290424393, 3211715, 290505247, 290553922, 290587471, - 290621332, 24183042, 242368518, 290816002, 290832426, 245301258, 202162595, 6308317, 290850709, 291014550, 291061776, 225181706, 291080087, 291143682, 31801384, - 291160066, 72368147, 46514182, 2359355, 291178392, 258769743, 2130807, 291243929, 291309466, 291620763, 24297930, 291684354, 139477990, 3129360, 207011842, - 291700812, 291733530, 134840358, 44613672, 291749904, 291766709, 291800988, 291864879, 291897365, 226951189, 291915677, 292128670, 292208951, 20365343, 292259743, - 292323817, 292372482, 292388904, 292405274, 292421644, 280903682, 3244335, 292438092, 52674600, 292472736, 292668804, 46514178, 292733688, 292767649, 292814874, - 292831284, 51068968, 292865044, 292913164, 5325322, 292929595, 45646256, 292962330, 72368134, 292978772, 293011502, 293062562, 293158914, 293175334, 293191720, - 121339919, 293210019, 293519414, 293553321, 293584915, 293601302, 54493196, 293618857, 293650448, 293666856, 293683307, 293717924, 1949719, 293781588, 115785769, - 293816229, 293896631, 134709269, 293928987, 293963581, 294011022, 79740939, 294043664, 294060072, 145506314, 294076481, 36406081, 294127526, 294174792, 294240740, - 2195939, 117506132, 294291367, 294323112, 294354963, 294371365, 294388604, 3342352, 294438824, 294535170, 1818645, 294552883, 294601598, 294633500, 294649922, - 5342328, 294682678, 294715819, 3213050, 294748186, 294764546, 294780947, 48021541, 294799273, 294846548, 294879314, 294912029, 168493527, 145473538, 294930346, - 135905296, 8390070, 294995444, 295043098, 295059487, 295075905, 295125446, 295157776, 295174186, 295190960, 295223730, 295256086, 226639874, 295274411, 1114127, - 204996620, 295339948, 295665877, 295700397, 295863119, 295895078, 295911455, 295927810, 49938451, 19447824, 295944214, 124403718, 295960660, 295993355, 111362060, - 8388695, 296009770, 55132200, 296026546, 296058896, 296077230, 296109999, 296174993, 296239967, 174065584, 296306609, 296372146, 296419340, 50266143, 296435733, - 141836294, 296452127, 296468951, 296503219, 296566858, 296634292, 296714347, 296747010, 178127301, 296765365, 296845314, 296861706, 296878089, 296894482, 8175625, - 296911151, 296945202, 297009254, 297042350, 297091082, 146358293, 297109430, 48005141, 297156667, 297189378, 297205771, 221806614, 127042524, 297224119, 55132198, - 297287756, 233734154, 162971677, 297321748, 77709352, 297370069, 297418783, 131891210, 297437112, 29769740, 1769588, 297599249, 297633721, 297730506, 297764794, - 297813947, 297863100, 24838146, 297945021, 298207166, 84934693, 51822623, 111247372, 298287188, 298320311, 298352642, 125927450, 258080778, 298370635, 298420159, - 298518464, 298598406, 298614805, 4571152, 298633153, 24297535, 8159363, 162119788, 298682306, 298745858, 298764227, 298811422, 298844267, 298876994, 298909698, - 2146360, 298926617, 298993162, 45875219, 299042756, 299106380, 299139156, 299171890, 299204684, 257933328, 299239365, 299270228, 299304902, 270401602, 299370439, - 299550664, 299663436, 284640039, 299696168, 2195486, 299712584, 299778050, 299794470, 29622287, 5324907, 2147497, 299811753, 299859970, 158254001, 299878345, - 299927498, 300024741, 300056578, 47120390, 110248784, 300074955, 300351490, 7734511, 152027158, 5325037, 300367898, 2196392, 300384340, 29622282, 300419020, - 300549004, 300599245, 300681166, 300763087, 24838185, 300827070, 300892186, 198410282, 2196311, 300908598, 300942672, 300992464, 253706266, 8390609, 301105163, - 301121538, 222281754, 50937877, 301139922, 301252614, 141606941, 52576277, 301270995, 301385684, 132431931, 301483989, 8390614, 301645931, 301678608, 301695013, - 71188486, 15073306, 301711397, 301727760, 17448986, 301746135, 301909976, 301973563, 302006274, 174030888, 302024665, 302153794, 302188506, 243040297, 302301408, - 159760406, 302333983, 302351529, 302385115, 302433269, 302498317, 5308853, 302548418, 302598108, 302678018, 189464597, 303056862, 303349762, 5324902, 303367539, - 303398966, 303431696, 197115944, 303448919, 303482251, 41582618, 303530015, 303546374, 303562774, 115523594, 303579138, 30392351, 303597535, 303663072, 8390625, - 2113562, 303712226, 303824924, 303841306, 303857666, 114393099, 118882388, 303874108, 303957161, 157499880, 303990755, 6701059, 304087849, 191053827, 232079400, - 304121828, 304153695, 27852828, 304220133, 304400358, 304447507, 237732341, 304463911, 304496642, 304513131, 158811338, 304547815, 304628163, 27852838, 304660492, - 13074474, 304678888, 5325159, 304726075, 110183287, 304759896, 304809575, 186777631, 304859113, 116162562, 304939926, 304990186, 305039339, 305119664, 305154028, - 305317465, 238256159, 305365023, 184074252, 305381407, 5325665, 305397781, 305414170, 305430831, 305463308, 131629066, 305479726, 30326837, 305528916, 2195501, - 305563629, 158253547, 17842260, 305694702, 110723078, 305741826, 2113551, 305759897, 305808584, 305840154, 305856578, 305891311, 306005694, 290406412, 306055152, - 306300913, 306431986, 140247534, 306496119, 306528688, 3244120, 306563059, 306726900, 299696140, 306791421, 306855946, 25559343, 306872341, 306888763, 306921498, - 306937872, 7733725, 306954464, 264175618, 306989045, 134169102, 307070966, 307150854, 249266214, 307167248, 307183654, 258637862, 2129956, 307200059, 307234807, - 307347466, 307365662, 29491671, 116883931, 307430528, 307478530, 54460452, 51871775, 307494966, 128892944, 307529720, 307659923, 307692052, 307740779, 307773546, - 307855810, 44351500, 129925219, 307890169, 308068843, 143818783, 118883930, 45465615, 308101553, 308133900, 50937862, 2197498, 308150356, 308185083, 186794086, - 4997183, 308283388, 308414461, 167903316, 308461710, 308429712, 308496382, 308576272, 27852826, 308593154, 308625484, 308658181, 45039628, 308674641, 5866232, - 308708953, 308756502, 308772930, 308805653, 308822046, 308854786, 250937373, 308871170, 19447818, 308887855, 292962314, 308920366, 308970516, 309018655, 185319434, - 309037055, 309167628, 309199378, 309315584, 8978453, 309413856, 124796970, 309462036, 48676906, 209305626, 306954454, 309510381, 309543824, 122732582, 309575779, - 107757610, 309609295, 2916378, 309641262, 309690437, 309723172, 49496102, 310085634, 310248793, 240844866, 310281195, 310347779, 310444347, 131776571, 253706293, - 310478852, 310575157, 155631632, 310609925, 310888454, 168232967, 310968462, 311001098, 97681410, 273924098, 311019528, 311099418, 311115778, 7372810, 190644308, - 311134217, 84934672, 2196136, 311199754, 311279628, 170197863, 311296059, 311329311, 311377931, 48054300, 311394314, 2850828, 311410747, 311444680, 311478283, - 78102831, 311542063, 6324253, 311576436, 311607311, 311623682, 311640093, 311656470, 22216740, 311674892, 311820404, 3211330, 311837724, 311869521, 311904269, - 312100878, 312147970, 312164362, 312180765, 7307286, 312197173, 312230410, 312262740, 20365349, 312295483, 312328221, 312344588, 312360966, 265601046, 312377346, - 312393739, 13074448, 5309225, 312410114, 3227758, 312428559, 312493256, 312525447, 312574017, 110233616, 312625169, 17842985, 312805394, 127713296, 312887315, - 312934637, 312967206, 119226406, 312983567, 312999957, 313016753, 313051156, 313131024, 118884373, 313147452, 313229368, 49791012, 313264150, 313328553, 313377239, - 313411607, 313458725, 284704796, 313477144, 117751860, 313540648, 313557004, 307298325, 313575449, 147341324, 313690108, 313820640, 313852892, 50249740, 266764752, - 313886746, 170344460, 313933890, 313966651, 241238018, 313999854, 314034203, 314097666, 13713436, 314116124, 314212829, 3309571, 314245136, 6193163, 314261535, - 314279965, 314329118, 314378226, 314442641, 314490906, 1998850, 314507330, 124862546, 314935328, 315197473, 315278634, 2162725, 315328546, 5325239, 315392046, - 315441236, 127041620, 315473985, 127680552, 315525155, 315621378, 24838180, 315639844, 127795503, 131940389, 315688997, 315753885, 150241320, 315803686, 315951143, - 316080975, 316113832, 316146772, 116703270, 316194922, 52215846, 316278824, 316359133, 110134128, 316393513, 128155688, 19267689, 316540970, 316639275, 54296598, - 316702944, 316737580, 316866778, 149094416, 316899368, 143720474, 316917805, 5308455, 317014475, 2342941, 317063242, 317130798, 317293598, 317325614, 19268055, - 317359020, 2196932, 317424075, 317472809, 2195525, 317489690, 317524015, 317655088, 317720625, 317818930, 304808479, 317900851, 317950004, 318111831, 29786204, - 318161001, 318193702, 140248002, 5310517, 318212150, 64765968, 154665435, 133414933, 318277687, 318391305, 152158218, 318424002, 318457912, 318572601, 318638138, - 318702003, 56164373, 112312336, 318734346, 182288918, 318750741, 65896450, 318768143, 2998298, 318818363, 319029472, 270516236, 194068971, 253788170, 319063457, - 319111252, 191004771, 319144895, 27623476, 319178141, 319225915, 319258634, 319275036, 279904282, 319293500, 319456286, 270401773, 319490109, 319602710, 319619074, - 5177386, 319635532, 319669257, 319702639, 20365348, 141606941, 319750204, 319834174, 319898715, 319932479, 319963182, 320013165, 131940364, 320062852, 50266133, - 320127029, 320161856, 320374849, 25559911, 320487426, 2392070, 320505922, 27852821, 311197905, 320634952, 108724250, 320702531, 6374849, 320768068, 320815188, - 320848778, 320880666, 320897035, 320913474, 177111062, 320948293, 119357569, 321077260, 321093653, 321110046, 321144902, 321257696, 321292359, 129957947, 321339432, - 321355788, 4980762, 321374280, 321505353, 321652810, 321717322, 297844765, 44351528, 321751115, 161857576, 321800268, 321961990, 321978387, 321994778, 322011138, - 45613066, 125583386, 322028430, 322095181, 322176665, 322226254, 77250600, 322389053, 322455631, 322519061, 322535478, 322568251, 322601041, 322634262, 109052046, - 322666923, 322700488, 177700876, 322734160, 110248295, 322865233, 322947154, 323126920, 323174879, 323207197, 47317008, 323224661, 7602178, 2195985, 323258451, - 323321940, 5866762, 2130411, 323356756, 323683713, 323733393, 323766357, 190318090, 323847713, 290553922, 323881046, 323945873, 324011159, 324059659, 249987131, - 324108326, 324126807, 51019787, 324208368, 324239419, 2195503, 138641510, 324273008, 324321285, 324338139, 324370519, 324421720, 324486005, 257656921, 324517947, - 24838150, 324550722, 2359825, 324585562, 324667483, 46481429, 324731905, 324780633, 8389488, 316211212, 324814940, 324879500, 324928450, 324960321, 325011075, - 176488467, 5308907, 325077085, 325173549, 81166374, 325206863, 325238871, 325290078, 325337100, 219627530, 325353494, 325369866, 325386271, 204537893, 325403083, - 325781464, 325845871, 214319125, 45137922, 325896288, 304152587, 325994593, 326139906, 326158434, 326206810, 326240355, 326336578, 152946641, 326371428, 326418478, - 326467624, 326483978, 54460426, 7307283, 6422544, 326502501, 19253350, 68239671, 326615277, 326647915, 232981014, 326681423, 326713370, 326729749, 87031824, - 27852826, 326748263, 326879336, 326928489, 327026794, 327106562, 5308640, 327125099, 327172148, 75464725, 327205401, 327270482, 327303225, 327319583, 47530022, - 327338092, 327417858, 327434278, 147423270, 327450634, 8390765, 327467020, 2195554, 327483458, 3227730, 327518318, 327581736, 327598146, 327633007, 327860437, - 327895152, 57032720, 327977073, 328073324, 7602178, 328106831, 328138811, 328173682, 328253974, 328286734, 328318998, 328335365, 328351746, 328368159, 328384554, - 6946838, 328400962, 328433666, 328450519, 328483118, 328516344, 328549972, 328647465, 328679512, 8390771, 328714356, 328779893, 328892426, 149094412, 328908846, - 328960118, 329023542, 329058423, 131334433, 151093264, 329123960, 329468025, 329613350, 329629734, 118882358, 329647232, 329695766, 6373415, 4161538, 329728494, - 6374549, 329760780, 329778197, 329826362, 167903286, 329877626, 329974645, 3212318, 330008699, 152945554, 330170378, 5325220, 330187512, 330220367, 330253312, - 330285078, 45760524, 330303612, 330400375, 330433452, 330499560, 4997591, 330547284, 330579978, 330598525, 330711966, 330743915, 330777516, 330842131, 330858518, - 330874892, 46530589, 330891727, 330926206, 331090047, 331153446, 331169823, 170886313, 51675164, 331188352, 331303041, 331368578, 132187145, 331466883, 56246308, - 331532420, 331628546, 111280166, 2196415, 331644949, 331661849, 185319434, 331726914, 331761797, 1769479, 331923482, 331939880, 331956255, 54460422, 331974790, - 332021786, 332038160, 332054568, 6620363, 332070924, 332087306, 332103701, 6619188, 332121288, 209584555, 113115238, 332154087, 332204167, 332447782, 332464194, - 332499080, 332563324, 183369743, 332613769, 332694264, 332726274, 332742687, 47546394, 332759116, 332792240, 332824614, 6406182, 332840986, 332859530, 332939276, - 4177931, 226443276, 332955660, 243777567, 332972073, 332988428, 3555359, 333006157, 333072523, 333135924, 333168943, 333201418, 333217858, 7094903, 333252748, - 333414925, 333464361, 333496322, 2359334, 333512706, 333529114, 333547661, 4997176, 333595657, 8388701, 333627408, 333643857, 243777548, 333676575, 333692954, - 333709331, 55754774, 333725777, 333758476, 51675176, 333774907, 333809806, 333908111, 130269190, 333972768, 334037018, 334054542, 311690261, 334104720, 2342922, - 334217453, 2130882, 2196719, 334252177, 301252618, 334348342, 334383250, 334694547, 334807500, 334840409, 334874772, 334973077, 335036422, 335052819, 161726486, - 335070554, 335102761, 335134804, 59375621, 2113546, 335167595, 335200266, 119537666, 335218054, 119996932, 335284374, 131810324, 335332695, 335382679, 335431289, - 247234581, 2932960, 335478843, 335513752, 335593986, 335626256, 207620115, 335644825, 335775274, 50135069, 335856105, 47611906, 335905822, 264716369, 335938401, - 53690410, 335970413, 336005274, 336085002, 127680566, 336103579, 336281609, 336298121, 336314502, 10371187, 336330790, 336347174, 336365724, 336414877, 336464030, - 336496798, 336529567, 336576548, 78807047, 336594031, 336626600, 336660640, 336822303, 336838668, 68599846, 336855081, 151765028, 336873633, 151765014, 336906402, - 337002532, 337021091, 337068061, 148637860, 337788982, 337822296, 337856679, 178814987, 338100461, 215826448, 338135208, 203325466, 49496095, 338215014, 302252038, - 338249897, 112607341, 338346050, 2867216, 338379688, 235552780, 181256240, 338413033, 338462890, 6701068, 338527133, 338609042, 338657309, 245350412, 211812823, - 338675883, 338805672, 338837520, 338853894, 3342342, 338871119, 338903182, 72499223, 333299733, 338938028, 339230910, 34422921, 2195610, 2850832, 339298477, - 147423253, 339364014, 339445935, 339492902, 136790028, 339511472, 308576258, 339642545, 339708082, 23363797, 339839155, 116375659, 340101300, 340164639, 340181425, - 340213772, 340232373, 8389186, 340280530, 340312095, 249137334, 257657015, 340330680, 340591401, 340625593, 340705339, 340738981, 340771175, 2867212, 340803639, - 340869344, 340902753, 118882984, 340935574, 340984238, 341033002, 121651222, 116064282, 341049346, 341065754, 341082122, 341098580, 341131280, 341147686, 47611906, - 341164491, 2196535, 341213196, 2196358, 341229998, 341278827, 341311938, 341147670, 280903690, 341345587, 341393434, 51855398, 19038220, 341409804, 341426218, - 341442603, 341476524, 287146100, 341524518, 73531404, 341541782, 341592250, 341625019, 189693990, 341672020, 341704770, 341737579, 341772476, 246546458, 341868546, - 159383592, 341885399, 33390922, 317898833, 341919933, 341985470, 342065678, 168722453, 342100159, 342132928, 342345019, 342378689, 116211930, 342425707, 2146593, - 342458510, 112607535, 342493378, 342606801, 342656172, 342704130, 342720522, 151093250, 342739139, 342984900, 343097366, 343113794, 343148741, 343195650, 343213321, - 343247046, 257098575, 343343106, 343359499, 23364340, 343378119, 141606918, 343442321, 8390609, 343490619, 308674572, 343524505, 116867964, 343572501, 343588894, - 343621716, 343655247, 343687631, 343722184, 344033481, 282853416, 215810070, 344096874, 344179881, 344211498, 344227909, 344262858, 344312011, 344426700, 344457232, - 344473626, 114114589, 344491380, 115818534, 344539178, 243040297, 344555823, 344588319, 243777546, 344604718, 344653850, 344672461, 344770766, 111624223, 344883284, - 344916055, 344966700, 345000030, 345049295, 42369036, 289046554, 345145390, 345196752, 345474465, 3229887, 345524433, 345573586, 257949712, 316735533, 345704659, - 345786580, 6438914, 113836044, 345866925, 345915419, 345949097, 345997342, 226951183, 346032341, 346144796, 47611944, 346161164, 179716124, 346177582, 346227598, - 124928012, 269108092, 346294486, 127451145, 346521616, 346539568, 346570989, 191644566, 346604045, 42434600, 346654935, 84934678, 1769588, 346704088, 346802393, - 346882132, 283197497, 346914828, 346933466, 55197736, 346996790, 317898833, 347031124, 347127846, 3538982, 347144213, 5505045, 347160602, 347177387, 108298262, - 347209794, 347242508, 116752394, 347261147, 347457756, 347523293, 347603028, 347635733, 2359327, 347653003, 6127637, 347717642, 347736286, 347783234, 347816020, - 347850975, 175849512, 347932896, 348014817, 348178658, 164775081, 348258370, 348291937, 348323893, 348357528, 251396122, 348408035, 207422664, 348506340, 348553245, - 348570588, 348602384, 68599824, 348618754, 79101981, 348637413, 2195563, 348702950, 348750126, 348782621, 348635148, 348801255, 348897290, 348915944, 273465354, - 226443274, 348965097, 349175889, 349208602, 349224988, 349241356, 6438931, 349257740, 110248046, 349274219, 349306985, 349339667, 349356054, 349372427, 46710815, - 349389279, 2326554, 349421676, 157663248, 89128976, 349456618, 55377930, 349554923, 349619297, 177340479, 349685996, 2196216, 349716492, 349798459, 349833453, - 349931758, 350028585, 161808386, 184926234, 350062831, 202097400, 350160097, 159694850, 350603505, 2195538, 350750962, 174080066, 350816499, 168869894, 136921100, - 350865024, 350912518, 13074453, 350929355, 350978913, 351011649, 5177354, 351043671, 351095028, 351223850, 351240232, 49266700, 351256607, 351272996, 351289356, - 351305734, 47317007, 351322124, 351338506, 7389190, 108298271, 351357173, 351453655, 351488246, 196837392, 351535157, 351568781, 351651102, 351699785, 351750391, - 45531162, 351813634, 351832312, 351879211, 351911947, 29622284, 351930617, 17842936, 352092182, 2539551, 352110842, 352190923, 352241915, 352306088, 352337946, - 352354335, 7733485, 352370805, 4390950, 352403468, 7307266, 352419899, 352454333, 131891205, 352536828, 352831741, 353075216, 353092953, 47710239, 353126654, - 353206509, 353241343, 353304668, 353337647, 119799847, 6946832, 353370114, 45776906, 353388800, 353600929, 111214632, 353648650, 353665045, 306774075, 351895592, - 170705767, 353681437, 346177602, 353698958, 353748042, 353779733, 353796943, 353828940, 353861670, 353878070, 54460421, 353910800, 353929407, 353962241, 354156556, - 120094746, 354175234, 354273539, 354336770, 203654459, 341819414, 354353154, 48545802, 354371844, 55132186, 354435156, 354470149, 274989075, 8389647, 113115157, - 54345759, 354583128, 141541416, 354617606, 48513035, 2162707, 354730038, 354765063, 354811923, 5505046, 354828328, 132792341, 354844756, 354877547, 19447820, - 354910315, 354943008, 354975746, 2196554, 354994440, 355191049, 355238780, 355288697, 355336232, 164380678, 2146731, 355352582, 355369395, 355403579, 355453194, - 254574614, 8390923, 355565627, 355600652, 355633421, 355778562, 47316995, 355794990, 355846414, 355895567, 355959321, 356025485, 356075792, 356122670, 41582628, - 356172301, 47317034, 2196470, 356223249, 356337236, 227524715, 356434352, 3244139, 356468280, 144375810, 356533071, 356927763, 165494815, 357171238, 158500169, - 152946964, 357188531, 357221535, 357253186, 357285917, 119881740, 357303390, 357351531, 357386517, 357468438, 8389522, 357548034, 357564442, 307298341, 357580857, - 357597196, 150241290, 357613580, 357629962, 183189533, 357646695, 357681431, 357845272, 357927193, 357992730, 171163685, 358088763, 358123803, 1769498, 358187051, - 358222108, 2932818, 358450065, 358499302, 121339925, 358533405, 358597606, 358630256, 358679393, 3213019, 358711599, 358744083, 358760469, 54493200, 358777676, - 358826050, 114786775, 358858754, 143295224, 358876151, 358940674, 2195561, 358958579, 358992158, 109166613, 359071831, 5308446, 359120983, 359170481, 359205151, - 359333926, 359352608, 359399462, 357629958, 133611522, 198672424, 359415820, 5324908, 359432257, 10650533, 359483681, 237731851, 60227600, 185270282, 359661570, - 52756509, 359680290, 211910658, 340280530, 150913064, 359762211, 359811364, 359875006, 359940107, 359956546, 294944778, 359989302, 115769451, 50659334, 71483394, - 360023999, 360122661, 360171814, 134103399, 360269076, 360319271, 2196032, 360416785, 360450344, 61800471, 360515881, 360565034, 134168800, 360630571, 4653656, - 126435344, 360808458, 360826575, 318783528, 360859948, 361037834, 148062227, 361055148, 5865572, 361120181, 361152566, 45023274, 297222186, 361186242, 24297570, - 361218058, 361234744, 361267801, 361300034, 361334249, 361381900, 361398282, 358514728, 361415115, 361463906, 8390957, 361496660, 361529454, 361564462, 361679151, - 361761072, 361810225, 361873439, 361889794, 361906179, 361922572, 195690511, 361938963, 361955350, 361971714, 47120389, 361990450, 2015258, 3162154, 48480296, - 362070031, 2196057, 362086443, 362119234, 362153518, 362201109, 119226390, 362613044, 362692637, 362709839, 362741770, 232980534, 128286786, 362758603, 204537877, - 362807395, 362840956, 362891335, 3212608, 362940725, 363020968, 22216716, 363054056, 363102220, 363118598, 356761642, 5866434, 363135859, 117901622, 238551474, - 124864823, 363219256, 363364409, 118079500, 363383097, 363479099, 363513240, 363561485, 225181722, 363610580, 45433744, 363645242, 191053860, 363709795, 2360167, - 117424185, 363773971, 363790373, 2342943, 363809083, 364070041, 364118863, 364150901, 47120387, 364183568, 364200696, 364235068, 127025154, 364382525, 56164373, - 364448062, 364544459, 364593168, 364611903, 2197310, 296354755, 364642347, 364675131, 364710208, 364757023, 335151146, 364773388, 2130953, 364792129, 364871710, - 3244546, 364904502, 364937262, 364988738, 365037891, 365136196, 44597250, 365168965, 365346847, 50266154, 365365574, 125239324, 365445579, 365494372, 56492038, - 365527936, 365576223, 365593207, 7094719, 365627719, 365674527, 126287898, 365690906, 184549388, 365709640, 365805999, 365838756, 365873481, 365939018, 11042946, - 366036140, 1769529, 366084320, 366116883, 48545808, 366133308, 366217547, 366297098, 185417770, 366313482, 366329885, 44613638, 366346269, 366363083, 366414156, - 366610765, 366772278, 2195532, 366805521, 366837847, 232292373, 111149087, 6373915, 366886941, 366905678, 207126538, 113115146, 366116883, 367020367, 150913046, - 367067737, 252297440, 367102288, 1917504, 19267605, 367214651, 367247811, 367282513, 5310694, 367364434, 342608211, 246464551, 367427586, 367443974, 47120405, - 367462740, 131940389, 367528277, 367591440, 294535180, 367608926, 137379846, 367657066, 367741270, 214303944, 367790423, 8389930, 367905112, 140247574, 367970649, - 368036186, 368150875, 368197670, 173113375, 368214038, 177324034, 262062106, 368230402, 117424157, 368246865, 368281948, 368494941, 368558090, 368574548, 368607270, - 2146331, 368624768, 368672873, 368707934, 368755613, 368837075, 368888159, 368936569, 45498408, 368984102, 2197025, 369001844, 369049687, 369098818, 369133920, - 369248609, 369328487, 121339914, 369362809, 369410091, 369442918, 2195585, 369475603, 369491990, 2196418, 369510754, 11059332, 369559907, 135823426, 369608009, - 369655827, 114114597, 369672230, 160759846, 369689516, 369756516, 370002277, 370050649, 240943134, 370098776, 145293328, 370133350, 370262045, 245350416, 370278446, - 5325100, 370327694, 6373811, 370362727, 370425898, 370442306, 7733770, 370475545, 370540603, 370573343, 46514202, 370589752, 370622551, 370671635, 370688021, - 370704386, 370720787, 31424550, 370739560, 370851866, 370868312, 120258588, 370903401, 370999334, 159547423, 371018090, 371100011, 129876205, 17220498, 371212314, - 50479135, 371231084, 371278584, 2670623, 2195990, 371312661, 371343372, 371359782, 226951206, 371376144, 109035535, 371394925, 371657070, 371802131, 371819028, - 371867688, 141541402, 371884044, 2850842, 179994646, 371902071, 371965994, 2637836, 371984162, 372017519, 372214027, 372262092, 372312432, 372391948, 372410737, - 372473963, 16597593, 168706272, 372507663, 372556911, 372589451, 372654101, 128319510, 372672882, 372752406, 372769020, 372802932, 372853107, 373049716, 151994390, - 373115253, 373164406, 373293570, 373325883, 209338370, 373359555, 373410167, 10371209, 373492088, 373587984, 178814992, 19267622, 373604404, 111624204, 373639545, - 373721466, 373885307, 5669800, 373932044, 373948516, 107757570, 373981215, 319619082, 373997620, 79757349, 3899993, 374032764, 2196216, 147243074, 92749826, - 374114685, 374195220, 50135041, 374245758, 374311295, 374194195, 374376009, 374457238, 374507904, 374571944, 374604834, 291094591, 374638977, 374704514, 374767645, - 374784012, 374800410, 110412423, 374816787, 114409494, 374835460, 374898700, 374915108, 374931478, 233734156, 374950275, 113247603, 193134630, 375145600, 375196036, - 375259241, 17006604, 183189533, 375292751, 375326041, 375359020, 375392645, 375490586, 375537695, 15073299, 207291422, 375555166, 375603237, 375619590, 375636270, - 375668764, 375685132, 375701530, 189513766, 375720326, 50135061, 375785863, 375816202, 375832692, 86081552, 375851400, 375996439, 10944521, 376015241, 376274997, - 376307714, 376324133, 146767874, 376341637, 376392074, 376438786, 376457357, 376504814, 68257097, 376537114, 376553474, 45875221, 376569858, 158253112, 376586266, - 376602708, 214319161, 376635413, 376652079, 376684601, 376700940, 376717341, 376733698, 4964362, 376751411, 376799258, 376815618, 376832010, 376848415, 222281764, - 376867211, 376930306, 376946714, 376964062, 377014668, 377094200, 377129357, 377192458, 377208834, 377225237, 6455332, 2130223, 377241605, 38879234, 215187487, - 377260430, 377323522, 257638426, 377341516, 377389359, 377421843, 377438230, 377454594, 377471002, 377489807, 377521785, 214319114, 377571728, 28147738, 377620881, - 377668652, 377719186, 377798693, 377815062, 168820776, 285343783, 62341142, 377833875, 377929953, 144982056, 2408454, 377962997, 377995287, 378011670, 378028041, - 378044432, 378060816, 378077225, 378093703, 378109959, 378126364, 378142721, 79102068, 7307306, 378161556, 378273794, 378290186, 378306572, 251527174, 378322975, - 6127644, 378340218, 378784150, 378962012, 378994991, 379028321, 379062679, 379174918, 292110339, 344736273, 379192190, 379224090, 379240451, 379256844, 2162730, - 379273222, 379289621, 324567056, 379308440, 379373471, 379437163, 111132703, 379469855, 379486218, 2147249, 379503114, 379536206, 379601975, 379633702, 379650102, - 379685273, 379799962, 379881883, 379947420, 379994178, 380029341, 380078494, 380125210, 380141570, 380157967, 380174358, 380191638, 380240305, 380273119, 153190929, - 380305420, 380324255, 380373408, 380502126, 380534812, 380551184, 52723722, 380570017, 380633109, 380649484, 380665866, 380683433, 380717474, 380799395, 380848548, - 380995176, 381060467, 381091842, 129466408, 381110693, 381157397, 77709314, 381173772, 381192614, 381255739, 240582761, 381288486, 1949712, 381304838, 74072079, - 381321235, 381337638, 381354050, 381387223, 381421991, 381618600, 381700521, 381733290, 132808723, 381812748, 381830875, 45498384, 50118694, 381864363, 381976683, - 382009356, 4030483, 156123195, 204996624, 382025749, 59228186, 382044588, 382271500, 382288632, 382320670, 382355885, 211189762, 382402588, 56131596, 382420720, - 48480272, 382452974, 291160100, 382484561, 110216222, 382519726, 382634415, 382683568, 382730306, 180437030, 382765489, 382812736, 382847410, 382962093, 318717958, - 383009071, 383041602, 207142922, 383076787, 383288627, 177324034, 383336464, 56557594, 383353794, 2130352, 383385659, 344736375, 383420852, 383483926, 126042140, - 383500347, 383533359, 383568309, 6438934, 383631791, 383664149, 3473430, 383680524, 383696936, 47120441, 383713292, 133546091, 383732150, 383781303, 383844378, - 383860755, 138625026, 67059752, 384256441, 384338362, 384403899, 384534972, 384614438, 68241211, 384631982, 384697080, 384729153, 384780733, 384893463, 384928190, - 384975695, 214368277, 385010111, 385107584, 385155091, 147423269, 385171993, 385239488, 319701021, 20365354, 5865531, 385303057, 147423269, 385336665, 385370561, - 385452482, 385499235, 385531964, 385613905, 385646598, 20365334, 385663068, 20365333, 385698243, 385843310, 385875984, 2261034, 385893674, 381124614, 385944004, - 386008002, 386039814, 386056197, 386072660, 386107845, 386173382, 386252853, 154763735, 386285640, 386353607, 386402760, 73187370, 386449467, 115294230, 386482263, - 7734475, 386533833, 386613678, 386664906, 216466956, 884743, 386730443, 386778101, 386842729, 386877900, 386926528, 25560002, 387006494, 387039292, 387121167, - 5308641, 387138669, 387170319, 171000753, 387187159, 387219543, 2360640, 2195481, 387271117, 387399687, 387416182, 387448848, 2195982, 387465259, 387498060, - 148637217, 387533262, 8391119, 387629106, 387661836, 2195674, 387678432, 8391120, 387711447, 387744174, 387794005, 184860710, 387825756, 387860945, 158254070, - 387942866, 388024787, 388071515, 388106708, 169232853, 388139478, 388236327, 388303319, 388349962, 116376232, 388368856, 388581849, 388710412, 234848282, 388729306, - 388811223, 2260994, 388857910, 2197979, 196854261, 388893148, 388939883, 388972572, 367067195, 388988938, 389005354, 41091078, 389024221, 389137905, 389169206, - 377241626, 389204446, 389286367, 389333032, 389349378, 148602918, 389365800, 17006620, 389382603, 3228162, 389433824, 260620297, 389693716, 389728737, 389792046, - 389824552, 389840908, 6946842, 389857334, 220987418, 389890467, 389925346, 390086696, 318832669, 390105571, 390135827, 27607042, 390153207, 390220260, 390348910, - 8391141, 390381631, 390416643, 318767147, 390480678, 390513602, 390545464, 390578215, 2197990, 390613479, 185319445, 152946601, 390695400, 390922256, 2197422, - 4980752, 390941161, 6373600, 391006698, 391072235, 391121256, 2196510, 391233552, 391252460, 391299093, 391315458, 5767206, 391334029, 391381013, 3178518, - 391399917, 391645678, 391727599, 391824120, 251593181, 282853386, 391858164, 391924208, 293371915, 146767884, 392069122, 132792331, 172837361, 392088050, 392151071, - 5505034, 392169971, 392265740, 204619781, 392283797, 392350196, 392398555, 392431194, 392462374, 54493186, 392478789, 392514037, 77709343, 392610552, 392642562, - 17006603, 392661494, 392937769, 392970242, 392986655, 393003046, 393019394, 393035804, 121896991, 393054078, 393084940, 393101323, 393117727, 393134514, 6733845, - 393167766, 393216042, 393232410, 393248770, 393265181, 137576450, 393284087, 393314316, 393330714, 121929734, 393347082, 393363458, 2801675, 393379896, 393413142, - 264159258, 393445407, 393461770, 393478156, 85098508, 393494550, 210042911, 393511825, 393560076, 393576477, 18399260, 128892966, 99516428, 393594058, 393642849, - 393674818, 393707744, 393740330, 393756698, 393773058, 393789455, 393805846, 393822640, 393854978, 393871375, 393887766, 393905046, 393953282, 393969667, 52346882, - 393986058, 394002473, 394018832, 394035226, 394051595, 394067970, 393494549, 394084417, 394133546, 394150320, 394184775, 394231819, 394248223, 394264586, 394280972, - 394297350, 143441939, 394313774, 394364292, 54460453, 394428428, 394444826, 394461215, 44908546, 394480120, 394543126, 394559490, 394575882, 264405023, 394592287, - 394608659, 394625327, 128991258, 394657830, 394674188, 394690579, 394706984, 394723366, 30343227, 394740895, 394772910, 148733990, 198328339, 394824185, 394871655, - 394903578, 394919947, 394936322, 394952723, 394969100, 5701672, 394575878, 394986048, 395019373, 395051020, 213319709, 395069946, 395182121, 2670604, 395198495, - 128057356, 395214867, 395231272, 121929754, 395247618, 395264021, 395280415, 394067974, 395297239, 395329557, 395345942, 225427468, 395362325, 65699852, 395381243, - 395445238, 395477014, 264093706, 395493402, 395509776, 218841114, 158811323, 32849922, 395528700, 395608163, 395640853, 395657247, 395673824, 395706370, 395722762, - 395739142, 33112086, 180600941, 140249557, 395758077, 396052913, 10829846, 396100075, 396134910, 128336632, 17219688, 396215153, 396263455, 396279827, 50266134, - 396298751, 23789705, 396542094, 396574815, 396624905, 396657174, 117014554, 396689711, 2197525, 396722222, 396773888, 396820526, 396869653, 396886035, 320897046, - 396904961, 396967962, 396984351, 397000714, 119259178, 397017113, 397049922, 397082645, 130285589, 397100062, 397134338, 397298179, 397380100, 397443118, 397492311, - 397543743, 397574251, 159432741, 397607215, 6373890, 49086466, 5341243, 397639983, 397672458, 397688874, 252100630, 397707023, 117901829, 397754839, 397788049, - 397836309, 397852693, 127680524, 397871622, 397969927, 398098434, 398115931, 398150152, 398262435, 398297609, 398377026, 398412298, 398674443, 398753830, 2850854, - 5308938, 3212226, 398772748, 398854669, 232195214, 152354858, 398903822, 398952975, 339296287, 399018512, 343539733, 399097896, 399114242, 399130662, 399147483, - 399182353, 17842283, 8391186, 299794472, 399264275, 399313428, 52723754, 399378965, 184926218, 399425567, 131891226, 399442860, 7143480, 399507468, 3245147, - 399524295, 324567066, 399573030, 399590312, 399624726, 399690079, 399737333, 399769646, 6127626, 399818758, 399835151, 52723734, 399851560, 3227714, 399870487, - 5326707, 399936024, 400000030, 400032777, 400065797, 400130478, 153191031, 400181785, 2196871, 400458328, 400493082, 400638391, 178815016, 400671606, 400736268, - 400755227, 121110564, 400802846, 400837148, 400902685, 401014877, 382402588, 401066526, 333135924, 66945029, 401179055, 401211499, 84738074, 401244270, 401276994, - 401309708, 401326173, 401375254, 55853072, 401392153, 401458206, 401491113, 140247103, 401523521, 401555515, 401588236, 3178533, 401607199, 401656352, 401784858, - 401801242, 176177206, 51101698, 6946898, 401820087, 401883162, 8390561, 401902113, 402014231, 402030615, 402046988, 8994823, 309018650, 402064120, 402098722, - 402145282, 2031626, 6701113, 402161701, 402179081, 135102506, 402210923, 402246179, 332761591, 402328100, 402392866, 402424695, 402456718, 6324236, 402491941, - 402540727, 2129961, 11157525, 403097614, 403144770, 403177994, 403211173, 403243010, 2523164, 403261992, 403326369, 403376681, 122110361, 2196029, 37208197, - 403819050, 403914812, 370720806, 403997141, 115179546, 111067162, 404048427, 404111470, 404144212, 188940307, 404179078, 118884908, 404226050, 2850858, 404245037, - 2342940, 27623851, 404341802, 2933207, 17137695, 404439887, 404472821, 404539950, 24838181, 404586498, 315686994, 404603640, 404638255, 404160514, 404701721, - 287244316, 128453168, 213630982, 404767733, 404834865, 404897830, 372605820, 5062751, 404915605, 404963387, 7733347, 404998706, 405045485, 112754704, 405078032, - 319930802, 405097011, 405225538, 405259466, 405307418, 7733675, 405323807, 405340181, 307298326, 405356554, 398753820, 405373012, 2195978, 319930799, 405406971, - 405454864, 144621594, 118884916, 405471335, 382484588, 405553190, 4997229, 269664558, 405572149, 405670454, 254443526, 405815336, 405831690, 1933322, 405848535, - 405883447, 405932600, 405962809, 361988138, 200720396, 405981753, 131612681, 112197670, 406063674, 406194679, 406224917, 406241296, 406257702, 406274064, 406290474, - 406306847, 42434566, 302121420, 406325819, 406407740, 296961647, 406569012, 45613062, 384729172, 406601794, 406637117, 406719038, 406899263, 406995048, 407046720, - 320585749, 407095873, 407191562, 25559999, 407210562, 407373965, 407422754, 407454221, 407503862, 407537089, 407569417, 407601215, 407634999, 407666699, 6602758, - 407683112, 310591547, 407702083, 237683146, 407751236, 407816773, 407978584, 408010847, 408062534, 45498370, 2359298, 408095179, 408142504, 408174895, 408207447, - 200736825, 408256534, 408272908, 408289291, 138641866, 408305695, 408322058, 408059946, 408339296, 408404490, 8390812, 408439367, 408485890, 408502278, 408518687, - 408535479, 408568410, 408603208, 118194186, 408698902, 408717631, 408748044, 408764442, 408781407, 324567071, 408816201, 341983701, 408881738, 408977835, 77250572, - 409010178, 117424149, 409027014, 409059366, 409075728, 143654943, 409094416, 409141335, 409193035, 409307636, 2195882, 409354711, 409387045, 4751381, 409406028, - 409684557, 409780246, 269107266, 406357022, 409797099, 409832014, 409879003, 307150854, 409911380, 409946703, 48676901, 410026876, 316637718, 410077776, 410189846, - 254592009, 191070220, 410206220, 4571167, 51937311, 410222658, 410258001, 410354556, 8389516, 410402828, 128892959, 410420118, 410468378, 410484758, 410501122, - 410517510, 46694406, 99893277, 84934687, 410536530, 117424169, 410602067, 410666947, 410714122, 410730538, 410748005, 2129979, 410796877, 44531734, 410845643, - 410895228, 410946132, 410995285, 411222592, 411254796, 411272345, 411320326, 381157397, 158812758, 411337183, 122683413, 411369488, 49496121, 411388503, 411437656, - 411568729, 411729936, 411746342, 122683421, 411762719, 122732573, 3850268, 411779100, 411795494, 191610911, 411814490, 164036626, 7389187, 411912795, 411978332, - 115785749, 412041228, 307298330, 412060253, 412106764, 412123896, 412157369, 412205082, 412221471, 2261004, 2130347, 412238097, 412270594, 412287002, 147423261, - 412306014, 119359266, 412650079, 412713378, 412748384, 412893604, 412925992, 412942342, 54460437, 412960513, 413007926, 297418788, 46694442, 413043297, 413108834, - 413171728, 224935946, 413190755, 413237254, 297205775, 413256292, 191070210, 374030348, 413401990, 413433877, 343605274, 413452901, 413517461, 413583974, 413664265, - 413698663, 413764200, 414007312, 414023720, 145506314, 414040076, 3228087, 414057361, 414105824, 115785734, 414141033, 4292662, 414221619, 414269471, 332103690, - 379109807, 414285843, 226951205, 414302230, 414318623, 208093210, 414334992, 414351386, 2933734, 414370410, 414482442, 414498858, 414515232, 414548503, 414580776, - 414597146, 2197354, 414616171, 414679062, 414695455, 414711827, 191053846, 414728246, 414760971, 414779228, 414844505, 414892054, 129024962, 414908503, 414960236, - 415025773, 415236180, 415268880, 415285276, 181667354, 415301644, 337857051, 370573328, 415320686, 132432332, 415367204, 415383562, 415399964, 415416322, 415432732, - 415449114, 151748649, 415468143, 415678883, 415711244, 48021530, 415730220, 415760396, 415776784, 122683402, 415795824, 8389011, 416270961, 416402034, 188762739, - 8389308, 8391284, 2195794, 2195714, 56311834, 416514585, 416580053, 416628762, 115196336, 416647797, 416694356, 416729718, 416792633, 235028511, 47366146, - 147063746, 416809807, 416844407, 416908073, 416940091, 416972859, 147423268, 417005599, 4343129, 417021998, 2198136, 417071120, 137101536, 417087580, 93962271, - 417120310, 319832499, 417155705, 417300511, 42434586, 417317296, 417349678, 417401466, 417448239, 417481877, 73187338, 417514142, 417548709, 417595616, 417630843, - 417759339, 417794684, 417873946, 417890306, 153026570, 417907319, 50511894, 367607862, 417939458, 65896474, 417957031, 418005046, 418037853, 418086971, 418122365, - 418220670, 116867990, 418283607, 334185672, 8389804, 288620573, 418335359, 418431576, 418466432, 418546324, 418578451, 418594825, 36716681, 418611211, 418627721, - 418643980, 418660486, 418676871, 83918890, 418695809, 418824460, 418873501, 418908802, 354697239, 418971917, 8391299, 113115159, 419020915, 419037207, 2523167, - 7405700, 51789958, 419056260, 151765029, 419577990, 67059849, 419596933, 419809926, 45907987, 1769508, 163643831, 419859079, 419924616, 420036618, 420053034, - 331334579, 420069679, 385026534, 420102165, 420121225, 420186762, 420364395, 385286154, 2015248, 420397363, 420432523, 420774291, 169443465, 37208197, 420825740, - 420907661, 421022350, 421134364, 131336350, 421153423, 122126905, 421396496, 2197422, 1769488, 421412866, 421429269, 216465803, 421446090, 6374485, 421481104, - 2195939, 421563025, 175669264, 421626315, 421675010, 421691499, 262684710, 421726866, 421789999, 192200735, 421823311, 421857316, 421907091, 422002700, 422020255, - 1933341, 5177375, 422054548, 422218389, 422264844, 46530602, 422281319, 422364180, 422414522, 118210600, 422445087, 422463988, 422513302, 422562455, 422642825, - 422690868, 275185683, 174080066, 422726296, 422840985, 422904303, 65880085, 422936592, 422952986, 3228119, 422969387, 423002169, 348635148, 423018533, 423034896, - 2752527, 131776980, 47317029, 423053978, 423316123, 423395434, 4997799, 423478281, 423512732, 2834537, 423642035, 423673915, 423707757, 423740236, 169967638, - 423788556, 423804959, 48676874, 423822121, 423854519, 423886850, 423903253, 423919637, 147013689, 423938717, 173490710, 150241296, 424050700, 110248368, 346177995, - 167903291, 424069790, 424149034, 424165414, 36143135, 424182673, 109052775, 424231371, 424282783, 424394792, 424411167, 424427558, 226951197, 293503016, 51314690, - 424445530, 424476726, 424509471, 56262672, 424528544, 424820773, 299813537, 424837186, 424872610, 424921753, 424985740, 425034892, 425085603, 425148426, 425164842, - 425181824, 27443772, 425214431, 233243678, 425247213, 425314980, 425380501, 120258581, 425429669, 425558066, 1933350, 425593510, 425689181, 425740229, 425771049, - 50462758, 425788237, 425839271, 425888424, 425937577, 426150570, 108317355, 426262560, 7733849, 426295599, 176504863, 426328110, 426377226, 426394884, 426459193, - 426475823, 426509411, 426590214, 426606611, 426622998, 426640193, 426674860, 7733687, 426786862, 426835984, 426852358, 426869211, 426902467, 328073254, 426950722, - 426984437, 427049846, 427117229, 427198949, 427248302, 427428527, 427543216, 427589643, 427606103, 427655599, 427690673, 275546122, 365053273, 427787404, 427837370, - 427887282, 427952819, 44662822, 427982941, 359612417, 428034740, 428114391, 428146726, 428163074, 2195893, 428182197, 428361289, 428444342, 428509879, 428556290, - 54460453, 428574225, 428608184, 428640953, 162791462, 428769296, 45465638, 428787311, 428835752, 428867594, 428885001, 234930178, 428916795, 190545932, 428951489, - 429001402, 429064623, 429098411, 428015642, 429148859, 429263220, 200720400, 157663234, 429329084, 429623997, 113115158, 429722302, 429771455, 430000186, 7602192, - 430063818, 179716134, 430096855, 181258944, 430131905, 430293017, 430328276, 430358566, 430374914, 430394050, 192200735, 430440973, 430492355, 2198212, 430623429, - 430686626, 75464730, 2342949, 254083566, 430719435, 159760410, 430768130, 267534346, 253526446, 430787270, 430918343, 430982532, 237731861, 431049416, 431147721, - 138575877, 383402050, 431213258, 431276042, 431292875, 185319430, 431344331, 431423534, 431472697, 431489055, 431505903, 431538235, 119226394, 431573708, 8389516, - 431652874, 320307242, 254345227, 125583799, 431669250, 17842985, 124796930, 431688397, 431850794, 431901390, 432016079, 432095261, 432112263, 135824393, 128974869, - 432161290, 432196304, 432275887, 25559999, 121929734, 432308725, 252117004, 122568723, 432340994, 432357402, 55754781, 118031272, 432373819, 432406554, 50937887, - 432423215, 3735659, 432458449, 432786130, 432996371, 433013583, 433045530, 121339910, 433062768, 161628170, 433111080, 433128233, 75530280, 433161039, 433195731, - 20365314, 433242114, 280903706, 2162717, 46530572, 2147191, 433258562, 433291274, 433307669, 433324072, 130285594, 433341998, 433392340, 433569815, 206668046, - 61800471, 433588949, 433635340, 198721546, 433654486, 433700880, 433717286, 48054301, 6373807, 433733678, 433783339, 433815578, 433831938, 2326538, 433851095, - 434061338, 434077999, 434111311, 293044276, 2015244, 434143313, 434178252, 385370840, 434211545, 434275741, 6422530, 434323487, 434342618, 434391771, 434520873, - 434552874, 2850818, 170803232, 1785882, 434571996, 434618394, 168935453, 434634803, 61440012, 434667566, 434716717, 55853097, 434752221, 150536952, 434848203, - 434899678, 159301670, 434948831, 136118356, 435027984, 435047136, 20365338, 435093558, 435129057, 435224602, 131334273, 435243746, 51855401, 113246432, 435391203, - 178078184, 435470362, 385875999, 435489508, 168821583, 435587813, 338133019, 317836006, 435683370, 47710218, 27624369, 435700830, 435750619, 435781647, 2195891, - 435800807, 435880002, 435912714, 32849941, 435929126, 435945510, 163643451, 435962145, 296026196, 435997416, 436325097, 384632157, 436437044, 134840326, 436469776, - 436488731, 33392154, 436538090, 436587243, 436652780, 45629478, 436765560, 24297867, 436814284, 5309002, 186466358, 436849389, 437062382, 437108767, 437125130, - 294633501, 437141998, 437177071, 320634882, 437240771, 437288972, 437305356, 294633487, 437321794, 437354926, 437406125, 50266150, 437454100, 437502006, 437534758, - 147063546, 332742672, 437551188, 152027148, 437586672, 437698644, 10652401, 437731850, 437766898, 49774614, 437829716, 437865203, 135168016, 437963508, 438029045, - 438078198, 438127351, 438225656, 438289276, 147407370, 438340345, 153749422, 8390714, 438520570, 438617027, 438665228, 438681642, 438698047, 269107266, 438733563, - 438812698, 438829058, 438845455, 5505039, 438864636, 252116994, 438943803, 149129981, 425082946, 438979326, 439009320, 439025685, 439042070, 439058434, 439074837, - 439091206, 246087685, 439109108, 439156776, 115785740, 439536384, 131334720, 439665971, 439715418, 439749377, 180437018, 439796472, 439830467, 439877658, 439894028, - 108625977, 439913218, 440060675, 440141217, 440191748, 440238111, 141836314, 440255374, 7733770, 440320303, 440353903, 13074434, 440385602, 440421125, 440598633, - 440632320, 440664080, 65912863, 440680532, 440713227, 138575877, 440730536, 8389038, 224935942, 440765190, 440928628, 118882358, 440991831, 2195598, 441040917, - 441057310, 441092871, 5310042, 441191176, 220758073, 260964436, 441287755, 441352202, 319602710, 441368592, 6717478, 441385948, 441418031, 3738377, 441451021, - 2195680, 441502474, 115294234, 441649931, 6602778, 441712656, 441729784, 50511893, 441499664, 441764620, 441958440, 29622301, 441975243, 168722442, 442023972, - 287113245, 1949727, 442040623, 442074609, 442105894, 442122271, 52723731, 442138666, 442155030, 442173218, 442204172, 170803831, 442221019, 442256141, 442318870, - 178962472, 442335292, 442419982, 442469135, 306774975, 442548251, 442583519, 150536297, 442632976, 442731172, 442796817, 2162714, 442925164, 237731878, 8388676, - 6995970, 442960658, 52363269, 277725226, 443058963, 6422540, 443187634, 443220898, 443253195, 443304724, 443550485, 443632406, 6193192, 176488485, 443665175, - 443728172, 443760706, 443794009, 3227678, 443829016, 443910937, 443991044, 444058394, 444137526, 2801721, 115851276, 444170543, 444203010, 140788391, 444222235, - 444301912, 275316762, 444334120, 444350476, 8390040, 444369692, 444612634, 444629024, 444663717, 444743708, 444760090, 15073296, 110247986, 444776532, 44171306, - 444811764, 444858427, 444893981, 444989533, 126877707, 445039194, 445073431, 445123358, 445169751, 445221663, 445497350, 445513747, 445530134, 50315280, 445547730, - 61456400, 445579696, 445614880, 5865556, 445678199, 445710358, 135905292, 445729569, 52756518, 445809325, 124863311, 445860642, 445973240, 347669372, 350633996, - 446008099, 48545794, 446055822, 446121420, 446155556, 446317589, 446368549, 437370911, 446447644, 290996264, 446464012, 383483914, 446483111, 446529548, 148357158, - 446547029, 8390247, 446578754, 446613562, 446677046, 446712473, 446777530, 446809577, 446857761, 140247561, 446906406, 446922783, 185975255, 446939167, 446955530, - 13549578, 446971935, 352092170, 446991142, 447299600, 447316008, 137102366, 447335207, 447414731, 430931998, 8391464, 447463505, 428883987, 447496232, 447512633, - 47038466, 447531817, 447627269, 67059748, 447643658, 2326544, 271925264, 348635167, 447660098, 291143682, 447692841, 447709268, 447744810, 447823903, 447840266, - 111214649, 447859499, 4997222, 147243062, 447938572, 318832666, 447955025, 447987750, 316621647, 50249738, 448006956, 448169164, 448217980, 418054251, 448269101, - 448348191, 3211698, 403947522, 329859126, 448364598, 77512744, 2834498, 154665023, 448397399, 448446474, 448462890, 177111062, 448479265, 448528413, 448544799, - 49790988, 448561174, 448577538, 6602809, 448596782, 448660374, 448711471, 2293772, 448807779, 448856066, 448872463, 448888834, 125796362, 448907450, 448938024, - 448954434, 448990000, 189071366, 449232942, 449282993, 449315287, 49086486, 449348121, 449413800, 449445900, 2195509, 2196454, 449463285, 449529540, 449593375, - 449609734, 1769503, 449628977, 110215639, 449691714, 55263248, 449724719, 449760050, 125927427, 449839463, 449871912, 118882370, 449888315, 449921483, 449970177, - 84934696, 449989427, 450134056, 4309419, 450153268, 450297878, 6406180, 450317109, 303579174, 450380623, 450412582, 86327334, 450431798, 450510904, 450543626, - 221806623, 450560066, 450592850, 450628407, 440811532, 450674772, 450707915, 450757417, 2195536, 450792248, 450890553, 450972474, 451248223, 451297517, 451332233, - 451413593, 2130865, 451463995, 2195561, 451562300, 120045770, 451625423, 451657771, 451690506, 262078485, 451707913, 451742525, 34701713, 451873325, 451969455, - 452002326, 2195612, 452034619, 193871882, 452067788, 452100633, 452168510, 45039642, 452231669, 452266815, 452447040, 212731873, 452509737, 55197737, 452526507, - 452558860, 147423258, 452578113, 452873026, 452902928, 452919312, 14745638, 452935720, 452952073, 452968464, 452984837, 453001226, 453017610, 1212452, 453036867, - 49742455, 367476742, 453099607, 195215381, 453151556, 5866526, 453214229, 117506285, 453233477, 5324863, 453312538, 453328927, 294060044, 453345751, 453378135, - 453429051, 453476779, 453512006, 453607891, 453656618, 66371615, 453674014, 275791900, 453705782, 290406416, 49790992, 453741383, 453870831, 453905224, 453970761, - 454036298, 454099031, 454150987, 454197364, 454213670, 454230045, 454246406, 454262826, 454279284, 454295590, 454311965, 99844117, 157646869, 454626125, 454656037, - 307134502, 454672405, 56246293, 454688902, 454705282, 2195668, 1196053, 455148435, 455199567, 455248720, 455360714, 455395797, 455428945, 455557220, 455589904, - 127713290, 5325647, 455609170, 455740243, 455819348, 348602383, 455854932, 455969621, 242368518, 32849956, 456084310, 456131031, 385515586, 456163340, 5868006, - 456182615, 456477528, 456524234, 2359727, 456559449, 456622960, 456674138, 456737758, 456786882, 24298434, 137052172, 456819912, 456851515, 66945050, 1769509, - 424230971, 456887131, 456949762, 456966170, 116228125, 456985436, 457048076, 457064486, 254345227, 457083741, 457116510, 457211972, 153190847, 2195538, 457261963, - 457328871, 113115147, 457425747, 457493343, 47923222, 25559079, 457539624, 46530581, 457558880, 457673569, 457739106, 457821027, 457998830, 7045151, 269664778, - 458031163, 458063893, 458080310, 458113050, 48021515, 458129410, 458147241, 458178987, 458212499, 458244101, 56721410, 458263396, 458345317, 458443264, 458489922, - 458525542, 458720407, 5324881, 458769896, 235765798, 458817548, 3227872, 361054210, 458833986, 324453467, 458866707, 158221367, 458885991, 459147798, 2130414, - 459213672, 459311977, 459376478, 341984558, 154469545, 459440194, 459472937, 389840912, 459492202, 429673323, 459688812, 3555330, 459819166, 459850329, 459885421, - 5505046, 438240194, 459948044, 2195756, 459967342, 237830175, 460065647, 460210258, 460242974, 460278640, 460327747, 460390459, 118472706, 460426097, 114606118, - 460537910, 460570681, 248840223, 460587068, 460671655, 2195512, 460721010, 460816621, 460849163, 110215586, 460867252, 460950387, 461062154, 166314026, 461081460, - 113115736, 461275617, 461324747, 461373582, 461407604, 461456263, 321863711, 188809275, 461504524, 134169691, 461523829, 461622134, 2198391, 461720440, 212959234, - 401834014, 461769593, 461946902, 327483404, 458244101, 461963303, 7307274, 142589990, 461998817, 2132858, 462094348, 312393756, 462113659, 462275051, 462309237, - 290996245, 462372886, 109166613, 124862952, 462392188, 462503948, 462521334, 44908556, 462556029, 462602262, 462618629, 462635020, 462651423, 27852842, 130580482, - 462667807, 6455338, 462685173, 462751489, 462801790, 462913548, 349388802, 292766156, 110249440, 462930261, 462982015, 463047552, 463111036, 25559138, 463162241, - 296960054, 463274443, 463326082, 463424387, 2196979, 2834540, 463488372, 463539076, 463601727, 238551139, 463636318, 372327160, 463701444, 463735197, 464145286, - 464309127, 464420902, 234176540, 464437390, 45039656, 52363285, 55623711, 464472968, 464685961, 464732244, 464764938, 4390931, 111624197, 464783877, 464830767, - 80936966, 464863254, 464879642, 464896016, 464912424, 464928810, 24838166, 121651202, 464946345, 154796141, 464979144, 465013642, 465092620, 5488652, 430686229, - 465109008, 59375642, 465125398, 465144715, 465257254, 19841060, 465289272, 465321986, 5505061, 3230604, 465338380, 304627714, 465354764, 148636125, 465374093, - 465456014, 465535007, 465551441, 465585652, 465635913, 465698909, 465748067, 301006858, 465780795, 369623056, 465816289, 2523158, 465914767, 275464202, 3211695, - 466013072, 466158047, 466193297, 27623505, 466289558, 466340754, 466419722, 48513045, 170803293, 185483701, 466439059, 6898497, 27607050, 41582602, 466520980, - 466698306, 466732062, 466764822, 466813231, 466845762, 466881429, 466930582, 467058690, 467076086, 467107947, 467143575, 467190285, 467238924, 65896486, 467255388, - 467288076, 117751848, 87916575, 467304460, 184713247, 467323800, 467372953, 467484779, 467518664, 9551874, 467550210, 145145882, 6324236, 467569562, 237257837, - 467747295, 467781009, 467848091, 467910749, 467960744, 409829442, 467995548, 468058193, 468090901, 44613653, 468107266, 112936251, 468124185, 136101990, 468192157, - 468271110, 468287509, 191070248, 468304303, 468339614, 468388767, 163594347, 214564930, 468533264, 27246608, 173490235, 468552608, 468697119, 168820738, 468715550, - 468763161, 468828207, 2195533, 468860930, 110249520, 468879638, 163315794, 468962209, 469060514, 469107768, 45613082, 469172695, 469205463, 195264524, 469240739, - 469319699, 469336086, 272908298, 469355428, 427720735, 141852675, 469418521, 469483628, 31424533, 469519269, 2198438, 469617575, 29769730, 51019802, 469746572, - 469795814, 142868511, 469829818, 6225936, 469863336, 469943929, 469991855, 470027177, 308117506, 49905721, 470368293, 470384652, 10371129, 470404011, 470485932, - 136118331, 470829997, 392544294, 470876226, 184386450, 470909961, 470944686, 188874764, 471010223, 471157680, 225181734, 471236667, 471272369, 325238850, 471436210, - 293421082, 471518131, 471564347, 471599812, 29769747, 381665296, 49774613, 471630995, 174424066, 471665588, 471780277, 309624848, 180207628, 165134357, 471960502, - 472006667, 124403728, 472023106, 22216709, 472058807, 472206264, 180404226, 472288185, 472368072, 472452026, 472613378, 472646169, 472712864, 472743976, 244891670, - 472763261, 472809538, 191545354, 472843177, 472891833, 472943547, 473025468, 473204010, 473251842, 17809434, 473268256, 260063316, 473301038, 163595294, 118882767, - 346538043, 473353149, 216449545, 473415783, 473498026, 473530378, 473547383, 473582526, 473631679, 1917026, 473743819, 162660373, 473795520, 473973900, 474021940, - 474054682, 474071062, 77709328, 474090433, 287145995, 474188738, 474254275, 474367274, 474415160, 474450884, 474500037, 474578970, 474071062, 474598342, 468452193, - 474646011, 474696647, 474825652, 474891185, 474923018, 474942142, 474991560, 475054539, 475103286, 475137115, 475170209, 475220937, 2198474, 475270091, 475431857, - 475464908, 475512863, 475529818, 7733291, 475562006, 238714892, 475578434, 464783846, 475611238, 475644372, 475676694, 2162730, 475696076, 475841457, 475874198, - 475922442, 282036094, 475940009, 185417770, 266765206, 128974858, 475974605, 476054105, 476086282, 306774145, 476102668, 200736789, 476512765, 476564431, 476839995, - 476872788, 476905478, 294371349, 476923178, 318144528, 476971609, 477004738, 477036598, 477069314, 477085725, 60719120, 477102082, 2195574, 477121488, 477185331, - 17154079, 477233198, 4998235, 477283196, 468304886, 477334481, 150585376, 148357136, 477431117, 47546394, 477496161, 477531090, 477759402, 477823076, 477855828, - 477888524, 477907923, 48136194, 2342940, 477973460, 478235605, 478332695, 478380072, 472743948, 478396941, 478448598, 478511163, 478543898, 47120421, 478560715, - 478609427, 2147780, 478626283, 478661591, 287244325, 478740492, 302055534, 478756874, 6438924, 478776280, 478825433, 478871568, 131891257, 478890970, 478986306, - 479020619, 479071022, 135905292, 3686403, 479133698, 381550629, 479153115, 479235036, 479282895, 479313932, 479330306, 56492058, 479347626, 479428618, 2195519, - 479448029, 479497182, 252298585, 479674427, 479707162, 2359830, 479723558, 479739935, 479756290, 479774252, 137101826, 166428714, 479805506, 479841247, 480070378, - 480116802, 480149793, 480182561, 480217244, 8389364, 480265019, 480313839, 480349152, 480395310, 2129956, 202457401, 480445830, 480512993, 480594914, 480676835, - 152947684, 480854100, 368902195, 480887817, 25559103, 480920905, 480971749, 481051083, 3211724, 481099788, 481116170, 481132554, 45776908, 481149231, 481184742, - 5865577, 481247291, 481280021, 135168031, 481299431, 481461499, 117407775, 481512424, 481561577, 481624353, 481656924, 481692650, 481771622, 481804290, 481820698, - 2408485, 481837115, 481869917, 481922027, 250544144, 482036716, 482181142, 482197537, 482246658, 63817095, 482263078, 482279462, 482295867, 482330427, 482377787, - 482413549, 482574348, 482590722, 48021525, 132154252, 482610158, 2261008, 482855429, 482903691, 482967639, 483019759, 340770870, 483131458, 232374325, 483165206, - 256720912, 483213366, 483247475, 483280262, 483347440, 5309449, 483409997, 483442780, 483786811, 343212561, 483822578, 483934445, 173113382, 483970035, 23363723, - 313245698, 484082601, 484133876, 484230153, 484261995, 484294722, 484330485, 484426219, 372949094, 484461558, 484524044, 441565294, 484542740, 193953804, 484591043, - 484639390, 484674551, 484786221, 343295129, 484819010, 484854776, 484900927, 64275072, 484933698, 153879442, 484967841, 485018617, 485163688, 64765974, 485198205, - 485280762, 115769426, 485326902, 3214331, 485359703, 485409745, 485460988, 485720555, 485752854, 318783504, 485772285, 167005090, 485870590, 485982246, 485998658, - 299008006, 486031381, 352109081, 439746562, 486049275, 486098092, 486146132, 486179295, 486214655, 309723167, 486280192, 486378497, 5799958, 338363215, 404160543, - 2131182, 486476802, 486640407, 325912806, 486706179, 486801429, 486817818, 155533328, 270434320, 204537894, 486834188, 486851029, 486902583, 47038476, 486951940, - 487079974, 487096347, 2326752, 107757574, 487129154, 170705929, 487161915, 487196524, 487227867, 487263237, 487489643, 487525382, 2835430, 487639286, 487689223, - 487768163, 487800891, 55377958, 55377932, 487836680, 263946262, 155779088, 487883352, 487918601, 487984138, 131334673, 488047439, 488079791, 344736265, 488113040, - 488145894, 488177718, 488210451, 488226838, 488243202, 131891238, 488262667, 488374284, 488390668, 69156879, 2179108, 488409588, 44613748, 181175326, 488866216, - 32163586, 488999293, 489081869, 489275660, 154190257, 489325462, 489376782, 16826408, 115769451, 489440145, 170804198, 489489438, 489524239, 489701483, 489734203, - 489766996, 489799691, 357597186, 489819152, 489931806, 322715660, 489963558, 142835750, 489979970, 490014329, 121339930, 490062671, 279904268, 490094630, 490110978, - 148897813, 162499601, 490130450, 490343443, 1933333, 490425008, 117506132, 2998284, 490471490, 490506463, 490586397, 490618934, 118915103, 490651704, 315588614, - 490684875, 490733986, 490766338, 490782758, 1916960, 490802196, 23380541, 491078392, 491110454, 491146261, 7602188, 491228182, 147423244, 2998274, 491291637, - 491357832, 491408048, 491455224, 491488265, 491520042, 491536406, 491552770, 114114571, 491569611, 491621399, 491700683, 4653527, 491750430, 491782190, 491831353, - 46497823, 491847746, 491883544, 223608854, 491963478, 492011532, 115785730, 492027942, 42599247, 492044314, 149569548, 139035887, 492063769, 352518160, 492129306, - 492440603, 492489756, 2197199, 492617830, 492650799, 457706525, 492684297, 492716044, 4980852, 492735518, 492978389, 493014047, 55164944, 493076546, 493109280, - 493142923, 112935945, 282034229, 493209944, 493274541, 493323087, 493355491, 385662998, 493387842, 493423171, 2113573, 493469750, 336789581, 493502483, 243220490, - 493518935, 493568031, 161726470, 493584816, 493618313, 292110339, 493666314, 291110951, 493685792, 493830635, 493864308, 110215928, 493915169, 493961309, 494010413, - 348651547, 494046242, 494111779, 494241193, 494272578, 208764938, 350863376, 494305311, 346488834, 494323483, 494370837, 56557570, 494390308, 349765654, 494453582, - 1917873, 494521381, 494603302, 494734375, 494780432, 261131304, 494799913, 24297696, 494863369, 45613098, 494896533, 494947370, 495029291, 495075435, 495111212, - 495324205, 427098551, 495419458, 495453912, 495502997, 495567370, 495602734, 495682569, 495714370, 495747507, 495779899, 495815727, 495861800, 466485258, 179716138, - 4408143, 495881264, 336724025, 135823426, 496009273, 496025612, 49152019, 115738362, 496045105, 147407424, 55918604, 496157988, 496208946, 496271584, 496304182, - 402309146, 496336922, 496353364, 496389171, 131876079, 496484402, 496519326, 496549928, 496566388, 3309590, 496583178, 884764, 178962442, 496615435, 208896028, - 496634932, 496746552, 496779266, 496795674, 156827951, 277725216, 496812109, 496845720, 496894427, 496927753, 496962613, 497241142, 126746640, 133283842, 497354341, - 497404095, 497434646, 215744548, 497451024, 1918366, 3245167, 497467458, 497500257, 497566959, 497599356, 497650743, 497732067, 497762306, 474071050, 497781816, - 27624457, 497863737, 498139243, 8390102, 498171988, 2260997, 498206110, 498240570, 228376588, 498386518, 498453563, 498519100, 360693786, 498598697, 498630698, - 498647062, 498663445, 414909308, 498679820, 411746306, 498699325, 498797023, 498843688, 498860053, 498876422, 498892809, 37748759, 498910473, 116376043, 498942553, - 498974796, 499008002, 499043390, 499105823, 499122197, 120111721, 499138591, 499154954, 198328357, 499174463, 346177595, 499223616, 499289153, 5324910, 499352011, - 481820682, 499403842, 355729464, 499551299, 499613787, 499646530, 499679260, 126287884, 129876027, 51675162, 499695853, 499728386, 499744794, 499761666, 499797060, - 190644701, 499909035, 499944517, 500173894, 278216763, 500239431, 500370504, 500450826, 500498469, 108298262, 500517961, 500629544, 500645909, 500662288, 500531228, - 4112386, 500678677, 500695066, 500711426, 2719750, 2359315, 500727874, 8389756, 500760642, 500793363, 500809750, 2621480, 119800032, 500829258, 500959749, - 155648016, 52576278, 115769374, 501009072, 501058588, 2196941, 501188245, 501253129, 501288011, 501350454, 501384222, 152190987, 501419084, 501563499, 126042140, - 501596697, 17842283, 501662218, 501697613, 501761192, 501812302, 183582736, 501891078, 82559007, 501909211, 501940236, 295272459, 501958459, 502006904, 502038540, - 502054918, 122568725, 502071336, 3244086, 502500432, 204996624, 3227736, 502579688, 502615121, 502729383, 2197364, 167002626, 2195512, 502778962, 502860883, - 17842286, 502924810, 502972447, 235880460, 502989854, 150799529, 503021590, 439746562, 503041108, 503186906, 503267380, 45498384, 427213747, 503303253, 2359727, - 503385174, 503463976, 503483479, 503529498, 503545858, 503562871, 2196403, 503595095, 503647320, 503907423, 503971856, 48660506, 503991385, 504119377, 504155226, - 504218035, 93700122, 504252799, 504315957, 8390593, 504348975, 504384603, 504479803, 504512514, 504529658, 504561686, 183353356, 504579081, 504610845, 120979888, - 504627503, 504663132, 504709136, 126615574, 504725981, 122568714, 504761437, 25560094, 22216710, 504876126, 116064282, 505023583, 505118766, 505168361, 1933323, - 505217062, 505233437, 363560972, 505249848, 505282599, 1769500, 505316750, 2195914, 505380885, 108298266, 505400416, 505531489, 1982493, 505597026, 505678947, - 505709719, 505757738, 505775517, 505825083, 505873609, 505922011, 1917355, 505957476, 506121317, 506236006, 506349195, 506413098, 282035123, 227705432, 2326568, - 506432615, 506511391, 151093254, 506529359, 506577760, 506645608, 506776681, 506841460, 113115174, 2130355, 506907754, 1818646, 507035747, 409273207, 507071595, - 464928831, 507134844, 507185065, 507235436, 507347043, 507380312, 5868006, 507412492, 2196960, 507432045, 507513966, 110624790, 507675678, 507707398, 328073238, - 107479052, 206471178, 45875219, 282034275, 507723878, 507756573, 507773004, 507805783, 507855279, 507887919, 225181717, 507923567, 507972720, 508266507, 508330513, - 508362754, 299008019, 508380550, 508445130, 508478807, 508527043, 176488459, 508561607, 66273306, 508628081, 508742115, 508775538, 500973868, 509004915, 509116447, - 509132830, 509168756, 509214779, 509247547, 509281417, 3245225, 509330850, 117424159, 509378644, 54444042, 509412418, 2361131, 509476866, 52133907, 509495633, - 2197364, 509578357, 509643894, 509689862, 509706246, 509725815, 509804556, 509821020, 509853750, 261193739, 50659331, 509886551, 509935714, 2031656, 4456555, - 509968438, 510001154, 131859486, 510020728, 510181483, 510217019, 510313254, 510346249, 188106257, 191070224, 113246310, 510381177, 510495471, 510558267, 510591498, - 510626938, 510757922, 144048166, 5309854, 510820411, 510855140, 510885942, 510921851, 511167612, 511297441, 511344662, 511364221, 511442974, 135497365, 511478910, - 511577215, 244908044, 511624048, 324894772, 511672779, 511722887, 1212418, 511754327, 126517259, 214368275, 511806592, 512082934, 8391809, 512117568, 512183426, - 512376891, 512411123, 512442395, 512476169, 48054314, 512508336, 512541530, 512574287, 512606227, 46497808, 512622635, 512655414, 512688130, 2195754, 512705537, - 2196415, 512753718, 512786475, 248840202, 512819801, 512853499, 512902942, 512968249, 513065481, 137019398, 884788, 513100931, 513146946, 513179658, 354304042, - 513199236, 513261622, 88686614, 513297541, 119998004, 495682050, 513409061, 513425414, 237322252, 513444998, 6619189, 131795015, 513576071, 513769579, 288997392, - 513805448, 143753254, 513886443, 513949717, 513966102, 513984716, 514015242, 2621556, 47923242, 514031635, 514048010, 514064412, 514080778, 514097209, 27705401, - 514113565, 224133160, 514133129, 514477194, 514588708, 514605084, 2179082, 514621462, 514637881, 514654249, 514670602, 7634972, 6602758, 514687057, 2195537, - 514721799, 351010844, 514769322, 514801680, 514818054, 103743491, 514835477, 514883638, 115589139, 355106842, 514916406, 124862574, 514952331, 515033109, 515067020, - 515178518, 90521636, 515196671, 515245363, 515293190, 191184902, 515309584, 230621213, 515329165, 115769446, 211337222, 515473448, 515489828, 515506204, 38879242, - 515522612, 24297574, 515558542, 515621006, 515653642, 54460445, 515670863, 189464586, 515703980, 515755151, 515801100, 355729708, 156829424, 313786839, 515817474, - 515834971, 515866626, 515883018, 515899413, 515915807, 194282305, 139984918, 516538413, 237699126, 904337, 516574354, 516620408, 8391827, 516637510, 515951761, - 516672660, 516721302, 8159263, 516767767, 516784154, 516800514, 8159261, 86327353, 516816918, 516833395, 2621456, 516850303, 516882567, 516898950, 34455682, - 516915216, 516931610, 77496329, 516948105, 516967573, 516997122, 517013516, 517029906, 517046404, 2031750, 517062671, 517079080, 517095462, 173359219, 517111830, - 517128323, 517144585, 10371088, 517161041, 517193862, 517210153, 517226514, 517242892, 517259267, 2621441, 517275674, 7307269, 517737623, 357597215, 517803160, - 517980171, 8945666, 517999769, 518127654, 518144054, 518176867, 518209995, 518258912, 5324905, 518291561, 147013670, 518327450, 518375262, 518438954, 518455308, - 338771974, 51888154, 518474907, 182419468, 518553638, 518570038, 518605980, 260964436, 518655133, 518734630, 3211566, 518767908, 518818974, 518897888, 518930791, - 518963659, 519015583, 519143455, 115818502, 519163040, 519258217, 519290882, 137104545, 73744386, 519307801, 519373289, 182157314, 519425186, 116375636, 519474339, - 6193190, 519538538, 519572644, 519720101, 519816015, 2162703, 519848239, 519882120, 3916623, 519913556, 519946261, 185286672, 400801900, 519962684, 366215242, - 520047782, 520129703, 321552386, 295272463, 520177057, 520224783, 424509462, 520241607, 520293544, 6455315, 520539305, 3457045, 520585282, 499270092, 520621226, - 141411358, 520703147, 520768684, 51494939, 520847362, 520863770, 222183445, 520883373, 47120386, 520945676, 17006618, 520965294, 521044006, 128761858, 68386828, - 521061292, 521129135, 521208711, 461963398, 163315936, 521256979, 99893260, 521273403, 521306150, 521323432, 521355348, 521391280, 521519180, 521551910, 225116191, - 521568272, 521584646, 521601045, 521617424, 99893259, 521633808, 521650202, 521666582, 521682946, 521699356, 137412637, 521718961, 521781250, 159645722, 521797654, - 55263263, 521814475, 521863194, 521881014, 237830146, 521931954, 522030259, 522076214, 522108966, 176488486, 522125536, 522158092, 247840794, 522174561, 522240026, - 522256396, 522272806, 2162726, 522292404, 522371082, 522387515, 522420245, 47611907, 522439861, 290996255, 522485800, 15073306, 522505398, 110232687, 522620087, - 522698783, 522715178, 347144214, 522731586, 522764372, 109199414, 522797359, 45056011, 522831750, 522929782, 522978216, 523013251, 105562135, 523060455, 523108390, - 49790978, 523127992, 7733304, 523173954, 150241290, 523209913, 523406522, 523436086, 523468838, 523485721, 245301288, 2130223, 523553979, 45039654, 177094659, - 523652284, 523731379, 523763799, 523816125, 523865278, 523961729, 524009474, 49938458, 1900586, 524027387, 524078057, 524141532, 524173986, 524569792, 524782785, - 524828771, 524861527, 524910816, 2506763, 524946626, 525041690, 525058114, 525094044, 525139989, 525156378, 525172752, 29900815, 525190170, 142589978, 525238284, - 147013658, 22216723, 525254668, 525271182, 525305363, 525388995, 525484977, 198754363, 55328780, 525520068, 525598828, 525631943, 19267605, 525683909, 525779043, - 525811766, 297386744, 525847750, 525896903, 125583459, 2834539, 525995208, 526172176, 526188554, 257638431, 526204953, 526237793, 526303284, 526336059, 526368794, - 20365348, 526385236, 526421193, 526650570, 526712891, 112525333, 168394851, 526745665, 526794762, 526811168, 526847179, 526909466, 526925834, 526942239, 526961053, - 119997814, 527007787, 527040967, 47939624, 527089691, 527122491, 1982490, 527155212, 211107846, 527174860, 527237159, 6373484, 527270315, 527304320, 527351820, - 393494538, 527368213, 131318878, 111624223, 527387853, 527584462, 130859034, 527779710, 208502872, 110234831, 527813840, 527958455, 152964305, 527994066, 528138477, - 6897953, 528171070, 528220162, 528236559, 528252950, 528270230, 241434626, 456559827, 528321748, 528367637, 528384016, 528400395, 528416770, 122568725, 528433178, - 528449552, 47611919, 528466807, 528498734, 528551125, 99483677, 528629826, 111624234, 466157927, 528665814, 188580754, 528760861, 46121000, 528777675, 528828123, - 528859151, 528875541, 160727052, 528895191, 529056238, 529088528, 110100506, 529105367, 529137685, 152354847, 529154079, 529173720, 529219596, 529235989, 208994334, - 529252374, 529268738, 194101259, 330874890, 529286000, 247775258, 529335793, 529370329, 529452250, 166871071, 529498143, 529514502, 181813254, 7095265, 529530882, - 249988017, 529549493, 29491259, 529596953, 529662860, 529714008, 529763547, 124862766, 529860950, 529908766, 529943772, 530025693, 530055174, 20365328, 530071636, - 530104740, 530402527, 124862955, 453214220, 530549149, 106446867, 530599136, 530694176, 212877324, 530727019, 6373613, 530760734, 530795745, 16728073, 13074453, - 530876859, 173113370, 531006200, 531041506, 531087444, 108314983, 531120650, 531153433, 531221731, 531267626, 114114572, 193200138, 531287268, 51675174, 531333204, - 515653658, 531369189, 531500262, 2196649, 147013663, 531645030, 531677186, 531693594, 531709981, 205209602, 44253212, 531726403, 531811559, 531909864, 8604905, - 531972106, 110248411, 531988546, 532021274, 6455325, 532040938, 532172011, 532234300, 2146522, 532316247, 532365418, 532448276, 532499120, 166068280, 532545548, - 3178508, 532565228, 162168859, 5324899, 532643881, 532660262, 532676610, 122732586, 532696301, 32325655, 532942062, 533037066, 533053977, 533120345, 345374730, - 4980758, 533152627, 533234600, 533266513, 533299238, 533315692, 533348576, 533384431, 2196289, 452853798, 533512202, 50937858, 437682615, 533529576, 46088202, - 294027290, 533581040, 25559466, 533643274, 115015739, 533662961, 533774338, 118210566, 533791567, 61456394, 110100496, 533823519, 199459243, 533840784, 533872949, - 533923214, 6373847, 533988552, 534020098, 93978665, 501170182, 534416627, 534609930, 127713311, 534626750, 534695156, 534773819, 534806538, 3211735, 141606949, - 534826229, 241190296, 534888480, 534921218, 127746079, 534939034, 535039222, 535118295, 535150651, 535183459, 535217090, 535248926, 535284983, 535397112, 535430030, - 535495115, 535543890, 535576879, 535610377, 535645432, 535694585, 18153482, 535743738, 29622388, 535890884, 535937492, 535971047, 536019880, 536051798, 536087803, - 536182851, 536265335, 536298385, 126599170, 536347083, 536399100, 536510495, 159973859, 536530173, 536612094, 522977339, 536775935, 536954257, 537021696, 537083930, - 537100718, 5308843, 537149442, 537169153, 537199051, 537251074, 82558992, 537296898, 537314334, 537349379, 25561334, 537477608, 537509890, 402195192, 537529038, - 537644292, 537755679, 537772503, 174424080, 115114855, 32849936, 150388795, 537807421, 537886758, 110133294, 537906437, 537985067, 538017830, 538034651, 538067856, - 538099733, 46039066, 538116099, 520093780, 538135814, 538201351, 538312706, 99516454, 538329109, 46710786, 538348808, 538496265, 538545418, 538640819, 538675554, - 538722388, 538757307, 122044428, 538806171, 538870686, 538905867, 539118860, 539263785, 539296047, 539328552, 237731843, 539344912, 88948776, 428720165, 539361339, - 539394132, 539430157, 539526144, 539561230, 539623505, 539656249, 539672588, 122683418, 539692303, 539754550, 539790608, 539853817, 8391953, 539938066, 540000315, - 540036371, 27852838, 54296597, 540085524, 78479397, 540147771, 540180486, 540196916, 6766604, 540230479, 540262410, 442793996, 540279239, 50036778, 185319462, - 540331285, 540577046, 540721179, 540753958, 115163167, 540770363, 49938442, 540803522, 540835861, 540853172, 46352887, 540921111, 51380234, 5325665, 540968030, - 447840268, 541018040, 17842230, 541183256, 541229593, 541294644, 541330713, 541392898, 541409311, 428769318, 541426152, 541458574, 541492770, 76644355, 541543706, - 541655640, 541688744, 404029442, 17006607, 541721207, 541753370, 161808386, 541769793, 541819757, 541871387, 541950864, 541986076, 542048294, 154665435, 112476198, - 2162691, 542065099, 542115273, 258965514, 542182685, 542326815, 542343170, 121077770, 542359618, 5308634, 13074474, 542392779, 103940138, 124551187, 542441907, - 542474243, 298959695, 542493982, 542623471, 542687248, 120258579, 542705945, 542769233, 542801980, 542884873, 149160990, 542916627, 542933442, 542965791, 144048138, - 542982574, 543032310, 182157328, 543067423, 543179825, 543260703, 144179216, 366968858, 543277096, 543293478, 122568746, 400801900, 543313184, 543408159, 17006611, - 155648002, 543427873, 543473748, 543506470, 543522875, 543558946, 543637535, 543653898, 543673635, 543802229, 543834571, 121356309, 128155674, 543886628, 543982069, - 544014390, 544047144, 1900575, 112033801, 544476454, 544768060, 544853287, 150537053, 544899586, 544932299, 544981004, 150290458, 545000744, 545063957, 545112095, - 162250768, 545129295, 149930415, 545164585, 49905674, 545226790, 110120216, 545246506, 47251468, 545309730, 148733992, 545342268, 545390604, 545407068, 3833885, - 545439803, 545475096, 55132202, 545538272, 94601228, 545574187, 246136870, 545622734, 545738028, 1114150, 545833912, 545882626, 545918253, 545964068, 316899357, - 545983790, 546096940, 128581644, 546145192, 546180399, 546209828, 546226630, 546259247, 546291724, 546308111, 546324501, 546340895, 52609053, 546357355, 2408467, - 546390028, 546406421, 546424473, 546472039, 546557232, 546603014, 546619446, 432914463, 546653817, 546701328, 546718829, 546750476, 546766858, 546784124, 371277843, - 546835761, 547048754, 547127312, 6373478, 547147059, 440746022, 547258452, 547291152, 515653670, 547310900, 547454978, 547471370, 547487750, 56639510, 547506015, - 547569769, 547604041, 547687733, 6455322, 547782692, 547799056, 547815948, 114212866, 547848232, 547864614, 547880971, 547897360, 201572362, 547913750, 547930128, - 547946522, 547962882, 2801683, 547979266, 268435462, 547999030, 306676249, 233473023, 548064567, 84246546, 548307051, 548339765, 548372511, 226951225, 548389972, - 548438022, 147816454, 48021510, 548455837, 548504883, 124796970, 548556088, 514687014, 548621625, 180879423, 548851002, 548913236, 548945941, 548962344, 548978714, - 548995138, 3214173, 549028718, 150536297, 541753354, 549093414, 243516239, 549113147, 120258582, 549208498, 549244220, 549322778, 75464720, 549339630, 549373488, - 549408061, 549571902, 549670207, 164774775, 549800050, 549883200, 549945413, 549981505, 116375636, 550047042, 550210075, 23773323, 550260035, 550355003, 44171290, - 550388830, 127500304, 550440260, 550518851, 550601176, 2196571, 550666261, 114081814, 550686021, 550767851, 550833308, 116375611, 229461318, 550880763, 550930811, - 550977595, 5866408, 240582737, 551013703, 551079240, 551226697, 551371055, 19267622, 551404021, 176980436, 551439690, 130285599, 110247963, 551587147, 115523622, - 551747668, 151732262, 551780378, 551796782, 1785866, 551849292, 50184198, 551931213, 552127822, 110134493, 552288266, 552308047, 191644078, 552386570, 8392016, - 552406132, 552452108, 6193190, 552468546, 552502338, 552566794, 552583700, 552632544, 48054294, 2129958, 552665155, 552748970, 552815953, 552894495, 16826380, - 552911336, 552943713, 144982028, 296634142, 553010017, 553043609, 553091084, 13074468, 553107891, 553140255, 553156618, 553173295, 553207353, 553307474, 108315153, - 553536851, 553599019, 553635156, 553828398, 8391102, 553880917, 553946454, 554156074, 554172475, 177226716, 554207092, 554237993, 554254348, 554270746, 99893290, - 554288402, 554355457, 124862766, 291095487, 554401876, 150913062, 554434644, 18153510, 554470743, 132792358, 165494786, 554617885, 554663942, 465551419, 554681366, - 5308835, 554729494, 17154060, 87916575, 554749272, 554876930, 153714726, 2196591, 554893314, 45613094, 45727746, 554909742, 554959657, 554991626, 3538950, - 555011417, 555224410, 555270198, 19267594, 555306331, 108314729, 555437404, 2195648, 555502941, 555581482, 555597890, 192495626, 25561445, 192495622, 555631988, - 555679746, 555696170, 555712578, 555745739, 555794891, 555843594, 397266270, 555863391, 528187418, 555925514, 555943145, 555991511, 116376776, 556023874, 556056996, - 556090759, 393543692, 556125536, 556205086, 556237259, 556287612, 556338529, 556387682, 556483614, 556515787, 470535523, 556911973, 557105454, 557137922, 557154314, - 147013651, 557171121, 557204878, 557269018, 557285378, 133496842, 557302603, 280445399, 379256874, 557367355, 557401199, 557434326, 4980793, 557485414, 557550951, - 557613096, 544047132, 297386419, 557629499, 557662733, 122324359, 557711790, 557761695, 557793739, 557842516, 159449144, 557875216, 50118682, 557895016, 558039127, - 558088494, 2197040, 558124393, 558186555, 199458872, 240943531, 558222698, 558304619, 3244558, 558465040, 268468262, 558484844, 558598081, 558645294, 558694507, - 3261249, 558730605, 124862935, 558891089, 558923822, 558972959, 168722458, 558990951, 559040315, 25560155, 559087682, 559120477, 6733826, 559169995, 559218787, - 559251888, 559284250, 559304046, 122126909, 559369583, 559517040, 559646025, 559694990, 559743006, 559779185, 307610490, 559857723, 559893874, 126615578, 560057715, - 560120110, 560152597, 119996961, 560172404, 1982474, 387416935, 560316503, 560369013, 560414732, 195952671, 560431163, 560464303, 154042828, 560496652, 79757369, - 560516470, 560647543, 560709642, 560726446, 560775705, 125583389, 560842077, 560893304, 560991609, 561089914, 561168462, 561234457, 561301525, 561333979, 561365035, - 21102608, 561397819, 561431042, 322143140, 561466747, 561546152, 561578015, 353189972, 561596315, 561660441, 46088202, 530730364, 116376086, 561725506, 561761661, - 561938491, 56164362, 561971202, 154665905, 561987596, 107462658, 562004920, 562053162, 562070406, 562102331, 562135100, 562216981, 562233881, 562302334, 562367352, - 562417023, 562495519, 562511888, 254345273, 562528310, 125583417, 562561055, 176504842, 119817125, 562580864, 562627537, 536233482, 51675151, 308003249, 563023234, - 563200016, 218841126, 563219843, 563265572, 563281926, 128974859, 563298315, 24838172, 110231608, 563318148, 563462615, 563495763, 82001922, 563560458, 25559086, - 563578201, 563612722, 563676568, 563725288, 563773524, 563806234, 563823194, 48611368, 563858821, 241680424, 563953666, 563970155, 6947663, 564002859, 335446054, - 564035887, 564068373, 564084762, 564101136, 564117519, 564133910, 564150338, 564183056, 213958666, 564201955, 564232279, 564281366, 564301190, 25559139, 564396044, - 93978634, 564413016, 472203290, 564445268, 564481415, 564625430, 564643135, 118915078, 564707366, 564723714, 564740107, 175669279, 79757323, 564756496, 564772890, - 564789680, 564825480, 276906043, 564904395, 564953391, 564986870, 565022089, 565116959, 565133350, 392462374, 565149698, 212107304, 565166927, 565198911, 565231638, - 7734105, 283721820, 565251466, 565381637, 565430693, 223707146, 565480843, 565575706, 565592066, 151732262, 565611916, 133414922, 565706764, 565723162, 565739995, - 122667011, 565775757, 176521282, 565821471, 565838882, 565873793, 565920176, 565955982, 114393098, 566018075, 566054287, 566116439, 566165536, 566198315, 566231050, - 131334442, 566250896, 566362401, 566394932, 566428185, 566493195, 165134364, 566511716, 566562193, 73187344, 99500063, 52576268, 566676882, 566807516, 189513754, - 566853678, 566902868, 554270760, 566936312, 566970789, 567017531, 567051744, 567084062, 567116823, 567165012, 135184422, 567201171, 46088195, 567379668, 567427078, - 567443532, 2130378, 567479700, 141411278, 234307622, 567575580, 567607318, 567627157, 567725462, 567823767, 567869481, 351387686, 67059743, 567889304, 567984236, - 568016923, 568053145, 568118682, 568180762, 568197196, 568231006, 353239147, 568279342, 568312641, 568348059, 568413596, 568528285, 568655882, 232849410, 568673177, - 568803330, 568820226, 185319445, 568852492, 568868890, 8389472, 568885785, 445841434, 455442458, 568950820, 261193739, 568967227, 569003422, 569049147, 569081885, - 569098256, 82558982, 569118111, 305119291, 569278924, 569311298, 569345175, 138641843, 569396640, 133447699, 569510367, 569560481, 569638965, 94109715, 569675170, - 47710223, 17843041, 569770006, 569786460, 144605291, 569819624, 569855395, 570033054, 33243172, 570068388, 463028270, 86327336, 150569023, 570166693, 570245146, - 570261516, 8390685, 570279499, 570327124, 116228153, 52215834, 570359862, 6373590, 570396070, 570621975, 570638468, 2523142, 570658215, 44531749, 570687590, - 570720282, 2197708, 144146453, 570736652, 183369756, 570753559, 570789288, 21151755, 570818676, 570834966, 570854825, 570884132, 38879258, 570903978, 570998807, - 571015191, 571034025, 8388877, 571064459, 571097111, 1949722, 571097218, 571113513, 571129878, 99876885, 157646964, 571149739, 571313580, 571362250, 571395018, - 66816970, 82001932, 73531421, 571424770, 571441183, 1900580, 6620267, 571461037, 571752477, 2031673, 571768868, 19447819, 571788718, 53837958, 49938434, - 94846982, 571850789, 84836468, 571867146, 571887023, 571968698, 571998244, 148638121, 79937543, 572015603, 189464595, 572030986, 572047476, 572063763, 572080165, - 2031657, 572460465, 572523361, 121045013, 572556875, 572604953, 572673458, 572751878, 527155212, 572768781, 170344486, 181191592, 572820915, 153192767, 572932590, - 572964930, 572997642, 115015983, 573014109, 48545823, 573063206, 573083060, 136118318, 108314680, 573178765, 573262181, 437980597, 573309836, 573359906, 573390869, - 3342362, 573408286, 573440847, 573474093, 573523113, 573555448, 164020226, 573589365, 488243212, 573653295, 573685782, 573702186, 573720762, 6324266, 573751318, - 53706868, 573769331, 573833247, 573850114, 22478879, 573885878, 574080702, 574131639, 574229944, 574292427, 574341176, 251052119, 416628757, 574377401, 574423061, - 574439883, 574489769, 574524858, 574636034, 3867255, 574652418, 2326570, 5309581, 574672315, 56164390, 574819772, 574882890, 234176534, 574914582, 574930960, - 126287882, 574950845, 574996910, 575046107, 575078472, 575147454, 575209987, 298352652, 575262143, 9142290, 575340635, 575374324, 575422520, 575455291, 575491520, - 575635515, 1900660, 575668243, 61997068, 575688129, 575733762, 125927434, 50118658, 2801680, 575753666, 575799322, 575816572, 575864931, 575901123, 576048580, - 108315489, 576110618, 110119986, 576127083, 576162480, 576208922, 124862896, 576225311, 99516418, 576245189, 576357199, 576390662, 576438284, 576454880, 576487454, - 129237004, 576520952, 181174338, 576553020, 576635816, 576670596, 576736710, 576802076, 576867783, 131383323, 576962591, 5603340, 576982472, 577060904, 577077290, - 577093691, 264716396, 46891020, 3720113, 577126510, 577159600, 577191990, 108625958, 577228233, 150503426, 577277386, 308592739, 201523722, 577389069, 577437801, - 577471311, 577506763, 577568783, 577585168, 67043354, 577602015, 99385360, 27246623, 577634316, 218611733, 577650700, 115294224, 577670604, 577965517, 578062819, - 431996964, 578093565, 578143088, 47251472, 578191406, 475545626, 578242771, 578322434, 215187466, 578342350, 578536734, 578584614, 578600998, 531316779, 578617409, - 578667945, 5390351, 578699276, 578716170, 578748447, 115818538, 237731862, 578764816, 578781194, 578798000, 578830382, 116228099, 578879519, 578895878, 122601503, - 578915791, 578994198, 231817247, 579011019, 46039050, 579061305, 344064056, 152354858, 579158861, 579207178, 579224444, 518488104, 579272764, 556337293, 579355105, - 579403884, 579436598, 327909847, 579472848, 579551259, 579584010, 579603921, 579650206, 579682736, 579715991, 579764226, 579780629, 579797058, 579829766, 114917679, - 579849681, 579895377, 579928124, 580009994, 580026389, 179798068, 580046290, 580111827, 379404591, 580175405, 580226516, 580354857, 580386903, 8389153, 165494796, - 580439509, 580517972, 580550787, 216449279, 580568174, 580652502, 580747283, 202014732, 297484298, 580763670, 497336325, 580780065, 580829291, 102858774, 580861993, - 2752534, 580879731, 202031120, 580911563, 154665067, 22085658, 580963799, 581173783, 581206053, 17924124, 581222441, 37748738, 581238825, 103448586, 581258712, - 581304357, 423446334, 7700516, 581320745, 581337145, 581353513, 581369892, 580861990, 157646889, 580861964, 581389785, 27426828, 581468182, 17924137, 90521637, - 581484556, 581500950, 1949737, 581517362, 581553626, 581632022, 581500938, 581648425, 581664797, 581681268, 581697543, 142180388, 581713925, 581730332, 581746729, - 581763109, 581779484, 2129939, 581795881, 581812250, 80035862, 582172693, 582189077, 2539651, 582206278, 9207814, 582238808, 516833289, 153649162, 582651357, - 582749662, 582814977, 2359723, 582847565, 6865743, 582913503, 582995424, 121077800, 583041561, 583107139, 571441168, 258080778, 583142881, 583270637, 405454888, - 583306410, 583385100, 165134342, 583405026, 513278554, 583451083, 583503331, 170803627, 583548994, 8392164, 583585253, 583648778, 583698892, 415776799, 583745538, - 583762680, 583794699, 383664130, 583814630, 23856066, 583958566, 3227702, 583978471, 2195536, 155648002, 584060392, 8389985, 534020127, 584171579, 584204298, - 584220678, 228753430, 584237068, 584253466, 111607814, 584270949, 584319118, 584355305, 584450050, 584466470, 584482818, 3473445, 584499503, 584535530, 584581204, - 584613914, 131940373, 2670618, 584630274, 584646682, 584663061, 119359358, 584682987, 584863212, 584908812, 60456970, 584925239, 584990749, 249282576, 585007142, - 585023519, 197345301, 585039926, 585076205, 585138606, 585190894, 585269264, 461684776, 585289199, 585354736, 132808723, 585433098, 585449892, 124272706, 180060631, - 585482252, 585498706, 585534961, 585584114, 147013668, 585633267, 585829876, 585908250, 585928181, 586023215, 586056908, 586105750, 152945156, 7733719, 586154744, - 586186764, 125812752, 586204190, 586235942, 586252319, 586268688, 586285066, 56639490, 586301499, 519667722, 586337782, 586419703, 586582539, 2129962, 586662753, - 586694666, 586714616, 164757807, 586794483, 586829305, 587042298, 587091451, 587156988, 587251750, 587268150, 587300890, 587317254, 587337213, 110231789, 587369982, - 587547384, 587579926, 587612232, 587681279, 587776040, 4964367, 587792424, 45875237, 587808780, 587825189, 587842030, 587874314, 120078346, 587890690, 587907077, - 587923458, 587939850, 587956266, 2621468, 587976192, 188583425, 588025346, 588189187, 108167184, 44171274, 588382230, 253625167, 2196649, 588398652, 588483077, - 588533252, 588611786, 55033893, 588645404, 588680709, 136120806, 588811782, 588873730, 588890589, 588922891, 43237414, 588942855, 589004838, 1933324, 589022182, - 589057544, 589137589, 7290902, 589205001, 589430810, 589447194, 141410388, 589463564, 589479974, 49774594, 589499914, 589562901, 589611024, 362659850, 589627851, - 589676575, 589692938, 119357874, 181257806, 2196135, 589709396, 589745675, 589860364, 589906387, 589955153, 589987948, 590020629, 590037004, 192200719, 590056973, - 590384654, 590462997, 590479372, 590495770, 590512603, 590545808, 590578607, 590643230, 590675999, 224542751, 590692368, 590708746, 590726153, 590757900, 590777809, - 590823440, 5865761, 590840655, 590872586, 22216714, 590891348, 590954517, 260964406, 590970890, 590987363, 591020034, 61997096, 591037759, 591104694, 591167490, - 93700134, 591187471, 591282197, 4997172, 591299497, 263176194, 591347818, 591433232, 591560760, 591597073, 47611920, 591757396, 591793682, 313131024, 115721079, - 591987535, 592020660, 592072211, 70058197, 592314389, 592330773, 592347195, 592383508, 235438927, 592446347, 144621599, 136118794, 592512169, 592547349, 422691250, - 592627060, 592674882, 592707594, 49086485, 592725382, 592789516, 2198785, 592809400, 592871946, 592907798, 592987075, 593035323, 6621205, 3899869, 593068068, - 94896139, 593084475, 8390154, 593117212, 47611933, 593137175, 593268248, 593365133, 170999892, 593412633, 593477642, 6127647, 271630389, 119357879, 593494475, - 593544113, 2130953, 593576479, 593628697, 593855597, 49086474, 593887701, 593936424, 593956378, 351158298, 22216744, 80035852, 195264528, 594034747, 451772470, - 345686021, 594067562, 594150960, 594182160, 594198544, 594214931, 6602774, 424017936, 594234907, 594300444, 311607311, 594395162, 594412693, 81166348, 594447901, - 256032794, 594658379, 594723491, 594772009, 594788364, 1949736, 594804824, 594837541, 17006630, 126959635, 594853894, 27852812, 594870575, 374194216, 594903499, - 163315820, 594952202, 209813535, 594969113, 595036427, 147063977, 595084073, 595119646, 2195495, 595185183, 595263528, 595279878, 45465621, 595299872, 115294324, - 595742242, 595887593, 17220906, 595938851, 132156964, 596069925, 596148246, 55033877, 51380260, 596164634, 596181051, 41566214, 596217382, 596296713, 596332071, - 596510465, 596559653, 596607032, 453283368, 417103888, 182272841, 596643369, 2196056, 596839978, 596905515, 420365153, 597016588, 597032962, 597049804, 597084755, - 597151276, 597298733, 54444058, 456425474, 597345920, 147423254, 564314124, 3228566, 597397038, 597458949, 597475359, 71483421, 597491771, 131842854, 182289190, - 597528111, 597574126, 597610032, 597753912, 597786690, 597819860, 597852172, 122601498, 152946054, 597869015, 597902230, 597951335, 597986865, 598147126, 185417738, - 598179842, 598196252, 598212639, 242466826, 598232626, 598329903, 122454018, 598392853, 115114083, 598410214, 598442478, 47611911, 598474764, 598491162, 598507522, - 598523919, 598541250, 46219304, 598576691, 598674996, 198328358, 2130008, 441466918, 598756917, 598802444, 3244130, 598818904, 300400650, 598851665, 598884354, - 193675340, 598904374, 598949904, 160759837, 58409026, 598969911, 2130346, 599015899, 599048232, 599064588, 599081059, 599117368, 599395897, 599457823, 599474195, - 45039638, 192938000, 599494202, 599576123, 599605706, 42369081, 599641660, 404242911, 52805634, 109215780, 599752810, 421855753, 599838269, 82558997, 599903806, - 599998480, 42369050, 600014885, 491208770, 600032150, 6946933, 600081417, 600116799, 600181358, 600227868, 600244699, 600277094, 117506114, 600309826, 600342566, - 8392256, 600362561, 600540363, 345784332, 520093782, 600575554, 600653870, 600703577, 600739395, 600899586, 600916439, 600952388, 601030666, 2195876, 601047351, - 601099845, 601260072, 211173397, 601280070, 57032742, 135184415, 182288816, 3555364, 601391541, 601427527, 601523221, 54460447, 601574984, 475873361, 601653675, - 3244467, 601686103, 163315936, 601736222, 601771593, 8159347, 34701707, 601968202, 602062850, 602079251, 19251802, 474399753, 602097273, 602144778, 602161162, - 20365324, 602177552, 602193948, 602210314, 2261021, 602226748, 602312267, 602377804, 299794458, 602423298, 189038607, 602439711, 602456070, 286277674, 602475676, - 602521702, 602554397, 159432709, 602574413, 207621710, 603016784, 603180625, 603228142, 603275285, 121339925, 603292185, 218611722, 603358318, 603440520, 603472926, - 194166822, 603505494, 603553798, 156925971, 146358278, 603570178, 153944090, 603587588, 603655762, 603770451, 603848720, 603868756, 132153390, 604012628, 933897, - 604045849, 111132698, 604111301, 604147285, 604278358, 47546380, 604340240, 604356619, 56262687, 604372994, 150241320, 604389483, 604425815, 604586015, 604602378, - 604618794, 11665539, 604638808, 604749845, 75530271, 604766254, 604815371, 604831772, 547684354, 4653495, 604851801, 605015642, 605143042, 605159455, 605175818, - 605192626, 605227327, 605257820, 605294171, 605388812, 50937875, 605405639, 605454338, 605470742, 257638440, 605490780, 605556317, 605749485, 605782305, 203817960, - 605818462, 605945922, 85098498, 605981526, 606027842, 137101991, 606060556, 606080607, 606146144, 131827474, 606224452, 606276302, 220663332, 606391905, 1228816, - 606470198, 111624218, 606506594, 606587848, 606651690, 170886007, 606699823, 606733342, 606768739, 606814218, 604274691, 606834276, 607096421, 252117008, 607207440, - 125812741, 607224408, 263503903, 607256597, 607272972, 607289346, 15007786, 607309414, 607339039, 47611910, 607391335, 607454764, 607485974, 246546474, 607502967, - 607536044, 108315058, 607604328, 607666192, 607682597, 607698960, 2850827, 44613669, 607719017, 607833706, 607882859, 54296598, 608043308, 608075841, 135184394, - 608126613, 608194156, 608257501, 608292461, 608339731, 608387112, 608403487, 608419861, 608436654, 608489070, 608603759, 608698484, 608714764, 608731148, 2162745, - 111149068, 608751216, 608796756, 50135062, 608830667, 608862290, 608894978, 608911379, 608927765, 608944975, 116883888, 608980593, 2146414, 476921956, 609190775, - 270516234, 609222710, 609257997, 207228530, 609308275, 46530586, 609421331, 609468719, 609501293, 609533992, 150241306, 609551929, 609652340, 609697794, 609714186, - 2113652, 609731031, 609767029, 286277674, 609812564, 609845348, 609878075, 609910889, 609943582, 609977756, 610025498, 2834656, 44351504, 610041901, 610074753, - 610108405, 610173466, 456966180, 610205724, 610222681, 610254878, 610289633, 610337198, 610388109, 610435131, 610471542, 610517030, 146817060, 610533392, 122650650, - 610551155, 3129380, 149815298, 610582557, 295649283, 610599825, 610648102, 610664751, 610697745, 610729996, 610746406, 610762806, 421773317, 610799223, 126287893, - 611156815, 611192440, 611304755, 611353382, 611385346, 611401749, 235552780, 611421817, 204488735, 204537882, 150913055, 3473444, 611503738, 611581954, 51822630, - 611598811, 611634811, 243777538, 2506764, 611680266, 611697070, 611746684, 611795858, 6455334, 611844696, 611876874, 13549597, 611896956, 612008431, 612042953, - 612106261, 135004172, 612123055, 612155404, 612171875, 612204560, 612220938, 612237341, 44531724, 612257405, 226967618, 612372094, 612433946, 612451151, 44679199, - 120114275, 612485897, 612532246, 1114128, 612549526, 140247139, 612601471, 168902747, 612696982, 612746071, 288997407, 612778027, 612814464, 126287910, 612961921, - 613023786, 613040154, 613056514, 613072911, 613089302, 613106582, 613157364, 613207682, 50086315, 613253174, 599932939, 613289603, 613367827, 124796931, 2195745, - 613387908, 613515286, 613531691, 6406154, 613565449, 613598293, 613629954, 234176527, 613646338, 192200714, 613666437, 613777418, 613793844, 613827039, 613859338, - 196149270, 613879430, 613990428, 614006786, 614023174, 614039555, 19447827, 614057061, 194084885, 614105312, 614141575, 614600328, 614682249, 27738242, 614793976, - 27852816, 4112400, 614826050, 117506114, 614860105, 47546405, 614911626, 615124619, 615219212, 615235622, 615251983, 192495638, 615268374, 370573352, 615288460, - 615370381, 613305998, 615468687, 615564457, 615599760, 615697862, 615762051, 615825410, 2129977, 615842699, 615907394, 615940098, 615957729, 616007396, 616074897, - 616202256, 616218664, 7290918, 616235678, 616267788, 616284920, 191545350, 7290906, 616316944, 216858666, 616334508, 616382476, 616399608, 616432011, 156827702, - 155533314, 616467760, 616514073, 616579128, 616611927, 616664722, 616710186, 616726554, 616742914, 616759311, 210583574, 525553299, 616779412, 616825290, 616857626, - 616874015, 122568733, 616890378, 616906754, 393494539, 47710230, 616923152, 135397387, 616939607, 616989106, 617025173, 617088510, 575701018, 617152528, 617168938, - 617185712, 564838833, 617218104, 617251250, 48447507, 617283590, 617303702, 617366558, 617398293, 617414678, 617431052, 10829835, 617447430, 3342357, 617463810, - 617480202, 617496592, 292962309, 232030230, 617516695, 474399665, 617860760, 617926297, 617988587, 618024602, 296698889, 618172059, 618233887, 131875495, 618251691, - 4407599, 618303132, 30392341, 618383292, 618466973, 618512400, 618528778, 618545194, 223608869, 312180757, 618565278, 618660776, 618692613, 94568450, 618712735, - 198410262, 618807825, 618840086, 126025740, 618860192, 117555237, 618922024, 618938399, 571801606, 618958497, 6374603, 619036694, 619056802, 619200571, 619233306, - 373604381, 135905346, 619249692, 619266088, 121077766, 619283435, 55033871, 619347970, 2933231, 619364354, 362037258, 619380767, 375406630, 619397423, 15073318, - 619429900, 113737754, 619447326, 619481776, 402309125, 619876004, 620068904, 47939610, 253935635, 620085549, 620118042, 366116893, 620134481, 620167183, 620183855, - 397852682, 620220069, 620282357, 164020236, 620314861, 620347500, 620380920, 620413231, 620449446, 620511334, 620544031, 46039061, 111149096, 620560430, 508362768, - 620609538, 166838298, 620629671, 620757018, 620773386, 620789772, 141295637, 620806237, 620855334, 620874665, 620924584, 621037849, 621101515, 621153047, 621215770, - 621232182, 621264980, 218611738, 621298718, 621330525, 621383310, 621432489, 621481642, 621543440, 287572075, 621559915, 621592607, 621608991, 224591913, 5308719, - 621629099, 621690911, 10584093, 621711020, 621821974, 79069186, 621838352, 621855667, 621891245, 621936680, 621953036, 46088234, 621973166, 622084108, 204996611, - 622104239, 622166070, 30392358, 622199239, 308903972, 622250157, 622313511, 622346347, 622380470, 622428181, 126287893, 175767636, 622448304, 622542858, 122323831, - 358498983, 622562993, 622624850, 269664315, 622657566, 50937882, 622691229, 622775986, 622887363, 16826384, 622919736, 622953641, 312770647, 622985282, 623019119, - 164020240, 307986539, 623054515, 623247827, 623300276, 45023248, 623362058, 623378442, 623394818, 623411221, 7733324, 4964373, 623431349, 623509534, 623542324, - 623578806, 623660727, 182157343, 623738882, 623759032, 623804435, 623820816, 137102456, 623838459, 231768076, 623886378, 623902746, 623919106, 623935503, 623951894, - 528270230, 623968315, 139034708, 624001064, 624017446, 624033794, 6373458, 624050260, 624082946, 624099781, 176570384, 358514709, 624132136, 624148539, 624184157, - 73531408, 624215320, 7307301, 624283321, 389136465, 624398010, 624508940, 624525338, 624541920, 624574476, 2326535, 624590886, 624607534, 624640847, 173113354, - 624673615, 359530498, 624709307, 624856764, 624905917, 624984503, 146767910, 625016898, 8390595, 625053374, 625115157, 625135295, 625197140, 625229906, 625266368, - 625360927, 123797510, 625377361, 625410074, 625426444, 625442826, 625459831, 625491970, 625508409, 625524767, 112476202, 268468240, 625541751, 625573914, 138346527, - 625590331, 625623050, 625640055, 625672204, 625688586, 625704981, 625721410, 625757889, 333348883, 625823426, 191004974, 625918383, 625954499, 625999882, 262275091, - 626020036, 626180856, 49774607, 626212880, 626233029, 626278454, 626311180, 626327650, 203128848, 626360358, 44679170, 626377666, 112754726, 626413254, 626475034, - 626491823, 626524179, 626540560, 122568742, 626560711, 626708168, 183582722, 626773705, 626868250, 59228176, 626884620, 626901002, 605192291, 626917448, 144097336, - 438044205, 626983945, 627015682, 627032093, 627048514, 627085002, 451772653, 627179539, 215859202, 627199691, 627311262, 307855386, 627347148, 627425388, 627461837, - 627527374, 627625679, 627707334, 123846715, 123847115, 627769403, 627803561, 627834892, 241647635, 162250790, 627855056, 627998748, 7634963, 628015125, 628032567, - 628064287, 628080661, 628097060, 628113427, 628129802, 38879261, 628146292, 628162586, 628181196, 628214159, 628244509, 17924117, 628264657, 628310047, 44597274, - 628326407, 96190500, 628342900, 267681829, 628359196, 628375561, 31342615, 628391986, 628424711, 628441114, 2196238, 628461266, 628506627, 628523018, 33177615, - 628539501, 628572246, 581206042, 628604964, 628621847, 79937572, 203653219, 629178433, 242696245, 629228649, 629276924, 629309442, 629325834, 629342218, 629358594, - 629374986, 114130950, 629393499, 629457199, 141000710, 547684394, 629490185, 79757318, 629524799, 629558997, 46710796, 629640918, 256819216, 629703563, 629771991, - 629833812, 248266788, 6455334, 629870296, 629965762, 629998460, 3227680, 29491256, 87539734, 630050521, 630197080, 630243340, 630259718, 630276117, 630292511, - 124239882, 630309339, 630341651, 146653186, 2031618, 630358047, 279855123, 2131182, 630378202, 630456322, 630472733, 2408477, 630492891, 630673116, 630755037, - 630801212, 630853342, 6373802, 630981040, 631013809, 631046604, 123404309, 133578791, 631082719, 631128090, 631144464, 631160843, 543408164, 631181024, 631259148, - 115785738, 631279329, 631361250, 631492323, 8388676, 631623396, 631702757, 631783856, 631816625, 631849874, 307511312, 631901925, 631980044, 631996523, 632031715, - 632065766, 632143894, 584597516, 632160322, 396577253, 632195538, 45613078, 632278759, 632377064, 140477249, 632438810, 632455184, 632471567, 632487958, 632504336, - 213958684, 632520770, 632557289, 493092895, 632622826, 457770355, 632686428, 632753899, 632897585, 632980816, 633028624, 607617889, 633045018, 2196825, 633061460, - 633094228, 633126928, 633143598, 633176118, 136118379, 633212652, 633491181, 633605870, 412959634, 633716802, 633753327, 233193474, 2196403, 633979339, 634031856, - 634109989, 634127390, 634162929, 634257430, 634273808, 634290202, 7389199, 634309190, 634342365, 634390702, 195838008, 634470410, 634490610, 634553238, 634602364, - 130285578, 634650711, 634702091, 7733472, 634748938, 140247479, 634769042, 634814523, 48447498, 634847242, 634867443, 385515574, 634932980, 175669260, 635060226, - 150700053, 635077706, 635113205, 635240454, 3833877, 635256851, 635275026, 118636582, 635323881, 635372034, 635405132, 635454952, 635506422, 176570370, 635601950, - 635633730, 5865577, 635670263, 635912429, 635945451, 635978690, 636011727, 636076088, 636108821, 636129016, 636174342, 636190732, 6209562, 636210937, 636260090, - 452034576, 99696646, 636371956, 636423931, 636469335, 616120358, 636522236, 636604157, 636715030, 357466178, 636735099, 636784382, 636878955, 79822863, 636911626, - 636928042, 636944390, 54820875, 636960787, 636978072, 637027196, 637075563, 637108252, 6406156, 637124618, 637141886, 637173779, 47529986, 637191629, 147423242, - 637226751, 637272523, 637321226, 319143978, 637338079, 637374208, 637485068, 249266202, 637501466, 129958191, 149930050, 637518086, 637554433, 637927953, 539656220, - 637960683, 637996802, 394379266, 638108495, 188940314, 638144259, 638190712, 73531433, 638226180, 638271494, 638287893, 638304268, 247234586, 638324485, 250185306, - 638435387, 638468115, 638484490, 217808912, 423448326, 638501335, 175783995, 638534246, 638566859, 280445399, 638619367, 638717703, 638861369, 299008006, 638877783, - 638926878, 598949919, 638963464, 639042428, 639091836, 49774630, 639143689, 639225610, 639336470, 639352913, 639386027, 109052046, 639422219, 639467586, 639502708, - 639567162, 93700108, 639618828, 635977827, 639700749, 547962911, 639799054, 640028431, 129466370, 640155660, 52396042, 640173508, 369098818, 640206459, 640270402, - 640304202, 301418718, 640339728, 42598459, 112919490, 640418790, 136511500, 640454417, 640518495, 640565274, 640583439, 640634642, 640745531, 640780759, 640827438, - 640876556, 640892939, 640909322, 640925708, 457539590, 640945939, 641105930, 7307279, 641122306, 641138698, 8994858, 641155606, 641187861, 641204281, 9535504, - 154812887, 641220738, 641237034, 289243178, 641257236, 641449993, 38879233, 641467914, 307134485, 641519381, 641601302, 641630323, 641646724, 641663111, 641679369, - 58982409, 17924102, 641695772, 514654227, 572047388, 641715991, 641763115, 641797912, 641826826, 53706773, 641844463, 30461353, 423034996, 641875997, 641892354, - 641908762, 641925151, 551796738, 641941561, 641957929, 641974282, 641990772, 642007077, 7307380, 642027289, 642105385, 642122160, 151912564, 642154525, 377619214, - 2179091, 642646153, 57032836, 642666267, 642859030, 642879260, 643006504, 547291167, 582829370, 643025295, 47284264, 277856296, 643055656, 52215839, 643075869, - 643186714, 643203088, 643219472, 301252645, 643235846, 643252243, 643268674, 155861023, 643301432, 5324832, 643334583, 643366924, 266766853, 643383723, 643419934, - 6406184, 643518239, 193855927, 282838025, 120602629, 643629058, 44908575, 643645461, 643661846, 638304272, 643679121, 643731232, 643927841, 557514778, 644009762, - 3227730, 644087820, 644108067, 178339861, 644189929, 644252129, 644303536, 644349964, 332480619, 644370212, 218841117, 644432331, 644484901, 563298316, 644632358, - 644779815, 644825104, 172703782, 644841488, 362037288, 644858286, 644908201, 644940842, 645038108, 645054466, 645070859, 19267612, 645090476, 645169164, 2523174, - 645186007, 645222030, 168935446, 179765260, 645268469, 645336872, 645631785, 645693442, 45465611, 144048144, 310558746, 645712937, 645779242, 645840927, 645857814, - 482590742, 645890064, 645906460, 50266140, 645922903, 645972028, 646055283, 646088052, 646136109, 646168616, 646184979, 612319269, 197722114, 646205227, 416284885, - 499269716, 646398036, 646430796, 646463725, 646496686, 646545492, 646578179, 125583363, 646598444, 646776296, 646827821, 454968232, 647054835, 519815183, 647086082, - 647102935, 647135234, 250937355, 647151628, 647168010, 84738077, 647186237, 20365341, 392921110, 145473552, 647237422, 647348290, 647384879, 647413925, 647561648, - 647593996, 519143434, 647610383, 354549776, 647626818, 461963266, 647663408, 23363852, 647745329, 647889373, 647921683, 647938050, 647954453, 647970847, 647987216, - 241827850, 648003625, 648019999, 648036371, 120094751, 648056626, 648102818, 45498404, 648134953, 648167490, 6602755, 648200208, 648216614, 115589160, 648233448, - 648265734, 648282133, 648298562, 128254466, 648331276, 648347658, 66273286, 648367923, 648466228, 648548149, 648630070, 2195564, 648693108, 2031654, 648742690, - 648774465, 648806410, 479100957, 648822843, 648855562, 648871955, 619266060, 648892215, 649052236, 649085972, 649134507, 649167755, 649232390, 6029334, 649248795, - 545030252, 209010754, 649281966, 199459447, 649330805, 649363487, 136659829, 5177355, 87539717, 649383736, 649498425, 649576479, 649592853, 649609519, 649645599, - 318423475, 649723916, 649740298, 473547383, 649756703, 649773941, 649809722, 649858875, 116375776, 649922322, 649973564, 129417257, 650085244, 650133532, 650150030, - 47710229, 650186557, 650264607, 650280989, 650297410, 650330180, 650379895, 2195510, 650412269, 650444802, 650461194, 121077802, 650479080, 650530622, 119358402, - 651005760, 651265226, 353239094, 651313236, 142835722, 651345946, 651362306, 651378698, 648871955, 651395103, 651411472, 354074681, 651431686, 651477423, 49938472, - 651509762, 237731866, 651530049, 651595309, 55132170, 651640863, 651658249, 651690221, 651722795, 651759426, 651804764, 124796938, 651837532, 361168936, 651873629, - 176784215, 651954019, 652020925, 652067275, 4653155, 306774450, 652116052, 129417222, 652152643, 652345420, 143933470, 652382020, 652443698, 270385211, 652480325, - 652705934, 652738576, 652754960, 27852837, 652771796, 652804905, 119816276, 652836910, 131334196, 652886031, 652903624, 652935184, 553156634, 652951855, 652988230, - 164184353, 653067665, 2605068, 653135687, 6373432, 653197314, 49086467, 653217608, 653365065, 653443084, 126763245, 653460961, 653578058, 653754384, 653770778, - 653787138, 653803541, 653819991, 653870048, 241238028, 653918214, 653934658, 653968286, 654004043, 654082114, 654115338, 654147586, 654164006, 213205023, 654184268, - 267567146, 654344213, 654364304, 47530012, 654462797, 654524482, 654558616, 654606402, 654640125, 654704650, 654721030, 654737439, 654753821, 654770188, 56442906, - 654786625, 654836193, 654885751, 8389067, 654921550, 655052623, 633716802, 139657242, 56492034, 655101776, 1949698, 655199953, 45531152, 655249233, 655313530, - 655363922, 251396125, 655507496, 655524272, 655556651, 655589414, 655605787, 655639483, 655704109, 655736891, 655770922, 655818811, 655851579, 655888211, 656031981, - 137102257, 34553868, 656068436, 656114201, 656180857, 656232277, 589692966, 656362888, 656441449, 656474587, 656506913, 656556491, 656605243, 250937373, 656637958, - 55427091, 45434750, 656658262, 656769056, 656801868, 656836140, 656868170, 116375978, 656916955, 1114123, 656950188, 657014810, 657035095, 657129931, 657179057, - 19841045, 42434581, 657211432, 657228277, 657264472, 3538966, 657326082, 657342474, 657362777, 657375443, 657440777, 902390, 657458422, 657473557, 657490157, - 657522714, 94109706, 79938806, 657543002, 14450818, 657670447, 115721137, 16728195, 657706843, 112427034, 657805148, 657850417, 657932395, 657968989, 19267594, - 658014246, 179765286, 658031499, 658096587, 115785754, 153748510, 361432002, 658145326, 658526047, 658620925, 47546390, 658669614, 658722656, 658833632, 658870113, - 658948105, 658964617, 23838855, 658982639, 659046410, 659066722, 659128341, 659145551, 659177498, 659193887, 129958490, 113737744, 659210246, 659226645, 659243095, - 659293184, 659324930, 659341318, 20365333, 2129950, 659361635, 659603496, 2195574, 659620272, 659653527, 154665431, 659704320, 659754852, 659816479, 5865556, - 659833657, 659898383, 659914767, 5750786, 659931594, 659963930, 659980309, 659997610, 660078594, 163856415, 660098917, 660242718, 660291600, 660307984, 660324389, - 2179511, 67059714, 660344678, 660410215, 126025759, 660488238, 139034732, 660537404, 660621973, 660668445, 660688744, 660819817, 660885354, 660963344, 660979738, - 660996098, 661012501, 270319682, 661031416, 661094466, 661128075, 661193239, 661226319, 136790042, 661258283, 52723738, 661291915, 661356626, 121798743, 661393259, - 661438530, 661471234, 661487654, 661505368, 661554064, 576802668, 477904924, 661589869, 661654446, 661717295, 661749786, 661767192, 661815312, 661831690, 442745724, - 661852014, 661917551, 661979596, 662014093, 662062399, 662130544, 662179697, 194691171, 662274060, 662290434, 6324262, 662306872, 662340043, 662392690, 662441843, - 662536194, 662553038, 662601815, 116375602, 662652233, 662700491, 662749205, 662766415, 662798402, 662835060, 662915261, 662978591, 371277853, 662998901, 663162742, - 663322645, 663342967, 663454366, 663486474, 372244910, 663503715, 663552046, 663601162, 190136326, 109101212, 663620539, 663699991, 663732251, 663765839, 124239929, - 663798231, 663830534, 663847815, 663896080, 663912458, 6946818, 663929641, 229359647, 663963178, 664043625, 664076727, 664109058, 664125461, 664141911, 27607066, - 664191042, 664223812, 664273527, 664306582, 664354872, 664388431, 270189429, 664421865, 664469963, 124796940, 664519539, 664601026, 664633354, 664650858, 664735608, - 664797196, 664813578, 664829973, 664847243, 664911954, 399147440, 664944706, 664978295, 665014137, 665092399, 665124876, 665141258, 493125653, 665157653, 161988620, - 665175265, 665223222, 665259898, 665321528, 665354327, 665404257, 665436226, 665469015, 665519305, 665567244, 665583626, 665600439, 665632799, 665653115, 191545373, - 665698310, 665714775, 665767757, 128155654, 665829387, 665485343, 665846647, 665878566, 241647628, 665895004, 437370896, 665929226, 665976838, 665994063, 665666421, - 666026010, 639500720, 666042427, 3375130, 666075595, 666126118, 150700048, 666173471, 132890640, 666191122, 666256617, 666305424, 666337739, 666386461, 663601164, - 666403447, 666435638, 2719750, 666468823, 666501579, 666550781, 666599426, 666615827, 420593695, 667012989, 1933334, 202622343, 140247121, 667205647, 397852698, - 4997641, 180125738, 667225982, 667357055, 2752514, 667418636, 667436062, 667471744, 667598886, 667616075, 667684737, 667730379, 667779093, 667795482, 667812143, - 667844629, 667861079, 667911185, 667961632, 668008450, 668024870, 668041243, 668074896, 668106808, 668143490, 668254220, 668270620, 668286992, 7602216, 125583370, - 668303366, 668319775, 668336144, 668352522, 668368935, 668402473, 668434862, 124862903, 668483670, 668516354, 27624233, 668535168, 668598379, 150585827, 668631071, - 668647508, 668680274, 668713807, 668745771, 668778935, 649363487, 668815235, 668893215, 668909589, 408600578, 668925981, 668942795, 114786360, 668991514, 126287878, - 669007884, 669024277, 669040706, 669076310, 669122659, 669155394, 669188610, 669221495, 124321798, 669257604, 669368858, 669405061, 669483944, 123830282, 669515782, - 669532619, 669581333, 453476418, 669597715, 669614092, 669630474, 48021533, 669650822, 669746042, 669794320, 669810698, 669827979, 669894347, 669990924, 670008329, - 670040539, 670072842, 264798239, 121454658, 444580274, 670089237, 123273247, 670107022, 266768263, 291111383, 670175112, 670220776, 670253981, 670335968, 670388105, - 184863206, 119359974, 424017941, 670531586, 124864362, 670548002, 670666634, 670715787, 670793749, 670810143, 670826512, 670842890, 670859316, 670892044, 670908442, - 670924802, 670941815, 45433264, 670977932, 671039498, 338264083, 671055878, 671072343, 671125389, 671220171, 671268874, 151732245, 671285316, 671335031, 671367195, - 671399938, 567984166, 671416360, 671432730, 671449547, 671498775, 586186783, 671531019, 671548299, 671612949, 671630159, 671662099, 188481538, 671678919, 671728099, - 195215379, 671764366, 671809586, 671843211, 671908321, 260014111, 671957535, 672006190, 672055317, 672071692, 672088090, 540753930, 672104458, 672120853, 672138123, - 671940629, 672203186, 672235551, 672251947, 672284738, 672318305, 672354191, 672466218, 672514114, 672547105, 371277862, 672579605, 672596034, 672628790, 672661515, - 672677900, 672694298, 669532162, 111656998, 672711669, 672776213, 672793053, 672825382, 672841730, 672858133, 672874583, 672924513, 672960400, 673005570, 673022008, - 673054786, 673088353, 673120266, 673136679, 249298982, 673169843, 673206161, 673267728, 234848266, 673288082, 287572271, 673382412, 569360410, 673398822, 538116127, - 673415702, 477937670, 673448468, 673497107, 673513493, 673529896, 673546266, 236355643, 673562655, 673579018, 6619563, 673598165, 673644546, 673663044, 673710711, - 673742869, 673759263, 673776501, 673808843, 673861523, 8392596, 673939522, 673972255, 4342243, 673988714, 674072726, 133547353, 674120126, 6127644, 674189205, - 674303894, 2834464, 462159914, 674385815, 119440883, 674562069, 674580404, 149504029, 674664344, 543850562, 674728422, 674759172, 674811801, 674910106, 675004458, - 134104264, 675021103, 675057563, 675135494, 675151878, 675168268, 54493224, 184388096, 311214475, 675184699, 675221404, 675315728, 675332111, 675348502, 675364895, - 224739366, 675383808, 220776114, 675430440, 675446850, 675479651, 121799520, 675512326, 675528725, 675545090, 675561501, 142852112, 675578895, 675631005, 8605598, - 8392607, 675696544, 675840093, 675889194, 675905576, 675921951, 121929738, 675939113, 675971126, 676003850, 676020855, 676053023, 675987472, 548438056, 676069407, - 676085775, 676102165, 562250620, 676122529, 676233269, 676265986, 676282389, 676298839, 676347925, 663765023, 676364512, 264421977, 676397948, 512720906, 676446248, - 676462604, 676478986, 676495991, 676528155, 676560953, 676577739, 676626488, 676660047, 676692873, 122503180, 676741929, 676774936, 676823572, 676874349, 676921410, - 676954138, 676971403, 677036567, 677069854, 677101599, 170704950, 677117973, 677135200, 677200386, 677233271, 677265501, 677318562, 677396597, 677429762, 2196136, - 677462018, 677478410, 677495415, 677527573, 677544411, 677577757, 677625922, 677658643, 677675039, 128991273, 677692406, 677724200, 190595088, 677741003, 677790327, - 677822480, 139329562, 677838945, 677905310, 677938675, 677973746, 163726230, 678037065, 678118429, 678166615, 678215719, 678249208, 147505190, 122667018, 678282787, - 678330408, 678347596, 678395914, 678412919, 678445122, 678478816, 678526986, 678543399, 678576166, 678592539, 654557408, 678625735, 678674463, 678690826, 678708215, - 678772755, 678789141, 678805591, 678855089, 678887445, 678904672, 678973261, 679034946, 679068171, 462734421, 679118382, 199458898, 679166890, 679247928, 679284643, - 679363474, 631734747, 679413332, 679514020, 679624725, 679641998, 679706655, 679723024, 7734081, 679739402, 679756619, 679821343, 679837706, 679854082, 679870520, - 679907237, 680017935, 680037675, 680083458, 228491285, 680099866, 680116226, 680136614, 680181772, 680198228, 154714152, 680230988, 680263712, 680297477, 518307982, - 680378592, 680411157, 5079517, 680428889, 198754541, 680464295, 680542218, 680559889, 680607783, 678363148, 680640572, 680722913, 680775592, 680869890, 117424166, - 680886328, 680919106, 217923600, 680952345, 681021353, 681181186, 681198039, 681230342, 2850832, 681247147, 681279503, 681295893, 681312287, 449397621, 681332650, - 681413881, 681459743, 681476115, 681492501, 681509728, 681574507, 681607197, 681623583, 681639955, 681656322, 681672725, 681689154, 681722145, 3424277, 681755479, - 46891018, 681788745, 175784872, 681836971, 261981052, 681869371, 681902106, 51855391, 681918474, 681935275, 681968723, 682034232, 682102699, 682164264, 682180629, - 682197079, 229654554, 682247275, 682282924, 682361291, 682409996, 682426394, 682442758, 682459568, 682491963, 682524710, 682541083, 114294790, 682575146, 250396701, - 122667036, 682623036, 682704923, 682737676, 682754054, 682770451, 682786882, 682823597, 682902350, 682968073, 682999818, 683016823, 683052974, 683118511, 683180098, - 114769988, 683213337, 683278392, 683311135, 683327504, 683343882, 683360295, 289767462, 683393916, 683443102, 683474971, 683508637, 683591163, 683638805, 683656060, - 683704339, 229113922, 683724720, 138625064, 683786278, 683802630, 672890911, 683822773, 683901961, 683933755, 357285926, 229965835, 683970481, 449609750, 684213186, - 684245051, 684281778, 684444208, 266766796, 684491715, 684543923, 684605482, 345704143, 684625844, 684691381, 416284885, 2196029, 685033008, 685064675, 685098040, - 685162785, 320127042, 685195501, 685232054, 685294023, 45252634, 685346743, 685408340, 685442036, 685490228, 685526968, 685670703, 685703252, 685739961, 685820464, - 685871034, 685998563, 686030914, 686064608, 6717471, 686112818, 686145590, 686181061, 686244315, 686276618, 686292994, 686309397, 686325847, 686376282, 686407711, - 686424547, 2326550, 686457739, 686522379, 529023016, 658112524, 686542779, 686770953, 686817339, 246087708, 686854076, 686965039, 686997560, 687030348, 122601482, - 687063541, 687095810, 687113074, 687144970, 687161375, 687177747, 249987115, 687198141, 687276569, 434963396, 687342622, 687374372, 54460427, 687393681, 687492848, - 687574974, 687734815, 7045132, 687751470, 687784367, 687816795, 687849902, 687898643, 687915020, 687931398, 47316998, 687951807, 687997820, 688046185, 688078850, - 688095253, 688111703, 688164800, 688242719, 688259114, 335446038, 688275482, 1818655, 688291880, 688308290, 688341941, 688754626, 688914862, 688964494, 689029967, - 49676344, 310297838, 689064379, 689196995, 689258601, 6619202, 689295213, 207650915, 689360836, 520077371, 689426373, 689622982, 689721287, 5324827, 110248399, - 689835976, 1982490, 689897510, 166346764, 689917897, 689997433, 118292783, 205144090, 690048970, 690192413, 1114152, 214319142, 47120390, 110233510, 690209071, - 690245579, 690421816, 4997249, 690458572, 690552854, 690570063, 690602022, 690618671, 45760543, 690655181, 690765922, 129942900, 469630995, 690800104, 690851790, - 690946058, 690962444, 2162694, 690979246, 691028399, 691061655, 93945882, 691113935, 691340278, 691372174, 691404812, 27246594, 691425232, 2196979, 691572689, - 691654273, 691720146, 691783579, 691847170, 18153509, 691864432, 691912742, 316293186, 691929094, 293601317, 691948079, 154767315, 692011067, 692043815, 692078169, - 692125712, 116228111, 692142139, 224018470, 692178900, 692256795, 235307010, 692289538, 692305930, 47120413, 692322763, 692375509, 119997393, 692506582, 692617323, - 116884303, 692650025, 692666379, 692682768, 52805642, 692699162, 692715566, 692768006, 692830274, 692863411, 113541165, 692896656, 146653203, 692932567, 693063640, - 693158735, 693194713, 3212787, 693403669, 693423318, 693519328, 693568168, 693600794, 306954382, 693633960, 661012501, 693665807, 693682192, 693698570, 693714973, - 693732220, 269550082, 693784538, 693960788, 557219947, 693993579, 594886715, 694030299, 694095836, 694173712, 147652634, 694194141, 694226910, 694324139, 597475330, - 694406889, 2146528, 694470139, 657965058, 131334251, 694521823, 474169546, 694669280, 694751201, 694812718, 694861830, 694878229, 694894604, 537772058, 694911035, - 694943843, 694976528, 6374430, 694992898, 180437002, 695010851, 569098242, 695062498, 51855379, 695124028, 695206765, 695259107, 695320896, 147407705, 695353412, - 3211303, 7733485, 695402562, 695439332, 695484432, 168902763, 112608168, 449659310, 695504869, 124862935, 695782477, 695844981, 695877658, 695894446, 695943184, - 291096639, 695963622, 696074670, 51429406, 696123438, 2197525, 696173081, 696238101, 696255311, 696287663, 696324071, 696434780, 239648770, 696468343, 696500262, - 696516639, 277053461, 696533004, 696549402, 696565791, 696584503, 696616353, 696664074, 696680454, 696696848, 332103706, 696713675, 696762881, 118456336, 696830294, - 110231652, 696881079, 696946664, 697094121, 697204774, 223182879, 697225194, 697271081, 697307115, 697384998, 697401428, 697434138, 122568735, 1114117, 3375135, - 697452283, 697499950, 2195990, 697533830, 128155659, 345161782, 697602028, 697811870, 110445027, 697847789, 2196311, 500711436, 697942949, 204587039, 697976010, - 698023962, 381190192, 138018862, 698040358, 698056742, 307610030, 698073142, 199049226, 698105910, 698139560, 170754058, 698171999, 155926544, 698208238, 698352749, - 698384396, 152945493, 698404847, 64765994, 698466951, 698516852, 698564710, 698601456, 698695785, 698728460, 79691805, 698990604, 44679194, 699008894, 699039789, - 699072580, 699121694, 699154539, 699187206, 66928655, 6193183, 699204951, 699252762, 699269515, 699305970, 287130114, 117506351, 699387891, 699535348, 6377461, - 699581223, 699596821, 3375911, 206225436, 699613286, 27852828, 699648702, 699698393, 699781110, 699844576, 50266150, 699891750, 699912183, 54493200, 699990075, - 700022886, 700055564, 700071974, 700092408, 700190713, 700351674, 700387322, 700469243, 700695159, 700727317, 700743682, 700760083, 247234597, 700776450, 700792870, - 700809218, 700825610, 122732563, 700843507, 217710608, 700874790, 700891157, 700907560, 385187866, 700924961, 700956674, 700973067, 47529999, 700989499, 701022227, - 272384021, 701038623, 701054997, 320913474, 701071370, 701088167, 701136936, 701153306, 701169706, 701186060, 254197770, 701203033, 701235238, 701251622, 397000735, - 104005663, 701268427, 701317122, 701333510, 332742696, 519143430, 701349929, 701366313, 701382668, 701399147, 701433139, 701480986, 229654549, 701497360, 701513757, - 701530152, 104005651, 701546508, 701562937, 701579280, 701595686, 701612072, 701628437, 547880991, 701644821, 97681434, 701661196, 701677675, 701710348, 701726751, - 701743146, 93978646, 606405571, 701759920, 701796348, 701877862, 701911037, 701974333, 249987148, 702022091, 702074878, 702156799, 702367065, 702398476, 190595088, - 702418944, 702464066, 175014359, 2196571, 702499316, 702545974, 702578754, 702611543, 702664705, 702763010, 702957427, 702992387, 703102978, 52674570, 136856423, - 136627209, 467960679, 703119419, 152962252, 703152975, 703185397, 703217806, 145473538, 703254532, 2130729, 152963339, 703348746, 703367519, 703418373, 703578122, - 115196535, 703594526, 703627275, 703643650, 2605082, 703660042, 124863064, 703676442, 1916994, 703692866, 592707610, 703725606, 703741990, 147226655, 703758873, - 703824339, 357597200, 703873451, 703906601, 703938600, 703955618, 159301663, 703991003, 185270310, 704086049, 704135178, 704151573, 112918580, 175784028, 704172038, - 704300117, 704331835, 704367896, 704417799, 704480627, 704513451, 2195573, 524910648, 704565256, 704793564, 704839712, 704873816, 704922718, 704970788, 704991241, - 8388798, 705056778, 2031639, 705134699, 374931484, 705171467, 705282114, 705315576, 52346892, 705350132, 110248427, 705396802, 705429560, 394379290, 705462338, - 140247147, 147064137, 705495070, 2408488, 705531916, 705646605, 126615557, 705712142, 131334346, 705855500, 705871882, 6029341, 705888545, 705925135, 706052618, - 7259145, 47120395, 706084970, 706167838, 706203664, 2195890, 706363402, 706379779, 9109527, 19267590, 706400273, 50118693, 51658757, 706445340, 96256135, - 293716083, 182552597, 707039252, 5619727, 8389124, 707170325, 707264534, 578043935, 707285014, 464748560, 707445258, 707481623, 608731148, 707530776, 707579929, - 707674992, 301023244, 707723333, 115966006, 707759213, 707839099, 707870779, 707903500, 5619728, 707923994, 708071451, 708169756, 708329904, 152272934, 150683660, - 708366365, 708431902, 6897730, 708477943, 708546591, 708789342, 416612378, 708837429, 708871569, 708936527, 708968513, 709017641, 5275650, 709038112, 709115926, - 709132290, 569116108, 640843830, 709149634, 709183815, 709234721, 709312522, 184926211, 709330581, 709398562, 709480483, 709544282, 554270732, 709657490, 709705833, - 207620196, 709742628, 6422568, 709804034, 709820422, 709836821, 709853200, 709869594, 122585119, 709886398, 709951596, 5309640, 709988389, 124863411, 710086694, - 710198128, 710246426, 710262813, 447840262, 710280853, 119999024, 710344726, 388857858, 710364026, 710397991, 200492062, 710496296, 710558729, 115769443, 710594601, - 710787156, 45858842, 710819856, 167084058, 710840362, 711168043, 2197374, 27623903, 711315500, 300925450, 711413805, 8392630, 711479342, 711558112, 711607725, - 656441354, 711656327, 184389679, 711708720, 711772059, 711839793, 711886097, 711933983, 711950338, 116850726, 711967742, 712020018, 712118323, 712279474, 227639306, - 712347700, 712409325, 712445037, 712524809, 712560693, 327483404, 712655331, 712687643, 712720921, 712786002, 712818775, 712868291, 712901040, 126763051, 712934602, - 712982635, 3899451, 713019446, 713064486, 654983206, 713080844, 15351846, 713098391, 713150519, 109051943, 713228294, 713244691, 713261096, 205029414, 713281592, - 713392194, 713424906, 713445433, 25559515, 713491486, 713524047, 713560122, 713658427, 713769047, 713819019, 713884079, 713917293, 713966027, 180404230, 714014828, - 714048780, 714100796, 714162235, 714195046, 54460444, 714231869, 157646876, 714276892, 7634986, 714297406, 714559551, 714621848, 714674240, 714735724, 97271818, - 714772545, 714833976, 714870850, 714948667, 714985539, 715051076, 715132997, 702201868, 715194449, 715231302, 208848462, 715309066, 715326479, 715374630, 715392344, - 715441560, 715493447, 6373457, 715571238, 319717435, 510771238, 715589545, 715637646, 715706440, 715916402, 715964492, 715998064, 716046638, 280445033, 141705282, - 716079110, 277954581, 716098254, 117899357, 716214345, 716341274, 716357648, 228294662, 716374122, 716456044, 587432396, 716488797, 716539513, 168722442, 716591178, - 716652628, 716689483, 716783638, 716804172, 319455992, 716850197, 716898335, 716914753, 716964898, 716997528, 567984166, 717046672, 225313415, 717079969, 717127787, - 137379869, 717160507, 717193238, 717212833, 115458076, 255459347, 717242517, 32817287, 717279309, 717340788, 126746636, 717738063, 629964852, 115294219, 334070235, - 717803600, 717918289, 87539738, 717963346, 717996061, 718012848, 718045222, 718061634, 146489350, 718098514, 718160719, 718193504, 718262355, 718324017, 718356561, - 718393428, 718537748, 114049045, 718590037, 718667788, 718684198, 159760422, 718704726, 718917681, 718965003, 719014388, 227787253, 450334807, 148620209, 719065176, - 719110196, 719144136, 608108546, 294649922, 719176584, 719229017, 719438256, 719471051, 719523930, 719783219, 719833109, 252297575, 719863820, 719880652, 719913560, - 719945768, 150077450, 558499776, 719962143, 719978526, 477184002, 720011723, 720060426, 5505061, 278167989, 720076884, 720109652, 720142439, 720225452, 720277595, - 703365636, 720408668, 720502806, 720519234, 8390401, 1933343, 720553132, 720605277, 706002946, 27623478, 720670814, 720814164, 720849545, 5472296, 720912400, - 720928808, 720945178, 114409491, 720964416, 721031263, 721125386, 721141823, 243040278, 721178720, 54460438, 721227224, 523599981, 721273291, 721326177, 721567810, - 721604706, 721666156, 721700252, 721752163, 721780802, 721817700, 119358494, 721881141, 721930836, 7733317, 721981541, 722043456, 722075654, 477904918, 722092098, - 722125714, 313839718, 722178151, 722291148, 722338710, 152948662, 140476887, 722387862, 722437014, 722489448, 3228075, 722554824, 722616849, 722649110, 722666390, - 291455002, 722714651, 45613068, 6833909, 722751593, 722846210, 722878530, 722911879, 722960394, 275791900, 722980451, 723026011, 120979468, 723062890, 723140630, - 723161164, 8391849, 723206210, 723238971, 723275883, 723324838, 723374188, 477937666, 723521645, 723566604, 265027594, 723583002, 723599372, 723615750, 723632140, - 723648538, 122667065, 723664917, 723682131, 723746826, 723763202, 723779622, 126599204, 696288812, 723800174, 723845146, 723861506, 723877903, 723894294, 687997846, - 723910710, 210583594, 723943460, 250085382, 723964015, 724026280, 724058150, 724078704, 724173647, 724205770, 564903995, 408833666, 724242545, 724422770, 273924112, - 724484203, 200736774, 724516892, 724533274, 17383539, 724551677, 724598795, 456966146, 724615260, 724649925, 724683320, 83918855, 724717683, 580861962, 724828229, - 724860947, 724877322, 724893812, 573751338, 724910102, 641531940, 724926470, 724942879, 271138831, 724963444, 2326533, 725027412, 725075546, 20365352, 725110901, - 725139485, 725160054, 725206387, 725237781, 725254154, 38879268, 725271011, 725303334, 725319696, 725336092, 725352460, 725368843, 456966156, 151896100, 725766264, - 725860378, 725876820, 725911193, 62341126, 2293779, 725958678, 725975061, 725991436, 123650059, 726012025, 726156439, 726204447, 308576284, 726222153, 726270004, - 726302794, 726372474, 47546406, 8392827, 726487164, 127500319, 726536317, 726663278, 726695938, 29900819, 726715159, 726777887, 321863682, 726796976, 726843847, - 726892582, 726908930, 51839007, 726925322, 726941742, 726991150, 515031342, 727027838, 727121951, 727139884, 119570460, 533069883, 727175295, 119359024, 727304573, - 727385890, 727418416, 727450518, 24297911, 727502976, 635633666, 727650433, 727711746, 571801657, 147013653, 727728169, 727748738, 2195916, 191678073, 608108575, - 727859503, 727896195, 727957506, 727973894, 601522182, 727990303, 728006666, 728023099, 728055892, 8994953, 728088641, 728141180, 291160095, 159137818, 728174724, - 22216820, 728432670, 728465434, 728482016, 2835379, 728514572, 32063777, 113672278, 728534172, 728581601, 728699013, 728780934, 522980563, 728895623, 728957820, - 729006090, 729022466, 729038869, 217628738, 729055253, 161595413, 729071713, 121864220, 729137167, 254595208, 729157550, 729223305, 729268226, 729286486, 729333859, - 729366987, 729415692, 729432090, 729449276, 729501834, 729809950, 729845899, 7733287, 729956382, 729992897, 730054715, 275546122, 730087426, 7045160, 184894633, - 730104279, 154767500, 730136630, 386535413, 730169410, 730202138, 108658716, 730218967, 730251327, 126959653, 730284048, 2361407, 730301470, 730333408, 57032744, - 730370189, 84934694, 339296272, 409944083, 730447910, 730464299, 730501262, 730678570, 730726832, 730763407, 730808322, 523976715, 730827386, 730874526, 730908501, - 164479007, 730972619, 731025552, 27852841, 731086890, 731104669, 731152386, 110215270, 731173009, 59228176, 731271314, 731353235, 293502992, 731512834, 147341349, - 731529309, 731579223, 558841883, 731613567, 731676754, 87539722, 731709494, 731742214, 99893254, 112427029, 731762836, 732074133, 732136777, 4161548, 732184663, - 732234488, 732269677, 732350914, 2197979, 732397644, 500910540, 732434582, 732545069, 732582039, 732725725, 732758863, 732790790, 732810116, 45760543, 732875162, - 732958872, 162791446, 313786839, 733052968, 300892189, 733069844, 280903701, 125927434, 733118504, 295731215, 733134954, 733221017, 116375776, 733267928, 733333081, - 733383183, 733446184, 733462566, 733478955, 110215267, 733513023, 300925035, 733579000, 733659167, 733676574, 733712538, 361316784, 733790654, 733856375, 733892763, - 733955102, 733986847, 338493450, 118883151, 734007452, 734184635, 11157514, 734236829, 734347371, 734384224, 734430078, 247234570, 734463707, 734496667, 734560793, - 734625899, 734659525, 734708144, 734740564, 116376606, 734774155, 734839696, 734872011, 184926219, 734924958, 735154335, 735199687, 735248406, 735265227, 700022894, - 735318176, 735400097, 735461388, 735477786, 171163669, 735496896, 459785438, 735560139, 137445382, 340283554, 735613091, 735674455, 735724280, 4341802, 735760548, - 141459468, 735821826, 5869158, 735842469, 327663642, 735952952, 735985676, 436717993, 736002507, 736052595, 736085120, 424017942, 736137382, 736215887, 736252071, - 736346246, 33243267, 736364080, 736395285, 736413556, 736448680, 736493609, 736509974, 102858780, 736526343, 736542852, 2621575, 736559116, 736575529, 736591894, - 736608387, 736624682, 27344933, 736645289, 295649318, 736724108, 146456613, 573620262, 303611932, 736776362, 30392338, 736821267, 736837642, 736855802, 736886812, - 96190493, 736903189, 717226005, 736919581, 736935942, 28016642, 736956587, 737230904, 737263703, 737312796, 737329154, 737345555, 737361941, 256032780, 737379924, - 737477368, 737513644, 737689640, 737706022, 737722406, 5505060, 103940122, 737738764, 737755157, 128761887, 737771530, 49774630, 737792136, 737821665, 584990746, - 282853402, 96026645, 737857709, 737902684, 19447814, 737935897, 738001861, 738054318, 738136239, 738201776, 738328605, 738344989, 115589151, 298614810, 207962124, - 738361356, 234176519, 738378641, 738430156, 738492435, 738508857, 738525196, 738541625, 142180374, 738562225, 738591184, 738639882, 204488735, 738657169, 738705414, - 8994823, 521617444, 738721821, 738738182, 738754617, 738770984, 738787444, 738803750, 17449076, 738824370, 738885642, 738902045, 738918430, 738955425, 739016763, - 576880678, 593117194, 739053747, 739147795, 739165080, 739213334, 172703775, 739233972, 739295258, 7734103, 739311628, 211173402, 739328913, 739377376, 739411303, - 739475487, 739491869, 1769474, 739512501, 739607561, 567083067, 739640270, 202522662, 739672169, 739704853, 739722108, 116213292, 739771010, 739823798, 739950614, - 381829146, 739967007, 739983370, 739999756, 44302342, 150077452, 740016166, 563265538, 740036791, 740081676, 740098086, 740114444, 740130837, 452100180, 128974886, - 740147216, 740163591, 546799647, 740182584, 7454742, 142180381, 740214257, 7602198, 740249784, 740364473, 740425750, 740442128, 502497306, 740459972, 740491348, - 740528314, 740590027, 441385391, 740643003, 740708540, 487965248, 740802576, 740818970, 131891236, 740839613, 740933654, 740950451, 740983772, 741015590, 741031952, - 741048377, 741064706, 201998373, 741081172, 131875664, 153174054, 741113896, 741130246, 219889674, 741150910, 741213596, 2360772, 131891257, 741261420, 741294096, - 741310483, 741326870, 160727056, 741343275, 295649295, 500842515, 741376105, 741409674, 741441839, 381550629, 741474330, 45023268, 741490690, 48447525, 741509117, - 204996620, 742133952, 742281409, 742523418, 742555679, 742572042, 742588447, 742604806, 124108821, 742623657, 742653954, 244170783, 231768095, 742671201, 742703110, - 181141525, 742723778, 742768742, 742805699, 742883420, 269287440, 312033333, 176963596, 742920388, 742998056, 743014410, 55132163, 743035077, 743100614, 743145503, - 743161877, 743178252, 129400851, 743194636, 131432458, 274120758, 743214479, 743277717, 743309328, 49790987, 278872076, 442974239, 743328854, 743407682, 659914794, - 743440405, 743456794, 743473164, 743489555, 743505922, 743522310, 234405909, 743538912, 412139579, 743572131, 743621455, 743653382, 743669781, 56639504, 743687378, - 743718953, 307134490, 743735810, 743772075, 743833612, 447840282, 743854279, 743964712, 332742713, 743981087, 518488121, 743997456, 354369577, 744018106, 49774634, - 155779084, 744079372, 312180742, 744095760, 11157544, 744112235, 253624404, 744149192, 288620664, 744308755, 293715989, 744329417, 744390665, 9207837, 744407049, - 744423435, 67240073, 744439810, 410206245, 744456215, 744472599, 744488983, 2179110, 744505479, 744521754, 744538149, 744554497, 77709341, 744571011, 744587293, - 1212434, 744603671, 51839018, 744621322, 76709906, 13074442, 744652818, 744669224, 744685578, 744701974, 17924103, 744718937, 744751132, 9535525, 744767498, - 2523178, 745230538, 745390112, 745423893, 542425090, 112918670, 745472131, 59883651, 745490613, 745537552, 470007813, 44908582, 745558219, 745767014, 745801531, - 108658710, 745849121, 5865526, 47120424, 745882132, 745931223, 201524424, 275447820, 745967820, 746192912, 461963269, 746210275, 746260415, 746356822, 25559094, - 746393805, 92930090, 746536999, 746574030, 4998174, 746701334, 98107418, 746737871, 746803408, 197722141, 746881053, 404160552, 746898441, 746930400, 118865935, - 746967249, 149127263, 747192358, 747208706, 245301277, 747227508, 747292776, 312410114, 747340000, 257933314, 747373060, 747421778, 4964383, 747455886, 6373475, - 747524183, 747569211, 747601979, 747636469, 747683866, 747700250, 747716620, 747733008, 747749397, 88948772, 747770066, 134627338, 747901139, 8392916, 748060731, - 748094633, 236716042, 748128059, 748175823, 748212437, 748470294, 748486722, 748523734, 748620744, 748687575, 748748812, 748765210, 748781587, 748797974, 748814362, - 748830756, 50266118, 748848234, 140247145, 484016226, 748929064, 748945439, 169787418, 748962710, 749015256, 749113561, 136790018, 749207611, 749244634, 749355018, - 8391135, 749371413, 749387778, 749408475, 749502486, 749519151, 749555932, 749867229, 749961761, 750014686, 225181738, 750063839, 2195614, 750288922, 16728082, - 510312866, 750308265, 62914570, 750354735, 750387216, 118210570, 750404520, 2588738, 750436436, 750470022, 45465606, 750506208, 750633019, 750666160, 750702817, - 750801122, 750899427, 66928681, 2195669, 751014116, 750305282, 751093326, 751141323, 751190446, 751241367, 751288623, 171556948, 751323406, 266190887, 751371339, - 161988624, 751435883, 751468976, 5619723, 5619723, 751502749, 751550556, 751583339, 751616011, 751632400, 51871784, 751648834, 751685861, 751866086, 751976514, - 37438738, 752009254, 752025606, 178765881, 752043382, 435781663, 752095463, 533544991, 752174136, 752239121, 752271672, 752304212, 752337808, 168706114, 752373992, - 361431094, 752472297, 752582666, 8392938, 119799864, 752600843, 207622379, 6833854, 752685292, 752779293, 752797453, 752832749, 752931054, 752996591, 753057808, - 500711464, 753075209, 357793818, 753106998, 456738835, 753139778, 753172518, 753190560, 115179558, 753619185, 27624386, 173443541, 753684722, 2719784, 753799411, - 753958924, 753975334, 753991692, 754008083, 754024469, 232030234, 323207206, 66928655, 117751820, 754045172, 754172958, 124864998, 754204732, 754290933, 274120763, - 754402216, 8390624, 754435560, 754483960, 140247887, 754520310, 754585847, 754761766, 754782456, 2195605, 8389314, 2130209, 755056642, 755073043, 55377957, - 153878574, 755093753, 371605516, 755159290, 13238295, 19267641, 118882904, 755241211, 115785754, 73187368, 755351554, 607617131, 755370056, 4292690, 755503356, - 132579433, 755615948, 755646476, 184713254, 755663786, 755744806, 3211369, 24969226, 755765501, 2342928, 755896574, 755978495, 756074213, 756121626, 270516236, - 756142336, 756252684, 115523595, 756269527, 1982495, 47087643, 756302870, 110231618, 756351042, 756383798, 540049446, 756416618, 756498508, 756535553, 756663217, - 341573698, 756698946, 756744734, 146456578, 76742696, 756793420, 756826143, 756846135, 180158466, 756896002, 757256451, 51871760, 757350516, 110248368, 757371140, - 357597186, 757465921, 757498251, 757532217, 757628938, 545259562, 757645418, 757731589, 1196042, 757792780, 146653222, 59310102, 757813510, 416727052, 757891078, - 599130140, 757907915, 366907655, 8389571, 757960968, 758087690, 1114115, 132776362, 19038214, 758104076, 758120507, 758157577, 758431754, 758448170, 112754700, - 458014742, 758466932, 17154064, 758530058, 758546463, 686424106, 758564252, 758612052, 758646105, 758677570, 78479366, 758710755, 115785750, 758747402, 283721794, - 758825807, 758858187, 27246602, 758911243, 758956042, 758972950, 759008278, 759073921, 759119931, 759157004, 338133459, 2359927, 759267349, 65880066, 759288077, - 5325291, 759350841, 759451918, 759516513, 759566607, 759648528, 759714065, 759812370, 25562369, 759943443, 760004610, 112754728, 275546114, 760021008, 760037613, - 760071678, 760136592, 628981762, 760168514, 760202391, 113246289, 760250827, 760302345, 760350386, 219824167, 760382376, 2523146, 760418580, 760610909, 760659990, - 760677504, 2130865, 760729877, 760860950, 760905730, 29900806, 760926058, 761004886, 761053230, 761103390, 153191302, 761135106, 2195556, 761151490, 761167979, - 232079391, 761201542, 761233492, 761267256, 761331819, 3178525, 761368855, 761614616, 761709480, 57950220, 761742159, 761774095, 22216726, 761793344, 761856066, - 761890134, 761937951, 150241322, 761954763, 762003477, 762019866, 125796364, 445841446, 162499484, 50266148, 762040601, 762266563, 762314859, 762348485, 15073311, - 271384591, 110247986, 762397672, 762445931, 383320086, 762479959, 762531829, 762560737, 318832666, 762597658, 196149274, 762658911, 762709086, 762757146, 184389915, - 762774422, 762822689, 2196680, 132481106, 762871829, 762888219, 442859957, 762920982, 762937375, 762953738, 131858491, 762970178, 266191121, 763003724, 763056412, - 763101237, 763134885, 763166786, 203325451, 763199490, 3244114, 763220253, 763400478, 150585791, 763498783, 763756812, 763810080, 19841055, 19251671, 205144092, - 763875617, 764055842, 188760254, 8392995, 764494720, 81756200, 764547364, 24838150, 764612901, 108315125, 764678438, 2196343, 764759844, 764821525, 764837904, - 198672426, 764854301, 764870710, 764907815, 765100054, 125796368, 4393446, 765120808, 765181981, 5882713, 765198795, 765248395, 765313261, 113115165, 385515574, - 765346081, 765382953, 765628714, 402145282, 765689882, 191053836, 765706266, 765722636, 765739010, 307298315, 2195566, 765755629, 765788247, 367886857, 180601320, - 765837399, 172703754, 765886466, 765902886, 405865446, 765923627, 766001179, 766033986, 766071084, 766198194, 766230549, 7634980, 766246949, 766263317, 99876874, - 766280075, 766312457, 766328969, 3309597, 766345257, 766361637, 766382381, 154423598, 766415151, 766493201, 22069379, 766525556, 766541846, 766560417, 766591005, - 766609326, 766640244, 766656552, 766672918, 2523177, 766693680, 27705384, 53870611, 608731143, 766803973, 766820380, 98107408, 766841137, 766873906, 766935156, - 766951461, 2523252, 766967829, 628326436, 766985536, 767017076, 767033363, 255459369, 767051717, 48480271, 767082524, 767098909, 118882373, 56426506, 767119667, - 767182817, 767230250, 767263018, 66814250, 767754370, 767770642, 62341252, 767791413, 768037174, 768098325, 768115120, 52609062, 768147466, 768165693, 768213023, - 112476217, 768233783, 768458806, 93978626, 768493835, 768541481, 768574876, 768623742, 3227747, 768671763, 122683429, 768688174, 768738113, 256656305, 768770132, - 768807224, 768853615, 768902153, 768935411, 768966722, 768999856, 769036601, 769146978, 228737030, 340132705, 48070668, 769184058, 769327246, 769359931, 537837667, - 769392652, 769409062, 769426751, 237715693, 769495355, 769704468, 433750123, 769754121, 769786393, 769851499, 769884236, 769917815, 769951110, 770019644, 770085181, - 13713543, 770277457, 52330522, 333136834, 770310165, 770326670, 770359362, 770392102, 6374312, 770412862, 770609471, 770740544, 468189815, 770785301, 770801670, - 3375116, 770822465, 770932748, 770949158, 172752898, 1785872, 770965523, 219529238, 770986306, 771032073, 771068227, 763166760, 771212200, 152945070, 771245332, - 771293213, 771309634, 358514709, 771342967, 771379524, 771440661, 771457055, 771473450, 183369738, 771494213, 771572183, 771604511, 771620885, 771637250, 114409493, - 771654062, 771704033, 152813570, 771756358, 2197929, 771899695, 771933325, 20365334, 771982905, 229527879, 772080247, 385597919, 772113509, 119226409, 772165960, - 772247881, 772329802, 772378955, 294633514, 119226405, 8701882, 772457578, 772538378, 772554773, 25559092, 772572329, 772608332, 772788557, 772980795, 773013939, - 773050702, 773099855, 773165392, 773210133, 172982331, 773230929, 773341200, 773357575, 773373988, 773390374, 773406722, 773423328, 232079414, 445726722, 773456161, - 773489111, 773522050, 773574994, 122732550, 773719189, 2506793, 773750865, 773783580, 773799966, 773832730, 773853523, 773902676, 773980920, 774012930, 774029350, - 208601119, 774045717, 774062111, 774082901, 774128075, 774181206, 774259594, 126615590, 774292216, 502759443, 774328663, 774489004, 774554514, 131842129, 774602795, - 774635628, 774668310, 774684684, 116277274, 774705496, 774799827, 774848965, 774881340, 774964319, 775033177, 775094293, 775111503, 775143430, 775159839, 775176233, - 31424543, 775192671, 775242257, 564887562, 86327336, 775278938, 264717286, 679755842, 775471116, 119259162, 775487572, 775520266, 775536671, 775553936, 775590235, - 775634975, 775651334, 775667718, 775684127, 119210000, 775700572, 775733254, 775749698, 775782412, 775798790, 775815174, 2850847, 775831776, 775864747, 775897107, - 654983194, 775913498, 775929896, 625688595, 775946543, 775979019, 678264863, 775996797, 776045768, 776077399, 776130908, 300335125, 776196445, 776258472, 776294750, - 776357433, 776456174, 776504233, 776552479, 776568842, 776585218, 776601638, 776618015, 776635280, 776667157, 776683536, 776699945, 776716372, 119800243, 776749279, - 776781845, 123912258, 776799627, 776851807, 139039072, 777015649, 232996930, 777076767, 274300947, 323305531, 777097570, 777160132, 777191445, 777207895, 8389607, - 777257062, 777289759, 777306122, 777322527, 47611923, 777339183, 357990419, 777371667, 777389032, 777437250, 777473915, 777523555, 555270154, 777799012, 24297932, - 143393071, 2129972, 777864075, 149128082, 3260475, 777933156, 778146149, 15007782, 778174767, 778207911, 778240040, 5619738, 19808322, 778256406, 778272794, - 231555088, 161710082, 778293606, 778403880, 233193482, 538198082, 778424679, 208977979, 778485770, 778502184, 119881749, 778522984, 778735977, 186466370, 778863051, - 668696597, 778911782, 552878101, 778928144, 778944522, 2195716, 778965354, 779075873, 448102421, 779109216, 779178347, 779239436, 779257217, 779305867, 779371018, - 4998816, 779403801, 779470702, 779535010, 779567134, 779599882, 779617881, 779665867, 779714626, 273203210, 779751788, 779911178, 779928183, 779960462, 779993119, - 780009510, 780025894, 47284226, 780042271, 780059051, 780091402, 321307255, 780109299, 780140610, 780173327, 780189711, 25559887, 780206617, 780272151, 780304440, - 780337218, 780369966, 780419596, 780451861, 780469088, 9535497, 780534060, 780570989, 780669294, 780746758, 780763157, 142950459, 780779979, 780828678, 211173388, - 780845593, 780915055, 780996976, 781041751, 781090822, 781107219, 108315224, 238059526, 781123650, 137101746, 781156654, 781189591, 781223801, 781275505, 781455730, - 184926229, 781565967, 781582395, 781615209, 781652339, 781762978, 781799796, 781877274, 781893691, 781927031, 441368588, 781963637, 277954579, 545472538, 782041104, - 563347494, 782058009, 782123018, 437932406, 782142004, 782172619, 782225783, 782289079, 782337013, 782406008, 782565417, 782581772, 782598154, 782614554, 782630978, - 782664100, 155832456, 143753222, 782696460, 2408486, 782715115, 238551511, 354369552, 782782841, 113246240, 782848378, 137101411, 782897531, 783061372, 48054283, - 2196343, 783176061, 180764698, 462487580, 114393110, 783237186, 783269942, 783307134, 32849948, 783351867, 115294237, 783384605, 783400986, 783417428, 783450133, - 783466955, 783515690, 783532044, 52609034, 783552895, 783827025, 3228408, 783860213, 783892622, 617923019, 783925274, 50511910, 783946112, 110182689, 511656173, - 783991883, 3244131, 784056330, 241434660, 23085066, 155828312, 784077185, 784175490, 784286709, 784355715, 381829157, 784470251, 733102092, 126042123, 784517191, - 784568708, 784646154, 56557580, 784662570, 2195935, 50118668, 784683397, 784830854, 784876655, 211189791, 45646736, 784908300, 2359322, 784927149, 756006968, - 784974425, 2752543, 4177956, 785371528, 278970370, 785682825, 44351514, 785760309, 785793261, 785825804, 4965801, 785843056, 785891435, 589479957, 111034380, - 785928586, 786022922, 786055471, 786088001, 786138223, 786174347, 786219014, 112771078, 3211371, 786236915, 786268206, 786317394, 1917355, 786354572, 112754700, - 533399339, 786485645, 786579466, 5308910, 786595866, 786612245, 150388802, 786633102, 153190834, 786731407, 726695946, 786809084, 786841676, 786874887, 786923551, - 786939914, 171966495, 786960784, 119357499, 787038667, 787087819, 787136963, 787173777, 787220148, 118210598, 4702315, 787300873, 787334000, 787383526, 787481017, - 787530634, 252280932, 148733973, 158813300, 787564019, 787595796, 787648914, 787922965, 2965506, 7602216, 787939387, 787972128, 788004948, 2670602, 788042131, - 788086794, 788103227, 788135962, 788152349, 140247887, 788169637, 788201696, 788235240, 788284306, 788336086, 310493621, 788431881, 13074458, 788465236, 788563713, - 788611502, 529760294, 131335031, 132481131, 788660264, 55197725, 788676654, 788725826, 124551194, 788759375, 788430860, 788792800, 788828564, 789053452, 789069923, - 789102881, 789135381, 789151831, 5341293, 789201199, 789234295, 789266444, 789282921, 789315668, 789348374, 789364757, 789385621, 789431208, 789463343, 789500310, - 729022466, 789561384, 789577740, 123600906, 789594415, 789627117, 789664151, 789774348, 789790746, 789811608, 789889950, 789926297, 389840898, 23363797, 790122906, - 790270363, 173817872, 790315010, 158711827, 790331408, 790347883, 790381081, 790446096, 180764710, 790462474, 153190456, 4964378, 790479721, 625918386, 790544986, - 790577183, 295927848, 790593562, 790609951, 790626314, 15351850, 790647196, 790729117, 608731152, 624656396, 790808595, 790859101, 790941957, 791004044, 791052381, - 791102330, 117899310, 791150699, 791183414, 791216579, 791253406, 451428983, 791429344, 791464705, 7733314, 791515551, 791630240, 791695777, 791773194, 791790051, - 791822417, 791855170, 7389220, 791887874, 791904266, 144048149, 791921927, 792023005, 792051738, 51675165, 792068399, 792102355, 185958466, 792151047, 792215618, - 792249185, 792281107, 88948767, 792298009, 792363529, 792395815, 792428974, 55132217, 435667478, 792482210, 792546682, 792629667, 792854544, 5603354, 792874918, - 792924580, 793072037, 793134166, 184388353, 793182239, 793198676, 1114143, 793231819, 793285030, 793347102, 793378854, 27623483, 52674591, 793661864, 793821864, - 793853958, 77512725, 793871765, 793919515, 637944228, 793956777, 794117324, 794166261, 794232875, 499269698, 237830175, 794297320, 794346073, 794379929, 794427479, - 794481066, 8392239, 794574904, 794608604, 131891216, 794640406, 794656814, 794710443, 794902538, 794919759, 794951692, 61997087, 794969634, 795017248, 540770320, - 795050071, 795099195, 795136428, 51855382, 435323104, 452100180, 795263006, 795296281, 46088229, 795365805, 2195933, 795447726, 795644335, 795689026, 7716902, - 795723827, 795770901, 795787266, 195002394, 191645214, 795808176, 462651418, 795852802, 795869194, 271925364, 795885674, 115770104, 795972017, 774012959, 796196890, - 796213551, 796246647, 796279216, 796312027, 796348850, 796426324, 796459034, 796475394, 796491791, 796508182, 796524976, 298270726, 796557615, 796590304, 796627379, - 796819482, 115294220, 8393140, 796835861, 796852250, 796868610, 796885527, 796917847, 796967904, 797016130, 56262698, 797052597, 797131806, 797163551, 797180816, - 797214297, 634978326, 797262824, 118882772, 797313375, 382435333, 797364661, 797413331, 8389526, 797462966, 2850819, 209175646, 460390459, 797561271, 797966470, - 41615383, 797987256, 798114958, 25559887, 798162984, 192479258, 798179359, 126697513, 798200249, 798261290, 114114582, 27623738, 798281683, 270516262, 798330340, - 798376783, 565772309, 798409914, 798441494, 798457882, 798474256, 264093706, 798495162, 426934291, 6373688, 798656685, 232197679, 798720046, 798770268, 45858837, - 6717466, 798822843, 799032102, 799066638, 549999036, 558628930, 799113247, 52477953, 799134141, 799310082, 799342610, 8606142, 799359057, 379797570, 799391828, - 799424619, 11059218, 799457386, 799543743, 799624150, 156041258, 799691200, 799773121, 799949733, 799981578, 799997954, 800014357, 800030807, 1918063, 800080905, - 128155667, 800112652, 146653944, 145735682, 800133570, 800245352, 800309675, 800346563, 800506833, 8390928, 800559556, 800620565, 184387560, 763166732, 800637442, - 800670143, 147505183, 800702476, 800718874, 2196096, 800735286, 800768892, 800818664, 113247262, 800870853, 800997378, 765313034, 501940226, 801013844, 51855386, - 743981087, 801047721, 801079322, 801095711, 115721385, 801116614, 801313223, 5325263, 801456160, 801493448, 149585931, 126222874, 801587212, 801603594, 251396117, - 801622806, 141606952, 801656422, 7733551, 801690057, 801800214, 801816588, 801833546, 801865816, 801899403, 227918750, 801964546, 801997431, 802029672, 802078736, - 802095114, 802111490, 802127910, 565739551, 788152346, 802148810, 802226258, 191545370, 727664029, 802258998, 802291810, 802324539, 802358265, 802443723, 802570670, - 802127898, 131334368, 802619432, 383860774, 802635797, 802652619, 152946415, 802701749, 802734146, 802766904, 802800541, 159809562, 154796256, 802884510, 802930795, - 802963680, 802996243, 803012630, 803029003, 65896479, 803045913, 803112085, 803143746, 803181004, 803275055, 803307522, 803323925, 79691807, 803340294, 803357209, - 803426765, 803492302, 123273231, 678264848, 803541455, 803590608, 803668414, 803735581, 2326557, 803782696, 803799343, 350912533, 803836369, 804213202, 804340766, - 804377043, 804439469, 804487218, 804519948, 450543626, 804536766, 3244503, 178472820, 804601868, 125911147, 804622804, 804799344, 804847622, 351240213, 804864031, - 804880403, 775815189, 804896834, 804934101, 176357877, 124864372, 805012979, 805044683, 805093419, 5603338, 805126170, 805142530, 125927446, 805158914, 505184267, - 805179862, 805357428, 805388748, 177094666, 805421098, 51282347, 805437506, 152945070, 805470667, 805519416, 805552159, 805569397, 805601319, 7094706, 805634585, - 805704151, 805765967, 295125030, 805797920, 1917231, 805835224, 806043729, 806076442, 806092821, 140247515, 806110263, 138232242, 806141954, 806158357, 806175567, - 806212057, 132431931, 600719414, 806291542, 782516230, 135004162, 806355050, 8391085, 806441434, 806537076, 109136925, 806569015, 806600758, 348831775, 806638043, - 47611916, 5325400, 806715423, 18137094, 806731842, 806764600, 389136815, 807162333, 807309790, 807354452, 807387359, 807424479, 807486876, 807537875, 807583770, - 111149072, 807600236, 807632906, 48054303, 807649292, 243367974, 807666511, 807701721, 807780462, 807813130, 807829536, 807863179, 148800002, 807927907, 807960578, - 807976998, 807993375, 116015107, 808011654, 808110350, 808158090, 808191179, 808222770, 7389212, 447660044, 808255519, 808272778, 808304661, 808321871, 808353858, - 808386571, 555270160, 808407520, 112476186, 808484890, 625524748, 808501287, 808534047, 802127893, 808554977, 808633212, 808686050, 262537282, 808730640, 808747107, - 808779802, 808796244, 808828934, 541392908, 808849891, 808980964, 341147658, 809074775, 88457256, 809123896, 290406402, 809161189, 352305164, 809305257, 809337770, - 809423334, 163725742, 809467988, 809501209, 809566626, 809599084, 809631746, 325353493, 809648130, 809664538, 809681005, 809713695, 190646293, 809734631, 659341324, - 156434448, 809828398, 809879703, 266125338, 809927193, 809992218, 810008879, 140247079, 789873495, 3719275, 810041428, 48054308, 810078696, 810172719, 448102421, - 810209769, 810287158, 5865526, 153191312, 810320781, 810406378, 704036971, 591593994, 136986643, 810451051, 810483714, 810500128, 810532930, 810570180, 810632580, - 810696725, 810713154, 810746159, 392921128, 810779156, 810827833, 810844191, 810860550, 318832646, 810881515, 417300492, 596803606, 810942495, 810958854, 234405894, - 810975769, 811044722, 811090988, 811139169, 811206434, 811237407, 811253798, 811270175, 811287440, 811323554, 811352066, 780189706, 811368470, 247611451, 811389420, - 811450474, 779075624, 811532820, 811581476, 811598716, 811646995, 811663381, 811682945, 6619945, 811731540, 811778060, 811794458, 175669290, 811815405, 812044782, - 812122134, 802361199, 812139550, 812171911, 812221440, 812255209, 812335125, 812352413, 812434400, 226557973, 812487151, 812598113, 729006106, 812630319, 812662794, - 812679627, 812728376, 812761154, 812794327, 812826690, 812860279, 812894011, 812945904, 246562854, 813023244, 813039657, 3538950, 813056011, 813072386, 44302342, - 813088784, 122732554, 813105233, 813137932, 813155066, 813187126, 813224433, 813302012, 118210562, 525631547, 147062814, 813334559, 808682706, 813351342, 813401408, - 813432853, 71401526, 813453810, 813498380, 813514762, 241827861, 813531163, 813568499, 813678699, 813712207, 813744187, 813776922, 158811636, 813793373, 279150604, - 813842498, 382484561, 813879796, 45646878, 814039052, 216451228, 814056184, 814088625, 550944790, 814123037, 814170138, 814187343, 814219695, 814252034, 814268426, - 814284816, 5718026, 814301203, 814317590, 814334475, 814384426, 294060034, 814436853, 814567926, 814698999, 814764536, 814846457, 2113652, 814907880, 814940162, - 814956565, 814973015, 815022945, 815059450, 171753494, 815108603, 815206908, 815251471, 815272006, 815349772, 815366154, 127893525, 815387133, 815513692, 238552875, - 815550872, 884776, 815628331, 815665662, 815841336, 25563091, 815878655, 206880901, 311411535, 816021596, 816054278, 118243350, 816071115, 816119810, 816137327, - 816168979, 816185370, 24969252, 816206336, 816300044, 816316426, 816332917, 816366441, 816431592, 816468481, 12648580, 816665090, 816730627, 268189735, 689799227, - 816824407, 119997415, 693503937, 816873554, 816907158, 816960004, 817123845, 8389487, 817250343, 817283093, 817299458, 817315850, 817332226, 2113541, 817348715, - 817385990, 817446988, 817484295, 817598984, 817659919, 817676300, 817692710, 221806594, 110215285, 817709358, 817741865, 2197690, 165773340, 7258164, 817759432, - 817792286, 817840154, 817858226, 817889364, 817923061, 817988847, 818020363, 260064079, 146854409, 818041354, 818153432, 818219311, 164020264, 818303499, 818483724, - 818528293, 818549261, 340280354, 151912469, 818593814, 1212532, 818613960, 307134505, 818675734, 2113577, 818692132, 251806149, 818708530, 818742008, 818774037, - 90112057, 336887836, 818795022, 818841804, 8393231, 818875554, 571965468, 818921500, 7635001, 818937878, 7667724, 818958864, 819003421, 40960041, 819023510, - 52215938, 819085444, 819101719, 59293830, 283967510, 819122705, 819286546, 147390495, 174080045, 819414502, 819466771, 819514672, 819560454, 819577326, 819609659, - 819643512, 819675179, 452100162, 819712532, 4980871, 45875212, 819757066, 819773497, 819789860, 819806229, 819822628, 179716212, 819843605, 3245215, 819937320, - 819954425, 714244134, 820400663, 820659601, 820723733, 820740162, 820772918, 820808408, 820871206, 820888399, 820920849, 820957720, 433635340, 52723722, 821002271, - 821018645, 821035039, 251396115, 821051446, 821084260, 194510874, 821121561, 821198879, 41582630, 821215248, 821231622, 821249000, 821297183, 531972115, 598327306, - 821316083, 821412831, 821461013, 821478296, 821526570, 821545248, 821592601, 821658969, 821690378, 46219276, 821706784, 821739607, 821788687, 821805072, 47251496, - 821821461, 821837854, 821870623, 821886995, 55263234, 821903370, 821919773, 821940762, 135168002, 822137371, 822249628, 822297193, 822329356, 788152358, 42418195, - 822347095, 822395357, 822427674, 822444034, 128892970, 822462886, 444107103, 822525995, 822559214, 822591542, 822624870, 822657040, 822673434, 176521519, 5767184, - 822694424, 822739046, 822771743, 47546396, 822788556, 822820876, 198410278, 6455311, 822841884, 822986540, 823034344, 823066640, 823083046, 823099408, 56655883, - 262914069, 823117289, 118882411, 151732236, 823165021, 823214092, 823230493, 823246914, 823282844, 823328794, 237731869, 162332674, 431308802, 823345211, 691912710, - 823377930, 823394306, 823410745, 494272524, 823427985, 159449144, 823480861, 823628318, 823705823, 320946229, 163726464, 823743007, 823854205, 287113232, 823935026, - 77512716, 408272912, 823967775, 823984134, 824000533, 824016912, 3162127, 824037920, 142180363, 824119841, 824349218, 824426502, 824447523, 824509331, 824557614, - 441466920, 824609399, 109150271, 824672322, 824705083, 824742436, 703250444, 458178619, 824786946, 824803368, 55132189, 824820575, 773095948, 824885298, 805224450, - 824918471, 824967189, 824983639, 825032730, 825049563, 825081872, 825098250, 825115817, 825152037, 825381362, 825428454, 825459606, 825507947, 825540620, 62390298, - 825558681, 3248678, 825606246, 825638978, 141295626, 825672873, 788152341, 825704479, 159383589, 165773340, 825725479, 825999790, 139821147, 826049988, 826081310, - 826114074, 826130463, 464928787, 826147275, 498909203, 826198202, 826228746, 826245145, 483786754, 826277942, 826310668, 826327050, 826343452, 214335490, 826361151, - 826425668, 826479144, 826525866, 219627539, 826589238, 826626601, 388825109, 826691720, 826720266, 826736668, 56164378, 826757674, 826852220, 826901480, 409273374, - 122601498, 826954283, 827150892, 827213875, 128843788, 827260947, 27852822, 52199436, 827277835, 827326493, 279150608, 827343305, 433144614, 827478573, 827544110, - 827626031, 827703325, 827719739, 827752459, 827768848, 827785242, 827801615, 218841110, 827818876, 827867650, 827900535, 827932699, 827965442, 827982846, 828031409, - 828063820, 574324774, 828096514, 138625043, 828112902, 828129346, 828162350, 828194843, 520142879, 828227668, 828260362, 828276755, 828293207, 828346928, 828559921, - 828604653, 828641842, 828703009, 828736380, 828788557, 828854050, 409272419, 828932152, 25559103, 2834721, 828969523, 829148994, 829195087, 829227036, 829243394, - 829259797, 152272917, 829276172, 829292550, 829308949, 144375839, 829329972, 130203690, 324567042, 829390864, 829407270, 829423700, 829457309, 829538342, 829559349, - 829636634, 94339088, 829653904, 829685865, 829718540, 88948751, 829735371, 829784133, 829818185, 829866043, 829901832, 829947967, 829980678, 79691807, 829997068, - 391692397, 830013677, 830049730, 457539590, 830097338, 830149174, 48381974, 830231095, 830493240, 830586911, 654983197, 830603723, 830652428, 830669814, 830701590, - 830718011, 830751668, 830820921, 147013643, 823296010, 111181845, 830947387, 830984762, 831094796, 606650394, 831115835, 831246908, 831340584, 182632458, 831361597, - 366428188, 831443518, 831537154, 654017008, 831554070, 831586783, 831620719, 831668289, 831720311, 831750156, 831766584, 831799790, 816255551, 831836736, 5309018, - 831902273, 832098882, 832361027, 832405658, 8393284, 832438295, 832454805, 20299908, 183975967, 1753107, 832492101, 832574022, 832639559, 832716821, 166068290, - 832733222, 477937676, 832754248, 832897030, 832913439, 832929808, 832946186, 832963492, 833016393, 615694783, 833078663, 45727760, 833112073, 833178179, 833229386, - 833290674, 833326668, 833373596, 833425995, 340280058, 414909334, 833504115, 833586363, 833638988, 760955371, 833770061, 833830927, 219480086, 833847334, 833863682, - 47611941, 833880095, 73531402, 833901134, 833963891, 833995199, 834027551, 469499925, 834048591, 834294352, 475136847, 834422301, 4997720, 834487119, 2506794, - 834523729, 834605650, 834835027, 834912365, 823759444, 834945083, 152946102, 10649684, 834982485, 835077465, 835111596, 7734302, 116376585, 128450619, 835223554, - 62341131, 835240023, 835290040, 413270045, 835342033, 835387411, 805224460, 835408470, 42434576, 835551270, 835567618, 835584042, 835600396, 835616806, 83591206, - 675168258, 835633690, 835665936, 7258204, 835686999, 835731547, 835764236, 835780624, 49479701, 835797839, 45252637, 45252624, 835834456, 836042833, 836075532, - 125927445, 836091958, 836124779, 139198483, 836157972, 836211289, 340280992, 836272134, 836289359, 836321286, 836338544, 836386838, 836403202, 471547914, 836419887, - 6374263, 836457050, 836517904, 356925466, 563347462, 61997092, 836534704, 134513154, 836571739, 836734192, 836796457, 47251487, 836813858, 1212456, 836846455, - 836878358, 836894774, 836932188, 786022602, 837025874, 131334236, 837058586, 837075028, 837107722, 366116885, 837124112, 837145181, 837189691, 837224025, 171459035, - 837272606, 837304779, 837354886, 837419475, 432406566, 837469460, 837518274, 837550106, 837566548, 837599251, 837615618, 837632026, 837648399, 189235202, 837669470, - 727664618, 837882463, 837943927, 837980768, 3262323, 838124512, 838172682, 838189095, 838221850, 838242913, 838320143, 838336538, 838352912, 838369309, 55443496, - 65699842, 838387463, 838437610, 2965535, 838485929, 558628918, 838534167, 838586978, 838664495, 768622604, 838701667, 208995151, 838796176, 839176805, 839355357, - 839401529, 839417858, 839434250, 839450645, 839467010, 839483434, 139018252, 839499817, 839516226, 839548966, 654983199, 839565338, 839581708, 839598092, 839615566, - 839697515, 839729168, 119226373, 839745966, 839794716, 839811103, 839827498, 122667048, 839846590, 839893007, 839910494, 839958530, 226230298, 839974943, 839991306, - 840007701, 840024907, 840089616, 246677561, 840110694, 840156043, 237731881, 840220896, 840253494, 840286219, 840302620, 840319014, 118948802, 840335379, 122699807, - 840351774, 840384528, 31424517, 840404170, 840466539, 116277277, 2654246, 840499226, 363364358, 840520295, 840712952, 209191514, 840745067, 840777738, 840794759, - 840844989, 840925210, 128155690, 840941583, 840957979, 840990786, 841023498, 841040331, 757350426, 841089108, 841121823, 479100939, 841138182, 841155473, 841208424, - 841384035, 51625986, 841416720, 780763162, 841434299, 841482252, 347144218, 775929868, 841498690, 156155914, 841531402, 841547816, 841564697, 841629752, 841662493, - 591773999, 841678870, 841695244, 267567105, 841711723, 841745966, 661028906, 841793548, 841809946, 841827989, 841891906, 841929321, 213631007, 841990146, 842006538, - 115179539, 842022978, 842056942, 842088458, 3850242, 842104843, 842121247, 842137610, 842153986, 842170424, 842203235, 842235910, 842252354, 56754192, 583630850, - 842289770, 250937350, 842399772, 842416212, 842448922, 842465317, 273351115, 775176221, 842486379, 842530838, 842547202, 262193162, 842563610, 842579970, 842596362, - 842612755, 842629142, 840499231, 842645506, 842661930, 110608396, 842678312, 842694687, 842711078, 842727455, 160743452, 842743829, 842760194, 842776604, 842792998, - 842809375, 842825734, 228245526, 842845377, 47317049, 842891306, 842907688, 842924058, 842940482, 842973237, 843005995, 843038739, 843055116, 723289633, 843071498, - 370720789, 843088347, 843120661, 213025660, 843141740, 843252012, 505463247, 843289197, 843366426, 843382805, 843399180, 114409482, 370720780, 843416745, 843448330, - 843466998, 182632454, 843513882, 214827067, 843530242, 843546729, 612319254, 843581064, 843629675, 843661352, 843677702, 843694111, 135561232, 350863372, 843715182, - 843776054, 843808787, 843825173, 843841839, 843874330, 122667019, 843890700, 843907082, 128581672, 843923468, 843939866, 156155935, 843956236, 843973059, 844005406, - 156155910, 844038381, 841498655, 844070922, 844087315, 844103701, 115703839, 844120928, 844186030, 128155685, 844239471, 121356330, 844283906, 27328550, 844300348, - 844386928, 844448227, 121356326, 844480523, 844496924, 844513292, 135577626, 844529670, 844546054, 844562891, 844611637, 844644364, 844660772, 844681841, 844730994, - 844808204, 844824656, 143441951, 844862067, 844922939, 844955674, 844973545, 845021186, 845037578, 666271775, 845053964, 845070346, 845086741, 273351115, 845103138, - 845217896, 845267834, 845316579, 845348930, 845381638, 380534815, 845398035, 845414422, 709509186, 845430877, 114409510, 845480848, 845513163, 845561938, 845594630, - 845611467, 845660186, 845676575, 124207125, 845692987, 845727531, 127238210, 845763188, 845824002, 845840390, 845857369, 845890007, 845923211, 356090662, 845987852, - 625360902, 846004240, 846021369, 846053392, 846069786, 846086165, 846102559, 846118928, 846135306, 143081474, 846151746, 564887573, 846184488, 846201291, 846250022, - 846266399, 846282793, 846299568, 846332337, 846365197, 846418549, 846462978, 116752410, 846479403, 846512149, 588218427, 846528527, 846544908, 846561299, 846577685, - 420122083, 846594063, 846610453, 846627680, 846697078, 846807096, 846839810, 345784356, 846856223, 846872582, 846889001, 846905647, 846942839, 143491093, 728973343, - 847020256, 847053973, 847090296, 268468255, 847152635, 847200287, 847216642, 847233045, 847249474, 847283078, 411762690, 847319673, 847450746, 3538985, 847528567, - 847561192, 773718028, 847598203, 847660062, 847692078, 847725003, 139641354, 847775040, 847806485, 847822875, 847855656, 847872031, 228851718, 683589658, 847889324, - 847955209, 847986694, 119226374, 848007804, 848052264, 848068629, 848085529, 848150534, 848166933, 420120762, 848183322, 848199708, 848216971, 848282775, 49479721, - 848335485, 848494614, 848514531, 848560173, 848592898, 848609306, 184107014, 848625748, 848658921, 848707836, 7096107, 848745086, 848887838, 55623692, 321716334, - 848920635, 170999915, 848954412, 784091648, 849003256, 849036297, 849072767, 849217080, 849281036, 55115883, 849301232, 58769420, 849380155, 849429605, 113656045, - 849482368, 849559618, 849592388, 849641538, 849678192, 849723402, 173441063, 849740668, 849789030, 849821717, 849838727, 849887288, 849924737, 850018370, 850053178, - 850121346, 850236035, 10829850, 850346026, 297222175, 850367108, 850432645, 850493450, 117901115, 850510584, 2196392, 850542611, 809517122, 532676646, 850558978, - 108315678, 850576224, 850642585, 850694790, 850739202, 850760327, 850804764, 850821122, 110723109, 850839844, 480608884, 850906056, 4409010, 850973320, 851214438, - 3473410, 851251849, 851284618, 851361804, 164036634, 851382923, 851427356, 851443740, 2179206, 851460124, 33243164, 851481228, 151175196, 851510174, 851542032, - 851558440, 851574805, 152027167, 851595917, 851656820, 851673197, 851705884, 2752517, 851722356, 851740177, 851773764, 851804276, 766951453, 851821035, 14450698, - 308101151, 851853338, 851870376, 619200514, 851907214, 851968091, 852000778, 852017173, 477937701, 852033564, 852054671, 852115572, 852131859, 79937546, 852148252, - 852164630, 766574708, 852181033, 852197418, 62586902, 852213825, 852267664, 852313006, 852347462, 758071312, 852382353, 852574229, 852590595, 852606982, 17809450, - 852623467, 852656315, 852688919, 9961603, 852705287, 641990678, 65077382, 852721772, 852754470, 852770828, 852787226, 852803715, 1900553, 852819994, 852836784, - 852873874, 852939411, 853033721, 853065754, 853082128, 853098511, 853114892, 853131285, 853147674, 853164048, 242466873, 853184648, 853214282, 853245978, 853262352, - 853098511, 853278731, 6701092, 853295393, 853758613, 853807766, 853987991, 854065178, 854083232, 854119064, 854197139, 854247051, 19038214, 368099796, 854311759, - 289932355, 854347398, 854458911, 854507951, 854540763, 854574044, 854606259, 854641656, 131891210, 854687780, 854704807, 854741657, 70909975, 854900792, 854936324, - 854982763, 150585444, 855020186, 855197812, 855261672, 855295070, 855343130, 855364251, 199458924, 855490591, 855506954, 556400699, 855523866, 855556108, 855572490, - 855588885, 855606155, 855670866, 855703984, 855741084, 855903497, 855950326, 855982082, 856000048, 856031244, 371884061, 856049301, 856117917, 856229107, 4177951, - 856280280, 856328949, 856375327, 856391789, 856429214, 856588369, 212107290, 391118860, 856622165, 153993895, 856658591, 856784934, 783237186, 856805159, 5505065, - 856855200, 857163348, 659341338, 857260044, 141541378, 857276418, 857292821, 3162131, 857309256, 4703222, 857374783, 857412257, 857491201, 482919433, 857540577, - 857587733, 198328356, 857604150, 3900247, 857636918, 857669691, 857706004, 857767967, 159878231, 659341314, 857785595, 857833503, 857849894, 857866377, 59818119, - 857887394, 598852455, 857936547, 858062905, 192200725, 858079339, 858112002, 858129438, 2162724, 858163470, 858215076, 858342335, 3244507, 52576266, 858374991, - 858406922, 45875206, 858428069, 2195889, 185484713, 858538003, 275464214, 858559142, 269664935, 858850694, 858916042, 563495391, 858965086, 65699880, 859017895, - 389136960, 859144495, 859176981, 2196313, 3211711, 859193647, 859226171, 798310438, 859263656, 859340822, 859357200, 859373597, 134037516, 859393235, 859443881, - 859572433, 859624106, 8393387, 859701291, 859738796, 859799615, 859834063, 859865147, 555402064, 859898302, 859963502, 127713311, 859996247, 860045334, 860062128, - 860094474, 498291373, 860115630, 860312239, 67059844, 860389378, 860405798, 860423076, 860471306, 860489193, 860536848, 860553235, 860569637, 860585993, 14172183, - 860605036, 860672688, 860717072, 860734428, 860770993, 860900672, 860962835, 8391354, 860979232, 861011999, 861028371, 861045039, 861077612, 861111137, 861143042, - 861159451, 861196978, 352354314, 309559327, 861278899, 861421624, 861454391, 135840609, 861520834, 861553653, 203128884, 861622964, 861737653, 861831208, 19038220, - 861852342, 341377064, 861913897, 861948097, 740491318, 325239087, 861997504, 862060598, 561381405, 862098103, 862453781, 29901234, 862474936, 862666774, 862686040, - 862732820, 862781879, 862819001, 862883886, 862963002, 863015266, 863076364, 863092742, 863109139, 373800982, 863125998, 863158331, 19447829, 863191121, 863228602, - 863388142, 863425211, 863486176, 863523516, 222789654, 8389930, 319832148, 863670973, 863830076, 863913883, 863977570, 864010297, 6193168, 609632461, 864026730, - 864108628, 153993314, 864146110, 864244415, 126959654, 864321558, 864337922, 107757597, 864354316, 177963046, 864373017, 864438732, 864486798, 864553460, 341803036, - 864604864, 15007766, 864735937, 864785090, 864834243, 6193194, 749994036, 527090158, 45039632, 865009680, 3309589, 865030852, 383796118, 865260229, 2196957, - 865321026, 379865559, 865356632, 865405917, 865452335, 730234899, 7258178, 865485246, 865550392, 865584566, 22216733, 370540603, 865637062, 865779714, 295944218, - 865796106, 563298320, 502661122, 865812899, 58753641, 865850055, 865978596, 866025503, 866041866, 866058252, 137936922, 866079432, 866157755, 866205777, 866238502, - 102793258, 866254905, 9207809, 866276041, 866603722, 2342934, 866731387, 866796574, 866829250, 866862174, 866915019, 29900821, 152242362, 867026120, 110234461, - 507461678, 867062476, 867209933, 140247498, 867291854, 867418171, 505544714, 867451805, 867535118, 7307275, 867582796, 867631160, 867664719, 867701455, 867831341, - 867879429, 7094703, 784990220, 867930832, 868059901, 868106734, 868139553, 868189270, 868237322, 868253738, 147292182, 868270617, 868340433, 868434821, 868567223, - 868614154, 427132053, 385499163, 405831702, 868631643, 868663520, 319636303, 566396073, 868697118, 681721858, 868733650, 868827681, 868876747, 868925478, 49086502, - 868941883, 868979411, 869140219, 869192124, 494043202, 869253136, 73531411, 869270638, 253788170, 869351484, 869434306, 363741196, 869470932, 869646395, 51019805, - 869679991, 869715065, 869827082, 869864149, 200736780, 869913302, 5310647, 870187976, 870269846, 870322903, 112279564, 657052376, 870416863, 870449164, 71188508, - 110118736, 870470361, 141411358, 870568666, 870662251, 568017384, 870699216, 870776834, 147423238, 870794270, 870827176, 124715092, 870876987, 870929115, 870973899, - 871022623, 871040084, 871088182, 871120993, 871190880, 871224028, 871334341, 133742594, 871366696, 396279820, 871383435, 97681423, 871420637, 269189571, 871631663, - 871729112, 871792671, 111149058, 871809483, 871858232, 110134570, 871895774, 491620261, 872153518, 872202266, 872218626, 121356317, 872235438, 872284590, 872333597, - 214810653, 872367232, 52199445, 872415234, 119226404, 872431682, 642695210, 872465266, 872501983, 872547503, 872579214, 189546984, 872613369, 597475344, 538198118, - 872694063, 872727374, 2130352, 872796896, 872906859, 872939560, 543309852, 872955906, 329842709, 872972307, 872988708, 737771539, 873006543, 873103372, 873119750, - 131989525, 873139621, 873218956, 873271832, 59818121, 873599714, 873955787, 874005122, 310296621, 874055030, 218415135, 874107619, 874155117, 874234167, 874287844, - 2196304, 874496087, 3227707, 874549989, 874648294, 8393447, 603869928, 8606441, 2195810, 874943210, 2195654, 2195610, 874987522, 875003942, 19038246, - 875021858, 805093378, 147423242, 423215125, 875069921, 875122318, 5308640, 875167846, 875205355, 875303660, 875385581, 192872486, 875462737, 875499375, 875561875, - 875610188, 875645282, 875692065, 875741243, 875778798, 875842135, 875891382, 875955174, 7095351, 875991791, 876036118, 876056672, 81166338, 876103518, 876167197, - 110231855, 876188400, 876331150, 876365065, 876398191, 116376566, 876446694, 136855618, 876479544, 876548849, 876891684, 876942066, 877035536, 701726760, 877056755, - 877281364, 408404490, 877314079, 99516442, 877330891, 639107082, 877382602, 877412418, 877445204, 877477914, 38127041, 136183820, 877494763, 877528354, 877576198, - 877593513, 877644047, 877712116, 877777653, 877871116, 877887526, 47611932, 877905701, 869615505, 156123163, 877957878, 878019097, 878085491, 878116903, 878154487, - 208503817, 878269176, 878366448, 423411714, 178080634, 5865947, 878449401, 878560872, 878624849, 878662394, 836812802, 324534312, 805224464, 878711547, 878886940, - 338264102, 878908156, 2801690, 878973693, 248398878, 879034437, 879070049, 879132714, 879149963, 879214630, 879231840, 879297457, 879334142, 879416063, 879529440, - 879575343, 879612672, 135497365, 879661825, 879738967, 879788491, 879842050, 738230314, 879956739, 160579606, 880018217, 880050491, 880085043, 880132132, 880148490, - 880164905, 51871770, 880186116, 880525318, 23920651, 119440225, 880541759, 880574509, 880607666, 880644869, 880721952, 207438812, 285344320, 880754769, 103284767, - 880789750, 201572381, 43532304, 880841478, 880923399, 881003158, 881054472, 881197122, 881234697, 881328143, 643055638, 140607951, 881349386, 881411102, 881442882, - 881476055, 881509400, 881557542, 71483398, 881574348, 881606702, 487211013, 881655820, 4177935, 499433493, 881677067, 412139938, 881969382, 882021132, 47398914, - 882065942, 882103053, 882180162, 882213827, 47710229, 882262018, 32325668, 882278432, 4980751, 882316046, 882507786, 882458653, 130859036, 882524214, 529022992, - 882556944, 153731374, 882573324, 882589723, 882622551, 409258544, 882671626, 202440733, 882692879, 882755089, 882789787, 882851947, 882889488, 882967699, 449692127, - 883004177, 883179588, 883228725, 500760630, 467321135, 883261499, 883294211, 381550634, 883310597, 883327007, 496910769, 883348242, 883490819, 883507202, 883523595, - 7602186, 883539970, 210206739, 883557294, 52363269, 883594003, 818937892, 668287110, 883741460, 883785764, 142180359, 883802230, 883834908, 883854199, 717226100, - 883884148, 883900435, 883916828, 283967530, 144146443, 883769380, 883933646, 883982377, 477937721, 883998748, 884015141, 513998851, 884424797, 884478742, 884555807, - 1212422, 884572384, 56164374, 884609815, 884839192, 108314733, 884949856, 885015050, 119357548, 885052185, 885162083, 885199642, 117424138, 885342274, 554729482, - 885379867, 6193162, 885489710, 885541720, 885592860, 885638007, 885674781, 885723934, 885869059, 885949308, 886002463, 886046786, 886084384, 886199073, 886276108, - 886292518, 49086502, 886312240, 6374409, 886358487, 886390796, 109052775, 886412066, 886456339, 886472726, 244891660, 886493987, 46710824, 886688809, 886751764, - 886801231, 886838052, 345161812, 551239904, 541589516, 886887205, 681411614, 886969126, 887161818, 5882357, 887210902, 887264039, 887423796, 887472212, 887506885, - 367427600, 887537680, 434716684, 318554118, 887554060, 887570953, 887603231, 887624488, 887690025, 887869118, 201393061, 887935786, 888050475, 888111539, 888144718, - 242368522, 888209420, 888225818, 888244165, 316293344, 888279852, 888422440, 888438875, 888476461, 888640302, 888736244, 212730154, 888782907, 888820527, 888982747, - 889078219, 155828278, 889127745, 889160139, 889212861, 889295664, 889377585, 238370844, 889471410, 889508658, 889590579, 48513140, 889672500, 2200373, 889864208, - 2196589, 889880616, 552894501, 889898184, 118685727, 889929744, 56262713, 889948660, 5313334, 890000183, 890213176, 890306626, 890343985, 890388520, 153567270, - 890409785, 890471326, 890505879, 890590010, 112935343, 416874528, 890671931, 890852156, 890945576, 6946828, 890966845, 891076707, 565231622, 891109613, 118505512, - 891142156, 891158560, 891191897, 891224906, 73531402, 891273242, 891289631, 891305996, 114114566, 891322450, 891355162, 891372121, 150601787, 891409214, 891469906, - 281935883, 194691499, 891503425, 891536428, 891589439, 115769866, 282820639, 891700087, 891736896, 892130113, 191545360, 30392326, 892257408, 892305434, 892321813, - 629358608, 892339575, 892420106, 892438684, 892485713, 699613195, 892522890, 2359401, 892616734, 892649482, 7045122, 892670786, 618464425, 892747830, 892780574, - 737771531, 892813857, 892862571, 2850826, 2113593, 892900163, 892961223, 893014852, 893077065, 893160987, 648740889, 87539733, 893227845, 893272171, 2834495, - 893304898, 893338427, 893386798, 5341945, 893439989, 2198068, 893469209, 893535801, 893637446, 893714735, 893752135, 893801288, 893845509, 893861910, 11010064, - 893883209, 136790038, 893948746, 137101378, 894107885, 894140462, 153748382, 894194507, 894271554, 894305103, 894339965, 894386268, 894418956, 3686438, 894440268, - 894517260, 179159050, 118031295, 3178512, 894538573, 894669646, 108315119, 894764783, 894829558, 894861771, 894911833, 169787413, 894948175, 586481686, 895009243, - 140247472, 895041967, 895074607, 408289301, 895107905, 895139861, 223019518, 318554118, 895156683, 8392987, 895205416, 895221819, 895254752, 895292240, 895636305, - 895815635, 895862259, 895895203, 895959106, 131335406, 895992238, 328073242, 896042382, 896111442, 113115174, 119357935, 896237871, 199869643, 896275283, 896385499, - 896419808, 896467403, 896516527, 896552019, 260461396, 896617721, 896668501, 273121332, 896761919, 158843359, 896798801, 896845360, 110298129, 896878199, 896942082, - 506904595, 896963414, 208994363, 50266124, 897024006, 897040403, 185319446, 110232779, 897056822, 897089565, 246087702, 897110871, 897291096, 897356633, 897417244, - 897434201, 897467844, 897499984, 3211682, 112935591, 897533318, 897597499, 897631041, 897663912, 897700698, 897794058, 23368539, 897810730, 72040706, 573653863, - 897848156, 897990678, 898011997, 116375651, 109052840, 898109516, 898154926, 898203694, 2965515, 898253268, 457064470, 898288413, 898384331, 898433062, 4997147, - 898450385, 898498570, 898514998, 898549079, 898598368, 285034700, 181256737, 898634590, 898696351, 441074098, 898727962, 898744359, 898782047, 898909536, 898974750, - 899006476, 132857868, 899027808, 899073822, 858996762, 899140472, 899186796, 899220348, 119999024, 899268618, 506413098, 899289953, 899353158, 899383756, 10944647, - 899416102, 2752642, 899432474, 899453794, 899498513, 899530811, 899568483, 899813104, 158744578, 899896164, 899956782, 900010853, 900122810, 900156620, 250364263, - 900219117, 900253607, 900284447, 5177347, 900301908, 900349962, 900371302, 900434446, 3228327, 900485991, 900563303, 900596559, 900630105, 900677991, 1818636, - 900710421, 900728137, 7733681, 56721419, 900779711, 900841494, 900857858, 900874259, 160759830, 900895592, 901070870, 901087263, 229965850, 901103723, 219529237, - 901136424, 901152778, 672137235, 901169183, 901185546, 223723532, 213925900, 901205345, 223723522, 872431628, 901251164, 901285067, 51626000, 901316639, 431996934, - 901337961, 901465850, 48545832, 901496858, 901513219, 117358614, 901534570, 901616491, 901660701, 1097744, 901682028, 2801667, 901759007, 901775372, 292110374, - 901742595, 901791746, 381550602, 901813101, 610779138, 901857292, 901677085, 901875033, 901906474, 29900837, 901925852, 901972010, 901988354, 214630426, 902009710, - 902053904, 479133706, 572047381, 902632304, 902726490, 902758534, 902774825, 902791194, 14549004, 902807553, 902824068, 902840361, 38879235, 902856709, 52953097, - 902873103, 902889513, 7307285, 902910833, 902938627, 902955026, 902971526, 902987777, 903004201, 38879251, 514015250, 903020556, 103596162, 903348361, 11059242, - 903366023, 903402355, 152962346, 903495689, 903512195, 34553987, 903531233, 882835563, 903626818, 903664500, 903877493, 903971726, 904041334, 159727632, 904134710, - 904168387, 904221559, 904495864, 904532856, 50249769, 904577083, 904614777, 904760900, 49774597, 154812514, 904840201, 3227747, 904871979, 904904811, 332103717, - 904937513, 1785897, 904958842, 905039798, 905101333, 905118573, 905166907, 134152218, 328073238, 905204603, 84934678, 905265174, 905286524, 905461770, 392921093, - 905478576, 905510922, 140248593, 905527336, 614858754, 4980748, 905543696, 905560090, 140789498, 905576878, 905630589, 905794430, 905872756, 905921430, 905974655, - 22888453, 906199105, 906248232, 586072171, 906267920, 906335104, 906413385, 906466177, 906511276, 3736231, 906576303, 2197009, 906609177, 906679170, 48021520, - 446873602, 906761091, 906903991, 139640939, 216006668, 313786424, 906937742, 907006852, 124732225, 907116620, 907149334, 659341343, 907165708, 907183044, 907231261, - 907247642, 907264016, 907280399, 114409487, 907301765, 907481990, 907580295, 907673704, 907724121, 907755561, 66945062, 907776904, 907870260, 1920257, 907907977, - 908034966, 697483274, 908088202, 727760934, 191646201, 908148776, 160710698, 908170123, 908231115, 908283129, 908329878, 908383070, 908445232, 908476447, 158695435, - 440156593, 908497804, 908741565, 908805150, 908836902, 267141132, 908853269, 908869658, 908886047, 908902419, 732758491, 908918796, 908935174, 908952040, 908984404, - 909018601, 909066261, 909082690, 141377555, 45039673, 909120121, 909249248, 909295675, 909333389, 112394256, 909411328, 909443084, 456966154, 909459515, 909492250, - 234357545, 909508634, 909525018, 19268016, 909546382, 909606996, 909639709, 69845004, 909661071, 909754370, 909770778, 909787165, 909803551, 909819920, 909836330, - 841383962, 909855071, 6701077, 909901836, 909918234, 126042122, 427658620, 909939600, 910114897, 910150004, 276529178, 910218129, 910311465, 202063888, 910332818, - 910377044, 910409788, 910492495, 3719457, 910524437, 910542324, 910590411, 910639913, 910671891, 910688277, 910704671, 118636563, 910721039, 910737632, 910770263, - 8606611, 473251871, 910824340, 243220496, 44613673, 910983222, 911015947, 792854540, 911032336, 911048715, 911070101, 394526741, 911152022, 538722343, 911245772, - 114294826, 911281361, 911327238, 911343637, 128892940, 911360016, 395509800, 911377015, 911409154, 911427161, 911475123, 911512471, 911605772, 911622170, 241827851, - 121274397, 911638564, 911654931, 911671312, 911687706, 911704090, 911720470, 911736863, 3473411, 911756253, 911802394, 911818754, 911835142, 7372831, 118652930, - 911852636, 911900701, 911917072, 159760410, 911933452, 911949834, 911966239, 911983026, 6375907, 912020376, 912376108, 912408582, 53542919, 912427823, 912524297, - 912561049, 912654399, 410748005, 391921676, 266878982, 912692122, 912823195, 912933624, 912965935, 246498167, 912998412, 324534303, 913014786, 2129930, 913036188, - 913101725, 913260570, 316293418, 406339586, 913277165, 913314718, 892403728, 119357521, 913473620, 913507850, 913555886, 913605641, 913642399, 913834003, 303611906, - 913851880, 913904544, 913948703, 913965489, 913998283, 914052001, 914112552, 309575706, 914133088, 914179254, 914292762, 914310027, 213073922, 366116895, 914374716, - 6620001, 583403473, 914456636, 914539305, 914571735, 914604919, 895991862, 914636810, 914655171, 110183287, 914702346, 914719159, 914751923, 914785280, 914817483, - 667664465, 914871202, 914932015, 914969507, 915035044, 915111966, 869466606, 915149733, 915210266, 915226653, 24298957, 915243010, 915260023, 915292247, 915342304, - 915390474, 915407768, 915456002, 915472415, 84721674, 915488770, 446792440, 915505455, 915538442, 915570717, 915592102, 915701800, 153714726, 915723175, 153862154, - 915783701, 113246702, 915805096, 916013370, 916045836, 916063065, 66814809, 916100009, 916160592, 916193306, 152174594, 916214698, 271925289, 916275658, 155975706, - 916313003, 3211790, 916471827, 916488194, 916504591, 916520962, 11665417, 232325591, 916542380, 5505043, 916689837, 916750357, 916767584, 916832693, 380551199, - 916867575, 916897804, 916914182, 84738067, 916935598, 916996399, 128565267, 917028876, 917045258, 917062263, 917094442, 177766879, 917111309, 665227363, 917159962, - 917176352, 917209193, 115654662, 917241902, 917291496, 2195558, 917323878, 917357911, 457490469, 917405727, 917422091, 7290911, 7962650, 917443503, 917700701, - 917749791, 917766165, 917782530, 277020698, 349388812, 917801241, 917866600, 917914725, 110182835, 917967792, 918164401, 152158234, 918257692, 273448972, 918274150, - 434980635, 918306828, 918323304, 918372374, 99500044, 918389037, 918421533, 918437925, 918454293, 918470692, 2326556, 918492082, 918553113, 918620968, 918684119, - 918716432, 918732907, 918765614, 918819763, 918962182, 113246258, 918978562, 918994954, 919011359, 241811458, 919032756, 919076895, 919093472, 919126066, 919158796, - 915472410, 919175222, 919212981, 919276742, 919322897, 278970399, 919355432, 608796688, 919371791, 919388181, 919408874, 919453734, 919470096, 919486506, 658063792, - 919507894, 1918323, 919688119, 919748645, 2031644, 919765023, 919782569, 919819192, 919900070, 919946380, 919999417, 920109599, 920163258, 920207372, 122044454, - 437370892, 905166850, 920224178, 920256578, 920289299, 194084886, 171753474, 920310715, 920567867, 920601067, 920638396, 920780893, 920835005, 920884158, 179716098, - 920944656, 920961784, 920993861, 921026619, 921064204, 921108496, 921127337, 921159476, 921240729, 437370911, 921293141, 921339224, 921391180, 921441215, 921534571, - 921572288, 921616424, 921632778, 803307539, 143720469, 921649211, 267567142, 921681970, 921719745, 921845772, 335413258, 16498700, 921867202, 453689354, 722960396, - 921949123, 6619192, 922025996, 138232822, 922042380, 634699802, 922063812, 922141587, 901988364, 922194885, 922370101, 922402838, 9551888, 8389727, 922424262, - 922484757, 922501123, 922517546, 922533914, 922550312, 922566671, 283197455, 922583052, 922599453, 552091660, 120143874, 922616721, 109215775, 922664986, 306020355, - 922681370, 922698031, 758710291, 257064962, 922735559, 922797225, 307235395, 922833864, 923025410, 409305521, 923041814, 923058188, 515031985, 923077273, 923140141, - 923177929, 923288778, 923338119, 923370281, 923402324, 923437792, 923484219, 923516978, 923549755, 47398943, 299827250, 496025616, 923582566, 923615316, 923648059, - 6225960, 923680780, 923697612, 923729949, 45531177, 923751370, 923828255, 118669324, 923845067, 923893779, 923910184, 923926566, 779075586, 923943926, 923975701, - 923992989, 432406547, 924079051, 924305347, 924352524, 924368922, 924385311, 924401674, 924418467, 8159241, 924451849, 924483600, 924502335, 924537745, 6111247, - 924631682, 924680223, 103743530, 924696849, 5881963, 924729365, 924745758, 924778561, 924828327, 924860454, 43237378, 925319302, 925335667, 15483015, 925352070, - 925368455, 22200329, 925389773, 925614096, 925630490, 925646850, 925663253, 925679682, 925712406, 925728799, 925745158, 553156629, 925761538, 263716892, 925777930, - 925794363, 29032661, 925827375, 68206667, 925860787, 925892634, 925909008, 99893263, 925925397, 925941791, 925958163, 174457135, 925974594, 926007735, 2343506, - 926040523, 926090282, 926192590, 121929749, 926269729, 926302237, 2162700, 926319043, 926351389, 570884112, 926370088, 926435884, 926466124, 926500480, 237731851, - 926548877, 926631210, 926684111, 926761379, 47251484, 926793835, 926826555, 926859330, 926892064, 926929416, 474054698, 926995408, 927273937, 927334416, 927350810, - 8388917, 927367189, 927388626, 927465498, 927481895, 927515161, 927583535, 927613848, 927662369, 927699923, 927891475, 927907856, 209993768, 927926175, 927989786, - 928006173, 928022559, 629440528, 928038924, 928055307, 928071711, 928088498, 928120842, 928137273, 928153640, 648347686, 928170946, 928202762, 928219155, 928235532, - 928251919, 928268310, 928284674, 909803558, 928303573, 928334048, 928366651, 928399402, 928415754, 928432140, 928448533, 928465371, 928497683, 928514070, 814284802, - 928531324, 928579626, 928595970, 928612373, 928628767, 174440505, 928645139, 796426279, 928664765, 928712092, 928759814, 928776223, 636502032, 347144194, 928793800, - 928825356, 928841747, 814284822, 928861772, 928907286, 928923660, 928940058, 46088223, 928957769, 929005578, 929023577, 66863163, 929071125, 929087514, 390594990, - 929103884, 929120266, 929136661, 929155826, 655409912, 929223636, 929335452, 929382658, 11944068, 929415227, 133414938, 929447946, 929316880, 929464342, 929480706, - 929497098, 929513493, 449660137, 929530904, 929579232, 929611798, 929628172, 929644570, 929660944, 929677341, 929693698, 929710099, 929726485, 141819940, 929742907, - 929775637, 929792087, 929842017, 929874974, 929907711, 929960917, 930087019, 50511900, 119048613, 22888488, 930119746, 930153481, 930185751, 910557276, 930218044, - 930300008, 280035435, 930349115, 241467395, 930381908, 930419670, 193660063, 48545798, 930485207, 930742340, 930793823, 930842097, 371310881, 508297675, 930876602, - 930906142, 275464218, 930938911, 809567232, 930955295, 930971658, 667811842, 930993112, 931071523, 931124185, 931250204, 931266572, 931282965, 5309640, 186318858, - 931300220, 136120476, 931348492, 420757530, 931364866, 7307286, 931384617, 931451866, 931545100, 931561493, 931577878, 931599323, 931643418, 171507714, 402309148, - 5947404, 931664860, 345703535, 931790932, 931823626, 583403629, 931845085, 932055791, 299696130, 2834871, 932118554, 15351820, 932139998, 932315234, 932347963, - 64765971, 932385759, 932495892, 932547738, 932594115, 932631520, 932746209, 2359729, 932806958, 359039026, 45433056, 932844514, 655065142, 8390672, 932989353, - 933019679, 704462869, 933038636, 933073891, 885424365, 933167147, 159383588, 933204964, 385662997, 933249248, 933281879, 933330975, 241827869, 933350326, 229752854, - 933401573, 450773008, 933450726, 933528153, 371867664, 933560366, 933609564, 210206741, 2834903, 933647335, 933792469, 933838870, 933855258, 115343362, 933873028, - 933939356, 153190507, 4309099, 933986734, 934035887, 934073320, 934248524, 133414918, 269484074, 649691176, 934282306, 934347055, 912506890, 934379607, 934430252, - 654018238, 934466537, 934679530, 934740025, 182861826, 934757662, 934810603, 934903814, 4112400, 934920792, 336838682, 934953019, 251806641, 934986537, 935019529, - 935052223, 935084091, 935121900, 935199567, 935236589, 366166047, 935334894, 935411743, 147652637, 935429003, 935498735, 935564272, 935628319, 173490602, 935706626, - 10371081, 935728113, 1900546, 935842802, 935938315, 275972223, 117900309, 935986581, 936034408, 936083522, 219824171, 936121331, 4947999, 248398857, 936547317, - 936708601, 936755238, 654017974, 936771899, 936809462, 936869919, 383860751, 936886324, 936919078, 233473851, 936935443, 936951848, 928677926, 936973303, 937135323, - 619003915, 248512549, 937235448, 937312258, 123273245, 18153488, 937328699, 937361414, 937377798, 937394823, 115179526, 937448441, 937509303, 282804290, 937541740, - 937574431, 937590790, 937607190, 661848109, 937628666, 122568707, 937721922, 937754627, 937771046, 937787458, 110677540, 804847637, 937820705, 144359427, 937874427, - 937923580, 937984432, 938016813, 938050719, 144375820, 114409478, 938082323, 129417238, 938102109, 938181900, 244170792, 938229791, 938246253, 938278924, 938295322, - 6620098, 938311696, 938333181, 139477471, 938393659, 2196489, 938431486, 938546175, 938607785, 820953098, 938644480, 412287014, 938770498, 938803268, 938852983, - 147063702, 938885751, 8391421, 173965328, 938917919, 938935305, 938972161, 939099527, 59260944, 939130939, 939168574, 939229230, 939283458, 939360268, 939380016, - 134840451, 939425831, 278413333, 939458995, 939491631, 939524981, 939557088, 939592061, 939674705, 939791363, 939917352, 198246412, 939935658, 3473429, 940004356, - 940086277, 940146912, 122044426, 373555305, 940184582, 184386535, 940262223, 940295029, 940326922, 940344228, 940397575, 940556512, 940589078, 940606358, 6373823, - 940659371, 940720144, 146653203, 52330506, 940737383, 940769504, 940802114, 940835728, 200589318, 940867614, 940900418, 136118667, 940933139, 631718191, 940949550, - 940998675, 801505292, 941015076, 941032441, 140771639, 941118472, 941162527, 207192129, 941178892, 110395418, 941195276, 941211654, 941228071, 941261718, 941311064, - 941360022, 941413385, 941458698, 941490479, 941523791, 941560842, 941604903, 941637644, 941654056, 187744258, 55033887, 942085131, 654934054, 942145557, 137675595, - 942161966, 942211110, 942228969, 942276661, 942309435, 942342165, 942358559, 942374928, 942391655, 942424076, 942440486, 701530124, 942456924, 942494732, 942658573, - 942752680, 942784527, 661848109, 942800902, 942817320, 729006118, 942833720, 942866886, 410435586, 942899222, 942915586, 942932006, 942949199, 547831823, 942981423, - 943013898, 943030293, 943051790, 943113514, 943161774, 518308129, 943210515, 661028902, 943226964, 943264783, 943325250, 943358175, 943391321, 515244034, 943423595, - 640434197, 841744386, 943461392, 943505410, 943521811, 943538198, 137675399, 771637254, 625688591, 943554571, 351240220, 943570963, 943587366, 943604559, 576225299, - 943636495, 943652923, 943685644, 213958685, 943702045, 943718431, 25559959, 943739921, 943931402, 941146154, 943952914, 944029747, 944062480, 944078901, 944112463, - 944149523, 235439104, 944215060, 944291906, 944324707, 944362517, 944521278, 521699354, 944570399, 944586762, 944603190, 200556565, 60227596, 944635963, 128581643, - 944668726, 944701461, 944717850, 944734239, 944750657, 944799784, 944816147, 944832550, 52609036, 944848934, 944865282, 393363462, 944886806, 2801676, 67043350, - 944947266, 944980923, 945046028, 945079687, 945111052, 945128184, 726695967, 945160258, 117489670, 140247092, 945192986, 945209881, 115818507, 945280023, 945406015, - 945440134, 945509400, 945571412, 945668112, 945684521, 31424553, 945702260, 945750042, 945767031, 945799234, 945837081, 61456396, 945919002, 946164763, 946209448, - 946242791, 946290714, 2834495, 946307084, 55377941, 946328604, 946438170, 946454540, 196952085, 946476061, 946570442, 417596406, 294207514, 946618370, 946634805, - 946667586, 318590256, 946705438, 539656221, 329842694, 946750287, 946782218, 946798604, 946820127, 946914220, 946979724, 947027997, 271631193, 947049504, 947211748, - 107757589, 947257815, 947290134, 261182497, 947306580, 947340680, 947372098, 947406496, 947437606, 119226409, 947454011, 947486722, 947503211, 232030219, 947541026, - 947650571, 947666946, 947688483, 947732492, 246562837, 947748880, 947765680, 947803172, 947896779, 947946232, 7307293, 947978670, 948028201, 845725738, 948065317, - 948125718, 948142101, 948158476, 116277258, 415776780, 2195770, 948175385, 948240855, 948273171, 191594498, 112459782, 948292302, 518766683, 948405879, 948470195, - 948507686, 948551696, 114212890, 915701791, 370720796, 948573223, 948719571, 124551178, 180764714, 948764674, 948781539, 50937872, 948813835, 948831055, 948863014, - 948879362, 123666442, 948895784, 948912159, 948928538, 948945814, 948999208, 250937386, 949064745, 949125720, 774227546, 949157928, 949174284, 162501674, 949191710, - 949223524, 949257035, 31342724, 428015647, 949326891, 949502552, 949534730, 31424531, 949556268, 949616666, 949633055, 250937354, 949650777, 949682713, 226246713, - 949749236, 949802029, 949965870, 950009894, 129400834, 950026282, 940998694, 950043689, 950108192, 950146095, 950337562, 950353951, 338264070, 950370306, 950386719, - 950403082, 950420299, 950485667, 3702822, 950534228, 950566950, 114409510, 363364362, 950583302, 950599746, 950632450, 950648838, 837238834, 950667107, 950730764, - 129876076, 950749367, 950797627, 950830080, 950863417, 950965296, 951043102, 951075447, 951107596, 738085096, 951125115, 951161905, 183369749, 951255132, 951287820, - 951304202, 951320588, 190087208, 951337536, 951370826, 177963019, 951402527, 951419351, 153731180, 951454812, 951500812, 951517210, 951533570, 951550487, 839548947, - 951584134, 951648349, 951697424, 951713807, 951730823, 843874320, 951784498, 951861264, 951877642, 951894375, 951926796, 951943178, 951959573, 951975975, 952008742, - 952025115, 952058159, 272531472, 683851918, 952090683, 952125039, 383320074, 952172555, 952188974, 952243251, 952402399, 952435182, 952467466, 952483842, 200851475, - 952500239, 251330582, 952516639, 952533002, 952549392, 952565775, 952582166, 952598559, 952614950, 42598875, 46088249, 325173250, 952636468, 952849461, 952909855, - 952926218, 952942608, 952958986, 1900573, 952975379, 115179542, 8994844, 952991782, 953008180, 7372821, 953042151, 953095222, 953139230, 953172933, 953221146, - 353239343, 953237516, 953253914, 953270575, 115196343, 656982092, 953303100, 953385935, 953439287, 953634066, 195919882, 953696282, 140608089, 953713241, 953746585, - 953794591, 953813405, 637501451, 953860098, 953876490, 125584207, 953892894, 953925642, 141000716, 953942018, 953959547, 953991190, 42598832, 954007606, 954040335, - 911442144, 954056763, 954089487, 219578390, 954105878, 954123279, 954171402, 954188694, 954237165, 954274872, 954318864, 954335247, 954351618, 954370116, 954417181, - 738377794, 954434977, 954482699, 636486479, 954500736, 464928783, 954548236, 954564716, 954597407, 954613803, 954647675, 954679362, 954712976, 954744848, 394067984, - 939606082, 954766393, 116376046, 954843568, 702398475, 685212080, 954878865, 954975530, 955028538, 955090486, 955138582, 955173498, 549519398, 24297574, 282558580, - 955220060, 955252776, 955270060, 955334764, 955368334, 955438139, 955498955, 955547735, 68228156, 955597251, 955629608, 955645983, 126074890, 112738335, 955662435, - 955695125, 192495642, 955716669, 955858975, 51757062, 955876932, 955940892, 955957274, 712900639, 955973686, 18153479, 956011582, 956072382, 956137556, 956171000, - 956203020, 956219402, 956236407, 956666944, 56655910, 956809247, 147652627, 956830785, 956924504, 956956678, 797245461, 138641871, 956975039, 957072682, 957120533, - 957136922, 2293762, 375259157, 957156831, 957235210, 59523100, 957251622, 627064891, 957273154, 3244132, 957399083, 110247999, 957436995, 957628492, 544882776, - 957661205, 957678911, 957746425, 957792287, 957812725, 750469151, 957841410, 514015243, 200736794, 957862980, 957907476, 2261030, 957956142, 958005355, 958038028, - 2850853, 958056589, 958103568, 128991243, 205209612, 958125125, 958190662, 958387271, 958529749, 958565322, 958595111, 371884044, 958627879, 958663007, 958710231, - 165904412, 958743897, 958775312, 10829834, 110231804, 958793095, 115523596, 958826726, 958877152, 183975976, 958927944, 958988719, 959023213, 959075401, 959136162, - 959168943, 110118163, 959201817, 177963029, 959267576, 44318751, 959299640, 959332354, 445841418, 959348778, 944635916, 959370314, 959480487, 628981800, 150914207, - 959512675, 959545365, 959566058, 959612574, 959676446, 959714379, 204587020, 959856671, 959873909, 959905823, 959922705, 959955247, 959987764, 960021534, 960054157, - 960140364, 25560719, 171442479, 960184360, 81756186, 960205901, 960266671, 960299101, 677724172, 960353358, 960462932, 47415298, 960499793, 960549967, 960611413, - 27607052, 960643100, 960659487, 960675846, 474054675, 960695669, 779075615, 960741397, 960758652, 960807371, 960856367, 960888940, 172752908, 960926800, 960970774, - 960987166, 961019915, 961036290, 961052693, 731742224, 961069903, 961103642, 961150992, 961167391, 44679180, 961188945, 961265676, 961282076, 48529439, 2097162, - 961298444, 6193180, 961675287, 5177479, 961696851, 961462282, 55377922, 961775037, 961822730, 961839110, 961855967, 961889799, 961975380, 202457230, 962117670, - 962134032, 49790981, 962150446, 962201741, 125583442, 962251235, 962283970, 962330708, 962363851, 962417749, 962494935, 962532438, 962630743, 928776213, 962723886, - 962773070, 962838556, 962855587, 241647647, 6373803, 962909272, 963019211, 149115993, 963067933, 116162591, 963089498, 963166239, 109215760, 963182651, 963216207, - 523375707, 963252506, 520093750, 29261855, 963314114, 963346539, 246497887, 963379202, 747356182, 963395637, 963433564, 963543133, 963592220, 848904218, 963608588, - 472891502, 17224797, 963630174, 110234025, 963744863, 963822750, 963887110, 281362453, 963903500, 963919894, 963936287, 963952666, 351305734, 787317039, 963969483, - 964019592, 462520751, 964051481, 896123312, 964116506, 964132923, 321699878, 964166519, 964198410, 110215200, 964220000, 208912395, 964265562, 964296706, 964313130, - 176357977, 964329484, 910688282, 964351073, 964482146, 601292838, 964592655, 964644614, 964695139, 234848287, 48693551, 964791576, 964838455, 782614550, 964871017, - 964935690, 964953361, 965001235, 4948008, 965022820, 965083211, 519407036, 965148703, 965165088, 965198127, 961856433, 965235813, 965301350, 965394453, 965411708, - 965460456, 965492802, 965525556, 144048134, 965563495, 965591106, 965625181, 130285594, 965678184, 965787650, 116162598, 965804098, 2196317, 2197987, 965842025, - 965989482, 966069377, 966120555, 966230949, 966265725, 966311967, 966328322, 966344742, 966362456, 966410280, 73744415, 966431852, 166707242, 966508610, 966541322, - 423002154, 193200138, 966562925, 966743150, 966905671, 966967327, 123174918, 966983983, 967017295, 967049651, 967082434, 967114758, 967131174, 215482370, 967152751, - 322060390, 967327746, 967344138, 19251503, 967360534, 3473446, 464946088, 967382128, 967491586, 2342915, 967508400, 371245066, 967540795, 110216033, 6701084, - 967573516, 185483346, 967592106, 967655426, 967672343, 967709809, 47120399, 230048424, 967802940, 967885314, 967918105, 363364394, 967983627, 968033192, 685244846, - 968067344, 112427037, 968115545, 968148270, 968196122, 968212912, 46351369, 968245279, 968261716, 968294421, 968310796, 968327194, 3342378, 968348786, 968643699, - 968709236, 180764693, 968786567, 968835539, 968884695, 453476415, 968917023, 968933378, 968949789, 17006595, 968966170, 968982538, 968999215, 711671846, 5341473, - 969036917, 969162762, 969184374, 969228381, 969278267, 969331831, 969408600, 914981378, 969445730, 969506831, 969523231, 171557466, 553156639, 969540431, 969572881, - 969605423, 7734095, 969640063, 969703450, 969719810, 969736207, 969752598, 969769878, 969818128, 969834538, 969853115, 969900072, 969916422, 969932831, 969949203, - 205750288, 3309604, 969965673, 926466895, 969998374, 49790988, 970019960, 601292802, 147063087, 970134649, 970227743, 75464723, 155779103, 409305147, 970245009, - 970293347, 120979475, 970326092, 2670613, 1114149, 970362595, 132153437, 970490819, 49790986, 970539117, 970571781, 16269317, 970588171, 970604560, 617103398, - 970623651, 970691706, 970981913, 971051181, 971096102, 971112484, 971128847, 306937877, 971145218, 971161626, 971178015, 432062470, 971194399, 971210781, 971227868, - 971261551, 971314299, 971375352, 971407419, 971440813, 971489290, 971506123, 971560060, 971636738, 971653146, 971669540, 971685904, 194461717, 971702339, 116213107, - 971786707, 971833375, 971849757, 131629072, 553156619, 971870173, 122568726, 971898892, 971915735, 971948487, 972002429, 972079125, 160743440, 972096568, 972161035, - 972177439, 272613415, 972193899, 972229091, 461717535, 972259412, 313245702, 972292117, 180666390, 972308492, 972324890, 502054928, 972346494, 972537977, 972570647, - 8148095, 972587031, 972570647, 226050054, 400802287, 972606892, 972657792, 972898363, 46874630, 972932326, 973029378, 973045798, 973062182, 51937292, 1818639, - 973078559, 506904618, 973094978, 973127682, 50036767, 973145026, 973177369, 973247617, 973291522, 973307945, 49905690, 973329538, 973406220, 46219279, 183369754, - 350633986, 74661914, 973422624, 616906774, 973460611, 973537286, 18169896, 973553750, 973586463, 274858049, 973603246, 973652599, 6373855, 238552094, 973689988, - 973783131, 57032710, 973815810, 973832202, 973848879, 973881360, 973897743, 126697494, 458489937, 6406170, 973914166, 100565015, 974132358, 974274600, 974291003, - 974326229, 974356482, 662585365, 974378119, 974520342, 974537743, 974585868, 974602278, 974619471, 974656648, 974733362, 974767000, 160759834, 974816928, 974853257, - 974913552, 974930002, 974962690, 974979093, 974995543, 975044634, 975060994, 975077386, 975093766, 975110159, 124108831, 975127016, 975159746, 975192104, 2179109, - 975211739, 975306858, 759681514, 938409994, 975393930, 975505049, 135905282, 975557771, 975634434, 975650924, 975688844, 975979031, 3736003, 644988966, 976011488, - 151732245, 976044792, 976076859, 125812748, 976109627, 976144525, 976191594, 482590726, 7095387, 976273448, 414089228, 976290234, 976339998, 976376973, 976453642, - 2196314, 976475278, 976585205, 976617503, 976633866, 976650282, 635634471, 976666848, 976699404, 976716247, 976748976, 976786575, 59768947, 976852112, 976977932, - 976994314, 977011319, 977043483, 977076226, 5341944, 977097873, 977190943, 329842691, 977208389, 977257079, 977289228, 122699802, 116375841, 977310866, 977409171, - 977453077, 977469506, 977502224, 977518602, 977535015, 977567850, 5325898, 977654932, 977797213, 140247072, 977848692, 977911835, 287572647, 977945945, 977977386, - 23385237, 977994030, 29180060, 978027361, 2146775, 134299653, 978326679, 978436523, 978468890, 978485276, 978501634, 121356309, 978519528, 978567210, 978583564, - 671662106, 192479253, 978604660, 978665482, 978682315, 978732783, 978796563, 663912470, 978812943, 978829324, 978845722, 978862082, 978878485, 625721410, 978898814, - 979027051, 979058719, 979075100, 979092057, 148127746, 979129496, 843120669, 979210287, 979255362, 979288578, 669221495, 979321135, 108707856, 979353621, 979370050, - 979403617, 979435530, 979451943, 979485196, 180404255, 979517446, 979533890, 979566651, 979599370, 979615786, 979632194, 979667638, 177324033, 979731347, 979780121, - 979845655, 979878843, 979943467, 979977981, 116850699, 980025783, 980058143, 980075381, 849723402, 980107330, 980140043, 980156427, 980172840, 980189194, 980205599, - 112476179, 980222553, 980254770, 980288025, 980353043, 980369439, 980385794, 980402197, 213041183, 980419605, 980467727, 635240450, 980484162, 8389985, 980522137, - 980632029, 980664341, 980681241, 980747232, 704151562, 980795407, 980811884, 980844847, 980877353, 980894128, 980927095, 980959248, 980976376, 52723743, 981008456, - 981075443, 981106694, 981123093, 981140348, 981189600, 981238566, 981270559, 981286933, 981304160, 978829314, 981368858, 627752981, 564871179, 981390490, 981467737, - 981499914, 183370359, 981517201, 981565461, 981582716, 981631490, 981664375, 981696543, 981712898, 981729318, 564658207, 981746528, 981811266, 981843984, 981860589, - 981898395, 982025154, 982057019, 982090244, 982138918, 982155266, 196886538, 982172858, 51757087, 982204447, 982220806, 119998494, 982237221, 982253580, 722731046, - 982270453, 982302732, 393363482, 982319138, 982433848, 982466999, 982500235, 982564930, 982598517, 679378954, 982630499, 143720479, 982668444, 982745109, 982762379, - 982827064, 982859807, 982876587, 982908994, 980074512, 982941801, 949256258, 982974903, 983007691, 983056440, 983089218, 983122408, 983158636, 983203850, 983220855, - 983253004, 983269386, 983285781, 983303051, 983367788, 983401816, 983449626, 983466430, 983532057, 983598001, 671547394, 983629843, 983646511, 983684253, 983744533, - 983761803, 983826967, 983859659, 451872018, 983908383, 983925621, 122503180, 983961009, 984023052, 984039434, 984055829, 984072667, 983302146, 984104981, 984122251, - 984187793, 984236088, 984269647, 984301622, 984334342, 984350726, 984372382, 984482784, 984530954, 529990107, 984547343, 984563738, 383860767, 984581150, 31424554, - 984612904, 984629279, 984645638, 143081503, 984662925, 984746761, 984794265, 984842255, 984858640, 984875034, 984891394, 546095114, 984913055, 984974219, 985039278, - 985091963, 985139470, 985186335, 676233226, 985202690, 985219110, 985235483, 985268331, 985302791, 179126293, 985350184, 985366559, 409681926, 985383005, 985432085, - 985448514, 985482081, 289767434, 985514044, 985601184, 9912483, 985827804, 985874470, 268451878, 985890842, 985907226, 985923615, 985939987, 392445992, 112508959, - 985956354, 217727014, 985972776, 985989149, 5275679, 986005547, 47235098, 986038298, 986054685, 986071071, 986087434, 986103810, 986121001, 261832720, 268468240, - 986152990, 986185754, 986202138, 986218562, 986251270, 986267669, 576176154, 986284053, 217366544, 986300475, 986333226, 986349570, 986365962, 986383633, 519143450, - 986431499, 986448331, 986497133, 986530016, 986562991, 986595385, 479330316, 986612151, 986649761, 986710028, 248266778, 986726416, 986742794, 986759179, 986775568, - 73531420, 986797218, 987005037, 987037725, 987054101, 987070486, 987086867, 987103260, 90521610, 987120107, 55754754, 987157667, 987332750, 987365414, 164806694, - 1212432, 987381798, 987398146, 351338502, 987414831, 987447810, 987480367, 987518116, 345882731, 809419210, 987578827, 987627541, 987643914, 118489100, 987660747, - 220774466, 987709867, 2539530, 987742676, 79101980, 987780261, 987922444, 131891228, 987944102, 48447528, 18399242, 44941328, 988020795, 11157530, 4948006, - 988053558, 304627750, 2359408, 988681384, 2162808, 988758136, 988774402, 1949816, 988791183, 988824087, 167903921, 6029340, 29458472, 988861609, 988921877, - 988938256, 56999947, 988956543, 6225922, 988987401, 989003817, 989020297, 16269353, 989036553, 989052954, 989069314, 47284239, 989090986, 11550742, 61784199, - 989118596, 33177737, 989134884, 989151258, 989167656, 67289095, 989184038, 989200395, 2031621, 119816667, 989631660, 989790227, 989807071, 989839452, 989873196, - 131335080, 3211747, 989922127, 989959341, 440745994, 137904138, 990054498, 990101516, 990119875, 990172334, 189251613, 990217606, 1900586, 990287023, 990348171, - 148160533, 695369759, 990415638, 990445673, 990478420, 990516400, 990663857, 5537833, 132005904, 990856680, 156155945, 237682991, 2326559, 990905212, 990953494, - 990969872, 990986259, 991002646, 991019014, 991035411, 705511446, 991055805, 147423270, 991133762, 991166485, 991184201, 991234565, 991281183, 991297547, 47530015, - 991319218, 991412240, 991428618, 635273255, 991445801, 991479445, 991544299, 991609886, 991641632, 991674814, 991745203, 249987138, 991892660, 112935966, 991990965, - 2408458, 992085478, 50266118, 992138422, 992198697, 992215059, 992231877, 992269495, 992411755, 992449720, 992511935, 239616066, 992608340, 992641034, 2195944, - 992658371, 238321693, 992711865, 207290448, 399147106, 992886822, 99876892, 992903174, 992920040, 992952386, 992985187, 993020489, 993083402, 993105082, 199213082, - 50462746, 109182998, 684212290, 993203387, 993427478, 177963029, 993444894, 993476635, 993514684, 5947394, 993640875, 993674126, 17220498, 993744061, 994050723, - 994100145, 45711376, 994133363, 235880479, 651870224, 994168758, 994230702, 994279467, 994312504, 994345993, 994378174, 3867138, 994444312, 154059286, 994492500, - 994526017, 994558254, 994590732, 55164954, 994607246, 994640331, 994689132, 994721794, 994738203, 994776254, 1966118, 994836502, 994858175, 994951208, 994967590, - 994984990, 995016801, 116162586, 995085653, 995153088, 995229788, 995262504, 131940378, 7143531, 995284161, 995579074, 124862993, 130285610, 995690467, 995786853, - 250396674, 995824835, 995873988, 8391195, 113115162, 996070597, 118882762, 996119750, 996196406, 996229160, 3244256, 131812105, 996248790, 996343915, 996381895, - 996442114, 634898282, 996458526, 294060034, 996496584, 996655109, 57950239, 996676809, 996737456, 954187830, 996772107, 996824266, 996889803, 996971724, 997031957, - 492819661, 360466080, 997048339, 997064726, 997081119, 997097498, 997113867, 50806900, 55033972, 997131086, 997201102, 997244997, 997277755, 997315791, 997408794, - 201376391, 45858853, 119357494, 997425236, 997463248, 997572671, 997605977, 188874790, 997638904, 997676241, 997785638, 997802015, 164003899, 997820599, 997867579, - 997901048, 997934424, 997982325, 115589179, 998020306, 392921126, 998085843, 998359122, 998391839, 998413524, 983400532, 998462677, 998525114, 998556557, 157499502, - 540295206, 998642902, 998738212, 176488451, 372899862, 998802822, 317837204, 998867977, 153748489, 998903602, 287604795, 998954199, 999052504, 277790760, 999161882, - 999178242, 393396239, 999199961, 999262500, 999325727, 999343138, 999380186, 229933059, 316867239, 999442660, 110166075, 999489555, 764624915, 559661903, 400195615, + 2953573269,2963927998,2986259482,2987155375,2993385447,2999202894,3007231086,3008074388,3016897686,3022550193,786433, 802818, 819203, 835588, 868357, + 884742, 901127, 8, 917510, 933893, 901129, 950282, 966658, 983051, 999436, 901133, 1015822, 1048591, 1064962, 1081350, + 1097734, 1114117, 901136, 1130505, 1146897, 1163282, 1179657, 1196049, 1212418, 901139, 1228820, 1753109, 1769494, 901132, 1785879, + 901126, 1802264, 1900569, 1785858, 1933333, 1949708, 901146, 1966107, 1998850, 2015260, 2031618, 901149, 901136, 2048030, 2080794, + 2097183, 2113555, 2129922, 901130, 2146336, 901151, 2179105, 901148, 2228258, 2342947, 901156, 901157, 2408469, 1769510, 2424871, + 2457640, 2474005, 2490399, 2506793, 2523176, 901158, 901141, 901162, 2539563, 2359315, 2326568, 2572319, 2588693, 2605087, 2621446, + 901142, 2637868, 2719784, 1769478, 2736159, 2752524, 901161, 2342933, 2768898, 2785286, 2801670, 1212447, 2818059, 2834477, 2129936, + 2867246, 2359322, 2916354, 2932768, 2965551, 2408476, 2998320, 2326534, 3047466, 2588710, 3063857, 3145778, 3178527, 2342950, 1933334, + 3194931, 3227700, 3260469, 3293238, 3325964, 3342365, 3309584, 901131, 2523174, 3358775, 3424312, 3457036, 3473434, 2523138, 1769529, + 3489850, 3538973, 2129932, 3555387, 2031626, 3588155, 3620924, 3702845, 2342927, 3751998, 3801151, 3833877, 3850256, 2342938, 3866688, + 2113547, 3948554, 3964949, 3981324, 3997722, 4014090, 4030466, 4046869, 4063263, 4079632, 3473418, 4096065, 2129942, 4145218, 4177932, + 1933327, 2261002, 4194371, 4276292, 3244101, 4325446, 2326550, 4407362, 4440135, 4554824, 4620361, 1785862, 4685898, 4751372, 2129946, + 4767819, 4833301, 4849740, 4882458, 4898818, 4915210, 4931626, 4947990, 4964364, 4980757, 901122, 4997197, 5029966, 5095474, 5128271, + 5259305, 5275679, 5292051, 3473439, 5308496, 5341265, 2129932, 5373983, 5390378, 4079647, 5406802, 5439494, 5455893, 5472258, 5488650, + 5505053, 4161567, 5521491, 5603412, 1769491, 2408463, 5603330, 5636181, 5701663, 5718037, 5734431, 3473427, 5750815, 5603338, 5767254, + 2801702, 5799976, 5177356, 5816407, 5865560, 4341802, 5898329, 5947482, 1769513, 6111254, 6127632, 2523152, 6144091, 6176860, 2326540, + 6209629, 1933369, 2408490, 3129346, 6258782, 2621461, 5275660, 6340610, 6357087, 6406173, 6422530, 2031642, 6439008, 1769509, 3309570, + 6553697, 3211362, 6619235, 1769484, 6373476, 2195557, 6651947, 6684701, 4030495, 6701158, 1949698, 1933341, 6733836, 2342938, 6750311, + 6832232, 6881385, 6914154, 6373483, 1769493, 6996076, 2195565, 7028846, 2031654, 7061558, 7094311, 7127080, 7143531, 7176202, 3129384, + 7192687, 7225456, 7241840, 7258225, 7307280, 901160, 7323677, 7340044, 7356426, 7372816, 7389205, 1785868, 7405682, 1785971, 7520285, + 7536682, 7553140, 7569419, 7585807, 7602197, 901125, 7618676, 7634951, 2752538, 7651445, 7684214, 7634955, 7634975, 7716886, 7733314, + 8093719, 8110200, 8126487, 8142969, 8175639, 8159255, 901143, 8192122, 8355963, 8503420, 8585341, 8749182, 8847487, 8896640, 8929303, + 2195585, 8945794, 8962178, 901250, 8978434, 4980738, 8994947, 901251, 9011332, 9027716, 9044009, 9060393, 4980777, 9076869, 9109638, + 934023, 9126018, 9142290, 9158674, 901138, 9175176, 901257, 9240714, 8175750, 9175179, 8175731, 8175746, 9273484, 9355287, 8388749, + 9371763, 9207943, 3555344, 9388174, 7389195, 9175183, 9420944, 9453586, 9469961, 8159369, 9486479, 9519122, 9535620, 901252, 9551884, + 5177401, 9568401, 9699474, 9830547, 9896066, 9912468, 2195605, 10027158, 10027158, 8601751, 10190871, 10207381, 10240149, 10272905, 10289280, + 10322054, 10338327, 10354803, 10371095, 901255, 10387586, 8159362, 10403971, 10420354, 10436626, 8388760, 10453123, 10469506, 10485778, 2195609, + 10502275, 10518658, 10535066, 10567811, 10584194, 10371090, 10600579, 10616962, 10633234, 10649754, 10682499, 10698882, 10715154, 2195611, 10731529, + 10748060, 10780802, 10797074, 2195613, 9158771, 10813598, 10846367, 10879091, 10895495, 10911876, 10928146, 10944642, 8159363, 10961056, 10993798, + 11010180, 8962066, 11026450, 11042948, 11059334, 901235, 3309608, 11075745, 8962180, 11124870, 11059218, 11141135, 11157545, 4980739, 11174020, + 11190434, 11239433, 11255923, 11272210, 11288599, 11305097, 8962183, 11321459, 11288594, 11337888, 11370505, 11387043, 11419783, 11436169, 11059209, + 11452548, 11468915, 8994950, 11485193, 11501586, 11518089, 11534468, 11550854, 11059335, 11567116, 11583526, 11599884, 11616267, 11632671, 11649061, + 11665420, 8994839, 11681956, 11763877, 11911299, 11927682, 11944074, 2195622, 11976853, 12009602, 12026023, 8388776, 10027173, 12075139, 12091522, + 12107914, 8601769, 10027178, 12140675, 12157058, 12173450, 8601771, 12206211, 12222594, 12238986, 8601772, 12271747, 12288130, 12304522, 8601773, + 10027182, 12337283, 12353666, 12370058, 8601775, 10027184, 12402819, 12419202, 12435594, 8601777, 12468355, 12484738, 12501130, 8601778, 8601779, + 12533940, 12566659, 12583042, 12599434, 8388789, 8601782, 12632201, 12648471, 10371095, 12664967, 8159250, 12681369, 12714115, 12730503, 8159364, + 12746770, 12763251, 8159241, 12779635, 10371081, 12796067, 12828855, 12878008, 12910723, 12927106, 12943514, 12632073, 12976151, 12992521, 13008914, + 7602191, 13025465, 13107386, 13172867, 13189250, 13205658, 13238403, 9158786, 13254843, 13287539, 13303938, 10371187, 1114138, 13320324, 13336691, + 13303940, 13352983, 13369532, 13402296, 13435010, 13451282, 8388797, 13467671, 13484147, 13500442, 13516816, 13533190, 13549589, 2359327, 13566142, + 13631623, 13648063, 13697154, 13713426, 901255, 13729815, 13746306, 3309703, 13762752, 13795443, 9470082, 13811843, 12648579, 13828125, 13844516, + 13860980, 2342952, 13877441, 13959323, 13992127, 14041218, 14057610, 10256515, 11665542, 14090377, 14106758, 14123139, 2359428, 14139529, 14155907, + 14172275, 11059223, 14188738, 14270659, 14319747, 14336130, 14352402, 2195644, 14368917, 9142402, 14401728, 14434438, 14450820, 8994947, 14467268, + 14499849, 12664947, 14516227, 14532611, 2162689, 14549126, 8994825, 14450711, 14565519, 14598296, 14647427, 11042946, 14663703, 14680202, 14712833, + 1769477, 14729239, 2326658, 14745797, 9207817, 14811334, 14844019, 14860422, 14876809, 14893065, 14909571, 2195655, 10387474, 2162704, 14925853, + 14942230, 14958615, 14975033, 14991490, 15007874, 1769512, 2261004, 15024146, 15040549, 15056915, 15073302, 2359308, 15089864, 15122463, 15138834, + 15155240, 15171716, 15188004, 2326663, 15204363, 15220866, 15237151, 2130036, 15253705, 15286288, 15302674, 15319071, 7307396, 15335426, 15352010, + 1769514, 15384607, 15400972, 8159270, 15417375, 15433734, 15450133, 15466508, 8159258, 15482898, 934019, 15499274, 15515654, 15532068, 8159248, + 16203799, 16220183, 6324247, 16236560, 2326547, 16253132, 901254, 16302285, 933899, 16351438, 16662735, 16892112, 16941205, 901143, 16974033, + 2129951, 17022999, 17039383, 8175753, 14385283, 901138, 17055893, 17088642, 9535506, 17105080, 901131, 17137676, 17154050, 1785882, 17170642, + 17268947, 17350868, 17383558, 2342948, 3309699, 17399939, 17416405, 9207939, 17449174, 901177, 17481943, 17580169, 17596565, 17629400, 17678359, + 17694835, 17711127, 8159367, 17727625, 17743890, 17760390, 17776772, 17793241, 17825927, 901121, 901135, 17842394, 17875163, 17907721, 17924114, + 901121, 17940530, 17973468, 18006237, 18039006, 2195679, 2932960, 18087959, 18104343, 16597217, 18120714, 18137107, 18153494, 1785868, 18169866, + 8994828, 18186466, 18481379, 18645123, 11665431, 18661385, 18677875, 10371207, 18694288, 2261123, 18727043, 18743426, 18759834, 18792579, 11124866, + 18808963, 11010178, 18825444, 19021847, 19038231, 901123, 19054821, 19153126, 19235047, 19333352, 19398889, 19431555, 19447811, 901123, 901122, + 19070985, 19464201, 933897, 8568834, 19480710, 16269446, 19496961, 17924097, 19513557, 19546346, 19579011, 19595398, 11059331, 19611657, 19628267, + 19677321, 19693705, 19710188, 19759238, 19775622, 18890867, 11059315, 9207945, 19792105, 19824877, 1933315, 17924097, 19857411, 19431427, 19874030, + 19972335, 20021379, 20037641, 14450697, 20054153, 20070640, 20168838, 20185305, 20217971, 10371207, 20234241, 7602181, 20250865, 20283507, 20299911, + 901252, 20316178, 20332675, 20349065, 20365321, 901251, 20381827, 19464326, 20398322, 20447475, 20496499, 20512900, 20529284, 8962178, 20545702, + 20578548, 20611317, 20660470, 20693239, 20726008, 20775161, 20807930, 20856981, 20889731, 20906007, 2179187, 20922616, 20971654, 20988036, 16269335, + 21004539, 21053692, 21086234, 21102594, 1114169, 21119111, 21135494, 21151859, 2752541, 2539522, 21168129, 21184725, 20234249, 21528830, 17072259, + 14385283, 21676163, 21692546, 21708818, 2195711, 10371204, 21725440, 21856387, 21872774, 934018, 21889155, 21905417, 4980873, 21922049, 21987586, + 8601859, 22020250, 22053124, 22085641, 14549123, 16269449, 22102276, 22134918, 22151299, 22167667, 10371203, 22184067, 22200455, 9158787, 22216732, + 2342914, 22233349, 22315145, 22331526, 9207942, 22347913, 22364422, 22397062, 22413446, 22429830, 22446214, 22462579, 19775603, 14745731, 22970632, + 23019529, 23036041, 23052553, 23248905, 14909577, 8994825, 13713523, 2031622, 23265546, 23298060, 14712833, 23314699, 23363852, 23413005, 17825929, + 11042953, 23461906, 23478542, 23511311, 23576707, 23593232, 23789577, 901257, 23806067, 23822471, 23838855, 16269427, 2195729, 23855378, 23904268, + 23920652, 17924101, 2195648, 24182996, 24215561, 24232073, 24248580, 24281251, 24314132, 24346901, 24395785, 24412291, 2195655, 24936578, 21610514, + 24952841, 24969495, 901254, 25002147, 25034889, 20365321, 25051295, 25084041, 24395785, 25100568, 23773397, 25673887, 14549129, 25706684, 25739398, + 14549129, 25755929, 26099847, 26116211, 25673862, 26132762, 26378372, 26099847, 26394907, 26902812, 27099348, 26476562, 26378372, 27132189, 27164684, + 2670618, 19447811, 27181195, 26476562, 27214110, 901149, 27263250, 27312140, 27328538, 2342933, 27345183, 901139, 1769477, 27377669, 27394060, + 27410458, 27426837, 7307300, 2195611, 27443354, 27476254, 27525394, 27574284, 27590682, 27607061, 901156, 27623477, 901126, 27656479, 27688979, + 27705401, 2129948, 27721885, 901250, 27754650, 27787550, 27836435, 27852829, 901132, 27869213, 2261033, 3375120, 27885842, 27934723, 868357, + 27951116, 27967514, 27983893, 2195744, 28000398, 23920652, 28033031, 28049427, 2179129, 23478527, 28065810, 8159362, 11550852, 28082194, 10371204, + 28098846, 27246611, 28147741, 901161, 28164108, 1212453, 28180754, 28229644, 28246042, 28262689, 28295174, 28311581, 28327977, 24166403, 28344327, + 17448979, 28360749, 2179129, 28393762, 28475547, 8962066, 28508314, 28541058, 8994931, 28557576, 23085193, 28606755, 28688518, 28705060, 28786706, + 28803202, 2195584, 28819610, 28852376, 28901508, 28918053, 2195622, 28950822, 28999810, 29016305, 13713523, 29048984, 29098279, 29163652, 13303942, + 29180200, 29294889, 29327658, 884748, 29360426, 14745731, 29393195, 29442064, 29458453, 8994822, 29474900, 29507884, 29540353, 29556738, 29573126, + 29589533, 29605907, 19447815, 29622509, 1949736, 29655341, 3702799, 29687924, 29704221, 29720613, 29737091, 9535622, 29753646, 1933349, 29786415, + 29819182, 22478886, 29851952, 29901105, 4980758, 6701085, 29933874, 30015491, 30032179, 29327668, 30064949, 30113798, 884739, 30130486, 30228595, + 27164807, 30244870, 30261277, 30277635, 27344903, 30294037, 29376548, 30310711, 30359611, 2998284, 30392632, 4980773, 30425401, 30458170, 30490742, + 30523707, 30556447, 29376531, 30589244, 9158793, 30687420, 30720135, 9535506, 30736701, 30785554, 30802050, 23789703, 30818435, 30834823, 934025, + 30851390, 9535623, 29049151, 30998695, 30802050, 31048000, 31080579, 31096963, 10371202, 31113537, 31162506, 13238407, 31195458, 31244611, 31277066, + 31293469, 31309850, 31326239, 31342628, 16269443, 31359113, 31375372, 13303942, 31391760, 31408147, 31424549, 2031628, 31440912, 31457290, 31473701, + 31490060, 24838180, 31506756, 31555909, 31588486, 31604741, 31621235, 1769607, 31637830, 31703049, 7602177, 31719558, 31735820, 31752218, 31768691, + 2670727, 31784966, 31801347, 901127, 27328538, 31817947, 31850517, 31867014, 18890767, 31883294, 31916359, 32096584, 32227459, 32243842, 32260114, + 2195594, 32276809, 32358730, 20365449, 32391334, 9535619, 32424267, 32522572, 32571507, 32587910, 32604295, 9535603, 32620742, 9158788, 9158791, + 32653427, 13238404, 10371206, 32669712, 32686106, 6209548, 32702797, 32768166, 32800902, 32817283, 16269321, 32833546, 32849949, 1769498, 32866638, + 32932095, 32964738, 32981327, 33063104, 16941065, 33095683, 33112092, 17809439, 33128784, 33226889, 33243251, 2179074, 8994953, 934022, 33259857, + 33341571, 9207939, 33357958, 16728199, 33374342, 33390930, 33423699, 33570959, 33177735, 33603740, 901235, 33636486, 33652871, 16941074, 33161331, + 33177735, 33505412, 33669460, 33734674, 8159366, 33751370, 33783939, 2326570, 23380298, 33800341, 33833301, 12664841, 33882353, 33915126, 33947990, + 34177367, 34275512, 34308227, 34324610, 8994946, 34341048, 34373976, 34455561, 34472067, 11059337, 34488567, 34521097, 11059335, 9535497, 34537817, + 34586787, 34619527, 11010180, 9535603, 34636122, 34701659, 34734214, 31342729, 34750812, 34799965, 10371209, 11042947, 29049182, 34865353, 34898271, + 35045491, 35061778, 35078281, 28786823, 35094663, 35111042, 32981179, 35127530, 20693344, 35160224, 35192841, 35209569, 27738247, 35258503, 35275106, + 28917769, 35307655, 35324041, 10764297, 35340510, 35389795, 9142406, 35438948, 8159255, 35504146, 11124871, 9142278, 35520521, 17448970, 35536924, + 35553281, 35569701, 17809538, 35586405, 35799398, 2195815, 35913912, 35946626, 35963034, 8994834, 35996008, 36094083, 36110468, 9158787, 36126727, + 36143220, 2326539, 36159849, 36225161, 36241523, 11059334, 36257804, 36274195, 2129923, 36290922, 1785884, 8994931, 8962163, 36421995, 36487303, + 32620681, 36503594, 36519948, 7307295, 36536684, 36618371, 36634759, 934025, 36651328, 36684141, 9207923, 36749675, 934020, 36814860, 1900585, + 36831598, 36995439, 37044339, 37060740, 37077360, 37208252, 934003, 20627609, 37240969, 37257408, 37290137, 37322889, 37339505, 23789577, 37503346, + 37552316, 37585031, 37158930, 37601535, 37634289, 20349065, 37667004, 37699715, 36388995, 37716098, 37732367, 37748776, 9207831, 37765491, 37978484, + 38027637, 38076790, 38125943, 38158712, 38224220, 25034889, 38273401, 38322554, 38371354, 38387724, 2179093, 38404423, 38584699, 38699388, 38748291, + 38764674, 38781058, 4980870, 38797693, 38862871, 38879366, 901236, 38895747, 38912132, 38928515, 8978564, 8962179, 38945150, 39043204, 933906, + 23838857, 39059593, 29163650, 39076217, 22069380, 39125375, 39207043, 39223428, 39239812, 1785987, 39256436, 39305600, 39354560, 39387521, 39584130, + 39682232, 39715203, 8061059, 39764356, 39846022, 9142281, 39862409, 11042951, 39879045, 8994951, 39928192, 39977095, 36765811, 39993734, 40042524, + 1949722, 40059271, 40124808, 40173699, 14549001, 40189961, 40206354, 40222730, 38780937, 40239497, 40452490, 40534225, 17105291, 8994818, 40583564, + 40648839, 40665106, 20856981, 40681609, 40697988, 40714374, 40730759, 40747123, 2195673, 40763789, 40861828, 40878103, 40894601, 40910963, 40927367, + 18874391, 40943829, 40976386, 38879268, 32456722, 40992791, 22200343, 41009542, 41058447, 41091087, 41107482, 3686416, 41124238, 41238690, 34324615, + 41288007, 41468113, 41517268, 12730386, 41550223, 41582614, 17448972, 41599139, 34324612, 41632144, 2195857, 41664661, 39157972, 41697303, 2195595, + 41713814, 41877906, 41943170, 41959442, 2195732, 41975957, 42008706, 9207826, 42025363, 8389012, 34324498, 42074517, 2195856, 42123670, 42172823, + 42238164, 42270738, 17809523, 42287512, 2195619, 42385434, 42401794, 42418195, 30392342, 42434572, 1785877, 42451214, 8388735, 42483903, 8389017, + 42533274, 42614996, 42647963, 42811804, 2195636, 42877077, 21872770, 42910099, 42958978, 9207938, 42975641, 43024514, 10371203, 43041181, 2195615, + 43122711, 43139095, 31342726, 43155870, 2195599, 43204631, 43221015, 43237506, 4980742, 43254175, 43319431, 43335811, 43352087, 43368479, 43384870, + 4980852, 34308228, 43401403, 43433996, 4964390, 43450389, 43466767, 43483178, 43499522, 38830091, 43515926, 43532310, 2408464, 43549088, 43745566, + 43794569, 43810818, 43827334, 43843586, 43860083, 43876354, 4980871, 43892873, 43909139, 43925638, 43941917, 1769587, 43958409, 43974685, 43991174, + 44007465, 44023923, 44040234, 2621575, 44056578, 44072962, 44089346, 19267586, 44105747, 44122529, 44154892, 44171305, 901162, 44187667, 44204086, + 44236802, 15482891, 44253602, 44285964, 2326554, 44302343, 1785887, 44319139, 44351498, 4980765, 44368292, 44400732, 3178506, 44433420, 2195741, + 44449804, 44466214, 2195495, 44482784, 4079628, 29622294, 44515749, 44564521, 44580906, 44597270, 901236, 44613670, 2342924, 44630438, 6422544, + 44663207, 2998312, 17006613, 44711952, 1900559, 44728744, 44859817, 44990890, 1785894, 45023320, 4980746, 2326559, 44613642, 45056427, 3473436, + 45088796, 45105180, 45121564, 45137948, 901148, 45154363, 45187123, 30343234, 45220268, 45285805, 45351342, 2031645, 45400066, 2195887, 42434591, + 45416486, 45433264, 45465629, 1769503, 45482417, 1769483, 45514817, 45564338, 2031632, 45597107, 45629876, 1114128, 2850837, 45679022, 45728181, + 2850845, 3162133, 45760950, 4980764, 2342941, 45842470, 45859255, 2261008, 2162710, 45891605, 45907990, 4980748, 45924792, 46039481, 13074434, + 46088634, 1785872, 17006630, 46137396, 46170131, 46186515, 46202899, 1212435, 46219302, 2801685, 46235745, 46301291, 46333990, 46350402, 46383547, + 45907974, 46448659, 5177381, 46465055, 46481414, 2162709, 46497832, 46514197, 2621459, 46531004, 4980762, 6602793, 46645263, 6946856, 46662077, + 46694457, 46710796, 2326549, 46727196, 31490064, 46743998, 46809535, 46841858, 46858261, 17448991, 46874643, 6193189, 46891014, 3473429, 46907840, + 47006145, 4964368, 1900582, 47104450, 2523148, 17842242, 47136797, 47153181, 27246621, 47169987, 47202756, 47251909, 1114150, 46891039, 47284315, + 47317013, 1949712, 47333830, 17006614, 47366599, 2850858, 47415307, 1933323, 47432136, 47530026, 47546406, 24838156, 6406149, 47562764, 47579148, + 47595532, 1769484, 47611961, 1785887, 47628307, 47644688, 47661084, 47677442, 933914, 47693839, 47710246, 32849936, 47727049, 47857691, 2850835, + 47890539, 47923226, 47939586, 2162714, 47956009, 47972393, 28147753, 47988835, 48021526, 4161567, 48038346, 48070956, 44351519, 17154060, 48103516, + 45056021, 6209548, 48136651, 2359306, 48185804, 3342365, 48218572, 48250899, 48267301, 7258225, 48284109, 48398798, 48447514, 47120415, 48463901, + 48480258, 2752550, 48496652, 22216709, 48513487, 48545823, 2162698, 15351834, 48562218, 48578602, 48594986, 44171306, 48611792, 42434570, 1933354, + 48660518, 48676905, 1949708, 48693707, 48742403, 3178499, 48758815, 6701077, 48775633, 48873938, 48939475, 48988628, 49020930, 2162719, 49037781, + 49086492, 1933343, 49102870, 49119254, 49135638, 2621462, 49152470, 44613669, 3867095, 45858845, 49250314, 49266720, 31424538, 49299484, 49315856, + 49332225, 49348650, 24838153, 49365464, 3686412, 49430559, 49446943, 49463327, 2162719, 49479686, 49496095, 1769501, 49512921, 49610764, 49627268, + 49643561, 2752647, 49660378, 49725477, 49742299, 49774603, 49791007, 1769482, 49807836, 49872937, 44613658, 49889290, 5947423, 49906141, 49938463, + 4980755, 49954932, 49971316, 49987700, 44597364, 50004446, 50069514, 50086359, 2113565, 50119135, 2621455, 4980776, 50151895, 47317023, 50184672, + 45465621, 17006649, 50266593, 1933350, 50315301, 2359333, 5832735, 50332130, 50429981, 50446372, 50462748, 2261032, 50479587, 3555340, 50511883, + 17006604, 50528740, 3129382, 50577845, 50610188, 50626658, 50659347, 2342949, 50676197, 50774502, 50889191, 50937868, 1114133, 48627714, 50954728, + 50987090, 884767, 51019798, 7602188, 51036172, 2801690, 51053033, 51101727, 43237382, 1933340, 51118171, 49496076, 51151338, 51200491, 51232827, + 51265574, 51281986, 51314699, 3309579, 51331564, 51429869, 51495406, 51528175, 2113578, 51560919, 51593237, 2162690, 51610096, 17006633, 51658767, + 2342934, 51675157, 4161538, 51692017, 51773446, 6701075, 51789829, 49889318, 51806642, 2113542, 51838986, 2129930, 51855381, 51871746, 2326538, + 51888626, 6209567, 45629456, 51937282, 15351818, 51954163, 52117520, 2162825, 52134388, 48054309, 52215820, 4980774, 52232213, 52249077, 52281350, + 52298035, 52330511, 15351810, 52346896, 27246618, 52363290, 2539551, 52380150, 52445615, 7389206, 52477994, 17006632, 52494352, 52510732, 50987018, + 52527607, 52576294, 7602192, 6602762, 52592699, 1933348, 2719746, 52625912, 45465637, 52674566, 1753107, 52690975, 52707765, 6946818, 52740132, + 52756499, 1114134, 52773305, 52822031, 17006629, 2342918, 52838905, 52936705, 52953219, 8994817, 52969978, 19447945, 53051529, 53067777, 53084294, + 53100545, 17924211, 1212553, 53117065, 53133324, 53149830, 53166106, 53182579, 53198869, 2343047, 53215244, 53231731, 53248021, 53264516, 53280808, + 1114242, 53297659, 53362693, 53379078, 53395593, 53411852, 53428253, 53444742, 53461018, 53477417, 53493875, 2261013, 53510149, 53526537, 31424649, + 53543420, 53690369, 19447810, 53706768, 3309605, 53723141, 53739526, 53755911, 53772425, 53788684, 53805085, 53821459, 53837958, 53854234, 17449001, + 53870604, 1212445, 16269324, 53886982, 53903367, 53870604, 53920253, 11059226, 53968901, 53985289, 54001801, 54018060, 54034461, 54050835, 54067257, + 54083625, 16269338, 52953090, 18956289, 54100478, 54132873, 54149132, 16269338, 54166015, 54198293, 54214692, 54231552, 54296607, 17809424, 54313020, + 54395393, 45039644, 47120406, 54460930, 54493196, 24838170, 52576284, 54460458, 49217565, 54509587, 6406166, 54526467, 54575141, 54592004, 54640652, + 54657052, 2031656, 54673513, 54706693, 54919190, 54935683, 54951948, 54968451, 8994857, 54985222, 47317030, 55050242, 6324234, 2621442, 55066640, + 55083527, 55132175, 1114143, 55149064, 6193178, 55197753, 5603359, 55214601, 31424538, 55246894, 55296522, 3178534, 933909, 55329291, 46530586, + 55377935, 2850822, 55394347, 6324255, 55427088, 3702800, 55443980, 1933331, 45465622, 55476683, 55525483, 55558577, 55591437, 55640090, 55656974, + 55689743, 5177366, 55754762, 1933322, 55771664, 55869969, 4571148, 27623476, 47349766, 55902220, 55918618, 4980747, 1933353, 55935506, 54984740, + 56050195, 47611914, 56099348, 56148078, 2539536, 1900555, 6717450, 56181269, 56246313, 56262658, 2342922, 56279574, 56311819, 2342923, 56328429, + 2965544, 56360986, 56377879, 56410648, 52985874, 56492063, 31424533, 56508536, 3342355, 56524840, 7307304, 56541721, 56607258, 56639503, 32849951, + 6946837, 56656411, 1114124, 50806820, 56689180, 56787485, 56836233, 56852506, 2326662, 56869001, 56885274, 1769606, 56901769, 56918021, 7602310, + 56934426, 50151450, 6946847, 56951326, 57000045, 57032723, 2326530, 6455327, 57049631, 7045146, 20234245, 57098784, 57180163, 57196581, 57212970, + 7602194, 49086521, 57229354, 57245830, 57262117, 17924115, 57278471, 57294855, 57311239, 31801351, 57328161, 57376870, 29900802, 57409573, 7389196, + 52527142, 17383460, 57426466, 57475359, 57507977, 57524243, 57540742, 57557049, 2179187, 57573395, 57589817, 57606172, 16826378, 57622531, 57638915, + 57655299, 19038211, 58212900, 9207849, 58245669, 58311206, 58507815, 58704424, 8388735, 58769420, 17809420, 58785922, 58802199, 7307290, 49020949, + 17105080, 58819113, 58851459, 58867861, 901674, 58900664, 58933803, 58966025, 58982423, 8962071, 58998915, 59015298, 59031706, 24248474, 59064876, + 7602177, 59179017, 59195415, 59211907, 59228295, 17809448, 59244556, 59260957, 19447846, 59277321, 10764418, 33734679, 59293719, 8159367, 59310563, + 2162709, 59342863, 59359234, 59375626, 1785893, 59392557, 59556398, 59621507, 59637890, 59654298, 59686930, 2130050, 59703435, 59736459, 59769391, + 59818115, 8159347, 2605096, 19447844, 59834928, 59916311, 59932802, 59949187, 16269447, 59965449, 59981955, 59998769, 11059209, 12648563, 60031538, + 60096646, 60113031, 11075602, 60129285, 60112908, 60145801, 60162183, 60178547, 60194834, 60211332, 8962071, 17088646, 60227721, 3309594, 60244156, + 17924105, 18399258, 60277299, 60473908, 60571779, 60588162, 60604434, 2195589, 60620931, 60637314, 16269330, 60653699, 11468930, 60670083, 60686570, + 60719219, 1785861, 60735659, 60867125, 14450819, 60948748, 24281216, 18874505, 60998198, 61047351, 61128838, 11059315, 9109619, 61145251, 11075719, + 61177990, 61194808, 61259911, 9158674, 61276406, 29049401, 61276295, 61309066, 61341827, 61358089, 17924230, 19464210, 61374487, 61390982, 61407237, + 61423746, 1769495, 61440002, 61456394, 1114154, 61473338, 61686331, 38879243, 61767927, 61800585, 9535511, 61816850, 60243977, 61833331, 19447940, + 61850172, 61882503, 61898781, 61915252, 61931551, 61947961, 61964290, 61980682, 61997097, 46088218, 62013711, 36634633, 8962057, 62079549, 62111956, + 62144753, 62177854, 62210623, 62259223, 62275602, 4980867, 62292102, 62308489, 62324765, 62341151, 4980747, 62357519, 884870, 62373904, 50036762, + 62390309, 62406687, 45629469, 62423616, 62455814, 62472221, 1212423, 62488592, 62504962, 62521367, 62537769, 62554127, 62570628, 62586898, 2359325, + 62603841, 62833218, 62882371, 62914572, 13074461, 62931204, 62963972, 62996615, 63012873, 34799731, 63029286, 63045672, 63062057, 17924111, 63078980, + 63128133, 63209621, 63242377, 11075699, 63258787, 934019, 63291507, 27738244, 8962183, 11550857, 63308358, 63357141, 42958980, 63389812, 63406090, + 2359337, 48054284, 63422480, 45727770, 6209552, 63438858, 63455235, 28164231, 63472199, 63652424, 63799881, 63848563, 63864947, 2162820, 63881802, + 2621451, 21528585, 63914235, 36388999, 63963349, 59883657, 934003, 22069383, 63995911, 64012309, 4571151, 64029259, 1114249, 64094796, 64209485, + 37142671, 64274708, 33652851, 64307359, 64340100, 64356483, 16269444, 64373326, 64488015, 64586058, 64618630, 64634889, 46530596, 64651274, 64667669, + 1212431, 64684169, 9535618, 64700425, 64716930, 64733241, 64749570, 64765981, 3309599, 22331527, 64782928, 64815110, 64831524, 2752628, 64847879, + 17809445, 64864849, 64995485, 65028228, 65044617, 901714, 65060882, 9158665, 62062610, 65077379, 11059331, 65093769, 64880771, 65110148, 65126537, + 8962182, 65143379, 65274452, 65323139, 65339522, 41697410, 59293714, 65355891, 42958982, 18890887, 65372182, 65388585, 65405060, 2621571, 65421322, + 4685865, 65438293, 65520214, 41992323, 65618052, 36339721, 65634436, 65650818, 65667081, 10764422, 65683458, 65699878, 1785867, 65716243, 55869459, + 65733207, 65830941, 65847306, 868409, 65863706, 65880095, 65896460, 2326557, 65912941, 7307398, 65945642, 65962228, 65994844, 66027530, 66043920, + 66060309, 45137929, 66076695, 2179081, 66093656, 66125855, 66142246, 66158621, 5177370, 66174992, 65912870, 66191961, 66224139, 66240540, 66256905, + 66273318, 3375135, 1818634, 66290266, 66322438, 65912853, 66338838, 2261020, 66355287, 44908570, 66404368, 65912861, 66421339, 66453525, 45498502, + 66469909, 66486406, 66503260, 66551923, 66568233, 66584605, 66600986, 17449000, 66617770, 66650118, 66666518, 66683015, 17924099, 51593221, 66699276, + 66716131, 66748456, 66764819, 65912854, 66781789, 18890775, 66846725, 17924153, 66863393, 66896009, 56885253, 66912862, 66961415, 66977828, 66994452, + 44285968, 6193164, 67027551, 67059743, 1785866, 67076122, 10371101, 67093088, 67158028, 67174534, 67190810, 2326643, 67207305, 67223668, 67239951, + 16269314, 67256329, 67272741, 67289218, 38879248, 67305479, 67322465, 67420189, 9207820, 67436581, 67452938, 67469427, 67485715, 2752531, 67502690, + 67928675, 68108900, 68338277, 10567811, 18792579, 68386823, 2326549, 33161348, 68403814, 68435973, 68452355, 1949734, 68468932, 68501638, 8175748, + 68518414, 68550668, 68567059, 68583440, 68599818, 1785885, 68616807, 68763861, 68796547, 59949193, 68813416, 2785320, 68846154, 68878468, 68894729, + 68911113, 68927619, 68943895, 68960265, 14434436, 68976832, 69009538, 21872663, 69026409, 69058675, 69075074, 69091337, 69107910, 24969331, 69141098, + 12763159, 11059332, 69190251, 8994948, 69255788, 69386861, 69484799, 69517447, 17088642, 69533951, 69566598, 69582978, 20299794, 69599854, 69648393, + 30867587, 69664780, 36634645, 14745609, 69681286, 15483014, 61014148, 69697803, 69746803, 69763202, 69779590, 69795858, 69812847, 69845008, 65699866, + 34422802, 69862000, 22069257, 70041609, 70058140, 70091377, 70254601, 70271189, 14450819, 70304370, 5325427, 70353030, 24969350, 70369415, 70385799, + 8945794, 70402182, 70418786, 20217971, 70451315, 70467934, 70500489, 4980738, 70516895, 32636951, 70549738, 18874500, 14450825, 70582278, 884851, + 70599284, 70631446, 68599924, 18874389, 70648437, 70779140, 70811671, 50659462, 11042825, 70828055, 36765827, 70844659, 70893830, 37159046, 65077266, + 70926451, 70942727, 884743, 9158788, 70959130, 70975517, 28344361, 70992502, 30950007, 71123576, 36339842, 2260994, 71205497, 71237669, 17809444, + 71254650, 71451162, 71483408, 5177373, 71500106, 71532660, 71548947, 2261003, 71565947, 71614595, 4980851, 19480691, 71631089, 71664017, 71696519, + 71712791, 11468937, 71729490, 65126515, 71761932, 71778420, 71794710, 2621471, 71811708, 71925875, 71942162, 71958659, 20299910, 71975167, 71942153, + 72007814, 72024195, 33619977, 72040605, 72073853, 72138936, 72171657, 30867474, 72187906, 45629443, 72204926, 72335363, 72351782, 72368159, 2162725, + 72384647, 70729860, 72401137, 72434303, 72466562, 72482931, 72499315, 933911, 72515613, 72532084, 2523193, 72548992, 21610611, 72581129, 34324503, + 72597620, 72613930, 72630284, 72646696, 72663081, 2031637, 72680065, 35864708, 72728710, 33734665, 72745075, 44285983, 72761986, 72810525, 19447924, + 72827194, 11042828, 72860291, 72908805, 17924227, 72925210, 2326643, 72941587, 72958596, 72990857, 73007145, 73023503, 73039894, 73056277, 54296708, + 73072863, 73105423, 73121924, 73138311, 933925, 73154591, 73171589, 884745, 1785898, 73204326, 73236483, 1949830, 9207810, 73252921, 45531137, + 73269876, 73302022, 73318531, 73334822, 73351170, 73367684, 1769473, 73384582, 73433104, 73449488, 7389226, 73465857, 73482256, 73498755, 73515123, + 73531414, 2523167, 73548423, 73596947, 73613334, 73629702, 2523162, 73646090, 38879244, 73663112, 73695247, 1949703, 73711632, 73728028, 73744400, + 1114140, 73761417, 74269322, 74416779, 74530834, 19464322, 74547380, 61800582, 74579991, 74597004, 74629760, 74661899, 2605058, 74678925, 2195640, + 74776585, 74793092, 74809479, 74825859, 72908930, 22331401, 74842325, 74875017, 33177623, 74891282, 74907667, 74924061, 74940546, 74956818, 74973225, + 74989591, 2179095, 75006606, 75186831, 75284489, 75300887, 934022, 75317381, 75350150, 75366409, 75382807, 75399186, 75415686, 75431945, 75448343, + 19775506, 75464715, 6438928, 38830211, 75481106, 75497603, 11059330, 75513878, 75530252, 2162699, 75547280, 75579408, 46530588, 23838743, 75595910, + 75612290, 75628679, 75645060, 31096841, 75661317, 75677708, 75694106, 75710485, 33177636, 75727505, 75792956, 75825287, 14549124, 75841667, 75858051, + 72908931, 75874435, 75891346, 75940499, 76087634, 76120724, 76153012, 76185737, 76201993, 8372233, 76219029, 76365977, 61128819, 76398707, 76415091, + 18677895, 76431475, 76447879, 76464263, 9535620, 76480649, 76496908, 44351516, 76513282, 76529706, 10829834, 76546710, 76743057, 18890886, 76775442, + 76791831, 4980745, 76808201, 34603145, 76824599, 76841092, 2326665, 76858007, 76890153, 57262091, 11042950, 76907160, 77070345, 77086857, 77103769, + 77135987, 11042951, 77152274, 77168770, 37355651, 77185378, 77217946, 2031622, 50937896, 77250576, 2326566, 77266953, 77283357, 77299728, 36307059, + 3309583, 77316762, 77414532, 32817289, 77430941, 70893703, 77463684, 77480051, 69156979, 77496330, 933917, 77512720, 47611930, 77529755, 77660292, + 12730483, 77676660, 77692957, 77709369, 2752553, 11304978, 11468823, 77725812, 77742121, 77758470, 2359299, 77774985, 9207940, 77791238, 884754, + 77808284, 77906050, 77922419, 61358210, 77938803, 77955203, 77971591, 77987849, 78004361, 78020742, 78037001, 78054045, 78103198, 18890761, 78135305, + 78151795, 78168090, 1212435, 78185119, 78282886, 78299142, 78315655, 78332036, 78348420, 69156887, 62062707, 78364884, 78398112, 78446724, 22331410, + 78463016, 38830086, 78479386, 20365318, 78496417, 78544906, 47120403, 78561282, 29769738, 78577978, 78610489, 38879348, 78627490, 78659600, 78676008, + 78692392, 9158663, 78708748, 24969242, 78725795, 78774290, 78790665, 78807062, 884772, 3293196, 78824100, 78872607, 78888963, 78905366, 884752, + 78921754, 78938115, 78954508, 17924107, 52740212, 68599839, 78971557, 79037094, 79069863, 52576266, 79102009, 2621452, 79119016, 79151239, 2326537, + 79167507, 9158693, 79184553, 79265833, 79282194, 43384842, 52805638, 79299242, 79413260, 72859657, 79429653, 2343047, 79446073, 79462754, 79495189, + 2179114, 79511567, 2326565, 79527951, 79544338, 79560706, 9535516, 79577771, 79659692, 79691782, 67059728, 79708163, 2261122, 79724582, 79740944, + 2850827, 31424524, 79757997, 67059724, 31424569, 79807150, 15237121, 47120396, 6946873, 79856303, 79921175, 16826391, 79937541, 1949812, 79954608, + 79987377, 80019494, 42434583, 80035842, 2752552, 80052914, 80494707, 80511111, 80527367, 80543878, 51314803, 80560819, 80741044, 16941749, 80888242, + 80920588, 80936970, 24838165, 80954038, 81035424, 81068163, 81084439, 81100915, 81117315, 36339735, 81133702, 81149981, 81166367, 2162717, 29737095, + 81182859, 81216183, 15483011, 81313907, 81330313, 16269427, 81346694, 81362953, 22331507, 81380024, 34734211, 37158921, 81510534, 81526899, 13303826, + 81543865, 81592338, 9519239, 37159042, 81608715, 884738, 81625786, 81690642, 81707278, 9158679, 81739906, 81756201, 19447839, 81772659, 81789065, + 81805321, 8978563, 81822395, 81936652, 81985551, 82001951, 1114123, 82018441, 82034825, 82051206, 81969289, 82067465, 33177734, 70729863, 82084540, + 82133123, 82150077, 82198537, 11042953, 82215614, 82264085, 82280469, 2342969, 82296854, 82280460, 82313273, 32637060, 82330303, 82510219, 82542611, + 82558978, 2162694, 82575929, 82608482, 82641028, 82657298, 81707031, 82674368, 82723170, 82755721, 76201993, 82772083, 32456836, 82788355, 2015247, + 82805441, 82985666, 83034325, 83067587, 83116224, 83148988, 83182276, 2195544, 18677895, 83329159, 83346060, 9519236, 83378331, 83411079, 83428037, + 61259908, 83492996, 83509866, 83558537, 83574793, 14450706, 83591210, 7372802, 83608262, 83722355, 83738754, 10387479, 83755139, 10944643, 83772103, + 83820582, 83836970, 1114113, 83854024, 83918884, 1949717, 83935242, 83951637, 3309625, 83968156, 21872777, 84000903, 37748754, 84017174, 1785863, + 84034249, 84148354, 36618249, 84164738, 84181122, 22069382, 84197385, 10387588, 84214333, 21610519, 84246543, 8962185, 84263158, 84295837, 84328563, + 23838729, 84344850, 84361331, 84377715, 84393986, 1212444, 84410587, 84443154, 84459529, 84476035, 84492419, 84508809, 84525093, 84541452, 84557881, + 84574239, 17809418, 84590615, 76709911, 84607106, 84623369, 84639801, 84656243, 10371094, 84672571, 2179079, 84705318, 84721676, 84738059, 51871756, + 84754567, 84770834, 8962069, 84787221, 84803626, 84819999, 84836354, 3309575, 84852742, 84869160, 84885636, 84902003, 84918309, 84934671, 2326544, + 84951076, 84967436, 2129949, 84983839, 11157507, 85000202, 85016579, 884852, 85032967, 85049380, 2129935, 85066442, 85114917, 9535494, 5505050, + 85131979, 85196826, 79298697, 85213220, 85229700, 85245992, 2162706, 85262364, 85279436, 4112420, 85311510, 10371108, 85327914, 14532636, 85344266, + 85360646, 49774614, 85377741, 85409927, 85426202, 85442570, 17809409, 85458953, 85475359, 85491844, 9158678, 85508814, 85852879, 85983952, 86048899, + 11305092, 86065289, 86081565, 2752549, 86097943, 33177618, 86115025, 86179994, 86212631, 86229010, 39895058, 86246098, 86343795, 86360075, 86376479, + 86392870, 86409218, 86425735, 65077257, 14549107, 86442041, 86458394, 66338832, 86474883, 86491268, 65077385, 56557580, 86508243, 86605954, 86622227, + 86638602, 2621469, 10993779, 11468809, 36634761, 86655700, 86720519, 86736901, 86753321, 17448997, 86770233, 86802435, 86818826, 4980868, 86835925, + 59818099, 86934230, 86999049, 87015555, 8389335, 87031848, 87048198, 2113557, 87064692, 19464249, 87081688, 87261207, 87277683, 22200450, 18677897, + 87294681, 87343263, 60637319, 87376602, 87589132, 87638346, 87671060, 87703685, 87736455, 8389339, 87752834, 76415106, 3129356, 87048194, 87769220, + 87785629, 20529170, 87818972, 87851123, 18169993, 87867432, 87883782, 87900181, 87916546, 44171274, 87933661, 88096809, 88113158, 88129538, 88146052, + 88162419, 2326564, 88178818, 88195095, 34799750, 12746883, 88211586, 88228087, 88261102, 46039051, 88294110, 88408439, 88440844, 88457258, 2621477, + 88473735, 88490021, 88506410, 1949833, 88522759, 88539137, 88555527, 2261033, 17088530, 88260610, 88572639, 88785027, 32800905, 17072137, 88801410, + 88817862, 13713538, 88850565, 88883209, 4980759, 49496104, 79249448, 88899747, 88932468, 88948793, 1769487, 88965142, 88981535, 9158685, 88997907, + 89014313, 89030791, 89047177, 2162823, 89063434, 52445203, 89079830, 89096197, 89112587, 89128961, 7307301, 85098517, 89145382, 89161757, 9158713, + 89178124, 89194514, 89210996, 89227273, 16269315, 89244384, 89276456, 2162706, 89292810, 89309316, 89325608, 3309684, 89342689, 89784455, 89800713, + 89817826, 89849971, 51314819, 89866979, 90014436, 9535511, 36339844, 90079366, 90095746, 90112130, 2621481, 90128402, 90144791, 90161175, 90177668, + 90193943, 12664964, 90210704, 90243202, 19267607, 90259593, 16269442, 90276581, 90341511, 11010179, 90357769, 90374276, 64356489, 42958857, 90391270, + 90488966, 9371780, 90505239, 19447923, 90521715, 2129941, 90538727, 90587536, 81707143, 90620648, 90735337, 90866233, 90898547, 90800146, 9371778, + 90915170, 90947719, 90964098, 33619986, 90980467, 90996745, 91013320, 91046023, 16941193, 91062407, 37585033, 91079230, 20381828, 91111555, 91127940, + 91144215, 91160599, 91176983, 34422807, 91193542, 9535625, 91226246, 19447942, 83918857, 91243242, 2179100, 91308198, 91340915, 91357314, 9371657, + 91374315, 89882759, 91472579, 91521139, 91537539, 91554144, 91586910, 91619462, 91635735, 8159274, 91652844, 11042931, 75497604, 884777, 91718381, + 91783430, 91815938, 91832436, 8994854, 91848841, 62275593, 91865838, 91897986, 75497481, 91914282, 91930662, 2342913, 91947759, 92110979, 92127241, + 92143746, 2162804, 92160134, 92177024, 92209506, 34324611, 72040798, 92242055, 92258559, 92291824, 92504087, 2195726, 70058197, 92520563, 92536947, + 18874505, 92553354, 92586737, 92635251, 92651651, 60243991, 92668569, 8602354, 92700690, 70385682, 92717290, 92749834, 47120426, 2015270, 92766346, + 9519234, 92799016, 92815370, 6193158, 92832499, 15482995, 93012369, 93045492, 93094019, 14745737, 93110426, 93143195, 93175962, 9158786, 93209333, + 93372425, 29163657, 93388915, 93405319, 93421699, 93437961, 93454473, 8389366, 93470963, 93520226, 93552649, 93569155, 93585542, 2195711, 29376646, + 93601810, 70729858, 93618935, 22478979, 73629727, 93667465, 93683718, 93700211, 2752514, 93716724, 93749383, 93765763, 93782153, 93798969, 93831210, + 93847583, 2359297, 93864696, 93896716, 93913849, 93945878, 93962242, 93978634, 24838165, 93995029, 94011432, 68599945, 94028128, 94060573, 94076969, + 36339846, 44285958, 94093404, 94126106, 87539717, 2293776, 94142490, 94158877, 94175242, 14745605, 94191718, 94224500, 94240809, 7585798, 94257168, + 94273573, 94289927, 94306436, 94322716, 94339202, 7307293, 94355484, 94371852, 2031746, 94388476, 94421018, 9207844, 71188491, 94438138, 49774602, + 94470165, 94486570, 94502943, 1212427, 94519353, 56852490, 94535726, 94584843, 94601256, 51593242, 94617657, 94633996, 20299786, 45760523, 94651131, + 94699551, 94716034, 94732304, 17809431, 78807061, 94748701, 94765171, 94781462, 94797855, 94814223, 38879241, 94830951, 94863475, 17924122, 94879749, + 94896131, 17924098, 94913276, 95290109, 95421182, 95518743, 95535239, 95551625, 64667785, 95568007, 95584387, 95600775, 84361351, 95617161, 95633540, + 95649810, 95666291, 95682569, 9470084, 95698950, 52723733, 95715623, 95780998, 95797383, 95813650, 95830151, 61358214, 95846409, 95862919, 14418050, + 95879186, 95895561, 95912067, 95928338, 12779651, 95945471, 96010255, 96026626, 1212438, 96043017, 38994055, 96059432, 28164133, 96076544, 96157714, + 96174116, 96190471, 19447849, 9109636, 96207500, 96239731, 96256018, 36716659, 96272393, 96288902, 1785874, 96305921, 96387090, 33161347, 96403593, + 96419852, 45776925, 38830195, 96436359, 17448975, 96453249, 7045138, 70516867, 96502530, 96600835, 96714932, 10764297, 72040724, 96747920, 96780306, + 19464327, 96797324, 37158930, 20988038, 96829555, 82657289, 96846596, 96927746, 96944156, 96960554, 2260998, 96977011, 96993417, 97009687, 27738242, + 97026070, 97042444, 78807097, 97059589, 97173639, 97189897, 97206403, 97222793, 33620102, 97239066, 97255462, 97271827, 1114153, 97288307, 97304710, + 97321097, 97337353, 97353859, 97370886, 97402917, 97419283, 97435685, 2342919, 97452147, 97468426, 97484819, 97501222, 97517599, 3850243, 97534727, + 21151766, 97567496, 97714317, 97763337, 97779735, 97796119, 97812503, 8175751, 33161239, 97828979, 97845379, 36634755, 19464307, 97861764, 97878173, + 97911561, 98009255, 9519236, 98058370, 98074767, 98107404, 1785892, 6438943, 98124554, 98255627, 98353282, 14827538, 98369651, 98386051, 98402436, + 98418825, 23838854, 21872772, 98435081, 98451479, 98467972, 98484361, 32637059, 98500740, 98517015, 98533399, 98549897, 22331529, 98566281, 98582551, + 98599049, 98615305, 98631689, 98648073, 3309591, 98665228, 98713609, 98730119, 98746503, 9453702, 98762761, 98779268, 98795657, 98812019, 36765714, + 98828419, 98844787, 98861079, 98877449, 22069385, 98894446, 98943107, 98959497, 98975876, 98992243, 36388996, 99008643, 99024905, 99041414, 99057801, + 99074183, 96288883, 99090563, 88883330, 14745735, 99106965, 99139607, 99156083, 99172375, 99188871, 11075716, 99205254, 99221636, 99238020, 99254406, + 35864707, 99270788, 99287175, 99303447, 99319943, 99336307, 99352599, 99369090, 99385481, 81608730, 99401740, 99418123, 99434517, 99450886, 99467290, + 99483679, 2670632, 99500034, 99516454, 24838182, 99532866, 99565590, 10371091, 99582733, 99614854, 99631140, 99647500, 99664009, 19447848, 99680268, + 99696661, 48054293, 99713046, 99729434, 99745808, 99762181, 99778563, 99795079, 41959433, 99811359, 99827714, 17809411, 99844878, 99876886, 2752522, + 99893251, 1785896, 99909648, 98107403, 99926056, 99942440, 99958800, 53624860, 99975951, 100320016, 100467473, 32637063, 100565123, 16941079, 82313331, + 62062727, 100581776, 100614545, 100646930, 62029958, 100663319, 18661513, 100680466, 100810886, 17088627, 100827923, 39895170, 1949702, 100892712, 73744410, + 96796806, 100909065, 100925458, 70729865, 100941955, 100958338, 18956311, 100974601, 100991108, 77136009, 101007369, 89948290, 101024532, 101105795, 67485701, + 91193481, 101122071, 101138441, 11010183, 101154953, 101171332, 101187607, 101204098, 17432604, 101221141, 101269634, 101286018, 101302402, 24412169, 69156874, + 101319446, 100876309, 88948741, 101368599, 101450520, 101531801, 37585033, 101564551, 34471959, 24936457, 101581593, 101647130, 101729051, 101777542, 90964100, + 101793810, 11468932, 101810972, 101842953, 101859460, 101875846, 16941187, 64356467, 101892893, 101990531, 102006899, 102023283, 102039689, 64684163, 10944649, + 33161350, 102055954, 59293826, 102073118, 69140611, 102219891, 102236295, 22200435, 36634739, 102253343, 102367241, 23822467, 102383782, 102416393, 102432905, + 33620103, 102449287, 102465673, 101875721, 102482108, 102514822, 102531228, 102563849, 102580355, 8389408, 102596626, 13238404, 102613001, 102629510, 102645894, + 102662281, 76791942, 62062594, 102679329, 102842505, 9109635, 102859106, 2179098, 102891655, 32768234, 102908102, 8142857, 102940690, 102957858, 103006340, + 103022727, 61128839, 103039779, 103186563, 103202947, 103219330, 103235714, 17924226, 103252103, 92536967, 103268370, 83361810, 103284738, 48627722, 103301141, + 103317530, 103333900, 5832714, 103350435, 103383503, 103415846, 103432207, 103448612, 2031732, 103464981, 103481359, 17006608, 103497764, 103514113, 103530631, + 15351849, 103546911, 7389241, 103563280, 103579679, 103596035, 8962060, 103612453, 103628805, 2261107, 103645315, 51314818, 103661683, 103678009, 103694348, + 103710850, 103727130, 103743514, 19447827, 103759878, 103776277, 103792642, 103809050, 103825429, 901924, 103842597, 2736166, 1196058, 103956482, 47317108, + 103972876, 103989286, 104005634, 66273301, 45498399, 104022018, 104039206, 104071197, 104087592, 2523943, 104727337, 104760106, 901240, 1212536, 3309688, + 4980856, 104956024, 104759308, 27246712, 104972311, 8142871, 104989483, 105136341, 105169027, 105185411, 20365443, 18874377, 105201820, 15482889, 105235244, + 105300781, 105349341, 105382702, 105447442, 16941186, 105463974, 17432713, 105496706, 105513310, 105545766, 105562243, 12664962, 105578505, 105594882, 105611401, + 105627650, 105644166, 11059202, 105660629, 8994835, 105693203, 105709705, 105725981, 105742470, 11059212, 105758729, 105775116, 105791625, 16269319, 105807881, + 105824285, 105840777, 105857065, 105873542, 105889834, 105906291, 10371094, 105923133, 105955462, 105971827, 32620679, 105988911, 2195668, 106152256, 106184761, + 44908562, 106201251, 106233993, 106250263, 69189747, 106266655, 106283046, 106299403, 106315785, 106332166, 2342921, 48545813, 106348565, 46514188, 106365169, + 106398512, 83165319, 106446879, 2031638, 106464049, 106512516, 98009220, 106528898, 106545286, 106561651, 22478983, 106577923, 106594322, 32456819, 106611506, + 106643587, 43024407, 106659869, 106676358, 106692740, 11059257, 106709150, 106741778, 106758276, 106774663, 88883332, 106791731, 107070260, 107118723, 107135107, + 107151593, 107184265, 107201138, 107249779, 107266183, 77103925, 107283254, 107512021, 107544713, 107561649, 107593990, 107627319, 107708547, 20447445, 107725624, + 107791161, 107856698, 107905026, 107921902, 8978434, 901142, 107954627, 107986970, 108003354, 108019738, 108036122, 108052522, 108068906, 108085290, 108101654, + 2621462, 91275292, 106905622, 107757590, 4571142, 108118044, 108134428, 78168083, 2621482, 1785862, 108151611, 108199955, 108216339, 2031645, 2261018, + 108233532, 108282685, 3555330, 108348222, 2523164, 108413070, 108446527, 108576822, 108609548, 108625946, 48136223, 108642775, 3555368, 55033892, 108675609, + 901146, 3244064, 108741068, 108773388, 54657050, 108789867, 108823360, 3244865, 108987202, 2867202, 109035526, 2015253, 109052398, 109084682, 109101891, + 2129936, 109183033, 7045136, 109200196, 901130, 109264984, 109297693, 2752553, 109314074, 109330434, 109346857, 2752523, 109363205, 7602181, 109772809, + 109790022, 23101574, 22069277, 109822067, 60637318, 109839175, 5308701, 110084936, 99893269, 110183241, 73531394, 110231982, 110280720, 110297930, 110346660, + 110379024, 110395402, 110412619, 110478156, 110527309, 110575647, 110592029, 1769475, 110609230, 110674458, 3129356, 110707535, 1949727, 110740304, 110773073, + 110904146, 111001654, 111034384, 6946826, 111051603, 24838173, 111116354, 111149068, 47251494, 111166292, 111034370, 18153478, 111247391, 2408486, 111264597, + 4980752, 111313750, 111362474, 59310090, 111395671, 111427808, 44646441, 111460391, 111493721, 111525945, 111542303, 111558658, 111575061, 111591490, 111624208, + 24838154, 111640579, 111656963, 2719756, 111673642, 111706968, 111837193, 111853922, 111887025, 111919219, 34619527, 1212444, 111935516, 18890771, 111952729, + 111984649, 109789321, 112001882, 112033801, 36241545, 112051035, 112083004, 112164902, 112181275, 107757570, 112214054, 112231260, 112362333, 112394242, 5177380, + 112410626, 112427019, 2031647, 6717442, 59310120, 112443394, 3686422, 112459778, 31424534, 112476591, 112508930, 112525333, 112541762, 112575326, 55033894, + 112656450, 112689162, 112706011, 112738314, 112754690, 901158, 112771110, 112787458, 1769508, 112804703, 112869397, 112886624, 7733708, 112952161, 112984930, + 81756163, 113082370, 64765978, 113098754, 113116003, 901151, 113164813, 5799957, 112427027, 113213450, 113229855, 3309580, 112328730, 113247076, 113459266, + 55033894, 113492076, 113525605, 113639450, 1982493, 113656267, 113705048, 113737754, 6324240, 113754149, 4964392, 113771366, 2850873, 113950812, 113983598, + 45465628, 114016272, 114032651, 114049052, 3211696, 114065467, 114098188, 114114570, 114130950, 56639510, 114147330, 114163769, 114180108, 56262666, 44285954, + 114196539, 114229269, 114245654, 2196327, 51658773, 114262018, 114278456, 111607839, 114311174, 114327573, 114343941, 6324260, 114361192, 48545794, 110411842, + 114426145, 114459153, 114492265, 114557802, 114638870, 114655234, 62341146, 114671618, 27426826, 17448962, 114688501, 114720794, 114737178, 114753548, 114770434, + 3211895, 4980737, 114803563, 114967404, 115015779, 115048450, 115065709, 20365350, 115114862, 3211466, 115179541, 115196336, 115229098, 115261472, 115295087, + 2129960, 115344240, 2162716, 16236556, 115393393, 115442546, 2343028, 115474443, 49086476, 115490818, 115507203, 115523615, 109215746, 115540851, 115622772, + 115703839, 115721077, 115753846, 901141, 2130807, 115818517, 2850847, 115835011, 32817161, 115851318, 8389496, 115884058, 115900427, 115916802, 115933222, + 115949595, 115983225, 116162562, 1114141, 116179834, 116228137, 4980767, 116244704, 116277270, 110412423, 116293663, 116310032, 116326410, 116342815, 116359174, + 116375602, 116408351, 116424714, 116441090, 116458007, 2195488, 116490728, 116523050, 116539423, 116555786, 116572219, 116604994, 116638581, 116670486, 116686879, + 116703254, 4964354, 116720507, 116801839, 116834326, 54657040, 51822598, 116850717, 116867964, 116916226, 79101990, 116933501, 116965388, 116982654, 6406160, + 117014554, 108658704, 117031718, 117063682, 117080074, 117096450, 17809446, 117112892, 117195647, 117342702, 117375005, 117391362, 46530588, 117407775, 117424138, + 50659334, 117440514, 117456907, 117473755, 2130522, 117506102, 117538818, 117555229, 75579394, 117572448, 117638016, 117686575, 117719671, 117752283, 19447829, + 117784607, 117801845, 117833730, 47120394, 117851009, 3244509, 117998466, 118063146, 118079533, 110674458, 118113155, 46088214, 118195076, 118243349, 2342950, + 1114118, 118259715, 118276183, 1114122, 118326149, 118456358, 118472720, 2195558, 118489142, 118521862, 18153478, 118538250, 31424541, 118554634, 118571639, + 118603842, 118636556, 118652959, 3309574, 118669378, 27623566, 7258142, 1228810, 118702173, 118752134, 118784021, 118801287, 118850440, 48136232, 118899593, + 2195506, 118947894, 118981514, 119014283, 119079820, 119128973, 119210015, 119226378, 110411842, 119242762, 114294805, 119259146, 5750796, 119275522, 119291923, + 119308309, 119325582, 119390234, 119406621, 119423003, 119455968, 119488564, 119521311, 119537702, 4161576, 119554959, 4964383, 119767042, 118669349, 17449001, + 119783462, 119800111, 116178946, 119832664, 119865647, 119898122, 119915127, 2196368, 119948177, 119997330, 120046005, 120078377, 45039618, 120095635, 93962252, + 120143884, 1949718, 120160695, 120193383, 120226095, 120258570, 115523615, 120635395, 120651783, 2670621, 120669077, 120799263, 7733291, 120815682, 120848395, + 120865686, 120914839, 120963992, 118243366, 111624194, 121012226, 44466186, 121028623, 46530576, 121045013, 99893270, 121061416, 121077798, 1114131, 121094154, + 121110530, 116228106, 52215830, 121127833, 121258906, 19480713, 121323532, 116228107, 121339933, 2196303, 121357211, 121454658, 121487372, 121503770, 121520212, + 121552952, 121585751, 2195895, 121634827, 121651212, 54460437, 121667605, 121684892, 121733262, 121765909, 121783197, 121865118, 121896987, 121929766, 2670623, + 121946118, 121963423, 122110880, 2195595, 2195895, 122176417, 122224666, 122241456, 122274722, 122306581, 122322987, 122356643, 122404876, 122421258, 122437653, + 122454948, 122503206, 119357545, 122519583, 122535957, 122552350, 122585119, 122601501, 1769474, 122618159, 122651557, 122683403, 2031628, 115589122, 122699787, + 122716162, 122732565, 27246604, 122749862, 122847234, 47546397, 122864551, 122913199, 122945552, 122961949, 122978306, 122994709, 121585730, 123012008, 123043850, + 123060656, 123093929, 123142175, 123158962, 123191318, 123208327, 123257346, 123290538, 123372385, 118243370, 123404298, 2998747, 13074444, 123420693, 17842235, + 123437112, 123469845, 123487147, 123585438, 123617911, 123650086, 1212432, 123666458, 123682828, 123699211, 48611340, 123716524, 123781152, 123813919, 123830293, + 123847563, 123912258, 123944970, 45613098, 123961803, 124011437, 124092437, 124108840, 122667034, 124126126, 124157990, 124174338, 121569301, 124190759, 124224119, + 118243340, 6619190, 124257199, 124321813, 116621343, 124338192, 31424523, 124354572, 45711362, 124371377, 124403724, 2113558, 124421040, 124666259, 34701468, + 66600998, 124715062, 124748721, 124780565, 124796968, 1114122, 55132179, 124814258, 51019807, 124928947, 107462687, 124961716, 125027253, 125075485, 125091852, + 125108246, 49496100, 125124639, 125141002, 125157392, 55721999, 125173770, 125190210, 125222933, 125239322, 2408479, 125255718, 125273014, 125337622, 125354000, + 125370406, 125386783, 125403146, 125419532, 125435910, 125452309, 125468684, 52609050, 125485082, 125501442, 125517834, 125534214, 125452329, 116162572, 125550651, + 125583799, 2195540, 111247362, 125617079, 125764536, 125812988, 24838154, 125845516, 112427018, 4980772, 125862841, 126009355, 126025743, 4161552, 2113567, + 126042530, 46514178, 126074918, 2113548, 126092218, 126156857, 126173643, 126223291, 126287910, 24838156, 118243370, 126304754, 2195970, 126353424, 126369803, + 46219266, 126386777, 126418970, 126435350, 2752528, 126451778, 126485436, 126567357, 126648363, 126682046, 126730271, 122667027, 47611910, 17006594, 124796954, + 126746640, 2801721, 126763967, 126796736, 126926955, 126960577, 119358402, 127025154, 109215754, 127042499, 2130355, 127091147, 8389572, 127139856, 127156229, + 127172646, 127189004, 127205405, 127221802, 127238791, 127288261, 127336464, 2031652, 127353798, 2621449, 127435211, 16269449, 127483942, 127500290, 20365322, + 127517639, 127681088, 52215846, 127713316, 47546389, 127729683, 127746050, 50135082, 127762500, 125583381, 127812063, 127844358, 127860757, 127877151, 127893523, + 127909927, 118243366, 127942696, 127959343, 127992120, 128024586, 128040981, 128057403, 128090122, 47546387, 128106527, 4980793, 128123848, 128204806, 128221203, + 128237580, 128254466, 128286786, 119242783, 128319509, 128335931, 128368746, 128451529, 128516634, 128548880, 128565258, 128582064, 99893264, 128615370, 128712706, + 128729312, 128762331, 24838163, 128794636, 128811034, 128827411, 128843792, 1785871, 128860176, 121045007, 128876976, 4964371, 24838155, 128909328, 128926456, + 128958688, 1212447, 128991270, 128761887, 129008587, 129139660, 129221288, 47546397, 129253386, 129270733, 129335298, 129351709, 129368121, 129384460, 129400842, + 129417237, 32849960, 129433619, 129450010, 129466399, 2326543, 129483211, 119358414, 129532128, 129565647, 129613931, 129647568, 129679389, 129695775, 129712154, + 129728524, 47284243, 129744950, 30588937, 129777703, 129811409, 129859611, 129892469, 129925552, 129957947, 129990743, 130040786, 130203674, 1982495, 130220098, + 130252810, 130269186, 130285589, 2195515, 130302931, 130334741, 884867, 130351144, 130367498, 130383891, 130400277, 130416680, 130433050, 78102594, 130449410, + 130466772, 130531350, 6193162, 130547771, 130580496, 6324250, 130596955, 125321237, 131006473, 131022985, 131039366, 81838195, 131056598, 2162710, 131334210, + 131367895, 131416076, 131432474, 1982485, 131449816, 131612681, 24969353, 131630041, 47611925, 131694613, 131711003, 131744059, 131777383, 8389594, 131810267, + 131875804, 72368134, 131908573, 2195888, 44302346, 132005904, 2129925, 8389598, 132022293, 132039581, 132121111, 132154335, 132203488, 2932788, 46530581, + 132252116, 2360289, 132285410, 132449251, 132498404, 10829853, 132579433, 132613093, 132711398, 132744060, 1114154, 132792362, 2850837, 132809172, 132841488, + 132857867, 1769500, 132874271, 132891509, 127893514, 132923404, 110232090, 4571138, 132939788, 132956166, 132972550, 132989387, 8389607, 133038099, 133055464, + 27623859, 133104617, 133284143, 1114148, 133317610, 133497777, 130285597, 133529681, 112427020, 133563371, 2162691, 2195515, 133627947, 133660694, 19267615, + 133678060, 108167180, 133742604, 48627738, 133759981, 133841729, 118145045, 133874670, 133955586, 133971994, 133988371, 134004767, 134021130, 62341136, 134037535, + 99893274, 52723750, 134053928, 124190722, 134071279, 134135824, 134152230, 134168608, 125583366, 134201346, 2506778, 82001932, 134218736, 134266891, 134283279, + 134299669, 901125, 134316910, 113115147, 134382009, 134430786, 134463556, 134513271, 47923237, 134546417, 134791199, 11059229, 126369820, 7389221, 134807554, + 134823942, 134841330, 2195669, 901160, 134905868, 134923251, 134938630, 134955048, 134971421, 134987797, 135004191, 6127642, 135021556, 135069780, 135102502, + 2162729, 2719760, 135118864, 135135242, 135151645, 135168002, 135184403, 24838181, 5308848, 3686402, 135201781, 135267318, 135299084, 135315466, 119358071, + 135332290, 135364629, 135381023, 135397433, 135413819, 135446604, 135479306, 135496695, 135561242, 135577610, 135594029, 135627768, 135709352, 135741459, 135757826, + 135774229, 135790679, 135840609, 93978643, 135872533, 135889913, 2195978, 135970882, 55377946, 136004055, 109166598, 110182835, 136036889, 2196389, 136102906, + 132661258, 136152059, 2195927, 136250364, 136332285, 136397369, 136429683, 136446089, 136462473, 9109641, 136478726, 136495125, 136511518, 116850714, 136544258, + 136561271, 136593495, 136643552, 136692171, 136741886, 136790054, 2196418, 8700927, 136806406, 136822815, 136840192, 136872160, 136905163, 118243357, 136953866, + 136970271, 136986848, 137019414, 122044428, 137035835, 137069569, 2195554, 137118722, 137249795, 137297926, 137314323, 137330700, 134479882, 2834867, 137347094, + 137364380, 117506102, 137412610, 131629087, 137429295, 20365318, 137461781, 137479036, 137527607, 137577476, 137642519, 137675781, 137757209, 51495363, 137822218, + 137838638, 137887782, 137904603, 27852810, 137936922, 2801706, 137954310, 138036231, 138101768, 136118331, 2408463, 138199071, 1982483, 138215434, 6374409, + 138232842, 138281995, 3211296, 138346522, 138363786, 138395674, 6455308, 138413068, 87539741, 138478605, 138544142, 138608666, 138626063, 123797525, 45531152, + 138674178, 73646109, 138691600, 34422914, 138788873, 69156996, 138806193, 138839057, 138887234, 138920978, 138985474, 139001898, 139018252, 139035667, 139084820, + 139132949, 139149388, 139182304, 128581663, 139214874, 139231319, 139281429, 139330582, 3473883, 139379147, 129826842, 139428315, 139460614, 126189634, 139478039, + 139526681, 139592635, 139657242, 115196952, 139674649, 139722754, 139740186, 139788347, 139821137, 139853836, 139870246, 17088643, 139887018, 139919382, 139935746, + 139952156, 139968514, 139984933, 2113572, 140002331, 140230678, 45907979, 140247519, 140279895, 140329102, 5325271, 140362030, 27607080, 140394584, 140428316, + 140461085, 140510117, 120668198, 140542018, 38125871, 140575774, 140607564, 140641311, 123797525, 140787796, 140820769, 140854304, 141001007, 128991253, 141033570, + 141066256, 47546379, 141082634, 141099010, 141115403, 141131807, 141148179, 141164583, 141197614, 141230111, 141246474, 1900556, 141262860, 141280289, 121077791, + 141312002, 141328424, 141344789, 141361183, 141378594, 141410343, 141443110, 141459458, 47546378, 141476899, 141541407, 107757589, 141557762, 141574775, 141606943, + 2408450, 141623338, 141639711, 141656074, 43237392, 141673508, 141770774, 141788197, 141836290, 3162131, 141852703, 126877707, 99893286, 141869068, 51593245, + 141885462, 141901836, 141115413, 141919270, 141983756, 142001173, 142050343, 142114875, 4341786, 142147821, 120258598, 142180362, 1949724, 142196738, 142213157, + 142229515, 142245919, 142262403, 9207817, 142279720, 142574633, 128106498, 142639106, 142655927, 142688287, 77709324, 142704756, 27705366, 142722090, 142820395, + 50937858, 142868506, 140247092, 142885932, 142934037, 142951307, 143016928, 143065098, 143081511, 124239893, 143114272, 102793242, 143148077, 143228930, 143245369, + 93978655, 122961951, 143261762, 143294688, 143327243, 143344523, 143410065, 143458323, 143475686, 119324738, 143507468, 114786314, 143524600, 143557068, 143590283, + 121864220, 143654918, 122667029, 143671726, 143720467, 127713282, 143736842, 143753237, 2195522, 143769622, 143785986, 143802378, 143819227, 87048198, 143852282, + 143884329, 143900677, 84967445, 143918126, 143982623, 143998992, 144015370, 144031746, 144048157, 24838160, 144064596, 144098351, 144146460, 2752569, 144163888, + 1114118, 144244748, 144262035, 144310284, 144326666, 144343061, 144359455, 144375824, 31424522, 112427010, 144392214, 144408592, 5832744, 144426033, 2031647, + 144507954, 144588802, 144606259, 27852810, 144655412, 144736258, 144753717, 72499223, 144802870, 144900102, 126369823, 57032716, 130269215, 144916506, 144932880, + 5718031, 144950327, 1769483, 144982319, 113115162, 145015864, 145080427, 145113103, 145129488, 145145862, 5177365, 145163321, 145293352, 55754778, 145309734, + 134299664, 145326082, 145342546, 111607824, 145376311, 145408084, 145441262, 6946822, 145473620, 145506330, 24838173, 145522698, 145539100, 145555494, 145571842, + 6193181, 145588984, 145621008, 145637386, 145653797, 145670146, 145686554, 145702914, 145719318, 145735711, 6701062, 146063495, 59375750, 146080827, 146260034, + 43384834, 146292746, 3228043, 146309179, 2195891, 146341899, 146358282, 109215760, 146374710, 10764345, 146408508, 146489363, 1785896, 52215810, 146505952, + 19038239, 146539581, 146604078, 146653615, 7389222, 146686793, 114393124, 113180710, 45039622, 146735106, 146751504, 146767903, 2162726, 146784715, 131629062, + 146834494, 4571148, 146981951, 147063702, 24838146, 147113024, 147210464, 147243062, 147275807, 147292198, 99893250, 147309633, 147390563, 3473413, 147423244, + 2195851, 147439853, 147472395, 147488780, 147505178, 119242754, 147521557, 147537951, 147554314, 147570690, 115654677, 147588162, 147652665, 147668994, 147685397, + 135790658, 147701823, 147734534, 147751759, 147784565, 147816460, 147833886, 79790092, 147865602, 3228739, 147883076, 148013515, 3227862, 148063301, 148111376, + 44285992, 148127969, 148160533, 148176983, 54296602, 148226507, 148275260, 148358214, 121339942, 148455903, 148488198, 30392323, 148504592, 47939605, 148521059, + 148554216, 148586527, 148602899, 148619739, 148653127, 148735048, 111149087, 148816784, 148849737, 148881429, 148897804, 50987034, 148914260, 148948042, 148979734, + 148996112, 116228124, 149012501, 149029294, 149078026, 149095499, 146767910, 149160018, 111280130, 149193241, 149259340, 149324877, 118292482, 149390414, 149471260, + 149487654, 149504012, 55869450, 149520405, 8389145, 149537871, 149635112, 149651462, 149667871, 55869450, 149684461, 130285606, 149717030, 149733397, 149749800, + 149766170, 149782987, 149831718, 149848091, 93978630, 59310086, 149880844, 50937866, 149897439, 149930287, 149963856, 150028304, 150044698, 150061068, 150077446, + 3850261, 150093840, 150110219, 2998704, 6701078, 150126594, 150143002, 17809410, 150160465, 150324306, 150389166, 150437907, 150454274, 150470694, 150487071, + 150503436, 7372810, 150519854, 150569427, 150619219, 150684756, 2195555, 19267610, 150732846, 150782382, 150832213, 4980778, 6373406, 150864982, 150914135, + 19447820, 2195931, 150962465, 150995399, 151044101, 151060492, 151076870, 151093269, 108298278, 151109642, 8388654, 151127128, 151175184, 1212442, 151192665, + 151487578, 5309531, 151634807, 151666698, 148636495, 151684188, 118882826, 151732234, 2195508, 151748644, 151764997, 19447836, 151781855, 151814166, 151830550, + 107429910, 151848028, 63816157, 151896101, 151912564, 28147741, 151929949, 152126558, 152174604, 4341779, 152192095, 52592652, 152256543, 7045132, 64765964, + 2129922, 152272936, 2998303, 152289301, 152305694, 152338437, 152354818, 116228134, 152371246, 152421472, 152487009, 152552388, 152600588, 2015348, 152616962, + 6701098, 2834903, 152633376, 152667234, 152715276, 5866232, 152732771, 152814596, 2195566, 152879114, 152896612, 152962149, 153010192, 153026598, 23855221, + 153042965, 153059344, 77709338, 153076015, 153108783, 153141254, 47923202, 153158758, 44351490, 153223222, 153257063, 153633896, 2359307, 153699433, 153747522, + 5177382, 153781354, 153862154, 2195689, 153878596, 153928811, 146767888, 153961580, 154043304, 154076269, 154109038, 4980741, 25560175, 154190338, 154222594, + 154238986, 9158799, 154256496, 154371185, 154453106, 154502259, 154567796, 153878839, 154697740, 154714118, 118243334, 154731637, 154895478, 154943504, 107462696, + 3866690, 6602778, 153191454, 154961015, 155010168, 114393126, 155041804, 155058202, 155074566, 126042127, 155092089, 116228102, 155403386, 155467839, 155500570, + 155516938, 2196313, 155533355, 7389221, 155567160, 155631675, 2326569, 24838149, 155664526, 155697999, 155729932, 155746320, 155762698, 155779103, 67059714, + 3212411, 155796604, 2408450, 155845757, 155926540, 145506342, 155943721, 155975699, 20365324, 141066242, 155992123, 156024842, 156041258, 2834656, 156057616, + 156074010, 115523613, 156090798, 156140670, 122683413, 156188684, 25559139, 156205102, 117900415, 125239324, 156255360, 156303362, 139478127, 156320044, 156353665, + 156435279, 24838159, 156467259, 156500110, 156532802, 156565949, 156599426, 4342893, 156663892, 156697731, 156746488, 156778517, 156794902, 156811696, 156845188, + 156943493, 156991509, 58802188, 157007874, 125796378, 13074472, 157025414, 1769487, 157106198, 157122626, 157155394, 131334251, 157188128, 1114114, 157221389, + 2523141, 157271175, 157435016, 5308904, 8994839, 157564968, 157581343, 157597753, 157614109, 11010057, 150536292, 157630474, 157646860, 2752548, 157663291, + 2196510, 157696116, 157712424, 157728790, 157745193, 157761538, 19447836, 157779081, 157827101, 7602187, 157844618, 158138500, 158154901, 31096962, 158188683, + 158416908, 158433291, 158449695, 8389772, 158466086, 7962655, 158482463, 150585451, 158499981, 149128334, 158548462, 158581039, 158613510, 72368168, 158629890, + 158646282, 45465603, 158663345, 158695450, 111460655, 158712975, 124796944, 4980774, 158844048, 158925400, 158958737, 159072693, 159105034, 145145858, 159121410, + 159137813, 128106512, 159155346, 159350810, 159367180, 159383583, 5177350, 159400239, 159432732, 46530562, 159449170, 159481858, 2196627, 159499412, 151520405, + 7307276, 159564950, 41582604, 159645708, 2850857, 159662096, 112787472, 4980746, 142245890, 25559124, 159678548, 45875206, 159711691, 159760413, 2113567, + 3686426, 159776778, 48545804, 159793211, 2195977, 159825922, 5079800, 159843479, 159891993, 159957412, 159989816, 47939615, 160023704, 160122009, 160170403, + 160202781, 160219174, 160235522, 160251910, 160268317, 160284674, 160301093, 160317556, 160333842, 60113026, 160350219, 6946847, 160367439, 160399414, 160432138, + 160448554, 160464908, 160481286, 160497676, 160514086, 160530470, 160546822, 160563219, 160579606, 155631618, 160597146, 160677900, 47939620, 160694274, 160710698, + 160727042, 4980741, 160743426, 160759834, 10829855, 2146363, 161236124, 31375497, 161284227, 134299783, 161300482, 2031658, 161318045, 161644546, 161662110, + 142245890, 161726485, 108707852, 161743521, 161793183, 1982474, 161825633, 161858720, 127680543, 161923112, 161939468, 161955878, 161972283, 2719754, 162004994, + 6455299, 162022561, 162152458, 162169263, 162202783, 5325314, 162235554, 125583398, 162299967, 162332688, 116162586, 162350243, 51658754, 162546852, 7733551, + 162611425, 162644008, 29900803, 162661541, 144621584, 8389798, 162710396, 162759127, 162792615, 110723074, 162840578, 116375766, 162857044, 162890920, 162938979, + 162972162, 17006621, 163004458, 163020815, 125796354, 152945099, 163038367, 47546389, 5309609, 163071146, 163202219, 163333292, 163381250, 163397661, 163414028, + 1114228, 163431597, 3212176, 125812738, 163529902, 163595439, 163627010, 163643823, 163676252, 163708944, 111198214, 163726512, 163856386, 2408474, 19447839, + 163873969, 4407599, 164020240, 59310101, 2195914, 164037810, 901129, 7733462, 164200458, 8389067, 2195670, 157155382, 164218035, 164364300, 164380682, + 125927430, 164397128, 3309574, 164462630, 164478988, 5947433, 5324876, 164495386, 164512948, 19447824, 164561433, 164626866, 164659729, 164692451, 164725623, + 164757588, 107462696, 164791477, 2130395, 164888616, 164904972, 164921370, 164937729, 1769512, 164955318, 165070007, 6373464, 165199893, 165216315, 19267683, + 49790992, 165249054, 165281891, 165314572, 165330955, 165347760, 165380530, 165414072, 165478431, 165494786, 7389213, 165512377, 27624000, 165658640, 165675046, + 165691867, 165724594, 165756956, 50249754, 165774522, 3850280, 165807291, 165855298, 165889212, 166053053, 5308558, 166215696, 116162570, 166232080, 154894362, + 166249662, 166346795, 115523610, 107462682, 129237028, 6455318, 166380735, 166543386, 3375120, 166559803, 166592983, 166626496, 166674442, 166691350, 51282347, + 166724801, 166805530, 166821890, 166838282, 48513053, 2719746, 166854677, 166871052, 165134362, 166887511, 166937794, 1769514, 166986947, 167051722, 167085252, + 1769478, 167445701, 167494854, 5308482, 167560391, 10829864, 4981960, 167624788, 167657482, 167673885, 167690266, 167707161, 167773385, 167821771, 167870474, + 167886877, 167904458, 167952468, 167985229, 46514207, 168018838, 19267641, 168067084, 167985209, 168083458, 168101067, 168133836, 168181791, 2196058, 168199373, + 168313045, 168345858, 10944535, 147243092, 42418182, 168379598, 168427744, 168461519, 168527056, 168641502, 6373518, 168690123, 168738826, 168755229, 168771610, + 168788398, 2147497, 2162698, 2195540, 168837614, 168231371, 168869909, 120979487, 168887505, 45023263, 168951839, 137102546, 168969427, 169280724, 169346261, + 169443465, 33620102, 169460950, 8602839, 8602840, 8602841, 169526490, 169623701, 33620083, 169657563, 169705766, 8389846, 169755868, 24838175, 169821343, + 169854173, 169902106, 169919710, 169967654, 117751810, 169984060, 170067113, 170099935, 2506768, 170148785, 170181836, 170231008, 8389857, 37437589, 170311695, + 170328080, 170344488, 46088230, 170360834, 170377226, 170393629, 27623454, 56131586, 170409986, 170426378, 170442781, 150913050, 170460386, 170591459, 170672369, + 170705025, 170737680, 170754059, 1982476, 170770514, 170803246, 170852404, 170885338, 170917995, 170951568, 170983511, 171032588, 171050212, 171099365, 2850822, + 171181286, 171279591, 115720504, 171328744, 171409434, 171425794, 171443433, 171491347, 55263234, 171507743, 1900570, 171525041, 171556923, 171589634, 81166347, + 171606046, 116375659, 1901004, 171640042, 171720705, 171737128, 171753503, 2131113, 171769922, 171802645, 171819030, 171835403, 42598875, 171851842, 171884570, + 171900934, 47923240, 171917767, 171967723, 2015261, 172016034, 13549579, 172048390, 172064774, 48513036, 172082412, 172459245, 19252462, 172524423, 172573209, + 172639471, 15073283, 172672240, 172769336, 172802080, 172836081, 20365314, 5177372, 172901618, 172967155, 173016308, 173080658, 173113832, 47939596, 173147381, + 173228792, 155631628, 173260831, 173277226, 173293590, 173309973, 173327606, 7356473, 173342749, 173359106, 19447834, 173375542, 173408266, 173424661, 173441108, + 119357877, 173475063, 173555925, 173588738, 173621378, 8389880, 173637655, 173654165, 8389881, 173688058, 173719608, 5309303, 173753595, 173801512, 173818703, + 173850639, 4980751, 173867020, 19252112, 173884668, 174015741, 174047238, 1900581, 174064075, 20365322, 162857019, 174112852, 116228134, 174146061, 174194747, + 79101981, 174227468, 3473419, 174245118, 174359703, 174408527, 174440458, 174456898, 145506335, 174489659, 174522409, 22478869, 174538854, 46350443, 6701058, + 174571562, 174587920, 13549606, 174605342, 174637058, 174653461, 135807007, 175015168, 175080705, 175146242, 175357954, 107447105, 175375619, 175439874, 175456293, + 6701084, 175472724, 175506692, 175571032, 5603364, 175603766, 45023248, 119357743, 175637765, 3227678, 7389194, 175702047, 175718883, 137379861, 175751184, + 175768566, 175801546, 175849484, 15351837, 175867142, 176047367, 176144440, 176177591, 176209979, 115179530, 176243881, 176275466, 139477623, 176291932, 176325040, + 176357809, 176390204, 176472085, 176488469, 2195759, 176504851, 2162707, 176522129, 176570452, 27246602, 176604424, 176734270, 176784649, 176816174, 176866570, + 176899339, 176997270, 177046796, 177094659, 1114115, 177111987, 2637840, 177144111, 1114133, 177177869, 31490050, 177259033, 177325326, 1933352, 177390863, + 49774604, 68583426, 177440016, 177586186, 177603857, 8389906, 177651796, 177684501, 177700880, 24838170, 177718547, 177767700, 177816439, 177848332, 147554330, + 177864764, 177946634, 177963037, 103284767, 177979829, 178012166, 178028575, 178044947, 56508536, 178061388, 178095381, 178291990, 178339862, 141459472, 178356513, + 134037544, 178389042, 178422667, 178488599, 178537752, 178602071, 178652441, 178782234, 178798608, 135184400, 133382166, 178814991, 901135, 178831663, 178864212, + 178896978, 3227704, 178929676, 178946058, 178962438, 2113573, 178979915, 179044411, 2196683, 179078426, 111607839, 179159071, 179175467, 179208276, 179241058, + 179275035, 179373340, 179504413, 118882363, 179651870, 179699734, 179716112, 2179112, 179733791, 179781651, 2195951, 108707842, 179799328, 179863773, 179897633, + 180028706, 170442754, 180077003, 131334746, 49905685, 3260475, 180126147, 2670614, 180158548, 6946826, 5325854, 180192547, 180273168, 179765305, 145506306, + 180290852, 180338690, 174424121, 180356296, 180387856, 180404264, 47546374, 180420620, 180436994, 115785757, 180454693, 3227872, 180520230, 180764729, 46530572, + 180781140, 121028619, 158253095, 180815143, 180929404, 180977676, 116228115, 5308705, 4980757, 180995368, 127713301, 181043206, 99893279, 181060905, 181142793, + 181174575, 181208362, 181257515, 181322282, 181338141, 181354508, 181371434, 181387286, 181403650, 181420072, 181436437, 181452812, 181469738, 181485583, 181501978, + 181518352, 119259193, 181535257, 181601580, 2195786, 181862973, 181895283, 181911684, 181928066, 181944329, 32637062, 181960734, 181993493, 182010776, 182059455, + 127909890, 182091816, 50872331, 182108262, 182140940, 4980778, 182157324, 4964373, 2261023, 182174749, 182222858, 182239238, 110133780, 182256458, 182305708, + 182370344, 182386754, 4964358, 182420781, 46530591, 182469145, 182535470, 44646441, 182584623, 182632470, 27607061, 182650160, 182846769, 47317021, 182912286, + 3850266, 182960182, 47415327, 182994123, 2195882, 183025693, 183042164, 183058473, 44171286, 183076146, 176734210, 183125299, 17220609, 183174452, 183403829, + 183566390, 45023242, 183599130, 180977666, 2196470, 183615918, 183664666, 183681067, 183715126, 183762975, 128090124, 183779359, 183795817, 7634960, 183829815, + 183944504, 184025613, 2113574, 184074256, 5177385, 184090655, 184107034, 55722003, 184124729, 114294805, 131334564, 7144289, 178880514, 184238082, 184255078, + 184287234, 184303654, 184320016, 11157520, 184336471, 184386874, 184435680, 122486843, 184483900, 184567099, 48676870, 184598831, 47088087, 184632636, 184680511, + 184713222, 1933318, 184730941, 184860698, 2195888, 184877581, 184926246, 124796930, 184942632, 184959005, 184975426, 185008431, 185041003, 185074424, 185107774, + 185237516, 185253926, 185270310, 2196303, 45711372, 185286740, 185319450, 2195522, 118882363, 884738, 185337151, 185401354, 185419072, 6455318, 15351850, + 185450527, 185466886, 185483314, 185517377, 185532438, 50266152, 185581570, 6897696, 1818626, 7389215, 185599298, 185729050, 185745467, 185778479, 185810970, + 20365341, 185827412, 185861443, 154943490, 185942026, 185958855, 186007568, 186023952, 186040341, 73531413, 186057159, 55033885, 186105962, 186189124, 186270155, + 186319296, 1114141, 186417994, 125583402, 186467653, 186597414, 27623727, 186615110, 124863663, 3244944, 186729799, 8389960, 170803259, 186826778, 170803660, + 186844489, 186893642, 115785757, 186959179, 187072983, 187106636, 187204941, 150569443, 6947931, 182960140, 187269162, 187285506, 22216730, 3309609, 187678742, + 187695241, 187711618, 187727901, 187744274, 2621450, 10993799, 187761999, 188055579, 188088811, 188121625, 188186861, 188219398, 188236355, 188268565, 188284969, + 47317011, 19252560, 188301913, 188335441, 188432415, 184926229, 188448770, 188465163, 188481538, 188497941, 148176962, 188515666, 188662063, 188695891, 188761428, + 188825681, 126599178, 188859733, 189007190, 189054997, 8389975, 59310082, 50937877, 189071376, 4980742, 189088680, 189120550, 25559124, 189136898, 2621461, + 901157, 189153318, 189169702, 189186079, 189202871, 189235202, 189251603, 122601484, 189268973, 189349948, 189431861, 189464578, 7307270, 189480986, 189498712, + 159481862, 150241311, 189546526, 129876050, 189579295, 49938438, 189596185, 110674885, 189662553, 189693994, 5342554, 189710346, 189728091, 189825058, 189941084, + 190038022, 190054402, 190070813, 190087184, 190103578, 190120411, 33112086, 190154077, 6701093, 190203230, 47611930, 190366658, 190399839, 190513164, 190529543, + 190545941, 128581658, 190562344, 190579535, 154714152, 190611487, 190627856, 190645057, 190676994, 143441958, 190693388, 180944995, 190711136, 3212297, 190775383, + 190825825, 190874978, 190939223, 190989667, 191053855, 2359298, 191071588, 2523158, 191135746, 191152184, 126287891, 132580697, 191184918, 123207746, 191201289, + 191217687, 9519113, 191234094, 191284581, 191546654, 2195510, 2195563, 191594512, 116015130, 130859023, 191612262, 2261002, 191677799, 112476186, 125796383, + 191743336, 191857669, 191938571, 57032726, 191954960, 58769429, 191972480, 192021865, 192120170, 192217160, 192284011, 192365932, 192463760, 142950459, 128843802, + 192496076, 120979487, 1212428, 192529773, 66928656, 192578926, 192626728, 192643103, 192659883, 192693615, 2998308, 192759152, 119570472, 192807644, 192839739, + 192872474, 127795503, 192888858, 192905222, 192921621, 192938012, 108167208, 192955761, 2408476, 193152370, 136740892, 1769482, 193233821, 5309811, 2195931, + 193316040, 128843807, 110134644, 193347668, 193381749, 8390006, 182288475, 193447287, 2015260, 193529208, 193593363, 2523172, 193610648, 193660281, 193709434, + 193790036, 113115165, 193824123, 193888284, 19267606, 2621459, 111214649, 49496066, 193904943, 2179103, 193937468, 194019435, 194053330, 194084890, 2113547, + 194102474, 99893258, 194150402, 194166805, 8389038, 194183178, 194200956, 194266493, 128172042, 194315339, 194379782, 194396648, 27344898, 194428944, 194445943, + 194478092, 194494474, 194510869, 126599180, 194527298, 194561406, 131334635, 194757608, 4980764, 46514182, 194807167, 2326534, 194889088, 131432479, 195052929, + 195102082, 118292511, 195166685, 8388695, 128581654, 195199007, 192479235, 195216682, 116850709, 195264564, 884776, 195298691, 195446148, 170999892, 195511685, + 195559476, 195593606, 195657749, 195674114, 195690507, 141459487, 195707884, 195772447, 195788884, 195821584, 195838061, 195872135, 195903500, 195919874, 118685717, + 195936286, 27852802, 195969043, 195985439, 46120998, 196002710, 120602665, 196051013, 196084144, 196116913, 119997330, 129237032, 196149270, 3129375, 196165740, + 196198459, 196231189, 196247618, 196280423, 196363656, 196396219, 180600871, 196445577, 196575291, 196608012, 5866526, 196625438, 137052172, 196657236, 196691338, + 196756875, 5799993, 196804637, 196820994, 20365323, 110411860, 196837468, 1933317, 196871564, 93978636, 196952586, 137379846, 196984919, 197034043, 112608341, + 197068173, 146456605, 197182862, 197247007, 197263389, 126599184, 1900565, 197279765, 197296210, 197328912, 197345295, 2801686, 128843817, 197804169, 197820531, + 197836934, 197853319, 197869698, 197885961, 197902467, 197918722, 17432586, 197936528, 198231441, 198295567, 198311957, 149815327, 198328358, 1769510, 198346130, + 198426650, 198443037, 189202463, 198459418, 198475792, 198492170, 198508575, 198524934, 198541362, 198575492, 116228117, 2850828, 198641043, 198721562, 1114149, + 7307302, 198737936, 198754404, 198788500, 198852624, 2801692, 198869013, 198885398, 198901772, 198918368, 198950943, 194691506, 198968725, 199016464, 199032838, + 199049237, 7307280, 128892930, 199066513, 199115182, 45908006, 199163914, 33390839, 199181718, 42434579, 2539560, 199327756, 199344134, 199360543, 116376154, + 199376980, 199409706, 199427479, 199508049, 199542168, 199590888, 8389522, 7143895, 199639106, 124272706, 199673241, 133660698, 199737370, 199753743, 128974870, + 199771546, 199868641, 199902377, 29622287, 199933974, 199951375, 199999526, 200015874, 200033249, 200066459, 200130582, 200148380, 200196530, 200228914, 200262503, + 200295837, 200344990, 149569538, 200376404, 200409522, 168722463, 200442288, 200476063, 7389213, 200556903, 126599184, 200590587, 62341132, 200638564, 200672150, + 171000679, 200720396, 200736825, 46514207, 200753584, 200786354, 200818830, 2326636, 200851458, 4964374, 200867842, 1966106, 200885664, 201032725, 1918152, + 201080937, 201115041, 933890, 201162773, 201179228, 201213257, 201261143, 5308498, 201311650, 201360377, 201441763, 201475491, 201555978, 122503189, 201572390, + 3850242, 201589929, 126763609, 201622264, 201655716, 201835941, 201933332, 201982386, 202014751, 125812738, 202031106, 202047498, 2719756, 202063884, 49496090, + 202081702, 202163623, 2261034, 202309648, 3309606, 202326082, 202360232, 202440714, 202458537, 202490703, 202522645, 127795266, 202539038, 202573226, 8390059, + 202687916, 202768687, 202802605, 115523610, 202851758, 202999215, 203080171, 203112494, 2196368, 203162280, 2342918, 203195824, 203425201, 8389011, 203572658, + 2129986, 203638195, 203703732, 203752885, 51871760, 203818422, 203867575, 204064184, 8388876, 204144642, 52625427, 204162489, 204210434, 204244410, 2195947, + 204374022, 5177350, 5325759, 204391627, 204424635, 204571586, 171835402, 128581642, 204603404, 204619781, 103743519, 204636219, 204668957, 27852802, 204685343, + 204702682, 17448976, 204751377, 204783632, 204800042, 17006634, 204817852, 204866448, 204898341, 204914719, 204931084, 2801669, 204947468, 204963956, 204980657, + 131760131, 131891205, 205014461, 27623508, 205063614, 24281227, 2342928, 19464221, 205193292, 47611942, 205227455, 205424064, 205471760, 135397397, 205489601, + 205521743, 2196058, 205555138, 205602818, 205619210, 44531718, 205636184, 205668364, 205684960, 205717535, 205733972, 205766694, 205783056, 150110250, 205800899, + 133709852, 205848602, 205865392, 128892934, 77250562, 205897759, 205915075, 185810982, 5309892, 205964741, 206210452, 3178498, 118030420, 206276038, 206325191, + 206667925, 206702024, 206799251, 206848149, 206880901, 20299908, 164036739, 206913595, 206947785, 207012143, 27852819, 2932835, 207046090, 207192129, 8389145, + 27852840, 207241262, 59310101, 207291851, 207488055, 180602316, 118883789, 207520178, 207553998, 207650875, 151715871, 207685071, 8389461, 207782996, 207831800, + 207865296, 207962142, 194510858, 207994882, 208012411, 208044098, 208076838, 208093186, 2670598, 208109583, 208125964, 128892954, 208142348, 208158730, 17006598, + 208175164, 208258513, 208307666, 208453662, 208486402, 65896458, 208503655, 2342924, 208537043, 208585007, 148602890, 208618384, 208651732, 208700885, 208830495, + 121077779, 208848342, 208896021, 46530600, 208912422, 45498380, 208930121, 208979415, 209043477, 152305806, 209061208, 209109924, 122683414, 209158228, 209190994, + 209224703, 209272863, 209289517, 152354832, 184926239, 209323480, 184713256, 209420310, 113229840, 3588856, 209437132, 209469466, 209486671, 113229864, 209520089, + 209748459, 49791007, 209780796, 209864154, 209946075, 8175639, 46219270, 199492441, 210026527, 210042882, 1785875, 210059286, 115294210, 210075703, 210141200, + 128991242, 172835211, 210157574, 128958514, 210174051, 210206735, 1785878, 210224604, 183975938, 210273310, 2359308, 29261862, 210305067, 210337821, 29902301, + 210355678, 210469167, 210501642, 210518018, 132857858, 204537867, 210534421, 210550810, 210567184, 210583567, 42598832, 210601240, 210665532, 210747485, 210796603, + 210830427, 210862118, 210878767, 210911709, 210945503, 211058714, 211075074, 211091498, 211107880, 7307283, 211124331, 110249440, 211157051, 2195680, 211189825, + 17809423, 29769759, 211240417, 211355106, 211551715, 36241545, 211615911, 8603108, 8603109, 211665602, 211714197, 211747924, 211796945, 133414950, 211845163, + 211878795, 2195508, 130285574, 211943426, 211961063, 133414943, 155795485, 212009197, 169787430, 45023258, 212043238, 212090891, 124862927, 212108775, 5505062, + 212256232, 212304871, 27852806, 212353026, 212369434, 27852831, 133677084, 154797545, 212385813, 24297531, 212402635, 212452842, 212600299, 212631574, 212664351, + 212680706, 141295642, 212698604, 212795423, 135741478, 212811788, 212828186, 212844550, 212860930, 115179546, 212877314, 45465626, 212895213, 212959535, 189251603, + 212992010, 139460627, 213009291, 123371530, 213075438, 213188646, 213206360, 31424515, 213255663, 213320127, 122667039, 116703263, 30392342, 4161552, 213353968, + 213598274, 213630986, 119226389, 213647426, 2359730, 213680431, 213712934, 213730716, 213778864, 19267595, 213811211, 213828927, 213893160, 118243334, 213909526, + 146653196, 213926315, 213958663, 205520927, 200556566, 213975062, 213991436, 20365338, 214009329, 2621478, 214040616, 186040332, 214056972, 214073360, 133611523, + 214091250, 214286429, 2195759, 214335630, 214368275, 48676886, 214385240, 214418931, 4571176, 214450284, 214483044, 214516167, 214564951, 2130205, 214615209, + 214646805, 214663180, 214679594, 2162728, 5325275, 214697460, 214746613, 45711400, 214794252, 214810650, 214827915, 215156215, 215269392, 215285770, 215302175, + 215319440, 4980772, 215352186, 215400919, 215433218, 215449626, 215466015, 215482425, 2195693, 215499671, 215547925, 215564319, 19267603, 6422559, 191053827, + 215582200, 215745474, 215777318, 10829862, 215794143, 120094749, 215826434, 51068939, 215843118, 47546383, 215875596, 5292061, 215893347, 215957506, 8390121, + 180764712, 215974735, 216006672, 118243354, 216023082, 193134618, 216040953, 216122874, 216203739, 7734537, 160760247, 216237563, 216285220, 216301570, 67043338, + 216317968, 216334378, 216351152, 216384418, 216417788, 216450557, 216596564, 216630241, 216662031, 216679247, 216712702, 216776716, 2801674, 216793104, 165330986, + 216809488, 197328922, 216825872, 216842255, 216858646, 216875440, 216909311, 217219103, 217235482, 217251859, 160579610, 217268761, 217333779, 217350165, 217366540, + 5292058, 141000720, 115179549, 217384448, 55443466, 217497692, 217530406, 217546783, 217563146, 137854988, 217579535, 217595906, 217612309, 217628759, 217677911, + 5718042, 217727078, 217759746, 46219283, 217776147, 217792549, 217808901, 2719775, 217825328, 217874474, 217890856, 93945894, 217907211, 217923624, 152272906, + 217940025, 217956392, 217972774, 93945862, 217989139, 165134374, 218005558, 218038287, 218054682, 218071052, 217972742, 6455317, 218088961, 218152966, 152272915, + 218169356, 110592012, 218185738, 3473450, 218202789, 218267658, 218284945, 218333250, 195592198, 218366888, 218398766, 2129959, 218448302, 218497132, 217366530, + 218529811, 218546202, 218562576, 5292060, 218579028, 218611738, 149094412, 218628149, 218662402, 218742806, 140607564, 218759180, 6946837, 116228136, 218775583, + 93945885, 218793475, 218873960, 218923010, 218939430, 47120422, 208994783, 218957316, 118652959, 219004964, 219021331, 217301014, 219037736, 219054539, 219103314, + 219136432, 219168827, 219201592, 219234316, 219250709, 219267098, 219283472, 219299897, 3457055, 219317765, 219416070, 219463711, 219480085, 219496479, 126763442, + 219512834, 219529273, 3850252, 219545628, 219561995, 219578370, 49774618, 219594763, 219611147, 219627532, 51036181, 219645447, 219725836, 219742432, 17006599, + 47317003, 219775042, 219807754, 219824975, 219856922, 129957931, 219873296, 219889669, 191053855, 219906060, 25559138, 219923976, 220037122, 220053546, 182386690, + 220069898, 218759180, 220086702, 158253735, 220136969, 220267025, 130203667, 220300810, 220348454, 119996846, 220364821, 8389054, 220382731, 2197004, 220496398, + 220528700, 220612109, 2195951, 220742393, 220774703, 220807190, 5309892, 220824399, 220857870, 220906802, 220954640, 220971046, 220987408, 116228138, 158744607, + 221003786, 221020219, 221053387, 221102106, 221118479, 118883161, 221136399, 137445407, 221233164, 55033882, 213778434, 221249538, 221266340, 221298710, 221315074, + 208896015, 205946902, 99516447, 137052162, 221331487, 221347894, 221382131, 46219300, 221414928, 221560842, 5309969, 221577232, 221593629, 221610020, 2032423, + 221626384, 2196746, 5537830, 221644306, 221692849, 221724683, 221741068, 221757461, 221773840, 22216733, 221790702, 32849932, 221824531, 221906452, 221954177, + 5308653, 221986945, 222019726, 222052494, 44351526, 222086677, 222299670, 222332439, 222396456, 222413793, 47939600, 2196480, 222446056, 222478348, 222494722, + 111280154, 62341122, 222807577, 222953951, 222986252, 223004186, 223051860, 223084546, 223101559, 223133718, 223150146, 223182867, 52215824, 223200795, 48070675, + 223282323, 223315195, 223364034, 223396828, 178356226, 223430172, 223544861, 223608848, 4751376, 195690506, 223626782, 223674384, 2801693, 223690792, 223707162, + 116375611, 45039638, 112607291, 223724429, 116228102, 223806414, 25559479, 223838234, 205881375, 223854608, 223871005, 223887391, 223903968, 1196063, 223938079, + 224018491, 44302374, 191905897, 224051266, 224084505, 224149975, 224182282, 132792362, 2179083, 5308475, 224200224, 224362558, 224411686, 224428068, 224444431, + 224461024, 224493604, 224509967, 112738326, 189202442, 224526766, 130285587, 224577057, 224608272, 224624666, 224641035, 224657420, 224673798, 224690217, 224706562, + 3145739, 224723028, 224755750, 224772127, 126599183, 193314854, 224790050, 224839203, 224886800, 224903183, 224919578, 224935952, 50511893, 216875855, 224953167, + 224985098, 225001474, 225018665, 225052196, 8390181, 134037520, 225116191, 225132587, 225166681, 225198998, 225248806, 225313768, 4980767, 225363495, 97435660, + 225427472, 225444064, 225476629, 225494568, 225560074, 225607718, 225624494, 225673232, 1753103, 225689622, 225705996, 225722836, 225755439, 225789481, 225935453, + 225985664, 226033683, 226050070, 202014751, 166936578, 226066891, 226115605, 118521896, 118178846, 226133546, 226214933, 226263947, 226328642, 226362923, 10829826, + 226476174, 226508884, 226541624, 226574402, 2129951, 226608303, 226640331, 47546410, 226690604, 226721813, 56311824, 226739757, 226787394, 226820108, 226836518, + 48676902, 226854446, 226902026, 3178517, 226918431, 226934901, 226967618, 227001903, 2197040, 227065962, 227147816, 227164599, 227198513, 122110220, 227460658, + 227524638, 227557378, 227573842, 227606571, 227639327, 1769491, 227657267, 5603368, 227722804, 227770390, 227787055, 227821109, 227901442, 227918286, 45465610, + 227967494, 228032522, 228048917, 228066123, 116376012, 228131118, 228163586, 228179989, 78905365, 228196373, 228212767, 228229136, 228245514, 135594029, 46497794, + 228262425, 228327455, 228343814, 228360251, 116376074, 228394550, 228442143, 228458498, 228475415, 228507714, 228541408, 228589580, 228605962, 228622775, 228655125, + 228671519, 228687891, 228704268, 228721079, 228753430, 156434463, 31424518, 228771383, 228851731, 228868118, 228884939, 228933658, 228950047, 228966402, 228982805, + 228999234, 229033528, 229097931, 229146655, 229163019, 229179394, 229195832, 229228610, 229262905, 116228103, 19251239, 229361210, 93978640, 206176294, 229410363, + 22216715, 10027669, 8603196, 229606603, 229639741, 2195977, 3473437, 1212437, 229738046, 4980773, 229802000, 88948762, 229819967, 229869120, 229949446, + 147013653, 229965890, 99893279, 229998623, 1196043, 121339907, 2113576, 230016577, 230131266, 230162437, 230178825, 67420189, 230195485, 230227997, 230244364, + 1949737, 230261195, 230311491, 42434562, 230457384, 129400870, 230473730, 230490219, 230522911, 230540868, 25559399, 230604831, 44466195, 230622789, 135643176, + 230688326, 230769099, 2195486, 153191209, 125583370, 140247124, 230817794, 230835121, 53641219, 231309348, 231325736, 9207845, 231343688, 231671369, 125927540, + 231751785, 15007745, 231786058, 224772112, 231899615, 231933515, 25559472, 231982668, 232030237, 216776720, 232046658, 74072080, 232079444, 1900554, 232112171, + 232144961, 232195661, 232243307, 232276034, 1769493, 232310350, 4980739, 232358191, 232392271, 232440991, 232474192, 42598888, 232554733, 232587291, 108315095, + 232621649, 148996127, 232767725, 4980743, 232800258, 232816662, 27852816, 2326530, 232833046, 232849439, 1114138, 110133313, 232867410, 232915028, 232947819, + 232982099, 233047636, 233145941, 233195094, 48676885, 29900821, 233260631, 233324574, 233357396, 233390508, 233456048, 147833886, 233488471, 233539160, 233619499, + 233652290, 233685004, 233701665, 233734602, 6324226, 233768537, 233816593, 233850458, 84934666, 233883227, 234047068, 234127426, 234161757, 49790978, 234210910, + 234307596, 1982502, 234325599, 234438668, 195264514, 234456672, 234636897, 234717268, 234750406, 234782736, 234799146, 234815920, 234848690, 127909890, 234881045, + 234897420, 78807066, 234913820, 234930235, 77250600, 234962946, 234979368, 2326566, 234996138, 235028492, 24838182, 235044951, 235094022, 235110422, 235126800, + 235143183, 235159651, 235193260, 235257858, 235274259, 235290640, 235307018, 119357539, 235323408, 235339795, 235356172, 235372550, 235388987, 235422225, 55869462, + 235456098, 56311820, 216727590, 235618306, 235634714, 51658771, 8390243, 235651108, 235667471, 235684299, 235734628, 235880494, 27246630, 235930179, 235962399, + 235978758, 235995155, 236011536, 3473423, 5309352, 236027963, 236060682, 236077085, 56721434, 236093469, 218415116, 153944079, 236109876, 236142630, 236158978, + 144048170, 236175390, 236208147, 236224533, 236242533, 236290074, 236306491, 236339202, 47546425, 236356043, 236405207, 236437975, 236470274, 17154088, 236486682, + 22888479, 236503071, 3473465, 236519532, 236552204, 180699157, 236570214, 236701287, 150241292, 236750440, 176504834, 68550668, 236815216, 236863938, 236896262, + 236912661, 236929026, 236945423, 236961814, 170344484, 236979817, 237045354, 237241963, 110723094, 237356652, 237471208, 237519702, 237569645, 8389883, 237651182, + 237682772, 237717102, 124796959, 150241316, 237782639, 44613670, 237830991, 121339914, 237864560, 37439089, 238141499, 238175318, 165134365, 238223362, 6537323, + 238240017, 150241282, 238272550, 238288955, 238321674, 140247094, 238339698, 238519923, 157220880, 184042073, 238585460, 238665833, 2195537, 238698553, 238714882, + 2195555, 238732151, 238764072, 173850655, 1114131, 238780895, 238813227, 238845954, 144048166, 238862573, 238895141, 238911500, 1212422, 238928196, 238978677, + 239109750, 239157273, 239191671, 239257208, 239321148, 73531432, 239404665, 239452697, 2129959, 177963014, 239518297, 239551416, 239600159, 239649961, 93978664, + 239681620, 239715962, 136740892, 2130767, 239847035, 239910950, 163545142, 239928956, 179814481, 239976460, 239993346, 240025621, 240042023, 240075512, 240107601, + 240140304, 240156896, 240189442, 121110540, 240206349, 240255083, 48627750, 240289405, 240567934, 130285578, 240682623, 240780928, 240828418, 146456604, 240845103, + 240879233, 6374746, 240943592, 240977536, 154042671, 204374045, 241025108, 241058016, 241092226, 241157763, 241223300, 2195927, 112936105, 241352716, 241369098, + 150913053, 241385902, 241434650, 121045011, 241452207, 45056002, 241485445, 141819944, 241582106, 241598466, 241615479, 241647632, 241664019, 116228118, 241680406, + 175669250, 241696849, 125927462, 241730030, 241762315, 241778700, 241795093, 241811487, 241827859, 2523138, 241844308, 29622310, 241878662, 241942540, 81166346, + 241959966, 241992693, 2196591, 242057226, 170999867, 242075271, 242188356, 242238358, 242286630, 241664015, 242303039, 242337416, 133677084, 242384898, 242401382, + 242434090, 242450444, 242466854, 2359302, 242483210, 2195519, 242499594, 242516257, 50659330, 242550409, 242647050, 4980765, 242665098, 242795720, 242828939, + 242894099, 242943176, 119799864, 242976396, 243205773, 2998288, 243368239, 3211369, 243400742, 243417126, 24838160, 243435150, 243499037, 243515521, 243549839, + 243597742, 94109722, 99893269, 243647610, 5488642, 3211363, 243712142, 243744875, 243778449, 1818630, 233193478, 162791446, 243828368, 243925029, 243941392, + 128843802, 109215775, 243959441, 244023298, 244039706, 244056130, 244089741, 244170764, 7389210, 152256543, 244188818, 198328322, 244334630, 244351035, 244383770, + 5325232, 244401811, 244482091, 118636554, 94109722, 244515703, 244547650, 244582036, 244680341, 244744274, 244777878, 244827798, 244875276, 244891650, 1933338, + 244909150, 6619278, 244957200, 244973578, 24838186, 244990415, 245022761, 118883789, 245040791, 245237400, 124862573, 245301357, 2326540, 245335705, 55853082, + 245384858, 133414933, 245497902, 245547046, 167706656, 245565083, 7389205, 2195729, 245663388, 245760029, 8390301, 245778078, 48627743, 245841932, 245859113, + 245892504, 245940262, 1982505, 245958303, 246120942, 8388654, 246153519, 246186527, 246236246, 246284300, 246300698, 3702786, 246318412, 77250562, 246416256, + 246466208, 117751839, 246498167, 246530054, 246546453, 246562832, 2359312, 246579233, 246628363, 45023244, 246646058, 246694347, 45023234, 246743947, 246810065, + 246857770, 246874154, 144048159, 246890536, 246906946, 246941345, 6373665, 247005292, 155762726, 247038482, 247154338, 247251903, 49479708, 247285411, 54820875, + 6619188, 247350948, 247529923, 247562542, 247595046, 247611695, 247644189, 247660598, 247693333, 247710560, 52215824, 247776194, 229965834, 247808021, 247824406, + 247840779, 147013663, 247858853, 248039078, 193200144, 248086948, 180174864, 248119755, 248168887, 248201228, 176504858, 248217684, 248252071, 125583382, 143507458, + 248414235, 248447005, 248463391, 248479750, 248496134, 248512524, 120094731, 49479695, 248530600, 248610828, 111067138, 248628694, 248678057, 248791059, 38125634, + 248807446, 248823846, 248840208, 107757587, 248857801, 248906187, 248956501, 249005738, 23380244, 234962946, 249120427, 249200642, 249218732, 249266186, 1769488, + 249282562, 159760394, 249298954, 149815327, 249317037, 249610813, 105463939, 249644718, 249708556, 1114228, 249724940, 249741338, 7389191, 249757698, 55279622, + 249775791, 135643138, 249890480, 250020098, 250052738, 8603313, 250069015, 9912469, 250085402, 113229845, 250102195, 5310130, 250136243, 250200665, 241991706, + 250232878, 250282089, 250314771, 250331174, 250347532, 200556570, 250364392, 250396909, 10829850, 250431156, 250512207, 250545226, 145506320, 250576915, 250593296, + 2801679, 250609771, 250644149, 250709686, 250906295, 250970128, 126287909, 121585676, 250986534, 251002882, 251019346, 251052119, 251101487, 251133971, 234831938, + 251150417, 251183116, 251199514, 251216304, 5177355, 251249320, 251281437, 251297794, 251314195, 251330581, 52215844, 251348136, 251396106, 5865511, 251414200, + 251494419, 251510786, 3178534, 251528889, 6701061, 251609520, 251643578, 251691107, 251725499, 251789328, 135184410, 3309584, 251805762, 251840188, 52215848, + 251986832, 252018776, 252051475, 252067862, 252084226, 252100646, 3309570, 252117471, 112754726, 252151485, 252233406, 131629087, 252282300, 252331711, 136019974, + 252428389, 252461094, 65912838, 92454914, 252478548, 252527518, 252561088, 252659393, 252706847, 79101988, 253132809, 253150163, 14745603, 253181993, 253198377, + 253214723, 63864963, 253232835, 193445890, 253493291, 153190499, 6455298, 253526863, 253560516, 118882607, 253624412, 253658821, 253756437, 46088213, 175849503, + 253806278, 253920967, 125583391, 253984863, 254035656, 254116747, 254181890, 2342931, 254215881, 254263317, 119128066, 254281418, 254379218, 254410793, 254427148, + 254443530, 192938012, 254461081, 254509084, 254525582, 254558220, 254574602, 254592009, 51838978, 147063272, 254623756, 229965839, 254641867, 3915842, 254738468, + 47022099, 254754831, 244170768, 254771231, 128155676, 254789324, 255016969, 255033481, 255049944, 255098886, 255115293, 255133389, 255182542, 255394005, 255426914, + 255459460, 3309578, 255475718, 255492125, 20365353, 43237405, 255510223, 169377801, 255542992, 255590409, 29163657, 255608332, 142245926, 255639589, 255655974, + 2197201, 255672357, 107757684, 29605907, 255688711, 255705107, 901177, 2523173, 38879269, 255721477, 255737868, 37355651, 255754247, 29376531, 255772370, + 255934753, 255968979, 256032784, 116228122, 234848296, 256050017, 256081942, 18677802, 256100052, 256147482, 159760413, 256165589, 256493270, 256589855, 256606218, + 256622613, 256639016, 115343388, 256655419, 256689879, 256787721, 256819240, 49791002, 256835610, 256853720, 256901146, 256917588, 256950288, 118884057, 256968410, + 257048617, 257064972, 1818662, 257081774, 257130638, 57032732, 257164425, 132776362, 257212428, 257229281, 257277954, 257294339, 257311152, 2197211, 257343594, + 6619243, 257425854, 257492180, 188761820, 2195732, 113247241, 109215754, 257556526, 6620329, 257606392, 257640157, 109215746, 257703938, 132155102, 257721651, + 257769558, 257802322, 257835294, 257884162, 257900554, 236011551, 2605072, 257917015, 113115146, 257966172, 258000607, 258180832, 258277392, 258293779, 121094156, + 258311905, 258408463, 258424834, 258441235, 258457631, 2801705, 258474093, 1785858, 17448976, 258506773, 258523148, 180977674, 258541282, 158253166, 258672355, + 258770553, 2261023, 258818507, 258867302, 258901732, 258965514, 1933354, 258982901, 19251307, 259047453, 259063820, 259081957, 259129803, 2179084, 259178929, + 259211793, 259244063, 259260418, 115818515, 259278566, 259409639, 259473697, 259506218, 259522636, 259555631, 137101362, 259589864, 259671785, 259735618, 141819942, + 259769191, 259801095, 259817503, 259833858, 115818517, 259850347, 259883293, 259916235, 259964984, 259997762, 251346960, 260030474, 8390378, 260047761, 160760943, + 119357506, 260097771, 260128852, 260163308, 260441837, 260620297, 24969353, 260636710, 260653115, 137101795, 260686299, 260720306, 260751370, 260767783, 195215398, + 260801010, 260851438, 260981711, 261029916, 261046310, 261063102, 261129967, 219186185, 261195504, 117506107, 261226546, 261259285, 261276540, 261325792, 261373958, + 261392113, 261455915, 261488659, 261505061, 132432729, 261521454, 123912481, 261570598, 261586956, 172836594, 261605107, 261701672, 261718032, 261734440, 3178502, + 261750794, 261768011, 2195916, 261832735, 147652646, 261849768, 261881884, 261898256, 261914655, 6374569, 261931496, 261964683, 262030159, 262062099, 262078501, + 108707852, 262094913, 262144471, 6438922, 46514186, 262177782, 262209567, 262225922, 262243601, 262291522, 262325216, 165134367, 228245525, 262373428, 262407924, + 262473461, 262521291, 262570831, 226050074, 262604534, 262784759, 262897666, 262914105, 182386719, 262931305, 262995994, 263014136, 189252018, 263096057, 25560826, + 263159819, 263176194, 2801685, 263194363, 263241739, 263258114, 218841109, 123273254, 27607052, 263276284, 2162729, 263341821, 263389190, 263405590, 263422599, + 263471106, 263487514, 17006613, 263503903, 158744614, 263520936, 131335337, 263553034, 119226397, 263571001, 263669502, 263815305, 18661510, 141819906, 263831564, + 263847946, 49938444, 263866111, 84738090, 263915264, 264094543, 264126480, 264142886, 264159248, 2342954, 7372836, 264175632, 6374509, 264192084, 264224810, + 264242566, 264306747, 264339540, 264372264, 264388629, 264405467, 264437779, 5865511, 264454155, 264242070, 264470550, 264486948, 264503302, 264519711, 264536083, + 264553368, 7634984, 264603393, 264650783, 136183810, 264668930, 264734252, 264765499, 2195970, 264799390, 128892968, 264864891, 264896524, 264912917, 264929306, + 264946096, 182059027, 264978453, 264994832, 265011250, 171458591, 265043987, 265060374, 265076762, 204587024, 43532309, 265453610, 265469993, 265486357, 7602214, + 265502722, 17809414, 265520900, 265682984, 265699330, 173850662, 265716648, 4964362, 265748783, 265781258, 265797651, 265814019, 2359332, 265830402, 132481458, + 24838175, 2867240, 265848581, 265912387, 265994281, 266010626, 163020838, 2834531, 266027551, 2670613, 266076182, 53706793, 266094342, 54460447, 266209031, + 266258184, 266356489, 266452994, 266469382, 266486289, 266518567, 266551302, 266567711, 266584301, 2195933, 1769501, 266618634, 200212486, 266716939, 266797913, + 35799080, 3309608, 266831628, 250298374, 165134357, 266911798, 266944533, 266960962, 266993683, 267010968, 267059210, 223020813, 267076993, 267126542, 11157514, + 267224148, 267272251, 267306767, 266027107, 267355920, 267436503, 267468821, 267485643, 111624194, 267536145, 8390418, 47546408, 152946451, 267601684, 267665439, + 125583379, 267681814, 21151860, 267699989, 267763811, 267796495, 267812886, 267829260, 267845658, 267862082, 267896598, 268044055, 224133136, 165724594, 268091451, + 84738059, 268124697, 268190171, 268224280, 268289817, 268353593, 268369932, 268386314, 268402709, 268419098, 268435487, 268451859, 268468264, 6701094, 268486426, + 268533791, 268551031, 253788191, 268583413, 216400304, 268616969, 268650267, 268699420, 268879645, 269009387, 269042311, 269092638, 116376074, 269156362, 269174559, + 269287426, 55132166, 269305632, 269386329, 269418522, 119357538, 195215375, 269436705, 269501323, 269565962, 156566135, 269582367, 269599605, 269631490, 269647893, + 269664715, 269715234, 269746777, 14712848, 269780771, 111656970, 110135076, 131334447, 269893663, 55377926, 269910028, 269928229, 269975568, 269991962, 164610064, + 270009334, 31473674, 270041391, 270073875, 270090261, 270107488, 270173152, 270223142, 270270504, 270286869, 270303691, 31424522, 270352438, 270385689, 270450780, + 270485287, 7307266, 270533109, 270927657, 271024888, 271058730, 2196489, 271107010, 159975211, 271140652, 2850838, 271187978, 271204650, 271238957, 271336357, + 271368202, 271384614, 2539532, 271400976, 45776912, 271417425, 271450171, 271482890, 271499293, 168329225, 271515714, 271548432, 271564810, 271582076, 271630796, + 271664942, 271763247, 271826975, 271844215, 271876577, 271925270, 2359336, 271943472, 8390449, 272089169, 272121866, 272138259, 272154690, 272189234, 272318521, + 272334879, 56655901, 125239318, 272351270, 3375106, 88948738, 272367647, 272384006, 3473448, 272402227, 2934010, 272434996, 272515937, 116850698, 272547866, + 272565272, 272613613, 272646590, 2196327, 272712704, 272745208, 272779042, 272809989, 7045122, 272828213, 272875532, 272891930, 272908310, 49479692, 272926518, + 273072221, 224935942, 273121346, 273155895, 273203210, 185860124, 273219694, 273252811, 110592031, 273301516, 273317898, 273334293, 273351563, 273417098, 273449000, + 273465370, 48676906, 133742632, 273481827, 273514517, 273532728, 273727494, 273743884, 273760271, 273776661, 215826444, 8603449, 8603450, 273793461, 273825802, + 273842713, 190922762, 273907750, 7733307, 273925947, 17809419, 273973347, 274007868, 185860124, 274138941, 119799890, 110249790, 274186699, 274236758, 274284554, + 2195488, 274301019, 2195947, 274335551, 45907994, 274450240, 45776936, 274515064, 163856396, 274548545, 274646167, 274694564, 274727185, 274761538, 47611942, + 274825247, 274842613, 274908995, 274990916, 55132182, 275039761, 275071007, 275087398, 229965862, 275105605, 166215711, 275152955, 2196826, 275185695, 274989075, + 275203910, 275384135, 275431440, 59375632, 275447830, 275464197, 117751839, 275480588, 47710219, 159727628, 275497019, 275529830, 48676893, 249987115, 275562527, + 275578899, 275595330, 147341343, 275629896, 275742813, 275793737, 182910988, 275874846, 275908426, 13713539, 276038062, 276086889, 276120089, 120258566, 276185127, + 276217871, 276234271, 276250645, 276267030, 276283404, 99893267, 276300969, 164380684, 276334411, 73744424, 276465484, 32849942, 135414569, 276531021, 49496080, + 276595865, 276643861, 276660255, 276676627, 276693295, 276725868, 276758554, 276775804, 276825934, 276906443, 276956489, 277006159, 277053471, 277069826, 118636554, + 212402635, 277088080, 277137233, 277364746, 277381141, 277397535, 277413916, 277430288, 183369757, 277446716, 277528592, 277545002, 277561370, 277577730, 277594127, + 176308246, 123617312, 277612370, 277709708, 2850826, 277757967, 277774358, 277790722, 128581670, 277807125, 265076758, 277823514, 277839898, 277856268, 122667046, + 277872642, 277889655, 277923316, 277970973, 16236546, 82001936, 276283408, 277989203, 278036482, 278052879, 247234582, 278069259, 278085643, 278102056, 174440458, + 278118416, 128581674, 278134868, 278169428, 278217241, 278284117, 278349654, 278396959, 278413350, 25559106, 278429711, 278446102, 278462495, 272613810, 278479306, + 278511627, 278528948, 3228082, 278595415, 278659078, 2195851, 264159234, 278675561, 46645264, 278710104, 153174042, 263536671, 278757921, 278808200, 278855690, + 112607465, 278872130, 278904858, 49791018, 278921218, 278937630, 1818650, 278970434, 32849946, 279004532, 279052319, 279068731, 279101494, 4407349, 279136059, + 49790986, 279185241, 279380100, 279396489, 17448989, 279412745, 4571271, 279431002, 279527462, 143589435, 279544960, 279592970, 279609363, 126287894, 279626889, + 279674911, 279691285, 279707660, 279724038, 159432761, 279742299, 159268876, 124796959, 279840604, 202063874, 279905971, 46514216, 279969794, 147423258, 279986242, + 280018975, 30392377, 280037213, 280282974, 280346634, 8390495, 280363438, 280412267, 280444982, 256032770, 280479584, 280608834, 147407370, 5309789, 280641612, + 3211735, 280676193, 128155690, 280838203, 280872458, 27852821, 280920172, 7389200, 280953291, 2196073, 115523605, 281002015, 139984902, 2850842, 2998312, + 281020258, 281249635, 4980755, 130007887, 281314193, 281362434, 45023272, 281379330, 281412692, 281462187, 2621446, 281509898, 210042911, 281526727, 281576230, + 27623490, 281610084, 281706555, 281739296, 62914562, 281772061, 281789323, 281854878, 281888613, 281935888, 6324264, 281954150, 282036071, 282083366, 282099750, + 282116098, 282132537, 278904863, 282150279, 282181716, 282214510, 282247199, 6193173, 282265448, 282558599, 10371100, 282576745, 158253550, 116850709, 282755084, + 282771927, 282805116, 282853386, 24838186, 282870220, 269517692, 282902554, 282920810, 282951716, 282968180, 117096479, 282984516, 283033616, 283049995, 283066380, + 172835029, 127909928, 280445036, 283083037, 2031642, 283115522, 283131930, 147816477, 72368130, 283148720, 283182955, 283246618, 283262983, 283279497, 283295749, + 283312130, 2326546, 109215756, 1097744, 283328944, 283361334, 1949725, 126959642, 283394333, 283428716, 283461485, 283608942, 283673621, 283721812, 283756399, + 283836521, 283869195, 223363111, 283887092, 283935774, 283967504, 2523157, 283985776, 202309644, 284051313, 284329842, 284493683, 284524584, 189579266, 284542080, + 284591737, 2162699, 5309328, 284639248, 113459238, 284657524, 284688412, 284704784, 4751400, 284723061, 284786726, 46710800, 284804117, 194084870, 284852250, + 284868624, 283722160, 284886902, 284999779, 285034359, 2360310, 120602629, 285081903, 285114452, 19251307, 285147166, 285181816, 125796374, 285279333, 285329273, + 110166070, 285378426, 285507605, 285523970, 285540363, 149585951, 285556793, 285573132, 192872477, 285589525, 163020822, 285605931, 285640571, 115523599, 285687810, + 45875203, 285704220, 145506335, 285722492, 286031881, 286048393, 29016198, 286066557, 286195778, 286228546, 25559099, 5309287, 286261674, 286294018, 2621466, + 149880863, 286310487, 30392330, 286361470, 286394239, 286426001, 286474324, 286507023, 286523408, 286539797, 286556163, 121061378, 286574464, 286656385, 286720002, + 286736816, 286769268, 286785538, 265601034, 286801956, 286819581, 286851103, 17809424, 286867471, 101908499, 286883924, 286918530, 14712863, 286982220, 287014933, + 241827862, 207290787, 287031298, 2113564, 287049156, 287080457, 11468931, 287097057, 287129651, 29622288, 49479706, 287164291, 239468556, 22216742, 287244347, + 2523148, 287277063, 287293469, 287309843, 287327066, 287359033, 2179114, 287377284, 287441889, 170984691, 287473676, 287490064, 6455306, 287508357, 287622487, + 2342914, 287670284, 287686684, 287703071, 152338453, 287721350, 287818905, 287867417, 287932431, 287948802, 81166362, 287965210, 194166810, 288524168, 288587782, + 288604172, 113229862, 288622473, 901240, 288769930, 19267704, 2261112, 2179192, 2197387, 288801715, 288835468, 288915892, 288964745, 2179113, 288981030, + 288997399, 59375635, 289015693, 289046550, 2015244, 289064846, 289112201, 289128582, 289144947, 20299911, 46530601, 289161353, 9207819, 289177611, 271925290, + 289193993, 289210498, 289226764, 289243139, 2621443, 289718274, 289734764, 289767446, 2998303, 289783923, 29737075, 289802128, 289964084, 289996842, 6406146, + 15073308, 7733472, 2197393, 290015122, 290228115, 290373869, 5325102, 48070698, 290406440, 49496074, 290424393, 3211715, 290505247, 290553922, 290587471, + 290621332, 24183042, 242368518, 290816002, 290832426, 245301258, 202162595, 6308317, 290850709, 291014550, 291061776, 225181706, 291080087, 291143682, 31801384, + 291160066, 72368147, 46514182, 2359355, 291178392, 258769743, 2130807, 291243929, 291309466, 291620763, 24297930, 291684354, 139477990, 3129360, 207011842, + 291700812, 291733530, 134840358, 44613672, 291749904, 291766709, 291800988, 291864879, 291897365, 226951189, 291915677, 292128670, 292208951, 20365343, 292259743, + 292323817, 292372482, 292388904, 292405274, 292421644, 280903682, 3244335, 292438092, 52674600, 292472736, 292668804, 46514178, 292733688, 292767649, 292814874, + 292831284, 51068968, 292865044, 292913164, 5325322, 292929595, 45646256, 292962330, 72368134, 292978772, 293011502, 293062562, 293158914, 293175334, 293191720, + 121339919, 293210019, 293519414, 293553321, 293584915, 293601302, 54493196, 293618857, 293650448, 293666856, 293683307, 293717924, 1949719, 293781588, 115785769, + 293816229, 293896631, 134709269, 293928987, 293963581, 294011022, 79740939, 294043664, 294060072, 145506314, 294076481, 36406081, 294127526, 294174792, 294240740, + 2195939, 117506132, 294291367, 294323112, 294354963, 294371365, 294388604, 3342352, 294438824, 294535170, 1818645, 294552883, 294601598, 294633500, 294649922, + 5342328, 294682678, 294715819, 3213050, 294748186, 294764546, 294780947, 48021541, 294799273, 294846548, 294879314, 294912029, 168493527, 145473538, 294930346, + 135905296, 8390070, 294995444, 295043098, 295059487, 295075905, 295125446, 295157776, 295174186, 295190960, 295223730, 295256086, 226639874, 295274411, 1114127, + 204996620, 295339948, 295665877, 295700397, 295863119, 295895078, 295911455, 295927810, 49938451, 19447824, 295944214, 124403718, 295960660, 295993355, 111362060, + 8388695, 296009770, 55132200, 296026546, 296058896, 296077230, 296109999, 296174993, 296239967, 174065584, 296306609, 296372146, 296419340, 50266143, 296435733, + 141836294, 296452127, 296468951, 296503219, 296566858, 296634292, 296714347, 296747010, 178127301, 296765365, 296845314, 296861706, 296878089, 296894482, 8175625, + 296911151, 296945202, 297009254, 297042350, 297091082, 146358293, 297109430, 48005141, 297156667, 297189378, 297205771, 221806614, 127042524, 297224119, 55132198, + 297287756, 233734154, 162971677, 297321748, 77709352, 297370069, 297418783, 131891210, 297437112, 29769740, 1769588, 297599249, 297633721, 297730506, 297764794, + 297813947, 297863100, 24838146, 297945021, 298207166, 84934693, 51822623, 111247372, 298287188, 298320311, 298352642, 125927450, 258080778, 298370635, 298420159, + 298518464, 298598406, 298614805, 4571152, 298633153, 24297535, 8159363, 162119788, 298682306, 298745858, 298764227, 298811422, 298844267, 298876994, 298909698, + 2146360, 298926617, 298993162, 45875219, 299042756, 299106380, 299139156, 299171890, 299204684, 257933328, 299239365, 299270228, 299304902, 270401602, 299370439, + 299550664, 299663436, 284640039, 299696168, 2195486, 299712584, 299778050, 299794470, 29622287, 5324907, 2147497, 299811753, 299859970, 158254001, 299878345, + 299927498, 300024741, 300056578, 47120390, 110248784, 300074955, 300351490, 7734511, 152027158, 5325037, 300367898, 2196392, 300384340, 29622282, 300419020, + 300549004, 300599245, 300681166, 300763087, 24838185, 300827070, 300892186, 198410282, 2196311, 300908598, 300942672, 300992464, 253706266, 8390609, 301105163, + 301121538, 222281754, 50937877, 301139922, 301252614, 141606941, 52576277, 301270995, 301385684, 132431931, 301483989, 8390614, 301645931, 301678608, 301695013, + 71188486, 15073306, 301711397, 301727760, 17448986, 301746135, 301909976, 301973563, 302006274, 174030888, 302024665, 302153794, 302188506, 243040297, 302301408, + 159760406, 302333983, 302351529, 302385115, 302433269, 302498317, 5308853, 302548418, 302598108, 302678018, 189464597, 303056862, 303349762, 5324902, 303367539, + 303398966, 303431696, 197115944, 303448919, 303482251, 41582618, 303530015, 303546374, 303562774, 115523594, 303579138, 30392351, 303597535, 303663072, 8390625, + 2113562, 303712226, 303824924, 303841306, 303857666, 114393099, 118882388, 303874108, 303957161, 157499880, 303990755, 6701059, 304087849, 191053827, 232079400, + 304121828, 304153695, 27852828, 304220133, 304400358, 304447507, 237732341, 304463911, 304496642, 304513131, 158811338, 304547815, 304628163, 27852838, 304660492, + 13074474, 304678888, 5325159, 304726075, 110183287, 304759896, 304809575, 186777631, 304859113, 116162562, 304939926, 304990186, 305039339, 305119664, 305154028, + 305317465, 238256159, 305365023, 184074252, 305381407, 5325665, 305397781, 305414170, 305430831, 305463308, 131629066, 305479726, 30326837, 305528916, 2195501, + 305563629, 158253547, 17842260, 305694702, 110723078, 305741826, 2113551, 305759897, 305808584, 305840154, 305856578, 305891311, 306005694, 290406412, 306055152, + 306300913, 306431986, 140247534, 306496119, 306528688, 3244120, 306563059, 306726900, 299696140, 306791421, 306855946, 25559343, 306872341, 306888763, 306921498, + 306937872, 7733725, 306954464, 264175618, 306989045, 134169102, 307070966, 307150854, 249266214, 307167248, 307183654, 258637862, 2129956, 307200059, 307234807, + 307347466, 307365662, 29491671, 116883931, 307430528, 307478530, 54460452, 51871775, 307494966, 128892944, 307529720, 307659923, 307692052, 307740779, 307773546, + 307855810, 44351500, 129925219, 307890169, 308068843, 143818783, 118883930, 45465615, 308101553, 308133900, 50937862, 2197498, 308150356, 308185083, 186794086, + 4997183, 308283388, 308414461, 167903316, 308461710, 308429712, 308496382, 308576272, 27852826, 308593154, 308625484, 308658181, 45039628, 308674641, 5866232, + 308708953, 308756502, 308772930, 308805653, 308822046, 308854786, 250937373, 308871170, 19447818, 308887855, 292962314, 308920366, 308970516, 309018655, 185319434, + 309037055, 309167628, 309199378, 309315584, 8978453, 309413856, 124796970, 309462036, 48676906, 209305626, 306954454, 309510381, 309543824, 122732582, 309575779, + 107757610, 309609295, 2916378, 309641262, 309690437, 309723172, 49496102, 310085634, 310248793, 240844866, 310281195, 310347779, 310444347, 131776571, 253706293, + 310478852, 310575157, 155631632, 310609925, 310888454, 168232967, 310968462, 311001098, 97681410, 273924098, 311019528, 311099418, 311115778, 7372810, 190644308, + 311134217, 84934672, 2196136, 311199754, 311279628, 170197863, 311296059, 311329311, 311377931, 48054300, 311394314, 2850828, 311410747, 311444680, 311478283, + 78102831, 311542063, 6324253, 311576436, 311607311, 311623682, 311640093, 311656470, 22216740, 311674892, 311820404, 3211330, 311837724, 311869521, 311904269, + 312100878, 312147970, 312164362, 312180765, 7307286, 312197173, 312230410, 312262740, 20365349, 312295483, 312328221, 312344588, 312360966, 265601046, 312377346, + 312393739, 13074448, 5309225, 312410114, 3227758, 312428559, 312493256, 312525447, 312574017, 110233616, 312625169, 17842985, 312805394, 127713296, 312887315, + 312934637, 312967206, 119226406, 312983567, 312999957, 313016753, 313051156, 313131024, 118884373, 313147452, 313229368, 49791012, 313264150, 313328553, 313377239, + 313411607, 313458725, 284704796, 313477144, 117751860, 313540648, 313557004, 307298325, 313575449, 147341324, 313690108, 313820640, 313852892, 50249740, 266764752, + 313886746, 170344460, 313933890, 313966651, 241238018, 313999854, 314034203, 314097666, 13713436, 314116124, 314212829, 3309571, 314245136, 6193163, 314261535, + 314279965, 314329118, 314378226, 314442641, 314490906, 1998850, 314507330, 124862546, 314935328, 315197473, 315278634, 2162725, 315328546, 5325239, 315392046, + 315441236, 127041620, 315473985, 127680552, 315525155, 315621378, 24838180, 315639844, 127795503, 131940389, 315688997, 315753885, 150241320, 315803686, 315951143, + 316080975, 316113832, 316146772, 116703270, 316194922, 52215846, 316278824, 316359133, 110134128, 316393513, 128155688, 19267689, 316540970, 316639275, 54296598, + 316702944, 316737580, 316866778, 149094416, 316899368, 143720474, 316917805, 5308455, 317014475, 2342941, 317063242, 317130798, 317293598, 317325614, 19268055, + 317359020, 2196932, 317424075, 317472809, 2195525, 317489690, 317524015, 317655088, 317720625, 317818930, 304808479, 317900851, 317950004, 318111831, 29786204, + 318161001, 318193702, 140248002, 5310517, 318212150, 64765968, 154665435, 133414933, 318277687, 318391305, 152158218, 318424002, 318457912, 318572601, 318638138, + 318702003, 56164373, 112312336, 318734346, 182288918, 318750741, 65896450, 318768143, 2998298, 318818363, 319029472, 270516236, 194068971, 253788170, 319063457, + 319111252, 191004771, 319144895, 27623476, 319178141, 319225915, 319258634, 319275036, 279904282, 319293500, 319456286, 270401773, 319490109, 319602710, 319619074, + 5177386, 319635532, 319669257, 319702639, 20365348, 141606941, 319750204, 319834174, 319898715, 319932479, 319963182, 320013165, 131940364, 320062852, 50266133, + 320127029, 320161856, 320374849, 25559911, 320487426, 2392070, 320505922, 27852821, 311197905, 320634952, 108724250, 320702531, 6374849, 320768068, 320815188, + 320848778, 320880666, 320897035, 320913474, 177111062, 320948293, 119357569, 321077260, 321093653, 321110046, 321144902, 321257696, 321292359, 129957947, 321339432, + 321355788, 4980762, 321374280, 321505353, 321652810, 321717322, 297844765, 44351528, 321751115, 161857576, 321800268, 321961990, 321978387, 321994778, 322011138, + 45613066, 125583386, 322028430, 322095181, 322176665, 322226254, 77250600, 322389053, 322455631, 322519061, 322535478, 322568251, 322601041, 322634262, 109052046, + 322666923, 322700488, 177700876, 322734160, 110248295, 322865233, 322947154, 323126920, 323174879, 323207197, 47317008, 323224661, 7602178, 2195985, 323258451, + 323321940, 5866762, 2130411, 323356756, 323683713, 323733393, 323766357, 190318090, 323847713, 290553922, 323881046, 323945873, 324011159, 324059659, 249987131, + 324108326, 324126807, 51019787, 324208368, 324239419, 2195503, 138641510, 324273008, 324321285, 324338139, 324370519, 324421720, 324486005, 257656921, 324517947, + 24838150, 324550722, 2359825, 324585562, 324667483, 46481429, 324731905, 324780633, 8389488, 316211212, 324814940, 324879500, 324928450, 324960321, 325011075, + 176488467, 5308907, 325077085, 325173549, 81166374, 325206863, 325238871, 325290078, 325337100, 219627530, 325353494, 325369866, 325386271, 204537893, 325403083, + 325781464, 325845871, 214319125, 45137922, 325896288, 304152587, 325994593, 326139906, 326158434, 326206810, 326240355, 326336578, 152946641, 326371428, 326418478, + 326467624, 326483978, 54460426, 7307283, 6422544, 326502501, 19253350, 68239671, 326615277, 326647915, 232981014, 326681423, 326713370, 326729749, 87031824, + 27852826, 326748263, 326879336, 326928489, 327026794, 327106562, 5308640, 327125099, 327172148, 75464725, 327205401, 327270482, 327303225, 327319583, 47530022, + 327338092, 327417858, 327434278, 147423270, 327450634, 8390765, 327467020, 2195554, 327483458, 3227730, 327518318, 327581736, 327598146, 327633007, 327860437, + 327895152, 57032720, 327977073, 328073324, 7602178, 328106831, 328138811, 328173682, 328253974, 328286734, 328318998, 328335365, 328351746, 328368159, 328384554, + 6946838, 328400962, 328433666, 328450519, 328483118, 328516344, 328549972, 328647465, 328679512, 8390771, 328714356, 328779893, 328892426, 149094412, 328908846, + 328960118, 329023542, 329058423, 131334433, 151093264, 329123960, 329468025, 329613350, 329629734, 118882358, 329647232, 329695766, 6373415, 4161538, 329728494, + 6374549, 329760780, 329778197, 329826362, 167903286, 329877626, 329974645, 3212318, 330008699, 152945554, 330170378, 5325220, 330187512, 330220367, 330253312, + 330285078, 45760524, 330303612, 330400375, 330433452, 330499560, 4997591, 330547284, 330579978, 330598525, 330711966, 330743915, 330777516, 330842131, 330858518, + 330874892, 46530589, 330891727, 330926206, 331090047, 331153446, 331169823, 170886313, 51675164, 331188352, 331303041, 331368578, 132187145, 331466883, 56246308, + 331532420, 331628546, 111280166, 2196415, 331644949, 331661849, 185319434, 331726914, 331761797, 1769479, 331923482, 331939880, 331956255, 54460422, 331974790, + 332021786, 332038160, 332054568, 6620363, 332070924, 332087306, 332103701, 6619188, 332121288, 209584555, 113115238, 332154087, 332204167, 332447782, 332464194, + 332499080, 332563324, 183369743, 332613769, 332694264, 332726274, 332742687, 47546394, 332759116, 332792240, 332824614, 6406182, 332840986, 332859530, 332939276, + 4177931, 226443276, 332955660, 243777567, 332972073, 332988428, 3555359, 333006157, 333072523, 333135924, 333168943, 333201418, 333217858, 7094903, 333252748, + 333414925, 333464361, 333496322, 2359334, 333512706, 333529114, 333547661, 4997176, 333595657, 8388701, 333627408, 333643857, 243777548, 333676575, 333692954, + 333709331, 55754774, 333725777, 333758476, 51675176, 333774907, 333809806, 333908111, 130269190, 333972768, 334037018, 334054542, 311690261, 334104720, 2342922, + 334217453, 2130882, 2196719, 334252177, 301252618, 334348342, 334383250, 334694547, 334807500, 334840409, 334874772, 334973077, 335036422, 335052819, 161726486, + 335070554, 335102761, 335134804, 59375621, 2113546, 335167595, 335200266, 119537666, 335218054, 119996932, 335284374, 131810324, 335332695, 335382679, 335431289, + 247234581, 2932960, 335478843, 335513752, 335593986, 335626256, 207620115, 335644825, 335775274, 50135069, 335856105, 47611906, 335905822, 264716369, 335938401, + 53690410, 335970413, 336005274, 336085002, 127680566, 336103579, 336281609, 336298121, 336314502, 10371187, 336330790, 336347174, 336365724, 336414877, 336464030, + 336496798, 336529567, 336576548, 78807047, 336594031, 336626600, 336660640, 336822303, 336838668, 68599846, 336855081, 151765028, 336873633, 151765014, 336906402, + 337002532, 337021091, 337068061, 148637860, 337788982, 337822296, 337856679, 178814987, 338100461, 215826448, 338135208, 203325466, 49496095, 338215014, 302252038, + 338249897, 112607341, 338346050, 2867216, 338379688, 235552780, 181256240, 338413033, 338462890, 6701068, 338527133, 338609042, 338657309, 245350412, 211812823, + 338675883, 338805672, 338837520, 338853894, 3342342, 338871119, 338903182, 72499223, 333299733, 338938028, 339230910, 34422921, 2195610, 2850832, 339298477, + 147423253, 339364014, 339445935, 339492902, 136790028, 339511472, 308576258, 339642545, 339708082, 23363797, 339839155, 116375659, 340101300, 340164639, 340181425, + 340213772, 340232373, 8389186, 340280530, 340312095, 249137334, 257657015, 340330680, 340591401, 340625593, 340705339, 340738981, 340771175, 2867212, 340803639, + 340869344, 340902753, 118882984, 340935574, 340984238, 341033002, 121651222, 116064282, 341049346, 341065754, 341082122, 341098580, 341131280, 341147686, 47611906, + 341164491, 2196535, 341213196, 2196358, 341229998, 341278827, 341311938, 341147670, 280903690, 341345587, 341393434, 51855398, 19038220, 341409804, 341426218, + 341442603, 341476524, 287146100, 341524518, 73531404, 341541782, 341592250, 341625019, 189693990, 341672020, 341704770, 341737579, 341772476, 246546458, 341868546, + 159383592, 341885399, 33390922, 317898833, 341919933, 341985470, 342065678, 168722453, 342100159, 342132928, 342345019, 342378689, 116211930, 342425707, 2146593, + 342458510, 112607535, 342493378, 342606801, 342656172, 342704130, 342720522, 151093250, 342739139, 342984900, 343097366, 343113794, 343148741, 343195650, 343213321, + 343247046, 257098575, 343343106, 343359499, 23364340, 343378119, 141606918, 343442321, 8390609, 343490619, 308674572, 343524505, 116867964, 343572501, 343588894, + 343621716, 343655247, 343687631, 343722184, 344033481, 282853416, 215810070, 344096874, 344179881, 344211498, 344227909, 344262858, 344312011, 344426700, 344457232, + 344473626, 114114589, 344491380, 115818534, 344539178, 243040297, 344555823, 344588319, 243777546, 344604718, 344653850, 344672461, 344770766, 111624223, 344883284, + 344916055, 344966700, 345000030, 345049295, 42369036, 289046554, 345145390, 345196752, 345474465, 3229887, 345524433, 345573586, 257949712, 316735533, 345704659, + 345786580, 6438914, 113836044, 345866925, 345915419, 345949097, 345997342, 226951183, 346032341, 346144796, 47611944, 346161164, 179716124, 346177582, 346227598, + 124928012, 269108092, 346294486, 127451145, 346521616, 346539568, 346570989, 191644566, 346604045, 42434600, 346654935, 84934678, 1769588, 346704088, 346802393, + 346882132, 283197497, 346914828, 346933466, 55197736, 346996790, 317898833, 347031124, 347127846, 3538982, 347144213, 5505045, 347160602, 347177387, 108298262, + 347209794, 347242508, 116752394, 347261147, 347457756, 347523293, 347603028, 347635733, 2359327, 347653003, 6127637, 347717642, 347736286, 347783234, 347816020, + 347850975, 175849512, 347932896, 348014817, 348178658, 164775081, 348258370, 348291937, 348323893, 348357528, 251396122, 348408035, 207422664, 348506340, 348553245, + 348570588, 348602384, 68599824, 348618754, 79101981, 348637413, 2195563, 348702950, 348750126, 348782621, 348635148, 348801255, 348897290, 348915944, 273465354, + 226443274, 348965097, 349175889, 349208602, 349224988, 349241356, 6438931, 349257740, 110248046, 349274219, 349306985, 349339667, 349356054, 349372427, 46710815, + 349389279, 2326554, 349421676, 157663248, 89128976, 349456618, 55377930, 349554923, 349619297, 177340479, 349685996, 2196216, 349716492, 349798459, 349833453, + 349931758, 350028585, 161808386, 184926234, 350062831, 202097400, 350160097, 159694850, 350603505, 2195538, 350750962, 174080066, 350816499, 168869894, 136921100, + 350865024, 350912518, 13074453, 350929355, 350978913, 351011649, 5177354, 351043671, 351095028, 351223850, 351240232, 49266700, 351256607, 351272996, 351289356, + 351305734, 47317007, 351322124, 351338506, 7389190, 108298271, 351357173, 351453655, 351488246, 196837392, 351535157, 351568781, 351651102, 351699785, 351750391, + 45531162, 351813634, 351832312, 351879211, 351911947, 29622284, 351930617, 17842936, 352092182, 2539551, 352110842, 352190923, 352241915, 352306088, 352337946, + 352354335, 7733485, 352370805, 4390950, 352403468, 7307266, 352419899, 352454333, 131891205, 352536828, 352831741, 353075216, 353092953, 47710239, 353126654, + 353206509, 353241343, 353304668, 353337647, 119799847, 6946832, 353370114, 45776906, 353388800, 353600929, 111214632, 353648650, 353665045, 306774075, 351895592, + 170705767, 353681437, 346177602, 353698958, 353748042, 353779733, 353796943, 353828940, 353861670, 353878070, 54460421, 353910800, 353929407, 353962241, 354156556, + 120094746, 354175234, 354273539, 354336770, 203654459, 341819414, 354353154, 48545802, 354371844, 55132186, 354435156, 354470149, 274989075, 8389647, 113115157, + 54345759, 354583128, 141541416, 354617606, 48513035, 2162707, 354730038, 354765063, 354811923, 5505046, 354828328, 132792341, 354844756, 354877547, 19447820, + 354910315, 354943008, 354975746, 2196554, 354994440, 355191049, 355238780, 355288697, 355336232, 164380678, 2146731, 355352582, 355369395, 355403579, 355453194, + 254574614, 8390923, 355565627, 355600652, 355633421, 355778562, 47316995, 355794990, 355846414, 355895567, 355959321, 356025485, 356075792, 356122670, 41582628, + 356172301, 47317034, 2196470, 356223249, 356337236, 227524715, 356434352, 3244139, 356468280, 144375810, 356533071, 356927763, 165494815, 357171238, 158500169, + 152946964, 357188531, 357221535, 357253186, 357285917, 119881740, 357303390, 357351531, 357386517, 357468438, 8389522, 357548034, 357564442, 307298341, 357580857, + 357597196, 150241290, 357613580, 357629962, 183189533, 357646695, 357681431, 357845272, 357927193, 357992730, 171163685, 358088763, 358123803, 1769498, 358187051, + 358222108, 2932818, 358450065, 358499302, 121339925, 358533405, 358597606, 358630256, 358679393, 3213019, 358711599, 358744083, 358760469, 54493200, 358777676, + 358826050, 114786775, 358858754, 143295224, 358876151, 358940674, 2195561, 358958579, 358992158, 109166613, 359071831, 5308446, 359120983, 359170481, 359205151, + 359333926, 359352608, 359399462, 357629958, 133611522, 198672424, 359415820, 5324908, 359432257, 10650533, 359483681, 237731851, 60227600, 185270282, 359661570, + 52756509, 359680290, 211910658, 340280530, 150913064, 359762211, 359811364, 359875006, 359940107, 359956546, 294944778, 359989302, 115769451, 50659334, 71483394, + 360023999, 360122661, 360171814, 134103399, 360269076, 360319271, 2196032, 360416785, 360450344, 61800471, 360515881, 360565034, 134168800, 360630571, 4653656, + 126435344, 360808458, 360826575, 318783528, 360859948, 361037834, 148062227, 361055148, 5865572, 361120181, 361152566, 45023274, 297222186, 361186242, 24297570, + 361218058, 361234744, 361267801, 361300034, 361334249, 361381900, 361398282, 358514728, 361415115, 361463906, 8390957, 361496660, 361529454, 361564462, 361679151, + 361761072, 361810225, 361873439, 361889794, 361906179, 361922572, 195690511, 361938963, 361955350, 361971714, 47120389, 361990450, 2015258, 3162154, 48480296, + 362070031, 2196057, 362086443, 362119234, 362153518, 362201109, 119226390, 362613044, 362692637, 362709839, 362741770, 232980534, 128286786, 362758603, 204537877, + 362807395, 362840956, 362891335, 3212608, 362940725, 363020968, 22216716, 363054056, 363102220, 363118598, 356761642, 5866434, 363135859, 117901622, 238551474, + 124864823, 363219256, 363364409, 118079500, 363383097, 363479099, 363513240, 363561485, 225181722, 363610580, 45433744, 363645242, 191053860, 363709795, 2360167, + 117424185, 363773971, 363790373, 2342943, 363809083, 364070041, 364118863, 364150901, 47120387, 364183568, 364200696, 364235068, 127025154, 364382525, 56164373, + 364448062, 364544459, 364593168, 364611903, 2197310, 296354755, 364642347, 364675131, 364710208, 364757023, 335151146, 364773388, 2130953, 364792129, 364871710, + 3244546, 364904502, 364937262, 364988738, 365037891, 365136196, 44597250, 365168965, 365346847, 50266154, 365365574, 125239324, 365445579, 365494372, 56492038, + 365527936, 365576223, 365593207, 7094719, 365627719, 365674527, 126287898, 365690906, 184549388, 365709640, 365805999, 365838756, 365873481, 365939018, 11042946, + 366036140, 1769529, 366084320, 366116883, 48545808, 366133308, 366217547, 366297098, 185417770, 366313482, 366329885, 44613638, 366346269, 366363083, 366414156, + 366610765, 366772278, 2195532, 366805521, 366837847, 232292373, 111149087, 6373915, 366886941, 366905678, 207126538, 113115146, 366116883, 367020367, 150913046, + 367067737, 252297440, 367102288, 1917504, 19267605, 367214651, 367247811, 367282513, 5310694, 367364434, 342608211, 246464551, 367427586, 367443974, 47120405, + 367462740, 131940389, 367528277, 367591440, 294535180, 367608926, 137379846, 367657066, 367741270, 214303944, 367790423, 8389930, 367905112, 140247574, 367970649, + 368036186, 368150875, 368197670, 173113375, 368214038, 177324034, 262062106, 368230402, 117424157, 368246865, 368281948, 368494941, 368558090, 368574548, 368607270, + 2146331, 368624768, 368672873, 368707934, 368755613, 368837075, 368888159, 368936569, 45498408, 368984102, 2197025, 369001844, 369049687, 369098818, 369133920, + 369248609, 369328487, 121339914, 369362809, 369410091, 369442918, 2195585, 369475603, 369491990, 2196418, 369510754, 11059332, 369559907, 135823426, 369608009, + 369655827, 114114597, 369672230, 160759846, 369689516, 369756516, 370002277, 370050649, 240943134, 370098776, 145293328, 370133350, 370262045, 245350416, 370278446, + 5325100, 370327694, 6373811, 370362727, 370425898, 370442306, 7733770, 370475545, 370540603, 370573343, 46514202, 370589752, 370622551, 370671635, 370688021, + 370704386, 370720787, 31424550, 370739560, 370851866, 370868312, 120258588, 370903401, 370999334, 159547423, 371018090, 371100011, 129876205, 17220498, 371212314, + 50479135, 371231084, 371278584, 2670623, 2195990, 371312661, 371343372, 371359782, 226951206, 371376144, 109035535, 371394925, 371657070, 371802131, 371819028, + 371867688, 141541402, 371884044, 2850842, 179994646, 371902071, 371965994, 2637836, 371984162, 372017519, 372214027, 372262092, 372312432, 372391948, 372410737, + 372473963, 16597593, 168706272, 372507663, 372556911, 372589451, 372654101, 128319510, 372672882, 372752406, 372769020, 372802932, 372853107, 373049716, 151994390, + 373115253, 373164406, 373293570, 373325883, 209338370, 373359555, 373410167, 10371209, 373492088, 373587984, 178814992, 19267622, 373604404, 111624204, 373639545, + 373721466, 373885307, 5669800, 373932044, 373948516, 107757570, 373981215, 319619082, 373997620, 79757349, 3899993, 374032764, 2196216, 147243074, 92749826, + 374114685, 374195220, 50135041, 374245758, 374311295, 374194195, 374376009, 374457238, 374507904, 374571944, 374604834, 291094591, 374638977, 374704514, 374767645, + 374784012, 374800410, 110412423, 374816787, 114409494, 374835460, 374898700, 374915108, 374931478, 233734156, 374950275, 113247603, 193134630, 375145600, 375196036, + 375259241, 17006604, 183189533, 375292751, 375326041, 375359020, 375392645, 375490586, 375537695, 15073299, 207291422, 375555166, 375603237, 375619590, 375636270, + 375668764, 375685132, 375701530, 189513766, 375720326, 50135061, 375785863, 375816202, 375832692, 86081552, 375851400, 375996439, 10944521, 376015241, 376274997, + 376307714, 376324133, 146767874, 376341637, 376392074, 376438786, 376457357, 376504814, 68257097, 376537114, 376553474, 45875221, 376569858, 158253112, 376586266, + 376602708, 214319161, 376635413, 376652079, 376684601, 376700940, 376717341, 376733698, 4964362, 376751411, 376799258, 376815618, 376832010, 376848415, 222281764, + 376867211, 376930306, 376946714, 376964062, 377014668, 377094200, 377129357, 377192458, 377208834, 377225237, 6455332, 2130223, 377241605, 38879234, 215187487, + 377260430, 377323522, 257638426, 377341516, 377389359, 377421843, 377438230, 377454594, 377471002, 377489807, 377521785, 214319114, 377571728, 28147738, 377620881, + 377668652, 377719186, 377798693, 377815062, 168820776, 285343783, 62341142, 377833875, 377929953, 144982056, 2408454, 377962997, 377995287, 378011670, 378028041, + 378044432, 378060816, 378077225, 378093703, 378109959, 378126364, 378142721, 79102068, 7307306, 378161556, 378273794, 378290186, 378306572, 251527174, 378322975, + 6127644, 378340218, 378784150, 378962012, 378994991, 379028321, 379062679, 379174918, 292110339, 344736273, 379192190, 379224090, 379240451, 379256844, 2162730, + 379273222, 379289621, 324567056, 379308440, 379373471, 379437163, 111132703, 379469855, 379486218, 2147249, 379503114, 379536206, 379601975, 379633702, 379650102, + 379685273, 379799962, 379881883, 379947420, 379994178, 380029341, 380078494, 380125210, 380141570, 380157967, 380174358, 380191638, 380240305, 380273119, 153190929, + 380305420, 380324255, 380373408, 380502126, 380534812, 380551184, 52723722, 380570017, 380633109, 380649484, 380665866, 380683433, 380717474, 380799395, 380848548, + 380995176, 381060467, 381091842, 129466408, 381110693, 381157397, 77709314, 381173772, 381192614, 381255739, 240582761, 381288486, 1949712, 381304838, 74072079, + 381321235, 381337638, 381354050, 381387223, 381421991, 381618600, 381700521, 381733290, 132808723, 381812748, 381830875, 45498384, 50118694, 381864363, 381976683, + 382009356, 4030483, 156123195, 204996624, 382025749, 59228186, 382044588, 382271500, 382288632, 382320670, 382355885, 211189762, 382402588, 56131596, 382420720, + 48480272, 382452974, 291160100, 382484561, 110216222, 382519726, 382634415, 382683568, 382730306, 180437030, 382765489, 382812736, 382847410, 382962093, 318717958, + 383009071, 383041602, 207142922, 383076787, 383288627, 177324034, 383336464, 56557594, 383353794, 2130352, 383385659, 344736375, 383420852, 383483926, 126042140, + 383500347, 383533359, 383568309, 6438934, 383631791, 383664149, 3473430, 383680524, 383696936, 47120441, 383713292, 133546091, 383732150, 383781303, 383844378, + 383860755, 138625026, 67059752, 384256441, 384338362, 384403899, 384534972, 384614438, 68241211, 384631982, 384697080, 384729153, 384780733, 384893463, 384928190, + 384975695, 214368277, 385010111, 385107584, 385155091, 147423269, 385171993, 385239488, 319701021, 20365354, 5865531, 385303057, 147423269, 385336665, 385370561, + 385452482, 385499235, 385531964, 385613905, 385646598, 20365334, 385663068, 20365333, 385698243, 385843310, 385875984, 2261034, 385893674, 381124614, 385944004, + 386008002, 386039814, 386056197, 386072660, 386107845, 386173382, 386252853, 154763735, 386285640, 386353607, 386402760, 73187370, 386449467, 115294230, 386482263, + 7734475, 386533833, 386613678, 386664906, 216466956, 884743, 386730443, 386778101, 386842729, 386877900, 386926528, 25560002, 387006494, 387039292, 387121167, + 5308641, 387138669, 387170319, 171000753, 387187159, 387219543, 2360640, 2195481, 387271117, 387399687, 387416182, 387448848, 2195982, 387465259, 387498060, + 148637217, 387533262, 8391119, 387629106, 387661836, 2195674, 387678432, 8391120, 387711447, 387744174, 387794005, 184860710, 387825756, 387860945, 158254070, + 387942866, 388024787, 388071515, 388106708, 169232853, 388139478, 388236327, 388303319, 388349962, 116376232, 388368856, 388581849, 388710412, 234848282, 388729306, + 388811223, 2260994, 388857910, 2197979, 196854261, 388893148, 388939883, 388972572, 367067195, 388988938, 389005354, 41091078, 389024221, 389137905, 389169206, + 377241626, 389204446, 389286367, 389333032, 389349378, 148602918, 389365800, 17006620, 389382603, 3228162, 389433824, 260620297, 389693716, 389728737, 389792046, + 389824552, 389840908, 6946842, 389857334, 220987418, 389890467, 389925346, 390086696, 318832669, 390105571, 390135827, 27607042, 390153207, 390220260, 390348910, + 8391141, 390381631, 390416643, 318767147, 390480678, 390513602, 390545464, 390578215, 2197990, 390613479, 185319445, 152946601, 390695400, 390922256, 2197422, + 4980752, 390941161, 6373600, 391006698, 391072235, 391121256, 2196510, 391233552, 391252460, 391299093, 391315458, 5767206, 391334029, 391381013, 3178518, + 391399917, 391645678, 391727599, 391824120, 251593181, 282853386, 391858164, 391924208, 293371915, 146767884, 392069122, 132792331, 172837361, 392088050, 392151071, + 5505034, 392169971, 392265740, 204619781, 392283797, 392350196, 392398555, 392431194, 392462374, 54493186, 392478789, 392514037, 77709343, 392610552, 392642562, + 17006603, 392661494, 392937769, 392970242, 392986655, 393003046, 393019394, 393035804, 121896991, 393054078, 393084940, 393101323, 393117727, 393134514, 6733845, + 393167766, 393216042, 393232410, 393248770, 393265181, 137576450, 393284087, 393314316, 393330714, 121929734, 393347082, 393363458, 2801675, 393379896, 393413142, + 264159258, 393445407, 393461770, 393478156, 85098508, 393494550, 210042911, 393511825, 393560076, 393576477, 18399260, 128892966, 99516428, 393594058, 393642849, + 393674818, 393707744, 393740330, 393756698, 393773058, 393789455, 393805846, 393822640, 393854978, 393871375, 393887766, 393905046, 393953282, 393969667, 52346882, + 393986058, 394002473, 394018832, 394035226, 394051595, 394067970, 393494549, 394084417, 394133546, 394150320, 394184775, 394231819, 394248223, 394264586, 394280972, + 394297350, 143441939, 394313774, 394364292, 54460453, 394428428, 394444826, 394461215, 44908546, 394480120, 394543126, 394559490, 394575882, 264405023, 394592287, + 394608659, 394625327, 128991258, 394657830, 394674188, 394690579, 394706984, 394723366, 30343227, 394740895, 394772910, 148733990, 198328339, 394824185, 394871655, + 394903578, 394919947, 394936322, 394952723, 394969100, 5701672, 394575878, 394986048, 395019373, 395051020, 213319709, 395069946, 395182121, 2670604, 395198495, + 128057356, 395214867, 395231272, 121929754, 395247618, 395264021, 395280415, 394067974, 395297239, 395329557, 395345942, 225427468, 395362325, 65699852, 395381243, + 395445238, 395477014, 264093706, 395493402, 395509776, 218841114, 158811323, 32849922, 395528700, 395608163, 395640853, 395657247, 395673824, 395706370, 395722762, + 395739142, 33112086, 180600941, 140249557, 395758077, 396052913, 10829846, 396100075, 396134910, 128336632, 17219688, 396215153, 396263455, 396279827, 50266134, + 396298751, 23789705, 396542094, 396574815, 396624905, 396657174, 117014554, 396689711, 2197525, 396722222, 396773888, 396820526, 396869653, 396886035, 320897046, + 396904961, 396967962, 396984351, 397000714, 119259178, 397017113, 397049922, 397082645, 130285589, 397100062, 397134338, 397298179, 397380100, 397443118, 397492311, + 397543743, 397574251, 159432741, 397607215, 6373890, 49086466, 5341243, 397639983, 397672458, 397688874, 252100630, 397707023, 117901829, 397754839, 397788049, + 397836309, 397852693, 127680524, 397871622, 397969927, 398098434, 398115931, 398150152, 398262435, 398297609, 398377026, 398412298, 398674443, 398753830, 2850854, + 5308938, 3212226, 398772748, 398854669, 232195214, 152354858, 398903822, 398952975, 339296287, 399018512, 343539733, 399097896, 399114242, 399130662, 399147483, + 399182353, 17842283, 8391186, 299794472, 399264275, 399313428, 52723754, 399378965, 184926218, 399425567, 131891226, 399442860, 7143480, 399507468, 3245147, + 399524295, 324567066, 399573030, 399590312, 399624726, 399690079, 399737333, 399769646, 6127626, 399818758, 399835151, 52723734, 399851560, 3227714, 399870487, + 5326707, 399936024, 400000030, 400032777, 400065797, 400130478, 153191031, 400181785, 2196871, 400458328, 400493082, 400638391, 178815016, 400671606, 400736268, + 400755227, 121110564, 400802846, 400837148, 400902685, 401014877, 382402588, 401066526, 333135924, 66945029, 401179055, 401211499, 84738074, 401244270, 401276994, + 401309708, 401326173, 401375254, 55853072, 401392153, 401458206, 401491113, 140247103, 401523521, 401555515, 401588236, 3178533, 401607199, 401656352, 401784858, + 401801242, 176177206, 51101698, 6946898, 401820087, 401883162, 8390561, 401902113, 402014231, 402030615, 402046988, 8994823, 309018650, 402064120, 402098722, + 402145282, 2031626, 6701113, 402161701, 402179081, 135102506, 402210923, 402246179, 332761591, 402328100, 402392866, 402424695, 402456718, 6324236, 402491941, + 402540727, 2129961, 11157525, 403097614, 403144770, 403177994, 403211173, 403243010, 2523164, 403261992, 403326369, 403376681, 122110361, 2196029, 37208197, + 403819050, 403914812, 370720806, 403997141, 115179546, 111067162, 404048427, 404111470, 404144212, 188940307, 404179078, 118884908, 404226050, 2850858, 404245037, + 2342940, 27623851, 404341802, 2933207, 17137695, 404439887, 404472821, 404539950, 24838181, 404586498, 315686994, 404603640, 404638255, 404160514, 404701721, + 287244316, 128453168, 213630982, 404767733, 404834865, 404897830, 372605820, 5062751, 404915605, 404963387, 7733347, 404998706, 405045485, 112754704, 405078032, + 319930802, 405097011, 405225538, 405259466, 405307418, 7733675, 405323807, 405340181, 307298326, 405356554, 398753820, 405373012, 2195978, 319930799, 405406971, + 405454864, 144621594, 118884916, 405471335, 382484588, 405553190, 4997229, 269664558, 405572149, 405670454, 254443526, 405815336, 405831690, 1933322, 405848535, + 405883447, 405932600, 405962809, 361988138, 200720396, 405981753, 131612681, 112197670, 406063674, 406194679, 406224917, 406241296, 406257702, 406274064, 406290474, + 406306847, 42434566, 302121420, 406325819, 406407740, 296961647, 406569012, 45613062, 384729172, 406601794, 406637117, 406719038, 406899263, 406995048, 407046720, + 320585749, 407095873, 407191562, 25559999, 407210562, 407373965, 407422754, 407454221, 407503862, 407537089, 407569417, 407601215, 407634999, 407666699, 6602758, + 407683112, 310591547, 407702083, 237683146, 407751236, 407816773, 407978584, 408010847, 408062534, 45498370, 2359298, 408095179, 408142504, 408174895, 408207447, + 200736825, 408256534, 408272908, 408289291, 138641866, 408305695, 408322058, 408059946, 408339296, 408404490, 8390812, 408439367, 408485890, 408502278, 408518687, + 408535479, 408568410, 408603208, 118194186, 408698902, 408717631, 408748044, 408764442, 408781407, 324567071, 408816201, 341983701, 408881738, 408977835, 77250572, + 409010178, 117424149, 409027014, 409059366, 409075728, 143654943, 409094416, 409141335, 409193035, 409307636, 2195882, 409354711, 409387045, 4751381, 409406028, + 409684557, 409780246, 269107266, 406357022, 409797099, 409832014, 409879003, 307150854, 409911380, 409946703, 48676901, 410026876, 316637718, 410077776, 410189846, + 254592009, 191070220, 410206220, 4571167, 51937311, 410222658, 410258001, 410354556, 8389516, 410402828, 128892959, 410420118, 410468378, 410484758, 410501122, + 410517510, 46694406, 99893277, 84934687, 410536530, 117424169, 410602067, 410666947, 410714122, 410730538, 410748005, 2129979, 410796877, 44531734, 410845643, + 410895228, 410946132, 410995285, 411222592, 411254796, 411272345, 411320326, 381157397, 158812758, 411337183, 122683413, 411369488, 49496121, 411388503, 411437656, + 411568729, 411729936, 411746342, 122683421, 411762719, 122732573, 3850268, 411779100, 411795494, 191610911, 411814490, 164036626, 7389187, 411912795, 411978332, + 115785749, 412041228, 307298330, 412060253, 412106764, 412123896, 412157369, 412205082, 412221471, 2261004, 2130347, 412238097, 412270594, 412287002, 147423261, + 412306014, 119359266, 412650079, 412713378, 412748384, 412893604, 412925992, 412942342, 54460437, 412960513, 413007926, 297418788, 46694442, 413043297, 413108834, + 413171728, 224935946, 413190755, 413237254, 297205775, 413256292, 191070210, 374030348, 413401990, 413433877, 343605274, 413452901, 413517461, 413583974, 413664265, + 413698663, 413764200, 414007312, 414023720, 145506314, 414040076, 3228087, 414057361, 414105824, 115785734, 414141033, 4292662, 414221619, 414269471, 332103690, + 379109807, 414285843, 226951205, 414302230, 414318623, 208093210, 414334992, 414351386, 2933734, 414370410, 414482442, 414498858, 414515232, 414548503, 414580776, + 414597146, 2197354, 414616171, 414679062, 414695455, 414711827, 191053846, 414728246, 414760971, 414779228, 414844505, 414892054, 129024962, 414908503, 414960236, + 415025773, 415236180, 415268880, 415285276, 181667354, 415301644, 337857051, 370573328, 415320686, 132432332, 415367204, 415383562, 415399964, 415416322, 415432732, + 415449114, 151748649, 415468143, 415678883, 415711244, 48021530, 415730220, 415760396, 415776784, 122683402, 415795824, 8389011, 416270961, 416402034, 188762739, + 8389308, 8391284, 2195794, 2195714, 56311834, 416514585, 416580053, 416628762, 115196336, 416647797, 416694356, 416729718, 416792633, 235028511, 47366146, + 147063746, 416809807, 416844407, 416908073, 416940091, 416972859, 147423268, 417005599, 4343129, 417021998, 2198136, 417071120, 137101536, 417087580, 93962271, + 417120310, 319832499, 417155705, 417300511, 42434586, 417317296, 417349678, 417401466, 417448239, 417481877, 73187338, 417514142, 417548709, 417595616, 417630843, + 417759339, 417794684, 417873946, 417890306, 153026570, 417907319, 50511894, 367607862, 417939458, 65896474, 417957031, 418005046, 418037853, 418086971, 418122365, + 418220670, 116867990, 418283607, 334185672, 8389804, 288620573, 418335359, 418431576, 418466432, 418546324, 418578451, 418594825, 36716681, 418611211, 418627721, + 418643980, 418660486, 418676871, 83918890, 418695809, 418824460, 418873501, 418908802, 354697239, 418971917, 8391299, 113115159, 419020915, 419037207, 2523167, + 7405700, 51789958, 419056260, 151765029, 419577990, 67059849, 419596933, 419809926, 45907987, 1769508, 163643831, 419859079, 419924616, 420036618, 420053034, + 331334579, 420069679, 385026534, 420102165, 420121225, 420186762, 420364395, 385286154, 2015248, 420397363, 420432523, 420774291, 169443465, 37208197, 420825740, + 420907661, 421022350, 421134364, 131336350, 421153423, 122126905, 421396496, 2197422, 1769488, 421412866, 421429269, 216465803, 421446090, 6374485, 421481104, + 2195939, 421563025, 175669264, 421626315, 421675010, 421691499, 262684710, 421726866, 421789999, 192200735, 421823311, 421857316, 421907091, 422002700, 422020255, + 1933341, 5177375, 422054548, 422218389, 422264844, 46530602, 422281319, 422364180, 422414522, 118210600, 422445087, 422463988, 422513302, 422562455, 422642825, + 422690868, 275185683, 174080066, 422726296, 422840985, 422904303, 65880085, 422936592, 422952986, 3228119, 422969387, 423002169, 348635148, 423018533, 423034896, + 2752527, 131776980, 47317029, 423053978, 423316123, 423395434, 4997799, 423478281, 423512732, 2834537, 423642035, 423673915, 423707757, 423740236, 169967638, + 423788556, 423804959, 48676874, 423822121, 423854519, 423886850, 423903253, 423919637, 147013689, 423938717, 173490710, 150241296, 424050700, 110248368, 346177995, + 167903291, 424069790, 424149034, 424165414, 36143135, 424182673, 109052775, 424231371, 424282783, 424394792, 424411167, 424427558, 226951197, 293503016, 51314690, + 424445530, 424476726, 424509471, 56262672, 424528544, 424820773, 299813537, 424837186, 424872610, 424921753, 424985740, 425034892, 425085603, 425148426, 425164842, + 425181824, 27443772, 425214431, 233243678, 425247213, 425314980, 425380501, 120258581, 425429669, 425558066, 1933350, 425593510, 425689181, 425740229, 425771049, + 50462758, 425788237, 425839271, 425888424, 425937577, 426150570, 108317355, 426262560, 7733849, 426295599, 176504863, 426328110, 426377226, 426394884, 426459193, + 426475823, 426509411, 426590214, 426606611, 426622998, 426640193, 426674860, 7733687, 426786862, 426835984, 426852358, 426869211, 426902467, 328073254, 426950722, + 426984437, 427049846, 427117229, 427198949, 427248302, 427428527, 427543216, 427589643, 427606103, 427655599, 427690673, 275546122, 365053273, 427787404, 427837370, + 427887282, 427952819, 44662822, 427982941, 359612417, 428034740, 428114391, 428146726, 428163074, 2195893, 428182197, 428361289, 428444342, 428509879, 428556290, + 54460453, 428574225, 428608184, 428640953, 162791462, 428769296, 45465638, 428787311, 428835752, 428867594, 428885001, 234930178, 428916795, 190545932, 428951489, + 429001402, 429064623, 429098411, 428015642, 429148859, 429263220, 200720400, 157663234, 429329084, 429623997, 113115158, 429722302, 429771455, 430000186, 7602192, + 430063818, 179716134, 430096855, 181258944, 430131905, 430293017, 430328276, 430358566, 430374914, 430394050, 192200735, 430440973, 430492355, 2198212, 430623429, + 430686626, 75464730, 2342949, 254083566, 430719435, 159760410, 430768130, 267534346, 253526446, 430787270, 430918343, 430982532, 237731861, 431049416, 431147721, + 138575877, 383402050, 431213258, 431276042, 431292875, 185319430, 431344331, 431423534, 431472697, 431489055, 431505903, 431538235, 119226394, 431573708, 8389516, + 431652874, 320307242, 254345227, 125583799, 431669250, 17842985, 124796930, 431688397, 431850794, 431901390, 432016079, 432095261, 432112263, 135824393, 128974869, + 432161290, 432196304, 432275887, 25559999, 121929734, 432308725, 252117004, 122568723, 432340994, 432357402, 55754781, 118031272, 432373819, 432406554, 50937887, + 432423215, 3735659, 432458449, 432786130, 432996371, 433013583, 433045530, 121339910, 433062768, 161628170, 433111080, 433128233, 75530280, 433161039, 433195731, + 20365314, 433242114, 280903706, 2162717, 46530572, 2147191, 433258562, 433291274, 433307669, 433324072, 130285594, 433341998, 433392340, 433569815, 206668046, + 61800471, 433588949, 433635340, 198721546, 433654486, 433700880, 433717286, 48054301, 6373807, 433733678, 433783339, 433815578, 433831938, 2326538, 433851095, + 434061338, 434077999, 434111311, 293044276, 2015244, 434143313, 434178252, 385370840, 434211545, 434275741, 6422530, 434323487, 434342618, 434391771, 434520873, + 434552874, 2850818, 170803232, 1785882, 434571996, 434618394, 168935453, 434634803, 61440012, 434667566, 434716717, 55853097, 434752221, 150536952, 434848203, + 434899678, 159301670, 434948831, 136118356, 435027984, 435047136, 20365338, 435093558, 435129057, 435224602, 131334273, 435243746, 51855401, 113246432, 435391203, + 178078184, 435470362, 385875999, 435489508, 168821583, 435587813, 338133019, 317836006, 435683370, 47710218, 27624369, 435700830, 435750619, 435781647, 2195891, + 435800807, 435880002, 435912714, 32849941, 435929126, 435945510, 163643451, 435962145, 296026196, 435997416, 436325097, 384632157, 436437044, 134840326, 436469776, + 436488731, 33392154, 436538090, 436587243, 436652780, 45629478, 436765560, 24297867, 436814284, 5309002, 186466358, 436849389, 437062382, 437108767, 437125130, + 294633501, 437141998, 437177071, 320634882, 437240771, 437288972, 437305356, 294633487, 437321794, 437354926, 437406125, 50266150, 437454100, 437502006, 437534758, + 147063546, 332742672, 437551188, 152027148, 437586672, 437698644, 10652401, 437731850, 437766898, 49774614, 437829716, 437865203, 135168016, 437963508, 438029045, + 438078198, 438127351, 438225656, 438289276, 147407370, 438340345, 153749422, 8390714, 438520570, 438617027, 438665228, 438681642, 438698047, 269107266, 438733563, + 438812698, 438829058, 438845455, 5505039, 438864636, 252116994, 438943803, 149129981, 425082946, 438979326, 439009320, 439025685, 439042070, 439058434, 439074837, + 439091206, 246087685, 439109108, 439156776, 115785740, 439536384, 131334720, 439665971, 439715418, 439749377, 180437018, 439796472, 439830467, 439877658, 439894028, + 108625977, 439913218, 440060675, 440141217, 440191748, 440238111, 141836314, 440255374, 7733770, 440320303, 440353903, 13074434, 440385602, 440421125, 440598633, + 440632320, 440664080, 65912863, 440680532, 440713227, 138575877, 440730536, 8389038, 224935942, 440765190, 440928628, 118882358, 440991831, 2195598, 441040917, + 441057310, 441092871, 5310042, 441191176, 220758073, 260964436, 441287755, 441352202, 319602710, 441368592, 6717478, 441385948, 441418031, 3738377, 441451021, + 2195680, 441502474, 115294234, 441649931, 6602778, 441712656, 441729784, 50511893, 441499664, 441764620, 441958440, 29622301, 441975243, 168722442, 442023972, + 287113245, 1949727, 442040623, 442074609, 442105894, 442122271, 52723731, 442138666, 442155030, 442173218, 442204172, 170803831, 442221019, 442256141, 442318870, + 178962472, 442335292, 442419982, 442469135, 306774975, 442548251, 442583519, 150536297, 442632976, 442731172, 442796817, 2162714, 442925164, 237731878, 8388676, + 6995970, 442960658, 52363269, 277725226, 443058963, 6422540, 443187634, 443220898, 443253195, 443304724, 443550485, 443632406, 6193192, 176488485, 443665175, + 443728172, 443760706, 443794009, 3227678, 443829016, 443910937, 443991044, 444058394, 444137526, 2801721, 115851276, 444170543, 444203010, 140788391, 444222235, + 444301912, 275316762, 444334120, 444350476, 8390040, 444369692, 444612634, 444629024, 444663717, 444743708, 444760090, 15073296, 110247986, 444776532, 44171306, + 444811764, 444858427, 444893981, 444989533, 126877707, 445039194, 445073431, 445123358, 445169751, 445221663, 445497350, 445513747, 445530134, 50315280, 445547730, + 61456400, 445579696, 445614880, 5865556, 445678199, 445710358, 135905292, 445729569, 52756518, 445809325, 124863311, 445860642, 445973240, 347669372, 350633996, + 446008099, 48545794, 446055822, 446121420, 446155556, 446317589, 446368549, 437370911, 446447644, 290996264, 446464012, 383483914, 446483111, 446529548, 148357158, + 446547029, 8390247, 446578754, 446613562, 446677046, 446712473, 446777530, 446809577, 446857761, 140247561, 446906406, 446922783, 185975255, 446939167, 446955530, + 13549578, 446971935, 352092170, 446991142, 447299600, 447316008, 137102366, 447335207, 447414731, 430931998, 8391464, 447463505, 428883987, 447496232, 447512633, + 47038466, 447531817, 447627269, 67059748, 447643658, 2326544, 271925264, 348635167, 447660098, 291143682, 447692841, 447709268, 447744810, 447823903, 447840266, + 111214649, 447859499, 4997222, 147243062, 447938572, 318832666, 447955025, 447987750, 316621647, 50249738, 448006956, 448169164, 448217980, 418054251, 448269101, + 448348191, 3211698, 403947522, 329859126, 448364598, 77512744, 2834498, 154665023, 448397399, 448446474, 448462890, 177111062, 448479265, 448528413, 448544799, + 49790988, 448561174, 448577538, 6602809, 448596782, 448660374, 448711471, 2293772, 448807779, 448856066, 448872463, 448888834, 125796362, 448907450, 448938024, + 448954434, 448990000, 189071366, 449232942, 449282993, 449315287, 49086486, 449348121, 449413800, 449445900, 2195509, 2196454, 449463285, 449529540, 449593375, + 449609734, 1769503, 449628977, 110215639, 449691714, 55263248, 449724719, 449760050, 125927427, 449839463, 449871912, 118882370, 449888315, 449921483, 449970177, + 84934696, 449989427, 450134056, 4309419, 450153268, 450297878, 6406180, 450317109, 303579174, 450380623, 450412582, 86327334, 450431798, 450510904, 450543626, + 221806623, 450560066, 450592850, 450628407, 440811532, 450674772, 450707915, 450757417, 2195536, 450792248, 450890553, 450972474, 451248223, 451297517, 451332233, + 451413593, 2130865, 451463995, 2195561, 451562300, 120045770, 451625423, 451657771, 451690506, 262078485, 451707913, 451742525, 34701713, 451873325, 451969455, + 452002326, 2195612, 452034619, 193871882, 452067788, 452100633, 452168510, 45039642, 452231669, 452266815, 452447040, 212731873, 452509737, 55197737, 452526507, + 452558860, 147423258, 452578113, 452873026, 452902928, 452919312, 14745638, 452935720, 452952073, 452968464, 452984837, 453001226, 453017610, 1212452, 453036867, + 49742455, 367476742, 453099607, 195215381, 453151556, 5866526, 453214229, 117506285, 453233477, 5324863, 453312538, 453328927, 294060044, 453345751, 453378135, + 453429051, 453476779, 453512006, 453607891, 453656618, 66371615, 453674014, 275791900, 453705782, 290406416, 49790992, 453741383, 453870831, 453905224, 453970761, + 454036298, 454099031, 454150987, 454197364, 454213670, 454230045, 454246406, 454262826, 454279284, 454295590, 454311965, 99844117, 157646869, 454626125, 454656037, + 307134502, 454672405, 56246293, 454688902, 454705282, 2195668, 1196053, 455148435, 455199567, 455248720, 455360714, 455395797, 455428945, 455557220, 455589904, + 127713290, 5325647, 455609170, 455740243, 455819348, 348602383, 455854932, 455969621, 242368518, 32849956, 456084310, 456131031, 385515586, 456163340, 5868006, + 456182615, 456477528, 456524234, 2359727, 456559449, 456622960, 456674138, 456737758, 456786882, 24298434, 137052172, 456819912, 456851515, 66945050, 1769509, + 424230971, 456887131, 456949762, 456966170, 116228125, 456985436, 457048076, 457064486, 254345227, 457083741, 457116510, 457211972, 153190847, 2195538, 457261963, + 457328871, 113115147, 457425747, 457493343, 47923222, 25559079, 457539624, 46530581, 457558880, 457673569, 457739106, 457821027, 457998830, 7045151, 269664778, + 458031163, 458063893, 458080310, 458113050, 48021515, 458129410, 458147241, 458178987, 458212499, 458244101, 56721410, 458263396, 458345317, 458443264, 458489922, + 458525542, 458720407, 5324881, 458769896, 235765798, 458817548, 3227872, 361054210, 458833986, 324453467, 458866707, 158221367, 458885991, 459147798, 2130414, + 459213672, 459311977, 459376478, 341984558, 154469545, 459440194, 459472937, 389840912, 459492202, 429673323, 459688812, 3555330, 459819166, 459850329, 459885421, + 5505046, 438240194, 459948044, 2195756, 459967342, 237830175, 460065647, 460210258, 460242974, 460278640, 460327747, 460390459, 118472706, 460426097, 114606118, + 460537910, 460570681, 248840223, 460587068, 460671655, 2195512, 460721010, 460816621, 460849163, 110215586, 460867252, 460950387, 461062154, 166314026, 461081460, + 113115736, 461275617, 461324747, 461373582, 461407604, 461456263, 321863711, 188809275, 461504524, 134169691, 461523829, 461622134, 2198391, 461720440, 212959234, + 401834014, 461769593, 461946902, 327483404, 458244101, 461963303, 7307274, 142589990, 461998817, 2132858, 462094348, 312393756, 462113659, 462275051, 462309237, + 290996245, 462372886, 109166613, 124862952, 462392188, 462503948, 462521334, 44908556, 462556029, 462602262, 462618629, 462635020, 462651423, 27852842, 130580482, + 462667807, 6455338, 462685173, 462751489, 462801790, 462913548, 349388802, 292766156, 110249440, 462930261, 462982015, 463047552, 463111036, 25559138, 463162241, + 296960054, 463274443, 463326082, 463424387, 2196979, 2834540, 463488372, 463539076, 463601727, 238551139, 463636318, 372327160, 463701444, 463735197, 464145286, + 464309127, 464420902, 234176540, 464437390, 45039656, 52363285, 55623711, 464472968, 464685961, 464732244, 464764938, 4390931, 111624197, 464783877, 464830767, + 80936966, 464863254, 464879642, 464896016, 464912424, 464928810, 24838166, 121651202, 464946345, 154796141, 464979144, 465013642, 465092620, 5488652, 430686229, + 465109008, 59375642, 465125398, 465144715, 465257254, 19841060, 465289272, 465321986, 5505061, 3230604, 465338380, 304627714, 465354764, 148636125, 465374093, + 465456014, 465535007, 465551441, 465585652, 465635913, 465698909, 465748067, 301006858, 465780795, 369623056, 465816289, 2523158, 465914767, 275464202, 3211695, + 466013072, 466158047, 466193297, 27623505, 466289558, 466340754, 466419722, 48513045, 170803293, 185483701, 466439059, 6898497, 27607050, 41582602, 466520980, + 466698306, 466732062, 466764822, 466813231, 466845762, 466881429, 466930582, 467058690, 467076086, 467107947, 467143575, 467190285, 467238924, 65896486, 467255388, + 467288076, 117751848, 87916575, 467304460, 184713247, 467323800, 467372953, 467484779, 467518664, 9551874, 467550210, 145145882, 6324236, 467569562, 237257837, + 467747295, 467781009, 467848091, 467910749, 467960744, 409829442, 467995548, 468058193, 468090901, 44613653, 468107266, 112936251, 468124185, 136101990, 468192157, + 468271110, 468287509, 191070248, 468304303, 468339614, 468388767, 163594347, 214564930, 468533264, 27246608, 173490235, 468552608, 468697119, 168820738, 468715550, + 468763161, 468828207, 2195533, 468860930, 110249520, 468879638, 163315794, 468962209, 469060514, 469107768, 45613082, 469172695, 469205463, 195264524, 469240739, + 469319699, 469336086, 272908298, 469355428, 427720735, 141852675, 469418521, 469483628, 31424533, 469519269, 2198438, 469617575, 29769730, 51019802, 469746572, + 469795814, 142868511, 469829818, 6225936, 469863336, 469943929, 469991855, 470027177, 308117506, 49905721, 470368293, 470384652, 10371129, 470404011, 470485932, + 136118331, 470829997, 392544294, 470876226, 184386450, 470909961, 470944686, 188874764, 471010223, 471157680, 225181734, 471236667, 471272369, 325238850, 471436210, + 293421082, 471518131, 471564347, 471599812, 29769747, 381665296, 49774613, 471630995, 174424066, 471665588, 471780277, 309624848, 180207628, 165134357, 471960502, + 472006667, 124403728, 472023106, 22216709, 472058807, 472206264, 180404226, 472288185, 472368072, 472452026, 472613378, 472646169, 472712864, 472743976, 244891670, + 472763261, 472809538, 191545354, 472843177, 472891833, 472943547, 473025468, 473204010, 473251842, 17809434, 473268256, 260063316, 473301038, 163595294, 118882767, + 346538043, 473353149, 216449545, 473415783, 473498026, 473530378, 473547383, 473582526, 473631679, 1917026, 473743819, 162660373, 473795520, 473973900, 474021940, + 474054682, 474071062, 77709328, 474090433, 287145995, 474188738, 474254275, 474367274, 474415160, 474450884, 474500037, 474578970, 474071062, 474598342, 468452193, + 474646011, 474696647, 474825652, 474891185, 474923018, 474942142, 474991560, 475054539, 475103286, 475137115, 475170209, 475220937, 2198474, 475270091, 475431857, + 475464908, 475512863, 475529818, 7733291, 475562006, 238714892, 475578434, 464783846, 475611238, 475644372, 475676694, 2162730, 475696076, 475841457, 475874198, + 475922442, 282036094, 475940009, 185417770, 266765206, 128974858, 475974605, 476054105, 476086282, 306774145, 476102668, 200736789, 476512765, 476564431, 476839995, + 476872788, 476905478, 294371349, 476923178, 318144528, 476971609, 477004738, 477036598, 477069314, 477085725, 60719120, 477102082, 2195574, 477121488, 477185331, + 17154079, 477233198, 4998235, 477283196, 468304886, 477334481, 150585376, 148357136, 477431117, 47546394, 477496161, 477531090, 477759402, 477823076, 477855828, + 477888524, 477907923, 48136194, 2342940, 477973460, 478235605, 478332695, 478380072, 472743948, 478396941, 478448598, 478511163, 478543898, 47120421, 478560715, + 478609427, 2147780, 478626283, 478661591, 287244325, 478740492, 302055534, 478756874, 6438924, 478776280, 478825433, 478871568, 131891257, 478890970, 478986306, + 479020619, 479071022, 135905292, 3686403, 479133698, 381550629, 479153115, 479235036, 479282895, 479313932, 479330306, 56492058, 479347626, 479428618, 2195519, + 479448029, 479497182, 252298585, 479674427, 479707162, 2359830, 479723558, 479739935, 479756290, 479774252, 137101826, 166428714, 479805506, 479841247, 480070378, + 480116802, 480149793, 480182561, 480217244, 8389364, 480265019, 480313839, 480349152, 480395310, 2129956, 202457401, 480445830, 480512993, 480594914, 480676835, + 152947684, 480854100, 368902195, 480887817, 25559103, 480920905, 480971749, 481051083, 3211724, 481099788, 481116170, 481132554, 45776908, 481149231, 481184742, + 5865577, 481247291, 481280021, 135168031, 481299431, 481461499, 117407775, 481512424, 481561577, 481624353, 481656924, 481692650, 481771622, 481804290, 481820698, + 2408485, 481837115, 481869917, 481922027, 250544144, 482036716, 482181142, 482197537, 482246658, 63817095, 482263078, 482279462, 482295867, 482330427, 482377787, + 482413549, 482574348, 482590722, 48021525, 132154252, 482610158, 2261008, 482855429, 482903691, 482967639, 483019759, 340770870, 483131458, 232374325, 483165206, + 256720912, 483213366, 483247475, 483280262, 483347440, 5309449, 483409997, 483442780, 483786811, 343212561, 483822578, 483934445, 173113382, 483970035, 23363723, + 313245698, 484082601, 484133876, 484230153, 484261995, 484294722, 484330485, 484426219, 372949094, 484461558, 484524044, 441565294, 484542740, 193953804, 484591043, + 484639390, 484674551, 484786221, 343295129, 484819010, 484854776, 484900927, 64275072, 484933698, 153879442, 484967841, 485018617, 485163688, 64765974, 485198205, + 485280762, 115769426, 485326902, 3214331, 485359703, 485409745, 485460988, 485720555, 485752854, 318783504, 485772285, 167005090, 485870590, 485982246, 485998658, + 299008006, 486031381, 352109081, 439746562, 486049275, 486098092, 486146132, 486179295, 486214655, 309723167, 486280192, 486378497, 5799958, 338363215, 404160543, + 2131182, 486476802, 486640407, 325912806, 486706179, 486801429, 486817818, 155533328, 270434320, 204537894, 486834188, 486851029, 486902583, 47038476, 486951940, + 487079974, 487096347, 2326752, 107757574, 487129154, 170705929, 487161915, 487196524, 487227867, 487263237, 487489643, 487525382, 2835430, 487639286, 487689223, + 487768163, 487800891, 55377958, 55377932, 487836680, 263946262, 155779088, 487883352, 487918601, 487984138, 131334673, 488047439, 488079791, 344736265, 488113040, + 488145894, 488177718, 488210451, 488226838, 488243202, 131891238, 488262667, 488374284, 488390668, 69156879, 2179108, 488409588, 44613748, 181175326, 488866216, + 32163586, 488999293, 489081869, 489275660, 154190257, 489325462, 489376782, 16826408, 115769451, 489440145, 170804198, 489489438, 489524239, 489701483, 489734203, + 489766996, 489799691, 357597186, 489819152, 489931806, 322715660, 489963558, 142835750, 489979970, 490014329, 121339930, 490062671, 279904268, 490094630, 490110978, + 148897813, 162499601, 490130450, 490343443, 1933333, 490425008, 117506132, 2998284, 490471490, 490506463, 490586397, 490618934, 118915103, 490651704, 315588614, + 490684875, 490733986, 490766338, 490782758, 1916960, 490802196, 23380541, 491078392, 491110454, 491146261, 7602188, 491228182, 147423244, 2998274, 491291637, + 491357832, 491408048, 491455224, 491488265, 491520042, 491536406, 491552770, 114114571, 491569611, 491621399, 491700683, 4653527, 491750430, 491782190, 491831353, + 46497823, 491847746, 491883544, 223608854, 491963478, 492011532, 115785730, 492027942, 42599247, 492044314, 149569548, 139035887, 492063769, 352518160, 492129306, + 492440603, 492489756, 2197199, 492617830, 492650799, 457706525, 492684297, 492716044, 4980852, 492735518, 492978389, 493014047, 55164944, 493076546, 493109280, + 493142923, 112935945, 282034229, 493209944, 493274541, 493323087, 493355491, 385662998, 493387842, 493423171, 2113573, 493469750, 336789581, 493502483, 243220490, + 493518935, 493568031, 161726470, 493584816, 493618313, 292110339, 493666314, 291110951, 493685792, 493830635, 493864308, 110215928, 493915169, 493961309, 494010413, + 348651547, 494046242, 494111779, 494241193, 494272578, 208764938, 350863376, 494305311, 346488834, 494323483, 494370837, 56557570, 494390308, 349765654, 494453582, + 1917873, 494521381, 494603302, 494734375, 494780432, 261131304, 494799913, 24297696, 494863369, 45613098, 494896533, 494947370, 495029291, 495075435, 495111212, + 495324205, 427098551, 495419458, 495453912, 495502997, 495567370, 495602734, 495682569, 495714370, 495747507, 495779899, 495815727, 495861800, 466485258, 179716138, + 4408143, 495881264, 336724025, 135823426, 496009273, 496025612, 49152019, 115738362, 496045105, 147407424, 55918604, 496157988, 496208946, 496271584, 496304182, + 402309146, 496336922, 496353364, 496389171, 131876079, 496484402, 496519326, 496549928, 496566388, 3309590, 496583178, 884764, 178962442, 496615435, 208896028, + 496634932, 496746552, 496779266, 496795674, 156827951, 277725216, 496812109, 496845720, 496894427, 496927753, 496962613, 497241142, 126746640, 133283842, 497354341, + 497404095, 497434646, 215744548, 497451024, 1918366, 3245167, 497467458, 497500257, 497566959, 497599356, 497650743, 497732067, 497762306, 474071050, 497781816, + 27624457, 497863737, 498139243, 8390102, 498171988, 2260997, 498206110, 498240570, 228376588, 498386518, 498453563, 498519100, 360693786, 498598697, 498630698, + 498647062, 498663445, 414909308, 498679820, 411746306, 498699325, 498797023, 498843688, 498860053, 498876422, 498892809, 37748759, 498910473, 116376043, 498942553, + 498974796, 499008002, 499043390, 499105823, 499122197, 120111721, 499138591, 499154954, 198328357, 499174463, 346177595, 499223616, 499289153, 5324910, 499352011, + 481820682, 499403842, 355729464, 499551299, 499613787, 499646530, 499679260, 126287884, 129876027, 51675162, 499695853, 499728386, 499744794, 499761666, 499797060, + 190644701, 499909035, 499944517, 500173894, 278216763, 500239431, 500370504, 500450826, 500498469, 108298262, 500517961, 500629544, 500645909, 500662288, 500531228, + 4112386, 500678677, 500695066, 500711426, 2719750, 2359315, 500727874, 8389756, 500760642, 500793363, 500809750, 2621480, 119800032, 500829258, 500959749, + 155648016, 52576278, 115769374, 501009072, 501058588, 2196941, 501188245, 501253129, 501288011, 501350454, 501384222, 152190987, 501419084, 501563499, 126042140, + 501596697, 17842283, 501662218, 501697613, 501761192, 501812302, 183582736, 501891078, 82559007, 501909211, 501940236, 295272459, 501958459, 502006904, 502038540, + 502054918, 122568725, 502071336, 3244086, 502500432, 204996624, 3227736, 502579688, 502615121, 502729383, 2197364, 167002626, 2195512, 502778962, 502860883, + 17842286, 502924810, 502972447, 235880460, 502989854, 150799529, 503021590, 439746562, 503041108, 503186906, 503267380, 45498384, 427213747, 503303253, 2359727, + 503385174, 503463976, 503483479, 503529498, 503545858, 503562871, 2196403, 503595095, 503647320, 503907423, 503971856, 48660506, 503991385, 504119377, 504155226, + 504218035, 93700122, 504252799, 504315957, 8390593, 504348975, 504384603, 504479803, 504512514, 504529658, 504561686, 183353356, 504579081, 504610845, 120979888, + 504627503, 504663132, 504709136, 126615574, 504725981, 122568714, 504761437, 25560094, 22216710, 504876126, 116064282, 505023583, 505118766, 505168361, 1933323, + 505217062, 505233437, 363560972, 505249848, 505282599, 1769500, 505316750, 2195914, 505380885, 108298266, 505400416, 505531489, 1982493, 505597026, 505678947, + 505709719, 505757738, 505775517, 505825083, 505873609, 505922011, 1917355, 505957476, 506121317, 506236006, 506349195, 506413098, 282035123, 227705432, 2326568, + 506432615, 506511391, 151093254, 506529359, 506577760, 506645608, 506776681, 506841460, 113115174, 2130355, 506907754, 1818646, 507035747, 409273207, 507071595, + 464928831, 507134844, 507185065, 507235436, 507347043, 507380312, 5868006, 507412492, 2196960, 507432045, 507513966, 110624790, 507675678, 507707398, 328073238, + 107479052, 206471178, 45875219, 282034275, 507723878, 507756573, 507773004, 507805783, 507855279, 507887919, 225181717, 507923567, 507972720, 508266507, 508330513, + 508362754, 299008019, 508380550, 508445130, 508478807, 508527043, 176488459, 508561607, 66273306, 508628081, 508742115, 508775538, 500973868, 509004915, 509116447, + 509132830, 509168756, 509214779, 509247547, 509281417, 3245225, 509330850, 117424159, 509378644, 54444042, 509412418, 2361131, 509476866, 52133907, 509495633, + 2197364, 509578357, 509643894, 509689862, 509706246, 509725815, 509804556, 509821020, 509853750, 261193739, 50659331, 509886551, 509935714, 2031656, 4456555, + 509968438, 510001154, 131859486, 510020728, 510181483, 510217019, 510313254, 510346249, 188106257, 191070224, 113246310, 510381177, 510495471, 510558267, 510591498, + 510626938, 510757922, 144048166, 5309854, 510820411, 510855140, 510885942, 510921851, 511167612, 511297441, 511344662, 511364221, 511442974, 135497365, 511478910, + 511577215, 244908044, 511624048, 324894772, 511672779, 511722887, 1212418, 511754327, 126517259, 214368275, 511806592, 512082934, 8391809, 512117568, 512183426, + 512376891, 512411123, 512442395, 512476169, 48054314, 512508336, 512541530, 512574287, 512606227, 46497808, 512622635, 512655414, 512688130, 2195754, 512705537, + 2196415, 512753718, 512786475, 248840202, 512819801, 512853499, 512902942, 512968249, 513065481, 137019398, 884788, 513100931, 513146946, 513179658, 354304042, + 513199236, 513261622, 88686614, 513297541, 119998004, 495682050, 513409061, 513425414, 237322252, 513444998, 6619189, 131795015, 513576071, 513769579, 288997392, + 513805448, 143753254, 513886443, 513949717, 513966102, 513984716, 514015242, 2621556, 47923242, 514031635, 514048010, 514064412, 514080778, 514097209, 27705401, + 514113565, 224133160, 514133129, 514477194, 514588708, 514605084, 2179082, 514621462, 514637881, 514654249, 514670602, 7634972, 6602758, 514687057, 2195537, + 514721799, 351010844, 514769322, 514801680, 514818054, 103743491, 514835477, 514883638, 115589139, 355106842, 514916406, 124862574, 514952331, 515033109, 515067020, + 515178518, 90521636, 515196671, 515245363, 515293190, 191184902, 515309584, 230621213, 515329165, 115769446, 211337222, 515473448, 515489828, 515506204, 38879242, + 515522612, 24297574, 515558542, 515621006, 515653642, 54460445, 515670863, 189464586, 515703980, 515755151, 515801100, 355729708, 156829424, 313786839, 515817474, + 515834971, 515866626, 515883018, 515899413, 515915807, 194282305, 139984918, 516538413, 237699126, 904337, 516574354, 516620408, 8391827, 516637510, 515951761, + 516672660, 516721302, 8159263, 516767767, 516784154, 516800514, 8159261, 86327353, 516816918, 516833395, 2621456, 516850303, 516882567, 516898950, 34455682, + 516915216, 516931610, 77496329, 516948105, 516967573, 516997122, 517013516, 517029906, 517046404, 2031750, 517062671, 517079080, 517095462, 173359219, 517111830, + 517128323, 517144585, 10371088, 517161041, 517193862, 517210153, 517226514, 517242892, 517259267, 2621441, 517275674, 7307269, 517737623, 357597215, 517803160, + 517980171, 8945666, 517999769, 518127654, 518144054, 518176867, 518209995, 518258912, 5324905, 518291561, 147013670, 518327450, 518375262, 518438954, 518455308, + 338771974, 51888154, 518474907, 182419468, 518553638, 518570038, 518605980, 260964436, 518655133, 518734630, 3211566, 518767908, 518818974, 518897888, 518930791, + 518963659, 519015583, 519143455, 115818502, 519163040, 519258217, 519290882, 137104545, 73744386, 519307801, 519373289, 182157314, 519425186, 116375636, 519474339, + 6193190, 519538538, 519572644, 519720101, 519816015, 2162703, 519848239, 519882120, 3916623, 519913556, 519946261, 185286672, 400801900, 519962684, 366215242, + 520047782, 520129703, 321552386, 295272463, 520177057, 520224783, 424509462, 520241607, 520293544, 6455315, 520539305, 3457045, 520585282, 499270092, 520621226, + 141411358, 520703147, 520768684, 51494939, 520847362, 520863770, 222183445, 520883373, 47120386, 520945676, 17006618, 520965294, 521044006, 128761858, 68386828, + 521061292, 521129135, 521208711, 461963398, 163315936, 521256979, 99893260, 521273403, 521306150, 521323432, 521355348, 521391280, 521519180, 521551910, 225116191, + 521568272, 521584646, 521601045, 521617424, 99893259, 521633808, 521650202, 521666582, 521682946, 521699356, 137412637, 521718961, 521781250, 159645722, 521797654, + 55263263, 521814475, 521863194, 521881014, 237830146, 521931954, 522030259, 522076214, 522108966, 176488486, 522125536, 522158092, 247840794, 522174561, 522240026, + 522256396, 522272806, 2162726, 522292404, 522371082, 522387515, 522420245, 47611907, 522439861, 290996255, 522485800, 15073306, 522505398, 110232687, 522620087, + 522698783, 522715178, 347144214, 522731586, 522764372, 109199414, 522797359, 45056011, 522831750, 522929782, 522978216, 523013251, 105562135, 523060455, 523108390, + 49790978, 523127992, 7733304, 523173954, 150241290, 523209913, 523406522, 523436086, 523468838, 523485721, 245301288, 2130223, 523553979, 45039654, 177094659, + 523652284, 523731379, 523763799, 523816125, 523865278, 523961729, 524009474, 49938458, 1900586, 524027387, 524078057, 524141532, 524173986, 524569792, 524782785, + 524828771, 524861527, 524910816, 2506763, 524946626, 525041690, 525058114, 525094044, 525139989, 525156378, 525172752, 29900815, 525190170, 142589978, 525238284, + 147013658, 22216723, 525254668, 525271182, 525305363, 525388995, 525484977, 198754363, 55328780, 525520068, 525598828, 525631943, 19267605, 525683909, 525779043, + 525811766, 297386744, 525847750, 525896903, 125583459, 2834539, 525995208, 526172176, 526188554, 257638431, 526204953, 526237793, 526303284, 526336059, 526368794, + 20365348, 526385236, 526421193, 526650570, 526712891, 112525333, 168394851, 526745665, 526794762, 526811168, 526847179, 526909466, 526925834, 526942239, 526961053, + 119997814, 527007787, 527040967, 47939624, 527089691, 527122491, 1982490, 527155212, 211107846, 527174860, 527237159, 6373484, 527270315, 527304320, 527351820, + 393494538, 527368213, 131318878, 111624223, 527387853, 527584462, 130859034, 527779710, 208502872, 110234831, 527813840, 527958455, 152964305, 527994066, 528138477, + 6897953, 528171070, 528220162, 528236559, 528252950, 528270230, 241434626, 456559827, 528321748, 528367637, 528384016, 528400395, 528416770, 122568725, 528433178, + 528449552, 47611919, 528466807, 528498734, 528551125, 99483677, 528629826, 111624234, 466157927, 528665814, 188580754, 528760861, 46121000, 528777675, 528828123, + 528859151, 528875541, 160727052, 528895191, 529056238, 529088528, 110100506, 529105367, 529137685, 152354847, 529154079, 529173720, 529219596, 529235989, 208994334, + 529252374, 529268738, 194101259, 330874890, 529286000, 247775258, 529335793, 529370329, 529452250, 166871071, 529498143, 529514502, 181813254, 7095265, 529530882, + 249988017, 529549493, 29491259, 529596953, 529662860, 529714008, 529763547, 124862766, 529860950, 529908766, 529943772, 530025693, 530055174, 20365328, 530071636, + 530104740, 530402527, 124862955, 453214220, 530549149, 106446867, 530599136, 530694176, 212877324, 530727019, 6373613, 530760734, 530795745, 16728073, 13074453, + 530876859, 173113370, 531006200, 531041506, 531087444, 108314983, 531120650, 531153433, 531221731, 531267626, 114114572, 193200138, 531287268, 51675174, 531333204, + 515653658, 531369189, 531500262, 2196649, 147013663, 531645030, 531677186, 531693594, 531709981, 205209602, 44253212, 531726403, 531811559, 531909864, 8604905, + 531972106, 110248411, 531988546, 532021274, 6455325, 532040938, 532172011, 532234300, 2146522, 532316247, 532365418, 532448276, 532499120, 166068280, 532545548, + 3178508, 532565228, 162168859, 5324899, 532643881, 532660262, 532676610, 122732586, 532696301, 32325655, 532942062, 533037066, 533053977, 533120345, 345374730, + 4980758, 533152627, 533234600, 533266513, 533299238, 533315692, 533348576, 533384431, 2196289, 452853798, 533512202, 50937858, 437682615, 533529576, 46088202, + 294027290, 533581040, 25559466, 533643274, 115015739, 533662961, 533774338, 118210566, 533791567, 61456394, 110100496, 533823519, 199459243, 533840784, 533872949, + 533923214, 6373847, 533988552, 534020098, 93978665, 501170182, 534416627, 534609930, 127713311, 534626750, 534695156, 534773819, 534806538, 3211735, 141606949, + 534826229, 241190296, 534888480, 534921218, 127746079, 534939034, 535039222, 535118295, 535150651, 535183459, 535217090, 535248926, 535284983, 535397112, 535430030, + 535495115, 535543890, 535576879, 535610377, 535645432, 535694585, 18153482, 535743738, 29622388, 535890884, 535937492, 535971047, 536019880, 536051798, 536087803, + 536182851, 536265335, 536298385, 126599170, 536347083, 536399100, 536510495, 159973859, 536530173, 536612094, 522977339, 536775935, 536954257, 537021696, 537083930, + 537100718, 5308843, 537149442, 537169153, 537199051, 537251074, 82558992, 537296898, 537314334, 537349379, 25561334, 537477608, 537509890, 402195192, 537529038, + 537644292, 537755679, 537772503, 174424080, 115114855, 32849936, 150388795, 537807421, 537886758, 110133294, 537906437, 537985067, 538017830, 538034651, 538067856, + 538099733, 46039066, 538116099, 520093780, 538135814, 538201351, 538312706, 99516454, 538329109, 46710786, 538348808, 538496265, 538545418, 538640819, 538675554, + 538722388, 538757307, 122044428, 538806171, 538870686, 538905867, 539118860, 539263785, 539296047, 539328552, 237731843, 539344912, 88948776, 428720165, 539361339, + 539394132, 539430157, 539526144, 539561230, 539623505, 539656249, 539672588, 122683418, 539692303, 539754550, 539790608, 539853817, 8391953, 539938066, 540000315, + 540036371, 27852838, 54296597, 540085524, 78479397, 540147771, 540180486, 540196916, 6766604, 540230479, 540262410, 442793996, 540279239, 50036778, 185319462, + 540331285, 540577046, 540721179, 540753958, 115163167, 540770363, 49938442, 540803522, 540835861, 540853172, 46352887, 540921111, 51380234, 5325665, 540968030, + 447840268, 541018040, 17842230, 541183256, 541229593, 541294644, 541330713, 541392898, 541409311, 428769318, 541426152, 541458574, 541492770, 76644355, 541543706, + 541655640, 541688744, 404029442, 17006607, 541721207, 541753370, 161808386, 541769793, 541819757, 541871387, 541950864, 541986076, 542048294, 154665435, 112476198, + 2162691, 542065099, 542115273, 258965514, 542182685, 542326815, 542343170, 121077770, 542359618, 5308634, 13074474, 542392779, 103940138, 124551187, 542441907, + 542474243, 298959695, 542493982, 542623471, 542687248, 120258579, 542705945, 542769233, 542801980, 542884873, 149160990, 542916627, 542933442, 542965791, 144048138, + 542982574, 543032310, 182157328, 543067423, 543179825, 543260703, 144179216, 366968858, 543277096, 543293478, 122568746, 400801900, 543313184, 543408159, 17006611, + 155648002, 543427873, 543473748, 543506470, 543522875, 543558946, 543637535, 543653898, 543673635, 543802229, 543834571, 121356309, 128155674, 543886628, 543982069, + 544014390, 544047144, 1900575, 112033801, 544476454, 544768060, 544853287, 150537053, 544899586, 544932299, 544981004, 150290458, 545000744, 545063957, 545112095, + 162250768, 545129295, 149930415, 545164585, 49905674, 545226790, 110120216, 545246506, 47251468, 545309730, 148733992, 545342268, 545390604, 545407068, 3833885, + 545439803, 545475096, 55132202, 545538272, 94601228, 545574187, 246136870, 545622734, 545738028, 1114150, 545833912, 545882626, 545918253, 545964068, 316899357, + 545983790, 546096940, 128581644, 546145192, 546180399, 546209828, 546226630, 546259247, 546291724, 546308111, 546324501, 546340895, 52609053, 546357355, 2408467, + 546390028, 546406421, 546424473, 546472039, 546557232, 546603014, 546619446, 432914463, 546653817, 546701328, 546718829, 546750476, 546766858, 546784124, 371277843, + 546835761, 547048754, 547127312, 6373478, 547147059, 440746022, 547258452, 547291152, 515653670, 547310900, 547454978, 547471370, 547487750, 56639510, 547506015, + 547569769, 547604041, 547687733, 6455322, 547782692, 547799056, 547815948, 114212866, 547848232, 547864614, 547880971, 547897360, 201572362, 547913750, 547930128, + 547946522, 547962882, 2801683, 547979266, 268435462, 547999030, 306676249, 233473023, 548064567, 84246546, 548307051, 548339765, 548372511, 226951225, 548389972, + 548438022, 147816454, 48021510, 548455837, 548504883, 124796970, 548556088, 514687014, 548621625, 180879423, 548851002, 548913236, 548945941, 548962344, 548978714, + 548995138, 3214173, 549028718, 150536297, 541753354, 549093414, 243516239, 549113147, 120258582, 549208498, 549244220, 549322778, 75464720, 549339630, 549373488, + 549408061, 549571902, 549670207, 164774775, 549800050, 549883200, 549945413, 549981505, 116375636, 550047042, 550210075, 23773323, 550260035, 550355003, 44171290, + 550388830, 127500304, 550440260, 550518851, 550601176, 2196571, 550666261, 114081814, 550686021, 550767851, 550833308, 116375611, 229461318, 550880763, 550930811, + 550977595, 5866408, 240582737, 551013703, 551079240, 551226697, 551371055, 19267622, 551404021, 176980436, 551439690, 130285599, 110247963, 551587147, 115523622, + 551747668, 151732262, 551780378, 551796782, 1785866, 551849292, 50184198, 551931213, 552127822, 110134493, 552288266, 552308047, 191644078, 552386570, 8392016, + 552406132, 552452108, 6193190, 552468546, 552502338, 552566794, 552583700, 552632544, 48054294, 2129958, 552665155, 552748970, 552815953, 552894495, 16826380, + 552911336, 552943713, 144982028, 296634142, 553010017, 553043609, 553091084, 13074468, 553107891, 553140255, 553156618, 553173295, 553207353, 553307474, 108315153, + 553536851, 553599019, 553635156, 553828398, 8391102, 553880917, 553946454, 554156074, 554172475, 177226716, 554207092, 554237993, 554254348, 554270746, 99893290, + 554288402, 554355457, 124862766, 291095487, 554401876, 150913062, 554434644, 18153510, 554470743, 132792358, 165494786, 554617885, 554663942, 465551419, 554681366, + 5308835, 554729494, 17154060, 87916575, 554749272, 554876930, 153714726, 2196591, 554893314, 45613094, 45727746, 554909742, 554959657, 554991626, 3538950, + 555011417, 555224410, 555270198, 19267594, 555306331, 108314729, 555437404, 2195648, 555502941, 555581482, 555597890, 192495626, 25561445, 192495622, 555631988, + 555679746, 555696170, 555712578, 555745739, 555794891, 555843594, 397266270, 555863391, 528187418, 555925514, 555943145, 555991511, 116376776, 556023874, 556056996, + 556090759, 393543692, 556125536, 556205086, 556237259, 556287612, 556338529, 556387682, 556483614, 556515787, 470535523, 556911973, 557105454, 557137922, 557154314, + 147013651, 557171121, 557204878, 557269018, 557285378, 133496842, 557302603, 280445399, 379256874, 557367355, 557401199, 557434326, 4980793, 557485414, 557550951, + 557613096, 544047132, 297386419, 557629499, 557662733, 122324359, 557711790, 557761695, 557793739, 557842516, 159449144, 557875216, 50118682, 557895016, 558039127, + 558088494, 2197040, 558124393, 558186555, 199458872, 240943531, 558222698, 558304619, 3244558, 558465040, 268468262, 558484844, 558598081, 558645294, 558694507, + 3261249, 558730605, 124862935, 558891089, 558923822, 558972959, 168722458, 558990951, 559040315, 25560155, 559087682, 559120477, 6733826, 559169995, 559218787, + 559251888, 559284250, 559304046, 122126909, 559369583, 559517040, 559646025, 559694990, 559743006, 559779185, 307610490, 559857723, 559893874, 126615578, 560057715, + 560120110, 560152597, 119996961, 560172404, 1982474, 387416935, 560316503, 560369013, 560414732, 195952671, 560431163, 560464303, 154042828, 560496652, 79757369, + 560516470, 560647543, 560709642, 560726446, 560775705, 125583389, 560842077, 560893304, 560991609, 561089914, 561168462, 561234457, 561301525, 561333979, 561365035, + 21102608, 561397819, 561431042, 322143140, 561466747, 561546152, 561578015, 353189972, 561596315, 561660441, 46088202, 530730364, 116376086, 561725506, 561761661, + 561938491, 56164362, 561971202, 154665905, 561987596, 107462658, 562004920, 562053162, 562070406, 562102331, 562135100, 562216981, 562233881, 562302334, 562367352, + 562417023, 562495519, 562511888, 254345273, 562528310, 125583417, 562561055, 176504842, 119817125, 562580864, 562627537, 536233482, 51675151, 308003249, 563023234, + 563200016, 218841126, 563219843, 563265572, 563281926, 128974859, 563298315, 24838172, 110231608, 563318148, 563462615, 563495763, 82001922, 563560458, 25559086, + 563578201, 563612722, 563676568, 563725288, 563773524, 563806234, 563823194, 48611368, 563858821, 241680424, 563953666, 563970155, 6947663, 564002859, 335446054, + 564035887, 564068373, 564084762, 564101136, 564117519, 564133910, 564150338, 564183056, 213958666, 564201955, 564232279, 564281366, 564301190, 25559139, 564396044, + 93978634, 564413016, 472203290, 564445268, 564481415, 564625430, 564643135, 118915078, 564707366, 564723714, 564740107, 175669279, 79757323, 564756496, 564772890, + 564789680, 564825480, 276906043, 564904395, 564953391, 564986870, 565022089, 565116959, 565133350, 392462374, 565149698, 212107304, 565166927, 565198911, 565231638, + 7734105, 283721820, 565251466, 565381637, 565430693, 223707146, 565480843, 565575706, 565592066, 151732262, 565611916, 133414922, 565706764, 565723162, 565739995, + 122667011, 565775757, 176521282, 565821471, 565838882, 565873793, 565920176, 565955982, 114393098, 566018075, 566054287, 566116439, 566165536, 566198315, 566231050, + 131334442, 566250896, 566362401, 566394932, 566428185, 566493195, 165134364, 566511716, 566562193, 73187344, 99500063, 52576268, 566676882, 566807516, 189513754, + 566853678, 566902868, 554270760, 566936312, 566970789, 567017531, 567051744, 567084062, 567116823, 567165012, 135184422, 567201171, 46088195, 567379668, 567427078, + 567443532, 2130378, 567479700, 141411278, 234307622, 567575580, 567607318, 567627157, 567725462, 567823767, 567869481, 351387686, 67059743, 567889304, 567984236, + 568016923, 568053145, 568118682, 568180762, 568197196, 568231006, 353239147, 568279342, 568312641, 568348059, 568413596, 568528285, 568655882, 232849410, 568673177, + 568803330, 568820226, 185319445, 568852492, 568868890, 8389472, 568885785, 445841434, 455442458, 568950820, 261193739, 568967227, 569003422, 569049147, 569081885, + 569098256, 82558982, 569118111, 305119291, 569278924, 569311298, 569345175, 138641843, 569396640, 133447699, 569510367, 569560481, 569638965, 94109715, 569675170, + 47710223, 17843041, 569770006, 569786460, 144605291, 569819624, 569855395, 570033054, 33243172, 570068388, 463028270, 86327336, 150569023, 570166693, 570245146, + 570261516, 8390685, 570279499, 570327124, 116228153, 52215834, 570359862, 6373590, 570396070, 570621975, 570638468, 2523142, 570658215, 44531749, 570687590, + 570720282, 2197708, 144146453, 570736652, 183369756, 570753559, 570789288, 21151755, 570818676, 570834966, 570854825, 570884132, 38879258, 570903978, 570998807, + 571015191, 571034025, 8388877, 571064459, 571097111, 1949722, 571097218, 571113513, 571129878, 99876885, 157646964, 571149739, 571313580, 571362250, 571395018, + 66816970, 82001932, 73531421, 571424770, 571441183, 1900580, 6620267, 571461037, 571752477, 2031673, 571768868, 19447819, 571788718, 53837958, 49938434, + 94846982, 571850789, 84836468, 571867146, 571887023, 571968698, 571998244, 148638121, 79937543, 572015603, 189464595, 572030986, 572047476, 572063763, 572080165, + 2031657, 572460465, 572523361, 121045013, 572556875, 572604953, 572673458, 572751878, 527155212, 572768781, 170344486, 181191592, 572820915, 153192767, 572932590, + 572964930, 572997642, 115015983, 573014109, 48545823, 573063206, 573083060, 136118318, 108314680, 573178765, 573262181, 437980597, 573309836, 573359906, 573390869, + 3342362, 573408286, 573440847, 573474093, 573523113, 573555448, 164020226, 573589365, 488243212, 573653295, 573685782, 573702186, 573720762, 6324266, 573751318, + 53706868, 573769331, 573833247, 573850114, 22478879, 573885878, 574080702, 574131639, 574229944, 574292427, 574341176, 251052119, 416628757, 574377401, 574423061, + 574439883, 574489769, 574524858, 574636034, 3867255, 574652418, 2326570, 5309581, 574672315, 56164390, 574819772, 574882890, 234176534, 574914582, 574930960, + 126287882, 574950845, 574996910, 575046107, 575078472, 575147454, 575209987, 298352652, 575262143, 9142290, 575340635, 575374324, 575422520, 575455291, 575491520, + 575635515, 1900660, 575668243, 61997068, 575688129, 575733762, 125927434, 50118658, 2801680, 575753666, 575799322, 575816572, 575864931, 575901123, 576048580, + 108315489, 576110618, 110119986, 576127083, 576162480, 576208922, 124862896, 576225311, 99516418, 576245189, 576357199, 576390662, 576438284, 576454880, 576487454, + 129237004, 576520952, 181174338, 576553020, 576635816, 576670596, 576736710, 576802076, 576867783, 131383323, 576962591, 5603340, 576982472, 577060904, 577077290, + 577093691, 264716396, 46891020, 3720113, 577126510, 577159600, 577191990, 108625958, 577228233, 150503426, 577277386, 308592739, 201523722, 577389069, 577437801, + 577471311, 577506763, 577568783, 577585168, 67043354, 577602015, 99385360, 27246623, 577634316, 218611733, 577650700, 115294224, 577670604, 577965517, 578062819, + 431996964, 578093565, 578143088, 47251472, 578191406, 475545626, 578242771, 578322434, 215187466, 578342350, 578536734, 578584614, 578600998, 531316779, 578617409, + 578667945, 5390351, 578699276, 578716170, 578748447, 115818538, 237731862, 578764816, 578781194, 578798000, 578830382, 116228099, 578879519, 578895878, 122601503, + 578915791, 578994198, 231817247, 579011019, 46039050, 579061305, 344064056, 152354858, 579158861, 579207178, 579224444, 518488104, 579272764, 556337293, 579355105, + 579403884, 579436598, 327909847, 579472848, 579551259, 579584010, 579603921, 579650206, 579682736, 579715991, 579764226, 579780629, 579797058, 579829766, 114917679, + 579849681, 579895377, 579928124, 580009994, 580026389, 179798068, 580046290, 580111827, 379404591, 580175405, 580226516, 580354857, 580386903, 8389153, 165494796, + 580439509, 580517972, 580550787, 216449279, 580568174, 580652502, 580747283, 202014732, 297484298, 580763670, 497336325, 580780065, 580829291, 102858774, 580861993, + 2752534, 580879731, 202031120, 580911563, 154665067, 22085658, 580963799, 581173783, 581206053, 17924124, 581222441, 37748738, 581238825, 103448586, 581258712, + 581304357, 423446334, 7700516, 581320745, 581337145, 581353513, 581369892, 580861990, 157646889, 580861964, 581389785, 27426828, 581468182, 17924137, 90521637, + 581484556, 581500950, 1949737, 581517362, 581553626, 581632022, 581500938, 581648425, 581664797, 581681268, 581697543, 142180388, 581713925, 581730332, 581746729, + 581763109, 581779484, 2129939, 581795881, 581812250, 80035862, 582172693, 582189077, 2539651, 582206278, 9207814, 582238808, 516833289, 153649162, 582651357, + 582749662, 582814977, 2359723, 582847565, 6865743, 582913503, 582995424, 121077800, 583041561, 583107139, 571441168, 258080778, 583142881, 583270637, 405454888, + 583306410, 583385100, 165134342, 583405026, 513278554, 583451083, 583503331, 170803627, 583548994, 8392164, 583585253, 583648778, 583698892, 415776799, 583745538, + 583762680, 583794699, 383664130, 583814630, 23856066, 583958566, 3227702, 583978471, 2195536, 155648002, 584060392, 8389985, 534020127, 584171579, 584204298, + 584220678, 228753430, 584237068, 584253466, 111607814, 584270949, 584319118, 584355305, 584450050, 584466470, 584482818, 3473445, 584499503, 584535530, 584581204, + 584613914, 131940373, 2670618, 584630274, 584646682, 584663061, 119359358, 584682987, 584863212, 584908812, 60456970, 584925239, 584990749, 249282576, 585007142, + 585023519, 197345301, 585039926, 585076205, 585138606, 585190894, 585269264, 461684776, 585289199, 585354736, 132808723, 585433098, 585449892, 124272706, 180060631, + 585482252, 585498706, 585534961, 585584114, 147013668, 585633267, 585829876, 585908250, 585928181, 586023215, 586056908, 586105750, 152945156, 7733719, 586154744, + 586186764, 125812752, 586204190, 586235942, 586252319, 586268688, 586285066, 56639490, 586301499, 519667722, 586337782, 586419703, 586582539, 2129962, 586662753, + 586694666, 586714616, 164757807, 586794483, 586829305, 587042298, 587091451, 587156988, 587251750, 587268150, 587300890, 587317254, 587337213, 110231789, 587369982, + 587547384, 587579926, 587612232, 587681279, 587776040, 4964367, 587792424, 45875237, 587808780, 587825189, 587842030, 587874314, 120078346, 587890690, 587907077, + 587923458, 587939850, 587956266, 2621468, 587976192, 188583425, 588025346, 588189187, 108167184, 44171274, 588382230, 253625167, 2196649, 588398652, 588483077, + 588533252, 588611786, 55033893, 588645404, 588680709, 136120806, 588811782, 588873730, 588890589, 588922891, 43237414, 588942855, 589004838, 1933324, 589022182, + 589057544, 589137589, 7290902, 589205001, 589430810, 589447194, 141410388, 589463564, 589479974, 49774594, 589499914, 589562901, 589611024, 362659850, 589627851, + 589676575, 589692938, 119357874, 181257806, 2196135, 589709396, 589745675, 589860364, 589906387, 589955153, 589987948, 590020629, 590037004, 192200719, 590056973, + 590384654, 590462997, 590479372, 590495770, 590512603, 590545808, 590578607, 590643230, 590675999, 224542751, 590692368, 590708746, 590726153, 590757900, 590777809, + 590823440, 5865761, 590840655, 590872586, 22216714, 590891348, 590954517, 260964406, 590970890, 590987363, 591020034, 61997096, 591037759, 591104694, 591167490, + 93700134, 591187471, 591282197, 4997172, 591299497, 263176194, 591347818, 591433232, 591560760, 591597073, 47611920, 591757396, 591793682, 313131024, 115721079, + 591987535, 592020660, 592072211, 70058197, 592314389, 592330773, 592347195, 592383508, 235438927, 592446347, 144621599, 136118794, 592512169, 592547349, 422691250, + 592627060, 592674882, 592707594, 49086485, 592725382, 592789516, 2198785, 592809400, 592871946, 592907798, 592987075, 593035323, 6621205, 3899869, 593068068, + 94896139, 593084475, 8390154, 593117212, 47611933, 593137175, 593268248, 593365133, 170999892, 593412633, 593477642, 6127647, 271630389, 119357879, 593494475, + 593544113, 2130953, 593576479, 593628697, 593855597, 49086474, 593887701, 593936424, 593956378, 351158298, 22216744, 80035852, 195264528, 594034747, 451772470, + 345686021, 594067562, 594150960, 594182160, 594198544, 594214931, 6602774, 424017936, 594234907, 594300444, 311607311, 594395162, 594412693, 81166348, 594447901, + 256032794, 594658379, 594723491, 594772009, 594788364, 1949736, 594804824, 594837541, 17006630, 126959635, 594853894, 27852812, 594870575, 374194216, 594903499, + 163315820, 594952202, 209813535, 594969113, 595036427, 147063977, 595084073, 595119646, 2195495, 595185183, 595263528, 595279878, 45465621, 595299872, 115294324, + 595742242, 595887593, 17220906, 595938851, 132156964, 596069925, 596148246, 55033877, 51380260, 596164634, 596181051, 41566214, 596217382, 596296713, 596332071, + 596510465, 596559653, 596607032, 453283368, 417103888, 182272841, 596643369, 2196056, 596839978, 596905515, 420365153, 597016588, 597032962, 597049804, 597084755, + 597151276, 597298733, 54444058, 456425474, 597345920, 147423254, 564314124, 3228566, 597397038, 597458949, 597475359, 71483421, 597491771, 131842854, 182289190, + 597528111, 597574126, 597610032, 597753912, 597786690, 597819860, 597852172, 122601498, 152946054, 597869015, 597902230, 597951335, 597986865, 598147126, 185417738, + 598179842, 598196252, 598212639, 242466826, 598232626, 598329903, 122454018, 598392853, 115114083, 598410214, 598442478, 47611911, 598474764, 598491162, 598507522, + 598523919, 598541250, 46219304, 598576691, 598674996, 198328358, 2130008, 441466918, 598756917, 598802444, 3244130, 598818904, 300400650, 598851665, 598884354, + 193675340, 598904374, 598949904, 160759837, 58409026, 598969911, 2130346, 599015899, 599048232, 599064588, 599081059, 599117368, 599395897, 599457823, 599474195, + 45039638, 192938000, 599494202, 599576123, 599605706, 42369081, 599641660, 404242911, 52805634, 109215780, 599752810, 421855753, 599838269, 82558997, 599903806, + 599998480, 42369050, 600014885, 491208770, 600032150, 6946933, 600081417, 600116799, 600181358, 600227868, 600244699, 600277094, 117506114, 600309826, 600342566, + 8392256, 600362561, 600540363, 345784332, 520093782, 600575554, 600653870, 600703577, 600739395, 600899586, 600916439, 600952388, 601030666, 2195876, 601047351, + 601099845, 601260072, 211173397, 601280070, 57032742, 135184415, 182288816, 3555364, 601391541, 601427527, 601523221, 54460447, 601574984, 475873361, 601653675, + 3244467, 601686103, 163315936, 601736222, 601771593, 8159347, 34701707, 601968202, 602062850, 602079251, 19251802, 474399753, 602097273, 602144778, 602161162, + 20365324, 602177552, 602193948, 602210314, 2261021, 602226748, 602312267, 602377804, 299794458, 602423298, 189038607, 602439711, 602456070, 286277674, 602475676, + 602521702, 602554397, 159432709, 602574413, 207621710, 603016784, 603180625, 603228142, 603275285, 121339925, 603292185, 218611722, 603358318, 603440520, 603472926, + 194166822, 603505494, 603553798, 156925971, 146358278, 603570178, 153944090, 603587588, 603655762, 603770451, 603848720, 603868756, 132153390, 604012628, 933897, + 604045849, 111132698, 604111301, 604147285, 604278358, 47546380, 604340240, 604356619, 56262687, 604372994, 150241320, 604389483, 604425815, 604586015, 604602378, + 604618794, 11665539, 604638808, 604749845, 75530271, 604766254, 604815371, 604831772, 547684354, 4653495, 604851801, 605015642, 605143042, 605159455, 605175818, + 605192626, 605227327, 605257820, 605294171, 605388812, 50937875, 605405639, 605454338, 605470742, 257638440, 605490780, 605556317, 605749485, 605782305, 203817960, + 605818462, 605945922, 85098498, 605981526, 606027842, 137101991, 606060556, 606080607, 606146144, 131827474, 606224452, 606276302, 220663332, 606391905, 1228816, + 606470198, 111624218, 606506594, 606587848, 606651690, 170886007, 606699823, 606733342, 606768739, 606814218, 604274691, 606834276, 607096421, 252117008, 607207440, + 125812741, 607224408, 263503903, 607256597, 607272972, 607289346, 15007786, 607309414, 607339039, 47611910, 607391335, 607454764, 607485974, 246546474, 607502967, + 607536044, 108315058, 607604328, 607666192, 607682597, 607698960, 2850827, 44613669, 607719017, 607833706, 607882859, 54296598, 608043308, 608075841, 135184394, + 608126613, 608194156, 608257501, 608292461, 608339731, 608387112, 608403487, 608419861, 608436654, 608489070, 608603759, 608698484, 608714764, 608731148, 2162745, + 111149068, 608751216, 608796756, 50135062, 608830667, 608862290, 608894978, 608911379, 608927765, 608944975, 116883888, 608980593, 2146414, 476921956, 609190775, + 270516234, 609222710, 609257997, 207228530, 609308275, 46530586, 609421331, 609468719, 609501293, 609533992, 150241306, 609551929, 609652340, 609697794, 609714186, + 2113652, 609731031, 609767029, 286277674, 609812564, 609845348, 609878075, 609910889, 609943582, 609977756, 610025498, 2834656, 44351504, 610041901, 610074753, + 610108405, 610173466, 456966180, 610205724, 610222681, 610254878, 610289633, 610337198, 610388109, 610435131, 610471542, 610517030, 146817060, 610533392, 122650650, + 610551155, 3129380, 149815298, 610582557, 295649283, 610599825, 610648102, 610664751, 610697745, 610729996, 610746406, 610762806, 421773317, 610799223, 126287893, + 611156815, 611192440, 611304755, 611353382, 611385346, 611401749, 235552780, 611421817, 204488735, 204537882, 150913055, 3473444, 611503738, 611581954, 51822630, + 611598811, 611634811, 243777538, 2506764, 611680266, 611697070, 611746684, 611795858, 6455334, 611844696, 611876874, 13549597, 611896956, 612008431, 612042953, + 612106261, 135004172, 612123055, 612155404, 612171875, 612204560, 612220938, 612237341, 44531724, 612257405, 226967618, 612372094, 612433946, 612451151, 44679199, + 120114275, 612485897, 612532246, 1114128, 612549526, 140247139, 612601471, 168902747, 612696982, 612746071, 288997407, 612778027, 612814464, 126287910, 612961921, + 613023786, 613040154, 613056514, 613072911, 613089302, 613106582, 613157364, 613207682, 50086315, 613253174, 599932939, 613289603, 613367827, 124796931, 2195745, + 613387908, 613515286, 613531691, 6406154, 613565449, 613598293, 613629954, 234176527, 613646338, 192200714, 613666437, 613777418, 613793844, 613827039, 613859338, + 196149270, 613879430, 613990428, 614006786, 614023174, 614039555, 19447827, 614057061, 194084885, 614105312, 614141575, 614600328, 614682249, 27738242, 614793976, + 27852816, 4112400, 614826050, 117506114, 614860105, 47546405, 614911626, 615124619, 615219212, 615235622, 615251983, 192495638, 615268374, 370573352, 615288460, + 615370381, 613305998, 615468687, 615564457, 615599760, 615697862, 615762051, 615825410, 2129977, 615842699, 615907394, 615940098, 615957729, 616007396, 616074897, + 616202256, 616218664, 7290918, 616235678, 616267788, 616284920, 191545350, 7290906, 616316944, 216858666, 616334508, 616382476, 616399608, 616432011, 156827702, + 155533314, 616467760, 616514073, 616579128, 616611927, 616664722, 616710186, 616726554, 616742914, 616759311, 210583574, 525553299, 616779412, 616825290, 616857626, + 616874015, 122568733, 616890378, 616906754, 393494539, 47710230, 616923152, 135397387, 616939607, 616989106, 617025173, 617088510, 575701018, 617152528, 617168938, + 617185712, 564838833, 617218104, 617251250, 48447507, 617283590, 617303702, 617366558, 617398293, 617414678, 617431052, 10829835, 617447430, 3342357, 617463810, + 617480202, 617496592, 292962309, 232030230, 617516695, 474399665, 617860760, 617926297, 617988587, 618024602, 296698889, 618172059, 618233887, 131875495, 618251691, + 4407599, 618303132, 30392341, 618383292, 618466973, 618512400, 618528778, 618545194, 223608869, 312180757, 618565278, 618660776, 618692613, 94568450, 618712735, + 198410262, 618807825, 618840086, 126025740, 618860192, 117555237, 618922024, 618938399, 571801606, 618958497, 6374603, 619036694, 619056802, 619200571, 619233306, + 373604381, 135905346, 619249692, 619266088, 121077766, 619283435, 55033871, 619347970, 2933231, 619364354, 362037258, 619380767, 375406630, 619397423, 15073318, + 619429900, 113737754, 619447326, 619481776, 402309125, 619876004, 620068904, 47939610, 253935635, 620085549, 620118042, 366116893, 620134481, 620167183, 620183855, + 397852682, 620220069, 620282357, 164020236, 620314861, 620347500, 620380920, 620413231, 620449446, 620511334, 620544031, 46039061, 111149096, 620560430, 508362768, + 620609538, 166838298, 620629671, 620757018, 620773386, 620789772, 141295637, 620806237, 620855334, 620874665, 620924584, 621037849, 621101515, 621153047, 621215770, + 621232182, 621264980, 218611738, 621298718, 621330525, 621383310, 621432489, 621481642, 621543440, 287572075, 621559915, 621592607, 621608991, 224591913, 5308719, + 621629099, 621690911, 10584093, 621711020, 621821974, 79069186, 621838352, 621855667, 621891245, 621936680, 621953036, 46088234, 621973166, 622084108, 204996611, + 622104239, 622166070, 30392358, 622199239, 308903972, 622250157, 622313511, 622346347, 622380470, 622428181, 126287893, 175767636, 622448304, 622542858, 122323831, + 358498983, 622562993, 622624850, 269664315, 622657566, 50937882, 622691229, 622775986, 622887363, 16826384, 622919736, 622953641, 312770647, 622985282, 623019119, + 164020240, 307986539, 623054515, 623247827, 623300276, 45023248, 623362058, 623378442, 623394818, 623411221, 7733324, 4964373, 623431349, 623509534, 623542324, + 623578806, 623660727, 182157343, 623738882, 623759032, 623804435, 623820816, 137102456, 623838459, 231768076, 623886378, 623902746, 623919106, 623935503, 623951894, + 528270230, 623968315, 139034708, 624001064, 624017446, 624033794, 6373458, 624050260, 624082946, 624099781, 176570384, 358514709, 624132136, 624148539, 624184157, + 73531408, 624215320, 7307301, 624283321, 389136465, 624398010, 624508940, 624525338, 624541920, 624574476, 2326535, 624590886, 624607534, 624640847, 173113354, + 624673615, 359530498, 624709307, 624856764, 624905917, 624984503, 146767910, 625016898, 8390595, 625053374, 625115157, 625135295, 625197140, 625229906, 625266368, + 625360927, 123797510, 625377361, 625410074, 625426444, 625442826, 625459831, 625491970, 625508409, 625524767, 112476202, 268468240, 625541751, 625573914, 138346527, + 625590331, 625623050, 625640055, 625672204, 625688586, 625704981, 625721410, 625757889, 333348883, 625823426, 191004974, 625918383, 625954499, 625999882, 262275091, + 626020036, 626180856, 49774607, 626212880, 626233029, 626278454, 626311180, 626327650, 203128848, 626360358, 44679170, 626377666, 112754726, 626413254, 626475034, + 626491823, 626524179, 626540560, 122568742, 626560711, 626708168, 183582722, 626773705, 626868250, 59228176, 626884620, 626901002, 605192291, 626917448, 144097336, + 438044205, 626983945, 627015682, 627032093, 627048514, 627085002, 451772653, 627179539, 215859202, 627199691, 627311262, 307855386, 627347148, 627425388, 627461837, + 627527374, 627625679, 627707334, 123846715, 123847115, 627769403, 627803561, 627834892, 241647635, 162250790, 627855056, 627998748, 7634963, 628015125, 628032567, + 628064287, 628080661, 628097060, 628113427, 628129802, 38879261, 628146292, 628162586, 628181196, 628214159, 628244509, 17924117, 628264657, 628310047, 44597274, + 628326407, 96190500, 628342900, 267681829, 628359196, 628375561, 31342615, 628391986, 628424711, 628441114, 2196238, 628461266, 628506627, 628523018, 33177615, + 628539501, 628572246, 581206042, 628604964, 628621847, 79937572, 203653219, 629178433, 242696245, 629228649, 629276924, 629309442, 629325834, 629342218, 629358594, + 629374986, 114130950, 629393499, 629457199, 141000710, 547684394, 629490185, 79757318, 629524799, 629558997, 46710796, 629640918, 256819216, 629703563, 629771991, + 629833812, 248266788, 6455334, 629870296, 629965762, 629998460, 3227680, 29491256, 87539734, 630050521, 630197080, 630243340, 630259718, 630276117, 630292511, + 124239882, 630309339, 630341651, 146653186, 2031618, 630358047, 279855123, 2131182, 630378202, 630456322, 630472733, 2408477, 630492891, 630673116, 630755037, + 630801212, 630853342, 6373802, 630981040, 631013809, 631046604, 123404309, 133578791, 631082719, 631128090, 631144464, 631160843, 543408164, 631181024, 631259148, + 115785738, 631279329, 631361250, 631492323, 8388676, 631623396, 631702757, 631783856, 631816625, 631849874, 307511312, 631901925, 631980044, 631996523, 632031715, + 632065766, 632143894, 584597516, 632160322, 396577253, 632195538, 45613078, 632278759, 632377064, 140477249, 632438810, 632455184, 632471567, 632487958, 632504336, + 213958684, 632520770, 632557289, 493092895, 632622826, 457770355, 632686428, 632753899, 632897585, 632980816, 633028624, 607617889, 633045018, 2196825, 633061460, + 633094228, 633126928, 633143598, 633176118, 136118379, 633212652, 633491181, 633605870, 412959634, 633716802, 633753327, 233193474, 2196403, 633979339, 634031856, + 634109989, 634127390, 634162929, 634257430, 634273808, 634290202, 7389199, 634309190, 634342365, 634390702, 195838008, 634470410, 634490610, 634553238, 634602364, + 130285578, 634650711, 634702091, 7733472, 634748938, 140247479, 634769042, 634814523, 48447498, 634847242, 634867443, 385515574, 634932980, 175669260, 635060226, + 150700053, 635077706, 635113205, 635240454, 3833877, 635256851, 635275026, 118636582, 635323881, 635372034, 635405132, 635454952, 635506422, 176570370, 635601950, + 635633730, 5865577, 635670263, 635912429, 635945451, 635978690, 636011727, 636076088, 636108821, 636129016, 636174342, 636190732, 6209562, 636210937, 636260090, + 452034576, 99696646, 636371956, 636423931, 636469335, 616120358, 636522236, 636604157, 636715030, 357466178, 636735099, 636784382, 636878955, 79822863, 636911626, + 636928042, 636944390, 54820875, 636960787, 636978072, 637027196, 637075563, 637108252, 6406156, 637124618, 637141886, 637173779, 47529986, 637191629, 147423242, + 637226751, 637272523, 637321226, 319143978, 637338079, 637374208, 637485068, 249266202, 637501466, 129958191, 149930050, 637518086, 637554433, 637927953, 539656220, + 637960683, 637996802, 394379266, 638108495, 188940314, 638144259, 638190712, 73531433, 638226180, 638271494, 638287893, 638304268, 247234586, 638324485, 250185306, + 638435387, 638468115, 638484490, 217808912, 423448326, 638501335, 175783995, 638534246, 638566859, 280445399, 638619367, 638717703, 638861369, 299008006, 638877783, + 638926878, 598949919, 638963464, 639042428, 639091836, 49774630, 639143689, 639225610, 639336470, 639352913, 639386027, 109052046, 639422219, 639467586, 639502708, + 639567162, 93700108, 639618828, 635977827, 639700749, 547962911, 639799054, 640028431, 129466370, 640155660, 52396042, 640173508, 369098818, 640206459, 640270402, + 640304202, 301418718, 640339728, 42598459, 112919490, 640418790, 136511500, 640454417, 640518495, 640565274, 640583439, 640634642, 640745531, 640780759, 640827438, + 640876556, 640892939, 640909322, 640925708, 457539590, 640945939, 641105930, 7307279, 641122306, 641138698, 8994858, 641155606, 641187861, 641204281, 9535504, + 154812887, 641220738, 641237034, 289243178, 641257236, 641449993, 38879233, 641467914, 307134485, 641519381, 641601302, 641630323, 641646724, 641663111, 641679369, + 58982409, 17924102, 641695772, 514654227, 572047388, 641715991, 641763115, 641797912, 641826826, 53706773, 641844463, 30461353, 423034996, 641875997, 641892354, + 641908762, 641925151, 551796738, 641941561, 641957929, 641974282, 641990772, 642007077, 7307380, 642027289, 642105385, 642122160, 151912564, 642154525, 377619214, + 2179091, 642646153, 57032836, 642666267, 642859030, 642879260, 643006504, 547291167, 582829370, 643025295, 47284264, 277856296, 643055656, 52215839, 643075869, + 643186714, 643203088, 643219472, 301252645, 643235846, 643252243, 643268674, 155861023, 643301432, 5324832, 643334583, 643366924, 266766853, 643383723, 643419934, + 6406184, 643518239, 193855927, 282838025, 120602629, 643629058, 44908575, 643645461, 643661846, 638304272, 643679121, 643731232, 643927841, 557514778, 644009762, + 3227730, 644087820, 644108067, 178339861, 644189929, 644252129, 644303536, 644349964, 332480619, 644370212, 218841117, 644432331, 644484901, 563298316, 644632358, + 644779815, 644825104, 172703782, 644841488, 362037288, 644858286, 644908201, 644940842, 645038108, 645054466, 645070859, 19267612, 645090476, 645169164, 2523174, + 645186007, 645222030, 168935446, 179765260, 645268469, 645336872, 645631785, 645693442, 45465611, 144048144, 310558746, 645712937, 645779242, 645840927, 645857814, + 482590742, 645890064, 645906460, 50266140, 645922903, 645972028, 646055283, 646088052, 646136109, 646168616, 646184979, 612319269, 197722114, 646205227, 416284885, + 499269716, 646398036, 646430796, 646463725, 646496686, 646545492, 646578179, 125583363, 646598444, 646776296, 646827821, 454968232, 647054835, 519815183, 647086082, + 647102935, 647135234, 250937355, 647151628, 647168010, 84738077, 647186237, 20365341, 392921110, 145473552, 647237422, 647348290, 647384879, 647413925, 647561648, + 647593996, 519143434, 647610383, 354549776, 647626818, 461963266, 647663408, 23363852, 647745329, 647889373, 647921683, 647938050, 647954453, 647970847, 647987216, + 241827850, 648003625, 648019999, 648036371, 120094751, 648056626, 648102818, 45498404, 648134953, 648167490, 6602755, 648200208, 648216614, 115589160, 648233448, + 648265734, 648282133, 648298562, 128254466, 648331276, 648347658, 66273286, 648367923, 648466228, 648548149, 648630070, 2195564, 648693108, 2031654, 648742690, + 648774465, 648806410, 479100957, 648822843, 648855562, 648871955, 619266060, 648892215, 649052236, 649085972, 649134507, 649167755, 649232390, 6029334, 649248795, + 545030252, 209010754, 649281966, 199459447, 649330805, 649363487, 136659829, 5177355, 87539717, 649383736, 649498425, 649576479, 649592853, 649609519, 649645599, + 318423475, 649723916, 649740298, 473547383, 649756703, 649773941, 649809722, 649858875, 116375776, 649922322, 649973564, 129417257, 650085244, 650133532, 650150030, + 47710229, 650186557, 650264607, 650280989, 650297410, 650330180, 650379895, 2195510, 650412269, 650444802, 650461194, 121077802, 650479080, 650530622, 119358402, + 651005760, 651265226, 353239094, 651313236, 142835722, 651345946, 651362306, 651378698, 648871955, 651395103, 651411472, 354074681, 651431686, 651477423, 49938472, + 651509762, 237731866, 651530049, 651595309, 55132170, 651640863, 651658249, 651690221, 651722795, 651759426, 651804764, 124796938, 651837532, 361168936, 651873629, + 176784215, 651954019, 652020925, 652067275, 4653155, 306774450, 652116052, 129417222, 652152643, 652345420, 143933470, 652382020, 652443698, 270385211, 652480325, + 652705934, 652738576, 652754960, 27852837, 652771796, 652804905, 119816276, 652836910, 131334196, 652886031, 652903624, 652935184, 553156634, 652951855, 652988230, + 164184353, 653067665, 2605068, 653135687, 6373432, 653197314, 49086467, 653217608, 653365065, 653443084, 126763245, 653460961, 653578058, 653754384, 653770778, + 653787138, 653803541, 653819991, 653870048, 241238028, 653918214, 653934658, 653968286, 654004043, 654082114, 654115338, 654147586, 654164006, 213205023, 654184268, + 267567146, 654344213, 654364304, 47530012, 654462797, 654524482, 654558616, 654606402, 654640125, 654704650, 654721030, 654737439, 654753821, 654770188, 56442906, + 654786625, 654836193, 654885751, 8389067, 654921550, 655052623, 633716802, 139657242, 56492034, 655101776, 1949698, 655199953, 45531152, 655249233, 655313530, + 655363922, 251396125, 655507496, 655524272, 655556651, 655589414, 655605787, 655639483, 655704109, 655736891, 655770922, 655818811, 655851579, 655888211, 656031981, + 137102257, 34553868, 656068436, 656114201, 656180857, 656232277, 589692966, 656362888, 656441449, 656474587, 656506913, 656556491, 656605243, 250937373, 656637958, + 55427091, 45434750, 656658262, 656769056, 656801868, 656836140, 656868170, 116375978, 656916955, 1114123, 656950188, 657014810, 657035095, 657129931, 657179057, + 19841045, 42434581, 657211432, 657228277, 657264472, 3538966, 657326082, 657342474, 657362777, 657375443, 657440777, 902390, 657458422, 657473557, 657490157, + 657522714, 94109706, 79938806, 657543002, 14450818, 657670447, 115721137, 16728195, 657706843, 112427034, 657805148, 657850417, 657932395, 657968989, 19267594, + 658014246, 179765286, 658031499, 658096587, 115785754, 153748510, 361432002, 658145326, 658526047, 658620925, 47546390, 658669614, 658722656, 658833632, 658870113, + 658948105, 658964617, 23838855, 658982639, 659046410, 659066722, 659128341, 659145551, 659177498, 659193887, 129958490, 113737744, 659210246, 659226645, 659243095, + 659293184, 659324930, 659341318, 20365333, 2129950, 659361635, 659603496, 2195574, 659620272, 659653527, 154665431, 659704320, 659754852, 659816479, 5865556, + 659833657, 659898383, 659914767, 5750786, 659931594, 659963930, 659980309, 659997610, 660078594, 163856415, 660098917, 660242718, 660291600, 660307984, 660324389, + 2179511, 67059714, 660344678, 660410215, 126025759, 660488238, 139034732, 660537404, 660621973, 660668445, 660688744, 660819817, 660885354, 660963344, 660979738, + 660996098, 661012501, 270319682, 661031416, 661094466, 661128075, 661193239, 661226319, 136790042, 661258283, 52723738, 661291915, 661356626, 121798743, 661393259, + 661438530, 661471234, 661487654, 661505368, 661554064, 576802668, 477904924, 661589869, 661654446, 661717295, 661749786, 661767192, 661815312, 661831690, 442745724, + 661852014, 661917551, 661979596, 662014093, 662062399, 662130544, 662179697, 194691171, 662274060, 662290434, 6324262, 662306872, 662340043, 662392690, 662441843, + 662536194, 662553038, 662601815, 116375602, 662652233, 662700491, 662749205, 662766415, 662798402, 662835060, 662915261, 662978591, 371277853, 662998901, 663162742, + 663322645, 663342967, 663454366, 663486474, 372244910, 663503715, 663552046, 663601162, 190136326, 109101212, 663620539, 663699991, 663732251, 663765839, 124239929, + 663798231, 663830534, 663847815, 663896080, 663912458, 6946818, 663929641, 229359647, 663963178, 664043625, 664076727, 664109058, 664125461, 664141911, 27607066, + 664191042, 664223812, 664273527, 664306582, 664354872, 664388431, 270189429, 664421865, 664469963, 124796940, 664519539, 664601026, 664633354, 664650858, 664735608, + 664797196, 664813578, 664829973, 664847243, 664911954, 399147440, 664944706, 664978295, 665014137, 665092399, 665124876, 665141258, 493125653, 665157653, 161988620, + 665175265, 665223222, 665259898, 665321528, 665354327, 665404257, 665436226, 665469015, 665519305, 665567244, 665583626, 665600439, 665632799, 665653115, 191545373, + 665698310, 665714775, 665767757, 128155654, 665829387, 665485343, 665846647, 665878566, 241647628, 665895004, 437370896, 665929226, 665976838, 665994063, 665666421, + 666026010, 639500720, 666042427, 3375130, 666075595, 666126118, 150700048, 666173471, 132890640, 666191122, 666256617, 666305424, 666337739, 666386461, 663601164, + 666403447, 666435638, 2719750, 666468823, 666501579, 666550781, 666599426, 666615827, 420593695, 667012989, 1933334, 202622343, 140247121, 667205647, 397852698, + 4997641, 180125738, 667225982, 667357055, 2752514, 667418636, 667436062, 667471744, 667598886, 667616075, 667684737, 667730379, 667779093, 667795482, 667812143, + 667844629, 667861079, 667911185, 667961632, 668008450, 668024870, 668041243, 668074896, 668106808, 668143490, 668254220, 668270620, 668286992, 7602216, 125583370, + 668303366, 668319775, 668336144, 668352522, 668368935, 668402473, 668434862, 124862903, 668483670, 668516354, 27624233, 668535168, 668598379, 150585827, 668631071, + 668647508, 668680274, 668713807, 668745771, 668778935, 649363487, 668815235, 668893215, 668909589, 408600578, 668925981, 668942795, 114786360, 668991514, 126287878, + 669007884, 669024277, 669040706, 669076310, 669122659, 669155394, 669188610, 669221495, 124321798, 669257604, 669368858, 669405061, 669483944, 123830282, 669515782, + 669532619, 669581333, 453476418, 669597715, 669614092, 669630474, 48021533, 669650822, 669746042, 669794320, 669810698, 669827979, 669894347, 669990924, 670008329, + 670040539, 670072842, 264798239, 121454658, 444580274, 670089237, 123273247, 670107022, 266768263, 291111383, 670175112, 670220776, 670253981, 670335968, 670388105, + 184863206, 119359974, 424017941, 670531586, 124864362, 670548002, 670666634, 670715787, 670793749, 670810143, 670826512, 670842890, 670859316, 670892044, 670908442, + 670924802, 670941815, 45433264, 670977932, 671039498, 338264083, 671055878, 671072343, 671125389, 671220171, 671268874, 151732245, 671285316, 671335031, 671367195, + 671399938, 567984166, 671416360, 671432730, 671449547, 671498775, 586186783, 671531019, 671548299, 671612949, 671630159, 671662099, 188481538, 671678919, 671728099, + 195215379, 671764366, 671809586, 671843211, 671908321, 260014111, 671957535, 672006190, 672055317, 672071692, 672088090, 540753930, 672104458, 672120853, 672138123, + 671940629, 672203186, 672235551, 672251947, 672284738, 672318305, 672354191, 672466218, 672514114, 672547105, 371277862, 672579605, 672596034, 672628790, 672661515, + 672677900, 672694298, 669532162, 111656998, 672711669, 672776213, 672793053, 672825382, 672841730, 672858133, 672874583, 672924513, 672960400, 673005570, 673022008, + 673054786, 673088353, 673120266, 673136679, 249298982, 673169843, 673206161, 673267728, 234848266, 673288082, 287572271, 673382412, 569360410, 673398822, 538116127, + 673415702, 477937670, 673448468, 673497107, 673513493, 673529896, 673546266, 236355643, 673562655, 673579018, 6619563, 673598165, 673644546, 673663044, 673710711, + 673742869, 673759263, 673776501, 673808843, 673861523, 8392596, 673939522, 673972255, 4342243, 673988714, 674072726, 133547353, 674120126, 6127644, 674189205, + 674303894, 2834464, 462159914, 674385815, 119440883, 674562069, 674580404, 149504029, 674664344, 543850562, 674728422, 674759172, 674811801, 674910106, 675004458, + 134104264, 675021103, 675057563, 675135494, 675151878, 675168268, 54493224, 184388096, 311214475, 675184699, 675221404, 675315728, 675332111, 675348502, 675364895, + 224739366, 675383808, 220776114, 675430440, 675446850, 675479651, 121799520, 675512326, 675528725, 675545090, 675561501, 142852112, 675578895, 675631005, 8605598, + 8392607, 675696544, 675840093, 675889194, 675905576, 675921951, 121929738, 675939113, 675971126, 676003850, 676020855, 676053023, 675987472, 548438056, 676069407, + 676085775, 676102165, 562250620, 676122529, 676233269, 676265986, 676282389, 676298839, 676347925, 663765023, 676364512, 264421977, 676397948, 512720906, 676446248, + 676462604, 676478986, 676495991, 676528155, 676560953, 676577739, 676626488, 676660047, 676692873, 122503180, 676741929, 676774936, 676823572, 676874349, 676921410, + 676954138, 676971403, 677036567, 677069854, 677101599, 170704950, 677117973, 677135200, 677200386, 677233271, 677265501, 677318562, 677396597, 677429762, 2196136, + 677462018, 677478410, 677495415, 677527573, 677544411, 677577757, 677625922, 677658643, 677675039, 128991273, 677692406, 677724200, 190595088, 677741003, 677790327, + 677822480, 139329562, 677838945, 677905310, 677938675, 677973746, 163726230, 678037065, 678118429, 678166615, 678215719, 678249208, 147505190, 122667018, 678282787, + 678330408, 678347596, 678395914, 678412919, 678445122, 678478816, 678526986, 678543399, 678576166, 678592539, 654557408, 678625735, 678674463, 678690826, 678708215, + 678772755, 678789141, 678805591, 678855089, 678887445, 678904672, 678973261, 679034946, 679068171, 462734421, 679118382, 199458898, 679166890, 679247928, 679284643, + 679363474, 631734747, 679413332, 679514020, 679624725, 679641998, 679706655, 679723024, 7734081, 679739402, 679756619, 679821343, 679837706, 679854082, 679870520, + 679907237, 680017935, 680037675, 680083458, 228491285, 680099866, 680116226, 680136614, 680181772, 680198228, 154714152, 680230988, 680263712, 680297477, 518307982, + 680378592, 680411157, 5079517, 680428889, 198754541, 680464295, 680542218, 680559889, 680607783, 678363148, 680640572, 680722913, 680775592, 680869890, 117424166, + 680886328, 680919106, 217923600, 680952345, 681021353, 681181186, 681198039, 681230342, 2850832, 681247147, 681279503, 681295893, 681312287, 449397621, 681332650, + 681413881, 681459743, 681476115, 681492501, 681509728, 681574507, 681607197, 681623583, 681639955, 681656322, 681672725, 681689154, 681722145, 3424277, 681755479, + 46891018, 681788745, 175784872, 681836971, 261981052, 681869371, 681902106, 51855391, 681918474, 681935275, 681968723, 682034232, 682102699, 682164264, 682180629, + 682197079, 229654554, 682247275, 682282924, 682361291, 682409996, 682426394, 682442758, 682459568, 682491963, 682524710, 682541083, 114294790, 682575146, 250396701, + 122667036, 682623036, 682704923, 682737676, 682754054, 682770451, 682786882, 682823597, 682902350, 682968073, 682999818, 683016823, 683052974, 683118511, 683180098, + 114769988, 683213337, 683278392, 683311135, 683327504, 683343882, 683360295, 289767462, 683393916, 683443102, 683474971, 683508637, 683591163, 683638805, 683656060, + 683704339, 229113922, 683724720, 138625064, 683786278, 683802630, 672890911, 683822773, 683901961, 683933755, 357285926, 229965835, 683970481, 449609750, 684213186, + 684245051, 684281778, 684444208, 266766796, 684491715, 684543923, 684605482, 345704143, 684625844, 684691381, 416284885, 2196029, 685033008, 685064675, 685098040, + 685162785, 320127042, 685195501, 685232054, 685294023, 45252634, 685346743, 685408340, 685442036, 685490228, 685526968, 685670703, 685703252, 685739961, 685820464, + 685871034, 685998563, 686030914, 686064608, 6717471, 686112818, 686145590, 686181061, 686244315, 686276618, 686292994, 686309397, 686325847, 686376282, 686407711, + 686424547, 2326550, 686457739, 686522379, 529023016, 658112524, 686542779, 686770953, 686817339, 246087708, 686854076, 686965039, 686997560, 687030348, 122601482, + 687063541, 687095810, 687113074, 687144970, 687161375, 687177747, 249987115, 687198141, 687276569, 434963396, 687342622, 687374372, 54460427, 687393681, 687492848, + 687574974, 687734815, 7045132, 687751470, 687784367, 687816795, 687849902, 687898643, 687915020, 687931398, 47316998, 687951807, 687997820, 688046185, 688078850, + 688095253, 688111703, 688164800, 688242719, 688259114, 335446038, 688275482, 1818655, 688291880, 688308290, 688341941, 688754626, 688914862, 688964494, 689029967, + 49676344, 310297838, 689064379, 689196995, 689258601, 6619202, 689295213, 207650915, 689360836, 520077371, 689426373, 689622982, 689721287, 5324827, 110248399, + 689835976, 1982490, 689897510, 166346764, 689917897, 689997433, 118292783, 205144090, 690048970, 690192413, 1114152, 214319142, 47120390, 110233510, 690209071, + 690245579, 690421816, 4997249, 690458572, 690552854, 690570063, 690602022, 690618671, 45760543, 690655181, 690765922, 129942900, 469630995, 690800104, 690851790, + 690946058, 690962444, 2162694, 690979246, 691028399, 691061655, 93945882, 691113935, 691340278, 691372174, 691404812, 27246594, 691425232, 2196979, 691572689, + 691654273, 691720146, 691783579, 691847170, 18153509, 691864432, 691912742, 316293186, 691929094, 293601317, 691948079, 154767315, 692011067, 692043815, 692078169, + 692125712, 116228111, 692142139, 224018470, 692178900, 692256795, 235307010, 692289538, 692305930, 47120413, 692322763, 692375509, 119997393, 692506582, 692617323, + 116884303, 692650025, 692666379, 692682768, 52805642, 692699162, 692715566, 692768006, 692830274, 692863411, 113541165, 692896656, 146653203, 692932567, 693063640, + 693158735, 693194713, 3212787, 693403669, 693423318, 693519328, 693568168, 693600794, 306954382, 693633960, 661012501, 693665807, 693682192, 693698570, 693714973, + 693732220, 269550082, 693784538, 693960788, 557219947, 693993579, 594886715, 694030299, 694095836, 694173712, 147652634, 694194141, 694226910, 694324139, 597475330, + 694406889, 2146528, 694470139, 657965058, 131334251, 694521823, 474169546, 694669280, 694751201, 694812718, 694861830, 694878229, 694894604, 537772058, 694911035, + 694943843, 694976528, 6374430, 694992898, 180437002, 695010851, 569098242, 695062498, 51855379, 695124028, 695206765, 695259107, 695320896, 147407705, 695353412, + 3211303, 7733485, 695402562, 695439332, 695484432, 168902763, 112608168, 449659310, 695504869, 124862935, 695782477, 695844981, 695877658, 695894446, 695943184, + 291096639, 695963622, 696074670, 51429406, 696123438, 2197525, 696173081, 696238101, 696255311, 696287663, 696324071, 696434780, 239648770, 696468343, 696500262, + 696516639, 277053461, 696533004, 696549402, 696565791, 696584503, 696616353, 696664074, 696680454, 696696848, 332103706, 696713675, 696762881, 118456336, 696830294, + 110231652, 696881079, 696946664, 697094121, 697204774, 223182879, 697225194, 697271081, 697307115, 697384998, 697401428, 697434138, 122568735, 1114117, 3375135, + 697452283, 697499950, 2195990, 697533830, 128155659, 345161782, 697602028, 697811870, 110445027, 697847789, 2196311, 500711436, 697942949, 204587039, 697976010, + 698023962, 381190192, 138018862, 698040358, 698056742, 307610030, 698073142, 199049226, 698105910, 698139560, 170754058, 698171999, 155926544, 698208238, 698352749, + 698384396, 152945493, 698404847, 64765994, 698466951, 698516852, 698564710, 698601456, 698695785, 698728460, 79691805, 698990604, 44679194, 699008894, 699039789, + 699072580, 699121694, 699154539, 699187206, 66928655, 6193183, 699204951, 699252762, 699269515, 699305970, 287130114, 117506351, 699387891, 699535348, 6377461, + 699581223, 699596821, 3375911, 206225436, 699613286, 27852828, 699648702, 699698393, 699781110, 699844576, 50266150, 699891750, 699912183, 54493200, 699990075, + 700022886, 700055564, 700071974, 700092408, 700190713, 700351674, 700387322, 700469243, 700695159, 700727317, 700743682, 700760083, 247234597, 700776450, 700792870, + 700809218, 700825610, 122732563, 700843507, 217710608, 700874790, 700891157, 700907560, 385187866, 700924961, 700956674, 700973067, 47529999, 700989499, 701022227, + 272384021, 701038623, 701054997, 320913474, 701071370, 701088167, 701136936, 701153306, 701169706, 701186060, 254197770, 701203033, 701235238, 701251622, 397000735, + 104005663, 701268427, 701317122, 701333510, 332742696, 519143430, 701349929, 701366313, 701382668, 701399147, 701433139, 701480986, 229654549, 701497360, 701513757, + 701530152, 104005651, 701546508, 701562937, 701579280, 701595686, 701612072, 701628437, 547880991, 701644821, 97681434, 701661196, 701677675, 701710348, 701726751, + 701743146, 93978646, 606405571, 701759920, 701796348, 701877862, 701911037, 701974333, 249987148, 702022091, 702074878, 702156799, 702367065, 702398476, 190595088, + 702418944, 702464066, 175014359, 2196571, 702499316, 702545974, 702578754, 702611543, 702664705, 702763010, 702957427, 702992387, 703102978, 52674570, 136856423, + 136627209, 467960679, 703119419, 152962252, 703152975, 703185397, 703217806, 145473538, 703254532, 2130729, 152963339, 703348746, 703367519, 703418373, 703578122, + 115196535, 703594526, 703627275, 703643650, 2605082, 703660042, 124863064, 703676442, 1916994, 703692866, 592707610, 703725606, 703741990, 147226655, 703758873, + 703824339, 357597200, 703873451, 703906601, 703938600, 703955618, 159301663, 703991003, 185270310, 704086049, 704135178, 704151573, 112918580, 175784028, 704172038, + 704300117, 704331835, 704367896, 704417799, 704480627, 704513451, 2195573, 524910648, 704565256, 704793564, 704839712, 704873816, 704922718, 704970788, 704991241, + 8388798, 705056778, 2031639, 705134699, 374931484, 705171467, 705282114, 705315576, 52346892, 705350132, 110248427, 705396802, 705429560, 394379290, 705462338, + 140247147, 147064137, 705495070, 2408488, 705531916, 705646605, 126615557, 705712142, 131334346, 705855500, 705871882, 6029341, 705888545, 705925135, 706052618, + 7259145, 47120395, 706084970, 706167838, 706203664, 2195890, 706363402, 706379779, 9109527, 19267590, 706400273, 50118693, 51658757, 706445340, 96256135, + 293716083, 182552597, 707039252, 5619727, 8389124, 707170325, 707264534, 578043935, 707285014, 464748560, 707445258, 707481623, 608731148, 707530776, 707579929, + 707674992, 301023244, 707723333, 115966006, 707759213, 707839099, 707870779, 707903500, 5619728, 707923994, 708071451, 708169756, 708329904, 152272934, 150683660, + 708366365, 708431902, 6897730, 708477943, 708546591, 708789342, 416612378, 708837429, 708871569, 708936527, 708968513, 709017641, 5275650, 709038112, 709115926, + 709132290, 569116108, 640843830, 709149634, 709183815, 709234721, 709312522, 184926211, 709330581, 709398562, 709480483, 709544282, 554270732, 709657490, 709705833, + 207620196, 709742628, 6422568, 709804034, 709820422, 709836821, 709853200, 709869594, 122585119, 709886398, 709951596, 5309640, 709988389, 124863411, 710086694, + 710198128, 710246426, 710262813, 447840262, 710280853, 119999024, 710344726, 388857858, 710364026, 710397991, 200492062, 710496296, 710558729, 115769443, 710594601, + 710787156, 45858842, 710819856, 167084058, 710840362, 711168043, 2197374, 27623903, 711315500, 300925450, 711413805, 8392630, 711479342, 711558112, 711607725, + 656441354, 711656327, 184389679, 711708720, 711772059, 711839793, 711886097, 711933983, 711950338, 116850726, 711967742, 712020018, 712118323, 712279474, 227639306, + 712347700, 712409325, 712445037, 712524809, 712560693, 327483404, 712655331, 712687643, 712720921, 712786002, 712818775, 712868291, 712901040, 126763051, 712934602, + 712982635, 3899451, 713019446, 713064486, 654983206, 713080844, 15351846, 713098391, 713150519, 109051943, 713228294, 713244691, 713261096, 205029414, 713281592, + 713392194, 713424906, 713445433, 25559515, 713491486, 713524047, 713560122, 713658427, 713769047, 713819019, 713884079, 713917293, 713966027, 180404230, 714014828, + 714048780, 714100796, 714162235, 714195046, 54460444, 714231869, 157646876, 714276892, 7634986, 714297406, 714559551, 714621848, 714674240, 714735724, 97271818, + 714772545, 714833976, 714870850, 714948667, 714985539, 715051076, 715132997, 702201868, 715194449, 715231302, 208848462, 715309066, 715326479, 715374630, 715392344, + 715441560, 715493447, 6373457, 715571238, 319717435, 510771238, 715589545, 715637646, 715706440, 715916402, 715964492, 715998064, 716046638, 280445033, 141705282, + 716079110, 277954581, 716098254, 117899357, 716214345, 716341274, 716357648, 228294662, 716374122, 716456044, 587432396, 716488797, 716539513, 168722442, 716591178, + 716652628, 716689483, 716783638, 716804172, 319455992, 716850197, 716898335, 716914753, 716964898, 716997528, 567984166, 717046672, 225313415, 717079969, 717127787, + 137379869, 717160507, 717193238, 717212833, 115458076, 255459347, 717242517, 32817287, 717279309, 717340788, 126746636, 717738063, 629964852, 115294219, 334070235, + 717803600, 717918289, 87539738, 717963346, 717996061, 718012848, 718045222, 718061634, 146489350, 718098514, 718160719, 718193504, 718262355, 718324017, 718356561, + 718393428, 718537748, 114049045, 718590037, 718667788, 718684198, 159760422, 718704726, 718917681, 718965003, 719014388, 227787253, 450334807, 148620209, 719065176, + 719110196, 719144136, 608108546, 294649922, 719176584, 719229017, 719438256, 719471051, 719523930, 719783219, 719833109, 252297575, 719863820, 719880652, 719913560, + 719945768, 150077450, 558499776, 719962143, 719978526, 477184002, 720011723, 720060426, 5505061, 278167989, 720076884, 720109652, 720142439, 720225452, 720277595, + 703365636, 720408668, 720502806, 720519234, 8390401, 1933343, 720553132, 720605277, 706002946, 27623478, 720670814, 720814164, 720849545, 5472296, 720912400, + 720928808, 720945178, 114409491, 720964416, 721031263, 721125386, 721141823, 243040278, 721178720, 54460438, 721227224, 523599981, 721273291, 721326177, 721567810, + 721604706, 721666156, 721700252, 721752163, 721780802, 721817700, 119358494, 721881141, 721930836, 7733317, 721981541, 722043456, 722075654, 477904918, 722092098, + 722125714, 313839718, 722178151, 722291148, 722338710, 152948662, 140476887, 722387862, 722437014, 722489448, 3228075, 722554824, 722616849, 722649110, 722666390, + 291455002, 722714651, 45613068, 6833909, 722751593, 722846210, 722878530, 722911879, 722960394, 275791900, 722980451, 723026011, 120979468, 723062890, 723140630, + 723161164, 8391849, 723206210, 723238971, 723275883, 723324838, 723374188, 477937666, 723521645, 723566604, 265027594, 723583002, 723599372, 723615750, 723632140, + 723648538, 122667065, 723664917, 723682131, 723746826, 723763202, 723779622, 126599204, 696288812, 723800174, 723845146, 723861506, 723877903, 723894294, 687997846, + 723910710, 210583594, 723943460, 250085382, 723964015, 724026280, 724058150, 724078704, 724173647, 724205770, 564903995, 408833666, 724242545, 724422770, 273924112, + 724484203, 200736774, 724516892, 724533274, 17383539, 724551677, 724598795, 456966146, 724615260, 724649925, 724683320, 83918855, 724717683, 580861962, 724828229, + 724860947, 724877322, 724893812, 573751338, 724910102, 641531940, 724926470, 724942879, 271138831, 724963444, 2326533, 725027412, 725075546, 20365352, 725110901, + 725139485, 725160054, 725206387, 725237781, 725254154, 38879268, 725271011, 725303334, 725319696, 725336092, 725352460, 725368843, 456966156, 151896100, 725766264, + 725860378, 725876820, 725911193, 62341126, 2293779, 725958678, 725975061, 725991436, 123650059, 726012025, 726156439, 726204447, 308576284, 726222153, 726270004, + 726302794, 726372474, 47546406, 8392827, 726487164, 127500319, 726536317, 726663278, 726695938, 29900819, 726715159, 726777887, 321863682, 726796976, 726843847, + 726892582, 726908930, 51839007, 726925322, 726941742, 726991150, 515031342, 727027838, 727121951, 727139884, 119570460, 533069883, 727175295, 119359024, 727304573, + 727385890, 727418416, 727450518, 24297911, 727502976, 635633666, 727650433, 727711746, 571801657, 147013653, 727728169, 727748738, 2195916, 191678073, 608108575, + 727859503, 727896195, 727957506, 727973894, 601522182, 727990303, 728006666, 728023099, 728055892, 8994953, 728088641, 728141180, 291160095, 159137818, 728174724, + 22216820, 728432670, 728465434, 728482016, 2835379, 728514572, 32063777, 113672278, 728534172, 728581601, 728699013, 728780934, 522980563, 728895623, 728957820, + 729006090, 729022466, 729038869, 217628738, 729055253, 161595413, 729071713, 121864220, 729137167, 254595208, 729157550, 729223305, 729268226, 729286486, 729333859, + 729366987, 729415692, 729432090, 729449276, 729501834, 729809950, 729845899, 7733287, 729956382, 729992897, 730054715, 275546122, 730087426, 7045160, 184894633, + 730104279, 154767500, 730136630, 386535413, 730169410, 730202138, 108658716, 730218967, 730251327, 126959653, 730284048, 2361407, 730301470, 730333408, 57032744, + 730370189, 84934694, 339296272, 409944083, 730447910, 730464299, 730501262, 730678570, 730726832, 730763407, 730808322, 523976715, 730827386, 730874526, 730908501, + 164479007, 730972619, 731025552, 27852841, 731086890, 731104669, 731152386, 110215270, 731173009, 59228176, 731271314, 731353235, 293502992, 731512834, 147341349, + 731529309, 731579223, 558841883, 731613567, 731676754, 87539722, 731709494, 731742214, 99893254, 112427029, 731762836, 732074133, 732136777, 4161548, 732184663, + 732234488, 732269677, 732350914, 2197979, 732397644, 500910540, 732434582, 732545069, 732582039, 732725725, 732758863, 732790790, 732810116, 45760543, 732875162, + 732958872, 162791446, 313786839, 733052968, 300892189, 733069844, 280903701, 125927434, 733118504, 295731215, 733134954, 733221017, 116375776, 733267928, 733333081, + 733383183, 733446184, 733462566, 733478955, 110215267, 733513023, 300925035, 733579000, 733659167, 733676574, 733712538, 361316784, 733790654, 733856375, 733892763, + 733955102, 733986847, 338493450, 118883151, 734007452, 734184635, 11157514, 734236829, 734347371, 734384224, 734430078, 247234570, 734463707, 734496667, 734560793, + 734625899, 734659525, 734708144, 734740564, 116376606, 734774155, 734839696, 734872011, 184926219, 734924958, 735154335, 735199687, 735248406, 735265227, 700022894, + 735318176, 735400097, 735461388, 735477786, 171163669, 735496896, 459785438, 735560139, 137445382, 340283554, 735613091, 735674455, 735724280, 4341802, 735760548, + 141459468, 735821826, 5869158, 735842469, 327663642, 735952952, 735985676, 436717993, 736002507, 736052595, 736085120, 424017942, 736137382, 736215887, 736252071, + 736346246, 33243267, 736364080, 736395285, 736413556, 736448680, 736493609, 736509974, 102858780, 736526343, 736542852, 2621575, 736559116, 736575529, 736591894, + 736608387, 736624682, 27344933, 736645289, 295649318, 736724108, 146456613, 573620262, 303611932, 736776362, 30392338, 736821267, 736837642, 736855802, 736886812, + 96190493, 736903189, 717226005, 736919581, 736935942, 28016642, 736956587, 737230904, 737263703, 737312796, 737329154, 737345555, 737361941, 256032780, 737379924, + 737477368, 737513644, 737689640, 737706022, 737722406, 5505060, 103940122, 737738764, 737755157, 128761887, 737771530, 49774630, 737792136, 737821665, 584990746, + 282853402, 96026645, 737857709, 737902684, 19447814, 737935897, 738001861, 738054318, 738136239, 738201776, 738328605, 738344989, 115589151, 298614810, 207962124, + 738361356, 234176519, 738378641, 738430156, 738492435, 738508857, 738525196, 738541625, 142180374, 738562225, 738591184, 738639882, 204488735, 738657169, 738705414, + 8994823, 521617444, 738721821, 738738182, 738754617, 738770984, 738787444, 738803750, 17449076, 738824370, 738885642, 738902045, 738918430, 738955425, 739016763, + 576880678, 593117194, 739053747, 739147795, 739165080, 739213334, 172703775, 739233972, 739295258, 7734103, 739311628, 211173402, 739328913, 739377376, 739411303, + 739475487, 739491869, 1769474, 739512501, 739607561, 567083067, 739640270, 202522662, 739672169, 739704853, 739722108, 116213292, 739771010, 739823798, 739950614, + 381829146, 739967007, 739983370, 739999756, 44302342, 150077452, 740016166, 563265538, 740036791, 740081676, 740098086, 740114444, 740130837, 452100180, 128974886, + 740147216, 740163591, 546799647, 740182584, 7454742, 142180381, 740214257, 7602198, 740249784, 740364473, 740425750, 740442128, 502497306, 740459972, 740491348, + 740528314, 740590027, 441385391, 740643003, 740708540, 487965248, 740802576, 740818970, 131891236, 740839613, 740933654, 740950451, 740983772, 741015590, 741031952, + 741048377, 741064706, 201998373, 741081172, 131875664, 153174054, 741113896, 741130246, 219889674, 741150910, 741213596, 2360772, 131891257, 741261420, 741294096, + 741310483, 741326870, 160727056, 741343275, 295649295, 500842515, 741376105, 741409674, 741441839, 381550629, 741474330, 45023268, 741490690, 48447525, 741509117, + 204996620, 742133952, 742281409, 742523418, 742555679, 742572042, 742588447, 742604806, 124108821, 742623657, 742653954, 244170783, 231768095, 742671201, 742703110, + 181141525, 742723778, 742768742, 742805699, 742883420, 269287440, 312033333, 176963596, 742920388, 742998056, 743014410, 55132163, 743035077, 743100614, 743145503, + 743161877, 743178252, 129400851, 743194636, 131432458, 274120758, 743214479, 743277717, 743309328, 49790987, 278872076, 442974239, 743328854, 743407682, 659914794, + 743440405, 743456794, 743473164, 743489555, 743505922, 743522310, 234405909, 743538912, 412139579, 743572131, 743621455, 743653382, 743669781, 56639504, 743687378, + 743718953, 307134490, 743735810, 743772075, 743833612, 447840282, 743854279, 743964712, 332742713, 743981087, 518488121, 743997456, 354369577, 744018106, 49774634, + 155779084, 744079372, 312180742, 744095760, 11157544, 744112235, 253624404, 744149192, 288620664, 744308755, 293715989, 744329417, 744390665, 9207837, 744407049, + 744423435, 67240073, 744439810, 410206245, 744456215, 744472599, 744488983, 2179110, 744505479, 744521754, 744538149, 744554497, 77709341, 744571011, 744587293, + 1212434, 744603671, 51839018, 744621322, 76709906, 13074442, 744652818, 744669224, 744685578, 744701974, 17924103, 744718937, 744751132, 9535525, 744767498, + 2523178, 745230538, 745390112, 745423893, 542425090, 112918670, 745472131, 59883651, 745490613, 745537552, 470007813, 44908582, 745558219, 745767014, 745801531, + 108658710, 745849121, 5865526, 47120424, 745882132, 745931223, 201524424, 275447820, 745967820, 746192912, 461963269, 746210275, 746260415, 746356822, 25559094, + 746393805, 92930090, 746536999, 746574030, 4998174, 746701334, 98107418, 746737871, 746803408, 197722141, 746881053, 404160552, 746898441, 746930400, 118865935, + 746967249, 149127263, 747192358, 747208706, 245301277, 747227508, 747292776, 312410114, 747340000, 257933314, 747373060, 747421778, 4964383, 747455886, 6373475, + 747524183, 747569211, 747601979, 747636469, 747683866, 747700250, 747716620, 747733008, 747749397, 88948772, 747770066, 134627338, 747901139, 8392916, 748060731, + 748094633, 236716042, 748128059, 748175823, 748212437, 748470294, 748486722, 748523734, 748620744, 748687575, 748748812, 748765210, 748781587, 748797974, 748814362, + 748830756, 50266118, 748848234, 140247145, 484016226, 748929064, 748945439, 169787418, 748962710, 749015256, 749113561, 136790018, 749207611, 749244634, 749355018, + 8391135, 749371413, 749387778, 749408475, 749502486, 749519151, 749555932, 749867229, 749961761, 750014686, 225181738, 750063839, 2195614, 750288922, 16728082, + 510312866, 750308265, 62914570, 750354735, 750387216, 118210570, 750404520, 2588738, 750436436, 750470022, 45465606, 750506208, 750633019, 750666160, 750702817, + 750801122, 750899427, 66928681, 2195669, 751014116, 750305282, 751093326, 751141323, 751190446, 751241367, 751288623, 171556948, 751323406, 266190887, 751371339, + 161988624, 751435883, 751468976, 5619723, 5619723, 751502749, 751550556, 751583339, 751616011, 751632400, 51871784, 751648834, 751685861, 751866086, 751976514, + 37438738, 752009254, 752025606, 178765881, 752043382, 435781663, 752095463, 533544991, 752174136, 752239121, 752271672, 752304212, 752337808, 168706114, 752373992, + 361431094, 752472297, 752582666, 8392938, 119799864, 752600843, 207622379, 6833854, 752685292, 752779293, 752797453, 752832749, 752931054, 752996591, 753057808, + 500711464, 753075209, 357793818, 753106998, 456738835, 753139778, 753172518, 753190560, 115179558, 753619185, 27624386, 173443541, 753684722, 2719784, 753799411, + 753958924, 753975334, 753991692, 754008083, 754024469, 232030234, 323207206, 66928655, 117751820, 754045172, 754172958, 124864998, 754204732, 754290933, 274120763, + 754402216, 8390624, 754435560, 754483960, 140247887, 754520310, 754585847, 754761766, 754782456, 2195605, 8389314, 2130209, 755056642, 755073043, 55377957, + 153878574, 755093753, 371605516, 755159290, 13238295, 19267641, 118882904, 755241211, 115785754, 73187368, 755351554, 607617131, 755370056, 4292690, 755503356, + 132579433, 755615948, 755646476, 184713254, 755663786, 755744806, 3211369, 24969226, 755765501, 2342928, 755896574, 755978495, 756074213, 756121626, 270516236, + 756142336, 756252684, 115523595, 756269527, 1982495, 47087643, 756302870, 110231618, 756351042, 756383798, 540049446, 756416618, 756498508, 756535553, 756663217, + 341573698, 756698946, 756744734, 146456578, 76742696, 756793420, 756826143, 756846135, 180158466, 756896002, 757256451, 51871760, 757350516, 110248368, 757371140, + 357597186, 757465921, 757498251, 757532217, 757628938, 545259562, 757645418, 757731589, 1196042, 757792780, 146653222, 59310102, 757813510, 416727052, 757891078, + 599130140, 757907915, 366907655, 8389571, 757960968, 758087690, 1114115, 132776362, 19038214, 758104076, 758120507, 758157577, 758431754, 758448170, 112754700, + 458014742, 758466932, 17154064, 758530058, 758546463, 686424106, 758564252, 758612052, 758646105, 758677570, 78479366, 758710755, 115785750, 758747402, 283721794, + 758825807, 758858187, 27246602, 758911243, 758956042, 758972950, 759008278, 759073921, 759119931, 759157004, 338133459, 2359927, 759267349, 65880066, 759288077, + 5325291, 759350841, 759451918, 759516513, 759566607, 759648528, 759714065, 759812370, 25562369, 759943443, 760004610, 112754728, 275546114, 760021008, 760037613, + 760071678, 760136592, 628981762, 760168514, 760202391, 113246289, 760250827, 760302345, 760350386, 219824167, 760382376, 2523146, 760418580, 760610909, 760659990, + 760677504, 2130865, 760729877, 760860950, 760905730, 29900806, 760926058, 761004886, 761053230, 761103390, 153191302, 761135106, 2195556, 761151490, 761167979, + 232079391, 761201542, 761233492, 761267256, 761331819, 3178525, 761368855, 761614616, 761709480, 57950220, 761742159, 761774095, 22216726, 761793344, 761856066, + 761890134, 761937951, 150241322, 761954763, 762003477, 762019866, 125796364, 445841446, 162499484, 50266148, 762040601, 762266563, 762314859, 762348485, 15073311, + 271384591, 110247986, 762397672, 762445931, 383320086, 762479959, 762531829, 762560737, 318832666, 762597658, 196149274, 762658911, 762709086, 762757146, 184389915, + 762774422, 762822689, 2196680, 132481106, 762871829, 762888219, 442859957, 762920982, 762937375, 762953738, 131858491, 762970178, 266191121, 763003724, 763056412, + 763101237, 763134885, 763166786, 203325451, 763199490, 3244114, 763220253, 763400478, 150585791, 763498783, 763756812, 763810080, 19841055, 19251671, 205144092, + 763875617, 764055842, 188760254, 8392995, 764494720, 81756200, 764547364, 24838150, 764612901, 108315125, 764678438, 2196343, 764759844, 764821525, 764837904, + 198672426, 764854301, 764870710, 764907815, 765100054, 125796368, 4393446, 765120808, 765181981, 5882713, 765198795, 765248395, 765313261, 113115165, 385515574, + 765346081, 765382953, 765628714, 402145282, 765689882, 191053836, 765706266, 765722636, 765739010, 307298315, 2195566, 765755629, 765788247, 367886857, 180601320, + 765837399, 172703754, 765886466, 765902886, 405865446, 765923627, 766001179, 766033986, 766071084, 766198194, 766230549, 7634980, 766246949, 766263317, 99876874, + 766280075, 766312457, 766328969, 3309597, 766345257, 766361637, 766382381, 154423598, 766415151, 766493201, 22069379, 766525556, 766541846, 766560417, 766591005, + 766609326, 766640244, 766656552, 766672918, 2523177, 766693680, 27705384, 53870611, 608731143, 766803973, 766820380, 98107408, 766841137, 766873906, 766935156, + 766951461, 2523252, 766967829, 628326436, 766985536, 767017076, 767033363, 255459369, 767051717, 48480271, 767082524, 767098909, 118882373, 56426506, 767119667, + 767182817, 767230250, 767263018, 66814250, 767754370, 767770642, 62341252, 767791413, 768037174, 768098325, 768115120, 52609062, 768147466, 768165693, 768213023, + 112476217, 768233783, 768458806, 93978626, 768493835, 768541481, 768574876, 768623742, 3227747, 768671763, 122683429, 768688174, 768738113, 256656305, 768770132, + 768807224, 768853615, 768902153, 768935411, 768966722, 768999856, 769036601, 769146978, 228737030, 340132705, 48070668, 769184058, 769327246, 769359931, 537837667, + 769392652, 769409062, 769426751, 237715693, 769495355, 769704468, 433750123, 769754121, 769786393, 769851499, 769884236, 769917815, 769951110, 770019644, 770085181, + 13713543, 770277457, 52330522, 333136834, 770310165, 770326670, 770359362, 770392102, 6374312, 770412862, 770609471, 770740544, 468189815, 770785301, 770801670, + 3375116, 770822465, 770932748, 770949158, 172752898, 1785872, 770965523, 219529238, 770986306, 771032073, 771068227, 763166760, 771212200, 152945070, 771245332, + 771293213, 771309634, 358514709, 771342967, 771379524, 771440661, 771457055, 771473450, 183369738, 771494213, 771572183, 771604511, 771620885, 771637250, 114409493, + 771654062, 771704033, 152813570, 771756358, 2197929, 771899695, 771933325, 20365334, 771982905, 229527879, 772080247, 385597919, 772113509, 119226409, 772165960, + 772247881, 772329802, 772378955, 294633514, 119226405, 8701882, 772457578, 772538378, 772554773, 25559092, 772572329, 772608332, 772788557, 772980795, 773013939, + 773050702, 773099855, 773165392, 773210133, 172982331, 773230929, 773341200, 773357575, 773373988, 773390374, 773406722, 773423328, 232079414, 445726722, 773456161, + 773489111, 773522050, 773574994, 122732550, 773719189, 2506793, 773750865, 773783580, 773799966, 773832730, 773853523, 773902676, 773980920, 774012930, 774029350, + 208601119, 774045717, 774062111, 774082901, 774128075, 774181206, 774259594, 126615590, 774292216, 502759443, 774328663, 774489004, 774554514, 131842129, 774602795, + 774635628, 774668310, 774684684, 116277274, 774705496, 774799827, 774848965, 774881340, 774964319, 775033177, 775094293, 775111503, 775143430, 775159839, 775176233, + 31424543, 775192671, 775242257, 564887562, 86327336, 775278938, 264717286, 679755842, 775471116, 119259162, 775487572, 775520266, 775536671, 775553936, 775590235, + 775634975, 775651334, 775667718, 775684127, 119210000, 775700572, 775733254, 775749698, 775782412, 775798790, 775815174, 2850847, 775831776, 775864747, 775897107, + 654983194, 775913498, 775929896, 625688595, 775946543, 775979019, 678264863, 775996797, 776045768, 776077399, 776130908, 300335125, 776196445, 776258472, 776294750, + 776357433, 776456174, 776504233, 776552479, 776568842, 776585218, 776601638, 776618015, 776635280, 776667157, 776683536, 776699945, 776716372, 119800243, 776749279, + 776781845, 123912258, 776799627, 776851807, 139039072, 777015649, 232996930, 777076767, 274300947, 323305531, 777097570, 777160132, 777191445, 777207895, 8389607, + 777257062, 777289759, 777306122, 777322527, 47611923, 777339183, 357990419, 777371667, 777389032, 777437250, 777473915, 777523555, 555270154, 777799012, 24297932, + 143393071, 2129972, 777864075, 149128082, 3260475, 777933156, 778146149, 15007782, 778174767, 778207911, 778240040, 5619738, 19808322, 778256406, 778272794, + 231555088, 161710082, 778293606, 778403880, 233193482, 538198082, 778424679, 208977979, 778485770, 778502184, 119881749, 778522984, 778735977, 186466370, 778863051, + 668696597, 778911782, 552878101, 778928144, 778944522, 2195716, 778965354, 779075873, 448102421, 779109216, 779178347, 779239436, 779257217, 779305867, 779371018, + 4998816, 779403801, 779470702, 779535010, 779567134, 779599882, 779617881, 779665867, 779714626, 273203210, 779751788, 779911178, 779928183, 779960462, 779993119, + 780009510, 780025894, 47284226, 780042271, 780059051, 780091402, 321307255, 780109299, 780140610, 780173327, 780189711, 25559887, 780206617, 780272151, 780304440, + 780337218, 780369966, 780419596, 780451861, 780469088, 9535497, 780534060, 780570989, 780669294, 780746758, 780763157, 142950459, 780779979, 780828678, 211173388, + 780845593, 780915055, 780996976, 781041751, 781090822, 781107219, 108315224, 238059526, 781123650, 137101746, 781156654, 781189591, 781223801, 781275505, 781455730, + 184926229, 781565967, 781582395, 781615209, 781652339, 781762978, 781799796, 781877274, 781893691, 781927031, 441368588, 781963637, 277954579, 545472538, 782041104, + 563347494, 782058009, 782123018, 437932406, 782142004, 782172619, 782225783, 782289079, 782337013, 782406008, 782565417, 782581772, 782598154, 782614554, 782630978, + 782664100, 155832456, 143753222, 782696460, 2408486, 782715115, 238551511, 354369552, 782782841, 113246240, 782848378, 137101411, 782897531, 783061372, 48054283, + 2196343, 783176061, 180764698, 462487580, 114393110, 783237186, 783269942, 783307134, 32849948, 783351867, 115294237, 783384605, 783400986, 783417428, 783450133, + 783466955, 783515690, 783532044, 52609034, 783552895, 783827025, 3228408, 783860213, 783892622, 617923019, 783925274, 50511910, 783946112, 110182689, 511656173, + 783991883, 3244131, 784056330, 241434660, 23085066, 155828312, 784077185, 784175490, 784286709, 784355715, 381829157, 784470251, 733102092, 126042123, 784517191, + 784568708, 784646154, 56557580, 784662570, 2195935, 50118668, 784683397, 784830854, 784876655, 211189791, 45646736, 784908300, 2359322, 784927149, 756006968, + 784974425, 2752543, 4177956, 785371528, 278970370, 785682825, 44351514, 785760309, 785793261, 785825804, 4965801, 785843056, 785891435, 589479957, 111034380, + 785928586, 786022922, 786055471, 786088001, 786138223, 786174347, 786219014, 112771078, 3211371, 786236915, 786268206, 786317394, 1917355, 786354572, 112754700, + 533399339, 786485645, 786579466, 5308910, 786595866, 786612245, 150388802, 786633102, 153190834, 786731407, 726695946, 786809084, 786841676, 786874887, 786923551, + 786939914, 171966495, 786960784, 119357499, 787038667, 787087819, 787136963, 787173777, 787220148, 118210598, 4702315, 787300873, 787334000, 787383526, 787481017, + 787530634, 252280932, 148733973, 158813300, 787564019, 787595796, 787648914, 787922965, 2965506, 7602216, 787939387, 787972128, 788004948, 2670602, 788042131, + 788086794, 788103227, 788135962, 788152349, 140247887, 788169637, 788201696, 788235240, 788284306, 788336086, 310493621, 788431881, 13074458, 788465236, 788563713, + 788611502, 529760294, 131335031, 132481131, 788660264, 55197725, 788676654, 788725826, 124551194, 788759375, 788430860, 788792800, 788828564, 789053452, 789069923, + 789102881, 789135381, 789151831, 5341293, 789201199, 789234295, 789266444, 789282921, 789315668, 789348374, 789364757, 789385621, 789431208, 789463343, 789500310, + 729022466, 789561384, 789577740, 123600906, 789594415, 789627117, 789664151, 789774348, 789790746, 789811608, 789889950, 789926297, 389840898, 23363797, 790122906, + 790270363, 173817872, 790315010, 158711827, 790331408, 790347883, 790381081, 790446096, 180764710, 790462474, 153190456, 4964378, 790479721, 625918386, 790544986, + 790577183, 295927848, 790593562, 790609951, 790626314, 15351850, 790647196, 790729117, 608731152, 624656396, 790808595, 790859101, 790941957, 791004044, 791052381, + 791102330, 117899310, 791150699, 791183414, 791216579, 791253406, 451428983, 791429344, 791464705, 7733314, 791515551, 791630240, 791695777, 791773194, 791790051, + 791822417, 791855170, 7389220, 791887874, 791904266, 144048149, 791921927, 792023005, 792051738, 51675165, 792068399, 792102355, 185958466, 792151047, 792215618, + 792249185, 792281107, 88948767, 792298009, 792363529, 792395815, 792428974, 55132217, 435667478, 792482210, 792546682, 792629667, 792854544, 5603354, 792874918, + 792924580, 793072037, 793134166, 184388353, 793182239, 793198676, 1114143, 793231819, 793285030, 793347102, 793378854, 27623483, 52674591, 793661864, 793821864, + 793853958, 77512725, 793871765, 793919515, 637944228, 793956777, 794117324, 794166261, 794232875, 499269698, 237830175, 794297320, 794346073, 794379929, 794427479, + 794481066, 8392239, 794574904, 794608604, 131891216, 794640406, 794656814, 794710443, 794902538, 794919759, 794951692, 61997087, 794969634, 795017248, 540770320, + 795050071, 795099195, 795136428, 51855382, 435323104, 452100180, 795263006, 795296281, 46088229, 795365805, 2195933, 795447726, 795644335, 795689026, 7716902, + 795723827, 795770901, 795787266, 195002394, 191645214, 795808176, 462651418, 795852802, 795869194, 271925364, 795885674, 115770104, 795972017, 774012959, 796196890, + 796213551, 796246647, 796279216, 796312027, 796348850, 796426324, 796459034, 796475394, 796491791, 796508182, 796524976, 298270726, 796557615, 796590304, 796627379, + 796819482, 115294220, 8393140, 796835861, 796852250, 796868610, 796885527, 796917847, 796967904, 797016130, 56262698, 797052597, 797131806, 797163551, 797180816, + 797214297, 634978326, 797262824, 118882772, 797313375, 382435333, 797364661, 797413331, 8389526, 797462966, 2850819, 209175646, 460390459, 797561271, 797966470, + 41615383, 797987256, 798114958, 25559887, 798162984, 192479258, 798179359, 126697513, 798200249, 798261290, 114114582, 27623738, 798281683, 270516262, 798330340, + 798376783, 565772309, 798409914, 798441494, 798457882, 798474256, 264093706, 798495162, 426934291, 6373688, 798656685, 232197679, 798720046, 798770268, 45858837, + 6717466, 798822843, 799032102, 799066638, 549999036, 558628930, 799113247, 52477953, 799134141, 799310082, 799342610, 8606142, 799359057, 379797570, 799391828, + 799424619, 11059218, 799457386, 799543743, 799624150, 156041258, 799691200, 799773121, 799949733, 799981578, 799997954, 800014357, 800030807, 1918063, 800080905, + 128155667, 800112652, 146653944, 145735682, 800133570, 800245352, 800309675, 800346563, 800506833, 8390928, 800559556, 800620565, 184387560, 763166732, 800637442, + 800670143, 147505183, 800702476, 800718874, 2196096, 800735286, 800768892, 800818664, 113247262, 800870853, 800997378, 765313034, 501940226, 801013844, 51855386, + 743981087, 801047721, 801079322, 801095711, 115721385, 801116614, 801313223, 5325263, 801456160, 801493448, 149585931, 126222874, 801587212, 801603594, 251396117, + 801622806, 141606952, 801656422, 7733551, 801690057, 801800214, 801816588, 801833546, 801865816, 801899403, 227918750, 801964546, 801997431, 802029672, 802078736, + 802095114, 802111490, 802127910, 565739551, 788152346, 802148810, 802226258, 191545370, 727664029, 802258998, 802291810, 802324539, 802358265, 802443723, 802570670, + 802127898, 131334368, 802619432, 383860774, 802635797, 802652619, 152946415, 802701749, 802734146, 802766904, 802800541, 159809562, 154796256, 802884510, 802930795, + 802963680, 802996243, 803012630, 803029003, 65896479, 803045913, 803112085, 803143746, 803181004, 803275055, 803307522, 803323925, 79691807, 803340294, 803357209, + 803426765, 803492302, 123273231, 678264848, 803541455, 803590608, 803668414, 803735581, 2326557, 803782696, 803799343, 350912533, 803836369, 804213202, 804340766, + 804377043, 804439469, 804487218, 804519948, 450543626, 804536766, 3244503, 178472820, 804601868, 125911147, 804622804, 804799344, 804847622, 351240213, 804864031, + 804880403, 775815189, 804896834, 804934101, 176357877, 124864372, 805012979, 805044683, 805093419, 5603338, 805126170, 805142530, 125927446, 805158914, 505184267, + 805179862, 805357428, 805388748, 177094666, 805421098, 51282347, 805437506, 152945070, 805470667, 805519416, 805552159, 805569397, 805601319, 7094706, 805634585, + 805704151, 805765967, 295125030, 805797920, 1917231, 805835224, 806043729, 806076442, 806092821, 140247515, 806110263, 138232242, 806141954, 806158357, 806175567, + 806212057, 132431931, 600719414, 806291542, 782516230, 135004162, 806355050, 8391085, 806441434, 806537076, 109136925, 806569015, 806600758, 348831775, 806638043, + 47611916, 5325400, 806715423, 18137094, 806731842, 806764600, 389136815, 807162333, 807309790, 807354452, 807387359, 807424479, 807486876, 807537875, 807583770, + 111149072, 807600236, 807632906, 48054303, 807649292, 243367974, 807666511, 807701721, 807780462, 807813130, 807829536, 807863179, 148800002, 807927907, 807960578, + 807976998, 807993375, 116015107, 808011654, 808110350, 808158090, 808191179, 808222770, 7389212, 447660044, 808255519, 808272778, 808304661, 808321871, 808353858, + 808386571, 555270160, 808407520, 112476186, 808484890, 625524748, 808501287, 808534047, 802127893, 808554977, 808633212, 808686050, 262537282, 808730640, 808747107, + 808779802, 808796244, 808828934, 541392908, 808849891, 808980964, 341147658, 809074775, 88457256, 809123896, 290406402, 809161189, 352305164, 809305257, 809337770, + 809423334, 163725742, 809467988, 809501209, 809566626, 809599084, 809631746, 325353493, 809648130, 809664538, 809681005, 809713695, 190646293, 809734631, 659341324, + 156434448, 809828398, 809879703, 266125338, 809927193, 809992218, 810008879, 140247079, 789873495, 3719275, 810041428, 48054308, 810078696, 810172719, 448102421, + 810209769, 810287158, 5865526, 153191312, 810320781, 810406378, 704036971, 591593994, 136986643, 810451051, 810483714, 810500128, 810532930, 810570180, 810632580, + 810696725, 810713154, 810746159, 392921128, 810779156, 810827833, 810844191, 810860550, 318832646, 810881515, 417300492, 596803606, 810942495, 810958854, 234405894, + 810975769, 811044722, 811090988, 811139169, 811206434, 811237407, 811253798, 811270175, 811287440, 811323554, 811352066, 780189706, 811368470, 247611451, 811389420, + 811450474, 779075624, 811532820, 811581476, 811598716, 811646995, 811663381, 811682945, 6619945, 811731540, 811778060, 811794458, 175669290, 811815405, 812044782, + 812122134, 802361199, 812139550, 812171911, 812221440, 812255209, 812335125, 812352413, 812434400, 226557973, 812487151, 812598113, 729006106, 812630319, 812662794, + 812679627, 812728376, 812761154, 812794327, 812826690, 812860279, 812894011, 812945904, 246562854, 813023244, 813039657, 3538950, 813056011, 813072386, 44302342, + 813088784, 122732554, 813105233, 813137932, 813155066, 813187126, 813224433, 813302012, 118210562, 525631547, 147062814, 813334559, 808682706, 813351342, 813401408, + 813432853, 71401526, 813453810, 813498380, 813514762, 241827861, 813531163, 813568499, 813678699, 813712207, 813744187, 813776922, 158811636, 813793373, 279150604, + 813842498, 382484561, 813879796, 45646878, 814039052, 216451228, 814056184, 814088625, 550944790, 814123037, 814170138, 814187343, 814219695, 814252034, 814268426, + 814284816, 5718026, 814301203, 814317590, 814334475, 814384426, 294060034, 814436853, 814567926, 814698999, 814764536, 814846457, 2113652, 814907880, 814940162, + 814956565, 814973015, 815022945, 815059450, 171753494, 815108603, 815206908, 815251471, 815272006, 815349772, 815366154, 127893525, 815387133, 815513692, 238552875, + 815550872, 884776, 815628331, 815665662, 815841336, 25563091, 815878655, 206880901, 311411535, 816021596, 816054278, 118243350, 816071115, 816119810, 816137327, + 816168979, 816185370, 24969252, 816206336, 816300044, 816316426, 816332917, 816366441, 816431592, 816468481, 12648580, 816665090, 816730627, 268189735, 689799227, + 816824407, 119997415, 693503937, 816873554, 816907158, 816960004, 817123845, 8389487, 817250343, 817283093, 817299458, 817315850, 817332226, 2113541, 817348715, + 817385990, 817446988, 817484295, 817598984, 817659919, 817676300, 817692710, 221806594, 110215285, 817709358, 817741865, 2197690, 165773340, 7258164, 817759432, + 817792286, 817840154, 817858226, 817889364, 817923061, 817988847, 818020363, 260064079, 146854409, 818041354, 818153432, 818219311, 164020264, 818303499, 818483724, + 818528293, 818549261, 340280354, 151912469, 818593814, 1212532, 818613960, 307134505, 818675734, 2113577, 818692132, 251806149, 818708530, 818742008, 818774037, + 90112057, 336887836, 818795022, 818841804, 8393231, 818875554, 571965468, 818921500, 7635001, 818937878, 7667724, 818958864, 819003421, 40960041, 819023510, + 52215938, 819085444, 819101719, 59293830, 283967510, 819122705, 819286546, 147390495, 174080045, 819414502, 819466771, 819514672, 819560454, 819577326, 819609659, + 819643512, 819675179, 452100162, 819712532, 4980871, 45875212, 819757066, 819773497, 819789860, 819806229, 819822628, 179716212, 819843605, 3245215, 819937320, + 819954425, 714244134, 820400663, 820659601, 820723733, 820740162, 820772918, 820808408, 820871206, 820888399, 820920849, 820957720, 433635340, 52723722, 821002271, + 821018645, 821035039, 251396115, 821051446, 821084260, 194510874, 821121561, 821198879, 41582630, 821215248, 821231622, 821249000, 821297183, 531972115, 598327306, + 821316083, 821412831, 821461013, 821478296, 821526570, 821545248, 821592601, 821658969, 821690378, 46219276, 821706784, 821739607, 821788687, 821805072, 47251496, + 821821461, 821837854, 821870623, 821886995, 55263234, 821903370, 821919773, 821940762, 135168002, 822137371, 822249628, 822297193, 822329356, 788152358, 42418195, + 822347095, 822395357, 822427674, 822444034, 128892970, 822462886, 444107103, 822525995, 822559214, 822591542, 822624870, 822657040, 822673434, 176521519, 5767184, + 822694424, 822739046, 822771743, 47546396, 822788556, 822820876, 198410278, 6455311, 822841884, 822986540, 823034344, 823066640, 823083046, 823099408, 56655883, + 262914069, 823117289, 118882411, 151732236, 823165021, 823214092, 823230493, 823246914, 823282844, 823328794, 237731869, 162332674, 431308802, 823345211, 691912710, + 823377930, 823394306, 823410745, 494272524, 823427985, 159449144, 823480861, 823628318, 823705823, 320946229, 163726464, 823743007, 823854205, 287113232, 823935026, + 77512716, 408272912, 823967775, 823984134, 824000533, 824016912, 3162127, 824037920, 142180363, 824119841, 824349218, 824426502, 824447523, 824509331, 824557614, + 441466920, 824609399, 109150271, 824672322, 824705083, 824742436, 703250444, 458178619, 824786946, 824803368, 55132189, 824820575, 773095948, 824885298, 805224450, + 824918471, 824967189, 824983639, 825032730, 825049563, 825081872, 825098250, 825115817, 825152037, 825381362, 825428454, 825459606, 825507947, 825540620, 62390298, + 825558681, 3248678, 825606246, 825638978, 141295626, 825672873, 788152341, 825704479, 159383589, 165773340, 825725479, 825999790, 139821147, 826049988, 826081310, + 826114074, 826130463, 464928787, 826147275, 498909203, 826198202, 826228746, 826245145, 483786754, 826277942, 826310668, 826327050, 826343452, 214335490, 826361151, + 826425668, 826479144, 826525866, 219627539, 826589238, 826626601, 388825109, 826691720, 826720266, 826736668, 56164378, 826757674, 826852220, 826901480, 409273374, + 122601498, 826954283, 827150892, 827213875, 128843788, 827260947, 27852822, 52199436, 827277835, 827326493, 279150608, 827343305, 433144614, 827478573, 827544110, + 827626031, 827703325, 827719739, 827752459, 827768848, 827785242, 827801615, 218841110, 827818876, 827867650, 827900535, 827932699, 827965442, 827982846, 828031409, + 828063820, 574324774, 828096514, 138625043, 828112902, 828129346, 828162350, 828194843, 520142879, 828227668, 828260362, 828276755, 828293207, 828346928, 828559921, + 828604653, 828641842, 828703009, 828736380, 828788557, 828854050, 409272419, 828932152, 25559103, 2834721, 828969523, 829148994, 829195087, 829227036, 829243394, + 829259797, 152272917, 829276172, 829292550, 829308949, 144375839, 829329972, 130203690, 324567042, 829390864, 829407270, 829423700, 829457309, 829538342, 829559349, + 829636634, 94339088, 829653904, 829685865, 829718540, 88948751, 829735371, 829784133, 829818185, 829866043, 829901832, 829947967, 829980678, 79691807, 829997068, + 391692397, 830013677, 830049730, 457539590, 830097338, 830149174, 48381974, 830231095, 830493240, 830586911, 654983197, 830603723, 830652428, 830669814, 830701590, + 830718011, 830751668, 830820921, 147013643, 823296010, 111181845, 830947387, 830984762, 831094796, 606650394, 831115835, 831246908, 831340584, 182632458, 831361597, + 366428188, 831443518, 831537154, 654017008, 831554070, 831586783, 831620719, 831668289, 831720311, 831750156, 831766584, 831799790, 816255551, 831836736, 5309018, + 831902273, 832098882, 832361027, 832405658, 8393284, 832438295, 832454805, 20299908, 183975967, 1753107, 832492101, 832574022, 832639559, 832716821, 166068290, + 832733222, 477937676, 832754248, 832897030, 832913439, 832929808, 832946186, 832963492, 833016393, 615694783, 833078663, 45727760, 833112073, 833178179, 833229386, + 833290674, 833326668, 833373596, 833425995, 340280058, 414909334, 833504115, 833586363, 833638988, 760955371, 833770061, 833830927, 219480086, 833847334, 833863682, + 47611941, 833880095, 73531402, 833901134, 833963891, 833995199, 834027551, 469499925, 834048591, 834294352, 475136847, 834422301, 4997720, 834487119, 2506794, + 834523729, 834605650, 834835027, 834912365, 823759444, 834945083, 152946102, 10649684, 834982485, 835077465, 835111596, 7734302, 116376585, 128450619, 835223554, + 62341131, 835240023, 835290040, 413270045, 835342033, 835387411, 805224460, 835408470, 42434576, 835551270, 835567618, 835584042, 835600396, 835616806, 83591206, + 675168258, 835633690, 835665936, 7258204, 835686999, 835731547, 835764236, 835780624, 49479701, 835797839, 45252637, 45252624, 835834456, 836042833, 836075532, + 125927445, 836091958, 836124779, 139198483, 836157972, 836211289, 340280992, 836272134, 836289359, 836321286, 836338544, 836386838, 836403202, 471547914, 836419887, + 6374263, 836457050, 836517904, 356925466, 563347462, 61997092, 836534704, 134513154, 836571739, 836734192, 836796457, 47251487, 836813858, 1212456, 836846455, + 836878358, 836894774, 836932188, 786022602, 837025874, 131334236, 837058586, 837075028, 837107722, 366116885, 837124112, 837145181, 837189691, 837224025, 171459035, + 837272606, 837304779, 837354886, 837419475, 432406566, 837469460, 837518274, 837550106, 837566548, 837599251, 837615618, 837632026, 837648399, 189235202, 837669470, + 727664618, 837882463, 837943927, 837980768, 3262323, 838124512, 838172682, 838189095, 838221850, 838242913, 838320143, 838336538, 838352912, 838369309, 55443496, + 65699842, 838387463, 838437610, 2965535, 838485929, 558628918, 838534167, 838586978, 838664495, 768622604, 838701667, 208995151, 838796176, 839176805, 839355357, + 839401529, 839417858, 839434250, 839450645, 839467010, 839483434, 139018252, 839499817, 839516226, 839548966, 654983199, 839565338, 839581708, 839598092, 839615566, + 839697515, 839729168, 119226373, 839745966, 839794716, 839811103, 839827498, 122667048, 839846590, 839893007, 839910494, 839958530, 226230298, 839974943, 839991306, + 840007701, 840024907, 840089616, 246677561, 840110694, 840156043, 237731881, 840220896, 840253494, 840286219, 840302620, 840319014, 118948802, 840335379, 122699807, + 840351774, 840384528, 31424517, 840404170, 840466539, 116277277, 2654246, 840499226, 363364358, 840520295, 840712952, 209191514, 840745067, 840777738, 840794759, + 840844989, 840925210, 128155690, 840941583, 840957979, 840990786, 841023498, 841040331, 757350426, 841089108, 841121823, 479100939, 841138182, 841155473, 841208424, + 841384035, 51625986, 841416720, 780763162, 841434299, 841482252, 347144218, 775929868, 841498690, 156155914, 841531402, 841547816, 841564697, 841629752, 841662493, + 591773999, 841678870, 841695244, 267567105, 841711723, 841745966, 661028906, 841793548, 841809946, 841827989, 841891906, 841929321, 213631007, 841990146, 842006538, + 115179539, 842022978, 842056942, 842088458, 3850242, 842104843, 842121247, 842137610, 842153986, 842170424, 842203235, 842235910, 842252354, 56754192, 583630850, + 842289770, 250937350, 842399772, 842416212, 842448922, 842465317, 273351115, 775176221, 842486379, 842530838, 842547202, 262193162, 842563610, 842579970, 842596362, + 842612755, 842629142, 840499231, 842645506, 842661930, 110608396, 842678312, 842694687, 842711078, 842727455, 160743452, 842743829, 842760194, 842776604, 842792998, + 842809375, 842825734, 228245526, 842845377, 47317049, 842891306, 842907688, 842924058, 842940482, 842973237, 843005995, 843038739, 843055116, 723289633, 843071498, + 370720789, 843088347, 843120661, 213025660, 843141740, 843252012, 505463247, 843289197, 843366426, 843382805, 843399180, 114409482, 370720780, 843416745, 843448330, + 843466998, 182632454, 843513882, 214827067, 843530242, 843546729, 612319254, 843581064, 843629675, 843661352, 843677702, 843694111, 135561232, 350863372, 843715182, + 843776054, 843808787, 843825173, 843841839, 843874330, 122667019, 843890700, 843907082, 128581672, 843923468, 843939866, 156155935, 843956236, 843973059, 844005406, + 156155910, 844038381, 841498655, 844070922, 844087315, 844103701, 115703839, 844120928, 844186030, 128155685, 844239471, 121356330, 844283906, 27328550, 844300348, + 844386928, 844448227, 121356326, 844480523, 844496924, 844513292, 135577626, 844529670, 844546054, 844562891, 844611637, 844644364, 844660772, 844681841, 844730994, + 844808204, 844824656, 143441951, 844862067, 844922939, 844955674, 844973545, 845021186, 845037578, 666271775, 845053964, 845070346, 845086741, 273351115, 845103138, + 845217896, 845267834, 845316579, 845348930, 845381638, 380534815, 845398035, 845414422, 709509186, 845430877, 114409510, 845480848, 845513163, 845561938, 845594630, + 845611467, 845660186, 845676575, 124207125, 845692987, 845727531, 127238210, 845763188, 845824002, 845840390, 845857369, 845890007, 845923211, 356090662, 845987852, + 625360902, 846004240, 846021369, 846053392, 846069786, 846086165, 846102559, 846118928, 846135306, 143081474, 846151746, 564887573, 846184488, 846201291, 846250022, + 846266399, 846282793, 846299568, 846332337, 846365197, 846418549, 846462978, 116752410, 846479403, 846512149, 588218427, 846528527, 846544908, 846561299, 846577685, + 420122083, 846594063, 846610453, 846627680, 846697078, 846807096, 846839810, 345784356, 846856223, 846872582, 846889001, 846905647, 846942839, 143491093, 728973343, + 847020256, 847053973, 847090296, 268468255, 847152635, 847200287, 847216642, 847233045, 847249474, 847283078, 411762690, 847319673, 847450746, 3538985, 847528567, + 847561192, 773718028, 847598203, 847660062, 847692078, 847725003, 139641354, 847775040, 847806485, 847822875, 847855656, 847872031, 228851718, 683589658, 847889324, + 847955209, 847986694, 119226374, 848007804, 848052264, 848068629, 848085529, 848150534, 848166933, 420120762, 848183322, 848199708, 848216971, 848282775, 49479721, + 848335485, 848494614, 848514531, 848560173, 848592898, 848609306, 184107014, 848625748, 848658921, 848707836, 7096107, 848745086, 848887838, 55623692, 321716334, + 848920635, 170999915, 848954412, 784091648, 849003256, 849036297, 849072767, 849217080, 849281036, 55115883, 849301232, 58769420, 849380155, 849429605, 113656045, + 849482368, 849559618, 849592388, 849641538, 849678192, 849723402, 173441063, 849740668, 849789030, 849821717, 849838727, 849887288, 849924737, 850018370, 850053178, + 850121346, 850236035, 10829850, 850346026, 297222175, 850367108, 850432645, 850493450, 117901115, 850510584, 2196392, 850542611, 809517122, 532676646, 850558978, + 108315678, 850576224, 850642585, 850694790, 850739202, 850760327, 850804764, 850821122, 110723109, 850839844, 480608884, 850906056, 4409010, 850973320, 851214438, + 3473410, 851251849, 851284618, 851361804, 164036634, 851382923, 851427356, 851443740, 2179206, 851460124, 33243164, 851481228, 151175196, 851510174, 851542032, + 851558440, 851574805, 152027167, 851595917, 851656820, 851673197, 851705884, 2752517, 851722356, 851740177, 851773764, 851804276, 766951453, 851821035, 14450698, + 308101151, 851853338, 851870376, 619200514, 851907214, 851968091, 852000778, 852017173, 477937701, 852033564, 852054671, 852115572, 852131859, 79937546, 852148252, + 852164630, 766574708, 852181033, 852197418, 62586902, 852213825, 852267664, 852313006, 852347462, 758071312, 852382353, 852574229, 852590595, 852606982, 17809450, + 852623467, 852656315, 852688919, 9961603, 852705287, 641990678, 65077382, 852721772, 852754470, 852770828, 852787226, 852803715, 1900553, 852819994, 852836784, + 852873874, 852939411, 853033721, 853065754, 853082128, 853098511, 853114892, 853131285, 853147674, 853164048, 242466873, 853184648, 853214282, 853245978, 853262352, + 853098511, 853278731, 6701092, 853295393, 853758613, 853807766, 853987991, 854065178, 854083232, 854119064, 854197139, 854247051, 19038214, 368099796, 854311759, + 289932355, 854347398, 854458911, 854507951, 854540763, 854574044, 854606259, 854641656, 131891210, 854687780, 854704807, 854741657, 70909975, 854900792, 854936324, + 854982763, 150585444, 855020186, 855197812, 855261672, 855295070, 855343130, 855364251, 199458924, 855490591, 855506954, 556400699, 855523866, 855556108, 855572490, + 855588885, 855606155, 855670866, 855703984, 855741084, 855903497, 855950326, 855982082, 856000048, 856031244, 371884061, 856049301, 856117917, 856229107, 4177951, + 856280280, 856328949, 856375327, 856391789, 856429214, 856588369, 212107290, 391118860, 856622165, 153993895, 856658591, 856784934, 783237186, 856805159, 5505065, + 856855200, 857163348, 659341338, 857260044, 141541378, 857276418, 857292821, 3162131, 857309256, 4703222, 857374783, 857412257, 857491201, 482919433, 857540577, + 857587733, 198328356, 857604150, 3900247, 857636918, 857669691, 857706004, 857767967, 159878231, 659341314, 857785595, 857833503, 857849894, 857866377, 59818119, + 857887394, 598852455, 857936547, 858062905, 192200725, 858079339, 858112002, 858129438, 2162724, 858163470, 858215076, 858342335, 3244507, 52576266, 858374991, + 858406922, 45875206, 858428069, 2195889, 185484713, 858538003, 275464214, 858559142, 269664935, 858850694, 858916042, 563495391, 858965086, 65699880, 859017895, + 389136960, 859144495, 859176981, 2196313, 3211711, 859193647, 859226171, 798310438, 859263656, 859340822, 859357200, 859373597, 134037516, 859393235, 859443881, + 859572433, 859624106, 8393387, 859701291, 859738796, 859799615, 859834063, 859865147, 555402064, 859898302, 859963502, 127713311, 859996247, 860045334, 860062128, + 860094474, 498291373, 860115630, 860312239, 67059844, 860389378, 860405798, 860423076, 860471306, 860489193, 860536848, 860553235, 860569637, 860585993, 14172183, + 860605036, 860672688, 860717072, 860734428, 860770993, 860900672, 860962835, 8391354, 860979232, 861011999, 861028371, 861045039, 861077612, 861111137, 861143042, + 861159451, 861196978, 352354314, 309559327, 861278899, 861421624, 861454391, 135840609, 861520834, 861553653, 203128884, 861622964, 861737653, 861831208, 19038220, + 861852342, 341377064, 861913897, 861948097, 740491318, 325239087, 861997504, 862060598, 561381405, 862098103, 862453781, 29901234, 862474936, 862666774, 862686040, + 862732820, 862781879, 862819001, 862883886, 862963002, 863015266, 863076364, 863092742, 863109139, 373800982, 863125998, 863158331, 19447829, 863191121, 863228602, + 863388142, 863425211, 863486176, 863523516, 222789654, 8389930, 319832148, 863670973, 863830076, 863913883, 863977570, 864010297, 6193168, 609632461, 864026730, + 864108628, 153993314, 864146110, 864244415, 126959654, 864321558, 864337922, 107757597, 864354316, 177963046, 864373017, 864438732, 864486798, 864553460, 341803036, + 864604864, 15007766, 864735937, 864785090, 864834243, 6193194, 749994036, 527090158, 45039632, 865009680, 3309589, 865030852, 383796118, 865260229, 2196957, + 865321026, 379865559, 865356632, 865405917, 865452335, 730234899, 7258178, 865485246, 865550392, 865584566, 22216733, 370540603, 865637062, 865779714, 295944218, + 865796106, 563298320, 502661122, 865812899, 58753641, 865850055, 865978596, 866025503, 866041866, 866058252, 137936922, 866079432, 866157755, 866205777, 866238502, + 102793258, 866254905, 9207809, 866276041, 866603722, 2342934, 866731387, 866796574, 866829250, 866862174, 866915019, 29900821, 152242362, 867026120, 110234461, + 507461678, 867062476, 867209933, 140247498, 867291854, 867418171, 505544714, 867451805, 867535118, 7307275, 867582796, 867631160, 867664719, 867701455, 867831341, + 867879429, 7094703, 784990220, 867930832, 868059901, 868106734, 868139553, 868189270, 868237322, 868253738, 147292182, 868270617, 868340433, 868434821, 868567223, + 868614154, 427132053, 385499163, 405831702, 868631643, 868663520, 319636303, 566396073, 868697118, 681721858, 868733650, 868827681, 868876747, 868925478, 49086502, + 868941883, 868979411, 869140219, 869192124, 494043202, 869253136, 73531411, 869270638, 253788170, 869351484, 869434306, 363741196, 869470932, 869646395, 51019805, + 869679991, 869715065, 869827082, 869864149, 200736780, 869913302, 5310647, 870187976, 870269846, 870322903, 112279564, 657052376, 870416863, 870449164, 71188508, + 110118736, 870470361, 141411358, 870568666, 870662251, 568017384, 870699216, 870776834, 147423238, 870794270, 870827176, 124715092, 870876987, 870929115, 870973899, + 871022623, 871040084, 871088182, 871120993, 871190880, 871224028, 871334341, 133742594, 871366696, 396279820, 871383435, 97681423, 871420637, 269189571, 871631663, + 871729112, 871792671, 111149058, 871809483, 871858232, 110134570, 871895774, 491620261, 872153518, 872202266, 872218626, 121356317, 872235438, 872284590, 872333597, + 214810653, 872367232, 52199445, 872415234, 119226404, 872431682, 642695210, 872465266, 872501983, 872547503, 872579214, 189546984, 872613369, 597475344, 538198118, + 872694063, 872727374, 2130352, 872796896, 872906859, 872939560, 543309852, 872955906, 329842709, 872972307, 872988708, 737771539, 873006543, 873103372, 873119750, + 131989525, 873139621, 873218956, 873271832, 59818121, 873599714, 873955787, 874005122, 310296621, 874055030, 218415135, 874107619, 874155117, 874234167, 874287844, + 2196304, 874496087, 3227707, 874549989, 874648294, 8393447, 603869928, 8606441, 2195810, 874943210, 2195654, 2195610, 874987522, 875003942, 19038246, + 875021858, 805093378, 147423242, 423215125, 875069921, 875122318, 5308640, 875167846, 875205355, 875303660, 875385581, 192872486, 875462737, 875499375, 875561875, + 875610188, 875645282, 875692065, 875741243, 875778798, 875842135, 875891382, 875955174, 7095351, 875991791, 876036118, 876056672, 81166338, 876103518, 876167197, + 110231855, 876188400, 876331150, 876365065, 876398191, 116376566, 876446694, 136855618, 876479544, 876548849, 876891684, 876942066, 877035536, 701726760, 877056755, + 877281364, 408404490, 877314079, 99516442, 877330891, 639107082, 877382602, 877412418, 877445204, 877477914, 38127041, 136183820, 877494763, 877528354, 877576198, + 877593513, 877644047, 877712116, 877777653, 877871116, 877887526, 47611932, 877905701, 869615505, 156123163, 877957878, 878019097, 878085491, 878116903, 878154487, + 208503817, 878269176, 878366448, 423411714, 178080634, 5865947, 878449401, 878560872, 878624849, 878662394, 836812802, 324534312, 805224464, 878711547, 878886940, + 338264102, 878908156, 2801690, 878973693, 248398878, 879034437, 879070049, 879132714, 879149963, 879214630, 879231840, 879297457, 879334142, 879416063, 879529440, + 879575343, 879612672, 135497365, 879661825, 879738967, 879788491, 879842050, 738230314, 879956739, 160579606, 880018217, 880050491, 880085043, 880132132, 880148490, + 880164905, 51871770, 880186116, 880525318, 23920651, 119440225, 880541759, 880574509, 880607666, 880644869, 880721952, 207438812, 285344320, 880754769, 103284767, + 880789750, 201572381, 43532304, 880841478, 880923399, 881003158, 881054472, 881197122, 881234697, 881328143, 643055638, 140607951, 881349386, 881411102, 881442882, + 881476055, 881509400, 881557542, 71483398, 881574348, 881606702, 487211013, 881655820, 4177935, 499433493, 881677067, 412139938, 881969382, 882021132, 47398914, + 882065942, 882103053, 882180162, 882213827, 47710229, 882262018, 32325668, 882278432, 4980751, 882316046, 882507786, 882458653, 130859036, 882524214, 529022992, + 882556944, 153731374, 882573324, 882589723, 882622551, 409258544, 882671626, 202440733, 882692879, 882755089, 882789787, 882851947, 882889488, 882967699, 449692127, + 883004177, 883179588, 883228725, 500760630, 467321135, 883261499, 883294211, 381550634, 883310597, 883327007, 496910769, 883348242, 883490819, 883507202, 883523595, + 7602186, 883539970, 210206739, 883557294, 52363269, 883594003, 818937892, 668287110, 883741460, 883785764, 142180359, 883802230, 883834908, 883854199, 717226100, + 883884148, 883900435, 883916828, 283967530, 144146443, 883769380, 883933646, 883982377, 477937721, 883998748, 884015141, 513998851, 884424797, 884478742, 884555807, + 1212422, 884572384, 56164374, 884609815, 884839192, 108314733, 884949856, 885015050, 119357548, 885052185, 885162083, 885199642, 117424138, 885342274, 554729482, + 885379867, 6193162, 885489710, 885541720, 885592860, 885638007, 885674781, 885723934, 885869059, 885949308, 886002463, 886046786, 886084384, 886199073, 886276108, + 886292518, 49086502, 886312240, 6374409, 886358487, 886390796, 109052775, 886412066, 886456339, 886472726, 244891660, 886493987, 46710824, 886688809, 886751764, + 886801231, 886838052, 345161812, 551239904, 541589516, 886887205, 681411614, 886969126, 887161818, 5882357, 887210902, 887264039, 887423796, 887472212, 887506885, + 367427600, 887537680, 434716684, 318554118, 887554060, 887570953, 887603231, 887624488, 887690025, 887869118, 201393061, 887935786, 888050475, 888111539, 888144718, + 242368522, 888209420, 888225818, 888244165, 316293344, 888279852, 888422440, 888438875, 888476461, 888640302, 888736244, 212730154, 888782907, 888820527, 888982747, + 889078219, 155828278, 889127745, 889160139, 889212861, 889295664, 889377585, 238370844, 889471410, 889508658, 889590579, 48513140, 889672500, 2200373, 889864208, + 2196589, 889880616, 552894501, 889898184, 118685727, 889929744, 56262713, 889948660, 5313334, 890000183, 890213176, 890306626, 890343985, 890388520, 153567270, + 890409785, 890471326, 890505879, 890590010, 112935343, 416874528, 890671931, 890852156, 890945576, 6946828, 890966845, 891076707, 565231622, 891109613, 118505512, + 891142156, 891158560, 891191897, 891224906, 73531402, 891273242, 891289631, 891305996, 114114566, 891322450, 891355162, 891372121, 150601787, 891409214, 891469906, + 281935883, 194691499, 891503425, 891536428, 891589439, 115769866, 282820639, 891700087, 891736896, 892130113, 191545360, 30392326, 892257408, 892305434, 892321813, + 629358608, 892339575, 892420106, 892438684, 892485713, 699613195, 892522890, 2359401, 892616734, 892649482, 7045122, 892670786, 618464425, 892747830, 892780574, + 737771531, 892813857, 892862571, 2850826, 2113593, 892900163, 892961223, 893014852, 893077065, 893160987, 648740889, 87539733, 893227845, 893272171, 2834495, + 893304898, 893338427, 893386798, 5341945, 893439989, 2198068, 893469209, 893535801, 893637446, 893714735, 893752135, 893801288, 893845509, 893861910, 11010064, + 893883209, 136790038, 893948746, 137101378, 894107885, 894140462, 153748382, 894194507, 894271554, 894305103, 894339965, 894386268, 894418956, 3686438, 894440268, + 894517260, 179159050, 118031295, 3178512, 894538573, 894669646, 108315119, 894764783, 894829558, 894861771, 894911833, 169787413, 894948175, 586481686, 895009243, + 140247472, 895041967, 895074607, 408289301, 895107905, 895139861, 223019518, 318554118, 895156683, 8392987, 895205416, 895221819, 895254752, 895292240, 895636305, + 895815635, 895862259, 895895203, 895959106, 131335406, 895992238, 328073242, 896042382, 896111442, 113115174, 119357935, 896237871, 199869643, 896275283, 896385499, + 896419808, 896467403, 896516527, 896552019, 260461396, 896617721, 896668501, 273121332, 896761919, 158843359, 896798801, 896845360, 110298129, 896878199, 896942082, + 506904595, 896963414, 208994363, 50266124, 897024006, 897040403, 185319446, 110232779, 897056822, 897089565, 246087702, 897110871, 897291096, 897356633, 897417244, + 897434201, 897467844, 897499984, 3211682, 112935591, 897533318, 897597499, 897631041, 897663912, 897700698, 897794058, 23368539, 897810730, 72040706, 573653863, + 897848156, 897990678, 898011997, 116375651, 109052840, 898109516, 898154926, 898203694, 2965515, 898253268, 457064470, 898288413, 898384331, 898433062, 4997147, + 898450385, 898498570, 898514998, 898549079, 898598368, 285034700, 181256737, 898634590, 898696351, 441074098, 898727962, 898744359, 898782047, 898909536, 898974750, + 899006476, 132857868, 899027808, 899073822, 858996762, 899140472, 899186796, 899220348, 119999024, 899268618, 506413098, 899289953, 899353158, 899383756, 10944647, + 899416102, 2752642, 899432474, 899453794, 899498513, 899530811, 899568483, 899813104, 158744578, 899896164, 899956782, 900010853, 900122810, 900156620, 250364263, + 900219117, 900253607, 900284447, 5177347, 900301908, 900349962, 900371302, 900434446, 3228327, 900485991, 900563303, 900596559, 900630105, 900677991, 1818636, + 900710421, 900728137, 7733681, 56721419, 900779711, 900841494, 900857858, 900874259, 160759830, 900895592, 901070870, 901087263, 229965850, 901103723, 219529237, + 901136424, 901152778, 672137235, 901169183, 901185546, 223723532, 213925900, 901205345, 223723522, 872431628, 901251164, 901285067, 51626000, 901316639, 431996934, + 901337961, 901465850, 48545832, 901496858, 901513219, 117358614, 901534570, 901616491, 901660701, 1097744, 901682028, 2801667, 901759007, 901775372, 292110374, + 901742595, 901791746, 381550602, 901813101, 610779138, 901857292, 901677085, 901875033, 901906474, 29900837, 901925852, 901972010, 901988354, 214630426, 902009710, + 902053904, 479133706, 572047381, 902632304, 902726490, 902758534, 902774825, 902791194, 14549004, 902807553, 902824068, 902840361, 38879235, 902856709, 52953097, + 902873103, 902889513, 7307285, 902910833, 902938627, 902955026, 902971526, 902987777, 903004201, 38879251, 514015250, 903020556, 103596162, 903348361, 11059242, + 903366023, 903402355, 152962346, 903495689, 903512195, 34553987, 903531233, 882835563, 903626818, 903664500, 903877493, 903971726, 904041334, 159727632, 904134710, + 904168387, 904221559, 904495864, 904532856, 50249769, 904577083, 904614777, 904760900, 49774597, 154812514, 904840201, 3227747, 904871979, 904904811, 332103717, + 904937513, 1785897, 904958842, 905039798, 905101333, 905118573, 905166907, 134152218, 328073238, 905204603, 84934678, 905265174, 905286524, 905461770, 392921093, + 905478576, 905510922, 140248593, 905527336, 614858754, 4980748, 905543696, 905560090, 140789498, 905576878, 905630589, 905794430, 905872756, 905921430, 905974655, + 22888453, 906199105, 906248232, 586072171, 906267920, 906335104, 906413385, 906466177, 906511276, 3736231, 906576303, 2197009, 906609177, 906679170, 48021520, + 446873602, 906761091, 906903991, 139640939, 216006668, 313786424, 906937742, 907006852, 124732225, 907116620, 907149334, 659341343, 907165708, 907183044, 907231261, + 907247642, 907264016, 907280399, 114409487, 907301765, 907481990, 907580295, 907673704, 907724121, 907755561, 66945062, 907776904, 907870260, 1920257, 907907977, + 908034966, 697483274, 908088202, 727760934, 191646201, 908148776, 160710698, 908170123, 908231115, 908283129, 908329878, 908383070, 908445232, 908476447, 158695435, + 440156593, 908497804, 908741565, 908805150, 908836902, 267141132, 908853269, 908869658, 908886047, 908902419, 732758491, 908918796, 908935174, 908952040, 908984404, + 909018601, 909066261, 909082690, 141377555, 45039673, 909120121, 909249248, 909295675, 909333389, 112394256, 909411328, 909443084, 456966154, 909459515, 909492250, + 234357545, 909508634, 909525018, 19268016, 909546382, 909606996, 909639709, 69845004, 909661071, 909754370, 909770778, 909787165, 909803551, 909819920, 909836330, + 841383962, 909855071, 6701077, 909901836, 909918234, 126042122, 427658620, 909939600, 910114897, 910150004, 276529178, 910218129, 910311465, 202063888, 910332818, + 910377044, 910409788, 910492495, 3719457, 910524437, 910542324, 910590411, 910639913, 910671891, 910688277, 910704671, 118636563, 910721039, 910737632, 910770263, + 8606611, 473251871, 910824340, 243220496, 44613673, 910983222, 911015947, 792854540, 911032336, 911048715, 911070101, 394526741, 911152022, 538722343, 911245772, + 114294826, 911281361, 911327238, 911343637, 128892940, 911360016, 395509800, 911377015, 911409154, 911427161, 911475123, 911512471, 911605772, 911622170, 241827851, + 121274397, 911638564, 911654931, 911671312, 911687706, 911704090, 911720470, 911736863, 3473411, 911756253, 911802394, 911818754, 911835142, 7372831, 118652930, + 911852636, 911900701, 911917072, 159760410, 911933452, 911949834, 911966239, 911983026, 6375907, 912020376, 912376108, 912408582, 53542919, 912427823, 912524297, + 912561049, 912654399, 410748005, 391921676, 266878982, 912692122, 912823195, 912933624, 912965935, 246498167, 912998412, 324534303, 913014786, 2129930, 913036188, + 913101725, 913260570, 316293418, 406339586, 913277165, 913314718, 892403728, 119357521, 913473620, 913507850, 913555886, 913605641, 913642399, 913834003, 303611906, + 913851880, 913904544, 913948703, 913965489, 913998283, 914052001, 914112552, 309575706, 914133088, 914179254, 914292762, 914310027, 213073922, 366116895, 914374716, + 6620001, 583403473, 914456636, 914539305, 914571735, 914604919, 895991862, 914636810, 914655171, 110183287, 914702346, 914719159, 914751923, 914785280, 914817483, + 667664465, 914871202, 914932015, 914969507, 915035044, 915111966, 869466606, 915149733, 915210266, 915226653, 24298957, 915243010, 915260023, 915292247, 915342304, + 915390474, 915407768, 915456002, 915472415, 84721674, 915488770, 446792440, 915505455, 915538442, 915570717, 915592102, 915701800, 153714726, 915723175, 153862154, + 915783701, 113246702, 915805096, 916013370, 916045836, 916063065, 66814809, 916100009, 916160592, 916193306, 152174594, 916214698, 271925289, 916275658, 155975706, + 916313003, 3211790, 916471827, 916488194, 916504591, 916520962, 11665417, 232325591, 916542380, 5505043, 916689837, 916750357, 916767584, 916832693, 380551199, + 916867575, 916897804, 916914182, 84738067, 916935598, 916996399, 128565267, 917028876, 917045258, 917062263, 917094442, 177766879, 917111309, 665227363, 917159962, + 917176352, 917209193, 115654662, 917241902, 917291496, 2195558, 917323878, 917357911, 457490469, 917405727, 917422091, 7290911, 7962650, 917443503, 917700701, + 917749791, 917766165, 917782530, 277020698, 349388812, 917801241, 917866600, 917914725, 110182835, 917967792, 918164401, 152158234, 918257692, 273448972, 918274150, + 434980635, 918306828, 918323304, 918372374, 99500044, 918389037, 918421533, 918437925, 918454293, 918470692, 2326556, 918492082, 918553113, 918620968, 918684119, + 918716432, 918732907, 918765614, 918819763, 918962182, 113246258, 918978562, 918994954, 919011359, 241811458, 919032756, 919076895, 919093472, 919126066, 919158796, + 915472410, 919175222, 919212981, 919276742, 919322897, 278970399, 919355432, 608796688, 919371791, 919388181, 919408874, 919453734, 919470096, 919486506, 658063792, + 919507894, 1918323, 919688119, 919748645, 2031644, 919765023, 919782569, 919819192, 919900070, 919946380, 919999417, 920109599, 920163258, 920207372, 122044454, + 437370892, 905166850, 920224178, 920256578, 920289299, 194084886, 171753474, 920310715, 920567867, 920601067, 920638396, 920780893, 920835005, 920884158, 179716098, + 920944656, 920961784, 920993861, 921026619, 921064204, 921108496, 921127337, 921159476, 921240729, 437370911, 921293141, 921339224, 921391180, 921441215, 921534571, + 921572288, 921616424, 921632778, 803307539, 143720469, 921649211, 267567142, 921681970, 921719745, 921845772, 335413258, 16498700, 921867202, 453689354, 722960396, + 921949123, 6619192, 922025996, 138232822, 922042380, 634699802, 922063812, 922141587, 901988364, 922194885, 922370101, 922402838, 9551888, 8389727, 922424262, + 922484757, 922501123, 922517546, 922533914, 922550312, 922566671, 283197455, 922583052, 922599453, 552091660, 120143874, 922616721, 109215775, 922664986, 306020355, + 922681370, 922698031, 758710291, 257064962, 922735559, 922797225, 307235395, 922833864, 923025410, 409305521, 923041814, 923058188, 515031985, 923077273, 923140141, + 923177929, 923288778, 923338119, 923370281, 923402324, 923437792, 923484219, 923516978, 923549755, 47398943, 299827250, 496025616, 923582566, 923615316, 923648059, + 6225960, 923680780, 923697612, 923729949, 45531177, 923751370, 923828255, 118669324, 923845067, 923893779, 923910184, 923926566, 779075586, 923943926, 923975701, + 923992989, 432406547, 924079051, 924305347, 924352524, 924368922, 924385311, 924401674, 924418467, 8159241, 924451849, 924483600, 924502335, 924537745, 6111247, + 924631682, 924680223, 103743530, 924696849, 5881963, 924729365, 924745758, 924778561, 924828327, 924860454, 43237378, 925319302, 925335667, 15483015, 925352070, + 925368455, 22200329, 925389773, 925614096, 925630490, 925646850, 925663253, 925679682, 925712406, 925728799, 925745158, 553156629, 925761538, 263716892, 925777930, + 925794363, 29032661, 925827375, 68206667, 925860787, 925892634, 925909008, 99893263, 925925397, 925941791, 925958163, 174457135, 925974594, 926007735, 2343506, + 926040523, 926090282, 926192590, 121929749, 926269729, 926302237, 2162700, 926319043, 926351389, 570884112, 926370088, 926435884, 926466124, 926500480, 237731851, + 926548877, 926631210, 926684111, 926761379, 47251484, 926793835, 926826555, 926859330, 926892064, 926929416, 474054698, 926995408, 927273937, 927334416, 927350810, + 8388917, 927367189, 927388626, 927465498, 927481895, 927515161, 927583535, 927613848, 927662369, 927699923, 927891475, 927907856, 209993768, 927926175, 927989786, + 928006173, 928022559, 629440528, 928038924, 928055307, 928071711, 928088498, 928120842, 928137273, 928153640, 648347686, 928170946, 928202762, 928219155, 928235532, + 928251919, 928268310, 928284674, 909803558, 928303573, 928334048, 928366651, 928399402, 928415754, 928432140, 928448533, 928465371, 928497683, 928514070, 814284802, + 928531324, 928579626, 928595970, 928612373, 928628767, 174440505, 928645139, 796426279, 928664765, 928712092, 928759814, 928776223, 636502032, 347144194, 928793800, + 928825356, 928841747, 814284822, 928861772, 928907286, 928923660, 928940058, 46088223, 928957769, 929005578, 929023577, 66863163, 929071125, 929087514, 390594990, + 929103884, 929120266, 929136661, 929155826, 655409912, 929223636, 929335452, 929382658, 11944068, 929415227, 133414938, 929447946, 929316880, 929464342, 929480706, + 929497098, 929513493, 449660137, 929530904, 929579232, 929611798, 929628172, 929644570, 929660944, 929677341, 929693698, 929710099, 929726485, 141819940, 929742907, + 929775637, 929792087, 929842017, 929874974, 929907711, 929960917, 930087019, 50511900, 119048613, 22888488, 930119746, 930153481, 930185751, 910557276, 930218044, + 930300008, 280035435, 930349115, 241467395, 930381908, 930419670, 193660063, 48545798, 930485207, 930742340, 930793823, 930842097, 371310881, 508297675, 930876602, + 930906142, 275464218, 930938911, 809567232, 930955295, 930971658, 667811842, 930993112, 931071523, 931124185, 931250204, 931266572, 931282965, 5309640, 186318858, + 931300220, 136120476, 931348492, 420757530, 931364866, 7307286, 931384617, 931451866, 931545100, 931561493, 931577878, 931599323, 931643418, 171507714, 402309148, + 5947404, 931664860, 345703535, 931790932, 931823626, 583403629, 931845085, 932055791, 299696130, 2834871, 932118554, 15351820, 932139998, 932315234, 932347963, + 64765971, 932385759, 932495892, 932547738, 932594115, 932631520, 932746209, 2359729, 932806958, 359039026, 45433056, 932844514, 655065142, 8390672, 932989353, + 933019679, 704462869, 933038636, 933073891, 885424365, 933167147, 159383588, 933204964, 385662997, 933249248, 933281879, 933330975, 241827869, 933350326, 229752854, + 933401573, 450773008, 933450726, 933528153, 371867664, 933560366, 933609564, 210206741, 2834903, 933647335, 933792469, 933838870, 933855258, 115343362, 933873028, + 933939356, 153190507, 4309099, 933986734, 934035887, 934073320, 934248524, 133414918, 269484074, 649691176, 934282306, 934347055, 912506890, 934379607, 934430252, + 654018238, 934466537, 934679530, 934740025, 182861826, 934757662, 934810603, 934903814, 4112400, 934920792, 336838682, 934953019, 251806641, 934986537, 935019529, + 935052223, 935084091, 935121900, 935199567, 935236589, 366166047, 935334894, 935411743, 147652637, 935429003, 935498735, 935564272, 935628319, 173490602, 935706626, + 10371081, 935728113, 1900546, 935842802, 935938315, 275972223, 117900309, 935986581, 936034408, 936083522, 219824171, 936121331, 4947999, 248398857, 936547317, + 936708601, 936755238, 654017974, 936771899, 936809462, 936869919, 383860751, 936886324, 936919078, 233473851, 936935443, 936951848, 928677926, 936973303, 937135323, + 619003915, 248512549, 937235448, 937312258, 123273245, 18153488, 937328699, 937361414, 937377798, 937394823, 115179526, 937448441, 937509303, 282804290, 937541740, + 937574431, 937590790, 937607190, 661848109, 937628666, 122568707, 937721922, 937754627, 937771046, 937787458, 110677540, 804847637, 937820705, 144359427, 937874427, + 937923580, 937984432, 938016813, 938050719, 144375820, 114409478, 938082323, 129417238, 938102109, 938181900, 244170792, 938229791, 938246253, 938278924, 938295322, + 6620098, 938311696, 938333181, 139477471, 938393659, 2196489, 938431486, 938546175, 938607785, 820953098, 938644480, 412287014, 938770498, 938803268, 938852983, + 147063702, 938885751, 8391421, 173965328, 938917919, 938935305, 938972161, 939099527, 59260944, 939130939, 939168574, 939229230, 939283458, 939360268, 939380016, + 134840451, 939425831, 278413333, 939458995, 939491631, 939524981, 939557088, 939592061, 939674705, 939791363, 939917352, 198246412, 939935658, 3473429, 940004356, + 940086277, 940146912, 122044426, 373555305, 940184582, 184386535, 940262223, 940295029, 940326922, 940344228, 940397575, 940556512, 940589078, 940606358, 6373823, + 940659371, 940720144, 146653203, 52330506, 940737383, 940769504, 940802114, 940835728, 200589318, 940867614, 940900418, 136118667, 940933139, 631718191, 940949550, + 940998675, 801505292, 941015076, 941032441, 140771639, 941118472, 941162527, 207192129, 941178892, 110395418, 941195276, 941211654, 941228071, 941261718, 941311064, + 941360022, 941413385, 941458698, 941490479, 941523791, 941560842, 941604903, 941637644, 941654056, 187744258, 55033887, 942085131, 654934054, 942145557, 137675595, + 942161966, 942211110, 942228969, 942276661, 942309435, 942342165, 942358559, 942374928, 942391655, 942424076, 942440486, 701530124, 942456924, 942494732, 942658573, + 942752680, 942784527, 661848109, 942800902, 942817320, 729006118, 942833720, 942866886, 410435586, 942899222, 942915586, 942932006, 942949199, 547831823, 942981423, + 943013898, 943030293, 943051790, 943113514, 943161774, 518308129, 943210515, 661028902, 943226964, 943264783, 943325250, 943358175, 943391321, 515244034, 943423595, + 640434197, 841744386, 943461392, 943505410, 943521811, 943538198, 137675399, 771637254, 625688591, 943554571, 351240220, 943570963, 943587366, 943604559, 576225299, + 943636495, 943652923, 943685644, 213958685, 943702045, 943718431, 25559959, 943739921, 943931402, 941146154, 943952914, 944029747, 944062480, 944078901, 944112463, + 944149523, 235439104, 944215060, 944291906, 944324707, 944362517, 944521278, 521699354, 944570399, 944586762, 944603190, 200556565, 60227596, 944635963, 128581643, + 944668726, 944701461, 944717850, 944734239, 944750657, 944799784, 944816147, 944832550, 52609036, 944848934, 944865282, 393363462, 944886806, 2801676, 67043350, + 944947266, 944980923, 945046028, 945079687, 945111052, 945128184, 726695967, 945160258, 117489670, 140247092, 945192986, 945209881, 115818507, 945280023, 945406015, + 945440134, 945509400, 945571412, 945668112, 945684521, 31424553, 945702260, 945750042, 945767031, 945799234, 945837081, 61456396, 945919002, 946164763, 946209448, + 946242791, 946290714, 2834495, 946307084, 55377941, 946328604, 946438170, 946454540, 196952085, 946476061, 946570442, 417596406, 294207514, 946618370, 946634805, + 946667586, 318590256, 946705438, 539656221, 329842694, 946750287, 946782218, 946798604, 946820127, 946914220, 946979724, 947027997, 271631193, 947049504, 947211748, + 107757589, 947257815, 947290134, 261182497, 947306580, 947340680, 947372098, 947406496, 947437606, 119226409, 947454011, 947486722, 947503211, 232030219, 947541026, + 947650571, 947666946, 947688483, 947732492, 246562837, 947748880, 947765680, 947803172, 947896779, 947946232, 7307293, 947978670, 948028201, 845725738, 948065317, + 948125718, 948142101, 948158476, 116277258, 415776780, 2195770, 948175385, 948240855, 948273171, 191594498, 112459782, 948292302, 518766683, 948405879, 948470195, + 948507686, 948551696, 114212890, 915701791, 370720796, 948573223, 948719571, 124551178, 180764714, 948764674, 948781539, 50937872, 948813835, 948831055, 948863014, + 948879362, 123666442, 948895784, 948912159, 948928538, 948945814, 948999208, 250937386, 949064745, 949125720, 774227546, 949157928, 949174284, 162501674, 949191710, + 949223524, 949257035, 31342724, 428015647, 949326891, 949502552, 949534730, 31424531, 949556268, 949616666, 949633055, 250937354, 949650777, 949682713, 226246713, + 949749236, 949802029, 949965870, 950009894, 129400834, 950026282, 940998694, 950043689, 950108192, 950146095, 950337562, 950353951, 338264070, 950370306, 950386719, + 950403082, 950420299, 950485667, 3702822, 950534228, 950566950, 114409510, 363364362, 950583302, 950599746, 950632450, 950648838, 837238834, 950667107, 950730764, + 129876076, 950749367, 950797627, 950830080, 950863417, 950965296, 951043102, 951075447, 951107596, 738085096, 951125115, 951161905, 183369749, 951255132, 951287820, + 951304202, 951320588, 190087208, 951337536, 951370826, 177963019, 951402527, 951419351, 153731180, 951454812, 951500812, 951517210, 951533570, 951550487, 839548947, + 951584134, 951648349, 951697424, 951713807, 951730823, 843874320, 951784498, 951861264, 951877642, 951894375, 951926796, 951943178, 951959573, 951975975, 952008742, + 952025115, 952058159, 272531472, 683851918, 952090683, 952125039, 383320074, 952172555, 952188974, 952243251, 952402399, 952435182, 952467466, 952483842, 200851475, + 952500239, 251330582, 952516639, 952533002, 952549392, 952565775, 952582166, 952598559, 952614950, 42598875, 46088249, 325173250, 952636468, 952849461, 952909855, + 952926218, 952942608, 952958986, 1900573, 952975379, 115179542, 8994844, 952991782, 953008180, 7372821, 953042151, 953095222, 953139230, 953172933, 953221146, + 353239343, 953237516, 953253914, 953270575, 115196343, 656982092, 953303100, 953385935, 953439287, 953634066, 195919882, 953696282, 140608089, 953713241, 953746585, + 953794591, 953813405, 637501451, 953860098, 953876490, 125584207, 953892894, 953925642, 141000716, 953942018, 953959547, 953991190, 42598832, 954007606, 954040335, + 911442144, 954056763, 954089487, 219578390, 954105878, 954123279, 954171402, 954188694, 954237165, 954274872, 954318864, 954335247, 954351618, 954370116, 954417181, + 738377794, 954434977, 954482699, 636486479, 954500736, 464928783, 954548236, 954564716, 954597407, 954613803, 954647675, 954679362, 954712976, 954744848, 394067984, + 939606082, 954766393, 116376046, 954843568, 702398475, 685212080, 954878865, 954975530, 955028538, 955090486, 955138582, 955173498, 549519398, 24297574, 282558580, + 955220060, 955252776, 955270060, 955334764, 955368334, 955438139, 955498955, 955547735, 68228156, 955597251, 955629608, 955645983, 126074890, 112738335, 955662435, + 955695125, 192495642, 955716669, 955858975, 51757062, 955876932, 955940892, 955957274, 712900639, 955973686, 18153479, 956011582, 956072382, 956137556, 956171000, + 956203020, 956219402, 956236407, 956666944, 56655910, 956809247, 147652627, 956830785, 956924504, 956956678, 797245461, 138641871, 956975039, 957072682, 957120533, + 957136922, 2293762, 375259157, 957156831, 957235210, 59523100, 957251622, 627064891, 957273154, 3244132, 957399083, 110247999, 957436995, 957628492, 544882776, + 957661205, 957678911, 957746425, 957792287, 957812725, 750469151, 957841410, 514015243, 200736794, 957862980, 957907476, 2261030, 957956142, 958005355, 958038028, + 2850853, 958056589, 958103568, 128991243, 205209612, 958125125, 958190662, 958387271, 958529749, 958565322, 958595111, 371884044, 958627879, 958663007, 958710231, + 165904412, 958743897, 958775312, 10829834, 110231804, 958793095, 115523596, 958826726, 958877152, 183975976, 958927944, 958988719, 959023213, 959075401, 959136162, + 959168943, 110118163, 959201817, 177963029, 959267576, 44318751, 959299640, 959332354, 445841418, 959348778, 944635916, 959370314, 959480487, 628981800, 150914207, + 959512675, 959545365, 959566058, 959612574, 959676446, 959714379, 204587020, 959856671, 959873909, 959905823, 959922705, 959955247, 959987764, 960021534, 960054157, + 960140364, 25560719, 171442479, 960184360, 81756186, 960205901, 960266671, 960299101, 677724172, 960353358, 960462932, 47415298, 960499793, 960549967, 960611413, + 27607052, 960643100, 960659487, 960675846, 474054675, 960695669, 779075615, 960741397, 960758652, 960807371, 960856367, 960888940, 172752908, 960926800, 960970774, + 960987166, 961019915, 961036290, 961052693, 731742224, 961069903, 961103642, 961150992, 961167391, 44679180, 961188945, 961265676, 961282076, 48529439, 2097162, + 961298444, 6193180, 961675287, 5177479, 961696851, 961462282, 55377922, 961775037, 961822730, 961839110, 961855967, 961889799, 961975380, 202457230, 962117670, + 962134032, 49790981, 962150446, 962201741, 125583442, 962251235, 962283970, 962330708, 962363851, 962417749, 962494935, 962532438, 962630743, 928776213, 962723886, + 962773070, 962838556, 962855587, 241647647, 6373803, 962909272, 963019211, 149115993, 963067933, 116162591, 963089498, 963166239, 109215760, 963182651, 963216207, + 523375707, 963252506, 520093750, 29261855, 963314114, 963346539, 246497887, 963379202, 747356182, 963395637, 963433564, 963543133, 963592220, 848904218, 963608588, + 472891502, 17224797, 963630174, 110234025, 963744863, 963822750, 963887110, 281362453, 963903500, 963919894, 963936287, 963952666, 351305734, 787317039, 963969483, + 964019592, 462520751, 964051481, 896123312, 964116506, 964132923, 321699878, 964166519, 964198410, 110215200, 964220000, 208912395, 964265562, 964296706, 964313130, + 176357977, 964329484, 910688282, 964351073, 964482146, 601292838, 964592655, 964644614, 964695139, 234848287, 48693551, 964791576, 964838455, 782614550, 964871017, + 964935690, 964953361, 965001235, 4948008, 965022820, 965083211, 519407036, 965148703, 965165088, 965198127, 961856433, 965235813, 965301350, 965394453, 965411708, + 965460456, 965492802, 965525556, 144048134, 965563495, 965591106, 965625181, 130285594, 965678184, 965787650, 116162598, 965804098, 2196317, 2197987, 965842025, + 965989482, 966069377, 966120555, 966230949, 966265725, 966311967, 966328322, 966344742, 966362456, 966410280, 73744415, 966431852, 166707242, 966508610, 966541322, + 423002154, 193200138, 966562925, 966743150, 966905671, 966967327, 123174918, 966983983, 967017295, 967049651, 967082434, 967114758, 967131174, 215482370, 967152751, + 322060390, 967327746, 967344138, 19251503, 967360534, 3473446, 464946088, 967382128, 967491586, 2342915, 967508400, 371245066, 967540795, 110216033, 6701084, + 967573516, 185483346, 967592106, 967655426, 967672343, 967709809, 47120399, 230048424, 967802940, 967885314, 967918105, 363364394, 967983627, 968033192, 685244846, + 968067344, 112427037, 968115545, 968148270, 968196122, 968212912, 46351369, 968245279, 968261716, 968294421, 968310796, 968327194, 3342378, 968348786, 968643699, + 968709236, 180764693, 968786567, 968835539, 968884695, 453476415, 968917023, 968933378, 968949789, 17006595, 968966170, 968982538, 968999215, 711671846, 5341473, + 969036917, 969162762, 969184374, 969228381, 969278267, 969331831, 969408600, 914981378, 969445730, 969506831, 969523231, 171557466, 553156639, 969540431, 969572881, + 969605423, 7734095, 969640063, 969703450, 969719810, 969736207, 969752598, 969769878, 969818128, 969834538, 969853115, 969900072, 969916422, 969932831, 969949203, + 205750288, 3309604, 969965673, 926466895, 969998374, 49790988, 970019960, 601292802, 147063087, 970134649, 970227743, 75464723, 155779103, 409305147, 970245009, + 970293347, 120979475, 970326092, 2670613, 1114149, 970362595, 132153437, 970490819, 49790986, 970539117, 970571781, 16269317, 970588171, 970604560, 617103398, + 970623651, 970691706, 970981913, 971051181, 971096102, 971112484, 971128847, 306937877, 971145218, 971161626, 971178015, 432062470, 971194399, 971210781, 971227868, + 971261551, 971314299, 971375352, 971407419, 971440813, 971489290, 971506123, 971560060, 971636738, 971653146, 971669540, 971685904, 194461717, 971702339, 116213107, + 971786707, 971833375, 971849757, 131629072, 553156619, 971870173, 122568726, 971898892, 971915735, 971948487, 972002429, 972079125, 160743440, 972096568, 972161035, + 972177439, 272613415, 972193899, 972229091, 461717535, 972259412, 313245702, 972292117, 180666390, 972308492, 972324890, 502054928, 972346494, 972537977, 972570647, + 8148095, 972587031, 972570647, 226050054, 400802287, 972606892, 972657792, 972898363, 46874630, 972932326, 973029378, 973045798, 973062182, 51937292, 1818639, + 973078559, 506904618, 973094978, 973127682, 50036767, 973145026, 973177369, 973247617, 973291522, 973307945, 49905690, 973329538, 973406220, 46219279, 183369754, + 350633986, 74661914, 973422624, 616906774, 973460611, 973537286, 18169896, 973553750, 973586463, 274858049, 973603246, 973652599, 6373855, 238552094, 973689988, + 973783131, 57032710, 973815810, 973832202, 973848879, 973881360, 973897743, 126697494, 458489937, 6406170, 973914166, 100565015, 974132358, 974274600, 974291003, + 974326229, 974356482, 662585365, 974378119, 974520342, 974537743, 974585868, 974602278, 974619471, 974656648, 974733362, 974767000, 160759834, 974816928, 974853257, + 974913552, 974930002, 974962690, 974979093, 974995543, 975044634, 975060994, 975077386, 975093766, 975110159, 124108831, 975127016, 975159746, 975192104, 2179109, + 975211739, 975306858, 759681514, 938409994, 975393930, 975505049, 135905282, 975557771, 975634434, 975650924, 975688844, 975979031, 3736003, 644988966, 976011488, + 151732245, 976044792, 976076859, 125812748, 976109627, 976144525, 976191594, 482590726, 7095387, 976273448, 414089228, 976290234, 976339998, 976376973, 976453642, + 2196314, 976475278, 976585205, 976617503, 976633866, 976650282, 635634471, 976666848, 976699404, 976716247, 976748976, 976786575, 59768947, 976852112, 976977932, + 976994314, 977011319, 977043483, 977076226, 5341944, 977097873, 977190943, 329842691, 977208389, 977257079, 977289228, 122699802, 116375841, 977310866, 977409171, + 977453077, 977469506, 977502224, 977518602, 977535015, 977567850, 5325898, 977654932, 977797213, 140247072, 977848692, 977911835, 287572647, 977945945, 977977386, + 23385237, 977994030, 29180060, 978027361, 2146775, 134299653, 978326679, 978436523, 978468890, 978485276, 978501634, 121356309, 978519528, 978567210, 978583564, + 671662106, 192479253, 978604660, 978665482, 978682315, 978732783, 978796563, 663912470, 978812943, 978829324, 978845722, 978862082, 978878485, 625721410, 978898814, + 979027051, 979058719, 979075100, 979092057, 148127746, 979129496, 843120669, 979210287, 979255362, 979288578, 669221495, 979321135, 108707856, 979353621, 979370050, + 979403617, 979435530, 979451943, 979485196, 180404255, 979517446, 979533890, 979566651, 979599370, 979615786, 979632194, 979667638, 177324033, 979731347, 979780121, + 979845655, 979878843, 979943467, 979977981, 116850699, 980025783, 980058143, 980075381, 849723402, 980107330, 980140043, 980156427, 980172840, 980189194, 980205599, + 112476179, 980222553, 980254770, 980288025, 980353043, 980369439, 980385794, 980402197, 213041183, 980419605, 980467727, 635240450, 980484162, 8389985, 980522137, + 980632029, 980664341, 980681241, 980747232, 704151562, 980795407, 980811884, 980844847, 980877353, 980894128, 980927095, 980959248, 980976376, 52723743, 981008456, + 981075443, 981106694, 981123093, 981140348, 981189600, 981238566, 981270559, 981286933, 981304160, 978829314, 981368858, 627752981, 564871179, 981390490, 981467737, + 981499914, 183370359, 981517201, 981565461, 981582716, 981631490, 981664375, 981696543, 981712898, 981729318, 564658207, 981746528, 981811266, 981843984, 981860589, + 981898395, 982025154, 982057019, 982090244, 982138918, 982155266, 196886538, 982172858, 51757087, 982204447, 982220806, 119998494, 982237221, 982253580, 722731046, + 982270453, 982302732, 393363482, 982319138, 982433848, 982466999, 982500235, 982564930, 982598517, 679378954, 982630499, 143720479, 982668444, 982745109, 982762379, + 982827064, 982859807, 982876587, 982908994, 980074512, 982941801, 949256258, 982974903, 983007691, 983056440, 983089218, 983122408, 983158636, 983203850, 983220855, + 983253004, 983269386, 983285781, 983303051, 983367788, 983401816, 983449626, 983466430, 983532057, 983598001, 671547394, 983629843, 983646511, 983684253, 983744533, + 983761803, 983826967, 983859659, 451872018, 983908383, 983925621, 122503180, 983961009, 984023052, 984039434, 984055829, 984072667, 983302146, 984104981, 984122251, + 984187793, 984236088, 984269647, 984301622, 984334342, 984350726, 984372382, 984482784, 984530954, 529990107, 984547343, 984563738, 383860767, 984581150, 31424554, + 984612904, 984629279, 984645638, 143081503, 984662925, 984746761, 984794265, 984842255, 984858640, 984875034, 984891394, 546095114, 984913055, 984974219, 985039278, + 985091963, 985139470, 985186335, 676233226, 985202690, 985219110, 985235483, 985268331, 985302791, 179126293, 985350184, 985366559, 409681926, 985383005, 985432085, + 985448514, 985482081, 289767434, 985514044, 985601184, 9912483, 985827804, 985874470, 268451878, 985890842, 985907226, 985923615, 985939987, 392445992, 112508959, + 985956354, 217727014, 985972776, 985989149, 5275679, 986005547, 47235098, 986038298, 986054685, 986071071, 986087434, 986103810, 986121001, 261832720, 268468240, + 986152990, 986185754, 986202138, 986218562, 986251270, 986267669, 576176154, 986284053, 217366544, 986300475, 986333226, 986349570, 986365962, 986383633, 519143450, + 986431499, 986448331, 986497133, 986530016, 986562991, 986595385, 479330316, 986612151, 986649761, 986710028, 248266778, 986726416, 986742794, 986759179, 986775568, + 73531420, 986797218, 987005037, 987037725, 987054101, 987070486, 987086867, 987103260, 90521610, 987120107, 55754754, 987157667, 987332750, 987365414, 164806694, + 1212432, 987381798, 987398146, 351338502, 987414831, 987447810, 987480367, 987518116, 345882731, 809419210, 987578827, 987627541, 987643914, 118489100, 987660747, + 220774466, 987709867, 2539530, 987742676, 79101980, 987780261, 987922444, 131891228, 987944102, 48447528, 18399242, 44941328, 988020795, 11157530, 4948006, + 988053558, 304627750, 2359408, 988681384, 2162808, 988758136, 988774402, 1949816, 988791183, 988824087, 167903921, 6029340, 29458472, 988861609, 988921877, + 988938256, 56999947, 988956543, 6225922, 988987401, 989003817, 989020297, 16269353, 989036553, 989052954, 989069314, 47284239, 989090986, 11550742, 61784199, + 989118596, 33177737, 989134884, 989151258, 989167656, 67289095, 989184038, 989200395, 2031621, 119816667, 989631660, 989790227, 989807071, 989839452, 989873196, + 131335080, 3211747, 989922127, 989959341, 440745994, 137904138, 990054498, 990101516, 990119875, 990172334, 189251613, 990217606, 1900586, 990287023, 990348171, + 148160533, 695369759, 990415638, 990445673, 990478420, 990516400, 990663857, 5537833, 132005904, 990856680, 156155945, 237682991, 2326559, 990905212, 990953494, + 990969872, 990986259, 991002646, 991019014, 991035411, 705511446, 991055805, 147423270, 991133762, 991166485, 991184201, 991234565, 991281183, 991297547, 47530015, + 991319218, 991412240, 991428618, 635273255, 991445801, 991479445, 991544299, 991609886, 991641632, 991674814, 991745203, 249987138, 991892660, 112935966, 991990965, + 2408458, 992085478, 50266118, 992138422, 992198697, 992215059, 992231877, 992269495, 992411755, 992449720, 992511935, 239616066, 992608340, 992641034, 2195944, + 992658371, 238321693, 992711865, 207290448, 399147106, 992886822, 99876892, 992903174, 992920040, 992952386, 992985187, 993020489, 993083402, 993105082, 199213082, + 50462746, 109182998, 684212290, 993203387, 993427478, 177963029, 993444894, 993476635, 993514684, 5947394, 993640875, 993674126, 17220498, 993744061, 994050723, + 994100145, 45711376, 994133363, 235880479, 651870224, 994168758, 994230702, 994279467, 994312504, 994345993, 994378174, 3867138, 994444312, 154059286, 994492500, + 994526017, 994558254, 994590732, 55164954, 994607246, 994640331, 994689132, 994721794, 994738203, 994776254, 1966118, 994836502, 994858175, 994951208, 994967590, + 994984990, 995016801, 116162586, 995085653, 995153088, 995229788, 995262504, 131940378, 7143531, 995284161, 995579074, 124862993, 130285610, 995690467, 995786853, + 250396674, 995824835, 995873988, 8391195, 113115162, 996070597, 118882762, 996119750, 996196406, 996229160, 3244256, 131812105, 996248790, 996343915, 996381895, + 996442114, 634898282, 996458526, 294060034, 996496584, 996655109, 57950239, 996676809, 996737456, 954187830, 996772107, 996824266, 996889803, 996971724, 997031957, + 492819661, 360466080, 997048339, 997064726, 997081119, 997097498, 997113867, 50806900, 55033972, 997131086, 997201102, 997244997, 997277755, 997315791, 997408794, + 201376391, 45858853, 119357494, 997425236, 997463248, 997572671, 997605977, 188874790, 997638904, 997676241, 997785638, 997802015, 164003899, 997820599, 997867579, + 997901048, 997934424, 997982325, 115589179, 998020306, 392921126, 998085843, 998359122, 998391839, 998413524, 983400532, 998462677, 998525114, 998556557, 157499502, + 540295206, 998642902, 998738212, 176488451, 372899862, 998802822, 317837204, 998867977, 153748489, 998903602, 287604795, 998954199, 999052504, 277790760, 999161882, + 999178242, 393396239, 999199961, 999262500, 999325727, 999343138, 999380186, 229933059, 316867239, 999442660, 110166075, 999489555, 764624915, 559661903, 400195615, 999511259, 18677892, 999920860, 1000112587,1000162476,124403749, 608501869, 1000210477,1000244724,1000297693,1000439867,1000474363,1000521836,112459795, 1000555173, 1000620979,135970818, 1000652802,886687860, 1000674526,1000784097,1000821983,207520178, 2850845, 1000898572,109035526, 1000917185,1000964633,1001034391,1001116896, - 1001275476,668991528, 1001309529,1001341454,988053535, 1001373780,52133914, 1001411809,1001526498,1001587365,27852806, 1001652264,1001669975,1001717762,171163674, + 1001275476,668991528, 1001309529,1001341454,988053535, 1001373780,52133914, 1001411809,1001526498,1001587365,27852806, 1001652264,1001669975,1001717762,171163674, 1001735737,1001837795,1001965528,27607078, 1002030543,115245098, 1002130929,2359318, 1002178065,320946856, 1002214628,155975709, 65880121, 1002296549,1002405954, 881655839, 389040661, 1002444006,1002652149,1002689767,1002767190,1002817011,1002848294,1002864642,697434138, 1002882078,52592651, 1002914251,1002963379,1002995722, 1003013003,1003082984,1003159618,1003193185,4998079, 1003230441,825999362, 1003440186,1003503853,1003540114,1003585538,410813342, 1003607274,1003951339,1003998084, 1004060896,1004098796,24299438, 1004160640,1004208558,1004262637,1004328174,1004421262,1004459247,1004552737,1004606704,1004666923,1004699951,1004733152,1004765299, - 1004781705,34553993, 1004797992,1004814393,11304986, 1004831023,287572075, 1004863564,1004896362,1004979498,1005032689,1005262066,115770104, 1005339723,435339285, + 1004781705,34553993, 1004797992,1004814393,11304986, 1004831023,287572075, 1004863564,1004896362,1004979498,1005032689,1005262066,115770104, 1005339723,435339285, 593854474, 383483930, 1005404182,152027192, 1005425907,423804944, 51068930, 1005552847,1005618474,1005666332,1005683289,777060373, 1005717914,1005802740,1005862950, - 689569804, 49086504, 1005880414,1005933813,296601942, 1006026754,1006043176,758710314, 1006064886,194166794, 195264991, 1006125122,1006159444,1006261495,321863696, + 689569804, 49086504, 1005880414,1005933813,296601942, 1006026754,1006043176,758710314, 1006064886,194166794, 195264991, 1006125122,1006159444,1006261495,321863696, 1006306040,25559976, 995148211, 1006339473,133579688, 1006407538,1006453643,1006518328,1006551127,8606968, 1006600218,1006617483,1006682168,1006714946,1006747702, 253625009, 998785027, 1006785785,244220937, 1006944683,1006977111,1007031546,17842698, 182911016, 1007159041,1007206421,193871884, 1007224986,1007307181,1007353881, - 2195758, 1007387054,1007436641,5309867, 1007468571,1007501443,1007517827,17432585, 1007539451,61685763, 1007632386,1007648866,1007681555,1007697932,175620134, + 2195758, 1007387054,1007436641,5309867, 1007468571,1007501443,1007517827,17432585, 1007539451,61685763, 1007632386,1007648866,1007681555,1007697932,175620134, 1007719676,1007747082,1007763493,933924, 1007779868,477937686, 1007796265,1007812645,1007829033,1007845405,1007861788,99876883, 622657552, 1007883517,1008042948, 93700137, 1008091176,191070249, 580862068, 43237397, 31424644, 1008109967,1008140310,1008156700,415449103, 581779468, 1008631817,572080263, 1008653567,1008830302, - 142868490, 119358555, 1008899328,548405260, 1009059233,1009107944,1009161473,1009205260,1009221658,1009243394,162660373, 1009352730,1009369154,1009403515,756383756, - 1009472771,1009582172,55132162, 1009615761,1009664002,1009680410,1009696804,1009714163,1009729547,370573314, 1009751300,2195564, 1009845078,1009896350,168493358, - 273121334, 1009942538,121929757, 1009964293,1010111750,1010155532,1010172003,160170089, 1010210055,1010291976,1010405952,608502063, 1010467726,1010533264,116604994, + 142868490, 119358555, 1008899328,548405260, 1009059233,1009107944,1009161473,1009205260,1009221658,1009243394,162660373, 1009352730,1009369154,1009403515,756383756, + 1009472771,1009582172,55132162, 1009615761,1009664002,1009680410,1009696804,1009714163,1009729547,370573314, 1009751300,2195564, 1009845078,1009896350,168493358, + 273121334, 1009942538,121929757, 1009964293,1010111750,1010155532,1010172003,160170089, 1010210055,1010291976,1010405952,608502063, 1010467726,1010533264,116604994, 5799962, 1010565139,8392781, 1010581581,110232086, 1010614354,1010652425,1010747281,131776555, 1010778543,1010816266,2540456, 1010996491,437862421, 1011090516, 1011143948,1011254217,1011319832,947454006, 1011367990,141295654, 1011406093,453279826, 159809548, 1011499038,29622314, 1011533700,1011598245,1011633972,1011712926, 1011750158,1011941867,254574613, 44285964, 1011974170,1011990578,1012025800,1012073502,226361372, 453577884, 1012110607,1012159760,1012269137,46514216, 1012301845, 1012323601,1012384223,1012416524,136790037, 1012438290,210878571, 1012711436,1012727834,226361372, 1012744693,1012782355,194084890, 1012940802,1772228, 1012957643, - 1013006395,1013039211,1013071878,649232403, 446447618, 1013088870,1013121548,762069004, 1013159188,1013334553,1013404949,27836418, 25559585, 119996462, 5308910, + 1013006395,1013039211,1013071878,649232403, 446447618, 1013088870,1013121548,762069004, 1013159188,1013334553,1013404949,27836418, 25559585, 119996462, 5308910, 1013486870,268730389, 162332674, 1013564623,1013634327,1013765400,1013830937,1013911853,1013940234,188105384, 1013958677,1013989428,1014023252,1014071306,1014088728, - 1014136878,1014191386,383647754, 1014289691,1014433066,133709852, 5325857, 1014486300,139477100, 1014595594,230801439, 1014613161,1014645039,1014678346,174456898, + 1014136878,1014191386,383647754, 1014289691,1014433066,133709852, 5325857, 1014486300,139477100, 1014595594,230801439, 1014613161,1014645039,1014678346,174456898, 112738330, 1014732061,1014974014,1015040832,119357875, 1015104089,1015137910,1015190814,1015267850,1015300491,1015332923,1015371039,249974147, 1015447580,1015463938, - 207011862, 1015480341,259817498, 1015502112,214679574, 51675167, 1015584033,1015676974,1015727494,1015797026,126959622, 1015895331,1015955462,1015971859,909443074, + 207011862, 1015480341,259817498, 1015502112,214679574, 51675167, 1015584033,1015676974,1015727494,1015797026,126959622, 1015895331,1015955462,1015971859,909443074, 1015993636,161808396, 1016037407,307238181, 1016056580,1016102924,1016119322,1016135691,1016152066,425837073, 1016169875,193593354, 296960303, 1016250477,1016283152, - 1016299546,1016315920,45023289, 450543656, 1016632615,619266079, 162583848, 1016709150,52674562, 1016741975,1016796078,1016856578,1016872970,1016889373,285344179, + 1016299546,1016315920,45023289, 450543656, 1016632615,619266079, 162583848, 1016709150,52674562, 1016741975,1016796078,1016856578,1016872970,1016889373,285344179, 1016908745,1016960297,1017074986,1017140523,1017184258,1017200666,1017217040,113115142, 1017234662,1017332887,1017382186,1017430022,933479287, 1017446499,1017480981, 15482890, 499433484, 1017544758,1017577931,1017627055,1017659434,620281878, 1017676313,1017741368,107462658, 1017774187,842465301, 1017810169,1017861420,1018041645, - 1018118173,1018138021,152963069, 1018216507,1018251178,59260944, 5309346, 1018314860,1018347662,1018385710,1018462239,1018479479,1018512953,1018615087,153944095, + 1018118173,1018138021,152963069, 1018216507,1018251178,59260944, 5309346, 1018314860,1018347662,1018385710,1018462239,1018479479,1018512953,1018615087,153944095, 150537454, 1018757152,193708879, 1018790739,124551187, 1018860848,1019008305,1019073842,219676688, 8389459, 1019216895,1019270451,1019429778,7733307, 1019480403, 410748569, 125583398, 1019532596,1019641858,1019658266,1019674650,554434591, 1019691046,826523660, 1019707394,821657642, 1019723807,998686779, 1019745589,1019822111, 1019838474,1019854902,1019893046,1019937622,1019986379,1020040503,1020100674,1020134808,984121403, 1020182987,1020232789,1020264502,1020302648,1020461163,1020494277, @@ -2123,12 +2118,12 @@ static const unsigned int DictNodes[84251] = 1021083674,1021100467,1021132806,1021150263,1021187386,1021248406,1021296739,1021334843,2932799, 466158043, 1021416764,1021526923,1021591660,212860944, 1021624346, 1021646141,1021689902,1021739020,108707862, 116015125, 4997595, 1021755447,1021820954,536379867, 1021837393,1021871125,1021924670,1022001259,52314128, 1022033923, 513278255, 1022055743,1022149699,1022181397,1022197791,1022214154,45858847, 1022230569,1022247770,1022280538,66814810, 1022312490,133283876, 1022330015,1022361716, - 64356486, 1022383424,1022459945,1022476330,88555549, 1022494401,1022541940,2179094, 107462678, 1022560930,1022607370,2359412, 1022623772,1022640164,336887849, - 1022656553,1022672933,1022689308,1022705706,84394003, 7634965, 1022722085,1022738443,477937683, 1022760257,1022902704,1022935061,581206052, 1022951465,477937693, - 406339600, 1022968235,883785750, 1023000633,1023022402,13238402, 1023066153,581206054, 1023082517,1023098916,714244106, 1023115305,1023131688,1023148053,115458086, + 64356486, 1022383424,1022459945,1022476330,88555549, 1022494401,1022541940,2179094, 107462678, 1022560930,1022607370,2359412, 1022623772,1022640164,336887849, + 1022656553,1022672933,1022689308,1022705706,84394003, 7634965, 1022722085,1022738443,477937683, 1022760257,1022902704,1022935061,581206052, 1022951465,477937693, + 406339600, 1022968235,883785750, 1023000633,1023022402,13238402, 1023066153,581206054, 1023082517,1023098916,714244106, 1023115305,1023131688,1023148053,115458086, 1023563076,1023640631,126042138, 1023677765,1023738287,27852812, 1023770643,863814232, 1023792454,1023901722,1023918143,130859046, 1023950858,176455682, 1023967319, 1024017438,774963305, 319619088, 1024054599,610566182, 1024131108,1024147458,220987430, 1024163852,44679187, 1024185672,192184999, 1024311723,427803657, 1024349513, - 496566288, 1024464202,175472706, 66601076, 1024540698,149094431, 1024557087,1024578891,1024622602,1024644428,1024720934,1024737311,1024754576,1024791885,61456422, + 496566288, 1024464202,175472706, 66601076, 1024540698,149094431, 1024557087,1024578891,1024622602,1024644428,1024720934,1024737311,1024754576,1024791885,61456422, 1024917585,6438950, 1024952217,1025018845,8685252, 482590732, 963067933, 1025064979,559120415, 1025086798,1025245250,618545190, 7095616, 1025278443,1025314091, 1025359898,204603408, 7290917, 1025376695,1025409104,1025447247,132154252, 1025573751,1025605716,1025641588,1025693008,1025835020,119439465, 1025851476,1025885849, 273974008, 1025933364,1025966499,1026004305,1026097161,1026113559,1026130069,2342953, 1026166170,1026228236,189136906, 16941171, 1026250066,1026457626,1026479443, @@ -2137,74 +2132,74 @@ static const unsigned int DictNodes[84251] = 1027544407,1027637260,1027653642,569360405, 1027670129,545161232, 168017936, 1027724257,1027786688,1027866683,911310884, 330318671, 1027904856,193676787, 1028047449, 207273996, 1028079700,316478809, 1028117850,298960321, 1028195497,1028227129,248840223, 1028243543,1028293122,327909813, 718602327, 1028330843,1028478300,1028560221, 1028620330,1028642142,1028707679,112935343, 414285826, 1028836053,1028887904,1028964436,1028997550,1029051745,1029111950,307594087, 696123394, 1029144604,1029160986, - 1029177410,1029215586,1029510499,1029608804,1029734402,1029750794,599195669, 1029768600,656523691, 1029816339,1029832770,1029867129,122503206, 1029914626,108707866, - 1029934559,1030018405,1030116710,1030258728,1030275087,1030291458,1030307871,433405978, 1030324683,1030378855,541854182, 800228853, 500908256, 1030587476,149111251, + 1029177410,1029215586,1029510499,1029608804,1029734402,1029750794,599195669, 1029768600,656523691, 1029816339,1029832770,1029867129,122503206, 1029914626,108707866, + 1029934559,1030018405,1030116710,1030258728,1030275087,1030291458,1030307871,433405978, 1030324683,1030378855,541854182, 800228853, 500908256, 1030587476,149111251, 1030635546,1030657384,1030815828,1030848654,1030881311,482590730, 1030897695,195215370, 1030914935,2408484, 1030946875,1030985065,1031095496,1031127052,1031143450, - 6373406, 1031165290,1031225356,55754783, 1031242782,1031274855,1031307292,1031323679,1031340042,1933772, 1031356428,1031378283,1031438395,1031472239,225181725, + 6373406, 1031165290,1031225356,55754783, 1031242782,1031274855,1031307292,1031323679,1031340042,1933772, 1031356428,1031378283,1031438395,1031472239,225181725, 1031509356,1031624045,175784225, 1031755118,1031848367,1031881306,1031913494,46039071, 1031935343,1031995414,1032011798,184074242, 30326843, 528777300, 1032028179, 144621570, 5865538, 1032050032,136119465, 1032127342,1032192437,111362050, 108298278, 1032225249,1032274037,1006059551,1032310022,131318952, 1032372240,1032388637, 1032405023,1032421387,1032437791,1032454165,191053850, 1032472020,1032519692,176504838, 1032537690,222494732, 1032574321,1032770930,763773501, 1033082227,1033180532, - 1033224194,27852829, 1033246069,5505052, 1033306254,1033338882,394379283, 1033355310,1033405986,1033453610,1033469974,612319253, 1033486768,1033519188,2359301, - 1033552349,1033584699,1033617906,1033666603,1033699816,1033732633,490340378, 1033797739,1033830426,404160552, 1033847214,1033896044,116377025, 1033928796,705937474, + 1033224194,27852829, 1033246069,5505052, 1033306254,1033338882,394379283, 1033355310,1033405986,1033453610,1033469974,612319253, 1033486768,1033519188,2359301, + 1033552349,1033584699,1033617906,1033666603,1033699816,1033732633,490340378, 1033797739,1033830426,404160552, 1033847214,1033896044,116377025, 1033928796,705937474, 449052703, 1033966966,110444646, 1034093806,1034125315,1034141724,1034158082,4341797, 1034175095,1034212727,1034371087,1034387458,1034403846,1034420245,1034437162, 1034453013,1034469398,1034485772,1034502698,243220495, 1034518538,29376524, 1966083, 1034540408,52363274, 1034700109,1034764326,299221019, 1034786169,1034879035, - 1034912721,163315794, 1034966394,1035256821,1035326843,175768002, 1035375996,1035425149,1035523454,558628923, 1035605032,1035665462,1035699209,778944554, 397771055, - 1035731028,512491530, 294060048, 612745237, 1035763731,397852694, 1035781439,141411064, 235438382, 1035845658,1035862028,1035879738,1035933055,1036025932,2359387, - 1036064128,356925450, 1036255254,1036276046,1036321057,872366082, 1036353548,272810010, 316735554, 1036369979,1036403222,1036440961,1036552250,1036616907,122503210, - 1036653954,1036877931,1036910658,1036943386,1036960213,145506342, 1037008924,111607836, 1037025881,1037058155,9388034, 1037091246,1037140008,55197722, 77512730, + 1034912721,163315794, 1034966394,1035256821,1035326843,175768002, 1035375996,1035425149,1035523454,558628923, 1035605032,1035665462,1035699209,778944554, 397771055, + 1035731028,512491530, 294060048, 612745237, 1035763731,397852694, 1035781439,141411064, 235438382, 1035845658,1035862028,1035879738,1035933055,1036025932,2359387, + 1036064128,356925450, 1036255254,1036276046,1036321057,872366082, 1036353548,272810010, 316735554, 1036369979,1036403222,1036440961,1036552250,1036616907,122503210, + 1036653954,1036877931,1036910658,1036943386,1036960213,145506342, 1037008924,111607836, 1037025881,1037058155,9388034, 1037091246,1037140008,55197722, 77512730, 1037156436,1037189130,471531549, 1037205535,1037221899,1037238735,1037271343,1037303916,1037336684,1037369382,57016358, 1037385739,1037402171,1037434921,1037451290, - 1037467660,116162589, 1037484450,1037522307,1037648815,1037715286,1037763771,1037817220,122732582, 1037882757,570638373, 1037977098,1038024705,1038041106,65077378, + 1037467660,116162589, 1037484450,1037522307,1037648815,1037715286,1037763771,1037817220,122732582, 1037882757,570638373, 1037977098,1038024705,1038041106,65077378, 1038057498,1038073885,154664999, 1038090246,96092197, 1038112134,1038221340,1038237718,1038254116,2179101, 1038272299,1038305681,1038352533,1038385284,1038401558, 1038418054,1038434345,470384777, 1038451881,1038483525,1038516246,1038532644,1038549033,1038565386,21151772, 1038581876,1038598154,79495303, 1038614644,1038630952, 1038647412,142180389, 1038669191,1038731689,64929927, 1038762003,1038778437,1038811172,1038827558,1038845128,1038882184,1038925853,725160054, 1038946421,1038976445, 1039209866,1039553931,1039614832,1039665072,1039701388,1039844088,1039876134,1039892523,1039926472,1039958100,1039991243,1040039987,1040078221,1040143758,1040225679, 1040334902,1040367714,1040405904,556354453, 1040515094,1040531482,353894416, 1040548705,1040582247,1040629762,1040649180,79626261, 1040695322,47923221, 1040717201, - 1040843203,273220035, 1040876412,169673226, 1040925131,300925688, 1040979346,372605846, 1041023467,1041061267,1041301506,1041318319,1041350672,47448090, 307462160, - 1041372564,1041599094,1041662799,1041694732,36405390, 1041711550,1041779039,1041825899,390153877, 1041858665,1041891412,1041924188,1041962389,48021525, 2998760, - 1042055228,1042137193,79757331, 1042171235,1042236752,1042287241,1042351593,1042399270,1212457, 1042416707,402538522, 1042453910,1042748823,1042808834,6374745, + 1040843203,273220035, 1040876412,169673226, 1040925131,300925688, 1040979346,372605846, 1041023467,1041061267,1041301506,1041318319,1041350672,47448090, 307462160, + 1041372564,1041599094,1041662799,1041694732,36405390, 1041711550,1041779039,1041825899,390153877, 1041858665,1041891412,1041924188,1041962389,48021525, 2998760, + 1042055228,1042137193,79757331, 1042171235,1042236752,1042287241,1042351593,1042399270,1212457, 1042416707,402538522, 1042453910,1042748823,1042808834,6374745, 1042826345,1042876219,1042925033,1042973186,1043005974,1043038234,147292171, 1043056104,1043109272,7258193, 1043256729,1043301460,584597506, 1043349927,1043400246, 1043447830,1043469722,471580674, 494010413, 1043550060,1043595301,1043611660,1043628073,44646516, 1043647695,1043694039,1043726423,1043781019,107446325, 1043906647, 450773018, 1043956163,1043994012,1044059549,1044141470,1044217878,412156761, 1044234266,1044256159,1044348938,226443285, 1044365417,1044398086,307462146, 1044414476, - 1044430886,1044447270,153075778, 1044467250,1044562849,1044611154,1044643876,852017193, 1044665760,1044824640,1044862369,1040073226,1044958313,1045020684,243843098, - 1045037535,1045069845,406640034, 1045087904,1045124515,1045234155,1045271972,1045337509,1045415112,1045446672,47546378, 1045468582,54296614, 1045579142,451871628, + 1044430886,1044447270,153075778, 1044467250,1044562849,1044611154,1044643876,852017193, 1044665760,1044824640,1044862369,1040073226,1044958313,1045020684,243843098, + 1045037535,1045069845,406640034, 1045087904,1045124515,1045234155,1045271972,1045337509,1045415112,1045446672,47546378, 1045468582,54296614, 1045579142,451871628, 1045643285,1045664152,679542805, 1917152, 1045743193,1045790807,1045845415,1046102072,1046139508,1046204847,1046254942,305086986, 1046319709,1046364259,1046397457, 177963030, 1046429738,135905346, 1046451624,1046517161,1046626335,1046643171,1046675494,344850434, 1046691842,1046709339,1046745042,1046806612,52576278, 1046844842, 1046893995,1047037079,1047090604,1047205293,168706114, 1047298079,1013219338,1047315063,1047352750,1047445514,1047467439,1047511055,205209616, 44318760, 1047527854, 166152443, 1047576800,1047609819,493093296, 1047647664,518291494, 1047740523,1047773213,431554572, 1047790513,191119366, 1047822382,1047872719,1047937546,1047975345, 147423261, 714244133, 1048073650,1048366624,122961960, 1048417715,240583190, 370163936, 1048494121,512918422, 1048511065,1048544286,1048576252,1048608800,1048642011, - 668057717, 1048674951,1048723482,408944681, 665157642, 1048741393,789824406, 1048775543,1048805463,1048854534,1048870931,1048887308,1048904625,1048938637,913997883, + 668057717, 1048674951,1048723482,408944681, 665157642, 1048741393,789824406, 1048775543,1048805463,1048854534,1048870931,1048887308,1048904625,1048938637,913997883, 616792079, 471547916, 321306722, 1048986445,1049040308,127042137, 1049100316,1049118590,1049149468,1049165843,1049182218,1049198614,513998889, 1049220533,1049479140, - 1049510346,1049542658,1049559061,720797715, 1049575450,1049592203,1049630134,1049673759,429637638, 668401707, 1049690122,255705130, 1049709724,54460473, 202211350, + 1049510346,1049542658,1049559061,720797715, 1049575450,1049592203,1049630134,1049673759,429637638, 668401707, 1049690122,255705130, 1049709724,54460473, 202211350, 1049757015,1049810359,1049870345,1017495563,1049889314,1049935913,1049952292,1049968650,48480284, 1050366508,119047192, 127041954, 1050432953,1050510222,1050574854, 1050593054,123207746, 1050662330,1050755102,1050787947,232849410, 1050826171,4390949, 1050918924,189038618, 48676902, 1050935520,1050968695,1051000844,1051017242, 5505062, 1051039164,174457592, 1051181816,1051219389,266043616, 1051264661,274366523, 1051328596,1051361346,1051394489,1051448766,171507754, 1051542396,1051591771, - 4997615, 1051628991,769851448, 1051837323,1051901998,1051956672,1052051242,1052104129,1052231044,1052296015,1052327962,1052344386,148799922, 1052378524,98107394, + 4997615, 1051628991,769851448, 1051837323,1051901998,1051956672,1052051242,1052104129,1052231044,1052296015,1052327962,1052344386,148799922, 1052378524,98107394, 1052431810,1052524554,1052541367,6602780, 1052576552,1052644803,1052726724,1052770309,1052792261,1052869075,167116854, 8392454, 1052917819,1052952765,1053016074, 1053032469,116867159, 1053054406,210895424, 1053251015,1053398472,650085270, 1053458498,1053493201,1053542903,1053573262,1053605926,53690406, 1053622288,1053638666, 43237418, 1053655052,1053671523,271384604, 200589334, 1053704204,1053721105,1053758921,1053868977,1053900810,1053917196,1053935394,318832678, 1053966795,1054021066, 1054065694,1054102987,1054212142,1054264785,47038502, 1054315980,1054491672,1054540203,1054572584,300777513, 1054588994,1054627277,1054720002,45776922, 1054738256, - 1054785558,229034082, 733888930, 1054807502,1055032627,1055080486,1055098202,1055135183,1055260703,226639901, 1055277903,2179088, 1055310671,1055342634,42434582, - 1055359968,1055408270,464928789, 1055446480,1055522870,1055555638,1055588367,273268802, 1055970770,1056079938,1056112650,1056129327,180764713, 1056165003,184682028, - 1056245736,659914778, 1056292932,1056342455,1056374850,1056413139,1056511444,654000616, 1056608092,1056658901,1056932083,1056981136,1057019350,1057079315,24838184, + 1054785558,229034082, 733888930, 1054807502,1055032627,1055080486,1055098202,1055135183,1055260703,226639901, 1055277903,2179088, 1055310671,1055342634,42434582, + 1055359968,1055408270,464928789, 1055446480,1055522870,1055555638,1055588367,273268802, 1055970770,1056079938,1056112650,1056129327,180764713, 1056165003,184682028, + 1056245736,659914778, 1056292932,1056342455,1056374850,1056413139,1056511444,654000616, 1056608092,1056658901,1056932083,1056981136,1057019350,1057079315,24838184, 1057095701,8159366, 1057117655,272614136, 1057440824,1057506432,1057554438,1057570837,1057588110,1057652752,1057669126,1057686105,1057718414,720797717, 1057751132, 348652465, 1057783867,1057816618,293601290, 1057832970,1057849360,1057865733,175833126, 1057882571,1057931310,1057980455,1058013421,1058051544,1058160652,1058182617, 1058242644,1058275357,1058291728,116850693, 1058313690,1058455590,122683430, 1058472536,1058504716,1058521114,1058543067,119537680, 1058587054,144375834, 1058639050, 114114586, 1058701343,1058717717,1058737202,1058803588,184680745, 1058919772,1059001820,1059094568,149504038, 1059110924,84934666, 1059127755,1059182045,1059242050, 1059275223,1059308008,1059340776,2834484, 1059374019,1059422634,1059460574,1059586478,2147673, 1059640799,1059689952,1059850776,913817642, 1059919329,1059964312, - 300582942, 1060013065,1060044806,1060061221,1060077570,1060093967,1060110342,1060126749,1060143135,1060159494,1060175893,1060192282,79511583, 1060210484,440254530, + 300582942, 1060013065,1060044806,1060061221,1060077570,1060093967,1060110342,1060126749,1060143135,1060159494,1060175893,1060192282,79511583, 1060210484,440254530, 1060296162,5309786, 1060377507,307986926, 225116166, 1060438054,1060454402,1060476387,1060585637,1060733078,1060898167,1060978770,1061017060,2031632, 1061112696, - 1061158996,44351498, 1061192616,1061225862,1061292111,1061355541,1061372213,1061426661,1061635521,1061672422,1061732411,1061766033,185008130, 1061817256,3244554, + 1061158996,44351498, 1061192616,1061225862,1061292111,1061355541,1061372213,1061426661,1061635521,1061672422,1061732411,1061766033,185008130, 1061817256,3244554, 434716688, 827260949, 1061901799,1062094138,11157516, 1062147560,15007763, 1062213097,1062273040,5505035, 1062295018,18595944, 81985542, 78905354, 1062371787, - 1062420522,118194198, 1062436923,1062470860,677724181, 1062520206,1062584341,1062601236,1062650879,1062704619,1062764555,251580518, 1062781012,1062813722,552878109, + 1062420522,118194198, 1062436923,1062470860,677724181, 1062520206,1062584341,1062601236,1062650879,1062704619,1062764555,251580518, 1062781012,1062813722,552878109, 109052339, 1062830383,134021146, 1062868460,1063044382,1063092267,1063125451,994312258, 1063174228,1063206972,2146731, 1063291925,1063370790,1063388393,1063441901, 1063485494,1063521143,1063556590,116211819, 1063638511,1063731284,1063764006,1063780390,1063796777,1063813136,1063829530,108658716, 1063845900,1063862298,1063879336, 1063915485,1063949808,1064141294,1064176072,1064228337,1064353824,1064392178,1064484885,1064501279,251346960, 371311114, 1064518550,1064566786,1064583199,1064599562, 491227081, 1064615976,366837772, 1064637939,1064845314,1064861706,1064878109,1064895018,1064910850,1064927786,48463894, 787169809, 5668930, 1064949236,1064998389, 1065060611,1065129462,1065244151,1065307099,1065391608,1065631828,1065664604,18874410, 166543398, 1065697296,1065719289,1065762859,1065796702,659341328, 1065844790, - 1065877596,1065910293,27607062, 1065927416,45776898, 97435664, 1065962068,114049027, 147013674, 1066011332,1066041349,3309683, 53706764, 1066270857,98648093, + 1065877596,1065910293,27607062, 1065927416,45776898, 97435664, 1065962068,114049027, 147013674, 1066011332,1066041349,3309683, 53706764, 1066270857,98648093, 1066632015,1066663939,1066680635,525615125, 1066718716,133234694, 1066795608,1066828231,1066876944,1066894145,1066926119,1066964477,478543882, 1067013630,1067122793, - 1067155494,1067171906,5341408, 1067205067,1067253770,1067270165,1067288379,1067335762,530727824, 176242690, 27623469, 1067374079,675381675, 2195883, 358105567, - 1067483217,1067515970,163299760, 764266029, 1067554304,1067619841,1067718146,1067947523,668991519, 1068094980,1068176901,1068254848,1068302367,176488458, 143753226, + 1067155494,1067171906,5341408, 1067205067,1067253770,1067270165,1067288379,1067335762,530727824, 176242690, 27623469, 1067374079,675381675, 2195883, 358105567, + 1067483217,1067515970,163299760, 764266029, 1067554304,1067619841,1067718146,1067947523,668991519, 1068094980,1068176901,1068254848,1068302367,176488458, 143753226, 1068318786,1068351592,1068406278,1068466242,1068500431,1068597719,1068635655,1068712001,1068761142,1068799496,1067401222,161808415, 1068941334,1068957712,1068974090, 154763330, 1068991753,1069023254,1069039618,128843787, 1069056052,1069094409,1069351966,1069389322,1069481996,1069498394,5341635, 364560450, 688275468, 1069514989, 1069547546,342605856, 1069563930,48676885, 209338384, 1069585068,1010581811,1069646426,1069679945,132792330, 1069733387,1069776898,881786895, 922615848, 1069794144, @@ -2214,14 +2209,14 @@ static const unsigned int DictNodes[84251] = 1071765012,1071923203,112427024, 1071940055,145309718, 550371340, 1071972843,366837772, 1072005201,1072037954,1072076309,1072289302,1072403991,238370844, 1072480287, 1072499103,1072551448,1072627751,1072666137,1072709671,1072743281,1072794257,1072858001,116228106, 1072906699,196149290, 1072955921,1072989636,1073020934,1073041531, 1073092122,401834236, 1073501723,116588574, 285081742, 1073594394,188106073, 1073610833,1073649180,1073725499,1073758219,10032669, 1073774676,1073808512,1073858879, - 293601309, 1073894942,1073971210,1073989164,679755842, 1074022764,1074069610,1074153694,178471529, 387826497, 1074200660,502661146, 1074234865,1074271775,20365319, + 293601309, 1073894942,1073971210,1073989164,679755842, 1074022764,1074069610,1074153694,178471529, 387826497, 1074200660,502661146, 1074234865,1074271775,20365319, 1074370080,1074432791,1074496335,52133898, 1074529366,1074579973,1074626572,212107276, 1074643010,1074681377,727664669, 1074774068,247840774, 307740777, 1074812450, - 1075036761,1075068954,188105187, 1075090979,891469850, 1075183638,1075200021,1075216465,1075249164,523485993, 1075265602,1075298735,1075331115,1075366820,140247849, + 1075036761,1075068954,188105187, 1075090979,891469850, 1075183638,1075200021,1075216465,1075249164,523485993, 1075265602,1075298735,1075331115,1075366820,140247849, 396279848, 479428610, 1075429463,1075481692,1075527722,1075544086,933183528, 1075566116,1075658762,1075675157,1075691558,1075707916,725368843, 1075729957,1075904534, 1075926566,1076035605,911278568, 1076052898,157663244, 1076085654,1076133928,1076150284,1076166666,1076183671,1076216718,1076283622,1076330515,190644715, 1076352551, 1076446848,1076496165,1076549160,1076659498,1076713001,1076822070,1076855298,1076887618,1076920330,1076937750,1076986457,208503210, 1077018653,200736806, 1077040682, 130531359, 891469850, 1077198905,1077215273,1077231626,99876905, 923336747, 1077248038,1077264405,151765049, 1077286443,618627171, 1077626273,1077679660,1077739576, - 236339231, 1077773198,1077843501,1077971430,122126731, 401834065, 1078002424,1078034498,126435444, 1078072878,1078236719,1078400295,1078477335,1078509599,184680977, + 236339231, 1077773198,1077843501,1077971430,122126731, 401834065, 1078002424,1078034498,126435444, 1078072878,1078236719,1078400295,1078477335,1078509599,184680977, 1078526398,1078591519,1078607891,1078624747,1078657030,1078673887,1078706235,1078739003,1078771741,1078792239,1078838166,1078891170,1078935991,1078974000,1079099402, 500531222, 1079115815,1079154225,1079230485,1079246860,1079265058,1079296031,68599834, 673939522, 1079312405,1079331002,843120650, 1079363483,1079428948,1079479346, 1079542814,1079580210,1079706518,1079756027,1079806775,371605542, 1079822074,1079854249,191972779, 1079890521,1079957043,1080066070,1080082955,1080131622,1080148006, @@ -2237,17 +2232,17 @@ static const unsigned int DictNodes[84251] = 1085671040,1085718625,1085785840,3129346, 1085822541,4292911, 1085882414,1085931560,1085953614,98107432, 11304996, 1086133839,1086195195,1086242882,1086281296, 1086391182,1086455819,50266124, 1086472213,1086490427,1086543441,177963034, 1086636053,1086652428,1086668810,1086685603,795623436, 1086717964,1086735785,1086767328, 1086799882,1086816297,1086832666,1086849046,1086865436,514605075, 1086887506,1087014487,2195883, 1087080247,1087127602,188874768, 1087160808,1087193140,1087225915, - 111280227, 1087258723,1087297107,1087356954,1087373340,78561320, 1087389699,1212458, 1087406139,1087439151,221233183, 1087477332,202309663, 1087651924,287573868, + 111280227, 1087258723,1087297107,1087356954,1087373340,78561320, 1087389699,1212458, 1087406139,1087439151,221233183, 1087477332,202309663, 1087651924,287573868, 1087684845,157188178, 253624359, 1087717436,201523714, 1087800329,111656970, 1087837781,89128976, 62324758, 1087968854,1088241694,1088280151,1088340647,1088373021, 1088405591,1088454694,1088472449,1088522208,265830410, 16597035, 1088569354,59310111, 1088585730,1088602123,1212457, 1088618548,171163674, 1088656984,1088851572, - 1088897166,1088930911,1088997228,1089028523,1089061345,1089110062,5079122, 115720284, 1089160015,1089191982,118472720, 181259906, 1089241518,1089291087,45645933, + 1088897166,1088930911,1088997228,1089028523,1089061345,1089110062,5079122, 115720284, 1089160015,1089191982,118472720, 181259906, 1089241518,1089291087,45645933, 1089328729,1089391317,149094402, 312180755, 128155686, 124862563, 1089443418,1089508955,1089771100,1089848143,1089880148,1089918557,1089978427,590037002, 1090011983, 1090043920,1090060298,1090077579,1090142968,1090176344,1090225560,1090274129,1090406107,1090437132,1090453514,1090469909,1090486274,1090502694,1090520408,1090569100, 1090619170,1090650713,1090682987,113247761, 1090715650,1090732063,226951174, 1090752030,1090813954,655409912, 1090830401,45498394, 1090879498,7307305, 1090896327, 1090946234,129237023, 1090979547,1091011161,1091049054,1091141661,5767180, 131973737, 1091158934,1091207206,300582377, 710557708, 1091229279,1091322283,1091354861, 1091387423,1091405562,1091436560,1091452947,1091469348,1091485736,1091502095,1091518466,1091534858,214679553, 390135848, 1091556960,1091851873,131812506, 1091950178, 1091996165,1092042811,1092076460,1092142439,1092207069,1092239406,1092294243,116376086, 1092354050,347635722, 1092370969,1092441381,709869599, 1092490603,1092552238, - 1092600755,1092632642,308576296, 1092668923,247234565, 1092731307,888143884, 1092769380,149116517, 1092845580,1092862051,1092895737,379109673, 1092976642,365346826, + 1092600755,1092632642,308576296, 1092668923,247234565, 1092731307,888143884, 1092769380,149116517, 1092845580,1092862051,1092895737,379109673, 1092976642,365346826, 1092998758,1093058576,145145877, 55918594, 1093080679,1093222426,208667471, 1093240735,116162598, 188874764, 1093305658,1093353775,1093386695,1093441128,1093517339, 7735216, 1093550090,1093570607,1093621353,1093698590,110231652, 1093736042,1093926996,174440486, 1093959739,1093992555,1094025753,1094090976,433405962, 1094126415, 1094178411,418086955, 1094227564,1094287370,1094303765,1094320150,53854246, 1022492682,514670614, 1094336907,705052802, 84967426, 1094369417,690192405, 1094391405, @@ -2257,48 +2252,48 @@ static const unsigned int DictNodes[84251] = 1095551863,1095581838,1096177269,104759325, 1096238606,1096291958,1096336254,1096368131,1096384643,1096400934,16269350, 289062921, 1096417320,498172020, 1096433669, 1096450085,8962054, 1096466435,1096482826,16269318, 1096914551,1097007543,1097045624,1097193081,2834520, 1097286092,1097322165,1097404628,799572050, 1097468434, 1097515479,1097548738,1097580563,1097596931,2539556, 1097616817,1097679695,1097711646,1097745798,1097810974,13549587, 1097842747,1097875494,1097897594,1098012283, - 1098138433,158501460, 1098176124,1019056093,1098400757,1098466633,1098516499,1098563600,117751846, 210436567, 1098585725,1098629151,160759818, 1098651262,711163906, + 1098138433,158501460, 1098176124,1019056093,1098400757,1098466633,1098516499,1098563600,117751846, 210436567, 1098585725,1098629151,160759818, 1098651262,711163906, 1098711887,1098749567,1098891724,864767590, 1098928239,1098989676,1099028096,185270282, 1099104557,29900810, 1099142785,1099224706,1099384144,8388701, 1099433448, 1099481119,1099497556,1099530347,1099563037,563512143, 1099579479,125911511, 1099634307,110249305, 1099716228,1099923538,124863579, 1099961989,341442863, 1100043910, 1100124086,1100185837,7733301, 1100218396,1100234768,1100251189,1100285657,407111866, 1100322439,1100398604,405749786, 87539749, 1100415854,1100486280,1100548804, - 108314708, 1100912266,1101169128,1101202288,1101256331,1101316180,1101354636,1101436557,1101480239,1101513794,1101578246,1101594626,390135834, 551796738, 119881759, + 108314708, 1100912266,1101169128,1101202288,1101256331,1101316180,1101354636,1101436557,1101480239,1101513794,1101578246,1101594626,390135834, 551796738, 119881759, 1101611440,137543739, 1101648936,5341621, 1101709371,1101742510,357285899, 1101797006,1101939530,239550753, 432947221, 1101987871,874234381, 1102004308,1102037051, - 273088522, 1102075535,1102266399,1102283945,1102315551,1102331906,833847306, 1102348300,181256729, 1102369276,1102413883,59310106, 1102452368,23855158, 273121334, + 273088522, 1102075535,1102266399,1102283945,1102315551,1102331906,833847306, 1102348300,181256729, 1102369276,1102413883,59310106, 1102452368,23855158, 273121334, 1102550673,1102714514,1102892431,1102954528,1102988519,1103042195,2342927, 171000240, 1103102372,1103134758,1103151106,6717469, 1103173268,1103320725,1103384699, - 1103430580,1103495457,1103533718,1103763095,1103822955,1103855708,208503278, 1103888985,1103921236,1103959704,121339930, 1104003126,1104035842,1104052234,5505045, + 1103430580,1103495457,1103533718,1103763095,1103822955,1103855708,208503278, 1103888985,1103921236,1103959704,121339930, 1104003126,1104035842,1104052234,5505045, 1104074393,119357479, 420593685, 1104189082,1933318, 1104254619,147243074, 1104352924,1104396825,1104462922,1104500381,1104560587,1104613472,1104659279,1104693602, 900677643, 1104741194,146358293, 1104789550,1104844446,1105041055,47120415, 1105139360,1105266059,397852701, 1105317859,533070504, 1105385121,448659522, 1105462859, 1105510466,1105544222,1105581730,1105789165,666025986, 4145164, 1105824733,491700226, 1917365, 1105871317,1105925795,1106001930,1106018341,417464351, 1106040484, - 1106137286,29884418, 1106182199,1106247695,1106264086,6946852, 1106280450,1106296863,48054310, 1106313226,8390247, 1106330059,1106378858,158504613, 121585674, - 520722086, 1106461815,1106509826,1106526245,1106542614,456949800, 1106564775,1106826920,1106886658,1106903061,868090357, 1106925225,1107037743,1107083305,8603064, + 1106137286,29884418, 1106182199,1106247695,1106264086,6946852, 1106280450,1106296863,48054310, 1106313226,8390247, 1106330059,1106378858,158504613, 121585674, + 520722086, 1106461815,1106509826,1106526245,1106542614,456949800, 1106564775,1106826920,1106886658,1106903061,868090357, 1106925225,1107037743,1107083305,8603064, 1107099951,1107133939,621576230, 1107170986,1107232073,1107279898,5312501, 1107302059,1107346462,185270313, 1107383980,1107444206,1107482285,1107689986,1107724158, 152616962, 1107755051,1107787786,122683434, 1107809966,778290547, 2015253, 1107904057,1108000827,694976524, 1108033557,1108049979,131940390, 1108083225,1108154031, 319176763, 1108263367,152027147, 1900572, 1108312989,1108394066,158253280, 1108432560,1108498097,1108575650,1108629170,1108756837,254591042, 51118091, 1108804126, 116883693, 1108857460,1108918282,291110975, 1109317299,1109524492,125927453, 162185666, 1109540948,159450142, 8389826, 1109573691,1109607454,1109639650,1109743284, - 1109792437,1109874358,1109951400,1109983234,159450000, 1110005431,1110136504,1110251193,132187305, 1110343691,5177360, 1110361097,1110396224,911917068, 344736175, + 1109792437,1109874358,1109951400,1109983234,159450000, 1110005431,1110136504,1110251193,132187305, 1110343691,5177360, 1110361097,1110396224,911917068, 344736175, 445841418, 1110464186,1110557500,1110611643,1110674307,647184422, 550944805, 1110738876,1110818918,1110854266,115523624, 153911773, 47530020, 150536667, 1110901893, 1110955708,1111146498,1111165111,185270301, 8391421, 129876582, 1111212113,692410045, 1111245337,1111311547,1111364380,1111409565,1111491882,47939615, 1111545534, - 1111671215,1111709375,1111786764,1111840448,1111900244,425001993, 1111933034,1112020673,1112151746,1112228064,109135286, 1112266435,1112391723,1112427118,45433353, + 1111671215,1111709375,1111786764,1111840448,1111900244,425001993, 1111933034,1112020673,1112151746,1112228064,109135286, 1112266435,1112391723,1112427118,45433353, 1112479428,1112577733,1112690511,1112741574,1112883307,1112917139,52592642, 1112949050,1112985337,1113031115,352092258, 1113080655,361529646, 1113113006,1113167559, 1113425941,1113456642,122323395, 1113474688,3213172, 1113528008,1113589300,247530811, 1113642697,1113688085,1113719243,17809419, 1113770326,135414814, 1113817119, 1113834841,209616934, 1113866699,1113915418,1113933915,236667934, 1113997834,168820767, 1114035914,1114164982,355731477, 1114261641,1114342795,2195658, 1114393987, - 318832650, 1114439690,1114457517,1114506063,1114543819,1114603530,1114619925,1114636300,1114652698,1114669903,1114701834,1114718229,1114734604,1114750982,5390357, + 318832650, 1114439690,1114457517,1114506063,1114543819,1114603530,1114619925,1114636300,1114652698,1114669903,1114701834,1114718229,1114734604,1114750982,5390357, 1114767376,210583563, 1114783760,44466205, 1114805964,1115013142,1115029963,125927462, 1115084493,1115242508,1115258892,293601295, 866080462, 1115275348,1115308068, 10032847, 1115330256,1115406362,1115423612,1115473241,1115509188,1115576017,1115619394,1115653330,880919422, 1115686186,1115739858,37191927, 1115838163,1115887316, - 5325234, 109150260, 6029334, 713786191, 1115983695,1116034773,1116324341,1116356662,1116393141,1116474524,2147216, 1116525379,1116586060,1116624598,316735630, + 5325234, 109150260, 6029334, 713786191, 1115983695,1116034773,1116324341,1116356662,1116393141,1116474524,2147216, 1116525379,1116586060,1116624598,316735630, 1116700674,2146386, 1116717086,48627728, 1116755671,351043650, 110480021, 592561073, 1116897334,116064266, 1116931098,1116979681,601260044, 1117028782,1117081454, - 1117148888,1117260993,1117308718,1117411033,273679519, 1117492554,1117574874,1117701032,1117732866,18153482, 860423411, 1117749279,1117767105,1117804251,118883487, - 1117929538,1117962699,1118011850,1118044182,473251856, 1118066396,1118273592,1118307719,1118339118,1118388270,110298410, 1118437422,1118486582,1118520341,790069683, + 1117148888,1117260993,1117308718,1117411033,273679519, 1117492554,1117574874,1117701032,1117732866,18153482, 860423411, 1117749279,1117767105,1117804251,118883487, + 1117929538,1117962699,1118011850,1118044182,473251856, 1118066396,1118273592,1118307719,1118339118,1118388270,110298410, 1118437422,1118486582,1118520341,790069683, 884748, 1118574301,1118705374,1118765515,1118814646,223707174, 1118896417,1118928908,3260876, 1118946466,1119010826,1119027221,1119043596,963952655, 1119060006, 1119076383,1026228240,1119092878,1119126041,1119196895,1119436915,1119453221,8945721, 73744426, 1119469587,210206730, 1119486487,7700499, 7634954, 1119522095, - 933929, 1049968697,1119551509,1786867, 1119567900,1119584296,1119600662,17448988, 1119617806,1119649814,1119666217,1119682579,628180770, 1119698966,128761897, + 933929, 1049968697,1119551509,1786867, 1119567900,1119584296,1119600662,17448988, 1119617806,1119649814,1119666217,1119682579,628180770, 1119698966,128761897, 1119715354,11747385, 1119732648,1119764549,1119797253,96616579, 331776041, 1022951464,1119819488,1119899825,1119928339,1119944741,1119961104,115785768, 1119983329, 1120092170,1120108550,214319141, 157500274, 288964634, 1120540387,1120669819,170328079, 1120720612,955990032, 1120895035,1120927746,3228170, 318259229, 1120944728, 251527209, 154812521, 1120977375,1121015525,1121108728,174129376, 1121140738,47120420, 1121159933,1121206574,1121244902,1121371526,1121436611,6602790, 1121484892, 761184267, 1121523431,1121703656,2031747, 153075796, 1121763412,1121801961,1121882056,1121944642,1122009090,1122025498,1122041898,111656982, 177700876, 1122064106, 150241299, 1122144944,1122189419,404045883, 1122222513,1122254858,187236374, 1122277099,1122354097,1122391788,1122457325,319555329, 365054613, 1122566210,1122604782, 1122797433,1917982, 1122844753,1122877492,270516230, 1122916079,874201181, 1123024906,1123041343,1123079920,794363332, 1123145457,1123435031,1123468111,1123500042, - 99893264, 1123519465,1123587826,1032142874,1123664916,969080854, 1123713108,1123745802,1123762222,1123815279,674316370, 1123876963,45465615, 1123910103,55885866, + 99893264, 1123519465,1123587826,1032142874,1123664916,969080854, 1123713108,1123745802,1123762222,1123815279,674316370, 1123876963,45465615, 1123910103,55885866, 359481370, 1123943400,1123991562,184008741, 881786922, 1124008002,1124046579,1124158948,1124204566,200736806, 1124222814,381550618, 212107290, 1124288734,1124335626, 1124352430,1124402714,1124450763,338149469, 336658540, 1124505332,37748873, 163726900, 1124811904,1124859916,1124876314,1124892700,1124909087,1124925466,1124941862, 379256863, 1124964085,1125040888,1125072907,1125089292,450592867, 1125106424,1125139395,174587906, 1125187638,1125226230,1125351462,1125367824,1125384234,1125401008, @@ -2311,36 +2306,36 @@ static const unsigned int DictNodes[84251] = 1128663341,1128710170,1128726543,928776214, 1128744576,1128792102,1128808479,394575893, 1128825252,1128863487,1128973342,127041595, 1129010944,613302740, 1129202551, 1129240321,1129355010,127041602, 1129416270,2195769, 1129469699,1129529346,5292053, 701612034, 264830986, 1129546207,1129578508,174227482, 1129600772,1129676812, 1129693266,1129727079,1130108677,158500832, 1130251492,1130305286,1130397725,1130414960,1130463263,1130479627,168017936, 1130496907,220758042, 1130564120,1130632967, - 1130693738,110232961, 1130777904,1130829576,1130922897,115115038, 1130971220,1131003957,1131036704,1131075337,126763608, 1131170747,1131250095,1131282863,3211684, + 1130693738,110232961, 1130777904,1130829576,1130922897,115115038, 1130971220,1131003957,1131036704,1131075337,126763608, 1131170747,1131250095,1131282863,3211684, 730762543, 1131321098,1131463601,1131501323,1131665164,1131741189,1131757580,155631642, 1131774051,354304006, 1131806730,1131823106,1131840465,911786022, 1131888650, 55377949, 1131906875,134168674, 1131960077,1132103311,650051595, 1132151631,264142886, 1132183998,1132249848,16793729, 1132287758,1132364297,1132402447,1132445698, 1132462090,393478173, 1132484368,1132566289,805356655, 1132643258,1132711846,1132759731,1132795666,1132987245,4407339, 1133035560,791494685, 1133052337,1133085726, - 1133117899,1133167067,1133199426,366903780, 1133238035,1133287188,166133771, 1133477910,1133500181,328384531, 1133543462,1133559846,160546822, 1133576623,241942544, - 1133608972,44285978, 1133631254,1133708024,3244520, 1133740972,1133811479,1133854751,1133871969,372850912, 135397402, 1133905065,121307174, 1133936669,308658198, + 1133117899,1133167067,1133199426,366903780, 1133238035,1133287188,166133771, 1133477910,1133500181,328384531, 1133543462,1133559846,160546822, 1133576623,241942544, + 1133608972,44285978, 1133631254,1133708024,3244520, 1133740972,1133811479,1133854751,1133871969,372850912, 135397402, 1133905065,121307174, 1133936669,308658198, 1133958936,1134270233,51019798, 1134362683,1134395414,1134415727,31391784, 1134478204,7095641, 1134526476,234176523, 1134542904,385466582, 1134576481,1134608430, - 1134657582,31408130, 355043239, 1134706754,1134745370,515768422, 1134840553,1134952541,510314274, 1135004309,319143978, 1135050758,1135067164,1135083560,2261018, + 1134657582,31408130, 355043239, 1134706754,1134745370,515768422, 1134840553,1134952541,510314274, 1135004309,319143978, 1135050758,1135067164,1135083560,2261018, 132481478, 1135100009,112443411, 1135138587,7634973, 249987560, 1135215129,1135280181,1135312922,1135330833,712147376, 1135362585,1135427594,1135444000,1135478954, 1135542274,139984934, 1135564572,1135772992,1135804836,191070324, 4112500, 1135837221,1135855777,1135892253,1135968371,9535510, 19447845, 1135990558,1136050217, - 254967830, 144146473, 1136072479,1136170784,1136296052,7700517, 1136312436,1136328719,1949724, 1136345109,1136361509,1136377972,1136394280,53854230, 151175284, + 254967830, 144146473, 1136072479,1136170784,1136296052,7700517, 1136312436,1136328719,1949724, 1136345109,1136361509,1136377972,1136394280,53854230, 151175284, 1136410666,1136427049,1136443449,53854250, 1136459892,1136482081,1136525851,17809524, 1136564002,1136629539,1136754956,573734953, 1136803881,641466425, 1136820252, 1026048015,1136836677,1136869398,1136887969,2133372, 886472720, 255459331, 1136918529,1136934919,10584199, 1136952530,1136984083,581697652, 580861973, 1137000490, 1137016874,1137034075,1137066843,66814811, 1137104676,1137301285,1137491979,1137508363,1137524738,1137541162,1137557526,75530242, 6701097, 45137951, 1137579814, 1137656240,1137694503,112935838, 1137737952,2359335, 1137776424,193250334, 1137836257,1137869726,1137901871,1137934393,111067167, 1137956649,572080138, 1138081861, - 1138114570,1138136874,1138212890,2197662, 1138229267,17448981, 1138251563,1138278428,90521629, 1138294825,1138311194,1138327590,86081557, 48480372, 987086870, + 1138114570,1138136874,1138212890,2197662, 1138229267,17448981, 1138251563,1138278428,90521629, 1138294825,1138311194,1138327590,86081557, 48480372, 987086870, 1138343948,1138360342,1138380156,1138409588,1138425893,1138442693,1138477077,67469333, 1138513708,1138671642,1138688012,1138704395,1138720799,520372243, 1138739221, 1138769946,1138786346,1138802710,253624386, 1138825005,1138884634,1138901021,168820767, 1138922223,581697574, 1138966550,1138983046,1138999428,1139015702,1139032180, 1139048580,1139064967,27738246, 1139087150,48545802, 1139197012,1139245094,195690534, 48545808, 118210586, 1139261467,1139294218,1139310634,218611734, 1139326978, 1139343370,1009598493,1139359782,592445442, 1139382063,1139556373,1139572755,1139589139,1139607713,1139638388,63406116, 1139656025,1139689633,1139720629,1119502348, 59801621, 1139758896,1135902748,1139873585,1139916815,7585830, 1139933300,515506195, 435060777, 1136689194,1139949597,1139965993,1139982367,1140000972,1140031509, 7634966, 1140050106,1949715, 1140080680,1094959145,1140099233,1140129821,1140146292,1140163849,1140195338,1140211828,918454275, 17809449, 1140228203,1140263480, - 1140293654,1140310798,581107722, 1140342826,570867733, 1140359190,1140375621,1140408377,1140425378,1140459724,1140490261,628244490, 1140512562,1140588583,467747068, - 1140627251,1140692788,23380542, 635748392, 1140883522,1140916332,1140949295,1140982693,1141020469,1141080085,1141096486,1141112889,1141129237,1141145638,283967517, + 1140293654,1140310798,581107722, 1140342826,570867733, 1140359190,1140375621,1140408377,1140425378,1140459724,1140490261,628244490, 1140512562,1140588583,467747068, + 1140627251,1140692788,23380542, 635748392, 1140883522,1140916332,1140949295,1140982693,1141020469,1141080085,1141096486,1141112889,1141129237,1141145638,283967517, 717226005, 641794089, 1141162012,641466406, 1141528375,1141708600,1141785851,1141833794,1141867256,1141905209,1141981238,1142014489,1142079596,1142112294,1142128656, 835387418, 1142150970,1142228170,1142276577,1142325313,1142374419,520372246, 1142390868,1142423855,1142456421,350912524, 1142495035,1142685706,274350109, 1142702164, - 1142734947,13074447, 1142767670,1142800395,825638924, 542326810, 1142816794,1142833206,782729258, 1142866599,1142898728,1142915522,1142948377,1143019324,821772304, + 1142734947,13074447, 1142767670,1142800395,825638924, 542326810, 1142816794,1142833206,782729258, 1142866599,1142898728,1142915522,1142948377,1143019324,821772304, 268959765, 1143064644,1143111699,48513046, 1143128607,1070104632,1143183127,170328301, 1143227826,37191846, 1143291944,1143308319,127631370, 1143330621,1006059551, 1143373867,1143408163,1143461694,1143587861,1143639161,1143752068,1143816202,140247103, 1143832586,119357492, 1143850984,1143898152,3244140, 45433056, 1143914562, - 116375634, 1143947266,1143964702,1143996437,430718978, 1144012816,1144029194,112935307, 1144051519,1144100672,1144226710,1144280897,1144456564,1144504332,167985178, + 116375634, 1143947266,1143964702,1143996437,430718978, 1144012816,1144029194,112935307, 1144051519,1144100672,1144226710,1144280897,1144456564,1144504332,167985178, 1144523363,1144575810,1144717783,1144750383,1144788803,1144887108,1144964584,3538947, 1145018181,1145078297,2932792, 1145144188,149504029, 1145197751,1145344087, 1145389488,1145421845,1145438295,131334575, 1145487470,73187330, 1145521737,8391216, 1145602966,1145652298,37438972, 1145684034,207274000, 270942224, 1145722694, 1146061708,1146110391,1146143800,1146208318,1146257891,1146296135,61800580, 1146388546,1146425880,1146470430,233619522, 1146503234,1146535975,1087045638,1146574664, @@ -2352,37 +2347,37 @@ static const unsigned int DictNodes[84251] = 112935966, 1149685243,49774597, 1149748212,1149802326,1149976595,1149994039,459980822, 44318736, 32849961, 1150025755,620281884, 1150060840,1150124058,1037467679, 1150146391,1150206799,1150241456,153747540, 1150287893,1150304272,48513034, 1150321099,1150369802,1150389150,331677999, 1150435338,124862932, 1150457688,1150518761, 1150566403,111280165, 1150588761,1150818138,47546409, 1150943261,1150959703,404045912, 1151010164,1151058025,48513062, 1151090754,1151129435,1151178588,1151287322, - 1151303711,414023692, 1151321027,1151375197,1151467522,264716490, 1151489886,1151582210,121339915, 1151599757,603947467, 404051807, 759469920, 1151651323,138019275, + 1151303711,414023692, 1151321027,1151375197,1151467522,264716490, 1151489886,1151582210,121339915, 1151599757,603947467, 404051807, 759469920, 1151651323,138019275, 1151719265,1151895168,1151942694,158811220, 1151959099,1151991824,922370262, 1152009704,1152063330,1152172139,87539734, 1152205401,1152237634,131875116, 1152276323, 1152354676,1152417802,319143999, 1152434257,1152472932,1152614441,1152630810,247119938, 1152647199,1152663598,788430850, 36519978, 1152713131,1152745487,1152761871, 149930050, 1152779087,1152811018,114393119, 1152832306,134168632, 1152915301,177242117, 1085079573,476365234, 1153040898,1933319, 1153079142,1153155088,1153177447, - 1153286160,8393563, 198721555, 1153308520,1153390441,159137829, 1153613845,1153630245,641794076, 1153647637,1153696033,303349772, 1153728544,1153763896,581468200, + 1153286160,8393563, 198721555, 1153308520,1153390441,159137829, 1153613845,1153630245,641794076, 1153647637,1153696033,303349772, 1153728544,1153763896,581468200, 883852321, 1153794164,1153810922,628637717, 1153859625,1153875987,1153892468,102858753, 1153909999,1153941532,1153957917,454180883, 1153974288,611647525, 1153996650, - 377602084, 1154072605,766230556, 1154089076,581697565, 1154105350,1154121729,1154138154,1139867676,267681818, 1154157871,1154187274,21151785, 79937558, 7585807, + 377602084, 1154072605,766230556, 1154089076,581697565, 1154105350,1154121729,1154138154,1139867676,267681818, 1154157871,1154187274,21151785, 79937558, 7585807, 1154209643,1154269212,919748618, 1154285589,115458105, 1154301980,514015270, 1154324332,1154367545,1154383913,1154400278,21151765, 1154416678,1154433045,1154449445, - 581697547, 1154465833,1154483902,918454313, 1154684782,1154990110,1155025126,1155075346,1155137644,1155176303,1155383599,1155422064,1155498005,1155514384,139329562, + 581697547, 1154465833,1154483902,918454313, 1154684782,1154990110,1155025126,1155075346,1155137644,1155176303,1155383599,1155422064,1155498005,1155514384,139329562, 1155531639,1155563574,361431106, 1155596294,292110651, 1155612688,1155629094,46219295, 1155646320,1155694645,1155728811,114098178, 1155782513,480445334, 1155880818, 1155943474,1035895219,1156011891,1156218978,1156251664,1156268876,1156317486,20365317, 1156350006,157499443, 1156388724,1156612333,500269072, 1156650869,1156726786, 412140199, 1156743252,1156776028,825327626, 1156808716,125927466, 1156831094,1156880247,1156973120,1157005377,1157060472,1157103638,77512706, 254591042, 1157120459, 1157170345,1157201936,1157218310,1157234699,1157251103,1157267477,1157283862,737771557, 1785885, 1157302935,1157388153,204537866, 56655883, 1157486458,1157666683, - 1157742638,50266149, 1157793942,55263272, 1157846908,1157939222,1157957834,1158004764,291160080, 1158027133,1158283348,4751391, 1158316078,1158365222,507379766, + 1157742638,50266149, 1157793942,55263272, 1157846908,1157939222,1157957834,1158004764,291160080, 1158027133,1158283348,4751391, 1158316078,1158365222,507379766, 1158381578,1064420273,487360869, 1158398888,146653226, 182910978, 1158436734,1158545434,208011866, 1158561808,52445205, 303611920, 1158578207,1158594641,1158627380, 284918705, 1158666111,1158873579,824492969, 1158911872,1158977409,6373735, 1159023056,250937350, 1159075714,1159151675,1159184412,1159200806,1159217154,1159233542, 134021141, 1159255939,1159331899,1159365905,1159414235,1159452548,1159758837,1159823398,1159845765,1159894918,1159954458,99680272, 1159970921,1160004043,1160052773, 1160075143,8388876, 3309579, 1160167434,1160183814,48447503, 1160200279,1160249363,813875237, 617496592, 1160267557,268451866, 1160318500,1160369151,1160435592, 5308630, 1160511920,1160544689,1160577067,1092207069,1160610620,1160664969,1160746890,1160806412,2670630, 1160823087,1160855580,1160871995,1160904723,1160921100, - 1160937478,1160953877,1058635788,1160970306,1161004041,1161041803,315588627, 1161150483,1161166874,1161183263,42434575, 1161205644,1161379859,1161396227,5603364, + 1160937478,1160953877,1058635788,1160970306,1161004041,1161041803,315588627, 1161150483,1161166874,1161183263,42434575, 1161205644,1161379859,1161396227,5603364, 1161416527,45432895, 472891751, 1161464585,1161510928,1161527322,1161543701,1161560095,537772051, 1161576460,879837200, 1161593278,1161658406,125321237, 1161675261, 1011957797,1161729149,1161805874,1161838895,262275094, 1161877389,466485264, 1161942926,1162002519,1162051694,1162084782,125026342, 1162139535,126599204, 1162199066, 1162215440,1162231829,344850444, 1162248624,565772317, 1162282449,1162334289,483164188, 1162379286,1162398849,148848655, 1162445239,1162483600,260460327, 1162614673, - 56000543, 1162658552,728154122, 147013642, 1162691031,526368780, 1162729362,1162870919,1162887210,13303818, 1162909587,1163035657,1163068339,1163100172,142262298, + 56000543, 1162658552,728154122, 147013642, 1162691031,526368780, 1162729362,1162870919,1162887210,13303818, 1162909587,1163035657,1163068339,1163100172,142262298, 1163116575,1163132938,132857898, 1163149364,1163188116,1163231238,1163247668,273121387, 1163280396,1163299084,1163335573,1163411543,1163461541,1163493387,1163509776, 1163526150,1053147155,1163543016,1163581334,1163624486,1163640863,195264522, 1164105624,858325013, 1164154777,155926568, 1164285850,1164394562,345997324, 1164427283, 294633509, 406306832, 1164443667,1164460048,226951194, 1164476428,1164492810,226951197, 5341722, 1164515227,8390461, 1164613532,1164756514,1164804108,1164821394, - 1164870594,1164904202,1165006749,1165082646,1165099020,1165115413,1165131797,1165148191,1165164559,1165180930,1165197350,377225218, 193708131, 1165214609,116375634, - 1165262955,1165296148,67059717, 1165350814,739377647, 1165393961,164036614, 1165411144,1165508703,1165558788,287130654, 1165623352,1165656148,1165688913,498483960, - 1165727647,1166071712,178126950, 1166170017,1166202786,8392164, 1166265455,1166311470,1166365286,1166412046,4292674, 1166459351,565231622, 1166497699,425361896, - 1166624296,1166688277,322715670, 1166704666,1166721030,46448642, 1166743460,1166791903,1166869589,1166901340,1166934032,27852857, 1166951814,1167021989,108315119, + 1164870594,1164904202,1165006749,1165082646,1165099020,1165115413,1165131797,1165148191,1165164559,1165180930,1165197350,377225218, 193708131, 1165214609,116375634, + 1165262955,1165296148,67059717, 1165350814,739377647, 1165393961,164036614, 1165411144,1165508703,1165558788,287130654, 1165623352,1165656148,1165688913,498483960, + 1165727647,1166071712,178126950, 1166170017,1166202786,8392164, 1166265455,1166311470,1166365286,1166412046,4292674, 1166459351,565231622, 1166497699,425361896, + 1166624296,1166688277,322715670, 1166704666,1166721030,46448642, 1166743460,1166791903,1166869589,1166901340,1166934032,27852857, 1166951814,1167021989,108315119, 1050706599,1167065172,1167103910,47349775, 1167228930,1167245411,1167278146,2196084, 1167316903,6620271, 456523778, 1167458316,396771409, 1167477169,1167524272, 1167556664,1167589407,1167607233,1167639460,85115014, 1167693736,1167933858,758448165, 1167972265,407978415, 1168031837,1168085938,5325295, 1168147459,1168195643, 716260273, 1168234410,1168359851,1168392223,1168409207,469352500, 1168447403,850214971, 1168527156,112936281, 827260947, 1168607462,1168660396,1168807853,1168885081, @@ -2392,9 +2387,9 @@ static const unsigned int DictNodes[84251] = 269189229, 1171243971,1171293959,896664631, 1171341742,1171396536,1171462073,1171522472,1171554759,1171603563,1171636300,2933834, 1171675066,1171785327,1171832863, 1171849248,1171882030,1171935768,1171981578,1172013058,280903711, 750665829, 182829115, 1172030793,1172078696,120045675, 1172133819,1172258857,44171270, 1172275231, 1172291638,1172324638,1172373963,52576287, 1172428732,763762621, 1172685736,1172717594,1172740030,1172815882,20365354, 10371098, 1172833103,1172865641,1172903871, - 1173084096,1173144152,864256021, 307134470, 1173176623,1173215169,1173373442,45434247, 1173411439,7258155, 1173477314,657145887, 1173526467,1173618716,379093004, + 1173084096,1173144152,864256021, 307134470, 1173176623,1173215169,1173373442,45434247, 1173411439,7258155, 1173477314,657145887, 1173526467,1173618716,379093004, 157499871, 390515969, 1173635525,1173673924,655851722, 1173815342,294207514, 1173870533,1173962857,1173996280,1174028430,1174063680,441466906, 683933698, 1174116294, - 1174345671,1174406930,1174454293,1174470682,541589520, 1174490511,1174552614,147063669, 1174569044,258097178, 1174604573,1174700792,1174733103,460407817, 2130791, + 1174345671,1174406930,1174454293,1174470682,541589520, 1174490511,1174552614,147063669, 1174569044,258097178, 1174604573,1174700792,1174733103,460407817, 2130791, 1174771656,1174849298,1174896678,1157908983,2129960, 48054282, 1174913083,1174947270,1174995704,45891610, 1175029111,1175110392,1175146982,1175191606,1175224799, 1175257134,1175306286,1175356501,1175388697,8392454, 1175453734,1175470139,1175506991,1175558089,1175781457,421429274, 1175820234,1176223753,1176240265,1176256671, 1176295371,1176360908,1176421999,560022025, 1176469588,1176506245,1176585216,163299375, 871219559, 1176617015,1176682534,1176698918,1176715348,1176748092,1176831381, @@ -2403,18 +2398,18 @@ static const unsigned int DictNodes[84251] = 1177868241,1177917394,477938185, 1918121, 398426140, 1177995747,1178026891,1178092874,37437649, 17842305, 1178163155,1178245076,1178387033,3212194, 1178425301, 1178550363,132644901, 1178583265,1178616487,1178648602,1178664991,1178681350,335151126, 1178698761,6324226, 1178736598,1179047895,299794454, 109150683, 1179141682, 1179205723,1027620874,1179238403,1179254820,1179271599,1179310040,1179423441,1179517365,124862569, 45645890, 1179551842,1179598860,11124748, 398198940, 1179621337, - 1179749035,78905350, 1179779099,1179817946,1179893827,1179975787,1180014555,191053834, 1180124072,1180155906,8394716, 166156253, 1180172354,1180205687,2195935, + 1179749035,78905350, 1179779099,1179817946,1179893827,1179975787,1180014555,191053834, 1180124072,1180155906,8394716, 166156253, 1180172354,1180205687,2195935, 1180238976,1180288030,1180325854,702661479, 1180437059,1180488054,2359312, 1180516418,1180550174,144097700, 1180587999,1104415070,1180647857,1180680650,1180719072, 1180991989,203571659, 1181026950,1181073945,2361819, 2130220, 1181139403,1181189439,1181259745,1181358050,1181419434,418055371, 8390745, 1181489123,1181568569, 124469332, 55754764, 1181630767,1181669348,176753126, 1181892630,68239905, 1181915109,737427472, 1785893, 1181976331,17842286, 254443530, 174064049, 1182062566, 1182122414,333496351, 1182177255,1182220591,865420474, 1182254135,1182285846,454099003, 1182308328,103284748, 1182516319,920190992, 1182580765,1182597122,1182613515, - 1182629899,1182646284,119537690, 775176218, 1182662715,319619082, 1182695511,17809434, 1182745655,1182777366,1182793787,1182826534,2196929, 1182842934,333135915, - 1182881769,865107990, 1183127530,1183220648,1183254496,203822169, 287145994, 1183307755,1183367267,1183400173,1183433547,269189249, 1183504364,17842653, 522977755, + 1182629899,1182646284,119537690, 775176218, 1182662715,319619082, 1182695511,17809434, 1182745655,1182777366,1182793787,1182826534,2196929, 1182842934,333135915, + 1182881769,865107990, 1183127530,1183220648,1183254496,203822169, 287145994, 1183307755,1183367267,1183400173,1183433547,269189249, 1183504364,17842653, 522977755, 1183586285,1183645708,94109707, 1183662092,1183679273,351911946, 1183712103,1183750126,1183842446,1183879264,1183930351,404325406, 1184022554,1184038951,1184072873, - 1184104477,1184120891,1184153631,1137557510,1184171159,1184225264,306937866, 1184338466,828932106, 1184416174,1184471025,1184547870,7734801, 1184585714,150913062, + 1184104477,1184120891,1184153631,1137557510,1184171159,1184225264,306937866, 1184338466,828932106, 1184416174,1184471025,1184547870,7734801, 1184585714,150913062, 1184634867,1184694409,1184710791,51658883, 82280471, 1184957086,1185337506,1185367712,1185398803,150142998, 1185421302,1185563984,174047238, 1185612694,1185661021, 1185711134,1185742911,1185777683,1185825243,291160076, 1185863671,49905674, 1185961976,23380306, 1186088871,844137319, 1186123709,1186202071,5309786, 1186235880, - 1186289657,1186486266,1186584571,1186676738,1186693228,1186725942,1186764796,5308846, 27624354, 1186879485,273088522, 1186956292,1187021933,237731850, 108320766, + 1186289657,1186486266,1186584571,1186676738,1186693228,1186725942,1186764796,5308846, 27624354, 1186879485,273088522, 1186956292,1187021933,237731850, 108320766, 1187054432,1187125247,153207306, 1187207168,1187299430,1187333558,131989525, 1196089, 1187387393,1187485698,1187561531,1126880869,1187595348,1187649539,1103026180, 1187846050,1187907389,2342931, 1187954754,1187988878,1188053074,120979931, 1188085791,1188102163,1188118571,1188152523,1188187703,165134358, 1188234820,1188304901, 1188648966,8390272, 1188726383,1188780039,24298010, 1189085230,1189134358,1189150751,1189167142,1189183517,5177370, 1189199874,1189218163,1189255176,1189331247, @@ -2425,40 +2420,40 @@ static const unsigned int DictNodes[84251] = 835420176, 423444938, 1191483410,1191581715,1191647252,1191739824,1191772206,895090719, 1191827477,1191920141,71483402, 1191972363,1192083512,1192122390,1192247327, 258965546, 1192269847,885162036, 1192330216,137101344, 141459472, 1192378911,1192433688,1192509664,1192542274,1192574992,182059018, 880918946, 1192597529,1192755266, 3244091, 275480578, 1192788436,1192821182,1192887655,191906552, 1192952906,448544806, 139984912, 1193296002,13549605, 1193318427,1193444742,733894684, 1193515037, - 324534284, 1193706703,1193777182,175800780, 1193859103,1194067356,1194115078,138575914, 1194134542,1194203168,206723105, 16941248, 1194691529,1194737666,3246566, + 324534284, 1193706703,1193777182,175800780, 1193859103,1194067356,1194115078,138575914, 1194134542,1194203168,206723105, 16941248, 1194691529,1194737666,3246566, 1194759925,1194842146,319143973, 1194902264,1194935186,1194983426,1195000032,1195032660,404638182, 1195071523,1195163735,1195216429,333135931, 1195262382,1195317284, 1180205098,1195360303,1195399205,1195460153,1195558933,1195589664,1195628582,1195707985,1195754511,1195803913,1195835446,227639298, 1195868969,1195907111,1195999469, 465846274, 1196033118,1196082270,1196130841,1196202024,427901807, 468320283, 1196262338,1196300329,1196349482,788284714, 366575642, 227495121, 1196491561,1196526701, 1196610550,1196671863,1196709931,1196851252,7258688, 1196884983,544556377, 1196951830,1197034745,1197080642,1197113410,1197152300,1197377068,1197408715,1197459065, - 1197506619,136119326, 1197540361,719487060, 1197578285,1197655209,1197687307,1197742126,1197889583,27738148, 1197938736,1197998146,1198030953,1198063654,19267596, - 1198080059,1198118961,194101250, 1198309468,1198342228,1198374952,111067146, 336838672, 1198392183,1198424148,1198456872,717340698, 1198768934,1198801806,25559096, + 1197506619,136119326, 1197540361,719487060, 1197578285,1197655209,1197687307,1197742126,1197889583,27738148, 1197938736,1197998146,1198030953,1198063654,19267596, + 1198080059,1198118961,194101250, 1198309468,1198342228,1198374952,111067146, 336838672, 1198392183,1198424148,1198456872,717340698, 1198768934,1198801806,25559096, 1198866911,44351526, 1198905395,1198987316,1199145041,27623478, 1199177740,1199194122,710705173, 1199216693,1170882562,1199325268,48627722, 1199358489,1199429686, 1199507081,1199609911,1199705965,8394405, 140788936, 1199773752,1199882345,1199915855,232079400, 460406836, 285081684, 1199947802,1199965574,385516544, 1200029698, 128106534, 1200046185,1200079712,1200150585,1200216122,1200363579,1200424326,1200489366,308576287, 1200537612,1200553986,48676879, 1200576572,1200635950,1200691261, 1200904254,1201013496,1201051711,1201094677,1201111124,1201144267,1201193574,1201230452,1201291351,342720552, 1201346624,1201520748,1201553410,5001872, 1201576001, - 1201635865,1201701387,1201750062,1201800691,1201838146,1201914487,1201948038,1202013817,1202062173,1202096567,1202162089,1202193302,1202602040,1202640964,313786467, + 1201635865,1201701387,1201750062,1201800691,1201838146,1201914487,1201948038,1202013817,1202062173,1202096567,1202162089,1202193302,1202602040,1202640964,313786467, 1202717868,1202765934,1202799055,1202837573,460325908, 242466847, 1202919494,1203013862,1203065634,265814045, 1203110403,1168458223,2195525, 479461802, 1203165255, 1203230792,1203274638,1203340197,108658699, 1203378249,735724651, 1203492938,1203667247,1203700012,1203732536,794608604, 1203771467,1203851218,425771010, 1203913622, 1203963637,140477249, 27623490, 1204017228,1204192150,1204243645,88686594, 1204289967,134709286, 1204322350,1204371554,373325908, 1204410445,1204600844,1204617256, - 1204633621,1204649990,1204666387,151093270, 1204684736,141787164, 6948505, 112935945, 1204765170,1204814283,1204863007,481820691, 1204879372,47317002, 611434533, + 1204633621,1204649990,1204666387,151093270, 1204684736,141787164, 6948505, 112935945, 1204765170,1204814283,1204863007,481820691, 1204879372,47317002, 611434533, 1204901966,1205010537,1205043240,848609292, 1205059630,1205109769,1205141533,271384607, 1091930463,1168623089,1205164111,1205272598,136118730, 1205288989,1205311568, 1205436442,465223692, 44171280, 1205452866,1205491793,1205534804,1205573714,1205649417,17432599, 437240841, 1205665858,1205699605,1205750749,1205803091,1205928537, 5342377, 1205961513,51609641, 1205994232,1206032468,1206310997,1206407576,1206491222,1206566978,1206599711,1206617721,19447837, 1206671447,1206747163,1206786136, - 348931036, 1206867481,1206911017,1206929877,407979038, 1206966361,1207010753,1207048282,1207143389,1207195739,1207392348,1207500816,55853068, 490684475, 258637881, + 348931036, 1206867481,1206911017,1206929877,407979038, 1206966361,1207010753,1207048282,1207143389,1207195739,1207392348,1207500816,55853068, 490684475, 258637881, 1207519334,1207566767,1207605341,1207703646,1207762990,1207812106,472711209, 1207834719,501383178, 1207926850,1207965792,1208107039,150585775, 271925279, 1208123395, 1208139792,30392325, 1208157122,1208195169,1208254480,1208270874,2360226, 741212191, 1208289252,1208320303,1208359010,1208467478,1208483845,364642370, 1208503910, 1208533033,2539531, 1208549404,1208565762,32637065, 1208583475,1208631322,1208647925,1208696981,1208735843,1208909864,628981798, 1208927258,1208977569,1209009142, 1209040906,1209057302,1209073780,7634945, 1209092420,1209122826,1209139228,1209155626,79511668, 852115477, 1209172281,17449095, 1209210980,1209237561,1209253909, 1209270308,2195909, 1209286678,1209305656,1209339308,1209385001,1209401373,1209417844,1140047910,1209434154,1209450517,22331408, 581287957, 1209466890,1209483305, - 115458088, 1209866342,1210089474,43532299, 1210106315,1210161255,1210204170,545767440, 1210222839,159432820, 4079618, 1210286120,1210302495,110723129, 27852815, + 115458088, 1209866342,1210089474,43532299, 1210106315,1210161255,1210204170,545767440, 1210222839,159432820, 4079618, 1210286120,1210302495,110723129, 27852815, 1210318886,539344912, 555270146, 1210335313,1210368031,1210384386,300548203, 186974318, 1210401071,1210433568,1210472552,1210620009,145440770, 142835752, 1210669162, 2195532, 3212129, 49774598, 1210712066,563347466, 126025750, 1210734699,1210826762,1210843624,1210877551,1210925068,191649900, 1210947693,1211040266,1211078766, 663601162, 1211140757,253935654, 1211187287,176488474, 1211236655,237731859, 864289382, 1211269547,1211301899,1211318274,257638438, 1211334704,1211390063,1211455600, - 1211547714,140247905, 1211580442,1211596902,1211629871,1211662357,1211679320,1211711544,1211750513,1211809823,1211831727,121307162, 238714946, 1211881586,771359208, + 1211547714,140247905, 1211580442,1211596902,1211629871,1211662357,1211679320,1211711544,1211750513,1211809823,1211831727,121307162, 238714946, 1211881586,771359208, 1211973739,79970341, 1212012659,1212039180,1212056050,1212105667,1212153896,1212170250,1212186653,1212203485,1212236013,27623884, 1212274804,1212448827,1212483005, - 621101095, 1212536949,88948742, 1212615120,1212662606,1212727767,1212760106,3686406, 1212776927,1212813833,1212864630,1212991331,131319091, 1213056030,115770191, - 1213088219,1213120618,1213202634,1213239786,1213287296,185270298, 1213349928,1114119, 1213367187,1213421687,1213500950,1213582677,1213644826,1213661190,516833318, - 1213677580,170442778, 1213694411,1213743211,1213775913,1213792702,1213864056,547619576, 1213923340,1213939814,1213972546,1214005780,1214054438,1214070795,899842895, + 621101095, 1212536949,88948742, 1212615120,1212662606,1212727767,1212760106,3686406, 1212776927,1212813833,1212864630,1212991331,131319091, 1213056030,115770191, + 1213088219,1213120618,1213202634,1213239786,1213287296,185270298, 1213349928,1114119, 1213367187,1213421687,1213500950,1213582677,1213644826,1213661190,516833318, + 1213677580,170442778, 1213694411,1213743211,1213775913,1213792702,1213864056,547619576, 1213923340,1213939814,1213972546,1214005780,1214054438,1214070795,899842895, 176472085, 1214093433,1214388346,1214447628,1214464026,756121621, 108331487, 1214481293,1214563230,1214601339,499007919, 1214748796,1214826095,8392160, 1214879869, 326615124, 1214929022,1215086638,1215135886,1215168552,3245006, 1215191167,1215266923,1215299590,4685845, 176750697, 1215315984,1215338624,1090846732,1215399081, 1215430666,560316503, 1215447577,1215516150,27852811, 1215600769,1215676470,1215713132,51495759, 1215764610,1215808488,1215856699,183189525, 1215894105,1215955028, @@ -2466,15 +2461,15 @@ static const unsigned int DictNodes[84251] = 1216747655,1216921657,1216938000,394461203, 1216954374,1216970773,1216988112,1217019961,1217036304,1217052691,1217069058,152272934, 1217085466,1217101854,1217134651, 1217167819,1217216619,150913034, 170442764, 1217250944,1217304712,1217347610,354549762, 1217363970,1217380833,146456581, 1217435785,1217714314,1217796023,1217871882, 125927461, 1217888258,1217905833,1217937847,1217971983,790626306, 1218019430,8393711, 1218053194,1218084885,1218101274,252100620, 1218123915,233475201, 1218199841, - 1218235086,1218353292,1218413796,1218467981,1218609607,19257486, 1218664591,1218713744,1218844190,1218921862,1218986010,1219002374,1219019246,1219057809,249266198, + 1218235086,1218353292,1218413796,1218467981,1218609607,19257486, 1218664591,1218713744,1218844190,1218921862,1218986010,1219002374,1219019246,1219057809,249266198, 1219123346,712149548, 1219399337,1219451027,1219544173,1219582100,1219609336,1219642259,157155382, 10652117, 1219690527,1219707331,233193494, 1219740952,1219808721, 1219854348,194084902, 1219872703,252330010, 1219971353,25559145, 1220040853,652378583, 1220100112,1220117087,1220155542,1220264783,1220297551,1220329510,1155286515, 1220345948,1220384919,762331162, 1220461770,1220510708,1220559902,1220592230,404636080, 1220624814,1220679832,1220974745,1221040282,299794438, 525238274, 1221116201, - 1221149780,1221198689,1221230668,1221269659,1221346370,1221410868,886691996, 1221443683,1221476458,797442085, 208503729, 1221564573,858144770, 1221689346,29622308, + 1221149780,1221198689,1221230668,1221269659,1221346370,1221410868,886691996, 1221443683,1221476458,797442085, 208503729, 1221564573,858144770, 1221689346,29622308, 1221705794,1221744798,121028639, 1221923618,1221974175,1222072480,1222115330,8390037, 1222134038,1222214481,1222349760,1222399858,1222459935,1222514849,1222740397, - 1222787112,2998282, 1222804502,1222853049,1217101890,1222901772,87539718, 1222924450,1223000095,128451020, 1223017758,1223065707,1223098398,1223131148,8394915, + 1222787112,2998282, 1222804502,1222853049,1217101890,1222901772,87539718, 1222924450,1223000095,128451020, 1223017758,1223065707,1223098398,1223131148,8394915, 1223152494,1223196684,1223213109,1223252132,1223294998,258768950, 1223311845,1223410572,1223465125,792281098, 1223541688,1223589914,55377931, 1223612452,1223655426, - 189038614, 1223678118,712982538, 59785242, 1223886593,1223938569,115769400, 1223989415,1224022184,191053862, 1010583404,1224133389,1224196184,225181706, 131876885, + 189038614, 1223678118,712982538, 59785242, 1223886593,1223938569,115769400, 1223989415,1224022184,191053862, 1010583404,1224133389,1224196184,225181706, 131876885, 1224228931,1224310843,1224343578,123273242, 1224366249,1224480938,1224573416,1224607280,1224638506,7307380, 44941333, 44941334, 385564712, 1224654858,1224673421, 1224720468,1224753190,1224770454,1224820747,1224884246,17007399, 1224902998,712589322, 1224949800,2261129, 1206616067,1224966658,1224998943,2130012, 1225016329, 1225050051,1225097254,1225113611,1225129991,1225146396,1225162764,969687045, 1225185451,1225375780,1225392149,1225408521,1225424922,44908586, 1225446233,1225507430, @@ -2488,7 +2483,7 @@ static const unsigned int DictNodes[84251] = 802848780, 109215770, 1229373524,1229406267,171000279, 1229440200,516833306, 1229478074,1229602892,1229635615,1229652192,1229686564,1229734423,154403291, 1229766695, 1229799471,617922606, 1229832220,737427496, 1229848578,1229864986,1229881375,246087691, 1229904059,1229997032,1230051516,1230117053,1753104, 1230176268,1230192650, 147013661, 1230215358,1230389330,1230422062,1230477503,3229362, 1230573179,414580748, 1230624960,1230701768,1230733324,343294970, 1230749755,1933348, 1230782958, - 125927439, 1230821569,1231100098,55033862, 1231192601,1231263939,1231323243,1231357485,1231411396,1231476933,1231552538,1231568898,957136907, 1231591622,131842155, + 125927439, 1230821569,1231100098,55033862, 1231192601,1231263939,1231323243,1231357485,1231411396,1231476933,1231552538,1231568898,957136907, 1231591622,131842155, 44466198, 1231634478,1231689927,1231755464,1231783796,1231815503,1231847470,1231902921,1232076837,349716492, 407536649, 1232093196,3212024, 1232109584,1232132298, 1232175142,389365776, 1232191510,1232207903,1232224294,247529548, 1232240666,52330518, 1232261610,1232306228,1232338971,1232371718,1232388148,1232427211,1232525516, 1232617531,1232652066,310640677, 1232686114,1232748642,310640677, 521830466, 1232781371,55033882, 1232820429,1233082574,1233158160,235438187, 7094311, 1233180879, @@ -2497,10 +2492,10 @@ static const unsigned int DictNodes[84251] = 1234290383,533135362, 1234321420,1207517294,1234344148,1234534459,154796968, 1234572297,109052141, 1234619233,1234685878,456067230, 1234748616,414236688, 1234786517, 1234862913,3244140, 1234896849,1072857154,1234944314,1234983126,1235173518,1235206236,1235238924,1090732038,112607341, 270942239, 1235255910,1235294423,1235356244, 1235402818,1235441880,56164371, 291225659, 1235491033,1235583019,738639909, 1235616891,1235648815,1235687642,1235818715,1235900636,1236008971,152027167, 1236025647, - 478954526, 1236058155,1236094813,1236146397,1236500503,9961495, 1236523230,192872470, 50659359, 1236683978,1236746266,1236768991,1236829384,1236860930,3244570, + 478954526, 1236058155,1236094813,1236146397,1236500503,9961495, 1236523230,192872470, 50659359, 1236683978,1236746266,1236768991,1236829384,1236860930,3244570, 1236878159,433831962, 1236910538,1236943873,1236992537,1237058713,1237106940,1237145824,1237288698,198721558, 1237319696,5177349, 1237342433,32849939, 1237532703, - 1237550290,164036620, 1237581908,1237614658,4310219, 1237647502,1237680194,1237719266,1237876776,291094610, 1237894596,1237925914,1237942282,731709442, 163643446, - 1237965027,1238194404,271925251, 1238325477,996638760, 271384604, 1238472934,469123112, 421970346, 1238646868,1238685927,1238782425,1238863844,1238908947,209191403, + 1237550290,164036620, 1237581908,1237614658,4310219, 1237647502,1237680194,1237719266,1237876776,291094610, 1237894596,1237925914,1237942282,731709442, 163643446, + 1237965027,1238194404,271925251, 1238325477,996638760, 271384604, 1238472934,469123112, 421970346, 1238646868,1238685927,1238782425,1238863844,1238908947,209191403, 1238925333,1238942922,1238992603,1239023647,1239040010,1239056468,1239089173,1239105623,1239154730,204570636, 1239171979,1239238192,1239269397,1239285819,1239324904, 1239416891,1239449610,522387495, 126042124, 1239472361,466485279, 1239547930,181257804, 1239570666,1239636203,1239696478,6619224, 1239745376,194069002, 1239812117, 1239842903,1239892882,196952090, 1239941550,7094801, 1239996652,1240291565,299008040, 1240449026,1240466929,1240498260,2196321, 72368130, 1240537326,1240645642, @@ -2510,102 +2505,102 @@ static const unsigned int DictNodes[84251] = 1242515395,935166044, 1242562653,1242613699,1242667251,371311352, 1242794311,244908044, 1242841547,55132189, 1242896628,1242988582,1243004940,29900837, 1243021342, 1243054222,1208532994,1243086858,1243103234,457539599, 1243119919,1243535606,528777519, 1243693058,108314726, 1243711026,389136475, 1243776075,1243846903,1244202106, 1244270702,1244319277,1244364802,335446057, 1244381225,247234601, 1244398035,1244450176,111624232, 1244502264,1244561550,1244594191,664044618, 1244610626,1244643354, - 1244659731,1244676118,1244692511,300777484, 1244710278,1244777911,1244879097,1244939049,1244971467,1245026554,1245134870,1245151272,469614603, 1245167700,3213164, - 1245203293,1245233164,800244757, 1245249566,409944090, 1245282335,1245298709,1245315560,110232138, 1245347921,1245387003,1245544507,1245579955,57032730, 404046711, + 1244659731,1244676118,1244692511,300777484, 1244710278,1244777911,1244879097,1244939049,1244971467,1245026554,1245134870,1245151272,469614603, 1245167700,3213164, + 1245203293,1245233164,800244757, 1245249566,409944090, 1245282335,1245298709,1245315560,110232138, 1245347921,1245387003,1245544507,1245579955,57032730, 404046711, 1245616380,1245790968,388120800, 1245823878,889274434, 1245855746,1245872235,1245911293,240583592, 1246003729,1246042366,1246152664,1155957211,1246217155,1246265450, 1246353108,1246451967,992117583, 1246593426,1246664960,1246796033,2130454, 1246872918,5324900, 1246927106,1247019010,159449195, 1247036745,1247085768,1247123715, 1247347998,1247395866,423346627, 288768600, 1247415043,1247494603,115606679, 1247544968,20365328, 1247592514,1247631620,1247756372,1247789061,96419842, 1247805531, - 159137814, 836517890, 1247844613,1247887426,1247920174,116883499, 1247969965,27607078, 1248024838,110248046, 1248198658,1248215043,1248231426,136921114, 280035394, + 159137814, 836517890, 1247844613,1247887426,1247920174,116883499, 1247969965,27607078, 1248024838,110248046, 1248198658,1248215043,1248231426,136921114, 280035394, 1248247862,1248286983,1248346134,1248362522,1248378896,47611915, 1248395290,1248411664,156434472, 1248432729,1248493661,1248549128,1248626036,1248680201,1249018046, - 34701461, 1249083476,1249117007,1249148938,1249165318,6029333, 1249188106,1249597708,1249789427,1249821111,1249853539,131269455, 251822305, 8389526, 116277254, - 1249892621,1250004627,1250052931,609714178, 1250118409,476020799, 1250171150,1250236687,1250345411,1250380425,1250448677,1250498832,131858953, 1250607106,13549594, - 910163980, 1250623541,1250662673,1251039506,1251147860,1251181727,1251219731,1251268884,24298329, 1251328809,1251367189,1251512274,1251575070,1251622933,27624386, + 34701461, 1249083476,1249117007,1249148938,1249165318,6029333, 1249188106,1249597708,1249789427,1249821111,1249853539,131269455, 251822305, 8389526, 116277254, + 1249892621,1250004627,1250052931,609714178, 1250118409,476020799, 1250171150,1250236687,1250345411,1250380425,1250448677,1250498832,131858953, 1250607106,13549594, + 910163980, 1250623541,1250662673,1251039506,1251147860,1251181727,1251219731,1251268884,24298329, 1251328809,1251367189,1251512274,1251575070,1251622933,27624386, 1251640606,1251688532,1251721275,1251760406,935166094, 1251837674,1251902327,1251934640,1251966986,434405388, 1251983372,1252004123,1252049743,1252083244,1252115032, 1252147737,2130021, 7144651, 1252213166,1252261986,144424972, 1252295670,1252327516,1252366615,1252507674,829308930, 2834537, 564232246, 1252530456,1252612377, 1252687971,1252720686,103546882, 177346842, 1252776219,1252966685,166346754, 134627330, 1252999210,50086315, 1253017927,1253064723,1253081110,529022978, 1253097709, 594214931, 1253136668,1253265620,870334490, 1253326860,1253345233,1253392400,3719256, 351010826, 1253409071,1253442461,1253529885,1253621800,125812767, 1253644574, 2195612, 1253803017,1253834794,110182827, 1253857567,1253939488,1254049701,1254129674,1254152481,1254201634,1254326311,639500393, 1254359354,1254391892,1254428940, 386357539, 1254544732,191184902, 1254621190,307233613, 1254644004,1254703133,137363851, 1254719544,575733800, 1254758693,1254803528,687013926, 1254932573,1254982066, - 1255014416,1255030822,67043366, 1255048131,1255096622,1255129576,1255161875,1255178262,1255194640,1255211034,123404317, 1255227498,1255315750,1255391319,84721670, - 1255443675,1255538793,1255577895,1255735370,1255801775,1255866410,1255883041,1255921960,1256015893,1149749406,1256053033,1256167722,1256308820,1256341520,490340373, + 1255014416,1255030822,67043366, 1255048131,1255096622,1255129576,1255161875,1255178262,1255194640,1255211034,123404317, 1255227498,1255315750,1255391319,84721670, + 1255443675,1255538793,1255577895,1255735370,1255801775,1255866410,1255883041,1255921960,1256015893,1149749406,1256053033,1256167722,1256308820,1256341520,490340373, 1256364331,1256462636,2197209, 1256570939,1256603658,2621482, 896532564, 1256626477,1256986926,22888460, 994247503, 1257062430,1257095252,1257131708,1257182205, 805421098, 1257242678,1257275838,3736921, 1257347375,1257439248,99516432, 1257455659,241238026, 1257488396,1257511216,1257573077,1257620339,155631626, 1257707825, 1257822514,1257898015,159383594, 1257914434,1257948480,1257986355,1258068276,1258143809,1258194782,1258258514,1258296546,1258356757,1258379573,899979574, 1258461495, 1258538516,199213078, 1258586649,1258652079,1258690872,1258980489,2621442, 1259029432,1259078887,1259126800,2539560, 1259144916,1259192346,45056040, 1259215161, - 1259313466,1259372781,565920591, 1259411771,477282316, 1259470901,1259510076,1259620709,1259668411,232292383, 1259736368,1259782286,1259815426,1259847711,207195279, + 1259313466,1259372781,565920591, 1259411771,477282316, 1259470901,1259510076,1259620709,1259668411,232292383, 1259736368,1259782286,1259815426,1259847711,207195279, 1259864601,1259936061,1259995193,42598454, 1260012057,1260083518,32849932, 372835531, 1260143439,2327335, 1260177403,1260275824,1785972, 1260358733,1260427583, - 1260536916,1260591424,1260640577,1260717625,1260815244,1260864884,1260919106,1261164867,1261256726,1261279556,1261361477,1261437976,1261492550,1261617178,122732556, + 1260536916,1260591424,1260640577,1260717625,1260815244,1260864884,1260919106,1261164867,1261256726,1261279556,1261361477,1261437976,1261492550,1261617178,122732556, 7290916, 1261640007,1261715472,1261738312,1261781292,137904154, 1261815432,583548940, 1261863010,7094575, 1261895746,304989740, 1261934921,1261977612,1261993999, 2293766, 1262016842,1262147915,1262192907,1262239783,1262272524,592380003, 2146411, 1262288955,1262322718,1262354460,1262370892,1262404063,1262442828,1262717380, - 1262780428,1262796810,1262813200,1262829574,1262845954,52543528, 1262862443,1148944390,1025296703,1262901581,1262977443,1263011114,1263059798,2130378, 1900603, + 1262780428,1262796810,1262813200,1262829574,1262845954,52543528, 1262862443,1148944390,1025296703,1262901581,1262977443,1263011114,1263059798,2130378, 1900603, 1263114574,1263222843,282771477, 1263255979,1263291763,1263353858,1263370262,1263386634,126435350, 1263403639,1263435816,1263452186,1263468555,472711209, 1263486281, - 108315303, 1263540559,1918267, 1263747094,382730271, 1263763515,1263796283,1263829046,1263865036,1263928968,1263982928,1264125316,5311644, 1264195921,127500328, + 108315303, 1263540559,1918267, 1263747094,382730271, 1263763515,1263796283,1263829046,1263865036,1263928968,1263982928,1264125316,5311644, 1264195921,127500328, 1264343378,1264408915,1264474452,1264616271,1264648218,1264664605,22888453, 1264680962,235439134, 1264697365,1264715910,1264769365,1264862120,1264893983,1264912817, 1264960064,17449000, 1264998742,1265222441,1265260887,1265310040,109052009, 1265375577,1265516560,11075626, 1265538031,1265598474,1265621338,110182484, 1265670491, 1265763151,1224015908,1265796487,1265827932,151715866, 1265867100,1265916253,1266211166,43237416, 1266304276,242647071, 1266352171,372818680, 1266384988,1266424159, 169330036, 27852837, 1266517762,1266581741,1266614359,886687460, 138235183, 1266663470,1266715053,3244467, 1266762635,1234894947,1266827330,162971677, 1266866224, 1266925634,1266959532,1267007918,1267056732,46694438, 1267095904,1267253355,1267286894,1267354291,1267387914,1267456353,1267646507,444792863, 1108901990,1267679298, 1267718498,3228262, 399179778, 1267800419,1267875867,259129356, 1267915108,1268007047,1268023430,1268039690,1268056069,1268072563,1268088861,1268105348,1268121612, - 1268138115,1268154425,1268170780,2195769, 317839718, 1753094, 1268652391,1268908044,46120986, 132268048, 1268930920,658620435, 1269235777,1269284874,554615204, + 1268138115,1268154425,1268170780,2195769, 317839718, 1753094, 1268652391,1268908044,46120986, 132268048, 1268930920,658620435, 1269235777,1269284874,554615204, 1269301332,987643930, 318783519, 1269334056,1269350410,293601301, 1269366794,1269383210,1269401098,1269448810,1269530726,24838159, 152945156, 1269564761,1269596591, 1269629387,1269678551,1269710854,1269727253,987643930, 1269744117,1269776424,1269792770,638271514, 1269809239,1269864809,7634946, 1269941071,993460527, 1269974323, 1270022575,141787148, 1270054971,458490889, 1270094186,1270153273,46120991, 1270176107,1270300694,1270323564,1270382673,266766601, 1270420830,1270487405,1270628404, 1270666545,1270733166,1270940958,1270988854,646184962, 1271021627,1271060847,1106018330,1271103510,1054900250,1271119956,1062273050,1271152748,1271185474,1271224688, 1271355761,1271480622,379110007, 1271513195,1271552370,1271710175,52133900, 1271742548,1271778484,1271857666,1271896435,1271957888,1272022345,333136406, 1272076660, - 813514764, 1272158581,1272287262,1272332300,1272348693,458211350, 1272365102,1272418203,1272496134,1272512533,308658202, 1272531540,1272578966,1272627737,4472939, + 813514764, 1272158581,1272287262,1272332300,1272348693,458211350, 1272365102,1272418203,1272496134,1272512533,308658202, 1272531540,1272578966,1272627737,4472939, 1272692765,218415116, 1272715638,1272873935,1272928631,1273041915,405405718, 1273086045,1273135129,343294867, 1273168330,1273207160,1273234039,1273266606,1273321849, - 1273596285,1273675788,1273692166,301351799, 1273715066,1273774164,1273812480,1273878907,282853392, 58409019, 155648016, 402309135, 1273973852,1274019842,188252175, + 1273596285,1273675788,1273692166,301351799, 1273715066,1273774164,1273812480,1273878907,282853392, 58409019, 155648016, 402309135, 1273973852,1274019842,188252175, 1274036233,61358090, 1274053133,924696578, 1274101772,182566918, 1274118154,1274135208,1274167730,1274200095,1274222972,1274282598,1274321277,1274546398,1274595131, 1274648958,6029350, 196771850, 48136223, 7094705, 1274780031,2195483, 1274861952,1274938104,1274972364,1275009409,117506107, 1275068482,68256662, 1275107714, 174456939, 1275297851,1275337091,1275412564,953991178, 1275446173,487768535, 7734281, 1275528108,1275599236,1275692926,1275723788,1275740182,1275756556,1275772950, 2621452, 1275795845,1276068441,365052664, 889307627, 1276107142,1276297242,6717452, 1276320135,1276428314,1276444738,1076936732,257409026, 1276481820,1276526604, - 46448666, 1276549512,1276631433,431636506, 1276675081,170803282, 1276708211,1276739605,1276756020,299008002, 1276791310,1236041759,1276844426,1276919834,957399277, + 46448666, 1276549512,1276631433,431636506, 1276675081,170803282, 1276708211,1276739605,1276756020,299008002, 1276791310,1236041759,1276844426,1276919834,957399277, 1276936202,1276952618,1015562356,1276975499,1277083743,1277133255,55754794, 1277182966,1277214746,1003929709,214335519, 1277232717,1277280282,1277296671,1277313034, 52215850, 1277335948,5865553, 1277565325,1277673474,1277689882,55754773, 1277712782,1277805506,1277841457,1277886495,1277903479,319143958, 1277935619,1277952045, 1277991311,1278066781,1278122384,1278199374,1278253457,1278410768,434716698, 1278433682,1278509068,48676890, 830718011, 1278531987,1278706189,1278761364,1278853132, 1278869533,258637853, 1278885890,29376522, 1278904350,1278951426,1278967864,1934177, 1279345585,137101419, 1279378920,1279426596,1279442950,1279459349,1279475728, 1279492138,834175002, 1279515030,1279574123,505380892, 1279606886,1279643035,1279711639,1279770731,1279805218,1279836170,471547910, 1279852610,1279885943,1279918989, 1280003283,1280050792,1280121240,120733706, 1280262190,6373481, 1280312626,1280360450,1818643, 1280383385,1280426068,1280465306,6373898, 1280754783,1280820641, - 1280868459,19841026, 844138965, 1280906223,1280968463,538052962, 203325455, 1281015824,1281033715,1281071515,1281146943,1281179720,1281251740,1281524115,8395165, - 1281572895,27328533, 1281589294,1982480, 1281638422,357793804, 1281654838,648691738, 1281687855,184582175, 92749836, 1281726878,1281785858,109215749, 240944520, + 1280868459,19841026, 844138965, 1280906223,1280968463,538052962, 203325455, 1281015824,1281033715,1281071515,1281146943,1281179720,1281251740,1281524115,8395165, + 1281572895,27328533, 1281589294,1982480, 1281638422,357793804, 1281654838,648691738, 1281687855,184582175, 92749836, 1281726878,1281785858,109215749, 240944520, 828604482, 1281802299,1281837032,1281890719,333201434, 1282082752,1282165415,323749361, 1245544507,1282212758,1282261821,1282326540,1282342944,45645932, 1282382240, 1282431393,242466828, 1282588738,1282621450,471547910, 1282637890,1282670651,37176116, 1282709922,1282805481,1282867210,1282885137,1282920956,1282966835,1283021219, 1283081110,1283132200,1283194911,19257764, 1283211723,1283266981,1283459223,220599415, 1283507023,1283545510,1283588112,821690399, 1283608036,1283655279,1283709351, 119359974, 1283824040,1283900351,1283936310,1283984126,1284014102,1284030476,1284046874,1284063298,1284096087,1284151721,414991705, 1284194763,1284243512,1284282794, 1284391592,4751362, 412139628, 1284426032,1284472874,1284493366,1284544939,723746847, 225427492, 529137686, 1284636698,1284653078,1284669524,1284702250,1284718658, 1284757932,467747576, 289046549, 1284850096,204259347, 1284889005,1284954542,1285282223,150913053, 1285378003,1285423149,1285462448,1285555556,1285623994,1285685267, - 1285701669,109166598, 2129926, 1285718616,412008464, 193871882, 1285750890,1285839281,1285898735,364314929, 233474204, 1058669568,1285937586,348635138, 285344215, + 1285701669,109166598, 2129926, 1285718616,412008464, 193871882, 1285750890,1285839281,1285898735,364314929, 233474204, 1058669568,1285937586,348635138, 285344215, 1286085043,8389783, 1286166964,1286242346,1286265269,1286309438,1286378096,1286438918,1286455327,1286471692,46448681, 1286489478,5177359, 1286553706,1286635971, 1286674870,1286815756,1286832154,306446787, 1286849033,190366658, 1286887863,1286980951,341868546, 1287028778,1287046245,1287095190,119817307, 1287150008,1287248313, 318095381, 1287307304,203128844, 1287330234,122126612, 1287407571,1287520278,1287537216,300581741, 188105758, 1287569495,1287625147,54411283, 380715089, 1287788988, - 1287979090,1288012623,131842679, 1288044563,1288061890,1288093698,1288110092,110100486, 626540546, 1288129408,1288192469,119357548, 1288241455,1288273941,398753814, + 1287979090,1288012623,131842679, 1288044563,1288061890,1288093698,1288110092,110100486, 626540546, 1288129408,1288192469,119357548, 1288241455,1288273941,398753814, 1288290344,1288306700,757891083, 1288690109,1288814630,1288831042,481526615, 1288863782,721780802, 1288880157,1288900024,3230015, 1288964031,1289066942,1289127307, 1289175463,1289230783,1289324017,1289355280,1289371674,1289389679,1289437222,1289454007,187236374, 1289492928,1289551910,1289568715,1289617418,10829836, 1289640385, 1289755074,1818665, 1289961775,1289994529,173441895, 10650793, 1290027096,149128499, 1290061051,47710249, 1290108987,1290141750,1290174559,1290223642,1290240046, 4293495, 1290295747,1290387458,1290404734,1290442373,1290518621,538329114, 117751824, 1290567701,1290584090,900677648, 1290600535,1290651184,1290682799,1290720980, - 1290814667,1290852804,1010582492,1290962585,1291010070,1291026458,1291042832,1291059229,798375967, 1291082181,1291175739,1291225008,965787679, 1291259298,149127627, - 1291355019,1291420119,1291452871,1291508166,1291616770,1291650189,1291700516,25561085, 769720336, 1291764905,1052066016,1291803079,1291960407,1292012297,1982475, + 1290814667,1290852804,1010582492,1290962585,1291010070,1291026458,1291042832,1291059229,798375967, 1291082181,1291175739,1291225008,965787679, 1291259298,149127627, + 1291355019,1291420119,1291452871,1291508166,1291616770,1291650189,1291700516,25561085, 769720336, 1291764905,1052066016,1291803079,1291960407,1292012297,1982475, 1292058676,2201598, 1292093531,473251852, 1292157152,133939257, 1292189734,1289469958,1292212680,1292387212,354893853, 467238928, 1292438275,1292523977,1292648490, - 1292665878,241352706, 654018832, 1292720586,1292861462,1292877883,1247429368,340281830, 1292917195,1293046150,508723779, 1917033, 1293090832,379505204, 275447824, + 1292665878,241352706, 654018832, 1292720586,1292861462,1292877883,1247429368,340281830, 1292917195,1293046150,508723779, 1917033, 1293090832,379505204, 275447824, 1293107216,1293123641,1293139999,7733879, 1293156436,1293195724,1293353053,1293402124,2130729, 1293418538,1293434892,1293451274,1293467676,290996240, 1293490637, 318427686, 1293549655,3244130, 1293598807,1293654478,1293746206,1293781717,1293828112,1293844537,1293860895,1293877258,110231855, 125796383, 1293900239,1294107224, 240583232, 471547942, 1294140279,1294172162,1294188600,1294221324,1294238811,2196680, 1294270551,8395177, 1294319652,1294336002,142245899, 1294352396,1294368875, 1294401612,1294436630,1294520117,1294604752,1294712851,47448086, 1294729237,1294745622,50266114, 1294764720,425082946, 1294811182,1294860314,418170241, 1294876691, - 911786006, 1294899665,1295089686,1295106161,1295155226,1295171600,1295194578,1295302692,5767187, 1295320476,1295368204,1295384586,1080328204,1295400982,127680548, + 911786006, 1294899665,1295089686,1295106161,1295155226,1295171600,1295194578,1295302692,5767187, 1295320476,1295368204,1295384586,1080328204,1295400982,127680548, 1295417356,399081479, 197296154, 278118436, 1295434161,1295466512,3217406, 1295482906,1295500197,48136208, 663896066, 202752302, 1295538643,1295630807,1295665652, - 179994666, 1144455249,1295718868,1295941642,1295958058,1295974457,287211551, 333431385, 1295992800,1296040407,1296079317,478543894, 1296171018,1296187429,152256569, + 179994666, 1144455249,1295718868,1295941642,1295958058,1295974457,287211551, 333431385, 1295992800,1296040407,1296079317,478543894, 1296171018,1296187429,152256569, 1007337517,1066336287,1296210390,1296304081,1296351259,119357961, 1296384045,117506895, 1296423383,4292690, 1296570672,177061944, 451313730, 1296635005,1296718296, - 1296809996,1296826387,174227487, 1296842790,823885864, 1296859228,1296891906,84738086, 361431124, 1296914905,1297170574,1297209818,1297301602,1297335326,869875738, + 1296809996,1296826387,174227487, 1296842790,823885864, 1296859228,1296891906,84738086, 361431124, 1296914905,1297170574,1297209818,1297301602,1297335326,869875738, 379110956, 1297368362,1297416429,54296592, 1297448991,4998489, 1297465398,1297498591,1297532896,825327622, 1297580116,109052362, 1297614607,936525861, 1297668571, 1297795930,1297858585,1297891356,1297907727,66682918, 1297926348,1026048057,1297958074,1297989748,151765030, 1298008632,1298038825,1298055178,17924108, 1298071661, 1298104349,1298120745,1022541834,53706780, 1298137109,102858762, 1298153494,1298169878,1298187983,1298220751,66815695, 1298651612,55033868, 866910210, 1298700765, 1298826825,1298907231,1298956344,1298989086,1299021880,1299055022,597770261, 1299104239,3686422, 1299143134,1299218491,1299257823,1299385365,1299464998,1299496976, 617447445, 1299513360,4177936, 1299530271,1299579913,1299612542,1299644432,185417749, 1299660828,1299677200,1299693589,1299711176,1299742786,1299782112,1299464220, 1299864033,1299978722,1300037698,1300077027,1300154220,1300185128,664289504, 1300201709,309493770, 1300240868,658112524, 233242690, 6701066, 1300430900,1300465155, - 1300547372,1300594707,1300611094,1300628504,1300676624,1300693030,45646271, 1300712540,1300758566,1300774948,1300791311,128745494, 1300808107,200736794, 191906081, + 1300547372,1300594707,1300611094,1300628504,1300676624,1300693030,45646271, 1300712540,1300758566,1300774948,1300791311,128745494, 1300808107,200736794, 191906081, 1126630897,1300847077,1301037527,1266319382,257655702, 1301070749,1301151754,1301169954,1301200906,1301219106,1301250064,1301266453,1301284040,1301322214,1301581002, 512411123, 754238287, 1301643295,1301664340,273924136, 1301709246,1301774346,704151581, 1301797351,1301839894,1301856277,1301873532,1301921846,1301961192,1302026729, - 1058455583,137101850, 249266198, 1302118830,1302167588,501303312, 1302183946,1299611676,1302200386,1302233521,1302265882,7733332, 1302284856,1302315020,9371666, + 1058455583,137101850, 249266198, 1302118830,1302167588,501303312, 1302183946,1299611676,1302200386,1302233521,1302265882,7733332, 1302284856,1302315020,9371666, 1302336552,1302403562,1302446117,442744898, 1302463143,140253675, 1302495671,1302528012,113754127, 1302548335,1210679322,261131072, 309362744, 1302616556,1302925291, 1303003568,1303037096,944325441, 1303091693,456343574, 1303206382,117885510, 1303314472,513179674, 1303337455,1303412762,1303429122,134152202, 1303445506,1033224218, 1303462341,694566938, 365052937, 1303494722,597235372, 1303527490,45647377, 1303560204,1303583216,1303642154,1303658498,277725220, 755253260, 1303681521,1303927282, @@ -2613,51 +2608,51 @@ static const unsigned int DictNodes[84251] = 1304353268,1304433870,1304477712,93978650, 292519962, 1304494134,1304531710,1000849450,1304608799,48627754, 1304631797,1304756240,1304772623,554632266, 1304789451, 117424185, 1304844790,1304952939,1304985625,896532564, 1305025015,1305149468,1305165836,367443999, 1305182220,1305198618,266731526, 1305215035,1305254392,1305380347, 1305427970,310050852, 1305451001,1305544352,102858754, 1305575532,1305609633,1305657382,1305680378,1305740170,48480268, 1305778683,1306040828,1306120147,1306171901, - 1306198054,1306230815,731037737, 1306247273,1306286590,1306477663,1306547955,1306656834,36306955, 1306689538,144441451, 1306705960,1306722306,99696666, 128057346, - 1306741967,1306790309,747356181, 1306843647,154665392, 1306958336,1307038698,8393328, 1307099195,1307132011,1307171329,1307230224,19267590, 1307246613,184320026, - 1307263007,1307279379,554991638, 1307302402,1307396812,1307476490,1307515395,109215756, 1203159085,1307564548,1307688976,1307705359,199491882, 1307721766,50937887, + 1306198054,1306230815,731037737, 1306247273,1306286590,1306477663,1306547955,1306656834,36306955, 1306689538,144441451, 1306705960,1306722306,99696666, 128057346, + 1306741967,1306790309,747356181, 1306843647,154665392, 1306958336,1307038698,8393328, 1307099195,1307132011,1307171329,1307230224,19267590, 1307246613,184320026, + 1307263007,1307279379,554991638, 1307302402,1307396812,1307476490,1307515395,109215756, 1203159085,1307564548,1307688976,1307705359,199491882, 1307721766,50937887, 1307741305,1307852826,1307869203,481526360, 1307889392,1307967494,1307983893,1308000322,655409579, 1308039685,1308131470,1308164107,219856911, 971685890, 1308180516, - 1308196885,110133773, 1308213264,1308229653,521617410, 1308251342,1308301830,1308563975,162579809, 274317396, 1308721218,217808908, 1308760584,1308901407,189464597, - 760954919, 1308919127,1308966943,287573101, 1308989961,1082228762,1309081622,1309104650,1309212715,1309247429,8395275, 1309278218,1309294621,504643615, 351010832, + 1308196885,110133773, 1308213264,1308229653,521617410, 1308251342,1308301830,1308563975,162579809, 274317396, 1308721218,217808908, 1308760584,1308901407,189464597, + 760954919, 1308919127,1308966943,287573101, 1308989961,1082228762,1309081622,1309104650,1309212715,1309247429,8395275, 1309278218,1309294621,504643615, 351010832, 1309317644,1309530637,8391173, 1309589591,923337007, 1309638658,1309655050,1309672271,1309706653,1309754264,1309802602,1309886632,112935014, 1309967245,1310052587, 2293786, 49774621, 1310104078,1310212112,1310228491,1310244879,1310261250,1310277653,393019423, 1310294032,264929322, 1310310402,1310326805,264093718, 1310343600, - 1310382607,116376585, 1310458286,1310507050,1310523418,1310539778,1310556175,1310572566,1310589846,210124831, 1310644752,652773083, 1310818326,1310841361,119996484, + 1310382607,116376585, 1310458286,1310507050,1310523418,1310539778,1310556175,1310572566,1310589846,210124831, 1310644752,652773083, 1310818326,1310841361,119996484, 1310933023,290471973, 506380298, 1310956050,1311014924,1311031322,421036459, 404979724, 1311047739,1311080458,64274692, 1311097191,2113999, 1311136275,1311227960, 1311264844,1311315073,74072066, 1311358978,407666694, 1311377759,1311431188,284639272, 1311496725,31621123, 1311621158,1001701387,1311637935,1311672481,1311704054, - 1311736568,3211364, 1000898571,1311768604,1311791638,975192085, 1311834138,412139602, 1311851278,1311883696,255492122, 1311916880,377585692, 1311952083,59310091, - 1311997964,1312014362,10584073, 1312031603,1312119319,131776578, 146456597, 1312163268,1312195191,1312227552,328073237, 1312266776,1312392315,16826379, 1785859, + 1311736568,3211364, 1000898571,1311768604,1311791638,975192085, 1311834138,412139602, 1311851278,1311883696,255492122, 1311916880,377585692, 1311952083,59310091, + 1311997964,1312014362,10584073, 1312031603,1312119319,131776578, 146456597, 1312163268,1312195191,1312227552,328073237, 1312266776,1312392315,16826379, 1785859, 1312430617,430014485, 140247090, 1312938522,1313036827,1313128903,3538986, 1313184284,1313249821,1313457996,1313524122,206471174, 1313604438,704365089, 1313654744, - 1313724958,1313783824,1313801216,1313833993,57032723, 2867231, 251805762, 1313865744,1313882140,5505052, 1313901123,1313948535,1313982498,1314052639,919650826, + 1313724958,1313783824,1313801216,1313833993,57032723, 2867231, 251805762, 1313865744,1313882140,5505052, 1313901123,1313948535,1313982498,1314052639,919650826, 238256166, 1314177026,1314194931,692305922, 1314226807,1314258966,1314275404,1314308555,1314358927,1314407269,1314527776,1314609325,1314653470,1314701324,1314717727, 1314734091,5505050, 1314757153,603871778, 751878182, 1314881760,277200911, 1314920995,251583012, 1315078225,1315117605,1315176459,1315192834,117424154, 1315215910, 1315310896,1315356703,1315373527,349487135, 1315405890,1315438661,300925027, 316620929, 1315478055,1315717611,1315756584,1315816820,1297448991,1315864642,1315897823, 112754714, 1315931049,1315985961,1316045114,1316078460,1316127747,1316182570,1316290572,299827310, 1316312007,1316379179,1316569131,1316608556,141541402, 1316772397, 152191026, 4997655, 1316847675,1316880855,1316913584,1316945979,1316978690,1316995974,1317028684,1317077014,1317093386,685948940, 1317109806,1317158978,1317191739, - 1317224880,1317257237,1317274826,490340381, 1091092512,1317322783,19841036, 1317345838,1317586518,1317657135,711163925, 1317702004,509215023, 1317765479,5963795, + 1317224880,1317257237,1317274826,490340381, 1091092512,1317322783,19841036, 1317345838,1317586518,1317657135,711163925, 1317702004,509215023, 1317765479,5963795, 1317799774,1317863519,1317913101,1317962155,453279776, 521061470, 122732575, 1317994799,1318028309,1318083120,1318227878,1318279729,1318338590,1318371755,1318404155, - 184074280, 1318436880,1318453286,4685862, 597475368, 1318471976,490684475, 1318535220,1318569836,1318607410,1318699067,1318733685,1318798204,1318850914,38879263, + 184074280, 1318436880,1318453286,4685862, 597475368, 1318471976,490684475, 1318535220,1318569836,1318607410,1318699067,1318733685,1318798204,1318850914,38879263, 1318918707,1318994022,1319033396,1319109035,1319141679,1319175089,1319208552,89128991, 2130004, 1319672374,632897839, 1319815642,1319901751,109150691, 1319976976, 1319993360,151732261, 1320016440,1320098361,1320371353,1320426042,208667495, 1320517658,55853058, 1320534026,1320550934,1320586692,374390850, 33783824, 1320655419, 2360226, 245022730, 1320796760,1320829453,1320884796,1321058306,1321074724,1321097226,52133890, 319554858, 1321156674,1321191903,148242926, 1321245245,1321392702, 1321533469,1321550762,1321638463,1321736768,15073282, 1321782195,1321828411,1321862409,1321893942,1321933377,1322015298,3867050, 1322142899,1322195523,1322271142, - 1239695372,1322303509,435060748, 1322326596,1322420027,1176469563,1322474053,59375618, 1322614800,647184400, 1322637894,1322811446,1322845482,1322893349,915701776, - 130580511, 1146486824,1322909717,1238958110,1322932807,1323073595,219709456, 1323106316,175669274, 1323122714,1323139074,1323156603,1323188308,1323221032,422952991, + 1239695372,1322303509,435060748, 1322326596,1322420027,1176469563,1322474053,59375618, 1322614800,647184400, 1322637894,1322811446,1322845482,1322893349,915701776, + 130580511, 1146486824,1322909717,1238958110,1322932807,1323073595,219709456, 1323106316,175669274, 1323122714,1323139074,1323156603,1323188308,1323221032,422952991, 1323244104,1323386227,1323417837,1323451270,1323484678,1323533197,1036487217,1323614224,1065893914,1323637321,194068587, 1323810842,1323827212,137102796, 1323843649, 7734587, 148635755, 251609546, 1323893204,1323932234,655114268, 1324007436,838451298, 1324023867,1324063307,1324187740,1324220500,529285204, 1324254660,1324292684, - 45858832, 1324400750,1324433933,1324483019,1324531724,159974390, 1324548180,1324587597,1324795643,1324848097,52363286, 1324915278,1325188218,137101807, 123617360, - 1325253083,295272460, 1325285402,1325301814,1325335337,1281785872,1325367841,1325416454,149504006, 1325432834,1325449755,346488834, 1325488719,1325563920,833716250, - 1325580290,616759317, 1325596693,225427458, 1325613066,1325629452,663601178, 1325645908,156155930, 1325685328,3309599, 1325865553,1325940758,1325957136,950566928, - 1325973523,149504037, 1325989900,1326006274,1326022685,1326045778,1326104617,1326120962,1326137370,1326153739,1284816902,1326171443,1326219356,17843649, 471580684, + 45858832, 1324400750,1324433933,1324483019,1324531724,159974390, 1324548180,1324587597,1324795643,1324848097,52363286, 1324915278,1325188218,137101807, 123617360, + 1325253083,295272460, 1325285402,1325301814,1325335337,1281785872,1325367841,1325416454,149504006, 1325432834,1325449755,346488834, 1325488719,1325563920,833716250, + 1325580290,616759317, 1325596693,225427458, 1325613066,1325629452,663601178, 1325645908,156155930, 1325685328,3309599, 1325865553,1325940758,1325957136,950566928, + 1325973523,149504037, 1325989900,1326006274,1326022685,1326045778,1326104617,1326120962,1326137370,1326153739,1284816902,1326171443,1326219356,17843649, 471580684, 1326258771,1326334632,140788226, 1326366779,1326400533,5505053, 1326455380,1326612516,1326628870,177405973, 1326645274,46219280, 1326661644,1326678026,1326694487, 1326747471,1326792746,1326815829,1326907408,1326923802,1326940175,223838230, 1326956580,1123500043,1326972950,1326989328,1327006622,1295417356,1327038495,1327056192, - 458490335, 1327087626,241483795, 1327110742,1327438423,212369418, 1327513622,1327530516,1327580852,1327667800,1327825296,1327864409,128974905, 2202202, 8142857, + 458490335, 1327087626,241483795, 1327110742,1327438423,212369418, 1327513622,1327530516,1327580852,1327667800,1327825296,1327864409,128974905, 2202202, 8142857, 1327923418,264650778, 1327962715,670466069, 1328093788,1328267865,1116356667,1328300269,1328332850,1328365622,1328398375,1328431188,1328463888,1328480266,1328497532, 4703055, 1328545832,1328562195,1043120165,1328585309,1328709683,76660758, 51675158, 1328745479,124863358, 1328828824,1328906294,1328939103,1328994910,1329070082, 641105960, 1329088371,1329120170,1329201238,208667056, 116376012, 1329240671,1002995738,1329305324,8392322, 1329365032,528842763, 293011515, 1329388128,1329660395, 6375090, 1329699425,1329791007,31408138, 1329813702,1329856549,500695078, 1329873581,1329922058,223559709, 1329941635,1329994338,131335728, 1330122276,1330167874, - 1330203206,208584706, 1330240099,1330332970,431734826, 1330381745,1330413610,145293314, 527942249, 119358633, 1330430039,319455683, 1330485860,1330577515,114180098, + 1330203206,208584706, 1330240099,1330332970,431734826, 1330381745,1330413610,145293314, 527942249, 119358633, 1330430039,319455683, 1330485860,1330577515,114180098, 1330610182,2195786, 1330626641,1330666085,126025766, 1330862694,1330970664,1330987046,300929071, 1331003451,1331036267,1331068984,1331101783,1331153621,1331200224, - 324475495, 1331239528,1331367664,1331445859,1107853707,1331485289,1331550826,1331862123,163727590, 1331960428,2130019, 1332021763,878018619, 1332107885,159694864, + 324475495, 1331239528,1331367664,1331445859,1107853707,1331485289,1331550826,1331862123,163727590, 1331960428,2130019, 1332021763,878018619, 1332107885,159694864, 1332281360,1332297738,1332315135,127909947, 1332370030,1332445244,1332527114,4997634, 2031619, 1332543690,7094389, 1332583023,1332763248,1332828785,1332942796, 1333009010,2197242, 1333051446,1333084654,1333116944,1333133354,2196315, 1333156467,1333271156,340281769, 1333385845,1333444638,1333484150,1333647991,1333707831, 1333740120,1333772394,1333855262,128581661, 1333893752,1333969328,17842609, 1334002678,1334041209,1334205050,1334378498,1334396460,1334429391,1334461263,1334493614, @@ -2666,22 +2661,22 @@ static const unsigned int DictNodes[84251] = 1335821321,109150271, 1335854577,1335888102,491028518, 1335935607,1335967746,1335984934,1336018264,1336067480,123846715, 1336121982,257933343, 1336183929,1336299254, 4997225, 1336393836,254591057, 1336427550,1336459330,1336493266,1336531583,1336885269,84934682, 7290916, 1336908325,2197363, 1336967705,1337039488,1337116575, 1337181681,1337212959,116376023, 3227750, 1337229742,2129931, 421429290, 1337279937,1337318017,1035158105,1337393228,1337425966,1337475178,1770699, 1337557076, - 532137608, 6374792, 1337590197,1337622593,1337672693,1337744002,63111175, 1337819983,1337852141,1337884712,1337902625,1337940611,1338083700,1338147849,70942732, - 5309342, 1338180694,137103785, 1338235524,1338507294,1338540523,1338573259,1338622018,1338660600,1338723793,1338770833,212107302, 343621675, 1338838424,133678080, + 532137608, 6374792, 1337590197,1337622593,1337672693,1337744002,63111175, 1337819983,1337852141,1337884712,1337902625,1337940611,1338083700,1338147849,70942732, + 5309342, 1338180694,137103785, 1338235524,1338507294,1338540523,1338573259,1338622018,1338660600,1338723793,1338770833,212107302, 343621675, 1338838424,133678080, 1338933549,1338972805,1339038342,1339131251,1339163924,443629584, 1339218567,712149574, 1339300488,1339457592,1339497097,1339769950,46448656, 1339818920,1339850764, 392151042, 1339867176,149815308, 1339883536,1301774374,1339900937,1339932715,1339966763,1340036136,1340096538,122273837, 1340113658,441368592, 1340145723,1340178486, - 1340217994,79757334, 7094331, 1340332683,1340473439,1340522923,258867634, 156827707, 1340562060,1340643981,301351799, 1340751874,175669258, 1340771081,30392346, - 1229963276,1340824206,1341102735,1341194322,1341228324,1341276196,134627344, 1341293462,1341342167,1341342091,1341381264,1341490404,1341541461,109150603, 278167669, + 1340217994,79757334, 7094331, 1340332683,1340473439,1340522923,258867634, 156827707, 1340562060,1340643981,301351799, 1340751874,175669258, 1340771081,30392346, + 1229963276,1340824206,1341102735,1341194322,1341228324,1341276196,134627344, 1341293462,1341342167,1341342091,1341381264,1341490404,1341541461,109150603, 278167669, 1341621131,886688552, 1341685770,1341702186,382435333, 268189755, 1341719399,1341751342,118882904, 1341807249,1341889170,1342029929,1342062594,4980743, 1342079009, - 1342129459,1342178313,173850635, 1342216851,1342324754,84967554, 67289094, 1342341129,1212417, 1342357530,1342373916,11468811, 1342390274,1342406694,22216746, - 259129365, 1342429844,865009700, 1342642837,1342701652,1342734402,430669843, 1342767163,1342799910,1342816287,30392339, 5326384, 59260931, 1342839446,349716482, - 1342914581,255705104, 406030225, 1342937751,1343029314,152616982, 1343063842,1343095216,1343127564,1343143942,52576259, 1343160404,1343193109,1343209478,164200485, - 1343226287,1343259200,1343291423,1343307788,200736773, 1343330968,1343422505,1343438877,1343455366,1343471626,11075593, 1343494809,1343554880,1343586306,904337, - 1228736139,1343609498,1343750154,1343766644,1026048022,1343782950,1343806107,1343832092,1343850283,1343881226,415449110, 1344314012,651100182, 2113546, 168395171, + 1342129459,1342178313,173850635, 1342216851,1342324754,84967554, 67289094, 1342341129,1212417, 1342357530,1342373916,11468811, 1342390274,1342406694,22216746, + 259129365, 1342429844,865009700, 1342642837,1342701652,1342734402,430669843, 1342767163,1342799910,1342816287,30392339, 5326384, 59260931, 1342839446,349716482, + 1342914581,255705104, 406030225, 1342937751,1343029314,152616982, 1343063842,1343095216,1343127564,1343143942,52576259, 1343160404,1343193109,1343209478,164200485, + 1343226287,1343259200,1343291423,1343307788,200736773, 1343330968,1343422505,1343438877,1343455366,1343471626,11075593, 1343494809,1343554880,1343586306,904337, + 1228736139,1343609498,1343750154,1343766644,1026048022,1343782950,1343806107,1343832092,1343850283,1343881226,415449110, 1344314012,651100182, 2113546, 168395171, 1344445085,1344503810,1344523259,1344552972,49905702, 1225611934,1344569975,1344608927,1344767483,1344821920,1344914823,1344946936,156434434, 1344983458,1345044530, 152965515, 2360489, 684212290, 1345077279,1345094725,1345142803,1345159190,349372427, 1345176043,1345215137,1345323036,1345340814,390513446, 453689356, 1345404949, - 1345421371,2196600, 1345460898,1345652784,1345718784,1345766136,344539142, 1345798210,1258504631,1345833008,1345896514,1345930081,1345962071,1346011661,131811761, - 1346060389,1346099875,1346356163,3686437, 1346405185,1346437132,584892437, 1346457033,1346505527,1346551874,1346584686,417677354, 1346617771,1346656932,110166863, + 1345421371,2196600, 1345460898,1345652784,1345718784,1345766136,344539142, 1345798210,1258504631,1345833008,1345896514,1345930081,1345962071,1346011661,131811761, + 1346060389,1346099875,1346356163,3686437, 1346405185,1346437132,584892437, 1346457033,1346505527,1346551874,1346584686,417677354, 1346617771,1346656932,110166863, 1346766024,1346804389,1346902694,1347043338,1347060246,1347092501,1347109777,1157513235,1282359317,1347158037,1347174412,1347190816,1347230375,1347392828,1347508904, 1026572319,1347601417,1347639977,886687177, 298614812, 1347732969,1347782263,1347846991,1347885738,1347977227,2015243, 1347993602,1348010089,1348049579,1348161322, 1348229804,906592266, 1348288514,50135059, 1348304999,401834011, 1348393645,1348636825,1348682329,1223885343,1348721326,1348780924,1348832389,1348943900,1348960258, @@ -2689,37 +2684,37 @@ static const unsigned int DictNodes[84251] = 1917348, 1349993208,1350025440,1350058831,392353460, 1350092164,1350156319,5884612, 1350173127,1350221843,320307237, 1350238238,1350272568,1350337359,1350369349, 1350402079,1350420014,344735968, 1350474420,1350549971,1350605493,1350664202,1350680618,1350696988,145473567, 1350714704,128581695, 1350765457,1350867638,1350992394, 1351024672,987709471, 1351057438,1351090202,116376073, 1351107478,1351162551,1351385579,1351418274,1351454691,1351517337,1351565420,109019147, 1351598092,1351614493, - 1171849440,1351637688,159432720, 886505491, 1351703225,1351799803,1351845276,111427610, 1351894677,3212024, 1351959446,1352014522,1352075764,412008488, 115294236, + 1171849440,1351637688,159432720, 886505491, 1351703225,1351799803,1351845276,111427610, 1351894677,3212024, 1351959446,1352014522,1352075764,412008488, 115294236, 1352129211,1276330415,1352286511,173490690, 1352325820,72499218, 1352467340,1352522429,1352663050,1352679466,1352702654,114098192, 118883169, 1352751807,1247346700, 1352810955,1021953473,1352859743,47939586, 1352915648,1353023500,1353039979,383320092, 1353079489,1353304576,1353351234,1353390786,1353482841,1353515090,1353554627, 1353632420,1353697661,117900936, 1353784004,574930946, 176177591, 1353875532,1353909524,1353964229,996919957, 217808924, 1354144454,1354406599,1354482343,1354515303, 1354547210,235307037, 1354563606,7258193, 1354586824,1354694959,1354728369,1354764600,17842613, 1354809384,332595215, 1354830232,1354907746,1354942433,1354990531, 1355038777,212025346, 1355060674,1355154217,1355193033,1355251745,1355301346,1355399256,1355438794,1355628566,1355651787,1355711786,1355760050,1355792855,1355825215, 1355859361,1355912556,869351483, 1356028620,1356110541,379814367, 2195950, 1356234797,1356274382,1356300290,17843591, 1356323535,1356398601,279396375, 1356416175, - 1356447760,32849977, 46088221, 1356464187,1356496906,1356513322,122601494, 1356532957,1356562458,1356578873,254197765, 1356896977,1356988447,1061617674,131843417, + 1356447760,32849977, 46088221, 1356464187,1356496906,1356513322,122601494, 1356532957,1356562458,1356578873,254197765, 1356896977,1356988447,1061617674,131843417, 566329365, 1357006026,1357053983,1357070365,1357087195,1357120400,1357159122,1357203923,1357250562,1357266972,765313026, 1357283758,1357339347,1357414883,1357447234, - 141115430, 1270023724,1357486804,1357661527,1037008922,1357709327,263716886, 1357725734,1357742096,1357758490,1357774879,6374956, 1357791268,1357807626,958103554, + 141115430, 1270023724,1357486804,1357661527,1037008922,1357709327,263716886, 1357725734,1357742096,1357758490,1357774879,6374956, 1357791268,1357807626,958103554, 1357824038,1357840396,1357856787,1357873173,740163610, 1357889838,1357922344,51036176, 1357938718,1357971466,610435111, 1357988879,393805866, 1358037904,1358073021, - 1358119759,1358153749,126369813, 1358184470,1358200844,1358217242,1358233852,1358266800,1358299174,773406722, 1358322389,1358403476,1358447625,1358479370,278528066, - 1358495760,250560518, 1358512180,1358551766,1358643307,1358676482,1358710461,1358793076,1358857039,1358888975,1358905365,166346764, 379504661, 1358928599,110232489, - 110237957, 1358987751,1359043288,1359151125,1359167519,5308668, 1359184786,1359239897,928595987, 1359462484,1359495206,1359512089,1359577131,1359609937,219594768, + 1358119759,1358153749,126369813, 1358184470,1358200844,1358217242,1358233852,1358266800,1358299174,773406722, 1358322389,1358403476,1358447625,1358479370,278528066, + 1358495760,250560518, 1358512180,1358551766,1358643307,1358676482,1358710461,1358793076,1358857039,1358888975,1358905365,166346764, 379504661, 1358928599,110232489, + 110237957, 1358987751,1359043288,1359151125,1359167519,5308668, 1359184786,1359239897,928595987, 1359462484,1359495206,1359512089,1359577131,1359609937,219594768, 1359642660,121274387, 1359661156,277856297, 1359708191,385024056, 1359724603,1359757338,196886565, 1359773734,1359790082,1130840535,1359810872,1359855626,1359872006, 1359888415,1359904789,1359921183,121929785, 1359941916,1359989368,1360020418,121323546, 1360052250,1360068624,644382751, 616742928, 1360085058,1360117770,1360134165, 1360150559,1360166950,1360183298,4390933, 1360199739,1360232464,1360250819,114180098, 1360298485,1360333154,1360386778,1360512391,1360544046,1360576522,1360592925, 223903770, 1360609311,1360625888,235700290, 1360658470,1360674852,1360691219,1360707596,213958667, 901218342, 1360723979,1360740368,134021139, 1360757215,1360789514, 1360806365,1360839201,1360887846,1360904194,1360920587,66863180, 1360937064,1360986178,1361019792,1361051679,234848275, 1361068048,56721446, 1361084432,1361100815, 220987428, 1361124059,1361205980,474398822, 1361330216,1361346591,162332684, 1361362956,1361379354,1361395778,1361428914,394183258, 1361465628,1361517277,1361559972, - 1361593758,1361625130,1361641602,94502952, 1361657868,1361674370,1361690633,2179202, 1362221791,1126636256,207231713, 5308668, 1362320098,2261108, 1785976, + 1361593758,1361625130,1361641602,94502952, 1361657868,1361674370,1361690633,2179202, 1362221791,1126636256,207231713, 5308668, 1362320098,2261108, 1785976, 82198537, 1362362377,581206058, 1362378883,1362396078,1362434787,1362694306,1362723458,1362778852,1362854489,212008998, 1362886743,1362935916,1362969047,1363001346, 223182874, 1363017744,1363034214,1363073765,1363247109,1363263500,381829126, 1363279903,5080384, 1363297587,1363345454,56262682, 391970835, 1363394600,1363410970, 1363427340,1363443734,1363460098,1363476502,933890, 1363492910,6111251, 1363542038,1363558412,1363581670,1363630823,165134355, 1363705916,1363787867,1363821012, - 111149108, 1363853759,110100492, 1363892968,1363968434,1364007279,1364049922,223182874, 166871042, 73138218, 1364073193,1364312104,8962076, 1364334586,315277454, + 111149108, 1363853759,110100492, 1363892968,1363968434,1364007279,1364049922,223182874, 166871042, 73138218, 1364073193,1364312104,8962076, 1364334586,315277454, 197115935, 1364426806,1364466410,1364525087,1126630409,1364548331,1364623362,1364639755,1364656140,1364672538,1364688927,246087699, 1364712172,1364770854,1364794093, 113655918, 1364853166,1364904518,1364934687,258097163, 1364951343,1364983819,1365000276,1365039854,183992346, 118652938, 1365105391,1365383920,1365475462,1365491752, 2179078, 1365508610,1365544333,1365592255,1365629681,1365836856,1365901454,1028767756,1365935226,1365999628,16826370, 155975708, 1366016303,1366048784,1366067120, - 1366097922,1366114314,1366130717,1366147138,1366179842,1366196234,1366219506,1366295803,1123696943,1366350579,45531164, 1366432500,1366540304,1366557587,276332550, + 1366097922,1366114314,1366130717,1366147138,1366179842,1366196234,1366219506,1366295803,1123696943,1366350579,45531164, 1366432500,1366540304,1366557587,276332550, 28540944, 1366605846,1366622244,1366638608,1366655081,1366687760,152272938, 675168258, 1366704559,199458843, 1366743797,1366805808,1366854785,1366901829,1366949926, - 209813506, 536215573, 1366966274,1366982678,1366999052,1367015453,740130842, 8395510, 15482898, 1367038711,1367317240,1367382777,1367408669,1367431930,206848154, + 209813506, 536215573, 1366966274,1366982678,1366999052,1367015453,740130842, 8395510, 15482898, 1367038711,1367317240,1367382777,1367408669,1367431930,206848154, 1367457821,1367474715,2031617, 1367513851,1367639562,1367688536,1367737232,1367771166,1367819383,1367867408,84738069, 1367883797,1367900635,1367933886,1367982512, 1368015767,1368064038,1368080400,1368096810,1368115387,1368168603,1368244226,214679574, 1368267516,585023490, 1368342564,1368358922,1368375315,1368391706,1368408066, 1368424672,1368464125,351617026, 1368523670,1368577097,1368637442,1368653834,1368670244,1368686632,94339098, 2327335, 1368704648,1368759038,1368817685,1368834140, @@ -2730,22 +2725,22 @@ static const unsigned int DictNodes[84251] = 1370653131,1370701926,1370735902,1370784601,1370816770,207442277, 1370849334,121094155, 1370882050,123518986, 1370899352,1370952279,1370996820,1371036420,1371160597, 1371176972,1371195861,1371226128,20365352, 1371242544,1371291674,1371308053,1371324526,824803330, 1371357196,1371373578,152256553, 120031462, 531562498, 1371396869, 1362314227,1371609862,1371668511,1371686578,66815666, 30392360, 1371724551,1371806472,7307292, 1371848820,1371865125,1371881513,1371897894,2752538, 1371914271, - 2015254, 1371937545,1372115976,7735155, 1372166922,1372274728,156925989, 1372291919,1372323878,1372340227,42008599, 1372356674,1372389433,1372405765,37748867, + 2015254, 1371937545,1372115976,7735155, 1372166922,1372274728,156925989, 1372291919,1372323878,1372340227,42008599, 1372356674,1372389433,1372405765,37748867, 1372429067,917545, 1372740364,1372897316,1372913666,1372930074,146096130, 1372951848,11157506, 1372995586,146096154, 333348886, 1373012027,749617193, 1373051661, - 1373159516,381779970, 917291010, 1373199118,162501539, 1373341097,1373372428,1373395727,3212262, 1373471600,1373526800,380551170, 1373608721,1373788666,55328770, + 1373159516,381779970, 917291010, 1373199118,162501539, 1373341097,1373372428,1373395727,3212262, 1373471600,1373526800,380551170, 1373608721,1373788666,55328770, 1373850803,1373897007,1373929510,568018264, 1373946391,1373978655,574537739, 1901175, 1374001938,316293634, 118178293, 1374094951,1374142476,574537754, 1374159730, 1374198547,1374240799,1374257162,1374273538,1374289941,1374306391,112952161, 1374358138,1374405493,1374437402,1374454219,1374503054,1374535711,1374552666,1374584886, 56721418, 1374624532,183697492, 1374699532,1374722837,451772775, 1375010908,570736656, 1375044431,531316802, 1375076364,691651031, 1375092812,27607059, 1375128925, 1375210771,1375256813,203063302, 1375289403,1375322128,1375338536,1375361814,1375404628,290996227, 1375458358,1375502367,153174026, 1375525655,1375650247,1375699339, - 1375731970,1376099097,55869459, 1376289305,1376361242,1376436234,1376456546,1376520022,1376574235,1376633034,184713232, 1376667428,1376714783,1376732001,2179103, - 1376765524,1376862299,1376899516,1376960543,565772326, 1376981949,1377026570,1377060159,579011904, 1377124382,1377159651,1377193861,1377271874,1377304606,108658714, + 1375731970,1376099097,55869459, 1376289305,1376361242,1376436234,1376456546,1376520022,1376574235,1376633034,184713232, 1376667428,1376714783,1376732001,2179103, + 1376765524,1376862299,1376899516,1376960543,565772326, 1376981949,1377026570,1377060159,579011904, 1377124382,1377159651,1377193861,1377271874,1377304606,108658714, 1377337398,1377377052,1377458973,1377550338,43532291, 1377566732,113229834, 1377583110,66521557, 1377599791,1377632293,1377648671,22478860, 1377665083,1377702511, - 1377747004,1377830075,1377878056,130252838, 1377895001,1377927769,174440474, 1377966878,1378058246,1378074664,787922970, 1378091039,1378107394,1378124407,124239878, + 1377747004,1377830075,1377878056,130252838, 1377895001,1377927769,174440474, 1377966878,1378058246,1378074664,787922970, 1378091039,1378107394,1378124407,124239878, 1378156903,1378190681,679837722, 1378222614,1378261791,1378336799,1378353190,1378369602,1378402421,1378441414,1378484226,1378500646,1378517467,1378551192,1378598968, - 1378631767,1378680949,1378720544,1378828304,1378844683,1378861071,1378877466,1378893840,1378910219,228294687, 1378926604,1378943017,1378959391,1378975763,701169695, + 1378631767,1378680949,1378720544,1378828304,1378844683,1378861071,1378877466,1378893840,1378910219,228294687, 1378926604,1378943017,1378959391,1378975763,701169695, 1378992166,1379008528,528760860, 1379024927,1379041286,1379057685,1379074064,1379090451,1379106838,1379123212,1379139595,150061087, 1379156008,1379172367,1379188751, 1379205146,1379221516,916652038, 246251542, 1379240472,144621580, 1379310369,1379457826,1379549205,1379571334,942145562, 1379647947,1379697595,1379762465,1379795836, - 1379845289,1379876870,1379893707,1379942431,1379958796,1379975178,110298713, 1379998499,1380106259,135577622, 1380122643,239714306, 1380139467,1380188262,479100966, + 1379845289,1379876870,1379893707,1379942431,1379958796,1379975178,110298713, 1379998499,1380106259,135577622, 1380122643,239714306, 1380139467,1380188262,479100966, 1380221388,1378074645,1380260644,1380384789,1380401999,1380433932,1380450319,838418453, 1380466742,1380499475,1380515861,1380532251,1380571941,1380630566,1380647804, 1380696070,200228914, 1380712907,1380761606,838418438, 1380778000,1380794378,1380810754,1380827244,1380859935,84738058, 1380876328,138641843, 1380893537,1380925482, 268107788, 1380941930,1381026756,1381072917,1381090187,1381154827,1381171212,123813898, 1381188017,1381220655,1381254034,1381309222,1381400597,1381423911,1381498892, @@ -2753,16 +2748,16 @@ static const unsigned int DictNodes[84251] = 1381793811,1381810197,1381826591,1381842963,1381859330,153748262, 1381882664,1381941258,1381957634,1381974551,1382006823,1382040199,1382089696,1382137866,1382155160, 1382206768,1382252546,29622293, 1382275881,902889487, 1382334494,1382367263,115163148, 1382383682,1382416855,1382449611,1382501713,1382580230,1382596674,1382629433, 139395138, 1020723266,1382646297,1382711797,1383177002,1383420307,1383466014,412008460, 1383498769,1383547481,1383579654,1383596038,143589407, 1383612442,1383628802, - 1383645815,1383677983,1383695221,1383727563,1383777090,1383825409,1383612456,1380745247,1383841804,1383858202,1070841877,89129000, 1383874591,1383890956,787922954, - 1383914283,52723723, 1383972879,1383990008,1384022047,787922963, 1384038416,1384054799,1384071194,846135327, 1384092138,902889503, 1384136735,1384153107,133824552, + 1383645815,1383677983,1383695221,1383727563,1383777090,1383825409,1383612456,1380745247,1383841804,1383858202,1070841877,89129000, 1383874591,1383890956,787922954, + 1383914283,52723723, 1383972879,1383990008,1384022047,787922963, 1384038416,1384054799,1384071194,846135327, 1384092138,902889503, 1384136735,1384153107,133824552, 279904267, 1384169493,1384185868,115589130, 1384208607,1384267816,1384284186,1384300546,1384317036,1384349711,835862559, 1384366102,1384382476,46219274, 1384405143, 1384487724,1384529925,1384546316,1174208524,1384562725,7602204, 1384586029,77250591, 1384667950,1384815407,1384906771,1384923176,787922982, 1384945862,1384988674, - 1385006266,1385037855,1385054229,172983143, 1385071023,808402956, 1385103362,1385119765,1385136215,1385188624,1385252803,212844575, 544882977, 1385300192,128581672, + 1385006266,1385037855,1385054229,172983143, 1385071023,808402956, 1385103362,1385119765,1385136215,1385188624,1385252803,212844575, 544882977, 1385300192,128581672, 1385332823,1385388848,1385496588,1385512970,1385529975,1385562151,1385594892,1385611290,1385627650,1385644053,1385660503,1385709599,591774123, 1385726039,1385776044, 1385840650,212402235, 1385857463,1385889858,1385923603,1385971743,261342069, 1385995057,1386070026,341950495, 1386086412,649691162, 1386106950,1386184744,1386201098, 1386217503,116015123, 1386236315,1386299474,1386332191,1386348572,1386364955,143441941, 1386397708,1386414101,1386430476,229049495, 1386446860,1386464179,1386496012, 1380761610,1032208405,1386519346,1386594385,1386627103,787923001, 648347688, 1386643482,1080328232,1386666803,1386725377,1386741800,1386758156,1129529354,1386774967, - 661274636, 917012501, 1386807327,843907091, 1386824489,1386856464,1386872889,1386889228,1380450330,1386905612,1386921994,1386938399,1386954764,1386971146,646808183, + 661274636, 917012501, 1386807327,843907091, 1386824489,1386856464,1386872889,1386889228,1380450330,1386905612,1386921994,1386938399,1386954764,1386971146,646808183, 1386987581,1387036688,1387053082,1387069499,1387102229,1387118679,1387168657,118194195, 838418474, 116228098, 1387216962,1387251557,683704326, 1387298892,1387331612, 386940966, 1387347980,1387364362,1387380757,1387398971,1387446283,1387462687,1387479050,1299054594,1387502388,1387577387,680476700, 1387610114,251871260, 1387628520, 1387679620,1387794226,1387839504,212320296, 1387862837,1388052501,1145143308,1388071142,115120798, 1388118475,1388167189,1388183583,787922986, 1388199946,1388216623, @@ -2770,22 +2765,22 @@ static const unsigned int DictNodes[84251] = 1388609576,1081131020,1388626551,1388658714,1388675103,1380122652,1388691482,1388707880,1380450323,1388724236,1388740634,1388757003,1388773407,574537738, 1388796726, 1388960567,275464230, 1389042488,1389124409,1389189946,662585365, 1389252460,1389299830,1389363241,1389379596,143441946, 1389399074,1389461975,199443319, 1389494575, 1389527096,1389559867,1389599547,1389647458,737771535, 1389690946,114278827, 1389723659,846118943, 1389740564,1389789194,787922950, 1380122645,1389805599,1389821962, - 1389839680,1389871144,1389887519,1389903878,787922966, 1389920287,1389937079,1389969448,1389985794,1390002284,1390036312,1390085528,1390140220,1390264336,58769445, + 1389839680,1389871144,1389887519,1389903878,787922966, 1389920287,1389937079,1389969448,1389985794,1390002284,1390036312,1390085528,1390140220,1390264336,58769445, 1390281928,1223704607,1390313498,1390329887,383860746, 1390346294,787660831, 1390379020,1390395398,163463199, 1390411802,1390428595,1390460944,521797647, 1390477371, 1390511307,1390542874,1390559234,866910214, 1390582589,1390673951,1390690325,1390706690,3178524, 1390724072,1390772761,849510442, 1390837781,1390854170,1390870960, - 1390903342,1390952486,1390968859,1391002512,1391041179,1391074110,839548954, 1391296541,29261830, 1391312937,1391329739,1391378451,1391394837,1391411276,149487673, + 1390903342,1390952486,1390968859,1391002512,1391041179,1391074110,839548954, 1391296541,29261830, 1391312937,1391329739,1391378451,1391394837,1391411276,149487673, 1391443987,1391460383,780058636, 1391479773,1383596074,1391525909,1391542303,88686613, 1391558696,1391575343,1391607829,1391625545,1391678459,701186050, 1391725849, 1391788075,787922959, 1391820821,618709011, 88555539, 1391837215,1391853589,1391869954,663699484, 1391893311,1389789224,1391984642,1392001064,1380450310,1380122650, 1392017489,1392050283,676347910, 1392082975,700809228, 1380007967,1392099354,1392115743,1390690323,1392132130,1392253760,1392345115,6029331, 199442890, 1392378487, - 1392417257,114049050, 1392510459,383860776, 1392565057,1392623637,1392640892,1392690144,1392745282,1392836624,371277850, 259620948, 1392853058,1093812255,627720213, + 1392417257,114049050, 1392510459,383860776, 1392565057,1392623637,1392640892,1392690144,1392745282,1392836624,371277850, 259620948, 1392853058,1093812255,627720213, 1392892739,1393000460,908902438, 1393017592,1393049708,1393082394,1387069442,1393100205,1393147925,1393171268,1393229929,1393262623,576225291, 47546425, 1393278987, - 1393295663,1393328188,1393410098,1393442861,778862594, 1393476043,1393525601,1393558497,259981333, 1393591616,1318780949,1393623340,1393655820,1393672198,395198483, - 1393692771,1393721354,1393739025,1393786946,1393826629,1036714010,1393950732,1393967130,576176147, 1393983499,1394000779,1394065889,1394114591,1394135381,7146104, + 1393295663,1393328188,1393410098,1393442861,778862594, 1393476043,1393525601,1393558497,259981333, 1393591616,1318780949,1393623340,1393655820,1393672198,395198483, + 1393692771,1393721354,1393739025,1393786946,1393826629,1036714010,1393950732,1393967130,576176147, 1393983499,1394000779,1394065889,1394114591,1394135381,7146104, 1394180155,1394213323,1394268998,1394327660,1394360341,1394376730,1394393128,1394409491,1394425877,1133789224,1394442241,1070841896,1394458634,1394475050,1394491458, - 126222874, 1394524259,1394556959,1394573314,128155669, 1394596679,1394787064,1394820004,1394868266,1394884639,162250768, 1394907976,1395015772,1395048460,159383573, - 259703731, 1395064908,1395099289,1395146758,520618000, 1395164362,1395212354,1395252041,174129623, 640844079, 1395311471,1395359749,1395376140,1395392533,44662810, - 1395409895,1395458108,1395546954,45908009, 10649852, 1395654722,1395687713,1395720631,8390501, 361283631, 1395753880,1395802138,159383581, 1395818518,198606860, - 1395834964,1395867686,1000898576,1395884044,1395901176,1395938849,1396032294,1396064287,1396080661,1396097931,1396162616,1396195349,1396211718,1396229107,16318501, + 126222874, 1394524259,1394556959,1394573314,128155669, 1394596679,1394787064,1394820004,1394868266,1394884639,162250768, 1394907976,1395015772,1395048460,159383573, + 259703731, 1395064908,1395099289,1395146758,520618000, 1395164362,1395212354,1395252041,174129623, 640844079, 1395311471,1395359749,1395376140,1395392533,44662810, + 1395409895,1395458108,1395546954,45908009, 10649852, 1395654722,1395687713,1395720631,8390501, 361283631, 1395753880,1395802138,159383581, 1395818518,198606860, + 1395834964,1395867686,1000898576,1395884044,1395901176,1395938849,1396032294,1396064287,1396080661,1396097931,1396162616,1396195349,1396211718,1396229107,16318501, 1396244622,1396277314,118194186, 1396310037,1396327325,1396408348,1396424735,1396441109,1396458336,1396529995,1396572176,1396588586,984891404, 1390182415,1396605028, 1396637698,1396654090,1396671356,1396726604,1396834310,166051861, 1396850719,1396867703,1396899880,1396916290,1396949023,1396965460,1396998252,1397032280,1397080976, 1397113433,1397145619,1397162005,1397179293,1397261610,1397309874,1397343126,1397393345,1397440533,128090143, 1397463885,1397588025,1397604364,1397620742,1397637177, @@ -2810,9 +2805,9 @@ static const unsigned int DictNodes[84251] = 1405747231,1405763599,1405780006,547897375, 1405796657,1405829141,1405846396,126140426, 1405895882,1405944258,1405976642,1406009370,1406025815,1406074948,1406124134, 1406156812,1406173205,1406189598,1406222338,1406238741,1406255116,675921946, 1406275060,1406353418,1406369804,4014106, 1406386233,1406402572,1406418970,1405616138, 1406441458,1406484492,985301011, 1406500924,1406583313,1406615595,1406649202,1406682014,201572378, 1406715409,1406747148,1406786404,1406828565,664174608, 1406845465, - 1406910490,1406926874,1406943664,479363131, 1406980203,1407025183,1407041579,1407074386,1407108570,2130856, 1407189418,1407225229,268435468, 1407270922,126615573, + 1406910490,1406926874,1406943664,479363131, 1406980203,1407025183,1407041579,1407074386,1407108570,2130856, 1407189418,1407225229,268435468, 1407270922,126615573, 1407288313,1407373888,1407436120,564871171, 1407483935,1407500304,1407516682,1407533058,1407550963,1407583118,1407648656,1407687525,1407729695,1407746064,1407762442, - 540295170, 1407785830,79691802, 1407861834,1407893516,1407909914,143589378, 546095110, 1407927557,1407991834,4063238, 1408008194,1408025711,1408057356,201572373, + 540295170, 1407785830,79691802, 1407861834,1407893516,1407909914,143589378, 546095110, 1407927557,1407991834,4063238, 1408008194,1408025711,1408057356,201572373, 1408073833,1408106498,1408122901,119324738, 1408139318,1408172053,1408189323,1408254009,1408270367,5275658, 1408287733,1408352687,1408392039,1408435121,1408467247, 1408499733,1408516162,1408548880,1408565258,1408581638,193314838, 139198506, 974323754, 1408598031,1408614421,1408633906,1408703336,1408762456,1408794640,1408811046, 209993730, 1408828385,1408860219,1408893942,1408926155,1408975479,1409014633,1409073184,1409106767,1409138719,121356298, 1409155179,1409187871,393297977, 1409204683, @@ -2824,12 +2819,12 @@ static const unsigned int DictNodes[84251] = 1411203103,2293781, 383860765, 57032735, 1411219458,193888262, 1411235900,1411320640,1411383372,1411416093,1411439472,1411514399,1411530754,1411548062,1411585392, 1411661845,1411679072,1411743770,1411761176,1411816305,1411892136,1072922650,1411924055,1411974012,1412028444,1412071445,1412094834,1412186596,1412235266,1412252279, 1412284503,1412340595,120799253, 1412431888,771620890, 1412448275,1412464671,683442204, 1412481055,1412497436,1412513819,1412546657,1412619124,1412678534,1412710456, - 1412743189,666009602, 1412759590,1407860746,1412776020,1412808730,122503197, 1110900820,1412825613,366657562, 1412881269,1413120010,1413136394,1413153227,128925764, + 1412743189,666009602, 1412759590,1407860746,1412776020,1412808730,122503197, 1110900820,1412825613,366657562, 1412881269,1413120010,1413136394,1413153227,128925764, 1413201951,1413222034,1413270763,1413333825,1413365805,1413399453,1413480454,215482387, 1413503862,1413562374,1413578767,1413595158,1413611532,202522650, 1413631528, 180880040, 867926491, 1413660703,191545354, 1413678249,1413716855,1413874178,1196051, 1413907279,1413939242,1413955596,551452682, 1413979000,1414070406,1414086677, - 1414103156,1414119558,1414135923,1414152232,81526820, 45907984, 1414168592,651232286, 1414191993,868696102, 1414266911,385646611, 875797370, 1414290299,464453670, + 1414103156,1414119558,1414135923,1414152232,81526820, 45907984, 1414168592,651232286, 1414191993,868696102, 1414266911,385646611, 875797370, 1414290299,464453670, 1414348831,1414369397,1414397955,14499861, 1414421372,1414749053,44253225, 1414939146,1414974593,922451990, 838418451, 6619568, 1415027582,1415118850,1415135242, - 452018205, 1415151675,99893260, 1415185271,2129963, 118883593, 1415224191,163317034, 1415397378,66158618, 1415413847,1415462923,1415479332,1415495706,29261835, + 452018205, 1415151675,99893260, 1415185271,2129963, 118883593, 1415224191,163317034, 1415397378,66158618, 1415413847,1415462923,1415479332,1415495706,29261835, 1415513228,1415561347,1415577858,336543898, 1415614419,1415666560,1415774481,1415807002,868089954, 1415823961,242466837, 467959867, 1415858945,58802204, 1415912321, 1415972758,1416027010,1416285377,1416335154,1416380470,1416416022,864878632, 1416445983,1294237702,1416462423,212320282, 1416514036,1416561177,1416628446,1416675816, 1416708610,1033879568,1416740904,1416757264,218415135, 1416774169,1416846211,1416888351,1416904706,1416921144,1416953887,1416970256,671367178, 1416993668,1417117712, @@ -2841,74 +2836,74 @@ static const unsigned int DictNodes[84251] = 1419369355,1419493456,1419526156,1419542530,1419558941,707854351, 1419575755,1419631500,1419674125,1419722836,254591023, 1419760083,124403714, 1419822202,1419886679, 1419942797,588503950, 430882846, 1420073871,1420181588,5866505, 305479762, 1420221328,1420361820,650051610, 29622301, 1420401266,1420443658,423215133, 1420460491, 1420516241,1420591534,1420647286,1420712805,148946959, 1420754973,1420772790,1420827538,461440203, 1420920635,1420974995,896122911, 1421033510,44466207, 1421053887, - 1421106068,83591194, 208125968, 1421280397,1421328405,1421344834,1421378401,981729290, 1421410344,49774611, 1421426742,1421459538,1421493144,1234010138,278364186, + 1421106068,83591194, 208125968, 1421280397,1421328405,1421344834,1421378401,981729290, 1421410344,49774611, 1421426742,1421459538,1421493144,1234010138,278364186, 1421541468,1421574160,193593359, 1421597499,1421646741,1421721646,1421770764,1421787174,1421803995,199459040, 1421843350,1421968418,55033896, 5344122, 1422000587, 1422056343,1422121880,1422213227,723288483, 1422245933,1422279109,1422311480,1422344651,7307267, 1422400409,260457786, 1422695322,1422787996,1422836631,1422886262, - 1422935269,266731551, 1423017873,1423049622,1423100657,1423130734,1423163394,1423179797,1423196226,1423230103,1423278092,1423294490,1423310850,119455851, 3229274, - 1423334299,1423458310,1423474700,55148563, 1423491138,8395676, 1423526186,1423589483,1423629213,538198082, 309723138, 8389204, 1423674109,1423727518,140248624, + 1422935269,266731551, 1423017873,1423049622,1423100657,1423130734,1423163394,1423179797,1423196226,1423230103,1423278092,1423294490,1423310850,119455851, 3229274, + 1423334299,1423458310,1423474700,55148563, 1423491138,8395676, 1423526186,1423589483,1423629213,538198082, 309723138, 8389204, 1423674109,1423727518,140248624, 1423835983,1423867947,1423900682,308953142, 176504851, 1267941419,835027247, 1423922414,1424020463,1424087967,1424277762,21020826, 1424310338,1424344489,1157365762, 1424376570,1424415648,1424481185,36668761, 500711455, 1424605705,1424639393,452018186, 208503671, 110121902, 1424687211,1424720304,994788246, 1424754497,1424858018, 533069900, 131269455, 1424972707,198721652, 1425082136,1425145862,307134467, 1425165053,1425211430,1425227814,17006597, 62324852, 22216714, 1425244219,1425284004, - 1425342571,1425382309,1425562534,458784780, 1425670184,1425686559,1425703019,917651496, 1425736202,1425769672,1425801751,1425833996,126517290, 853164044, 350634015, + 1425342571,1425382309,1425562534,458784780, 1425670184,1425686559,1425703019,917651496, 1425736202,1425769672,1425801751,1425833996,126517290, 853164044, 350634015, 5308525, 1425850408,1425866783,1425883148,560775194, 1425899531,460179590, 1425915958,198606854, 1425949620,6619218, 282034609, 1426512808,108707960, 1426637271, 1426669570,124403733, 1426693033,1426735116,1426751603,16269341, 1426767873,1426784257,1426800774,1426817046,1426833540,1426849814,17448969, 1427315627,1427397548, 1427523073,199868639, 1427587609,1427652634,1427676077,1427718160,50659347, 117904631, 1427734554,2195693, 1427750996,1427783690,1427802463,1427850071,1427882000, - 292208650, 1427905454,1428078685,1428127787,1428162586,1428209674,1428226080,158500480, 1428265903,1428570302,1364001177,1428635840,1428669461,1428717574,220568496, + 292208650, 1427905454,1428078685,1428127787,1428162586,1428209674,1428226080,158500480, 1428265903,1428570302,1364001177,1428635840,1428669461,1428717574,220568496, 1428734036,1428768789,1428799519,44908556, 1428818201,1428882456,300581989, 1428930586,1428947181,115785759, 1428979714,1428996107,48676875, 1429013513,1429052337, 864043926, 1429143611,2752528, 1429183410,20365353, 1429274640,452018197, 1429291048,737771532, 1429309157,1429356572,143245340, 1429375610,1429422090,1429445555, - 1429585979,1429625780,1429756853,1429914536,1429949596,25559970, 1429997604,1430047070,2131504, 1430094657,1430126659,1430211077,1430264758,1430340016,938409994, + 1429585979,1429625780,1429756853,1429914536,1429949596,25559970, 1429997604,1430047070,2131504, 1430094657,1430126659,1430211077,1430264758,1430340016,938409994, 1430373748,1430422365,1430461367,1430589797,162503608, 610779152, 1430625209,1430701553,383565843, 1430735424,1430789050,1430870971,1431079053,1431128171,1431175180, 1431191558,1431207955,1431224342,112279557, 1431240725,1431257090,1431273513,47120425, 1431289966,1146685456,1431322690,1431355914,1431388190,1431420966,1431437417, - 1431470096,159760394, 1431493564,1431559101,9158791, 1431601154,1431617562,618142654, 1431641023,1431749662,1431781802,55869478, 1431815579,1431880119,126763062, - 1431919552,1432067009,1432161473,1432207819,876019733, 1432263618,1432338926,47415334, 1432371202,190169098, 1432387596,604749830, 3211714, 1432409812,119799894, - 1432509379,36716553, 52215820, 1432689604,1432731650,1432748466,1312342466,1432781706,1432820677,382765092, 191053843, 1432886214,1433030199,1433082823,145997853, + 1431470096,159760394, 1431493564,1431559101,9158791, 1431601154,1431617562,618142654, 1431641023,1431749662,1431781802,55869478, 1431815579,1431880119,126763062, + 1431919552,1432067009,1432161473,1432207819,876019733, 1432263618,1432338926,47415334, 1432371202,190169098, 1432387596,604749830, 3211714, 1432409812,119799894, + 1432509379,36716553, 52215820, 1432689604,1432731650,1432748466,1312342466,1432781706,1432820677,382765092, 191053843, 1432886214,1433030199,1433082823,145997853, 181174331, 188318729, 1433141353,1433181128,1433239554,1433255967,527056938, 1433279433,1433541578,1433616818,162840578, 388013003, 1433649999,484016227, 1433689036, 1433770957,27443349, 204066440, 1434222608,1434238986,360071197, 249987507, 1434255376,805142547, 1434278862,1434393551,1434468368,1434484737,51593256, 1434508100, 92930090, 1434566678,1434583106,199901213, 1434622928,1434966993,2359872, 388013010, 1435065299,1435107853,1435156949,1435205719,341986915, 1435261908,1435458517, 759579200, 1053197737,1435503638,1435573029,351010856, 1435638742,1435763264,1435802583,1435884504,1435926595,174030888, 1436015577,1436077195,1436159721,1249738773, 1436228570,1436294107,1436387558,15073286, 1436435324,1436484476,442254231, 46694422, 1436539868,291225654, 245907729, 1436697508,1436745754,1436762544,1436802013, 1436844073,1436860428,1436876828,1436893210,201572392, 1436916702,1436944455,1436998623,1437074087,1437107033,474890292, 1437138954,1437155359,120799251, 1437171752, - 1437188555,1437243945,1437303327,1437359072,1437663770,195084591, 1437696087,1437745254,25561567, 1437785057,185319461, 1437893978,110166100, 1437925388,185810946, - 1437941820,1438023740,381550613, 1438112738,316638705, 1438178275,468811778, 1438269546,1438353231,1438407652,1438467081,2197209, 46350363, 1438499275,285344707, + 1437188555,1437243945,1437303327,1437359072,1437663770,195084591, 1437696087,1437745254,25561567, 1437785057,185319461, 1437893978,110166100, 1437925388,185810946, + 1437941820,1438023740,381550613, 1438112738,316638705, 1438178275,468811778, 1438269546,1438353231,1438407652,1438467081,2197209, 46350363, 1438499275,285344707, 1438549615,1438597131,381550620, 1438613515,15073308, 1438637029,1438842890,1187282960,1438866406,1438925647,1438957676,427098607, 1438990795,1439039498,1439056181, 1439106264,1439219722,1439243239,8395752, 1439612940,1439629338,1439646098,10650447, 1439712458,1439761314,1439793605,1439833065,5309551, 1439940692,1439980522, 1440111595,1440186455,1440242668,131940392, 1440301098,185319464, 1440317446,2129986, 1440335549,1440422893,129433619, 1440534043,1440595995,1440635886,1440701122, - 1440799727,1440858114,1440874522,3473446, 1440890972,1440923660,409944066, 1440940058,1440956851,40173699, 307616752, 1440996337,1441291250,1441415190,376356866, - 1441431554,1441447974,1441464351,1441480725,8978454, 1441497109,108315125, 1441513525,1441546242,74661925, 1441562626,2202611, 1441579048,191414298, 159727618, + 1440799727,1440858114,1440874522,3473446, 1440890972,1440923660,409944066, 1440940058,1440956851,40173699, 307616752, 1440996337,1441291250,1441415190,376356866, + 1441431554,1441447974,1441464351,1441480725,8978454, 1441497109,108315125, 1441513525,1441546242,74661925, 1441562626,2202611, 1441579048,191414298, 159727618, 1441595394,1441611802,448544797, 1441628247,1441677366,2202612, 1441710134,1441742890,36765830, 1441760220,1441792002,385155077, 1441808386,8994852, 1441825227, 1441874157,1441906698,38879251, 1441923074,465322022, 1441946613,1442028534,602161162, 1442094071,333135956, 2196386, 1442218287,9388063, 1442257912,1442365665, 1442398679,433405981, 45613096, 1442438137,1442496627,75497587, 103448598, 1442512908,44941322, 1442529326,1442946043,1443021647,1443053608,670466054, 1443077116, 1443315714,1443333240,1443364885,1443381279,962805766, 1443404797,1443446786,146653210, 1443464823,1443528730,1443545090,1443561482,591609875, 757792799, 1053362676, - 1443577858,1443594259,1443610625,7389224, 1443627245,1443659778,1443676186,158817278, 1443693081,1443758162,1443791275,1443824726,1443872799,1443889190,829718559, - 278970380, 113836072, 279150608, 3244994, 1443906548,1443954726,180043804, 1443971181,1444011007,1444053004,15073290, 1444076544,1444233325,1444273153,758530058, - 243810306, 1444380678,21102613, 1444397986,1444429836,52576372, 741130271, 1444453378,1216006432,1444568067,2195616, 21708916, 1444675596,883196011, 225132603, + 1443577858,1443594259,1443610625,7389224, 1443627245,1443659778,1443676186,158817278, 1443693081,1443758162,1443791275,1443824726,1443872799,1443889190,829718559, + 278970380, 113836072, 279150608, 3244994, 1443906548,1443954726,180043804, 1443971181,1444011007,1444053004,15073290, 1444076544,1444233325,1444273153,758530058, + 243810306, 1444380678,21102613, 1444397986,1444429836,52576372, 741130271, 1444453378,1216006432,1444568067,2195616, 21708916, 1444675596,883196011, 225132603, 1444695725,1444748292,1444954138,1444977669,1445052432,1445068810,1429543942,7733278, 1445086598,1445151241,25559092, 952877062, 1445183518,1445223205,1445281802, 110723114, 1445298242,112197689, 1445332591,1445387271,1445561334,1445593098,1445609775,740491323, 422658058, 1445643654,838451298, 1445710383,610222614, 1445780488, - 486998047, 1445840264,201525054, 1445878793,1445977098,1446022448,1446068761,1446140939,158810939, 1446395934,1446429102,1446485004,1446550541,254593210, 643909273, + 486998047, 1445840264,201525054, 1445878793,1445977098,1446022448,1446068761,1446140939,158810939, 1446395934,1446429102,1446485004,1446550541,254593210, 643909273, 1446626144,1446690923,136003594, 9207829, 1446730766,172841999, 1446845456,1446943761,1447020730,24297690, 119998943, 1447058450,1447199482,1447238675,1447331837, - 487030836, 1447386132,689569833, 1447468053,1447510018,1447526426,1447542813,1447559600,121356291, 1447599126,1447657524,1447690339,1447730199,1448008728,209616925, + 487030836, 1447386132,689569833, 1447468053,1447510018,1447526426,1447542813,1447559600,121356291, 1447599126,1447657524,1447690339,1447730199,1448008728,209616925, 186974262, 1448067159,1448120844,1448165808,1448198203,1448230924,1448247403,1448287257,1448347264,1448397933,421085240, 268863646, 1448477217,522978225, 1448529874, - 547962996, 402440213, 1448598554,136119234, 114917442, 1448674694,1344946284,1448739735,17842285, 1448795163,416972812, 1448902662,1448919042,552894502, 451772482, + 547962996, 402440213, 1448598554,136119234, 114917442, 1448674694,1344946284,1448739735,17842285, 1448795163,416972812, 1448902662,1448919042,552894502, 451772482, 1448942620,1449099286,235439988, 1449115658,1449132879,6373978, 192200761, 1449165268,381550630, 249102873, 1449197655,1196392460,1449249102,1306869771,1449368605, - 1449478925,1449543108,10034206, 6374520, 1449575292,409272419, 1449630751,152272922, 1449696288,1449885718,1449902106,414089247, 1449918688,194037082, 103546882, + 1449478925,1449543108,10034206, 6374520, 1449575292,409272419, 1449630751,152272922, 1449696288,1449885718,1449902106,414089247, 1449918688,194037082, 103546882, 1449958433,1450132608,659914790, 1450180634,1450197395,1450246195,1450279215,1450314069,1450377358,1450410090,1450492867,1450548258,1450590220,167084038, 1450610784, 190169119, 1450662947,1450754895,6602790, 1450786924,1450826788,1450901516,837435914, 1450917894,1450934872,1450970470,1451039781,1451081782,1451121702,1451180054, 1451196550,402538518, 641531916, 1451220007,1451245571,120143900, 1451269160,1451379155,1451425855,118883151, 1451458653,148897821, 1451507722,441532458, 1451524212, 1451540522,1451556885,15482918, 1451573258,1451591246,1451638822,1451655191,14549010, 1451671562,1451688052,1451704342,461963304, 1451726646,1452071977,1452137514, 732102678, 1452203051,126025749, 1452268588,17924118, 1452310530,1452326943,1452343338,72368140, 1452359709,159694888, 27607081, 1452383277,1452458790,1452490783, - 1452507268,1452523654,59375753, 1452542391,230555730, 1452606376,1452638237,1452654623,93978630, 1452678190,1452770965,1452842031,1452998666,1453015069,279150594, + 1452507268,1452523654,59375753, 1452542391,230555730, 1452606376,1452638237,1452654623,93978630, 1452678190,1452770965,1452842031,1452998666,1453015069,279150594, 1453031478,1453071408,47480834, 1453180202,1453230372,1453293620,1453326807,1453360022,1453415473,1357447220,1453497394,1453710387,1453949070,1453981999,1454014483, 1264975894,150913495, 1454038068,1454146136,1454179196,7095143, 6620098, 1454234677,1454326921,3245266, 1454380037,1454440470,89128962, 1454456844,1454473242, 341986351, 1454489716,1454506015,1454522657,1254916555,1454558118,1454587949,1454627894,1454709815,1454775352,1454808120,66821176, 1454835248,1426751493,1454873657, 1454981177,1454997546,1455013916,48480297, 377658426, 1455030284,2343042, 1455053883,1455128595,1455145001,214007844, 1455161460,496582685, 1455184956,1455243300, - 1455259764,1455276039,1455292498,1455325216,883736617, 1455365181,1455440003,70729858, 1455457310,67485698, 1455490397,975192105, 1455538198,1455554676,103743489, - 1455996965,1456013321,917620, 1456036927,1456160790,118472735, 1456177649,1456259531,1456308264,1456324639,19251302, 1456348224,1456440985,1456488450,248840218, + 1455259764,1455276039,1455292498,1455325216,883736617, 1455365181,1455440003,70729858, 1455457310,67485698, 1455490397,975192105, 1455538198,1455554676,103743489, + 1455996965,1456013321,917620, 1456036927,1456160790,118472735, 1456177649,1456259531,1456308264,1456324639,19251302, 1456348224,1456440985,1456488450,248840218, 1456505672,1456603174,117506480, 1456620433,140247142, 204374027, 1456671071,140787810, 1456717845,1456734234,178814978, 1456757825,108315057, 199868641, 1456869286, 1456914448,117424133, 1456938050,1457160494,1457193044,8395843, 1457227636,5865524, 1457258601,1457291270,7307304, 1457309435,1457364036,2801701, 1457429573, 163414032, 1457471529,1457487902,1128169538,1457527878,1457603505,6717450, 1457636815,1457733725,1457790023,1457865611,1457930246,1457948453,1457995786,1458012202, 1458028555,45465612, 1458045792,1458117704,8395849, 206880924, 1458536469,1458552854,558628948, 526368784, 555270156, 1458570334,308576268, 130269205, 1458618510, 1458658378,1458716738,144441794, 1458756683,1458838604,1458929666,681968093, 1458953293,1459093514,1459117134,1459191892,1459226645,1262141858,307134466, 1459259951, - 1459330127,871744402, 1459406313,1459454799,1459493968,1459540146,1459604029,1459690577,1459814410,1459831318,1459870802,472287863, 1460018259,351911952, 232292373, + 1459330127,871744402, 1459406313,1459454799,1459493968,1459540146,1459604029,1459690577,1459814410,1459831318,1459870802,472287863, 1460018259,351911952, 232292373, 358105147, 1460097432,1460176606,1460224046,1460280404,1460537947,632308147, 1460600854,1033584724,1460620355,1460682857,1460722773,1460864969,1460912934,1460944934, 31424528, 1460961334,5505039, 1460998729,755784790, 1461066839,1461159202,1461207042,59228198, 3538965, 1461223878,1461263448,50036873, 1461454473,1461555584, 1461607513,8389017, 1461781443,1461829644,1461846230,1461879255,524763142, 1461911554,5324909, 1461928002,1461961702,1462000730,191938575, 1462190559,1462230107, @@ -2916,28 +2911,28 @@ static const unsigned int DictNodes[84251] = 1463026577,1463074897,1463114847,1463180384,113541434, 1463255108,451379202, 1463304238,1463353382,1463370203,1463402967,1463437365,1463490869,1463566873,1463631882, 1463648272,1463664697,1463681499,1463714842,1463763478,1257505745,884746, 1463795752,1463812122,1463828516,2752530, 1463852129,1463992332,599688538, 1464009829, 1464057877,1464074271,385025058, 1464094774,430014505, 148635707, 1464139807,131777114, 1464158238,1464205328,51380250, 1464228962,1464254598,1212426, 1464278115, - 1464352809,642154532, 916537346, 1464376420,1464474725,1464516610,1464533011,56311945, 1464946598,1464999015,1465106926,510771226, 1465139831,167084048, 108396546, + 1464352809,642154532, 916537346, 1464376420,1464474725,1464516610,1464533011,56311945, 1464946598,1464999015,1465106926,510771226, 1465139831,167084048, 108396546, 1465179240,1465244777,2359387, 17225314, 1465339399,1465401390,1465454547,1465506922,1465652574,1465713074,208849584, 1465746055,1465795525,1465844556,1465893323, - 1465942100,1465975544,5325479, 1466014827,1466113132,1466155542,877805649, 373604394, 1466195053,1466335242,1466351645,186040326, 1466370431,1466433574,147423248, + 1465942100,1465975544,5325479, 1466014827,1466113132,1466155542,877805649, 373604394, 1466195053,1466335242,1466351645,186040326, 1466370431,1466433574,147423248, 1466449946,1466466314,506036226, 281935874, 1466489966,1466565079,1466598907,1466647490,1466686575,1466829119,1466859586,1466894523,1466948720,1190723625,1466997873, 435554082, 1467063410,1467210867,1467292788,1467440245,1467522166,1467620471,464945441, 1467744262,307616888, 6406175, 1447264348,1467767929,1467858946,1467875368, - 44662826, 2196030, 8395898, 1467899003,1467991070,1468023936,1468071995,447840266, 1468111996,1468235778,142262282, 1468258633,1468308605,1468498600,86638594, + 44662826, 2196030, 8395898, 1467899003,1467991070,1468023936,1468071995,447840266, 1468111996,1468235778,142262282, 1468258633,1468308605,1468498600,86638594, 1468537982,1468612684,1468652671,1468792948,3178536, 1468816512,9207831, 8601746, 385286184, 1468898433,281935910, 1469055069,270516250, 1469104194,1469144194, - 1469284843,232849439, 1114134, 1469317173,1469357187,1469448198,1469464588,50151434, 1469480972,695369754, 118882380, 1469504644,1469612114,1469644806,152256553, + 1469284843,232849439, 1114134, 1469317173,1469357187,1469448198,1469464588,50151434, 1469480972,695369754, 118882380, 1469504644,1469612114,1469644806,152256553, 140788745, 1469661186,5866417, 327965829, 1469677633,1900547, 1469726943,1469759969,1469808652,134840346, 1469832326,1470045319,1470120828,1470175448,1470225544, - 1470267404,1470283786,1470300166,1470318942,292945932, 1470373001,1470504074,901152799, 1470578714,1470595112,119259165, 1470612303,1470651531,1470742960,7307276, - 1470782604,1470962829,2834927, 363513130, 1471021293,1471053850,1174880297,1471077518,1471152194,1471184898,1471202040,1471234480,1471267735,1471323279,23757203, + 1470267404,1470283786,1470300166,1470318942,292945932, 1470373001,1470504074,901152799, 1470578714,1470595112,119259165, 1470612303,1470651531,1470742960,7307276, + 1470782604,1470962829,2834927, 363513130, 1471021293,1471053850,1174880297,1471077518,1471152194,1471184898,1471202040,1471234480,1471267735,1471323279,23757203, 1471496223,1471512588,161726492, 246563274, 1471529419,1471579080,1471660972,1471725634,1471758443,1471791994,1471840296,110215607, 1471856692,1471889429,1471905794, 1471922191,1471938576,1471954950,1471971394,1472004117,1472020520,1472036876,33112079, 1472053307,1472086057,1472102422,1472118900,1472135197,7667753, 1472158864, - 174800934, 764624917, 1472217223,19447813, 1472233474,1472249862,251330597, 1472266281,1472282756,1472299009,1472315433,1769481, 1472823599,1472856069,73531423, + 174800934, 764624917, 1472217223,19447813, 1472233474,1472249862,251330597, 1472266281,1472282756,1472299009,1472315433,1769481, 1472823599,1472856069,73531423, 1472872879,1472909664,1472942732,86081564, 1472978066,1473020067,17154071, 1473052806,1473069171,1473085575,28475524, 1473101958,9158675, 1473122678,1473151014, - 76775430, 1473167417,1473183760,88883206, 1473626121,44236826, 1473649812,15007766, 45023234, 52150310, 656916482, 1473813653,1474010262,1474135305,13549590, + 76775430, 1473167417,1473183760,88883206, 1473626121,44236826, 1473649812,15007766, 45023234, 52150310, 656916482, 1473813653,1474010262,1474135305,13549590, 2113538, 1474166786,1474184563,1474216239,1474248710,171835413, 1474272407,146784315, 1474337944,1474387097,1474461734,6373442, 1474485402,131891298, 1474629487, 1474691832,152190987, 1474726317,1474773008,1108295720,1474789378,360005658, 8391235, 1474805790,1474845851,1474904066,1474920474,1474938124,1474993308,1475173533, 1475253578,13549606, 1475337374,1475412569,914884460, 5309095, 204537882, 1475452063,208504305, 1475648672,1475690506,2359338, 1475706892,1466171418,1475723276, 1475739674,52363274, 1475757721,152191086, 47120387, 1475805199,1475821594,1475837954,44253190, 1475861665,1475953107,325369866, 287572544, 1476009122,1476140195, 948617227, 1476215143,153190498, 1476254884,1476385957,1476493371,1476527706,1476559307,2162704, 1476609013,152946641, 1476673595,345784325, 1476709763,1476755947, - 1476788226,1476804646,1476821007,146456598, 2408460, 1476838268,1476888112,1476926630,2179074, 4161548, 1477182835,1477215095,1477247916,1477313033,366116879, + 1476788226,1476804646,1476821007,146456598, 2408460, 1476838268,1476888112,1476926630,2179074, 4161548, 1477182835,1477215095,1477247916,1477313033,366116879, 1477352615,1477427284,110232029, 1477461335,1477509146,1477526913,1477574694,1477591042,1215299624,1477607927,1477657929,164118538, 1477713064,191678490, 1477804034, 125927481, 1477827753,1477975210,2201715, 131432464, 1478164502,5309937, 1478181167,253788162, 59310092, 1478217008,1478262868,1478296540,127044053, 1478328352, 1478368427,1478679724,1478852651,1478885458,1478918447,1478951019,50135042, 1478984099,1479019986,760135709, 1982480, 610698399, 1475969046,1479083351,1479133760, @@ -2945,15 +2940,15 @@ static const unsigned int DictNodes[84251] = 1479606278,1479622675,1479639056,202522639, 45891586, 1479662767,184926230, 191906095, 1479721003,110232073, 1479753820,1479786512,428769306, 1479810224,1307230210, 1479999504,121110554, 1480017902,87048202, 1480072369,1480163338,1480180138,1480219826,1480311385,1480350899,1480432820,1480596661,1480687646,1480727734,1480851466, 19267621, 1480867868,1480884283,59260940, 1480924343,1481006264,214630437, 1481083067,1481130423,1481162754,1481179815,1481212372,1481244694,177324044, 1481268409, - 1481333946,1069432870,1481377733,1481415867,1481507119,1481540777,1481572362,16826671, 1481596092,1481825469,1481982892,2146607, 1482047531,635060264, 2195950, + 1481333946,1069432870,1481377733,1481415867,1481507119,1481540777,1481572362,16826671, 1481596092,1481825469,1481982892,2146607, 1482047531,635060264, 2195950, 1482080793,147013748, 1482145814,618348546, 1482169534,1482293286,29900816, 1482309634,1482326027,533135372, 1482342830,52150283, 1482391554,14254089, 1482408828, 1482460861,2195507, 1482546367,1482670090,1482688734,1482735618,1482753199,1482792128,1482867595,1482932306,1482965029,8389961, 1482981422,1483031636,1483080725, 1483136193,1180942367,5882159, 1483185346,1483325974,1483358238,829718568, 1483390992,1483407372,55754793, 1483424175,1483456577,1483507853,5325983, 1483562179, 1483857092,1484112743,1484144724,7389210, 230555714, 1286865355,180601105, 1484177430,1484194095,1484226570,1484242946,527056924, 1484259343,547684392, 1484283077, 1484414150,1484458761,1484512455,1484703169,155025424, 533070061, 50937872, 1484734486,122323247, 1484758216,1484832867,1484872905,441387071, 1484947487,1484963866, - 1484980226,1484996629,517783574, 1485013051,6602789, 1485045762,1485062151,1485078659,90259586, 1485094972,1485184202,1485277144,1485348043,1485473220,24297947, + 1484980226,1484996629,517783574, 1485013051,6602789, 1485045762,1485062151,1485078659,90259586, 1485094972,1485184202,1485277144,1485348043,1485473220,24297947, 1485511884,1485637841,1485684752,1485701160,1485717507,533544972, 1468006507,188940290, 110117841, 8994822, 1485733947,1485766693,1485783080,47923211, 1485800532, - 1485855949,1485946886,119537695, 1485970638,1486167247,1486241807,540950530, 1486259153,1486308801,1146683437,56049680, 533544962, 1486345540,246562838, 433750100, + 1485855949,1485946886,119537695, 1485970638,1486167247,1486241807,540950530, 1486259153,1486308801,1146683437,56049680, 533544962, 1486345540,246562838, 433750100, 1486422471,1486472222,1486503974,1125974028,1486520380,1486609616,1486667807,1486684166,1486700565,544047130, 1486724305,1486800912,1486850420,299810861, 1486913839, 118883827, 1486949040,1486995560,1476821013,1487045819,1487093779,1487110166,478543903, 1487519753,1212439, 1487543507,1487814959,7094767, 175325206, 1487854547, 1487896602,1487912989,444153868, 1487929803,48529424, 1487978498,1487994890,1129381898,1488012262,1488044075,1488076884,1088536602,1488111184,1488191690,1488224278, @@ -2961,22 +2956,22 @@ static const unsigned int DictNodes[84251] = 1488575700,1488666630,125927446, 1488683046,2130001, 1488699448,376324118, 1488739541,19251302, 1488834671,1488903382,1489010754,1489050839,1489197984,1489263832, 1489340520,1489394905,1489539339,1489584140,308871199, 1489601055,1489649666,1489666147,1489703872,1489755354,1489820891,175620122, 335052840, 1489912345,1489984732, 1490076573,1490164957,760955374, 1490230494,1490276584,1490377951,1490452490,1490472540,2196401, 1490541792,1490633897,1490665524,1490698317,1490731039,1490747411, - 2197393, 1490763882,1490847171,1490895902,1490935009,1490993188,30392322, 1491009602,1491042360,1491082466,1491255327,1491271717,608043067, 1491288743,152567867, - 1491323347,1491369986,1491387047,1491419167,45875229, 1491435526,1212431, 1491452334,1491501140,1491537059,2162690, 1491606755,1491852516,1491992578,45531178, + 2197393, 1490763882,1490847171,1490895902,1490935009,1490993188,30392322, 1491009602,1491042360,1491082466,1491255327,1491271717,608043067, 1491288743,152567867, + 1491323347,1491369986,1491387047,1491419167,45875229, 1491435526,1212431, 1491452334,1491501140,1491537059,2162690, 1491606755,1491852516,1491992578,45531178, 1492009454,1492045676,294535199, 1492098277,49086476, 1492196582,168238311, 1492320287,265601050, 1293877276,1492336642,19267599, 1492360424,238714911, 1492451873, - 1492500919,116228133, 1492533551,1492567242,1492615194,1492631639,1492680730,1492699487,1492753368,1492802793,1492933866,1493008687,1493048555,1493114092,148636481, + 1492500919,116228133, 1492533551,1492567242,1492615194,1492631639,1492680730,1492699487,1492753368,1492802793,1492933866,1493008687,1493048555,1493114092,148636481, 1493212397,1493352550,461963280, 1493389730,1493451191,1493483551,59310096, 1493507310,131874900, 1493605615,1493671152,1493982399,849183146, 1494113213,1494155274, 208896042, 1494172595,1494204427,1032454160,1494228209,47611926, 1494335920,210618228, 1494368688,1494401034,149128332, 1494421219,1494552074,146767874, 1494614934, 1494663225,1266204688,1494683540,5177356, 1494746316,1494795466,1494844310,115721225, 1494892546,947929098, 1494908966,478756895, 1494925744,1494965490,1495014601, 1495096563,2261032, 272156100, 335151144, 1495220255,7733743, 1495244020,194609163, 1495351327,1442136083,1495367983,1495400879,1489273996,1495440629,1495515152, - 56049704, 47038504, 1495538934,198721567, 1495581700,113656641, 1495648981,934903924, 1495700715,205946902, 1495751927,1495817464,1495892075,1495925189,52592656, - 1495964921,1496243450,1496301613,1496334352,478954526, 332480539, 706101332, 1496351598,1496423675,1212760104,1496469907,1900601, 1496515639,1496547631,5312869, + 56049704, 47038504, 1495538934,198721567, 1495581700,113656641, 1495648981,934903924, 1495700715,205946902, 1495751927,1495817464,1495892075,1495925189,52592656, + 1495964921,1496243450,1496301613,1496334352,478954526, 332480539, 706101332, 1496351598,1496423675,1212760104,1496469907,1900601, 1496515639,1496547631,5312869, 1496581008,1496612902,1300807682,1496636668,1496767741,168903157, 1496825915,1496858731,1496894620,1496947966,1497046271,1497268461,1497301295,1497333997,1497367375, 1497399790,113115173, 412696579, 1007255590,1497439488,1497603329,714868510, 959479845, 1497677930,1497762996,99663888, 1497841676,1497858074,963952671, 1497881858, 1498029315,1498104408,1306804230,19252649, 1498144004,1179271245,1498193157,462667778, 1498252441,1498300447,1498316830,1498349594,19267587, 1498366489,1498431500, - 1498447898,1498464690,2539546, 1498498932,1498537222,1498628127,159450351, 1498651911,1498791946,30867591, 1498808855,1498841109,1498857494,1066025002,7618588, - 1498873877,1498890262,1140310057,1498907406,571129885, 1209073685,1498946824,2199904, 1499152406,1499168799,904937484, 1499185282,1499201541,1499217927,2130035, - 1499240353,1499267077,96960524, 1499290889,1499332626,1499349122,1499365386,1499381798,71794707, 1499398281,1499414658,2179207, 1499856905,1499873321,17432588, + 1498447898,1498464690,2539546, 1498498932,1498537222,1498628127,159450351, 1498651911,1498791946,30867591, 1498808855,1498841109,1498857494,1066025002,7618588, + 1498873877,1498890262,1140310057,1498907406,571129885, 1209073685,1498946824,2199904, 1499152406,1499168799,904937484, 1499185282,1499201541,1499217927,2130035, + 1499240353,1499267077,96960524, 1499290889,1499332626,1499349122,1499365386,1499381798,71794707, 1499398281,1499414658,2179207, 1499856905,1499873321,17432588, 1499897099,3213798, 1005453353,3874060, 1500120462,1500184598,1500200962,214679562, 1500220248,1500273933,266764804, 1500349524,1500400212,1500454158,1500578825, 126959626, 1500617999,1500710518,1500758058,1500774406,2113538, 4702730, 144441410, 1500798224,87556107, 254591057, 1500872741,1500889100,444580199, 1500912913, 1501009506,1501052938,51593247, 442843600, 1501069343,1501085708,1501102106,1501119376,1501158674,161726502, 7095143, 1501415033,6209576, 1501463721,1501502739, @@ -2988,60 +2983,60 @@ static const unsigned int DictNodes[84251] = 210518022, 1505484076,1505673687,705462284, 1173176386,1505705986,351010847, 1505724057,1505772716,1505828141,1506155822,45858845, 1506254127,115064870, 1506362104, 49774621, 1506394571,1506450736,1506492447,1506508854,1506549041,1506690078,1506729266,1506838855,893501524, 1506893107,1507024180,1507106101,1283751974,1507278878, 421429284, 1507313162,1507361300,50085993, 311215304, 1507413869,172837902, 1507482934,1507575014,1507672095,421036139, 1507688458,1507704874,482214315, 1507728695, - 150601779, 1507868691,1507885093,164233648, 1507901456,1507917916,1507950638,1508007224,3212111, 1508056377,1508212738,1508229160,1508245514,333742118, 113459202, + 150601779, 1507868691,1507885093,164233648, 1507901456,1507917916,1507950638,1508007224,3212111, 1508056377,1508212738,1508229160,1508245514,333742118, 113459202, 1257161198,1508261931,1508294666,1508311472,126025785, 1508343810,1508360202,51560490, 1508376592,1508392970,1508409386,22216711, 1508433210,1508540418,1508557560, 1508589634,1508623732,7734008, 1508678971,1509002391,1509064735,1509081098,1509097488,263946259, 1509121340,1509180152,1509213563,1509279353,1509334333,1509383486, 1509474326,433635330, 430669830, 1509491535,1509524057,1509563711,699138086, 385515586, 1509638681,1509704194,1509736454,55033878, 1509760320,131859801, 1509855778, - 124403754, 153749209, 1509933533,1509965905,1510006081,508626695, 1510071618,1510202691,1510244354,47415336, 1510260802,1510295116,1333133322,1510350148,186269801, + 124403754, 153749209, 1509933533,1509965905,1510006081,508626695, 1510071618,1510202691,1510244354,47415336, 1510260802,1510295116,1333133322,1510350148,186269801, 609813327, 62341162, 1510415685,1510612294,1510670795,1510719527,1135345686,1277182383,1510752715,1510808903,1510900766,1510932969,1510984870,1511064994,1511120200, 306775520, 1511309334,1511326636,1511392351,1511456774,1033224223,110232128, 2196603, 1511473912,1511508072,113836051, 1324778526,1511562195,1511611721,1511686237, 1511739859,1511800844,498472833, 1511820855,1511873866,1511999402,5866665, 1512064372,1512119627,1217871898,1512381772,1512460337,1512505349,528859172, 1512521809, 328073226, 1512561997,1512783888,1255194626,1512800302,61456410, 1512851221,159760390, 1512916244,1512964188,614858768, 1512996910,1513046042,456130592, 1513062859, - 1513119054,7454730, 1513278008,1513309381,1513357428,86097960, 1513373718,1513390108,641859641, 7454762, 82559014, 1513413967,1513488396,1513504796,91930635, + 1513119054,7454730, 1513278008,1513309381,1513357428,86097960, 1513373718,1513390108,641859641, 7454762, 82559014, 1513413967,1513488396,1513504796,91930635, 1513528656,1513725265,1514012674,1514029082,853164048, 1514045462,1514061826,1514078229,1514094829,298352656, 1514128884,112197748, 1514176622,1514209505,1514242088, - 1514258458,52756482, 1514282322,1514391853,1514446163,7094575, 1514511700,926302218, 1514619183,1514651684,1514668072,1514684432,1514700826,1514717186,2850856, + 1514258458,52756482, 1514282322,1514391853,1514446163,7094575, 1514511700,926302218, 1514619183,1514651684,1514668072,1514684432,1514700826,1514717186,2850856, 1514741077,1514946606,5079462, 1514995728,1515012106,1515028482,124403727, 1515052374,299794474, 1515130281,1157365776,1515160399,10829840, 1234125301,1515199831, 158254842, 575209494, 1515290626,2198195, 6455332, 1515307096,1515340536,449757200, 1515380056,199377199, 1515487243,1515503618,1515520010,1508311071,1515537482, - 1515569236,1515601931,1515618319,941654038, 233472920, 1515635448,1515674969,2196872, 1515806042,1515849249,389137905, 1515882979,6897723, 1515913232,112935591, + 1515569236,1515601931,1515618319,941654038, 233472920, 1515635448,1515674969,2196872, 1515806042,1515849249,389137905, 1515882979,6897723, 1515913232,112935591, 1515929612,1515946744,1515978762,1515995172,1516011541,1516027910,1516044325,113115172, 1516068187,1516306516,1516339228,1516355586,348618762, 1516371994,1516388389, 363741200, 1516405231,14794774, 1516437934,1516487195,1516519455,29769785, 1516535850,699138076, 1516552656,2113542, 1516601346,1516617739,1516634151,1516667857, - 1516716116,2147206, 1516748907,1516782103,219578384, 1516814358,1508311042,1516830760,1516847110,1516864567,41566227, 1516903772,1517062838,266486231, 112427030, + 1516716116,2147206, 1516748907,1516782103,219578384, 1516814358,1508311042,1516830760,1516847110,1516864567,41566227, 1516903772,1517062838,266486231, 112427030, 1517128004,2179375, 87031820, 378142722, 1517158402,1517178236,1517207583,75530243, 1517224354,1517256714,2719765, 1517673821,8390995, 1517731924,1517764614, - 1137557525,1517788510,1517864460,1517903199,1517961237,1325809667,5309176, 1517978514,1518027243,1518067040,1518224458,1518256193,1518305371,719093767, 451871187, + 1137557525,1517788510,1517864460,1517903199,1517961237,1325809667,5309176, 1517978514,1518027243,1518067040,1518224458,1518256193,1518305371,719093767, 451871187, 33112102, 1518338337,1518370818,233193498, 1518394721,1518554282,1518632986,343883787, 1518649403,1518682127,1518699594,442744898, 132154232, 456523792, 1518738786, 1518787939,1519043496,1519076137,1519111640,188581512, 1519164772,1519312229,1519435832,27607043, 1519476070,289980428, 1519599637,257572876, 1519623527,1519735816, 1519780687,1519814545,1203372491,1519849548,1519894540,1519910915,55459882, 1519934824,1519992853,177963046, 1520010827,573374470, 108314729, 1520058414,1520110782, 1520205934,7307269, 1520240427,1520278889,1520599093,1520635780,1520746594,227115034, 1520782564,1520835946,1520893964,1520910375,1520943169,343301483, 1030930448, - 1520992302,1521041461,1521081708,381550614, 1521140905,1521172490,46039156, 1521188880,1521205267,299008022, 1521222545,1521270877,1521327469,1521573230,158811264, - 154813551, 1521704303,153748825, 252116994, 1521851760,1522015601,229654538, 1522188351,1522228594,1522303022,1917026, 1522353991,1522401285,1522417695,193839125, + 1520992302,1521041461,1521081708,381550614, 1521140905,1521172490,46039156, 1521188880,1521205267,299008022, 1521222545,1521270877,1521327469,1521573230,158811264, + 154813551, 1521704303,153748825, 252116994, 1521851760,1522015601,229654538, 1522188351,1522228594,1522303022,1917026, 1522353991,1522401285,1522417695,193839125, 1522434585,1522507123,1522565176,1522597940,1522638196,1522729102,1522761740,576471061, 1522778114,93978645, 1522802037,1522860048,6946857, 1522883958,1522975023, - 1523015031,1523240436,338134362, 1523319544,1523359096,1523434390,761889622, 1523483161,163299375, 311820310, 184386581, 1523549574,1523619701,1523696649,109051943, + 1523015031,1523240436,338134362, 1523319544,1523359096,1523434390,761889622, 1523483161,163299375, 311820310, 184386581, 1523549574,1523619701,1523696649,109051943, 546553912, 1523731028,1524079994,1524187278,1524221307,1524292987,1524351005,1524367391,1524383754,114114572, 1524400140,1524417566,1524456828,1524613721,1524646933, - 1524702589,1524776962,1524793370,1524809749,1524827145,1524859326,1524924518,1524957643,110231972, 500793363, 1525013886,1525088258,128991253, 1525105090,88948752, + 1524702589,1524776962,1524793370,1524809749,1524827145,1524859326,1524924518,1524957643,110231972, 500793363, 1525013886,1525088258,128991253, 1525105090,88948752, 944604001, 1525144959,1525448720,1525465190,1525497887,293584902, 1525514324,87916560, 1525547970,30343457, 1525579835,4997799, 1525612990,1525685632,1525925150, - 1525973839,2196070, 1526005826,721077278, 1526038544,1526056981,110231618, 1526087764,385597677, 750469126, 1526123704,1526172793,3736735, 1526284757,186975144, - 551616907, 1526333977,1526400811,1526431766,1526448140,56262668, 1274216882,1526464572,1526553985,1526619522,1526717827,1526808582,119570454, 1526824976,36651232, + 1525973839,2196070, 1526005826,721077278, 1526038544,1526056981,110231618, 1526087764,385597677, 750469126, 1526123704,1526172793,3736735, 1526284757,186975144, + 551616907, 1526333977,1526400811,1526431766,1526448140,56262668, 1274216882,1526464572,1526553985,1526619522,1526717827,1526808582,119570454, 1526824976,36651232, 1526848900,1526992617,1527054639,1527087150,1527137310,1527169326,1527209349,1527332946,540101075, 1527367144,320719152, 1527422342,1527471495,258376440, 1527597740, - 409256981, 1527717256,1528012169,5947408, 281002000, 1528087942,1528152555,1528192394,1528315916,1528332294,1044021353,1528348726,146785065, 1528381481,27625658, + 409256981, 1527717256,1528012169,5947408, 281002000, 1528087942,1528152555,1528192394,1528315916,1528332294,1044021353,1528348726,146785065, 1528381481,27625658, 1528398318,1528438155,1528528977,1528563149,1528601996,505856098, 1528791105,45776934, 731676682, 165560349, 1528847757,1528922572,270401620, 1528954890,1528971285, 1528987679,1529004070,1529020454,46514192, 1529037259,152965387, 1148141570,1529093518,270352468, 1529136006,1529167956,361988118, 1529200671,1024540700,1529224591, - 1529282582,1529306512,1529397258,1529414085,251593931, 1529447318,368739249, 1529503121,1529612481,1529660390,1529699730,1529942104,114393130, 1529988491,168017932, - 1530039792,5325726, 1530118246,1530158483,741539878, 1530216507,1530256788,1530453397,1530548819,880919334, 1530633622,6602763, 348782634, 1530708930,324534274, - 1530743842,1530806379,141787147, 1530839140,1530879383,1531043224,1531117604,744079400, 1531134446,1531166786,1531201412,1531272601,1531332622,1531379752,853409818, + 1529282582,1529306512,1529397258,1529414085,251593931, 1529447318,368739249, 1529503121,1529612481,1529660390,1529699730,1529942104,114393130, 1529988491,168017932, + 1530039792,5325726, 1530118246,1530158483,741539878, 1530216507,1530256788,1530453397,1530548819,880919334, 1530633622,6602763, 348782634, 1530708930,324534274, + 1530743842,1530806379,141787147, 1530839140,1530879383,1531043224,1531117604,744079400, 1531134446,1531166786,1531201412,1531272601,1531332622,1531379752,853409818, 1531396348,1531436442,1531518363,1531674717,1531727219,1531789343,1531805733,1399029776,1531829660,1531871244,109150307, 1531887682,1531927965,6897967, 1532042654, 54411304, 52576282, 1532100911,1532133398,1532149770,8994827, 1532167084,321601644, 1532232115,1532264751,871301219, 1532297281,7307292, 268665327, 1532352017, 1532395822,1532428307,1532444674,1532461078,1532477442,6455307, 1532494742,358105147, 1532550559,6127627, 1532675025,1532723309,1532763552,1532821531,1532854313, 1532872051,148635758, 1532905250,1532936195,38879247, 1532952681,402309126, 1532985460,1533001785,1154269300,1533019633,1533051011,1533067396,1002143876,1533091233, 1533132837,1533150732,66815500, 1533313052,1533329420,1533345802,615792662, 1533369763,1533707155,290406440, 1533755819,1533788172,1533805015,148111401, 1533844900, 204603408, 1533888651,1533955814,1534034750,1534099496,229965843, 1534116319,1534153815,1534247927,1534313447,433225759, 1534369189,1534428479,4653138, 1534492748, - 1534525496,254591403, 1534565798,4997227, 1534853179,1534885898,1534902288,340280780, 1534919147,1534952820,1535008167,31801356, 1535103112,1535131717,372949094, + 1534525496,254591403, 1534565798,4997227, 1534853179,1534885898,1534902288,340280780, 1534919147,1534952820,1535008167,31801356, 1535103112,1535131717,372949094, 1535164432,1535180842,1535197215,1535213570,56049674, 1535237544,1535344694,1535377492,1535417769,1535590431,1222787084,1535606843,1535641537,1535696298,1535754256, 1535770662,520388629, 1535794603,1535902167,1535934520,267994713, 1535967238,7095351, 1535983675,1536023980,618446850, 1536081935,457539586, 1536105901,1536181238, 108317355, 1536213058,124862959, 1536245984,1536281144,110215275, 1536312838,1536368046,1536528339,1531256239,1536581040,1536688150,1536704524,9388058, 1536728497, 1536820649,1534099487,1536853129,124863462, 392265744, 1536908722,1537056179,1222787103,1537138100,1537277964,154469161, 1537294429,1537343510,1537359888,1537376268, 588742725, 1537394466,1537425420,1537441891,1158283286,1537475756,718962795, 1537525498,1537564085,154796523, 1537606544,1537638419,970342422, 284918705, 1537654824, 1537671187,51036162, 1537695158,1537950297,1537982490,302989341, 1537998867,27624900, 1538015808,460406843, 198721539, 1538055607,349765647, 1538131031,1538180697, - 1538235832,1538277388,1293369451,254427148, 1538301369,1538408460,444989466, 501548945, 1538432442,1538655241,1538687007,173703697, 1538710971,1538773772,44253241, + 1538235832,1538277388,1293369451,254427148, 1538301369,1538408460,444989466, 501548945, 1538432442,1538655241,1538687007,173703697, 1538710971,1538773772,44253241, 1538819524,1538850831,2198270, 188105243, 1538868137,1538923964,110300994, 1538989501,358106035, 1539145865,1539162117,8175618, 1539178591,1539228183,1539260472, 1539293213,20365323, 1539309622,347635731, 15073301, 96026739, 1539513791,1539743168,1539801125,1539817524,65880085, 47120412, 1539857857,1539964940,1539981419, 1540020265,958726150, 1540063863,1540096022,7176220, 1540120002,1540185539,1540423994,1540464068,1540539288,4685861, 1540595125,1540636753,1540669548,1540704169, @@ -3051,13 +3046,13 @@ static const unsigned int DictNodes[84251] = 30392454, 8396242, 204718304, 1542905299,300581380, 1542997664,1543036372,260456915, 1543127096,1543160751,1543225783,1543258154,1543274508,2965506, 1543298517, 1543405605,1543421990,1543438348,1543461037,1543505859,1543560662,967753743, 3211709, 1543626199,1543706313,1543753478,1544209438,147423234, 1544248792,1544429017, 1544519702,160694303, 1049673730,1544543706,1544634394,433815588, 1070417241,1544652603,1544699970,23855211, 27246630, 203572553, 1544732710,1544749976,1544798234, - 899498431, 1544822235,1083153884,346488889, 1544969693,1545077913,45465619, 1545126780,1545177470,162971664, 297418754, 1545243322,1917864, 522470209, 210272282, + 899498431, 1544822235,1083153884,346488889, 1544969693,1545077913,45465619, 1545126780,1545177470,162971664, 297418754, 1545243322,1917864, 522470209, 210272282, 1545312206,153191160, 1545356857,1545461214,1545602287,63979522, 251953627, 1545633884,1545666599,1545699338,1545715754,1545732098,241844262, 1545756127,1545961553, 1545994731,1546027101,1546083808,307134469, 1546165729,1546226590,1546277805,260063275, 1546338788,1546387462,1546411490,1546477027,1490550865,1546558948,1546633237, 1546650996,1546706405,17432616, 1546771942,1546903015,1112080471,441139256, 1546964491,1547075677,1547124746,1547141151,1547157523,647626764, 652771959, 1547181544, - 1547361769,7307270, 8389485, 1547436063,1547452454,252706856, 1547469159,1547509226,1547599926,1547633185,1547681811,1547698198,1547714586,1547730956,51068959, + 1547361769,7307270, 8389485, 1547436063,1547452454,252706856, 1547469159,1547509226,1547599926,1547633185,1547681811,1547698198,1547714586,1547730956,51068959, 1547754453,319555894, 1547796482,214679563, 1547820523,1547961250,1505706005,308133919, 1547993518,162187002, 1548049900,1548180973,6373836, 1548239391,1548295662, - 1490504363,115294294, 1548410351,1548705264,1548846935,1548914013,1269597174,1548993452,1549065713,1505624075,1549142704,299794434, 1549196786,29327755, 315588614, + 1490504363,115294294, 1548410351,1548705264,1548846935,1548914013,1269597174,1548993452,1549065713,1505624075,1549142704,299794434, 1549196786,29327755, 315588614, 1549295091,1549369360,3001601, 1549393396,296354233, 1549500462,319619098, 1549549614,1549598762,611450896, 508608599, 1549622773,1549828188,7962627, 1549860867, 1549877279,1549894208,291112003, 153191921, 1549926402,47251572, 1549944692,402128902, 1549975634,1550015990,6438927, 1550074108,1550114295,1550294520,1550386535, 19252616, 109052816, 1550452310,1550520399,1550582285,1550630938,51855366, 1550647308,1550663690,7733302, 1550680978,1550729259,1550762871,1550794763,1550811152, @@ -3068,74 +3063,74 @@ static const unsigned int DictNodes[84251] = 1552842859,868253717, 1552883199,1553076632,1553154076,55328808, 1553178112,1553260033,1553370988,1257455618,1553418105,1553465354,131940354, 1553489410,1553653251, 291111351, 1553762193,618233892, 1553800708,291110951, 1553893720,170803695, 383565843, 1553959727,1554057588,1554120726,6209538, 730678587, 1554137968,1554186297, 1554203817,1554243077,1554603526,5177384, 1554727358,1554800135,1554857994,389136468, 1554877134,1554989094,20365350, 1555005479,1555039692,115474443, 1555078664, - 1555169336,1555202114,45039645, 1555240753,463684517, 1555287196,1555333547,2359825, 1555365972,110248035, 1555406345,1555579816,1555611691,2932786, 131303210, + 1555169336,1555202114,45039645, 1555240753,463684517, 1555287196,1555333547,2359825, 1555365972,110248035, 1555406345,1555579816,1555611691,2932786, 131303210, 1555644475,1555677210,1555693584,2998300, 1555710553,423034891, 1555750410,168017932, 1555825547,1555897867,917325039, 258376359, 1555996172,1556119583,1556139169, - 1556168770,1556201493,1556217877,1556234252,1556250634,1556267045,1556283394,1556299791,87048223, 1556316463,1556351435,1556399042,131892427, 1556431774,381550623, + 1556168770,1556201493,1556217877,1556234252,1556250634,1556267045,1556283394,1556299791,87048223, 1556316463,1556351435,1556399042,131892427, 1556431774,381550623, 1556471309,1556717070,1556793204,77709324, 1556825339,1556874081,1556906015,1556922389,72368131, 1556945561,1557005048,1557038249,323732374, 741474307, 1557069830, 1557088939,8392202, 1557126671,291177462, 119636022, 1557208592,2146880, 740556839, 6438915, 1557332414,222101609, 285344777, 1557397588,1557432356,1557479854, - 1557529057,1557579795,1557626882,2326585, 1557650961,302448724, 1557732882,1556709905,1557847571,8392751, 1557978638,1558053897,1558093332,1558169136,59801626, + 1557529057,1557579795,1557626882,2326585, 1557650961,302448724, 1557732882,1556709905,1557847571,8392751, 1557978638,1558053897,1558093332,1558169136,59801626, 1558201582,1558237504,287572966, 1558283111,1558322709,1558563414,860423954, 48676886, 1558615186,207489707, 272155043, 1558708683,1558758639,1558791089,1558822940, - 1558839308,367444008, 1558856217,1558928918,247531438, 1559019988,1559052310,402128908, 1559074874,1559216235,1559248902,86327317, 1559265334,890437691, 5325560, + 1558839308,367444008, 1558856217,1558928918,247531438, 1559019988,1559052310,402128908, 1559074874,1559216235,1559248902,86327317, 1559265334,890437691, 5325560, 154043844, 1559298649,133546910, 1559338519,1559527462,131891212, 622182412, 1559543810,30834695, 1559560194,1559584280,1559633433,1559743311,1559789652,1559830042, 1559920656,1559937064,1559953419,1559969804,205209638, 1559986207,1560002597,557465616, 44613642, 1560019379,1560051722,1560068102,1560084482,233734201, 1560100923, - 1560133689,1560150047,509558805, 1903873, 1560167428,1560239643,1560300388,689799697, 1560383538,1560478171,1560510965,1560544145,1560598436,1560642383,273957909, + 1560133689,1560150047,509558805, 1903873, 1560167428,1560239643,1560300388,689799697, 1560383538,1560478171,1560510965,1560544145,1560598436,1560642383,273957909, 1560677638,1560747548,1560838182,1560862237,1560993310,1560543308,1561042463,1561084447,291160066, 1561133099,1561165926,379256834, 198672394, 1561206304,1561353761, - 1561412431,1561447142,131891231, 112934996, 1561509919,276529189, 1561533986,1561642014,1561674265,1561746393,246464551, 1561805315,1561861667,1561935888,73187369, - 1561952285,1561968646,1561985061,7602195, 1562001474,79560746, 1562230787,1562247302,52805655, 1562271269,1562629444,1562711641,1562771468,1562787850,310558742, + 1561412431,1561447142,131891231, 112934996, 1561509919,276529189, 1561533986,1561642014,1561674265,1561746393,246464551, 1561805315,1561861667,1561935888,73187369, + 1561952285,1561968646,1561985061,7602195, 1562001474,79560746, 1562230787,1562247302,52805655, 1562271269,1562629444,1562711641,1562771468,1562787850,310558742, 1562804715,1562844710,46120972, 1562918981,340672517, 1562959399,1563017332,1187282956,1563040409,1563099146,468287516, 192200742, 1563121075,532545558, 1563197468, - 141836328, 1563221544,508608578, 1563297813,52625414, 1497891247,1563329359,1563361326,1563411287,1563443205,1563460059,1563500073,1563560369,21102604, 468206501, + 141836328, 1563221544,508608578, 1563297813,52625414, 1497891247,1563329359,1563361326,1563411287,1563443205,1563460059,1563500073,1563560369,21102604, 468206501, 1563614762,1563721754,265797651, 1563738138,210880178, 1563754562,1563794987,367591429, 1563967595,1294958621,2195771, 499384351, 1917009, 141414562, 1564007980, 1564147769,1564164546,1564196948,1564229738,1564312687,421856246, 1564352045,1564393474,242466842, 1312243718,1564417582,1564466735,1564548656,1564606486,1564622925, 1564656741,1564712497,1564809987,1564854358,1564917782,794673753, 1564935355,1489322896,366903839, 1564985209,1565034385,1565065643,19038227, 1565098186,1565138482, 1565466163,1565507643,501383206, 1565540787,1495449616,1565574949,1565622690,177340479, 1565658584,254591510, 1565704610,1565744692,1144455249,1565835743,1565868913, 1565924917,1566031938,1566070713,30457910, 1566130594,1566163378,188940319, 1566203446,1566277739,271876115, 1566318135,25560138, 1566432824,110723083, 1566541288, 1536001033,1566596665,1566654486,6701067, 1566671298,1566703638,306151435, 1566720892,1566588947,1566776890,1566852002,1566891579,1566949414,1566965776,1566982170, - 1566998538,1567014924,1567031302,233734149, 1567047732,1567088188,140248866, 1567350333,1567391746,1567408166,82559016, 1567432254,1567541193,1567589523,7258688, + 1566998538,1567014924,1567031302,233734149, 1567047732,1567088188,140248866, 1567350333,1567391746,1567408166,82559016, 1567432254,1567541193,1567589523,7258688, 1567625410,1567670310,118882370, 1567687803,1567727167,1567803775,6373457, 3211759, 1567874624,1568005697,1568096258,1568120386,1568194572,1568211001,1568227330, 163020826, 1568243752,1568260122,1568276501,119357941, 1568292918,3211696, 1568333379,1568442466,1568489510,916193290, 1568513604,285344139, 1568579141,1568636938, 1568653787,1568688582,1489264198,1568775751,1568835770,1001717772,1568874056,568623633, 1568931842,1568948903,323010572, 1568981051,567103845, 1569021513,1569341931, 1569381962,1569544907,4407362, 1569603653,1569644107,1569702125,885555639, 1569742412,1569807949,163823642, 1569889870,1570018221,320719281, 383467541, 1570086479, 1570146490,1449181213,52822037, 1570184784,1570266067,1570315857,1570378832,1570430546,1570654102,1570701324,1570720732,1570767810,1570800051,1570840147,1568019212, 1570938452,1570979856,290996236, 1570997071,1571029019,1436517338,1571069525,1571226967,905118543, 307855391, 51118111, 1571282518,1571358163,1571405883,1571438602, - 141787164, 1571462743,1571593816,117407746, 425362320, 1571635259,131878502, 1571675737,1571816271,487965617, 1571848213,1571864592,1571880970,1571899058,115720481, - 1571937882,1571996841,1572031201,1572127954,1572160033,8390682, 1572216411,479133699, 1572274207,1206633481,1572298332,1572388880,15073285, 1572405365,126435349, + 141787164, 1571462743,1571593816,117407746, 425362320, 1571635259,131878502, 1571675737,1571816271,487965617, 1571848213,1571864592,1571880970,1571899058,115720481, + 1571937882,1571996841,1572031201,1572127954,1572160033,8390682, 1572216411,479133699, 1572274207,1206633481,1572298332,1572388880,15073285, 1572405365,126435349, 1572438075,1572478557,1572667402,286244895, 1572684321,1572732949,1572749338,585580575, 1572765701,56049680, 172621826, 1572782089,77774980, 6947041, 1572800995, 760905768, 514801666, 1572839006,1573011492,1573028766,1573060614,1573076993,1573093510,29720599, 59817993, 1573109876,168329225, 1573129162,1094959125,1573166687, 766640164, 142180371, 1573232224,1573625442,2146607, 1573740131,1573789284,1573918020,1573995717,1574049055,1574127150,1574182501,1574313574,1574377688,1574421025, - 1574470487,15056902, 1574510183,149130799, 1574624872,1574717869,1574770500,1574846917,1574880459,81166376, 1574913033,1574946923,1574993957,140247343, 67059724, - 1575015225,1575083625,1575190627,760946282, 1575223355,1575256070,32686214, 1575280235,5326139, 1575345772,1501151254,1575519262,1575551661,1575600617,274513931, + 1574470487,15056902, 1574510183,149130799, 1574624872,1574717869,1574770500,1574846917,1574880459,81166376, 1574913033,1574946923,1574993957,140247343, 67059724, + 1575015225,1575083625,1575190627,760946282, 1575223355,1575256070,32686214, 1575280235,5326139, 1575345772,1501151254,1575519262,1575551661,1575600617,274513931, 1575657069,1575715351,254591455, 1575755374,2359334, 803651622, 1575846411,2179204, 1575902831,347635738, 1576026114,4341766, 1576042967,1576080116,1576140810, - 802963462, 1576157243,1576197744,1576258201,1576328817,232079391, 1576403028,1576443506,1576509043,1576623732,1576681531,110215275, 622182412, 1576714699,131891307, - 131891671, 1576767078,1576801573,1576845355,1476889259,1576885877,1577148022,392217011, 1577206219,1497399315,1577254918,1577279095,1444052994,1577327545,740491348, + 802963462, 1576157243,1576197744,1576258201,1576328817,232079391, 1576403028,1576443506,1576509043,1576623732,1576681531,110215275, 622182412, 1576714699,131891307, + 131891671, 1576767078,1576801573,1576845355,1476889259,1576885877,1577148022,392217011, 1577206219,1497399315,1577254918,1577279095,1444052994,1577327545,740491348, 1577402384,1173635149,1577418754,48545818, 1577442936,1577522854,1577566230,357597224, 1577584218,1577615386,1577631781,1555726338,1577655929,1577819770,1577910288, 1114169, 1577934459,1577549880,1577983612,1578043386,144098278, 1578074124,430014490, 1578098301,8392562, 1578327678,1578435614,611074074, 315688913, 1578471829, 1578524287,2146795, 302678047, 1578631190,15351839, 1578648660,1248034828,1578704512,1578786433,1578876965,1578893314,1578909725,645693452, 1578926383,1578958854, - 1578975253,1578991632,1579008026,1579024415,89063430, 1579040808,1289617414,1579057164,50511898, 1579079185,1579127251,194084902, 1579196034,1579253797,351010818, + 1578975253,1578991632,1579008026,1579024415,89063430, 1579040808,1289617414,1579057164,50511898, 1579079185,1579127251,194084902, 1579196034,1579253797,351010818, 1579270175,51642378, 1579294339,1579434006,1579451215,1579484972,1579532647,1579565068,1579581466,1566884258,1579598303,1579630604,1010582492,1579654788,1579975838, - 131268692, 45760514, 1580048005,1580105734,110232776, 1580129926,1580172457,1580211847,1580337687,575209508, 1580403841,1580457608,1484112175,1580532206,162187116, - 1580564511,1580581897,1580613935,1580654217,1580736138,1580892176,126615580, 501563499, 307235593, 1580910794,922288214, 1580965515,1581056006,1581072406,457539596, + 131268692, 45760514, 1580048005,1580105734,110232776, 1580129926,1580172457,1580211847,1580337687,575209508, 1580403841,1580457608,1484112175,1580532206,162187116, + 1580564511,1580581897,1580613935,1580654217,1580736138,1580892176,126615580, 501563499, 307235593, 1580910794,922288214, 1580965515,1581056006,1581072406,457539596, 1581088780,146456618, 1581105154,1196043, 1581129356,421773322, 1581194893,1581367975,287244310, 8392239, 1581407886,208404490, 508330498, 167903298, 1581483475, 1581532783,1581580325,64765957, 687996994, 1581596717,1581629442,112608065, 1581647134,188104803, 1581694987,131268692, 1581713894,1581751951,1581941237,1581973526, 1581990347,191906552, 68239406, 1582046864,204537859, 1582121814,1582170114,1582194321,1582259858,596131876, 1582317580,1582333962,1528922141,1582358163,1582448740, - 260456494, 1582481711,2801674, 1582517001,1582563394,1582596117,1027620870,1582613082,1582648741,1582734996,931332102, 182419477, 1582825484,446955546, 541346564, - 1582841964,1582874646,50462722, 1582891068,1582980757,157188152, 783925250, 1583153157,1583169538,1583185957,1583202306,1583219495,1583235077,1583251458,7602213, - 1583268323,1583300618,292110367, 1583317002,1583333808,1583368771,399425548, 253285386, 1583423126,1583530005,1583554199,172621830, 1583596151,737902608, 474399399, - 1583636120,1583923500,160727046, 55263244, 1583957854,1584029337,586612748, 1584087092,2196042, 1584119836,1584136204,3178522, 1584152635,1584185443,2834514, + 260456494, 1582481711,2801674, 1582517001,1582563394,1582596117,1027620870,1582613082,1582648741,1582734996,931332102, 182419477, 1582825484,446955546, 541346564, + 1582841964,1582874646,50462722, 1582891068,1582980757,157188152, 783925250, 1583153157,1583169538,1583185957,1583202306,1583219495,1583235077,1583251458,7602213, + 1583268323,1583300618,292110367, 1583317002,1583333808,1583368771,399425548, 253285386, 1583423126,1583530005,1583554199,172621830, 1583596151,737902608, 474399399, + 1583636120,1583923500,160727046, 55263244, 1583957854,1584029337,586612748, 1584087092,2196042, 1584119836,1584136204,3178522, 1584152635,1584185443,2834514, 1584225946,1584283885,1584317017,1584353122,1584414756,1584431107,1584447494,747356181, 1584463931,1584497111,1584530236,1584578572,571211786, 1584595489,1584651931, 1584709673,1584726132,64356370, 1585284326,1585389213,112771100, 742850576, 1439453682,1585545222,1585561616,1585577995,115589135, 1585594389,1585610844,1585643531, 156237840, 1585659916,110723082, 1585684126,217808934, 305709087, 1585862561,792281128, 1585889301,51920922, 1585905748,1525104666,1585938447,55869466, 1585955696, 1586006711,1586053135,1586069535,1586085909,552452098, 1586102283,1374584834,1586120311,1586184221,1586200616,1586216966,212877333, 1586233346,420757542, 1586257567, - 1586315724,1586348042,1586364447,1586381685,1586413580,1586429978,56721414, 104759521, 1586446807,1586479133,2129943, 1586495493,1586511913,1586528386,884778, + 1586315724,1586348042,1586364447,1586381685,1586413580,1586429978,56721414, 104759521, 1586446807,1586479133,2129943, 1586495493,1586511913,1586528386,884778, 1586544978,1586577523,641531927, 1586593834,231325828, 1586610197,1586626571,1586643081,2130051, 1586659346,1586675828,1586692133,1586708509,1586724980,1586741263, 908960, 1586758514,1586790537,1586806812,49496101, 1586823283,884873, 1587273377,1529839668,1587371682,1587584675,1587715748,1587773499,344391746, 1504265192, 1587806667,1587863205,1587941172,1588020140,521110359, 1588088797,1588123297,1588200478,1588232235,1588272806,1588428806,1588445190,1005387792,393969692, 1588469294, - 1588518567,1588609045,1588625424,1588642601,1588675425,450543622, 1588707435,114245653, 1588740162,1588772924,1588862632,3260500, 1588928169,1588977322,118030390, + 1588518567,1588609045,1588625424,1588642601,1588675425,450543622, 1588707435,114245653, 1588740162,1588772924,1588862632,3260500, 1588928169,1588977322,118030390, 1589026475,1589092012,1589133338,1589149727,1589166090,1589182485,542048278, 1589206701,1589452462,1589575719,1589608507,1589649071,1589763760,1589828845,1589976753, 1590055048,1590088226,1590166697,1590198277,1590215131,1590247460,134709259, 1590265793,860425427, 1590320818,1590446636,119080164, 1590476843,195919878, 1590509627, 1590550195,116703242, 1590690280,327532768, 1590723512,539656232, 1590773055,1590837259,1590853716,1590888670,602161158, 1590935636,1249559675,1590968750,1591022587, 1591070807,1591115778,1591132179,259751967, 1591149507,1591198694,1591238324,1591467701,1591590928,52674600, 1591607790,46088229, 1591640130,147406955, 1591680694, - 1591590914,1591809269,136118749, 1591902246,1591918594,140247942, 1591942839,594771987, 52576293, 1591986755,1592041144,1592181616,112935759, 1592229929,182386700, - 1592246575,1592279277,1592312979,1592352441,2408459, 229965845, 362545158, 1592475679,133660693, 1592492063,1592508479,1592549050,1592696507,1234534454,733102092, + 1591590914,1591809269,136118749, 1591902246,1591918594,140247942, 1591942839,594771987, 52576293, 1591986755,1592041144,1592181616,112935759, 1592229929,182386700, + 1592246575,1592279277,1592312979,1592352441,2408459, 229965845, 362545158, 1592475679,133660693, 1592492063,1592508479,1592549050,1592696507,1234534454,733102092, 1592827580,1592876733,1592950814,1592983607,1593049186,1593081912,1593115051,1593147452,1593229323,6373421, 1593247564,1593319102,1593443620,1593491458,1593508785, 1593548479,3244553, 1593639513,1593671690,119816251, 1593688171,1139359765,1593720878,1593777856,638484508, 1593835539,131825710, 5308843, 1593769995,1593852834, 1593892545,1594089154,533544991, 5316291, 1594213668,357793804, 1594263767,292225451, 1594311097,1594367684,152289301, 1594458571,1594507323,1594544131,1594654804, @@ -3150,21 +3145,21 @@ static const unsigned int DictNodes[84251] = 1600766044,2998288, 1600798774,1600833323,1600865920,1600913711,1600946244,2850852, 1601330920,450543645, 1601461993,1601601542,1601619144,1601650718,1601691370, 115785744, 1601800880,1601855211,1602166508,1602256955,184041526, 1602297581,1315315438,1602406414,500678677, 1602458664,1602519067,1602551834,116376090, 1602568218, 1602584635,1602618106,1602650178,3212190, 1602682926,1602732070,1602748445,1602764866,1602798039,730251944, 1602830478,1602863641,1602929654,1602961867,1603011882, - 1603067631,541851717, 1603158487,1603192377,1603297008,1603378917,384811445, 18596755, 1603444465,1603584046,72368138, 1603633154,362659855, 1603649567,139483806, + 1603067631,541851717, 1603158487,1603192377,1603297008,1603378917,384811445, 18596755, 1603444465,1603584046,72368138, 1603633154,362659855, 1603649567,139483806, 1603665973,1603698779,1603731515,1603772146,5308446, 1603945528,1604009986,138199050, 1604034291,1604340437,49938463, 1604386828,117506549, 659292244, 1604411124, 1604517900,1604534282,258637834, 1604553693,1604607733,184025131, 1468957843,1604681794,1604714583,1565655467,1604763732,177046681, 1604800370,3245231, 1087095255, - 1604846049,1604894722,1604913124,1604944409,1605010353,1605042232,127042011, 1605080608,6620081, 1605143497,1605190545,1605246710,1605322035,57032706, 175784028, + 1604846049,1604894722,1604913124,1604944409,1605010353,1605042232,127042011, 1605080608,6620081, 1605143497,1605190545,1605246710,1605322035,57032706, 175784028, 1605369953,1605436730,1605485458,1605533783,1605590775,1605681832,345702894, 1605721848,1605795947,2130008, 1605828714,119997738, 1605913558,8396537, 1605983994, 5308842, 1606041622,1606058050,503316622, 1606098683,1243726425,1606221870,144621573, 1606278908,1606426365,1606490825,1606549606,1606582575,1606615050,1606631500, 1606667222,149134099, 1606729831,1606819582,1606861647,536887317, 119799890, 1606893606,1606910254,207274000, 1606950655,1607090207,1198063635,586285078, 1452212539, 1607114496,1607327489,116211793, 1607418703,1607450848,1607483476,1607524098,1607630931,1607712794,1607729168,1607747059,1607786243,613548075, 1607894117,1607942187, - 1607977924,202801611, 1608032004,1435516961,1608106443,1608155447,1608204298,376717338, 1608220682,19267626, 1608237515,1608291624,1608335441,1608368144,147423247, + 1607977924,202801611, 1608032004,1435516961,1608106443,1608155447,1608204298,376717338, 1608220682,19267626, 1608237515,1608291624,1608335441,1608368144,147423247, 1608386164,386711554, 1608466472,1608483275,280446063, 1608539909,1608883974,1609057218,338133073, 1609089077,293781520, 1609121879,382588932, 1609174415,1609236525, 1609277191,1609368756,1609424648,2113557, 1609597853,1609682821,2195745, 1609768713,238551569, 131334183, 1609941463,1609980809,344391746, 1610040652,1610137646, - 1610186811,1610227466,1610374923,1610435671,1610481770,1610571532,1610637069,1589019083,1610751758,1610800911,208995151, 1610893906,1610956866,1610997186,55132188, - 1075478962,1611055563,1611104266,1611122999,1611153474,1611186235,221806630, 1611226896,1611489041,133579785, 756286376, 1611580708,1611629798,1611726941,139198521, + 1610186811,1610227466,1610374923,1610435671,1610481770,1610571532,1610637069,1589019083,1610751758,1610800911,208995151, 1610893906,1610956866,1610997186,55132188, + 1075478962,1611055563,1611104266,1611122999,1611153474,1611186235,221806630, 1611226896,1611489041,133579785, 756286376, 1611580708,1611629798,1611726941,139198521, 222085229, 1611783954,1611865875,1611947796,1612111637,166051869, 242647050, 1612169226,5308504, 1612185742,317836096, 1612218470,1612253572,5310967, 1612324630, - 1612382227,1612398594,1612414987,122568719, 1612431466,1612514268,1612546085,110215600, 3866711, 1612564590,153190839, 1612635927,153748510, 1612767000,987447723, + 1612382227,1612398594,1612414987,122568719, 1612431466,1612514268,1612546085,110215600, 3866711, 1612564590,153190839, 1612635927,153748510, 1612767000,987447723, 49496074, 1612865305,582828499, 1613037675,1613078298,1613119490,47546383, 30392361, 988495884, 1613143835,1613405980,1613513651,1613545494,1613565011,1613635357, 221806608, 2196690, 5327334, 1613750046,697860122, 1613831967,1613890590,1613930272,167445308, 1613988749,1614070879,319815917, 1614143265,5325275, 1614315604, 1614349676,1024754576,1614446631,1614479371,973307916, 1614496798,1614536482,168232265, 1614615018,1614662064,400031774, 1614710079,1614777097,1613087646,1614826218, @@ -3172,13 +3167,13 @@ static const unsigned int DictNodes[84251] = 1615724570,1289469958,1615741419,1615775499,1615863591,6733840, 1615923951,1615986694,50806822, 1616011048,1616052226,1195803913,1616068911,1616101483,1616134230, 1616169146,1616199787,1616232927,1616273193,1376518230,1288750429,1616445450,1616461866,1616479036,1223720982,1616528729,1616561140,1917799, 1616617258,1616708063, 1616740457,1616774901,1616822302,1616855066,1616874642,1616921990,57032715, 1616988677,1617035865,1617070015,1617174315,137085380, 1617289004,1617379384,1617413006, - 1617485613,352403468, 1617642364,1617698606,1617764143,323650015, 1617920075,1617993520,1618059050,1618149469,1618206513,502071322, 1618378859,1618413346,184025147, - 1618444307,1618460694,52330534, 1618478885,1618526292,4751372, 1618558988,1618575370,467042326, 1263190103,1618599730,1618730803,1618837963,1618887764,566641573, - 1618936267,1618992948,1619067348,1619107637,1619263569,1619304246,1619369783,1619493804,1489540112,1619566392,1619645133,1619722278,194789435, 1619739848,387006545, + 1617485613,352403468, 1617642364,1617698606,1617764143,323650015, 1617920075,1617993520,1618059050,1618149469,1618206513,502071322, 1618378859,1618413346,184025147, + 1618444307,1618460694,52330534, 1618478885,1618526292,4751372, 1618558988,1618575370,467042326, 1263190103,1618599730,1618730803,1618837963,1618887764,566641573, + 1618936267,1618992948,1619067348,1619107637,1619263569,1619304246,1619369783,1619493804,1489540112,1619566392,1619645133,1619722278,194789435, 1619739848,387006545, 1619779385,52822038, 934838324, 1619877690,176423759, 1619968430,1620025147,1620295773,2129947, 168234845, 1620344931,1620385596,1620443373,1620475958,1620509143, 1620541527,1620592593,1620639803,437404327, 1620680509,1620787216,161726469, 1620804467,1620886639,1620919569,1620967436,1620984482,1621023161,935134380, 1621090110, 1077755925,1621180719,51855397, 1621221183,1105871148,1621475928,1621508856,1621540866,17842390, 158811565, 1621565248,1621606412,1621622876,1621657362,1621712705, - 91193474, 1621875863,1621942082,1622099369,1622133093,1622181666,1622213570,7734525, 1622249826,17219688, 1622311957,1622360483,244170771, 1622392891,440746010, + 91193474, 1621875863,1621942082,1622099369,1622133093,1622181666,1622213570,7734525, 1622249826,17219688, 1622311957,1622360483,244170771, 1622392891,440746010, 336659192, 1622433603,7454756, 1622605845,513998874, 1622622324,1622638634,273924117, 1622655017,114343937, 1949715, 1622679364,1622721591,1622753321,1622773245, 2132129, 1622806052,1622851586,7372806, 1622875973,1623359625,884751, 1623383878,1623671384,1623707503,1623777095,1623932940,1623949601,1623984244,1624052755, 1624113162,166314026, 1624134634,1624195084,137543904, 1624219464,1624252233,1624314264,1624391786,1624481610,1624604702,1624645451,1624735790,1624792908,1624867831, @@ -3187,12 +3182,12 @@ static const unsigned int DictNodes[84251] = 591609868, 117752283, 1626473461,1626538615,1626578773,172819111, 1626611542,1626821098,1626873687,1626988286,1627029963,1627079465,237682747, 1627111713,1627152216, 467320891, 1627209787,1627243305,1627278529,1627332441,1377387110,3867051, 1324613651,1627422813,1627471956,3212399, 1627505983,1627571041,1627602970,1627619394, 1627653010,1627702383,1627739772,1627963993,649922159, 1628004186,120143912, 1628132108,813039632, 1628176396,1628192867,456917980, 475955210, 1628225623,1628275521, - 1628308303,158812739, 1628340290,2933219, 1628373004,1628389391,1628406339,594837516, 1628446555,565608458, 1628766238,1502347286,1628806460,1628865789,510181432, + 1628308303,158812739, 1628340290,2933219, 1628373004,1628389391,1628406339,594837516, 1628446555,565608458, 1628766238,1502347286,1628806460,1628865789,510181432, 1628897364,1628930478,380600791, 1628980148,1629052764,1629145379,1629192197,1629209035,71483418, 1629257870,1629298525,161726521, 1629462366,1629527903,1629586920, - 1629639688,1629683722,94126122, 1629700142,1629749274,158502481, 1629765716,1629798410,1629814803,47611920, 1629839200,1629995037,1630011404,1630027778,164036637, + 1629639688,1629683722,94126122, 1629700142,1629749274,158502481, 1629765716,1629798410,1629814803,47611920, 1629839200,1629995037,1630011404,1630027778,164036637, 1047561225,148799540, 1630052193,1630297954,1630437403,1630471576,1630522652,266765935, 1630585143,1630635082,1630670894,1630751765,1630830621,1630855011,1630945306, 208667056, 291110964, 1630963647,140247096, 399966240, 1631064160,4751376, 1631117156,1631207434,1631231047,1631305766,1631322114,1631338517,1631356223,1631420447, - 1631436811,1631453487,1631486583,1631519632,118948267, 1631551542,1631592186,1631650329,1631723365,1631813634,1085276631,1630601246,1631830062,1631879178,110215200, + 1631436811,1631453487,1631486583,1631519632,118948267, 1631551542,1631592186,1631650329,1631723365,1631813634,1085276631,1630601246,1631830062,1631879178,110215200, 1631903590,1631969127,1632011173,563347459, 1632051048,1632208917,1632241582,1632280425,1632339019,1632407462,19038229, 1632452662,46710810, 1632485416,1632502734, 1632542570,1632617295,1632649318,1632690027,1482293286,1633001324,1633126276,1633194008,1633239061,1633255426,1633271818,789921821, 1633289277,1633353734,1633370133, 1633386508,114114586, 1633408819,1633468529,1633517578,1633533980,48529420, 1633558381,1501906955,1633634983,1633681515,1326202909,193953804, 1633714861,1633771374, @@ -3200,7 +3195,7 @@ static const unsigned int DictNodes[84251] = 124239898, 1634475891,1634615833,1634680916,784990229, 1634715878,1634763054,1634803572,306529089, 1634869109,1634993090,1635027681,1635124790,351911958, 1257554379, 1635173185,1635213174,1635409783,1425702994,3212073, 278167776, 1635491704,1635573625,115720219, 8393141, 1635655546,1635729867,1635778666,498732966, 1635862549, 59359263, 1635893258,25559479, 1635917691,1635999612,1399472140,3686436, 1636157670,1636205614,1636278141,1636581382,1636597797,8994847, 1636622206,1636712706, - 1636745355,8392761, 1636785476,1636851583,322846746, 1636958881,6374278, 170803424, 1637015424,813679352, 1637105686,1637130113,1637187630,1637236762,427902721, + 1636745355,8392761, 1636785476,1636851583,322846746, 1636958881,6374278, 170803424, 1637015424,813679352, 1637105686,1637130113,1637187630,1637236762,427902721, 1637261186,1637402963,2015258, 2834735, 1637450187,1637498986,1298907243,1637580826,19038229, 1637601521,136120952, 1637670787,752550389, 1637801860,1637877990, 1637930191,7733355, 1638024699,13549574, 1638072857,1638145925,1638318179,1638351151,1638383672,1638424454,1638597059,56655914, 1638629405,1638647013,1638727739, 871792697, 1638768519,121339942, 131334210, 1638829307,190644283, 242729011, 193200159, 1638924372,1638957082,1638973469,1187333353,1638989862,1639006237,1639030664, @@ -3210,7 +3205,7 @@ static const unsigned int DictNodes[84251] = 1640973206,24298434, 1641021506,1641055017,351338527, 1641087435,1520061197,52756501, 1641136587,1554989096,1641185802,1641226129,1641340818,1641418706,1257556272, 3867542, 25559147, 1641481272,404636131, 1641546488,1641581514,1641612624,1641660500,1080984066,1641693214,1641728500,1641783187,10649652, 1642037341,1642086422, 1642106961,1642152029,1571667995,118685725, 1642204849,1642267384,1642303218,1642371997,1642414139,1642454932,1642528778,1642553237,3228481, 1642733462,1642774554, - 808239114, 769785915, 1642798999,1642930072,1643054008,1643110297,1643252212,185319450, 1643306906,1643560966,351911942, 1643579790,231817226, 1643644462,888143884, + 808239114, 769785915, 1642798999,1642930072,1643054008,1643110297,1643252212,185319450, 1643306906,1643560966,351911942, 1643579790,231817226, 1643644462,888143884, 1643692042,1643708951,1643743756,127565843, 1643831195,1643905070,1643955025,1644093340,1644199974,1644216374,1644257181,1644331062,1644371870,353239106, 1644421023, 1644576806,594853926, 1644601248,1644724236,118538242, 1644748705,490651664, 1644839391,1644872956,1645004121,1645035576,1645068328,45498406, 235438134, 1645092770, 1645158307,1645248568,115523606, 1645285104,1645365325,132792326, 385517428, 1196671863,1645453220,1645609503,138641839, 1645666213,173850640, 1645723694,1645780902, @@ -3220,54 +3215,54 @@ static const unsigned int DictNodes[84251] = 1647575081,1647591466,1647607829,144146454, 1647624727,1647659699,1647692177,1647746989,1647820805,1647837195,1227702314,17825813, 8257551, 94371880, 1647861678, 166068583, 1647951988,1647968293,1647984756,1648001064,1648017436,1648033795,1648050185,1648066690,1648083059,20971652, 1648101567,469205018, 115458074, 1648132146, 1648164875,1648181260,370999325, 886276127, 1648631728,1648803846,1648820311,1648877489,124403718, 1648951810,1648992178,1649182871,1649230742,1649287091,1649363316, - 99893286, 1649434548,1649543236,1649591640,1649640856,115589372, 1649688663,151732250, 1649737834,1649820562,1649868816,18153498, 1330200607,1649886217,25559106, + 99893286, 1649434548,1649543236,1649591640,1649640856,115589372, 1649688663,151732250, 1649737834,1649820562,1649868816,18153498, 1330200607,1649886217,25559106, 1459118005,332988453, 793051162, 1649918489,1649990426,1650065840,1650098235,1650139062,1650196501,1650213711,305087376, 1650245714,1650286519,1650417592,1650509297, 1650540628,1650574384,1650656857,1650705727,1650769951,1650786388,1650827193,1650950154,1650967003,1623949744,1650999378,1651034707,1651097707,1651138490,1651195906, - 1651212326,45645880, 1651228713,309723148, 1651245921,1651285947,1651482556,1651556895,1651605570,45645856, 1651638284,33391166, 1651654696,1651671046,27607046, + 1651212326,45645880, 1651228713,309723148, 1651245921,1651285947,1651482556,1651556895,1651605570,45645856, 1651638284,33391166, 1651654696,1651671046,27607046, 258637836, 1651687531,5603359, 1651720714,1651761085,1651952584,1652016023,177178484, 149127713, 589479955, 1652064277,1652081758,109019164, 1652137918,1652416447, 1652590603,1652654967,1652694579,1652736059,1652769713,1652801623,1633193574,1652850742,1652883985,1652916246,1652932629,1652949910,1653006272,501563418, 1653080524, - 6619896, 1917009, 1653120961,1653211439,1653252034,1653317571,1653441272,56557584, 1653481412,1302265913,1115998068,1653526092,1653571596,1653587978,789577730, - 1653606203,1653654164,1653694405,1653809094,1653965102,546357284, 448299048, 1653997652,1654030342,138575914, 1654046807,326369959, 1654104007,294633529, 126107684, - 385024993, 1654177858,1654210647,1654262051,1654317000,1654398921,1654562762,1654636620,2146386, 1654669849,1654734869,1654759371,1654980845,1655015283,45137958, + 6619896, 1917009, 1653120961,1653211439,1653252034,1653317571,1653441272,56557584, 1653481412,1302265913,1115998068,1653526092,1653571596,1653587978,789577730, + 1653606203,1653654164,1653694405,1653809094,1653965102,546357284, 448299048, 1653997652,1654030342,138575914, 1654046807,326369959, 1654104007,294633529, 126107684, + 385024993, 1654177858,1654210647,1654262051,1654317000,1654398921,1654562762,1654636620,2146386, 1654669849,1654734869,1654759371,1654980845,1655015283,45137958, 1655048250,1655111696,1655128156,1655161369,6882040, 1655226370,1655243274,1655275560,47546374, 1655291970,1655332812,48676892, 122683404, 1655407510,1655456577, - 859800027, 1655488567,1363574850,5325682, 1655554108,153747542, 1655644109,1655800240,138575894, 716193858, 1655833468,1655882167,1655915679,1655947765,421086049, + 859800027, 1655488567,1363574850,5325682, 1655554108,153747542, 1655644109,1655800240,138575894, 716193858, 1655833468,1655882167,1655915679,1655947765,421086049, 1655988174,25560119, 1656225868,268730394, 1656258572,73531449, 1656283087,1656373679,1656406487,383664149, 1656439247,1656471589,155025410, 1656487982,1656545232, 152059905, 1656594385,1656692690,1656799234,1656816955,1656849608,1656889299,153845862, 344539146, 6193168, 1657000038,56721430, 1657045295,5312322, 1657078705, 1657111062,313245698, 1657151444,1657200597,1657397206,160727056, 6127622, 1657528279,176784649, 421527578, 1657635116,1657667626,2605087, 1657692120,1006043167, - 1657782561,1657815096,5865898, 1657849417,1657929787,180666370, 1657970649,1658044475,1658077190,574930975, 1658101722,1658191903,1658208259,990806053, 116375584, - 150586571, 1658609628,1658700236,1658734869,208667074, 17006607, 1658814483,408174829, 1658832371,1658863626,1658882943,1658953693,1659232222,253624622, 609812564, + 1657782561,1657815096,5865898, 1657849417,1657929787,180666370, 1657970649,1658044475,1658077190,574930975, 1658101722,1658191903,1658208259,990806053, 116375584, + 150586571, 1658609628,1658700236,1658734869,208667074, 17006607, 1658814483,408174829, 1658832371,1658863626,1658882943,1658953693,1659232222,253624622, 609812564, 1659379679,1659438070,1659469908,126763471, 1659504689,1659602048,1659650091,1659690976,1659764795,1204830809,1659805665,1659880271,441712656, 1659915222,1659977769, 256819202, 1659994199,340265317, 1660043280,1660059872,1660100578,134840356, 1660198883,1660404140,1660469260,1660487836,1660534811,1660568984,1660617930,1660669838, 1660716784,1554120716,1660755940,1660985317,1661091852,233193510, 1661108236,1661127834,1661181926,1661241993,1661304842,257048617, 1661322136,1661370374,1661386773, 796525019, 1661403138,1661419619,1661453604,1661502473,1661542375,1661665802,1661698058,508727261, 1661714491,1661755368,1661829156,1661845975,393412620, 1661878338, 1661911061,1661927446,52576298, 1661944267,1661993993,1662033897,1662158899,1662205964,1662222412,1662263274,1662435344,1662451762,1662484482,2197973, 1662505227, - 1112932363,1662558187,1662648351,10829843, 136118577, 1662665150,1662738412,1662803949,1662912010,1662959675,658112514, 1663000558,1663049711,1663239466,242466837, + 1112932363,1662558187,1662648351,10829843, 136118577, 1662665150,1662738412,1662803949,1662912010,1662959675,658112514, 1663000558,1663049711,1663239466,242466837, 1663289460,1663353369,491831353, 1663418455,5325329, 1663475696,1663534471,5767199, 514883624, 1663574001,1663698269,1663746104,284786707, 180437030, 1663786994, 1663910488,1663942732,170803627, 1663976372,1664041807,1664075059,1664131059,1269940308,1664188456,1664204887,1664262132,1664304457,1664352285,1664369560,1664417818, 1664435068,1664483425,1664551216,181192132, 1664606197,1664868342,1664991264,1665027081,1665092375,1665159021,1665227328,1665273708,149667866, 1665327095,1665387261, - 1665434889,1665466905,404045886, 192200761, 1665533973,1665565217,1665614749,1665696652,1665745803,1665810954,1665851384,392217003, 1665900537,1666189338,416253340, + 1665434889,1665466905,404045886, 192200761, 1665533973,1665565217,1665614749,1665696652,1665745803,1665810954,1665851384,392217003, 1665900537,1666189338,416253340, 1666236438,1666260986,1666310139,1666433063,1666473499,1666532241,550862874, 6602767, 1666584487,151093274, 1666670588,1666715758,1666760730,1666777090,1666793487, - 1666809878,1666827925,1666891778,226050058, 1666908202,1666924847,1666957368,678805591, 1666990123,1025359882,1667030716,1037139980,119652655, 1667072012,119816663, + 1666809878,1666827925,1666891778,226050058, 1666908202,1666924847,1666957368,678805591, 1666990123,1025359882,1667030716,1037139980,119652655, 1667072012,119816663, 1667089228,1667145725,1667303300,1667371481,1667450931,1667497996,1667522558,1667760215,1667809763,1667842063,1667858470,130531330, 1126629460,1667875696,1667924044, 2523162, 1667956738,1667973220,45613071, 1668005904,2129942, 1668022702,307593324, 1668072024,5079147, 1668104218,1668120618,1668137392,1668170161,1668202799, 1668235274,764870710, 746602527, 1668252555,1668317194,918257692, 1668341759,643055627, 1668399141,1595490320,505380879, 1668423680,1668581154,1668620289,1668808720, - 1668825128,4079642, 1668841904,1668882434,1668931587,1427046410,1669087316,1669120084,1669153218,1669186139,2523159, 1669218320,1669234726,127796058, 175849484, + 1668825128,4079642, 1668841904,1668882434,1668931587,1427046410,1669087316,1669120084,1669153218,1669186139,2523159, 1669218320,1669234726,127796058, 175849484, 417300496, 1669251105,1669300316,1669341188,1669431779,1669468283,1669513311,1669562847,1669595138,71188490, 1669619717,1669726229,1669742628,36519942, 1669767174, 1669890071,106004503, 1669906954,1018912775,186417154, 1669939282,6374600, 1669972414,1670045704,1670152326,1670168605,1670184981,2130052, 1670201354,1670219962, - 80035956, 90112037, 1670251422,1670286571,246087796, 1670348842,1670369048,1670398068,1670414358,1670430762,1670447145,1670463517,1670479878,1670496258,31801347, - 1670520841,8396584, 1670696662,1670758827,33243142, 409272359, 1670799370,1670923253,124796957, 1670994473,1671053615,231260182, 1671094283,1671135263,51855366, + 80035956, 90112037, 1670251422,1670286571,246087796, 1670348842,1670369048,1670398068,1670414358,1670430762,1670447145,1670463517,1670479878,1670496258,31801347, + 1670520841,8396584, 1670696662,1670758827,33243142, 409272359, 1670799370,1670923253,124796957, 1670994473,1671053615,231260182, 1671094283,1671135263,51855366, 1162543116,1671151632,1671168016,38879270, 1671192588,229998607, 1671266363,1671299153,1671331878,1100302822,1671348526,1671381030,1671398746,66815322, 1671430160, 1671446544,46710805, 1671471117,1671594010,1671610380,57032746, 1671627185,390971402, 1671659549,1671677968,1671732587,454656012, 1671782414,167903546, 1672257551, - 1672402270,1672465249,8388919, 1672527894,1672544258,465322010, 1672568848,1672610684,1672667153,1672863762,1672954302,1673020425,236388383, 1673060371,180879387, + 1672402270,1672465249,8388919, 1672527894,1672544258,465322010, 1672568848,1672610684,1672667153,1672863762,1672954302,1673020425,236388383, 1673060371,180879387, 1673150884,1673186460,49086506, 1673232430,1673281760,1673314593,1673347084,1673364265,1673404436,1673565514,1673645572,1673725336,888897557, 1673773687,1673805911, - 1083147578,1673863189,1059522166,1674018847,1674036780,123273235, 1674076182,1674349294,1674403863,1674502168,1674575931,430932027, 864568329, 1674609099,27624295, + 1083147578,1673863189,1059522166,1674018847,1674036780,123273235, 1674076182,1674349294,1674403863,1674502168,1674575931,430932027, 864568329, 1674609099,27624295, 1097695291,1674657858,1674698777,1674741737,1674821716,8159242, 1674854421,1674871631,450543642, 1674904438,137445416, 1674977306,1675157531,1022607391,1675214914, - 1675255836,1675313999,1675347369,607289375, 1675386909,1675609577,1675657253,115720273, 1675673641,1675690065,1675722790,1017921558,1675739229,1675792520,136790053, + 1675255836,1675313999,1675347369,607289375, 1675386909,1675609577,1675657253,115720273, 1675673641,1675690065,1675722790,1017921558,1675739229,1675792520,136790053, 1675829278,1675887884,1024327702,252299153, 1675936260,1675985003,466780384, 1676025887,159449187, 1676219678,930086950, 1676296245,1568686539,226476114, 1322909717, 1676337184,1676460269,152961987, 1676501025,1676722269,1676779554,1676855779,389365762, 1676887444,1676952642,1677017996,1543472051,1677067433,27443263, 1677107235, - 168004081, 127860757, 1677213708,771932179, 1677238308,1677312084,115261472, 788643906, 1677352997,1677525002,520945706, 1677541835,1677590597,1677628217,23856239, + 168004081, 127860757, 1677213708,771932179, 1677238308,1677312084,115261472, 788643906, 1677352997,1677525002,520945706, 1677541835,1677590597,1677628217,23856239, 184549378, 1677697062,1677836307,230801424, 1677853106,113737766, 115785740, 1677885521,1677919144,1677951035,1677991975,1678132771,1678182667,1678229515,1678245890, - 1678262293,1482473488,1678286888,191315980, 1678327819,1678344208,1678360597,755220511, 1678385193,1678589961,1678606473,1678622980,154665411, 1678656102,147423234, + 1678262293,1482473488,1678286888,191315980, 1678327819,1678344208,1678360597,755220511, 1678385193,1678589961,1678606473,1678622980,154665411, 1678656102,147423234, 1678688287,58982410, 1678704746,1678789075,1678843946,1678901264,147423247, 1678918686,23609475, 1054900240,1678958635,1679016394,22478864, 1679056940,1679220781, 56639509, 1679327663,1679361080,1679425562,1679441949,1679466542,131335337, 5309176, 1679532079,1679589386,296977423, 1679605772,3900152, 1679622154,1679646768, 204537862, 127795284, 124551174, 1679712305,1262143266,1679900674,128974874, 1679925298,17006634, 1679998986,1680023603,1671266370,1680138292,1680212400,1680245769, @@ -3277,8 +3272,8 @@ static const unsigned int DictNodes[84251] = 1682079760,1682096210,251232268, 1682129038,1682162898,1682194444,315687339, 1682211353,3211366, 1682276404,1682310022,1682342425,1682407483,1682440194,1682456602, 112394268, 1682474759,1682522558,712148077, 1682595900,1682645053,1682890814,1682931728,1682948136,1532051482,1682967246,1683087423,1683145558,1683200880,1683284032, 1683365953,47530000, 1683441128,1683492661,1683571580,1177240460,1683628098,1683791939,556359748, 1683873861,1683950144,1683998203,1684045843,624869460, 1684062224, - 826736655, 1684078613,1684094992,11665445, 1684111414,1684144194,358514694, 118538271, 1029571472,1684177373,1684217926,1684512839,1684588195,1684654490,110249305, - 1684734552,1684774984,275992625, 51494996, 1684932446,1685004361,1685100049,316735554, 1685144089,172638264, 1685217354,1685282891,115785738, 6389841, 426983470, + 826736655, 1684078613,1684094992,11665445, 1684111414,1684144194,358514694, 118538271, 1029571472,1684177373,1684217926,1684512839,1684588195,1684654490,110249305, + 1684734552,1684774984,275992625, 51494996, 1684932446,1685004361,1685100049,316735554, 1685144089,172638264, 1685217354,1685282891,115785738, 6389841, 426983470, 1685446732,1685537214,1685603961,1685655228,1685703372,1685790797,1686003790,1686078399,554434572, 1686111872,177094694, 21086239, 1686167631,1686298704,1686355999, 43024391, 1686373364,1686424079,1686487103,1686519895,1686573446,1686622968,1686721033,281919499, 1686773841,1686896658,1686913155,1686929523,1686945923,1686962311, 989118473, 1686978644,1687011359,1687027733,48447510, 1687052370,804519967, 1687208046,383320092, 1687246322,1687340003,1687388191,1377141601,931348496, 1687405391, @@ -3291,36 +3286,36 @@ static const unsigned int DictNodes[84251] = 1691487890,1691541601,1160315564,1229242384,1691715010,1691762744,1691795540,134840360, 81379343, 1691834766,1691928412,1692000354,1692059508,1692098659,1692337246, 1692387188,1692418102,1692450923,1181761547,1692491876,1692573797,1692663829,155631632, 1692684740,1692746174,1692812263,219529244, 1692860862,1692934246,1692975126, 1692991542,1693030167,283361311, 1693073462,1693106202,310640659, 1693130855,1693253723,1693290607,1693360232,1693455019,1693517745,1693582166,1693635964,1693687913, - 1693712499,1693728903,1693745170,1693761555,79511558, 1693786218,1693892646,1693908998,15482909, 1693925378,1693941890,1693958173,1693974538,1455030300,7094497, + 1693712499,1693728903,1693745170,1693761555,79511558, 1693786218,1693892646,1693908998,15482909, 1693925378,1693941890,1693958173,1693974538,1455030300,7094497, 245792789, 1693999211,1694121994,1694138390,6324340, 1694163052,1694195821,81707139, 1694236701,170805647, 723386379, 1694253509,1694285843,1694310510,1694785647, - 1694909352,1694949488,1695031409,233734155, 1695088671,1695105034,1695121450,866910224, 1695137794,1695154186,246087701, 1695178866,1695359091,1695432735,214335509, + 1694909352,1694949488,1695031409,233734155, 1695088671,1695105034,1695121450,866910224, 1695137794,1695154186,246087701, 1695178866,1695359091,1695432735,214335509, 1695451487,1695499284,1695549451,1695613033,212369445, 1695650284,1695712708,1695752308,1695793183,292962330, 1695809839,1695842323,1695858690,1695875128,1695908199, 350142492, 1695948917,1696122244,1696186434,896122918, 1696227446,1696303895,1696366658,1696399584,1696440439,113246497, 3212129, 1696515178,180060599, 1696597380, - 196149276, 5308891, 1696661516,500498458, 1696686200,1696874710,1696907694,359841899, 1696956428,1696972826,589136202, 1696990292,24297531, 5308504, 7734081, + 196149276, 5308891, 1696661516,500498458, 1696686200,1696874710,1696907694,359841899, 1696956428,1696972826,589136202, 1696990292,24297531, 5308504, 7734081, 1697046649,1479065629,1697210490,1697300508,1697317167,1697351028,115769443, 1697399631,1697439867,1697694190,60227586, 1949717, 1697729793,1697759291,1697793297, - 567132265, 1697849468,385286160, 1697915005,1068761935,1697964158,77512723, 2130882, 1698209919,153042973, 1698302542,1698349102,246087711, 1698406528,128581658, - 1698463809,458784799, 1698521217,1698562079,1698578866,1698611231,1698629137,1698660383,1698681200,1698725894,1698750594,1698799747,1699012740,1699069964,930103322, - 1699086827,1699119125,1371373580,1699135554,1699168266,1699192965,1699242118,1699307655,1699348506,116883931, 179489087, 1699365339,1699397671,1699430419,423002134, + 567132265, 1697849468,385286160, 1697915005,1068761935,1697964158,77512723, 2130882, 1698209919,153042973, 1698302542,1698349102,246087711, 1698406528,128581658, + 1698463809,458784799, 1698521217,1698562079,1698578866,1698611231,1698629137,1698660383,1698681200,1698725894,1698750594,1698799747,1699012740,1699069964,930103322, + 1699086827,1699119125,1371373580,1699135554,1699168266,1699192965,1699242118,1699307655,1699348506,116883931, 179489087, 1699365339,1699397671,1699430419,423002134, 1699455112,501383180, 1699528706,1699545098,116375681, 1699564156,1699651721,1653440550,1699725314,1307230218,1699741717,1699758106,1699774476,1699790879,1699807253, 1699823653,1699840026,1522860034,164478978, 1699864714,1700006876,191070239, 958775336, 1700053451,1696595978,1028293079,1700103924,1700170712,1700225163,1700331583, 1700372620,61456415, 1700470925,1700495362,1700512175,1700550639,1700651150,1700733071,324895296, 881639436, 1700814992,1918152, 1700906451,1700954719,1700995217, 1010581789,1701102113,115179548, 1701159058,1701208211,1701347396,1900565, 1701397569,27246618, 1701478430,1701519508,1701609531,1701650581,1701707822,1701757023, - 1701806557,127041612, 1701847190,1701938938,44318722, 1701978263,1702172016,1702250441,1702305944,1702387865,5867390, 1702584474,1702666395,368002440, 364019738, + 1701806557,127041612, 1701847190,1701938938,44318722, 1701978263,1702172016,1702250441,1702305944,1702387865,5867390, 1702584474,1702666395,368002440, 364019738, 51380255, 1702772805,460898334, 1702813852,880919422, 223707157, 1702928541,1703034949,1703067872,1703100503,1703149637,508608578, 1703190686,1703264287,1703280642, 608796682, 1982506, 1703305375,1703445494,578404371, 1703480577,55132179, 1703511047,1703576565,110166082, 495601012, 1703641128,1703657538,1703698592,1703887448, 327965212, 838082721, 306528322, 1703927970,1704091169,1704149422,52330553, 132857867, 1704203865,1704264163,120242178, 520224783, 1704304803,139034678, 1704419492, - 1704675407,1704740230,1704804378,208584706, 171606028, 1350501265,1704821207,1704853542,204996610, 1704870417,1704911013,1704984683,1304608780,1705017807,270402137, + 1704675407,1704740230,1704804378,208584706, 171606028, 1350501265,1704821207,1704853542,204996610, 1704870417,1704911013,1704984683,1304608780,1705017807,270402137, 258752599, 1705058470,1705173159,1705214553,72368165, 1705246827,1705279490,770899978, 1705304232,1705394278,1705426972,1705443565,1705476136,1705492506,1705508906, 816775199, 1705525274,1705542064,1705574446,1705623611,1203060746,1705660672,1705771916,1705820920,1705853873,1705886846,305315866, 1705943209,1706033162,1706049558, 1706065948,1706086517,71712898, 108314936, 1706115101,1706131471,42008713, 1706147927,210272261, 1706205354,1706246175,193593349, 1706270891,1706565804,1157365800, 44613653, 1706631341,1706689526,4997603, 1706721810,1706837001,1706868757,1706885142,55427098, 412139879, 1706909870,1707001339,1707049562,22274223, 1707086856, 114245670, 1707135321,25559511, 1707204784,1707278807,1002864661,1707312688,1707343918,200589341, 1707394213,798375972, 1707450545,1707696306,1707753494,1707778227, 1707869516,1933349, 129876027, 1707967425,1708032836,1708101713,51429952, 449298442, 1708147147,1708196898,1708229528,1708286132,1708415709,1708458455,1708499125, - 1708556309,116703258, 1708573847,1708621840,129925131, 1708646582,1708785700,1708802076,1708818458,1708834844,1708851229,1708867625,1708884025,1708900394,580861980, + 1708556309,116703258, 1708573847,1708621840,129925131, 1708646582,1708785700,1708802076,1708818458,1708834844,1708851229,1708867625,1708884025,1708900394,580861980, 1708916758,1708933236,1708949546,1708965909,1708982282,1708998678,1709015156,1140047901,1709031850,1709065633,1709113369,1709154434,1709195270,1709211657,1472217109, 1709228034,1709244426,1709260931,1709277319,11010066, 1709293571,1709309981,103743529, 1709908152,1710015611,298270735, 5341268, 1710050511,1710096468,1710129154, 1710145648,1710161926,2621552, 1710186681,1710342264,104759298, 97378490, 611074168, 427139259, 1710361564,1710407811,9207846, 1710425539,1710475149,1710506020, - 8159260, 129417254, 9207818, 1710530748,1473036425,1710637187,1710654080,8994818, 505380866, 1710686217,1710702603,1710719113,16269323, 1710735401,2326659, + 8159260, 129417254, 9207818, 1710530748,1473036425,1710637187,1710654080,8994818, 505380866, 1710686217,1710702603,1710719113,16269323, 1710735401,2326659, 1710751749,1710768165,2752513, 1710785168,1710817321,1710833706,1247494357,1710850164,1710866468,1710882951,1710899330,34471976, 1710917168,1710948358,1710964737, 865009670, 1710981235,1213350023,1710997530,1711013904,300056588, 1711489276,110298760, 1711530174,1711554697,1711571075,1711587337,22478985, 8159251, 1711612095, 80035856, 71188509, 1711775936,1711825089,1711931418,1711947807,1711964179,1711980566,159760405, 1711997152,1712029715,1712046102,1712062466,1712078863,1318862863, @@ -3334,42 +3329,42 @@ static const unsigned int DictNodes[84251] = 44941338, 1716257226,1716291067,1196034, 1716347091,1716522242,1716568066,1716584477,27607069, 1716609236,227115030, 655114278, 1716737083,126287903, 1716801507, 1716863930,1716936917,2197567, 1717043266,1717076986,1717125579,1717175961,17843009, 131629096, 1717223883,1717280982,183975958, 1717393076,46120982, 1717443694, 8390334, 1717518791,1717568713,1717616678,261193766, 1717633784,1717666317,1717723351,145145878, 1618853947,1717805272,194871387, 1717848729,183697474, 1717912046, - 151076890, 1717944379,900759582, 1717977128,1717993531,1718026266,369558313, 1718042684,1718126201,1718182105,1718321455,1718353941,46530582, 1718370306,173850650, - 1718386707,1718403088,958070794, 1718419494,1718435856,1718452230,10829830, 1718468662,1718501398,1718518631,1718552153,1718599682,12779530, 1718616066,512541109, + 151076890, 1717944379,900759582, 1717977128,1717993531,1718026266,369558313, 1718042684,1718126201,1718182105,1718321455,1718353941,46530582, 1718370306,173850650, + 1718386707,1718403088,958070794, 1718419494,1718435856,1718452230,10829830, 1718468662,1718501398,1718518631,1718552153,1718599682,12779530, 1718616066,512541109, 1718637965,1718697986,1718714450,5341272, 1718747595,1718797135,1718829094,1718845478,837746719, 1718870234,1719197915,47923241, 1719320578,1719337431,1719370257, 1719402498,1719418987,1719451679,188825612, 1719468478,1719533578,860423995, 5309428, 1719556516,7143895, 45531158, 150798375, 892157954, 1719600768,1719656668, 1719783014,1719812150,1719844971,1719886045,70942722, 1719951582,1444266690,704366191, 1720033503,1720172990,1720239308,1720287248,796033055, 194036013, 1720304153, - 1720374816,1720435861,1720470721,1720518847,1720552278,50036776, 1720598530,1490993163,1720623328,1720733538,1720795190,1720827914,1720852705,1720963989,8389785, - 1721041355,1721092728,1721122882,1721164002,1721287684,1721353785,1721458285,1721516071,1721557219,19270264, 1721614870,164036610, 10650485, 1721647134,113115220, + 1720374816,1720435861,1720470721,1720518847,1720552278,50036776, 1720598530,1490993163,1720623328,1720733538,1720795190,1720827914,1720852705,1720963989,8389785, + 1721041355,1721092728,1721122882,1721164002,1721287684,1721353785,1721458285,1721516071,1721557219,19270264, 1721614870,164036610, 10650485, 1721647134,113115220, 179765279, 1721688292,1721862925,1721925634,1721942487,182419478, 1721974790,1721991189,622788634, 1722015973,1722123672,706102178, 1722171819,1722205240,1337049625, - 1722269708,1722286106,1351024678,1722310886,1722418065,886691517, 115769633, 1722468765,1722802408,1722933481,1722982634,7389186, 1723088980,1723121674,119881740, + 1722269708,1722286106,1351024678,1722310886,1722418065,886691517, 115769633, 1722468765,1722802408,1722933481,1722982634,7389186, 1723088980,1723121674,119881740, 182992906, 5309910, 1723138114,1189841238,2113558, 1723170847,1723187210,150683660, 1723204016,1723236411,1723270490,1723301947,151109642, 1723336908,1723375851, 308871170, 1723499428,1723547650,128974858, 1723566015,1723670764,1723752685,2834907, 1723827402,1723875354,1048723458,1723891778,1723932910,1724080367,1724268582, 1724286298,1724318561,1724350485,1724366878,1724399642,179159071, 1724416002,1724434500,1724482073,1724548935,1717403690,266772720, 1724596289,787956143, 1724646907, 162119762, 1724694530,185483488, 1724712505,1724817649,1724877434,128581643, 1724924008,1724973531,525550973, 1725014258,1725091570,1725153639,1725194483,1725268400, - 1725308585,1725350901,775815189, 1725415661,1725448234,1564393488,1725465057,297844767, 1725514087,1725549041,1725604084,1725767925,971849759, 1725825479,78479372, + 1725308585,1725350901,775815189, 1725415661,1725448234,1564393488,1725465057,297844767, 1725514087,1725549041,1725604084,1725767925,971849759, 1725825479,78479372, 1725874275,1725907016,362895014, 1725972899,1726006752,355729843, 1726039819,1726120043,1726152733,1726169090,153567242, 1726186319,1726226678,1726456055,1726694486, 1726742637,1726775327,1484259343,1726791682,1726808090,525615106, 1726824460,257638457, 126959657, 1726849272,1726939173,1726955526,75530262, 1726972751,1727013113, 1727119502,1727152130,312180764, 1727176954,1727253496,503431170, 1727300808,1727332373,1293877274,1727348738,29900828, 1727366291,1727398191,43237387, 1727431570, 265994276, 461963286, 194822175, 1727488251,1727561750,47923205, 1727586556,1727660120,1727701245,1727791341,283721965, 1297301536,283197477, 1727832318,1727938641, 825459606, 180601370, 1727971387,542738583, 1728004203,1017921558,1728042314,304826707, 1728127231,1728400630,1728479242,1728504064,116015114, 1728561579,1728593946, - 51855417, 1728611281,1003356267,1728659472,1728675877,1728692230,126025744, 1728717057,1728921626,1728937996,1728954370,1728970773,1728987148,1729003549,72728691, + 51855417, 1728611281,1003356267,1728659472,1728675877,1728692230,126025744, 1728717057,1728921626,1728937996,1728954370,1728970773,1728987148,1729003549,72728691, 1729020751,1729052778,404046109, 199492439, 441073901, 1729134679,1729183754,357220418, 1729208578,1729421571,155910170, 1729511857,1729545545,422952962, 1729594104, 1729634564,1729675406,134514538, 1729708044,458113026, 1729724475,1729757215,1729773578,1729790859,1729855498,1729871956,1729905134,462438412, 1729939467,1730003003, 1730036637,1730118533,1730253190,1730297866,1730315915,1730379788,3375144, 6373468, 1730396186,110575618, 1730419021,215187468, 209453068, 1730495065,1730535685, 1730708998,599474178, 1730756630,1730773022,1730805762,1170342942,1730830598,1730945287,589660191, 1731036134,1731068822,1731125512,2196932, 56524828, 1731199041, - 1731248168,29884426, 1731265526,1731305737,2195995, 1731465069,1731527097,1731584266,1731780875,1731953177,1732020313,896122892, 433225766, 1732075788,144179221, + 1731248168,29884426, 1731265526,1731305737,2195995, 1731465069,1731527097,1731584266,1731780875,1731953177,1732020313,896122892, 433225766, 1732075788,144179221, 1732296743,14450690, 199376980, 1732329526,262684682, 1732364295,5537804, 849413558, 1020805142,1732419853,1732476947,736722966, 1732493368,1732528023,1732591618, 2196851, 1732616462,249987375, 1732714767,1732804866,1732839162,1732873666,1732919361,1732972872,1733435664,1733707541,110248043, 1733771280,1585578010,1733793431, 1733853291,1733887388,1733936158,1733969225,104005647, 110936090, 1734017454,1734066275,1600897327,287557059, 1734099374,1734156561,1734213675,6373408, 1734254866, 1734335134,1734361118,1734394311,1734443027,578043923, 1734463833,1734525373,1734558658,1734590563,1734623291,152027568, 1734657813,1734722590,10649903, 1734755384, 1734820792,1734870267,1734919816,1734967307,2203923, 233473829, 1734984217,116015114, 304889866, 1735049653,468205634, 1735082086,1735114754,1735131245,1735172372, - 1735393321,1735409676,141606923, 318063083, 916914207, 1735426321,193659806, 1735467285,1117012022,1735532822,242729077, 1735574351,1735607285,1735671810,659914758, - 1735688290,1336098827,1735720970,1735737363,1735753749,952074271, 1735770959,1735802906,116703235, 1735819801,1735884853,1735926039,1736081645,1736122648,4309281, + 1735393321,1735409676,141606923, 318063083, 916914207, 1735426321,193659806, 1735467285,1117012022,1735532822,242729077, 1735574351,1735607285,1735671810,659914758, + 1735688290,1336098827,1735720970,1735737363,1735753749,952074271, 1735770959,1735802906,116703235, 1735819801,1735884853,1735926039,1736081645,1736122648,4309281, 111280149, 1736212490,1736228923,1736270105,1736335642,1736475224,1736515867,1736581404,5309937, 1736671662,1736726436,324895753, 483395620, 1736772689,1736888565, 154042862, 1737001215,1737072925,484017263, 1737236766,1737326594,1737343002,281362548, 1737362643,1737416991,5326635, 1737531680,1737655217,1737687479,1737719829, 1737736222,1737769025,1737818152,1737834522,948191263, 1737850901,738344986, 1737875745,8389746, 1738039586,1738096642,1738113043,55197717, 1738134718,1738203427, - 140247515, 372245833, 249110820, 1738342637,1738376201,113246679, 1738407948,1738424322,84721685, 1738449189,1738523083,1738573068,1738621070,297844746, 357793794, + 140247515, 372245833, 249110820, 1738342637,1738376201,113246679, 1738407948,1738424322,84721685, 1738449189,1738523083,1738573068,1738621070,297844746, 357793794, 1738653702,229736470, 1738670574,1738711334,1738875175,1739080500,1739129030,8610088, 1739161739,1739194395,1739227983,271384586, 1739265831,180715522, 1739309140, 1739344153,81166352, 1739415849,575733776, 135184424, 1739474489,1739579690,182140938, 1739669585,280150054, 1739710763,207978522, 147423254, 47923219, 1739792684, 1739874605,1740423184,1740439593,1740456490,1740472341,1740488726,1740505100,1740522026,225869835, 1740546351,1740784959,1740854297,580158697, 1740931502,1138737191, @@ -3380,30 +3375,30 @@ static const unsigned int DictNodes[84251] = 1743290452,436158490, 1743323673,1743388777,1743423860,696582619, 190169110, 547127298, 1743495484,1743593789,1743650818,168935443, 1638727682,1741488665,1743667254, 1743708478,1743798344,1743871392,1743929365,1743945863,37748870, 1743970623,1744045444,844464157, 1744109589,1285734402,3735854, 509297833, 1744134464,1744396609, 117900171, 1744462146,320946677, 1744519170,1744535564,1306771759,158254319, 1744551990,1744584710,1744601109,1744620433,1744715860,1744748628,1744782464,1744830507, - 1744863992,1744904515,6373435, 1744961552,1744986436,1745027527,1745076250,1018020649,1745092668,1745175561,136118711, 441385948, 1745207402,1745289226,45039658, - 1745314117,1745371220,1745412422,1745567851,1745609031,344850472, 1745720670,1745780742,25559090, 1745797132,1428996127,1745822024,1745930079,1745996829,141836319, + 1744863992,1744904515,6373435, 1744961552,1744986436,1745027527,1745076250,1018020649,1745092668,1745175561,136118711, 441385948, 1745207402,1745289226,45039658, + 1745314117,1745371220,1745412422,1745567851,1745609031,344850472, 1745720670,1745780742,25559090, 1745797132,1428996127,1745822024,1745930079,1745996829,141836319, 6373847, 1746042899,1746059286,271384602, 1746084169,1746337811,253935638, 1746355699,1746387001,1746403354,1746420171,174080936, 1746469294,2197170, 1746518936, 123273256, 1746572526,1746670937,1746706762,1746911339,244170754, 1746944142,1746985291,51855417, 1747042370,1747083596,1747140610,973078568, 1747157295,1747192267, 469614604, 164757558, 1747240175,1747280205,1747455248,159268880, 1747525966,1747617257,276480059, 1747673423,153190427, 1747795980,8397136, 1747813344,1747861756, - 1747902801,1748058217,1748099410,1748172802,1748189203,1748205589,1748222189,199573530, 701300767, 122716191, 1748256555,1748287514,1748303903,93978639, 48611330, + 1747902801,1748058217,1748099410,1748172802,1748189203,1748205589,1748222189,199573530, 701300767, 122716191, 1748256555,1748287514,1748303903,93978639, 48611330, 1748320322,1748353062,1748369840,1748403266,1748467738,1245315881,1748486556,230309904, 1748533308,1748617483,1748664857,1723121690,1748729964,1748765189,1748820307, 1748878177,119816222, 1748918612,1749024789,1749041164,184926214, 1749066069,163733846, 1749206538,1749254275,161234953, 1749270540,1749295447,1749352460,1749368834, - 1785897, 1749386126,1749451806,1749483532,932970517, 1749499923,1749516310,1749532684,1749549067,1749565555,65667207, 1749590360,1749663784,1749680138,115294250, + 1785897, 1749386126,1749451806,1749483532,932970517, 1749499923,1749516310,1749532684,1749549067,1749565555,65667207, 1749590360,1749663784,1749680138,115294250, 1749696555,1750163801,1750450257,1750483880,1750517982,1750564951,1750622554,2605068, 1750683620,1750737243,1750892600,1750925849,8397148, 1750999389,1751040430, 1751094871,1751163230,1751220255,1751236699,619823377, 1751275253,1751352056,1751384076,491233631, 119358311, 1751400552,188106602, 1751458144,1751630769,1751663479, - 1751695414,1751736673,1751818594,1685241912,1751924796,695369738, 1752015203,1752170498,1752186895,73531418, 8610148, 8389013, 1752205338,1752256246,650051622, + 1751695414,1751736673,1751818594,1685241912,1751924796,695369738, 1752015203,1752170498,1752186895,73531418, 8610148, 8389013, 1752205338,1752256246,650051622, 131335620, 1752353755,1752441189,1752514667,1752551691,211894278, 1752605030,1752713314,6374263, 1752768871,1752826286,1752883560,1753022504,1753038879,1753055238, 211189772, 240566303, 116375618, 234307600, 1753071698,1753104415,206176298, 1753120899,64684162, 1753140367,1753193392,1591607727,1753252723,1753336180,1753403653, 426835984, 1753473385,119357954, 1753678315,45350952, 1753719146,322535490, 125584439, 113115157, 1753779165,1753826933,1753964907,1754076596,1754136597,1754161516, - 1754251807,1754308973,1754407278,1754480652,1754497833,1754537143,1754613563,1754660972,1754693659,666291974, 1754726509,553156646, 1754767727,1676361759,266486261, - 1754841147,1754874618,1754906690,1377387689,1754939880,3212488, 1754974619,1755041025,1755070495,286228501, 945176607, 1755092273,1755160944,1755472241,279314454, + 1754251807,1754308973,1754407278,1754480652,1754497833,1754537143,1754613563,1754660972,1754693659,666291974, 1754726509,553156646, 1754767727,1676361759,266486261, + 1754841147,1754874618,1754906690,1377387689,1754939880,3212488, 1754974619,1755041025,1755070495,286228501, 945176607, 1755092273,1755160944,1755472241,279314454, 1568016974,1755662013,1755743855,2932844, 1755791386,126025738, 1755816306,268468226, 5309643, 1755947379,1337229314,246121384, 1756070753,246087720, 1756111220, - 1756153877,243597742, 1756192922,146358303, 174080419, 1756275061,1756438902,23380160, 1756512299,1756553591,8391153, 866844756, 1756684664,1756750201,2195615, + 1756153877,243597742, 1756192922,146358303, 174080419, 1756275061,1756438902,23380160, 1756512299,1756553591,8391153, 866844756, 1756684664,1756750201,2195615, 1756863909,1756930426,502989294, 1757061499,131334252, 1013219339,1757152330,1757184012,1757200422,1900582, 1757216814,474054666, 114049050, 1757274492,1757651325, 762019869, 1757716862,1757897087,1758003238,128090114, 1758019643,1042546730,1758060928,1265631295,1758134797,515031147, 1758192001,1758266264,1758323074,1758388611, - 1758445614,292995170, 1758499827,1758593119,1758642192,1758658586,1758674960,257433988, 1758699909,1758774211,169320838, 188582245, 1758822937,1758890816,6438952, - 1758954232,795148307, 472270489, 1758994823,1759084556,144048244, 1759101387,1296568041,1759158664,794362458, 185484318, 19259785, 1759334242,1759396271,654025098, - 789446773, 1759437195,1759494184,1759510987,1759559787,1759601036,1759690791,954236987, 1759724063,6946875, 5311929, 1759775438,1759895949,1759985676,267272626, + 1758445614,292995170, 1758499827,1758593119,1758642192,1758658586,1758674960,257433988, 1758699909,1758774211,169320838, 188582245, 1758822937,1758890816,6438952, + 1758954232,795148307, 472270489, 1758994823,1759084556,144048244, 1759101387,1296568041,1759158664,794362458, 185484318, 19259785, 1759334242,1759396271,654025098, + 789446773, 1759437195,1759494184,1759510987,1759559787,1759601036,1759690791,954236987, 1759724063,6946875, 5311929, 1759775438,1759895949,1759985676,267272626, 1760002102,1760043406,1760158012,1760247850,1760264204,588218407, 447840293, 1760280650,1760348929,1760403855,1760477966,124863134, 1760513803,1760567696,1760780689, 445530150, 1760854038,1760871564,1760928146,1761017894,1761034278,1761050683,475545638, 1761091987,1761206676,1761270131,1761333314,6373815, 1761411115,1761443842, 1761461278,500957222, 1761501589,2359350, 1761575966,1761607739,1761640494,1761690360,576176143, 619397122, 1761730966,1761922111,1761972770,1762050086,1762066969, @@ -3411,20 +3406,20 @@ static const unsigned int DictNodes[84251] = 1762902028,1762918954,336707625, 8389428, 8389631, 1762934843,1693106214,1762976153,1763090842,1189840214,1763168901,193708091, 1763229715,1604534294,1763246146, 185417734, 1763287451,1763360827,547192870, 48480272, 1763398949,1763451292,1763533213,1763598750,220662173, 124863144, 1763746207,170804463, 1130627566,1763877280, 1763950630,1763971258,139034708, 1764034944,1764098478,158253163, 1764148092,1764196391,1764237729,1764476552,927350794, 1764524086,1764556908,1764589676,1764622420, - 1764656297,3212379, 1764695815,654000546, 1764786216,2719775, 1764805778,1764851772,1764936966,1765007778,6438918, 1765064795,1765450148,1765671215,47611925, - 353239116, 1765703809,1225588822,1765738213,858406928, 1765785665,1765834754,1180205077,1765851666,1765972071,1766015513,1766080522,1766098263,1766154661,210633718, - 1766228833,1766260790,1766293514,1766309929,1766326274,1250607132,1766344388,1766408202,1766424597,651591696, 1766441937,1766490150,278102047, 1766515110,996163649, + 1764656297,3212379, 1764695815,654000546, 1764786216,2719775, 1764805778,1764851772,1764936966,1765007778,6438918, 1765064795,1765450148,1765671215,47611925, + 353239116, 1765703809,1225588822,1765738213,858406928, 1765785665,1765834754,1180205077,1765851666,1765972071,1766015513,1766080522,1766098263,1766154661,210633718, + 1766228833,1766260790,1766293514,1766309929,1766326274,1250607132,1766344388,1766408202,1766424597,651591696, 1766441937,1766490150,278102047, 1766515110,996163649, 1766613415,9519127, 1766793640,1766916354,760905730, 760930729, 1766950057,1766982992,1767039402,1767133536,1767170475,1767261067,1767326163,353241574, 1767374954, 1767457447,1767498156,1767563693,1767686166,209813535, 1767704248,1767784488,1767800844,1767817315,1767849986,338264093, 1767874990,1768038831,1768195463,1768226856, - 1768243206,1768259596,42434581, 1768277480,1768325132,200261740, 374194188, 14794792, 1768350128,1768432049,164773915, 1768595890,704332079, 1768661427,210436123, + 1768243206,1768259596,42434581, 1768277480,1768325132,200261740, 374194188, 14794792, 1768350128,1768432049,164773915, 1768595890,704332079, 1768661427,210436123, 1768784719,1768817694,1768852800,1768915403,189693964, 1768964929,1768997835,1179271974,1769133212,179994662, 1769218484,1769606696,1769636328,1769672877,1769717826, - 118489090, 1769750831,116752394, 1769783323,1769824693,1769869455,1769921915,1769980441,1770045442,1770061834,1143128929,1770086838,158711848, 1770209296,149161067, + 118489090, 1769750831,116752394, 1769783323,1769824693,1769869455,1769921915,1769980441,1770045442,1770061834,1143128929,1770086838,158711848, 1770209296,149161067, 1770225967,350912524, 1770258458,1770279213,1770307586,147685397, 1770332599,61440031, 1770725817,49020966, 1771012108,1771028518,1032142860,785678352, 1771044948, 1771078796,61997072, 1771135418,1771193546,1029572414,1771243409,1771282875,1771405328,1771424497,1771460544,1164427266,1771528636,1771717772,1771768961,1771814914, 1771831317,380272671, 1771854752,1771913275,1771946022,1771963736,1772012952,1772062750,1772110127,1772144678,2195483, 1772298685,1772437506,1772453909,1772470303, 1772486675,120963992, 1772503486,1772573296,147243092, 1772635574,1772685695,1772756358,133414941, 1772798051,118882607, 1772839358,470712349, 1772964319,1773018428, 312180738, 1773077755,1773125709,1773158937,5883066, 1773226292,1773305916,150798807, 1773396415,1773445568,1773535258,1773551635,1773568022,5866343, 1773584985, - 1773617183,1773633546,3473420, 1773649936,1773666314,3473840, 206176275, 1773691329,122131011, 1773816030,1773871554,1773945665,1773986243,1774206978,46530591, + 1773617183,1773633546,3473420, 1773649936,1773666314,3473840, 206176275, 1773691329,122131011, 1773816030,1773871554,1773945665,1773986243,1774206978,46530591, 150798420, 1774223382,1774239775,153190450, 443645954, 1774264772,8395849, 1774504713,1774559685,1774739910,1774813630,116375628, 1774887367,1774985672,1775198665, 1775256029,301350964, 1775296970,3211698, 150536952, 1775439059,650559526, 1663255582,1775493579,1775569247,13074458, 1775620143,1775665154,10944541, 1775690188, 1775780299,1775829451,593379384, 1775881298,291111407, 1775960123,1561043405,1775992844,1776010134,1776059275,1776125303,1776214478,1776484406,15351848, 1776521171, @@ -3439,39 +3434,39 @@ static const unsigned int DictNodes[84251] = 1781170241,555319403, 477937692, 1781219438,1781253922,1781284886,515506178, 1781301294,1781359076,1781522917,1781596620,1781628959,1781646345,1781678082,1781703142, 1781776391,2195810, 1781792775,2195594, 1781817831,1781899752,131891226, 717652010, 1781998057,1782054943,1782071308,1782088114,1782120485,113246511, 1782136834, 1782161898,1782194667,1782270478,898154799, 1782317116,1782407660,788430860, 1782481355,624837641, 1782538733,1782613364,1782664454,1782727670,1782768110,1782956473, - 46530562, 162187258, 1783007031,1783054376,1081212970,1783489008,1783660631,1783709780,5341276, 1783744698,174456862, 1783783921,1521647642,1783931378,44941314, + 46530562, 162187258, 1783007031,1783054376,1081212970,1783489008,1783660631,1783709780,5341276, 1783744698,174456862, 1783783921,1521647642,1783931378,44941314, 1783988290,1155564021,1784029683,1784122313,334135334, 1784168474,155648012, 579601438, 1784189263,1784250968,600852949, 196149285, 405864500, 1784283241,1784316350, 1784381494,1784417482,1784485576,1784545313,18596321, 1784594538,1784677604,1784725563,235438540, 1784759562,7258200, 1784791066,1784807531,1784840258,1784872976, 994443311, 1785029108,1785283725,1785331753,1785349620,1008680986,1785405941,1526006063,188582192, 1785455094,1418133514,45137948, 1785579065,1785678175,1785724974, 565920047, 1785782775,325255252, 87539740, 1785897464,1786004216,1786036290,633569286, 118882388, 1786077689,401834065, 1786232938,4998704, 1786323450,1786429985, - 1786479510,1786529319,1786593346,1786627272,1786658846,1786695790,638500886, 51429457, 151093286, 1786741816,44941318, 1786806303,1786822662,1786839061,427557711, + 1786479510,1786529319,1786593346,1786627272,1786658846,1786695790,638500886, 51429457, 151093286, 1786741816,44941318, 1786806303,1786822662,1786839061,427557711, 1786857017,1786962427,1787136319,291013785, 1787167738,1787215931,1787257340,1787363347,683982870, 1787379754,1787396118,1787412510,1787453949,1787593970,1787658339, - 1787691046,1787707476,1787748862,1787841094,1787872180,346719206, 1787940144,1787985966,1788036197,1788085071,1788125695,5177373, 1788220443,1788272506,115114518, - 1788349558,68567051, 1788404224,896517110, 8390928, 1788649985,1788723260,190841353, 569005944, 1788813826,383796092, 1788895747,1789010436,1789067306,126959638, + 1787691046,1787707476,1787748862,1787841094,1787872180,346719206, 1787940144,1787985966,1788036197,1788085071,1788125695,5177373, 1788220443,1788272506,115114518, + 1788349558,68567051, 1788404224,896517110, 8390928, 1788649985,1788723260,190841353, 569005944, 1788813826,383796092, 1788895747,1789010436,1789067306,126959638, 1789084107,1789134323,1789165610,1789181974,1789202432,141412838, 1789255236,16269321, 1789321733,1789478376,1789526319,302563857, 838451632, 1789559275,1789592617, 49152006, 1559887893,269418508, 1789658116,1789724217,1789829638,1790017573,895991874, 686425433, 1790042631,1790116362,129876490, 1790149741,316621263, 1790190088, - 1790280175,1790312986,1790353929,7144369, 1790509142,1790542787,447987733, 1790591278,1790625337,1790730762,119998731, 1790796299,1790904803,1790935052,116375582, + 1790280175,1790312986,1790353929,7144369, 1790509142,1790542787,447987733, 1790591278,1790625337,1790730762,119998731, 1790796299,1790904803,1790935052,116375582, 1790960140,1791051081,1791098899,1791115286,1791131707,1791164476,1791255053,1791363998,705314875, 1791410222,1791460008,1791492127,17221571, 1791517198,1791574067, 913391627, 1791606795,1791623255,4292664, 1791681039,1791730192,1791821501,1791901755,1791935573,1791968168,270401595, 1792004240,1792065577,1079706518,1792081930, 154943504, 1792107025,1792232317,1792278550,1792296436,119357520, 371884054, 233734170, 1792352786,1792508436,44941317, 653099034, 1792557593,1792622648,1792659723, - 1521647626,1792704522,1496843273,1792720927,284786730, 1792737805,1582874650,1792786478,759710869, 1792786434,1792836129,1792885681,1792917963,1792975379,245350402, + 1521647626,1792704522,1496843273,1792720927,284786730, 1792737805,1582874650,1792786478,759710869, 1792786434,1792836129,1792885681,1792917963,1792975379,245350402, 129876075, 1793082262,473432598, 1793130550,1793163331,1793253908,1793349921,1793393400,1793425867,1793475505,1793509175,1793558327,1793605740,1793638426,1793655321, 44531750, 1793729045,1793876502,1794015273,1794031628,1396674020,1794048059,8392971, 1467121702,109166602, 1794089495,1794179518,124733018, 1376518627,1794245717, 1794277398,800227873, 1794294607,5882327, 1794335256,1794425823,1794482713,1794523189,1702510613,1794556363,1794606191,154796511, 1794638857,47611914, 1794679322, - 1794753441,1581400080,1794810395,1794867266,1794904201,96419880, 1794949150,1794985923,46416096, 1795047490,1795081225,1352400922,1795114553,1795219996,134103987, - 1795316199,1795358730,1083474351,1795383837,1795506213,1795522668,1795555350,1795573224,51625995, 1795629598,52199453, 1795789203,1245904938,1601327257,459145258, + 1794753441,1581400080,1794810395,1794867266,1794904201,96419880, 1794949150,1794985923,46416096, 1795047490,1795081225,1352400922,1795114553,1795219996,134103987, + 1795316199,1795358730,1083474351,1795383837,1795506213,1795522668,1795555350,1795573224,51625995, 1795629598,52199453, 1795789203,1245904938,1601327257,459145258, 1795833916,1795924511,1796055584,2933960, 1796137505,119357549, 339624373, 1796219426,298861768, 1796293928,1796350499,1796472873,1796489282,1796524757,1796571990, - 324534284, 8397348, 1796621481,1796653087,153747519, 1796673313,1796751391,1193853880,1796768757,1796834886,45465641, 1796917434,1796948388,1796980746,3850762, + 324534284, 8397348, 1796621481,1796653087,153747519, 1796673313,1796751391,1193853880,1796768757,1796834886,45465641, 1796917434,1796948388,1796980746,3850762, 294142059, 18137130, 1797005861,1797153318,1442512927,1797242964,1797275707,1797308558,54820866, 1797349927,1500577818,1797455938,1797491150,1797586970,1337903290, - 137101834, 1797324826,1797603368,1797619722,344850469, 1797643428,1797775912,115720235, 1797915119,1797956137,1798179541,307725233, 1798234666,1798342442,261193750, - 1798394388,1798439449,1798505366,1798562347,1798684814,1798718358,1798775340,340903957, 1798866955,117506351, 658161730, 1798939181,1799094300,1799110743,335151130, + 137101834, 1797324826,1797603368,1797619722,344850469, 1797643428,1797775912,115720235, 1797915119,1797956137,1798179541,307725233, 1798234666,1798342442,261193750, + 1798394388,1798439449,1798505366,1798562347,1798684814,1798718358,1798775340,340903957, 1798866955,117506351, 658161730, 1798939181,1799094300,1799110743,335151130, 1799159846,1798472527,1799177601,1799227071,1799323754,1799405995,1799438787,3162148, 1799471110,1799487918,1799536722,5799993, 1799569474,1799610926,1799717335, - 1799751153,1799783993,1799889455,1800093718,699334694, 632143913, 1225031787,155829248, 1800110139,1800143702,1800192010,153882221, 1800214196,1800257558,599343142, + 1799751153,1799783993,1799889455,1800093718,699334694, 632143913, 1225031787,155829248, 1800110139,1800143702,1800192010,153882221, 1800214196,1800257558,599343142, 1800275315,1800306715,1435238466,922289075, 1800348208,1800487820,1800537000,1800569346,22267647, 1800603029,639501342, 1800655888,1800701122,1800757809,1800816068, 1800847420,1800938034,1801060889,1801128599,1801209584,649921551, 3473471, 1801240684,1801276291,429918234, 1801339310,871612427, 1801391374,1801454059,1801486395, 1801519142,1801536025,203818389, 1801603760,1801654109,1801699435,1801732399,1801764890,1801781678,1801832362,1801896017,1801929163,1801986611,1802043838,1641267226, 1802108988,1802199604,1802338363,1802379829,1802552341,1802601311,1802666089,1802698779,1802732438,1143521336,44613647, 1802789430,1802898154,1802944528,1802960934, - 140247079, 1802978040,1803018807,42369066, 1803100728,1803158594,1803223562,1803255916,1317699622,1803289526,1803354571,1803412025,234176550, 1803486056,48054293, + 140247079, 1802978040,1803018807,42369066, 1803100728,1803158594,1803223562,1803255916,1317699622,1803289526,1803354571,1803412025,234176550, 1803486056,48054293, 1803552308,1803599953,1803632680,1803649561,1803723322,321211298, 450592866, 1803798514,650559498, 1803870779,152027178, 1803978177,1804009931,6834948, 1804059161, 1804132924,1804231229,9322507, 1198227466,1804313150,55459859, 1804362303,1804403106,1804444224,1804517435,1804552549,227524750, 44531738, 1804599755,1804648970, 301351721, 1804681675,1803812876,51380266, 1804733226,1804821057,113838000, 1804861450,1509785602,1489010769,1804878279,1804927510,1344323610,137102938, 1804960281, @@ -3483,23 +3478,23 @@ static const unsigned int DictNodes[84251] = 1808482344,1808498714,1808515114,52641823, 1808531475,1808547878,1808564240,1808580629,577617942, 1808597028,47316997, 1808622159,1808917072,1809024344,1347846579, 1809072159,1809088947,147063967, 1809122705,1809186882,1809220023,1809261137,1809399839,211894282, 315031578, 226443302, 1809417039,1809457746,1809637971,1809776656, 251592814, 1809801812,1809842178,1809858617,770162700, 1809875791,1809916501,1810047574,1810104791,1810137147,1810169907,683360258, 1810202664,346488858, 1810221791, - 1810309719,958775298, 1810375256,1810415637,1398505538,1810432026,1810448410,1810464770,1810481162,410632204, 1810497547,1810514908,1810547225,132155659, 213663775, + 1810309719,958775298, 1810375256,1810415637,1398505538,1810432026,1810448410,1810464770,1810481162,410632204, 1810497547,1810514908,1810547225,132155659, 213663775, 1810621017,1810735706,559120422, 1810808844,1810825725,1810883163,1811091740,1811137448,6717452, 1811170144,252297711, 1811235687,1811270065,1811325532,1811423837, 1811489374,1811578890,420053034, 159383557, 1811595305,1811611702,1811653215,1811833440,1812039397,1812087263,1812119628,1812152358,553173058, 1812168788,1812201579, 1812234299,117751834, 1812267855,1812299797,171835414, 1812324961,1812381698,223903754, 1812398510,1734967306,1812456034,1812548375,393543687, 1812611164,1812643842, 1812660245,116376040, 1812677834,1812726667,1812791378,1812828013,1812890793,1812923422,1812963939,2129925, 1813037927,1813078628,157188206, 1813127781,1813323750, 1813384861,1813430303,1813446929,336790264, 1813488230,1813561398,1118323148,1070417345,1813598313,193659806, 1813693017,542556162, 1813733991,1813954587,1813987354, 1814006382,1814057513,825557058, 1814119912,1814176360,1814322702,1814398915,1814446164,1814479307,1814536809,1814642781,1814693829,208503817, 1814724638,1814757402, - 1814774155,1814806559,1814822950,189513759, 1814840500,1814889481,205815846, 1814921646,304889882, 1814971045,1815035914,7733928, 1815437931,1815625730,4964378, - 651100172, 586072130, 1815650924,1815773784,1815806839,1815838758,1815855536,592789516, 685852281, 1815894882,1815937045,1815953424,1815969803,1815986178,189202453, - 1816002576,17006602, 1816020366,1816084959,1816117335,1816169171,1816215578,6374185, 1816231948,15073309, 1816250123,1816339053,1816480995,1816530404,443974479, + 1814774155,1814806559,1814822950,189513759, 1814840500,1814889481,205815846, 1814921646,304889882, 1814971045,1815035914,7733928, 1815437931,1815625730,4964378, + 651100172, 586072130, 1815650924,1815773784,1815806839,1815838758,1815855536,592789516, 685852281, 1815894882,1815937045,1815953424,1815969803,1815986178,189202453, + 1816002576,17006602, 1816020366,1816084959,1816117335,1816169171,1816215578,6374185, 1816231948,15073309, 1816250123,1816339053,1816480995,1816530404,443974479, 1816576084,1816608910,163414028, 1816650350,189252015, 749898493, 712147376, 1816814191,1816890572,1816953135,1816994416,1817103489,555401323, 1817158257,1817289330, 1817371251,1817480061,1817535092,1817633397,45432914, 1817756080,1817788945,1817830006,1817952278,143392834, 1817974983,1818042999,1818116108,1818132486,1818148885, - 1818165279,1818181689,153714690, 1818198018,1722646539,1818223224,1818296336,3211785, 1818321529,1818387066,1818501755,119359348, 1818558910,1818625054,300720764, + 1818165279,1818181689,153714690, 1818198018,1722646539,1818223224,1818296336,3211785, 1818321529,1818387066,1818501755,119359348, 1818558910,1818625054,300720764, 1818665597,1818804254,1818837018,1818854838,1818902587,1818935306,551813174, 1818952862,1819017753,867794960, 1819091582,1819164698,1819181948,1819230654,1819296670, 1819328539,712900637, 1819370072,1819410532,1447559643,221134870, 1305346054,1819452031,1819746944,1819887584,1819934732,45465626, 144098359, 1819959937,1820049933, 580124969, 1820107394,1820237843,1820331810,1820410291,1820451459,1820623151,465551426, 1820664452,153190834, 1820754223,266191319, 1820795525,119357545, 1820966978, - 1821000139,1821049252,1821090438,321209365, 902889478, 1821196309,33243148, 1821212738,1821245450,46694410, 1821270663,131268690, 1821377471,1611137483,138642039, + 1821000139,1821049252,1821090438,321209365, 902889478, 1821196309,33243148, 1821212738,1821245450,46694410, 1821270663,131268690, 1821377471,1611137483,138642039, 1821409739,558628930, 365772816, 1821458969,1821526027,1821598344,859963402, 1821663881,578748432, 52543519, 1821769730,1821786152,385187846, 241156698, 1821811338, 1496450419,1821950018,601325625, 381733297, 1821982746,1821999144,577093634, 1822024331,1822180747,1112441267,1822229802,191791126, 1822286476,1822359618,1372357368, 1822392332,49463302, 1822417549,1822474251,1822490690,1822524339,1822556226,1822588934,1822605333,1822621712,213483535, 1823007374,518767025, 1823130687,1823220367, @@ -3509,26 +3504,26 @@ static const unsigned int DictNodes[84251] = 1824669717,629374998, 756318683, 1824689893,1824769014,1824800794,254197762, 1824817164,1824833825,1824875154,863291909, 1824997442,1825038995,1825137300,1825193994, 1825219221,1825358283,513786801, 273088550, 309641675, 1825415830,1825521695,1156808714,1825546903,1021870561,1825628824,1825819136,1825865787,302563759, 1825899720, 1825936417,1825989273,1826103962,1826193507,1195507796,1826235035,119997591, 312033712, 1001538569,1826324912,1826366108,1826431645,204718179, 1826718190,1826750502, - 1826766914,1826801894,1826848770,115204766, 1826867211,254591470, 1826935420,1826979866,1348223007,1826996246,174227492, 1827013493,115114946, 1827054239,317842080, + 1826766914,1826801894,1826848770,115204766, 1826867211,254591470, 1826935420,1826979866,1348223007,1826996246,174227492, 1827013493,115114946, 1827054239,317842080, 1827143722,55033898, 1827168929,1827274839,1827323916,1827340314,1827356703,114409475, 1827381922,1827536907,1827553292,1827569690,1827586079,115523603, 1363378192, - 1827603279,1827635216,1827651605,1827667970,120258571, 578748428, 141606931, 1827684374,1827700748,1827717158,134021151, 1827733585,144834600, 1827766288,125927452, - 1827791523,1827932287,1827998523,1828094632,1828126732,247234586, 1828146633,1828194011,1828225046,1828241419,185581599, 1828266660,1828342216,1828391681,288620550, - 1828439082,1828545189,1828606971,144048131, 1828651062,49086490, 61997058, 1828692646,1828938407,1829158928,1829175334,1829191711,1829211890,1829274931,236011546, - 3686440, 1829331624,153207218, 1829504319,1829568531,1829585199,1829617690,1829634090,295190960, 1829650448,1829666842,701055013, 1829683284,1829715989,986267660, + 1827603279,1827635216,1827651605,1827667970,120258571, 578748428, 141606931, 1827684374,1827700748,1827717158,134021151, 1827733585,144834600, 1827766288,125927452, + 1827791523,1827932287,1827998523,1828094632,1828126732,247234586, 1828146633,1828194011,1828225046,1828241419,185581599, 1828266660,1828342216,1828391681,288620550, + 1828439082,1828545189,1828606971,144048131, 1828651062,49086490, 61997058, 1828692646,1828938407,1829158928,1829175334,1829191711,1829211890,1829274931,236011546, + 3686440, 1829331624,153207218, 1829504319,1829568531,1829585199,1829617690,1829634090,295190960, 1829650448,1829666842,701055013, 1829683284,1829715989,986267660, 1829732378,1829748751,1829765142,1829782351,1829814278,563724354, 1829830672,10829845, 1829847062,1829864463,1829912602,264946139, 1829929591,1829961730,1829979158, - 1830027330,1830060705,1830109210,3473414, 1830125622,1830158830,731037734, 1830191135,474071077, 1830216361,1830327748,117424144, 1830371354,1830388563,216727590, + 1830027330,1830060705,1830109210,3473414, 1830125622,1830158830,731037734, 1830191135,474071077, 1830216361,1830327748,117424144, 1830371354,1830388563,216727590, 1830453314,1830486032,392642586, 1830511274,1830621419,1830666255,1830682646,1830699020,1830715413,49709058, 112607286, 1830731883,1830767865,1830822571,1830888108, 1830995942,1831043110,1831059472,176308266, 1831075866,1831092236,52723719, 1831108660,113459212, 1831141414,1831166637,1831223318,1831239692,1831256074,1831272479, 52723741, 1831288858,1831305218,1831321610,1831337990,1831354409,564412428, 1831379630,1831485480,677724198, 1831501890,1831543471,43384863, 1831633433,1831698451, 1831716879,1831780368,1831796746,1831813177,278937612, 1831838384,1832026959,1832059182,1832093171,1832124482,1832157408,1832189954,1832206346,1422952210,1832223208, 575668253, 1832264369,10584194, 1832323887,1832420280,349585951, 678954747, 1832468546,1832510130,1832599645,1234534459,1832657587,1832763473,164233326, 1832801716, 463470651, 1832861762,1832896937,1832927234,1832943654,1832960037,1832976403,50315266, 1833001652,1833074704,635912245, 1833093603,1833124442,1833156692,1833190430, - 220537525, 1833231030,79101962, 256655663, 1833336914,1833378487,1833484304,1833504844,494045370, 1833550350,345145403, 1833591480,5324898, 1833697713,47251485, + 220537525, 1833231030,79101962, 256655663, 1833336914,1833378487,1833484304,1833504844,494045370, 1833550350,345145403, 1833591480,5324898, 1833697713,47251485, 1833730585,1833795640,366854991, 299417610, 1833828835,1833861151,126500880, 1833886393,1833964395,119358376, 1834017466,777961500, 1834050235,2195994, 1834106972, - 2113578, 593068069, 1834590908,1834713935,1834746563,1834803901,33243152, 201523250, 1834844162,1834861130,11059207, 401736098, 1835098815,1835173352,133611523, + 2113578, 593068069, 1834590908,1834713935,1834746563,1834803901,33243152, 201523250, 1834844162,1834861130,11059207, 401736098, 1835098815,1835173352,133611523, 1835221839,533397972, 1835253766,1485013032,1835271617,147062811, 1835310407,1835410112,1835517274,1835557569,755056642, 1835918018,1836042129,897311427, 1773388762, 1836073037,2196513, 1836106914,1836172787,1836212932,757628938, 1836358968,1836401111,732930757, 172638743, 1836435097,1836491462,1836614686,173965314, 1836646431, - 1836662795,1836679170,1836695571,1836711973,757727263, 867794975, 323731886, 1836729903,1545142743,1836802759,70729737, 1836945798,1836992526,1837048520,753680400, + 1836662795,1836679170,1836695571,1836711973,757727263, 867794975, 323731886, 1836729903,1545142743,1836802759,70729737, 1836945798,1836992526,1837048520,753680400, 392265740, 1837154358,1837195977,1837253662,1837285481,833863686, 1837318160,1837343434,1837630200,122601514, 1837663222,743096342, 1837696500,1837744212,1837777004, 1837809676,1837826053,212860940, 1837851339,1383940127,1837916876,1837973519,121651240, 1837989909,1838006298,1838022672,1838039078,54460454, 1555136524,1838055515, 1838088204,1838104595,1808121877,1838120991,1838138398,1838170872,1838202882,1838220680,626540580, 1838252044,117833754, 1838268719,20365340, 1838301238,1838333990, @@ -3537,19 +3532,19 @@ static const unsigned int DictNodes[84251] = 1838989340,47530024, 1839005698,126287929, 1839030990,27623899, 1839366236,361283668, 1839398979,1839483349,1839514654,1839548355,1839595586,1839637199,1839775760, 1839792169,1839809066,1839824917,1839841302,1839857676,1839874602,420249626, 124928022, 1839894061,297353218, 1839940043,1839997648,1840037904,118884373, 1840054731, 2998274, 1840103455,1840119820,1073872934,1840137300,435323104, 1840186280,1840218649,805142549, 1840283951,1840316719,1548239319,148637900, 1840358097,1840448090, - 1840480287,509870095, 138395674, 1840505554,1840562286,1784905764,1840595481,1840660532,1618231317,1840698847,1840751315,1840908177,1840947924,479133727, 426934278, - 1840989090,1841020964,1841038326,1841070083,103743500, 1841095381,1841185041,522485762, 2195890, 265797638, 158532011, 1841226454,379093023, 1841332538,292110452, - 1571930415,1841373911,408831348, 236668356, 7734874, 1841472216,480395345, 1841521369,1841659906,225181734, 718621825, 1841676309,1841701594,905871441, 131334730, + 1840480287,509870095, 138395674, 1840505554,1840562286,1784905764,1840595481,1840660532,1618231317,1840698847,1840751315,1840908177,1840947924,479133727, 426934278, + 1840989090,1841020964,1841038326,1841070083,103743500, 1841095381,1841185041,522485762, 2195890, 265797638, 158532011, 1841226454,379093023, 1841332538,292110452, + 1571930415,1841373911,408831348, 236668356, 7734874, 1841472216,480395345, 1841521369,1841659906,225181734, 718621825, 1841676309,1841701594,905871441, 131334730, 1841775439,1841807444,1841840154,1841856578,1841889326,1841938916,1841987586,1842005580,1842053132,1842070972,1842120370,180879416, 1842160347,1842275036,1842364454, 866844756, 1842380838,444153872, 1842406109,406028888, 1842504414,1842561062,1842577858,5865502, 304833247, 1842610260,1842643051,1842684640,1842848481,1842979554, 1843258083,1843351177,8389234, 958595177, 1843464771,172843748, 1843511355,1843544095,1843560529,1843593303,366575654, 1843642905,1843716837,1843806292,1843839092, 204980243, 6897901, 1843855465,1843889035,1844323047,144048154, 1933340, 1844447337,1844552424,1844592943,124862924, 1844627159,1479656257,1706704922,1844723758, - 1844775053,1844830953,1844939109,1844992173,1845035609,1845076714,1845297455,1845330910,149815312, 1845388011,1845453548,1845495438,57950248, 1845559322,16597076, - 1845575764,17843515, 1845609985,1845682925,8389718, 176963672, 1845843668,1845940134,1845990456,1846035350,1846092526,47251494, 719847426, 1846158063,510251691, + 1844775053,1844830953,1844939109,1844992173,1845035609,1845076714,1845297455,1845330910,149815312, 1845388011,1845453548,1845495438,57950248, 1845559322,16597076, + 1845575764,17843515, 1845609985,1845682925,8389718, 176963672, 1845843668,1845940134,1845990456,1846035350,1846092526,47251494, 719847426, 1846158063,510251691, 1846329403,1085277105,1846362134,250970114, 46497804, 1846387440,1846649585,306446796, 1846758602,1846820948,1846862578,1007206442,1846975275,16810027, 1847033887, 1847050283,1847091955,1847246860,3555354, 232292383, 144949279, 1847264079,1847297523,1847337716,1847510077,8396975, 1847574587,1847609590,1847656458,1847681781, 332742687, 1847754806,1035190291,1847796470,1847869713,1847911159,1847967798,896532783, 1848001592,1848066135,1848124152,140247099, 1848222457,487031087, 1848279080, - 1848295436,1848311829,490881040, 1848329384,1848377356,1848396993,1848451834,1848509449,1848542099,1848590367,497319946, 1848606779,1848639541,1848672293,345473090, + 1848295436,1848311829,490881040, 1848329384,1848377356,1848396993,1848451834,1848509449,1848542099,1848590367,497319946, 1848606779,1848639541,1848672293,345473090, 1848697595,1848845052,1848887235,1848943357,1848999945,84246659, 1849021227,1849082768,1849467647,1849672110,1849720874,1849737253,1849753602,270516252, 1849778944, 426869211, 5308508, 1849844481,1849910018,1849966679,1850022586,4997225, 1850090243,1850262337,1850300973,1850376202,1085784106,824672310, 1850396808,1850425346, 1850441754,31424527, 1850467076,12648585, 8397573, 1850729222,1850769410,1850785833,29376533, 1850802235,3227755, 1850835880,226951204, 1850868766,1850909447, @@ -3557,22 +3552,22 @@ static const unsigned int DictNodes[84251] = 1099104268,1851384585,1851637842,1851670568,1851686938,1851703362,1851736976,1851768875,1851810570,111132703, 1851886059,1851932732,1852015566,1852047387,1852081040, 25559399, 342606250, 1852121867,658112543, 1852211230,1852243994,1852261244,154471088, 1852309506,357285914, 1852334860,2197990, 1852442060,1852480832,1852572075, 1852613389,1047511055,1342504962,1852751888,1852768277,1852784642,1852801618,17809430, 1852818295,1852859150,1852973839,1853055760,1853219601,143294688, 1853276449, - 167904134, 1853317906,1853374523,1853407262,1853440012,1853456422,27607046, 1853481747,1853645588,1853727509,1853817265,1853850540,1853916545,1179845544,298270751, - 1853965250,1853998110,1854030277,1854071574,1854160949,493649926, 363659840, 1854193704,1854210060,109166630, 1854235415,1854546712,1854767563,1854817192,176488486, + 167904134, 1853317906,1853374523,1853407262,1853440012,1853456422,27607046, 1853481747,1853645588,1853727509,1853817265,1853850540,1853916545,1179845544,298270751, + 1853965250,1853998110,1854030277,1854071574,1854160949,493649926, 363659840, 1854193704,1854210060,109166630, 1854235415,1854546712,1854767563,1854817192,176488486, 1854849132,1854883315,1854916083,1854947409,1854980526,1855029258,357285909, 1855045664,1855078484,1855111227,1855144415,1855177007,1855218457,1855292500,1855349530, - 158812539, 1855438850,149129063, 1855456079,858865748, 232375143, 1855488471,1855520822,1855553574,1855569922,19267661, 1855586350,552878106, 759710225, 19252864, + 158812539, 1855438850,149129063, 1855456079,858865748, 232375143, 1855488471,1855520822,1855553574,1855569922,19267661, 1855586350,552878106, 759710225, 19252864, 1855636872,1855668240,11075610, 1855684610,1855707806,1856086811,1856241721,1856258060,1856274442,701333525, 1856290847,915472426, 1856307221,1856323606,1479622682, 1856339983,1856356378,984317968, 1856373623,1856405530,1856421919,1856438300,56492072, 1856454668,1856471062,1856487426,1856503865,1856520258,1856553825,1856587015, 1856685510,1856733203,1856749608,111542310, 1856765978,1856782768,1856815163,1856848175,1856881749,678264844, 1856913446,1856929794,1856946186,128582594, 1856971548, 1857077260,198755066, 1857102621,1857159179,1857175592,126697482, 1857192445,1857241100,119242767, 16236584, 1857257493,1857273882,31424552, 51855372, 1857290306, 1857323053,1857355788,1857372162,358760458, 1857388686,1857421354,1857437706,1857454096,1857470470,36405314, 828096524, 1857494174,1857570068,1857626910,1857716331, - 1857749425,456949776, 1857781847,1857830994,684581663, 1857863706,1857880085,141459496, 1857896524,1106018361,1857938208,1858102049,1858175189,1858207824,30392322, + 1857749425,456949776, 1857781847,1857830994,684581663, 1857863706,1857880085,141459496, 1857896524,1106018361,1857938208,1858102049,1858175189,1858207824,30392322, 404046760, 207618507, 325075003, 1858240620,1858273296,1801241478,1858298658,1858396963,1858453507,312279052, 1858469900,1858486282,1858502677,1127727135,1858520940, 1858551877,1858584592,1858600986,192479243, 1858617356,1858633754,1858650127,1858666522,1017774092,1858682920,532676637, 1858699801,1247969318,1858765654,1858815083, - 1858847245,843350044, 1858895960,1858928669,213041183, 1858945327,1858977848,967901186, 1859010647,1859060594,1859092516,1859108874,1859125680,1859158776,700825602, + 1858847245,843350044, 1858895960,1858928669,213041183, 1858945327,1858977848,967901186, 1859010647,1859060594,1859092516,1859108874,1859125680,1859158776,700825602, 1859191631,1859223562,1859239952,949518376, 1859256360,56492048, 1859273229,162186440, 1859330852,1859371034,1859387404,1859403782,1859420172,1859436554,1859452949, 123847115, 1859478309,1859670278,1286520834,1859756838,440861132, 1859829770,1859847411,1859898134,1859928367,1859960847,851574799, 1859977247,182632469, 1859993640, - 1860010744,660275231, 1860042806,1860076574,156434444, 1860117287,1860199208,1860338155,1860370498,176177623, 1860403226,1860428585,1860487747,1860534284,531611730, + 1860010744,660275231, 1860042806,1860076574,156434444, 1860117287,1860199208,1860338155,1860370498,176177623, 1860403226,1860428585,1860487747,1860534284,531611730, 1860552249,1860650014,277856262, 1860683310,374800405, 1860739882,1860813919,1860878365,1860894732,1860911130,1860927494,1860943893,1860960340,1860993034,1861009437, 282821083, 281264130, 1861034795,1861256222,2147249, 1861287958,1861313324,1861404296,1861451884,900759911, 1861493549,1861583151,6619607, 1861615725,1861651111, 1861706542,1861763094,1861779472,1861795850,1861812253,1861828634,1861845023,1212055636,1861861913,2147358, 122601501, 1861935919,1861976080,525172762, 1862001456, @@ -3582,51 +3577,51 @@ static const unsigned int DictNodes[84251] = 1863518084,1863582147,1863614523,366806071, 1753117, 1863656248,1863713071,1863745623,1118520350,1863803705,1863893002,1863909404,40550410, 1863925853,1863975966, 1818181661,1864007796,38879272, 1864033082,88555542, 1864106532,47923229, 1864140748,1864272104,1864319513,1864387337,1864433667,1864452090,33161231, 1864482845, 1864499203,901742623, 210272266, 1864524603,1864679555,1864695939,3309569, 1864712307,59228290, 126764141, 1864737596,1864777739,1864794698,24298058, 1864830834, - 2524147, 282853391, 51314695, 1864885053,1864941625,1864957971,1094877191,1864974386,2195757, 128106533, 1865474879,1865614248,1865646082,1232748554,191644568, + 2524147, 282853391, 51314695, 1864885053,1864941625,1864957971,1094877191,1864974386,2195757, 128106533, 1865474879,1865614248,1865646082,1232748554,191644568, 1076512797,2015268, 1865671488,1865794535,1865842714,339625045, 1865860595,1865900865,1865966402,253624544, 52363293, 1866048323,1866157436,1866188578,1866219950, 344850438, 1866269432,1866301899,2202680, 158613507, 1866359616,5341706, 1866481674,1866498090,1866515238,1866549943,1866596364,1866612746,201572373, 1866629132, 1866645507,62341160, 1866667024,1866711082,94568460, 1866736452,1866949445,173113385, 115163167, 1867006018,1867038836,51937296, 1867059077,1867146054,1867244359, 1867317269,1867333719,1867383709,1867466136,1867522888,1867596264,850256713, 466993190, 1867637578,126763051, 1152811046,1867743298,2195985, 1867780206,1867825212, - 1867907154,1867939852,1867956262,441335820, 1867981643,1868169309,110231597, 348651547, 1868218476,1868251181,1868284354,1868325708,1868384342,1868456781,35864711, + 1867907154,1867939852,1867956262,441335820, 1867981643,1868169309,110231597, 348651547, 1868218476,1868251181,1868284354,1868325708,1868384342,1868456781,35864711, 1868546585,115785749, 1868620622,1868784463,1868841807,6455306, 1868873821,1868922923,1868955686,1868973065,19251266, 398753830, 2129974, 1741062249,1869013840, 1869210449,1869383439,5308443, 1869438836,1869496379,158695453, 152027165, 1869529967,1869587282,1869652819,1869710153,159055931, 1869758574,1869800276,1869889602, 1869931349,1870053679,1870088952,1870156297,1870200858,1870217282,1870250896,1870282768,166069136, 1870308182,1870364723,431243786, 1870406487,249708560, 1636532255, 1870455640,131891632, 1870603097,1870881626,319144065, 147063731, 1870974033,729907637, 1871086476,383320086, 991101035, 1871135157,1871176539,543391784, 1871323996, - 1871380939,404242954, 1871437770,1871520605,1871609955,8390044, 1871644161,1871708214,44302362, 1871746256,1871864670,1872003563,1872038447,353239124, 110249854, + 1871380939,404242954, 1871437770,1871520605,1871609955,8390044, 1871644161,1871708214,44302362, 1871746256,1871864670,1872003563,1872038447,353239124, 110249854, 1872101475,1872134673,170999847, 1872175967,1872282059,1872339808,1872414985,1872461840,2199909, 1872487265,1872552802,124469355, 1872642067,264650771, 1872659358, 1872691229,958775308, 1600323596,4112386, 1872716643,1872920616,51314822, 1872938095,171966493, 1872969738,1872986600,1873022593,666026010, 47595530, 1873089097, - 172837020, 1873159012,526368780, 1873202109,1585725442,1873265165,1873313802,1873330178,129269798, 1873666918,237732440, 56164362, 1873842349,1873888415,110052240, + 172837020, 1873159012,526368780, 1873202109,1585725442,1873265165,1873313802,1873330178,129269798, 1873666918,237732440, 56164362, 1873842349,1873888415,110052240, 199869263, 1873929063,1874018798,1874052120,1874101516,1874150600,1874182210,1874214938,1874231728,1874265078,1874305896,201523280, 195264514, 1874444375,1874493547, - 1874526250,1874542630,1874558978,383483933, 1874584425,1874624543,1874640908,1874657321,27852841, 110215267, 1874682730,1874830187,216467612, 1874895724,108707871, - 1874970233,1875026797,1875117385,1875174254,1875280014,231768070, 1875312661,1875329055,137101414, 1875354479,1875420016,1875673278,282853378, 1875738708,188105383, + 1874526250,1874542630,1874558978,383483933, 1874584425,1874624543,1874640908,1874657321,27852841, 110215267, 1874682730,1874830187,216467612, 1874895724,108707871, + 1874970233,1875026797,1875117385,1875174254,1875280014,231768070, 1875312661,1875329055,137101414, 1875354479,1875420016,1875673278,282853378, 1875738708,188105383, 1875771479,1398128666,1875820570,188581156, 1875846001,1875977074,1876053026,3228249, 1876124531,1876215164,1876279355,1876312080,1876328486,508870694, 1876353908, 1876525140,1876559060,1876623419,155975720, 1876656144,1876672538,1063536091,1876689421,1876747125,1876921828,1876976502,8602013, 2195589, 1877164269,1877196816, 1877213224,798261269, 1877230105,1877295186,500531316, 1877328905,1877369719,1877648248,1877737498,1877753872,1877770251,223363131, 1877786711,1877839989,1877868582, 1877885217,1877917838,1877950514,1877983234,1878000763,31424523, 1878032814,1878081592,272384042, 171835414, 267567146, 1878114370,171835418, 1878150120,1878196226, 1878214003,1878245395,1878261798,200556556, 1878278151,783433764, 1878297789,1878344138,1878376919,223313958, 1878409254,1878426518,1878476829,1878524775,1878556691, 1878573075,1878589462,836517890, 1878605862,1878622246,198852610, 1878647673,185384972, 1878704138,1878721926,9388044, 1878787166,1878844282,1869545526,1878926203, - 1879052678,1879106428,292421658, 1879188349,1879230923,1879278794,1879326746,172843902, 1701740560,1879352191,1879679872,29622274, 1879872009,1879916603,566018930, + 1879052678,1879106428,292421658, 1879188349,1879230923,1879278794,1879326746,172843902, 1701740560,1879352191,1879679872,29622274, 1879872009,1879916603,566018930, 1879958401,246775892, 1880040322,1880155011,8390653, 110250675, 1880196327,1464254466,1880245160,1880286084,1880589397,1880622579,1880653836,32849962, 1880670511, - 1880703736,579354732, 1880737087,350912550, 17219649, 31211602, 193708116, 1880802721,1880850478,1880906632,1880948834,1880981516,1880997930,1881014298,136856399, - 1881030696,1773502502,1881047949,450594666, 1881129973,1424212880,1881203589,1881292812,49938448, 370999336, 47939600, 1881309250,1881341978,185319453, 62341160, + 1880703736,579354732, 1880737087,350912550, 17219649, 31211602, 193708116, 1880802721,1880850478,1880906632,1880948834,1880981516,1880997930,1881014298,136856399, + 1881030696,1773502502,1881047949,450594666, 1881129973,1424212880,1881203589,1881292812,49938448, 370999336, 47939600, 1881309250,1881341978,185319453, 62341160, 1881358382,47874088, 1245593626,1881407504,1881423974,1881457150,1881489434,1881506224,800228260, 1881547654,1881636918,1881670609,2933623, 911442157, 1881719214, - 1881768387,701169690, 1881809799,1881915408,219529227, 1881933729,1881990024,1882030139,1882062947,500695050, 1882096097,49086470, 1882144822,1882179777,5868410, + 1881768387,701169690, 1881809799,1881915408,219529227, 1881933729,1881990024,1882030139,1882062947,500695050, 1882096097,49086470, 1882144822,1882179777,5868410, 1802748425,1882226700,1245593626,1882243742,610287914, 1882277595,1882308620,1882325002,1882341397,1882359570,1882407342,1882465161,1882704618,1882753992,1882824750, 1882882100,185860111, 137101339, 1882914882,206471180, 1882956682,1883029513,1883046047,1883087755,1883308091,1883340884,1883376473,458981398, 1883439135,1883455971, - 1042022422,1883488258,161726501, 1883507015,1883554639,1917454, 1883586644,5327273, 45039626, 144097715, 1883628428,1883815961,1883848796,1883890573,619136149, + 1042022422,1883488258,161726501, 1883507015,1883554639,1917454, 1883586644,5327273, 45039626, 144097715, 1883628428,1883815961,1883848796,1883890573,619136149, 437256663, 1884021646,1884094490,1304608808,1884119951,1884300176,1884405766,328073231, 1884431249,1884520474,1884545938,25560188, 1884602434,1884635176,1884651586, 1885070228,1885323801,1885389343,1885439561,136119184, 1885521304,128974869, 1885578133,1885673587,5342071, 1885700115,8390272, 1885725590,1885800955,1885864538, 1885896770,1885938583,536939242, 1885979154,1886094672,1886151576,1886209110,1886257190,1886273839,1886306743,246628373, 116211763, 1886348185,1933324, 1886634287, - 1886666828,630801292, 1886702305,1886797908,1886839706,8390255, 1886921627,1887002698,1887060055,1887116328,1887232924,1887298461,1887454071,1887485954,44531722, + 1886666828,630801292, 1886702305,1886797908,1886839706,8390255, 1886921627,1887002698,1887060055,1887116328,1887232924,1887298461,1887454071,1887485954,44531722, 1887502423,1887552810,1887600714,1887666192,1887682586,1887698985,54460457, 1887715755,1887748108,117506857, 1887764502,1887780866,4998643, 453476404, 1887806366, 870663559, 1888010283,31424548, 1888048071,1459119007,1888117664,127631391, 1888206860,1888223521,1888265065,1888305689,1888372958,128451708, 316294065, 1888420270, 825558025, 150586398, 1888469451,1888518154,1888534570,1888551935,1888600552,1888641953,1888780817,136855636, 1888822178,1888918469,1888978092,1889028031,1889133475, 1889207521,24838155, 1889256533,1889288204,395345930, 1889304616,52740108, 1889321497,1889386534,140247121, 1889412004,3212787, 1889490286,394625108, 1889592229, 1889714188,1889732085,1889781781,176570399, 1889821606,141412838, 1889919911,1890092427,1890149288,1890205712,257130507, 1890231209,440352806, 948994050, 1890313130, - 1890402388,1890435531,134169711, 1890493355,1890804652,1890853805,471580712, 1890935726,1891008594,1891042463,1891074475,1891106882,1891139692,1891181487,125927465, - 214533810, 1891263408,425362279, 3869184, 1891369497,170197097, 1891436683,13238278, 1891509169,1891574706,1891631116,25560058, 1891647528,1891663938,167445394, - 1891696661,142868496, 1891722163,1891860509,107462668, 1891876923,1891914978,1891979825,191053840, 1892033460,1892164533,1892204546,2162745, 1892221688,179994662, - 1892257382,1892286466,56492042, 6374136, 1892311990,1892508599,1892614175,626540582, 765313036, 1892630540,1892646927,1892663298,1001586694,1892681052,65077250, + 1890402388,1890435531,134169711, 1890493355,1890804652,1890853805,471580712, 1890935726,1891008594,1891042463,1891074475,1891106882,1891139692,1891181487,125927465, + 214533810, 1891263408,425362279, 3869184, 1891369497,170197097, 1891436683,13238278, 1891509169,1891574706,1891631116,25560058, 1891647528,1891663938,167445394, + 1891696661,142868496, 1891722163,1891860509,107462668, 1891876923,1891914978,1891979825,191053840, 1892033460,1892164533,1892204546,2162745, 1892221688,179994662, + 1892257382,1892286466,56492042, 6374136, 1892311990,1892508599,1892614175,626540582, 765313036, 1892630540,1892646927,1892663298,1001586694,1892681052,65077250, 1892787128,1892859945,1342816296,1892876290,1892892710,332103718, 1892909082,1892934585,1893072936,1893089299,1893105701,879427650, 1893122064,1893138669,1893172622, 1893238725,1893269570,1893311418,1893385070,1893449738,168493161, 1893466171,1893498901,1893515351,1893573563,1893728282,324534288, 19417279, 1893753788,1893909327, 1893942119,134513162, 1893974035,1893990438,1894006850,1894039606,1894073162,515031467, 1894121510,5309352, 1303740431,1894146518,1894253956,289014231, 1894318146, @@ -3635,13 +3630,13 @@ static const unsigned int DictNodes[84251] = 1895834565,1895940399,199492417, 1895974473,669351961, 1896063942,1896162247,1896244168,48054288, 1896333378,1896375241,1896533531,343296181, 1896596374,1896644624, 1949701, 1896670154,1896759729,1896801227,1896908164,1896972347,1897005515,1897063372,1897210620,1897250844,1897267231,1897284642,1897316641,185959257, 1897349123, 1897365535,173359116, 1897383812,1897448360,1897483783,1897545774,1897604045,1897758736,2031751, 1897775587,474071066, 1897807883,1897824258,757399590, 1897849806, - 1898177487,1898271278,1898348781,1898381328,1898397701,57311242, 6225930, 1898414382,29655042, 1898446916,1898496002,462667786, 1898512696,1898545582,45629482, + 1898177487,1898271278,1898348781,1898381328,1898397701,57311242, 6225930, 1898414382,29655042, 1898446916,1898496002,462667786, 1898512696,1898545582,45629482, 179781634, 1898603472,1898661777,1898692695,1898741791,1898759070,1898800081,172622353, 1898882002,54657034, 1899085840,1899102218,258637865, 1899119785,1899151467, - 1899191284,1899216949,1899250266,1899282451,1899298854,1899315212,1899331721,32849929, 1899348006,1899364368,1899380774,740196364, 1899397141,160727062, 818069543, - 1899422675,24281906, 460521478, 249266292, 1899462675,69189658, 1899488212,1365491849,1899660297,1899692334,1949811, 1899724831,1899741195,1899757608,112787466, + 1899191284,1899216949,1899250266,1899282451,1899298854,1899315212,1899331721,32849929, 1899348006,1899364368,1899380774,740196364, 1899397141,160727062, 818069543, + 1899422675,24281906, 460521478, 249266292, 1899462675,69189658, 1899488212,1365491849,1899660297,1899692334,1949811, 1899724831,1899741195,1899757608,112787466, 1899774490,158171267, 4931621, 2202722, 1899806722,1899823119,62275586, 286294153, 1900249576,1900281858,64765958, 1900307414,1900397727,108511263, 1900429333, 51593238, 1900445698,323731563, 1900471255,1900593183,1900610987,1900658714,533774352, 1900680732,1900757426,519454742, 1900789997,1900822828,1900864472,1900922840, - 1900986419,1901019205,1901051958,388317282, 1901085149,1901126617,1901346854,1901363231,1901380455,1901412589,1901454298,1901559829,1901576214,237322261, 6701172, + 1900986419,1901019205,1901051958,388317282, 1901085149,1901126617,1901346854,1901363231,1901380455,1901412589,1901454298,1901559829,1901576214,237322261, 6701172, 230309926, 1901592588,319555383, 1121763382,1901609390,1901663438,1901707295,1901724162,5505066, 1901765595,1901903910,1901925309,1901969446,1901986825,1902018586, 1902034982,125239308, 1902060508,1902100502,858865718, 1902116876,205815818, 1902133269,116375606, 1902150127,47105937, 1902191581,1902252057,1629290527,1902347273, 1902381072,1145536524,470958118, 1902437342,150537246, 1902627226,132158553, 480903178, 1902706700,45433947, 1902723074,1902739556,1902772230,94601218, 1345749051, @@ -3653,18 +3648,18 @@ static const unsigned int DictNodes[84251] = 1905868831,344506406, 1905894377,1905983490,117833738, 1905999910,1906016272,1906032693,1906065446,1906081813,1906098216,1906114586,635273218, 1906130975,1405665639, 1906147349,216776726, 1906163755,1906198235,56492044, 1906229258,647938067, 1906246091,1906295899,1906327562,1906343978,1906114600,1906360407,1906409556,1906442261, 1906458655,1906475024,576225290, 5292043, 1906500586,1906573416,1906622910,1906689115,359514153, 1906723619,1906770353,1906802991,1906835483,1906868240,1906884627, - 1906901004,1906917382,1906933766,115360591, 1906950170,134709263, 1906966612,1907008491,27344906, 1907057644,465321990, 1907114010,243679244, 1907130427,980975642, + 1906901004,1906917382,1906933766,115360591, 1906950170,134709263, 1906966612,1907008491,27344906, 1907057644,465321990, 1907114010,243679244, 1907130427,980975642, 1907163152,55033867, 1907179979,1907230256,1907264013,1907311987,1907352557,1907478743,1933317, 1907540414,1907605602,1907640506,1907673439,1907729390,1908024303, 1908073456,1908171761,1908319218,240591859, 1908490333,163643473, 48136204, 1908541049,342606358, 1908588563,1908604950,1908621371,1908663284,1908741362,1908827125, 1908965877,1908998159,1909014831,165724397, 1909049125,1909097373,1909179345,151732240, 1909231889,1909335030,1909392207,19595274, 1909424140,1909440538,1909460603, 1909515255,1909588110,1909620746,1909637158,173850664, 1909653516,1909669981,1909719985,1909754622,339296268, 1909793784,1910105081,1910325250,162186992, 1910343000, - 1910391008,913834006, 518783042, 760955919, 1910426537,1910472788,204537892, 62341122, 1910507026,1910555056,1812825027,1910587451,1910620198,1910636546,1982506, + 1910391008,913834006, 518783042, 760955919, 1910426537,1910472788,204537892, 62341122, 1910507026,1910555056,1812825027,1910587451,1910620198,1910636546,1982506, 1910653034,1910734955,1910769588,874234770, 1321862409,1910856747,1910924282,1910964236,1910980620,1910996998,312393756, 234340807, 1911022587,392217034, 1911095821, 1911144532,110216001, 1911180592,1911226390,1911251964,1911317501,1911375417,1911472995,260459008, 1911523712,180682860, 1982502, 1911589725,1911619612,1911635999, 1911652381,6602794, 1911673263,1911717919,1966109, 1911743486,1911825407,115523626, 1911865776,158533057, 621478319, 1911907328,1912163962,194953238, 1912245264, 1912356946,1912390169,1912455255,1912504779,1912555248,1912586259,1612414978,303661068, 1912611841,6947248, 1912668198,1912684609,1667465298,1912733702,1912750117, 1912766476,577028134, 1912792066,52674572, 1912930357,1912972291,503709722, 6537298, 1913094381,1913136132,1913283589,429834259, 1913504147,1913552934,1913572868, - 663584770, 1913651216,1913667605,1913683980,56442886, 1913700452,1913733149,812957727, 1913753085,1871577151,1913791494,1913897388,1913971719,1914029065,10829866, + 663584770, 1913651216,1913667605,1913683980,56442886, 1913700452,1913733149,812957727, 1913753085,1871577151,1913791494,1913897388,1913971719,1914029065,10829866, 1914070024,1914109983,25559142, 3253257, 1914126374,181175324, 81756200, 1914151946,1914241117,1914299403,1914372108,1657028613,1914392951,117424170, 1914463244, 1914594317,19267887, 1914683434,1914709006,8397839, 136118401, 371311855, 1914901346,1914945636,354697228, 1914979175,1915020304,1915233297,312033582, 1915322380, 1915338762,1915355202,1915387906,1915404325,73531429, 425574422, 1915421586,1915479058,1915551851,760955368, 1915584538,1915602592,7094698, 134774810, 1915634718, @@ -3672,75 +3667,75 @@ static const unsigned int DictNodes[84251] = 56524811, 1916076034,1916092437,1916108821,1916125224,162627599, 1915305989,1916150804,1916207680,1916248760,1916363797,1916403753,1916420098,1916436506,1916462102, 8392887, 1916504445,1916593175,1916633098,24068122, 1916658712,1916707865,1916780575,1916796949,125239301, 1916813447,1686110209,1022361606,1916830567,1916862495, 1916878890,903348245, 1916895235,1916911631,333496341, 1916937242,1917339153,1917372187,1917424970,1917502573,1917534432,240189462, 1917567048,1917633318,1917665312, - 1917699128,1917764638,1917796354,152027148, 1917821979,1917894658,1917911059,1917927445,160743436, 1917943846,725909506, 1917961101,1918051356,1918124879,462767013, + 1917699128,1917764638,1917796354,152027148, 1917821979,1917894658,1917911059,1917927445,160743436, 1917943846,725909506, 1917961101,1918051356,1918124879,462767013, 1918156806,1918173652,1918206094,1918239023,1918276588,178569358, 47366156, 1918362653,1918402616,1918435365,168935460, 1918451741,1918468103,1918484501,1918500883, 59375623, 1918526494,836796418, 1918588864,1918648332,44662812, 1918665758,1918697474,17448991, 1918715581,1918805023,110298410, 6375610, 1918870560,1918911477, 1918976010,1918992390,1919008799,107462666, 1919025208,1919067169,1919172658,44302348, 1919213623,1919254533,1919270928,1919287322,1138229285,1919304586,1919336460, - 454656026, 1919357020,1919452007,1919483930,179142685, 1919500591,140247528, 1919533121,1919582214,1919598598,1919615283,283082768, 1919648842,1919689762,2408467, - 8389571, 1919886371,6373442, 1919943115,1919991827,687030303, 1920011229,110298380, 1920066596,1920221275,1920254977,1920303170,116228103, 1920345125,173359120, + 454656026, 1919357020,1919452007,1919483930,179142685, 1919500591,140247528, 1919533121,1919582214,1919598598,1919615283,283082768, 1919648842,1919689762,2408467, + 8389571, 1919886371,6373442, 1919943115,1919991827,687030303, 1920011229,110298380, 1920066596,1920221275,1920254977,1920303170,116228103, 1920345125,173359120, 1920401410,1920417811,134840332, 1920435089,1920483354,1920501126,1920565780,1920623654,1920686845,1656160688,1920754727,1920853032,1920909417,1920942180,1920975278, 1448706074,1921024005,1921040400,1921056794,1921073190,24969245, 1921089548,33243151, 1921672234,1921770539,1921810434,246628363, 1464254500,1921836076,1921941515, 1026048042,1921957909,1921974294,4161667, 1921990843,1922023433,744423445, 58736669, 1922039829,1922056221,1922072710,766951452, 1922088966,1922105381,1922121769, - 160727046, 1922573357,1922704430,1922884640,1922924636,6946870, 126074882, 135413790, 1922958858,1923015727,410435615, 121077779, 1923114032,1923285295,572997658, + 160727046, 1922573357,1922704430,1922884640,1922924636,6946870, 126074882, 135413790, 1922958858,1923015727,410435615, 121077779, 1923114032,1923285295,572997658, 47530022, 1923327025,818184495, 1923416095,1717731347,1923432474,259129375, 1923449267,1923481610,1923497986,1923514406,1923530818,27246604, 354369548, 1923564629, - 1923596317,89063440, 1923621938,163725405, 1923867699,5325260, 1923991566,110232485, 179897821, 1924047924,136118806, 102858764, 1924161278,1924202967,2204725, + 1923596317,89063440, 1923621938,163725405, 1923867699,5325260, 1923991566,110232485, 179897821, 1924047924,136118806, 102858764, 1924161278,1924202967,2204725, 1924244534,1924350033,79773920, 1924391991,245792771, 1924473432,1924514472,1924555832,1924752441,1924907010,1924923413,1924939797,287490079, 1924965434,1925006679, 1925063739,1925139374,1925202340,624181267, 752058790, 1925235159,1900573, 1925270064,113689047, 1925316692,289046550, 398753794, 1925358652,2196382, 1925424189, - 1925595579,215187487, 112182383, 1900575, 1925661660,1925693692,2523157, 1925735486,163725377, 1925943074,1926021204,1926054191,2506754, 1926095935,451609747, + 1925595579,215187487, 112182383, 1900575, 1925661660,1925693692,2523157, 1925735486,163725377, 1925943074,1926021204,1926054191,2506754, 1926095935,451609747, 1926168588,1926185068,1926227008,1926334889,546931497, 7634960, 1311424540,1926374465,1926538306,72351766, 1926725697,157188178, 1926775384,1926809362,1926857143, 406634710, 1926898755,1926955030,892878879, 1926971411,1926987798,892878860, 1927005742,1927053322,1927069708,1927086099,56262678, 1536081942,1927111748,1481801738, - 1927266388,1927299503,1927332601,1927364654,1927415445,1927480393,165134343, 1927521349,1927767110,5080516, 1234946069,1927858108,1927938285,1927970837,160006166, + 1927266388,1927299503,1927332601,1927364654,1927415445,1927480393,165134343, 1927521349,1927767110,5080516, 1234946069,1927858108,1927938285,1927970837,160006166, 1927996487,143720486, 1928102113,1928143944,1928216630,1928249428,52527110, 1928291401,1928537004,1928580506,1928642620,1928724582,162185272, 163317144, 1928758184, 1928790776,1928832074,1928888779,1928937918,1200147122,1929004041,1929045067,1929166907,394412053, 1929199618,1929216026,1929232405,1929248799,47530003, 1929265996, - 1929314607,1929347098,1929363496,1929379859,938213397, 1929396825,395444243, 1929430681,1218019430,1929487436,1929610800,1929641986,1929658383,1929674783,2506780, + 1929314607,1929347098,1929363496,1929379859,938213397, 1929396825,395444243, 1929430681,1218019430,1929487436,1929610800,1929641986,1929658383,1929674783,2506780, 170704995, 1755791362,313787201, 1929691155,439156773, 193839135, 348651563, 153567254, 1929716813,169329750, 1929798734,1929970839,1930019724,1930067989,1930084846, 1930117122,448544806, 1930133983,1930166298,1930182658,493666342, 1930199131,1930231874,1930266308,1930332095,135824393, 1930428428,191053853, 213975061, 1930454095, - 1930493974,1930510364,241942530, 1930527023,112197661, 1930568784,1930896465,1931034655,1645264907,1931051030,1931067423,57032709, 1931083778,1931100170,171000111, + 1930493974,1930510364,241942530, 1930527023,112197661, 1930568784,1930896465,1931034655,1645264907,1931051030,1931067423,57032709, 1931083778,1931100170,171000111, 1931117391,1931149318,1931167506,1931215761,1931264481,1931313164,52805647, 1931334549,1931411547,1931444426,1931486290,110233178, 1931558943,5309328, 1931576321, 1931624450,1527332920,1931640919,1536835641,1931693429,176488458, 1931739220,1931779635,1931821058,410517514, 1931839509,1931879507,29261846, 1931975525,1932017680, 1932034312,1932083503,244056130, 1932125268,1932378139,1932414217,1932461122,1932525594,1932550883,2195614, 2195636, 1932649557,1932738670,297304104, 1932780630, 6619166, 1932846167,1932919087,3555368, 1932952007,1933001510,1933034381,1933115445,158255529, 162580190, 1933157464,1868693510,205946890, 1933247628,1933304921, - 1933361365,1933394178,1933426818,8389183, 1933443093,109166623, 1933468762,1933681755,1933836546,18759818, 1933878364,1933968756,1934021656,1934082050,115523700, + 1933361365,1933394178,1933426818,8389183, 1933443093,109166623, 1933468762,1933681755,1933836546,18759818, 1933878364,1933968756,1934021656,1934082050,115523700, 1934107741,1934164958,172835059, 1934213142,1934229570,1923596309,1934271582,1934311508,1934344238,1934394398,1934435423,585809979, 1934517344,1934589962,1934615649, 1934688294,1934713954,1934804376,1934855452,150798768, 1934917654,1934934028,1934950402,55148565, 1934966850,1935001539,1935049879,1935097858,55033884, 1935114316, - 1935148794,1935183541,1935261795,1935295001,1935360081,1935402083,1935491984,1934855452,1712227642,1368293391,906625090, 1935533156,1935753218,305741862, 177963011, - 1935773869,199213077, 1935819179,1935851978,492823653, 1935887657,897335767, 152027176, 1935955294,1936015444,358907954, 8978451, 1936048159,1936073830,275152980, + 1935148794,1935183541,1935261795,1935295001,1935360081,1935402083,1935491984,1934855452,1712227642,1368293391,906625090, 1935533156,1935753218,305741862, 177963011, + 1935773869,199213077, 1935819179,1935851978,492823653, 1935887657,897335767, 152027176, 1935955294,1936015444,358907954, 8978451, 1936048159,1936073830,275152980, 1936113901,1936151790,1936254055,1545519958,1936360333,1936441461,133579179, 1936474158,1936523488,1936565352,150683650, 1936663657,1936769026,1936794730,1936834647, - 1936884200,1936918108,1936998402,1937014805,1937031977,1937063974,128106512, 1937084027,1937138795,25568364, 1937244244,859963430, 1937286253,1937394093,8393109, - 1937440804,1937457183,328073245, 1937482862,1937589033,1937623229,356122626, 1937686584,914016782, 2130004, 351617062, 1937728623,141606922, 1937785135,131334904, - 1937826928,1937949149,1937981450,1937997855,1938014265,1830060044,114540565, 581697577, 1938039921,2031635, 1938072690,7602183, 1938129199,1938170995,2195681, + 1936884200,1936918108,1936998402,1937014805,1937031977,1937063974,128106512, 1937084027,1937138795,25568364, 1937244244,859963430, 1937286253,1937394093,8393109, + 1937440804,1937457183,328073245, 1937482862,1937589033,1937623229,356122626, 1937686584,914016782, 2130004, 351617062, 1937728623,141606922, 1937785135,131334904, + 1937826928,1937949149,1937981450,1937997855,1938014265,1830060044,114540565, 581697577, 1938039921,2031635, 1938072690,7602183, 1938129199,1938170995,2195681, 1938334836,1938391171,11665540, 1938407562,1938440215,1938456707,8389773, 1938473094,13303943, 1938489382,1938505737,1938522227,39043081, 1602650401,1938547829, 851705862, 1938662518,11059238, 2588698, 1938703962,1938735114,1938751495,1785990, 11305094, 1939226636,1939243602,1939259407,1939275792,1939292189,1939309138, 1939324947,1939341334,1939357708,193593366, 1939383416,1939589650,1939639466,1939719520,1939784100,1939816460,1939832858,1939849237,576225302, 1939865616,1939882022, 1939898399,273858784, 1939924089,1940045855,1940062250,56492054, 1940080545,1940137082,3850252, 1940202619,1940324379,1940363813,223608854, 6029354, 1940422666, 2359728, 317374518, 1940442492,1940472267,1940521051,1940553750,1940570114,1940586525,1940602890,1940619276,303988739, 1940635732,247529949, 1940677756,1940818810, - 1940848646,1940865030,1940881711,1940914197,1940931913,1940979771,1941021821,1941127471,47546399, 1941160027,1941192720,1941218430,1941291010,1941307402,753631251, + 1940848646,1940865030,1940881711,1940914197,1940931913,1940979771,1941021821,1941127471,47546399, 1941160027,1941192720,1941218430,1941291010,1941307402,753631251, 1941333119,1941356555,47874079, 1941372959,120111551, 1941389314,226443290, 1941415040,1941618742,1941651466,1941667866,58769439, 1941684693,1941733678,1941766146, 1941782538,1941798941,1941815302,533397937, 1539325958,5308847, 1941833102,1574895627,1941906561,1942103170,1942274054,79626255, 1942297587,7733357, 1942323216, - 1942093850,1942340438,1942388748,1942414467,1942487094,1942529156,51838978, 1942634555,1942667567,1942702430,1942758455,139198490, 1942831203,1942863893,354549791, + 1942093850,1942340438,1942388748,1942414467,1942487094,1942529156,51838978, 1942634555,1942667567,1942702430,1942758455,139198490, 1942831203,1942863893,354549791, 1942889605,1943027794,1943060546,1943094240,980107330, 1943142412,1943158794,1943175180,47317020, 108314675, 1943191618,1943226155,420102165, 1943258539,1943306306, - 861406217, 1943339058,967622687, 1943371836,5325271, 1943453717,158810145, 1943471735,1943543850,1943610502,113229862, 1943699458,50036746, 1443971182,119055084, + 861406217, 1943339058,967622687, 1943371836,5325271, 1943453717,158810145, 1943471735,1943543850,1943610502,113229862, 1943699458,50036746, 1443971182,119055084, 1943725191,1943999282,1944077332,1666335944,1944126784,1944164041,1944207839,1944241450,332988457, 1944289308,1944305680,1944322101,1944359803,1944420378,1944439289, 1944485972,1944523542,958662297, 1944609928,1944698892,116228122, 1944715310,873645401, 1944772215,1944813580,1944829978,886505491, 1944848229,45498399, 1944904841, 1944961040,200720410, 1944977492,434192486, 1945019530,309641262, 1945158958,1945208377,1945306207,110234079, 6373483, 1945372475,1945429131,940900362, 1945478284, 1945632863,1945688179,129237008, 1945724045,309461471, 410566672, 436437023, 8393279, 1945796712,1945846361,1945878530,1945894931,9158771, 137150474, 1945911303, - 1945927716,1945944086,1945960460,1945976833,1945993245,1946009629,1946026099,1946042384,1946058753,1946075143,1946091556,1946107911,133611556, 1946124354,2147302, - 1946166414,2933156, 140247157, 1946239823,1946281103,1946452270,1946484738,1946501126,1946517510,1946533919,1946550291,348356911, 1946566749,1946615846,77512740, + 1945927716,1945944086,1945960460,1945976833,1945993245,1946009629,1946026099,1946042384,1946058753,1946075143,1946091556,1946107911,133611556, 1946124354,2147302, + 1946166414,2933156, 140247157, 1946239823,1946281103,1946452270,1946484738,1946501126,1946517510,1946533919,1946550291,348356911, 1946566749,1946615846,77512740, 1946632198,1946648588,1946664986,103989305, 29261845, 1946681380,160759819, 1946697787,1946731343,1946763799,1906098188,223838250, 1946796034,1946813414,1946851661, - 277053482, 1946927106,1946943712,1946977231,1947025424,219480074, 1947041846,1947074581,1947090956,1947107354,1947123728,575717379, 1947140108,1947156906,152354828, + 277053482, 1946927106,1946943712,1946977231,1947025424,219480074, 1947041846,1947074581,1947090956,1947107354,1947123728,575717379, 1947140108,1947156906,152354828, 1947189347,1947222032,394575887, 1947247760,254640166, 58949658, 1947337897,658620437, 1947370996,1947418732,1947452239,1947484614,1947526289,1947582504,1947599377, 1947631692,1947664818,626540584, 1947697162,1947713602,1947755666,112935426, 546636234, 1948050579,1948108562,452100399, 119439412, 1512865804,1948156441,1948221917, 1948263572,1948451734,1948500052,359432204, 1948533676,1948607637,1948714922,1948778522,65896464, 1948797841,1948896934,1948959151,3538986, 1948991554,1949024363, - 275316767, 1949066390,1949369168,930709540, 1949402898,50987046, 1949450816,1949483034,1949508759,1949581314,1949597706,1021820957,79757315, 1949615370,48136230, + 275316767, 1949066390,1949369168,930709540, 1949402898,50987046, 1949450816,1949483034,1949508759,1949581314,1949597706,1021820957,79757315, 1949615370,48136230, 1949646886,50413599, 1949663663,1949699605,202424842, 191682720, 1949777932,1949796773,1949843540,1949876250,1949892645,1949910491,1949990922,157024298, 1950016664, 1950065817,1950377114,1950467337,1950500894,1950547970,1950564362,254410781, 1950580758,367443970, 1950597174,1950631210,1950688411,1950744578,45498379, 1950763071, 1950793750,808960005, 1950812663,1950842946,1950876574,1950908500,1950941237,348782598, 1950974892,1951040864,115785765, 1951105456,1951137844,1951179932,1951219796, 1951252588,116228138, 1951294621,1951498250,226689026, 1951514651,1951547404,1951564658,1951596556,177553418, 1951612940,1951629350,1951645712,1405616143,1951662090, - 1951678493,1951694864,219578387, 1951711244,1951727626,1915355202,1951744011,1901740034,1951760400,1951776810,1951793584,1951826354,1951858731,1951900830,835780623, + 1951678493,1951694864,219578387, 1951711244,1951727626,1915355202,1951744011,1901740034,1951760400,1951776810,1951793584,1951826354,1951858731,1951900830,835780623, 1951973412,1951989766,264093727, 1952006160,942440469, 1952022564,1952038931,1952055318,1952072527,219627522, 1952113823,1952170015,1952186380,1952202762,1952219767, 1952251930,1952268330,1952284738,1952319622,1952366599,1952383007,1952399791,1952432212,1952464906,1952481286,1952497675,1952514079,1952530656,1952572576,1952645142, 169263109, 1952661646,1952694338,1952727070,1952760238,1952808998,1952825819,1952859544,144048138, 1952908491,1952940511,353812546, 1952972866,257966110, 1953014945, - 1953129634,1953185822,1953227939,1953326244,1953480746,226443266, 1953497119,1953513529,59228172, 1953530286,1953579030,1431650316,1953604773,1064321129,4997183, + 1953129634,1953185822,1953227939,1953326244,1953480746,226443266, 1953497119,1953513529,59228172, 1953530286,1953579030,1431650316,1953604773,1064321129,4997183, 1953684627,1954110615,1954171323,401606009, 1954300664,1954342054,112607313, 1954418546,1954464174,1954512922,1954532698,1954578516,1954611299,304627733, 1954643979, 1954660770,1954693579,45875238, 52723754, 1954746914,1954825039,648691724, 1954857000,1954873354,1032142877,1954890253,3719250, 1954938964,1954981031,1955046568, 1955103201,1955151914,177784008, 1955168310,1955201050,262684678, 1955217514,1955300562,6373813, 1955334165,145506316, 1955366286,1955430507,245301285, 1955472553, @@ -3754,8 +3749,8 @@ static const unsigned int DictNodes[84251] = 1958421686,1958577153,1958625379,1958658050,51675193, 1958674472,1958690932,1958707236,1958723700,1958740025,1958756373,336887818, 1958782135,1958821894,1958838308, 1958854697,1958871080,1958887540,1958903845,65896564, 1958929592,1959002169,1959018537,1959034890,1959051380,1959067685,1959084148,22478888, 1959104813,1455505437, 1959133194,1959149684,1959165974,581779484, 1959182355,1959198722,1959215220,1959231510,933625913, 2196304, 1959683257,1959821454,1959854106,1959870466,1959887402, - 1959903248,1959919626,1959936554,1959952405,1959968790,1959985164,1960002090,345784358, 119357919, 185483747, 1960024176,1960117737,1960165442,1960198904,373981224, - 1960231449,296600440, 1960305850,1960479351,1960542350,1960575018,163463208, 1960591597,1960633531,1960853741,1960886348,1121452994,225083414, 2539522, 169247246, + 1959903248,1959919626,1959936554,1959952405,1959968790,1959985164,1960002090,345784358, 119357919, 185483747, 1960024176,1960117737,1960165442,1960198904,373981224, + 1960231449,296600440, 1960305850,1960479351,1960542350,1960575018,163463208, 1960591597,1960633531,1960853741,1960886348,1121452994,225083414, 2539522, 169247246, 1960922305,127041963, 1960968276,1538719851,1961003003,1961099369,179339369, 1961132059,1961174204,1961246726,207627453, 1961272510,1961443541,1961476233,1961492614, 1961509418,1961525274,1961541644,1961558027,34799746, 1961577275,1961682111,198410269, 1836992290,296355254, 1961738777,152952198, 1961805602,1961836653,1961870921, 1961955184,79691792, 385499195, 1962009792,521617420, 1962134417,1962239169,1962344887,8390349, 1962386626,122116029, 654901269, 134168628, 1962509200,1962541068, @@ -3763,19 +3758,19 @@ static const unsigned int DictNodes[84251] = 1963278338,1963294758,1963312955,1963361300,1963418823,1963507714,184582184, 1963524155,1963556866,1963573267,159383574, 868220959, 1963590239,1963622431,1963638796, 1963656748,315277315, 1963688001,1963738414,1963795656,1963868170,7733304, 1963892981,1963950934,366905412, 1964008649,1964064811,1964101484,198721557, 1964156106, 667205648, 522485776, 1964254411,131891215, 1964326964,1964359699,1917796374,1964378676,1964410058,1964458015,1964474427,1964507165,1964523536,131891211, 1964540014, - 602980394, 1964582092,1964638220,1704984586,1964654699,1964696781,1964819192,1964851231,1964867643,1964900411,8395896, 1964933230,1964975310,1965047862,169263109, + 602980394, 1964582092,1964638220,1704984586,1964654699,1964696781,1964819192,1964851231,1964867643,1964900411,8395896, 1964933230,1964975310,1965047862,169263109, 1965089999,1965326805,563298344, 1965375490,50266117, 1965391979,141606954, 1965424642,404570117, 1965445681,637173802, 1965490608,1965524178,1917462, 1965555714, 1965572203,1965604930,1965638856,156369199, 1965670703,1965703598,1135116309,1965752791,1965785160,155779091, 1965851161,1965916658,919028298, 1965965350,1965982543, - 132644874, 1966015597,1966050511,319619084, 1966105808,1966253265,1966335186,1770864662,1966466259,1966526541,1966588724,1966637593,1966712020,1966817282,7733725, + 132644874, 1966015597,1966050511,319619084, 1966105808,1966253265,1966335186,1770864662,1966466259,1966526541,1966588724,1966637593,1966712020,1966817282,7733725, 1966843093,1966948889,1967023318,1967128633,1967149459,47611933, 852853468, 28590938, 187072617, 1967203543,1967390786,1269858314,140248002, 1967432920,1967514841, 1967718516,259129354, 1967737025,1967783938,2359305, 442253943, 1967800374,1967842522,185810960, 1967908059,1968128012,1968144406,1968160780,687931430, 1968186588, 1968292758,1968350429,1968390187,1968432350,1968505794,348864871, 1968547039,1968603615,1968635914,1968652317,1968668688,223002954, 1968687958,1968735732,1968792800, 1968865343,5505030, 1968907489,1969012779,1969054946,609714186, 1969143810,1871872027,191070227, 1969160194,1969176586,1969192962,2195703, 1969218787,1969438786, - 1969471490,4981543, 1969488175,1969530084,1969668180,1926742253,47611932, 1596031060,821887016, 1969702750,1969767454,1969799324,1969832051,19447831, 5324900, + 1969471490,4981543, 1969488175,1969530084,1969668180,1926742253,47611932, 1596031060,821887016, 1969702750,1969767454,1969799324,1969832051,19447831, 5324900, 1969848401,1969882142,1969913882,205144080, 1313357853,1969930286,1969988837,1970143254,1970163564,1970216285,1033519106,110477380, 1970274734,199458866, 1970326318, 1970398438,1970487308,1970503718,1970520102,1204289576,1970536529,1970569252,520388627, 1970586889,1970618390,6373952, 2200374, 1970637181,448462874, 1970718650, - 1970585619,116212745, 1970765921,162480888, 1970840807,1970946973,1581891586,1971037416,1971126382,1433092551,1971159056,210272294, 1971175440,1971191942,293715991, - 1971217641,1971404812,643629113, 1971424251,1671168041,1971463402,53559319, 1971504859,641531914, 1971539201,514605066, 1971571256,188957198, 1971607556,8978463, + 1970585619,116212745, 1970765921,162480888, 1970840807,1970946973,1581891586,1971037416,1971126382,1433092551,1971159056,210272294, 1971175440,1971191942,293715991, + 1971217641,1971404812,643629113, 1971424251,1671168041,1971463402,53559319, 1971504859,641531914, 1971539201,514605066, 1971571256,188957198, 1971607556,8978463, 1971643627,1907163176,1971725548,1971791085,1971879945,1852801156,1971897453,884737, 1971929953,1971961866,1971978454,66814166, 51838982, 1972437157,1972593903, 168493585, 1972701129,1577566246,1972757744,8389124, 1972863081,1972895810,5341408, 1972929430,1972987121,3211488, 1973060957,1973109168,1322444018,1973141570, 1973183731,1973265473,297373231, 1973420091,1973454651,140247148, 1068597762,1973501992,1973519145,1973560564,3900152, 116867990, 1973715028,918470696, 1973748472, @@ -3784,7 +3779,7 @@ static const unsigned int DictNodes[84251] = 1975189772,9912674, 1975248124,1975353753,9912723, 1975411965,20070973, 1975484553,113115299, 42287127, 1975501201,8175634, 1975533580,82001946, 1975550119, 1975608574,1975739647,1975795758,1975845407,1975903488,1975959583,1975975957,8398081, 1976001794,1422934904,137102761, 1976074327,1976123402,1554939910,1976149251, 1976277198,364446953, 2204932, 1976352875,1976385555,1976401958,700874754, 1976418775,1976451131,1976483948,1976517930,1976575237,1976878606,1976926210,1976942621, - 393363468, 1976959035,1976993408,1977040911,8159234, 341393410, 1977057382,1977091195,1977123729,5275674, 1977171974,144343046, 103989269, 1977188390,659914783, + 393363468, 1976959035,1976993408,1977040911,8159234, 341393410, 1977057382,1977091195,1977123729,5275674, 1977171974,144343046, 103989269, 1977188390,659914783, 1977204777,1977221136,1977237530,1977253899,1402093599,1977271390,1977319967,1977368588,1977384986,1977401355,1977417759,1977434122,209993759, 1977450527,1977466937, 1977483276,1977499674,258637830, 1977525510,1977614561,1977647135,1367867398,1977663943,382009354, 1406320656,1977713111,1977745465,648347650, 15007750, 1977761823, 1977778186,1977794572,1392836610,132841484, 1977811390,1977877613,1977909332,1977942037,787922975, 1977958410,118292496, 1977975930,1978040346,298237973, 1978056731, @@ -3793,7 +3788,7 @@ static const unsigned int DictNodes[84251] = 45498405, 1978908688,1978925072,1978941456,1978957840,612532240, 1978975049,125927466, 1979025390,1979072946,1979105319,1919631365,611647500, 1979507979,1979580442, 1979596812,1979613194,737771522, 1979632649,1979696118,316293603, 1979728781,3227698, 1979819276,1980071951,1980088322,1980104710,1980121642,1980137501,1980153868, 1980170794,1980186643,341131266, 5867056, 108168130, 1980203020,1980219432,296435733, 1980239500,1980317702,1980337120,109183007, 1980383278,1980441869,1980498375, - 1980548105,348782634, 1980579899,459637215, 1980622094,1980661762,1784905740,1980687631,510297076, 1980792863,1980809226,954073100, 1980825902,1980858427,344096910, + 1980548105,348782634, 1980579899,459637215, 1980622094,1980661762,1784905740,1980687631,510297076, 1980792863,1980809226,954073100, 1980825902,1980858427,344096910, 1980900624,1980989512,1981055916,186876937, 1981121437,1981211921,1981277458,1981367704,1981424915,1981514646,1981563394,1981605140,129946452, 1981719829,1460977680, 1981818134,1981906986,1362165762,1981932823,112934966, 1981988890,1982005313,1982062449,1982121111,1982178584,281919494, 1982449288,1982496806,469123084, 1982513167, 1352712213,1785877, 1982529628,1982563151,1982604569,1087045653,1982660692,1982693438,1982742534,1982758933,1982775610,1982808090,119358494, 1982825502,1982857261, @@ -3805,10 +3800,10 @@ static const unsigned int DictNodes[84251] = 1985478785,502054922, 1985511455,213844022, 1985528409,1985560605,1215578114,1985577885,1985658890,1985675306,1985691670,491552770, 562071257, 1985708063,1985725047, 1985757206,5439494, 1985773584,434405416, 1985799461,1985970213,1985986579,284786710, 1353515502,64765954, 1986003379,1986036760,116244486, 1986084876,1986102184, 1986143526,1986274599,1540800528,131842337, 180601056, 1986399383,1986471010,1986560912,913998113, 1986593716,1986658332,1986674718,1986707482,1986733352,1986756637, - 1986773004,273776659, 1986789978,351617040, 1986831657,1986937408,1626161168,1986970075,1987011882,1987117550,1987149836,1987166234,1987182629,1987198978,242466822, + 1986773004,273776659, 1986789978,351617040, 1986831657,1986937408,1626161168,1986970075,1987011882,1987117550,1987149836,1987166234,1987182629,1987198978,242466822, 1987215372,1987231801,235634719, 1987248168,1987264515,1987280906,1415839756,1987297296,1987313670,1987330054,1987346463,242466852, 1987363816,1987411996,1564393503, 114245642, 1987437867,51019786, 1987650860,1987709611,1987746534,1987790011,1437777923,1987838411,1987887110,1987903791,198721565, 170803243, 180764694, 1987936272, - 53493765, 275612495, 1987962157,1988044078,1480851475,199458897, 1988109615,53936135, 1988167539,29605930, 1988199998,1988263947,17809429, 1988289840,68599839, + 53493765, 275612495, 1987962157,1988044078,1480851475,199458897, 1988109615,53936135, 1988167539,29605930, 1988199998,1988263947,17809429, 1988289840,68599839, 1988411394,1988427804,21610518, 30392357, 1988444186,5867839, 1988470065,34422813, 1988613948,1361739907,79937593, 1988657180,1988673572,1988689961,1988706314, 1988722804,164036630, 1988739093,1988756770,1988804636,1988821007,1988837492,1988853782,1485078659,1988870156,142180367, 345784323, 2196666, 1989332507,1989394461, 1989410826,1989427330,39895155, 1989444017,1989482073,745849768, 1989551410,1989623839,307987319, 1989640276,1989676202,127041590, 1989754918,769426921, 1989771330, @@ -3818,7 +3813,7 @@ static const unsigned int DictNodes[84251] = 1991476723,1991508407,1991540747,1991557122,198934549, 271057527, 1991583035,1991828796,135184386, 138231884, 1991868719,1465892948,1991910717,184549388, 1991999534, 1992048733,158842961, 1992098286,1992130591,1992147028,306954677, 576176149, 1992189246,1992409620,1992458266,85098538, 1992484159,506775027, 999489538, 1992533312, 1992590225,1992648001,87048230, 1992722010,1992762690,1992884234,159432725, 1992901026,1992933378,1428996136,1992959299,1993162894,1993195950,18120725, 1993244703, - 1993261483,1993293855,1993310224,1993327425,1993359663,1993401668,1993458110,1993523226,1993539605,1993555984,44908560, 1816151049,1481950660,1993572436,47923238, + 1993261483,1993293855,1993310224,1993327425,1993359663,1993401668,1993458110,1993523226,1993539605,1993555984,44908560, 1816151049,1481950660,1993572436,47923238, 1993605122,561414251, 2048435, 1993631045,456966175, 1993691513,1993762118,1993850902,1993867304,517275685, 1993883650,62341130, 1097765, 1993900164,1993916550, 14172169, 1993942343,1994286408,1994394534,1994424322,1994440714,1994457124,1994473474,108511242, 1032142850,1994489910,207192596, 1994523083,5882458, 1994571871, 346144790, 170704962, 1994630204,1994686606,1994720245,1994786180,1994850316,1994866730,1994883108,1372979222,1994904430,1994948668,1995032558,137445397, 1995079702, @@ -3826,22 +3821,22 @@ static const unsigned int DictNodes[84251] = 1995407397,139477044, 1995423763,1995440140,65617962, 1995973963,1996226622,1996275722,447987722, 261193759, 1996293248,1996342293,1804861478,291455002, 1996390410, 1996407649,491798582, 1996449100,1996522607,1996563789,1996604257,1996637042,1996668959,1996685318,291454995, 1996702632,1996735224,1996768103,1996801331,1996849611, 1996905623,1158234150,2835368, 1996965033,1996996650,67043370, 1997013051,1997045841,1918746665,1997078582,1724563496,1997111355,1997146642,1997193228,1997209903, - 235028518, 185417757, 726908968, 1997242905,1997308584,1997340974,1997373480,6438938, 1997391450,1997422651,1997455400,1997471786,1997488150,1997504522,79249420, + 235028518, 185417757, 726908968, 1997242905,1997308584,1997340974,1997373480,6438938, 1997391450,1997422651,1997455400,1997471786,1997488150,1997504522,79249420, 1997520934,1926955046,104759311, 1997545662,1997570057,1997586444,1997602953,16269354, 1997619337,1997635719,17924106, 1997651999,1997668355,1997684765,1997701131, 7307271, 1997727054,1997874511,659292219, 1998062532,109183017, 1998111320,1998143547,1998178325,1998210377,1998258268,58802178, 1998291943,739360834, 1998349648, - 307593651, 1998487611,1998520379,1998824786,1998963222,1998995458,392921107, 1999013329,1999061079,1999110146,163414026, 1999126555,1999159327,142835754, 152354856, + 307593651, 1998487611,1998520379,1998824786,1998963222,1998995458,392921107, 1999013329,1999061079,1999110146,163414026, 1999126555,1999159327,142835754, 152354856, 1999185235,143441951, 1999324050,1999372319,385024305, 1999397346,1999463764,1999717199,208978353, 1999751593,1999781928,1999798287,1999814671,1999831052,1263468554, - 1999847470,813039656, 1063272475,1999898943,1999929461,1999962128,1999978507,1999994891,166215682, 2000011370,2000095701,242878768, 2000126012,1232388177,2196401, - 446382106, 2000210912,2000266581,2000322586,2000338955,2000357580,2000388098,1999831050,1396670551,2000404520,126730246, 2000420880,170805567, 2000446806,793919587, + 1999847470,813039656, 1063272475,1999898943,1999929461,1999962128,1999978507,1999994891,166215682, 2000011370,2000095701,242878768, 2000126012,1232388177,2196401, + 446382106, 2000210912,2000266581,2000322586,2000338955,2000357580,2000388098,1999831050,1396670551,2000404520,126730246, 2000420880,170805567, 2000446806,793919587, 1435828701,2000551948,2000568339,2000584725,2000601952,2000671068,1760264202,2000732226,2000765465,2000834639,2000896056,2000938327,2001011147,2001059861,2001076311, 2001125416,2001142219,694173708, 7145493, 2001190999,139198471, 2001248791,2001338378,1574126486,2001364312,2001437820,2001485840,2001502259,2001544537,2001636153, 2001633364,2001724762,2001797721,2001829898,2001846338,2001879066,2001895883,1335754808,2001944675,2001977401,2001994187,2002043342,2002092879,2002124806,2002141250, 2002174944,2002223142,2002239500,2002256096,2002298203,2002370581,2002386970,2002403359,2002419731,2002437016,2002485288,2002501651,2002518037,779108418, 2002534443, 2002567199,214810634, 2002583651,2002616386,2002649104,2002665512,189693958, 2002691420,2002927750,2002944132,2002960394,2002976810,103743528, 2003002717,2003108776, - 1787740162,131335050, 203128916, 2003141417,759578690, 2003182942,2003255655,2003288095,2003304464,1387380746,2003320908,2003363167,1900625962,111362079, 176963615, - 2003412320,2003451916,2003468298,2003484693,2003501115,791494694, 2003533864,2003550647,417038639, 2003592545,2003632149,2003648815,2003682633,2003730488,196132876, + 1787740162,131335050, 203128916, 2003141417,759578690, 2003182942,2003255655,2003288095,2003304464,1387380746,2003320908,2003363167,1900625962,111362079, 176963615, + 2003412320,2003451916,2003468298,2003484693,2003501115,791494694, 2003533864,2003550647,417038639, 2003592545,2003632149,2003648815,2003682633,2003730488,196132876, 2003765053,2003812418,1406075394,2003854690,2003927050,2003952995,5505040, 171000410, 723796010, 2004092594,2004123688,2004140044,153190922, 162119982, 1436336130, - 2004165988,2004272577,2004303910,441532437, 2004321867,2004370458,2004418576,246628378, 2004435003,546095123, 2004468745,930086922, 2004510053,2004584715,462438441, + 2004165988,2004272577,2004303910,441532437, 2004321867,2004370458,2004418576,246628378, 2004435003,546095123, 2004468745,930086922, 2004510053,2004584715,462438441, 44613643, 2004634013,2004680744,1911652390,2004698121,2004732233,2004795446,2004837734,2004936039,2005008396,2005024797,1861845018,2005041239,2005094734,2005139486, 2005172250,2005198184,2005303306,2005319696,273776697, 118145043, 2005336104,2005352454,1961869364,2005368937,2005401665,2005450763,47284240, 2005476713,2005771626, 2005869931,2006024204,2006040614,477085734, 143294891, 2006066540,488226842, 1980858370,1772522461,2006279533,2006337274,19251239, 133578976, 2006368268,2006391818, @@ -3851,52 +3846,52 @@ static const unsigned int DictNodes[84251] = 2007744531,2007760918,2007777318,2007793666,784368150, 5177460, 2007810487,2007842924,958038047, 2007876269,2007929912,2007973903,1985134614,2007994920,2008039450, 2008056568,1277034508,2008098162,2008137759,1948975114,2008163699,2008334638,1836793882,2008368443,238551800, 2008409460,2008581004,2008633707,2008695309,2008743955, 1917419, 2008760386,676724793, 2008799186,2008878599,2008940610,2008982901,2009040231,2009104492,2009138490,2009186391,263553026, 476954678, 2009245046,2009334049, - 120111328, 2009366544,2009383004,466993178, 2009416551,2009451078,2009481246,2009514273,2009547231,2009580034,1442168853,2009621879,2009884024,2010044956,131334286, + 120111328, 2009366544,2009383004,466993178, 2009416551,2009451078,2009481246,2009514273,2009547231,2009580034,1442168853,2009621879,2009884024,2010044956,131334286, 602554370, 2010104045,2010136683,163020810, 2010169356,405749770, 2010190063,2010251307,2010293625,420757515, 2010375546,2010416044,2010485019,398426140, 2010531207, - 2010562659,2010595374,119357978, 1533526045,2010654075,75513892, 2010726832,2010759180,2010775557,127680514, 2010801532,2011047293,2011187038,2011251914,397770836, - 2011299924,2011333077,175523221, 2011381782,2011398166,2011414550,2011430934,2011447318,107757590, 2011463696,2011480070,2011496469,280903682, 2011522430,63816734, - 2011661465,2011712435,2011758604,153714710, 2011774978,2011791791,958663007, 2011828632,2011915647,45531178, 2011973983,2012020818,2012053560,2012086303,421855761, - 2012112256,167985162, 2012185070,2012217403,2012250151,2012292481,8060968, 2012423554,2012529162,1955348492,2012563797,2012627003,2012659714,2012676115,197115926, + 2010562659,2010595374,119357978, 1533526045,2010654075,75513892, 2010726832,2010759180,2010775557,127680514, 2010801532,2011047293,2011187038,2011251914,397770836, + 2011299924,2011333077,175523221, 2011381782,2011398166,2011414550,2011430934,2011447318,107757590, 2011463696,2011480070,2011496469,280903682, 2011522430,63816734, + 2011661465,2011712435,2011758604,153714710, 2011774978,2011791791,958663007, 2011828632,2011915647,45531178, 2011973983,2012020818,2012053560,2012086303,421855761, + 2012112256,167985162, 2012185070,2012217403,2012250151,2012292481,8060968, 2012423554,2012529162,1955348492,2012563797,2012627003,2012659714,2012676115,197115926, 2012694496,2012751235,2012844450,2012910093,2012954629,115114043, 2012980612,2013193605,141656080, 2013397064,2013462574,2013512844,2013570438,2013695279,2013724694, 1052557328,2013741058,1667989515,2013758246,2013792270,3342374, 2013839389,2013855760,262684709, 1415839760,2013881735,72368144, 2013972242,2014021484,2014054285, 745472134, 2014085423,2014117910,756252688, 2014143880,2014188643,2014282620,2014331412,1993834506,2014380061,94339112, 2014396941,2014445627,2014478420,2014511132, 2014527500,2014543898,492447113, 2014569866,1497317441,292094382, 175620136, 2015077772,2015366372,2015412264,2850821, 2015428737,2015461439,2015494603,2015544820, 2015592474,2015609370,2015651213,113836054, 2015707138,2015723539,2015739941,611647499, 2015765902,2016019111,2016054659,2016101674,2016159119,507707398, 2016198959, 4718674, 2016231661,2016264276,3213333, 2016297807,914966060, 2016339344,2016411670,405045264, 2016428048,2016444444,198328351, 2016470417,2016773456,2016821739, - 2016854230,2016887042,2016919706,8398226, 2016952322,76644378, 2016969897,2017001498,344736656, 2017017887,214941715, 2017034246,2017051977,283361290, 735559711, + 2016854230,2016887042,2016919706,8398226, 2016952322,76644378, 2016969897,2017001498,344736656, 2017017887,214941715, 2017034246,2017051977,283361290, 735559711, 2017109395,610223369, 2017198082,264159242, 2017224084,898171312, 2017329239,2017378798,2017411098,2017427468,2017443880,1919991829,2017460290,2017493023,1639432202, 2017509435,778862611, 2017551765,2017607811,2017624322,2017656987,2017689659,2017731990,2017871637,2017935386,2017952823,2017984534,80823320, 2018010519,2018066472, 2018082835,2018099238,2018115596,2018131984,1090961429,1878523906,2018148371,2018164758,2018181158,2018197506,48627724, 2018213903,2018230303,334800280, 2018256281, 2018329055,2018361881,2018426979,2018459678,344752587, 2018502042,2018633115,2018774204,2018852890,8396411, 2018869485,2018911644,2019017748,52363293, 2019075485, 212723102, 2019164226,753074188, 2019205790,2019231509,2019296223,2019345015,2019377218,2019419551,29376528, 836812816, 2019525034,295272450, 207619961, 2019567008, - 2019688507,131891241, 896532539, 2019722905,2019780001,2019868674,551796746, 2019885110,2019927458,2019983400,75530250, 1749680140,2019999756,2020021639,2834471, + 2019688507,131891241, 896532539, 2019722905,2019780001,2019868674,551796746, 2019885110,2019927458,2019983400,75530250, 1749680140,2019999756,2020021639,2834471, 2020091299,2020147215,2020163660,2020205988,2020271525,2020343829,2020360194,115818525, 2020386214,2020631975,176193620, 131335665, 2020746664,2020802600,1212760093, - 2020818987,2020861353,2020933634,2020959658,2021097538,1421803541,1934100871,2021130783,2021189035,2021244954,2021261324,1921581067,2021277717,2021294121,581206044, + 2020818987,2020861353,2020933634,2020959658,2021097538,1421803541,1934100871,2021130783,2021189035,2021244954,2021261324,1921581067,2021277717,2021294121,581206044, 2021320108,2021425206,358908128, 2021458223,2021490754,2021533101,2021638175,381992986, 2021654620,2021687308,84738054, 2021703771,2021736464,1818935322,2021762478, 2021867558,2021883940,2021900299,229965835, 750305320, 210879311, 2021918148,547684383, 2021949471,575668281, 2021965917,2022015200,2022047801,65077267, 2022073775, 2022391900,2022434224,2022507921,2022577549,2022637580,565772298, 2022653974,2022670372,241434634, 2022687629,2022768642,346488853, 2022786038,158812593, 2022818705, 2197903, 2022876593,2023211092,2023243817,2023260714,2023276546,1649410602,2023302578,6375910, 1756987501,2023329080,602161209, 2023391308,2023424087,2023473167, - 1978023976,2023491552,2023548339,2023587856,2023613876,441532438, 2023653460,2023688605,2023744949,2023850485,5324866, 2023882791,1490503258,2023915572,23856158, + 1978023976,2023491552,2023548339,2023587856,2023613876,441532438, 2023653460,2023688605,2023744949,2023850485,5324866, 2023882791,1490503258,2023915572,23856158, 2023949702,52133904, 2024023478,3212603, 2024128522,2024144915,88686630, 2024161290,778944524, 2024184304,131104794, 2024243202,2024259605,2024275984,2024292367, 2024308752,213958668, 238256157, 2024334775,2024472660,2024505390,6373796, 2024557351,2024636428,2024652892,2024685608,49397781, 2024701968,1181941779,2024719752, - 2024751116,2024767514,119881744, 2024784926,2024817135,377978896, 2024849451,146767882, 2024886371,2024914946,2024932697,2024973752,2025244039,2012299283,369098806, + 2024751116,2024767514,119881744, 2024784926,2024817135,377978896, 2024849451,146767882, 2024886371,2024914946,2024932697,2024973752,2025244039,2012299283,369098806, 2025285049,689799662, 2025324559,55033861, 2025350586,2025407064,2025447861,2025498043,2025562549,2933336, 251610186, 2025603093,2025619468,2025635947,2025670597, - 2025711036,2025956797,2026070956,2026120638,685212938, 2026160999,2026200580,2026300863,2026373183,2026405928,1900550, 2026431936,2026717200,2026734036,84721704, + 2025711036,2025956797,2026070956,2026120638,685212938, 2026160999,2026200580,2026300863,2026373183,2026405928,1900550, 2026431936,2026717200,2026734036,84721704, 991100984, 2026766390,2026799145,2026815529,2026831903,2026848275,2026864652,588185720, 2026884837,2026962950,144949250, 1157103654,2026979394,2027016485,2027087297, 193249312, 2027176023,2027229080,127893514, 215777320, 229949461, 2027294586,2027357579,2027409294,2027454486,971882517, 2027470870,2027487234,2027503654,2027520011, 2027537231,2027578818,493666342, 2027683906,2027717473,2027749403,2027782447,2027824579,2027929616,14450703, 264798214, 2027955652,2028051607,2028111219,2028142895, 2028176682,2028224533,2028240936,2028257290,2028273730,2028306656,2028339250,171458591, 2028372427,2028421176,2028453954,2028486668,2028503046,2028519430,2028535895, - 2028585831,2028618017,2028656340,2028748882,2028784176,2028840389,2028929479,2028979088,2029014300,2029076939,24297831, 2029125643,2029142028,2029158421,919486490, + 2028585831,2028618017,2028656340,2028748882,2028784176,2028840389,2028929479,2028979088,2029014300,2029076939,24297831, 2029125643,2029142028,2029158421,919486490, 2029175959,2029223995,760611671, 2029259505,2029291440,2029322278,1958150166,2029338690,560775178, 2029797405,2029813772,103546906, 2029839814,2030010605,2030044046, 2030118343,2030207577,2030249416,120979477, 2030469179,2030502735,2030534682,2030552088,2030600660,1210531871,2030633867,343214513, 2360876, 2030703044,2030764939, 2030839241,2030928409,2030993414,2031009813,2031026206,2031059003,2031093258,2031140951,2031190045,430440487, 2031216074,2031379915,2031452624,234438668, 2031502222, 282837423, 2031568917,2031600042,2031634346,2031698352,2031732909,2031796283,2031833316,1453228078,2031910978,125927443, 2031943702,2031960080,2031976458,2031992863, 110542885, 2032018892,2032320654,2032353326,2032402470,190368230, 2032419417,561381398, 2032451622,2032467970,232587366, 2032494029,2032549934,1239237047,2032608718, 2032654025,2032702702,2032797918,2032848810,429098433, 2032929122,2032984904,2033058251,666157077, 2033108091,391151628, 2033139734,399802384, 681967697, 2033156155, - 2033198543,118884212, 2033435678,2033467413,2033484235,2033533950,2033582146,662503430, 1376584140,2033614875,2033648075,2033696778,2033715003,2033762412,52150312, + 2033198543,118884212, 2033435678,2033467413,2033484235,2033533950,2033582146,662503430, 1376584140,2033614875,2033648075,2033696778,2033715003,2033762412,52150312, 2033795153,303300639, 2033827894,2033860701,78479372, 2033919440,2034017745,2034073659,112738332, 2034110623,2034156385,104759303, 2034188394,2034270218,2034286621, 1975828567,2034305457,2195957, 2034359257,2034418589,1716584458,354746467, 2034500015,2034535091,2034574802,2034663474,2034696204,2034712586,2034728981,2034747195, - 2034794604,2034827280,2034846121,2034878745,2034943104,2034991125,2035007510,2035024719,2035057638,2035089424,2035105830,2035122205,1502117894,2035148243,5883119, + 2034794604,2034827280,2034846121,2034878745,2034943104,2034991125,2035007510,2035024719,2035057638,2035089424,2035105830,2035122205,1502117894,2035148243,5883119, 2035351574,2035368002,1997783051,2035400734,197328898, 2035434319,1611006253,2035471665,810156044, 2035541460,59048537, 1569522927,159449521, 2035582944,2035630539, 2035679242,2035697467,1986234837,494878730, 2035744808,1396719628,2035761689,2035827742,2035866775,2035934677,2036016598,994083053, 922599446, 264765452, 2036154411, 2036196823,2036418065,2036458968,156827732, 113115244, 2036531254,2036570539,2036662288,2036681336,2036711516,2036744202,2036760879,1129578512,2036797384,2036858892, @@ -3905,20 +3900,20 @@ static const unsigned int DictNodes[84251] = 2038042846,2038087783,2038169707,2038212061,2038284333,2038317082,2038333446,960888870, 2038349862,2038366246,2038382676,2038415381,2038431831,2038480902,2038497299, 215859216, 551370806, 2038523358,2038613159,2038661136,1033224208,2038687199,2038792239,317836355, 2038834656,2038916577,2039080418,190644300, 2039136559,2039169784, 2039201852,1043628073,2039283772,2039365642,2039382936,2039431275,2039464479,2039513559,55377949, 2039545940,993099804, 2039588323,2039666735,2039710505,2039742520, - 1578631170,2039784932,2039889976,334070248, 2039932389,2040026120,2040079846,2040252194,2040285636,2040358375,2040414224,47972378, 2040431439,2040463362,139198485, + 1578631170,2039784932,2039889976,334070248, 2039932389,2040026120,2040079846,2040252194,2040285636,2040358375,2040414224,47972378, 2040431439,2040463362,139198485, 2040489448,2040561690,2040578069,2040594454,137412634, 2040610854,406306818, 2040627236,2040643596,137412646, 2040660052,2040702441,2040857907,2040905812,2040940019, 4507587, 2040971329,1278706123,2041020428,2041036831,2041053203,1808515094,2041070423,2041102390,2041141373,115016106, 2041185169,2041241194,2041286278,2041405210, 2041446431,2041463696,6619181, 2041505258,2041659408,2041675797,121110550, 2041692176,2041708565,952614934, 30392332, 2041725403,2041758658,2041790767,2041832939, 2041889227,2041937958,124469280, 2041954367,2041987673,2042029548,2042209773,312180776, 1663976364,2042299215,6701075, 2042340846,2042417182,2042465257,2042528504, - 530055206, 2042570223,2042626895,2042658842,136921126, 1245872961,2042684912,2042766833,2042822658,2042839066,2042855460,2042871818,264093738, 2042888238,50937866, + 530055206, 2042570223,2042626895,2042658842,136921126, 1245872961,2042684912,2042766833,2042822658,2042839066,2042855460,2042871818,264093738, 2042888238,50937866, 2042939302,2042996210,2043138072,2043183106,184926250, 1880408095,2043206545,55869445, 2043291123,2043364503,2043412511,6373910, 188105663, 2043438580,2043510786, 2043527178,552485339, 154107915, 2043544539,583450670, 2043904131,2043920393,2043946486,2044038037,2044084226,2044100637,2044117008,2044133416,7290922, 2044153811, - 2044200175,1313357861,2044233272,2044297242,445546498, 2044313681,2044346380,2044362773,6373803, 2044379158,2044395541,2044421623,2044487160,2044569081,163315744, + 2044200175,1313357861,2044233272,2044297242,445546498, 2044313681,2044346380,2044362773,6373803, 2044379158,2044395541,2044421623,2044487160,2044569081,163315744, 2044658173,2044716538,5324880, 167084042, 2044806561,103546918, 2044863995,55754768, 2044978684,2752519, 2045330367,341147688, 2045362225,2045444139,1991835660, 2045477673,2045509670,891633693, 2045527592,2045591657,716357634, 2045624778,2045657103,1261339722,2045673902,2045723489,2045755418,462880774, 2045772684,2045830653, 2045873387,2045936043,1060258016,2045968468,772407306, 31424519, 2046002298,2046066742,2046099503,2932792, 144375818, 2046133071,2046165098,2046256638,2046312477, 569311298, 2046338559,119997304, 2046411864,2046459988,2046492728,2046525452,539623464, 2046541864,2046558219,1047773212,2046578365,2046657143,2046689306,2046705705, - 2046722064,2046738458,119226379, 1888010242,2046762784,2046820412,2046905436,2046951436,2046968851,2047017212,2047050148,2047085126,2047124992,2047246352,114409498, + 2046722064,2046738458,119226379, 1888010242,2046762784,2046820412,2046905436,2046951436,2046968851,2047017212,2047050148,2047085126,2047124992,2047246352,114409498, 347963500, 2047262749,2047279116,116375770, 1325662210,2047297011,2047328282,121356307, 2047344694,2047377550,2047410232,980402205, 2047443010,1000538133,1850441743, 2047475771,47546405, 2047509017,2047574120,2047623199,278052906, 1201799260,295256090, 116883515, 7734135, 115458050, 2047790838,2047895042,2047957281,2048000459, 2048542440,2048623816,32686111, 2048657851,163301845, 2048796163,2048852033,2048902424,2048967015,2048999426,532676634, 2049022337,2049083125,2049130508,2049146890, @@ -3933,26 +3928,26 @@ static const unsigned int DictNodes[84251] = 2052472853,2052489235,283312134, 2052510186,2052555639,2052587793,2052620290,214941722, 2052645490,2052721111,2052767772,520094154, 108314723, 2052793868,1034518570, 2052886454,2052949110,2052997228,109363205, 2053039629,2053259302,2053276078,2053324802,2053341203,95698956, 2053357660,2053390636,2053423196,2053457241,2053489554, 2053537813,2053554207,212025356, 2053570644,2053603354,2053619741,2053636571,2053668893,2053685785,2053751327,2053800848,2053832730,2053849100,2053865501,2053881896, - 2053898259,472203285, 2053914683,2053948761,2053980198,2053996584,2054012949,661274626, 896532534, 2054039054,237944848, 2054111244,2054127626,138625026, 371884048, + 2053898259,472203285, 2053914683,2053948761,2053980198,2053996584,2054012949,661274626, 896532534, 2054039054,237944848, 2054111244,2054127626,138625026, 371884048, 543408144, 2054153743,1476886981,2054267482,356925497, 2054340629,2054357046,2054390569,2054422962,2054465040,2054661649,1176717172,823115816, 2054770186,2054832173, - 2054869169,2054897799,2054914049,3309573, 2054930891,2054981371,706101723, 2867240, 2055038482,2055110740,2055153171,104759307, 2055726613,2055767564,22478963, + 2054869169,2054897799,2054914049,3309573, 2054930891,2054981371,706101723, 2867240, 2055038482,2055110740,2055153171,104759307, 2055726613,2055767564,22478963, 2055798807,2055815300,2055831683,2055847959,2055864335,2055890454,2055897100,1114246, 2055913602,2055929887,2055946258,2055962664,2055979140,10371108, 2055996052, - 2056028197,2056044572,70729859, 2056060934,2056077318,2056093701,6422551, 2056119831,2056192018,83918963, 2056208394,2056224804,81756165, 115818522, 328073217, + 2056028197,2056044572,70729859, 2056060934,2056077318,2056093701,6422551, 2056119831,2056192018,83918963, 2056208394,2056224804,81756165, 115818522, 328073217, 2056250904,2056274320,2056306694,2056323077,447709787, 2056339462,2056355846,2056372229,52346903, 2056087062,2056880265,902889604, 2056896627,2056912901,2056939034, 2056988187,468713572, 2057093649,2197082, 158744592, 2057129174,423596422, 2057224794,55197706, 2057257807,2057299484,2057528861,2057585141,2057627166,2057791007, 150798443, 2057922080,889308160, 2057994278,1963327540,944373789, 2058020385,2058125744,2058159372,2058216117,2058289912,2058331682,2058453443,2058495523,2058570174, - 2058616916,2058649610,2058666518,2058698818,2058731541,2058747906,47120391, 2058764328,2058780738,124863657, 2058823204,2059036197,50036738, 2059124748,420593692, + 2058616916,2058649610,2058666518,2058698818,2058731541,2058747906,47120391, 2058764328,2058780738,124863657, 2058823204,2059036197,50036738, 2059124748,420593692, 2059141423,2059176673,2059281958,2059374090,2059436450,2059468812,320585749, 2059488505,1186775078,2059534390,2059567641,2059633111,2059665410,1645264924,2059681794, - 2059698187,2059714588,142589974, 2059732310,369278978, 2059780633,2059845663,2196800, 52576277, 2059871783,907477594, 2059937320,2060075855,911065090, 272252943, - 2060109713,7045136, 2060150313,2060189788,2060232234,2060355642,2060419936,2060487433,2060533762,2060550154,2060566570,335151106, 2060592683,2060714817,235307029, + 2059698187,2059714588,142589974, 2059732310,369278978, 2059780633,2059845663,2196800, 52576277, 2059871783,907477594, 2059937320,2060075855,911065090, 272252943, + 2060109713,7045136, 2060150313,2060189788,2060232234,2060355642,2060419936,2060487433,2060533762,2060550154,2060566570,335151106, 2060592683,2060714817,235307029, 420724775, 2060746818,2060780899,2060846124,2060894295,2060943874,2060976159,2060992619,2061035052,2061156447,2061207355,2061264429,2061472098,2061537224,2061598779, 2061641262,2061762591,2061778982,293601318, 2061795349,2061811714,980402213, 2061837871,2061942926,2061975590,850952230, 711655946, 2062001712,2062077393,2062123041, - 2062181116,2062222326,291111347, 2062255582,2062368876,2062408440,2062467093,2062483499,2062516234,1899397157,2062532614,2062549013,2062565378,2062581770,116377266, + 2062181116,2062222326,291111347, 2062255582,2062368876,2062408440,2062467093,2062483499,2062516234,1899397157,2062532614,2062549013,2062565378,2062581770,116377266, 2062870066,2063138903,2063190172,306937872, 2063237151,2063253514,8603572, 2063271698,217759770, 2063328819,2063384602,2063400962,2063417359,821854230, 2063434575, 2063466517,805781520, 1208057866,2063484690,2063532070,2063548432,2063564842,329679695, 2063582705,2063614382,2063672884,785465375, 2063783008,2063831385,2063893286, - 195199007, 2063926441,6946875, 2063959278,2063991631,2064025489,1435124674,2064066101,2064237013,2064295478,2064361015,264093715, 2064465950,2064498709,235520016, + 195199007, 2063926441,6946875, 2063959278,2063991631,2064025489,1435124674,2064066101,2064237013,2064295478,2064361015,264093715, 2064465950,2064498709,235520016, 530055179, 2064515105,2064565033,2064597002,273858626, 2064615849,2064646156,194084900, 2064663943,2064695308,858144810, 2064721464,2064826383,22888454, 2064852537, - 2064924698,2064941072,202522635, 2064967226,345735682, 2065024254,2065147451,2065268738,843644938, 2065285151,2065302883,2065368165,2065416204,2065432578,48054298, + 2064924698,2064941072,202522635, 2064967226,345735682, 2065024254,2065147451,2065268738,843644938, 2065285151,2065302883,2065368165,2065416204,2065432578,48054298, 2065451816,2065514929,2065557052,1474330667,324747320, 2065638973,2065827559,1943879746,2065901118,2065983039,186466731, 2066064960,131268832, 2066154074,2066186252, 238813283, 2066206578,2066251802,353239099, 2066277953,131432486, 2066400665,2066466031,3228078, 1346290159,2066498456,2066547223,340819999, 2066579477,1715617794, 2066605634,2066654787,2066694154,1704148994,319717834, 2066720324,2066818629,2066867782,2066989058,43237386, 2067006200,2067041245,2067087453,222789653, 2067146311, @@ -3960,23 +3955,23 @@ static const unsigned int DictNodes[84251] = 2068047434,2068086891,2068119583,1210138643,627785782, 2068136404,2068168714,1866842143,2068185110,2068201775,2068234250,2068250626,1591607327,2068268295,2068371717, 2068415001,2068489803,2068561922,2068578325,8391161, 2146411, 131335142, 2068594747,2068627458,2068644064,1288011807,2068683021,2068801100,2068890618,2068939599, 602374146, 2068972712,2069021432,170885421, 408420354, 399262456, 241238018, 2069063245,51036196, 2069235273,2069316043,236405207, 2069364748,98107395, 2069381151, - 258097190, 2069404588,2069531008,287031327, 335151135, 2069597649,303562783, 2069577836,1164591170,344850470, 743014402, 2069643323,2069676139,2069709736,216711206, + 258097190, 2069404588,2069531008,287031327, 335151135, 2069597649,303562783, 2069577836,1164591170,344850470, 743014402, 2069643323,2069676139,2069709736,216711206, 2069751374,1834008639,2069915215,1592508516,2070036506,45875202, 928940042, 1137721346,2070058665,158508624, 324895034, 308019726, 237682731, 2070173965,2070292049, 1043496988,1655537674,2070357586,1941356565,2070495234,822673419, 2070513851,2070570579,2070734420,2070806582,410829665, 2070840056,995885058, 2070872076,2070890630, 498247253, 2070938633,2070980182,2071068698,954499074, 141066271, 2071086227,212320272, 759580145, 2071118283,2071167002,2071183426,2071216888,2071254693,2071298074, 2071314444,2071330826,2071347202,49086493, 2071365658,2071412796,2071494764,2071528635,2071577110,43237382, 2071619159,2071848536,2072068180,2072101897,2072134497, - 2072166416,2072182786,2072199178,7290890, 2072215789,197115910, 2072249832,2072299873,6455302, 2072379418,742260748, 2072397252,47038480, 2072429081,603471910, - 7290883, 2072494125,379256858, 377585704, 2072532503,214417449, 2072618585,2072789076,404046695, 2072823283,178815007, 2072854582,2072897114,2073002006,234307624, - 2073018394,13549578, 2073034779,2073067536,122568714, 2073084334,5341214, 2073133158,2073165826,133939257, 131335031, 2073182264,2073224795,2073323100,373047306, + 2072166416,2072182786,2072199178,7290890, 2072215789,197115910, 2072249832,2072299873,6455302, 2072379418,742260748, 2072397252,47038480, 2072429081,603471910, + 7290883, 2072494125,379256858, 377585704, 2072532503,214417449, 2072618585,2072789076,404046695, 2072823283,178815007, 2072854582,2072897114,2073002006,234307624, + 2073018394,13549578, 2073034779,2073067536,122568714, 2073084334,5341214, 2073133158,2073165826,133939257, 131335031, 2073182264,2073224795,2073323100,373047306, 2073379246,2073429161,623411226, 2073460776,2073477186,131334200, 2073880158,2074199457,2074247647,2074280044,1532542978,2074312744,2074329109,236372034, 2074345578, - 2074430101,283869195, 2074486367,2074535520,2074600426,5488671, 2074673154,267501604, 201525026, 2074690791,2074738690,2074755078,2074771477,2074787971,64356482, + 2074430101,283869195, 2074486367,2074535520,2074600426,5488671, 2074673154,267501604, 201525026, 2074690791,2074738690,2074755078,2074771477,2074787971,64356482, 2074804226,2074820619,2074836994,1773060124,2074855936,2074902587,2074935334,2074952544,677593559, 2075027041,2075082767,2075099167,235389530, 2075125346,2075214275, 2075246624,2075279391,251396115, 2075295774,2075328538,2075345371,2075377695,1336050111,2075394086,2075410463,212844565, 2075428176,134168683, 2075477419,2075534947, 2075578690,2075630801,2075708900,2075754522,152338442, 665485314, 821690406, 137936908, 2075770916,1310326803,2075797092,212107295, 2075885611,2075918357,2075934807, 2075986274,2076033051,2076065803,2076082191,2076098562,2076114965,821690390, 2076140409,2076196900,1071923226,2076213332,146718730, 2076246032,704151567, 2076262465, 163594296, 2076312385,170344460, 2076351369,2076417905,2076475430,25559145, 2076492423,459276748, 2076550757,8611430, 881247241, 371311625, 2076664904,2076747367, - 2076885623,2076917782,62341156, 2076935465,3212373, 2077016206,2077048886,1129381894,2077081903,2077114476,2077153266,147013642, 2752550, 2077206120,3211348, - 2077409336,2077451881,2077557195,326483984, 2077605934,2077655094,109053380, 2077697642,2077904822,2077966545,1072661504,2078016831,2078081495,593199704, 3260893, + 2076885623,2076917782,62341156, 2076935465,3212373, 2077016206,2077048886,1129381894,2077081903,2077114476,2077153266,147013642, 2752550, 2077206120,3211348, + 2077409336,2077451881,2077557195,326483984, 2077605934,2077655094,109053380, 2077697642,2077904822,2077966545,1072661504,2078016831,2078081495,593199704, 3260893, 2078113876,2078147097,2078221931,422592524, 2078303852,2078394507,2078457867,2078474252,2078490634,2078507029,2078523431,504610842, 2078565997,2078624127,2078687325, 934838328, 2078741834,110216130, 2078818792,2078852012,2078916614,2078932998,481525836, 2078949481,160350246, 2078991982,5292054, 2079147337,129008049, 2079204975, 2079319664,135004162, 131334571, 2079359012,174227462, 2079375400,1460027404,2079391850,2079483505,2079588436,2079625155,2079696498,168722470, 2079787254,2079839910, @@ -3984,38 +3979,38 @@ static const unsigned int DictNodes[84251] = 2080751622,2080768002,547831834, 2080784486,2080817999,2080851289,2080892537,2081056378,2081112289,2081145768,2081177656,2081210455,8398459, 2081259558,2081275906, 2081292370,663584770, 2081325486,2081374220,2081390618,2081408798,5882721, 2081472543,2081488925,126287914, 2081515132,2081653676,1106903061,2130850, 2081728125, 2081800494,939999664, 2082083499,2082146828,2082236031,251871248, 522076172, 2082328921,2082399872,2082465409,68232834, 2082530947,172836186, 176980205, 2082645636, - 2082751001,2082819817,340280780, 1354418202,2082881576,2082898379,2082947832,2082979906,2083012674,2083055237,2083415686,2083497607,2083563144,398786562, 554188812, + 2082751001,2082819817,340280780, 1354418202,2082881576,2082898379,2082947832,2082979906,2083012674,2083055237,2083415686,2083497607,2083563144,398786562, 554188812, 374308866, 2083717122,2083733505,2083749928,96419856, 279773205, 2083766326,2083799148,2083832408,2083864588,2083880970,2083897373,1476771842,2083915685,2084004904, 2084071049,2084110352,2084126746,2084143115,2084159500,2084175878,224690217, 260063535, 2084202122,2084277568,2084339722,2084357363,2084405294,509297111, 2084464267, - 2084552788,2084586460,17809410, 2084619655,2084651039,28147724, 2084677260,647184410, 386531410, 2084782298,2084821694,2084873869,2085093382,2085109766,44646405, + 2084552788,2084586460,17809410, 2084619655,2084651039,28147724, 2084677260,647184410, 386531410, 2084782298,2084821694,2084873869,2085093382,2085109766,44646405, 2085126165,1978384386,2085143377,163726710, 2085283470,829063178, 2063908890,2085365391,139477483, 2085453931,2085487499,2085552236,656457794, 1746273089,2085586249, 1693433958,2085635116,2085683259,2085715999,571801603, 2085732436,2085765212,2085798464,2086119057,2086256877,2086289418,257638431, 2086306095,457523215, 2086339436, - 1431536075,2086388312,2086430354,2086522614,2086619056,2086659731,2086764582,132448559, 2086781217,2086815305,2086897707,2086961582,2087010342,185450527, 1818630, + 1431536075,2086388312,2086430354,2086522614,2086619056,2086659731,2086764582,132448559, 2086781217,2086815305,2086897707,2086961582,2087010342,185450527, 1818630, 2087036564,2087174823,2087209897,2087256075,2087272469,623656982, 2028355605,2087288863,1073872906,2087315093,2087387152,2087403562,2087420336,2087453964,1951924246, - 2087511702,2087616619,2087649911,295292751, 2087682132,158500138, 2087714862,2087764044,2087806615,2087896633,2088003224,2088190051,2088222739,2088240768,527240803, + 2087511702,2087616619,2087649911,295292751, 2087682132,158500138, 2087714862,2087764044,2087806615,2087896633,2088003224,2088190051,2088222739,2088240768,527240803, 2088298137,2088386625,2088435728,2088452106,659816880, 2088468501,2088486121,185483488, 2088535960,2088600961,2088653208,2088730729,2088764304,131334246, 2088796650, - 2088848078,162186351, 2088964090,141606954, 2089042391,2089084570,2089166491,2089215644,2089264797,46039080, 2089330334,220775347, 2089484340,2089526943,2195716, - 416268691, 2089805472,2089861126,2089877541,127041839, 2089895369,2089964789,2090067617,259082427, 2090172719,2090207826,675643873, 2090280136,544047114, 677445642, + 2088848078,162186351, 2088964090,141606954, 2089042391,2089084570,2089166491,2089215644,2089264797,46039080, 2089330334,220775347, 2089484340,2089526943,2195716, + 416268691, 2089805472,2089861126,2089877541,127041839, 2089895369,2089964789,2090067617,259082427, 2090172719,2090207826,675643873, 2090280136,544047114, 677445642, 4997981, 2090358744,2090468757,2090526370,2090641059,2090739364,2090827803,252248102, 2090862137,8390083, 2090958904,2091001253,940065853, 2091083429,2091144665, - 27607077, 2091204648,2091221011,2091237398,2091253772,1153384458,2091271198,19251266, 2091312806,2091417638,2091443879,2091515964,399148143, 2091605658,15040518, - 2091664348,2091697114,2091749330,2091810842,29769744, 46776360, 2091837096,2091902633,2092171266,2092187654,2092204586,2092220452,2092236816,2092253224,61456938, + 27607077, 2091204648,2091221011,2091237398,2091253772,1153384458,2091271198,19251266, 2091312806,2091417638,2091443879,2091515964,399148143, 2091605658,15040518, + 2091664348,2091697114,2091749330,2091810842,29769744, 46776360, 2091837096,2091902633,2092171266,2092187654,2092204586,2092220452,2092236816,2092253224,61456938, 2092279466,1785871, 2092335126,385138700, 385515579, 2092353844,2092433462,243744910, 2092466235,979686705, 2092508843,2092564974,2092607148,2092679197,2092695564, 2092712490,2092728358,2092744706,2092761642,743669798, 94339082, 2092777526,127451146, 2092820141,2092925035,2092957725,1474134019,194036319, 2092977763,1049968681, 2093033134,2093137979,113656235, 2093180591,2093285391,642154534, 2093754032,2093993467,2094065329,2094219304,2094235679,5488678, 2094261938,2094352337,2094399507, 294944805, 147243067, 2094417557,358105140, 2094481645,2094514197,2094533079,2094579752,1818645, 2094606003,2094737076,2094859273,2094891054,2094943107,2060713994, - 2095006714,333136330, 797362688, 2095064757,2095120422,436437004, 2095146678,2095284319,2095333679,145440784, 2095366447,2095401915,2095490743,2095546475,5308523, + 2095006714,333136330, 797362688, 2095064757,2095120422,436437004, 2095146678,2095284319,2095333679,145440784, 2095366447,2095401915,2095490743,2095546475,5308523, 2095579146,2095595604,2095629190,2095664067,2095776652,1262142538,2095825367,2095861725,1794179074,2095890536,2095939643,1052001065,2095973199,2096005880,2096037890, 1738194982,2096062020,2096119839,2096136194,115933210, 201572383, 2096162488,2096293561,2096349200,2096365610,2096384187,2096434120,194052529, 2096506554,2096598790, - 2096644117,2096660622,2096693279,2096709634,2096726026,356319707, 2096752315,2096807957,2096824346,2096840735,1188053011,2096864555,604258396, 2096906252,335446026, + 2096644117,2096660622,2096693279,2096709634,2096726026,356319707, 2096752315,2096807957,2096824346,2096840735,1188053011,2096864555,604258396, 2096906252,335446026, 2096922670,2096973003,2097004566,2097020959,272138278, 2097037849,2097112764,2097152483,2097185979,2097243837,308003266, 2097333685,2097407678,2097627202,2097660811, 2097725468,1842840155,2097745716,2097823756,1533378571,2097846784,2097931967,2098046656,765936578, 2098118668,2098135052,66814118, 2098151725,2098184273,2098216986, 2098239749,2098292417,2098429958,2098447679,714736376, 2098513557,2098577803,2098610188,2195907, 110723088, 2098626572,526811235, 2098644520,460570629, 2098718402, - 2098857520,2098888725,286408763, 2098906031,2098972758,131268662, 2099036176,2099052570,676249602, 2099078851,2099136884,5881915, 2099209924,2099488453,216186946, - 2099576874,1098629136,2099595153,523485243, 2099635910,2099741166,2099773450,2099789855,2084077609,2099806350,210403359, 2099847875,637206530, 49086470, 403341366, + 2098857520,2098888725,286408763, 2098906031,2098972758,131268662, 2099036176,2099052570,676249602, 2099078851,2099136884,5881915, 2099209924,2099488453,216186946, + 2099576874,1098629136,2099595153,523485243, 2099635910,2099741166,2099773450,2099789855,2084077609,2099806350,210403359, 2099847875,637206530, 49086470, 403341366, 2099914439,1298907238,2100045512,2100150298,2100166722,2073493535,2100201893,27624025, 2100255118,2100347348,2100379674,237814063, 934839219, 2100396520,2100438295, 2100496091,2100537033,2100625424,2100641802,2100658186,2100674572,2100690950,524600209, 2100712753,49872918, 2100775628,2100855293,706215967, 2100913866,2100970561, - 132792346, 132792332, 2101053039,2101102452,291095502, 2101520076,2101674011,2101706764,783171610, 2101733069,2101805968,2101839623,948551692, 2101888066,5866948, - 934952962, 2101952550,2101972484,2102050850,2102165611,2102208206,2102299103,344735835, 2102345870,2102378498,2102402485,154469406, 2102444044,2102467696,687834142, + 132792346, 132792332, 2101053039,2101102452,291095502, 2101520076,2101674011,2101706764,783171610, 2101733069,2101805968,2101839623,948551692, 2101888066,5866948, + 934952962, 2101952550,2101972484,2102050850,2102165611,2102208206,2102299103,344735835, 2102345870,2102378498,2102402485,154469406, 2102444044,2102467696,687834142, 2102510439,146359825, 2102542374,2102558957,2102601423,2102673710,130285583, 2102706258,2102738946,2102755349,2102771799,2102822434,2102876440,2102951967,2102968330, 8398544, 2102984788,2103017510,2103033894,52199464, 2103051000,2103092945,2103224018,2103263270,2103279654,2103296031,126763841, 2103312447,2103345192,1936588838, 2103366415,2103427126,2103459852,2103476234,2103493239,2103525851,2103561409,2103607380,2103650003,2103771567,1103774775,2103813844,151109670, 2103928533,2104049889, @@ -4023,44 +4018,44 @@ static const unsigned int DictNodes[84251] = 2104623123,371605520, 2104649432,2104737802,2104754228,2104786998,2104829657,2104977114,2105098282,1478819921,2105115820,2105164305,2105196560,2105212934,2105229333, 389349378, 2105246543,1356447756,2105282195,2105328503,2105360395,8398555, 2105377311,2105426874,1837858837,2105491915,2105540664,2105573835,2105625043,2105671718, 2105688076,2105714396,2105796317,2198785, 2105954400,193183828, 2105999815,2106050941,2106131192,2106173150,122110548, 373326127, 316294153, 2106343455,2106369759, - 551288848, 417021954, 2106458959,2106492460,2106523694,2106572842,2106589222,2097188, 2106605608,2106622006,2107057889,1229029388,2107195819,2107228463,131334417, + 551288848, 417021954, 2106458959,2106492460,2106523694,2106572842,2106589222,2097188, 2106605608,2106622006,2107057889,1229029388,2107195819,2107228463,131334417, 2107270882,2107385571,128155705, 2107473941,2107490607,2107523093,2107539532,2107574110,661274640, 2107647716,2107686988,2107729637,174637058, 2107785440,2107817990, - 2107834399,2107851637,2107883530,658063835, 2107907284,2108001149,1900563, 2108057318,8395736, 2108244060,2108276767,2108293130,220546037, 232587786, 266485860, + 2107834399,2107851637,2107883530,658063835, 2107907284,2108001149,1900563, 2108057318,8395736, 2108244060,2108276767,2108293130,220546037, 232587786, 266485860, 635240463, 2108309935,598327327, 2108352231,2108391450,303579152, 108314741, 153190922, 2108408821,2108473975,2108506133,2108532456,2108605408,2108653594,2108670204, 2108703627,2108768312,2108804400,2108850188,300925842, 635240467, 2108867640,1888583782,2108932098,7734395, 2108958441,6324234, 2109183637,19267610, 2109244069, - 344506380, 2109312280,2109358927,2109391385,179175467, 2109456413,2109475969,2109521939,2109538607,2109571082,2109587477,2109604143,2109636832,2109673645,821690389, + 344506380, 2109312280,2109358927,2109391385,179175467, 2109456413,2109475969,2109521939,2109538607,2109571082,2109587477,2109604143,2109636832,2109673645,821690389, 2109718540,2109734938,1385562983,2109752141,214827545, 2109800906,2109833232,2109849610,2109866050,2109898792,2109915162,2109932482,2109974250,2110067938,2110130000, 2110179807,2110232559,2110324779,2110358444,2110433003,243220506, 2110490928,2110537738,1381548663,2110555305,2110587415,2110621230,2110668806,777453599, 2110685408, - 2110718018,2110751157,2110783509,985300994, 2110802655,2110881803,582991900, 2110900684,2110950670,2111012930,2111045716,2111088364,2111276036,118915078, 176488469, - 2111340768,2111373318,56721445, 2111389727,2111406109,1026965563,2111424073,2111504479,2111553565,2111569951,2111586323,2111602728,2111619110,2111635458,122503194, + 2110718018,2110751157,2110783509,985300994, 2110802655,2110881803,582991900, 2110900684,2110950670,2111012930,2111045716,2111088364,2111276036,118915078, 176488469, + 2111340768,2111373318,56721445, 2111389727,2111406109,1026965563,2111424073,2111504479,2111553565,2111569951,2111586323,2111602728,2111619110,2111635458,122503194, 2111651893,2111684610,2111701013,2111717463,2111766831,2111799404,2111832076,114409479, 2111850041,193675741, 2111956717,214319142, 2112071406,389070941, 2112192550, - 195264528, 434964375, 2112218863,214303009, 2112291263,1429530352,2112333553,2112562930,368197647, 2112634902,2112651683,2112694003,2112783962,2112815704,221806649, + 195264528, 434964375, 2112218863,214303009, 2112291263,1429530352,2112333553,2112562930,368197647, 2112634902,2112651683,2112694003,2112783962,2112815704,221806649, 2112847884,2112864282,2112880699,2112913838,2112972532,2113095296,2113142805,2113160060,861405698, 2113208351,2113224723,395182117, 2113241953,2113283829,2113382134, 2113471832,2113521048,2113570727,2113601968,2113634370,2113668065,997998618, 2113699842,2113716663,2113758967,272531487, 115769403, 2113863732,2113896458,1785741371, 2113922808,2113994780,143343675, 2114021113,6373428, 2114126731,2114191799,2114227457,2114257120,2114289723,381550602, 2114332410,2114529019,2114587037,2114634818, 2114701057,2114748432,18153498, 153911380, 2114767374,2114819152,2114873084,1503952898,609533964, 2114978836,844136880, 2115027031,2115076198,273269672, 2115118845, - 2115240990,2115272730,848528412, 2115290135,2115593983,2115698707,157188597, 2115724049,2115787513,2115813976,205209640, 2115856128,2116019969,2116371312,115785766, - 2116419600,189136922, 2116445954,2116583483,2116616222,47120405, 2116658947,2116773636,2116878352,223903773, 533118992, 2116894785,2116944634,2116978838,154797508, - 2117028558,2117150469,153192931, 1356185619,2117314310,1186201705,2117445383,2117588363,2117648422,885866926, 2117674760,2117863715,2117910540,2117927012,943603743, + 2115240990,2115272730,848528412, 2115290135,2115593983,2115698707,157188597, 2115724049,2115787513,2115813976,205209640, 2115856128,2116019969,2116371312,115785766, + 2116419600,189136922, 2116445954,2116583483,2116616222,47120405, 2116658947,2116773636,2116878352,223903773, 533118992, 2116894785,2116944634,2116978838,154797508, + 2117028558,2117150469,153192931, 1356185619,2117314310,1186201705,2117445383,2117588363,2117648422,885866926, 2117674760,2117863715,2117910540,2117927012,943603743, 2117960440,954499108, 2117993791,2118059296,2118129956,2118191007,2118254649,853147686, 2118272499,2118313737,168395945, 2118374873,1155465847,2118434818,2118451257, 2118467600,242466845, 2118493962,2118582705,794361883, 2118617834,2118664195,232980546, 2118681655,2118723339,355735461, 2118887180,958644230, 2118985485,2119155804, 80936962, 2119188506,2119204918,2119240449,522108966, 735412290, 2119296782,2119320606,2119352374,2119389149,2119418335,2119450640,2119467029,12648582, 2119484361, - 2119558927,2119663647,2147358, 2119690000,210436320, 2119755537,2119843856,36110346, 2119870226,2119926700,2119993051,2120024172,2120066835,2120279828,880771113, + 2119558927,2119663647,2147358, 2119690000,210436320, 2119755537,2119843856,36110346, 2119870226,2119926700,2119993051,2120024172,2120066835,2120279828,880771113, 1300250662,2120369982,503709738, 2120400964,2120450060,2120466442,2120482822,2120499221,1566212162,48447509, 2120515606,2120532009,2120548388,2120564818,2120607509, - 2120663081,2120679436,2120695834,2120714266,697860136, 2120764691,2120814668,2120859660,2120876139,2120909314,134168645, 2120943820,2120975563,2121007116,724713491, + 2120663081,2120679436,2120695834,2120714266,697860136, 2120764691,2120814668,2120859660,2120876139,2120909314,134168645, 2120943820,2120975563,2121007116,724713491, 2121033494,145129514, 2121121813,2121138188,48676890, 2121154572,2752554, 2121180951,2121312024,2121121821,2121361177,2121404700,173228048, 2121459482,2121534721, - 2121564172,762445834, 2121590555,2121613333,2121629725,2121646089,2121662596,2121678979,21544969, 2121705244,2121744400,2121761901,2121801730,7634982, 134169115, + 2121564172,762445834, 2121590555,2121613333,2121629725,2121646089,2121662596,2121678979,21544969, 2121705244,2121744400,2121761901,2121801730,7634982, 134169115, 2121842727,2121875459,2121891861,2121908359,2031627, 2122163998,2122350624,120799258, 2122383406,2122432531,944554020, 2122458911,2122531860,2122579994,2122596368, 2122612755,2122629136,2122645530,431996930, 115198263, 634290192, 1921581066,2122671904,269664366, 2122761856,2122809350,2122827232,2122858498,255885354, 2122874882, 2122901281,2122940432,113770536, 2122956811,8611618, 2122980852,2123087888,2123105840,2123137030,115195956, 2123154573,2123202579,2123220358,2123284520,2117943317, 405012532, 2123303574,953892895, 2123350032,2123366442,2123383216,2123415986,2123448336,116228108, 307234920, 2123464770,2123497482,2123516215,2123546690,2123589411, 2123678889,2123720484,186270608, 333758480, 1727824124,2123802405,2123989091,357629958, 7733849, 43532317, 2124031782,2124129538,2124202208,2124234774,2124251172, - 1830715430,40042498, 2124268469,2124316684,2124333066,2124349524,616121374, 1226522660,2124382316,2124414978,2124431398,94437378, 2124448670,2124480543,20365319, - 2124506919,55377960, 2124578828,45613077, 178339851, 2124598484,2124644374,2124660752,2124677130,52805674, 2124693506,2124709898,574881834, 2124726284,221495311, + 1830715430,40042498, 2124268469,2124316684,2124333066,2124349524,616121374, 1226522660,2124382316,2124414978,2124431398,94437378, 2124448670,2124480543,20365319, + 2124506919,55377960, 2124578828,45613077, 178339851, 2124598484,2124644374,2124660752,2124677130,52805674, 2124693506,2124709898,574881834, 2124726284,221495311, 2124742675,2124759174,2124775555,2124791938,17448982, 2124818216,525172774, 2125031209,2125260586,2125332492,2125348902,2125365263,2125381654,690569292, 2125398048, 2125430796,719093786, 2125447190,2125463578,2125479952,2125496335,2125513136,2125546764,2125594636,2125611046,2125627824,2125660244,2125699271,1156269076,2125759311, - 45432934, 2125791316,2125824026,2125840395,2125856784,2125873162,2125889567,8389527, 2125915947,2125997868,2126059220,2126161709,195690517, 2126227246,7094793, - 2126292783,2126391088,8390293, 2126463060,2126495851,2126538545,2126626837,7372812, 2126643216,2126659599,2126675990,2126693270,1128366999,2126741939,80936981, + 45432934, 2125791316,2125824026,2125840395,2125856784,2125873162,2125889567,8389527, 2125915947,2125997868,2126059220,2126161709,195690517, 2126227246,7094793, + 2126292783,2126391088,8390293, 2126463060,2126495851,2126538545,2126626837,7372812, 2126643216,2126659599,2126675990,2126693270,1128366999,2126741939,80936981, 2126775370,2126807066,2126823426,2126839837,1931313154,2126856208,1299644456,2126875287,2126955594,2126988171,2127053301,2127095602,2127151143,2127183874,2127200266, 812957736, 2127216727,3309610, 10653795, 2127275827,2127446863,25559642, 2127488820,328909724, 2127527967,2127545313,2127587125,2127743671,2127790082,2127816502, 402309142, 2127855638,2127872031,414711829, 2127888400,1243004968,2127914807,2128045880,2128134603,1792114690,2128185844,2128234235,2128281626,2128297986,2128315515, @@ -4073,20 +4068,20 @@ static const unsigned int DictNodes[84251] = 2130624946,2130657710,2130709112,2130739216,2130755610,1280360484,2130772010,2130788364,2130804746,2130822082,2130853919,2130880317,2130936659,2131001382,2131019096, 387268832, 1809088551,2131075646,2131116139,2131148816,2131165226,2131182000,2131214770,2131247126,2131263500,2131279898,2131296258,919486479, 2131312656,2131329039, 2131346803,2131378197,121028630, 2131394562,2131410954,45613093, 2131869827,2131886214,2131902595,27738227, 2131928894,2132109119,2132148234,287572085, 1371340840, - 55116310, 2132170264,50937894, 2132246999,2132289344,2132344834,48070666, 2132371265,2132426771,2132445867,2132485954,2132574211,2132590676,2132623363,101924901, - 2132649795,1786663, 2132862788,2132976048,2133051037,2133114985,1448346035,114180127, 2133149203,2133231361,369050513, 2133281918,2133377871,907477423, 446529567, + 55116310, 2132170264,50937894, 2132246999,2132289344,2132344834,48070666, 2132371265,2132426771,2132445867,2132485954,2132574211,2132590676,2132623363,101924901, + 2132649795,1786663, 2132862788,2132976048,2133051037,2133114985,1448346035,114180127, 2133149203,2133231361,369050513, 2133281918,2133377871,907477423, 446529567, 2133410846,2133442990,545358410, 2133494148,2133559291,505544730, 2133657386,2133705758,867549196, 2133747337,2133796677,268976428, 2134035793,2134114409,1262142538, - 2134148087,196149290, 2134222662,2134294594,2134328594,184600242, 2134392848,1359757331,2134409270,2134442015,2134458387,412140015, 2134484807,2134562516,3211346, + 2134148087,196149290, 2134222662,2134294594,2134328594,184600242, 2134392848,1359757331,2134409270,2134442015,2134458387,412140015, 2134484807,2134562516,3211346, 2134655411,2134697800,2134753306,2134769666,2134787195,2134820669,2134868860,2134919137,15007745, 588612055, 2134976329,316620866, 2135074634,254197786, 2135363203, 2135451467,2135506960,2135533388,2135598925,2135687210,569081882, 2135703568,2135719946,202047509, 2135736322,752288691, 2135753006,2135785482,49020965, 2135801940, 2135834708,7096383, 2135868282,2135917023,2135949419,2135982108,2135998517,2136041294,2136260664,742965258, 2136294294,2136352591,2136434512,1124941864,2136490068, - 2136522834,56655893, 203767864, 1688829968,2136555607,630653507, 115769400, 2136605102,465552883, 2136653850,2136670210,2136686611,48513043, 1476821011,203162033, + 2136522834,56655893, 203767864, 1688829968,2136555607,630653507, 115769400, 2136605102,465552883, 2136653850,2136670210,2136686611,48513043, 1476821011,203162033, 2136713041,2136850458,2136867175,2136899586,2136915994,2136932383,2136948757,254443523, 2136969326,2137024338,2137097888,43237388, 2137139027,578043906, 2137178983, 502497317, 2137210896,1019543564,2137229888,2137286484,2137542752,2137590259,707480023, 2137686028,1762590802,2137702459,2137735178,2137751573,2137769749,2137833556, 714539029, 926696422, 2137867176,2137909077,2138003865,1371226134,2138056534,2138128386,1505624090,19267689, 2138154839,2138367832,8390287, 344736656, 1437254975, 150749487, 2138456086,2138472494,2138531673,2138603546,2138619935,48676921, 2138636318,2138669122,2138701835,2138718247,2138761050,2138832962,230719498, 2138865730, 2138900747,2138947594,2138964391,2139023195,2139136570,2139210727,118030445, 2139259768,2139318108,173113365, 2139383645,2139462191,2139505183,2139563870,2139678559, - 1561068034,2139760480,2139832330,2139848725,2139865134,2139924321,2140094548,2140127261,115114064, 2140144138,47120394, 2140176440,33400674, 2140209192,207011871, + 1561068034,2139760480,2139832330,2139848725,2139865134,2139924321,2140094548,2140127261,115114064, 2140144138,47120394, 2140176440,33400674, 2140209192,207011871, 2140226760,2140268387,2140596068,2140733456,263847957, 2140749840,15056917, 397771212, 2066743339,2140776293,2140884464,384729147, 131810491, 2140964009,2140997195, 2141044742,115818518, 2141061645,2141120358,2141366119,2141405199,491208742, 2141421660,2141455488,68599818, 152961454, 2087534676,2141503570,2141546344,2141719045, 933900, 326009051, 291095129, 161808415, 2141766133,2141798402,2141814794,159694890, 2141831222,2141864239,2141906793,2141984673,2142011394,168935450, 2142037866, @@ -4095,30 +4090,30 @@ static const unsigned int DictNodes[84251] = 2143168368,2143224277,539721780, 138019246, 2143273807,2143315825,237731868, 2143437925,2143496050,552878106, 1583546944,2143535130,2143554062,2143610739,2143741812, 150569958, 2143879189,38879289, 2143898710,2143978470,298270746, 2144010777,2144076684,2144135029,194691128, 493193314, 2144174120,2144190523,271892512, 2144233334, 2144446327,1772716063,2144536029,2144567755,169330657, 200261737, 2144617844,2144665602,297763287, 438075851, 2144685338,325386262, 2144796726,524910648, 2144839544, - 2145026155,2145058919,2145140757,48496642, 2145159251,1114127, 2145232761,1020334946,2145291096,2145347450,2145435755,2145468476,2145550355,2145566742,656752706, + 2145026155,2145058919,2145140757,48496642, 2145159251,1114127, 2145232761,1020334946,2145291096,2145347450,2145435755,2145468476,2145550355,2145566742,656752706, 2145583142,2145599526,6947119, 2145620386,8392091, 24297524, 2145681474,2145714195,2145730563,2145747003,2145789819,2146092802,2146156570,82558988, 2146173165, 327434278, 2146207360,2146264956,291061786, 2146307555,2146354066,195085750, 2146402320,1731362842,1214752637,2146418991,2146452606,2146500610,2146517002,2146533397, 2146549876,2146566146,1210220565,2146582612,2146615306,16269318, 2146633571,191053860, 2146697817,2146729987,111132675, 2146747212,1397719050,1284129615,2146805630, 2146943083,2196639, 2146979355,52576293, 2147042334,957399124, 212877341, 2147084159,2147188776,2147205146,107757610, 2147221542,121094201, 2147248000,2147303523, - 750126532, 2147337591,2147418133,2147435403,2147500086,2147534686,2147598417,2147641217,2147729515,2147762235,2147795426,2147903362,2148074232,2148107451,115015764, - 2148155430,177143810, 540917868, 2148181891,2148253738,2148270120,1245593716,2148286485,126517274, 2148302886,338313253, 2148329348,2148368386,2148384796,19447830, - 2148411269,73695243, 2148450314,33112067, 9109516, 2197152, 2148984712,2149072978,2149115785,471580703, 2149253179,2149286938,435257647, 2149345162,612270139, + 750126532, 2147337591,2147418133,2147435403,2147500086,2147534686,2147598417,2147641217,2147729515,2147762235,2147795426,2147903362,2148074232,2148107451,115015764, + 2148155430,177143810, 540917868, 2148181891,2148253738,2148270120,1245593716,2148286485,126517274, 2148302886,338313253, 2148329348,2148368386,2148384796,19447830, + 2148411269,73695243, 2148450314,33112067, 9109516, 2197152, 2148984712,2149072978,2149115785,471580703, 2149253179,2149286938,435257647, 2149345162,612270139, 2149384706,2149417014,2149459851,140607590, 2149531732,2149564442,2149580831,2149598096,768131091, 2149631936,2149721996,2149844339,2149875778,2149909242,2149942138, 2149990454,2150028825,2150072330,1296285725,2150098829,343297203, 2150253629,2150328206,272285715, 2150393743,1329217562,2150450363,2150499319,1723547664,1468121154, 56049695, 2150573968,2150688657,130531382, 2150746170,2150810494,2150843401,44466218, 2150875176,2150891532,643481959, 2150918034,178078658, 2151006638,2151056458, 2151088150,820445196, 2151105026,319619088, 160760322, 2151137325,2151170103,2151235610,2151262099,2151311252,2151376789,2151458710,2151646147,2151703783,2151809064, 300590597, 2151827234,694435856, 2151858192,2151874586,498663435, 2151891000,2151933847,2151999384,2152054815,1725088178,2152072131,2152123124,2152186309,2152218639, - 2152235863,2152277913,140253902, 2152367121,2152425370,2152703899,2152759726,2152808906,8611740, 2152841738,2152884125,2152957659,126042128, 2152988674,50806794, + 2152235863,2152277913,140253902, 2152367121,2152425370,2152703899,2152759726,2152808906,8611740, 2152841738,2152884125,2152957659,126042128, 2152988674,50806794, 2153005128,147816486, 2153072774,2153119760,2153136168,243745995, 2153152596,2153185739,2153234491,992084966, 2153269159,2153299989,2153316354,2153332757,2153349151, 2153365520,403390474, 2153382389,2153414682,2153431071,2153447907,2153490334,2153539487,2153845919,2153906236,2153988106,2154005111,2154047392,2154129313,2154217498, 2154234315,2154283900,2154332166,859963411, 2154349542,2154381354,2154397762,2154431419,2154500074,2154555298,2154660064,2154692624,448544787, 1424359446,2154711390, - 2154768291,2154840079,2154856464,2154872853,2154889228,2154905610,2096103445,2154922021,2019704848,2154938800,2154981284,3228079, 2155118608,1366671366,399425538, + 2154768291,2154840079,2154856464,2154872853,2154889228,2154905610,2096103445,2154922021,2019704848,2154938800,2154981284,3228079, 2155118608,1366671366,399425538, 2155139673,372834775, 2155210661,2155282448,2155299338,1985495056,2155331610,2155348271,573653295, 2155380812,2155414848,2155448484,2155479069,2155495443,2155511818, - 1298055197,2155528327,2155544598,2523137, 2155571110,2155750002,173490630, 2155827637,1077412335,2155872735,43368505, 2155905140,36143133, 2155921424,2129957, + 1298055197,2155528327,2155544598,2523137, 2155571110,2155750002,173490630, 2155827637,1077412335,2155872735,43368505, 2155905140,36143133, 2155921424,2129957, 2155947943,2156204096,2156265956,2156315095,73187359, 2156347423,2156363892,107757608, 2156383145,2156439464,2156495449,2156537769,2156668842,2156724246,2156741451, 1746911254,2156806604,2156849067,2156963756,1973567525,451219596, 2157185131,2157242285,2157348973,2157396427,2157445132,704036946, 2157466037,289046549, 2157520814, 633717654, 412008460, 2157560111,2157592614,2157609435,1367851023,2157651887,1066582027,2157692072,46514202, 2157740246,2157772831,16811273, 2157790031,2157832112, - 2157928624,2158012337,2158084119,36143234, 2158100491,2158116870,2158133267,2158149653,188940294, 2158166058,2158182516,108396554, 2158208946,2158280820,7602233, + 2157928624,2158012337,2158084119,36143234, 2158100491,2158116870,2158133267,2158149653,188940294, 2158166058,2158182516,108396554, 2158208946,2158280820,7602233, 2158297128,2158313483,2158329940,2158363835,2158411792,5734419, 195952671, 1384464425,2158428183,81707027, 2158864308,2158952927,6373977, 901464079, 2158987675, 2159050811,2159093685,2159241142,2159296528,197115914, 2159312898,1880653834,22216741, 2159330223,2159395742,1592229909,2159428109,2159477991,2159525909,2159552439, 123748383, 2159666583,2159722512,2293788, 2159749048,2160017515,2160050606,573603871, 2160099330,2160115718,307298325, 2160132108,55197724, 2160158649,1065926682, @@ -4126,32 +4121,32 @@ static const unsigned int DictNodes[84251] = 925909018, 2160559000,184860709, 2160607275,2160641432,2160689640,1571357143,2160721951,2160738314,41582598, 2160764858,2160885798,2160902189,2160943446,2160989038, 753713162, 2161033231,2161051112,55754773, 2161108923,1277362198,2161158076,911163411, 2161279277,2161311756,2161328138,2161344598,2161387453,198721538, 2161485758, 2161557516,1212454, 2161584063,2161656745,926302223, 161857562, 2161715136,2161901578,135299074, 2161928129,2161999884,1818631, 2162016310,2162049045,2006515733, - 2162075586,2162246392,664289802, 2162278455,2162353089,2162409482,2162427828,2162508815,2162556938,49086474, 2162573367,2162638899,631259167, 2162681795,514015269, - 2162737173,28000474, 2162754507,2162886674,2162966544,2162982922,2162999698,2163075012,17137685, 84934667, 2163166588,2163197518,2163246318,160727076, 295649285, - 2163615686,2163723149,2163802959,1763329484,2163845063,2163905020,2163951000,2163999029,2164051923,2164107208,2164162590,2164205513,2164375639,2164424723,264553368, + 2162075586,2162246392,664289802, 2162278455,2162353089,2162409482,2162427828,2162508815,2162556938,49086474, 2162573367,2162638899,631259167, 2162681795,514015269, + 2162737173,28000474, 2162754507,2162886674,2162966544,2162982922,2162999698,2163075012,17137685, 84934667, 2163166588,2163197518,2163246318,160727076, 295649285, + 2163615686,2163723149,2163802959,1763329484,2163845063,2163905020,2163951000,2163999029,2164051923,2164107208,2164162590,2164205513,2164375639,2164424723,264553368, 2164441119,4653483, 1910423776,2164457484,528859142, 150700034, 2164474315,2164533194,2164762571,2164850787,490029077, 2164893644,2164984465,2165048467,2165080066, 320897061, 2165096502,2165129231,2165145616,2165162010,2165178389,21102623, 295780378, 1571619681,2165196562,2165243930,204537871, 2165260300,108314731, 2165286861, 2165376392,2165417934,2165499855,2165629848,2165696464,2165769043,2165837574,206931441, 2165888529,2165932091,6374055, 2165974993,2166040530,130203677, 2166113310, 491028522, 55197701, 2166152484,2166302675,2166362543,8396848, 994168845, 2166412022,152945630, 2166475987,686309397, 2166532052,2166603797,1051902011,2166626302, - 2166653025,2166719731,2166767919,2166800420,2166816783,2166833183,2166849539,2166865949,2166882316,2166898707,2166915221,2166947971,76202007, 2166974421,234176517, + 2166653025,2166719731,2166767919,2166800420,2166816783,2166833183,2166849539,2166865949,2166882316,2166898707,2166915221,2166947971,76202007, 2166974421,234176517, 2167150041,2167209986,2037940250,2167226384,2167242790,58982416, 2167269334,2167358793,2167407672,2167472235,2167504938,198311948, 2167523035,2167554507,2167613399, 2167833255,227524696, 2167875544,2167947290,2167964554,2167996885,127713292, 2168045584,2168061978,2168078367,654983178, 216776735, 2168094756,2168111110,2168127509, 2168143874,737771558, 2168160690,2168193248,2168225814,1192951844,2168252377,2168324106,2168342308,2168389634,2933883, 408289290, 2168406062,2168455194,2168472472, - 2168520730,2168537103,2168553494,2168570159,2168602711,226050054, 576176139, 2168661978,2018131983,2168735343,2168782950,210583562, 2168815632,2168225807,46514212, + 2168520730,2168537103,2168553494,2168570159,2168602711,226050054, 576176139, 2168661978,2018131983,2168735343,2168782950,210583562, 2168815632,2168225807,46514212, 2168832890,2168881171,2168897555,2168913942,2168930306,1090961434,1941356582,2168946724,448544794, 2168964268,2169012243,2169028630,2169045002,2169061407,2169078818, 2169110635,2169143302,2169159682,2169176085,775897128, 2169192460,574881813, 1016168479,2169219035,2169399260,2169454658,2169487406,2169542759,2169585690,2169602050, - 143720458, 2169619857,2169683978,2169710557,2169769956,2169815106,2169847915,1695629318,2169882619,2169979394,2170013084,7733324, 2170064868,2170116161,695369759, + 143720458, 2169619857,2169683978,2169710557,2169769956,2169815106,2169847915,1695629318,2169882619,2169979394,2170013084,7733324, 2170064868,2170116161,695369759, 2170175542,2170218462,2170404873,62062615, 2170422338,822788125, 2360143, 2170496991,2170571639,2170602336,2170667027,275791894, 10829843, 2170687311,2170732566, 2170748930,1968881675,2170765371,2170798101,441335824, 2170815452,2170847248,13549571, 2170863618,2170880102,760135708, 2170915782,477937674, 2170972128,2171142166, 2171158530,2171174938,559906837, 2171201505,2171273232,21102618, 277970970, 2171299810,2171404719,2171440611,2171486227,2171503047,948666476, 2171561955,2171617292, - 153944075, 2171633679,2171650140,45350943, 2171693028,124470095, 2171758565,2172010987,1072333232,1075937361,2172053478,2172092428,435060738, 2172113304,105185292, + 153944075, 2171633679,2171650140,45350943, 2171693028,124470095, 2171758565,2172010987,1072333232,1075937361,2172053478,2172092428,435060738, 2172113304,105185292, 2172200935,2172305462,2172343540,2172413928,132153655, 482919433, 153993704, 110232131, 2172561385,1348173890,2172682673,7258178, 1866645520,2172725226,2173013033, 2173075472,2173091866,134840330, 2173118443,2173233132,323748331, 2173321254,1563607042,2173337640,1738113030,2173354071,2173403439,2173441921,2173485058,2173501522, 2173544429,158532078, 170704980, 2173616587,2173665911,2173700833,2173806574,2173912073,2173943820,471400974, 2173970415,2174026216,2174058498,339296282, 2174074918, 2174091336,2174167024,2174223848,2174272920,276906443, 116359174, 218677288, 2174330865,315293728, 1731248130,2174633190,2174730278,2174747560,2174779458,1082523660, 2174822386,427099938, 354369567, 2174911416,2174969843,258637839, 2175035380,2175221973,2175254628,2175287312,161726521, 2175313909,2175402010,2175418370,2175439010, 2175467542,2175484822,179765269, 2175536235,2175600608,246562826, 2175648344,244351012, 2175681049,2031420304,2175747095,2175801280,2175867020,2175926294,2175942668, - 2175969270,2176040986,51839016, 2176057403,14450818, 2176100343,2176395256,2176485179,2176532782,1559969832,2176575481,316294056, 2176706554,2176778256,246874150, + 2175969270,2176040986,51839016, 2176057403,14450818, 2176100343,2176395256,2176485179,2176532782,1559969832,2176575481,316294056, 2176706554,2176778256,246874150, 2176804859,157220866, 49217538, 2176854012,2176974894,2177024865,2177056770,2177073162,318832661, 2177089590,340264775, 340281508, 2177132541,170344450, 2177220667, 2177253419,2177286576,2177318933,2177337632,2177385355,2933095, 2177453272,2177499152,189136936, 2177525758,2177581099,2177613836,133414918, 2177631055,2177663030, 2177705983,264700343, 2177902592,2178023445,2178040384,2178082817,2178172683,2178253792,2147418122,2178302039,2178352044,2178416671,2178433458,1564639733,2178467135, @@ -4162,7 +4157,7 @@ static const unsigned int DictNodes[84251] = 2180186714,2180218896,2180235274,201572381, 2180251658,973406210, 2180268058,2180284418,126353448, 2180311048,2180366795,2180425737,2180671498,146456579, 2180792336, 722731050, 664060851, 126287888, 2180808706,2180825109,75530256, 2180841494,2180857868,2180874281,2180890630,471449621, 2180917259,1212973501,2181022993,2181070879, 2181088384,2181136492,900677643, 55132181, 900677663, 2181170016,1873101931,903970870, 2181244940,2181317287,898744755, 2181350223,2181382190,2181441549,1428996098, - 2181513270,2181556238,2181693445,2181709826,2181726229,645693456, 2181752847,2181834768,2181890132,2181925364,294535184, 2181973015,2182031377,1723187222,703676442, + 2181513270,2181556238,2181693445,2181709826,2181726229,645693456, 2181752847,2181834768,2181890132,2181925364,294535184, 2181973015,2182031377,1723187222,703676442, 2182234591,2182266917,2182283276,2182299660,750469135, 2182322787,2182414392,2182448976,2182496559,1033978974,2182530604,2182562710,2182611836,2182670354,2182774796, 153748216, 1296285702,2182794933,2182873175,2182924555,56639499, 176194472, 2182981651,280433030, 2183168012,2183184410,2183211028,2183299832,453476457, 2183342101, 2183675988,2183714802,1655210000,2183757890,2183791826,294633493, 2183833622,2183888898,569115759, 2183906504,3244071, 2183938060,2183964695,270401595, 2184036368, @@ -4171,24 +4166,24 @@ static const unsigned int DictNodes[84251] = 2185363458,152027162, 153174031, 2185381277,2185429023,2185447001,2185495468,2185560870,2077589535,2185592935,2185676132,2185750557,2185838604,110100499, 2185854992, 2185871371,2067251266,2185887760,2185904154,2185920543,219168811, 2185944948,2186002434,2186018837,2186035231,431505842, 2186059429,2186135631,2186199106,2186234088, 2186282153,189038607, 2186313730,2186330127,2186346498,2186362906,2186379266,119570443, 2186396979,2186444806,10650094, 2186462696,2186513795,2186569758,2186658251, - 412942342, 2186717215,243599501, 2186821634,2186838530,2186870795,18399238, 2186897440,609796111, 2187051101,2187110433,1083949075,2187182990,191906846, 177340887, + 412942342, 2186717215,243599501, 2186821634,2186838530,2186870795,18399238, 2186897440,609796111, 2187051101,2187110433,1083949075,2187182990,191906846, 177340887, 2187248781,2187299088,2187355234,2187448172,2187493483,2187526638,1245348776,2187978786,2188099606,2188116886,153748362, 2188165146,2188181506,984596490, 2188208163, 2188263434,842088477, 2188288314,2188437540,298352668, 677724191, 2188503077,2188574741,670859699, 2188591125,5865553, 2188617766,2188689885,2188722207,2188739191, 2188771412,2188804988,2188853703,128155677, 2188912679,2188985900,2189017100,2189033695,1838645274,2189076520,2189214327,2189246551,235552794, 2189305897,2189361164, 2189377575,2189410325,2189426719,192479242, 2189443084,2189459482,829308939, 2189476887,2189525281,2189557810,2189590594,2189624221,514883596, 2189705231,2189721616, - 2189737990,2189754434,583385119, 2189788552,2189819935,2189836298,2189852674,2189869112,2189901890,1408811018,2189944874,2190032977,2190065666,2190082059,223723535, + 2189737990,2189754434,583385119, 2189788552,2189819935,2189836298,2189852674,2189869112,2189901890,1408811018,2189944874,2190032977,2190065666,2190082059,223723535, 2190098655,2190132233,2190163989,2190180418,2190213151,347144198, 2190230413,2190316156,2190360602,2190376991,654983187, 2190393864,2190442517,2190459357,2190501931, 2190573578,2190590583,2190625079,49266728, 2190655595,681771024, 2190692034,780058626, 2190796844,2190869425,125239302, 2190901254,2190918246,2129641488,2190950624, - 2190993062,2191098910,1546650996,2191131548,2191179805,2191196191,2191212563,2191228994,2191263482,2191296444,2191376405,539394649, 2191392779,2191409627,212844554, - 275464197, 2191441949,2191458316,8398893, 2191484974,2191583279,1634304040,2191639901,2191687711,383860757, 2191714352,2191786010,2191804190,2191867915,957596082, - 2191885342,2191917531,2191949845,2191966234,2191982594,164266005, 2191998982,112427046, 2192025649,590823445, 2192130060,2192146531,490881066, 2192179231,134513074, + 2190993062,2191098910,1546650996,2191131548,2191179805,2191196191,2191212563,2191228994,2191263482,2191296444,2191376405,539394649, 2191392779,2191409627,212844554, + 275464197, 2191441949,2191458316,8398893, 2191484974,2191583279,1634304040,2191639901,2191687711,383860757, 2191714352,2191786010,2191804190,2191867915,957596082, + 2191885342,2191917531,2191949845,2191966234,2191982594,164266005, 2191998982,112427046, 2192025649,590823445, 2192130060,2192146531,490881066, 2192179231,134513074, 2192195599,5292053, 2192212982,2192246025,2192277544,2192293903,2192310575,2192353330,2192409385,2192441803,1850294711,2192491039,2192539677,1056243724,2192556520, 2098512790,2192588816,2192606764,393543720, 2192638006,2192671778,2192703504,118538266, 2192719912,2192736287,859963398, 2192753522,1621082114,2192795699,2193067187, 2193113124,2193129493,2193145868,2193162266,2193179672,2193227835,2193266263,2193326096,2193342480,1199783974,115769376, 2193358879,2193376138,2193409578,2193489986, 2193523319,2193557065,2193639927,2193670603,2193719317,2193735711,2193752949,1252737050,2193784920,2193817666,2193850436,2193900151,2193939026,56655891, 1127483851, - 658161967, 2193998283,117424143, 2194047035,2194090036,491620925, 2194243686,2194276378,2194292802,2194326346,2194384949,1493778915,2194499638,2194571330,146489360, - 2194604042,1233322563,2194620482,2194654031,2194696247,2194745400,2194800661,2194817100,2194849807,351338512, 2194876473,2195023930,2195081720,2195144770,6947749, - 120668186, 2195178700,768622604, 2195236923,2195292172,25559800, 2195309436,348782598, 2195358233,2195425331,2195475922,2195537941,2195555229,2195643575,3244256, + 658161967, 2193998283,117424143, 2194047035,2194090036,491620925, 2194243686,2194276378,2194292802,2194326346,2194384949,1493778915,2194499638,2194571330,146489360, + 2194604042,1233322563,2194620482,2194654031,2194696247,2194745400,2194800661,2194817100,2194849807,351338512, 2194876473,2195023930,2195081720,2195144770,6947749, + 120668186, 2195178700,768622604, 2195236923,2195292172,25559800, 2195309436,348782598, 2195358233,2195425331,2195475922,2195537941,2195555229,2195643575,3244256, 2195718603,2195769089,2195817312,2195889085,433045520, 2196264573,884774, 2196318269,2196406353,145309706, 2196443200,2196514878,2196619266,2196635669,2196652044, 2196668442,2196684822,2196701200,2196717608,2196733958,2196750348,2196766739,2196783120,2196799504,48054287, 2196815931,1596245022,2196850153,2196908095,2197022784, 2197094412,2197114976,246562842, 2197170241,275841889, 2197324691,2197383234,1655881827,2197439597,182861836, 2197471313,3686402, 2197514307,2197645380,2197750192, @@ -4197,7 +4192,7 @@ static const unsigned int DictNodes[84251] = 2199126453,2199162395,2199224374,2199257377,2199294360,2199372203,2199404976,2199439389,2199496779,2199617608,2199683110,19252136, 2199699495,2199732655,2199766821, 2199814175,2199830630,305463298, 2199873612,2199945238,2199961659,2199995345,2200043577,2200059935,377241626, 382485056, 2200076394,2200161070,2200226468,2200289296, 84738051, 2200315981,2200391298,2200436757,2200459631,2200502380,948994060, 2200535042,2200551938,2200587622,2200660046,175767611, 34701451, 2201141679,2201184336, - 2201322518,2201370651,2201403430,2201419807,2201436384,2201468994,2201501712,2201518090,858947643, 2201544785,2201601985,2201649164,2201665547,2201683730,777322502, + 2201322518,2201370651,2201403430,2201419807,2201436384,2201468994,2201501712,2201518090,858947643, 2201544785,2201601985,2201649164,2201665547,2201683730,777322502, 2201741394,2201927699,459980819, 2201948755,236273704, 282771485, 2202026022,2202042370,621559834, 2202058758,2202084037,2202141865,2202183763,2202223047,2202272677, 540753977, 2202308151,2506758, 2202353723,2202386438,1387446293,2202402870,2202436344,2202468378,2202485195,2202544212,2202632234,2202649929,2202700344,2202731376, 2202779667,2202806357,2202862482,2202911696,2202943948,2202976266,2202992682,2203009055,589004810, 2203025883,1404519285,2203059401,2203117654,2203222447,2203256697, @@ -4209,20 +4204,20 @@ static const unsigned int DictNodes[84251] = 2205646914,2205680481,2205712394,2205739099,2205777946,2205794316,2205810726,2205827084,122667050, 2205843477,2205860750,2205925414,147652650, 2205952092,2206074825, 2206132317,2206203914,950763954, 2206220298,800669715, 2206236713,2206256568,2206318604,437125122, 2206345310,2206483801,2206515202,2206531640,2206564381,2206581039, 2206613591,2206665076,2206728297,2206761419,579616876, 2206811030,2206860889,1411760560,2206912578,7733347, 2207000671,2207088661,2207105055,2207121424,2207137802, - 2207156027,2207203436,2207236555,2207285304,2207318047,2178269200,2207334431,2207350830,2207399957,2207417359,916652070, 2207465488,2207483409,2207524960,42599921, + 2207156027,2207203436,2207236555,2207285304,2207318047,2178269200,2207334431,2207350830,2207399957,2207417359,916652070, 2207465488,2207483409,2207524960,42599921, 2207679618,1590149163,2207746059,2207809576,2207825941,2207842391,2207891492,2207907861,2207924255,2207941520,2207973428,2208007070,2208049249,2208104507,2208139938, - 2208186389,2208206762,2208284759,2208334678,2208384263,2208481763,2208514086,2208530434,2208546826,344850461, 204537972, 2208563212,2208579808,2208612373,669532200, + 2208186389,2208206762,2208284759,2208334678,2208384263,2208481763,2208514086,2208530434,2208546826,344850461, 204537972, 2208563212,2208579808,2208612373,669532200, 1130627703,2208628795,2166013968,2208671842,2208811628,2208874512,2208890987,1343307788,2208933987,2209057935,1106182198,2209103893,2209121120,2209186784,2209234970, 884457511, 2209251338,3915815, 2209270115,2209316930,2209349653,2209366941,2209447992,148602901, 2209481822,2209532681,2209589348,2209693712,356516894, 2209710116, - 2209726479,2209742914,4440495, 115523600, 2209775659,56492051, 2209808823,2209851493,2209933414,2209989145,2210064487,2210124602,2210211944,2210268226,118292564, + 2209726479,2209742914,4440495, 115523600, 2209775659,56492051, 2209808823,2209851493,2209933414,2209989145,2210064487,2210124602,2210211944,2210268226,118292564, 139329564, 2210342936,2210414658,2210449466,2210513527,2210546857,2210588777,2210660418,131973344, 1029865474,2210695802,2210742288,2210758666,2210775947,2210850922, 2210938882,2210955285,2210971714,2211006847,129957993, 2211070384,2211102765,2211135918,6373484, 323010562, 2211194987,2211415600,433669289, 2211457132,2211529175, - 2211562103,2211595752,2211643408,408158253, 2211660000,405831686, 503316907, 2211692971,2211735661,2211817582,110100511, 2211899503,2212020753,2212057066,117407746, + 2211562103,2211595752,2211643408,408158253, 2211660000,405831686, 503316907, 2211692971,2211735661,2211817582,110100511, 2211899503,2212020753,2212057066,117407746, 2212102447,189513766, 2212145264,488243236, 2539536, 602980394, 2212282913,2212331526,2212347914,737902628, 2212374641,2212462597,1185824799,2212479938,2212511750, - 322994214, 2212528159,2212544531,56262659, 2212560912,2212580609,2212616538,2212659236,2212676631,741539843, 726695976, 2212735090,2213079155,2213167504,972587031, + 322994214, 2212528159,2212544531,56262659, 2212560912,2212580609,2212616538,2212659236,2212676631,741539843, 726695976, 2212735090,2213079155,2213167504,972587031, 2213210228,1640015988,2213242996,2213275765,41140624, 2213341302,34472051, 2213390453,2213455988,2213488756,2213521527,1640015988,2213242996,2213562436,2213609522, 1884137592,2213643600,13549587, 2213691421,2213707792,2213734521,2213871631,2213888022,2213904396,219578397, 232079376, 2213920804,569360395, 2213937168,2213953542, - 236716053, 2213969922,48201738, 2213986323,2214002719,2214019084,2214035466,2214052471,604372998, 2214094970,2214166544,2214183209,2214215716,449871900, 737755146, + 236716053, 2213969922,48201738, 2213986323,2214002719,2214019084,2214035466,2214052471,604372998, 2214094970,2214166544,2214183209,2214215716,449871900, 737755146, 2122645525,2214236712,536215583, 2214291579,363659752, 2214363273,2214379657,60899465, 2214406268,2214445078,2214471805,2214543389,2214559756,199344166, 2214576730, 2214608917,2125611034,2214625282,2214641704,8994837, 2214668414,2214838703,2214871042,2214887462,2214903844,2214921624,137544168, 2214969647,2965532, 2215002210, 2215035727,2215067658,2215084074,395264040, 234799146, 2215100470,2215133678,2215165973,2215182358,2215206958,2215264258,2215280666,2215297035,2064384002,2215313495, @@ -4234,18 +4229,18 @@ static const unsigned int DictNodes[84251] = 538329110, 2217754634,147407707, 136119234, 2217771537,2217803813,2217820176,51560469, 2217846918,519454758, 2217984021,2218000468,2218033178,238059551, 2218049562, 2218065946,45727756, 2218084263,2218125447,45350914, 2218215540,1256472604,2218278922,2218301786,1256571481,2218344458,2218360874,2218377218,38977668, 2218403976, 41566227, 110117743, 2218541087,2218559291,2218608129,2218672164,134021122, 2218692361,174047248, 2218770903,2218803630,2218852811,2218902043,2218934374,2218977417, - 2219255946,2219327510,2219343902,2219387019,2219443294,520945666, 2219501708,141295657, 2219590895,1438613506,2219632781,2219771033,2219829390,2219902603,17228829, + 2219255946,2219327510,2219343902,2219387019,2219443294,520945666, 2219501708,141295657, 2219590895,1438613506,2219632781,2219771033,2219829390,2219902603,17228829, 8391351, 2219966480,2219982858,2219999234,3866706, 2220021145,420364344, 2220065227,2220114002,112902175, 544556242, 2220157071,2220228620,2220245018,2220262309, 2220304528,2220392547,19267586, 287572059, 2220425282,2220458022,116883483, 2220477284,2220556318,2220589112,2220623538,408420362, 2220664977,2220920161,2220967112, - 2221009042,1187333010,2221080619,2221113486,1190494316,2221156499,2221212182,2221254804,43532290, 2221309974,2221330287,2221391903,6374825, 2221408258,265601052, + 2221009042,1187333010,2221080619,2221113486,1190494316,2221156499,2221212182,2221254804,43532290, 2221309974,2221330287,2221391903,6374825, 2221408258,265601052, 2221435029,2221523028,2221555722,2221572112,2221588501,289046557, 2221615254,2221719659,232079372, 2221752842,30523787, 1820509214,2221785094,2221801512,2221817877, - 1792524290,2221834322,2221877399,1645611604,2221999494,2222063698,1913964349,900376728, 2222106777,2222446459,2222522671,2195815, 2222556244,2222604767,371605542, + 1792524290,2221834322,2221877399,1645611604,2221999494,2222063698,1913964349,900376728, 2222106777,2222446459,2222522671,2195815, 2222556244,2222604767,371605542, 2222637058,199573510, 2222658453,2222745754,427135350, 726695948, 1126039564,2222866891,2222915808,2222953824,2223031708,2223079857,2223120101,2223178216,2223211367, 2223243274,2223260123,2223294432,2223342456,2223391191,2223423947,2223473400,189464588, 2223508867,2223554626,2223597723,2223685731,2223718689,2223752060,2223800386, - 2223840595,222674970, 136069151, 2223909020,338150421, 7176233, 2223981003,2224037422,2224081864,260457703, 274006028, 2224148590,2224193558,2224210004,216973333, - 2224243147,2224292361,2224326283,2224391106,2224433309,305430584, 2224613534,6619436, 2224767519,147243311, 2224816130,57376789, 1921381, 2224832550,120799270, - 2224848898,167985251, 2224866965,2224941215,339231123, 2225226283,2225259343,2225292111,2225324556,48676901, 2225367200,2225596577,32833538, 2225701290,45023263, - 2225733658,1262143971,2225750863,2225782820,2225799170,2225815563,532021250, 2225831995,42434600, 2225865007,163020916, 2225897578,2225979402,2225995835,497336331, + 2223840595,222674970, 136069151, 2223909020,338150421, 7176233, 2223981003,2224037422,2224081864,260457703, 274006028, 2224148590,2224193558,2224210004,216973333, + 2224243147,2224292361,2224326283,2224391106,2224433309,305430584, 2224613534,6619436, 2224767519,147243311, 2224816130,57376789, 1921381, 2224832550,120799270, + 2224848898,167985251, 2224866965,2224941215,339231123, 2225226283,2225259343,2225292111,2225324556,48676901, 2225367200,2225596577,32833538, 2225701290,45023263, + 2225733658,1262143971,2225750863,2225782820,2225799170,2225815563,532021250, 2225831995,42434600, 2225865007,163020916, 2225897578,2225979402,2225995835,497336331, 1144455234,926302246, 2226029081,1461207078,2226101203,131892065, 2226153634,2226192399,10371079, 377978892, 2226219171,2226257958,391970838, 70582301, 2226274311, 2226290825,2226307084,1988263977,2226333860,2226604420,967360524, 2226667560,2130019, 1013317654,2226694309,2226749450,2226765866,1328693267,2226792614,2226833876, 628097081, 2226865061,2226898249,56115202, 2226956455,2227012906,2227061169,2227093560,2227126314,51675172, 1549140020,2227153064,2227312253,2227357984,2227404829, @@ -4254,26 +4249,26 @@ static const unsigned int DictNodes[84251] = 2228585074,72908809, 2228633817,2228676783,105392304, 2228699148,2228715657,1949830, 2228732117,8994819, 9207811, 2228764681,2228781057,2228797577,2228813825, 2228830342,11059201, 2228846805,2228879372,2228895881,2228912154,2228928646,2228944917,2228961395,2228977700,2228994183,2229010472,2229026948,2229043231,2229059602, 2229075984,2229092482,8159247, 2229119153,12648583, 2229158025,2229174284,2229190790,33619994, 2229207069,32325643, 2229223434,2229239817,348618868, 2229256815, - 103596050, 2229288963,2229305360,2229321746,66682885, 2229338152,295731211, 2229364914,312197357, 2229650932,54657030, 114393109, 2229708979,1782218808,56066337, + 103596050, 2229288963,2229305360,2229321746,66682885, 2229338152,295731211, 2229364914,312197357, 2229650932,54657030, 114393109, 2229708979,1782218808,56066337, 2229748171,2229803181,2229856436,1966091, 16597295, 2229944623,2229978076,2230009868,2230026269,2230042842,2230075433,2230091797,2230108202,2621476, 2230130597, - 2230184117,2230413494,2230436165,2230479031,2230517766,29163527, 2230534150,933895, 2230550663,2230567043,2230583319,72384643, 2230599709,2230616083,79495189, + 2230184117,2230413494,2230436165,2230479031,2230517766,29163527, 2230534150,933895, 2230550663,2230567043,2230583319,72384643, 2230599709,2230616083,79495189, 2230632733,29376515, 2230665228,2230683353,155631635, 2230714374,2230730759,2230757560,2230796501,2230829085,2230845459,2230862042,2230894633,2230616121,2230911485, 2230964598,57606172, 2230992901,2231016348,2231058461,2231074835,2231091513,2231124502,89047049, 2231167161,7585811, 117751819, 2231222313,98418717, 2231238685, 2231255045,3850258, 2231271426,28344346, 2231298234,2231336982,2231353382,2231369730,113115137, 2231386119,2231402507,212877428, 2231418920,88162361, 2231435271, 1318862876,2231462075,2231599969,2231634332,2231681055,2231697409,2231713813,2231730178,2231746562,271925286, 2231763478,2231795733,17924127, 2231813597,2231844895, - 2231861286,74661916, 2231888060,2231926787,2231943194,1997602823,2231959553,2231976073,2231992450,1949699, 2232008839,2232025225,1114121, 2232051901,314130470, - 2232090664,2232107046,33177715, 2232123408,2232139788,2232156191,99483674, 2232182974,2232254473,2232270985,2232287858,111919219, 19431426, 2232336514,1949705, + 2231861286,74661916, 2231888060,2231926787,2231943194,1997602823,2231959553,2231976073,2231992450,1949699, 2232008839,2232025225,1114121, 2232051901,314130470, + 2232090664,2232107046,33177715, 2232123408,2232139788,2232156191,99483674, 2232182974,2232254473,2232270985,2232287858,111919219, 19431426, 2232336514,1949705, 2232363199,2232434901,2232477888,2232516916,339224768, 2232549381,2232565765,6602764, 2232582149,2232598540,571097100, 2232615687,2232647691,9535495, 2232674497, - 2232729605,36306972, 2232746298,107462697, 2232778793,2232795157,2232811542,198721576, 2233073666,1710030863,2233100483,2233369067,2233401396,2233434219,59785244, + 2232729605,36306972, 2232746298,107462697, 2232778793,2232795157,2232811542,198721576, 2233073666,1710030863,2233100483,2233369067,2233401396,2233434219,59785244, 2233469559,2233532476,2233615907,2233663971,2233697169,1405141002,2233748925,2233795496,2075672614,1917550607,2233827343,2233845153,47284230, 2233899523,2233942047, 2233958459,2234000197,2234056725,2234074240,2234122306,2234165444,2234263749,51314704, 2234356451,2234401200,1368031665,2234434889,283197451, 2234493126,2234619185, 250396693, 2234689735,2234777737,2234794007,24838276, 2234820808,2234876336,2234909591,2234959177,2235006998,2235023376,7144257, 2235050185,2235154442,2235170837, 2235187630,2235237270,2235285542,2235302798,1245316005,2235374804,538116122, 2235465810,2235508938,2235629599,2235645962,2235662338,123404326, 2235678722,2235697374, 2235744689,220266515, 163317426, 2235787467,2235861918,2235908107,505544720, 2235934924,2235990115,2236022886,2236055855,2236088366,2236138281,2236171002,2236203039, - 33783818, 2236220152,1012088844,2236253007,2236295373,2236335593,148799791, 2236393678,2236664180,2236727324,139984908, 2236744906,2236794412,2236825654,140247849, - 1461911554,2236858406,254427167, 2236885199,2236967120,2237071831,2237104146,36339843, 2237120566,2237163729,2237284884,427687938, 52674596, 7962664, 295731226, + 33783818, 2236220152,1012088844,2236253007,2236295373,2236335593,148799791, 2236393678,2236664180,2236727324,139984908, 2236744906,2236794412,2236825654,140247849, + 1461911554,2236858406,254427167, 2236885199,2236967120,2237071831,2237104146,36339843, 2237120566,2237163729,2237284884,427687938, 52674596, 7962664, 295731226, 2237336440,2237383115,1200130070,2237442258,708379103, 2237524179,2237628492,298958932, 2237661234,2237695905,2237743163,944635930, 2237781329,2237884628,2237956112, - 2237972490,2237989361,2238070901,2238103554,2238119974,2238136951,2238169104,283967490, 2238185538,2238218286,2238268575,607289370, 2238310613,2238629382,153567260, + 2237972490,2237989361,2238070901,2238103554,2238119974,2238136951,2238169104,283967490, 2238185538,2238218286,2238268575,607289370, 2238310613,2238629382,153567260, 2238682649,234405917, 2238726635,2238769366,2238892404,2238955979,123962398, 2239004710,1933369, 2239023042,2239092042,2239178967,2239284309,2239315970,1550286916, 2239332358,2239348767,2138619942,2239375576,2239483714,651509789, 2239529977,2239612073,2239648078,2239703257,2239890931,2239932634,3178522, 2240004555,2240059300, 2240111425,2240172168,1287291913,2240203470,2240324222,2240397742,2240451914,2240528390,2240544780,2240561162,2240578167,555402270, 2240611402,2240643110,1982480396, @@ -4281,19 +4276,19 @@ static const unsigned int DictNodes[84251] = 172539970, 253624347, 2241265806,2241299465,457539615, 2241341664,6193158, 126763841, 2241463362,692453600, 2241528841,593117186, 2241571041,2241627340,2241675266, 1949732, 420879240, 268190729, 2241691653,2241708167,933898, 2241734882,2241822729,2241849571,23101574, 2241888262,2241905570,2241937415,2241964260,2242003466, 2242046181,2242232329,2242248841,2242275558,20283507, 2242347014,2242363421,2242390247,2242428935,1678917651,2242445746,1464778759,2242478082,62472195, 2242494749, - 255737868, 2242537704,2242625749,2242658467,2242691078,2242707485,28327977, 2242734313,2242854918,2242871325,2242887721,2242904106,2242920451,2242936839,28377107, + 255737868, 2242537704,2242625749,2242658467,2242691078,2242707485,28327977, 2242734313,2242854918,2242871325,2242887721,2242904106,2242920451,2242936839,28377107, 255262761, 28016666, 2242963690,8390364, 2243182782,2243248265,111886470, 2243264702,136118845, 1521926282,2243330054,2243346461,107462697, 2243373291,2243413453, 2243444751,2243461251,211550347, 2242805781,286834728, 2243477621,2243510277,105201795, 30113794, 2243526661,2243543047,2243559436,2243575827,17448986, 2244094189, 2244231288,288620555, 178815096, 2244258030,2244307183,18956310, 2244329481,2244345875,2244362377,2244378639,2196059, 2244399093,2244427805,2244444196,1710735494, 2244460575,2244477065,191381509, 2244494242,902135945, 289161231, 2244526211,2244542595,1785865, 2244995312,907478071, 2245142769,2245339378,253624609, 2245478238, - 158254640, 2245542431,2245591343,2245634291,2245716212,2245805184,2245858951,2245945589,2246033462,2246068129,2246115354,297287682, 2246131789,2246174966,728138921, + 158254640, 2245542431,2245591343,2245634291,2245716212,2245805184,2245858951,2245945589,2246033462,2246068129,2246115354,297287682, 2246131789,2246174966,728138921, 2246265667,2246338807,2246492170,553041974, 226574420, 2246519032,2246672468,2246705178,1450197201,2246721576,180404250, 2246721552,2246738007,169322745, 2246787154, 2246830330,2246903015,2246951848,2246994171,2247098370,2247114762,2247131167,2247147530,833388560, 2247174396,169331457, 293191695, 193708335, 2247303948,2247411457, 2247459941,1784332354,2247508833,351911957, 2247540776,2247557132,2247573612,733890338, 2247614589,2247665917,2247993598,2248081462,2248114214,2248130992,2248164436, 2248222975,2248376322,2248395185,1215053830,2248442159,1178615845,2248485120,2248671713,184396033, 110298713, 2248720921,2248786912,2248845570,2248918046,2248956767, 2249025795,2249244674,2249261082,2850844, 2249277466,2249293836,2249310209,701169704, 2249326618,2249342978,2249359375,2249375766,80823320, 2249392134,2249408528, 2038497301,2249424955,2249457704,2249474067,1090961446,2249492058,2249523226,219529258, 2249550084,2249605207,2249654575,2249688571,2249736279,2249792955,2249851772, - 121339941, 2249902676,2249949268,2249982255,2250017540,2250069917,19447818, 2250145851,2250178863,2250212463,443645958, 2250245449,2250293562,2250336517,361431887, + 121339941, 2249902676,2249949268,2249982255,2250017540,2250069917,19447818, 2250145851,2250178863,2250212463,443645958, 2250245449,2250293562,2250336517,361431887, 2250369286,2250523225,2250555444,2250594520,2250647815,2250778888,2250853980,2250916143,2250948675,2251030540,2251046950,131334225, 568016978, 2251073801,2251112450, 2251128842,747356276, 2251146108,2251204874,2251434251,2251522955,878577409, 7144289, 2251587627,2251620409,2251636795,2251669514,2251685890,2251702328,2251735050, 8390763, 2251751961,2251827468,2251883256,2251915274,2251931702,2251965263,2251999615,713523284, 2252073229,2252237070,2252318991,2252374469,2252407243,2252455992, @@ -4302,19 +4297,19 @@ static const unsigned int DictNodes[84251] = 2253766740,2253799450,2253817124,2253865263,2253898761,2253930498,2253947559,1421164565,200492062, 2253990164,2254127114,2254146015,359841899, 2254198646,2254252309, 2254465302,2254618640,2254635023,2254651394,2254667814,2254684162,457490451, 2254700555,2254716968,2254733322,3850269, 75513887, 2254750190,43237413, 2254782480, 56311848, 2254798850,2254819856,963379221, 2254874903,166346781, 2254930357,2254962719,55017509, 2254979309,653099020, 2255011852,168935462, 2255028264,2255044629, - 51494951, 2070036502,2255066627,2255214917,2255291592,2255323162,1247494228,1633636162,2255339579,140607965, 2255379999,1180582203,2147825, 2255421462,189071362, + 51494951, 2070036502,2255066627,2255214917,2255291592,2255323162,1247494228,1633636162,2255339579,140607965, 2255379999,1180582203,2147825, 2255421462,189071362, 285343968, 442040609, 2255448344,2255603017,385646634, 2255652501,2255718651,2255783801,2255831062,162555920, 2255857945,70074560, 2256234778,2256470038,2256486402, - 2254880778,2256503087,497319946, 2256535598,7094414, 2256584734,2256619070,2256683080,2256748565,2256764950,2256781314,2256798923,2256830749,2256863234,131940363, + 2254880778,2256503087,497319946, 2256535598,7094414, 2256584734,2256619070,2256683080,2256748565,2256764950,2256781314,2256798923,2256830749,2256863234,131940363, 2256880098,232325220, 2256978062,2257011147,2257070363,2257142235,552452134, 2257174999,2040463379,2257207318,2257223682,2257240171,1117071644,794361915, 2257283357, 2257407882,2257453143,23856034, 2257512734,2257567790,628981776, 2257627423,2257715231,803192851, 183369766, 170803259, 2257731671,8396345, 3473427, 2257781826, 2257846303,2257862662,339034118, 2257879099,320456129, 2257912715,2257977365,2257993740,173965343, 2258010415,2258053408,2258108719,2258143540,2258232129,2258290051, - 2258446625,1245593602,2258520624,2015238, 1510768706,2258567255,251592833, 2258626850,2258815501,54296592, 2258867216,1606221883,2258921763,2258976811,480395323, + 2258446625,1245593602,2258520624,2015238, 1510768706,2258567255,251592833, 2258626850,2258815501,54296592, 2258867216,1606221883,2258921763,2258976811,480395323, 2259010136,124715479, 259080651, 2259052836,2259364133,170885229, 2259484703,86638621, 124862496, 1007697922,2259503075,2259599843,2259641029,2259697763,2259731283, 1471432225,2259806502,2260035879,372311271, 2260074799,2260107276,1526645651,2260125320,18606376, 2260183337,1332095274,2260241503,2260341284,2260396331,2260484567, - 866910210, 56000514, 2260520370,515620895, 2260609324,8399149, 2260783200,2260838702,2260910539,3244113, 2260959253,2260976563,2261008415,2261024778,92143638, - 2261046622,2261106698,119998943, 2261123074,1450205359,2261139993,2261207526,140247145, 2261248303,2261352980,2261401702,2261442335,2261501576,2936994, 1933378, - 2261551563,2261608752,2261788977,2261862568,45908004, 31424524, 2261942809,2262007820,534609958, 2262024213,2262040592,122568715, 2262063141,2262133042,557433687, - 2262238031,2262280499,2262336554,2262436606,2262466562,561823754, 2262486555,2262548486,73531397, 2262564876,2262581284,19267596, 2262598392,2262630421,29622284, + 866910210, 56000514, 2260520370,515620895, 2260609324,8399149, 2260783200,2260838702,2260910539,3244113, 2260959253,2260976563,2261008415,2261024778,92143638, + 2261046622,2261106698,119998943, 2261123074,1450205359,2261139993,2261207526,140247145, 2261248303,2261352980,2261401702,2261442335,2261501576,2936994, 1933378, + 2261551563,2261608752,2261788977,2261862568,45908004, 31424524, 2261942809,2262007820,534609958, 2262024213,2262040592,122568715, 2262063141,2262133042,557433687, + 2262238031,2262280499,2262336554,2262436606,2262466562,561823754, 2262486555,2262548486,73531397, 2262564876,2262581284,19267596, 2262598392,2262630421,29622284, 2262646800,2262663187,84705302, 2262680432,2262728730,2262745490,1704362010,2262811817,2262849802,2262876172,2262892652,2262935860,138018903, 2263034165,2263107593, 2263172425,2263220707,2263263542,2263515573,2263548917,2263623991,2263681254,2263728131,9207865, 2263746520,2263820600,19267613, 2263959279,19267613, 2264023069, 207618503, 2264040386,2264072624,2264104986,2264121647,2264154149,229949480, 1558921647,2264170955,2264219688,2264236038,478888371, 2264252719,1035370994,2264295737, @@ -4327,39 +4322,39 @@ static const unsigned int DictNodes[84251] = 2267629433,2267676694,2267693068,2267709547,1618411548,2267744224,2267791370,2267809570,2267840533,2267856922,279904258, 2267874943,2267973371,480444503, 2268020752, 2268037131,2268053506,246087690, 2268073718,119047714, 2268178757,2268349263,2268391750,2268446773,2268490055,2268610582,2268626946,2268643338,303611933, 1566654504, 2268665491,2268726327,2268768584,2268922337,2268971023,241942559, 2268988828,2269037391,2269069549,2269102514,2269135740,2269184010,1265631295,1249132556,2269210953, - 2269473098,2269544450,2269560838,200589324, 2269577453,2269611344,896533240, 2269663768,8603584, 2269708525,2269741068,1035355057,2269758453,2269824298,155516957, - 2269875599,2269938709,2269990457,2270056116,2270128459,162589004, 2270249017,148504578, 2270265397,2270299769,2270347944,2270380139,2270415319,2270461954,404570131, + 2269473098,2269544450,2269560838,200589324, 2269577453,2269611344,896533240, 2269663768,8603584, 2269708525,2269741068,1035355057,2269758453,2269824298,155516957, + 2269875599,2269938709,2269990457,2270056116,2270128459,162589004, 2270249017,148504578, 2270265397,2270299769,2270347944,2270380139,2270415319,2270461954,404570131, 2270480222,163735885, 2270554446,2270625927,46694429, 2270642188,244058106, 2270658581,103448613, 2270682133,2270734671,1039040534,2270849360,2270898513,2270971251, 1708900362,2271002639,94011430, 2271019123,2271035397,62357509, 376324133, 2271504722,2271805446,138313744, 2271832403,2271871435,2271920168,2271936815,2271970205, - 2272052192,2272100362,1859862567,2272117195,2272176468,236077061, 2272362603,2272396660,2272444950,2272487765,2272542758,2272559135,2272575509,2272591884,950009882, + 2272052192,2272100362,1859862567,2272117195,2272176468,236077061, 2272362603,2272396660,2272444950,2272487765,2272542758,2272559135,2272575509,2272591884,950009882, 2272608296,1738424326,2272624706,2272657632,2272700758,2272755753,2272772127,2272788506,273334283, 2272815447,2272905483,2272962904,2273159513,937607178, 2273223496, 2273296816,2273329610,2273365266,2273427970,1241071642,2273460236,2273476629,465076229, 2273493425,2273527196,2273575428,2273632430,2273722379,2273738754,1666973717, 184811558, 2273756917,2273805406,2273853442,2273869850,2273887115,2273952553,2273984533,2274000927,915472400, 2274017282,1830109215,2274044250,2274197550,2274246715, 2274290011,2274377835,2274411421,2274492444,2274508838,1850295234,2274526097,2274574777,943538182, 2274623530,116277258, 2274639898,945209803, 2274657556,2274705467, 182566938, 2274748764,2274803734,802570256, 2274821608,1744667669,2274869250,843382821, 2274896221,2275034881,2275083199,2275115970,2275148210,22069269, 2275191134, 2275284180,1762541570,2275338591,2275459159,2275509089,190645057, 2275547084,2275617120,2275688557,2275721262,2275770378,404897821, 2275786798,2275839989,2275868701, - 2275885075,2275901442,704135174, 2275928417,2276048934,307298336, 52150301, 2276066225,2276354403,2276436092,2276474911,801030165, 2276491553,2276526501,642695189, + 2275885075,2275901442,704135174, 2275928417,2276048934,307298336, 52150301, 2276066225,2276354403,2276436092,2276474911,801030165, 2276491553,2276526501,642695189, 2276573224,121356314, 2276590764,2276649316,2276737785,2276770251,1665811346,2276820931,2276868117,2276884910,2276933638,2276950082,2276993381,2277081114,2277097514, 2277113922,588218456, 2277147692,658620435, 47398924, 2277195807,2277212166,938049557, 2277228547,92749855, 2277255526,2277376031,2277392441,164413471, 2277410292, - 2277457936,2277474323,2277490991,412876908, 2277523475,2277539880,2107752486,2277556683,2277605484,2277642103,2277752898,2277788719,2277834762,2277851178,341819414, - 2277867975,2277919704,1858502662,294633482, 2277965830,199376962, 2277992807,2278146058,2278162463,2278180248,2278228427,2278277579,2278327198,2278359078,55869478, + 2277457936,2277474323,2277490991,412876908, 2277523475,2277539880,2107752486,2277556683,2277605484,2277642103,2277752898,2277788719,2277834762,2277851178,341819414, + 2277867975,2277919704,1858502662,294633482, 2277965830,199376962, 2277992807,2278146058,2278162463,2278180248,2278228427,2278277579,2278327198,2278359078,55869478, 2278375505,2278408204,2278424595,2278440981,2278458236,2278517096,2278555679,2278572042,2278588475,2278621250,2278653962,2278671916,2278703328,2278746473,2278883359, 2278899750,2278916162,2278950057,144326687, 2278981663,2278998467,2279030824,2279047194,734871611, 2279063598,2279112735,1735671814,1393590291,195919903, 2279129128, 2279145538,2279178339,2279211496,2279243805,2279260172,842465306, 2279277353,2279309333,112508968, 2279325736,2279342099,2279358485,2279375740,2204779488,2279424012, - 2279440491,2279473612,2279506827,2279573971,2279620620,2279637018,2279657880,2279742276,2279800834,2279817237,2279833666,2279867360,2279915531,2279931935,147505162, + 2279440491,2279473612,2279506827,2279573971,2279620620,2279637018,2279657880,2279742276,2279800834,2279817237,2279833666,2279867360,2279915531,2279931935,147505162, 2279948319,2279964693,2279981899,2280046598,2280062997,2280079362,802111526, 2280095804,2280178718,1742307370,272793610, 2280212799,2280243632,229654554, 2280286570, 84738076, 2280357947,2280390682,172982356, 2280410281,665993247, 2280456258,2280488986,2280505360,2280521734,2007449621,2280538171,2280570899,2278178854,2281062802, 70058557, 2281134895,2281226274,2281342987,368099796, 2281406507,2281441243,2281488851,2281539112,2281603960,206668193, 2281653071,2281695596,633044997, 2281810285, 211189776, 2281900314,2282006894,2282045743,146358314, 2282088815,2282291216,978485274, 383844383, 982466571, 2282307615,2189737994,2282328200,2282356757,2282373967, 2282416496,2282455121,2282487824,135577636, 2282505375,2282537002,2282553354,2282570635,2282635276,2282651686,2282668048,116277263, 2282686601,2282766478,2282809713, 6622071, 2282864782,2282897467,2282930713,2283006322,2283061336,936755229, 2283104627,2283170164,2131396, 2283309242,2283344999,2283373438,2279079948,2283415925, - 2283470864,2283487289,2283503628,1973567514,2283520026,2283536415,2283553978,2283586569,2283618841,2283684766,25559491, 2283727222,1917462, 2283782190,164118538, + 2283470864,2283487289,2283503628,1973567514,2283520026,2283536415,2283553978,2283586569,2283618841,2283684766,25559491, 2283727222,1917462, 2283782190,164118538, 2283832161,2283864118,2283902245,312033757, 2283956599,125583820, 93978652, 2284027988,2284062265,2284169592,2284218745,575324210, 2284284282,2284372398,2284423593, - 2284454320,436764682, 2284486663,2284506760,2284585044,335462507, 2284622888,2284693883,2284766184,2284814639,2190753821,126697510, 2284849943,2284912650,591118870, + 2284454320,436764682, 2284486663,2284506760,2284585044,335462507, 2284622888,2284693883,2284766184,2284814639,2190753821,126697510, 2284849943,2284912650,591118870, 2284929326,2284972412,508608566, 2285211603,2285267325,774963634, 2285339516,2285388668,610436652, 2285436987,2285469722,2285486122,648298508, 2285510704,2285568019, 942784533, 2285586237,2285635225,468003198, 2285682690,2285699100,2285715494,2285731871,116244486, 2285748283,2285781030,112476200, 2285797378,2285813771,2285830175, 997998602, 2285857151,2285994431,2286026773,85098512, 2286044150,2286077757,2286126089,2286160765,3473439, 2177384907,2286209950,2286256609,2286306308,2286374436, - 2286420981,984596522, 2286486497,2286518293,2286535581,2286616642,2286653326,2286698536,122683398, 2286714925,2286750859,2286829589,2286848634,2286895114,192479261, + 2286420981,984596522, 2286486497,2286518293,2286535581,2286616642,2286653326,2286698536,122683398, 2286714925,2286750859,2286829589,2286848634,2286895114,192479261, 2286911947,2286961090,2286993429,2287009879,2287058950,2287075350,2287092359,2287140906,2287157260,2287173658,2287190018,2287206456,2287239255,286408763, 2287298944, 2287386662,2287404520,2287452226,812875805, 2287484956,2287501343,943521798, 2287518155,2287577473,2287741314,2287856003,679624733, 536969505, 366116867, 2287937924, 2288036229,2288123930,680083458, 2288140591,2288174439,66814108, 2288249222,2288369690,2288386088,2288402442,2288418858,2288435206,2288451612,2288467980,1313357827, @@ -4369,22 +4364,22 @@ static const unsigned int DictNodes[84251] = 2289975378,2290008539,2290041291,2290090026,1119502377,2290106827,2290155579,2290189097,2290231690,2290297227,2290335773,923926554, 2290615209,312229995, 2290663915, 2290706829,2290810973,2290860064,2290893219,2290925627,2290968974,2291073040,2291089419,2291105803,2291122207,2291138566,2291154950,2291171330,1411137562,2291187714, 2291204122,1685603825,2291227304,2291318877,2291367995,283721870, 2291411343,2291483835,1253409200,2291542416,2140996520,194084876, 2291630972,588611640, 2291680744, - 2291728400,117424133, 2291747197,2291837329,2291959129,843399199, 2291990568,2292006938,2292023302,1394491404,116376312, 2292050322,2292302892,2292350992,116064294, + 2291728400,117424133, 2291747197,2291837329,2291959129,843399199, 2291990568,2292006938,2292023302,1394491404,116376312, 2292050322,2292302892,2292350992,116064294, 2292367444,2292400154,111542282, 2292416538,2292432911,775897104, 2292449361,2292484507,2292558227,2292646417,2292678710,2292711450,845725715, 2292727854,2292776998, 2292793376,2292836756,2292908098,152191078, 2292941103,2130027, 2292977718,2293033365,2293121046,803029003, 2293137467,2293170284,2293204797,2293252547,2293286008, - 2293317658,780746764, 2293334032,2293350429,2293366824,2293383187,2293400552,2293448770,2293481943,2293514282,977289232, 2293541270,112754710, 2293727339,769754457, + 2293317658,780746764, 2293334032,2293350429,2293366824,2293383187,2293400552,2293448770,2293481943,2293514282,977289232, 2293541270,112754710, 2293727339,769754457, 2293760913,2293809211,4653138, 2293852567,2293974169,2294022396,1547632699,358940684, 2294054924,140247139, 2294071828,683589651, 2294120479,2294137263,2294169657, 2294185996,147652618, 2294213016,1744044042,714244136, 252281320, 2294376857,2294540698,2294661579,2294711264,2294759434,2294775847,2294808642,2294841568,2294874122, 362201107, 2294890955,2294939704,2294983067,156876899, 1039499285,2295054338,2295070730,190366327, 2295097756,2295251870,2295294365,2295365663,2295382032,2295399649, 773882331, 2295447553,2295463976,1047789599,2295482238,2295513547,343301119, 2295562842,2295595027,2295611413,649723906, 1121976386,2295638430,2295867807,2296021002, 2296040100,2296104424,2296153327,2296185950,2296244640,2296349590,2296397870,2296447004,2296463390,116850714, 2296496417,2296539553,170803671, 108349926, 2296668330, - 2296709126,849510419, 2296726416,2296758293,226263499, 2296774722,2296808364,186056797, 2359729, 2296883618,2296987660,2297004070,2297021928,2297070894,727859266, + 2296709126,849510419, 2296726416,2296758293,226263499, 2296774722,2296808364,186056797, 2359729, 2296883618,2296987660,2297004070,2297021928,2297070894,727859266, 1056243733,2297120571,2297167884,2297185431,2297233867,2297288217,2297332183,649118156, 2297375139,2297719204,3227757, 2297872984,2297905162,244170773, 2297924497, - 2298025207,2298069856,2298134585,2286649360,2298150968,2298194341,2298298905,139477514, 2298363925,147652639, 2298381195,1970881318,2298447348,2298495030,114114565, + 2298025207,2298069856,2298134585,2286649360,2298150968,2298194341,2298298905,139477514, 2298363925,147652639, 2298381195,1970881318,2298447348,2298495030,114114565, 2195770, 2298528203,2298585654,2298691638,2298724383,2298740746,2162716, 2298757226,244221425, 2298849702,2298964391,2299029928,1126695021,802095115, 2299167954, 2299199490,188497941, 2299226537,1891877465,2299314188,2299330598,1933314, 2299357610,25560085, 2299462154,145309722, 1830437697,396279827, 2299505067,2299559964, 2047246348,213319699, 1294123855,2299577663,3686438, 2299652524,2299756563,2299772968,2299790456,2299822383,2299854860,2299872286,2299912362,2299953154,2299969546, - 2299985951,2300003216,2300035531,2300084236,978354186, 2300111277,2300373422,2300478961,2300510210,114409514, 2300527500,201376587, 2300576033,2300608538,112476191, + 2299985951,2300003216,2300035531,2300084236,978354186, 2300111277,2300373422,2300478961,2300510210,114409514, 2300527500,201376587, 2300576033,2300608538,112476191, 127257560, 2300635567,2300723308,2300756875,664289802, 2300821609,2300854731,2300903967,2300954427,2301002359,2301034536,2301050886,803323910, 2301067280,2301084457, 2301117263,2301149205,2301165599,1392706421,52609050, 1630781450,2301182058,2301266654,2301313090,2301356464,2301411384,2301444571,2301479412,2301526018,2301542943, 2301591609,2301610188,148635766, 2301651377,2301722664,122699814, 2301739029,2301756299,2301821835,2301886485,2301903695,2301935628,2301952006,776781830, 2301968916, @@ -4393,36 +4388,36 @@ static const unsigned int DictNodes[84251] = 2302821158,2302853151,2302872352,2302935079,2302967864,648134662, 2303001100,2303033366,773570562, 228294672, 2303049787,118243357, 2303082517,2303108891,2303131688, 2303148491,6324250, 2303197655,2303232631,2303295519,2303311893,2303328322,734396432, 2303371701,2303470006,2303558894,423034892, 2303033356,2303590422,2303606853, 978501672, 2303643458,150569051, 2303909492,2303967808,2304000029,844464168, 2304016855,2304049218,261129490, 2304092600,2304245813,2304278547,2304294934,1289634695, - 677381094, 612319270, 2304311324,2304327718,1199358411,2304348217,2304393282,2304436665,2304507961,2304524825,2304600506,2304655387,2304688613,2304787576,569115511, + 677381094, 612319270, 2304311324,2304327718,1199358411,2304348217,2304393282,2304436665,2304507961,2304524825,2304600506,2304655387,2304688613,2304787576,569115511, 2304819241,309559337, 2304846267,2304951185,2304999492,2305049873,2305098620,2305146911,2295054348,2305163285,2305180573,2305262476,2305311157,2305343947,2305393169, 77709328, 2305436092,2305518013,2305556501,2305572930,2305605634,2305622072,2305654871,2305704550,2305736811,2305769491,2305785868,2305812558,2305851426,2305976766, 2306031637,2306058687,2306130357,2306173376,2306228226,984252437, 2306244618,2306261431,2306294652,2288878476,2306343371,2306392738,450314268, 2306426344,2306475093, 45465640, 2306517441,2306676866,2306719770,2306736130,2306752568,2306795970,2306867240,1637351445,2306884628,124256715, 2306932796,2307014687,2307031050,2307048424, - 846594067, 2307096595,2276556821,180977683, 2307123651,2307227659,2307244063,56492053, 1403617301,2307262197,2307309583,268582950, 2307336644,259260435, 800096258, + 846594067, 2307096595,2276556821,180977683, 2307123651,2307227659,2307244063,56492053, 1403617301,2307262197,2307309583,268582950, 2307336644,259260435, 800096258, 2307391507,2307407903,112476181, 2307424268,2307440666,2307457026,135004181, 2307484101,2307762630,2307851294,1201225794,217579551, 2307883037,2307902875,2307965528, 268828682, 2308008391,2308096038,282821083, 2308117954,182551288, 294780938, 124796939, 2308221384,2308300075,2308341798,2308358187,2308390994,2308434377,2308516298, - 2308571223,2308630987,2308695321,358909377, 2308752374,2308784234,2308869927,2308916200,2308965277,2309046328,2309079046,1747976203,2309096617,2309128211,84721686, + 2308571223,2308630987,2308695321,358909377, 2308752374,2308784234,2308869927,2308916200,2308965277,2309046328,2309079046,1747976203,2309096617,2309128211,84721686, 2309155276,2309214582,2309243339,2309302733,676249619, 2309373979,2309406741,114409493, 2309423119,2309439500,2309455891,2309472277,2008776735,2309488671,2309505050, 2309521451,2309554219,2309588343,2309669624,2309702051,320734553, 2309734426,2309750794,2309768060,152944951, 2309816401,2309849134,2309908942,1551630348,2310062139, 2310094879,2310115184,345784341, 2310171013,2310259002,2310302159,2310390249,966524959, 2310449616,2310613457,774947417, 2310711762,2310824406,2310930453,2310947663, 152963069, 75464725, 2310990291,2311055828,124108812, 2311176706,929024893, 2311209419,1044562849,2311268821,2311356716,2311399894,107479042, 2311475197,2311537640, - 2311589984,2311634946,2311651366,2311667743,2311685008,2311717323,2311766054,2311793111,2311842264,2311924185,2311979639,2312011807,2312028176,2312044554,354369538, + 2311589984,2311634946,2311651366,2311667743,2311685008,2311717323,2311766054,2311793111,2311842264,2311924185,2311979639,2312011807,2312028176,2312044554,354369538, 2312060959,2312077328,2312093706,2312115673,2312176528,2312208465,2312247785,2312340719,476923039, 2312372331,2312406404,2312470554,2312486949,282804290, 2312504143, 2312536085,2312553448,2312612314,2312732763,2312765456,2312788166,2312841691,2312972764,1502101620,2313028623,2313076742,2313093141,354369548, 2313119911,2313185757, - 267534365, 2313242044,136003613, 2313289828,2313323879,2313398750,2313457146,402194464, 2313503567,1434960401,2313546207,2313732138,2313748501,2313764886,628555795, + 267534365, 2313242044,136003613, 2313289828,2313323879,2313398750,2313457146,402194464, 2313503567,1434960401,2313546207,2313732138,2313748501,2313764886,628555795, 2313788021,2313846794,2313863950,2313895955,2313912330,2313928745,2313945107,7634956, 1798490273,2313972192,641826835, 2314103265,2314223637,3309605, 2314240041, - 851640330, 2314256405,2314272805,1371897867,2314290206,1139638300,2314324129,2314354729,72646692, 2314375693,2314421095,2314453108,336855062, 2314469402,883998732, + 851640330, 2314256405,2314272805,1371897867,2314290206,1139638300,2314324129,2314354729,72646692, 2314375693,2314421095,2314453108,336855062, 2314469402,883998732, 2314485796,2314502182,496566313, 2314529250,2314627555,2314665994,2314682390,93700212, 2314698764,2314715173,99876875, 2314733438,2314764316,2314780708,2314799529, 2314840548,789938423, 2314882234,2314911780,2314938853,2314978418,2315037158,2315102695,340273640, 2315141161,129466406, 2315157523,724713484, 2315175786,2315206684, - 4112420, 2315225671,2315272218,59375628, 97533973, 1135902762,2315299305,2315479530,2007400464,551814153, 271400966, 2315568684,2315599882,2315616284,642154532, + 4112420, 2315225671,2315272218,59375628, 97533973, 1135902762,2315299305,2315479530,2007400464,551814153, 271400966, 2315568684,2315599882,2315616284,642154532, 1119502357,2315643371,2315872701,4309092, 2315911270,2315954668,2316058708,140247873, 1249165324,2316097651,30966237, 2316125047,2316156954,2316173343,2316189715, 2316206383,29032604, 2316238859,2316255234,2316271637,2316288847,2316320795,2316364152,2316413421,2316468253,2316491764,1095335946,2316518467,2316551005,1140047894, 1140342791,2316582953,2316599306,2316566644,2316615698,38830217, 2316642798,2316697610,303300618, 2316716123,11665539, 2316790255,2316861494,2316904944,2316959756, - 2316976154,118521872, 2316993907,2317025296,2317041675,2317058107,128581653, 2317101553,2317140084,2317156390,2359324, 2317183474,2317304322,2317347315,184598635, - 2317468126,2317539998,2317565964,2317582346,2317598749,111607834, 157499444, 2317615522,2317648752,2317698189,2317747341,2317795415,2317855041,2317893653,570884134, - 641826854, 2317920756,2318019061,5325706, 2318068214,2318175134,2318221371,2318254102,1829912587,2318674424,131334368, 5310471, 2318820467,2318985721,5308955, + 2316976154,118521872, 2316993907,2317025296,2317041675,2317058107,128581653, 2317101553,2317140084,2317156390,2359324, 2317183474,2317304322,2317347315,184598635, + 2317468126,2317539998,2317565964,2317582346,2317598749,111607834, 157499444, 2317615522,2317648752,2317698189,2317747341,2317795415,2317855041,2317893653,570884134, + 641826854, 2317920756,2318019061,5325706, 2318068214,2318175134,2318221371,2318254102,1829912587,2318674424,131334368, 5310471, 2318820467,2318985721,5308955, 2319091611,2319155714,148144149, 1691516984,2319198714,1181597722,850274811, 2319256120,2319297020,2319368230,50200578, 2319384630,649314306, 2319428093,2319582544, - 2319630365,2319647645,2319729177,2319794202,2319810592,2319854078,2319908890,2319925277,2319941719,2320001535,2320050688,2320285803,2320329217,2320394754,249282576, + 2319630365,2319647645,2319729177,2319794202,2319810592,2319854078,2319908890,2319925277,2319941719,2320001535,2320050688,2320285803,2320329217,2320394754,249282576, 2320613908,2320662554,15073292, 2320689667,2320777243,2320811971,649923194, 2320869892,2320924718,2320973834,114114589, 2320990687,2321033733,2321219670,2321255445, 2321334300,2321350658,2321377798,2321420571,2321465356,152971783, 2321481812,2321514506,284966918, 2321533255,2321590792,6193174, 2321645659,2321689097,2321825859, 2321907805,778290099, 1562627906,2321956876,2321980099,2322065930,2322188882,2322253238,2322311691,2322393612,570083511, 2322481583,2322513960,2322530342,1199374423, @@ -4431,22 +4426,22 @@ static const unsigned int DictNodes[84251] = 133382154, 62341126, 2323491343,2323556880,2323693675,2323728356,51068940, 1007992924,2323769873,1717403667,619298897, 2323868178,2323972106,2323988508,2324005389, 2324064787,176570399, 2324152386,501302213, 2324195860,2324392469,436732664, 2324482961,2324579212,126043938, 2219919297,322846732, 2324628456,2324687382,2324873308, 1325416488,2324906068,2324940188,2324987920,27623471, 567984157, 1896595510,2325015063,199442867, 2325104249,2325151754,210633737, 2325178904,2325250079,2024816677, - 2325266463,282427403, 2325293593,2325348358,2325364747,2325381357,2026733578,2325421343,2325512551,71188509, 2325555738,2325644412,2325693650,2325725250,19267682, + 2325266463,282427403, 2325293593,2325348358,2325364747,2325381357,2026733578,2325421343,2325512551,71188509, 2325555738,2325644412,2325693650,2325725250,19267682, 2325768731,124715115, 2325971003,896517385, 2326003722,291095208, 911279016, 2326022890,1490993173,2326080028,2326302578,780189725, 159449610, 2326351327,2326430684, - 2326462474,2326478907,2326522397,2326643448,2326678659,2326735390,2326839380,2326872523,2326931999,293421094, 2327167279,2327203819,2327282611,2327314907,499008167, + 2326462474,2326478907,2326522397,2326643448,2326678659,2326735390,2326839380,2326872523,2326931999,293421094, 2327167279,2327203819,2327282611,2327314907,499008167, 2327347254,2327380052,2327413195,2327472672,1597392218,2327527912,2327560276,292831284, 2327593044,6621670, 873644711, 2327626652,2327674973,52674576, 2327724054, 2327740418,2327756826,56311810, 2327783969,21069854, 285147278, 598687756, 121077772, 2327970656,2328046114,2328186113,2328215789,2328248330,2328265596,2328313915, 154238986, 1333167218,2328349171,2328455715,1917787, 2328576066,2328608799,155975709, 2328625192,1645068300,2328652324,2328888943,294961631, 2328947237,2329018390, 62767120, 2329037755,141411064, 2329117167,2329154057,2329200575,2329296991,2329346090,801488927, 623247414, 2329368092,2329444419,193708108, 2329528677,2329586214, - 2329750055,2329804822,2329831976,307611601, 2329921908,2329985871,2330017808,142835769, 2330034644,2330073600,2330148971,2330189957,2330233523,2330263578,99663884, + 2329750055,2329804822,2329831976,307611601, 2329921908,2329985871,2330017808,142835769, 2330034644,2330073600,2330148971,2330189957,2330233523,2330263578,99663884, 2330282484,2330329340,2330361894,2330379608,2330428304,2330465208,2330552873,2330676032,2330739213,518488074, 2330798634,2330894104,2330995243,2331034125,2331093548, 2331344942,17842690, 1183924226,2331394102,68583464, 133579945, 117900439, 2331427999,2331460599,2331526072,2331577601,2331607720,510182136, 196886566, 2331639810, - 2621469, 2331666989,2331770952,121307162, 2331836524,2331879982,2332066229,2332107882,2332147753,2332164133,2332180530,2332213328,2332246132,2332273199,83361833, + 2621469, 2331666989,2331770952,121307162, 2331836524,2331879982,2332066229,2332107882,2332147753,2332164133,2332180530,2332213328,2332246132,2332273199,83361833, 2332311602,420757532, 2332344402,2332377129,2332393498,1095319594,2332414480,2332459034,2332475508,2332491813,883785739, 38879237, 2332514193,2332557738,2332590116, 1095532660,2332616050,2332655732,2332672109,17924212, 642007062, 2332704809,2332721178,86081652, 2332743585,2332777459,55050360, 105791620, 2332813872,2316435477, 2332868618,2332887244,2332917770,151748620, 2170945572,4751401, 2332944945,1140342841,2332999709,1498890268,2333016180,2333032490,724713513, 2333059634,2333097989, - 2333114383,37748851, 2333141555,2333223476,113246683, 340280489, 2333714997,2333868054,120001654, 2333895222,706002970, 2334130257,444792848, 2334162960,3901360, - 2102083615,2334179330,4654154, 2334195755,2334229573,2334278063,2334311874,33112090, 2334360748,1503723536,2334419511,307235031, 2334534200,2334747193,5324907, + 2333114383,37748851, 2333141555,2333223476,113246683, 340280489, 2333714997,2333868054,120001654, 2333895222,706002970, 2334130257,444792848, 2334162960,3901360, + 2102083615,2334179330,4654154, 2334195755,2334229573,2334278063,2334311874,33112090, 2334360748,1503723536,2334419511,307235031, 2334534200,2334747193,5324907, 2334871361,2334933011,623034399, 2334951923,2335048588,2335107642,2335163401,2335205947,2335326699,2335369788,2335468093,122110772, 8388877, 2335728053,2335768677, 1443856415,2335812158,2335932438,2335948859,2335981621,2196513, 2336014382,2336063790,2336107071,2336227344,27246608, 125812752, 653017688, 111214594, 2336243799, 2336303680,854705881, 2336391799,2336434753,2336538678,2336576805,2336620565,2336647746,2336729667,2336907380,2336951063,2146518, 2337024580,2337188421,2337253958, @@ -4465,7 +4460,7 @@ static const unsigned int DictNodes[84251] = 611647504, 2344651311,2344716397,2344774244,2344829775,2344872549,2344928921,2344987238,2345232999,2345386242,2345418882,8399464, 2237628426,2345445993,2345666528, 133578818, 2345721342,2345806442,116376231, 153911323, 2345919064,2345967121,456737688, 2346044138,2346090527,2346107409,2346140568,900645776, 124470095, 2346189294, 2346231663,2292302838,2346330731,2346434614,198721542, 2346478188,2346568449,2346614796,2346631206,636273498, 446873612, 2346658413,735428674, 1869545932,2346714024, - 505544742, 2346745921,2346805870,2347094406,2347139101,2347159786,2347204618,2347221014,298663952, 2347242271,2347292295,2347368454,2347384889,757792770, 771309580, + 505544742, 2346745921,2346805870,2347094406,2347139101,2347159786,2347204618,2347221014,298663952, 2347242271,2347292295,2347368454,2347384889,757792770, 771309580, 2347401253,2347417612,275464249, 2347434090,698139560, 2347516737,2347559535,2011973983,2347630608,2347646986,134021157, 2347674224,296698889, 2347746153,2347821681, 2347959234,45629455, 2348001906,2348132979,6111253, 2348214900,20447381, 2348318732,101875748, 2348335643,2348367905,2348417461,851214365, 2116370444,2348450684, 2348509813,2348614546,2348673654,2348771959,2348829449,2348875792,2348893214,2348924968,2348941324,321716583, 2348968568,2349107683,2349137922,2349155593,2349187091, @@ -4473,26 +4468,26 @@ static const unsigned int DictNodes[84251] = 2350197374,2350279295,1462387521,2350548660,1195803457,2350629368,2350678032,2350698172,2350744466,8399488, 155779098, 155779098, 2350795133,1696826397,2350874708, 2350907499,2350941520,2351000193,2351272330,2351370098,2351416310,2351448129,211812451, 2351497242,2351513602,2351529994,170804632, 2351546452,240584051, 2351579278, 2351611950,2351662387,2351710265,886292482, 2351726594,119881738, 2351742997,2351759414,2351793543,2351824898,2351841336,2351874351,1651458053,2351908116,1595277771, - 2351956014,2352009071,892846759, 2352081538,2196135, 2352186017,2031927336,172845699, 794361937, 2352236266,118292482, 2352300138,44531750, 2352381990,3211373, + 2351956014,2352009071,892846759, 2352081538,2196135, 2352186017,2031927336,172845699, 794361937, 2352236266,118292482, 2352300138,44531750, 2352381990,3211373, 2352407474,117407756, 638878614, 2352463874,157499499, 2352483289,2352540292,2352743454,2352779781,2352906278,2352923161,2352988587,2353031813,405045258, 2353152680, 2353184824,2353218081,1309212975,241194662, 2353267754,2116168326,2353368586,56508428, 2353431023,131817242, 2353463361,429277199, 2353512507,2353556103,2353785480, 2353857677,343296187, 2353906165,2353941145,2354003996,2354020953,2354054095,2354113161,2354332173,2354380853,2354415988,2354479132,2354496013,2354555530,2354594095, 2354626626,2354659929,2354692155,5341270, 2341863455,2354725167,2354758263,2354790422,155926559, 2354806796,1542553627,2354823174,530694150, 2354839568,2354856013, - 2354888797,194166813, 2354939878,2354987051,2355030667,2355135372,1365999645,2355184649,2355216426,2355232790,2355249236,2355281932,226836511, 2355299976,250396688, + 2354888797,194166813, 2354939878,2354987051,2355030667,2355135372,1365999645,2355184649,2355216426,2355232790,2355249236,2355281932,226836511, 2355299976,250396688, 2355347970,2355380654,209305641, 2355440268,2355758164,2355806808,552452136, 2355839521,2355890144,2355939090,2355997325,2356117516,2356134322,433717279, 2356166740, 2356199529,2356232230,1124253999,2356259470,1888223521,2356314124,1725775910,2356341391,2356397443,2356543574,2356576493,140771795, 2356609070,2356658318,2356695029, 2356725188,158744588, 2356767376,1909328445,2356871255,2356927767,562316318, 2356980369,2357111442,2357182474,1060340246,2357198907,186467234, 2357232644,2357297583, 75513887, 2357330680,821100652, 2357364136,2357447381,246464575, 2357493814,2357537427,244614174, 2357772372,2357805345,730595366, 2357838742,2357893311,2252996624, 2357986187,1052575460,2358051287,707133472, 2358083638,117901829, 2358127252,2358198743,2358232697,2358280724,2358329370,2358347626,2358378518,757497908, 2358405781, - 2358592542,2358635158,397903260, 2358722644,2195598, 46858268, 234176524, 751091771, 2358756644,175767606, 2358815383,2358969642,2359020297,2359077528,133414950, - 2359148628,988053570, 25560173, 2359183827,2359230466,29458438, 2359246874,2359263258,2359279834,66814170, 2359323289,2359494975,2359525385,33734771, 5309626, + 2358592542,2358635158,397903260, 2358722644,2195598, 46858268, 234176524, 751091771, 2358756644,175767606, 2358815383,2358969642,2359020297,2359077528,133414950, + 2359148628,988053570, 25560173, 2359183827,2359230466,29458438, 2359246874,2359263258,2359279834,66814170, 2359323289,2359494975,2359525385,33734771, 5309626, 2359543283,221609999, 2359585434,2359705734,2359722119,628375575, 2359738404,221806613, 2359755585,86638633, 2359798427,30867571, 21872775, 2360257181,2360345098, - 2360388254,2360559988,2360623195,2360655874,166101666, 2360674203,2360738314,2360781471,500269096, 2360863392,2360961697,214483831, 2361060002,2361180591,834506575, - 2361213775,2361246547,2361311286,2361344526,2361377223,2361427264,2361458793,1579679763,2361492574,1893138486,2361551523,2361617060,2361737275,1287733254,8391173, + 2360388254,2360559988,2360623195,2360655874,166101666, 2360674203,2360738314,2360781471,500269096, 2360863392,2360961697,214483831, 2361060002,2361180591,834506575, + 2361213775,2361246547,2361311286,2361344526,2361377223,2361427264,2361458793,1579679763,2361492574,1893138486,2361551523,2361617060,2361737275,1287733254,8391173, 2361780901,2362043046,2362141351,507183197, 2362230080,2362272424,2362376768,454099432, 2362419881,5866993, 2362523660,2362540042,2362556437,173441063, 2362573890, 2266906640,2362638402,2362676262,2362722764,2362777013,2362829482,2362983001,2363016521,2363066847,2363113580,1056374850,2363148481,300582186, 2363206315,2363280207, 2363337388,2363442474,2363490363,2363533997,179667998, 2363671721,8399534, 284950540, 178586360, 231587850, 408420358, 2363714223,2363836885,2363878064,2363949149, - 2363999817,2364080650,2364114122,153191849, 2364172977,2364297071,2364361023,370262037, 2364402354,45760528, 2364523421,2364605326,275447810, 2364680883,168935481, + 2363999817,2364080650,2364114122,153191849, 2364172977,2364297071,2364361023,370262037, 2364402354,45760528, 2364523421,2364605326,275447810, 2364680883,168935481, 2364746420,1321993419,2364877493,2364992182,2365037534,2365065366,55377961, 2365113454,2365205175,1713129008,2365411005,2365489218,116064294, 2365532856,2365587510, 63816440, 2365620234,2365636647,2365671863,2365736281,2365768440,2365800501,118947892, 2365844153,2365964397,2365997062,2366013461,2366029855,2366046246,2366062613, 52822022, 2523152, 2366078988,2366095799,2366139066,2366193686,71188518, 2366210050,2366226442,2366242837,41582598, 2366270139,115294249, 2366581436,2366623927, @@ -4501,7 +4496,7 @@ static const unsigned int DictNodes[84251] = 2367679169,760949442, 2367931467,2367999852,2368045115,172639095, 2368088771,2368170692,2368356483,164036739, 2368373195,2368423994,2368487508,2368523420,2368579229, 113689071, 203817390, 2368634939,2368667658,29327593, 2368694981,2197356, 2368858822,2368947546,1720871623,2368989896,2369028310,8399561, 2369070359,2369126402, 2369142794,124863329, 60227624, 2369163403,2369282895,200261698, 2369350346,2369423793,2369470466,2369486904,2369530571,2369635780,2369678028,2369858253,2369912891, - 2369946644,2369994780,2370011195,2370054862,144621578, 2370165946,2370210275,2370240555,2370279513,2370322444,2370339255,2370374044,2370421583,2370453563,128450640, + 2369946644,2369994780,2370011195,2370054862,144621578, 2370165946,2370210275,2370240555,2370279513,2370322444,2370339255,2370374044,2370421583,2370453563,128450640, 185319461, 2370497231,158532023, 2370584660,2370617382,2370633747,2370650114,153191074, 2370677456,2370775761,51822594, 2370846739,1103495659,2370863115,2370879516, 2196996108,2370904234,12763270, 2370945035,2370961413,744767497, 2370978081,156073994, 2371010571,64847893, 2371037906,2371332819,2371398356,2371513045,2371635874, 382773974, 2371685990,2371726039,728154150, 2371791576,193839142, 2371897220,2359377, 2371971801,2372045139,2372091916,1010585190,2372108334,1094598698,2372158365, @@ -4509,10 +4504,10 @@ static const unsigned int DictNodes[84251] = 2372856540,2372911140,239468584, 2372938461,2373009545,2373025793,78954511, 2373048729,382468099, 612287040, 2373091331,2373107949,2373140499,1833664543,2373774047, 773570576, 2373872352,2374008952,2374025282,2374058104,2374074380,2374090872,2374107174,402718840, 2374123640,288620546, 27345016, 55443475, 2374150881,2374221973, 2031748, 2374254729,2374271110,2374287475,2374303879,2374320949,27738130, 2374352905,2374369286,2374385801,2374402070,2374418566,11059202, 2374434825,2374451206, - 2146615433,2374467733,1836793987,2374500518,517046403, 2374533255,2374549635,2374565897,10993801, 2374582298,2374598674,2374615052,2374631453,2374647943,1785988, + 2146615433,2374467733,1836793987,2374500518,517046403, 2374533255,2374549635,2374565897,10993801, 2374582298,2374598674,2374615052,2374631453,2374647943,1785988, 2374664201,42958879, 2374680617,2374696982,2374713350,34422915, 2374729749,2374746124,2374762626,899416198, 283722031, 2375232226,2375428835,2375461604,2375499797, 108298251, 2375517038,2375581698,2375598086,2375614486,146751545, 2375633082,2375663646,2375702852,2375778330,46268456, 1414938724,2375795767,2375836718,2376018661, - 2376187958,162268072, 2146906, 2376221605,146456587, 2376253543,1189839893,2352989193,2376335419,2376379110,2376417781,1753678255,2376461031,2376564774,499269935, + 2376187958,162268072, 2146906, 2376221605,146456587, 2376253543,1189839893,2352989193,2376335419,2376379110,2376417781,1753678255,2376461031,2376564774,499269935, 2376592104,2376674025,2376750804,2376843310,8389875, 2376898830,2376957983,124862593, 2376974395,2377007641,2377073663,2377121802,136118575, 402128908, 2377149162, 2377313003,2377400322,45907973, 2377418655,81166362, 2377482699,2377531418,2377548656,2377596939,1984823332,2377624300,2377738989,717914124, 124863143, 2377826370, 2277851146,2377870062,3228900, 2378006554,2378022924,96960523, 2378039356,2378121316,2378153996,2378170882,2378203157,117901074, 2378222867,2378268703,2378285075, @@ -4520,62 +4515,62 @@ static const unsigned int DictNodes[84251] = 2379098867,2379180788,2379253126,2379328245,2379415554,2379431942,2379448336,2379464723,185384982, 2379492086,153567254, 2379677762,152945592, 2379721463,2379776022, 2379792415,2379808779,726679563, 2379832871,117506101, 284704780, 2379901688,2380057302,2380104527,2380136507,2380180217,2380349532,846413864, 2380382220,1460977676, 36339730, 2380398647,283722488, 2380465080,159137802, 2380513710,2380562442,188940300, 1937063946,2380589818,2380737275,155829071, 2380841212,2380874155,2380907097, - 2380950268,2381070402,2381103969,2381135928,2381168929,2381201410,2381218552,623411231, 2381250591,2381267397,2381299740,257933324, 200524809, 2381316155,815812982, + 2380950268,2381070402,2381103969,2381135928,2381168929,2381201410,2381218552,623411231, 2381250591,2381267397,2381299740,257933324, 200524809, 2381316155,815812982, 166068746, 2381359869,2381441790,2381654783,2113612, 2381725698,199901194, 258868006, 2381753088,2381858575,7094338, 1503248386,2381905931,2381922453,2381966081, 2382004226,47939613, 2382031618,186318860, 2382315979,2382364756,2382408451,768458768, 2382544906,147423274, 2382561306,2382579728,109166608, 2382637828,2382768901, 2382921770,2382938124,2382954522,2382970891,2382987266,2383003679,2383020042,2383036970,2383053260,2383085580,2383101958,2383118890,244170767, 2383134730,2383151658, 112771110, 351911974, 2383167946,2383209673,2383268555,163316015, 2383347714,163644240, 2383375110,2383432416,2383489799,2383670024,2383806548,5308848, 2383839711, - 2383873640,2383937839,497550072, 2383981321,8962179, 1491468591,2384054720,2384117782,2384134447,2384177930,2384232450,5311551, 2384587532,2384855099,198754805, - 2384888659,2384953375,3227687, 2384969768,2384986137,2385018986,2385109843,2385167916,2385199134,2385232001,1411760560,2385264679,426770862, 2385297467,8391085, + 2383873640,2383937839,497550072, 2383981321,8962179, 1491468591,2384054720,2384117782,2384134447,2384177930,2384232450,5311551, 2384587532,2384855099,198754805, + 2384888659,2384953375,3227687, 2384969768,2384986137,2385018986,2385109843,2385167916,2385199134,2385232001,1411760560,2385264679,426770862, 2385297467,8391085, 108167180, 2385330242,125583389, 2385364934,2385428490,5310080, 342295202, 2385455885,266769040, 1489191215,8397509, 2385593513,2385625935,2385668878,2385788944, 2385805338,2385821715,56442892, 2385838134,2385871373,2385925209,562233398, 2385980175,2386182180,2386198566,225624367, 2386215019,131335089, 25559343, 2386250463, 2386331589,2386362969,2386395138,412123218, 2386411793,2386455312,2386586385,8612626, 2386658243,10649647, 2386717459,2386789277,2386870365,2386919434,2386942747, 2387012372,2387165238,2387208981,168236244, 116375654, 2387307286,694354442, 2387405591,2387641642,2387689709,241222154, 2387723660,2387804993,1249165318,2387837012, 2387880728,2387919284,2387979033,2388099609,2388166201,2388273946,2388362175,2388394010,701940171, 2388411821,2388460400,2388508726,143753242, 2388552475,2388632096, 2388708777,2388738107,2388771337,2388804109,297009259, 2388863772,124862571, 692305932, 2388978461,2389361213,18808850, 2389404446,2389623278,876019717, 2389666591, - 2389737932,2389770734,24297705, 2389814048,2389902717,210437511, 2389961505,2390059810,92143618, 2390108963,2390147118,2390198946,108527758, 2390256420,149128276, + 2389737932,2389770734,24297705, 2389814048,2389902717,210437511, 2389961505,2390059810,92143618, 2390108963,2390147118,2390198946,108527758, 2390256420,149128276, 2282733584,2390393135,2390436645,131269039, 57032733, 2390556975,17843230, 2390596227,2390738073,2390787089,2390835503,343294929, 2390868020,2390911782,2391075623, 2391262031,2391293974,5537818, 2391321384,2391452457,583008299, 8389939, 2391542320,2391591800,2391638082,352112566, 45023274, 2391670786,2391687607,2391719990, - 2391752788,2391786485,107151470, 206471178, 2391851018,2391867434,172835636, 2391884227,2391927594,166069033, 2392047654,2392070515,2392129839,2392162335,8399659, - 878608443, 2392179147,2392664877,2392817704,44679174, 2392835364,2392883342,2392915984,793051146, 160743440, 2392932884,2392992558,149110852, 2393066917,169323311, + 2391752788,2391786485,107151470, 206471178, 2391851018,2391867434,172835636, 2391884227,2391927594,166069033, 2392047654,2392070515,2392129839,2392162335,8399659, + 878608443, 2392179147,2392664877,2392817704,44679174, 2392835364,2392883342,2392915984,793051146, 160743440, 2392932884,2392992558,149110852, 2393066917,169323311, 2393146773,2393194568,2393271088,2393325584,139198474, 2393345408,2393402161,2393746226,1252464712,2393886397,2393970979,7146359, 2394041139,2196683, 2394188596, 2394226715,2394270517,2394341908,2394401590,2394456206,1993211958,2394499776,2394581288,2998298, 2394630967,36765827, 124862527, 1212842038,2394787136,2394849817, 186877097, 2394914875,2394958648,112754690, 2395127867,2395160879,54460431, 2395194292,1058308426,2395261069,995148310, 2395310143,2395340821,2395358302,1087045661, 194281579, 430669830, 2395406402,2395450169,2395488322,2395532090,2395630395,2395717879,2395761468,2395849006,835387418, 520142879, 2395881474,2395897912,1016659987, 2395941693,2396121918,2396211005,1013268501,2396258344,1015562250,2396285759,2396326576,111657017, 2396373529,2396438559,2396454922,2396471362,172638497, 2396504076, 520945693, 2396531520,2396636489,2396684370,2396717188,27738121, 2396734453,2396810049,2396881038,119783434, 2396923665,200687642, 2397023042,2397077959,2397126696, - 9060378, 2397143490,2397176111,2397208683,2329870967,745685034, 2397242937,1000490005,2072412179,2397350723,2113572, 2397472571,2397519912,2397536268,620281866, + 9060378, 2397143490,2397176111,2397208683,2329870967,745685034, 2397242937,1000490005,2072412179,2397350723,2113572, 2397472571,2397519912,2397536268,620281866, 2397552727,2397612868,654000888, 250216488, 2397732886,1677524994,2397753718,651509772, 2397793093,1612546067,2397858630,2398076930,2398094681,2398130696,2398202695, 2398421752,2398453997,2398486765,2398519298,2398535706,161628191, 2398563144,2398652329,200261732, 2398701444,2398765094,2240250159,2398784705,2398831605,2398907209, 124470381, 1217216514,2399043590,2399059989,287031308, 2399077875,2399109550,221003786, 2399158702,2399207461,87048204, 2399226277,2399272972,712147618, 2399300426, - 2399404108,2399436802,2399453661,81985542, 2399486799,2399520313,2399618057,2399652131,2399699877,2399742795,2399799709,131334904, 2399846454,2399890252,821805058, - 2399972173,2400174162,2400206936,273088538, 2400239682,262914058, 2400280253,2400355888,149128600, 2400387154,2400420328,2400457714,2400551019,2400584527,126272502, + 2399404108,2399436802,2399453661,81985542, 2399486799,2399520313,2399618057,2399652131,2399699877,2399742795,2399799709,131334904, 2399846454,2399890252,821805058, + 2399972173,2400174162,2400206936,273088538, 2400239682,262914058, 2400280253,2400355888,149128600, 2400387154,2400420328,2400457714,2400551019,2400584527,126272502, 2400627534,2400665626,2400682005,545259577, 2400698427,2400733424,2401135439,2401485910,665534474, 2401535865,171753503, 2401583341,2401615878,5308455, 2401643344, 162189669, 2401828923,2401861691,2019197462,61456386, 2401905489,2402020178,2402058242,1441497109,2402075820,2268512293,2402124079,2402157003,2402206127,2402238470, 79101974, 2402257687,2402320390,2402336818,2402370729,2402413395,200556573, 2402467862,2402484226,623411242, 2402500668,154058851, 2402584315,2402632151,2402665538, 321127760, 252706847, 2402734087,184910760, 478953943, 246136853, 2402796445,1225474407,2402888532,29901314, 2402954069,2403024935,164036610, 2403057723,1195869353, - 2403091283,2403156439,1734067375,2403188823,1900554, 2403238347,168869909, 2403287577,2403353207,2403385946,2403426206,2403478358,533070127, 2403602019,588185628, + 2403091283,2403156439,1734067375,2403188823,1900554, 2403238347,168869909, 2403287577,2403353207,2403385946,2403426206,2403478358,533070127, 2403602019,588185628, 2403648025,2403718442,6881388, 2403779230,2403811424,2403926042,2403942466,110134885, 2403975268,2404008395,2404057391,2404100951,2404330328,433225750, 2404451230, 2404483114,126025756, 2404500855,2404592473,2404713955,2404778138,8612698, 2404810775,9945237, 760955351, 2404827238,392921109, 2404860207,2404892693,2404909524, 2404941846,817332236, 2404958445,197115930, 2404991016,2405007362,248840213, 2405025249,2405145072,2405204815,235389016, 915745627, 1599769035,220364826, 2405238257, - 2405280604,2405548041,25673859, 2405575517,2405673822,2405748873,42926211, 2405793794,246087702, 2405810776,2405845194,275153656, 2405892856,2405924891,622428191, + 2405280604,2405548041,25673859, 2405575517,2405673822,2405748873,42926211, 2405793794,246087702, 2405810776,2405845194,275153656, 2405892856,2405924891,622428191, 502890537, 2405963975,2406023194,2406039554,311132188, 2406055938,1169866859,2406083423,2406170690,2406205794,2406254916,2406286665,2406334483,2406350869,2406368079, - 2406400059,664174594, 2406443872,5327331, 2406515147,229654543, 2406572404,162187002, 2406614100,1673137409,2406662904,2406706017,2406763352,2406809612,608316258, + 2406400059,664174594, 2406443872,5327331, 2406515147,229654543, 2406572404,162187002, 2406614100,1673137409,2406662904,2406706017,2406763352,2406809612,608316258, 2406826091,2406862685,2406919011,2407027566,110133313, 2407071886,2407115620,57376794, 2407170050,2407186458,2407202818,246087716, 2407219675,2407263077,2185364418, - 2407517594,2407580603,2407645643,3211778, 2407694362,2407721830,2407809937,2407869287,2407973319,2408033128,2408087686,2408103954,2408120455,2408136819,58982532, + 2407517594,2407580603,2407645643,3211778, 2407694362,2407721830,2407809937,2407869287,2407973319,2408033128,2408087686,2408103954,2408120455,2408136819,58982532, 2408153118,136003610, 2408185916,2408267782,457539606, 1637772137,2408285387,2408318779,2408367189,125583882, 640844377, 2408399702,2408448459,352059434, 2408508266, - 2408622955,2408742993,2408778342,2163495, 2408860828,1418969090,2408917868,149323797, 2408989151,2409032557,2409152649,884757, 2409173701,2409245550,820953110, + 2408622955,2408742993,2408778342,2163495, 2408860828,1418969090,2408917868,149323797, 2408989151,2409032557,2409152649,884757, 2409173701,2409245550,820953110, 2409311087,168903147, 133578833, 2409458544,2409549682,2409604237,2409687921,2409775706,8389834, 2409808175,2409851762,2410113907,1220886531,2410219409,1425063972, 1519272468,2410250671,860425427, 200720415, 2410283067,2410315830,2410359668,2410464466,2410496026,995639298, 2410513611,2410545174,2410561552,2410577930,2410594370, 2410638197,2410900342,2410971562,652722202, 2411015031,1738375682,2411085878,159432714, 2411119022,2411167765,2411184150,2411200543,402309149, 2411216906,2411233322, 185417765, 2411250158,2411282891,2411332425,2411382152,2411424632,2411495555,2998403, 2411511915,2411790656,458490391, 2411834234,2412070679,2412120355,2412169666, 223182905, 2412226089,2412265559,1189789734,2412316411,2412363807,1142997008,2412380461,2412424059,2412560470,470755841, 2412597519,2412675178,2412759507,2412807036, 8389075, 2412866428,2412937753,2413013885,2413101082,17843033, 2413128574,2413248514,111132698, 2413276031,2413330470,2413350017,2413399682,2413446369,2413494274, - 226050105, 166051866, 2413511115,2413559823,2413576223,121077772, 2413596166,2413660343,2413707330,280069022, 2413751168,2413805631,2413838338,2413854741,176455711, + 226050105, 166051866, 2413511115,2413559823,2413576223,121077772, 2413596166,2413660343,2413707330,280069022, 2413751168,2413805631,2413838338,2413854741,176455711, 2413882241,2414154384,2414198786,122568716, 2414216286,6733850, 2414264386,2414297164,2414330365,2414390146,602161171, 270401839, 2414461959,143753258, 2414526523, 2414559253,162579624, 1762590944,358514690, 2414576541,2414658167,2414690360,2414723159,2414772684,191905900, 2414816131,279822807, 2414886966,2414919706,1625589596, 2414936596,2414985272,775290922, 2415018040,2415050985,69156994, 2415088220,2415181877,2415225732,2415283131,246874138, 2415362069,2415379956,348323859, 2415429445, - 2415684486,2415979399,802963462, 2416086313,2416149525,131875342, 2416198761,2416247909,2416295948,198328346, 2416314964,358029415, 2416372616,2416462010,2408451, + 2415684486,2415979399,802963462, 2416086313,2416149525,131875342, 2416198761,2416247909,2416295948,198328346, 2416314964,358029415, 2416372616,2416462010,2408451, 2416494778,2416525338,3686406, 2416547635,2416607992,2416650242,2416691746,2416738316,24969239, 2416756704,2416814985,2416902745,258965530, 2416946058,1152008258, 176423227, 446464012, 2417084149,2417131579,2417175435,2417361976,163643819, 1973962938,1438990395,2417428421,2417470348,2417514385,2417558467,2417617805,2417699726, 2417853101,2417901580,1633517606,2417918371,233242913, 2417950735,2417967135,2417983500,868253734, 2418011023,2418346409,2418377833,2418426344,2418460147,2418492369, @@ -4587,11 +4582,11 @@ static const unsigned int DictNodes[84251] = 2421620746,2421637559,2421681055,2421751889,2421788262,2421817804,374030348, 2421852926,2421894048,2421981222,158220397, 2421998529,2422064741,2422112262,2422128656, 2214264843,2422145036,154813176, 2422161424,2422178015,2422210582,2422226970,564183052, 2422243388,2422336417,2422554663,296402949, 2422587433,332152913, 2422606143, 2422636556,6833105, 1678049322,2422652956,10829826, 1546650900,2422680482,2422899817,3538965, 51068968, 2422959011,1530806298,2423095749,2423139236,2423209999, - 2423230464,2423286693,2423357485,233243384, 1044021687,2423401382,2423505387,2423538091,2423570539,112771083, 2423614375,2423695278,50511877, 2199714, 342605941, - 2423745448,2417262603,2423834402,2423870397,2423920522,2423984908,1238384666,2424040361,2424155050,320733644, 2424193084,2424286123,2424384428,2424455170,223674406, - 775176218, 805799468, 2424473539,2424531885,2424602661,4145167, 481821686, 2424619517,254591028, 2424679342,254591906, 2424737361,2424794031,2424908720,133580300, - 2424990641,2425061388,2425077859,2425121714,2425217865,880754797, 4390915, 2425301939,425574403, 2425374265,2425482164,2425634853,2425651212,1223410718,153747542, - 2425667596,242368522, 2425684085,2425727925,2425831461,2425847889,2425891766,2425946118,1430077456,2425963812,2426013726,2420293658,111214603, 2426071991,5867706, + 2423230464,2423286693,2423357485,233243384, 1044021687,2423401382,2423505387,2423538091,2423570539,112771083, 2423614375,2423695278,50511877, 2199714, 342605941, + 2423745448,2417262603,2423834402,2423870397,2423920522,2423984908,1238384666,2424040361,2424155050,320733644, 2424193084,2424286123,2424384428,2424455170,223674406, + 775176218, 805799468, 2424473539,2424531885,2424602661,4145167, 481821686, 2424619517,254591028, 2424679342,254591906, 2424737361,2424794031,2424908720,133580300, + 2424990641,2425061388,2425077859,2425121714,2425217865,880754797, 4390915, 2425301939,425574403, 2425374265,2425482164,2425634853,2425651212,1223410718,153747542, + 2425667596,242368522, 2425684085,2425727925,2425831461,2425847889,2425891766,2425946118,1430077456,2425963812,2426013726,2420293658,111214603, 2426071991,5867706, 2426110069,2426153912,786415653, 2426252217,2426306641,2426350522,138641494, 2426448827,143753257, 2426514364,2426563517,2426863670,1543094763,2426896396,1438613530, 2426923966,157663244, 2427094044,2427125860,2427159104,2427191355,2427235263,2427404342,2427443170,2427502604,2427519014,404307997, 2427535885,38126328, 1844363276, 2427588770,417349713, 52576262, 2427617301,153993316, 2427637219,2427694016,2427813987,2427846761,2427879445,2427895839,2427912211,1640579992,2427928621,2427962274, @@ -4599,21 +4594,21 @@ static const unsigned int DictNodes[84251] = 2428862476,1049559042,2428880752,2428955590,2429021127,215777295, 2429108341,2429152200,2429206587,2429239306,2429255722,417939468, 2429273657,2429381577,2429550637, 131809770, 2429591551,408841162, 2429660107,2429814316,2429848078,2429894666,243220522, 2429911519,2429943915,50266153, 2429987788,335299082, 2430069709,2430168014, 2430223434,2430266319,2420114408,2430462928,2430534059,47108258, 2430567700,2430615562,2430631964,1933328, 2430659537,2752527, 254593527, 2430757842,2431036371, - 2431091179,2431123708,1759576146,2431156269,2431200212,2431323267,141852684, 2431373098,2431440758,1011957801,2011578379,412139628, 2431495125,2431631467,417595826, + 2431091179,2431123708,1759576146,2431156269,2431200212,2431323267,141852684, 2431373098,2431440758,1011957801,2011578379,412139628, 2431495125,2431631467,417595826, 2431667023,2431715385,2431778828,2431795675,2431839190,2431928753,2431975915,167903286, 2432008204,5668946, 2432027396,2432074634,2432106508,2432122987,2432166871, 273924098, 2432270560,2432303134,2432347096,427802705, 2432402345,401342474, 2432450598,2432467520,2432501305,2432609241,2432729547,1687224330,2432778270,2432822234, 212189194, 2432904155,27623851, 781762646, 152952001, 2433018844,2433100372,2433166301,2433237099,29622300, 2433280990,2433368171,2433401250,758202387, 2433444831, 2433614988,326926395, 2433674208,44253221, 2433794107,2433834434,48676867, 2433892364,1808515098,2433919969,2434007106,2434051042,2434105365,2018197545,2434122962, 2121334843,2434165731,2434285590,2434301973,2434318348,51068938, 2434345956,696123408, 2434436002,2434482861,2434532215,2434567652,2434613339,2434657253,2434919398, 2435039251,2435056110,781467679, 2435089924,2435141266,2435186690,2435203110,569720844, 2435222721,591888443, 2435268674,2435302665,2435072022,2435335466,2435384593, - 2435432460,2435460071,149536796, 2435498831,2435532448,2435563551,2435580962,2435612738,2435645472,2435679055,2277539878,2435712938,2335326260,2435776543,331710480, + 2435432460,2435460071,149536796, 2435498831,2435532448,2435563551,2435580962,2435612738,2435645472,2435679055,2277539878,2435712938,2335326260,2435776543,331710480, 2435796622,2435845263,2435891216,2435907610,2435924915,2435958046,2436005996,2436039575,2436094816,2436136986,2436153774,2436206228,114655244, 610549782, 2436262888, 2436533192,152241180, 2436596392,157155631, 2436639721,2436743977,2436775990,2122645519,2436819946,2436901867,2436957513,2437016556,411837048, 2437070900,2437103642, 8612845, 2437123211,5324905, 2437213166,2437349870,2437382574,2437442543,2437546443,2437597125,2437628751,2437660744,878357488, 2258108470,2437737457,2437857282, 626770846, 2437884914,482919363, 2438065139,2438114292,2438201375,2438217757,2438234128,1467777064,2438250525,393543706, 2438268333,2438327285,2438430786,2438463597, 2438496259,2438512642,2438531497,2438563385,2438671350,2438758818,942080028, 2438791189,2438807568,2438823946,2438841331,2438856709,2438873119,155533350, 2438900727, - 2439005078,2439053331,2439069718,1051536376,1378550814,2439097337,2439151627,1624867680,2439168431,2439212026,177242150, 229359638, 2439282714,2439299103,226951189, - 2439326715,2439457788,2439584650,837387285, 344539158, 2439645879,3162118, 2439692902,2439736317,2439479315,2439840777,319144043, 2439883774,2440004431,265682959, + 2439005078,2439053331,2439069718,1051536376,1378550814,2439097337,2439151627,1624867680,2439168431,2439212026,177242150, 229359638, 2439282714,2439299103,226951189, + 2439326715,2439457788,2439584650,837387285, 344539158, 2439645879,3162118, 2439692902,2439736317,2439479315,2439840777,319144043, 2439883774,2440004431,265682959, 2440042193,2440086552,2440134666,4390954, 2440162303,2440284174,269108118, 319701033, 2440332362,788300891, 2440364051,2440380438,3719234, 2440398323,2440430415, 2440462346,2440479152,2440511791,2440547751,2440577039,2440593439,651329542, 2440621056,2440822786,2440850433,2440938350,2441003090,19268431, 198328361, 2441041687, 2441089432,139821356, 184387851, 2441167713,2441200104,2441233727,2441298373,2441331171,2441374722,2441445409,2441494633,2441527334,2441543746,2441576473,2441609219, @@ -4624,7 +4619,7 @@ static const unsigned int DictNodes[84251] = 2444027759,2444116801,2444148757,1622261790,2444176393,2444263726,2444307466,2444496896,2444553227,2444641625,2444673043,13713445, 2444693777,2444787766,2444822060, 2444853258,2444880908,2444962829,2445066252,93978662, 2445082662,480247820, 2445099926,2445149240,2445217513,2445279313,2445312498,2445361260,2445396241,2445509655, 2445557826,2445591415,2445624143,2445656110,2445706081,6127631, 2445746276,2445819935,141836300, 2445836309,285344615, 2445856626,2445901826,16269447, 2445918745, - 2445983754,24297898, 2446011406,2446189597,2446229943,2446262278,2446278687,248774672, 2446296147,196149250, 2446371342,966475786, 2446442508,2446458962,985579560, + 2445983754,24297898, 2446011406,2446189597,2446229943,2446262278,2446278687,248774672, 2446296147,196149250, 2446371342,966475786, 2446442508,2446458962,985579560, 2446499529,2446557213,2446584205,2446689065,2446721090,2446765071,2446830608,2446983194,2446999984,2447032379,116375660, 2447065939,2447130640,2447147018,2447174673, 2447229021,2447278082,2447294490,1407598623,2447310877,2447328245,2447392834,692415506, 2447425592,2447458750,2447524770,2447567891,2447813652,25559475, 2447900738, 2447933470,2447966234,759710147, 2447982699,2448016358,2448057496,2448108565,2448157718,2448228364,2448244746,2448261141,2448277543,679690543, 2448310318,2448361927, @@ -4633,14 +4628,14 @@ static const unsigned int DictNodes[84251] = 2449719818,2449752070,54657026, 2449769815,2449819264,1206403531,2449877077,2449933563,2449982200,325256015, 2450025498,2450215944,19252136, 5324899, 2450260006, 2141749288,2450277607,485752854, 2450325863,2450358284,2450374666,2450391061,2450409275,2450467867,149323807, 2450538542,2450594015,2450653186,2450669589,2450686018, 2450730012,2450795549,2450926622,2451270687,2451325688,2451359242,2451418144,2451505245,2451556130,2451587093,471580703, 2451603522,2451636984,2451680289,2451762210, - 2451849228,2451865640,2451882010,3473840, 2451898414,2451949513,2451997217,2452048058,240593955, 2452079115,2452128591,2452160531,2452177199,2452220964,841155473, + 2451849228,2451865640,2451882010,3473840, 2451898414,2451949513,2451997217,2452048058,240593955, 2452079115,2452128591,2452160531,2452177199,2452220964,841155473, 2452286501,2452368422,323732216, 2452499495,2452537346,159432726, 253543923, 2452553836,2452597800,2452974633,2453048226,2453095814,49791002, 5881899, 2453160023, 7733355, 2453209190,253706266, 2453253162,2453389333,2453417003,2453521376,2453569995,335464307, 2453618744,2453651475,2453667916,116375640, 2453702793,2453782580, - 147816470, 1205567525,2453826604,2453949824,2453998803,2454045167,2454077480,140799021, 2454093890,2454137902,2454283258,2454334511,2454405551,2454437934,244220806, + 147816470, 1205567525,2453826604,2453949824,2453998803,2454045167,2454077480,140799021, 2454093890,2454137902,2454283258,2454334511,2454405551,2454437934,244220806, 2454487094,2454522373,2454569011,42369055, 2454605057,2146403, 2454634942,2454700074,168509974, 2454718417,128450980, 2454766607,2454816116,2454875184,2455104561, 2455193134,2455241793,51675141, 2455324279,2455399474,2455481395,2455650357,125698069, 2455683919,2455715866,2455732243,2455750131,2455782430,2455814173,2455830568, 2455846931,2455863317,121815887, 2455879711,2455896074,2455912450,2107883558,2455928916,2455963019,2456011800,2456059950,2456109068,268451882, 751468575, 2456125527, - 2456174673,2456208535,806633477, 2456257566,2456290172,2456347608,2456405231,2456443744,24299186, 2456485919,79757338, 2456502359,1336934402,2456551440,258097162, + 2456174673,2456208535,806633477, 2456257566,2456290172,2456347608,2456405231,2456443744,24299186, 2456485919,79757338, 2456502359,1336934402,2456551440,258097162, 2456579124,2456874037,2456961556,2457010202,580158332, 273203202, 2457033193,2196977, 2457128316,412139625, 2457157642,2457174058,2457191411,2457206810,2457223180, 2457239571,2457255948,1409630239,2457283638,2457404502,2457452546,2457468966,2457485324,2022474199,2457501712,2457518120,2457534474,2258436106,2457551281,2457584095, 7389194, 2457616406,2457632770,2457649209,2457665567,447561766, 2457693239,119801035, 2457813076,29327755, 2457857080,2457927787,1396671721,2457960460,2457976889, @@ -4650,16 +4645,16 @@ static const unsigned int DictNodes[84251] = 2459566615,2459598935,2459649872,5325322, 2459708481,2459762795,2459795485,257310751, 2459811866,141541392, 2459839554,6029317, 2459912678,2459942972,2460036163, 2460144172,2460205084,2460221470,2460254234,2460271603,2460286992,2460303379,2460319765,51068944, 2460339416,2460385735,2460434684,307462186, 2460467238,2460494916, 700907542, 150700072, 2460565563,1571192870,2460598312,2460614711,2460682389,2460746359,234848287, 2460778517,2460794910,2460827704,2460860848,2460904517,2461281350, - 2461401119,2461417574,2461451371,47710223, 2461484119,2461532661,171000243, 2461568378,408240144, 2461655036,2461707335,29376514, 1454047650,2461838408,316703018, + 2461401119,2461417574,2461451371,47710223, 2461484119,2461532661,171000243, 2461568378,408240144, 2461655036,2461707335,29376514, 1454047650,2461838408,316703018, 2461941791,371277839, 300925036, 2461969481,2462043632,2462133322,2462248011,2462297164,2462362701,2462516254,2462549336,2462598032,2462629947,2462663191,2462696025, 2462730975,2462811123,2462826517,2462842902,2462859290,2462875660,94437392, 2462892034,2462908431,216973314, 2462924840,1054785542,2462941250,172539970, 2462973998, - 2463023211,373047302, 2463067214,2463137808,5718058, 2463154634,2463186954,2463203394,2463236555,2463285258,2463301856,2463336563,2463400473,2463476815,166161488, + 2463023211,373047302, 2463067214,2463137808,5718058, 2463154634,2463186954,2463203394,2463236555,2463285258,2463301856,2463336563,2463400473,2463476815,166161488, 2463547929,3211363, 2199995914,2463612982,2463645756,2463731651,2463794039,163545140, 2463834012,2463951953,2464071746,2464115794,2464219195,2464252006,2464286184, 538198617, 2464345171,2464547834,136118326, 38879270, 52756501, 2464596008,2464612383,2464628755,2464645132,2464661514,2464677909,2233548812,2464694754,2464795897, 2464842808,2464907290,7389203, 2464934996,2465131605,2465186705,376537103, 25559341, 2465235481,670189216, 198705753, 2465303722,2465383414,2465417230,2465464422, 2465497154,2465530811,2465596310,2465645450,2465677615,2465710132,2465742858,933928, 2465770582,523485243, 2465918039,2466031440,2466086924,82542613, 2466103317, 2445639696,2466124459,2466196568,1549533196,414089256, 2466376793,2466418074,2466480140,189136906, 2466507866,128255006, 2466644024,8390902, 2466688091,2466791451, - 118292539, 2466833346,2466916641,2466998382,2467070383,2467114076,420790411, 2467497694,1058668597,2467545221,2467579763,2467610653,16236575, 2467627024,2180576, + 118292539, 2466833346,2466916641,2466998382,2467070383,2467114076,420790411, 2467497694,1058668597,2467545221,2467579763,2467610653,16236575, 2467627024,2180576, 2467643484,2467680592,2467726275,2467774997,2467840031,2467856440,283197461, 2467889206,2467921979,2467958418,2468015197,2468038178,2468086194,1993555989,2468121235, 2468217806,6373771, 2468249660,2468331522,2468347942,2468370309,2468424798,2468462710,618154142, 2468506719,2468774425,136790044, 414089218, 2468839470,2468888635, 185810956, 2468932704,2296184886,2469117974,2469134348,2469150758,2469167142,195838006, 2469183569,2469217482,2469265424,427098211, 2469282324,2469330997,1911717900, @@ -4667,21 +4662,21 @@ static const unsigned int DictNodes[84251] = 2469773352,2469789733,3309596, 2469806927,2469838890,153944074, 2469855262,2470166557,2470182935,1227718661,2470642128,2470693293,2162695, 2470751332,2470833253, 2470905161,119358200, 2470953451,3686421, 2470997094,2471084911,549945413, 2471133196,2471160935,2471242856,2471433109,2359820, 2471521385,2471579729,2471636074, 2471870877,30523548, 7733762, 31801346, 109215784, 280838447, 180945291, 2471954857,254593210, 2471996523,2472069751,108325996, 2472143741,2472231826,2472291437, - 2472373358,2472537199,2472595691,1660240924,2472640514,2472656918,2472673282,299794442, 2472689666,79101963, 2472714030,2933275, 2472782960,529022988, 240697647, + 2472373358,2472537199,2472595691,1660240924,2472640514,2472656918,2472673282,299794442, 2472689666,79101963, 2472714030,2933275, 2472782960,529022988, 240697647, 2472864881,2473012338,2473061491,2473164815,2473181196,2473197570,2473213978,1147617346,2473241716,2473312357,2473347382,2473394178,901464075, 2473421941,2473561392, 2473607184,2473623592,2196362, 2473640961,2473693477,2473755150,2473789824,2473852930,2473869322,184713228, 2473885798,2165260290,2473929846,2474126455,2474206124, 277103026, 2474257528,2474344514,2474388601,2474475532,213893126, 2474503290,2474591156,2474656423,2474689359,2270461968,2474732667,2474786845,5799965, 2474814588, 2475060349,2475142270,2475256959,2475344730,2475388032,2475458562,2475474975,2475492361,319717679, 2475524112,2475540518,2433761301,2475568257,2475650178,2475737114, 2475753474,2475769875,156975126, 2475786686,2475853198,5308523, 2475917322,1941957763,587022827, 2475938034,2476051289,540049446, 2476114894,2476158084,2476284229, 2476359702,2476376095,2439299113,2476392555,1067515916,2476425761,117358629, 2476476139,2476507439,2476551301,2476829830,1826799670,2476928135,2477080602,2477096976, - 2395176975,1602715664,2477124744,2477288585,2477337738,2477474329,227725579, 2477539631,154665905, 2477573150,2477616267,2477680854,2477806575,2477867926,25559561, + 2395176975,1602715664,2477124744,2477288585,2477337738,2477474329,227725579, 2477539631,154665905, 2477573150,2477616267,2477680854,2477806575,2477867926,25559561, 512999483, 2477927564,2477965328,121651216, 2477981750,2478015001,1438355946,131811351, 715014904, 2478081129,420725039, 2478130378,2478189709,81166364, 2478317535, 2478386318,2478506463,140247067, 2478550159,2478640318,261130298, 2478735370,150569474, 2478763152,2478965681,2479008913,2479079450,2479095824,38061728, 1702510602, - 684212276, 2479123602,2479243286,2479259650,188940298, 2479287443,2479369364,690733308, 2479423493,68583462, 2479795350,48676905, 2479975575,2480112530,2204447, - 421953999, 476922803, 2480172184,2480237721,2480275947,2414119398,2480312915,153075778, 2480401562,119357492, 1683259937,136119143, 2480581787,2480635916,433717274, + 684212276, 2479123602,2479243286,2479259650,188940298, 2479287443,2479369364,690733308, 2479423493,68583462, 2479795350,48676905, 2479975575,2480112530,2204447, + 421953999, 476922803, 2480172184,2480237721,2480275947,2414119398,2480312915,153075778, 2480401562,119357492, 1683259937,136119143, 2480581787,2480635916,433717274, 2480652779,2480686084,154797427, 2480762012,2480848965,2480885269,2480964597,2481029582,2481089693,2481177523,2481211172,208896015, 2481258584,2481292158,2481324044, 29475625, 2481341783,507641882, 25561574, 2481389570,196362540, 2481417374,116228125, 2481706528,2481777823,2481831957,8175731, 2481849438,2481897927,2481948939, - 2481995860,137088156, 109297680, 2482039968,2482226362,2482262699,2482323487,416874595, 2482339924,2482372860,254591021, 2482406230,193659995, 2482454583,541507668, + 2481995860,137088156, 109297680, 2482039968,2482226362,2482262699,2482323487,416874595, 2482339924,2482372860,254591021, 2482406230,193659995, 2482454583,541507668, 2482520982,2482580641,2482652190,222101999, 2482695330,2482913751,2482947231,55033872, 155779114, 458378077, 153191398, 2482979339,280447445, 2483027990,1578467382, 2483055779,2483142682,171163677, 2483159099,2483191950,2483224605,2483241852,2483291081,674349082, 2483355746,2483390403,2483448996,123912274, 2483767926,2483830891, 260457703, 2483864470,2483924133,24838185, 118884838, 2484077958,110298052, 2484142139,181267622, 2484174954,2484258932,2484324266,2484391431,869199015, 2052998118, @@ -4695,8 +4690,8 @@ static const unsigned int DictNodes[84251] = 2489566117,2489609405,2489762095,2489795015,2489843758,2489892879,79757327, 412286978, 294143475, 2489909302,359514133, 2489947572,2490019006,2490100927,2490172437, 2490226796,2490281152,2490321422,4309019, 2490370182,2490417261,174080030, 2490449936,299024486, 2490466376,2326637, 2490532705,139821489, 2490936514,2491007923, 1321583071,2491040235,2491083971,2491191979,2491264196,2491329733,2491432962,4390915, 2491449403,2491482114,2491503696,85098517, 2491559110,2491613655,2491646482, - 442318885, 1506214735,2491761487,2015270, 2491804871,2491908108,2218229867,152962460, 2491925017,2491993610,2492067016,654017834, 1204568349,2492198089,274153570, - 2492263626,93978664, 2492361931,2492497932,2395176972,2492514335,2492530729,612319253, 461963276, 2492547138,2492591308,2492705997,2357559315,2492853454,47546410, + 442318885, 1506214735,2491761487,2015270, 2491804871,2491908108,2218229867,152962460, 2491925017,2491993610,2492067016,654017834, 1204568349,2492198089,274153570, + 2492263626,93978664, 2492361931,2492497932,2395176972,2492514335,2492530729,612319253, 461963276, 2492547138,2492591308,2492705997,2357559315,2492853454,47546410, 2493120577,891633675, 2493172539,2493268052,2493301681,1598997513,2493333950,2493399511,2493431867,2493466675,1269530640,2493514952,2493546542,2493595650,2493612069, 200720400, 2493639887,637206568, 2493770960,2493880518,2493934801,2494006055,1362214933,2494023144,2485734208,2494082258,1818662, 2494316616,2494382134,2494418672, 2494497577,340131896, 2494529595,2494562541,2494595093,881655824, 2494622931,2494737620,2494841292,2494885077,2495053861,2429845516,2495070647,2495105343,2495135756, @@ -4707,12 +4702,12 @@ static const unsigned int DictNodes[84251] = 2498117698,2498152680,2498199554,2498216990,2498248716,773488720, 2498265547,2498325734,2498461798,2498494466,2113574, 2498510924,91832346, 143392852, 2498953347, 49791107, 2498981096,2499150814,2499201270,171507724, 1501052966,2499259625,110234086, 2499413076,2499463082,138641435, 250364392, 2499530610,2499578845,1993883688, 443924546, 2499624998,130285606, 2499652842,2146959386,2499800299,2499854429,2499903510,2499919884,2499936287,2499952661,2499969030,1535426589,2499986462,2500018608, - 2500051003,146309130, 2500095212,2500232402,134709264, 2500266356,2500332196,320734217, 685491138, 2500395067,234094700, 2500428536,2500472045,2500739098,44498965, + 2500051003,146309130, 2500095212,2500232402,134709264, 2500266356,2500332196,320734217, 685491138, 2500395067,234094700, 2500428536,2500472045,2500739098,44498965, 2500758544,2500871198,2500903215,2500935787,2500968469,19267606, 2500987670,207355980, 2501019669,2501061870,2501263425,2501312801,67059738, 2501345282,2501361690, 2255782322,2501378075,2501412185,2501445037,2501493579,2501558694,2501591066,31391746, 2501607727,2501642726,25560513, 159875604, 2501673886,2501705812,2501738591, 2501787664,2501804109,2501848303,2502115382,2502148189,2502206132,8389031, 2502290672,740474917, 2502329716,2502379385,2502438129,367820812, 2502487282,1186515316, 2502607773,2502700275,2502789549,2502837417,2502869013,2502885412,110592019, 2502903829,2502935008,898171727, 2503027956,2503149100,573653442, 2503180290,1439645905, - 2503198749,1489354797,2503245890,2503279637,2503329731,1174077452,2503388405,2503509086,2503557227,338363215, 2503601398,2503876350,2503921120,2503968244,7733466, + 2503198749,1489354797,2503245890,2503279637,2503329731,1174077452,2503388405,2503509086,2503557227,338363215, 2503601398,2503876350,2503921120,2503968244,7733466, 2504018341,2504065934,2504130572,5505036, 2504148119,2504196107,2504212717,2504245308,2504327233,2504387831,373981215, 244614065, 2504486136,2504617209,2504691508, 2504769773,119998209, 2504803538,2504835504,2504868273,2504900610,2504917048,2504949867,2504982987,2505033291,2505080848,335446022, 2505098049,414040095, 2505131831, 2505179165,1212203485,2505195604,2505228290,2505244682,2505261072,2505277480,193871909, 2505305338,2505409924,52625414, 8390248, 2505474114,1435027080,2505506842, @@ -4722,11 +4717,11 @@ static const unsigned int DictNodes[84251] = 110723074, 2234696527,2508013627,240582683, 2508047311,1055408159,340770870, 2508096088,6308705, 1726185556,2508128277,2508144670,2352939095,2508181121,2508254468, 2508526130,2508587067,2508631301,2508688151,143392827, 5341815, 131820806, 2508762375,2508858305,1255882857,2508914700,2466103322,24248462, 2508942600,2509069654, 115933210, 2509144066,5799947, 291097187, 2509163488,2509210480,2509259211,2509308768,2509375860,2509450505,2509520998,2509554663,2509614346,2509696267,2509873006, - 2509931398,2509963285,8389961, 2509981323,2510045230,2510105868,2510209080,2510242552,2510275974,2510351629,2510449934,2510487618,2510520609,131335198, 874577936, - 119636271, 2510558745,2510603636,2510652442,2510700546,195215366, 2510716930,2510733322,948813836, 1563328566,2510761231,2511072528,2511159317,276283423, 750665816, + 2509931398,2509963285,8389961, 2509981323,2510045230,2510105868,2510209080,2510242552,2510275974,2510351629,2510449934,2510487618,2510520609,131335198, 874577936, + 119636271, 2510558745,2510603636,2510652442,2510700546,195215366, 2510716930,2510733322,948813836, 1563328566,2510761231,2511072528,2511159317,276283423, 750665816, 433225754, 2511177627,2511244768,2511290434,1200291842,2511334673,2511455262,27624360, 2511487052,192938013, 1499103339,2511531282,2511635312,2511683594,2511699999, 2511717271,2511777043,2511929798,2511962349,2511994906,267501580, 2512022804,2512093205,1801879636,2512121109,2512175167,2512207912,2512224287,2512240661,1449623554, - 2512257040,2512273418,2512289834,688226309, 2512306479,233734170, 2512344500,2512416022,2512519170,2512535562,2512551965,761348108, 2512568366,2512619352,452100150, + 2512257040,2512273418,2512289834,688226309, 2512306479,233734170, 2512344500,2512416022,2512519170,2512535562,2512551965,761348108, 2512568366,2512619352,452100150, 2512666705,2512699394,712982566, 2512727319,2512819444,2512879618,299008038, 2512897118,2512956696,2513077257,2513120537,2513176321,2513235226,298958902, 2513305640, 344539148, 2513322273,2513355870,2513404003,61800479, 2513437107,2513469527,229687327, 2513530139,2513649723,48513030, 2513683116,45465606, 2513726748,2513862721, 116850698, 546357258, 2513914824,2513977647,2514010118,2514026512,281935884, 794722344, 2514054429,2514349342,211910696, 2514431263,229508010, 2514545952,2514632714, @@ -4735,12 +4730,12 @@ static const unsigned int DictNodes[84251] = 2516020519,2516098347,127795243, 2516148784,2516287514,2516308988,2516370777,2516402218,2516420386,2516451330,2516467733,2516484162,2516516880,2164424714,2516533771, 2516582711,2516635028,2516741416,1566654504,1055801346,2516877314,2516893717,2516910102,2516926466,2516942854,2516959272,2516975626,604831773, 2516992760,2517026427, 2517101865,622707620, 2517189067,2517247645,2517314858,2517468050,2200725, 1145487398,2517516347,2517550031,2517604621,2517724459,237256747, 2517773612,2517855533, - 2517942282,567100072, 2517959669,2518024251,2518057067,2518101294,1449213995,1000898598,2518412592,2518478129,2518723890,2518789427,2518859883,2518892630,1770706, - 2518936884,2519040475,2519072805,2519089154,2519105551,1129578498,2519133493,2519187515,2519220250,7962652, 2519236647,213909525, 2519280950,6127638, 6406186, + 2517942282,567100072, 2517959669,2518024251,2518057067,2518101294,1449213995,1000898598,2518412592,2518478129,2518723890,2518789427,2518859883,2518892630,1770706, + 2518936884,2519040475,2519072805,2519089154,2519105551,1129578498,2519133493,2519187515,2519220250,7962652, 2519236647,213909525, 2519280950,6127638, 6406186, 2519434216,2519493943,2519580688,2519597058,2519613466,294371357, 73744396, 2519641400,630456322, 2519887161,2519957556,2159493161,2520001850,2520072213,2520088660, 2520122306,2520156324,45907989, 2520186892,301187098, 2520204429,2520252426,47710237, 2520268812,2520285210,159547420, 2520302182,2415394847,2520335096,2520368022, 2520416275,2520432662,2520460312,2520514576,2520530985,2520547359,2520563750,174047234, 2520583070,648577546, 2520640827,2520853820,2520943369,2521001277,2521088059, - 2521120852,2521155642,2521219543,2521251871,2166013964,2521268265,2521285976,2521345342,2521443647,2521581684,2521645487,2521685060,2521754944,2521842110,451871628, + 2521120852,2521155642,2521219543,2521251871,2166013964,2521268265,2521285976,2521345342,2521443647,2521581684,2521645487,2521685060,2521754944,2521842110,451871628, 2521907433,46088211, 2521951553,2522022806,936739338, 2522080572,2522120223,2522136582,2522152982,2522169410,152945554, 2522202336,2522234907,2522270199,2522300475, 6373427, 2522344770,2522628411,2522661826,2522695145,2522743214,2522803523,246464947, 2522891084,6840894, 2522950980,317177887, 2523086879,2523103248,2523119626, 8962185, 493666319, 2523136945,2523174369,2523220493,51380236, 2523267088,2523283466,422690868, 2523307220,2523398169,2523437493,2523483703,125583397, 2523530426, @@ -4748,9 +4743,9 @@ static const unsigned int DictNodes[84251] = 2524168249,2524184642,2524217443,947454255, 2524250542,2524299723,2524351452,2524398937,1729037250,2524430402,2524463120,2524479507,2524495909,156155916, 2524512275, 2524528666,2395176962,2524546142,10650536, 2524594635,2524645893,2524884296,2525162825,2525219524,2525250379,2525317350,188957543, 2525375818,2525457739,2525496665, 2525528491,13713420, 2525571504,2525626411,2525659202,2525692341,2525724684,2525741082,201572358, 2525769036,2525855756,2525872154,2525888566,830947387, 2525932877, - 2526004118,2526053576,2526085611,2526122019,113246511, 2526195022,2526298166,2526337370,2526380511,2526412810,381059094, 2526429611,2526461962,2526478358,381091856, + 2526004118,2526053576,2526085611,2526122019,113246511, 2526195022,2526298166,2526337370,2526380511,2526412810,381059094, 2526429611,2526461962,2526478358,381091856, 2526494732,2526511130,2526539087,2526621008,2526719313,2526834002,291110975, 2526921552,2526953947,2526991878,391022452, 2527063379,2527183370,2527217178,2527276372, - 2527522133,2527560642,2527592476,197050370, 2527620438,602473295, 2527674434,1537491891,2527718743,2527800664,1271988234,2527903746,2527920166,719093797, 491226831, + 2527522133,2527560642,2527592476,197050370, 2527620438,602473295, 2527674434,1537491891,2527718743,2527800664,1271988234,2527903746,2527920166,719093797, 491226831, 27623903, 2527936524,406635834, 2527963458,1069563926,2528003195,379797558, 2528036007,2528095577,2528149510,484803023, 2528177498,2528397542,2528456027,2528559170, 2528592917,150570376, 2528652529,2528693647,2528755733,2528773204,2528832860,113246887, 2528947549,2529001494,2529017858,27607069, 2529045854,2529100686,1215283226, 2529165355,2529200069,2529231294,2529307999,2529378314,2529394704,1696972821,2529411518,138330133, 2529478915,2529543308,2529602912,201441823, 2529848673,2529886237, @@ -4766,7 +4761,7 @@ static const unsigned int DictNodes[84251] = 3702807, 2537008514,2537226731,302123433, 134840360, 2537259071,1250248168,2537301345,2537340994,2537385347,47546404, 17006629, 2537549188,416759834, 2537655240, 2537729413,2537800113,2537832454,73449474, 5341457, 2198831, 2537860486,2538063894,1624868501,2538127820,2538161681,2538204551,2538246254,2538302856,1014431851, 2538373948,2538422338,2538466697,2538586149,2538602508,2538618962,512934363, 2538651717,2538686874,2538768117,2538815587,190202065, 569115586, 2538852783,2538897420, - 2538913830,2300889271,2538941834,2539144997,2539193238,2539242771,2539291586,2539323408,2588683, 2539351435,410845487, 2539449740,2539548045,2539637275,363663496, + 2538913830,2300889271,2538941834,2539144997,2539193238,2539242771,2539291586,2539323408,2588683, 2539351435,410845487, 2539449740,2539548045,2539637275,363663496, 2539683880,2539700226,645693478, 2539728270,2539831308,2539847718,1064419355,2539875727,2540077593,2540143646,552878118, 2540175362,2540191770,294371357, 1236975700, 2540214487,117899728, 1713128793,2540274600,2540306478,2540356745,3245086, 2540404764,878886943, 2540422344,2540453904,307298316, 2540470288,1889222682,1172013078, 2540498320,31424540, 2540585001,2540603904,2540650538,2540666985,727449666, 2540699659,2540716072,1250607115,2541170065,2541268370,2541341348,2541415827,2541568679, @@ -4777,7 +4772,7 @@ static const unsigned int DictNodes[84251] = 2544304130,1032142858,2544320514,346488870, 891192129, 2544348577,2544397730,2544446883,126500866, 55754790, 465601007, 3211799, 2544577956,2544718858,1196933179, 2090077209,2544774565,2544926722,2544944158,2544975888,153993267, 2544993578,124928962, 2545041492,2545074268,2545118353,1210138655,3473437, 17842478, 2545200550, 5866405, 2545303611,113115164, 2545348007,2378629142,2545452859,109051992, 139477046, 2545507756,2545566632,2545598506,2545614979,2545631241,2545647753,2545664002, - 1362313254,2545680424,423804954, 2545698484,5324909, 2545779665,2545839528,2545916889,1843921371,2545986985,2546331050,2546494891,189252018, 2546593196,126763485, + 1362313254,2545680424,423804954, 2545698484,5324909, 2545779665,2545839528,2545916889,1843921371,2545986985,2546331050,2546494891,189252018, 2546593196,126763485, 2546681533,2546769454,371310684, 2546810892,2546827290,191653904, 3244079, 2546855341,2547008681,2547041143,2547074207,6602780, 2547105804,2547122627,2547157560, 2547199406,2547384821,2547417109,2547434397,2547527087,2547625392,2547662879,2547679264,597196810, 110299913, 2547712016,13860865, 2547728843,2547780819,2547826753, 2547876649,2547909886,2548025611,2548079598,2548144270,2548188946,2548247985,1237155846,2548329906,2548498478,1976270858,1037828399,2548559283,284704790, 2548597698, @@ -4788,20 +4783,20 @@ static const unsigned int DictNodes[84251] = 2550984123,2551070786,2551103548,1640099260,2551197117,2551366479,1452212715,2551399624,2551440419,2551508414,2551595467,2551647649,2551726533,2551770559,2551892887, 444826633, 2551950784,2552073427,491831324, 2552119726,1982480394,2552070146,43237407, 2552169922,2552217630,2552251735,110232003, 2552053817,2552311233,1138229250, 2552414234,2552430623,269893651, 2552458690,2552643639,4980776, 2552709122,45629466, 2552726038,2552758371,2552795136,2552841084,2552901059,2553071161,2553169723, - 2553228740,2553298965,2273329627,2553317083,1032142860,2553349135,2553408965,2553736646,2553824575,2553889745,768770337, 2553937932,2553954330,2553971650,190644323, + 2553228740,2553298965,2273329627,2553317083,1032142860,2553349135,2553408965,2553736646,2553824575,2553889745,768770337, 2553937932,2553954330,2553971650,190644323, 2554015175,2554076878,25561574, 2554152037,2554201154,275103746, 2554267091,2554314818,1275773429,2554359240,2554478895,52822019, 2137096218,2554512774,2554577950, 2554609685,193708879, 1400438789,2554627072,2554661777,2554758153,2554789919,2554808059,2554867145,107159438, 604691444, 433669041, 2555036119,2555068500,2555101189, 2041725403,2555117652,2555162058,2555265784,2555300190,472255452, 917422106, 2555348353,533807120, 2555396098,329842724, 2555413327,1032208390,2555456971,2555743642, 3588150, 271630395, 2555805737,2555822840,1785741396,2555858370,2555915724,2556084323,2556116994,2556133414,2433237023,1623968681,401606131, 352927803, 2556149826, 558186498, 2556182988,2556227021,286244890, 2556446067,1629208578,2556486635,2556526594,199460043, 135151642, 1166934018,2556554702,2556620239,2556756034,2556800464, 2556863523,2736150, 2556921004,2556980689,2557217433,45613071, 2557281587,2360431, 2557329461,2557364145,2557428887,226476968, 906510338, 127336450, 2557476948, - 302563628, 2557509698,2557542937,2557607962,25559579, 2557624425,2557657586,2557707348,2557755402,2557771786,2557788162,2557816274,2557870102,2557886495,129876728, - 1902886922,2557903385,2557972201,2558034953,2558066719,2558083114,1972912138,2558099889,2558132245,2558149584,2558193107,2558313362,171606028, 2558363929,2113577, - 2558438868,2060475325,50659351, 366914617, 2559126999,2559208920,2559459412,701710374, 2559492398,118882781, 2559526490,567164930, 1675722773,1397408609,115736676, + 302563628, 2557509698,2557542937,2557607962,25559579, 2557624425,2557657586,2557707348,2557755402,2557771786,2557788162,2557816274,2557870102,2557886495,129876728, + 1902886922,2557903385,2557972201,2558034953,2558066719,2558083114,1972912138,2558099889,2558132245,2558149584,2558193107,2558313362,171606028, 2558363929,2113577, + 2558438868,2060475325,50659351, 366914617, 2559126999,2559208920,2559459412,701710374, 2559492398,118882781, 2559526490,567164930, 1675722773,1397408609,115736676, 2559560417,2559658416,2559705935,8389873, 2559740360,2559787020,354549781, 2559803457,2559852582,19251630, 2559869442,2559903439,1419739152,2559946201,2560000430, 2560060890,2560114823,9126020, 714885715, 2560142811,2560345290,2560393228,2544500774,2560409681,2560442434,2560484387,2560552412,2560650717,2560722796,2560765406, 2560950703,2560983887,125584225, 2561016722,36306975, 2561065492,2561125855,2561229718,2561279315,2561343575,2561392645,2561412125,118243340, 2561469920,2561526193, - 2561572995,19464322, 2561591767,20299907, 2561638831,237733466, 2561682913,2158035379,2561748450,2561870249,2561907863,2561966090,2561994211,3260876, 521486651, + 2561572995,19464322, 2561591767,20299907, 2561638831,237733466, 2561682913,2158035379,2561748450,2561870249,2561907863,2561966090,2561994211,3260876, 521486651, 2562387429,2562474827,2562541544,2562589918,2562649574,1890877462,2253209612,585122222, 2562780647,2562944488,2563014764,2563059177,2563200059,2563269448,2563342768, 2563375537,2563408792,2563457132,2563493684,2563572792,2563641980,205209631, 2563687923,2563719206,216006658, 2563736565,2563805324,2563850252,2563866645,1793130526, 210550803, 2563883046,2563899435,2563932242,2563976682,2564063711,2564107755,2564161574,2564177922,2564194314,2564210730,52330536, 2564238828,2564407380,2564441460, @@ -4816,22 +4811,22 @@ static const unsigned int DictNodes[84251] = 2569039363,2569125910,2569154052,2569240597,539672588, 2569257814,2569307295,2569338967,2569388061,119357742, 1917045, 2569416197,2569470379,946880564, 2569502944, 2569547270,479133702, 1856847979,2569596423,2569831160,471679017, 2569863275,2569895974,2569913450,2569994299,2570027076,2570087944,2570125358,2570174523,2570219017, 2570290114,2570323746,45137936, 2570354742,2570388897,2570436715,2081424252,2570469378,2570486439,2570530314,2570642040,2570726923,745373727, 1966063621,2570874380, - 2571059714,422019084, 2571103757,2571234830,2571300367,2571404631,2571452515,2571486302,121651231, 2571534639,2571578896,2571698242,2571730986,2571747350,247234581, + 2571059714,422019084, 2571103757,2571234830,2571300367,2571404631,2571452515,2571486302,121651231, 2571534639,2571578896,2571698242,2571730986,2571747350,247234581, 124796954, 2571775505,2571814549,2571878871,2571911173,276529168, 2571927776,2571969194,2572086802,2572304875,937656358, 2572348947,706101723, 2572412846,2572451948, 2572485526,2572545556,2572648477,2572665724,2572714006,196886540, 2572730859,2572764689,2572795916,2572813048,2572845101,2572889621,2572945990,379815256, 2572987926, 2573053463,2573320198,47398952, 2573336668,335332804, 2573369365,2573385782,2573418577,2573452194,2573495832,2573615141,93978636, 2573643289,1765031977,2573708029, 2573781588,304809812, 153174058, 2573839898,2573970971,2574026580,1701905346,2574085660,2574221378,235389020, 2484093775,2182676546,2574256279,2574303263,2574319653, 2154431050,2574347805,2574483950,2574516761,2574585350,5947397, 2574647312,2574663718,1038254092,262127656, 2574680170,2574773790,878886940, 2574937631,2574992207, 2575024611,2575058466,2575106895,2575140729,2575187999,2219491330,2575210854,2575270112,48021541, 2575303736,2575380000,1206421141,2575429153,2575478306,2032402474, - 2575613990,2575630338,627425711, 2575647147,2575686038,2575746537,1973567510,2575805987,2575990807,1383481373,2576018980,230309914, 2576068133,2576154716,545161228, + 2575613990,2575630338,627425711, 2575647147,2575686038,2575746537,1973567510,2575805987,2575990807,1383481373,2576018980,230309914, 2576068133,2576154716,545161228, 2576188071,2576220191,2370764857,30392326, 2576248358,2576351711,2576384002,2576401063,286310402, 2576441560,2077262307,2576482361,2576498690,257638406, 2576515074, 2576531558,2576564527,2576596998,142589973, 2576614004,2576646175,163020916, 2576674343,412682923, 3213737, 2317795394,44531754, 2576739880,2576973827,2576990217, - 2577006598,2577022981,198672519, 2577040587,1240072234,2577072184,2577104914,2141749250,2577121713,2577154069,70893575, 2577182249,2577285126,2577301899,66814347, - 2577334284,4948010, 2577743887,2577760268,2577776661,2577793036,2577809434,254443526, 2577826005,2998409, 2578247212,2578317417,2578350967,2578389104,131793740, + 2577006598,2577022981,198672519, 2577040587,1240072234,2577072184,2577104914,2141749250,2577121713,2577154069,70893575, 2577182249,2577285126,2577301899,66814347, + 2577334284,4948010, 2577743887,2577760268,2577776661,2577793036,2577809434,254443526, 2577826005,2998409, 2578247212,2578317417,2578350967,2578389104,131793740, 347668546, 2578481912,2578514856,2578546775,2578597272,2578645451,2578695062,2578755117,2578869806,169332196, 2578956965,2579021855,2197356, 2579038213,2579055067, 442253914, 493666330, 2579099183,2579181104,273974008, 2579305462,2579365898,2523176, 2579394097,2579464246,2290106427,2579508786,895811665, 153714730, 2579579932, - 2579612573,2579697179,2579759643,2579792905,2579824747,2579869235,2580016692,2580086876,18120706, 2580119604,843120666, 184909890, 2580152857,2580217951,127631381, - 2580278837,2580377142,1501909214,2580475447,2580606520,2580725902,2580770361,2580840507,2580881656,2580983354,151093260, 2581098043,2581366080,911835157, 911835147, + 2579612573,2579697179,2579759643,2579792905,2579824747,2579869235,2580016692,2580086876,18120706, 2580119604,843120666, 184909890, 2580152857,2580217951,127631381, + 2580278837,2580377142,1501909214,2580475447,2580606520,2580725902,2580770361,2580840507,2580881656,2580983354,151093260, 2581098043,2581366080,911835157, 911835147, 2581399008,2581431137,2581463720,630128666, 2581496720,2581529468,2581578250,2581622332,2581758817,1445101578,2581792496,2581823572,301006876, 2581868093,2582020639, 169181200, 2582069332,55853087, 2582104331,174162355, 2582151639,232292354, 2582184017,2582228542,2582315530,434405388, 2582359615,2582687296,2582742218,2582801985, 585810001, 2582904898,2582939016,2582982210,2583178819,2583265312,2583299863,2583347212,1263468554,2583364129,2583414002,1295566284,2583480470,2583528764,1657667625, @@ -4840,17 +4835,17 @@ static const unsigned int DictNodes[84251] = 134840356, 2584592687,2584636999,2584686152,2584756824,2584789046,2584821866,2584903983,2584948297,2585018406,176915347, 2585034788,2585051174,2585067536,2585083923, 2585100304,276283411, 2585116738,2585161290,2585259595,1941405851,287573803, 2585673800,2585745076,2585800268,2585872979,2585935874,2585952297,164036629, 2585968877, 8400243, 2586004792,2586070195,439156748, 363660278, 2586117186,2586189707,735412290, 2586237926,2586308173,8389572, 2586411467,2586471779,2586535128,1448706088, - 2586619470,1772797973,2586656799,244056695, 2586685007,17221377, 2586816080,2586918943,1261552843,2586947153,2587131945,2587148319,2588682, 2587164684,20365349, + 2586619470,1772797973,2586656799,244056695, 2586685007,17221377, 2586816080,2586918943,1261552843,2586947153,2587131945,2587148319,2588682, 2587164684,20365349, 2587181515,2587230254,2587280120,2587312523,172834972, 2587347878,2587389522,296632779, 2587618899,2587705410,1010679892,2587749972,2587913813,2588082192,2588098601, 2588115498,2588131349,2588147734,2588164108,113836586, 307511312, 2588187327,2588246553,2588312650,2588356182,1126098831,2588459018,2588487255,2588590101,2588606495, - 2588625311,117903270, 2588672054,2588716632,127697120, 2588803126,2588847705,2588984905,2589066216,2589114475,2589149370,2589179963,2589213303,2589257306,644252693, - 2589360599,2589393743,2589437531,2589474832,2589492723,902889503, 52363321, 2589524427,244056163, 2589584988,2589688045,2589720642,2589765213,2589818923,50987024, - 2589851700,2589884426,385500081, 2590273119,2590420576,2590507010,118194182, 2590524446,2590561515,2590617185,2590687254,1173483106,2590715491,2119155728,898793488, + 2588625311,117903270, 2588672054,2588716632,127697120, 2588803126,2588847705,2588984905,2589066216,2589114475,2589149370,2589179963,2589213303,2589257306,644252693, + 2589360599,2589393743,2589437531,2589474832,2589492723,902889503, 52363321, 2589524427,244056163, 2589584988,2589688045,2589720642,2589765213,2589818923,50987024, + 2589851700,2589884426,385500081, 2590273119,2590420576,2590507010,118194182, 2590524446,2590561515,2590617185,2590687254,1173483106,2590715491,2119155728,898793488, 226820112, 2590870832,2590920540,2590967702,2591022379,2591064587,2591113675,181260610, 2591167016,1675198502,117407760, 2591223396,2591359300,2591420005,2591524817, - 2591572052,2591604752,2591621146,2591637541,460406836, 2591665766,2591818329,2591850561,324567076, 2591901044,2591949762,2591982002,52609046, 2592015353,188056446, + 2591572052,2591604752,2591621146,2591637541,460406836, 2591665766,2591818329,2591850561,324567076, 2591901044,2591949762,2591982002,52609046, 2592015353,188056446, 2592108135,2592161802,2592180159,2592279309,2592344100,103743519, 2592391663,2592426721,2592522250,27852831, 2592550504,2592621491,2592655710,2592714345,2592801945, 223395846, 2592850013,2592899990,2592960106,2593162728,2593215244,2593259546,2593275909,2292350978,2593304171,2593542030,2593588916,2593670409,307216918, 2593703231, - 2593767855,2593800211,55754789, 2593817017,1098892262,382730252, 2593865812,2593910380,2593947680,494043188, 2593981756,2594030052,2594090605,2544500774,932331586, + 2593767855,2593800211,55754789, 2593817017,1098892262,382730252, 2593865812,2593910380,2593947680,494043188, 2593981756,2594030052,2594090605,2544500774,932331586, 2594177964,2594242991,2594287214,584482822, 1714618380,2594336367,2594483824,2594647665,2594685035,656867338, 2594717698,896663983, 1258618882,2594739729,2594783339, 510083087, 2594826157,45449323, 2594932200,194069002, 2594981352,2595040882,2595274798,2595325920,247234598, 2595374423,317947990, 2595423623,113229940, 2595455057, 110215928, 2595487760,2595504168,2595520518,2595536908,2595553291,110723112, 2595569730,2595602495,2595635226,824016898, 2595663475,2595733807,2595769986,2595827316, @@ -4859,58 +4854,58 @@ static const unsigned int DictNodes[84251] = 2597355536,1002848282,2597372791,2597416568,2597519413,2597552134,783073296, 210124822, 250576915, 2597569383,2597601295,2597617730,2597650863,2597683266,2597716059, 2597748802,2597782936,2597830668,2597847133,2597896651,2597957241,2598109727,2598158358,1086455820,655376411, 178078658, 2598186618,2598273040,2598289414,1525104659, 1019937645,2598305804,1628029982,2598334075,2598420492,1100152939,2598437401,2598514300,452018185, 2598727293,156829133, 2598799919,2598863755,2598928410,2598951614, - 2598993972,1769833048,203819505, 2599027640,2599076142,2599108662,2599141388,2599158258,2599207164,2599241319,2599288858,2998293, 2599305254,315917224, 567787548, - 2599620563,2599666091,2599710335,2599911426,2599927837,2599944221,9519140, 140788472, 341016592, 2599961035,2600021632,2600091732,2600136321,2600218242,5867706, + 2598993972,1769833048,203819505, 2599027640,2599076142,2599108662,2599141388,2599158258,2599207164,2599241319,2599288858,2998293, 2599305254,315917224, 567787548, + 2599620563,2599666091,2599710335,2599911426,2599927837,2599944221,9519140, 140788472, 341016592, 2599961035,2600021632,2600091732,2600136321,2600218242,5867706, 2600321547,1505443906,2600371701,7389300, 2600423144,2600491560,2600562307,704037772, 2600648716,315916398, 294650457, 2600676996,2600779835,2600812768,2600845615, - 2600878539,124076070, 2600939141,1818968288,2601074700,1353039882,2601091503,2601135750,2601273281,2601320507,859767267, 2601365127,2601418811,2601463432,158501543, + 2600878539,124076070, 2600939141,1818968288,2601074700,1353039882,2601091503,2601135750,2601273281,2601320507,859767267, 2601365127,2601418811,2601463432,158501543, 2601604074,2601664617,2601697735,2601746488,2601791113,2601926678,2601946415,2601987722,2602074155,2602106934,55853094, 85098511, 2602151563,147407608, 2602272405, 1814774618,1011417100,2602347392,271925258, 2602405967,2602467357,283836891, 2602483750,2602500155,2602544780,246334428, 2602663967,2602680330,114114602, 2602697617, - 2602757773,2385231977,2602827839,2602860590,266027479, 2602910709,2602987150,316735713, 2603025799,2603058490,2603106369,2603155503,2603188264,212320287, 420757523, + 2602757773,2385231977,2602827839,2602860590,266027479, 2602910709,2602987150,316735713, 2603025799,2603058490,2603106369,2603155503,2603188264,212320287, 420757523, 2603204911,2603237402,2603265646,1474528230,2603685465,1035337781,1781907468,2603749807,2603806352,3736074, 2604073013,2604106575,2604150417,2604220500,2604255551, 515834394, 637321226, 2604286011,2604319567,1079296002,2604352599,2604400699,2604437504,2604482660,2604527250,2604712969,2604744741,2604761169,2049671189,1232290704, 375488629, 2604805779,2604861851,2604927493,1430077442,2604986004,196149277, 2605057045,2605117077,2605156183,2605219871,2605236240,2605252619,2129608716,2605270468, - 2605313686,2605411991,2605498427,131875130, 618348560, 2605543064,2605744154,2605772211,2605820621,1705902759,2605879704,187236373, 2605959197,1072431114,551832413, - 2605957132,2606018201,2606072439,2606104598,1588887591,2606121390,45858854, 2339946555,2606182042,2606263963,2606517450,2606580249,2606646684,2606694937,285345160, + 2605313686,2605411991,2605498427,131875130, 618348560, 2605543064,2605744154,2605772211,2605820621,1705902759,2605879704,187236373, 2605959197,1072431114,551832413, + 2605957132,2606018201,2606072439,2606104598,1588887591,2606121390,45858854, 2339946555,2606182042,2606263963,2606517450,2606580249,2606646684,2606694937,285345160, 2606759995,2606792706,226574807, 143394253, 2606809576,2606841940,2606875384,119226406, 2606909999,360841238, 2606984860,2607104012,23789574, 2607120436,2607154044, - 112935426, 2607214237,2607419737,2607481283,2607517211,27607068, 2607591070,137102656, 191070210, 2607853215,2607955994,93962256, 2554742393,2607972368,254345238, + 112935426, 2607214237,2607419737,2607481283,2607517211,27607068, 2607591070,137102656, 191070210, 2607853215,2607955994,93962256, 2554742393,2607972368,254345238, 2608000672,2608187450,2196766746,2608250882,923025429, 2608268111,2608311969,2608393890,2608463964,2608496724,2302394394,371343372, 2608541347,2608606884,2608726121, - 269713436, 2608758889,2608791611,2608824331,751158210, 2608852645,2608983718,2609054873,2609102889,2609121783,132792342, 2609153046,2609202183,2609266699,787169712, + 269713436, 2608758889,2608791611,2608824331,751158210, 2608852645,2608983718,2609054873,2609102889,2609121783,132792342, 2609153046,2609202183,2609266699,787169712, 2609283082,2609300350,2609332683,2609391306,2609449516,1052869075,2609479682,2609496171,2609529940,2609577994,833388560, 2609594827,2609643601,2609676314,1474461722, 2609852072,2610167829,2610185363,2610217390,521617414, 2610278057,2610350219,834912674, 2610413608,2610429954,2610446357,651591682, 2610474666,2610593849,2610610178, - 2610626586,146489375, 2610646099,1106296874,2368384683,2610708964,2610757654,2610774037,2610802348,2610858042,2610921488,2610937882,1248215045,2610966189,46776322, + 2610626586,146489375, 2610646099,1106296874,2368384683,2610708964,2610757654,2610774037,2610802348,2610858042,2610921488,2610937882,1248215045,2610966189,46776322, 2611006761,2611068980,2611102155,2611162798,110248427, 2611302354,2611375791,2611474096,1126629834,2611560514,2611601230,1586167829,2611670705,2611729149,2611790356, 2611850930,2611916467,2612135441,2612170356,2612217244,2612276916,2612342453,2612429102,2612461652,2612500569,2612555446,2086993922,2612658192,2612674586,1585938453, 1413578767,2612691028,2612723750,184926227, 1104415070,2612752055,2612839624,1218546844,2612883128,2612953391,2612985866,1663401986,490651658, 2613014201,2613102397, 404029466, 2613153898,2613231700,2613264699,6701062, 195084331, 2613309114,2613653179,2613691278,2613755935,766017546, 2613773484,1465237516,2613823382,2613870628, - 1181761541,8701561, 2613898940,2613964477,2614116655,29769766, 274319546, 2614149158,258768950, 2614177470,2614275775,2614329946,2614362196,2614403320,315277331, + 1181761541,8701561, 2613898940,2613964477,2614116655,29769766, 274319546, 2614149158,258768950, 2614177470,2614275775,2614329946,2614362196,2614403320,315277331, 2614505152,2614587073,2614624683,2614657046,1112440884,2614673429,2614689808,2614707931,2614738960,2614755347,623411219, 2614771764,2614816025,2614880456,2614935574, 2614952002,2614985618,2615033915,451477542, 2615078594,2615329195,2615362476,2615427878,2615460838,2615492689,2615525835,2615574538,2195876, 2615602883,2615672898, 2615706922,652378219, 2615766724,869615802, 2615824067,122601510, 2615869506,2615914181,2616016922,1321123852,2616045254,2616104595,2616176327,2616279106,2616323784, - 2616454857,2616524811,2616541186,1534541845,1168623089,2222882882,2616569546,2616919271,2616978651,55754758, 2617032745,442925072, 2617049147,2617093835,4112396, - 1924235714,2617163835,417906707, 2617196625,984990560, 2617241292,181257069, 477282316, 2617345553,2617376784,92815389, 2617405133,2617470670,2617573392,2205467, + 2616454857,2616524811,2616541186,1534541845,1168623089,2222882882,2616569546,2616919271,2616978651,55754758, 2617032745,442925072, 2617049147,2617093835,4112396, + 1924235714,2617163835,417906707, 2617196625,984990560, 2617241292,181257069, 477282316, 2617345553,2617376784,92815389, 2617405133,2617470670,2617573392,2205467, 291022176, 2617601743,2617672713,2617716432,2617753645,2617798353,2617896658,2617955857,2618011347,2618231327,2618279017,2618328211,2618359848,2618376218,2618393035, - 2618441766,966361115, 2618458426,2618491306,2618523753,725909541, 2618568404,3246266, 113115151, 2618633941,389136699, 2618715862,2618819051,2618851873,479133734, - 2618900518,2618918777,342066082, 2618966305,2618998824,351911993, 2619015190,56115216, 2619326490,147406880, 2619348947,2619427315,2619523980,271384605, 302252044, + 2618441766,966361115, 2618458426,2618491306,2618523753,725909541, 2618568404,3246266, 113115151, 2618633941,389136699, 2618715862,2618819051,2618851873,479133734, + 2618900518,2618918777,342066082, 2618966305,2618998824,351911993, 2619015190,56115216, 2619326490,147406880, 2619348947,2619427315,2619523980,271384605, 302252044, 2619572984,147816458, 2619605099,1173159995,2619649752,122683408, 2619705939,2619780825,2619862746,2620080144,2359754, 2620096971,2620148700,2620195931,2620227979, 2620272347,8390714, 2620354268,2620425154,2620457415,2620506153,226443305, 2620522527,2620539482,2620571960,1729872175,2620616413,2512306213,2620751884,2620768282, 2620784756,1633533992,136790022, 2620801065,2620821035,2620932108,2620948508,458981388, 2620965624,169967622, 2620997678,2621047959,2621107934,2621173471,2621244544, 2621304544,2621435617,2621489611,24297994, 1463501643,2621550306,1333870602,2621653021,2621672324,2621746915,793051158, 2621959908,2622032375,2622063983,2622131480, 669353129, 3866690, 2622189285,2622243742,2622275605,119488524, 2622292034,2622325616,2622374818,2622418662,2622506409,2622540255,2622586939,2622619705,1671135244, - 2622636841,2622668891,2622701580,186040326, 2622729959,399425552, 2622882705,2622942952,2622997780,2623045663,2623062028,3228087, 2623078487,2623128786,6455312, + 2622636841,2622668891,2622701580,186040326, 2622729959,399425552, 2622882705,2622942952,2622997780,2623045663,2623062028,3228087, 2623078487,2623128786,6455312, 2623565545,2623651852,51593273, 2624057067,2624162206,75579404, 2624209379,2063269890,2624249852,2624290835,2624307222,1071923210,2624324043,2624372742,2624389179, 2624424032,2624525365,2624586872,1840267266,2624618508,1021607978,394461213, 2624634882,2624651274,393543690, 2624667650,2624690711,2624734303,2624799867,2624831519, 2624847893,604274709, 2624864480,2188443667,2624897833,2624929794,2624946195,2624962581,546422838, 2624979052,2625013055,47874050, 2625078697,2625110037,2625126426, 135643167, 2625142815,2625159607,2625192046,2625225007,2625269484,2625323916,2625377320,2625437707,753188895, 2625454086,73531398, 2625479640,2625536010,2625553694, 2625601620,2625634347,2625667511,2625711853,2625782361,2625814547,2625830933,2625848188,2625897440,2625946969,2625978827,2626036768,1569488917,2626076774,2626109899, - 2626159051,2626208788,2626256927,109183017, 2626273960,2626306058,156188684, 2626322458,2626338879,2626371615,2626388992,2626420960,2626453510,2626469919,116638581, - 2626486331,2626527795,1296826389,2626584601,2626617410,2626650122,2626666498,1357365269,2626684456,2626752648,2626781194,247234562, 678248488, 2626797634,743161897, + 2626159051,2626208788,2626256927,109183017, 2626273960,2626306058,156188684, 2626322458,2626338879,2626371615,2626388992,2626420960,2626453510,2626469919,116638581, + 2626486331,2626527795,1296826389,2626584601,2626617410,2626650122,2626666498,1357365269,2626684456,2626752648,2626781194,247234562, 678248488, 2626797634,743161897, 2626830382,2626880513,2626928642,2626945034,2626961840,2626994653,2627038958,2627190810,2627207199,2627224458,1229750293,2627268335,2627338280,2627354636,2627371018, 2627388023,2627420198,193200164, 2627436856,179716122, 2627469751,2627502998,2627551300,2627612400,1078002609,2627682363,2627715091,2627731487,2627747899,2627783873, 2627829816,2627865469,2627911711,2627932149,2627960940,2627993621,2628010024,2628026795,2628059179,2628091925,165724761, 2628108398,2628153073,2628225911,2628267425, 955645954, 2628305775,2628355010,143294546, 2628387353,2628452371,2628468757,2195570754,2628485227,2628517916,2628535192,2628583434,565739551, 2628599820,2628616218, 2628632800,2628665428,2628698124,530055194, 2628726514,2628829244,2628911156,2628943878,2628972275,2629074954,2629091930,1895891558,2629126499,116850716, 2629173287, 1982470, 2629218036,2629320811,2629354384,460326700, 2629398261,2629619236,2629676790,2629730360,2629764034,2629807863,2629857016,2629894175,188940307, 2629910574, - 2629971705,2630135199,2630189122,2630223134,2630271990,2630305364,32063570, 2630410220,52641813, 2630479610,2544304140,2630533423,6701093, 436731934, 109053377, + 2629971705,2630135199,2630189122,2630223134,2630271990,2630305364,32063570, 2630410220,52641813, 2630479610,2544304140,2630533423,6701093, 436731934, 109053377, 2630565900,2630582324,2630627067,2630814292,2630860812,2630877194,148144149, 2630893580,2630909962,214417449, 2630930528,2630980638,247775248, 159694864, 2631036668, 2631091705,2631173110,2631206095,2631281926,2631319618,2631352411,2631385547,2631434282,2631451083,127713301, 16826374, 2631511805,2631642878,2631745620,2631790335, 834601044, 2631974958,2632024090,117571836, 2632041340,2632089824,2632122890,1588953325,2632167168,786677836, 2632222248,2632286307,2632318978,1054654469,2632347393, @@ -4920,7 +4915,7 @@ static const unsigned int DictNodes[84251] = 2634318769,2634362634,2634421181,2634477323,2634690316,2634812673,1383219237,2634843201,2634924130,2634968845,2635045872,2635099918,2398781532,2635170251,2635219050, 2635300946,2635335317,2635408110,2635467312,2635525903,2635776087,2635825455,2635858350,2635909019,2635973455,2636005432,404897802, 463110156, 2636042175,2636088209, 2636137461,2636210924,2636263184,51495857, 2636620818,2636693560,2636726298,2636743620,2636791824,2636808334,2636853009,2637049618,294142385, 2637141799,2637186270, - 2637240226,2637311763,2637398116,2637431087,2637464745,272154732, 176982572, 329025135, 2637503886,2637547042,2637594640,2637611013,279969804, 2637629625,2196389, + 2637240226,2637311763,2637398116,2637431087,2637464745,272154732, 176982572, 329025135, 2637503886,2637547042,2637594640,2637611013,279969804, 2637629625,2196389, 2637721364,2637774914,2637808075,2637858121,2637908950,319422506, 2637983509,2638086236,1499906050,1033224223,2638119342,155975686, 2638168080,2198365, 2638190953, 2638266450,2638300850,2638331914,341885785, 2638348430,294699024, 2638393110,2638458647,2638512194,3178537, 2638692378,2638720793,2639183882,839827466, 2639200738, 338145050, 2639302526,711459793, 2639430686,2639462421,2639478796,2639495275,955695106, 2639527938,2639544346,2639560746,269107212, 2639577126,2639593503,2639610093, @@ -4937,16 +4932,16 @@ static const unsigned int DictNodes[84251] = 2188443669,2644297648,2644328450,225575543, 2201960458,2644345291,2644394416,1450131494,2644428201,2644460057,2644525862,2644557826,2644574218,2407170050,2644602663, 2644853415,2644897576,2645016635,2645049356,2645065743,1383596053,2645083045,2645118669,2195764, 2645180846,2645229871,46514214, 2645263288,2645311554,2645344687, 2645377463,370443132, 2645409879,2645458963,2645475359,2645491728,2645508929,2645540904,2645557260,2645573654,2645590018,2645606410,2498379786,2645634857,2645689546, - 2645741478,2645786719,2645836793,659914762, 2645918149,2645962538,2646197619,2646229038,2646278170,2646296590,2195547, 892157964, 2646343746,8400683, 599343126, + 2645741478,2645786719,2645836793,659914762, 2645918149,2645962538,2646197619,2646229038,2646278170,2646296590,2195547, 892157964, 2646343746,8400683, 599343126, 2646376515,2646460292,2032599800,2646523910,2646540307,2646556787,2646573092,8978438, 2646594235,2646655498,2646687754,2646704130,2646720540,432848918, 2646737656, 2646769748,2646803486,2646835210,2646851643,2646884389,2646900767,2464464906,1371734025,2646917208,2646961964,2647098023,212385802, 2647130207,2647179266,2647195679, 27328522, 2645131276,2647212069,24297775, 2647240493,2647346197,6406172, 2647425655,112934966, 2647457846,2647491658,2647535406,140247719, 2647699247,2647770914, - 1126088788,2647801932,1257897994,2647846704,2647916833,2647949328,1286520847,2647965702,12763154, 2647994161,2648048376,2648092466,2648179083,4948025, 433750100, + 1126088788,2647801932,1257897994,2647846704,2647916833,2647949328,1286520847,2647965702,12763154, 2647994161,2648048376,2648092466,2648179083,4948025, 433750100, 2648211759,1564410535,2648256307,2648296604,2648342549,1899429904,82280450, 2648359718,2648391696,1202585629,75563027, 2648293378,2648518452,2648829330,2648899621, 882032662, 2648920036,366788707, 2648965161,2648982104,2649014806,2649047099,27590682, 2649091385,2649161780,2649194512,1203339279,2649210961,2649243702,2649276421, 2649293815,2649370421,2649435958,2649473026,2649489490,139984898, 2649534263,2649616184,588023658, 1960854105,117572928, 2649845561,460898396, 2649901585,2649987282, 2650058554,8398646, 52363290, 2650255163,2650353468,2650390544,4292845, 2650419005,2602074171,2650506270,2650538016,2650570778,132857896, 2650588436,2650636316, - 2650652712,2650669075,212107301, 2650685471,147013669, 2650713918,2629238891,25559932, 2650867564,380895298, 2650910527,2650980363,2650996742,2651013132,191053881, + 2650652712,2650669075,212107301, 2650685471,147013669, 2650713918,2629238891,25559932, 2650867564,380895298, 2650910527,2650980363,2650996742,2651013132,191053881, 444809275, 1032142879,2651041600,2651320129,2651391183,2651458261,599343146, 2651504650,2651521066,895991874, 2651549506,2651668502,2651685711,2651729731,2651800515, 2651850910,184041709, 2651893572,2652046204,615071765, 2652106565,2652422236,2652454938,199000076, 2652472618,269107212, 2652520460,2652536834,80936986, 2652554249, 2652586585,2652618836,2652651943,1723564091,2652712774,85098508, 2652794695,2652898542,2652934518,2652962854,1534902288,2652991304,2653061122,83197962, 2653089609, @@ -4961,14 +4956,14 @@ static const unsigned int DictNodes[84251] = 1225998367,2074427408,2657808217,2657939290,1878065168,2658013307,2658058251,2658074640,2658091034,2658107407,183369750, 2056159234,2658135899,2658239988,2658287632, 2658305025,2658354588,2658404706,610402319, 219463692, 2658452980,2658500634,289996842, 2658517011,2658533378,2658549868,116342815, 1357447234,2658582627,2658615338, 2658632112,1878474804,2658664469,901185558, 2658684780,2658742108,2658812755,2658877476,2658893835,2658918446,2658975968,2659008543,5866074, 2659025390,2659058657, - 2659090453,264945695, 2659113840,2659190723,2659237954,2659271568,2659303727,4408129, 2659348317,2659402265,2659479390,480871479, 2659601156,2659649543,116375983, + 2659090453,264945695, 2659113840,2659190723,2659237954,2659271568,2659303727,4408129, 2659348317,2659402265,2659479390,480871479, 2659601156,2659649543,116375983, 201443639, 2196554, 1591607298,2659708767,2659795078,30589060, 2659811867,2659844150,2659876875,2659905376,59293833, 2660040725,2660057119,2660073919,2660106281, - 2660122626,131989533, 202522662, 1164591143,2660139115,2660171788,2660188186,2660204768,2660237392,1329217578,2660282209,2660511586,2660664448,210042918, 204488726, + 2660122626,131989533, 202522662, 1164591143,2660139115,2660171788,2660188186,2660204768,2660237392,1329217578,2660282209,2660511586,2660664448,210042918, 204488726, 2660713208,2660746087,2041643018,2660777986,2660795596,611434533, 2660843536,1468792853,2660861690,2660892675,2660911960,2660970339,2523267103,2661025220,2661056522, 2661073788,2661122058,323748272, 2661138915,2661183332,2661335062,2661351738,2661384793,2661417065,2661449769,2661466124,2661482518,2661498892,402128922, 2661515553, 2661560011,2661629973,2661646348,741130266, 737902594, 2661662739,131760131, 2661687870,114212876, 2661728258,2661745091,2155069478,2661777492,2661810479,2661842956, 479133812, 2661871461,2661975070,2662006812,2662023170,1563115541,2662039855,2662084454,2662170655,381550603, 2662189278,2662239265,2660810755,2662285371,2662318708, - 30392348, 2662362983,2662449190,2555084816,2662477672,2662547466,1427816883,1533526053,158533521, 2663088130,2663106033,104765555, 2663137289,2663153801,20250758, + 30392348, 2662362983,2662449190,2555084816,2662477672,2662547466,1427816883,1533526053,158533521, 2663088130,2663106033,104765555, 2663137289,2663153801,20250758, 2663170449,2663202858,16269322, 2663231338,2663252025,2663268393,2663284762,34226195, 2663301157,2663317561,61685797, 2663333898,2663350329,9535503, 2663366682, 2663383174,2244493324,2663399559,59375638, 2663858218,7602310, 2663886700,2663952237,2664099694,2664202306,2664236445,51593244, 2664284705,177179594, 2664334289, 2664382935,2664415234,2664432049,2664464395,1695137808,2664492911,2664579078,2664595478,2664611845,757776396, 2664628461,621576214, 2664661038,2664716224,2664787824, @@ -4982,69 +4977,69 @@ static const unsigned int DictNodes[84251] = 1497366612,2669314050,1371586563,2669330926,55918623, 2669363243,2669408130,2669625428,933707778, 2669659455,2669731648,2669772822,180715551, 2343862766,2669791893, 2669838446,1032291808,2669883267,2670210948,2670395438,2670445015,2670477943,2670510090,150913045, 433161039, 2670529545,992641045, 2670592065,2670653317,2670706709, 2670723982,3244116, 2670800774,1782415401,2670943231,2670997383,2671117321,2671151870,2671181908,2671226760,2671374217,2671493579,2671550242,2033827906,2671624245, - 2671659567,2671722498,128451074, 2671738988,2671772149,2671804459,2671837213,278544415, 2671854890,2671904182,3260459, 222086906, 1820066250,2671957002,307216819, + 2671659567,2671722498,128451074, 2671738988,2671772149,2671804459,2671837213,278544415, 2671854890,2671904182,3260459, 222086906, 1820066250,2671957002,307216819, 2672013194,2672226187,2672394324,299008021, 2672429038,29901226, 2672488332,610224191, 2672542167,2378629142,2672574502,44711967, 2672590882,2672705635,2672741828, 234176550, 2672803947,2672836663,2672902231,2672963469,2673067409,1621869045,2673143694,2146890, 2673296953,2673393771,2673429112,126025757, 184074271, 2673459267, 355731614, 669925402, 732135855, 497811487, 2673541227,316637260, 2673573981,2673624850,2673672202,2673688713,43384838, 2673717135,2674061200,159694850, 2674147358, 1111179276,2674192273,2674316283,119357479, 2674372498,2674524162,1087930374,2674540584,630472720, 17448972, 2674569107,2674727410,139968524, 303579172, 2674789017, 139329557, 2674864020,2674921806,2674966530,111280150, 2674982978,1252460776,2675016139,108315138, 546931288, 2675077013,2675142550,2675245099,2675277889,2675339159, - 2675458962,1241333766,29476430, 301334830, 2675507303,2675601304,2675650457,2675736604,2675753019,569583632, 2675788276,2675836240,158810628, 2675896218,93700098, + 2675458962,1241333766,29476430, 301334830, 2675507303,2675601304,2675650457,2675736604,2675753019,569583632, 2675788276,2675836240,158810628, 2675896218,93700098, 2675983956,2676080740,2676113484,2676146631,2676195823,2676228135,2676261998,57032715, 2676349093,2676424710,2676443166,168935435, 2676502427,2676666268,2676763255, - 212860949, 2676830109,2676900286,2676977566,284786707, 6373452, 2677059487,2677452704,2677637136,2677654767,2677686312,159432715, 171000111, 2677704692,150536246, + 212860949, 2676830109,2676900286,2676977566,284786707, 6373452, 2677059487,2677452704,2677637136,2677654767,2677686312,159432715, 171000111, 2677704692,150536246, 2677769535,297844774, 2677837500,2677883381,2677915708,2677999208,124472183, 2678070084,2678130677,1052001625,2678218308,153191873, 10829845, 2678277109,2678341653, 2046332994,2678358073,145440799, 2678374412,991051788, 2678402977,116375853, 2678489148,291095663, 1736540237,2678574011,2678652987,2678685783,209141766, 2678747042, 1549844506,158499841, 2678825801,2678898728,2678915103,2170126346,2678931562,2679025571,134513271, 2679079426,1769922, 2679114287,2679182777,2679271332,2679369637, - 2679439398,2679455775,469043888, 5947433, 2679484326,2679537730,2679570735,2679615399,2679767534,2679801204,2679861160,2679932660,2680007097,2680078338,115507210, + 2679439398,2679455775,469043888, 5947433, 2679484326,2679537730,2679570735,2679615399,2679767534,2679801204,2679861160,2679932660,2680007097,2680078338,115507210, 2680095257,6701085, 1352877065,2680161670,2680237993,68599848, 2680369066,2680620127,2680693676,2680745899,1995211775,164380688, 2680832039,383402038, 2680876972, 2680938492,511574461, 2680991661,2681083823,2681176106,247840806, 2681192474,2681208884,2681242094,552862561, 112935014, 2681286574,2681488120,2681520651,2681581487, - 2681630640,2681684040,2681749975,2681784294,2681842719,2681896998,2681913360,2342954, 282427423, 2681930265,2681997058,238551157, 2682063220,2682127529,2197282, + 2681630640,2681684040,2681749975,2681784294,2681842719,2681896998,2681913360,2342954, 282427423, 2681930265,2681997058,238551157, 2682063220,2682127529,2197282, 2682160011,2682225962,2682274552,2682306863,2682340342,2682384305,2682486794,2531422130,2682503713,34701499, 2682552322,1917463, 2682580915,137642519, 2682711988, 563298306, 2682814476,150093850, 2682830858,2682847248,2682863627,2682880432,2682914060,2682974133,311692506, 2683142190,2683191326,2683236278,266436610, 2683356572, 108511268, 2683404375,2683465655,2683556873,2683600898,250118154, 2683629496,2683717821,210042920, 2683782598,2683830282,2683847083,2683891641,2683994150,1857273892, 2684010498,2684028401,33113075, 2684071866,2684157983,2684174362,2684190738,933916, 2684210600,2684239912,1938685994,2684256296,2684272661,717209637, 2684289045, 2684305840,2684338204,2207675, 2684792764,1097749, 7143508, 2685027930,2685071293,2685142993,344081054, 2685192365,1020559467,1993211988,2685267902,2685317055, 279904267, 156123190, 2685452372,2685497280,809811994, 2685595585,2685682619,2685752274,134168630, 2685832489,2685895548,2685956034,2686136259,154042444, 2574614554, - 2686300100,160759829, 2686365637,2686436179,115933222, 2686513094,2686550042,2686566402,952614933, 2686582800,2686599210,2686615984,2686649612,2686697580,446955536, + 2686300100,160759829, 2686365637,2686436179,115933222, 2686513094,2686550042,2686566402,952614933, 2686582800,2686599210,2686615984,2686649612,2686697580,446955536, 2686731087,519454739, 2686763046,2686779408,2686795818,180109343, 2686812176,128991339, 2686828796,2686861322,291504150, 79101958, 2686889927,2687009686,2687060468, 2687119304,1832517644,2687172707,2687205905,1457193807,2687250377,115720251, 1918976002,1206422578,2687496138,498221098, 2687643595,2494595100,2687696977,2687731651, 2687790302,2687872972,2687942682,880574753, 2687959467,920190997, 2688004045,2688092074,407666698, 1470332939,2688155667,2688172063,265682986, 2688200654,2688307010, - 2688352278,519815170, 2688369099,2688417794,589987850, 2688446415,2688565270,2688586280,2688631817,2688664053,47611945, 2688696360,53690394, 2688719021,32833548, - 2688761908,2688795678,2688828682,2688860188,884555788, 2688876556,821068585, 2688892974,2688942148,150389039, 2688996648,2689052624,2689181025,2689220662,23789578, - 2689253392,2689269798,379256848, 2689286170,52510736, 3375142, 2689314769,2689548725,2689581476,255705119, 2689615020,2689675218,2689880141,2689941510,404897813, + 2688352278,519815170, 2688369099,2688417794,589987850, 2688446415,2688565270,2688586280,2688631817,2688664053,47611945, 2688696360,53690394, 2688719021,32833548, + 2688761908,2688795678,2688828682,2688860188,884555788, 2688876556,821068585, 2688892974,2688942148,150389039, 2688996648,2689052624,2689181025,2689220662,23789578, + 2689253392,2689269798,379256848, 2689286170,52510736, 3375142, 2689314769,2689548725,2689581476,255705119, 2689615020,2689675218,2689880141,2689941510,404897813, 2689957898,124862897, 2689974283,2689992720,2690039848,2690056202,2690072607,147505171, 2690090303,2690155361,2690196165,46448650, 2690252942,2690285570,2690303099, 2690334742,2690352789,2690417487,395345930, 2690450421,2690516835,2690580517,2183790604,2690596896,1421410335,45465657, 2690629686,2690662451,518291468, 2690695259, 262127632, 2690740179,2690809877,2690826262,2690843672,2690891792,2690908216,635978690, 2690940954,2690957333,2690974603,2691039319,119259142, 972996619, 2691094948, 2691137552,2691153935,1284718658,2691170310,200589333, 2691190267,2691252654,2691301386,2691317802,1217069068,2691335056,2691367371,2691416911,2691448878,2691498068, - 2691542996,2691706837,2691772374,2691842090,2691858454,159367208, 2691874915,2691907615,288769907, 2691924014,2691979525,2692022284,2111406106,2692039287,174080142, + 2691542996,2691706837,2691772374,2691842090,2691858454,159367208, 2691874915,2691907615,288769907, 2691924014,2691979525,2692022284,2111406106,2692039287,174080142, 2692071859,2692106011,2692165591,2692329432,2692386473,2692442558,2692498883,2692546579,2692562946,2692579339,2692595743,607289354, 2692612150,2692644870,2692661263, 2692677648,2692694026,193593373, 2692711722,2692759574,286310412, 2692788185,2692973589,2693022920,2693056073,2693137409,800457305, 2693185557,2693214170,2693251531, 2693300306,2693345243,2693415765,2693464123,2693497592,639500720, 2693529602,2693545990,2693562374,44646405, 2693578849,2693652792,2693705692,2694016989,2694135814, 113082380, 2694164446,2694220623,2694275031,2694382476,2694433339,163643850, 2694513071,673825448, 2694545418,771359195, 190169126, 2694574047,2694692890,2694709324, 2694742032,2694758410,2694774800,2694791199,45907997, 2694808988,764510285, 2694868960,2694971476,2695004190,300056587, 2695039295,2695069748,187155032, 2695114721, 2695206086,2695283123,2695315468,2129979, 2695333353,2695393250,2695458787,2695512086,2695528469,2695544863,183975957, 2695567669,2695643595,2695702871,2695790894, - 2695835620,2695922295,2695954954,2695988769,2696030347,2696085963,2696146917,558972944, 162250783, 2696216607,2696232982,2696249384,2097154, 2696277990,273272065, + 2695835620,2695922295,2695954954,2695988769,2696030347,2696085963,2696146917,558972944, 162250783, 2696216607,2696232982,2696249384,2097154, 2696277990,273272065, 2696413210,2696429871,739442709, 2696462402,2696495158,212189210, 2696527912,2696544322,2696577105,849183656, 2696622055,2696982504,1812250636,177143824, 2697118879, 2697150701,2697183298,2697224830,2697297941,547897356, 2159493158,2697326569,2697479488,647626794, 2697513947,5308705, 2697593845,2697658510,2697691587,2697736170, 533069908, 2697789452,204374054, 2697805890,2697839499,68242548, 2697904609,2697963977,2698035308,1727055192,2698068055,2698122964,2698216836,73531407, 2698281411, 2698313730,2698330122,281001996, 2698346548,2698385775,616792083, 2698428522,2698522603,2698681285,1271119888,2698743438,595198872, 794362129, 2698801132,2698920225, 2698952730,264437791, 2698981357,2699116976,2699149745,2699182096,2699199273,2699231664,578830395, 2699268006,203128844, 2699314409,2699363216,2699396072,2699444234, 1309999106,48545834, 2699460667,2699493452,2699527197,1115029542,349388816, 2699575362,2699608102,2699624486,2699640898,110248783, 2699685870,122322997, 2699854424, - 1019938164,300924987, 2699886638,2699935770,123274063, 2699954407,2700052440,2700116428,2700151113,2700226543,2700488688,2700559859,2700591116,2700607498,849723413, + 1019938164,300924987, 2699886638,2699935770,123274063, 2699954407,2700052440,2700116428,2700151113,2700226543,2700488688,2700559859,2700591116,2700607498,849723413, 2700625978,1531260913,2700701682,2700820496,2700836874,2700853680,2080112699,283066410, 2700886075,2700931059,2700996596,138641879, 520700046, 2701165506,2701197338, - 2701217746,2701289249,2701328921,2701406197,2701543294,823885862, 2701574236,2701606914,2701623307,2701639691,45613058, 2701656366,49479687, 2701688872,5308874, + 2701217746,2701289249,2701328921,2701406197,2701543294,823885862, 2701574236,2701606914,2701623307,2701639691,45613058, 2701656366,49479687, 2701688872,5308874, 2701705228,132777351, 2267054118,2701726158,2701770764,2701787174,9535504, 2701803566,2701853598,2701887869,2632466954,2701979638,2702045175,2702133558,2702180404, 2702213229,2702258168,2702356473,246087717, 2702438394,121077776, 154042395, 2702525581,2702585851,436601886, 2702706664,2702764928,2702831612,2702917750,2702950421, 628555795, 2702966812,2702983175,264159273, 2702999686,18677894, 2703015965,7307321, 2703290366,3244879, 2703606251,2703650815,2703720474,119358311, 2703749120, - 2355249218,44253195, 341442986, 1369588887,2703831041,2703896578,2704002191,2704048134,2704064524,2150482030,2704080984,1962704912,2704116786,2704191491,577175558, - 2704261204,2704297129,2704343056,2704359434,189071402, 1053556762,2704379587,2704437252,2704605408,271925264, 2195506, 2704637954,2704655467,198672396, 209338384, - 2704687106,29622329, 2704715781,2704834602,2704850975,891633721, 732102658, 2704867330,51593227, 108707842, 2704896006,1131888678,2704977927,1341108232,4309925, + 2355249218,44253195, 341442986, 1369588887,2703831041,2703896578,2704002191,2704048134,2704064524,2150482030,2704080984,1962704912,2704116786,2704191491,577175558, + 2704261204,2704297129,2704343056,2704359434,189071402, 1053556762,2704379587,2704437252,2704605408,271925264, 2195506, 2704637954,2704655467,198672396, 209338384, + 2704687106,29622329, 2704715781,2704834602,2704850975,891633721, 732102658, 2704867330,51593227, 108707842, 2704896006,1131888678,2704977927,1341108232,4309925, 2705113119,2705129491,54820886, 503317513, 2705145987,120143878, 2705551369,2705637406,2705671057,2705719315,2705735719,2705772938,635977784, 2705868776,2705928202, 2706014251,2706052780,2706123896,2706211814,2706243596,2706259999,2706276358,428769282, 2706292820,2706326264,2706370571,2706458988,2706516342,865419803, 2706583564, 2706665485,536380263, 279923575, 2706731022,155975691, 3244120, 2706829327,2706849851,2706882636,2360350, 2706919301,348635202, 2707001198,1985052756,2707062815, 2707091472,2707157009,2707259398,8994837, 2707275878,2134949890,1024590261,2707309469,2707395012,216461330, 2707456809,2707489239,940654613, 2044805132,2707524021, 196001804, 2707599379,2707734554,2707750914,911442551, 2707767383,2707816547,2707849276,46088213, 2707932383,2707980372,2708013098,2708029872,2708063127,2708111382, 2708138528,2708193318,1177240084,1288110082,277970982, 2708210582,2708258866,2708291615,2708307987,636977455, 2708326429,2708373520,2708389903,165330966, 1591607312, - 2708418580,2708455426,2708471818,2379481109,2708500318,2708631573,2708686485,141901864, 769900603, 2708762646,2708959255,2709028956,2709062539,2709127227,894615562, + 2708418580,2708455426,2708471818,2379481109,2708500318,2708631573,2708686485,141901864, 769900603, 2708762646,2708959255,2709028956,2709062539,2709127227,894615562, 2850831, 2709172248,2709242286,122486865, 2709293758,2709352473,141049892, 2709454888,2709471251,338493478, 2709494781,768458773, 2709549082,2709602370,2709159995, 2709647387,2709827612,879767581, 2709893150,2709947466,2709979983,2710012207,2710044710,2710062492,2710110218,2710126623,2710148308,401540126, 2710204447,2710277207, 2710326924,2710405186,2710437947,2710477705,2710536952,654018882, 2710569767,2710597664,2710663201,2710933108,2710979097,2711046003,2711077743,2711127389,2711177075, @@ -5061,13 +5056,13 @@ static const unsigned int DictNodes[84251] = 2717319184,240189455, 2717347898,2717419298,2717450841,352370709, 2717483050,2717499414,2717528123,2717577276,2717691965,2717779144,2717811552,2717888574,2718089252, 356925469, 2718117951,235438146, 203818472, 2718183065,2718249024,2718318895,307462170, 2718351426,134840346, 2718396481,2718466060,2718482458,2718511170,2718745006, 2718794664,1447264340,1642053688,2718838851,2719006804,2719039498,2719055914,2719072322,2719110681,2719154222,404979724, 325238838, 2719215684,2719268948,1154056233, - 2719301691,2719346757,2719400067,2719416451,16728201, 2719445062,1372880938,1421410306,2719581073,950239746, 158812464, 2719630159,47284230, 2719662111,252248093, + 2719301691,2719346757,2719400067,2719416451,16728201, 2719445062,1372880938,1421410306,2719581073,950239746, 158812464, 2719630159,47284230, 2719662111,252248093, 2719678516,2719711244,2719727626,2719744037,2719760410,211189800, 2720165960,2720247881,649314314, 2720346186,2720450121,140247800, 2720530514,289914901, 2720563304, 2720612383,2720628801,136855636, 2720677981,2720727066,2720743892,2720777468,2720919627,2721017932,2721106201,2721170251,2721235010,162546619, 2721267722,2721284125, 2721300492,424017946, 2721329229,2721464623,2721506814,477233154, 2721562655,1231356335,2721591374,2721808410,2721824780,691929090, 2721852447,2721906700,2721923082, - 2721939875,412140993, 2721974254,244221039, 2722033743,2722115664,800227374, 2722240374,2722295889,2722345042,2722426963,2722512906,2722530198,2722590804,781221995, + 2721939875,412140993, 2721974254,244221039, 2722033743,2722115664,800227374, 2722240374,2722295889,2722345042,2722426963,2722512906,2722530198,2722590804,781221995, 2722709530,2722738261,229462761, 311198099, 2723069968,1154957328,2723086388,2723119203,2723164246,2723283371,2723328087,2723448106,296635044, 2723495990,2723529163, - 416253039, 2723579254,188957143, 173113381, 2723636532,2723692686,2723726257,787120730, 2723770456,2723872811,885588052, 2723917913,116212157, 2724151349,468000460, + 416253039, 2723579254,188957143, 173113381, 2723636532,2723692686,2723726257,787120730, 2723770456,2723872811,885588052, 2723917913,116212157, 2724151349,468000460, 2724185648,282838185, 2724219590,2724351068,223723549, 2724409434,2724497967,2724560938,2724577302,2724593748,838452055, 119816718, 3588943, 2724638811,2724900956, 2724999261,2725101606,285130811, 2725117978,2725146718,2725249327,3736231, 2725281808,437534758, 2725298230,902889509, 2725330966,2725347371,2725392479,2725691484, 2725725574,2725790375,763920396, 2725822894,2725884000,2725953839,2725986306,2726002716,250937382, 2726031457,2726101055,2726135668,1062273026,139198486, 2726167377, @@ -5075,61 +5070,61 @@ static const unsigned int DictNodes[84251] = 2726850660,2727178341,1057079312,2727240598,2727313953,2727362797,2727396753,3260718, 2727473254,2727559470,2727604327,2727691158,1503723536,2727744685,2727838381, 2727886946,2727932008,626376716, 2727985164,718962795, 2728001623,2728063081,139034680, 2728177770,2728250257,2728346494,470958106, 2728378665,64765973, 2728411620, 2728460290,650461194, 141295656, 2728489067,2728636524,2728751213,2728853506,249266186, 2728869919,2728886314,5177346, 227495523, 924566358, 194054619, 2728902748, - 1040101486,2728947823,2729144432,2729230374,2729246758,236470284, 189464607, 2729264210,2729329487,2729369383,1017495568,133579806, 2729427247,2729459778,545031198, + 1040101486,2728947823,2729144432,2729230374,2729246758,236470284, 189464607, 2729264210,2729329487,2729369383,1017495568,133579806, 2729427247,2729459778,545031198, 2729492502,2729508866,397590538, 2729537649,2729607190,2729623583,2729639962,2729656322,2729672719,2729689313,2729721868,2729738278,391970873, 1472167938,2729754626, 2729771115,2729803786,2729820162,2729836555,2729852930,51593254, 2729881714,2730066414,664453146, 2730100084,491159659, 2730147899,2730193011,2730246146,1547157514, 2730262593,2730324084,2730541527,2730586229,2730684534,2730738264,2730770477,338346050, 2730804119,2730852439,2730913911,2730983489,1068597685,2731044984,2731100570, 2731180139,2731213745,2731245673,2731278873,45613082, 2731344175,549028600, 2731389049,230801410, 2731458619,2731492236,2731540934,2580922379,200589349, 2731585658, 2731671571,2731694296,794673753, 2731737103,1498906665,2731753509,1703215133,2731782267,2731896956,2731950134,2731983902,2732015717,146456595, 2732048420,2332622964, - 2732064779,5177363, 2732082907,2732126333,2732195972,2732212355,18890770, 2732228615,2237104138,2732246591,573390889, 2732754488,2732830846,2732917545,2834471, + 2732064779,5177363, 2732082907,2732126333,2732195972,2732212355,18890770, 2732228615,2237104138,2732246591,573390889, 2732754488,2732830846,2732917545,2834471, 2732949525,2732977021,2733070519,2733240447,2733314270,2733371520,2733409913,2733457414,2733486209,2733539340,452853786, 2733568130,1497382951,2733666435,2733731972, 2733850634,67043349, 2733869847,153190482, 2733933487,540377128, 2734010501,2734148109,2734207110,781090822, 2734260276,47317033, 2734293076,2734325859,2734358612, 2734392058,2734436487,446414860, 1667874843,2734622145,2734665864,2734715017,2734768140,2423685146,2734796938,2118664202,2734885460,2182922252,2734932982,2734977163, - 131072006, 2735096422,2735128598,2735144972,149504026, 2735161425,573571103, 2735194571,2735243267,48513027, 2735259686,2735276091,2735308855,2735375015,450593633, + 131072006, 2735096422,2735128598,2735144972,149504026, 2735161425,573571103, 2735194571,2735243267,48513027, 2735259686,2735276091,2735308855,2735375015,450593633, 2735419532,2735489090,2735521824,183369827, 2735566989,2735704486,2735769629,2735817758,193660706, 2735857039,2735915030,367443984, 2735931404,229687302, 2735958014, - 2736013806,2736046317,1106100803,2736091278,2736376075,2736422924,6897771, 1016202249,2736451727,237731861, 2736521218,2736538062,2736599184,2736669131,127500300, + 2736013806,2736046317,1106100803,2736091278,2736376075,2736422924,6897771, 1016202249,2736451727,237731861, 2736521218,2736538062,2736599184,2736669131,127500300, 2736730257,2736877714,2736979974,2736997470,1051247069,2737051556,652772672, 2737094959,2737130800,2737176994,5342660, 2737210231,241991696, 1692058033,2737254547, 2737565844,2737684482,135184389, 385466460, 2737713301,2737877142,170885551, 156828495, 2737931887,2737979446,116376409, 2738022931,1052557354,2738110530,1657667620, 2738143291,275546143, 574914581, 2738188439,2738241557,24969347, 2738270360,2738389013,211910672, 2738405392,2738421776,219529254, 2738450585,210272278, 2738552859, 2738585646,2738634824,2738701321,2738733087,1255539159,2738749546,2554609670,2738832120,2738864220,2738909338,2739122331,2739241058,2739273744,1215283205,2739292090, 451313718, 2739351708,2739453968,8994827, 45334530, 2523142, 2739482781,2739761310,2739832199,2739864632,2739941535,2249261058,2740043881,2740088992,2740209028, - 2740273218,2740305979,2740351137,2740470680,5308723, 2740518971,3211715, 2740551779,2740586847,2740638577,2740673781,56164374, 2740748718,2740809890,2195697, + 2740273218,2740305979,2740351137,2740470680,5308723, 2740518971,3211715, 2740551779,2740586847,2740638577,2740673781,56164374, 2740748718,2740809890,2195697, 2740957347,2741240111,2741275110,119439414, 2741306187,2741383332,2741551188,2741596325,2741678246,2741760167,2741846126,2741879390,2741932197,2742055080,2742157841, - 137102727, 2742190106,806715432, 2742206767,155975711, 2742239248,2742256481,2742300841,2742566928,2742583337,2742600234,2742616085,2742632470,2742648844,737772074, - 2742677674,2742731599,2202590, 2742763604,2742796334,2742857899,2742945267,2742976571,2743010771,2743061417,2743108520,2743144793,2743208086,246464736, 2981972, + 137102727, 2742190106,806715432, 2742206767,155975711, 2742239248,2742256481,2742300841,2742566928,2742583337,2742600234,2742616085,2742632470,2742648844,737772074, + 2742677674,2742731599,2202590, 2742763604,2742796334,2742857899,2742945267,2742976571,2743010771,2743061417,2743108520,2743144793,2743208086,246464736, 2981972, 2743255094,2743300268,2743386138,2743402498,2743418895,2743435286,2743452566,2743500839,2743533584,125452299, 2743550877,2062237706,2743631935,2743664676,2017984523, 2743693485,828932106, 931348492, 2743791790,244891664, 2743910419,439156762, 2743926830,2743975990,2744008744,829177922, 2744037551,2744362009,2744447152,2744534883, 2744598550,2744627377,115608240, 2744682299,2744729606,1053802527,2744758450,2744847562,2744909923,1223589919,2744955059,204718182, 3899438, 2745090114,1395802150, 2745122875,247481455, 2745168052,2745278527,2745336655,2745381045,2745435725,924860435, 2745495734,2745581570,356925450, 2745598435,2745630774,2745663568,2745696272, - 129008473, 2745712680,2745729083,956859483, 949584231, 2745763385,2745872567,3211732, 2745938104,2746105894,540770306, 2746122266,2401583120,2746140249,203829433, + 129008473, 2745712680,2745729083,956859483, 949584231, 2745763385,2745872567,3211732, 2745938104,2746105894,540770306, 2746122266,2401583120,2746140249,203829433, 2746200250,1053802508,2746331323,2746400822,1799520286,2746446012,2746548526,2746582937,2746646534,2746662924,629948422, 2746679755,2746728881,2746761247,2746777619, 2746794015,2746810882,2746855613,2746908759,124469719, 2746958127,2747003070,32325641, 2747139617,2747172480,2747219978,2352939438,4964393, 2747237342,2747297983, 2747383874,2747417113,2747482626,2747527360,2747679480,2747715279,2747793464,2747827047,2747859046,423018533, 2747891724,2747908178,1591837726,2747953345,2748022787, - 2485633055,2748040582,2748104811,196804630, 2748137686,2748182722,2748416026,7143851, 2748432878,2748477635,1217726403,2748646007,2748678638,2748723396,236470288, - 2748805317,3900225, 2748858902,131334198, 1599767420,2748903622,398704671, 2749058385,319602693, 2749136969,2017968178,2749202891,126223269, 27625941, 443629569, + 2485633055,2748040582,2748104811,196804630, 2748137686,2748182722,2748416026,7143851, 2748432878,2748477635,1217726403,2748646007,2748678638,2748723396,236470288, + 2748805317,3900225, 2748858902,131334198, 1599767420,2748903622,398704671, 2749058385,319602693, 2749136969,2017968178,2749202891,126223269, 27625941, 443629569, 2749251650,2749284390,2749301038,284721190, 2749336465,1126023210,2749432111,2749465521,2749497431,353239873, 2749558983,281001986, 2749640904,2749808747,2749842607, 2749874212,2684780550,2749894548,110298456, 2046337656,2749956148,434980817, 2750001353,2750105972,1041711163,2750181578,2750366750,333496336, 2750398530,2750432673, 6619243, 2750481230,2750546351,2750579535,2750611471,2750627878,2750644226,2750660614,200556555, 2750688492,5309587, 477102096, 1729544495,484016546, 2750825572, 2750890068,66814199, 2750932754,2751000779,2751250434,2751266827,59883535, 2751672526,2751754447,2751791188,254754845, 1150435761,2751823888,963952650, 2751852752, 2751967441,2752087141,2752135252,191679824, 2752180434,2752299074,754205160, 2752332627,2752397847,1457422976,2752431020,2752508115,2752577538,2752594027,2752626744, - 2752659487,2752675856,951959562, 2752704724,2752757798,179765290, 2752774574,2752823306,422920198, 2752839699,939558412, 111181843, 2752856130,2752889746,139477424, + 2752659487,2752675856,951959562, 2752704724,2752757798,179765290, 2752774574,2752823306,422920198, 2752839699,939558412, 111181843, 2752856130,2752889746,139477424, 2752938003,2752954452,481132555, 2752987595,2753042511,2753163477,2753282086,2753298434,54460419, 2753327318,2753491159,347062288, 121356294, 2753530207,2753577419, 2753626131,1021607957,2700509473,2753645120,2753704152,2753855519,360316938, 1035780108,2753871882,2753888277,1752351179,2753907187,2754015449,2754233516,2754281512, 2754297887,2754314278,2754330651,2754363509,2754408666,2754769115,2754838549,259997762, 2754855815,2754904102,1384382466,2754920532,2180218920,2754954296,2755018792, 2755035155,276119554, 2755052465,2755084317,2755101564,2755150338,2755183223,635273218, 2755215370,2755232033,2755264815,2755298186,2755330069,2755347352,2755396497, - 1569341491,1405681670,2755444755,2755461547,2755497181,2755527999,2755593206,2755626994,2755692322,347668546, 2755724633,2755756058,2755772427,2755789707,269467669, + 1569341491,1405681670,2755444755,2755461547,2755497181,2755527999,2755593206,2755626994,2755692322,347668546, 2755724633,2755756058,2755772427,2755789707,269467669, 226557958, 2755854366,2755887114,2755904671,2755936268,669106182, 2755952680,2755969035,2755985410,2756001802,2756018626,2756052069,2756100117,2756116496,2756132890, 1309770203,2756161756,2756232160,2756280392,2756345877,2756362327,2756411448,2756444172,111542298, 111542291, 2756461457,2756510234,2756542492,234176538, 2756560513, - 651591692, 2756624390,2756640799,777470976, 2756657611,2756706310,2756722709,120258586, 2756751581,2756821059,2756903926,2756935787,2756968672,875675674, 273301506, - 2757002538,2757050389,2757067659,2757132375,2757181919,2757214215,576225320, 2757230623,84721679, 2757247394,2757279750,2757296149,2757312514,2757328906,213319701, + 651591692, 2756624390,2756640799,777470976, 2756657611,2756706310,2756722709,120258586, 2756751581,2756821059,2756903926,2756935787,2756968672,875675674, 273301506, + 2757002538,2757050389,2757067659,2757132375,2757181919,2757214215,576225320, 2757230623,84721679, 2757247394,2757279750,2757296149,2757312514,2757328906,213319701, 2757345339,2757378147,2757410822,2757427259,859963413, 2757460006,1704280121,2757488862,2757576311,3915842, 2757640394,2757673014,2757705794,1191674327,2757738498, 47366182, 2757767391,2757849312,2757935116,344391731, 2757951777,2757985121,2758029537,2758148122,1229193226,2758165080,2758197250,2758213856,2758246431,2312161634, 2758275298,2758357219,2758455524,47710227, 2758509589,2758570213,2758672608,2758705689,131940373, 2758781530,2758852646,293371935, 2758870504,2758930662,2758996199, 142688278, 2613789272,2759520489,2759646205,2759688204,2759704602,199442890, 2759733482,2759805382,2759884810,2759901268,2759933978,2759951254,2760003326,2760098755, 2760159467,220774895, 2760274090,2760327627,24297579, 2321580051,2760385097,2760441882,299008031, 176504848, 2760470764,2760526549,1475739658,2760585453,2760741148, 2760785932,2196799500,2760802320,1845641269,2760831214,55722005, 2760936948,5505034, 2761015355,2761060591,382074902, 343212663, 2761142512,2761211970,2761246097, - 1500577797,2761310274,2761344802,2761388273,2761507248,2761542621,2761589182,2761654365,2761703453,680214544, 2761724322,2761797874,2761949685,2761982871,29786219, - 2762032789,2762096656,1215578150,2762125555,2095317011,2762227722,882901079, 5325854, 2762256628,2762311001,122667037, 2762354933,2762491520,2762539029,423593160, + 1500577797,2761310274,2761344802,2761388273,2761507248,2761542621,2761589182,2761654365,2761703453,680214544, 2761724322,2761797874,2761949685,2761982871,29786219, + 2762032789,2762096656,1215578150,2762125555,2095317011,2762227722,882901079, 5325854, 2762256628,2762311001,122667037, 2762354933,2762491520,2762539029,423593160, 2762555394,2762571782,845414406, 2762590046,2762655137,2762715382,2762801164,499580933, 325386242, 2762817760,2762850841,2762916817,2762970997,110249160, 2763059447, 1224769620,2763147989,385466586, 2763195643,1940816187,2763243530,2763259925,2763276310,2763292700,28147748, 2763678267,2763787780,2763867563,2763916787,2763948070, 2763964459,1052065874,2801670, 2763997206,2764013606,2764030006,2764075257,2764196808,2764266031,892878888, 2764308492,3245147, 2764328967,2764390459,2764423227, @@ -5137,20 +5132,20 @@ static const unsigned int DictNodes[84251] = 2765102715,2765156605,2765258762,2765275439,635879445, 2765320446,2765390838,336593743, 620281894, 2765423505,2765471837,2765533439,5390347, 2765619252,2765651994, 2765680896,2765767102,2765832211,2168930316,2765848586,2765865044,2765898680,2765947689,2765979707,2766024961,1878081546,2766111645,2766194019,2766259070,2766303490, 2766438426,2766455386,2766488704,2766536928,2766569494,2766585892,2766602278,2766618630,2766635039,193593382, 2766651458,2766696707,6111243, 2766831700,2766864395, - 1450754050,1201701800,2766885037,2766942468,256147458, 2766982837,125927450, 8401157, 2767063423,383352844, 2749366303,2767139078,2767237383,2767388754,56721429, + 1450754050,1201701800,2766885037,2766942468,256147458, 2766982837,125927450, 8401157, 2767063423,383352844, 2749366303,2767139078,2767237383,2767388754,56721429, 2767421494,2767454218,2767470628,2767487014,2767503375,2767519766,2767536144,2767552518,85360655, 1490993173,2767569433,2767646984,2767749551,2767781903,2767798294, - 43237412, 2767827209,2767880223,121094165, 2767899005,2767981905,1581072424,2768072970,2768175126,182157343, 2768192397,2768273515,2768318731,294944778, 2129974, - 2768437350,2768470777,2768502806,2768520106,2768601119,663912474, 131336378, 2768617931,2768667678,829505996, 2768701581,2768761100,2768830502,2768846875,651804688, - 2768880104,2768916303,2768974093,2769323064,2769400078,2769453656,2769485890,92815366, 2769518701,2769551831,2769596687,2769645840,348635152, 2769731671,263946269, + 43237412, 2767827209,2767880223,121094165, 2767899005,2767981905,1581072424,2768072970,2768175126,182157343, 2768192397,2768273515,2768318731,294944778, 2129974, + 2768437350,2768470777,2768502806,2768520106,2768601119,663912474, 131336378, 2768617931,2768667678,829505996, 2768701581,2768761100,2768830502,2768846875,651804688, + 2768880104,2768916303,2768974093,2769323064,2769400078,2769453656,2769485890,92815366, 2769518701,2769551831,2769596687,2769645840,348635152, 2769731671,263946269, 2769780738,204537866, 2769809681,2769879499,2769940754,2769996273,2770044450,372835169, 2770104595,2770190434,2770224930,2770255874,87048213, 2770284820,2770371042, - 2770469409,2770518026,1819181122,2337325068,2770546965,118210576, 2770698719,2770743121,2770781052,408420378, 2770831567,2770928534,2770977370,2771010708,5309470, + 2770469409,2770518026,1819181122,2337325068,2770546965,118210576, 2770698719,2770743121,2770781052,408420378, 2770831567,2770928534,2770977370,2771010708,5309470, 2771087638,2771185943,2771271699,2449752086,2771288101,116326436, 2771304554,2771398936,2771485141,2771533853,675168272, 2771550274,2771595545,2771681880,2771714064, - 347144208, 156041238, 664044864, 2771731431,2771792154,2771878347,2771927061,357793808, 1197032478,2771943842,2771976952,2772010846,2772075508,2772123679,98009099, + 347144208, 156041238, 664044864, 2771731431,2771792154,2771878347,2771927061,357793808, 1197032478,2771943842,2771976952,2772010846,2772075508,2772123679,98009099, 2772140355,9535529, 2772172810,8994832, 2772201755,2772535928,119358071, 2772566532,2772618125,195068504, 2772709660,451871031, 180207632, 2772840733,2772928075, - 2772978552,2773037342,2773205928,45531373, 2773241144,2773303328,1956758619,2773337116,2773369768,2773404350,2773463327,1199259679,2773560985,2773621541,382486003, + 2772978552,2773037342,2773205928,45531373, 2773241144,2773303328,1956758619,2773337116,2773369768,2773404350,2773463327,1199259679,2773560985,2773621541,382486003, 2773692704,2773747457,2773807393,2773909563,837386278, 2773943182,2774010535,1617625311,2774069538,2774188116,2774222241,338134330, 2774282531,1665810892,2774401627, 193185229, 2774433808,156762138, 2774453757,2774486637,2774544676,2774626597,126615594, 2774794283,2774827479,6374258, 2774859863,292110346, 148800321, 2774910058, - 2774991902,2775023632,134021126, 1515028496,2775041224,2123465007,2775073687,2576269343,545161244, 2775134502,2775331111,2775466467,2775505160,153207255, 41582594, + 2774991902,2775023632,134021126, 1515028496,2775041224,2123465007,2775073687,2576269343,545161244, 2775134502,2775331111,2775466467,2775505160,153207255, 41582594, 159662117, 2775582087,2775613500,2775695791,252297418, 2775728650,88948748, 2775761434,1268662287,2775798248,522321932, 2775892034,391970837, 2775937320,2776023061, 46088198, 805142534, 2776040793,2776073416,761184277, 2776104982,2776121375,2776137738,376324153, 2776155361,2776203306,2776221124,2776252438,173850626, 2776268812, 2776285205,2776301580,8994842, 2776330537,2776563777,2776612886,2776629279,2776658218,2776694786,7307290, 2776711623,2776760679,222281764, 2488125218,2776794539, @@ -5158,12 +5153,12 @@ static const unsigned int DictNodes[84251] = 336527701, 2777530498,2777546775,19464215, 2777575725,2777710608,2777728200,331628556, 796164590, 2777772334,2777952559,520651800, 2778005603,2778050864,2778154483, 2778185766,2778202196,584384871, 2778234936,2778268408,45776927, 2778300454,543523275, 2778329393,124863599, 2778464287,2778481792,2778541884,2778579972,2778647593, 1531742224,2778711151,22200336, 2778748658,5310994, 2778829346,2778906649,2778939394,408420388, 2778968370,2779045952,411631853, 2779122015,2779181363,2779301352, - 2779349018,2779365415,2779398182,2779414571,2779448482,973340684, 307610600, 2779514580,2779563422,519815184, 2779596221,2779646762,2779725826,2779742227,869449750, + 2779349018,2779365415,2779398182,2779414571,2779448482,973340684, 307610600, 2779514580,2779563422,519815184, 2779596221,2779646762,2779725826,2779742227,869449750, 9060354, 2779771188,2779908821,2779955212,116228107, 2779981862,721715243, 2780053610,2780148021,2780190578,1258652082,2780250415,2780295478,2780463618,2780497758, 2780562932,2780621431,111132682, 2780677532,2780725258,209584194, 2780745586,111149903, 2780790892,2780832492,128584149, 2780885303,2781055895,2781105335,2781196600, - 2781266455,2781298710,330874882, 2781315088,10371083, 2781331462,659703281, 2781350665,2781399977,2781446991,2781484289,2781528982,2781579750,2781611352,470827027, + 2781266455,2781298710,330874882, 2781315088,10371083, 2781331462,659703281, 2781350665,2781399977,2781446991,2781484289,2781528982,2781579750,2781611352,470827027, 2781660023,2781704505,743309352, 2781790511,2781835578,2781943812,2781972067,2782019606,2782035970,29622309, 2459910203,1992508915,2782052364,2782068843,2782114107, - 2782490940,2782544915,2782594617,2782691759,2782736701,2782790146,2782822466,2782867774,2639331350,2783101775,2783133722,91701250, 196149289, 2783152680,280903701, + 2782490940,2782544915,2782594617,2782691759,2782736701,2782790146,2782822466,2782867774,2639331350,2783101775,2783133722,91701250, 196149289, 2783152680,280903701, 2656701569,2783218672,2783283724,2783364944,2783414616,308953622, 2783490367,854639063, 2783627724,1249014080,2783686634,2783739963,2668773386,2783773209,2783838639, 2783871022,2783920888,2783965505,2784247824,2784264233,2784281130,2784296981,2784313366,2784329740,2784346666,2784362515,2784378892,2784395274,165773333, 2784424258, 2784461282,2784559195,2784604483,2784690260,2784735342,2261925894,893501872, 2784784708,2784837935,991297557, 2784870703,126107676, 2784915781,2784985547,1984905226, @@ -5179,26 +5174,26 @@ static const unsigned int DictNodes[84251] = 2790149603,2790195299,180601353, 2790229335,2790277591,2790309940,2790355288,205619212, 2790424683,2790469977,101908482, 2790573176,2790614403,2409218519,2790703106, 2790719498,2790735948,2790781274,1641595311,2790866946,2790884088,2790922770,251953587, 2790982731,2791059803,2791145905,2791178261,294633493, 2571517978,2791201573, 2791265134,2791321948,538755103, 2791375957,2791420253,2791538698,2791556283,2791605660,2791654956,1528807440,2791687524,2791754426,2791818391,2113548, 2791866847, - 575733772, 349372438, 2791911774,2726281323,2792013836,2792031262,2502983717,252297575, 2792063016,17924138, 2792091999,2021130762,2792149231,46497802, 328073273, - 2792698209,1769592, 2792751224,2792767507,2792783992,2792685606,2792800376,2792829282,2792882296,104759322, 2792898716,2792931334,2792947750,2792964111,46530565, + 575733772, 349372438, 2791911774,2726281323,2792013836,2792031262,2502983717,252297575, 2792063016,17924138, 2792091999,2021130762,2792149231,46497802, 328073273, + 2792698209,1769592, 2792751224,2792767507,2792783992,2792685606,2792800376,2792829282,2792882296,104759322, 2792898716,2792931334,2792947750,2792964111,46530565, 2792993123,2793046056,49364994, 2793075044,1364312095,2793247110,144097389, 2793291883,48513045, 2793337189,2793390120,2793406530,2793439288,2793473436,2793521162, 115589122, 2793537558,2793554036,2793570346,2793586804,514670628, 2793606715,2793635861,2793652246,2793668634,319619113, 232326174, 902889482, 2793685028,2793701417, 2793718284,2793763174,2793881666,2793914406,1619836966,2793934241,2794025319,2794064058,1351581722,8401256, 2794107241,2794254698,242466821, 2794324034,2794356787, 260459985, 2794389935,2794422324,2794467691,13008937, 2794668044,2794684442,81608710, 684195877, 2794701733,572407844, 1069057854,2794733611,2794771307,2794817114, 2794860908,2794996213,103432220, 2795028567,2795077668,2795094026,2795110429,17448971, 2795130365,2795159580,2795175978,2795192436,55050250, 336855156, 2795221357, 514654234, 628637812, 2795286894,2795417967,2779709461,202014749, 2795487720,2795520116,17809465, 2934362, 2795547328,459980838, 2795630960,2795866581,2795896948, - 581206038, 2795913242,6438918, 2795942257,2795978780,2795995141,2121154601,99876980, 2796011542,689800339, 724910095, 2796031855,2796094762,2796143083,307238580, + 581206038, 2795913242,6438918, 2795942257,2795978780,2795995141,2121154601,99876980, 2796011542,689800339, 724910095, 2796031855,2796094762,2796143083,307238580, 2796179211,307235495, 2796237170,581386250, 2796273701,882262044, 253625735, 2796302707,2796453930,94076968, 2796470310,254345228, 112197653, 2796499316,2796623987, - 2796650534,2796679541,2796699933,2796732532,2796748829,2796765966,2796797989,818921588, 2796814343,267403305, 2796843382,2796979307,2797010972,2797028110,192200741, + 2796650534,2796679541,2796699933,2796732532,2796748829,2796765966,2796797989,818921588, 2796814343,267403305, 2796843382,2796979307,2797010972,2797028110,192200741, 2797072759,116703238, 2797125643,2797142021,2797158422,10371188, 2797179283,2797223967,2797240330,273842635, 1476771878,2797269368,2797580665,2797666314,2632892444, - 2797682718,922697759, 2797717472,2797764715,2797800174,2797859194,620068866, 2797957499,739442719, 2798011660,2798072188,17843760, 2798174259,5865775, 2195708, + 2797682718,922697759, 2797717472,2797764715,2797800174,2797859194,620068866, 2797957499,739442719, 2798011660,2798072188,17843760, 2798174259,5865775, 2195708, 183353349, 2798207501,2798257128,2798305809,2798340856,55853058, 2798407096,2798469131,2798485588,2798518293,2798535257,2798567470,2798629245,2798731266,2798755002, 2798797103,271138837, 2798829584,2798846785,2415313743,2798879567,552452112, 267272625, 2798914665,610699205, 2798977083,138642441, 1345749099,1338785804,2799009831, 2799042570,2799059028,2799104382,2799333759,170230033, 174162157, 180207652, 2799448448,2799538062,2799583244,382976010, 2799599709,275038691, 2799648806,2799665183, 219856915, 2799682073,2677817382,2799747498,2799792513,2799862223,2799894999,2799927318,149880848, 2799943682,2799960897,2799996780,2800044614,835223592, 2800087426, 2800157927,287145994, 1026162700,2800206455,2800664618,9551903, 2800693636,2800944680,2801008864,350715926, 2801041439,984596509, 2801058321,2801093238,1389772815, 2801157435,2801188879,2801205250,775176202, 2801221644,56426525, 2801238022,124305429, 2801254410,2801270800,2801287173,2801303590,2801041420,2801332613,2801385510, - 2801401877,775897100, 2801418271,2512551942,2801437097,2801467479,2801516570,787922973, 2801533450,2801565985,2801600271,2801647647,677691434, 2801676678,948813835, + 2801401877,775897100, 2801418271,2512551942,2801437097,2801467479,2801516570,787922973, 2801533450,2801565985,2801600271,2801647647,677691434, 2801676678,948813835, 351240197, 2801745951,2801762323,2801778719,654983183, 2801795173,2801827878,2801844240,821690410, 2801860638,212107266, 2801893430,2801927648,2801958966,2801991686, 2802008519,2802057279,2802090005,2802107594,2802155970,2802188759,701530114, 2802221077,2802237462,2802253840,2802270234,1024737311,2802286676,2802319391,1407909926, 2801516575,2802348423,2802466858,2670722, 2802492967,2802548818,2965563, 2802581514,2802597904,2802614277,194822154, 2802630687,2802647052,2802663481,2802679867, @@ -5207,18 +5202,18 @@ static const unsigned int DictNodes[84251] = 2188181516,2803515434,2803531842,588218456, 2803564833,2803597331,2803613717,2803630092,2803646490,2803662879,2657599494,2803691913,2803728403,2803744808,2803761163, 1378910227,2803777567,2803793958,213205023, 2803810350,2803859931,2803904906,2803970443,2804072486,2209775628,2804101516,2804138000,1389772826,2804155215,2804188391, 701218837, 2804236354,2804269110,2804301835,1968881695,2804330893,1058586636,2804449311,2804465685,673218591, 2804482895,124338202, 2804514842,121929739, 2804536376, - 2804580383,2804596752,2804613953,830521382, 2804646697,2804678677,2804449320,2804695070,2804727824,2804745323,2804776998,1003012155,2804793356,2804809754,5292038, + 2804580383,2804596752,2804613953,830521382, 2804646697,2804678677,2804449320,2804695070,2804727824,2804745323,2804776998,1003012155,2804793356,2804809754,5292038, 2804826178,4030474, 720945162, 2804871566,2180038668,2168061981,2804925679,2804957196,2804973659,2805007907,2805055554,2805088344,1360969749,2805133711,2805170197, - 2805186591,654983225, 2805215632,2805363089,984596482, 2805412242,2805548578,2805596189,214827067, 49266690, 2805612610,2805646505,2805678096,2805694483,126369818, - 1380122655,2805723539,2806061258,2806104079,2806120474,951484428, 2806137950,588972792, 2806195178,2806267930,2806284810,52330527, 2806317058,2806333446,251232262, + 2805186591,654983225, 2805215632,2805363089,984596482, 2805412242,2805548578,2805596189,214827067, 49266690, 2805612610,2805646505,2805678096,2805694483,126369818, + 1380122655,2805723539,2806061258,2806104079,2806120474,951484428, 2806137950,588972792, 2806195178,2806267930,2806284810,52330527, 2806317058,2806333446,251232262, 2806362516,2806399058,2806432757,1992394119,2806497337,2806513676,2806530086,2806546448,228245519, 260966956, 2806562822,2806579221,2806595615,1394556939,2806615427, - 2806662451,248512538, 2806713246,2806759508,2806792221,143720488, 2806808623,2806841647,2806874128,2494922793,2806891849,2806940681,2806973869,2807021599,128155658, + 2806662451,248512538, 2806713246,2806759508,2806792221,143720488, 2806808623,2806841647,2806874128,2494922793,2806891849,2806940681,2806973869,2807021599,128155658, 2807037964,750666017, 2807055245,2807138361,2807201818,2807218217,2807234576,2807250970,114409483, 2807267338,937509335, 2807283743,2807300153,2807316511,2807332902, 984596492, 2807349307,2807382031,2807398426,2807414796,2807431174,1892286476,2807460245,543621136, 2807536242,2807578650,1866612748,2275067055,2807596154,2807666981, 2807709725,2807727000,2807775324,2807808012,573718538, 268582941, 2807824468,2807858673,2807889986,119997738, 2807930219,2807972064,2808004610,1857273894,2808022279, 188105819, 2808123795,2808168460,1062273062,2808184924,2808217631,2808234005,2808251368,2808301433,2808348698,114409529, 2808365507,2808397836,2808415222,2805596181, 2808447086,2808479756,2808496166,1850441744,2808525206,2808627242,2303016970,2808643625,2808659980,2808676378,2808692748,2808709130,839548949, 2808732475,2808776226, - 2808823823,829308966, 351240249, 2808840268,2808872970,2808889386,1737834536,2051325978,2808918423,2808971304,2807431179,2808987676,350715925, 2809004091,56492073, + 2808823823,829308966, 351240249, 2808840268,2808872970,2808889386,1737834536,2051325978,2808918423,2808971304,2807431179,2808987676,350715925, 2809004091,56492073, 2809036881,2809070439,683802645, 2809115032,2809299043,2809331768,978452502, 2809365398,2809413648,2809430026,2809446416,241795083, 2804236364,2809462799,2809479206, 2809495568,2809511972,2809532268,2809590169,2809643061,2809675812,56492047, 2809692176,1417445402,2809708566,2809724968,2809741318,1408811039,2809757736,2809774383, 2809806886,938295334, 2809823289,1361051664,2809839635,2809856016,56492058, 5718038, 2809872396,2809888778,2809905260,2809937935,2809963480,2808987667,2810019924, @@ -5232,30 +5227,30 @@ static const unsigned int DictNodes[84251] = 2813198364,2808414239,56426524, 2813216959,2047246367,2813247500,2813263965,2813313062,2813329439,2813345834,2813362242,2813394976,2813427742,2809675816,2813461327, 79790118, 2813493258,2813522337,2813609313,2813658099,2813673477,1079296002,147800104, 2813697340,2813759896,2813838357,2813886896,2813919671,2813952459,2814002166, 2814033946,2814050310,2814067225,2814132262,2814149976,2814197984,153747561, 2814236870,2814280126,2814357922,2814410792,2814427142,2814443541,2814459931,2814497369, - 129466379, 2814558224,2814574597,2814595475,2814652835,2814740501,282345513, 2814771239,2814810647,2814865828,2814951436,228294666, 2814967867,2815013285,214810661, + 129466379, 2814558224,2814574597,2814595475,2814652835,2814740501,282345513, 2814771239,2814810647,2814865828,2814951436,228294666, 2814967867,2815013285,214810661, 2815050265,2815117248,2815198377,1417461802,2815231215,2815262776,2815295509,2815311903,2815328272,2815344650,654377019, 2815373734,2815426581,2815442946,1380122661, - 2815459359,654983210, 2815488423,365510668, 2815524924,2815607699,388710440, 2815668648,2815721484,2815737862,1412743174,2815755689,108298261, 2815787116,949534751, + 2815459359,654983210, 2815488423,365510668, 2815524924,2815607699,388710440, 2815668648,2815721484,2815737862,1412743174,2815755689,108298261, 2815787116,949534751, 2815832489,2815918304,2815951275,79790106, 2815983642,2209775656,2816000142,1383890975,2816033370,2816065576,775176207, 2816081961,2816098335,964689939, 2816118920, 2816149137,2816212994,2803793930,2816229398,2816245776,78905373, 2816266634,2816373162,2816459660,787660802, 2816508207,2816540710,843350054, 2816557082,1326645279, 2816573466,2816589845,2808856616,2816606733,2816658142,2816704514,2816720902,2816737282,2816753674,149504021, 2816770090,31424554, 2816799147,2816835624,2816852006, 2816868354,2816884818,2816917591,2816979372,2817032204,2807431197,2817048607,1391837203,2817064972,2040463370,2817081354,2817097747,2817114143,370720783, 2817143213, 2817212456,2817228819,2817245611,2817278039,1405714438,2817327158,2817360798,1737834534,2817392680,2817409070,2817458647,2817490965,2817507359,2817523728,2804776970, 2817552814,2817651119,6619615, 711950348, 2817733040,2817929649,588219239, 2330378271,2817982480,1380122634,2817998864,2818015683,2818048010,2818064415,2818081680, - 2818113612,2818146763,2818196649,2818228226,2802860058,2818245726,51757066, 56426536, 2818306482,648331280, 2818359322,2818375983,1058586664,2818408460,370720770, - 2818425593,2818457602,2818474022,458178641, 2818491707,8700589, 2818535859,2818732468,2818802114,2818834508,2818867206,2818883625,2818901321,2818957602,112459797, - 2819014668,2819031069,370720808, 2819047436,2819063818,258441237, 2819080647,999063567, 2819142069,2819229194,2819276816,1390690314,2819297515,436717887, 950566933, - 2819345063,2819393072,2819434343,2819486134,56426515, 2819522582,2819538975,2819555334,2190360597,2819572830,2819621466,2819654120,268435458, 2819697137,673579046, + 2818113612,2818146763,2818196649,2818228226,2802860058,2818245726,51757066, 56426536, 2818306482,648331280, 2818359322,2818375983,1058586664,2818408460,370720770, + 2818425593,2818457602,2818474022,458178641, 2818491707,8700589, 2818535859,2818732468,2818802114,2818834508,2818867206,2818883625,2818901321,2818957602,112459797, + 2819014668,2819031069,370720808, 2819047436,2819063818,258441237, 2819080647,999063567, 2819142069,2819229194,2819276816,1390690314,2819297515,436717887, 950566933, + 2819345063,2819393072,2819434343,2819486134,56426515, 2819522582,2819538975,2819555334,2190360597,2819572830,2819621466,2819654120,268435458, 2819697137,673579046, 2819735573,2819751942,2819768331,2819784706,2819801098,97681446, 2819819188,2819912119,1391788047,2819949145,2819981331,2190622741,2820010424,2820112608,2820145173, 2808692738,843071519, 2820161555,2820177932,2820194310,2814754822,2820214920,2820243482,1378910265,479330320, 2820264072,2820292750,2820325407,980402182, 2820342374, - 2820374540,347144211, 2816000002,130580496, 2820391442,2820518329,309559338, 2820572458,2820633018,354779138, 2429714448,2820751401,2820767785,653197343, 3162124, + 2820374540,347144211, 2816000002,130580496, 2820391442,2820518329,309559338, 2820572458,2820633018,354779138, 2429714448,2820751401,2820767785,653197343, 3162124, 2820784431,2802860042,2820829627,2820927932,2820964371,2820980758,2820997179,2821030828,2821099303,713064454, 2821144628,2821177365,948502533, 2821194087,2821227021, 2821276185,2821341210,2821358039,2821391145,2821423419,33783810, 2821456781,2821550397,2821603426,2821636205,2821668955,2821703794,2821783590,2821799967,2821816330, 147816490, 48021533, 2821832757,2821866470,2821898543,2821931039,2094235660,2821947468,392348172, 2821992893,2822356999,2822373394,20234266, 2822393963,2822438934, 2822455332,2822471682,19267620, 2822488095,2822504454,180207638, 518291487, 2822520862,2822553631,1901740042,2822570584,2822602792,2822620150,2822657262,2822750250, 2822766618,695910484, 2822783060,2822815851,1502101514,2822851777,2822897690,2188886018,2822914585,2822980520,576225337, 2823014719,2823045559,938246165, 2823077944, - 2823111086,2823161042,116277269, 4998673, 2823195131,46874650, 94502953, 2823259166,2823291790,2823357324,2823418302,2823473345,2823520258,2823536646,649314310, + 2823111086,2823161042,116277269, 4998673, 2823195131,46874650, 94502953, 2823259166,2823291790,2823357324,2823418302,2823473345,2823520258,2823536646,649314310, 2823553080,2823585834,2823602198,2823618644,2823651865,802471978, 2823720848,2823766100,2823811519,2009350165,2823979073,49741933, 2824028302,2824073664,2824155585, - 115721713, 2824275053,2824306714,2824323156,2824355852,2824372650,415776794, 2824405007,32636930, 2824421835,2824471288,2824503380,2824548802,2824925635,112607733, + 115721713, 2824275053,2824306714,2824323156,2824355852,2824372650,415776794, 2824405007,32636930, 2824421835,2824471288,2824503380,2824548802,2824925635,112607733, 2825056708,2825125909,110248012, 2825142718,2825220549,2825302470,2825417159,2825487299,524353558, 2825535943,4947978, 2825597384,1677710174,2825667054,2825699470, 2825733487,2825799224,2825875913,1200144862,751353915, 1901653, 2826043451,2826077137,2826125783,2826158101,2826174476,2826194081,147243067, 2826227072,2826275780, 2826322845,4947978, 2826409871,2826469388,47235082, 2826485800,2826502645,2826547658,163545154, 2826602034,2826667194,177094658, 5309941, 2826711499,2826816668, @@ -5264,51 +5259,51 @@ static const unsigned int DictNodes[84251] = 2828370599,2828405204,2828446298,29884456, 2828517978,2828550251,2828583618,336396444, 69156996, 2828634088,3246266, 2828693971,2828753902,692413955, 2828825044, 2828927073,133579191, 2828992943,2829038037,2829090853,2829107228,2829123586,2829140006,2228731942,2829157449,984121803, 2829201878,2829496791,2232189044,2829562328, 2281865255,2829632368,2829680655,1769587, 2829709785,1119600659,2829762601,157761572, 2829779035,2829811743,2829829528,2829878601,2829939162,581206056, 2829975574, - 2829991977,151764994, 2830008959,25673858, 2830041154,2830073875,1739685928,2830092461,2830155786,2830172176,191414283, 2830189969,2830254190,2830286850,500498469, - 2830304246,2830342256,900677639, 2830435151,2830468187,63406102, 2830499881,2830516262,2830533061,2830565397,157646877, 2830582607,2830627291,2830712863,8978443, + 2829991977,151764994, 2830008959,25673858, 2830041154,2830073875,1739685928,2830092461,2830155786,2830172176,191414283, 2830189969,2830254190,2830286850,500498469, + 2830304246,2830342256,900677639, 2830435151,2830468187,63406102, 2830499881,2830516262,2830533061,2830565397,157646877, 2830582607,2830627291,2830712863,8978443, 2830730842,2830763610,2830796029,66815229, 2830840284,2830893094,326369389, 33783813, 2830909466,2830925860,150913030, 2830942234,2830958630,1212548, 2830975429, - 2831007773,2831024131,2055897119,2831053277,2831102430,675168278, 127336458, 2831200735,2831302668,2831319077,2831335899,1584447494,243449937, 1986183190,506773937, + 2831007773,2831024131,2055897119,2831053277,2831102430,675168278, 127336458, 2831200735,2831302668,2831319077,2831335899,1584447494,243449937, 1986183190,506773937, 2831368294,2831401831,401835425, 2831925279,17809528, 2831941655,8175645, 2831958025,2831974537,2232320134,2831990900,737902603, 2832417813,2832478690,2832600900, - 2832663159,518783894, 2832695362,2832728929,2832761942,2832810010,2832826455,2832876381,2832908298,2832925131,2832974837,2833039386,500711436, 2833055746,347635769, + 2832663159,518783894, 2832695362,2832728929,2832761942,2832810010,2832826455,2832876381,2832908298,2832925131,2832974837,2833039386,500711436, 2833055746,347635769, 2833072365,2833110494,298860649, 2833236075,2833273910,2833330659,2833367170,14352514, 1941585922,2305343547,159432733, 241156213, 2833384476,2833416194,2833432586, 821805075, 2833448962,1129381917,2833478116,2833615702,2833661962,451477506, 2833678402,2833711163,2833743924,2833777815,2833827678,2833904101,2834006253,2834040297, - 2834087995,2834120714,148062839, 2834137155,2834219019,1505706000,2834235394,2834251787,618446888, 2834276368,2834321287,2834366466,2834382905,2834399535,319832288, + 2834087995,2834120714,148062839, 2834137155,2834219019,1505706000,2834235394,2834251787,618446888, 2834276368,2834321287,2834366466,2834382905,2834399535,319832288, 2834432066,2834477542,2834563098,2834579458,2834595897,86638632, 2834612226,6602788, 2834628610,246087716, 2834657767,1796899287,2834739688,2835034601,2835136558, 131842272, 2835193513,2835234919,78544922, 2835317273,2835395050,2835464334,124862823, 237731855, 2835497017,2835513375,2835529787,2835563945,1952776223,2835608043, - 2835742751,2835759123,1514094613,2835788268,2835874710,2835923003,2835956567,2835988926,2836055209,2836090046,2836194709,297386065, 2836254908,2836361709,600277206, + 2835742751,2835759123,1514094613,2835788268,2835874710,2835923003,2835956567,2835988926,2836055209,2836090046,2836194709,297386065, 2836254908,2836361709,600277206, 359612417, 2836473081,285343886, 2836512827,2836558318,2836676618,711671829, 2836693059,2836776601,2836824076,168398837, 2836841862,1941110810,2836906909,2837000687, - 2837069846,1900429340,2837086292,147062876, 2837119736,2837153770,166068712, 2837213680,2837381423,1348157898,2837415470,467960847, 2837475825,2837541362,126271595, + 2837069846,1900429340,2837086292,147062876, 2837119736,2837153770,166068712, 2837213680,2837381423,1348157898,2837415470,467960847, 2837475825,2837541362,126271595, 2837616294,2837659735,2837721587,2837807951,2837839874,2837856282,2837872642,118210591, 1079705666,2837889090,2837922251,2568110840,2837971041,2838037015,2838082036, 2838118415,1407926284,2838134830,1817052050,2838196725,1302265866,3916211, 2838254153,2838315034,2838331929,2838802934,935053172, 2838987656,2839035925,2761507248, 2839053300,2839101466,373981200, 2839117856,1292091397,2839153061,2839199773,548552706, 1863942150,2839216352,234979340, 2839249391,2839294455,2839392760,2839495232, - 2839527445,2839543830,2839560232,2719780, 66158604, 51068956, 2839576578,2839592986,2839609794,2839651197,2839691329,2839740435,46120997, 2839758169,252299846, + 2839527445,2839543830,2839560232,2719780, 66158604, 51068956, 2839576578,2839592986,2839609794,2839651197,2839691329,2839740435,46120997, 2839758169,252299846, 2839789667,2839825424,2839937035,3538959, 2839953474,2839990261,6374138, 2840031737,1954906171,179503130, 2840104836,2840228346,392544282, 2840314766,2840383238, 2614116354,2840441339,2840691806,113836074, 2840740143,2840772634,2840789295,2840822063,2840855464,2840887380,367443994, 2840932860,32849939, 2840971894,2841034778, - 2841051178,113246687, 2841067955,56557608, 2841113085,2359349, 2841429311,3227729, 2841494313,2264498188,2841526575,2841561274,2841594889,2841657776,283197469, + 2841051178,113246687, 2841067955,56557608, 2841113085,2359349, 2841429311,3227729, 2841494313,2264498188,2841526575,2841561274,2841594889,2841657776,283197469, 2841702910,2841755732,2841789532,2841838105,2841904331,2841935918,2359394, 2841985625,634896686, 2842018094,7962640, 2842052001,22888464, 2842101828,2842148886, 2842165294,2842215247,2842247227,385597521, 258637864, 2842279990,2842312785,310591580, 2842345578,2842433943,17842936, 506429677, 2842497105,71188482, 2842542369, 2842574878,1042808844,2842609429,1651621898,2842685951,2842755164,2842787899,2842820716,177341889, 2842856154,2842915328,2843000919,2843051426,2843104971,2843166015, 2843230247,2843270765,2843328522,2843345375,2843380120,2843456001,2843676627,1488289829,2843721816,2843754605,140248138, 352239655, 179503125, 2843787566,2843820038, 261193734, 2843840388,170197752, 2843951593,1043530894,258637852, 2844000337,2844045826,2844105374,2844135827,1031471130,2844182073,2844291587,725909525, 2844389892, 2844442650,1296187398,373800998, 2844471813,2844557807,2844602886,2844737970,2844771788,2844813395,2844852245,115720619, 2844868713,2844914183,470712358, 2845033048, - 1508311080,2845065283,2845147147,1069057147,66158632, 2845164280,1563967494,271384588, 1069056050,2845196348,2845279865,2845328543,2845372936,2845425717,261193785, - 2845459286,110215468, 1461503616,285346295, 2845508043,2845559172,2845622301,2845638685,2845655078,2845671436,1808596998,2845687868,2845782537,2845851669,412155963, - 2845869672,19252782, 2845934001,2845979146,2846050951,505380885, 2846113883,2846159371,1055801375,2781216867,2846310839,2846343297,879525972, 2846375968,465551414, + 1508311080,2845065283,2845147147,1069057147,66158632, 2845164280,1563967494,271384588, 1069056050,2845196348,2845279865,2845328543,2845372936,2845425717,261193785, + 2845459286,110215468, 1461503616,285346295, 2845508043,2845559172,2845622301,2845638685,2845655078,2845671436,1808596998,2845687868,2845782537,2845851669,412155963, + 2845869672,19252782, 2845934001,2845979146,2846050951,505380885, 2846113883,2846159371,1055801375,2781216867,2846310839,2846343297,879525972, 2846375968,465551414, 2465415254,2846410420,175734805, 2846492863,1488289807,2846523408,2846539792,45776902, 2846556200,2846572575,362201094, 2846593465,2846654516,2846687259,2846732812, - 2846871220,2846933057,2846983580,1560543834,6209572, 2847037117,2847098457,2847146560,449871910, 113836053, 2847178783,153997669, 2847196175,145145872, 2999305, + 2846871220,2846933057,2846983580,1560543834,6209572, 2847037117,2847098457,2847146560,449871910, 113836053, 2847178783,153997669, 2847196175,145145872, 2999305, 2847245406,2847293452,2847309834,2847335012,2847375444,2847408184,2839478283,2847442516,2847542483,432308230, 924549146, 2847588953,2847621179,2847656422,2847686744, 7307285, 2847719458,2847834150,2847851072,2847883276,2847899658,2847916060,550371368, 2847932497,2847965213,2847981590,273252392, 2847998018,138232241, 2848031218, 2848079909,2848096322,2848129050,2848145430,657899586, 2690138114,2848167593,2848279731,2848327617,2848374790,2848391180,2848407562,166543382, 2848431381,2848490232, 2848523273,2848556561,1629208588,2848587806,2848633357,2848702506,2556297218,2848718932,2848751642,2848768012,2848784390,2848800783,79511564, 2848817598,2848882698, 2848899104,172638635, 2848932687,2848964661,2848997851,2849030184,2849046540,2849066241,2849095764,2849141262,2849468943,520094658, 2849588830,157499480, 1322811473, - 2849686926,2849752217,110248038, 2849801367,2849853608,2849901123,2849949203,2850042384,2850161102,2850209819,2850242598,1067188255,156566135, 2850269017,122814466, - 2850342217,1319256083,2850390075,6619607, 2549449640,2850428628,2850521117,1031143440,2850540093,150667280, 136986630, 549700426, 2850619432,2850635788,5328129, + 2849686926,2849752217,110248038, 2849801367,2849853608,2849901123,2849949203,2850042384,2850161102,2850209819,2850242598,1067188255,156566135, 2850269017,122814466, + 2850342217,1319256083,2850390075,6619607, 2549449640,2850428628,2850521117,1031143440,2850540093,150667280, 136986630, 549700426, 2850619432,2850635788,5328129, 2850652697,1888436226,2850718197,2850751335,1816707082,2850786314,2850849227,2850910737,2851189266,56131615, 2851274989,2851307951,2851340721,2851373068,2851389478, 312197422, 2851405862,2851422511,2851467795,2851536917,2851553296,115179531, 2851575089,2851635238,2851651690,19255653, 2851746324,2851852450,2851881197,2851913730, 2851930141,356925556, 2851959317,2852012048,2852028426,2852044806,2852061205,2852077594,514883615, 277856287, 2852093978,2852110348,208158726, 2304344104,2852126780, 2852214887,2852258724,2852319766,440582225, 2852401687,2852522413,2852569114,2852598296,151076880, 2852634626,151093258, 2852651037,2852667404,115523641, 2852688860, 46039078, 2852814874,6717456, 2852831251,2852847618,146489354, 2702262310,2852864066,2852898090,6029353, 112312357, 2852958745,119636027, 2637862, 2853110878, - 2853158969,2853175327,2853191718,756301862, 2853208123,2853240854,2853258247,2853332636,2853371959,2853441872,2853487022,2853535763,210633280, 2853564954,6701094, + 2853158969,2853175327,2853191718,756301862, 2853208123,2853240854,2853258247,2853332636,2853371959,2853441872,2853487022,2853535763,210633280, 2853564954,6701094, 2853663259,2853716099,2853732501,2853765897,2195690, 8401436, 2853864025,2853909021,2853997112,587956281, 2854040094,2854092837,151912489, 2854109213,2854125684, 7585814, 2854148648,2854209530,2854253087,2854322608,2854356115,2854387828,1026048002,2854404122,2854420519,17924125, 2854453550,836812807, 2854875681,2854978059, 1162117201,2855039522,2855141398,621183007, 297222182, 2855159942,2855207360,218611769, 2855317497,2855387737,2855421755,2855472091,2855563811,2855666986,1193509450, @@ -5325,94 +5320,94 @@ static const unsigned int DictNodes[84251] = 2862336769,1753130, 115720793, 3538980, 2862385338,2862428733,2862530992,2862564247,7143882, 2862615512,2862662765,2862694431,2862710822,1391542303,2862727713, 1764050722,2862786119,2862858262,2862874650,2862891014,2862908066,2862940172,2862956565,2862972954,899006495, 1063813132,1016315920,153714719, 2862989849,2863067710, 2863137801,728892691, 2863170073,2863235082,591609885, 2863255418,220774499, 2863318046,2863354565,2863415315,121110559, 2863432513,2863464985,2863542847,2863608384, - 2863678390,2863747618,2863837761,2863891310,185319430, 2863958431,2864005158,987709442, 2864023097,2864120720,2864154692,2864201809,2864247362,2864362051,162548544, + 2863678390,2863747618,2863837761,2863891310,185319430, 2863958431,2864005158,987709442, 2864023097,2864120720,2864154692,2864201809,2864247362,2864362051,162548544, 2864442042,54984720, 307298314, 2864497866,309575692, 890945538, 2864558660,2864640581,2864676890,2864693250,345836116, 2864722502,2864775214,207520177, 2864825987, 366789210, 2864889902,2864939046,2864955413,2864971816,2864988170,2865004586,2865020934,2865037354,2865053708,2865070091,2865086476,2865102879,160530442, 2865132103, 2865233936,2865250320,2865266717,84934684, 2865295944,229965862, 2865480527,2865514982,2865556898,368230412, 2865595308,2865660299,2865692698,915639680, 2865709115, 316459494, 2865754697,8391459, 2865876186,2865922114,229965881, 2865954831,113229850, 2865984074,2866118738,2866151961,2866216970,2078523394,2866233410,2866278987, - 2222573041,2866364470,760938558, 2866397643,2866447658,2866495803,2866528363,2866561061,2866577424,58802191, 2866606668,2866823300,118653058, 2866841828,784990230, - 2866901581,2867065422,157646884, 2867120529,2867167289,2867183657,714244118, 2867200535,581304339, 157646851, 2867234594,45137956, 2867265968,2867298332,28147727, + 2222573041,2866364470,760938558, 2866397643,2866447658,2866495803,2866528363,2866561061,2866577424,58802191, 2866606668,2866823300,118653058, 2866841828,784990230, + 2866901581,2867065422,157646884, 2867120529,2867167289,2867183657,714244118, 2867200535,581304339, 157646851, 2867234594,45137956, 2867265968,2867298332,28147727, 2867315470,2867347478,2316435484,1371848725,2867374641,2867429507,2867446018,2867491407,2867545121,2867576868,2867593227,96190490, 2867622480,766672898, 2867642408, 2867658793,2867675155,90112026, 2867704401,2867773477,48480267, 2867789846,17448966, 2867808417,2867838995,477937690, 2867855401,2867871746,7634985, 2867901010, 2867953692,2867970099,2868015699,2195753, 2868101161,2829713434,2868118919,2868150388,2868166736,2868203638,187744275, 2868249030,419070068, 2868289348,2868330533, 2868359764,2868425301,2795995178,2868559913,2868576298,2868592681,29334494, 59801641, 2868609030,2868625445,2868641833,2868658198,3375145, 2868674678,1429176346, - 2868708302,2868740137,2868756502,2868772892,1371897892,2868789269,55050259, 2868818518,2868887570,2868903973,31342724, 15482902, 2868920360,2868936714,8401495, - 2868953220,2868969490,1022541864,2868998744,2869424730,2869625432,1899429900,320946627, 2869665227,2869736027,2869806055,545472554, 2869867100,2869952571,3244131, - 295944232, 2869985583,2870019619,2870067222,2870083600,130433034, 2870100055,958775322, 2870162013,2870329370,2870346648,2870394964,2870429068,2870513394,525058107, - 2870575158,2870607908,2870624295,2870657456,2870689821,1053556793,2870706182,638484486, 2870724437,27328543, 2870788573,2870820870,2870837279,2870853653,165494824, + 2868708302,2868740137,2868756502,2868772892,1371897892,2868789269,55050259, 2868818518,2868887570,2868903973,31342724, 15482902, 2868920360,2868936714,8401495, + 2868953220,2868969490,1022541864,2868998744,2869424730,2869625432,1899429900,320946627, 2869665227,2869736027,2869806055,545472554, 2869867100,2869952571,3244131, + 295944232, 2869985583,2870019619,2870067222,2870083600,130433034, 2870100055,958775322, 2870162013,2870329370,2870346648,2870394964,2870429068,2870513394,525058107, + 2870575158,2870607908,2870624295,2870657456,2870689821,1053556793,2870706182,638484486, 2870724437,27328543, 2870788573,2870820870,2870837279,2870853653,165494824, 2870882910,2870968418,2871003317,129876022, 2871059202,2871125508,2871181323,2871199064,2871247657,2871292511,2871390816,2871477622,1338785794,2871526339,2871587425, 2871784034,2871886688,29900828, 2871964259,2872046180,2872149120,2872197126,86327302, 2872213514,2872229929,2872246284,2872262682,2872279052,916537354, 2872295566, 126287883, 2872328194,2872344591,753631254, 2872362291,128155663, 2872410543,1753359392,2872443310,2872492034,2872510379,2630369346,2872586853,113492728, 2872848998, - 2872914535,2872983611,1825128487,2873017167,2873061992,2873196978,1277952045,2873242217,2873344002,202047499, 2873373290,1665799195,2873458704,2873475082,27344927, - 2873504363,266190955, 139036053, 2873638999,2873688074,9535625, 2873705556,2873755410,2873802762,545882743, 2873819202,2873851950,2873901109,2873934113,867943531, + 2872914535,2872983611,1825128487,2873017167,2873061992,2873196978,1277952045,2873242217,2873344002,202047499, 2873373290,1665799195,2873458704,2873475082,27344927, + 2873504363,266190955, 139036053, 2873638999,2873688074,9535625, 2873705556,2873755410,2873802762,545882743, 2873819202,2873851950,2873901109,2873934113,867943531, 2873966645,2873999447,2874048564,2874081306,46350639, 2874110572,2874163503,2874196004,2874212354,2874230351,2874277931,2874310658,2163376170,2874337637,2874427548, 2874474754,2874507394,8389367, 2874524970,2874572810,2874589226,413647243, 2874605570,2874621963,2874638338,2874654749,2874671135,125796373, 2874687504,2874703898, 2874721692,1780839021,2874782318,2875011695,2875097217,191004801, 2875130350,2875162690,2875195408,223182854, 2875213310,2875277371,2875310164,2875342932,2875388528, 2875503217,2875794350,126599208, 2875867142,1266204691,2875885057,2875950174,150913035, 2875998220,2876014618,141656075, 2876031083,2876071228,2876142194,2876240499, - 751354129, 758087682, 2876293423,2876328203,2876387956,2876500413,128106508, 2876538892,1481427680,2876556200,2876588072,303611935, 2876617333,2876719135,141656106, + 751354129, 758087682, 2876293423,2876328203,2876387956,2876500413,128106508, 2876538892,1481427680,2876556200,2876588072,303611935, 2876617333,2876719135,141656106, 2876740070,2876785099,321847380, 2876833858,2876866579,948715532, 2876895862,703021082, 2877095938,2877112346,2877128733,52477968, 2877145090,86327322, 2877161531, 2123513955,2877194259,119881730, 46350625, 47251458, 2877223543,5308959, 2877292628,139034927, 2877326734,110052382, 2877403768,2877715065,2877784066,1763460625, - 2317893668,2877804889,2877867992,2877936716,467978014, 2877982225,525467688, 2878014550,2878066318,2878112033,1391411231,2878157434,2878288507,2878390326,176504889, + 2317893668,2877804889,2877867992,2877936716,467978014, 2877982225,525467688, 2878014550,2878066318,2878112033,1391411231,2878157434,2878288507,2878390326,176504889, 2878423472,443138665, 2878465966,2878504986,2878521346,258097181, 2878537744,611450920, 2878554158,2878604989,147341354, 246563576, 2878686856,51871746, 2878747260, 2878783555,2878869956,2878931000,2878964343,5345632, 1435511226,2878996951,2879030505,2879078410,111132691, 2879107709,2879193094,246087686, 2879209498,2879238782, 2879386239,2879582848,2879651856,2879668234,1128972309,2195944, 2879687920,46530589, 79757331, 2879750681,563347485, 2879817076,316293186, 2879871741,2879933252, 2879995962,2880045087,51494951, 2880062487,2880110676,2880143961,2880177956,2880238209,2880324693,2880356379,2880389597,2880422735,5341815, 2880467586,2880536598, 2880553000,152518666, 2880582275,2880811652,2880880662,1715568642,149159963, 2880897561,2880962586,1693434378,2880988103,2881061335,2881093653,2881111308,2881169885, - 2881235961,760954987, 2881290477,2881323065,2881339394,2881355802,124403741, 2881385093,1812267024,2881454090,2881471731,2881520541,2881602167,2881635151,55525810, + 2881235961,760954987, 2881290477,2881323065,2881339394,2881355802,124403741, 2881385093,1812267024,2881454090,2881471731,2881520541,2881602167,2881635151,55525810, 2881680006,2881749002,2881765386,389185538, 2881782407,2881831437,2881880066,2881896486,2881914200,2881962896,2881994754,593117210, 2882011138,2882027530,2882043906, - 300105749, 2882073223,2882237064,2882372344,2882406899,2882515593,2882597514,2882646667,2882765736,2882797998,163731239, 45760528, 2882859660,700858408, 948011024, - 2882928733,263536671, 2882979385,740065296, 2883081458,727215161, 2882912277,2883158123,2883190850,220662448, 2883224599,2883278062,2883383949,271810626, 124863095, + 300105749, 2882073223,2882237064,2882372344,2882406899,2882515593,2882597514,2882646667,2882765736,2882797998,163731239, 45760528, 2882859660,700858408, 948011024, + 2882928733,263536671, 2882979385,740065296, 2883081458,727215161, 2882912277,2883158123,2883190850,220662448, 2883224599,2883278062,2883383949,271810626, 124863095, 2883498638,2883584002,1701937162,369329327, 2883600438,2883646095,2883797002,8614544, 166069278, 2883813435,1960771620,2883859089,2883977242,131334666, 2883993602, 2884014402,2884059162,166199380, 2884075579,2884108298,2884124674,604831786, 331677999, 2884154002,21151770, 2884259196,151896079, 1135149172,2884288628,2884304989, 2884354164,2332721174,2884383379,2884419620,2884436008,2359317, 513998876, 2884453696,2884485141,571768889, 2884501620,99876871, 2884530836,210042887, 2884567045, 2884583431,32456727, 2884599818,2884616213,2884632578,6946853, 2884661909,2884809366,2884894822,2839478301,2884940439,2885058818,2885091458,8614552, 2885107844, - 28819594, 2885137049,2885189634,2885206073,53690405, 2885222431,2885238810,2885256653,2885287993,170148785, 2885304358,2885320706,200524678, 2885337104,947732486, + 28819594, 2885137049,2885189634,2885206073,53690405, 2885222431,2885238810,2885256653,2885287993,170148785, 2885304358,2885320706,200524678, 2885337104,947732486, 2885353488,207439273, 2885372695,5342182, 309461471, 2885435444,373800966, 2885468244,121110531, 2885513882,2885550090,2885566500,1090879530,490881062, 2885972636, - 2886091774,2886139944,212844582, 2886160570,2886225538,2886270997,2886288336,2512175146,2886321139,2886336554,48381992, 30392358, 2886352937,2886369292,677724186, + 2886091774,2886139944,212844582, 2886160570,2886225538,2886270997,2886288336,2512175146,2886321139,2886336554,48381992, 30392358, 2886352937,2886369292,677724186, 2886398621,2886470959,2886510439,2886562462,540295180, 2886644383,2886696972,2886714104,4997322, 2886749819,2169487419,2886804985,2886894743,2886955680,2887041036, 51675142, 2718368163,2887057933,2887107969,2887168673,2887336002,2887381666,2887451848,169263142, 2887483695,1677787146,2887527547,2887581712,2887598109,2887614516, 2887660195,2887713932,2887761936,149913629, 2887791268,2888124557,2888171551,674709542, 2888187934,2888224591,2888269834,2888287055,2888319057,299813214, 2888351756, 2888368230,2888400980,2888434825,2888482848,2888515668,120242212, 2888556078,246464947, 2888610469,2888695915,425394647, 2888741542,2888787038,2888826892,2630451240, 2015234, 1948975106,2888856231,2888977074,2889040294,2889074466,645169154, 2889105467,2889138635,2889189485,2889249448,2889285884,2889318937,218611731, 2889396905, - 2889446058,2889548456,6374390, 2889589886,2889662530,2889695253,2889711675,2889744396,2889760794,2889778044,843907093, 2889826370,2889859156,2889904811,9925292, + 2889446058,2889548456,6374390, 2889589886,2889662530,2889695253,2889711675,2889744396,2889760794,2889778044,843907093, 2889826370,2889859156,2889904811,9925292, 195215391, 2890003117,2890220565,649314342, 2890268814,2890301547,2890334210,2890350632,455983114, 2890367279,277725194, 2890400653,2890481690,2890500861,2890547259, 2844344332,2890581363,2890612738,2890638019,2890694668,2890711078,2890727453,2130347, 2890756782,2890874902,2890891266,2890907659,2890924556,2890956822,2890973186, 45776933, 2890989570,2891007738,145145866, 1560084511,2891038804,2891071514,2891087888,2891104262,1475690527,2891120706,307593667, 2891153420,2891169821,2891186188, 868253722, 71483432, 2891215535,2891269491,2891300890,1098563615,2891317782,4685866, 2891350075,2891382824,2891399178,922599466, 2891415554,2044919850,2891444912, 2891513872,2891530256,2891559601,2891625138,2891661378,769426300, 2891694106,2891710476,52133925, 2891739827,2892008259,2892072928,242368550, 139035678, 2892120151, 2892170063,1702510598,2892202298,2892234798,2892288087,2892336059,19251512, 2892414998,486522911, 2892431444,5866867, 2892464139,4685835, 2892493492,2892546114, - 689800161, 2892580160,240844866, 2892611643,2892645112,1917037, 2892690101,2331050585,2601336886,2892859008,208502865, 2892906580,2892952246,5324847, 142835750, + 689800161, 2892580160,240844866, 2892611643,2892645112,1917037, 2892690101,2331050585,2601336886,2892859008,208502865, 2892906580,2892952246,5324847, 142835750, 49086475, 2893083319,2893156645,2893230776,2893267202,41959554, 77251154, 2893300622,451461229, 2893365300,2893398037,51920922, 2893418440,2893479978,2893496386, 2893542073,2893594677,2893627418,240699058, 1438842909,2893656762,30588964, 737902633, 2893692934,2893709314,2893725724,2893742118,2893758479,52215811, 2893787835, 2893902524,2893987921,2894022227,2894086163,27623918, 272156100, 2894115517,2894168074,52985875, 2894184514,2894217653,914063388, 2894261792,2894299178,2894315549, - 2894331916,73515018, 2894361278,2894414666,2894463005,892878850, 2894479823,152027147, 2894512165,2894528528,1490993190,2894557887,2894656192,2894692368,45531174, + 2894331916,73515018, 2894361278,2894414666,2894463005,892878850, 2894479823,152027147, 2894512165,2894528528,1490993190,2894557887,2894656192,2894692368,45531174, 2894708738,2894725126,2894741514,1451556876,1022541845,2894770881,2894897926,2894938133,229720102, 183369765, 2795896844,2894954606,2894987289,714244101, 2895020053, 2895036454,17842226, 2895052822,2895069300,40927241, 8142979, 2895085609,2895102378,2895134836,84394021, 2895164098,429277221, 4964390, 2895331349,1797685260, 2895347820,2895380518,2895396876,84934667, 2895414321,2895495206,425367667, 2895511609,2895528239,2895573699,2895708162,2895729659,2895773712,4702290, 1067171906, - 2895790092,2895806490,1386332162,993608281, 2895824192,2890366978,2895856791,2895904797,2895921193,2895937651,933919, 2895953977,2895970978,2896003129,66814265, + 2895790092,2895806490,1386332162,993608281, 2895824192,2890366978,2895856791,2895904797,2895921193,2895937651,933919, 2895953977,2895970978,2896003129,66814265, 2896032452,2896085122,2896101394,2896117771,2129929, 2896134146,973799430, 2896163525,2896298418,2869624854,409010192, 2896330795,2896363556,2896379906,2896396298, 2896412693,2896429078,2376220703,2896445556,2896461834,2896478324,918470663, 2896494608,2896511607,303431682, 2897130183,2897199224,2897215525,1114232, 2897232247, 61259797, 2897277640,2897313815,2897330194,2897346692,2897363076,7602311, 2897379337,2897395717,2897412233,2897428485,2897444998,11059205, 2897461277,2897477670, - 2897494021,2897510405,2897526921,42270777, 2897543180,2897559686,2897575962,2897592435,10371093, 2897608746,57032722, 2897625222,2897641603,2897657971,8274055, + 2897494021,2897510405,2897526921,42270777, 2897543180,2897559686,2897575962,2897592435,10371093, 2897608746,57032722, 2897625222,2897641603,2897657971,8274055, 2897686094,2897723429,2897739779,402046985, 44646416, 2898178761,307236575, 1675183068,2898309834,2898379223,2898424523,2898575362,328073227, 2898604748,2898680772, - 1077149707,2898732184,2898776109,2898838412,2898886678,199066201, 2898903846,617496578, 113213480, 2898948813,2899176103,2899264663,2899314171,2899361832,127048350, + 1077149707,2898732184,2898776109,2898838412,2898886678,199066201, 2898903846,617496578, 113213480, 2898948813,2899176103,2899264663,2899314171,2899361832,127048350, 2899391182,115607118, 2899476567,163299760, 2899538639,2899608043,258637827, 44253186, 2899653328,2899756449,2899804170,2899820550,2899837362,2899882705,2900084846, - 1866645510,2900152170,2900243154,2900336391,292765752, 2900426806,2900459546,110233266, 2900475914,2900492340,2900525140,997179413, 2900557836,2900574214,18399247, + 1866645510,2900152170,2900243154,2900336391,292765752, 2900426806,2900459546,110233266, 2900475914,2900492340,2900525140,997179413, 2900557836,2900574214,18399247, 2900603603,459046914, 2900804118,58802216, 2900836354,2900852764,164413471, 2900869634,173490710, 2900914900,2901016683,397230091, 2901049779,2901082124,2901099494, 2901144277,2901344268,336790558, 2901360943,2901393474,2901439190,2901540890,2901557250,117751818, 2901573651,2901590032,2901606421,116883944, 2901622868,2901655605, 2901691179,2901770296,2901804218,2901848791,2902027679,2902081567,46645258, 2902098875,2902163510,63816863, 2902199312,2902323928,2902376450,350142500, 2902405849, 2902556688,2902573058,1326415898,2902590320,149667878, 2902639038,5832735, 2902704184,2903119526,2903167369,2903257818,2903323355,2903393364,2541618023,2903454428, 2903626208,272351258, 2903707259,2903752750,2903814877,2903883836,128457374, 2903978718,2904060639,1493499925,2904195098,2904211468,706102281, 2904240864,2904322785, 2904506396,1030193454,2904524858,1459139298,2904589321,2904621119,2904654048,52363285, 2904686594,2904702986,18890867, 2904722114,166232086, 2904781539,2905043684, - 2905165779,2905212106,2823176202,2905273061,2905384423,2905440286,2905473499,1040531494,2905511363,2905587754,2905617126,2905669634,4177926, 2905699047,150569905, + 2905165779,2905212106,2823176202,2905273061,2905384423,2905440286,2905473499,1040531494,2905511363,2905587754,2905617126,2905669634,4177926, 2905699047,150569905, 2905784322,322715663, 2905801548,2905849882,245301260, 2905868091,2905915993,598851638, 2905948225,7013525, 2906010344,2906128406,810876930, 10649659, 2906149928, 16597229, 2906223337,2906358937,2906406971,2906452714,2906518251,2906570798,2906620004,301236230, 2906652975,2906685870,49790997, 831635914, 2906747628,2906866816, - 113836035, 2906921765,2906980362,71188496, 2907009773,2907303611,342065425, 2907343642,2907423480,2907456398,1663254594,2907523094,2907599598,2907701355,764330091, + 113836035, 2906921765,2906980362,71188496, 2907009773,2907303611,342065425, 2907343642,2907423480,2907456398,1663254594,2907523094,2907599598,2907701355,764330091, 2907734072,2907770926,147407608, 2907849163,36405719, 2907900287,2907976431,612532250, 2908041968,2908110904,2908145070,334151692, 2908304113,2776252431,2908422172, 2908438534,8995410, 2309996554,8994856, 169787402, 1152008258,2908465341,17809545, 2908517106,571326493, 2908882648,2908930087,2908975607,2909061227,2124578847, 2909094902,2834915, 2909128071,2909159854,2909208578,2909225001,452018197, 2909254387,112608705, 1113768029,164610050, 624051369, 2909405230,68230839, 2909455216, 3212170, 2909503910,2909549300,2909651481,2909716520,2730377222,2909733401,449871898, 2909798934,2909831252,338264075, 2909864949,2909931248,2909962285,2909995020, - 2910011418,2910027910,2359319, 2910044920,364446616, 2910089973,2910159162,44679178, 2910191703,2910243249,2910302966,2910352119,2910504123,2910553483,180437008, + 2910011418,2910027910,2359319, 2910044920,364446616, 2910089973,2910159162,44679178, 2910191703,2910243249,2910302966,2910352119,2910504123,2910553483,180437008, 2910602409,2910634047,2933350, 2910679800,2822619570,2910827257,2910946861,2910996501,2911040250,2911142376,2911175684,2911241561,2911272992,2911308186,2911389435, 2911449851,1098563596,2911531772,2911617558,1439990049,2152824858,2911649794,2911666187,6111260, 2911695613,4999724, 2911830319,191984382, 2911875839,2912026731, 2912059446,2912092519,52215839, 369623071, 2912126575,246562844, 2912187136,874349079, 2912469592,2912502074,2912534530,185810950, 110120484, 2912563969,1262141893, @@ -5422,9 +5417,9 @@ static const unsigned int DictNodes[84251] = 558579765, 1982660667,2914866216,396771628, 2914926608,2914944499,2914975831,2915025855,2915058123,2915107870,2915140915,2915188752,2915205136,48021545, 2915234570, 2915336258,48021535, 2915369807,2915401755,2915436160,2915483674,36652006, 1446641695,2915500491,2915550189,2915634626,2915680266,1459139339,2915700514,2915779024, 1891745820,500727820, 158220387, 2915840780,2916007958,88948752, 2916024814,554663957, 2916057100,2916073535,760955307, 613302356, 2916106242,141656085, 2916135693, - 2916250382,2916355629,514883594, 1090961448,2916401233,2916433976,1055408170,2916467289,2916501365,2916564994,271925258, 2326531, 2916582602,2916630843,741130276, - 2916676367,2916778006,1804337154,2916807440,2917056522,300584147, 683852585, 2917074200,2917138448,2917156300,6882167, 2917187668,2917220436,2917253130,262078493, - 2917270041,2917335147,2917368700,2917417813,2917466786,1350058831,2917507926,2917564442,87031839, 2917583556,2917613570,2917629967,2917646362,2917662751,6193209, + 2916250382,2916355629,514883594, 1090961448,2916401233,2916433976,1055408170,2916467289,2916501365,2916564994,271925258, 2326531, 2916582602,2916630843,741130276, + 2916676367,2916778006,1804337154,2916807440,2917056522,300584147, 683852585, 2917074200,2917138448,2917156300,6882167, 2917187668,2917220436,2917253130,262078493, + 2917270041,2917335147,2917368700,2917417813,2917466786,1350058831,2917507926,2917564442,87031839, 2917583556,2917613570,2917629967,2917646362,2917662751,6193209, 2917691029,2917741329,2917924882,933907, 2917941254,2917957661,2917974052,2359311, 2216247337,2917991287,2332590090,2918429459,2918614247,2918664576,2918728126, 2918794532,2918842420,2918875158,2918891952,116868072, 2918924304,2918940682,266777364, 2918970133,2919088346,9158793, 2919123540,2919170070,2919186498,2919219226, 2919248662,2919433839,2919481398,1637580838,2899330078,2919515018,2919546946,2919592727,2919859861,2919923796,2919956839,2919989274,2196825, 2920005686,2920038411, @@ -5435,7 +5430,7 @@ static const unsigned int DictNodes[84251] = 1917961, 2922087767,50987036, 2922135618,2922171857,2922230560,4997227, 2922381771,336052675, 2922430896,2922463258,2922479619,1097740, 2922497262,2922541857, 2922692667,2922738466,495534998, 2922840066,2922856879,2922902307,267077025, 2923168235,2923213604,1948778522,2923274129,2923381913,2923435825,825967816, 2923479066, 2923495430,527581205, 2923524901,4292715, 799572728, 2923627511,2923695605,2923790402,2923823116,118884835, 2923840884,2923888642,2923905043,2923921430,2923937813, - 2923954228,2923986972,489406466, 2924004436,2924063699,2924118059,2924163878,2924380685,2924429913,2924462139,2924494874,2924511264,2924544054,2924577227,220776931, + 2923954228,2923986972,489406466, 2924004436,2924063699,2924118059,2924163878,2924380685,2924429913,2924462139,2924494874,2924511264,2924544054,2924577227,220776931, 2933946, 2924625941,2924643422,2924694785,2924724290,2924761649,2924807709,2924872535,2924907554,2924983079,2925200586,2925249526,2925281373,2925343528,2925412884, 2925461585,2925494331,51068954, 2925527086,2925576867,2925625647,2925658122,2408469, 2925674537,1225768972,2925703977,2925789214,2925822059,2925856972,2925887553, 2925494284,351617052, 2925949738,2926039601,2926084455,2926118279,2926149644,901660698, 2926166031,641105961, 2926182412,2926198794,2926215621,2926261035,2926480393, @@ -5452,7 +5447,7 @@ static const unsigned int DictNodes[84251] = 2933424134,2933441007,1425227807,1232748651,2933474156,2933523576,2933568324,506971166, 2933653807,2933686873,639108046, 2933722001,2933818258,2933866555,2933899266, 55853096, 2933916495,2933949929,2933998027,2934047480,2934092613,2934158150,2934341685,1850802188,2934374426,2934391731,2934423554,209338380, 2934440239,2934479717, 2934534983,2934554636,2934571145,64831493, 2934764361,2934964261,2934981472,2935059274,2935112551,2935144450,234176533, 2935173963,2935254656,2935325819,2935357482, - 2935373826,2935390315,2935436108,2935518029,59228166, 2935583566,2935812943,2935931480,2935964519,2935996427,2936012802,2936029203,2936045570,523583526, 3227698, + 2935373826,2935390315,2935436108,2935518029,59228166, 2935583566,2935812943,2935931480,2935964519,2935996427,2936012802,2936029203,2936045570,523583526, 3227698, 1695724368,2936063083,1440628795,2936105479,296960601, 408059914, 2936143937,294436875, 2936196831,2936242188,2936260932,2936291350,2936307714,2936324117,2936340485, 2936356886,1605353474,59228163, 2936375237,2936419153,2936572185,2936648530,2936767009,2936828755,2936894292,2937094146,2937110627,2937143318,1902886914,1817626533, 2937172821,2509472222,2937320278,2937357543,2937418583,1053348604,2937539479,346456080, 2937598808,2937651627,306529103, 2937897451,2937940147,2937978905,2938017025, @@ -5460,53 +5455,53 @@ static const unsigned int DictNodes[84251] = 2938896443,2938929164,2938946296,411830046, 2938979745,2939027522,2939073375,2939142182,2939158544,226951173, 2939188064,2939470353,177341679, 2939507681,2939572760, 1012974169,2939617291,110215586, 2939646817,2939945015,389890919, 2940022739,140247654, 967753730, 2940092846,2940141628,2940228062,2940272693,2940305514,2940388199, 2940420138,2940436502,2940452885,2940470281,2940502100,2940535727,2940613474,636190722, 2940715522,353239124, 2940747778,112754719, 2940764244,2940801307,2940846382, - 2940878894,2940928760,2920923142,2940961929,2941010457,456724978, 2941075466,2530426922,2941091946,361185292, 2941178122,1050429782,865615882, 2941268835,6866369, + 2940878894,2940928760,2920923142,2940961929,2941010457,456724978, 2941075466,2530426922,2941091946,361185292, 2941178122,1050429782,865615882, 2941268835,6866369, 2941399908,2941485591,2941524128,2941567018,2941584584,539984175, 2941616194,2941652918,2941714513,719093763, 453017603, 2941760357,2941989734,1341243404,2942042155, 477085706, 2942074961,2942120807,2942173196,2942189570,2942205978,2512551957,2942222420,290471974, 2239004684,2942268264,2942337931,474399753, 2942415721,2942487581, 2942535279,2942582800,2942599208,2942615578,1247789085,2942634750,31424527, 2942677866,2942829304,2942874475,2942940012,144949269, 2942976012,29900806, 2943371700, 8389826, 2943434782,1520058414,2943474125,2943533137,2943565931,152191335, 1584250962,2943602099,2943713282,307298314, 2943742830,459046938, 2943857519,2944037744, 1481393075,2944155872,2116517910,2944195805,2944254154,2944286792,2944353490,933479287, 893501743, 141295627, 2944398193,2944614487,2944676722,2944725875,2944861970, - 2944916283,2944958490,630128652, 2944974860,1450459655,202309634, 2944991291,2945025376,343441420, 2945089541,2945107913,387235871, 2945168244,2945368596,319668331, + 2944916283,2944958490,630128652, 2944974860,1450459655,202309634, 2944991291,2945025376,343441420, 2945089541,2945107913,387235871, 2945168244,2945368596,319668331, 2945420370,2945499181,3228662, 2945545077,2945598617,173228054, 2945659766,2945712555,2945748844,2945807223,2945908801,148488211, 2945958318,2946007055,2946023440, 2946039846,443645958, 2946069368,2946157218,2946216825,2946315130,2946383894,118472716, 2946400284,612270383, 2946429819,2946544508,2946613260,291111011, 2946642813, 2946695255,2946744841,9175253, 2946790270,1528791056,2947023329,284966918, 872153391, 2947074732,706102193, 900040820, 2947186698,2947203495,2947253142,1234895287, - 2947301665,2947334154,730333667, 2947350540,2947367433,370524219, 2947399696,2947418133,2947451055,2947498015,1505624101,188958148, 2947527551,2947642240,188104767, + 2947301665,2947334154,730333667, 2947350540,2947367433,370524219, 2947399696,2947418133,2947451055,2947498015,1505624101,188958148, 2947527551,2947642240,188104767, 232997465, 363560976, 2948023198,2948055479,2948089559,2948186138,2948207054,2948253008,185417730, 164118554, 2948313986,334151692, 2948383713,1435107873,2948428675, - 4999637, 2948679144,2948727278,2948759634,8401796, 2948805509,2948907062,2948940822,2948992304,2949038181,2949072418,468322325, 2949120059,2949154121,262078474, + 4999637, 2948679144,2948727278,2948759634,8401796, 2948805509,2948907062,2948940822,2948992304,2949038181,2949072418,468322325, 2949120059,2949154121,262078474, 2949202767,3719643, 2949235663,2949283924,466993174, 2949316695,2949378950,2949480943,2949513265,44285974, 2949595243,2949627970,17842636, 2949661552,2949710361, - 2949775460,2949808139,2949826328,2949890527,2949922855,2949959594,2950042607,632717787, 2950104003,2950152198,2950169600,2950209438,2950263687,2950545439,6455416, + 2949775460,2949808139,2949826328,2949890527,2949922855,2949959594,2950042607,632717787, 2950104003,2950152198,2950169600,2950209438,2950263687,2950545439,6455416, 2950574984,1285701643,2950676532,805355959, 1761411156,2950709485,2950745851,2950804361,2950955014,355533227, 2950984586,2951053404,2951086927,2951118932,2951155835, 2951200855,2951263115,2951476108,2951541645,2951771022,2951872574,2951932286,2951989010,223363543, 2952036415,2952082319,175524790, 1917840, 2952169237,2952233067, 2952265823,55722003, 2952328080,2952413635,2952447941,2952491921,2952544322,2952590226,2952643485,1804206298,2952724584,2952781804,2952840364,2952888396,2904555530, 2952934291,2953084987,2953118218,108625949, 2953152480,2953200087,2953242415,2953343892,1241333786,2953445388,45432912, 2953469244,2953527355,298614822, 2953921689, 2953971007,268189795, 2954036285,2670602, 2954101169,2954134679,644907113, 2954182737,2954228630,1918267, 2954510478,2954556311,353796455, 2954625089,2954675431, - 2954723799,2954756641,2954805314,2954851224,2954915311,2954998681,2955064218,2955167111,283967519, 373604364, 2955198923,1736081515,2142748684,2915205146,129466380, + 2954723799,2954756641,2954805314,2954851224,2954915311,2954998681,2955064218,2955167111,283967519, 373604364, 2955198923,1736081515,2142748684,2915205146,129466380, 629637142, 2955260827,2955412682,1660682293,2955460750,2955493402,1814609949,2955509776,5505029, 2955526447,2955560719,2955610246,2955657282,8399349, 2955703196, 2955965341,2956036035,2956083212,1177239656,2956112798,2956149211,2956194719,2956279850,118669324, 2956309408,2956416482,2956506017,2956574725,798736396, 2956591116, - 2956620706,18399270, 2956705838,2956760710,2956850083,61456386, 2598537944,5325798, 184549407, 2956981156,2957066282,2957084617,2957131788,2957148223,39895049, + 2956620706,18399270, 2956705838,2956760710,2956850083,61456386, 2598537944,5325798, 184549407, 2956981156,2957066282,2957084617,2957131788,2957148223,39895049, 1835253762,2957181001,2957247311,2957292453,2957426742,110298265, 2957459502,2957508618,2957538214,2957669287,2957770778,2957800360,8401833, 2958032950,2958066519, 2958098516,2958131243,367443978, 2958163984,896516622, 2958180402,599343116, 2958214395,2958262302,1082769840,429834259, 2958295121,2958327901,2958390186,2123624228, 2958475294,2958508058,2958524485,130580520, 2958570411,2958770205,527057012, 2958799788,2958901314,2958934018,2958950415,412140618, 2958967279,2959012781,2959078318, - 848429068, 2959327832,292569190, 2959369245,2959409158,2959425567,152027146, 2959441974,2959487919,2959639203,2959687682,2959704083,1699348517,31490088, 266766848, - 2959726105,2959782832,2959935590,2959982602,1185742911,2959999030,2249719854,707919931, 2960031831,1561040769,2960080950,2960113669,2960130523,2960162911,49152003, - 2960222458,2960293910,2960310303,958038035, 2960339836,2960408995,2960441350,2960457747,2960474134,2960490498,2422898729,510361610, 2960509504,2960556058,266486693, - 297418788, 2960585649,2960884207,2960921668,2960978866,2961077171,2961260570,2961276987,2961309701,2961331673,2961404852,2961481672,2961555512,2961588278,669630502, + 848429068, 2959327832,292569190, 2959369245,2959409158,2959425567,152027146, 2959441974,2959487919,2959639203,2959687682,2959704083,1699348517,31490088, 266766848, + 2959726105,2959782832,2959935590,2959982602,1185742911,2959999030,2249719854,707919931, 2960031831,1561040769,2960080950,2960113669,2960130523,2960162911,49152003, + 2960222458,2960293910,2960310303,958038035, 2960339836,2960408995,2960441350,2960457747,2960474134,2960490498,2422898729,510361610, 2960509504,2960556058,266486693, + 297418788, 2960585649,2960884207,2960921668,2960978866,2961077171,2961260570,2961276987,2961309701,2961331673,2961404852,2961481672,2961555512,2961588278,669630502, 2961622185,2961653781,2961670228,2961703149,2535770676,2961735692,2961752585,2961784937,2961818033,2961863605,2962092982,501563398, 2962162117,2962197110,2962260443, 2962292757,2962309122,1818664, 1102053388,2962325741,2962360506,2962396078,2962456630,2962489410,154796131, 2962526351,2962571323,2962604044,889307222, 1284133904, 2962620437,2962636892,2962670027,2962718741,2962735116,2962751514,505380870, 2962767884,2962784727,6308143, 2962821243,2962879415,2962931738,2962948125,2962977720, 2963031226,2963065582,2963111955,1337229327,2963129512,2963190713,2963260310,150241311, 2963309053,2963359091,1572388866,2963403706,2963439916,344670641, 2963472415, - 1897349131,2963489083,2963521555,741326851, 2963537961,2963554346,4964486, 2963583931,5312629, 2963669034,2963685402,195264553, 2963701816,2963747772,2196087, - 8401853, 8391087, 2963881986,2963898371,77037700, 696075794, 2964304831,2964357201,2964390806,2964452288,2074477959,2964546547,1840971807,2964599745,382288632, - 2964714434,1177665617,1043120138,2964750560,2964784158,2964829123,2964930655,2964979758,2965030279,2965061644,281935883, 2965078035,2965094422,1281703974,800997388, - 2965111310,2965156804,2965258269,2965274664,476266524, 2965291039,2965310221,2037383187,2965377183,2965422617,2965487642,131891216, 2965517253,2965603465,488178511, + 1897349131,2963489083,2963521555,741326851, 2963537961,2963554346,4964486, 2963583931,5312629, 2963669034,2963685402,195264553, 2963701816,2963747772,2196087, + 8401853, 8391087, 2963881986,2963898371,77037700, 696075794, 2964304831,2964357201,2964390806,2964452288,2074477959,2964546547,1840971807,2964599745,382288632, + 2964714434,1177665617,1043120138,2964750560,2964784158,2964829123,2964930655,2964979758,2965030279,2965061644,281935883, 2965078035,2965094422,1281703974,800997388, + 2965111310,2965156804,2965258269,2965274664,476266524, 2965291039,2965310221,2037383187,2965377183,2965422617,2965487642,131891216, 2965517253,2965603465,488178511, 15073283, 1490714629,2965661587,2965713862,2966022476,2966067308,2966110238,2966143576,2966175756,246465007, 2966201351,2966269394,988971046, 2966336455,2966618521, 2966668216,2966719411,2966765611,367443989, 133710438, 2966798478,2966831106,16826379, 2966848521,2966881150,2966913108,2966948197,2966995957,2967062166,2967110157, 2967158786,1729020263,2967175605,2967207982,2967257093,2960130523,2967281359,2967425590,2967505163,2967552525,2967601162,126025770, 2967618167,2967650358,2967683082, 217235468, 508609430, 2967712712,2967781379,2967799595,755253260, 2967843785,154814950, 2967912460,2967929346,2967961622,1645068304,2967991242,2968060014,2968092738, - 2968126762,2968176066,2013741058,2968233674,2968302539,2968368076,294633475, 2968437888,2968486519,854900841, 2968518749,2968567837,2040414224,2968584587,338493445, + 2968126762,2968176066,2013741058,2968233674,2968302539,2968368076,294633475, 2968437888,2968486519,854900841, 2968518749,2968567837,2040414224,2968584587,338493445, 2408454, 2968630221,2968732728,2968797210,2968826830,115114076, 2968944683,2968978761,2969026644,794525734, 2969059873,1663746050,2969108939,348635152, 2969170895, 2969465808,2969763933,2969814825,2969912839,1409630234,1044791317,2969993748,2970045979,2970108784,2970158019,2970206968,110215707, 2970239989,2970317777,2970354627, - 2970402922,2970486805,2970518738,2970550318,2970599434,2970616242,2970648630,2970682687,2970750610,2970809298,340282205, 2970874835,45548034, 196608002, 404160528, + 2970402922,2970486805,2970518738,2970550318,2970599434,2970616242,2970648630,2970682687,2970750610,2970809298,340282205, 2970874835,45548034, 196608002, 404160528, 2970976686,2971025434,2971042790,2971075827,2971136980,2971175095,2971222047,155516940, 2971251669,2971516944,138232439, 2971546582,2971615324,4473592, 2971648847, 2971682190,1671480711,2971746320,2971762698,2971779114,2971795458,45760540, 2971813529,2971861046,2971893770,1644904470,2971910991,184680879, 1055408154,2971942918, 46776336, 2971959425,346707150, 2971997489,2972070871,2972271071,2972316632,260458768, 2972418585,2972486043,2972549146,109559849, 2972570475,2972627929,2972857306, @@ -5519,16 +5514,16 @@ static const unsigned int DictNodes[84251] = 8401903, 2976776213,2790342678,2976792684,2976838640,1993195522,2976904177,2976972899,2977018866,2977061534,5537807, 2977100787,2977188383,2977235010,2977270995, 2977330164,891633680, 2977416468,2977474562,2977516419,2977579020,2977595398,2977612721,2977657845,2977727940,392642589, 1149715107,2977772534,2977854455,2977956442, 2977991517,2978021492,242647082, 2978038812,2978070644,2978086923,9535519, 2978116600,72663052, 33177730, 2978432630,2978480140,19252254, 2978496534,2978512955, - 47087723, 125796381, 2978552928,2978627622,2978643980,2978660362,2323742725,1168588806,2978676853,2978709525,2425667596,2129963, 2978725909,1627389958,406028738, + 47087723, 125796381, 2978552928,2978627622,2978643980,2978660362,2323742725,1168588806,2978676853,2978709525,2425667596,2129963, 2978725909,1627389958,406028738, 2978745915,2978788345,1605353498,2978853882,2978906539,2978938906,2978955302,2978972566,1037714168,2979020815,2979037196,46891034, 2979066875,657145887, 2979197784, - 2979250188,242368523, 2979266570,2979282973,173113460, 2924069282,2979312636,2979382684,2979438199,2979479562,2979495978,37191836, 411632878, 2979512436,84574323, + 2979250188,242368523, 2979266570,2979282973,173113460, 2924069282,2979312636,2979382684,2979438199,2979479562,2979495978,37191836, 411632878, 2979512436,84574323, 2979542013,2979676378,1561985029,2979709020,2979741714,2979758087,641106050, 2979787774,2979872784,2979889168,69861507, 2979905843,2979951615,66814259, 2979989291, 2980020537,109215772, 2980066304,2980315192,2980347936,2980381559,2980414881,2980471562,2980544578,2980580189,2980623361,285344181, 143393639, 2980692050,2980725672, 1298908190,2980758945,1894226691,2980811638,2980906773,2980970603,2981016578,2981167583,353796206, 2142635624,126763609, 2981199928,2981232742,2981265495,2981314566, 600522784, 2981333708,2981414933,2261028, 2981448113,2981495863,2981527564,2981543946,2981560326,2981576726,14712834, 606470156, 2981606403,2982101015,2982117385, - 2982133781,8175631, 2982163460,2982199433,2982215814,2982232179,31801479, 2982248457,9207815, 2228748297,2982264966,231325727, 2982281331,2982297657,2523154, + 2982133781,8175631, 2982163460,2982199433,2982215814,2982232179,31801479, 2982248457,9207815, 2228748297,2982264966,231325727, 2982281331,2982297657,2523154, 2982313989,2982330373,2982346867,283361281, 2982363165,2975219719,2982379529,2982396020,2982412310,2982428694,52985896, 2982458373,2982576147,2982592524,2982608902, - 933894, 2982625291,2982641680,2982658088,2982674442,2982690858,2982707237,577650710, 2982723596,2982739983,912033276, 2982767989,109052961, 2982823904,193200159, + 933894, 2982625291,2982641680,2982658088,2982674442,2982690858,2982707237,577650710, 2982723596,2982739983,912033276, 2982767989,109052961, 2982823904,193200159, 2982871106,2982903810,2982921641,2982953423,2982985735,2983015430,16941191, 2983038351,2983100524,2983133778,49938439, 2983162887,2983247898,1482391593,2983264686, 47611941, 2983326728,2983396954,2983428112,2983445406,2983490569,122683399, 581353484, 2983556106,2983609374,137445388, 2983641975,1152172137,2983687179,2983867404, 2983932941,51675172, 2983998478,2130521, 2984050728,22478850, 1463779359,2984067138,2984113167,108315963, 162185259, 2984181862,2984214570,7307274, 2984230933, @@ -5538,16 +5533,16 @@ static const unsigned int DictNodes[84251] = 2985194519,2985296705,2985330956,1652818004,2985361434,2985377834,157827084, 420233247, 2985407504,2985456664,2985672917,1376220176,2985706161,2985738355,2985754739, 2985771013,2985787415,134791194, 2984329247,2985812243,2985845011,66822419, 2985882649,2985951241,2985967634,2985984002,16269353, 2986000438,2986034250,2986065942, 2986082388,2986115113,9535528, 2986138590,2986173395,2986213378,2986229765,23085057, 2986734619,240583416, 2986852362,2986868752,2986885125,2986901509,2986917910, - 2986934274,2986950677,2986967071,2986984231,2986999819,2987016198,2987032578,17006628, 2987048970,2987065373,2987081740,2987098138,2815754246,2987114533,89227304, + 2986934274,2986950677,2986967071,2986984231,2986999819,2987016198,2987032578,17006628, 2987048970,2987065373,2987081740,2987098138,2815754246,2987114533,89227304, 2987130892,254967818, 2987573917,2987635740,2987688872,2612969488,2987734045,1363804597,2987819029,2987835867,2987881502,285344504, 2987943713,2987996191,2988082037, 2988127264,2988192801,2988274283,235160566, 2988408891,50118662, 2988443507,2988474397,2736130, 2988504098,406047913, 2988655645,2988703770,307855417, 2988733475, 867794975, 2988867661,2988900390,168067084, 2988916758,2988933122,246087722, 2988962852,2989065112,2989126210,2989241381,2989421606,2989588523,2989621250,2989637850, 2989670703,162186204, 2989703705,2488123887,2989770071,124862548, 2989817872,2989834246,1342177320,2989850690,2989883408,10371082, 680869904, 149160043, 2989913127, 2990126120,2990194991,1372194269,2990230938,2990296765,2990388265,2990470186,2990535723,2990606132,2990696949,2990738507,603878444, 2990800953,2990817755,2990850679, 2990882888,2990949487,1770078229,302563762, 2990994477,2991063062,2991079455,2991095939,39043202, 2991125550,2991179204,2991210512,2168717369,290390092, 1566360006, - 2991226920,353094115, 2991256623,335790082, 2991473758,2991521845,2991567920,2991669678,414351400, 879740731, 2991721225,2991768947,2991800322,2991816761,246464617, + 2991226920,353094115, 2991256623,335790082, 2991473758,2991521845,2991567920,2991669678,414351400, 879740731, 2991721225,2991768947,2991800322,2991816761,246464617, 2991833625,202461541, 2991899167,2991961137,2992112630,308903967, 2992146861,2992193602,133414922, 2184200279,2992226330,2992242691,1964523532,2992272434,2992406612, - 2992446215,2992521792,2992553994,271925284, 2992573095,8391402, 2992632883,2992703011,2992763956,71188501, 158253140, 2992845877,2992914891,443088938, 265601053, + 2992446215,2992521792,2992553994,271925284, 2992573095,8391402, 2992632883,2992703011,2992763956,71188501, 158253140, 2992845877,2992914891,443088938, 265601053, 345473051, 2992964888,2993029213,546553942, 581091357, 2993085916,2993127434,2993157174,59884114, 1136328723,2993209381,2993225769,2993246325,2993274885,2993291321, 2993307674,2993324039,2621447, 2993341609,2993746999,2993910840,2993995857,2994041913,2994241559,42074135, 2994258378,2994290991,2994324892,2994385978,2994467899, 2994521247,323731970, 2994566204,44433410, 1521042367,2994621827,608796678, 2994667549,689799471, 2994684009,38387722, 2994716731,2994749461,2994765836,2994782234, @@ -5558,31 +5553,31 @@ static const unsigned int DictNodes[84251] = 2997338153,308871187, 2997354524,1049198632,2997370911,736509988, 2997387380,2997403685,115458069, 2997420062,2997452916,2997469621,2997515335,2997537237,2997569722, 2997600275,27627821, 2997618161,2997662792,2997699013,1154433065,59818118, 2997744713,2997796871,2997813276,33783845, 2997829661,2997846042,2997862402,2940747782, 2997878796,544047110, 124551170, 2997897237,2997928791,2997962288,2998006858,2998240415,116752422, 2998273893,2998321183,355585281, 19038210, 2998339434,2998372812, - 2998419532,2998456456,2998486407,1308000340,2998522157,2998551607,2998583318,131776596, 2998613067,21102729, 2998678604,151896090, 2998730771,2998747146,2752540, + 2998419532,2998456456,2998486407,1308000340,2998522157,2998551607,2998583318,131776596, 2998613067,21102729, 2998678604,151896090, 2998730771,2998747146,2752540, 2998763521,2998781872,2998812788,766951446, 2998829084,2998845477,1140047883,2998861864,40976425, 2998891597,72499335, 2998912128,2998960966,2998992915,2999009282, 2999025704,38879253, 2999046817,2999124956,2999157367,2999612495,2999661648,2999747500,2999812108,140247138, 2999829420,2999907409,2575663864,2999944215,3000005714, - 3000093449,3000140291,3000188930,2643050533,3000206695,3000270858,324091914, 3000287535,73744395, 3000320482,229654566, 3000431699,3000521286,3000582154,573128733, + 3000093449,3000140291,3000188930,2643050533,3000206695,3000270858,324091914, 3000287535,73744395, 3000320482,229654566, 3000431699,3000521286,3000582154,573128733, 3000599065,3000664166,849182972, 3000697309,3000742996,3000913200,3000972373,1482014957,3001070678,3001139254,3001185367,552402984, 3001234520,3001418615,3001463897, - 17220547, 1200291862,3001562202,3001659788,3001696287,3001726043,3001909551,3001942446,1926726512,3001991252,1225588822,3002023975,3002056747,3002089515,188089544, + 17220547, 1200291862,3001562202,3001659788,3001696287,3001726043,3001909551,3001942446,1926726512,3001991252,1225588822,3002023975,3002056747,3002089515,188089544, 3002135644,3002424315,3002499179,45498397, 3002532440,45039637, 3002578013,8978442, 25559122, 1055801346,1788002388,3002659934,3002791007,3002974289,2587263213, - 3003007075,3003039787,3003072518,108298268, 3003088980,3003121685,3003139166,3003187266,3003232754,3003301972,3003334715,3003367903,3003413600,3003514921,51593219, + 3003007075,3003039787,3003072518,108298268, 3003088980,3003121685,3003139166,3003187266,3003232754,3003301972,3003334715,3003367903,3003413600,3003514921,51593219, 3003531276,113115177, 3003551023,3003585793,3003629871,2493612042,1622409228,3003662352,3003692129,3003760913,3003805877,3003858954,3003875344,3003891723,3003908108, 502054952, 3003925327,1032208422,525156390, 3003957348,3003990058,1498791962,3004006428,3004022796,1475690553,3004052578,3004121093,3004137501,57262087, 1440253802, 3004153898,3004170256,3004189158,3004219423,9535499, 3004249187,3004385130,3004416002,5309865, 1200636046,3004445796,3004579847,3004596227,49938441, 3004615238, - 3004645417,3004661782,1135902836,3004678260,767033384, 3004694564,104759337, 3004711391,3004745996,8372225, 3004776564,818610233, 3004792873,3004809245,717226012, - 3004839013,3005186519,2162804, 3005232230,3005284373,2317795387,3005301215,3005334351,3005366278,1721958421,158711844, 3005396071,1466171434,3005448622,2621456, + 3004645417,3004661782,1135902836,3004678260,767033384, 3004694564,104759337, 3004711391,3004745996,8372225, 3004776564,818610233, 3004792873,3004809245,717226012, + 3004839013,3005186519,2162804, 3005232230,3005284373,2317795387,3005301215,3005334351,3005366278,1721958421,158711844, 3005396071,1466171434,3005448622,2621456, 3005497350,3005513766,3005530114,2530721849,758071298, 3005548612,3005595674,15482892, 3005612464,2659893277,3005645230,162185516, 124864372, 136118743, 3005694411, 49479701, 149131143, 3005747055,417317296, 3005822056,3006000789,3006038732,3006084201,3006166122,3006300182,1130627375,110724625, 3006319047,364447250, 3006365780, - 3006411883,2409234451,3006553551,3006602200,3006644366,193709616, 3006682417,3006744168,3006808074,1240843273,3006824469,91668492, 3006841129,3006873607,19447823, + 3006411883,2409234451,3006553551,3006602200,3006644366,193709616, 3006682417,3006744168,3006808074,1240843273,3006824469,91668492, 3006841129,3006873607,19447823, 3006890513,3006922771,3006939173,70729746, 3006968940,3007004698,3007021084,884555817, 3007037476,3007055356,3007088124,66815484, 81248265, 3007132781,3007178975, 3007201306,127483915, 3007689839,3007742089,3007758470,3007774835,3007804528,28488817, 3007823881,3007840275,3007856777,3007873081,3007889542,3007905820,3007922291, - 3007938570,3007955079,9535499, 3007971337,3007987715,3008004233,16269315, 3008020499,3008036874,3008053257,301727756, 532021258, 3008509042,3008640115,680771621, - 897304602, 3008714912,3008757844,3008790582,3008826308,3008872474,3008890642,3008945107,3009000564,3009085522,3009118220,1900563, 3009135086,3009167811,459980810, + 3007938570,3007955079,9535499, 3007971337,3007987715,3008004233,16269315, 3008020499,3008036874,3008053257,301727756, 532021258, 3008509042,3008640115,680771621, + 897304602, 3008714912,3008757844,3008790582,3008826308,3008872474,3008890642,3008945107,3009000564,3009085522,3009118220,1900563, 3009135086,3009167811,459980810, 3009213557,3009282074,3009309688,3009363970,115196325, 1852342298,3009382203,3009442934,2196871, 3009557623,3009593428,3009626196,3009672312,3009709858,3009754233, 3009806791,3009868922,3009999995,113983500, 3010084890,3010104216,3010150454,3010186163,3010245143,3010363478,3010403269,484803020, 3010465970,3010527285,3010560303, 3010593282,2021114535,3010638972,3010740283,260456907, 3010773076,2196262, 3010811252,3010868349,3010933886,3011073019,1080492034,3011117279,310297447, 3011149826, 198606869, 611450882, 3011168820,3011199249,1436336244,44941333, 133840906, 3011245183,3011441792,3011477807,3011512339,3011560945,77512735, 1816231976,1431880778, - 3011598276,3011741707,3011805210,3011822415,3011855245,3011937016,3011969885,1202848033,3012004228,3012067367,3012100180,3012132971,3012165661,3012182018,193249306, + 3011598276,3011741707,3011805210,3011822415,3011855245,3011937016,3011969885,1202848033,3012004228,3012067367,3012100180,3012132971,3012165661,3012182018,193249306, 3012198466,111149483, 3012233169,3012280750,176194167, 3012329931,3012379075,3012411859,1698463828,3012473985,3012739170,3012773504,397852682, 23855170, 3012834434, 3012886554,655851995, 3012904552,3012972901,823279618, 3013014659,3013087319,369279007, 3013137866,3013181486,238553652, 3013232941,175456287, 158646310, 3013293188, 3013444065,3013493273,3013558288,75300893, 3013577005,3013624785,3013673807,241664003, 805142531, 3013705794,3013738556,3013833861,361152543, 144098334, 3013870169, @@ -5603,1450 +5598,1450 @@ static const unsigned int DictNodes[84251] = 1563082764,3021665450,3021804398,3021850928,3021898640,3021933478,3021976747,3022025900,3022075053,32637043, 3022107822,2854027283,3022169908,3022209066,3022238895, 1414479894,3022304432,3022422961,3022454826,495288323, 3022471184,360005689, 3022487570,86753414, 3022503957,3022520336,2241675275,3022877874,1939589710,1992557066, 3022929932,3022947064,3022982694,3023063465,159727628, 3023101227,2500233641,3023151704,3023192074,298663948, 3023221939,3023405102,2298233592,3023467700,3023519837, - 3023574833,3023622322,3023683594,306955716, 3023713461,3023782519,46530619, 3023828150,3023893687,4997230, 319456093, 3023959224,238256131, 3024073913,447512587, + 3023574833,3023622322,3023683594,306955716, 3023713461,3023782519,46530619, 3023828150,3023893687,4997230, 319456093, 3023959224,238256131, 3024073913,447512587, 3024139450,3024274425,3024355344,25561720, 3024374120,3024486459,3024519974,3024551941,267501580, 1581499579,3024568332,3024585464,3024618426,1274363990,3024683018, 2801780, 3024712891,3024912443,306774455, 3024958652,3025027832,3025061352,68255831, 2204909625,3025109515,3025159511,3025207350,3025249962,3025319101,3025487238, 3025551882,68240822, 2208334678,3025597630,3025666648,3025698826,712900639, 3025716712,3025764847,3025798561,3025859775,698138683, 3025974464,875939268, 2076983599, - 3026033621,3026076087,3026108456,9207827, 3026124812,3026141190,3026157698,3026173964,173850681, 3026203701,3026272277,3026289804,3026337804,3026354292,72499331, - 3026370581,3026388955,286294057, 3026449601,3026555312,3026599967,3026616331,346488844, 2829713418,3026637308,103448633, 3026682370,3026714626,2785306, 82002036, + 3026033621,3026076087,3026108456,9207827, 3026124812,3026141190,3026157698,3026173964,173850681, 3026203701,3026272277,3026289804,3026337804,3026354292,72499331, + 3026370581,3026388955,286294057, 3026449601,3026555312,3026599967,3026616331,346488844, 2829713418,3026637308,103448633, 3026682370,3026714626,2785306, 82002036, 3026744514,3027061501,3027118624,3027173378,3027192482,3027252419,3027320870,3027340190,3027399876,27624617, 3027470608,3027530949,3027681339,5341283, 3027714058, 1736507431,3027743942,3027829167,1765031952,3027873285,3027927585,3027976198,3027992598,1721630757,3028022471,3028075405,3028158650,3028189210,922370132, 3028219080, - 3028320296,1930428454,3028350153,4145164, 3028501344,3028566952,464453638, 3028598786,3028615178,3028631573,3028647958,3028664332,2615853094,3028694218,280445873, + 3028320296,1930428454,3028350153,4145164, 3028501344,3028566952,464453638, 3028598786,3028615178,3028631573,3028647958,3028664332,2615853094,3028694218,280445873, 179716134, 3028911611,3028959535,3028992006,3029008405,3029024798,414695429, 3029057966,3029107934,3029156855,3029222263,118031183, 3029267659,130285590, 1238695990, 3029382348,3029418022,3029434390,1226801268,3029450809,2342917, 3029467252,3029483535,3029499926,3029516294,3029532708,3029549097,3029565575,3029581843,3029598229, 3029614623,377978921, 3029644493,3029712906,3029729396,1816002562,3029745766,1185776707,3029778461,1154400293,3029794947,8175747, 3029824718,1369325597,2326233110, - 3029955791,3030021328,3030040602,884765, 53936157, 3030056996,3030073384,13303814, 96436235, 1804238890,1426849908,3030091123,67485725, 3030122507,57262121, - 3030151677,3030466762,3030512849,3030581680,253542922, 3030615279,1075413020,3030660306,3030712322,3030728730,4947994, 3030752211,3030807763,3030861440,362741786, + 3029955791,3030021328,3030040602,884765, 53936157, 3030056996,3030073384,13303814, 96436235, 1804238890,1426849908,3030091123,67485725, 3030122507,57262121, + 3030151677,3030466762,3030512849,3030581680,253542922, 3030615279,1075413020,3030660306,3030712322,3030728730,4947994, 3030752211,3030807763,3030861440,362741786, 3030908994,3030941778,3030974510,3031023628,3031040026,3031066109,3031119060,3031171110,3031187951,153042973, 3031220315,3031253051,116883882, 3031285789,3031302156, 3031318638,3031352309,3031430357,3031495894,2752552, 756319341, 3031629890,342305837, 3031663439,3031696292,3031758039,442042854, 3031860531,3031908953,1826816301, 3031941141,340836364, 3031971032,3032044462,3032113166,3032154122,2801683, 3032184025,3032323389,422691291, 3032368315,514572310, 3032416296,2370290611,3032443911, 3032482506,1436434498,3032532465,3032564167,3032626394,3032678407,3032694810,2523151, 3032714497,3032743962,642089001, 3032760413,3032809775,2876456986,3032842711, 3032888539,40976390, 3032986844,3033068765,3033117918,1430683654,3033183455,3033268261,2292483156,3033298144,3033333772,3033350182,401375254, 3033366570,3033383435, - 3033432102,3033450057,360005642, 3033530377,3033546758,3033563164,2523139, 3033593057,3033661449,3033677961,3033694342,34603123, 3033710598,3033726977,63258629, + 3033432102,3033450057,360005642, 3033530377,3033546758,3033563164,2523139, 3033593057,3033661449,3033677961,3033694342,34603123, 3033710598,3033726977,63258629, 3033756898,3033858057,3033874569,3033904355,3033939974,3033956381,3033973044,3034005509,29376524, 3034021893,3034038284,77037570, 3034068196,21151750, 3034170466, 420806665, 1022476294,3034232037,3034281190,3034349577,3034366089,3034382470,187334771, 3034398730,3034415132,255361081, 3034431517,2129921, 3034461415,3034630330, - 3034661327,1785741549,3034693682,3034727387,3034792173,153190820, 3034824706,1681883162,3034841664,3034887400,3035004946,3035021335,3035037828,3032694787,18956290, + 3034661327,1785741549,3034693682,3034727387,3034792173,153190820, 3034824706,1681883162,3034841664,3034887400,3035004946,3035021335,3035037828,3032694787,18956290, 3035054087,3035070483,3035086867,17449017, 3035116777,3035185159,108134407, 3035215082,3035257822,24304606, 3035284217 }; static unsigned char WordEndBits[10532] = { - 96, 225,51, 252,41, 19, 188,28, 31, 240,29, 2, 68, 32, 4, 252,161,143,72, 96, 194,223,123,131,33, 228,59, 232,224,16, 195,129,34, 26, 40, 130,194,144,0, 32, 0, - 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 2, 32, 64, 0, 0, 0, 0, 0, 0, 1, 4, 0, 0, 2, 0, 0, 16, 0, 1, 64, 0, 0, 8, 0, 0, 4, 80, 8, 0, - 12, 0, 128,8, 42, 0, 0, 0, 0, 0, 0, 0, 4, 22, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 5, + 96, 225,51, 252,41, 19, 188,28, 31, 240,29, 2, 68, 32, 4, 252,161,143,72, 96, 194,223,123,131,33, 228,59, 232,224,16, 195,129,34, 26, 40, 130,194,144,0, 32, 0, + 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 2, 32, 64, 0, 0, 0, 0, 0, 0, 1, 4, 0, 0, 2, 0, 0, 16, 0, 1, 64, 0, 0, 8, 0, 0, 4, 80, 8, 0, + 12, 0, 128,8, 42, 0, 0, 0, 0, 0, 0, 0, 4, 22, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 5, 8, 0, 0, 0, 111,103,16, 201,159,14, 16, 64, 0, 0, 144,34, 98, 244,32, 80, 63, 233,67, 1, 0, 0, 0, 128,68, 160,2, 41, 194,255,80, 127,15, 195,125,189,206, - 206,255,127,252,127,255,255,59, 249,56, 2, 137,207,9, 109,64, 2, 0, 128,22, 27, 0, 144,8, 0, 0, 0, 0, 80, 25, 0, 8, 42, 1, 0, 5, 80, 216,55, 32, 0, + 206,255,127,252,127,255,255,59, 249,56, 2, 137,207,9, 109,64, 2, 0, 128,22, 27, 0, 144,8, 0, 0, 0, 0, 80, 25, 0, 8, 42, 1, 0, 5, 80, 216,55, 32, 0, 128,16, 0, 152,176,9, 1, 0, 16, 8, 0, 0, 0, 129,37, 8, 0, 128,0, 0, 0, 0, 2, 0, 0, 128,52, 0, 0, 8, 0, 4, 0, 0, 0, 0, 0, 32, 0, 0, 130, - 202,169,8, 1, 2, 16, 16, 0, 0, 24, 2, 1, 0, 0, 0, 16, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 129,128,0, 0, 65, 0, 0, 1, 0, 4, 32, 0, 144,0, - 0, 0, 8, 128,0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 160,236,32, 154,8, 60, 1, 57, 2, 114,0, 64, 0, 0, 128,0, 0, 20, 0, 1, 0, 0, 0, 0, 0, - 1, 0, 0, 2, 160,128,64, 0, 0, 0, 0, 0, 0, 2, 0, 0, 10, 0, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 1, 0, 0, 16, 16, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 64, 0, 0, 184,0, 0, 0, 0, 28, 64, 10, 0, 0, 16, 8, 4, 0, 0, 0, 0, 0, 0, 0, 4, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 58, 8, 0, 64, 1, 0, 0, 0, 0, 0, 232,0, 0, 32, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 136,0, 0, 0, 0, 0, 2, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 2, 0, 0, 0, 0, - 0, 0, 0, 16, 0, 0, 5, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 128,45, 0, 0, 128,1, 0, 0, 0, 0, 129,0, 0, 16, 62, 76, 0, 4, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 202,169,8, 1, 2, 16, 16, 0, 0, 24, 2, 1, 0, 0, 0, 16, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 129,128,0, 0, 65, 0, 0, 1, 0, 4, 32, 0, 144,0, + 0, 0, 8, 128,0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 160,236,32, 154,8, 60, 1, 57, 2, 114,0, 64, 0, 0, 128,0, 0, 20, 0, 1, 0, 0, 0, 0, 0, + 1, 0, 0, 2, 160,128,64, 0, 0, 0, 0, 0, 0, 2, 0, 0, 10, 0, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 1, 0, 0, 16, 16, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 64, 0, 0, 184,0, 0, 0, 0, 28, 64, 10, 0, 0, 16, 8, 4, 0, 0, 0, 0, 0, 0, 0, 4, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 58, 8, 0, 64, 1, 0, 0, 0, 0, 0, 232,0, 0, 32, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 136,0, 0, 0, 0, 0, 2, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 2, 0, 0, 0, 0, + 0, 0, 0, 16, 0, 0, 5, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 128,45, 0, 0, 128,1, 0, 0, 0, 0, 129,0, 0, 16, 62, 76, 0, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 8, 0, 1, 180,0, 0, 128,2, 0, 0, 32, 4, 0, 0, 0, 0, 0, 0, 0, 0, 4, 196,15, 64, 249,128,11, 0, 0, 0, 0, 0, 0, 240,182, - 55, 0, 70, 17, 0, 32, 129,24, 11, 18, 17, 112,24, 98, 148,224,1, 248,231,82, 2, 64, 76, 134,140,129,243,35, 16, 10, 0, 16, 4, 0, 34, 4, 16, 193,0, 8, 16, - 1, 32, 8, 82, 0, 17, 20, 5, 16, 16, 7, 80, 144,65, 8, 73, 16, 13, 68, 16, 0, 38, 1, 6, 132,144,240,0, 40, 128,128,0, 80, 17, 14, 128,0, 0, 0, 140,80, - 0, 4, 129,0, 64, 17, 32, 45, 136,0, 16, 0, 136,2, 32, 16, 9, 144,12, 8, 16, 164,4, 132,8, 36, 0, 0, 32, 16, 22, 79, 46, 20, 51, 217,0, 80, 49, 136,24, - 0, 68, 98, 9, 244,2, 1, 8, 0, 18, 64, 136,48, 0, 72, 4, 34, 40, 18, 197,88, 20, 32, 0, 200,196,18, 10, 0, 0, 0, 64, 2, 16, 0, 34, 0, 0, 0, 0, 24, + 55, 0, 70, 17, 0, 32, 129,24, 11, 18, 17, 112,24, 98, 148,224,1, 248,231,82, 2, 64, 76, 134,140,129,243,35, 16, 10, 0, 16, 4, 0, 34, 4, 16, 193,0, 8, 16, + 1, 32, 8, 82, 0, 17, 20, 5, 16, 16, 7, 80, 144,65, 8, 73, 16, 13, 68, 16, 0, 38, 1, 6, 132,144,240,0, 40, 128,128,0, 80, 17, 14, 128,0, 0, 0, 140,80, + 0, 4, 129,0, 64, 17, 32, 45, 136,0, 16, 0, 136,2, 32, 16, 9, 144,12, 8, 16, 164,4, 132,8, 36, 0, 0, 32, 16, 22, 79, 46, 20, 51, 217,0, 80, 49, 136,24, + 0, 68, 98, 9, 244,2, 1, 8, 0, 18, 64, 136,48, 0, 72, 4, 34, 40, 18, 197,88, 20, 32, 0, 200,196,18, 10, 0, 0, 0, 64, 2, 16, 0, 34, 0, 0, 0, 0, 24, 1, 44, 9, 16, 33, 64, 12, 128,16, 0, 180,10, 144,32, 0, 32, 0, 0, 14, 10, 0, 224,44, 16, 0, 0, 154,1, 10, 112,96, 16, 44, 18, 0, 2, 65, 64, 1, 6, 160, - 48, 94, 196,131,40, 1, 13, 60, 64, 0, 192,3, 37, 142,16, 96, 8, 36, 12, 80, 64, 64, 0, 64, 32, 128,2, 0, 4, 69, 72, 192,46, 0, 80, 130,96, 0, 0, 0, 3, + 48, 94, 196,131,40, 1, 13, 60, 64, 0, 192,3, 37, 142,16, 96, 8, 36, 12, 80, 64, 64, 0, 64, 32, 128,2, 0, 4, 69, 72, 192,46, 0, 80, 130,96, 0, 0, 0, 3, 0, 0, 0, 9, 4, 8, 164,144,18, 128,4, 5, 102,121,199,113,224,16, 49, 64, 76, 9, 194,48, 33, 200,1, 188,165,122,56, 248,8, 29, 130,158,168,0, 98, 132,100, - 165,4, 2, 4, 128,197,118,4, 68, 62, 0, 80, 36, 81, 38, 136,153,5, 0, 18, 64, 64, 12, 25, 144,120,0, 10, 70, 16, 32, 195,65, 57, 64, 208,0, 226,216,56, 0, + 165,4, 2, 4, 128,197,118,4, 68, 62, 0, 80, 36, 81, 38, 136,153,5, 0, 18, 64, 64, 12, 25, 144,120,0, 10, 70, 16, 32, 195,65, 57, 64, 208,0, 226,216,56, 0, 80, 64, 33, 97, 0, 0, 160,24, 34, 24, 176,130,17, 64, 0, 81, 134,0, 0, 2, 240,64, 130,4, 0, 0, 81, 201,179,88, 3, 134,128,84, 48, 3, 8, 6, 2, 12, 196, 27, 118,130,0, 64, 251,180,115,55, 109,24, 16, 236,139,160,1, 0, 0, 1, 192,32, 86, 132,144,0, 32, 12, 0, 0, 0, 152,12, 16, 17, 30, 4, 201,201,1, 144,129, 8, 47, 98, 62, 234,233,155,111,5, 192,132,64, 8, 0, 1, 0, 194,236,23, 119,202,4, 0, 12, 33, 0, 130,16, 128,46, 66, 128,48, 128,70, 37, 241,128,146,64, 194, 14, 2, 56, 81, 12, 32, 4, 0, 48, 48, 64, 48, 4, 4, 1, 64, 137,0, 76, 0, 8, 128,3, 0, 8, 0, 0, 0, 8, 16, 20, 0, 32, 128,0, 0, 0, 192,144,149,207, - 1, 70, 40, 3, 71, 64, 16, 0, 0, 5, 16, 70, 16, 0, 2, 2, 2, 0, 0, 0, 172,8, 17, 24, 0, 37, 5, 0, 152,129,5, 16, 0, 16, 0, 12, 130,130,208,68, 0, + 1, 70, 40, 3, 71, 64, 16, 0, 0, 5, 16, 70, 16, 0, 2, 2, 2, 0, 0, 0, 172,8, 17, 24, 0, 37, 5, 0, 152,129,5, 16, 0, 16, 0, 12, 130,130,208,68, 0, 128,40, 32, 28, 192,138,32, 220,134,204,11, 9, 200,192,64, 2, 0, 36, 8, 2, 130,72, 0, 4, 12, 1, 128,2, 24, 1, 50, 32, 230,72, 76, 160,107,16, 16, 128,230, - 36, 131,8, 64, 32, 128,35, 128,49, 56, 137,7, 32, 35, 128,66, 3, 70, 51, 246,10, 132,24, 134,1, 204,3, 6, 162,129,64, 64, 126,132,41, 104,232,0, 9, 28, 0, - 56, 104,167,140,17, 23, 38, 192,28, 64, 65, 32, 136,0, 127,216,223,32, 212,0, 6, 0, 24, 4, 242,67, 20, 32, 2, 231,96, 1, 16, 8, 4, 4, 3, 4, 212,141,56, - 8, 48, 130,68, 35, 12, 6, 38, 11, 129,2, 80, 34, 0, 0, 0, 0, 128,9, 19, 80, 17, 162,128,2, 240,134,130,172,0, 0, 52, 9, 3, 96, 0, 16, 4, 12, 20, 68, + 36, 131,8, 64, 32, 128,35, 128,49, 56, 137,7, 32, 35, 128,66, 3, 70, 51, 246,10, 132,24, 134,1, 204,3, 6, 162,129,64, 64, 126,132,41, 104,232,0, 9, 28, 0, + 56, 104,167,140,17, 23, 38, 192,28, 64, 65, 32, 136,0, 127,216,223,32, 212,0, 6, 0, 24, 4, 242,67, 20, 32, 2, 231,96, 1, 16, 8, 4, 4, 3, 4, 212,141,56, + 8, 48, 130,68, 35, 12, 6, 38, 11, 129,2, 80, 34, 0, 0, 0, 0, 128,9, 19, 80, 17, 162,128,2, 240,134,130,172,0, 0, 52, 9, 3, 96, 0, 16, 4, 12, 20, 68, 4, 89, 2, 64, 36, 1, 186,32, 48, 248,128,69, 8, 113,0, 3, 0, 64, 141,2, 1, 32, 1, 4, 0, 0, 0, 0, 0, 4, 8, 32, 8, 4, 0, 46, 65, 75, 132,116,131, 179,1, 21, 41, 136,0, 27, 65, 70, 0, 16, 54, 6, 128,5, 24, 4, 0, 0, 66, 48, 81, 0, 193,131,6, 32, 113,130,0, 0, 70, 0, 64, 0, 16, 184,40, 28, 206,160, - 11, 196,138,128,79, 96, 64, 8, 48, 0, 0, 10, 0, 64, 4, 0, 14, 16, 113,38, 140,0, 0, 52, 210,241,0, 6, 69, 32, 170,33, 218,24, 238,65, 138,113,35, 70, 83, - 72, 68, 64, 5, 194,29, 72, 145,35, 20, 32, 48, 187,46, 185,6, 42, 48, 209,130,68, 162,2, 200,82, 5, 209,179,77, 106,97, 33, 8, 3, 136,232,94, 48, 19, 99, 70, + 11, 196,138,128,79, 96, 64, 8, 48, 0, 0, 10, 0, 64, 4, 0, 14, 16, 113,38, 140,0, 0, 52, 210,241,0, 6, 69, 32, 170,33, 218,24, 238,65, 138,113,35, 70, 83, + 72, 68, 64, 5, 194,29, 72, 145,35, 20, 32, 48, 187,46, 185,6, 42, 48, 209,130,68, 162,2, 200,82, 5, 209,179,77, 106,97, 33, 8, 3, 136,232,94, 48, 19, 99, 70, 8, 64, 152,160,234,195,234,143,157,225,31, 128,120,128,57, 195,6, 3, 48, 14, 193,240,92, 10, 124,129,61, 9, 182,79, 160,131,117,49, 36, 142,57, 242,4, 205,141, - 86, 80, 99, 0, 250,71, 6, 18, 27, 52, 172,56, 92, 88, 1, 128,134,2, 8, 32, 45, 24, 32, 35, 34, 35, 74, 164,42, 45, 0, 9, 0, 0, 9, 26, 89, 9, 62, 168,62, + 86, 80, 99, 0, 250,71, 6, 18, 27, 52, 172,56, 92, 88, 1, 128,134,2, 8, 32, 45, 24, 32, 35, 34, 35, 74, 164,42, 45, 0, 9, 0, 0, 9, 26, 89, 9, 62, 168,62, 92, 1, 0, 0, 0, 0, 72, 132,37, 194,113,136,1, 97, 112,8, 16, 136,232,144,176,3, 25, 1, 136,49, 1, 17, 132,50, 4, 8, 178,68, 131,4, 66, 128,32, 0, 108, 1, 63, 8, 4, 28, 64, 6, 25, 81, 32, 28, 12, 2, 20, 162,0, 16, 16, 131,2, 1, 18, 195,7, 130,32, 173,247,69, 1, 92, 128,5, 0, 0, 47, 130,0, 11, 23, 108, - 190,32, 0, 205,128,144,143,0, 139,126,150,130,35, 103,8, 195,7, 203,164,96, 170,0, 1, 16, 83, 76, 24, 50, 15, 73, 77, 60, 8, 66, 139,86, 0, 20, 30, 65, 0, - 0, 1, 32, 4, 32, 24, 129,131,0, 1, 0, 0, 66, 3, 57, 11, 5, 0, 34, 92, 38, 2, 65, 130,8, 128,194,16, 6, 4, 32, 152,168,114,60, 48, 78, 0, 128,161,32, - 0, 228,0, 192,136,81, 136,64, 15, 76, 86, 105,15, 10, 220,195,52, 24, 2, 16, 0, 0, 0, 0, 0, 1, 32, 0, 16, 2, 40, 0, 16, 0, 64, 130,64, 72, 32, 108,0, + 190,32, 0, 205,128,144,143,0, 139,126,150,130,35, 103,8, 195,7, 203,164,96, 170,0, 1, 16, 83, 76, 24, 50, 15, 73, 77, 60, 8, 66, 139,86, 0, 20, 30, 65, 0, + 0, 1, 32, 4, 32, 24, 129,131,0, 1, 0, 0, 66, 3, 57, 11, 5, 0, 34, 92, 38, 2, 65, 130,8, 128,194,16, 6, 4, 32, 152,168,114,60, 48, 78, 0, 128,161,32, + 0, 228,0, 192,136,81, 136,64, 15, 76, 86, 105,15, 10, 220,195,52, 24, 2, 16, 0, 0, 0, 0, 0, 1, 32, 0, 16, 2, 40, 0, 16, 0, 64, 130,64, 72, 32, 108,0, 82, 0, 0, 99, 14, 128,132,241,0, 16, 32, 39, 59, 125,17, 8, 2, 0, 72, 24, 16, 255,18, 224,129,2, 16, 64, 129,2, 240,2, 49, 112,248,247,32, 160,173,144,130, - 64, 5, 184,208,166,8, 5, 1, 19, 38, 72, 209,92, 48, 131,71, 144,4, 46, 65, 0, 208,1, 218,186,0, 12, 52, 128,4, 32, 160,8, 58, 0, 46, 2, 64, 0, 1, 60, - 57, 206,187,228,32, 36, 17, 141,0, 192,40, 64, 152,4, 34, 80, 142,148,31, 108,238,104,128,68, 94, 65, 61, 4, 104,244,240,244,242,39, 1, 152,249,34, 3, 96, 0, + 64, 5, 184,208,166,8, 5, 1, 19, 38, 72, 209,92, 48, 131,71, 144,4, 46, 65, 0, 208,1, 218,186,0, 12, 52, 128,4, 32, 160,8, 58, 0, 46, 2, 64, 0, 1, 60, + 57, 206,187,228,32, 36, 17, 141,0, 192,40, 64, 152,4, 34, 80, 142,148,31, 108,238,104,128,68, 94, 65, 61, 4, 104,244,240,244,242,39, 1, 152,249,34, 3, 96, 0, 97, 64, 45, 200,144,103,68, 8, 115,123,5, 3, 104,158,87, 16, 64, 32, 215,175,89, 204,1, 153,196,18, 21, 254,112,7, 41, 10, 28, 4, 14, 158,106,3, 159,24, 110, - 80, 13, 64, 194,233,64, 84, 1, 8, 5, 16, 128,2, 48, 32, 0, 4, 16, 129,8, 10, 32, 128,144,10, 46, 212,148,130,0, 48, 19, 56, 172,13, 0, 64, 32, 76, 132,10, + 80, 13, 64, 194,233,64, 84, 1, 8, 5, 16, 128,2, 48, 32, 0, 4, 16, 129,8, 10, 32, 128,144,10, 46, 212,148,130,0, 48, 19, 56, 172,13, 0, 64, 32, 76, 132,10, 161,8, 191,69, 41, 136,9, 130,57, 124,167,29, 43, 74, 27, 130,68, 22, 2, 128,113,37, 21, 134,2, 0, 146,8, 134,8, 78, 89, 16, 136,0, 22, 179,0, 133,1, 128, 165,136,137,10, 240,84, 85, 144,140,59, 97, 2, 36, 87, 225,168,83, 121,198,189,122,8, 0, 4, 180,130,35, 160,128,0, 35, 66, 96, 12, 115,16, 176,186,224,8, 138, - 47, 51, 128,143,34, 206,10, 40, 250,47, 99, 130,42, 128,15, 0, 0, 0, 222,16, 4, 2, 122,144,152,7, 68, 72, 136,124,121,102,16, 16, 144,14, 2, 94, 63, 28, 66, - 49, 6, 5, 16, 192,2, 8, 141,29, 68, 20, 26, 137,20, 208,30, 0, 10, 166,155,203,200,224,132,64, 239,162,121,17, 8, 202,137,91, 242,212,238,29, 165,12, 28, 50, - 80, 135,128,112,6, 151,131,77, 69, 11, 185,197,66, 64, 12, 4, 26, 0, 128,0, 2, 4, 0, 48, 12, 136,0, 0, 0, 0, 1, 0, 0, 144,63, 80, 2, 149,34, 4, 16, - 7, 8, 140,0, 72, 0, 8, 130,133,196,0, 4, 32, 204,68, 71, 80, 64, 0, 8, 0, 150,132,132,28, 104,208,249,1, 130,168,4, 8, 0, 128,0, 193,65, 24, 170,67, + 47, 51, 128,143,34, 206,10, 40, 250,47, 99, 130,42, 128,15, 0, 0, 0, 222,16, 4, 2, 122,144,152,7, 68, 72, 136,124,121,102,16, 16, 144,14, 2, 94, 63, 28, 66, + 49, 6, 5, 16, 192,2, 8, 141,29, 68, 20, 26, 137,20, 208,30, 0, 10, 166,155,203,200,224,132,64, 239,162,121,17, 8, 202,137,91, 242,212,238,29, 165,12, 28, 50, + 80, 135,128,112,6, 151,131,77, 69, 11, 185,197,66, 64, 12, 4, 26, 0, 128,0, 2, 4, 0, 48, 12, 136,0, 0, 0, 0, 1, 0, 0, 144,63, 80, 2, 149,34, 4, 16, + 7, 8, 140,0, 72, 0, 8, 130,133,196,0, 4, 32, 204,68, 71, 80, 64, 0, 8, 0, 150,132,132,28, 104,208,249,1, 130,168,4, 8, 0, 128,0, 193,65, 24, 170,67, 240,129,139,23, 0, 10, 97, 28, 27, 37, 209,249,0, 12, 13, 30, 217,233,48, 67, 68, 176,28, 52, 132,65, 111,17, 50, 8, 210,163,0, 204,42, 142,140,68, 5, 12, 104, 2, 2, 148,166,192,150,100,3, 128,64, 67, 114,3, 0, 120,144,224,160,72, 184,255,208,236,48, 9, 152,223,0, 74, 6, 172,75, 241,241,224,6, 206,3, 192,8, 128, 140,226,24, 1, 9, 24, 32, 152,248,17, 98, 107,6, 63, 10, 94, 96, 69, 0, 26, 128,41, 16, 0, 128,68, 0, 192,4, 21, 70, 16, 192,66, 4, 26, 8, 16, 29, 80, 128, 50, 168,73, 128,74, 64, 32, 2, 64, 4, 0, 1, 0, 4, 0, 33, 180,121,0, 0, 160,68, 113,3, 110,0, 128,34, 80, 200,4, 16, 3, 0, 32, 129,65, 0, 32, 220,212, - 4, 64, 192,112,4, 0, 0, 0, 0, 0, 0, 0, 0, 96, 19, 24, 84, 60, 132,131,0, 3, 0, 55, 144,9, 0, 102,63, 171,0, 128,23, 68, 5, 54, 16, 204,194,12, 0, - 5, 72, 127,230,174,8, 20, 162,77, 20, 66, 3, 71, 144,0, 9, 109,5, 44, 54, 14, 13, 168,108,32, 6, 72, 9, 48, 30, 21, 19, 186,24, 144,76, 88, 192,67, 2, 0, + 4, 64, 192,112,4, 0, 0, 0, 0, 0, 0, 0, 0, 96, 19, 24, 84, 60, 132,131,0, 3, 0, 55, 144,9, 0, 102,63, 171,0, 128,23, 68, 5, 54, 16, 204,194,12, 0, + 5, 72, 127,230,174,8, 20, 162,77, 20, 66, 3, 71, 144,0, 9, 109,5, 44, 54, 14, 13, 168,108,32, 6, 72, 9, 48, 30, 21, 19, 186,24, 144,76, 88, 192,67, 2, 0, 32, 50, 131,247,7, 134,0, 25, 196,72, 124,113,100,0, 30, 199,133,205,64, 4, 1, 46, 128,14, 2, 2, 0, 160,149,32, 194,49, 8, 199,222,28, 4, 16, 66, 9, 242, - 126,3, 251,228,88, 60, 4, 0, 0, 3, 0, 32, 63, 220,32, 138,88, 12, 4, 32, 128,25, 1, 0, 192,97, 0, 28, 2, 8, 16, 5, 84, 180,51, 128,64, 45, 65, 0, 47, - 1, 0, 0, 70, 69, 192,64, 161,42, 128,37, 0, 0, 0, 0, 0, 80, 32, 36, 163,12, 36, 102,225,32, 63, 0, 238,128,25, 0, 108,36, 144,198,64, 136,166,64, 194,32, + 126,3, 251,228,88, 60, 4, 0, 0, 3, 0, 32, 63, 220,32, 138,88, 12, 4, 32, 128,25, 1, 0, 192,97, 0, 28, 2, 8, 16, 5, 84, 180,51, 128,64, 45, 65, 0, 47, + 1, 0, 0, 70, 69, 192,64, 161,42, 128,37, 0, 0, 0, 0, 0, 80, 32, 36, 163,12, 36, 102,225,32, 63, 0, 238,128,25, 0, 108,36, 144,198,64, 136,166,64, 194,32, 135,12, 104,4, 34, 22, 0, 100,242,106,43, 97, 23, 36, 0, 0, 0, 0, 0, 0, 0, 65, 25, 66, 88, 45, 200,13, 147,64, 160,8, 6, 64, 4, 112,0, 46, 0, 15, 128, - 0, 4, 110,16, 2, 72, 32, 16, 35, 10, 46, 0, 16, 6, 0, 162,32, 97, 192,12, 64, 184,34, 192,233,7, 154,241,143,12, 228,2, 40, 68, 46, 193,22, 67, 8, 74, 9, - 68, 28, 118,64, 144,8, 200,36, 64, 134,120,96, 96, 34, 16, 0, 33, 1, 138,0, 3, 0, 0, 67, 9, 1, 67, 128,36, 140,14, 0, 32, 32, 24, 128,157,12, 168,1, 12, - 17, 78, 16, 64, 0, 2, 1, 16, 0, 104,0, 0, 128,4, 16, 184,95, 16, 32, 34, 10, 0, 8, 32, 24, 8, 81, 20, 12, 128,216,0, 40, 164,161,157,16, 2, 88, 15, 9, - 136,32, 4, 0, 131,192,129,0, 128,5, 37, 1, 48, 254,7, 0, 114,40, 200,152,16, 4, 174,64, 20, 160,224,248,42, 185,53, 59, 97, 92, 0, 8, 193,7, 173,91, 24, - 66, 65, 183,129,129,184,194,67, 144,0, 128,105,108,19, 11, 4, 209,250,65, 192,81, 97, 13, 27, 0, 0, 64, 0, 0, 0, 0, 4, 248,77, 192,1, 104,5, 16, 208,56, - 167,73, 71, 32, 104,1, 64, 2, 138,12, 140,42, 3, 12, 83, 6, 136,99, 8, 65, 18, 22, 252,18, 33, 128,0, 25, 33, 192,56, 240,18, 197,40, 254,2, 6, 0, 232,36, + 0, 4, 110,16, 2, 72, 32, 16, 35, 10, 46, 0, 16, 6, 0, 162,32, 97, 192,12, 64, 184,34, 192,233,7, 154,241,143,12, 228,2, 40, 68, 46, 193,22, 67, 8, 74, 9, + 68, 28, 118,64, 144,8, 200,36, 64, 134,120,96, 96, 34, 16, 0, 33, 1, 138,0, 3, 0, 0, 67, 9, 1, 67, 128,36, 140,14, 0, 32, 32, 24, 128,157,12, 168,1, 12, + 17, 78, 16, 64, 0, 2, 1, 16, 0, 104,0, 0, 128,4, 16, 184,95, 16, 32, 34, 10, 0, 8, 32, 24, 8, 81, 20, 12, 128,216,0, 40, 164,161,157,16, 2, 88, 15, 9, + 136,32, 4, 0, 131,192,129,0, 128,5, 37, 1, 48, 254,7, 0, 114,40, 200,152,16, 4, 174,64, 20, 160,224,248,42, 185,53, 59, 97, 92, 0, 8, 193,7, 173,91, 24, + 66, 65, 183,129,129,184,194,67, 144,0, 128,105,108,19, 11, 4, 209,250,65, 192,81, 97, 13, 27, 0, 0, 64, 0, 0, 0, 0, 4, 248,77, 192,1, 104,5, 16, 208,56, + 167,73, 71, 32, 104,1, 64, 2, 138,12, 140,42, 3, 12, 83, 6, 136,99, 8, 65, 18, 22, 252,18, 33, 128,0, 25, 33, 192,56, 240,18, 197,40, 254,2, 6, 0, 232,36, 35, 81, 177,147,32, 8, 160,82, 49, 18, 240,129,151,228,36, 33, 45, 128,32, 0, 6, 130,0, 0, 0, 96, 0, 0, 67, 55, 16, 0, 140,161,1, 16, 64, 72, 161,9, 152, - 10, 169,64, 48, 0, 108,145,160,80, 155,15, 98, 33, 145,232,224,16, 65, 24, 24, 1, 6, 0, 0, 4, 24, 4, 4, 4, 128,2, 0, 72, 0, 0, 2, 192,72, 128,0, 0, - 32, 18, 16, 0, 16, 0, 65, 0, 0, 0, 4, 4, 8, 0, 0, 128,0, 2, 0, 0, 0, 128,73, 176,32, 115,192,4, 163,68, 210,40, 34, 12, 135,102,236,0, 122,70, 2, + 10, 169,64, 48, 0, 108,145,160,80, 155,15, 98, 33, 145,232,224,16, 65, 24, 24, 1, 6, 0, 0, 4, 24, 4, 4, 4, 128,2, 0, 72, 0, 0, 2, 192,72, 128,0, 0, + 32, 18, 16, 0, 16, 0, 65, 0, 0, 0, 4, 4, 8, 0, 0, 128,0, 2, 0, 0, 0, 128,73, 176,32, 115,192,4, 163,68, 210,40, 34, 12, 135,102,236,0, 122,70, 2, 25, 139,6, 186,118,64, 197,128,104,255,195,122,12, 246,29, 161,5, 112,18, 193,169,17, 2, 32, 114,161,162,32, 160,247,8, 48, 6, 101,36, 12, 130,54, 44, 0, 231, - 127,67, 83, 249,64, 6, 0, 0, 128,0, 0, 0, 0, 64, 144,0, 128,60, 153,129,141,16, 136,136,0, 4, 152,102,53, 45, 0, 0, 196,2, 1, 137,0, 128,0, 0, 16, - 128,24, 0, 128,24, 50, 64, 69, 7, 32, 201,128,200,42, 64, 0, 32, 24, 141,4, 65, 40, 0, 128,144,139,128,17, 32, 0, 97, 2, 202,8, 2, 0, 0, 58, 128,0, 64, - 64, 9, 134,18, 0, 20, 68, 68, 128,18, 0, 0, 76, 1, 217,1, 113,128,24, 64, 1, 120,7, 162,164,228,5, 130,65, 1, 34, 72, 130,81, 10, 8, 192,130,192,204,31, - 0, 43, 129,2, 12, 9, 16, 5, 0, 48, 16, 58, 0, 16, 34, 86, 64, 64, 26, 132,64, 49, 0, 100,4, 96, 30, 0, 10, 1, 16, 64, 128,65, 35, 128,0, 160,0, 4, 2, + 127,67, 83, 249,64, 6, 0, 0, 128,0, 0, 0, 0, 64, 144,0, 128,60, 153,129,141,16, 136,136,0, 4, 152,102,53, 45, 0, 0, 196,2, 1, 137,0, 128,0, 0, 16, + 128,24, 0, 128,24, 50, 64, 69, 7, 32, 201,128,200,42, 64, 0, 32, 24, 141,4, 65, 40, 0, 128,144,139,128,17, 32, 0, 97, 2, 202,8, 2, 0, 0, 58, 128,0, 64, + 64, 9, 134,18, 0, 20, 68, 68, 128,18, 0, 0, 76, 1, 217,1, 113,128,24, 64, 1, 120,7, 162,164,228,5, 130,65, 1, 34, 72, 130,81, 10, 8, 192,130,192,204,31, + 0, 43, 129,2, 12, 9, 16, 5, 0, 48, 16, 58, 0, 16, 34, 86, 64, 64, 26, 132,64, 49, 0, 100,4, 96, 30, 0, 10, 1, 16, 64, 128,65, 35, 128,0, 160,0, 4, 2, 64, 2, 32, 19, 164,72, 0, 2, 0, 32, 133,32, 162,2, 248,27, 80, 224,9, 144,168,61, 11, 16, 228,108,2, 0, 0, 0, 0, 192,37, 0, 192,12, 2, 0, 164,32, 128, - 159,0, 4, 8, 32, 0, 128,0, 3, 224,3, 1, 72, 14, 14, 200,33, 64, 90, 244,202,16, 160,1, 0, 70, 43, 0, 192,1, 64, 168,0, 106,102,12, 98, 64, 66, 28, 64, - 32, 0, 44, 150,11, 154,128,8, 0, 88, 82, 32, 0, 128,7, 1, 41, 10, 96, 73, 0, 64, 0, 128,8, 0, 64, 25, 0, 132,0, 4, 8, 32, 48, 64, 0, 0, 0, 0, 8, - 3, 144,0, 64, 0, 0, 3, 0, 100,64, 0, 129,2, 32, 0, 0, 0, 0, 200,0, 0, 32, 64, 5, 0, 18, 130,0, 34, 175,221,122,50, 80, 161,0, 0, 0, 0, 0, 0, + 159,0, 4, 8, 32, 0, 128,0, 3, 224,3, 1, 72, 14, 14, 200,33, 64, 90, 244,202,16, 160,1, 0, 70, 43, 0, 192,1, 64, 168,0, 106,102,12, 98, 64, 66, 28, 64, + 32, 0, 44, 150,11, 154,128,8, 0, 88, 82, 32, 0, 128,7, 1, 41, 10, 96, 73, 0, 64, 0, 128,8, 0, 64, 25, 0, 132,0, 4, 8, 32, 48, 64, 0, 0, 0, 0, 8, + 3, 144,0, 64, 0, 0, 3, 0, 100,64, 0, 129,2, 32, 0, 0, 0, 0, 200,0, 0, 32, 64, 5, 0, 18, 130,0, 34, 175,221,122,50, 80, 161,0, 0, 0, 0, 0, 0, 1, 0, 0, 32, 2, 16, 28, 163,73, 81, 67, 108,96, 19, 164,64, 100,16, 160,25, 167,0, 133,0, 31, 1, 31, 4, 145,25, 217,109,144,230,15, 170,72, 98, 224,102,160, - 28, 61, 89, 44, 216,170,125,41, 25, 85, 82, 244,148,45, 42, 31, 18, 32, 212,96, 0, 64, 0, 0, 72, 124,221,127,49, 148,129,2, 99, 76, 97, 80, 2, 64, 88, 192,68, - 18, 26, 0, 32, 183,16, 53, 36, 137,129,76, 33, 0, 0, 0, 0, 0, 113,88, 84, 47, 64, 8, 209,45, 194,21, 34, 197,73, 65, 32, 48, 23, 48, 64, 177,67, 6, 134,66, - 87, 144,66, 10, 4, 143,0, 65, 13, 178,65, 38, 132,160,140,143,2, 29, 160,64, 12, 32, 32, 129,72, 8, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 16, 24, 132,19, 36, - 87, 18, 36, 40, 72, 144,136,40, 141,34, 32, 144,2, 0, 0, 1, 82, 132,0, 176,32, 4, 0, 0, 0, 0, 8, 162,224,36, 0, 144,5, 130,76, 128,48, 96, 194,4, 0, - 64, 0, 0, 34, 0, 224,11, 2, 24, 129,0, 64, 0, 8, 0, 112,32, 6, 1, 33, 64, 17, 0, 0, 4, 24, 64, 0, 0, 4, 8, 0, 0, 4, 128,135,4, 33, 144,0, 80, - 43, 0, 0, 0, 32, 2, 1, 0, 144,126,128,1, 0, 6, 0, 112,132,60, 137,51, 196,37, 162,47, 6, 80, 193,161,48, 64, 12, 32, 0, 143,4, 57, 143,0, 18, 12, 2, - 0, 192,244,84, 220,31, 146,47, 136,0, 16, 8, 32, 0, 36, 1, 0, 16, 64, 0, 0, 2, 0, 22, 70, 0, 0, 16, 129,128,0, 5, 68, 224,186,75, 0, 24, 26, 16, 32, + 28, 61, 89, 44, 216,170,125,41, 25, 85, 82, 244,148,45, 42, 31, 18, 32, 212,96, 0, 64, 0, 0, 72, 124,221,127,49, 148,129,2, 99, 76, 97, 80, 2, 64, 88, 192,68, + 18, 26, 0, 32, 183,16, 53, 36, 137,129,76, 33, 0, 0, 0, 0, 0, 113,88, 84, 47, 64, 8, 209,45, 194,21, 34, 197,73, 65, 32, 48, 23, 48, 64, 177,67, 6, 134,66, + 87, 144,66, 10, 4, 143,0, 65, 13, 178,65, 38, 132,160,140,143,2, 29, 160,64, 12, 32, 32, 129,72, 8, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 16, 24, 132,19, 36, + 87, 18, 36, 40, 72, 144,136,40, 141,34, 32, 144,2, 0, 0, 1, 82, 132,0, 176,32, 4, 0, 0, 0, 0, 8, 162,224,36, 0, 144,5, 130,76, 128,48, 96, 194,4, 0, + 64, 0, 0, 34, 0, 224,11, 2, 24, 129,0, 64, 0, 8, 0, 112,32, 6, 1, 33, 64, 17, 0, 0, 4, 24, 64, 0, 0, 4, 8, 0, 0, 4, 128,135,4, 33, 144,0, 80, + 43, 0, 0, 0, 32, 2, 1, 0, 144,126,128,1, 0, 6, 0, 112,132,60, 137,51, 196,37, 162,47, 6, 80, 193,161,48, 64, 12, 32, 0, 143,4, 57, 143,0, 18, 12, 2, + 0, 192,244,84, 220,31, 146,47, 136,0, 16, 8, 32, 0, 36, 1, 0, 16, 64, 0, 0, 2, 0, 22, 70, 0, 0, 16, 129,128,0, 5, 68, 224,186,75, 0, 24, 26, 16, 32, 49, 6, 0, 217,1, 0, 80, 50, 0, 8, 112,0, 0, 32, 64, 1, 0, 0, 16, 0, 0, 96, 0, 0, 1, 0, 0, 0, 128,16, 16, 33, 0, 4, 162,28, 64, 34, 16, 144,188, - 67, 196,24, 34, 151,72, 0, 193,64, 0, 1, 0, 2, 0, 144,172,64, 128,0, 88, 16, 12, 1, 64, 18, 8, 1, 12, 184,8, 56, 8, 147,129,34, 64, 0, 96, 1, 192,6, - 80, 0, 0, 129,96, 4, 0, 128,192,64, 0, 1, 0, 120,11, 0, 140,32, 0, 0, 192,16, 182,0, 144,93, 66, 0, 122,138,65, 22, 196,8, 134,64, 72, 0, 128,77, 34, - 132,128,0, 0, 20, 0, 64, 8, 72, 50, 16, 0, 64, 68, 152,0, 10, 32, 25, 25, 36, 0, 0, 1, 1, 34, 0, 0, 64, 0, 128,0, 8, 0, 17, 8, 0, 32, 0, 0, 0, - 1, 0, 134,189,120,81, 28, 0, 147,67, 39, 52, 2, 2, 16, 94, 32, 0, 34, 76, 5, 209,23, 14, 137,58, 32, 133,128,231,1, 39, 27, 178,70, 237,0, 61, 136,96, 88, - 99, 193,64, 86, 228,224,49, 0, 0, 36, 142,161,84, 180,8, 19, 145,0, 2, 0, 0, 0, 42, 19, 48, 48, 125,66, 68, 11, 128,37, 185,70, 26, 0, 197,154,165,74, 18, - 115,128,20, 136,36, 72, 178,21, 10, 128,182,75, 153,175,223,0, 64, 0, 40, 2, 195,35, 34, 214,0, 4, 0, 0, 0, 0, 0, 144,82, 32, 0, 75, 40, 153,0, 170,84, + 67, 196,24, 34, 151,72, 0, 193,64, 0, 1, 0, 2, 0, 144,172,64, 128,0, 88, 16, 12, 1, 64, 18, 8, 1, 12, 184,8, 56, 8, 147,129,34, 64, 0, 96, 1, 192,6, + 80, 0, 0, 129,96, 4, 0, 128,192,64, 0, 1, 0, 120,11, 0, 140,32, 0, 0, 192,16, 182,0, 144,93, 66, 0, 122,138,65, 22, 196,8, 134,64, 72, 0, 128,77, 34, + 132,128,0, 0, 20, 0, 64, 8, 72, 50, 16, 0, 64, 68, 152,0, 10, 32, 25, 25, 36, 0, 0, 1, 1, 34, 0, 0, 64, 0, 128,0, 8, 0, 17, 8, 0, 32, 0, 0, 0, + 1, 0, 134,189,120,81, 28, 0, 147,67, 39, 52, 2, 2, 16, 94, 32, 0, 34, 76, 5, 209,23, 14, 137,58, 32, 133,128,231,1, 39, 27, 178,70, 237,0, 61, 136,96, 88, + 99, 193,64, 86, 228,224,49, 0, 0, 36, 142,161,84, 180,8, 19, 145,0, 2, 0, 0, 0, 42, 19, 48, 48, 125,66, 68, 11, 128,37, 185,70, 26, 0, 197,154,165,74, 18, + 115,128,20, 136,36, 72, 178,21, 10, 128,182,75, 153,175,223,0, 64, 0, 40, 2, 195,35, 34, 214,0, 4, 0, 0, 0, 0, 0, 144,82, 32, 0, 75, 40, 153,0, 170,84, 8, 28, 19, 1, 40, 16, 80, 193,253,61, 37, 156,36, 6, 26, 129,204,28, 226,35, 0, 154,4, 224,0, 34, 32, 0, 6, 3, 128,89, 97, 8, 0, 179,64, 9, 1, 0, 128, 48, 2, 4, 0, 0, 0, 160,69, 43, 204,32, 164,18, 36, 133,210,32, 20, 5, 0, 5, 82, 16, 131,72, 221,94, 107,75, 160,127,159,27, 242,82, 163,81, 0, 4, 4, 135, 0, 32, 197,17, 166,234,136,33, 128,128,140,0, 20, 45, 140,112,6, 32, 4, 144,13, 6, 129,128,40, 172,1, 25, 113,228,18, 0, 37, 138,197,65, 228,20, 240,7, 129, - 203,0, 18, 37, 73, 0, 105,0, 144,0, 0, 100,160,24, 252,251,251,0, 28, 64, 47, 226,58, 133,17, 20, 128,88, 238,87, 44, 160,37, 25, 23, 0, 98, 18, 1, 37, 33, - 4, 203,49, 0, 194,195,147,179,15, 41, 64, 88, 20, 2, 8, 12, 192,84, 73, 134,102,67, 146,17, 0, 48, 228,97, 227,216,145,128,16, 32, 180,2, 33, 0, 32, 224,59, + 203,0, 18, 37, 73, 0, 105,0, 144,0, 0, 100,160,24, 252,251,251,0, 28, 64, 47, 226,58, 133,17, 20, 128,88, 238,87, 44, 160,37, 25, 23, 0, 98, 18, 1, 37, 33, + 4, 203,49, 0, 194,195,147,179,15, 41, 64, 88, 20, 2, 8, 12, 192,84, 73, 134,102,67, 146,17, 0, 48, 228,97, 227,216,145,128,16, 32, 180,2, 33, 0, 32, 224,59, 16, 64, 1, 84, 160,64, 96, 100,37, 0, 17, 131,82, 83, 0, 156,24, 16, 1, 0, 0, 0, 0, 2, 8, 9, 0, 0, 139,14, 241,214,12, 176,124,98, 40, 114,74, 146,150, 184,48, 132,76, 65, 31, 136,183,240,178,4, 17, 147,0, 86, 140,7, 228,197,51, 173,139,18, 100,114,137,162,112,0, 141,126,122,45, 194,33, 232,151,22, 0, 160,232, - 130,247,50, 1, 139,14, 35, 132,145,43, 6, 0, 0, 0, 8, 8, 0, 40, 8, 96, 182,14, 1, 89, 210,48, 7, 186,97, 200,42, 0, 148,224,64, 0, 178,76, 22, 2, 87, - 192,32, 0, 2, 128,108,7, 64, 79, 74, 208,248,24, 16, 113,164,5, 0, 8, 153,98, 0, 70, 197,21, 4, 8, 0, 0, 2, 0, 7, 0, 0, 0, 112,18, 176,0, 0, 1, - 130,0, 32, 6, 0, 32, 1, 1, 0, 0, 0, 104,0, 128,0, 4, 48, 128,68, 16, 67, 8, 9, 48, 96, 70, 77, 96, 173,1, 136,0, 113,159,36, 32, 12, 7, 39, 20, 0, - 66, 100,68, 154,33, 137,144,134,0, 146,34, 161,0, 0, 0, 0, 0, 0, 0, 128,8, 49, 170,38, 4, 64, 16, 65, 161,72, 20, 4, 64, 9, 16, 12, 138,193,97, 0, 16, + 130,247,50, 1, 139,14, 35, 132,145,43, 6, 0, 0, 0, 8, 8, 0, 40, 8, 96, 182,14, 1, 89, 210,48, 7, 186,97, 200,42, 0, 148,224,64, 0, 178,76, 22, 2, 87, + 192,32, 0, 2, 128,108,7, 64, 79, 74, 208,248,24, 16, 113,164,5, 0, 8, 153,98, 0, 70, 197,21, 4, 8, 0, 0, 2, 0, 7, 0, 0, 0, 112,18, 176,0, 0, 1, + 130,0, 32, 6, 0, 32, 1, 1, 0, 0, 0, 104,0, 128,0, 4, 48, 128,68, 16, 67, 8, 9, 48, 96, 70, 77, 96, 173,1, 136,0, 113,159,36, 32, 12, 7, 39, 20, 0, + 66, 100,68, 154,33, 137,144,134,0, 146,34, 161,0, 0, 0, 0, 0, 0, 0, 128,8, 49, 170,38, 4, 64, 16, 65, 161,72, 20, 4, 64, 9, 16, 12, 138,193,97, 0, 16, 72, 1, 80, 0, 4, 34, 2, 128,32, 0, 16, 20, 4, 75, 2, 32, 128,113,196,7, 8, 32, 8, 0, 104,68, 81, 32, 4, 0, 129,13, 11, 8, 2, 128,208,45, 198,129,165, 129,3, 132,9, 0, 102,23, 44, 66, 0, 0, 193,22, 53, 24, 118,160,102,60, 66, 123,142,163,135,229,35, 137,128,22, 216,168,1, 167,17, 36, 32, 149,57, 55, 228,168, 19, 211,1, 55, 72, 84, 84, 32, 18, 12, 178,76, 198,144,115,133,177,128,101,30, 0, 3, 16, 17, 128,61, 7, 1, 151,24, 8, 216,73, 19, 36, 188,208,231,214,140,216, - 50, 78, 133,99, 148,192,3, 229,164,80, 120,53, 56, 162,161,47, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 64, 34, 1, 46, 8, 130,64, 8, 0, 72, 1, 153,14, 32, 0, - 131,7, 26, 129,172,68, 22, 13, 2, 0, 66, 128,2, 131,235,85, 112,19, 33, 130,128,148,208,249,19, 2, 145,6, 146,40, 128,35, 32, 16, 0, 128,0, 66, 4, 16, 3, - 0, 0, 0, 0, 0, 159,3, 2, 32, 69, 33, 146,107,155,136,32, 5, 0, 1, 199,243,118,8, 64, 255,251,165,161,56, 183,146,2, 208,52, 64, 224,74, 35, 128,73, 56, - 17, 235,65, 152,213,198,204,138,28, 7, 16, 8, 80, 10, 34, 48, 232,150,58, 118,135,80, 5, 161,1, 128,59, 144,29, 42, 32, 104,162,0, 3, 18, 16, 142,7, 38, 75, - 215,28, 13, 131,120,94, 153,134,106,128,96, 53, 56, 34, 178,193,200,236,173,25, 138,216,3, 1, 247,21, 0, 131,212,145,192,159,10, 12, 48, 113,3, 25, 2, 0, 0, + 50, 78, 133,99, 148,192,3, 229,164,80, 120,53, 56, 162,161,47, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 64, 34, 1, 46, 8, 130,64, 8, 0, 72, 1, 153,14, 32, 0, + 131,7, 26, 129,172,68, 22, 13, 2, 0, 66, 128,2, 131,235,85, 112,19, 33, 130,128,148,208,249,19, 2, 145,6, 146,40, 128,35, 32, 16, 0, 128,0, 66, 4, 16, 3, + 0, 0, 0, 0, 0, 159,3, 2, 32, 69, 33, 146,107,155,136,32, 5, 0, 1, 199,243,118,8, 64, 255,251,165,161,56, 183,146,2, 208,52, 64, 224,74, 35, 128,73, 56, + 17, 235,65, 152,213,198,204,138,28, 7, 16, 8, 80, 10, 34, 48, 232,150,58, 118,135,80, 5, 161,1, 128,59, 144,29, 42, 32, 104,162,0, 3, 18, 16, 142,7, 38, 75, + 215,28, 13, 131,120,94, 153,134,106,128,96, 53, 56, 34, 178,193,200,236,173,25, 138,216,3, 1, 247,21, 0, 131,212,145,192,159,10, 12, 48, 113,3, 25, 2, 0, 0, 4, 193,4, 0, 1, 80, 63, 5, 204,49, 19, 34, 32, 85, 128,12, 64, 232,2, 139,204,23, 146,50, 140,32, 40, 20, 134,135,15, 128,0, 191,226,64, 133,5, 71, 66, 160, 16, 131,161,224,64, 5, 40, 9, 96, 168,4, 106,88, 7, 199,182,114,132,1, 14, 4, 203,128,48, 0, 2, 130,124,0, 180,114,66, 174,41, 7, 144,32, 5, 36, 0, 232, - 4, 194,3, 64, 64, 4, 0, 16, 32, 0, 181,52, 2, 0, 0, 0, 0, 72, 1, 0, 86, 136,0, 0, 2, 17, 0, 26, 4, 160,132,100,19, 64, 192,3, 65, 131,164,26, 16, - 67, 20, 15, 240,78, 128,220,198,8, 64, 179,136,134,2, 19, 0, 192,128,132,196,27, 5, 0, 32, 64, 96, 216,140,8, 91, 128,193,105,17, 20, 244,144,9, 0, 0, 87, + 4, 194,3, 64, 64, 4, 0, 16, 32, 0, 181,52, 2, 0, 0, 0, 0, 72, 1, 0, 86, 136,0, 0, 2, 17, 0, 26, 4, 160,132,100,19, 64, 192,3, 65, 131,164,26, 16, + 67, 20, 15, 240,78, 128,220,198,8, 64, 179,136,134,2, 19, 0, 192,128,132,196,27, 5, 0, 32, 64, 96, 216,140,8, 91, 128,193,105,17, 20, 244,144,9, 0, 0, 87, 9, 6, 240,8, 129,0, 135,88, 13, 63, 177,107,209,40, 32, 96, 6, 12, 161,96, 2, 64, 1, 224,0, 1, 196,1, 8, 32, 137,238,30, 160,4, 131,37, 52, 145,38, 232, - 174,44, 111,93, 132,24, 224,154,192,100,1, 0, 157,18, 200,7, 17, 128,18, 32, 40, 36, 1, 21, 1, 0, 18, 112,18, 112,109,114,0, 0, 0, 0, 0, 0, 0, 52, 8, - 23, 90, 44, 21, 34, 4, 4, 74, 5, 112,142,120,32, 6, 127,64, 2, 194,137,21, 13, 34, 206,209,38, 61, 69, 80, 0, 19, 77, 84, 93, 0, 192,1, 32, 35, 4, 0, 0, - 2, 192,1, 32, 40, 12, 0, 0, 0, 0, 128,8, 0, 0, 0, 0, 0, 16, 64, 1, 0, 0, 0, 128,48, 2, 129,64, 64, 64, 0, 7, 0, 77, 1, 64, 1, 44, 225,96, 0, - 1, 18, 16, 64, 0, 4, 144,0, 128,16, 96, 0, 32, 16, 5, 64, 16, 0, 2, 32, 12, 44, 17, 2, 5, 128,0, 128,3, 173,22, 0, 0, 0, 0, 32, 48, 0, 2, 0, 0, + 174,44, 111,93, 132,24, 224,154,192,100,1, 0, 157,18, 200,7, 17, 128,18, 32, 40, 36, 1, 21, 1, 0, 18, 112,18, 112,109,114,0, 0, 0, 0, 0, 0, 0, 52, 8, + 23, 90, 44, 21, 34, 4, 4, 74, 5, 112,142,120,32, 6, 127,64, 2, 194,137,21, 13, 34, 206,209,38, 61, 69, 80, 0, 19, 77, 84, 93, 0, 192,1, 32, 35, 4, 0, 0, + 2, 192,1, 32, 40, 12, 0, 0, 0, 0, 128,8, 0, 0, 0, 0, 0, 16, 64, 1, 0, 0, 0, 128,48, 2, 129,64, 64, 64, 0, 7, 0, 77, 1, 64, 1, 44, 225,96, 0, + 1, 18, 16, 64, 0, 4, 144,0, 128,16, 96, 0, 32, 16, 5, 64, 16, 0, 2, 32, 12, 44, 17, 2, 5, 128,0, 128,3, 173,22, 0, 0, 0, 0, 32, 48, 0, 2, 0, 0, 0, 0, 73, 1, 0, 0, 104,1, 0, 4, 136,33, 0, 128,4, 8, 64, 0, 0, 0, 0, 0, 0, 0, 192,8, 64, 24, 2, 132,4, 0, 32, 0, 0, 0, 0, 0, 0, 4, 208, - 0, 0, 64, 6, 2, 246,35, 0, 0, 0, 20, 64, 68, 4, 229,2, 0, 4, 5, 0, 0, 0, 134,2, 0, 166,0, 0, 4, 133,0, 16, 134,80, 36, 0, 4, 1, 100,21, 1, - 2, 18, 10, 3, 64, 12, 5, 53, 0, 0, 0, 8, 0, 22, 4, 128,4, 16, 192,129,9, 146,34, 10, 0, 16, 128,105,18, 10, 73, 0, 64, 16, 4, 0, 0, 0, 3, 1, 0, - 0, 0, 128,128,10, 129,0, 80, 8, 0, 64, 0, 0, 0, 65, 0, 34, 16, 0, 0, 68, 128,4, 128,160,144,0, 8, 0, 64, 208,0, 2, 0, 0, 0, 72, 161,33, 96, 3, + 0, 0, 64, 6, 2, 246,35, 0, 0, 0, 20, 64, 68, 4, 229,2, 0, 4, 5, 0, 0, 0, 134,2, 0, 166,0, 0, 4, 133,0, 16, 134,80, 36, 0, 4, 1, 100,21, 1, + 2, 18, 10, 3, 64, 12, 5, 53, 0, 0, 0, 8, 0, 22, 4, 128,4, 16, 192,129,9, 146,34, 10, 0, 16, 128,105,18, 10, 73, 0, 64, 16, 4, 0, 0, 0, 3, 1, 0, + 0, 0, 128,128,10, 129,0, 80, 8, 0, 64, 0, 0, 0, 65, 0, 34, 16, 0, 0, 68, 128,4, 128,160,144,0, 8, 0, 64, 208,0, 2, 0, 0, 0, 72, 161,33, 96, 3, 24, 64, 3, 0, 0, 128,0, 0, 0, 164,0, 245,56, 6, 128,88, 32, 28, 131,34, 56, 128,143,128,113,18, 48, 4, 65, 49, 152,79, 16, 0, 0, 0, 0, 8, 0, 224,148, - 140,230,142,6, 102,128,91, 67, 178,17, 0, 2, 235,234,72, 176,34, 14, 216,110,115,200,130,92, 253,36, 97, 16, 1, 70, 2, 69, 8, 68, 126,135,16, 171,19, 62, 96, - 0, 128,65, 97, 0, 0, 8, 16, 0, 16, 80, 160,1, 36, 122,130,65, 38, 96, 6, 94, 143,128,225,92, 160,10, 0, 160,87, 235,72, 145,24, 0, 0, 0, 0, 54, 144,0, - 118,134,62, 100,131,33, 0, 0, 0, 0, 0, 204,1, 10, 18, 84, 161,60, 89, 8, 204,105,245,52, 142,7, 37, 252,4, 54, 184,70, 36, 9, 168,8, 0, 128,128,160,70, + 140,230,142,6, 102,128,91, 67, 178,17, 0, 2, 235,234,72, 176,34, 14, 216,110,115,200,130,92, 253,36, 97, 16, 1, 70, 2, 69, 8, 68, 126,135,16, 171,19, 62, 96, + 0, 128,65, 97, 0, 0, 8, 16, 0, 16, 80, 160,1, 36, 122,130,65, 38, 96, 6, 94, 143,128,225,92, 160,10, 0, 160,87, 235,72, 145,24, 0, 0, 0, 0, 54, 144,0, + 118,134,62, 100,131,33, 0, 0, 0, 0, 0, 204,1, 10, 18, 84, 161,60, 89, 8, 204,105,245,52, 142,7, 37, 252,4, 54, 184,70, 36, 9, 168,8, 0, 128,128,160,70, 131,16, 137,244,75, 36, 51, 100,74, 14, 60, 130,182,13, 218,88, 14, 200,0, 0, 0, 0, 0, 6, 192,72, 17, 80, 16, 112,20, 0, 64, 130,190,0, 231,41, 32, 10, 170, 97, 30, 32, 0, 42, 194,126,9, 26, 17, 183,17, 196,202,80, 38, 176,137,122,228,4, 240,14, 44, 35, 136,4, 60, 7, 2, 64, 5, 226,64, 232,55, 40, 206,46, 36, 173, 71, 22, 61, 88, 168,35, 130,3, 217,99, 1, 159,193,40, 121,168,149,200,10, 28, 234,234,8, 1, 0, 0, 0, 0, 34, 127,68, 4, 128,228,127,68, 104,130,24, 14, 160, - 79, 192,4, 95, 1, 156,109,96, 160,0, 0, 32, 41, 33, 165,210,19, 32, 20, 21, 168,235,128,68, 0, 0, 0, 129,163,3, 4, 142,33, 0, 16, 4, 0, 130,224,129,1, - 0, 128,33, 18, 200,18, 209,68, 4, 130,25, 128,1, 76, 179,130,1, 170,235,21, 80, 67, 108,2, 40, 32, 102,224,34, 8, 74, 8, 240,32, 0, 26, 68, 113,199,246,24, - 157,7, 21, 160,2, 0, 1, 0, 0, 0, 136,211,64, 30, 144,0, 73, 40, 76, 16, 148,17, 17, 1, 12, 54, 68, 30, 0, 64, 59, 192,129,17, 88, 182,132,4, 99, 209,48, - 130,200,6, 106,12, 66, 128,196,75, 21, 20, 36, 20, 40, 213,170,137,12, 0, 48, 22, 67, 112,72, 36, 40, 12, 64, 128,153,3, 144,21, 138,224,46, 1, 88, 66, 64, 80, + 79, 192,4, 95, 1, 156,109,96, 160,0, 0, 32, 41, 33, 165,210,19, 32, 20, 21, 168,235,128,68, 0, 0, 0, 129,163,3, 4, 142,33, 0, 16, 4, 0, 130,224,129,1, + 0, 128,33, 18, 200,18, 209,68, 4, 130,25, 128,1, 76, 179,130,1, 170,235,21, 80, 67, 108,2, 40, 32, 102,224,34, 8, 74, 8, 240,32, 0, 26, 68, 113,199,246,24, + 157,7, 21, 160,2, 0, 1, 0, 0, 0, 136,211,64, 30, 144,0, 73, 40, 76, 16, 148,17, 17, 1, 12, 54, 68, 30, 0, 64, 59, 192,129,17, 88, 182,132,4, 99, 209,48, + 130,200,6, 106,12, 66, 128,196,75, 21, 20, 36, 20, 40, 213,170,137,12, 0, 48, 22, 67, 112,72, 36, 40, 12, 64, 128,153,3, 144,21, 138,224,46, 1, 88, 66, 64, 80, 1, 216,34, 160,22, 226,121,132,129,0, 0, 32, 0, 20, 66, 40, 22, 16, 0, 64, 48, 83, 1, 102,76, 20, 70, 224,0, 2, 39, 71, 12, 1, 17, 0, 16, 150,7, 240,175, - 15, 73, 251,8, 32, 98, 129,28, 224,5, 0, 0, 0, 0, 0, 116,22, 67, 4, 131,69, 128,89, 37, 196,232,140,250,157,63, 49, 0, 224,1, 18, 178,38, 40, 20, 152,22, + 15, 73, 251,8, 32, 98, 129,28, 224,5, 0, 0, 0, 0, 0, 116,22, 67, 4, 131,69, 128,89, 37, 196,232,140,250,157,63, 49, 0, 224,1, 18, 178,38, 40, 20, 152,22, 9, 82, 10, 128,0, 0, 10, 8, 32, 144,13, 128,0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 112,219,10, 2, 96, 128,56, 64, 1, 0, 2, 28, 10, 84, 0, 0, 34, 200, - 0, 0, 43, 39, 0, 196,188,29, 216,57, 112,178,87, 242,129,104,156,73, 205,169,32, 243,0, 96, 16, 20, 208,56, 98, 1, 130,4, 210,117,136,4, 51, 97, 29, 6, 51, + 0, 0, 43, 39, 0, 196,188,29, 216,57, 112,178,87, 242,129,104,156,73, 205,169,32, 243,0, 96, 16, 20, 208,56, 98, 1, 130,4, 210,117,136,4, 51, 97, 29, 6, 51, 9, 2, 182,171,36, 28, 133,0, 134,0, 140,110,136,12, 106,60, 38, 208,194,247,69, 136,33, 9, 255,87, 1, 13, 173,102,70, 106,64, 96, 185,74, 142,10, 0, 2, 160, - 209,88, 253,146,8, 133,8, 12, 1, 0, 133,236,160,58, 46, 16, 192,192,201,190,26, 2, 148,6, 78, 125,0, 71, 40, 196,152,4, 66, 1, 179,20, 161,38, 238,149,51, - 38, 31, 164,14, 144,32, 27, 99, 6, 68, 249,160,98, 88, 172,1, 224,50, 105,41, 27, 105,248,0, 194,80, 2, 0, 0, 0, 0, 200,193,227,185,146,33, 148,33, 65, 88, + 209,88, 253,146,8, 133,8, 12, 1, 0, 133,236,160,58, 46, 16, 192,192,201,190,26, 2, 148,6, 78, 125,0, 71, 40, 196,152,4, 66, 1, 179,20, 161,38, 238,149,51, + 38, 31, 164,14, 144,32, 27, 99, 6, 68, 249,160,98, 88, 172,1, 224,50, 105,41, 27, 105,248,0, 194,80, 2, 0, 0, 0, 0, 200,193,227,185,146,33, 148,33, 65, 88, 152,79, 160,52, 28, 4, 9, 85, 2, 160,16, 6, 25, 22, 24, 31, 249,107,201,4, 21, 47, 44, 133,180,209,48, 24, 107,160,9, 68, 241,0, 110,0, 80, 143,202,45, 198, - 40, 16, 32, 42, 7, 66, 1, 74, 56, 8, 184,142,145,1, 0, 0, 0, 0, 8, 32, 0, 4, 139,116,8, 195,216,128,1, 18, 131,132,3, 164,165,166,194,212,29, 10, 63, - 117,211,45, 192,113,201,7, 144,0, 1, 160,0, 4, 27, 118,135,3, 130,63, 158,57, 195,169,9, 64, 22, 132,155,2, 161,44, 16, 241,51, 100,42, 157,72, 179,244,9, - 192,45, 0, 64, 8, 200,0, 66, 0, 48, 209,209,19, 155,51, 130,96, 2, 37, 7, 4, 8, 0, 83, 11, 246,204,23, 141,46, 200,27, 244,66, 96, 230,3, 53, 48, 8, 34, - 0, 0, 130,80, 164,200,31, 66, 128,0, 0, 0, 0, 0, 2, 4, 66, 0, 0, 0, 0, 7, 1, 11, 32, 32, 130,1, 0, 64, 98, 3, 100,7, 110,56, 136,237,20, 0, 0, + 40, 16, 32, 42, 7, 66, 1, 74, 56, 8, 184,142,145,1, 0, 0, 0, 0, 8, 32, 0, 4, 139,116,8, 195,216,128,1, 18, 131,132,3, 164,165,166,194,212,29, 10, 63, + 117,211,45, 192,113,201,7, 144,0, 1, 160,0, 4, 27, 118,135,3, 130,63, 158,57, 195,169,9, 64, 22, 132,155,2, 161,44, 16, 241,51, 100,42, 157,72, 179,244,9, + 192,45, 0, 64, 8, 200,0, 66, 0, 48, 209,209,19, 155,51, 130,96, 2, 37, 7, 4, 8, 0, 83, 11, 246,204,23, 141,46, 200,27, 244,66, 96, 230,3, 53, 48, 8, 34, + 0, 0, 130,80, 164,200,31, 66, 128,0, 0, 0, 0, 0, 2, 4, 66, 0, 0, 0, 0, 7, 1, 11, 32, 32, 130,1, 0, 64, 98, 3, 100,7, 110,56, 136,237,20, 0, 0, 2, 32, 0, 96, 80, 24, 8, 133,104,97, 206,141,102,72, 8, 10, 80, 180,36, 206,197,199,128,244,52, 166,3, 2, 12, 192,136,2, 64, 143,21, 188,32, 1, 160,195,152, 240,7, 32, 18, 135,56, 98, 140,41, 13, 20, 189,98, 25, 88, 40, 170,1, 0, 199,121,246,90, 0, 138,3, 4, 59, 144,34, 34, 128,118,68, 85, 111,237,8, 206,224,235, 64, 137,224,33, 138,64, 131,11, 53, 1, 199,44, 194,203,14, 8, 68, 203,98, 200,0, 64, 246,20, 16, 179,227,187,47, 8, 156,162,109,161,8, 8, 108,89, 81, 110,223, 48, 27, 230,153,91, 216,211,112,13, 201,156,249,65, 193,127,27, 96, 126,160,179,78, 39, 240,172,2, 8, 24, 220,209,33, 201,0, 140,210,191,28, 8, 144,0, 22, 134, - 230,193,203,38, 21, 35, 94, 65, 103,94, 15, 22, 134,80, 217,6, 2, 128,130,24, 200,20, 224,146,5, 0, 104,49, 134,22, 59, 224,162,28, 1, 4, 32, 0, 0, 2, 16, - 136,22, 32, 0, 2, 8, 128,0, 34, 4, 3, 64, 24, 0, 2, 0, 0, 0, 41, 0, 0, 0, 0, 128,0, 32, 132,64, 8, 2, 0, 0, 0, 52, 0, 0, 0, 0, 128,40, 8, - 25, 0, 0, 8, 0, 0, 0, 0, 0, 0, 18, 8, 0, 2, 0, 0, 0, 0, 0, 0, 64, 0, 120,97, 168,17, 96, 98, 32, 224,192,120,194,195,0, 4, 200,188,24, 0, 96, + 230,193,203,38, 21, 35, 94, 65, 103,94, 15, 22, 134,80, 217,6, 2, 128,130,24, 200,20, 224,146,5, 0, 104,49, 134,22, 59, 224,162,28, 1, 4, 32, 0, 0, 2, 16, + 136,22, 32, 0, 2, 8, 128,0, 34, 4, 3, 64, 24, 0, 2, 0, 0, 0, 41, 0, 0, 0, 0, 128,0, 32, 132,64, 8, 2, 0, 0, 0, 52, 0, 0, 0, 0, 128,40, 8, + 25, 0, 0, 8, 0, 0, 0, 0, 0, 0, 18, 8, 0, 2, 0, 0, 0, 0, 0, 0, 64, 0, 120,97, 168,17, 96, 98, 32, 224,192,120,194,195,0, 4, 200,188,24, 0, 96, 2, 20, 80, 76, 114,174,1, 80, 192,2, 32, 135,251,253,200,0, 17, 50, 82, 48, 179,14, 18, 7, 136,54, 56, 177,174,192,6, 46, 56, 27, 36, 160,24, 250,16, 230,138, - 101,0, 68, 20, 0, 0, 156,161,4, 3, 42, 1, 0, 4, 128,28, 1, 9, 65, 0, 0, 132,136,109,2, 0, 224,16, 130,4, 161,86, 74, 253,162,239,128,236,10, 1, 0, - 0, 0, 0, 1, 0, 2, 0, 129,2, 0, 133,129,8, 0, 32, 13, 65, 104,128,49, 65, 189,3, 173,46, 136,42, 112,220,228,156,129,234,12, 7, 9, 224,28, 204,44, 17, + 101,0, 68, 20, 0, 0, 156,161,4, 3, 42, 1, 0, 4, 128,28, 1, 9, 65, 0, 0, 132,136,109,2, 0, 224,16, 130,4, 161,86, 74, 253,162,239,128,236,10, 1, 0, + 0, 0, 0, 1, 0, 2, 0, 129,2, 0, 133,129,8, 0, 32, 13, 65, 104,128,49, 65, 189,3, 173,46, 136,42, 112,220,228,156,129,234,12, 7, 9, 224,28, 204,44, 17, 128,23, 115,3, 59, 34, 54, 152,95, 152,130,192,4, 142,2, 35, 96, 0, 0, 64, 0, 32, 0, 0, 0, 5, 193,5, 4, 0, 64, 35, 4, 192,128,193,2, 152,6, 4, 208, - 84, 9, 112,74, 10, 70, 72, 5, 128,65, 0, 64, 0, 129,7, 0, 108,164,240,8, 192,226,100,19, 200,138,74, 2, 60, 188,64, 65, 154,230,89, 217,136,152,153,19, 5, - 10, 12, 160,167,228,128,27, 222,125,152,0, 32, 34, 0, 8, 16, 20, 120,194,33, 0, 12, 16, 17, 129,54, 96, 0, 11, 55, 71, 6, 193,44, 211,216,46, 64, 192,168,57, - 6, 192,24, 5, 61, 203,240,250,159,33, 8, 237,8, 185,39, 32, 160,224,69, 139,8, 193,183,212,51, 106,196,82, 49, 96, 0, 64, 0, 1, 18, 1, 0, 0, 0, 64, 0, - 130,204,211,24, 36, 168,8, 104,154,108,140,128,1, 0, 166,9, 118,66, 129,0, 0, 0, 0, 128,0, 0, 128,116,116,5, 195,4, 67, 176,169,66, 26, 8, 189,131,0, + 84, 9, 112,74, 10, 70, 72, 5, 128,65, 0, 64, 0, 129,7, 0, 108,164,240,8, 192,226,100,19, 200,138,74, 2, 60, 188,64, 65, 154,230,89, 217,136,152,153,19, 5, + 10, 12, 160,167,228,128,27, 222,125,152,0, 32, 34, 0, 8, 16, 20, 120,194,33, 0, 12, 16, 17, 129,54, 96, 0, 11, 55, 71, 6, 193,44, 211,216,46, 64, 192,168,57, + 6, 192,24, 5, 61, 203,240,250,159,33, 8, 237,8, 185,39, 32, 160,224,69, 139,8, 193,183,212,51, 106,196,82, 49, 96, 0, 64, 0, 1, 18, 1, 0, 0, 0, 64, 0, + 130,204,211,24, 36, 168,8, 104,154,108,140,128,1, 0, 166,9, 118,66, 129,0, 0, 0, 0, 128,0, 0, 128,116,116,5, 195,4, 67, 176,169,66, 26, 8, 189,131,0, 210,16, 32, 179,3, 116,32, 167,29, 16, 225,52, 129,28, 16, 8, 0, 0, 1, 32, 0, 6, 0, 0, 33, 32, 0, 0, 177,0, 128,144,0, 0, 0, 0, 16, 18, 35, 126,102, - 3, 109,120,157,248,229,210,11, 12, 2, 41, 11, 141,221,49, 0, 128,0, 144,35, 109,2, 2, 70, 170,163,216,189,237,111,118,52, 231,232,42, 128,220,13, 224,16, 56, - 22, 194,51, 16, 135,0, 0, 12, 0, 0, 0, 6, 48, 71, 8, 64, 96, 200,192,0, 195,0, 111,32, 0, 128,45, 40, 72, 125,80, 128,183,121,9, 0, 192,2, 1, 0, 1, - 0, 64, 8, 160,20, 161,138,163,64, 47, 50, 128,65, 0, 50, 0, 0, 0, 0, 0, 0, 128,48, 64, 3, 56, 0, 16, 0, 0, 16, 8, 8, 64, 0, 0, 129,11, 67, 17, 0, - 0, 32, 130,36, 0, 0, 0, 16, 136,0, 2, 140,16, 200,59, 200,154,254,11, 20, 66, 0, 144,174,0, 128,64, 79, 4, 192,0, 8, 118,185,135,69, 4, 149,152,36, 24, - 38, 71, 128,40, 32, 136,34, 0, 0, 0, 0, 0, 77, 24, 142,1, 4, 4, 25, 0, 232,185,249,212,0, 0, 0, 0, 8, 6, 0, 1, 128,0, 32, 227,143,6, 12, 0, 8, - 0, 67, 115,11, 140,161,0, 25, 5, 1, 17, 0, 140,73, 200,24, 136,160,29, 16, 142,157,12, 42, 0, 0, 80, 1, 0, 0, 33, 0, 0, 1, 132,0, 0, 1, 98, 36, 46, + 3, 109,120,157,248,229,210,11, 12, 2, 41, 11, 141,221,49, 0, 128,0, 144,35, 109,2, 2, 70, 170,163,216,189,237,111,118,52, 231,232,42, 128,220,13, 224,16, 56, + 22, 194,51, 16, 135,0, 0, 12, 0, 0, 0, 6, 48, 71, 8, 64, 96, 200,192,0, 195,0, 111,32, 0, 128,45, 40, 72, 125,80, 128,183,121,9, 0, 192,2, 1, 0, 1, + 0, 64, 8, 160,20, 161,138,163,64, 47, 50, 128,65, 0, 50, 0, 0, 0, 0, 0, 0, 128,48, 64, 3, 56, 0, 16, 0, 0, 16, 8, 8, 64, 0, 0, 129,11, 67, 17, 0, + 0, 32, 130,36, 0, 0, 0, 16, 136,0, 2, 140,16, 200,59, 200,154,254,11, 20, 66, 0, 144,174,0, 128,64, 79, 4, 192,0, 8, 118,185,135,69, 4, 149,152,36, 24, + 38, 71, 128,40, 32, 136,34, 0, 0, 0, 0, 0, 77, 24, 142,1, 4, 4, 25, 0, 232,185,249,212,0, 0, 0, 0, 8, 6, 0, 1, 128,0, 32, 227,143,6, 12, 0, 8, + 0, 67, 115,11, 140,161,0, 25, 5, 1, 17, 0, 140,73, 200,24, 136,160,29, 16, 142,157,12, 42, 0, 0, 80, 1, 0, 0, 33, 0, 0, 1, 132,0, 0, 1, 98, 36, 46, 8, 34, 35, 0, 69, 41, 112,1, 32, 0, 2, 18, 0, 48, 128,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 32, 88, 48, 36, 0, 32, 16, 0, 33, 0, 0, 4, 0, 32, 132, - 8, 0, 0, 0, 128,64, 132,12, 100,136,32, 129,129,96, 140,3, 167,5, 0, 0, 132,4, 128,193,40, 72, 162,0, 82, 32, 12, 132,130,79, 27, 84, 0, 10, 136,80, 74, + 8, 0, 0, 0, 128,64, 132,12, 100,136,32, 129,129,96, 140,3, 167,5, 0, 0, 132,4, 128,193,40, 72, 162,0, 82, 32, 12, 132,130,79, 27, 84, 0, 10, 136,80, 74, 16, 160,0, 109,10, 32, 7, 4, 11, 0, 69, 0, 16, 32, 0, 72, 118,105,0, 0, 0, 0, 163,65, 6, 146,32, 0, 128,2, 4, 1, 128,164,128,64, 0, 0, 64, 128,192, 71, 8, 19, 0, 97, 4, 0, 1, 0, 16, 104,128,64, 128,30, 18, 129,244,128,1, 131,52, 3, 128,42, 194,7, 10, 10, 34, 128,8, 37, 67, 0, 51, 0, 80, 0, 0, 192, - 2, 64, 4, 72, 4, 64, 12, 0, 8, 0, 32, 32, 2, 128,40, 2, 52, 14, 11, 2, 18, 58, 18, 5, 128,42, 129,96, 8, 0, 16, 65, 0, 8, 64, 128,0, 64, 4, 0, 64, - 0, 0, 0, 44, 0, 128,16, 0, 64, 16, 0, 0, 39, 4, 32, 16, 0, 0, 4, 17, 0, 32, 0, 160,0, 0, 8, 0, 3, 119,146,146,128,3, 136,0, 8, 172,67, 82, 72, + 2, 64, 4, 72, 4, 64, 12, 0, 8, 0, 32, 32, 2, 128,40, 2, 52, 14, 11, 2, 18, 58, 18, 5, 128,42, 129,96, 8, 0, 16, 65, 0, 8, 64, 128,0, 64, 4, 0, 64, + 0, 0, 0, 44, 0, 128,16, 0, 64, 16, 0, 0, 39, 4, 32, 16, 0, 0, 4, 17, 0, 32, 0, 160,0, 0, 8, 0, 3, 119,146,146,128,3, 136,0, 8, 172,67, 82, 72, 145,52, 28, 114,17, 0, 1, 18, 104,24, 64, 162,33, 250,6, 210,164,112,4, 8, 48, 4, 48, 1, 179,119,40, 0, 10, 17, 228,216,34, 18, 168,34, 24, 32, 7, 149,226, - 1, 129,24, 0, 128,96, 18, 36, 0, 1, 16, 32, 197,69, 193,89, 30, 32, 202,1, 228,192,208,39, 45, 8, 34, 66, 161,236,58, 59, 0, 192,65, 79, 34, 71, 143,7, 32, - 216,118,46, 2, 36, 38, 135,156,121,177,241,10, 6, 25, 176,64, 8, 24, 145,0, 84, 128,98, 126,183,64, 28, 162,3, 0, 12, 2, 0, 155,147,35, 214,136,12, 40, 14, - 212,89, 64, 160,0, 34, 228,130,65, 64, 175,0, 33, 59, 82, 96, 52, 32, 8, 242,115,4, 160,76, 2, 20, 33, 200,137,9, 150,86, 0, 3, 178,4, 132,193,3, 1, 64, - 46, 111,12, 96, 120,128,4, 197,66, 5, 190,228,145,194,230,9, 12, 10, 146,27, 92, 12, 1, 64, 0, 64, 4, 0, 96, 0, 0, 0, 0, 64, 8, 174,2, 192,40, 1, 64, - 16, 128,0, 64, 17, 0, 0, 128,215,72, 8, 16, 1, 200,1, 70, 0, 0, 0, 130,168,0, 0, 32, 65, 40, 32, 0, 64, 37, 0, 0, 24, 44, 9, 20, 128,58, 242,15, 6, + 1, 129,24, 0, 128,96, 18, 36, 0, 1, 16, 32, 197,69, 193,89, 30, 32, 202,1, 228,192,208,39, 45, 8, 34, 66, 161,236,58, 59, 0, 192,65, 79, 34, 71, 143,7, 32, + 216,118,46, 2, 36, 38, 135,156,121,177,241,10, 6, 25, 176,64, 8, 24, 145,0, 84, 128,98, 126,183,64, 28, 162,3, 0, 12, 2, 0, 155,147,35, 214,136,12, 40, 14, + 212,89, 64, 160,0, 34, 228,130,65, 64, 175,0, 33, 59, 82, 96, 52, 32, 8, 242,115,4, 160,76, 2, 20, 33, 200,137,9, 150,86, 0, 3, 178,4, 132,193,3, 1, 64, + 46, 111,12, 96, 120,128,4, 197,66, 5, 190,228,145,194,230,9, 12, 10, 146,27, 92, 12, 1, 64, 0, 64, 4, 0, 96, 0, 0, 0, 0, 64, 8, 174,2, 192,40, 1, 64, + 16, 128,0, 64, 17, 0, 0, 128,215,72, 8, 16, 1, 200,1, 70, 0, 0, 0, 130,168,0, 0, 32, 65, 40, 32, 0, 64, 37, 0, 0, 24, 44, 9, 20, 128,58, 242,15, 6, 48, 178,64, 12, 196,208,3, 11, 40, 212,176,41, 52, 7, 3, 151,5, 210,57, 52, 56, 252,16, 136,11, 116,36, 101,160,28, 224,212,69, 10, 21, 192,50, 160,0, 160,200, - 72, 2, 3, 42, 0, 0, 56, 82, 32, 192,94, 46, 152,32, 189,195,29, 237,1, 20, 41, 48, 3, 5, 0, 0, 2, 6, 0, 0, 192,101,249,76, 202,1, 0, 0, 128,0, 68, + 72, 2, 3, 42, 0, 0, 56, 82, 32, 192,94, 46, 152,32, 189,195,29, 237,1, 20, 41, 48, 3, 5, 0, 0, 2, 6, 0, 0, 192,101,249,76, 202,1, 0, 0, 128,0, 68, 37, 64, 0, 16, 16, 19, 150,16, 1, 80, 52, 112,31, 212,34, 19, 83, 0, 192,31, 12, 19, 71, 0, 4, 67, 12, 0, 0, 4, 1, 1, 0, 0, 128,3, 208,86, 92, 6, 128, - 66, 12, 73, 149,219,215,156,128,118,7, 109,40, 159,203,0, 140,167,4, 68, 176,0, 94, 194,227,0, 77, 0, 68, 0, 6, 4, 64, 0, 32, 81, 67, 194,16, 49, 24, 33, - 30, 96, 32, 64, 0, 0, 18, 0, 160,128,2, 177,192,26, 137,0, 160,32, 64, 0, 64, 64, 16, 16, 194,0, 128,130,88, 78, 53, 0, 32, 72, 0, 0, 75, 0, 4, 56, 48, - 156,1, 198,35, 148,1, 1, 64, 5, 203,145,8, 188,179,51, 80, 0, 147,70, 25, 96, 20, 200,16, 96, 48, 88, 72, 69, 8, 96, 6, 130,2, 0, 24, 136,64, 38, 19, 80, - 12, 2, 64, 4, 0, 15, 64, 160,172,8, 33, 208,193,40, 35, 4, 39, 84, 22, 0, 0, 192,9, 32, 4, 0, 32, 0, 224,192,0, 32, 132,0, 32, 0, 128,0, 128,66, 40, + 66, 12, 73, 149,219,215,156,128,118,7, 109,40, 159,203,0, 140,167,4, 68, 176,0, 94, 194,227,0, 77, 0, 68, 0, 6, 4, 64, 0, 32, 81, 67, 194,16, 49, 24, 33, + 30, 96, 32, 64, 0, 0, 18, 0, 160,128,2, 177,192,26, 137,0, 160,32, 64, 0, 64, 64, 16, 16, 194,0, 128,130,88, 78, 53, 0, 32, 72, 0, 0, 75, 0, 4, 56, 48, + 156,1, 198,35, 148,1, 1, 64, 5, 203,145,8, 188,179,51, 80, 0, 147,70, 25, 96, 20, 200,16, 96, 48, 88, 72, 69, 8, 96, 6, 130,2, 0, 24, 136,64, 38, 19, 80, + 12, 2, 64, 4, 0, 15, 64, 160,172,8, 33, 208,193,40, 35, 4, 39, 84, 22, 0, 0, 192,9, 32, 4, 0, 32, 0, 224,192,0, 32, 132,0, 32, 0, 128,0, 128,66, 40, 35, 32, 128,32, 4, 34, 32, 65, 69, 80, 160,48, 46, 136,88, 76, 96, 119,98, 8, 132,76, 21, 0, 96, 0, 143,19, 160,145,0, 0, 17, 0, 4, 46, 1, 0, 0, 76, 160, - 254,42, 32, 0, 0, 18, 112,49, 0, 129,31, 126,0, 0, 0, 2, 9, 0, 0, 4, 0, 4, 0, 66, 138,32, 110,112,1, 0, 78, 128,6, 4, 11, 130,24, 28, 192,68, 0, - 8, 139,32, 73, 22, 32, 98, 8, 62, 0, 128,97, 139,210,43, 252,251,15, 16, 32, 0, 128,186,59, 32, 9, 61, 144,10, 11, 105,211,0, 0, 8, 88, 140,80, 183,226,96, - 198,252,230,17, 132,26, 192,101,40, 2, 107,144,9, 64, 181,18, 7, 32, 128,74, 62, 24, 120,160,68, 3, 106,252,174,103,212,32, 94, 64, 204,75, 16, 18, 147,51, 37, + 254,42, 32, 0, 0, 18, 112,49, 0, 129,31, 126,0, 0, 0, 2, 9, 0, 0, 4, 0, 4, 0, 66, 138,32, 110,112,1, 0, 78, 128,6, 4, 11, 130,24, 28, 192,68, 0, + 8, 139,32, 73, 22, 32, 98, 8, 62, 0, 128,97, 139,210,43, 252,251,15, 16, 32, 0, 128,186,59, 32, 9, 61, 144,10, 11, 105,211,0, 0, 8, 88, 140,80, 183,226,96, + 198,252,230,17, 132,26, 192,101,40, 2, 107,144,9, 64, 181,18, 7, 32, 128,74, 62, 24, 120,160,68, 3, 106,252,174,103,212,32, 94, 64, 204,75, 16, 18, 147,51, 37, 13, 24, 28, 84, 64, 101,17, 214,106,48, 21, 87, 9, 20, 87, 208,97, 12, 40, 187,104,2, 0, 128,72, 170,1, 4, 134,160,32, 2, 41, 0, 10, 72, 92, 0, 0, 32, 160, - 140,66, 0, 64, 40, 0, 132,0, 1, 0, 0, 32, 70, 0, 2, 16, 12, 80, 128,2, 2, 0, 4, 0, 44, 0, 168,48, 16, 6, 32, 181,154,1, 32, 164,132,97, 0, 1, 4, + 140,66, 0, 64, 40, 0, 132,0, 1, 0, 0, 32, 70, 0, 2, 16, 12, 80, 128,2, 2, 0, 4, 0, 44, 0, 168,48, 16, 6, 32, 181,154,1, 32, 164,132,97, 0, 1, 4, 28, 181,1, 127,21, 197,96, 48, 0, 54, 56, 0, 16, 81, 30, 48, 0, 1, 100,1, 0, 106,21, 0, 128,16, 0, 134,160,6, 21, 140,18, 132,225,9, 225,121,97, 24, 195, 0, 128,32, 82, 6, 16, 66, 68, 96, 80, 0, 192,128,129,16, 0, 64, 8, 1, 43, 80, 132,0, 152,64, 216,68, 8, 0, 0, 8, 73, 4, 4, 3, 136,16, 136,34, 198,199, - 134,9, 24, 84, 4, 17, 3, 65, 144,64, 32, 0, 0, 0, 0, 0, 16, 32, 36, 17, 12, 0, 0, 92, 0, 192,0, 1, 138,47, 2, 174,226,199,167,6, 156,228,13, 216,41, - 234,128,15, 36, 215,6, 90, 0, 72, 77, 18, 92, 98, 56, 28, 196,91, 7, 220,143,85, 161,81, 229,2, 23, 50, 0, 18, 0, 0, 0, 0, 0, 106,0, 212,73, 247,139,60, + 134,9, 24, 84, 4, 17, 3, 65, 144,64, 32, 0, 0, 0, 0, 0, 16, 32, 36, 17, 12, 0, 0, 92, 0, 192,0, 1, 138,47, 2, 174,226,199,167,6, 156,228,13, 216,41, + 234,128,15, 36, 215,6, 90, 0, 72, 77, 18, 92, 98, 56, 28, 196,91, 7, 220,143,85, 161,81, 229,2, 23, 50, 0, 18, 0, 0, 0, 0, 0, 106,0, 212,73, 247,139,60, 26, 247,160,8, 8, 10, 88, 162,31, 138,17, 144,164,20, 5, 177,116,0, 2, 184,8, 0, 119,252,193,26, 115,78, 147,170,120,4, 248,185,94, 102,138,64, 81, 112,176, - 33, 0, 1, 0, 52, 45, 225,223,12, 112,39, 9, 0, 113,37, 16, 52, 64, 4, 92, 131,138,32, 152,240,68, 3, 16, 0, 0, 40, 244,8, 36, 204,131,232,12, 165,117,8, - 147,115,34, 88, 80, 64, 13, 163,70, 55, 203,200,249,63, 194,9, 39, 49, 0, 0, 128,2, 7, 0, 1, 1, 0, 0, 0, 28, 0, 0, 0, 0, 17, 202,158,212,238,251,17, + 33, 0, 1, 0, 52, 45, 225,223,12, 112,39, 9, 0, 113,37, 16, 52, 64, 4, 92, 131,138,32, 152,240,68, 3, 16, 0, 0, 40, 244,8, 36, 204,131,232,12, 165,117,8, + 147,115,34, 88, 80, 64, 13, 163,70, 55, 203,200,249,63, 194,9, 39, 49, 0, 0, 128,2, 7, 0, 1, 1, 0, 0, 0, 28, 0, 0, 0, 0, 17, 202,158,212,238,251,17, 204,69, 70, 88, 106,17, 4, 88, 112,166,37, 64, 208,23, 92, 104,0, 0, 6, 178,219,211,214,47, 126,1, 134,211,217,135,181,213,60, 200,222,85, 68, 10, 7, 96, 184, 181,73, 164,197,177,133,23, 227,7, 28, 57, 12, 150,172,0, 25, 12, 136,64, 90, 128,37, 40, 110,96, 1, 110,140,51, 0, 160,11, 58, 121,191,247,12, 39, 10, 16, 147, 81, 9, 6, 16, 41, 174,96, 166,3, 38, 193,177,108,139,65, 64, 188,8, 0, 64, 41, 156,106,8, 64, 68, 193,8, 182,136,0, 96, 108,52, 142,28, 233,35, 80, 225,110, - 8, 196,129,20, 1, 52, 147,129,65, 32, 0, 17, 194,0, 0, 26, 36, 0, 172,5, 17, 67, 64, 8, 180,2, 194,49, 114,8, 103,16, 32, 0, 128,212,160,77, 66, 243,56, - 194,13, 80, 30, 128,8, 0, 32, 0, 129,0, 128,240,131,94, 15, 88, 32, 98, 226,34, 53, 2, 50, 1, 48, 132,161,0, 0, 0, 64, 0, 160,16, 162,42, 98, 0, 164,80, + 8, 196,129,20, 1, 52, 147,129,65, 32, 0, 17, 194,0, 0, 26, 36, 0, 172,5, 17, 67, 64, 8, 180,2, 194,49, 114,8, 103,16, 32, 0, 128,212,160,77, 66, 243,56, + 194,13, 80, 30, 128,8, 0, 32, 0, 129,0, 128,240,131,94, 15, 88, 32, 98, 226,34, 53, 2, 50, 1, 48, 132,161,0, 0, 0, 64, 0, 160,16, 162,42, 98, 0, 164,80, 49, 0, 250,155,136,50, 36, 4, 8, 130,26, 138,128,99, 76, 160,167,80, 231,72, 22, 86, 17, 206,19, 16, 26, 3, 0, 16, 113,6, 182,52, 128,128,32, 11, 163,113,160, - 39, 192,66, 0, 99, 0, 0, 130,140,100,252,131,32, 137,64, 231,254,192,0, 240,243,84, 16, 6, 31, 51, 0, 1, 113,124,64, 0, 0, 8, 0, 192,33, 238,195,221,6, + 39, 192,66, 0, 99, 0, 0, 130,140,100,252,131,32, 137,64, 231,254,192,0, 240,243,84, 16, 6, 31, 51, 0, 1, 113,124,64, 0, 0, 8, 0, 192,33, 238,195,221,6, 202,107,22, 138,142,165,253,132,141,251,3, 45, 156,31, 17, 107,107,96, 132,155,158,89, 185,9, 47, 112,16, 54, 138,96, 108,147,20, 44, 43, 17, 34, 18, 114,48, 227, - 2, 18, 2, 229,223,0, 63, 0, 72, 131,66, 225,29, 248,1, 68, 43, 78, 8, 204,83, 65, 229,164,210,147,163,11, 26, 16, 40, 188,0, 35, 24, 170,32, 6, 18, 7, 22, + 2, 18, 2, 229,223,0, 63, 0, 72, 131,66, 225,29, 248,1, 68, 43, 78, 8, 204,83, 65, 229,164,210,147,163,11, 26, 16, 40, 188,0, 35, 24, 170,32, 6, 18, 7, 22, 40, 227,136,14, 172,130,129,1, 3, 9, 2, 206,8, 199,137,130,23, 139,2, 245,62, 3, 1, 14, 233,66, 76, 0, 15, 51, 168,25, 217,10, 118,140,36, 80, 254,234,176, 3, 12, 193,4, 80, 8, 80, 38, 12, 0, 4, 130,18, 81, 166,67, 1, 3, 204,8, 1, 32, 8, 0, 128,147,2, 232,14, 130,75, 71, 59, 44, 0, 199,141,156,71, 128,185, - 69, 24, 201,22, 9, 24, 216,69, 204,6, 60, 226,0, 33, 6, 16, 45, 64, 10, 232,133,128,3, 38, 1, 8, 52, 240,24, 5, 86, 153,4, 0, 194,3, 4, 26, 128,137,2, + 69, 24, 201,22, 9, 24, 216,69, 204,6, 60, 226,0, 33, 6, 16, 45, 64, 10, 232,133,128,3, 38, 1, 8, 52, 240,24, 5, 86, 153,4, 0, 194,3, 4, 26, 128,137,2, 244,254,225,137,140,129,65, 2, 131,1, 5, 68, 154,130,102,176,199,34, 53, 156,102,53, 196,75, 4, 177,0, 132,128,35, 140,176,41, 4, 1, 0, 208,51, 196,178,128, 140,200,39, 237,159,179,30, 25, 13, 0, 20, 4, 128,1, 142,224,12, 1, 140,21, 33, 212,198,240,233,142,160,67, 12, 208,24, 98, 83, 17, 7, 160,24, 241,176,4, 189, - 98, 0, 6, 156,0, 1, 100,0, 0, 0, 0, 16, 2, 88, 224,129,59, 80, 38, 240,82, 150,147,32, 63, 204,9, 139,62, 0, 160,131,128,69, 10, 56, 65, 9, 241,51, 96, + 98, 0, 6, 156,0, 1, 100,0, 0, 0, 0, 16, 2, 88, 224,129,59, 80, 38, 240,82, 150,147,32, 63, 204,9, 139,62, 0, 160,131,128,69, 10, 56, 65, 9, 241,51, 96, 84, 73, 33, 136,0, 99, 163,3, 7, 81, 253,110,0, 5, 24, 32, 224,128,30, 4, 52, 45, 64, 15, 45, 49, 4, 72, 8, 162,215,3, 128,1, 177,138,165,136,0, 196,118, - 25, 8, 0, 8, 145,25, 16, 133,64, 244,30, 49, 192,148,154,15, 2, 1, 66, 152,149,2, 32, 0, 32, 68, 79, 241,34, 4, 134,36, 50, 10, 151,26, 72, 128,60, 16, 10, - 0, 178,135,74, 41, 133,4, 8, 20, 224,116,129,0, 10, 60, 25, 52, 74, 0, 32, 16, 64, 0, 0, 0, 0, 0, 4, 16, 2, 4, 4, 0, 0, 1, 4, 9, 16, 0, 68, 10, - 96, 192,148,116,0, 165,162,17, 88, 49, 168,102,0, 140,3, 18, 112,67, 177,17, 50, 96, 27, 128,181,134,73, 94, 0, 0, 0, 5, 0, 16, 0, 216,2, 8, 34, 161,34, - 4, 10, 6, 23, 241,65, 148,0, 0, 59, 142,8, 128,40, 4, 1, 19, 1, 140,2, 24, 2, 3, 16, 38, 17, 28, 167,29, 129,160,6, 8, 119,15, 57, 4, 160,0, 224,60, + 25, 8, 0, 8, 145,25, 16, 133,64, 244,30, 49, 192,148,154,15, 2, 1, 66, 152,149,2, 32, 0, 32, 68, 79, 241,34, 4, 134,36, 50, 10, 151,26, 72, 128,60, 16, 10, + 0, 178,135,74, 41, 133,4, 8, 20, 224,116,129,0, 10, 60, 25, 52, 74, 0, 32, 16, 64, 0, 0, 0, 0, 0, 4, 16, 2, 4, 4, 0, 0, 1, 4, 9, 16, 0, 68, 10, + 96, 192,148,116,0, 165,162,17, 88, 49, 168,102,0, 140,3, 18, 112,67, 177,17, 50, 96, 27, 128,181,134,73, 94, 0, 0, 0, 5, 0, 16, 0, 216,2, 8, 34, 161,34, + 4, 10, 6, 23, 241,65, 148,0, 0, 59, 142,8, 128,40, 4, 1, 19, 1, 140,2, 24, 2, 3, 16, 38, 17, 28, 167,29, 129,160,6, 8, 119,15, 57, 4, 160,0, 224,60, 38, 9, 128,46, 0, 22, 138,59, 32, 128,0, 0, 0, 11, 132,3, 9, 8, 128,2, 11, 0, 16, 6, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 128,179,32, 48, 150,26, 238, 236,3, 16, 103,24, 0, 76, 227,26, 19, 34, 230,3, 172,85, 4, 41, 24, 23, 199,15, 194,112,20, 206,33, 228,190,42, 58, 254,77, 34, 164,133,64, 140,99, 8, 222,233, 11, 65, 27, 19, 26, 36, 135,208,8, 1, 2, 0, 136,225,244,72, 14, 9, 0, 54, 242,13, 0, 0, 6, 0, 130,192,8, 4, 194,34, 64, 146,104,0, 216,32, 160,0, 128, - 79, 38, 54, 20, 10, 40, 24, 15, 21, 0, 132,112,2, 25, 97, 157,216,108,38, 38, 2, 32, 196,48, 8, 89, 128,18, 209,36, 2, 0, 97, 20, 56, 224,147,193,138,4, 16, - 64, 2, 100,4, 167,130,1, 0, 5, 140,4, 4, 83, 0, 70, 26, 48, 237,33, 7, 97, 64, 8, 252,224,48, 32, 80, 4, 52, 2, 7, 2, 208,0, 8, 119,157,122,130,1, + 79, 38, 54, 20, 10, 40, 24, 15, 21, 0, 132,112,2, 25, 97, 157,216,108,38, 38, 2, 32, 196,48, 8, 89, 128,18, 209,36, 2, 0, 97, 20, 56, 224,147,193,138,4, 16, + 64, 2, 100,4, 167,130,1, 0, 5, 140,4, 4, 83, 0, 70, 26, 48, 237,33, 7, 97, 64, 8, 252,224,48, 32, 80, 4, 52, 2, 7, 2, 208,0, 8, 119,157,122,130,1, 4, 128,28, 56, 174,65, 68, 224,171,206,215,1, 36, 73, 88, 42, 4, 225,124,162,76, 84, 101,94, 26, 40, 194,4, 1, 0, 72, 230,93, 163,10, 16, 0, 0, 160,250,161, 224,178,1, 40, 128,180,124,224,60, 76, 5, 179,31, 100,48, 16, 131,58, 153,255,20, 43, 131,4, 152,12, 4, 8, 15, 152,101,154,75, 36, 46, 88, 70, 160,41, 215,220, - 52, 77, 161,0, 136,24, 119,113,193,60, 0, 220,118,0, 17, 100,76, 148,88, 202,0, 36, 8, 16, 6, 0, 24, 4, 0, 0, 14, 0, 128,16, 3, 204,248,28, 152,4, 0, - 2, 132,12, 162,22, 17, 24, 204,7, 4, 81, 130,16, 48, 129,138,193,66, 80, 216,53, 0, 10, 92, 37, 2, 44, 80, 96, 82, 192,42, 9, 227,32, 36, 64, 197,1, 68, 8, - 37, 10, 0, 128,41, 16, 168,8, 0, 164,9, 0, 16, 31, 0, 62, 130,38, 0, 160,7, 25, 208,1, 70, 224,128,105,224,220,145,0, 80, 34, 128,192,0, 12, 64, 100,21, + 52, 77, 161,0, 136,24, 119,113,193,60, 0, 220,118,0, 17, 100,76, 148,88, 202,0, 36, 8, 16, 6, 0, 24, 4, 0, 0, 14, 0, 128,16, 3, 204,248,28, 152,4, 0, + 2, 132,12, 162,22, 17, 24, 204,7, 4, 81, 130,16, 48, 129,138,193,66, 80, 216,53, 0, 10, 92, 37, 2, 44, 80, 96, 82, 192,42, 9, 227,32, 36, 64, 197,1, 68, 8, + 37, 10, 0, 128,41, 16, 168,8, 0, 164,9, 0, 16, 31, 0, 62, 130,38, 0, 160,7, 25, 208,1, 70, 224,128,105,224,220,145,0, 80, 34, 128,192,0, 12, 64, 100,21, 2, 0, 224,36, 136,197,43, 0, 129,8, 26, 8, 128,44, 40, 36, 0, 0, 114,64, 32, 16, 0, 64, 2, 0, 0, 0, 0, 0, 18, 134,133,0, 0, 128,0, 0, 1, 64, 138, - 72, 8, 16, 52, 16, 0, 12, 16, 0, 0, 0, 64, 4, 0, 2, 0, 0, 0, 0, 0, 0, 12, 0, 0, 8, 0, 0, 0, 0, 0, 0, 8, 0, 2, 0, 0, 0, 25, 0, 128,0, - 0, 24, 24, 0, 0, 0, 0, 0, 1, 0, 0, 0, 64, 136,0, 0, 0, 0, 16, 192,2, 16, 0, 21, 1, 1, 0, 0, 0, 96, 113,243,22, 41, 0, 0, 0, 32, 128,0, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 8, 0, 32, 0, 0, 0, 0, 0, 0, 0, 64, 8, 32, 0, 0, 0, 2, 2, 0, 0, 0, 0, 128,64, 16, 0, 0, 132,83, 68, 16, - 64, 0, 0, 176,55, 32, 168,104,64, 6, 0, 0, 160,5, 16, 0, 0, 0, 2, 0, 16, 4, 67, 66, 128,32, 38, 9, 0, 116,0, 81, 244,249,100,26, 24, 222,32, 68, 52, - 2, 0, 0, 0, 0, 40, 129,132,4, 0, 0, 0, 0, 0, 32, 228,32, 12, 128,0, 84, 0, 0, 0, 198,0, 4, 0, 4, 0, 16, 6, 2, 0, 0, 0, 128,0, 132,65, 53, - 2, 6, 32, 72, 32, 62, 0, 128,50, 72, 1, 32, 16, 48, 2, 0, 32, 0, 104,27, 0, 64, 6, 163,141,144,4, 24, 72, 31, 41, 232,67, 216,2, 112,105,48, 0, 0, 0, - 160,2, 188,67, 14, 76, 0, 0, 162,160,13, 194,5, 0, 8, 0, 0, 4, 0, 64, 0, 0, 2, 0, 0, 33, 142,0, 93, 170,64, 237,227,3, 0, 68, 237,164,128,194,86, - 214,112,134,21, 98, 0, 4, 6, 34, 4, 0, 193,243,226,12, 102,183,68, 225,59, 192,140,129,140,192,1, 8, 208,96, 166,176,227,9, 0, 0, 0, 0, 128,64, 12, 0, - 0, 32, 101,4, 96, 76, 73, 8, 44, 97, 128,69, 60, 48, 54, 0, 32, 4, 128,64, 0, 0, 6, 82, 32, 0, 136,137,12, 72, 0, 0, 0, 0, 0, 0, 0, 16, 8, 0, 16, - 0, 0, 0, 0, 0, 0, 80, 0, 0, 128,160,43, 193,130,82, 209,16, 164,184,1, 53, 34, 129,226,21, 227,54, 54, 150,137,25, 100,23, 128,213,156,145,68, 10, 192,2, - 35, 194,28, 2, 165,86, 35, 42, 14, 193,192,76, 3, 41, 1, 0, 32, 0, 28, 20, 16, 16, 72, 0, 224,4, 0, 64, 155,135,208,8, 64, 0, 0, 200,48, 99, 4, 2, 1, - 68, 114,101,3, 44, 128,208,4, 144,226,0, 208,23, 163,58, 164,55, 146,194,129,16, 162,148,32, 42, 192,32, 32, 128,8, 3, 84, 20, 4, 40, 124,139,0, 156,0, 52, + 72, 8, 16, 52, 16, 0, 12, 16, 0, 0, 0, 64, 4, 0, 2, 0, 0, 0, 0, 0, 0, 12, 0, 0, 8, 0, 0, 0, 0, 0, 0, 8, 0, 2, 0, 0, 0, 25, 0, 128,0, + 0, 24, 24, 0, 0, 0, 0, 0, 1, 0, 0, 0, 64, 136,0, 0, 0, 0, 16, 192,2, 16, 0, 21, 1, 1, 0, 0, 0, 96, 113,243,22, 41, 0, 0, 0, 32, 128,0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 8, 0, 32, 0, 0, 0, 0, 0, 0, 0, 64, 8, 32, 0, 0, 0, 2, 2, 0, 0, 0, 0, 128,64, 16, 0, 0, 132,83, 68, 16, + 64, 0, 0, 176,55, 32, 168,104,64, 6, 0, 0, 160,5, 16, 0, 0, 0, 2, 0, 16, 4, 67, 66, 128,32, 38, 9, 0, 116,0, 81, 244,249,100,26, 24, 222,32, 68, 52, + 2, 0, 0, 0, 0, 40, 129,132,4, 0, 0, 0, 0, 0, 32, 228,32, 12, 128,0, 84, 0, 0, 0, 198,0, 4, 0, 4, 0, 16, 6, 2, 0, 0, 0, 128,0, 132,65, 53, + 2, 6, 32, 72, 32, 62, 0, 128,50, 72, 1, 32, 16, 48, 2, 0, 32, 0, 104,27, 0, 64, 6, 163,141,144,4, 24, 72, 31, 41, 232,67, 216,2, 112,105,48, 0, 0, 0, + 160,2, 188,67, 14, 76, 0, 0, 162,160,13, 194,5, 0, 8, 0, 0, 4, 0, 64, 0, 0, 2, 0, 0, 33, 142,0, 93, 170,64, 237,227,3, 0, 68, 237,164,128,194,86, + 214,112,134,21, 98, 0, 4, 6, 34, 4, 0, 193,243,226,12, 102,183,68, 225,59, 192,140,129,140,192,1, 8, 208,96, 166,176,227,9, 0, 0, 0, 0, 128,64, 12, 0, + 0, 32, 101,4, 96, 76, 73, 8, 44, 97, 128,69, 60, 48, 54, 0, 32, 4, 128,64, 0, 0, 6, 82, 32, 0, 136,137,12, 72, 0, 0, 0, 0, 0, 0, 0, 16, 8, 0, 16, + 0, 0, 0, 0, 0, 0, 80, 0, 0, 128,160,43, 193,130,82, 209,16, 164,184,1, 53, 34, 129,226,21, 227,54, 54, 150,137,25, 100,23, 128,213,156,145,68, 10, 192,2, + 35, 194,28, 2, 165,86, 35, 42, 14, 193,192,76, 3, 41, 1, 0, 32, 0, 28, 20, 16, 16, 72, 0, 224,4, 0, 64, 155,135,208,8, 64, 0, 0, 200,48, 99, 4, 2, 1, + 68, 114,101,3, 44, 128,208,4, 144,226,0, 208,23, 163,58, 164,55, 146,194,129,16, 162,148,32, 42, 192,32, 32, 128,8, 3, 84, 20, 4, 40, 124,139,0, 156,0, 52, 160,136,90, 139,176,8, 8, 0, 48, 1, 1, 72, 82, 67, 224,13, 6, 17, 144,29, 193,1, 68, 44, 0, 13, 195,33, 10, 17, 34, 194,198,14, 168,3, 236,158,194,163,151, - 195,116,24, 193,193,138,192,1, 132,136,19, 139,44, 167,226,7, 132,8, 136,34, 10, 200,0, 34, 224,51, 10, 128,111,128,32, 128,14, 8, 0, 4, 0, 128,80, 0, 0, - 136,10, 246,64, 0, 173,0, 0, 8, 13, 79, 128,3, 1, 32, 8, 172,8, 32, 80, 8, 6, 166,4, 202,3, 120,0, 0, 64, 129,21, 70, 116,33, 0, 0, 0, 0, 96, 24, - 129,64, 17, 134,0, 16, 0, 129,1, 16, 0, 4, 0, 0, 0, 0, 65, 4, 1, 192,131,17, 32, 0, 32, 0, 0, 32, 64, 96, 1, 0, 64, 0, 0, 128,33, 144,144,42, 77, - 0, 44, 254,100,136,129,132,34, 3, 0, 10, 64, 0, 22, 64, 2, 0, 28, 184,48, 44, 69, 12, 64, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 36, 134,90, 59, 101,17, 66, - 0, 38, 36, 11, 20, 0, 0, 0, 0, 0, 0, 4, 216,8, 222,47, 4, 64, 0, 0, 0, 70, 21, 1, 0, 16, 85, 5, 0, 75, 140,4, 160,32, 16, 65, 48, 186,41, 1, 24, - 240,32, 41, 20, 13, 33, 0, 0, 0, 17, 0, 0, 0, 130,137,105,81, 6, 8, 112,236,31, 84, 2, 0, 0, 224,22, 61, 64, 48, 34, 81, 128,16, 5, 91, 61, 76, 0, 0, + 195,116,24, 193,193,138,192,1, 132,136,19, 139,44, 167,226,7, 132,8, 136,34, 10, 200,0, 34, 224,51, 10, 128,111,128,32, 128,14, 8, 0, 4, 0, 128,80, 0, 0, + 136,10, 246,64, 0, 173,0, 0, 8, 13, 79, 128,3, 1, 32, 8, 172,8, 32, 80, 8, 6, 166,4, 202,3, 120,0, 0, 64, 129,21, 70, 116,33, 0, 0, 0, 0, 96, 24, + 129,64, 17, 134,0, 16, 0, 129,1, 16, 0, 4, 0, 0, 0, 0, 65, 4, 1, 192,131,17, 32, 0, 32, 0, 0, 32, 64, 96, 1, 0, 64, 0, 0, 128,33, 144,144,42, 77, + 0, 44, 254,100,136,129,132,34, 3, 0, 10, 64, 0, 22, 64, 2, 0, 28, 184,48, 44, 69, 12, 64, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 36, 134,90, 59, 101,17, 66, + 0, 38, 36, 11, 20, 0, 0, 0, 0, 0, 0, 4, 216,8, 222,47, 4, 64, 0, 0, 0, 70, 21, 1, 0, 16, 85, 5, 0, 75, 140,4, 160,32, 16, 65, 48, 186,41, 1, 24, + 240,32, 41, 20, 13, 33, 0, 0, 0, 17, 0, 0, 0, 130,137,105,81, 6, 8, 112,236,31, 84, 2, 0, 0, 224,22, 61, 64, 48, 34, 81, 128,16, 5, 91, 61, 76, 0, 0, 0, 0, 64, 0, 2, 128,46, 96, 65, 0, 0, 0, 0, 2, 0, 0, 1, 89, 134,20, 10, 52, 32, 0, 0, 34, 2, 0, 96, 74, 244,7, 0, 0, 8, 0 }; static const unsigned int ChildLocs[185261] = { - 310, 321, 326, 340, 583, 585, 591, 597, 1, 2, 7, 3104, 3376, 3665, 3911, 4077, 4337, 4598, 4774, 4780, 4790, 8, 23, 48, 74, 86, 95, - 107, 121, 133, 140, 145, 156, 164, 187, 194, 203, 225, 227, 238, 271, 283, 285, 292, 82737,302, 306, 84250,311, 312, 313, 314, 318, 315, - 316, 317, 319, 320, 322, 323, 324, 325, 327, 333, 328, 329, 330, 331, 332, 334, 335, 336, 337, 338, 339, 341, 344, 344, 344, 344, 344, - 344, 344, 346, 368, 391, 405, 411, 415, 429, 441, 451, 461, 463, 467, 474, 480, 494, 512, 526, 528, 532, 552, 564, 567, 569, 579, 342, - 343, 345, 347, 349, 352, 358, 364, 366, 348, 317, 350, 351, 353, 357, 354, 355, 356, 359, 317, 360, 361, 362, 363, 317, 365, 367, 317, - 317, 369, 374, 382, 383, 385, 386, 381, 370, 371, 317, 372, 373, 375, 381, 376, 377, 378, 379, 380, 384, 343, 387, 388, 389, 390, 392, - 394, 397, 398, 402, 393, 395, 396, 399, 400, 401, 403, 317, 404, 406, 407, 409, 408, 317, 390, 410, 363, 412, 317, 413, 414, 416, 420, - 422, 423, 428, 417, 419, 418, 421, 343, 317, 381, 317, 351, 424, 427, 425, 426, 430, 434, 435, 438, 431, 317, 432, 433, 317, 436, 356, - 437, 439, 440, 381, 363, 442, 444, 445, 449, 450, 443, 356, 343, 356, 343, 317, 390, 446, 447, 448, 370, 343, 317, 393, 317, 452, 453, - 454, 455, 456, 457, 458, 459, 460, 384, 462, 412, 464, 466, 465, 468, 469, 470, 317, 473, 370, 356, 381, 343, 471, 343, 372, 472, 317, - 466, 433, 382, 371, 356, 381, 343, 317, 475, 476, 477, 400, 401, 343, 317, 349, 478, 343, 381, 419, 479, 481, 483, 491, 492, 482, 459, - 432, 484, 485, 486, 487, 488, 489, 490, 350, 317, 317, 493, 317, 317, 433, 390, 495, 499, 500, 501, 502, 419, 505, 350, 496, 497, 498, - 317, 490, 317, 370, 503, 504, 317, 506, 507, 508, 509, 510, 511, 513, 516, 517, 522, 524, 514, 515, 518, 317, 381, 350, 519, 520, 521, - 523, 525, 343, 527, 529, 530, 531, 380, 317, 371, 439, 433, 533, 534, 537, 343, 540, 543, 544, 546, 547, 465, 535, 536, 538, 396, 439, - 539, 541, 542, 317, 498, 381, 343, 317, 545, 548, 549, 317, 343, 550, 551, 553, 554, 555, 559, 560, 561, 332, 381, 556, 557, 558, 356, - 317, 562, 343, 563, 565, 566, 568, 570, 571, 572, 575, 577, 317, 317, 350, 380, 381, 381, 573, 574, 317, 317, 576, 390, 501, 578, 580, - 581, 390, 317, 582, 382, 317, 584, 586, 342, 587, 588, 351, 343, 589, 590, 592, 593, 594, 595, 596, 598, 599, 426, 606, 609, 539, 613, - 600, 601, 602, 603, 604, 605, 607, 608, 610, 612, 608, 611, 614, 317, 345, 615, 622, 676, 782, 845, 856, 871, 884, 902, 917, 938, 959, - 966, 967, 972, 983, 988, 994, 999, 1001, 616, 617, 618, 619, 621, 620, 623, 650, 654, 621, 655, 656, 657, 665, 666, 674, 624, 636, 317, - 317, 317, 317, 638, 317, 643, 625, 317, 317, 631, 634, 626, 317, 317, 317, 317, 317, 317, 317, 317, 370, 627, 317, 317, 317, 317, 317, - 628, 317, 317, 629, 317, 630, 632, 633, 635, 637, 639, 640, 641, 642, 644, 646, 645, 647, 648, 649, 317, 620, 651, 652, 653, 317, 658, - 660, 620, 662, 663, 659, 661, 664, 317, 667, 670, 668, 669, 621, 671, 672, 673, 675, 677, 719, 725, 742, 749, 765, 768, 774, 678, 687, - 697, 701, 705, 708, 711, 715, 679, 685, 621, 356, 680, 621, 621, 621, 681, 682, 683, 684, 317, 317, 317, 317, 317, 317, 317, 317, 317, - 317, 686, 681, 681, 688, 695, 689, 690, 317, 691, 692, 693, 694, 696, 698, 699, 700, 702, 703, 704, 706, 707, 694, 621, 709, 710, 712, - 713, 714, 427, 317, 716, 717, 718, 720, 721, 724, 722, 723, 726, 741, 727, 733, 728, 729, 730, 731, 732, 734, 737, 735, 736, 738, 739, - 740, 743, 744, 746, 745, 747, 748, 750, 751, 757, 759, 752, 753, 754, 755, 756, 758, 760, 762, 761, 317, 756, 763, 764, 766, 767, 769, - 770, 771, 772, 773, 775, 776, 777, 778, 779, 780, 781, 783, 825, 834, 836, 843, 784, 788, 793, 798, 802, 806, 811, 816, 820, 785, 786, - 787, 682, 317, 789, 790, 791, 792, 621, 794, 795, 796, 797, 799, 800, 801, 682, 803, 804, 805, 682, 807, 808, 809, 810, 812, 813, 814, - 815, 817, 818, 819, 810, 821, 822, 823, 824, 826, 831, 827, 828, 829, 830, 832, 833, 835, 837, 840, 838, 839, 841, 842, 844, 846, 852, - 847, 848, 851, 709, 317, 849, 850, 694, 637, 853, 854, 855, 857, 621, 863, 867, 868, 858, 861, 649, 649, 859, 860, 649, 637, 862, 864, - 635, 865, 866, 869, 870, 872, 873, 877, 874, 317, 875, 876, 878, 879, 880, 881, 882, 883, 885, 890, 893, 898, 886, 317, 887, 317, 888, - 889, 891, 892, 894, 896, 895, 897, 899, 900, 901, 903, 908, 909, 913, 913, 904, 907, 317, 905, 317, 906, 673, 673, 910, 911, 912, 914, - 915, 916, 918, 925, 929, 935, 937, 919, 907, 923, 920, 921, 922, 317, 924, 708, 926, 927, 928, 930, 932, 931, 933, 934, 936, 939, 948, - 940, 942, 946, 941, 943, 833, 944, 945, 947, 949, 950, 696, 958, 951, 957, 952, 953, 954, 955, 956, 960, 961, 962, 963, 964, 965, 968, - 969, 970, 971, 973, 979, 974, 975, 976, 977, 978, 980, 981, 982, 984, 345, 985, 986, 987, 989, 990, 991, 992, 993, 995, 996, 997, 998, - 1000, 1002, 1003, 1004, 1005, 1008, 1010, 1012, 1014, 1081, 3, 1555, 1634, 1698, 1768, 1781, 1813, 1839, 1963, 2030, 2082, 2129, 2153, 2172, 2200, 2228, 2253, - 2262, 2294, 2302, 2318, 2358, 2370, 2375, 2421, 2504, 2523, 2578, 2598, 2606, 2614, 2636, 2650, 2657, 1006, 1007, 1009, 427, 1011, 1011, 412, 1013, 339, 1015, - 1034, 1045, 1061, 1062, 1066, 1067, 545, 1069, 1071, 1072, 427, 339, 966, 1075, 427, 427, 1079, 390, 1016, 1019, 1021, 1024, 1025, 1026, 317, 1029, 1025, - 317, 1030, 317, 390, 1031, 1017, 317, 390, 1018, 317, 781, 706, 1020, 1022, 1023, 621, 1027, 1028, 1027, 317, 1032, 1033, 1035, 1040, 1043, 317, 317, - 381, 1036, 842, 936, 1037, 1039, 637, 707, 1038, 1041, 637, 1042, 1044, 605, 1046, 317, 317, 317, 1053, 356, 1047, 1048, 740, 1049, 317, 317, 1050, - 1051, 1052, 1054, 1055, 1056, 1057, 1058, 1060, 1059, 317, 356, 1063, 390, 1064, 1065, 427, 390, 1068, 390, 694, 356, 1070, 648, 390, 1073, 1074, 1076, - 1077, 1078, 1080, 1082, 1097, 1139, 1163, 1170, 1172, 1174, 1175, 1176, 1181, 1186, 1187, 1190, 1194, 511, 427, 1195, 390, 1083, 1085, 317, 1088, 1090, 1093, - 1095, 317, 317, 390, 1084, 1086, 1087, 320, 1089, 1091, 1092, 673, 621, 1094, 1096, 1098, 1101, 1118, 1132, 1131, 672, 1133, 1134, 1136, 317, 390, 1137, - 1099, 1100, 1102, 1111, 1114, 631, 634, 1116, 1103, 1110, 1113, 317, 317, 1104, 317, 1109, 317, 317, 317, 1105, 317, 317, 317, 1106, 317, 1107, 1108, - 1112, 1115, 1117, 1119, 1123, 1120, 710, 1121, 1122, 1124, 1125, 317, 317, 1126, 1127, 620, 1128, 317, 1129, 1130, 928, 490, 316, 1135, 1138, 317, 1140, - 1152, 317, 1161, 390, 1141, 1144, 1150, 1142, 1143, 1145, 621, 637, 1146, 740, 1109, 1059, 1147, 1148, 317, 1149, 1151, 1153, 1156, 1154, 1155, 1157, 1158, - 1159, 1160, 1162, 1164, 1169, 390, 637, 320, 1165, 1166, 1167, 1168, 637, 694, 1171, 390, 637, 694, 673, 1173, 390, 637, 633, 928, 656, 390, 928, - 390, 1177, 1178, 390, 637, 637, 1179, 1180, 1182, 1185, 390, 1183, 1184, 637, 740, 694, 928, 317, 1188, 1189, 1191, 1192, 1193, 1196, 637, 1197, 1198, - 1206, 1231, 4, 1488, 1500, 1505, 1509, 1512, 1513, 1514, 1520, 1075, 1523, 1527, 1532, 1533, 1550, 390, 1199, 1200, 1201, 317, 1200, 1205, 966, 427, 390, - 1202, 1203, 1204, 1207, 1210, 1213, 1221, 1226, 317, 1229, 381, 1208, 1209, 1211, 1212, 1214, 1217, 490, 1065, 1215, 1216, 740, 621, 1218, 1220, 1219, 1222, - 866, 1223, 1224, 1225, 1227, 1228, 1230, 1232, 1235, 317, 317, 356, 1233, 1234, 1236, 1237, 739, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1256, 1263, - 5, 1398, 1406, 1417, 1421, 1422, 1425, 1431, 1435, 1436, 1443, 1445, 1452, 1454, 1455, 1457, 958, 1461, 1477, 1478, 1479, 1480, 1483, 1484, 1486, 621, 949, - 649, 1246, 1247, 317, 1248, 1250, 1251, 736, 1252, 317, 317, 1253, 317, 317, 317, 1249, 317, 1254, 1255, 1257, 1258, 1261, 317, 651, 317, 1259, 317, - 1260, 1262, 317, 736, 1264, 651, 1277, 633, 1265, 1018, 1266, 1268, 317, 1272, 317, 317, 317, 1273, 317, 317, 317, 1267, 1269, 1270, 1271, 1108, 317, - 1274, 1275, 1276, 1278, 1279, 1282, 1283, 1284, 6, 1374, 1375, 1377, 1378, 1380, 1384, 1386, 1396, 1394, 317, 1028, 1280, 1281, 317, 1065, 620, 317, 1160, - 1000, 1285, 317, 317, 1286, 1287, 317, 1288, 1290, 1293, 1294, 1296, 1299, 1352, 317, 1354, 1355, 317, 317, 317, 317, 317, 317, 317, 317, 317, 1361, - 317, 317, 1362, 1275, 1347, 1369, 317, 317, 317, 1371, 1289, 1291, 1292, 317, 620, 739, 1295, 1297, 317, 1298, 1018, 1300, 619, 936, 1301, 1303, 1306, - 1338, 1339, 317, 1340, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 1341, 1346, 1347, 317, 317, 317, 317, 317, - 1348, 1302, 317, 1304, 317, 1305, 317, 317, 619, 1307, 1310, 1025, 1109, 317, 317, 317, 317, 317, 317, 1333, 317, 317, 317, 317, 317, 317, 317, - 1308, 1309, 317, 317, 619, 1311, 1313, 317, 317, 317, 317, 317, 317, 1332, 317, 317, 317, 1312, 317, 317, 1314, 1322, 619, 1317, 1323, 1324, 317, - 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 1326, 317, 317, 317, 317, 317, 317, 317, 1330, 1315, 1316, 317, 317, 317, - 317, 317, 317, 1318, 317, 317, 1321, 317, 1316, 1108, 1319, 1320, 1160, 1267, 1109, 339, 1325, 1108, 1059, 1327, 1328, 1329, 1331, 317, 1334, 1335, 1336, - 1337, 1155, 317, 1109, 1331, 1325, 1108, 1059, 1342, 1343, 1344, 1345, 351, 317, 1349, 1100, 1350, 1351, 317, 1353, 1205, 317, 317, 1356, 1359, 1357, 1358, - 1360, 1363, 1059, 1365, 1364, 1366, 1367, 1368, 317, 1370, 1372, 1373, 1376, 1379, 317, 1381, 1382, 1383, 1385, 1108, 317, 1387, 1388, 1389, 1390, 1345, 1391, - 1392, 1393, 1395, 1276, 1397, 740, 1399, 1401, 1404, 320, 1400, 317, 1402, 317, 1403, 317, 1405, 317, 740, 1407, 694, 1412, 1413, 1408, 1409, 1028, 317, - 317, 317, 1410, 1411, 317, 649, 637, 1414, 317, 1415, 1416, 317, 1271, 673, 1418, 1419, 1420, 317, 320, 649, 621, 866, 651, 649, 1423, 1424, 949, - 936, 866, 490, 1426, 1428, 1429, 1427, 317, 949, 317, 949, 1430, 936, 367, 1432, 1433, 1434, 363, 382, 381, 1437, 1438, 1439, 1440, 1441, 1442, 1444, - 384, 1446, 1447, 1448, 1449, 1450, 1451, 367, 1453, 381, 356, 428, 1456, 1458, 427, 1460, 1459, 317, 949, 936, 1462, 1464, 1465, 1463, 949, 315, 949, - 1466, 1468, 1467, 1266, 936, 1469, 1471, 945, 1475, 1470, 1472, 1473, 1474, 1476, 317, 356, 351, 345, 316, 1481, 1482, 949, 1243, 351, 605, 316, 1485, - 320, 317, 1487, 1108, 1489, 1490, 1493, 1497, 767, 390, 1491, 740, 1492, 694, 651, 1494, 1495, 1496, 1498, 1499, 620, 1501, 1502, 936, 1503, 1504, 339, - 390, 427, 649, 633, 621, 1506, 390, 1507, 1508, 1087, 1510, 390, 694, 1511, 620, 332, 390, 1220, 390, 1515, 1516, 1517, 1518, 1519, 1521, 1522, 1524, - 1525, 1526, 1528, 1529, 1530, 1531, 384, 1230, 317, 1534, 1538, 1535, 1536, 1537, 1539, 1541, 1546, 1549, 1540, 1542, 1543, 1544, 1545, 1547, 1548, 1551, 1554, - 1552, 1553, 1060, 511, 1556, 1561, 1566, 1581, 1589, 1598, 1622, 1630, 1633, 545, 390, 907, 1199, 1557, 708, 317, 317, 317, 390, 1558, 1559, 1560, 1093, - 1562, 1564, 1565, 381, 1563, 1087, 740, 842, 1132, 1567, 1577, 1042, 1578, 356, 1568, 1572, 1575, 1569, 1570, 1571, 1573, 1574, 1576, 1579, 1580, 1582, 1583, - 1586, 356, 651, 633, 1584, 1585, 1587, 1588, 1501, 1590, 1595, 390, 320, 1591, 1592, 724, 317, 1593, 317, 317, 317, 1594, 1596, 1597, 1599, 1577, 1602, - 1603, 1604, 390, 1600, 1601, 1605, 1607, 1609, 633, 1611, 1606, 1608, 1610, 317, 633, 317, 1612, 1614, 1616, 317, 1619, 1620, 1621, 317, 317, 1613, 1059, - 1615, 1617, 1618, 1623, 1625, 1629, 390, 1624, 1626, 1628, 1627, 621, 651, 1631, 1632, 390, 694, 740, 620, 390, 1635, 1641, 1649, 1654, 1658, 1659, 1663, - 1664, 1684, 1687, 1691, 390, 1692, 1694, 1636, 649, 649, 1637, 1640, 390, 920, 317, 1638, 1639, 735, 317, 708, 1642, 1645, 1648, 381, 1643, 1644, 694, - 1646, 1647, 1650, 1653, 356, 621, 1651, 1652, 1655, 1656, 1132, 356, 621, 317, 1657, 620, 1115, 390, 1660, 1661, 1662, 390, 756, 390, 1655, 949, 1665, - 1669, 1672, 1673, 1674, 1681, 390, 1666, 1667, 1668, 1670, 1671, 756, 661, 1675, 1678, 1676, 317, 1677, 661, 1679, 1680, 317, 1682, 1683, 345, 1685, 390, - 1686, 649, 345, 1688, 1689, 936, 390, 1690, 1693, 1695, 1696, 1697, 1699, 1705, 1712, 1719, 1723, 1729, 1733, 1734, 1736, 1740, 966, 1764, 390, 1700, 1199, - 1093, 1701, 1704, 317, 390, 1702, 317, 1703, 637, 621, 708, 861, 620, 1706, 1709, 381, 1707, 1708, 1710, 1711, 345, 1713, 1716, 356, 1714, 1715, 1717, - 1718, 345, 1720, 1577, 1721, 844, 1585, 1722, 356, 345, 1724, 390, 1726, 1725, 1727, 1728, 345, 1730, 1131, 427, 390, 1731, 1732, 345, 390, 345, 1722, - 1735, 390, 345, 1737, 390, 1738, 1739, 1741, 949, 661, 1742, 1747, 1748, 1750, 1758, 1761, 390, 621, 1735, 317, 1743, 1744, 317, 949, 724, 1745, 317, - 1746, 317, 317, 694, 317, 1749, 1160, 673, 1751, 633, 1752, 1018, 1753, 1754, 1755, 317, 1746, 637, 317, 317, 317, 317, 710, 649, 1756, 317, 1757, - 320, 1759, 1160, 1760, 1762, 651, 1763, 1765, 1766, 1767, 1769, 1770, 1771, 1772, 1773, 1774, 1776, 1777, 1733, 1733, 1778, 427, 390, 345, 715, 390, 1199, - 1228, 381, 345, 1220, 356, 345, 356, 345, 743, 1212, 390, 345, 1775, 390, 345, 1087, 390, 345, 1234, 390, 1779, 1780, 1782, 1788, 1797, 1772, 1733, - 1733, 1803, 1805, 1810, 1811, 390, 345, 1783, 1200, 1200, 1784, 649, 390, 1027, 367, 317, 1785, 1786, 1787, 1789, 1792, 1796, 381, 1790, 1791, 1793, 1794, - 1795, 345, 773, 1798, 1800, 1801, 356, 1799, 1802, 345, 1804, 390, 345, 1806, 317, 672, 390, 1807, 1808, 1809, 345, 620, 390, 345, 1812, 390, 649, - 740, 1814, 1816, 1818, 1823, 1825, 1733, 1828, 1831, 1832, 1733, 1835, 390, 345, 1199, 1815, 1093, 966, 390, 695, 317, 345, 1817, 381, 345, 1819, 1821, - 1489, 356, 1820, 1822, 345, 1824, 356, 345, 1826, 390, 1827, 345, 1829, 390, 1830, 345, 928, 842, 390, 345, 1833, 390, 1834, 1836, 1837, 1838, 1840, - 1841, 1844, 1854, 1867, 1868, 1872, 1875, 1890, 1922, 1953, 1955, 1960, 345, 649, 1199, 317, 390, 1842, 1843, 381, 345, 1845, 1848, 356, 1846, 1847, 1849, - 1850, 1851, 1852, 1853, 345, 1855, 1861, 1865, 940, 356, 1856, 1857, 1858, 1859, 1860, 1862, 1864, 1863, 1866, 345, 940, 390, 1655, 1869, 1870, 1871, 345, - 620, 620, 620, 1873, 756, 390, 621, 621, 1874, 1876, 1877, 1879, 1882, 669, 1884, 1886, 620, 1888, 781, 390, 621, 621, 317, 681, 1878, 621, 1880, - 1881, 621, 1883, 1885, 1883, 621, 1887, 1889, 1891, 1895, 1898, 1901, 1903, 1904, 1908, 1916, 1918, 1920, 621, 1892, 621, 317, 1893, 1894, 621, 1896, 1897, - 1899, 1896, 1900, 1902, 1094, 1900, 621, 1096, 1900, 1902, 1905, 621, 1900, 317, 1906, 1907, 1909, 1027, 621, 1900, 1910, 1914, 1911, 1912, 1913, 1915, 1917, - 1900, 1919, 621, 1900, 621, 1921, 621, 1900, 339, 317, 1722, 1923, 1925, 1927, 1930, 1933, 1938, 1944, 1951, 1952, 390, 1924, 621, 621, 317, 651, 1926, - 621, 1928, 1638, 1929, 649, 1931, 1638, 1932, 1934, 621, 1935, 621, 1638, 1936, 1937, 1939, 1940, 1638, 1941, 1942, 1943, 1945, 621, 1638, 489, 1946, 1947, - 1948, 1949, 1950, 619, 351, 1954, 1956, 1957, 1958, 1959, 1961, 1962, 1964, 1984, 1988, 1993, 1995, 1997, 2002, 2005, 515, 2013, 2016, 2025, 1965, 1972, 1977, - 1966, 1967, 1968, 1969, 1970, 1971, 1973, 1974, 1975, 1976, 1978, 1979, 1980, 1981, 1982, 1983, 1985, 1986, 1987, 1989, 317, 1990, 1991, 1992, 1994, 476, 551, - 1996, 1998, 2000, 1999, 2001, 2003, 350, 2004, 2006, 2010, 2007, 2008, 2009, 2011, 2012, 2014, 2015, 2017, 2021, 2023, 2018, 2019, 2020, 2022, 1962, 2024, 2026, - 2027, 2028, 2029, 2031, 2040, 2045, 2048, 2061, 2064, 2068, 2072, 370, 2032, 2021, 2033, 2034, 2037, 2038, 450, 476, 350, 2035, 2036, 2039, 550, 2041, 2042, - 2043, 2044, 2046, 351, 317, 2047, 2049, 2055, 2057, 2059, 2050, 388, 2052, 2054, 2051, 384, 382, 2053, 2056, 404, 317, 2058, 390, 2060, 2062, 2063, 343, - 371, 349, 2065, 2067, 2066, 350, 350, 2069, 362, 2071, 2070, 596, 2073, 2074, 2075, 349, 2079, 2076, 2077, 2078, 2080, 2081, 2083, 2089, 2093, 2095, 2106, - 2109, 2120, 2084, 2085, 2088, 2086, 501, 2087, 370, 2058, 2090, 2091, 2092, 2094, 2096, 2099, 2101, 2103, 514, 2097, 2098, 345, 343, 2100, 448, 349, 370, - 2102, 2104, 2105, 2107, 2108, 2110, 371, 2111, 2112, 2114, 2115, 2118, 2113, 2058, 350, 2116, 2117, 2119, 2121, 2122, 2125, 2127, 1453, 370, 2123, 2124, 2126, - 2128, 2130, 2136, 2139, 2140, 2144, 2149, 2074, 2131, 2132, 2133, 2135, 382, 350, 2134, 2137, 2138, 317, 378, 2141, 371, 2143, 2142, 662, 2145, 2147, 2146, - 565, 2148, 2150, 541, 2151, 2152, 2154, 2157, 2158, 2162, 2164, 2169, 2155, 2156, 2159, 2160, 2161, 2163, 2165, 2166, 2167, 2168, 2170, 2171, 2173, 2175, 2179, - 2182, 2185, 2189, 2192, 2197, 545, 2174, 566, 2176, 2177, 2178, 2180, 2181, 343, 2183, 2184, 2186, 2188, 2187, 2188, 2190, 2191, 2193, 2194, 2196, 317, 2195, - 1230, 439, 2198, 2199, 2201, 2209, 2213, 2217, 2220, 2223, 2226, 2202, 2204, 2207, 2203, 2205, 2206, 2208, 2210, 2212, 2211, 2214, 2215, 2216, 2218, 2219, 2033, - 2221, 2222, 439, 501, 2224, 2225, 2227, 2229, 2234, 2237, 2241, 2245, 2248, 2152, 443, 2230, 2232, 2231, 2022, 370, 2146, 363, 2233, 2071, 2142, 2235, 2236, - 2238, 2239, 2240, 2242, 350, 2004, 2243, 2244, 393, 2246, 2247, 350, 2249, 2250, 2251, 2252, 2254, 2255, 2259, 388, 2256, 2257, 2258, 2260, 2261, 2263, 2267, - 2273, 2281, 2285, 2292, 2264, 2265, 2266, 2268, 343, 596, 2270, 2269, 343, 404, 2271, 2272, 2274, 2276, 448, 2278, 2275, 2277, 2279, 345, 2280, 2282, 2283, - 2284, 2286, 596, 2288, 2289, 2287, 370, 404, 2290, 2291, 2293, 2027, 2295, 2296, 2297, 2299, 2301, 2298, 382, 397, 2300, 2303, 2307, 2311, 2312, 2313, 2316, - 2304, 2305, 2306, 2308, 2309, 2310, 471, 2004, 372, 2070, 2314, 2315, 1347, 589, 2317, 2319, 2331, 2337, 2342, 2344, 2352, 2244, 2320, 2323, 2324, 349, 2325, - 2329, 2058, 339, 2321, 2322, 2272, 1020, 2326, 2327, 2328, 2330, 2332, 2334, 2335, 2333, 2336, 1020, 2338, 343, 2340, 2339, 2022, 2134, 428, 2341, 351, 404, - 2343, 418, 2345, 2347, 2348, 419, 2349, 370, 2022, 349, 2346, 2035, 317, 2058, 343, 2350, 343, 2351, 2353, 2354, 2356, 2355, 2357, 2359, 2361, 2363, 2365, - 2367, 2360, 2362, 1962, 2364, 2366, 2368, 2369, 2371, 2372, 2373, 2374, 2376, 2378, 2392, 2397, 2400, 2404, 2407, 2411, 2414, 2417, 2377, 2379, 2380, 2382, 2384, - 2390, 2381, 2383, 350, 596, 2385, 2386, 2388, 2387, 2389, 2391, 2393, 2395, 465, 350, 2394, 385, 2396, 2398, 2399, 2401, 2403, 748, 2402, 2405, 2406, 2408, - 2409, 350, 2410, 2412, 514, 2413, 2415, 2416, 2418, 515, 2420, 2419, 2422, 2425, 2440, 2446, 2493, 2494, 2423, 2424, 739, 2426, 2427, 2432, 2433, 2428, 2429, - 2430, 2431, 2434, 2435, 2436, 2437, 2438, 2439, 2441, 2442, 2443, 2444, 2445, 2447, 2457, 313, 2460, 2448, 2449, 2450, 2451, 2452, 2453, 2454, 2455, 2456, 2458, - 2459, 2461, 2463, 2465, 2475, 314, 2477, 2478, 2481, 2492, 2462, 2464, 2466, 2467, 2468, 2469, 2470, 2471, 2472, 2473, 2474, 2476, 2479, 2480, 1373, 2482, 2483, - 2484, 2485, 2486, 2487, 2488, 2489, 2490, 2491, 2495, 2498, 2496, 2497, 317, 2499, 2500, 2501, 317, 317, 317, 2502, 2503, 2505, 2513, 2514, 2516, 2522, 2506, - 2507, 2508, 2512, 2509, 2511, 2510, 2515, 1998, 2517, 2519, 2518, 381, 317, 317, 2520, 2521, 596, 397, 2524, 2529, 2534, 2538, 2544, 2548, 2552, 2553, 2554, - 2556, 2559, 2562, 2569, 2525, 2526, 2527, 2528, 2530, 418, 2531, 2533, 2532, 2535, 349, 2536, 381, 2537, 2539, 2540, 2542, 2541, 1428, 2543, 2545, 2546, 2547, - 2402, 371, 2549, 541, 2550, 2551, 2405, 1915, 2555, 2557, 2558, 2560, 2561, 566, 2317, 2317, 498, 2074, 2563, 2565, 2567, 2564, 1588, 565, 2298, 2381, 2566, - 343, 2568, 2570, 565, 2152, 2573, 2574, 2577, 2571, 2572, 2575, 2576, 2579, 2580, 2582, 2587, 2592, 2594, 2596, 2581, 381, 348, 2583, 2585, 2586, 362, 2584, - 2588, 2591, 343, 345, 2589, 2590, 2510, 350, 2593, 2595, 384, 2597, 332, 373, 2599, 2600, 2602, 2420, 2604, 2601, 2603, 2605, 2607, 2610, 2611, 2613, 350, - 2608, 2609, 2612, 511, 2615, 2625, 2627, 2628, 2634, 2635, 2616, 2619, 2622, 2617, 2618, 2620, 2621, 2623, 2624, 2626, 2629, 2633, 550, 2630, 2632, 2631, 350, - 2067, 350, 2637, 2641, 2642, 2110, 2646, 2638, 2639, 2640, 2643, 2644, 2645, 2647, 2648, 2649, 2651, 2655, 2656, 2652, 2653, 2654, 2658, 2664, 2668, 2659, 2426, - 2660, 2661, 2662, 2663, 2665, 2666, 2667, 2669, 2670, 2671, 1008, 2672, 2674, 2675, 2720, 2762, 2810, 2865, 2903, 2932, 2956, 2971, 2986, 2998, 3000, 3019, 3026, - 3032, 3033, 3038, 3042, 3048, 3053, 3059, 3061, 3064, 3068, 3069, 3071, 3077, 3080, 3082, 3099, 380, 2673, 412, 439, 545, 1013, 2676, 2699, 2709, 2711, 2712, - 2714, 545, 545, 966, 427, 2716, 390, 2677, 2681, 2684, 2685, 2686, 2690, 2690, 2691, 2695, 317, 317, 390, 2678, 317, 2679, 317, 2680, 2682, 2683, 2687, - 1791, 2688, 2689, 2689, 924, 317, 620, 2692, 2693, 2694, 2696, 2697, 2698, 637, 345, 708, 2700, 2701, 835, 2706, 381, 2702, 2703, 2704, 2705, 2707, 2708, - 2710, 2713, 2715, 390, 2717, 2718, 2719, 2721, 2727, 2734, 2744, 2750, 2756, 2757, 2759, 2761, 381, 1095, 2722, 858, 2725, 2723, 2724, 1560, 621, 2726, 2728, - 2729, 709, 343, 2730, 2732, 2733, 2731, 2735, 2739, 949, 2742, 2743, 2736, 2737, 2738, 2740, 2741, 317, 2462, 767, 866, 2745, 2748, 2746, 2747, 2749, 2751, - 2752, 2753, 2754, 2755, 2758, 2760, 2476, 2763, 2773, 2777, 2783, 2790, 2794, 2796, 2797, 2801, 356, 2802, 2807, 1200, 2764, 2768, 1557, 2771, 708, 2765, 2766, - 2767, 2769, 2770, 2772, 2774, 2426, 2775, 2776, 2778, 1132, 1115, 1131, 1087, 672, 648, 632, 2779, 2780, 2782, 1114, 647, 317, 2781, 317, 2784, 2787, 2788, - 637, 320, 2785, 740, 694, 2786, 2789, 739, 2791, 320, 740, 2792, 649, 2793, 2795, 390, 1112, 2798, 2799, 2800, 2803, 2804, 2805, 2806, 2808, 2809, 2811, - 2820, 2830, 2833, 2835, 2837, 2838, 2841, 2846, 2848, 356, 2850, 2853, 2812, 708, 2813, 2816, 2818, 1027, 2814, 2815, 2817, 2819, 866, 2821, 2822, 2823, 2824, - 2825, 2826, 2827, 2828, 2829, 1112, 2831, 2742, 2832, 949, 2834, 673, 637, 1732, 2836, 651, 637, 1131, 736, 928, 2839, 2840, 2842, 2843, 2844, 2845, 2847, - 2849, 2851, 2852, 2854, 2857, 2855, 2856, 2858, 2859, 2860, 2861, 2862, 2863, 2864, 2866, 2870, 843, 2871, 2875, 2879, 2889, 2890, 2896, 2897, 2899, 2900, 390, - 673, 2867, 649, 708, 1094, 2868, 2869, 1095, 1131, 1112, 2872, 2873, 2874, 2876, 2877, 2878, 1603, 2880, 2888, 2881, 2884, 1011, 1613, 621, 317, 2882, 2883, - 2885, 2886, 2887, 1731, 2891, 2893, 2892, 1011, 2894, 2895, 2898, 2901, 2902, 2904, 2911, 2912, 2917, 2918, 2921, 2923, 2929, 966, 427, 390, 2905, 2906, 1199, - 1200, 861, 1200, 2909, 339, 390, 317, 490, 356, 2907, 2908, 1027, 2910, 2913, 2914, 1648, 2915, 2916, 2919, 2920, 2742, 1131, 2922, 2066, 2924, 1451, 2928, - 866, 1673, 1746, 661, 2925, 2926, 2927, 1745, 317, 673, 724, 633, 2930, 2931, 2933, 2941, 2943, 2949, 2950, 2954, 390, 649, 1200, 649, 649, 2934, 2938, - 1027, 2935, 2936, 2937, 2939, 2940, 2942, 2944, 2945, 2946, 2947, 2948, 916, 2951, 2952, 2953, 2955, 2957, 2961, 2963, 1083, 2964, 2966, 2968, 390, 1200, 2958, - 2959, 2960, 2962, 2965, 2967, 2969, 2970, 2972, 2976, 2977, 2979, 1690, 2980, 2984, 390, 1199, 2973, 1199, 2974, 2975, 2978, 2981, 2982, 2983, 2985, 2987, 2989, - 2991, 2995, 390, 1093, 1011, 649, 649, 1095, 2988, 2990, 2992, 2993, 2994, 2996, 2997, 2999, 3001, 3004, 3008, 3010, 3012, 3017, 3002, 3003, 3005, 3006, 3007, - 3009, 2033, 3011, 590, 2054, 1720, 3013, 3014, 3015, 3016, 3018, 3020, 3024, 3021, 3022, 3023, 3025, 382, 3027, 3028, 3029, 3030, 3031, 3034, 3036, 3035, 3037, - 2071, 3039, 3040, 3041, 3043, 3045, 3044, 3046, 3047, 343, 317, 589, 3049, 3050, 3051, 3052, 3054, 3058, 3055, 3056, 3057, 3060, 2036, 2309, 3062, 3063, 3065, - 3066, 317, 637, 3067, 339, 345, 3070, 3072, 3075, 3076, 3073, 3074, 2416, 590, 664, 3078, 3079, 3081, 3083, 3087, 3091, 3095, 3084, 3085, 3086, 3088, 3089, - 3090, 3092, 3093, 3094, 3096, 2461, 2475, 2473, 3097, 318, 2492, 3098, 3100, 3101, 3102, 3103, 3105, 3126, 3154, 3181, 3214, 3232, 3240, 3274, 3280, 3306, 3310, - 1031, 3312, 3315, 3317, 3324, 3330, 3331, 3335, 3339, 3343, 3345, 3352, 3362, 1230, 3369, 3106, 412, 3112, 3113, 3117, 545, 3120, 966, 427, 3121, 390, 3107, - 317, 1024, 3108, 3109, 317, 317, 317, 317, 351, 317, 317, 390, 3110, 621, 381, 317, 3111, 3114, 390, 3115, 3116, 3118, 390, 3119, 390, 1020, 3122, - 3123, 3124, 3125, 3127, 3130, 3132, 3140, 3143, 3149, 3152, 545, 381, 1199, 3128, 3129, 842, 3131, 3133, 348, 3134, 3135, 3136, 3137, 3138, 3139, 1132, 3141, - 3142, 3144, 390, 3145, 3146, 3147, 3148, 317, 3150, 3151, 842, 3153, 2942, 756, 390, 545, 3155, 3168, 3169, 3171, 545, 3172, 356, 949, 3156, 3159, 2073, - 1276, 3166, 3157, 736, 3158, 3160, 3163, 3161, 3162, 317, 3164, 317, 3165, 3167, 3170, 3173, 3180, 862, 3174, 3175, 3176, 3177, 317, 3178, 3179, 3182, 3183, - 3185, 3196, 3199, 3203, 3206, 3207, 3208, 3210, 3213, 3184, 637, 651, 620, 3186, 3189, 3191, 1131, 3193, 672, 648, 632, 2782, 3187, 317, 3188, 2779, 3190, - 1114, 3192, 3194, 3195, 3197, 651, 3198, 3200, 3201, 673, 3202, 3204, 3205, 651, 1353, 3209, 317, 3211, 3212, 655, 3215, 3219, 3221, 3225, 3228, 3229, 390, - 3216, 3218, 3217, 3220, 949, 3222, 1234, 3223, 3224, 3226, 3227, 3230, 3231, 3233, 545, 545, 3234, 3237, 966, 427, 390, 1722, 1735, 3235, 1721, 3236, 1735, - 3238, 3239, 3241, 3244, 3252, 3253, 3254, 3257, 545, 3259, 3263, 356, 1033, 390, 966, 3242, 3243, 3245, 3248, 3246, 3247, 633, 3249, 3251, 3250, 1660, 1519, - 619, 651, 3255, 3256, 1519, 3258, 3260, 3261, 3262, 1451, 3264, 694, 767, 3268, 3273, 390, 3265, 3266, 3267, 3269, 3270, 3271, 3272, 651, 673, 3275, 3278, - 427, 390, 2742, 3276, 3277, 3279, 3281, 3285, 3287, 3288, 3296, 356, 3300, 390, 3282, 3283, 3284, 3286, 1660, 661, 3289, 3293, 3290, 3291, 3292, 3294, 3295, - 3297, 3298, 3299, 3301, 3302, 3303, 3304, 3305, 3307, 3308, 390, 3309, 3311, 3020, 427, 3313, 3314, 382, 3316, 3318, 3320, 3322, 3319, 3321, 3323, 2473, 2490, - 3325, 3326, 3327, 3328, 3329, 3039, 1060, 3332, 3333, 3334, 3336, 3337, 3338, 3340, 3342, 3341, 3344, 317, 3346, 3347, 3348, 3349, 3350, 3351, 2060, 3353, 3356, - 3354, 3355, 3357, 3358, 3359, 3360, 3361, 3363, 664, 3367, 3364, 3365, 3366, 3368, 3370, 3372, 3371, 3373, 3374, 3375, 3377, 3388, 3407, 3444, 3453, 3476, 3511, - 3523, 3540, 3558, 2362, 428, 3574, 3579, 3582, 3589, 3595, 349, 3604, 3605, 2277, 3606, 3612, 3617, 3622, 3637, 3647, 3650, 3654, 589, 3659, 3378, 3381, 3383, - 621, 3385, 621, 966, 427, 390, 1688, 317, 3379, 317, 317, 317, 390, 3380, 317, 3382, 3384, 2962, 621, 915, 3386, 3387, 3389, 3390, 3395, 3396, 3399, - 381, 3391, 3392, 3393, 3394, 3397, 661, 3398, 3400, 3401, 3402, 3403, 3404, 3405, 3406, 3408, 3423, 865, 2889, 3424, 3427, 3430, 3433, 3434, 356, 3439, 1688, - 1451, 3409, 3412, 3413, 3421, 3410, 3411, 694, 756, 3414, 3415, 3416, 3417, 3418, 3419, 3420, 3422, 3425, 3426, 3428, 3429, 620, 3431, 3432, 3435, 3436, 3437, - 3438, 3440, 3441, 3442, 3443, 3445, 3448, 3451, 356, 3446, 632, 3447, 3449, 3450, 3452, 621, 3182, 1370, 3454, 3455, 3457, 3460, 3466, 2979, 3470, 3473, 390, - 1732, 317, 3456, 356, 621, 1011, 3458, 3459, 620, 928, 1112, 1132, 3461, 3463, 1087, 672, 648, 3462, 647, 3464, 3465, 3467, 3468, 3469, 3471, 3472, 3474, - 3475, 3477, 3482, 3484, 3487, 3490, 3491, 3503, 3504, 966, 3506, 3510, 390, 3478, 3479, 3480, 3481, 3483, 3485, 3486, 1011, 3488, 3489, 3492, 724, 936, 3495, - 1271, 3497, 3500, 1028, 3502, 397, 3493, 3494, 736, 317, 3496, 3498, 3499, 3501, 320, 317, 1574, 3505, 3507, 3508, 3509, 3512, 3514, 3516, 3519, 3521, 390, - 3513, 3515, 928, 3517, 3518, 3520, 3522, 3524, 3526, 3530, 3531, 3532, 3536, 3538, 390, 3525, 3527, 3528, 3529, 3533, 3534, 3535, 3537, 3539, 3541, 3544, 1162, - 3553, 3554, 390, 3542, 3543, 3545, 3546, 3547, 3548, 3549, 3550, 3551, 317, 3552, 317, 317, 412, 3555, 3556, 3557, 3559, 3565, 3566, 3567, 3572, 390, 3560, - 3561, 3562, 3563, 3564, 1302, 2970, 3568, 1000, 3570, 3569, 3571, 3573, 3575, 362, 3577, 3576, 3578, 382, 3580, 3581, 3583, 3587, 3584, 3585, 3586, 3588, 3590, - 3594, 363, 3591, 3592, 3593, 3596, 3039, 3600, 3597, 3598, 3599, 3601, 3602, 3603, 3607, 3610, 2037, 400, 3608, 2007, 3609, 332, 3611, 3613, 3615, 3614, 3616, - 3618, 516, 1230, 345, 3621, 3619, 3620, 3623, 3625, 433, 3627, 3631, 2567, 3633, 3624, 3626, 3628, 2475, 3629, 3630, 3632, 3634, 3635, 3636, 3638, 3641, 3643, - 3646, 1588, 3639, 317, 3640, 3642, 3644, 3645, 3648, 317, 3649, 3651, 3652, 3653, 3655, 620, 3655, 3657, 3656, 3658, 3660, 3663, 3661, 3661, 3662, 3664, 3666, - 3671, 3678, 3699, 3711, 3722, 3747, 3788, 3810, 3822, 3831, 3842, 3030, 3844, 3849, 3851, 3855, 3858, 3863, 3870, 3873, 3875, 3878, 3881, 3885, 3899, 3902, 3667, - 3668, 3669, 3670, 3672, 3674, 551, 545, 545, 545, 3675, 966, 427, 2716, 390, 3673, 317, 317, 317, 620, 339, 317, 317, 390, 651, 381, 3676, 3677, - 3679, 3689, 3690, 3696, 381, 3680, 3685, 3681, 3682, 3683, 3684, 3686, 3687, 3688, 3691, 3693, 621, 2769, 3692, 637, 633, 390, 3694, 3695, 3697, 3698, 3700, - 3701, 1822, 3702, 3705, 3708, 356, 3709, 3703, 3704, 1799, 1746, 3706, 3707, 3710, 3712, 633, 3718, 356, 3713, 3714, 3715, 3716, 3717, 3719, 3720, 3721, 3723, - 3733, 3734, 3739, 3743, 3745, 390, 3724, 3727, 3731, 3725, 3726, 3728, 3729, 3730, 3732, 3735, 651, 1011, 3736, 3737, 317, 317, 3738, 1130, 739, 3740, 3741, - 3742, 3744, 3746, 3748, 3752, 3754, 3757, 3765, 3778, 3781, 3783, 3786, 3743, 390, 1131, 3749, 3750, 3751, 3753, 1824, 651, 740, 3755, 3756, 3758, 3761, 3763, - 3759, 740, 3760, 3762, 3764, 3766, 3767, 3769, 1132, 1115, 3770, 3774, 3777, 648, 632, 635, 621, 949, 1087, 637, 3768, 320, 317, 649, 320, 1131, 3771, - 3773, 317, 3772, 317, 317, 317, 317, 317, 317, 317, 3775, 651, 3776, 673, 1624, 3779, 1011, 740, 3780, 633, 3782, 637, 1011, 633, 3784, 3785, 3787, - 3789, 3792, 3794, 3798, 3804, 3808, 390, 3790, 3791, 3793, 740, 724, 3795, 3796, 3797, 1732, 773, 3799, 3801, 3800, 3802, 3803, 3805, 3806, 3807, 3809, 3811, - 3813, 3816, 3818, 3743, 3820, 390, 3812, 3814, 3815, 3817, 3819, 620, 3821, 3823, 390, 3824, 3826, 3825, 3827, 3828, 3829, 3830, 3832, 390, 3833, 3834, 3835, - 3836, 3837, 3838, 3839, 3840, 3841, 3843, 3845, 3846, 3847, 3848, 3850, 382, 3852, 3853, 3854, 3856, 3857, 3859, 3860, 3861, 3862, 3864, 3865, 3866, 3867, 3868, - 3869, 3871, 3872, 3874, 3876, 3877, 3879, 3880, 3882, 3646, 3884, 3883, 3886, 3888, 3892, 3897, 3887, 3889, 3890, 3891, 3893, 3894, 3895, 3896, 3898, 3900, 3901, - 3903, 3907, 3904, 3905, 3906, 3908, 3909, 3910, 3912, 3921, 3926, 3942, 3950, 3959, 3970, 4000, 4015, 4030, 4042, 4043, 4046, 4049, 4054, 4056, 4061, 390, 4062, - 4065, 4070, 3913, 3914, 3916, 3919, 621, 966, 317, 390, 1688, 317, 317, 390, 3915, 3917, 3918, 3920, 3395, 3922, 3923, 381, 743, 1042, 3924, 3925, 3927, - 3934, 3935, 3938, 356, 3941, 3928, 3929, 3930, 3931, 3932, 3933, 3936, 3937, 3939, 3940, 3943, 3947, 3948, 3949, 3743, 356, 3944, 3945, 3946, 3951, 3955, 3743, - 390, 3952, 3953, 3954, 3292, 3956, 3957, 3958, 3960, 3961, 1302, 3965, 3968, 390, 949, 3962, 866, 1028, 3963, 3964, 3966, 3967, 3969, 3971, 3974, 3975, 3978, - 3989, 3992, 3743, 1033, 3995, 2356, 390, 3972, 3973, 1722, 3976, 3977, 1011, 694, 620, 3979, 1112, 1132, 3981, 1131, 3982, 672, 648, 3985, 3987, 3988, 3227, - 637, 651, 3980, 651, 1087, 1902, 1011, 3983, 631, 3984, 3986, 3990, 694, 3991, 1087, 3993, 3994, 3996, 3997, 3998, 3999, 4001, 4007, 3700, 4010, 4011, 4013, - 3965, 2356, 390, 3941, 4002, 4003, 4004, 4005, 4006, 4008, 4009, 4012, 621, 1289, 4014, 3744, 4016, 4020, 4024, 4028, 4029, 2356, 390, 3065, 4017, 4018, 4019, - 4021, 4022, 4023, 4025, 4026, 4027, 4031, 4033, 4034, 3915, 4037, 4038, 4029, 4040, 351, 3965, 4041, 2356, 390, 4032, 4035, 4036, 673, 756, 632, 4039, 3843, - 3843, 4044, 4045, 4047, 4048, 4050, 4051, 4052, 4053, 4055, 4057, 4058, 4059, 4060, 4063, 4064, 4066, 4067, 4068, 4069, 4071, 4073, 4072, 4074, 4075, 4076, 4078, - 4083, 4102, 4109, 4116, 4119, 4155, 4169, 4182, 4219, 4254, 4042, 4259, 4262, 4272, 4277, 4281, 4285, 4289, 4296, 4299, 4303, 4309, 4311, 390, 4319, 4331, 4079, - 4080, 427, 4081, 4082, 4084, 4086, 4087, 4091, 4097, 4100, 427, 317, 390, 4085, 317, 317, 390, 4088, 4089, 4090, 4092, 4093, 4094, 4095, 4096, 4098, 2743, - 4099, 4101, 4103, 4105, 4108, 381, 4104, 4106, 4107, 1060, 4110, 4112, 3743, 4114, 356, 4111, 4113, 4115, 4117, 345, 356, 914, 4118, 4120, 4136, 4144, 4148, - 4149, 4151, 390, 4121, 1451, 4125, 756, 4124, 1205, 4129, 4134, 4122, 841, 4123, 4126, 1494, 4127, 4128, 4130, 4131, 4132, 371, 4133, 4135, 4137, 4138, 4139, - 4140, 4141, 4142, 4143, 4145, 4146, 4147, 620, 620, 4150, 317, 4152, 1508, 4153, 4154, 4156, 4157, 4161, 4165, 427, 390, 1722, 1653, 4158, 4159, 4160, 866, - 1746, 936, 4162, 4163, 4164, 3065, 4166, 4167, 4168, 4170, 4176, 1033, 390, 4171, 4174, 4172, 4173, 4175, 4177, 4179, 4178, 4180, 4181, 4183, 653, 4187, 4189, - 4192, 4194, 4214, 4215, 4216, 390, 4184, 4185, 4186, 4188, 637, 673, 4190, 4191, 4193, 740, 673, 4195, 4197, 1112, 1132, 1115, 4198, 1087, 4201, 4208, 4210, - 4211, 4213, 1020, 4196, 4199, 4200, 4202, 647, 317, 4203, 4206, 4204, 4205, 4207, 317, 4209, 928, 633, 4212, 633, 1173, 4217, 4218, 4220, 4221, 4222, 4225, - 4229, 2024, 4249, 4250, 3510, 390, 3941, 781, 1000, 732, 4223, 649, 4224, 4226, 637, 317, 4227, 4228, 317, 866, 4230, 936, 4232, 4238, 4239, 4245, 1746, - 4247, 945, 4231, 4233, 4234, 4235, 4236, 4237, 949, 621, 637, 4240, 4244, 4241, 4242, 4243, 4246, 4248, 651, 673, 4251, 4252, 4253, 4255, 390, 4256, 4257, - 4258, 724, 1746, 4260, 4261, 4263, 4269, 4264, 4265, 501, 4266, 4267, 4268, 4270, 4271, 4273, 4276, 4274, 4275, 4278, 4280, 4279, 4282, 4283, 4284, 4286, 4055, - 4287, 4288, 4290, 4291, 4292, 4293, 4294, 4295, 4297, 4298, 4300, 4302, 4301, 4304, 4305, 4306, 4307, 4308, 4310, 4312, 4315, 4318, 4313, 4314, 4316, 4317, 4320, - 4324, 4325, 4321, 4322, 4323, 4326, 4327, 4328, 4329, 4330, 4332, 4334, 4333, 4335, 4336, 4338, 4370, 4378, 4391, 4400, 4403, 4416, 4428, 4456, 4478, 4042, 4562, - 4565, 4568, 4569, 4574, 4577, 3121, 390, 4584, 4587, 4592, 4594, 4339, 4344, 4348, 4354, 4356, 4029, 317, 390, 620, 4340, 317, 317, 317, 390, 4341, 4342, - 4343, 4345, 4346, 4347, 4349, 4350, 4351, 4352, 4353, 4355, 317, 4357, 4362, 4365, 4358, 4359, 4360, 4361, 4363, 4364, 4366, 4367, 4368, 4369, 4371, 4374, 4376, - 381, 4372, 4373, 4375, 4377, 4379, 4383, 4384, 4388, 356, 4380, 4381, 4382, 4385, 1131, 4386, 4387, 4389, 4390, 4392, 4394, 4397, 356, 4398, 4393, 4395, 4396, - 4399, 4401, 4402, 390, 4404, 4409, 4411, 4414, 1031, 390, 4405, 4407, 4408, 866, 1271, 767, 661, 4406, 866, 1767, 649, 4410, 4412, 4413, 4415, 4417, 4421, - 4425, 1914, 390, 4418, 4419, 4420, 4422, 4423, 4424, 4426, 4427, 4429, 4434, 935, 4438, 4444, 4448, 4454, 4430, 4431, 4432, 4433, 4435, 4436, 4437, 4439, 4440, - 4441, 4442, 4443, 317, 1044, 4445, 4446, 4447, 4449, 4450, 4451, 4452, 4453, 4455, 317, 4457, 4464, 4467, 4468, 4470, 4473, 4475, 4477, 390, 4458, 4463, 648, - 4459, 4460, 4461, 4462, 4465, 4466, 4469, 694, 649, 928, 1131, 1087, 672, 4471, 632, 4472, 633, 631, 4474, 621, 649, 4476, 4479, 4505, 4520, 4534, 4535, - 4546, 4555, 390, 4480, 4482, 4487, 4488, 4493, 4498, 4481, 4483, 4484, 4485, 4486, 4489, 4490, 4491, 4492, 4494, 4495, 4496, 4497, 4499, 4500, 4501, 4502, 4503, - 4504, 4506, 4510, 4515, 4507, 4508, 4509, 4511, 4512, 4513, 4514, 4516, 4517, 4518, 4519, 4521, 4526, 4532, 4522, 4523, 4524, 4525, 4527, 4528, 4529, 4530, 4531, - 4533, 4536, 4541, 4537, 4538, 4539, 4540, 4542, 4543, 4544, 4545, 4547, 4548, 4549, 4550, 4551, 4552, 4553, 4554, 4556, 4557, 4558, 4559, 4560, 4561, 4563, 4564, - 382, 4566, 4567, 4322, 4055, 4570, 4571, 4572, 4573, 4575, 4576, 4578, 4579, 4580, 4581, 4582, 4583, 4585, 4586, 4588, 4590, 4589, 4591, 4593, 4595, 4596, 4597, - 4599, 4612, 4632, 4644, 4650, 4653, 4660, 4673, 4683, 4713, 4743, 543, 4744, 4054, 4752, 4756, 4758, 4762, 390, 4765, 4767, 4600, 4602, 4604, 3791, 4605, 4606, - 966, 317, 390, 1688, 4601, 317, 317, 317, 317, 4603, 839, 4607, 4608, 4610, 4609, 4611, 4613, 4615, 4620, 4621, 4624, 4627, 4630, 381, 4614, 4616, 928, - 4617, 4618, 4619, 4622, 4623, 4625, 4626, 4628, 4629, 4631, 4633, 4635, 4636, 4639, 356, 4634, 4637, 4638, 4640, 4641, 4642, 4643, 4645, 4649, 356, 4646, 4647, - 4648, 4651, 4652, 390, 4654, 4657, 4659, 2679, 390, 1722, 755, 1653, 949, 4655, 4656, 1897, 4658, 4661, 4672, 2024, 390, 1451, 4662, 756, 767, 4667, 4663, - 4665, 365, 4664, 4666, 4668, 317, 4669, 4670, 4671, 4674, 4679, 4680, 4681, 2024, 390, 4675, 4676, 4677, 4678, 4682, 4684, 4685, 4688, 4689, 4707, 3431, 2356, - 390, 4712, 4686, 4687, 949, 4690, 4692, 1302, 4699, 736, 4705, 4691, 4693, 4696, 4694, 4695, 4697, 4698, 4700, 735, 4701, 949, 4702, 4703, 4704, 4706, 4708, - 4709, 4710, 4711, 4714, 4716, 4718, 4720, 4722, 4727, 2024, 4737, 4739, 390, 4715, 4717, 928, 4719, 4721, 1131, 4723, 4724, 633, 490, 4725, 4726, 620, 4728, - 1132, 637, 1131, 4733, 672, 4735, 862, 4729, 4730, 4731, 4732, 4734, 4736, 4738, 4740, 4741, 4742, 1073, 3843, 4745, 4749, 4746, 4747, 4748, 4750, 4751, 4753, - 4754, 4755, 4757, 4759, 4760, 4761, 4763, 4764, 4766, 4768, 4769, 4770, 4771, 4772, 4773, 4775, 4776, 4777, 4778, 4779, 4781, 4782, 2022, 4783, 2328, 4785, 4789, - 4784, 4786, 4787, 4788, 4791, 4792, 365, 4793, 4794, 4795, 4796, 4804, 4806, 4852, 4856, 4872, 4874, 4875, 4879, 4889, 4896, 4901, 9, 10, 11, 6139, 6229, - 12, 6569, 6640, 6766, 6790, 13, 15, 16, 8915, 18, 9187, 19, 20, 21, 22, 10771,10868,10915,10929,10983,530, 2301, 4797, 4797, 4797, 4798, 4797, - 4797, 4799, 4800, 4801, 4803, 4797, 317, 4802, 4805, 4807, 4812, 4820, 4822, 4824, 4827, 4833, 4840, 4844, 4808, 4811, 4809, 4810, 4813, 4814, 949, 936, 4815, - 1271, 4816, 317, 317, 4817, 317, 4818, 317, 317, 317, 4819, 4821, 743, 4823, 1653, 1735, 4825, 4826, 4828, 4829, 4830, 4831, 4832, 4834, 4835, 4836, 4837, - 4838, 4839, 4841, 4842, 4843, 4845, 4846, 4847, 4848, 4849, 4850, 4851, 1111, 4853, 4854, 4855, 621, 4857, 4858, 4861, 621, 621, 621, 4862, 4865, 4871, 317, - 4859, 4860, 317, 1114, 4863, 4864, 4866, 4867, 4868, 4869, 4870, 4873, 1302, 1130, 1309, 4876, 4877, 4878, 4880, 4882, 4886, 4881, 4883, 4884, 4885, 4887, 4888, - 4890, 4892, 4891, 4893, 4894, 4895, 4897, 1317, 4898, 4899, 4900, 4902, 4911, 4945, 4950, 4951, 339, 4953, 4938, 4955, 4956, 4964, 4967, 4971, 4983, 4988, 2357, - 4992, 4903, 4906, 862, 4904, 4905, 637, 490, 4907, 949, 936, 4908, 4909, 4910, 4912, 4915, 1131, 1087, 672, 4916, 4940, 2051, 390, 4937, 356, 4943, 4944, - 1107, 637, 4913, 4914, 1420, 3202, 651, 621, 4917, 4919, 4936, 4937, 4939, 4918, 317, 4920, 4925, 4926, 317, 4921, 317, 317, 317, 4922, 317, 4923, 4924, - 317, 390, 4927, 4928, 4929, 4930, 4931, 4932, 4933, 4934, 4935, 4941, 4942, 4946, 4949, 317, 4947, 4948, 501, 367, 490, 317, 4952, 365, 317, 550, 317, - 317, 4954, 389, 343, 439, 4957, 4958, 4961, 4963, 381, 332, 439, 1033, 4949, 4959, 4960, 317, 4962, 3710, 351, 4965, 4966, 4968, 4970, 4969, 2551, 2521, - 4972, 4973, 4975, 4977, 4591, 343, 4978, 317, 4981, 365, 2845, 362, 4974, 4976, 590, 317, 4979, 1266, 317, 317, 317, 4980, 4982, 370, 4984, 2322, 4985, - 490, 4986, 4987, 4989, 4990, 4991, 4993, 4994, 4998, 5000, 5024, 5060, 5076, 5128, 5176, 1335, 5177, 5192, 5208, 5209, 5218, 5227, 5229, 5236, 5282, 5287, 5329, - 5376, 5380, 5400, 5402, 4995, 4996, 4997, 4999, 5001, 5002, 5004, 5005, 351, 5006, 4591, 5007, 5009, 5013, 5014, 5018, 5023, 1109, 490, 2043, 5003, 490, 317, - 317, 345, 363, 404, 1358, 317, 362, 317, 5008, 343, 317, 317, 5010, 317, 5011, 5012, 356, 466, 3854, 317, 490, 317, 390, 433, 5015, 490, 5016, - 5017, 5019, 5020, 317, 5021, 317, 3854, 317, 5022, 317, 748, 5025, 5034, 5041, 5044, 5048, 317, 317, 5059, 370, 5026, 5027, 5029, 5031, 1358, 2333, 317, - 5028, 354, 5030, 1044, 365, 317, 5032, 5033, 317, 5035, 5036, 5037, 5039, 5038, 317, 5040, 317, 1160, 5042, 381, 5043, 2067, 5045, 356, 5046, 5047, 354, - 317, 5049, 5056, 5050, 5051, 5052, 5053, 356, 5054, 5055, 5057, 5058, 1753, 2077, 5061, 317, 936, 866, 5067, 5069, 317, 2733, 5062, 5063, 317, 5064, 5066, - 5065, 5068, 5070, 5072, 5071, 5073, 5075, 5074, 1266, 637, 5077, 5080, 5094, 5098, 5109, 5078, 317, 5079, 5081, 5082, 5083, 5085, 5088, 490, 5089, 5090, 5092, - 317, 3717, 5084, 5086, 5087, 5091, 5093, 5095, 317, 5096, 5097, 1325, 404, 5099, 5100, 317, 380, 5106, 5101, 5103, 5102, 1135, 317, 5104, 5105, 5107, 5108, - 5110, 5114, 5127, 317, 5111, 5112, 5113, 2510, 317, 382, 5055, 5115, 5085, 5116, 5118, 5121, 5090, 5117, 5119, 5120, 317, 1881, 5122, 5123, 5124, 5125, 5126, - 317, 1358, 5129, 317, 382, 5131, 5132, 5136, 5139, 5141, 317, 5172, 5175, 5130, 4984, 373, 490, 5133, 1347, 362, 5135, 362, 317, 4980, 5134, 317, 2110, - 332, 3284, 5137, 5138, 5140, 5142, 5143, 5150, 5155, 5159, 343, 5160, 5165, 404, 317, 5168, 5144, 5146, 5145, 363, 5147, 5148, 5149, 1588, 5151, 5152, 5153, - 5154, 5156, 5157, 5158, 5161, 5164, 5162, 5163, 5166, 381, 5167, 5169, 5170, 5171, 317, 317, 5173, 5174, 523, 490, 317, 608, 370, 5178, 5186, 5191, 5179, - 2036, 5182, 5184, 5185, 5180, 5181, 5183, 971, 381, 5187, 5188, 5189, 317, 5190, 317, 5193, 5194, 5195, 5198, 5202, 5204, 317, 3726, 5206, 1347, 3999, 362, - 2322, 317, 5196, 5197, 343, 5003, 1345, 317, 5199, 5200, 5201, 596, 317, 317, 5203, 404, 404, 5205, 490, 401, 5207, 466, 351, 5210, 5212, 5214, 382, - 5211, 5213, 5215, 5216, 5217, 5219, 5222, 3999, 5225, 317, 382, 317, 5220, 381, 343, 5221, 363, 343, 362, 317, 5223, 5224, 5226, 5228, 5230, 5231, 5232, - 5233, 5234, 5235, 5200, 370, 551, 2156, 5237, 5239, 5251, 5255, 5256, 5263, 5267, 5277, 595, 5238, 5240, 5242, 317, 5241, 5243, 5245, 5244, 5246, 5247, 5248, - 5249, 5250, 317, 1347, 5252, 5253, 5254, 373, 5167, 5257, 5261, 5258, 5259, 5260, 4564, 1347, 356, 5262, 5055, 343, 5264, 5265, 5266, 5120, 5268, 5272, 5274, - 5276, 5269, 5271, 5270, 5273, 356, 466, 317, 5275, 2603, 317, 5278, 5279, 5280, 5281, 608, 5283, 5284, 5285, 5286, 5288, 5314, 5316, 5320, 5322, 5289, 5296, - 5301, 5304, 595, 317, 5310, 5312, 348, 5290, 5293, 5291, 5292, 5294, 5295, 5297, 5298, 5299, 5300, 363, 363, 5302, 5303, 371, 362, 5305, 4980, 396, 5306, - 5308, 317, 5307, 4925, 1108, 5309, 3284, 5311, 5055, 2156, 5313, 5315, 471, 332, 380, 317, 317, 317, 317, 317, 380, 5317, 317, 2381, 5318, 5319, 3854, - 356, 5095, 5321, 317, 317, 5323, 5325, 5326, 5324, 5327, 393, 5328, 317, 5330, 5333, 5338, 5344, 5347, 5348, 5360, 5372, 5331, 5332, 5334, 5336, 5335, 5337, - 5339, 2156, 5340, 5341, 490, 5342, 5343, 5345, 5346, 5349, 317, 5357, 5350, 5356, 5351, 317, 5352, 5354, 370, 5353, 317, 363, 5355, 343, 1325, 317, 5358, - 5225, 523, 5359, 466, 317, 317, 381, 1347, 5361, 5364, 5366, 363, 5368, 5362, 5363, 5365, 5367, 5369, 5370, 5371, 356, 5113, 370, 317, 5373, 5374, 5375, - 370, 381, 5201, 5377, 317, 5378, 5379, 380, 5381, 5382, 5384, 5385, 363, 380, 490, 5387, 5388, 2322, 5393, 5398, 5383, 5386, 317, 489, 317, 5389, 5390, - 5392, 5391, 2156, 5324, 5394, 5395, 5396, 317, 1347, 317, 382, 343, 5397, 5399, 317, 511, 5401, 2086, 5403, 433, 5404, 380, 5405, 5406, 2476, 5407, 5410, - 380, 5433, 5559, 5562, 5612, 5613, 5646, 5658, 5678, 5680, 343, 5685, 5702, 5721, 365, 5749, 5786, 5809, 5811, 5408, 5409, 5411, 5413, 317, 5422, 5424, 5426, - 5429, 5432, 5412, 5414, 5420, 5415, 317, 5416, 317, 317, 5417, 1347, 5418, 5419, 317, 5421, 5423, 5425, 5427, 5428, 5430, 5431, 5434, 317, 5440, 5471, 5484, - 5493, 5531, 5540, 5435, 5436, 490, 5438, 5437, 5439, 5441, 5442, 5451, 5454, 5460, 5469, 1325, 466, 5443, 5444, 5445, 5448, 381, 5446, 5447, 5113, 2510, 5449, - 5450, 5452, 356, 317, 5453, 5096, 343, 5455, 5456, 356, 466, 2510, 317, 5457, 514, 5458, 343, 5459, 5461, 637, 5462, 5463, 649, 633, 5464, 5465, 332, - 5466, 317, 1267, 317, 317, 5457, 382, 5055, 5467, 5468, 317, 345, 511, 5470, 317, 867, 5472, 363, 5478, 5473, 5474, 5475, 5476, 370, 317, 5477, 5479, - 5480, 351, 5481, 5482, 5483, 5485, 5489, 5486, 5488, 5487, 5490, 5491, 5492, 2110, 5494, 5496, 5511, 5518, 5520, 5495, 5497, 5498, 5503, 371, 5238, 5499, 5500, - 5501, 5502, 5504, 5507, 5505, 5506, 2184, 5464, 5399, 381, 5508, 2156, 5509, 5510, 5464, 466, 5399, 5512, 5517, 317, 523, 356, 5513, 317, 5514, 5515, 5516, - 5519, 5521, 5527, 5522, 317, 5523, 5525, 356, 466, 317, 5457, 5524, 370, 1347, 5526, 5528, 5529, 5530, 317, 5532, 5537, 5539, 5533, 5536, 5534, 5535, 5365, - 356, 466, 317, 356, 404, 5538, 380, 1325, 466, 5541, 5544, 5548, 5552, 5557, 5542, 5543, 3648, 5545, 5546, 5547, 5549, 5551, 370, 5550, 5553, 5394, 466, - 5555, 5554, 5556, 5558, 1430, 5560, 5561, 5563, 5565, 5566, 357, 317, 5567, 5568, 362, 5571, 5572, 5574, 5576, 5608, 5609, 317, 645, 637, 5564, 5238, 317, - 4943, 5058, 5569, 5570, 1753, 401, 381, 332, 317, 490, 5573, 5575, 317, 5577, 339, 5586, 5591, 5578, 5582, 343, 5579, 5580, 5581, 5583, 5584, 5585, 5587, - 317, 5588, 5589, 5590, 5592, 5225, 5593, 2272, 5603, 5594, 5595, 5596, 5597, 5598, 5599, 5600, 5601, 5602, 5604, 5605, 5606, 5607, 5238, 5610, 5611, 317, 5614, - 5620, 5629, 1526, 5636, 5638, 5641, 317, 5645, 5615, 343, 5619, 5616, 5617, 5618, 5621, 343, 317, 317, 5624, 5625, 404, 4980, 5627, 5622, 5623, 5626, 317, - 5628, 5630, 5633, 317, 5635, 5631, 410, 5632, 466, 317, 5399, 1347, 317, 5634, 365, 317, 5637, 5639, 5640, 5642, 466, 5643, 5644, 381, 2219, 5647, 5654, - 5655, 5657, 317, 5648, 5649, 5652, 5653, 317, 545, 479, 317, 5650, 370, 5651, 5656, 317, 427, 390, 565, 5659, 5664, 5666, 5662, 5668, 5676, 317, 5660, - 5661, 5662, 4980, 317, 5663, 345, 345, 5665, 439, 5667, 363, 5669, 5670, 5671, 5672, 5673, 5674, 5675, 466, 5399, 317, 5399, 317, 5677, 439, 3522, 5679, - 317, 317, 317, 5681, 5682, 5683, 5684, 490, 5686, 396, 5688, 490, 5690, 5693, 5694, 5695, 5696, 5687, 317, 5689, 5691, 5692, 1109, 1347, 317, 339, 2021, - 5697, 5698, 5699, 5700, 5701, 317, 5703, 5704, 5712, 5705, 5710, 5706, 5707, 5708, 356, 5709, 5711, 5713, 2381, 5717, 5718, 5719, 5714, 5715, 5716, 317, 514, - 5447, 466, 5720, 380, 356, 2081, 5722, 5723, 5728, 5747, 990, 317, 317, 317, 317, 5724, 5725, 5726, 5727, 317, 5729, 5733, 5738, 5740, 5743, 5745, 5730, - 2163, 5731, 5732, 317, 5734, 5735, 5736, 5737, 5739, 5741, 5742, 5744, 2163, 490, 317, 5746, 5748, 317, 5464, 317, 5750, 5770, 5777, 5778, 5779, 5751, 5753, - 317, 427, 5766, 317, 5752, 5754, 5755, 317, 410, 5762, 5756, 5757, 5758, 5759, 5760, 5761, 5763, 5764, 5765, 5547, 5767, 5768, 5769, 5201, 404, 317, 1347, - 317, 5771, 5772, 317, 5773, 5774, 5775, 5776, 5334, 345, 5780, 317, 5781, 5783, 5785, 5782, 370, 370, 5488, 5784, 317, 380, 345, 1325, 404, 2510, 5787, - 396, 397, 490, 5789, 5794, 5797, 5804, 5806, 5808, 5788, 363, 5790, 5791, 5792, 5793, 5795, 317, 5796, 5798, 5799, 5800, 5801, 5802, 5803, 5805, 317, 380, - 315, 315, 5807, 317, 5324, 5810, 525, 5812, 5813, 5817, 5850, 5852, 5881, 5922, 5927, 5934, 5965, 5992, 5997, 6001, 6034, 6037, 5872, 6057, 6076, 6082, 6092, - 6127, 6129, 6132, 6133, 5814, 5815, 5816, 317, 5818, 317, 5819, 317, 351, 317, 5820, 5824, 5842, 5843, 5848, 5849, 317, 2322, 1230, 317, 317, 332, 5821, - 2272, 490, 5822, 5823, 637, 5825, 787, 5827, 5831, 5833, 5834, 5835, 5837, 362, 5826, 5828, 5829, 317, 490, 5830, 741, 370, 371, 5832, 371, 371, 371, - 317, 317, 2163, 317, 5836, 317, 363, 5838, 5839, 317, 5840, 5841, 5844, 5845, 5846, 5847, 2510, 317, 5457, 5167, 317, 317, 1347, 382, 5055, 343, 317, - 5851, 5853, 5854, 5857, 5870, 317, 5872, 5873, 317, 5878, 317, 4965, 345, 2537, 317, 5855, 317, 5856, 5325, 5661, 317, 5858, 348, 5860, 5861, 5863, 5867, - 345, 5859, 356, 5262, 317, 5862, 5864, 363, 5865, 5866, 5868, 5869, 2156, 5871, 5874, 5875, 5876, 410, 5877, 466, 5879, 356, 317, 5880, 5882, 317, 5884, - 1109, 5899, 4268, 5912, 5914, 5918, 5919, 5921, 5883, 3751, 5885, 5887, 317, 3023, 5888, 5889, 5891, 5892, 5893, 5895, 490, 5886, 574, 1999, 965, 317, 317, - 5793, 5890, 5663, 439, 5894, 5896, 363, 5897, 2310, 5898, 5900, 2272, 5902, 317, 5911, 5901, 350, 5903, 3125, 490, 2271, 5909, 5904, 5905, 5906, 5907, 5908, - 5910, 5913, 490, 5915, 362, 404, 5916, 5917, 5223, 317, 5920, 949, 351, 5923, 5924, 5925, 5926, 5928, 317, 5929, 5933, 565, 5930, 5310, 5931, 466, 317, - 5932, 317, 343, 1347, 5935, 5937, 317, 5938, 5939, 5943, 5944, 5952, 5953, 345, 5956, 5957, 5963, 3750, 5964, 5936, 5940, 5941, 5942, 651, 633, 633, 5945, - 5946, 5947, 5948, 5949, 5950, 5951, 354, 971, 381, 317, 5954, 5955, 5958, 5959, 5960, 5961, 5962, 5966, 5970, 5975, 5981, 5967, 490, 5968, 5969, 5971, 317, - 5972, 5973, 5974, 380, 1347, 5976, 5978, 5977, 356, 466, 317, 317, 5979, 5980, 356, 3854, 5982, 5988, 5989, 2368, 2368, 1526, 5983, 5984, 5985, 5986, 1325, - 5987, 351, 382, 363, 5990, 410, 5991, 466, 5399, 317, 5993, 5994, 5995, 5996, 5998, 5999, 6000, 3529, 362, 1160, 317, 317, 3517, 6002, 6003, 317, 6029, - 6004, 6018, 6023, 6026, 5760, 6005, 317, 6010, 317, 1267, 6006, 6007, 6008, 6009, 6011, 6012, 6013, 6014, 6015, 5226, 6016, 356, 6017, 2510, 382, 5055, 5550, - 6019, 5394, 466, 6020, 6022, 5226, 6021, 6024, 6025, 5457, 5055, 317, 6027, 523, 6028, 466, 6030, 6031, 6032, 5226, 6033, 6035, 6036, 490, 317, 343, 343, - 6038, 6047, 6049, 351, 6051, 6054, 351, 6039, 6043, 6044, 6040, 6041, 6042, 6045, 317, 6046, 345, 6048, 365, 6050, 6052, 6053, 5847, 317, 317, 345, 1347, - 6055, 5447, 466, 6056, 373, 5226, 356, 466, 5399, 317, 317, 6058, 6059, 6066, 6075, 6060, 6061, 6064, 2087, 6062, 6063, 317, 6065, 6067, 317, 6073, 381, - 363, 363, 363, 6068, 6071, 317, 1160, 343, 317, 6069, 6070, 6072, 6074, 371, 381, 2134, 6077, 317, 6078, 6080, 6079, 1526, 5225, 6081, 6083, 6084, 348, - 317, 5225, 317, 6085, 6090, 317, 6086, 6089, 317, 6087, 6088, 4591, 317, 6091, 6093, 6094, 6096, 6104, 6119, 6124, 6095, 489, 6097, 6098, 317, 6100, 6099, - 466, 317, 317, 5399, 317, 6101, 6102, 6103, 317, 4591, 317, 5225, 6105, 6112, 6106, 6107, 6109, 5250, 6108, 6110, 6111, 466, 4591, 4952, 1347, 317, 6113, - 6114, 6116, 6115, 5324, 397, 6117, 317, 6118, 2156, 317, 6120, 410, 6121, 466, 6122, 317, 3854, 1347, 317, 6123, 6125, 2631, 2551, 6126, 381, 370, 5717, - 1588, 6128, 371, 380, 6130, 6131, 351, 342, 6134, 6135, 6136, 6137, 6138, 6140, 6142, 6143, 6146, 6148, 6149, 6151, 6153, 6155, 6157, 6200, 6213, 6221, 6223, - 6141, 345, 317, 6144, 6145, 363, 363, 349, 2142, 6147, 2110, 367, 2330, 6150, 317, 382, 345, 6152, 350, 6154, 2845, 6156, 1347, 362, 345, 6158, 2035, - 6159, 6160, 365, 6161, 345, 6196, 317, 1347, 1347, 4564, 390, 6162, 6164, 6173, 539, 6174, 6177, 6180, 6186, 6189, 6163, 5732, 6165, 6167, 6166, 6168, 6169, - 6170, 6171, 6172, 2546, 317, 3869, 3361, 6175, 6176, 6178, 520, 6179, 6181, 6182, 6183, 6184, 6185, 965, 5105, 317, 6187, 6188, 6190, 4564, 6192, 565, 6191, - 6193, 1358, 6194, 6195, 6197, 6198, 6199, 317, 6201, 351, 1060, 6208, 6210, 6202, 6203, 6205, 6207, 6204, 6206, 6209, 6211, 6212, 6214, 4591, 490, 6220, 6215, - 6216, 317, 317, 6217, 1526, 3967, 6219, 578, 6218, 578, 2206, 6222, 6224, 6225, 6226, 6227, 6228, 6230, 317, 1109, 6236, 351, 6238, 6279, 6284, 6288, 6295, - 6297, 6299, 6313, 6331, 6335, 6361, 6362, 433, 373, 6231, 6232, 317, 6233, 2146, 6234, 6235, 6237, 6239, 6243, 6252, 6261, 6267, 6273, 373, 6240, 6241, 6242, - 6244, 6250, 3854, 6245, 5225, 356, 6246, 317, 382, 6247, 343, 6248, 6249, 317, 317, 6251, 6253, 6256, 6257, 6259, 6033, 6254, 6255, 317, 6258, 317, 5201, - 6260, 5553, 356, 466, 317, 384, 6262, 6265, 6263, 317, 6264, 6266, 349, 6268, 6269, 6271, 6270, 356, 466, 317, 6272, 370, 6274, 6276, 6275, 6277, 6278, - 6280, 6281, 6282, 6283, 317, 5211, 6285, 6286, 6287, 6289, 578, 343, 317, 6290, 6291, 6292, 6293, 6294, 6296, 2631, 332, 343, 317, 6298, 317, 6300, 381, - 6301, 380, 6302, 6303, 6309, 6310, 6304, 6305, 6306, 6307, 6308, 6311, 6312, 6314, 317, 389, 6315, 6323, 6316, 365, 439, 6320, 965, 6317, 317, 6318, 6319, - 317, 317, 412, 317, 345, 6321, 6322, 3079, 2509, 6324, 6326, 6327, 1194, 362, 6328, 6325, 6329, 6330, 6332, 6333, 6334, 363, 367, 6336, 6356, 490, 6337, - 6341, 6338, 6339, 6340, 6342, 6344, 2277, 6346, 6348, 6349, 6351, 6353, 6343, 6345, 6347, 2126, 4925, 534, 6350, 434, 5961, 6352, 6311, 6354, 6354, 6355, 6357, - 6358, 6359, 6360, 490, 5623, 6363, 6364, 6365, 6366, 6367, 6368, 6369, 6370, 6371, 6373, 6395, 6399, 6403, 6405, 490, 6416, 6443, 6445, 6455, 6456, 6469, 6488, - 6489, 6529, 6530, 6533, 6566, 6372, 6374, 6375, 6376, 6378, 2012, 6383, 6385, 6389, 6391, 343, 554, 1108, 351, 6377, 6379, 6380, 6381, 6382, 317, 6384, 317, - 6386, 393, 6388, 433, 6387, 6390, 5619, 1160, 317, 6392, 490, 317, 317, 6393, 6394, 317, 6396, 6397, 6398, 6400, 6401, 6402, 427, 351, 6404, 958, 317, - 317, 466, 6406, 370, 6407, 6411, 6413, 317, 6408, 6409, 351, 6410, 317, 596, 317, 2815, 317, 694, 633, 317, 317, 317, 6412, 351, 363, 6414, 6415, - 6417, 2510, 6419, 6421, 6431, 6418, 317, 6420, 6422, 6426, 6423, 6424, 6425, 6427, 6428, 6429, 6430, 6432, 6436, 390, 6442, 6433, 6434, 6435, 5546, 6437, 6438, - 6439, 2510, 363, 6440, 6441, 370, 2571, 6444, 317, 317, 596, 6446, 6448, 345, 317, 6451, 351, 6447, 397, 6449, 317, 317, 6450, 6452, 6454, 6453, 1325, - 5113, 2510, 5241, 4965, 554, 2094, 6457, 6459, 6464, 345, 6458, 317, 1160, 1459, 317, 317, 6460, 6462, 6461, 6463, 317, 6465, 490, 6466, 6467, 6468, 5343, - 317, 396, 6470, 6477, 6482, 6487, 6471, 317, 6472, 6473, 317, 4268, 5174, 6474, 317, 6475, 6476, 6478, 317, 6479, 317, 6480, 6481, 6483, 317, 6484, 317, - 6485, 6486, 332, 317, 317, 490, 365, 6490, 6491, 6500, 6520, 2533, 5027, 5624, 433, 6492, 6493, 490, 6498, 6494, 317, 466, 5399, 317, 6495, 6496, 6497, - 6499, 6501, 6505, 6515, 6516, 345, 6518, 6502, 6503, 6504, 6506, 6507, 6508, 6509, 6510, 6511, 6512, 317, 6514, 6513, 6514, 370, 6517, 2035, 6519, 317, 2035, - 6521, 6526, 2163, 439, 6522, 6523, 6524, 6525, 6527, 6528, 6531, 6532, 6534, 6542, 6543, 6544, 6553, 6551, 6554, 363, 6556, 6557, 6535, 2142, 6536, 332, 317, - 5687, 317, 6537, 6538, 6539, 6540, 6541, 6191, 2142, 317, 490, 343, 332, 351, 6545, 6549, 6552, 6546, 6547, 6548, 2389, 2110, 363, 6550, 6551, 317, 490, - 5238, 351, 348, 565, 6555, 317, 345, 363, 6558, 6559, 6564, 345, 6560, 6561, 6562, 6563, 6565, 450, 488, 6567, 6568, 427, 6570, 6575, 6579, 6582, 6586, - 6588, 6591, 6608, 6619, 6621, 6622, 6633, 6634, 6637, 2462, 2462, 6639, 317, 317, 332, 1109, 6571, 1230, 317, 6572, 345, 6573, 317, 6574, 6576, 317, 6577, - 6578, 6580, 6581, 343, 6583, 6584, 6585, 317, 6587, 317, 6589, 6590, 6592, 6595, 6597, 3023, 6599, 4984, 6600, 317, 6601, 6603, 6605, 317, 4949, 479, 6593, - 6594, 6596, 317, 1347, 317, 6598, 6602, 6604, 3007, 426, 6606, 6607, 6609, 6617, 393, 6610, 6616, 317, 317, 354, 6611, 6614, 317, 6612, 317, 5619, 6613, - 6615, 6618, 317, 317, 354, 6614, 6620, 5255, 1347, 501, 490, 317, 6623, 6624, 450, 345, 6625, 6626, 6627, 6630, 317, 345, 317, 317, 6628, 6629, 6631, - 6632, 363, 466, 317, 6635, 6636, 490, 6638, 490, 490, 381, 590, 6641, 490, 6643, 6646, 6650, 396, 6652, 6653, 6654, 6655, 6662, 6666, 6671, 6677, 6678, - 6685, 6749, 6756, 6762, 6763, 490, 350, 6764, 317, 6642, 490, 317, 6644, 6645, 343, 373, 317, 6647, 6649, 466, 317, 317, 6648, 317, 1160, 317, 2142, - 6651, 317, 5117, 343, 350, 5037, 2110, 317, 471, 345, 6656, 6657, 6658, 6659, 317, 332, 1347, 6660, 6661, 6663, 6664, 345, 5399, 351, 6665, 345, 363, - 343, 5054, 317, 317, 396, 380, 382, 317, 2609, 2584, 5809, 382, 6555, 6667, 5575, 3999, 6668, 2272, 317, 6669, 6670, 381, 317, 1347, 343, 317, 2022, - 317, 6672, 6676, 317, 6673, 6675, 5809, 6674, 339, 6679, 6681, 332, 6680, 6682, 6683, 6684, 637, 6686, 6687, 6694, 6698, 6706, 6708, 6715, 6716, 6719, 6722, - 6727, 2381, 6730, 6734, 6741, 5758, 6743, 317, 6688, 6689, 6692, 345, 1347, 2156, 6690, 6691, 6693, 389, 1044, 380, 317, 6695, 6696, 6697, 574, 6699, 6700, - 6705, 6701, 6702, 6703, 6704, 6707, 317, 317, 1588, 6709, 2402, 6711, 6714, 6710, 4564, 6712, 6713, 1999, 355, 6717, 6718, 6720, 6721, 509, 6723, 384, 317, - 6724, 6725, 6726, 6728, 363, 6729, 406, 6731, 6733, 6732, 4268, 350, 6735, 2261, 6696, 6737, 6738, 6736, 6697, 514, 1526, 3529, 6739, 554, 6740, 2156, 1347, - 380, 317, 6742, 362, 6744, 6745, 371, 596, 1347, 396, 6746, 6747, 6748, 6504, 317, 4984, 6750, 363, 5717, 343, 6755, 317, 6751, 6753, 6752, 6754, 6757, - 6758, 345, 6760, 6761, 6759, 2551, 2551, 363, 5055, 365, 332, 6765, 363, 317, 6767, 6770, 6775, 6776, 6191, 6779, 6781, 6787, 605, 6788, 5571, 363, 5120, - 6768, 317, 1020, 6769, 5120, 6771, 6772, 6773, 6774, 6777, 6778, 6780, 351, 6782, 6783, 6784, 6785, 6786, 590, 596, 343, 6789, 3182, 6791, 6794, 6812, 6815, - 6820, 6827, 6852, 6858, 6860, 6862, 362, 6863, 6867, 6882, 6895, 6902, 6905, 6792, 619, 6793, 6795, 6799, 365, 365, 317, 5120, 6801, 6803, 332, 6804, 6805, - 6807, 317, 6809, 6796, 6797, 6798, 6800, 6802, 317, 343, 317, 1481, 6806, 317, 1331, 6808, 6810, 6811, 649, 6813, 6814, 6816, 427, 6817, 404, 317, 6818, - 317, 317, 343, 2022, 362, 6819, 317, 4591, 363, 6821, 565, 6822, 380, 6824, 565, 439, 356, 362, 6823, 6825, 6826, 490, 6828, 6832, 332, 6836, 6838, - 6841, 6847, 6848, 6849, 490, 6850, 6829, 6830, 6831, 6833, 6835, 6834, 332, 332, 6837, 317, 332, 6839, 6840, 6842, 427, 6843, 317, 6845, 6844, 6846, 2845, - 6851, 6853, 6855, 6856, 6854, 6857, 363, 6859, 6861, 490, 5120, 317, 427, 317, 6864, 6865, 990, 471, 317, 6866, 6868, 380, 1230, 6870, 370, 6880, 2036, - 490, 6869, 370, 501, 6871, 6872, 6873, 6874, 6875, 6876, 6877, 6878, 6879, 6881, 6883, 5866, 6884, 363, 6885, 6886, 6887, 6888, 6889, 6890, 6891, 6892, 6893, - 6894, 2558, 490, 490, 6896, 6898, 6897, 6899, 6900, 6901, 6903, 6904, 317, 6906, 6910, 6912, 6969, 7029, 7058, 7094, 7197, 7215, 7247, 7255, 7321, 7323, 14, - 7471, 7510, 7512, 7528, 7575, 7580, 7586, 7603, 7690, 7707, 7725, 7728, 7731, 6907, 1932, 6908, 6909, 6911, 317, 317, 6913, 6918, 6919, 6921, 6922, 6924, 6929, - 5126, 6931, 6941, 6945, 6948, 6953, 6958, 6960, 6965, 6966, 6968, 6914, 490, 6915, 382, 6916, 6917, 5570, 2291, 362, 1020, 6920, 490, 348, 6923, 741, 332, - 5891, 6925, 6926, 6927, 317, 6928, 6930, 6932, 565, 6934, 5022, 6936, 6938, 365, 381, 6933, 343, 365, 490, 6935, 317, 6937, 317, 2086, 6939, 1109, 6940, - 1266, 317, 317, 317, 6942, 317, 6943, 332, 6944, 317, 317, 490, 317, 343, 317, 317, 365, 6946, 6947, 6949, 6950, 6951, 356, 6952, 317, 5514, 381, - 6954, 6955, 6957, 6956, 5022, 351, 1030, 6959, 565, 1588, 393, 6961, 6962, 6963, 6964, 365, 6967, 6970, 2462, 6986, 7002, 7012, 7015, 7022, 317, 6971, 351, - 6972, 6976, 6979, 6983, 4943, 317, 574, 317, 1588, 6973, 6974, 6975, 6977, 317, 6978, 317, 317, 317, 6980, 5392, 317, 6981, 332, 365, 6982, 1020, 317, - 351, 6984, 6985, 317, 332, 317, 381, 332, 6987, 6989, 6990, 6988, 6991, 6992, 6072, 365, 317, 6994, 4980, 6995, 317, 6993, 6996, 6997, 5104, 6998, 351, - 7000, 7001, 345, 5037, 317, 6999, 363, 6704, 317, 7003, 7006, 363, 1428, 2067, 7011, 7004, 7005, 317, 7007, 7008, 345, 7009, 7010, 7013, 2322, 7014, 317, - 7016, 7017, 7018, 7021, 471, 2078, 471, 471, 471, 7019, 363, 7020, 1020, 363, 490, 7023, 2074, 7024, 370, 317, 7025, 7026, 7027, 7028, 7030, 7037, 7038, - 7042, 7046, 317, 1020, 2261, 7031, 7032, 490, 7035, 2462, 7036, 565, 7033, 7034, 317, 380, 2462, 867, 6916, 7039, 7040, 7041, 317, 433, 4268, 7043, 2156, - 6999, 565, 7044, 7045, 317, 7047, 7048, 7052, 7054, 7056, 7057, 381, 343, 7049, 7050, 7051, 317, 1347, 427, 7053, 7055, 2134, 404, 317, 490, 351, 2073, - 7059, 7063, 7065, 2413, 7077, 7080, 7089, 317, 345, 7093, 7060, 332, 490, 490, 5793, 7061, 317, 490, 317, 317, 7062, 7064, 4984, 7066, 5040, 7069, 7070, - 7071, 7067, 7068, 362, 574, 350, 7072, 2193, 2022, 7074, 2022, 7076, 404, 7073, 7075, 363, 5746, 2067, 2413, 3869, 363, 7078, 317, 7079, 7081, 7085, 748, - 7086, 345, 7082, 7083, 7084, 7087, 7088, 7090, 7092, 605, 7091, 343, 343, 4925, 990, 343, 317, 5810, 2108, 7095, 7096, 317, 5332, 1383, 7097, 7099, 7102, - 7107, 7119, 7124, 317, 7130, 2396, 7131, 7133, 7144, 7146, 7148, 7150, 7152, 7193, 490, 490, 317, 351, 317, 490, 7098, 490, 7100, 7101, 565, 7103, 1347, - 7104, 7105, 7106, 317, 1100, 2035, 1160, 2271, 490, 7108, 7109, 7115, 339, 7110, 7111, 351, 351, 7112, 317, 7113, 7114, 317, 7116, 317, 7117, 7118, 7120, - 7121, 317, 490, 7122, 317, 7123, 7125, 7128, 317, 490, 490, 6974, 7129, 7126, 7127, 651, 1209, 317, 363, 332, 317, 7132, 1325, 466, 2571, 317, 5788, - 7134, 2012, 490, 7136, 439, 490, 317, 7135, 490, 7137, 317, 7143, 7138, 7139, 7140, 317, 7141, 7142, 317, 7145, 7147, 5238, 317, 348, 7149, 7151, 7153, - 7154, 7161, 320, 7163, 2767, 7164, 7165, 7166, 7167, 7180, 7181, 566, 7184, 7188, 345, 1548, 317, 7192, 1155, 317, 317, 317, 317, 1160, 7155, 317, 317, - 7157, 7156, 633, 7158, 7159, 7160, 7162, 2885, 317, 317, 317, 317, 4857, 621, 317, 317, 1155, 317, 317, 1168, 317, 350, 7168, 7169, 7170, 362, 317, - 7171, 7175, 7172, 317, 7173, 317, 7174, 1160, 317, 7176, 7177, 317, 4984, 5793, 7178, 317, 7179, 2108, 490, 317, 566, 317, 317, 2146, 7182, 7183, 345, - 7185, 7186, 7187, 7189, 7190, 7191, 7194, 7195, 7196, 7198, 7204, 317, 7206, 7208, 7211, 404, 501, 7199, 488, 642, 7200, 7201, 673, 922, 1588, 317, 7202, - 7203, 7205, 489, 317, 1108, 317, 7207, 365, 317, 5439, 7209, 356, 7210, 332, 317, 4984, 317, 7212, 7213, 404, 317, 317, 317, 490, 1160, 7214, 7216, - 7218, 7228, 7230, 7233, 7243, 317, 317, 7217, 7219, 7224, 317, 317, 7226, 7220, 7221, 317, 7222, 317, 7223, 7225, 7227, 404, 5616, 317, 7229, 7231, 7232, - 317, 490, 7234, 356, 7238, 7235, 7236, 7237, 317, 7239, 7240, 7241, 7242, 7244, 1588, 7245, 7246, 7248, 7251, 7252, 7249, 365, 7250, 2110, 1526, 7253, 7254, - 949, 7256, 7259, 7262, 490, 7268, 1383, 7270, 362, 317, 343, 7286, 7291, 7300, 7302, 7303, 7307, 7309, 7316, 343, 317, 7318, 7319, 355, 490, 7257, 7258, - 317, 345, 466, 2073, 7260, 1347, 7261, 317, 2715, 7263, 7265, 7266, 490, 317, 7267, 7264, 317, 867, 343, 6228, 317, 317, 317, 317, 7269, 317, 1109, - 317, 6434, 317, 7271, 7272, 7274, 7283, 390, 2146, 7273, 2184, 7275, 356, 466, 5399, 317, 7276, 7277, 7278, 7279, 7280, 7281, 7282, 7284, 7285, 7287, 7290, - 7288, 7289, 448, 317, 7292, 317, 2067, 490, 7299, 7293, 7296, 1267, 7294, 7295, 7297, 7298, 681, 1481, 1913, 490, 7301, 5640, 332, 1588, 7304, 7305, 381, - 7306, 7308, 7310, 317, 7313, 490, 490, 7314, 490, 7315, 317, 7311, 7312, 1160, 351, 490, 7317, 317, 4925, 1044, 317, 7320, 1358, 7322, 7324, 389, 7332, - 7333, 7334, 7335, 7338, 7325, 7329, 390, 7326, 7328, 7327, 317, 397, 7330, 1347, 7331, 490, 5634, 7336, 7337, 7339, 2156, 7340, 7341, 7342, 7344, 7358, 7364, - 7366, 7369, 2024, 7406, 7411, 7412, 7425, 7434, 7435, 7444, 7445, 7446, 7461, 7464, 1020, 7468, 7470, 343, 2272, 7343, 589, 1331, 317, 317, 317, 949, 649, - 7345, 1020, 7347, 573, 7035, 7351, 7352, 7353, 7355, 7357, 317, 7346, 317, 710, 354, 7348, 7349, 7350, 4984, 3999, 6228, 317, 363, 404, 317, 7354, 395, - 7356, 7359, 5960, 7360, 7361, 7362, 471, 7363, 7365, 371, 363, 370, 351, 7367, 7368, 5626, 4984, 7370, 7387, 7388, 7390, 7395, 7400, 7402, 317, 7404, 7371, - 7372, 7373, 7375, 7378, 7381, 1345, 5167, 5324, 317, 2590, 7374, 7376, 382, 7377, 356, 7379, 7380, 317, 433, 345, 317, 7382, 2211, 317, 7385, 7383, 7384, - 7386, 1347, 339, 5241, 7389, 439, 6228, 317, 7391, 7393, 317, 7394, 5840, 6089, 7392, 4952, 317, 390, 4943, 373, 4965, 608, 363, 5809, 7396, 362, 317, - 404, 7398, 317, 5055, 7397, 317, 317, 345, 381, 7399, 7401, 5788, 7403, 6433, 317, 2631, 1358, 317, 7405, 7407, 7409, 5346, 2063, 7408, 350, 343, 317, - 350, 7410, 350, 7413, 7415, 7416, 362, 7420, 317, 7422, 7423, 427, 7414, 2156, 317, 317, 7417, 2063, 7418, 7419, 350, 317, 7421, 351, 554, 404, 7314, - 6412, 7424, 7389, 7426, 2272, 7429, 7430, 7427, 7428, 1325, 2058, 7431, 7432, 7433, 530, 2117, 317, 7436, 2036, 317, 7437, 1109, 7439, 7441, 381, 350, 7442, - 5273, 5501, 5611, 1481, 7438, 7440, 2329, 5399, 1526, 7443, 356, 466, 317, 373, 5709, 317, 476, 1020, 1999, 332, 356, 6864, 4962, 7447, 7450, 7401, 7451, - 7453, 7454, 1060, 7457, 7448, 7449, 7452, 406, 514, 7455, 7456, 6420, 343, 7458, 7459, 7460, 380, 7462, 2060, 7463, 381, 2208, 5717, 1347, 472, 7465, 7466, - 7467, 380, 427, 7469, 2063, 3007, 345, 5623, 2631, 466, 5746, 1358, 404, 7472, 7484, 3023, 7491, 7496, 6601, 7503, 317, 7473, 7474, 7475, 7478, 7482, 5120, - 1345, 5710, 7483, 412, 332, 350, 7476, 7477, 7479, 317, 7481, 7480, 5392, 1108, 332, 490, 1087, 363, 490, 2004, 332, 7485, 7487, 7489, 7490, 2004, 351, - 7486, 2146, 317, 317, 7488, 7492, 7493, 7494, 7495, 7497, 7499, 7500, 7501, 5223, 7498, 1347, 351, 343, 7502, 7504, 7507, 7505, 7506, 7508, 7509, 345, 2146, - 7511, 2391, 363, 7513, 381, 7515, 7517, 317, 565, 7518, 396, 7520, 317, 7522, 7523, 7524, 7526, 7514, 1160, 7516, 317, 2110, 1160, 7519, 490, 357, 5611, - 317, 317, 2260, 7521, 317, 7525, 317, 7527, 7529, 7531, 7547, 7573, 317, 7530, 4943, 317, 5570, 490, 7532, 7533, 363, 317, 317, 317, 7534, 7535, 7536, - 7537, 7538, 7539, 7540, 7541, 7542, 7543, 7544, 7545, 7546, 7548, 7569, 363, 7570, 7549, 7550, 317, 317, 317, 1353, 317, 317, 7556, 2077, 362, 7561, 7563, - 7566, 7568, 5037, 1267, 7551, 7552, 7553, 7554, 7555, 7557, 1188, 7558, 317, 7559, 317, 7560, 5492, 7562, 7564, 343, 7565, 7567, 4591, 317, 345, 7571, 7572, - 7574, 317, 565, 317, 1160, 317, 345, 7576, 7577, 7578, 7579, 1230, 7579, 2163, 7581, 7583, 356, 2074, 317, 7582, 390, 7584, 2301, 7585, 7587, 7589, 404, - 7591, 7593, 7595, 362, 7599, 7600, 361, 7601, 1060, 343, 7588, 2178, 5624, 7590, 7448, 448, 7592, 392, 7594, 317, 7596, 7597, 7598, 7447, 317, 317, 356, - 7602, 426, 7604, 7618, 7619, 7643, 7652, 501, 7661, 7664, 7675, 7683, 1700, 7688, 7689, 317, 7605, 317, 7607, 7609, 7610, 317, 7613, 317, 7616, 317, 2035, - 7606, 7608, 1459, 7611, 2369, 7612, 5328, 5570, 345, 7614, 317, 7615, 7617, 2381, 489, 1160, 4591, 7620, 7628, 317, 317, 748, 317, 7621, 7622, 7623, 7625, - 2108, 4949, 4949, 7624, 7626, 7627, 7629, 6425, 7630, 7631, 7632, 7633, 317, 7634, 7635, 7639, 7636, 7637, 7638, 7640, 7641, 2510, 317, 370, 317, 382, 5055, - 7642, 7644, 7646, 7647, 7648, 7650, 317, 7645, 317, 2152, 396, 7452, 7649, 390, 343, 7651, 1358, 2146, 7653, 317, 7655, 7656, 7658, 350, 7654, 317, 349, - 345, 7657, 7659, 7660, 1347, 460, 7662, 7663, 4984, 371, 2298, 343, 7665, 7669, 6355, 7670, 7673, 2035, 317, 7674, 7666, 7667, 7668, 7671, 5028, 7672, 2410, - 7676, 7679, 7680, 7677, 7678, 350, 7681, 7682, 317, 401, 7684, 7685, 3751, 7686, 7687, 7691, 7693, 393, 7696, 7697, 317, 7706, 490, 7692, 5238, 1108, 7694, - 489, 7695, 551, 2581, 7698, 7699, 7701, 7705, 317, 7700, 317, 741, 427, 7702, 7703, 7704, 1358, 317, 345, 7708, 7714, 7720, 7723, 317, 5237, 317, 373, - 7709, 7710, 345, 1108, 490, 7711, 332, 7712, 2322, 317, 6981, 7713, 317, 317, 351, 332, 317, 7715, 7717, 317, 317, 317, 7716, 7718, 7719, 332, 2462, - 317, 404, 490, 4965, 7196, 7721, 7722, 357, 332, 7724, 7726, 6318, 363, 1992, 7727, 3573, 362, 7098, 565, 490, 317, 7729, 7730, 4591, 490, 1459, 317, - 317, 490, 490, 363, 7266, 7732, 7733, 7734, 7735, 7736, 7737, 7738, 7739, 7745, 7746, 7813, 7859, 7862, 7863, 7903, 7904, 7912, 355, 7943, 7945, 7959, 7970, - 7991, 8028, 8032, 8046, 8048, 8053, 8055, 7740, 7741, 7742, 7743, 7744, 7747, 7748, 7749, 350, 317, 5687, 7757, 7758, 365, 7766, 490, 7772, 7793, 7794, 7803, - 7804, 490, 7806, 373, 343, 350, 2222, 317, 7750, 357, 7756, 317, 7751, 7752, 317, 7753, 7754, 7755, 351, 1943, 317, 7759, 7761, 6565, 466, 401, 7760, - 7762, 7763, 7764, 7765, 5223, 2537, 7767, 7523, 317, 317, 1358, 7770, 490, 7768, 2272, 637, 7769, 633, 694, 317, 317, 1267, 317, 7771, 5130, 7773, 7777, - 7778, 7780, 7783, 7785, 5619, 317, 7786, 317, 7774, 7776, 7775, 7779, 363, 7781, 7782, 7784, 7787, 7788, 7789, 7790, 317, 7791, 7792, 317, 345, 363, 5363, - 490, 317, 7795, 317, 568, 7802, 7796, 7798, 7797, 7799, 7800, 7801, 317, 1033, 343, 7805, 363, 7807, 7808, 7811, 390, 7809, 7810, 7812, 2603, 317, 345, - 5217, 490, 317, 7814, 7822, 7827, 7840, 7842, 7844, 7851, 2163, 490, 365, 317, 7815, 332, 7816, 7817, 7818, 7819, 7820, 433, 7821, 590, 7823, 7824, 637, - 1266, 317, 633, 2077, 7825, 7826, 317, 4980, 317, 6021, 317, 523, 7828, 6266, 7832, 490, 7835, 7838, 7829, 7830, 7831, 7833, 5200, 7834, 7836, 7837, 1347, - 345, 7839, 7841, 393, 317, 7843, 317, 345, 7845, 7846, 990, 349, 317, 5788, 393, 7847, 7849, 317, 7848, 2272, 4984, 5439, 317, 345, 7850, 7852, 7853, - 7856, 7857, 7854, 7855, 447, 7858, 7860, 7861, 7852, 5993, 317, 342, 7864, 7866, 490, 4943, 7867, 7869, 7870, 7874, 7875, 7882, 7895, 7899, 317, 317, 7901, - 7865, 332, 2178, 7868, 7871, 7872, 317, 466, 317, 317, 382, 7873, 410, 7876, 7877, 7879, 5200, 490, 7881, 356, 466, 5399, 2381, 317, 7878, 7880, 317, - 350, 317, 7883, 362, 317, 7893, 317, 317, 7884, 332, 1109, 7890, 317, 7892, 7885, 741, 7889, 345, 317, 317, 317, 7886, 317, 317, 317, 7887, 317, - 317, 345, 427, 7888, 7891, 317, 7894, 554, 363, 7055, 2291, 7896, 7897, 7898, 2322, 490, 1444, 7900, 412, 350, 6551, 2291, 7902, 936, 363, 7905, 7907, - 7906, 7908, 7909, 7910, 7911, 7913, 7914, 7917, 7922, 7923, 7926, 7927, 381, 7932, 7934, 7937, 7942, 7915, 317, 317, 7916, 345, 7918, 7919, 317, 363, 7920, - 7921, 317, 7924, 7925, 317, 620, 345, 317, 7928, 1347, 317, 490, 7929, 7930, 317, 5603, 317, 7931, 7933, 6600, 317, 355, 317, 3505, 5570, 317, 5332, - 317, 7935, 7936, 5325, 7938, 7940, 317, 7941, 7939, 7944, 363, 7946, 7948, 7950, 7955, 7958, 7947, 317, 2024, 317, 7949, 7951, 317, 7952, 7953, 7954, 7956, - 345, 7957, 5087, 317, 4984, 2156, 427, 7960, 317, 7963, 363, 7961, 7962, 370, 7964, 7965, 7969, 7966, 7967, 7968, 345, 339, 7971, 332, 7972, 7973, 317, - 7974, 7975, 7977, 1347, 381, 7987, 317, 5439, 332, 317, 2610, 7976, 490, 317, 343, 5105, 7978, 7979, 7980, 7981, 7982, 7984, 7985, 5325, 317, 2142, 5788, - 317, 5033, 317, 317, 343, 7983, 345, 7986, 7988, 7989, 317, 7990, 317, 7992, 7994, 7996, 8012, 8015, 317, 8022, 8024, 317, 382, 7993, 317, 490, 317, - 7995, 317, 1347, 4952, 7997, 8001, 8010, 317, 7998, 7999, 8000, 8002, 363, 8004, 8006, 8003, 5055, 4591, 8005, 345, 2163, 8007, 2627, 8008, 8009, 317, 8011, - 8013, 8014, 8016, 8017, 317, 8018, 8021, 8019, 2184, 5488, 8020, 8023, 343, 8025, 8026, 2156, 8027, 1325, 5054, 8029, 1020, 2310, 8030, 317, 317, 7776, 390, - 343, 8031, 8033, 7737, 8034, 380, 8036, 8037, 8038, 8039, 6674, 7590, 8035, 365, 2219, 6674, 1453, 367, 8040, 8045, 5309, 363, 8041, 8042, 8043, 8044, 8047, - 7850, 371, 8049, 8050, 357, 8052, 8051, 2521, 5675, 466, 317, 370, 8054, 6228, 8056, 8057, 8061, 8062, 317, 317, 393, 343, 8058, 2366, 8059, 8060, 8063, - 8064, 343, 8065, 8066, 8067, 8068, 8077, 8185, 8187, 8209, 8305, 8330, 8334, 8420, 8429, 8472, 8479, 8491, 8492, 8564, 1060, 8590, 8592, 8595, 17, 8871, 8882, - 8883, 8884, 8888, 8907, 8069, 8070, 8071, 8072, 8073, 8074, 8075, 8076, 8078, 8084, 8097, 8103, 8112, 8118, 1347, 8119, 8123, 8140, 8145, 8149, 8154, 8160, 8171, - 332, 8181, 490, 8079, 8082, 343, 525, 8080, 8081, 8083, 8085, 8088, 350, 8094, 8096, 8086, 8087, 8089, 8090, 8091, 8092, 8093, 1347, 401, 2004, 595, 8095, - 381, 8098, 332, 8100, 8101, 351, 8099, 8102, 317, 5727, 380, 5241, 8104, 8106, 8105, 8107, 8108, 8109, 5241, 8110, 8111, 8113, 317, 8117, 8114, 8115, 8116, - 2948, 381, 338, 8120, 8121, 2003, 8122, 633, 8124, 8125, 8126, 1943, 8130, 8131, 8133, 8134, 8127, 8128, 8129, 317, 434, 8132, 7380, 7834, 317, 2156, 317, - 316, 385, 8135, 8138, 8139, 8136, 8137, 1347, 1347, 5699, 8141, 2110, 1481, 8142, 8143, 8144, 345, 8146, 6409, 365, 8147, 490, 317, 1444, 8148, 3236, 8150, - 393, 2110, 8151, 8152, 8153, 2094, 2163, 8155, 317, 8159, 5241, 8156, 8157, 317, 1160, 317, 8158, 317, 7242, 6402, 317, 8161, 490, 8163, 8162, 365, 8164, - 8169, 8165, 8166, 8167, 490, 8168, 490, 1347, 345, 1109, 8170, 317, 8172, 5482, 8173, 8174, 8179, 317, 8175, 8176, 8177, 8178, 8180, 317, 7560, 4268, 8182, - 8183, 8184, 8186, 8188, 8190, 8196, 8201, 317, 8206, 8207, 3361, 8208, 7942, 317, 8189, 8191, 8193, 381, 8192, 6993, 8194, 2510, 8195, 380, 596, 317, 8197, - 488, 8198, 5238, 8199, 5201, 8200, 356, 466, 362, 317, 5634, 317, 317, 8202, 8204, 490, 332, 8203, 8205, 1915, 1109, 8170, 490, 2146, 949, 8210, 8220, - 8232, 8233, 8235, 8239, 8297, 8299, 8303, 8211, 8215, 574, 370, 8218, 490, 317, 2110, 8212, 5241, 8213, 8214, 8216, 8217, 8219, 363, 343, 7949, 8221, 8229, - 317, 5896, 8222, 8223, 8225, 362, 363, 8226, 4980, 8224, 6594, 371, 317, 363, 8227, 6046, 317, 8228, 317, 5037, 8230, 363, 8231, 2178, 490, 651, 3726, - 317, 362, 490, 8234, 317, 317, 8236, 8237, 8238, 350, 363, 2211, 317, 317, 362, 8240, 8246, 8263, 343, 8269, 404, 8286, 317, 8292, 8241, 8242, 317, - 8244, 8245, 7850, 365, 317, 8243, 317, 332, 371, 6228, 8247, 8251, 382, 8252, 317, 317, 8253, 8254, 8255, 2715, 6817, 8256, 8261, 621, 8248, 317, 633, - 633, 2163, 317, 8249, 489, 317, 363, 363, 8250, 317, 317, 6831, 1109, 6228, 317, 490, 7384, 365, 2715, 5890, 317, 363, 317, 681, 8257, 8258, 651, - 1353, 317, 1025, 1353, 317, 345, 8259, 1160, 317, 317, 1267, 317, 317, 8260, 8262, 7118, 490, 1267, 1209, 4984, 8264, 8265, 490, 8267, 8268, 317, 317, - 8266, 317, 7186, 343, 345, 8270, 6355, 8273, 8276, 8279, 8281, 8282, 8271, 8272, 8274, 8275, 2410, 8277, 8278, 8280, 4591, 2086, 317, 8283, 370, 8284, 8285, - 2163, 8287, 5890, 317, 8288, 8289, 8290, 8291, 8293, 8294, 8295, 8296, 748, 8298, 3361, 637, 1300, 8300, 633, 694, 8301, 362, 8302, 490, 8304, 1481, 8306, - 8309, 8310, 343, 2067, 8312, 8324, 8326, 8329, 317, 317, 8307, 5038, 1481, 8308, 490, 5439, 8311, 6188, 8313, 317, 8316, 8314, 8315, 8317, 345, 8318, 8319, - 8110, 8320, 317, 8321, 8322, 8323, 490, 8325, 343, 8327, 363, 8328, 8331, 8332, 2551, 8333, 1489, 8335, 8338, 5205, 2134, 8366, 2146, 8385, 8398, 8406, 8408, - 404, 8410, 8419, 1020, 8178, 8336, 8337, 317, 8339, 8363, 8365, 8340, 8341, 8342, 317, 317, 8344, 8345, 317, 1353, 8346, 8347, 2077, 8348, 8349, 8352, 8356, - 8358, 8361, 8362, 363, 317, 673, 317, 1018, 317, 1267, 317, 317, 317, 8343, 317, 317, 317, 621, 889, 317, 367, 384, 490, 317, 2715, 2156, 8350, - 8351, 317, 8353, 317, 490, 6458, 8354, 8355, 317, 7143, 317, 317, 427, 317, 317, 8357, 317, 971, 8359, 8360, 317, 7672, 332, 317, 2715, 317, 8178, - 5890, 365, 971, 7386, 317, 5991, 466, 8364, 363, 317, 317, 363, 2236, 5570, 8367, 8368, 490, 8370, 317, 317, 8369, 7566, 2142, 365, 8371, 8375, 343, - 8376, 8379, 8382, 8372, 8373, 8374, 317, 2355, 6486, 5033, 8377, 8378, 8380, 8381, 8383, 8384, 8386, 8387, 8393, 8397, 427, 5793, 345, 356, 317, 8388, 317, - 8391, 317, 1347, 8392, 404, 317, 5898, 8389, 8390, 363, 350, 4984, 8394, 1992, 8395, 8396, 7888, 7888, 7437, 741, 317, 8399, 8401, 317, 490, 8402, 2715, - 8404, 343, 8400, 4984, 317, 317, 8403, 8405, 317, 8407, 317, 371, 351, 370, 7657, 8409, 8411, 8413, 8415, 5570, 2381, 8412, 8414, 317, 317, 1526, 6228, - 317, 8416, 8417, 317, 8418, 3505, 8421, 8422, 8424, 365, 8425, 8423, 8426, 8428, 8427, 2261, 4591, 317, 433, 8430, 365, 5033, 490, 8431, 8432, 8452, 8454, - 8456, 8457, 8460, 8471, 2210, 317, 8433, 8446, 8447, 8449, 345, 8434, 8438, 8441, 8443, 317, 317, 8435, 345, 8436, 8437, 8439, 8440, 8442, 5447, 5113, 2510, - 8444, 8445, 8448, 8450, 5459, 8451, 8453, 490, 4980, 8455, 7242, 427, 8458, 8459, 317, 317, 8461, 8465, 8466, 490, 404, 317, 8462, 8463, 8464, 8467, 8468, - 8469, 8470, 6420, 490, 371, 490, 8473, 8476, 582, 8478, 7949, 365, 8474, 317, 317, 8475, 574, 490, 8477, 317, 2280, 317, 6600, 8480, 8485, 317, 489, - 8487, 2022, 8489, 8481, 8482, 8483, 8484, 8486, 8266, 427, 8488, 8490, 427, 427, 8493, 8518, 8531, 8545, 8547, 8554, 8563, 8494, 8499, 673, 649, 8501, 8504, - 8505, 8508, 8511, 8512, 8515, 317, 317, 8495, 317, 8496, 633, 8497, 8498, 8500, 317, 1519, 1889, 621, 317, 8502, 343, 8503, 382, 390, 320, 4314, 317, - 8506, 8507, 317, 8509, 317, 2351, 8510, 8513, 8514, 2146, 5570, 8516, 8517, 8519, 370, 343, 8520, 8523, 8526, 8527, 8528, 8530, 351, 8521, 343, 345, 8522, - 343, 8524, 8525, 8529, 5365, 5447, 466, 6195, 8532, 8537, 8538, 490, 8234, 5862, 490, 8540, 8533, 317, 8534, 317, 8535, 8536, 6228, 317, 317, 2077, 317, - 317, 8539, 8541, 8542, 8543, 8544, 8546, 8548, 5051, 8550, 8552, 8549, 332, 8551, 5708, 356, 8553, 317, 8555, 5200, 8558, 317, 8559, 8562, 5890, 8556, 8557, - 370, 317, 351, 1526, 3854, 345, 8560, 8561, 8565, 317, 8566, 490, 8568, 8570, 8573, 1060, 8579, 8581, 317, 8585, 8588, 490, 401, 1347, 8557, 8567, 317, - 8569, 8571, 343, 8572, 596, 4591, 317, 8574, 8575, 8576, 4965, 397, 8577, 345, 8578, 8580, 8582, 8584, 8583, 8586, 8587, 8589, 317, 8591, 8593, 8594, 8596, - 8598, 8601, 8604, 565, 8606, 317, 8607, 8609, 7600, 8615, 8618, 5238, 317, 8597, 8599, 332, 8600, 8602, 5865, 8603, 5309, 8605, 381, 317, 7983, 363, 317, - 5309, 370, 4738, 8608, 8610, 8614, 8611, 8612, 8613, 8616, 2272, 8617, 356, 381, 317, 8619, 8620, 410, 356, 466, 317, 6228, 8621, 8638, 8639, 8640, 8661, - 8691, 8826, 8829, 362, 8831, 8857, 1345, 8864, 8865, 8867, 5087, 8622, 8626, 8627, 317, 8634, 490, 8623, 8624, 8625, 8158, 5441, 8628, 317, 490, 8629, 317, - 8630, 8631, 8632, 8633, 317, 8635, 345, 8636, 8637, 5450, 8641, 8644, 317, 8648, 8650, 8652, 8655, 8656, 317, 8642, 317, 8643, 8645, 8646, 8647, 317, 8649, - 8651, 317, 8653, 351, 7385, 8654, 8657, 8659, 8658, 8660, 8662, 8665, 8666, 8676, 6903, 317, 8663, 343, 1347, 317, 8664, 317, 8667, 8670, 8674, 8668, 8669, - 8671, 8672, 8673, 317, 345, 1526, 317, 8675, 317, 6996, 317, 317, 317, 317, 317, 317, 317, 8677, 8678, 2627, 317, 8679, 339, 8680, 8681, 8683, 8685, - 8687, 8682, 8684, 8686, 8688, 8689, 8690, 521, 317, 8692, 8696, 8703, 8736, 8741, 8742, 8749, 8752, 8754, 8757, 8764, 8768, 8776, 8787, 8793, 8799, 8816, 8821, - 565, 8693, 8694, 8695, 8697, 345, 8701, 8702, 8698, 8699, 8700, 8704, 8705, 8710, 8714, 8723, 317, 8734, 8706, 6602, 8707, 8708, 8709, 8711, 8712, 8713, 5447, - 5987, 448, 8715, 8716, 8719, 8717, 343, 8718, 8720, 8721, 8722, 8724, 8727, 8730, 8725, 8726, 8728, 8729, 8731, 8732, 8733, 8735, 8737, 574, 8738, 8739, 8740, - 8743, 3236, 8745, 8747, 8744, 8746, 8748, 8271, 5173, 8750, 5217, 8751, 317, 389, 345, 867, 8753, 317, 8755, 317, 8756, 363, 8758, 8760, 2590, 8759, 349, - 8761, 8762, 8763, 8765, 8767, 8766, 7865, 345, 8769, 8771, 343, 8773, 8774, 8770, 8772, 8775, 8777, 5054, 8782, 8783, 8784, 8778, 317, 8781, 8779, 8780, 5784, - 332, 343, 8785, 8786, 8788, 8789, 1347, 8792, 8790, 1526, 8791, 317, 5055, 345, 382, 5201, 8794, 8795, 8796, 8797, 8798, 8800, 8805, 497, 490, 8808, 8812, - 8801, 393, 2094, 8802, 8803, 8804, 8806, 8807, 8809, 8810, 8811, 8813, 8814, 8815, 2193, 8817, 8819, 2026, 8820, 8818, 2163, 520, 8822, 8824, 8823, 363, 427, - 8825, 8827, 8828, 8830, 8832, 490, 8835, 8837, 8839, 8855, 490, 8833, 8834, 8836, 371, 8838, 345, 7126, 8840, 8842, 8847, 8853, 6046, 7385, 317, 8841, 2086, - 8843, 8484, 8845, 8844, 8846, 8848, 390, 8849, 8850, 8851, 317, 8852, 489, 8275, 317, 317, 317, 317, 345, 317, 317, 317, 317, 365, 317, 2715, 317, - 7185, 8854, 317, 2108, 8856, 8858, 8859, 362, 1020, 317, 4591, 2279, 8860, 8861, 8862, 8863, 8866, 317, 5392, 363, 8868, 7916, 8869, 8870, 8872, 8873, 8875, - 8876, 8881, 1481, 8874, 8877, 8878, 317, 8879, 8880, 8885, 5200, 8886, 8887, 6670, 8889, 8891, 8895, 2171, 2272, 8897, 8898, 489, 8905, 8890, 8892, 8893, 8894, - 8896, 8899, 8900, 490, 3999, 382, 8901, 8902, 8903, 8904, 1531, 8906, 8908, 365, 8911, 8912, 8913, 317, 317, 8909, 8910, 2272, 2612, 317, 8610, 490, 8914, - 596, 370, 490, 390, 8916, 365, 8917, 8920, 8921, 8922, 489, 8923, 363, 8926, 866, 343, 949, 632, 426, 8918, 8919, 2719, 317, 412, 7906, 8924, 8925, - 8927, 317, 345, 8945, 8957, 565, 8958, 8969, 8973, 8974, 8979, 8980, 9043, 9158, 9169, 9173, 9178, 9186, 3426, 8928, 8931, 1108, 8932, 2081, 490, 8938, 8941, - 4965, 8929, 8930, 317, 1011, 317, 2280, 2280, 8933, 8934, 8611, 8935, 343, 8936, 8937, 8939, 5571, 490, 317, 8940, 5888, 5399, 8942, 574, 8943, 2094, 317, - 8944, 317, 317, 8946, 362, 8949, 8950, 8956, 317, 317, 8947, 362, 1020, 8948, 596, 8951, 8953, 8952, 8954, 8955, 8959, 8960, 8961, 8962, 8964, 5226, 317, - 8963, 8965, 8966, 8967, 8968, 1358, 8549, 8970, 514, 5237, 317, 8971, 8972, 351, 3999, 8975, 370, 8976, 8978, 356, 2094, 8977, 8981, 8990, 380, 558, 9001, - 9006, 5792, 9028, 9032, 9039, 8982, 8986, 8989, 8983, 8984, 8985, 343, 8636, 8987, 8988, 8991, 8992, 2280, 5483, 8993, 8994, 8995, 8996, 8997, 8998, 8999, 9000, - 9002, 9005, 9003, 9004, 9007, 9014, 9023, 565, 9008, 9013, 9009, 9010, 9011, 9012, 9015, 9018, 9016, 9017, 1588, 2163, 9019, 317, 9020, 9021, 9022, 4984, 345, - 9024, 9027, 6163, 9025, 317, 317, 345, 9026, 5717, 5447, 466, 1347, 2163, 490, 9029, 9030, 9031, 2163, 401, 9033, 9034, 2156, 9035, 9037, 317, 370, 2156, - 9036, 574, 339, 345, 9038, 9040, 9041, 9042, 5652, 8544, 490, 9044, 9054, 9082, 9084, 9105, 9119, 9120, 317, 317, 9045, 9049, 9050, 9046, 5174, 6199, 9047, - 9048, 9051, 9053, 5365, 9052, 9055, 9058, 9065, 9076, 9079, 5273, 9056, 9057, 5708, 356, 466, 317, 5019, 466, 9059, 9060, 466, 9061, 362, 9064, 317, 574, - 501, 9062, 317, 4268, 9063, 317, 5054, 9066, 9073, 9067, 9068, 9071, 9069, 317, 9070, 9072, 382, 317, 345, 5828, 9074, 9075, 9077, 404, 317, 9078, 9080, - 5634, 9081, 2510, 466, 9083, 343, 317, 345, 9085, 9087, 9101, 9104, 2184, 9086, 5363, 343, 9088, 6996, 317, 317, 317, 9089, 2171, 9091, 9093, 2052, 317, - 2058, 9096, 9098, 9099, 550, 741, 9090, 448, 317, 317, 448, 9092, 545, 1358, 384, 9094, 9095, 1266, 317, 9097, 1526, 363, 343, 317, 9100, 2627, 574, - 5708, 9102, 5464, 1992, 965, 9103, 5457, 4268, 5167, 9106, 9110, 9111, 9114, 9107, 9108, 9109, 466, 5399, 317, 332, 5431, 9112, 9113, 9115, 9116, 9117, 9118, - 9121, 9125, 9141, 9142, 9122, 9123, 4564, 9124, 9126, 9131, 9134, 9127, 9128, 6020, 9129, 5447, 9130, 382, 363, 343, 9132, 9133, 5363, 5220, 9135, 9136, 9137, - 9138, 317, 9139, 9140, 9143, 5488, 9146, 9152, 9153, 9144, 9145, 410, 5464, 466, 9147, 9148, 9149, 9150, 9151, 5113, 317, 370, 2571, 317, 4564, 5447, 8553, - 9154, 9155, 9156, 381, 9157, 7640, 5113, 9159, 9160, 9161, 9168, 5056, 380, 9162, 9163, 9164, 9165, 9166, 9167, 621, 317, 317, 317, 317, 317, 490, 317, - 317, 1347, 2086, 2110, 9170, 2609, 9171, 8392, 9172, 9174, 9175, 9177, 370, 9176, 363, 4040, 490, 9179, 9181, 9183, 317, 9185, 9180, 9182, 5217, 9184, 9188, - 2073, 490, 380, 9192, 9196, 9218, 2776, 9189, 9190, 9191, 317, 9193, 9194, 9195, 9197, 9208, 9210, 9198, 9199, 317, 7149, 5379, 9201, 9203, 317, 9206, 9200, - 9202, 4984, 2271, 9204, 4984, 317, 1915, 9205, 9207, 9209, 2210, 4591, 332, 2509, 9211, 9215, 1588, 9216, 9212, 9213, 9214, 9217, 2272, 5241, 9219, 9222, 9271, - 9294, 9411, 9428, 9463, 9464, 9499, 9502, 9556, 9560, 9579, 9588, 9653, 9678, 9703, 9708, 9714, 9762, 9784, 9868, 9879, 9885, 9888, 9889, 9891, 9220, 9221, 949, - 9223, 9229, 9237, 9239, 9240, 9246, 9247, 9249, 9250, 9255, 9259, 965, 9262, 9263, 9266, 9267, 9270, 7850, 490, 9224, 9225, 9227, 343, 317, 2381, 9226, 5616, - 1109, 9228, 317, 5355, 490, 5488, 9230, 9232, 343, 9231, 490, 9233, 9235, 9236, 9234, 317, 6355, 9238, 317, 381, 2110, 9241, 9242, 9245, 365, 317, 317, - 9243, 5684, 8522, 9244, 9027, 3688, 317, 9248, 1347, 365, 8217, 490, 365, 7790, 9251, 9252, 332, 5419, 9254, 6394, 9253, 490, 5611, 1347, 9256, 1109, 7301, - 332, 9257, 317, 348, 9258, 317, 6555, 9260, 9261, 9264, 9265, 9268, 332, 317, 9269, 317, 5241, 5241, 6486, 317, 439, 332, 9272, 9273, 9276, 9283, 9288, - 9290, 2142, 317, 4943, 9274, 1108, 9275, 450, 317, 317, 9277, 332, 351, 9278, 9279, 363, 343, 317, 9280, 9282, 9281, 317, 317, 404, 2510, 9284, 9285, - 317, 9286, 351, 412, 412, 2004, 2004, 9287, 5105, 741, 9289, 317, 9291, 317, 9292, 365, 373, 9293, 345, 9295, 9302, 2163, 9305, 9396, 2301, 9399, 9401, - 9402, 9410, 9296, 9299, 332, 490, 574, 5447, 9297, 7000, 9298, 345, 317, 317, 317, 9300, 317, 427, 9301, 317, 317, 490, 5241, 3854, 9303, 317, 9304, - 9306, 9326, 9332, 9345, 9355, 2387, 9386, 9389, 9391, 9393, 7405, 3284, 9307, 339, 9317, 9323, 5105, 9308, 9309, 9314, 9310, 9311, 9312, 317, 9313, 4268, 9315, - 9316, 9318, 9319, 9320, 9321, 9322, 317, 9324, 9325, 428, 9327, 578, 9328, 9329, 9330, 9331, 401, 317, 373, 9333, 9338, 9343, 9334, 9335, 9336, 9337, 9339, - 9340, 9341, 9342, 363, 1347, 9344, 343, 363, 317, 6415, 9346, 9347, 9348, 9351, 317, 9352, 317, 9349, 9350, 9353, 9354, 380, 1347, 521, 9356, 9358, 9364, - 9365, 382, 9371, 9372, 9376, 9384, 9357, 9226, 578, 317, 9359, 9360, 9361, 9362, 9363, 9366, 9369, 9367, 9368, 9370, 9373, 317, 9374, 9375, 9377, 9382, 9378, - 9379, 8682, 317, 9380, 9381, 5701, 1347, 9383, 380, 5447, 9385, 382, 4268, 1347, 9387, 9388, 9390, 9392, 9394, 317, 9395, 317, 490, 2178, 490, 9364, 9397, - 2381, 332, 317, 9398, 317, 490, 9400, 317, 317, 9403, 9404, 5910, 1109, 5482, 9405, 9406, 9407, 9408, 9409, 574, 365, 317, 365, 9412, 317, 9414, 9417, - 9420, 350, 9421, 9424, 9425, 9426, 4974, 2391, 3361, 390, 362, 1345, 317, 9413, 390, 317, 342, 5482, 9415, 9416, 370, 9413, 362, 490, 5891, 9304, 2156, - 5324, 2219, 363, 317, 9418, 9419, 2272, 7035, 363, 1588, 363, 9422, 317, 9423, 370, 5271, 317, 9427, 4591, 9429, 9430, 9431, 7061, 317, 9432, 9433, 9435, - 9437, 9441, 2381, 9452, 9454, 9455, 9457, 9459, 7399, 2142, 2381, 8549, 7801, 3375, 9434, 345, 9436, 9438, 9439, 7657, 9440, 381, 9442, 9444, 9445, 317, 9448, - 345, 7035, 9451, 1100, 317, 9443, 1078, 5241, 317, 9446, 351, 2161, 317, 317, 9447, 390, 9449, 9450, 363, 554, 9453, 317, 9456, 317, 1943, 9458, 590, - 9460, 9461, 9462, 317, 1194, 362, 9465, 9467, 9475, 9476, 9477, 9480, 9481, 9493, 7053, 380, 9466, 7053, 7356, 5241, 9468, 317, 9474, 380, 7053, 9469, 8419, - 317, 9470, 9471, 317, 427, 317, 2178, 9472, 1347, 9473, 362, 1347, 5890, 363, 317, 2271, 332, 9478, 1345, 343, 9479, 343, 434, 5926, 9482, 7053, 9483, - 9484, 9487, 8273, 9489, 5223, 317, 9485, 317, 490, 9486, 332, 9488, 1992, 9490, 332, 9491, 9492, 6430, 317, 9494, 9495, 317, 5153, 9496, 317, 9497, 9498, - 9500, 9501, 345, 4212, 381, 9503, 9506, 9509, 9510, 317, 9513, 9514, 9515, 9516, 9518, 9519, 2357, 9520, 9543, 345, 9550, 9552, 9504, 380, 343, 317, 9505, - 317, 490, 317, 317, 5343, 6069, 317, 317, 1347, 9507, 317, 9508, 345, 397, 343, 9511, 1160, 9512, 345, 490, 2322, 381, 317, 9517, 2322, 317, 2080, - 317, 317, 5862, 5517, 390, 490, 317, 2322, 317, 9521, 1109, 9522, 9523, 343, 9526, 3429, 9524, 9525, 9527, 9529, 9531, 9528, 2156, 9530, 9532, 9533, 9536, - 317, 9539, 9541, 9534, 9535, 370, 7242, 9537, 9538, 9540, 9542, 1358, 317, 9544, 9545, 9546, 9547, 9548, 9549, 9551, 6851, 7565, 9553, 9555, 365, 9554, 490, - 7266, 9557, 6002, 2035, 9558, 9559, 9561, 9566, 9568, 9574, 2402, 9576, 7053, 9562, 9565, 1459, 9563, 343, 317, 9564, 2134, 348, 380, 490, 9567, 9569, 317, - 9570, 9571, 9572, 9573, 9575, 9577, 317, 9578, 9580, 9582, 9584, 9587, 317, 6318, 9581, 363, 990, 363, 4943, 5891, 317, 9583, 317, 1109, 5793, 317, 317, - 9585, 345, 490, 317, 9586, 6415, 6382, 9589, 9606, 9611, 9612, 9624, 9625, 1020, 317, 9637, 6255, 1479, 9641, 6089, 9650, 363, 9590, 9591, 9596, 2627, 5399, - 9599, 9602, 9603, 5022, 9592, 9593, 9594, 9595, 9597, 317, 338, 412, 9598, 4980, 4984, 9600, 1160, 9601, 317, 2035, 317, 317, 317, 9604, 9605, 9607, 9608, - 6355, 317, 9609, 9609, 9610, 317, 9613, 9616, 9617, 317, 7403, 9614, 9615, 9618, 536, 8214, 9621, 9619, 9620, 1108, 1108, 317, 2829, 9622, 4965, 4280, 9623, - 317, 9626, 345, 350, 6294, 9627, 9631, 9635, 2387, 9628, 9629, 365, 9630, 490, 317, 317, 9632, 9634, 9633, 345, 317, 9636, 355, 514, 2187, 1588, 356, - 1325, 9638, 9639, 356, 5784, 317, 317, 9640, 317, 356, 596, 317, 9642, 363, 9645, 9643, 9644, 9646, 466, 9647, 9648, 9649, 362, 9651, 9652, 9654, 9658, - 9660, 9662, 9665, 317, 9668, 9671, 9675, 9676, 2271, 501, 9655, 317, 9656, 317, 9657, 356, 428, 9659, 317, 5896, 6204, 380, 7114, 6046, 9661, 317, 1999, - 427, 9663, 9664, 1160, 317, 382, 9666, 317, 9667, 9669, 1358, 317, 5223, 316, 317, 9670, 5897, 9672, 9673, 5809, 9674, 363, 1131, 404, 317, 437, 9677, - 9679, 2142, 9681, 9687, 9693, 490, 9697, 9700, 9702, 332, 317, 9680, 9682, 363, 7891, 317, 9683, 393, 9684, 5732, 9685, 9686, 317, 317, 9688, 2280, 9689, - 9692, 9690, 317, 9691, 317, 2317, 363, 2310, 9694, 9695, 9696, 317, 9698, 8611, 9699, 1325, 365, 9701, 380, 5447, 466, 9704, 9705, 6920, 317, 317, 332, - 539, 9706, 9707, 9709, 9710, 9712, 4591, 6394, 332, 9711, 9713, 381, 9715, 9721, 9731, 9737, 9747, 317, 2004, 9716, 2163, 9717, 9718, 9719, 9720, 9117, 380, - 343, 317, 6118, 1347, 9722, 9723, 2396, 9724, 9726, 2381, 2396, 5028, 9728, 317, 9730, 490, 345, 490, 7062, 9725, 5570, 363, 9727, 428, 7062, 9729, 356, - 466, 351, 317, 9732, 9733, 9734, 9735, 9736, 9738, 6409, 371, 489, 9739, 9740, 2381, 9741, 8937, 9742, 9746, 490, 357, 8337, 2134, 2067, 9325, 9743, 466, - 9744, 317, 9745, 6551, 2381, 9748, 9749, 332, 9750, 9751, 9757, 381, 9758, 9761, 317, 6551, 332, 9752, 9753, 9754, 9755, 9756, 317, 370, 9759, 2063, 9719, - 9760, 5570, 317, 1347, 9763, 9765, 9769, 9776, 9778, 9780, 9782, 9764, 9766, 9767, 9768, 1962, 9770, 317, 9771, 9774, 9775, 9772, 343, 3505, 317, 9773, 317, - 317, 317, 1331, 317, 317, 343, 317, 317, 317, 9777, 317, 317, 1020, 9779, 9781, 9783, 9785, 9787, 8301, 9793, 9795, 9817, 9819, 9828, 2022, 5662, 9858, - 9860, 9861, 9862, 1020, 9864, 9866, 9867, 651, 9786, 9788, 2163, 356, 9790, 9789, 9791, 9792, 9794, 6551, 9796, 490, 9797, 9807, 9816, 317, 9798, 9801, 672, - 9803, 9805, 490, 363, 345, 651, 9799, 9800, 9802, 9804, 317, 9806, 9808, 9810, 317, 317, 7590, 9809, 380, 345, 9811, 596, 9812, 9813, 9814, 9815, 5217, - 317, 9818, 5701, 317, 351, 392, 9820, 9826, 5828, 9821, 9822, 9823, 9824, 9825, 317, 9827, 317, 633, 362, 317, 6551, 558, 9829, 1347, 9837, 6409, 9840, - 4591, 9845, 9846, 9851, 427, 317, 9830, 9832, 9833, 9831, 9834, 9835, 317, 9836, 5447, 5113, 448, 5988, 9838, 9839, 345, 9841, 9842, 9843, 343, 9844, 350, - 362, 9847, 9848, 9849, 9850, 9852, 363, 9854, 9853, 317, 1347, 9855, 370, 317, 9856, 9857, 9859, 345, 490, 317, 317, 1060, 317, 4019, 516, 317, 9863, - 357, 6228, 883, 371, 317, 9865, 351, 381, 5217, 390, 9869, 9870, 332, 317, 9871, 317, 1459, 332, 590, 9872, 9877, 9873, 9874, 9875, 9876, 9878, 7776, - 9880, 9882, 9883, 317, 317, 490, 9881, 357, 332, 501, 317, 9884, 5926, 2381, 1325, 332, 8633, 2063, 9886, 9887, 9890, 390, 317, 5265, 1347, 9892, 363, + 310, 321, 326, 340, 583, 585, 591, 597, 1, 2, 7, 3104, 3376, 3665, 3911, 4077, 4337, 4598, 4774, 4780, 4790, 8, 23, 48, 74, 86, 95, + 107, 121, 133, 140, 145, 156, 164, 187, 194, 203, 225, 227, 238, 271, 283, 285, 292, 82737,302, 306, 84250,311, 312, 313, 314, 318, 315, + 316, 317, 319, 320, 322, 323, 324, 325, 327, 333, 328, 329, 330, 331, 332, 334, 335, 336, 337, 338, 339, 341, 344, 344, 344, 344, 344, + 344, 344, 346, 368, 391, 405, 411, 415, 429, 441, 451, 461, 463, 467, 474, 480, 494, 512, 526, 528, 532, 552, 564, 567, 569, 579, 342, + 343, 345, 347, 349, 352, 358, 364, 366, 348, 317, 350, 351, 353, 357, 354, 355, 356, 359, 317, 360, 361, 362, 363, 317, 365, 367, 317, + 317, 369, 374, 382, 383, 385, 386, 381, 370, 371, 317, 372, 373, 375, 381, 376, 377, 378, 379, 380, 384, 343, 387, 388, 389, 390, 392, + 394, 397, 398, 402, 393, 395, 396, 399, 400, 401, 403, 317, 404, 406, 407, 409, 408, 317, 390, 410, 363, 412, 317, 413, 414, 416, 420, + 422, 423, 428, 417, 419, 418, 421, 343, 317, 381, 317, 351, 424, 427, 425, 426, 430, 434, 435, 438, 431, 317, 432, 433, 317, 436, 356, + 437, 439, 440, 381, 363, 442, 444, 445, 449, 450, 443, 356, 343, 356, 343, 317, 390, 446, 447, 448, 370, 343, 317, 393, 317, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 384, 462, 412, 464, 466, 465, 468, 469, 470, 317, 473, 370, 356, 381, 343, 471, 343, 372, 472, 317, + 466, 433, 382, 371, 356, 381, 343, 317, 475, 476, 477, 400, 401, 343, 317, 349, 478, 343, 381, 419, 479, 481, 483, 491, 492, 482, 459, + 432, 484, 485, 486, 487, 488, 489, 490, 350, 317, 317, 493, 317, 317, 433, 390, 495, 499, 500, 501, 502, 419, 505, 350, 496, 497, 498, + 317, 490, 317, 370, 503, 504, 317, 506, 507, 508, 509, 510, 511, 513, 516, 517, 522, 524, 514, 515, 518, 317, 381, 350, 519, 520, 521, + 523, 525, 343, 527, 529, 530, 531, 380, 317, 371, 439, 433, 533, 534, 537, 343, 540, 543, 544, 546, 547, 465, 535, 536, 538, 396, 439, + 539, 541, 542, 317, 498, 381, 343, 317, 545, 548, 549, 317, 343, 550, 551, 553, 554, 555, 559, 560, 561, 332, 381, 556, 557, 558, 356, + 317, 562, 343, 563, 565, 566, 568, 570, 571, 572, 575, 577, 317, 317, 350, 380, 381, 381, 573, 574, 317, 317, 576, 390, 501, 578, 580, + 581, 390, 317, 582, 382, 317, 584, 586, 342, 587, 588, 351, 343, 589, 590, 592, 593, 594, 595, 596, 598, 599, 426, 606, 609, 539, 613, + 600, 601, 602, 603, 604, 605, 607, 608, 610, 612, 608, 611, 614, 317, 345, 615, 622, 676, 782, 845, 856, 871, 884, 902, 917, 938, 959, + 966, 967, 972, 983, 988, 994, 999, 1001, 616, 617, 618, 619, 621, 620, 623, 650, 654, 621, 655, 656, 657, 665, 666, 674, 624, 636, 317, + 317, 317, 317, 638, 317, 643, 625, 317, 317, 631, 634, 626, 317, 317, 317, 317, 317, 317, 317, 317, 370, 627, 317, 317, 317, 317, 317, + 628, 317, 317, 629, 317, 630, 632, 633, 635, 637, 639, 640, 641, 642, 644, 646, 645, 647, 648, 649, 317, 620, 651, 652, 653, 317, 658, + 660, 620, 662, 663, 659, 661, 664, 317, 667, 670, 668, 669, 621, 671, 672, 673, 675, 677, 719, 725, 742, 749, 765, 768, 774, 678, 687, + 697, 701, 705, 708, 711, 715, 679, 685, 621, 356, 680, 621, 621, 621, 681, 682, 683, 684, 317, 317, 317, 317, 317, 317, 317, 317, 317, + 317, 686, 681, 681, 688, 695, 689, 690, 317, 691, 692, 693, 694, 696, 698, 699, 700, 702, 703, 704, 706, 707, 694, 621, 709, 710, 712, + 713, 714, 427, 317, 716, 717, 718, 720, 721, 724, 722, 723, 726, 741, 727, 733, 728, 729, 730, 731, 732, 734, 737, 735, 736, 738, 739, + 740, 743, 744, 746, 745, 747, 748, 750, 751, 757, 759, 752, 753, 754, 755, 756, 758, 760, 762, 761, 317, 756, 763, 764, 766, 767, 769, + 770, 771, 772, 773, 775, 776, 777, 778, 779, 780, 781, 783, 825, 834, 836, 843, 784, 788, 793, 798, 802, 806, 811, 816, 820, 785, 786, + 787, 682, 317, 789, 790, 791, 792, 621, 794, 795, 796, 797, 799, 800, 801, 682, 803, 804, 805, 682, 807, 808, 809, 810, 812, 813, 814, + 815, 817, 818, 819, 810, 821, 822, 823, 824, 826, 831, 827, 828, 829, 830, 832, 833, 835, 837, 840, 838, 839, 841, 842, 844, 846, 852, + 847, 848, 851, 709, 317, 849, 850, 694, 637, 853, 854, 855, 857, 621, 863, 867, 868, 858, 861, 649, 649, 859, 860, 649, 637, 862, 864, + 635, 865, 866, 869, 870, 872, 873, 877, 874, 317, 875, 876, 878, 879, 880, 881, 882, 883, 885, 890, 893, 898, 886, 317, 887, 317, 888, + 889, 891, 892, 894, 896, 895, 897, 899, 900, 901, 903, 908, 909, 913, 913, 904, 907, 317, 905, 317, 906, 673, 673, 910, 911, 912, 914, + 915, 916, 918, 925, 929, 935, 937, 919, 907, 923, 920, 921, 922, 317, 924, 708, 926, 927, 928, 930, 932, 931, 933, 934, 936, 939, 948, + 940, 942, 946, 941, 943, 833, 944, 945, 947, 949, 950, 696, 958, 951, 957, 952, 953, 954, 955, 956, 960, 961, 962, 963, 964, 965, 968, + 969, 970, 971, 973, 979, 974, 975, 976, 977, 978, 980, 981, 982, 984, 345, 985, 986, 987, 989, 990, 991, 992, 993, 995, 996, 997, 998, + 1000, 1002, 1003, 1004, 1005, 1008, 1010, 1012, 1014, 1081, 3, 1555, 1634, 1698, 1768, 1781, 1813, 1839, 1963, 2030, 2082, 2129, 2153, 2172, 2200, 2228, 2253, + 2262, 2294, 2302, 2318, 2358, 2370, 2375, 2421, 2504, 2523, 2578, 2598, 2606, 2614, 2636, 2650, 2657, 1006, 1007, 1009, 427, 1011, 1011, 412, 1013, 339, 1015, + 1034, 1045, 1061, 1062, 1066, 1067, 545, 1069, 1071, 1072, 427, 339, 966, 1075, 427, 427, 1079, 390, 1016, 1019, 1021, 1024, 1025, 1026, 317, 1029, 1025, + 317, 1030, 317, 390, 1031, 1017, 317, 390, 1018, 317, 781, 706, 1020, 1022, 1023, 621, 1027, 1028, 1027, 317, 1032, 1033, 1035, 1040, 1043, 317, 317, + 381, 1036, 842, 936, 1037, 1039, 637, 707, 1038, 1041, 637, 1042, 1044, 605, 1046, 317, 317, 317, 1053, 356, 1047, 1048, 740, 1049, 317, 317, 1050, + 1051, 1052, 1054, 1055, 1056, 1057, 1058, 1060, 1059, 317, 356, 1063, 390, 1064, 1065, 427, 390, 1068, 390, 694, 356, 1070, 648, 390, 1073, 1074, 1076, + 1077, 1078, 1080, 1082, 1097, 1139, 1163, 1170, 1172, 1174, 1175, 1176, 1181, 1186, 1187, 1190, 1194, 511, 427, 1195, 390, 1083, 1085, 317, 1088, 1090, 1093, + 1095, 317, 317, 390, 1084, 1086, 1087, 320, 1089, 1091, 1092, 673, 621, 1094, 1096, 1098, 1101, 1118, 1132, 1131, 672, 1133, 1134, 1136, 317, 390, 1137, + 1099, 1100, 1102, 1111, 1114, 631, 634, 1116, 1103, 1110, 1113, 317, 317, 1104, 317, 1109, 317, 317, 317, 1105, 317, 317, 317, 1106, 317, 1107, 1108, + 1112, 1115, 1117, 1119, 1123, 1120, 710, 1121, 1122, 1124, 1125, 317, 317, 1126, 1127, 620, 1128, 317, 1129, 1130, 928, 490, 316, 1135, 1138, 317, 1140, + 1152, 317, 1161, 390, 1141, 1144, 1150, 1142, 1143, 1145, 621, 637, 1146, 740, 1109, 1059, 1147, 1148, 317, 1149, 1151, 1153, 1156, 1154, 1155, 1157, 1158, + 1159, 1160, 1162, 1164, 1169, 390, 637, 320, 1165, 1166, 1167, 1168, 637, 694, 1171, 390, 637, 694, 673, 1173, 390, 637, 633, 928, 656, 390, 928, + 390, 1177, 1178, 390, 637, 637, 1179, 1180, 1182, 1185, 390, 1183, 1184, 637, 740, 694, 928, 317, 1188, 1189, 1191, 1192, 1193, 1196, 637, 1197, 1198, + 1206, 1231, 4, 1488, 1500, 1505, 1509, 1512, 1513, 1514, 1520, 1075, 1523, 1527, 1532, 1533, 1550, 390, 1199, 1200, 1201, 317, 1200, 1205, 966, 427, 390, + 1202, 1203, 1204, 1207, 1210, 1213, 1221, 1226, 317, 1229, 381, 1208, 1209, 1211, 1212, 1214, 1217, 490, 1065, 1215, 1216, 740, 621, 1218, 1220, 1219, 1222, + 866, 1223, 1224, 1225, 1227, 1228, 1230, 1232, 1235, 317, 317, 356, 1233, 1234, 1236, 1237, 739, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1256, 1263, + 5, 1398, 1406, 1417, 1421, 1422, 1425, 1431, 1435, 1436, 1443, 1445, 1452, 1454, 1455, 1457, 958, 1461, 1477, 1478, 1479, 1480, 1483, 1484, 1486, 621, 949, + 649, 1246, 1247, 317, 1248, 1250, 1251, 736, 1252, 317, 317, 1253, 317, 317, 317, 1249, 317, 1254, 1255, 1257, 1258, 1261, 317, 651, 317, 1259, 317, + 1260, 1262, 317, 736, 1264, 651, 1277, 633, 1265, 1018, 1266, 1268, 317, 1272, 317, 317, 317, 1273, 317, 317, 317, 1267, 1269, 1270, 1271, 1108, 317, + 1274, 1275, 1276, 1278, 1279, 1282, 1283, 1284, 6, 1374, 1375, 1377, 1378, 1380, 1384, 1386, 1396, 1394, 317, 1028, 1280, 1281, 317, 1065, 620, 317, 1160, + 1000, 1285, 317, 317, 1286, 1287, 317, 1288, 1290, 1293, 1294, 1296, 1299, 1352, 317, 1354, 1355, 317, 317, 317, 317, 317, 317, 317, 317, 317, 1361, + 317, 317, 1362, 1275, 1347, 1369, 317, 317, 317, 1371, 1289, 1291, 1292, 317, 620, 739, 1295, 1297, 317, 1298, 1018, 1300, 619, 936, 1301, 1303, 1306, + 1338, 1339, 317, 1340, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 1341, 1346, 1347, 317, 317, 317, 317, 317, + 1348, 1302, 317, 1304, 317, 1305, 317, 317, 619, 1307, 1310, 1025, 1109, 317, 317, 317, 317, 317, 317, 1333, 317, 317, 317, 317, 317, 317, 317, + 1308, 1309, 317, 317, 619, 1311, 1313, 317, 317, 317, 317, 317, 317, 1332, 317, 317, 317, 1312, 317, 317, 1314, 1322, 619, 1317, 1323, 1324, 317, + 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 1326, 317, 317, 317, 317, 317, 317, 317, 1330, 1315, 1316, 317, 317, 317, + 317, 317, 317, 1318, 317, 317, 1321, 317, 1316, 1108, 1319, 1320, 1160, 1267, 1109, 339, 1325, 1108, 1059, 1327, 1328, 1329, 1331, 317, 1334, 1335, 1336, + 1337, 1155, 317, 1109, 1331, 1325, 1108, 1059, 1342, 1343, 1344, 1345, 351, 317, 1349, 1100, 1350, 1351, 317, 1353, 1205, 317, 317, 1356, 1359, 1357, 1358, + 1360, 1363, 1059, 1365, 1364, 1366, 1367, 1368, 317, 1370, 1372, 1373, 1376, 1379, 317, 1381, 1382, 1383, 1385, 1108, 317, 1387, 1388, 1389, 1390, 1345, 1391, + 1392, 1393, 1395, 1276, 1397, 740, 1399, 1401, 1404, 320, 1400, 317, 1402, 317, 1403, 317, 1405, 317, 740, 1407, 694, 1412, 1413, 1408, 1409, 1028, 317, + 317, 317, 1410, 1411, 317, 649, 637, 1414, 317, 1415, 1416, 317, 1271, 673, 1418, 1419, 1420, 317, 320, 649, 621, 866, 651, 649, 1423, 1424, 949, + 936, 866, 490, 1426, 1428, 1429, 1427, 317, 949, 317, 949, 1430, 936, 367, 1432, 1433, 1434, 363, 382, 381, 1437, 1438, 1439, 1440, 1441, 1442, 1444, + 384, 1446, 1447, 1448, 1449, 1450, 1451, 367, 1453, 381, 356, 428, 1456, 1458, 427, 1460, 1459, 317, 949, 936, 1462, 1464, 1465, 1463, 949, 315, 949, + 1466, 1468, 1467, 1266, 936, 1469, 1471, 945, 1475, 1470, 1472, 1473, 1474, 1476, 317, 356, 351, 345, 316, 1481, 1482, 949, 1243, 351, 605, 316, 1485, + 320, 317, 1487, 1108, 1489, 1490, 1493, 1497, 767, 390, 1491, 740, 1492, 694, 651, 1494, 1495, 1496, 1498, 1499, 620, 1501, 1502, 936, 1503, 1504, 339, + 390, 427, 649, 633, 621, 1506, 390, 1507, 1508, 1087, 1510, 390, 694, 1511, 620, 332, 390, 1220, 390, 1515, 1516, 1517, 1518, 1519, 1521, 1522, 1524, + 1525, 1526, 1528, 1529, 1530, 1531, 384, 1230, 317, 1534, 1538, 1535, 1536, 1537, 1539, 1541, 1546, 1549, 1540, 1542, 1543, 1544, 1545, 1547, 1548, 1551, 1554, + 1552, 1553, 1060, 511, 1556, 1561, 1566, 1581, 1589, 1598, 1622, 1630, 1633, 545, 390, 907, 1199, 1557, 708, 317, 317, 317, 390, 1558, 1559, 1560, 1093, + 1562, 1564, 1565, 381, 1563, 1087, 740, 842, 1132, 1567, 1577, 1042, 1578, 356, 1568, 1572, 1575, 1569, 1570, 1571, 1573, 1574, 1576, 1579, 1580, 1582, 1583, + 1586, 356, 651, 633, 1584, 1585, 1587, 1588, 1501, 1590, 1595, 390, 320, 1591, 1592, 724, 317, 1593, 317, 317, 317, 1594, 1596, 1597, 1599, 1577, 1602, + 1603, 1604, 390, 1600, 1601, 1605, 1607, 1609, 633, 1611, 1606, 1608, 1610, 317, 633, 317, 1612, 1614, 1616, 317, 1619, 1620, 1621, 317, 317, 1613, 1059, + 1615, 1617, 1618, 1623, 1625, 1629, 390, 1624, 1626, 1628, 1627, 621, 651, 1631, 1632, 390, 694, 740, 620, 390, 1635, 1641, 1649, 1654, 1658, 1659, 1663, + 1664, 1684, 1687, 1691, 390, 1692, 1694, 1636, 649, 649, 1637, 1640, 390, 920, 317, 1638, 1639, 735, 317, 708, 1642, 1645, 1648, 381, 1643, 1644, 694, + 1646, 1647, 1650, 1653, 356, 621, 1651, 1652, 1655, 1656, 1132, 356, 621, 317, 1657, 620, 1115, 390, 1660, 1661, 1662, 390, 756, 390, 1655, 949, 1665, + 1669, 1672, 1673, 1674, 1681, 390, 1666, 1667, 1668, 1670, 1671, 756, 661, 1675, 1678, 1676, 317, 1677, 661, 1679, 1680, 317, 1682, 1683, 345, 1685, 390, + 1686, 649, 345, 1688, 1689, 936, 390, 1690, 1693, 1695, 1696, 1697, 1699, 1705, 1712, 1719, 1723, 1729, 1733, 1734, 1736, 1740, 966, 1764, 390, 1700, 1199, + 1093, 1701, 1704, 317, 390, 1702, 317, 1703, 637, 621, 708, 861, 620, 1706, 1709, 381, 1707, 1708, 1710, 1711, 345, 1713, 1716, 356, 1714, 1715, 1717, + 1718, 345, 1720, 1577, 1721, 844, 1585, 1722, 356, 345, 1724, 390, 1726, 1725, 1727, 1728, 345, 1730, 1131, 427, 390, 1731, 1732, 345, 390, 345, 1722, + 1735, 390, 345, 1737, 390, 1738, 1739, 1741, 949, 661, 1742, 1747, 1748, 1750, 1758, 1761, 390, 621, 1735, 317, 1743, 1744, 317, 949, 724, 1745, 317, + 1746, 317, 317, 694, 317, 1749, 1160, 673, 1751, 633, 1752, 1018, 1753, 1754, 1755, 317, 1746, 637, 317, 317, 317, 317, 710, 649, 1756, 317, 1757, + 320, 1759, 1160, 1760, 1762, 651, 1763, 1765, 1766, 1767, 1769, 1770, 1771, 1772, 1773, 1774, 1776, 1777, 1733, 1733, 1778, 427, 390, 345, 715, 390, 1199, + 1228, 381, 345, 1220, 356, 345, 356, 345, 743, 1212, 390, 345, 1775, 390, 345, 1087, 390, 345, 1234, 390, 1779, 1780, 1782, 1788, 1797, 1772, 1733, + 1733, 1803, 1805, 1810, 1811, 390, 345, 1783, 1200, 1200, 1784, 649, 390, 1027, 367, 317, 1785, 1786, 1787, 1789, 1792, 1796, 381, 1790, 1791, 1793, 1794, + 1795, 345, 773, 1798, 1800, 1801, 356, 1799, 1802, 345, 1804, 390, 345, 1806, 317, 672, 390, 1807, 1808, 1809, 345, 620, 390, 345, 1812, 390, 649, + 740, 1814, 1816, 1818, 1823, 1825, 1733, 1828, 1831, 1832, 1733, 1835, 390, 345, 1199, 1815, 1093, 966, 390, 695, 317, 345, 1817, 381, 345, 1819, 1821, + 1489, 356, 1820, 1822, 345, 1824, 356, 345, 1826, 390, 1827, 345, 1829, 390, 1830, 345, 928, 842, 390, 345, 1833, 390, 1834, 1836, 1837, 1838, 1840, + 1841, 1844, 1854, 1867, 1868, 1872, 1875, 1890, 1922, 1953, 1955, 1960, 345, 649, 1199, 317, 390, 1842, 1843, 381, 345, 1845, 1848, 356, 1846, 1847, 1849, + 1850, 1851, 1852, 1853, 345, 1855, 1861, 1865, 940, 356, 1856, 1857, 1858, 1859, 1860, 1862, 1864, 1863, 1866, 345, 940, 390, 1655, 1869, 1870, 1871, 345, + 620, 620, 620, 1873, 756, 390, 621, 621, 1874, 1876, 1877, 1879, 1882, 669, 1884, 1886, 620, 1888, 781, 390, 621, 621, 317, 681, 1878, 621, 1880, + 1881, 621, 1883, 1885, 1883, 621, 1887, 1889, 1891, 1895, 1898, 1901, 1903, 1904, 1908, 1916, 1918, 1920, 621, 1892, 621, 317, 1893, 1894, 621, 1896, 1897, + 1899, 1896, 1900, 1902, 1094, 1900, 621, 1096, 1900, 1902, 1905, 621, 1900, 317, 1906, 1907, 1909, 1027, 621, 1900, 1910, 1914, 1911, 1912, 1913, 1915, 1917, + 1900, 1919, 621, 1900, 621, 1921, 621, 1900, 339, 317, 1722, 1923, 1925, 1927, 1930, 1933, 1938, 1944, 1951, 1952, 390, 1924, 621, 621, 317, 651, 1926, + 621, 1928, 1638, 1929, 649, 1931, 1638, 1932, 1934, 621, 1935, 621, 1638, 1936, 1937, 1939, 1940, 1638, 1941, 1942, 1943, 1945, 621, 1638, 489, 1946, 1947, + 1948, 1949, 1950, 619, 351, 1954, 1956, 1957, 1958, 1959, 1961, 1962, 1964, 1984, 1988, 1993, 1995, 1997, 2002, 2005, 515, 2013, 2016, 2025, 1965, 1972, 1977, + 1966, 1967, 1968, 1969, 1970, 1971, 1973, 1974, 1975, 1976, 1978, 1979, 1980, 1981, 1982, 1983, 1985, 1986, 1987, 1989, 317, 1990, 1991, 1992, 1994, 476, 551, + 1996, 1998, 2000, 1999, 2001, 2003, 350, 2004, 2006, 2010, 2007, 2008, 2009, 2011, 2012, 2014, 2015, 2017, 2021, 2023, 2018, 2019, 2020, 2022, 1962, 2024, 2026, + 2027, 2028, 2029, 2031, 2040, 2045, 2048, 2061, 2064, 2068, 2072, 370, 2032, 2021, 2033, 2034, 2037, 2038, 450, 476, 350, 2035, 2036, 2039, 550, 2041, 2042, + 2043, 2044, 2046, 351, 317, 2047, 2049, 2055, 2057, 2059, 2050, 388, 2052, 2054, 2051, 384, 382, 2053, 2056, 404, 317, 2058, 390, 2060, 2062, 2063, 343, + 371, 349, 2065, 2067, 2066, 350, 350, 2069, 362, 2071, 2070, 596, 2073, 2074, 2075, 349, 2079, 2076, 2077, 2078, 2080, 2081, 2083, 2089, 2093, 2095, 2106, + 2109, 2120, 2084, 2085, 2088, 2086, 501, 2087, 370, 2058, 2090, 2091, 2092, 2094, 2096, 2099, 2101, 2103, 514, 2097, 2098, 345, 343, 2100, 448, 349, 370, + 2102, 2104, 2105, 2107, 2108, 2110, 371, 2111, 2112, 2114, 2115, 2118, 2113, 2058, 350, 2116, 2117, 2119, 2121, 2122, 2125, 2127, 1453, 370, 2123, 2124, 2126, + 2128, 2130, 2136, 2139, 2140, 2144, 2149, 2074, 2131, 2132, 2133, 2135, 382, 350, 2134, 2137, 2138, 317, 378, 2141, 371, 2143, 2142, 662, 2145, 2147, 2146, + 565, 2148, 2150, 541, 2151, 2152, 2154, 2157, 2158, 2162, 2164, 2169, 2155, 2156, 2159, 2160, 2161, 2163, 2165, 2166, 2167, 2168, 2170, 2171, 2173, 2175, 2179, + 2182, 2185, 2189, 2192, 2197, 545, 2174, 566, 2176, 2177, 2178, 2180, 2181, 343, 2183, 2184, 2186, 2188, 2187, 2188, 2190, 2191, 2193, 2194, 2196, 317, 2195, + 1230, 439, 2198, 2199, 2201, 2209, 2213, 2217, 2220, 2223, 2226, 2202, 2204, 2207, 2203, 2205, 2206, 2208, 2210, 2212, 2211, 2214, 2215, 2216, 2218, 2219, 2033, + 2221, 2222, 439, 501, 2224, 2225, 2227, 2229, 2234, 2237, 2241, 2245, 2248, 2152, 443, 2230, 2232, 2231, 2022, 370, 2146, 363, 2233, 2071, 2142, 2235, 2236, + 2238, 2239, 2240, 2242, 350, 2004, 2243, 2244, 393, 2246, 2247, 350, 2249, 2250, 2251, 2252, 2254, 2255, 2259, 388, 2256, 2257, 2258, 2260, 2261, 2263, 2267, + 2273, 2281, 2285, 2292, 2264, 2265, 2266, 2268, 343, 596, 2270, 2269, 343, 404, 2271, 2272, 2274, 2276, 448, 2278, 2275, 2277, 2279, 345, 2280, 2282, 2283, + 2284, 2286, 596, 2288, 2289, 2287, 370, 404, 2290, 2291, 2293, 2027, 2295, 2296, 2297, 2299, 2301, 2298, 382, 397, 2300, 2303, 2307, 2311, 2312, 2313, 2316, + 2304, 2305, 2306, 2308, 2309, 2310, 471, 2004, 372, 2070, 2314, 2315, 1347, 589, 2317, 2319, 2331, 2337, 2342, 2344, 2352, 2244, 2320, 2323, 2324, 349, 2325, + 2329, 2058, 339, 2321, 2322, 2272, 1020, 2326, 2327, 2328, 2330, 2332, 2334, 2335, 2333, 2336, 1020, 2338, 343, 2340, 2339, 2022, 2134, 428, 2341, 351, 404, + 2343, 418, 2345, 2347, 2348, 419, 2349, 370, 2022, 349, 2346, 2035, 317, 2058, 343, 2350, 343, 2351, 2353, 2354, 2356, 2355, 2357, 2359, 2361, 2363, 2365, + 2367, 2360, 2362, 1962, 2364, 2366, 2368, 2369, 2371, 2372, 2373, 2374, 2376, 2378, 2392, 2397, 2400, 2404, 2407, 2411, 2414, 2417, 2377, 2379, 2380, 2382, 2384, + 2390, 2381, 2383, 350, 596, 2385, 2386, 2388, 2387, 2389, 2391, 2393, 2395, 465, 350, 2394, 385, 2396, 2398, 2399, 2401, 2403, 748, 2402, 2405, 2406, 2408, + 2409, 350, 2410, 2412, 514, 2413, 2415, 2416, 2418, 515, 2420, 2419, 2422, 2425, 2440, 2446, 2493, 2494, 2423, 2424, 739, 2426, 2427, 2432, 2433, 2428, 2429, + 2430, 2431, 2434, 2435, 2436, 2437, 2438, 2439, 2441, 2442, 2443, 2444, 2445, 2447, 2457, 313, 2460, 2448, 2449, 2450, 2451, 2452, 2453, 2454, 2455, 2456, 2458, + 2459, 2461, 2463, 2465, 2475, 314, 2477, 2478, 2481, 2492, 2462, 2464, 2466, 2467, 2468, 2469, 2470, 2471, 2472, 2473, 2474, 2476, 2479, 2480, 1373, 2482, 2483, + 2484, 2485, 2486, 2487, 2488, 2489, 2490, 2491, 2495, 2498, 2496, 2497, 317, 2499, 2500, 2501, 317, 317, 317, 2502, 2503, 2505, 2513, 2514, 2516, 2522, 2506, + 2507, 2508, 2512, 2509, 2511, 2510, 2515, 1998, 2517, 2519, 2518, 381, 317, 317, 2520, 2521, 596, 397, 2524, 2529, 2534, 2538, 2544, 2548, 2552, 2553, 2554, + 2556, 2559, 2562, 2569, 2525, 2526, 2527, 2528, 2530, 418, 2531, 2533, 2532, 2535, 349, 2536, 381, 2537, 2539, 2540, 2542, 2541, 1428, 2543, 2545, 2546, 2547, + 2402, 371, 2549, 541, 2550, 2551, 2405, 1915, 2555, 2557, 2558, 2560, 2561, 566, 2317, 2317, 498, 2074, 2563, 2565, 2567, 2564, 1588, 565, 2298, 2381, 2566, + 343, 2568, 2570, 565, 2152, 2573, 2574, 2577, 2571, 2572, 2575, 2576, 2579, 2580, 2582, 2587, 2592, 2594, 2596, 2581, 381, 348, 2583, 2585, 2586, 362, 2584, + 2588, 2591, 343, 345, 2589, 2590, 2510, 350, 2593, 2595, 384, 2597, 332, 373, 2599, 2600, 2602, 2420, 2604, 2601, 2603, 2605, 2607, 2610, 2611, 2613, 350, + 2608, 2609, 2612, 511, 2615, 2625, 2627, 2628, 2634, 2635, 2616, 2619, 2622, 2617, 2618, 2620, 2621, 2623, 2624, 2626, 2629, 2633, 550, 2630, 2632, 2631, 350, + 2067, 350, 2637, 2641, 2642, 2110, 2646, 2638, 2639, 2640, 2643, 2644, 2645, 2647, 2648, 2649, 2651, 2655, 2656, 2652, 2653, 2654, 2658, 2664, 2668, 2659, 2426, + 2660, 2661, 2662, 2663, 2665, 2666, 2667, 2669, 2670, 2671, 1008, 2672, 2674, 2675, 2720, 2762, 2810, 2865, 2903, 2932, 2956, 2971, 2986, 2998, 3000, 3019, 3026, + 3032, 3033, 3038, 3042, 3048, 3053, 3059, 3061, 3064, 3068, 3069, 3071, 3077, 3080, 3082, 3099, 380, 2673, 412, 439, 545, 1013, 2676, 2699, 2709, 2711, 2712, + 2714, 545, 545, 966, 427, 2716, 390, 2677, 2681, 2684, 2685, 2686, 2690, 2690, 2691, 2695, 317, 317, 390, 2678, 317, 2679, 317, 2680, 2682, 2683, 2687, + 1791, 2688, 2689, 2689, 924, 317, 620, 2692, 2693, 2694, 2696, 2697, 2698, 637, 345, 708, 2700, 2701, 835, 2706, 381, 2702, 2703, 2704, 2705, 2707, 2708, + 2710, 2713, 2715, 390, 2717, 2718, 2719, 2721, 2727, 2734, 2744, 2750, 2756, 2757, 2759, 2761, 381, 1095, 2722, 858, 2725, 2723, 2724, 1560, 621, 2726, 2728, + 2729, 709, 343, 2730, 2732, 2733, 2731, 2735, 2739, 949, 2742, 2743, 2736, 2737, 2738, 2740, 2741, 317, 2462, 767, 866, 2745, 2748, 2746, 2747, 2749, 2751, + 2752, 2753, 2754, 2755, 2758, 2760, 2476, 2763, 2773, 2777, 2783, 2790, 2794, 2796, 2797, 2801, 356, 2802, 2807, 1200, 2764, 2768, 1557, 2771, 708, 2765, 2766, + 2767, 2769, 2770, 2772, 2774, 2426, 2775, 2776, 2778, 1132, 1115, 1131, 1087, 672, 648, 632, 2779, 2780, 2782, 1114, 647, 317, 2781, 317, 2784, 2787, 2788, + 637, 320, 2785, 740, 694, 2786, 2789, 739, 2791, 320, 740, 2792, 649, 2793, 2795, 390, 1112, 2798, 2799, 2800, 2803, 2804, 2805, 2806, 2808, 2809, 2811, + 2820, 2830, 2833, 2835, 2837, 2838, 2841, 2846, 2848, 356, 2850, 2853, 2812, 708, 2813, 2816, 2818, 1027, 2814, 2815, 2817, 2819, 866, 2821, 2822, 2823, 2824, + 2825, 2826, 2827, 2828, 2829, 1112, 2831, 2742, 2832, 949, 2834, 673, 637, 1732, 2836, 651, 637, 1131, 736, 928, 2839, 2840, 2842, 2843, 2844, 2845, 2847, + 2849, 2851, 2852, 2854, 2857, 2855, 2856, 2858, 2859, 2860, 2861, 2862, 2863, 2864, 2866, 2870, 843, 2871, 2875, 2879, 2889, 2890, 2896, 2897, 2899, 2900, 390, + 673, 2867, 649, 708, 1094, 2868, 2869, 1095, 1131, 1112, 2872, 2873, 2874, 2876, 2877, 2878, 1603, 2880, 2888, 2881, 2884, 1011, 1613, 621, 317, 2882, 2883, + 2885, 2886, 2887, 1731, 2891, 2893, 2892, 1011, 2894, 2895, 2898, 2901, 2902, 2904, 2911, 2912, 2917, 2918, 2921, 2923, 2929, 966, 427, 390, 2905, 2906, 1199, + 1200, 861, 1200, 2909, 339, 390, 317, 490, 356, 2907, 2908, 1027, 2910, 2913, 2914, 1648, 2915, 2916, 2919, 2920, 2742, 1131, 2922, 2066, 2924, 1451, 2928, + 866, 1673, 1746, 661, 2925, 2926, 2927, 1745, 317, 673, 724, 633, 2930, 2931, 2933, 2941, 2943, 2949, 2950, 2954, 390, 649, 1200, 649, 649, 2934, 2938, + 1027, 2935, 2936, 2937, 2939, 2940, 2942, 2944, 2945, 2946, 2947, 2948, 916, 2951, 2952, 2953, 2955, 2957, 2961, 2963, 1083, 2964, 2966, 2968, 390, 1200, 2958, + 2959, 2960, 2962, 2965, 2967, 2969, 2970, 2972, 2976, 2977, 2979, 1690, 2980, 2984, 390, 1199, 2973, 1199, 2974, 2975, 2978, 2981, 2982, 2983, 2985, 2987, 2989, + 2991, 2995, 390, 1093, 1011, 649, 649, 1095, 2988, 2990, 2992, 2993, 2994, 2996, 2997, 2999, 3001, 3004, 3008, 3010, 3012, 3017, 3002, 3003, 3005, 3006, 3007, + 3009, 2033, 3011, 590, 2054, 1720, 3013, 3014, 3015, 3016, 3018, 3020, 3024, 3021, 3022, 3023, 3025, 382, 3027, 3028, 3029, 3030, 3031, 3034, 3036, 3035, 3037, + 2071, 3039, 3040, 3041, 3043, 3045, 3044, 3046, 3047, 343, 317, 589, 3049, 3050, 3051, 3052, 3054, 3058, 3055, 3056, 3057, 3060, 2036, 2309, 3062, 3063, 3065, + 3066, 317, 637, 3067, 339, 345, 3070, 3072, 3075, 3076, 3073, 3074, 2416, 590, 664, 3078, 3079, 3081, 3083, 3087, 3091, 3095, 3084, 3085, 3086, 3088, 3089, + 3090, 3092, 3093, 3094, 3096, 2461, 2475, 2473, 3097, 318, 2492, 3098, 3100, 3101, 3102, 3103, 3105, 3126, 3154, 3181, 3214, 3232, 3240, 3274, 3280, 3306, 3310, + 1031, 3312, 3315, 3317, 3324, 3330, 3331, 3335, 3339, 3343, 3345, 3352, 3362, 1230, 3369, 3106, 412, 3112, 3113, 3117, 545, 3120, 966, 427, 3121, 390, 3107, + 317, 1024, 3108, 3109, 317, 317, 317, 317, 351, 317, 317, 390, 3110, 621, 381, 317, 3111, 3114, 390, 3115, 3116, 3118, 390, 3119, 390, 1020, 3122, + 3123, 3124, 3125, 3127, 3130, 3132, 3140, 3143, 3149, 3152, 545, 381, 1199, 3128, 3129, 842, 3131, 3133, 348, 3134, 3135, 3136, 3137, 3138, 3139, 1132, 3141, + 3142, 3144, 390, 3145, 3146, 3147, 3148, 317, 3150, 3151, 842, 3153, 2942, 756, 390, 545, 3155, 3168, 3169, 3171, 545, 3172, 356, 949, 3156, 3159, 2073, + 1276, 3166, 3157, 736, 3158, 3160, 3163, 3161, 3162, 317, 3164, 317, 3165, 3167, 3170, 3173, 3180, 862, 3174, 3175, 3176, 3177, 317, 3178, 3179, 3182, 3183, + 3185, 3196, 3199, 3203, 3206, 3207, 3208, 3210, 3213, 3184, 637, 651, 620, 3186, 3189, 3191, 1131, 3193, 672, 648, 632, 2782, 3187, 317, 3188, 2779, 3190, + 1114, 3192, 3194, 3195, 3197, 651, 3198, 3200, 3201, 673, 3202, 3204, 3205, 651, 1353, 3209, 317, 3211, 3212, 655, 3215, 3219, 3221, 3225, 3228, 3229, 390, + 3216, 3218, 3217, 3220, 949, 3222, 1234, 3223, 3224, 3226, 3227, 3230, 3231, 3233, 545, 545, 3234, 3237, 966, 427, 390, 1722, 1735, 3235, 1721, 3236, 1735, + 3238, 3239, 3241, 3244, 3252, 3253, 3254, 3257, 545, 3259, 3263, 356, 1033, 390, 966, 3242, 3243, 3245, 3248, 3246, 3247, 633, 3249, 3251, 3250, 1660, 1519, + 619, 651, 3255, 3256, 1519, 3258, 3260, 3261, 3262, 1451, 3264, 694, 767, 3268, 3273, 390, 3265, 3266, 3267, 3269, 3270, 3271, 3272, 651, 673, 3275, 3278, + 427, 390, 2742, 3276, 3277, 3279, 3281, 3285, 3287, 3288, 3296, 356, 3300, 390, 3282, 3283, 3284, 3286, 1660, 661, 3289, 3293, 3290, 3291, 3292, 3294, 3295, + 3297, 3298, 3299, 3301, 3302, 3303, 3304, 3305, 3307, 3308, 390, 3309, 3311, 3020, 427, 3313, 3314, 382, 3316, 3318, 3320, 3322, 3319, 3321, 3323, 2473, 2490, + 3325, 3326, 3327, 3328, 3329, 3039, 1060, 3332, 3333, 3334, 3336, 3337, 3338, 3340, 3342, 3341, 3344, 317, 3346, 3347, 3348, 3349, 3350, 3351, 2060, 3353, 3356, + 3354, 3355, 3357, 3358, 3359, 3360, 3361, 3363, 664, 3367, 3364, 3365, 3366, 3368, 3370, 3372, 3371, 3373, 3374, 3375, 3377, 3388, 3407, 3444, 3453, 3476, 3511, + 3523, 3540, 3558, 2362, 428, 3574, 3579, 3582, 3589, 3595, 349, 3604, 3605, 2277, 3606, 3612, 3617, 3622, 3637, 3647, 3650, 3654, 589, 3659, 3378, 3381, 3383, + 621, 3385, 621, 966, 427, 390, 1688, 317, 3379, 317, 317, 317, 390, 3380, 317, 3382, 3384, 2962, 621, 915, 3386, 3387, 3389, 3390, 3395, 3396, 3399, + 381, 3391, 3392, 3393, 3394, 3397, 661, 3398, 3400, 3401, 3402, 3403, 3404, 3405, 3406, 3408, 3423, 865, 2889, 3424, 3427, 3430, 3433, 3434, 356, 3439, 1688, + 1451, 3409, 3412, 3413, 3421, 3410, 3411, 694, 756, 3414, 3415, 3416, 3417, 3418, 3419, 3420, 3422, 3425, 3426, 3428, 3429, 620, 3431, 3432, 3435, 3436, 3437, + 3438, 3440, 3441, 3442, 3443, 3445, 3448, 3451, 356, 3446, 632, 3447, 3449, 3450, 3452, 621, 3182, 1370, 3454, 3455, 3457, 3460, 3466, 2979, 3470, 3473, 390, + 1732, 317, 3456, 356, 621, 1011, 3458, 3459, 620, 928, 1112, 1132, 3461, 3463, 1087, 672, 648, 3462, 647, 3464, 3465, 3467, 3468, 3469, 3471, 3472, 3474, + 3475, 3477, 3482, 3484, 3487, 3490, 3491, 3503, 3504, 966, 3506, 3510, 390, 3478, 3479, 3480, 3481, 3483, 3485, 3486, 1011, 3488, 3489, 3492, 724, 936, 3495, + 1271, 3497, 3500, 1028, 3502, 397, 3493, 3494, 736, 317, 3496, 3498, 3499, 3501, 320, 317, 1574, 3505, 3507, 3508, 3509, 3512, 3514, 3516, 3519, 3521, 390, + 3513, 3515, 928, 3517, 3518, 3520, 3522, 3524, 3526, 3530, 3531, 3532, 3536, 3538, 390, 3525, 3527, 3528, 3529, 3533, 3534, 3535, 3537, 3539, 3541, 3544, 1162, + 3553, 3554, 390, 3542, 3543, 3545, 3546, 3547, 3548, 3549, 3550, 3551, 317, 3552, 317, 317, 412, 3555, 3556, 3557, 3559, 3565, 3566, 3567, 3572, 390, 3560, + 3561, 3562, 3563, 3564, 1302, 2970, 3568, 1000, 3570, 3569, 3571, 3573, 3575, 362, 3577, 3576, 3578, 382, 3580, 3581, 3583, 3587, 3584, 3585, 3586, 3588, 3590, + 3594, 363, 3591, 3592, 3593, 3596, 3039, 3600, 3597, 3598, 3599, 3601, 3602, 3603, 3607, 3610, 2037, 400, 3608, 2007, 3609, 332, 3611, 3613, 3615, 3614, 3616, + 3618, 516, 1230, 345, 3621, 3619, 3620, 3623, 3625, 433, 3627, 3631, 2567, 3633, 3624, 3626, 3628, 2475, 3629, 3630, 3632, 3634, 3635, 3636, 3638, 3641, 3643, + 3646, 1588, 3639, 317, 3640, 3642, 3644, 3645, 3648, 317, 3649, 3651, 3652, 3653, 3655, 620, 3655, 3657, 3656, 3658, 3660, 3663, 3661, 3661, 3662, 3664, 3666, + 3671, 3678, 3699, 3711, 3722, 3747, 3788, 3810, 3822, 3831, 3842, 3030, 3844, 3849, 3851, 3855, 3858, 3863, 3870, 3873, 3875, 3878, 3881, 3885, 3899, 3902, 3667, + 3668, 3669, 3670, 3672, 3674, 551, 545, 545, 545, 3675, 966, 427, 2716, 390, 3673, 317, 317, 317, 620, 339, 317, 317, 390, 651, 381, 3676, 3677, + 3679, 3689, 3690, 3696, 381, 3680, 3685, 3681, 3682, 3683, 3684, 3686, 3687, 3688, 3691, 3693, 621, 2769, 3692, 637, 633, 390, 3694, 3695, 3697, 3698, 3700, + 3701, 1822, 3702, 3705, 3708, 356, 3709, 3703, 3704, 1799, 1746, 3706, 3707, 3710, 3712, 633, 3718, 356, 3713, 3714, 3715, 3716, 3717, 3719, 3720, 3721, 3723, + 3733, 3734, 3739, 3743, 3745, 390, 3724, 3727, 3731, 3725, 3726, 3728, 3729, 3730, 3732, 3735, 651, 1011, 3736, 3737, 317, 317, 3738, 1130, 739, 3740, 3741, + 3742, 3744, 3746, 3748, 3752, 3754, 3757, 3765, 3778, 3781, 3783, 3786, 3743, 390, 1131, 3749, 3750, 3751, 3753, 1824, 651, 740, 3755, 3756, 3758, 3761, 3763, + 3759, 740, 3760, 3762, 3764, 3766, 3767, 3769, 1132, 1115, 3770, 3774, 3777, 648, 632, 635, 621, 949, 1087, 637, 3768, 320, 317, 649, 320, 1131, 3771, + 3773, 317, 3772, 317, 317, 317, 317, 317, 317, 317, 3775, 651, 3776, 673, 1624, 3779, 1011, 740, 3780, 633, 3782, 637, 1011, 633, 3784, 3785, 3787, + 3789, 3792, 3794, 3798, 3804, 3808, 390, 3790, 3791, 3793, 740, 724, 3795, 3796, 3797, 1732, 773, 3799, 3801, 3800, 3802, 3803, 3805, 3806, 3807, 3809, 3811, + 3813, 3816, 3818, 3743, 3820, 390, 3812, 3814, 3815, 3817, 3819, 620, 3821, 3823, 390, 3824, 3826, 3825, 3827, 3828, 3829, 3830, 3832, 390, 3833, 3834, 3835, + 3836, 3837, 3838, 3839, 3840, 3841, 3843, 3845, 3846, 3847, 3848, 3850, 382, 3852, 3853, 3854, 3856, 3857, 3859, 3860, 3861, 3862, 3864, 3865, 3866, 3867, 3868, + 3869, 3871, 3872, 3874, 3876, 3877, 3879, 3880, 3882, 3646, 3884, 3883, 3886, 3888, 3892, 3897, 3887, 3889, 3890, 3891, 3893, 3894, 3895, 3896, 3898, 3900, 3901, + 3903, 3907, 3904, 3905, 3906, 3908, 3909, 3910, 3912, 3921, 3926, 3942, 3950, 3959, 3970, 4000, 4015, 4030, 4042, 4043, 4046, 4049, 4054, 4056, 4061, 390, 4062, + 4065, 4070, 3913, 3914, 3916, 3919, 621, 966, 317, 390, 1688, 317, 317, 390, 3915, 3917, 3918, 3920, 3395, 3922, 3923, 381, 743, 1042, 3924, 3925, 3927, + 3934, 3935, 3938, 356, 3941, 3928, 3929, 3930, 3931, 3932, 3933, 3936, 3937, 3939, 3940, 3943, 3947, 3948, 3949, 3743, 356, 3944, 3945, 3946, 3951, 3955, 3743, + 390, 3952, 3953, 3954, 3292, 3956, 3957, 3958, 3960, 3961, 1302, 3965, 3968, 390, 949, 3962, 866, 1028, 3963, 3964, 3966, 3967, 3969, 3971, 3974, 3975, 3978, + 3989, 3992, 3743, 1033, 3995, 2356, 390, 3972, 3973, 1722, 3976, 3977, 1011, 694, 620, 3979, 1112, 1132, 3981, 1131, 3982, 672, 648, 3985, 3987, 3988, 3227, + 637, 651, 3980, 651, 1087, 1902, 1011, 3983, 631, 3984, 3986, 3990, 694, 3991, 1087, 3993, 3994, 3996, 3997, 3998, 3999, 4001, 4007, 3700, 4010, 4011, 4013, + 3965, 2356, 390, 3941, 4002, 4003, 4004, 4005, 4006, 4008, 4009, 4012, 621, 1289, 4014, 3744, 4016, 4020, 4024, 4028, 4029, 2356, 390, 3065, 4017, 4018, 4019, + 4021, 4022, 4023, 4025, 4026, 4027, 4031, 4033, 4034, 3915, 4037, 4038, 4029, 4040, 351, 3965, 4041, 2356, 390, 4032, 4035, 4036, 673, 756, 632, 4039, 3843, + 3843, 4044, 4045, 4047, 4048, 4050, 4051, 4052, 4053, 4055, 4057, 4058, 4059, 4060, 4063, 4064, 4066, 4067, 4068, 4069, 4071, 4073, 4072, 4074, 4075, 4076, 4078, + 4083, 4102, 4109, 4116, 4119, 4155, 4169, 4182, 4219, 4254, 4042, 4259, 4262, 4272, 4277, 4281, 4285, 4289, 4296, 4299, 4303, 4309, 4311, 390, 4319, 4331, 4079, + 4080, 427, 4081, 4082, 4084, 4086, 4087, 4091, 4097, 4100, 427, 317, 390, 4085, 317, 317, 390, 4088, 4089, 4090, 4092, 4093, 4094, 4095, 4096, 4098, 2743, + 4099, 4101, 4103, 4105, 4108, 381, 4104, 4106, 4107, 1060, 4110, 4112, 3743, 4114, 356, 4111, 4113, 4115, 4117, 345, 356, 914, 4118, 4120, 4136, 4144, 4148, + 4149, 4151, 390, 4121, 1451, 4125, 756, 4124, 1205, 4129, 4134, 4122, 841, 4123, 4126, 1494, 4127, 4128, 4130, 4131, 4132, 371, 4133, 4135, 4137, 4138, 4139, + 4140, 4141, 4142, 4143, 4145, 4146, 4147, 620, 620, 4150, 317, 4152, 1508, 4153, 4154, 4156, 4157, 4161, 4165, 427, 390, 1722, 1653, 4158, 4159, 4160, 866, + 1746, 936, 4162, 4163, 4164, 3065, 4166, 4167, 4168, 4170, 4176, 1033, 390, 4171, 4174, 4172, 4173, 4175, 4177, 4179, 4178, 4180, 4181, 4183, 653, 4187, 4189, + 4192, 4194, 4214, 4215, 4216, 390, 4184, 4185, 4186, 4188, 637, 673, 4190, 4191, 4193, 740, 673, 4195, 4197, 1112, 1132, 1115, 4198, 1087, 4201, 4208, 4210, + 4211, 4213, 1020, 4196, 4199, 4200, 4202, 647, 317, 4203, 4206, 4204, 4205, 4207, 317, 4209, 928, 633, 4212, 633, 1173, 4217, 4218, 4220, 4221, 4222, 4225, + 4229, 2024, 4249, 4250, 3510, 390, 3941, 781, 1000, 732, 4223, 649, 4224, 4226, 637, 317, 4227, 4228, 317, 866, 4230, 936, 4232, 4238, 4239, 4245, 1746, + 4247, 945, 4231, 4233, 4234, 4235, 4236, 4237, 949, 621, 637, 4240, 4244, 4241, 4242, 4243, 4246, 4248, 651, 673, 4251, 4252, 4253, 4255, 390, 4256, 4257, + 4258, 724, 1746, 4260, 4261, 4263, 4269, 4264, 4265, 501, 4266, 4267, 4268, 4270, 4271, 4273, 4276, 4274, 4275, 4278, 4280, 4279, 4282, 4283, 4284, 4286, 4055, + 4287, 4288, 4290, 4291, 4292, 4293, 4294, 4295, 4297, 4298, 4300, 4302, 4301, 4304, 4305, 4306, 4307, 4308, 4310, 4312, 4315, 4318, 4313, 4314, 4316, 4317, 4320, + 4324, 4325, 4321, 4322, 4323, 4326, 4327, 4328, 4329, 4330, 4332, 4334, 4333, 4335, 4336, 4338, 4370, 4378, 4391, 4400, 4403, 4416, 4428, 4456, 4478, 4042, 4562, + 4565, 4568, 4569, 4574, 4577, 3121, 390, 4584, 4587, 4592, 4594, 4339, 4344, 4348, 4354, 4356, 4029, 317, 390, 620, 4340, 317, 317, 317, 390, 4341, 4342, + 4343, 4345, 4346, 4347, 4349, 4350, 4351, 4352, 4353, 4355, 317, 4357, 4362, 4365, 4358, 4359, 4360, 4361, 4363, 4364, 4366, 4367, 4368, 4369, 4371, 4374, 4376, + 381, 4372, 4373, 4375, 4377, 4379, 4383, 4384, 4388, 356, 4380, 4381, 4382, 4385, 1131, 4386, 4387, 4389, 4390, 4392, 4394, 4397, 356, 4398, 4393, 4395, 4396, + 4399, 4401, 4402, 390, 4404, 4409, 4411, 4414, 1031, 390, 4405, 4407, 4408, 866, 1271, 767, 661, 4406, 866, 1767, 649, 4410, 4412, 4413, 4415, 4417, 4421, + 4425, 1914, 390, 4418, 4419, 4420, 4422, 4423, 4424, 4426, 4427, 4429, 4434, 935, 4438, 4444, 4448, 4454, 4430, 4431, 4432, 4433, 4435, 4436, 4437, 4439, 4440, + 4441, 4442, 4443, 317, 1044, 4445, 4446, 4447, 4449, 4450, 4451, 4452, 4453, 4455, 317, 4457, 4464, 4467, 4468, 4470, 4473, 4475, 4477, 390, 4458, 4463, 648, + 4459, 4460, 4461, 4462, 4465, 4466, 4469, 694, 649, 928, 1131, 1087, 672, 4471, 632, 4472, 633, 631, 4474, 621, 649, 4476, 4479, 4505, 4520, 4534, 4535, + 4546, 4555, 390, 4480, 4482, 4487, 4488, 4493, 4498, 4481, 4483, 4484, 4485, 4486, 4489, 4490, 4491, 4492, 4494, 4495, 4496, 4497, 4499, 4500, 4501, 4502, 4503, + 4504, 4506, 4510, 4515, 4507, 4508, 4509, 4511, 4512, 4513, 4514, 4516, 4517, 4518, 4519, 4521, 4526, 4532, 4522, 4523, 4524, 4525, 4527, 4528, 4529, 4530, 4531, + 4533, 4536, 4541, 4537, 4538, 4539, 4540, 4542, 4543, 4544, 4545, 4547, 4548, 4549, 4550, 4551, 4552, 4553, 4554, 4556, 4557, 4558, 4559, 4560, 4561, 4563, 4564, + 382, 4566, 4567, 4322, 4055, 4570, 4571, 4572, 4573, 4575, 4576, 4578, 4579, 4580, 4581, 4582, 4583, 4585, 4586, 4588, 4590, 4589, 4591, 4593, 4595, 4596, 4597, + 4599, 4612, 4632, 4644, 4650, 4653, 4660, 4673, 4683, 4713, 4743, 543, 4744, 4054, 4752, 4756, 4758, 4762, 390, 4765, 4767, 4600, 4602, 4604, 3791, 4605, 4606, + 966, 317, 390, 1688, 4601, 317, 317, 317, 317, 4603, 839, 4607, 4608, 4610, 4609, 4611, 4613, 4615, 4620, 4621, 4624, 4627, 4630, 381, 4614, 4616, 928, + 4617, 4618, 4619, 4622, 4623, 4625, 4626, 4628, 4629, 4631, 4633, 4635, 4636, 4639, 356, 4634, 4637, 4638, 4640, 4641, 4642, 4643, 4645, 4649, 356, 4646, 4647, + 4648, 4651, 4652, 390, 4654, 4657, 4659, 2679, 390, 1722, 755, 1653, 949, 4655, 4656, 1897, 4658, 4661, 4672, 2024, 390, 1451, 4662, 756, 767, 4667, 4663, + 4665, 365, 4664, 4666, 4668, 317, 4669, 4670, 4671, 4674, 4679, 4680, 4681, 2024, 390, 4675, 4676, 4677, 4678, 4682, 4684, 4685, 4688, 4689, 4707, 3431, 2356, + 390, 4712, 4686, 4687, 949, 4690, 4692, 1302, 4699, 736, 4705, 4691, 4693, 4696, 4694, 4695, 4697, 4698, 4700, 735, 4701, 949, 4702, 4703, 4704, 4706, 4708, + 4709, 4710, 4711, 4714, 4716, 4718, 4720, 4722, 4727, 2024, 4737, 4739, 390, 4715, 4717, 928, 4719, 4721, 1131, 4723, 4724, 633, 490, 4725, 4726, 620, 4728, + 1132, 637, 1131, 4733, 672, 4735, 862, 4729, 4730, 4731, 4732, 4734, 4736, 4738, 4740, 4741, 4742, 1073, 3843, 4745, 4749, 4746, 4747, 4748, 4750, 4751, 4753, + 4754, 4755, 4757, 4759, 4760, 4761, 4763, 4764, 4766, 4768, 4769, 4770, 4771, 4772, 4773, 4775, 4776, 4777, 4778, 4779, 4781, 4782, 2022, 4783, 2328, 4785, 4789, + 4784, 4786, 4787, 4788, 4791, 4792, 365, 4793, 4794, 4795, 4796, 4804, 4806, 4852, 4856, 4872, 4874, 4875, 4879, 4889, 4896, 4901, 9, 10, 11, 6139, 6229, + 12, 6569, 6640, 6766, 6790, 13, 15, 16, 8915, 18, 9187, 19, 20, 21, 22, 10771,10868,10915,10929,10983,530, 2301, 4797, 4797, 4797, 4798, 4797, + 4797, 4799, 4800, 4801, 4803, 4797, 317, 4802, 4805, 4807, 4812, 4820, 4822, 4824, 4827, 4833, 4840, 4844, 4808, 4811, 4809, 4810, 4813, 4814, 949, 936, 4815, + 1271, 4816, 317, 317, 4817, 317, 4818, 317, 317, 317, 4819, 4821, 743, 4823, 1653, 1735, 4825, 4826, 4828, 4829, 4830, 4831, 4832, 4834, 4835, 4836, 4837, + 4838, 4839, 4841, 4842, 4843, 4845, 4846, 4847, 4848, 4849, 4850, 4851, 1111, 4853, 4854, 4855, 621, 4857, 4858, 4861, 621, 621, 621, 4862, 4865, 4871, 317, + 4859, 4860, 317, 1114, 4863, 4864, 4866, 4867, 4868, 4869, 4870, 4873, 1302, 1130, 1309, 4876, 4877, 4878, 4880, 4882, 4886, 4881, 4883, 4884, 4885, 4887, 4888, + 4890, 4892, 4891, 4893, 4894, 4895, 4897, 1317, 4898, 4899, 4900, 4902, 4911, 4945, 4950, 4951, 339, 4953, 4938, 4955, 4956, 4964, 4967, 4971, 4983, 4988, 2357, + 4992, 4903, 4906, 862, 4904, 4905, 637, 490, 4907, 949, 936, 4908, 4909, 4910, 4912, 4915, 1131, 1087, 672, 4916, 4940, 2051, 390, 4937, 356, 4943, 4944, + 1107, 637, 4913, 4914, 1420, 3202, 651, 621, 4917, 4919, 4936, 4937, 4939, 4918, 317, 4920, 4925, 4926, 317, 4921, 317, 317, 317, 4922, 317, 4923, 4924, + 317, 390, 4927, 4928, 4929, 4930, 4931, 4932, 4933, 4934, 4935, 4941, 4942, 4946, 4949, 317, 4947, 4948, 501, 367, 490, 317, 4952, 365, 317, 550, 317, + 317, 4954, 389, 343, 439, 4957, 4958, 4961, 4963, 381, 332, 439, 1033, 4949, 4959, 4960, 317, 4962, 3710, 351, 4965, 4966, 4968, 4970, 4969, 2551, 2521, + 4972, 4973, 4975, 4977, 4591, 343, 4978, 317, 4981, 365, 2845, 362, 4974, 4976, 590, 317, 4979, 1266, 317, 317, 317, 4980, 4982, 370, 4984, 2322, 4985, + 490, 4986, 4987, 4989, 4990, 4991, 4993, 4994, 4998, 5000, 5024, 5060, 5076, 5128, 5176, 1335, 5177, 5192, 5208, 5209, 5218, 5227, 5229, 5236, 5282, 5287, 5329, + 5376, 5380, 5400, 5402, 4995, 4996, 4997, 4999, 5001, 5002, 5004, 5005, 351, 5006, 4591, 5007, 5009, 5013, 5014, 5018, 5023, 1109, 490, 2043, 5003, 490, 317, + 317, 345, 363, 404, 1358, 317, 362, 317, 5008, 343, 317, 317, 5010, 317, 5011, 5012, 356, 466, 3854, 317, 490, 317, 390, 433, 5015, 490, 5016, + 5017, 5019, 5020, 317, 5021, 317, 3854, 317, 5022, 317, 748, 5025, 5034, 5041, 5044, 5048, 317, 317, 5059, 370, 5026, 5027, 5029, 5031, 1358, 2333, 317, + 5028, 354, 5030, 1044, 365, 317, 5032, 5033, 317, 5035, 5036, 5037, 5039, 5038, 317, 5040, 317, 1160, 5042, 381, 5043, 2067, 5045, 356, 5046, 5047, 354, + 317, 5049, 5056, 5050, 5051, 5052, 5053, 356, 5054, 5055, 5057, 5058, 1753, 2077, 5061, 317, 936, 866, 5067, 5069, 317, 2733, 5062, 5063, 317, 5064, 5066, + 5065, 5068, 5070, 5072, 5071, 5073, 5075, 5074, 1266, 637, 5077, 5080, 5094, 5098, 5109, 5078, 317, 5079, 5081, 5082, 5083, 5085, 5088, 490, 5089, 5090, 5092, + 317, 3717, 5084, 5086, 5087, 5091, 5093, 5095, 317, 5096, 5097, 1325, 404, 5099, 5100, 317, 380, 5106, 5101, 5103, 5102, 1135, 317, 5104, 5105, 5107, 5108, + 5110, 5114, 5127, 317, 5111, 5112, 5113, 2510, 317, 382, 5055, 5115, 5085, 5116, 5118, 5121, 5090, 5117, 5119, 5120, 317, 1881, 5122, 5123, 5124, 5125, 5126, + 317, 1358, 5129, 317, 382, 5131, 5132, 5136, 5139, 5141, 317, 5172, 5175, 5130, 4984, 373, 490, 5133, 1347, 362, 5135, 362, 317, 4980, 5134, 317, 2110, + 332, 3284, 5137, 5138, 5140, 5142, 5143, 5150, 5155, 5159, 343, 5160, 5165, 404, 317, 5168, 5144, 5146, 5145, 363, 5147, 5148, 5149, 1588, 5151, 5152, 5153, + 5154, 5156, 5157, 5158, 5161, 5164, 5162, 5163, 5166, 381, 5167, 5169, 5170, 5171, 317, 317, 5173, 5174, 523, 490, 317, 608, 370, 5178, 5186, 5191, 5179, + 2036, 5182, 5184, 5185, 5180, 5181, 5183, 971, 381, 5187, 5188, 5189, 317, 5190, 317, 5193, 5194, 5195, 5198, 5202, 5204, 317, 3726, 5206, 1347, 3999, 362, + 2322, 317, 5196, 5197, 343, 5003, 1345, 317, 5199, 5200, 5201, 596, 317, 317, 5203, 404, 404, 5205, 490, 401, 5207, 466, 351, 5210, 5212, 5214, 382, + 5211, 5213, 5215, 5216, 5217, 5219, 5222, 3999, 5225, 317, 382, 317, 5220, 381, 343, 5221, 363, 343, 362, 317, 5223, 5224, 5226, 5228, 5230, 5231, 5232, + 5233, 5234, 5235, 5200, 370, 551, 2156, 5237, 5239, 5251, 5255, 5256, 5263, 5267, 5277, 595, 5238, 5240, 5242, 317, 5241, 5243, 5245, 5244, 5246, 5247, 5248, + 5249, 5250, 317, 1347, 5252, 5253, 5254, 373, 5167, 5257, 5261, 5258, 5259, 5260, 4564, 1347, 356, 5262, 5055, 343, 5264, 5265, 5266, 5120, 5268, 5272, 5274, + 5276, 5269, 5271, 5270, 5273, 356, 466, 317, 5275, 2603, 317, 5278, 5279, 5280, 5281, 608, 5283, 5284, 5285, 5286, 5288, 5314, 5316, 5320, 5322, 5289, 5296, + 5301, 5304, 595, 317, 5310, 5312, 348, 5290, 5293, 5291, 5292, 5294, 5295, 5297, 5298, 5299, 5300, 363, 363, 5302, 5303, 371, 362, 5305, 4980, 396, 5306, + 5308, 317, 5307, 4925, 1108, 5309, 3284, 5311, 5055, 2156, 5313, 5315, 471, 332, 380, 317, 317, 317, 317, 317, 380, 5317, 317, 2381, 5318, 5319, 3854, + 356, 5095, 5321, 317, 317, 5323, 5325, 5326, 5324, 5327, 393, 5328, 317, 5330, 5333, 5338, 5344, 5347, 5348, 5360, 5372, 5331, 5332, 5334, 5336, 5335, 5337, + 5339, 2156, 5340, 5341, 490, 5342, 5343, 5345, 5346, 5349, 317, 5357, 5350, 5356, 5351, 317, 5352, 5354, 370, 5353, 317, 363, 5355, 343, 1325, 317, 5358, + 5225, 523, 5359, 466, 317, 317, 381, 1347, 5361, 5364, 5366, 363, 5368, 5362, 5363, 5365, 5367, 5369, 5370, 5371, 356, 5113, 370, 317, 5373, 5374, 5375, + 370, 381, 5201, 5377, 317, 5378, 5379, 380, 5381, 5382, 5384, 5385, 363, 380, 490, 5387, 5388, 2322, 5393, 5398, 5383, 5386, 317, 489, 317, 5389, 5390, + 5392, 5391, 2156, 5324, 5394, 5395, 5396, 317, 1347, 317, 382, 343, 5397, 5399, 317, 511, 5401, 2086, 5403, 433, 5404, 380, 5405, 5406, 2476, 5407, 5410, + 380, 5433, 5559, 5562, 5612, 5613, 5646, 5658, 5678, 5680, 343, 5685, 5702, 5721, 365, 5749, 5786, 5809, 5811, 5408, 5409, 5411, 5413, 317, 5422, 5424, 5426, + 5429, 5432, 5412, 5414, 5420, 5415, 317, 5416, 317, 317, 5417, 1347, 5418, 5419, 317, 5421, 5423, 5425, 5427, 5428, 5430, 5431, 5434, 317, 5440, 5471, 5484, + 5493, 5531, 5540, 5435, 5436, 490, 5438, 5437, 5439, 5441, 5442, 5451, 5454, 5460, 5469, 1325, 466, 5443, 5444, 5445, 5448, 381, 5446, 5447, 5113, 2510, 5449, + 5450, 5452, 356, 317, 5453, 5096, 343, 5455, 5456, 356, 466, 2510, 317, 5457, 514, 5458, 343, 5459, 5461, 637, 5462, 5463, 649, 633, 5464, 5465, 332, + 5466, 317, 1267, 317, 317, 5457, 382, 5055, 5467, 5468, 317, 345, 511, 5470, 317, 867, 5472, 363, 5478, 5473, 5474, 5475, 5476, 370, 317, 5477, 5479, + 5480, 351, 5481, 5482, 5483, 5485, 5489, 5486, 5488, 5487, 5490, 5491, 5492, 2110, 5494, 5496, 5511, 5518, 5520, 5495, 5497, 5498, 5503, 371, 5238, 5499, 5500, + 5501, 5502, 5504, 5507, 5505, 5506, 2184, 5464, 5399, 381, 5508, 2156, 5509, 5510, 5464, 466, 5399, 5512, 5517, 317, 523, 356, 5513, 317, 5514, 5515, 5516, + 5519, 5521, 5527, 5522, 317, 5523, 5525, 356, 466, 317, 5457, 5524, 370, 1347, 5526, 5528, 5529, 5530, 317, 5532, 5537, 5539, 5533, 5536, 5534, 5535, 5365, + 356, 466, 317, 356, 404, 5538, 380, 1325, 466, 5541, 5544, 5548, 5552, 5557, 5542, 5543, 3648, 5545, 5546, 5547, 5549, 5551, 370, 5550, 5553, 5394, 466, + 5555, 5554, 5556, 5558, 1430, 5560, 5561, 5563, 5565, 5566, 357, 317, 5567, 5568, 362, 5571, 5572, 5574, 5576, 5608, 5609, 317, 645, 637, 5564, 5238, 317, + 4943, 5058, 5569, 5570, 1753, 401, 381, 332, 317, 490, 5573, 5575, 317, 5577, 339, 5586, 5591, 5578, 5582, 343, 5579, 5580, 5581, 5583, 5584, 5585, 5587, + 317, 5588, 5589, 5590, 5592, 5225, 5593, 2272, 5603, 5594, 5595, 5596, 5597, 5598, 5599, 5600, 5601, 5602, 5604, 5605, 5606, 5607, 5238, 5610, 5611, 317, 5614, + 5620, 5629, 1526, 5636, 5638, 5641, 317, 5645, 5615, 343, 5619, 5616, 5617, 5618, 5621, 343, 317, 317, 5624, 5625, 404, 4980, 5627, 5622, 5623, 5626, 317, + 5628, 5630, 5633, 317, 5635, 5631, 410, 5632, 466, 317, 5399, 1347, 317, 5634, 365, 317, 5637, 5639, 5640, 5642, 466, 5643, 5644, 381, 2219, 5647, 5654, + 5655, 5657, 317, 5648, 5649, 5652, 5653, 317, 545, 479, 317, 5650, 370, 5651, 5656, 317, 427, 390, 565, 5659, 5664, 5666, 5662, 5668, 5676, 317, 5660, + 5661, 5662, 4980, 317, 5663, 345, 345, 5665, 439, 5667, 363, 5669, 5670, 5671, 5672, 5673, 5674, 5675, 466, 5399, 317, 5399, 317, 5677, 439, 3522, 5679, + 317, 317, 317, 5681, 5682, 5683, 5684, 490, 5686, 396, 5688, 490, 5690, 5693, 5694, 5695, 5696, 5687, 317, 5689, 5691, 5692, 1109, 1347, 317, 339, 2021, + 5697, 5698, 5699, 5700, 5701, 317, 5703, 5704, 5712, 5705, 5710, 5706, 5707, 5708, 356, 5709, 5711, 5713, 2381, 5717, 5718, 5719, 5714, 5715, 5716, 317, 514, + 5447, 466, 5720, 380, 356, 2081, 5722, 5723, 5728, 5747, 990, 317, 317, 317, 317, 5724, 5725, 5726, 5727, 317, 5729, 5733, 5738, 5740, 5743, 5745, 5730, + 2163, 5731, 5732, 317, 5734, 5735, 5736, 5737, 5739, 5741, 5742, 5744, 2163, 490, 317, 5746, 5748, 317, 5464, 317, 5750, 5770, 5777, 5778, 5779, 5751, 5753, + 317, 427, 5766, 317, 5752, 5754, 5755, 317, 410, 5762, 5756, 5757, 5758, 5759, 5760, 5761, 5763, 5764, 5765, 5547, 5767, 5768, 5769, 5201, 404, 317, 1347, + 317, 5771, 5772, 317, 5773, 5774, 5775, 5776, 5334, 345, 5780, 317, 5781, 5783, 5785, 5782, 370, 370, 5488, 5784, 317, 380, 345, 1325, 404, 2510, 5787, + 396, 397, 490, 5789, 5794, 5797, 5804, 5806, 5808, 5788, 363, 5790, 5791, 5792, 5793, 5795, 317, 5796, 5798, 5799, 5800, 5801, 5802, 5803, 5805, 317, 380, + 315, 315, 5807, 317, 5324, 5810, 525, 5812, 5813, 5817, 5850, 5852, 5881, 5922, 5927, 5934, 5965, 5992, 5997, 6001, 6034, 6037, 5872, 6057, 6076, 6082, 6092, + 6127, 6129, 6132, 6133, 5814, 5815, 5816, 317, 5818, 317, 5819, 317, 351, 317, 5820, 5824, 5842, 5843, 5848, 5849, 317, 2322, 1230, 317, 317, 332, 5821, + 2272, 490, 5822, 5823, 637, 5825, 787, 5827, 5831, 5833, 5834, 5835, 5837, 362, 5826, 5828, 5829, 317, 490, 5830, 741, 370, 371, 5832, 371, 371, 371, + 317, 317, 2163, 317, 5836, 317, 363, 5838, 5839, 317, 5840, 5841, 5844, 5845, 5846, 5847, 2510, 317, 5457, 5167, 317, 317, 1347, 382, 5055, 343, 317, + 5851, 5853, 5854, 5857, 5870, 317, 5872, 5873, 317, 5878, 317, 4965, 345, 2537, 317, 5855, 317, 5856, 5325, 5661, 317, 5858, 348, 5860, 5861, 5863, 5867, + 345, 5859, 356, 5262, 317, 5862, 5864, 363, 5865, 5866, 5868, 5869, 2156, 5871, 5874, 5875, 5876, 410, 5877, 466, 5879, 356, 317, 5880, 5882, 317, 5884, + 1109, 5899, 4268, 5912, 5914, 5918, 5919, 5921, 5883, 3751, 5885, 5887, 317, 3023, 5888, 5889, 5891, 5892, 5893, 5895, 490, 5886, 574, 1999, 965, 317, 317, + 5793, 5890, 5663, 439, 5894, 5896, 363, 5897, 2310, 5898, 5900, 2272, 5902, 317, 5911, 5901, 350, 5903, 3125, 490, 2271, 5909, 5904, 5905, 5906, 5907, 5908, + 5910, 5913, 490, 5915, 362, 404, 5916, 5917, 5223, 317, 5920, 949, 351, 5923, 5924, 5925, 5926, 5928, 317, 5929, 5933, 565, 5930, 5310, 5931, 466, 317, + 5932, 317, 343, 1347, 5935, 5937, 317, 5938, 5939, 5943, 5944, 5952, 5953, 345, 5956, 5957, 5963, 3750, 5964, 5936, 5940, 5941, 5942, 651, 633, 633, 5945, + 5946, 5947, 5948, 5949, 5950, 5951, 354, 971, 381, 317, 5954, 5955, 5958, 5959, 5960, 5961, 5962, 5966, 5970, 5975, 5981, 5967, 490, 5968, 5969, 5971, 317, + 5972, 5973, 5974, 380, 1347, 5976, 5978, 5977, 356, 466, 317, 317, 5979, 5980, 356, 3854, 5982, 5988, 5989, 2368, 2368, 1526, 5983, 5984, 5985, 5986, 1325, + 5987, 351, 382, 363, 5990, 410, 5991, 466, 5399, 317, 5993, 5994, 5995, 5996, 5998, 5999, 6000, 3529, 362, 1160, 317, 317, 3517, 6002, 6003, 317, 6029, + 6004, 6018, 6023, 6026, 5760, 6005, 317, 6010, 317, 1267, 6006, 6007, 6008, 6009, 6011, 6012, 6013, 6014, 6015, 5226, 6016, 356, 6017, 2510, 382, 5055, 5550, + 6019, 5394, 466, 6020, 6022, 5226, 6021, 6024, 6025, 5457, 5055, 317, 6027, 523, 6028, 466, 6030, 6031, 6032, 5226, 6033, 6035, 6036, 490, 317, 343, 343, + 6038, 6047, 6049, 351, 6051, 6054, 351, 6039, 6043, 6044, 6040, 6041, 6042, 6045, 317, 6046, 345, 6048, 365, 6050, 6052, 6053, 5847, 317, 317, 345, 1347, + 6055, 5447, 466, 6056, 373, 5226, 356, 466, 5399, 317, 317, 6058, 6059, 6066, 6075, 6060, 6061, 6064, 2087, 6062, 6063, 317, 6065, 6067, 317, 6073, 381, + 363, 363, 363, 6068, 6071, 317, 1160, 343, 317, 6069, 6070, 6072, 6074, 371, 381, 2134, 6077, 317, 6078, 6080, 6079, 1526, 5225, 6081, 6083, 6084, 348, + 317, 5225, 317, 6085, 6090, 317, 6086, 6089, 317, 6087, 6088, 4591, 317, 6091, 6093, 6094, 6096, 6104, 6119, 6124, 6095, 489, 6097, 6098, 317, 6100, 6099, + 466, 317, 317, 5399, 317, 6101, 6102, 6103, 317, 4591, 317, 5225, 6105, 6112, 6106, 6107, 6109, 5250, 6108, 6110, 6111, 466, 4591, 4952, 1347, 317, 6113, + 6114, 6116, 6115, 5324, 397, 6117, 317, 6118, 2156, 317, 6120, 410, 6121, 466, 6122, 317, 3854, 1347, 317, 6123, 6125, 2631, 2551, 6126, 381, 370, 5717, + 1588, 6128, 371, 380, 6130, 6131, 351, 342, 6134, 6135, 6136, 6137, 6138, 6140, 6142, 6143, 6146, 6148, 6149, 6151, 6153, 6155, 6157, 6200, 6213, 6221, 6223, + 6141, 345, 317, 6144, 6145, 363, 363, 349, 2142, 6147, 2110, 367, 2330, 6150, 317, 382, 345, 6152, 350, 6154, 2845, 6156, 1347, 362, 345, 6158, 2035, + 6159, 6160, 365, 6161, 345, 6196, 317, 1347, 1347, 4564, 390, 6162, 6164, 6173, 539, 6174, 6177, 6180, 6186, 6189, 6163, 5732, 6165, 6167, 6166, 6168, 6169, + 6170, 6171, 6172, 2546, 317, 3869, 3361, 6175, 6176, 6178, 520, 6179, 6181, 6182, 6183, 6184, 6185, 965, 5105, 317, 6187, 6188, 6190, 4564, 6192, 565, 6191, + 6193, 1358, 6194, 6195, 6197, 6198, 6199, 317, 6201, 351, 1060, 6208, 6210, 6202, 6203, 6205, 6207, 6204, 6206, 6209, 6211, 6212, 6214, 4591, 490, 6220, 6215, + 6216, 317, 317, 6217, 1526, 3967, 6219, 578, 6218, 578, 2206, 6222, 6224, 6225, 6226, 6227, 6228, 6230, 317, 1109, 6236, 351, 6238, 6279, 6284, 6288, 6295, + 6297, 6299, 6313, 6331, 6335, 6361, 6362, 433, 373, 6231, 6232, 317, 6233, 2146, 6234, 6235, 6237, 6239, 6243, 6252, 6261, 6267, 6273, 373, 6240, 6241, 6242, + 6244, 6250, 3854, 6245, 5225, 356, 6246, 317, 382, 6247, 343, 6248, 6249, 317, 317, 6251, 6253, 6256, 6257, 6259, 6033, 6254, 6255, 317, 6258, 317, 5201, + 6260, 5553, 356, 466, 317, 384, 6262, 6265, 6263, 317, 6264, 6266, 349, 6268, 6269, 6271, 6270, 356, 466, 317, 6272, 370, 6274, 6276, 6275, 6277, 6278, + 6280, 6281, 6282, 6283, 317, 5211, 6285, 6286, 6287, 6289, 578, 343, 317, 6290, 6291, 6292, 6293, 6294, 6296, 2631, 332, 343, 317, 6298, 317, 6300, 381, + 6301, 380, 6302, 6303, 6309, 6310, 6304, 6305, 6306, 6307, 6308, 6311, 6312, 6314, 317, 389, 6315, 6323, 6316, 365, 439, 6320, 965, 6317, 317, 6318, 6319, + 317, 317, 412, 317, 345, 6321, 6322, 3079, 2509, 6324, 6326, 6327, 1194, 362, 6328, 6325, 6329, 6330, 6332, 6333, 6334, 363, 367, 6336, 6356, 490, 6337, + 6341, 6338, 6339, 6340, 6342, 6344, 2277, 6346, 6348, 6349, 6351, 6353, 6343, 6345, 6347, 2126, 4925, 534, 6350, 434, 5961, 6352, 6311, 6354, 6354, 6355, 6357, + 6358, 6359, 6360, 490, 5623, 6363, 6364, 6365, 6366, 6367, 6368, 6369, 6370, 6371, 6373, 6395, 6399, 6403, 6405, 490, 6416, 6443, 6445, 6455, 6456, 6469, 6488, + 6489, 6529, 6530, 6533, 6566, 6372, 6374, 6375, 6376, 6378, 2012, 6383, 6385, 6389, 6391, 343, 554, 1108, 351, 6377, 6379, 6380, 6381, 6382, 317, 6384, 317, + 6386, 393, 6388, 433, 6387, 6390, 5619, 1160, 317, 6392, 490, 317, 317, 6393, 6394, 317, 6396, 6397, 6398, 6400, 6401, 6402, 427, 351, 6404, 958, 317, + 317, 466, 6406, 370, 6407, 6411, 6413, 317, 6408, 6409, 351, 6410, 317, 596, 317, 2815, 317, 694, 633, 317, 317, 317, 6412, 351, 363, 6414, 6415, + 6417, 2510, 6419, 6421, 6431, 6418, 317, 6420, 6422, 6426, 6423, 6424, 6425, 6427, 6428, 6429, 6430, 6432, 6436, 390, 6442, 6433, 6434, 6435, 5546, 6437, 6438, + 6439, 2510, 363, 6440, 6441, 370, 2571, 6444, 317, 317, 596, 6446, 6448, 345, 317, 6451, 351, 6447, 397, 6449, 317, 317, 6450, 6452, 6454, 6453, 1325, + 5113, 2510, 5241, 4965, 554, 2094, 6457, 6459, 6464, 345, 6458, 317, 1160, 1459, 317, 317, 6460, 6462, 6461, 6463, 317, 6465, 490, 6466, 6467, 6468, 5343, + 317, 396, 6470, 6477, 6482, 6487, 6471, 317, 6472, 6473, 317, 4268, 5174, 6474, 317, 6475, 6476, 6478, 317, 6479, 317, 6480, 6481, 6483, 317, 6484, 317, + 6485, 6486, 332, 317, 317, 490, 365, 6490, 6491, 6500, 6520, 2533, 5027, 5624, 433, 6492, 6493, 490, 6498, 6494, 317, 466, 5399, 317, 6495, 6496, 6497, + 6499, 6501, 6505, 6515, 6516, 345, 6518, 6502, 6503, 6504, 6506, 6507, 6508, 6509, 6510, 6511, 6512, 317, 6514, 6513, 6514, 370, 6517, 2035, 6519, 317, 2035, + 6521, 6526, 2163, 439, 6522, 6523, 6524, 6525, 6527, 6528, 6531, 6532, 6534, 6542, 6543, 6544, 6553, 6551, 6554, 363, 6556, 6557, 6535, 2142, 6536, 332, 317, + 5687, 317, 6537, 6538, 6539, 6540, 6541, 6191, 2142, 317, 490, 343, 332, 351, 6545, 6549, 6552, 6546, 6547, 6548, 2389, 2110, 363, 6550, 6551, 317, 490, + 5238, 351, 348, 565, 6555, 317, 345, 363, 6558, 6559, 6564, 345, 6560, 6561, 6562, 6563, 6565, 450, 488, 6567, 6568, 427, 6570, 6575, 6579, 6582, 6586, + 6588, 6591, 6608, 6619, 6621, 6622, 6633, 6634, 6637, 2462, 2462, 6639, 317, 317, 332, 1109, 6571, 1230, 317, 6572, 345, 6573, 317, 6574, 6576, 317, 6577, + 6578, 6580, 6581, 343, 6583, 6584, 6585, 317, 6587, 317, 6589, 6590, 6592, 6595, 6597, 3023, 6599, 4984, 6600, 317, 6601, 6603, 6605, 317, 4949, 479, 6593, + 6594, 6596, 317, 1347, 317, 6598, 6602, 6604, 3007, 426, 6606, 6607, 6609, 6617, 393, 6610, 6616, 317, 317, 354, 6611, 6614, 317, 6612, 317, 5619, 6613, + 6615, 6618, 317, 317, 354, 6614, 6620, 5255, 1347, 501, 490, 317, 6623, 6624, 450, 345, 6625, 6626, 6627, 6630, 317, 345, 317, 317, 6628, 6629, 6631, + 6632, 363, 466, 317, 6635, 6636, 490, 6638, 490, 490, 381, 590, 6641, 490, 6643, 6646, 6650, 396, 6652, 6653, 6654, 6655, 6662, 6666, 6671, 6677, 6678, + 6685, 6749, 6756, 6762, 6763, 490, 350, 6764, 317, 6642, 490, 317, 6644, 6645, 343, 373, 317, 6647, 6649, 466, 317, 317, 6648, 317, 1160, 317, 2142, + 6651, 317, 5117, 343, 350, 5037, 2110, 317, 471, 345, 6656, 6657, 6658, 6659, 317, 332, 1347, 6660, 6661, 6663, 6664, 345, 5399, 351, 6665, 345, 363, + 343, 5054, 317, 317, 396, 380, 382, 317, 2609, 2584, 5809, 382, 6555, 6667, 5575, 3999, 6668, 2272, 317, 6669, 6670, 381, 317, 1347, 343, 317, 2022, + 317, 6672, 6676, 317, 6673, 6675, 5809, 6674, 339, 6679, 6681, 332, 6680, 6682, 6683, 6684, 637, 6686, 6687, 6694, 6698, 6706, 6708, 6715, 6716, 6719, 6722, + 6727, 2381, 6730, 6734, 6741, 5758, 6743, 317, 6688, 6689, 6692, 345, 1347, 2156, 6690, 6691, 6693, 389, 1044, 380, 317, 6695, 6696, 6697, 574, 6699, 6700, + 6705, 6701, 6702, 6703, 6704, 6707, 317, 317, 1588, 6709, 2402, 6711, 6714, 6710, 4564, 6712, 6713, 1999, 355, 6717, 6718, 6720, 6721, 509, 6723, 384, 317, + 6724, 6725, 6726, 6728, 363, 6729, 406, 6731, 6733, 6732, 4268, 350, 6735, 2261, 6696, 6737, 6738, 6736, 6697, 514, 1526, 3529, 6739, 554, 6740, 2156, 1347, + 380, 317, 6742, 362, 6744, 6745, 371, 596, 1347, 396, 6746, 6747, 6748, 6504, 317, 4984, 6750, 363, 5717, 343, 6755, 317, 6751, 6753, 6752, 6754, 6757, + 6758, 345, 6760, 6761, 6759, 2551, 2551, 363, 5055, 365, 332, 6765, 363, 317, 6767, 6770, 6775, 6776, 6191, 6779, 6781, 6787, 605, 6788, 5571, 363, 5120, + 6768, 317, 1020, 6769, 5120, 6771, 6772, 6773, 6774, 6777, 6778, 6780, 351, 6782, 6783, 6784, 6785, 6786, 590, 596, 343, 6789, 3182, 6791, 6794, 6812, 6815, + 6820, 6827, 6852, 6858, 6860, 6862, 362, 6863, 6867, 6882, 6895, 6902, 6905, 6792, 619, 6793, 6795, 6799, 365, 365, 317, 5120, 6801, 6803, 332, 6804, 6805, + 6807, 317, 6809, 6796, 6797, 6798, 6800, 6802, 317, 343, 317, 1481, 6806, 317, 1331, 6808, 6810, 6811, 649, 6813, 6814, 6816, 427, 6817, 404, 317, 6818, + 317, 317, 343, 2022, 362, 6819, 317, 4591, 363, 6821, 565, 6822, 380, 6824, 565, 439, 356, 362, 6823, 6825, 6826, 490, 6828, 6832, 332, 6836, 6838, + 6841, 6847, 6848, 6849, 490, 6850, 6829, 6830, 6831, 6833, 6835, 6834, 332, 332, 6837, 317, 332, 6839, 6840, 6842, 427, 6843, 317, 6845, 6844, 6846, 2845, + 6851, 6853, 6855, 6856, 6854, 6857, 363, 6859, 6861, 490, 5120, 317, 427, 317, 6864, 6865, 990, 471, 317, 6866, 6868, 380, 1230, 6870, 370, 6880, 2036, + 490, 6869, 370, 501, 6871, 6872, 6873, 6874, 6875, 6876, 6877, 6878, 6879, 6881, 6883, 5866, 6884, 363, 6885, 6886, 6887, 6888, 6889, 6890, 6891, 6892, 6893, + 6894, 2558, 490, 490, 6896, 6898, 6897, 6899, 6900, 6901, 6903, 6904, 317, 6906, 6910, 6912, 6969, 7029, 7058, 7094, 7197, 7215, 7247, 7255, 7321, 7323, 14, + 7471, 7510, 7512, 7528, 7575, 7580, 7586, 7603, 7690, 7707, 7725, 7728, 7731, 6907, 1932, 6908, 6909, 6911, 317, 317, 6913, 6918, 6919, 6921, 6922, 6924, 6929, + 5126, 6931, 6941, 6945, 6948, 6953, 6958, 6960, 6965, 6966, 6968, 6914, 490, 6915, 382, 6916, 6917, 5570, 2291, 362, 1020, 6920, 490, 348, 6923, 741, 332, + 5891, 6925, 6926, 6927, 317, 6928, 6930, 6932, 565, 6934, 5022, 6936, 6938, 365, 381, 6933, 343, 365, 490, 6935, 317, 6937, 317, 2086, 6939, 1109, 6940, + 1266, 317, 317, 317, 6942, 317, 6943, 332, 6944, 317, 317, 490, 317, 343, 317, 317, 365, 6946, 6947, 6949, 6950, 6951, 356, 6952, 317, 5514, 381, + 6954, 6955, 6957, 6956, 5022, 351, 1030, 6959, 565, 1588, 393, 6961, 6962, 6963, 6964, 365, 6967, 6970, 2462, 6986, 7002, 7012, 7015, 7022, 317, 6971, 351, + 6972, 6976, 6979, 6983, 4943, 317, 574, 317, 1588, 6973, 6974, 6975, 6977, 317, 6978, 317, 317, 317, 6980, 5392, 317, 6981, 332, 365, 6982, 1020, 317, + 351, 6984, 6985, 317, 332, 317, 381, 332, 6987, 6989, 6990, 6988, 6991, 6992, 6072, 365, 317, 6994, 4980, 6995, 317, 6993, 6996, 6997, 5104, 6998, 351, + 7000, 7001, 345, 5037, 317, 6999, 363, 6704, 317, 7003, 7006, 363, 1428, 2067, 7011, 7004, 7005, 317, 7007, 7008, 345, 7009, 7010, 7013, 2322, 7014, 317, + 7016, 7017, 7018, 7021, 471, 2078, 471, 471, 471, 7019, 363, 7020, 1020, 363, 490, 7023, 2074, 7024, 370, 317, 7025, 7026, 7027, 7028, 7030, 7037, 7038, + 7042, 7046, 317, 1020, 2261, 7031, 7032, 490, 7035, 2462, 7036, 565, 7033, 7034, 317, 380, 2462, 867, 6916, 7039, 7040, 7041, 317, 433, 4268, 7043, 2156, + 6999, 565, 7044, 7045, 317, 7047, 7048, 7052, 7054, 7056, 7057, 381, 343, 7049, 7050, 7051, 317, 1347, 427, 7053, 7055, 2134, 404, 317, 490, 351, 2073, + 7059, 7063, 7065, 2413, 7077, 7080, 7089, 317, 345, 7093, 7060, 332, 490, 490, 5793, 7061, 317, 490, 317, 317, 7062, 7064, 4984, 7066, 5040, 7069, 7070, + 7071, 7067, 7068, 362, 574, 350, 7072, 2193, 2022, 7074, 2022, 7076, 404, 7073, 7075, 363, 5746, 2067, 2413, 3869, 363, 7078, 317, 7079, 7081, 7085, 748, + 7086, 345, 7082, 7083, 7084, 7087, 7088, 7090, 7092, 605, 7091, 343, 343, 4925, 990, 343, 317, 5810, 2108, 7095, 7096, 317, 5332, 1383, 7097, 7099, 7102, + 7107, 7119, 7124, 317, 7130, 2396, 7131, 7133, 7144, 7146, 7148, 7150, 7152, 7193, 490, 490, 317, 351, 317, 490, 7098, 490, 7100, 7101, 565, 7103, 1347, + 7104, 7105, 7106, 317, 1100, 2035, 1160, 2271, 490, 7108, 7109, 7115, 339, 7110, 7111, 351, 351, 7112, 317, 7113, 7114, 317, 7116, 317, 7117, 7118, 7120, + 7121, 317, 490, 7122, 317, 7123, 7125, 7128, 317, 490, 490, 6974, 7129, 7126, 7127, 651, 1209, 317, 363, 332, 317, 7132, 1325, 466, 2571, 317, 5788, + 7134, 2012, 490, 7136, 439, 490, 317, 7135, 490, 7137, 317, 7143, 7138, 7139, 7140, 317, 7141, 7142, 317, 7145, 7147, 5238, 317, 348, 7149, 7151, 7153, + 7154, 7161, 320, 7163, 2767, 7164, 7165, 7166, 7167, 7180, 7181, 566, 7184, 7188, 345, 1548, 317, 7192, 1155, 317, 317, 317, 317, 1160, 7155, 317, 317, + 7157, 7156, 633, 7158, 7159, 7160, 7162, 2885, 317, 317, 317, 317, 4857, 621, 317, 317, 1155, 317, 317, 1168, 317, 350, 7168, 7169, 7170, 362, 317, + 7171, 7175, 7172, 317, 7173, 317, 7174, 1160, 317, 7176, 7177, 317, 4984, 5793, 7178, 317, 7179, 2108, 490, 317, 566, 317, 317, 2146, 7182, 7183, 345, + 7185, 7186, 7187, 7189, 7190, 7191, 7194, 7195, 7196, 7198, 7204, 317, 7206, 7208, 7211, 404, 501, 7199, 488, 642, 7200, 7201, 673, 922, 1588, 317, 7202, + 7203, 7205, 489, 317, 1108, 317, 7207, 365, 317, 5439, 7209, 356, 7210, 332, 317, 4984, 317, 7212, 7213, 404, 317, 317, 317, 490, 1160, 7214, 7216, + 7218, 7228, 7230, 7233, 7243, 317, 317, 7217, 7219, 7224, 317, 317, 7226, 7220, 7221, 317, 7222, 317, 7223, 7225, 7227, 404, 5616, 317, 7229, 7231, 7232, + 317, 490, 7234, 356, 7238, 7235, 7236, 7237, 317, 7239, 7240, 7241, 7242, 7244, 1588, 7245, 7246, 7248, 7251, 7252, 7249, 365, 7250, 2110, 1526, 7253, 7254, + 949, 7256, 7259, 7262, 490, 7268, 1383, 7270, 362, 317, 343, 7286, 7291, 7300, 7302, 7303, 7307, 7309, 7316, 343, 317, 7318, 7319, 355, 490, 7257, 7258, + 317, 345, 466, 2073, 7260, 1347, 7261, 317, 2715, 7263, 7265, 7266, 490, 317, 7267, 7264, 317, 867, 343, 6228, 317, 317, 317, 317, 7269, 317, 1109, + 317, 6434, 317, 7271, 7272, 7274, 7283, 390, 2146, 7273, 2184, 7275, 356, 466, 5399, 317, 7276, 7277, 7278, 7279, 7280, 7281, 7282, 7284, 7285, 7287, 7290, + 7288, 7289, 448, 317, 7292, 317, 2067, 490, 7299, 7293, 7296, 1267, 7294, 7295, 7297, 7298, 681, 1481, 1913, 490, 7301, 5640, 332, 1588, 7304, 7305, 381, + 7306, 7308, 7310, 317, 7313, 490, 490, 7314, 490, 7315, 317, 7311, 7312, 1160, 351, 490, 7317, 317, 4925, 1044, 317, 7320, 1358, 7322, 7324, 389, 7332, + 7333, 7334, 7335, 7338, 7325, 7329, 390, 7326, 7328, 7327, 317, 397, 7330, 1347, 7331, 490, 5634, 7336, 7337, 7339, 2156, 7340, 7341, 7342, 7344, 7358, 7364, + 7366, 7369, 2024, 7406, 7411, 7412, 7425, 7434, 7435, 7444, 7445, 7446, 7461, 7464, 1020, 7468, 7470, 343, 2272, 7343, 589, 1331, 317, 317, 317, 949, 649, + 7345, 1020, 7347, 573, 7035, 7351, 7352, 7353, 7355, 7357, 317, 7346, 317, 710, 354, 7348, 7349, 7350, 4984, 3999, 6228, 317, 363, 404, 317, 7354, 395, + 7356, 7359, 5960, 7360, 7361, 7362, 471, 7363, 7365, 371, 363, 370, 351, 7367, 7368, 5626, 4984, 7370, 7387, 7388, 7390, 7395, 7400, 7402, 317, 7404, 7371, + 7372, 7373, 7375, 7378, 7381, 1345, 5167, 5324, 317, 2590, 7374, 7376, 382, 7377, 356, 7379, 7380, 317, 433, 345, 317, 7382, 2211, 317, 7385, 7383, 7384, + 7386, 1347, 339, 5241, 7389, 439, 6228, 317, 7391, 7393, 317, 7394, 5840, 6089, 7392, 4952, 317, 390, 4943, 373, 4965, 608, 363, 5809, 7396, 362, 317, + 404, 7398, 317, 5055, 7397, 317, 317, 345, 381, 7399, 7401, 5788, 7403, 6433, 317, 2631, 1358, 317, 7405, 7407, 7409, 5346, 2063, 7408, 350, 343, 317, + 350, 7410, 350, 7413, 7415, 7416, 362, 7420, 317, 7422, 7423, 427, 7414, 2156, 317, 317, 7417, 2063, 7418, 7419, 350, 317, 7421, 351, 554, 404, 7314, + 6412, 7424, 7389, 7426, 2272, 7429, 7430, 7427, 7428, 1325, 2058, 7431, 7432, 7433, 530, 2117, 317, 7436, 2036, 317, 7437, 1109, 7439, 7441, 381, 350, 7442, + 5273, 5501, 5611, 1481, 7438, 7440, 2329, 5399, 1526, 7443, 356, 466, 317, 373, 5709, 317, 476, 1020, 1999, 332, 356, 6864, 4962, 7447, 7450, 7401, 7451, + 7453, 7454, 1060, 7457, 7448, 7449, 7452, 406, 514, 7455, 7456, 6420, 343, 7458, 7459, 7460, 380, 7462, 2060, 7463, 381, 2208, 5717, 1347, 472, 7465, 7466, + 7467, 380, 427, 7469, 2063, 3007, 345, 5623, 2631, 466, 5746, 1358, 404, 7472, 7484, 3023, 7491, 7496, 6601, 7503, 317, 7473, 7474, 7475, 7478, 7482, 5120, + 1345, 5710, 7483, 412, 332, 350, 7476, 7477, 7479, 317, 7481, 7480, 5392, 1108, 332, 490, 1087, 363, 490, 2004, 332, 7485, 7487, 7489, 7490, 2004, 351, + 7486, 2146, 317, 317, 7488, 7492, 7493, 7494, 7495, 7497, 7499, 7500, 7501, 5223, 7498, 1347, 351, 343, 7502, 7504, 7507, 7505, 7506, 7508, 7509, 345, 2146, + 7511, 2391, 363, 7513, 381, 7515, 7517, 317, 565, 7518, 396, 7520, 317, 7522, 7523, 7524, 7526, 7514, 1160, 7516, 317, 2110, 1160, 7519, 490, 357, 5611, + 317, 317, 2260, 7521, 317, 7525, 317, 7527, 7529, 7531, 7547, 7573, 317, 7530, 4943, 317, 5570, 490, 7532, 7533, 363, 317, 317, 317, 7534, 7535, 7536, + 7537, 7538, 7539, 7540, 7541, 7542, 7543, 7544, 7545, 7546, 7548, 7569, 363, 7570, 7549, 7550, 317, 317, 317, 1353, 317, 317, 7556, 2077, 362, 7561, 7563, + 7566, 7568, 5037, 1267, 7551, 7552, 7553, 7554, 7555, 7557, 1188, 7558, 317, 7559, 317, 7560, 5492, 7562, 7564, 343, 7565, 7567, 4591, 317, 345, 7571, 7572, + 7574, 317, 565, 317, 1160, 317, 345, 7576, 7577, 7578, 7579, 1230, 7579, 2163, 7581, 7583, 356, 2074, 317, 7582, 390, 7584, 2301, 7585, 7587, 7589, 404, + 7591, 7593, 7595, 362, 7599, 7600, 361, 7601, 1060, 343, 7588, 2178, 5624, 7590, 7448, 448, 7592, 392, 7594, 317, 7596, 7597, 7598, 7447, 317, 317, 356, + 7602, 426, 7604, 7618, 7619, 7643, 7652, 501, 7661, 7664, 7675, 7683, 1700, 7688, 7689, 317, 7605, 317, 7607, 7609, 7610, 317, 7613, 317, 7616, 317, 2035, + 7606, 7608, 1459, 7611, 2369, 7612, 5328, 5570, 345, 7614, 317, 7615, 7617, 2381, 489, 1160, 4591, 7620, 7628, 317, 317, 748, 317, 7621, 7622, 7623, 7625, + 2108, 4949, 4949, 7624, 7626, 7627, 7629, 6425, 7630, 7631, 7632, 7633, 317, 7634, 7635, 7639, 7636, 7637, 7638, 7640, 7641, 2510, 317, 370, 317, 382, 5055, + 7642, 7644, 7646, 7647, 7648, 7650, 317, 7645, 317, 2152, 396, 7452, 7649, 390, 343, 7651, 1358, 2146, 7653, 317, 7655, 7656, 7658, 350, 7654, 317, 349, + 345, 7657, 7659, 7660, 1347, 460, 7662, 7663, 4984, 371, 2298, 343, 7665, 7669, 6355, 7670, 7673, 2035, 317, 7674, 7666, 7667, 7668, 7671, 5028, 7672, 2410, + 7676, 7679, 7680, 7677, 7678, 350, 7681, 7682, 317, 401, 7684, 7685, 3751, 7686, 7687, 7691, 7693, 393, 7696, 7697, 317, 7706, 490, 7692, 5238, 1108, 7694, + 489, 7695, 551, 2581, 7698, 7699, 7701, 7705, 317, 7700, 317, 741, 427, 7702, 7703, 7704, 1358, 317, 345, 7708, 7714, 7720, 7723, 317, 5237, 317, 373, + 7709, 7710, 345, 1108, 490, 7711, 332, 7712, 2322, 317, 6981, 7713, 317, 317, 351, 332, 317, 7715, 7717, 317, 317, 317, 7716, 7718, 7719, 332, 2462, + 317, 404, 490, 4965, 7196, 7721, 7722, 357, 332, 7724, 7726, 6318, 363, 1992, 7727, 3573, 362, 7098, 565, 490, 317, 7729, 7730, 4591, 490, 1459, 317, + 317, 490, 490, 363, 7266, 7732, 7733, 7734, 7735, 7736, 7737, 7738, 7739, 7745, 7746, 7813, 7859, 7862, 7863, 7903, 7904, 7912, 355, 7943, 7945, 7959, 7970, + 7991, 8028, 8032, 8046, 8048, 8053, 8055, 7740, 7741, 7742, 7743, 7744, 7747, 7748, 7749, 350, 317, 5687, 7757, 7758, 365, 7766, 490, 7772, 7793, 7794, 7803, + 7804, 490, 7806, 373, 343, 350, 2222, 317, 7750, 357, 7756, 317, 7751, 7752, 317, 7753, 7754, 7755, 351, 1943, 317, 7759, 7761, 6565, 466, 401, 7760, + 7762, 7763, 7764, 7765, 5223, 2537, 7767, 7523, 317, 317, 1358, 7770, 490, 7768, 2272, 637, 7769, 633, 694, 317, 317, 1267, 317, 7771, 5130, 7773, 7777, + 7778, 7780, 7783, 7785, 5619, 317, 7786, 317, 7774, 7776, 7775, 7779, 363, 7781, 7782, 7784, 7787, 7788, 7789, 7790, 317, 7791, 7792, 317, 345, 363, 5363, + 490, 317, 7795, 317, 568, 7802, 7796, 7798, 7797, 7799, 7800, 7801, 317, 1033, 343, 7805, 363, 7807, 7808, 7811, 390, 7809, 7810, 7812, 2603, 317, 345, + 5217, 490, 317, 7814, 7822, 7827, 7840, 7842, 7844, 7851, 2163, 490, 365, 317, 7815, 332, 7816, 7817, 7818, 7819, 7820, 433, 7821, 590, 7823, 7824, 637, + 1266, 317, 633, 2077, 7825, 7826, 317, 4980, 317, 6021, 317, 523, 7828, 6266, 7832, 490, 7835, 7838, 7829, 7830, 7831, 7833, 5200, 7834, 7836, 7837, 1347, + 345, 7839, 7841, 393, 317, 7843, 317, 345, 7845, 7846, 990, 349, 317, 5788, 393, 7847, 7849, 317, 7848, 2272, 4984, 5439, 317, 345, 7850, 7852, 7853, + 7856, 7857, 7854, 7855, 447, 7858, 7860, 7861, 7852, 5993, 317, 342, 7864, 7866, 490, 4943, 7867, 7869, 7870, 7874, 7875, 7882, 7895, 7899, 317, 317, 7901, + 7865, 332, 2178, 7868, 7871, 7872, 317, 466, 317, 317, 382, 7873, 410, 7876, 7877, 7879, 5200, 490, 7881, 356, 466, 5399, 2381, 317, 7878, 7880, 317, + 350, 317, 7883, 362, 317, 7893, 317, 317, 7884, 332, 1109, 7890, 317, 7892, 7885, 741, 7889, 345, 317, 317, 317, 7886, 317, 317, 317, 7887, 317, + 317, 345, 427, 7888, 7891, 317, 7894, 554, 363, 7055, 2291, 7896, 7897, 7898, 2322, 490, 1444, 7900, 412, 350, 6551, 2291, 7902, 936, 363, 7905, 7907, + 7906, 7908, 7909, 7910, 7911, 7913, 7914, 7917, 7922, 7923, 7926, 7927, 381, 7932, 7934, 7937, 7942, 7915, 317, 317, 7916, 345, 7918, 7919, 317, 363, 7920, + 7921, 317, 7924, 7925, 317, 620, 345, 317, 7928, 1347, 317, 490, 7929, 7930, 317, 5603, 317, 7931, 7933, 6600, 317, 355, 317, 3505, 5570, 317, 5332, + 317, 7935, 7936, 5325, 7938, 7940, 317, 7941, 7939, 7944, 363, 7946, 7948, 7950, 7955, 7958, 7947, 317, 2024, 317, 7949, 7951, 317, 7952, 7953, 7954, 7956, + 345, 7957, 5087, 317, 4984, 2156, 427, 7960, 317, 7963, 363, 7961, 7962, 370, 7964, 7965, 7969, 7966, 7967, 7968, 345, 339, 7971, 332, 7972, 7973, 317, + 7974, 7975, 7977, 1347, 381, 7987, 317, 5439, 332, 317, 2610, 7976, 490, 317, 343, 5105, 7978, 7979, 7980, 7981, 7982, 7984, 7985, 5325, 317, 2142, 5788, + 317, 5033, 317, 317, 343, 7983, 345, 7986, 7988, 7989, 317, 7990, 317, 7992, 7994, 7996, 8012, 8015, 317, 8022, 8024, 317, 382, 7993, 317, 490, 317, + 7995, 317, 1347, 4952, 7997, 8001, 8010, 317, 7998, 7999, 8000, 8002, 363, 8004, 8006, 8003, 5055, 4591, 8005, 345, 2163, 8007, 2627, 8008, 8009, 317, 8011, + 8013, 8014, 8016, 8017, 317, 8018, 8021, 8019, 2184, 5488, 8020, 8023, 343, 8025, 8026, 2156, 8027, 1325, 5054, 8029, 1020, 2310, 8030, 317, 317, 7776, 390, + 343, 8031, 8033, 7737, 8034, 380, 8036, 8037, 8038, 8039, 6674, 7590, 8035, 365, 2219, 6674, 1453, 367, 8040, 8045, 5309, 363, 8041, 8042, 8043, 8044, 8047, + 7850, 371, 8049, 8050, 357, 8052, 8051, 2521, 5675, 466, 317, 370, 8054, 6228, 8056, 8057, 8061, 8062, 317, 317, 393, 343, 8058, 2366, 8059, 8060, 8063, + 8064, 343, 8065, 8066, 8067, 8068, 8077, 8185, 8187, 8209, 8305, 8330, 8334, 8420, 8429, 8472, 8479, 8491, 8492, 8564, 1060, 8590, 8592, 8595, 17, 8871, 8882, + 8883, 8884, 8888, 8907, 8069, 8070, 8071, 8072, 8073, 8074, 8075, 8076, 8078, 8084, 8097, 8103, 8112, 8118, 1347, 8119, 8123, 8140, 8145, 8149, 8154, 8160, 8171, + 332, 8181, 490, 8079, 8082, 343, 525, 8080, 8081, 8083, 8085, 8088, 350, 8094, 8096, 8086, 8087, 8089, 8090, 8091, 8092, 8093, 1347, 401, 2004, 595, 8095, + 381, 8098, 332, 8100, 8101, 351, 8099, 8102, 317, 5727, 380, 5241, 8104, 8106, 8105, 8107, 8108, 8109, 5241, 8110, 8111, 8113, 317, 8117, 8114, 8115, 8116, + 2948, 381, 338, 8120, 8121, 2003, 8122, 633, 8124, 8125, 8126, 1943, 8130, 8131, 8133, 8134, 8127, 8128, 8129, 317, 434, 8132, 7380, 7834, 317, 2156, 317, + 316, 385, 8135, 8138, 8139, 8136, 8137, 1347, 1347, 5699, 8141, 2110, 1481, 8142, 8143, 8144, 345, 8146, 6409, 365, 8147, 490, 317, 1444, 8148, 3236, 8150, + 393, 2110, 8151, 8152, 8153, 2094, 2163, 8155, 317, 8159, 5241, 8156, 8157, 317, 1160, 317, 8158, 317, 7242, 6402, 317, 8161, 490, 8163, 8162, 365, 8164, + 8169, 8165, 8166, 8167, 490, 8168, 490, 1347, 345, 1109, 8170, 317, 8172, 5482, 8173, 8174, 8179, 317, 8175, 8176, 8177, 8178, 8180, 317, 7560, 4268, 8182, + 8183, 8184, 8186, 8188, 8190, 8196, 8201, 317, 8206, 8207, 3361, 8208, 7942, 317, 8189, 8191, 8193, 381, 8192, 6993, 8194, 2510, 8195, 380, 596, 317, 8197, + 488, 8198, 5238, 8199, 5201, 8200, 356, 466, 362, 317, 5634, 317, 317, 8202, 8204, 490, 332, 8203, 8205, 1915, 1109, 8170, 490, 2146, 949, 8210, 8220, + 8232, 8233, 8235, 8239, 8297, 8299, 8303, 8211, 8215, 574, 370, 8218, 490, 317, 2110, 8212, 5241, 8213, 8214, 8216, 8217, 8219, 363, 343, 7949, 8221, 8229, + 317, 5896, 8222, 8223, 8225, 362, 363, 8226, 4980, 8224, 6594, 371, 317, 363, 8227, 6046, 317, 8228, 317, 5037, 8230, 363, 8231, 2178, 490, 651, 3726, + 317, 362, 490, 8234, 317, 317, 8236, 8237, 8238, 350, 363, 2211, 317, 317, 362, 8240, 8246, 8263, 343, 8269, 404, 8286, 317, 8292, 8241, 8242, 317, + 8244, 8245, 7850, 365, 317, 8243, 317, 332, 371, 6228, 8247, 8251, 382, 8252, 317, 317, 8253, 8254, 8255, 2715, 6817, 8256, 8261, 621, 8248, 317, 633, + 633, 2163, 317, 8249, 489, 317, 363, 363, 8250, 317, 317, 6831, 1109, 6228, 317, 490, 7384, 365, 2715, 5890, 317, 363, 317, 681, 8257, 8258, 651, + 1353, 317, 1025, 1353, 317, 345, 8259, 1160, 317, 317, 1267, 317, 317, 8260, 8262, 7118, 490, 1267, 1209, 4984, 8264, 8265, 490, 8267, 8268, 317, 317, + 8266, 317, 7186, 343, 345, 8270, 6355, 8273, 8276, 8279, 8281, 8282, 8271, 8272, 8274, 8275, 2410, 8277, 8278, 8280, 4591, 2086, 317, 8283, 370, 8284, 8285, + 2163, 8287, 5890, 317, 8288, 8289, 8290, 8291, 8293, 8294, 8295, 8296, 748, 8298, 3361, 637, 1300, 8300, 633, 694, 8301, 362, 8302, 490, 8304, 1481, 8306, + 8309, 8310, 343, 2067, 8312, 8324, 8326, 8329, 317, 317, 8307, 5038, 1481, 8308, 490, 5439, 8311, 6188, 8313, 317, 8316, 8314, 8315, 8317, 345, 8318, 8319, + 8110, 8320, 317, 8321, 8322, 8323, 490, 8325, 343, 8327, 363, 8328, 8331, 8332, 2551, 8333, 1489, 8335, 8338, 5205, 2134, 8366, 2146, 8385, 8398, 8406, 8408, + 404, 8410, 8419, 1020, 8178, 8336, 8337, 317, 8339, 8363, 8365, 8340, 8341, 8342, 317, 317, 8344, 8345, 317, 1353, 8346, 8347, 2077, 8348, 8349, 8352, 8356, + 8358, 8361, 8362, 363, 317, 673, 317, 1018, 317, 1267, 317, 317, 317, 8343, 317, 317, 317, 621, 889, 317, 367, 384, 490, 317, 2715, 2156, 8350, + 8351, 317, 8353, 317, 490, 6458, 8354, 8355, 317, 7143, 317, 317, 427, 317, 317, 8357, 317, 971, 8359, 8360, 317, 7672, 332, 317, 2715, 317, 8178, + 5890, 365, 971, 7386, 317, 5991, 466, 8364, 363, 317, 317, 363, 2236, 5570, 8367, 8368, 490, 8370, 317, 317, 8369, 7566, 2142, 365, 8371, 8375, 343, + 8376, 8379, 8382, 8372, 8373, 8374, 317, 2355, 6486, 5033, 8377, 8378, 8380, 8381, 8383, 8384, 8386, 8387, 8393, 8397, 427, 5793, 345, 356, 317, 8388, 317, + 8391, 317, 1347, 8392, 404, 317, 5898, 8389, 8390, 363, 350, 4984, 8394, 1992, 8395, 8396, 7888, 7888, 7437, 741, 317, 8399, 8401, 317, 490, 8402, 2715, + 8404, 343, 8400, 4984, 317, 317, 8403, 8405, 317, 8407, 317, 371, 351, 370, 7657, 8409, 8411, 8413, 8415, 5570, 2381, 8412, 8414, 317, 317, 1526, 6228, + 317, 8416, 8417, 317, 8418, 3505, 8421, 8422, 8424, 365, 8425, 8423, 8426, 8428, 8427, 2261, 4591, 317, 433, 8430, 365, 5033, 490, 8431, 8432, 8452, 8454, + 8456, 8457, 8460, 8471, 2210, 317, 8433, 8446, 8447, 8449, 345, 8434, 8438, 8441, 8443, 317, 317, 8435, 345, 8436, 8437, 8439, 8440, 8442, 5447, 5113, 2510, + 8444, 8445, 8448, 8450, 5459, 8451, 8453, 490, 4980, 8455, 7242, 427, 8458, 8459, 317, 317, 8461, 8465, 8466, 490, 404, 317, 8462, 8463, 8464, 8467, 8468, + 8469, 8470, 6420, 490, 371, 490, 8473, 8476, 582, 8478, 7949, 365, 8474, 317, 317, 8475, 574, 490, 8477, 317, 2280, 317, 6600, 8480, 8485, 317, 489, + 8487, 2022, 8489, 8481, 8482, 8483, 8484, 8486, 8266, 427, 8488, 8490, 427, 427, 8493, 8518, 8531, 8545, 8547, 8554, 8563, 8494, 8499, 673, 649, 8501, 8504, + 8505, 8508, 8511, 8512, 8515, 317, 317, 8495, 317, 8496, 633, 8497, 8498, 8500, 317, 1519, 1889, 621, 317, 8502, 343, 8503, 382, 390, 320, 4314, 317, + 8506, 8507, 317, 8509, 317, 2351, 8510, 8513, 8514, 2146, 5570, 8516, 8517, 8519, 370, 343, 8520, 8523, 8526, 8527, 8528, 8530, 351, 8521, 343, 345, 8522, + 343, 8524, 8525, 8529, 5365, 5447, 466, 6195, 8532, 8537, 8538, 490, 8234, 5862, 490, 8540, 8533, 317, 8534, 317, 8535, 8536, 6228, 317, 317, 2077, 317, + 317, 8539, 8541, 8542, 8543, 8544, 8546, 8548, 5051, 8550, 8552, 8549, 332, 8551, 5708, 356, 8553, 317, 8555, 5200, 8558, 317, 8559, 8562, 5890, 8556, 8557, + 370, 317, 351, 1526, 3854, 345, 8560, 8561, 8565, 317, 8566, 490, 8568, 8570, 8573, 1060, 8579, 8581, 317, 8585, 8588, 490, 401, 1347, 8557, 8567, 317, + 8569, 8571, 343, 8572, 596, 4591, 317, 8574, 8575, 8576, 4965, 397, 8577, 345, 8578, 8580, 8582, 8584, 8583, 8586, 8587, 8589, 317, 8591, 8593, 8594, 8596, + 8598, 8601, 8604, 565, 8606, 317, 8607, 8609, 7600, 8615, 8618, 5238, 317, 8597, 8599, 332, 8600, 8602, 5865, 8603, 5309, 8605, 381, 317, 7983, 363, 317, + 5309, 370, 4738, 8608, 8610, 8614, 8611, 8612, 8613, 8616, 2272, 8617, 356, 381, 317, 8619, 8620, 410, 356, 466, 317, 6228, 8621, 8638, 8639, 8640, 8661, + 8691, 8826, 8829, 362, 8831, 8857, 1345, 8864, 8865, 8867, 5087, 8622, 8626, 8627, 317, 8634, 490, 8623, 8624, 8625, 8158, 5441, 8628, 317, 490, 8629, 317, + 8630, 8631, 8632, 8633, 317, 8635, 345, 8636, 8637, 5450, 8641, 8644, 317, 8648, 8650, 8652, 8655, 8656, 317, 8642, 317, 8643, 8645, 8646, 8647, 317, 8649, + 8651, 317, 8653, 351, 7385, 8654, 8657, 8659, 8658, 8660, 8662, 8665, 8666, 8676, 6903, 317, 8663, 343, 1347, 317, 8664, 317, 8667, 8670, 8674, 8668, 8669, + 8671, 8672, 8673, 317, 345, 1526, 317, 8675, 317, 6996, 317, 317, 317, 317, 317, 317, 317, 8677, 8678, 2627, 317, 8679, 339, 8680, 8681, 8683, 8685, + 8687, 8682, 8684, 8686, 8688, 8689, 8690, 521, 317, 8692, 8696, 8703, 8736, 8741, 8742, 8749, 8752, 8754, 8757, 8764, 8768, 8776, 8787, 8793, 8799, 8816, 8821, + 565, 8693, 8694, 8695, 8697, 345, 8701, 8702, 8698, 8699, 8700, 8704, 8705, 8710, 8714, 8723, 317, 8734, 8706, 6602, 8707, 8708, 8709, 8711, 8712, 8713, 5447, + 5987, 448, 8715, 8716, 8719, 8717, 343, 8718, 8720, 8721, 8722, 8724, 8727, 8730, 8725, 8726, 8728, 8729, 8731, 8732, 8733, 8735, 8737, 574, 8738, 8739, 8740, + 8743, 3236, 8745, 8747, 8744, 8746, 8748, 8271, 5173, 8750, 5217, 8751, 317, 389, 345, 867, 8753, 317, 8755, 317, 8756, 363, 8758, 8760, 2590, 8759, 349, + 8761, 8762, 8763, 8765, 8767, 8766, 7865, 345, 8769, 8771, 343, 8773, 8774, 8770, 8772, 8775, 8777, 5054, 8782, 8783, 8784, 8778, 317, 8781, 8779, 8780, 5784, + 332, 343, 8785, 8786, 8788, 8789, 1347, 8792, 8790, 1526, 8791, 317, 5055, 345, 382, 5201, 8794, 8795, 8796, 8797, 8798, 8800, 8805, 497, 490, 8808, 8812, + 8801, 393, 2094, 8802, 8803, 8804, 8806, 8807, 8809, 8810, 8811, 8813, 8814, 8815, 2193, 8817, 8819, 2026, 8820, 8818, 2163, 520, 8822, 8824, 8823, 363, 427, + 8825, 8827, 8828, 8830, 8832, 490, 8835, 8837, 8839, 8855, 490, 8833, 8834, 8836, 371, 8838, 345, 7126, 8840, 8842, 8847, 8853, 6046, 7385, 317, 8841, 2086, + 8843, 8484, 8845, 8844, 8846, 8848, 390, 8849, 8850, 8851, 317, 8852, 489, 8275, 317, 317, 317, 317, 345, 317, 317, 317, 317, 365, 317, 2715, 317, + 7185, 8854, 317, 2108, 8856, 8858, 8859, 362, 1020, 317, 4591, 2279, 8860, 8861, 8862, 8863, 8866, 317, 5392, 363, 8868, 7916, 8869, 8870, 8872, 8873, 8875, + 8876, 8881, 1481, 8874, 8877, 8878, 317, 8879, 8880, 8885, 5200, 8886, 8887, 6670, 8889, 8891, 8895, 2171, 2272, 8897, 8898, 489, 8905, 8890, 8892, 8893, 8894, + 8896, 8899, 8900, 490, 3999, 382, 8901, 8902, 8903, 8904, 1531, 8906, 8908, 365, 8911, 8912, 8913, 317, 317, 8909, 8910, 2272, 2612, 317, 8610, 490, 8914, + 596, 370, 490, 390, 8916, 365, 8917, 8920, 8921, 8922, 489, 8923, 363, 8926, 866, 343, 949, 632, 426, 8918, 8919, 2719, 317, 412, 7906, 8924, 8925, + 8927, 317, 345, 8945, 8957, 565, 8958, 8969, 8973, 8974, 8979, 8980, 9043, 9158, 9169, 9173, 9178, 9186, 3426, 8928, 8931, 1108, 8932, 2081, 490, 8938, 8941, + 4965, 8929, 8930, 317, 1011, 317, 2280, 2280, 8933, 8934, 8611, 8935, 343, 8936, 8937, 8939, 5571, 490, 317, 8940, 5888, 5399, 8942, 574, 8943, 2094, 317, + 8944, 317, 317, 8946, 362, 8949, 8950, 8956, 317, 317, 8947, 362, 1020, 8948, 596, 8951, 8953, 8952, 8954, 8955, 8959, 8960, 8961, 8962, 8964, 5226, 317, + 8963, 8965, 8966, 8967, 8968, 1358, 8549, 8970, 514, 5237, 317, 8971, 8972, 351, 3999, 8975, 370, 8976, 8978, 356, 2094, 8977, 8981, 8990, 380, 558, 9001, + 9006, 5792, 9028, 9032, 9039, 8982, 8986, 8989, 8983, 8984, 8985, 343, 8636, 8987, 8988, 8991, 8992, 2280, 5483, 8993, 8994, 8995, 8996, 8997, 8998, 8999, 9000, + 9002, 9005, 9003, 9004, 9007, 9014, 9023, 565, 9008, 9013, 9009, 9010, 9011, 9012, 9015, 9018, 9016, 9017, 1588, 2163, 9019, 317, 9020, 9021, 9022, 4984, 345, + 9024, 9027, 6163, 9025, 317, 317, 345, 9026, 5717, 5447, 466, 1347, 2163, 490, 9029, 9030, 9031, 2163, 401, 9033, 9034, 2156, 9035, 9037, 317, 370, 2156, + 9036, 574, 339, 345, 9038, 9040, 9041, 9042, 5652, 8544, 490, 9044, 9054, 9082, 9084, 9105, 9119, 9120, 317, 317, 9045, 9049, 9050, 9046, 5174, 6199, 9047, + 9048, 9051, 9053, 5365, 9052, 9055, 9058, 9065, 9076, 9079, 5273, 9056, 9057, 5708, 356, 466, 317, 5019, 466, 9059, 9060, 466, 9061, 362, 9064, 317, 574, + 501, 9062, 317, 4268, 9063, 317, 5054, 9066, 9073, 9067, 9068, 9071, 9069, 317, 9070, 9072, 382, 317, 345, 5828, 9074, 9075, 9077, 404, 317, 9078, 9080, + 5634, 9081, 2510, 466, 9083, 343, 317, 345, 9085, 9087, 9101, 9104, 2184, 9086, 5363, 343, 9088, 6996, 317, 317, 317, 9089, 2171, 9091, 9093, 2052, 317, + 2058, 9096, 9098, 9099, 550, 741, 9090, 448, 317, 317, 448, 9092, 545, 1358, 384, 9094, 9095, 1266, 317, 9097, 1526, 363, 343, 317, 9100, 2627, 574, + 5708, 9102, 5464, 1992, 965, 9103, 5457, 4268, 5167, 9106, 9110, 9111, 9114, 9107, 9108, 9109, 466, 5399, 317, 332, 5431, 9112, 9113, 9115, 9116, 9117, 9118, + 9121, 9125, 9141, 9142, 9122, 9123, 4564, 9124, 9126, 9131, 9134, 9127, 9128, 6020, 9129, 5447, 9130, 382, 363, 343, 9132, 9133, 5363, 5220, 9135, 9136, 9137, + 9138, 317, 9139, 9140, 9143, 5488, 9146, 9152, 9153, 9144, 9145, 410, 5464, 466, 9147, 9148, 9149, 9150, 9151, 5113, 317, 370, 2571, 317, 4564, 5447, 8553, + 9154, 9155, 9156, 381, 9157, 7640, 5113, 9159, 9160, 9161, 9168, 5056, 380, 9162, 9163, 9164, 9165, 9166, 9167, 621, 317, 317, 317, 317, 317, 490, 317, + 317, 1347, 2086, 2110, 9170, 2609, 9171, 8392, 9172, 9174, 9175, 9177, 370, 9176, 363, 4040, 490, 9179, 9181, 9183, 317, 9185, 9180, 9182, 5217, 9184, 9188, + 2073, 490, 380, 9192, 9196, 9218, 2776, 9189, 9190, 9191, 317, 9193, 9194, 9195, 9197, 9208, 9210, 9198, 9199, 317, 7149, 5379, 9201, 9203, 317, 9206, 9200, + 9202, 4984, 2271, 9204, 4984, 317, 1915, 9205, 9207, 9209, 2210, 4591, 332, 2509, 9211, 9215, 1588, 9216, 9212, 9213, 9214, 9217, 2272, 5241, 9219, 9222, 9271, + 9294, 9411, 9428, 9463, 9464, 9499, 9502, 9556, 9560, 9579, 9588, 9653, 9678, 9703, 9708, 9714, 9762, 9784, 9868, 9879, 9885, 9888, 9889, 9891, 9220, 9221, 949, + 9223, 9229, 9237, 9239, 9240, 9246, 9247, 9249, 9250, 9255, 9259, 965, 9262, 9263, 9266, 9267, 9270, 7850, 490, 9224, 9225, 9227, 343, 317, 2381, 9226, 5616, + 1109, 9228, 317, 5355, 490, 5488, 9230, 9232, 343, 9231, 490, 9233, 9235, 9236, 9234, 317, 6355, 9238, 317, 381, 2110, 9241, 9242, 9245, 365, 317, 317, + 9243, 5684, 8522, 9244, 9027, 3688, 317, 9248, 1347, 365, 8217, 490, 365, 7790, 9251, 9252, 332, 5419, 9254, 6394, 9253, 490, 5611, 1347, 9256, 1109, 7301, + 332, 9257, 317, 348, 9258, 317, 6555, 9260, 9261, 9264, 9265, 9268, 332, 317, 9269, 317, 5241, 5241, 6486, 317, 439, 332, 9272, 9273, 9276, 9283, 9288, + 9290, 2142, 317, 4943, 9274, 1108, 9275, 450, 317, 317, 9277, 332, 351, 9278, 9279, 363, 343, 317, 9280, 9282, 9281, 317, 317, 404, 2510, 9284, 9285, + 317, 9286, 351, 412, 412, 2004, 2004, 9287, 5105, 741, 9289, 317, 9291, 317, 9292, 365, 373, 9293, 345, 9295, 9302, 2163, 9305, 9396, 2301, 9399, 9401, + 9402, 9410, 9296, 9299, 332, 490, 574, 5447, 9297, 7000, 9298, 345, 317, 317, 317, 9300, 317, 427, 9301, 317, 317, 490, 5241, 3854, 9303, 317, 9304, + 9306, 9326, 9332, 9345, 9355, 2387, 9386, 9389, 9391, 9393, 7405, 3284, 9307, 339, 9317, 9323, 5105, 9308, 9309, 9314, 9310, 9311, 9312, 317, 9313, 4268, 9315, + 9316, 9318, 9319, 9320, 9321, 9322, 317, 9324, 9325, 428, 9327, 578, 9328, 9329, 9330, 9331, 401, 317, 373, 9333, 9338, 9343, 9334, 9335, 9336, 9337, 9339, + 9340, 9341, 9342, 363, 1347, 9344, 343, 363, 317, 6415, 9346, 9347, 9348, 9351, 317, 9352, 317, 9349, 9350, 9353, 9354, 380, 1347, 521, 9356, 9358, 9364, + 9365, 382, 9371, 9372, 9376, 9384, 9357, 9226, 578, 317, 9359, 9360, 9361, 9362, 9363, 9366, 9369, 9367, 9368, 9370, 9373, 317, 9374, 9375, 9377, 9382, 9378, + 9379, 8682, 317, 9380, 9381, 5701, 1347, 9383, 380, 5447, 9385, 382, 4268, 1347, 9387, 9388, 9390, 9392, 9394, 317, 9395, 317, 490, 2178, 490, 9364, 9397, + 2381, 332, 317, 9398, 317, 490, 9400, 317, 317, 9403, 9404, 5910, 1109, 5482, 9405, 9406, 9407, 9408, 9409, 574, 365, 317, 365, 9412, 317, 9414, 9417, + 9420, 350, 9421, 9424, 9425, 9426, 4974, 2391, 3361, 390, 362, 1345, 317, 9413, 390, 317, 342, 5482, 9415, 9416, 370, 9413, 362, 490, 5891, 9304, 2156, + 5324, 2219, 363, 317, 9418, 9419, 2272, 7035, 363, 1588, 363, 9422, 317, 9423, 370, 5271, 317, 9427, 4591, 9429, 9430, 9431, 7061, 317, 9432, 9433, 9435, + 9437, 9441, 2381, 9452, 9454, 9455, 9457, 9459, 7399, 2142, 2381, 8549, 7801, 3375, 9434, 345, 9436, 9438, 9439, 7657, 9440, 381, 9442, 9444, 9445, 317, 9448, + 345, 7035, 9451, 1100, 317, 9443, 1078, 5241, 317, 9446, 351, 2161, 317, 317, 9447, 390, 9449, 9450, 363, 554, 9453, 317, 9456, 317, 1943, 9458, 590, + 9460, 9461, 9462, 317, 1194, 362, 9465, 9467, 9475, 9476, 9477, 9480, 9481, 9493, 7053, 380, 9466, 7053, 7356, 5241, 9468, 317, 9474, 380, 7053, 9469, 8419, + 317, 9470, 9471, 317, 427, 317, 2178, 9472, 1347, 9473, 362, 1347, 5890, 363, 317, 2271, 332, 9478, 1345, 343, 9479, 343, 434, 5926, 9482, 7053, 9483, + 9484, 9487, 8273, 9489, 5223, 317, 9485, 317, 490, 9486, 332, 9488, 1992, 9490, 332, 9491, 9492, 6430, 317, 9494, 9495, 317, 5153, 9496, 317, 9497, 9498, + 9500, 9501, 345, 4212, 381, 9503, 9506, 9509, 9510, 317, 9513, 9514, 9515, 9516, 9518, 9519, 2357, 9520, 9543, 345, 9550, 9552, 9504, 380, 343, 317, 9505, + 317, 490, 317, 317, 5343, 6069, 317, 317, 1347, 9507, 317, 9508, 345, 397, 343, 9511, 1160, 9512, 345, 490, 2322, 381, 317, 9517, 2322, 317, 2080, + 317, 317, 5862, 5517, 390, 490, 317, 2322, 317, 9521, 1109, 9522, 9523, 343, 9526, 3429, 9524, 9525, 9527, 9529, 9531, 9528, 2156, 9530, 9532, 9533, 9536, + 317, 9539, 9541, 9534, 9535, 370, 7242, 9537, 9538, 9540, 9542, 1358, 317, 9544, 9545, 9546, 9547, 9548, 9549, 9551, 6851, 7565, 9553, 9555, 365, 9554, 490, + 7266, 9557, 6002, 2035, 9558, 9559, 9561, 9566, 9568, 9574, 2402, 9576, 7053, 9562, 9565, 1459, 9563, 343, 317, 9564, 2134, 348, 380, 490, 9567, 9569, 317, + 9570, 9571, 9572, 9573, 9575, 9577, 317, 9578, 9580, 9582, 9584, 9587, 317, 6318, 9581, 363, 990, 363, 4943, 5891, 317, 9583, 317, 1109, 5793, 317, 317, + 9585, 345, 490, 317, 9586, 6415, 6382, 9589, 9606, 9611, 9612, 9624, 9625, 1020, 317, 9637, 6255, 1479, 9641, 6089, 9650, 363, 9590, 9591, 9596, 2627, 5399, + 9599, 9602, 9603, 5022, 9592, 9593, 9594, 9595, 9597, 317, 338, 412, 9598, 4980, 4984, 9600, 1160, 9601, 317, 2035, 317, 317, 317, 9604, 9605, 9607, 9608, + 6355, 317, 9609, 9609, 9610, 317, 9613, 9616, 9617, 317, 7403, 9614, 9615, 9618, 536, 8214, 9621, 9619, 9620, 1108, 1108, 317, 2829, 9622, 4965, 4280, 9623, + 317, 9626, 345, 350, 6294, 9627, 9631, 9635, 2387, 9628, 9629, 365, 9630, 490, 317, 317, 9632, 9634, 9633, 345, 317, 9636, 355, 514, 2187, 1588, 356, + 1325, 9638, 9639, 356, 5784, 317, 317, 9640, 317, 356, 596, 317, 9642, 363, 9645, 9643, 9644, 9646, 466, 9647, 9648, 9649, 362, 9651, 9652, 9654, 9658, + 9660, 9662, 9665, 317, 9668, 9671, 9675, 9676, 2271, 501, 9655, 317, 9656, 317, 9657, 356, 428, 9659, 317, 5896, 6204, 380, 7114, 6046, 9661, 317, 1999, + 427, 9663, 9664, 1160, 317, 382, 9666, 317, 9667, 9669, 1358, 317, 5223, 316, 317, 9670, 5897, 9672, 9673, 5809, 9674, 363, 1131, 404, 317, 437, 9677, + 9679, 2142, 9681, 9687, 9693, 490, 9697, 9700, 9702, 332, 317, 9680, 9682, 363, 7891, 317, 9683, 393, 9684, 5732, 9685, 9686, 317, 317, 9688, 2280, 9689, + 9692, 9690, 317, 9691, 317, 2317, 363, 2310, 9694, 9695, 9696, 317, 9698, 8611, 9699, 1325, 365, 9701, 380, 5447, 466, 9704, 9705, 6920, 317, 317, 332, + 539, 9706, 9707, 9709, 9710, 9712, 4591, 6394, 332, 9711, 9713, 381, 9715, 9721, 9731, 9737, 9747, 317, 2004, 9716, 2163, 9717, 9718, 9719, 9720, 9117, 380, + 343, 317, 6118, 1347, 9722, 9723, 2396, 9724, 9726, 2381, 2396, 5028, 9728, 317, 9730, 490, 345, 490, 7062, 9725, 5570, 363, 9727, 428, 7062, 9729, 356, + 466, 351, 317, 9732, 9733, 9734, 9735, 9736, 9738, 6409, 371, 489, 9739, 9740, 2381, 9741, 8937, 9742, 9746, 490, 357, 8337, 2134, 2067, 9325, 9743, 466, + 9744, 317, 9745, 6551, 2381, 9748, 9749, 332, 9750, 9751, 9757, 381, 9758, 9761, 317, 6551, 332, 9752, 9753, 9754, 9755, 9756, 317, 370, 9759, 2063, 9719, + 9760, 5570, 317, 1347, 9763, 9765, 9769, 9776, 9778, 9780, 9782, 9764, 9766, 9767, 9768, 1962, 9770, 317, 9771, 9774, 9775, 9772, 343, 3505, 317, 9773, 317, + 317, 317, 1331, 317, 317, 343, 317, 317, 317, 9777, 317, 317, 1020, 9779, 9781, 9783, 9785, 9787, 8301, 9793, 9795, 9817, 9819, 9828, 2022, 5662, 9858, + 9860, 9861, 9862, 1020, 9864, 9866, 9867, 651, 9786, 9788, 2163, 356, 9790, 9789, 9791, 9792, 9794, 6551, 9796, 490, 9797, 9807, 9816, 317, 9798, 9801, 672, + 9803, 9805, 490, 363, 345, 651, 9799, 9800, 9802, 9804, 317, 9806, 9808, 9810, 317, 317, 7590, 9809, 380, 345, 9811, 596, 9812, 9813, 9814, 9815, 5217, + 317, 9818, 5701, 317, 351, 392, 9820, 9826, 5828, 9821, 9822, 9823, 9824, 9825, 317, 9827, 317, 633, 362, 317, 6551, 558, 9829, 1347, 9837, 6409, 9840, + 4591, 9845, 9846, 9851, 427, 317, 9830, 9832, 9833, 9831, 9834, 9835, 317, 9836, 5447, 5113, 448, 5988, 9838, 9839, 345, 9841, 9842, 9843, 343, 9844, 350, + 362, 9847, 9848, 9849, 9850, 9852, 363, 9854, 9853, 317, 1347, 9855, 370, 317, 9856, 9857, 9859, 345, 490, 317, 317, 1060, 317, 4019, 516, 317, 9863, + 357, 6228, 883, 371, 317, 9865, 351, 381, 5217, 390, 9869, 9870, 332, 317, 9871, 317, 1459, 332, 590, 9872, 9877, 9873, 9874, 9875, 9876, 9878, 7776, + 9880, 9882, 9883, 317, 317, 490, 9881, 357, 332, 501, 317, 9884, 5926, 2381, 1325, 332, 8633, 2063, 9886, 9887, 9890, 390, 317, 5265, 1347, 9892, 363, 6486, 6817, 1358, 9893, 6388, 490, 343, 9894, 9895, 2883, 9898, 9902, 9911, 9915, 9950, 9989, 9995, 9998, 10001,10060,10077,10082,10087,10092,10095,10099,10126, - 10127,10128,10204,10280,10282,10284,9896, 4996, 9897, 9899, 9900, 9901, 949, 9903, 6402, 317, 365, 365, 317, 9904, 9906, 9907, 9908, 4925, 357, 9909, 9910, - 317, 317, 9905, 317, 2533, 317, 317, 536, 343, 317, 590, 9912, 428, 8948, 9914, 448, 317, 380, 448, 9913, 9916, 9918, 9926, 9939, 9940, 9942, 9948, - 404, 9917, 317, 365, 9919, 9924, 6466, 2537, 9920, 9923, 1347, 332, 5968, 9921, 466, 317, 317, 9922, 5226, 6382, 317, 9925, 9927, 6203, 9932, 427, 9938, - 3529, 9928, 317, 9929, 9930, 9931, 362, 9933, 317, 9934, 2108, 9935, 9936, 9937, 351, 350, 9941, 9943, 9944, 490, 8105, 9946, 5223, 9945, 9947, 9949, 9951, - 1112, 936, 866, 9954, 1442, 1943, 1276, 9957, 339, 9982, 9983, 9984, 9987, 9952, 9953, 1251, 3502, 945, 9955, 9956, 1266, 320, 1347, 1027, 9958, 9959, 9960, - 9962, 9965, 9966, 9973, 9976, 8047, 1370, 9978, 9979, 317, 7155, 936, 694, 9961, 9963, 9964, 9967, 9968, 637, 9969, 9971, 9970, 317, 9972, 9974, 9975, 9977, - 9980, 9981, 9985, 9986, 9988, 4984, 5608, 2539, 9990, 317, 9991, 2094, 9992, 5608, 9994, 990, 2271, 2537, 317, 332, 490, 9993, 9996, 1444, 9997, 9999, 565, - 550, 10000,949, 10002,10009,10015,10017,10019,10023,10024,10026,10028,10034,10042,350, 10045,1962, 10047,10049,10051,10057,317, 317, 10003,10008,2715, 317, - 350, 10004,10005,10006,10007,363, 356, 10010,448, 10011,9695, 10013,317, 8600, 4943, 10012,10014,7070, 404, 317, 10016,6696, 6696, 10018,370, 10020,317, - 1160, 5037, 10021,10022,1065, 6598, 551, 10025,7073, 9436, 10027,390, 10029,404, 10030,372, 10031,10032,10033,317, 10035,10036,10040,384, 10041,317, 317, + 10127,10128,10204,10280,10282,10284,9896, 4996, 9897, 9899, 9900, 9901, 949, 9903, 6402, 317, 365, 365, 317, 9904, 9906, 9907, 9908, 4925, 357, 9909, 9910, + 317, 317, 9905, 317, 2533, 317, 317, 536, 343, 317, 590, 9912, 428, 8948, 9914, 448, 317, 380, 448, 9913, 9916, 9918, 9926, 9939, 9940, 9942, 9948, + 404, 9917, 317, 365, 9919, 9924, 6466, 2537, 9920, 9923, 1347, 332, 5968, 9921, 466, 317, 317, 9922, 5226, 6382, 317, 9925, 9927, 6203, 9932, 427, 9938, + 3529, 9928, 317, 9929, 9930, 9931, 362, 9933, 317, 9934, 2108, 9935, 9936, 9937, 351, 350, 9941, 9943, 9944, 490, 8105, 9946, 5223, 9945, 9947, 9949, 9951, + 1112, 936, 866, 9954, 1442, 1943, 1276, 9957, 339, 9982, 9983, 9984, 9987, 9952, 9953, 1251, 3502, 945, 9955, 9956, 1266, 320, 1347, 1027, 9958, 9959, 9960, + 9962, 9965, 9966, 9973, 9976, 8047, 1370, 9978, 9979, 317, 7155, 936, 694, 9961, 9963, 9964, 9967, 9968, 637, 9969, 9971, 9970, 317, 9972, 9974, 9975, 9977, + 9980, 9981, 9985, 9986, 9988, 4984, 5608, 2539, 9990, 317, 9991, 2094, 9992, 5608, 9994, 990, 2271, 2537, 317, 332, 490, 9993, 9996, 1444, 9997, 9999, 565, + 550, 10000,949, 10002,10009,10015,10017,10019,10023,10024,10026,10028,10034,10042,350, 10045,1962, 10047,10049,10051,10057,317, 317, 10003,10008,2715, 317, + 350, 10004,10005,10006,10007,363, 356, 10010,448, 10011,9695, 10013,317, 8600, 4943, 10012,10014,7070, 404, 317, 10016,6696, 6696, 10018,370, 10020,317, + 1160, 5037, 10021,10022,1065, 6598, 551, 10025,7073, 9436, 10027,390, 10029,404, 10030,372, 10031,10032,10033,317, 10035,10036,10040,384, 10041,317, 317, 4943, 10037,637, 10038,10039,633, 363, 10043,10044,5628, 343, 10046,343, 343, 317, 10048,10050,5684, 7405, 9869, 317, 10052,10056,317, 10053,381, 10054, - 10055,428, 10058,10059,356, 545, 10061,1347, 2156, 10071,317, 10072,10073,8431, 317, 317, 10074,10062,317, 317, 332, 10065,8636, 10063,10064,10066,317, - 317, 381, 8281, 317, 10067,10068,10069,10070,590, 2142, 10075,10076,10078,10079,10080,4952, 501, 317, 10081,2553, 317, 3023, 317, 317, 317, 317, 317, + 10055,428, 10058,10059,356, 545, 10061,1347, 2156, 10071,317, 10072,10073,8431, 317, 317, 10074,10062,317, 317, 332, 10065,8636, 10063,10064,10066,317, + 317, 381, 8281, 317, 10067,10068,10069,10070,590, 2142, 10075,10076,10078,10079,10080,4952, 501, 317, 10081,2553, 317, 3023, 317, 317, 317, 317, 317, 605, 9575, 10083,10084,10085,317, 6854, 1060, 404, 381, 317, 10086,10088,317, 10089,8265, 10090,10091,363, 345, 317, 10093,351, 10094,565, 9623, 10096, 490, 10097,10098,5807, 10100,501, 10106,10110,10115,10123,10125,2537, 10101,5241, 9993, 10102,10104,10103,2272, 345, 10105,339, 4268, 3023, 380, 1160, 10107, - 317, 10108,6599, 317, 351, 10109,3505, 10111,10112,10113,10114,10116,10117,428, 543, 10118,5447, 10121,4268, 10119,356, 10120,10122,10124,363, 439, 936, - 2553, 2178, 2845, 6228, 1184, 10129,10140,10141,10156,10160,10165,10182,10186,10190,317, 10198,317, 10199,10202,10203,10130,317, 380, 317, 10132,7035, 8217, - 10134,10135,10139,1347, 10131,10133,4267, 356, 5055, 10136,317, 10137,10138,7764, 317, 5840, 384, 1194, 349, 317, 10142,10143,10150,10151,10154,1347, 363, - 5213, 490, 10144,10145,9067, 10146,10147,10148,317, 317, 1347, 317, 10149,1871, 6203, 5487, 10152,356, 10153,317, 382, 5055, 6496, 10155,5464, 466, 5399, + 317, 10108,6599, 317, 351, 10109,3505, 10111,10112,10113,10114,10116,10117,428, 543, 10118,5447, 10121,4268, 10119,356, 10120,10122,10124,363, 439, 936, + 2553, 2178, 2845, 6228, 1184, 10129,10140,10141,10156,10160,10165,10182,10186,10190,317, 10198,317, 10199,10202,10203,10130,317, 380, 317, 10132,7035, 8217, + 10134,10135,10139,1347, 10131,10133,4267, 356, 5055, 10136,317, 10137,10138,7764, 317, 5840, 384, 1194, 349, 317, 10142,10143,10150,10151,10154,1347, 363, + 5213, 490, 10144,10145,9067, 10146,10147,10148,317, 317, 1347, 317, 10149,1871, 6203, 5487, 10152,356, 10153,317, 382, 5055, 6496, 10155,5464, 466, 5399, 2510, 514, 10157,10158,10159,381, 10161,10162,10163,10164,10166,10170,10173,10175,10180,2156, 10167,10168,10169,10171,10172,466, 5399, 317, 10174,317, 10176, 10177,10178,10179,317, 10181,6042, 356, 5395, 317, 10183,541, 10184,10185,10187,10188,10189,1160, 6916, 10191,10197,10192,10193,6763, 10194,10196,5447, 10195, 382, 5055, 7327, 316, 1347, 990, 10200,489, 10201,5447, 466, 5365, 5708, 7372, 466, 4045, 7694, 10205,7055, 10210,10215,10218,10223,317, 10224,10239,10277, 6089, 2537, 362, 1588, 10206,490, 10209,2271, 10207,10208,317, 489, 545, 343, 10211,10212,10213,317, 7328, 317, 317, 345, 10214,1160, 10216,10217,10219, - 10222,317, 10220,10221,10225,10226,10235,10237,10227,10230,10233,10228,10229,356, 8553, 3854, 10231,10232,10234,490, 10236,10238,10240,5687, 10247,10249,1060, - 317, 1266, 10241,490, 10243,5561, 317, 317, 317, 10244,10242,10245,10246,1358, 10248,427, 317, 10250,10255,10256,10258,10261,10262,10270,1160, 10276,362, + 10222,317, 10220,10221,10225,10226,10235,10237,10227,10230,10233,10228,10229,356, 8553, 3854, 10231,10232,10234,490, 10236,10238,10240,5687, 10247,10249,1060, + 317, 1266, 10241,490, 10243,5561, 317, 317, 317, 10244,10242,10245,10246,1358, 10248,427, 317, 10250,10255,10256,10258,10261,10262,10270,1160, 10276,362, 10251,370, 10252,10253,10254,10257,5866, 10259,10260,2510, 521, 317, 317, 363, 6525, 10263,10268,10264,10265,10266,317, 10267,10269,10271,10272,10273,10274, - 10275,380, 412, 317, 6471, 10278,343, 10279,490, 10281,6409, 317, 5226, 350, 10283,2348, 10285,10286,10296,10300,10287,10292,10288,10289,10290,10291,317, + 10275,380, 412, 317, 6471, 10278,343, 10279,490, 10281,6409, 317, 5226, 350, 10283,2348, 10285,10286,10296,10300,10287,10292,10288,10289,10290,10291,317, 10293,10294,5640, 10295,10297,10298,10299,10301,10305,10307,10322,10330,10332,10335,10363,10367,10369,10383,1597, 10390,7085, 10396,10415,10417,380, 345, 10468, - 10470,10472,10302,10303,10304,10306,8926, 10308,10311,10313,10318,10320,3751, 10321,5241, 317, 10309,10310,10312,2533, 10314,362, 10315,10316,10317,10319,317, + 10470,10472,10302,10303,10304,10306,8926, 10308,10311,10313,10318,10320,3751, 10321,5241, 317, 10309,10310,10312,2533, 10314,362, 10315,10316,10317,10319,317, 10323,10329,317, 10324,10327,10328,2022, 332, 10325,10326,2551, 404, 370, 10331,393, 317, 10333,10334,637, 317, 317, 2537, 332, 5428, 10336,10346,10355, 9938, 10362,317, 10337,7035, 343, 10340,317, 10345,10338,10339,490, 362, 10341,317, 10342,10343,10344,345, 479, 10347,3966, 10348,10352,317, 10349,10351, 5419, 370, 317, 317, 10350,3504, 2022, 10353,10354,404, 10356,10360,10357,1347, 10358,10359,9857, 5343, 317, 10361,5105, 343, 317, 317, 10364,317, 10365, - 362, 10366,5570, 345, 490, 390, 390, 6568, 10368,5994, 10370,10378,317, 10381,345, 10371,10377,10372,1160, 10373,10374,10375,490, 10376,317, 317, 317, + 362, 10366,5570, 345, 490, 390, 390, 6568, 10368,5994, 10370,10378,317, 10381,345, 10371,10377,10372,1160, 10373,10374,10375,490, 10376,317, 317, 317, 10379,317, 10380,10382,4984, 380, 10384,317, 343, 10385,10386,10387,10388,10389,1347, 5732, 1459, 317, 490, 4564, 10391,10394,5746, 317, 317, 10392,10393, 317, 380, 10395,10397,10398,10399,10409,363, 390, 7045, 5241, 345, 590, 5105, 10400,8456, 427, 10401,10402,10403,10404,10405,10406,10407,10408,10410,10412, - 10413,10411,4591, 5201, 10414,2272, 317, 10416,365, 332, 2078, 10418,10427,10443,10444,10448,10450,10455,10457,10466,10467,317, 8301, 10419,4249, 10423,6387, + 10413,10411,4591, 5201, 10414,2272, 317, 10416,365, 332, 2078, 10418,10427,10443,10444,10448,10450,10455,10457,10466,10467,317, 8301, 10419,4249, 10423,6387, 10425,1325, 1230, 10420,10421,5447, 466, 5399, 317, 10422,466, 317, 10424,410, 350, 356, 466, 5399, 317, 1526, 10426,10428,10431,10432,10441,5534, 10429, 4949, 10430,7063, 10433,10436,10438,10434,9109, 466, 317, 10435,10437,9852, 343, 10439,10440,317, 1325, 404, 10442,404, 7590, 448, 10445,10446,317, 10447, 2219, 5492, 8021, 10449,10451,10452,317, 4980, 10453,10454,371, 10456,10458,10462,10459,10460,356, 10461,351, 317, 382, 5055, 6440, 10463,990, 5226, 10464, 10465,410, 5447, 5847, 428, 2063, 349, 428, 428, 10469,356, 371, 6568, 520, 10471,8948, 4738, 2381, 10473,10483,10500,10535,10539,10544,10577,2381, 10579, 10582,10587,10593,10597,10599,10620,10658,10756,10759,10762,10767,10769,10474,10476,343, 10477,10479,363, 317, 10475,343, 370, 8431, 10478,317, 10480,10481, - 317, 10482,317, 6195, 345, 10484,10490,6954, 1020, 10495,10485,10488,10486,10487,10489,6855, 10491,10492,370, 10493,10494,351, 10496,10497,10498,10499,466, + 317, 10482,317, 6195, 345, 10484,10490,6954, 1020, 10495,10485,10488,10486,10487,10489,6855, 10491,10492,370, 10493,10494,351, 10496,10497,10498,10499,466, 317, 317, 2510, 10501,10504,10507,2022, 10532,10534,10502,363, 317, 317, 10503,4591, 370, 10505,317, 9244, 10506,620, 621, 10508,10509,10510,10513,10524, - 1011, 10526,1999, 6021, 10511,10512,1347, 490, 10514,317, 7448, 10253,10517,10518,10520,10521,10515,10516,10519,10522,10523,317, 10525,356, 10527,10529,317, - 317, 382, 10528,10530,10531,317, 317, 317, 5742, 317, 10533,5793, 317, 404, 466, 317, 10536,5626, 10537,10538,10540,2275, 5517, 10541,10542,10543,317, - 10545,2058, 10548,343, 10552,10554,10558,10563,2142, 10546,10547,10471,317, 10549,2948, 10551,10550,362, 370, 10553,317, 7657, 10555,10556,10557,5225, 356, - 466, 317, 10559,10562,10560,10561,317, 10564,10565,10566,10571,10572,681, 317, 10573,317, 10574,5926, 404, 345, 10576,10567,10568,10569,10570,1109, 343, - 10575,317, 317, 5419, 317, 10578,10580,10581,317, 7949, 317, 10583,5626, 10584,10585,317, 317, 10586,345, 351, 9914, 317, 10588,10589,10591,343, 4984, - 5483, 10590,10592,2298, 317, 10594,317, 7976, 412, 351, 10595,2156, 10596,317, 317, 10598,2022, 10600,10603,596, 10607,10614,10618,357, 10601,317, 317, + 1011, 10526,1999, 6021, 10511,10512,1347, 490, 10514,317, 7448, 10253,10517,10518,10520,10521,10515,10516,10519,10522,10523,317, 10525,356, 10527,10529,317, + 317, 382, 10528,10530,10531,317, 317, 317, 5742, 317, 10533,5793, 317, 404, 466, 317, 10536,5626, 10537,10538,10540,2275, 5517, 10541,10542,10543,317, + 10545,2058, 10548,343, 10552,10554,10558,10563,2142, 10546,10547,10471,317, 10549,2948, 10551,10550,362, 370, 10553,317, 7657, 10555,10556,10557,5225, 356, + 466, 317, 10559,10562,10560,10561,317, 10564,10565,10566,10571,10572,681, 317, 10573,317, 10574,5926, 404, 345, 10576,10567,10568,10569,10570,1109, 343, + 10575,317, 317, 5419, 317, 10578,10580,10581,317, 7949, 317, 10583,5626, 10584,10585,317, 317, 10586,345, 351, 9914, 317, 10588,10589,10591,343, 4984, + 5483, 10590,10592,2298, 317, 10594,317, 7976, 412, 351, 10595,2156, 10596,317, 317, 10598,2022, 10600,10603,596, 10607,10614,10618,357, 10601,317, 317, 10602,354, 10093,10604,10605,317, 345, 10606,4984, 4984, 317, 345, 10608,8011, 10610,380, 10611,10609,317, 10408,350, 332, 10612,10613,10615,8451, 10616, 10617,317, 10619,10621,10624,10627,317, 10629,5032, 10630,10633,10634,10637,10638,10622,479, 317, 10623,10625,10626,10628,10631,370, 317, 10632,10635,10636, - 345, 5727, 363, 356, 10639,501, 10642,363, 10645,380, 317, 10640,10641,357, 5200, 10626,317, 380, 10643,637, 1300, 317, 10644,673, 317, 317, 316, + 345, 5727, 363, 356, 10639,501, 10642,363, 10645,380, 317, 10640,10641,357, 5200, 10626,317, 380, 10643,637, 1300, 317, 10644,673, 317, 317, 316, 10646,8214, 10656,10647,5241, 10648,317, 10649,10650,6956, 317, 10651,10652,10653,10654,10655,6324, 10657,10659,10660,10663,10681,362, 10682,10752,10753,10661, - 317, 7654, 10662,10664,10665,10671,351, 3854, 10666,317, 10667,10668,10669,10670,397, 418, 6435, 10672,356, 10673,7821, 380, 382, 10674,10675,10680,5225, + 317, 7654, 10662,10664,10665,10671,351, 3854, 10666,317, 10667,10668,10669,10670,397, 418, 6435, 10672,356, 10673,7821, 380, 382, 10674,10675,10680,5225, 1325, 466, 10676,596, 317, 317, 10677,3031, 10678,10679,317, 317, 7682, 10683,10689,10697,10712,10716,10717,10721,10725,10727,10739,10743,10748,10749,10751, 10684,10685,10686,10687,10688,462, 343, 10690,10696,345, 10691,10692,10693,10694,10695,10698,10700,10704,10519,10706,10710,317, 10699,317, 10701,10702,10703, - 10705,10707,10708,10709,10711,370, 5746, 9573, 10713,10715,10714,356, 10718,867, 10719,10720,10722,10723,10724,10726,10728,10731,317, 2509, 10729,317, 5447, - 10730,363, 6172, 382, 363, 427, 10732,10735,3031, 10733,10734,10736,10737,10738,10740,427, 10741,317, 10742,7834, 317, 10744,10746,10747,5201, 10745,3869, - 489, 7322, 3075, 10750,5570, 6859, 317, 2142, 10754,317, 10755,10757,380, 10758,10760,10761,349, 10763,10764,351, 10765,317, 10766,8544, 363, 10768,3999, - 381, 10770,2067, 10772,10775,10777,5611, 10799,10802,10829,10830,10845,10846,10856,10864,10773,10774,10776,10778,10780,10790,10795,10797,490, 10779,10781,7035, + 10705,10707,10708,10709,10711,370, 5746, 9573, 10713,10715,10714,356, 10718,867, 10719,10720,10722,10723,10724,10726,10728,10731,317, 2509, 10729,317, 5447, + 10730,363, 6172, 382, 363, 427, 10732,10735,3031, 10733,10734,10736,10737,10738,10740,427, 10741,317, 10742,7834, 317, 10744,10746,10747,5201, 10745,3869, + 489, 7322, 3075, 10750,5570, 6859, 317, 2142, 10754,317, 10755,10757,380, 10758,10760,10761,349, 10763,10764,351, 10765,317, 10766,8544, 363, 10768,3999, + 381, 10770,2067, 10772,10775,10777,5611, 10799,10802,10829,10830,10845,10846,10856,10864,10773,10774,10776,10778,10780,10790,10795,10797,490, 10779,10781,7035, 10784,10782,10783,10785,4810, 317, 10786,10787,10788,10789,10791,550, 10792,10793,490, 6240, 317, 10794,1347, 317, 10796,514, 317, 317, 10798,1881, 10800, - 10801,317, 5238, 7055, 317, 404, 867, 10803,10809,10810,10816,10825,10826,317, 10828,317, 351, 345, 10804,10806,10805,10807,5570, 317, 10808,317, 2004, - 317, 317, 7657, 10811,10813,5325, 2163, 10814,2156, 10812,466, 10815,2110, 10817,10818,10819,5159, 10821,332, 10822,10823,5363, 10824,2108, 384, 380, 8484, - 10820,380, 10820,5328, 317, 5221, 10827,10831,10834,5324, 317, 10835,10837,10838,10839,10841,2116, 4980, 10843,1109, 317, 5226, 10832,370, 10833,7606, 365, + 10801,317, 5238, 7055, 317, 404, 867, 10803,10809,10810,10816,10825,10826,317, 10828,317, 351, 345, 10804,10806,10805,10807,5570, 317, 10808,317, 2004, + 317, 317, 7657, 10811,10813,5325, 2163, 10814,2156, 10812,466, 10815,2110, 10817,10818,10819,5159, 10821,332, 10822,10823,5363, 10824,2108, 384, 380, 8484, + 10820,380, 10820,5328, 317, 5221, 10827,10831,10834,5324, 317, 10835,10837,10838,10839,10841,2116, 4980, 10843,1109, 317, 5226, 10832,370, 10833,7606, 365, 9200, 10836,2146, 404, 4965, 5392, 490, 10840,350, 317, 10842,10844,490, 345, 5590, 317, 10847,10849,10850,10447,10853,1526, 10848,4268, 6294, 317, 10851, - 10852,356, 466, 317, 373, 5190, 317, 6195, 10854,10855,619, 10857,2117, 10858,10863,554, 317, 4055, 10859,10860,10861,10862,426, 490, 351, 10865,2631, - 10866,10867,10869,10871,2275, 10881,10886,10891,390, 5590, 10892,10893,10898,10899,10900,10909,10910,10912,10913,2058, 10870,345, 10872,10873,10874,5223, 365, + 10852,356, 466, 317, 373, 5190, 317, 6195, 10854,10855,619, 10857,2117, 10858,10863,554, 317, 4055, 10859,10860,10861,10862,426, 490, 351, 10865,2631, + 10866,10867,10869,10871,2275, 10881,10886,10891,390, 5590, 10892,10893,10898,10899,10900,10909,10910,10912,10913,2058, 10870,345, 10872,10873,10874,5223, 365, 1992, 10879,390, 565, 1347, 10875,10876,317, 356, 10877,317, 10878,10880,6497, 10882,10883,317, 10884,10885,317, 566, 10887,10888,10889,10890,10894,10895, 10896,10897,10877,514, 10901,10907,10908,382, 10902,10903,10904,10905,10906,530, 317, 10911,2060, 380, 10914,317, 5926, 10916,2024, 10919,10923,362, 10924, - 5331, 10927,427, 317, 10917,362, 317, 343, 10918,6046, 356, 356, 5701, 10920,382, 10921,317, 8205, 317, 10922,9170, 2272, 5956, 10925,9853, 10926,428, + 5331, 10927,427, 317, 10917,362, 317, 343, 10918,6046, 356, 356, 5701, 10920,382, 10921,317, 8205, 317, 10922,9170, 2272, 5956, 10925,9853, 10926,428, 10928,362, 363, 10930,565, 10940,10944,10947,3648, 619, 10949,10952,10958,10960,10961,10963,10964,10965,10966,10976,10931,10932,490, 5611, 10934,317, 10935, 10937,10938,317, 339, 2415, 10933,317, 490, 363, 10936,317, 490, 10939,10941,5851, 10942,10943,10945,363, 2116, 317, 10946,343, 10948,1459, 10950,10951, - 317, 10953,466, 350, 10955,10956,10957,317, 10954,7055, 2024, 5809, 551, 363, 10959,439, 345, 4952, 10962,490, 317, 367, 574, 367, 1347, 5154, 404, + 317, 10953,466, 350, 10955,10956,10957,317, 10954,7055, 2024, 5809, 551, 363, 10959,439, 345, 4952, 10962,490, 317, 367, 574, 367, 1347, 5154, 404, 965, 317, 501, 317, 362, 317, 365, 10967,10971,332, 10974,10968,10969,10970,10972,10973,10975,10977,10981,317, 10978,10979,10980,10982,10984,10987,11000, - 11001,11007,11018,11020,11021,11027,11029,365, 11032,11036,11039,11041,11047,11053,11056,11060,10985,10986,10988,565, 10989,10992,10995,10996,10998,10999,2348, - 317, 10990,10991,381, 10993,10994,10997,5079, 1044, 5138, 362, 633, 380, 428, 428, 1481, 11002,2035, 11003,11004,11005,11006,5608, 427, 317, 11008,5608, + 11001,11007,11018,11020,11021,11027,11029,365, 11032,11036,11039,11041,11047,11053,11056,11060,10985,10986,10988,565, 10989,10992,10995,10996,10998,10999,2348, + 317, 10990,10991,381, 10993,10994,10997,5079, 1044, 5138, 362, 633, 380, 428, 428, 1481, 11002,2035, 11003,11004,11005,11006,5608, 427, 317, 11008,5608, 11009,1347, 371, 11014,11010,11011,361, 11012,11013,11015,1266, 11016,11017,11019,351, 2360, 343, 11022,11023,11026,317, 11024,11025,11028,363, 11030,11031, 11033,11035,317, 11034,401, 11037,2081, 11038,317, 11040,433, 11042,11043,11044,949, 11045,11046,11048,362, 427, 11050,11049,317, 11051,11052,317, 11054, 11055,490, 343, 490, 945, 351, 2035, 365, 11057,11058,11059,11061,351, 343, 6834, 11063,11066,317, 332, 11062,317, 5687, 2322, 317, 11064,11065,11067, 11068,11072,11079,11080,11090,4375, 11098,11100,24, 12380,12396,12404,29, 13444,13446,13450,34, 14242,14264,36, 14723,14747,38, 15692,40, 16536,16541, 46, 17192,9702, 17205,17207,17271,2171, 2351, 2553, 11069,11070,11071,11073,11074,356, 11075,11076,11077,11078,4873, 4797, 1358, 427, 1597, 7178, 11081,11082, 2279, 11084,11087,7689, 350, 350, 11083,11085,11086,317, 11088,11089,11091,11095,11096,11092,11093,11094,11097,11099,11101,11102,11103,11104,11105,11109,11111, - 11118,11170,11281,11348,11355,11358,11399,11420,11455,11465,25, 11670,26, 11811,11814,11823,27, 28, 12185,12267,12324,12328,12333,12336,12367,11106,317, + 11118,11170,11281,11348,11355,11358,11399,11420,11455,11465,25, 11670,26, 11811,11814,11823,27, 28, 12185,12267,12324,12328,12333,12336,12367,11106,317, 11107,11108,11110,356, 317, 371, 11112,332, 11115,317, 11116,317, 11117,4965, 11113,11114,11119,11125,11129,11130,11138,10487,11148,883, 11149,11150,11151, 11152,11153,949, 317, 365, 317, 11120,11122,5891, 11123,489, 11121,317, 11124,11126,380, 11127,11128,317, 317, 390, 5223, 7419, 466, 490, 384, 11131, 651, 633, 3284, 11132,11133,11136,11137,1160, 574, 317, 317, 11134,11135,7285, 11139,1347, 5624, 11140,11142,2272, 11145,4925, 11147,317, 1358, 317, 11141, 11143,2067, 317, 3284, 11144,11146,1913, 317, 2163, 5055, 363, 490, 317, 1913, 356, 637, 5825, 8300, 637, 633, 371, 11154,11156,11158,11159,11160,11163, - 466, 332, 11164,7878, 10855,11167,565, 551, 8355, 11155,11157,11161,3366, 11162,11165,11166,343, 317, 317, 317, 8214, 381, 11168,11169,11171,11174,2549, + 466, 332, 11164,7878, 10855,11167,565, 551, 8355, 11155,11157,11161,3366, 11162,11165,11166,343, 317, 317, 317, 8214, 381, 11168,11169,11171,11174,2549, 11184,11201,11206,362, 11264,317, 11267,11278,317, 11280,317, 380, 11172,317, 332, 11173,5687, 490, 11175,11182,11183,345, 11176,317, 11181,11177,11178, - 11179,11180,317, 6050, 11185,5561, 11187,11191,11192,11193,11195,350, 11197,11199,11200,345, 1325, 11186,317, 490, 11188,5223, 350, 381, 11189,11190,2610, + 11179,11180,317, 6050, 11185,5561, 11187,11191,11192,11193,11195,350, 11197,11199,11200,345, 1325, 11186,317, 490, 11188,5223, 350, 381, 11189,11190,2610, 317, 1459, 5836, 317, 11194,5663, 11196,11198,2108, 3007, 317, 9878, 578, 390, 11202,317, 6207, 332, 317, 11203,11204,11205,317, 11207,11213,11216,11220, 11223,11225,11230,3999, 11233,11236,11237,11238,11242,11243,11254,11258,11259,11263,11208,11212,381, 11209,11210,11211,551, 343, 11214,11215,6525, 381, 11217, - 2601, 2146, 11218,11219,6736, 317, 11221,1347, 317, 317, 317, 11222,11224,1597, 578, 5717, 2108, 11226,11227,11228,11229,11231,11232,4591, 317, 343, 393, + 2601, 2146, 11218,11219,6736, 317, 11221,1347, 317, 317, 317, 11222,11224,1597, 578, 5717, 2108, 11226,11227,11228,11229,11231,11232,4591, 317, 343, 393, 389, 11234,11235,439, 471, 343, 317, 396, 345, 11239,9298, 11240,11241,2510, 466, 317, 11244,2631, 2261, 2260, 11159,11246,11245,11247,11250,11251,11248, 343, 11249,351, 466, 11252,11253,381, 2108, 11255,11256,11257,345, 1347, 317, 11260,9822, 11261,2509, 11262,11265,11266,363, 1358, 11268,2272, 5406, 11269, 11270,5105, 11271,427, 11272,11276,11273,11274,11275,317, 433, 381, 11277,11279,317, 1020, 317, 11282,11283,11299,2631, 11302,11305,11311,11313,11317,11319, 11325,11326,11328,11333,11338,11340,11343,11345,317, 11346,354, 651, 11284,11285,11289,11290,11292,11295,11296,317, 11298,365, 466, 426, 11286,11287,11288, - 11291,11293,2035, 11294,11297,365, 1160, 11300,317, 11301,6228, 633, 6996, 317, 317, 11303,2022, 11304,371, 2022, 1347, 381, 11144,11306,11309,317, 317, + 11291,11293,2035, 11294,11297,365, 1160, 11300,317, 11301,6228, 633, 6996, 317, 317, 11303,2022, 11304,371, 2022, 1347, 381, 11144,11306,11309,317, 317, 2108, 11307,11308,11310,11312,2219, 390, 11314,11316,2022, 370, 317, 11315,317, 5223, 317, 356, 466, 317, 1160, 382, 4564, 11318,317, 317, 6937, 11320, - 5120, 11321,11322,11323,11324,5181, 10329,11327,370, 384, 317, 317, 3125, 363, 11329,11331,11330,332, 332, 11332,11334,11337,11335,11336,11339,6240, 6278, - 351, 11341,11342,1526, 2533, 11344,317, 2381, 490, 11347,371, 11349,351, 11350,380, 11351,11352,11354,1108, 1109, 317, 9672, 2566, 1109, 4738, 11353,362, + 5120, 11321,11322,11323,11324,5181, 10329,11327,370, 384, 317, 317, 3125, 363, 11329,11331,11330,332, 332, 11332,11334,11337,11335,11336,11339,6240, 6278, + 351, 11341,11342,1526, 2533, 11344,317, 2381, 490, 11347,371, 11349,351, 11350,380, 11351,11352,11354,1108, 1109, 317, 9672, 2566, 1109, 4738, 11353,362, 427, 6204, 317, 317, 3648, 2298, 11356,490, 11357,317, 363, 5717, 551, 2322, 11359,370, 11363,11368,11369,11378,11382,11383,11384,11386,11389,11390,11391, 11395,11397,11398,11360,317, 11361,389, 11362,11364,11367,317, 11365,11366,2369, 6420, 5223, 990, 11370,11374,11377,317, 317, 317, 11371,5324, 501, 10820, - 11372,11373,1347, 11375,11376,317, 11379,11381,362, 11380,5120, 11365,2163, 2110, 365, 5836, 490, 370, 7035, 11385,11387,6620, 317, 6402, 380, 11388,332, + 11372,11373,1347, 11375,11376,317, 11379,11381,362, 11380,5120, 11365,2163, 2110, 365, 5836, 490, 370, 7035, 11385,11387,6620, 317, 6402, 380, 11388,332, 382, 317, 332, 5890, 8649, 476, 11392,363, 317, 11393,11394,2211, 370, 11396,605, 381, 317, 2610, 332, 2326, 11400,343, 11409,11410,11411,11412,11414, - 5423, 11415,317, 11419,11401,11403,11405,5120, 490, 11342,11406,1347, 11402,11404,1347, 362, 11124,381, 11407,11408,351, 9938, 317, 11413,351, 5644, 501, + 5423, 11415,317, 11419,11401,11403,11405,5120, 490, 11342,11406,1347, 11402,11404,1347, 362, 11124,381, 11407,11408,351, 9938, 317, 11413,351, 5644, 501, 11416,317, 343, 11417,317, 317, 10058,317, 11418,5328, 11421,11423,11424,11425,317, 590, 11427,11429,1109, 11441,11447,11448,11452,11453,1109, 11454,11422, - 11426,380, 11428,11430,662, 11431,11433,11435,11440,317, 317, 332, 5238, 356, 317, 317, 317, 317, 11432,637, 8248, 317, 633, 317, 317, 11434,1992, + 11426,380, 11428,11430,662, 11431,11433,11435,11440,317, 317, 332, 5238, 356, 317, 317, 317, 317, 11432,637, 8248, 317, 633, 317, 317, 11434,1992, 2391, 11436,11438,11439,317, 11437,5943, 317, 1345, 317, 4268, 551, 11442,11443,11444,317, 350, 427, 11445,11446,427, 317, 1347, 11449,1347, 332, 11451, 11450,390, 501, 1345, 317, 2022, 363, 501, 5464, 317, 466, 350, 317, 317, 11456,348, 371, 11457,332, 11458,11461,2351, 11462,490, 2348, 6763, 11459, - 11460,11463,11464,11466,11470,11474,11478,11479,11480,5835, 5120, 11482,11483,11467,11468,317, 2084, 2510, 351, 11469,317, 11471,5213, 317, 11472,6707, 3987, - 317, 370, 574, 317, 596, 2066, 362, 11473,5037, 317, 11475,11476,11477,6334, 317, 382, 345, 1881, 2381, 7866, 317, 427, 11481,370, 439, 5120, 7785, + 11460,11463,11464,11466,11470,11474,11478,11479,11480,5835, 5120, 11482,11483,11467,11468,317, 2084, 2510, 351, 11469,317, 11471,5213, 317, 11472,6707, 3987, + 317, 370, 574, 317, 596, 2066, 362, 11473,5037, 317, 11475,11476,11477,6334, 317, 382, 345, 1881, 2381, 7866, 317, 427, 11481,370, 439, 5120, 7785, 317, 590, 362, 490, 11484,1020, 11485,11486,11512,11515,11523,11549,11561,11563,11565,11576,11579,11624,2163, 11628,965, 11637,11638,11641,11655,11662,11664, - 6326, 11666,427, 11487,11489,11490,11491,11493,317, 365, 11494,11500,317, 11502,317, 8926, 11506,11511,317, 1347, 11488,7192, 6231, 6975, 317, 11492,348, - 350, 11495,6231, 11496,11497,11498,11499,11501,11503,11505,3988, 3529, 11504,2271, 9522, 317, 332, 317, 5439, 1588, 365, 11507,11508,11509,11510,345, 345, + 6326, 11666,427, 11487,11489,11490,11491,11493,317, 365, 11494,11500,317, 11502,317, 8926, 11506,11511,317, 1347, 11488,7192, 6231, 6975, 317, 11492,348, + 350, 11495,6231, 11496,11497,11498,11499,11501,11503,11505,3988, 3529, 11504,2271, 9522, 317, 332, 317, 5439, 1588, 365, 11507,11508,11509,11510,345, 345, 4984, 11513,9699, 317, 11514,11516,11517,11519,5828, 11520,11521,867, 11518,10943,3987, 11522,5201, 489, 317, 11524,11531,11089,11540,362, 2571, 11543,11545, 11547,11548,7565, 11525,11527,396, 11526,867, 11528,11529,332, 11530,11532,6402, 11534,11536,317, 11533,9699, 11535,11537,11538,11539,2845, 343, 317, 11541, 11542,2222, 317, 317, 371, 5517, 11544,317, 317, 6021, 11546,317, 371, 990, 343, 7386, 317, 317, 317, 5890, 5684, 363, 2330, 363, 2609, 11550,11554, - 11556,574, 490, 317, 11559,11551,11552,8431, 11553,11555,11557,11558,317, 7273, 11560,2590, 317, 11562,11564,479, 363, 11566,11567,11568,11572,11573,348, + 11556,574, 490, 317, 11559,11551,11552,8431, 11553,11555,11557,11558,317, 7273, 11560,2590, 317, 11562,11564,479, 363, 11566,11567,11568,11572,11573,348, 345, 317, 11569,11570,11571,393, 351, 317, 317, 11574,11575,2178, 7273, 5055, 426, 11577,317, 363, 317, 345, 317, 11578,317, 6228, 11580,3236, 11586, - 11598,11599,11608,11609,11614,11618,11620,2108, 966, 11621,1100, 2815, 11581,11582,317, 11583,11585,5223, 332, 9623, 2222, 370, 317, 343, 11584,2272, 2272, + 11598,11599,11608,11609,11614,11618,11620,2108, 966, 11621,1100, 2815, 11581,11582,317, 11583,11585,5223, 332, 9623, 2222, 370, 317, 343, 11584,2272, 2272, 317, 2086, 317, 11587,11589,11592,11597,317, 317, 1109, 317, 11588,2317, 2271, 317, 651, 11590,317, 11591,11593,345, 11594,11595,11596,317, 5611, 11600, - 317, 11601,380, 6163, 651, 11602,11604,2222, 11607,11603,11605,11606,5663, 351, 390, 317, 317, 11610,11613,317, 1358, 11611,317, 356, 11612,317, 9865, - 11615,11617,11616,8178, 11619,6228, 317, 384, 2679, 385, 317, 404, 317, 6195, 11622,2035, 11623,363, 2022, 343, 11625,9450, 351, 11627,317, 11626,363, + 317, 11601,380, 6163, 651, 11602,11604,2222, 11607,11603,11605,11606,5663, 351, 390, 317, 317, 11610,11613,317, 1358, 11611,317, 356, 11612,317, 9865, + 11615,11617,11616,8178, 11619,6228, 317, 384, 2679, 385, 317, 404, 317, 6195, 11622,2035, 11623,363, 2022, 343, 11625,9450, 351, 11627,317, 11626,363, 11629,11631,317, 11632,11633,1160, 317, 8766, 317, 11198,317, 11630,317, 11634,11636,11635,1791, 382, 11639,351, 11640,2022, 5332, 350, 11642,9450, 11644, 11646,11649,11650,345, 11653,317, 565, 11643,11645,2503, 2012, 2549, 490, 11647,3967, 11648,7657, 317, 1060, 11651,11652,11654,2022, 11656,11658,317, 11657, 3966, 6283, 11659,1033, 11660,11661,11663,2369, 11665,11667,351, 6993, 317, 332, 11668,11669,11671,11672,317, 11686,11688,317, 11689,362, 6996, 332, 11673, - 11677,11679,11680,11681,2391, 11684,11674,11675,1160, 382, 490, 317, 317, 317, 11676,371, 971, 11678,11682,317, 317, 11683,11685,390, 6598, 11687,317, + 11677,11679,11680,11681,2391, 11684,11674,11675,1160, 382, 490, 317, 317, 317, 11676,371, 971, 11678,11682,317, 317, 11683,11685,390, 6598, 11687,317, 351, 363, 11690,404, 11691,11692,11699,11700,11703,11739,11742,11744,11763,11765,11768,11770,11784,11793,11795,11798,11800,11806,11807,11808,11809,11810,11693, - 390, 419, 362, 317, 11694,11695,348, 11697,317, 317, 1430, 11696,4984, 490, 490, 6996, 633, 362, 490, 8926, 1160, 7850, 11698,317, 317, 5517, 345, + 390, 419, 362, 317, 11694,11695,348, 11697,317, 317, 1430, 11696,4984, 490, 490, 6996, 633, 362, 490, 8926, 1160, 7850, 11698,317, 317, 5517, 345, 11701,11702,1060, 1999, 381, 11704,11709,11710,6532, 362, 11715,11719,11721,11725,11727,490, 11728,317, 11729,11731,11733,9832, 1325, 11705,11706,7850, 11707, - 490, 11708,317, 11711,317, 350, 11714,11712,11713,11716,6294, 11717,11718,637, 5942, 317, 370, 317, 11720,11722,11723,317, 349, 2156, 11724,11726,476, + 490, 11708,317, 11711,317, 350, 11714,11712,11713,11716,6294, 11717,11718,637, 5942, 317, 370, 317, 11720,11722,11723,317, 349, 2156, 11724,11726,476, 370, 3987, 4952, 7386, 1020, 382, 11730,2150, 11732,317, 11734,11735,11736,11737,11738,1453, 348, 317, 317, 11740,317, 317, 317, 317, 11741,5153, 11743, 578, 380, 11745,11750,2584, 11751,5159, 3999, 11752,11754,343, 351, 11759,11762,11746,11647,390, 11747,11748,11749,2086, 345, 317, 8488, 317, 11753,11755, 6546, 11756,11757,11758,11760,11761,11764,7565, 371, 317, 11766,11767,350, 5464, 466, 3854, 317, 11769,380, 11771,10622,11772,11089,7871, 11773,11774,11775, 11781,2110, 317, 317, 465, 8488, 317, 317, 343, 317, 5836, 11776,11778,11777,11779,11780,5201, 356, 3869, 7031, 363, 11782,317, 11783,11785,11787,11789, 11790,317, 1109, 11786,317, 350, 11788,381, 356, 10149,317, 382, 8189, 11791,317, 5295, 11792,343, 317, 7149, 11794,11796,11797,380, 5626, 317, 11799, - 490, 350, 11089,11801,11804,7490, 11805,363, 370, 1992, 317, 11802,317, 317, 11803,317, 7622, 1992, 7187, 5038, 5810, 428, 5838, 4253, 11812,511, 365, + 490, 350, 11089,11801,11804,7490, 11805,363, 370, 1992, 317, 11802,317, 317, 11803,317, 7622, 1992, 7187, 5038, 5810, 428, 5838, 4253, 11812,511, 365, 8301, 11813,11815,11816,11817,317, 11819,317, 345, 2060, 11818,11820,345, 11821,5441, 1325, 9853, 11822,317, 568, 370, 317, 11824,4965, 11826,11825,11827, 11505,11828,11848,11876,11886,11892,11903,11907,11917,11919,11930,11934,11946,11950,11956,11975,11984,11987,12021,12033,12077,12080,12081,12082,12089,11829,11832, - 8597, 11834,11835,489, 11836,11837,317, 11838,11839,317, 11845,11846,317, 11847,11830,348, 363, 332, 317, 11831,490, 4925, 2211, 317, 317, 11833,7866, + 8597, 11834,11835,489, 11836,11837,317, 11838,11839,317, 11845,11846,317, 11847,11830,348, 363, 332, 317, 11831,490, 4925, 2211, 317, 317, 11833,7866, 351, 2035, 2035, 2035, 5223, 317, 2004, 11840,384, 490, 11842,11844,490, 11841,3284, 11843,11198,381, 390, 317, 365, 317, 8096, 5611, 11849,11859,11866, - 11871,11873,317, 11875,2609, 317, 11850,11852,8178, 357, 11854,317, 11858,490, 11851,345, 363, 2142, 5033, 11853,5241, 1160, 11855,11856,11857,317, 5616, - 317, 357, 1030, 332, 7779, 345, 590, 11860,317, 317, 11861,317, 965, 11862,11865,317, 11863,317, 317, 11864,404, 363, 365, 317, 317, 317, 8955, + 11871,11873,317, 11875,2609, 317, 11850,11852,8178, 357, 11854,317, 11858,490, 11851,345, 363, 2142, 5033, 11853,5241, 1160, 11855,11856,11857,317, 5616, + 317, 357, 1030, 332, 7779, 345, 590, 11860,317, 317, 11861,317, 965, 11862,11865,317, 11863,317, 317, 11864,404, 363, 365, 317, 317, 317, 8955, 363, 362, 11867,5120, 11868,390, 11869,404, 317, 6278, 11870,7672, 1109, 11872,317, 351, 490, 11874,317, 384, 490, 317, 317, 332, 1160, 11877,11880, 11881,317, 11882,11885,11702,345, 7850, 11878,6409, 6294, 11879,2316, 2117, 384, 345, 1531, 370, 11883,11884,2156, 367, 11887,11888,5964, 11889,2022, 11890, 11891,3987, 390, 317, 596, 317, 363, 380, 317, 317, 490, 317, 317, 317, 380, 317, 317, 351, 2022, 5840, 1194, 317, 11893,11895,11898,2171, 11899, 1109, 5120, 11902,539, 6598, 11894,11896,317, 11897,1525, 11900,1347, 11901,356, 317, 11904,11905,11906,11894,476, 578, 382, 1444, 317, 11908,11909,11912, - 11913,9938, 317, 11915,10528,2236, 317, 317, 317, 317, 11910,317, 363, 11911,11914,11916,427, 11918,3007, 11920,11921,11922,404, 11923,317, 11924,2533, + 11913,9938, 317, 11915,10528,2236, 317, 317, 317, 317, 11910,317, 363, 11911,11914,11916,427, 11918,3007, 11920,11921,11922,404, 11923,317, 11924,2533, 11927,1347, 11929,7438, 427, 317, 2330, 317, 11925,2410, 11926,317, 11928,317, 6780, 317, 490, 345, 11931,11932,11933,11935,11936,11937,11941,11942,11943, - 362, 317, 11945,345, 2402, 317, 317, 1060, 490, 11938,317, 317, 5223, 11939,11940,2152, 11918,317, 9575, 11944,605, 317, 11947,11948,1060, 11949,1060, + 362, 317, 11945,345, 2402, 317, 317, 1060, 490, 11938,317, 317, 5223, 11939,11940,2152, 11918,317, 9575, 11944,605, 317, 11947,11948,1060, 11949,1060, 427, 343, 317, 317, 11902,317, 371, 1358, 11951,11953,11955,356, 11952,317, 317, 317, 317, 11954,343, 545, 11957,11959,381, 11961,9624, 11964,11966, 11198,11968,11974,427, 3987, 550, 11958,2155, 317, 5134, 317, 5561, 380, 11960,2022, 2631, 380, 1347, 8228, 11962,6598, 11963,11965,428, 392, 11918,11967, - 317, 317, 2219, 7688, 2022, 11969,11970,11971,373, 373, 11972,11973,1033, 466, 2537, 490, 11976,11977,11980,2074, 965, 7779, 11978,11979,351, 401, 317, + 317, 317, 2219, 7688, 2022, 11969,11970,11971,373, 373, 11972,11973,1033, 466, 2537, 490, 11976,11977,11980,2074, 965, 7779, 11978,11979,351, 401, 317, 317, 11981,11983,1358, 317, 317, 345, 11982,990, 5201, 317, 11985,11986,11988,11995,11089,12005,12018,317, 345, 12020,348, 11989,9342, 11992,343, 11993, - 1109, 381, 1109, 11990,6673, 317, 11991,2171, 317, 5611, 350, 11994,11996,490, 7143, 317, 12001,12002,12003,7782, 5120, 12004,11997,11998,11999,12000,356, + 1109, 381, 1109, 11990,6673, 317, 11991,2171, 317, 5611, 350, 11994,11996,490, 7143, 317, 12001,12002,12003,7782, 5120, 12004,11997,11998,11999,12000,356, 466, 5487, 317, 317, 2410, 350, 317, 2271, 317, 317, 7721, 12006,11921,12007,12008,12011,12012,12013,1347, 12016,381, 11661,6486, 5032, 7949, 590, 12009, - 6578, 317, 12010,5392, 345, 4984, 351, 317, 9303, 12014,12015,351, 5054, 317, 12017,348, 345, 317, 317, 427, 357, 381, 12019,317, 9420, 8281, 317, - 5840, 12022,12023,12026,12027,12028,5838, 2571, 12029,12030,12032,3987, 589, 5624, 2715, 8296, 12024,12025,6138, 7356, 317, 427, 2715, 427, 356, 12031,637, + 6578, 317, 12010,5392, 345, 4984, 351, 317, 9303, 12014,12015,351, 5054, 317, 12017,348, 345, 317, 317, 427, 357, 381, 12019,317, 9420, 8281, 317, + 5840, 12022,12023,12026,12027,12028,5838, 2571, 12029,12030,12032,3987, 589, 5624, 2715, 8296, 12024,12025,6138, 7356, 317, 427, 2715, 427, 356, 12031,637, 1932, 12034,5897, 12035,12036,2163, 12041,12051,971, 12052,12055,12059,12061,12063,12073,7940, 12074,11855,317, 365, 5624, 390, 317, 7850, 317, 1160, 12037, - 12038,12040,12039,9624, 550, 356, 466, 317, 317, 12042,2402, 12045,12043,317, 317, 2593, 317, 12044,12046,317, 12047,317, 339, 12048,12049,317, 370, + 12038,12040,12039,9624, 550, 356, 466, 317, 317, 12042,2402, 12045,12043,317, 317, 2593, 317, 12044,12046,317, 12047,317, 339, 12048,12049,317, 370, 12050,8273, 12053,345, 12054,7850, 3284, 12056,466, 12058,7698, 12057,11962,317, 363, 5037, 5684, 12060,2117, 12062,317, 12064,12069,12070,11198,4591, 12065, - 7142, 12066,12067,343, 5694, 12068,7385, 390, 317, 12071,12072,371, 8274, 317, 371, 514, 427, 7463, 427, 12075,490, 971, 12076,4925, 390, 12078,317, + 7142, 12066,12067,343, 5694, 12068,7385, 390, 317, 12071,12072,371, 8274, 317, 371, 514, 427, 7463, 427, 12075,490, 971, 12076,4925, 390, 12078,317, 317, 4925, 12079,7384, 384, 1943, 428, 384, 363, 12083,5055, 12085,12084,12086,12087,12088,2211, 1345, 2211, 12090,348, 12094,501, 12096,12109,543, 12110, - 12121,12130,12141,12143,12145,12146,5079, 12148,12171,12182,3987, 343, 12091,12092,12093,1881, 2291, 370, 7242, 345, 7567, 317, 343, 12095,373, 12097,317, - 2171, 12101,12104,4186, 12105,12108,317, 12098,637, 12099,356, 317, 12100,8248, 1160, 317, 317, 317, 317, 12102,12103,343, 2156, 345, 363, 3676, 1588, - 12106,12107,12111,12112,12113,12114,12116,2271, 12120,551, 380, 12115,317, 351, 12117,12118,12119,1160, 12122,5241, 317, 317, 12123,12127,7523, 2546, 317, - 317, 317, 7866, 404, 6387, 12124,2272, 4984, 12125,1588, 317, 371, 12126,12128,317, 11831,351, 12129,345, 12131,12139,605, 12132,12135,12133,12134,317, + 12121,12130,12141,12143,12145,12146,5079, 12148,12171,12182,3987, 343, 12091,12092,12093,1881, 2291, 370, 7242, 345, 7567, 317, 343, 12095,373, 12097,317, + 2171, 12101,12104,4186, 12105,12108,317, 12098,637, 12099,356, 317, 12100,8248, 1160, 317, 317, 317, 317, 12102,12103,343, 2156, 345, 363, 3676, 1588, + 12106,12107,12111,12112,12113,12114,12116,2271, 12120,551, 380, 12115,317, 351, 12117,12118,12119,1160, 12122,5241, 317, 317, 12123,12127,7523, 2546, 317, + 317, 317, 7866, 404, 6387, 12124,2272, 4984, 12125,1588, 317, 371, 12126,12128,317, 11831,351, 12129,345, 12131,12139,605, 12132,12135,12133,12134,317, 12136,370, 317, 1358, 12137,12138,12140,12142,12144,530, 317, 1358, 5793, 2416, 12147,8243, 2631, 12149,12150,12151,12152,12155,12156,12157,12166,12167,12169, - 12170,345, 8852, 6089, 317, 1220, 343, 7672, 317, 5439, 317, 363, 317, 317, 317, 12153,317, 12154,6278, 389, 551, 427, 355, 317, 317, 12158,4268, + 12170,345, 8852, 6089, 317, 1220, 343, 7672, 317, 5439, 317, 363, 317, 317, 317, 12153,317, 12154,6278, 389, 551, 427, 355, 317, 317, 12158,4268, 365, 381, 12159,12160,317, 12161,12162,12163,12164,12165,351, 6188, 12168,1160, 9274, 9422, 5515, 1230, 332, 12172,12175,12176,12180,12181,2110, 363, 12173, 2410, 12174,332, 317, 317, 317, 12177,8264, 12179,363, 6506, 1358, 5055, 12178,1347, 317, 345, 2272, 1358, 317, 317, 476, 1060, 317, 2322, 12183,12184, 12186,8301, 12194,7618, 12200,4960, 4249, 12203,12212,9483, 12215,12217,490, 12221,12222,12227,12228,12265,1871, 317, 12266,363, 12187,317, 12190,12191,12192, - 12193,490, 5406, 12188,12189,317, 490, 2035, 345, 10072,12195,12196,12197,12198,317, 317, 350, 12199,351, 590, 317, 362, 1347, 12201,317, 12202,5037, - 12204,2413, 7504, 12205,343, 12207,12208,12210,7477, 11918,12206,2553, 370, 384, 12209,2156, 5742, 12211,317, 536, 317, 404, 12213,317, 362, 12214,317, + 12193,490, 5406, 12188,12189,317, 490, 2035, 345, 10072,12195,12196,12197,12198,317, 317, 350, 12199,351, 590, 317, 362, 1347, 12201,317, 12202,5037, + 12204,2413, 7504, 12205,343, 12207,12208,12210,7477, 11918,12206,2553, 370, 384, 12209,2156, 5742, 12211,317, 536, 317, 404, 12213,317, 362, 12214,317, 317, 2108, 489, 370, 12216,343, 12218,12220,12219,681, 9088, 8258, 317, 633, 317, 1353, 5590, 390, 1347, 1345, 12223,5392, 2108, 427, 12224,12225,12226, - 10149,363, 12229,12234,12239,12240,332, 12247,4984, 4980, 12264,317, 12230,5167, 12233,365, 12231,12232,317, 4984, 2219, 373, 12235,12236,317, 5896, 9624, - 7401, 317, 356, 12237,362, 12238,404, 1160, 370, 1109, 3987, 363, 5694, 12241,7976, 317, 12243,12244,12242,12245,317, 317, 7142, 12246,12248,466, 317, + 10149,363, 12229,12234,12239,12240,332, 12247,4984, 4980, 12264,317, 12230,5167, 12233,365, 12231,12232,317, 4984, 2219, 373, 12235,12236,317, 5896, 9624, + 7401, 317, 356, 12237,362, 12238,404, 1160, 370, 1109, 3987, 363, 5694, 12241,7976, 317, 12243,12244,12242,12245,317, 317, 7142, 12246,12248,466, 317, 12249,12250,317, 12254,12255,12259,317, 12263,4873, 12251,12252,12253,6709, 551, 8254, 12256,12257,12258,12260,12261,12262,9140, 565, 351, 365, 365, 12268, - 12270,12273,12282,12292,12295,12296,12298,12299,12317,12320,12321,12322,6881, 490, 12269,1347, 5309, 317, 12271,427, 1700, 351, 317, 12272,12274,6920, 350, - 12278,12279,12275,317, 12276,12277,363, 1020, 12280,317, 12281,12283,12284,12286,12287,12289,317, 12285,12288,12290,12291,5309, 476, 12293,12294,5332, 6036, + 12270,12273,12282,12292,12295,12296,12298,12299,12317,12320,12321,12322,6881, 490, 12269,1347, 5309, 317, 12271,427, 1700, 351, 317, 12272,12274,6920, 350, + 12278,12279,12275,317, 12276,12277,363, 1020, 12280,317, 12281,12283,12284,12286,12287,12289,317, 12285,12288,12290,12291,5309, 476, 12293,12294,5332, 6036, 362, 317, 476, 317, 4591, 5431, 12297,6594, 530, 5663, 12300,12301,12302,12304,12310,12312,12313,10845,7852, 2108, 5898, 11147,9609, 5223, 12303,12305,12306, 12307,2222, 12308,12309,350, 12311,351, 566, 12314,12315,12316,317, 12318,12319,317, 9450, 390, 6855, 343, 2022, 362, 3987, 390, 317, 12323,437, 12325, - 12327,350, 558, 12326,317, 8214, 317, 12329,12330,12331,12332,1347, 2184, 2222, 5865, 427, 317, 12334,317, 2022, 12335,5809, 8587, 351, 12337,12339,5104, - 12340,12346,5530, 12347,12350,12353,11236,12357,12358,3075, 12362,12363,12365,8852, 5573, 9119, 7514, 490, 404, 5120, 12338,317, 317, 357, 490, 7590, 1999, - 1943, 12341,6854, 343, 316, 5087, 12342,317, 12345,317, 12343,12344,317, 7801, 6598, 8254, 12348,12349,12351,356, 12352,12354,12355,12356,317, 396, 350, + 12327,350, 558, 12326,317, 8214, 317, 12329,12330,12331,12332,1347, 2184, 2222, 5865, 427, 317, 12334,317, 2022, 12335,5809, 8587, 351, 12337,12339,5104, + 12340,12346,5530, 12347,12350,12353,11236,12357,12358,3075, 12362,12363,12365,8852, 5573, 9119, 7514, 490, 404, 5120, 12338,317, 317, 357, 490, 7590, 1999, + 1943, 12341,6854, 343, 316, 5087, 12342,317, 12345,317, 12343,12344,317, 7801, 6598, 8254, 12348,12349,12351,356, 12352,12354,12355,12356,317, 396, 350, 1347, 551, 1347, 554, 12359,317, 12361,317, 12360,343, 427, 10855,501, 2171, 12364,2171, 7688, 343, 2219, 12366,12368,12370,12372,350, 12374,1481, 12376, - 12377,2510, 12369,317, 9244, 490, 12371,2171, 317, 12373,9657, 12375,1481, 2142, 8273, 12378,9878, 317, 343, 1108, 12379,12381,1220, 12385,12388,5942, 339, - 511, 12392,12394,490, 12395,12382,12383,12384,12386,12387,1615, 651, 317, 928, 1451, 12389,317, 12390,317, 12391,317, 633, 637, 12393,3125, 317, 490, + 12377,2510, 12369,317, 9244, 490, 12371,2171, 317, 12373,9657, 12375,1481, 2142, 8273, 12378,9878, 317, 343, 1108, 12379,12381,1220, 12385,12388,5942, 339, + 511, 12392,12394,490, 12395,12382,12383,12384,12386,12387,1615, 651, 317, 928, 1451, 12389,317, 12390,317, 12391,317, 633, 637, 12393,3125, 317, 490, 2899, 380, 365, 317, 12397,12400,380, 11336,12402,8178, 317, 12398,12399,12401,6778, 12403,4396, 12405,396, 382, 3565, 427, 12406,612, 12407,316, 12408, 350, 30, 12529,12534,12573,12607,12652,12663,12678,12706,12735,12739,31, 12903,32, 13061,13065,13067,33, 13280,13331,13380,13395,13407,13415,13420,13431, 12409,12410,12420,12424,12426,551, 12427,12428,12430,12435,12444,12457,12460,12472,12520,12528,351, 385, 12411,12418,317, 317, 633, 12412,12413,12414,12415, 12416,11089,350, 362, 12417,427, 6089, 317, 370, 427, 317, 5105, 317, 317, 1160, 317, 12419,12421,12422,3987, 317, 12423,317, 1347, 466, 363, 12425, 10422,2022, 317, 6546, 1358, 12429,317, 363, 12431,12434,363, 317, 317, 317, 12432,12433,12436,12440,12441,11089,2156, 12442,12443,5840, 382, 12437,12438, - 12439,1060, 1020, 4576, 1160, 637, 12445,12446,633, 12447,410, 12448,12449,12451,7419, 9624, 10877,9198, 362, 317, 12455,1060, 317, 637, 317, 1267, 317, - 12450,317, 12154,367, 428, 10283,2171, 12452,12453,1160, 317, 363, 12454,317, 317, 1011, 740, 317, 12456,1020, 317, 5661, 2171, 363, 12458,12459,1087, + 12439,1060, 1020, 4576, 1160, 637, 12445,12446,633, 12447,410, 12448,12449,12451,7419, 9624, 10877,9198, 362, 317, 12455,1060, 317, 637, 317, 1267, 317, + 12450,317, 12154,367, 428, 10283,2171, 12452,12453,1160, 317, 363, 12454,317, 317, 1011, 740, 317, 12456,1020, 317, 5661, 2171, 363, 12458,12459,1087, 6419, 370, 362, 363, 317, 317, 317, 3599, 12461,1358, 12462,12465,343, 883, 12468,3075, 12469,4980, 12471,345, 317, 317, 317, 12463,9649, 317, 12464, - 5488, 356, 12466,5430, 12467,317, 396, 317, 12470,12473,12474,12479,12484,550, 12488,12492,12495,12499,343, 12504,12508,12511,12515,12519,317, 501, 5205, + 5488, 356, 12466,5430, 12467,317, 396, 317, 12470,12473,12474,12479,12484,550, 12488,12492,12495,12499,343, 12504,12508,12511,12515,12519,317, 501, 5205, 990, 317, 12475,12478,2705, 12476,12477,2272, 1060, 1020, 2272, 12480,12481,12482,12483,1998, 9244, 1358, 363, 9320, 343, 317, 2036, 12485,12487,12486,12489, 12490,12491,2163, 2163, 12493,12494,12496,317, 12497,12498,12500,350, 12503,317, 12501,12502,345, 12505,1999, 12507,12506,12509,12510,551, 550, 12512,12154, 12513,12514,317, 12516,1160, 345, 12517,12464,12518,317, 2163, 5022, 12521,12526,317, 12522,6996, 633, 12523,12524,1548, 404, 12525,317, 12527,2222, 12530, 12532,12533,590, 317, 317, 12531,332, 317, 10317,1160, 381, 12535,12536,12538,12542,12548,2134, 12572,6894, 404, 2406, 565, 565, 343, 343, 7095, 12537, 596, 343, 12539,12540,317, 12541,551, 12543,350, 362, 9012, 12544,12545,317, 2222, 317, 380, 4982, 9357, 12546,12547,633, 317, 12549,12556,12557,12560, - 12562,12564,12565,12566,12568,404, 427, 12571,6420, 12550,317, 12552,12555,317, 5223, 317, 12551,7592, 2152, 12553,7618, 554, 12554,390, 350, 317, 2627, - 343, 362, 317, 317, 12558,12559,317, 317, 12561,345, 12563,363, 439, 5663, 2405, 317, 12567,317, 12569,355, 12570,439, 427, 545, 5810, 12422,380, + 12562,12564,12565,12566,12568,404, 427, 12571,6420, 12550,317, 12552,12555,317, 5223, 317, 12551,7592, 2152, 12553,7618, 554, 12554,390, 350, 317, 2627, + 343, 362, 317, 317, 12558,12559,317, 317, 12561,345, 12563,363, 439, 5663, 2405, 317, 12567,317, 12569,355, 12570,439, 427, 545, 5810, 12422,380, 12574,12575,12576,12577,12582,12584,6089, 12587,350, 12591,12592,12594,12597,12599,12600,12603,4789, 12606,1020, 1325, 637, 5295, 317, 551, 356, 12578,12581, 317, 317, 12579,12580,9624, 404, 1347, 343, 1347, 590, 317, 350, 380, 12583,317, 8906, 7698, 9624, 12585,12586,2369, 12588,12589,12590,427, 404, 12593, - 12595,6036, 7285, 12596,10316,371, 371, 8274, 3284, 317, 345, 1109, 2381, 2058, 1358, 12598,490, 5055, 412, 317, 12601,12602,390, 3243, 371, 5742, 5624, - 379, 351, 12604,2261, 12202,12605,551, 428, 5810, 12608,12610,12614,12615,12618,12619,1230, 12620,12623,12628,12629,12631,12632,12643,12644,12650,12651,1358, - 343, 12609,12611,12613,11702,427, 8695, 12563,466, 350, 350, 427, 12612,317, 554, 2156, 332, 317, 12616,5991, 12617,317, 317, 2156, 418, 343, 9383, + 12595,6036, 7285, 12596,10316,371, 371, 8274, 3284, 317, 345, 1109, 2381, 2058, 1358, 12598,490, 5055, 412, 317, 12601,12602,390, 3243, 371, 5742, 5624, + 379, 351, 12604,2261, 12202,12605,551, 428, 5810, 12608,12610,12614,12615,12618,12619,1230, 12620,12623,12628,12629,12631,12632,12643,12644,12650,12651,1358, + 343, 12609,12611,12613,11702,427, 8695, 12563,466, 350, 350, 427, 12612,317, 554, 2156, 332, 317, 12616,5991, 12617,317, 317, 2156, 418, 343, 9383, 350, 12621,362, 317, 12622,317, 351, 370, 390, 12624,351, 2272, 12626,12625,12627,363, 351, 363, 5105, 343, 12630,317, 12633,621, 2060, 633, 12634, 362, 4965, 12636,12637,12638,12639,12640,12642,317, 12635,427, 382, 2063, 370, 5663, 4984, 9525, 12641,12211,317, 317, 2022, 350, 363, 404, 3710, 12645, 12647,363, 317, 317, 427, 12646,12648,317, 12649,317, 317, 1033, 351, 12653,428, 12655,12657,12660,345, 12654,12656,12658,12659,317, 343, 12661,12662, - 12664,2058, 12665,12669,12670,12671,2022, 12674,12675,12676,317, 12677,317, 317, 362, 1358, 380, 12666,317, 317, 345, 363, 12667,12668,2510, 356, 3999, + 12664,2058, 12665,12669,12670,12671,2022, 12674,12675,12676,317, 12677,317, 317, 362, 1358, 380, 12666,317, 317, 345, 363, 12667,12668,2510, 356, 3999, 317, 12672,466, 12673,317, 2510, 9648, 2521, 2410, 6402, 7098, 356, 317, 6340, 2087, 380, 8519, 317, 317, 12679,12686,12688,12695,10185,12697,12698,12701, - 12705,2152, 1383, 12680,443, 5120, 12681,5447, 12682,382, 12683,12684,12685,380, 5343, 317, 10238,1325, 5138, 317, 3079, 12687,350, 12689,12693,12690,317, + 12705,2152, 1383, 12680,443, 5120, 12681,5447, 12682,382, 12683,12684,12685,380, 5343, 317, 10238,1325, 5138, 317, 3079, 12687,350, 12689,12693,12690,317, 12691,12692,12694,12696,466, 343, 350, 12142,466, 10907,12699,9383, 12700,10058,12702,12704,343, 5662, 345, 12703,8488, 317, 10538,12316,12707,12714,12720, 511, 12724,12725,12727,511, 12728,12730,12734,2357, 12708,12712,12709,12710,12711,12713,317, 12715,343, 12716,12717,12718,12719,12721,12722,2022, 12723,12142, - 8603, 12726,343, 362, 9012, 317, 1347, 8178, 317, 317, 12729,343, 381, 536, 390, 12731,317, 350, 12732,12733,4738, 4738, 351, 12731,317, 350, 2387, + 8603, 12726,343, 362, 9012, 317, 1347, 8178, 317, 317, 12729,343, 381, 536, 390, 12731,317, 350, 12732,12733,4738, 4738, 351, 12731,317, 350, 2387, 11040,12736,971, 12738,350, 380, 5173, 490, 12737,1109, 12740,2036, 12741,350, 12742,345, 317, 345, 12743,1194, 12750,12757,12758,12771,12776,12783,12786, 362, 12802,12804,12867,12872,12874,350, 5956, 12884,12889,12894,12895,6089, 12898,12900,2146, 5027, 12744,317, 12745,12747,9454, 12749,1109, 350, 317, 12746, 2108, 7865, 9422, 12748,12751,12753,12755,12752,11451,351, 12754,382, 351, 12756,1999, 363, 3999, 363, 12759,12762,317, 12767,12770,317, 317, 2086, 12760, 12761,12763,12764,12765,12766,12768,12769,12772,12773,12774,12775,370, 317, 2715, 381, 578, 11339,1588, 5255, 351, 12777,317, 12779,12780,12781,317, 12778, - 427, 381, 1358, 332, 5055, 1109, 965, 427, 12782,343, 332, 7098, 675, 12784,12785,12787,12788,2146, 12790,2156, 12792,12793,12797,12799,12801,12789,317, + 427, 381, 1358, 332, 5055, 1109, 965, 427, 12782,343, 332, 7098, 675, 12784,12785,12787,12788,2146, 12790,2156, 12792,12793,12797,12799,12801,12789,317, 1347, 317, 317, 12791,410, 5394, 466, 317, 7266, 490, 11844,12794,343, 12795,12796,12798,317, 12800,2609, 6600, 317, 4984, 6002, 6532, 12803,317, 12805, 2119, 12815,12816,12818,12833,12836,12838,12850,12851,12855,12856,12774,12858,5037, 12861,12862,6228, 2066, 7865, 12806,12808,2537, 317, 11648,370, 12809,12811, 317, 12812,12813,350, 12807,317, 6847, 490, 317, 350, 12810,317, 11669,6816, 317, 2272, 2271, 317, 351, 2326, 523, 12814,12817,317, 590, 12819,10794, - 12824,12825,12826,12828,7779, 12830,12832,317, 490, 12820,12785,12821,12822,12823,12827,2271, 434, 12829,10480,343, 12831,8906, 317, 5038, 343, 12834,1444, - 12835,12837,1347, 393, 551, 5956, 332, 5464, 12839,12841,363, 12846,12848,2715, 11921,5890, 12840,317, 350, 12842,317, 317, 7356, 351, 12843,12845,2236, - 12844,12847,12849,317, 343, 404, 9557, 1588, 12852,12853,5891, 317, 332, 12854,11613,8023, 12857,7386, 317, 317, 332, 12859,12860,317, 2071, 2063, 317, + 12824,12825,12826,12828,7779, 12830,12832,317, 490, 12820,12785,12821,12822,12823,12827,2271, 434, 12829,10480,343, 12831,8906, 317, 5038, 343, 12834,1444, + 12835,12837,1347, 393, 551, 5956, 332, 5464, 12839,12841,363, 12846,12848,2715, 11921,5890, 12840,317, 350, 12842,317, 317, 7356, 351, 12843,12845,2236, + 12844,12847,12849,317, 343, 404, 9557, 1588, 12852,12853,5891, 317, 332, 12854,11613,8023, 12857,7386, 317, 317, 332, 12859,12860,317, 2071, 2063, 317, 12863,12865,12864,12866,12868,12870,317, 12869,12871,343, 357, 1358, 12873,1481, 574, 1913, 396, 381, 2146, 12875,12878,12880,12881,12883,317, 317, 12876, 317, 5991, 12877,317, 317, 317, 10878,12879,12882,1044, 404, 317, 7695, 317, 12885,12886,12887,2322, 5838, 363, 355, 12888,2948, 317, 11516,5991, 12890, - 466, 2271, 363, 12892,317, 1230, 317, 12891,12893,317, 363, 363, 7983, 317, 317, 490, 317, 5818, 317, 12896,12897,5022, 380, 8906, 345, 8906, 373, - 1347, 12899,490, 12878,12901,12902,466, 363, 12904,12907,12908,12909,12910,9141, 317, 12905,317, 9866, 12906,448, 7368, 317, 4186, 2298, 343, 1347, 2108, - 393, 10130,12911,12921,12923,12936,12945,12972,12974,12983,12985,12997,13001,13004,13005,13016,13018,13024,13039,13040,13043,13046,13048,12912,8264, 426, 9624, + 466, 2271, 363, 12892,317, 1230, 317, 12891,12893,317, 363, 363, 7983, 317, 317, 490, 317, 5818, 317, 12896,12897,5022, 380, 8906, 345, 8906, 373, + 1347, 12899,490, 12878,12901,12902,466, 363, 12904,12907,12908,12909,12910,9141, 317, 12905,317, 9866, 12906,448, 7368, 317, 4186, 2298, 343, 1347, 2108, + 393, 10130,12911,12921,12923,12936,12945,12972,12974,12983,12985,12997,13001,13004,13005,13016,13018,13024,13039,13040,13043,13046,13048,12912,8264, 426, 9624, 343, 317, 12913,7776, 2715, 12915,12916,565, 12917,12918,5022, 12914,350, 365, 317, 7045, 5028, 12919,12920,12922,605, 9695, 971, 448, 317, 12924,12929, - 12932,12935,12925,466, 2022, 12926,3529, 12927,12928,12930,12931,12933,12934,332, 2060, 12937,12938,12939,12941,12942,317, 8266, 12943,317, 12944,6834, 380, - 490, 317, 5087, 317, 9447, 12019,2715, 12940,7143, 382, 317, 317, 437, 990, 4965, 317, 2290, 396, 350, 3079, 345, 12946,553, 12947,12955,12965,362, + 12932,12935,12925,466, 2022, 12926,3529, 12927,12928,12930,12931,12933,12934,332, 2060, 12937,12938,12939,12941,12942,317, 8266, 12943,317, 12944,6834, 380, + 490, 317, 5087, 317, 9447, 12019,2715, 12940,7143, 382, 317, 317, 437, 990, 4965, 317, 2290, 396, 350, 3079, 345, 12946,553, 12947,12955,12965,362, 10185,12967,7776, 12968,12969,6516, 12970,12971,12948,12950,12954,317, 12949,12951,381, 390, 317, 317, 12952,12953,317, 345, 2156, 363, 12956,12959,12957, - 12958,12960,9357, 12964,12961,12962,12963,356, 466, 317, 5174, 12966,5120, 316, 390, 317, 1044, 8906, 355, 6517, 7045, 7839, 351, 12973,551, 1109, 578, + 12958,12960,9357, 12964,12961,12962,12963,356, 466, 317, 5174, 12966,5120, 316, 390, 317, 1044, 8906, 355, 6517, 7045, 7839, 351, 12973,551, 1109, 578, 12975,12977,12979,12980,9537, 2067, 9884, 12981,12976,1347, 1160, 2683, 12978,12982,12984,2348, 351, 12986,9917, 12987,12988,1358, 12989,12991,12993,12994,12995, 12996,12990,12949,12992,393, 317, 9553, 970, 371, 317, 317, 5392, 7916, 317, 12998,317, 6691, 317, 12999,363, 13000,13002,13003,13006,13007,13010,13014, - 317, 13015,9624, 343, 356, 9624, 13008,317, 13009,2163, 317, 10471,317, 11266,13011,317, 471, 13012,363, 4980, 13013,317, 351, 9624, 317, 404, 317, + 317, 13015,9624, 343, 356, 9624, 13008,317, 13009,2163, 317, 10471,317, 11266,13011,317, 471, 13012,363, 4980, 13013,317, 351, 9624, 317, 404, 317, 317, 8301, 396, 13017,365, 317, 427, 5896, 13019,7866, 13020,12704,1020, 2022, 362, 13021,404, 13022,317, 13023,13025,8083, 13027,13029,13033,13035,13037, 6046, 5809, 317, 13038,13026,13028,2948, 2053, 6831, 384, 13030,13031,13032,13034,317, 13036,574, 5037, 427, 1060, 363, 4738, 317, 2163, 490, 13041,13042, - 13044,428, 363, 13045,317, 13047,317, 1020, 356, 320, 2808, 13049,13050,13051,13057,380, 317, 317, 490, 343, 317, 317, 350, 10561,574, 13052,339, + 13044,428, 363, 13045,317, 13047,317, 1020, 356, 320, 2808, 13049,13050,13051,13057,380, 317, 317, 490, 343, 317, 317, 350, 10561,574, 13052,339, 380, 13053,13054,13055,13056,13058,13059,13060,13062,317, 2108, 13063,13064,13066,490, 13068,13069,12280,13070,4268, 574, 13071,320, 13072,13078,13084,13092, - 13096,9624, 13114,13142,13144,13147,13164,13175,13184,1358, 6601, 13222,13230,13240,13272,13273,13274,13277,13279,8455, 13073,9027, 13077,363, 13074,13075,317, - 13076,13079,13080,13083,13081,317, 5241, 13082,317, 363, 390, 317, 13085,13087,350, 317, 13091,13086,351, 6623, 8766, 13088,13089,13090,13093,13094,6318, + 13096,9624, 13114,13142,13144,13147,13164,13175,13184,1358, 6601, 13222,13230,13240,13272,13273,13274,13277,13279,8455, 13073,9027, 13077,363, 13074,13075,317, + 13076,13079,13080,13083,13081,317, 5241, 13082,317, 363, 390, 317, 13085,13087,350, 317, 13091,13086,351, 6623, 8766, 13088,13089,13090,13093,13094,6318, 13095,7940, 13097,490, 381, 317, 13099,13106,12126,317, 13108,13098,13100,13101,13102,514, 13104,13105,741, 4949, 317, 317, 501, 13103,351, 350, 12641, - 363, 2024, 371, 370, 13107,317, 13109,13110,13111,13112,13113,13115,13119,13121,13126,3023, 13127,13130,11709,13131,13132,350, 13133,6601, 13136,13138,427, - 13116,13117,490, 12246,317, 13118,490, 13120,380, 396, 7990, 7618, 13122,13123,13125,5300, 317, 1020, 317, 633, 4965, 13124,370, 317, 339, 317, 363, + 363, 2024, 371, 370, 13107,317, 13109,13110,13111,13112,13113,13115,13119,13121,13126,3023, 13127,13130,11709,13131,13132,350, 13133,6601, 13136,13138,427, + 13116,13117,490, 12246,317, 13118,490, 13120,380, 396, 7990, 7618, 13122,13123,13125,5300, 317, 1020, 317, 633, 4965, 13124,370, 317, 339, 317, 363, 404, 317, 12303,578, 6598, 13128,317, 13129,439, 439, 7662, 11196,11339,356, 13134,13135,13137,466, 332, 5217, 363, 13139,13140,13141,7650, 427, 13143, - 317, 605, 317, 349, 11408,317, 317, 10561,317, 13145,317, 2024, 13146,317, 13148,13150,13152,2108, 12454,362, 13155,13159,381, 317, 13149,5590, 2022, + 317, 605, 317, 349, 11408,317, 317, 10561,317, 13145,317, 2024, 13146,317, 13148,13150,13152,2108, 12454,362, 13155,13159,381, 317, 13149,5590, 2022, 13151,370, 317, 13153,7592, 2152, 349, 13154,396, 13156,10626,13157,390, 13158,13160,363, 13162,13161,13163,3708, 13165,1345, 13167,13171,13172,419, 13166, - 1345, 490, 605, 13168,1108, 1100, 13169,373, 2510, 13170,317, 3284, 6334, 5644, 317, 13173,365, 13174,363, 13176,13177,13179,13182,317, 332, 317, 317, + 1345, 490, 605, 13168,1108, 1100, 13169,373, 2510, 13170,317, 3284, 6334, 5644, 317, 13173,365, 13174,363, 13176,13177,13179,13182,317, 332, 317, 317, 345, 13178,13180,13181,13183,1160, 5392, 362, 13185,13200,13201,13202,13205,13207,13212,501, 13215,13217,13221,2415, 13186,13188,13189,13191,13192,13193,13197, - 13198,7711, 345, 13187,317, 2078, 365, 13190,2272, 2610, 13194,317, 317, 1108, 13195,13196,7385, 317, 13199,317, 8274, 384, 4949, 13203,514, 380, 7919, + 13198,7711, 345, 13187,317, 2078, 365, 13190,2272, 2610, 13194,317, 317, 1108, 13195,13196,7385, 317, 13199,317, 8274, 384, 4949, 13203,514, 380, 7919, 1358, 13204,317, 13206,2948, 501, 5917, 551, 13208,13209,13210,13211,317, 637, 343, 5120, 13213,13214,317, 13216,10072,6486, 363, 13218,363, 13220,13219, 1020, 384, 426, 1345, 13223,13225,13227,13229,380, 13224,317, 363, 990, 13226,362, 2219, 1347, 7582, 317, 433, 13228,4045, 317, 8023, 362, 5037, 13231, 13234,13236,13237,390, 363, 13239,13232,1020, 317, 13233,13235,13238,1020, 350, 13241,390, 13246,13249,13256,343, 13258,362, 13259,13264,13267,13270,13271, - 13242,2035, 362, 317, 13243,317, 13244,13245,590, 13247,6993, 5793, 13248,363, 9938, 363, 1160, 13250,13252,13254,317, 317, 13251,317, 2610, 381, 501, - 13253,351, 382, 13255,1160, 317, 13257,6993, 317, 317, 370, 466, 317, 13260,13263,8766, 2105, 8178, 5890, 13261,332, 13262,317, 7385, 365, 2537, 2210, + 13242,2035, 362, 317, 13243,317, 13244,13245,590, 13247,6993, 5793, 13248,363, 9938, 363, 1160, 13250,13252,13254,317, 317, 13251,317, 2610, 381, 501, + 13253,351, 382, 13255,1160, 317, 13257,6993, 317, 317, 370, 466, 317, 13260,13263,8766, 2105, 8178, 5890, 13261,332, 13262,317, 7385, 365, 2537, 2210, 317, 317, 13265,427, 317, 13266,13268,13269,7386, 317, 5890, 343, 2058, 437, 578, 13275,363, 13276,13278,345, 10613,3079, 10364,13281,13284,13286,13289, - 13293,13297,13298,13299,350, 13301,13302,13308,13316,2391, 13329,13282,13283,317, 404, 404, 317, 13285,317, 590, 1453, 2108, 343, 350, 13287,11986,317, + 13293,13297,13298,13299,350, 13301,13302,13308,13316,2391, 13329,13282,13283,317, 404, 404, 317, 13285,317, 590, 1453, 2108, 343, 350, 13287,11986,317, 13288,13290,13291,1588, 2510, 13292,2156, 13294,8061, 317, 13295,13296,466, 317, 317, 3125, 427, 363, 6036, 13300,382, 2601, 13303,363, 553, 13304,13305, 13306,13307,13309,7063, 13312,13315,350, 350, 6063, 13310,13311,317, 13313,350, 381, 317, 574, 317, 13314,371, 317, 2219, 343, 317, 13317,13318,13319, 13321,13325,13326,2391, 13320,13322,13324,433, 13323,370, 317, 5273, 13327,13328,13330,13332,13339,13340,6954, 13344,13352,2254, 350, 501, 317, 13353,13358, - 13362,13376,13377,13379,317, 6449, 2271, 317, 3710, 13333,317, 13337,365, 13334,1347, 13335,351, 13336,13338,13341,13343,390, 490, 13342,7698, 404, 633, - 13345,13347,343, 343, 13348,9938, 433, 2037, 2387, 13350,317, 13346,356, 317, 5793, 317, 1160, 317, 5105, 345, 2004, 317, 13349,5126, 317, 317, 317, + 13362,13376,13377,13379,317, 6449, 2271, 317, 3710, 13333,317, 13337,365, 13334,1347, 13335,351, 13336,13338,13341,13343,390, 490, 13342,7698, 404, 633, + 13345,13347,343, 343, 13348,9938, 433, 2037, 2387, 13350,317, 13346,356, 317, 5793, 317, 1160, 317, 5105, 345, 2004, 317, 13349,5126, 317, 317, 317, 343, 13351,13354,13356,317, 317, 13355,4564, 5991, 466, 317, 13357,13359,370, 13361,363, 1160, 13360,1999, 362, 317, 380, 2219, 317, 419, 13363,13369, - 13370,10223,362, 350, 363, 9914, 317, 13373,13364,13365,13366,317, 6449, 7618, 12524,363, 317, 356, 13367,2022, 13368,317, 404, 990, 382, 363, 2369, - 1347, 13371,13372,1160, 2222, 317, 317, 404, 6228, 2366, 13374,317, 589, 317, 13375,13378,317, 12309,382, 350, 350, 578, 13381,6988, 13383,13385,350, - 13386,13388,13390,13391,345, 13382,343, 350, 13384,450, 490, 13387,363, 13389,13392,13393,350, 13394,2134, 13396,13398,13403,370, 317, 13397,1347, 356, + 13370,10223,362, 350, 363, 9914, 317, 13373,13364,13365,13366,317, 6449, 7618, 12524,363, 317, 356, 13367,2022, 13368,317, 404, 990, 382, 363, 2369, + 1347, 13371,13372,1160, 2222, 317, 317, 404, 6228, 2366, 13374,317, 589, 317, 13375,13378,317, 12309,382, 350, 350, 578, 13381,6988, 13383,13385,350, + 13386,13388,13390,13391,345, 13382,343, 350, 13384,450, 490, 13387,363, 13389,13392,13393,350, 13394,2134, 13396,13398,13403,370, 317, 13397,1347, 356, 13399,345, 13401,9422, 13400,356, 1358, 317, 9067, 363, 7368, 13402,317, 6021, 363, 1160, 351, 13404,13406,317, 13405,1358, 13397,2291, 1588, 2021, 13408, - 2022, 371, 317, 13409,13413,13410,13411,13412,13414,351, 8023, 13416,2146, 13417,13418,13419,13421,13422,13423,13424,317, 1358, 13428,404, 13429,350, 2222, - 317, 317, 350, 5205, 317, 343, 13425,381, 13426,13427,371, 2610, 8100, 13430,343, 2222, 13432,13433,13435,13436,350, 332, 317, 2134, 2551, 13434,2510, + 2022, 371, 317, 13409,13413,13410,13411,13412,13414,351, 8023, 13416,2146, 13417,13418,13419,13421,13422,13423,13424,317, 1358, 13428,404, 13429,350, 2222, + 317, 317, 350, 5205, 317, 343, 13425,381, 13426,13427,371, 2610, 8100, 13430,343, 2222, 13432,13433,13435,13436,350, 332, 317, 2134, 2551, 13434,2510, 317, 13437,13438,13439,7801, 13440,13441,13442,13443,412, 13445,5087, 1479, 13447,590, 13448,13449,13451,13453,13512,13515,13516,607, 13522,13526,13539,13452, 1459, 13454,13458,13469,5419, 13472,2381, 13479,13485,13489,13500,13503,317, 13510,362, 5173, 13455,2178, 13456,13457,13459,13464,13467,11408,317, 13460,13461, - 317, 317, 13462,317, 13463,13465,13466,13468,13470,13471,317, 13473,8148, 13474,13475,13476,13477,13478,13480,317, 490, 13481,13482,13483,13484,13486,2110, + 317, 317, 13462,317, 13463,13465,13466,13468,13470,13471,317, 13473,8148, 13474,13475,13476,13477,13478,13480,317, 490, 13481,13482,13483,13484,13486,2110, 13457,317, 13487,13488,317, 317, 565, 13490,13497,6231, 13499,7940, 365, 13491,13492,13496,8626, 1444, 13493,13494,13495,13498,317, 490, 317, 13501,13502, 490, 6614, 13504,13505,317, 13506,13507,13508,13509,558, 490, 13511,317, 6614, 608, 13513,13514,317, 607, 396, 6222, 317, 365, 13517,317, 13520,13521, 5173, 13518,13519,13523,490, 13525,3429, 433, 373, 317, 13524,13527,13538,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13540,317, 10408,13544, 13465,5561, 13546,13541,13542,13543,13545,8216, 490, 332, 13547,13575,13592,13624,13641,13692,35, 13798,381, 13800,13805,13810,13880,13890,13921,14063,14074, 14141,14197,14224,14229,14232,490, 14233,13548,13549,317, 13551,5027, 13563,317, 13570,13571,13572,490, 1588, 5217, 345, 13550,365, 7142, 13552,10316,13554, - 371, 343, 13555,13560,13553,13556,550, 13557,13558,13559,13561,13562,13564,7035, 490, 9994, 13565,13567,317, 7398, 13566,3688, 13568,13569,317, 10626,5447, + 371, 343, 13555,13560,13553,13556,550, 13557,13558,13559,13561,13562,13564,7035, 490, 9994, 13565,13567,317, 7398, 13566,3688, 13568,13569,317, 10626,5447, 7871, 6993, 2584, 390, 13573,13574,574, 363, 317, 13576,13577,13578,13579,317, 317, 351, 3079, 343, 317, 317, 590, 317, 317, 11186,6920, 404, 13174, 8367, 13580,317, 9313, 13581,13582,10517,13588,13583,13584,13585,13586,351, 13587,317, 9549, 345, 13589,13590,13591,490, 317, 965, 13593,741, 13597,13602, 13604,13616,13618,13620,431, 13594,13595,13596,317, 13598,1347, 349, 13599,13600,13601,448, 498, 5105, 350, 13603,1479, 2134, 396, 317, 11571,1999, 13605, 2024, 554, 466, 13612,9420, 13614,2298, 13606,13609,317, 5223, 13607,317, 13608,466, 13610,404, 13611,13613,363, 362, 317, 317, 393, 13615,13617,13619, - 13621,13622,1347, 13623,382, 1915, 351, 13625,13633,6089, 13634,13637,350, 363, 13638,13639,373, 3987, 13626,13627,13629,13632,317, 2024, 1347, 371, 317, + 13621,13622,1347, 13623,382, 1915, 351, 13625,13633,6089, 13634,13637,350, 363, 13638,13639,373, 3987, 13626,13627,13629,13632,317, 2024, 1347, 371, 317, 10561,13628,317, 13630,13631,362, 7990, 2024, 380, 1347, 450, 317, 317, 382, 13635,13636,13640,13642,13644,13653,13654,350, 13655,350, 13662,13668,13682, - 11147,13690,10538,317, 13643,317, 8083, 13645,13651,13646,13647,13649,13648,5662, 13650,10997,13652,380, 350, 13656,370, 13657,13660,343, 5611, 13661,317, + 11147,13690,10538,317, 13643,317, 8083, 13645,13651,13646,13647,13649,13648,5662, 13650,10997,13652,380, 350, 13656,370, 13657,13660,343, 5611, 13661,317, 317, 5836, 11831,13658,317, 13659,6598, 3284, 317, 5836, 351, 7668, 380, 13663,2357, 971, 13638,13665,13666,317, 13664,317, 373, 9313, 13667,5038, 13669, - 343, 351, 317, 13671,13673,5662, 13675,356, 13677,381, 13681,317, 741, 8047, 13670,13672,13674,317, 13676,351, 384, 13678,350, 13680,13679,3007, 3007, + 343, 351, 317, 13671,13673,5662, 13675,356, 13677,381, 13681,317, 741, 8047, 13670,13672,13674,317, 13676,351, 384, 13678,350, 13680,13679,3007, 3007, 11940,5810, 13683,13684,13687,4738, 1453, 13685,13686,13688,13689,13691,13693,2004, 13694,351, 351, 343, 317, 13695,13696,13697,6228, 13698,13700,13713,13716, 13725,13727,13733,13745,332, 13748,13752,13754,13757,13762,13765,13768,13775,13778,13786,13793,13794,351, 13699,6528, 5036, 356, 317, 673, 317, 317, 13701, 13704,13705,13706,13707,13710,13712,317, 370, 317, 13702,382, 345, 13703,8587, 317, 317, 545, 380, 7695, 384, 384, 6713, 381, 317, 317, 6917, 13708, 1347, 13709,1347, 6021, 5942, 621, 317, 317, 13711,2073, 5962, 317, 317, 380, 4268, 381, 394, 13714,13715,13717,13720,13721,13723,13718,317, 343, 13719, 13722,317, 13724,1992, 317, 317, 633, 317, 317, 13726,317, 2402, 345, 370, 363, 13728,13729,13731,363, 381, 2381, 13730,13732,356, 13734,13735,13737, - 13739,13740,527, 317, 13744,1160, 343, 10590,13736,317, 13738,381, 317, 1347, 317, 4564, 13741,317, 13742,13743,2261, 5810, 345, 1347, 317, 1160, 427, + 13739,13740,527, 317, 13744,1160, 343, 10590,13736,317, 13738,381, 317, 1347, 317, 4564, 13741,317, 13742,13743,2261, 5810, 345, 1347, 317, 1160, 427, 355, 13746,317, 1999, 13747,393, 13749,427, 13750,13751,371, 343, 317, 317, 5684, 317, 13753,1044, 6036, 13755,13756,356, 350, 317, 343, 317, 13758, - 553, 13761,13759,490, 5942, 13760,2022, 393, 545, 13763,13764,393, 1915, 380, 397, 380, 345, 317, 317, 13766,1588, 317, 13767,356, 370, 13769,2581, - 13771,7305, 13774,13770,317, 13772,13773,317, 2420, 7695, 13776,13777,427, 370, 13779,13781,370, 13783,13784,351, 13780,370, 1160, 13782,428, 608, 384, + 553, 13761,13759,490, 5942, 13760,2022, 393, 545, 13763,13764,393, 1915, 380, 397, 380, 345, 317, 317, 13766,1588, 317, 13767,356, 370, 13769,2581, + 13771,7305, 13774,13770,317, 13772,13773,317, 2420, 7695, 13776,13777,427, 370, 13779,13781,370, 13783,13784,351, 13780,370, 1160, 13782,428, 608, 384, 13785,13787,13788,13792,8125, 2035, 2152, 13789,13791,13790,1160, 6859, 1347, 7849, 9383, 13795,13797,317, 13796,356, 427, 13799,2222, 317, 351, 317, 13801, 13802,2146, 13804,317, 317, 1444, 317, 6430, 13803,7149, 317, 2568, 13806,13808,362, 5105, 554, 8301, 13807,317, 1230, 317, 8301, 317, 13809,13811,13814, 13819,13820,13827,13829,13831,13838,13840,13876,13878,13879,6840, 498, 10489,317, 13003,11408,13812,2509, 7399, 13813,332, 7590, 13815,13817,317, 317, 13816, - 317, 13818,317, 13821,317, 13824,317, 13822,13823,13825,13826,13828,317, 317, 2142, 317, 317, 317, 371, 365, 4965, 13830,448, 390, 13832,13836,317, - 565, 13833,3284, 13834,13835,13837,317, 13839,476, 661, 13841,13842,633, 13843,13848,13851,6275, 7734, 13858,13868,362, 13869,1160, 13871,13872,317, 1131, - 13844,13845,13026,356, 343, 3999, 13846,13847,13849,13850,6354, 317, 13852,371, 317, 317, 348, 317, 13854,13679,13857,317, 13853,10487,13855,13856,5991, - 466, 317, 317, 13859,371, 13860,5212, 13861,13866,345, 6412, 317, 5030, 13862,2021, 351, 13863,13864,404, 370, 13865,5163, 317, 13867,5223, 12276,317, - 371, 317, 345, 13870,11613,6228, 317, 317, 633, 317, 13873,317, 317, 317, 13875,9261, 317, 1230, 317, 13874,11921,7953, 13877,365, 7063, 365, 363, - 404, 2171, 363, 317, 13881,13882,13884,2211, 350, 12732,13887,13883,317, 649, 317, 13885,13886,433, 13888,490, 13889,13891,13892,13896,2024, 13897,317, + 317, 13818,317, 13821,317, 13824,317, 13822,13823,13825,13826,13828,317, 317, 2142, 317, 317, 317, 371, 365, 4965, 13830,448, 390, 13832,13836,317, + 565, 13833,3284, 13834,13835,13837,317, 13839,476, 661, 13841,13842,633, 13843,13848,13851,6275, 7734, 13858,13868,362, 13869,1160, 13871,13872,317, 1131, + 13844,13845,13026,356, 343, 3999, 13846,13847,13849,13850,6354, 317, 13852,371, 317, 317, 348, 317, 13854,13679,13857,317, 13853,10487,13855,13856,5991, + 466, 317, 317, 13859,371, 13860,5212, 13861,13866,345, 6412, 317, 5030, 13862,2021, 351, 13863,13864,404, 370, 13865,5163, 317, 13867,5223, 12276,317, + 371, 317, 345, 13870,11613,6228, 317, 317, 633, 317, 13873,317, 317, 317, 13875,9261, 317, 1230, 317, 13874,11921,7953, 13877,365, 7063, 365, 363, + 404, 2171, 363, 317, 13881,13882,13884,2211, 350, 12732,13887,13883,317, 649, 317, 13885,13886,433, 13888,490, 13889,13891,13892,13896,2024, 13897,317, 13903,13906,13004,13909,13911,13915,13916,13919,317, 317, 5201, 458, 432, 317, 345, 13893,13895,2705, 317, 317, 317, 13894,590, 565, 317, 13870,13898, - 5623, 13002,13899,13900,12141,362, 13902,317, 13901,13904,2003, 2219, 363, 13905,2389, 13907,2022, 8296, 317, 1160, 13908,6036, 13910,317, 490, 1453, 317, + 5623, 13002,13899,13900,12141,362, 13902,317, 13901,13904,2003, 2219, 363, 13905,2389, 13907,2022, 8296, 317, 1160, 13908,6036, 13910,317, 490, 1453, 317, 382, 13912,498, 343, 13913,13914,6598, 2584, 466, 317, 13917,350, 13918,317, 590, 5623, 13920,13922,13929,13935,13948,13957,13963,13977,13980,332, 13987, 13997,14019,14023,14032,14036,14054,14062,4788, 13923,13924,13925,13926,13927,13928,13930,574, 13931,13932,13933,433, 13934,13936,13941,13945,13937,13938,13939, - 13940,11418,13942,13943,13944,13946,13947,13949,13955,13950,13951,13952,13953,13954,13956,13958,13961,13962,13959,13960,345, 13964,13973,13965,13967,13966,339, + 13940,11418,13942,13943,13944,13946,13947,13949,13955,13950,13951,13952,13953,13954,13956,13958,13961,13962,13959,13960,345, 13964,13973,13965,13967,13966,339, 2163, 13956,13968,13969,13970,13971,13972,9548, 317, 13974,13975,13976,2510, 13587,317, 13978,13979,13981,13982,13983,13984,13985,13986,317, 13988,13991,13989, 13990,317, 317, 5700, 4268, 13992,13993,13994,13995,13996,13998,14004,14013,317, 13999,345, 14000,14001,14002,14003,14005,14009,317, 14012,14006,14007,14008, - 14010,14011,380, 2272, 14014,14015,14016,14017,14018,14020,14022,317, 317, 14021,14024,339, 5201, 14025,14031,14026,14027,14028,14029,14030,14033,450, 5226, + 14010,14011,380, 2272, 14014,14015,14016,14017,14018,14020,14022,317, 317, 14021,14024,339, 5201, 14025,14031,14026,14027,14028,14029,14030,14033,450, 5226, 14034,14035,14037,14039,14041,2584, 11336,14044,14048,14038,14040,14042,14043,14045,14046,14047,14049,14052,14050,14051,14053,317, 390, 14055,14061,14056,14058, 14057,14059,14060,14064,9171, 6187, 14072,14073,14065,1459, 14066,14067,14068,343, 14069,14070,14071,14075,14076,14077,14085,14100,14106,14109,4952, 14110,14121, - 14122,14126,14128,14129,2568, 14133,2211, 5173, 498, 317, 317, 14078,14081,14079,14080,9624, 350, 6089, 14082,2117, 11089,14083,14084,345, 14086,14087,2387, - 2077, 14088,7401, 14089,14092,5683, 14093,14094,5005, 14096,317, 545, 5653, 317, 317, 574, 6420, 14090,317, 14091,439, 533, 428, 14095,3999, 356, 380, + 14122,14126,14128,14129,2568, 14133,2211, 5173, 498, 317, 317, 14078,14081,14079,14080,9624, 350, 6089, 14082,2117, 11089,14083,14084,345, 14086,14087,2387, + 2077, 14088,7401, 14089,14092,5683, 14093,14094,5005, 14096,317, 545, 5653, 317, 317, 574, 6420, 14090,317, 14091,439, 533, 428, 14095,3999, 356, 380, 317, 14097,428, 2063, 14098,14099,14101,370, 14105,317, 14102,14103,14104,9059, 2110, 4965, 14107,14108,2142, 2219, 10487,6195, 14111,14114,14116,14118,14120, 350, 317, 317, 4952, 14112,317, 381, 317, 590, 6598, 14113,5213, 11940,355, 2708, 355, 2152, 14115,396, 1108, 317, 14117,439, 14119,363, 14123,14124, - 14125,13100,14127,343, 10072,317, 428, 14130,488, 14131,14132,419, 14134,596, 363, 317, 14140,14135,356, 466, 4974, 8897, 2301, 317, 7053, 14136,343, + 14125,13100,14127,343, 10072,317, 428, 14130,488, 14131,14132,419, 14134,596, 363, 317, 14140,14135,356, 466, 4974, 8897, 2301, 317, 7053, 14136,343, 14137,14138,14139,889, 317, 1292, 317, 317, 1018, 651, 317, 317, 317, 317, 633, 428, 11960,14142,14146,14147,14154,596, 14160,14167,14171,14173,14175, - 14179,14181,14187,14189,14194,348, 7521, 2035, 14143,1108, 14145,14144,14148,14150,14151,14152,14153,543, 14149,7916, 380, 343, 2181, 2416, 317, 350, 2715, - 14155,317, 317, 365, 14156,14157,14158,14159,397, 317, 14161,14162,971, 14163,14164,396, 332, 14165,317, 317, 5748, 14166,14168,14169,317, 14170,2108, + 14179,14181,14187,14189,14194,348, 7521, 2035, 14143,1108, 14145,14144,14148,14150,14151,14152,14153,543, 14149,7916, 380, 343, 2181, 2416, 317, 350, 2715, + 14155,317, 317, 365, 14156,14157,14158,14159,397, 317, 14161,14162,971, 14163,14164,396, 332, 14165,317, 317, 5748, 14166,14168,14169,317, 14170,2108, 351, 14172,1060, 14174,14176,14177,545, 14178,390, 5079, 5570, 317, 14180,345, 2610, 317, 317, 14182,466, 427, 14183,14184,14185,14186,14188,14190,14191, - 2503, 14192,2219, 5105, 317, 11962,317, 14193,2610, 3941, 351, 2271, 13853,14195,317, 14196,317, 345, 14198,7911, 14199,14203,14206,466, 2047, 6532, 350, - 14207,2413, 14208,14209,14218,8722, 14220,14200,12598,6228, 317, 633, 476, 8301, 14201,3999, 317, 317, 14202,1160, 14204,317, 317, 2322, 14205,6996, 317, - 633, 490, 2715, 332, 6080, 8525, 317, 14210,14215,343, 362, 350, 14216,317, 317, 14211,14212,317, 6598, 370, 362, 14213,11716,14214,371, 10561,317, + 2503, 14192,2219, 5105, 317, 11962,317, 14193,2610, 3941, 351, 2271, 13853,14195,317, 14196,317, 345, 14198,7911, 14199,14203,14206,466, 2047, 6532, 350, + 14207,2413, 14208,14209,14218,8722, 14220,14200,12598,6228, 317, 633, 476, 8301, 14201,3999, 317, 317, 14202,1160, 14204,317, 317, 2322, 14205,6996, 317, + 633, 490, 2715, 332, 6080, 8525, 317, 14210,14215,343, 362, 350, 14216,317, 317, 14211,14212,317, 6598, 370, 362, 14213,11716,14214,371, 10561,317, 14217,14219,3375, 363, 8272, 14221,317, 14222,317, 14223,14225,5055, 14226,14228,9383, 345, 5570, 14227,490, 338, 317, 14230,14231,370, 380, 350, 14234, - 14237,14238,350, 2036, 596, 367, 14239,14235,14236,14240,428, 343, 317, 14241,14243,14247,13452,14248,14255,14256,317, 14244,14245,14246,14249,14253,343, + 14237,14238,350, 2036, 596, 367, 14239,14235,14236,14240,428, 343, 317, 14241,14243,14247,13452,14248,14255,14256,317, 14244,14245,14246,14249,14253,343, 14250,14252,14251,14254,4984, 596, 596, 14257,14258,14259,1020, 14260,14263,317, 4962, 362, 6601, 5896, 14261,363, 14262,356, 426, 612, 14265,14267,14266, 4090, 3611, 37, 14457,5872, 14459,14507,14550,14635,14642,14720,14721,381, 14268,14274,14348,14354,9624, 14355,14360,14363,14373,14378,14379,14381,14404,14405, - 14432,14442,14445,14447,14451,14452,14269,14272,317, 14270,466, 317, 14271,466, 10854,14273,14275,332, 14276,384, 4965, 370, 8296, 14277,14278,317, 673, - 317, 14279,1353, 14280,14281,14288,14290,14294,14297,14300,14301,14307,14308,14309,14313,14319,14321,14322,14324,14326,14339,14343,317, 370, 10632,380, 356, + 14432,14442,14445,14447,14451,14452,14269,14272,317, 14270,466, 317, 14271,466, 10854,14273,14275,332, 14276,384, 4965, 370, 8296, 14277,14278,317, 673, + 317, 14279,1353, 14280,14281,14288,14290,14294,14297,14300,14301,14307,14308,14309,14313,14319,14321,14322,14324,14326,14339,14343,317, 370, 10632,380, 356, 356, 345, 14282,14283,14285,14286,14287,10894,5223, 14284,551, 317, 317, 317, 317, 6063, 381, 14289,14289,14291,14292,14293,317, 5487, 14295,381, 14296, - 343, 514, 539, 14298,370, 11894,14299,351, 2631, 14302,14304,14306,11918,317, 317, 14303,14305,1358, 393, 343, 1160, 5861, 390, 14310,14311,14312,384, + 343, 514, 539, 14298,370, 11894,14299,351, 2631, 14302,14304,14306,11918,317, 317, 14303,14305,1358, 393, 343, 1160, 5861, 390, 14310,14311,14312,384, 14314,14317,14318,363, 317, 14315,317, 317, 14316,1325, 11648,1358, 428, 14320,343, 345, 4268, 14323,345, 14325,367, 7911, 316, 14327,14331,14334,14336, - 363, 14328,14329,351, 1060, 317, 14330,14332,14333,14335,14337,14338,14340,343, 14342,14341,14344,14345,2627, 356, 14347,14346,317, 2509, 14349,466, 317, - 317, 6228, 317, 740, 317, 362, 14350,14351,317, 317, 14352,14353,10471,6917, 317, 362, 14356,14357,14359,14358,14361,317, 14362,883, 317, 390, 490, + 363, 14328,14329,351, 1060, 317, 14330,14332,14333,14335,14337,14338,14340,343, 14342,14341,14344,14345,2627, 356, 14347,14346,317, 2509, 14349,466, 317, + 317, 6228, 317, 740, 317, 362, 14350,14351,317, 317, 14352,14353,10471,6917, 317, 362, 14356,14357,14359,14358,14361,317, 14362,883, 317, 390, 490, 2058, 2584, 14364,6691, 14372,343, 14365,5037, 14366,14367,14368,14369,14370,14371,14374,14377,2022, 2022, 4976, 317, 7063, 490, 14375,9420, 14376,317, 12453, - 1230, 317, 370, 14071,14380,466, 317, 2571, 317, 317, 317, 14382,14386,1345, 2024, 490, 14389,4980, 14400,14402,14403,370, 14383,2117, 14384,317, 1347, - 5653, 574, 317, 332, 551, 14385,9624, 317, 351, 2024, 14387,4984, 317, 14388,317, 317, 14390,14395,5661, 362, 317, 14397,14398,317, 317, 14391,9720, + 1230, 317, 370, 14071,14380,466, 317, 2571, 317, 317, 317, 14382,14386,1345, 2024, 490, 14389,4980, 14400,14402,14403,370, 14383,2117, 14384,317, 1347, + 5653, 574, 317, 332, 551, 14385,9624, 317, 351, 2024, 14387,4984, 317, 14388,317, 317, 14390,14395,5661, 362, 317, 14397,14398,317, 317, 14391,9720, 14392,14071,1453, 14393,4949, 14394,382, 373, 350, 317, 14396,317, 14071,5561, 1597, 14399,14401,539, 2117, 332, 317, 4925, 466, 2022, 14406,14407,14410, 14411,14414,317, 14416,14420,14423,14431,553, 317, 14408,317, 2715, 14409,13670,14412,317, 345, 14413,317, 2060, 427, 317, 317, 14415,14417,14418,14419, - 14421,14422,14424,466, 14426,317, 317, 14425,14427,7900, 396, 14428,14429,14430,5483, 317, 371, 10316,14433,14434,14436,14439,14440,317, 14435,2024, 2022, + 14421,14422,14424,466, 14426,317, 317, 14425,14427,7900, 396, 14428,14429,14430,5483, 317, 371, 10316,14433,14434,14436,14439,14440,317, 14435,2024, 2022, 14437,14438,466, 2391, 14441,317, 350, 350, 390, 317, 6600, 14443,14444,317, 6036, 2310, 14446,4952, 14448,14449,14450,10965,2584, 10223,14453,14454,14456, - 317, 842, 317, 11280,317, 6420, 317, 390, 351, 14455,5487, 2317, 14458,14460,14464,14466,14469,14472,1030, 14473,14479,14480,14481,14493,14494,14502,1358, - 14504,14505,14506,14461,14463,11450,11954,317, 550, 14462,14465,2222, 317, 4738, 362, 14467,14468,605, 343, 14470,14471,2222, 317, 390, 351, 3999, 317, + 317, 842, 317, 11280,317, 6420, 317, 390, 351, 14455,5487, 2317, 14458,14460,14464,14466,14469,14472,1030, 14473,14479,14480,14481,14493,14494,14502,1358, + 14504,14505,14506,14461,14463,11450,11954,317, 550, 14462,14465,2222, 317, 4738, 362, 14467,14468,605, 343, 14470,14471,2222, 317, 390, 351, 3999, 317, 14474,351, 4591, 6917, 14476,7428, 14477,14475,14478,380, 389, 390, 14482,14484,350, 362, 14486,14483,466, 317, 14485,14487,14492,317, 14488,14489,14490, - 14491,351, 317, 14495,14496,14497,14498,14501,589, 1160, 317, 381, 14499,14500,351, 317, 404, 14503,501, 343, 3079, 3079, 3079, 2117, 2117, 317, 351, - 317, 12864,14508,343, 14513,14514,14516,350, 14518,14519,1347, 14533,14538,501, 14545,14546,317, 14509,14510,317, 14511,317, 14512,4984, 14515,14517,370, - 490, 1347, 9779, 14520,14526,14527,14530,317, 2067, 14532,317, 316, 10422,14521,466, 370, 362, 2571, 14524,317, 14522,14523,14525,14528,14529,14531,317, + 14491,351, 317, 14495,14496,14497,14498,14501,589, 1160, 317, 381, 14499,14500,351, 317, 404, 14503,501, 343, 3079, 3079, 3079, 2117, 2117, 317, 351, + 317, 12864,14508,343, 14513,14514,14516,350, 14518,14519,1347, 14533,14538,501, 14545,14546,317, 14509,14510,317, 14511,317, 14512,4984, 14515,14517,370, + 490, 1347, 9779, 14520,14526,14527,14530,317, 2067, 14532,317, 316, 10422,14521,466, 370, 362, 2571, 14524,317, 14522,14523,14525,14528,14529,14531,317, 5991, 466, 317, 317, 317, 343, 14534,14536,317, 317, 14535,10891,14537,390, 14539,14541,14540,370, 511, 317, 12696,14542,14543,14544,551, 14547,14548, - 14549,8567, 14551,14552,14562,14563,6598, 14567,427, 8522, 5634, 14570,14576,14580,343, 14612,14620,14624,1020, 14625,14633,14634,14553,14554,317, 14561,5897, - 351, 14555,14556,14559,14560,466, 7428, 404, 317, 317, 5717, 2156, 14557,14558,317, 1347, 381, 7499, 7505, 9059, 2134, 14564,2222, 536, 351, 14565,350, - 14566,14462,14568,317, 14569,5896, 14571,317, 9624, 3023, 350, 14572,14573,14574,6602, 6602, 14575,14577,317, 2348, 2317, 14578,14579,317, 317, 317, 590, + 14549,8567, 14551,14552,14562,14563,6598, 14567,427, 8522, 5634, 14570,14576,14580,343, 14612,14620,14624,1020, 14625,14633,14634,14553,14554,317, 14561,5897, + 351, 14555,14556,14559,14560,466, 7428, 404, 317, 317, 5717, 2156, 14557,14558,317, 1347, 381, 7499, 7505, 9059, 2134, 14564,2222, 536, 351, 14565,350, + 14566,14462,14568,317, 14569,5896, 14571,317, 9624, 3023, 350, 14572,14573,14574,6602, 6602, 14575,14577,317, 2348, 2317, 14578,14579,317, 317, 317, 590, 5105, 317, 317, 5942, 9174, 14581,14604,11211,317, 6228, 1087, 12249,9289, 356, 6089, 14582,14585,14587,6674, 1526, 14590,14598,14601,1160, 14583,14584,14586, 14588,6188, 14589,345, 12656,605, 14591,14592,14596,5809, 14593,14595,6081, 14594,14597,14599,14600,14602,14603,5896, 9124, 9624, 3023, 14605,6601, 14608,14606, - 14607,6195, 404, 14609,14575,14610,14611,14613,317, 9624, 14617,14614,14615,14616,351, 14618,14619,356, 14409,466, 317, 14621,2317, 14623,14622,351, 466, + 14607,6195, 404, 14609,14575,14610,14611,14613,317, 9624, 14617,14614,14615,14616,351, 14618,14619,356, 14409,466, 317, 14621,2317, 14623,14622,351, 466, 317, 390, 12696,381, 2156, 1194, 9124, 388, 14626,3999, 14627,14630,317, 385, 2503, 317, 14632,1060, 551, 373, 14628,14629,14631,554, 427, 426, 14636, 14637,14638,14639,14640,14641,14643,419, 14646,14650,14696,1030, 14698,14699,14710,14715,14718,14719,2108, 6674, 14644,14645,14647,5809, 14648,14649,14651,14652, - 14653,14654,14655,14656,2767, 14657,649, 14658,14659,14660,14665,14666,14670,14671,14673,514, 14675,14677,14679,14681,2272, 14683,14685,14687,14692,14693,1078, + 14653,14654,14655,14656,2767, 14657,649, 14658,14659,14660,14665,14666,14670,14671,14673,514, 14675,14677,14679,14681,2272, 14683,14685,14687,14692,14693,1078, 317, 317, 5826, 1615, 317, 317, 317, 317, 1688, 317, 6996, 317, 317, 317, 317, 4563, 14661,14285,14664,2389, 4564, 14662,14663,5807, 317, 1347, 12744, 2631, 14667,13719,14669,384, 14668,14672,316, 578, 317, 343, 390, 428, 14674,12060,501, 14676,362, 14678,14680,380, 404, 14682,11617,14684,356, 14686, - 317, 317, 490, 14688,14690,362, 317, 14691,317, 14689,2156, 1160, 351, 1020, 2272, 384, 5138, 317, 14694,14695,6917, 343, 14697,551, 466, 317, 404, - 390, 381, 317, 5896, 14700,14708,466, 1020, 2419, 9012, 14701,317, 5896, 6598, 14702,14705,13686,14703,14704,14706,14707,14709,14711,14713,14714,14712,317, + 317, 317, 490, 14688,14690,362, 317, 14691,317, 14689,2156, 1160, 351, 1020, 2272, 384, 5138, 317, 14694,14695,6917, 343, 14697,551, 466, 317, 404, + 390, 381, 317, 5896, 14700,14708,466, 1020, 2419, 9012, 14701,317, 5896, 6598, 14702,14705,13686,14703,14704,14706,14707,14709,14711,14713,14714,14712,317, 380, 317, 11613,428, 2117, 317, 842, 356, 370, 362, 317, 317, 14716,317, 14717,356, 466, 363, 501, 317, 350, 10354,14722,2156, 10185,363, 14724, - 14725,14728,14734,14746,6322, 317, 14726,14727,14729,14730,14731,14732,14733,949, 6322, 14735,14739,14742,14745,651, 12774,14736,14737,14738,317, 10320,5120, + 14725,14728,14734,14746,6322, 317, 14726,14727,14729,14730,14731,14732,14733,949, 6322, 14735,14739,14742,14745,651, 12774,14736,14737,14738,317, 10320,5120, 317, 10320,5120, 14740,1902, 14741,14743,14744,365, 14748,1243, 396, 6504, 14749,14751,14770,14807,14838,14884,14913,14914,14944,14965,14985,14989,14993,15052, - 15077,15189,15264,15273,39, 15384,15429,15483,15606,15611,15639,15647,15686,14750,317, 14752,317, 363, 14754,14755,2533, 1358, 14756,14763,14765,10208,317, + 15077,15189,15264,15273,39, 15384,15429,15483,15606,15611,15639,15647,15686,14750,317, 14752,317, 363, 14754,14755,2533, 1358, 14756,14763,14765,10208,317, 14753,1230, 317, 14757,362, 317, 345, 10422,14758,2022, 362, 11242,317, 14761,14759,14760,14762,2272, 14764,356, 379, 466, 317, 14766,9624, 7401, 14767, 14768,10149,350, 2301, 14769,7053, 550, 382, 1347, 317, 5653, 2815, 14771,8435, 14773,14774,14775,14784,14787,14789,14791,14792,5611, 14793,14794,14797,14800, - 14802,5005, 2193, 317, 14806,637, 637, 14772,371, 6923, 2116, 317, 317, 367, 12144,14776,2156, 14777,317, 14779,317, 1160, 332, 365, 9575, 317, 5223, - 14778,14780,317, 317, 317, 14781,317, 317, 317, 14783,317, 1830, 317, 317, 317, 317, 14782,14785,14786,14788,7622, 371, 317, 317, 14790,9244, 363, + 14802,5005, 2193, 317, 14806,637, 637, 14772,371, 6923, 2116, 317, 317, 367, 12144,14776,2156, 14777,317, 14779,317, 1160, 332, 365, 9575, 317, 5223, + 14778,14780,317, 317, 317, 14781,317, 317, 317, 14783,317, 1830, 317, 317, 317, 317, 14782,14785,14786,14788,7622, 371, 317, 317, 14790,9244, 363, 317, 351, 332, 371, 2117, 2117, 14795,317, 14796,5825, 317, 14798,14799,317, 2193, 371, 14801,2317, 317, 11198,2271, 363, 14803,2553, 363, 2222, 14804, 14805,4943, 14808,14811,14817,14818,14823,6954, 362, 14836,14837,565, 343, 14809,317, 14810,14812,11855,14815,7143, 2211, 5571, 14813,356, 14810,14814,14816, - 10619,2178, 5439, 317, 6402, 5425, 381, 14819,14821,14822,427, 317, 14820,317, 371, 3284, 14824,14827,14830,362, 14831,9289, 14833,6206, 14476,14825,317, - 11709,14826,14828,14829,990, 439, 14832,14834,14835,14839,14840,14843,12155,350, 14853,14859,12598,14862,14864,14865,14866,14870,14872,14873,14882,317, 317, + 10619,2178, 5439, 317, 6402, 5425, 381, 14819,14821,14822,427, 317, 14820,317, 371, 3284, 14824,14827,14830,362, 14831,9289, 14833,6206, 14476,14825,317, + 11709,14826,14828,14829,990, 439, 14832,14834,14835,14839,14840,14843,12155,350, 14853,14859,12598,14862,14864,14865,14866,14870,14872,14873,14882,317, 317, 350, 370, 317, 317, 14841,14842,608, 317, 317, 5538, 363, 490, 14844,9938, 14845,2391, 317, 317, 14846,14848,14847,7592, 501, 350, 14849,343, 14850, - 14851,14852,14854,362, 5179, 14855,14856,14857,14858,343, 5447, 2024, 1345, 14860,14861,404, 14863,14867,317, 317, 317, 5295, 14868,14869,14871,384, 427, + 14851,14852,14854,362, 5179, 14855,14856,14857,14858,343, 5447, 2024, 1345, 14860,14861,404, 14863,14867,317, 317, 317, 5295, 14868,14869,14871,384, 427, 370, 428, 363, 14874,14444,14878,14879,2271, 14880,12423,14875,14876,14877,14881,2036, 428, 1060, 14883,7428, 14885,14887,14572,14889,14893,14897,14899,13273, - 14900,14902,515, 14903,14906,14911,396, 11128,317, 14886,14888,466, 1453, 350, 317, 14890,14891,14892,7428, 351, 4965, 343, 363, 4965, 343, 4965, 466, + 14900,14902,515, 14903,14906,14911,396, 11128,317, 14886,14888,466, 1453, 350, 317, 14890,14891,14892,7428, 351, 4965, 343, 363, 4965, 343, 4965, 466, 343, 2310, 14894,14895,317, 14896,14898,4280, 317, 1358, 2410, 350, 350, 553, 14901,2108, 317, 382, 2108, 317, 11242,350, 317, 1109, 350, 317, 14904, 490, 14905,390, 14907,2171, 2219, 363, 14909,317, 14908,317, 5896, 14223,14910,419, 9182, 14912,419, 350, 350, 9909, 4738, 1033, 14915,14921,14926,14931, 14934,14937,14939,14940,14941,7473, 12417,14942,450, 14916,1999, 1345, 14917,317, 14919,14920,14918,317, 370, 5003, 14922,363, 363, 14923,949, 317, 14924, - 3284, 14925,317, 9768, 317, 490, 14927,5223, 11769,14928,14929,14930,10543,5309, 363, 14932,14933,12422,317, 12294,317, 5570, 317, 7142, 14935,14936,362, + 3284, 14925,317, 9768, 317, 490, 14927,5223, 11769,14928,14929,14930,10543,5309, 363, 14932,14933,12422,317, 12294,317, 5570, 317, 7142, 14935,14936,362, 5624, 1347, 317, 14938,317, 6651, 351, 351, 351, 2004, 536, 317, 4925, 490, 3284, 317, 3361, 14943,317, 317, 12154,317, 14945,362, 14947,14949,14950, - 14953,14954,14958,14960,317, 14961,317, 317, 380, 317, 14946,381, 370, 363, 11236,363, 14948,317, 8214, 439, 490, 339, 14951,12886,14952,10907,5662, - 501, 5663, 4965, 350, 14955,350, 1194, 14956,5223, 317, 317, 14957,11709,317, 12668,14959,1347, 12696,4738, 362, 317, 317, 14962,14963,14964,2211, 343, + 14953,14954,14958,14960,317, 14961,317, 317, 380, 317, 14946,381, 370, 363, 11236,363, 14948,317, 8214, 439, 490, 339, 14951,12886,14952,10907,5662, + 501, 5663, 4965, 350, 14955,350, 1194, 14956,5223, 317, 317, 14957,11709,317, 12668,14959,1347, 12696,4738, 362, 317, 317, 14962,14963,14964,2211, 343, 317, 1347, 2590, 343, 14966,14971,14973,14984,1020, 551, 14967,466, 3869, 317, 590, 317, 14968,317, 14969,5911, 317, 14970,14972,5487, 1451, 317, 14974, 7866, 14975,550, 14977,14983,1998, 1998, 14976,14978,14979,317, 590, 373, 14980,14981,14982,9319, 14981,5105, 10946,317, 14986,317, 332, 14988,371, 14987, 317, 2155, 8296, 14990,7866, 4962, 14992,4965, 2222, 317, 317, 14991,332, 1943, 14994,390, 14997,15004,1109, 350, 15012,15023,15024,362, 15031,15032,15036, 15043,15048,1020, 15049,15051,332, 14995,14996,317, 317, 317, 2222, 345, 343, 317, 14998,516, 15000,15001,370, 362, 2571, 15002,1020, 317, 317, 15003, - 11607,317, 14999,1345, 381, 1992, 6370, 317, 7651, 11933,1194, 317, 15005,15006,15007,15011,2541, 14062,4984, 7698, 350, 1194, 1347, 15008,15009,345, 317, - 15010,7791, 317, 345, 363, 10592,15013,317, 15014,317, 15018,15019,350, 317, 15015,15017,15016,351, 15020,351, 15021,15022,15025,5626, 15026,15028,362, - 15029,317, 15030,1453, 1999, 356, 6355, 1347, 317, 317, 15027,390, 4965, 2222, 11678,317, 317, 13715,317, 317, 2086, 15033,317, 1020, 332, 15034,1160, + 11607,317, 14999,1345, 381, 1992, 6370, 317, 7651, 11933,1194, 317, 15005,15006,15007,15011,2541, 14062,4984, 7698, 350, 1194, 1347, 15008,15009,345, 317, + 15010,7791, 317, 345, 363, 10592,15013,317, 15014,317, 15018,15019,350, 317, 15015,15017,15016,351, 15020,351, 15021,15022,15025,5626, 15026,15028,362, + 15029,317, 15030,1453, 1999, 356, 6355, 1347, 317, 317, 15027,390, 4965, 2222, 11678,317, 317, 13715,317, 317, 2086, 15033,317, 1020, 332, 15034,1160, 15035,490, 317, 351, 15037,541, 15041,5619, 15038,5838, 15039,15040,1347, 5355, 356, 15042,15044,15045,363, 317, 15047,15046,15050,15053,15054,351, 15068, 15071,11709,15072,15075,4976, 350, 317, 1331, 349, 15055,15060,15062,15064,15065,345, 15067,365, 3361, 15056,15059,317, 15057,1325, 15058,5399, 317, 15061, 317, 2222, 362, 317, 317, 390, 15063,15066,530, 15069,15070,15073,12731,15074,15076,5173, 15078,5054, 14132,15102,15119,15131,15133,15144,15147,15154,15157, - 15158,15168,15170,15176,15180,15181,3987, 15187,15188,15079,15083,15085,1588, 15087,15088,15089,15091,15093,15094,15095,15096,10626,15080,317, 15081,15082,332, + 15158,15168,15170,15176,15180,15181,3987, 15187,15188,15079,15083,15085,1588, 15087,15088,15089,15091,15093,15094,15095,15096,10626,15080,317, 15081,15082,332, 15084,9644, 15086,3688, 2537, 5428, 317, 5439, 317, 15090,15092,15097,15101,15098,15099,15100,317, 489, 490, 15103,15105,15106,15109,15110,7871, 15113,15114, - 15115,15116,317, 15104,6713, 748, 15107,15108,317, 317, 883, 15111,15112,1000, 317, 3529, 740, 362, 15117,15118,317, 15120,317, 15122,15124,15125,362, + 15115,15116,317, 15104,6713, 748, 15107,15108,317, 317, 883, 15111,15112,1000, 317, 3529, 740, 362, 15117,15118,317, 15120,317, 15122,15124,15125,362, 15126,5159, 15127,15128,15129,15130,15121,553, 530, 15123,2369, 476, 5439, 5897, 2368, 317, 633, 317, 3652, 317, 12575,7668, 15132,578, 11339,2156, 15134, 15138,6255, 15139,343, 6420, 3422, 7688, 15135,15137,15136,15140,15142,15143,15141,5570, 12846,427, 1444, 15145,15146,2060, 15148,15149,15151,15152,380, 15153, - 15150,351, 6598, 5819, 381, 317, 317, 317, 5862, 317, 317, 15155,5570, 15156,5120, 3572, 8296, 15159,15161,15164,7192, 15165,15166,15160,590, 5105, 490, - 15162,317, 317, 15163,5037, 317, 371, 8367, 9624, 1992, 3987, 15167,6294, 7368, 15169,320, 3599, 317, 15171,10946,15172,15173,15175,317, 15174,15177,363, + 15150,351, 6598, 5819, 381, 317, 317, 317, 5862, 317, 317, 15155,5570, 15156,5120, 3572, 8296, 15159,15161,15164,7192, 15165,15166,15160,590, 5105, 490, + 15162,317, 317, 15163,5037, 317, 371, 8367, 9624, 1992, 3987, 15167,6294, 7368, 15169,320, 3599, 317, 15171,10946,15172,15173,15175,317, 15174,15177,363, 2323, 589, 15178,15179,11388,6402, 490, 1078, 317, 15182,15184,15183,15185,15186,365, 10480,15190,15197,15198,1325, 350, 15199,15205,466, 741, 15206,15228, - 15229,15236,15239,15240,15241,15242,15245,15261,15263,15191,15192,2571, 362, 15194,15196,6420, 15193,317, 15195,5942, 317, 633, 2058, 1347, 384, 343, 2156, + 15229,15236,15239,15240,15241,15242,15245,15261,15263,15191,15192,2571, 362, 15194,15196,6420, 15193,317, 15195,5942, 317, 633, 2058, 1347, 384, 343, 2156, 382, 317, 15200,15201,15203,343, 388, 317, 450, 15202,370, 7949, 490, 15204,15207,15208,15211,15212,15213,15214,15215,15218,15219,385, 15222,350, 15227, 373, 350, 356, 15209,15210,393, 1020, 317, 317, 3125, 5223, 1347, 10878,390, 15216,15217,4268, 412, 15220,15221,6729, 9081, 317, 12928,13327,15223,15226, - 15224,6736, 15225,10022,2758, 363, 15230,15232,15235,466, 317, 5840, 317, 15231,317, 15233,6996, 320, 10877,15234,7408, 8047, 15237,15238,2156, 5849, 404, + 15224,6736, 15225,10022,2758, 363, 15230,15232,15235,466, 317, 5840, 317, 15231,317, 15233,6996, 320, 10877,15234,7408, 8047, 15237,15238,2156, 5849, 404, 5037, 2077, 317, 317, 5037, 345, 317, 357, 317, 351, 343, 345, 317, 317, 389, 362, 427, 8304, 12142,317, 15243,15244,466, 317, 15246,11709,15247, 15248,15249,15250,3075, 10487,363, 15254,15259,427, 370, 317, 362, 5676, 317, 1347, 382, 317, 15251,15252,15253,317, 6228, 343, 362, 15255,317, 15256, 15257,15258,317, 633, 15260,362, 317, 15262,2533, 15265,15272,15266,15267,15268,15269,15270,15271,351, 466, 343, 15274,15275,15277,15278,15286,15298,15309, - 15316,15320,15321,15327,15329,15331,15339,15359,12994,15361,15370,15376,15379,10081,15381,15383,5423, 11055,5423, 317, 1347, 317, 15276,317, 317, 363, 9914, + 15316,15320,15321,15327,15329,15331,15339,15359,12994,15361,15370,15376,15379,10081,15381,15383,5423, 11055,5423, 317, 1347, 317, 15276,317, 317, 363, 9914, 15279,371, 15280,15281,15283,381, 15282,511, 317, 317, 15284,15285,1347, 15287,596, 10085,317, 2022, 350, 15295,15297,11144,15288,15289,15292,317, 10471, - 332, 363, 381, 15290,5840, 15291,15293,466, 15294,317, 11229,2272, 15296,317, 428, 2272, 15299,15300,363, 15303,317, 15306,362, 15308,317, 317, 317, - 2001, 317, 15301,427, 15302,15304,2155, 15305,439, 15307,6993, 15310,15312,15313,741, 12564,2271, 1347, 15314,6555, 12982,317, 15282,15311,393, 317, 3529, + 332, 363, 381, 15290,5840, 15291,15293,466, 15294,317, 11229,2272, 15296,317, 428, 2272, 15299,15300,363, 15303,317, 15306,362, 15308,317, 317, 317, + 2001, 317, 15301,427, 15302,15304,2155, 15305,439, 15307,6993, 15310,15312,15313,741, 12564,2271, 1347, 15314,6555, 12982,317, 15282,15311,393, 317, 3529, 15315,2261, 426, 317, 15317,382, 317, 2291, 15318,6228, 317, 15108,490, 5184, 15319,15322,15324,4984, 15326,15323,15325,3284, 5836, 15328,3999, 5663, 15330, 545, 15332,15333,15334,15335,5662, 317, 15337,15338,317, 363, 5662, 317, 317, 15336,427, 412, 15340,15342,396, 15344,317, 15346,15347,15348,15352,15355, 15357,2590, 15341,317, 339, 15343,15345,381, 490, 15349,365, 15350,15351,15353,15354,11442,317, 15356,15358,3284, 371, 1108, 339, 317, 15360,15362,15363, 15366,15368,5325, 2416, 317, 332, 15364,15365,6704, 332, 490, 490, 7668, 15367,332, 317, 380, 6402, 2612, 317, 332, 15369,6195, 10422,10877,317, 15371, 471, 15372,317, 382, 365, 15374,15375,15373,390, 15377,15378,343, 350, 363, 317, 3284, 396, 15380,317, 2004, 317, 8959, 1481, 1108, 15382,8274, 11280, 317, 490, 5033, 15385,15389,15395,15396,332, 15398,15400,5217, 15401,15404,15405,15407,15410,15422,15428,371, 317, 15386,990, 332, 15387,15388,15390,15392, - 5611, 15394,15391,501, 5033, 5570, 15393,3505, 6228, 317, 6769, 5866, 317, 5836, 380, 362, 317, 317, 12487,15397,363, 1194, 1033, 1033, 380, 345, 317, - 381, 15399,317, 15402,15403,356, 9170, 7242, 5836, 317, 9020, 15406,15408,15409,317, 3292, 2832, 15411,2077, 15413,15418,15420,15421,362, 363, 345, 7438, - 539, 317, 15412,9657, 317, 317, 15414,15417,317, 317, 15415,15416,11965,15419,371, 4965, 382, 2074, 6036, 1020, 15423,15425,15426,426, 2391, 15424,317, + 5611, 15394,15391,501, 5033, 5570, 15393,3505, 6228, 317, 6769, 5866, 317, 5836, 380, 362, 317, 317, 12487,15397,363, 1194, 1033, 1033, 380, 345, 317, + 381, 15399,317, 15402,15403,356, 9170, 7242, 5836, 317, 9020, 15406,15408,15409,317, 3292, 2832, 15411,2077, 15413,15418,15420,15421,362, 363, 345, 7438, + 539, 317, 15412,9657, 317, 317, 15414,15417,317, 317, 15415,15416,11965,15419,371, 4965, 382, 2074, 6036, 1020, 15423,15425,15426,426, 2391, 15424,317, 317, 363, 7785, 371, 15427,317, 5942, 633, 362, 428, 2193, 5810, 7127, 15430,15434,15440,7618, 15442,15446,12598,15449,15450,15452,15453,15454,15475,15478, - 15481,317, 15431,15432,15433,15435,15436,15437,317, 15438,317, 965, 15439,419, 1347, 15441,15443,15444,332, 6449, 317, 351, 332, 15445,1030, 15447,362, - 14822,396, 3987, 317, 380, 15448,2290, 15451,317, 345, 5038, 345, 5828, 2024, 9702, 15455,419, 15456,15460,15462,15467,15470,3987, 317, 427, 6179, 5439, - 317, 2381, 15457,11473,15458,317, 15459,15461,15463,15465,15466,15464,365, 13233,15468,466, 317, 15469,1347, 317, 5961, 393, 15471,15472,6278, 2181, 2272, + 15481,317, 15431,15432,15433,15435,15436,15437,317, 15438,317, 965, 15439,419, 1347, 15441,15443,15444,332, 6449, 317, 351, 332, 15445,1030, 15447,362, + 14822,396, 3987, 317, 380, 15448,2290, 15451,317, 345, 5038, 345, 5828, 2024, 9702, 15455,419, 15456,15460,15462,15467,15470,3987, 317, 427, 6179, 5439, + 317, 2381, 15457,11473,15458,317, 15459,15461,15463,15465,15466,15464,365, 13233,15468,466, 317, 15469,1347, 317, 5961, 393, 15471,15472,6278, 2181, 2272, 2551, 356, 15473,317, 439, 15474,317, 15476,15477,15479,15480,15482,15484,15487,15496,351, 15505,15507,15516,15519,15520,15537,15544,15554,15556,15586,15589, 15601,15603,15604,15605,15485,15486,2521, 15488,15492,317, 15493,15489,15490,15491,317, 14144,15494,15495,15497,15499,15501,343, 15502,15503,15498,15500,15504, 12799,15506,551, 551, 15508,345, 15511,343, 15514,15509,15510,15512,362, 2222, 317, 15513,15515,317, 15517,15518,15521,390, 15522,15524,15528,15529,15531, 15532,15533,14062,345, 2219, 317, 15523,3999, 317, 15525,9244, 15527,317, 317, 15526,351, 15530,351, 15534,363, 15535,15536,4984, 15538,15541,15539,15540, 15542,15543,15545,15546,15547,15548,5394, 3999, 317, 8544, 5991, 466, 2571, 317, 317, 15549,15553,317, 15550,15551,15552,345, 379, 15555,4268, 363, 15557, - 15558,15561,15562,15566,396, 15567,15575,343, 15576,15577,15580,15582,15583,404, 3284, 10471,15559,345, 15560,12494,317, 15563,15504,15564,363, 2156, 6002, + 15558,15561,15562,15566,396, 15567,15575,343, 15576,15577,15580,15582,15583,404, 3284, 10471,15559,345, 15560,12494,317, 15563,15504,15564,363, 2156, 6002, 15565,9319, 15568,15572,15574,9319, 15569,317, 317, 15570,15571,2272, 15573,317, 2272, 317, 2073, 439, 350, 15578,15579,15509,317, 5037, 10854,317, 15581, 2271, 381, 605, 317, 15584,15585,317, 2058, 490, 2022, 362, 15587,404, 11089,427, 15588,15590,15592,15594,15597,15598,2086, 437, 343, 3987, 15591,15593, - 373, 317, 317, 15595,381, 15596,2610, 2236, 317, 10376,317, 15599,317, 15600,15602,7490, 2058, 317, 3079, 11709,362, 317, 6808, 15607,15609,15610,363, - 15608,317, 490, 380, 317, 365, 317, 4984, 317, 343, 317, 317, 15612,15613,15614,15617,3023, 15622,15625,350, 15626,15632,15634,15635,15636,15638,2402, - 350, 350, 317, 1325, 350, 384, 2117, 363, 15615,6917, 15616,6021, 390, 390, 2108, 317, 15618,1347, 15619,317, 317, 15620,362, 15621,317, 2553, 5851, - 428, 15623,15624,1160, 1992, 15627,7389, 370, 345, 15628,15629,317, 345, 317, 317, 6420, 317, 317, 317, 371, 15630,317, 15631,15633,12696,345, 4944, - 380, 363, 466, 363, 351, 350, 15637,3884, 9175, 343, 13914,15640,466, 2022, 362, 15642,15644,6412, 10467,2222, 317, 317, 380, 15641,317, 15643,381, + 373, 317, 317, 15595,381, 15596,2610, 2236, 317, 10376,317, 15599,317, 15600,15602,7490, 2058, 317, 3079, 11709,362, 317, 6808, 15607,15609,15610,363, + 15608,317, 490, 380, 317, 365, 317, 4984, 317, 343, 317, 317, 15612,15613,15614,15617,3023, 15622,15625,350, 15626,15632,15634,15635,15636,15638,2402, + 350, 350, 317, 1325, 350, 384, 2117, 363, 15615,6917, 15616,6021, 390, 390, 2108, 317, 15618,1347, 15619,317, 317, 15620,362, 15621,317, 2553, 5851, + 428, 15623,15624,1160, 1992, 15627,7389, 370, 345, 15628,15629,317, 345, 317, 317, 6420, 317, 317, 317, 371, 15630,317, 15631,15633,12696,345, 4944, + 380, 363, 466, 363, 351, 350, 15637,3884, 9175, 343, 13914,15640,466, 2022, 362, 15642,15644,6412, 10467,2222, 317, 317, 380, 15641,317, 15643,381, 15645,15646,15648,15652,15659,4952, 15662,15664,15668,15670,6089, 15673,15674,15675,15676,15677,15683,427, 15684,15685,651, 15649,15650,15651,15653,15654,15655, - 15656,15657,15658,11881,15660,15661,317, 317, 343, 15663,317, 15665,15666,404, 15667,317, 15669,1347, 317, 10820,15671,15672,5538, 390, 363, 5055, 317, + 15656,15657,15658,11881,15660,15661,317, 317, 343, 15663,317, 15665,15666,404, 15667,317, 15669,1347, 317, 10820,15671,15672,5538, 390, 363, 5055, 317, 7389, 9521, 2067, 1347, 404, 15678,15679,4280, 15681,363, 350, 317, 380, 343, 15680,317, 15682,4965, 9557, 15687,15688,15689,362, 15690,3987, 2108, 15691, 317, 408, 317, 11533,362, 11198,4925, 565, 14991,343, 949, 382, 317, 8178, 428, 317, 7916, 6322, 15693,15702,15694,15695,15696,15697,15698,15699,15700, 15701,15703,15706,15708,41, 15927,15928,42, 370, 43, 16240,332, 44, 16417,345, 45, 404, 16509,16523,15704,4023, 15705,15707,15709,15710,15711,15712, 15714,15717,15735,15755,15759,15760,15765,15773,317, 15791,15793,15795,15807,393, 965, 317, 15854,15871,15882,15902,15911,5862, 15914,15917,317, 2108, 15713, - 363, 3648, 317, 15715,373, 339, 554, 15716,11539,345, 5255, 404, 10012,317, 15718,15721,15722,15723,466, 15726,1347, 317, 13174,15719,15720,11442,317, - 8049, 332, 317, 397, 3987, 317, 351, 15724,343, 362, 317, 380, 15725,8023, 15727,15731,15732,362, 15733,317, 363, 15728,15729,15730,317, 5977, 317, - 7055, 9914, 317, 1347, 390, 15734,320, 339, 15736,15737,15739,15740,554, 15741,15743,11236,15745,363, 12719,2391, 15746,15749,15750,15751,7590, 9809, 317, + 363, 3648, 317, 15715,373, 339, 554, 15716,11539,345, 5255, 404, 10012,317, 15718,15721,15722,15723,466, 15726,1347, 317, 13174,15719,15720,11442,317, + 8049, 332, 317, 397, 3987, 317, 351, 15724,343, 362, 317, 380, 15725,8023, 15727,15731,15732,362, 15733,317, 363, 15728,15729,15730,317, 5977, 317, + 7055, 9914, 317, 1347, 390, 15734,320, 339, 15736,15737,15739,15740,554, 15741,15743,11236,15745,363, 12719,2391, 15746,15749,15750,15751,7590, 9809, 317, 15738,317, 363, 5862, 317, 317, 6598, 551, 574, 15742,362, 382, 390, 317, 2108, 317, 15744,317, 15747,15748,605, 351, 6996, 15752,317, 6089, 15753, 15754,15756,11089,565, 317, 15757,15758,12109,362, 15761,404, 15763,15764,317, 343, 332, 15762,317, 1999, 356, 3999, 317, 427, 317, 15766,350, 15767, - 2022, 15768,5616, 1347, 317, 15769,15770,15771,15772,15774,317, 15775,317, 15776,15787,15788,356, 466, 317, 6089, 317, 370, 2024, 343, 7582, 317, 551, - 15777,2081, 15779,15780,2571, 15781,15334,15785,317, 393, 15778,339, 412, 15782,427, 15783,15784,15786,13071,596, 356, 1526, 15789,362, 15790,15792,2387, + 2022, 15768,5616, 1347, 317, 15769,15770,15771,15772,15774,317, 15775,317, 15776,15787,15788,356, 466, 317, 6089, 317, 370, 2024, 343, 7582, 317, 551, + 15777,2081, 15779,15780,2571, 15781,15334,15785,317, 393, 15778,339, 412, 15782,427, 15783,15784,15786,13071,596, 356, 1526, 15789,362, 15790,15792,2387, 466, 343, 4976, 8023, 317, 9624, 362, 317, 317, 370, 15794,317, 370, 350, 15796,15798,12815,13392,15802,15803,12565,363, 2067, 6046, 15805,3987, 15797, - 9244, 5428, 351, 15799,15800,15801,15804,2117, 15806,15808,15810,15818,15835,2024, 15836,15837,15838,15840,15843,15845,15846,15851,427, 11236,317, 15809,6600, + 9244, 5428, 351, 15799,15800,15801,15804,2117, 15806,15808,15810,15818,15835,2024, 15836,15837,15838,15840,15843,15845,15846,15851,427, 11236,317, 15809,6600, 317, 4943, 15811,15812,15816,317, 317, 3751, 5571, 2322, 5439, 2537, 2521, 15813,15814,15815,1915, 2272, 15817,15819,15820,15824,15826,362, 15827,15829,14263, - 15832,317, 2310, 15834,317, 317, 345, 15821,15822,317, 317, 2058, 317, 15823,10560,10560,317, 1347, 382, 15825,15828,317, 15830,317, 15831,3529, 317, - 1018, 317, 317, 317, 317, 317, 317, 317, 317, 2521, 15833,11245,426, 6996, 317, 2271, 3284, 317, 317, 317, 363, 1033, 317, 331, 396, 362, 5022, + 15832,317, 2310, 15834,317, 317, 345, 15821,15822,317, 317, 2058, 317, 15823,10560,10560,317, 1347, 382, 15825,15828,317, 15830,317, 15831,3529, 317, + 1018, 317, 317, 317, 317, 317, 317, 317, 317, 2521, 15833,11245,426, 6996, 317, 2271, 3284, 317, 317, 317, 363, 1033, 317, 331, 396, 362, 5022, 1358, 15839,351, 15841,15842,5332, 12696,15844,15738,427, 371, 362, 1992, 15847,741, 12556,7672, 5332, 15850,15848,427, 15849,356, 11245,363, 426, 11245, - 351, 2024, 15852,5661, 350, 363, 317, 15853,370, 15855,15856,9624, 15857,15859,15863,2402, 1044, 15865,15870,3987, 317, 5956, 390, 605, 15858,350, 2510, + 351, 2024, 15852,5661, 350, 363, 317, 15853,370, 15855,15856,9624, 15857,15859,15863,2402, 1044, 15865,15870,3987, 317, 5956, 390, 605, 15858,350, 2510, 1347, 351, 15860,5538, 317, 15861,15862,15864,551, 15866,9624, 15868,3987, 317, 7990, 380, 15571,317, 15867,317, 15869,12277,317, 363, 15872,371, 15874, 15875,1194, 7940, 15878,317, 13023,317, 15873,15876,15877,15879,363, 363, 15880,363, 317, 15881,15883,317, 4965, 15886,4591, 15888,6600, 15889,343, 15900, 15884,345, 351, 15885,490, 317, 15887,15890,317, 4965, 15892,466, 15893,15899,15891,371, 2219, 15894,7618, 2310, 15895,15896,15897,15898,15901,15903,15904, - 15910,2110, 5611, 356, 490, 317, 317, 15905,370, 15907,15908,15909,15906,1018, 740, 317, 6228, 621, 317, 317, 370, 351, 15912,2222, 15913,466, 317, - 8301, 501, 4965, 15915,15916,317, 404, 363, 351, 15221,363, 15918,15921,6917, 15924,15925,15919,317, 15920,317, 13392,15922,15923,317, 317, 8214, 1358, + 15910,2110, 5611, 356, 490, 317, 317, 15905,370, 15907,15908,15909,15906,1018, 740, 317, 6228, 621, 317, 317, 370, 351, 15912,2222, 15913,466, 317, + 8301, 501, 4965, 15915,15916,317, 404, 363, 351, 15221,363, 15918,15921,6917, 15924,15925,15919,317, 15920,317, 13392,15922,15923,317, 317, 8214, 1358, 5862, 3284, 15510,15926,317, 343, 637, 332, 4965, 317, 317, 15929,15972,15974,15985,15990,1481, 15995,16000,16004,553, 16025,16026,16033,363, 16060,16061, - 16072,16083,16086,16091,16097,16099,7857, 15930,15937,317, 15953,15954,15955,15962,15969,15970,15931,15933,362, 15935,390, 15936,317, 15932,363, 15934,317, + 16072,16083,16086,16091,16097,16099,7857, 15930,15937,317, 15953,15954,15955,15962,15969,15970,15931,15933,362, 15935,390, 15936,317, 15932,363, 15934,317, 15938,6326, 15939,15943,15944,3999, 10487,385, 317, 15946,6736, 15952,373, 343, 1230, 15940,15942,15941,380, 6420, 317, 15945,6598, 15947,15948,15949,15950, 15951,317, 5891, 1031, 15956,356, 15957,5911, 15959,15960,15958,15961,15963,15964,8136, 15966,2571, 317, 15967,317, 373, 15965,1992, 381, 15968,15971,15973, - 5241, 2004, 15975,15979,363, 15976,15978,363, 350, 11040,15977,380, 380, 363, 6831, 317, 15980,15982,15983,15984,317, 15981,317, 9914, 9012, 439, 370, - 15986,15987,15989,2402, 605, 317, 11702,5213, 317, 15988,6046, 966, 15991,15992,15993,4952, 362, 317, 317, 1358, 15994,317, 1078, 363, 7231, 466, 7073, - 363, 317, 8367, 466, 317, 15996,15998,362, 15999,539, 15997,16001,2590, 2222, 16002,16003,16005,351, 2272, 12316,362, 16008,16009,16010,16011,883, 390, - 16006,2348, 317, 16007,7600, 9012, 13686,439, 466, 9450, 466, 390, 10471,350, 16012,16014,13607,16019,16022,6596, 466, 16023,16013,390, 6191, 16015,317, + 5241, 2004, 15975,15979,363, 15976,15978,363, 350, 11040,15977,380, 380, 363, 6831, 317, 15980,15982,15983,15984,317, 15981,317, 9914, 9012, 439, 370, + 15986,15987,15989,2402, 605, 317, 11702,5213, 317, 15988,6046, 966, 15991,15992,15993,4952, 362, 317, 317, 1358, 15994,317, 1078, 363, 7231, 466, 7073, + 363, 317, 8367, 466, 317, 15996,15998,362, 15999,539, 15997,16001,2590, 2222, 16002,16003,16005,351, 2272, 12316,362, 16008,16009,16010,16011,883, 390, + 16006,2348, 317, 16007,7600, 9012, 13686,439, 466, 9450, 466, 390, 10471,350, 16012,16014,13607,16019,16022,6596, 466, 16023,16013,390, 6191, 16015,317, 16016,16017,9012, 2108, 4949, 6204, 16018,14835,16020,16021,16024,439, 343, 7582, 363, 332, 16027,16030,6917, 350, 16032,317, 16028,16029,404, 16031,16034, - 16035,16036,16041,16042,16045,7647, 16047,10625,16054,16055,317, 2021, 16037,16038,16040,363, 317, 633, 317, 1160, 16039,317, 317, 439, 317, 317, 362, - 317, 317, 16043,343, 16044,16046,16048,16049,16053,363, 553, 345, 362, 16050,317, 16051,16052,371, 382, 380, 4738, 362, 317, 16056,2388, 16057,543, - 363, 4980, 16058,317, 16059,16062,16064,1031, 7865, 16065,16068,2087, 16070,2222, 16063,317, 9938, 10820,16066,351, 363, 16067,2222, 5836, 16069,16071,317, + 16035,16036,16041,16042,16045,7647, 16047,10625,16054,16055,317, 2021, 16037,16038,16040,363, 317, 633, 317, 1160, 16039,317, 317, 439, 317, 317, 362, + 317, 317, 16043,343, 16044,16046,16048,16049,16053,363, 553, 345, 362, 16050,317, 16051,16052,371, 382, 380, 4738, 362, 317, 16056,2388, 16057,543, + 363, 4980, 16058,317, 16059,16062,16064,1031, 7865, 16065,16068,2087, 16070,2222, 16063,317, 9938, 10820,16066,351, 363, 16067,2222, 5836, 16069,16071,317, 350, 362, 363, 16073,16074,317, 16076,16079,317, 332, 2272, 490, 1999, 16075,1444, 501, 16077,317, 16078,317, 6228, 13670,9938, 4984, 16080,16081,16082, - 351, 380, 16084,16085,551, 16087,16089,317, 380, 16088,448, 317, 317, 317, 317, 16090,16092,16093,16094,7401, 8976, 7477, 16095,404, 317, 317, 6123, + 351, 380, 16084,16085,551, 16087,16089,317, 380, 16088,448, 317, 317, 317, 317, 16090,16092,16093,16094,7401, 8976, 7477, 16095,404, 317, 317, 6123, 16096,350, 2510, 16098,16100,16003,16101,16103,16104,373, 317, 5836, 343, 16102,317, 490, 3284, 16105,16108,16113,16116,16122,16144,16149,16169,16170,16171, - 16178,16182,16200,16201,16213,343, 16236,16237,16106,16107,348, 363, 16109,16111,3505, 1266, 317, 317, 317, 317, 4980, 317, 317, 317, 317, 332, 317, - 317, 317, 16110,317, 317, 317, 1358, 317, 490, 16112,317, 6089, 16114,16115,7805, 382, 5328, 16117,16118,317, 317, 16119,7401, 16121,362, 12565,4980, + 16178,16182,16200,16201,16213,343, 16236,16237,16106,16107,348, 363, 16109,16111,3505, 1266, 317, 317, 317, 317, 4980, 317, 317, 317, 317, 332, 317, + 317, 317, 16110,317, 317, 317, 1358, 317, 490, 16112,317, 6089, 16114,16115,7805, 382, 5328, 16117,16118,317, 317, 16119,7401, 16121,362, 12565,4980, 9864, 15130,317, 16120,317, 381, 317, 11616,9170, 380, 16123,16124,16134,343, 16140,16142,3075, 404, 3987, 590, 16125,16126,16132,3987, 16127,16130,16131, - 16128,16129,350, 4943, 11089,16133,16135,16136,554, 466, 11236,5809, 7688, 317, 317, 16136,16137,362, 5464, 3075, 1347, 16138,16139,7688, 317, 11783,1358, - 16141,16143,5537, 1358, 16145,350, 380, 8083, 16147,16148,1358, 339, 16146,5991, 10877,370, 317, 363, 343, 317, 317, 490, 317, 5661, 343, 317, 404, - 16150,2610, 16158,16160,16165,5241, 16166,16167,317, 13032,16151,16155,317, 16152,2509, 404, 16153,317, 16154,343, 1347, 16156,317, 16157,16159,362, 317, - 362, 450, 317, 427, 5043, 317, 392, 16161,317, 8023, 16162,379, 16163,370, 362, 2571, 363, 2260, 3987, 5487, 317, 381, 16164,1109, 9244, 339, 351, - 16168,16172,5035, 16173,8296, 15118,317, 5159, 16174,16177,16175,317, 16176,343, 5324, 936, 317, 1020, 990, 16179,9624, 543, 2022, 16180,16181,990, 5991, - 466, 351, 16183,16188,16190,16191,16194,16195,12454,317, 16198,16199,381, 12590,16184,16185,317, 16186,16187,16189,380, 350, 3751, 10223,490, 565, 317, - 317, 317, 16192,351, 13863,16193,343, 362, 317, 15027,356, 317, 1992, 4980, 390, 10561,345, 16196,6415, 5661, 11195,317, 16197,9624, 2022, 363, 342, - 490, 1078, 16202,9261, 16204,16206,16207,363, 16208,16210,6318, 363, 16203,317, 345, 1358, 16205,2271, 317, 2271, 5230, 317, 370, 317, 363, 370, 363, - 16209,363, 10820,317, 351, 13766,16211,16212,317, 317, 16214,16219,317, 389, 16221,16223,2503, 16224,16227,317, 363, 16215,490, 16216,317, 16217,1358, - 16218,16220,16222,317, 5159, 1347, 16225,363, 16226,317, 16228,16230,16232,343, 362, 16234,16235,6600, 363, 16229,370, 1358, 1160, 16231,363, 16233,9557, + 16128,16129,350, 4943, 11089,16133,16135,16136,554, 466, 11236,5809, 7688, 317, 317, 16136,16137,362, 5464, 3075, 1347, 16138,16139,7688, 317, 11783,1358, + 16141,16143,5537, 1358, 16145,350, 380, 8083, 16147,16148,1358, 339, 16146,5991, 10877,370, 317, 363, 343, 317, 317, 490, 317, 5661, 343, 317, 404, + 16150,2610, 16158,16160,16165,5241, 16166,16167,317, 13032,16151,16155,317, 16152,2509, 404, 16153,317, 16154,343, 1347, 16156,317, 16157,16159,362, 317, + 362, 450, 317, 427, 5043, 317, 392, 16161,317, 8023, 16162,379, 16163,370, 362, 2571, 363, 2260, 3987, 5487, 317, 381, 16164,1109, 9244, 339, 351, + 16168,16172,5035, 16173,8296, 15118,317, 5159, 16174,16177,16175,317, 16176,343, 5324, 936, 317, 1020, 990, 16179,9624, 543, 2022, 16180,16181,990, 5991, + 466, 351, 16183,16188,16190,16191,16194,16195,12454,317, 16198,16199,381, 12590,16184,16185,317, 16186,16187,16189,380, 350, 3751, 10223,490, 565, 317, + 317, 317, 16192,351, 13863,16193,343, 362, 317, 15027,356, 317, 1992, 4980, 390, 10561,345, 16196,6415, 5661, 11195,317, 16197,9624, 2022, 363, 342, + 490, 1078, 16202,9261, 16204,16206,16207,363, 16208,16210,6318, 363, 16203,317, 345, 1358, 16205,2271, 317, 2271, 5230, 317, 370, 317, 363, 370, 363, + 16209,363, 10820,317, 351, 13766,16211,16212,317, 317, 16214,16219,317, 389, 16221,16223,2503, 16224,16227,317, 363, 16215,490, 16216,317, 16217,1358, + 16218,16220,16222,317, 5159, 1347, 16225,363, 16226,317, 16228,16230,16232,343, 362, 16234,16235,6600, 363, 16229,370, 1358, 1160, 16231,363, 16233,9557, 554, 4591, 350, 404, 16238,2380, 16239,16241,16242,16263,16265,16279,16293,16300,16303,16305,16306,16309,16311,16320,16321,16333,16347,2355, 317, 16369,16376, - 16385,16395,16409,16412,16413,8412, 16243,317, 2208, 16244,16245,4591, 16248,16249,16250,343, 16251,16252,16256,2391, 16258,345, 5573, 16261,317, 7389, 2369, - 16246,427, 16247,5273, 317, 381, 355, 11918,4253, 317, 16253,2146, 16254,16255,16257,3076, 5752, 16259,2024, 16260,2272, 3076, 16262,428, 2063, 16264,2108, + 16385,16395,16409,16412,16413,8412, 16243,317, 2208, 16244,16245,4591, 16248,16249,16250,343, 16251,16252,16256,2391, 16258,345, 5573, 16261,317, 7389, 2369, + 16246,427, 16247,5273, 317, 381, 355, 11918,4253, 317, 16253,2146, 16254,16255,16257,3076, 5752, 16259,2024, 16260,2272, 3076, 16262,428, 2063, 16264,2108, 381, 16266,16267,317, 16268,16270,16271,551, 381, 12524,16269,350, 4591, 5896, 16272,16274,14842,16275,11195,2022, 8177, 3075, 317, 404, 345, 5037, 15750, 16273,15682,5223, 5223, 317, 6596, 4591, 392, 16276,16277,13023,16278,317, 317, 10487,370, 16280,16282,16284,16285,490, 16286,16289,8296, 2391, 16292,15047, - 1160, 883, 380, 317, 16281,1347, 351, 317, 4962, 384, 6046, 16283,382, 355, 11918,317, 362, 1358, 4925, 2366, 16287,16288,316, 316, 16290,16291,332, - 5838, 16294,343, 16295,16297,16299,16296,16298,466, 5662, 2576, 381, 16301,362, 16302,363, 6046, 2087, 16304,490, 501, 370, 7865, 5841, 317, 317, 390, + 1160, 883, 380, 317, 16281,1347, 351, 317, 4962, 384, 6046, 16283,382, 355, 11918,317, 362, 1358, 4925, 2366, 16287,16288,316, 316, 16290,16291,332, + 5838, 16294,343, 16295,16297,16299,16296,16298,466, 5662, 2576, 381, 16301,362, 16302,363, 6046, 2087, 16304,490, 501, 370, 7865, 5841, 317, 317, 390, 490, 16307,16308,16310,605, 16312,16318,343, 317, 1194, 16313,16317,317, 16314,16315,16316,317, 990, 356, 466, 317, 16319,317, 363, 1345, 16322,16323, - 501, 16326,9624, 16330,5661, 350, 2067, 16331,16332,2108, 16324,16325,16327,16328,16329,7792, 1347, 428, 2108, 6674, 16334,16340,351, 450, 317, 16341,317, - 2222, 16342,343, 16344,16345,16346,16335,317, 16338,16336,16337,590, 2715, 380, 2163, 317, 317, 16339,370, 351, 553, 13638,14938,370, 363, 16343,356, - 1020, 363, 5447, 466, 317, 317, 1077, 16348,16349,16364,343, 466, 14062,317, 565, 317, 6195, 16350,9624, 16351,16353,16355,362, 541, 16356,16363,6089, + 501, 16326,9624, 16330,5661, 350, 2067, 16331,16332,2108, 16324,16325,16327,16328,16329,7792, 1347, 428, 2108, 6674, 16334,16340,351, 450, 317, 16341,317, + 2222, 16342,343, 16344,16345,16346,16335,317, 16338,16336,16337,590, 2715, 380, 2163, 317, 317, 16339,370, 351, 553, 13638,14938,370, 363, 16343,356, + 1020, 363, 5447, 466, 317, 317, 1077, 16348,16349,16364,343, 466, 14062,317, 565, 317, 6195, 16350,9624, 16351,16353,16355,362, 541, 16356,16363,6089, 16352,392, 317, 16354,11229,6318, 7314, 317, 16357,16358,16359,5037, 605, 5345, 5346, 16360,16361,16362,373, 5038, 16365,9624, 16366,16367,428, 355, 16368, - 317, 16370,1345, 317, 16372,5838, 362, 16068,16373,16375,16371,5727, 317, 317, 4591, 345, 12487,16374,5662, 2036, 590, 381, 3529, 426, 16377,16381,362, - 317, 450, 16378,317, 16379,16380,317, 16382,1347, 317, 16383,317, 317, 16384,370, 317, 4980, 404, 370, 16386,16388,16390,317, 2021, 7214, 16393,2509, - 16387,427, 351, 4980, 16389,16391,16392,551, 13190,551, 317, 16394,551, 10471,551, 16396,350, 16399,466, 2022, 6600, 16400,16407,317, 16397,16398,6228, - 317, 1194, 2402, 16401,16402,9624, 16403,16404,317, 385, 15167,16405,6089, 317, 380, 317, 2156, 363, 6420, 382, 390, 13269,343, 16067,317, 633, 5897, + 317, 16370,1345, 317, 16372,5838, 362, 16068,16373,16375,16371,5727, 317, 317, 4591, 345, 12487,16374,5662, 2036, 590, 381, 3529, 426, 16377,16381,362, + 317, 450, 16378,317, 16379,16380,317, 16382,1347, 317, 16383,317, 317, 16384,370, 317, 4980, 404, 370, 16386,16388,16390,317, 2021, 7214, 16393,2509, + 16387,427, 351, 4980, 16389,16391,16392,551, 13190,551, 317, 16394,551, 10471,551, 16396,350, 16399,466, 2022, 6600, 16400,16407,317, 16397,16398,6228, + 317, 1194, 2402, 16401,16402,9624, 16403,16404,317, 385, 15167,16405,6089, 317, 380, 317, 2156, 363, 6420, 382, 390, 13269,343, 16067,317, 633, 5897, 363, 16406,5037, 16136,16408,466, 16410,404, 16411,6855, 363, 8023, 2156, 16414,16415,16416,2035, 317, 380, 490, 3284, 8178, 5836, 2719, 1830, 16418,16420, 16428,16431,16440,16441,13881,16445,2533, 2222, 16450,16451,16461,16486,16499,363, 16504,16505,16506,16419,384, 2322, 16421,16423,16426,343, 16427,317, 16422, 16422,16424,317, 633, 558, 317, 16425,317, 370, 362, 433, 7866, 7734, 317, 8364, 350, 317, 16429,16430,3987, 2222, 351, 11146,16432,16434,2152, 16437, - 317, 16439,1998, 16433,380, 16435,2134, 362, 16436,16438,428, 466, 343, 317, 373, 2161, 551, 380, 345, 16442,317, 16444,362, 6651, 16443,362, 351, - 7514, 363, 16446,16448,2067, 16447,16449,466, 13269,317, 2610, 16452,16454,16456,9624, 14535,16457,16459,2022, 3987, 16453,1588, 16455,2401, 596, 10223,317, + 317, 16439,1998, 16433,380, 16435,2134, 362, 16436,16438,428, 466, 343, 317, 373, 2161, 551, 380, 345, 16442,317, 16444,362, 6651, 16443,362, 351, + 7514, 363, 16446,16448,2067, 16447,16449,466, 13269,317, 2610, 16452,16454,16456,9624, 14535,16457,16459,2022, 3987, 16453,1588, 16455,2401, 596, 10223,317, 10592,2402, 4943, 16458,605, 16460,2117, 439, 5105, 317, 5223, 317, 1194, 16462,16465,16467,9624, 16473,16474,596, 16475,5213, 16477,16480,16481,16485,11040, 317, 16463,16464,990, 6855, 16466,343, 2116, 6563, 590, 1108, 6600, 16468,317, 16471,317, 16469,16470,317, 16472,371, 2004, 382, 7866, 16476,605, 14709, 11918,16478,16479,317, 350, 317, 381, 1266, 317, 2077, 317, 317, 317, 16482,8023, 363, 16483,4982, 16484,16487,317, 16489,16494,365, 4984, 965, 16495, - 16497,16498,2322, 16488,5570, 317, 5464, 466, 2571, 16490,16493,317, 16491,16492,16496,590, 15618,317, 351, 478, 9938, 16500,317, 350, 16503,3236, 363, - 2108, 3573, 16501,16502,370, 12134,5343, 345, 16507,317, 16508,4773, 3284, 16510,6713, 16513,4965, 901, 5537, 317, 490, 350, 16514,16519,4980, 16522,427, + 16497,16498,2322, 16488,5570, 317, 5464, 466, 2571, 16490,16493,317, 16491,16492,16496,590, 15618,317, 351, 478, 9938, 16500,317, 350, 16503,3236, 363, + 2108, 3573, 16501,16502,370, 12134,5343, 345, 16507,317, 16508,4773, 3284, 16510,6713, 16513,4965, 901, 5537, 317, 490, 350, 16514,16519,4980, 16522,427, 16511,1347, 6228, 317, 317, 317, 490, 16512,317, 363, 596, 363, 345, 16515,16516,2222, 16518,317, 4976, 317, 16517,1345, 16520,16521,9234, 363, 16524, - 16529,16532,11146,317, 371, 16525,16526,16527,8296, 3284, 16528,16530,13638,490, 16531,371, 8296, 16533,16534,16535,7127, 339, 317, 16537,16540,2553, 380, + 16529,16532,11146,317, 371, 16525,16526,16527,8296, 3284, 16528,16530,13638,490, 16531,371, 8296, 16533,16534,16535,7127, 339, 317, 16537,16540,2553, 380, 16538,16539,339, 5732, 16542,16543,16544,16557,16634,16673,16696,16709,16726,16733,16743,16755,16765,16831,16847,16893,16903,16907,47, 17052,17122,3023, 17172, - 17175,17178,17184,16545,16546,16553,2572, 16554,16556,10081,381, 16547,4965, 16549,16550,1160, 16548,6996, 633, 317, 317, 633, 317, 7477, 2077, 317, 362, + 17175,17178,17184,16545,16546,16553,2572, 16554,16556,10081,381, 16547,4965, 16549,16550,1160, 16548,6996, 633, 317, 317, 633, 317, 7477, 2077, 317, 362, 317, 1160, 1267, 317, 16551,466, 317, 317, 3599, 16552,5942, 317, 16555,371, 6629, 401, 16558,16563,16576,16577,332, 16595,16627,317, 16629,16631,16632, 16559,16560,363, 867, 16561,317, 16562,16564,16566,16568,16569,16572,317, 16573,317, 16565,16567,2178, 363, 8765, 16570,16571,5482, 317, 16574,16575,16578, - 16583,16584,16586,16588,332, 10845,16590,7490, 6628, 16591,8957, 16592,16579,362, 16580,16582,350, 5616, 16581,363, 5898, 2586, 365, 16585,363, 5223, 2322, + 16583,16584,16586,16588,332, 10845,16590,7490, 6628, 16591,8957, 16592,16579,362, 16580,16582,350, 5616, 16581,363, 5898, 2586, 365, 16585,363, 5223, 2322, 590, 10538,16587,6628, 16589,343, 5663, 2236, 15221,9059, 351, 16593,16594,637, 16596,16597,558, 16599,16603,16604,16608,16613,16615,16618,16619,16621,16622, - 16623,16624,1160, 16598,2066, 605, 332, 16600,12934,317, 16601,16602,317, 11089,317, 317, 16605,355, 16607,11918,349, 317, 16606,363, 404, 363, 6629, - 363, 317, 16609,16610,16611,16612,11229,16614,3999, 317, 317, 1347, 317, 317, 16616,404, 16617,2298, 9609, 13028,11654,351, 16620,2163, 7368, 317, 3869, + 16623,16624,1160, 16598,2066, 605, 332, 16600,12934,317, 16601,16602,317, 11089,317, 317, 16605,355, 16607,11918,349, 317, 16606,363, 404, 363, 6629, + 363, 317, 16609,16610,16611,16612,11229,16614,3999, 317, 317, 1347, 317, 317, 16616,404, 16617,2298, 9609, 13028,11654,351, 16620,2163, 7368, 317, 3869, 1020, 363, 350, 16593,16625,578, 16626,16628,16630,371, 371, 16633,11347,842, 16635,16636,16646,16648,16652,16653,343, 16655,5683, 16658,16660,16661,16579, - 16663,490, 16665,317, 16668,317, 1479, 317, 16637,16638,16639,16641,16642,382, 317, 16644,6596, 11938,16640,5249, 1347, 5861, 16643,637, 16645,1267, 317, - 317, 317, 317, 317, 8301, 2631, 2077, 558, 317, 1044, 317, 637, 1267, 16647,317, 317, 490, 16649,16651,317, 16650,448, 356, 466, 317, 332, 343, + 16663,490, 16665,317, 16668,317, 1479, 317, 16637,16638,16639,16641,16642,382, 317, 16644,6596, 11938,16640,5249, 1347, 5861, 16643,637, 16645,1267, 317, + 317, 317, 317, 317, 8301, 2631, 2077, 558, 317, 1044, 317, 637, 1267, 16647,317, 317, 490, 16649,16651,317, 16650,448, 356, 466, 317, 332, 343, 16654,390, 317, 2067, 2108, 16656,466, 16657,343, 370, 16659,371, 8296, 317, 10471,16662,16664,16666,7651, 5810, 16667,16669,16671,317, 5836, 16670,16672, 16674,16677,16678,16681,365, 16682,16689,16692,16694,16675,2188, 16676,350, 350, 317, 3648, 350, 16679,350, 16680,351, 362, 351, 2222, 490, 605, 16683, - 5241, 2222, 466, 1347, 16686,5032, 16687,317, 16684,16685,7577, 16688,14572,8083, 16690,16691,16693,3648, 466, 317, 351, 317, 605, 16695,466, 16697,1020, - 16708,404, 16698,16701,16703,1020, 16705,317, 427, 16706,317, 16699,317, 16700,317, 5273, 16702,317, 317, 16704,1358, 5055, 356, 16707,317, 1011, 3869, - 317, 651, 317, 490, 5481, 356, 16710,558, 16713,16714,317, 345, 16718,16720,7384, 345, 16721,16725,332, 2066, 490, 16711,16712,2715, 8563, 8274, 363, - 15323,381, 343, 16715,16717,1345, 317, 317, 16716,317, 356, 343, 317, 317, 1347, 1992, 6546, 16719,2272, 365, 363, 9293, 16722,16724,1160, 16723,2178, - 612, 574, 16727,16728,5662, 16729,16732,16730,16731,16734,317, 16735,16736,317, 16738,16741,16737,345, 317, 2510, 9648, 317, 1060, 16739,317, 16740,363, - 16742,2809, 363, 16744,16745,16752,13638,9357, 16753,16746,16750,949, 16747,16748,16749,16751,317, 16754,16756,351, 16757,16760,12616,16761,2948, 317, 2177, + 5241, 2222, 466, 1347, 16686,5032, 16687,317, 16684,16685,7577, 16688,14572,8083, 16690,16691,16693,3648, 466, 317, 351, 317, 605, 16695,466, 16697,1020, + 16708,404, 16698,16701,16703,1020, 16705,317, 427, 16706,317, 16699,317, 16700,317, 5273, 16702,317, 317, 16704,1358, 5055, 356, 16707,317, 1011, 3869, + 317, 651, 317, 490, 5481, 356, 16710,558, 16713,16714,317, 345, 16718,16720,7384, 345, 16721,16725,332, 2066, 490, 16711,16712,2715, 8563, 8274, 363, + 15323,381, 343, 16715,16717,1345, 317, 317, 16716,317, 356, 343, 317, 317, 1347, 1992, 6546, 16719,2272, 365, 363, 9293, 16722,16724,1160, 16723,2178, + 612, 574, 16727,16728,5662, 16729,16732,16730,16731,16734,317, 16735,16736,317, 16738,16741,16737,345, 317, 2510, 9648, 317, 1060, 16739,317, 16740,363, + 16742,2809, 363, 16744,16745,16752,13638,9357, 16753,16746,16750,949, 16747,16748,16749,16751,317, 16754,16756,351, 16757,16760,12616,16761,2948, 317, 2177, 16758,16759,16762,16763,339, 2035, 2317, 16764,3284, 11146,5836, 16766,16769,6763, 16773,16775,16776,16777,16780,16782,16784,16786,16825,596, 16826,404, 16827, - 16829,362, 490, 317, 1325, 1108, 16767,16768,16770,317, 4564, 16771,345, 16772,16774,351, 10189,16778,6546, 3999, 1020, 8281, 16779,5687, 8214, 317, 371, - 317, 16781,11198,5428, 490, 8311, 16783,2021, 16137,16785,2022, 317, 16787,6531, 16789,16794,16798,2063, 16803,16805,9420, 16807,16812,16814,16815,16817,384, - 16821,16824,356, 16788,16790,16791,16792,16793,317, 317, 317, 317, 317, 317, 317, 317, 1160, 356, 317, 16795,16796,317, 317, 317, 3987, 317, 5055, + 16829,362, 490, 317, 1325, 1108, 16767,16768,16770,317, 4564, 16771,345, 16772,16774,351, 10189,16778,6546, 3999, 1020, 8281, 16779,5687, 8214, 317, 371, + 317, 16781,11198,5428, 490, 8311, 16783,2021, 16137,16785,2022, 317, 16787,6531, 16789,16794,16798,2063, 16803,16805,9420, 16807,16812,16814,16815,16817,384, + 16821,16824,356, 16788,16790,16791,16792,16793,317, 317, 317, 317, 317, 317, 317, 317, 1160, 356, 317, 16795,16796,317, 317, 317, 3987, 317, 5055, 16797,317, 317, 16799,2077, 16800,16801,16802,16804,5447, 16806,363, 317, 5223, 2368, 351, 7079, 317, 16808,16809,16810,16811,16813,4943, 363, 1060, 16816, 363, 343, 382, 6228, 651, 5108, 16818,16819,16820,16822,16823,317, 8301, 466, 371, 362, 490, 317, 5428, 16828,362, 404, 406, 11654,16830,16832,16833, - 16839,16840,16841,1962, 14462,16844,16846,16834,16835,16838,317, 490, 10454,16836,466, 16837,551, 384, 16842,16843,2568, 350, 16845,10422,466, 3078, 317, + 16839,16840,16841,1962, 14462,16844,16846,16834,16835,16838,317, 490, 10454,16836,466, 16837,551, 384, 16842,16843,2568, 350, 16845,10422,466, 3078, 317, 345, 317, 363, 11089,5105, 7055, 16848,16850,16872,16873,16878,16879,16881,16884,16887,2134, 16890,2022, 317, 16849,317, 5865, 16851,16852,16865,16866,16868, - 16869,317, 6420, 5896, 343, 382, 317, 317, 16853,16855,574, 16854,16856,16860,7801, 2631, 16861,3236, 5400, 16857,16858,16859,16862,16863,16864,16867,466, + 16869,317, 6420, 5896, 343, 382, 317, 317, 16853,16855,574, 16854,16856,16860,7801, 2631, 16861,3236, 5400, 16857,16858,16859,16862,16863,16864,16867,466, 363, 384, 16870,16871,16874,16876,16877,1962, 343, 5492, 317, 317, 16875,5255, 317, 651, 317, 5055, 317, 7419, 7401, 16651,2022, 1708, 317, 16880,11654, - 16882,317, 16883,3573, 382, 6228, 317, 10149,317, 16885,363, 16886,317, 1020, 16888,9648, 350, 363, 2584, 317, 4984, 317, 16889,317, 16891,490, 1060, + 16882,317, 16883,3573, 382, 6228, 317, 10149,317, 16885,363, 16886,317, 1020, 16888,9648, 350, 363, 2584, 317, 4984, 317, 16889,317, 16891,490, 1060, 16892,14837,332, 317, 16894,343, 16902,16895,16899,16900,16896,3503, 14920,5570, 16897,16898,2171, 332, 16901,5968, 356, 317, 317, 16904,16905,16906,16908, 16909,16913,16918,16928,16935,16942,16943,16965,16971,317, 16974,16990,16998,17002,17013,17014,490, 17015,17028,17035,17044,2271, 17047,17049,17051,16910,16911, 317, 16912,317, 5570, 365, 16914,7590, 16916,16917,9914, 317, 317, 10592,343, 16915,317, 16919,16925,16926,10317,16920,16921,16922,16924,380, 345, 10820, - 16923,380, 433, 16927,317, 16929,1358, 16933,362, 16934,543, 362, 2134, 380, 16930,16932,10820,317, 356, 16931,371, 351, 1358, 317, 381, 16936,5105, - 317, 16941,489, 16937,16938,317, 317, 16939,16940,5201, 7242, 12291,6598, 551, 16944,6203, 16945,16947,16951,16952,16954,16955,362, 350, 16956,16958,317, - 16960,16962,317, 370, 317, 7509, 317, 16946,345, 317, 16948,13905,16949,16950,11962,317, 351, 4952, 365, 12287,317, 317, 363, 1078, 16953,2510, 2022, - 317, 5917, 6831, 6122, 363, 317, 16957,317, 363, 317, 2272, 9609, 12288,16959,396, 343, 16961,5570, 16963,16964,16966,16970,16967,317, 16969,16968,317, - 11342,16972,10592,5464, 16973,16704,554, 317, 16975,11158,16976,16977,16983,16986,362, 8296, 16988,363, 317, 5223, 317, 11962,317, 16978,355, 16980,349, + 16923,380, 433, 16927,317, 16929,1358, 16933,362, 16934,543, 362, 2134, 380, 16930,16932,10820,317, 356, 16931,371, 351, 1358, 317, 381, 16936,5105, + 317, 16941,489, 16937,16938,317, 317, 16939,16940,5201, 7242, 12291,6598, 551, 16944,6203, 16945,16947,16951,16952,16954,16955,362, 350, 16956,16958,317, + 16960,16962,317, 370, 317, 7509, 317, 16946,345, 317, 16948,13905,16949,16950,11962,317, 351, 4952, 365, 12287,317, 317, 363, 1078, 16953,2510, 2022, + 317, 5917, 6831, 6122, 363, 317, 16957,317, 363, 317, 2272, 9609, 12288,16959,396, 343, 16961,5570, 16963,16964,16966,16970,16967,317, 16969,16968,317, + 11342,16972,10592,5464, 16973,16704,554, 317, 16975,11158,16976,16977,16983,16986,362, 8296, 16988,363, 317, 5223, 317, 11962,317, 16978,355, 16980,349, 16979,5917, 16981,16982,16984,381, 16985,317, 439, 16987,605, 317, 16989,16991,16993,16995,384, 14883,404, 15334,317, 343, 16992,317, 490, 4943, 16994, 10820,317, 317, 363, 10376,343, 16996,404, 16997,2060, 554, 404, 16999,17000,2260, 317, 317, 349, 9609, 17001,17003,17004,554, 17005,2022, 17009,17010, - 17011,427, 5809, 370, 6600, 356, 317, 356, 390, 4943, 317, 6831, 380, 6420, 1347, 11962,317, 345, 317, 17006,17008,17007,356, 2261, 2310, 5037, 5809, + 17011,427, 5809, 370, 6600, 356, 317, 356, 390, 4943, 317, 6831, 380, 6420, 1347, 11962,317, 345, 317, 17006,17008,17007,356, 2261, 2310, 5037, 5809, 17012,350, 317, 1347, 343, 466, 317, 317, 17016,17017,11716,17020,17024,317, 17027,317, 343, 380, 356, 317, 17018,317, 317, 17019,17021,990, 17022, - 471, 380, 5538, 1347, 17023,317, 12860,490, 1347, 17025,17026,345, 466, 317, 380, 317, 1347, 17029,17030,17031,7785, 17032,363, 17034,14663,12766,317, + 471, 380, 5538, 1347, 17023,317, 12860,490, 1347, 17025,17026,345, 466, 317, 380, 317, 1347, 17029,17030,17031,7785, 17032,363, 17034,14663,12766,317, 6674, 17033,1020, 466, 363, 317, 363, 17036,17037,437, 6002, 17040,362, 350, 17041,17042,17043,380, 17038,17039,317, 17045,17046,6600, 371, 428, 17048, 2063, 371, 16288,17050,466, 13611,427, 11347,17053,17057,17059,17063,17064,17066,17084,17096,17100,17101,2211, 965, 17103,17111,7703, 17119,17120,7850, 17054, - 17055,317, 356, 490, 2222, 17056,6021, 363, 17058,317, 427, 1347, 17060,17061,17062,6607, 9422, 4965, 5662, 350, 351, 371, 317, 362, 17065,317, 317, - 317, 4974, 4591, 17067,370, 17068,17069,17071,490, 17072,17073,12565,17076,17078,6598, 17080,317, 317, 317, 351, 15618,317, 317, 317, 17070,578, 2156, - 332, 317, 10878,439, 363, 17074,17075,350, 317, 9274, 382, 363, 17077,17079,356, 17081,15221,17082,384, 17083,317, 17085,17086,17087,17095,317, 317, - 317, 381, 17088,317, 490, 17089,17090,8464, 345, 10149,17091,17093,17092,515, 2551, 971, 17094,17097,17099,15986,17098,317, 351, 355, 17102,17104,419, - 17105,17107,17109,350, 5662, 17110,2503, 317, 365, 356, 317, 17106,317, 5223, 317, 317, 5896, 317, 12943,17108,17112,17114,17116,472, 1347, 317, 317, + 17055,317, 356, 490, 2222, 17056,6021, 363, 17058,317, 427, 1347, 17060,17061,17062,6607, 9422, 4965, 5662, 350, 351, 371, 317, 362, 17065,317, 317, + 317, 4974, 4591, 17067,370, 17068,17069,17071,490, 17072,17073,12565,17076,17078,6598, 17080,317, 317, 317, 351, 15618,317, 317, 317, 17070,578, 2156, + 332, 317, 10878,439, 363, 17074,17075,350, 317, 9274, 382, 363, 17077,17079,356, 17081,15221,17082,384, 17083,317, 17085,17086,17087,17095,317, 317, + 317, 381, 17088,317, 490, 17089,17090,8464, 345, 10149,17091,17093,17092,515, 2551, 971, 17094,17097,17099,15986,17098,317, 351, 355, 17102,17104,419, + 17105,17107,17109,350, 5662, 17110,2503, 317, 365, 356, 317, 17106,317, 5223, 317, 317, 5896, 317, 12943,17108,17112,17114,17116,472, 1347, 317, 317, 317, 17113,385, 6355, 5028, 5028, 317, 17115,637, 1300, 5942, 317, 633, 649, 633, 317, 351, 17117,17118,345, 1531, 428, 17121,12423,343, 2074, 17123, - 17125,17129,17131,17132,17134,362, 350, 17135,17137,17139,17140,362, 380, 17171,365, 317, 15539,317, 490, 17124,356, 317, 490, 317, 380, 17126,317, - 17127,343, 332, 317, 317, 17128,11144,317, 16186,317, 17130,316, 317, 7698, 418, 17133,16416,345, 439, 15646,5055, 317, 17136,17138,384, 363, 317, + 17125,17129,17131,17132,17134,362, 350, 17135,17137,17139,17140,362, 380, 17171,365, 317, 15539,317, 490, 17124,356, 317, 490, 317, 380, 17126,317, + 17127,343, 332, 317, 317, 17128,11144,317, 16186,317, 17130,316, 317, 7698, 418, 17133,16416,345, 439, 15646,5055, 317, 17136,17138,384, 363, 317, 17141,8301, 17143,17155,17156,17159,343, 17161,17162,17164,17165,14910,17167,17170,381, 317, 5571, 17142,317, 317, 17144,317, 1160, 17145,14202,356, 17147, 8137, 2022, 17152,385, 17153,5809, 317, 17146,6600, 380, 4943, 17148,17150,578, 17149,596, 17151,317, 388, 12303,1588, 17154,514, 384, 17157,2155, 17158, 350, 17160,489, 4965, 434, 363, 17163,351, 14535,5962, 2290, 17166,317, 356, 466, 1160, 17033,17168,384, 476, 427, 317, 17169,317, 12696,343, 13611, @@ -7055,151 +7050,151 @@ static const unsigned int ChildLocs[185261] = 17200,17201,17202,17203,17204,17206,17208,17218,17220,17222,17226,12556,7438, 554, 5537, 17230,17232,362, 17234,17237,17238,17243,17252,17258,17263,17264,17266, 17209,17212,317, 317, 5223, 5464, 17217,17210,17211,17213,17214,17215,17216,17219,2086, 2107, 17221,971, 439, 17223,17224,17225,17227,5856, 317, 17228,17229, 17231,8296, 17233,9450, 2272, 2845, 439, 356, 1347, 427, 4980, 9450, 317, 10476,17235,5332, 17236,317, 1358, 8137, 17239,1060, 17241,17240,17242,17244,17245, - 351, 343, 17246,2022, 17250,17251,427, 17247,17248,17249,1347, 12417,317, 342, 17253,17257,17254,17256,17255,2280, 5332, 17259,17260,17262,10664,6713, 317, - 17261,17265,2509, 1347, 17267,17268,17269,17270,17272,17274,17275,17278,17280,10984,17288,17291,17298,17309,17313,49, 18743,18776,18787,56, 19071,19099,57, + 351, 343, 17246,2022, 17250,17251,427, 17247,17248,17249,1347, 12417,317, 342, 17253,17257,17254,17256,17255,2280, 5332, 17259,17260,17262,10664,6713, 317, + 17261,17265,2509, 1347, 17267,17268,17269,17270,17272,17274,17275,17278,17280,10984,17288,17291,17298,17309,17313,49, 18743,18776,18787,56, 19071,19099,57, 61, 20425,20456,62, 20780,20794,64, 22684,22690,70, 23127,23142,73, 23459,23478,23484,23496,23618,412, 17273,4797, 17276,4797, 17277,740, 17279,17281, 17283,17287,2058, 17282,350, 17284,17285,17286,17289,17290,17292,17295,17293,17294,17296,17297,17299,17300,17305,17301,17302,17303,17304,17306,17307,17308,17310, 17311,17312,17314,17320,17315,17316,17317,17318,17319,17321,17274,17322,17324,17372,17393,17426,17450,17472,17483,17495,17509,17515,50, 51, 52, 17937,17940, - 18046,53, 54, 55, 18656,18685,18719,18725,18726,18733,317, 7657, 317, 17323,17325,17327,17337,17341,17342,17348,17355,17359,17364,317, 17371,17326,6991, + 18046,53, 54, 55, 18656,18685,18719,18725,18726,18733,317, 7657, 317, 17323,17325,17327,17337,17341,17342,17348,17355,17359,17364,317, 17371,17326,6991, 317, 17328,317, 17331,17336,5325, 590, 17329,17330,317, 9595, 317, 17332,17333,17334,317, 9186, 17335,345, 348, 4268, 4591, 17338,428, 343, 343, 17339, - 17340,343, 17343,17344,17346,17347,17345,867, 4984, 317, 539, 332, 17349,332, 17351,17352,490, 17350,343, 332, 345, 596, 317, 8301, 490, 17353,317, + 17340,343, 17343,17344,17346,17347,17345,867, 4984, 317, 539, 332, 17349,332, 17351,17352,490, 17350,343, 332, 345, 596, 317, 8301, 490, 17353,317, 345, 17354,16092,317, 317, 17356,466, 317, 16401,901, 362, 317, 317, 17357,1230, 17358,317, 17360,363, 317, 17361,17363,5760, 343, 17362,17365,17367, - 17369,363, 1078, 17366,1109, 490, 490, 17368,6394, 2142, 365, 17370,2086, 6763, 17373,17376,9623, 17383,17386,17389,17390,17392,317, 343, 317, 317, 317, - 17374,5624, 17375,363, 17377,17379,17378,6195, 17380,17382,17381,351, 17384,466, 17385,317, 7579, 490, 5238, 867, 317, 17387,17388,965, 2117, 472, 8296, - 17391,7791, 317, 6050, 17394,17395,7055, 17399,17402,17408,17409,17411,17414,17415,17416,17417,17420,17422,317, 3941, 17396,17397,2510, 17398,17400,17401,343, - 317, 1160, 371, 1347, 362, 317, 17403,17404,17407,317, 1347, 17405,17406,1347, 2156, 11089,490, 17410,343, 7990, 362, 17412,317, 17413,363, 363, 741, - 345, 396, 362, 8771, 574, 317, 17418,17419,2134, 17421,17423,428, 17424,7190, 17425,566, 363, 17427,3645, 17430,17435,17441,17446,17449,317, 17428,427, + 17369,363, 1078, 17366,1109, 490, 490, 17368,6394, 2142, 365, 17370,2086, 6763, 17373,17376,9623, 17383,17386,17389,17390,17392,317, 343, 317, 317, 317, + 17374,5624, 17375,363, 17377,17379,17378,6195, 17380,17382,17381,351, 17384,466, 17385,317, 7579, 490, 5238, 867, 317, 17387,17388,965, 2117, 472, 8296, + 17391,7791, 317, 6050, 17394,17395,7055, 17399,17402,17408,17409,17411,17414,17415,17416,17417,17420,17422,317, 3941, 17396,17397,2510, 17398,17400,17401,343, + 317, 1160, 371, 1347, 362, 317, 17403,17404,17407,317, 1347, 17405,17406,1347, 2156, 11089,490, 17410,343, 7990, 362, 17412,317, 17413,363, 363, 741, + 345, 396, 362, 8771, 574, 317, 17418,17419,2134, 17421,17423,428, 17424,7190, 17425,566, 363, 17427,3645, 17430,17435,17441,17446,17449,317, 17428,427, 17429,17431,17432,17433,17434,17436,17437,17438,17439,17440,8096, 17442,17444,8120, 17443,17445,17447,351, 741, 17448,6996, 5217, 317, 17451,1639, 17455,17458, 17469,17470,5570, 17452,5325, 17453,317, 17454,317, 17456,17457,17459,17463,343, 1530, 17460,17461,17462,317, 17464,17466,17468,317, 17465,2601, 317, 17467, 370, 370, 317, 17471,17473,17474,8419, 5711, 17478,17480,17481,317, 17475,317, 317, 317, 17476,17477,1345, 17479,2178, 12751,345, 17482,17484,17486,17488, 317, 17491,17493,490, 17485,317, 6318, 317, 317, 17487,490, 1033, 17489,317, 17490,5241, 17492,345, 17494,5687, 17496,17497,17498,17501,17502,17504,17505, 17506,17508,345, 7657, 490, 490, 7399, 5238, 345, 17499,381, 351, 350, 17500,381, 1347, 17503,404, 343, 317, 317, 317, 1347, 1347, 7916, 363, 17507, - 317, 343, 5055, 6504, 11548,317, 17510,867, 17513,490, 363, 17514,317, 17511,317, 17512,426, 4591, 11266,8682, 17516,7850, 17517,317, 12302,10471,7892, - 17518,17537,17539,17548,17556,17562,17563,17566,17567,17598,17599,17634,17638,17643,17659,17661,17662,17671,17673,15750,17681,17684,17519,362, 317, 362, 345, - 17523,17524,12226,17532,17533,17534,1230, 17536,17520,317, 17521,317, 11582,17522,5217, 317, 343, 489, 17525,490, 317, 17527,17528,345, 17526,317, 5328, - 317, 343, 8572, 17529,17530,17531,3751, 332, 345, 17535,17538,2510, 381, 17540,7514, 17544,9244, 17545,17541,332, 317, 17542,13314,17543,5570, 5439, 5570, - 12463,317, 343, 427, 17546,17547,5547, 317, 345, 17549,17552,17555,404, 3987, 317, 17550,317, 17551,2272, 10946,2110, 17553,17554,6195, 363, 6063, 404, + 317, 343, 5055, 6504, 11548,317, 17510,867, 17513,490, 363, 17514,317, 17511,317, 17512,426, 4591, 11266,8682, 17516,7850, 17517,317, 12302,10471,7892, + 17518,17537,17539,17548,17556,17562,17563,17566,17567,17598,17599,17634,17638,17643,17659,17661,17662,17671,17673,15750,17681,17684,17519,362, 317, 362, 345, + 17523,17524,12226,17532,17533,17534,1230, 17536,17520,317, 17521,317, 11582,17522,5217, 317, 343, 489, 17525,490, 317, 17527,17528,345, 17526,317, 5328, + 317, 343, 8572, 17529,17530,17531,3751, 332, 345, 17535,17538,2510, 381, 17540,7514, 17544,9244, 17545,17541,332, 317, 17542,13314,17543,5570, 5439, 5570, + 12463,317, 343, 427, 17546,17547,5547, 317, 345, 17549,17552,17555,404, 3987, 317, 17550,317, 17551,2272, 10946,2110, 17553,17554,6195, 363, 6063, 404, 6089, 317, 6227, 17557,2177, 2271, 17560,7143, 317, 490, 6179, 317, 17558,17559,5896, 17561,2510, 351, 2272, 520, 343, 2419, 17564,351, 17565,5205, 15667, - 17568,17572,490, 17573,17575,17582,490, 17585,17587,17589,17592,2178, 17596,357, 363, 2510, 17569,17571,17570,1347, 317, 3111, 14535,17574,332, 1358, 317, + 17568,17572,490, 17573,17575,17582,490, 17585,17587,17589,17592,2178, 17596,357, 363, 2510, 17569,17571,17570,1347, 317, 3111, 14535,17574,332, 1358, 317, 5570, 317, 17576,17577,17578,17579,17580,17581,1347, 10114,345, 2178, 17583,17584,1588, 490, 363, 17586,17588,2178, 2510, 17590,332, 17591,317, 317, 17593, - 317, 17594,317, 17595,17597,694, 928, 17600,5960, 17605,17608,343, 362, 17629,17631,17633,317, 17601,332, 17602,15837,345, 317, 17603,317, 17604,317, - 343, 1230, 16825,317, 317, 2177, 6849, 17606,317, 17607,317, 317, 317, 14865,317, 17609,8367, 17611,15837,17616,17617,17618,17627,5003, 17610,2117, 6761, + 317, 17594,317, 17595,17597,694, 928, 17600,5960, 17605,17608,343, 362, 17629,17631,17633,317, 17601,332, 17602,15837,345, 317, 17603,317, 17604,317, + 343, 1230, 16825,317, 317, 2177, 6849, 17606,317, 17607,317, 317, 317, 14865,317, 17609,8367, 17611,15837,17616,17617,17618,17627,5003, 17610,2117, 6761, 17612,317, 17613,17614,17615,2510, 339, 317, 343, 17619,17624,17620,17621,17622,17623,17625,17626,363, 17628,317, 4965, 317, 17630,317, 741, 6670, 11055, - 363, 17632,17635,466, 370, 2571, 17636,317, 17637,363, 4984, 17639,371, 17640,17641,17642,17644,5517, 17647,361, 17648,17650,5908, 17655,17658,3987, 317, + 363, 17632,17635,466, 370, 2571, 17636,317, 17637,363, 4984, 17639,371, 17640,17641,17642,17644,5517, 17647,361, 17648,17650,5908, 17655,17658,3987, 317, 17645,17646,343, 3236, 17649,17651,317, 1347, 17652,17653,17654,17656,17657,363, 418, 17660,12879,317, 17663,17668,9175, 363, 17669,8419, 17664,17665,17666, - 17667,17670,17672,490, 490, 17674,17676,17679,317, 2086, 7668, 17675,3751, 5325, 317, 17677,381, 17678,317, 2715, 317, 2022, 4980, 317, 2142, 17680,6996, + 17667,17670,17672,490, 490, 17674,17676,17679,317, 2086, 7668, 17675,3751, 5325, 317, 17677,381, 17678,317, 2715, 317, 2022, 4980, 317, 2142, 17680,6996, 633, 317, 10347,317, 17682,317, 17683,17685,6188, 6535, 342, 13338,17686,17700,17714,501, 17716,17732,17735,1020, 17740,17744,17746,17753,17790,17792,17795, - 17687,2416, 11163,317, 317, 17688,17689,17691,17699,17690,2416, 317, 17692,490, 17694,17695,17696,17697,17693,490, 5611, 332, 2142, 596, 317, 718, 317, + 17687,2416, 11163,317, 317, 17688,17689,17691,17699,17690,2416, 317, 17692,490, 17694,17695,17696,17697,17693,490, 5611, 332, 2142, 596, 317, 718, 317, 345, 17698,17701,17702,17704,343, 17706,17707,17712,12769,5105, 17703,2022, 1347, 3987, 17705,317, 9048, 2272, 5120, 317, 17708,17711,4984, 317, 17709,17710, 363, 17713,351, 427, 17715,637, 332, 17717,17725,17469,1347, 17726,317, 6228, 1194, 404, 2024, 17718,17719,17720,317, 9779, 17721,1160, 17722,17723,17724, - 17727,2035, 5570, 15143,17728,317, 10149,332, 317, 490, 12423,317, 17729,17730,363, 17731,17733,6598, 17734,317, 990, 317, 17736,17739,363, 343, 490, - 317, 381, 17737,317, 1160, 17738,317, 317, 345, 867, 7383, 1347, 17741,11654,343, 363, 317, 371, 317, 17742,17743,317, 489, 17745,345, 17747,317, + 17727,2035, 5570, 15143,17728,317, 10149,332, 317, 490, 12423,317, 17729,17730,363, 17731,17733,6598, 17734,317, 990, 317, 17736,17739,363, 343, 490, + 317, 381, 17737,317, 1160, 17738,317, 317, 345, 867, 7383, 1347, 17741,11654,343, 363, 317, 371, 317, 17742,17743,317, 489, 17745,345, 17747,317, 17748,17749,17750,17751,17752,17754,17755,17763,501, 17767,17069,17775,2146, 17776,362, 17780,17786,404, 17788,317, 17756,17758,17761,365, 317, 317, 17757, 317, 317, 2211, 2272, 17759,17760,9265, 17453,17762,2381, 317, 4984, 343, 17764,343, 17765,17766,5840, 7941, 11782,17768,342, 317, 17769,317, 17770,17772, - 17773,17771,317, 17774,3522, 2142, 17777,17778,7672, 17779,17781,17783,17785,490, 15051,8218, 317, 17782,317, 17784,17787,17789,7657, 620, 5570, 345, 317, + 17773,17771,317, 17774,3522, 2142, 17777,17778,7672, 17779,17781,17783,17785,490, 15051,8218, 317, 17782,317, 17784,17787,17789,7657, 620, 5570, 345, 317, 363, 17791,7000, 17793,350, 17794,381, 17796,17815,17817,17827,17846,9624, 17854,9876, 17859,350, 348, 9420, 17864,17890,2086, 17898,17900,17928,17930,17933, 5054, 17934,17797,2163, 17799,17804,17805,17807,343, 17810,7523, 14132,17813,1230, 17798,17800,7771, 17801,317, 6996, 633, 351, 317, 317, 5055, 17802,17803, - 317, 317, 17806,317, 17808,317, 17809,317, 1347, 17811,2058, 343, 317, 9521, 17812,317, 317, 427, 5652, 317, 363, 17814,433, 343, 17816,317, 396, - 2110, 332, 17818,8937, 17825,2210, 5439, 5684, 17819,17824,356, 466, 17820,317, 17821,356, 17823,17822,5167, 317, 5481, 1588, 382, 633, 4591, 317, 2381, - 332, 17826,17828,17829,17831,17834,17839,17843,490, 317, 17844,343, 17830,6394, 343, 748, 317, 17832,345, 17833,1109, 2110, 9917, 317, 343, 17835,5447, - 380, 317, 17836,317, 17838,370, 317, 5201, 17837,1347, 466, 1588, 439, 17840,389, 317, 332, 17841,348, 317, 16367,3987, 17842,373, 317, 317, 317, - 332, 6228, 317, 633, 476, 565, 17845,7688, 7428, 362, 317, 6994, 351, 317, 17847,490, 8904, 17848,17851,17852,317, 1109, 317, 345, 6409, 317, 317, + 317, 317, 17806,317, 17808,317, 17809,317, 1347, 17811,2058, 343, 317, 9521, 17812,317, 317, 427, 5652, 317, 363, 17814,433, 343, 17816,317, 396, + 2110, 332, 17818,8937, 17825,2210, 5439, 5684, 17819,17824,356, 466, 17820,317, 17821,356, 17823,17822,5167, 317, 5481, 1588, 382, 633, 4591, 317, 2381, + 332, 17826,17828,17829,17831,17834,17839,17843,490, 317, 17844,343, 17830,6394, 343, 748, 317, 17832,345, 17833,1109, 2110, 9917, 317, 343, 17835,5447, + 380, 317, 17836,317, 17838,370, 317, 5201, 17837,1347, 466, 1588, 439, 17840,389, 317, 332, 17841,348, 317, 16367,3987, 17842,373, 317, 317, 317, + 332, 6228, 317, 633, 476, 565, 17845,7688, 7428, 362, 317, 6994, 351, 317, 17847,490, 8904, 17848,17851,17852,317, 1109, 317, 345, 6409, 317, 317, 3648, 362, 17849,17850,867, 2211, 317, 17853,365, 5890, 345, 17855,17857,17856,365, 317, 17858,17856,332, 4591, 2012, 396, 17860,4984, 343, 17861,17862, 4591, 2509, 17863,17865,17872,17875,17884,17888,17454,317, 17866,17869,317, 17870,356, 17871,332, 17867,17868,317, 1345, 17873,14663,317, 317, 17874,17876, 396, 5861, 17880,17882,17877,345, 17878,17879,317, 7682, 1526, 17881,17883,371, 7168, 17885,317, 317, 2261, 17886,9626, 317, 350, 317, 17887,17889,17891, - 490, 490, 17892,17896,365, 1943, 490, 317, 9385, 317, 317, 317, 17893,2413, 17894,370, 7910, 345, 12769,17895,7888, 7888, 5418, 317, 17897,345, 317, + 490, 490, 17892,17896,365, 1943, 490, 317, 9385, 317, 317, 317, 17893,2413, 17894,370, 7910, 345, 12769,17895,7888, 7888, 5418, 317, 17897,345, 317, 5428, 17899,12199,4984, 2077, 332, 17901,17911,9624, 17913,17919,17920,17924,17927,317, 2012, 317, 3987, 317, 17902,17904,2171, 2163, 17906,17908,17909,17910, 343, 373, 17903,2035, 5217, 17905,17907,5328, 5687, 1347, 1588, 317, 5055, 13376,5022, 17912,317, 10442,317, 2155, 317, 17914,17918,17915,332, 17916,17917, - 317, 317, 2132, 317, 370, 605, 17921,2503, 17923,317, 17922,7095, 317, 5399, 317, 6780, 317, 317, 427, 428, 17925,317, 17926,317, 17929,317, 7452, - 343, 17931,370, 17932,345, 7858, 332, 17935,17936,17938,17939,3941, 363, 17941,426, 17955,17956,17969,17986,17989,18002,18015,18027,18035,18043,3987, 6833, - 620, 17942,17947,596, 17951,17953,17954,6300, 7384, 17943,17945,17944,17946,317, 9422, 17948,17949,523, 17950,2510, 317, 332, 5439, 17952,6486, 9869, 2086, + 317, 317, 2132, 317, 370, 605, 17921,2503, 17923,317, 17922,7095, 317, 5399, 317, 6780, 317, 317, 427, 428, 17925,317, 17926,317, 17929,317, 7452, + 343, 17931,370, 17932,345, 7858, 332, 17935,17936,17938,17939,3941, 363, 17941,426, 17955,17956,17969,17986,17989,18002,18015,18027,18035,18043,3987, 6833, + 620, 17942,17947,596, 17951,17953,17954,6300, 7384, 17943,17945,17944,17946,317, 9422, 17948,17949,523, 17950,2510, 317, 332, 5439, 17952,6486, 9869, 2086, 17957,317, 5159, 317, 17958,17960,17961,17965,17967,17968,17959,317, 317, 9521, 317, 317, 317, 351, 2163, 17962,363, 317, 404, 17963,17964,2261, 17966, - 2590, 332, 11851,317, 5841, 17970,490, 17971,17973,17974,17977,17985,343, 7777, 5570, 17972,343, 17975,17976,17978,17982,17984,2272, 17979,7668, 317, 317, + 2590, 332, 11851,317, 5841, 17970,490, 17971,17973,17974,17977,17985,343, 7777, 5570, 17972,343, 17975,17976,17978,17982,17984,2272, 17979,7668, 317, 317, 317, 17980,317, 17981,10674,5225, 1325, 317, 7242, 17983,363, 17987,17988,350, 317, 574, 317, 17990,7521, 7579, 17993,17996,17999,343, 2108, 18000,17991, - 17992,17994,17995,17939,17997,17998,373, 2380, 18001,18003,18006,18009,2254, 18010,317, 18011,1160, 18004,1999, 8766, 317, 18005,317, 18007,317, 489, 363, - 18008,5328, 6993, 7142, 317, 2715, 5033, 382, 18012,18013,5570, 18014,18016,18018,10058,18017,15445,621, 2105, 18019,18023,18026,2322, 365, 317, 18020,1347, + 17992,17994,17995,17939,17997,17998,373, 2380, 18001,18003,18006,18009,2254, 18010,317, 18011,1160, 18004,1999, 8766, 317, 18005,317, 18007,317, 489, 363, + 18008,5328, 6993, 7142, 317, 2715, 5033, 382, 18012,18013,5570, 18014,18016,18018,10058,18017,15445,621, 2105, 18019,18023,18026,2322, 365, 317, 18020,1347, 5727, 18022,18021,18024,18025,18028,18030,18031,2584, 18032,18033,18029,741, 317, 5441, 363, 2272, 18034,351, 1347, 363, 18036,18039,2510, 18042,18037,18038, 317, 317, 317, 370, 356, 466, 317, 317, 10528,18040,18041,1347, 397, 5328, 18044,18045,867, 7668, 5890, 12598,2272, 4268, 466, 18047,18048,18049,18082, - 18108,18120,18158,18169,18171,5159, 18173,11255,18194,18195,18213,18229,18247,18265,18282,18319,18330,18362,18364,18369,18370,490, 18050,18057,18061,490, 6194, + 18108,18120,18158,18169,18171,5159, 18173,11255,18194,18195,18213,18229,18247,18265,18282,18319,18330,18362,18364,18369,18370,490, 18050,18057,18061,490, 6194, 350, 382, 357, 350, 2416, 18063,18067,516, 18069,18071,18075,1230, 317, 18051,18052,18053,3375, 345, 433, 2142, 317, 5483, 18054,343, 317, 18055,18056, - 18058,18059,380, 332, 6817, 348, 317, 18060,2272, 18062,18064,490, 18065,363, 18066,2357, 18068,317, 490, 332, 18070,18072,317, 2210, 18073,18074,345, + 18058,18059,380, 332, 6817, 348, 317, 18060,2272, 18062,18064,490, 18065,363, 18066,2357, 18068,317, 490, 332, 18070,18072,317, 2210, 18073,18074,345, 18076,18080,18077,2416, 18078,365, 18079,596, 18081,317, 489, 18083,18085,18086,18087,317, 18103,317, 371, 433, 18084,2413, 370, 4943, 317, 2156, 10430, 343, 5634, 18088,18090,18095,18089,18091,6195, 18093,18094,11921,317, 380, 18092,5611, 9832, 590, 13376,317, 14983,18096,18097,18098,14682,339, 18099,18100, 18101,18102,18104,18105,18106,18107,356, 2510, 12958,18109,6993, 18112,18113,317, 332, 5611, 18110,18111,345, 10770,317, 2178, 18114,18115,18116,6409, 18117, 18118,5652, 18119,317, 18121,5279, 18124,18127,18129,343, 362, 332, 18155,18157,8362, 3987, 317, 18122,365, 8766, 7005, 7035, 18123,317, 867, 404, 18125, - 18126,7143, 317, 15618,345, 18128,5732, 380, 396, 18130,2142, 9422, 18134,18137,390, 18131,18132,18133,18135,317, 5862, 317, 18136,317, 574, 317, 1329, - 365, 317, 18138,8322, 18139,18143,18148,18153,18140,18141,10255,18142,18144,18145,18146,18147,18149,18150,18151,18152,18154,18156,7954, 490, 5611, 18159,6551, - 12429,317, 18160,18161,18162,18164,10351,1347, 18167,18168,317, 317, 317, 511, 1347, 558, 5701, 18163,317, 18165,7143, 18166,13999,2188, 332, 18170,2110, + 18126,7143, 317, 15618,345, 18128,5732, 380, 396, 18130,2142, 9422, 18134,18137,390, 18131,18132,18133,18135,317, 5862, 317, 18136,317, 574, 317, 1329, + 365, 317, 18138,8322, 18139,18143,18148,18153,18140,18141,10255,18142,18144,18145,18146,18147,18149,18150,18151,18152,18154,18156,7954, 490, 5611, 18159,6551, + 12429,317, 18160,18161,18162,18164,10351,1347, 18167,18168,317, 317, 317, 511, 1347, 558, 5701, 18163,317, 18165,7143, 18166,13999,2188, 332, 18170,2110, 2022, 18172,343, 1078, 370, 18174,18175,18176,18182,18183,489, 18184,350, 18185,18187,18189,18190,18193,11921,5628, 317, 8633, 317, 18177,18181,18178,18179, 18180,5447, 412, 356, 365, 357, 2272, 18186,17851,317, 5120, 357, 317, 18188,490, 7521, 317, 18191,490, 490, 332, 18192,1347, 2188, 11344,550, 18196, 5896, 18197,18199,317, 18204,18207,18211,7385, 18212,16424,637, 7386, 1325, 317, 317, 5626, 4984, 5891, 317, 317, 18198,317, 317, 317, 17219,18200,18202, - 18203,317, 18201,317, 317, 2024, 404, 317, 343, 317, 1347, 317, 3125, 371, 362, 6278, 18205,7522, 4943, 317, 5890, 18206,317, 1025, 18208,363, 2022, - 363, 404, 18210,356, 18209,363, 363, 426, 317, 317, 343, 317, 363, 18214,18218,18223,2022, 18228,371, 363, 18215,18216,18217,363, 18219,18222,317, - 6996, 317, 18220,7143, 317, 317, 490, 18221,18224,2381, 8529, 18225,18227,343, 2134, 18226,370, 6402, 10533,2410, 18230,18235,18238,2022, 18245,4477, 317, - 9289, 317, 370, 317, 10223,18231,18232,317, 5142, 18233,433, 363, 2073, 362, 18234,380, 18236,867, 18237,357, 317, 381, 6195, 317, 363, 8766, 317, - 1428, 5561, 2142, 343, 18239,2271, 18240,18241,18242,18243,18244,1347, 4591, 362, 553, 317, 18246,6195, 317, 2271, 18248,317, 18255,18258,18259,18262,5836, - 11055,18264,748, 317, 10041,3599, 18249,365, 18250,18252,317, 345, 18253,18251,317, 6420, 6420, 7147, 5419, 18254,18256,317, 490, 18257,17453,5032, 317, - 18260,2188, 356, 18261,317, 7328, 2322, 13962,18263,18266,18267,18274,596, 18278,317, 2210, 371, 9047, 18268,345, 18270,317, 18273,18269,2322, 18271,9993, - 7419, 18272,370, 18275,317, 15464,317, 18276,18277,380, 18279,18280,18281,317, 5482, 18283,18287,18291,18308,18314,18318,2271, 18284,2271, 419, 16825,596, + 18203,317, 18201,317, 317, 2024, 404, 317, 343, 317, 1347, 317, 3125, 371, 362, 6278, 18205,7522, 4943, 317, 5890, 18206,317, 1025, 18208,363, 2022, + 363, 404, 18210,356, 18209,363, 363, 426, 317, 317, 343, 317, 363, 18214,18218,18223,2022, 18228,371, 363, 18215,18216,18217,363, 18219,18222,317, + 6996, 317, 18220,7143, 317, 317, 490, 18221,18224,2381, 8529, 18225,18227,343, 2134, 18226,370, 6402, 10533,2410, 18230,18235,18238,2022, 18245,4477, 317, + 9289, 317, 370, 317, 10223,18231,18232,317, 5142, 18233,433, 363, 2073, 362, 18234,380, 18236,867, 18237,357, 317, 381, 6195, 317, 363, 8766, 317, + 1428, 5561, 2142, 343, 18239,2271, 18240,18241,18242,18243,18244,1347, 4591, 362, 553, 317, 18246,6195, 317, 2271, 18248,317, 18255,18258,18259,18262,5836, + 11055,18264,748, 317, 10041,3599, 18249,365, 18250,18252,317, 345, 18253,18251,317, 6420, 6420, 7147, 5419, 18254,18256,317, 490, 18257,17453,5032, 317, + 18260,2188, 356, 18261,317, 7328, 2322, 13962,18263,18266,18267,18274,596, 18278,317, 2210, 371, 9047, 18268,345, 18270,317, 18273,18269,2322, 18271,9993, + 7419, 18272,370, 18275,317, 15464,317, 18276,18277,380, 18279,18280,18281,317, 5482, 18283,18287,18291,18308,18314,18318,2271, 18284,2271, 419, 16825,596, 18285,317, 490, 18069,18286,748, 1230, 5428, 332, 317, 490, 5611, 2381, 12001,4965, 349, 11034,12001,332, 350, 17018,332, 363, 18288,18290,317, 18289, 317, 317, 12001,2188, 5570, 490, 18292,18295,2271, 18300,18301,350, 18302,18303,4984, 18304,18263,11921,18306,18293,317, 18294,18296,317, 18297,18298,18299, 317, 357, 6578, 317, 363, 351, 317, 18305,363, 18307,317, 490, 18309,317, 18310,317, 18311,18312,11055,748, 317, 2188, 317, 18313,18315,317, 18316, - 18317,18320,18322,18323,18325,332, 5684, 18326,3987, 18321,18324,18327,18328,363, 1033, 5585, 18329,18331,18334,18338,18344,18348,18349,350, 18352,18358,317, - 8204, 18360,317, 18332,317, 490, 18333,317, 317, 317, 9699, 18335,317, 18336,5624, 317, 18337,621, 381, 7941, 18339,18342,363, 18343,317, 18340,317, + 18317,18320,18322,18323,18325,332, 5684, 18326,3987, 18321,18324,18327,18328,363, 1033, 5585, 18329,18331,18334,18338,18344,18348,18349,350, 18352,18358,317, + 8204, 18360,317, 18332,317, 490, 18333,317, 317, 317, 9699, 18335,317, 18336,5624, 317, 18337,621, 381, 7941, 18339,18342,363, 18343,317, 18340,317, 18341,351, 18345,1992, 18346,18347,1347, 8272, 439, 7368, 7368, 18350,17400,428, 18351,18353,1347, 18354,2410, 18355,317, 18356,317, 382, 18357,2610, 18359, 9067, 471, 18361,2301, 18363,7386, 2142, 357, 18316,2416, 490, 18365,18367,18368,433, 18366,490, 332, 332, 332, 317, 5105, 1347, 317, 381, 317, 11533, 9649, 13729,428, 12202,18371,18394,18396,18401,18403,317, 7072, 18412,18421,18428,18430,2171, 350, 18431,18433,965, 18439,18465,18519,3987, 317, 18372,18376, 18377,18378,18381,18384,18386,18388,18392,345, 18393,748, 18373,2035, 18374,18375,9538, 6402, 317, 365, 1347, 317, 18379,18380,18382,18383,362, 317, 18385, - 6517, 514, 2146, 1347, 2110, 18387,18389,332, 18390,317, 2381, 332, 317, 317, 18391,2369, 1108, 18395,350, 479, 18397,18399,7916, 18398,345, 317, 5447, - 9522, 18400,17462,18402,18404,317, 18406,18407,18408,18410,317, 3987, 18411,350, 350, 18405,381, 371, 501, 7954, 355, 404, 18409,2369, 1266, 6996, 8301, + 6517, 514, 2146, 1347, 2110, 18387,18389,332, 18390,317, 2381, 332, 317, 317, 18391,2369, 1108, 18395,350, 479, 18397,18399,7916, 18398,345, 317, 5447, + 9522, 18400,17462,18402,18404,317, 18406,18407,18408,18410,317, 3987, 18411,350, 350, 18405,381, 371, 501, 7954, 355, 404, 18409,2369, 1266, 6996, 8301, 2077, 317, 6996, 18413,3599, 18414,18416,2401, 18417,18418,18420,3987, 18415,317, 317, 317, 317, 317, 381, 1347, 2510, 1992, 4984, 363, 11648,18419,10223, - 343, 18422,490, 317, 18423,18425,18427,1160, 317, 6409, 2368, 317, 18424,1347, 345, 317, 18426,1347, 317, 1347, 317, 18429,317, 6036, 363, 18432,317, - 5241, 18434,18436,6600, 18435,343, 9473, 317, 18437,18438,317, 633, 5300, 18440,18447,18453,350, 18460,18461,18463,5037, 317, 18441,2272, 18442,18444,343, - 18445,17658,18446,1345, 6188, 317, 18443,317, 18387,351, 1109, 317, 317, 5570, 317, 18391,7021, 595, 1230, 18448,18449,317, 345, 18450,343, 18451,345, - 1160, 10641,10375,362, 317, 370, 373, 18452,18454,18455,8346, 7657, 18456,18457,7095, 370, 345, 6486, 317, 317, 9020, 317, 18458,18459,363, 2405, 371, - 18462,18464,18466,18472,18484,18493,350, 18501,18505,317, 18467,5438, 18469,7405, 18468,317, 350, 17454,18470,18471,332, 4984, 317, 5611, 317, 380, 404, - 18473,18481,18483,317, 363, 7657, 18474,18479,317, 427, 18475,4980, 18477,317, 18478,18476,365, 1526, 317, 317, 7523, 317, 8243, 8217, 317, 8841, 317, - 590, 18480,18482,2004, 490, 2086, 380, 18485,18488,18492,2381, 2601, 18486,18487,317, 5419, 18489,317, 18490,18491,6382, 4984, 18494,466, 317, 18495,2024, - 565, 18496,18497,317, 18499,317, 11782,5430, 351, 7590, 18498,18500,317, 18502,18504,18503,1230, 1230, 380, 9214, 18506,18508,18509,18510,18518,18507,867, - 356, 404, 317, 404, 14144,317, 317, 7035, 345, 2142, 18511,317, 18514,317, 18516,18512,18513,4757, 18515,18517,18520,18522,18523,18521,7149, 317, 6228, + 343, 18422,490, 317, 18423,18425,18427,1160, 317, 6409, 2368, 317, 18424,1347, 345, 317, 18426,1347, 317, 1347, 317, 18429,317, 6036, 363, 18432,317, + 5241, 18434,18436,6600, 18435,343, 9473, 317, 18437,18438,317, 633, 5300, 18440,18447,18453,350, 18460,18461,18463,5037, 317, 18441,2272, 18442,18444,343, + 18445,17658,18446,1345, 6188, 317, 18443,317, 18387,351, 1109, 317, 317, 5570, 317, 18391,7021, 595, 1230, 18448,18449,317, 345, 18450,343, 18451,345, + 1160, 10641,10375,362, 317, 370, 373, 18452,18454,18455,8346, 7657, 18456,18457,7095, 370, 345, 6486, 317, 317, 9020, 317, 18458,18459,363, 2405, 371, + 18462,18464,18466,18472,18484,18493,350, 18501,18505,317, 18467,5438, 18469,7405, 18468,317, 350, 17454,18470,18471,332, 4984, 317, 5611, 317, 380, 404, + 18473,18481,18483,317, 363, 7657, 18474,18479,317, 427, 18475,4980, 18477,317, 18478,18476,365, 1526, 317, 317, 7523, 317, 8243, 8217, 317, 8841, 317, + 590, 18480,18482,2004, 490, 2086, 380, 18485,18488,18492,2381, 2601, 18486,18487,317, 5419, 18489,317, 18490,18491,6382, 4984, 18494,466, 317, 18495,2024, + 565, 18496,18497,317, 18499,317, 11782,5430, 351, 7590, 18498,18500,317, 18502,18504,18503,1230, 1230, 380, 9214, 18506,18508,18509,18510,18518,18507,867, + 356, 404, 317, 404, 14144,317, 317, 7035, 345, 2142, 18511,317, 18514,317, 18516,18512,18513,4757, 18515,18517,18520,18522,18523,18521,7149, 317, 6228, 1112, 18524,18565,18566,18573,18574,18597,18602,18622,3078, 18626,18628,1597, 18631,18634,18638,18642,18653,317, 18654,18525,18527,18534,18544,18548,18553,15387, 18555,18556,18562,18564,18526,18528,18531,18533,18529,18530,18532,18535,5439, 18537,18538,365, 18540,490, 15552,18542,18536,343, 11447,317, 11447,317, 18539, - 18541,5406, 356, 466, 317, 5717, 18543,401, 5717, 5447, 345, 1347, 18545,18547,18546,5055, 490, 2108, 18549,393, 1109, 317, 18550,18551,332, 18552,5570, - 18554,5988, 2035, 18557,18558,18559,18560,18561,1347, 7222, 18563,490, 2333, 1999, 551, 370, 18567,6996, 18568,9648, 18569,18571,317, 18570,18572,373, 4396, + 18541,5406, 356, 466, 317, 5717, 18543,401, 5717, 5447, 345, 1347, 18545,18547,18546,5055, 490, 2108, 18549,393, 1109, 317, 18550,18551,332, 18552,5570, + 18554,5988, 2035, 18557,18558,18559,18560,18561,1347, 7222, 18563,490, 2333, 1999, 551, 370, 18567,6996, 18568,9648, 18569,18571,317, 18570,18572,373, 4396, 13719,590, 18575,432, 18583,6937, 18589,18591,14295,343, 18576,519, 18577,18578,18582,18579,18580,18581,18584,18585,18586,317, 317, 9313, 345, 18587,18588, 5225, 5447, 466, 18590,363, 5571, 370, 10422,554, 10804,18592,317, 18595,18593,18594,18596,18598,18601,471, 18599,18600,18603,5159, 18606,1358, 527, 18616, 18621,1160, 317, 18604,317, 18605,2001, 401, 18607,380, 8384, 18610,18612,317, 18608,18609,18611,362, 317, 4980, 6089, 363, 18613,18614,18615,317, 18617, - 18618,393, 18619,18620,965, 5343, 345, 317, 2272, 363, 18623,18624,18625,8271, 2272, 332, 317, 5687, 2631, 317, 18627,363, 491, 990, 381, 18629,428, - 18630,18632,317, 18077,1588, 2279, 18633,5890, 2381, 1020, 317, 15510,18635,2117, 18637,6318, 18636,343, 8597, 2035, 18639,5108, 4974, 18640,18641,345, 1060, - 18643,18648,466, 18650,18652,3987, 317, 317, 18644,18645,18646,2108, 332, 317, 18647,317, 380, 18649,384, 404, 404, 7368, 18651,10149,490, 2279, 317, - 7386, 6207, 317, 18655,450, 18657,373, 18658,18662,18665,18666,18668,18673,18677,8807, 317, 18659,18661,5335, 18660,5419, 345, 17591,18663,18664,343, 404, + 18618,393, 18619,18620,965, 5343, 345, 317, 2272, 363, 18623,18624,18625,8271, 2272, 332, 317, 5687, 2631, 317, 18627,363, 491, 990, 381, 18629,428, + 18630,18632,317, 18077,1588, 2279, 18633,5890, 2381, 1020, 317, 15510,18635,2117, 18637,6318, 18636,343, 8597, 2035, 18639,5108, 4974, 18640,18641,345, 1060, + 18643,18648,466, 18650,18652,3987, 317, 317, 18644,18645,18646,2108, 332, 317, 18647,317, 380, 18649,384, 404, 404, 7368, 18651,10149,490, 2279, 317, + 7386, 6207, 317, 18655,450, 18657,373, 18658,18662,18665,18666,18668,18673,18677,8807, 317, 18659,18661,5335, 18660,5419, 345, 17591,18663,18664,343, 404, 317, 450, 6598, 18667,15734,1020, 362, 479, 11236,317, 18669,370, 9624, 18670,18672,2022, 351, 404, 3987, 18671,18674,370, 18676,466, 2022, 401, 18675, 5220, 397, 370, 317, 317, 7405, 317, 18678,18680,18682,317, 18679,8557, 7385, 363, 18681,404, 2142, 18683,18684,6670, 317, 448, 356, 317, 18686,18707, 18713,2571, 18717,7850, 18718,332, 18687,5173, 18689,18701,18703,2086, 2086, 18688,3522, 18690,11067,18693,18696,317, 18699,8594, 18691,343, 18692,18694,18695, - 18697,18698,317, 317, 18700,18702,476, 390, 317, 4943, 18704,7567, 18705,18706,4268, 317, 5105, 18708,18709,18711,317, 381, 317, 4980, 18710,12102,351, + 18697,18698,317, 317, 18700,18702,476, 390, 317, 4943, 18704,7567, 18705,18706,4268, 317, 5105, 18708,18709,18711,317, 381, 317, 4980, 18710,12102,351, 389, 370, 18712,7070, 351, 18714,317, 8863, 5105, 18715,18716,476, 317, 317, 5225, 317, 596, 317, 317, 12656,351, 2146, 1020, 2022, 18720,18721,18722, - 18723,18724,404, 348, 404, 18727,343, 18729,18730,5419, 343, 18731,4980, 404, 18732,6089, 18728,362, 317, 2272, 317, 317, 7657, 317, 18734,18737,350, + 18723,18724,404, 348, 404, 18727,343, 18729,18730,5419, 343, 18731,4980, 404, 18732,6089, 18728,362, 317, 2272, 317, 317, 7657, 317, 18734,18737,350, 18740,18741,18735,18736,9321, 317, 18738,434, 18739,428, 18742,18744,18747,339, 18749,18753,367, 18755,18757,18758,317, 18763,1358, 18772,18775,18745,18746, 936, 18748,18750,18752,18751,18754,7892, 18756,490, 427, 18759,18760,1193, 18761,18762,619, 18764,18768,8746, 317, 5841, 18765,18766,18767,351, 18769,18771, 18770,18773,18774,490, 8023, 18777,345, 18782,345, 18783,370, 740, 18786,18778,18781,317, 317, 18779,317, 18780,18784,18785,18788,18788,17274,2162, 18790, 317, 18792,6651, 15680,18796,490, 490, 16319,1347, 317, 18798,18804,18806,18789,18791,18793,18794,2474, 18795,18797,18799,351, 317, 607, 18800,396, 18801, 18803,18802,18805,18807,18808,18809,18810,18811,18819,18822,18834,18843,18844,18847,18856,8333, 18860,18896,18899,18953,18955,18972,19045,19055,489, 19061,19064, 19066,19068,18812,18814,18815,18817,317, 18813,317, 15915,345, 351, 18816,466, 351, 317, 2609, 2571, 317, 317, 18818,18820,12738,18821,18823,18824,18828, - 18829,18830,6222, 18833,8765, 18825,6993, 18826,18827,5241, 490, 343, 18831,317, 317, 317, 18832,343, 317, 18835,18837,18841,2128, 18842,332, 18836,317, + 18829,18830,6222, 18833,8765, 18825,6993, 18826,18827,5241, 490, 343, 18831,317, 317, 317, 18832,343, 317, 18835,18837,18841,2128, 18842,332, 18836,317, 317, 332, 18838,5896, 18839,18840,17117,382, 14289,2272, 558, 11055,317, 18845,317, 8633, 18846,1060, 18848,18849,18850,317, 11347,18851,18852,18853,18854, 18855,490, 18857,7657, 18859,18858,390, 10878,18861,11442,18862,18872,343, 18878,350, 1434, 18889,18890,18895,317, 404, 7668, 490, 18863,404, 18868,18661, - 18869,490, 345, 317, 18864,317, 18865,317, 18867,4268, 18866,317, 7657, 490, 18870,317, 1160, 18871,9325, 6565, 1331, 18873,18875,317, 18877,317, 345, - 18874,18876,7419, 18879,1325, 18880,6275, 18881,18883,317, 18886,351, 365, 317, 4268, 18882,317, 18884,18885,7386, 18887,2279, 351, 574, 18888,356, 8231, - 317, 4591, 317, 345, 633, 317, 18891,317, 18892,18893,317, 18894,673, 649, 339, 1160, 390, 7481, 6780, 8403, 18897,10556,18898,448, 8544, 5223, 365, + 18869,490, 345, 317, 18864,317, 18865,317, 18867,4268, 18866,317, 7657, 490, 18870,317, 1160, 18871,9325, 6565, 1331, 18873,18875,317, 18877,317, 345, + 18874,18876,7419, 18879,1325, 18880,6275, 18881,18883,317, 18886,351, 365, 317, 4268, 18882,317, 18884,18885,7386, 18887,2279, 351, 574, 18888,356, 8231, + 317, 4591, 317, 345, 633, 317, 18891,317, 18892,18893,317, 18894,673, 649, 339, 1160, 390, 7481, 6780, 8403, 18897,10556,18898,448, 8544, 5223, 365, 18900,380, 317, 18902,18904,18909,18913,18333,18901,18903,18905,18907,18908,18906,370, 18910,18912,18911,356, 466, 7821, 5492, 1078, 18914,426, 18918,18926, 350, 18931,18933,317, 18949,18915,317, 18916,2086, 18917,18919,18924,18920,18922,317, 18921,18923,356, 18925,466, 2271, 7614, 317, 5037, 1588, 578, 18927, - 365, 18930,18928,317, 18929,2510, 2156, 490, 18932,18934,18938,18942,18948,427, 380, 18935,317, 317, 18936,370, 317, 18937,370, 10674,5225, 356, 317, + 365, 18930,18928,317, 18929,2510, 2156, 490, 18932,18934,18938,18942,18948,427, 380, 18935,317, 317, 18936,370, 317, 18937,370, 10674,5225, 356, 317, 317, 317, 18939,362, 18940,317, 5037, 18941,4925, 18943,17160,18947,381, 18944,18945,18946,1347, 317, 18950,18951,18952,345, 5055, 490, 317, 18954,18956, 18957,18958,363, 18968,18970,317, 18959,18967,345, 18960,317, 339, 18961,9027, 9822, 18962,18965,18963,18964,345, 18966,18969,18971,835, 18973,18979,18981, 18982,18984,1430, 19005,19008,19010,19014,19016,19017,11952,19023,19035,19037,490, 18974,5836, 1347, 317, 18977,18978,18975,18976,2012, 343, 381, 317, 17462, 18978,6541, 18980,2272, 357, 5241, 343, 2272, 317, 18983,4564, 18985,18992,18994,18996,18997,19001,317, 317, 2715, 19002,332, 18986,18989,345, 18987,18988, 380, 18990,427, 18991,18153,18993,596, 1078, 18995,18998,18999,19000,317, 5701, 345, 10168,19003,19004,332, 317, 343, 19006,427, 19007,371, 5570, 19009, - 19011,1345, 19012,19013,2322, 317, 390, 5727, 490, 19015,317, 317, 2317, 19018,19019,19020,19022,12949,2142, 332, 490, 2142, 19021,6486, 1347, 19024,2132, + 19011,1345, 19012,19013,2322, 317, 390, 5727, 490, 19015,317, 317, 2317, 19018,19019,19020,19022,12949,2142, 332, 490, 2142, 19021,6486, 1347, 19024,2132, 19027,19033,317, 19025,8178, 19026,418, 370, 5201, 19028,2176, 19029,2184, 9482, 19030,5464, 19031,19032,5447, 5054, 19034,6541, 19036,2715, 362, 5439, 19038, 19041,19044,11669,345, 19039,19040,19042,19043,2715, 490, 371, 490, 6555, 317, 433, 317, 317, 19046,317, 2035, 10351,19048,19049,19050,19054,1588, 19047, 1615, 6379, 317, 5225, 404, 19051,351, 535, 19052,384, 19053,2178, 9265, 490, 958, 2272, 19056,2110, 19058,19059,490, 345, 19057,19060,18820,19062,19063, @@ -7207,273 +7202,273 @@ static const unsigned int ChildLocs[185261] = 1430, 19082,19081,19084,19085,19086,19087,19091,19092,19065,19094,19095,19093,19096,19097,608, 607, 19100,19102,1060, 19107,19113,19101,19103,19104,19105,19106, 19108,19109,19110,19111,19112,19114,19115,9186, 19116,19119,19123,58, 19484,390, 59, 19666,19670,60, 19874,19875,19895,19903,19996,20103,20104,20156,20158, 20162,19117,19118,19120,19121,19122,17290,19124,19130,19137,317, 19146,19150,19154,19158,404, 19177,19192,19220,19249,19305,19308,19334,19415,19428,19454,19473, - 2381, 19483,1100, 19125,6555, 19126,2163, 19128,19129,317, 565, 317, 356, 19127,317, 2381, 317, 9244, 490, 19131,317, 19133,332, 19136,19132,317, 5381, - 19134,1588, 7871, 317, 317, 19135,317, 19138,19140,19143,490, 19144,2022, 19145,19139,479, 16075,384, 19141,384, 317, 19142,317, 2067, 317, 370, 428, + 2381, 19483,1100, 19125,6555, 19126,2163, 19128,19129,317, 565, 317, 356, 19127,317, 2381, 317, 9244, 490, 19131,317, 19133,332, 19136,19132,317, 5381, + 19134,1588, 7871, 317, 317, 19135,317, 19138,19140,19143,490, 19144,2022, 19145,19139,479, 16075,384, 19141,384, 317, 19142,317, 2067, 317, 370, 428, 384, 19147,19148,9574, 19149,5055, 19151,404, 19152,19153,380, 317, 2351, 18239,317, 490, 19155,317, 19156,19157,19159,7473, 19160,317, 19162,19165,19175, - 19176,317, 19161,19163,466, 5005, 19164,317, 19166,466, 19167,19168,19172,317, 1871, 19169,363, 19170,19171,19173,19174,317, 404, 370, 15552,490, 317, + 19176,317, 19161,19163,466, 5005, 19164,317, 19166,466, 19167,19168,19172,317, 1871, 19169,363, 19170,19171,19173,19174,317, 404, 370, 15552,490, 317, 19178,490, 2163, 19182,433, 19179,19180,19181,19183,317, 19184,317, 19188,19185,19187,19186,19189,19190,19191,19193,19196,19202,19203,19204,19205,19208,19209, - 19215,19217,19218,17501,10596,19194,19195,19197,345, 19199,6894, 19198,19200,19201,5419, 11505,566, 2533, 1347, 363, 2369, 363, 2369, 17973,343, 19206,3094, + 19215,19217,19218,17501,10596,19194,19195,19197,345, 19199,6894, 19198,19200,19201,5419, 11505,566, 2533, 1347, 363, 2369, 363, 2369, 17973,343, 19206,3094, 490, 19207,5279, 14337,2022, 317, 19210,5896, 19211,19214,2568, 19212,350, 19213,19216,345, 574, 11928,316, 317, 19219,13211,317, 4984, 19221,332, 19229, 12761,19232,12454,19238,19240,19241,317, 380, 5105, 19222,19226,14161,343, 19223,356, 466, 19224,6309, 7910, 317, 19225,7237, 363, 356, 2272, 19227,19228, - 317, 19230,345, 19231,19233,7942, 19234,19235,19236,19237,19239,476, 345, 5590, 2326, 867, 363, 6228, 19242,14871,19244,19247,362, 2022, 19248,317, 317, + 317, 19230,345, 19231,19233,7942, 19234,19235,19236,19237,19239,476, 345, 5590, 2326, 867, 363, 6228, 19242,14871,19244,19247,362, 2022, 19248,317, 317, 332, 6318, 19243,370, 362, 343, 19245,19246,317, 356, 466, 2631, 9139, 12588,316, 19250,19251,19259,19279,19281,19287,15745,19288,19293,5054, 19294,19304, - 590, 370, 5619, 2058, 19252,19258,317, 317, 317, 317, 19253,1345, 317, 317, 19254,448, 19255,19256,19257,1597, 5037, 4984, 19260,19261,8829, 365, 345, + 590, 370, 5619, 2058, 19252,19258,317, 317, 317, 317, 19253,1345, 317, 317, 19254,448, 19255,19256,19257,1597, 5037, 4984, 19260,19261,8829, 365, 345, 1444, 19262,19273,317, 317, 10333,317, 351, 10993,19263,1481, 19271,317, 19264,13477,19266,317, 1444, 19268,19265,19267,19269,19270,2110, 565, 19272,19274, - 19275,19276,19277,19278,19280,317, 317, 14501,317, 13753,19282,2291, 19284,317, 1459, 404, 19285,19283,6996, 410, 317, 381, 511, 6713, 541, 490, 1347, - 317, 1060, 19286,317, 19289,466, 363, 19292,19290,317, 317, 317, 356, 19291,5363, 317, 382, 1526, 5295, 2272, 19295,19296,19297,19301,350, 345, 370, - 317, 317, 17926,317, 393, 19298,15540,19299,19300,19302,1033, 418, 382, 19303,2533, 343, 433, 19306,401, 2357, 19307,317, 1087, 741, 317, 19309,7448, + 19275,19276,19277,19278,19280,317, 317, 14501,317, 13753,19282,2291, 19284,317, 1459, 404, 19285,19283,6996, 410, 317, 381, 511, 6713, 541, 490, 1347, + 317, 1060, 19286,317, 19289,466, 363, 19292,19290,317, 317, 317, 356, 19291,5363, 317, 382, 1526, 5295, 2272, 19295,19296,19297,19301,350, 345, 370, + 317, 317, 17926,317, 393, 19298,15540,19299,19300,19302,1033, 418, 382, 19303,2533, 343, 433, 19306,401, 2357, 19307,317, 1087, 741, 317, 19309,7448, 19312,19315,6780, 332, 19319,19325,2391, 2067, 19326,10217,2509, 19330,19310,19311,19313,19314,317, 19316,317, 19317,1358, 370, 317, 19318,19320,19323,19324, 19321,19322,363, 7389, 19327,19328,343, 343, 317, 2163, 317, 317, 2291, 332, 317, 19329,317, 565, 1358, 19331,317, 19332,19333,590, 19335,19345,19350, 19352,19355,19360,19362,19366,19372,19389,19393,19395,19396,19399,15017,19402,19409,19411,19413,19336,19342,9027, 9993, 596, 19337,19338,19339,19340,317, 19341, - 10680,5225, 5447, 466, 6170, 1347, 19343,19344,19346,19347,10471,19348,19349,11144,317, 317, 19351,363, 19353,19354,19356,381, 574, 19358,19357,19359,9289, + 10680,5225, 5447, 466, 6170, 1347, 19343,19344,19346,19347,10471,19348,19349,11144,317, 317, 19351,363, 19353,19354,19356,381, 574, 19358,19357,19359,9289, 2178, 19361,19363,3999, 2163, 19364,410, 317, 15202,317, 19365,317, 382, 19367,19369,19371,550, 19368,317, 19370,5793, 7913, 317, 596, 363, 317, 19373, - 19374,19381,19384,19388,404, 345, 7000, 356, 5419, 317, 19375,4984, 19376,5793, 958, 19377,19379,19380,317, 10758,2369, 317, 317, 317, 317, 317, 317, + 19374,19381,19384,19388,404, 345, 7000, 356, 5419, 317, 19375,4984, 19376,5793, 958, 19377,19379,19380,317, 10758,2369, 317, 317, 317, 317, 317, 317, 317, 7567, 363, 317, 19378,5809, 5038, 2326, 19382,343, 343, 317, 19383,317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 19385, - 19386,317, 19387,317, 9931, 15510,5840, 19390,19391,19392,317, 363, 5635, 13868,350, 2022, 19394,6089, 363, 3941, 317, 19397,9522, 19398,356, 19400,4984, + 19386,317, 19387,317, 9931, 15510,5840, 19390,19391,19392,317, 363, 5635, 13868,350, 2022, 19394,6089, 363, 3941, 317, 19397,9522, 19398,356, 19400,4984, 317, 19401,19403,19405,19406,317, 317, 19404,317, 356, 7401, 8137, 317, 351, 382, 381, 19407,19408,19410,381, 19412,19414,19416,19417,2022, 19418,16187, - 363, 19419,19424,6228, 317, 317, 6420, 317, 317, 370, 1992, 370, 19420,19422,19423,363, 19421,19425,19426,19427,363, 11235,1358, 9832, 370, 19429,2416, + 363, 19419,19424,6228, 317, 317, 6420, 317, 317, 370, 1992, 370, 19420,19422,19423,363, 19421,19425,19426,19427,363, 11235,1358, 9832, 370, 19429,2416, 19431,9624, 554, 14143,19439,11236,4984, 12770,19440,19441,19451,1020, 19430,6963, 19432,19438,317, 19433,19434,19435,19436,19437,317, 19390,381, 19442,19448, 3999, 19450,317, 19443,19447,19444,19445,19446,317, 1347, 317, 19449,3599, 466, 558, 2022, 4980, 404, 19452,2078, 19453,19455,7490, 19456,1108, 19458,19461, 19462,8254, 19464,19465,19467,19469,317, 381, 19457,8906, 1020, 448, 370, 2178, 19459,19460,363, 2275, 19463,19466,19468,363, 7990, 19470,19471,19472,19474, 19477,19479,19480,19475,19476,2004, 19287,5241, 317, 19478,317, 317, 5570, 345, 317, 490, 317, 19481,19482,317, 9909, 2146, 19485,19490,19497,19505,19506, - 19523,19524,19527,19530,19531,19532,19549,19563,19580,19582,19583,19586,19621,19638,19643,19644,19657,19662,317, 373, 1033, 317, 317, 8392, 19486,345, 317, - 19488,19487,370, 2260, 427, 19489,15837,3999, 427, 317, 427, 6089, 19491,19493,539, 19494,19496,19492,19495,7129, 371, 317, 490, 19498,19499,317, 5055, - 5619, 317, 317, 9695, 19500,19502,8081, 19503,385, 19504,10351,6736, 317, 19501,4268, 5279, 356, 317, 1992, 357, 490, 19507,19508,370, 490, 2022, 317, + 19523,19524,19527,19530,19531,19532,19549,19563,19580,19582,19583,19586,19621,19638,19643,19644,19657,19662,317, 373, 1033, 317, 317, 8392, 19486,345, 317, + 19488,19487,370, 2260, 427, 19489,15837,3999, 427, 317, 427, 6089, 19491,19493,539, 19494,19496,19492,19495,7129, 371, 317, 490, 19498,19499,317, 5055, + 5619, 317, 317, 9695, 19500,19502,8081, 19503,385, 19504,10351,6736, 317, 19501,4268, 5279, 356, 317, 1992, 357, 490, 19507,19508,370, 490, 2022, 317, 19509,19514,19519,19521,19522,7438, 356, 317, 317, 317, 356, 10891,19510,19511,317, 317, 19512,19513,9081, 1033, 19515,343, 362, 317, 6996, 317, 19516, - 19518,317, 362, 317, 317, 317, 867, 6673, 19517,19520,554, 1347, 2142, 426, 350, 317, 19525,19526,19528,19529,390, 317, 345, 317, 8281, 19533,2610, - 317, 19535,19538,19539,19540,19543,19545,317, 19534,317, 5987, 19536,345, 19537,332, 7582, 19541,1358, 317, 19542,317, 317, 317, 317, 317, 317, 317, + 19518,317, 362, 317, 317, 317, 867, 6673, 19517,19520,554, 1347, 2142, 426, 350, 317, 19525,19526,19528,19529,390, 317, 345, 317, 8281, 19533,2610, + 317, 19535,19538,19539,19540,19543,19545,317, 19534,317, 5987, 19536,345, 19537,332, 7582, 19541,1358, 317, 19542,317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 1331, 19544,363, 19546,19547,19548,428, 19550,10626,19554,7850, 466, 19551,317, 1347, 19552,19553,8000, 19555,19556,19557,19558,19559,19560, 19561,19562,317, 19564,19568,19571,19573,19574,19576,317, 19565,2809, 19566,19567,9244, 19569,317, 19570,19572,13066,351, 373, 19575,19577,317, 19579,19578, - 317, 19581,345, 6551, 11451,19584,19585,12262,317, 19587,19591,10609,19592,19596,19598,19599,7850, 19600,19607,7850, 19609,19613,19614,19617,19618,19619,2058, + 317, 19581,345, 6551, 11451,19584,19585,12262,317, 19587,19591,10609,19592,19596,19598,19599,7850, 19600,19607,7850, 19609,19613,19614,19617,19618,19619,2058, 19588,317, 317, 19589,19590,1020, 317, 373, 19593,19594,2368, 8281, 19595,317, 363, 332, 317, 317, 11607,19597,404, 11636,19601,19602,19604,317, 10592, - 8281, 2124, 19603,7931, 396, 19605,2317, 317, 317, 19606,19608,19610,19611,19612,6546, 16704,6996, 317, 317, 365, 6388, 3529, 2022, 19615,19616,317, 317, + 8281, 2124, 19603,7931, 396, 19605,2317, 317, 317, 19606,19608,19610,19611,19612,6546, 16704,6996, 317, 317, 365, 6388, 3529, 2022, 19615,19616,317, 317, 7668, 428, 11347,19620,19622,10453,19624,19625,384, 19626,2171, 19627,19628,19631,2391, 971, 19623,427, 351, 5346, 3611, 2369, 7785, 6036, 384, 6036, 14535, - 317, 5279, 351, 350, 14842,350, 19629,12696,317, 317, 19630,317, 16579,19632,19634,19636,317, 317, 19633,317, 363, 19635,6228, 317, 317, 317, 317, - 317, 9624, 362, 317, 11782,19637,363, 19639,554, 19640,554, 19641,19642,382, 12416,19645,19647,19650,19651,370, 19654,19646,2058, 317, 19648,19649,317, - 574, 317, 1100, 404, 19652,350, 19653,15274,1347, 637, 1160, 317, 19655,1271, 673, 633, 362, 19656,2683, 317, 3153, 19658,15608,19661,511, 317, 1160, - 19659,19660,10770,19663,10223,19664,19665,19667,19668,19669,19671,19679,19680,19683,19684,2110, 317, 317, 19672,19673,19674,19676,19675,19677,19678,466, 382, + 317, 5279, 351, 350, 14842,350, 19629,12696,317, 317, 19630,317, 16579,19632,19634,19636,317, 317, 19633,317, 363, 19635,6228, 317, 317, 317, 317, + 317, 9624, 362, 317, 11782,19637,363, 19639,554, 19640,554, 19641,19642,382, 12416,19645,19647,19650,19651,370, 19654,19646,2058, 317, 19648,19649,317, + 574, 317, 1100, 404, 19652,350, 19653,15274,1347, 637, 1160, 317, 19655,1271, 673, 633, 362, 19656,2683, 317, 3153, 19658,15608,19661,511, 317, 1160, + 19659,19660,10770,19663,10223,19664,19665,19667,19668,19669,19671,19679,19680,19683,19684,2110, 317, 317, 19672,19673,19674,19676,19675,19677,19678,466, 382, 2178, 317, 19681,19682,317, 317, 317, 490, 12696,19685,19702,19703,19730,19735,19741,19743,19746,19750,19751,19772,19781,19808,19810,19820,19824,19841,19849, 19865,19866,19872,19873,332, 365, 10995,19686,317, 19687,19692,19699,19700,365, 393, 317, 365, 345, 19688,19690,19689,2178, 7567, 19691,2272, 19693,19694, 19696,5027, 19697,5027, 5612, 19695,748, 5033, 365, 332, 19698,19701,317, 1032, 317, 543, 19704,19708,19710,19713,596, 19727,1720, 317, 19705,516, 19707, - 317, 19706,317, 317, 1267, 317, 317, 317, 317, 3079, 4952, 317, 19709,19711,16616,19712,317, 590, 10246,317, 19714,19721,343, 539, 6176, 317, 317, - 19715,19716,19719,12154,19717,19718,19720,19722,511, 317, 6228, 317, 317, 317, 356, 466, 3599, 8956, 19723,19724,19725,19726,6228, 2272, 1345, 558, 370, + 317, 19706,317, 317, 1267, 317, 317, 317, 317, 3079, 4952, 317, 19709,19711,16616,19712,317, 590, 10246,317, 19714,19721,343, 539, 6176, 317, 317, + 19715,19716,19719,12154,19717,19718,19720,19722,511, 317, 6228, 317, 317, 317, 356, 466, 3599, 8956, 19723,19724,19725,19726,6228, 2272, 1345, 558, 370, 317, 19728,19729,19731,19734,2178, 19732,19733,19736,317, 332, 17217,1992, 1109, 490, 365, 317, 9440, 6228, 317, 11619,332, 370, 1160, 19737,317, 19738, 19739,19740,370, 7821, 19742,2022, 363, 15457,350, 317, 8828, 19744,17410,3987, 19745,371, 867, 19747,19748,19749,11986,363, 332, 317, 17784,19752,19755, - 19763,19765,11716,19766,1358, 2329, 5331, 19770,2188, 19753,2117, 381, 19754,19756,14062,19758,16384,389, 19759,19761,317, 19757,5810, 1998, 345, 317, 476, + 19763,19765,11716,19766,1358, 2329, 5331, 19770,2188, 19753,2117, 381, 19754,19756,14062,19758,16384,389, 19759,19761,317, 19757,5810, 1998, 345, 317, 476, 19760,19762,317, 6996, 1347, 317, 317, 5055, 317, 19764,317, 2077, 7311, 317, 363, 19767,19768,17009,317, 363, 317, 19769,345, 1992, 317, 1194, 19771, - 363, 19773,19774,19777,1530, 19778,2110, 2110, 317, 317, 19775,19776,317, 1160, 339, 2537, 382, 19779,317, 317, 19780,19782,19786,19792,19793,19795,317, - 19799,9170, 343, 19800,19802,19803,19807,11509,8746, 365, 317, 2631, 19783,362, 3284, 19784,3505, 19785,19787,19788,19789,19790,19791,4962, 1020, 19794,6713, - 2715, 19796,2024, 363, 317, 19797,490, 19798,371, 5611, 317, 448, 19801,317, 317, 317, 5962, 317, 19804,19805,19806,15169,490, 490, 19809,317, 2715, - 317, 10609,317, 7045, 19811,19812,7672, 343, 2022, 19813,372, 19815,5628, 19819,317, 6138, 363, 2193, 19814,19816,16651,317, 317, 317, 19817,19818,6409, + 363, 19773,19774,19777,1530, 19778,2110, 2110, 317, 317, 19775,19776,317, 1160, 339, 2537, 382, 19779,317, 317, 19780,19782,19786,19792,19793,19795,317, + 19799,9170, 343, 19800,19802,19803,19807,11509,8746, 365, 317, 2631, 19783,362, 3284, 19784,3505, 19785,19787,19788,19789,19790,19791,4962, 1020, 19794,6713, + 2715, 19796,2024, 363, 317, 19797,490, 19798,371, 5611, 317, 448, 19801,317, 317, 317, 5962, 317, 19804,19805,19806,15169,490, 490, 19809,317, 2715, + 317, 10609,317, 7045, 19811,19812,7672, 343, 2022, 19813,372, 19815,5628, 19819,317, 6138, 363, 2193, 19814,19816,16651,317, 317, 317, 19817,19818,6409, 6195, 554, 317, 9624, 317, 317, 4268, 350, 19821,19822,19823,317, 8061, 317, 19825,332, 404, 19831,317, 19834,19840,317, 16898,317, 13323,19826,19830, - 19827,19828,19829,19832,6294, 8613, 19833,317, 317, 19835,19836,7514, 19837,19838,19839,339, 2510, 19842,17444,19843,19844,19845,19846,6600, 543, 19848,490, + 19827,19828,19829,19832,6294, 8613, 19833,317, 317, 19835,19836,7514, 19837,19838,19839,339, 2510, 19842,17444,19843,19844,19845,19846,6600, 543, 19848,490, 427, 16123,565, 8224, 365, 19847,427, 13023,317, 317, 19850,7878, 363, 19851,19852,19856,19864,317, 343, 363, 19853,371, 19854,317, 19855,19857,19861, - 384, 19862,427, 317, 5623, 317, 19858,19859,19860,3243, 349, 317, 351, 19863,363, 2063, 6402, 6516, 19867,19870,19868,1160, 2610, 19869,339, 4591, 317, - 19871,371, 565, 9573, 17583,19876,19878,19880,19893,971, 19877,19879,371, 345, 19881,19882,6228, 2077, 317, 574, 19883,19885,2156, 19884,343, 6088, 317, + 384, 19862,427, 317, 5623, 317, 19858,19859,19860,3243, 349, 317, 351, 19863,363, 2063, 6402, 6516, 19867,19870,19868,1160, 2610, 19869,339, 4591, 317, + 19871,371, 565, 9573, 17583,19876,19878,19880,19893,971, 19877,19879,371, 345, 19881,19882,6228, 2077, 317, 574, 19883,19885,2156, 19884,343, 6088, 317, 19886,19888,19890,19887,19889,19891,19892,19894,19896,19899,2110, 19897,317, 19898,971, 317, 19900,19901,8296, 19902,19904,19905,19906,19912,4984, 19916,19917, - 19924,19926,19932,19944,19946,19951,19956,19961,19962,19976,19979,19980,19988,19990,317, 1915, 381, 370, 19907,9425, 2413, 19908,404, 18030,317, 1108, 971, + 19924,19926,19932,19944,19946,19951,19956,19961,19962,19976,19979,19980,19988,19990,317, 1915, 381, 370, 19907,9425, 2413, 19908,404, 18030,317, 1108, 971, 332, 19909,19910,19911,317, 19913,19914,317, 19915,19918,2156, 19920,19921,19923,19919,8906, 3284, 8301, 19922,317, 19925,11146,514, 8296, 19927,466, 19929, 317, 317, 19928,365, 19930,19931,19933,19934,19937,2116, 19940,317, 2381, 6138, 317, 490, 19935,317, 18849,19936,332, 19938,19939,6065, 5600, 19941,19942, 19943,17462,317, 11146,490, 19945,2317, 13079,17583,19947,19950,317, 19948,595, 19949,19952,317, 19954,19953,19955,466, 317, 19957,363, 19958,490, 19959, 404, 10812,466, 317, 19960,2022, 317, 8771, 19963,9853, 19964,19972,19973,19974,5087, 5335, 2402, 317, 19965,317, 16906,19966,19967,19968,19969,19970,10422, - 19971,317, 317, 345, 382, 8682, 5450, 332, 370, 19975,7314, 590, 363, 363, 19977,19978,2416, 19981,2610, 15951,19983,19984,19985,12799,19982,448, 448, + 19971,317, 317, 345, 382, 8682, 5450, 332, 370, 19975,7314, 590, 363, 363, 19977,19978,2416, 19981,2610, 15951,19983,19984,19985,12799,19982,448, 448, 345, 550, 317, 19986,19987,19989,19991,19993,19994,362, 317, 2310, 2184, 19992,339, 2317, 351, 7055, 19995,19997,20002,20004,20056,20088,20090,20099,19998, 19999,20000,20001,2272, 20003,14806,20005,2067, 637, 20006,20007,1267, 317, 1353, 673, 317, 20008,317, 20009,20010,317, 317, 317, 317, 20011,317, 20012, - 12628,317, 20013,2022, 20014,20016,5020, 317, 343, 1018, 317, 1267, 317, 649, 621, 317, 317, 317, 317, 317, 317, 4984, 5840, 6036, 1060, 20015,1358, + 12628,317, 20013,2022, 20014,20016,5020, 317, 343, 1018, 317, 1267, 317, 649, 621, 317, 317, 317, 317, 317, 317, 4984, 5840, 6036, 1060, 20015,1358, 1160, 317, 20017,20022,20024,10471,20027,20035,20036,350, 20039,20055,345, 1160, 317, 2134, 20018,363, 15093,317, 20019,20020,20021,20023,363, 18084,20025, 7214, 20026,317, 10442,426, 1325, 466, 6046, 317, 20028,317, 20034,363, 404, 363, 20029,317, 317, 317, 20030,317, 20031,317, 5488, 370, 7888, 19283, 363, 20032,363, 20033,5223, 317, 490, 501, 12142,10093,20037,4984, 20038,317, 345, 370, 4789, 317, 317, 20040,20043,20048,317, 20050,317, 317, 20041, 20042,20044,20047,20045,317, 20046,20049,351, 20051,7186, 20052,317, 20053,317, 20054,20057,20078,20087,20058,1325, 20066,20067,317, 20059,317, 20060,20061, 5342, 345, 317, 20062,20063,20064,20065,20068,20075,20076,20069,20072,20070,20071,20073,20074,20077,345, 20079,20081,20080,14558,317, 9857, 8139, 363, 20082, 20083,5449, 317, 20084,20085,20086,317, 8828, 13638,390, 20089,20091,20092,350, 20097,9549, 2163, 20093,20094,20095,20096,20098,20100,20101,20102,20105,20106, - 20108,20111,3999, 20114,317, 317, 20116,20118,20125,20129,7871, 20134,20136,20139,5309, 20150,371, 20152,20154,317, 20107,11086,5223, 317, 317, 384, 1160, - 15307,20109,6228, 317, 317, 5991, 20110,2156, 317, 317, 317, 1791, 12630,317, 20112,20113,2108, 20115,4060, 317, 2078, 345, 20117,365, 20119,489, 490, + 20108,20111,3999, 20114,317, 317, 20116,20118,20125,20129,7871, 20134,20136,20139,5309, 20150,371, 20152,20154,317, 20107,11086,5223, 317, 317, 384, 1160, + 15307,20109,6228, 317, 317, 5991, 20110,2156, 317, 317, 317, 1791, 12630,317, 20112,20113,2108, 20115,4060, 317, 2078, 345, 20117,365, 20119,489, 490, 317, 20124,2366, 317, 20120,20121,20122,20123,10840,20126,5661, 370, 9170, 317, 20127,15745,20128,20130,20131,11388,9170, 365, 11040,20132,511, 20133,20135, - 371, 490, 13385,20137,20138,20140,20141,2022, 20146,20147,20142,317, 345, 9624, 9878, 10149,5840, 5037, 20143,550, 20144,428, 20145,20148,20149,317, 1347, + 371, 490, 13385,20137,20138,20140,20141,2022, 20146,20147,20142,317, 345, 9624, 9878, 10149,5840, 5037, 20143,550, 20144,428, 20145,20148,20149,317, 1347, 2022, 20151,20153,20155,20157,20159,20160,20161,343, 20163,317, 490, 20164,20165,20192,20200,20220,20223,20240,20241,20246,20247,20257,20267,20313,20315,20327, 20370,20389,20409,20412,345, 365, 971, 949, 20166,20168,20169,317, 20172,20173,20176,317, 20183,11388,20190,20167,20170,7035, 20171,5687, 14132,20174,20175, - 317, 20177,20181,317, 317, 20178,20179,20180,6486, 5611, 489, 7035, 20182,2211, 2211, 20184,20187,20188,20189,20185,317, 20186,5028, 7567, 317, 20191,317, + 317, 20177,20181,317, 317, 20178,20179,20180,6486, 5611, 489, 7035, 20182,2211, 2211, 20184,20187,20188,20189,20185,317, 20186,5028, 7567, 317, 20191,317, 350, 317, 20193,371, 20197,5624, 20198,20194,20195,20196,490, 490, 13638,20199,317, 6826, 7312, 20201,20203,20209,20211,20213,20215,317, 6409, 20202,14132, - 5032, 317, 7095, 317, 20204,20178,20206,20208,20205,15464,2272, 20207,7916, 2210, 7672, 370, 317, 20210,9538, 6486, 317, 7328, 20212,317, 3284, 11198,1108, + 5032, 317, 7095, 317, 20204,20178,20206,20208,20205,15464,2272, 20207,7916, 2210, 7672, 370, 317, 20210,9538, 6486, 317, 7328, 20212,317, 3284, 11198,1108, 5836, 20214,20216,20219,20217,20218,10345,351, 20221,343, 20222,317, 20224,1481, 20226,20228,20232,20235,20225,20227,490, 10316,9736, 6551, 20229,20230,20231, 317, 317, 2022, 553, 490, 20233,5611, 20234,332, 20236,20238,20239,16535,20237,7785, 20113,371, 12079,6486, 317, 6540, 20242,317, 971, 20243,317, 20244, - 317, 20245,20248,20250,7035, 20251,20256,490, 20249,20252,20254,5216, 6517, 370, 20253,20255,3750, 317, 370, 345, 317, 317, 20258,20259,20260,20261,332, - 20263,20266,6607, 13338,332, 15600,5570, 20262,10203,20264,332, 20265,20268,20269,20277,20281,20298,317, 20302,20303,20306,20307,20311,5241, 351, 6402, 317, + 317, 20245,20248,20250,7035, 20251,20256,490, 20249,20252,20254,5216, 6517, 370, 20253,20255,3750, 317, 370, 345, 317, 317, 20258,20259,20260,20261,332, + 20263,20266,6607, 13338,332, 15600,5570, 20262,10203,20264,332, 20265,20268,20269,20277,20281,20298,317, 20302,20303,20306,20307,20311,5241, 351, 6402, 317, 20270,20271,20276,317, 20272,20273,20274,20275,317, 20278,1358, 8178, 20280,317, 20279,10234,317, 317, 317, 633, 8116, 317, 20282,6402, 20283,8456, 20296, 20284,20285,20288,317, 20286,20287,20289,339, 20290,20291,20292,20293,20294,20295,2845, 20297,20299,20300,20301,363, 5295, 20304,565, 20305,20308,5043, 20309, 20310,5173, 20312,5241, 2110, 11511,2280, 5955, 20314,7672, 7306, 7383, 345, 401, 20316,13638,20321,20323,20325,5033, 20317,20318,317, 20319,20320,20322,18487, 2272, 2035, 20324,20326,317, 20328,20329,20362,20364,20366,965, 20367,6904, 5033, 332, 2142, 2142, 20330,20331,20332,317, 20334,5624, 18343,20333,466, 20335, 20337,20339,1078, 20336,356, 6387, 370, 317, 20338,317, 5477, 9836, 20340,20342,20347,20351,20352,20358,20341,20343,1428, 20344,20345,20346,343, 498, 20348, - 20349,20350,20353,20355,20354,20356,18415,20357,2156, 498, 20359,20360,20361,356, 5987, 404, 17454,20363,365, 5428, 5033, 9163, 20365,332, 2211, 5428, 343, + 20349,20350,20353,20355,20354,20356,18415,20357,2156, 498, 20359,20360,20361,356, 5987, 404, 17454,20363,365, 5428, 5033, 9163, 20365,332, 2211, 5428, 343, 8170, 20368,345, 20369,20371,20373,8296, 20375,357, 20376,8296, 20379,20381,20383,20372,317, 20374,6228, 633, 5087, 365, 8296, 20377,20378,317, 20380,20382, 317, 20384,20386,5353, 345, 20385,7891, 1347, 20387,20388,20390,20391,5447, 20392,317, 20398,20402,317, 20405,9993, 13962,14132,5167, 16277,317, 345, 20393, - 17160,20395,20394,20396,20397,20399,20400,20401,345, 363, 6278, 20403,20404,5687, 9427, 317, 20406,4960, 20407,1044, 2260, 20408,433, 7386, 355, 20410,6937, - 317, 317, 20411,317, 20413,7386, 381, 20414,7689, 343, 574, 20415,5033, 20416,20420,317, 673, 317, 316, 317, 5120, 317, 20417,370, 317, 565, 5055, + 17160,20395,20394,20396,20397,20399,20400,20401,345, 363, 6278, 20403,20404,5687, 9427, 317, 20406,4960, 20407,1044, 2260, 20408,433, 7386, 355, 20410,6937, + 317, 317, 20411,317, 20413,7386, 381, 20414,7689, 343, 574, 20415,5033, 20416,20420,317, 673, 317, 316, 317, 5120, 317, 20417,370, 317, 565, 5055, 20418,370, 20419,20421,20424,317, 20422,20423,20426,20428,608, 20436,20439,7073, 20447,20449,20452,20427,20429,9961, 20430,20431,20432,20433,20434,20435,20437, - 20438,6778, 317, 20440,20442,20441,20443,20445,381, 20444,20446,20448,20450,20451,608, 20453,20454,20455,20457,20460,20463,20458,20459,20461,20462,351, 396, + 20438,6778, 317, 20440,20442,20441,20443,20445,381, 20444,20446,20448,20450,20451,608, 20453,20454,20455,20457,20460,20463,20458,20459,20461,20462,351, 396, 20464,351, 20465,63, 20585,20642,20696,351, 20697,20750,20751,5677, 20771,20466,20467,20469,20477,20481,20483,20484,1230, 20486,2021, 20492,20493,20499,20513, - 20517,20537,20546,20550,20566,20571,2067, 20572,6674, 20468,479, 350, 20470,404, 2585, 20471,20472,20473,20474,20475,20476,20478,6546, 20479,20480,4943, 466, + 20517,20537,20546,20550,20566,20571,2067, 20572,6674, 20468,479, 350, 20470,404, 2585, 20471,20472,20473,20474,20475,20476,20478,6546, 20479,20480,4943, 466, 20482,345, 2022, 1020, 2117, 20485,8948, 363, 343, 20487,20488,317, 20489,4267, 356, 466, 317, 1230, 5942, 8254, 20490,7990, 20491,363, 12616,20494,14645, 20495,20498,5991, 317, 20496,20497,317, 20500,20501,2184, 363, 20506,20509,20510,18700,20512,1345, 6207, 1160, 20502,20503,20504,20505,466, 20507,20508,20511, - 5279, 554, 20146,20514,18211,20515,20516,1160, 11034,370, 20518,20521,20533,332, 1347, 2058, 404, 317, 8254, 20519,317, 20520,317, 5626, 343, 404, 490, + 5279, 554, 20146,20514,18211,20515,20516,1160, 11034,370, 20518,20521,20533,332, 1347, 2058, 404, 317, 8254, 20519,317, 20520,317, 5626, 343, 404, 490, 317, 490, 2134, 343, 20522,20523,20525,363, 20527,20528,20524,2184, 6425, 5464, 490, 20526,317, 20529,317, 20530,20531,20532,317, 317, 10476,20534,20536, - 20535,7911, 6195, 363, 404, 5037, 370, 4984, 7858, 5428, 363, 5273, 20538,401, 1009, 20539,20540,2571, 6275, 363, 20545,317, 20541,4965, 20542,965, 317, + 20535,7911, 6195, 363, 404, 5037, 370, 4984, 7858, 5428, 363, 5273, 20538,401, 1009, 20539,20540,2571, 6275, 363, 20545,317, 20541,4965, 20542,965, 317, 317, 5701, 18577,317, 317, 20543,2184, 6425, 20544,1347, 1347, 317, 351, 17410,363, 2503, 20547,20548,9931, 20549,8125, 466, 20551,20553,20556,2108, 20557, 20552,20554,20555,7000, 317, 343, 317, 1347, 20558,20559,363, 437, 20560,2110, 5105, 317, 317, 10626,20561,20562,20563,20564,20565,20567,20569,11533,20568, 574, 317, 20570,351, 332, 317, 356, 596, 466, 4980, 20573,20579,404, 370, 20580,20581,4980, 20583,3987, 6674, 551, 20574,20575,20577,317, 6318, 14341, 20576,20578,10580,8978, 363, 12277,20582,343, 11533,351, 20584,20586,10011,20595,20597,3677, 20602,363, 20603,20604,20616,20622,20626,20627,20635,5412, 20636, - 20640,317, 3640, 20587,20590,16278,20592,20593,317, 20588,3999, 6748, 20589,4873, 1060, 8136, 466, 317, 5708, 13318,9624, 14758,317, 370, 362, 2571, 317, - 317, 5573, 20591,317, 990, 20594,466, 317, 4952, 2219, 317, 317, 20596,15745,350, 317, 317, 343, 343, 20598,343, 20599,20600,20601,317, 8948, 439, + 20640,317, 3640, 20587,20590,16278,20592,20593,317, 20588,3999, 6748, 20589,4873, 1060, 8136, 466, 317, 5708, 13318,9624, 14758,317, 370, 362, 2571, 317, + 317, 5573, 20591,317, 990, 20594,466, 317, 4952, 2219, 317, 317, 20596,15745,350, 317, 317, 343, 343, 20598,343, 20599,20600,20601,317, 8948, 439, 490, 4952, 20605,20606,20611,20614,18211,20607,20608,4980, 20609,490, 12800,490, 317, 317, 20610,317, 20612,343, 5616, 20613,317, 317, 20615,8412, 20617, - 20621,20618,20619,20620,363, 3999, 501, 363, 949, 2631, 2077, 20623,317, 20624,490, 16479,20625,350, 2163, 317, 20628,317, 18699,20630,20633,8254, 317, - 20629,20631,20632,317, 317, 20634,2022, 7821, 317, 4279, 490, 363, 350, 20637,4738, 4952, 404, 20638,10086,20639,317, 574, 5661, 2571, 20641,345, 2117, + 20621,20618,20619,20620,363, 3999, 501, 363, 949, 2631, 2077, 20623,317, 20624,490, 16479,20625,350, 2163, 317, 20628,317, 18699,20630,20633,8254, 317, + 20629,20631,20632,317, 317, 20634,2022, 7821, 317, 4279, 490, 363, 350, 20637,4738, 4952, 404, 20638,10086,20639,317, 574, 5661, 2571, 20641,345, 2117, 20643,20644,20647,20653,20656,20657,20662,317, 20685,10376,20689,20690,20695,5866, 363, 479, 20645,20646,5447, 317, 5991, 14172,350, 317, 20648,381, 20649, - 20650,373, 317, 20651,20652,501, 20654,20655,317, 317, 4737, 551, 12417,404, 317, 20658,20661,9450, 2094, 20659,6033, 1347, 339, 20660,317, 15244,466, - 363, 317, 551, 20663,20665,20666,20673,20675,20683,20664,3987, 362, 317, 363, 20667,20669,362, 317, 317, 20668,7949, 20670,20671,20672,20674,5701, 5419, + 20650,373, 317, 20651,20652,501, 20654,20655,317, 317, 4737, 551, 12417,404, 317, 20658,20661,9450, 2094, 20659,6033, 1347, 339, 20660,317, 15244,466, + 363, 317, 551, 20663,20665,20666,20673,20675,20683,20664,3987, 362, 317, 363, 20667,20669,362, 317, 317, 20668,7949, 20670,20671,20672,20674,5701, 5419, 317, 20676,20679,20681,20677,317, 20678,20680,20678,20677,20682,317, 20684,5279, 20686,317, 551, 15244,20687,20688,317, 9876, 345, 20691,339, 2391, 20693, 511, 370, 20692,20694,842, 669, 20698,20699,20700,20705,20706,5955, 20708,20709,10223,7428, 362, 20713,20720,20722,15387,20723,20725,20732,20736,20743,20747, - 14119,748, 490, 5273, 343, 20701,317, 5991, 466, 20702,317, 12774,20703,393, 20704,10021,4591, 317, 20707,317, 14716,350, 5862, 20710,20711,20712,380, - 20714,16867,1998, 12704,20715,20719,20716,380, 20717,20718,20721,317, 2222, 404, 317, 317, 20724,20726,10877,20727,20729,20730,12277,2705, 317, 370, 2571, + 14119,748, 490, 5273, 343, 20701,317, 5991, 466, 20702,317, 12774,20703,393, 20704,10021,4591, 317, 20707,317, 14716,350, 5862, 20710,20711,20712,380, + 20714,16867,1998, 12704,20715,20719,20716,380, 20717,20718,20721,317, 2222, 404, 317, 317, 20724,20726,10877,20727,20729,20730,12277,2705, 317, 370, 2571, 317, 5223, 9720, 1060, 317, 20728,351, 363, 363, 351, 20731,20733,11691,317, 5174, 1588, 20734,15058,317, 317, 20735,317, 15183,20737,20738,20740,20742, 317, 633, 317, 10283,466, 317, 317, 20739,1549, 370, 20741,404, 2236, 350, 362, 20744,345, 418, 317, 20745,317, 6195, 20746,317, 551, 4591, 20748, - 20749,350, 317, 8301, 370, 388, 466, 317, 20752,20756,20758,396, 14377,317, 20759,20760,20762,343, 20765,20767,350, 2067, 14316,20753,317, 7504, 4952, - 10008,20754,317, 20755,345, 20757,317, 2571, 7949, 381, 370, 596, 20761,9280, 1347, 317, 20763,20764,317, 370, 20766,7857, 317, 490, 20768,20769,363, - 317, 20770,8125, 356, 466, 2117, 10943,20772,20774,2156, 332, 20775,2108, 20773,317, 16277,11450,363, 351, 1588, 20776,20777,20778,20779,345, 2694, 351, + 20749,350, 317, 8301, 370, 388, 466, 317, 20752,20756,20758,396, 14377,317, 20759,20760,20762,343, 20765,20767,350, 2067, 14316,20753,317, 7504, 4952, + 10008,20754,317, 20755,345, 20757,317, 2571, 7949, 381, 370, 596, 20761,9280, 1347, 317, 20763,20764,317, 370, 20766,7857, 317, 490, 20768,20769,363, + 317, 20770,8125, 356, 466, 2117, 10943,20772,20774,2156, 332, 20775,2108, 20773,317, 16277,11450,363, 351, 1588, 20776,20777,20778,20779,345, 2694, 351, 20781,20783,20786,380, 20790,20791,371, 20782,20784,20785,380, 20787,20788,20789,20792,20793,20795,339, 20797,20799,20810,20818,20823,365, 1030, 345, 20829, 381, 20796,20798,317, 317, 20800,20806,5810, 20807,20809,20801,351, 20802,20803,20804,20805,20808,20811,20812,20815,9961, 19106,20813,608, 20814,20816,20817, 20819,20820,20821,20822,20824,20825,20826,20827,20828,20830,20833,3918, 317, 20835,20831,608, 20832,20834,11073,8435, 20836,20838,20876,20894,20948,20978,21007, 21022,21039,21055,21068,21072,65, 66, 67, 22077,22131,22178,68, 22358,22416,69, 22619,22643,22669,22672,22678,20837,20839,20844,20846,20847,12528,20849, 20859,20860,20863,20866,20872,20875,20840,317, 20841,20843,466, 317, 362, 12423,345, 20842,20845,317, 20848,20850,20854,20857,20858,4980, 350, 5037, 20851, 20852,20853,20855,20856,5716, 466, 382, 5167, 317, 20861,20862,317, 20864,380, 2510, 20865,16651,8000, 317, 11442,20867,20868,2022, 2022, 20869,20870,20871, - 20873,20874,356, 15814,427, 20877,20879,501, 20884,9876, 20886,20887,20889,20891,20577,20893,317, 363, 490, 381, 1358, 20878,20880,5055, 20881,578, 317, - 20882,317, 3869, 1347, 20883,317, 380, 20885,2322, 317, 5661, 317, 317, 4984, 343, 317, 20888,317, 20890,317, 20577,20892,317, 363, 1266, 317, 1648, + 20873,20874,356, 15814,427, 20877,20879,501, 20884,9876, 20886,20887,20889,20891,20577,20893,317, 363, 490, 381, 1358, 20878,20880,5055, 20881,578, 317, + 20882,317, 3869, 1347, 20883,317, 380, 20885,2322, 317, 5661, 317, 317, 4984, 343, 317, 20888,317, 20890,317, 20577,20892,317, 363, 1266, 317, 1648, 317, 672, 633, 539, 317, 490, 20895,20900,490, 20902,20915,20938,20945,11921,20946,20896,2272, 20898,20897,20899,317, 20901,17462,317, 2081, 20903,20907, 20910,20913,363, 20914,20904,20905,20906,380, 317, 11034,20908,317, 20909,20911,1358, 20912,433, 317, 6318, 363, 363, 427, 317, 320, 633, 20916,10943, 20920,20921,20923,20926,466, 20929,362, 2022, 6255, 20930,20934,20937,317, 343, 20917,20919,2272, 20918,317, 20922,381, 5487, 9878, 15837,428, 10854,20924, 578, 20925,20927,20928,9170, 363, 541, 5332, 20931,20932,20933,427, 554, 5105, 380, 380, 1992, 1076, 381, 20935,20936,20939,1160, 2077, 20940,20941,20942, - 5055, 20943,20944,317, 574, 748, 8594, 317, 5570, 4268, 2715, 3529, 363, 5428, 345, 363, 6696, 20947,1345, 20949,20950,388, 20965,511, 362, 350, 5055, + 5055, 20943,20944,317, 574, 748, 8594, 317, 5570, 4268, 2715, 3529, 363, 5428, 345, 363, 6696, 20947,1345, 20949,20950,388, 20965,511, 362, 350, 5055, 20974,20976,317, 6000, 5441, 317, 20951,1347, 317, 2272, 20952,20954,20956,20958,20961,20963,20964,317, 317, 317, 20953,20955,317, 4576, 20957,20959,20960, 20962,343, 317, 20966,317, 20969,2381, 20970,382, 20972,20967,380, 20968,317, 9166, 317, 317, 317, 317, 317, 317, 317, 317, 12464,2184, 20971,20973, - 20975,5537, 637, 20977,8301, 2077, 362, 20979,20986,20990,20991,20993,20995,351, 20996,20999,317, 20980,20981,20982,20983,20984,20985,20987,20988,20989,332, - 17136,332, 363, 20992,20994,350, 1325, 9130, 20997,20998,21000,21004,21001,21002,21003,466, 21005,21006,12956,11654,21008,6598, 21015,21018,21009,21012,4952, + 20975,5537, 637, 20977,8301, 2077, 362, 20979,20986,20990,20991,20993,20995,351, 20996,20999,317, 20980,20981,20982,20983,20984,20985,20987,20988,20989,332, + 17136,332, 363, 20992,20994,350, 1325, 9130, 20997,20998,21000,21004,21001,21002,21003,466, 21005,21006,12956,11654,21008,6598, 21015,21018,21009,21012,4952, 362, 317, 21010,21011,317, 9720, 7941, 5942, 317, 7504, 317, 21013,380, 21014,5897, 317, 343, 21016,21017,21019,3751, 21020,21021,12696,21023,11398,21024, 21026,21029,21030,21031,21032,21038,428, 479, 332, 21025,317, 5543, 317, 363, 21027,5055, 11450,21028,428, 362, 21033,21034,21037,21035,9749, 21036,21040, - 21044,21051,5437, 317, 21052,21054,11940,21041,362, 317, 4218, 21042,21043,5225, 466, 317, 1325, 21045,21046,21049,21047,21048,21050,363, 6496, 490, 371, + 21044,21051,5437, 317, 21052,21054,11940,21041,362, 317, 4218, 21042,21043,5225, 466, 317, 1325, 21045,21046,21049,21047,21048,21050,363, 6496, 490, 371, 380, 1347, 10251,363, 21053,363, 363, 317, 317, 21056,21057,21058,21061,21067,6387, 1325, 466, 317, 21059,21060,490, 990, 21062,5991, 466, 317, 21063, 21064,21065,466, 317, 21066,317, 2156, 7560, 7360, 21069,21070,21071,21073,16318,17919,317, 6398, 21074,362, 317, 317, 317, 317, 21075,21104,21107,21113, - 21119,21136,21138,21142,350, 21146,21204,21207,21208,21238,21242,21244,21258,21263,21273,21276,21277,21076,21077,21078,21080,21084,21087,21089,21090,21092,317, + 21119,21136,21138,21142,350, 21146,21204,21207,21208,21238,21242,21244,21258,21263,21273,21276,21277,21076,21077,21078,21080,21084,21087,21089,21090,21092,317, 21095,21097,21098,21102,15074,317, 317, 5687, 5058, 1347, 21079,21081,21082,21083,21085,21086,21088,574, 9185, 18480,2211, 21091,350, 867, 18068,21093,21094, 332, 6816, 21096,12752,2322, 18706,17782,21099,21100,5428, 574, 18692,21101,5238, 317, 21103,21105,21106,14341,479, 317, 371, 2551, 11235,390, 21108,21111, - 551, 5238, 21109,21110,21112,6674, 19303,385, 19487,21114,21116,370, 2571, 2272, 11038,501, 21117,21118,21115,17358,382, 404, 1108, 565, 2553, 6080, 320, - 21120,21124,4984, 21125,11034,6937, 21127,21128,21129,21133,21134,21135,317, 2193, 21121,21122,21123,2078, 317, 21126,7073, 5684, 363, 363, 21130,21131,7514, - 21132,2271, 7368, 351, 8023, 12154,363, 2584, 316, 351, 21137,551, 21139,363, 21140,7073, 21141,6002, 2178, 12852,351, 2590, 490, 21143,21144,2163, 6228, + 551, 5238, 21109,21110,21112,6674, 19303,385, 19487,21114,21116,370, 2571, 2272, 11038,501, 21117,21118,21115,17358,382, 404, 1108, 565, 2553, 6080, 320, + 21120,21124,4984, 21125,11034,6937, 21127,21128,21129,21133,21134,21135,317, 2193, 21121,21122,21123,2078, 317, 21126,7073, 5684, 363, 363, 21130,21131,7514, + 21132,2271, 7368, 351, 8023, 12154,363, 2584, 316, 351, 21137,551, 21139,363, 21140,7073, 21141,6002, 2178, 12852,351, 2590, 490, 21143,21144,2163, 6228, 1347, 9623, 350, 317, 21145,21147,21164,21184,18460,21195,21202,21203,21148,332, 332, 351, 21154,2171, 4268, 21155,21158,21159,332, 21149,21150,21151,21152, 5447, 21153,2510, 382, 5515, 5550, 21156,5447, 21157,373, 382, 7035, 317, 356, 317, 317, 21160,5987, 317, 21161,21162,21163,21165,21166,990, 5684, 21172, - 11121,1358, 6600, 21182,317, 21167,317, 21168,356, 21169,7419, 317, 2155, 382, 5055, 21170,5477, 21171,5355, 370, 5488, 21173,21180,317, 317, 21174,317, + 11121,1358, 6600, 21182,317, 21167,317, 21168,356, 21169,7419, 317, 2155, 382, 5055, 21170,5477, 21171,5355, 370, 5488, 21173,21180,317, 317, 21174,317, 21175,21176,21177,21178,21179,21181,317, 427, 317, 1347, 5550, 363, 21183,21185,21186,21187,362, 21188,21189,21194,350, 317, 317, 2117, 317, 21190,21191, - 317, 21193,6089, 19440,404, 21192,317, 363, 5037, 5809, 10120,363, 350, 5488, 21196,317, 1347, 370, 21197,1109, 490, 332, 21198,21199,317, 21200,427, + 317, 21193,6089, 19440,404, 21192,317, 363, 5037, 5809, 10120,363, 350, 5488, 21196,317, 1347, 370, 21197,1109, 490, 332, 21198,21199,317, 21200,427, 21201,5343, 370, 5174, 1347, 490, 5226, 351, 2171, 7866, 21205,21206,317, 317, 9623, 867, 2809, 317, 21209,21210,21211,21212,21215,21226,21227,21233,21236, - 2079, 345, 4984, 21213,317, 317, 1347, 21214,317, 5421, 351, 365, 317, 9623, 21216,21217,21222,21224,11055,317, 21218,317, 1347, 21220,21221,21219,317, - 5249, 317, 5225, 1325, 1347, 5225, 13296,466, 21223,393, 21225,317, 21228,21230,379, 21231,2571, 317, 6294, 21229,404, 2110, 2128, 317, 21232,381, 1526, + 2079, 345, 4984, 21213,317, 317, 1347, 21214,317, 5421, 351, 365, 317, 9623, 21216,21217,21222,21224,11055,317, 21218,317, 1347, 21220,21221,21219,317, + 5249, 317, 5225, 1325, 1347, 5225, 13296,466, 21223,393, 21225,317, 21228,21230,379, 21231,2571, 317, 6294, 21229,404, 2110, 2128, 317, 21232,381, 1526, 21234,21235,380, 741, 6704, 345, 21237,5225, 356, 379, 466, 2571, 317, 21239,21240,21241,371, 1999, 21243,18971,2117, 21245,363, 21246,404, 21247,21248, - 21249,21250,317, 21252,21257,21251,21253,21254,2128, 21255,21256,21259,740, 12886,16163,362, 363, 21260,21262,21261,363, 21264,8841, 427, 21265,6551, 490, + 21249,21250,317, 21252,21257,21251,21253,21254,2128, 21255,21256,21259,740, 12886,16163,362, 363, 21260,21262,21261,363, 21264,8841, 427, 21265,6551, 490, 21266,21270,21272,21267,21268,317, 596, 345, 6387, 6904, 21269,5483, 343, 21271,351, 356, 6514, 317, 551, 21274,21275,351, 351, 2117, 404, 317, 21278, - 21282,21301,21304,21305,21319,21323,21325,5661, 21337,21398,21399,21403,21507,21510,21511,21513,363, 2416, 317, 21279,10832,317, 5956, 21280,21281,317, 5028, - 351, 317, 21283,21288,21289,9170, 317, 21296,21297,345, 21284,21285,4267, 5395, 317, 511, 21286,21287,317, 317, 317, 5223, 21290,21291,5447, 317, 466, - 21292,5054, 21293,21294,21295,21298,21299,356, 21300,351, 373, 363, 21302,21303,2060, 21306,5960, 404, 21308,317, 4476, 363, 21311,9182, 363, 21312,317, - 21315,21316,21307,21309,317, 5055, 317, 21310,339, 490, 317, 21313,2024, 2280, 317, 21314,317, 568, 317, 317, 21317,21318,21320,317, 21321,21322,317, - 9482, 5991, 466, 317, 21324,21326,490, 539, 2381, 21332,965, 21333,21335,317, 5701, 21327,21331,21328,21329,21330,1347, 6993, 13216,478, 317, 404, 5661, - 317, 21334,21336,317, 317, 21338,21342,21367,21378,21386,15540,21339,317, 21340,317, 317, 4267, 21341,466, 5399, 1347, 317, 317, 2247, 6123, 351, 5241, - 21343,21348,21359,317, 21344,21345,21346,21347,21349,21350,21354,21356,7807, 466, 21351,356, 466, 317, 373, 21352,5054, 21353,380, 21355,21357,356, 466, - 317, 5201, 21358,21360,2024, 21366,317, 21361,21362,21363,21364,370, 317, 21365,18587,1347, 16354,21368,21375,21355,317, 2022, 21369,21370,21372,21371,2631, - 317, 317, 21373,21374,356, 5399, 317, 21376,380, 21377,466, 3854, 317, 12019,21379,21381,5226, 317, 21380,13161,345, 5650, 4591, 5201, 17943,21382,370, + 21282,21301,21304,21305,21319,21323,21325,5661, 21337,21398,21399,21403,21507,21510,21511,21513,363, 2416, 317, 21279,10832,317, 5956, 21280,21281,317, 5028, + 351, 317, 21283,21288,21289,9170, 317, 21296,21297,345, 21284,21285,4267, 5395, 317, 511, 21286,21287,317, 317, 317, 5223, 21290,21291,5447, 317, 466, + 21292,5054, 21293,21294,21295,21298,21299,356, 21300,351, 373, 363, 21302,21303,2060, 21306,5960, 404, 21308,317, 4476, 363, 21311,9182, 363, 21312,317, + 21315,21316,21307,21309,317, 5055, 317, 21310,339, 490, 317, 21313,2024, 2280, 317, 21314,317, 568, 317, 317, 21317,21318,21320,317, 21321,21322,317, + 9482, 5991, 466, 317, 21324,21326,490, 539, 2381, 21332,965, 21333,21335,317, 5701, 21327,21331,21328,21329,21330,1347, 6993, 13216,478, 317, 404, 5661, + 317, 21334,21336,317, 317, 21338,21342,21367,21378,21386,15540,21339,317, 21340,317, 317, 4267, 21341,466, 5399, 1347, 317, 317, 2247, 6123, 351, 5241, + 21343,21348,21359,317, 21344,21345,21346,21347,21349,21350,21354,21356,7807, 466, 21351,356, 466, 317, 373, 21352,5054, 21353,380, 21355,21357,356, 466, + 317, 5201, 21358,21360,2024, 21366,317, 21361,21362,21363,21364,370, 317, 21365,18587,1347, 16354,21368,21375,21355,317, 2022, 21369,21370,21372,21371,2631, + 317, 317, 21373,21374,356, 5399, 317, 21376,380, 21377,466, 3854, 317, 12019,21379,21381,5226, 317, 21380,13161,345, 5650, 4591, 5201, 17943,21382,370, 8897, 317, 21383,21384,21385,21387,21395,21388,1347, 21389,21201,3125, 574, 21390,382, 363, 965, 21393,21394,21391,373, 1915, 21392,5447, 5847, 2510, 11366, 596, 317, 21396,5394, 466, 21397,5221, 351, 7951, 384, 11761,317, 20178,21400,317, 21401,317, 362, 345, 21402,21404,21428,350, 21442,21445,21465,21472, - 21486,21489,21491,21405,1588, 21408,21410,1588, 21414,21415,21421,21426,317, 21406,317, 356, 21407,370, 2571, 351, 317, 5650, 363, 21409,5241, 21411,1347, + 21486,21489,21491,21405,1588, 21408,21410,1588, 21414,21415,21421,21426,317, 21406,317, 356, 21407,370, 2571, 351, 317, 5650, 363, 21409,5241, 21411,1347, 317, 1347, 21412,21413,21416,5447, 21420,2211, 9756, 21417,21418,5458, 6021, 21419,351, 382, 5054, 21422,317, 345, 21423,21424,21425,6270, 21427,17768,21429, 21430,1358, 21435,5174, 317, 6904, 21431,21432,21433,5447, 5113, 21434,21436,21439,317, 21437,317, 21438,5324, 1347, 596, 317, 382, 21440,21441,2510, 10758, - 21443,21444,5365, 5394, 466, 21446,21449,21458,21463,2184, 5967, 21447,21448,4267, 356, 3999, 317, 1347, 381, 21450,9150, 21456,21451,21452,21453,21454,356, - 466, 317, 21455,5226, 345, 21457,363, 5201, 6266, 21459,5464, 21460,343, 5501, 7585, 21461,21462,21464,21466,21467,12662,4267, 317, 5394, 21468,21471,1588, - 382, 21469,1347, 21470,351, 382, 9852, 2381, 466, 21473,21483,21484,21474,21479,21480,21475,21476,5363, 21477,21478,373, 363, 5550, 21481,5464, 21482,2510, - 5457, 382, 5055, 343, 21485,21487,404, 21488,363, 21490,21492,21497,21499,21493,21494,21495,21496,317, 21498,21500,21504,466, 5457, 21501,21502,21503,317, + 21443,21444,5365, 5394, 466, 21446,21449,21458,21463,2184, 5967, 21447,21448,4267, 356, 3999, 317, 1347, 381, 21450,9150, 21456,21451,21452,21453,21454,356, + 466, 317, 21455,5226, 345, 21457,363, 5201, 6266, 21459,5464, 21460,343, 5501, 7585, 21461,21462,21464,21466,21467,12662,4267, 317, 5394, 21468,21471,1588, + 382, 21469,1347, 21470,351, 382, 9852, 2381, 466, 21473,21483,21484,21474,21479,21480,21475,21476,5363, 21477,21478,373, 363, 5550, 21481,5464, 21482,2510, + 5457, 382, 5055, 343, 21485,21487,404, 21488,363, 21490,21492,21497,21499,21493,21494,21495,21496,317, 21498,21500,21504,466, 5457, 21501,21502,21503,317, 317, 21505,317, 6996, 21506,317, 1526, 7888, 21508,370, 343, 21509,2171, 2584, 21512,2163, 21514,317, 373, 317, 21515,21516,355, 489, 21517,21518,21519, - 8301, 21527,21594,21629,21635,21696,21729,21737,21754,21759,21762,21764,21790,21798,21807,21811,21932,22033,22036,22072,22073,22074,373, 21520,21521,11654,448, + 8301, 21527,21594,21629,21635,21696,21729,21737,21754,21759,21762,21764,21790,21798,21807,21811,21932,22033,22036,22072,22073,22074,373, 21520,21521,11654,448, 21522,10824,15608,21523,21525,21526,1230, 21524,21528,21532,21561,21566,21573,21576,21585,21588,21529,10699,21530,343, 21531,6402, 13696,21533,5717, 21535,21537, - 21542,21548,21555,489, 21534,5991, 466, 3854, 317, 6763, 5487, 21536,9482, 5447, 466, 21538,21539,21540,339, 21541,5447, 5113, 351, 5226, 404, 21543,5054, - 317, 21544,21545,21546,21547,370, 1526, 10674,5273, 21549,5028, 356, 21550,21554,19922,1347, 317, 21551,21552,21553,21556,21557,21558,21559,21560,317, 1588, + 21542,21548,21555,489, 21534,5991, 466, 3854, 317, 6763, 5487, 21536,9482, 5447, 466, 21538,21539,21540,339, 21541,5447, 5113, 351, 5226, 404, 21543,5054, + 317, 21544,21545,21546,21547,370, 1526, 10674,5273, 21549,5028, 356, 21550,21554,19922,1347, 317, 21551,21552,21553,21556,21557,21558,21559,21560,317, 1588, 370, 21562,489, 21563,21564,3125, 21565,21567,21569,365, 5550, 2272, 21568,21570,21571,317, 317, 21572,404, 448, 9383, 21574,5717, 21575,20360,2146, 21577, 21580,21583,21578,21579,21581,21582,317, 1109, 21584,21586,21587,5324, 3640, 8000, 21589,21593,21590,357, 21591,466, 317, 21592,6021, 5324, 21595,21596,21607, 21612,21622,21625,373, 332, 2271, 21597,21598,21599,317, 21603,12849,357, 21600,21601,5394, 466, 21602,21604,21605,21606,381, 317, 396, 5399, 5611, 21608, 317, 21609,317, 21610,21611,5701, 10422,466, 317, 21613,21615,21618,21619,317, 21620,21614,3874, 5709, 21616,317, 21617,21621,1345, 21623,21624,317, 21626, 396, 4268, 434, 21627,523, 356, 21628,7419, 317, 382, 363, 7327, 370, 11089,357, 21630,7698, 21631,21632,21633,1347, 21634,21636,21637,21653,21673,21676, 21682,21691,317, 351, 7035, 21638,21643,21648,21651,2715, 21639,21640,21641,21642,21434,317, 21644,21645,21646,21647,19032,21649,3854, 5174, 317, 21650,21652, - 5464, 21470,351, 21654,21662,21349,21667,21671,317, 21655,21657,466, 21656,317, 21658,317, 2156, 21659,21660,370, 21661,21663,21664,21665,1325, 466, 373, + 5464, 21470,351, 21654,21662,21349,21667,21671,317, 21655,21657,466, 21656,317, 21658,317, 2156, 21659,21660,370, 21661,21663,21664,21665,1325, 466, 373, 21666,21668,21669,356, 466, 317, 21670,5054, 448, 21672,21674,21675,6265, 5543, 5536, 433, 21677,10237,21678,5439, 21679,1325, 21681,317, 317, 514, 21680, 382, 381, 370, 21683,370, 21687,21684,21685,21686,21688,21689,21690,356, 466, 317, 21692,21694,21693,10679,345, 5447, 21695,5514, 5055, 1347, 404, 21697, 343, 21703,21708,21709,21698,317, 21701,1033, 21699,21700,433, 21702,356, 5221, 2067, 21704,21705,21706,21707,21710,21717,434, 6265, 21711,317, 21712,21713, 21714,21715,5447, 21716,448, 382, 3079, 21718,21725,343, 21719,1915, 21720,1325, 21721,382, 21722,21723,21724,317, 317, 21726,345, 21727,10149,1871, 21728, 9549, 21730,21731,21733,21735,2067, 21732,21734,317, 21736,21738,21743,21746,21739,21740,21741,21742,21744,21745,21747,21749,5717, 21748,370, 317, 19032,21750, - 332, 21751,21752,5055, 21753,317, 317, 5828, 21755,363, 21756,21757,7053, 317, 3999, 21758,5055, 6021, 21760,21761,317, 533, 317, 371, 363, 21763,2809, + 332, 21751,21752,5055, 21753,317, 317, 5828, 21755,363, 21756,21757,7053, 317, 3999, 21758,5055, 6021, 21760,21761,317, 533, 317, 371, 363, 21763,2809, 317, 317, 21765,21768,21778,2022, 21782,2222, 471, 317, 418, 21766,21767,21769,21770,317, 418, 21775,6834, 21777,345, 11962,7465, 317, 21771,317, 21772, - 21773,7419, 317, 385, 382, 5055, 21774,21776,317, 370, 15510,317, 317, 381, 5661, 317, 18661,317, 371, 1160, 396, 21779,5225, 21781,21780,523, 466, + 21773,7419, 317, 385, 382, 5055, 21774,21776,317, 370, 15510,317, 317, 381, 5661, 317, 18661,317, 371, 1160, 396, 21779,5225, 21781,21780,523, 466, 21783,21787,317, 21788,21789,21784,21785,21786,5365, 345, 21791,21796,317, 21797,351, 350, 21792,21793,21794,21795,1345, 370, 317, 21799,21800,21802,21801, 4268, 21803,21804,21805,21806,21808,21810,317, 21809,380, 317, 390, 21812,21817,21828,21853,490, 21865,21876,21887,21923,1189, 21813,363, 21814,21815,21816, 21818,21824,21819,21823,21820,2156, 21821,21822,21825,21826,21827,21829,380, 332, 21835,21839,21844,381, 21830,21833,21831,21832,1325, 5987, 2510, 21834,21836, - 21837,356, 21838,317, 21840,21841,21842,2156, 21843,9313, 370, 21845,21846,5447, 466, 9922, 21847,21848,21850,9782, 427, 21849,1588, 21851,21852,317, 317, - 345, 317, 427, 21854,21858,21861,21855,2272, 21856,21857,356, 466, 317, 6020, 9063, 21859,9118, 21860,21862,21863,466, 448, 317, 317, 21864,370, 5324, + 21837,356, 21838,317, 21840,21841,21842,2156, 21843,9313, 370, 21845,21846,5447, 466, 9922, 21847,21848,21850,9782, 427, 21849,1588, 21851,21852,317, 317, + 345, 317, 427, 21854,21858,21861,21855,2272, 21856,21857,356, 466, 317, 6020, 9063, 21859,9118, 21860,21862,21863,466, 448, 317, 317, 21864,370, 5324, 21866,21870,21873,21867,5447, 21868,317, 350, 5226, 2537, 5500, 21869,21871,21872,343, 9853, 21874,21875,317, 317, 382, 427, 21877,21880,21878,21879,21881, 21883,21882,21884,5447, 466, 5201, 21885,21886,21888,21896,21899,21911,21889,21890,2156, 8204, 21891,317, 21892,9680, 317, 317, 21893,370, 317, 317, 21894, 345, 21895,6600, 6070, 590, 8484, 21897,21898,343, 13696,21900,21901,5226, 21902,21904,21903,5201, 1347, 5447, 21905,382, 21906,343, 21907,21908,317, 21909, 21910,370, 21912,21915,21918,21913,21914,356, 466, 317, 1347, 21916,21917,356, 404, 351, 21919,356, 21920,356, 21921,2510, 317, 373, 382, 9852, 21922, 5324, 18577,21924,21925,21929,21926,7821, 21927,317, 21928,356, 466, 317, 21903,5554, 21168,21930,466, 5095, 5225, 317, 21931,317, 21933,21945,21963,21972, - 21978,22032,21934,2146, 21936,21939,21941,2210, 317, 21935,356, 466, 2571, 317, 21937,21938,21940,9124, 466, 3854, 317, 21942,21943,21944,4268, 6435, 317, - 317, 21946,21957,21959,21960,21961,21947,21948,21950,21956,21949,21951,21952,363, 21953,5201, 21954,317, 21955,410, 5727, 12631,21958,356, 7836, 3854, 317, - 317, 490, 20488,21962,21964,21965,21966,21969,317, 317, 21970,21967,343, 21968,490, 4564, 317, 21971,5447, 8792, 21955,427, 5324, 514, 5167, 21973,345, + 21978,22032,21934,2146, 21936,21939,21941,2210, 317, 21935,356, 466, 2571, 317, 21937,21938,21940,9124, 466, 3854, 317, 21942,21943,21944,4268, 6435, 317, + 317, 21946,21957,21959,21960,21961,21947,21948,21950,21956,21949,21951,21952,363, 21953,5201, 21954,317, 21955,410, 5727, 12631,21958,356, 7836, 3854, 317, + 317, 490, 20488,21962,21964,21965,21966,21969,317, 317, 21970,21967,343, 21968,490, 4564, 317, 21971,5447, 8792, 21955,427, 5324, 514, 5167, 21973,345, 7185, 21975,317, 20712,21974,332, 21976,356, 21977,21979,22015,22017,22022,21980,21984,21991,21995,22002,22004,22006,22008,2322, 22010,21981,356, 21982,21983, 21985,21989,21986,21987,21988,356, 21990,2510, 317, 9313, 7327, 382, 5055, 21992,21993,21994,356, 5113, 448, 317, 21996,343, 21997,21998,21999,22000,22001, - 356, 3640, 22003,332, 5167, 22005,345, 22007,317, 2035, 22009,22011,22013,22012,22014,1325, 5226, 345, 380, 348, 22016,8243, 345, 345, 348, 22018,332, - 15531,1526, 22019,22020,5447, 5113, 22021,22023,22025,317, 317, 343, 22024,317, 410, 10422,466, 22026,22027,22028,22029,317, 22030,345, 22031,412, 370, + 356, 3640, 22003,332, 5167, 22005,345, 22007,317, 2035, 22009,22011,22013,22012,22014,1325, 5226, 345, 380, 348, 22016,8243, 345, 345, 348, 22018,332, + 15531,1526, 22019,22020,5447, 5113, 22021,22023,22025,317, 317, 343, 22024,317, 410, 10422,466, 22026,22027,22028,22029,317, 22030,345, 22031,412, 370, 22034,22035,317, 22037,22042,22062,22067,22069,351, 22038,22039,22040,22041,6266, 466, 6430, 22043,22048,13323,22061,8136, 22044,351, 22047,22045,382, 22046, 10512,5324, 21503,317, 317, 433, 22049,22051,22058,317, 22050,466, 22052,7640, 5113, 345, 381, 22053,22054,22055,22056,22057,317, 10422,22059,317, 22060, - 382, 5458, 2156, 21649,356, 466, 2510, 317, 22063,373, 22065,22064,356, 5113, 317, 22066,6425, 1526, 22068,1347, 22070,22071,370, 428, 428, 2301, 317, + 382, 5458, 2156, 21649,356, 466, 2510, 317, 22063,373, 22065,22064,356, 5113, 317, 22066,6425, 1526, 22068,1347, 22070,22071,370, 428, 428, 2301, 317, 2510, 13178,22075,22076,22078,22079,370, 22080,466, 22081,22089,22103,22105,536, 22108,22117,1109, 22127,22130,6036, 317, 363, 10476,7448, 22082,554, 22084, 362, 22088,5840, 345, 14062,317, 317, 22083,317, 22085,22086,317, 9088, 317, 633, 1160, 22087,370, 2022, 363, 5840, 2280, 22090,22091,633, 633, 22092, - 22094,2631, 22097,22098,535, 22099,4952, 22101,5087, 370, 22102,2571, 2272, 317, 14071,362, 22093,17366,317, 6674, 22095,370, 22096,5055, 390, 382, 2261, - 317, 1347, 381, 317, 22100,3366, 17565,990, 1347, 1992, 1160, 5684, 1588, 317, 22104,12563,6546, 317, 19228,343, 2077, 11443,22106,2022, 22107,1358, 1108, + 22094,2631, 22097,22098,535, 22099,4952, 22101,5087, 370, 22102,2571, 2272, 317, 14071,362, 22093,17366,317, 6674, 22095,370, 22096,5055, 390, 382, 2261, + 317, 1347, 381, 317, 22100,3366, 17565,990, 1347, 1992, 1160, 5684, 1588, 317, 22104,12563,6546, 317, 19228,343, 2077, 11443,22106,2022, 22107,1358, 1108, 1588, 6598, 7509, 356, 990, 22109,350, 317, 6089, 317, 22110,317, 5942, 317, 22111,566, 362, 22114,22115,6089, 343, 22112,5447, 22113,382, 5055, 21849, 2553, 22116,1020, 5841, 22118,317, 317, 22123,22119,10553,22120,22121,22122,5447, 5987, 2510, 317, 22124,22125,22126,317, 22128,4965, 2156, 317, 22129,22132, - 317, 22135,350, 22147,22148,2022, 22150,22153,22161,22166,22167,22168,22172,22133,317, 1347, 22134,2094, 317, 22136,362, 22140,9822, 22143,317, 22137,363, + 317, 22135,350, 22147,22148,2022, 22150,22153,22161,22166,22167,22168,22172,22133,317, 1347, 22134,2094, 317, 22136,362, 22140,9822, 22143,317, 22137,363, 1325, 22138,22139,345, 22141,466, 22142,437, 350, 22144,22145,22146,11279,12925,3869, 382, 7834, 7389, 22149,363, 363, 22151,501, 22152,7091, 22154,22159, - 6917, 22160,317, 7091, 380, 11640,22155,1347, 317, 14444,332, 22156,16137,2271, 11158,22158,9719, 317, 22157,2413, 381, 343, 11678,371, 7530, 317, 2060, - 22162,22163,22164,22165,428, 1345, 11089,351, 339, 317, 22169,317, 22170,22171,317, 404, 448, 2631, 9385, 7276, 22173,22176,22174,22175,22177,22179,2610, + 6917, 22160,317, 7091, 380, 11640,22155,1347, 317, 14444,332, 22156,16137,2271, 11158,22158,9719, 317, 22157,2413, 381, 343, 11678,371, 7530, 317, 2060, + 22162,22163,22164,22165,428, 1345, 11089,351, 339, 317, 22169,317, 22170,22171,317, 404, 448, 2631, 9385, 7276, 22173,22176,22174,22175,22177,22179,2610, 22180,373, 3375, 20492,22181,22187,22193,22195,22208,22213,22214,22215,22224,22228,22233,22237,22264,22273,22288,22317,22325,22342,22344,22352,22353,22357,22182, - 5439, 554, 317, 22183,317, 317, 18263,317, 22186,332, 20217,5087, 343, 343, 22184,317, 22185,317, 4984, 22188,22191,2022, 317, 9914, 22192,4984, 380, - 22189,317, 5223, 22190,317, 317, 317, 21621,5223, 22194,5570, 11505,7514, 22196,22197,22200,17040,350, 22204,16838,317, 345, 22207,3987, 317, 343, 332, - 332, 9454, 490, 317, 317, 867, 22198,10072,22199,4925, 317, 5418, 22201,22202,343, 22203,490, 22205,490, 22206,490, 317, 1325, 2236, 22209,1347, 363, - 380, 22211,1358, 22212,489, 1160, 22210,363, 9262, 22216,317, 317, 20909,9163, 22218,22221,11279,390, 22223,317, 22217,370, 317, 317, 2067, 5793, 317, + 5439, 554, 317, 22183,317, 317, 18263,317, 22186,332, 20217,5087, 343, 343, 22184,317, 22185,317, 4984, 22188,22191,2022, 317, 9914, 22192,4984, 380, + 22189,317, 5223, 22190,317, 317, 317, 21621,5223, 22194,5570, 11505,7514, 22196,22197,22200,17040,350, 22204,16838,317, 345, 22207,3987, 317, 343, 332, + 332, 9454, 490, 317, 317, 867, 22198,10072,22199,4925, 317, 5418, 22201,22202,343, 22203,490, 22205,490, 22206,490, 317, 1325, 2236, 22209,1347, 363, + 380, 22211,1358, 22212,489, 1160, 22210,363, 9262, 22216,317, 317, 20909,9163, 22218,22221,11279,390, 22223,317, 22217,370, 317, 317, 2067, 5793, 317, 22219,22220,8214, 345, 22222,7951, 345, 22225,22226,19922,11236,22227,427, 1160, 18322,317, 22229,476, 317, 317, 22230,345, 381, 317, 317, 22231,22232, 22234,22235,22236,7785, 1345, 317, 362, 351, 22238,22239,2077, 22242,22247,22250,22255,22257,317, 382, 317, 22259,22262,4984, 10619,332, 428, 22240,22241, 22243,317, 19565,332, 22244,22246,317, 9661, 317, 22245,6648, 404, 2163, 317, 317, 6387, 4980, 1347, 5960, 356, 466, 20883,356, 6598, 22248,11687,22249, 428, 22251,22253,22252,22254,22256,380, 382, 390, 363, 22258,380, 7651, 22260,317, 381, 22261,22263,428, 22265,22267,22270,317, 433, 345, 22266,22268, - 22269,22271,22272,2715, 317, 332, 317, 317, 370, 317, 5167, 5909, 317, 22274,466, 22280,2328, 22285,22286,22275,22276,22277,22278,22279,22281,22282,433, - 363, 5226, 1347, 317, 22283,1347, 22284,5055, 5355, 22287,317, 22289,22291,490, 22307,22313,317, 22316,317, 22290,1078, 317, 317, 332, 7892, 9427, 1160, + 22269,22271,22272,2715, 317, 332, 317, 317, 370, 317, 5167, 5909, 317, 22274,466, 22280,2328, 22285,22286,22275,22276,22277,22278,22279,22281,22282,433, + 363, 5226, 1347, 317, 22283,1347, 22284,5055, 5355, 22287,317, 22289,22291,490, 22307,22313,317, 22316,317, 22290,1078, 317, 317, 332, 7892, 9427, 1160, 22292,22293,2146, 22296,22298,22299,9244, 317, 5611, 22301,381, 317, 343, 22294,356, 22295,370, 2571, 351, 317, 382, 9852, 343, 2537, 22297,2146, 10970, - 22300,317, 22302,22303,22304,22305,22306,8553, 317, 317, 317, 13011,22308,22310,22311,350, 22312,4984, 317, 11921,363, 22309,595, 7672, 317, 317, 2067, - 343, 22314,5492, 317, 5220, 317, 22315,21188,22063,22318,22319,22320,554, 22322,22324,343, 15646,332, 357, 381, 2142, 365, 22321,317, 22323,6394, 5439, - 22326,22327,22328,22338,15745,22340,2301, 317, 7053, 343, 317, 6278, 317, 317, 22329,332, 22334,22336,380, 345, 22330,22331,22332,22333,22335,1108, 9182, - 317, 22337,22339,1109, 22341,317, 332, 317, 6968, 22343,22345,22346,22349,317, 345, 351, 8304, 317, 317, 6402, 490, 22347,673, 22348,22350,22351,317, - 428, 5055, 22354,22356,4591, 22355,22359,370, 20219,501, 22360,22362,22364,22366,22368,22369,22371,350, 22386,22391,22397,22415,317, 380, 22361,574, 317, + 22300,317, 22302,22303,22304,22305,22306,8553, 317, 317, 317, 13011,22308,22310,22311,350, 22312,4984, 317, 11921,363, 22309,595, 7672, 317, 317, 2067, + 343, 22314,5492, 317, 5220, 317, 22315,21188,22063,22318,22319,22320,554, 22322,22324,343, 15646,332, 357, 381, 2142, 365, 22321,317, 22323,6394, 5439, + 22326,22327,22328,22338,15745,22340,2301, 317, 7053, 343, 317, 6278, 317, 317, 22329,332, 22334,22336,380, 345, 22330,22331,22332,22333,22335,1108, 9182, + 317, 22337,22339,1109, 22341,317, 332, 317, 6968, 22343,22345,22346,22349,317, 345, 351, 8304, 317, 317, 6402, 490, 22347,673, 22348,22350,22351,317, + 428, 5055, 22354,22356,4591, 22355,22359,370, 20219,501, 22360,22362,22364,22366,22368,22369,22371,350, 22386,22391,22397,22415,317, 380, 22361,574, 317, 9422, 490, 22363,16458,3529, 434, 22365,332, 351, 363, 22367,2156, 317, 490, 317, 2211, 317, 22370,14174,605, 9521, 22372,22374,22375,22373,6171, 10252, 7223, 317, 6228, 22376,14883,20048,22377,22378,317, 382, 13631,22379,22382,22380,22381,22383,22384,22385,5481, 317, 351, 1230, 22387,22388,22389,22390,22392, 22394,22396,22393,5962, 1999, 332, 22395,10820,317, 5483, 317, 317, 317, 22398,332, 22403,22410,22413,350, 363, 317, 22414,5590, 22399,363, 1078, 22401, 22402,317, 22400,2004, 15830,7954, 8637, 1526, 317, 2110, 22404,22409,317, 22405,22406,22408,22407,362, 22411,22412,5611, 605, 370, 1479, 605, 317, 22417, 22419,22424,22428,350, 362, 22431,22432,22433,22436,22438,18170,22448,6240, 22418,22420,22421,2027, 22422,317, 317, 343, 22423,427, 22425,22427,22426,22429, - 22430,6036, 5022, 22434,22435,590, 380, 345, 22437,22439,4591, 22442,22445,343, 362, 22446,11398,317, 22440,317, 22441,22443,22444,11603,317, 428, 428, + 22430,6036, 5022, 22434,22435,590, 380, 345, 22437,22439,4591, 22442,22445,343, 362, 22446,11398,317, 22440,317, 22441,22443,22444,11603,317, 428, 428, 362, 351, 12588,13178,317, 22447,317, 317, 2948, 3646, 5005, 6089, 22449,317, 22450,22451,22453,22456,370, 433, 22461,12280,22467,22478,22566,22571,22598, - 22603,22614,3648, 22452,22454,317, 22455,362, 317, 11034,317, 22457,22460,317, 22458,22459,22462,351, 22464,22463,1160, 1160, 22465,466, 22466,362, 317, + 22603,22614,3648, 22452,22454,317, 22455,362, 317, 11034,317, 22457,22460,317, 22458,22459,22462,351, 22464,22463,1160, 1160, 22465,466, 22466,362, 317, 345, 16410,22468,6021, 22473,15130,22474,22476,22477,22469,317, 22470,22471,22472,22475,317, 404, 363, 404, 345, 351, 550, 363, 6532, 22479,5561, 22486, 22489,22480,338, 22481,22482,22483,22484,2510, 317, 1871, 363, 22485,2334, 317, 22487,22488,356, 466, 21358,362, 2510, 317, 317, 22490,5840, 22491,22562, - 2571, 385, 22563,7821, 22565,6020, 390, 317, 317, 21318,22492,345, 317, 22493,22498,22503,22509,22513,22519,22531,22536,22540,22547,22554,22556,22558,8567, + 2571, 385, 22563,7821, 22565,6020, 390, 317, 317, 21318,22492,345, 317, 22493,22498,22503,22509,22513,22519,22531,22536,22540,22547,22554,22556,22558,8567, 22494,22495,22496,22497,22499,22500,22501,22502,22504,22505,22506,22507,22508,317, 22510,22511,22512,22514,22516,22515,22517,22518,22520,317, 22521,22526,22522, 22523,22524,22525,22527,22530,22528,22529,363, 22532,22535,22533,22534,22537,22538,22539,21006,317, 22541,11617,22543,22542,22544,22545,22546,22548,22549,22550, 22551,22552,22553,22555,22557,2146, 14058,22559,22560,22561,596, 22564,317, 317, 10149,2260, 2260, 365, 2260, 22567,22569,5055, 317, 317, 22568,317, 14251, @@ -7481,26 +7476,26 @@ static const unsigned int ChildLocs[185261] = 2272, 317, 7419, 5538, 5619, 2405, 990, 350, 22583,466, 363, 9319, 317, 1347, 317, 12423,317, 317, 22585,22586,7504, 22590,22591,22592,22593,22594,22595, 22596,22597,317, 6710, 590, 317, 22587,16838,4591, 317, 22589,22588,990, 11944,530, 11619,1597, 2261, 370, 2301, 22599,22600,17366,22601,11921,317, 22602, 10471,317, 317, 22604,8600, 22606,22610,317, 343, 317, 345, 22612,317, 22605,317, 22607,22608,22609,22611,22613,22615,22616,22617,22618,22620,22627,22638, - 22642,22621,22622,22623,14433,317, 9749, 22624,22625,22626,5241, 22628,22629,22634,317, 5363, 317, 22630,370, 22633,22631,22632,22635,22636,356, 4249, 9648, + 22642,22621,22622,22623,14433,317, 9749, 22624,22625,22626,5241, 22628,22629,22634,317, 5363, 317, 22630,370, 22633,22631,22632,22635,22636,356, 4249, 9648, 16138,22637,1060, 343, 4564, 373, 428, 370, 363, 317, 5033, 22639,22640,22641,490, 1358, 317, 11330,317, 22644,22647,22651,22655,22656,22658,22659,22661, 362, 345, 22663,22664,22666,22667,5379, 1347, 22645,22646,317, 514, 370, 317, 428, 22648,9914, 22649,6996, 320, 22650,1060, 22652,22653,363, 382, 16838, - 22654,1345, 317, 317, 12966,1347, 2184, 317, 19979,351, 22657,380, 4564, 22660,317, 1992, 6859, 22662,1992, 1108, 22665,343, 21274,22668,343, 22670,2571, + 22654,1345, 317, 317, 12966,1347, 2184, 317, 19979,351, 22657,380, 4564, 22660,317, 1992, 6859, 22662,1992, 1108, 22665,343, 21274,22668,343, 22670,2571, 363, 22671,427, 3987, 317, 317, 350, 317, 22673,332, 4965, 350, 22674,343, 6917, 22677,317, 22675,22676,361, 6419, 22679,370, 3079, 22680,1999, 22681, 2184, 22682,1325, 381, 317, 3079, 317, 22683,317, 9422, 343, 427, 22685,380, 317, 367, 317, 317, 590, 22686,22689,22687,22688,22691,22692,22693,22694, - 22695,71, 22789,22865,22867,22869,22937,22941,22943,72, 22685,23038,9699, 23091,22696,22697,22700,22709,22712,22719,22720,22724,380, 22725,22729,22745,370, - 22749,22751,22756,22764,22769,22778,22779,22781,22698,22699,12616,17601,428, 343, 317, 15334,345, 22701,317, 22703,22708,6894, 22702,317, 22704,22705,9759, - 3999, 472, 3987, 3869, 22707,317, 317, 22706,317, 1194, 317, 14920,5241, 317, 22710,351, 339, 22711,384, 317, 14263,384, 384, 22713,22714,5991, 466, + 22695,71, 22789,22865,22867,22869,22937,22941,22943,72, 22685,23038,9699, 23091,22696,22697,22700,22709,22712,22719,22720,22724,380, 22725,22729,22745,370, + 22749,22751,22756,22764,22769,22778,22779,22781,22698,22699,12616,17601,428, 343, 317, 15334,345, 22701,317, 22703,22708,6894, 22702,317, 22704,22705,9759, + 3999, 472, 3987, 3869, 22707,317, 317, 22706,317, 1194, 317, 14920,5241, 317, 22710,351, 339, 22711,384, 317, 14263,384, 384, 22713,22714,5991, 466, 363, 22715,317, 22716,22717,14069,363, 22718,12696,351, 1345, 11089,363, 343, 317, 317, 363, 317, 22721,317, 317, 1358, 5711, 6228, 5142, 7866, 11089, 343, 22722,317, 22723,343, 3987, 6394, 373, 22726,351, 5363, 22728,5482, 22727,345, 356, 466, 317, 404, 2108, 22730,343, 22733,11443,22734,22735,22738, - 12630,22742,22743,351, 22744,1108, 3987, 22731,22732,9695, 2272, 10012,9878, 428, 343, 363, 11743,551, 380, 22736,427, 22737,2406, 5991, 466, 22739,317, + 12630,22742,22743,351, 22744,1108, 3987, 22731,22732,9695, 2272, 10012,9878, 428, 343, 363, 11743,551, 380, 22736,427, 22737,2406, 5991, 466, 22739,317, 22740,22741,15734,317, 12154,363, 404, 22746,317, 6817, 22748,10185,22747,5991, 16651,317, 317, 332, 317, 22750,317, 16218,317, 5840, 8020, 466, 22752, - 390, 22753,2188, 22755,4984, 370, 317, 22754,317, 1914, 317, 22757,22758,317, 4279, 22759,22760,22761,22762,22763,22765,22767,10877,317, 2416, 22766,317, - 867, 22768,317, 317, 317, 355, 22770,8948, 22774,350, 317, 22776,389, 22771,551, 22772,22773,22775,3999, 317, 317, 22777,317, 3809, 8695, 12155,343, + 390, 22753,2188, 22755,4984, 370, 317, 22754,317, 1914, 317, 22757,22758,317, 4279, 22759,22760,22761,22762,22763,22765,22767,10877,317, 2416, 22766,317, + 867, 22768,317, 317, 317, 355, 22770,8948, 22774,350, 317, 22776,389, 22771,551, 22772,22773,22775,3999, 317, 317, 22777,317, 3809, 8695, 12155,343, 22780,317, 404, 1325, 22782,22784,370, 22783,2571, 6228, 317, 590, 317, 22785,9262, 317, 22786,22787,317, 362, 3361, 367, 370, 22788,22790,1347, 22803, - 22804,22812,22819,362, 22821,22822,22823,22832,22837,22838,965, 565, 22844,22854,393, 22857,22861,22791,22792,1345, 22793,7565, 1345, 22795,22797,501, 317, - 22794,466, 2058, 317, 8116, 22796,362, 363, 317, 5447, 317, 22798,2510, 12277,22799,22800,22801,317, 317, 2272, 317, 22802,397, 332, 10613,343, 317, - 22805,22810,343, 317, 380, 22806,351, 343, 22807,490, 22808,22809,5457, 373, 22811,410, 490, 356, 466, 12461,317, 22791,22813,362, 362, 22815,8392, - 362, 22817,317, 343, 317, 22814,363, 317, 317, 9059, 22816,317, 1588, 351, 10422,22818,317, 317, 317, 412, 1992, 12696,21304,22820,363, 2402, 317, + 22804,22812,22819,362, 22821,22822,22823,22832,22837,22838,965, 565, 22844,22854,393, 22857,22861,22791,22792,1345, 22793,7565, 1345, 22795,22797,501, 317, + 22794,466, 2058, 317, 8116, 22796,362, 363, 317, 5447, 317, 22798,2510, 12277,22799,22800,22801,317, 317, 2272, 317, 22802,397, 332, 10613,343, 317, + 22805,22810,343, 317, 380, 22806,351, 343, 22807,490, 22808,22809,5457, 373, 22811,410, 490, 356, 466, 12461,317, 22791,22813,362, 362, 22815,8392, + 362, 22817,317, 343, 317, 22814,363, 317, 317, 9059, 22816,317, 1588, 351, 10422,22818,317, 317, 317, 412, 1992, 12696,21304,22820,363, 2402, 317, 20556,1108, 490, 1020, 22824,22829,5055, 22830,317, 22825,1325, 5054, 22826,19922,22827,22828,317, 3079, 3079, 1347, 22831,2272, 22833,17039,22835,22834,22836, 8955, 317, 12815,22839,345, 317, 317, 22840,22841,22842,22843,22845,22849,363, 22850,22851,22852,22853,22846,317, 22847,332, 22848,332, 6108, 5571, 18454, 317, 15734,2004, 362, 363, 3987, 317, 317, 356, 466, 4984, 317, 5573, 6089, 428, 384, 2063, 22855,22856,5055, 7428, 18092,1347, 380, 2381, 317, 22858, @@ -7508,70 +7503,70 @@ static const unsigned int ChildLocs[185261] = 22884,22891,22895,22896,8613, 22898,22921,22936,2178, 22871,6555, 317, 990, 363, 317, 16906,22873,22874,22875,2402, 404, 551, 22876,22878,2171, 8325, 22877, 317, 2510, 466, 317, 317, 2261, 15030,373, 351, 343, 4952, 317, 396, 20556,317, 317, 351, 350, 2067, 350, 370, 1345, 22885,22886,3078, 317, 18211, 22887,22888,8321, 317, 22889,22890,370, 317, 13986,370, 10674,6651, 351, 22892,22893,3605, 22894,1347, 22897,317, 363, 363, 21186,317, 22899,22901,22903, - 9624, 345, 22904,19325,22905,22907,22909,22913,380, 3987, 22900,6402, 2105, 317, 6486, 22902,317, 18978,8304, 2272, 22906,317, 22908,15343,317, 317, 345, - 317, 553, 22910,370, 4738, 350, 362, 363, 317, 22911,22912,22914,22916,22917,22919,317, 22915,490, 6458, 317, 332, 22918,317, 6565, 18313,22920,419, - 6763, 867, 16570,22922,22925,22928,363, 22933,16679,22923,22924,9624, 17919,6402, 22926,317, 22927,317, 363, 427, 22929,11860,22930,22931,317, 22932,5717, + 9624, 345, 22904,19325,22905,22907,22909,22913,380, 3987, 22900,6402, 2105, 317, 6486, 22902,317, 18978,8304, 2272, 22906,317, 22908,15343,317, 317, 345, + 317, 553, 22910,370, 4738, 350, 362, 363, 317, 22911,22912,22914,22916,22917,22919,317, 22915,490, 6458, 317, 332, 22918,317, 6565, 18313,22920,419, + 6763, 867, 16570,22922,22925,22928,363, 22933,16679,22923,22924,9624, 17919,6402, 22926,317, 22927,317, 363, 427, 22929,11860,22930,22931,317, 22932,5717, 22934,343, 363, 22935,6420, 867, 15464,22938,22939,22940,22942,1519, 317, 7940, 14991,22944,22945,22946,22950,22958,22959,22962,363, 22963,22724,22964,22965, - 22972,22979,22984,15387,2156, 22985,23009,23011,23019,23020,23035,23036,23037,22947,317, 22948,22949,332, 8357, 539, 7777, 22951,22954,345, 22952,22953,3987, + 22972,22979,22984,15387,2156, 22985,23009,23011,23019,23020,23035,23036,23037,22947,317, 22948,22949,332, 8357, 539, 7777, 22951,22954,345, 22952,22953,3987, 1345, 11962,22955,22956,6207, 22957,1347, 5419, 22960,3869, 22961,2117, 343, 551, 1033, 466, 363, 317, 363, 362, 350, 6195, 8733, 317, 370, 8392, 22966, - 2058, 22968,2024, 343, 2022, 2067, 2134, 22969,371, 317, 22967,3079, 370, 3079, 317, 317, 22970,22971,22973,343, 22974,8223, 22975,343, 22976,22977,6601, + 2058, 22968,2024, 343, 2022, 2067, 2134, 22969,371, 317, 22967,3079, 370, 3079, 317, 317, 22970,22971,22973,343, 22974,8223, 22975,343, 22976,22977,6601, 17039,8972, 3987, 22978,5238, 317, 350, 9567, 317, 317, 1109, 345, 317, 22980,1347, 22983,8136, 22981,22982,404, 15983,20146,8392, 22986,6195, 317, 12154, 14865,2022, 22987,362, 332, 363, 22988,23008,3987, 343, 1492, 439, 9557, 363, 317, 363, 22989,22994,22997,22998,7072, 23000,9648, 23001,11236,332, 23004, - 23005,23006,23007,351, 22990,22992,596, 22991,22993,317, 510, 10487,22995,22996,22999,578, 1358, 439, 370, 23002,23003,3361, 9760, 12303,5841, 12303,428, - 2627, 439, 6354, 363, 15789,363, 6207, 390, 10471,2509, 6318, 23010,3987, 350, 23012,390, 393, 23015,23016,23017,23013,23014,466, 4965, 8948, 1588, 390, + 23005,23006,23007,351, 22990,22992,596, 22991,22993,317, 510, 10487,22995,22996,22999,578, 1358, 439, 370, 23002,23003,3361, 9760, 12303,5841, 12303,428, + 2627, 439, 6354, 363, 15789,363, 6207, 390, 10471,2509, 6318, 23010,3987, 350, 23012,390, 393, 23015,23016,23017,23013,23014,466, 4965, 8948, 1588, 390, 351, 23018,5055, 23021,23022,23028,16249,3999, 8392, 23029,23033,23034,351, 7064, 14483,23023,8137, 23024,23025,23026,23027,317, 380, 345, 317, 317, 14337, 23030,541, 317, 401, 23031,317, 23032,1479, 363, 404, 363, 2024, 404, 381, 381, 350, 23039,23045,23047,23049,350, 23050,9075, 23057,23067,23073,23074, - 23083,317, 3529, 23088,1347, 23040,23041,373, 23042,317, 5324, 343, 23043,2758, 317, 356, 23044,345, 404, 370, 23046,317, 1060, 317, 23048,317, 412, - 10533,5201, 23051,23052,23054,2222, 317, 23052,23053,23055,3999, 317, 23056,317, 23058,11874,23062,23063,23066,2271, 3987, 23059,317, 317, 23060,23061,317, + 23083,317, 3529, 23088,1347, 23040,23041,373, 23042,317, 5324, 343, 23043,2758, 317, 356, 23044,345, 404, 370, 23046,317, 1060, 317, 23048,317, 412, + 10533,5201, 23051,23052,23054,2222, 317, 23052,23053,23055,3999, 317, 23056,317, 23058,11874,23062,23063,23066,2271, 3987, 23059,317, 317, 23060,23061,317, 370, 14298,317, 23064,23065,317, 5883, 380, 381, 317, 16129,4268, 16307,404, 23068,23071,23069,5464, 466, 23070,18324,23072,23075,4965, 23077,23078,10476, 23080,23076,317, 6726, 466, 8020, 466, 343, 23079,23081,317, 317, 23082,317, 23084,317, 23087,2551, 7428, 23085,23086,9624, 2022, 2510, 6354, 23089,23090, 332, 317, 379, 867, 317, 317, 12696,23092,16438,4965, 3999, 23093,23102,23119,23126,23094,13956,23096,23095,23097,23098,23099,23100,23101,23103,23104,23108, 23109,317, 23105,23106,23107,23110,23115,23117,23111,23112,23113,23114,9537, 23116,23118,345, 350, 317, 23120,23121,343, 23122,317, 317, 317, 317, 23123, 317, 23124,20061,343, 23125,23128,23129,23130,23132,23135,490, 19726,10997,23138,23139,23140,490, 1345, 317, 11516,23131,317, 23133,23134,357, 317, 23136, - 23137,384, 4477, 7850, 489, 19080,23141,23143,23144,23151,23154,23162,317, 23166,23145,23149,23146,23147,23148,23150,23152,23153,3830, 23155,3664, 23156,2733, + 23137,384, 4477, 7850, 489, 19080,23141,23143,23144,23151,23154,23162,317, 23166,23145,23149,23146,23147,23148,23150,23152,23153,3830, 23155,3664, 23156,2733, 23157,23159,23158,317, 317, 23160,23161,316, 317, 396, 23163,317, 23164,23165,23167,23173,23168,23169,23170,23171,23172,23174,23184,23196,23217,23224,23230, 23235,2134, 23236,23243,23245,23249,23284,23316,23335,23336,23350,23404,23424,23453,23454,23455,23457,23175,7711, 23177,23179,867, 23180,23176,21562,1347, 23178, - 363, 9215, 23181,23182,23183,23185,23188,23190,362, 23191,5087, 317, 23194,371, 23186,10375,1358, 23187,990, 23189,1160, 3573, 404, 317, 332, 9262, 490, - 345, 23192,317, 2142, 343, 5250, 23193,317, 362, 23195,23197,23200,23204,23208,23210,317, 23212,348, 22621,23198,23199,867, 23201,23203,317, 23202,317, - 15463,9301, 9623, 6834, 23205,23206,23207,23209,317, 5687, 20276,350, 23211,2413, 23213,22864,23215,23216,748, 23214,390, 5483, 23218,23219,317, 317, 9779, - 2171, 2022, 5809, 2170, 23220,23221,23222,317, 1194, 2070, 558, 5538, 23223,466, 317, 23225,317, 22843,10832,23226,23229,332, 6409, 317, 23227,317, 332, + 363, 9215, 23181,23182,23183,23185,23188,23190,362, 23191,5087, 317, 23194,371, 23186,10375,1358, 23187,990, 23189,1160, 3573, 404, 317, 332, 9262, 490, + 345, 23192,317, 2142, 343, 5250, 23193,317, 362, 23195,23197,23200,23204,23208,23210,317, 23212,348, 22621,23198,23199,867, 23201,23203,317, 23202,317, + 15463,9301, 9623, 6834, 23205,23206,23207,23209,317, 5687, 20276,350, 23211,2413, 23213,22864,23215,23216,748, 23214,390, 5483, 23218,23219,317, 317, 9779, + 2171, 2022, 5809, 2170, 23220,23221,23222,317, 1194, 2070, 558, 5538, 23223,466, 317, 23225,317, 22843,10832,23226,23229,332, 6409, 317, 23227,317, 332, 332, 23228,23231,2178, 23232,23233,23234,362, 317, 317, 381, 2211, 2073, 23237,23240,404, 23238,23239,23241,23242,1999, 1347, 345, 23244,23246,351, 23248, - 317, 23247,23250,23251,3750, 23257,9298, 23258,1020, 23259,23264,9298, 23269,23271,17039,23275,23281,3987, 23252,23255,23253,404, 23254,23256,361, 8205, 332, + 317, 23247,23250,23251,3750, 23257,9298, 23258,1020, 23259,23264,9298, 23269,23271,17039,23275,23281,3987, 23252,23255,23253,404, 23254,23256,361, 8205, 332, 2510, 23260,23261,362, 23263,427, 317, 317, 1347, 1347, 404, 317, 350, 362, 23262,317, 404, 18661,16825,501, 317, 317, 404, 351, 23265,317, 23266, - 23267,23268,23270,23272,23273,381, 6255, 23274,23276,363, 317, 23279,1358, 1915, 23277,23278,373, 1347, 22122,23280,317, 5418, 5447, 466, 23282,23283,7401, - 404, 9720, 949, 2060, 2060, 633, 23285,23286,23294,516, 550, 23295,23297,23299,23305,23307,23308,23309,23310,13631,23314,3869, 9521, 23287,23288,5793, 9914, - 317, 5406, 317, 317, 23289,9119, 23290,23292,13631,23291,7368, 23293,23296,2242, 370, 23298,23300,23302,23301,23303,23304,17007,317, 23306,20178,2060, 2067, - 404, 23311,23312,385, 5653, 23313,23315,21833,345, 23317,23318,23322,317, 490, 23324,23325,23326,23333,590, 317, 362, 356, 317, 23319,317, 371, 396, - 23320,23321,23323,317, 490, 12987,317, 332, 13178,317, 317, 2272, 501, 23327,371, 23328,7678, 23329,23330,363, 23331,404, 23332,317, 633, 7428, 1962, - 2391, 23334,332, 332, 382, 343, 7399, 832, 4965, 23337,23338,23340,5255, 23342,23343,23346,23349,23339,6402, 317, 23341,9422, 345, 317, 23344,596, 317, + 23267,23268,23270,23272,23273,381, 6255, 23274,23276,363, 317, 23279,1358, 1915, 23277,23278,373, 1347, 22122,23280,317, 5418, 5447, 466, 23282,23283,7401, + 404, 9720, 949, 2060, 2060, 633, 23285,23286,23294,516, 550, 23295,23297,23299,23305,23307,23308,23309,23310,13631,23314,3869, 9521, 23287,23288,5793, 9914, + 317, 5406, 317, 317, 23289,9119, 23290,23292,13631,23291,7368, 23293,23296,2242, 370, 23298,23300,23302,23301,23303,23304,17007,317, 23306,20178,2060, 2067, + 404, 23311,23312,385, 5653, 23313,23315,21833,345, 23317,23318,23322,317, 490, 23324,23325,23326,23333,590, 317, 362, 356, 317, 23319,317, 371, 396, + 23320,23321,23323,317, 490, 12987,317, 332, 13178,317, 317, 2272, 501, 23327,371, 23328,7678, 23329,23330,363, 23331,404, 23332,317, 633, 7428, 1962, + 2391, 23334,332, 332, 382, 343, 7399, 832, 4965, 23337,23338,23340,5255, 23342,23343,23346,23349,23339,6402, 317, 23341,9422, 345, 317, 23344,596, 317, 23345,381, 23347,317, 23348,23351,23356,23359,23360,23361,23362,23363,23369,23373,23375,23377,23378,23380,23390,23392,23397,501, 2142, 23403,373, 23352,23353, - 23354,332, 596, 317, 5447, 9130, 23355,332, 6113, 23357,466, 23358,12417,317, 427, 317, 332, 357, 2683, 590, 317, 2381, 2067, 317, 4980, 317, 6697, - 362, 1358, 332, 5105, 6763, 5861, 23364,23368,427, 490, 23365,23366,5200, 317, 23367,317, 351, 397, 370, 23370,23372,317, 317, 1160, 317, 317, 1347, - 1347, 1347, 23371,23374,370, 605, 23376,23379,23381,23383,23385,317, 317, 390, 558, 23382,380, 23384,365, 317, 6408, 317, 5477, 23386,23389,16704,8125, - 23387,23388,4965, 427, 5447, 5395, 23391,345, 23393,23395,350, 317, 23396,23394,5244, 1347, 343, 317, 6420, 345, 317, 23398,23399,23400,317, 18092,5761, + 23354,332, 596, 317, 5447, 9130, 23355,332, 6113, 23357,466, 23358,12417,317, 427, 317, 332, 357, 2683, 590, 317, 2381, 2067, 317, 4980, 317, 6697, + 362, 1358, 332, 5105, 6763, 5861, 23364,23368,427, 490, 23365,23366,5200, 317, 23367,317, 351, 397, 370, 23370,23372,317, 317, 1160, 317, 317, 1347, + 1347, 1347, 23371,23374,370, 605, 23376,23379,23381,23383,23385,317, 317, 390, 558, 23382,380, 23384,365, 317, 6408, 317, 5477, 23386,23389,16704,8125, + 23387,23388,4965, 427, 5447, 5395, 23391,345, 23393,23395,350, 317, 23396,23394,5244, 1347, 343, 317, 6420, 345, 317, 23398,23399,23400,317, 18092,5761, 543, 317, 317, 317, 23401,1992, 23402,23405,332, 23406,23407,23412,7657, 1347, 23413,23414,23423,5809, 371, 13076,2163, 551, 23408,23409,362, 350, 13856, - 317, 15682,317, 23410,23411,401, 10641,15682,7785, 7657, 363, 16318,350, 363, 23415,12014,345, 23416,514, 356, 23417,23420,317, 23418,317, 23419,317, + 317, 15682,317, 23410,23411,401, 10641,15682,7785, 7657, 363, 16318,350, 363, 23415,12014,345, 23416,514, 356, 23417,23420,317, 23418,317, 23419,317, 21495,2510, 23421,317, 1526, 23422,6055, 1325, 466, 23425,23426,23427,23430,5809, 23431,23435,23437,332, 23440,23441,23444,23448,7053, 490, 18092,1230, 11086, - 5810, 5810, 23428,428, 23429,5055, 8099, 4249, 2571, 317, 22578,23432,351, 428, 3987, 23433,23434,317, 2155, 23436,2142, 23438,21434,23439,11434,332, 343, + 5810, 5810, 23428,428, 23429,5055, 8099, 4249, 2571, 317, 22578,23432,351, 428, 3987, 23433,23434,317, 2155, 23436,2142, 23438,21434,23439,11434,332, 343, 4268, 23442,23443,9504, 380, 1109, 23445,5809, 23446,4738, 23447,384, 7231, 23449,23450,23451,317, 317, 14388,489, 23452,317, 343, 350, 16029,10774,23456, 350, 317, 317, 332, 384, 362, 23458,317, 12721,23460,23462,23463,23465,23469,23472,23461,23173,1243, 23464,5655, 371, 9961, 23466,19088,23467,23468,23470, 23471,23473,23474,23475,23476,23477,23479,380, 23480,23483,8613, 23481,371, 23482,23485,23486,23493,23487,23488,23489,23491,23490,23492,23494,23495,23497,23504, - 23522,23539,23544,23545,23552,8735, 23559,23563,23567,23572,23583,23589,23592,11346,23616,23498,2080, 1109, 2261, 23499,23500,23501,23502,23503,1999, 23505,428, - 23520,23521,16535,343, 23506,317, 23507,23511,11786,490, 10149,23512,23515,5353, 23517,23519,23508,23509,23510,23513,23514,23516,23518,516, 14042,317, 6355, - 23523,23525,23524,4591, 23526,23527,23528,23529,7969, 501, 343, 317, 565, 317, 317, 1230, 7560, 1992, 21656,5488, 23530,23533,23534,23535,23537,23538,8926, + 23522,23539,23544,23545,23552,8735, 23559,23563,23567,23572,23583,23589,23592,11346,23616,23498,2080, 1109, 2261, 23499,23500,23501,23502,23503,1999, 23505,428, + 23520,23521,16535,343, 23506,317, 23507,23511,11786,490, 10149,23512,23515,5353, 23517,23519,23508,23509,23510,23513,23514,23516,23518,516, 14042,317, 6355, + 23523,23525,23524,4591, 23526,23527,23528,23529,7969, 501, 343, 317, 565, 317, 317, 1230, 7560, 1992, 21656,5488, 23530,23533,23534,23535,23537,23538,8926, 13338,23531,23532,23536,6420, 339, 345, 23172,15754,5423, 1160, 23540,23541,23542,23543,1033, 18853,23546,23548,23551,23547,381, 317, 23549,23550,23553,23554, - 23555,23556,23557,23558,351, 23560,13638,5055, 23561,23562,2510, 520, 23564,317, 23566,590, 4564, 23565,363, 5838, 23568,11481,23570,5677, 23569,5701, 5343, + 23555,23556,23557,23558,351, 23560,13638,5055, 23561,23562,2510, 520, 23564,317, 23566,590, 4564, 23565,363, 5838, 23568,11481,23570,5677, 23569,5701, 5343, 317, 23571,3090, 23573,23575,23577,23574,23576,23578,23579,345, 6050, 317, 363, 363, 23580,4268, 23581,23582,6920, 23584,23586,971, 2128, 23588,317, 23585, 23587,317, 883, 1160, 23590,2271, 23591,317, 5241, 23593,23613,23594,23596,10253,23600,23601,23603,23610,362, 23595,23597,23598,23599,23602,2272, 23604,23609, - 23605,23606,23607,23608,23611,23612,23614,23615,10655,23617,23619,23634,23658,23661,23662,23667,23669,23620,23623,23625,23628,23621,23622,317, 23624,317, 8296, + 23605,23606,23607,23608,23611,23612,23614,23615,10655,23617,23619,23634,23658,23661,23662,23667,23669,23620,23623,23625,23628,23621,23622,317, 23624,317, 8296, 11280,23626,351, 3284, 317, 8296, 23627,412, 13638,23629,23631,317, 11146,23630,2402, 489, 317, 23632,23633,23635,23643,23646,2203, 23649,23653,23636,23637, - 317, 23638,5836, 23639,23640,23641,23642,23644,23645,23647,23648,7689, 23650,371, 11346,23651,23652,317, 12154,23654,23655,23656,23657,23659,23660,2073, 971, + 317, 23638,5836, 23639,23640,23641,23642,23644,23645,23647,23648,7689, 23650,371, 11346,23651,23652,317, 12154,23654,23655,23656,23657,23659,23660,2073, 971, 23663,23665,23664,490, 23666,23668,15480,1108, 23670,23671,23752,23754,23756,23764,23768,23773,23776,23778,23781,23786,75, 24323,24350,24374,77, 25798,25829, - 25835,81, 26848,26884,26900,26905,26926,83, 27423,84, 27656,27665,85, 28027,28032,28056,28110,23672,23712,23725,23733,23736,23746,23748,23750,23751,5225, - 23673,23679,23683,317, 316, 23686,23688,23693,7577, 23697,19398,23707,23711,1444, 490, 23674,23675,23676,23677,23678,23680,23682,23681,8162, 23684,23685,1998, + 25835,81, 26848,26884,26900,26905,26926,83, 27423,84, 27656,27665,85, 28027,28032,28056,28110,23672,23712,23725,23733,23736,23746,23748,23750,23751,5225, + 23673,23679,23683,317, 316, 23686,23688,23693,7577, 23697,19398,23707,23711,1444, 490, 23674,23675,23676,23677,23678,23680,23682,23681,8162, 23684,23685,1998, 23687,4280, 17725,343, 2322, 23689,5428, 23691,23692,8722, 23690,10594,18068,589, 23694,13174,23695,23696,23698,23703,23705,23706,23699,317, 317, 23700,23701, - 23702,23704,13135,317, 1444, 2163, 23708,23710,23709,590, 23713,23715,23722,23724,23714,490, 23716,23717,23718,23719,23720,23721,2351, 23723,381, 343, 7045, - 23726,23729,23727,23728,23730,23732,23731,381, 12785,23734,2074, 6606, 23728,23735,23737,317, 393, 23739,23741,23743,418, 23738,23740,23742,23744,23745,317, + 23702,23704,13135,317, 1444, 2163, 23708,23710,23709,590, 23713,23715,23722,23724,23714,490, 23716,23717,23718,23719,23720,23721,2351, 23723,381, 343, 7045, + 23726,23729,23727,23728,23730,23732,23731,381, 12785,23734,2074, 6606, 23728,23735,23737,317, 393, 23739,23741,23743,418, 23738,23740,23742,23744,23745,317, 1230, 23747,23749,1358, 15510,23753,4797, 4797, 2233, 12719,4798, 3360, 339, 2233, 4797, 23755,11091,23757,23759,23762,23758,23760,23761,23763,23765,23766,23767, 23769,23770,23771,23772,23774,23775,23777,23779,23780,23782,23783,23784,23785,23787,23789,23788,23790,365, 10283,23791,23802,23813,23823,23827,23835,23860,23869, 23892,23893,23901,23952,76, 24072,24073,24080,24084,24177,24201,24220,24261,24288,24300,24301,24320,23792,23793,7476, 23795,343, 23796,2022, 23798,23799,23801, @@ -7579,115 +7574,115 @@ static const unsigned int ChildLocs[185261] = 23805,5616, 343, 1347, 363, 1108, 23811,317, 428, 949, 23814,23816,23817,1345, 23822,5173, 317, 490, 4980, 317, 317, 317, 23815,412, 332, 317, 23818, 490, 23819,2035, 317, 23820,3375, 2537, 428, 6228, 1160, 317, 633, 338, 317, 23821,317, 2211, 450, 10243,590, 23824,8096, 5054, 23825,317, 2066, 23826, 317, 23828,23832,23834,2051, 479, 363, 23829,404, 23830,23831,317, 23833,10246,343, 23836,23837,3236, 23840,23845,23847,345, 10223,565, 23848,23850,23852, - 23853,6089, 23838,23839,317, 23841,317, 23843,2163, 23842,317, 343, 23844,23846,317, 317, 6420, 381, 363, 23849,6318, 317, 23851,317, 15027,390, 1999, - 2280, 8972, 23854,332, 362, 23855,23856,23857,23858,23859,23861,637, 351, 11654,23862,23867,15749,23868,5896, 23863,3023, 23864,23865,5793, 362, 23866,6601, + 23853,6089, 23838,23839,317, 23841,317, 23843,2163, 23842,317, 343, 23844,23846,317, 317, 6420, 381, 363, 23849,6318, 317, 23851,317, 15027,390, 1999, + 2280, 8972, 23854,332, 362, 23855,23856,23857,23858,23859,23861,637, 351, 11654,23862,23867,15749,23868,5896, 23863,3023, 23864,23865,5793, 362, 23866,6601, 6603, 8421, 7592, 317, 22412,363, 7866, 317, 2022, 356, 23870,7035, 365, 23872,11484,11388,332, 23873,23874,23882,23885,23888,23889,6382, 345, 8563, 23871, 8390, 317, 4060, 317, 343, 14982,317, 343, 370, 10147,317, 317, 2683, 23875,363, 332, 23876,23877,23878,23879,23880,23881,16865,23883,371, 317, 23884, 23886,23887,317, 596, 2184, 1345, 365, 2156, 2022, 553, 23890,6228, 317, 3692, 2077, 23891,317, 2211, 351, 781, 23391,9521, 23894,23896,23899,317, 23895, 23897,23898,637, 5942, 317, 633, 317, 317, 23900,317, 18333,23902,23903,11034,23906,23914,23916,23918,23921,23922,23924,23933,23937,23939,23942,23945,23946, 1108, 23948,23951,2236, 317, 317, 21190,317, 2035, 317, 23904,317, 7785, 23905,317, 651, 23907,649, 3284, 317, 13638,23908,1347, 23910,317, 343, 23911, - 345, 317, 23909,23912,343, 23913,23912,332, 23915,363, 23917,1999, 23919,23920,350, 4984, 2146, 490, 490, 317, 317, 8243, 490, 317, 23923,545, 317, - 23925,23929,23931,23932,990, 2184, 332, 1588, 317, 490, 23926,5612, 23927,637, 5942, 23928,651, 649, 316, 317, 317, 23930,490, 317, 523, 317, 4980, - 5663, 2405, 350, 23934,2004, 867, 317, 23935,317, 317, 23936,23938,2073, 7399, 317, 23940,2462, 23941,574, 2322, 23943,23944,6517, 343, 404, 23947,2022, + 345, 317, 23909,23912,343, 23913,23912,332, 23915,363, 23917,1999, 23919,23920,350, 4984, 2146, 490, 490, 317, 317, 8243, 490, 317, 23923,545, 317, + 23925,23929,23931,23932,990, 2184, 332, 1588, 317, 490, 23926,5612, 23927,637, 5942, 23928,651, 649, 316, 317, 317, 23930,490, 317, 523, 317, 4980, + 5663, 2405, 350, 23934,2004, 867, 317, 23935,317, 317, 23936,23938,2073, 7399, 317, 23940,2462, 23941,574, 2322, 23943,23944,6517, 343, 404, 23947,2022, 6420, 2537, 23949,23950,8035, 2134, 23953,23963,23969,5561, 23971,23975,23978,23981,23982,23988,23990,23954,23956,23959,23960,23961,332, 4952, 23955,466, 23957, - 23958,317, 317, 6834, 12796,23962,317, 490, 345, 23964,5898, 23965,23966,390, 418, 393, 5381, 317, 23967,23968,2537, 2537, 317, 363, 23970,317, 6089, - 23972,332, 23974,8937, 363, 9174, 317, 23973,23976,23977,14172,8178, 317, 6055, 1479, 23979,6089, 14172,589, 23980,633, 412, 6394, 565, 6691, 7865, 390, + 23958,317, 317, 6834, 12796,23962,317, 490, 345, 23964,5898, 23965,23966,390, 418, 393, 5381, 317, 23967,23968,2537, 2537, 317, 363, 23970,317, 6089, + 23972,332, 23974,8937, 363, 9174, 317, 23973,23976,23977,14172,8178, 317, 6055, 1479, 23979,6089, 14172,589, 23980,633, 412, 6394, 565, 6691, 7865, 390, 2510, 23983,317, 23984,23986,317, 351, 20146,1347, 23985,23987,382, 428, 23989,23991,1588, 23992,23993,317, 380, 949, 317, 23994,23996,23997,24009,24013, - 11686,24017,317, 24021,490, 24037,2022, 24040,24042,24055,24056,24060,24066,24068,24069,24071,317, 23995,20578,317, 23998,23999,24008,3999, 1078, 317, 7850, - 24000,6228, 410, 317, 24006,543, 317, 14425,24007,317, 24001,24002,24003,24004,24005,317, 24010,490, 1358, 24011,24012,16989,317, 21666,5623, 2261, 490, - 7368, 605, 3529, 1913, 370, 24014,24015,317, 24016,574, 605, 5793, 24018,381, 21186,24019,24020,317, 9624, 8577, 317, 9325, 490, 24022,380, 24032,490, - 24033,433, 317, 24036,490, 24023,24024,10038,24025,317, 317, 317, 1353, 317, 317, 1160, 317, 24026,24027,24030,8177, 24031,317, 24028,24029,363, 365, - 363, 404, 24034,317, 490, 343, 24035,842, 24038,6596, 24039,18387,317, 5809, 24041,24043,24044,6415, 24049,24052,317, 23695,24053,22786,1453, 24045,362, + 11686,24017,317, 24021,490, 24037,2022, 24040,24042,24055,24056,24060,24066,24068,24069,24071,317, 23995,20578,317, 23998,23999,24008,3999, 1078, 317, 7850, + 24000,6228, 410, 317, 24006,543, 317, 14425,24007,317, 24001,24002,24003,24004,24005,317, 24010,490, 1358, 24011,24012,16989,317, 21666,5623, 2261, 490, + 7368, 605, 3529, 1913, 370, 24014,24015,317, 24016,574, 605, 5793, 24018,381, 21186,24019,24020,317, 9624, 8577, 317, 9325, 490, 24022,380, 24032,490, + 24033,433, 317, 24036,490, 24023,24024,10038,24025,317, 317, 317, 1353, 317, 317, 1160, 317, 24026,24027,24030,8177, 24031,317, 24028,24029,363, 365, + 363, 404, 24034,317, 490, 343, 24035,842, 24038,6596, 24039,18387,317, 5809, 24041,24043,24044,6415, 24049,24052,317, 23695,24053,22786,1453, 24045,362, 24046,317, 574, 5896, 24047,24048,317, 389, 24050,317, 317, 24051,781, 6228, 317, 24054,317, 317, 648, 317, 396, 343, 741, 11831,5836, 24057,24058, - 343, 1358, 363, 5037, 439, 448, 317, 24059,345, 8446, 24061,14829,24063,6816, 24065,24062,24064,317, 24067,350, 490, 1033, 5038, 24070,605, 317, 351, - 10561,363, 317, 18577,14586,345, 24074,24076,24077,23995,5590, 24078,24079,2272, 24075,343, 1060, 2322, 15074,574, 317, 466, 24081,24082,24083,332, 317, - 24085,24089,24093,24096,24102,1444, 24106,24109,24114,24116,24136,24142,24144,24149,490, 24151,24156,24157,24165,24168,24171,24175,317, 24086,24087,8937, 317, - 317, 24088,10035,10471,24090,24091,332, 24092,2272, 5017, 317, 5154, 24094,13868,1358, 317, 345, 1160, 24095,24097,17711,345, 363, 317, 24098,24099,317, + 343, 1358, 363, 5037, 439, 448, 317, 24059,345, 8446, 24061,14829,24063,6816, 24065,24062,24064,317, 24067,350, 490, 1033, 5038, 24070,605, 317, 351, + 10561,363, 317, 18577,14586,345, 24074,24076,24077,23995,5590, 24078,24079,2272, 24075,343, 1060, 2322, 15074,574, 317, 466, 24081,24082,24083,332, 317, + 24085,24089,24093,24096,24102,1444, 24106,24109,24114,24116,24136,24142,24144,24149,490, 24151,24156,24157,24165,24168,24171,24175,317, 24086,24087,8937, 317, + 317, 24088,10035,10471,24090,24091,332, 24092,2272, 5017, 317, 5154, 24094,13868,1358, 317, 345, 1160, 24095,24097,17711,345, 363, 317, 24098,24099,317, 24101,24100,24103,380, 24104,11055,317, 24105,24107,21094,24108,18454,971, 24110,24112,4984, 317, 370, 24113,24111,24115,363, 8519, 6228, 1087, 24117,24120, - 24121,2609, 24122,8506, 19453,24123,24126,24127,24129,7916, 11242,24133,24135,24118,24119,396, 5273, 317, 381, 24124,24125,12485,551, 317, 24128,404, 343, - 1548, 24130,24131,24132,343, 24134,2261, 379, 7481, 363, 466, 2206, 24137,24138,24139,363, 5793, 317, 24140,317, 24141,317, 13023,317, 404, 24143,2074, - 11915,363, 6517, 20909,1479, 24145,24146,2022, 578, 24147,24148,24150,317, 1109, 317, 24152,24153,24154,24155,1060, 380, 10946,390, 317, 317, 317, 5105, + 24121,2609, 24122,8506, 19453,24123,24126,24127,24129,7916, 11242,24133,24135,24118,24119,396, 5273, 317, 381, 24124,24125,12485,551, 317, 24128,404, 343, + 1548, 24130,24131,24132,343, 24134,2261, 379, 7481, 363, 466, 2206, 24137,24138,24139,363, 5793, 317, 24140,317, 24141,317, 13023,317, 404, 24143,2074, + 11915,363, 6517, 20909,1479, 24145,24146,2022, 578, 24147,24148,24150,317, 1109, 317, 24152,24153,24154,24155,1060, 380, 10946,390, 317, 317, 317, 5105, 1160, 363, 371, 332, 8977, 12154,390, 317, 4943, 317, 390, 370, 6600, 317, 605, 317, 24158,2024, 24159,6000, 24163,317, 317, 317, 317, 551, 24160, 24162,24161,24164,351, 6191, 565, 317, 490, 24166,24167,1481, 10471,24169,24170,317, 390, 748, 363, 24172,390, 24173,390, 317, 24174,24176,5105, 24178, - 11716,24179,24181,19264,24182,24189,24191,24193,24196,24197,24198,5241, 365, 490, 24180,317, 343, 14495,24183,23337,24186,24187,490, 24188,5120, 6089, 6228, - 7127, 24184,24185,317, 317, 1481, 317, 317, 428, 382, 317, 605, 4965, 317, 24190,2219, 24192,24194,363, 24195,748, 8178, 9319, 5926, 24199,317, 6402, - 2705, 317, 24200,24202,419, 24208,7865, 24210,332, 24211,7871, 365, 15667,24213,24218,24219,317, 317, 24203,24204,18138,24205,24206,8049, 7506, 343, 533, + 11716,24179,24181,19264,24182,24189,24191,24193,24196,24197,24198,5241, 365, 490, 24180,317, 343, 14495,24183,23337,24186,24187,490, 24188,5120, 6089, 6228, + 7127, 24184,24185,317, 317, 1481, 317, 317, 428, 382, 317, 605, 4965, 317, 24190,2219, 24192,24194,363, 24195,748, 8178, 9319, 5926, 24199,317, 6402, + 2705, 317, 24200,24202,419, 24208,7865, 24210,332, 24211,7871, 365, 15667,24213,24218,24219,317, 317, 24203,24204,18138,24205,24206,8049, 7506, 343, 533, 1588, 24207,317, 24209,317, 317, 476, 2272, 317, 1992, 343, 24212,24214,317, 24217,24215,24216,24221,24227,24228,16017,24230,2381, 24241,23015,24244,24247, - 24251,24253,24254,24259,24222,2022, 317, 24223,24226,24224,2609, 24225,2087, 350, 317, 24229,317, 24231,24233,24234,551, 24232,317, 20871,24235,24236,5459, + 24251,24253,24254,24259,24222,2022, 317, 24223,24226,24224,2609, 24225,2087, 350, 317, 24229,317, 24231,24233,24234,551, 24232,317, 20871,24235,24236,5459, 24237,10550,397, 14146,24238,363, 24240,24239,370, 7368, 317, 24242,24243,404, 24245,24246,2571, 24248,24249,24250,363, 24252,390, 317, 350, 24255,12820, 24257,24256,3361, 434, 362, 24258,2108, 24260,949, 24262,490, 24264,24270,2022, 24282,2086, 6138, 24283,24286,2086, 24263,317, 5120, 3505, 317, 637, 24265, - 6996, 637, 740, 633, 673, 633, 1962, 317, 362, 24266,24268,317, 317, 24269,317, 5826, 317, 2369, 3075, 24267,448, 5943, 8264, 24271,24277,10699,9364, + 6996, 637, 740, 633, 673, 633, 1962, 317, 362, 24266,24268,317, 317, 24269,317, 5826, 317, 2369, 3075, 24267,448, 5943, 8264, 24271,24277,10699,9364, 24278,363, 867, 24280,24281,637, 24272,24273,317, 317, 317, 1353, 8345, 1353, 317, 317, 317, 317, 7785, 317, 317, 17501,317, 9064, 2161, 317, 24274, 317, 24275,24276,317, 317, 396, 8178, 8275, 317, 363, 6596, 363, 317, 24279,317, 317, 317, 317, 363, 404, 5037, 19979,437, 317, 381, 24284,24285, 24287,15108,1044, 24289,350, 24291,1347, 24292,24293,12598,24295,24296,24297,24299,356, 24290,317, 633, 370, 1160, 24294,317, 370, 389, 317, 1325, 16651, 317, 24298,356, 2004, 350, 15519,24302,24304,14062,24306,24310,24311,1020, 24312,4040, 5793, 2036, 24314,24315,24317,317, 317, 24303,317, 24305,24307,24308, 24309,3529, 3529, 24313,22560,466, 371, 2060, 24316,24318,24319,317, 19163,317, 317, 24321,317, 24322,14337,466, 24324,24325,24327,2584, 24330,24334,24338, - 24346,2719, 343, 24326,24328,24329,24331,317, 24332,24333,24335,24336,24337,317, 1337, 24339,24340,24341,5841, 19081,1108, 24342,24343,1108, 24344,24345,316, + 24346,2719, 343, 24326,24328,24329,24331,317, 24332,24333,24335,24336,24337,317, 1337, 24339,24340,24341,5841, 19081,1108, 24342,24343,1108, 24344,24345,316, 396, 24347,24348,24349,24351,24352,24353,24354,24357,24358,24373,24355,24356,620, 4943, 24359,24362,2206, 24364,24360,24361,24363,24365,24368,24366,24367,24369, 24370,24371,24372,24375,15680,345, 22091,949, 24376,476, 317, 24377,317, 24378,24379,18757,24382,24444,24506,24633,24656,24686,24763,24807,24829,24848,24861, 78, 79, 25198,25284,25295,25374,25377,80, 25618,25682,25702,25760,25784,25789,25794,24380,24381,24383,24391,24407,24408,380, 24410,24411,6412, 24416,24423, - 24424,24432,24433,15510,24441,24384,24387,24389,317, 24385,345, 24386,24388,476, 370, 317, 24390,1267, 24392,2077, 24394,24395,11089,24396,24401,24404,490, - 24405,24406,317, 7035, 24393,3505, 356, 12789,343, 389, 1526, 24397,24399,317, 24398,381, 2156, 24400,24402,2631, 24403,1160, 740, 363, 536, 4447, 379, + 24424,24432,24433,15510,24441,24384,24387,24389,317, 24385,345, 24386,24388,476, 370, 317, 24390,1267, 24392,2077, 24394,24395,11089,24396,24401,24404,490, + 24405,24406,317, 7035, 24393,3505, 356, 12789,343, 389, 1526, 24397,24399,317, 24398,381, 2156, 24400,24402,2631, 24403,1160, 740, 363, 536, 4447, 379, 1020, 2301, 2063, 2298, 13905,2571, 343, 24409,867, 565, 5055, 2272, 490, 24412,24414,24415,317, 317, 317, 24413,317, 317, 317, 24417,24419,24420,14708, - 5891, 317, 317, 317, 24418,10345,1109, 24421,24422,345, 345, 317, 345, 8948, 6294, 24425,7976, 24427,370, 24428,343, 317, 24430,24431,390, 317, 363, - 24426,6632, 317, 11678,6002, 2369, 2117, 24429,1325, 343, 466, 2004, 363, 11786,1347, 345, 363, 317, 24434,2022, 363, 317, 16596,317, 24435,24436,2171, - 24437,24438,9119, 12815,2402, 24439,9696, 356, 332, 24440,4965, 3422, 2510, 24442,24443,24445,24458,24460,24474,24480,24482,24483,24488,11831,24496,24497,1358, + 5891, 317, 317, 317, 24418,10345,1109, 24421,24422,345, 345, 317, 345, 8948, 6294, 24425,7976, 24427,370, 24428,343, 317, 24430,24431,390, 317, 363, + 24426,6632, 317, 11678,6002, 2369, 2117, 24429,1325, 343, 466, 2004, 363, 11786,1347, 345, 363, 317, 24434,2022, 363, 317, 16596,317, 24435,24436,2171, + 24437,24438,9119, 12815,2402, 24439,9696, 356, 332, 24440,4965, 3422, 2510, 24442,24443,24445,24458,24460,24474,24480,24482,24483,24488,11831,24496,24497,1358, 24446,24447,2022, 24448,24451,16307,12791,24456,317, 2222, 343, 24449,24450,490, 24452,343, 317, 1526, 24455,18978,24453,24454,24457,24459,490, 317, 12527, 345, 24461,2510, 24462,317, 24464,24469,317, 24470,317, 371, 24463,24465,8117, 22534,24466,24467,24468,5828, 5828, 317, 317, 11064,370, 24471,24472,24473, - 24475,490, 22370,24476,317, 317, 22252,24477,24478,24479,24481,10487,2163, 339, 22252,605, 551, 24484,345, 5255, 24485,24486,343, 393, 317, 15346,345, - 24487,1358, 317, 24489,24490,24492,24494,24495,317, 24491,332, 24493,317, 5611, 390, 371, 393, 317, 316, 343, 380, 363, 350, 363, 15334,2510, 317, - 24498,351, 24499,24500,24501,24502,356, 24505,317, 345, 24503,24504,5428, 382, 317, 24507,5217, 24527,24544,24550,24559,24562,24575,24615,24632,24508,363, + 24475,490, 22370,24476,317, 317, 22252,24477,24478,24479,24481,10487,2163, 339, 22252,605, 551, 24484,345, 5255, 24485,24486,343, 393, 317, 15346,345, + 24487,1358, 317, 24489,24490,24492,24494,24495,317, 24491,332, 24493,317, 5611, 390, 371, 393, 317, 316, 343, 380, 363, 350, 363, 15334,2510, 317, + 24498,351, 24499,24500,24501,24502,356, 24505,317, 345, 24503,24504,5428, 382, 317, 24507,5217, 24527,24544,24550,24559,24562,24575,24615,24632,24508,363, 317, 1588, 24509,24510,24511,24512,24515,24524,24526,5273, 380, 12961,19791,317, 2110, 13338,317, 5241, 332, 317, 2222, 24513,2537, 490, 24514,24516,24522, 332, 2271, 10604,317, 24523,24517,24518,24519,24520,24521,343, 5226, 24525,867, 6826, 317, 13573,317, 351, 24528,5428, 3854, 24529,24531,24532,24536,24541, 14062,24530,24322,5543, 2156, 24533,24534,343, 24535,317, 317, 14371,317, 370, 498, 24537,332, 370, 24538,24539,24540,24542,24543,5054, 5055, 5550, 24545, - 24548,24549,2272, 24546,381, 381, 6555, 11921,24547,8304, 381, 13962,5428, 24551,24553,24554,2715, 317, 24556,21575,345, 410, 24552,466, 5727, 5324, 317, + 24548,24549,2272, 24546,381, 381, 6555, 11921,24547,8304, 381, 13962,5428, 24551,24553,24554,2715, 317, 24556,21575,345, 410, 24552,466, 5727, 5324, 317, 317, 24555,345, 317, 5097, 24557,24558,551, 24560,7401, 466, 362, 317, 317, 24561,8488, 9059, 362, 24563,24571,24573,24574,343, 5488, 317, 24564,24567, - 24565,8136, 466, 317, 24566,5262, 448, 24568,24569,24570,17358,24572,317, 1065, 317, 24576,24577,24578,24580,24584,24597,371, 24607,24611,11921,24612,1347, + 24565,8136, 466, 317, 24566,5262, 448, 24568,24569,24570,17358,24572,317, 1065, 317, 24576,24577,24578,24580,24584,24597,371, 24607,24611,11921,24612,1347, 24579,317, 24581,24582,24583,5488, 5488, 24585,317, 24590,24586,24587,24588,24589,24591,24593,24592,5447, 20858,24594,24595,24596,24598,24604,24599,24601,24600, - 24602,24603,24605,317, 24606,24608,343, 427, 317, 24609,5447, 24610,2510, 345, 382, 5055, 343, 317, 24613,24614,317, 990, 5174, 2022, 2022, 2022, 317, + 24602,24603,24605,317, 24606,24608,343, 427, 317, 24609,5447, 24610,2510, 345, 382, 5055, 343, 317, 24613,24614,317, 990, 5174, 2022, 2022, 2022, 317, 15540,24616,24617,24628,1108, 24629,21483,5447, 2036, 356, 24618,24624,24619,24620,24621,24622,24623,5488, 7888, 24625,24626,24627,867, 867, 466, 24630,24631, - 351, 4591, 5828, 24634,536, 24635,24639,24640,11236,554, 24645,24650,24652,7990, 1453, 24636,24637,24638,24641,351, 348, 345, 24642,343, 24643,24644,5113, + 351, 4591, 5828, 24634,536, 24635,24639,24640,11236,554, 24645,24650,24652,7990, 1453, 24636,24637,24638,24641,351, 348, 345, 24642,343, 24643,24644,5113, 448, 24646,317, 24647,24648,24649,317, 24651,24653,5447, 466, 24654,356, 24655,373, 5055, 343, 949, 24657,2161, 24658,6600, 7405, 24661,21074,24662,24664, 24665,24677,24680,24681,24682,9702, 24683,24659,2036, 24660,317, 363, 24663,466, 317, 928, 24666,24667,2171, 24668,16248,24669,370, 24670,1526, 24672,24673, 24676,317, 13457,373, 434, 490, 382, 24671,24674,24675,16187,317, 9624, 24678,466, 362, 4974, 24679,2510, 317, 490, 317, 24684,24685,866, 24687,24693, - 24696,24713,24715,554, 24736,24742,24750,24760,24761,2184, 24688,5174, 5428, 24689,5241, 24691,3941, 2537, 24690,5991, 466, 24692,24694,24695,7988, 24697,317, + 24696,24713,24715,554, 24736,24742,24750,24760,24761,2184, 24688,5174, 5428, 24689,5241, 24691,3941, 2537, 24690,5991, 466, 24692,24694,24695,7988, 24697,317, 2541, 24700,317, 24709,24698,24699,356, 5847, 2510, 317, 7698, 24701,24703,24706,24702,2571, 10149,317, 4267, 24704,466, 317, 317, 24705,317, 24707,24708, - 351, 317, 2571, 10149,317, 373, 5550, 24710,24712,24711,343, 317, 498, 380, 356, 466, 24714,10550,24716,24718,24723,343, 5464, 24727,24728,24732,1588, + 351, 317, 2571, 10149,317, 373, 5550, 24710,24712,24711,343, 317, 498, 380, 356, 466, 24714,10550,24716,24718,24723,343, 5464, 24727,24728,24732,1588, 317, 24717,343, 7810, 6674, 24719,24720,24721,24722,24724,24725,1347, 24726,2537, 5517, 5019, 24729,24730,24731,24733,5447, 24734,317, 373, 418, 382, 24735, 6441, 21036,5096, 24737,24741,24738,24740,24739,356, 5113, 351, 317, 2537, 350, 317, 5190, 11648,24743,24748,605, 317, 24744,343, 24747,1479, 24745,24746, 5254, 356, 8792, 24749,24751,24758,596, 412, 363, 24752,596, 10238,317, 24753,317, 317, 24754,24757,317, 24755,24756,24759,8061, 370, 6188, 1009, 24762, 332, 1325, 466, 24764,317, 24769,317, 24776,24781,362, 24785,24786,24788,24805,332, 24765,2272, 317, 3726, 24766,24768,24767,10763,3522, 373, 15330,11648, - 412, 24770,24771,2212, 2067, 349, 10487,317, 867, 24772,24775,15213,2084, 24773,24774,345, 370, 9129, 24777,2537, 24778,24779,11339,24780,24782,351, 317, - 24784,24783,465, 317, 363, 351, 427, 24787,9027, 2405, 365, 350, 5237, 350, 24789,24800,24803,370, 396, 7098, 18588,24790,24795,24797,343, 24798,317, + 412, 24770,24771,2212, 2067, 349, 10487,317, 867, 24772,24775,15213,2084, 24773,24774,345, 370, 9129, 24777,2537, 24778,24779,11339,24780,24782,351, 317, + 24784,24783,465, 317, 363, 351, 427, 24787,9027, 2405, 365, 350, 5237, 350, 24789,24800,24803,370, 396, 7098, 18588,24790,24795,24797,343, 24798,317, 9917, 24791,24792,24793,24794,5087, 1526, 24796,343, 24799,24801,24802,2381, 2236, 381, 396, 24804,345, 24806,5619, 450, 24808,24811,24814,24815,2222, 24816, 24817,5108, 24819,24821,6002, 24809,8392, 24810,345, 501, 317, 24812,3967, 1588, 24813,351, 4738, 24038,605, 396, 24818,2086, 24820,351, 24822,24823,24824, - 24826,24825,393, 356, 404, 24827,24828,3714, 24830,24832,24833,24835,12463,24837,380, 343, 15608,24839,24840,24844,24845,24846,24847,2163, 24831,6917, 6206, + 24826,24825,393, 356, 404, 24827,24828,3714, 24830,24832,24833,24835,12463,24837,380, 343, 15608,24839,24840,24844,24845,24846,24847,2163, 24831,6917, 6206, 2261, 11986,24834,24836,5238, 24838,10008,24841,14708,4738, 24842,24843,8600, 380, 350, 317, 317, 2222, 390, 2510, 596, 24637,2108, 317, 317, 24849,24854, - 24855,11339,24850,2219, 350, 317, 24851,590, 24853,19617,343, 24852,363, 2601, 6387, 24856,343, 24858,2261, 24860,24857,24859,24862,2533, 24863,2272, 350, + 24855,11339,24850,2219, 350, 317, 24851,590, 24853,19617,343, 24852,363, 2601, 6387, 24856,343, 24858,2261, 24860,24857,24859,24862,2533, 24863,2272, 350, 24866,24868,24870,24872,2044, 370, 317, 24864,24865,24867,317, 511, 24869,370, 24871,24873,24923,24928,24935,24936,24954,24958,24969,24972,2222, 25001,25031, 25038,25040,25056,25068,25071,25075,25080,25087,25092,12565,24874,24875,381, 24881,24885,24888,24893,24894,24895,24898,317, 24901,24907,24909,24913,24917,24920, - 24922,5273, 24876,24877,24878,24879,317, 574, 351, 2326, 1108, 24880,6598, 24882,24884,24883,356, 24886,317, 2537, 380, 2373, 24887,332, 748, 15753,2381, - 24889,24890,2369, 397, 1358, 24891,490, 317, 24892,5611, 1108, 24896,1588, 2110, 24897,350, 317, 5661, 317, 370, 24899,24900,6555, 317, 1108, 24902,9298, - 24904,317, 24884,24903,24905,24906,317, 10628,6021, 5711, 343, 24908,24910,11034,24911,332, 379, 605, 24912,381, 2117, 10763,24914,343, 24915,24916,350, - 17021,24918,24919,350, 317, 11560,343, 380, 24921,2035, 490, 10758,1588, 350, 350, 24924,24925,24926,24927,11635,9226, 317, 7368, 8400, 14595,24929,317, + 24922,5273, 24876,24877,24878,24879,317, 574, 351, 2326, 1108, 24880,6598, 24882,24884,24883,356, 24886,317, 2537, 380, 2373, 24887,332, 748, 15753,2381, + 24889,24890,2369, 397, 1358, 24891,490, 317, 24892,5611, 1108, 24896,1588, 2110, 24897,350, 317, 5661, 317, 370, 24899,24900,6555, 317, 1108, 24902,9298, + 24904,317, 24884,24903,24905,24906,317, 10628,6021, 5711, 343, 24908,24910,11034,24911,332, 379, 605, 24912,381, 2117, 10763,24914,343, 24915,24916,350, + 17021,24918,24919,350, 317, 11560,343, 380, 24921,2035, 490, 10758,1588, 350, 350, 24924,24925,24926,24927,11635,9226, 317, 7368, 8400, 14595,24929,317, 1881, 24933,24934,2321, 24930,24931,24932,1588, 357, 373, 21274,332, 21101,2280, 317, 24937,24939,24940,24942,489, 8304, 2086, 24944,24945,11279,24950,24951, - 24952,5017, 883, 317, 24938,24941,9298, 332, 5502, 24943,370, 317, 384, 317, 24946,24947,317, 24948,24949,741, 343, 2537, 404, 24953,5113, 1588, 317, + 24952,5017, 883, 317, 24938,24941,9298, 332, 5502, 24943,370, 317, 384, 317, 24946,24947,317, 24948,24949,741, 343, 2537, 404, 24953,5113, 1588, 317, 6108, 317, 24955,15325,24956,317, 317, 24884,24957,7143, 24959,24963,24964,2004, 24966,24967,24960,5238, 24962,317, 24961,317, 24965,11124,5428, 17782,24968, - 24965,24970,24971,2060, 332, 4984, 24973,24979,24984,24987,24988,24989,317, 24994,24996,343, 345, 24997,317, 24974,24975,317, 24976,24949,24977,24978,5847, + 24965,24970,24971,2060, 332, 4984, 24973,24979,24984,24987,24988,24989,317, 24994,24996,343, 345, 24997,317, 24974,24975,317, 24976,24949,24977,24978,5847, 317, 24980,24983,5201, 24981,24982,370, 8266, 1347, 8577, 24985,24986,356, 10891,317, 4925, 6499, 317, 24745,490, 24990,2163, 24991,24992,24993,317, 24995, - 7834, 427, 317, 317, 357, 343, 317, 350, 5174, 24998,24999,25000,356, 10147,317, 317, 6394, 514, 25002,25003,621, 25004,25022,25026,25027,25030,317, - 427, 332, 317, 25005,17366,25007,25009,332, 25011,25017,25019,5612, 317, 25006,2291, 25008,25010,2279, 5793, 25012,25014,2035, 25016,25013,25015,7567, 7306, - 25018,343, 13478,25020,25021,25023,25024,25025,10519,10583,317, 317, 317, 25028,18846,10561,317, 25029,317, 6300, 317, 25032,25033,25034,25037,317, 343, - 317, 18387,17699,6179, 5238, 317, 9422, 25035,25036,5428, 5428, 1358, 5238, 332, 25039,514, 867, 332, 25041,11986,396, 343, 25042,25043,25045,25047,8722, - 1358, 2236, 1358, 574, 2163, 1345, 25044,1347, 343, 25046,343, 19478,343, 343, 363, 7399, 317, 317, 25048,317, 350, 25051,25053,25049,25050,2086, 6394, - 2134, 25052,2086, 25054,25055,25057,25058,25060,25063,7399, 25064,18077,490, 25059,317, 25061,317, 317, 25062,5570, 867, 332, 317, 574, 25065,25066,1588, - 25067,370, 9549, 7865, 25069,25070,317, 12849,7668, 25072,25073,25074,363, 317, 317, 5238, 25076,339, 25079,317, 4437, 1266, 317, 317, 317, 317, 317, - 317, 649, 317, 2078, 25077,2272, 7568, 10471,25078,356, 317, 5611, 25081,5441, 343, 393, 2142, 25083,25084,343, 25086,1347, 25082,5217, 317, 317, 365, - 490, 25085,317, 9852, 8082, 25088,25089,10619,317, 10619,317, 25090,1992, 25091,25093,25110,25115,25117,25136,25147,332, 11249,25150,370, 25152,25189,6994, + 7834, 427, 317, 317, 357, 343, 317, 350, 5174, 24998,24999,25000,356, 10147,317, 317, 6394, 514, 25002,25003,621, 25004,25022,25026,25027,25030,317, + 427, 332, 317, 25005,17366,25007,25009,332, 25011,25017,25019,5612, 317, 25006,2291, 25008,25010,2279, 5793, 25012,25014,2035, 25016,25013,25015,7567, 7306, + 25018,343, 13478,25020,25021,25023,25024,25025,10519,10583,317, 317, 317, 25028,18846,10561,317, 25029,317, 6300, 317, 25032,25033,25034,25037,317, 343, + 317, 18387,17699,6179, 5238, 317, 9422, 25035,25036,5428, 5428, 1358, 5238, 332, 25039,514, 867, 332, 25041,11986,396, 343, 25042,25043,25045,25047,8722, + 1358, 2236, 1358, 574, 2163, 1345, 25044,1347, 343, 25046,343, 19478,343, 343, 363, 7399, 317, 317, 25048,317, 350, 25051,25053,25049,25050,2086, 6394, + 2134, 25052,2086, 25054,25055,25057,25058,25060,25063,7399, 25064,18077,490, 25059,317, 25061,317, 317, 25062,5570, 867, 332, 317, 574, 25065,25066,1588, + 25067,370, 9549, 7865, 25069,25070,317, 12849,7668, 25072,25073,25074,363, 317, 317, 5238, 25076,339, 25079,317, 4437, 1266, 317, 317, 317, 317, 317, + 317, 649, 317, 2078, 25077,2272, 7568, 10471,25078,356, 317, 5611, 25081,5441, 343, 393, 2142, 25083,25084,343, 25086,1347, 25082,5217, 317, 317, 365, + 490, 25085,317, 9852, 8082, 25088,25089,10619,317, 10619,317, 25090,1992, 25091,25093,25110,25115,25117,25136,25147,332, 11249,25150,370, 25152,25189,6994, 25192,25194,25197,25094,25097,317, 25098,25099,25100,25106,25108,16570,357, 2537, 25095,25096,1358, 317, 343, 2272, 2058, 25101,25102,421, 25103,317, 12494, 25104,25105,317, 2537, 345, 15510,317, 5096, 317, 317, 345, 317, 24731,317, 317, 317, 317, 25107,1033, 345, 332, 345, 25109,24949,490, 345, 25111, - 25112,25113,25114,3284, 317, 5836, 1135, 2317, 5836, 25116,371, 15108,371, 25118,25120,9609, 11339,25122,25123,317, 25127,10179,25131,350, 490, 25119,466, - 422, 25121,345, 332, 317, 25124,25125,356, 25126,317, 317, 5711, 2110, 25128,317, 1526, 25129,380, 25130,317, 351, 25132,25133,343, 25134,317, 317, + 25112,25113,25114,3284, 317, 5836, 1135, 2317, 5836, 25116,371, 15108,371, 25118,25120,9609, 11339,25122,25123,317, 25127,10179,25131,350, 490, 25119,466, + 422, 25121,345, 332, 317, 25124,25125,356, 25126,317, 317, 5711, 2110, 25128,317, 1526, 25129,380, 25130,317, 351, 25132,25133,343, 25134,317, 317, 343, 25135,317, 1347, 10314,25137,8281, 6780, 9822, 317, 25140,25144,25145,343, 350, 25146,332, 25138,317, 25139,2134, 25141,343, 317, 25142,25143,17271, 380, 5624, 25148,25149,4984, 25151,3999, 5055, 317, 25153,25154,356, 25161,25166,25167,362, 25169,7185, 25181,25185,25187,2110, 490, 25155,25156,5003, 25157, 25158,10578,317, 25159,317, 25160,317, 965, 5488, 5488, 9857, 317, 25162,25163,25164,25165,6171, 317, 370, 25168,13071,5167, 16596,317, 1149, 317, 25170, @@ -7698,17 +7693,17 @@ static const unsigned int ChildLocs[185261] = 25221,380, 363, 1588, 343, 343, 9567, 370, 1358, 25223,25224,356, 25226,350, 343, 25228,25230,8224, 382, 317, 25229,25232,25233,25234,24600,25235,25236, 317, 10236,317, 332, 25238,490, 25242,13928,1347, 317, 317, 2381, 25237,25239,937, 317, 332, 7183, 490, 15090,14964,1358, 404, 317, 651, 25240,25241, 3079, 365, 25245,363, 25246,371, 10894,25248,25249,317, 6420, 370, 317, 5223, 381, 317, 1347, 317, 25250,25251,6996, 317, 317, 363, 404, 373, 12849, - 5628, 490, 25253,13026,25258,317, 18588,25259,25261,25254,343, 25255,25256,25257,356, 10120,2510, 3853, 25260,25262,25265,2024, 25266,365, 17919,2171, 363, + 5628, 490, 25253,13026,25258,317, 18588,25259,25261,25254,343, 25255,25256,25257,356, 10120,2510, 3853, 25260,25262,25265,2024, 25266,365, 17919,2171, 363, 370, 317, 381, 7797, 5836, 5201, 25268,25269,25270,350, 362, 363, 25273,317, 12277,317, 317, 370, 5793, 6394, 357, 25271,5226, 25272,1526, 25275,25276, 2537, 25278,25279,351, 2063, 9450, 466, 1358, 12731,25283,350, 25285,25287,25288,1230, 317, 25290,25291,2537, 25286,2322, 25289,25292,490, 25293,25294,25296, - 25309,21794,25325,25329,350, 25333,25348,25355,2317, 25369,25370,343, 2291, 15221,25297,19695,25298,25305,25307,317, 13314,25299,25300,25301,466, 25302,317, - 12277,25303,25304,25306,1358, 25308,317, 25310,867, 25313,25318,25324,317, 9609, 25311,25312,317, 10664,317, 25314,25315,25316,466, 317, 317, 25317,6408, + 25309,21794,25325,25329,350, 25333,25348,25355,2317, 25369,25370,343, 2291, 15221,25297,19695,25298,25305,25307,317, 13314,25299,25300,25301,466, 25302,317, + 12277,25303,25304,25306,1358, 25308,317, 25310,867, 25313,25318,25324,317, 9609, 25311,25312,317, 10664,317, 25314,25315,25316,466, 317, 317, 25317,6408, 1347, 332, 25319,343, 25320,25321,25322,25323,22063,25326,25328,11279,332, 25327,867, 23267,25330,25331,25332,410, 1325, 410, 356, 466, 5399, 317, 25334, 10820,25337,25339,25343,25347,12761,9609, 25335,25336,317, 25338,25340,5365, 25341,25342,382, 5611, 1325, 25344,382, 25345,448, 356, 21470,25346,317, 25349, 466, 350, 317, 25350,25351,317, 25352,25353,25354,25356,25358,25365,25366,24810,25357,356, 397, 25359,25360,317, 25363,317, 317, 24479,13696,25361,25362, - 25364,4267, 356, 5847, 2510, 412, 514, 18588,2537, 2537, 25367,25368,2024, 1347, 2381, 317, 390, 382, 25371,25373,5225, 1325, 25372,317, 345, 5174, 1526, + 25364,4267, 356, 5847, 2510, 412, 514, 18588,2537, 2537, 25367,25368,2024, 1347, 2381, 317, 390, 382, 25371,25373,5225, 1325, 25372,317, 345, 5174, 1526, 25375,25376,23695,25378,25385,25387,25388,25390,25401,25403,25408,25410,25422,14263,25424,25429,25430,25445,25446,25451,25453,25454,25457,25459,317, 25461,25379, - 2290, 12796,25381,345, 25382,25383,317, 25380,317, 356, 466, 12785,3854, 370, 1526, 384, 332, 2134, 25384,6204, 25386,596, 24092,25389,2416, 25391,554, + 2290, 12796,25381,345, 25382,25383,317, 25380,317, 356, 466, 12785,3854, 370, 1526, 384, 332, 2134, 25384,6204, 25386,596, 24092,25389,2416, 25391,554, 6420, 25394,25397,25398,317, 1347, 25400,11346,25392,317, 25338,25393,25395,25396,351, 2533, 5897, 433, 2163, 25399,24731,25402,345, 317, 351, 4738, 25404, 25405,25406,25407,25409,363, 25411,25412,25413,13559,25414,363, 25416,25417,25418,23696,7214, 317, 350, 5991, 25415,317, 21494,25419,5447, 466, 317, 25420, 25421,9852, 2156, 25423,437, 25425,351, 345, 25428,370, 317, 317, 25426,5828, 25427,370, 5223, 25431,25435,25436,25437,363, 332, 350, 317, 345, 25440, @@ -7716,33 +7711,33 @@ static const unsigned int ChildLocs[185261] = 25449,490, 1588, 357, 25414,357, 25450,3111, 390, 25452,427, 10625,25455,349, 332, 25456,349, 25458,2369, 25460,317, 11147,25462,25476,25477,25499,25502, 25513,25515,25519,25526,25538,25543,25546,25549,25555,25557,25564,25578,25579,25590,25593,25614,25615,22613,317, 317, 25463,25465,25466,25469,15480,25471,21898, 343, 25464,21060,317, 2322, 2084, 5828, 332, 317, 25467,25468,1347, 317, 2809, 332, 317, 25470,25472,25474,25473,25475,3648, 7064, 25478,25479,25488,25492, - 25495,5737, 595, 25480,25481,25483,4267, 25482,466, 317, 25484,317, 25485,25486,25487,25489,25491,5570, 350, 10580,595, 2272, 25490,2134, 14982,1347, 2156, + 25495,5737, 595, 25480,25481,25483,4267, 25482,466, 317, 25484,317, 25485,25486,25487,25489,25491,5570, 350, 10580,595, 2272, 25490,2134, 14982,1347, 2156, 465, 25493,25494,25496,5717, 25497,25498,5262, 2510, 25500,1044, 25501,25503,25504,2334, 25506,25509,25505,317, 25507,25508,381, 332, 596, 25510,25512,10422, - 25511,317, 5650, 382, 5055, 25514,3355, 12769,25516,2374, 25517,25518,25520,351, 12398,350, 25523,350, 25524,25525,596, 25521,363, 4984, 1078, 25522,351, + 25511,317, 5650, 382, 5055, 25514,3355, 12769,25516,2374, 25517,25518,25520,351, 12398,350, 25523,350, 25524,25525,596, 25521,363, 4984, 1078, 25522,351, 2146, 317, 1992, 13962,2322, 13695,25527,25528,25530,25532,25533,25535,25536,317, 25529,317, 21540,10422,466, 317, 1915, 317, 25531,345, 11669,25534,24644, - 466, 4591, 5457, 317, 596, 357, 25537,25539,25540,25541,12494,25542,5055, 25544,317, 867, 317, 25545,25547,351, 990, 7045, 574, 25548,25550,25553,545, + 466, 4591, 5457, 317, 596, 357, 25537,25539,25540,25541,12494,25542,5055, 25544,317, 867, 317, 25545,25547,351, 990, 7045, 574, 25548,25550,25553,545, 25554,25551,2163, 25552,317, 25556,25558,2845, 5241, 25560,25562,25563,25559,350, 332, 370, 25561,5225, 317, 15504,317, 25565,25569,25573,25574,596, 25566, 25567,25568,7651, 25570,25571,9595, 25572,5324, 404, 24938,5611, 5717, 343, 20960,25575,15074,25577,25576,317, 18515,574, 8804, 25580,25584,25587,25581,25582, - 25583,25585,25586,317, 10333,25588,25589,25591,25592,343, 317, 8000, 317, 317, 1453, 373, 4268, 25594,25599,25604,25607,25595,2537, 25596,25597,25598,343, - 10674,25600,25602,25601,25603,342, 343, 25605,25606,7629, 23232,1078, 317, 16339,343, 25608,25610,25609,9124, 466, 317, 25611,25612,9130, 25613,317, 317, - 20629,349, 25616,25617,25619,10480,25625,25642,25652,501, 25653,25655,25656,25663,25672,25678,25680,25681,25620,5108, 25622,25624,317, 25621,5273, 25623,9109, + 25583,25585,25586,317, 10333,25588,25589,25591,25592,343, 317, 8000, 317, 317, 1453, 373, 4268, 25594,25599,25604,25607,25595,2537, 25596,25597,25598,343, + 10674,25600,25602,25601,25603,342, 343, 25605,25606,7629, 23232,1078, 317, 16339,343, 25608,25610,25609,9124, 466, 317, 25611,25612,9130, 25613,317, 317, + 20629,349, 25616,25617,25619,10480,25625,25642,25652,501, 25653,25655,25656,25663,25672,25678,25680,25681,25620,5108, 25622,25624,317, 25621,5273, 25623,9109, 466, 3854, 373, 1588, 25626,515, 25629,25630,25640,25627,410, 356, 25628,2510, 317, 382, 5055, 5634, 511, 5399, 25631,2271, 25633,25639,317, 382, 25632, 5663, 25634,25635,25636,5394, 25638,4268, 25637,317, 5262, 382, 7682, 5189, 466, 317, 25641,410, 356, 317, 24437,25643,25644,25647,25650,25645,25646,25648, 25649,25651,10770,22617,25654,18329,317, 351, 578, 25657,25659,25660,2510, 25661,317, 25658,25662,25664,25667,25671,25665,6607, 25666,10592,25668,4591, 25669, - 25670,21303,2537, 25673,4738, 25674,25675,25676,490, 317, 317, 7114, 466, 3529, 5663, 14645,25677,11339,1526, 25679,11308,2298, 25683,25684,25686,2193, 6600, + 25670,21303,2537, 25673,4738, 25674,25675,25676,490, 317, 317, 7114, 466, 3529, 5663, 14645,25677,11339,1526, 25679,11308,2298, 25683,25684,25686,2193, 6600, 15334,317, 25687,25689,317, 25685,5105, 16886,25688,15867,25690,25697,317, 25691,741, 25692,25693,9070, 25694,25695,25696,25698,25699,25700,25701,362, 13427, - 317, 317, 25703,348, 25715,362, 25728,25748,25749,25759,317, 365, 25704,25705,25706,25708,25713,2236, 6449, 317, 1358, 18587,17198,1345, 3284, 1358, 317, - 25707,348, 2035, 317, 350, 25709,25710,25711,1325, 25712,351, 5514, 363, 25714,5223, 317, 11144,490, 25716,25722,25725,11986,14478,514, 25717,25718,9124, - 466, 25719,3852, 317, 25720,25721,25723,25724,5661, 3075, 317, 350, 2322, 317, 608, 490, 25726,25727,11086,317, 317, 7990, 316, 25729,25730,351, 490, + 317, 317, 25703,348, 25715,362, 25728,25748,25749,25759,317, 365, 25704,25705,25706,25708,25713,2236, 6449, 317, 1358, 18587,17198,1345, 3284, 1358, 317, + 25707,348, 2035, 317, 350, 25709,25710,25711,1325, 25712,351, 5514, 363, 25714,5223, 317, 11144,490, 25716,25722,25725,11986,14478,514, 25717,25718,9124, + 466, 25719,3852, 317, 25720,25721,25723,25724,5661, 3075, 317, 350, 2322, 317, 608, 490, 25726,25727,11086,317, 317, 7990, 316, 25729,25730,351, 490, 25731,25743,4591, 13077,25747,5611, 596, 5932, 5502, 6228, 25732,25733,25734,356, 25735,25737,25738,5942, 382, 2371, 25736,317, 1100, 2509, 25739,317, 25740, - 25741,25742,317, 25744,1345, 2022, 317, 317, 25745,25746,2001, 5439, 317, 345, 317, 357, 363, 1011, 25750,1913, 317, 356, 25751,25752,6911, 25754,8488, + 25741,25742,317, 25744,1345, 2022, 317, 317, 25745,25746,2001, 5439, 317, 345, 317, 357, 363, 1011, 25750,1913, 317, 356, 25751,25752,6911, 25754,8488, 25755,25758,317, 317, 317, 5225, 5492, 317, 317, 317, 25753,3075, 5154, 25756,25757,317, 5273, 5324, 5058, 596, 317, 25761,10641,25769,25770,25771,25772, - 25779,25782,2206, 25783,551, 373, 25762,317, 25763,317, 14536,2272, 25764,317, 25765,25766,25767,25768,2022, 2503, 8522, 317, 343, 1160, 11918,11918,371, + 25779,25782,2206, 25783,551, 373, 25762,317, 25763,317, 14536,2272, 25764,317, 25765,25766,25767,25768,2022, 2503, 8522, 317, 343, 1160, 11918,11918,371, 380, 2261, 25773,343, 25774,25778,381, 317, 343, 350, 25775,25776,25777,25780,2074, 25781,7734, 25785,25786,25788,351, 25787,6996, 397, 380, 393, 25790, 2610, 25793,317, 317, 25791,25792,25795,25796,379, 317, 466, 332, 25797,5241, 317, 363, 348, 21553,380, 2334, 7399, 363, 2288, 25799,345, 25804,25806, - 356, 25812,25822,25824,19277,25826,25800,608, 1430, 25801,25802,25803,351, 25805,25807,19064,25808,25810,25809,25811,25813,25817,25814,25816,25815,25818,608, + 356, 25812,25822,25824,19277,25826,25800,608, 1430, 25801,25802,25803,351, 25805,25807,19064,25808,25810,25809,25811,25813,25817,25814,25816,25815,25818,608, 25820,25819,317, 351, 25821,367, 25823,25825,25827,608, 607, 25828,25830,25831,3078, 25834,25832,25833,25836,1060, 25847,25848,25851,25857,25859,25861,11533, - 9702, 365, 11505,490, 25837,25838,25839,25840,362, 355, 317, 389, 25841,25844,355, 25842,365, 317, 25843,2381, 6388, 25845,17658,25846,6375, 2381, 2178, + 9702, 365, 11505,490, 25837,25838,25839,25840,362, 355, 317, 389, 25841,25844,355, 25842,365, 317, 25843,2381, 6388, 25845,17658,25846,6375, 2381, 2178, 14144,25849,25850,25852,25853,25854,25855,25856,565, 317, 25858,427, 9298, 365, 25860,355, 1109, 25862,25943,25971,26018,26035,26081,26113,26159,26161,26162, 26164,26167,26205,26258,26307,26333,26369,82, 26775,26794,26796,26834,26836,26839,26844,25863,25871,25878,25880,25881,317, 25890,25896,25914,317, 25920,25925, 25930,25935,18978,25939,14682,25864,25866,25868,25865,345, 5732, 317, 25867,12459,1267, 25732,317, 25869,25870,317, 9549, 317, 25872,25873,25874,25875,25876, @@ -7752,198 +7747,198 @@ static const unsigned int ChildLocs[185261] = 2510, 25922,404, 393, 25923,25924,25926,25927,25928,317, 2036, 5087, 317, 25929,490, 2081, 25931,25934,25932,25933,7968, 25936,25937,7242, 401, 25938,25940, 25942,25941,25944,25951,1020, 25954,25962,25963,25965,25969,317, 5428, 25945,25950,317, 25946,25947,25948,25949,25952,25953,317, 6937, 25955,25958,25956,25957, 24467,1009, 25959,25961,317, 25960,25964,1345, 25966,25967,25968,428, 25970,19678,25972,25976,25977,25987,25989,26003,26006,26010,345, 25973,2537, 25974,25975, - 12752,5033, 6402, 5428, 317, 2142, 362, 3375, 14062,317, 7590, 23202,25978,25979,25982,25980,25981,25983,25984,25985,25986,5570, 5428, 25988,382, 17998,1300, + 12752,5033, 6402, 5428, 317, 2142, 362, 3375, 14062,317, 7590, 23202,25978,25979,25982,25980,25981,25983,25984,25985,25986,5570, 5428, 25988,382, 17998,1300, 633, 2551, 25990,516, 25994,25996,25998,25999,605, 26000,6002, 26002,317, 317, 25991,25993,4980, 317, 25992,317, 12604,362, 363, 362, 404, 317, 25995, - 355, 3529, 1347, 25997,2551, 404, 476, 384, 5663, 317, 363, 26001,384, 26004,26005,5428, 490, 26007,26008,332, 26009,26011,26015,427, 26012,5447, 5987, - 26013,26014,433, 9139, 26016,26017,14284,19237,26019,3869, 26020,26022,26023,26025,490, 12616,26026,26027,26032,26034,1230, 11881,2094, 332, 332, 26021,317, + 355, 3529, 1347, 25997,2551, 404, 476, 384, 5663, 317, 363, 26001,384, 26004,26005,5428, 490, 26007,26008,332, 26009,26011,26015,427, 26012,5447, 5987, + 26013,26014,433, 9139, 26016,26017,14284,19237,26019,3869, 26020,26022,26023,26025,490, 12616,26026,26027,26032,26034,1230, 11881,2094, 332, 332, 26021,317, 1345, 466, 317, 8099, 3869, 26024,351, 4984, 317, 26028,26030,26029,23696,26031,490, 26033,26036,26038,26039,26045,26054,26055,26056,26057,26059,26060,26062, 26066,26068,26071,26079,4982, 317, 26037,2107, 9357, 412, 6206, 26040,26043,26041,26042,317, 317, 26044,26046,26050,26047,26048,26049,9659, 608, 26051,26052, - 26053,380, 26005,6227, 6555, 7694, 317, 317, 11488,5662, 2323, 26058,332, 362, 317, 16553,1108, 6546, 317, 5159, 26061,26063,5793, 26064,26065,2719, 1588, - 4738, 26067,2206, 437, 9450, 466, 317, 26069,26070,13653,448, 3422, 26072,7931, 466, 9064, 565, 26074,24637,26075,26077,26078,317, 362, 26073,13956,2108, + 26053,380, 26005,6227, 6555, 7694, 317, 317, 11488,5662, 2323, 26058,332, 362, 317, 16553,1108, 6546, 317, 5159, 26061,26063,5793, 26064,26065,2719, 1588, + 4738, 26067,2206, 437, 9450, 466, 317, 26069,26070,13653,448, 3422, 26072,7931, 466, 9064, 565, 26074,24637,26075,26077,26078,317, 362, 26073,13956,2108, 343, 317, 26076,13881,350, 362, 26080,26082,26083,26084,26106,24802,25413,26109,20149,3375, 343, 2541, 317, 26085,26099,2022, 26102,26104,317, 26086,26088, 26093,317, 26087,380, 9659, 26089,26090,26091,26092,26094,466, 317, 317, 26095,2156, 26096,26097,370, 26098,373, 5477, 23268,26100,317, 373, 26101,26103, - 26105,8136, 5987, 26107,15100,17388,26108,26110,25413,26111,26112,20149,20149,317, 26114,370, 26115,26116,26120,26124,26125,350, 5662, 26151,26154,14295,3646, - 24765,6833, 13559,382, 382, 19009,24778,24779,26117,1588, 26118,356, 26119,317, 373, 382, 363, 343, 26121,26122,6917, 448, 317, 26123,1345, 26126,2134, - 26132,2537, 404, 26136,26138,26139,26142,26148,5573, 26127,26128,317, 6517, 3726, 26129,26130,26131,26133,26134,26135,490, 26137,12846,12846,26140,26141,3726, + 26105,8136, 5987, 26107,15100,17388,26108,26110,25413,26111,26112,20149,20149,317, 26114,370, 26115,26116,26120,26124,26125,350, 5662, 26151,26154,14295,3646, + 24765,6833, 13559,382, 382, 19009,24778,24779,26117,1588, 26118,356, 26119,317, 373, 382, 363, 343, 26121,26122,6917, 448, 317, 26123,1345, 26126,2134, + 26132,2537, 404, 26136,26138,26139,26142,26148,5573, 26127,26128,317, 6517, 3726, 26129,26130,26131,26133,26134,26135,490, 26137,12846,12846,26140,26141,3726, 3726, 26143,316, 26147,9818, 317, 26144,317, 317, 345, 370, 26145,26146,7888, 10674,2537, 26149,26150,4984, 4944, 26152,10414,26153,8544, 596, 1155, 26155, 26156,2261, 15951,5241, 24802,26157,26158,26160,12849,11339,26163,363, 11339,26165,2188, 26166,362, 345, 317, 317, 317, 26168,26172,26174,26176,26177,26181, - 26182,345, 26185,26197,7638, 26198,26201,26202,26203,5809, 6937, 317, 26169,490, 26171,12001,26170,5225, 1325, 404, 26173,371, 21303,26175,439, 351, 1345, - 2272, 6420, 317, 1060, 6937, 26178,490, 26179,317, 26180,317, 551, 351, 26183,371, 21046,2142, 362, 317, 2537, 26184,26186,26189,26191,9420, 22370,317, - 26196,317, 6673, 26187,362, 356, 17039,589, 26188,1230, 26190,317, 17039,317, 551, 317, 26192,26194,363, 317, 26193,351, 26195,7866, 554, 1526, 5810, + 26182,345, 26185,26197,7638, 26198,26201,26202,26203,5809, 6937, 317, 26169,490, 26171,12001,26170,5225, 1325, 404, 26173,371, 21303,26175,439, 351, 1345, + 2272, 6420, 317, 1060, 6937, 26178,490, 26179,317, 26180,317, 551, 351, 26183,371, 21046,2142, 362, 317, 2537, 26184,26186,26189,26191,9420, 22370,317, + 26196,317, 6673, 26187,362, 356, 17039,589, 26188,1230, 26190,317, 17039,317, 551, 317, 26192,26194,363, 317, 26193,351, 26195,7866, 554, 1526, 5810, 363, 317, 1588, 363, 26199,317, 26200,7399, 332, 541, 2063, 26204,2142, 6435, 2537, 26206,26220,26222,26232,490, 26240,26241,26243,26253,26254,26255,26256, 26207,26210,3223, 740, 26212,26213,18077,332, 13477,26214,1444, 26215,26217,26218,867, 6753, 7155, 317, 26208,26209,682, 26211,4857, 681, 332, 317, 26216, 9422, 15445,5328, 317, 332, 317, 317, 2537, 1065, 371, 3725, 26219,26221,3236, 5951, 11339,26223,317, 26228,317, 26230,748, 26224,26225,26226,26227,21661, - 2571, 317, 1347, 26229,317, 317, 7931, 26231,26233,5951, 26234,26236,332, 6402, 317, 26235,332, 317, 21986,390, 7857, 351, 26237,317, 26238,26239,317, + 2571, 317, 1347, 26229,317, 317, 7931, 26231,26233,5951, 26234,26236,332, 6402, 317, 26235,332, 317, 21986,390, 7857, 351, 26237,317, 26238,26239,317, 19414,317, 343, 10344,317, 384, 5991, 26242,317, 317, 371, 382, 381, 1481, 26244,2279, 26245,7185, 26246,26248,26251,883, 740, 317, 317, 26247,26249, - 26250,26252,12849,380, 9832, 404, 6195, 427, 8841, 2537, 26257,26259,26262,26263,26265,26266,26272,26273,26275,26279,26281,26287,26296,10792,26299,26304,317, - 11408,26260,5223, 6651, 26261,317, 6195, 317, 5439, 339, 317, 26264,427, 317, 363, 5159, 6379, 4925, 2272, 2631, 5623, 26267,24775,5201, 26269,26270,5662, - 26271,4980, 345, 543, 317, 317, 317, 26268,317, 1347, 2310, 317, 2364, 12142,8937, 26274,317, 2322, 345, 25086,2222, 332, 317, 26276,26277,26278,317, + 26250,26252,12849,380, 9832, 404, 6195, 427, 8841, 2537, 26257,26259,26262,26263,26265,26266,26272,26273,26275,26279,26281,26287,26296,10792,26299,26304,317, + 11408,26260,5223, 6651, 26261,317, 6195, 317, 5439, 339, 317, 26264,427, 317, 363, 5159, 6379, 4925, 2272, 2631, 5623, 26267,24775,5201, 26269,26270,5662, + 26271,4980, 345, 543, 317, 317, 317, 26268,317, 1347, 2310, 317, 2364, 12142,8937, 26274,317, 2322, 345, 25086,2222, 332, 317, 26276,26277,26278,317, 345, 1160, 26280,26282,466, 26285,363, 26283,26284,317, 4789, 14062,26286,320, 26288,1913, 2077, 26289,490, 5079, 26295,5439, 26290,26291,26292,26293,26294, 6195, 26297,26298,26300,23696,7399, 365, 26301,26302,26303,26305,26306,26308,26311,26313,26314,317, 18930,26315,26321,26324,26326,574, 396, 26331,9341, 26309, 26310,1347, 26312,539, 4591, 7360, 317, 11064,26316,26317,5793, 26319,26318,332, 7184, 26320,10633,345, 345, 26322,26323,26178,26325,26327,5237, 26329,26330, 26328,26332,24826,26334,8514, 26339,26342,26350,26355,26357,2844, 26360,26361,2845, 26335,6937, 26337,26336,26338,25306,14184,26340,26341,9993, 10877,26343,26344, 6240, 2322, 11279,867, 26345,26346,26347,26348,317, 26349,26351,10716,356, 26352,26353,317, 370, 317, 26354,26356,2537, 351, 1347, 2322, 26358,466, 26359, - 317, 317, 317, 9170, 381, 2036, 2391, 26362,2108, 26363,317, 26364,26365,26366,26367,26368,26370,5962, 501, 26371,343, 26385,26386,26389,554, 26391,317, - 26392,26397,26372,2145, 7399, 13650,5226, 26373,356, 26374,26375,370, 2571, 26378,317, 317, 317, 382, 26376,2156, 26377,21700,317, 26379,26380,5689, 5784, + 317, 317, 317, 9170, 381, 2036, 2391, 26362,2108, 26363,317, 26364,26365,26366,26367,26368,26370,5962, 501, 26371,343, 26385,26386,26389,554, 26391,317, + 26392,26397,26372,2145, 7399, 13650,5226, 26373,356, 26374,26375,370, 2571, 26378,317, 317, 317, 382, 26376,2156, 26377,21700,317, 26379,26380,5689, 5784, 9139, 317, 26381,26382,26383,26384,26387,25413,26388,18257,2551, 317, 351, 12719,26390,5428, 2142, 5793, 633, 26393,317, 26394,26395,8054, 553, 317, 26396, 23950,16401,4249, 362, 5325, 7399, 26398,26448,26454,26519,26520,26553,26559,26569,26587,26611,26617,26618,26624,26636,26639,26654,26697,26704,26719,26741,26773, 26399,26400,26407,26411,26415,26419,26423,26424,26434,26437,26446,2322, 17943,5717, 26401,26402,26403,26404,26405,26406,26408,26103,26409,26410,26412,26413,26414, - 410, 317, 466, 5399, 317, 26416,26418,26417,21060,317, 317, 26420,26421,26422,867, 317, 5439, 26425,26426,26428,26432,26427,26429,26430,26431,356, 8553, - 5399, 317, 26433,26435,1230, 26436,3853, 356, 466, 317, 26438,26445,26439,26443,26440,26441,26442,26444,2510, 21882,26447,26449,26451,6345, 26452,26450,2247, + 410, 317, 466, 5399, 317, 26416,26418,26417,21060,317, 317, 26420,26421,26422,867, 317, 5439, 26425,26426,26428,26432,26427,26429,26430,26431,356, 8553, + 5399, 317, 26433,26435,1230, 26436,3853, 356, 466, 317, 26438,26445,26439,26443,26440,26441,26442,26444,2510, 21882,26447,26449,26451,6345, 26452,26450,2247, 26453,26455,26457,13650,26460,26463,26469,362, 26474,26500,317, 26515,26518,26456,5272, 748, 26458,26459,356, 21157,3854, 26461,351, 4738, 350, 551, 26462, 26464,332, 26465,21413,26466,26467,26468,5447, 466, 26470,26472,26471,26473,5447, 466, 12277,317, 26475,9171, 26477,23927,26479,26489,317, 26491,26494,26497, 26476,317, 26478,26480,26482,26483,26481,26484,26485,26486,26487,26488,1325, 8792, 4591, 514, 5226, 26490,26492,26493,7988, 26495,26496,2156, 18092,26498,26499, - 10422,10147,317, 317, 26501,26510,26502,5323, 26503,26506,26504,26505,317, 26507,26508,5488, 26509,26511,26512,26513,26514,381, 8713, 21006,26516,26517,5464, + 10422,10147,317, 317, 26501,26510,26502,5323, 26503,26506,26504,26505,317, 26507,26508,5488, 26509,26511,26512,26513,26514,381, 8713, 21006,26516,26517,5464, 5113, 26521,26522,26528,26541,3648, 26546,390, 26523,26524,26527,26525,26526,26529,26532,26538,26530,26531,26533,26534,26535,26536,26537,26539,26540,26542,26543, 26544,26545,26547,26548,26549,26550,26551,26552,26554,26555,26533,26556,26557,26558,5319, 466, 26560,26566,26561,26564,26562,26563,26565,21483,26567,26568,26570, 26572,26578,11236,350, 26579,26584,26571,317, 26573,317, 317, 317, 26577,26574,26575,26576,363, 10561,26580,26581,317, 26582,26583,26585,2381, 26586,26588, - 7035, 26594,26589,26593,26590,26591,26592,26595,26601,26604,26607,26596,26599,26597,26598,4267, 404, 26600,26602,26603,26605,26606,26608,25632,26609,26610,1526, + 7035, 26594,26589,26593,26590,26591,26592,26595,26601,26604,26607,26596,26599,26597,26598,4267, 404, 26600,26602,26603,26605,26606,26608,25632,26609,26610,1526, 26612,26613,26614,26615,26616,2610, 7389, 317, 317, 317, 26619,26620,5051, 26621,26622,26623,26625,26628,26632,26635,20015,317, 26626,2601, 5487, 317, 26627, 26629,26630,26631,26633,26634,4564, 5464, 5395, 343, 26484,26637,26638,317, 4952, 26518,26640,317, 26643,3987, 23411,26641,26642,5363, 332, 26644,26647,26650, - 317, 26645,26646,356, 370, 317, 26648,26649,26651,26652,26653,26655,26664,26671,26674,26681,26686,26696,26656,26659,26661,26657,5200, 343, 26658,343, 1325, - 8553, 26660,26662,26663,26665,26666,26669,26667,490, 26668,5394, 466, 5201, 5226, 26670,380, 5447, 9130, 26672,26673,26675,26678,26676,26677,356, 466, 3075, - 317, 26679,26680,356, 1588, 3941, 26682,26683,5447, 20858,26684,26685,26687,26688,26695,26689,26690,26691,26692,26693,26694,5637, 466, 26698,26699,1347, 539, - 26700,26701,26702,26703,2184, 6425, 356, 13899,26705,26716,26706,26708,26711,26707,5022, 26709,26710,26712,26713,26714,26715,26717,26718,356, 5847, 351, 317, + 317, 26645,26646,356, 370, 317, 26648,26649,26651,26652,26653,26655,26664,26671,26674,26681,26686,26696,26656,26659,26661,26657,5200, 343, 26658,343, 1325, + 8553, 26660,26662,26663,26665,26666,26669,26667,490, 26668,5394, 466, 5201, 5226, 26670,380, 5447, 9130, 26672,26673,26675,26678,26676,26677,356, 466, 3075, + 317, 26679,26680,356, 1588, 3941, 26682,26683,5447, 20858,26684,26685,26687,26688,26695,26689,26690,26691,26692,26693,26694,5637, 466, 26698,26699,1347, 539, + 26700,26701,26702,26703,2184, 6425, 356, 13899,26705,26716,26706,26708,26711,26707,5022, 26709,26710,26712,26713,26714,26715,26717,26718,356, 5847, 351, 317, 26720,26727,26732,26734,5653, 404, 26740,26721,26723,26722,26724,26725,26726,17228,1526, 26728,317, 26729,26730,26731,5167, 12631,6425, 2541, 5399, 26733,10561, - 21948,26735,26739,9749, 26736,26737,26738,5447, 5221, 24698,5717, 26742,26747,26748,350, 26758,26759,317, 26770,317, 26743,5324, 26744,26745,5717, 5324, 332, + 21948,26735,26739,9749, 26736,26737,26738,5447, 5221, 24698,5717, 26742,26747,26748,350, 26758,26759,317, 26770,317, 26743,5324, 26744,26745,5717, 5324, 332, 26746,7657, 317, 465, 5337, 26749,26752,26750,317, 24698,26751,466, 26753,26755,26754,21441,370, 26756,26757,26760,26761,26763,26767,22063,530, 26762,26764, 4268, 332, 26765,26766,448, 5447, 22295,2510, 26768,26769,26771,26772,5708, 1325, 466, 317, 26774,5459, 5492, 317, 26776,26778,5611, 26782,26783,26785,26786, - 26792,26793,26777,5464, 9624, 466, 3884, 26779,26780,26781,7231, 1588, 2381, 26784,343, 17782,25658,317, 26787,26789,317, 26790,4984, 24637,345, 317, 6343, + 26792,26793,26777,5464, 9624, 466, 3884, 26779,26780,26781,7231, 1588, 2381, 26784,343, 17782,25658,317, 26787,26789,317, 26790,4984, 24637,345, 317, 6343, 26788,26791,351, 7386, 11339,365, 2537, 26795,6163, 433, 26797,26800,26817,2537, 26829,26833,370, 1160, 490, 317, 26798,317, 317, 26799,26801,26802,26803, - 26805,26814,14478,370, 317, 1588, 317, 26804,317, 2402, 26806,26808,26812,26807,466, 317, 7377, 317, 317, 26809,20969,26810,370, 26811,356, 26813,317, - 6516, 382, 26815,356, 26816,3854, 382, 5761, 26818,26820,26823,26825,5611, 5241, 26819,466, 317, 6355, 1347, 317, 10114,26286,26821,317, 8792, 26822,2033, - 317, 317, 317, 370, 317, 317, 317, 26824,332, 26826,404, 2510, 5457, 317, 26827,343, 26828,26830,26831,26832,26835,370, 26837,20684,404, 26838,363, + 26805,26814,14478,370, 317, 1588, 317, 26804,317, 2402, 26806,26808,26812,26807,466, 317, 7377, 317, 317, 26809,20969,26810,370, 26811,356, 26813,317, + 6516, 382, 26815,356, 26816,3854, 382, 5761, 26818,26820,26823,26825,5611, 5241, 26819,466, 317, 6355, 1347, 317, 10114,26286,26821,317, 8792, 26822,2033, + 317, 317, 317, 370, 317, 317, 317, 26824,332, 26826,404, 2510, 5457, 317, 26827,343, 26828,26830,26831,26832,26835,370, 26837,20684,404, 26838,363, 317, 317, 2077, 4952, 26840,16811,490, 26841,26842,26843,26845,351, 363, 26846,343, 6504, 343, 26847,26380,26849,3802, 26851,26852,7869, 26855,26861,26863, 26868,26873,26878,317, 26880,26881,26850,2809, 607, 6222, 2134, 5866, 2073, 26853,317, 26854,26856,26859,25805,26857,26858,26860,6778, 26862,26864,20578,26865, 26866,26867,2708, 26869,24346,26871,26870,1383, 18810,26872,26874,26875,20441,380, 26876,26877,26879,5655, 26882,26883,339, 8304, 26885,26897,2301, 26886,26889, - 26887,26888,26890,18809,26891,317, 26894,26892,26893,26895,26896,26898,26899,26901,26902,26903,13498,2210, 11265,883, 2355, 26904,370, 26906,26910,26911,490, - 26914,26916,26917,2037, 332, 345, 317, 12752,26907,26908,26909,317, 4960, 26912,439, 26913,26915,26918,26923,26919,26920,26921,26922,26924,26925,317, 7118, + 26887,26888,26890,18809,26891,317, 26894,26892,26893,26895,26896,26898,26899,26901,26902,26903,13498,2210, 11265,883, 2355, 26904,370, 26906,26910,26911,490, + 26914,26916,26917,2037, 332, 345, 317, 12752,26907,26908,26909,317, 4960, 26912,439, 26913,26915,26918,26923,26919,26920,26921,26922,26924,26925,317, 7118, 317, 317, 317, 317, 26927,26936,26941,26943,1060, 26928,15480,26929,26930,26931,26932,26933,26934,26935,26937,26938,350, 349, 26939,26940,26942,24333,11344, - 26944,26945,26966,26989,27004,27014,27015,27047,27055,27059,27062,27067,27107,27159,27221,27245,27256,27258,27316,27327,27335,27363,27372,27408,27417,27421,8083, - 1078, 1358, 317, 26946,26949,26951,26954,22724,5213, 26955,26956,404, 18244,26947,26277,7174, 317, 363, 26948,16052,9012, 317, 380, 26950,4925, 317, 5419, - 9012, 317, 345, 26952,1358, 26953,5055, 8296, 26957,9981, 26958,26960,26962,26963,26964,5295, 1108, 1108, 390, 26959,363, 3284, 2317, 26961,16535,3284, 490, - 1108, 2148, 26965,13638,317, 949, 26967,26968,26969,26971,26972,3726, 317, 26975,26982,381, 365, 26970,490, 10629,1481, 397, 380, 26973,554, 16318,7411, + 26944,26945,26966,26989,27004,27014,27015,27047,27055,27059,27062,27067,27107,27159,27221,27245,27256,27258,27316,27327,27335,27363,27372,27408,27417,27421,8083, + 1078, 1358, 317, 26946,26949,26951,26954,22724,5213, 26955,26956,404, 18244,26947,26277,7174, 317, 363, 26948,16052,9012, 317, 380, 26950,4925, 317, 5419, + 9012, 317, 345, 26952,1358, 26953,5055, 8296, 26957,9981, 26958,26960,26962,26963,26964,5295, 1108, 1108, 390, 26959,363, 3284, 2317, 26961,16535,3284, 490, + 1108, 2148, 26965,13638,317, 949, 26967,26968,26969,26971,26972,3726, 317, 26975,26982,381, 365, 26970,490, 10629,1481, 397, 380, 26973,554, 16318,7411, 1230, 26974,350, 1700, 15457,11263,317, 13427,24239,5223, 2261, 5088, 422, 26976,26979,26977,317, 26978,356, 466, 317, 605, 317, 390, 26980,26981,11446, - 26983,26984,26985,26986,26987,356, 466, 317, 26988,5226, 12044,317, 1168, 26990,26991,26996,27000,27001,27002,7394, 3987, 317, 5537, 9914, 317, 26992,350, - 26993,26994,5058, 26995,26997,5987, 404, 317, 317, 543, 317, 317, 26998,317, 26999,317, 427, 1160, 390, 4965, 11089,8638, 490, 317, 27003,990, 380, - 27005,27007,13324,3884, 27008,14444,27009,27010,27013,11147,27006,350, 350, 2184, 27011,16187,466, 6831, 343, 350, 2222, 9876, 27012,419, 381, 26026,6228, + 26983,26984,26985,26986,26987,356, 466, 317, 26988,5226, 12044,317, 1168, 26990,26991,26996,27000,27001,27002,7394, 3987, 317, 5537, 9914, 317, 26992,350, + 26993,26994,5058, 26995,26997,5987, 404, 317, 317, 543, 317, 317, 26998,317, 26999,317, 427, 1160, 390, 4965, 11089,8638, 490, 317, 27003,990, 380, + 27005,27007,13324,3884, 27008,14444,27009,27010,27013,11147,27006,350, 350, 2184, 27011,16187,466, 6831, 343, 350, 2222, 9876, 27012,419, 381, 26026,6228, 317, 363, 27016,27020,7405, 4984, 27023,27026,27032,27034,27035,1020, 4984, 27040,490, 27045,5840, 6089, 23801,27017,574, 6732, 27018,2117, 27019,27021,27022, - 27024,27025,2063, 384, 22561,390, 27027,14611,27028,14119,27029,317, 317, 10820,6228, 2077, 27030,27031,355, 27033,382, 541, 27036,27039,317, 1160, 317, - 27037,27038,27041,373, 4962, 27042,27043,27044,317, 2036, 27046,4984, 27048,27050,6600, 27051,10758,27054,343, 27049,370, 397, 27052,317, 27053,466, 5662, + 27024,27025,2063, 384, 22561,390, 27027,14611,27028,14119,27029,317, 317, 10820,6228, 2077, 27030,27031,355, 27033,382, 541, 27036,27039,317, 1160, 317, + 27037,27038,27041,373, 4962, 27042,27043,27044,317, 2036, 27046,4984, 27048,27050,6600, 27051,10758,27054,343, 27049,370, 397, 27052,317, 27053,466, 5662, 317, 990, 380, 317, 21074,27056,12189,317, 27058,27057,317, 27060,317, 27061,11443,2227, 27063,7473, 27064,2146, 27065,27066,27068,27069,27071,27072,27074, 27080,27081,15667,27083,338, 27089,27097,27099,27100,27103,5300, 4980, 501, 27070,363, 605, 317, 1588, 317, 448, 351, 317, 27073,339, 27075,3751, 27076, 27079,6881, 1358, 433, 363, 27077,27078,9557, 4984, 345, 27082,27084,27088,317, 372, 17343,27085,27086,27087,4965, 2222, 11844,27090,27092,27093,7401, 27094, - 23439,317, 27096,2627, 317, 27091,317, 365, 317, 2260, 317, 514, 476, 317, 27095,404, 350, 2572, 317, 317, 5575, 27098,5055, 317, 1345, 317, 317, + 23439,317, 27096,2627, 317, 27091,317, 365, 317, 2260, 317, 514, 476, 317, 27095,404, 350, 2572, 317, 317, 5575, 27098,5055, 317, 1345, 317, 317, 27101,27102,1347, 345, 1943, 27104,27105,317, 27106,27108,27121,27124,27133,27136,27154,12732,27155,27156,343, 345, 6195, 27109,27110,27113,27120,317, 27111, - 27112,317, 317, 3284, 27114,317, 27115,317, 27116,27117,27118,27119,965, 317, 317, 3284, 12062,13638,27122,27123,11844,5836, 633, 332, 317, 350, 317, + 27112,317, 317, 3284, 27114,317, 27115,317, 27116,27117,27118,27119,965, 317, 317, 3284, 12062,13638,27122,27123,11844,5836, 633, 332, 317, 350, 317, 27125,317, 27128,2108, 539, 27126,605, 27127,1230, 27129,27130,27131,27132,397, 418, 5536, 27134,3529, 27135,428, 380, 27137,27138,27139,317, 27152,27140, - 27143,27144,27146,27150,27151,3284, 345, 317, 21048,27141,5447, 27142,2510, 2326, 3884, 317, 317, 5392, 1347, 27145,371, 27147,12994,6648, 5055, 27148,317, + 27143,27144,27146,27150,27151,3284, 345, 317, 21048,27141,5447, 27142,2510, 2326, 3884, 317, 317, 5392, 1347, 27145,371, 27147,12994,6648, 5055, 27148,317, 317, 5421, 317, 317, 317, 345, 27149,317, 345, 317, 5836, 27153,14991,363, 490, 345, 27157,23682,8301, 8275, 27158,317, 27160,949, 27162,5872, 27175, 27178,27179,27183,27186,27187,27188,27189,27194,27195,27197,27210,27213,27214,4268, 15074,490, 343, 27161,370, 2558, 15445,27163,27165,27166,5223, 27168,27171, - 362, 13856,1588, 27164,1345, 343, 317, 6036, 21067,343, 27167,404, 317, 8125, 317, 4980, 27169,6600, 27170,317, 345, 317, 19695,317, 390, 363, 382, - 5055, 27172,27173,27174,9609, 27176,27177,1108, 9265, 7428, 27180,2066, 381, 27181,317, 7214, 317, 27182,317, 317, 17400,370, 363, 5163, 363, 404, 7785, - 5793, 4984, 27184,27185,23353,9186, 5483, 343, 317, 317, 490, 380, 16825,404, 5538, 5561, 317, 9667, 362, 20178,317, 317, 317, 363, 362, 27190,3999, - 343, 351, 27191,27193,27192,363, 370, 363, 363, 10506,351, 27196,27198,27200,27203,27205,27208,27209,6228, 27199,317, 317, 14132,27201,27202,27204,317, - 27206,8526, 5792, 27207,404, 317, 363, 370, 363, 317, 371, 317, 5861, 12849,27211,27212,1347, 332, 1109, 11236,10626,21067,343, 343, 355, 8301, 363, + 362, 13856,1588, 27164,1345, 343, 317, 6036, 21067,343, 27167,404, 317, 8125, 317, 4980, 27169,6600, 27170,317, 345, 317, 19695,317, 390, 363, 382, + 5055, 27172,27173,27174,9609, 27176,27177,1108, 9265, 7428, 27180,2066, 381, 27181,317, 7214, 317, 27182,317, 317, 17400,370, 363, 5163, 363, 404, 7785, + 5793, 4984, 27184,27185,23353,9186, 5483, 343, 317, 317, 490, 380, 16825,404, 5538, 5561, 317, 9667, 362, 20178,317, 317, 317, 363, 362, 27190,3999, + 343, 351, 27191,27193,27192,363, 370, 363, 363, 10506,351, 27196,27198,27200,27203,27205,27208,27209,6228, 27199,317, 317, 14132,27201,27202,27204,317, + 27206,8526, 5792, 27207,404, 317, 363, 370, 363, 317, 371, 317, 5861, 12849,27211,27212,1347, 332, 1109, 11236,10626,21067,343, 343, 355, 8301, 363, 27215,27216,27217,27218,4984, 19283,27219,2413, 3609, 363, 3987, 27220,27222,27223,27227,27228,27229,27231,27232,27234,27236,2222, 27237,14501,7214, 23995,27224, - 343, 27225,317, 27226,466, 351, 345, 317, 363, 6713, 343, 363, 27230,363, 9557, 27233,317, 1992, 372, 320, 5991, 27235,3987, 27238,317, 27240,2022, - 27242,27243,27244,7405, 27239,27241,3361, 2086, 27246,27251,317, 27252,6917, 20255,27253,404, 27247,381, 332, 27248,27249,27250,317, 11089,362, 317, 6769, - 332, 382, 490, 27254,350, 27255,27257,27259,27261,27264,27265,27269,27270,27271,7672, 27274,27275,27277,27283,27288,27292,27296,27298,27310,27312,27315,317, - 17368,3645, 345, 317, 343, 9666, 27260,2537, 345, 27262,27263,317, 4591, 381, 9609, 317, 15399,10758,6593, 27266,4984, 20275,27267,317, 27268,317, 8979, - 490, 5616, 4925, 317, 6600, 471, 27272,4984, 1160, 27273,317, 490, 317, 317, 3366, 317, 8301, 516, 3999, 317, 317, 345, 317, 27276,501, 27278,2510, - 27281,392, 317, 350, 27279,27280,370, 4984, 317, 5661, 27282,404, 8544, 19324,27284,27285,6598, 10928,15058,27286,27287,345, 9695, 11147,2132, 317, 317, - 396, 490, 8178, 25086,27289,27290,4943, 317, 363, 15107,5838, 317, 27291,317, 5793, 1160, 381, 317, 27293,27294,27295,523, 428, 27297,6674, 363, 6002, - 380, 5538, 317, 317, 27299,27303,27304,27306,27307,27308,317, 427, 27300,27302,317, 27301,27305,317, 5154, 1358, 27309,317, 317, 390, 27311,5687, 4962, - 363, 317, 10533,317, 380, 343, 27313,27314,551, 11308,27317,8600, 27318,27319,15058,27320,25455,27322,27324,3987, 2156, 317, 17197,371, 317, 317, 317, - 27321,27323,14174,12017,362, 4591, 380, 351, 343, 27325,427, 13110,27326,317, 426, 9521, 27328,16651,539, 18084,27330,27331,317, 2298, 14161,27329,363, + 343, 27225,317, 27226,466, 351, 345, 317, 363, 6713, 343, 363, 27230,363, 9557, 27233,317, 1992, 372, 320, 5991, 27235,3987, 27238,317, 27240,2022, + 27242,27243,27244,7405, 27239,27241,3361, 2086, 27246,27251,317, 27252,6917, 20255,27253,404, 27247,381, 332, 27248,27249,27250,317, 11089,362, 317, 6769, + 332, 382, 490, 27254,350, 27255,27257,27259,27261,27264,27265,27269,27270,27271,7672, 27274,27275,27277,27283,27288,27292,27296,27298,27310,27312,27315,317, + 17368,3645, 345, 317, 343, 9666, 27260,2537, 345, 27262,27263,317, 4591, 381, 9609, 317, 15399,10758,6593, 27266,4984, 20275,27267,317, 27268,317, 8979, + 490, 5616, 4925, 317, 6600, 471, 27272,4984, 1160, 27273,317, 490, 317, 317, 3366, 317, 8301, 516, 3999, 317, 317, 345, 317, 27276,501, 27278,2510, + 27281,392, 317, 350, 27279,27280,370, 4984, 317, 5661, 27282,404, 8544, 19324,27284,27285,6598, 10928,15058,27286,27287,345, 9695, 11147,2132, 317, 317, + 396, 490, 8178, 25086,27289,27290,4943, 317, 363, 15107,5838, 317, 27291,317, 5793, 1160, 381, 317, 27293,27294,27295,523, 428, 27297,6674, 363, 6002, + 380, 5538, 317, 317, 27299,27303,27304,27306,27307,27308,317, 427, 27300,27302,317, 27301,27305,317, 5154, 1358, 27309,317, 317, 390, 27311,5687, 4962, + 363, 317, 10533,317, 380, 343, 27313,27314,551, 11308,27317,8600, 27318,27319,15058,27320,25455,27322,27324,3987, 2156, 317, 17197,371, 317, 317, 317, + 27321,27323,14174,12017,362, 4591, 380, 351, 343, 27325,427, 13110,27326,317, 426, 9521, 27328,16651,539, 18084,27330,27331,317, 2298, 14161,27329,363, 448, 25072,27332,19661,343, 317, 317, 317, 317, 27333,351, 27334,317, 27336,27337,27342,27345,381, 27346,27354,348, 27355,490, 382, 27356,27357,27358, 27360,317, 27362,15566,27338,6231, 317, 27341,27339,466, 317, 11055,27340,317, 6326, 317, 1347, 14385,27343,27344,317, 27347,2058, 27348,343, 27352,27349, 8301, 1549, 362, 9479, 27351,317, 27350,448, 343, 363, 370, 317, 27353,18257,317, 2211, 345, 404, 370, 1325, 362, 27359,317, 317, 1999, 2117, 14535, 27361,317, 351, 373, 2610, 363, 27364,27365,10172,343, 367, 7149, 12815,317, 27366,27370,317, 5005, 317, 27367,27368,27369,317, 27371,27373,27374,27375, - 27376,12774,8506, 14792,350, 27378,27381,5201, 27406,27407,20909,8035, 466, 343, 317, 317, 5105, 317, 9170, 317, 27377,27379,27380,3999, 356, 11825,317, + 27376,12774,8506, 14792,350, 27378,27381,5201, 27406,27407,20909,8035, 466, 343, 317, 317, 5105, 317, 9170, 317, 27377,27379,27380,3999, 356, 11825,317, 551, 6326, 27382,27383,27384,27387,19661,27388,27391,27395,27398,27402,27404,27405,317, 428, 6598, 25078,27385,27386,427, 428, 1444, 439, 2193, 27389,27390, - 317, 27392,27393,21786,27394,27396,27397,471, 350, 27399,27400,5573, 343, 5441, 27401,6081, 16901,2060, 11783,27403,19771,6354, 439, 20880,466, 363, 317, - 317, 10487,370, 343, 27409,27412,27414,317, 27410,27411,27413,27415,27416,6780, 12309,27418,343, 363, 6204, 27419,27420,12731,27422,15058,2163, 350, 317, - 1347, 1160, 3361, 14377,371, 317, 27424,27425,27488,27489,27537,27538,27568,7073, 27572,27607,27609,27610,565, 2416, 27645,27650,317, 27426,27427,350, 2219, - 27431,27434,27455,27457,27459,27462,27463,27469,27470,27472,27473,27474,27478,27481,14905,25415,27487,2369, 371, 11146,27428,27429,20897,317, 27430,317, 428, - 19617,27432,27433,466, 363, 7949, 317, 317, 1347, 345, 363, 27435,4965, 27436,365, 2108, 2271, 27437,27438,516, 27453,317, 27454,20496,3999, 332, 5022, + 317, 27392,27393,21786,27394,27396,27397,471, 350, 27399,27400,5573, 343, 5441, 27401,6081, 16901,2060, 11783,27403,19771,6354, 439, 20880,466, 363, 317, + 317, 10487,370, 343, 27409,27412,27414,317, 27410,27411,27413,27415,27416,6780, 12309,27418,343, 363, 6204, 27419,27420,12731,27422,15058,2163, 350, 317, + 1347, 1160, 3361, 14377,371, 317, 27424,27425,27488,27489,27537,27538,27568,7073, 27572,27607,27609,27610,565, 2416, 27645,27650,317, 27426,27427,350, 2219, + 27431,27434,27455,27457,27459,27462,27463,27469,27470,27472,27473,27474,27478,27481,14905,25415,27487,2369, 371, 11146,27428,27429,20897,317, 27430,317, 428, + 19617,27432,27433,466, 363, 7949, 317, 317, 1347, 345, 363, 27435,4965, 27436,365, 2108, 2271, 27437,27438,516, 27453,317, 27454,20496,3999, 332, 5022, 27439,27452,317, 489, 8178, 27440,27441,27442,27443,1292, 317, 27444,27445,649, 27446,990, 27447,5223, 27450,27451,5217, 6420, 317, 317, 889, 317, 27448, 27449,12943,14663,25078,490, 317, 1020, 5022, 2948, 27456,343, 27458,9067, 14337,466, 25067,317, 5037, 6532, 27460,565, 9521, 27461,317, 317, 2024, 11132, - 317, 10471,343, 27464,2074, 345, 501, 2271, 317, 27465,27466,13950,6172, 27467,27468,5225, 356, 1347, 5225, 5464, 1345, 317, 317, 10093,27471,1020, 332, - 11144,317, 6123, 317, 5655, 10295,381, 27475,27477,27476,317, 363, 10948,317, 6002, 27479,4952, 27480,27482,27484,27485,8948, 10877,317, 390, 27486,317, + 317, 10471,343, 27464,2074, 345, 501, 2271, 317, 27465,27466,13950,6172, 27467,27468,5225, 356, 1347, 5225, 5464, 1345, 317, 317, 10093,27471,1020, 332, + 11144,317, 6123, 317, 5655, 10295,381, 27475,27477,27476,317, 363, 10948,317, 6002, 27479,4952, 27480,27482,27484,27485,8948, 10877,317, 390, 27486,317, 27483,9914, 5962, 4943, 317, 5841, 317, 332, 3884, 317, 9289, 9866, 343, 27490,27506,27507,27508,27509,27511,27512,27513,1481, 490, 27519,490, 27520,27523, 27524,6461, 27529,27530,27531,27533,27534,27491,27494,370, 356, 10891,466, 17189,27492,317, 27493,317, 317, 317, 12151,27495,27496,27497,3999, 27499,27500, - 27501,27502,27503,317, 14589,2631, 27498,439, 476, 553, 317, 10520,554, 2060, 434, 27504,27505,23881,7949, 370, 317, 5441, 27510,317, 362, 501, 351, - 345, 8178, 317, 351, 350, 4954, 317, 27514,2134, 351, 511, 27517,27518,27515,27516,5626, 351, 317, 5093, 27521,363, 27522,363, 12696,466, 363, 1358, - 12154,16970,317, 5626, 8600, 27525,380, 350, 350, 27526,990, 27527,10877,350, 27528,317, 317, 317, 317, 1347, 317, 12459,27532,466, 362, 8828, 370, - 11831,317, 1345, 317, 381, 380, 2222, 27535,351, 27536,27539,27541,27545,27547,27549,2152, 27552,27556,27558,27560,27566,27540,27542,1358, 27543,350, 5626, + 27501,27502,27503,317, 14589,2631, 27498,439, 476, 553, 317, 10520,554, 2060, 434, 27504,27505,23881,7949, 370, 317, 5441, 27510,317, 362, 501, 351, + 345, 8178, 317, 351, 350, 4954, 317, 27514,2134, 351, 511, 27517,27518,27515,27516,5626, 351, 317, 5093, 27521,363, 27522,363, 12696,466, 363, 1358, + 12154,16970,317, 5626, 8600, 27525,380, 350, 350, 27526,990, 27527,10877,350, 27528,317, 317, 317, 317, 1347, 317, 12459,27532,466, 362, 8828, 370, + 11831,317, 1345, 317, 381, 380, 2222, 27535,351, 27536,27539,27541,27545,27547,27549,2152, 27552,27556,27558,27560,27566,27540,27542,1358, 27543,350, 5626, 27544,501, 317, 9624, 27546,10422,466, 317, 6089, 27548,1033, 1033, 3079, 317, 27550,10422,27551,384, 317, 5482, 382, 317, 363, 27553,6046, 3284, 27554, - 2510, 3999, 2022, 317, 27555,317, 373, 380, 356, 349, 2272, 371, 27557,317, 19783,11362,317, 27559,2134, 428, 428, 317, 345, 27561,3999, 27562,317, + 2510, 3999, 2022, 317, 27555,317, 373, 380, 356, 349, 2272, 371, 27557,317, 19783,11362,317, 27559,2134, 428, 428, 317, 345, 27561,3999, 27562,317, 317, 27563,27564,27565,7405, 317, 317, 2571, 317, 2060, 5653, 363, 27567,381, 343, 1160, 27569,27570,27571,27573,27575,371, 27576,27579,362, 27580,27582, 27583,27585,27588,27590,27591,10583,27593,381, 27597,27599,27600,27602,27604,27574,27577,27578,317, 15457,390, 2298, 490, 6048, 11626,317, 343, 1347, 27581, - 381, 27584,27586,27587,1588, 317, 27589,357, 16053,332, 7911, 317, 317, 317, 317, 317, 5273, 19840,3599, 11089,11347,2391, 8049, 9479, 27592,1345, 7035, + 381, 27584,27586,27587,1588, 317, 27589,357, 16053,332, 7911, 317, 317, 317, 317, 317, 5273, 19840,3599, 11089,11347,2391, 8049, 9479, 27592,1345, 7035, 5991, 9648, 2110, 384, 365, 27594,27596,1358, 27595,1230, 22561,27598,343, 12281,317, 6726, 363, 21057,27601,6504, 6532, 317, 27603,27605,317, 317, 15108, - 27606,27608,27611,27612,27615,20276,27616,27620,27622,27623,12281,27624,27639,13720,370, 27642,27643,2035, 12930,27644,317, 5687, 27613,351, 27614,362, 317, + 27606,27608,27611,27612,27615,20276,27616,27620,27622,27623,12281,27624,27639,13720,370, 27642,27643,2035, 12930,27644,317, 5687, 27613,351, 27614,362, 317, 567, 4984, 15334,27617,1358, 27619,356, 27618,317, 382, 381, 27621,7242, 381, 694, 27625,27628,27629,351, 27630,27632,19390,27634,27627,27638,7053, 27626, - 2631, 1588, 27631,27633,7651, 2298, 27635,466, 27636,27637,317, 381, 317, 16368,332, 27640,317, 551, 27641,317, 6441, 317, 2507, 5687, 317, 317, 345, - 2188, 362, 27646,27647,27648,7419, 418, 466, 27649,11236,2571, 11450,543, 317, 12226,317, 11089,7068, 27651,27653,27652,27654,27655,27657,27661,2035, 7942, + 2631, 1588, 27631,27633,7651, 2298, 27635,466, 27636,27637,317, 381, 317, 16368,332, 27640,317, 551, 27641,317, 6441, 317, 2507, 5687, 317, 317, 345, + 2188, 362, 27646,27647,27648,7419, 418, 466, 27649,11236,2571, 11450,543, 317, 12226,317, 11089,7068, 27651,27653,27652,27654,27655,27657,27661,2035, 7942, 2510, 2553, 27663,5653, 1032, 27658,27659,27660,27662,27664,748, 27666,27667,27668,27675,27679,10331,5653, 27680,27681,27669,27671,27674,27670,608, 27672,27673, 396, 608, 27676,27677,27678,27682,27684,19065,27683,27685,27686,27687,27693,27712,27742,27758,27770,27778,27784,27786,27789,27804,27816,27848,27914,27919,27940, - 27943,27986,28005,28017,28023,28025,350, 28026,27688,19665,5689, 317, 27689,27691,370, 27692,27690,8448, 370, 27694,27696,971, 27699,317, 27701,27703,490, - 27705,27707,27710,27711,7785, 317, 390, 317, 27695,317, 356, 317, 317, 27697,19661,317, 317, 317, 27698,590, 371, 317, 317, 27700,2146, 317, 370, + 27943,27986,28005,28017,28023,28025,350, 28026,27688,19665,5689, 317, 27689,27691,370, 27692,27690,8448, 370, 27694,27696,971, 27699,317, 27701,27703,490, + 27705,27707,27710,27711,7785, 317, 390, 317, 27695,317, 356, 317, 317, 27697,19661,317, 317, 317, 27698,590, 371, 317, 317, 27700,2146, 317, 370, 9012, 27702,3284, 5105, 380, 13003,4591, 317, 5295, 427, 4965, 27704,8522, 27706,356, 343, 4949, 5295, 317, 370, 27708,27709,317, 3361, 317, 371, 15480, 317, 363, 2680, 317, 10449,965, 27713,27716,15908,27717,27731,6294, 27738,27739,27740,317, 317, 7095, 27714,7916, 6486, 27715,317, 317, 1011, 633, 20728, - 357, 27718,27722,596, 13638,27727,27728,317, 22577,1060, 343, 2060, 27719,27720,27721,1020, 27723,27724,27725,6691, 27726,317, 2590, 317, 27729,27730,317, + 357, 27718,27722,596, 13638,27727,27728,317, 22577,1060, 343, 2060, 27719,27720,27721,1020, 27723,27724,27725,6691, 27726,317, 2590, 317, 27729,27730,317, 27732,27733,27734,16651,27735,362, 662, 27736,20508,27737,1160, 317, 317, 381, 317, 355, 479, 2369, 10877,605, 317, 2705, 5809, 356, 27741,317, 10520, 345, 27743,27745,27746,8096, 371, 27754,362, 2022, 317, 317, 23199,27756,371, 317, 27744,12696,466, 317, 27747,320, 633, 371, 317, 27748,362, 27749, 27753,317, 317, 5826, 862, 2374, 434, 27750,27751,27752,27755,404, 6420, 27757,371, 317, 317, 5836, 350, 371, 2117, 27759,22681,27761,27762,27764,27769, - 543, 317, 466, 27760,317, 317, 345, 343, 5392, 343, 5926, 511, 10538,27763,317, 317, 5224, 1060, 6046, 27765,466, 10855,27766,27767,27768,1194, 6415, - 27771,12332,27773,15443,350, 12775,27777,317, 345, 27772,2515, 381, 2590, 19303,27774,27775,343, 362, 2022, 551, 345, 27776,317, 317, 317, 9064, 381, - 317, 370, 21013,317, 21261,22577,27779,6195, 27780,365, 317, 27781,27782,24918,27783,1230, 1325, 1160, 317, 317, 317, 317, 12696,351, 5055, 10878,4268, + 543, 317, 466, 27760,317, 317, 345, 343, 5392, 343, 5926, 511, 10538,27763,317, 317, 5224, 1060, 6046, 27765,466, 10855,27766,27767,27768,1194, 6415, + 27771,12332,27773,15443,350, 12775,27777,317, 345, 27772,2515, 381, 2590, 19303,27774,27775,343, 362, 2022, 551, 345, 27776,317, 317, 317, 9064, 381, + 317, 370, 21013,317, 21261,22577,27779,6195, 27780,365, 317, 27781,27782,24918,27783,1230, 1325, 1160, 317, 317, 317, 317, 12696,351, 5055, 10878,4268, 370, 8772, 356, 27785,317, 317, 317, 363, 2060, 2134, 317, 381, 381, 12349,350, 2537, 317, 27787,27788,390, 6204, 27790,27792,27800,27802,27803,27791, 2163, 5655, 381, 317, 637, 9088, 27793,24667,27794,2402, 362, 27796,1347, 27798,10820,317, 27795,27797,27799,350, 27801,390, 345, 12590,27805,5896, 27806, - 27808,27810,27811,24949,27812,2387, 27814,27815,8178, 317, 317, 317, 21074,317, 1588, 317, 5223, 27807,317, 350, 2081, 27809,1060, 317, 2073, 317, 490, - 1992, 551, 27813,317, 2571, 427, 317, 317, 317, 317, 5223, 27817,27820,27827,27828,27830,27834,5793, 27837,27838,27842,27844,27818,10815,317, 1347, 1347, + 27808,27810,27811,24949,27812,2387, 27814,27815,8178, 317, 317, 317, 21074,317, 1588, 317, 5223, 27807,317, 350, 2081, 27809,1060, 317, 2073, 317, 490, + 1992, 551, 27813,317, 2571, 427, 317, 317, 317, 317, 5223, 27817,27820,27827,27828,27830,27834,5793, 27837,27838,27842,27844,27818,10815,317, 1347, 1347, 317, 27819,27821,3987, 24398,27823,27825,317, 19590,5862, 27822,27824,384, 27826,2171, 404, 365, 427, 370, 27829,14744,27831,27832,27833,343, 27835,27836, 17588,317, 27839,27841,14834,6420, 27840,381, 5255, 27843,2507, 1020, 19915,27845,370, 466, 27846,27847,370, 317, 363, 2509, 5343, 27849,27852,27856,27861, - 27866,27868,27871,27876,27877,27878,27887,27891,27892,27900,27901,16029,27902,27907,2997, 27908,27909,490, 27912,22466,27850,27851,1020, 25434,2368, 1230, 317, - 27853,9298, 11786,27854,27855,27857,637, 380, 27859,27860,27858,317, 637, 4980, 12731,558, 27862,27863,2402, 27864,741, 479, 1160, 7949, 27865,619, 1020, + 27866,27868,27871,27876,27877,27878,27887,27891,27892,27900,27901,16029,27902,27907,2997, 27908,27909,490, 27912,22466,27850,27851,1020, 25434,2368, 1230, 317, + 27853,9298, 11786,27854,27855,27857,637, 380, 27859,27860,27858,317, 637, 4980, 12731,558, 27862,27863,2402, 27864,741, 479, 1160, 7949, 27865,619, 1020, 362, 27867,317, 27869,551, 317, 27870,27872,27875,317, 27873,27874,317, 2571, 5055, 317, 427, 428, 2357, 317, 362, 362, 490, 363, 27879,27883,27885, 317, 317, 27880,27881,27882,2022, 965, 404, 27884,371, 27886,363, 5897, 317, 317, 27888,27889,27890,3742, 370, 363, 355, 1588, 1588, 27893,27895,27896, 27897,427, 317, 362, 2066, 317, 27894,1230, 2369, 5038, 1194, 362, 380, 362, 6717, 362, 27898,27899,345, 596, 363, 2368, 2590, 10392,2553, 2024, 27903, - 466, 27904,363, 27905,5809, 26298,5022, 27906,351, 363, 363, 2022, 363, 12448,317, 2348, 5038, 27910,27911,390, 2057, 397, 2074, 545, 27913,27915,332, + 466, 27904,363, 27905,5809, 26298,5022, 27906,351, 363, 363, 2022, 363, 12448,317, 2348, 5038, 27910,27911,390, 2057, 397, 2074, 545, 27913,27915,332, 27917,27918,317, 27916,27920,27922,363, 27924,27934,27937,27938,27930,949, 343, 317, 27921,370, 317, 317, 317, 27923,317, 11038,6021, 27925,27927,27931, 490, 27926,27928,317, 27929,1078, 345, 27930,27932,317, 5501, 27933,27935,16257,27936,27939,22699,16582,27941,2271, 27942,2272, 574, 27944,27950,390, 27952, 27953,12454,27956,15837,27958,27960,27961,362, 27963,27966,27969,27970,27976,27979,27982,550, 27983,5457, 27945,317, 317, 590, 27946,3710, 27947,317, 27948, - 27949,428, 350, 317, 317, 13920,12799,15438,17683,1358, 1331, 5054, 12696,363, 27951,4984, 363, 427, 317, 317, 27954,317, 332, 317, 27955,10820,317, - 27957,363, 363, 7785, 317, 1109, 1992, 317, 27959,339, 11921,6578, 6599, 5055, 27962,370, 466, 390, 356, 363, 27964,2024, 27965,317, 1992, 371, 419, + 27949,428, 350, 317, 317, 13920,12799,15438,17683,1358, 1331, 5054, 12696,363, 27951,4984, 363, 427, 317, 317, 27954,317, 332, 317, 27955,10820,317, + 27957,363, 363, 7785, 317, 1109, 1992, 317, 27959,339, 11921,6578, 6599, 5055, 27962,370, 466, 390, 356, 363, 27964,2024, 27965,317, 1992, 371, 419, 317, 7403, 362, 27967,27968,390, 25583,27971,27973,27974,317, 27972,380, 8325, 317, 10820,27975,390, 27977,317, 27978,27980,27981,5793, 27984,27985,27987, - 390, 27988,27991,27994,27995,317, 27996,27999,363, 28004,14144,317, 317, 8099, 317, 317, 27989,381, 27990,10429,448, 27992,1020, 317, 27993,370, 363, + 390, 27988,27991,27994,27995,317, 27996,27999,363, 28004,14144,317, 317, 8099, 317, 317, 27989,381, 27990,10429,448, 27992,1020, 317, 27993,370, 363, 317, 317, 27997,27998,566, 3505, 9319, 12934,1020, 10422,28000,362, 12993,28002,28001,28003,2077, 28006,28009,2058, 28010,28011,28012,28014,28016,317, 28007, 317, 28008,343, 10149,541, 317, 345, 10891,1358, 317, 8273, 317, 317, 28013,5926, 28015,363, 317, 351, 4738, 363, 370, 11307,28018,28020,2641, 28019, 317, 28021,317, 28022,1345, 2163, 28024,317, 2627, 388, 2272, 28028,28029,2035, 28030,350, 489, 28031,371, 2317, 28033,28039,28040,28046,28049,28050,28052, - 28055,28034,5891, 28037,2272, 28035,317, 28036,28038,490, 27506,317, 356, 5343, 317, 371, 367, 28041,28042,317, 28043,28044,317, 28045,28047,28048,343, + 28055,28034,5891, 28037,2272, 28035,317, 28036,28038,490, 27506,317, 356, 5343, 317, 371, 367, 28041,28042,317, 28043,28044,317, 28045,28047,28048,343, 19453,3078, 381, 26627,428, 28051,28053,28054,1020, 883, 10316,317, 24893,351, 28057,28058,28059,28060,28061,28062,1998, 3999, 28063,28069,28072,28074,28084, 28089,28108,401, 1347, 6847, 317, 317, 317, 2156, 7949, 345, 317, 428, 317, 317, 466, 317, 1347, 1347, 381, 608, 356, 23731,345, 28064,28065,15772, - 28066,28067,396, 393, 28068,28070,317, 1109, 28071,6228, 317, 2077, 317, 28073,343, 439, 28075,6546, 1020, 28083,1337, 28076,28080,28077,28078,5700, 427, + 28066,28067,396, 393, 28068,28070,317, 1109, 28071,6228, 317, 2077, 317, 28073,343, 439, 28075,6546, 1020, 28083,1337, 28076,28080,28077,28078,5700, 427, 5492, 28079,317, 28081,351, 28082,317, 2551, 363, 28085,4976, 28086,28087,28088,1999, 28090,28093,28095,4738, 28098,28101,363, 28102,28104,28105,28091,28092, 28094,317, 28096,28097,28099,28100,9992, 28103,2081, 28106,28107,5241, 5406, 28109,28111,28113,28116,28130,28132,28135,28140,28142,28112,490, 28114,28115,28117, 10796,28120,5836, 28128,971, 317, 28118,28119,28121,28122,362, 28125,28126,28123,28124,28127,5217, 317, 28129,28131,7627, 28133,28134,7850, 28136,28139,28137, - 28138,5687, 7850, 317, 28141,350, 28143,10984,28144,28153,28155,28158,28166,87, 28264,28291,28419,28517,28530,28573,28635,28657,28763,28772,88, 89, 90, + 28138,5687, 7850, 317, 28141,350, 28143,10984,28144,28153,28155,28158,28166,87, 28264,28291,28419,28517,28530,28573,28635,28657,28763,28772,88, 89, 90, 29649,29667,29761,91, 92, 30148,30226,93, 30442,94, 30766,30800,4797, 11073,4797, 4797, 4797, 363, 28145,28149,28146,28147,28148,28150,28151,28152,28154, 28156,28157,28159,28165,28160,28161,28162,28163,28164,28167,28168,370, 28170,28171,28173,7582, 28176,28181,28182,28184,28185,501, 28186,28225,28246,316, 28257, - 1033, 370, 28169,22351,539, 370, 28172,5866, 343, 317, 317, 28174,28175,12696,28177,363, 28178,363, 317, 28179,363, 6228, 1160, 317, 317, 633, 317, - 1353, 5108, 362, 317, 2272, 28180,404, 740, 5942, 1889, 317, 363, 404, 9450, 5055, 2156, 317, 439, 28183,370, 16053,5661, 317, 345, 5663, 345, 365, + 1033, 370, 28169,22351,539, 370, 28172,5866, 343, 317, 317, 28174,28175,12696,28177,363, 28178,363, 317, 28179,363, 6228, 1160, 317, 317, 633, 317, + 1353, 5108, 362, 317, 2272, 28180,404, 740, 5942, 1889, 317, 363, 404, 9450, 5055, 2156, 317, 439, 28183,370, 16053,5661, 317, 345, 5663, 345, 365, 317, 2410, 28187,28188,379, 373, 28190,466, 28191,28197,28202,28209,27846,28210,28211,1020, 28224,317, 2022, 741, 317, 5159, 28189,1999, 5159, 11619,28192, 28194,554, 28195,317, 25938,317, 28193,363, 363, 343, 317, 28193,28196,343, 28198,28200,317, 28199,28201,1704, 28203,28206,10877,28208,317, 1347, 28204, 317, 28205,2272, 370, 2571, 28207,5159, 14792,18941,24039,317, 28212,317, 317, 5281, 28213,8023, 28215,362, 28218,28220,28221,317, 28214,28216,317, 28217, - 28219,28222,28223,316, 382, 2063, 317, 404, 28226,317, 28227,350, 28228,5332, 28229,28243,317, 1345, 5399, 317, 317, 24398,370, 5861, 6036, 384, 317, - 28230,28231,28234,2413, 554, 363, 28238,16166,363, 3075, 9914, 12417,5573, 28242,370, 28232,479, 28233,15112,317, 28235,317, 7447, 1230, 28236,28237,6089, + 28219,28222,28223,316, 382, 2063, 317, 404, 28226,317, 28227,350, 28228,5332, 28229,28243,317, 1345, 5399, 317, 317, 24398,370, 5861, 6036, 384, 317, + 28230,28231,28234,2413, 554, 363, 28238,16166,363, 3075, 9914, 12417,5573, 28242,370, 28232,479, 28233,15112,317, 28235,317, 7447, 1230, 28236,28237,6089, 439, 3999, 317, 317, 1033, 9590, 28239,5575, 28240,439, 371, 28241,6354, 412, 384, 2063, 13841,28244,539, 28245,2260, 28247,741, 28248,28249,28250,28251, 28253,28254,28255,2391, 345, 363, 28252,363, 5872, 317, 317, 633, 381, 317, 2402, 12154,343, 3621, 28256,28258,2551, 28259,317, 28260,28261,28262,28263, 28265,28266,404, 28271,28282,28283,350, 28284,28286,28290,317, 390, 365, 2719, 367, 4943, 317, 317, 28267,28268,28269,317, 317, 21053,501, 15330,12845, - 382, 28270,356, 2184, 28272,28274,28280,317, 28273,9012, 5626, 11663,28206,28275,404, 28277,28279,2310, 13674,28276,317, 16187,28278,6203, 317, 28281,317, - 9298, 2219, 590, 317, 4984, 3999, 7384, 28285,5962, 343, 1358, 1160, 28287,317, 530, 4984, 28288,365, 28289,339, 28292,28309,28310,28341,28342,28356,490, + 382, 28270,356, 2184, 28272,28274,28280,317, 28273,9012, 5626, 11663,28206,28275,404, 28277,28279,2310, 13674,28276,317, 16187,28278,6203, 317, 28281,317, + 9298, 2219, 590, 317, 4984, 3999, 7384, 28285,5962, 343, 1358, 1160, 28287,317, 530, 4984, 28288,365, 28289,339, 28292,28309,28310,28341,28342,28356,490, 28366,28367,28387,28390,28410,317, 8172, 28293,317, 28301,317, 28294,28296,28295,28297,28298,28299,28300,28302,28303,28304,6949, 28305,10252,317, 317, 28306, 28307,345, 28308,28311,28313,28324,317, 28328,317, 28338,2280, 356, 1588, 28312,19455,1100, 28314,28315,28316,23682,28318,5897, 5055, 28317,28319,28321,28320, 28322,28323,2035, 332, 28325,501, 14753,28326,28327,740, 28329,5464, 466, 28336,28337,28330,28331,28332,28333,28334,28335,345, 5651, 317, 28339,28340,28207, @@ -7951,291 +7946,291 @@ static const unsigned int ChildLocs[185261] = 3529, 10035,11443,343, 3529, 439, 2108, 28353,28355,1020, 2272, 426, 28357,28358,28362,351, 504, 28359,28360,28361,28363,28364,401, 28365,466, 317, 28368, 28369,28370,28371,28373,28379,28381,28385,348, 7035, 1347, 9310, 28372,28374,28375,28376,28377,10344,345, 317, 317, 28378,596, 345, 965, 4268, 317, 28380, 339, 343, 28382,28383,28384,28386,317, 28388,28389,370, 370, 401, 28391,317, 28392,28395,28396,317, 28404,317, 28393,28394,28397,28398,28399,28400,28401, - 28402,28403,28405,339, 28409,28406,28407,28408,28411,28414,28418,28412,28413,28415,28416,28417,433, 427, 356, 3182, 317, 5896, 28420,28423,28430,28440,8223, - 28452,28469,28472,28484,28486,28487,28489,28491,28492,28505,28507,28515,550, 2474, 28421,28422,317, 18244,28424,28428,317, 28429,28425,28426,6228, 317, 317, - 1087, 8301, 317, 28427,317, 350, 28431,28437,28439,317, 7779, 3576, 317, 28432,363, 2272, 317, 28433,28434,28435,2113, 2584, 5663, 2110, 28436,28438,9624, - 8223, 317, 404, 28441,28443,28444,28445,8023, 28451,2022, 11236,14062,317, 28442,8978, 5865, 28446,317, 9624, 8023, 28447,28448,28449,5862, 381, 28450,363, - 20535,370, 404, 404, 349, 393, 10059,351, 8977, 28453,28455,28456,317, 28457,350, 1243, 28460,2272, 28463,28464,28468,28454,370, 5458, 343, 14792,317, - 1347, 28458,28459,351, 5225, 1347, 332, 317, 28461,7079, 22786,28462,365, 363, 332, 410, 356, 317, 5113, 28465,317, 2110, 28466,317, 317, 28467,7821, - 28470,28471,3999, 605, 439, 363, 28473,28474,28477,28480,350, 2551, 9609, 28475,363, 28476,28478,5995, 28479,404, 28481,28482,404, 317, 28483,7055, 363, + 28402,28403,28405,339, 28409,28406,28407,28408,28411,28414,28418,28412,28413,28415,28416,28417,433, 427, 356, 3182, 317, 5896, 28420,28423,28430,28440,8223, + 28452,28469,28472,28484,28486,28487,28489,28491,28492,28505,28507,28515,550, 2474, 28421,28422,317, 18244,28424,28428,317, 28429,28425,28426,6228, 317, 317, + 1087, 8301, 317, 28427,317, 350, 28431,28437,28439,317, 7779, 3576, 317, 28432,363, 2272, 317, 28433,28434,28435,2113, 2584, 5663, 2110, 28436,28438,9624, + 8223, 317, 404, 28441,28443,28444,28445,8023, 28451,2022, 11236,14062,317, 28442,8978, 5865, 28446,317, 9624, 8023, 28447,28448,28449,5862, 381, 28450,363, + 20535,370, 404, 404, 349, 393, 10059,351, 8977, 28453,28455,28456,317, 28457,350, 1243, 28460,2272, 28463,28464,28468,28454,370, 5458, 343, 14792,317, + 1347, 28458,28459,351, 5225, 1347, 332, 317, 28461,7079, 22786,28462,365, 363, 332, 410, 356, 317, 5113, 28465,317, 2110, 28466,317, 317, 28467,7821, + 28470,28471,3999, 605, 439, 363, 28473,28474,28477,28480,350, 2551, 9609, 28475,363, 28476,28478,5995, 28479,404, 28481,28482,404, 317, 28483,7055, 363, 317, 6036, 28485,6940, 6900, 317, 550, 19463,28488,390, 990, 5538, 317, 317, 20909,380, 363, 28490,351, 426, 28493,28496,2163, 28502,28494,28495,28497, 5226, 28498,5447, 28499,2510, 382, 28500,343, 28501,22030,412, 317, 28503,28504,28506,28508,28514,345, 28509,28510,5942, 317, 28511,345, 362, 317, 28513, - 28512,317, 363, 317, 5037, 28516,426, 345, 28518,16197,28522,28523,339, 18840,28526,2715, 28527,605, 28528,28519,317, 28520,317, 28521,427, 8172, 345, + 28512,317, 363, 317, 5037, 28516,426, 345, 28518,16197,28522,28523,339, 18840,28526,2715, 28527,605, 28528,28519,317, 28520,317, 28521,427, 8172, 345, 317, 28524,317, 28525,500, 596, 317, 574, 28529,317, 28531,28532,28537,28538,16920,1020, 28563,28567,551, 28572,28533,28534,28535,28536,28539,28540,28549, 28557,350, 28559,404, 28562,317, 28541,28544,3688, 28545,28542,356, 28543,2510, 317, 382, 6440, 2369, 28546,28547,28548,28550,317, 5201, 28555,28551,28552, 28553,28554,5201, 5324, 28556,439, 351, 28558,28560,317, 28561,6668, 317, 28564,28566,363, 28565,365, 10073,317, 317, 28568,28569,28570,28571,28574,28579, - 28580,351, 28584,28595,28601,28602,28605,28607,28608,28621,28623,28625,28626,28628,28575,1347, 317, 28576,28577,28578,343, 28581,28582,317, 439, 16187,2067, - 351, 12934,28583,1999, 1998, 28585,11089,28589,28591,362, 2077, 317, 12506,11158,28593,28586,317, 362, 28587,8488, 381, 28588,9938, 28590,28592,317, 2067, + 28580,351, 28584,28595,28601,28602,28605,28607,28608,28621,28623,28625,28626,28628,28575,1347, 317, 28576,28577,28578,343, 28581,28582,317, 439, 16187,2067, + 351, 12934,28583,1999, 1998, 28585,11089,28589,28591,362, 2077, 317, 12506,11158,28593,28586,317, 362, 28587,8488, 381, 28588,9938, 28590,28592,317, 2067, 404, 28594,427, 28596,28597,28598,28599,28600,2537, 317, 2322, 365, 439, 28603,28604,3529, 317, 2067, 404, 317, 5862, 343, 28606,5255, 343, 8095, 15828, - 351, 12083,28609,396, 28611,317, 28615,317, 28616,28619,28610,28612,28613,28614,949, 490, 7116, 28617,28618,2163, 317, 520, 28620,28622,966, 6108, 8254, - 345, 1347, 2078, 28624,343, 317, 9530, 28627,28629,28630,317, 5419, 28631,28632,28633,28634,28636,4925, 28637,28642,28644,2163, 479, 28645,28656,2134, 356, + 351, 12083,28609,396, 28611,317, 28615,317, 28616,28619,28610,28612,28613,28614,949, 490, 7116, 28617,28618,2163, 317, 520, 28620,28622,966, 6108, 8254, + 345, 1347, 2078, 28624,343, 317, 9530, 28627,28629,28630,317, 5419, 28631,28632,28633,28634,28636,4925, 28637,28642,28644,2163, 479, 28645,28656,2134, 356, 28638,28640,343, 2219, 28639,28641,2145, 24722,28643,317, 343, 362, 317, 349, 317, 8488, 5663, 12696,343, 28646,10946,28651,28652,343, 28653,5662, 28647, 450, 317, 5896, 28648,28650,28649,390, 6206, 4965, 28654,28655,28658,28659,28672,28676,28677,28678,380, 365, 28692,28695,28703,28704,28729,28732,28760,12291, - 351, 17400,28660,28669,28588,28661,28665,4738, 350, 5662, 350, 14828,28667,28662,28663,5223, 5897, 317, 9938, 7408, 28588,28664,15457,28666,1108, 14829,6598, - 28668,7687, 3007, 317, 28670,18460,28671,396, 412, 28673,4738, 345, 28675,317, 28674,317, 317, 13753,363, 11158,332, 2551, 6563, 24831,2134, 350, 317, + 351, 17400,28660,28669,28588,28661,28665,4738, 350, 5662, 350, 14828,28667,28662,28663,5223, 5897, 317, 9938, 7408, 28588,28664,15457,28666,1108, 14829,6598, + 28668,7687, 3007, 317, 28670,18460,28671,396, 412, 28673,4738, 345, 28675,317, 28674,317, 317, 13753,363, 11158,332, 2551, 6563, 24831,2134, 350, 317, 28679,28687,350, 317, 390, 28680,317, 28681,28684,28685,28682,28683,28686,12956,5661, 28688,2793, 15260,28689,4982, 1347, 28691,317, 317, 28690,28693,28694, 5213, 350, 317, 28696,28697,28699,28701,345, 28698,28700,363, 363, 490, 343, 28702,362, 317, 7214, 28705,371, 28706,28708,16017,2357, 8948, 317, 28709, 28725,28728,317, 3688, 28707,28710,28717,28720,28721,28711,28712,28713,28714,28715,28716,28718,28719,28722,501, 28723,28724,28726,28727,2117, 426, 28730,28731, 345, 2366, 343, 7949, 28733,28735,28738,28751,28752,15745,28753,28754,363, 7428, 28756,28734,28736,28737,28739,362, 28740,28750,9064, 362, 2108, 28741,28744, 28746,28747,9634, 28749,28742,28743,8389, 363, 545, 24113,10561,28745,8047, 4966, 350, 350, 5663, 4738, 2553, 28748,3007, 1020, 7428, 2219, 5663, 2369, 28755, 351, 28757,28758,317, 28759,363, 380, 350, 28761,501, 28762,28764,28768,21479,28765,28766,28767,28769,28771,28770,317, 356, 5847, 351, 317, 28773,28780, - 14571,363, 317, 28781,28783,350, 28785,28788,2584, 28790,490, 543, 12742,317, 28774,28775,28776,28777,28778,28779,7911, 4949, 608, 28782,396, 427, 501, + 14571,363, 317, 28781,28783,350, 28785,28788,2584, 28790,490, 543, 12742,317, 28774,28775,28776,28777,28778,28779,7911, 4949, 608, 28782,396, 427, 501, 28784,317, 9575, 317, 365, 28786,1044, 439, 28787,28789,6778, 28791,1020, 28792,28793,427, 427, 28794,356, 28795,28796,28799,28802,28831,28843,28845,28856, - 28970,28979,28984,28988,29025,29026,29031,29079,29088,29090,29095,6601, 29098,29101,29119,29121,29124,29133,29138,29141,28797,28798,28800,28801,28803,28808,9917, + 28970,28979,28984,28988,29025,29026,29031,29079,29088,29090,29095,6601, 29098,29101,29119,29121,29124,29133,29138,29141,28797,28798,28800,28801,28803,28808,9917, 28812,365, 28814,28817,28818,28819,28823,28827,565, 2272, 28830,28804,28805,28806,28807,7640, 5987, 28809,28810,28811,28813,28815,317, 28816,363, 21139,28820, 1526, 28821,28822,28824,28825,28826,28828,404, 317, 28829,351, 8612, 382, 28832,28837,16651,3236, 28841,28842,28833,28834,362, 427, 317, 28835,332, 28836, - 28838,28840,28839,545, 6598, 4980, 7214, 501, 1347, 7368, 345, 28844,28579,384, 14337,28846,28848,28850,28852,317, 28847,381, 7368, 1020, 370, 317, 317, - 28849,317, 317, 28851,7711, 381, 28853,28854,7091, 390, 990, 343, 28855,2108, 28857,370, 28861,990, 28923,28928,28932,28935,28940,28946,28948,28953,6370, + 28838,28840,28839,545, 6598, 4980, 7214, 501, 1347, 7368, 345, 28844,28579,384, 14337,28846,28848,28850,28852,317, 28847,381, 7368, 1020, 370, 317, 317, + 28849,317, 317, 28851,7711, 381, 28853,28854,7091, 390, 990, 343, 28855,2108, 28857,370, 28861,990, 28923,28928,28932,28935,28940,28946,28948,28953,6370, 28954,28964,490, 317, 317, 28858,343, 14865,28859,28860,28862,356, 25178,28863,28865,317, 28864,26978,317, 1160, 476, 28866,28869,28867,20969,5701, 28868, 317, 5055, 370, 317, 28870,28873,28886,28887,28894,28896,28905,28913,28919,28920,24305,28871,28872,28874,28878,28882,5096, 28875,28876,28877,28879,28880,28881, 433, 6525, 28883,28884,28885,1347, 20072,28888,28889,28890,28891,28892,28893,316, 28895,2163, 18617,28897,28902,28898,28899,28900,28901,8804, 317, 28903,28904, 28906,28911,317, 28907,28908,28909,28910,28912,28914,28918,1060, 525, 25880,28915,28916,28917,2584, 5640, 28921,28922,12503,10626,28924,28925,28926,28927,28929, 28931,317, 28930,343, 317, 5324, 28933,28934,28936,28937,28938,317, 317, 28939,317, 28941,28944,3361, 317, 317, 490, 28945,28942,7127, 317, 651, 28943, - 348, 4949, 28947,28949,28950,28951,28952,384, 404, 317, 2163, 28955,28956,28957,28958,28959,28960,28961,28962,28963,28965,28968,28966,5447, 28967,2510, 382, + 348, 4949, 28947,28949,28950,28951,28952,384, 404, 317, 2163, 28955,28956,28957,28958,28959,28960,28961,28962,28963,28965,28968,28966,5447, 28967,2510, 382, 5616, 356, 28969,637, 317, 390, 28971,363, 362, 551, 28974,28975,28977,450, 28972,28973,2004, 28976,5886, 371, 19283,28978,28980,16553,363, 28981,28982, 5223, 317, 332, 11279,28983,28985,28987,28986,317, 356, 2364, 28989,28991,28993,28994,28996,28997,590, 2533, 28999,29002,29003,29004,29010,5022, 29014,29016, - 2156, 5891, 28990,363, 363, 6046, 28992,2222, 396, 28995,351, 2058, 28998,29000,29001,317, 317, 317, 11648,317, 317, 7185, 5223, 29005,16880,490, 404, - 29009,490, 404, 11280,29006,29007,29008,29011,18577,29012,29013,29015,29017,14263,29024,7062, 317, 29018,2261, 5238, 29022,488, 29019,29020,29021,317, 363, - 11782,29023,29027,2036, 317, 29028,29029,317, 317, 404, 1999, 479, 29030,29032,22163,29035,29037,29051,362, 350, 29070,29071,29072,29075,29078,2022, 490, + 2156, 5891, 28990,363, 363, 6046, 28992,2222, 396, 28995,351, 2058, 28998,29000,29001,317, 317, 317, 11648,317, 317, 7185, 5223, 29005,16880,490, 404, + 29009,490, 404, 11280,29006,29007,29008,29011,18577,29012,29013,29015,29017,14263,29024,7062, 317, 29018,2261, 5238, 29022,488, 29019,29020,29021,317, 363, + 11782,29023,29027,2036, 317, 29028,29029,317, 317, 404, 1999, 479, 29030,29032,22163,29035,29037,29051,362, 350, 29070,29071,29072,29075,29078,2022, 490, 29033,29034,5464, 29036,29038,990, 2551, 6089, 29040,362, 29041,29045,29049,29050,317, 29039,317, 6594, 6594, 317, 317, 29042,350, 351, 7910, 6089, 29043, 29044,4949, 1453, 317, 10561,501, 6673, 29046,317, 11709,5662, 29048,317, 317, 29047,2584, 11147,317, 2058, 363, 1700, 29052,29053,29054,29057,29063,29064, - 29068,29069,317, 29055,29056,29058,6089, 29059,351, 29060,29062,404, 6089, 427, 29061,363, 363, 5809, 29065,9547, 1347, 345, 29066,29067,317, 12696,404, - 332, 332, 381, 29073,2171, 363, 18840,29074,4949, 448, 4738, 1020, 29076,356, 29077,29080,4213, 29084,13023,29086,29087,6601, 317, 6089, 29081,317, 317, - 29082,29083,12934,29085,317, 317, 317, 1721, 317, 317, 29089,2110, 3284, 332, 29091,8510, 2551, 2948, 29092,29093,9057, 29094,490, 8722, 317, 363, 5225, - 5325, 1999, 29096,26005,2073, 29097,2004, 29099,29100,8848, 990, 29102,29105,29106,29111,29114,29116,2171, 350, 363, 14263,29117,29118,317, 7650, 29103,7645, - 1526, 29104,7590, 558, 448, 317, 29107,317, 2236, 29109,317, 29108,8906, 29110,29112,29113,2152, 343, 317, 29115,350, 1588, 10580,363, 356, 351, 350, - 363, 558, 384, 5810, 351, 554, 466, 6761, 29120,20161,551, 29122,5717, 10550,3031, 29123,1347, 29125,29127,29132,317, 29126,317, 317, 317, 317, 317, - 427, 317, 317, 29128,29129,29131,29130,6228, 633, 673, 633, 317, 317, 317, 29134,29136,490, 384, 29137,363, 2004, 356, 29135,2219, 356, 5164, 5241, - 29139,2110, 5634, 29140,317, 29142,370, 29143,24957,317, 29144,29158,29208,29209,29211,29224,343, 16187,29226,343, 29242,29243,29254,29260,29295,29296,345, + 29068,29069,317, 29055,29056,29058,6089, 29059,351, 29060,29062,404, 6089, 427, 29061,363, 363, 5809, 29065,9547, 1347, 345, 29066,29067,317, 12696,404, + 332, 332, 381, 29073,2171, 363, 18840,29074,4949, 448, 4738, 1020, 29076,356, 29077,29080,4213, 29084,13023,29086,29087,6601, 317, 6089, 29081,317, 317, + 29082,29083,12934,29085,317, 317, 317, 1721, 317, 317, 29089,2110, 3284, 332, 29091,8510, 2551, 2948, 29092,29093,9057, 29094,490, 8722, 317, 363, 5225, + 5325, 1999, 29096,26005,2073, 29097,2004, 29099,29100,8848, 990, 29102,29105,29106,29111,29114,29116,2171, 350, 363, 14263,29117,29118,317, 7650, 29103,7645, + 1526, 29104,7590, 558, 448, 317, 29107,317, 2236, 29109,317, 29108,8906, 29110,29112,29113,2152, 343, 317, 29115,350, 1588, 10580,363, 356, 351, 350, + 363, 558, 384, 5810, 351, 554, 466, 6761, 29120,20161,551, 29122,5717, 10550,3031, 29123,1347, 29125,29127,29132,317, 29126,317, 317, 317, 317, 317, + 427, 317, 317, 29128,29129,29131,29130,6228, 633, 673, 633, 317, 317, 317, 29134,29136,490, 384, 29137,363, 2004, 356, 29135,2219, 356, 5164, 5241, + 29139,2110, 5634, 29140,317, 29142,370, 29143,24957,317, 29144,29158,29208,29209,29211,29224,343, 16187,29226,343, 29242,29243,29254,29260,29295,29296,345, 29300,29302,29305,29145,317, 29146,317, 29148,29149,317, 356, 29155,332, 8000, 21188,317, 29147,317, 12693,5501, 29150,317, 29152,29151,29153,317, 29154, 29156,29157,672, 29159,29171,29186,29187,29190,29198,317, 317, 568, 29160,29161,29162,29170,26565,3853, 26761,29163,29165,10557,29166,29164,29167,22912,29168, - 29169,5464, 8553, 3854, 29172,29174,29179,29182,29173,317, 29175,404, 29176,29177,29178,350, 29180,29181,4980, 5996, 317, 370, 3999, 29183,29184,29185,466, + 29169,5464, 8553, 3854, 29172,29174,29179,29182,29173,317, 29175,404, 29176,29177,29178,350, 29180,29181,4980, 5996, 317, 370, 3999, 29183,29184,29185,466, 29188,29189,317, 10922,317, 404, 29191,29193,29195,29196,29192,2184, 5464, 3854, 29194,5343, 29197,29199,6021, 29201,363, 29206,5717, 351, 29200,29202,29203, - 1526, 29204,29205,29207,23534,10253,401, 317, 389, 29210,317, 342, 29212,2652, 29215,490, 5746, 490, 339, 29213,317, 29214,5793, 29216,29217,29221,511, + 1526, 29204,29205,29207,23534,10253,401, 317, 389, 29210,317, 342, 29212,2652, 29215,490, 5746, 490, 339, 29213,317, 29214,5793, 29216,29217,29221,511, 29223,4980, 317, 7941, 29218,466, 317, 29219,317, 29220,317, 29222,5412, 29225,578, 2219, 371, 29227,332, 29230,29233,29236,29238,29241,29228,29229,21944, 1347, 1358, 29231,490, 29232,18454,317, 4984, 6228, 317, 2366, 317, 317, 29234,29235,21048,8484, 29237,317, 363, 29239,8544, 29240,5055, 5459, 317, 15253, - 370, 6036, 3999, 317, 4984, 29244,29247,29250,29252,8178, 317, 29253,637, 949, 320, 9298, 2271, 29245,5956, 345, 29246,8431, 29248,29249,11962,6195, 2108, + 370, 6036, 3999, 317, 4984, 29244,29247,29250,29252,8178, 317, 29253,637, 949, 320, 9298, 2271, 29245,5956, 345, 29246,8431, 29248,29249,11962,6195, 2108, 511, 404, 317, 371, 317, 317, 29251,9931, 19709,15540,5087, 29255,6021, 29256,29257,317, 29258,343, 29259,5701, 2571, 317, 29261,29265,9624, 29269,29274, 29279,29285,29290,404, 29293,2163, 29262,29263,2094, 29264,317, 29266,29268,12958,317, 29267,29270,29273,29271,10295,345, 29272,13077,5717, 317, 29275,29276, - 29277,29278,29280,332, 29282,29281,29283,13927,29284,466, 3854, 317, 365, 29286,29288,29287,29289,29291,29292,1347, 1078, 356, 29294,2184, 5464, 2571, 343, + 29277,29278,29280,332, 29282,29281,29283,13927,29284,466, 3854, 317, 365, 29286,29288,29287,29289,29291,29292,1347, 1078, 356, 29294,2184, 5464, 2571, 343, 317, 24638,317, 29297,29298,29299,3529, 15457,2586, 343, 2298, 5810, 490, 29301,317, 22121,5167, 29303,29304,29306,29322,29323,29377,29428,29432,29442,29486, - 29489,29495,29498,29501,29511,29516,29525,29534,29537,29541,29554,29566,29619,29625,29643,29644,29645,29307,29308,29310,29315,29309,317, 29311,29313,29312,356, + 29489,29495,29498,29501,29511,29516,29525,29534,29537,29541,29554,29566,29619,29625,29643,29644,29645,29307,29308,29310,29315,29309,317, 29311,29313,29312,356, 1526, 317, 29314,2247, 16992,356, 29316,29317,29318,2509, 29319,29320,29321,2074, 9914, 29324,29332,29339,29343,317, 29348,29349,29357,29364,29366,29325,29326, 29328,29331,5174, 8436, 2261, 5237, 29327,29329,29330,10097,490, 29333,29334,29335,29336,29337,5828, 29338,29340,23645,29341,29342,14337,466, 3854, 2571, 29344, 29346,332, 345, 29345,317, 29347,9383, 26472,29350,29351,2156, 29354,5394, 10877,29352,29353,2003, 427, 29355,29356,29358,29362,29363,29359,29360,29361,29365, 29367,29368,29369,29370,29371,29372,29374,29373,29375,29376,29378,29380,14409,29387,29388,29390,19504,29422,9425, 29425,29427,7035, 29379,29381,10946,317, 29384, 29385,5244, 29382,29383,5273, 6013, 10393,380, 317, 370, 15581,29386,363, 10946,10878,332, 343, 29389,2108, 317, 6670, 29391,29397,29398,29400,29405,29409, - 29412,29417,29418,29361,29392,29393,29396,29394,29395,317, 10252,29399,8272, 29401,26090,29402,29403,29404,380, 5652, 427, 29406,29407,29408,29410,29411,317, - 29413,29414,29415,29416,466, 317, 5399, 317, 317, 8468, 29397,29419,29421,29420,7466, 13947,29423,29424,29426,523, 5447, 466, 317, 317, 7149, 2004, 317, + 29412,29417,29418,29361,29392,29393,29396,29394,29395,317, 10252,29399,8272, 29401,26090,29402,29403,29404,380, 5652, 427, 29406,29407,29408,29410,29411,317, + 29413,29414,29415,29416,466, 317, 5399, 317, 317, 8468, 29397,29419,29421,29420,7466, 13947,29423,29424,29426,523, 5447, 466, 317, 317, 7149, 2004, 317, 22666,317, 29429,8484, 29430,404, 6212, 29431,363, 8346, 317, 1347, 490, 24322,4267, 29433,29436,29437,26533,29441,29434,29435,578, 7942, 2219, 29438,29439, - 317, 29440,466, 410, 317, 3854, 1347, 317, 29443,29445,14571,29450,350, 29465,29466,29469,362, 9289, 6601, 29479,18839,29483,29485,29444,26676,356, 539, - 2272, 29446,426, 29448,29447,29449,29451,29454,5662, 29463,24226,29464,317, 29452,29453,29455,29458,29460,2368, 12564,29462,29456,29457,6593, 29459,5917, 5765, - 29461,466, 362, 363, 355, 501, 8224, 29467,29468,317, 317, 317, 317, 6013, 317, 29470,29473,29476,439, 343, 29471,317, 29472,29474,9624, 15213,511, - 5662, 29475,4980, 381, 6089, 317, 29457,6593, 317, 317, 29477,29478,29480,29482,317, 29481,9124, 10877,396, 29195,29484,428, 351, 29487,8551, 29488,339, + 317, 29440,466, 410, 317, 3854, 1347, 317, 29443,29445,14571,29450,350, 29465,29466,29469,362, 9289, 6601, 29479,18839,29483,29485,29444,26676,356, 539, + 2272, 29446,426, 29448,29447,29449,29451,29454,5662, 29463,24226,29464,317, 29452,29453,29455,29458,29460,2368, 12564,29462,29456,29457,6593, 29459,5917, 5765, + 29461,466, 362, 363, 355, 501, 8224, 29467,29468,317, 317, 317, 317, 6013, 317, 29470,29473,29476,439, 343, 29471,317, 29472,29474,9624, 15213,511, + 5662, 29475,4980, 381, 6089, 317, 29457,6593, 317, 317, 29477,29478,29480,29482,317, 29481,9124, 10877,396, 29195,29484,428, 351, 29487,8551, 29488,339, 371, 317, 29490,317, 29493,317, 29491,29492,317, 317, 401, 29494,29496,14649,29497,317, 410, 356, 14172,3854, 317, 317, 29499,29500,365, 2521, 29502, - 29504,29510,317, 29503,29505,317, 29308,29509,29506,29507,29508,29512,29515,397, 363, 317, 29513,29514,29517,29518,29519,29524,317, 365, 317, 345, 7565, + 29504,29510,317, 29503,29505,317, 29308,29509,29506,29507,29508,29512,29515,397, 363, 317, 29513,29514,29517,29518,29519,29524,317, 365, 317, 345, 7565, 317, 381, 317, 29520,29521,29523,317, 29522,29526,29528,29529,29531,317, 29532,2001, 343, 4943, 29527,1347, 7214, 29530,1230, 343, 29533,397, 7834, 29535, - 29536,29538,29539,29540,14337,596, 317, 29542,29543,29549,29553,29544,29545,343, 29546,11767,317, 29547,29548,29550,29552,29551,5399, 5112, 466, 5399, 317, - 29555,29558,29559,29562,29563,7428, 4965, 14262,29565,5809, 317, 2336, 29556,29557,5105, 21168,6638, 317, 29560,29561,5055, 382, 29564,9557, 4738, 605, 5447, - 466, 5717, 29567,29572,29582,29593,350, 29597,29599,29615,29616,5120, 29568,22809,29570,29569,29571,5866, 317, 29573,29574,12277,343, 6228, 317, 18448,426, + 29536,29538,29539,29540,14337,596, 317, 29542,29543,29549,29553,29544,29545,343, 29546,11767,317, 29547,29548,29550,29552,29551,5399, 5112, 466, 5399, 317, + 29555,29558,29559,29562,29563,7428, 4965, 14262,29565,5809, 317, 2336, 29556,29557,5105, 21168,6638, 317, 29560,29561,5055, 382, 29564,9557, 4738, 605, 5447, + 466, 5717, 29567,29572,29582,29593,350, 29597,29599,29615,29616,5120, 29568,22809,29570,29569,29571,5866, 317, 29573,29574,12277,343, 6228, 317, 18448,426, 356, 27814,2271, 343, 2402, 29575,317, 29578,29576,29577,29579,29580,29581,10422,466, 5399, 317, 29583,29584,29588,29585,29587,29586,29589,356, 29590,29591, 29592,5441, 10086,29594,29596,29595,596, 26676,317, 29598,24437,9118, 9347, 29600,29606,29613,8469, 29614,16143,490, 29601,29602,29605,317, 345, 9118, 29603, 1347, 29604,3854, 1526, 29607,1347, 1020, 29359,29608,345, 381, 29609,29610,29611,29612,345, 19617,317, 7988, 29617,1526, 29618,590, 29620,29624,29621,29622, 29623,373, 23268,29626,29631,1531, 317, 29627,29630,317, 29628,29629,5447, 466, 3854, 410, 5464, 4591, 29632,29641,29633,29634,29635,317, 29636,29637,29638, - 29639,317, 29640,5249, 370, 29542,29642,12721,5159, 29646,4965, 29647,29648,2094, 1347, 10252,29650,396, 29651,6002, 490, 345, 29655,29657,29665,29666,2272, + 29639,317, 29640,5249, 370, 29542,29642,12721,5159, 29646,4965, 29647,29648,2094, 1347, 10252,29650,396, 29651,6002, 490, 345, 29655,29657,29665,29666,2272, 6309, 29652,362, 29653,29654,29656,29658,29659,29660,29661,29662,29663,29664,29668,3869, 29680,29682,29693,29745,29746,29751,29756,511, 367, 29759,29760,29669, 29674,29676,29677,29670,29671,29672,29673,29675,29678,29679,404, 317, 317, 29681,9498, 404, 2236, 29683,29691,29684,29686,29690,29685,29687,29688,5105, 29689, - 29692,427, 554, 363, 427, 427, 317, 490, 29694,29698,29703,29706,29713,5601, 29716,29719,29723,29724,29734,29743,317, 29695,317, 29696,29697,29699,432, + 29692,427, 554, 363, 427, 427, 317, 490, 29694,29698,29703,29706,29713,5601, 29716,29719,29723,29724,29734,29743,317, 29695,317, 29696,29697,29699,432, 29700,22034,29702,29701,317, 1347, 25427,29704,29705,29707,29709,29708,29710,1347, 29711,29712,29714,19791,29715,380, 29717,29718,29720,29721,2272, 25216,29722, - 345, 4591, 317, 574, 345, 29725,29729,29731,29726,29727,29728,370, 7147, 343, 29730,29732,2156, 8204, 29733,29735,29736,29740,29737,29738,1347, 29739,4564, - 427, 29741,2156, 317, 29742,1526, 17897,29744,29747,15074,29748,965, 29750,2272, 29749,551, 29752,29754,12141,26359,317, 2219, 29753,317, 7734, 5661, 404, - 317, 390, 7592, 29755,2610, 2222, 29757,29758,2310, 5810, 2970, 29762,29763,29774,29777,345, 29764,29767,356, 29765,14716,317, 382, 24322,5201, 29766,5225, + 345, 4591, 317, 574, 345, 29725,29729,29731,29726,29727,29728,370, 7147, 343, 29730,29732,2156, 8204, 29733,29735,29736,29740,29737,29738,1347, 29739,4564, + 427, 29741,2156, 317, 29742,1526, 17897,29744,29747,15074,29748,965, 29750,2272, 29749,551, 29752,29754,12141,26359,317, 2219, 29753,317, 7734, 5661, 404, + 317, 390, 7592, 29755,2610, 2222, 29757,29758,2310, 5810, 2970, 29762,29763,29774,29777,345, 29764,29767,356, 29765,14716,317, 382, 24322,5201, 29766,5225, 14337,466, 29768,5113, 29769,29770,29773,29771,29772,448, 29775,29776,317, 29778,2291, 29780,29784,29786,317, 29787,29788,29779,22003,29781,317, 1108, 29782, 29783,317, 29785,317, 5399, 5174, 317, 9482, 345, 596, 317, 29789,521, 29790,22012,29791,29792,13766,5477, 29793,29802,29808,29813,29817,29830,29832,29840, - 29841,29857,29860,29867,29876,29885,29892,29894,29904,29908,29915,29919,29920,29921,29923,29935,29794,29795,404, 5655, 317, 356, 29797,29798,29801,29796,5394, - 466, 12796,317, 4591, 1588, 9027, 29799,29800,2108, 29803,380, 380, 29807,317, 29804,317, 317, 29805,29806,29809,28241,379, 317, 29811,29810,29812,7852, - 29814,1395, 6000, 2022, 29815,7490, 29816,5663, 363, 7990, 29818,29820,29823,29826,2551, 29828,317, 29829,362, 3387, 317, 29819,345, 29821,356, 29822,351, - 345, 343, 382, 363, 29824,317, 29825,29827,317, 5241, 317, 1999, 29831,1999, 4788, 29833,29836,29834,317, 29835,401, 29837,29839,29838,28207,22866,8224, - 317, 29842,5173, 27623,29846,29847,29849,29851,12994,29854,29855,362, 404, 29843,633, 633, 29844,339, 317, 13221,29845,5996, 1499, 5826, 317, 7792, 317, + 29841,29857,29860,29867,29876,29885,29892,29894,29904,29908,29915,29919,29920,29921,29923,29935,29794,29795,404, 5655, 317, 356, 29797,29798,29801,29796,5394, + 466, 12796,317, 4591, 1588, 9027, 29799,29800,2108, 29803,380, 380, 29807,317, 29804,317, 317, 29805,29806,29809,28241,379, 317, 29811,29810,29812,7852, + 29814,1395, 6000, 2022, 29815,7490, 29816,5663, 363, 7990, 29818,29820,29823,29826,2551, 29828,317, 29829,362, 3387, 317, 29819,345, 29821,356, 29822,351, + 345, 343, 382, 363, 29824,317, 29825,29827,317, 5241, 317, 1999, 29831,1999, 4788, 29833,29836,29834,317, 29835,401, 29837,29839,29838,28207,22866,8224, + 317, 29842,5173, 27623,29846,29847,29849,29851,12994,29854,29855,362, 404, 29843,633, 633, 29844,339, 317, 13221,29845,5996, 1499, 5826, 317, 7792, 317, 5300, 1160, 29848,363, 363, 404, 317, 29850,29852,317, 29853,317, 29856,29858,2035, 8864, 29859,490, 317, 29861,29863,29865,2310, 390, 29862,7214, 12700, 404, 5626, 29864,317, 2271, 15459,317, 390, 29866,29868,29869,29871,29874,29870,381, 7098, 29872,29873,29875,11635,29877,29880,6419, 317, 29883,501, 29878, 29879,317, 29881,29882,317, 9504, 317, 5897, 8491, 29884,11308,9450, 426, 5717, 29886,317, 2280, 317, 362, 317, 29887,29889,29888,20985,343, 29890,29891, - 317, 1160, 5343, 29893,317, 510, 13679,29895,29900,29901,29902,4965, 29896,29897,29898,29899,317, 490, 381, 1230, 332, 5538, 5105, 29903,1347, 5309, 2566, - 448, 29905,19390,29906,29907,356, 1044, 356, 317, 10517,29909,29910,362, 29911,5205, 5223, 29912,29913,29914,29916,2004, 29917,29918,356, 5847, 317, 370, - 363, 28276,370, 5684, 29922,3630, 2533, 317, 29924,29925,29926,29930,29927,29928,29929,2035, 29931,5688, 20532,29932,29933,29934,29936,590, 29939,29940,9818, - 29937,29938,29941,29942,29944,29947,29951,7225, 29990,29992,29994,29995,29946,30002,30014,30017,550, 30025,30033,30064,30073,30074,30092,29521,30144,29943,501, + 317, 1160, 5343, 29893,317, 510, 13679,29895,29900,29901,29902,4965, 29896,29897,29898,29899,317, 490, 381, 1230, 332, 5538, 5105, 29903,1347, 5309, 2566, + 448, 29905,19390,29906,29907,356, 1044, 356, 317, 10517,29909,29910,362, 29911,5205, 5223, 29912,29913,29914,29916,2004, 29917,29918,356, 5847, 317, 370, + 363, 28276,370, 5684, 29922,3630, 2533, 317, 29924,29925,29926,29930,29927,29928,29929,2035, 29931,5688, 20532,29932,29933,29934,29936,590, 29939,29940,9818, + 29937,29938,29941,29942,29944,29947,29951,7225, 29990,29992,29994,29995,29946,30002,30014,30017,550, 30025,30033,30064,30073,30074,30092,29521,30144,29943,501, 29945,370, 317, 317, 29948,5896, 8389, 29949,29950,363, 7942, 29952,29967,29975,29984,29986,29953,29954,11626,29957,29960,29961,29963,29966,2134, 29955,29956, - 29958,29959,18333,343, 574, 22122,5241, 5687, 2073, 29962,565, 2142, 363, 5752, 29964,29965,317, 317, 1347, 3854, 317, 382, 5355, 9398, 5570, 3869, 9756, - 9398, 9398, 29968,29969,29970,395, 9938, 8178, 6674, 5898, 479, 29971,29973,29974,5273, 29972,8599, 26788,4949, 29976,317, 490, 29978,29980,24810,29983,351, + 29958,29959,18333,343, 574, 22122,5241, 5687, 2073, 29962,565, 2142, 363, 5752, 29964,29965,317, 317, 1347, 3854, 317, 382, 5355, 9398, 5570, 3869, 9756, + 9398, 9398, 29968,29969,29970,395, 9938, 8178, 6674, 5898, 479, 29971,29973,29974,5273, 29972,8599, 26788,4949, 29976,317, 490, 29978,29980,24810,29983,351, 29977,332, 29979,5241, 433, 29981,18273,490, 29982,351, 5238, 29985,605, 29987,6817, 29988,29989,20130,490, 29991,490, 29993,2844, 17543,1030, 7698, 29996, 536, 29999,404, 30001,450, 29997,317, 29998,30000,30003,6195, 30004,30005,2381, 30013,7627, 1915, 8051, 12979,317, 317, 30006,6294, 5447, 30008,30007,30009, 30010,30011,30012,30015,351, 30016,11825,490, 30018,30019,30022,30023,30020,30021,8914, 380, 390, 30024,30026,30027,30031,30028,345, 30029,30030,30032,30034, 30038,30049,30054,30056,30057,30061,317, 343, 6409, 2272, 30035,1020, 30036,30037,317, 13376,536, 748, 501, 490, 30039,25562,30040,30041,30044,317, 28664, - 748, 30042,30043,7942, 30045,30047,4984, 317, 30046,5793, 332, 1109, 30048,30050,29268,30052,5241, 5105, 8937, 380, 30051,30053,5226, 8633, 30055,363, 2603, - 317, 317, 317, 351, 2004, 317, 30058,30060,21483,30059,317, 5711, 317, 5694, 332, 30062,381, 317, 30063,317, 30065,30066,30068,317, 490, 30067,2134, + 748, 30042,30043,7942, 30045,30047,4984, 317, 30046,5793, 332, 1109, 30048,30050,29268,30052,5241, 5105, 8937, 380, 30051,30053,5226, 8633, 30055,363, 2603, + 317, 317, 317, 351, 2004, 317, 30058,30060,21483,30059,317, 5711, 317, 5694, 332, 30062,381, 317, 30063,317, 30065,30066,30068,317, 490, 30067,2134, 1020, 9688, 30069,24119,2134, 30071,30070,30072,348, 30075,30077,10898,30086,2328, 30088,362, 350, 30091,396, 1325, 317, 1345, 30076,412, 3079, 317, 30078, 30079,5624, 30084,1345, 317, 317, 2193, 362, 13766,404, 30080,30081,30082,30083,18577,370, 317, 30085,371, 4984, 317, 30087,317, 351, 30089,30090,30093, - 6449, 30104,30120,30122,6917, 30125,30128,30138,2391, 317, 30094,30097,30098,363, 490, 2086, 30100,317, 317, 2156, 363, 5033, 30095,7448, 30096,5238, 404, + 6449, 30104,30120,30122,6917, 30125,30128,30138,2391, 317, 30094,30097,30098,363, 490, 2086, 30100,317, 317, 2156, 363, 5033, 30095,7448, 30096,5238, 404, 30099,317, 317, 7489, 5241, 30101,30102,30103,10046,30105,30106,30109,30111,317, 7452, 30112,1347, 30117,30119,30107,30108,30110,393, 12523,550, 30113,30115, 317, 4980, 30114,30116,317, 30118,8243, 30121,10770,380, 30123,317, 30124,373, 5446, 371, 317, 8213, 30126,30127,317, 30129,30132,30135,30137,345, 30130, 30131,317, 317, 536, 317, 381, 30133,15094,317, 30134,990, 30136,317, 13378,748, 30139,30142,317, 30140,30141,317, 30143,6541, 1347, 30145,30146,30147, - 5765, 30149,30150,30160,345, 30165,30201,1020, 511, 30203,30204,30209,30212,30215,30219,30220,30222,30225,343, 382, 1347, 2533, 11073,30151,30152,10329,317, - 30153,30154,30156,317, 2033, 317, 30155,404, 30157,30158,30159,30161,30162,30163,30164,30166,30168,30173,30177,30178,30197,30198,30199,30167,6228, 317, 380, + 5765, 30149,30150,30160,345, 30165,30201,1020, 511, 30203,30204,30209,30212,30215,30219,30220,30222,30225,343, 382, 1347, 2533, 11073,30151,30152,10329,317, + 30153,30154,30156,317, 2033, 317, 30155,404, 30157,30158,30159,30161,30162,30163,30164,30166,30168,30173,30177,30178,30197,30198,30199,30167,6228, 317, 380, 30169,317, 30170,1998, 2272, 363, 30171,30172,539, 317, 404, 380, 990, 5700, 351, 5538, 30174,30175,30176,30179,30182,30180,30181,2546, 5200, 30183,30188, 30191,30196,30184,30185,30186,30187,2510, 9548, 317, 30189,30190,11275,343, 317, 30192,30193,30194,30195,10253,317, 30200,19069,355, 317, 345, 10252,24574, - 30202,332, 30205,373, 380, 30207,30208,30206,317, 4738, 30210,5241, 30211,30213,30214,317, 30216,30217,317, 362, 1588, 2391, 317, 30218,2219, 404, 2156, + 30202,332, 30205,373, 380, 30207,30208,30206,317, 4738, 30210,5241, 30211,30213,30214,317, 30216,30217,317, 362, 1588, 2391, 317, 30218,2219, 404, 2156, 5653, 30221,30223,30224,380, 404, 8948, 350, 363, 30227,30228,30240,30242,30243,30244,30248,30253,30262,30264,30265,30282,30319,30329,30339,343, 30340,19814, - 351, 343, 2081, 30229,30233,30237,30230,30231,30232,30234,30235,30236,30238,30239,621, 362, 345, 30241,317, 5241, 5241, 490, 5241, 380, 5309, 9869, 5437, - 30245,317, 2022, 30246,317, 1160, 30247,317, 1347, 317, 317, 24113,30249,30250,30251,30252,30254,30255,30259,317, 30260,9931, 30256,6854, 30257,30258,8672, + 351, 343, 2081, 30229,30233,30237,30230,30231,30232,30234,30235,30236,30238,30239,621, 362, 345, 30241,317, 5241, 5241, 490, 5241, 380, 5309, 9869, 5437, + 30245,317, 2022, 30246,317, 1160, 30247,317, 1347, 317, 317, 24113,30249,30250,30251,30252,30254,30255,30259,317, 30260,9931, 30256,6854, 30257,30258,8672, 30261,30263,596, 3726, 317, 514, 26042,30266,363, 30268,30277,30279,30267,12225,30269,30272,30275,30270,30271,6904, 30273,30274,8311, 595, 30276,30278,30280, 30281,30283,317, 317, 317, 30286,30288,1020, 30289,30290,30291,404, 30317,740, 30284,30285,30287,390, 2541, 12912,619, 30292,30294,21318,30300,29906,28751, 30302,30303,30305,30306,30311,30316,17357,7035, 30293,2631, 551, 12084,30295,397, 30299,1060, 30296,30297,30298,30301,19790,2272, 30304,20320,29399,28220,30307, 741, 1060, 30308,5055, 17711,30309,30310,30312,30314,466, 3075, 30315,30313,2541, 30318,30320,30322,27477,497, 30325,30321,30323,317, 30324,30326,15526,30328, - 30327,9182, 605, 30330,30332,363, 30335,30338,2094, 30331,30333,30334,8959, 8557, 30336,30337,7577, 490, 30341,30342,30373,30375,30413,30417,30418,501, 7874, + 30327,9182, 605, 30330,30332,363, 30335,30338,2094, 30331,30333,30334,8959, 8557, 30336,30337,7577, 490, 30341,30342,30373,30375,30413,30417,30418,501, 7874, 30433,30440,30343,13077,317, 30345,30348,30360,30371,30372,381, 30344,7764, 596, 30346,363, 30347,317, 30349,350, 13995,30351,2108, 332, 30358,30359,30350, 12303,317, 371, 30352,30353,30354,1347, 13834,5793, 363, 30355,10674,317, 30356,30357,339, 317, 396, 11844,5838, 363, 404, 5037, 30361,30362,30365,30363, - 30364,5447, 9130, 351, 30366,30367,30368,30369,30370,11635,15330,332, 5262, 30374,30376,30379,30385,7070, 30412,317, 439, 30377,15953,317, 30378,5991, 2401, - 9648, 370, 565, 30380,30382,363, 3999, 30381,379, 466, 2077, 317, 30383,30384,18675,5492, 30386,30387,10489,30388,511, 30389,30391,30394,30395,30396,9420, - 7678, 30399,14768,30401,30403,6089, 30406,10489,12864,21303,30390,7044, 30392,11124,30393,11965,5159, 990, 15853,381, 30397,30398,2272, 466, 317, 30400,2022, - 12564,30402,17219,317, 511, 30404,437, 317, 317, 30405,317, 8891, 1230, 362, 2272, 30407,11336,30408,2060, 30409,30410,30411,1160, 6578, 30414,30415,1459, + 30364,5447, 9130, 351, 30366,30367,30368,30369,30370,11635,15330,332, 5262, 30374,30376,30379,30385,7070, 30412,317, 439, 30377,15953,317, 30378,5991, 2401, + 9648, 370, 565, 30380,30382,363, 3999, 30381,379, 466, 2077, 317, 30383,30384,18675,5492, 30386,30387,10489,30388,511, 30389,30391,30394,30395,30396,9420, + 7678, 30399,14768,30401,30403,6089, 30406,10489,12864,21303,30390,7044, 30392,11124,30393,11965,5159, 990, 15853,381, 30397,30398,2272, 466, 317, 30400,2022, + 12564,30402,17219,317, 511, 30404,437, 317, 317, 30405,317, 8891, 1230, 362, 2272, 30407,11336,30408,2060, 30409,30410,30411,1160, 6578, 30414,30415,1459, 30416,317, 317, 317, 317, 1109, 4984, 6263, 30419,317, 30425,30428,30429,30432,30420,30421,9832, 30422,30423,370, 30424,317, 1087, 11089,3031, 2272, 30426, 30427,1526, 350, 317, 30430,404, 30431,6429, 5717, 30434,7916, 490, 317, 317, 30435,5717, 30436,317, 30437,30438,30439,21495,317, 317, 7990, 1481, 30441, 317, 30443,16277,30445,30448,30451,30452,30453,30455,23749,5255, 30214,30444,30446,1347, 8488, 317, 30447,317, 317, 30449,30450,3007, 356, 317, 30454,30456, 20813,30479,30539,30551,30554,30568,30582,30583,350, 30585,30603,30675,30679,30758,30761,30457,30463,30466,30467,5003, 30471,30473,30458,30462,30459,30460,30461, 356, 466, 370, 30464,30465,363, 30468,2155, 317, 30469,5365, 30470,466, 317, 345, 1347, 317, 30472,30474,30475,30476,30477,30478,30480,30485,30502,30508, 30512,30520,30526,30534,30481,30484,30482,30483,4965, 4965, 30486,30487,30493,30498,30500,317, 30488,30491,30489,466, 317, 30490,317, 30492,30494,356, 30495, - 382, 30496,30497,21200,317, 30499,12360,30501,345, 21419,30503,30507,30504,30505,30506,466, 410, 317, 1347, 317, 350, 5097, 30509,30510,30511,466, 363, + 382, 30496,30497,21200,317, 30499,12360,30501,345, 21419,30503,30507,30504,30505,30506,466, 410, 317, 1347, 317, 350, 5097, 30509,30510,30511,466, 363, 5457, 21670,5324, 3854, 317, 317, 30513,30515,30514,5488, 2156, 5717, 30516,30517,30518,30519,5477, 397, 30521,30522,30523,30524,30525,30527,30529,3854, 30528, 317, 1325, 404, 448, 30530,30531,30532,30533,30535,22032,30537,30536,30538,466, 30540,8817, 4980, 30545,30550,317, 350, 317, 30541,30542,21168,5447, 30543, 2510, 382, 30544,5634, 30546,30547,22064,22021,30548,30549,17897,2184, 21485,22064,30552,30553,356, 30555,30560,30565,30567,18587,30556,30557,30558,356, 30559, - 317, 382, 363, 5550, 30561,30564,30562,30563,356, 5113, 2510, 317, 30566,317, 30569,30572,30573,30581,30570,490, 30571,5447, 466, 345, 30574,30575,466, + 317, 382, 363, 5550, 30561,30564,30562,30563,356, 5113, 2510, 317, 30566,317, 30569,30572,30573,30581,30570,490, 30571,5447, 466, 345, 30574,30575,466, 317, 317, 30576,2156, 30577,30578,30579,30580,356, 466, 345, 317, 6036, 2272, 30584,351, 545, 30586,4591, 30587,30588,30589,30592,30597,30600,381, 29396, 2593, 8272, 25503,317, 5742, 30590,30591,30593,30594,30595,30596,30598,30599,30601,8637, 30602,30604,30612,30636,30638,30652,30663,30673,30605,30610,30606,30607, 410, 5991, 466, 317, 1347, 30608,30609,343, 30611,317, 30613,30616,30620,30622,30626,30614,30615,356, 3999, 317, 24726,5167, 30617,5968, 30618,1325, 30619, - 30621,317, 30623,30625,21168,356, 30624,382, 22534,1347, 434, 30627,30635,363, 30628,30630,30629,5717, 498, 30631,30632,30633,30634,10422,466, 317, 5324, - 5226, 393, 370, 317, 30637,5225, 5447, 466, 317, 30639,4788, 30641,30643,10528,30640,30642,5225, 5323, 5717, 30644,30647,30649,30645,30646,14337,466, 317, + 30621,317, 30623,30625,21168,356, 30624,382, 22534,1347, 434, 30627,30635,363, 30628,30630,30629,5717, 498, 30631,30632,30633,30634,10422,466, 317, 5324, + 5226, 393, 370, 317, 30637,5225, 5447, 466, 317, 30639,4788, 30641,30643,10528,30640,30642,5225, 5323, 5717, 30644,30647,30649,30645,30646,14337,466, 317, 373, 5220, 21669,30648,466, 30650,5055, 30651,30653,30658,30660,12662,30654,30655,30656,30657,317, 30659,5225, 10422,466, 317, 8136, 30661,12277,382, 30662, 5054, 21434,30664,30670,30665,30666,317, 317, 5464, 30667,370, 317, 7405, 382, 30668,6496, 30669,30671,30672,22032,30674,30676,30677,30678,30680,30681,30697, 30703,30708,370, 381, 370, 30682,30687,30691,30683,30684,30685,30686,30688,30689,1347, 28918,410, 10422,466, 317, 317, 30690,351, 5457, 9852, 5550, 12958, 30692,30694,30693,30695,30696,29607,370, 30698,29151,30699,317, 30700,30701,30702,26665,317, 30704,30705,356, 30706,382, 30707,30709,30750,30754,30755,30757, - 317, 30710,30711,30719,30720,30722,7801, 30725,18092,30727,30733,30734,30735,30744,30712,26718,30714,30713,30715,30716,30717,30718,30721,30723,30724,30726,432, + 317, 30710,30711,30719,30720,30722,7801, 30725,18092,30727,30733,30734,30735,30744,30712,26718,30714,30713,30715,30716,30717,30718,30721,30723,30724,30726,432, 30728,30729,30730,30731,30732,1588, 21496,30736,6329, 30737,30738,30739,30742,30740,30741,30743,30745,30749,30746,30747,30748,343, 5324, 490, 30751,30752,22802, - 30753,8403, 317, 21393,5201, 2413, 400, 30756,1526, 5226, 30759,2156, 317, 8807, 30760,30762,30763,30764,30765,30767,30768,30774,30776,10480,30794,362, 404, + 30753,8403, 317, 21393,5201, 2413, 400, 30756,1526, 5226, 30759,2156, 317, 8807, 30760,30762,30763,30764,30765,30767,30768,30774,30776,10480,30794,362, 404, 5093, 30795,30796,30798,30799,8172, 9657, 30769,30770,30771,30772,30773,30775,317, 30777,12816,30780,379, 30781,466, 30784,30786,15424,30787,30790,30778,16875, 30779,30782,30783,25458,30785,1347, 350, 2107, 18941,530, 30788,30789,7035, 428, 565, 30791,30792,30793,590, 9450, 5571, 30797,350, 6758, 363, 8612, 30801, 30803,332, 363, 30806,30807,9909, 30810,30802,11749,2203, 11533,30804,30805,30808,30809,30811,317, 30812,30813,30818,30823,30833,30837,30839,30840,30842,30846, - 96, 31294,31298,31318,97, 31681,31696,31719,99, 32154,32165,100, 32476,32479,101, 32873,32874,103, 33320,33328,106, 33602,33609,33612,33614,33661,356, + 96, 31294,31298,31318,97, 31681,31696,31719,99, 32154,32165,100, 32476,32479,101, 32873,32874,103, 33320,33328,106, 33602,33609,33612,33614,33661,356, 356, 30814,23753,30815,30816,30817,30819,30822,30820,30821,10985,30824,30827,30829,30825,30826,317, 30828,30830,30831,30832,30834,30835,30836,620, 30838,30841, 30843,30844,30845,30847,30848,30849,30850,30875,30910,30914,30918,30922,30932,30948,30991,30993,30999,31054,31071,2381, 31109,31110,31172,31197,31225,31257,31277, 31280,31281,31287,30851,30853,30854,30857,30858,30862,30864,30866,30873,317, 30852,5483, 350, 8594, 365, 371, 30855,30856,434, 1444, 30859,30860,317, 30861, 16670,345, 317, 1109, 565, 30863,317, 317, 5840, 30865,5727, 5890, 30867,30868,30872,317, 30869,1109, 965, 30871,30870,317, 12796,317, 12994,317, 30874, - 317, 317, 7834, 5752, 3901, 30876,30884,30891,30896,30897,30900,30907,30877,9695, 30878,8125, 30879,30881,2004, 3529, 317, 30882,30883,317, 476, 30880,332, + 317, 317, 7834, 5752, 3901, 30876,30884,30891,30896,30897,30900,30907,30877,9695, 30878,8125, 30879,30881,2004, 3529, 317, 30882,30883,317, 476, 30880,332, 356, 5727, 317, 30885,30886,30887,30888,30889,30890,30892,1347, 30893,10878,317, 317, 30894,30895,22121,596, 317, 350, 3987, 589, 30898,30899,9695, 10471, 30901,30904,317, 9313, 30902,30903,356, 30905,356, 30906,317, 317, 380, 345, 382, 5488, 30908,5238, 7942, 30909,4788, 317, 596, 317, 8083, 30911,30912, 30913,8392, 2571, 317, 365, 317, 317, 317, 21074,317, 317, 317, 5784, 30915,748, 30916,30917,390, 350, 2156, 363, 551, 11347,5022, 30919,30920,30921, - 1065, 3305, 7495, 30923,30925,363, 30926,30927,317, 317, 30930,317, 30924,596, 4962, 6601, 18839,551, 14535,3079, 12450,317, 317, 30928,2211, 30929,317, + 1065, 3305, 7495, 30923,30925,363, 30926,30927,317, 317, 30930,317, 30924,596, 4962, 6601, 18839,551, 14535,3079, 12450,317, 317, 30928,2211, 30929,317, 30931,317, 30933,608, 317, 30934,11564,30935,30937,30939,30941,317, 317, 30936,30938,466, 3006, 30940,466, 317, 11911,30942,4738, 7192, 30947,30943,30944, 6631, 11652,30945,30946,10538,5105, 30949,2021, 30951,30952,30953,30955,2381, 30958,30984,30986,1588, 317, 353, 30950,2381, 514, 363, 10223,343, 15608,10877, - 5793, 351, 30954,343, 12277,1347, 30956,30957,466, 370, 317, 428, 30959,30962,30965,30966,17775,30967,30969,30970,30974,2571, 30976,2402, 30977,30979,1108, - 5573, 30980,30981,30960,30961,479, 479, 5962, 30963,30964,317, 317, 5223, 317, 316, 16923,551, 30968,11918,351, 501, 345, 10878,30971,30972,30973,317, - 4943, 345, 317, 363, 30975,381, 2369, 1230, 1999, 30978,316, 7942, 1531, 5558, 3124, 4952, 30982,30983,380, 2156, 30985,490, 363, 317, 30987,6228, 317, + 5793, 351, 30954,343, 12277,1347, 30956,30957,466, 370, 317, 428, 30959,30962,30965,30966,17775,30967,30969,30970,30974,2571, 30976,2402, 30977,30979,1108, + 5573, 30980,30981,30960,30961,479, 479, 5962, 30963,30964,317, 317, 5223, 317, 316, 16923,551, 30968,11918,351, 501, 345, 10878,30971,30972,30973,317, + 4943, 345, 317, 363, 30975,381, 2369, 1230, 1999, 30978,316, 7942, 1531, 5558, 3124, 4952, 30982,30983,380, 2156, 30985,490, 363, 317, 30987,6228, 317, 30988,2571, 317, 317, 30989,30990,1345, 2571, 30992,363, 489, 317, 30994,30995,30998,2146, 317, 7678, 5872, 317, 317, 30996,317, 30997,31000,357, 31003, - 31011,31012,31013,490, 31016,31017,31024,10854,351, 31044,31048,4984, 31052,3987, 31053,31001,2134, 317, 393, 31002,13853,5428, 7301, 317, 365, 31004,317, - 31006,11669,31005,320, 31007,317, 637, 31008,1160, 317, 317, 317, 633, 317, 31009,31010,370, 1160, 5483, 8993, 317, 11146,357, 317, 2715, 317, 317, + 31011,31012,31013,490, 31016,31017,31024,10854,351, 31044,31048,4984, 31052,3987, 31053,31001,2134, 317, 393, 31002,13853,5428, 7301, 317, 365, 31004,317, + 31006,11669,31005,320, 31007,317, 637, 31008,1160, 317, 317, 317, 633, 317, 31009,31010,370, 1160, 5483, 8993, 317, 11146,357, 317, 2715, 317, 317, 31014,31015,31018,31022,31023,12199,8296, 317, 31019,317, 5896, 31020,9012, 13686,31021,8274, 371, 31025,633, 31027,1194, 7618, 31030,31032,31033,31037,31043, 31026,31028,332, 317, 317, 31029,317, 31031,5223, 317, 317, 4211, 5205, 9012, 373, 371, 317, 1992, 317, 1358, 5624, 31034,31036,31035,31038,31039,31040, - 31041,31042,31045,31046,4984, 31047,16384,370, 7953, 20969,370, 3529, 351, 31049,363, 317, 31051,345, 317, 31050,12738,6318, 31055,31058,9124, 31059,7834, - 31070,317, 31056,317, 31057,7577, 370, 10454,5570, 426, 31060,31063,2156, 5093, 7797, 31061,31062,31064,343, 31069,31065,1347, 317, 31066,31067,370, 317, - 370, 31068,637, 317, 317, 901, 31072,31075,31076,31078,31080,14062,31081,31082,8301, 31084,2301, 31085,31088,31089,31091,31106,31108,490, 31073,31074,317, - 12684,317, 350, 31077,7477, 1160, 8020, 379, 2808, 380, 5570, 31079,8178, 356, 332, 5662, 9993, 317, 370, 317, 380, 363, 31083,31086,31087,4984, 1160, - 1347, 9649, 31090,574, 350, 31092,4965, 31103,31104,8301, 317, 949, 31093,31094,380, 31097,31102,9630, 31095,31096,31098,1109, 31099,31101,317, 1347, 317, + 31041,31042,31045,31046,4984, 31047,16384,370, 7953, 20969,370, 3529, 351, 31049,363, 317, 31051,345, 317, 31050,12738,6318, 31055,31058,9124, 31059,7834, + 31070,317, 31056,317, 31057,7577, 370, 10454,5570, 426, 31060,31063,2156, 5093, 7797, 31061,31062,31064,343, 31069,31065,1347, 317, 31066,31067,370, 317, + 370, 31068,637, 317, 317, 901, 31072,31075,31076,31078,31080,14062,31081,31082,8301, 31084,2301, 31085,31088,31089,31091,31106,31108,490, 31073,31074,317, + 12684,317, 350, 31077,7477, 1160, 8020, 379, 2808, 380, 5570, 31079,8178, 356, 332, 5662, 9993, 317, 370, 317, 380, 363, 31083,31086,31087,4984, 1160, + 1347, 9649, 31090,574, 350, 31092,4965, 31103,31104,8301, 317, 949, 31093,31094,380, 31097,31102,9630, 31095,31096,31098,1109, 31099,31101,317, 1347, 317, 5441, 31100,7560, 965, 317, 317, 317, 4952, 31105,317, 5890, 31107,31111,31112,31117,31118,357, 31119,31120,31124,31127,31129,31134,31136,31137,31139,31147, - 31149,31151,31155,31165,31168,31171,6917, 16123,1601, 362, 31113,11295,1230, 31114,31115,3726, 317, 31116,5022, 6318, 1230, 317, 6674, 343, 317, 317, 350, + 31149,31151,31155,31165,31168,31171,6917, 16123,1601, 362, 31113,11295,1230, 31114,31115,3726, 317, 31116,5022, 6318, 1230, 317, 6674, 343, 317, 317, 350, 9246, 12696,362, 1347, 521, 370, 317, 356, 554, 13376,10583,317, 1358, 2110, 28594,31121,31122,6607, 2381, 317, 317, 31123,317, 6651, 317, 31125,31126, - 317, 31128,1347, 14981,31130,15367,362, 31131,16941,7928, 1444, 31132,5687, 31133,490, 317, 31135,345, 343, 345, 439, 31138,363, 605, 317, 4943, 317, - 345, 317, 22908,8301, 10812,31140,31142,31023,31143,31144,31145,550, 439, 31141,490, 14606,16137,5809, 578, 31146,5332, 7063, 31148,554, 10956,427, 5809, - 380, 317, 6578, 317, 31150,1358, 1065, 15566,31152,355, 351, 31153,31154,31156,31157,31159,31161,31163,317, 385, 317, 317, 5561, 380, 10590,1358, 2322, - 31158,1347, 317, 317, 317, 351, 380, 31160,351, 4925, 317, 31162,317, 31164,390, 10520,31166,2022, 363, 31167,5991, 516, 31169,466, 362, 31170,317, - 24398,466, 5328, 13648,31173,31180,31182,384, 343, 9298, 6063, 31186,31190,6937, 317, 511, 31174,31175,31176,23266,31177,5250, 317, 332, 5412, 596, 6207, + 317, 31128,1347, 14981,31130,15367,362, 31131,16941,7928, 1444, 31132,5687, 31133,490, 317, 31135,345, 343, 345, 439, 31138,363, 605, 317, 4943, 317, + 345, 317, 22908,8301, 10812,31140,31142,31023,31143,31144,31145,550, 439, 31141,490, 14606,16137,5809, 578, 31146,5332, 7063, 31148,554, 10956,427, 5809, + 380, 317, 6578, 317, 31150,1358, 1065, 15566,31152,355, 351, 31153,31154,31156,31157,31159,31161,31163,317, 385, 317, 317, 5561, 380, 10590,1358, 2322, + 31158,1347, 317, 317, 317, 351, 380, 31160,351, 4925, 317, 31162,317, 31164,390, 10520,31166,2022, 363, 31167,5991, 516, 31169,466, 362, 31170,317, + 24398,466, 5328, 13648,31173,31180,31182,384, 343, 9298, 6063, 31186,31190,6937, 317, 511, 31174,31175,31176,23266,31177,5250, 317, 332, 5412, 596, 6207, 31178,31179,317, 31181,605, 390, 31183,31184,381, 31185,9482, 356, 466, 317, 31187,2117, 31188,350, 28525,2586, 2586, 31189,317, 317, 31191,13914,27951, 31192,31193,31194,31195,362, 539, 2272, 16620,317, 317, 14462,317, 381, 2063, 363, 317, 6108, 382, 31196,31198,31201,31203,31204,31205,15334,27497,31206, 31210,9779, 5087, 31217,31220,31221,31222,2631, 357, 31223,6817, 6409, 7428, 317, 31199,6050, 397, 1347, 31200,370, 427, 5201, 370, 384, 2107, 31202,21303, - 2116, 23306,4396, 384, 382, 317, 379, 8148, 317, 354, 31207,317, 5742, 558, 317, 7695, 31208,317, 10172,6089, 466, 31209,317, 439, 476, 317, 490, + 2116, 23306,4396, 384, 382, 317, 379, 8148, 317, 354, 31207,317, 5742, 558, 317, 7695, 31208,317, 10172,6089, 466, 31209,317, 439, 476, 317, 490, 31211,317, 31212,574, 9832, 31213,6355, 31214,317, 31215,31216,31218,31219,7314, 553, 382, 3621, 390, 31224,382, 1588, 1160, 2184, 317, 381, 31226,31228, 15334,31231,31232,31234,31243,2134, 31246,31247,31248,31255,31256,317, 31227,404, 343, 7911, 345, 31229,350, 317, 31230,31233,31235,345, 31236,3751, 31237, - 317, 31241,31242,31238,13177,14832,317, 31239,317, 317, 31240,7590, 14610,356, 466, 2571, 317, 317, 15618,343, 490, 31244,31245,317, 10820,29142,2116, + 317, 31241,31242,31238,13177,14832,317, 31239,317, 317, 31240,7590, 14610,356, 466, 2571, 317, 317, 15618,343, 490, 31244,31245,317, 10820,29142,2116, 31249,343, 31250,539, 31253,31251,31252,31254,362, 317, 345, 351, 5343, 31258,31260,31263,31265,31274,31276,31259,6382, 748, 31261,31262,4984, 2178, 31264, - 2381, 8722, 31266,31270,9482, 1325, 31267,317, 382, 31268,31269,5343, 317, 31271,9482, 356, 31272,317, 382, 31273,1347, 5343, 31275,317, 2732, 2116, 428, + 2381, 8722, 31266,31270,9482, 1325, 31267,317, 382, 31268,31269,5343, 317, 31271,9482, 356, 31272,317, 382, 31273,1347, 5343, 31275,317, 2732, 2116, 428, 31278,31279,2184, 317, 404, 350, 365, 6036, 370, 5464, 466, 363, 31282,31283,31284,10056,2146, 343, 343, 404, 317, 317, 31285,31286,380, 31288,31290, 317, 31291,348, 31289,317, 16092,490, 2178, 31292,2272, 31293,317, 31295,490, 31296,31297,31299,31300,31305,31309,31311,31317,31301,31302,478, 31303,31304, 31306,490, 31307,31308,31310,31312,31313,31314,31315,31316,317, 31319,31323,339, 31324,31325,31326,317, 4253, 31330,4090, 31320,31321,31322,31327,317, 31328, 31329,17774,31331,17274,17274,31333,31350,31360,31368,31390,31399,31401,31406,31410,16220,31427,31429,31477,31486,31528,31533,98, 31632,31646,31660,31671,31674, 31676,31679,31332,317, 31334,31336,9609, 2146, 31337,31340,31341,2322, 2134, 31349,31335,363, 5055, 15745,10283,379, 28650,466, 31338,343, 31339,363, 16931, - 317, 317, 2022, 605, 380, 6270, 16802,31342,317, 31346,31343,31344,317, 356, 15852,3529, 31345,11803,317, 31347,31348,466, 317, 2571, 317, 5689, 317, - 619, 31351,596, 317, 31353,345, 317, 31352,1347, 373, 31354,31355,31356,31357,31358,31359,31361,345, 31362,31364,31365,31366,351, 350, 31363,12731,382, + 317, 317, 2022, 605, 380, 6270, 16802,31342,317, 31346,31343,31344,317, 356, 15852,3529, 31345,11803,317, 31347,31348,466, 317, 2571, 317, 5689, 317, + 619, 31351,596, 317, 31353,345, 317, 31352,1347, 373, 31354,31355,31356,31357,31358,31359,31361,345, 31362,31364,31365,31366,351, 350, 31363,12731,382, 350, 31367,31369,31370,31373,31384,350, 31385,2391, 317, 31389,317, 501, 527, 31371,31372,317, 1358, 31374,490, 317, 8099, 31375,351, 31380,31381,12514, 343, 31383,31376,31377,31379,10196,1347, 31378,370, 317, 5250, 1526, 31382,317, 8275, 31386,8281, 317, 31387,371, 605, 5611, 7116, 31388,10317,7521, 19913, - 31391,31392,31394,596, 31395,9609, 31396,31397,2222, 1347, 31398,5960, 2510, 9648, 343, 31393,7688, 363, 448, 370, 317, 15913,6089, 9648, 343, 317, 317, - 363, 6036, 15772,317, 384, 381, 317, 351, 31400,6761, 31402,3078, 31403,317, 31404,8925, 31405,351, 31407,11040,31408,12704,362, 15461,31409,343, 362, + 31391,31392,31394,596, 31395,9609, 31396,31397,2222, 1347, 31398,5960, 2510, 9648, 343, 31393,7688, 363, 448, 370, 317, 15913,6089, 9648, 343, 317, 317, + 363, 6036, 15772,317, 384, 381, 317, 351, 31400,6761, 31402,3078, 31403,317, 31404,8925, 31405,351, 31407,11040,31408,12704,362, 15461,31409,343, 362, 317, 5626, 2219, 15459,31411,31414,31416,2066, 6394, 31420,9609, 31421,7490, 31424,31426,31412,31413,31415,362, 3236, 31417,31419,5273, 317, 31418,5626, 11613, 4965, 31422,381, 12696,4982, 362, 9012, 31423,4949, 17889,31425,351, 23018,350, 317, 7579, 317, 31428,31430,31431,31434,31435,31446,31447,31448,31458,31459, 31467,31468,345, 31471,31473,31476,350, 14806,31432,31433,2222, 7657, 317, 5896, 31436,31437,31439,31440,350, 31444,31445,7949, 31438,10580,351, 13300,31441, - 2236, 4984, 31442,31443,565, 2310, 5241, 7306, 20552,31449,345, 490, 31453,317, 8529, 31454,317, 31455,31457,5328, 8357, 31450,317, 11680,31451,363, 2272, - 31452,6228, 317, 2631, 31456,13760,12731,3079, 350, 317, 31460,31461,13670,31463,362, 350, 31465,317, 1347, 345, 317, 2537, 317, 362, 31462,1347, 345, - 9059, 317, 31464,317, 31466,345, 9139, 363, 381, 558, 31469,31470,317, 317, 317, 345, 4591, 31472,350, 339, 343, 363, 1526, 31474,554, 5662, 350, + 2236, 4984, 31442,31443,565, 2310, 5241, 7306, 20552,31449,345, 490, 31453,317, 8529, 31454,317, 31455,31457,5328, 8357, 31450,317, 11680,31451,363, 2272, + 31452,6228, 317, 2631, 31456,13760,12731,3079, 350, 317, 31460,31461,13670,31463,362, 350, 31465,317, 1347, 345, 317, 2537, 317, 362, 31462,1347, 345, + 9059, 317, 31464,317, 31466,345, 9139, 363, 381, 558, 31469,31470,317, 317, 317, 345, 4591, 31472,350, 339, 343, 363, 1526, 31474,554, 5662, 350, 363, 317, 345, 317, 317, 31475,317, 317, 31478,31479,31481,22724,31485,2627, 351, 31480,317, 31482,317, 31483,31484,5250, 5488, 1998, 31487,31492,31496, 31503,31506,317, 31507,2171, 31508,31515,31517,31519,31525,31527,31488,31490,31491,317, 317, 2271, 31489,317, 380, 13300,6394, 317, 382, 31493,7871, 31495, - 2391, 317, 317, 31494,6996, 4980, 2551, 6036, 390, 345, 31497,31498,31501,31499,31500,31502,351, 350, 31504,5624, 31505,5055, 343, 345, 2171, 404, 317, + 2391, 317, 317, 31494,6996, 4980, 2551, 6036, 390, 345, 31497,31498,31501,31499,31500,31502,351, 350, 31504,5624, 31505,5055, 343, 345, 2171, 404, 317, 439, 370, 363, 31509,31511,31512,7949, 31158,490, 4984, 31510,10538,317, 317, 9420, 2219, 10538,31513,31514,396, 11339,31516,31518,380, 343, 31520,31521, 31522,31523,31524,31526,317, 363, 2571, 317, 31529,7384, 31530,31531,31532,31534,31537,4925, 31539,31546,31553,31559,31561,31562,31563,31567,31573,31584,31587, - 31623,31624,31630,31631,332, 317, 31535,9525, 31536,351, 31538,9644, 31540,31545,332, 317, 317, 31541,31542,31543,31544,2387, 317, 3751, 558, 1230, 2110, + 31623,31624,31630,31631,332, 317, 31535,9525, 31536,351, 31538,9644, 31540,31545,332, 317, 317, 31541,31542,31543,31544,2387, 317, 3751, 558, 1230, 2110, 380, 31547,317, 317, 31548,365, 1108, 317, 317, 31549,317, 31550,31551,31552,31554,31555,9702, 343, 2551, 31558,317, 490, 404, 317, 31556,404, 31557, - 2551, 29848,317, 31560,6402, 317, 380, 14415,439, 2003, 31564,317, 31565,31566,31568,31570,31572,12142,31569,317, 31571,317, 1601, 1109, 8271, 31574,5896, - 31578,31579,31580,31581,605, 31582,15334,6089, 317, 12920,356, 31575,317, 381, 31576,317, 31577,2035, 1160, 317, 373, 1108, 9182, 9525, 317, 9244, 350, + 2551, 29848,317, 31560,6402, 317, 380, 14415,439, 2003, 31564,317, 31565,31566,31568,31570,31572,12142,31569,317, 31571,317, 1601, 1109, 8271, 31574,5896, + 31578,31579,31580,31581,605, 31582,15334,6089, 317, 12920,356, 31575,317, 381, 31576,317, 31577,2035, 1160, 317, 373, 1108, 9182, 9525, 317, 9244, 350, 31583,3006, 426, 31585,1358, 1108, 317, 1358, 31586,7834, 370, 31588,31597,31601,31607,31618,31622,31589,18537,31590,21522,31591,317, 31593,31596,317, 31592, - 11295,31594,31595,8357, 317, 317, 317, 317, 317, 317, 317, 365, 317, 317, 317, 5687, 317, 317, 558, 31598,317, 2110, 5105, 9095, 31599,31600,2110, + 11295,31594,31595,8357, 317, 317, 317, 317, 317, 317, 317, 365, 317, 317, 317, 5687, 317, 317, 558, 31598,317, 2110, 5105, 9095, 31599,31600,2110, 317, 317, 5120, 370, 7785, 31602,5570, 380, 362, 31604,31606,6578, 6917, 317, 31603,317, 317, 31605,317, 31608,31612,317, 31614,6278, 345, 31616,31609, - 31610,31611,31613,31615,31617,8841, 9422, 31619,317, 5439, 31620,31621,490, 4591, 12151,466, 362, 363, 350, 350, 380, 317, 31625,317, 317, 31626,489, + 31610,31611,31613,31615,31617,8841, 9422, 31619,317, 5439, 31620,31621,490, 4591, 12151,466, 362, 363, 350, 350, 380, 317, 31625,317, 317, 31626,489, 317, 31627,31628,370, 31629,5225, 9124, 466, 2551, 2142, 14433,422, 965, 31633,317, 332, 350, 2609, 10629,31635,31637,345, 31634,317, 971, 2405, 31636, 350, 317, 3243, 317, 31638,31639,31641,31645,7384, 31640,9325, 317, 5200, 345, 31642,31643,31644,5105, 31647,5447, 31649,31652,350, 2402, 8099, 31655,31659, - 2222, 31648,5464, 466, 332, 31650,31651,2206, 2067, 31653,390, 31654,637, 633, 345, 5343, 31656,31658,317, 31657,317, 16187,370, 362, 2206, 317, 471, - 31661,31664,2568, 31669,31670,1108, 31662,356, 466, 317, 5342, 31663,31665,31666,9012, 31667,2108, 4949, 479, 31668,31672,382, 578, 433, 31673,31675,2571, + 2222, 31648,5464, 466, 332, 31650,31651,2206, 2067, 31653,390, 31654,637, 633, 345, 5343, 31656,31658,317, 31657,317, 16187,370, 362, 2206, 317, 471, + 31661,31664,2568, 31669,31670,1108, 31662,356, 466, 317, 5342, 31663,31665,31666,9012, 31667,2108, 4949, 479, 31668,31672,382, 578, 433, 31673,31675,2571, 380, 317, 381, 31677,317, 350, 450, 11825,31678,6829, 31680,619, 31682,31687,31691,490, 31693,317, 31683,31684,31685,31686,31688,317, 31689,317, 31690, 31692,31694,2233, 31695,31697,31700,31704,31715,31716,31698,31699,31701,31703,2464, 31702,31705,31707,31710,31706,31708,31709,31711,31712,31713,31714,31717,31718, 31720,31721,31723,31725,31726,31731,31733,31736,490, 608, 606, 31722,31724,31727,31728,31729,31730,1065, 396, 31732,31734,31735,31737,31738,31739,31740,31748, - 31765,31783,31794,31818,31827,31856,31857,2156, 31859,31903,31906,31982,32000,32003,32005,32063,32100,32141,32147,384, 32149,32152,31741,31743,31744,31746,357, + 31765,31783,31794,31818,31827,31856,31857,2156, 31859,31903,31906,31982,32000,32003,32005,32063,32100,32141,32147,384, 32149,32152,31741,31743,31744,31746,357, 332, 31742,317, 332, 23624,6294, 31745,490, 31747,317, 11249,31749,31752,31754,317, 2381, 31750,31751,317, 31753,31750,31755,31758,31756,31757,31759,31760, - 31763,2163, 345, 31761,31762,31764,19850,2078, 31766,31767,31769,31774,31776,345, 6547, 31768,345, 31770,8178, 31771,31772,317, 31773,317, 317, 5223, 317, - 381, 31775,31777,31778,6108, 343, 31779,317, 317, 317, 31780,317, 31781,31782,1526, 1526, 31784,31785,31787,31790,350, 31791,15017,31792,31786,23076,317, - 31788,350, 1100, 317, 31789,317, 31793,31795,31798,31799,31803,2134, 31804,31809,31810,31814,31816,31796,31797,349, 1358, 350, 31800,31802,31801,11619,317, + 31763,2163, 345, 31761,31762,31764,19850,2078, 31766,31767,31769,31774,31776,345, 6547, 31768,345, 31770,8178, 31771,31772,317, 31773,317, 317, 5223, 317, + 381, 31775,31777,31778,6108, 343, 31779,317, 317, 317, 31780,317, 31781,31782,1526, 1526, 31784,31785,31787,31790,350, 31791,15017,31792,31786,23076,317, + 31788,350, 1100, 317, 31789,317, 31793,31795,31798,31799,31803,2134, 31804,31809,31810,31814,31816,31796,31797,349, 1358, 350, 31800,31802,31801,11619,317, 31805,317, 317, 31806,7401, 466, 362, 31807,10276,12423,363, 31808,3007, 2272, 31673,317, 596, 317, 31811,384, 343, 31813,317, 17368,5223, 317, 31812, 363, 5028, 31815,373, 11357,371, 31817,427, 2134, 31819,4965, 22157,31822,317, 31823,31820,31821,1939, 681, 31824,1347, 28691,31826,31825,31828,317, 31830, - 31832,31835,2134, 31841,3854, 20610,317, 15334,31843,554, 31829,317, 2317, 317, 317, 31831,31833,31834,317, 5487, 1033, 31836,317, 31837,15646,31839,363, - 317, 31838,31840,351, 6036, 31842,31844,31850,31845,31848,31846,1347, 31847,332, 393, 1347, 490, 31849,19287,31851,31853,31854,490, 3284, 317, 31852,317, - 317, 16137,6402, 317, 31855,31858,10373,31860,31867,31868,332, 31871,31872,31886,31887,31892,31896,12796,31898,31899,31902,501, 317, 31861,317, 31864,317, - 31866,31862,31863,13676,31865,317, 19570,14708,479, 317, 1347, 31869,317, 31870,317, 6166, 317, 31873,31874,31875,15334,31876,10878,31877,31878,345, 5822, + 31832,31835,2134, 31841,3854, 20610,317, 15334,31843,554, 31829,317, 2317, 317, 317, 31831,31833,31834,317, 5487, 1033, 31836,317, 31837,15646,31839,363, + 317, 31838,31840,351, 6036, 31842,31844,31850,31845,31848,31846,1347, 31847,332, 393, 1347, 490, 31849,19287,31851,31853,31854,490, 3284, 317, 31852,317, + 317, 16137,6402, 317, 31855,31858,10373,31860,31867,31868,332, 31871,31872,31886,31887,31892,31896,12796,31898,31899,31902,501, 317, 31861,317, 31864,317, + 31866,31862,31863,13676,31865,317, 19570,14708,479, 317, 1347, 31869,317, 31870,317, 6166, 317, 31873,31874,31875,15334,31876,10878,31877,31878,345, 5822, 9609, 2291, 363, 31879,31880,31881,31883,3284, 371, 6159, 31882,15464,31884,31885,596, 365, 12943,31888,5159, 31889,9420, 4984, 3869, 317, 12027,317, 13894, 317, 1347, 317, 345, 31890,363, 317, 31891,351, 554, 427, 317, 5225, 5991, 14062,31893,31894,31895,28337,15960,28335,317, 343, 3710, 9699, 10506,31897, 2612, 317, 5240, 4789, 4738, 363, 31900,31901,363, 5488, 590, 5273, 31904,31905,5392, 5266, 31907,31918,31920,31922,31929,26065,31933,31946,31951,31962,31965, 31969,490, 31973,31978,31979,543, 31981,373, 31908,2171, 31914,317, 7399, 317, 317, 317, 1347, 31909,31912,370, 317, 31910,31911,31913,370, 10674,31915, 11504,31916,31917,2510, 382, 31919,317, 380, 31921,317, 317, 427, 9450, 2022, 362, 427, 317, 31923,2510, 8948, 9648, 31928,343, 385, 317, 345, 31924, - 31925,31926,31927,370, 9557, 466, 317, 5896, 317, 26065,362, 31930,362, 2571, 385, 31931,31932,2715, 317, 31934,31935,31945,31936,317, 31937,356, 385, + 31925,31926,31927,370, 9557, 466, 317, 5896, 317, 26065,362, 31930,362, 2571, 385, 31931,31932,2715, 317, 31934,31935,31945,31936,317, 31937,356, 385, 466, 362, 20937,31938,31943,7921, 466, 550, 31939,31941,31940,31942,363, 31944,345, 2067, 16972,433, 362, 382, 31947,14236,2537, 26663,31948,31949,31950, - 31952,31954,31960,317, 31953,31955,31956,362, 28434,31957,31958,31959,31961,317, 317, 9012, 317, 31963,370, 31964,7214, 5022, 31966,31968,15983,4974, 317, + 31952,31954,31960,317, 31953,31955,31956,362, 28434,31957,31958,31959,31961,317, 317, 9012, 317, 31963,370, 31964,7214, 5022, 31966,31968,15983,4974, 317, 317, 317, 26065,5419, 5105, 2171, 317, 31967,317, 10351,317, 362, 490, 317, 390, 31970,490, 363, 31971,31972,7055, 31974,545, 31977,31975,31976,31980, - 5428, 31983,31984,317, 31993,31985,31987,31988,31991,8766, 31986,18125,31989,2715, 31990,7384, 490, 6458, 7954, 31992,31994,31995,31996,31997,31998,31999,345, - 32001,317, 32002,317, 32004,317, 6415, 32006,10877,32039,32040,32041,32043,5439, 32048,390, 32062,32007,633, 672, 928, 8381, 32008,32014,32017,32018,2063, + 5428, 31983,31984,317, 31993,31985,31987,31988,31991,8766, 31986,18125,31989,2715, 31990,7384, 490, 6458, 7954, 31992,31994,31995,31996,31997,31998,31999,345, + 32001,317, 32002,317, 32004,317, 6415, 32006,10877,32039,32040,32041,32043,5439, 32048,390, 32062,32007,633, 672, 928, 8381, 32008,32014,32017,32018,2063, 32023,514, 2301, 32026,5017, 32027,32029,32033,32035,32009,14285,32010,32012,4952, 382, 4564, 343, 4943, 32011,381, 32013,1078, 317, 381, 32015,32016,16790, - 5765, 382, 32019,32022,316, 32020,32021,596, 1160, 32024,32025,343, 8522, 7314, 363, 32028,8047, 13020,5709, 382, 2261, 32030,32031,1020, 2272, 32032,1358, - 1030, 32034,32036,1588, 32038,32037,6917, 356, 5962, 32042,351, 363, 370, 2571, 317, 345, 14062,32044,317, 32045,32046,32047,12864,32049,32050,317, 5087, + 5765, 382, 32019,32022,316, 32020,32021,596, 1160, 32024,32025,343, 8522, 7314, 363, 32028,8047, 13020,5709, 382, 2261, 32030,32031,1020, 2272, 32032,1358, + 1030, 32034,32036,1588, 32038,32037,6917, 356, 5962, 32042,351, 363, 370, 2571, 317, 345, 14062,32044,317, 32045,32046,32047,12864,32049,32050,317, 5087, 8948, 20393,4952, 370, 32060,4980, 2948, 32051,32052,32053,32054,32055,32056,32057,32058,32059,32061,32064,32065,32071,350, 32072,32089,10185,350, 32091,32097, - 32066,10234,32068,345, 32067,466, 32069,32070,31236,2222, 362, 2108, 1020, 1347, 317, 2715, 22090,633, 32073,12616,32077,32080,20865,32081,32082,32084,7921, - 32085,539, 363, 32087,32088,16277,1160, 32074,32075,32076,14341,371, 381, 4943, 343, 380, 317, 356, 317, 5105, 32078,317, 343, 317, 596, 32079,317, - 317, 514, 4738, 2063, 370, 355, 9696, 1347, 32083,363, 32086,32090,32092,32093,2178, 32094,32095,32096,317, 20388,317, 5991, 32098,466, 350, 317, 2381, + 32066,10234,32068,345, 32067,466, 32069,32070,31236,2222, 362, 2108, 1020, 1347, 317, 2715, 22090,633, 32073,12616,32077,32080,20865,32081,32082,32084,7921, + 32085,539, 363, 32087,32088,16277,1160, 32074,32075,32076,14341,371, 381, 4943, 343, 380, 317, 356, 317, 5105, 32078,317, 343, 317, 596, 32079,317, + 317, 514, 4738, 2063, 370, 355, 9696, 1347, 32083,363, 32086,32090,32092,32093,2178, 32094,32095,32096,317, 20388,317, 5991, 32098,466, 350, 317, 2381, 530, 32099,32101,32102,317, 32106,32108,1020, 32109,317, 317, 32110,32111,32115,32103,7911, 32104,32105,551, 10820,32107,317, 24130,351, 32106,4984, 32112, 32113,343, 363, 317, 317, 317, 317, 2222, 381, 32114,29666,7622, 32116,32117,32123,32125,343, 16187,32126,350, 32105,32130,32133,32136,317, 317, 27865, - 32118,32121,32119,32120,355, 2134, 32122,32124,4943, 448, 17725,32127,350, 32129,32128,32131,370, 32132,32134,32135,3640, 3079, 32137,32139,32138,350, 516, - 350, 32140,32142,2110, 32143,32144,32145,32146,317, 32148,740, 389, 12151,4982, 13338,3605, 317, 28337,32150,12925,32151,22534,373, 365, 30478,332, 9649, + 32118,32121,32119,32120,355, 2134, 32122,32124,4943, 448, 17725,32127,350, 32129,32128,32131,370, 32132,32134,32135,3640, 3079, 32137,32139,32138,350, 516, + 350, 32140,32142,2110, 32143,32144,32145,32146,317, 32148,740, 389, 12151,4982, 13338,3605, 317, 28337,32150,12925,32151,22534,373, 365, 30478,332, 9649, 7949, 362, 351, 1481, 32153,11324,32155,32156,32157,32160,32163,356, 14263,6563, 32158,32159,32161,32162,32164,32166,32170,32173,32178,32185,32188,32192,32167, 32168,32169,608, 32171,32172,607, 396, 781, 949, 32174,32175,32176,32177,6581, 32179,19278,32180,32181,32182,32183,32184,32186,32187,32189,32190,32191,31735, 32193,32195,32204,32194,396, 32196,32197,32203,32198,32199,32200,390, 317, 317, 32201,32202,317, 6590, 612, 607, 396, 32205,32272,32274,32276,32330,32333, @@ -8244,224 +8239,224 @@ static const unsigned int ChildLocs[185261] = 19187,434, 397, 501, 317, 2184, 317, 317, 8136, 466, 343, 317, 317, 439, 32220,32222,32227,32229,32231,32232,10471,32221,6673, 2368, 317, 8301, 32223, 363, 317, 317, 32224,32225,32226,32228,317, 9595, 5611, 317, 32230,5457, 382, 5226, 32233,32235,11211,32236,9832, 2348, 32237,32239,9931, 22466,370, 32238, 466, 317, 2348, 32240,2348, 5960, 32242,317, 32244,1347, 6228, 317, 651, 317, 32245,21318,12925,32247,317, 466, 22559,14501,539, 32249,317, 32246,14303, - 382, 32248,590, 32251,12696,32252,32253,13338,32255,2571, 317, 18211,317, 32256,32259,32260,356, 2631, 11089,389, 389, 3869, 32254,11229,370, 25651,317, - 32257,1060, 317, 5273, 32258,5367, 317, 1588, 32261,3125, 2997, 1998, 511, 419, 317, 32263,32264,317, 32266,32268,32269,345, 380, 32267,4984, 317, 317, + 382, 32248,590, 32251,12696,32252,32253,13338,32255,2571, 317, 18211,317, 32256,32259,32260,356, 2631, 11089,389, 389, 3869, 32254,11229,370, 25651,317, + 32257,1060, 317, 5273, 32258,5367, 317, 1588, 32261,3125, 2997, 1998, 511, 419, 317, 32263,32264,317, 32266,32268,32269,345, 380, 32267,4984, 317, 317, 345, 17868,32270,6013, 356, 379, 10877,317, 356, 6668, 317, 32273,32275,317, 32277,5866, 32280,32284,32288,32291,32292,32293,32300,32304,32307,345, 32312, 32314,32317,350, 32324,32328,32278,373, 317, 317, 32279,32281,32282,419, 1347, 4965, 10081,32283,596, 317, 317, 10546,32285,32287,32286,1325, 466, 27846, - 343, 32289,466, 1347, 362, 12199,317, 317, 32290,466, 317, 16058,380, 380, 6917, 317, 32294,32299,32295,32298,350, 32296,16129,351, 32297,5662, 350, - 345, 345, 362, 32301,32302,32303,32305,32306,3079, 6717, 8189, 351, 10877,5055, 32308,2188, 351, 2102, 32309,32310,7910, 32311,351, 2102, 370, 343, 8301, + 343, 32289,466, 1347, 362, 12199,317, 317, 32290,466, 317, 16058,380, 380, 6917, 317, 32294,32299,32295,32298,350, 32296,16129,351, 32297,5662, 350, + 345, 345, 362, 32301,32302,32303,32305,32306,3079, 6717, 8189, 351, 10877,5055, 32308,2188, 351, 2102, 32309,32310,7910, 32311,351, 2102, 370, 343, 8301, 27303,32313,350, 2568, 3869, 5991, 362, 350, 317, 317, 32315,345, 350, 317, 32316,32318,32319,2369, 32321,317, 345, 317, 32320,4591, 32322,32323,32325, - 32326,32327,5991, 32329,350, 351, 361, 22508,21417,382, 363, 7386, 32331,32332,410, 32334,32337,32340,32343,32344,32351,32355,32358,32359,371, 32335,317, - 32336,12704,350, 317, 317, 32338,2298, 15618,317, 32339,351, 32341,32342,20492,370, 32345,2188, 11613,317, 2222, 6684, 32347,32346,317, 7698, 356, 466, + 32326,32327,5991, 32329,350, 351, 361, 22508,21417,382, 363, 7386, 32331,32332,410, 32334,32337,32340,32343,32344,32351,32355,32358,32359,371, 32335,317, + 32336,12704,350, 317, 317, 32338,2298, 15618,317, 32339,351, 32341,32342,20492,370, 32345,2188, 11613,317, 2222, 6684, 32347,32346,317, 7698, 356, 466, 427, 317, 2584, 12993,8301, 32348,2609, 32349,32350,351, 32352,10664,3529, 32353,12417,589, 32354,3999, 317, 317, 32356,32357,356, 466, 317, 317, 20920, - 2108, 32360,351, 466, 363, 32362,32364,32367,32368,32371,351, 317, 317, 32373,32384,32385,32402,32404,32406,32412,32415,317, 32363,5991, 3999, 6186, 317, + 2108, 32360,351, 466, 363, 32362,32364,32367,32368,32371,351, 317, 317, 32373,32384,32385,32402,32404,32406,32412,32415,317, 32363,5991, 3999, 6186, 317, 332, 317, 32365,32366,5159, 466, 317, 501, 363, 362, 32369,317, 32370,343, 32372,32374,317, 32381,370, 356, 3787, 466, 32375,32377,317, 32379,32376, - 22561,317, 32378,32380,2509, 317, 32382,1325, 466, 32383,428, 11263,7401, 14716,1345, 32386,8639, 32387,32393,13638,1347, 2058, 2036, 317, 317, 9095, 317, + 22561,317, 32378,32380,2509, 317, 32382,1325, 466, 32383,428, 11263,7401, 14716,1345, 32386,8639, 32387,32393,13638,1347, 2058, 2036, 317, 317, 9095, 317, 317, 317, 32388,32392,27456,317, 317, 32389,332, 317, 317, 32390,317, 32391,490, 5104, 32394,32398,32399,32400,317, 32401,32395,317, 317, 32396,32397, 5942, 5419, 317, 2368, 7242, 317, 32403,10114,317, 32405,5926, 554, 317, 32407,32409,32408,32410,32411,370, 370, 370, 32413,466, 317, 317, 317, 32414, 6996, 317, 356, 466, 5942, 317, 12719,2334, 32418,1325, 32420,32423,32425,32427,32428,22724,32431,32435,32437,32447,32448,32449,498, 32450,345, 317, 32419, 371, 32421,6645, 21864,32422,32424,32426,427, 16623,514, 19187,362, 32429,381, 32430,317, 32432,32434,350, 32433,317, 32436,32438,32446,32439,32443,32445, 32440,32441,32442,363, 5190, 32444,343, 343, 342, 7858, 12761,11504,421, 14644,317, 32452,2895, 32453,32454,32455,32456,32457,32459,32460,32461,32464,32467, - 32469,5575, 32470,362, 32472,32473,2063, 342, 32474,32475,883, 373, 1230, 17565,317, 32462,32463,32465,317, 32466,317, 649, 633, 32468,32471,3742, 317, + 32469,5575, 32470,362, 32472,32473,2063, 342, 32474,32475,883, 373, 1230, 17565,317, 32462,32463,32465,317, 32466,317, 649, 633, 32468,32471,3742, 317, 317, 370, 2301, 3652, 32477,373, 363, 365, 32478,32480,490, 551, 32481,32482,32483,32484,32486,32487,32492,32496,32506,6780, 32516,32520,32521,32548,32552, - 32585,32616,102, 32793,32809,32821,2081, 32852,32854,32871,32872,9720, 32485,356, 317, 5105, 5223, 317, 32488,32489,4965, 466, 350, 317, 32490,317, 5464, + 32585,32616,102, 32793,32809,32821,2081, 32852,32854,32871,32872,9720, 32485,356, 317, 5105, 5223, 317, 32488,32489,4965, 466, 350, 317, 32490,317, 5464, 466, 32491,7095, 32493,32494,343, 2571, 351, 351, 11398,317, 32495,32497,32498,32500,32501,7940, 4591, 32499,32502,11147,14084,32503,32504,32505,32507,32508, 32511,32513,32514,317, 317, 317, 345, 32509,32510,362, 6601, 404, 356, 32512,317, 317, 381, 479, 32515,5611, 362, 317, 5623, 317, 6394, 32517,32518, - 32519,317, 5464, 466, 317, 11249,317, 32522,32523,370, 32524,490, 32525,32527,32535,14865,32545,32546,32547,317, 410, 31806,466, 317, 351, 2510, 1588, - 32526,317, 1347, 5570, 332, 8488, 343, 317, 5536, 32528,3079, 32529,362, 350, 32533,20682,32534,1347, 11116,16138,511, 533, 32530,32531,317, 32532,4738, - 10877,317, 32536,32539,32540,16825,32542,317, 32537,317, 32538,317, 317, 10820,317, 551, 32541,1347, 317, 317, 317, 2156, 10408,32543,32544,9648, 343, + 32519,317, 5464, 466, 317, 11249,317, 32522,32523,370, 32524,490, 32525,32527,32535,14865,32545,32546,32547,317, 410, 31806,466, 317, 351, 2510, 1588, + 32526,317, 1347, 5570, 332, 8488, 343, 317, 5536, 32528,3079, 32529,362, 350, 32533,20682,32534,1347, 11116,16138,511, 533, 32530,32531,317, 32532,4738, + 10877,317, 32536,32539,32540,16825,32542,317, 32537,317, 32538,317, 317, 10820,317, 551, 32541,1347, 317, 317, 317, 2156, 10408,32543,32544,9648, 343, 317, 1060, 317, 380, 1347, 406, 428, 370, 32549,18333,5428, 32550,32551,32553,32554,32558,32559,8440, 32566,32569,32570,32572,490, 5037, 15571,32555,31675, 32556,2571, 5926, 32557,317, 343, 317, 343, 5226, 317, 10196,363, 1479, 317, 10832,317, 32560,32563,32561,317, 32562,32564,32565,32567,317, 32568,32571, 19287,490, 32573,32581,8023, 32584,11921,317, 345, 32574,32578,32575,32576,32577,317, 317, 32579,32580,2381, 489, 317, 2381, 365, 5040, 10619,22207,32582, - 2110, 317, 363, 370, 32583,18215,590, 373, 574, 949, 565, 16876,32586,370, 32590,1347, 32591,1358, 32597,32598,343, 32587,317, 30978,32588,32589,351, + 2110, 317, 363, 370, 32583,18215,590, 373, 574, 949, 565, 16876,32586,370, 32590,1347, 32591,1358, 32597,32598,343, 32587,317, 30978,32588,32589,351, 530, 356, 356, 32592,32594,16797,317, 32593,1992, 317, 32595,32596,990, 32599,14337,8125, 32605,20868,32606,32607,362, 11773,32611,32613,32615,317, 32600, - 370, 32603,32601,317, 32602,18206,317, 317, 317, 317, 2510, 466, 317, 32604,4563, 578, 32608,32610,32609,382, 8522, 343, 32612,14684,7737, 2156, 5184, + 370, 32603,32601,317, 32602,18206,317, 317, 317, 317, 2510, 466, 317, 32604,4563, 578, 32608,32610,32609,382, 8522, 343, 32612,14684,7737, 2156, 5184, 32614,317, 5737, 536, 565, 406, 32617,32618,32623,32630,32634,32642,32684,32689,32704,32706,32707,32710,32740,32746,32747,7408, 32748,32752,32762,32785,32787, - 32790,32791,8920, 23076,350, 5105, 32619,23232,1347, 363, 32620,32621,317, 32622,32624,32625,32627,317, 16503,32626,1992, 5276, 32628,317, 4925, 32629,317, + 32790,32791,8920, 23076,350, 5105, 32619,23232,1347, 363, 32620,32621,317, 32622,32624,32625,32627,317, 16503,32626,1992, 5276, 32628,317, 4925, 32629,317, 4984, 466, 2261, 32631,32632,32633,317, 427, 317, 317, 10891,9301, 345, 317, 6020, 351, 17160,637, 32635,320, 2731, 4843, 621, 32636,5637, 32637,32640, - 554, 466, 362, 363, 4980, 32033,514, 317, 651, 621, 3292, 317, 2731, 2731, 2731, 32638,32639,32641,32643,32644,32645,317, 32652,32654,32656,32657,381, - 32659,32663,32664,32665,11038,32666,32667,32677,32678,32682,317, 384, 1032, 510, 5653, 32646,32649,6450, 32647,32648,10422,466, 343, 317, 32650,32651,1325, - 12277,32653,8254, 32655,5281, 439, 7499, 32658,32660,32661,32662,439, 10878,18531,14829,363, 412, 2060, 5748, 317, 12106,605, 32668,32670,530, 1020, 362, + 554, 466, 362, 363, 4980, 32033,514, 317, 651, 621, 3292, 317, 2731, 2731, 2731, 32638,32639,32641,32643,32644,32645,317, 32652,32654,32656,32657,381, + 32659,32663,32664,32665,11038,32666,32667,32677,32678,32682,317, 384, 1032, 510, 5653, 32646,32649,6450, 32647,32648,10422,466, 343, 317, 32650,32651,1325, + 12277,32653,8254, 32655,5281, 439, 7499, 32658,32660,32661,32662,439, 10878,18531,14829,363, 412, 2060, 5748, 317, 12106,605, 32668,32670,530, 1020, 362, 32674,32669,410, 466, 317, 317, 32671,1588, 32672,32673,1160, 633, 32675,10422,350, 362, 370, 317, 5037, 32676,6311, 578, 32679,32680,317, 637, 32681, 32683,10877,551, 32685,32686,558, 363, 32687,32688,356, 466, 317, 1588, 32690,32691,32698,32701,10519,32703,317, 317, 14663,317, 32692,317, 317, 32693, - 381, 32695,317, 32697,32694,32696,410, 317, 3999, 317, 382, 2272, 32699,32700,466, 6406, 317, 466, 32702,381, 10907,412, 32705,349, 389, 350, 363, + 381, 32695,317, 32697,32694,32696,410, 317, 3999, 317, 382, 2272, 32699,32700,466, 6406, 317, 466, 32702,381, 10907,412, 32705,349, 389, 350, 363, 31086,3999, 19167,350, 389, 317, 427, 32708,32709,479, 343, 343, 2537, 32711,370, 32730,14003,32732,2571, 32734,317, 32735,12423,32712,32713,32716,32728, - 5579, 32714,370, 32715,5201, 10674,371, 32717,32718,32719,32720,32721,32722,32723,32724,32725,32726,32727,317, 5262, 317, 317, 32729,317, 32731,2322, 5477, - 317, 32733,24938,382, 7657, 32736,32737,317, 32738,317, 339, 370, 317, 5502, 32739,683, 683, 683, 683, 683, 683, 683, 9166, 1160, 317, 317, 317, + 5579, 32714,370, 32715,5201, 10674,371, 32717,32718,32719,32720,32721,32722,32723,32724,32725,32726,32727,317, 5262, 317, 317, 32729,317, 32731,2322, 5477, + 317, 32733,24938,382, 7657, 32736,32737,317, 32738,317, 339, 370, 317, 5502, 32739,683, 683, 683, 683, 683, 683, 683, 9166, 1160, 317, 317, 317, 317, 317, 317, 317, 317, 317, 32741,32742,32744,17109,5926, 332, 2084, 317, 590, 380, 32743,1347, 317, 32745,351, 365, 7340, 2381, 7852, 1230, 32749, - 9609, 317, 317, 380, 317, 317, 32750,32751,317, 380, 2510, 32753,5896, 27303,32754,3023, 32755,32756,32757,363, 317, 32758,1588, 32761,32629,343, 317, + 9609, 317, 317, 380, 317, 317, 32750,32751,317, 380, 2510, 32753,5896, 27303,32754,3023, 32755,32756,32757,363, 317, 32758,1588, 32761,32629,343, 317, 380, 390, 317, 23358,6021, 370, 363, 439, 32759,32760,466, 350, 363, 32763,32765,2357, 32767,32770,32773,5662, 32774,32777,4980, 32778,32784,332, 32764, - 317, 363, 23079,8419, 32766,32768,362, 2301, 2553, 32769,32771,26702,7668, 32772,4040, 317, 6036, 32775,32776,363, 5334, 32779,32780,363, 32781,32783,317, + 317, 363, 23079,8419, 32766,32768,362, 2301, 2553, 32769,32771,26702,7668, 32772,4040, 317, 6036, 32775,32776,363, 5334, 32779,32780,363, 32781,32783,317, 317, 32782,5324, 317, 345, 6996, 317, 28650,317, 317, 2272, 331, 32786,32788,2063, 32789,32792,2845, 32794,32795,2391, 2413, 32796,14173,32797,2609, 32798, 32799,32805,4949, 9695, 28462,2178, 343, 9557, 11404,343, 6674, 6674, 32800,32801,32802,4984, 427, 450, 317, 317, 381, 317, 32803,317, 32804,317, 14983, - 1526, 1526, 32806,32808,32807,317, 317, 356, 466, 317, 4982, 32810,317, 32817,317, 32820,343, 428, 32811,32812,32813,32814,32815,32816,32818,32819,8023, + 1526, 1526, 32806,32808,32807,317, 317, 356, 466, 317, 4982, 32810,317, 32817,317, 32820,343, 428, 32811,32812,32813,32814,32815,32816,32818,32819,8023, 13177,16951,7185, 356, 32822,32823,370, 32824,32825,32836,32838,32850,32851,317, 350, 9319, 11454,1588, 381, 350, 543, 550, 345, 5464, 350, 8137, 24504, 317, 32826,32832,32827,32830,466, 511, 32831,317, 32828,32829,5334, 596, 317, 32833,32834,32835,32837,32839,621, 32846,342, 4982, 6917, 3605, 32847,11038, - 343, 32848,32849,1011, 32840,32841,32842,32843,32844,32845,2060, 25578,565, 31824,1347, 3710, 317, 7785, 558, 3987, 317, 1020, 390, 317, 343, 317, 317, + 343, 32848,32849,1011, 32840,32841,32842,32843,32844,32845,2060, 25578,565, 31824,1347, 3710, 317, 7785, 558, 3987, 317, 1020, 390, 317, 343, 317, 317, 317, 373, 6036, 596, 32853,351, 11443,343, 596, 5862, 5073, 32855,32857,2058, 1347, 2609, 32858,32859,32861,5205, 1519, 32862,32864,1548, 32868,381, 32856, 2719, 10454,32860,2156, 439, 501, 363, 15325,380, 363, 32863,428, 32865,3125, 32866,32867,32869,32870,4965, 343, 317, 32875,32877,32876,32878,104, 12873, 33007,105, 33157,33160,33235,33237,5793, 33298,3629, 33316,32879,32880,32884,32891,32892,32893,32905,32906,32910,32911,32914,32916,32976,370, 32977,32984,32991, - 2134, 33000,33001,33002,33003,32881,32883,32882,332, 2537, 32885,32886,350, 2184, 32887,5241, 2381, 4564, 32888,18042,32889,32890,345, 18946,317, 2610, 1020, - 317, 32894,373, 32895,32898,6651, 32903,32904,343, 3751, 32896,317, 32897,363, 32899,363, 32900,32901,32902,356, 317, 370, 5226, 1345, 32907,32908,6402, + 2134, 33000,33001,33002,33003,32881,32883,32882,332, 2537, 32885,32886,350, 2184, 32887,5241, 2381, 4564, 32888,18042,32889,32890,345, 18946,317, 2610, 1020, + 317, 32894,373, 32895,32898,6651, 32903,32904,343, 3751, 32896,317, 32897,363, 32899,363, 32900,32901,32902,356, 317, 370, 5226, 1345, 32907,32908,6402, 1358, 6917, 32909,9450, 1020, 32912,32913,32915,15852,29120,2067, 345, 317, 317, 1347, 317, 9864, 32917,32945,6994, 10196,2108, 332, 32946,5149, 2067, 32968, 32969,32971,1230, 32973,32918,32919,32925,32929,32933,32934,317, 6486, 317, 317, 649, 343, 32920,317, 317, 317, 32921,317, 365, 317, 32922,32924,32923, - 32926,32927,317, 2280, 574, 365, 2272, 32928,2715, 25756,466, 317, 1347, 14144,5793, 32930,32931,343, 1109, 317, 317, 32932,965, 971, 5616, 317, 345, + 32926,32927,317, 2280, 574, 365, 2272, 32928,2715, 25756,466, 317, 1347, 14144,5793, 32930,32931,343, 1109, 317, 317, 32932,965, 971, 5616, 317, 345, 317, 8827, 317, 1444, 32935,32936,317, 5406, 32937,32941,351, 32938,32939,32940,32942,427, 32943,32944,501, 501, 1266, 1160, 637, 633, 12721,32947,32954, - 32959,32960,32963,2571, 32965,28479,427, 1160, 32966,317, 32948,32949,32952,7734, 32953,9012, 13686,32950,32951,32955,32957,32956,32958,32961,32962,390, 9573, - 317, 21464,439, 32964,4984, 362, 8178, 5836, 32967,363, 32970,363, 501, 317, 32972,427, 317, 7114, 7223, 971, 317, 32974,32975,5662, 11669,317, 317, + 32959,32960,32963,2571, 32965,28479,427, 1160, 32966,317, 32948,32949,32952,7734, 32953,9012, 13686,32950,32951,32955,32957,32956,32958,32961,32962,390, 9573, + 317, 21464,439, 32964,4984, 362, 8178, 5836, 32967,363, 32970,363, 501, 317, 32972,427, 317, 7114, 7223, 971, 317, 32974,32975,5662, 11669,317, 317, 317, 343, 2715, 365, 1481, 32978,32980,32983,350, 21067,1588, 2105, 5687, 32979,7916, 32981,32982,6334, 1588, 32985,317, 2391, 32990,345, 553, 6402, 32986, - 317, 32987,32988,380, 32989,5201, 21043,17462,2211, 4984, 32992,32995,15886,2310, 32999,2322, 20728,16579,32993,32994,32996,32997,13338,32998,10021,14223,5991, + 317, 32987,32988,380, 32989,5201, 21043,17462,2211, 4984, 32992,32995,15886,2310, 32999,2322, 20728,16579,32993,32994,32996,32997,13338,32998,10021,14223,5991, 343, 343, 350, 33004,33005,33006,317, 380, 317, 489, 317, 2510, 11669,5570, 1526, 33008,33009,33010,33011,33014,33020,33021,33025,33045,33084,33088,33089, 4591, 350, 33107,33112,33118,363, 33126,33131,33134,33139,33141,22130,2184, 33149,20947,33012,33013,33015,404, 1347, 1358, 317, 33016,8301, 2077, 5991, 33018, - 343, 385, 33019,1160, 33017,1992, 25736,33022,33023,351, 33024,6718, 466, 637, 22090,1889, 2767, 633, 317, 33026,33027,33036,33037,33038,33039,317, 317, + 343, 385, 33019,1160, 33017,1992, 25736,33022,33023,351, 33024,6718, 466, 637, 22090,1889, 2767, 633, 317, 33026,33027,33036,33037,33038,33039,317, 317, 317, 608, 19665,317, 2391, 8346, 363, 380, 33028,33029,574, 33030,33031,33034,965, 317, 490, 33032,317, 404, 317, 33033,7911, 363, 363, 317, 33035, 5896, 363, 20032,7142, 2719, 5943, 317, 370, 2272, 439, 590, 33040,33041,33042,33043,317, 29845,33044,363, 404, 355, 1266, 621, 33046,633, 33047,33052, - 33053,1358, 33057,33058,466, 1194, 1345, 33061,33066,22882,7360, 33070,33072,33073,33076,16667,5573, 33079,33083,4949, 33048,33049,356, 33050,317, 33051,428, - 4591, 317, 1033, 33054,10149,33055,14951,317, 33056,428, 2758, 7389, 511, 33059,2577, 33060,33062,370, 33065,317, 317, 33063,33064,317, 15210,317, 343, + 33053,1358, 33057,33058,466, 1194, 1345, 33061,33066,22882,7360, 33070,33072,33073,33076,16667,5573, 33079,33083,4949, 33048,33049,356, 33050,317, 33051,428, + 4591, 317, 1033, 33054,10149,33055,14951,317, 33056,428, 2758, 7389, 511, 33059,2577, 33060,33062,370, 33065,317, 317, 33063,33064,317, 15210,317, 343, 33067,4984, 33069,20535,350, 380, 33068,9335, 476, 33071,2261, 6831, 381, 6195, 33074,516, 33075,608, 509, 2272, 3529, 5633, 990, 33077,2060, 5841, 33078, 6312, 33080,33081,8035, 356, 343, 6420, 33082,6726, 3999, 381, 12800,31972,490, 33085,33086,33087,404, 33090,33093,33094,6598, 33095,33098,343, 9614, 33100, - 33102,317, 343, 33103,33106,33091,4949, 33092,317, 31361,5644, 363, 1020, 362, 33096,33097,2510, 31953,33099,351, 33101,390, 17160,28789,545, 33104,466, - 350, 33105,466, 33108,605, 390, 332, 33109,33110,33111,673, 33113,4984, 363, 511, 20535,33114,33115,33116,33117,33119,317, 33121,2222, 8906, 2134, 350, - 317, 317, 33123,33125,33120,317, 351, 2156, 10149,5840, 1871, 317, 33122,317, 33124,380, 1526, 317, 33127,33128,33129,14663,33130,356, 466, 370, 317, - 1347, 33132,511, 33133,33135,317, 33137,25562,12994,490, 1347, 317, 33136,29666,5464, 317, 317, 33138,5661, 10149,2571, 1444, 7688, 22983,1347, 381, 5279, + 33102,317, 343, 33103,33106,33091,4949, 33092,317, 31361,5644, 363, 1020, 362, 33096,33097,2510, 31953,33099,351, 33101,390, 17160,28789,545, 33104,466, + 350, 33105,466, 33108,605, 390, 332, 33109,33110,33111,673, 33113,4984, 363, 511, 20535,33114,33115,33116,33117,33119,317, 33121,2222, 8906, 2134, 350, + 317, 317, 33123,33125,33120,317, 351, 2156, 10149,5840, 1871, 317, 33122,317, 33124,380, 1526, 317, 33127,33128,33129,14663,33130,356, 466, 370, 317, + 1347, 33132,511, 33133,33135,317, 33137,25562,12994,490, 1347, 317, 33136,29666,5464, 317, 317, 33138,5661, 10149,2571, 1444, 7688, 22983,1347, 381, 5279, 2087, 2571, 317, 5363, 33140,317, 428, 406, 33142,33147,33143,33146,33144,33145,9012, 13686,10560,4949, 33148,317, 5896, 33150,2134, 33151,33152,490, 33156, - 1358, 33106,33153,33154,33155,33158,33159,33161,33162,33163,33167,33174,33197,5159, 345, 490, 2102, 33207,2021, 33208,11438,1060, 33211,33220,33229,33230,317, - 33233,4949, 2022, 7911, 33164,3941, 33166,21680,332, 33165,13392,3999, 2022, 4980, 33168,33170,33171,343, 33172,362, 2087, 33173,317, 33169,380, 401, 370, - 5537, 2134, 33175,33186,16802,33187,33188,33192,33193,33196,2156, 4984, 5896, 33176,31236,1020, 33180,5662, 33181,18839,317, 371, 317, 9938, 33177,33178,5896, - 13686,33179,14951,4965, 7916, 317, 33182,33183,33184,317, 33185,363, 31976,3664, 317, 363, 3884, 33189,317, 33190,33191,476, 22782,317, 317, 9140, 6917, - 8178, 404, 33194,362, 4952, 350, 363, 317, 317, 317, 33195,345, 2108, 33198,33203,33204,356, 4984, 33199,33200,33201,317, 33202,33205,33206,10891,370, - 466, 32485,381, 33209,317, 317, 8136, 33210,317, 5032, 20388,382, 33212,33213,33215,33216,33217,33219,363, 14783,6021, 343, 317, 33214,490, 317, 317, - 8948, 362, 5616, 33218,317, 343, 2022, 317, 33221,317, 33223,33226,26075,33227,33228,33222,6036, 2022, 362, 33224,33225,317, 317, 32106,4738, 350, 362, + 1358, 33106,33153,33154,33155,33158,33159,33161,33162,33163,33167,33174,33197,5159, 345, 490, 2102, 33207,2021, 33208,11438,1060, 33211,33220,33229,33230,317, + 33233,4949, 2022, 7911, 33164,3941, 33166,21680,332, 33165,13392,3999, 2022, 4980, 33168,33170,33171,343, 33172,362, 2087, 33173,317, 33169,380, 401, 370, + 5537, 2134, 33175,33186,16802,33187,33188,33192,33193,33196,2156, 4984, 5896, 33176,31236,1020, 33180,5662, 33181,18839,317, 371, 317, 9938, 33177,33178,5896, + 13686,33179,14951,4965, 7916, 317, 33182,33183,33184,317, 33185,363, 31976,3664, 317, 363, 3884, 33189,317, 33190,33191,476, 22782,317, 317, 9140, 6917, + 8178, 404, 33194,362, 4952, 350, 363, 317, 317, 317, 33195,345, 2108, 33198,33203,33204,356, 4984, 33199,33200,33201,317, 33202,33205,33206,10891,370, + 466, 32485,381, 33209,317, 317, 8136, 33210,317, 5032, 20388,382, 33212,33213,33215,33216,33217,33219,363, 14783,6021, 343, 317, 33214,490, 317, 317, + 8948, 362, 5616, 33218,317, 343, 2022, 317, 33221,317, 33223,33226,26075,33227,33228,33222,6036, 2022, 362, 33224,33225,317, 317, 32106,4738, 350, 362, 32105,317, 317, 33231,33232,397, 4591, 428, 33234,428, 596, 343, 317, 33236,33238,1915, 33239,371, 33242,33244,33250,33254,33257,33260,33263,33268,33284, 33285,33292,33294,10528,356, 33295,33240,33241,9182, 382, 317, 343, 33243,7678, 317, 317, 3236, 343, 990, 33245,33246,32769,33248,30795,350, 33247,33249, - 317, 317, 516, 33251,33252,33253,350, 1347, 15156,2156, 1160, 5684, 363, 1588, 5896, 33255,362, 384, 2310, 33256,317, 4952, 33258,317, 33259,33261,332, - 7116, 2003, 33262,33264,33265,14571,7523, 3987, 10185,466, 33266,25146,317, 33267,33269,33270,33271,16053,33272,317, 33275,7785, 5033, 7850, 317, 5890, 608, - 317, 2715, 33273,33274,1603, 33276,33277,33278,33279,8000, 362, 7779, 33283,317, 1871, 317, 317, 17413,490, 33280,382, 33282,33281,345, 317, 18700,343, + 317, 317, 516, 33251,33252,33253,350, 1347, 15156,2156, 1160, 5684, 363, 1588, 5896, 33255,362, 384, 2310, 33256,317, 4952, 33258,317, 33259,33261,332, + 7116, 2003, 33262,33264,33265,14571,7523, 3987, 10185,466, 33266,25146,317, 33267,33269,33270,33271,16053,33272,317, 33275,7785, 5033, 7850, 317, 5890, 608, + 317, 2715, 33273,33274,1603, 33276,33277,33278,33279,8000, 362, 7779, 33283,317, 1871, 317, 317, 17413,490, 33280,382, 33282,33281,345, 317, 18700,343, 317, 370, 33286,33288,15130,33289,490, 33287,33290,33291,356, 466, 317, 317, 1160, 10820,4949, 33293,13177,317, 343, 20047,33296,33297,33299,33301,33303, - 8519, 33304,5911, 33308,5017, 33309,33314,11635,33300,5956, 33302,3664, 511, 21700,317, 6402, 317, 33305,317, 2631, 33306,379, 5987, 33307,317, 6195, 317, - 363, 1020, 1345, 33310,33312,33313,33311,33315,317, 2219, 5392, 317, 351, 5897, 33317,4965, 466, 511, 33319,590, 12429,404, 370, 33318,362, 28789,5346, + 8519, 33304,5911, 33308,5017, 33309,33314,11635,33300,5956, 33302,3664, 511, 21700,317, 6402, 317, 33305,317, 2631, 33306,379, 5987, 33307,317, 6195, 317, + 363, 1020, 1345, 33310,33312,33313,33311,33315,317, 2219, 5392, 317, 351, 5897, 33317,4965, 466, 511, 33319,590, 12429,404, 370, 33318,362, 28789,5346, 2405, 350, 33321,33324,363, 33326,33322,33323,33325,33327,317, 345, 317, 343, 390, 33329,33330,33334,33371,33374,33390,33396,33406,33414,33423,33430,33465, 33472,5428, 33527,33535,33536,33574,33591,31505,33599,317, 10471,4069, 33331,33333,33332,6228, 633, 356, 317, 365, 33335,33336,33338,33370,12746,317, 33337, - 382, 1588, 3529, 22090,14773,672, 633, 33339,33341,33342,33345,4249, 33346,33348,33351,33352,9479, 33356,33359,33360,33364,33365,33366,33340,33343,363, 317, - 33344,5942, 633, 4944, 514, 412, 551, 33347,373, 356, 1160, 33349,33350,317, 1160, 2260, 365, 533, 434, 33353,33355,317, 317, 633, 33354,6345, 476, - 2277, 33357,33358,2036, 385, 16484,551, 33361,370, 381, 33362,345, 12151,33363,26518,317, 317, 428, 317, 317, 2533, 33367,33368,317, 317, 1266, 317, - 1353, 317, 317, 317, 16620,33369,317, 33372,1345, 317, 33373,1108, 490, 317, 17158,466, 332, 9644, 33375,33376,33378,33380,33389,356, 466, 5363, 317, + 382, 1588, 3529, 22090,14773,672, 633, 33339,33341,33342,33345,4249, 33346,33348,33351,33352,9479, 33356,33359,33360,33364,33365,33366,33340,33343,363, 317, + 33344,5942, 633, 4944, 514, 412, 551, 33347,373, 356, 1160, 33349,33350,317, 1160, 2260, 365, 533, 434, 33353,33355,317, 317, 633, 33354,6345, 476, + 2277, 33357,33358,2036, 385, 16484,551, 33361,370, 381, 33362,345, 12151,33363,26518,317, 317, 428, 317, 317, 2533, 33367,33368,317, 317, 1266, 317, + 1353, 317, 317, 317, 16620,33369,317, 33372,1345, 317, 33373,1108, 490, 317, 17158,466, 332, 9644, 33375,33376,33378,33380,33389,356, 466, 5363, 317, 33377,33379,345, 8243, 317, 33381,362, 33382,33387,317, 490, 33383,33384,33385,590, 33386,33388,317, 25968,1358, 2184, 33391,33392,33393,33394,33395,33397, - 33399,350, 317, 33400,33403,317, 33404,317, 317, 33398,365, 345, 1358, 381, 33401,33402,9383, 317, 4965, 2357, 317, 33405,33407,317, 33408,33411,7949, - 33413,33409,33410,33412,5663, 12288,33415,33416,363, 33417,6834, 317, 33418,33420,332, 1481, 6900, 33422,6834, 33419,317, 33421,2110, 33424,345, 33425,3529, + 33399,350, 317, 33400,33403,317, 33404,317, 317, 33398,365, 345, 1358, 381, 33401,33402,9383, 317, 4965, 2357, 317, 33405,33407,317, 33408,33411,7949, + 33413,33409,33410,33412,5663, 12288,33415,33416,363, 33417,6834, 317, 33418,33420,332, 1481, 6900, 33422,6834, 33419,317, 33421,2110, 33424,345, 33425,3529, 33427,33426,382, 490, 317, 29531,9436, 1481, 33428,33429,8926, 7142, 33431,33432,1109, 33433,33435,33438,33443,33446,33448,33459,1060, 317, 33460,33461,33462, 33463,317, 2301, 350, 317, 317, 741, 365, 33434,317, 22114,351, 33436,551, 33437,5012, 3854, 317, 33439,33440,33441,33442,33444,33445,33447,317, 33449, - 33450,33451,2024, 5727, 33454,33455,2571, 1526, 5005, 33458,317, 565, 317, 21766,384, 2301, 317, 33452,33453,381, 11709,22114,6188, 404, 7073, 5861, 404, + 33450,33451,2024, 5727, 33454,33455,2571, 1526, 5005, 33458,317, 565, 317, 21766,384, 2301, 317, 33452,33453,381, 11709,22114,6188, 404, 7073, 5861, 404, 363, 33456,33457,2298, 2063, 351, 351, 1588, 317, 9266, 4591, 33464,2063, 33466,33469,33470,33471,33467,33468,33327,30476,332, 382, 317, 949, 33046,33473, - 33475,33476,33486,33502,33505,33509,7401, 33512,33514,33518,2272, 33523,33525,5089, 317, 33474,317, 5439, 317, 6851, 3338, 370, 33477,33478,317, 33479,380, + 33475,33476,33486,33502,33505,33509,7401, 33512,33514,33518,2272, 33523,33525,5089, 317, 33474,317, 5439, 317, 6851, 3338, 370, 33477,33478,317, 33479,380, 12060,33480,2510, 33481,33482,33483,356, 466, 317, 33484,5201, 33485,370, 317, 5355, 5201, 1526, 33487,33494,8137, 11986,33499,317, 345, 317, 31376,33488, 33489,33490,33491,33492,33493,5249, 370, 317, 317, 8325, 33495,33496,317, 4949, 33497,371, 33498,33500,33501,317, 33503,317, 317, 33504,5022, 33506,33507, - 33508,380, 33510,6859, 373, 33511,33513,5488, 5033, 10408,33515,12142,32959,343, 349, 33517,33516,33519,33521,33522,33520,317, 565, 317, 901, 362, 317, + 33508,380, 33510,6859, 373, 33511,33513,5488, 5033, 10408,33515,12142,32959,343, 349, 33517,33516,33519,33521,33522,33520,317, 565, 317, 901, 362, 317, 316, 33524,363, 3529, 33526,317, 6419, 33528,33529,33530,33531,33532,33533,33534,370, 33537,33539,33540,33541,33542,33543,9909, 33545,33548,33550,11648,33558, 33560,33562,33570,317, 343, 428, 33538,389, 1444, 389, 317, 1078, 317, 404, 8722, 317, 317, 867, 370, 2551, 10368,2551, 2551, 317, 345, 332, 33544, - 332, 6670, 363, 351, 33546,33547,574, 4943, 317, 33549,33551,33553,33554,317, 2156, 33552,317, 7990, 317, 345, 317, 317, 33555,33557,33556,317, 5464, + 332, 6670, 363, 351, 33546,33547,574, 4943, 317, 33549,33551,33553,33554,317, 2156, 33552,317, 7990, 317, 345, 317, 317, 33555,33557,33556,317, 5464, 10877,5991, 317, 33559,317, 317, 33561,33563,33564,33567,363, 33568,33565,33566,381, 523, 356, 466, 2171, 317, 33569,33571,6900, 16063,33573,33572,33575, - 33577,33580,33582,33583,350, 4984, 33588,15513,33576,33578,33579,6387, 345, 317, 33581,317, 9067, 350, 317, 3429, 363, 12987,317, 33584,33585,33586,2509, - 5439, 33587,317, 7921, 317, 15260,33589,466, 350, 317, 33590,317, 317, 33592,390, 21763,4974, 33593,363, 33594,9549, 16438,33595,33598,428, 5105, 380, + 33577,33580,33582,33583,350, 4984, 33588,15513,33576,33578,33579,6387, 345, 317, 33581,317, 9067, 350, 317, 3429, 363, 12987,317, 33584,33585,33586,2509, + 5439, 33587,317, 7921, 317, 15260,33589,466, 350, 317, 33590,317, 317, 33592,390, 21763,4974, 33593,363, 33594,9549, 16438,33595,33598,428, 5105, 380, 30811,490, 33596,2576, 6420, 33597,317, 8158, 370, 1347, 589, 33600,33601,343, 1160, 33603,6541, 33607,33608,33604,33605,33606,33610,33611,33613,33615,33617, 33618,317, 33623,317, 33635,33636,33642,33653,607, 33657,25825,33616,3103, 380, 380, 33619,33620,33621,33622,33624,317, 343, 33629,33633,32273,33625,33626, 33627,33628,33630,33631,1065, 33632,33634,343, 9450, 33637,363, 612, 33638,1065, 33640,33639,33641,1193, 6228, 740, 396, 2086, 33643,33649,33644,33645,33646, 33647,33648,33650,33651,949, 33652,1193, 371, 33654,33655,33656,33658,33659,6778, 33660,317, 3800, 7305, 4462, 33662,33663,33664,33665,33671,33672,33674,33677, - 108, 34204,34238,34244,111, 34652,34709,34714,112, 35194,35251,113, 35472,35481,114, 36030,36031,115, 36550,36564,120, 36976,36979,37006,37012,37061,1230, + 108, 34204,34238,34244,111, 34652,34709,34714,112, 35194,35251,113, 35472,35481,114, 36030,36031,115, 36550,36564,120, 36976,36979,37006,37012,37061,1230, 11089,565, 2301, 11097,427, 536, 33666,2208, 33667,350, 373, 33668,33669,33670,33673,33675,33676,33678,33679,33680,33682,33704,33707,33721,33728,33731,33742, 33744,33762,33764,109, 33859,33906,33959,33961,110, 34049,34099,34130,34157,34168,22400,34175,34186,390, 317, 317, 317, 33681,317, 350, 6563, 33683,33686, - 33689,5159, 33690,33691,33695,33698,317, 317, 6064, 317, 33684,33685,317, 5120, 343, 33687,33688,19661,332, 1160, 5027, 490, 356, 317, 5159, 8431, 5223, - 357, 365, 8136, 33692,33693,33694,8217, 33696,3751, 33697,14981,2272, 351, 13091,33699,33701,1189, 11147,33700,348, 380, 33702,33703,6996, 317, 317, 317, + 33689,5159, 33690,33691,33695,33698,317, 317, 6064, 317, 33684,33685,317, 5120, 343, 33687,33688,19661,332, 1160, 5027, 490, 356, 317, 5159, 8431, 5223, + 357, 365, 8136, 33692,33693,33694,8217, 33696,3751, 33697,14981,2272, 351, 13091,33699,33701,1189, 11147,33700,348, 380, 33702,33703,6996, 317, 317, 317, 317, 21183,6046, 356, 10196,371, 33705,490, 33706,2364, 317, 565, 17973,33708,33709,33710,33711,418, 8049, 33714,15732,33715,33718,343, 33719,317, 33720, 605, 7590, 2163, 448, 10225,6578, 317, 317, 317, 33712,33713,33716,5836, 448, 33717,370, 501, 363, 363, 11347,10623,317, 2298, 33722,22836,33723,33724, - 33725,13214,33726,1998, 317, 339, 1358, 317, 28525,362, 2568, 33727,317, 317, 343, 317, 33729,33730,11443,2348, 343, 2022, 551, 33732,33733,33734,350, - 371, 33735,33740,33741,490, 317, 317, 1020, 1108, 5991, 466, 343, 33736,33737,7916, 332, 33738,33739,12142,350, 363, 33743,7949, 317, 317, 2184, 317, - 2298, 501, 33745,343, 1020, 33747,6600, 33749,33756,33757,33758,345, 317, 33746,6859, 345, 33748,317, 363, 33750,33751,466, 33752,33753,317, 317, 7941, + 33725,13214,33726,1998, 317, 339, 1358, 317, 28525,362, 2568, 33727,317, 317, 343, 317, 33729,33730,11443,2348, 343, 2022, 551, 33732,33733,33734,350, + 371, 33735,33740,33741,490, 317, 317, 1020, 1108, 5991, 466, 343, 33736,33737,7916, 332, 33738,33739,12142,350, 363, 33743,7949, 317, 317, 2184, 317, + 2298, 501, 33745,343, 1020, 33747,6600, 33749,33756,33757,33758,345, 317, 33746,6859, 345, 33748,317, 363, 33750,33751,466, 33752,33753,317, 317, 7941, 317, 5810, 5701, 33754,33755,6673, 4949, 2568, 11607,363, 2510, 33759,4965, 33761,33760,33763,490, 15326,2280, 317, 7776, 5238, 343, 33765,19617,33766,33782, 33785,33787,33793,33794,25961,33796,11034,9909, 33810,17870,33845,33846,33847,4980, 33849,33851,1230, 33858,6176, 33767,2202, 419, 355, 11055,33769,33770,33771, - 33772,33774,3717, 33779,33780,2004, 317, 332, 33768,8637, 393, 345, 1109, 345, 317, 6278, 9375, 363, 5439, 489, 11921,317, 490, 33773,490, 15169,605, - 15892,33775,490, 343, 33778,33776,33777,33781,1160, 33783,5325, 317, 33784,2553, 23256,33786,317, 4984, 33788,3284, 2381, 33789,33790,33791,7910, 7383, 317, + 33772,33774,3717, 33779,33780,2004, 317, 332, 33768,8637, 393, 345, 1109, 345, 317, 6278, 9375, 363, 5439, 489, 11921,317, 490, 33773,490, 15169,605, + 15892,33775,490, 343, 33778,33776,33777,33781,1160, 33783,5325, 317, 33784,2553, 23256,33786,317, 4984, 33788,3284, 2381, 33789,33790,33791,7910, 7383, 317, 5611, 317, 9185, 33792,6138, 551, 5570, 33795,5570, 33797,6993, 33799,317, 33802,33804,33807,2322, 33809,427, 5241, 33798,5616, 6763, 33800,33801,33803,33805, 317, 1588, 317, 33806,317, 33808,345, 490, 31290,3284, 33811,33819,33822,33827,11236,33840,33842,33843,348, 317, 419, 7521, 33812,16825,2171, 33813,33815, 33816,33817,33818,1230, 317, 351, 6917, 345, 2222, 33814,317, 370, 370, 332, 5033, 332, 596, 539, 419, 33820,33821,33823,350, 2171, 33824,5055, 33825, 1358, 33826,1347, 345, 350, 370, 8243, 317, 9012, 2271, 2211, 10578,317, 317, 317, 7384, 18454,33828,33829,33830,33831,33832,317, 33833,33834,363, 33836, - 17039,427, 33837,4984, 10609,2537, 317, 6387, 317, 8994, 2022, 351, 4943, 551, 1588, 33835,25415,6394, 10471,17462,33838,33839,317, 11761,418, 1347, 5363, + 17039,427, 33837,4984, 10609,2537, 317, 6387, 317, 8994, 2022, 351, 4943, 551, 1588, 33835,25415,6394, 10471,17462,33838,33839,317, 11761,418, 1347, 5363, 490, 33841,8841, 1347, 33844,9185, 2084, 345, 317, 343, 2394, 317, 363, 33848,29521,356, 351, 362, 363, 11279,33850,490, 7384, 5624, 1481, 33852,33856, - 6002, 33853,317, 13338,33854,33855,317, 1526, 5174, 317, 33857,317, 363, 7237, 363, 33860,33862,33872,558, 33894,33896,33897,33900,33901,9289, 33902,381, - 342, 343, 33861,2110, 15771,317, 33863,33865,5022, 33867,33868,33869,33870,317, 5173, 343, 33864,317, 5105, 33866,489, 4984, 351, 380, 332, 1160, 317, - 356, 1358, 9878, 33871,380, 4591, 8301, 33873,33874,33875,33876,33877,33878,33879,33880,33884,33887,3987, 15685,5961, 5866, 4984, 363, 332, 356, 1230, 332, - 6228, 33881,2413, 1347, 317, 33882,33883,317, 2402, 33885,33886,317, 2503, 8906, 381, 317, 1347, 2060, 33888,33891,33889,33890,33892,33893,33895,317, 5223, + 6002, 33853,317, 13338,33854,33855,317, 1526, 5174, 317, 33857,317, 363, 7237, 363, 33860,33862,33872,558, 33894,33896,33897,33900,33901,9289, 33902,381, + 342, 343, 33861,2110, 15771,317, 33863,33865,5022, 33867,33868,33869,33870,317, 5173, 343, 33864,317, 5105, 33866,489, 4984, 351, 380, 332, 1160, 317, + 356, 1358, 9878, 33871,380, 4591, 8301, 33873,33874,33875,33876,33877,33878,33879,33880,33884,33887,3987, 15685,5961, 5866, 4984, 363, 332, 356, 1230, 332, + 6228, 33881,2413, 1347, 317, 33882,33883,317, 2402, 33885,33886,317, 2503, 8906, 381, 317, 1347, 2060, 33888,33891,33889,33890,33892,33893,33895,317, 5223, 363, 33898,9878, 428, 33899,317, 1459, 7871, 317, 33903,33904,33905,33907,2537, 33911,33925,9624, 33927,33944,33946,2022, 33949,33952,33953,33955,345, 33958, 11454,332, 33908,22232,1230, 33909,33910,33912,33918,33919,490, 33923,2521, 317, 5439, 33913,33915,33914,317, 33916,33917,427, 317, 317, 5223, 490, 33920, - 33922,317, 33921,363, 365, 6614, 33924,317, 317, 317, 33926,317, 363, 1109, 33928,33931,33934,7871, 33937,33938,6463, 33939,33940,9696, 33942,33943,317, - 33929,33930,565, 433, 33932,20656,33933,317, 33935,365, 317, 33936,401, 439, 351, 11511,3529, 3529, 317, 427, 5379, 33941,13790,10798,370, 351, 389, - 363, 33945,317, 362, 317, 357, 404, 4980, 33947,317, 33948,2208, 33950,2039, 10476,317, 317, 33951,317, 382, 16898,466, 7911, 33954,5793, 7490, 317, + 33922,317, 33921,363, 365, 6614, 33924,317, 317, 317, 33926,317, 363, 1109, 33928,33931,33934,7871, 33937,33938,6463, 33939,33940,9696, 33942,33943,317, + 33929,33930,565, 433, 33932,20656,33933,317, 33935,365, 317, 33936,401, 439, 351, 11511,3529, 3529, 317, 427, 5379, 33941,13790,10798,370, 351, 389, + 363, 33945,317, 362, 317, 357, 404, 4980, 33947,317, 33948,2208, 33950,2039, 10476,317, 317, 33951,317, 382, 16898,466, 7911, 33954,5793, 7490, 317, 317, 5223, 7894, 33956,15449,33957,370, 317, 317, 7894, 14905,382, 5223, 6089, 317, 1109, 33960,4984, 33962,1109, 317, 33963,33964,33973,33975,33980,33991, 33993,33997,34004,34005,2402, 34013,34016,34019,34023,317, 34026,34036,34038,34043,34044,34046,6227, 34048,33965,33967,33968,2156, 362, 317, 490, 317, 33970, - 17760,343, 33971,317, 33966,33969,2381, 14150,33972,6402, 489, 33974,20880,363, 1526, 317, 2117, 1108, 6713, 15830,33976,33977,5055, 317, 14561,5943, 317, - 404, 317, 2715, 14786,33978,33979,5120, 33981,33986,2022, 33988,33989,33990,317, 317, 3284, 6817, 433, 33982,33984,317, 317, 1347, 2510, 2609, 33983,317, - 33985,317, 33987,351, 317, 350, 317, 590, 14439,1109, 317, 33992,317, 1160, 404, 317, 317, 33994,5810, 32892,345, 33995,356, 33996,33998,34001,472, - 34002,34003,2134, 33999,317, 317, 34000,1999, 317, 433, 317, 34006,34009,34010,10836,34011,317, 11678,363, 4925, 34012,1230, 34007,317, 34008,317, 363, - 8419, 11229,14174,34014,34015,7785, 25414,5392, 371, 5295, 317, 16002,3676, 34017,10476,34018,317, 343, 2108, 34020,350, 34021,554, 34022,5926, 8392, 332, - 342, 356, 590, 5273, 1347, 11962,317, 11881,351, 8412, 34024,34025,8772, 343, 33969,2142, 34027,34028,34031,34035,317, 25289,7492, 362, 7035, 356, 356, - 381, 1230, 363, 317, 12966,317, 34029,404, 34030,371, 332, 443, 34032,30087,2117, 34033,34034,4984, 29424,317, 10528,317, 317, 317, 317, 381, 2610, - 11055,343, 12154,7031, 332, 7672, 363, 34037,466, 490, 363, 34039,34042,363, 15983,362, 350, 363, 3987, 317, 34040,1347, 6415, 34041,343, 15790,490, - 365, 365, 363, 34045,24108,363, 34047,317, 490, 6318, 34050,34051,34053,34056,317, 34058,34060,34064,10149,350, 34066,34067,15273,34073,34076,15960,8281, + 17760,343, 33971,317, 33966,33969,2381, 14150,33972,6402, 489, 33974,20880,363, 1526, 317, 2117, 1108, 6713, 15830,33976,33977,5055, 317, 14561,5943, 317, + 404, 317, 2715, 14786,33978,33979,5120, 33981,33986,2022, 33988,33989,33990,317, 317, 3284, 6817, 433, 33982,33984,317, 317, 1347, 2510, 2609, 33983,317, + 33985,317, 33987,351, 317, 350, 317, 590, 14439,1109, 317, 33992,317, 1160, 404, 317, 317, 33994,5810, 32892,345, 33995,356, 33996,33998,34001,472, + 34002,34003,2134, 33999,317, 317, 34000,1999, 317, 433, 317, 34006,34009,34010,10836,34011,317, 11678,363, 4925, 34012,1230, 34007,317, 34008,317, 363, + 8419, 11229,14174,34014,34015,7785, 25414,5392, 371, 5295, 317, 16002,3676, 34017,10476,34018,317, 343, 2108, 34020,350, 34021,554, 34022,5926, 8392, 332, + 342, 356, 590, 5273, 1347, 11962,317, 11881,351, 8412, 34024,34025,8772, 343, 33969,2142, 34027,34028,34031,34035,317, 25289,7492, 362, 7035, 356, 356, + 381, 1230, 363, 317, 12966,317, 34029,404, 34030,371, 332, 443, 34032,30087,2117, 34033,34034,4984, 29424,317, 10528,317, 317, 317, 317, 381, 2610, + 11055,343, 12154,7031, 332, 7672, 363, 34037,466, 490, 363, 34039,34042,363, 15983,362, 350, 363, 3987, 317, 34040,1347, 6415, 34041,343, 15790,490, + 365, 365, 363, 34045,24108,363, 34047,317, 490, 6318, 34050,34051,34053,34056,317, 34058,34060,34064,10149,350, 34066,34067,15273,34073,34076,15960,8281, 1230, 34052,317, 34054,34055,10758,1345, 317, 2272, 34057,317, 317, 34059,5650, 23622,2279, 5836, 34061,34062,34063,380, 1347, 317, 34065,20925,317, 34068, 34071,466, 34069,317, 317, 34070,317, 317, 34072,2208, 34074,466, 350, 362, 350, 34075,317, 317, 317, 317, 5223, 317, 381, 34077,34080,2022, 34081, 34083,34078,34079,317, 21145,317, 5332, 34082,317, 19435,490, 339, 34084,34085,34090,34095,34097,34086,34087,34088,34089,5828, 10252,34091,34092,34093,34094, - 34096,34098,317, 34100,34103,34111,34115,34117,34120,3987, 34123,34124,363, 34128,34129,34101,34102,9878, 2035, 390, 317, 343, 4982, 7401, 34104,5661, 345, + 34096,34098,317, 34100,34103,34111,34115,34117,34120,3987, 34123,34124,363, 34128,34129,34101,34102,9878, 2035, 390, 317, 343, 4982, 7401, 34104,5661, 345, 34107,34108,34105,34106,34109,2063, 34110,34112,10877,343, 362, 2301, 34113,10422,34114,317, 471, 10878,490, 34116,345, 7143, 10471,317, 5611, 370, 34118, 396, 34119,317, 34121,317, 317, 317, 2261, 362, 362, 34122,370, 365, 363, 34125,363, 34126,6063, 34127,5325, 317, 343, 605, 2211, 31413,34131,34133, - 351, 34137,34138,34140,34142,34144,34148,34150,34153,34154,34155,1020, 5653, 343, 34132,4984, 4965, 1347, 317, 34134,34136,11921,317, 17434,34135,11962,351, + 351, 34137,34138,34140,34142,34144,34148,34150,34153,34154,34155,1020, 5653, 343, 34132,4984, 4965, 1347, 317, 34134,34136,11921,317, 17434,34135,11962,351, 357, 6300, 490, 363, 3751, 8136, 34139,466, 350, 1020, 34141,380, 34143,34145,22177,34146,343, 5803, 8722, 317, 34147,20178,351, 34149,317, 343, 34151, - 34152,350, 317, 9981, 317, 363, 317, 362, 6854, 355, 8574, 466, 34156,6917, 2022, 25494,2108, 427, 6917, 9303, 34158,34160,34161,2156, 34166,2381, 339, - 362, 34159,317, 7823, 5105, 2004, 317, 5862, 10820,317, 5241, 34162,34163,34165,489, 5241, 5223, 363, 5241, 34164,34167,317, 10073,34169,317, 380, 545, + 34152,350, 317, 9981, 317, 363, 317, 362, 6854, 355, 8574, 466, 34156,6917, 2022, 25494,2108, 427, 6917, 9303, 34158,34160,34161,2156, 34166,2381, 339, + 362, 34159,317, 7823, 5105, 2004, 317, 5862, 10820,317, 5241, 34162,34163,34165,489, 5241, 5223, 363, 5241, 34164,34167,317, 10073,34169,317, 380, 545, 34170,34171,34172,34173,8587, 466, 8852, 351, 371, 11665,25423,34174,34176,8301, 34178,28196,9624, 901, 28190,34179,34181,34182,34184,34185,11236,26336,34177, - 2178, 365, 351, 363, 16503,317, 34180,2389, 363, 6002, 363, 34183,351, 11533,317, 345, 34187,34188,34189,34194,596, 317, 34202,34203,5038, 490, 317, - 1230, 317, 11146,371, 332, 317, 34190,317, 34191,317, 34192,34193,34195,34199,382, 7657, 34196,34197,34198,34200,34201,2415, 426, 17994,7567, 5033, 6817, + 2178, 365, 351, 363, 16503,317, 34180,2389, 363, 6002, 363, 34183,351, 11533,317, 345, 34187,34188,34189,34194,596, 317, 34202,34203,5038, 490, 317, + 1230, 317, 11146,371, 332, 317, 34190,317, 34191,317, 34192,34193,34195,34199,382, 7657, 34196,34197,34198,34200,34201,2415, 426, 17994,7567, 5033, 6817, 34205,34208,611, 34209,34211,34214,34217,5171, 34219,34223,34230,34232,34236,351, 34237,34206,34207,34210,34212,34213,34215,34216,34218,34220,34221,34222,34224, - 34228,34225,34226,34227,34229,34231,16129,34233,1243, 34234,34235,1060, 34239,382, 2156, 332, 34240,317, 34241,34242,34243,34245,317, 34248,317, 34249,2381, + 34228,34225,34226,34227,34229,34231,16129,34233,1243, 34234,34235,1060, 34239,382, 2156, 332, 34240,317, 34241,34242,34243,34245,317, 34248,317, 34249,2381, 5431, 34246,34247,6555, 2212, 34250,34263,34268,34270,34276,34289,34294,34297,34304,34315,34316,34341,34355,34447,34498,34501,34580,34605,34638,34641,34646,34649, 34650,390, 362, 370, 34251,34253,34261,34262,6551, 34252,317, 317, 363, 34254,356, 34255,3999, 34258,317, 363, 34259,565, 317, 1999, 34256,34257,31644, 34260,351, 2188, 7408, 18236,34264,28651,317, 34266,317, 34265,34267,363, 348, 34269,596, 6420, 34271,34274,34275,362, 2022, 317, 2163, 343, 345, 34272, - 363, 34273,317, 3338, 317, 363, 450, 511, 34277,34279,34280,1109, 965, 34281,34282,34283,34284,34288,34278,8301, 317, 317, 363, 2037, 596, 501, 317, + 363, 34273,317, 3338, 317, 363, 450, 511, 34277,34279,34280,1109, 965, 34281,34282,34283,34284,34288,34278,8301, 317, 317, 363, 2037, 596, 501, 317, 317, 317, 450, 1345, 1020, 317, 317, 351, 490, 466, 34285,34286,34287,34290,412, 34291,25078,17290,34292,501, 34293,317, 15330,6222, 34295,34296,34298, 34299,6600, 317, 34300,427, 2035, 5626, 13002,12524,466, 34301,34302,34303,2310, 9938, 363, 317, 317, 7871, 34305,332, 34306,351, 34307,501, 34308,16825, 317, 14295,34310,34314,6221, 380, 382, 12731,343, 34309,317, 34311,6409, 34312,350, 25681,2222, 2298, 34313,350, 2317, 2022, 2568, 350, 317, 34317,34321, - 34322,34324,34326,350, 565, 34327,34329,362, 350, 34335,2521, 34336,1108, 34339,1020, 34340,1998, 34318,34319,317, 34320,29456,351, 362, 10625,34323,466, + 34322,34324,34326,350, 565, 34327,34329,362, 350, 34335,2521, 34336,1108, 34339,1020, 34340,1998, 34318,34319,317, 34320,29456,351, 362, 10625,34323,466, 6203, 396, 8178, 34325,317, 349, 439, 14251,34328,345, 10471,317, 34330,34331,34333,362, 8488, 34332,34334,317, 34337,4738, 404, 34338,351, 2581, 34342, 34345,34348,34349,317, 34352,20883,34343,490, 2134, 34344,34346,34347,551, 350, 11124,365, 317, 34350,24698,34351,363, 14278,1353, 317, 1160, 34353,34354, 317, 34356,34357,5896, 34358,34366,34375,34411,34412,365, 5120, 558, 34419,34425,34431,34432,34433,34443,34446,8765, 34359,317, 34360,34361,34362,34363,34364, 34365,34367,34371,350, 34374,1943, 396, 34368,34369,34370,317, 34372,356, 34373,317, 10471,363, 34376,4872, 363, 34381,34404,34405,34408,317, 34377,34378, 34379,34380,317, 433, 345, 4268, 34382,7990, 34400,34402,5226, 34383,34399,317, 317, 332, 1347, 34384,34390,34393,4783, 34397,7821, 34385,34386,34387,34388, - 34389,34391,34392,10680,5225, 356, 3726, 3725, 317, 34394,317, 34395,34396,34398,34401,317, 317, 2546, 317, 317, 34403,6670, 7865, 15193,317, 34406,5120, - 34407,2546, 6514, 317, 317, 317, 34409,34410,343, 317, 317, 2163, 350, 5105, 34413,34414,317, 317, 7523, 34415,34417,34416,434, 317, 34418,6228, 345, - 539, 34420,34423,34424,384, 1943, 317, 34421,34422,6486, 490, 317, 332, 10820,317, 34426,393, 10389,1459, 34428,345, 34429,34427,317, 34430,7672, 490, - 380, 350, 363, 9265, 34434,596, 9937, 34435,34437,350, 332, 34441,1345, 14905,380, 5241, 1345, 317, 18333,34436,382, 317, 427, 2171, 1347, 317, 6021, + 34389,34391,34392,10680,5225, 356, 3726, 3725, 317, 34394,317, 34395,34396,34398,34401,317, 317, 2546, 317, 317, 34403,6670, 7865, 15193,317, 34406,5120, + 34407,2546, 6514, 317, 317, 317, 34409,34410,343, 317, 317, 2163, 350, 5105, 34413,34414,317, 317, 7523, 34415,34417,34416,434, 317, 34418,6228, 345, + 539, 34420,34423,34424,384, 1943, 317, 34421,34422,6486, 490, 317, 332, 10820,317, 34426,393, 10389,1459, 34428,345, 34429,34427,317, 34430,7672, 490, + 380, 350, 363, 9265, 34434,596, 9937, 34435,34437,350, 332, 34441,1345, 14905,380, 5241, 1345, 317, 18333,34436,382, 317, 427, 2171, 1347, 317, 6021, 34438,317, 34439,2571, 317, 317, 34440,363, 34442,317, 34444,34445,382, 317, 5438, 2537, 34448,34449,34452,34455,34462,356, 34463,34466,34474,34478,34490, 34495,12084,28878,34450,34451,401, 34453,34454,1345, 404, 370, 34456,34457,363, 2348, 34458,34459,34460,2510, 34461,317, 7560, 1347, 34464,317, 5488, 34465, 949, 8180, 317, 31615,34467,34471,34468,351, 34469,34470,317, 7560, 5483, 345, 34472,34473,406, 10271,34475,34476,34477,2058, 34479,34480,34482,28571,34485, - 317, 7184, 317, 34481,363, 637, 24272,317, 317, 633, 633, 24657,2163, 343, 34483,34484,401, 5841, 5793, 34486,34489,5891, 25135,317, 345, 317, 317, + 317, 7184, 317, 34481,363, 637, 24272,317, 317, 633, 633, 24657,2163, 343, 34483,34484,401, 5841, 5793, 34486,34489,5891, 25135,317, 345, 317, 317, 317, 34487,34488,317, 5891, 317, 14039,34491,34493,34494,34492,28921,34496,34497,551, 15213,3125, 350, 34499,34500,381, 2322, 34502,34511,34514,34515,34518, - 1020, 34519,34521,34524,31772,34526,34531,34546,34548,10542,34553,34562,34568,34574,34575,34577,34579,317, 34503,7492, 25386,362, 34504,21617,34506,34508,2355, - 34505,317, 363, 317, 345, 6318, 317, 317, 404, 34507,317, 5223, 345, 34509,34510,27177,34512,34513,317, 317, 1347, 332, 1108, 371, 7850, 3648, 7850, + 1020, 34519,34521,34524,31772,34526,34531,34546,34548,10542,34553,34562,34568,34574,34575,34577,34579,317, 34503,7492, 25386,362, 34504,21617,34506,34508,2355, + 34505,317, 363, 317, 345, 6318, 317, 317, 404, 34507,317, 5223, 345, 34509,34510,27177,34512,34513,317, 317, 1347, 332, 1108, 371, 7850, 3648, 7850, 317, 34516,34517,501, 345, 362, 382, 317, 553, 343, 5241, 1109, 317, 370, 34520,1881, 2551, 34522,578, 34523,7651, 13201,317, 28376,34525,317, 10561, - 317, 536, 34527,450, 34528,34530,317, 26076,356, 390, 34529,34532,34538,34540,2271, 7389, 34543,317, 34544,317, 6318, 34533,317, 317, 317, 34534,317, - 317, 317, 5840, 345, 1160, 34535,16218,5488, 427, 5488, 34536,34537,34539,317, 34541,34542,317, 332, 5097, 34545,2117, 34547,13960,371, 343, 363, 356, + 317, 536, 34527,450, 34528,34530,317, 26076,356, 390, 34529,34532,34538,34540,2271, 7389, 34543,317, 34544,317, 6318, 34533,317, 317, 317, 34534,317, + 317, 317, 5840, 345, 1160, 34535,16218,5488, 427, 5488, 34536,34537,34539,317, 34541,34542,317, 332, 5097, 34545,2117, 34547,13960,371, 343, 363, 356, 343, 34549,490, 578, 317, 6195, 34550,34551,4591, 34552,34554,867, 34556,34558,356, 34555,317, 2219, 351, 390, 34557,437, 1160, 317, 350, 34559,34560, - 34561,5626, 390, 34563,363, 34565,34564,14991,362, 5332, 1020, 34566,343, 9938, 350, 363, 34567,317, 5897, 8948, 34569,34570,343, 501, 350, 350, 363, - 34571,34573,2261, 317, 317, 6831, 7949, 317, 34572,390, 11488,490, 16992,34576,2298, 363, 345, 22252,16934,34578,390, 343, 380, 34581,34582,34585,6917, - 34588,343, 34589,350, 34590,34592,34595,34601,34583,34584,343, 5088, 34586,34587,371, 33963,34591,34593,2024, 6917, 350, 317, 17462,34594,34596,34599,404, + 34561,5626, 390, 34563,363, 34565,34564,14991,362, 5332, 1020, 34566,343, 9938, 350, 363, 34567,317, 5897, 8948, 34569,34570,343, 501, 350, 350, 363, + 34571,34573,2261, 317, 317, 6831, 7949, 317, 34572,390, 11488,490, 16992,34576,2298, 363, 345, 22252,16934,34578,390, 343, 380, 34581,34582,34585,6917, + 34588,343, 34589,350, 34590,34592,34595,34601,34583,34584,343, 5088, 34586,34587,371, 33963,34591,34593,2024, 6917, 350, 317, 17462,34594,34596,34599,404, 34600,381, 332, 34597,34598,382, 20985,34602,34603,34604,5126, 34606,34608,34609,5840, 351, 34611,34612,34616,34619,34620,34621,34622,6309, 34623,34624,34626, - 34635,34636,34607,317, 343, 32606,2277, 1230, 384, 2369, 34610,317, 428, 4591, 362, 2510, 34613,34614,34615,34617,34618,2402, 363, 5087, 351, 412, 363, + 34635,34636,34607,317, 343, 32606,2277, 1230, 384, 2369, 34610,317, 428, 4591, 362, 2510, 34613,34614,34615,34617,34618,2402, 363, 5087, 351, 412, 363, 1020, 2037, 433, 2108, 5091, 5840, 4738, 5159, 34625,427, 34627,34629,343, 362, 317, 317, 34631,7949, 34628,1347, 317, 34630,317, 34632,34633,34634,13611, 34637,350, 34639,317, 317, 34640,34642,2070, 466, 34643,490, 2288, 34644,317, 34645,34647,5401, 2567, 382, 34648,27295,317, 32071,2357, 362, 2509, 34651, 34653,34657,15221,34659,34667,34696,27679,34697,25078,34700,34701,34702,34705,34654,34656,34655,34656,34658,351, 6590, 34660,34662,34663,17216,607, 34661,10130, 396, 34664,34666,34665,34668,34686,34692,34694,3611, 30196,34669,34671,396, 34674,34679,1351, 34680,34684,34670,34672,34673,34675,34676,34677,34678,34681,34682, 34683,34685,351, 1108, 317, 34687,34688,3869, 317, 34689,17236,2815, 34690,6996, 672, 34691,317, 396, 6222, 317, 1267, 1615, 34693,34695,1637, 19082,34698, 34699,370, 34703,34704,34706,34708,34707,34710,34711,317, 34712,317, 34713,34715,34737,34763,34778,34780,34788,34804,34857,34866,34868,9875, 19106,565, 34716, - 34722,317, 34723,3688, 34724,351, 34726,34728,34729,34730,34717,34718,34719,34720,34721,34725,365, 1030, 317, 5223, 5419, 5126, 2035, 5120, 34727,362, 418, + 34722,317, 34723,3688, 34724,351, 34726,34728,34729,34730,34717,34718,34719,34720,34721,34725,365, 1030, 317, 5223, 5419, 5126, 2035, 5120, 34727,362, 418, 34731,34732,34734,2210, 34733,1444, 355, 365, 34735,317, 34736,34738,34739,34753,34754,34755,19096,34758,34761,363, 34740,34741,1266, 34742,34744,34746,34749, 34743,34745,34747,608, 34748,34750,34751,34752,34756,34757,351, 367, 34759,34760,19112,1863, 545, 34762,317, 34764,34769,15600,5955, 381, 34770,34774,25055, 490, 34765,34766,34767,34768,317, 6388, 34771,34772,34773,34775,317, 1020, 362, 34776,34777,2206, 17197,34779,34781,34782,34783,34784,34785,34786,34787,34789, @@ -8469,368 +8464,368 @@ static const unsigned int ChildLocs[185261] = 34855,34806,34807,34808,34809,390, 34810,14458,34812,34813,34816,34814,34815,949, 34817,34818,34823,34824,34825,317, 34819,18854,34821,34820,34822,34826,34827, 34828,1863, 317, 34830,34832,34833,34834,34836,34843,34837,34838,34839,34842,34840,34841,3037, 31706,34845,34848,34846,34847,390, 34849,34851,34852,3557, 34853, 19112,34854,19112,317, 34856,34858,34859,34860,7672, 34865,6623, 11539,317, 9549, 317, 34861,34862,34863,2077, 12696,516, 370, 362, 363, 34864,317, 22176, - 317, 2174, 10632,31673,490, 34867,412, 367, 427, 34869,34875,34876,34877,34870,34871,34872,34873,34874,34878,34879,34937,34958,34959,34961,34973,34978,3884, + 317, 2174, 10632,31673,490, 34867,412, 367, 427, 34869,34875,34876,34877,34870,34871,34872,34873,34874,34878,34879,34937,34958,34959,34961,34973,34978,3884, 34993,34994,35054,35065,35089,35113,35117,35145,35153,35164,35179,35186,35187,34880,2211, 3726, 34888,34891,34901,317, 317, 34930,34933,2551, 8735, 34881,34882, 6517, 34884,7981, 332, 2272, 34883,5570, 6402, 2537, 5866, 34885,34886,343, 8766, 6993, 2272, 8594, 34887,2211, 317, 6402, 2715, 34889,34890,6993, 34892,34895, 34897,34898,34893,6993, 34894,1189, 5428, 25950,317, 2272, 5570, 34896,21091,2035, 34899,34900,2142, 490, 34902,34904,34907,6486, 34910,34911,34914,34915,34917, 34926,34928,23695,34903,34905,2381, 9301, 34906,8735, 34908,34909,34912,34913,17782,348, 332, 34916,490, 13559,34918,34921,34924,34925,34919,34920,8937, 34922, 27954,12949,34923,7384, 317, 2715, 490, 34927,2715, 317, 476, 21094,34929,34931,34932,34934,34935,17782,34936,17782,332, 3503, 7657, 34938,34939,34945,34949, 2022, 2037, 34951,34955,490, 5624, 317, 551, 34940,34941,343, 34943,4980, 317, 345, 388, 317, 317, 34942,34944,34946,34948,317, 34947,34950,363, 34952, - 34953,317, 34954,34956,34957,317, 2222, 11280,867, 17206,34960,4980, 539, 2022, 2022, 5173, 5055, 34941,33343,34962,371, 2087, 350, 34963,380, 34965,2219, - 34966,34969,34972,12731,350, 350, 34964,2521, 605, 15772,317, 317, 5159, 34967,343, 34968,362, 5138, 381, 2219, 2108, 2108, 466, 28586,34970,466, 350, - 34971,317, 472, 7949, 362, 317, 317, 363, 4738, 350, 34974,8948, 34976,317, 551, 10476,34975,6354, 34977,466, 317, 34979,34984,34986,317, 34991,338, + 34953,317, 34954,34956,34957,317, 2222, 11280,867, 17206,34960,4980, 539, 2022, 2022, 5173, 5055, 34941,33343,34962,371, 2087, 350, 34963,380, 34965,2219, + 34966,34969,34972,12731,350, 350, 34964,2521, 605, 15772,317, 317, 5159, 34967,343, 34968,362, 5138, 381, 2219, 2108, 2108, 466, 28586,34970,466, 350, + 34971,317, 472, 7949, 362, 317, 317, 363, 4738, 350, 34974,8948, 34976,317, 551, 10476,34975,6354, 34977,466, 317, 34979,34984,34986,317, 34991,338, 2142, 33936,8906, 34980,34981,317, 381, 5689, 34982,10446,34983,351, 34985,317, 2142, 34987,16651,34988,34990,34989,466, 317, 8603, 317, 351, 34992,34995, 34997,35003,35009,35015,35016,35019,35022,35024,35026,35028,35044,350, 21037,35047,35050,35051,35053,1020, 550, 2402, 317, 5120, 34996,365, 3284, 351, 34998, - 10533,35002,590, 34999,317, 317, 35000,317, 35001,317, 317, 317, 4980, 23256,2261, 35004,2271, 35006,351, 35005,35007,345, 35008,381, 9170, 35010,466, + 10533,35002,590, 34999,317, 317, 35000,317, 35001,317, 317, 317, 4980, 23256,2261, 35004,2271, 35006,351, 35005,35007,345, 35008,381, 9170, 35010,466, 350, 35014,8301, 317, 317, 12287,317, 35011,362, 35012,35013,356, 34332,35017,35018,35020,351, 381, 23691,35021,317, 427, 35023,418, 27199,6831, 35025, 317, 35027,2551, 2551, 317, 317, 35029,35031,35032,554, 35036,35040,35041,35042,35043,15130,317, 35030,356, 11632,343, 4952, 317, 35033,35034,35035,11962, - 317, 2271, 15952,35037,16989,35038,1347, 6600, 362, 1020, 20638,317, 23303,5332, 35039,1135, 317, 11504,356, 363, 2058, 317, 363, 351, 466, 11648,371, + 317, 2271, 15952,35037,16989,35038,1347, 6600, 362, 1020, 20638,317, 23303,5332, 35039,1135, 317, 11504,356, 363, 2058, 317, 363, 351, 466, 11648,371, 418, 317, 317, 418, 2715, 363, 6531, 35045,351, 35046,317, 2027, 35048,363, 35049,9289, 370, 545, 7618, 363, 35052,356, 351, 6532, 351, 35055,35056, 35057,35058,35061,35064,343, 380, 380, 343, 381, 4984, 35059,35060,35062,35063,35066,35067,35071,35072,317, 35076,35077,35082,35084,35086,35087,550, 35088, - 2211, 356, 351, 5159, 317, 35068,35069,35070,2110, 371, 317, 317, 5792, 2110, 317, 35073,317, 554, 9392, 596, 35075,596, 317, 380, 35074,637, 1300, - 317, 633, 633, 12605,2108, 317, 35078,35079,35080,317, 1160, 370, 2715, 317, 35081,317, 17543,345, 10619,35083,490, 9444, 11716,35085,370, 351, 350, - 8682, 317, 317, 7911, 380, 35090,35093,317, 35094,490, 35095,35096,35097,35100,35104,35107,35091,35092,9422, 6993, 490, 31015,35098,404, 490, 35099,7657, + 2211, 356, 351, 5159, 317, 35068,35069,35070,2110, 371, 317, 317, 5792, 2110, 317, 35073,317, 554, 9392, 596, 35075,596, 317, 380, 35074,637, 1300, + 317, 633, 633, 12605,2108, 317, 35078,35079,35080,317, 1160, 370, 2715, 317, 35081,317, 17543,345, 10619,35083,490, 9444, 11716,35085,370, 351, 350, + 8682, 317, 317, 7911, 380, 35090,35093,317, 35094,490, 35095,35096,35097,35100,35104,35107,35091,35092,9422, 6993, 490, 31015,35098,404, 490, 35099,7657, 35101,7657, 35103,35102,345, 34789,365, 7916, 35105,35106,35108,317, 35111,35109,34887,7142, 35110,35112,317, 35114,18661,35115,351, 343, 31987,35116,35118, 5626, 35123,35124,13319,35126,35127,35128,35134,35136,596, 35142,35143,35144,317, 35119,5238, 356, 35120,1962, 35122,317, 35121,10471,4984, 381, 2510, 22711, 350, 35125,5205, 5043, 345, 490, 2142, 390, 317, 649, 35129,35132,35133,23821,317, 35130,35131,1347, 382, 390, 317, 317, 2060, 633, 4280, 317, 35135, - 317, 351, 35137,35139,343, 35141,35138,317, 35140,317, 363, 317, 363, 317, 20487,35146,35147,9549, 4984, 35149,35150,9554, 2203, 35152,317, 551, 350, - 5865, 35148,2551, 351, 35151,380, 466, 350, 35154,35155,27913,35156,35157,35159,35163,596, 490, 3079, 367, 35158,363, 35160,3648, 35161,12712,317, 450, - 345, 1358, 317, 35162,363, 13611,3361, 2541, 35165,31972,35168,35170,489, 35171,35172,35166,35167,35169,30859,7567, 17462,35173,35176,35174,35175,35177,317, + 317, 351, 35137,35139,343, 35141,35138,317, 35140,317, 363, 317, 363, 317, 20487,35146,35147,9549, 4984, 35149,35150,9554, 2203, 35152,317, 551, 350, + 5865, 35148,2551, 351, 35151,380, 466, 350, 35154,35155,27913,35156,35157,35159,35163,596, 490, 3079, 367, 35158,363, 35160,3648, 35161,12712,317, 450, + 345, 1358, 317, 35162,363, 13611,3361, 2541, 35165,31972,35168,35170,489, 35171,35172,35166,35167,35169,30859,7567, 17462,35173,35176,35174,35175,35177,317, 35178,35180,35181,362, 35185,35178,35182,35183,343, 35184,1347, 317, 390, 3987, 501, 1992, 317, 11347,35188,35192,35193,35189,6228, 317, 633, 2631, 35190, - 317, 317, 35191,551, 317, 332, 317, 317, 35195,35196,35199,35203,35206,35213,35219,35230,35234,35235,35236,35238,35240,35242,35197,35198,35200,35202,9171, + 317, 317, 35191,551, 317, 332, 317, 317, 35195,35196,35199,35203,35206,35213,35219,35230,35234,35235,35236,35238,35240,35242,35197,35198,35200,35202,9171, 1791, 35201,343, 6831, 35204,35205,35207,35208,427, 35209,35210,35211,35212,35214,35217,35215,35216,35218,35220,35221,35223,35225,35229,35222,35224,35226,35227, 35228,35231,35233,35232,13498,317, 675, 883, 35237,35239,35241,35243,35247,6222, 35244,35245,35246,35248,35249,35250,35252,35253,5211, 18774,35254,381, 35322, 35323,35356,35375,35422,35426,35452,13777,35255,35256,35259,7651, 35270,363, 35273,35277,5226, 35280,35282,35301,35302,35309,32703,35311,35318,35319,5687, 20297, - 317, 35257,19617,35258,2510, 317, 345, 317, 5053, 5626, 32327,13226,10021,35260,35261,6021, 2022, 345, 35265,1358, 35267,35268,1999, 428, 35262,317, 6207, - 4925, 345, 35263,35264,363, 35266,1020, 6318, 35269,35271,35272,345, 35274,351, 35275,351, 2845, 35276,4591, 35278,35279,317, 20512,5037, 16679,12696,363, + 317, 35257,19617,35258,2510, 317, 345, 317, 5053, 5626, 32327,13226,10021,35260,35261,6021, 2022, 345, 35265,1358, 35267,35268,1999, 428, 35262,317, 6207, + 4925, 345, 35263,35264,363, 35266,1020, 6318, 35269,35271,35272,345, 35274,351, 35275,351, 2845, 35276,4591, 35278,35279,317, 20512,5037, 16679,12696,363, 317, 10408,35281,466, 404, 345, 35283,35284,351, 2024, 35286,7473, 350, 35288,605, 27222,35290,35297,35299,26788,317, 35285,371, 317, 381, 2402, 35287, 35289,412, 317, 35291,35292,35293,2024, 7401, 27814,12154,35294,350, 363, 317, 35296,317, 867, 479, 317, 317, 317, 381, 317, 35295,1588, 15961,35298, 404, 35300,565, 2222, 11040,35303,35304,343, 317, 350, 35308,7948, 343, 317, 35305,345, 35306,490, 345, 35307,363, 1347, 35310,5570, 1358, 35312,35313, - 35314,35315,35316,35317,317, 35320,15058,350, 35321,12523,317, 350, 317, 317, 5836, 35324,35325,35326,8022, 35327,16623,35329,35332,35334,35354,317, 2184, - 20146,404, 404, 2156, 317, 4965, 11146,35328,317, 404, 10629,35330,317, 12216,1108, 596, 35331,351, 362, 11652,35333,5142, 12523,35335,35337,35343,9624, + 35314,35315,35316,35317,317, 35320,15058,350, 35321,12523,317, 350, 317, 317, 5836, 35324,35325,35326,8022, 35327,16623,35329,35332,35334,35354,317, 2184, + 20146,404, 404, 2156, 317, 4965, 11146,35328,317, 404, 10629,35330,317, 12216,1108, 596, 35331,351, 362, 11652,35333,5142, 12523,35335,35337,35343,9624, 35345,9609, 2171, 35346,35347,35349,12417,35351,35352,6089, 35336,6552, 35338,35340,35342,35339,35341,35344,382, 317, 1011, 317, 8506, 363, 28836,317, 35348, - 35350,35353,605, 373, 2568, 35355,5105, 317, 35357,35359,35361,35362,35364,35366,490, 35371,35373,596, 35374,350, 35358,501, 35360,466, 3987, 1347, 317, - 3987, 317, 350, 35363,490, 345, 35365,3284, 317, 317, 6855, 35367,35368,35369,35370,363, 317, 317, 404, 35372,317, 13905,1077, 14644,317, 514, 3284, - 16398,35376,35384,35391,35392,396, 35394,1588, 35395,5872, 35397,317, 35398,35405,35407,35413,35418,35420,356, 35377,35379,7095, 35382,35378,317, 24623,370, - 317, 19922,317, 35380,35381,35383,317, 351, 345, 363, 35385,1338, 35386,1902, 35387,35388,350, 35389,35390,363, 2108, 12803,35393,317, 35396,3284, 381, + 35350,35353,605, 373, 2568, 35355,5105, 317, 35357,35359,35361,35362,35364,35366,490, 35371,35373,596, 35374,350, 35358,501, 35360,466, 3987, 1347, 317, + 3987, 317, 350, 35363,490, 345, 35365,3284, 317, 317, 6855, 35367,35368,35369,35370,363, 317, 317, 404, 35372,317, 13905,1077, 14644,317, 514, 3284, + 16398,35376,35384,35391,35392,396, 35394,1588, 35395,5872, 35397,317, 35398,35405,35407,35413,35418,35420,356, 35377,35379,7095, 35382,35378,317, 24623,370, + 317, 19922,317, 35380,35381,35383,317, 351, 345, 363, 35385,1338, 35386,1902, 35387,35388,350, 35389,35390,363, 2108, 12803,35393,317, 35396,3284, 381, 1345, 317, 7657, 317, 35399,1160, 35400,345, 35401,35404,345, 35402,2184, 35403,356, 5225, 345, 501, 35406,6412, 448, 12925,350, 7463, 317, 412, 35408, 35410,35411,35409,21162,345, 35412,2108, 16129,35414,35415,35416,35417,8136, 35419,351, 5295, 35421,356, 33962,490, 11831,12987,317, 35423,35424,35425,35427, 35430,317, 35444,2381, 466, 17136,22641,5055, 7261, 35446,35428,35429,35431,35432,35433,35434,35439,35441,35435,35436,35437,35438,35440,2270, 317, 2261, 35442, 35443,35445,317, 317, 35447,35450,317, 8272, 35451,35448,35449,574, 15113,380, 317, 317, 345, 35453,2290, 35465,35468,35454,2272, 35457,401, 35455,35456, 363, 380, 501, 35458,35459,35463,35460,35461,35462,35464,10709,35466,345, 1358, 317, 35467,351, 35469,35470,35471,317, 596, 2413, 35473,390, 35474,35476, 35478,35479,1044, 439, 35475,30944,3153, 1020, 35477,35480,317, 35482,35485,607, 35494,35498,35500,390, 345, 35508,35483,35484,2533, 4591, 35486,418, 35487, - 35493,317, 2184, 22578,490, 35488,35490,35489,35491,35492,371, 10351,370, 35495,1588, 35496,35497,1078, 35499,971, 5570, 2280, 35501,35502,35507,490, 1347, + 35493,317, 2184, 22578,490, 35488,35490,35489,35491,35492,371, 10351,370, 35495,1588, 35496,35497,1078, 35499,971, 5570, 2280, 35501,35502,35507,490, 1347, 371, 363, 35503,362, 35504,35505,35506,345, 6466, 35509,2585, 14132,35510,35511,3182, 35155,35512,35514,35531,35557,35565,35615,35637,35644,35653,35659,35666, - 35669,35670,35748,35759,35798,35864,35875,35924,35943,35985,36007,36020,36025,36028,2188, 15016,35513,35515,21618,11089,35516,1347, 35528,35529,1230, 543, 2156, - 35517,2571, 35521,35522,35525,35518,35519,35520,35523,35524,35526,35527,8301, 35530,11089,2022, 362, 317, 2845, 35532,35536,35537,35548,35551,317, 35553,317, + 35669,35670,35748,35759,35798,35864,35875,35924,35943,35985,36007,36020,36025,36028,2188, 15016,35513,35515,21618,11089,35516,1347, 35528,35529,1230, 543, 2156, + 35517,2571, 35521,35522,35525,35518,35519,35520,35523,35524,35526,35527,8301, 35530,11089,2022, 362, 317, 2845, 35532,35536,35537,35548,35551,317, 35553,317, 317, 35533,317, 35534,35535,317, 317, 19798,19798,15138,19565,5120, 317, 15845,363, 35538,35547,2247, 2033, 1325, 35539,35540,35541,35542,35543,35544,35545, 35546,35549,35550,6419, 1347, 11147,6594, 35552,3078, 35554,35555,2033, 35556,35558,371, 35559,35563,11086,1720, 596, 30444,345, 35560,35561,343, 35562,11034, - 381, 7408, 1444, 35564,2022, 949, 1087, 35566,35569,35572,35578,35580,11089,35586,1020, 35592,35596,2391, 35597,35599,35601,35603,35608,35609,363, 35611,2074, - 32769,35567,1325, 2177, 35568,379, 345, 35570,2571, 35571,317, 5917, 381, 317, 35573,35576,382, 35574,356, 30301,381, 2036, 35575,317, 35577,7990, 1060, + 381, 7408, 1444, 35564,2022, 949, 1087, 35566,35569,35572,35578,35580,11089,35586,1020, 35592,35596,2391, 35597,35599,35601,35603,35608,35609,363, 35611,2074, + 32769,35567,1325, 2177, 35568,379, 345, 35570,2571, 35571,317, 5917, 381, 317, 35573,35576,382, 35574,356, 30301,381, 2036, 35575,317, 35577,7990, 1060, 22207,317, 317, 35579,345, 574, 35581,21137,35583,16838,35582,35584,35585,35587,35588,490, 317, 8243, 317, 332, 317, 35589,35590,16059,6326, 35591,35593, 35595,9383, 317, 35594,5836, 317, 363, 2071, 6961, 9859, 345, 35598,5295, 317, 363, 317, 35600,5530, 365, 35602,339, 20015,35604,31644,543, 7073, 35605, 363, 35606,8023, 35607,2719, 343, 8281, 35610,363, 7214, 345, 35612,317, 35613,317, 1109, 35614,35344,35616,35617,35618,35620,466, 10907,35621,11236,35622, - 35623,35626,35630,35631,2022, 15892,6780, 343, 35619,12711,501, 317, 350, 25453,2568, 350, 1108, 317, 380, 35624,35625,5810, 1999, 35627,27506,466, 343, - 35628,350, 317, 34972,9075, 317, 35629,390, 1108, 35632,501, 2108, 35633,35636,12731,35634,1358, 362, 35635,317, 4738, 343, 9610, 351, 35638,389, 362, + 35623,35626,35630,35631,2022, 15892,6780, 343, 35619,12711,501, 317, 350, 25453,2568, 350, 1108, 317, 380, 35624,35625,5810, 1999, 35627,27506,466, 343, + 35628,350, 317, 34972,9075, 317, 35629,390, 1108, 35632,501, 2108, 35633,35636,12731,35634,1358, 362, 35635,317, 4738, 343, 9610, 351, 35638,389, 362, 35640,6309, 35642,404, 4965, 35639,362, 2022, 5608, 362, 9657, 35641,21303,390, 35643,35645,35646,35648,317, 35649,5241, 35650,527, 35651,317, 397, 24122, 317, 1329, 35647,3079, 5055, 2156, 2218, 345, 380, 1459, 1383, 3599, 363, 35652,35654,35656,553, 317, 35658,2184, 35655,317, 317, 2719, 35657,356, 35655, - 343, 35660,35661,317, 343, 35664,35665,381, 350, 317, 317, 35662,35663,345, 6379, 317, 13498,1915, 2110, 554, 35667,35668,317, 382, 8096, 1999, 370, - 6195, 317, 35671,35673,35093,35674,35711,35719,35727,35729,35734,35735,35742,35745,11539,35746,35747,317, 8455, 24029,2188, 35672,317, 13553,317, 317, 4949, - 363, 1266, 35675,35676,35680,35684,35689,35691,35692,35693,350, 35694,35695,35697,35702,412, 35708,4984, 317, 343, 317, 2152, 317, 35677,35678,35679,2117, - 427, 362, 35681,11411,317, 317, 35682,35683,362, 2063, 9012, 4949, 1345, 4717, 35685,35686,13646,476, 6710, 35687,35688,390, 317, 2222, 35690,22609,479, - 350, 501, 363, 2152, 1160, 17189,11678,501, 10580,2357, 7662, 2272, 3529, 7672, 7850, 24638,35696,35698,25352,2193, 35699,363, 35701,29521,7590, 10453,317, + 343, 35660,35661,317, 343, 35664,35665,381, 350, 317, 317, 35662,35663,345, 6379, 317, 13498,1915, 2110, 554, 35667,35668,317, 382, 8096, 1999, 370, + 6195, 317, 35671,35673,35093,35674,35711,35719,35727,35729,35734,35735,35742,35745,11539,35746,35747,317, 8455, 24029,2188, 35672,317, 13553,317, 317, 4949, + 363, 1266, 35675,35676,35680,35684,35689,35691,35692,35693,350, 35694,35695,35697,35702,412, 35708,4984, 317, 343, 317, 2152, 317, 35677,35678,35679,2117, + 427, 362, 35681,11411,317, 317, 35682,35683,362, 2063, 9012, 4949, 1345, 4717, 35685,35686,13646,476, 6710, 35687,35688,390, 317, 2222, 35690,22609,479, + 350, 501, 363, 2152, 1160, 17189,11678,501, 10580,2357, 7662, 2272, 3529, 7672, 7850, 24638,35696,35698,25352,2193, 35699,363, 35701,29521,7590, 10453,317, 35700,317, 15951,351, 28722,14338,35703,35706,35707,9176, 35704,35705,35709,35710,363, 343, 7651, 350, 35712,35714,317, 35716,35718,3967, 9667, 317, 35713, - 35715,8296, 8296, 363, 35717,317, 317, 5836, 11280,637, 35720,694, 633, 320, 633, 543, 35721,35722,2715, 35724,362, 385, 317, 867, 35726,1999, 7477, + 35715,8296, 8296, 363, 35717,317, 317, 5836, 11280,637, 35720,694, 633, 320, 633, 543, 35721,35722,2715, 35724,362, 385, 317, 867, 35726,1999, 7477, 35723,637, 5942, 1909, 633, 317, 35725,317, 35728,651, 1459, 35730,371, 13856,317, 35731,317, 5836, 3079, 390, 35733,343, 317, 317, 317, 24487,35732, - 5836, 4965, 363, 35736,35737,14223,35738,362, 2391, 35740,427, 35741,317, 1230, 4773, 1230, 351, 35739,317, 317, 418, 317, 317, 10796,35743,1481, 1160, - 9909, 35744,1109, 5836, 35749,35750,35752,35753,2222, 35754,35756,20237,35758,371, 35751,345, 317, 6648, 317, 345, 317, 1160, 12588,317, 380, 35755,4984, + 5836, 4965, 363, 35736,35737,14223,35738,362, 2391, 35740,427, 35741,317, 1230, 4773, 1230, 351, 35739,317, 317, 418, 317, 317, 10796,35743,1481, 1160, + 9909, 35744,1109, 5836, 35749,35750,35752,35753,2222, 35754,35756,20237,35758,371, 35751,345, 317, 6648, 317, 345, 317, 1160, 12588,317, 380, 35755,4984, 2533, 317, 35757,317, 35760,355, 35765,35770,35775,35776,35780,35781,35783,35785,35789,5037, 35790,35791,35761,12920,370, 18305,380, 35762,317, 35763,35764, - 35766,317, 35768,6450, 35767,35769,3529, 13392,12332,1109, 35771,35774,9702, 35772,4987, 1347, 35773,388, 1347, 317, 317, 317, 35777,2110, 35779,35778,317, - 35782,2381, 450, 5037, 596, 35784,35786,12946,35788,490, 17637,35787,317, 5392, 596, 596, 8296, 351, 6855, 2236, 317, 15313,5943, 35792,35795,35797,490, - 35793,5392, 35794,5392, 1347, 35796,345, 5392, 6228, 35796,317, 35799,14995,35801,370, 35847,35848,7023, 35851,35855,35856,35859,1345, 35860,35863,35800,343, + 35766,317, 35768,6450, 35767,35769,3529, 13392,12332,1109, 35771,35774,9702, 35772,4987, 1347, 35773,388, 1347, 317, 317, 317, 35777,2110, 35779,35778,317, + 35782,2381, 450, 5037, 596, 35784,35786,12946,35788,490, 17637,35787,317, 5392, 596, 596, 8296, 351, 6855, 2236, 317, 15313,5943, 35792,35795,35797,490, + 35793,5392, 35794,5392, 1347, 35796,345, 5392, 6228, 35796,317, 35799,14995,35801,370, 35847,35848,7023, 35851,35855,35856,35859,1345, 35860,35863,35800,343, 35802,2809, 35805,35806,35807,24120,35809,35810,35814,35818,35820,35821,32606,35823,35824,35827,35830,2272, 35833,35837,35840,35843,1020, 35844,35846,35803,35804, 740, 1271, 343, 2402, 317, 589, 1588, 350, 17219,356, 350, 35808,16602,370, 382, 380, 12815,35811,35813,317, 5897, 35812,35815,6598, 2063, 13320,35816, - 35817,1347, 605, 2060, 351, 35819,356, 1531, 343, 363, 380, 1999, 34256,373, 343, 35822,22412,404, 363, 2301, 439, 15864,35825,35826,384, 317, 343, - 1992, 35828,35829,35831,31252,35832,317, 345, 345, 35834,3621, 35835,35836,35838,35839,29510,427, 10592,990, 35841,574, 363, 3646, 35842,1020, 2181, 6166, - 2809, 349, 35845,2063, 363, 380, 1358, 543, 356, 466, 345, 6227, 317, 343, 35849,35850,317, 317, 18206,317, 437, 35852,35853,362, 35854,7384, 343, - 4984, 35857,2156, 317, 317, 35858,317, 317, 370, 35861,343, 1020, 13378,317, 317, 317, 35862,317, 362, 317, 317, 317, 7590, 32944,35865,363, 2509, + 35817,1347, 605, 2060, 351, 35819,356, 1531, 343, 363, 380, 1999, 34256,373, 343, 35822,22412,404, 363, 2301, 439, 15864,35825,35826,384, 317, 343, + 1992, 35828,35829,35831,31252,35832,317, 345, 345, 35834,3621, 35835,35836,35838,35839,29510,427, 10592,990, 35841,574, 363, 3646, 35842,1020, 2181, 6166, + 2809, 349, 35845,2063, 363, 380, 1358, 543, 356, 466, 345, 6227, 317, 343, 35849,35850,317, 317, 18206,317, 437, 35852,35853,362, 35854,7384, 343, + 4984, 35857,2156, 317, 317, 35858,317, 317, 370, 35861,343, 1020, 13378,317, 317, 317, 35862,317, 362, 317, 317, 317, 7590, 32944,35865,363, 2509, 35873,883, 6693, 13386,18138,35866,35867,35868,1444, 35869,317, 35870,35871,35872,317, 35874,35876,35879,35882,35885,35894,35899,554, 35901,35906,35907,35910, 35912,35915,35917,35920,35921,427, 35922,35923,553, 35877,11198,345, 35878,2261, 35880,19979,35881,317, 1880, 345, 35883,35884,490, 5836, 4984, 12886,35886, 2022, 350, 35890,1160, 363, 35887,35888,35889,317, 7143, 8099, 5295, 317, 35891,35893,35892,35895,35896,317, 35897,35898,317, 2715, 317, 365, 2590, 12062, - 5120, 317, 5896, 343, 2142, 317, 6002, 18712,348, 10196,35900,1358, 5138, 490, 35902,35903,1992, 317, 345, 5241, 317, 35904,35905,370, 35908,35909,1108, - 35911,5661, 2369, 418, 34320,317, 35913,35914,6999, 317, 332, 317, 371, 317, 23547,35916,10626,428, 35918,380, 35919,317, 5838, 2271, 2108, 1913, 332, - 605, 11347,317, 35925,35926,35927,16136,35928,7490, 3078, 35931,362, 15733,35932,35933,35938,35941,35942,317, 1358, 5158, 317, 17469,317, 35929,363, 317, + 5120, 317, 5896, 343, 2142, 317, 6002, 18712,348, 10196,35900,1358, 5138, 490, 35902,35903,1992, 317, 345, 5241, 317, 35904,35905,370, 35908,35909,1108, + 35911,5661, 2369, 418, 34320,317, 35913,35914,6999, 317, 332, 317, 371, 317, 23547,35916,10626,428, 35918,380, 35919,317, 5838, 2271, 2108, 1913, 332, + 605, 11347,317, 35925,35926,35927,16136,35928,7490, 3078, 35931,362, 15733,35932,35933,35938,35941,35942,317, 1358, 5158, 317, 17469,317, 35929,363, 317, 35930,351, 343, 28276,4564, 339, 1999, 1033, 35934,35935,35936,511, 362, 35937,371, 343, 350, 356, 1020, 317, 15821,5223, 9244, 13638,1020, 35939,12705, 5836, 317, 35940,5836, 3429, 384, 35944,35945,35947,35950,35954,35955,35956,35957,35958,35960,35963,9688, 35983,317, 35946,427, 35948,35949,5737, 35951,35952, 35953,332, 317, 2188, 490, 6917, 317, 439, 367, 434, 3987, 381, 1481, 1347, 35959,35961,543, 35962,30992,35964,35965,35973,35974,35975,343, 35976,35977, - 404, 35978,2381, 10538,35966,317, 35967,450, 35968,35969,35970,35971,35972,15280,2206, 2334, 10093,367, 35979,543, 35980,35981,343, 35982,317, 35984,2410, + 404, 35978,2381, 10538,35966,317, 35967,450, 35968,35969,35970,35971,35972,15280,2206, 2334, 10093,367, 35979,543, 35980,35981,343, 35982,317, 35984,2410, 9303, 35986,35987,35989,363, 350, 35992,35996,3361, 35997,343, 36000,36003,36006,317, 35988,343, 343, 11921,317, 590, 2584, 35990,35991,8137, 35993,35994, - 35995,13190,10820,4925, 10011,479, 363, 16651,362, 23079,35998,35999,16838,539, 384, 367, 2236, 36001,317, 36002,36004,490, 36005,18305,317, 381, 363, - 36008,36014,36019,317, 317, 36009,36010,317, 317, 36011,14932,466, 25302,36012,317, 36013,5689, 9139, 317, 36015,36016,4984, 36017,36018,345, 365, 595, - 36021,10533,36022,36023,350, 1347, 36024,380, 1347, 1347, 381, 317, 363, 1358, 363, 36026,332, 490, 14088,2156, 317, 36027,36029,362, 317, 351, 345, + 35995,13190,10820,4925, 10011,479, 363, 16651,362, 23079,35998,35999,16838,539, 384, 367, 2236, 36001,317, 36002,36004,490, 36005,18305,317, 381, 363, + 36008,36014,36019,317, 317, 36009,36010,317, 317, 36011,14932,466, 25302,36012,317, 36013,5689, 9139, 317, 36015,36016,4984, 36017,36018,345, 365, 595, + 36021,10533,36022,36023,350, 1347, 36024,380, 1347, 1347, 381, 317, 363, 1358, 363, 36026,332, 490, 14088,2156, 317, 36027,36029,362, 317, 351, 345, 317, 345, 36032,36033,36034,36035,116, 36218,7149, 117, 36325,554, 118, 119, 36496,36499,36535,36542,379, 2272, 36036,36040,36050,36060,36066,36069,36076, 36078,36083,36085,36087,36088,36104,36164,36171,36182,36188,36191,36207,36208,36213,36037,317, 317, 36038,36039,36041,36043,36044,8948, 36045,6917, 350, 36047, - 11831,317, 10315,36042,5991, 3999, 317, 317, 15308,5223, 380, 36046,350, 3284, 5836, 3284, 36048,36049,11844,36051,5425, 36052,36056,317, 10317,36053,317, - 317, 317, 36054,36055,317, 317, 332, 5701, 36057,36058,36059,382, 7834, 7954, 317, 317, 345, 31178,5365, 370, 36061,2024, 36062,10223,2022, 12803,3284, + 11831,317, 10315,36042,5991, 3999, 317, 317, 15308,5223, 380, 36046,350, 3284, 5836, 3284, 36048,36049,11844,36051,5425, 36052,36056,317, 10317,36053,317, + 317, 317, 36054,36055,317, 317, 332, 5701, 36057,36058,36059,382, 7834, 7954, 317, 317, 345, 31178,5365, 370, 36061,2024, 36062,10223,2022, 12803,3284, 36063,36065,317, 317, 317, 317, 317, 8488, 317, 345, 4267, 17335,382, 1481, 345, 36064,5324, 5502, 428, 7852, 350, 36067,25781,343, 317, 350, 36068, 2033, 36070,36071,14680,36075,36072,332, 36074,2022, 36073,317, 356, 466, 363, 317, 345, 36077,317, 317, 404, 36079,317, 317, 317, 317, 36082,36080, 317, 317, 317, 36081,2566, 317, 2086, 317, 36084,343, 15608,350, 343, 317, 317, 6394, 36086,7785, 5836, 317, 36089,36090,317, 36091,554, 11347,36093, - 36094,36101,36103,12860,490, 4949, 472, 317, 317, 363, 36092,317, 370, 33256,36095,9450, 36100,1347, 36096,36097,36098,36099,5418, 345, 381, 10480,2210, + 36094,36101,36103,12860,490, 4949, 472, 317, 317, 363, 36092,317, 370, 33256,36095,9450, 36100,1347, 36096,36097,36098,36099,5418, 345, 381, 10480,2210, 381, 36102,317, 5419, 317, 345, 36105,36107,36108,36139,9624, 36140,8223, 36142,490, 4962, 490, 36146,36148,317, 6601, 5138, 36152,36154,36156,36162,36163, - 19707,362, 317, 5201, 36106,32950,2163, 317, 317, 36109,36110,36111,36116,36118,36119,36122,5628, 7328, 36125,36128,36130,36131,36134,317, 36138,5573, 317, - 16278,7590, 2163, 36112,36113,36114,36115,36117,11874,12485,1347, 317, 7214, 5223, 351, 36120,6598, 36121,36123,36124,393, 4980, 36126,36127,317, 2551, 490, - 14558,381, 23034,36129,18941,4437, 317, 19791,317, 36132,36133,1588, 5055, 36135,36136,396, 36137,18104,2317, 6402, 317, 317, 317, 36141,10854,317, 317, - 36143,36144,36145,332, 545, 332, 363, 36147,345, 427, 317, 36149,36151,36150,10641,370, 36153,317, 317, 9109, 36155,15058,15983,7866, 317, 5037, 317, - 7386, 36157,36158,1347, 36159,13323,5536, 36160,490, 36161,24070,578, 5687, 363, 605, 36165,36167,36170,4045, 36166,317, 28210,8000, 36168,36169,317, 2156, + 19707,362, 317, 5201, 36106,32950,2163, 317, 317, 36109,36110,36111,36116,36118,36119,36122,5628, 7328, 36125,36128,36130,36131,36134,317, 36138,5573, 317, + 16278,7590, 2163, 36112,36113,36114,36115,36117,11874,12485,1347, 317, 7214, 5223, 351, 36120,6598, 36121,36123,36124,393, 4980, 36126,36127,317, 2551, 490, + 14558,381, 23034,36129,18941,4437, 317, 19791,317, 36132,36133,1588, 5055, 36135,36136,396, 36137,18104,2317, 6402, 317, 317, 317, 36141,10854,317, 317, + 36143,36144,36145,332, 545, 332, 363, 36147,345, 427, 317, 36149,36151,36150,10641,370, 36153,317, 317, 9109, 36155,15058,15983,7866, 317, 5037, 317, + 7386, 36157,36158,1347, 36159,13323,5536, 36160,490, 36161,24070,578, 5687, 363, 605, 36165,36167,36170,4045, 36166,317, 28210,8000, 36168,36169,317, 2156, 343, 5700, 382, 343, 427, 317, 317, 20331,24322,317, 351, 36172,36173,5273, 36174,36181,363, 1588, 384, 384, 317, 5570, 8136, 36175,5891, 36178,36179, - 317, 36180,317, 317, 427, 36176,36177,11229,1345, 5663, 350, 317, 36183,36184,36186,36187,317, 317, 10891,317, 317, 4984, 36185,10878,381, 317, 4040, + 317, 36180,317, 317, 427, 36176,36177,11229,1345, 5663, 350, 317, 36183,36184,36186,36187,317, 317, 10891,317, 317, 4984, 36185,10878,381, 317, 4040, 12464,511, 363, 2142, 363, 36189,13392,2515, 317, 362, 317, 551, 5898, 36190,36192,36193,36201,15732,2163, 1588, 1160, 332, 5223, 317, 36194,36196,36197, 5223, 36198,10820,11263,36195,18885,13269,317, 317, 439, 36199,36200,8234, 317, 36202,36203,4984, 317, 317, 317, 317, 36204,1325, 36205,36206,36209,36210, 404, 9450, 3599, 389, 511, 36211,36212,13650,433, 428, 6195, 5684, 317, 9124, 36214,2035, 13262,36215,382, 36216,36217,365, 36219,36221,36226,36227,36228, - 36229,36278,36279,36287,13376,36292,36296,605, 36304,36307,36310,36311,36315,36316,36220,388, 317, 5661, 317, 36222,36224,316, 16220,36223,466, 363, 317, - 6228, 362, 24398,2066, 7401, 370, 362, 36225,2272, 34185,2078, 5883, 35822,363, 350, 317, 332, 317, 362, 317, 16310,351, 317, 343, 36230,36233,5661, + 36229,36278,36279,36287,13376,36292,36296,605, 36304,36307,36310,36311,36315,36316,36220,388, 317, 5661, 317, 36222,36224,316, 16220,36223,466, 363, 317, + 6228, 362, 24398,2066, 7401, 370, 362, 36225,2272, 34185,2078, 5883, 35822,363, 350, 317, 332, 317, 362, 317, 16310,351, 317, 343, 36230,36233,5661, 317, 36234,317, 317, 12189,10876,36277,36231,317, 317, 36232,317, 8301, 2063, 317, 36235,14278,1267, 36236,1615, 1353, 4243, 1025, 1353, 36237,36240,36245, 36247,36249,36250,36251,36253,36257,36258,36263,317, 36264,36265,5956, 36268,36272,1060, 5037, 36273,317, 380, 317, 36238,36239,36241,36243,17889,2236, 36244, 36242,371, 427, 317, 381, 11678,317, 382, 390, 36246,372, 317, 36248,382, 382, 317, 1345, 381, 5037, 2156, 32998,6598, 551, 317, 36252,370, 36254, - 4563, 36256,36255,317, 317, 7506, 550, 990, 4965, 382, 390, 36259,36261,36262,605, 363, 317, 36260,317, 5746, 478, 1383, 1347, 381, 317, 317, 396, + 4563, 36256,36255,317, 317, 7506, 550, 990, 4965, 382, 390, 36259,36261,36262,605, 363, 317, 36260,317, 5746, 478, 1383, 1347, 381, 317, 317, 396, 471, 317, 363, 23950,350, 371, 4943, 36266,36267,2369, 381, 439, 36269,24775,7942, 36270,36271,867, 4949, 1020, 2272, 3076, 490, 5841, 19466,36274,36276, - 9768, 16059,343, 36275,317, 1347, 12563,317, 317, 317, 9289, 651, 649, 36280,36281,36282,36283,36286,345, 14062,1588, 36284,5836, 36285,3529, 3284, 1160, + 9768, 16059,343, 36275,317, 1347, 12563,317, 317, 317, 9289, 651, 649, 36280,36281,36282,36283,36286,345, 14062,1588, 36284,5836, 36285,3529, 3284, 1160, 4984, 390, 1347, 345, 363, 6412, 350, 350, 36288,357, 317, 36289,36290,343, 317, 317, 10537,351, 36291,350, 317, 12731,36293,36294,36295,317, 12588, - 2219, 317, 351, 20684,2033, 4738, 36297,36300,381, 3987, 345, 36302,7865, 4952, 36303,27906,2317, 5037, 1230, 317, 342, 36298,317, 1347, 36299,363, 2510, - 596, 5105, 36301,351, 2219, 332, 36305,332, 8392, 36306,427, 883, 2117, 15745,30881,1160, 21245,5105, 2222, 490, 317, 2108, 11688,36308,4738, 36309,350, + 2219, 317, 351, 20684,2033, 4738, 36297,36300,381, 3987, 345, 36302,7865, 4952, 36303,27906,2317, 5037, 1230, 317, 342, 36298,317, 1347, 36299,363, 2510, + 596, 5105, 36301,351, 2219, 332, 36305,332, 8392, 36306,427, 883, 2117, 15745,30881,1160, 21245,5105, 2222, 490, 317, 2108, 11688,36308,4738, 36309,350, 2134, 380, 8178, 419, 11409,36312,36313,2067, 36314,380, 20909,12429,36317,36318,36319,389, 2584, 10854,36322,8177, 36323,7850, 36324,316, 14299,32024,36320, - 36321,363, 7438, 12711,2206, 36326,36327,36330,36332,36333,36344,36350,36359,36361,36364,36374,381, 36382,36384,36385,36394,36397,317, 36398,36328,1020, 363, + 36321,363, 7438, 12711,2206, 36326,36327,36330,36332,36333,36344,36350,36359,36361,36364,36374,381, 36382,36384,36385,36394,36397,317, 36398,36328,1020, 363, 36329,343, 317, 36331,317, 373, 351, 13338,15915,317, 36334,332, 1383, 36335,1358, 36336,7214, 36339,317, 36343,380, 511, 36337,36338,36340,4965, 36341, - 36342,6596, 317, 317, 2334, 1060, 5708, 5447, 466, 7834, 317, 36345,363, 363, 11211,14161,36346,36347,5616, 390, 317, 317, 317, 317, 317, 390, 1160, - 12361,36348,317, 36349,36351,36354,332, 501, 36355,36356,36358,36352,317, 36353,2581, 36357,10072,317, 7118, 6600, 36360,36362,317, 36363,7871, 5223, 317, - 317, 317, 574, 317, 36365,1347, 343, 36366,36367,36368,36369,36372,6089, 343, 5438, 356, 356, 370, 343, 5961, 317, 20880,4591, 317, 36370,36371,370, + 36342,6596, 317, 317, 2334, 1060, 5708, 5447, 466, 7834, 317, 36345,363, 363, 11211,14161,36346,36347,5616, 390, 317, 317, 317, 317, 317, 390, 1160, + 12361,36348,317, 36349,36351,36354,332, 501, 36355,36356,36358,36352,317, 36353,2581, 36357,10072,317, 7118, 6600, 36360,36362,317, 36363,7871, 5223, 317, + 317, 317, 574, 317, 36365,1347, 343, 36366,36367,36368,36369,36372,6089, 343, 5438, 356, 356, 370, 343, 5961, 317, 20880,4591, 317, 36370,36371,370, 12154,2022, 36373,356, 355, 363, 990, 5896, 390, 36375,6546, 332, 1358, 2021, 362, 36380,36381,350, 21973,317, 2171, 36376,7401, 466, 343, 36378,36377, 1347, 439, 317, 10538,36379,3529, 2272, 363, 11654,466, 12448,11089,9521, 466, 36383,317, 15044,7871, 317, 5043, 370, 426, 36386,36387,370, 20774,36389, - 36390,36391,36392,9581, 490, 36388,317, 345, 22906,317, 427, 14535,4738, 28565,2261, 343, 18640,578, 428, 36393,356, 578, 362, 317, 36395,36396,317, + 36390,36391,36392,9581, 490, 36388,317, 345, 22906,317, 427, 14535,4738, 28565,2261, 343, 18640,578, 428, 36393,356, 578, 362, 317, 36395,36396,317, 390, 7035, 363, 350, 363, 317, 345, 6993, 5611, 365, 36399,36400,9878, 36401,317, 5955, 356, 19163,2156, 1160, 36402,36403,36405,36408,36411,36417,36418, - 36419,363, 7892, 36421,36424,36426,36431,36435,36438,36465,36475,36490,36493,345, 36495,11613,1347, 363, 36404,2405, 9012, 317, 36406,36407,2117, 362, 6123, - 433, 20102,36409,4984, 332, 3284, 36410,9937, 2298, 36412,465, 36415,36416,36413,466, 343, 36414,6598, 966, 10487,2507, 350, 317, 5662, 36420,317, 5836, - 553, 5836, 10471,350, 36422,2108, 36423,362, 363, 351, 381, 2022, 22727,36425,8099, 317, 5896, 36427,36428,36429,13638,4962, 36430,6601, 2128, 543, 7852, - 363, 5223, 10538,11940,1108, 370, 36432,36433,1358, 36434,11442,8136, 466, 9844, 8136, 363, 1160, 1325, 36436,36437,36439,36440,36442,36444,5628, 36445,4952, + 36419,363, 7892, 36421,36424,36426,36431,36435,36438,36465,36475,36490,36493,345, 36495,11613,1347, 363, 36404,2405, 9012, 317, 36406,36407,2117, 362, 6123, + 433, 20102,36409,4984, 332, 3284, 36410,9937, 2298, 36412,465, 36415,36416,36413,466, 343, 36414,6598, 966, 10487,2507, 350, 317, 5662, 36420,317, 5836, + 553, 5836, 10471,350, 36422,2108, 36423,362, 363, 351, 381, 2022, 22727,36425,8099, 317, 5896, 36427,36428,36429,13638,4962, 36430,6601, 2128, 543, 7852, + 363, 5223, 10538,11940,1108, 370, 36432,36433,1358, 36434,11442,8136, 466, 9844, 8136, 363, 1160, 1325, 36436,36437,36439,36440,36442,36444,5628, 36445,4952, 36446,36447,36462,36464,7850, 350, 317, 317, 36441,412, 36443,2391, 3079, 371, 466, 16020,317, 384, 5896, 36448,36454,6704, 36457,36458,5661, 36459,36460, 317, 11308,36449,36450,36451,36452,36453,317, 36455,317, 317, 36456,6415, 14835,16020,5663, 2405, 545, 36461,36463,5896, 36466,36469,4591, 363, 36473,36474, 36467,9226, 36468,4591, 36470,3529, 351, 36471,36472,551, 36476,316, 36478,36486,343, 317, 36477,36479,36480,356, 36482,466, 36483,9479, 36484,36485,36481, 476, 14695,33875,362, 3987, 349, 406, 36487,29185,36489,363, 317, 36488,36491,350, 36492,317, 317, 439, 466, 511, 2584, 501, 32544,3999, 16802,36494, 317, 15951,370, 6736, 36497,36498,317, 18770,36500,490, 36502,36507,36512,350, 36514,36515,36516,36517,36519,36528,36532,2188, 350, 3987, 16371,7021, 36501, - 33733,362, 317, 317, 317, 351, 466, 317, 317, 317, 5332, 36503,317, 36504,1347, 8553, 36505,36506,363, 5836, 350, 36508,36509,36511,381, 466, 2184, - 5896, 36510,11939,12704,10538,10487,351, 2060, 36513,2051, 2051, 8993, 350, 317, 10223,404, 363, 36518,12744,362, 2022, 11944,2108, 2272, 12422,590, 5896, + 33733,362, 317, 317, 317, 351, 466, 317, 317, 317, 5332, 36503,317, 36504,1347, 8553, 36505,36506,363, 5836, 350, 36508,36509,36511,381, 466, 2184, + 5896, 36510,11939,12704,10538,10487,351, 2060, 36513,2051, 2051, 8993, 350, 317, 10223,404, 363, 36518,12744,362, 2022, 11944,2108, 2272, 12422,590, 5896, 36520,36525,6598, 6021, 36526,14806,605, 381, 36527,10538,12696,36521,343, 36523,363, 36524,317, 36522,9938, 5223, 10538,371, 10086,317, 350, 466, 19922, 317, 317, 317, 317, 317, 36529,317, 36530,317, 36531,36533,1109, 363, 490, 36534,348, 12933,466, 2134, 350, 36536,2203, 2033, 596, 36538,10480,36539, 36537,36540,36541,36543,36548,14806,36544,7850, 36547,36545,36546,16910,36549,4773, 11347,36551,36554,36557,2584, 3869, 36560,36561,36552,36553,380, 36555,36556, - 36558,36559,355, 7852, 511, 36562,36563,620, 2731, 620, 1688, 620, 36565,36567,36580,36582,36587,36594,16146,371, 36597,36598,36566,466, 36568,36569,351, + 36558,36559,355, 7852, 511, 36562,36563,620, 2731, 620, 1688, 620, 36565,36567,36580,36582,36587,36594,16146,371, 36597,36598,36566,466, 36568,36569,351, 34810,36570,36574,36571,36572,36573,36575,36579,36576,36577,36578,36581,35726,317, 36583,36584,36585,36586,36588,612, 36589,30114,32202,36590,36591,36592,36593, 36595,36596,36599,36600,36601,36659,36668,36673,36687,36724,36726,26830,36736,36815,36821,36847,36855,6600, 36891,36894,36916,36928,345, 36959,36961,36968,36602, 36604,36618,36622,36623,36624,6600, 36625,332, 36636,36652,36653,490, 36657,36603,36605,36615,36617,36606,36608,11446,36607,36609,36610,36611,36614,36612,36613, 36616,5043, 36619,36620,36621,6940, 2110, 13174,13233,36626,342, 23682,36629,36631,36632,36633,1020, 36635,6834, 36627,36628,5623, 36630,19307,36634,36637,36642, 5570, 36646,36648,36650,36638,317, 36639,36640,2510, 317, 36641,36643,356, 7401, 36644,5005, 18700,332, 11446,36645,17160,2381, 558, 36647,7668, 5428, 36649, 7273, 317, 36651,5032, 36654,2177, 36655,36656,36658,348, 17363,490, 490, 9470, 317, 6817, 36660,36662,36667,350, 350, 351, 36661,36663,362, 36664,36665, - 5619, 36666,317, 8700, 317, 17856,36669,36672,362, 490, 36670,317, 36671,2272, 36674,36675,36678,36680,36681,36685,36676,36677,362, 16860,36679,5105, 363, - 317, 380, 9215, 317, 36682,36683,36684,5996, 351, 36686,363, 36688,2416, 36689,1915, 36691,36693,36694,36700,36713,36716,36722,2110, 1999, 36690,5624, 370, - 2188, 36692,396, 1109, 29747,345, 350, 2134, 2610, 36695,363, 36698,36696,404, 36697,351, 36699,351, 350, 351, 551, 2537, 36701,36703,36705,36706,317, + 5619, 36666,317, 8700, 317, 17856,36669,36672,362, 490, 36670,317, 36671,2272, 36674,36675,36678,36680,36681,36685,36676,36677,362, 16860,36679,5105, 363, + 317, 380, 9215, 317, 36682,36683,36684,5996, 351, 36686,363, 36688,2416, 36689,1915, 36691,36693,36694,36700,36713,36716,36722,2110, 1999, 36690,5624, 370, + 2188, 36692,396, 1109, 29747,345, 350, 2134, 2610, 36695,363, 36698,36696,404, 36697,351, 36699,351, 350, 351, 551, 2537, 36701,36703,36705,36706,317, 1020, 490, 490, 36702,5792, 17335,36704,2280, 2022, 36707,36708,36709,36711,317, 381, 5890, 867, 17368,574, 332, 36710,17335,365, 36712,362, 36714,36715, - 317, 5464, 14172,317, 2416, 317, 356, 7504, 466, 317, 36717,8083, 36720,490, 36718,36719,36721,36723,2110, 363, 490, 7060, 36725,5043, 370, 363, 317, - 36727,36728,5570, 36730,36729,2086, 13364,351, 36731,36732,36735,3874, 36733,36734,36737,36738,36741,36742,36748,35094,36749,350, 35170,36751,36779,36782,363, - 36789,36790,36793,2357, 36814,317, 5238, 6409, 317, 36739,36740,36743,36744,36745,36746,36747,13174,514, 317, 7448, 317, 8000, 317, 1109, 317, 2715, 1230, + 317, 5464, 14172,317, 2416, 317, 356, 7504, 466, 317, 36717,8083, 36720,490, 36718,36719,36721,36723,2110, 363, 490, 7060, 36725,5043, 370, 363, 317, + 36727,36728,5570, 36730,36729,2086, 13364,351, 36731,36732,36735,3874, 36733,36734,36737,36738,36741,36742,36748,35094,36749,350, 35170,36751,36779,36782,363, + 36789,36790,36793,2357, 36814,317, 5238, 6409, 317, 36739,36740,36743,36744,36745,36746,36747,13174,514, 317, 7448, 317, 8000, 317, 1109, 317, 2715, 1230, 317, 317, 317, 317, 2715, 370, 1108, 317, 317, 2022, 36750,36752,36756,1347, 36761,36763,36764,36767,36776,36777,36778,9319, 36753,550, 36754,381, 36755, 36757,2024, 543, 317, 1032, 36758,36760,36759,36762,380, 345, 356, 373, 36765,317, 36766,36768,36770,8117, 36774,363, 490, 317, 370, 36769,11921,36771, 317, 36772,9244, 2610, 1915, 9319, 14981,36773,370, 36775,317, 317, 25651,343, 1020, 2610, 356, 350, 350, 317, 36780,439, 36781,596, 317, 345, 36783, 370, 36784,11709,343, 36786,36787,550, 1358, 5325, 36785,345, 8906, 317, 9443, 317, 317, 24130,1060, 36788,350, 317, 439, 317, 2163, 36791,550, 36792, 4738, 365, 365, 1999, 7064, 36794,36807,317, 36809,11921,36810,317, 332, 36795,36796,637, 5942, 633, 317, 317, 5517, 36799,5217, 490, 317, 36797,36798, - 36800,36801,36802,317, 36803,36804,36805,36806,36808,1108, 6555, 363, 36807,351, 36811,36813,36812,6555, 351, 589, 381, 36816,565, 36818,36817,36819,317, - 36820,317, 36822,36823,390, 36829,36832,36833,36837,343, 36840,7579, 36844,7567, 317, 36846,317, 348, 565, 317, 317, 317, 9244, 365, 19855,36824,345, + 36800,36801,36802,317, 36803,36804,36805,36806,36808,1108, 6555, 363, 36807,351, 36811,36813,36812,6555, 351, 589, 381, 36816,565, 36818,36817,36819,317, + 36820,317, 36822,36823,390, 36829,36832,36833,36837,343, 36840,7579, 36844,7567, 317, 36846,317, 348, 565, 317, 317, 317, 9244, 365, 19855,36824,345, 36826,11342,36825,36827,317, 36828,8051, 6046, 36830,36831,363, 662, 317, 3075, 36834,36835,36836,371, 2188, 36838,36839,2537, 5570, 362, 36841,36842,36843, - 20276,317, 466, 317, 343, 343, 317, 10820,990, 10820,317, 373, 12940,345, 6831, 382, 363, 317, 350, 2551, 36845,384, 351, 362, 404, 10081,350, + 20276,317, 466, 317, 343, 343, 317, 10820,990, 10820,317, 373, 12940,345, 6831, 382, 363, 317, 350, 2551, 36845,384, 351, 362, 404, 10081,350, 36848,6454, 6847, 36849,36853,36854,317, 428, 24831,317, 317, 1160, 36850,317, 317, 317, 36851,36852,428, 7734, 21274,2275, 6593, 5226, 36856,36857,36858, - 370, 36865,36868,36869,36870,2584, 32079,36872,36878,36880,36886,466, 11236,36889,7942, 24393,317, 36859,36861,5626, 382, 36864,317, 2351, 36860,621, 511, - 5626, 36862,362, 36863,317, 36866,36867,343, 6961, 332, 351, 10519,317, 2381, 1358, 36871,36873,36874,36877,343, 317, 1160, 317, 36875,36876,381, 637, - 317, 8361, 317, 36879,2369, 566, 27913,36881,32608,25453,36882,36883,36885,6736, 4268, 545, 553, 36884,363, 6081, 36887,36888,4984, 741, 351, 16164,8587, + 370, 36865,36868,36869,36870,2584, 32079,36872,36878,36880,36886,466, 11236,36889,7942, 24393,317, 36859,36861,5626, 382, 36864,317, 2351, 36860,621, 511, + 5626, 36862,362, 36863,317, 36866,36867,343, 6961, 332, 351, 10519,317, 2381, 1358, 36871,36873,36874,36877,343, 317, 1160, 317, 36875,36876,381, 637, + 317, 8361, 317, 36879,2369, 566, 27913,36881,32608,25453,36882,36883,36885,6736, 4268, 545, 553, 36884,363, 6081, 36887,36888,4984, 741, 351, 16164,8587, 2503, 18305,7911, 36890,450, 31084,36892,36893,317, 428, 363, 36895,36896,36899,36900,36903,565, 36904,8392, 19266,36905,317, 36907,36908,36909,36910,36911, - 2271, 36915,317, 343, 32064,365, 36897,6234, 363, 36898,317, 35895,8178, 36901,380, 511, 36902,363, 5727, 345, 317, 365, 317, 363, 1108, 4984, 4984, + 2271, 36915,317, 343, 32064,365, 36897,6234, 363, 36898,317, 35895,8178, 36901,380, 511, 36902,363, 5727, 345, 317, 365, 317, 363, 1108, 4984, 4984, 6409, 363, 36906,2022, 3076, 317, 356, 867, 7273, 2381, 317, 19682,365, 379, 343, 36912,1992, 317, 36913,36914,428, 5309, 949, 317, 36917,36918,36919, 6021, 350, 36921,36923,36924,7850, 317, 317, 11362,551, 11404,36920,343, 490, 317, 317, 501, 382, 36922,381, 10476,350, 362, 605, 36925,351, 36927, 14415,2402, 317, 345, 317, 9884, 404, 36926,7214, 1160, 404, 345, 1358, 4980, 4591, 2394, 36929,36935,36937,36940,28720,36945,2571, 5662, 15326,36946,36948, 36951,36958,36930,36932,36933,36931,28588,404, 3236, 33156,36934,36719,36936,448, 8546, 15457,479, 36938,36939,36941,7196, 36721,36812,36942,5392, 36943,36944, - 363, 6593, 8296, 36947,7196, 349, 36949,543, 317, 36950,317, 36952,36955,5662, 36956,432, 317, 9567, 36953,7368, 362, 6555, 36954,317, 36807,382, 6555, + 363, 6593, 8296, 36947,7196, 349, 36949,543, 317, 36950,317, 36952,36955,5662, 36956,432, 317, 9567, 36953,7368, 362, 6555, 36954,317, 36807,382, 6555, 36957,350, 11608,15457,36960,12421,949, 36962,36963,36964,380, 404, 36965,36966,36967,404, 574, 8586, 317, 317, 11962,345, 317, 1060, 15678,7063, 36969, 36970,36971,36972,36974,317, 36975,371, 7261, 339, 317, 36973,363, 6940, 7567, 357, 511, 317, 17946,36977,36978,36980,36987,36988,36993,36998,37000,37001, - 565, 365, 36981,36983,36985,36986,2146, 36982,2037, 2022, 36984,36989,36990,15571,317, 317, 36991,36992,363, 7916, 363, 36994,36996,36997,5309, 36995,2948, - 317, 427, 36999,37002,37004,37003,37005,1358, 356, 317, 390, 37007,37008,37009,37010,37011,37013,37018,37020,37024,37025,37033,37042,37051,37053,37055,1020, + 565, 365, 36981,36983,36985,36986,2146, 36982,2037, 2022, 36984,36989,36990,15571,317, 317, 36991,36992,363, 7916, 363, 36994,36996,36997,5309, 36995,2948, + 317, 427, 36999,37002,37004,37003,37005,1358, 356, 317, 390, 37007,37008,37009,37010,37011,37013,37018,37020,37024,37025,37033,37042,37051,37053,37055,1020, 37060,37014,37015,37016,37017,365, 37019,317, 5325, 332, 6831, 37021,37022,37023,590, 365, 590, 2357, 316, 9450, 345, 37026,37030,37027,37028,37029,37031, 37032,4952, 26850,6340, 27985,37034,2058, 317, 37035,37039,9623, 37036,37037,37038,317, 5732, 317, 37040,37041,37043,37044,317, 317, 37045,37046,37047,37048, 37049,37050,317, 9549, 381, 37052,332, 1526, 37054,596, 427, 27776,317, 37056,345, 37057,37058,37059,490, 2178, 8099, 37062,427, 18803,37063,37064,37065, 37066,37067,37069,37075,37078,37084,37089,37091,37092,37099,122, 38028,38029,38031,125, 38804,34745,38826,128, 39203,39223,39228,39236,39240,129, 39948,39961, 39995,40006,131, 40286,40293,40297,132, 40485,427, 2533, 2738, 4797, 37068,4576, 2242, 37070,37071,37072,37073,37074,3738, 37076,637, 37077,37079,37082,37083, 37080,37081,317, 18978,3284, 37085,37086,37087,37088,37090,37093,37094,37095,37096,37097,37098,37100,37101,37102,37103,37104,37114,37148,37171,37192,37213,37224, - 37257,37264,37294,37299,37308,37400,123, 37583,37611,124, 37819,37866,37903,37945,37967,37985,37986,38015,1987, 1345, 21123,317, 37105,317, 37107,4952, 317, - 6388, 37111,37112,37113,317, 317, 37106,37108,12726,363, 37109,317, 37110,27177,5126, 9938, 4976, 363, 390, 317, 317, 317, 37115,37117,37119,37132,5793, + 37257,37264,37294,37299,37308,37400,123, 37583,37611,124, 37819,37866,37903,37945,37967,37985,37986,38015,1987, 1345, 21123,317, 37105,317, 37107,4952, 317, + 6388, 37111,37112,37113,317, 317, 37106,37108,12726,363, 37109,317, 37110,27177,5126, 9938, 4976, 363, 390, 317, 317, 317, 37115,37117,37119,37132,5793, 37140,37141,37142,317, 37144,37116,365, 390, 37118,363, 1243, 317, 17038,345, 371, 367, 2219, 317, 37120,37121,37122,37126,37127,343, 37128,37130,37123, 37124,37125,10580,479, 37129,7852, 554, 37131,37133,471, 317, 317, 37134,490, 2108, 37136,1358, 10939,37135,317, 13696,37137,317, 37139,5457, 37138,30634, 317, 389, 5836, 37143,37145,37146,37147,24893,37149,37153,37156,37170,14561,37150,37151,511, 317, 574, 317, 317, 5624, 362, 37152,4186, 37154,37155,37157, - 37158,37159,2024, 466, 37165,37167,15745,37169,22415,317, 501, 16623,13336,7590, 479, 37160,317, 37161,37163,37164,317, 37162,15457,1194, 317, 317, 2117, - 317, 317, 433, 27419,37166,5663, 37168,605, 12154,37172,2584, 37174,37179,9624, 596, 37180,37183,5120, 37186,37188,37189,37190,37191,1601, 1020, 317, 317, - 2298, 13979,317, 37173,1230, 37175,37176,37177,37178,317, 317, 317, 1230, 7070, 317, 371, 5538, 317, 371, 11473,317, 317, 317, 317, 317, 1109, 1329, - 37181,37182,37184,317, 37185,439, 37187,23306,317, 4943, 317, 317, 381, 14535,501, 1060, 362, 5055, 428, 428, 363, 350, 37193,350, 37195,37196,363, + 37158,37159,2024, 466, 37165,37167,15745,37169,22415,317, 501, 16623,13336,7590, 479, 37160,317, 37161,37163,37164,317, 37162,15457,1194, 317, 317, 2117, + 317, 317, 433, 27419,37166,5663, 37168,605, 12154,37172,2584, 37174,37179,9624, 596, 37180,37183,5120, 37186,37188,37189,37190,37191,1601, 1020, 317, 317, + 2298, 13979,317, 37173,1230, 37175,37176,37177,37178,317, 317, 317, 1230, 7070, 317, 371, 5538, 317, 371, 11473,317, 317, 317, 317, 317, 1109, 1329, + 37181,37182,37184,317, 37185,439, 37187,23306,317, 4943, 317, 317, 381, 14535,501, 1060, 362, 5055, 428, 428, 363, 350, 37193,350, 37195,37196,363, 37198,2222, 37208,37209,37211,37194,37197,37199,37200,37202,37206,37201,37203,37204,37205,37207,466, 317, 12732,317, 37210,382, 23995,37212,351, 2298, 37214, - 37218,1108, 14173,37221,37222,1108, 343, 37215,37216,37217,317, 363, 12288,2761, 9012, 37219,511, 350, 551, 37220,317, 37223,351, 37225,5896, 37229,388, - 37234,37241,37243,37250,37251,350, 37253,5087, 37254,37255,10467,317, 37226,5761, 362, 37228,1329, 37227,15459,8948, 317, 37230,11195,37231,37233,317, 317, + 37218,1108, 14173,37221,37222,1108, 343, 37215,37216,37217,317, 363, 12288,2761, 9012, 37219,511, 350, 551, 37220,317, 37223,351, 37225,5896, 37229,388, + 37234,37241,37243,37250,37251,350, 37253,5087, 37254,37255,10467,317, 37226,5761, 362, 37228,1329, 37227,15459,8948, 317, 37230,11195,37231,37233,317, 317, 317, 6704, 363, 37232,317, 16187,4980, 317, 6674, 9696, 2108, 362, 27420,1345, 37235,5896, 37237,37239,37240,18839,2533, 1347, 37236,317, 37238,381, 16092, - 18661,317, 466, 439, 37242,317, 317, 1347, 37244,381, 1459, 37245,37246,37247,37248,37249,12142,439, 37252,317, 356, 5624, 317, 37256,37258,317, 317, - 37262,317, 14361,37259,37260,317, 37261,37263,37265,37266,37267,37268,37269,6242, 37274,36635,37280,37289,37291,362, 4965, 351, 5223, 350, 6089, 37270,466, + 18661,317, 466, 439, 37242,317, 317, 1347, 37244,381, 1459, 37245,37246,37247,37248,37249,12142,439, 37252,317, 356, 5624, 317, 37256,37258,317, 317, + 37262,317, 14361,37259,37260,317, 37261,37263,37265,37266,37267,37268,37269,6242, 37274,36635,37280,37289,37291,362, 4965, 351, 5223, 350, 6089, 37270,466, 37272,6089, 317, 2163, 317, 37271,554, 37273,37275,345, 37277,37278,37279,317, 37276,317, 20869,317, 370, 5809, 37281,9479, 37282,37285,9624, 7072, 24209, - 539, 37286,317, 37287,1160, 428, 2732, 317, 37283,37284,7737, 37288,351, 363, 24305,2155, 317, 37290,437, 14174,1060, 37292,37293,317, 351, 37295,371, - 37297,37298,36540,345, 37296,343, 1444, 1791, 353, 37300,37301,37302,37304,37306,37307,317, 6847, 490, 317, 9884, 2272, 490, 317, 427, 317, 317, 317, + 539, 37286,317, 37287,1160, 428, 2732, 317, 37283,37284,7737, 37288,351, 363, 24305,2155, 317, 37290,437, 14174,1060, 37292,37293,317, 351, 37295,371, + 37297,37298,36540,345, 37296,343, 1444, 1791, 353, 37300,37301,37302,37304,37306,37307,317, 6847, 490, 317, 9884, 2272, 490, 317, 427, 317, 317, 317, 317, 317, 37303,15371,37305,351, 4006, 390, 2413, 1358, 37309,619, 37311,37314,37322,37324,37327,37332,37340,37342,37349,37350,37375,404, 37379,37384,37388, 37392,27851,37395,37398,37399,37310,345, 370, 37312,3284, 5624, 37312,37313,490, 1100, 317, 2108, 37315,37320,37321,37316,317, 317, 37317,317, 8741, 37318, - 37319,11245,7449, 37323,404, 2044, 317, 381, 2272, 37325,37326,380, 362, 317, 7949, 317, 20638,37328,37329,317, 317, 317, 317, 37330,5838, 1160, 6388, + 37319,11245,7449, 37323,404, 2044, 317, 381, 2272, 37325,37326,380, 362, 317, 7949, 317, 20638,37328,37329,317, 317, 317, 317, 37330,5838, 1160, 6388, 10471,37331,37333,1194, 362, 19187,8023, 37334,37337,551, 37338,971, 4789, 1230, 37335,37336,382, 2366, 404, 5158, 37339,345, 37341,363, 36957,37343,37345, 2156, 3710, 317, 317, 1109, 490, 5828, 8170, 37344,37346,317, 37347,37348,37351,13823,37352,37353,2024, 3023, 37356,37359,37360,6601, 37365,37367,7405, 27235, - 371, 13856,362, 5153, 1325, 317, 350, 1230, 371, 4984, 37354,6596, 37355,7949, 317, 5223, 317, 37357,371, 1230, 317, 362, 362, 362, 37358,317, 2022, + 371, 13856,362, 5153, 1325, 317, 350, 1230, 371, 4984, 37354,6596, 37355,7949, 317, 5223, 317, 37357,371, 1230, 317, 362, 362, 362, 37358,317, 2022, 28594,24041,363, 1266, 371, 590, 317, 6600, 37361,370, 8301, 37362,37363,317, 317, 4984, 380, 37364,37366,2117, 355, 426, 37368,1347, 37369,37370,37371, - 37373,37372,317, 5113, 448, 37374,37376,345, 384, 37377,7514, 317, 37378,6355, 355, 949, 37380,437, 37383,317, 18882,6563, 37381,37382,37385,37386,501, - 363, 1020, 37387,428, 37389,343, 37390,380, 490, 390, 317, 37391,363, 426, 37393,37394,5332, 317, 382, 4737, 37396,466, 37397,317, 2551, 317, 551, + 37373,37372,317, 5113, 448, 37374,37376,345, 384, 37377,7514, 317, 37378,6355, 355, 949, 37380,437, 37383,317, 18882,6563, 37381,37382,37385,37386,501, + 363, 1020, 37387,428, 37389,343, 37390,380, 490, 390, 317, 37391,363, 426, 37393,37394,5332, 317, 382, 4737, 37396,466, 37397,317, 2551, 317, 551, 384, 2063, 37401,37408,37421,37424,396, 37432,37433,37436,37439,15513,37457,37459,37463,37465,37470,37472,1230, 37475,419, 10046,37402,317, 350, 37403,37405, - 37406,1109, 37407,37404,12756,317, 11485,2322, 37409,37411,37413,37415,37416,37418,317, 37410,2067, 37412,2222, 1020, 370, 37414,363, 317, 404, 317, 4980, + 37406,1109, 37407,37404,12756,317, 11485,2322, 37409,37411,37413,37415,37416,37418,317, 37410,2067, 37412,2222, 1020, 370, 37414,363, 317, 404, 317, 4980, 317, 6713, 5295, 6594, 37417,317, 7785, 471, 37419,37420,37422,363, 317, 317, 37423,356, 6600, 37425,9609, 37428,37430,317, 381, 317, 37426,37427,37429, - 317, 404, 883, 37431,317, 5120, 380, 37434,11408,20592,6412, 565, 317, 37435,363, 17730,37437,28276,363, 317, 37438,317, 37440,37446,37453,37454,8178, + 317, 404, 883, 37431,317, 5120, 380, 37434,11408,20592,6412, 565, 317, 37435,363, 17730,37437,28276,363, 317, 37438,317, 37440,37446,37453,37454,8178, 29082,37441,5120, 350, 317, 37442,37443,381, 370, 3023, 4962, 37444,37445,317, 5105, 317, 37447,317, 11962,681, 5942, 320, 633, 633, 10283,1479, 37448, - 466, 37450,362, 37451,4789, 37449,317, 25352,2022, 2553, 37452,356, 1020, 2272, 426, 317, 380, 382, 381, 5962, 37455,1347, 317, 37456,883, 37458,317, - 345, 317, 15334,11366,501, 37460,317, 343, 363, 37461,5054, 2609, 363, 37462,37464,317, 14289,37466,350, 371, 363, 37469,363, 37467,37468,15646,6991, + 466, 37450,362, 37451,4789, 37449,317, 25352,2022, 2553, 37452,356, 1020, 2272, 426, 317, 380, 382, 381, 5962, 37455,1347, 317, 37456,883, 37458,317, + 345, 317, 15334,11366,501, 37460,317, 343, 363, 37461,5054, 2609, 363, 37462,37464,317, 14289,37466,350, 371, 363, 37469,363, 37467,37468,15646,6991, 867, 37471,37473,37474,4925, 371, 37476,37480,37482,37483,37525,37529,37530,37535,37537,490, 37540,37544,22742,37545,37554,37557,37559,37570,37577,37578,37579, 37580,37581,971, 37477,37478,362, 332, 28836,317, 2222, 362, 36238,37479,37481,32950,448, 317, 1345, 15873,363, 5851, 619, 13881,37484,37486,37491,12113, 37493,6709, 37494,32606,37498,37504,7942, 37506,37507,37508,37509,317, 5037, 37518,37523,37524,37485,7449, 12616,2108, 1347, 9075, 2126, 384, 37487,37489,37488, - 37490,6441, 37492,5995, 439, 362, 450, 37495,370, 1992, 12423,37496,17793,37497,37499,3079, 37500,37501,37502,37503,37505,3999, 426, 317, 13914,317, 317, + 37490,6441, 37492,5995, 439, 362, 450, 37495,370, 1992, 12423,37496,17793,37497,37499,3079, 37500,37501,37502,37503,37505,3999, 426, 317, 13914,317, 317, 1347, 317, 317, 396, 317, 4268, 350, 1524, 11617,8882, 363, 384, 1453, 37510,4268, 37513,37515,4952, 5809, 37511,37512,37514,343, 396, 37516,37517,37519, - 37520,37521,37522,466, 501, 380, 883, 27732,490, 362, 37526,8431, 9938, 37527,317, 317, 317, 10580,317, 5897, 37528,621, 37531,10422,9648, 362, 5005, - 37533,317, 37534,380, 19307,317, 37532,4268, 2509, 37536,317, 3007, 37538,8175, 362, 317, 10027,37539,19507,332, 317, 37541,37543,490, 5943, 16579,5943, - 317, 317, 37542,317, 317, 5995, 404, 363, 1345, 6318, 363, 317, 37546,37549,37550,37552,317, 37553,317, 37547,362, 37548,6600, 317, 2108, 36238,317, + 37520,37521,37522,466, 501, 380, 883, 27732,490, 362, 37526,8431, 9938, 37527,317, 317, 317, 10580,317, 5897, 37528,621, 37531,10422,9648, 362, 5005, + 37533,317, 37534,380, 19307,317, 37532,4268, 2509, 37536,317, 3007, 37538,8175, 362, 317, 10027,37539,19507,332, 317, 37541,37543,490, 5943, 16579,5943, + 317, 317, 37542,317, 317, 5995, 404, 363, 1345, 6318, 363, 317, 37546,37549,37550,37552,317, 37553,317, 37547,362, 37548,6600, 317, 2108, 36238,317, 637, 5942, 320, 317, 362, 501, 11647,13122,317, 1347, 317, 317, 433, 362, 6600, 37551,370, 356, 317, 350, 317, 371, 37555,317, 356, 33988,37556, - 37558,3869, 317, 362, 390, 10894,37560,37563,37564,2024, 37565,37566,2022, 5662, 37567,12815,6046, 37569,13023,37561,6673, 448, 37562,2094, 22395,317, 1325, - 317, 605, 605, 363, 37568,1358, 317, 19617,2272, 317, 12696,37571,362, 363, 317, 37574,37576,37572,479, 37573,37575,490, 19292,362, 8392, 370, 5038, + 37558,3869, 317, 362, 390, 10894,37560,37563,37564,2024, 37565,37566,2022, 5662, 37567,12815,6046, 37569,13023,37561,6673, 448, 37562,2094, 22395,317, 1325, + 317, 605, 605, 363, 37568,1358, 317, 19617,2272, 317, 12696,37571,362, 363, 317, 37574,37576,37572,479, 37573,37575,490, 19292,362, 8392, 370, 5038, 370, 428, 5810, 37582,5623, 12668,382, 37584,6089, 37585,37589,37590,2134, 37599,317, 37607,317, 37586,37587,37588,476, 37591,37592,37596,356, 34428,37593, - 37594,37595,37597,37598,37600,37602,2022, 37603,317, 37601,317, 317, 356, 9648, 370, 317, 28196,370, 36225,37604,37605,317, 1353, 317, 317, 633, 8301, + 37594,37595,37597,37598,37600,37602,2022, 37603,317, 37601,317, 317, 356, 9648, 370, 317, 28196,370, 36225,37604,37605,317, 1353, 317, 317, 633, 8301, 2631, 37606,516, 901, 6532, 8301, 2277, 14501,2571, 2272, 317, 2948, 317, 621, 317, 1267, 317, 1531, 382, 339, 37608,37609,37610,15451,343, 37612,37620, 37631,37637,37673,37677,37678,37684,37694,37696,37705,37715,37724,37730,37736,37751,37770,37777,37806,37808,37817,9702, 317, 33965,7490, 37402,37613,6866, 37614, - 37616,1992, 37617,37618,37619,1230, 5838, 4060, 37615,404, 317, 5996, 37621,37622,37623,37624,37626,37630,317, 390, 350, 4943, 371, 317, 5223, 404, 371, + 37616,1992, 37617,37618,37619,1230, 5838, 4060, 37615,404, 317, 5996, 37621,37622,37623,37624,37626,37630,317, 390, 350, 4943, 371, 317, 5223, 404, 371, 37625,404, 5255, 37627,372, 37628,317, 356, 466, 343, 6674, 317, 390, 390, 37629,356, 12416,466, 317, 5962, 382, 317, 351, 37632,37633,37635,37636, 2402, 1700, 37634,343, 1999, 317, 590, 633, 37638,37639,37641,37644,37645,37650,37652,37653,2171, 37657,11236,37660,6690, 1194, 37662,37664,37665,37667,37668, 11769,1588, 343, 350, 362, 10086,345, 1230, 26037,37640,370, 13307,1588, 11960,37642,371, 37643,1999, 350, 384, 2124, 10487,317, 15334,5105, 11236,37646, - 12019,37648,317, 37647,356, 466, 317, 4949, 9695, 4949, 37649,1347, 37651,370, 434, 434, 381, 16804,317, 37654,11236,37655,37656,317, 4944, 10185,404, - 363, 23995,37658,317, 37659,37661,345, 10820,317, 37663,384, 15566,990, 9140, 384, 3361, 351, 2060, 37666,37669,37671,37672,37670,317, 21123,1526, 6355, - 11257,37674,365, 9624, 37676,1347, 1347, 317, 317, 6089, 37675,37679,5381, 7511, 37681,345, 1943, 37680,1347, 5223, 381, 5088, 317, 9383, 37682,37683,363, - 14323,37685,317, 37686,37687,37688,427, 1444, 365, 37690,390, 345, 565, 37689,37691,363, 404, 37692,37693,37695,317, 3742, 426, 37697,5055, 37699,2571, - 37703,37704,490, 37698,317, 317, 37700,37701,345, 317, 37702,566, 566, 7389, 37706,37711,37714,2067, 390, 317, 6600, 37707,6718, 37709,37708,37710,8258, - 1018, 317, 633, 649, 633, 317, 490, 317, 317, 37712,37713,371, 396, 317, 317, 1358, 26791,37716,379, 36877,6668, 37717,37722,317, 2184, 317, 404, - 350, 37718,317, 37719,1160, 317, 37720,1347, 7834, 18587,427, 317, 10674,37721,317, 363, 37723,370, 5810, 37725,501, 37726,37728,370, 25434,317, 317, + 12019,37648,317, 37647,356, 466, 317, 4949, 9695, 4949, 37649,1347, 37651,370, 434, 434, 381, 16804,317, 37654,11236,37655,37656,317, 4944, 10185,404, + 363, 23995,37658,317, 37659,37661,345, 10820,317, 37663,384, 15566,990, 9140, 384, 3361, 351, 2060, 37666,37669,37671,37672,37670,317, 21123,1526, 6355, + 11257,37674,365, 9624, 37676,1347, 1347, 317, 317, 6089, 37675,37679,5381, 7511, 37681,345, 1943, 37680,1347, 5223, 381, 5088, 317, 9383, 37682,37683,363, + 14323,37685,317, 37686,37687,37688,427, 1444, 365, 37690,390, 345, 565, 37689,37691,363, 404, 37692,37693,37695,317, 3742, 426, 37697,5055, 37699,2571, + 37703,37704,490, 37698,317, 317, 37700,37701,345, 317, 37702,566, 566, 7389, 37706,37711,37714,2067, 390, 317, 6600, 37707,6718, 37709,37708,37710,8258, + 1018, 317, 633, 649, 633, 317, 490, 317, 317, 37712,37713,371, 396, 317, 317, 1358, 26791,37716,379, 36877,6668, 37717,37722,317, 2184, 317, 404, + 350, 37718,317, 37719,1160, 317, 37720,1347, 7834, 18587,427, 317, 10674,37721,317, 363, 37723,370, 5810, 37725,501, 37726,37728,370, 25434,317, 317, 317, 37727,381, 317, 37729,37731,37733,317, 37735,37732,317, 37734,396, 317, 37734,37737,37738,554, 37743,37744,37745,15313,317, 317, 3243, 37739,37740, - 317, 37741,37742,345, 22412,381, 10172,23419,37746,2222, 37747,37748,37749,37750,37752,37755,37757,37765,37766,37753,317, 29034,317, 37754,363, 2272, 363, + 317, 37741,37742,345, 22412,381, 10172,23419,37746,2222, 37747,37748,37749,37750,37752,37755,37757,37765,37766,37753,317, 29034,317, 37754,363, 2272, 363, 37756,317, 317, 317, 381, 317, 7214, 404, 990, 362, 37758,37759,380, 362, 37760,14535,37762,381, 317, 1347, 317, 11962,363, 351, 428, 404, 37761, 370, 4980, 317, 7911, 37763,317, 4980, 5037, 37764,317, 1347, 2413, 356, 317, 317, 363, 22983,6228, 317, 317, 317, 2077, 37767,362, 37768,317, 12525, 332, 37769,390, 370, 37771,37774,37776,317, 37772,37773,24398,9624, 370, 362, 2571, 5898, 5898, 37775,990, 37778,37780,37781,37783,37784,10907,37786,37787, - 37792,37794,37796,5367, 6601, 37797,37799,317, 37667,37801,37803,317, 37805,590, 37779,317, 15308,18215,4959, 37782,9383, 434, 2584, 10012,363, 6600, 380, - 37785,317, 317, 14835,37788,37789,30116,317, 501, 363, 317, 37790,345, 317, 37791,37793,381, 37795,380, 345, 381, 317, 317, 1992, 370, 37798,343, - 384, 427, 317, 390, 20909,9624, 14340,37800,2310, 5037, 371, 317, 317, 371, 4943, 37802,428, 37804,371, 8266, 11654,6598, 6599, 350, 1992, 365, 7954, + 37792,37794,37796,5367, 6601, 37797,37799,317, 37667,37801,37803,317, 37805,590, 37779,317, 15308,18215,4959, 37782,9383, 434, 2584, 10012,363, 6600, 380, + 37785,317, 317, 14835,37788,37789,30116,317, 501, 363, 317, 37790,345, 317, 37791,37793,381, 37795,380, 345, 381, 317, 317, 1992, 370, 37798,343, + 384, 427, 317, 390, 20909,9624, 14340,37800,2310, 5037, 371, 317, 317, 371, 4943, 37802,428, 37804,371, 8266, 11654,6598, 6599, 350, 1992, 365, 7954, 5120, 1109, 37807,317, 317, 18906,37809,37810,37814,2022, 356, 4925, 5105, 317, 37811,37813,37812,317, 10422,466, 501, 317, 371, 317, 37815,317, 11539, 37816,4773, 5891, 551, 428, 37818,2063, 10592,317, 37820,37822,37826,37827,37829,32303,8023, 37836,37842,37845,37849,37853,37854,12732,37855,37863,3987, 14615, - 37821,6814, 317, 37823,365, 37824,363, 380, 448, 37825,428, 15749,1060, 37828,6900, 317, 37830,362, 37833,317, 501, 37831,3529, 37832,11918,462, 7408, + 37821,6814, 317, 37823,365, 37824,363, 380, 448, 37825,428, 15749,1060, 37828,6900, 317, 37830,362, 37833,317, 501, 37831,3529, 37832,11918,462, 7408, 37834,11709,37835,7174, 476, 37837,27367,37838,37840,365, 2152, 37841,2533, 404, 1230, 317, 37839,317, 317, 37616,382, 390, 382, 2521, 37843,490, 37844, - 10580,37846,5055, 37847,5105, 317, 381, 317, 37848,427, 37850,37852,1160, 37851,317, 381, 317, 371, 29772,37856,37858,37862,21186,4984, 3006, 37857,380, + 10580,37846,5055, 37847,5105, 317, 381, 317, 37848,427, 37850,37852,1160, 37851,317, 381, 317, 371, 29772,37856,37858,37862,21186,4984, 3006, 37857,380, 317, 13426,356, 37859,37861,381, 317, 37860,16187,4591, 317, 362, 317, 7192, 5810, 384, 355, 28996,350, 14910,363, 371, 317, 317, 11678,317, 37864, - 37865,363, 351, 317, 381, 5363, 381, 317, 370, 9649, 37867,37868,37872,9624, 37876,37881,343, 37882,27528,37883,37885,37887,37891,363, 37898,490, 343, + 37865,363, 351, 317, 381, 5363, 381, 317, 370, 9649, 37867,37868,37872,9624, 37876,37881,343, 37882,27528,37883,37885,37887,37891,363, 37898,490, 343, 490, 29531,1230, 317, 37869,5960, 2584, 37870,20497,27846,317, 5105, 37871,317, 11962,596, 404, 317, 37873,317, 379, 7073, 1358, 1347, 37875,589, 37874, - 16143,37877,37879,37880,1230, 37878,381, 371, 317, 418, 1230, 2142, 317, 382, 37884,8926, 356, 37886,37888,2631, 343, 37889,37890,37892,37893,37895,2022, + 16143,37877,37879,37880,1230, 37878,381, 371, 317, 418, 1230, 2142, 317, 382, 37884,8926, 356, 37886,37888,2631, 343, 37889,37890,37892,37893,37895,2022, 362, 37897,2391, 367, 7698, 317, 1230, 16889,37894,350, 345, 9425, 37896,5022, 37899,380, 37900,37901,14084,37902,14084,2298, 363, 37904,10592,37905,37911, - 37913,37914,37919,37920,37921,37922,37923,37934,37936,37943,4279, 343, 16553,350, 578, 24637,37906,37907,37908,37909,37910,10546,37912,37915,37916,37917,4952, + 37913,37914,37919,37920,37921,37922,37923,37934,37936,37943,4279, 343, 16553,350, 578, 24637,37906,37907,37908,37909,37910,10546,37912,37915,37916,37917,4952, 2521, 551, 12523,317, 317, 4962, 370, 8392, 37918,990, 12523,34987,3999, 317, 317, 350, 363, 7650, 1999, 37924,37925,370, 5662, 37929,37926,37927,37928, 30890,37930,37931,37932,37933,37935,363, 317, 37937,37938,6631, 7866, 37940,3078, 37941,5662, 350, 9289, 15047,37942,10538,37939,10022,351, 3243, 22599,19617, - 536, 37944,8228, 317, 317, 490, 10898,317, 37946,37948,37961,37963,14832,12028,343, 490, 5526, 37947,356, 5943, 7035, 37949,9590, 37950,18460,37951,317, - 37952,7678, 317, 317, 490, 384, 317, 381, 351, 8023, 317, 20920,37953,8023, 7871, 11709,22591,37957,37959,370, 6598, 37954,37955,37956,37958,37960,384, + 536, 37944,8228, 317, 317, 490, 10898,317, 37946,37948,37961,37963,14832,12028,343, 490, 5526, 37947,356, 5943, 7035, 37949,9590, 37950,18460,37951,317, + 37952,7678, 317, 317, 490, 384, 317, 381, 351, 8023, 317, 20920,37953,8023, 7871, 11709,22591,37957,37959,370, 6598, 37954,37955,37956,37958,37960,384, 384, 12154,343, 351, 37962,1992, 317, 317, 439, 4952, 37964,37965,317, 317, 371, 37966,37968,16092,37971,317, 384, 37972,2022, 362, 317, 5810, 37981, 1358, 37982,350, 37969,436, 365, 365, 37970,317, 621, 5055, 901, 320, 37973,37975,4249, 37976,4952, 37978,37979,37980,37974,317, 1347, 25782,16602,37977, 10641,1347, 4980, 317, 8023, 12154,2022, 12025,5809, 439, 2063, 37983,2022, 37984,7035, 2247, 370, 404, 37987,37991,37993,37994,37997,12556,6089, 37998,37999, - 38002,38005,1108, 38007,38009,38011,38012,2948, 38014,37988,6900, 365, 317, 37989,21067,317, 37990,362, 37992,479, 14836,6894, 12731,37995,317, 15738,317, - 37996,317, 6551, 27177,317, 343, 11918,38000,466, 38001,38003,9450, 24429,350, 38004,2126, 427, 38006,343, 10956,38008,2261, 1998, 5487, 38010,5960, 2117, - 1060, 351, 9876, 363, 6354, 1588, 38013,356, 408, 38016,38019,365, 38023,38024,9262, 17583,2631, 317, 38027,317, 38017,1347, 18712,317, 38018,18500,490, - 11709,38020,317, 317, 317, 317, 38021,2117, 7072, 13023,1060, 317, 9479, 38022,37832,6089, 1453, 389, 38025,38026,7072, 13023,5224, 6089, 317, 428, 590, + 38002,38005,1108, 38007,38009,38011,38012,2948, 38014,37988,6900, 365, 317, 37989,21067,317, 37990,362, 37992,479, 14836,6894, 12731,37995,317, 15738,317, + 37996,317, 6551, 27177,317, 343, 11918,38000,466, 38001,38003,9450, 24429,350, 38004,2126, 427, 38006,343, 10956,38008,2261, 1998, 5487, 38010,5960, 2117, + 1060, 351, 9876, 363, 6354, 1588, 38013,356, 408, 38016,38019,365, 38023,38024,9262, 17583,2631, 317, 38027,317, 38017,1347, 18712,317, 38018,18500,490, + 11709,38020,317, 317, 317, 317, 38021,2117, 7072, 13023,1060, 317, 9479, 38022,37832,6089, 1453, 389, 38025,38026,7072, 13023,5224, 6089, 317, 428, 590, 14974,1347, 31322,351, 38030,38032,8491, 339, 365, 539, 1044, 38033,38034,38035,38036,38037,38038,38039,38040,38041,38042,38043,38044,38045,38046,38131,38147, 38159,38187,38195,38204,38214,38221,38293,38299,126, 38405,38451,363, 38519,38535,127, 38683,38716,38747,38762,38768,38773,38784,38802,1087, 38047,38049,38050, 38088,38089,317, 38090,38092,317, 38096,38097,38098,38112,38114,38123,38048,317, 38051,38052,38055,38056,16399,38057,12429,38058,38061,38064,38070,38075,38076, - 38079,38080,38086,38087,317, 38053,550, 2117, 38054,393, 23950,38059,38060,38062,38063,2022, 317, 404, 38065,38067,38068,38069,317, 38066,6355, 22561,8139, - 371, 1992, 38071,363, 38072,317, 5450, 38073,38074,7438, 18941,38077,38078,14371,384, 426, 38081,4268, 38082,38083,38084,1060, 381, 1999, 38085,5623, 371, - 2156, 17265,565, 2590, 343, 2022, 317, 38091,363, 317, 22775,10877,370, 317, 38093,317, 38094,14062,379, 38095,317, 24398,24267,1325, 370, 466, 317, - 317, 15138,9648, 317, 38099,363, 404, 38100,38101,4984, 31475,370, 317, 363, 4980, 317, 38051,38102,6028, 14444,1347, 418, 38105,38106,38108,38110,317, - 317, 24393,38103,479, 38104,2102, 11229,15474,317, 26037,38107,38109,38111,2063, 38113,404, 22578,1060, 4472, 10422,38115,466, 5661, 363, 38120,38122,317, + 38079,38080,38086,38087,317, 38053,550, 2117, 38054,393, 23950,38059,38060,38062,38063,2022, 317, 404, 38065,38067,38068,38069,317, 38066,6355, 22561,8139, + 371, 1992, 38071,363, 38072,317, 5450, 38073,38074,7438, 18941,38077,38078,14371,384, 426, 38081,4268, 38082,38083,38084,1060, 381, 1999, 38085,5623, 371, + 2156, 17265,565, 2590, 343, 2022, 317, 38091,363, 317, 22775,10877,370, 317, 38093,317, 38094,14062,379, 38095,317, 24398,24267,1325, 370, 466, 317, + 317, 15138,9648, 317, 38099,363, 404, 38100,38101,4984, 31475,370, 317, 363, 4980, 317, 38051,38102,6028, 14444,1347, 418, 38105,38106,38108,38110,317, + 317, 24393,38103,479, 38104,2102, 11229,15474,317, 26037,38107,38109,38111,2063, 38113,404, 22578,1060, 4472, 10422,38115,466, 5661, 363, 38120,38122,317, 38116,38118,9624, 4952, 362, 2402, 317, 13917,38117,1347, 38119,317, 317, 317, 317, 317, 317, 5537, 370, 28208,404, 38121,9624, 434, 373, 38124,38126, - 350, 1020, 38129,317, 38125,317, 351, 370, 317, 22783,38127,38128,2260, 439, 363, 317, 317, 317, 38130,539, 22558,551, 38132,38136,38137,382, 350, - 38143,2108, 466, 38133,479, 38134,38135,317, 363, 4984, 8266, 317, 38138,38141,345, 38139,38140,351, 38142,317, 9064, 466, 317, 38144,6697, 38145,363, + 350, 1020, 38129,317, 38125,317, 351, 370, 317, 22783,38127,38128,2260, 439, 363, 317, 317, 317, 38130,539, 22558,551, 38132,38136,38137,382, 350, + 38143,2108, 466, 38133,479, 38134,38135,317, 363, 4984, 8266, 317, 38138,38141,345, 38139,38140,351, 38142,317, 9064, 466, 317, 38144,6697, 38145,363, 38146,574, 20462,38148,38149,490, 3710, 2474, 316, 38158,2073, 30089,350, 317, 38150,1998, 38152,38155,21186,5662, 38157,362, 5255, 38151,317, 38153,38154, 5896, 7618, 551, 38156,317, 6222, 419, 543, 12277,339, 15156,5896, 38160,38164,38166,38172,38175,38177,38178,38179,38181,6601, 38184,38186,553, 10081,10081, 317, 317, 363, 16318,38161,317, 38162,38163,363, 38165,2829, 9938, 550, 1588, 38167,466, 1020, 14263,14263,2584, 38168,38169,38170,38171,350, 38173,10086, 38174,38176,439, 6036, 439, 38180,38182,317, 38183,317, 8448, 38185,10592,345, 5538, 317, 14263,18840,38188,5363, 370, 2568, 317, 12154,38189,20779,20721, 317, 38190,38194,22792,1345, 343, 350, 390, 363, 10422,317, 38191,381, 38192,596, 501, 317, 38193,317, 38196,38197,18430,350, 38203,38198,5537, 38202, - 350, 6046, 38199,38200,12774,7428, 363, 362, 38201,363, 6036, 4738, 38205,38206,38207,38210,38213,9938, 7490, 343, 4976, 21037,25280,365, 7852, 317, 4591, + 350, 6046, 38199,38200,12774,7428, 363, 362, 38201,363, 6036, 4738, 38205,38206,38207,38210,38213,9938, 7490, 343, 4976, 21037,25280,365, 7852, 317, 4591, 6854, 38208,350, 317, 363, 38209,363, 38211,38212,2063, 317, 10035,351, 363, 439, 38215,351, 317, 317, 3505, 317, 38216,317, 38217,38218,38219,38220, - 363, 38222,38224,38225,38238,38239,38241,38244,38245,38247,38253,38266,373, 38282,38284,38291,32298,38223,3505, 38226,38228,6598, 38234,38236,11709,350, 9938, - 479, 24637,38237,317, 38227,38229,1453, 2219, 38231,38232,38233,7949, 38230,6594, 2193, 11310,6599, 27334,38235,317, 317, 332, 2219, 317, 4959, 343, 362, - 38240,350, 38242,317, 38243,5362, 317, 9521, 38246,317, 38248,12713,10561,5662, 38250,38249,38251,38252,38254,38255,543, 38258,38260,8178, 38261,4984, 371, + 363, 38222,38224,38225,38238,38239,38241,38244,38245,38247,38253,38266,373, 38282,38284,38291,32298,38223,3505, 38226,38228,6598, 38234,38236,11709,350, 9938, + 479, 24637,38237,317, 38227,38229,1453, 2219, 38231,38232,38233,7949, 38230,6594, 2193, 11310,6599, 27334,38235,317, 317, 332, 2219, 317, 4959, 343, 362, + 38240,350, 38242,317, 38243,5362, 317, 9521, 38246,317, 38248,12713,10561,5662, 38250,38249,38251,38252,38254,38255,543, 38258,38260,8178, 38261,4984, 371, 317, 7392, 38256,38257,390, 2219, 38259,38262,2571, 545, 38263,38264,38265,9524, 7600, 38267,38268,38269,38272,24119,38273,38274,38275,20011,38278,317, 38280, - 21123,501, 12564,317, 317, 317, 317, 38270,38271,553, 317, 2222, 2219, 317, 1108, 24181,317, 356, 501, 345, 38276,38277,1108, 38279,27913,362, 673, - 38281,382, 343, 5662, 450, 317, 8519, 317, 38283,20545,317, 317, 2366, 3007, 5335, 38285,38287,450, 12704,3987, 350, 362, 350, 38288,38290,38286,317, + 21123,501, 12564,317, 317, 317, 317, 38270,38271,553, 317, 2222, 2219, 317, 1108, 24181,317, 356, 501, 345, 38276,38277,1108, 38279,27913,362, 673, + 38281,382, 343, 5662, 450, 317, 8519, 317, 38283,20545,317, 317, 2366, 3007, 5335, 38285,38287,450, 12704,3987, 350, 362, 350, 38288,38290,38286,317, 317, 9567, 7949, 317, 38289,4959, 350, 350, 466, 11709,4952, 38292,350, 351, 25351,15424,5663, 2405, 15221,949, 1108, 317, 38294,370, 38297,38295,38296, - 38298,317, 38300,38302,38301,317, 26942,38303,38305,38306,38312,38315,38317,38324,38327,6917, 38336,38373,38384,38385,6601, 38393,38399,317, 38400,38404,317, + 38298,317, 38300,38302,38301,317, 26942,38303,38305,38306,38312,38315,38317,38324,38327,6917, 38336,38373,38384,38385,6601, 38393,38399,317, 38400,38404,317, 350, 38304,566, 29457,35634,472, 38307,38308,38309,38310,38311,38313,362, 14263,317, 38314,7949, 1347, 38316,317, 317, 317, 32981,38318,10946,38320,38322, 38319,1344, 2310, 9012, 38321,370, 38323,10592,1108, 38325,38326,317, 6563, 501, 345, 350, 404, 4952, 25993,6046, 317, 38328,38329,4965, 12184,22412,38334, 38335,427, 317, 38330,345, 38331,38332,317, 38060,38333,12083,32397,317, 356, 1999, 38337,1087, 38338,38339,24393,38343,2609, 9060, 38347,38349,38351,23019, 38352,38363,38366,38369,38370,38371,345, 356, 1325, 317, 38340,38341,38342,381, 382, 38344,7949, 38346,317, 16989,345, 38345,38348,343, 7389, 24029,38350, - 5055, 390, 3987, 11928,5241, 5663, 2108, 10855,545, 38353,38354,317, 317, 1353, 317, 1353, 428, 2134, 38355,38357,38358,317, 38359,317, 38361,589, 637, + 5055, 390, 3987, 11928,5241, 5663, 2108, 10855,545, 38353,38354,317, 317, 1353, 317, 1353, 428, 2134, 38355,38357,38358,317, 38359,317, 38361,589, 637, 317, 5826, 38356,363, 317, 2322, 38360,501, 38362,38364,38365,2134, 466, 38367,18840,38368,317, 38372,4925, 317, 317, 7389, 38374,11709,38375,33712,38376, - 38378,38379,439, 38380,34265,317, 317, 317, 8488, 317, 9720, 10592,317, 38377,317, 4738, 317, 466, 2022, 362, 38381,38382,381, 38383,393, 317, 8275, - 949, 3800, 38386,10422,379, 38387,3999, 38390,38391,317, 38388,38388,38389,18165,2272, 2366, 38392,419, 38394,38395,2022, 363, 38398,317, 317, 390, 317, + 38378,38379,439, 38380,34265,317, 317, 317, 8488, 317, 9720, 10592,317, 38377,317, 4738, 317, 466, 2022, 362, 38381,38382,381, 38383,393, 317, 8275, + 949, 3800, 38386,10422,379, 38387,3999, 38390,38391,317, 38388,38388,38389,18165,2272, 2366, 38392,419, 38394,38395,2022, 363, 38398,317, 317, 390, 317, 38396,38397,365, 35948,363, 351, 356, 363, 426, 351, 363, 2021, 2134, 38401,13011,317, 2551, 2067, 38402,317, 38403,363, 382, 13776,38406,38412,38414, - 38416,14832,38424,38427,38436,38445,38448,38450,317, 38407,38408,350, 574, 38409,10253,490, 38410,38411,5898, 38413,317, 13269,6674, 317, 317, 2208, 363, - 38415,9289, 317, 350, 844, 11992,38417,30151,38419,38418,541, 351, 317, 13856,317, 38420,38421,38422,38423,1347, 9548, 38425,38426,384, 1060, 317, 317, + 38416,14832,38424,38427,38436,38445,38448,38450,317, 38407,38408,350, 574, 38409,10253,490, 38410,38411,5898, 38413,317, 13269,6674, 317, 317, 2208, 363, + 38415,9289, 317, 350, 844, 11992,38417,30151,38419,38418,541, 351, 317, 13856,317, 38420,38421,38422,38423,1347, 9548, 38425,38426,384, 1060, 317, 317, 38428,38429,38433,363, 11825,317, 343, 38430,317, 38432,317, 350, 38431,382, 317, 317, 38434,38435,351, 437, 1230, 38437,37200,38438,1325, 38439,38440, 38441,38442,38443,7328, 38444,1347, 27814,38446,8519, 8023, 343, 38447,404, 38449,317, 545, 2022, 15748,5809, 448, 38452,23996,38454,38456,38472,8519, 38475, 7401, 38477,596, 38480,38486,362, 38488,38501,38510,38516,6089, 38518,362, 1588, 38453,317, 9109, 3505, 8016, 38455,501, 32099,10149,38457,15745,363, 38466, - 38471,317, 317, 317, 38458,404, 38459,21757,38462,38463,38460,38461,38464,38465,317, 363, 38467,363, 1548, 38468,317, 5995, 38470,38469,317, 990, 448, + 38471,317, 317, 317, 38458,404, 38459,21757,38462,38463,38460,38461,38464,38465,317, 363, 38467,363, 1548, 38468,317, 5995, 38470,38469,317, 990, 448, 5241, 38473,362, 38474,34034,2022, 317, 38476,33377,412, 317, 381, 317, 1020, 6600, 38478,363, 38479,7911, 351, 404, 38481,6415, 10476,343, 317, 38482, 317, 317, 38483,38484,38485,1345, 2272, 38487,317, 38489,38490,38496,363, 317, 15502,356, 38491,553, 362, 343, 5662, 317, 1020, 38494,317, 38492,38493, - 38495,317, 371, 345, 350, 38497,38499,317, 5055, 351, 38498,38500,351, 5300, 404, 38502,38503,38508,38504,38505,12994,13221,38506,370, 18329,29423,317, - 345, 38507,38509,317, 317, 317, 317, 38511,8023, 38514,23446,38515,363, 18840,38512,38513,343, 35570,363, 945, 365, 351, 596, 14340,317, 363, 8178, + 38495,317, 371, 345, 350, 38497,38499,317, 5055, 351, 38498,38500,351, 5300, 404, 38502,38503,38508,38504,38505,12994,13221,38506,370, 18329,29423,317, + 345, 38507,38509,317, 317, 317, 317, 38511,8023, 38514,23446,38515,363, 18840,38512,38513,343, 35570,363, 945, 365, 351, 596, 14340,317, 363, 8178, 38517,317, 1358, 38520,10943,2631, 350, 38525,38528,350, 350, 350, 38529,38532,5809, 22466,38521,38522,38523,38524,30712,595, 38526,38527,511, 38530,12712, 350, 551, 5105, 38531,38533,37608,38534,38536,38537,38538,38547,38559,38564,38565,16136,38576,38581,38584,38591,38594,38613,38621,38627,38633,38643,38660,38670, - 38671,38673,7582, 38674,38539,38542,38544,9525, 356, 317, 1345, 38546,38540,19478,38541,38543,38545,356, 27814,370, 317, 38548,38549,38551,38556,32958,317, - 18092,343, 11108,29783,363, 317, 38550,350, 317, 24024,38552,1160, 317, 317, 404, 38553,5752, 317, 38554,38555,1347, 4591, 317, 38557,317, 38558,382, + 38671,38673,7582, 38674,38539,38542,38544,9525, 356, 317, 1345, 38546,38540,19478,38541,38543,38545,356, 27814,370, 317, 38548,38549,38551,38556,32958,317, + 18092,343, 11108,29783,363, 317, 38550,350, 317, 24024,38552,1160, 317, 317, 404, 38553,5752, 317, 38554,38555,1347, 4591, 317, 38557,317, 38558,382, 350, 362, 38560,38561,38562,1347, 345, 38563,317, 8020, 466, 362, 363, 18700,317, 345, 38566,370, 38567,12584,38570,317, 317, 38571,38572,5201, 38573, 38575,317, 38568,5328, 38569,317, 527, 317, 25877,38574,551, 2809, 38577,38580,38578,381, 317, 38579,566, 349, 38227,35025,2024, 9938, 5861, 381, 38582, 38583,5457, 2156, 38585,2152, 38587,38588,6394, 317, 38586,381, 38589,38590,370, 38592,38593,370, 29866,1453, 382, 38595,38604,38608,38611,437, 345, 38596, - 38599,317, 343, 6555, 1347, 38597,38598,345, 363, 363, 13288,38600,38601,38602,38603,29870,38605,1160, 401, 317, 317, 590, 38606,317, 38607,6163, 490, - 317, 490, 38609,2272, 38610,990, 317, 362, 317, 317, 38612,317, 20424,2110, 38614,38618,4965, 38619,363, 404, 317, 6555, 38615,9525, 38616,1108, 1108, + 38599,317, 343, 6555, 1347, 38597,38598,345, 363, 363, 13288,38600,38601,38602,38603,29870,38605,1160, 401, 317, 317, 590, 38606,317, 38607,6163, 490, + 317, 490, 38609,2272, 38610,990, 317, 362, 317, 317, 38612,317, 20424,2110, 38614,38618,4965, 38619,363, 404, 317, 6555, 38615,9525, 38616,1108, 1108, 38617,317, 317, 38620,382, 651, 38622,345, 38623,356, 362, 38625,317, 390, 38626,345, 10279,5003, 6172, 5634, 38624,17434,317, 38628,38629,2108, 38631, - 38630,30195,38632,38634,38636,38637,38638,33255,5662, 38641,38642,6892, 356, 317, 490, 38635,9711, 317, 5105, 317, 6849, 16197,990, 371, 990, 1078, 362, + 38630,30195,38632,38634,38636,38637,38638,33255,5662, 38641,38642,6892, 356, 317, 490, 38635,9711, 317, 5105, 317, 6849, 16197,990, 371, 990, 1078, 362, 38639,36966,381, 38640,7035, 317, 404, 5897, 38644,38647,6598, 38648,38655,362, 5332, 38659,38645,6696, 38646,5926, 28588,38649,9624, 38651,38652,362, 38654, 7949, 2551, 38650,38653,38656,38657,38658,576, 363, 317, 38661,12584,1109, 466, 38662,38664,317, 10487,38669,317, 10546,317, 38663,38665,38666,38667,38668, - 5896, 380, 350, 382, 38672,382, 380, 342, 382, 2063, 38675,38676,6598, 35634,38682,382, 10560,5205, 38677,317, 317, 38678,38679,38680,38681,351, 370, + 5896, 380, 350, 382, 38672,382, 380, 342, 382, 2063, 38675,38676,6598, 35634,38682,382, 10560,5205, 38677,317, 317, 38678,38679,38680,38681,351, 370, 38684,38686,2024, 38687,38690,38693,38695,38698,38701,38711,38714,38685,384, 356, 38688,38689,5323, 23268,38691,38692,317, 38694,363, 7452, 38696,38697,38699, - 317, 38700,18281,345, 38702,38709,38710,362, 3999, 317, 38703,38706,317, 317, 32069,2193, 317, 362, 10664,38704,2271, 38705,38707,38708,5055, 382, 363, + 317, 38700,18281,345, 38702,38709,38710,362, 3999, 317, 38703,38706,317, 317, 32069,2193, 317, 362, 10664,38704,2271, 38705,38707,38708,5055, 382, 363, 439, 38712,363, 38713,38715,38717,38719,9624, 38734,38739,16008,38740,2391, 38741,38742,317, 38746,38718,351, 362, 317, 38720,38721,38722,38724,38725,38728, - 38730,38732,38733,38723,2152, 316, 2272, 38726,38727,38729,38731,38735,38737,38736,38738,5537, 362, 38743,38744,350, 2391, 350, 317, 12845,317, 390, 317, + 38730,38732,38733,38723,2152, 316, 2272, 38726,38727,38729,38731,38735,38737,38736,38738,5537, 362, 38743,38744,350, 2391, 350, 317, 12845,317, 390, 317, 38745,38748,38752,371, 12144,2134, 317, 5662, 382, 2134, 38753,38755,38760,15756,38761,38749,38750,38751,345, 317, 38754,382, 6163, 38756,501, 12731,38757, - 2022, 350, 38758,38759,317, 38763,490, 38766,12756,38767,38764,38765,317, 363, 5661, 351, 1011, 38769,38770,2021, 38771,332, 38772,317, 4980, 332, 380, + 2022, 350, 38758,38759,317, 38763,490, 38766,12756,38767,38764,38765,317, 363, 5661, 351, 1011, 38769,38770,2021, 38771,332, 38772,317, 4980, 332, 380, 317, 381, 317, 38774,345, 554, 2152, 38783,38775,38778,38780,28079,343, 38781,38776,38777,38779,9852, 554, 38782,317, 38785,38786,38791,2024, 466, 38792, 38793,38794,5662, 38796,38797,38798,6598, 38800,38801,16278,2584, 38787,38788,363, 8178, 317, 38790,353, 317, 317, 38789,317, 26283,317, 343, 2261, 38795, 4984, 605, 12731,554, 38799,8906, 466, 551, 2063, 10938,38803,7850, 38805,38812,38815,38816,38819,18774,38823,38824,38806,38807,38810,317, 1108, 4115, 38808, 38809,612, 38811,19065,38813,38814,3664, 22940,38817,38818,24361,38820,38821,38822,38825,38827,38828,317, 38829,317, 38830,38831,38834,38844,38865,38874,38895, - 38896,38937,590, 38940,38949,38953,39028,39041,2117, 39084,39111,39135,39175,39196,39198,39200,490, 39201,38832,23574,38833,38835,404, 38838,38842,8037, 490, - 350, 38843,551, 38836,38837,6917, 317, 317, 5255, 20613,382, 21053,345, 38839,38840,317, 38841,8214, 317, 365, 10655,37598,317, 38845,7657, 38846,427, + 38896,38937,590, 38940,38949,38953,39028,39041,2117, 39084,39111,39135,39175,39196,39198,39200,490, 39201,38832,23574,38833,38835,404, 38838,38842,8037, 490, + 350, 38843,551, 38836,38837,6917, 317, 317, 5255, 20613,382, 21053,345, 38839,38840,317, 38841,8214, 317, 365, 10655,37598,317, 38845,7657, 38846,427, 3079, 427, 38847,38854,38862,11236,38863,12057,404, 317, 38848,38853,15561,317, 38849,38851,38850,38852,3987, 404, 317, 317, 38855,38856,38858,38857,38859, 38860,38861,554, 426, 1345, 3999, 371, 317, 38864,370, 317, 38866,38867,38868,38873,15435,13558,317, 490, 2809, 1943, 317, 7314, 2193, 38869,365, 38870, - 317, 38872,365, 1230, 38871,6851, 3284, 2117, 38875,38876,38877,317, 11310,38878,1347, 317, 38879,38892,38894,351, 15772,38880,38884,38887,332, 26214,6904, - 38881,401, 38882,38883,20086,317, 317, 38885,38886,38888,38739,23551,38889,38890,38891,38893,26175,38897,38899,404, 38900,38908,38931,10223,362, 38933,404, + 317, 38872,365, 1230, 38871,6851, 3284, 2117, 38875,38876,38877,317, 11310,38878,1347, 317, 38879,38892,38894,351, 15772,38880,38884,38887,332, 26214,6904, + 38881,401, 38882,38883,20086,317, 317, 38885,38886,38888,38739,23551,38889,38890,38891,38893,26175,38897,38899,404, 38900,38908,38931,10223,362, 38933,404, 38934,317, 11626,38898,2551, 38901,38903,3079, 317, 38902,38859,317, 38904,38905,8361, 38906,38907,15837,426, 427, 38909,21382,38912,2413, 3652, 38914,38915, 38178,38922,32249,8722, 38923,38924,6598, 38928,38910,5898, 38911,448, 38913,6710, 380, 343, 38916,370, 38918,317, 38917,343, 38919,343, 38920,38921,15293, 466, 317, 476, 574, 534, 12154,2553, 558, 38925,2108, 38926,8047, 558, 38927,38929,439, 2063, 38930,38932,370, 21758,2078, 38935,38936,15892,38938,38939, @@ -8839,217 +8834,217 @@ static const unsigned int ChildLocs[185261] = 38962,38964,38972,362, 350, 38973,38963,38965,38968,38314,38970,13364,38966,38967,38969,38971,362, 408, 466, 19187,38976,38978,3075, 362, 12934,8488, 38980, 38981,38984,38987,38990,38992,39002,39004,39005,39006,16825,39008,5961, 39010,39011,10081,26181,2732, 1588, 38985,38986,7590, 38988,2368, 4949, 38989,38991,30400, 448, 38993,38997,317, 362, 38998,39000,39001,317, 38994,38995,38996,38999,4952, 4949, 356, 362, 317, 356, 317, 6599, 4952, 355, 39003,355, 392, 14161, - 4965, 350, 39007,317, 39009,10452,6195, 545, 7072, 5752, 362, 466, 18840,39012,39013,7866, 9450, 317, 32568,419, 39017,501, 4738, 363, 39019,39018,317, - 10487,2323, 16989,39021,350, 363, 317, 12756,317, 317, 39022,39023,39025,39026,2389, 351, 419, 39029,350, 39032,39035,39036,39040,2110, 13686,39030,6551, - 39031,7698, 365, 39033,6555, 490, 4925, 39034,9012, 5428, 7797, 39037,350, 3079, 39038,9938, 2301, 39039,7053, 5626, 5626, 39042,39043,39049,39063,39065,317, - 389, 39066,2022, 362, 39068,39070,39075,39078,39079,39083,404, 6199, 362, 490, 3505, 317, 39044,39048,39045,6021, 39046,362, 39047,10223,4980, 428, 7698, - 39050,4984, 332, 39052,39054,39056,39059,39060,39061,27846,2553, 9931, 39051,317, 1453, 5897, 5991, 466, 22177,362, 317, 1345, 39053,39055,39057,39058,530, - 362, 363, 5343, 39062,5711, 7698, 15068,39064,362, 7949, 9425, 317, 8136, 554, 345, 343, 15887,39067,10223,28479,317, 2369, 39069,37217,345, 39071,6900, + 4965, 350, 39007,317, 39009,10452,6195, 545, 7072, 5752, 362, 466, 18840,39012,39013,7866, 9450, 317, 32568,419, 39017,501, 4738, 363, 39019,39018,317, + 10487,2323, 16989,39021,350, 363, 317, 12756,317, 317, 39022,39023,39025,39026,2389, 351, 419, 39029,350, 39032,39035,39036,39040,2110, 13686,39030,6551, + 39031,7698, 365, 39033,6555, 490, 4925, 39034,9012, 5428, 7797, 39037,350, 3079, 39038,9938, 2301, 39039,7053, 5626, 5626, 39042,39043,39049,39063,39065,317, + 389, 39066,2022, 362, 39068,39070,39075,39078,39079,39083,404, 6199, 362, 490, 3505, 317, 39044,39048,39045,6021, 39046,362, 39047,10223,4980, 428, 7698, + 39050,4984, 332, 39052,39054,39056,39059,39060,39061,27846,2553, 9931, 39051,317, 1453, 5897, 5991, 466, 22177,362, 317, 1345, 39053,39055,39057,39058,530, + 362, 363, 5343, 39062,5711, 7698, 15068,39064,362, 7949, 9425, 317, 8136, 554, 345, 343, 15887,39067,10223,28479,317, 2369, 39069,37217,345, 39071,6900, 39073,343, 39072,39074,39076,39077,390, 6195, 370, 12154,2022, 363, 39080,466, 363, 4980, 39082,317, 39081,14708,31023,12287,19811,490, 39085,3078, 39088, 39090,39110,3987, 39086,39087,39089,39091,39094,39098,12141,39099,317, 317, 39092,39093,317, 317, 39095,5223, 381, 39096,39097,2134, 2134, 317, 39100,23595, 39104,39107,317, 39101,39103,39102,39105,39106,39108,39109,350, 2022, 2509, 39112,317, 39113,466, 39114,39115,4952, 39116,39117,6834, 39124,39130,39131,39134, 590, 317, 9702, 317, 365, 5238, 317, 332, 9174, 6900, 490, 8926, 450, 450, 3284, 501, 15074,5439, 39118,39120,39121,490, 6808, 39119,3284, 317, 39122, - 39123,39125,39126,39129,317, 13426,5792, 39127,5896, 317, 32952,8948, 317, 39128,317, 5663, 15221,5896, 8948, 39132,39133,419, 39136,38049,317, 39137,554, - 10223,39138,39139,39140,8178, 39145,39148,332, 317, 2078, 317, 317, 1060, 36614,39141,39142,39143,317, 317, 39144,2381, 317, 8557, 317, 6623, 39146,466, + 39123,39125,39126,39129,317, 13426,5792, 39127,5896, 317, 32952,8948, 317, 39128,317, 5663, 15221,5896, 8948, 39132,39133,419, 39136,38049,317, 39137,554, + 10223,39138,39139,39140,8178, 39145,39148,332, 317, 2078, 317, 317, 1060, 36614,39141,39142,39143,317, 317, 39144,2381, 317, 8557, 317, 6623, 39146,466, 39147,317, 317, 396, 317, 8178, 317, 39149,9993, 39151,39152,39174,39150,2271, 356, 39153,18138,1588, 39159,5634, 39161,39164,39154,39155,39156,39157,39158, 39160,39162,39163,39165,1160, 39166,39167,1347, 39168,10376,5418, 21910,317, 39169,39170,39171,39172,39173,351, 521, 317, 39176,39177,39183,2326, 39184,39187, - 39188,39191,39192,39193,39195,39178,2584, 39179,39180,39182,332, 362, 39181,390, 362, 317, 317, 39185,39186,39189,4984, 39190,365, 2078, 2510, 39194,343, + 39188,39191,39192,39193,39195,39178,2584, 39179,39180,39182,332, 362, 39181,390, 362, 317, 317, 39185,39186,39189,4984, 39190,365, 2078, 2510, 39194,343, 362, 350, 404, 1992, 2156, 33590,24775,350, 39197,317, 5477, 39199,24714,363, 404, 39202,351, 355, 7874, 39204,39205,39207,39210,39213,39216,606, 39218, 39206,6581, 39208,39209,356, 18809,317, 39211,39212,39214,370, 39215,396, 39217,39219,607, 39220,39221,1193, 39222,39224,39225,565, 39226,39227,39229,19931, - 10997,39234,6901, 39230,39231,39232,39233,490, 8455, 370, 1481, 39235,345, 345, 39237,39239,7871, 390, 339, 317, 39238,390, 39241,2997, 363, 39242,2004, - 39243,39248,39267,39292,39308,39325,39352,39369,39384,39388,39390,130, 39517,39603,39658,39693,965, 39711,39780,39816,39858,39903,39916,39939,39940,39946,9425, + 10997,39234,6901, 39230,39231,39232,39233,490, 8455, 370, 1481, 39235,345, 345, 39237,39239,7871, 390, 339, 317, 39238,390, 39241,2997, 363, 39242,2004, + 39243,39248,39267,39292,39308,39325,39352,39369,39384,39388,39390,130, 39517,39603,39658,39693,965, 39711,39780,39816,39858,39903,39916,39939,39940,39946,9425, 39244,317, 39246,39247,1078, 5896, 317, 343, 39245,343, 317, 439, 363, 439, 5273, 317, 343, 317, 39249,39250,39253,39254,39256,7401, 39258,39260,39261, - 39262,39265,39266,317, 371, 317, 381, 4943, 39251,39252,5441, 317, 9783, 1347, 345, 17019,5105, 317, 39255,317, 371, 317, 362, 317, 39257,2087, 356, + 39262,39265,39266,317, 371, 317, 381, 4943, 39251,39252,5441, 317, 9783, 1347, 345, 17019,5105, 317, 39255,317, 371, 317, 362, 317, 39257,2087, 356, 39259,317, 39263,39264,371, 345, 501, 363, 13219,574, 39268,39279,39290,39269,5896, 39270,24775,39271,33156,39273,39274,39272,349, 7651, 39275,39277,39276, 578, 373, 11245,39278,2272, 2298, 363, 38383,8904, 39280,16318,2022, 362, 2022, 317, 490, 39281,20671,381, 39287,39282,39283,20672,7590, 2584, 448, 39284, 39285,39286,39288,5942, 1909, 317, 633, 673, 1353, 39289,39291,381, 39293,39294,39295,39299,39303,39304,39306,2391, 39307,427, 4965, 472, 317, 5105, 39296, - 317, 39297,39298,404, 39300,5055, 39301,362, 404, 362, 1347, 317, 39302,5995, 345, 39305,11146,9624, 381, 39309,5840, 39310,39314,25283,39316,39317,9938, - 39319,39320,39321,39324,2219, 33124,317, 412, 2222, 31227,39311,39313,317, 351, 39312,350, 4965, 33256,39315,317, 317, 362, 15772,39318,6204, 350, 2134, - 351, 15899,4965, 382, 16131,351, 2568, 2568, 3664, 350, 382, 317, 39322,317, 350, 39323,2566, 4965, 466, 370, 16129,39326,4965, 39327,39343,4591, 343, - 26175,39344,350, 39346,39350,7408, 4949, 39328,39329,18581,10815,350, 39332,39335,551, 39336,39338,10626,317, 39330,13364,39331,39333,39334,4984, 349, 9609, - 350, 542, 351, 39337,5022, 5022, 39339,345, 39342,39340,39341,11245,11245,381, 7592, 2272, 37793,39345,9609, 351, 39347,39348,39349,490, 39351,39353,5896, + 317, 39297,39298,404, 39300,5055, 39301,362, 404, 362, 1347, 317, 39302,5995, 345, 39305,11146,9624, 381, 39309,5840, 39310,39314,25283,39316,39317,9938, + 39319,39320,39321,39324,2219, 33124,317, 412, 2222, 31227,39311,39313,317, 351, 39312,350, 4965, 33256,39315,317, 317, 362, 15772,39318,6204, 350, 2134, + 351, 15899,4965, 382, 16131,351, 2568, 2568, 3664, 350, 382, 317, 39322,317, 350, 39323,2566, 4965, 466, 370, 16129,39326,4965, 39327,39343,4591, 343, + 26175,39344,350, 39346,39350,7408, 4949, 39328,39329,18581,10815,350, 39332,39335,551, 39336,39338,10626,317, 39330,13364,39331,39333,39334,4984, 349, 9609, + 350, 542, 351, 39337,5022, 5022, 39339,345, 39342,39340,39341,11245,11245,381, 7592, 2272, 37793,39345,9609, 351, 39347,39348,39349,490, 39351,39353,5896, 2077, 39356,362, 39360,11089,39362,363, 29025,39363,39366,15274,39367,317, 3079, 39354,39355,381, 317, 11709,4980, 39357,39358,317, 39359,15457,404, 39361, 4965, 16318,343, 317, 356, 381, 7389, 4984, 439, 39364,39365,39368,578, 32352,1915, 390, 5241, 39370,15500,39379,39380,39381,39382,39383,11915,11418,39371, - 317, 39372,37152,39373,39376,10560,4960, 343, 39374,39375,1020, 39377,39378,351, 6598, 9012, 317, 12142,28434,554, 5836, 450, 39385,39386,18215,427, 883, + 317, 39372,37152,39373,39376,10560,4960, 343, 39374,39375,1020, 39377,39378,351, 6598, 9012, 317, 12142,28434,554, 5836, 450, 39385,39386,18215,427, 883, 11146,12060,545, 5537, 317, 39387,356, 5987, 317, 10316,39389,11145,317, 39391,39392,39393,39394,39396,490, 2551, 23657,2551, 317, 381, 317, 1347, 11501, 39395,501, 5238, 501, 490, 39397,2351, 39398,39399,39401,39407,39408,39419,2024, 39423,39424,343, 39432,39433,39460,2571, 39469,1060, 39478,5676, 39480,39489, - 39500,39501,39503,39504,39509,949, 39400,1230, 362, 317, 317, 8718, 317, 1230, 2108, 39402,479, 39404,317, 2108, 371, 363, 317, 39403,39405,39406,370, - 317, 317, 27860,11702,5126, 16143,12523,8695, 39409,16603,39412,39414,362, 2571, 39416,39417,20869,317, 1060, 39418,317, 6600, 1160, 39410,39411,9624, 1020, - 362, 2571, 317, 39413,39415,476, 1347, 317, 396, 381, 350, 39420,317, 39421,362, 1160, 490, 39422,345, 317, 3869, 13110,574, 36281,1020, 363, 7698, + 39500,39501,39503,39504,39509,949, 39400,1230, 362, 317, 317, 8718, 317, 1230, 2108, 39402,479, 39404,317, 2108, 371, 363, 317, 39403,39405,39406,370, + 317, 317, 27860,11702,5126, 16143,12523,8695, 39409,16603,39412,39414,362, 2571, 39416,39417,20869,317, 1060, 39418,317, 6600, 1160, 39410,39411,9624, 1020, + 362, 2571, 317, 39413,39415,476, 1347, 317, 396, 381, 350, 39420,317, 39421,362, 1160, 490, 39422,345, 317, 3869, 13110,574, 36281,1020, 363, 7698, 39425,39429,39430,362, 362, 39431,317, 7682, 2035, 39426,39427,317, 466, 39428,317, 15778,6598, 476, 317, 5093, 39434,5896, 39437,39445,5662, 350, 39453, 39455,39456,317, 7698, 371, 1230, 343, 404, 39435,20539,1230, 39436,317, 8722, 4965, 490, 20869,39438,39440,39444,317, 381, 7949, 363, 39439,363, 39441, 39443,11088,39442,16264,10592,4943, 351, 2567, 363, 3999, 362, 317, 356, 7698, 39446,6546, 9624, 11236,39447,39451,1230, 39448,12616,39449,351, 16250,39449, - 404, 5809, 39450,5809, 39452,7698, 11236,317, 28079,362, 39454,370, 12421,317, 1266, 317, 317, 35809,9624, 39457,317, 39458,317, 39459,363, 39461,2134, + 404, 5809, 39450,5809, 39452,7698, 11236,317, 28079,362, 39454,370, 12421,317, 1266, 317, 317, 35809,9624, 39457,317, 39458,317, 39459,363, 39461,2134, 39462,39465,3023, 4962, 363, 39466,39467,6089, 4949, 343, 39463,1347, 317, 39464,39468,39470,39471,39472,39474,362, 39477,317, 23859,15750,2026, 2272, 39473, 39475,39476,1347, 20065,363, 8686, 39479,22698,39481,370, 39482,12704,362, 39484,39485,39487,350, 12154,39483,343, 7651, 7651, 13960,13960,515, 356, 39486, - 2272, 363, 426, 39488,363, 5896, 39490,39491,39494,11709,36523,39496,39497,39498,39499,39492,39493,39495,28066,345, 14938,365, 5896, 14938,12696,7192, 362, - 39502,370, 2219, 39505,9624, 11089,39507,39508,6089, 19590,10467,605, 39506,1060, 476, 21123,343, 39510,39511,39512,4738, 39513,39514,39516,317, 31987,7408, - 7592, 28079,363, 12288,15221,39515,13336,5810, 39518,39519,39520,39521,39570,596, 39573,39576,39598,39600,39601,7850, 490, 2156, 1020, 9521, 4949, 2156, 4949, - 317, 1266, 673, 39522,32768,39526,39527,39529,39531,39534,39536,39537,39547,39549,39551,22704,39566,2222, 39523,39524,2328, 39525,3505, 390, 39528,343, 2369, - 3366, 39530,11229,39532,317, 39533,39535,343, 2509, 3599, 39538,39540,39542,39544,39539,39541,39543,39545,39546,990, 39548,6228, 6996, 633, 511, 356, 339, + 2272, 363, 426, 39488,363, 5896, 39490,39491,39494,11709,36523,39496,39497,39498,39499,39492,39493,39495,28066,345, 14938,365, 5896, 14938,12696,7192, 362, + 39502,370, 2219, 39505,9624, 11089,39507,39508,6089, 19590,10467,605, 39506,1060, 476, 21123,343, 39510,39511,39512,4738, 39513,39514,39516,317, 31987,7408, + 7592, 28079,363, 12288,15221,39515,13336,5810, 39518,39519,39520,39521,39570,596, 39573,39576,39598,39600,39601,7850, 490, 2156, 1020, 9521, 4949, 2156, 4949, + 317, 1266, 673, 39522,32768,39526,39527,39529,39531,39534,39536,39537,39547,39549,39551,22704,39566,2222, 39523,39524,2328, 39525,3505, 390, 39528,343, 2369, + 3366, 39530,11229,39532,317, 39533,39535,343, 2509, 3599, 39538,39540,39542,39544,39539,39541,39543,39545,39546,990, 39548,6228, 6996, 633, 511, 356, 339, 11055,9866, 39550,404, 5684, 39552,39555,2022, 5205, 39557,39553,39554,39556,39558,39559,39560,39561,10422,466, 317, 39562,39563,39564,39565,551, 39567,39569, 356, 39568,371, 34426,1347, 5201, 39571,317, 39572,7091, 39574,5105, 39575,317, 39577,39580,39582,39585,39588,39592,39594,39597,2555, 38733,39578,39579,39581, 39583,39584,33232,18615,4591, 317, 490, 39586,39587,6088, 521, 4591, 317, 2156, 317, 39589,39590,39591,39593,39595,39596,8583, 18617,39599,390, 27295,39602, - 410, 39604,5897, 39606,39608,39617,39634,5159, 39638,39640,490, 39641,39643,490, 39653,39654,345, 1526, 39655,39657,39605,350, 317, 15571,317, 39607,428, + 410, 39604,5897, 39606,39608,39617,39634,5159, 39638,39640,490, 39641,39643,490, 39653,39654,345, 1526, 39655,39657,39605,350, 317, 15571,317, 39607,428, 317, 380, 39609,380, 39615,2086, 39616,637, 6228, 39610,2731, 633, 317, 39611,362, 39614,19097,4603, 621, 351, 351, 39612,39613,1155, 1060, 317, 14470, 317, 11373,2219, 37217,39618,39619,1266, 317, 633, 39620,39622,39624,39625,39626,39630,39631,3987, 39621,363, 39623,14535,18532,381, 605, 382, 5450, 17641, - 363, 39627,39628,39629,1033, 466, 317, 39632,39633,7940, 39635,4962, 11635,5623, 317, 590, 39637,39636,490, 2110, 317, 11132,39639,404, 12756,6036, 3999, - 317, 317, 39642,578, 317, 14938,574, 362, 39644,39646,39647,39652,39645,317, 8100, 317, 39648,39650,39651,317, 6020, 39649,5748, 382, 317, 345, 5897, - 317, 590, 4738, 39656,2298, 39659,39661,1345, 39664,39667,39671,39674,9702, 317, 357, 39677,39684,39685,39687,39692,2533, 39660,317, 356, 343, 10285,332, + 363, 39627,39628,39629,1033, 466, 317, 39632,39633,7940, 39635,4962, 11635,5623, 317, 590, 39637,39636,490, 2110, 317, 11132,39639,404, 12756,6036, 3999, + 317, 317, 39642,578, 317, 14938,574, 362, 39644,39646,39647,39652,39645,317, 8100, 317, 39648,39650,39651,317, 6020, 39649,5748, 382, 317, 345, 5897, + 317, 590, 4738, 39656,2298, 39659,39661,1345, 39664,39667,39671,39674,9702, 317, 357, 39677,39684,39685,39687,39692,2533, 39660,317, 356, 343, 10285,332, 317, 39662,39663,551, 39665,317, 39666,39668,39670,4952, 39669,5126, 39260,370, 39672,39673,1020, 466, 317, 1060, 12987,317, 33343,317, 6420, 1345, 39675, - 39676,362, 39678,39680,5793, 2156, 39683,370, 39679,317, 317, 317, 39681,39682,39686,15645,384, 2558, 39688,343, 362, 363, 5020, 39689,39690,39691,9450, - 350, 39694,39695,39699,6089, 39701,39702,27101,362, 39706,39710,404, 6089, 317, 317, 39696,31338,317, 18971,3987, 39697,39698,3664, 39700,35069,317, 1992, - 433, 317, 39703,317, 317, 39704,371, 39705,404, 317, 39707,11942,343, 362, 317, 345, 317, 317, 317, 39708,39709,7940, 9289, 14826,9624, 363, 3078, - 363, 39712,1998, 14084,39714,39716,39717,39718,39724,2022, 39725,39731,39748,39751,39758,39766,39777,39778,39779,317, 883, 39713,317, 317, 8392, 2537, 6563, - 39715,343, 371, 2391, 15308,9454, 390, 317, 317, 317, 362, 317, 39719,29531,343, 317, 490, 11388,39720,39721,39722,317, 317, 39723,317, 370, 7734, + 39676,362, 39678,39680,5793, 2156, 39683,370, 39679,317, 317, 317, 39681,39682,39686,15645,384, 2558, 39688,343, 362, 363, 5020, 39689,39690,39691,9450, + 350, 39694,39695,39699,6089, 39701,39702,27101,362, 39706,39710,404, 6089, 317, 317, 39696,31338,317, 18971,3987, 39697,39698,3664, 39700,35069,317, 1992, + 433, 317, 39703,317, 317, 39704,371, 39705,404, 317, 39707,11942,343, 362, 317, 345, 317, 317, 317, 39708,39709,7940, 9289, 14826,9624, 363, 3078, + 363, 39712,1998, 14084,39714,39716,39717,39718,39724,2022, 39725,39731,39748,39751,39758,39766,39777,39778,39779,317, 883, 39713,317, 317, 8392, 2537, 6563, + 39715,343, 371, 2391, 15308,9454, 390, 317, 317, 317, 362, 317, 39719,29531,343, 317, 490, 11388,39720,39721,39722,317, 317, 39723,317, 370, 7734, 2022, 317, 39726,9878, 39728,39729,39730,39727,5974, 2348, 39732,39733,39738,39739,39742,39743,2310, 39744,39745,466, 39747,371, 1230, 317, 9525, 39734,39735, - 4563, 39737,9695, 36461,317, 37441,350, 380, 2219, 39736,371, 10561,11124,8047, 11960,20023,39740,39741,317, 396, 380, 317, 317, 15202,1160, 371, 371, - 4965, 317, 317, 382, 390, 370, 5163, 12154,39746,1020, 426, 6228, 317, 633, 371, 8301, 2077, 901, 14501,2272, 317, 23633,39749,10626,10626,39750,332, - 7850, 8649, 15526,39752,39754,39757,317, 380, 39753,6020, 7091, 39755,362, 317, 39756,511, 2719, 1347, 317, 32982,390, 39759,39764,554, 10147,2022, 362, + 4563, 39737,9695, 36461,317, 37441,350, 380, 2219, 39736,371, 10561,11124,8047, 11960,20023,39740,39741,317, 396, 380, 317, 317, 15202,1160, 371, 371, + 4965, 317, 317, 382, 390, 370, 5163, 12154,39746,1020, 426, 6228, 317, 633, 371, 8301, 2077, 901, 14501,2272, 317, 23633,39749,10626,10626,39750,332, + 7850, 8649, 15526,39752,39754,39757,317, 380, 39753,6020, 7091, 39755,362, 317, 39756,511, 2719, 1347, 317, 32982,390, 39759,39764,554, 10147,2022, 362, 39765,317, 1194, 2024, 6954, 370, 22716,345, 12774,39760,39762,317, 39761,511, 388, 317, 39763,381, 5634, 428, 6598, 551, 355, 466, 5662, 317, 39767, 1345, 39769,362, 5055, 345, 363, 39768,5241, 7098, 39770,39776,317, 39771,39772,39773,39774,39775,22057,317, 412, 6191, 1033, 5309, 545, 35629,2063, 39781, - 39783,39786,39789,39790,39792,39794,12141,16825,10845,39797,39798,39806,39808,351, 371, 490, 39782,39784,2586, 39785,317, 7408, 317, 371, 317, 11089,363, - 317, 362, 39787,6420, 317, 39788,578, 6598, 551, 23447,39791,19673,332, 371, 39793,382, 370, 39795,3079, 317, 39796,317, 6900, 39799,39800,3078, 2156, + 39783,39786,39789,39790,39792,39794,12141,16825,10845,39797,39798,39806,39808,351, 371, 490, 39782,39784,2586, 39785,317, 7408, 317, 371, 317, 11089,363, + 317, 362, 39787,6420, 317, 39788,578, 6598, 551, 23447,39791,19673,332, 371, 39793,382, 370, 39795,3079, 317, 39796,317, 6900, 39799,39800,3078, 2156, 39801,39802,373, 39803,39804,2509, 317, 7888, 370, 39805,32075,39807,6598, 350, 9067, 39809,39813,350, 39815,317, 317, 317, 39810,317, 24226,5335, 39811, 350, 39812,39814,1992, 1347, 5200, 2577, 317, 6228, 39817,39819,39820,39822,39824,39829,39832,39834,39835,39836,514, 39837,39839,2571, 39842,39843,39844,39845, 39851,39856,1358, 39818,365, 32327,39821,345, 25938,356, 2107, 39823,1345, 317, 317, 317, 6420, 6693, 39825,384, 39828,384, 39826,39827,39830,384, 39831, 317, 39833,317, 317, 350, 511, 317, 27498,370, 5332, 16804,392, 13478,3338, 39838,434, 317, 39840,39841,343, 7892, 2218, 479, 3621, 1915, 356, 14549, - 427, 9097, 39846,39847,39848,39849,381, 12450,4268, 2510, 39850,317, 1383, 317, 39852,39853,343, 362, 363, 39854,39855,1160, 5105, 317, 317, 5223, 6420, - 2219, 349, 18361,39857,39859,39860,39862,370, 1383, 39863,345, 317, 39868,39870,39871,39874,39876,39878,39900,317, 39902,363, 35585,39861,317, 551, 5055, - 5055, 7785, 2211, 8137, 4984, 39864,39867,427, 4952, 39865,8519, 39866,511, 363, 5561, 5896, 317, 5561, 2236, 39869,4984, 3075, 35155,39872,362, 39873,317, - 2077, 356, 466, 382, 317, 3987, 2402, 317, 39875,317, 2211, 31751,39877,370, 317, 39879,501, 39880,39897,10877,39898,15745,362, 350, 39899,356, 9234, - 1266, 317, 380, 39881,39883,317, 39886,39888,39890,317, 39891,317, 501, 317, 317, 39893,317, 356, 2631, 39882,381, 39884,39885,39887,39889,15216,6593, + 427, 9097, 39846,39847,39848,39849,381, 12450,4268, 2510, 39850,317, 1383, 317, 39852,39853,343, 362, 363, 39854,39855,1160, 5105, 317, 317, 5223, 6420, + 2219, 349, 18361,39857,39859,39860,39862,370, 1383, 39863,345, 317, 39868,39870,39871,39874,39876,39878,39900,317, 39902,363, 35585,39861,317, 551, 5055, + 5055, 7785, 2211, 8137, 4984, 39864,39867,427, 4952, 39865,8519, 39866,511, 363, 5561, 5896, 317, 5561, 2236, 39869,4984, 3075, 35155,39872,362, 39873,317, + 2077, 356, 466, 382, 317, 3987, 2402, 317, 39875,317, 2211, 31751,39877,370, 317, 39879,501, 39880,39897,10877,39898,15745,362, 350, 39899,356, 9234, + 1266, 317, 380, 39881,39883,317, 39886,39888,39890,317, 39891,317, 501, 317, 317, 39893,317, 356, 2631, 39882,381, 39884,39885,39887,39889,15216,6593, 39892,400, 356, 317, 349, 2156, 39894,39896,14602,2301, 39895,2156, 596, 317, 464, 363, 5684, 39901,363, 7168, 38851,362, 317, 317, 39904,39907,39908, - 39911,39913,4952, 18905,39914,39915,39905,16594,349, 39906,5890, 37676,7565, 4974, 39909,317, 8695, 7088, 356, 418, 466, 6195, 39910,39912,371, 382, 317, + 39911,39913,4952, 18905,39914,39915,39905,16594,349, 39906,5890, 37676,7565, 4974, 39909,317, 8695, 7088, 356, 418, 466, 6195, 39910,39912,371, 382, 317, 39917,39918,4280, 39922,39925,5575, 39927,18672,39930,39935,2402, 5810, 39936,39937,39938,490, 20908,317, 380, 317, 343, 317, 343, 39919,5223, 6420, 39920, 22792,39921,39923,343, 39924,317, 35155,4564, 38321,39926,317, 38692,350, 317, 317, 6412, 317, 371, 39928,5538, 404, 39929,439, 39931,39932,317, 39933, 39934,390, 6817, 1588, 4965, 363, 490, 33398,2058, 404, 5809, 39941,4965, 466, 39944,362, 2156, 345, 39945,6578, 317, 39942,39943,28239,1347, 404, 17335, 384, 11916,39947,11034,39949,39951,39952,339, 39954,39957,39960,39950,39953,39955,39956,39958,39959,39962,39963,39967,1481, 39968,39971,39972,39973,490, 39978, - 39981,39986,39990,39964,39965,14615,5836, 380, 13110,39966,6352, 13434,371, 39969,39970,39974,30214,39975,39977,35902,39976,5295, 2035, 971, 39979,39980,2631, + 39981,39986,39990,39964,39965,14615,5836, 380, 13110,39966,6352, 13434,371, 39969,39970,39974,30214,39975,39977,35902,39976,5295, 2035, 971, 39979,39980,2631, 371, 384, 39982,1481, 39983,317, 39984,39985,39987,12642,39988,39989,39991,39992,15108,332, 39993,39994,339, 7306, 39996,40001,40003,40005,39997,39998,39999, 40000,7631, 18406,40002,7871, 11749,317, 40004,490, 8311, 40007,20426,40010,6736, 40012,343, 33155,40008,40009,40011,317, 10926,40013,40014,396, 40015,40016, 40027,40043,40052,40066,40081,40092,40103,40108,350, 40115,40116,40132,40176,40217,40219,40223,40241,40268,20592,40277,343, 40278,40279,40283,40017,40018,14806, - 40019,40020,356, 40026,28836,40021,40025,343, 5428, 40022,40023,332, 40024,565, 10246,40028,40029,40032,40033,40036,490, 40037,350, 40038,40040,390, 356, + 40019,40020,356, 40026,28836,40021,40025,343, 5428, 40022,40023,332, 40024,565, 10246,40028,40029,40032,40033,40036,490, 40037,350, 40038,40040,390, 356, 317, 40030,40031,343, 317, 367, 317, 7477, 20496,5105, 381, 317, 317, 13685,40034,362, 40035,40039,317, 471, 317, 40041,40042,317, 40044,40045,40047, - 16017,3079, 40048,543, 40049,40046,5163, 13766,2272, 317, 40050,3007, 40051,40053,40054,40059,40060,3078, 40062,11236,40063,40064,2391, 40065,317, 10592,317, + 16017,3079, 40048,543, 40049,40046,5163, 13766,2272, 317, 40050,3007, 40051,40053,40054,40059,40060,3078, 40062,11236,40063,40064,2391, 40065,317, 10592,317, 2381, 317, 40055,40057,317, 14377,40056,40058,466, 8455, 317, 2551, 317, 40061,3079, 345, 3079, 6036, 363, 605, 428, 428, 381, 5055, 14263,40067,40068, 317, 372, 2134, 40069,40072,2152, 40074,40077,40078,40080,2086, 343, 317, 332, 1999, 350, 28654,317, 40070,40071,1358, 40073,490, 317, 11709,362, 40075, 2193, 343, 40076,2280, 18424,490, 351, 466, 362, 317, 332, 40079,350, 7949, 2035, 40082,2700, 13394,40089,37918,1453, 5991, 40083,33877,350, 551, 40085, - 317, 317, 40084,1347, 5862, 40086,11954,40087,40088,40090,40091,2298, 2298, 351, 40093,40094,40097,20909,10223,40099,404, 317, 40100,2584, 2391, 317, 1345, + 317, 317, 40084,1347, 5862, 40086,11954,40087,40088,40090,40091,2298, 2298, 351, 40093,40094,40097,20909,10223,40099,404, 317, 40100,2584, 2391, 317, 1345, 317, 5223, 2054, 551, 14559,40095,40096,350, 317, 345, 9575, 1999, 40098,343, 5872, 14173,28479,40101,2022, 317, 2022, 40102,317, 317, 363, 4268, 40104, 317, 362, 1358, 40106,390, 40105,40107,490, 6636, 317, 317, 490, 3338, 40109,40110,40114,12931,317, 12931,362, 40111,404, 317, 40112,40113,351, 12931, - 589, 12931,466, 40117,40118,370, 490, 40119,40120,40121,40122,40128,363, 40129,40131,317, 2022, 511, 590, 38793,1325, 1999, 1999, 371, 362, 9649, 381, - 27765,466, 16579,40123,5459, 40126,40127,317, 317, 427, 40124,40125,317, 566, 381, 501, 34334,1345, 16187,1135, 7192, 362, 40130,2272, 4952, 5896, 3023, + 589, 12931,466, 40117,40118,370, 490, 40119,40120,40121,40122,40128,363, 40129,40131,317, 2022, 511, 590, 38793,1325, 1999, 1999, 371, 362, 9649, 381, + 27765,466, 16579,40123,5459, 40126,40127,317, 317, 427, 40124,40125,317, 566, 381, 501, 34334,1345, 16187,1135, 7192, 362, 40130,2272, 4952, 5896, 3023, 362, 363, 6601, 317, 317, 40133,40138,7428, 40145,40151,40152,40158,40165,40168,5862, 741, 345, 558, 6763, 2272, 490, 40134,404, 5205, 1358, 5324, 40135, 12291,370, 317, 7328, 317, 8158, 40136,1526, 40137,596, 317, 10677,317, 40139,40141,551, 35278,16018,40144,40140,317, 40142,40143,6043, 2261, 363, 40146, - 40148,317, 17642,40147,380, 40149,345, 40150,578, 2022, 40153,40155,40157,2067, 40154,351, 2236, 370, 40156,5501, 317, 370, 40159,40161,317, 3079, 345, - 317, 5105, 40160,317, 633, 320, 317, 40162,40163,40164,40166,40167,351, 380, 356, 11612,2571, 7834, 317, 380, 1194, 40169,40172,3999, 20759,317, 370, - 317, 40170,40171,317, 40173,40175,40174,1531, 596, 1347, 632, 4984, 40177,40179,40186,40189,4925, 40193,2022, 40195,40200,40204,27477,40215,40178,2298, 1194, - 5464, 40180,2022, 40183,317, 350, 317, 40181,5626, 40182,40184,40185,40187,343, 317, 40188,40190,40192,2402, 541, 370, 3987, 490, 40191,343, 8214, 3884, - 317, 40194,9574, 317, 317, 40196,40197,40199,380, 381, 3987, 450, 40198,317, 3338, 1453, 5897, 16129,40201,22882,363, 5897, 8125, 40202,16129,40203,2219, + 40148,317, 17642,40147,380, 40149,345, 40150,578, 2022, 40153,40155,40157,2067, 40154,351, 2236, 370, 40156,5501, 317, 370, 40159,40161,317, 3079, 345, + 317, 5105, 40160,317, 633, 320, 317, 40162,40163,40164,40166,40167,351, 380, 356, 11612,2571, 7834, 317, 380, 1194, 40169,40172,3999, 20759,317, 370, + 317, 40170,40171,317, 40173,40175,40174,1531, 596, 1347, 632, 4984, 40177,40179,40186,40189,4925, 40193,2022, 40195,40200,40204,27477,40215,40178,2298, 1194, + 5464, 40180,2022, 40183,317, 350, 317, 40181,5626, 40182,40184,40185,40187,343, 317, 40188,40190,40192,2402, 541, 370, 3987, 490, 40191,343, 8214, 3884, + 317, 40194,9574, 317, 317, 40196,40197,40199,380, 381, 3987, 450, 40198,317, 3338, 1453, 5897, 16129,40201,22882,363, 5897, 8125, 40202,16129,40203,2219, 40205,2247, 40206,40208,5661, 40212,2571, 40213,7428, 317, 317, 40207,637, 1300, 6996, 317, 633, 633, 404, 362, 317, 40209,40210,317, 40211,404, 40214, - 4738, 362, 5037, 317, 40216,1453, 1992, 317, 40218,317, 317, 490, 362, 40220,8178, 317, 40221,40222,5223, 361, 362, 40224,381, 2024, 363, 40226,1358, - 40230,5616, 40231,40237,40238,10626,317, 40225,317, 6546, 466, 317, 40227,40229,15852,384, 5862, 1999, 40228,381, 5223, 6415, 317, 1347, 1347, 317, 404, - 1345, 317, 317, 22791,40232,40233,343, 40236,363, 40234,40235,362, 5538, 539, 466, 1060, 1345, 317, 12057,7711, 351, 379, 501, 40239,511, 343, 317, + 4738, 362, 5037, 317, 40216,1453, 1992, 317, 40218,317, 317, 490, 362, 40220,8178, 317, 40221,40222,5223, 361, 362, 40224,381, 2024, 363, 40226,1358, + 40230,5616, 40231,40237,40238,10626,317, 40225,317, 6546, 466, 317, 40227,40229,15852,384, 5862, 1999, 40228,381, 5223, 6415, 317, 1347, 1347, 317, 404, + 1345, 317, 317, 22791,40232,40233,343, 40236,363, 40234,40235,362, 5538, 539, 466, 1060, 1345, 317, 12057,7711, 351, 379, 501, 40239,511, 343, 317, 317, 40240,317, 40242,40244,40247,40249,14444,40252,40256,7192, 5662, 365, 4984, 40260,40262,40266,24192,565, 10058,317, 2210, 317, 40243,332, 5120, 40245, - 317, 40246,40248,370, 363, 362, 40250,317, 390, 40251,1791, 317, 363, 10073,356, 40253,40254,40255,317, 40257,40259,317, 1160, 40258,317, 317, 590, - 1160, 3573, 5995, 2551, 40261,40263,40264,40265,362, 3999, 317, 10058,1347, 10058,32538,5105, 317, 363, 363, 2156, 514, 40267,14695,10811,363, 345, 356, - 5223, 317, 40269,351, 317, 2022, 6203, 7850, 40275,40276,1347, 2110, 25681,40270,10015,40271,40273,14478,40272,2551, 404, 343, 4980, 40274,404, 5995, 4980, + 317, 40246,40248,370, 363, 362, 40250,317, 390, 40251,1791, 317, 363, 10073,356, 40253,40254,40255,317, 40257,40259,317, 1160, 40258,317, 317, 590, + 1160, 3573, 5995, 2551, 40261,40263,40264,40265,362, 3999, 317, 10058,1347, 10058,32538,5105, 317, 363, 363, 2156, 514, 40267,14695,10811,363, 345, 356, + 5223, 317, 40269,351, 317, 2022, 6203, 7850, 40275,40276,1347, 2110, 25681,40270,10015,40271,40273,14478,40272,2551, 404, 343, 4980, 40274,404, 5995, 4980, 428, 350, 363, 351, 12696,317, 343, 362, 4984, 317, 2024, 4982, 2022, 362, 24938,551, 371, 7456, 40280,350, 40281,40282,404, 351, 5419, 351, 40284, 40285,40287,637, 12902,339, 40289,40288,40290,40292,40291,40294,343, 40295,40296,14746,40298,40299,40300,40301,40306,26076,40311,40360,40361,40367,40368,40371, 40378,40381,40382,40471,40472,40482,40483,2134, 350, 40302,317, 2271, 345, 40304,40305,40303,5898, 5898, 40307,40308,40309,40310,317, 5488, 18587,40312,40316, 883, 317, 4974, 40313,40314,40315,40317,40321,40322,5640, 40318,40319,40320,2271, 2081, 1347, 5447, 404, 22407,40323,40332,40335,40340,40343,40346,40349,40352, - 40353,40357,40324,40325,40327,40326,40328,40329,40330,40331,40333,40334,40336,40337,40338,40339,40341,3361, 40342,40344,23111,40345,7506, 40347,40348,2163, 9832, + 40353,40357,40324,40325,40327,40326,40328,40329,40330,40331,40333,40334,40336,40337,40338,40339,40341,3361, 40342,40344,23111,40345,7506, 40347,40348,2163, 9832, 40350,9298, 40351,525, 8105, 5748, 350, 40354,40355,40356,443, 433, 5752, 40358,40359,390, 6409, 363, 6242, 381, 343, 40362,40365,40363,4591, 40364,40366, 345, 2086, 40369,14571,6546, 40370,343, 404, 5030, 9702, 5483, 5836, 6002, 40372,343, 21968,40377,317, 40373,317, 317, 741, 40374,40375,40376,40379,40380, 404, 427, 332, 356, 317, 40383,40386,40429,40430,40435,40466,40468,40384,40385,317, 40387,317, 317, 40388,40389,40392,17063,40393,40397,40399,40401,10613, - 40404,40407,40414,40422,2330, 40390,40391,317, 317, 339, 5087, 551, 5866, 40394,40395,40396,741, 40398,363, 40400,40402,15754,40403,40405,40406,40408,8682, - 516, 40409,40410,40411,40412,40413,40415,40416,40421,28562,381, 40417,40418,40419,40420,40423,22165,40424,40425,40426,40427,40428,17219,37381,40431,40432,2163, + 40404,40407,40414,40422,2330, 40390,40391,317, 317, 339, 5087, 551, 5866, 40394,40395,40396,741, 40398,363, 40400,40402,15754,40403,40405,40406,40408,8682, + 516, 40409,40410,40411,40412,40413,40415,40416,40421,28562,381, 40417,40418,40419,40420,40423,22165,40424,40425,40426,40427,40428,17219,37381,40431,40432,2163, 40433,9684, 40434,317, 5355, 5492, 40436,30601,40444,2627, 40449,40450,40453,8583, 40437,40441,36150,40438,40439,40440,40442,370, 40443,40445,40446,40447,40448, - 40451,40452,40454,40456,40455,5220, 393, 40457,40461,40418,40458,40459,40460,5437, 40462,40464,345, 40463,5487, 9832, 40465,40467,40469,40470,29785,36317,317, + 40451,40452,40454,40456,40455,5220, 393, 40457,40461,40418,40458,40459,40460,5437, 40462,40464,345, 40463,5487, 9832, 40465,40467,40469,40470,29785,36317,317, 348, 39211,11654,4738, 343, 2503, 2553, 40473,40474,40477,40475,40476,40478,40479,40480,40481,9069, 2163, 12696,343, 2086, 490, 317, 40484,2351, 317, 40486, 40489,40487,40488,40490,40491,40492,40493,40497,40500,40501,40503,40505,40555,40586,40644,40706,40714,40735,40768,40784,40791,40801,40815,134, 135, 42220,42245, - 42268,42274,139, 42504,42538,42547,42568,42582,42583,42586,40494,40495,380, 40496,343, 343, 40498,11073,40499,40502,40504,3009, 999, 40506,40507,40514,490, - 21355,332, 363, 40516,40518,40540,40547,40548,40550,40551,40553,40554,317, 38174,7566, 40508,23696,40509,2280, 332, 9422, 40511,40510,7385, 40512,40513,2272, - 6402, 2322, 332, 3751, 40515,40517,5381, 2809, 40519,40522,535, 15334,40524,40525,40527,511, 40528,40535,40537,40520,40521,40523,370, 356, 6326, 1446, 1588, - 40526,40529,40530,40531,40532,40533,40534,427, 4447, 40536,40538,40539,317, 5217, 2272, 40541,590, 40542,332, 8594, 40543,6486, 40545,34925,40546,40544,332, + 42268,42274,139, 42504,42538,42547,42568,42582,42583,42586,40494,40495,380, 40496,343, 343, 40498,11073,40499,40502,40504,3009, 999, 40506,40507,40514,490, + 21355,332, 363, 40516,40518,40540,40547,40548,40550,40551,40553,40554,317, 38174,7566, 40508,23696,40509,2280, 332, 9422, 40511,40510,7385, 40512,40513,2272, + 6402, 2322, 332, 3751, 40515,40517,5381, 2809, 40519,40522,535, 15334,40524,40525,40527,511, 40528,40535,40537,40520,40521,40523,370, 356, 6326, 1446, 1588, + 40526,40529,40530,40531,40532,40533,40534,427, 4447, 40536,40538,40539,317, 5217, 2272, 40541,590, 40542,332, 8594, 40543,6486, 40545,34925,40546,40544,332, 7035, 2272, 7386, 5890, 317, 317, 12780,40549,18706,7386, 3751, 620, 317, 317, 40552,40556,40558,40561,2533, 40562,343, 40572,343, 317, 5120, 40575,40576, 7473, 40583,40585,40557,390, 362, 343, 12869,40559,40560,29449,29449,40563,40565,317, 317, 40564,317, 8214, 40566,490, 5037, 40567,40568,40569,40570,40571, - 317, 40573,1078, 490, 40574,637, 949, 14835,596, 40577,339, 316, 40578,40580,40579,427, 40581,40582,317, 5656, 365, 40584,382, 2078, 621, 40587,5742, - 40593,40594,40614,40628,40630,5270, 1060, 40631,339, 343, 40642,40643,317, 363, 317, 363, 40588,40591,317, 40592,40589,40590,27218,317, 357, 370, 345, - 351, 6207, 40595,40598,317, 40602,40603,40605,40609,40612,2391, 526, 317, 2081, 40613,16278,40596,316, 40597,351, 10878,5737, 578, 40599,40601,40600,428, - 21115,40604,345, 393, 40606,40607,40608,1033, 339, 40610,40611,637, 1160, 320, 1011, 633, 11034,2272, 542, 40615,12598,40616,40621,8023, 5683, 332, 6834, + 317, 40573,1078, 490, 40574,637, 949, 14835,596, 40577,339, 316, 40578,40580,40579,427, 40581,40582,317, 5656, 365, 40584,382, 2078, 621, 40587,5742, + 40593,40594,40614,40628,40630,5270, 1060, 40631,339, 343, 40642,40643,317, 363, 317, 363, 40588,40591,317, 40592,40589,40590,27218,317, 357, 370, 345, + 351, 6207, 40595,40598,317, 40602,40603,40605,40609,40612,2391, 526, 317, 2081, 40613,16278,40596,316, 40597,351, 10878,5737, 578, 40599,40601,40600,428, + 21115,40604,345, 393, 40606,40607,40608,1033, 339, 40610,40611,637, 1160, 320, 1011, 633, 11034,2272, 542, 40615,12598,40616,40621,8023, 5683, 332, 6834, 332, 6900, 40617,40620,40618,7874, 343, 40619,40622,40623,40624,40625,40627,40626,40629,382, 24841,9624, 317, 317, 317, 40632,40637,339, 40633,317, 40634, - 20062,40636,40635,40638,40639,40640,40641,10283,40645,40646,40653,317, 40670,642, 40683,40685,40690,40691,345, 40703,9012, 19923,40704,40705,332, 5241, 317, - 317, 14695,40647,40648,40649,40650,40651,40652,642, 40654,2326, 13376,40658,40661,40666,317, 343, 40655,317, 5226, 40656,370, 317, 40657,7888, 356, 317, + 20062,40636,40635,40638,40639,40640,40641,10283,40645,40646,40653,317, 40670,642, 40683,40685,40690,40691,345, 40703,9012, 19923,40704,40705,332, 5241, 317, + 317, 14695,40647,40648,40649,40650,40651,40652,642, 40654,2326, 13376,40658,40661,40666,317, 343, 40655,317, 5226, 40656,370, 317, 40657,7888, 356, 317, 7242, 317, 2322, 40659,40660,40662,40663,317, 9313, 40664,5201, 40665,2184, 410, 6425, 8020, 40667,40668,40669,20086,2156, 317, 1999, 2036, 40671,40673,40682, 40672,370, 10922,40674,40675,40681,40676,40677,40678,40679,40680,7689, 401, 317, 317, 339, 317, 40684,34727,317, 7911, 2571, 317, 15778,40686,40687,40688, 40689,40692,40696,40698,40693,40695,19922,317, 40694,351, 14419,40697,40699,12456,40700,332, 40701,40702,12060,1189, 3284, 5570, 40707,345, 343, 40708,40711, - 40713,396, 362, 7796, 5890, 40709,40710,332, 317, 40712,40715,367, 40717,40719,40720,40722,35232,40723,365, 40728,317, 40730,40732,40733,40716,40718,1999, + 40713,396, 362, 7796, 5890, 40709,40710,332, 317, 40712,40715,367, 40717,40719,40720,40722,35232,40723,365, 40728,317, 40730,40732,40733,40716,40718,1999, 345, 4952, 317, 317, 40721,21013,4617, 380, 7753, 40724,40725,381, 40726,40727,40729,317, 40731,32416,6763, 40734,40736,40738,393, 12731,40742,381, 40744, 40745,40747,40748,40757,40761,40763,40765,343, 40737,6851, 2291, 380, 40739,317, 317, 40740,40741,40743,40746,332, 5159, 317, 17719,40749,40753,23267,40754, 40750,8828, 40751,25086,40752,317, 3529, 345, 4591, 365, 40755,5836, 40756,5447, 9522, 4591, 5190, 317, 40758,317, 40759,40760,10131,4101, 1950, 40762,40764, 40766,2035, 317, 590, 40767,590, 1347, 2070, 40769,343, 40774,40779,440, 351, 40782,40783,40770,40771,317, 40772,40773,40775,343, 5084, 40776,40777,23172, 40778,40780,40781,317, 40785,2997, 490, 490, 345, 396, 40786,332, 339, 345, 8926, 40790,40785,317, 40787,317, 40788,317, 40789,40792,40793,40794,11418, - 40799,29424,317, 317, 40795,40796,40797,40798,40800,40802,40804,25768,40808,40811,332, 40812,350, 363, 489, 2004, 34832,40803,317, 10894,40805,490, 6834, - 40807,23079,1325, 40806,1588, 2322, 40809,40810,6817, 317, 40813,40814,40816,40817,332, 40826,40827,40829,40830,17321,40832,40833,40840,40842,40874,40876,5793, - 40898,40899,596, 40903,13397,362, 40818,2537, 317, 1109, 40822,1020, 490, 40824,40819,40820,40821,365, 490, 40823,40825,317, 40828,2035, 363, 343, 317, + 40799,29424,317, 317, 40795,40796,40797,40798,40800,40802,40804,25768,40808,40811,332, 40812,350, 363, 489, 2004, 34832,40803,317, 10894,40805,490, 6834, + 40807,23079,1325, 40806,1588, 2322, 40809,40810,6817, 317, 40813,40814,40816,40817,332, 40826,40827,40829,40830,17321,40832,40833,40840,40842,40874,40876,5793, + 40898,40899,596, 40903,13397,362, 40818,2537, 317, 1109, 40822,1020, 490, 40824,40819,40820,40821,365, 490, 40823,40825,317, 40828,2035, 363, 343, 317, 317, 427, 317, 551, 40831,40834,317, 40835,23328,362, 490, 40836,3243, 427, 8484, 317, 40837,633, 40838,40839,1428, 589, 343, 479, 3621, 1881, 14377, 40841,490, 2022, 317, 40843,40845,40853,5640, 30793,40859,9425, 40860,8023, 40871,317, 317, 317, 40844,40846,317, 40852,40847,40849,40848,373, 40850,40851, - 40854,40855,345, 317, 40856,40857,10956,1160, 2163, 40858,520, 5295, 40861,40867,5890, 40862,40863,40864,40865,5447, 40866,351, 40868,448, 40869,5515, 343, + 40854,40855,345, 317, 40856,40857,10956,1160, 2163, 40858,520, 5295, 40861,40867,5890, 40862,40863,40864,40865,5447, 40866,351, 40868,448, 40869,5515, 343, 40870,30347,317, 5727, 2035, 40872,40873,5616, 741, 40875,351, 40877,2142, 8333, 1020, 40878,40879,633, 40880,40881,2584, 2391, 558, 40883,40884,381, 40885, - 2948, 40887,40889,40891,40893,6255, 5942, 40894,40882,365, 3039, 356, 40886,533, 40888,351, 5942, 427, 400, 40890,8999, 2277, 39040,37126,40892,427, 316, - 40895,40896,317, 40897,6996, 317, 1267, 651, 40900,1459, 40902,40901,633, 2227, 381, 343, 8948, 1428, 2054, 317, 40904,27286,2573, 40905,317, 1220, 1209, + 2948, 40887,40889,40891,40893,6255, 5942, 40894,40882,365, 3039, 356, 40886,533, 40888,351, 5942, 427, 400, 40890,8999, 2277, 39040,37126,40892,427, 316, + 40895,40896,317, 40897,6996, 317, 1267, 651, 40900,1459, 40902,40901,633, 2227, 381, 343, 8948, 1428, 2054, 317, 40904,27286,2573, 40905,317, 1220, 1209, 40536,40906,40920,535, 40930,40931,40933,40934,40935,40937,40944,40948,40950,41014,41016,41132,490, 41133,345, 27477,40907,1109, 40908,40914,2279, 40915,40916, - 5120, 317, 317, 40917,317, 6901, 40909,40910,317, 317, 317, 317, 1345, 317, 40911,40912,40913,317, 466, 373, 370, 5554, 317, 317, 3884, 317, 332, - 15087,574, 317, 2110, 40918,40919,363, 40921,40922,40925,40926,40927,40929,10592,39059,40923,5337, 14790,365, 40924,1526, 351, 3375, 501, 1526, 2003, 6195, + 5120, 317, 317, 40917,317, 6901, 40909,40910,317, 317, 317, 317, 1345, 317, 40911,40912,40913,317, 466, 373, 370, 5554, 317, 317, 3884, 317, 332, + 15087,574, 317, 2110, 40918,40919,363, 40921,40922,40925,40926,40927,40929,10592,39059,40923,5337, 14790,365, 40924,1526, 351, 3375, 501, 1526, 2003, 6195, 40928,14150,1325, 8863, 317, 16298,9581, 2271, 365, 40932,24036,2715, 2035, 578, 558, 1588, 40936,1383, 574, 343, 2590, 2680, 40938,317, 343, 40940,40942, 30346,40939,40941,40943,40945,363, 40946,40947,40949,351, 390, 3522, 317, 40951,40957,40966,40969,40979,40952,40954,40955,40953,2369, 2134, 8700, 40956,40958, - 40961,317, 30743,40964,40965,40959,40960,40962,40963,370, 14236,362, 20994,40967,40968,2369, 7070, 40970,1479, 5488, 40974,24938,40971,40972,317, 40973,370, + 40961,317, 30743,40964,40965,40959,40960,40962,40963,370, 14236,362, 20994,40967,40968,2369, 7070, 40970,1479, 5488, 40974,24938,40971,40972,317, 40973,370, 18587,21700,9422, 40975,40976,40977,40978,317, 1526, 370, 1526, 40980,24938,317, 40981,40982,5201, 5488, 40983,40990,40995,40998,11272,41007,41013,40984,40985, - 40986,40987,40988,40989,40991,40992,40993,40994,40996,40997,40999,41000,41001,41002,41003,41004,41005,41006,41008,41009,41010,41011,41012,41015,490, 3688, 332, - 41017,41032,433, 41068,41071,41081,41099,4980, 41126,41018,41020,41021,41023,41026,41028,41019,356, 379, 466, 351, 317, 4944, 41022,466, 317, 3854, 317, + 40986,40987,40988,40989,40991,40992,40993,40994,40996,40997,40999,41000,41001,41002,41003,41004,41005,41006,41008,41009,41010,41011,41012,41015,490, 3688, 332, + 41017,41032,433, 41068,41071,41081,41099,4980, 41126,41018,41020,41021,41023,41026,41028,41019,356, 379, 466, 351, 317, 4944, 41022,466, 317, 3854, 317, 317, 2322, 41024,356, 41025,317, 21661,382, 41027,410, 317, 6307, 41029,41030,41031,41033,41035,41037,41039,41040,41042,41066,41034,41036,5708, 5447, 41038, - 5399, 382, 511, 41041,41043,41045,41048,41052,41057,41060,41064,6108, 41044,9383, 12120,41046,41047,41049,21355,41050,41051,5262, 370, 41053,1526, 6387, 427, + 5399, 382, 511, 41041,41043,41045,41048,41052,41057,41060,41064,6108, 41044,9383, 12120,41046,41047,41049,21355,41050,41051,5262, 370, 41053,1526, 6387, 427, 41054,317, 41055,317, 41056,5366, 24938,41058,41059,41061,41062,41063,317, 5446, 41065,41067,41069,4591, 41070,41072,41075,41078,41080,2184, 24938,41073,41059, 41074,6055, 356, 466, 317, 41076,41077,41079,5464, 5501, 5323, 5441, 5717, 5226, 2627, 41082,41089,6265, 41095,41097,41083,41084,41086,10422,466, 317, 41085, 41087,5226, 343, 41088,5447, 41090,41091,41094,41092,41093,41096,41098,41100,41106,41115,41118,20960,41101,41102,41103,41104,41105,8722, 41107,41110,490, 41108, - 41109,373, 5492, 12849,41111,5464, 41112,3854, 382, 41113,5550, 41114,410, 10347,317, 41116,7988, 5010, 41117,24938,41119,41120,41123,8658, 41121,41122,5675, + 41109,373, 5492, 12849,41111,5464, 41112,3854, 382, 41113,5550, 41114,410, 10347,317, 41116,7988, 5010, 41117,24938,41119,41120,41123,8658, 41121,41122,5675, 41124,382, 41125,21690,9124, 466, 6265, 41127,5459, 41131,7888, 41128,1347, 41129,41130,363, 317, 343, 317, 2254, 2462, 41134,41189,41198,41325,41450,41499, - 41585,41630,41658,41670,41680,41693,41696,41698,41721,41744,41752,41759,41761,136, 42163,42171,42214,345, 42217,42218,41135,41138,41149,41156,10898,317, 365, + 41585,41630,41658,41670,41680,41693,41696,41698,41721,41744,41752,41759,41761,136, 42163,42171,42214,345, 42217,42218,41135,41138,41149,41156,10898,317, 365, 41157,41160,41162,41170,41175,41176,41179,2631, 317, 41136,2036, 5459, 41137,41139,332, 41146,41140,41143,41141,41142,41144,41145,5201, 5550, 41147,363, 41148, 6434, 317, 397, 41150,41152,41153,41151,41154,41155,41158,41159,4280, 317, 41161,490, 41163,41164,41166,41165,41167,41168,41169,317, 41171,41172,41173,41174, - 41177,41178,26388,41180,41184,41186,41181,41182,41183,317, 7765, 41185,41187,41188,41190,41194,41196,22992,41197,317, 41191,317, 41192,41193,41195,551, 370, + 41177,41178,26388,41180,41184,41186,41181,41182,41183,317, 7765, 41185,41187,41188,41190,41194,41196,22992,41197,317, 41191,317, 41192,41193,41195,551, 370, 363, 439, 317, 11073,41199,41214,41220,41221,41234,41242,41305,41319,1459, 41200,41203,41204,41209,1358, 41201,41202,317, 28546,6425, 41205,373, 41206,41207, 41208,41210,41211,41212,41213,1325, 5054, 317, 41215,5225, 41217,41218,41216,5492, 33165,21579,41219,5665, 25237,363, 41222,41226,466, 41231,7337, 41233,21349, - 41223,41224,2156, 41225,5476, 317, 41227,41228,41229,41230,1325, 404, 351, 41232,356, 5262, 2510, 363, 10395,41235,41237,41236,41238,41240,41239,466, 317, + 41223,41224,2156, 41225,5476, 317, 41227,41228,41229,41230,1325, 404, 351, 41232,356, 5262, 2510, 363, 10395,41235,41237,41236,41238,41240,41239,466, 317, 2007, 317, 41241,41243,41245,41247,41267,41295,41244,41246,1347, 466, 41248,41252,41266,41249,41250,41251,41253,41257,41258,41262,24938,41254,41255,41256,17943, 343, 41259,41260,41261,41263,41264,41059,41265,41268,41272,41274,41284,41289,41269,41271,41270,41273,41275,41279,41202,41282,41276,41277,41278,41280,41281,41283, 5366, 41285,41286,41287,41288,41290,41291,41292,41293,41294,41296,41301,41304,41297,41298,41299,433, 41300,5447, 5987, 1033, 41302,41303,41046,41306,41315,41307, 41308,41311,41309,10703,41310,41312,41313,41314,5701, 356, 317, 41316,41317,41318,41320,15351,41321,41322,41324,22121,6050, 41323,410, 5174, 7465, 41326,41329, 41369,41412,41429,41434,41449,41327,363, 317, 41328,41330,41332,41333,41334,41340,21816,41344,41347,41354,41357,41364,7858, 41331,5968, 28562,317, 41335,41265, - 41338,41336,41337,41339,410, 6249, 41341,373, 41342,41343,41345,5365, 356, 466, 41346,41348,41349,41350,2218, 41351,24884,41352,7098, 41353,412, 370, 317, - 41355,41356,41358,41361,41359,41360,41362,41363,41365,41366,41367,41368,41370,41374,41377,41378,41381,1347, 41386,41387,427, 41405,6228, 41371,10149,41372,317, + 41338,41336,41337,41339,410, 6249, 41341,373, 41342,41343,41345,5365, 356, 466, 41346,41348,41349,41350,2218, 41351,24884,41352,7098, 41353,412, 370, 317, + 41355,41356,41358,41361,41359,41360,41362,41363,41365,41366,41367,41368,41370,41374,41377,41378,41381,1347, 41386,41387,427, 41405,6228, 41371,10149,41372,317, 317, 41373,351, 2381, 1160, 317, 317, 365, 32397,41375,345, 41376,345, 410, 356, 5399, 15435,317, 317, 2609, 41379,41380,41382,332, 41384,1160, 41383, 5225, 41385,5200, 381, 5226, 317, 41302,41388,41394,41398,343, 41389,41390,41391,41392,41393,41395,9141, 41397,41396,41399,41400,381, 41401,41402,41403,41404, - 41406,41407,26388,41408,41409,41410,5226, 41411,370, 317, 8448, 370, 1526, 41413,41415,41420,41421,41422,41425,343, 7149, 41414,41416,41417,41418,41419,317, - 40626,41423,41424,41426,41427,317, 41428,41430,317, 365, 41431,41432,41433,41435,41439,3688, 41441,5653, 41442,41436,41437,41438,5675, 21157,41440,523, 9109, + 41406,41407,26388,41408,41409,41410,5226, 41411,370, 317, 8448, 370, 1526, 41413,41415,41420,41421,41422,41425,343, 7149, 41414,41416,41417,41418,41419,317, + 40626,41423,41424,41426,41427,317, 41428,41430,317, 365, 41431,41432,41433,41435,41439,3688, 41441,5653, 41442,41436,41437,41438,5675, 21157,41440,523, 9109, 21036,2510, 41443,41444,41445,317, 41446,1347, 4591, 41447,41448,370, 27467,7888, 620, 565, 41451,26388,41452,41454,365, 41463,41465,41468,41472,41474,41479, - 41480,41484,317, 41453,41455,410, 41456,41460,41457,41458,41459,433, 41461,41462,8436, 41464,317, 41466,41467,41469,17943,41470,41471,410, 596, 317, 2163, + 41480,41484,317, 41453,41455,410, 41456,41460,41457,41458,41459,433, 41461,41462,8436, 41464,317, 41466,41467,41469,17943,41470,41471,410, 596, 317, 2163, 41473,29773,41475,363, 490, 39074,41476,41477,41478,41481,41482,41483,1009, 41485,41486,41489,41490,41496,41487,41488,41491,41495,41492,41493,41494,41497,41498, 41500,41509,41520,41536,41554,41566,41581,381, 41501,41503,41504,17228,41508,41502,41142,370, 41505,317, 41506,41507,15373,18699,317, 2260, 343, 332, 41059, 41510,41513,41519,41511,356, 41512,317, 382, 7837, 343, 20356,41514,41516,41517,317, 41518,41515,14145,466, 41521,41523,17477,41524,41527,41534,317, 41522, - 33060,5570, 5487, 41525,41526,404, 350, 41528,41529,41530,41533,427, 317, 370, 41531,41532,41535,448, 397, 41537,41542,41544,41546,41550,41538,41540,5447, + 33060,5570, 5487, 41525,41526,404, 350, 41528,41529,41530,41533,427, 317, 370, 41531,41532,41535,448, 397, 41537,41542,41544,41546,41550,41538,41540,5447, 41539,410, 1325, 41541,382, 26508,41543,26388,41545,471, 41547,1347, 41548,41549,41551,317, 41552,41553,498, 8011, 12204,466, 3599, 426, 41555,41556,41559, - 4476, 41565,26518,41557,41558,41560,41561,10422,41564,317, 18675,4268, 41562,41563,345, 9852, 343, 28503,2108, 41567,41575,41577,41568,25230,1526, 41569,5872, + 4476, 41565,26518,41557,41558,41560,41561,10422,41564,317, 18675,4268, 41562,41563,345, 9852, 343, 28503,2108, 41567,41575,41577,41568,25230,1526, 41569,5872, 5167, 41570,41571,41572,41573,41574,41576,41578,41579,41580,466, 41582,5502, 41583,41584,41586,350, 41591,41600,41601,41604,41605,41611,317, 41620,41625,41628, 41587,41588,317, 1347, 5866, 41589,41590,41592,20324,41595,7716, 41596,41598,20360,4949, 41593,41594,41597,7327, 351, 7834, 332, 41599,427, 427, 554, 41602, - 41603,370, 24680,404, 6089, 41606,41610,1347, 41607,41608,41609,317, 317, 11915,41612,41617,41618,41619,427, 41613,41614,6308, 6769, 317, 8959, 41615,1347, + 41603,370, 24680,404, 6089, 41606,41610,1347, 41607,41608,41609,317, 317, 11915,41612,41617,41618,41619,427, 41613,41614,6308, 6769, 317, 8959, 41615,1347, 41616,574, 4040, 20989,1347, 41621,460, 41623,41622,41624,351, 41626,41627,41629,380, 8051, 41631,41640,317, 41645,41649,41654,41632,29766,41633,41634,41635, 356, 466, 317, 41636,5226, 41637,41638,41639,381, 41641,41642,41643,41644,5708, 356, 466, 2510, 317, 41646,41647,41648,356, 5113, 22021,317, 41650,41653, - 393, 41651,41652,6831, 41655,41656,41657,317, 397, 317, 41659,9257, 41661,382, 41663,317, 41665,41660,41662,433, 24938,41664,1108, 397, 41666,41667,317, - 41668,25177,41669,370, 317, 427, 18587,41671,41674,41672,41673,410, 356, 5847, 2510, 317, 41675,41676,41678,5553, 317, 5447, 41677,317, 345, 382, 4591, - 41679,41681,37393,41688,539, 41689,41691,16579,3987, 41682,41683,41684,41685,41686,41687,16768,382, 41690,466, 41692,41694,4268, 2272, 41695,356, 356, 1347, + 393, 41651,41652,6831, 41655,41656,41657,317, 397, 317, 41659,9257, 41661,382, 41663,317, 41665,41660,41662,433, 24938,41664,1108, 397, 41666,41667,317, + 41668,25177,41669,370, 317, 427, 18587,41671,41674,41672,41673,410, 356, 5847, 2510, 317, 41675,41676,41678,5553, 317, 5447, 41677,317, 345, 382, 4591, + 41679,41681,37393,41688,539, 41689,41691,16579,3987, 41682,41683,41684,41685,41686,41687,16768,382, 41690,466, 41692,41694,4268, 2272, 41695,356, 356, 1347, 41697,363, 317, 30331,2156, 41699,41703,41705,33875,41708,41716,41717,41700,41702,5550, 41701,2381, 41704,317, 9590, 381, 5095, 10878,41706,317, 5005, 41707, 317, 41709,41713,317, 41710,5727, 41711,7098, 41712,41714,41715,1325, 5847, 2510, 41718,41720,41719,317, 41722,41727,365, 590, 41728,41736,41738,41740,41741, 41723,41725,41724,9917, 343, 41726,6088, 427, 41729,41732,41730,41731,373, 3031, 41733,41734,41735,28544,41737,12670,41739,41742,41743,41745,41746,41747,41748, @@ -9060,219 +9055,219 @@ static const unsigned int ChildLocs[185261] = 5447, 466, 363, 41812,41821,41822,41834,373, 41813,18138,41814,41818,1347, 365, 1526, 41815,5399, 5365, 22945,10422,466, 5399, 41816,7704, 41817,2156, 41819, 41820,21188,370, 21830,11777,41823,41826,41824,41825,21419,317, 433, 41827,41828,20333,41829,317, 382, 41830,41831,41832,317, 41833,21506,370, 41835,41836, 41838,41837,356, 22295,2510, 317, 41839,41840,41841,41842,356, 317, 41843,5226, 41844,370, 317, 41846,41853,41859,41861,41847,41851,41848,41849,41850,41852, - 41854,40960,41855,41856,41857,41858,41860,363, 5273, 2001, 21832,41862,9124, 21969,466, 41863,41866,41864,41865,41867,41868,41869,41870,380, 41871,137, 317, + 41854,40960,41855,41856,41857,41858,41860,363, 5273, 2001, 21832,41862,9124, 21969,466, 41863,41866,41864,41865,41867,41868,41869,41870,380, 41871,137, 317, 42111,42113,1212, 42117,42123,42157,6598, 381, 11339,2156, 1020, 41872,317, 41873,41877,41890,138, 42108,2510, 41874,3853, 41875,41876,317, 373, 5477, 21392, 8418, 1347, 1345, 317, 33340,41878,2631, 41879,41885,41880,41881,41882,41883,41884,5343, 370, 317, 41886,17357,41887,6270, 41888,22724,41889,370, 5241, 41891, 41892,41896,2369, 356, 466, 317, 5324, 41893,41894,5201, 5550, 41895,2184, 5488, 5464, 41897,370, 317, 41898,41899,21661,356, 317, 317, 41900,41905,41909, - 41939,41959,41963,41977,41985,41986,41988,41999,42015,42033,42038,42055,42071,42081,42086,42089,42103,42106,41901,22524,41904,433, 41902,356, 41903,317, 382, + 41939,41959,41963,41977,41985,41986,41988,41999,42015,42033,42038,42055,42071,42081,42086,42089,42103,42106,41901,22524,41904,433, 41902,356, 41903,317, 382, 5055, 41130,2193, 41906,41907,5337, 8643, 41908,41910,41913,41914,397, 41919,41935,41936,41911,41912,370, 5536, 5492, 30713,30562,17358,41915,41916,41917,41918, - 466, 41483,317, 317, 41920,41924,41926,2298, 2128, 41934,41921,41923,41922,41925,24578,41927,41931,41928,41929,41930,34977,5113, 317, 41932,41933,397, 393, + 466, 41483,317, 317, 41920,41924,41926,2298, 2128, 41934,41921,41923,41922,41925,24578,41927,41931,41928,41929,41930,34977,5113, 317, 41932,41933,397, 393, 41937,317, 41938,41940,41950,21079,41941,41944,41942,41943,41945,41948,41946,41947,41949,25396,41951,41954,41952,41953,41955,41956,41957,41958,41960,317, 41961, 356, 41962,317, 41964,41966,41973,41965,545, 5447, 15814,41967,41968,466, 41969,317, 5709, 317, 41970,317, 41971,41972,351, 8470, 41974,41975,41976,30721, - 41978,22737,41981,20394,41979,41980,41982,41983,41984,5570, 317, 2510, 41987,41989,41990,41992,41995,5752, 5441, 501, 41991,2419, 965, 5174, 41993,41994,2291, + 41978,22737,41981,20394,41979,41980,41982,41983,41984,5570, 317, 2510, 41987,41989,41990,41992,41995,5752, 5441, 501, 41991,2419, 965, 5174, 41993,41994,2291, 1526, 41996,350, 501, 5363, 41997,41998,42000,42004,42008,42011,42001,42002,42003,317, 42005,4268, 7399, 42006,42007,345, 5201, 2156, 42009,42010,17358,41155, 1526, 410, 29586,433, 42012,42013,42014,42016,42031,11612,3854, 9139, 458, 42017,42019,42027,42018,370, 317, 42020,42021,42022,42023,42024,316, 1347, 42025, - 370, 317, 42026,7888, 5225, 317, 317, 42028,42029,42030,2271, 317, 345, 1160, 42032,42034,42037,42035,42036,42039,42041,42045,42049,42040,42042,42043,317, + 370, 317, 42026,7888, 5225, 317, 317, 42028,42029,42030,2271, 317, 345, 1160, 42032,42034,42037,42035,42036,42039,42041,42045,42049,42040,42042,42043,317, 42044,42046,1526, 42047,42048,42050,42052,42051,5553, 10422,5395, 317, 42053,42054,42056,42057,42067,42068,498, 574, 317, 42058,42059,459, 741, 42060,42066, - 42061,356, 42062,42063,42064,42065,42069,42070,356, 5113, 317, 345, 42072,42076,42077,42079,42073,4045, 42074,42075,22063,317, 5709, 42078,10069,9141, 6967, + 42061,356, 42062,42063,42064,42065,42069,42070,356, 5113, 317, 345, 42072,42076,42077,42079,42073,4045, 42074,42075,22063,317, 5709, 42078,10069,9141, 6967, 18415,42080,596, 498, 42082,2322, 42083,42084,433, 6394, 2039, 6330, 42085,42087,11028,42088,42090,42091,42100,1347, 13944,42092,42097,5447, 466, 42093,42094, 42095,42096,380, 18577,317, 42098,42099,42101,42102,29284,466, 317, 351, 42104,675, 42105,42107,42109,574, 42110,42112,476, 439, 6638, 565, 42114,42115, 29123,370, 42116,381, 42118,5488, 42121,42119,42120,42122,42124,42143,42144,42146,42156,42125,42128,42130,42134,10406,32292,42137,42139,42141,42126,42127,30712, - 42129,41935,24938,42131,42132,42133,10406,381, 42135,42136,6265, 3031, 42138,2413, 42140,18154,42142,2809, 41144,2178, 11860,42145,42147,2211, 1347, 42150,4954, + 42129,41935,24938,42131,42132,42133,10406,381, 42135,42136,6265, 3031, 42138,2413, 42140,18154,42142,2809, 41144,2178, 11860,42145,42147,2211, 1347, 42150,4954, 42153,42148,42149,5447, 466, 21670,42151,42152,42154,42155,5226, 1526, 8139, 5554, 5095, 42158,42159,42160,42161,5550, 42162,8436, 317, 381, 42164,42167,42168, - 883, 42169,42165,42166,42170,42172,42179,42196,42207,42212,8139, 42173,42176,5554, 42174,24938,42175,30461,5464, 397, 317, 317, 42177,42178,6020, 5932, 4788, + 883, 42169,42165,42166,42170,42172,42179,42196,42207,42212,8139, 42173,42176,5554, 42174,24938,42175,30461,5464, 397, 317, 317, 42177,42178,6020, 5932, 4788, 42180,42184,42190,41280,42181,356, 10153,42182,317, 42183,17897,317, 317, 42185,36225,42187,42188,8546, 42186,5581, 5477, 5054, 317, 42189,21157,317, 11870, 317, 1347, 42191,317, 356, 42192,5399, 2510, 317, 42193,382, 5761, 42194,5226, 42195,5447, 22295,22021,42197,42198,42200,41202,42203,42206,42199,42201,42202, 42204,42205,5458, 5634, 21690,25756,466, 332, 6425, 5709, 5717, 42208,42209,26676,42210,15531,42211,42213,42215,2063, 42216,9214, 42219,10364,42221,317, 42225, - 373, 42227,42229,42230,42239,42240,42241,19979,345, 42242,42244,9185, 42222,42223,317, 345, 42224,42226,343, 343, 343, 42228,317, 317, 317, 341, 345, + 373, 42227,42229,42230,42239,42240,42241,19979,345, 42242,42244,9185, 42222,42223,317, 345, 42224,42226,343, 343, 343, 42228,317, 317, 317, 341, 345, 6551, 365, 317, 42231,42233,42234,317, 42232,5616, 317, 5488, 10674,42235,42236,42237,42238,696, 317, 42243,317, 39819,42246,339, 42247,42248,34041,42252, - 42261,42263,1044, 42267,1347, 8172, 42249,6188, 42250,42251,42253,371, 1347, 317, 42260,317, 42254,42255,42256,42257,42258,42259,42262,317, 2053, 42264,9521, + 42261,42263,1044, 42267,1347, 8172, 42249,6188, 42250,42251,42253,371, 1347, 317, 42260,317, 42254,42255,42256,42257,42258,42259,42262,317, 2053, 42264,9521, 42265,42266,42269,433, 42270,42272,42271,965, 2086, 42273,42275,42281,554, 42282,42289,42290,42291,42309,42311,42312,42313,42314,42335,42386,42387,42388,42389, 35267,2035, 10317,487, 317, 42276,488, 42277,317, 8513, 42278,36628,10320,42280,343, 490, 635, 10373,3529, 42279,22636,42283,42286,42288,404, 317, 42284, 42285,42287,1160, 363, 7035, 42292,42293,371, 42295,317, 28314,5266, 42300,363, 42304,42306,42294,13995,741, 42296,42297,42298,42299,42301,332, 490, 42302, - 651, 42303,345, 42305,490, 6228, 649, 317, 8301, 490, 355, 10149,42307,8205, 42308,356, 42310,317, 2219, 550, 1481, 42315,42316,42332,1481, 11073,2962, + 651, 42303,345, 42305,490, 6228, 649, 317, 8301, 490, 355, 10149,42307,8205, 42308,356, 42310,317, 2219, 550, 1481, 42315,42316,42332,1481, 11073,2962, 42317,42318,42319,356, 42322,12151,42324,42326,5379, 42327,14883,14768,42329,37456,42331,317, 406, 551, 9914, 395, 397, 7499, 42320,2146, 42321,371, 42323, 355, 2261, 42325,7223, 345, 382, 42328,363, 553, 4738, 436, 5942, 349, 42330,7035, 2156, 371, 42333,42334,42336,42343,42380,42385,42337,42340,37573,42338, - 42339,514, 5536, 42341,42342,42344,42348,42354,42355,42360,42363,42368,42376,42345,42346,42347,42349,42353,42350,42351,42352,42356,42357,42358,42359,5200, 370, - 317, 42361,42362,41489,42364,42367,42365,42366,42369,42372,42370,42371,410, 9482, 22546,42373,42374,42375,42377,41035,42378,6266, 42379,42381,42383,42382,373, + 42339,514, 5536, 42341,42342,42344,42348,42354,42355,42360,42363,42368,42376,42345,42346,42347,42349,42353,42350,42351,42352,42356,42357,42358,42359,5200, 370, + 317, 42361,42362,41489,42364,42367,42365,42366,42369,42372,42370,42371,410, 9482, 22546,42373,42374,42375,42377,41035,42378,6266, 42379,42381,42383,42382,373, 5097, 42384,5457, 381, 23268,355, 371, 17513,317, 883, 363, 42390,42391,42392,42394,42397,42400,42414,42416,42419,42420,42432,42433,42435,42442,42446,42449, - 42459,42464,42465,8756, 42485,42490,42496,42503,42393,42395,42396,42398,42399,42401,42403,42406,42408,5711, 317, 42409,42410,42412,596, 42413,1992, 317, 317, + 42459,42464,42465,8756, 42485,42490,42496,42503,42393,42395,42396,42398,42399,42401,42403,42406,42408,5711, 317, 42409,42410,42412,596, 42413,1992, 317, 317, 3751, 2110, 490, 42402,317, 317, 1347, 5300, 42404,590, 42405,6831, 2551, 42407,1131, 363, 6901, 490, 42411,317, 1044, 6046, 363, 550, 317, 571, 42415, 317, 6593, 317, 380, 349, 42417,42418,536, 365, 40448,490, 450, 317, 355, 317, 16989,42421,42426,362, 42427,42431,381, 3505, 42422,589, 42423,42424, 42425,317, 370, 4984, 42428,550, 42429,5898, 10560,4949, 1999, 42430,317, 317, 29108,362, 370, 35859,42434,351, 2631, 13736,317, 42436,42437,42438,42439, - 42441,317, 565, 565, 12742,490, 10898,6834, 317, 6900, 590, 42440,363, 390, 42443,42445,7428, 1992, 15753,317, 317, 490, 42444,5611, 42447,404, 490, - 42448,42450,42457,42458,42451,42455,317, 317, 317, 354, 42452,42454,317, 317, 42453,5488, 5225, 317, 1347, 42456,317, 2510, 317, 367, 317, 317, 1347, + 42441,317, 565, 565, 12742,490, 10898,6834, 317, 6900, 590, 42440,363, 390, 42443,42445,7428, 1992, 15753,317, 317, 490, 42444,5611, 42447,404, 490, + 42448,42450,42457,42458,42451,42455,317, 317, 317, 354, 42452,42454,317, 317, 42453,5488, 5225, 317, 1347, 42456,317, 2510, 317, 367, 317, 317, 1347, 5809, 317, 42460,381, 317, 42461,380, 42462,317, 42463,381, 351, 317, 14799,2134, 42466,31612,42467,42468,42475,24111,42480,42483,42484,42469,343, 42473, - 42470,5447, 42471,382, 42472,42474,42476,42479,42477,42478,393, 26229,317, 3125, 42481,42482,8580, 1020, 5640, 28392,37059,9824, 490, 343, 42486,433, 317, - 42487,42488,42489,5300, 42491,42493,317, 350, 543, 317, 42494,7785, 1347, 42492,6266, 42495,466, 651, 317, 1347, 317, 42497,42499,42501,8536, 42502,362, + 42470,5447, 42471,382, 42472,42474,42476,42479,42477,42478,393, 26229,317, 3125, 42481,42482,8580, 1020, 5640, 28392,37059,9824, 490, 343, 42486,433, 317, + 42487,42488,42489,5300, 42491,42493,317, 350, 543, 317, 42494,7785, 1347, 42492,6266, 42495,466, 651, 317, 1347, 317, 42497,42499,42501,8536, 42502,362, 42498,317, 42500,6156, 30400,362, 490, 3503, 317, 1347, 5217, 42505,42506,42512,42514,42515,317, 18794,42519,1020, 15729,42524,365, 42525,42531,42532,42536, - 15960,42537,2078, 10898,42507,7716, 42511,2280, 42508,317, 1160, 42509,39144,4984, 317, 42510,637, 317, 9244, 317, 317, 317, 42513,317, 6002, 466, 317, - 596, 34849,1347, 42516,42517,42518,1325, 21036,317, 42520,6332, 42521,42522,42523,842, 42526,2206, 42529,363, 4789, 3284, 317, 42527,42528,42530,2272, 317, + 15960,42537,2078, 10898,42507,7716, 42511,2280, 42508,317, 1160, 42509,39144,4984, 317, 42510,637, 317, 9244, 317, 317, 317, 42513,317, 6002, 466, 317, + 596, 34849,1347, 42516,42517,42518,1325, 21036,317, 42520,6332, 42521,42522,42523,842, 42526,2206, 42529,363, 4789, 3284, 317, 42527,42528,42530,2272, 317, 40800,350, 317, 596, 42533,42534,317, 42535,317, 7850, 38654,2609, 42539,490, 42540,380, 42545,42546,42541,317, 42542,42544,42543,42548,42557,42564,42565, - 42567,317, 42549,317, 1481, 2142, 42550,7127, 317, 42552,317, 9779, 42553,2279, 5611, 490, 42555,317, 651, 42551,5656, 9768, 22945,42554,396, 42556,317, - 9768, 490, 317, 42558,332, 42559,2572, 42560,42563,9711, 317, 42561,317, 363, 2058, 42562,7916, 42566,12044,1160, 42569,15961,1060, 42578,42581,382, 317, - 42570,42571,42572,1481, 42577,5793, 42573,11146,490, 8296, 3284, 42574,42575,16917,1428, 317, 589, 42576,11831,5381, 332, 42579,42580,42584,42585,18785,317, - 18785,590, 6615, 317, 42587,42594,42598,42599,883, 42600,42601,7850, 42605,42607,42609,371, 42588,42589,317, 42592,42593,381, 42590,42591,343, 1588, 317, + 42567,317, 42549,317, 1481, 2142, 42550,7127, 317, 42552,317, 9779, 42553,2279, 5611, 490, 42555,317, 651, 42551,5656, 9768, 22945,42554,396, 42556,317, + 9768, 490, 317, 42558,332, 42559,2572, 42560,42563,9711, 317, 42561,317, 363, 2058, 42562,7916, 42566,12044,1160, 42569,15961,1060, 42578,42581,382, 317, + 42570,42571,42572,1481, 42577,5793, 42573,11146,490, 8296, 3284, 42574,42575,16917,1428, 317, 589, 42576,11831,5381, 332, 42579,42580,42584,42585,18785,317, + 18785,590, 6615, 317, 42587,42594,42598,42599,883, 42600,42601,7850, 42605,42607,42609,371, 42588,42589,317, 42592,42593,381, 42590,42591,343, 1588, 317, 29023,317, 42595,42596,490, 42597,42602,42603,42604,42606,42608,5920, 42610,42611,317, 317, 2351, 42612,42614,42617,42621,141, 43003,43008,43014,142, 43243, 43251,43272,43342,43349,43363,43370,43375,143, 43583,43586,43589,43593,43594,144, 43774,43778,43779,43784,43792,4797, 4797, 11073,11077,4797, 4797, 4797, 42613, 42615,19833,42616,42618,11091,2738, 42619,42620,42622,42623,42624,42625,42626,42627,34722,619, 42628,42629,42646,42707,42711,42714,42716,42743,42750,42762,42763, - 42776,42787,42814,42862,42869,42873,42905,42926,42929,42938,42944,42955,42956,42995,565, 8099, 1358, 317, 9581, 42630,42632,42637,42638,42640,42643,42644,317, - 370, 42631,365, 381, 13790,42633,16651,1444, 42634,466, 12154,42635,42636,42639,18064,42641,42642,339, 8296, 11844,16371,351, 42645,42647,24029,42649,9064, + 42776,42787,42814,42862,42869,42873,42905,42926,42929,42938,42944,42955,42956,42995,565, 8099, 1358, 317, 9581, 42630,42632,42637,42638,42640,42643,42644,317, + 370, 42631,365, 381, 13790,42633,16651,1444, 42634,466, 12154,42635,42636,42639,18064,42641,42642,339, 8296, 11844,16371,351, 42645,42647,24029,42649,9064, 42650,42653,11607,2134, 42691,42699,42706,11607,490, 42648,2003, 5325, 317, 11607,317, 42651,490, 42652,637, 42654,42655,42656,633, 42657,42660,42664,42667, 42670,42673,42675,42676,42678,42680,42682,42684,42687,5105, 317, 317, 5826, 317, 2742, 317, 1347, 2066, 42658,42659,42661,382, 42662,317, 42663,317, 42665, 1347, 42666,2272, 317, 363, 42668,14589,42669,42671,42672,42674,1992, 637, 317, 317, 633, 390, 8275, 363, 42677,42679,490, 317, 363, 10626,12054,42681, - 42683,42685,476, 362, 42686,1915, 42688,42690,42689,317, 317, 317, 317, 317, 317, 362, 317, 5037, 3007, 351, 42692,2719, 343, 5836, 332, 317, 1230, + 42683,42685,476, 362, 42686,1915, 42688,42690,42689,317, 317, 317, 317, 317, 317, 362, 317, 5037, 3007, 351, 42692,2719, 343, 5836, 332, 317, 1230, 317, 6228, 317, 317, 317, 42693,42694,42696,42697,345, 317, 363, 8304, 363, 1347, 42695,317, 2054, 10626,363, 490, 42698,5270, 42700,42701,42702,42705, 18621,381, 2271, 356, 317, 42703,9064, 317, 7523, 317, 6063, 42704,4965, 2271, 317, 7149, 5890, 42708,42709,5184, 10283,42710,332, 7801, 5241, 14478,11408, - 2719, 2509, 2134, 42712,42713,12711,343, 6813, 371, 42715,4965, 9212, 490, 16838,317, 42717,42718,42728,42730,350, 42732,490, 362, 9303, 42737,42739,317, + 2719, 2509, 2134, 42712,42713,12711,343, 6813, 371, 42715,4965, 9212, 490, 16838,317, 42717,42718,42728,42730,350, 42732,490, 362, 9303, 42737,42739,317, 42740,388, 11341,27260,42719,389, 42724,42720,42721,42722,42723,42725,42726,42727,362, 42729,42731,343, 317, 9351, 42733,317, 42734,42735,3284, 42736,42738, 317, 396, 317, 317, 2035, 11346,42741,42742,42744,42746,343, 7073, 42747,42748,42749,370, 42745,354, 5022, 553, 380, 343, 437, 490, 2317, 501, 12291, 42751,42753,42755,1444, 357, 42756,42760,42752,5991, 7401, 466, 539, 317, 2036, 551, 24305,42754,11266,343, 317, 5343, 2116, 317, 5241, 42757,42758,42759, - 42761,42764,42765,42767,42768,42771,42772,14651,24265,320, 42766,633, 633, 2077, 362, 345, 16579,24269,13221,42769,8178, 42770,317, 40627,42773,42775,8639, + 42761,42764,42765,42767,42768,42771,42772,14651,24265,320, 42766,633, 633, 2077, 362, 345, 16579,24269,13221,42769,8178, 42770,317, 40627,42773,42775,8639, 371, 23651,42774,42777,1998, 42781,15136,42782,385, 490, 42783,42784,42778,42779,42780,949, 354, 317, 11342,353, 7488, 332, 501, 370, 2134, 42785,42786, - 949, 42788,42792,5840, 42794,42802,42804,565, 42809,6614, 17075,42811,6563, 2035, 2368, 317, 31361,42789,42791,317, 404, 42790,317, 317, 42793,5105, 9027, - 7214, 42795,317, 42796,42797,14278,317, 317, 317, 1353, 3469, 317, 633, 317, 42798,317, 28220,317, 317, 317, 317, 317, 317, 317, 5684, 317, 317, + 949, 42788,42792,5840, 42794,42802,42804,565, 42809,6614, 17075,42811,6563, 2035, 2368, 317, 31361,42789,42791,317, 404, 42790,317, 317, 42793,5105, 9027, + 7214, 42795,317, 42796,42797,14278,317, 317, 317, 1353, 3469, 317, 633, 317, 42798,317, 28220,317, 317, 317, 317, 317, 317, 317, 5684, 317, 317, 42801,30878,317, 317, 42799,42800,42803,5223, 42805,490, 8597, 9657, 42806,404, 1266, 317, 317, 558, 4980, 42807,42808,10422,16717,317, 42810,42812,42813, - 356, 317, 949, 42815,554, 42818,42820,42823,42828,42829,42830,42834,42837,42841,42847,42848,42850,42851,2236, 1230, 42861,437, 42816,317, 42817,317, 490, - 317, 371, 317, 42819,371, 8296, 11347,317, 317, 42821,42822,6002, 363, 6318, 42824,4984, 867, 317, 8503, 343, 42826,42827,1230, 317, 317, 371, 490, - 42825,317, 317, 317, 5891, 380, 343, 317, 2381, 371, 42831,9095, 16910,5891, 332, 42832,42833,1160, 6278, 390, 317, 317, 8543, 11280,317, 21886,317, + 356, 317, 949, 42815,554, 42818,42820,42823,42828,42829,42830,42834,42837,42841,42847,42848,42850,42851,2236, 1230, 42861,437, 42816,317, 42817,317, 490, + 317, 371, 317, 42819,371, 8296, 11347,317, 317, 42821,42822,6002, 363, 6318, 42824,4984, 867, 317, 8503, 343, 42826,42827,1230, 317, 317, 371, 490, + 42825,317, 317, 317, 5891, 380, 343, 317, 2381, 371, 42831,9095, 16910,5891, 332, 42832,42833,1160, 6278, 390, 317, 317, 8543, 11280,317, 21886,317, 42835,317, 31834,343, 42836,396, 3284, 401, 12054,317, 42838,42840,501, 11147,380, 317, 42839,317, 317, 317, 382, 343, 1459, 9690, 42842,42843,42844, 42845,371, 371, 5439, 351, 2108, 971, 351, 42846,3284, 317, 390, 4984, 466, 5838, 490, 5055, 3075, 42849,437, 42852,8273, 42860,42853,317, 42854,42855, 317, 317, 42856,42857,42858,42859,317, 23670,317, 343, 971, 42863,42866,1109, 317, 317, 317, 42864,1018, 42865,42867,42868,42870,1345, 42871,42872,18621, 1347, 317, 317, 345, 390, 390, 42874,9779, 16876,42876,42879,42882,42883,317, 8099, 11132,42885,42886,42888,2396, 42892,317, 42897,42898,42900,9262, 42875, - 9878, 42877,16917,317, 42878,42880,42881,12966,8333, 5571, 317, 24242,317, 2321, 42884,363, 380, 363, 363, 11147,8285, 5295, 2348, 317, 42887,42889,317, + 9878, 42877,16917,317, 42878,42880,42881,12966,8333, 5571, 317, 24242,317, 2321, 42884,363, 380, 363, 363, 11147,8285, 5295, 2348, 317, 42887,42889,317, 5022, 42890,7850, 317, 365, 42891,317, 317, 42893,42894,42895,42896,1325, 317, 1325, 381, 590, 317, 9325, 11962,2117, 382, 317, 351, 42899,42901,42903, - 10997,42902,42904,362, 7939, 42906,42908,42909,332, 42912,490, 42916,42919,42922,42923,2368, 42907,490, 317, 11198,28127,8273, 42910,42911,317, 2366, 351, - 42913,42914,317, 317, 42915,317, 6228, 317, 317, 317, 317, 317, 42917,637, 9088, 42918,317, 317, 633, 317, 317, 317, 317, 317, 317, 317, 317, + 10997,42902,42904,362, 7939, 42906,42908,42909,332, 42912,490, 42916,42919,42922,42923,2368, 42907,490, 317, 11198,28127,8273, 42910,42911,317, 2366, 351, + 42913,42914,317, 317, 42915,317, 6228, 317, 317, 317, 317, 317, 42917,637, 9088, 42918,317, 317, 633, 317, 317, 317, 317, 317, 317, 317, 317, 558, 317, 317, 317, 317, 317, 317, 317, 317, 42920,42921,637, 6996, 317, 1358, 317, 351, 42924,42925,30801,5836, 5836, 1481, 332, 42927,317, 42928, 317, 317, 317, 17531,1998, 390, 404, 565, 343, 42930,42931,42936,2541, 317, 489, 1444, 1345, 42932,42934,363, 42933,8613, 317, 317, 42935,42937,42939, 42941,42943,490, 351, 5628, 317, 362, 8217, 7035, 42940,316, 317, 42942,345, 27939,5055, 9702, 317, 15156,317, 345, 42945,42949,356, 317, 42952,42954, 2731, 317, 42946,317, 42947,42948,2272, 42950,42951,42953,27606,11844,949, 42957,42978,42979,42981,42984,42985,42987,1230, 501, 42989,8955, 317, 9779, 42990, - 558, 42993,317, 42958,42960,42965,42967,42970,42972,42974,42975,42959,42961,42962,42963,42964,42966,42968,2110, 42969,42971,42973,42976,42977,343, 551, 370, + 558, 42993,317, 42958,42960,42965,42967,42970,42972,42974,42975,42959,42961,42962,42963,42964,42966,42968,2110, 42969,42971,42973,42976,42977,343, 551, 370, 2156, 42980,29210,42982,42983,317, 42975,42986,42988,5684, 317, 343, 42991,2110, 42992,42994,7514, 2110, 42996,490, 42998,363, 42997,11366,363, 3182, 42999, - 5991, 43000,43001,43002,1160, 1108, 5684, 6318, 2815, 16278,3361, 551, 43004,43005,43007,5017, 867, 43006,345, 43009,43011,43012,10382,43010,43013,2162, 8906, - 382, 43015,43054,43058,43061,43072,43080,43092,43093,590, 43098,43099,43113,43117,43141,43149,43152,43185,43215,43226,43229,43231,43240,3429, 43016,43019,418, - 3640, 29396,43017,43018,317, 43020,43025,43028,43029,43033,43034,43035,43039,43040,43043,43046,43051,43052,43053,43021,43022,381, 43023,43024,43026,36441,317, + 5991, 43000,43001,43002,1160, 1108, 5684, 6318, 2815, 16278,3361, 551, 43004,43005,43007,5017, 867, 43006,345, 43009,43011,43012,10382,43010,43013,2162, 8906, + 382, 43015,43054,43058,43061,43072,43080,43092,43093,590, 43098,43099,43113,43117,43141,43149,43152,43185,43215,43226,43229,43231,43240,3429, 43016,43019,418, + 3640, 29396,43017,43018,317, 43020,43025,43028,43029,43033,43034,43035,43039,43040,43043,43046,43051,43052,43053,43021,43022,381, 43023,43024,43026,36441,317, 43027,373, 343, 317, 11902,43030,43031,43032,43036,43037,43038,12625,339, 43041,43042,317, 43044,27723,43045,539, 11902,380, 574, 379, 43047,43050,43048, 43049,43055,20485,43057,43056,29305,317, 317, 19463,43059,43060,3433, 363, 32982,2533, 43062,43063,39969,43068,550, 43071,29305,343, 637, 317, 633, 29305, - 43064,43065,43066,43067,370, 43069,43070,43073,43074,1526, 4591, 43077,43079,13269,43075,43076,2510, 363, 362, 1530, 16579,43078,12151,317, 43081,5825, 1011, + 43064,43065,43066,43067,370, 43069,43070,43073,43074,1526, 4591, 43077,43079,13269,43075,43076,2510, 363, 362, 1530, 16579,43078,12151,317, 43081,5825, 1011, 10487,12151,43082,32592,43087,6354, 43088,317, 345, 43091,317, 43083,345, 370, 29424,43084,6420, 43085,43086,43089,43090,317, 1078, 345, 18289,2261, 17297, 43094,43096,43097,1329, 43095,317, 39970,380, 381, 428, 43100,501, 43101,6231, 43104,345, 43105,43111,43112,8172, 1230, 401, 2261, 43102,317, 43103,43106, - 43107,1160, 43109,9779, 345, 43108,4980, 317, 29856,43110,362, 343, 8178, 2271, 43114,43115,43116,38227,397, 6555, 2551, 317, 490, 6555, 404, 317, 2117, - 14695,2117, 949, 43118,5962, 43119,43121,317, 43122,43125,43128,43129,43137,2396, 3941, 43138,43139,501, 9644, 43120,345, 384, 317, 317, 11533,574, 490, - 343, 43123,1358, 4591, 43124,43126,43127,317, 317, 345, 2551, 2577, 43130,43131,43132,2058, 8178, 43136,350, 11533,317, 345, 10820,317, 317, 43133,596, + 43107,1160, 43109,9779, 345, 43108,4980, 317, 29856,43110,362, 343, 8178, 2271, 43114,43115,43116,38227,397, 6555, 2551, 317, 490, 6555, 404, 317, 2117, + 14695,2117, 949, 43118,5962, 43119,43121,317, 43122,43125,43128,43129,43137,2396, 3941, 43138,43139,501, 9644, 43120,345, 384, 317, 317, 11533,574, 490, + 343, 43123,1358, 4591, 43124,43126,43127,317, 317, 345, 2551, 2577, 43130,43131,43132,2058, 8178, 43136,350, 11533,317, 345, 10820,317, 317, 43133,596, 43135,404, 43134,350, 6228, 317, 633, 317, 317, 396, 317, 317, 317, 396, 22831,13683,5684, 363, 2521, 501, 4982, 370, 2108, 43140,43142,2381, 43143, 43144,317, 10506,317, 590, 43145,43146,43147,43148,317, 2551, 332, 43150,6046, 43151,6046, 2551, 501, 43153,43155,43156,43157,43160,43162,43164,15540,43167, - 43169,43172,43175,43180,11716,43181,43184,370, 971, 43154,370, 578, 29210,466, 363, 317, 43158,317, 43159,5942, 16941,317, 43161,5995, 317, 43163,332, - 332, 11607,317, 37568,317, 5991, 43165,4987, 317, 43166,43168,6563, 363, 5896, 43170,2348, 43171,363, 356, 43173,43174,5836, 43176,43177,43178,43179,2163, + 43169,43172,43175,43180,11716,43181,43184,370, 971, 43154,370, 578, 29210,466, 363, 317, 43158,317, 43159,5942, 16941,317, 43161,5995, 317, 43163,332, + 332, 11607,317, 37568,317, 5991, 43165,4987, 317, 43166,43168,6563, 363, 5896, 43170,2348, 43171,363, 356, 43173,43174,5836, 43176,43177,43178,43179,2163, 490, 1347, 6228, 317, 633, 317, 317, 558, 317, 43182,43183,43186,43188,43192,43194,43195,43196,43197,43204,43206,10538,43187,43189,43190,43191,490, 43193, 351, 2586, 439, 2280, 43198,43199,43200,43203,1060, 317, 6228, 317, 32125,317, 362, 9027, 317, 317, 43201,1160, 490, 43202,317, 43205,10815,317, 43207, - 4268, 317, 43208,637, 1266, 317, 1267, 2060, 3469, 317, 43209,24304,2063, 43212,43214,43210,43211,43213,490, 4789, 43216,43218,2609, 43220,316, 43221,362, - 1194, 43222,43224,43217,383, 34392,43219,320, 317, 317, 17683,490, 382, 12107,381, 365, 363, 43223,351, 6081, 6420, 4965, 43225,363, 317, 1347, 382, - 14648,370, 43227,317, 43228,43230,3079, 401, 43232,43234,43238,596, 370, 317, 43233,370, 43235,381, 317, 10422,43236,370, 317, 43237,43239,6497, 363, - 43241,43242,3652, 2058, 2134, 317, 5836, 14170,14170,43244,43247,2898, 43248,43245,43246,32457,43249,43250,43252,43255,43257,43259,43263,43265,43268,43253,490, + 4268, 317, 43208,637, 1266, 317, 1267, 2060, 3469, 317, 43209,24304,2063, 43212,43214,43210,43211,43213,490, 4789, 43216,43218,2609, 43220,316, 43221,362, + 1194, 43222,43224,43217,383, 34392,43219,320, 317, 317, 17683,490, 382, 12107,381, 365, 363, 43223,351, 6081, 6420, 4965, 43225,363, 317, 1347, 382, + 14648,370, 43227,317, 43228,43230,3079, 401, 43232,43234,43238,596, 370, 317, 43233,370, 43235,381, 317, 10422,43236,370, 317, 43237,43239,6497, 363, + 43241,43242,3652, 2058, 2134, 317, 5836, 14170,14170,43244,43247,2898, 43248,43245,43246,32457,43249,43250,43252,43255,43257,43259,43263,43265,43268,43253,490, 16853,317, 43254,741, 43256,966, 43258,43260,43261,43262,43264,3967, 370, 11539,43266,43267,43269,43270,43271,43273,43278,1020, 43280,43284,43286,43287,43295, - 365, 43299,43301,43316,466, 2551, 43327,351, 43330,43336,43339,5624, 43340,6763, 43274,43277,317, 43275,43276,2357, 343, 511, 362, 590, 365, 350, 3361, - 43279,43281,43282,43283,43285,43288,43289,43293,343, 12027,2066, 5623, 43290,43291,43292,11769,43294,35278,317, 43296,6231, 43297,43298,2211, 8852, 363, 317, - 43300,1526, 14495,5683, 404, 317, 949, 43302,43305,43307,43308,43311,554, 39260,43313,404, 43303,43304,554, 43306,6228, 317, 633, 1160, 317, 317, 317, - 43309,43310,404, 317, 5392, 317, 317, 1108, 404, 43312,404, 1108, 362, 317, 317, 31154,43314,370, 43315,1300, 317, 317, 1353, 633, 24054,317, 317, - 317, 9876, 13816,317, 317, 4984, 43317,43321,43322,2291, 490, 43324,43325,511, 2301, 2078, 6763, 7053, 43326,19307,380, 43318,317, 43319,43320,12422,362, + 365, 43299,43301,43316,466, 2551, 43327,351, 43330,43336,43339,5624, 43340,6763, 43274,43277,317, 43275,43276,2357, 343, 511, 362, 590, 365, 350, 3361, + 43279,43281,43282,43283,43285,43288,43289,43293,343, 12027,2066, 5623, 43290,43291,43292,11769,43294,35278,317, 43296,6231, 43297,43298,2211, 8852, 363, 317, + 43300,1526, 14495,5683, 404, 317, 949, 43302,43305,43307,43308,43311,554, 39260,43313,404, 43303,43304,554, 43306,6228, 317, 633, 1160, 317, 317, 317, + 43309,43310,404, 317, 5392, 317, 317, 1108, 404, 43312,404, 1108, 362, 317, 317, 31154,43314,370, 43315,1300, 317, 317, 1353, 633, 24054,317, 317, + 317, 9876, 13816,317, 317, 4984, 43317,43321,43322,2291, 490, 43324,43325,511, 2301, 2078, 6763, 7053, 43326,19307,380, 43318,317, 43319,43320,12422,362, 381, 2357, 317, 28836,43323,589, 466, 43126,3079, 317, 43328,490, 7785, 2163, 43329,490, 317, 317, 971, 43331,17658,590, 43333,43332,43334,43335,43337, 43338,466, 7797, 490, 43341,7688, 362, 631, 664, 43343,43347,43348,949, 18746,43344,2300, 317, 43345,317, 43346,12726,596, 43350,2546, 1243, 43354,43355, 43357,1243, 43351,43352,43353,43356,611, 43358,43361,608, 611, 43359,43360,43362,26004,43364,43368,9540, 43365,43366,43367,396, 20433,43369,19398,363, 43371, 43373,1193, 43374,43372,781, 2022, 2035, 43376,43377,43378,43379,43380,43383,43391,43395,43406,43412,43426,43429,43432,43469,43473,43475,43480,43488,43489,43505, - 43510,43511,43526,43547,43548,43558,43564,43567,43571,43578,43381,43382,317, 43384,317, 2948, 43386,317, 43388,317, 43385,317, 8772, 8506, 43387,317, 1160, + 43510,43511,43526,43547,43548,43558,43564,43567,43571,43578,43381,43382,317, 43384,317, 2948, 43386,317, 43388,317, 43385,317, 8772, 8506, 43387,317, 1160, 6420, 343, 43389,43390,1519, 2509, 1347, 5332, 2571, 43392,43393,363, 317, 43394,7577, 43396,43398,43401,370, 10408,43397,43399,427, 43400,43402,317, 43403, 43404,43405,43407,43408,1358, 43409,3987, 1230, 317, 363, 317, 43410,43411,949, 632, 2366, 43413,43416,2077, 30797,43418,11487,43419,43421,43422,5792, 43424, - 43414,43415,384, 605, 43417,536, 39907,404, 43420,2222, 511, 317, 43423,2290, 2553, 390, 6228, 637, 43425,43427,317, 43428,43430,5711, 9081, 43431,317, + 43414,43415,384, 605, 43417,536, 39907,404, 43420,2222, 511, 317, 43423,2290, 2553, 390, 6228, 637, 43425,43427,317, 43428,43430,5711, 9081, 43431,317, 2381, 401, 43433,35975,380, 43443,11648,404, 317, 43434,317, 317, 4984, 371, 43435,43442,1160, 43436,43438,437, 43437,7911, 363, 501, 43439,43440,43441, 363, 466, 363, 404, 637, 42654,43444,43445,1011, 740, 633, 673, 633, 43446,43449,43450,43451,43453,43454,43455,351, 343, 43457,43458,38462,43460,43462, - 511, 43468,317, 43447,43448,43452,343, 2402, 3505, 5872, 332, 317, 362, 43456,363, 3079, 317, 343, 317, 317, 43459,6996, 317, 633, 633, 357, 317, - 43461,7055, 9557, 8301, 343, 2553, 43463,2521, 404, 43465,43464,317, 317, 317, 317, 5037, 356, 43466,43467,363, 343, 317, 43470,1915, 43471,466, 317, - 43472,5037, 5991, 370, 317, 317, 43474,1753, 490, 490, 43476,43478,350, 317, 317, 490, 43477,317, 317, 18438,317, 14773,3469, 381, 362, 317, 317, - 43479,363, 5324, 2003, 43481,3611, 43482,43486,317, 404, 317, 10041,43483,43484,43485,32322,3941, 317, 370, 43487,317, 19806,1347, 23328,2171, 2576, 1347, + 511, 43468,317, 43447,43448,43452,343, 2402, 3505, 5872, 332, 317, 362, 43456,363, 3079, 317, 343, 317, 317, 43459,6996, 317, 633, 633, 357, 317, + 43461,7055, 9557, 8301, 343, 2553, 43463,2521, 404, 43465,43464,317, 317, 317, 317, 5037, 356, 43466,43467,363, 343, 317, 43470,1915, 43471,466, 317, + 43472,5037, 5991, 370, 317, 317, 43474,1753, 490, 490, 43476,43478,350, 317, 317, 490, 43477,317, 317, 18438,317, 14773,3469, 381, 362, 317, 317, + 43479,363, 5324, 2003, 43481,3611, 43482,43486,317, 404, 317, 10041,43483,43484,43485,32322,3941, 317, 370, 43487,317, 19806,1347, 23328,2171, 2576, 1347, 4984, 43490,8301, 348, 43494,43495,43497,2551, 1358, 43501,43503,317, 31533,28583,343, 5207, 343, 1160, 317, 43491,43492,43493,7852, 343, 2402, 317, 11533, - 43496,6228, 317, 10452,466, 363, 317, 5840, 5037, 317, 43498,317, 2845, 43499,511, 43500,4965, 43502,317, 343, 404, 43504,317, 345, 43506,317, 317, - 43509,345, 43507,317, 43508,16022,490, 43512,427, 43513,5105, 43518,2631, 43520,490, 43522,43524,43525,317, 43514,4984, 43517,363, 317, 4984, 363, 380, + 43496,6228, 317, 10452,466, 363, 317, 5840, 5037, 317, 43498,317, 2845, 43499,511, 43500,4965, 43502,317, 343, 404, 43504,317, 345, 43506,317, 317, + 43509,345, 43507,317, 43508,16022,490, 43512,427, 43513,5105, 43518,2631, 43520,490, 43522,43524,43525,317, 43514,4984, 43517,363, 317, 4984, 363, 380, 43515,681, 7769, 43516,740, 317, 317, 27446,317, 345, 5419, 317, 317, 1992, 404, 43519,6228, 13221,43521,317, 43523,345, 11147,365, 355, 43527,43528, - 43529,43539,43542,43397,43544,2396, 43545,43546,343, 2391, 2087, 365, 1266, 649, 317, 43530,43531,363, 43532,574, 317, 317, 18611,317, 5823, 7168, 363, + 43529,43539,43542,43397,43544,2396, 43545,43546,343, 2391, 2087, 365, 1266, 649, 317, 43530,43531,363, 43532,574, 317, 317, 18611,317, 5823, 7168, 363, 43533,8248, 317, 317, 18611,43534,5300, 345, 43535,43536,43537,43538,1266, 1358, 1020, 362, 43540,317, 43541,24695,10038,1267, 317, 317, 317, 633, 20592, - 4925, 43543,43410,16767,390, 2271, 363, 15705,343, 439, 6002, 1526, 317, 4213, 317, 1526, 1998, 43549,1992, 43550,16398,43551,43552,317, 43553,43556,381, + 4925, 43543,43410,16767,390, 2271, 363, 15705,343, 439, 6002, 1526, 317, 4213, 317, 1526, 1998, 43549,1992, 43550,16398,43551,43552,317, 43553,43556,381, 43554,43555,317, 382, 8158, 370, 380, 43557,317, 356, 466, 10149,317, 43559,33733,43563,8177, 43560,43561,43562,9768, 3284, 6780, 390, 490, 43565,43566, 43568,43569,43570,949, 5105, 43572,23998,10891,43574,4591, 2260, 43575,43573,6546, 404, 317, 43576,43577,43579,43580,43581,43582,382, 43584,10381,43585,43587, 8807, 43588,11073,3182, 43590,9172, 43592,43591,5626, 5763, 2553, 363, 2146, 381, 39260,43595,339, 43596,43597,43598,43606,43611,43612,43623,350, 43628,43639, 43641,43646,43649,43651,43668,43677,43715,43716,590, 43720,43737,43760,380, 43762,43768,490, 1588, 43599,43605,1347, 43600,345, 43602,43603,490, 43604,43601, 357, 332, 7143, 343, 5392, 33534,317, 43607,317, 43608,43609,362, 2035, 317, 317, 43610,15510,41385,2156, 317, 362, 343, 2116, 43613,317, 43615,43616, - 43618,3078, 43622,404, 317, 5611, 317, 43614,317, 1109, 427, 43617,466, 25302,317, 25302,7821, 43619,317, 4925, 5760, 317, 43620,43621,4591, 5324, 370, + 43618,3078, 43622,404, 317, 5611, 317, 43614,317, 1109, 427, 43617,466, 25302,317, 25302,7821, 43619,317, 4925, 5760, 317, 43620,43621,4591, 5324, 370, 596, 604, 43624,43625,43627,381, 345, 2108, 317, 15758,43626,6780, 43629,43632,11089,6704, 43638,317, 317, 10408,43630,43631,43633,43635,11128,317, 43634, - 43636,43637,43640,317, 317, 553, 317, 365, 1100, 43642,43644,317, 43643,1160, 317, 317, 317, 3599, 317, 362, 317, 317, 317, 345, 43645,381, 550, + 43636,43637,43640,317, 317, 553, 317, 365, 1100, 43642,43644,317, 43643,1160, 317, 317, 317, 3599, 317, 362, 317, 317, 317, 345, 43645,381, 550, 11485,43647,43648,343, 7797, 317, 43650,2108, 490, 317, 2586, 490, 43652,43653,43660,384, 43661,553, 43662,317, 4952, 1358, 317, 317, 43654,390, 43656, 490, 1160, 1943, 1100, 43658,490, 6228, 1087, 43655,317, 317, 317, 1160, 317, 5891, 317, 345, 6228, 317, 866, 2366, 317, 7916, 317, 43657,43659,43663, - 43666,43667,637, 363, 317, 43664,43665,43669,43670,33415,490, 43672,43673,404, 4186, 317, 43671,6420, 2117, 1325, 651, 10422,3999, 539, 43674,43676,1060, + 43666,43667,637, 363, 317, 43664,43665,43669,43670,33415,490, 43672,43673,404, 4186, 317, 43671,6420, 2117, 1325, 651, 10422,3999, 539, 43674,43676,1060, 317, 43675,3869, 5159, 2036, 43678,43680,5223, 43682,362, 43689,43694,43705,43706,43713,2078, 43714,43679,356, 1791, 350, 317, 43681,345, 5054, 1588, 43683, - 43685,43687,621, 590, 43688,317, 490, 317, 43684,317, 317, 43686,317, 317, 43690,371, 43691,43692,6704, 362, 43693,362, 6601, 39465,345, 317, 1347, + 43685,43687,621, 590, 43688,317, 490, 317, 43684,317, 317, 43686,317, 317, 43690,371, 43691,43692,6704, 362, 43693,362, 6601, 39465,345, 317, 1347, 6420, 11612,489, 43695,5105, 2081, 43697,43698,43703,5611, 345, 43696,317, 43699,345, 43700,637, 18438,1292, 317, 317, 43701,43702,43704,43707,6089, 43710, 43711,317, 317, 15130,43708,317, 43709,43712,1347, 317, 12756,43717,317, 350, 317, 43718,43719,43721,43723,501, 43724,43725,43730,43736,6388, 2022, 14766, - 7689, 317, 357, 332, 317, 317, 43722,317, 371, 363, 401, 13378,371, 5832, 317, 8275, 317, 43726,43727,43728,363, 43729,363, 40281,520, 5464, 490, + 7689, 317, 357, 332, 317, 317, 43722,317, 371, 363, 401, 13378,371, 5832, 317, 8275, 317, 43726,43727,43728,363, 43729,363, 40281,520, 5464, 490, 317, 317, 1109, 43731,637, 390, 43732,43733,7242, 43734,43735,8273, 16416,1020, 5570, 332, 43738,43740,396, 43739,317, 43741,43742,27218,43743,43744,43747, - 43758,43759,25404,345, 2035, 5205, 343, 317, 589, 43745,363, 43746,363, 43748,43751,43753,1347, 14425,43749,43750,6602, 1345, 43752,2184, 9482, 6425, 5464, + 43758,43759,25404,345, 2035, 5205, 343, 317, 589, 43745,363, 43746,363, 43748,43751,43753,1347, 14425,43749,43750,6602, 1345, 43752,2184, 9482, 6425, 5464, 637, 43754,317, 317, 633, 317, 43755,1160, 350, 17976,317, 43756,43757,363, 1160, 2272, 317, 4952, 348, 5943, 43761,317, 317, 466, 1243, 43763,43767, 43764,490, 380, 5633, 43765,43766,317, 1243, 43769,43770,43771,43772,43773,5464, 20858,43775,43776,43777,2381, 412, 43780,43781,43782,43783,43785,43786,43787, - 43789,43788,43790,43791,43793,43794,43795,43796,43797,43801,43804,16575,43813,146, 44467,44481,44493,148, 44805,44816,44820,149, 45308,45325,151, 45487,152, + 43789,43788,43790,43791,43793,43794,43795,43796,43797,43801,43804,16575,43813,146, 44467,44481,44493,148, 44805,44816,44820,149, 45308,45325,151, 45487,152, 153, 46062,46069,154, 46336,46352,155, 46613,46623,46650,46679,43798,43800,43799,342, 8178, 24333,43802,607, 43803,43805,43811,2298, 43806,43807,43808,43809, 43810,43812,43814,43816,43815,43817,43818,43819,43821,43826,43842,43858,43867,43884,43888,43893,43912,43932,43936,43950,44033,44084,44145,44148,44180,147, 44291, 44335,44400,44418,44424,44434,44444,43820,490, 43822,317, 43823,43824,1358, 1108, 43825,490, 317, 43827,43831,317, 12731,365, 43836,43837,43838,2391, 43839, - 43840,11346,883, 11346,3688, 490, 490, 43828,25960,43830,43829,384, 43832,317, 43833,390, 43834,43835,12656,490, 490, 317, 317, 1700, 349, 317, 365, - 317, 317, 332, 43841,43843,43844,43852,2021, 317, 43853,5293, 26963,43854,2178, 43845,43847,43850,43846,43846,5624, 317, 43848,43849,43851,351, 13638,490, + 43840,11346,883, 11346,3688, 490, 490, 43828,25960,43830,43829,384, 43832,317, 43833,390, 43834,43835,12656,490, 490, 317, 317, 1700, 349, 317, 365, + 317, 317, 332, 43841,43843,43844,43852,2021, 317, 43853,5293, 26963,43854,2178, 43845,43847,43850,43846,43846,5624, 317, 43848,43849,43851,351, 13638,490, 43855,23622,11347,43856,43857,10316,371, 3284, 43859,388, 43860,433, 43862,43863,350, 43864,365, 43865,43866,317, 5241, 7973, 490, 317, 14410,490, 43861, 390, 381, 8301, 490, 382, 317, 4925, 1331, 42902,317, 472, 2298, 43868,43869,1992, 317, 43874,27022,43877,43879,43880,43870,43872,2577, 43871,43873,43875, - 43876,43878,466, 2568, 43881,43882,43883,43885,43887,317, 15090,317, 404, 2110, 43886,317, 43889,39137,345, 43890,343, 43891,43892,5943, 7672, 317, 8722, - 490, 317, 343, 33429,43894,12202,428, 43899,43901,43903,43910,43911,317, 9298, 43895,43897,317, 317, 2351, 317, 43896,9779, 490, 43898,7785, 317, 363, + 43876,43878,466, 2568, 43881,43882,43883,43885,43887,317, 15090,317, 404, 2110, 43886,317, 43889,39137,345, 43890,343, 43891,43892,5943, 7672, 317, 8722, + 490, 317, 343, 33429,43894,12202,428, 43899,43901,43903,43910,43911,317, 9298, 43895,43897,317, 317, 2351, 317, 43896,9779, 490, 43898,7785, 317, 363, 43900,317, 490, 43902,7949, 490, 43904,363, 43905,43909,43906,43907,43908,4965, 1108, 317, 590, 490, 2576, 43913,357, 43914,43915,590, 43916,43917,43920, - 2102, 6834, 43921,43923,43929,365, 14832,363, 6917, 8403, 7005, 43918,370, 43919,490, 390, 590, 317, 1347, 317, 490, 317, 381, 43922,351, 43924,490, + 2102, 6834, 43921,43923,43929,365, 14832,363, 6917, 8403, 7005, 43918,370, 43919,490, 390, 590, 317, 1347, 317, 490, 317, 381, 43922,351, 43924,490, 43925,25092,362, 43926,43927,43928,43930,317, 317, 363, 363, 43931,43933,350, 317, 43934,348, 380, 43935,43937,2380, 390, 43944,43945,43946,43947,43948, 43949,949, 320, 971, 590, 490, 9398, 43938,43939,43940,7874, 43942,1481, 43941,439, 43943,29531,6638, 9913, 2885, 12756,16643,5836, 4186, 5173, 43951,43964, - 43969,43971,43973,43988,43990,8948, 43993,44004,44005,44015,44017,44019,44021,44024,44028,44029,44030,43952,43954,43956,317, 43957,43961,317, 43962,43963,6402, + 43969,43971,43973,43988,43990,8948, 43993,44004,44005,44015,44017,44019,44021,44024,44028,44029,44030,43952,43954,43956,317, 43957,43961,317, 43962,43963,6402, 343, 43953,381, 5836, 2163, 43955,3284, 3688, 365, 43958,1444, 43959,348, 490, 43960,317, 390, 348, 7392, 43965,43967,43966,43968,43970,371, 38707,43972, 351, 380, 43974,43978,490, 317, 43985,43986,5223, 317, 490, 43987,30119,43975,43976,43977,43979,390, 43984,43980,43981,43982,43983,371, 350, 1020, 25114, - 43989,345, 43991,501, 43992,317, 28655,43994,43995,9869, 350, 490, 317, 43997,43999,44002,317, 43996,43998,2110, 5623, 317, 24664,44000,490, 15326,3284, - 44001,317, 13062,390, 371, 317, 3987, 490, 44003,8296, 371, 317, 29998,317, 362, 38081,44006,44007,44008,44013,16187,44014,18460,2108, 18839,345, 350, + 43989,345, 43991,501, 43992,317, 28655,43994,43995,9869, 350, 490, 317, 43997,43999,44002,317, 43996,43998,2110, 5623, 317, 24664,44000,490, 15326,3284, + 44001,317, 13062,390, 371, 317, 3987, 490, 44003,8296, 371, 317, 29998,317, 362, 38081,44006,44007,44008,44013,16187,44014,18460,2108, 18839,345, 350, 317, 317, 19633,317, 317, 4949, 2236, 6228, 44009,317, 44011,317, 4976, 10081,317, 44010,44012,2108, 10560,317, 317, 317, 2105, 2080, 12696,5626, 12696, - 345, 44016,317, 44018,362, 2163, 26310,44020,16187,490, 44022,605, 44023,44025,16187,1526, 317, 44026,44027,317, 5626, 13369,317, 490, 490, 490, 6834, + 345, 44016,317, 44018,362, 2163, 26310,44020,16187,490, 44022,605, 44023,44025,16187,1526, 317, 44026,44027,317, 5626, 13369,317, 490, 490, 490, 6834, 2590, 6048, 20578,44031,317, 44032,44034,44040,44042,44044,44057,343, 44067,44068,44072,9981, 44073,44081,15772,44083,490, 317, 44035,44036,13003,44037,44038, 44039,15876,317, 17985,490, 2178, 2110, 2020, 7306, 317, 351, 466, 44041,44043,44045,490, 1108, 44047,44050,29531,44054,44055,44046,44048,44049,44051,44052, - 381, 44053,1044, 2280, 15017,1325, 44056,511, 363, 363, 44058,44060,44062,8403, 44063,10997,6555, 490, 44059,7892, 490, 3284, 44061,5017, 10734,317, 4925, - 371, 490, 490, 9174, 44064,317, 44065,317, 17095,44066,317, 351, 5736, 5663, 44069,350, 317, 44070,317, 44071,351, 3987, 6817, 7866, 44074,44077,5662, + 381, 44053,1044, 2280, 15017,1325, 44056,511, 363, 363, 44058,44060,44062,8403, 44063,10997,6555, 490, 44059,7892, 490, 3284, 44061,5017, 10734,317, 4925, + 371, 490, 490, 9174, 44064,317, 44065,317, 17095,44066,317, 351, 5736, 5663, 44069,350, 317, 44070,317, 44071,351, 3987, 6817, 7866, 44074,44077,5662, 350, 466, 317, 44080,351, 44075,42720,44076,44078,44079,2080, 382, 44082,8296, 1060, 381, 317, 390, 44085,44092,44099,44102,44109,44111,44113,44118,44120, - 44124,44127,1444, 44128,44130,44139,565, 44140,44144,363, 42897,5163, 317, 44086,43909,317, 44087,317, 44089,317, 44090,317, 44091,24903,6900, 6901, 317, - 44088,317, 44093,44094,44097,44095,44096,44098,44100,12731,44101,428, 490, 317, 545, 6600, 343, 565, 5624, 343, 5295, 317, 44103,490, 44104,44105,2086, + 44124,44127,1444, 44128,44130,44139,565, 44140,44144,363, 42897,5163, 317, 44086,43909,317, 44087,317, 44089,317, 44090,317, 44091,24903,6900, 6901, 317, + 44088,317, 44093,44094,44097,44095,44096,44098,44100,12731,44101,428, 490, 317, 545, 6600, 343, 565, 5624, 343, 5295, 317, 44103,490, 44104,44105,2086, 44106,342, 365, 317, 44107,490, 5295, 2291, 2233, 44108,44110,8096, 31290,490, 365, 20919,317, 317, 44112,317, 343, 8855, 44114,44115,44116,44117,44119, - 351, 44121,44122,44123,44125,44126,550, 4984, 351, 5163, 317, 32397,356, 317, 1791, 317, 9567, 317, 317, 317, 343, 396, 317, 363, 390, 317, 490, - 44129,370, 44131,44136,44137,9473, 350, 44138,38654,317, 317, 44132,5624, 44133,44134,44135,44141,317, 44142,44143,3284, 15461,350, 44146,1020, 317, 2291, + 351, 44121,44122,44123,44125,44126,550, 4984, 351, 5163, 317, 32397,356, 317, 1791, 317, 9567, 317, 317, 317, 343, 396, 317, 363, 390, 317, 490, + 44129,370, 44131,44136,44137,9473, 350, 44138,38654,317, 317, 44132,5624, 44133,44134,44135,44141,317, 44142,44143,3284, 15461,350, 44146,1020, 317, 2291, 36630,317, 44147,44149,44152,350, 44157,343, 44164,2391, 44165,44170,44174,44176,44177,5241, 590, 44150,553, 363, 44151,44153,44155,44156,343, 44154,44158, - 44159,2086, 490, 44160,44161,317, 2381, 317, 44162,44163,363, 351, 363, 10625,363, 44166,317, 351, 5836, 44167,44168,44169,44171,44172,16860,350, 317, + 44159,2086, 490, 44160,44161,317, 2381, 317, 44162,44163,363, 351, 363, 10625,363, 44166,317, 351, 5836, 44167,44168,44169,44171,44172,16860,350, 317, 317, 362, 7568, 44173,317, 7949, 317, 44175,1108, 8304, 350, 345, 44178,44179,317, 11346,8828, 490, 44181,44182,44183,44185,44218,44219,44220,44227,44231, - 16187,44232,6388, 385, 44236,44248,44250,44254,44259,44266,44269,44274,44280,44287,44288,44289,44290,44184,44186,44188,44189,642, 44193,44198,6600, 44200,2163, + 16187,44232,6388, 385, 44236,44248,44250,44254,44259,44266,44269,44274,44280,44287,44288,44289,44290,44184,44186,44188,44189,642, 44193,44198,6600, 44200,2163, 44202,44209,553, 44211,44213,44214,317, 362, 44187,363, 2585, 44190,401, 44191,44192,2003, 44194,44195,44196,44197,44199,2156, 380, 3688, 345, 44201,44203, 490, 44204,44208,317, 10604,8281, 44205,44206,44207,3387, 44210,44212,1108, 371, 371, 365, 345, 44215,44216,317, 44217,7495, 317, 8296, 2222, 2108, 23670, - 44221,44223,44225,6002, 316, 44226,44222,44224,433, 1943, 44228,44229,44230,553, 490, 317, 5217, 1109, 317, 12642,6228, 317, 317, 317, 2035, 317, 317, + 44221,44223,44225,6002, 316, 44226,44222,44224,433, 1943, 44228,44229,44230,553, 490, 317, 5217, 1109, 317, 12642,6228, 317, 317, 317, 2035, 317, 317, 4965, 380, 490, 317, 350, 2086, 44233,44234,44235,490, 2845, 7928, 317, 6614, 7116, 317, 1160, 317, 490, 15017,317, 2845, 490, 1160, 44237,11114,44238, - 44240,44241,44243,44245,4984, 363, 1358, 317, 44239,13003,317, 332, 44242,316, 339, 396, 317, 44244,339, 365, 9768, 317, 363, 44246,363, 44247,404, - 355, 44249,34520,339, 317, 317, 317, 4984, 490, 317, 11607,44251,12563,389, 44253,317, 317, 5120, 317, 44252,5836, 1060, 5295, 44255,317, 317, 365, + 44240,44241,44243,44245,4984, 363, 1358, 317, 44239,13003,317, 332, 44242,316, 339, 396, 317, 44244,339, 365, 9768, 317, 363, 44246,363, 44247,404, + 355, 44249,34520,339, 317, 317, 317, 4984, 490, 317, 11607,44251,12563,389, 44253,317, 317, 5120, 317, 44252,5836, 1060, 5295, 44255,317, 317, 365, 490, 317, 317, 317, 317, 44256,44258,44257,1160, 317, 490, 1481, 7585, 33733,317, 44260,44262,9012, 371, 44261,363, 11844,1109, 44263,44264,44265,44267, - 44268,1358, 11186,317, 350, 317, 2715, 345, 8526, 14353,44270,7850, 44272,44271,44273,339, 18329,349, 5105, 12316,9450, 44275,44278,365, 362, 7129, 317, + 44268,1358, 11186,317, 350, 317, 2715, 345, 8526, 14353,44270,7850, 44272,44271,44273,339, 18329,349, 5105, 12316,9450, 44275,44278,365, 362, 7129, 317, 30114,1358, 44276,44277,44279,7594, 44281,44285,317, 44282,28454,44283,44284,44286,363, 345, 12756,351, 15326,317, 317, 317, 23858,44292,44295,11236,44298, - 44300,44307,44309,44312,16187,8296, 44313,44319,44325,44332,44334,5624, 371, 6834, 317, 317, 12226,44293,1481, 317, 44294,371, 44296,371, 380, 44297,317, + 44300,44307,44309,44312,16187,8296, 44313,44319,44325,44332,44334,5624, 371, 6834, 317, 317, 12226,44293,1481, 317, 44294,371, 44296,371, 380, 44297,317, 317, 44299,317, 7916, 1160, 13196,565, 44301,44302,350, 385, 44304,44305,44303,44306,1160, 40281,317, 317, 44308,2219, 44310,370, 317, 317, 44311,17471, 351, 44314,44316,44318,44315,371, 6600, 1044, 44317,371, 371, 11844,371, 8274, 5832, 44320,44322,44323,350, 362, 350, 44324,31786,317, 44321,317, 12226, 317, 741, 362, 9059, 5105, 317, 450, 370, 317, 317, 1992, 317, 343, 44326,44328,466, 2222, 362, 11249,13103,44330,2178, 44327,596, 363, 317, 44329, 317, 36472,317, 44331,44333,490, 490, 365, 317, 317, 11347,404, 2073, 11347,949, 44336,44341,44344,44351,44369,490, 343, 11607,44363,44374,44376,44380, 44383,44389,44393,490, 44395,44396,367, 9702, 1020, 2177, 44337,1481, 44338,8926, 44339,2035, 23666,44340,350, 44342,44343,2732, 44345,44346,11373,44347,44348, 317, 363, 10041,44349,2035, 44350,44352,44357,44360,44361,44363,44365,44367,44368,44353,527, 317, 44354,44355,18611,363, 44356,350, 44358,44359,317, 18611, - 317, 363, 9859, 317, 317, 44362,2272, 363, 44364,44366,6318, 6690, 317, 633, 363, 317, 44370,44372,44373,317, 1266, 317, 44371,2077, 317, 317, 317, - 317, 44375,317, 317, 13385,44377,365, 317, 44378,44379,317, 44381,343, 44382,44384,44386,390, 2035, 44387,44385,490, 44388,490, 44390,44391,343, 350, + 317, 363, 9859, 317, 317, 44362,2272, 363, 44364,44366,6318, 6690, 317, 633, 363, 317, 44370,44372,44373,317, 1266, 317, 44371,2077, 317, 317, 317, + 317, 44375,317, 317, 13385,44377,365, 317, 44378,44379,317, 44381,343, 44382,44384,44386,390, 2035, 44387,44385,490, 44388,490, 44390,44391,343, 350, 2631, 317, 44392,490, 490, 44394,1430, 5087, 11198,24185,450, 5896, 44397,32757,350, 44398,317, 44012,44399,42966,8083, 419, 350, 351, 44401,317, 44403, - 44405,44406,44407,317, 44408,44410,44412,44415,44416,44402,4982, 5662, 3751, 578, 5662, 44404,345, 490, 317, 11635,44409,5120, 317, 44411,317, 490, 390, + 44405,44406,44407,317, 44408,44410,44412,44415,44416,44402,4982, 5662, 3751, 578, 5662, 44404,345, 490, 317, 11635,44409,5120, 317, 44411,317, 490, 390, 44413,380, 44414,2317, 16679,44417,44419,44422,44423,2462, 365, 39914,317, 490, 44420,343, 490, 44421,18702,370, 5661, 365, 351, 317, 24903,44425,44432, 44433,1481, 3284, 25643,317, 5266, 2078, 490, 44426,6834, 44427,34721,5295, 44428,44429,27266,44430,490, 343, 11388,2081, 317, 2322, 2110, 6851, 317, 44431, 2844, 44435,19466,1347, 8464, 44438,10345,44440,44441,558, 6089, 44436,44437,317, 27266,317, 6227, 44439,10476,4965, 2366, 4984, 4943, 343, 317, 317, 44442, @@ -9281,157 +9276,157 @@ static const unsigned int ChildLocs[185261] = 44478,320, 44480,44469,607, 20465,44472,44473,44476,44477,44479,607, 44482,345, 44483,427, 381, 356, 44486,44490,382, 605, 365, 396, 332, 44484,44485, 44487,44488,44489,44491,317, 44492,44494,44499,490, 44495,44496,44497,44498,44500,44501,44502,44505,44521,44528,44534,44543,44559,44562,44565,44567,44578,44579, 44587,44616,44634,44679,44697,44703,44747,44759,44778,44779,44785,2134, 44791,44804,44503,44504,390, 44506,44507,44508,2022, 44509,15179,44513,44514,44517,44518, - 44519,343, 1347, 317, 370, 44510,317, 44511,44512,1345, 1030, 317, 5661, 363, 8392, 44515,44516,2212, 1345, 2022, 6036, 15745,317, 4984, 9425, 466, 2022, + 44519,343, 1347, 317, 370, 44510,317, 44511,44512,1345, 1030, 317, 5661, 363, 8392, 44515,44516,2212, 1345, 2022, 6036, 15745,317, 4984, 9425, 466, 2022, 12696,317, 345, 317, 44520,2022, 44522,365, 44526,351, 44527,1999, 1347, 1481, 44523,44524,44525,44529,2568, 490, 44530,44531,44532,44533,44535,370, 44538, 2022, 11511,44539,317, 44536,11341,44537,44540,44541,44542,3284, 11607,44544,390, 44545,44546,5683, 44548,44549,16825,44551,44553,44555,44556,44558,350, 20380, - 350, 44547,4965, 350, 363, 10185,363, 12151,44550,3999, 317, 466, 317, 4984, 44552,370, 427, 317, 427, 317, 4952, 317, 390, 317, 15646,3999, 385, - 44554,44557,490, 11249,1453, 317, 317, 317, 363, 390, 351, 317, 363, 317, 44547,350, 44560,44561,44563,11211,44564,317, 317, 30314,6036, 5656, 605, - 2222, 317, 317, 343, 44566,317, 317, 419, 5623, 43123,44568,44569,11388,365, 44570,44571,7568, 44572,317, 6917, 44573,44574,44576,350, 351, 2021, 2022, - 317, 363, 6627, 2146, 351, 370, 317, 363, 9473, 38447,16129,44575,490, 350, 11249,317, 350, 553, 13219,317, 12731,44577,2584, 317, 350, 6228, 4984, + 350, 44547,4965, 350, 363, 10185,363, 12151,44550,3999, 317, 466, 317, 4984, 44552,370, 427, 317, 427, 317, 4952, 317, 390, 317, 15646,3999, 385, + 44554,44557,490, 11249,1453, 317, 317, 317, 363, 390, 351, 317, 363, 317, 44547,350, 44560,44561,44563,11211,44564,317, 317, 30314,6036, 5656, 605, + 2222, 317, 317, 343, 44566,317, 317, 419, 5623, 43123,44568,44569,11388,365, 44570,44571,7568, 44572,317, 6917, 44573,44574,44576,350, 351, 2021, 2022, + 317, 363, 6627, 2146, 351, 370, 317, 363, 9473, 38447,16129,44575,490, 350, 11249,317, 350, 553, 13219,317, 12731,44577,2584, 317, 350, 6228, 4984, 317, 5661, 317, 44580,317, 44581,44582,44583,490, 12756,381, 44584,44585,44586,44588,44590,16438,44593,44594,2222, 44605,6600, 14222,44612,317, 44613,44615, 1020, 350, 44589,390, 317, 14353,44591,44592,971, 9224, 350, 10149,1519, 44595,317, 44596,5040, 44602,44597,44598,44600,44599,44601,44603,332, 44604,44606, 44607,44609,362, 2222, 44610,37254,427, 44611,1347, 317, 317, 1230, 16093,317, 350, 1347, 31475,44608,381, 317, 7401, 5662, 317, 1160, 350, 1992, 24036, - 9649, 317, 317, 4943, 317, 781, 1266, 317, 317, 633, 2366, 317, 317, 317, 317, 317, 6089, 370, 390, 44614,7734, 1358, 29210,18840,351, 350, 363, + 9649, 317, 317, 4943, 317, 781, 1266, 317, 317, 633, 2366, 317, 317, 317, 317, 317, 6089, 370, 390, 44614,7734, 1358, 29210,18840,351, 350, 363, 317, 317, 317, 380, 44617,44618,3075, 16865,350, 44621,44624,44625,44626,2021, 8658, 5793, 317, 370, 44619,351, 44620,1189, 317, 44622,345, 350, 44623, - 351, 596, 16022,317, 351, 5309, 317, 33733,2222, 317, 44627,44628,44629,350, 363, 44630,44632,44633,5836, 397, 44631,370, 363, 6412, 12696,20487,363, + 351, 596, 16022,317, 351, 5309, 317, 33733,2222, 317, 44627,44628,44629,350, 363, 44630,44632,44633,5836, 397, 44631,370, 363, 6412, 12696,20487,363, 949, 44635,44637,44645,9624, 357, 44647,365, 2134, 2022, 44649,44650,44662,17683,2391, 44663,44669,44674,44676,44678,363, 370, 5163, 44636,317, 5943, 44638, 44639,1992, 343, 317, 44641,44643,380, 44640,317, 605, 44642,5962, 317, 490, 44644,14170,6547, 44646,16093,370, 2391, 8490, 7678, 17033,390, 317, 38415, 356, 317, 2078, 317, 10956,350, 370, 44648,490, 363, 404, 44651,5661, 44652,10946,44660,363, 3075, 44661,370, 22742,317, 356, 4943, 44653,44654,10946, 44655,44656,44657,44658,12154,44659,2391, 317, 14289,2328, 21074,317, 370, 351, 1588, 12946,317, 8977, 28479,390, 365, 317, 490, 1459, 332, 350, 38196, - 30398,44664,44666,363, 553, 44665,44667,44668,317, 44670,351, 389, 350, 363, 317, 44671,6089, 44672,44673,44675,7695, 32866,44677,7567, 5055, 317, 1347, - 489, 44680,44684,44685,9298, 10506,44686,317, 4943, 44693,363, 44681,44682,44683,44687,44690,44688,44689,317, 44691,44692,44694,44695,44696,7142, 44698,343, + 30398,44664,44666,363, 553, 44665,44667,44668,317, 44670,351, 389, 350, 363, 317, 44671,6089, 44672,44673,44675,7695, 32866,44677,7567, 5055, 317, 1347, + 489, 44680,44684,44685,9298, 10506,44686,317, 4943, 44693,363, 44681,44682,44683,44687,44690,44688,44689,317, 44691,44692,44694,44695,44696,7142, 44698,343, 44700,23019,44701,317, 44699,41304,381, 6036, 17988,44702,6917, 350, 44704,44709,44711,44714,44718,44719,5616, 44720,44722,44723,44727,44732,44733,44734,44736, - 44743,1020, 44745,44746,32298,490, 490, 24661,44705,44706,44707,44708,44710,5926, 317, 317, 317, 24455,5238, 317, 44712,317, 380, 44713,350, 396, 317, + 44743,1020, 44745,44746,32298,490, 490, 24661,44705,44706,44707,44708,44710,5926, 317, 317, 317, 24455,5238, 317, 44712,317, 380, 44713,350, 396, 317, 433, 44715,596, 10506,317, 44717,9666, 44716,501, 3869, 351, 44210,12731,16187,362, 24224,44721,44724,345, 21303,2261, 7892, 44725,44726,44728,44729,44730, - 44731,317, 553, 15618,317, 317, 317, 317, 30200,338, 351, 5353, 466, 44735,5037, 1160, 14474,370, 44737,490, 12616,363, 317, 44740,605, 44738,350, - 44739,44741,44742,363, 317, 349, 44744,317, 345, 7949, 2178, 370, 44748,44749,44752,343, 44753,350, 44754,44757,2391, 2298, 317, 13638,317, 317, 9981, + 44731,317, 553, 15618,317, 317, 317, 317, 30200,338, 351, 5353, 466, 44735,5037, 1160, 14474,370, 44737,490, 12616,363, 317, 44740,605, 44738,350, + 44739,44741,44742,363, 317, 349, 44744,317, 345, 7949, 2178, 370, 44748,44749,44752,343, 44753,350, 44754,44757,2391, 2298, 317, 13638,317, 317, 9981, 12744,44750,317, 44751,351, 6036, 466, 3079, 44755,4738, 350, 350, 363, 44756,8178, 317, 362, 511, 44758,6917, 350, 13962,5828, 317, 7214, 501, 44760, - 44761,44768,44770,380, 350, 350, 44771,44772,44773,37223,2298, 44762,427, 44763,44766,44767,317, 317, 44764,2260, 44765,44769,317, 565, 385, 501, 466, - 363, 11607,44774,4738, 44776,5662, 350, 17926,3884, 44775,351, 15852,2184, 362, 44777,350, 1992, 2222, 949, 4984, 44780,44782,565, 44784,370, 16620,1020, - 317, 44781,390, 317, 373, 44783,1300, 317, 633, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 44786,44789,389, 317, 2058, - 317, 44787,2403, 44788,44790,380, 44792,550, 1914, 5447, 1962, 466, 44794,33877,44796,3999, 355, 44798,4980, 44801,44793,44795,476, 12696,317, 44797,574, - 7678, 351, 5241, 44799,6188, 44800,363, 21302,44802,44803,351, 373, 2533, 351, 44806,34834,44807,33236,44809,351, 44811,44814,44815,44808,607, 6222, 608, + 44761,44768,44770,380, 350, 350, 44771,44772,44773,37223,2298, 44762,427, 44763,44766,44767,317, 317, 44764,2260, 44765,44769,317, 565, 385, 501, 466, + 363, 11607,44774,4738, 44776,5662, 350, 17926,3884, 44775,351, 15852,2184, 362, 44777,350, 1992, 2222, 949, 4984, 44780,44782,565, 44784,370, 16620,1020, + 317, 44781,390, 317, 373, 44783,1300, 317, 633, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 44786,44789,389, 317, 2058, + 317, 44787,2403, 44788,44790,380, 44792,550, 1914, 5447, 1962, 466, 44794,33877,44796,3999, 355, 44798,4980, 44801,44793,44795,476, 12696,317, 44797,574, + 7678, 351, 5241, 44799,6188, 44800,363, 21302,44802,44803,351, 373, 2533, 351, 44806,34834,44807,33236,44809,351, 44811,44814,44815,44808,607, 6222, 608, 1108, 44810,44812,44813,11097,1511, 317, 40747,44817,44818,44819,44821,44873,44886,44893,44895,44903,44932,44936,44943,44944,44948,317, 44822,44825,44830,38740, 44832,44834,7168, 44837,44841,44850,317, 44857,44863,44864,1044, 6375, 44869,44870,44823,44824,44826,44827,44828,44829,11366,351, 44831,317, 2533, 44833,10939, 1444, 44835,44836,396, 5205, 44838,44839,1459, 317, 490, 371, 1109, 380, 5120, 25754,44840,3967, 317, 44842,345, 44843,317, 44844,32563,427, 44696,44845, 44846,44847,44848,44849,6967, 44851,44852,317, 317, 317, 490, 317, 44853,2533, 40218,370, 427, 317, 389, 2073, 44854,44855,44856,44858,317, 44859,44861, - 44862,28408,44860,1044, 1044, 44865,44866,367, 365, 44867,363, 44868,44871,44872,3611, 1347, 44874,380, 1109, 44875,44879,44884,44885,44876,44877,44878,332, + 44862,28408,44860,1044, 1044, 44865,44866,367, 365, 44867,363, 44868,44871,44872,3611, 1347, 44874,380, 1109, 44875,44879,44884,44885,44876,44877,44878,332, 44880,44881,27874,44882,44883,317, 11825,351, 44887,44888,44890,317, 44891,5419, 490, 44889,365, 511, 365, 2631, 44892,317, 44894,44896,44897,317, 44898, - 44899,44900,44901,44902,565, 44904,44911,490, 419, 44913,7254, 44917,4984, 44919,44924,362, 44927,317, 317, 44905,44908,44906,44907,44909,44910,44912,362, - 317, 317, 44914,44915,8281, 44916,44918,44920,343, 44921,44922,44923,354, 42279,490, 44925,317, 44926,605, 44928,5838, 44929,44930,44931,44933,44934,1880, + 44899,44900,44901,44902,565, 44904,44911,490, 419, 44913,7254, 44917,4984, 44919,44924,362, 44927,317, 317, 44905,44908,44906,44907,44909,44910,44912,362, + 317, 317, 44914,44915,8281, 44916,44918,44920,343, 44921,44922,44923,354, 42279,490, 44925,317, 44926,605, 44928,5838, 44929,44930,44931,44933,44934,1880, 44935,2073, 490, 590, 2035, 317, 317, 44937,44940,317, 44942,44938,317, 554, 44939,317, 44941,44945,490, 44946,44947,350, 44949,44950,44951,44956,44963, 44974,44985,45003,45007,45010,45012,45013,45014,45018,45075,150, 45176,45177,45181,45235,45259,45288,45291,45294,45296,45299,317, 490, 44952,44953,317, 44954, 44955,44957,44958,44961,350, 44962,1108, 365, 13269,6917, 44959,317, 44960,9303, 382, 390, 23516,44964,44965,44966,44969,44970,28250,30300,343, 32589,44971, 317, 2066, 6050, 44967,44968,2117, 5962, 380, 476, 44972,44973,428, 7916, 44975,362, 44978,317, 44983,44984,3987, 317, 44976,16717,343, 317, 317, 44977, - 44979,44982,44980,44981,317, 428, 7072, 404, 44986,14470,44987,44988,350, 44989,29864,44990,44991,1998, 44994,44998,45001,317, 45002,22460,2381, 350, 345, - 13638,31227,2222, 317, 351, 28795,343, 351, 2108, 4952, 362, 370, 317, 412, 9059, 351, 44992,343, 605, 44993,373, 382, 1108, 4984, 343, 44995,362, - 363, 490, 44996,11280,44997,44999,490, 45000,605, 43626,2222, 317, 317, 317, 13219,466, 8296, 317, 32298,351, 44629,45004,45005,45006,6402, 351, 3078, + 44979,44982,44980,44981,317, 428, 7072, 404, 44986,14470,44987,44988,350, 44989,29864,44990,44991,1998, 44994,44998,45001,317, 45002,22460,2381, 350, 345, + 13638,31227,2222, 317, 351, 28795,343, 351, 2108, 4952, 362, 370, 317, 412, 9059, 351, 44992,343, 605, 44993,373, 382, 1108, 4984, 343, 44995,362, + 363, 490, 44996,11280,44997,44999,490, 45000,605, 43626,2222, 317, 317, 317, 13219,466, 8296, 317, 32298,351, 44629,45004,45005,45006,6402, 351, 3078, 45008,45009,317, 45011,317, 371, 371, 8296, 317, 4965, 45015,22130,45016,45017,5423, 3283, 2078, 590, 45019,45020,45024,45027,11443,45029,45030,45032,45040, 45042,45060,45063,45064,32105,8301, 45070,45073,350, 45074,350, 9224, 2081, 2272, 45021,45022,45023,2260, 9809, 317, 11235,317, 6318, 883, 14341,350, 11786, - 45025,28512,45026,393, 381, 556, 45028,3529, 14143,351, 45031,1358, 351, 363, 45033,45034,45037,45035,883, 45036,45038,45039,45041,345, 345, 418, 2590, - 317, 949, 1087, 45043,8023, 45046,2171, 45050,8301, 45054,45056,1194, 8301, 45057,589, 7035, 317, 558, 317, 45044,317, 45045,317, 317, 45047,16093,317, - 363, 2081, 45048,317, 45049,574, 681, 9088, 8258, 740, 8344, 1155, 1353, 31745,362, 317, 45051,16093,371, 317, 388, 16093,2081, 45052,363, 317, 345, - 45053,317, 10487,351, 20869,404, 5809, 363, 45055,363, 10149,4943, 317, 45058,45059,45061,351, 9609, 573, 19544,317, 45062,1033, 2584, 1020, 14320,317, + 45025,28512,45026,393, 381, 556, 45028,3529, 14143,351, 45031,1358, 351, 363, 45033,45034,45037,45035,883, 45036,45038,45039,45041,345, 345, 418, 2590, + 317, 949, 1087, 45043,8023, 45046,2171, 45050,8301, 45054,45056,1194, 8301, 45057,589, 7035, 317, 558, 317, 45044,317, 45045,317, 317, 45047,16093,317, + 363, 2081, 45048,317, 45049,574, 681, 9088, 8258, 740, 8344, 1155, 1353, 31745,362, 317, 45051,16093,371, 317, 388, 16093,2081, 45052,363, 317, 345, + 45053,317, 10487,351, 20869,404, 5809, 363, 45055,363, 10149,4943, 317, 45058,45059,45061,351, 9609, 573, 19544,317, 45062,1033, 2584, 1020, 14320,317, 10255,45065,45066,317, 5054, 45068,363, 8117, 45067,45069,949, 363, 45071,545, 45072,351, 343, 363, 317, 317, 317, 317, 37029,949, 371, 45076,45084, - 45085,30214,350, 45086,45090,45091,2022, 2022, 2110, 2022, 45077,45078,12141,1160, 45082,5105, 45079,317, 740, 418, 45080,317, 13269,45081,1160, 5105, 9878, + 45085,30214,350, 45086,45090,45091,2022, 2022, 2110, 2022, 45077,45078,12141,1160, 45082,5105, 45079,317, 740, 418, 45080,317, 13269,45081,1160, 5105, 9878, 38267,45083,45087,45088,3079, 1160, 5105, 8083, 317, 317, 317, 317, 45089,380, 343, 404, 45092,45094,45102,45115,45121,317, 45145,45146,45151,10149,45157, 45161,45163,45165,45171,5037, 404, 45174,45093,362, 317, 317, 5255, 5634, 6138, 8100, 2328, 45095,6036, 45100,317, 343, 32011,10699,45096,45097,45098,45099, - 45101,9779, 317, 22469,20909,45103,45104,1992, 45110,2571, 45112,45114,317, 4949, 6355, 5105, 45105,381, 45106,9695, 11905,5662, 2021, 45107,45108,45109,5055, + 45101,9779, 317, 22469,20909,45103,45104,1992, 45110,2571, 45112,45114,317, 4949, 6355, 5105, 45105,381, 45106,9695, 11905,5662, 2021, 45107,45108,45109,5055, 2188, 317, 44550,45111,317, 9938, 382, 317, 45113,384, 381, 45116,7214, 45118,5748, 45117,45119,45120,42654,633, 633, 15346,7942, 45122,23391,45124,45126, 45127,45128,45130,1588, 12598,45132,45133,45143,45144,6089, 45123,11266,317, 45125,427, 479, 45129,317, 45131,317, 381, 370, 33256,317, 317, 45134,12815, - 2024, 45135,5017, 15983,45137,45138,3075, 317, 45139,5037, 45142,317, 7590, 9914, 448, 45136,2117, 363, 428, 45140,45141,363, 370, 2063, 2210, 363, 370, + 2024, 45135,5017, 15983,45137,45138,3075, 317, 45139,5037, 45142,317, 7590, 9914, 448, 45136,2117, 363, 428, 45140,45141,363, 370, 2063, 2210, 363, 370, 45147,45148,4984, 343, 345, 317, 45150,356, 45149,317, 605, 45152,363, 45156,45153,317, 45154,45155,45158,45159,45160,15738,12756,551, 11236,317, 10172, - 351, 16093,362, 317, 381, 317, 32982,371, 4965, 15853,363, 404, 45162,45164,8083, 45166,45167,4738, 5838, 45168,10149,45169,45170,6817, 317, 390, 317, + 351, 16093,362, 317, 381, 317, 32982,371, 4965, 15853,363, 404, 45162,45164,8083, 45166,45167,4738, 5838, 45168,10149,45169,45170,6817, 317, 390, 317, 1943, 1060, 439, 6036, 605, 42105,317, 6917, 363, 3361, 45172,4943, 350, 45173,2134, 1588, 37194,317, 7797, 12731,45175,343, 5962, 345, 6409, 14616,45178, 350, 5159, 5793, 25453,45179,317, 316, 45180,16651,10223,317, 351, 317, 45182,45185,45186,45195,45196,45199,15732,350, 15513,45219,8178, 45222,45224,45232, 7729, 19617,22466,45233,45183,45184,1345, 1109, 317, 5898, 343, 317, 6420, 45187,5644, 12525,13100,7866, 45188,45191,36523,350, 3529, 45189,45190,45192,45193, 45194,363, 3717, 26250,7776, 45197,317, 33429,2420, 15108,45198,949, 1044, 45200,45201,45205,23842,45208,45214,362, 39187,45216,45217,8852, 45218,45202,45203, 45204,370, 11114,45206,317, 317, 45207,345, 45209,45210,45211,45212,45213,439, 45215,3999, 370, 543, 5037, 338, 45220,339, 45221,45223,45225,16433,45229, 45230,45226,9059, 45227,343, 362, 350, 317, 45228,9059, 5662, 45231,10476,317, 363, 11158,317, 15983,350, 363, 317, 45234,332, 317, 7638, 317, 45236, - 19507,45238,45240,45243,7490, 11249,45245,350, 4965, 332, 45246,45255,45258,1481, 317, 2171, 45237,317, 45239,317, 45241,7698, 6780, 45242,1588, 29531,1881, + 19507,45238,45240,45243,7490, 11249,45245,350, 4965, 332, 45246,45255,45258,1481, 317, 2171, 45237,317, 45239,317, 45241,7698, 6780, 45242,1588, 29531,1881, 3284, 45244,317, 2219, 5883, 381, 949, 45247,45248,362, 45250,490, 11249,45253,350, 345, 44345,317, 373, 371, 317, 343, 2593, 345, 317, 317, 45249, 317, 317, 371, 317, 45251,45252,317, 1160, 45254,45256,6917, 350, 317, 45257,317, 5619, 590, 45260,45263,45267,44770,45270,16626,350, 45271,45272,45284, 317, 6900, 45261,8403, 28934,45262,381, 45264,45265,3999, 317, 5105, 45266,317, 351, 362, 317, 14062,8301, 7428, 45268,45269,2110, 2631, 1060, 32867,15457, - 363, 2272, 37029,45273,45275,45278,45279,350, 317, 45281,4980, 45282,45274,6420, 8486, 5897, 317, 362, 404, 45276,45277,1347, 2219, 20055,45280,27003,7368, + 363, 2272, 37029,45273,45275,45278,45279,350, 317, 45281,4980, 45282,45274,6420, 8486, 5897, 317, 362, 404, 45276,45277,1347, 2219, 20055,45280,27003,7368, 6228, 317, 317, 27039,12154,45283,317, 45285,45286,45287,2402, 363, 15221,45289,45290,4965, 45292,45293,317, 1950, 2322, 2581, 45295,45297,45298,2035, 35158, - 45300,45306,45301,351, 45302,45303,45304,45305,343, 45307,317, 45309,7191, 45310,33155,45314,45317,45320,45322,45311,11113,45313,11113,45312,439, 5896, 362, + 45300,45306,45301,351, 45302,45303,45304,45305,343, 45307,317, 45309,7191, 45310,33155,45314,45317,45320,45322,45311,11113,45313,11113,45312,439, 5896, 362, 501, 380, 4952, 45315,396, 45316,4589, 45318,45319,45321,317, 45323,45324,45326,45329,45327,45328,1087, 2051, 45330,45331,317, 45332,45333,45337,45362,45412, 45449,45452,45473,45486,45334,45335,45336,45338,45339,401, 5570, 1033, 45340,45341,12696,45344,490, 45345,45346,45347,45348,45352,45353,10820,45354,45357,45359, 7949, 6596, 18329,590, 462, 317, 45342,45343,317, 350, 390, 11626,34975,24260,2222, 317, 15480,343, 317, 317, 21037,45349,339, 12616,45351,45350,34964, 31580,317, 5896, 4984, 27286,362, 317, 4984, 33962,39082,6917, 45355,351, 45356,317, 351, 317, 350, 45358,350, 363, 462, 45360,462, 5836, 45361,45363, - 45364,45368,45370,45373,1020, 363, 45380,45392,45399,45401,45403,371, 45407,45408,45409,45411,16979,45365,6546, 45366,45367,490, 45369,351, 2022, 350, 317, + 45364,45368,45370,45373,1020, 363, 45380,45392,45399,45401,45403,371, 45407,45408,45409,45411,16979,45365,6546, 45366,45367,490, 45369,351, 2022, 350, 317, 17469,11709,362, 45371,45372,317, 7689, 45374,45375,45376,45377,45378,45379,45381,4980, 351, 11940,45382,45383,5223, 351, 11349,363, 2381, 28588,45384,24038, 32997,45386,45387,5662, 28079,45388,2503, 45389,45385,3079, 11663,317, 6593, 14835,7650, 25352,2553, 2212, 45390,45391,317, 45393,45394,45396,343, 1358, 45398, - 11198,390, 45395,2551, 45397,317, 9644, 317, 45400,1358, 8177, 45402,45404,39520,350, 45406,332, 45405,971, 7866, 4738, 1912, 1358, 45410,350, 362, 5626, + 11198,390, 45395,2551, 45397,317, 9644, 317, 45400,1358, 8177, 45402,45404,39520,350, 45406,332, 45405,971, 7866, 4738, 1912, 1358, 45410,350, 362, 5626, 348, 317, 45413,45415,350, 45419,45425,45443,45444,45445,2845, 317, 317, 45414,1998, 317, 317, 317, 45416,350, 350, 45417,45418,45420,10316,45422,45424, - 24035,317, 13553,45421,317, 45423,4925, 371, 381, 45426,45428,2108, 45440,22130,45442,20869,45427,10021,1962, 317, 32606,450, 45429,45431,32760,45437,362, + 24035,317, 13553,45421,317, 45423,4925, 371, 381, 45426,45428,2108, 45440,22130,45442,20869,45427,10021,1962, 317, 32606,450, 45429,45431,32760,45437,362, 350, 20684,45439,45430,45432,45436,7949, 45433,45434,45435,28588,20672,45438,317, 20672,45441,27614,317, 365, 9938, 2134, 11040,2108, 45446,45448,45447,45450, 45451,45453,45458,45460,45461,35530,2334, 343, 1060, 45463,45464,45465,2134, 45469,45472,2004, 363, 45454,45456,45455,45457,371, 45459,371, 20123,350, 45462, 317, 4477, 317, 15326,371, 317, 8639, 45466,371, 45468,45467,317, 11347,5163, 350, 8296, 14353,45470,45471,45474,371, 381, 45477,45478,45479,45480,45481, 45483,45484,45485,350, 317, 317, 351, 45475,45476,465, 566, 2568, 350, 4965, 317, 362, 9521, 501, 45482,317, 18460,15047,317, 317, 5392, 1345, 45488, 317, 45489,45492,45493,45494,45495,2889, 45497,45500,45490,45491,317, 381, 1108, 26872,20465,381, 1100, 45496,45498,45499,45501,339, 45516,45530,45557,45558, - 1044, 45584,367, 45595,12062,45502,45503,45506,396, 3338, 343, 380, 45507,45510,45512,45515,24119,345, 317, 317, 5624, 343, 45504,397, 45505,37816,317, + 1044, 45584,367, 45595,12062,45502,45503,45506,396, 3338, 343, 380, 45507,45510,45512,45515,24119,345, 317, 317, 5624, 343, 45504,397, 45505,37816,317, 4591, 12062,7865, 45508,1194, 45509,8325, 5223, 45511,317, 317, 45513,317, 45514,317, 351, 1383, 8488, 373, 45517,471, 2298, 45518,6704, 45521,45523,45524, 45525,45526,11147,465, 45527,45528,380, 5809, 40032,14905,343, 45519,45520,439, 466, 317, 38267,317, 45522,380, 15745,24815,317, 380, 2222, 23032,25111, 539, 2390, 45529,8177, 45531,45539,45543,45544,45549,317, 2381, 45550,45553,45554,596, 2021, 27199,45532,45533,45536,362, 45538,1160, 28972,45534,370, 45535, 2571, 317, 45537,2134, 350, 45540,45542,2134, 45541,1325, 19617,343, 45545,45546,6996, 317, 633, 14483,45547,5661, 14062,363, 45548,12348,2063, 317, 11442, 2680, 3124, 317, 317, 2134, 2577, 45551,45552,466, 343, 317, 9567, 1347, 418, 2022, 2134, 317, 45555,12429,45556,466, 343, 45559,45561,2134, 45564,45566, - 343, 45567,1060, 45569,45571,45572,45573,45575,45576,7941, 317, 6021, 380, 45560,317, 10796,4965, 24638,24899,45562,1998, 22704,9124, 3999, 45563,317, 2134, + 343, 45567,1060, 45569,45571,45572,45573,45575,45576,7941, 317, 6021, 380, 45560,317, 10796,4965, 24638,24899,45562,1998, 22704,9124, 3999, 45563,317, 2134, 2507, 2298, 380, 45565,1135, 2298, 343, 2134, 317, 13433,1347, 45568,404, 27765,362, 317, 345, 14905,11347,490, 45570,317, 19324,15124,8274, 317, 45574, 3646, 396, 1358, 16310,45577,45578,45579,317, 9425, 5635, 404, 439, 45580,466, 404, 45581,317, 45582,45583,45585,45589,45591,2381, 45592,381, 45593,45586, 45587,45588,543, 16137,317, 2134, 45590,2551, 363, 363, 10081,10081,7214, 317, 45594,317, 501, 363, 2024, 363, 1108, 2035, 11280,45596,45598,45616,45632, 45643,45663,45667,45674,45694,45698,45700,45707,45747,45771,45827,45838,45856,45915,45964,45993,46024,46036,17323,46044,46048,45597,317, 45599,343, 45603,45607, 45608,45610,45611,317, 31849,45612,490, 371, 317, 365, 490, 45600,45602,45601,649, 1011, 45604,317, 45336,45606,45605,20237,317, 317, 45609,384, 45613, - 45614,11347,3284, 45615,45617,45618,45619,45626,45627,45628,2163, 45629,45630,45620,45623,16023,1347, 45624,350, 45625,45621,45622,6138, 371, 343, 3284, 317, + 45614,11347,3284, 45615,45617,45618,45619,45626,45627,45628,2163, 45629,45630,45620,45623,16023,1347, 45624,350, 45625,45621,45622,6138, 371, 343, 3284, 317, 317, 5223, 565, 19324,2004, 317, 20159,45631,351, 6834, 45633,45637,45638,16660,45639,317, 23594,971, 590, 45634,317, 370, 490, 45636,490, 36610,45635, - 551, 490, 11753,390, 45640,45641,45642,45644,45645,13653,45646,7871, 45647,362, 45650,45656,45658,45659,45661,2298, 380, 2022, 2087, 317, 37649,39082,511, - 2134, 45648,45649,2108, 350, 4965, 466, 9938, 350, 45651,45653,511, 553, 45652,317, 317, 45654,10561,1135, 45655,5896, 6598, 362, 2310, 317, 343, 2391, - 45657,15066,350, 350, 350, 317, 10626,45660,351, 350, 350, 343, 45662,11249,317, 15986,45664,317, 350, 362, 45665,404, 45666,343, 350, 362, 551, + 551, 490, 11753,390, 45640,45641,45642,45644,45645,13653,45646,7871, 45647,362, 45650,45656,45658,45659,45661,2298, 380, 2022, 2087, 317, 37649,39082,511, + 2134, 45648,45649,2108, 350, 4965, 466, 9938, 350, 45651,45653,511, 553, 45652,317, 317, 45654,10561,1135, 45655,5896, 6598, 362, 2310, 317, 343, 2391, + 45657,15066,350, 350, 350, 317, 10626,45660,351, 350, 350, 343, 45662,11249,317, 15986,45664,317, 350, 362, 45665,404, 45666,343, 350, 362, 551, 45668,33733,317, 350, 317, 45673,332, 45669,317, 2533, 45670,45671,45672,45675,45677,45678,45681,45682,317, 45690,385, 38154,45692,15330,590, 490, 39550, - 490, 45676,45679,45680,490, 3967, 5896, 9450, 45683,317, 45684,45685,8490, 3529, 363, 11196,350, 45686,45687,45688,45689,45691,343, 317, 45693,2078, 343, - 317, 45695,6388, 45696,40898,45697,15087,4965, 362, 12062,45699,317, 45701,45703,2073, 1109, 332, 45704,647, 45706,6318, 8937, 370, 45702,990, 390, 1481, - 11346,490, 332, 3987, 332, 45705,317, 45708,45710,14616,45712,45713,45716,45717,45720,45723,45727,45730,45731,27623,45743,45744,45745,33694,45746,3284, 490, - 317, 13638,566, 12668,45709,1109, 1962, 317, 317, 11347,490, 1943, 45711,317, 23524,317, 317, 363, 466, 363, 45714,317, 317, 9581, 45715,351, 883, + 490, 45676,45679,45680,490, 3967, 5896, 9450, 45683,317, 45684,45685,8490, 3529, 363, 11196,350, 45686,45687,45688,45689,45691,343, 317, 45693,2078, 343, + 317, 45695,6388, 45696,40898,45697,15087,4965, 362, 12062,45699,317, 45701,45703,2073, 1109, 332, 45704,647, 45706,6318, 8937, 370, 45702,990, 390, 1481, + 11346,490, 332, 3987, 332, 45705,317, 45708,45710,14616,45712,45713,45716,45717,45720,45723,45727,45730,45731,27623,45743,45744,45745,33694,45746,3284, 490, + 317, 13638,566, 12668,45709,1109, 1962, 317, 317, 11347,490, 1943, 45711,317, 23524,317, 317, 363, 466, 363, 45714,317, 317, 9581, 45715,351, 883, 317, 45718,2178, 4925, 348, 45719,317, 489, 43878,45721,5662, 8296, 45722,45724,33733,466, 45725,345, 11373,15030,363, 2405, 45726,363, 38240,45728,45729, - 45732,317, 45734,396, 370, 536, 2035, 45738,45739,381, 45741,37528,45742,371, 45733,45735,45736,45737,317, 45740,5838, 1044, 2521, 355, 351, 16187,317, - 317, 7000, 490, 45748,36210,45752,45753,2086, 45754,45757,45760,45761,45762,45769,490, 332, 317, 317, 45749,45751,317, 371, 332, 45750,2322, 317, 317, + 45732,317, 45734,396, 370, 536, 2035, 45738,45739,381, 45741,37528,45742,371, 45733,45735,45736,45737,317, 45740,5838, 1044, 2521, 355, 351, 16187,317, + 317, 7000, 490, 45748,36210,45752,45753,2086, 45754,45757,45760,45761,45762,45769,490, 332, 317, 317, 45749,45751,317, 371, 332, 45750,2322, 317, 317, 345, 345, 14820,317, 348, 7062, 45755,6318, 45756,45758,45759,332, 13638,11346,345, 349, 45763,45767,45764,45765,45766,45768,490, 332, 45770,350, 45772, 12352,45775,45777,45782,45784,45786,45789,401, 45801,490, 45802,45803,45807,45808,45816,11346,45823,45824,45773,365, 317, 45774,317, 363, 45776,317, 45778, 45779,45780,2742, 317, 317, 45781,3284, 31801,45783,433, 317, 317, 9350, 433, 45785,45787,317, 45788,317, 5896, 7428, 45790,45791,45795,363, 317, 45797, - 2078, 1108, 317, 371, 5120, 45792,45793,45794,8178, 45796,5896, 2310, 317, 45798,45799,45800,10058,380, 343, 380, 363, 11388,317, 317, 15107,45804,345, + 2078, 1108, 317, 371, 5120, 45792,45793,45794,8178, 45796,5896, 2310, 317, 45798,45799,45800,10058,380, 343, 380, 363, 11388,317, 317, 15107,45804,345, 45805,9549, 35421,490, 5619, 23247,3284, 45806,356, 3529, 2058, 45809,45810,45811,45812,317, 45813,317, 45814,3688, 45815,3632, 45817,45818,317, 365, 41933, - 45819,317, 317, 45820,45821,45822,380, 45825,317, 45826,317, 390, 44544,20779,45828,45831,45832,45833,1347, 16679,45835,7949, 45829,12696,343, 317, 317, - 45830,5087, 29132,332, 2631, 362, 343, 317, 317, 466, 317, 1108, 317, 317, 351, 45834,2355, 45836,317, 45837,45839,45841,45843,2222, 45845,9680, 1020, - 45848,45853,43697,44123,1108, 45840,317, 317, 1108, 317, 2391, 45842,15017,317, 7949, 2391, 45844,317, 45846,8099, 11198,45847,30913,45849,4738, 15581,317, - 317, 15424,45850,45852,317, 45851,45854,8296, 8100, 45855,317, 2279, 45857,45859,45860,45863,45869,45873,45874,39134,45875,2585, 45878,45880,45891,45893,490, + 45819,317, 317, 45820,45821,45822,380, 45825,317, 45826,317, 390, 44544,20779,45828,45831,45832,45833,1347, 16679,45835,7949, 45829,12696,343, 317, 317, + 45830,5087, 29132,332, 2631, 362, 343, 317, 317, 466, 317, 1108, 317, 317, 351, 45834,2355, 45836,317, 45837,45839,45841,45843,2222, 45845,9680, 1020, + 45848,45853,43697,44123,1108, 45840,317, 317, 1108, 317, 2391, 45842,15017,317, 7949, 2391, 45844,317, 45846,8099, 11198,45847,30913,45849,4738, 15581,317, + 317, 15424,45850,45852,317, 45851,45854,8296, 8100, 45855,317, 2279, 45857,45859,45860,45863,45869,45873,45874,39134,45875,2585, 45878,45880,45891,45893,490, 45894,45897,345, 45900,45909,45910,45911,317, 317, 380, 45858,23670,7711, 385, 317, 13392,12309,363, 317, 317, 45861,2381, 14561,45862,1347, 45864,45866, - 45867,45868,345, 345, 45865,371, 390, 362, 5836, 45870,45871,4925, 5295, 45872,317, 1347, 5840, 371, 339, 543, 317, 2387, 317, 45876,8099, 45877,490, - 5663, 45879,45881,45884,32952,4982, 45885,16494,362, 317, 45886,45889,317, 590, 45882,2117, 45883,8421, 16024,45887,45888,8178, 45890,390, 45892,490, 490, + 45867,45868,345, 345, 45865,371, 390, 362, 5836, 45870,45871,4925, 5295, 45872,317, 1347, 5840, 371, 339, 543, 317, 2387, 317, 45876,8099, 45877,490, + 5663, 45879,45881,45884,32952,4982, 45885,16494,362, 317, 45886,45889,317, 590, 45882,2117, 45883,8421, 16024,45887,45888,8178, 45890,390, 45892,490, 490, 490, 380, 2381, 317, 317, 45895,45896,7850, 4962, 6596, 317, 5212, 343, 13235,11709,2022, 45898,427, 317, 45899,471, 371, 45901,363, 45902,45903,45904, - 45905,45906,45907,45908,2107, 363, 489, 317, 317, 45912,45913,5836, 45914,45916,1601, 45919,45931,45932,45935,45939,45942,45944,45949,45951,45953,45962,8285, - 45963,371, 16910,490, 45917,45918,343, 5656, 45920,45924,317, 45921,317, 45922,45923,363, 45925,5836, 45929,45926,45928,371, 45927,45930,332, 8099, 351, - 45933,45934,490, 317, 490, 45936,351, 317, 45937,17471,317, 45938,317, 45940,45941,317, 363, 45943,11844,317, 11198,45945,11146,45946,490, 317, 1481, + 45905,45906,45907,45908,2107, 363, 489, 317, 317, 45912,45913,5836, 45914,45916,1601, 45919,45931,45932,45935,45939,45942,45944,45949,45951,45953,45962,8285, + 45963,371, 16910,490, 45917,45918,343, 5656, 45920,45924,317, 45921,317, 45922,45923,363, 45925,5836, 45929,45926,45928,371, 45927,45930,332, 8099, 351, + 45933,45934,490, 317, 490, 45936,351, 317, 45937,17471,317, 45938,317, 45940,45941,317, 363, 45943,11844,317, 11198,45945,11146,45946,490, 317, 1481, 45947,317, 5836, 45948,9690, 2077, 2317, 45950,5836, 45952,18322,363, 5662, 605, 476, 545, 45954,45955,45957,490, 45958,45960,2110, 45961,3284, 317, 45956, 30214,1347, 2316, 14439,8264, 317, 317, 371, 317, 45959,317, 2845, 17642,4984, 317, 490, 2087, 371, 949, 45965,45967,45968,45971,7785, 45977,883, 45978, - 45979,45980,45983,45989,45990,45991,36630,45966,317, 45969,1160, 596, 9696, 45970,317, 45972,45973,317, 2131, 365, 2152, 45974,45975,45976,4965, 351, 317, + 45979,45980,45983,45989,45990,45991,36630,45966,317, 45969,1160, 596, 9696, 45970,317, 45972,45973,317, 2131, 365, 2152, 45974,45975,45976,4965, 351, 317, 8296, 332, 5836, 596, 317, 490, 11198,45981,363, 45982,13495,45984,343, 45987,362, 363, 45988,12789,10626,45985,6847, 45986,351, 8296, 45992,351, 45994, - 490, 45996,45997,40281,2381, 45999,46001,46004,46014,46023,2413, 45995,45998,46000,4280, 2163, 32563,343, 384, 2134, 44931,13110,317, 46002,351, 46003,317, - 15550,466, 317, 317, 46005,46010,46013,317, 46006,46007,46008,46009,46011,46012,46015,46019,46016,46017,46018,317, 46020,46021,46022,46025,46034,46035,332, - 46026,46028,46033,25423,5656, 317, 46027,317, 317, 46029,46030,46032,371, 13110,2317, 12756,553, 46031,19324,384, 371, 371, 8099, 3284, 1109, 371, 5656, - 390, 317, 5295, 2108, 46037,46042,12448,46043,16535,2402, 46038,46039,317, 46041,371, 27154,2001, 8296, 36909,46040,371, 10317,317, 3284, 5836, 382, 317, - 1108, 46045,46047,490, 46046,46049,46051,46054,46056,46058,490, 6817, 46061,2110, 23547,46050,317, 971, 317, 20779,317, 46052,46053,2533, 46055,371, 3284, + 490, 45996,45997,40281,2381, 45999,46001,46004,46014,46023,2413, 45995,45998,46000,4280, 2163, 32563,343, 384, 2134, 44931,13110,317, 46002,351, 46003,317, + 15550,466, 317, 317, 46005,46010,46013,317, 46006,46007,46008,46009,46011,46012,46015,46019,46016,46017,46018,317, 46020,46021,46022,46025,46034,46035,332, + 46026,46028,46033,25423,5656, 317, 46027,317, 317, 46029,46030,46032,371, 13110,2317, 12756,553, 46031,19324,384, 371, 371, 8099, 3284, 1109, 371, 5656, + 390, 317, 5295, 2108, 46037,46042,12448,46043,16535,2402, 46038,46039,317, 46041,371, 27154,2001, 8296, 36909,46040,371, 10317,317, 3284, 5836, 382, 317, + 1108, 46045,46047,490, 46046,46049,46051,46054,46056,46058,490, 6817, 46061,2110, 23547,46050,317, 971, 317, 20779,317, 46052,46053,2533, 46055,371, 3284, 46057,16910,5836, 380, 971, 11198,2541, 371, 317, 371, 46059,396, 3284, 46060,11198,9549, 390, 8099, 46063,316, 382, 370, 46065,46064,46066,46067,46068, 356, 46070,46071,46074,46154,46205,490, 5626, 46258,388, 46281,46282,46312,46324,46072,46073,46075,46076,46080,2134, 46081,46083,46085,46088,46092,46096,46102, - 46106,46110,46116,46123,46124,46136,46140,46143,46149,46153,370, 371, 317, 382, 2108, 1108, 45591,46077,380, 20909,46078,46079,5223, 10185,2134, 350, 350, - 46082,11147,381, 46084,4965, 317, 317, 46086,46087,427, 46089,317, 46091,46090,46093,317, 317, 46094,317, 46095,46097,46098,46100,46101,6901, 46099,5836, - 371, 8177, 46103,7866, 46104,5040, 350, 46105,7850, 11844,46107,46108,46109,434, 971, 317, 382, 46111,317, 46113,381, 44566,883, 46115,46112,46114,4965, - 5309, 46117,343, 46118,317, 2108, 317, 384, 317, 46120,46121,46122,46119,317, 46125,317, 11347,46127,2022, 46128,46135,14999,11280,46126,43829,2280, 317, - 11469,46129,46130,18284,46131,46134,5295, 490, 565, 317, 46132,46133,317, 8333, 7892, 5091, 370, 46137,317, 36289,46138,3361, 317, 8275, 46139,3361, 3361, - 380, 46141,46142,4965, 7334, 14834,9938, 1358, 317, 317, 2584, 317, 46144,46146,46148,317, 46145,317, 317, 46147,46150,5309, 46151,10506,10317,46152,1108, - 7850, 2058, 46155,46160,10592,46162,46163,46164,46165,46166,46175,6917, 380, 46177,46180,46181,46182,46186,46194,46197,46204,317, 350, 46156,46158,46157,351, - 351, 46159,345, 380, 46161,5626, 363, 578, 381, 317, 2203, 380, 46167,46168,16825,46169,46170,46172,12731,31418,3884, 9450, 11939,5896, 419, 12731,350, + 46106,46110,46116,46123,46124,46136,46140,46143,46149,46153,370, 371, 317, 382, 2108, 1108, 45591,46077,380, 20909,46078,46079,5223, 10185,2134, 350, 350, + 46082,11147,381, 46084,4965, 317, 317, 46086,46087,427, 46089,317, 46091,46090,46093,317, 317, 46094,317, 46095,46097,46098,46100,46101,6901, 46099,5836, + 371, 8177, 46103,7866, 46104,5040, 350, 46105,7850, 11844,46107,46108,46109,434, 971, 317, 382, 46111,317, 46113,381, 44566,883, 46115,46112,46114,4965, + 5309, 46117,343, 46118,317, 2108, 317, 384, 317, 46120,46121,46122,46119,317, 46125,317, 11347,46127,2022, 46128,46135,14999,11280,46126,43829,2280, 317, + 11469,46129,46130,18284,46131,46134,5295, 490, 565, 317, 46132,46133,317, 8333, 7892, 5091, 370, 46137,317, 36289,46138,3361, 317, 8275, 46139,3361, 3361, + 380, 46141,46142,4965, 7334, 14834,9938, 1358, 317, 317, 2584, 317, 46144,46146,46148,317, 46145,317, 317, 46147,46150,5309, 46151,10506,10317,46152,1108, + 7850, 2058, 46155,46160,10592,46162,46163,46164,46165,46166,46175,6917, 380, 46177,46180,46181,46182,46186,46194,46197,46204,317, 350, 46156,46158,46157,351, + 351, 46159,345, 380, 46161,5626, 363, 578, 381, 317, 2203, 380, 46167,46168,16825,46169,46170,46172,12731,31418,3884, 9450, 11939,5896, 419, 12731,350, 46171,362, 14905,351, 6551, 351, 46173,350, 46174,13648,351, 46176,490, 46178,1020, 2134, 373, 317, 46179,1347, 2298, 371, 371, 343, 2184, 1108, 36289, - 380, 343, 490, 46183,27407,46184,317, 317, 46185,350, 46187,2402, 46189,46192,46188,46190,4738, 46191,351, 4738, 46193,350, 317, 2108, 46195,46196,351, + 380, 343, 490, 46183,27407,46184,317, 317, 46185,350, 46187,2402, 46189,46192,46188,46190,4738, 46191,351, 4738, 46193,350, 317, 2108, 46195,46196,351, 46174,5896, 351, 2219, 5626, 46198,46199,46200,46201,46202,46203,4965, 404, 46206,46207,46167,46211,46215,44829,46216,46218,46219,317, 46222,46223,46251,46253, 490, 46256,46208,31418,317, 46209,46210,2134, 46212,317, 46214,317, 14572,343, 13392,317, 46213,13369,8810, 9059, 351, 350, 46217,380, 373, 351, 46220, 46221,1044, 2317, 345, 380, 343, 317, 949, 4965, 46224,46235,362, 370, 46236,46237,363, 351, 317, 362, 46225,363, 46226,317, 46227,6866, 46231,33930, @@ -9439,242 +9434,242 @@ static const unsigned int ChildLocs[185261] = 46245,490, 46246,439, 363, 363, 355, 439, 46249,317, 317, 419, 351, 46250,345, 46252,350, 2222, 46254,317, 46255,363, 46257,35874,46259,46260,46263, 46264,4984, 345, 46265,46267,46268,46270,363, 46274,317, 46278,46279,46280,6108, 345, 350, 7322, 317, 350, 350, 2568, 350, 4564, 350, 46261,46262,13158, 343, 553, 351, 466, 343, 5223, 1109, 351, 317, 5662, 4976, 46266,345, 371, 10316,45952,317, 46269,490, 1078, 2134, 2022, 5943, 28588,2146, 46271,46272, - 317, 9450, 46273,1453, 6596, 9567, 317, 46275,46276,46277,317, 15325,317, 2507, 1481, 332, 437, 3236, 2272, 42575,2222, 390, 490, 1358, 317, 332, 490, - 401, 46283,46287,46288,46289,46290,343, 46293,46294,46296,46301,46306,46309,381, 46310,6340, 46284,46286,46285,5896, 9567, 317, 371, 11347,1060, 3284, 5866, + 317, 9450, 46273,1453, 6596, 9567, 317, 46275,46276,46277,317, 15325,317, 2507, 1481, 332, 437, 3236, 2272, 42575,2222, 390, 490, 1358, 317, 332, 490, + 401, 46283,46287,46288,46289,46290,343, 46293,46294,46296,46301,46306,46309,381, 46310,6340, 46284,46286,46285,5896, 9567, 317, 371, 11347,1060, 3284, 5866, 12732,317, 2134, 317, 390, 46291,317, 12930,46292,2134, 8296, 46295,317, 46297,29646,31580,3079, 10073,24899,46298,24224,46299,46300,2108, 1020, 31580,27702, 46302,5793, 46303,3284, 371, 1481, 16589,317, 46304,46305,13683,46307,46308,2058, 351, 317, 370, 11280,4974, 317, 338, 363, 46311,350, 2236, 46313,46314, 46315,46320,501, 27053,7850, 490, 9981, 46316,46317,46318,317, 46319,317, 46321,317, 46322,371, 5836, 5105, 19324,18333,343, 46323,2035, 8828, 317, 46325, 46326,46330,46327,46328,11346,11346,46329,13638,11346,46331,46333,23247,46335,46332,404, 46334,28127,8296, 4215, 351, 46337,46339,46345,9172, 46346,46348,24185, 46349,46350,46351,46338,46340,15772,46343,46341,46342,46344,46347,4295, 476, 3793, 606, 46353,490, 46359,46360,46362,1044, 46363,590, 46364,46354,380, 46355, 46356,46357,46358,46361,6793, 7892, 46365,46366,46367,6222, 608, 608, 46368,46371,46382,46396,46404,46413,46416,46418,46429,46431,46433,46445,46467,46478,46512, - 46517,46528,46566,46587,46596,46598,46603,317, 2210, 46369,2066, 46370,6555, 332, 317, 2211, 362, 46372,46374,46376,46379,46380,2391, 2108, 317, 3284, 1109, - 317, 46373,317, 390, 371, 490, 44010,1481, 883, 46375,4925, 317, 3284, 317, 371, 46377,317, 317, 4591, 11198,46378,1108, 317, 371, 5120, 317, 7523, + 46517,46528,46566,46587,46596,46598,46603,317, 2210, 46369,2066, 46370,6555, 332, 317, 2211, 362, 46372,46374,46376,46379,46380,2391, 2108, 317, 3284, 1109, + 317, 46373,317, 390, 371, 490, 44010,1481, 883, 46375,4925, 317, 3284, 317, 371, 46377,317, 317, 4591, 11198,46378,1108, 317, 371, 5120, 317, 7523, 7850, 11280,5120, 6036, 317, 490, 46381,4984, 46383,46384,46390,46394,371, 46395,46385,46386,46388,6917, 490, 5611, 317, 317, 45774,317, 317, 317, 46387, 490, 39569,12287,33963,46389,4318, 46391,317, 2108, 46392,46393,11347,13638,490, 11347,46397,46398,46399,46400,46402,317, 46403,2631, 883, 33700,370, 46401, - 384, 343, 490, 14093,2298, 46405,46406,317, 350, 46409,46410,2577, 46411,16579,46412,2222, 46407,46408,4982, 343, 317, 362, 5223, 501, 11954,317, 365, + 384, 343, 490, 14093,2298, 46405,46406,317, 350, 46409,46410,2577, 46411,16579,46412,2222, 46407,46408,4982, 343, 317, 362, 5223, 501, 11954,317, 365, 10626,501, 46414,46415,8957, 350, 490, 9012, 380, 350, 46417,46419,46420,46422,46423,46427,13269,1358, 9667, 46421,345, 3967, 46424,46426,317, 317, 46425, - 5663, 370, 46428,343, 343, 317, 317, 4962, 317, 5223, 371, 362, 2509, 590, 46430,46432,317, 317, 490, 4925, 16672,46434,46436,46437,46438,46441,317, + 5663, 370, 46428,343, 343, 317, 317, 4962, 317, 5223, 371, 362, 2509, 590, 46430,46432,317, 317, 490, 4925, 16672,46434,46436,46437,46438,46441,317, 46442,44388,317, 46435,7311, 23199,4060, 317, 46439,46440,1481, 5836, 1481, 46443,1913, 317, 46444,46446,46448,7356, 46450,46452,46453,590, 46457,46459,16889, - 46460,1109, 14263,46463,23247,350, 1108, 490, 46447,317, 46449,545, 2004, 46451,317, 8281, 490, 371, 46454,46455,11198,4925, 46456,46458,1347, 466, 5662, + 46460,1109, 14263,46463,23247,350, 1108, 490, 46447,317, 46449,545, 2004, 46451,317, 8281, 490, 371, 46454,46455,11198,4925, 46456,46458,1347, 466, 5662, 317, 317, 317, 46461,317, 46462,741, 46464,46465,46466,46468,46473,317, 350, 46475,7192, 46476,1383, 23309,332, 635, 29531,46469,363, 46471,365, 46470, - 6228, 46472,317, 46474,490, 490, 343, 11051,490, 46477,46479,317, 46480,46483,46484,46485,46490,5205, 511, 317, 46492,46509,565, 46510,46481,46482,4738, - 490, 2391, 1108, 34078,2210, 15451,363, 590, 362, 46486,45339,46487,1992, 317, 46488,39719,46489,317, 380, 46491,390, 27913,2236, 362, 46493,46494,4984, - 46498,27012,46505,46507,46495,46496,46497,5038, 46499,46500,46501,46502,46503,46504,46506,46508,351, 317, 7949, 46511,343, 350, 362, 46513,8172, 46515,2537, + 6228, 46472,317, 46474,490, 490, 343, 11051,490, 46477,46479,317, 46480,46483,46484,46485,46490,5205, 511, 317, 46492,46509,565, 46510,46481,46482,4738, + 490, 2391, 1108, 34078,2210, 15451,363, 590, 362, 46486,45339,46487,1992, 317, 46488,39719,46489,317, 380, 46491,390, 27913,2236, 362, 46493,46494,4984, + 46498,27012,46505,46507,46495,46496,46497,5038, 46499,46500,46501,46502,46503,46504,46506,46508,351, 317, 7949, 46511,343, 350, 362, 46513,8172, 46515,2537, 46514,46516,7871, 46518,46520,46522,46525,490, 350, 46526,8061, 46519,5294, 317, 317, 46521,1108, 362, 20672,46523,46524,339, 2081, 46527,46529,362, 46531, - 46532,46535,13023,46536,46537,46538,14250,46540,46541,46545,46547,46548,46549,46556,46562,18084,46564,381, 46530,381, 1100, 46533,317, 2381, 2203, 46534,317, + 46532,46535,13023,46536,46537,46538,14250,46540,46541,46545,46547,46548,46549,46556,46562,18084,46564,381, 46530,381, 1100, 46533,317, 2381, 2203, 46534,317, 8099, 8178, 363, 781, 363, 490, 351, 350, 6834, 317, 590, 9667, 317, 46539,5624, 8296, 371, 536, 317, 490, 6834, 46542,46543,5836, 46544,2537, 46546, - 380, 5836, 427, 1358, 2369, 12316,10506,317, 1020, 317, 46550,46552,317, 46553,5652, 365, 6207, 1481, 46554,46551,46555,362, 12514,46557,46560,5223, 317, - 1108, 6923, 46558,46559,46561,46563,11347,363, 12514,46565,46567,46568,46569,46570,46574,46575,46578,46579,46582,46584,46586,317, 46046,46571,46572,317, 362, + 380, 5836, 427, 1358, 2369, 12316,10506,317, 1020, 317, 46550,46552,317, 46553,5652, 365, 6207, 1481, 46554,46551,46555,362, 12514,46557,46560,5223, 317, + 1108, 6923, 46558,46559,46561,46563,11347,363, 12514,46565,46567,46568,46569,46570,46574,46575,46578,46579,46582,46584,46586,317, 46046,46571,46572,317, 362, 46573,371, 371, 5836, 317, 46576,317, 46577,380, 46580,46581,46583,490, 30310,46585,10317,11347,46588,46589,46591,343, 5105, 590, 46592,8599, 46593,46594, 317, 46595,5619, 3751, 46590,351, 6547, 10476,317, 351, 350, 350, 317, 351, 350, 5840, 46597,490, 6834, 12854,490, 43935,46599,46600,2509, 46601,46602, - 11986,46604,46605,46606,46609,371, 317, 14615,46607,46608,390, 45844,390, 46610,46612,46611,351, 16291,46614,46619,46620,36468,5624, 6343, 46615,6332, 3361, + 11986,46604,46605,46606,46609,371, 317, 14615,46607,46608,390, 45844,390, 46610,46612,46611,351, 16291,46614,46619,46620,36468,5624, 6343, 46615,6332, 3361, 46616,46617,46618,46621,6826, 46622,46624,46642,46643,46649,363, 371, 46625,46626,46627,343, 46635,46636,490, 46638,46641,12980,46628,46629,46630,46631,46632, - 46633,46634,317, 5379, 46637,46639,46640,317, 3284, 8296, 317, 46644,42576,46647,317, 46648,9702, 317, 46645,371, 13638,46646,46328,2295, 46651,7911, 351, - 350, 363, 1044, 46653,350, 46654,46659,46662,46665,46667,46668,46673,46221,46674,46678,370, 46652,317, 46655,46657,39134,12459,317, 46656,317, 46658,390, - 46660,46661,46663,46664,356, 2067, 7514, 46666,382, 332, 317, 2573, 351, 2829, 317, 5431, 46669,343, 46670,46671,46672,351, 12946,1992, 46675,590, 317, + 46633,46634,317, 5379, 46637,46639,46640,317, 3284, 8296, 317, 46644,42576,46647,317, 46648,9702, 317, 46645,371, 13638,46646,46328,2295, 46651,7911, 351, + 350, 363, 1044, 46653,350, 46654,46659,46662,46665,46667,46668,46673,46221,46674,46678,370, 46652,317, 46655,46657,39134,12459,317, 46656,317, 46658,390, + 46660,46661,46663,46664,356, 2067, 7514, 46666,382, 332, 317, 2573, 351, 2829, 317, 5431, 46669,343, 46670,46671,46672,351, 12946,1992, 46675,590, 317, 46676,46677,351, 351, 380, 5043, 19098,46680,25825,46681,46682,46683,46732,739, 46733,46740,46743,46745,46749,46756,157, 47536,47551,47554,159, 48098,48112, 48119,160, 48653,48667,48675,48717,48718,162, 49214,49220,49231,163, 49527,49537,49539,49542,49616,46684,46698,46709,46717,46724,46726,46685,46495,351, 46686, - 393, 20847,46687,46688,46692,46696,46689,46690,46691,46693,46694,343, 46695,46697,590, 1962, 46699,46700,46701,46702,46703,46705,46706,20289,46707,2368, 373, - 46704,381, 5590, 46708,23726,46710,46715,2060, 2143, 46711,46712,46713,46714,46716,1358, 46718,373, 46722,46719,46720,46721,46723,3361, 7514, 46725,1479, 1588, + 393, 20847,46687,46688,46692,46696,46689,46690,46691,46693,46694,343, 46695,46697,590, 1962, 46699,46700,46701,46702,46703,46705,46706,20289,46707,2368, 373, + 46704,381, 5590, 46708,23726,46710,46715,2060, 2143, 46711,46712,46713,46714,46716,1358, 46718,373, 46722,46719,46720,46721,46723,3361, 7514, 46725,1479, 1588, 433, 46727,46728,363, 46729,46730,46731,46734,46736,46735,46737,46738,46739,10985,46741,46742,46744,46746,46747,46748,46750,46751,46752,46753,46754,46755,46757, 46760,46758,46759,46761,46762,46764,46807,46851,46878,46886,46920,46947,46955,46965,46970,46988,47001,158, 47200,47205,47237,47240,47287,47334,47383,47455,47481, 47504,47508,47519,345, 371, 46763,1358, 9436, 11147,46765,46770,5241, 46771,46776,44910,46778,46779,46794,317, 7892, 46801,46802,2036, 5149, 2073, 317, 46766, - 46769,434, 317, 46767,343, 317, 46768,11986,2110, 15754,1358, 343, 17768,46772,317, 46774,46775,356, 466, 46773,6275, 317, 317, 1325, 466, 427, 343, - 535, 46777,351, 343, 343, 5217, 1347, 2280, 43588,343, 317, 317, 46780,46783,46784,46785,46790,46791,46793,317, 46781,46782,343, 343, 5037, 46786,343, - 9124, 46789,317, 317, 46787,46788,1588, 5201, 1992, 7834, 46792,12631,317, 2107, 46795,46797,46799,2261, 46800,46796,343, 2410, 317, 46798,317, 965, 343, - 317, 965, 317, 343, 8906, 7399, 363, 490, 396, 46803,46804,46805,46806,46808,46811,46813,46822,46824,46829,490, 46830,46835,46836,46841,46843,46849,317, + 46769,434, 317, 46767,343, 317, 46768,11986,2110, 15754,1358, 343, 17768,46772,317, 46774,46775,356, 466, 46773,6275, 317, 317, 1325, 466, 427, 343, + 535, 46777,351, 343, 343, 5217, 1347, 2280, 43588,343, 317, 317, 46780,46783,46784,46785,46790,46791,46793,317, 46781,46782,343, 343, 5037, 46786,343, + 9124, 46789,317, 317, 46787,46788,1588, 5201, 1992, 7834, 46792,12631,317, 2107, 46795,46797,46799,2261, 46800,46796,343, 2410, 317, 46798,317, 965, 343, + 317, 965, 317, 343, 8906, 7399, 363, 490, 396, 46803,46804,46805,46806,46808,46811,46813,46822,46824,46829,490, 46830,46835,46836,46841,46843,46849,317, 317, 5038, 31133,46809,9699, 317, 490, 332, 343, 317, 46810,10758,317, 317, 9624, 317, 46812,317, 3987, 1160, 5052, 490, 10364,343, 46814,46816,46817, - 20721,362, 15745,46818,46820,381, 393, 514, 46815,2627, 317, 5038, 11362,373, 13235,5212, 2163, 317, 7777, 21067,46819,4773, 11844,46821,317, 46823,317, - 46825,46826,36457,46827,362, 350, 317, 317, 343, 20391,439, 46828,36368,2261, 371, 46831,22475,46832,574, 46833,46834,6834, 317, 8311, 343, 2610, 381, + 20721,362, 15745,46818,46820,381, 393, 514, 46815,2627, 317, 5038, 11362,373, 13235,5212, 2163, 317, 7777, 21067,46819,4773, 11844,46821,317, 46823,317, + 46825,46826,36457,46827,362, 350, 317, 317, 343, 20391,439, 46828,36368,2261, 371, 46831,22475,46832,574, 46833,46834,6834, 317, 8311, 343, 2610, 381, 7095, 24185,46837,46839,343, 46838,380, 39072,316, 343, 46840,46842,363, 46844,339, 46845,7085, 9182, 19534,46846,343, 343, 46847,46848,7577, 8011, 46850, - 370, 8811, 46852,15016,46857,46859,46861,2156, 362, 33957,46866,4980, 46868,46869,10081,46870,3793, 46853,343, 46855,382, 317, 363, 317, 46854,46856,317, + 370, 8811, 46852,15016,46857,46859,46861,2156, 362, 33957,46866,4980, 46868,46869,10081,46870,3793, 46853,343, 46855,382, 317, 363, 317, 46854,46856,317, 46858,2156, 590, 46860,490, 380, 317, 16679,2845, 10081,371, 46862,490, 12243,46863,1481, 46864,46865,490, 18611,46867,2222, 317, 343, 320, 46871,46872, - 46873,46875,46876,362, 46877,13338,551, 370, 35725,46874,6551, 3366, 434, 384, 1597, 2553, 350, 363, 317, 46879,46880,46881,46882,46884,46883,46885,5266, - 317, 46887,46890,46893,46896,348, 46897,46901,46912,46919,343, 24765,31002,332, 490, 7386, 46888,46889,7149, 46891,46892,317, 2610, 2022, 15600,6021, 2510, - 343, 46894,46895,404, 5608, 1329, 317, 317, 29974,578, 574, 46898,46900,363, 1588, 350, 46899,342, 317, 317, 351, 317, 15596,46902,363, 46905,393, + 46873,46875,46876,362, 46877,13338,551, 370, 35725,46874,6551, 3366, 434, 384, 1597, 2553, 350, 363, 317, 46879,46880,46881,46882,46884,46883,46885,5266, + 317, 46887,46890,46893,46896,348, 46897,46901,46912,46919,343, 24765,31002,332, 490, 7386, 46888,46889,7149, 46891,46892,317, 2610, 2022, 15600,6021, 2510, + 343, 46894,46895,404, 5608, 1329, 317, 317, 29974,578, 574, 46898,46900,363, 1588, 350, 46899,342, 317, 317, 351, 317, 15596,46902,363, 46905,393, 46910,317, 317, 317, 46903,46904,6318, 381, 343, 317, 46906,343, 1479, 46907,317, 46908,46909,46911,2410, 46913,25384,46918,46914,46915,46917,5241, 46916, - 5028, 343, 46921,46928,46931,6504, 43841,362, 46932,46933,46940,317, 46945,14669,343, 46922,2073, 46923,46924,46926,46927,332, 46925,345, 332, 490, 317, - 43841,362, 46929,393, 5896, 6598, 3023, 362, 6601, 46930,363, 1325, 466, 1383, 393, 317, 490, 46934,46938,5616, 46939,317, 46935,46937,46936,490, 1109, + 5028, 343, 46921,46928,46931,6504, 43841,362, 46932,46933,46940,317, 46945,14669,343, 46922,2073, 46923,46924,46926,46927,332, 46925,345, 332, 490, 317, + 43841,362, 46929,393, 5896, 6598, 3023, 362, 6601, 46930,363, 1325, 466, 1383, 393, 317, 490, 46934,46938,5616, 46939,317, 46935,46937,46936,490, 1109, 46941,46943,2585, 46944,5017, 46942,393, 343, 317, 24067,317, 490, 7942, 343, 363, 489, 317, 15753,46946,1588, 6409, 12943,316, 46948,6036, 46949,46950, 46951,46952,12613,46953,343, 16415,317, 1347, 1358, 362, 317, 365, 317, 5663, 1033, 490, 3967, 343, 356, 46954,46956,26076,46957,17350,490, 1109, 46959, - 345, 515, 46962,46963,46964,5761, 2108, 363, 343, 46958,605, 6036, 46960,317, 5159, 317, 404, 46961,1347, 2171, 20621,317, 6555, 1588, 317, 44404,317, + 345, 515, 46962,46963,46964,5761, 2108, 363, 343, 46958,605, 6036, 46960,317, 5159, 317, 404, 46961,1347, 2171, 20621,317, 6555, 1588, 317, 44404,317, 46966,46967,46969,2631, 9702, 490, 490, 9104, 317, 46968,343, 2381, 382, 317, 1358, 46971,46972,46979,46981,343, 350, 46982,46983,317, 1526, 24185,12416, 16250,24185,4952, 362, 46973,46974,46976,44836,35352,6089, 317, 2110, 13419,490, 362, 46975,649, 6996, 1292, 1894, 317, 46977,2261, 317, 490, 46978,10058, 46980,317, 317, 24185,14227,1459, 490, 396, 490, 5836, 46984,46985,46987,46986,46989,4925, 46993,1109, 46997,46999,47000,949, 2188, 46990,46992,490, 46991, - 6228, 356, 46994,390, 317, 10345,5828, 46996,46995,317, 490, 1444, 13171,46998,2222, 317, 317, 16358,389, 317, 15600,490, 47002,47012,490, 47023,2188, - 47028,47033,47034,47037,47048,404, 47061,317, 384, 47003,21264,29086,15183,47004,47006,47009,47011,317, 317, 343, 9538, 317, 317, 343, 332, 595, 490, - 47005,10758,490, 47007,317, 965, 5891, 390, 47008,18978,47010,47013,19811,9909, 47014,47017,490, 1020, 47018,47021,4980, 404, 545, 490, 2601, 20289,590, - 371, 47015,317, 390, 317, 8254, 404, 47016,317, 317, 317, 4984, 404, 345, 5037, 317, 393, 317, 17160,317, 47019,14341,317, 47020,1358, 2210, 2211, + 6228, 356, 46994,390, 317, 10345,5828, 46996,46995,317, 490, 1444, 13171,46998,2222, 317, 317, 16358,389, 317, 15600,490, 47002,47012,490, 47023,2188, + 47028,47033,47034,47037,47048,404, 47061,317, 384, 47003,21264,29086,15183,47004,47006,47009,47011,317, 317, 343, 9538, 317, 317, 343, 332, 595, 490, + 47005,10758,490, 47007,317, 965, 5891, 390, 47008,18978,47010,47013,19811,9909, 47014,47017,490, 1020, 47018,47021,4980, 404, 545, 490, 2601, 20289,590, + 371, 47015,317, 390, 317, 8254, 404, 47016,317, 317, 317, 4984, 404, 345, 5037, 317, 393, 317, 17160,317, 47019,14341,317, 47020,1358, 2210, 2211, 26250,47022,530, 345, 46856,471, 381, 490, 47024,47026,47027,19979,317, 317, 47025,8937, 476, 317, 5535, 8549, 490, 24799,22139,47029,47031,404, 47030, - 317, 5862, 363, 371, 317, 317, 40319,47032,345, 47035,1358, 363, 317, 317, 47036,317, 12025,317, 317, 47038,47039,1588, 47042,317, 47044,47045,1109, + 317, 5862, 363, 371, 317, 317, 40319,47032,345, 47035,1358, 363, 317, 317, 47036,317, 12025,317, 317, 47038,47039,1588, 47042,317, 47044,47045,1109, 2280, 317, 47040,47041,317, 317, 47043,5058, 343, 11144,317, 2381, 316, 343, 5891, 42014,47046,47047,47049,47051,47052,47054,47033,8392, 362, 47055,47056, - 47057,47059,404, 466, 382, 47050,1025, 3284, 317, 5223, 350, 317, 47053,28762,3751, 37551,381, 10528,381, 47058,6002, 471, 1347, 345, 47060,363, 2261, - 1588, 2537, 47062,317, 47063,47065,47072,47118,47120,47123,554, 47164,47167,362, 47170,47174,47176,6601, 47179,47183,47191,1020, 36355,47192,362, 362, 317, - 317, 13276,490, 490, 47064,47066,47069,12312,47071,2086, 18420,317, 3869, 317, 47067,2609, 47068,7419, 7891, 317, 47070,40953,6420, 317, 1347, 317, 5328, + 47057,47059,404, 466, 382, 47050,1025, 3284, 317, 5223, 350, 317, 47053,28762,3751, 37551,381, 10528,381, 47058,6002, 471, 1347, 345, 47060,363, 2261, + 1588, 2537, 47062,317, 47063,47065,47072,47118,47120,47123,554, 47164,47167,362, 47170,47174,47176,6601, 47179,47183,47191,1020, 36355,47192,362, 362, 317, + 317, 13276,490, 490, 47064,47066,47069,12312,47071,2086, 18420,317, 3869, 317, 47067,2609, 47068,7419, 7891, 317, 47070,40953,6420, 317, 1347, 317, 5328, 382, 6993, 47073,47075,47076,47080,47084,47089,47093,47095,47096,47098,47100,6601, 47103,47108,13816,47116,11244,47117,317, 1588, 350, 317, 2222, 47074,17583, - 7399, 8219, 317, 6598, 31475,47077,47078,2086, 317, 5896, 7801, 47079,47081,4563, 47082,24570,351, 4564, 47083,47085,47086,47088,317, 47087,317, 2413, 427, - 1830, 47090,47091,47092,2510, 10877,47094,317, 2152, 25455,2074, 476, 6188, 47097,1525, 6355, 47099,7650, 6188, 4984, 5962, 5335, 317, 47101,5120, 317, 350, + 7399, 8219, 317, 6598, 31475,47077,47078,2086, 317, 5896, 7801, 47079,47081,4563, 47082,24570,351, 4564, 47083,47085,47086,47088,317, 47087,317, 2413, 427, + 1830, 47090,47091,47092,2510, 10877,47094,317, 2152, 25455,2074, 476, 6188, 47097,1525, 6355, 47099,7650, 6188, 4984, 5962, 5335, 317, 47101,5120, 317, 350, 47102,9081, 3284, 12954,47104,47105,47106,47107,317, 11921,1347, 390, 5037, 317, 363, 5943, 362, 390, 13782,47109,47111,350, 385, 44246,47113,362, 47115, 47110,32950,7064, 47112,47114,426, 7852, 7386, 396, 551, 5401, 7990, 317, 362, 5159, 11533,317, 47119,574, 343, 1230, 317, 5022, 565, 2389, 47121,47122, 47124,47126,47128,47129,47138,6089, 47140,47145,47146,47148,47152,39187,47154,3075, 47155,47156,47159,47160,47163,350, 15749,47125,47127,316, 15892,47130,47133, 47134,47136,47137,47131,47132,439, 350, 490, 47135,7618, 476, 6598, 6599, 578, 363, 16018,47139,551, 47141,47142,47143,47144,381, 11533,317, 317, 47147, - 2134, 365, 47149,370, 47150,47151,345, 6355, 12494,1108, 47153,317, 5022, 350, 396, 6278, 5836, 8569, 7368, 427, 427, 6195, 545, 12154,47157,3529, 363, - 47158,9067, 47161,47162,317, 30780,380, 317, 317, 4952, 13414,428, 545, 29522,5238, 4965, 362, 47165,490, 345, 47166,317, 47168,9609, 2024, 349, 317, - 1347, 47169,4984, 47171,47172,47173,317, 4965, 362, 382, 349, 8506, 490, 47175,8771, 47177,47178,350, 466, 47180,47181,6036, 2024, 466, 5838, 363, 373, - 8035, 47182,47184,47185,501, 47187,47190,6002, 9860, 332, 1345, 396, 2272, 490, 317, 10758,2060, 47186,317, 362, 6420, 47188,350, 47189,5752, 427, 6334, + 2134, 365, 47149,370, 47150,47151,345, 6355, 12494,1108, 47153,317, 5022, 350, 396, 6278, 5836, 8569, 7368, 427, 427, 6195, 545, 12154,47157,3529, 363, + 47158,9067, 47161,47162,317, 30780,380, 317, 317, 4952, 13414,428, 545, 29522,5238, 4965, 362, 47165,490, 345, 47166,317, 47168,9609, 2024, 349, 317, + 1347, 47169,4984, 47171,47172,47173,317, 4965, 362, 382, 349, 8506, 490, 47175,8771, 47177,47178,350, 466, 47180,47181,6036, 2024, 466, 5838, 363, 373, + 8035, 47182,47184,47185,501, 47187,47190,6002, 9860, 332, 1345, 396, 2272, 490, 317, 10758,2060, 47186,317, 362, 6420, 47188,350, 47189,5752, 427, 6334, 2291, 382, 317, 47193,47196,589, 47197,7142, 14409,20265,47194,363, 47195,47198,47199,7567, 382, 47201,47203,345, 317, 2373, 317, 47204,365, 47202,47206, - 47210,47211,554, 47216,47219,47222,47224,47230,47232,47233,47235,27846,9869, 47207,2060, 317, 47208,2110, 317, 47209,9823, 9070, 523, 382, 351, 317, 1347, + 47210,47211,554, 47216,47219,47222,47224,47230,47232,47233,47235,27846,9869, 47207,2060, 317, 47208,2110, 317, 47209,9823, 9070, 523, 382, 351, 317, 1347, 489, 47212,343, 47213,317, 343, 392, 15600,489, 47214,47215,17693,393, 2035, 47217,23987,10447,47218,317, 362, 317, 11844,490, 47220,2060, 47221,24804, 2369, 1481, 1913, 12503,2381, 47223,1347, 47225,47228,317, 47226,317, 47227,47229,47231,9244, 393, 10172,8546, 2058, 5447, 2022, 47234,317, 25016,35902,47236, 317, 47238,47239,10763,489, 47241,8525, 47248,47250,47252,47254,35093,47257,47263,47264,47265,47266,317, 47269,47276,47277,47278,47281,6089, 47282,47285,47242, - 47244,317, 370, 10179,47246,47247,404, 343, 2058, 1230, 47243,317, 47245,24884,343, 343, 1588, 2261, 2590, 47249,427, 4965, 8254, 476, 4965, 47251,350, - 2272, 6083, 2178, 317, 9530, 590, 332, 317, 7149, 317, 8254, 514, 47253,317, 317, 317, 1345, 47255,363, 317, 317, 370, 10854,47256,317, 381, 381, + 47244,317, 370, 10179,47246,47247,404, 343, 2058, 1230, 47243,317, 47245,24884,343, 343, 1588, 2261, 2590, 47249,427, 4965, 8254, 476, 4965, 47251,350, + 2272, 6083, 2178, 317, 9530, 590, 332, 317, 7149, 317, 8254, 514, 47253,317, 317, 317, 1345, 47255,363, 317, 317, 370, 10854,47256,317, 381, 381, 47258,5483, 22742,47259,47260,47261,490, 47262,317, 748, 8281, 1109, 317, 317, 363, 490, 18333,1345, 543, 5055, 317, 8148, 363, 12144,573, 2280, 44550, - 47267,317, 490, 2004, 965, 5793, 489, 47268,343, 5611, 24798,317, 965, 342, 393, 317, 47270,7522, 47271,47273,47274,14146,6318, 2261, 9436, 11921,371, - 15565,2171, 404, 1108, 47272,965, 490, 317, 6228, 651, 47275,317, 317, 363, 363, 317, 363, 404, 6036, 19791,47279,317, 642, 47280,9447, 317, 371, + 47267,317, 490, 2004, 965, 5793, 489, 47268,343, 5611, 24798,317, 965, 342, 393, 317, 47270,7522, 47271,47273,47274,14146,6318, 2261, 9436, 11921,371, + 15565,2171, 404, 1108, 47272,965, 490, 317, 6228, 651, 47275,317, 317, 363, 363, 317, 363, 404, 6036, 19791,47279,317, 642, 47280,9447, 317, 371, 47283,47284,317, 433, 5828, 39239,47286,47288,47292,47296,47298,47309,47314,47318,47319,7149, 47321,47326,1588, 47333,3987, 7035, 2142, 47289,2369, 47290,47291, 5325, 350, 2110, 317, 490, 47293,24100,27584,47294,47295,18448,490, 332, 24949,3284, 11533,16278,47297,350, 6228, 27689,539, 490, 317, 47299,47304,47305, 15058,565, 12454,539, 47306,47307,1230, 47300,47301,47302,317, 47303,6674, 9695, 367, 9581, 317, 2004, 343, 47308,317, 317, 47310,350, 47311,47312,47313, - 7825, 12142,4984, 47315,317, 47316,5308, 47317,3432, 8626, 47320,490, 47322,47323,47324,14834,2022, 47325,345, 3987, 10758,373, 317, 31950,404, 45361,7738, + 7825, 12142,4984, 47315,317, 47316,5308, 47317,3432, 8626, 47320,490, 47322,47323,47324,14834,2022, 47325,345, 3987, 10758,373, 317, 31950,404, 45361,7738, 543, 47327,47328,370, 362, 47329,47330,317, 4789, 47332,10561,365, 1913, 343, 2279, 47331,47335,47337,47339,6195, 47349,47352,5611, 15745,47361,47366,47369, - 47371,47377,47381,2152, 47382,5038, 5241, 317, 5619, 2396, 24185,47336,20219,490, 47338,605, 5464, 2024, 466, 47340,47341,47342,47343,47345,47348,1548, 370, - 47344,476, 574, 317, 47346,574, 317, 490, 47347,317, 345, 370, 317, 1347, 28565,47350,427, 363, 47351,317, 317, 4984, 317, 317, 47353,47354,332, - 350, 22742,47355,47360,1459, 7658, 427, 390, 6607, 317, 1347, 47356,47357,317, 345, 47358,317, 47359,12494,345, 47362,47363,17760,47364,20219,490, 343, - 965, 342, 317, 47365,428, 47367,47368,363, 7098, 8955, 1459, 47370,332, 363, 47372,47374,47376,350, 3987, 345, 317, 47373,365, 317, 317, 47375,317, - 2156, 317, 22742,1992, 47378,5836, 317, 317, 345, 47379,47380,2381, 8214, 382, 5793, 47384,47387,47388,47398,47400,47402,47410,6048, 590, 47411,47413,350, + 47371,47377,47381,2152, 47382,5038, 5241, 317, 5619, 2396, 24185,47336,20219,490, 47338,605, 5464, 2024, 466, 47340,47341,47342,47343,47345,47348,1548, 370, + 47344,476, 574, 317, 47346,574, 317, 490, 47347,317, 345, 370, 317, 1347, 28565,47350,427, 363, 47351,317, 317, 4984, 317, 317, 47353,47354,332, + 350, 22742,47355,47360,1459, 7658, 427, 390, 6607, 317, 1347, 47356,47357,317, 345, 47358,317, 47359,12494,345, 47362,47363,17760,47364,20219,490, 343, + 965, 342, 317, 47365,428, 47367,47368,363, 7098, 8955, 1459, 47370,332, 363, 47372,47374,47376,350, 3987, 345, 317, 47373,365, 317, 317, 47375,317, + 2156, 317, 22742,1992, 47378,5836, 317, 317, 345, 47379,47380,2381, 8214, 382, 5793, 47384,47387,47388,47398,47400,47402,47410,6048, 590, 47411,47413,350, 47424,47438,47440,350, 18317,317, 47454,8599, 47385,362, 6204, 317, 47386,19237,14353,47389,47391,466, 2705, 317, 373, 2537, 741, 47390,317, 362, 47392, - 47394,47393,47395,6195, 47397,47396,363, 12303,47399,7949, 7911, 5138, 47401,350, 8526, 317, 363, 47403,47404,9059, 47405,47406,22466,362, 350, 363, 9914, + 47394,47393,47395,6195, 47397,47396,363, 12303,47399,7949, 7911, 5138, 47401,350, 8526, 317, 363, 47403,47404,9059, 47405,47406,22466,362, 350, 363, 9914, 317, 6412, 47407,47408,7401, 11911,47409,2272, 2219, 2366, 5626, 47412,1345, 47414,47417,47422,47423,317, 47415,47416,3869, 2067, 8020, 466, 355, 47418,47420, 47419,356, 466, 5037, 343, 596, 47421,317, 6555, 317, 317, 1588, 345, 47425,47427,47434,8083, 501, 4984, 6228, 317, 317, 7792, 2161, 47426,317, 47428, - 363, 47429,47430,5792, 317, 332, 2156, 345, 2272, 365, 317, 6996, 317, 47431,11921,317, 5828, 317, 317, 47432,6492, 317, 47433,317, 4984, 596, 345, - 345, 5328, 47435,6831, 4965, 490, 2171, 47436,363, 2067, 47437,6048, 490, 317, 317, 317, 317, 501, 437, 10770,5425, 317, 47439,350, 350, 380, 1992, + 363, 47429,47430,5792, 317, 332, 2156, 345, 2272, 365, 317, 6996, 317, 47431,11921,317, 5828, 317, 317, 47432,6492, 317, 47433,317, 4984, 596, 345, + 345, 5328, 47435,6831, 4965, 490, 2171, 47436,363, 2067, 47437,6048, 490, 317, 317, 317, 317, 501, 437, 10770,5425, 317, 47439,350, 350, 380, 1992, 317, 47441,47442,47450,7273, 362, 350, 1481, 7892, 317, 1588, 47451,47443,47448,47444,47445,47446,47447,47449,2101, 317, 2108, 479, 47452,47453,47456,47463, - 373, 47469,47475,47480,317, 404, 490, 47457,36073,47458,47461,317, 47462,317, 2110, 343, 47459,2610, 47460,317, 13269,343, 5162, 7490, 317, 317, 1230, - 390, 8544, 351, 9537, 317, 47464,47465,47466,9226, 9711, 317, 7399, 2117, 6278, 350, 317, 490, 5761, 317, 47467,8772, 2272, 5891, 15600,47468,317, 317, - 317, 8906, 1588, 9265, 9504, 47470,47471,47473,317, 350, 317, 2067, 490, 47472,47474,490, 47476,47477,343, 47478,47479,317, 317, 490, 317, 6370, 490, - 5793, 317, 371, 1044, 47482,7698, 8273, 2077, 47485,47487,47488,47489,47490,47492,47494,47497,47502,47503,350, 8023, 20766,47483,47484,6021, 47486,317, 523, + 373, 47469,47475,47480,317, 404, 490, 47457,36073,47458,47461,317, 47462,317, 2110, 343, 47459,2610, 47460,317, 13269,343, 5162, 7490, 317, 317, 1230, + 390, 8544, 351, 9537, 317, 47464,47465,47466,9226, 9711, 317, 7399, 2117, 6278, 350, 317, 490, 5761, 317, 47467,8772, 2272, 5891, 15600,47468,317, 317, + 317, 8906, 1588, 9265, 9504, 47470,47471,47473,317, 350, 317, 2067, 490, 47472,47474,490, 47476,47477,343, 47478,47479,317, 317, 490, 317, 6370, 490, + 5793, 317, 371, 1044, 47482,7698, 8273, 2077, 47485,47487,47488,47489,47490,47492,47494,47497,47502,47503,350, 8023, 20766,47483,47484,6021, 47486,317, 523, 523, 514, 317, 551, 5701, 355, 18724,14455,317, 47491,345, 351, 317, 39533,317, 47493,363, 8301, 14062,6195, 11146,47495,317, 4554, 47496,523, 47498, 343, 363, 317, 47499,317, 47500,1108, 317, 47501,7911, 5037, 343, 370, 5055, 6255, 47505,363, 397, 47506,404, 404, 363, 47507,47509,47510,501, 47511, 9624, 15827,3999, 47512,22427,47514,47515,47516,47518,404, 1060, 490, 2584, 5851, 5105, 5273, 47513,11434,21053,350, 47517,515, 19174,363, 363, 550, 47520, 47521,7657, 47524,47528,332, 47529,47530,47531,47533,490, 2261, 332, 47522,10316,317, 47523,11669,4987, 7865, 11831,343, 345, 317, 317, 11843,47525,47527, 5836, 47526,404, 7590, 317, 390, 351, 2571, 317, 365, 971, 2317, 47532,8301, 47534,47535,6696, 384, 631, 47537,47538,47540,47543,47545,1479, 47546,47548, 47539,47541,47542,47544,19080,47547,607, 6222, 6222, 47549,396, 47550,6546, 345, 47552,47553,621, 1060, 317, 47555,47557,47593,47616,47642,47663,47680,47702, - 47749,47763,47812,47814,47816,47821,47844,47885,47912,47931,47932,47939,47981,48008,48021,48059,48070,48087,48096,47556,14999,47558,47560,47567,47570,47571,551, - 47572,317, 47573,47574,317, 47576,47578,47580,47582,47587,350, 47559,384, 574, 356, 39147,362, 47561,47563,16249,47565,2022, 362, 3529, 317, 5037, 317, - 47562,349, 349, 317, 317, 47564,390, 317, 23337,2571, 9139, 47566,1325, 47568,1160, 317, 47569,6598, 6725, 2948, 370, 362, 317, 990, 16867,466, 317, - 317, 363, 351, 6000, 363, 317, 10894,47575,14483,9648, 5891, 17748,317, 490, 351, 12853,5991, 22786,47577,466, 317, 317, 1999, 5159, 479, 5120, 539, - 362, 47579,317, 10422,3999, 317, 317, 410, 47581,2222, 466, 317, 12696,317, 1588, 317, 317, 4982, 317, 317, 47583,363, 2541, 1030, 47584,47585,317, - 317, 47586,516, 11089,362, 317, 6089, 317, 384, 7590, 47588,47592,317, 317, 11533,47589,47591,6718, 317, 47590,356, 6089, 466, 317, 5809, 2272, 9575, + 47749,47763,47812,47814,47816,47821,47844,47885,47912,47931,47932,47939,47981,48008,48021,48059,48070,48087,48096,47556,14999,47558,47560,47567,47570,47571,551, + 47572,317, 47573,47574,317, 47576,47578,47580,47582,47587,350, 47559,384, 574, 356, 39147,362, 47561,47563,16249,47565,2022, 362, 3529, 317, 5037, 317, + 47562,349, 349, 317, 317, 47564,390, 317, 23337,2571, 9139, 47566,1325, 47568,1160, 317, 47569,6598, 6725, 2948, 370, 362, 317, 990, 16867,466, 317, + 317, 363, 351, 6000, 363, 317, 10894,47575,14483,9648, 5891, 17748,317, 490, 351, 12853,5991, 22786,47577,466, 317, 317, 1999, 5159, 479, 5120, 539, + 362, 47579,317, 10422,3999, 317, 317, 410, 47581,2222, 466, 317, 12696,317, 1588, 317, 317, 4982, 317, 317, 47583,363, 2541, 1030, 47584,47585,317, + 317, 47586,516, 11089,362, 317, 6089, 317, 384, 7590, 47588,47592,317, 317, 11533,47589,47591,6718, 317, 47590,356, 6089, 466, 317, 5809, 2272, 9575, 381, 47594,370, 47597,47603,47604,47607,47612,14378,363, 47595,47596,4943, 393, 363, 343, 332, 363, 404, 11144,371, 47598,317, 47600,3664, 47602,19791, - 317, 47599,47601,390, 5836, 47605,590, 439, 47606,3664, 356, 317, 7785, 47608,401, 47611,396, 317, 47609,47610,2272, 47613,47615,363, 47614,404, 381, + 317, 47599,47601,390, 5836, 47605,590, 439, 47606,3664, 356, 317, 7785, 47608,401, 47611,396, 317, 47609,47610,2272, 47613,47615,363, 47614,404, 381, 965, 47617,7865, 490, 47618,47623,47624,47626,47629,47634,47636,2405, 317, 47641,363, 2086, 9440, 381, 47619,490, 47620,47622,350, 6551, 317, 5223, 34320, - 371, 47621,349, 15070,317, 317, 2148, 47625,14842,362, 317, 47627,47628,11648,343, 351, 351, 47606,1065, 47630,47631,317, 47632,47633,15183,381, 381, + 371, 47621,349, 15070,317, 317, 2148, 47625,14842,362, 317, 47627,47628,11648,343, 351, 351, 47606,1065, 47630,47631,317, 47632,47633,15183,381, 381, 343, 47635,37126,47637,351, 47638,317, 18147,47639,47640,466, 317, 1347, 7821, 7481, 2280, 13674,47643,47644,47645,2024, 47649,47652,47653,47654,47655,47656, - 47657,15130,47659,11245,448, 47646,317, 317, 13679,47647,2845, 317, 2845, 351, 47648,5662, 47650,47651,317, 370, 343, 605, 7916, 316, 4738, 2060, 428, - 47658,47660,47661,317, 47662,949, 47664,47665,47666,47667,317, 317, 35774,11928,47670,47671,1109, 2222, 47673,47674,47675,47676,350, 47679,24682,351, 2391, - 351, 427, 47668,317, 317, 47669,37256,332, 47672,466, 605, 351, 466, 370, 317, 317, 7911, 317, 5662, 363, 5037, 390, 317, 9876, 47677,47678,363, - 363, 35018,2301, 47681,43829,47682,47684,38654,47688,47689,47691,47695,13950,47683,356, 46892,317, 351, 343, 1588, 1588, 47685,47686,350, 7949, 21053,317, + 47657,15130,47659,11245,448, 47646,317, 317, 13679,47647,2845, 317, 2845, 351, 47648,5662, 47650,47651,317, 370, 343, 605, 7916, 316, 4738, 2060, 428, + 47658,47660,47661,317, 47662,949, 47664,47665,47666,47667,317, 317, 35774,11928,47670,47671,1109, 2222, 47673,47674,47675,47676,350, 47679,24682,351, 2391, + 351, 427, 47668,317, 317, 47669,37256,332, 47672,466, 605, 351, 466, 370, 317, 317, 7911, 317, 5662, 363, 5037, 390, 317, 9876, 47677,47678,363, + 363, 35018,2301, 47681,43829,47682,47684,38654,47688,47689,47691,47695,13950,47683,356, 46892,317, 351, 343, 1588, 1588, 47685,47686,350, 7949, 21053,317, 47687,351, 422, 12277,47690,47692,370, 47693,47694,47696,47700,4952, 47701,9590, 23004,9914, 317, 33255,1160, 47697,47698,47699,47703,332, 47711,47717,47721, - 47722,47735,362, 47737,47738,47742,47746,47747,12423,317, 551, 6408, 47704,1078, 47708,47709,47710,3505, 17375,47705,47707,47706,5201, 10674,5225, 1325, 317, + 47722,47735,362, 47737,47738,47742,47746,47747,12423,317, 551, 6408, 47704,1078, 47708,47709,47710,3505, 17375,47705,47707,47706,5201, 10674,5225, 1325, 317, 401, 317, 317, 488, 365, 2058, 1347, 317, 5054, 317, 345, 317, 47712,47716,574, 381, 47713,317, 317, 47714,317, 343, 1160, 47715,47718,47719,47720, 317, 317, 317, 34942,317, 381, 317, 5457, 351, 47723,47725,47729,47724,317, 8544, 46591,12275,317, 47726,47727,47728,1325, 6017, 2510, 12277,47730,47731, 47732,47733,370, 25572,47734,5441, 47736,541, 349, 317, 345, 317, 5570, 351, 2280, 363, 396, 47739,362, 47741,317, 14143,47740,47743,343, 47745,47744, 343, 317, 574, 317, 637, 316, 2402, 47748,5634, 46436,5897, 47750,37775,607, 47752,47753,47758,47760,47761,47751,317, 13670,317, 5663, 5896, 351, 16052, 47754,47756,466, 47757,345, 317, 47755,1830, 3529, 47759,27721,317, 351, 6598, 362, 343, 362, 12756,47762,10898,501, 47764,47765,47772,47782,47785,47787, 47788,7850, 490, 43837,47790,47791,47794,47796,5241, 47798,47806,490, 47811,317, 47766,35973,362, 3717, 47767,47768,317, 317, 317, 10546,12969,356, 10626, - 10626,47769,47770,47771,317, 47773,47777,317, 47774,47775,47776,351, 14708,350, 47778,47779,362, 317, 47780,47781,20909,47783,3504, 47784,317, 390, 317, + 10626,47769,47770,47771,317, 47773,47777,317, 47774,47775,47776,351, 14708,350, 47778,47779,362, 317, 47780,47781,20909,47783,3504, 47784,317, 390, 317, 382, 47786,317, 1033, 47789,4952, 317, 28438,1020, 37918,7142, 2108, 47792,351, 47793,34257,47792,16888,2357, 5159, 30089,46954,16579,47795,439, 2334, 21274, 7734, 578, 47797,317, 27303,47799,47800,12704,350, 350, 317, 47804,47805,317, 317, 351, 47801,47802,47803,12696,8099, 350, 332, 390, 24310,47807,47808, - 350, 2948, 501, 47810,8421, 16024,7651, 3529, 363, 47809,5105, 4738, 343, 1597, 596, 317, 47813,362, 2272, 9521, 47815,1345, 24185,350, 317, 2146, 490, + 350, 2948, 501, 47810,8421, 16024,7651, 3529, 363, 47809,5105, 4738, 343, 1597, 596, 317, 47813,362, 2272, 9521, 47815,1345, 24185,350, 317, 2146, 490, 4949, 3226, 47817,25726,19478,47819,47820,317, 47818,317, 356, 971, 2108, 47822,47826,553, 47827,47830,47831,12141,47832,2086, 47838,47842,47843,47823,15661, 47824,47825,317, 553, 4949, 343, 317, 2391, 351, 317, 47828,317, 47829,10592,7990, 9649, 343, 390, 590, 317, 363, 317, 47833,47834,47836,317, 10878, - 47835,47837,2272, 47839,1588, 317, 2272, 317, 2261, 1347, 317, 47840,350, 47841,317, 317, 317, 317, 11146,5793, 11388,380, 8614, 317, 47845,47848,5896, + 47835,47837,2272, 47839,1588, 317, 2272, 317, 2261, 1347, 317, 47840,350, 47841,317, 317, 317, 317, 11146,5793, 11388,380, 8614, 317, 47845,47848,5896, 47852,47853,47855,1479, 47858,47862,47865,47869,511, 47870,47876,47879,47880,47883,15130,47884,47846,47847,47849,47850,362, 343, 47851,558, 5826, 1799, 26913, 317, 317, 12668,34793,10317,47854,466, 317, 7866, 741, 317, 317, 47856,362, 47857,6204, 47859,343, 47860,490, 2134, 47861,5362, 317, 8722, 317, 47863, - 1830, 3529, 47864,5968, 6600, 362, 47866,351, 317, 47868,345, 317, 317, 47867,18577,317, 4965, 8273, 47871,47872,47874,47875,1160, 47873,317, 362, 5861, - 317, 1481, 47877,351, 317, 47878,343, 332, 317, 317, 317, 317, 317, 356, 9450, 466, 7672, 47881,47882,4984, 7940, 6207, 317, 10407,1347, 7672, 317, + 1830, 3529, 47864,5968, 6600, 362, 47866,351, 317, 47868,345, 317, 317, 47867,18577,317, 4965, 8273, 47871,47872,47874,47875,1160, 47873,317, 362, 5861, + 317, 1481, 47877,351, 317, 47878,343, 332, 317, 317, 317, 317, 317, 356, 9450, 466, 7672, 47881,47882,4984, 7940, 6207, 317, 10407,1347, 7672, 317, 4984, 7142, 317, 949, 501, 2077, 47886,47868,47887,47889,47903,490, 317, 47910,401, 2317, 317, 47888,9609, 365, 949, 47890,5897, 47894,47896,317, 28651, 47899,47901,6203, 47902,47891,47892,47893,317, 317, 1347, 1160, 317, 47895,317, 363, 47897,47898,18692,317, 371, 47900,317, 490, 317, 47904,47907,47905, - 47906,47908,47909,2035, 317, 5037, 47911,47913,1459, 47914,47916,27154,2022, 350, 12943,47924,47926,317, 47930,345, 343, 317, 2322, 356, 47915,8178, 317, + 47906,47908,47909,2035, 317, 5037, 47911,47913,1459, 47914,47916,27154,2022, 350, 12943,47924,47926,317, 47930,345, 343, 317, 2322, 356, 47915,8178, 317, 47917,47923,2322, 47918,345, 47919,30151,47920,47921,47922,47925,21274,40111,343, 490, 501, 356, 47927,317, 2420, 47928,1588, 47929,47933,390, 15828,26214, 47934,23019,47937,350, 490, 5423, 356, 47938,412, 619, 317, 4984, 47935,47936,1481, 1913, 317, 317, 316, 317, 1160, 47940,47941,47946,47949,47950,47951, - 47952,47955,47957,47960,47962,47963,47966,47972,47979,490, 47980,1020, 47942,47943,1347, 47944,47945,317, 5343, 317, 47947,1078, 317, 332, 47948,381, 2387, - 317, 6623, 5294, 5611, 1588, 7785, 1444, 5836, 5055, 317, 317, 47953,317, 47954,47956,19665,317, 47958,345, 9609, 47959,4965, 16528,47961,47964,47965,350, - 596, 21318,10894,47967,47969,47970,5662, 350, 47971,1347, 47968,345, 317, 317, 10641,356, 466, 317, 47973,47974,47976,47977,373, 47975,317, 34174,317, - 317, 11436,47978,2374, 422, 343, 44432,371, 332, 47982,47983,13219,47984,5840, 47986,47989,47991,332, 2402, 47993,47998,48001,48002,48003,343, 14806,382, + 47952,47955,47957,47960,47962,47963,47966,47972,47979,490, 47980,1020, 47942,47943,1347, 47944,47945,317, 5343, 317, 47947,1078, 317, 332, 47948,381, 2387, + 317, 6623, 5294, 5611, 1588, 7785, 1444, 5836, 5055, 317, 317, 47953,317, 47954,47956,19665,317, 47958,345, 9609, 47959,4965, 16528,47961,47964,47965,350, + 596, 21318,10894,47967,47969,47970,5662, 350, 47971,1347, 47968,345, 317, 317, 10641,356, 466, 317, 47973,47974,47976,47977,373, 47975,317, 34174,317, + 317, 11436,47978,2374, 422, 343, 44432,371, 332, 47982,47983,13219,47984,5840, 47986,47989,47991,332, 2402, 47993,47998,48001,48002,48003,343, 14806,382, 574, 47985,605, 351, 5809, 47987,47988,5295, 47990,11442,332, 1030, 13323,23116,5894, 1459, 47992,5241, 343, 490, 5087, 363, 47994,363, 332, 47995,47997, 558, 47996,317, 6228, 6996, 317, 317, 317, 317, 317, 317, 14999,317, 7127, 5295, 47999,48000,12344,27218,8125, 332, 4738, 363, 11038,558, 317, 48004, - 48006,362, 2156, 16931,514, 317, 351, 2022, 48005,3599, 356, 11089,466, 5157, 6673, 32079,46708,317, 343, 48007,47229,48009,2568, 48011,48015,490, 3884, - 48017,2036, 382, 4982, 317, 4960, 48019,501, 317, 343, 48010,48012,48013,2272, 11040,1033, 317, 48014,48016,5897, 13686,5436, 5437, 14708,48018,2845, 1033, + 48006,362, 2156, 16931,514, 317, 351, 2022, 48005,3599, 356, 11089,466, 5157, 6673, 32079,46708,317, 343, 48007,47229,48009,2568, 48011,48015,490, 3884, + 48017,2036, 382, 4982, 317, 4960, 48019,501, 317, 343, 48010,48012,48013,2272, 11040,1033, 317, 48014,48016,5897, 13686,5436, 5437, 14708,48018,2845, 1033, 48020,2368, 11308,317, 8421, 317, 578, 48022,48029,48045,48056,48058,3284, 317, 2184, 20219,48023,48025,25086,48010,9422, 317, 48024,370, 2163, 48026,27231, - 317, 317, 48028,351, 48027,5295, 3284, 5836, 553, 1347, 48030,48032,48035,965, 48038,48044,24810,317, 48031,317, 320, 356, 48033,466, 14462,2272, 317, + 317, 317, 48028,351, 48027,5295, 3284, 5836, 553, 1347, 48030,48032,48035,965, 48038,48044,24810,317, 48031,317, 320, 356, 48033,466, 14462,2272, 317, 48034,48036,317, 6089, 11939,9692, 48037,351, 433, 48039,48040,48041,33256,12525,2272, 48043,4980, 5717, 514, 6629, 10820,48042,965, 363, 965, 404, 48046, - 371, 48048,48049,48052,48053,317, 48047,317, 373, 317, 317, 317, 345, 4965, 48050,48051,13686,48054,390, 345, 48055,363, 343, 2317, 30878,317, 317, + 371, 48048,48049,48052,48053,317, 48047,317, 373, 317, 317, 317, 345, 4965, 48050,48051,13686,48054,390, 345, 48055,363, 343, 2317, 30878,317, 317, 317, 317, 15531,365, 48057,317, 317, 317, 9320, 363, 48060,10316,317, 48064,48067,362, 370, 6412, 317, 6645, 48061,8852, 48062,48063,3284, 16589,48065, 317, 553, 317, 317, 48066,3284, 4410, 48068,48069,381, 2067, 11844,317, 7911, 345, 554, 42698,11782,5037, 317, 351, 48071,48083,350, 48085,6387, 48072, 317, 404, 48079,48081,5701, 48073,48074,317, 48075,48076,48077,48078,351, 9548, 317, 48080,370, 6382, 48082,48084,48086,1160, 620, 345, 317, 48088,48089, - 48091,317, 14250,12287,596, 7490, 48094,48095,490, 6409, 317, 479, 317, 48090,48092,48093,1347, 16129,545, 363, 317, 29097,48097,7657, 351, 343, 404, - 2058, 4984, 48099,22866,48101,48103,48109,48100,48102,19082,48104,48105,48106,48107,48108,48110,607, 371, 48111,317, 356, 396, 48113,48116,48117,48118,380, + 48091,317, 14250,12287,596, 7490, 48094,48095,490, 6409, 317, 479, 317, 48090,48092,48093,1347, 16129,545, 363, 317, 29097,48097,7657, 351, 343, 404, + 2058, 4984, 48099,22866,48101,48103,48109,48100,48102,19082,48104,48105,48106,48107,48108,48110,607, 371, 48111,317, 356, 396, 48113,48116,48117,48118,380, 48114,48115,48120,48121,48131,48133,48134,48138,48122,48123,48124,48125,48126,48127,48128,48129,48130,18791,48132,48135,490, 48136,48137,380, 48139,48145,48177, 48214,48223,48257,48275,490, 48303,11280,48304,48315,48348,161, 48471,48477,48503,48511,48514,48537,48606,48611,48638,343, 48640,41256,48140,2086, 317, 48142, - 48144,2163, 23309,5447, 317, 317, 48141,317, 466, 5055, 1347, 1347, 48143,343, 317, 5623, 511, 48146,48147,48149,5238, 343, 362, 48167,48168,317, 4873, + 48144,2163, 23309,5447, 317, 317, 48141,317, 466, 5055, 1347, 1347, 48143,343, 317, 5623, 511, 48146,48147,48149,5238, 343, 362, 48167,48168,317, 4873, 48176,8214, 317, 5226, 317, 48148,343, 1160, 317, 317, 2067, 345, 317, 48150,36232,48151,48166,48152,7942, 339, 5217, 362, 317, 48158,15531,48153,48156, - 48154,370, 317, 48155,370, 7888, 5447, 27142,48157,48159,317, 48163,317, 48165,48160,48162,317, 48161,345, 48164,48169,48172,48175,317, 317, 490, 3688, - 48170,317, 48171,1160, 21412,345, 15642,317, 48173,5037, 48174,7976, 1347, 356, 2715, 48178,48179,48181,48186,48199,48200,48211,48213,5890, 332, 365, 490, + 48154,370, 317, 48155,370, 7888, 5447, 27142,48157,48159,317, 48163,317, 48165,48160,48162,317, 48161,345, 48164,48169,48172,48175,317, 317, 490, 3688, + 48170,317, 48171,1160, 21412,345, 15642,317, 48173,5037, 48174,7976, 1347, 356, 2715, 48178,48179,48181,48186,48199,48200,48211,48213,5890, 332, 365, 490, 15035,6651, 48180,16117,11065,2272, 7565, 48182,317, 2537, 317, 5717, 48183,48184,25756,466, 351, 1588, 48185,574, 4591, 371, 48187,9624, 511, 48189,48190, - 9012, 48191,48188,8557, 15337,2631, 490, 48192,382, 362, 317, 48193,48197,28588,6598, 9012, 48194,48195,48196,48198,9182, 4591, 317, 633, 48201,14444,350, + 9012, 48191,48188,8557, 15337,2631, 490, 48192,382, 362, 317, 48193,48197,28588,6598, 9012, 48194,48195,48196,48198,9182, 4591, 317, 633, 48201,14444,350, 48202,48203,48205,2571, 48207,317, 48210,317, 317, 5223, 370, 317, 1992, 345, 317, 370, 48204,48206,48208,48209,317, 48212,2271, 3751, 4965, 426, 48215, - 12142,343, 48218,343, 317, 48219,48220,553, 48222,11654,48216,343, 317, 551, 48217,317, 48221,351, 2272, 426, 48224,48234,48237,48239,48241,351, 5425, + 12142,343, 48218,343, 317, 48219,48220,553, 48222,11654,48216,343, 317, 551, 48217,317, 48221,351, 2272, 426, 48224,48234,48237,48239,48241,351, 5425, 317, 48242,48243,48244,48245,48248,48251,48255,27865,2134, 590, 2566, 48225,48228,382, 48229,48230,362, 48231,48232,48233,371, 5223, 48226,48227,605, 13686, - 317, 5662, 317, 14709,1830, 439, 6593, 351, 466, 466, 6594, 476, 390, 12291,48235,48236,33795,317, 317, 5896, 48238,343, 553, 317, 343, 48240,332, + 317, 5662, 317, 14709,1830, 439, 6593, 351, 466, 466, 6594, 476, 390, 12291,48235,48236,33795,317, 317, 5896, 48238,343, 553, 317, 343, 48240,332, 15758,317, 550, 343, 317, 1950, 3079, 343, 362, 343, 317, 390, 48246,343, 317, 5662, 317, 7949, 6598, 48247,317, 317, 48249,48250,28512,21318,48252, - 48253,48254,5570, 48256,1230, 673, 1347, 363, 48258,48272,4952, 551, 48273,48274,48259,48260,3178, 48261,48262,48263,48265,1347, 48267,48271,6089, 24393,384, + 48253,48254,5570, 48256,1230, 673, 1347, 363, 48258,48272,4952, 551, 48273,48274,48259,48260,3178, 48261,48262,48263,48265,1347, 48267,48271,6089, 24393,384, 392, 48264,476, 48266,466, 48268,363, 5419, 48269,48270,339, 6166, 370, 384, 551, 27066,370, 10626,1194, 10422,3999, 12993,317, 48276,48278,48279,48280, - 7490, 350, 362, 48298,48299,48301,363, 5399, 6355, 5634, 48277,404, 12277,3079, 14535,5055, 3079, 48281,317, 317, 48282,6532, 48285,48286,48288,466, 6021, - 362, 48294,48295,11803,35846,48283,48284,370, 10012,317, 5363, 1347, 381, 48287,5223, 356, 48289,48290,428, 48292,48291,1526, 2601, 48293,14320,9648, 317, + 7490, 350, 362, 48298,48299,48301,363, 5399, 6355, 5634, 48277,404, 12277,3079, 14535,5055, 3079, 48281,317, 317, 48282,6532, 48285,48286,48288,466, 6021, + 362, 48294,48295,11803,35846,48283,48284,370, 10012,317, 5363, 1347, 381, 48287,5223, 356, 48289,48290,428, 48292,48291,1526, 2601, 48293,14320,9648, 317, 48296,370, 1597, 48297,317, 21139,317, 48300,17410,317, 5687, 2178, 48302,48305,48306,48314,345, 356, 949, 410, 317, 381, 48307,48309,48310,48312,44345, 48313,48308,317, 48311,466, 317, 317, 5335, 2391, 381, 5040, 393, 48316,48317,48318,48319,9170, 48321,48328,2948, 48331,48342,48344,1526, 511, 48346,48347, - 381, 14341,48320,48322,48323,385, 390, 48325,490, 7792, 5891, 48324,317, 317, 48326,48327,317, 48329,10476,5896, 14571,48330,10894,48332,48336,48339,2503, + 381, 14341,48320,48322,48323,385, 390, 48325,490, 7792, 5891, 48324,317, 317, 48326,48327,317, 48329,10476,5896, 14571,48330,10894,48332,48336,48339,2503, 48340,5896, 317, 48333,343, 317, 48335,317, 48334,2152, 382, 543, 18840,48337,11442,10592,48338,317, 385, 317, 317, 317, 48341,48343,553, 490, 48345, 317, 945, 13422,6195, 6601, 48349,48352,490, 48358,48361,343, 343, 48364,48365,48366,48370,36635,5628, 343, 48350,6752, 5438, 48351,867, 32869,48353,48354, - 339, 317, 2391, 317, 48355,48356,362, 48357,7401, 48359,16368,48360,2609, 317, 439, 7438, 48362,48363,5365, 5991, 466, 2571, 317, 381, 12731,596, 365, - 48367,317, 48368,32011,345, 48369,48371,2391, 48374,466, 48375,317, 48372,48373,48376,9444, 48378,48386,48412,12556,48422,48436,48439,365, 48440,48449,362, + 339, 317, 2391, 317, 48355,48356,362, 48357,7401, 48359,16368,48360,2609, 317, 439, 7438, 48362,48363,5365, 5991, 466, 2571, 317, 381, 12731,596, 365, + 48367,317, 48368,32011,345, 48369,48371,2391, 48374,466, 48375,317, 48372,48373,48376,9444, 48378,48386,48412,12556,48422,48436,48439,365, 48440,48449,362, 48453,48456,6601, 48459,48466,48469,5037, 6089, 317, 48470,1588, 362, 317, 501, 14805,48377,5120, 5392, 48379,48380,48381,1347, 48383,48382,48384,1999, 48385, 317, 317, 317, 18133,48387,48390,48394,48401,3023, 48402,48403,48406,18460,350, 48407,14573,48408,48410,543, 317, 370, 6228, 317, 7055, 317, 380, 48388, - 48389,317, 2222, 48391,48392,1358, 4949, 371, 11685,356, 48393,363, 48395,48396,48397,48400,20672,439, 317, 396, 5663, 545, 48398,24047,48399,10626,6089, + 48389,317, 2222, 48391,48392,1358, 4949, 371, 11685,356, 48393,363, 48395,48396,48397,48400,20672,439, 317, 396, 5663, 545, 48398,24047,48399,10626,6089, 741, 10560,8223, 20746,362, 9719, 317, 6598, 1033, 317, 317, 1459, 48404,48405,6036, 2272, 3529, 48409,1025, 390, 48411,17565,2077, 2022, 6604, 317, 48413, 48418,317, 565, 362, 350, 10149,21014,6379, 48420,9244, 6736, 48421,48414,317, 48416,5412, 48415,949, 317, 317, 48417,370, 317, 370, 1526, 48419,37561, - 4960, 22254,2219, 4943, 362, 1871, 48423,48426,48428,9624, 317, 590, 48430,317, 10223,16825,317, 490, 501, 48432,317, 48424,490, 317, 317, 16992,501, + 4960, 22254,2219, 4943, 362, 1871, 48423,48426,48428,9624, 317, 590, 48430,317, 10223,16825,317, 490, 501, 48432,317, 48424,490, 317, 317, 16992,501, 48425,48427,371, 371, 382, 14444,16889,10020,48429,356, 48424,16651,317, 48431,5105, 48433,317, 48434,48435,48437,48438,317, 381, 345, 317, 1033, 14499, 9067, 48441,5159, 48442,20848,48444,48445,48446,9064, 5223, 48443,349, 11245,317, 27846,345, 8178, 5836, 48447,48448,317, 370, 48450,48451,48452,48454,48455, - 343, 10633,1358, 7866, 553, 380, 5662, 317, 47873,317, 317, 345, 48457,23859,48458,339, 427, 370, 48460,48462,48464,363, 370, 2022, 350, 363, 501, + 343, 10633,1358, 7866, 553, 380, 5662, 317, 47873,317, 317, 345, 48457,23859,48458,339, 427, 370, 48460,48462,48464,363, 370, 2022, 350, 363, 501, 18840,48461,367, 381, 48463,356, 48465,317, 4564, 48467,350, 363, 317, 317, 48468,4984, 370, 343, 317, 48472,317, 489, 7941, 1753, 5897, 48473,48474, - 511, 48476,2086, 18084,345, 2715, 1999, 48475,317, 501, 2413, 48478,48479,2024, 554, 48480,48481,362, 48483,48485,48489,48494,48500,5120, 365, 343, 1347, - 16589,490, 1108, 317, 317, 7389, 48482,351, 48484,317, 490, 48486,48488,5295, 48487,35460,10894,48490,14708,48491,5662, 48493,317, 317, 2117, 317, 5223, - 48492,381, 48495,14174,16021,48497,48498,363, 48499,15658,48496,27860,5309, 5309, 351, 317, 317, 317, 384, 2272, 371, 48501,48502,317, 317, 5295, 317, + 511, 48476,2086, 18084,345, 2715, 1999, 48475,317, 501, 2413, 48478,48479,2024, 554, 48480,48481,362, 48483,48485,48489,48494,48500,5120, 365, 343, 1347, + 16589,490, 1108, 317, 317, 7389, 48482,351, 48484,317, 490, 48486,48488,5295, 48487,35460,10894,48490,14708,48491,5662, 48493,317, 317, 2117, 317, 5223, + 48492,381, 48495,14174,16021,48497,48498,363, 48499,15658,48496,27860,5309, 5309, 351, 317, 317, 317, 384, 2272, 371, 48501,48502,317, 317, 5295, 317, 48504,48505,48507,48509,48506,317, 2510, 17228,1526, 317, 48508,21831,397, 317, 48510,356, 9095, 317, 48512,8772, 48513,317, 317, 317, 7399, 48515,48517, - 48518,48519,48521,48523,48526,343, 9420, 48529,317, 48530,48531,317, 317, 48536,637, 5825, 633, 2366, 14263,7073, 2177, 48516,12001,365, 30398,19287,479, - 317, 5570, 7850, 332, 8978, 317, 48520,365, 574, 317, 14146,371, 317, 48522,362, 48524,48525,7657, 345, 317, 1481, 365, 3284, 316, 5120, 48527,8273, + 48518,48519,48521,48523,48526,343, 9420, 48529,317, 48530,48531,317, 317, 48536,637, 5825, 633, 2366, 14263,7073, 2177, 48516,12001,365, 30398,19287,479, + 317, 5570, 7850, 332, 8978, 317, 48520,365, 574, 317, 14146,371, 317, 48522,362, 48524,48525,7657, 345, 317, 1481, 365, 3284, 316, 5120, 48527,8273, 48528,32538,47923,10894,14088,317, 317, 48532,13895,48535,317, 317, 48533,9027, 410, 48534,3999, 317, 317, 21413,317, 355, 2134, 48538,1194, 48540,48542, 48548,48559,5793, 343, 48563,350, 48565,48568,48570,48571,48595,48599,48602,48603,350, 14806,48539,48541,551, 12556,2171, 19303,2317, 16024,317, 363, 48543, - 48547,317, 48544,317, 370, 5477, 370, 48545,1347, 317, 48546,48549,2402, 48550,48551,48557,317, 317, 45496,48552,10253,14569,48553,48554,48555,48556,351, - 339, 317, 317, 48558,48560,48561,5727, 4268, 48562,48564,345, 48566,48567,9573, 48569,419, 370, 350, 590, 48572,1020, 2108, 48575,5662, 48594,15066,317, + 48547,317, 48544,317, 370, 5477, 370, 48545,1347, 317, 48546,48549,2402, 48550,48551,48557,317, 317, 45496,48552,10253,14569,48553,48554,48555,48556,351, + 339, 317, 317, 48558,48560,48561,5727, 4268, 48562,48564,345, 48566,48567,9573, 48569,419, 370, 350, 590, 48572,1020, 2108, 48575,5662, 48594,15066,317, 317, 351, 380, 317, 48573,48574,2306, 5991, 466, 317, 1588, 317, 5761, 48576,317, 48577,48582,317, 48583,48584,48586,48589,48591,6318, 2387, 317, 48592, - 404, 48593,565, 48578,317, 48579,7940, 48580,48581,6598, 317, 384, 48585,370, 48587,343, 48588,48590,4984, 2374, 1588, 2171, 9822, 48596,48597,48598,317, - 10267,345, 12062,48600,48601,5943, 48604,4738, 7428, 48605,48607,48608,48610,31083,48609,48612,48613,48633,2022, 5439, 48636,2156, 48637,2058, 317, 373, 1345, - 11388,317, 48320,15334,48614,48617,48264,7850, 48619,48631,2609, 2022, 48615,48616,48618,317, 343, 16384,2571, 48620,356, 596, 48621,48622,48624,48629,2272, + 404, 48593,565, 48578,317, 48579,7940, 48580,48581,6598, 317, 384, 48585,370, 48587,343, 48588,48590,4984, 2374, 1588, 2171, 9822, 48596,48597,48598,317, + 10267,345, 12062,48600,48601,5943, 48604,4738, 7428, 48605,48607,48608,48610,31083,48609,48612,48613,48633,2022, 5439, 48636,2156, 48637,2058, 317, 373, 1345, + 11388,317, 48320,15334,48614,48617,48264,7850, 48619,48631,2609, 2022, 48615,48616,48618,317, 343, 16384,2571, 48620,356, 596, 48621,48622,48624,48629,2272, 48630,317, 363, 573, 389, 48623,342, 345, 48625,48626,48627,48628,370, 370, 48632,384, 5623, 317, 317, 2211, 48634,317, 1347, 48635,404, 2063, 31345, 404, 5406, 5570, 365, 370, 2054, 48639,48641,48644,14263,48650,8099, 7525, 48652,48642,48643,48645,14263,317, 490, 490, 2381, 48647,488, 48646,48648,48649, - 317, 48651,551, 2610, 6713, 6227, 48654,48658,48660,48661,17196,48662,36597,48655,48656,48657,48659,382, 30374,48663,48665,1044, 18152,48664,46183,48666,5896, + 317, 48651,551, 2610, 6713, 6227, 48654,48658,48660,48661,17196,48662,36597,48655,48656,48657,48659,382, 30374,48663,48665,1044, 18152,48664,46183,48666,5896, 6601, 48668,48669,48670,48671,48672,48673,48674,48676,48677,5628, 48691,48694,367, 48700,48707,2163, 5677, 48715,48678,48680,48681,48690,48679,13020,345, 48682, - 48684,48685,39464,1347, 48687,5573, 3529, 26336,8806, 48683,6402, 317, 317, 1109, 5022, 48686,5570, 48688,2036, 48689,48692,48693,48695,2004, 48696,48697,2067, + 48684,48685,39464,1347, 48687,5573, 3529, 26336,8806, 48683,6402, 317, 317, 1109, 5022, 48686,5570, 48688,2036, 48689,48692,48693,48695,2004, 48696,48697,2067, 1347, 2035, 48698,11607,48699,48701,48704,48702,317, 48703,48705,48706,48708,2110, 356, 631, 2163, 48711,490, 48713,48709,48710,490, 48712,48714,317, 12592, 317, 317, 356, 48716,332, 6763, 23928,48719,48728,48743,48776,48784,48802,48813,48833,48841,48849,48850,48863,48883,48903,48980,48996,49014,49015,49040,49070, - 49092,49130,49183,49201,49206,49209,390, 48720,19945,748, 1345, 48721,10832,48726,596, 10422,3504, 10877,317, 48722,466, 48723,20964,48724,48725,48727,362, - 317, 5447, 466, 13631,48729,48730,3987, 48733,48736,48738,350, 48739,48709,48740,11404,883, 390, 3375, 317, 5325, 6382, 37775,363, 356, 48731,48732,5464, + 49092,49130,49183,49201,49206,49209,390, 48720,19945,748, 1345, 48721,10832,48726,596, 10422,3504, 10877,317, 48722,466, 48723,20964,48724,48725,48727,362, + 317, 5447, 466, 13631,48729,48730,3987, 48733,48736,48738,350, 48739,48709,48740,11404,883, 390, 3375, 317, 5325, 6382, 37775,363, 356, 48731,48732,5464, 16319,317, 48734,48735,1992, 317, 317, 16860,9869, 17992,48737,332, 605, 370, 2546, 9454, 9070, 466, 48741,48742,363, 14425,48744,2077, 370, 48751,48755, - 48756,48768,1020, 48774,317, 48745,48747,5570, 48748,48749,317, 1347, 48746,370, 317, 21365,5201, 18588,2537, 867, 48750,5847, 351, 48752,7866, 11089,2134, - 23206,39187,45922,48753,317, 343, 48754,332, 990, 48757,9059, 5840, 48758,48760,48762,12154,48763,45287,48765,385, 3075, 48766,48767,1060, 6089, 350, 370, + 48756,48768,1020, 48774,317, 48745,48747,5570, 48748,48749,317, 1347, 48746,370, 317, 21365,5201, 18588,2537, 867, 48750,5847, 351, 48752,7866, 11089,2134, + 23206,39187,45922,48753,317, 343, 48754,332, 990, 48757,9059, 5840, 48758,48760,48762,12154,48763,45287,48765,385, 3075, 48766,48767,1060, 6089, 350, 370, 370, 5255, 33343,350, 317, 48759,11962,317, 5149, 362, 11242,317, 317, 1999, 48761,351, 48764,16785,427, 7368, 12154,2022, 6190, 332, 48769,574, 48773, 317, 48770,48771,48772,21988,351, 317, 490, 3677, 48775,2322, 404, 48777,48779,48781,317, 48782,48783,2280, 2391, 317, 867, 7095, 317, 48778,48780,10877, 317, 1962, 1347, 317, 317, 2708, 345, 6179, 48785,48786,48788,13954,48792,12934,48793,48795,48796,48798,2758, 501, 48799,490, 351, 2310, 317, 48787,48789, @@ -9685,27 +9680,27 @@ static const unsigned int ChildLocs[185261] = 48838,343, 317, 48840,48835,5663, 11196,15221,396, 13338,48839,343, 5662, 317, 48842,317, 490, 332, 317, 48844,48846,48847,13954,48843,48845,317, 48848, 9298, 590, 8083, 16865,371, 48851,48852,48853,48857,48858,15551,48859,433, 489, 317, 36102,2146, 317, 437, 317, 48854,48855,48856,45499,590, 317, 48860, 48861,48862,48864,317, 48867,48868,48870,48872,362, 48879,48880,2503, 390, 385, 317, 48865,48866,949, 1251, 2503, 48869,48871,48873,6036, 48874,48877,40743, - 356, 7635, 317, 317, 382, 48875,317, 48876,48878,343, 48881,382, 339, 316, 380, 48882,48884,48887,48893,317, 48894,48896,48898,48901,48902,490, 371, - 332, 7403, 48885,48886,317, 317, 18978,2022, 48888,48892,11636,9702, 48889,48890,48891,317, 317, 317, 6179, 365, 317, 317, 48895,48897,48899,5428, 317, - 48900,343, 48904,48905,48907,48912,48920,48976,2022, 48977,363, 48979,1108, 332, 48906,48908,33717,350, 48909,48911,48910,637, 1300, 5463, 633, 10641,2510, + 356, 7635, 317, 317, 382, 48875,317, 48876,48878,343, 48881,382, 339, 316, 380, 48882,48884,48887,48893,317, 48894,48896,48898,48901,48902,490, 371, + 332, 7403, 48885,48886,317, 317, 18978,2022, 48888,48892,11636,9702, 48889,48890,48891,317, 317, 317, 6179, 365, 317, 317, 48895,48897,48899,5428, 317, + 48900,343, 48904,48905,48907,48912,48920,48976,2022, 48977,363, 48979,1108, 332, 48906,48908,33717,350, 48909,48911,48910,637, 1300, 5463, 633, 10641,2510, 317, 48913,48918,48919,13650,317, 48914,48915,24398,2571, 317, 48916,48917,2060, 565, 48921,48923,48928,48931,48932,48936,48939,48943,48948,2276, 48949,48952, - 48956,48957,1588, 48958,48959,48967,48969,5573, 48971,48972,7698, 1588, 350, 48922,428, 48924,2272, 48925,48927,48926,38861,317, 553, 7368, 48929,351, 381, - 48930,363, 384, 466, 317, 48933,48935,381, 5459, 5897, 48934,16129,6081, 3079, 48937,6598, 551, 48938,48940,48941,7142, 48942,11918,350, 5055, 7506, 317, + 48956,48957,1588, 48958,48959,48967,48969,5573, 48971,48972,7698, 1588, 350, 48922,428, 48924,2272, 48925,48927,48926,38861,317, 553, 7368, 48929,351, 381, + 48930,363, 384, 466, 317, 48933,48935,381, 5459, 5897, 48934,16129,6081, 3079, 48937,6598, 551, 48938,48940,48941,7142, 48942,11918,350, 5055, 7506, 317, 8418, 48944,6993, 596, 390, 48945,317, 8357, 345, 48946,48947,1347, 21728,317, 462, 10580,48950,48951,11884,345, 317, 343, 2601, 363, 48953,1588, 48955, - 48954,16129,393, 11064,343, 5241, 5626, 7368, 7618, 48960,48963,16136,48961,48962,317, 48964,48965,396, 510, 48966,3361, 2758, 48968,3999, 48970,317, 3361, - 5037, 16458,428, 545, 10059,363, 48973,48974,48975,7514, 317, 362, 317, 48978,343, 317, 6195, 4738, 1230, 370, 371, 317, 48981,2058, 317, 48985,317, - 48988,48989,5395, 48990,490, 48992,48994,390, 48982,317, 48983,48984,48986,48722,48987,9479, 2161, 1060, 317, 7698, 2066, 4477, 6332, 317, 32083,317, 363, + 48954,16129,393, 11064,343, 5241, 5626, 7368, 7618, 48960,48963,16136,48961,48962,317, 48964,48965,396, 510, 48966,3361, 2758, 48968,3999, 48970,317, 3361, + 5037, 16458,428, 545, 10059,363, 48973,48974,48975,7514, 317, 362, 317, 48978,343, 317, 6195, 4738, 1230, 370, 371, 317, 48981,2058, 317, 48985,317, + 48988,48989,5395, 48990,490, 48992,48994,390, 48982,317, 48983,48984,48986,48722,48987,9479, 2161, 1060, 317, 7698, 2066, 4477, 6332, 317, 32083,317, 363, 5991, 8137, 490, 317, 6036, 317, 2156, 317, 317, 5991, 48991,466, 317, 317, 48993,15058,7672, 1243, 370, 5363, 317, 317, 48995,466, 317, 48997,48999, 49001,49004,49006,49009,49010,49012,49013,343, 48998,1430, 490, 317, 317, 362, 49000,7785, 317, 1160, 317, 2035, 29979,49002,6240, 2322, 49003,49005,49007, - 49008,5991, 380, 49011,2171, 343, 14188,49016,350, 40281,49018,49021,343, 49031,13638,20638,16110,21269,15387,49036,49038,49039,17782,317, 317, 317, 6318, - 558, 49017,317, 343, 24059,6917, 5321, 49019,27994,370, 49020,317, 9140, 545, 49022,49023,4984, 317, 49024,362, 49025,3967, 49030,317, 365, 365, 317, - 5439, 317, 1358, 317, 5300, 49026,49028,317, 2272, 49027,21554,49029,7142, 1160, 317, 317, 6565, 317, 28438,371, 49032,3076, 49033,49034,49035,4984, 1078, + 49008,5991, 380, 49011,2171, 343, 14188,49016,350, 40281,49018,49021,343, 49031,13638,20638,16110,21269,15387,49036,49038,49039,17782,317, 317, 317, 6318, + 558, 49017,317, 343, 24059,6917, 5321, 49019,27994,370, 49020,317, 9140, 545, 49022,49023,4984, 317, 49024,362, 49025,3967, 49030,317, 365, 365, 317, + 5439, 317, 1358, 317, 5300, 49026,49028,317, 2272, 49027,21554,49029,7142, 1160, 317, 317, 6565, 317, 28438,371, 49032,3076, 49033,49034,49035,4984, 1078, 490, 317, 1108, 490, 317, 317, 317, 19390,20276,49037,317, 2272, 1347, 343, 390, 363, 466, 380, 343, 363, 317, 317, 49041,1187, 49044,49047,49049, - 49051,49052,49054,10487,49055,49056,49059,14561,5428, 5611, 49042,5238, 2537, 49043,317, 49045,49046,317, 5428, 317, 343, 2024, 49048,317, 390, 317, 6228, - 317, 5087, 317, 49050,2110, 7698, 7785, 343, 35158,49053,332, 2222, 3284, 317, 20909,381, 2381, 317, 490, 317, 14080,49057,2571, 362, 317, 49058,382, + 49051,49052,49054,10487,49055,49056,49059,14561,5428, 5611, 49042,5238, 2537, 49043,317, 49045,49046,317, 5428, 317, 343, 2024, 49048,317, 390, 317, 6228, + 317, 5087, 317, 49050,2110, 7698, 7785, 343, 35158,49053,332, 2222, 3284, 317, 20909,381, 2381, 317, 490, 317, 14080,49057,2571, 362, 317, 49058,382, 345, 49060,2119, 11245,7073, 14338,49066,7178, 49067,49061,49062,49063,49064,49065,8400, 390, 49068,49069,4984, 49071,49072,49074,49082,49083,49087,49088,49090, 10185,2536, 49073,49075,351, 5419, 49078,49079,49081,351, 350, 49076,49077,49080,1060, 990, 2219, 49084,7368, 49085,49086,317, 12154,363, 27334,317, 49089, - 27614,1358, 4984, 317, 49091,924, 49093,2236, 49094,49095,49102,49103,49108,49114,332, 49116,1358, 965, 49119,49123,49124,49125,49128,317, 6318, 332, 437, + 27614,1358, 4984, 317, 49091,924, 49093,2236, 49094,49095,49102,49103,49108,49114,332, 49116,1358, 965, 49119,49123,49124,49125,49128,317, 6318, 332, 437, 1347, 49096,363, 370, 10854,2571, 49099,49100,317, 47392,49097,381, 1194, 49098,3505, 35981,49101,2381, 317, 489, 1358, 49104,448, 7063, 49105,1020, 45287, 49106,49107,404, 6318, 6036, 363, 370, 7368, 317, 1160, 317, 49109,6228, 317, 49110,7183, 36617,49111,49113,49112,49115,19414,489, 317, 2572, 49117,49118, 1347, 596, 49120,49122,596, 317, 317, 867, 49121,7865, 317, 18657,14337,11921,317, 38201,343, 1020, 49126,43452,9832, 5241, 49127,356, 317, 5761, 49129, @@ -9713,45 +9708,45 @@ static const unsigned int ChildLocs[185261] = 49145,49146,49150,343, 49151,49152,49153,49154,49156,49157,49162,49164,2272, 49166,49167,49171,49174,6996, 49176,49178,317, 317, 7155, 317, 1267, 317, 49136, 317, 317, 317, 317, 633, 1018, 681, 47681,343, 317, 589, 317, 1897, 49140,49141,49142,49143,16278,7590, 6354, 2631, 9649, 381, 10609,317, 384, 49147, 49148,49149,539, 1579, 2060, 27498,35859,363, 574, 351, 2035, 39003,49155,317, 49158,476, 49159,49160,49161,1160, 343, 370, 356, 22783,343, 17040,35295, - 49163,7055, 49165,38558,479, 48208,6228, 317, 633, 317, 49168,7672, 49169,49170,362, 317, 317, 317, 1160, 390, 990, 28241,317, 1107, 49172,384, 343, - 466, 49173,317, 447, 16865,589, 5126, 49175,5891, 5295, 345, 317, 49177,10592,4965, 317, 49180,49182,22641,17588,49181,381, 317, 6089, 370, 2063, 317, - 490, 2272, 317, 49184,49185,49186,49189,8948, 49193,2022, 49194,362, 49195,49197,317, 49199,317, 351, 370, 2402, 345, 22995,49187,5841, 317, 49188,317, - 380, 48801,49190,49191,2406, 356, 466, 9590, 317, 317, 49192,1108, 1992, 317, 1108, 11229,351, 35119,317, 596, 370, 49196,523, 370, 49198,317, 350, + 49163,7055, 49165,38558,479, 48208,6228, 317, 633, 317, 49168,7672, 49169,49170,362, 317, 317, 317, 1160, 390, 990, 28241,317, 1107, 49172,384, 343, + 466, 49173,317, 447, 16865,589, 5126, 49175,5891, 5295, 345, 317, 49177,10592,4965, 317, 49180,49182,22641,17588,49181,381, 317, 6089, 370, 2063, 317, + 490, 2272, 317, 49184,49185,49186,49189,8948, 49193,2022, 49194,362, 49195,49197,317, 49199,317, 351, 370, 2402, 345, 22995,49187,5841, 317, 49188,317, + 380, 48801,49190,49191,2406, 356, 466, 9590, 317, 317, 49192,1108, 1992, 317, 1108, 11229,351, 35119,317, 596, 370, 49196,523, 370, 49198,317, 350, 317, 2171, 49200,21274,16164,2022, 49202,49203,49204,363, 49205,49207,19283,343, 317, 5991, 5112, 2381, 381, 371, 49208,6514, 370, 2584, 5201, 49210,49211, 49212,2279, 49213,365, 5611, 332, 332, 490, 590, 9067, 343, 317, 351, 42911,332, 317, 5836, 490, 49215,490, 49216,49217,49218,49219,381, 49221,49224, 49229,345, 49230,351, 49222,49223,49225,49226,49227,49228,317, 49232,49235,49236,49240,25825,343, 49241,49233,49234,11073,607, 49237,34691,49238,49239,49242, 7477, 49243,949, 1193, 396, 49244,49256,49276,49325,49346,49370,49384,49391,49393,49398,49400,49409,49414,49430,49452,49457,49466,49468,49473,49484,317, 49501, 5624, 49508,49519,49521,596, 965, 49245,49246,317, 2280, 317, 317, 2073, 501, 317, 490, 49247,5891, 49253,49248,9289, 49249,1230, 49250,49251,49252,49254, - 49255,49257,49260,49262,49265,343, 1020, 362, 49267,49270,49274,317, 39985,363, 11451,49258,370, 49259,49261,384, 317, 553, 317, 15330,371, 49263,317, + 49255,49257,49260,49262,49265,343, 1020, 362, 49267,49270,49274,317, 39985,363, 11451,49258,370, 49259,49261,384, 317, 553, 317, 15330,371, 49263,317, 10086,317, 49264,317, 49266,45719,11147,5619, 490, 49268,317, 317, 49269,5570, 49271,49272,49273,4268, 30478,49275,1108, 49277,49281,49284,49287,49294,49305, 49317,49318,49320,49321,49323,9027, 49278,49280,5517, 49279,332, 1266, 14689,33417,317, 501, 317, 49282,15051,4591, 49283,2211, 7672, 2715, 351, 317, 49285, - 49286,317, 49288,49289,9427, 7428, 49292,49290,2210, 49291,2715, 49293,49295,4925, 49296,49297,49298,317, 49301,49303,49304,317, 343, 345, 317, 15307,317, + 49286,317, 49288,49289,9427, 7428, 49292,49290,2210, 49291,2715, 49293,49295,4925, 49296,49297,49298,317, 49301,49303,49304,317, 343, 345, 317, 15307,317, 1329, 317, 49299,49300,317, 317, 49302,49306,49307,14708,49310,362, 46173,605, 10626,49312,49313,317, 317, 49308,317, 381, 317, 49309,7392, 428, 49311, - 370, 49290,4738, 427, 14277,6996, 317, 317, 317, 1353, 3469, 317, 1353, 8301, 49314,35809,14501,2272, 49316,317, 381, 49315,343, 7942, 4788, 49319,5241, - 5411, 5241, 1160, 2631, 49322,590, 371, 49324,11347,49326,49327,49328,49331,49332,49333,27154,49335,49336,49337,553, 345, 49340,49342,317, 553, 6917, 5662, - 49329,49330,10081,317, 5309, 362, 574, 351, 2063, 49334,317, 5538, 7149, 427, 605, 427, 19605,2290, 49338,49339,7668, 365, 49341,13221,317, 49343,371, + 370, 49290,4738, 427, 14277,6996, 317, 317, 317, 1353, 3469, 317, 1353, 8301, 49314,35809,14501,2272, 49316,317, 381, 49315,343, 7942, 4788, 49319,5241, + 5411, 5241, 1160, 2631, 49322,590, 371, 49324,11347,49326,49327,49328,49331,49332,49333,27154,49335,49336,49337,553, 345, 49340,49342,317, 553, 6917, 5662, + 49329,49330,10081,317, 5309, 362, 574, 351, 2063, 49334,317, 5538, 7149, 427, 605, 427, 19605,2290, 49338,49339,7668, 365, 49341,13221,317, 49343,371, 49344,317, 49345,7911, 31976,2026, 49347,49350,49356,332, 49358,11249,49360,49361,553, 49362,49363,49365,49367,5570, 49348,343, 365, 49349,49351,49353,49352, - 49354,466, 49355,5626, 16187,2610, 49357,317, 343, 553, 553, 362, 1347, 49359,466, 15758,1347, 437, 49364,365, 317, 49366,350, 5793, 49368,49369,7063, + 49354,466, 49355,5626, 16187,2610, 49357,317, 343, 553, 553, 362, 1347, 49359,466, 15758,1347, 437, 49364,365, 317, 49366,350, 5793, 49368,49369,7063, 15908,1020, 2022, 49371,317, 49372,49373,49375,49383,49374,49376,49377,49378,49379,49380,49381,49382,49385,49387,4965, 49388,317, 49389,385, 49390,317, 49386, - 332, 5134, 990, 351, 466, 19548,5662, 14999,49392,466, 9938, 317, 371, 11173,5159, 49394,49395,49397,1109, 317, 15772,317, 317, 317, 49396,7403, 317, + 332, 5134, 990, 351, 466, 19548,5662, 14999,49392,466, 9938, 317, 371, 11173,5159, 49394,49395,49397,1109, 317, 15772,317, 317, 317, 49396,7403, 317, 3648, 4982, 49399,371, 357, 49401,49405,49407,362, 49408,490, 20592,14805,49402,419, 5295, 6228, 25872,49403,19913,49404,317, 5159, 1347, 317, 49406,49315, 35321,317, 1347, 380, 11198,1347, 49410,339, 49411,49413,317, 5809, 49412,356, 317, 396, 382, 317, 49415,49417,36329,49422,2022, 49426,49427,3243, 49428, - 965, 49416,317, 49418,49419,2211, 2022, 49421,317, 49420,317, 466, 5960, 10149,4980, 550, 317, 7225, 317, 12277,49423,317, 49424,13995,49425,514, 5201, - 365, 5459, 345, 9068, 12598,317, 317, 351, 1160, 49429,2073, 49431,49432,49434,49443,2024, 49446,49448,350, 49449,49450,49451,317, 370, 317, 6996, 317, - 5748, 7582, 49433,7582, 3599, 5665, 466, 11242,4789, 49435,49436,49437,49439,8223, 29210,38178,14573,49440,49441,543, 317, 4949, 355, 4949, 4949, 317, 370, - 363, 11114,380, 332, 317, 49438,2024, 49442,590, 7911, 9938, 49444,345, 49445,5037, 317, 8136, 388, 14223,501, 49447,10626,2024, 18840,20351,490, 370, + 965, 49416,317, 49418,49419,2211, 2022, 49421,317, 49420,317, 466, 5960, 10149,4980, 550, 317, 7225, 317, 12277,49423,317, 49424,13995,49425,514, 5201, + 365, 5459, 345, 9068, 12598,317, 317, 351, 1160, 49429,2073, 49431,49432,49434,49443,2024, 49446,49448,350, 49449,49450,49451,317, 370, 317, 6996, 317, + 5748, 7582, 49433,7582, 3599, 5665, 466, 11242,4789, 49435,49436,49437,49439,8223, 29210,38178,14573,49440,49441,543, 317, 4949, 355, 4949, 4949, 317, 370, + 363, 11114,380, 332, 317, 49438,2024, 49442,590, 7911, 9938, 49444,345, 49445,5037, 317, 8136, 388, 14223,501, 49447,10626,2024, 18840,20351,490, 370, 466, 363, 2024, 9818, 49453,490, 49456,332, 2357, 49454,49455,49458,49460,350, 49462,49464,49465,9422, 20246,15618,49459,14492,49461,317, 2211, 363, 49463, 1109, 7385, 317, 317, 345, 49467,8772, 363, 1345, 49469,49470,362, 49471,16802,49472,370, 1108, 2022, 1358, 317, 2222, 2581, 49474,370, 49475,317, 49478, - 49479,44722,49481,23015,49482,490, 343, 3688, 5406, 49476,5727, 49477,363, 7698, 351, 5537, 12349,49480,5896, 351, 379, 35634,49483,317, 317, 332, 5091, - 49485,5838, 501, 49486,13378,49490,362, 49491,16123,49494,49495,1020, 3648, 49500,317, 11108,317, 317, 49487,49489,351, 317, 49488,1160, 49492,49493,419, + 49479,44722,49481,23015,49482,490, 343, 3688, 5406, 49476,5727, 49477,363, 7698, 351, 5537, 12349,49480,5896, 351, 379, 35634,49483,317, 317, 332, 5091, + 49485,5838, 501, 49486,13378,49490,362, 49491,16123,49494,49495,1020, 3648, 49500,317, 11108,317, 317, 49487,49489,351, 317, 49488,1160, 49492,49493,419, 1345, 49496,16825,363, 49499,317, 49497,49498,362, 545, 49502,49503,49505,1444, 49506,4041, 1428, 633, 28822,8125, 49504,382, 7098, 19979,49507,619, 49509, - 2171, 12696,404, 49516,49510,9567, 49511,49512,4949, 49513,49514,49515,49517,49518,317, 2369, 345, 4591, 7062, 49520,49522,49523,49524,49525,363, 49526,365, + 2171, 12696,404, 49516,49510,9567, 49511,49512,4949, 49513,49514,49515,49517,49518,317, 2369, 345, 4591, 7062, 49520,49522,49523,49524,49525,363, 49526,365, 350, 5241, 317, 380, 6318, 363, 3283, 351, 350, 5836, 49528,49532,49533,49534,390, 1044, 49529,49530,49531,1160, 1193, 49535,49536,2163, 363, 49538,17206, - 49540,365, 49541,49543,49546,49549,49555,49559,2024, 490, 3999, 49561,8955, 49563,49571,49582,49583,49586,49595,49615,2188, 4564, 49544,5634, 49545,5898, 1998, - 49547,4952, 1453, 49548,49550,8207, 36820,5217, 49554,490, 18298,16970,49551,49552,49553,1345, 1109, 49556,49557,2022, 363, 1453, 4564, 317, 49558,7785, 380, - 49560,317, 427, 49562,3079, 10907,49564,317, 5537, 363, 49566,49565,349, 49567,343, 2094, 49568,49569,49570,356, 6409, 49572,49573,49575,49578,49579,317, + 49540,365, 49541,49543,49546,49549,49555,49559,2024, 490, 3999, 49561,8955, 49563,49571,49582,49583,49586,49595,49615,2188, 4564, 49544,5634, 49545,5898, 1998, + 49547,4952, 1453, 49548,49550,8207, 36820,5217, 49554,490, 18298,16970,49551,49552,49553,1345, 1109, 49556,49557,2022, 363, 1453, 4564, 317, 49558,7785, 380, + 49560,317, 427, 49562,3079, 10907,49564,317, 5537, 363, 49566,49565,349, 49567,343, 2094, 49568,49569,49570,356, 6409, 49572,49573,49575,49578,49579,317, 2022, 49580,2117, 49581,404, 427, 6089, 317, 551, 370, 317, 317, 4943, 49574,317, 551, 7911, 356, 10877,317, 49576,4984, 13023,490, 363, 49577,11533, - 490, 1347, 5792, 370, 317, 8223, 4976, 317, 8772, 6089, 1358, 317, 49584,49585,965, 5701, 5249, 317, 49587,49588,350, 49589,343, 49592,370, 350, 471, + 490, 1347, 5792, 370, 317, 8223, 4976, 317, 8772, 6089, 1358, 317, 49584,49585,965, 5701, 5249, 317, 49587,49588,350, 49589,343, 49592,370, 350, 471, 317, 566, 30214,3284, 8852, 17616,343, 49590,49591,317, 317, 49593,49594,380, 390, 49596,6620, 49605,49613,339, 343, 49614,49597,49598,49599,49600,49601, 49602,49603,49604,49606,49607,49608,49609,49610,49611,49612,427, 9779, 18324,343, 363, 8281, 48607,49617,49620,49625,49618,49619,49621,49622,49623,49624,49626, 49627,49628,49634,49638,35556,49644,49653,34218,49665,49668,49677,49683,165, 51433,173, 51988,175, 52717,52722,178, 53544,53553,53557,53568,53583,183, 54366, @@ -9760,386 +9755,386 @@ static const unsigned int ChildLocs[185261] = 49656,49657,317, 49660,49661,49662,49664,49666,49667,49669,49672,49670,49671,49673,49674,49675,49676,49678,49681,49679,49680,49682,49684,49685,49686,49688,49694, 49710,166, 49899,49966,49983,167, 50082,50138,50204,50227,168, 50403,169, 50657,50661,50685,170, 171, 172, 51266,51309,51321,51323,51351,51398,49687,35779, 49689,49693,49690,49691,49692,7785, 5120, 317, 345, 49695,49696,49697,49698,49704,2134, 1044, 501, 317, 365, 390, 363, 7312, 343, 437, 49699,49700,49701, - 49702,49703,49705,490, 49706,49707,49708,49709,49711,49712,49713,49714,343, 6318, 49716,49717,317, 8083, 317, 10430,317, 317, 49715,317, 18995,317, 2078, - 1230, 1358, 6228, 49718,49734,49737,49754,49769,49778,49783,49789,49810,49819,49839,49846,49851,49857,49859,49863,49867,49886,49888,49890,49894,49895,1347, 8099, - 49719,5611, 49720,558, 49723,49724,49726,317, 49728,10376,49729,49732,49733,5459, 1347, 362, 49721,317, 9027, 49722,9609, 9609, 49725,490, 5325, 49727,2077, - 393, 5238, 38370,9214, 22351,49730,49731,365, 3079, 1444, 2022, 49735,9696, 49736,11786,2261, 49738,49742,2211, 49746,49749,49753,49739,8643, 49740,2021, 1078, + 49702,49703,49705,490, 49706,49707,49708,49709,49711,49712,49713,49714,343, 6318, 49716,49717,317, 8083, 317, 10430,317, 317, 49715,317, 18995,317, 2078, + 1230, 1358, 6228, 49718,49734,49737,49754,49769,49778,49783,49789,49810,49819,49839,49846,49851,49857,49859,49863,49867,49886,49888,49890,49894,49895,1347, 8099, + 49719,5611, 49720,558, 49723,49724,49726,317, 49728,10376,49729,49732,49733,5459, 1347, 362, 49721,317, 9027, 49722,9609, 9609, 49725,490, 5325, 49727,2077, + 393, 5238, 38370,9214, 22351,49730,49731,365, 3079, 1444, 2022, 49735,9696, 49736,11786,2261, 49738,49742,2211, 49746,49749,49753,49739,8643, 49740,2021, 1078, 37821,9427, 2272, 49741,351, 370, 2022, 11786,49743,49744,7916, 49745,332, 5687, 6402, 49747,49748,7622, 12590,380, 317, 49750,49752,49751,3987, 45212,41478, - 49755,49756,49758,49760,49767,11874,2203, 49757,49759,380, 317, 49761,49763,3987, 49762,428, 3987, 6674, 390, 5030, 49764,49765,49766,49768,49770,49772,317, - 49775,317, 49776,317, 10149,14410,49771,317, 49773,49774,23936,3284, 49777,49779,5084, 49780,49781,49782,49784,25768,49788,2609, 541, 49785,49786,49787,317, + 49755,49756,49758,49760,49767,11874,2203, 49757,49759,380, 317, 49761,49763,3987, 49762,428, 3987, 6674, 390, 5030, 49764,49765,49766,49768,49770,49772,317, + 49775,317, 49776,317, 10149,14410,49771,317, 49773,49774,23936,3284, 49777,49779,5084, 49780,49781,49782,49784,25768,49788,2609, 541, 49785,49786,49787,317, 49790,49792,49793,14991,15581,883, 49805,9425, 49806,49807,971, 332, 363, 317, 49791,350, 317, 317, 8083, 9337, 2317, 2156, 317, 49794,490, 49797,49801, 3726, 317, 49795,49796,49798,49799,49800,49802,49803,49804,2317, 317, 317, 37493,370, 317, 490, 382, 4268, 1325, 362, 1358, 350, 5836, 49808,49809,49811, 49812,49814,49817,49818,12199,317, 317, 5032, 1100, 49813,317, 317, 10316,8296, 332, 317, 49815,34487,49816,16503,1588, 343, 971, 343, 621, 49820,49821, - 49824,49830,49833,49835,12053,49836,5809, 46954,380, 362, 1358, 49822,49823,49825,11662,363, 49826,49827,49829,38765,317, 490, 501, 13753,49828,380, 317, - 348, 317, 13908,32352,20918,49831,49832,350, 317, 1230, 404, 317, 10056,49834,363, 17870,317, 317, 5022, 370, 530, 370, 49837,49838,49840,49844,363, - 49841,362, 6318, 343, 501, 49842,317, 49841,49843,1020, 49845,389, 7622, 12349,6355, 49847,49848,49850,404, 6387, 349, 49849,49849,7737, 49852,49855,2117, - 317, 49853,351, 49854,21767,380, 49856,1020, 490, 48296,7711, 49858,49860,49861,3361, 49862,49864,49865,501, 49866,343, 49868,6847, 49869,427, 2074, 2074, - 332, 49870,49873,49875,49878,49882,317, 49883,49885,5836, 49871,4591, 49872,49874,49876,49877,49879,49880,49881,15754,14013,49884,9067, 5687, 9824, 25279,2058, + 49824,49830,49833,49835,12053,49836,5809, 46954,380, 362, 1358, 49822,49823,49825,11662,363, 49826,49827,49829,38765,317, 490, 501, 13753,49828,380, 317, + 348, 317, 13908,32352,20918,49831,49832,350, 317, 1230, 404, 317, 10056,49834,363, 17870,317, 317, 5022, 370, 530, 370, 49837,49838,49840,49844,363, + 49841,362, 6318, 343, 501, 49842,317, 49841,49843,1020, 49845,389, 7622, 12349,6355, 49847,49848,49850,404, 6387, 349, 49849,49849,7737, 49852,49855,2117, + 317, 49853,351, 49854,21767,380, 49856,1020, 490, 48296,7711, 49858,49860,49861,3361, 49862,49864,49865,501, 49866,343, 49868,6847, 49869,427, 2074, 2074, + 332, 49870,49873,49875,49878,49882,317, 49883,49885,5836, 49871,4591, 49872,49874,49876,49877,49879,49880,49881,15754,14013,49884,9067, 5687, 9824, 25279,2058, 49887,49889,1230, 49891,2334, 49893,49892,317, 5412, 7916, 362, 2360, 49896,2634, 49897,49898,49900,543, 49918,49919,49928,343, 49935,49943,12598,49948,49950, - 49952,49953,49955,5300, 49962,49963,1871, 35779,49965,49901,49902,49909,49912,11717,49913,49917,13816,49903,317, 49904,49905,565, 49906,317, 49907,49908,928, - 9504, 49910,363, 49911,49914,49915,49916,45136,501, 605, 49920,49922,49923,49924,49925,49927,316, 1160, 49921,382, 9214, 2211, 2184, 4984, 1160, 1992, 404, - 317, 5962, 49926,317, 317, 317, 5943, 38935,16672,49929,49931,49933,49934,317, 3987, 2271, 49930,6318, 6318, 6318, 343, 317, 49932,1347, 317, 2086, 317, - 49936,49938,49939,49941,6916, 49937,4984, 317, 6763, 1444, 393, 5173, 5120, 49940,49942,317, 317, 362, 380, 49944,49945,1108, 4925, 317, 350, 2035, 317, + 49952,49953,49955,5300, 49962,49963,1871, 35779,49965,49901,49902,49909,49912,11717,49913,49917,13816,49903,317, 49904,49905,565, 49906,317, 49907,49908,928, + 9504, 49910,363, 49911,49914,49915,49916,45136,501, 605, 49920,49922,49923,49924,49925,49927,316, 1160, 49921,382, 9214, 2211, 2184, 4984, 1160, 1992, 404, + 317, 5962, 49926,317, 317, 317, 5943, 38935,16672,49929,49931,49933,49934,317, 3987, 2271, 49930,6318, 6318, 6318, 343, 317, 49932,1347, 317, 2086, 317, + 49936,49938,49939,49941,6916, 49937,4984, 317, 6763, 1444, 393, 5173, 5120, 49940,49942,317, 317, 362, 380, 49944,49945,1108, 4925, 317, 350, 2035, 317, 49946,49947,317, 317, 317, 317, 317, 317, 5037, 49949,367, 384, 466, 4984, 49951,363, 553, 1160, 4810, 24130,384, 7785, 396, 317, 490, 343, 49954, - 1358, 317, 317, 317, 490, 7266, 49956,4984, 49958,49959,49960,317, 332, 49957,317, 332, 16941,490, 317, 18923,317, 317, 5570, 49961,9214, 49964,370, - 49967,49968,49971,49974,49975,49977,49980,343, 5557, 317, 317, 342, 351, 343, 49969,317, 49970,49972,49973,6551, 2134, 4280, 4591, 350, 317, 635, 371, + 1358, 317, 317, 317, 490, 7266, 49956,4984, 49958,49959,49960,317, 332, 49957,317, 332, 16941,490, 317, 18923,317, 317, 5570, 49961,9214, 49964,370, + 49967,49968,49971,49974,49975,49977,49980,343, 5557, 317, 317, 342, 351, 343, 49969,317, 49970,49972,49973,6551, 2134, 4280, 4591, 350, 317, 635, 371, 49976,317, 317, 49978,345, 382, 345, 49979,49981,49982,8914, 15968,49984,49987,348, 490, 490, 49985,49986,7385, 1160, 317, 15082,49988,50003,50004,50009, - 50014,50018,50022,50033,50041,50043,50065,50068,50071,50073,50076,50081,13914,49989,490, 49990,49996,49997,49999,317, 50000,363, 9422, 490, 365, 49991,317, - 49992,49995,3284, 317, 49993,363, 49994,49998,332, 50001,50002,2356, 317, 50005,50008,317, 50006,317, 50007,7911, 43692,50010,317, 50011,7523, 2012, 317, - 10820,317, 363, 50012,6831, 50013,12487,1999, 50015,4268, 317, 317, 317, 50016,50017,12943,317, 637, 43754,317, 633, 490, 317, 50019,50021,50020,367, - 367, 50023,317, 14170,317, 18232,50026,50027,381, 345, 1266, 317, 320, 633, 317, 50024,2631, 5419, 1347, 362, 7916, 317, 50025,6228, 370, 2001, 381, + 50014,50018,50022,50033,50041,50043,50065,50068,50071,50073,50076,50081,13914,49989,490, 49990,49996,49997,49999,317, 50000,363, 9422, 490, 365, 49991,317, + 49992,49995,3284, 317, 49993,363, 49994,49998,332, 50001,50002,2356, 317, 50005,50008,317, 50006,317, 50007,7911, 43692,50010,317, 50011,7523, 2012, 317, + 10820,317, 363, 50012,6831, 50013,12487,1999, 50015,4268, 317, 317, 317, 50016,50017,12943,317, 637, 43754,317, 633, 490, 317, 50019,50021,50020,367, + 367, 50023,317, 14170,317, 18232,50026,50027,381, 345, 1266, 317, 320, 633, 317, 50024,2631, 5419, 1347, 362, 7916, 317, 50025,6228, 370, 2001, 381, 50028,50029,50031,50030,50032,370, 343, 2156, 50034,50036,50037,50040,348, 50035,490, 50038,50039,2142, 10380,5439, 343, 50042,50044,50047,50053,50061,50063, 317, 380, 50045,5634, 3599, 50046,317, 5120, 1347, 50048,50050,50049,317, 50051,50052,404, 317, 5120, 7223, 427, 343, 7888, 5449, 14569,317, 317, 50054, - 5120, 50058,50055,2184, 50056,356, 965, 50057,21047,317, 345, 50059,5752, 50060,50062,1358, 7383, 1160, 50064,317, 363, 6046, 539, 2353, 317, 1526, 1358, - 7000, 7149, 317, 50066,362, 406, 50067,317, 406, 6402, 50069,50070,365, 6763, 50072,8772, 7916, 566, 50074,370, 501, 50075,317, 22578,50077,490, 317, - 50078,343, 50079,50080,1588, 2063, 50083,50117,50118,44440,50121,5623, 2131, 50123,50124,50127,50128,50132,50136,2533, 50084,50091,50093,362, 13457,50094,317, - 50099,50100,50103,50109,50111,50112,1230, 9702, 50085,50088,351, 317, 50086,50087,50089,50090,50092,50095,370, 490, 50098,38220,317, 50096,50097,17547,317, + 5120, 50058,50055,2184, 50056,356, 965, 50057,21047,317, 345, 50059,5752, 50060,50062,1358, 7383, 1160, 50064,317, 363, 6046, 539, 2353, 317, 1526, 1358, + 7000, 7149, 317, 50066,362, 406, 50067,317, 406, 6402, 50069,50070,365, 6763, 50072,8772, 7916, 566, 50074,370, 501, 50075,317, 22578,50077,490, 317, + 50078,343, 50079,50080,1588, 2063, 50083,50117,50118,44440,50121,5623, 2131, 50123,50124,50127,50128,50132,50136,2533, 50084,50091,50093,362, 13457,50094,317, + 50099,50100,50103,50109,50111,50112,1230, 9702, 50085,50088,351, 317, 50086,50087,50089,50090,50092,50095,370, 490, 50098,38220,317, 50096,50097,17547,317, 15093,2110, 370, 490, 370, 317, 317, 15772,50101,50102,50104,317, 6851, 2022, 2078, 50105,7384, 50106,50107,2110, 50108,50110,5022, 490, 50113,50114,50115, 1109, 50116,490, 12226,10072,50119,1548, 50120,317, 536, 490, 317, 50122,317, 7060, 12142,317, 343, 362, 363, 427, 50125,50126,317, 2589, 664, 50129, 50130,50131,10538,15330,370, 50133,50134,50135,317, 490, 50137,9064, 1230, 317, 18387,4591, 50139,50146,6598, 50147,50148,50152,50165,50168,50188,50190,50191, 50200,2568, 50202,50203,4984, 50140,50142,50143,317, 50141,317, 1087, 11089,317, 50144,7035, 50145,2142, 1347, 489, 50149,50150,50151,949, 2586, 34254,50153, 22796,50160,10877,50161,18708,317, 50164,317, 332, 50154,50155,50156,50157,50158,50159,3869, 381, 551, 5223, 50162,50163,317, 356, 466, 50166,50167,10894, - 50169,50170,901, 50171,50172,50173,50174,50175,50180,5037, 50186,317, 317, 6937, 357, 317, 2715, 317, 2078, 867, 439, 2272, 317, 5955, 1325, 3361, 3884, - 50176,50177,50178,50179,50181,50184,50182,50183,13927,10422,466, 317, 50185,523, 363, 3884, 50187,5428, 332, 343, 50189,5570, 17588,317, 20509,343, 381, - 317, 5570, 390, 50192,1109, 343, 50193,50197,50198,317, 46305,317, 50194,434, 381, 50195,317, 50196,50199,5120, 4984, 6401, 4952, 50201,1347, 2683, 317, - 50205,50207,50209,50211,50216,50219,2163, 50220,50222,50226,1230, 332, 50206,50208,351, 8639, 50210,590, 317, 356, 50212,50214,574, 5836, 317, 50213,317, - 8296, 2317, 345, 7672, 50215,317, 28082,317, 50217,317, 356, 317, 50218,317, 8296, 381, 50221,1481, 50223,317, 6847, 490, 10715,50224,490, 50225,370, + 50169,50170,901, 50171,50172,50173,50174,50175,50180,5037, 50186,317, 317, 6937, 357, 317, 2715, 317, 2078, 867, 439, 2272, 317, 5955, 1325, 3361, 3884, + 50176,50177,50178,50179,50181,50184,50182,50183,13927,10422,466, 317, 50185,523, 363, 3884, 50187,5428, 332, 343, 50189,5570, 17588,317, 20509,343, 381, + 317, 5570, 390, 50192,1109, 343, 50193,50197,50198,317, 46305,317, 50194,434, 381, 50195,317, 50196,50199,5120, 4984, 6401, 4952, 50201,1347, 2683, 317, + 50205,50207,50209,50211,50216,50219,2163, 50220,50222,50226,1230, 332, 50206,50208,351, 8639, 50210,590, 317, 356, 50212,50214,574, 5836, 317, 50213,317, + 8296, 2317, 345, 7672, 50215,317, 28082,317, 50217,317, 356, 317, 50218,317, 8296, 381, 50221,1481, 50223,317, 6847, 490, 10715,50224,490, 50225,370, 317, 426, 317, 382, 317, 5201, 1460, 7865, 574, 50228,2948, 50233,50244,50247,50249,15745,50251,50252,50253,50257,50258,343, 317, 317, 490, 590, 15451, - 50229,6370, 365, 50231,50232,317, 50230,2086, 7116, 317, 8099, 8275, 490, 490, 50234,50235,50237,50238,50240,32473,50241,50242,50243,390, 1060, 317, 590, - 50236,317, 50239,317, 490, 2058, 50245,11242,1950, 332, 50246,50248,490, 363, 1347, 317, 42563,50250,5295, 12756,317, 332, 7892, 45719,50254,7127, 3569, + 50229,6370, 365, 50231,50232,317, 50230,2086, 7116, 317, 8099, 8275, 490, 490, 50234,50235,50237,50238,50240,32473,50241,50242,50243,390, 1060, 317, 590, + 50236,317, 50239,317, 490, 2058, 50245,11242,1950, 332, 50246,50248,490, 363, 1347, 317, 42563,50250,5295, 12756,317, 332, 7892, 45719,50254,7127, 3569, 381, 50255,427, 651, 3426, 317, 50256,490, 1044, 12060,367, 741, 367, 317, 390, 45162,490, 11388,50259,50294,50296,50301,50309,50322,50331,50334,50336, 50349,50353,50366,50371,50377,50379,9304, 50383,50384,50394,50395,50399,50400,50402,50260,50264,50268,50270,50271,50273,50274,50275,50277,50279,50087,50285,50286, - 50287,50289,50290,50291,50261,1345, 4984, 50262,50263,50265,490, 50266,50267,2357, 490, 9244, 8296, 317, 40625,317, 50269,596, 317, 50272,3751, 363, 2058, - 370, 50276,317, 43411,317, 317, 1325, 317, 317, 50278,50280,50281,370, 7143, 6834, 332, 2355, 351, 50282,317, 5570, 50283,50284,317, 363, 5104, 2022, + 50287,50289,50290,50291,50261,1345, 4984, 50262,50263,50265,490, 50266,50267,2357, 490, 9244, 8296, 317, 40625,317, 50269,596, 317, 50272,3751, 363, 2058, + 370, 50276,317, 43411,317, 317, 1325, 317, 317, 50278,50280,50281,370, 7143, 6834, 332, 2355, 351, 50282,317, 5570, 50283,50284,317, 363, 5104, 2022, 370, 7149, 50288,490, 1588, 489, 363, 15763,50292,351, 317, 8213, 50293,317, 10943,339, 50295,6673, 3664, 317, 16915,2402, 371, 50297,50298,50300,40660, 50299,50302,50303,50304,50306,365, 50305,5237, 50307,50308,357, 5238, 50310,50313,50314,15136,47721,50315,50317,50142,317, 50319,50320,50321,5836, 317, 50311, 50312,50316,12693,317, 2368, 50318,971, 490, 5838, 1481, 2108, 38782,6993, 50323,50325,50327,50324,50326,317, 50328,50329,50330,7273, 50332,50333,351, 50335, - 317, 15772,5866, 351, 4984, 50337,50338,50340,50341,50343,50344,50347,357, 5241, 382, 1160, 5126, 317, 5120, 21882,317, 50339,50342,24725,356, 317, 317, - 317, 8296, 7785, 50345,7384, 317, 490, 317, 5163, 50346,11844,12302,26029,345, 3284, 5295, 5836, 317, 539, 50348,490, 490, 11280,50350,50351,50352,365, + 317, 15772,5866, 351, 4984, 50337,50338,50340,50341,50343,50344,50347,357, 5241, 382, 1160, 5126, 317, 5120, 21882,317, 50339,50342,24725,356, 317, 317, + 317, 8296, 7785, 50345,7384, 317, 490, 317, 5163, 50346,11844,12302,26029,345, 3284, 5295, 5836, 317, 539, 50348,490, 490, 11280,50350,50351,50352,365, 5624, 317, 50354,50357,50359,50364,9198, 317, 317, 50355,6600, 317, 13314,50356,317, 317, 6420, 317, 343, 317, 410, 371, 317, 2211, 317, 317, 50358, - 15163,345, 317, 317, 48217,317, 50360,50363,317, 50361,50362,371, 2222, 404, 390, 1032, 31745,50365,317, 317, 5890, 50367,5896, 50368,3023, 363, 317, - 6601, 50369,2551, 2219, 370, 26034,50370,10907,426, 351, 50372,50375,50373,50374,50376,7939, 396, 2086, 10223,50378,5149, 10820,2181, 8178, 317, 12060,9388, + 15163,345, 317, 317, 48217,317, 50360,50363,317, 50361,50362,371, 2222, 404, 390, 1032, 31745,50365,317, 317, 5890, 50367,5896, 50368,3023, 363, 317, + 6601, 50369,2551, 2219, 370, 26034,50370,10907,426, 351, 50372,50375,50373,50374,50376,7939, 396, 2086, 10223,50378,5149, 10820,2181, 8178, 317, 12060,9388, 2280, 50380,50381,50382,427, 390, 5332, 18840,50385,50386,50387,50388,50389,50390,50391,31475,317, 392, 44797,317, 9649, 50392,50393,7386, 382, 590, 15017, 1481, 50396,50397,50398,7792, 1108, 5241, 7990, 363, 50401,462, 362, 50404,50414,50415,50417,50419,50420,50429,2086, 490, 50430,50405,50408,672, 12429,50409, - 23751,7801, 5241, 317, 44305,50410,50412,50413,317, 7155, 50406,50407,621, 732, 317, 489, 1230, 380, 50411,2211, 8301, 489, 24111,317, 8281, 50416,317, + 23751,7801, 5241, 317, 44305,50410,50412,50413,317, 7155, 50406,50407,621, 732, 317, 489, 1230, 380, 50411,2211, 8301, 489, 24111,317, 8281, 50416,317, 317, 317, 50418,1109, 490, 50421,50422,50423,50425,50428,317, 6228, 8281, 17731,5241, 332, 370, 317, 50424,5571, 50426,317, 10329,50427,1481, 1913, 32908, 42289,4965, 25114,490, 10991,317, 5241, 428, 50431,6228, 50439,50452,50453,50465,50491,50499,50503,50526,50533,50555,50558,50562,50566,50567,50584,12774,50595, 50596,50598,50613,50625,50640,50643,317, 50646,50648,50432,50433,50434,50435,50436,50437,50438,590, 332, 50440,362, 33846,50443,490, 50444,2163, 50445,50446, 50448,50449,50450,50451,50441,466, 317, 490, 410, 317, 18569,50442,317, 466, 17462,317, 44088,332, 9186, 50447,5022, 1347, 4925, 317, 50454,50455,50461, 50464,15082,317, 50456,50459,50460,317, 6854, 50457,50458,356, 5120, 22210,5406, 317, 1347, 380, 50462,50463,17565,317, 20331,317, 317, 50466,50474,50479, 50482,345, 50483,50486,317, 50489,50490,380, 50467,4591, 317, 50469,50470,50473,343, 1345, 317, 50468,317, 37432,50471,50472,5447, 466, 568, 50475,50477, - 317, 5037, 317, 317, 50476,371, 1109, 404, 741, 4949, 3869, 2022, 50478,7450, 363, 317, 50480,4925, 317, 332, 50481,2381, 317, 317, 50484,5237, 2503, + 317, 5037, 317, 317, 50476,371, 1109, 404, 741, 4949, 3869, 2022, 50478,7450, 363, 317, 50480,4925, 317, 332, 50481,2381, 317, 317, 50484,5237, 2503, 490, 332, 50485,50487,50488,380, 317, 5423, 343, 365, 5105, 490, 7657, 2533, 50492,553, 343, 370, 9938, 50494,1347, 50495,50496,317, 50493,50497,50498, - 551, 50500,317, 50501,50502,7142, 5431, 50504,50509,50512,50513,50519,50520,50521,50522,317, 317, 50505,50507,2357, 317, 317, 1030, 50506,867, 50508,5032, - 317, 6458, 343, 50510,317, 1358, 50511,50514,50517,2178, 50518,2272, 317, 6179, 43909,9298, 50515,50516,1325, 2035, 6228, 345, 356, 1358, 317, 317, 427, - 2108, 9383, 427, 380, 2631, 317, 50523,50524,50525,50527,2948, 50531,50532,490, 50528,4966, 4218, 50529,50530,50534,50536,50541,50542,50546,50547,50548,433, - 357, 2053, 50549,343, 50551,50553,317, 5623, 50535,317, 317, 2163, 50537,50538,317, 18179,50539,50540,50543,6710, 50544,50545,5365, 356, 466, 370, 1347, + 551, 50500,317, 50501,50502,7142, 5431, 50504,50509,50512,50513,50519,50520,50521,50522,317, 317, 50505,50507,2357, 317, 317, 1030, 50506,867, 50508,5032, + 317, 6458, 343, 50510,317, 1358, 50511,50514,50517,2178, 50518,2272, 317, 6179, 43909,9298, 50515,50516,1325, 2035, 6228, 345, 356, 1358, 317, 317, 427, + 2108, 9383, 427, 380, 2631, 317, 50523,50524,50525,50527,2948, 50531,50532,490, 50528,4966, 4218, 50529,50530,50534,50536,50541,50542,50546,50547,50548,433, + 357, 2053, 50549,343, 50551,50553,317, 5623, 50535,317, 317, 2163, 50537,50538,317, 18179,50539,50540,50543,6710, 50544,50545,5365, 356, 466, 370, 1347, 317, 9319, 21013,345, 8296, 317, 490, 605, 380, 50550,30346,5120, 317, 11006,1109, 50552,50554,490, 19463,5526, 50556,317, 6817, 50557,7403, 39137,50559, - 50561,345, 8274, 50560,50563,370, 50565,434, 317, 50564,12625,2571, 332, 345, 2261, 5561, 50568,2566, 50569,50574,50576,50579,317, 50580,50581,1160, 317, - 10792,5626, 317, 6937, 50570,50571,317, 317, 356, 6599, 50572,317, 50573,50575,371, 317, 50577,363, 317, 536, 317, 317, 317, 50578,317, 1025, 554, - 317, 50582,50583,317, 50585,50587,50591,4965, 317, 2022, 50592,362, 50593,35300,50594,357, 345, 565, 2280, 50586,317, 50588,50589,50590,6270, 5447, 466, + 50561,345, 8274, 50560,50563,370, 50565,434, 317, 50564,12625,2571, 332, 345, 2261, 5561, 50568,2566, 50569,50574,50576,50579,317, 50580,50581,1160, 317, + 10792,5626, 317, 6937, 50570,50571,317, 317, 356, 6599, 50572,317, 50573,50575,371, 317, 50577,363, 317, 536, 317, 317, 317, 50578,317, 1025, 554, + 317, 50582,50583,317, 50585,50587,50591,4965, 317, 2022, 50592,362, 50593,35300,50594,357, 345, 565, 2280, 50586,317, 50588,50589,50590,6270, 5447, 466, 26250,25336,317, 2576, 433, 317, 370, 1943, 50597,476, 29553,317, 382, 27151,50599,50601,50602,50604,1597, 50605,6917, 50606,50608,50609,50610,50611,50612, 50600,5255, 2108, 9914, 590, 2110, 5105, 50603,578, 16923,1588, 1481, 5055, 317, 50607,2366, 545, 1160, 351, 6334, 24814,317, 50614,50616,50618,50619,50621, - 50623,6409, 2108, 50624,2381, 317, 50615,490, 1230, 317, 490, 2035, 50617,28340,42726,317, 317, 8597, 317, 317, 2171, 2134, 317, 50620,365, 2272, 317, - 50622,317, 545, 16063,5328, 5207, 5476, 50626,50628,490, 37687,50633,50634,343, 50635,20962,50627,317, 317, 317, 317, 2322, 317, 50629,50630,50631,448, + 50623,6409, 2108, 50624,2381, 317, 50615,490, 1230, 317, 490, 2035, 50617,28340,42726,317, 317, 8597, 317, 317, 2171, 2134, 317, 50620,365, 2272, 317, + 50622,317, 545, 16063,5328, 5207, 5476, 50626,50628,490, 37687,50633,50634,343, 50635,20962,50627,317, 317, 317, 317, 2322, 317, 50629,50630,50631,448, 50632,50636,50639,50637,50638,50641,5038, 50642,2322, 362, 50644,11308,2171, 428, 50645,7785, 50647,9289, 50649,50653,50654,50655,50656,50650,971, 317, 50651, - 867, 50652,317, 6937, 490, 6506, 317, 842, 5105, 1998, 317, 2272, 7672, 351, 365, 590, 5249, 317, 50658,365, 2566, 50659,50660,50662,50663,2163, 317, + 867, 50652,317, 6937, 490, 6506, 317, 842, 5105, 1998, 317, 2272, 7672, 351, 365, 590, 5249, 317, 50658,365, 2566, 50659,50660,50662,50663,2163, 317, 50666,50671,50675,31345,50681,317, 317, 50664,50665,50667,50668,317, 404, 6089, 50669,50670,5991, 50672,50673,317, 490, 10878,50674,50676,50677,50678,50679, 50680,317, 21280,50682,343, 332, 50683,50684,427, 2163, 50686,50705,50712,50757,50761,50769,50770,50801,50802,50845,50848,50867,50877,50886,50888,2155, 50897, 50906,50923,50950,50993,50999,51004,51006,51008,51022,50687,50688,50690,317, 44330,50691,317, 19478,7942, 50692,50693,29200,50694,50698,50700,35527,50702,50704, - 5687, 343, 50689,343, 3375, 490, 317, 317, 9436, 18333,2539, 38220,5439, 539, 332, 345, 332, 50695,50696,18664,13174,6763, 317, 4984, 50697,5037, 7657, + 5687, 343, 50689,343, 3375, 490, 317, 317, 9436, 18333,2539, 38220,5439, 539, 332, 345, 332, 50695,50696,18664,13174,6763, 317, 4984, 50697,5037, 7657, 317, 7939, 317, 351, 317, 6817, 50699,24064,2348, 5427, 25904,317, 50701,371, 345, 343, 1347, 317, 5055, 6638, 50703,390, 2381, 27286,50706,50707,50709, - 50710,2381, 448, 50708,50711,317, 317, 50713,50716,50721,50736,1347, 50741,741, 50752,50754,317, 7850, 2004, 50714,317, 50715,380, 21094,11144,50717,343, - 317, 317, 317, 317, 2272, 50718,50719,317, 9238, 317, 317, 50720,317, 345, 50722,50725,50726,317, 50727,2717, 50728,50732,362, 371, 50723,50724,317, + 50710,2381, 448, 50708,50711,317, 317, 50713,50716,50721,50736,1347, 50741,741, 50752,50754,317, 7850, 2004, 50714,317, 50715,380, 21094,11144,50717,343, + 317, 317, 317, 317, 2272, 50718,50719,317, 9238, 317, 317, 50720,317, 345, 50722,50725,50726,317, 50727,2717, 50728,50732,362, 371, 50723,50724,317, 16039,10590,317, 50729,50730,1347, 50731,7383, 5570, 317, 317, 365, 14982,5570, 1992, 50733,2322, 7657, 50734,365, 50735,365, 317, 50737,5105, 8083, 50739, - 4984, 7850, 35556,317, 317, 50738,317, 371, 7850, 50740,317, 8273, 12803,6228, 50742,50746,317, 50747,50748,1160, 50749,1548, 50743,50744,50745,50750,1358, - 50751,50753,7386, 317, 50755,6996, 317, 50756,501, 363, 50758,50759,371, 317, 380, 317, 317, 8178, 2110, 5120, 50760,317, 50762,50763,50764,317, 317, - 6937, 2845, 50765,357, 50767,50768,1481, 317, 433, 365, 332, 332, 317, 50766,317, 380, 7850, 50771,50776,50778,50780,50787,50790,50796,317, 5828, 317, - 317, 50772,404, 343, 316, 50773,50775,317, 362, 50774,317, 317, 317, 5793, 317, 5891, 343, 317, 18539,317, 317, 343, 50777,404, 317, 317, 381, + 4984, 7850, 35556,317, 317, 50738,317, 371, 7850, 50740,317, 8273, 12803,6228, 50742,50746,317, 50747,50748,1160, 50749,1548, 50743,50744,50745,50750,1358, + 50751,50753,7386, 317, 50755,6996, 317, 50756,501, 363, 50758,50759,371, 317, 380, 317, 317, 8178, 2110, 5120, 50760,317, 50762,50763,50764,317, 317, + 6937, 2845, 50765,357, 50767,50768,1481, 317, 433, 365, 332, 332, 317, 50766,317, 380, 7850, 50771,50776,50778,50780,50787,50790,50796,317, 5828, 317, + 317, 50772,404, 343, 316, 50773,50775,317, 362, 50774,317, 317, 317, 5793, 317, 5891, 343, 317, 18539,317, 317, 343, 50777,404, 317, 317, 381, 317, 427, 317, 50779,427, 5381, 317, 50781,7567, 4980, 317, 50782,50785,317, 50783,490, 50784,370, 317, 50786,317, 50788,2058, 50789,7523, 50791,50794, 317, 50792,1347, 50793,349, 50795,14709,50797,50800,2627, 50798,317, 50799,2073, 47332,36522,490, 50803,50807,50811,50814,50817,50818,5294, 50819,50821,50822, 50824,50825,50833,39071,50836,50838,50841,50842,490, 1266, 317, 317, 317, 50804,317, 1160, 2086, 317, 50805,50806,317, 6420, 2381, 317, 5891, 317, 50808, 351, 50809,50810,317, 2381, 50812,2108, 317, 343, 50813,4573, 6228, 317, 50815,50816,27787,317, 317, 5792, 370, 9357, 50820,343, 36617,1358, 9702, 16415, - 50823,590, 317, 43931,50826,50828,50829,317, 332, 1325, 50831,50832,317, 8362, 50827,8841, 5611, 317, 5492, 317, 9226, 6996, 637, 590, 19695,50830,6691, + 50823,590, 317, 43931,50826,50828,50829,317, 332, 1325, 50831,50832,317, 8362, 50827,8841, 5611, 317, 5492, 317, 9226, 6996, 637, 590, 19695,50830,6691, 18692,317, 1267, 1913, 365, 317, 1266, 317, 50834,10253,50835,317, 2715, 317, 7525, 317, 9303, 317, 50837,2381, 8333, 490, 5105, 7266, 317, 50839,50840, - 12869,490, 317, 1109, 536, 1100, 50843,50844,4984, 50846,50847,637, 42654,6996, 3815, 633, 673, 50849,50851,16951,50855,50857,590, 50859,362, 50861,317, + 12869,490, 317, 1109, 536, 1100, 50843,50844,4984, 50846,50847,637, 42654,6996, 3815, 633, 673, 50849,50851,16951,50855,50857,590, 50859,362, 50861,317, 5644, 50863,317, 50864,343, 50865,1160, 2163, 50850,5624, 365, 5324, 317, 550, 5105, 317, 8488, 317, 50852,8178, 8178, 317, 317, 6270, 10422,3999, 50853, - 317, 5793, 50854,427, 50856,13908,50858,26214,490, 1109, 50860,9170, 439, 396, 317, 317, 50862,47611,317, 5307, 3284, 10442,22716,363, 18840,317, 348, + 317, 5793, 50854,427, 50856,13908,50858,26214,490, 1109, 50860,9170, 439, 396, 317, 317, 50862,47611,317, 5307, 3284, 10442,22716,363, 18840,317, 348, 317, 8361, 50866,428, 10059,50868,50869,50873,50874,50876,9521, 3772, 317, 381, 50870,50871,50872,4984, 8529, 317, 10820,8346, 345, 50875,2067, 50878,50880, 50882,50883,50879,32010,6944, 317, 355, 50881,317, 50884,5223, 490, 539, 1347, 50885,317, 50887,1358, 50889,50890,345, 50891,50892,50893,343, 50895,50896, - 15842,5890, 317, 1345, 343, 6967, 2355, 50894,2110, 348, 317, 971, 50898,50899,50900,50903,356, 5917, 317, 490, 2627, 50901,5792, 317, 345, 50902,490, + 15842,5890, 317, 1345, 343, 6967, 2355, 50894,2110, 348, 317, 971, 50898,50899,50900,50903,356, 5917, 317, 490, 2627, 50901,5792, 317, 345, 50902,490, 50904,50905,50907,50911,50912,50919,317, 50920,50922,373, 50908,332, 50910,490, 7399, 50909,393, 3688, 317, 380, 2142, 317, 317, 332, 381, 50913,50916, - 50917,50918,36966,4980, 50914,50915,1160, 317, 317, 489, 363, 351, 2067, 2396, 1358, 2396, 574, 317, 50921,332, 350, 466, 343, 50924,13914,50926,501, - 50928,50933,50942,343, 4952, 50944,50946,50948,50949,7785, 6944, 317, 317, 50925,50927,428, 380, 343, 317, 6607, 50929,317, 50932,574, 50930,50931,8722, + 50917,50918,36966,4980, 50914,50915,1160, 317, 317, 489, 363, 351, 2067, 2396, 1358, 2396, 574, 317, 50921,332, 350, 466, 343, 50924,13914,50926,501, + 50928,50933,50942,343, 4952, 50944,50946,50948,50949,7785, 6944, 317, 317, 50925,50927,428, 380, 343, 317, 6607, 50929,317, 50932,574, 50930,50931,8722, 1347, 50934,50938,20641,9624, 31023,50939,317, 371, 317, 50935,317, 317, 371, 50936,28220,317, 50937,466, 317, 5840, 2718, 479, 50940,50941,317, 50943, 6607, 317, 365, 33040,50945,317, 2163, 371, 15221,50947,363, 2298, 345, 50951,50952,50956,50958,50984,6555, 50986,50989,5120, 50990,50991,317, 317, 17976, 363, 50953,50955,317, 43823,317, 50954,9265, 1347, 317, 317, 16090,5300, 50957,317, 2845, 317, 350, 2004, 50959,4925, 1100, 50961,363, 2142, 50963,50964, 50981,50982,345, 50960,1347, 9699, 50962,50965,637, 50973,1160, 317, 317, 50974,401, 50975,50977,6195, 332, 50978,4591, 50979,50980,1347, 317, 317, 50966, - 50967,50968,50969,50970,50971,50972,373, 50976,5943, 317, 17018,317, 19689,317, 1358, 317, 12943,965, 317, 317, 7911, 363, 5055, 5037, 50983,50985,466, - 1358, 50987,317, 396, 5836, 9214, 50988,7386, 7657, 5241, 317, 565, 1109, 50992,317, 426, 356, 10252,317, 50994,4437, 382, 2142, 44106,50995,50996,365, - 8926, 50997,50998,5241, 44137,490, 490, 5241, 1109, 317, 46420,51000,51003,1230, 51001,466, 51002,4591, 317, 351, 373, 1160, 317, 51005,384, 2063, 363, - 51007,501, 363, 5250, 6996, 633, 51009,51011,51013,8023, 51014,51015,51017,23949,2117, 3075, 5956, 51021,5037, 2541, 317, 51010,51012,7064, 373, 390, 6645, + 50967,50968,50969,50970,50971,50972,373, 50976,5943, 317, 17018,317, 19689,317, 1358, 317, 12943,965, 317, 317, 7911, 363, 5055, 5037, 50983,50985,466, + 1358, 50987,317, 396, 5836, 9214, 50988,7386, 7657, 5241, 317, 565, 1109, 50992,317, 426, 356, 10252,317, 50994,4437, 382, 2142, 44106,50995,50996,365, + 8926, 50997,50998,5241, 44137,490, 490, 5241, 1109, 317, 46420,51000,51003,1230, 51001,466, 51002,4591, 317, 351, 373, 1160, 317, 51005,384, 2063, 363, + 51007,501, 363, 5250, 6996, 633, 51009,51011,51013,8023, 51014,51015,51017,23949,2117, 3075, 5956, 51021,5037, 2541, 317, 51010,51012,7064, 373, 390, 6645, 489, 6318, 1345, 51016,11158,439, 51018,363, 317, 51019,5663, 51020,317, 490, 5037, 6920, 51023,51024,51026,5033, 317, 2381, 490, 10820,9163, 365, 51025, - 362, 11388,396, 2521, 51027,51036,51038,501, 51058,15495,51060,51068,24134,51071,51074,51077,51081,5838, 51086,51111,51141,51142,15551,2128, 3284, 5571, 490, + 362, 11388,396, 2521, 51027,51036,51038,501, 51058,15495,51060,51068,24134,51071,51074,51077,51081,5838, 51086,51111,51141,51142,15551,2128, 3284, 5571, 490, 51028,51029,15307,490, 51030,51031,317, 51033,2078, 51034,51035,2683, 44466,317, 51032,20423,317, 371, 317, 6851, 3284, 51037,51039,6993, 51043,51051,51055, 11702,51056,2211, 380, 51040,1347, 51041,7523, 317, 51042,1347, 317, 348, 7785, 51044,51045,343, 6596, 51046,317, 51047,317, 51048,51049,51050,51052,17462, 317, 2715, 51053,51054,5611, 867, 1347, 51057,9624, 317, 18125,6340, 51059,317, 51061,51062,10943,51065,355, 51066,490, 365, 51067,558, 6736, 51063,26912, - 373, 371, 317, 380, 51064,317, 651, 862, 390, 7594, 12547,343, 20441,35660,19639,51069,317, 8099, 51070,46112,2142, 317, 2705, 6195, 317, 317, 317, + 373, 371, 317, 380, 51064,317, 651, 862, 390, 7594, 12547,343, 20441,35660,19639,51069,317, 8099, 51070,46112,2142, 317, 2705, 6195, 317, 317, 317, 418, 51072,7871, 317, 317, 51073,317, 51075,9557, 363, 51076,363, 16910,1481, 1481, 3284, 1109, 45719,51078,317, 51080,356, 25899,2715, 356, 5406, 51079, 6228, 4965, 339, 370, 317, 51082,51083,51084,317, 51085,317, 1220, 51087,51099,51103,2571, 5662, 51110,42544,317, 51088,317, 51093,51094,51096,51097,51098, - 27218,490, 317, 51089,5717, 51090,51091,51092,8136, 466, 5241, 51095,317, 20331,317, 317, 317, 317, 317, 317, 51100,51101,9027, 317, 12854,23849,317, + 27218,490, 317, 51089,5717, 51090,51091,51092,8136, 466, 5241, 51095,317, 20331,317, 317, 317, 317, 317, 317, 51100,51101,9027, 317, 12854,23849,317, 317, 9444, 381, 51102,390, 48247,317, 1347, 51104,51105,51107,51109,51106,317, 8419, 332, 317, 51108,317, 317, 373, 351, 428, 5120, 356, 51112,51113, - 11089,51125,51126,51127,317, 51137,9069, 317, 51114,27209,51115,24024,24272,8258, 6996, 317, 1615, 2767, 1155, 1353, 317, 51116,51118,356, 10891,466, 2022, - 6994, 51121,396, 51123,51124,4980, 9864, 317, 317, 51117,12656,472, 10894,51119,51120,396, 395, 4984, 51122,7615, 362, 317, 1597, 363, 317, 396, 1358, - 5054, 356, 317, 2163, 24094,6486, 51128,51131,51129,51130,51132,51133,18511,12846,5241, 21090,11064,51135,51134,18978,51136,51138,51139,332, 51140,7386, 8597, + 11089,51125,51126,51127,317, 51137,9069, 317, 51114,27209,51115,24024,24272,8258, 6996, 317, 1615, 2767, 1155, 1353, 317, 51116,51118,356, 10891,466, 2022, + 6994, 51121,396, 51123,51124,4980, 9864, 317, 317, 51117,12656,472, 10894,51119,51120,396, 395, 4984, 51122,7615, 362, 317, 1597, 363, 317, 396, 1358, + 5054, 356, 317, 2163, 24094,6486, 51128,51131,51129,51130,51132,51133,18511,12846,5241, 21090,11064,51135,51134,18978,51136,51138,51139,332, 51140,7386, 8597, 2142, 9436, 1459, 45141,8926, 51143,51155,51161,51174,51191,51196,51198,362, 2022, 51200,51201,51220,51230,51254,51262,51264,51265,51144,51145,6195, 12958,51148, - 2177, 317, 51149,51150,51151,51152,23172,51153,317, 490, 490, 362, 39719,51146,51147,317, 2581, 49476,317, 490, 2272, 317, 27851,348, 51154,393, 5381, - 51156,7850, 51157,7405, 51159,466, 2571, 51160,11038,6736, 51158,371, 28779,317, 317, 317, 10820,317, 12696,9265, 51162,51163,51164,317, 1347, 51167,5746, - 24113,1347, 317, 371, 5611, 9768, 381, 3284, 51165,51166,317, 51168,51173,317, 51169,380, 51170,51171,370, 317, 51172,370, 5492, 1325, 317, 5746, 5418, - 397, 51175,51176,51186,2590, 343, 4980, 51189,8178, 345, 345, 2236, 51177,51182,51183,51184,1347, 51185,317, 51178,51179,51180,51181,317, 370, 490, 317, - 370, 1358, 4980, 317, 317, 345, 4980, 29423,51187,51188,5300, 5300, 317, 317, 51190,317, 1347, 6798, 351, 10699,490, 51192,51193,51194,42695,1347, 317, + 2177, 317, 51149,51150,51151,51152,23172,51153,317, 490, 490, 362, 39719,51146,51147,317, 2581, 49476,317, 490, 2272, 317, 27851,348, 51154,393, 5381, + 51156,7850, 51157,7405, 51159,466, 2571, 51160,11038,6736, 51158,371, 28779,317, 317, 317, 10820,317, 12696,9265, 51162,51163,51164,317, 1347, 51167,5746, + 24113,1347, 317, 371, 5611, 9768, 381, 3284, 51165,51166,317, 51168,51173,317, 51169,380, 51170,51171,370, 317, 51172,370, 5492, 1325, 317, 5746, 5418, + 397, 51175,51176,51186,2590, 343, 4980, 51189,8178, 345, 345, 2236, 51177,51182,51183,51184,1347, 51185,317, 51178,51179,51180,51181,317, 370, 490, 317, + 370, 1358, 4980, 317, 317, 345, 4980, 29423,51187,51188,5300, 5300, 317, 317, 51190,317, 1347, 6798, 351, 10699,490, 51192,51193,51194,42695,1347, 317, 317, 363, 343, 51195,10471,5055, 51197,401, 16589,51199,370, 15738,23306,11148,362, 317, 5223, 42843,51202,51203,51204,51219,390, 971, 317, 317, 51205, - 51209,51210,51213,51216,51217,51206,51207,51208,345, 10174,51211,51212,51214,51215,637, 51218,317, 317, 633, 317, 633, 1548, 6355, 6578, 317, 363, 9483, + 51209,51210,51213,51216,51217,51206,51207,51208,345, 10174,51211,51212,51214,51215,637, 51218,317, 317, 633, 317, 633, 1548, 6355, 6578, 317, 363, 9483, 51221,51222,490, 317, 7312, 6834, 51223,317, 6834, 317, 365, 44428,51225,9174, 365, 51226,2110, 8926, 51229,51224,51227,51228,637, 22090,51231,51232,51233, - 51235,51242,343, 33846,362, 51248,30793,51249,51250,51251,3901, 317, 317, 317, 1347, 317, 317, 317, 317, 51234,4980, 7385, 345, 317, 317, 356, 8948, + 51235,51242,343, 33846,362, 51248,30793,51249,51250,51251,3901, 317, 317, 317, 1347, 317, 317, 317, 317, 51234,4980, 7385, 345, 317, 317, 356, 8948, 317, 4980, 51236,51237,51239,345, 317, 345, 345, 317, 51238,317, 317, 1018, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 4980, 345, 51240, - 345, 317, 51241,317, 51243,13011,51244,490, 9779, 51245,51247,4980, 317, 317, 51246,404, 5962, 317, 363, 317, 317, 9557, 363, 404, 317, 51252,317, - 51253,371, 5793, 51255,51256,51258,343, 317, 8274, 5570, 10114,5447, 51257,51259,27326,12071,490, 51260,371, 51261,51263,7116, 317, 317, 1347, 317, 317, - 8828, 4925, 19324,4738, 343, 390, 51267,51269,51271,351, 51273,51274,317, 317, 51276,558, 51280,51281,51283,51297,51301,343, 51302,51268,370, 51270,317, + 345, 317, 51241,317, 51243,13011,51244,490, 9779, 51245,51247,4980, 317, 317, 51246,404, 5962, 317, 363, 317, 317, 9557, 363, 404, 317, 51252,317, + 51253,371, 5793, 51255,51256,51258,343, 317, 8274, 5570, 10114,5447, 51257,51259,27326,12071,490, 51260,371, 51261,51263,7116, 317, 317, 1347, 317, 317, + 8828, 4925, 19324,4738, 343, 390, 51267,51269,51271,351, 51273,51274,317, 317, 51276,558, 51280,51281,51283,51297,51301,343, 51302,51268,370, 51270,317, 317, 317, 33398,1020, 51272,3688, 6334, 51275,2035, 51277,51278,363, 2222, 16278,51279,365, 10276,11147,16278,317, 23995,1345, 317, 3987, 51282,5055, 19453, - 51284,51285,51286,51290,348, 345, 10046,419, 345, 317, 5684, 348, 317, 3726, 5430, 317, 51287,15148,1358, 51288,2537, 1160, 21067,51289,10633,317, 317, + 51284,51285,51286,51290,348, 345, 10046,419, 345, 317, 5684, 348, 317, 3726, 5430, 317, 51287,15148,1358, 51288,2537, 1160, 21067,51289,10633,317, 317, 51291,51292,51293,51294,51295,51296,5626, 51298,14708,317, 51299,2222, 317, 51300,317, 4965, 12524,5570, 350, 2272, 343, 317, 51303,370, 317, 51304,51305, - 51306,51307,51308,365, 51310,51314,343, 351, 51315,317, 317, 51311,317, 51312,51313,317, 51316,51318,51319,51317,51320,7185, 51322,317, 317, 404, 350, + 51306,51307,51308,365, 51310,51314,343, 351, 51315,317, 317, 51311,317, 51312,51313,317, 51316,51318,51319,51317,51320,7185, 51322,317, 317, 404, 350, 43013,10761,2815, 51324,9801, 51327,2962, 1087, 672, 427, 10641,34392,2077, 51329,51330,554, 51331,51341,363, 51344,51345,51346,51347,51350,14772,51325,51326, 51328,317, 2770, 4980, 380, 46880,317, 6598, 365, 1160, 51332,51334,19665,317, 51333,568, 22736,51335,31917,317, 51336,490, 317, 317, 51340,363, 51337, 16218,472, 18588,51338,6854, 51339,363, 51342,51343,11786,8047, 427, 427, 363, 5608, 12696,51348,51349,427, 343, 427, 1548, 434, 51352,51353,51354,51357, - 51358,51359,51363,51366,51370,51376,51377,51378,51381,51386,51388,51389,51390,51393,5037, 51397,2156, 12994,44910,26830,1347, 356, 51355,51356,363, 10011,2236, - 448, 317, 11533,317, 448, 317, 384, 8647, 370, 22370,7990, 490, 51360,9592, 51362,574, 316, 343, 51361,22223,365, 5022, 6598, 51364,596, 51365,317, + 51358,51359,51363,51366,51370,51376,51377,51378,51381,51386,51388,51389,51390,51393,5037, 51397,2156, 12994,44910,26830,1347, 356, 51355,51356,363, 10011,2236, + 448, 317, 11533,317, 448, 317, 384, 8647, 370, 22370,7990, 490, 51360,9592, 51362,574, 316, 343, 51361,22223,365, 5022, 6598, 51364,596, 51365,317, 8035, 51367,51368,51369,51371,51372,51373,51374,51375,439, 317, 2272, 7694, 51379,2381, 51380,7114, 317, 317, 490, 1109, 51382,51384,574, 317, 317, 51383, - 51385,490, 490, 7821, 51387,15118,393, 1011, 317, 1194, 11135,5037, 382, 51391,51392,365, 51394,51395,317, 51396,3505, 5558, 2063, 51399,51403,51409,565, - 51410,51413,51419,51421,16865,51424,44271,44271,51400,51401,7622, 28454,339, 51402,9375, 317, 51404,6228, 6228, 29130,51405,51407,51406,51408,18232,13770,317, + 51385,490, 490, 7821, 51387,15118,393, 1011, 317, 1194, 11135,5037, 382, 51391,51392,365, 51394,51395,317, 51396,3505, 5558, 2063, 51399,51403,51409,565, + 51410,51413,51419,51421,16865,51424,44271,44271,51400,51401,7622, 28454,339, 51402,9375, 317, 51404,6228, 6228, 29130,51405,51407,51406,51408,18232,13770,317, 317, 317, 7285, 51411,13638,51412,363, 965, 317, 317, 5241, 51414,51415,51416,51417,3284, 51418,51420,3611, 390, 317, 2110, 1460, 317, 51422,371, 51423, - 8296, 51425,51429,51430,51431,51432,7657, 51426,2715, 51427,365, 317, 5687, 51428,317, 2381, 317, 490, 2715, 317, 2142, 365, 5428, 490, 7672, 489, 7488, + 8296, 51425,51429,51430,51431,51432,7657, 51426,2715, 51427,365, 317, 5687, 51428,317, 2381, 317, 490, 2715, 317, 2142, 365, 5428, 490, 7672, 489, 7488, 5428, 345, 51434,345, 490, 51436,51437,51438,490, 15876,490, 2003, 5205, 44601,51435,317, 363, 490, 34218,51439,1820, 51440,51466,174, 51620,51646,51679, 51691,51773,51782,51797,51800,51841,51870,51900,51919,51920,51932,51944,51953,51964,8647, 51974,51978,51212,51441,51442,51444,51446,2163, 51452,51458,51461,51462, 51463,51465,343, 350, 370, 5742, 51443,51445,558, 51447,51448,51449,9609, 51450,662, 404, 51451,5653, 23849,349, 370, 7192, 363, 9609, 51453,51455,51457, - 10189,25909,35409,51454,370, 317, 51456,33170,343, 4982, 51459,51460,351, 51464,6563, 370, 370, 7010, 317, 2037, 370, 51467,51468,51470,51476,363, 343, - 390, 317, 51469,317, 390, 51471,51472,51473,51474,51475,370, 2037, 350, 19187,363, 36769,363, 51477,51478,51479,14174,343, 51480,51481,51518,51519,350, + 10189,25909,35409,51454,370, 317, 51456,33170,343, 4982, 51459,51460,351, 51464,6563, 370, 370, 7010, 317, 2037, 370, 51467,51468,51470,51476,363, 343, + 390, 317, 51469,317, 390, 51471,51472,51473,51474,51475,370, 2037, 350, 19187,363, 36769,363, 51477,51478,51479,14174,343, 51480,51481,51518,51519,350, 51525,51557,51589,51602,317, 343, 51482,51483,51486,51487,51488,51489,51496,51499,51504,51511,51513,51515,9425, 317, 2997, 6046, 317, 51484,51485,397, 12454, - 317, 3023, 343, 51490,51491,9609, 51492,51494,1060, 51495,1020, 317, 9557, 51493,28253,5332, 317, 317, 363, 349, 363, 2369, 2369, 20535,11442,16775,389, - 51497,51498,317, 343, 51500,317, 2571, 51503,343, 1347, 51501,2328, 12060,51502,51505,370, 8298, 8392, 34944,51506,404, 51508,51510,317, 51507,17400,384, + 317, 3023, 343, 51490,51491,9609, 51492,51494,1060, 51495,1020, 317, 9557, 51493,28253,5332, 317, 317, 363, 349, 363, 2369, 2369, 20535,11442,16775,389, + 51497,51498,317, 343, 51500,317, 2571, 51503,343, 1347, 51501,2328, 12060,51502,51505,370, 8298, 8392, 34944,51506,404, 51508,51510,317, 51507,17400,384, 17400,317, 363, 4965, 51509,363, 2022, 317, 317, 317, 6036, 5342, 351, 30811,317, 317, 51512,39357,32289,15734,8035, 51514,370, 479, 362, 51516,51517, - 6563, 1020, 51520,551, 51521,51522,51523,51524,51526,51537,51546,51550,51553,51556,51527,51528,6645, 51529,51530,51531,2242, 51532,51534,343, 317, 20552,1020, - 5163, 45213,317, 16069,1345, 363, 317, 363, 363, 404, 370, 317, 51533,51535,51536,19187,370, 51538,51539,51540,3854, 51542,356, 2419, 51545,51147,317, - 317, 12331,343, 1345, 1358, 51541,7389, 363, 51543,404, 339, 51544,363, 18661,5561, 362, 363, 13177,363, 317, 51547,51548,390, 3079, 3079, 363, 317, + 6563, 1020, 51520,551, 51521,51522,51523,51524,51526,51537,51546,51550,51553,51556,51527,51528,6645, 51529,51530,51531,2242, 51532,51534,343, 317, 20552,1020, + 5163, 45213,317, 16069,1345, 363, 317, 363, 363, 404, 370, 317, 51533,51535,51536,19187,370, 51538,51539,51540,3854, 51542,356, 2419, 51545,51147,317, + 317, 12331,343, 1345, 1358, 51541,7389, 363, 51543,404, 339, 51544,363, 18661,5561, 362, 363, 13177,363, 317, 51547,51548,390, 3079, 3079, 363, 317, 2022, 51549,14289,15738,51551,317, 370, 23304,51552,317, 13269,5561, 317, 348, 351, 51554,51555,23304,317, 317, 35144,51558,542, 51559,51560,51564,51566, - 51576,17973,51578,51583,349, 51584,51587,51588,9592, 317, 362, 51561,317, 1020, 427, 51562,47672,51563,427, 8569, 51565,16503,5054, 2022, 51567,2558, 5428, + 51576,17973,51578,51583,349, 51584,51587,51588,9592, 317, 362, 51561,317, 1020, 427, 51562,47672,51563,427, 8569, 51565,16503,5054, 2022, 51567,2558, 5428, 2022, 51570,2593, 5037, 2355, 50709,2355, 51568,51569,51571,51575,5428, 317, 51572,51573,51574,370, 1230, 317, 370, 317, 51577,317, 317, 370, 2551, 51579, - 51580,1194, 51582,317, 2022, 317, 428, 12334,343, 384, 51581,317, 15745,2275, 51585,317, 51586,363, 363, 363, 317, 51590,51594,51597,51599,51601,2127, + 51580,1194, 51582,317, 2022, 317, 428, 12334,343, 384, 51581,317, 15745,2275, 51585,317, 51586,363, 363, 363, 317, 51590,51594,51597,51599,51601,2127, 367, 51591,370, 317, 51593,501, 30926,370, 343, 12331,317, 317, 51592,51595,2058, 51596,530, 2571, 5149, 370, 471, 51598,2058, 362, 343, 5661, 51600, - 317, 5661, 19617,3243, 2044, 51603,51604,4984, 51605,51607,51612,10476,51615,1453, 51617,12598,2022, 363, 317, 51606,51608,6674, 51609,51610,15738,51611,427, - 317, 390, 317, 317, 1347, 10592,390, 317, 317, 317, 345, 4943, 51613,51585,51614,370, 317, 2272, 2022, 12331,51616,1020, 345, 317, 51618,51619,363, + 317, 5661, 19617,3243, 2044, 51603,51604,4984, 51605,51607,51612,10476,51615,1453, 51617,12598,2022, 363, 317, 51606,51608,6674, 51609,51610,15738,51611,427, + 317, 390, 317, 317, 1347, 10592,390, 317, 317, 317, 345, 4943, 51613,51585,51614,370, 317, 2272, 2022, 12331,51616,1020, 345, 317, 51618,51619,363, 40212,51621,51628,51634,51635,51641,343, 356, 343, 51622,51625,51626,317, 9357, 51623,51624,578, 428, 578, 390, 29424,51627,51629,51631,12719,12719,51630, 12719,51632,2117, 20496,51633,49759,43523,12719,317, 343, 51636,450, 51638,51640,49762,9878, 2134, 51637,6674, 428, 9878, 51639,2116, 49765,343, 371, 51642, 373, 51644,51643,51645,51647,51652,51653,51673,5627, 501, 51678,35144,51648,51650,51651,51649,479, 363, 11236,51654,51656,51657,51663,51665,51666,51667,51670, - 51672,2081, 7590, 51655,3529, 51658,51660,51661,2272, 51659,3967, 370, 404, 317, 51662,51664,7590, 2134, 10429,51668,51669,370, 51671,501, 317, 6318, 370, + 51672,2081, 7590, 51655,3529, 51658,51660,51661,2272, 51659,3967, 370, 404, 317, 51662,51664,7590, 2134, 10429,51668,51669,370, 51671,501, 317, 6318, 370, 19390,343, 2272, 44520,51674,51675,448, 2163, 9779, 51676,51677,1588, 1588, 2510, 370, 51680,51686,6598, 370, 51690,51681,4564, 4984, 51682,51685,380, 19617, 363, 501, 51683,501, 51684,363, 3999, 363, 23232,317, 9914, 14832,51687,51688,11442,5661, 2188, 51689,363, 363, 363, 363, 51692,51709,51714,51719,51732, - 51744,51750,51760,51771,51693,51696,51698,51699,51700,32867,51704,51707,317, 51694,51695,4984, 51697,370, 397, 51701,6563, 6675, 317, 51702,428, 51703,317, + 51744,51750,51760,51771,51693,51696,51698,51699,51700,32867,51704,51707,317, 51694,51695,4984, 51697,370, 397, 51701,6563, 6675, 317, 51702,428, 51703,317, 51705,2022, 51706,51708,384, 51710,51711,558, 51712,51713,362, 2355, 370, 370, 362, 2022, 350, 990, 4943, 51715,51716,51717,8392, 317, 317, 51718,51720, 51722,51727,12744,51730,51721,2022, 2037, 10641,51723,404, 51726,363, 51724,51725,317, 7737, 448, 1230, 51728,2022, 51729,370, 12060,32897,51731,2022, 51733, 605, 51736,51738,51743,2366, 343, 8807, 51734,24457,51735,363, 2087, 49843,317, 51737,51739,404, 363, 1358, 370, 349, 51741,363, 51740,1020, 404, 51742, - 25952,7237, 19617,370, 396, 362, 51745,51746,51748,10430,51749,478, 51588,542, 51747,3987, 51751,51754,3529, 51757,51759,6021, 396, 6780, 51752,51753,390, + 25952,7237, 19617,370, 396, 362, 51745,51746,51748,10430,51749,478, 51588,542, 51747,3987, 51751,51754,3529, 51757,51759,6021, 396, 6780, 51752,51753,390, 317, 317, 5561, 317, 317, 351, 317, 51755,51756,41998,2022, 317, 19187,362, 343, 370, 51758,350, 317, 396, 2419, 317, 51761,1020, 51763,51767,51770, 350, 51762,6021, 10476,362, 51764,51766,476, 51765,370, 542, 51768,51769,343, 317, 317, 317, 437, 51772,51774,51778,51780,51781,51775,51776,8392, 51777, 2295, 317, 28369,370, 965, 51779,317, 396, 51783,51789,2296, 49818,2110, 12199,51796,51784,22671,51785,39818,51786,51787,545, 370, 19390,5158, 19390,51788, 2546, 9779, 51790,51791,8301, 51792,6195, 345, 16503,343, 1588, 389, 5108, 51793,51795,51794,51798,51799,51801,51804,51821,51836,51837,51838,1230, 51839,51802, 362, 20578,343, 6675, 8231, 51803,44730,317, 373, 404, 51805,49825,51807,51808,51810,2058, 51813,51817,51818,2551, 5561, 51820,437, 317, 7028, 23232,51806, - 362, 362, 317, 362, 317, 22459,350, 5561, 12349,51809,51811,2148, 51812,12696,12696,6736, 1060, 370, 10476,317, 51814,5017, 2022, 51816,2391, 2058, 5149, + 362, 362, 317, 362, 317, 22459,350, 5561, 12349,51809,51811,2148, 51812,12696,12696,6736, 1060, 370, 10476,317, 51814,5017, 2022, 51816,2391, 2058, 5149, 5149, 428, 51815,343, 384, 317, 4984, 370, 343, 363, 317, 2058, 35986,6675, 51819,2402, 51822,2074, 51824,51825,51827,51828,51831,51833,51835,350, 51823, - 5055, 363, 363, 51826,2022, 370, 404, 2110, 6859, 16838,51829,51830,47970,317, 15734,43090,5055, 317, 370, 448, 362, 51832,51834,384, 14289,363, 2391, + 5055, 363, 363, 51826,2022, 370, 404, 2110, 6859, 16838,51829,51830,47970,317, 15734,43090,5055, 317, 370, 448, 362, 51832,51834,384, 14289,363, 2391, 2390, 17745,530, 363, 343, 363, 2317, 501, 13137,317, 343, 51840,384, 350, 51842,51859,51865,51866,51868,450, 51843,363, 51845,362, 51846,51847,51848, 51849,9350, 51852,17410,51858,317, 51844,5561, 1345, 51850,2022, 370, 51851,51853,51855,51857,51854,51856,1020, 363, 22466,51860,31150,389, 51861,2171, 51862, 51863,51864,51545,317, 317, 44555,439, 20638,404, 11236,404, 370, 362, 2272, 51867,317, 317, 49843,390, 51869,363, 362, 343, 345, 2058, 51871,51878, - 51882,51890,51894,2419, 51872,5055, 19617,51873,51877,5450, 390, 363, 363, 428, 363, 51874,2593, 51876,6387, 25434,51875,1230, 1020, 1020, 3079, 51879,6645, - 51880,51881,21037,2593, 51883,373, 51885,51889,51884,33170,2134, 433, 51886,363, 51887,51888,363, 5332, 317, 363, 317, 596, 7941, 51891,51892,542, 542, - 51893,363, 29424,605, 51895,363, 51897,448, 363, 51896,363, 363, 5055, 44678,2355, 51898,51899,370, 370, 363, 317, 51901,51903,51911,51916,51917,2044, - 32240,418, 51902,5661, 370, 381, 21767,4965, 6547, 11404,51904,51905,396, 51906,51907,25091,51909,51910,381, 1020, 317, 21074,1345, 343, 343, 21074,317, - 1358, 31158,390, 345, 51908,370, 8506, 317, 51912,9878, 396, 471, 2108, 390, 381, 51913,373, 9878, 51914,51915,397, 2067, 51918,317, 397, 6645, 7585, + 51882,51890,51894,2419, 51872,5055, 19617,51873,51877,5450, 390, 363, 363, 428, 363, 51874,2593, 51876,6387, 25434,51875,1230, 1020, 1020, 3079, 51879,6645, + 51880,51881,21037,2593, 51883,373, 51885,51889,51884,33170,2134, 433, 51886,363, 51887,51888,363, 5332, 317, 363, 317, 596, 7941, 51891,51892,542, 542, + 51893,363, 29424,605, 51895,363, 51897,448, 363, 51896,363, 363, 5055, 44678,2355, 51898,51899,370, 370, 363, 317, 51901,51903,51911,51916,51917,2044, + 32240,418, 51902,5661, 370, 381, 21767,4965, 6547, 11404,51904,51905,396, 51906,51907,25091,51909,51910,381, 1020, 317, 21074,1345, 343, 343, 21074,317, + 1358, 31158,390, 345, 51908,370, 8506, 317, 51912,9878, 396, 471, 2108, 390, 381, 51913,373, 9878, 51914,51915,397, 2067, 51918,317, 397, 6645, 7585, 2334, 23345,501, 317, 51921,51924,51925,553, 3243, 51922,4952, 51923,21123,371, 371, 2188, 51926,51928,51931,380, 317, 51927,349, 380, 5993, 51929,51930, - 11442,363, 501, 404, 317, 9005, 51933,51934,51937,51939,5841, 343, 343, 51935,51936,317, 448, 51938,448, 6340, 2074, 51940,51941,363, 51943,51606,397, - 1020, 51942,363, 12696,26385,51945,51946,51949,51951,317, 2022, 370, 381, 19617,317, 7784, 51947,317, 36322,51948,471, 380, 51950,51952,2058, 9549, 2058, - 14689,51954,51957,51958,1230, 51961,51955,51956,1358, 448, 317, 51959,2070, 15637,3243, 51960,1020, 51962,51963,51965,51969,51970,51971,389, 51966,51967,388, + 11442,363, 501, 404, 317, 9005, 51933,51934,51937,51939,5841, 343, 343, 51935,51936,317, 448, 51938,448, 6340, 2074, 51940,51941,363, 51943,51606,397, + 1020, 51942,363, 12696,26385,51945,51946,51949,51951,317, 2022, 370, 381, 19617,317, 7784, 51947,317, 36322,51948,471, 380, 51950,51952,2058, 9549, 2058, + 14689,51954,51957,51958,1230, 51961,51955,51956,1358, 448, 317, 51959,2070, 15637,3243, 51960,1020, 51962,51963,51965,51969,51970,51971,389, 51966,51967,388, 51968,370, 990, 2272, 51972,51973,32912,51975,51976,370, 4984, 4943, 596, 317, 51977,317, 2037, 51979,51981,51982,51985,2301, 343, 363, 4576, 356, 51980, 2272, 1033, 2188, 2037, 2033, 2355, 10761,51983,10761,51984,9274, 343, 51986,51987,404, 3150, 345, 2035, 51989,490, 52001,52002,51990,51992,51995,525, 51999, - 51991,51993,51994,51996,51998,51997,52000,363, 3182, 39819,52003,52032,52033,52061,52115,52129,52131,52168,52182,52207,52209,176, 52290,52312,52382,52385,177, + 51991,51993,51994,51996,51998,51997,52000,363, 3182, 39819,52003,52032,52033,52061,52115,52129,52131,52168,52182,52207,52209,176, 52290,52312,52382,52385,177, 52481,52552,52676,52681,52688,52691,52696,52706,404, 52004,52006,52012,380, 33846,52013,52014,52022,52024,52028,316, 3987, 52005,427, 5332, 427, 12461,52007, 317, 5037, 1347, 52008,52009,20920,52010,317, 2193, 9695, 52011,15616,351, 16825,343, 6036, 466, 351, 317, 317, 52015,52016,52017,2571, 24893,317, 52021, - 10517,317, 6013, 589, 317, 52018,52019,10891,52020,317, 2060, 2272, 317, 404, 345, 466, 345, 52023,16865,52025,11897,5332, 52026,52027,410, 5675, 466, + 10517,317, 6013, 589, 317, 52018,52019,10891,52020,317, 2060, 2272, 317, 404, 345, 466, 345, 52023,16865,52025,11897,5332, 52026,52027,410, 5675, 466, 4562, 15124,52029,362, 52030,317, 355, 317, 52031,2272, 343, 345, 52034,52036,52037,348, 52046,2211, 427, 52054,52059,52035,5238, 9226, 401, 317, 18454, 490, 3773, 52038,52045,317, 11249,317, 490, 317, 52039,52043,52040,52041,52042,7888, 5476, 47501,5225, 356, 1347, 401, 52044,48787,317, 12966,3529, 52047, 52048,52049,317, 317, 52050,52051,52052,52053,52055,52056,52057,52058,52060,52062,8807, 2205, 52068,52071,12556,4591, 52077,52107,362, 52109,52110,7657, 49576, 4873, 52111,52113,1230, 5038, 317, 52063,7114, 52067,317, 565, 52064,52065,317, 52066,5055, 4268, 6674, 1033, 52069,384, 52070,466, 317, 13631,7825, 52072, 52074,52075,490, 52076,317, 338, 317, 52073,2086, 1347, 52078,16277,52086,52090,380, 52092,52094,52095,52097,52105,338, 317, 2406, 52079,9392, 5324, 52081, - 9657, 22122,52085,52080,52082,317, 317, 52083,52084,3284, 15961,317, 52087,317, 52088,317, 317, 317, 345, 356, 7810, 343, 7765, 52089,317, 5418, 1347, - 2086, 52091,52093,317, 317, 350, 11408,317, 40956,52096,317, 345, 52098,52100,317, 52099,52101,52102,52103,52104,52106,7821, 10519,10035,52108,28276,384, + 9657, 22122,52085,52080,52082,317, 317, 52083,52084,3284, 15961,317, 52087,317, 52088,317, 317, 317, 345, 356, 7810, 343, 7765, 52089,317, 5418, 1347, + 2086, 52091,52093,317, 317, 350, 11408,317, 40956,52096,317, 345, 52098,52100,317, 52099,52101,52102,52103,52104,52106,7821, 10519,10035,52108,28276,384, 317, 396, 490, 2108, 8178, 345, 490, 52112,490, 343, 8278, 490, 52114,317, 45892,42775,52116,2572, 31745,39398,52117,52119,350, 52120,52121,52123,52124, - 52125,52128,317, 9876, 32606,363, 52118,351, 3079, 317, 317, 52122,317, 390, 6851, 317, 317, 4960, 2631, 3529, 317, 381, 317, 490, 343, 350, 351, + 52125,52128,317, 9876, 32606,363, 52118,351, 3079, 317, 317, 52122,317, 390, 6851, 317, 317, 4960, 2631, 3529, 317, 381, 317, 490, 343, 350, 351, 52126,343, 332, 317, 343, 52127,52130,12487,551, 52132,52157,52158,52161,52163,2537, 490, 52164,52165,404, 52167,52133,52134,14263,52138,52140,52142,52148, - 52150,52151,490, 28337,52153,52154,476, 345, 5689, 43907,52135,52136,13300,52137,10836,52139,3469, 514, 363, 52141,52143,52145,52144,404, 52146,32397,8944, - 52147,52149,1548, 363, 6228, 317, 317, 317, 317, 401, 476, 7035, 52152,8304, 5055, 404, 52155,52156,545, 317, 317, 363, 52159,52160,317, 38461,381, + 52150,52151,490, 28337,52153,52154,476, 345, 5689, 43907,52135,52136,13300,52137,10836,52139,3469, 514, 363, 52141,52143,52145,52144,404, 52146,32397,8944, + 52147,52149,1548, 363, 6228, 317, 317, 317, 317, 401, 476, 7035, 52152,8304, 5055, 404, 52155,52156,545, 317, 317, 363, 52159,52160,317, 38461,381, 317, 2551, 404, 381, 52162,490, 6964, 4984, 317, 5238, 380, 44197,478, 52166,362, 6138, 365, 317, 52169,48879,52171,52173,345, 52174,52175,52176,52177, - 52178,52180,52181,50093,52170,317, 32951,339, 332, 317, 52172,354, 12693,10471,4965, 13611,35634,362, 5255, 2063, 52179,22665,16187,12704,15772,3648, 6988, - 356, 317, 52183,52184,52186,14223,52187,17350,52188,52189,9031, 52193,52194,52204,52205,4738, 27584,52185,14223,7777, 317, 380, 345, 10149,317, 4965, 466, - 12785,5896, 2188, 52190,52192,30089,343, 501, 345, 350, 553, 343, 317, 317, 52191,511, 11938,317, 28207,396, 317, 6394, 384, 390, 52195,4738, 350, - 350, 52197,52198,1347, 52196,317, 7911, 50574,52199,52201,52200,317, 7428, 52202,52203,11485,350, 14905,52206,350, 317, 6409, 52208,24119,596, 52210,345, - 52211,949, 52212,52232,52233,52240,52241,52244,52245,8948, 52248,52256,52258,2052, 52265,52267,6601, 52281,52283,52284,52285,52287,2003, 350, 370, 363, 2272, + 52178,52180,52181,50093,52170,317, 32951,339, 332, 317, 52172,354, 12693,10471,4965, 13611,35634,362, 5255, 2063, 52179,22665,16187,12704,15772,3648, 6988, + 356, 317, 52183,52184,52186,14223,52187,17350,52188,52189,9031, 52193,52194,52204,52205,4738, 27584,52185,14223,7777, 317, 380, 345, 10149,317, 4965, 466, + 12785,5896, 2188, 52190,52192,30089,343, 501, 345, 350, 553, 343, 317, 317, 52191,511, 11938,317, 28207,396, 317, 6394, 384, 390, 52195,4738, 350, + 350, 52197,52198,1347, 52196,317, 7911, 50574,52199,52201,52200,317, 7428, 52202,52203,11485,350, 14905,52206,350, 317, 6409, 52208,24119,596, 52210,345, + 52211,949, 52212,52232,52233,52240,52241,52244,52245,8948, 52248,52256,52258,2052, 52265,52267,6601, 52281,52283,52284,52285,52287,2003, 350, 370, 363, 2272, 52213,52215,52216,52217,5611, 52225,52230,363, 590, 52214,52218,52222,10648,343, 52223,52224,404, 317, 52219,363, 52220,10480,52221,8311, 317, 10255,19922, - 490, 52226,52227,52228,52229,52231,317, 48354,19139,1358, 351, 52234,21274,52235,351, 1992, 52236,52238,52237,52239,15986,5991, 466, 741, 317, 351, 2537, - 4984, 317, 52242,317, 357, 11831,317, 317, 11709,52243,5392, 12920,317, 52246,748, 551, 52247,52249,52250,490, 345, 52251,6937, 52252,52253,5611, 345, + 490, 52226,52227,52228,52229,52231,317, 48354,19139,1358, 351, 52234,21274,52235,351, 1992, 52236,52238,52237,52239,15986,5991, 466, 741, 317, 351, 2537, + 4984, 317, 52242,317, 357, 11831,317, 317, 11709,52243,5392, 12920,317, 52246,748, 551, 52247,52249,52250,490, 345, 52251,6937, 52252,52253,5611, 345, 317, 15090,317, 317, 317, 47325,11124,317, 52254,52255,490, 317, 317, 317, 317, 317, 2261, 317, 574, 52257,7678, 52259,5896, 52260,3023, 52262,52263, - 317, 317, 6994, 343, 356, 356, 317, 1453, 348, 490, 52261,7214, 381, 317, 11709,7618, 2148, 371, 12943,7514, 11678,47261,4591, 317, 317, 1347, 1347, + 317, 317, 6994, 343, 356, 356, 317, 1453, 348, 490, 52261,7214, 381, 317, 11709,7618, 2148, 371, 12943,7514, 11678,47261,4591, 317, 317, 1347, 1347, 317, 52264,5363, 317, 52266,371, 371, 34510,363, 52268,52270,362, 52280,317, 5223, 317, 52269,343, 52271,52278,317, 317, 9856, 1347, 52272,4591, 52273, - 52274,52275,52276,52277,52279,317, 317, 1358, 4980, 317, 52282,351, 7734, 4984, 18840,5840, 5991, 3999, 363, 317, 7688, 14475,317, 1020, 317, 52286,317, - 317, 52288,363, 373, 52289,52291,52297,511, 52298,52299,52300,52310,317, 52311,52292,52294,52293,317, 356, 9139, 52295,5570, 52296,317, 317, 25055,317, - 317, 351, 13387,3111, 52301,332, 1347, 52303,317, 52302,1347, 412, 317, 52304,316, 52307,317, 52305,52306,6607, 6021, 52308,345, 10674,52309,317, 428, - 52313,52318,52321,52332,52337,52342,52345,52350,52351,52352,52353,52357,52364,52372,52377,5241, 52378,52314,52315,5126, 317, 7490, 566, 516, 6355, 52317,5447, - 5126, 466, 52316,351, 52319,5412, 39082,317, 317, 52320,6002, 317, 52322,554, 52325,350, 52328,52330,317, 7785, 317, 52323,34127,1078, 1109, 317, 1881, + 52274,52275,52276,52277,52279,317, 317, 1358, 4980, 317, 52282,351, 7734, 4984, 18840,5840, 5991, 3999, 363, 317, 7688, 14475,317, 1020, 317, 52286,317, + 317, 52288,363, 373, 52289,52291,52297,511, 52298,52299,52300,52310,317, 52311,52292,52294,52293,317, 356, 9139, 52295,5570, 52296,317, 317, 25055,317, + 317, 351, 13387,3111, 52301,332, 1347, 52303,317, 52302,1347, 412, 317, 52304,316, 52307,317, 52305,52306,6607, 6021, 52308,345, 10674,52309,317, 428, + 52313,52318,52321,52332,52337,52342,52345,52350,52351,52352,52353,52357,52364,52372,52377,5241, 52378,52314,52315,5126, 317, 7490, 566, 516, 6355, 52317,5447, + 5126, 466, 52316,351, 52319,5412, 39082,317, 317, 52320,6002, 317, 52322,554, 52325,350, 52328,52330,317, 7785, 317, 52323,34127,1078, 1109, 317, 1881, 362, 317, 10625,52324,42698,29108,8243, 6394, 52326,489, 2142, 382, 2381, 317, 317, 52327,9530, 2369, 5570, 7530, 20219,52329,490, 490, 1109, 2381, 52331, 12731,6555, 52333,52334,52335,317, 52336,49994,574, 345, 1078, 343, 6598, 4591, 370, 371, 6555, 2533, 8765, 52338,2210, 52339,343, 52340,48840,52341,52343, 351, 52344,380, 52346,558, 317, 52347,52349,1108, 52348,317, 9623, 345, 7498, 317, 52354,52355,52356,553, 2381, 7565, 317, 317, 317, 362, 10561,52358, 52359,5120, 52360,52363,2715, 42843,52361,52362,52365,21245,7866, 52366,52368,9521, 52369,384, 12429,52367,12088,52370,52371,16500,52373,501, 536, 52374,13638, - 4873, 52375,52376,37194,545, 317, 5120, 1358, 18911,317, 7386, 332, 370, 1020, 317, 52379,52380,52381,396, 490, 5324, 52383,52384,2402, 316, 52386,317, + 4873, 52375,52376,37194,545, 317, 5120, 1358, 18911,317, 7386, 332, 370, 1020, 317, 52379,52380,52381,396, 490, 5324, 52383,52384,2402, 316, 52386,317, 11635,52387,52388,52389,52390,52391,9059, 52394,52418,52420,6598, 52423,52427,52429,52449,52452,52456,52459,52460,52463,52471,52475,317, 52479,15581,22395,52480, - 317, 52392,52393,365, 317, 365, 317, 317, 317, 2537, 5611, 317, 7865, 52395,52401,52406,52412,52413,52414,52415,13022,52396,6402, 52397,5238, 2146, 332, - 52398,317, 52399,52400,52402,351, 52404,52405,52403,52407,363, 14377,52408,52409,52411,52410,5616, 9450, 379, 317, 6668, 52416,2537, 317, 52417,16339,317, + 317, 52392,52393,365, 317, 365, 317, 317, 317, 2537, 5611, 317, 7865, 52395,52401,52406,52412,52413,52414,52415,13022,52396,6402, 52397,5238, 2146, 332, + 52398,317, 52399,52400,52402,351, 52404,52405,52403,52407,363, 14377,52408,52409,52411,52410,5616, 9450, 379, 317, 6668, 52416,2537, 317, 52417,16339,317, 52419,362, 2553, 1345, 52421,317, 52422,7530, 965, 317, 52424,52426,11612,52425,317, 317, 38706,1347, 317, 52428,5332, 2134, 52430,52431,52435,52436,52438, - 52442,52443,6195, 52447,5105, 2134, 343, 317, 34975,52432,5055, 545, 52433,390, 52434,317, 317, 52437,317, 52439,52440,52441,1325, 2328, 52444,317, 317, + 52442,52443,6195, 52447,5105, 2134, 343, 317, 34975,52432,5055, 545, 52433,390, 52434,317, 317, 52437,317, 52439,52440,52441,1325, 2328, 52444,317, 317, 52445,6108, 52446,52448,2071, 419, 52450,363, 52451,10625,29906,317, 351, 362, 13674,3999, 363, 15616,52453,52454,8488, 363, 590, 343, 317, 574, 52455, - 637, 8248, 1160, 633, 317, 633, 317, 317, 317, 52457,52458,345, 343, 317, 490, 8685, 29910,52461,317, 52462,5626, 52464,52465,605, 52470,427, 371, - 4965, 9624, 362, 16600,52466,52467,382, 7456, 52469,52447,343, 6420, 317, 52468,2369, 2328, 1347, 317, 362, 5557, 317, 28655,52472,52474,17988,362, 363, + 637, 8248, 1160, 633, 317, 633, 317, 317, 317, 52457,52458,345, 343, 317, 490, 8685, 29910,52461,317, 52462,5626, 52464,52465,605, 52470,427, 371, + 4965, 9624, 362, 16600,52466,52467,382, 7456, 52469,52447,343, 6420, 317, 52468,2369, 2328, 1347, 317, 362, 5557, 317, 28655,52472,52474,17988,362, 363, 380, 7911, 596, 2272, 11921,52473,5005, 2260, 317, 52476,52477,52478,363, 317, 15573,363, 12849,2402, 382, 7850, 52482,52483,52487,52489,52498,52502,52503, - 350, 52504,3361, 52508,52526,52527,52528,52530,52545,52550,52551,52484,52486,52485,867, 2272, 351, 5570, 343, 52488,52490,396, 52491,52496,52492,52494,2329, + 350, 52504,3361, 52508,52526,52527,52528,52530,52545,52550,52551,52484,52486,52485,867, 2272, 351, 5570, 343, 52488,52490,396, 52491,52496,52492,52494,2329, 52493,52495,373, 52497,15108,52499,1020, 466, 52500,2584, 52501,1347, 8264, 2146, 2381, 490, 2035, 365, 4965, 428, 317, 52505,52506,52507,52509,29397,52514, 52515,1347, 52516,52520,52521,52522,18908,52510,52511,52512,52513,19201,7225, 52517,52518,52519,52523,52524,52525,3505, 1230, 52529,52531,52532,52541,350, 20774, - 350, 1588, 52544,317, 40225,7149, 2171, 7143, 317, 317, 52533,52536,317, 317, 52534,490, 52535,5838, 52537,370, 52538,2553, 52539,52540,621, 52542,371, + 350, 1588, 52544,317, 40225,7149, 2171, 7143, 317, 317, 52533,52536,317, 317, 52534,490, 52535,5838, 52537,370, 52538,2553, 52539,52540,621, 52542,371, 422, 52543,363, 1160, 401, 317, 15179,2222, 52546,52547,52548,350, 317, 52549,317, 748, 317, 350, 6203, 317, 390, 317, 45529,6322, 52553,52595,52599, 52606,343, 52608,52642,52645,52646,52648,52666,52668,317, 52673,52554,52558,5266, 52560,8546, 52561,52572,52581,52583,381, 52587,52591,348, 350, 52555,52556, 52557,7223, 427, 2156, 5492, 52559,11818,35272,6228, 14773,2171, 20913,22240,52562,52563,362, 317, 10994,52569,356, 52564,317, 52566,52565,1160, 397, 52567, 52568,52570,52571,52573,52575,52574,52576,52577,52578,8804, 52579,52580,52582,52584,393, 52585,14031,52586,2171, 52588,52589,373, 52590,401, 345, 15179,52592, 52594,404, 52593,5652, 4554, 52596,52597,52598,317, 351, 52600,52601,52602,5273, 52605,332, 4591, 345, 52603,317, 21033,52604,317, 8304, 7490, 52607,52609, - 52616,52617,52618,52627,19617,52629,7035, 52610,52615,52611,52612,52613,52614,5661, 3987, 317, 2719, 4304, 52619,317, 52624,370, 317, 317, 317, 52620,5217, + 52616,52617,52618,52627,19617,52629,7035, 52610,52615,52611,52612,52613,52614,5661, 3987, 317, 2719, 4304, 52619,317, 52624,370, 317, 317, 317, 52620,5217, 52621,317, 9313, 5250, 345, 52622,52623,52625,52626,363, 52628,52630,6088, 2272, 52631,52636,52632,52633,52634,52635,52637,52638,52639,52640,52641,317, 52643, - 2510, 317, 317, 317, 2236, 52644,351, 533, 52647,317, 317, 381, 501, 15528,317, 6578, 52649,52655,52650,18946,52651,317, 317, 52652,52653,52654,317, - 1860, 4591, 13631,356, 490, 52656,23172,13631,52657,5005, 52664,2193, 10254,1428, 52658,52659,7187, 317, 52660,1078, 52661,52662,52663,52665,1032, 52667,633, - 694, 350, 317, 52669,52671,52672,1347, 317, 317, 9931, 52670,7866, 466, 52674,52675,4738, 350, 350, 350, 317, 31418,317, 317, 7386, 404, 52677,2236, + 2510, 317, 317, 317, 2236, 52644,351, 533, 52647,317, 317, 381, 501, 15528,317, 6578, 52649,52655,52650,18946,52651,317, 317, 52652,52653,52654,317, + 1860, 4591, 13631,356, 490, 52656,23172,13631,52657,5005, 52664,2193, 10254,1428, 52658,52659,7187, 317, 52660,1078, 52661,52662,52663,52665,1032, 52667,633, + 694, 350, 317, 52669,52671,52672,1347, 317, 317, 9931, 52670,7866, 466, 52674,52675,4738, 350, 350, 350, 317, 31418,317, 317, 7386, 404, 52677,2236, 52679,52680,52678,2341, 351, 15989,342, 317, 52682,345, 52683,345, 52684,52685,52686,52687,351, 52689,345, 317, 331, 52690,7063, 52692,317, 52693,52694, 5942, 365, 52695,52697,52698,52699,2146, 52705,2391, 38536,52700,574, 19303,52701,466, 511, 362, 52704,4980, 52702,2577, 52703,356, 381, 10626,317, 52707, 52708,317, 7902, 52709,52710,371, 9623, 52711,12931,52713,52714,52712,46874,52715,11617,52716,52718,17274,52720,52721,5084, 52719,382, 317, 2291, 317, 52723, - 52724,635, 317, 363, 52725,52726,52727,52736,179, 52864,52915,52940,52942,52962,553, 52975,52977,180, 53100,181, 53223,345, 53227,53230,182, 53462,2110, + 52724,635, 317, 363, 52725,52726,52727,52736,179, 52864,52915,52940,52942,52962,553, 52975,52977,180, 53100,181, 53223,345, 53227,53230,182, 53462,2110, 53513,53514,53515,53517,53534,317, 317, 52728,52730,17462,52732,52733,6551, 52729,4965, 6228, 916, 633, 52731,317, 13457,52734,317, 52735,52737,52740,52744, 52746,52779,3941, 338, 33038,52791,317, 35155,7385, 13376,317, 52738,365, 490, 317, 52739,395, 52741,52742,52743,317, 52745,52747,52757,52766,52775,52776, 52777,52748,380, 52751,356, 356, 52756,356, 317, 52749,317, 18438,317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 1347, 52750, 317, 10072,317, 5300, 317, 317, 371, 52752,52753,52754,343, 52755,11831,10506,883, 514, 5836, 52758,52759,350, 2715, 5995, 1548, 317, 52760,52761,24775, 52762,52763,362, 52764,52765,317, 490, 2105, 21183,1108, 363, 363, 2310, 52767,52768,332, 52769,33428,9174, 590, 11147,5120, 5890, 52770,52771,52772,52773, - 52774,361, 3284, 52778,317, 52780,2134, 52781,52785,52786,52788,317, 52789,1160, 52782,41595,52783,10641,317, 5300, 637, 5942, 6996, 633, 317, 52784,317, + 52774,361, 3284, 52778,317, 52780,2134, 52781,52785,52786,52788,317, 52789,1160, 52782,41595,52783,10641,317, 5300, 637, 5942, 6996, 633, 317, 52784,317, 52787,345, 10641,317, 317, 317, 2391, 2163, 52790,317, 52792,317, 52793,52797,52803,52814,52818,52820,52823,52824,52826,52828,52832,52836,52840,52848,52849, 52859,52862,52794,52795,52796,7405, 1347, 52798,52800,380, 52799,11272,490, 52801,52802,9140, 52804,52805,52813,343, 52806,52808,427, 52807,52809,52810,52811, 52812,49876,52815,52816,52817,52819,427, 21318,5241, 52821,52822,345, 5459, 52825,52827,530, 45067,52829,52830,52831,10648,317, 52833,52834,52835,52837,52838, - 52839,52841,52842,52843,6188, 5687, 52844,52845,343, 52846,52847,18995,6409, 52850,52853,317, 3122, 11219,52856,52858,52851,52852,52854,52855,1347, 7222, 317, + 52839,52841,52842,52843,6188, 5687, 52844,52845,343, 52846,52847,18995,6409, 52850,52853,317, 3122, 11219,52856,52858,52851,52852,52854,52855,1347, 7222, 317, 595, 52857,460, 52860,52861,52863,52865,52866,52867,52868,52890,52891,52894,13023,52896,13917,52897,52899,2178, 32249,52900,52903,52908,2110, 6195, 52911,20485, 2074, 5653, 52869,52870,596, 52872,6674, 4943, 1347, 9931, 52871,7618, 317, 345, 52873,466, 52874,52882,52883,9624, 52884,52885,52886,52887,52889,52875,52876, 52877,52878,52879,52880,52881,7064, 7448, 14610,363, 363, 476, 7064, 316, 5809, 52888,1588, 2301, 2108, 52892,52893,551, 52895,2022, 363, 4952, 11229,46664, 7151, 52898,18720,16656,52901,52902,52904,52905,5017, 2152, 52907,2151, 2551, 5225, 52906,52909,5205, 52910,5841, 11279,5742, 370, 52912,52914,2063, 371, 52913, 567, 349, 596, 1033, 52916,52920,343, 343, 52925,52930,52931,52936,52939,2402, 52917,13638,52918,52919,2845, 52921,52922,49915,52923,52924,52926,52928,43841, 23247,52929,2108, 36545,52927,25135,1109, 1108, 52932,605, 317, 52933,52934,52935,390, 363, 490, 350, 52937,52938,52941,2521, 2272, 317, 52943,52945,52946, - 52950,52954,52956,317, 52958,52944,52947,434, 317, 52948,40690,52949,52951,8546, 31594,52952,52953,317, 22232,5570, 14981,52955,2035, 1358, 317, 52957,6188, + 52950,52954,52956,317, 52958,52944,52947,434, 317, 52948,40690,52949,52951,8546, 31594,52952,52953,317, 22232,5570, 14981,52955,2035, 1358, 317, 52957,6188, 4268, 9836, 52959,52960,317, 317, 317, 52961,52963,52971,52973,40781,317, 52974,1601, 13376,52964,52966,52968,490, 11147,52965,52967,371, 52969,371, 52970, - 52967,317, 371, 371, 317, 345, 52972,401, 9768, 52976,317, 20231,596, 52978,52979,52986,17851,52989,52991,52992,52996,52997,3611, 621, 332, 13376,365, - 317, 490, 490, 2381, 42796,52980,52981,52982,1011, 633, 673, 633, 317, 343, 23950,7035, 52983,317, 52984,52985,317, 317, 317, 7155, 317, 317, 756, - 620, 317, 317, 317, 317, 317, 317, 390, 428, 490, 52987,3361, 52988,380, 33656,52990,317, 17333,345, 9450, 5309, 345, 52993,317, 5611, 7892, 5836, - 362, 52994,363, 52995,52998,13553,7480, 39966,2108, 3284, 52999,53006,8600, 53011,53015,53021,53023,53025,53028,53038,53045,362, 53079,53080,40560,53084,8301, + 52967,317, 371, 371, 317, 345, 52972,401, 9768, 52976,317, 20231,596, 52978,52979,52986,17851,52989,52991,52992,52996,52997,3611, 621, 332, 13376,365, + 317, 490, 490, 2381, 42796,52980,52981,52982,1011, 633, 673, 633, 317, 343, 23950,7035, 52983,317, 52984,52985,317, 317, 317, 7155, 317, 317, 756, + 620, 317, 317, 317, 317, 317, 317, 390, 428, 490, 52987,3361, 52988,380, 33656,52990,317, 17333,345, 9450, 5309, 345, 52993,317, 5611, 7892, 5836, + 362, 52994,363, 52995,52998,13553,7480, 39966,2108, 3284, 52999,53006,8600, 53011,53015,53021,53023,53025,53028,53038,53045,362, 53079,53080,40560,53084,8301, 53088,53091,53093,53096,317, 370, 53000,317, 53001,53002,53005,8562, 7399, 317, 317, 317, 24797,317, 53003,317, 53004,5836, 339, 339, 53007,53008,19139, - 53009,9809, 317, 53010,2117, 3007, 381, 3007, 390, 317, 53012,370, 1230, 363, 53014,2110, 53013,31475,317, 5897, 543, 9012, 10283,427, 990, 11959,365, + 53009,9809, 317, 53010,2117, 3007, 381, 3007, 390, 317, 53012,370, 1230, 363, 53014,2110, 53013,31475,317, 5897, 543, 9012, 10283,427, 990, 11959,365, 2035, 53016,317, 351, 53017,53018,1109, 53019,53020,5836, 317, 427, 4943, 317, 741, 332, 317, 317, 365, 7438, 1331, 343, 345, 578, 53022,2328, 12487, - 53024,53026,53027,363, 6563, 363, 8522, 363, 4952, 53029,590, 2142, 53030,5839, 1943, 53031,345, 53032,53036,53037,317, 7874, 427, 1588, 53033,53034,370, - 317, 6578, 317, 53035,317, 345, 370, 8448, 7888, 317, 7035, 2521, 53039,466, 53040,16416,53042,53044,3646, 16143,53041,363, 53043,53046,53048,53050,9624, + 53024,53026,53027,363, 6563, 363, 8522, 363, 4952, 53029,590, 2142, 53030,5839, 1943, 53031,345, 53032,53036,53037,317, 7874, 427, 1588, 53033,53034,370, + 317, 6578, 317, 53035,317, 345, 370, 8448, 7888, 317, 7035, 2521, 53039,466, 53040,16416,53042,53044,3646, 16143,53041,363, 53043,53046,53048,53050,9624, 2413, 53061,53063,362, 350, 53073,51449,53075,5840, 5037, 53078,317, 343, 345, 317, 53047,23232,317, 317, 2193, 20577,53049,479, 439, 9696, 317, 53051, - 53052,53056,4980, 11962,317, 350, 351, 53053,53054,53055,9325, 427, 637, 6996, 317, 637, 53057,317, 53059,317, 47501,53060,53058,7651, 53062,6563, 393, + 53052,53056,4980, 11962,317, 350, 351, 53053,53054,53055,9325, 427, 637, 6996, 317, 637, 53057,317, 53059,317, 47501,53060,53058,7651, 53062,6563, 393, 16891,53064,53065,45065,35144,53066,53067,53068,18930,6046, 53071,363, 2369, 317, 317, 37935,45067,21434,6718, 351, 53069,317, 53070,351, 317, 390, 53072, 12696,53074,490, 5223, 1230, 317, 28926,365, 6736, 363, 7698, 53076,53077,6188, 14079,343, 2063, 2301, 6546, 371, 351, 673, 53081,37391,53082,1109, 53083, - 4925, 45529,5184, 317, 53085,53086,53087,6736, 363, 53089,53090,356, 363, 317, 53092,350, 363, 317, 351, 8325, 317, 390, 53094,53095,53097,343, 356, - 53098,53099,53101,345, 53102,53103,345, 7698, 53107,317, 6207, 365, 1943, 317, 317, 2001, 401, 53104,53106,382, 317, 53105,5174, 317, 370, 317, 6409, - 5611, 53108,2177, 53117,53122,53132,53151,53152,53158,53161,53183,53185,53188,53201,2063, 53206,53212,53214,53219,317, 38027,53220,365, 317, 7386, 362, 317, + 4925, 45529,5184, 317, 53085,53086,53087,6736, 363, 53089,53090,356, 363, 317, 53092,350, 363, 317, 351, 8325, 317, 390, 53094,53095,53097,343, 356, + 53098,53099,53101,345, 53102,53103,345, 7698, 53107,317, 6207, 365, 1943, 317, 317, 2001, 401, 53104,53106,382, 317, 53105,5174, 317, 370, 317, 6409, + 5611, 53108,2177, 53117,53122,53132,53151,53152,53158,53161,53183,53185,53188,53201,2063, 53206,53212,53214,53219,317, 38027,53220,365, 317, 7386, 362, 317, 332, 6551, 53109,53110,53114,53115,53116,490, 489, 317, 2322, 53111,53112,53113,50213,7668, 4268, 7785, 53118,53119,53121,317, 317, 6326, 317, 317, 53120, - 19287,605, 2381, 317, 317, 317, 53123,5526, 53124,32693,14409,53125,53127,867, 53128,53129,1160, 6763, 17513,6497, 317, 380, 317, 7949, 53126,381, 2178, - 53130,53131,5942, 53133,633, 53134,53135,317, 20857,53139,867, 53141,53143,53144,53148,574, 53150,317, 365, 25413,53136,53137,53138,53140,355, 53142,7384, - 490, 418, 53145,317, 2108, 317, 317, 317, 53147,317, 53146,24623,11273,317, 6894, 53149,53153,14132,53154,53155,317, 7035, 317, 345, 5623, 53156,466, - 53157,53159,317, 53160,1011, 53162,53167,53168,27689,351, 9624, 6714, 31980,53171,53176,5055, 53177,39736,5419, 317, 356, 53163,53164,53165,1347, 53166,381, - 7888, 351, 5335, 53169,317, 1597, 53170,7385, 52806,36371,5890, 53172,317, 53174,7142, 53175,53173,1160, 8447, 370, 5441, 18588,22668,30314,317, 53178,6195, + 19287,605, 2381, 317, 317, 317, 53123,5526, 53124,32693,14409,53125,53127,867, 53128,53129,1160, 6763, 17513,6497, 317, 380, 317, 7949, 53126,381, 2178, + 53130,53131,5942, 53133,633, 53134,53135,317, 20857,53139,867, 53141,53143,53144,53148,574, 53150,317, 365, 25413,53136,53137,53138,53140,355, 53142,7384, + 490, 418, 53145,317, 2108, 317, 317, 317, 53147,317, 53146,24623,11273,317, 6894, 53149,53153,14132,53154,53155,317, 7035, 317, 345, 5623, 53156,466, + 53157,53159,317, 53160,1011, 53162,53167,53168,27689,351, 9624, 6714, 31980,53171,53176,5055, 53177,39736,5419, 317, 356, 53163,53164,53165,1347, 53166,381, + 7888, 351, 5335, 53169,317, 1597, 53170,7385, 52806,36371,5890, 53172,317, 53174,7142, 53175,53173,1160, 8447, 370, 5441, 18588,22668,30314,317, 53178,6195, 53179,53180,5201, 53181,1325, 53182,7821, 53184,317, 53186,12352,5055, 350, 53187,317, 396, 5308, 53189,53190,53199,6697, 317, 42580,1999, 558, 53191,53192, - 6402, 490, 5324, 53193,53198,5557, 317, 53194,53195,53196,53197,10997,343, 10592,53200,9624, 382, 317, 365, 317, 317, 317, 351, 9624, 317, 363, 371, - 965, 489, 317, 53202,317, 53204,26214,5890, 490, 53203,317, 317, 53205,5120, 53207,21074,363, 53208,428, 605, 351, 53209,53210,53211,7091, 53213,466, - 501, 13226,6176, 317, 479, 317, 2222, 317, 351, 317, 317, 317, 7386, 381, 390, 381, 53215,53216,22668,345, 317, 53217,53218,345, 370, 10149,317, + 6402, 490, 5324, 53193,53198,5557, 317, 53194,53195,53196,53197,10997,343, 10592,53200,9624, 382, 317, 365, 317, 317, 317, 351, 9624, 317, 363, 371, + 965, 489, 317, 53202,317, 53204,26214,5890, 490, 53203,317, 317, 53205,5120, 53207,21074,363, 53208,428, 605, 351, 53209,53210,53211,7091, 53213,466, + 501, 13226,6176, 317, 479, 317, 2222, 317, 351, 317, 317, 317, 7386, 381, 390, 381, 53215,53216,22668,345, 317, 53217,53218,345, 370, 10149,317, 53221,317, 317, 53222,5897, 34041,15540,53224,501, 343, 53226,553, 3236, 53225,53228,53229,53231,53244,53245,53247,53249,53251,53253,596, 53254,53255,53256, 1444, 53261,53263,53264,53265,388, 12494,53268,53232,53236,46796,53237,53238,317, 317, 6394, 53239,53242,317, 11388,317, 5612, 576, 53233,53235,590, 53234, - 614, 332, 6419, 52644,9947, 6540, 1347, 5241, 15867,11388,53240,53241,53243,343, 1160, 6817, 1459, 10471,490, 53246,44206,317, 317, 5038, 53248,317, 490, - 317, 5392, 490, 28565,53250,5033, 317, 2004, 8937, 53252,363, 14415,53257,53258,15108,7116, 53259,53260,317, 363, 53262,5022, 53266,53267,53269,3611, 1444, - 53270,53288,53294,53324,53336,53342,53348,53350,53361,53379,53381,53385,53390,53393,53394,53398,53404,53406,53416,53436,53451,53271,365, 53275,2163, 53277,317, + 614, 332, 6419, 52644,9947, 6540, 1347, 5241, 15867,11388,53240,53241,53243,343, 1160, 6817, 1459, 10471,490, 53246,44206,317, 317, 5038, 53248,317, 490, + 317, 5392, 490, 28565,53250,5033, 317, 2004, 8937, 53252,363, 14415,53257,53258,15108,7116, 53259,53260,317, 363, 53262,5022, 53266,53267,53269,3611, 1444, + 53270,53288,53294,53324,53336,53342,53348,53350,53361,53379,53381,53385,53390,53393,53394,53398,53404,53406,53416,53436,53451,53271,365, 53275,2163, 53277,317, 53280,365, 53283,490, 53272,53273,53274,53276,53278,53279,53281,53282,317, 53284,53285,53286,53287,53289,53290,53291,53292,317, 53293,382, 422, 53295,53303, - 53309,7035, 53312,53323,53296,53299,53302,53297,53298,53300,53301,317, 9067, 356, 990, 990, 53304,53305,53306,53307,53308,317, 380, 53310,343, 350, 2391, - 317, 53311,317, 53313,53316,8178, 53314,53315,53317,53319,53320,53318,53321,53322,53325,53329,3125, 53326,53327,53328,53330,53335,53331,53332,53333,53334,317, + 53309,7035, 53312,53323,53296,53299,53302,53297,53298,53300,53301,317, 9067, 356, 990, 990, 53304,53305,53306,53307,53308,317, 380, 53310,343, 350, 2391, + 317, 53311,317, 53313,53316,8178, 53314,53315,53317,53319,53320,53318,53321,53322,53325,53329,3125, 53326,53327,53328,53330,53335,53331,53332,53333,53334,317, 350, 53337,53338,317, 351, 12551,365, 41309,8937, 53339,53340,370, 317, 25960,343, 53341,345, 16018,53343,53345,343, 53344,53346,53347,53349,49012,53351, 53355,2845, 53356,350, 3387, 53357,13066,490, 53358,53352,53353,1347, 317, 53354,928, 651, 29586,490, 53359,1481, 53360,53362,53365,53369,317, 53370,34164, - 317, 53363,317, 7261, 53364,53366,53367,53368,1160, 8275, 53371,53374,53372,53373,53375,53376,53377,53378,53380,317, 53382,53383,53384,8274, 2001, 332, 339, + 317, 53363,317, 7261, 53364,53366,53367,53368,1160, 8275, 53371,53374,53372,53373,53375,53376,53377,53378,53380,317, 53382,53383,53384,8274, 2001, 332, 339, 8178, 53386,53387,371, 53388,317, 53389,53391,381, 53392,25568,351, 384, 2152, 53395,343, 53396,53397,30236,317, 53399,53400,2369, 53401,53402,53403,53405, - 53407,53408,373, 21606,380, 53409,53410,53411,53412,53413,53414,53415,317, 5105, 53417,53418,53419,53427,6917, 53429,53432,53434,345, 53435,317, 317, 393, - 317, 317, 317, 53420,1992, 53421,53423,53422,317, 8544, 317, 51097,53424,19720,53425,53426,53428,53430,490, 53431,53433,553, 29586,381, 6228, 317, 2077, - 590, 317, 53437,53440,53442,53443,9696, 53445,317, 390, 53450,317, 53438,53439,466, 53441,317, 18021,343, 317, 357, 317, 317, 53444,53446,53448,433, + 53407,53408,373, 21606,380, 53409,53410,53411,53412,53413,53414,53415,317, 5105, 53417,53418,53419,53427,6917, 53429,53432,53434,345, 53435,317, 317, 393, + 317, 317, 317, 53420,1992, 53421,53423,53422,317, 8544, 317, 51097,53424,19720,53425,53426,53428,53430,490, 53431,53433,553, 29586,381, 6228, 317, 2077, + 590, 317, 53437,53440,53442,53443,9696, 53445,317, 390, 53450,317, 53438,53439,466, 53441,317, 18021,343, 317, 357, 317, 317, 53444,53446,53448,433, 381, 26610,317, 1160, 53447,53449,5335, 489, 6228, 317, 2631, 2077, 317, 365, 53452,53461,5441, 53453,53454,53455,53456,53457,53458,2063, 53459,53460,53463, 53465,6726, 2024, 53470,53474,13638,362, 2391, 53475,53483,53489,53497,53510,317, 53464,53466,317, 5332, 53467,2568, 350, 53469,53468,317, 2222, 6578, 15334, 2211, 3987, 428, 2381, 53471,363, 53472,53473,3787, 317, 332, 6433, 332, 53476,501, 2163, 401, 53477,53478,53479,53480,53481,53482,53484,317, 53485,53486, - 53487,490, 8636, 53488,46856,53490,53493,590, 53494,53491,53492,343, 53495,490, 317, 317, 332, 317, 590, 53496,53498,35155,53499,53507,53508,362, 363, - 317, 317, 53500,53505,53506,362, 53501,53502,53503,53504,7618, 1160, 53509,362, 317, 11915,53511,6691, 350, 53512,15951,381, 5038, 970, 3361, 7618, 5394, + 53487,490, 8636, 53488,46856,53490,53493,590, 53494,53491,53492,343, 53495,490, 317, 317, 332, 317, 590, 53496,53498,35155,53499,53507,53508,362, 363, + 317, 317, 53500,53505,53506,362, 53501,53502,53503,53504,7618, 1160, 53509,362, 317, 11915,53511,6691, 350, 53512,15951,381, 5038, 970, 3361, 7618, 5394, 466, 19922,363, 404, 53516,1060, 8649, 8637, 12277,53518,53529,11831,53531,53519,53521,7865, 44428,53522,317, 596, 53523,53527,53528,6901, 53520,53524,53525, - 7384, 332, 53526,332, 53530,53532,53533,363, 53535,490, 350, 53536,53537,53540,23247,53542,317, 11533,8099, 317, 37402,554, 53538,53539,332, 53541,332, - 5173, 3429, 317, 53543,317, 590, 3182, 3738, 53545,380, 53548,53551,53546,53547,53549,53550,2288, 46697,5022, 53552,370, 365, 53554,53555,53556,980, 4186, - 53558,7433, 53560,38877,343, 53564,317, 53567,53559,317, 490, 317, 53095,339, 412, 53561,565, 53563,53562,332, 11347,53565,53566,53569,53572,317, 1959, - 53574,1230, 53575,53579,390, 53582,53570,53571,53573,1087, 53576,2366, 53577,317, 53578,53580,53581,393, 53584,53587,317, 53588,53585,53586,8444, 317, 476, + 7384, 332, 53526,332, 53530,53532,53533,363, 53535,490, 350, 53536,53537,53540,23247,53542,317, 11533,8099, 317, 37402,554, 53538,53539,332, 53541,332, + 5173, 3429, 317, 53543,317, 590, 3182, 3738, 53545,380, 53548,53551,53546,53547,53549,53550,2288, 46697,5022, 53552,370, 365, 53554,53555,53556,980, 4186, + 53558,7433, 53560,38877,343, 53564,317, 53567,53559,317, 490, 317, 53095,339, 412, 53561,565, 53563,53562,332, 11347,53565,53566,53569,53572,317, 1959, + 53574,1230, 53575,53579,390, 53582,53570,53571,53573,1087, 53576,2366, 53577,317, 53578,53580,53581,393, 53584,53587,317, 53588,53585,53586,8444, 317, 476, 53589,53590,53597,53606,53630,53659,53668,53672,53684,53700,53709,53715,53717,53764,184, 54026,54068,54073,185, 54198,54244,54305,54333,54340,54346,54348,54352, - 317, 317, 317, 317, 1358, 53591,53594,53595,53596,317, 53592,53593,53598,53599,53601,2022, 317, 14558,53604,53605,2679, 356, 317, 53600,53602,345, 317, + 317, 317, 317, 317, 1358, 53591,53594,53595,53596,317, 53592,53593,53598,53599,53601,2022, 317, 14558,53604,53605,2679, 356, 317, 53600,53602,345, 317, 317, 6420, 53603,317, 317, 10674,370, 10674,53607,53609,53611,53612,53615,53624,53627,332, 53608,7689, 3284, 53610,5611, 317, 3869, 365, 53613,13392,53614, 50552,53616,53617,350, 5911, 317, 53620,317, 53618,53619,40164,370, 53621,317, 317, 53622,53623,53625,53626,317, 16535,53628,53629,53631,53634,53637,53647, - 490, 53648,53651,53652,7850, 317, 53653,317, 53656,2074, 53632,53633,332, 53635,466, 53636,53638,6420, 490, 53639,53645,317, 9124, 466, 5363, 317, 7916, + 490, 53648,53651,53652,7850, 317, 53653,317, 53656,2074, 53632,53633,332, 53635,466, 53636,53638,6420, 490, 53639,53645,317, 9124, 466, 5363, 317, 7916, 53640,53642,317, 3284, 317, 53641,7640, 5987, 7419, 317, 1347, 53643,317, 317, 53644,370, 10674,5225, 1325, 466, 317, 7242, 2117, 53646,1020, 53649,20542, 53650,1358, 965, 24852,345, 3999, 5570, 53654,317, 53655,1347, 317, 317, 345, 13323,5446, 53657,53658,9182, 16294,6917, 53660,53663,362, 53665,53666,53667, 317, 370, 6763, 53661,317, 53662,53664,350, 2510, 362, 390, 36436,343, 343, 362, 317, 390, 351, 490, 2568, 53669,381, 53670,6598, 343, 317, 53671, - 14535,14535,551, 53673,53676,15571,53677,53678,53680,53681,53682,53683,2351, 53674,365, 53675,5517, 23747,351, 317, 25646,317, 17734,380, 53679,1044, 332, - 53685,317, 53693,53694,36289,53696,8392, 53697,53698,53699,363, 2381, 53686,345, 351, 53687,53688,53692,45402,317, 5765, 343, 5962, 2631, 350, 351, 356, - 356, 53689,356, 53690,53691,348, 433, 370, 356, 362, 317, 317, 5419, 53695,317, 11342,2211, 350, 317, 1526, 14991,317, 6203, 317, 466, 2584, 5662, - 10058,363, 5200, 1481, 53701,8405, 5634, 5891, 53702,53707,12756,501, 49032,9170, 343, 53703,6308, 350, 53704,53705,317, 53706,350, 6917, 53708,53710,2280, + 14535,14535,551, 53673,53676,15571,53677,53678,53680,53681,53682,53683,2351, 53674,365, 53675,5517, 23747,351, 317, 25646,317, 17734,380, 53679,1044, 332, + 53685,317, 53693,53694,36289,53696,8392, 53697,53698,53699,363, 2381, 53686,345, 351, 53687,53688,53692,45402,317, 5765, 343, 5962, 2631, 350, 351, 356, + 356, 53689,356, 53690,53691,348, 433, 370, 356, 362, 317, 317, 5419, 53695,317, 11342,2211, 350, 317, 1526, 14991,317, 6203, 317, 466, 2584, 5662, + 10058,363, 5200, 1481, 53701,8405, 5634, 5891, 53702,53707,12756,501, 49032,9170, 343, 53703,6308, 350, 53704,53705,317, 53706,350, 6917, 53708,53710,2280, 53712,53714,53711,343, 633, 53713,362, 317, 2134, 2227, 6763, 350, 317, 332, 53716,1459, 53718,5561, 53721,53727,7566, 550, 53732,317, 53739,53749,53750, - 4591, 53754,53755,53757,53759,53763,971, 2551, 53719,1347, 53720,365, 53722,53723,53725,53726,5126, 317, 317, 317, 53724,1347, 5237, 8214, 53728,8023, 317, - 362, 9581, 317, 53729,10820,317, 370, 365, 53730,5809, 5225, 53731,466, 1588, 490, 53733,343, 53737,53734,53736,317, 2211, 1347, 3284, 53735,317, 7990, - 6402, 343, 316, 5654, 53738,14251,5896, 53740,53742,53744,53745,53748,490, 350, 1109, 53741,1358, 317, 11962,351, 317, 13670,14834,53743,12943,345, 4980, - 490, 53746,53747,1347, 18438,317, 317, 2631, 2077, 2066, 317, 15565,351, 5619, 10592,7892, 33765,53751,53752,1345, 2142, 317, 53753,363, 365, 363, 355, + 4591, 53754,53755,53757,53759,53763,971, 2551, 53719,1347, 53720,365, 53722,53723,53725,53726,5126, 317, 317, 317, 53724,1347, 5237, 8214, 53728,8023, 317, + 362, 9581, 317, 53729,10820,317, 370, 365, 53730,5809, 5225, 53731,466, 1588, 490, 53733,343, 53737,53734,53736,317, 2211, 1347, 3284, 53735,317, 7990, + 6402, 343, 316, 5654, 53738,14251,5896, 53740,53742,53744,53745,53748,490, 350, 1109, 53741,1358, 317, 11962,351, 317, 13670,14834,53743,12943,345, 4980, + 490, 53746,53747,1347, 18438,317, 317, 2631, 2077, 2066, 317, 15565,351, 5619, 10592,7892, 33765,53751,53752,1345, 2142, 317, 53753,363, 365, 363, 355, 53756,466, 343, 4984, 2058, 317, 53758,53760,53762,53761,428, 949, 53765,53767,28795,26336,355, 53769,53773,53774,53776,53778,53780,53766,53768,490, 53770, 317, 53771,53772,6387, 317, 427, 317, 2156, 501, 53775,949, 53777,8926, 351, 550, 53779,11617,53781,363, 384, 53782,53783,53784,53800,53815,53823,53835, - 53839,53846,53849,53857,53858,53864,53867,53871,53921,53924,53934,54020,5037, 54025,53785,53786,317, 53787,15837,53788,53790,53791,53795,4925, 432, 6002, 362, + 53839,53846,53849,53857,53858,53864,53867,53871,53921,53924,53934,54020,5037, 54025,53785,53786,317, 53787,15837,53788,53790,53791,53795,4925, 432, 6002, 362, 343, 365, 53789,53792,317, 5392, 317, 965, 6555, 317, 53793,53794,317, 317, 9549, 345, 4268, 317, 53796,53797,53799,53798,9440, 317, 6468, 317, 53801, 53802,53803,53809,5862, 6826, 53810,404, 53814,53804,317, 317, 53805,317, 53806,53807,53808,351, 363, 12494,53811,53812,53813,53816,53818,53820,45213,53821, - 53822,317, 317, 317, 8920, 2272, 1358, 53817,565, 18125,317, 317, 53819,11533,351, 332, 317, 343, 317, 316, 365, 490, 2150, 362, 317, 7990, 490, - 53824,380, 53826,53829,53830,53825,332, 53827,53828,317, 568, 18615,7672, 637, 53831,15631,317, 6332, 317, 633, 8345, 317, 633, 53832,5205, 53833,5157, - 43697,317, 621, 637, 5826, 317, 53834,363, 53836,2033, 53837,53838,2211, 12696,53840,53841,53842,53843,53845,343, 590, 6402, 363, 11613,317, 5033, 2142, - 365, 19829,317, 53844,8807, 317, 7506, 6703, 317, 30176,6314, 317, 1020, 380, 53847,53848,371, 53850,6546, 4982, 53852,5538, 15330,53853,1030, 53854,317, + 53822,317, 317, 317, 8920, 2272, 1358, 53817,565, 18125,317, 317, 53819,11533,351, 332, 317, 343, 317, 316, 365, 490, 2150, 362, 317, 7990, 490, + 53824,380, 53826,53829,53830,53825,332, 53827,53828,317, 568, 18615,7672, 637, 53831,15631,317, 6332, 317, 633, 8345, 317, 633, 53832,5205, 53833,5157, + 43697,317, 621, 637, 5826, 317, 53834,363, 53836,2033, 53837,53838,2211, 12696,53840,53841,53842,53843,53845,343, 590, 6402, 363, 11613,317, 5033, 2142, + 365, 19829,317, 53844,8807, 317, 7506, 6703, 317, 30176,6314, 317, 1020, 380, 53847,53848,371, 53850,6546, 4982, 53852,5538, 15330,53853,1030, 53854,317, 53851,317, 637, 6996, 317, 633, 1160, 2510, 53855,53856,7225, 317, 1588, 370, 317, 53859,388, 7401, 1078, 4952, 362, 8296, 36081,404, 1347, 317, 53860, - 681, 39288,53861,317, 6996, 317, 53862,1155, 1353, 53863,5217, 1160, 1345, 3111, 53865,53866,2058, 53868,53870,13782,53869,5223, 4965, 10086,2270, 53872,317, - 26313,53881,362, 29067,53886,53891,53893,53899,53901,5005, 53908,53916,2260, 317, 9922, 53873,53877,53878,53879,595, 53874,53875,53876,317, 8682, 460, 965, + 681, 39288,53861,317, 6996, 317, 53862,1155, 1353, 53863,5217, 1160, 1345, 3111, 53865,53866,2058, 53868,53870,13782,53869,5223, 4965, 10086,2270, 53872,317, + 26313,53881,362, 29067,53886,53891,53893,53899,53901,5005, 53908,53916,2260, 317, 9922, 53873,53877,53878,53879,595, 53874,53875,53876,317, 8682, 460, 965, 345, 53880,351, 5761, 53882,53883,14419,2177, 53884,53885,52144,2405, 53887,53890,53888,53889,53892,433, 53894,553, 53896,53895,2380, 5241, 53897,53898,53900, - 53902,6187, 53905,53903,53904,401, 14185,53906,1347, 53907,317, 345, 2094, 5441, 53909,53913,53910,53911,53912,53914,53915,53917,53918,53920,43983,53919,317, - 7222, 4591, 317, 433, 53922,53923,7941, 382, 5241, 317, 317, 53925,53926,53928,6021, 490, 53929,2521, 53930,434, 2322, 317, 345, 1444, 317, 53927,317, + 53902,6187, 53905,53903,53904,401, 14185,53906,1347, 53907,317, 345, 2094, 5441, 53909,53913,53910,53911,53912,53914,53915,53917,53918,53920,43983,53919,317, + 7222, 4591, 317, 433, 53922,53923,7941, 382, 5241, 317, 317, 53925,53926,53928,6021, 490, 53929,2521, 53930,434, 2322, 317, 345, 1444, 317, 53927,317, 1444, 36463,12494,317, 9852, 351, 317, 53931,53933,53932,53935,53946,53948,53949,53985,53988,53993,53994,53998,53999,2022, 54002,54007,54012,54016,317, 54018, - 5037, 54019,317, 53936,2113, 53937,53939,53940,53942,965, 317, 53945,404, 10578,34721,1347, 53938,1358, 47911,1347, 53941,332, 332, 332, 39398,53943,404, + 5037, 54019,317, 53936,2113, 53937,53939,53940,53942,965, 317, 53945,404, 10578,34721,1347, 53938,1358, 47911,1347, 53941,332, 332, 332, 39398,53943,404, 53944,317, 343, 345, 343, 317, 317, 5439, 51698,53947,12770,8224, 6954, 317, 53950,5032, 53954,317, 53957,53959,53960,53961,53962,53964,53966,53970,53972, 53976,316, 53981,317, 53984,53951,53952,343, 5238, 53953,53955,53956,1189, 18084,53958,2171, 13847,20149,7035, 53963,2808, 5328, 317, 317, 53965,11921,24957, 7657, 2146, 53967,53968,53969,53971,317, 53973,332, 6420, 53974,5570, 1345, 53975,47279,5328, 53977,18014,362, 53979,53980,53978,53982,10516,53983,53986,53987, @@ -10151,69 +10146,69 @@ static const unsigned int ChildLocs[185261] = 2272, 54056,54057,54058,12397,2413, 39005,54060,31023,362, 4974, 317, 2355, 13837,5624, 384, 11702,317, 317, 317, 9624, 39005,4952, 317, 54059,317, 54062, 54064,343, 362, 54063,6228, 651, 633, 317, 2081, 12154,362, 3075, 317, 317, 317, 1325, 5159, 54066,370, 317, 317, 317, 54067,54069,54071,466, 54072, 317, 365, 54070,317, 1624, 362, 317, 576, 3999, 54074,5692, 363, 7869, 54075,54090,54092,54093,54102,54113,54114,54134,54144,54145,54149,54152,54157,54162, - 54170,54172,54184,54186,490, 54196,15750,5105, 15074,343, 54076,345, 7143, 54077,317, 54078,54082,54083,54085,54087,54088,16672,317, 362, 7928, 380, 362, - 317, 5634, 317, 34487,345, 54079,54080,370, 317, 54081,370, 511, 15307,317, 317, 317, 1358, 5037, 54084,365, 54086,5619, 317, 6903, 332, 6901, 317, - 343, 12028,54089,5616, 371, 351, 54091,13323,362, 345, 54094,54095,16464,9427, 54101,1526, 343, 5223, 5836, 2369, 54096,1230, 54097,317, 365, 2351, 317, - 54098,317, 54099,5483, 54100,363, 5943, 54103,54104,2584, 317, 54105,39005,54106,404, 54107,54108,54109,541, 490, 54111,54112,317, 5865, 317, 6598, 363, + 54170,54172,54184,54186,490, 54196,15750,5105, 15074,343, 54076,345, 7143, 54077,317, 54078,54082,54083,54085,54087,54088,16672,317, 362, 7928, 380, 362, + 317, 5634, 317, 34487,345, 54079,54080,370, 317, 54081,370, 511, 15307,317, 317, 317, 1358, 5037, 54084,365, 54086,5619, 317, 6903, 332, 6901, 317, + 343, 12028,54089,5616, 371, 351, 54091,13323,362, 345, 54094,54095,16464,9427, 54101,1526, 343, 5223, 5836, 2369, 54096,1230, 54097,317, 365, 2351, 317, + 54098,317, 54099,5483, 54100,363, 5943, 54103,54104,2584, 317, 54105,39005,54106,404, 54107,54108,54109,541, 490, 54111,54112,317, 5865, 317, 6598, 363, 439, 6002, 490, 8354, 8569, 317, 363, 50239,1160, 54110,317, 1020, 317, 370, 24756,316, 11089,317, 317, 363, 7954, 317, 343, 363, 551, 54115,54121, - 490, 350, 34975,539, 54133,332, 2272, 54116,317, 637, 6996, 317, 10217,365, 317, 9624, 317, 54117,54120,363, 54118,54119,317, 317, 11783,54122,317, + 490, 350, 34975,539, 54133,332, 2272, 54116,317, 637, 6996, 317, 10217,365, 317, 9624, 317, 54117,54120,363, 54118,54119,317, 317, 11783,54122,317, 317, 54123,5138, 54127,54130,54124,54125,54126,363, 54128,54129,54131,54132,54135,54136,54138,11986,6900, 2142, 29531,54139,9174, 54140,9667, 10898,8926, 54137, - 439, 490, 317, 317, 343, 2086, 1345, 54141,370, 363, 54142,54143,590, 574, 53140,10801,343, 54146,54147,54148,5961, 316, 1325, 317, 54150,54151,8395, - 317, 9774, 54153,54154,54155,317, 54156,404, 2261, 565, 343, 54158,350, 596, 54160,54161,2351, 5836, 34510,54159,317, 6859, 317, 1331, 317, 317, 490, + 439, 490, 317, 317, 343, 2086, 1345, 54141,370, 363, 54142,54143,590, 574, 53140,10801,343, 54146,54147,54148,5961, 316, 1325, 317, 54150,54151,8395, + 317, 9774, 54153,54154,54155,317, 54156,404, 2261, 565, 343, 54158,350, 596, 54160,54161,2351, 5836, 34510,54159,317, 6859, 317, 1331, 317, 317, 490, 332, 317, 2211, 605, 545, 54163,406, 574, 54164,54165,54167,317, 317, 317, 2156, 381, 345, 317, 22412,54166,345, 54168,20083,54169,54171,54173,54175, - 54177,54182,54174,54176,380, 317, 332, 317, 54178,317, 362, 380, 1992, 54179,317, 7733, 317, 5055, 9779, 54180,11782,5037, 54181,590, 574, 317, 1358, + 54177,54182,54174,54176,380, 317, 332, 317, 54178,317, 362, 380, 1992, 54179,317, 7733, 317, 5055, 9779, 54180,11782,5037, 54181,590, 574, 317, 1358, 54183,47792,54185,11089,317, 363, 317, 54187,54191,54193,6563, 54194,54195,5653, 363, 317, 8205, 317, 363, 54188,1347, 397, 54189,370, 317, 54190,54192, 317, 13221,317, 490, 5406, 351, 36185,22742,12869,1358, 28239,384, 54197,479, 5033, 54199,54200,54202,395, 54211,539, 7072, 54214,54216,54218,54220,18460, 363, 3075, 54222,54227,54234,54243,317, 5732, 13638,9387, 5898, 370, 54201,4949, 317, 54203,54206,11146,54208,1597, 54204,332, 8766, 54205,5033, 18978,54207, - 5570, 2381, 12949,54209,7672, 332, 401, 54210,54212,54213,362, 1109, 317, 1160, 317, 9981, 4965, 2222, 54215,54217,351, 5662, 5836, 15919,54219,490, 490, - 317, 317, 10626,9691, 54221,54223,54224,54225,54226,1011, 54228,54230,54231,54232,2022, 362, 12696,54233,54229,5898, 4949, 317, 5120, 317, 317, 363, 332, + 5570, 2381, 12949,54209,7672, 332, 401, 54210,54212,54213,362, 1109, 317, 1160, 317, 9981, 4965, 2222, 54215,54217,351, 5662, 5836, 15919,54219,490, 490, + 317, 317, 10626,9691, 54221,54223,54224,54225,54226,1011, 54228,54230,54231,54232,2022, 362, 12696,54233,54229,5898, 4949, 317, 5120, 317, 317, 363, 332, 382, 54235,54238,15221,370, 54240,20259,54241,4984, 317, 54236,317, 54237,54239,24281,2298, 370, 54242,54245,54249,54253,54255,54272,8392, 54279,27584,54296, 54301,54302,54303,490, 54246,2291, 490, 54248,332, 44362,54247,54250,54251,54252,365, 1347, 317, 54254,317, 1347, 54256,54258,54261,490, 317, 54257,54259, - 54260,54262,6996, 317, 23337,54263,54267,466, 54269,54270,3987, 54264,54265,54266,54268,356, 393, 439, 476, 2261, 317, 7698, 54271,37391,1060, 363, 1347, + 54260,54262,6996, 317, 23337,54263,54267,466, 54269,54270,3987, 54264,54265,54266,54268,356, 393, 439, 476, 2261, 317, 7698, 54271,37391,1060, 363, 1347, 54273,54274,54276,380, 490, 317, 397, 54275,54277,1347, 54278,5447, 21470,351, 317, 54280,54282,332, 490, 362, 53522,54283,363, 13760,54281,54284,54285, 356, 54290,54291,362, 54293,355, 54295,7405, 9831, 24393,54286,54287,54288,54289,1347, 9385, 22241,2060, 382, 54292,1526, 54294,5120, 54297,14109,54299,54300, - 554, 317, 317, 54298,2515, 317, 15608,466, 54304,351, 317, 342, 10430,54306,54312,54319,54322,54329,3852, 317, 42882,54307,54308,317, 5126, 54309,2521, - 54311,14483,9648, 317, 54310,6454, 466, 363, 5149, 343, 1347, 350, 351, 596, 2022, 54313,54314,54318,11959,356, 2024, 36489,8301, 317, 363, 54315,317, - 54316,14536,4591, 54317,2503, 1325, 15763,54320,54321,317, 22611,6831, 9124, 379, 466, 317, 54237,13338,54323,343, 2022, 54324,54327,317, 6228, 317, 317, + 554, 317, 317, 54298,2515, 317, 15608,466, 54304,351, 317, 342, 10430,54306,54312,54319,54322,54329,3852, 317, 42882,54307,54308,317, 5126, 54309,2521, + 54311,14483,9648, 317, 54310,6454, 466, 363, 5149, 343, 1347, 350, 351, 596, 2022, 54313,54314,54318,11959,356, 2024, 36489,8301, 317, 363, 54315,317, + 54316,14536,4591, 54317,2503, 1325, 15763,54320,54321,317, 22611,6831, 9124, 379, 466, 317, 54237,13338,54323,343, 2022, 54324,54327,317, 6228, 317, 317, 362, 355, 317, 317, 6531, 5037, 317, 54325,54326,590, 317, 574, 54328,54330,350, 54332,1230, 356, 379, 466, 54331,317, 3387, 317, 14689,7615, 54334, 54335,54336,1020, 596, 410, 317, 5399, 363, 1347, 317, 54337,54339,1992, 2227, 345, 317, 3664, 54338,362, 12459,7035, 6517, 6516, 36966,7737, 23995,54341, 6402, 466, 596, 317, 54343,54344,317, 380, 317, 54342,6036, 345, 317, 54345,370, 554, 54347,2022, 2571, 363, 490, 1155, 317, 317, 54349,54350,54351, - 317, 343, 317, 12019,317, 317, 363, 6546, 5561, 317, 5561, 54353,54359,54362,28058,54364,2022, 2116, 317, 54365,317, 54354,54357,54355,54356,362, 965, + 317, 343, 317, 12019,317, 317, 363, 6546, 5561, 317, 5561, 54353,54359,54362,28058,54364,2022, 2116, 317, 54365,317, 54354,54357,54355,54356,362, 965, 8105, 54358,54360,54361,317, 54363,490, 317, 371, 5891, 371, 4965, 2381, 2809, 21524,351, 2272, 5276, 54367,19478,54369,14744,19478,8047, 1060, 317, 54371, 54368,1347, 54370,54372,54373,317, 54375,54376,54382,388, 31380,54383,54384,14792,54387,2899, 54388,54390,54391,54394,54396,345, 54397,362, 48341,971, 28119, - 317, 371, 317, 39230,362, 8054, 54377,54378,54381,11124,343, 54379,54380,5628, 536, 54385,433, 317, 54386,10329,39969,54389,553, 6975, 54392,36546,1481, + 317, 371, 317, 39230,362, 8054, 54377,54378,54381,11124,343, 54379,54380,5628, 536, 54385,433, 317, 54386,10329,39969,54389,553, 6975, 54392,36546,1481, 54393,971, 16310,371, 11347,5836, 54395,367, 371, 317, 317, 1020, 2553, 2584, 317, 54399,54400,54403,351, 54404,54405,54406,54419,1060, 54420,54423,54424, 54401,54402,27690,317, 4437, 365, 339, 5207, 54407,54417,54408,54413,54409,54410,54411,54412,54414,54415,54416,54418,54421,54422,317, 54425,54427,54428,54429, 54431,54435,351, 54436,54437,54438,54439,54442,605, 490, 54430,316, 54432,54433,54434,2328, 362, 54440,54441,54443,54446,54451,54453,54470,54489,54506,54513, 54525,54543,54549,54555,54560,54666,54673,54712,54713,54715,54776,54851,54885,54886,54891,54892,54894,1107, 54444,54445,54447,46188,382, 1109, 54448,54449,40919, - 367, 54450,54452,54454,21091,54458,54463,54469,13498,345, 14561,54455,317, 54456,18084,54457,54459,351, 350, 54461,54462,54460,317, 1588, 400, 11451,317, - 54464,466, 54467,51160,54465,54466,7949, 317, 8301, 51449,8603, 38707,54468,605, 5104, 345, 54471,54474,2631, 54475,54479,54480,54481,54483,343, 362, 2058, - 54484,54485,48346,54472,54473,351, 565, 2272, 382, 54476,356, 351, 450, 5492, 382, 1160, 54477,54478,54482,317, 384, 345, 4974, 54486,7438, 54487,2156, + 367, 54450,54452,54454,21091,54458,54463,54469,13498,345, 14561,54455,317, 54456,18084,54457,54459,351, 350, 54461,54462,54460,317, 1588, 400, 11451,317, + 54464,466, 54467,51160,54465,54466,7949, 317, 8301, 51449,8603, 38707,54468,605, 5104, 345, 54471,54474,2631, 54475,54479,54480,54481,54483,343, 362, 2058, + 54484,54485,48346,54472,54473,351, 565, 2272, 382, 54476,356, 351, 450, 5492, 382, 1160, 54477,54478,54482,317, 384, 345, 4974, 54486,7438, 54487,2156, 54488,466, 553, 990, 54490,54492,54497,54502,54504,54505,54491,47792,6830, 362, 54493,54494,350, 54495,54496,54498,2134, 54500,54499,54501,54503,343, 10081, 1943, 317, 54507,365, 54508,16456,54509,54511,54512,1160, 317, 54510,5942, 362, 317, 5866, 54514,2024, 54515,54520,2280, 54524,18978,2387, 1345, 317, 38914, 54516,54517,54518,1345, 317, 54519,54521,54522,317, 54523,54526,54535,317, 317, 9064, 54541,54527,54528,54532,54529,54530,356, 54531,4963, 317, 54533,54534, - 12553,7618, 54536,54538,9012, 54537,9012, 5896, 11709,54539,54540,54542,317, 9929, 38936,54544,343, 54545,11089,54546,54547,54548,54550,54553,54554,54551,6402, - 6961, 54552,367, 1078, 19460,490, 44083,501, 54556,54557,427, 9869, 365, 380, 4186, 390, 54558,11734,5173, 565, 54559,54561,10641,54564,54566,54571,2024, + 12553,7618, 54536,54538,9012, 54537,9012, 5896, 11709,54539,54540,54542,317, 9929, 38936,54544,343, 54545,11089,54546,54547,54548,54550,54553,54554,54551,6402, + 6961, 54552,367, 1078, 19460,490, 44083,501, 54556,54557,427, 9869, 365, 380, 4186, 390, 54558,11734,5173, 565, 54559,54561,10641,54564,54566,54571,2024, 54572,54574,54577,54578,54580,54594,384, 526, 54595,54598,54662,7737, 350, 317, 54562,54563,316, 370, 317, 29165,51569,54565,1444, 54567,54569,54570,54568, 19303,362, 332, 317, 317, 317, 54573,434, 605, 428, 54575,54576,479, 427, 15616,53848,393, 317, 390, 317, 2326, 54579,2022, 5055, 15616,317, 54581, 54584,54588,350, 54593,21074,38415,54582,54583,317, 317, 54585,6854, 8488, 54586,5626, 2171, 316, 54587,317, 54589,362, 1020, 54590,23411,4980, 316, 54591, 54592,38945,317, 7990, 317, 317, 2037, 317, 2326, 316, 1020, 54596,54597,6600, 2074, 1020, 2022, 2037, 317, 363, 54599,54660,54600,54602,54613,54615,54617, 317, 54622,54627,54628,54634,54651,54652,54654,54658,54601,412, 30712,54603,54605,317, 54608,54604,54606,54607,1526, 2247, 54609,54610,54611,54612,54614,54616, - 54618,54620,54619,417, 54621,54623,13689,54624,431, 17916,54625,54626,31964,54601,9171, 54629,54633,54630,54631,54632,54635,54636,54642,54643,54649,397, 1347, + 54618,54620,54619,417, 54621,54623,13689,54624,431, 17916,54625,54626,31964,54601,9171, 54629,54633,54630,54631,54632,54635,54636,54642,54643,54649,397, 1347, 390, 54637,54639,54640,2184, 54638,350, 36482,317, 20664,54641,8020, 5553, 397, 2369, 343, 54644,54645,54646,54647,54648,54650,497, 373, 5217, 2387, 54653, - 54655,54656,1194, 5752, 54657,54659,44592,54661,54663,54664,54665,8023, 2022, 8023, 8022, 317, 8023, 373, 45083,54667,355, 2024, 54669,54672,1345, 2462, 5120, + 54655,54656,1194, 5752, 54657,54659,44592,54661,54663,54664,54665,8023, 2022, 8023, 8022, 317, 8023, 373, 45083,54667,355, 2024, 54669,54672,1345, 2462, 5120, 5717, 54668,317, 317, 54670,54671,1160, 15330,317, 345, 12463,351, 8047, 317, 54674,54675,54677,54687,2024, 54688,543, 54689,54694,44722,54695,8243, 54697, 54698,54705,1108, 6412, 54710,332, 5120, 317, 1345, 54676,17219,317, 394, 317, 12525,12696,12237,12598,6596, 350, 317, 11307,317, 54678,54679,54681,54682, - 40798,54684,317, 345, 15457,317, 7849, 54680,317, 7941, 380, 317, 54683,54685,54686,590, 2193, 490, 15705,317, 317, 317, 351, 19287,343, 317, 5241, + 40798,54684,317, 345, 15457,317, 7849, 54680,317, 7941, 380, 317, 54683,54685,54686,590, 2193, 490, 15705,317, 317, 317, 351, 19287,343, 317, 5241, 54690,351, 2219, 363, 317, 1358, 5167, 6555, 317, 317, 54691,54692,5234, 54693,5896, 6021, 317, 4965, 54696,8137, 317, 317, 37582,15705,2110, 390, 54699, - 54700,4738, 54701,54702,317, 11533,317, 317, 317, 8047, 54703,54704,5896, 5662, 317, 54706,343, 54707,338, 317, 23861,317, 54708,54709,54711,380, 9567, - 317, 357, 9575, 370, 54714,54716,54728,54735,54740,54741,54746,54747,54748,2022, 54749,54750,54752,54753,54756,54767,54770,54772,1020, 54773,19507,317, 317, - 54717,54719,29531,54723,1481, 332, 54724,54725,54726,5836, 54727,54718,54720,54722,317, 381, 54721,3284, 365, 332, 11855,1588, 54729,54731,332, 54730,317, - 317, 54732,54733,54734,6674, 54736,384, 54739,317, 317, 54737,317, 54738,466, 4591, 317, 47897,490, 6600, 317, 317, 363, 54742,54743,54744,54745,5481, - 5483, 5105, 6937, 1358, 19548,380, 2510, 54751,384, 38244,382, 317, 54754,317, 370, 12454,54755,637, 1160, 332, 317, 54757,54758,54759,23306,54762,317, + 54700,4738, 54701,54702,317, 11533,317, 317, 317, 8047, 54703,54704,5896, 5662, 317, 54706,343, 54707,338, 317, 23861,317, 54708,54709,54711,380, 9567, + 317, 357, 9575, 370, 54714,54716,54728,54735,54740,54741,54746,54747,54748,2022, 54749,54750,54752,54753,54756,54767,54770,54772,1020, 54773,19507,317, 317, + 54717,54719,29531,54723,1481, 332, 54724,54725,54726,5836, 54727,54718,54720,54722,317, 381, 54721,3284, 365, 332, 11855,1588, 54729,54731,332, 54730,317, + 317, 54732,54733,54734,6674, 54736,384, 54739,317, 317, 54737,317, 54738,466, 4591, 317, 47897,490, 6600, 317, 317, 363, 54742,54743,54744,54745,5481, + 5483, 5105, 6937, 1358, 19548,380, 2510, 54751,384, 38244,382, 317, 54754,317, 370, 12454,54755,637, 1160, 332, 317, 54757,54758,54759,23306,54762,317, 317, 363, 11473,54760,54761,317, 390, 332, 54763,54764,54765,54766,390, 54768,5611, 54769,54771,5163, 317, 363, 317, 390, 4943, 490, 54774,54775,54777, 54779,54797,54799,54800,54804,54820,54826,54828,54829,54831,54832,54839,54848,3987, 54850,317, 50585,574, 317, 54778,54780,5028, 54783,54785,54787,54788,54790, - 54781,54782,317, 20424,8682, 317, 5033, 2272, 317, 54784,2117, 45877,1060, 10487,54786,558, 9422, 381, 54789,54791,54792,54793,345, 54794,54795,54796,317, + 54781,54782,317, 20424,8682, 317, 5033, 2272, 317, 54784,2117, 45877,1060, 10487,54786,558, 9422, 381, 54789,54791,54792,54793,345, 54794,54795,54796,317, 317, 7949, 54798,34552,317, 2715, 54166,6857, 37782,2609, 54801,54802,363, 490, 54803,4336, 317, 317, 11619,389, 380, 54805,36969,54816,54818,17462,54819, 965, 7657, 54806,54807,317, 317, 54808,3599, 317, 54810,317, 2899, 362, 54811,54815,317, 637, 317, 651, 54809,317, 1347, 397, 370, 317, 54812,54813, 54814,8683, 390, 54817,30885,46507,4984, 54821,54823,54825,24393,2507, 345, 404, 418, 448, 54822,2509, 370, 317, 317, 317, 54824,558, 490, 396, 54827, @@ -10221,71 +10216,71 @@ static const unsigned int ChildLocs[185261] = 317, 342, 54841,6318, 54842,1459, 54845,54843,317, 317, 317, 317, 317, 317, 54844,317, 317, 317, 5223, 317, 363, 1481, 317, 1020, 54849,351, 11347, 54852,54860,54861,54862,54869,54871,350, 54872,54873,54879,54882,490, 317, 54853,54854,30432,33398,21541,54857,54855,54856,5652, 339, 54858,54859,317, 54066, 317, 54863,54865,54867,350, 54868,490, 54864,54866,54201,54067,6433, 54870,2188, 17897,4591, 317, 1065, 370, 54874,317, 54875,54876,350, 54877,54878,54880, - 54881,14537,5661, 363, 317, 2187, 40919,54883,54884,7681, 370, 54887,54888,54889,54890,11442,317, 596, 54893,27765,3648, 54895,741, 54900,466, 54831,1481, - 54901,1108, 54896,317, 54897,54898,54899,354, 6614, 1444, 8765, 370, 5033, 343, 317, 17375,1347, 54903,54904,54906,54910,54912,317, 317, 54907,748, 317, + 54881,14537,5661, 363, 317, 2187, 40919,54883,54884,7681, 370, 54887,54888,54889,54890,11442,317, 596, 54893,27765,3648, 54895,741, 54900,466, 54831,1481, + 54901,1108, 54896,317, 54897,54898,54899,354, 6614, 1444, 8765, 370, 5033, 343, 317, 17375,1347, 54903,54904,54906,54910,54912,317, 317, 54907,748, 317, 54908,54909,54911,54914,54917,54915,54916,54918,54919,54921,54922,7869, 54923,54927,54930,54941,54942,54947,54948,54949,54953,54956,54961,54969,54974,54980,54991, - 54997,55003,55013,55030,466, 55034,55036,15680,3605, 15680,3605, 3640, 380, 54924,381, 54925,381, 2134, 565, 317, 54926,54928,2107, 4476, 54929,47956,2033, + 54997,55003,55013,55030,466, 55034,55036,15680,3605, 15680,3605, 3640, 380, 54924,381, 54925,381, 2134, 565, 317, 54926,54928,2107, 4476, 54929,47956,2033, 2074, 381, 1915, 54931,54934,11702,29783,54932,54933,54935,371, 8683, 54939,28400,54936,54937,54938,54940,4396, 565, 384, 10878,6081, 54943,5005, 363, 54945, 17760,363, 54944,54946,6673, 363, 9000, 13320,380, 27498,439, 54950,54951,54952,1358, 343, 2022, 393, 381, 54954,54955,54957,54958,54959,54960,54962,54963, 54964,54966,345, 16319,345, 397, 54965,54967,2086, 54968,54970,54971,54972,343, 54973,370, 343, 2171, 317, 356, 381, 13789,3361, 54975,54979,400, 54976, - 54977,54978,35480,419, 54981,54983,2236, 54989,2715, 1915, 2051, 54982,381, 351, 54984,54988,54985,54986,54987,26288,348, 54990,54992,37200,382, 54995,1020, - 54996,54993,595, 54994,5164, 490, 54998,479, 55002,54999,55000,317, 55001,443, 2420, 55004,371, 433, 55005,55006,55007,55008,490, 363, 390, 55011,427, + 54977,54978,35480,419, 54981,54983,2236, 54989,2715, 1915, 2051, 54982,381, 351, 54984,54988,54985,54986,54987,26288,348, 54990,54992,37200,382, 54995,1020, + 54996,54993,595, 54994,5164, 490, 54998,479, 55002,54999,55000,317, 55001,443, 2420, 55004,371, 433, 55005,55006,55007,55008,490, 363, 390, 55011,427, 52723,5962, 317, 7489, 363, 7521, 55009,55010,8549, 55012,343, 371, 55014,2036, 55015,55016,1588, 55020,380, 55023,1481, 2539, 396, 345, 2219, 343, 55017, 55018,55019,317, 11198,14799,55021,55022,55024,55027,3529, 55025,317, 55026,3079, 1160, 345, 21955,427, 55028,55029,9549, 965, 317, 380, 5343, 317, 55031, 55033,8125, 404, 479, 2108, 34863,9548, 55032,317, 52622,317, 15540,343, 370, 533, 55035,55037,55038,55039,55040,55042,55043,55048,55051,55054,55057,55058, 55062,2272, 188, 55470,55483,55499,189, 56080,56099,56115,190, 56475,56490,56492,55100,56493,191, 56976,56978,56980,56983,56991,193, 57139,57140,57148,57151, 57197,55044,412, 40690,55047,317, 38832,5107, 55045,1444, 55046,4797, 4797, 4797, 55049,4797, 4800, 4797, 55050,55052,55053,10985,55055,55056,55059,55060,55061, 55063,55064,55065,55066,55067,55077,55097,55110,55113,55117,55139,55147,55157,55162,55183,55192,55207,55253,55255,55274,55280,55323,55356,55406,55426,55448,55450, - 55452,55458,317, 7452, 317, 317, 317, 317, 317, 1100, 55068,35575,317, 55072,362, 55073,4591, 55074,12719,55076,36414,55069,55071,5624, 43411,55070,1109, + 55452,55458,317, 7452, 317, 317, 317, 317, 317, 1100, 55068,35575,317, 55072,362, 55073,4591, 55074,12719,55076,36414,55069,55071,5624, 43411,55070,1109, 9454, 370, 8281, 55075,317, 9575, 1033, 2590, 7609, 55078,55080,55081,55087,55092,55093,2521, 55094,343, 317, 55079,317, 43879,565, 55082,8367, 55083,55085, - 55084,55086,55088,393, 55089,55090,55091,345, 7577, 55095,317, 55096,317, 55098,2612, 55099,317, 55104,490, 350, 55106,55107,55109,3094, 317, 317, 490, + 55084,55086,55088,393, 55089,55090,55091,345, 7577, 55095,317, 55096,317, 55098,2612, 55099,317, 55104,490, 350, 55106,55107,55109,3094, 317, 317, 490, 590, 427, 55100,2004, 55101,343, 55102,55103,5626, 317, 404, 1160, 317, 343, 317, 55105,1109, 490, 396, 55108,317, 370, 3284, 1453, 427, 317, 55111, - 350, 55112,343, 17939,343, 15552,1915, 55114,55115,9672, 17462,380, 55116,350, 4738, 55118,55125,5363, 55130,6917, 55132,1444, 55134,55135,55136,55137,317, + 350, 55112,343, 17939,343, 15552,1915, 55114,55115,9672, 17462,380, 55116,350, 4738, 55118,55125,5363, 55130,6917, 55132,1444, 55134,55135,55136,55137,317, 317, 4952, 2271, 24810,43622,55119,55123,55124,5611, 351, 55120,55121,55122,25707,317, 10836,46544,317, 2844, 55126,55127,2610, 55128,55129,317, 4280, 39260, 25351,2110, 16603,55131,490, 343, 55133,490, 2020, 427, 380, 55138,332, 16672,55140,490, 317, 348, 55142,12668,55143,55144,362, 55145,362, 317, 55141, - 1347, 4952, 14826,4982, 55146,317, 1325, 317, 55148,38220,317, 55149,55150,55151,55152,55153,55154,332, 55155,5991, 466, 4980, 351, 317, 4984, 6402, 317, - 2128, 317, 490, 1358, 5207, 317, 55156,370, 6021, 55158,55160,2110, 55161,565, 317, 362, 6814, 55159,55163,55169,55171,55177,501, 332, 55178,55182,5623, - 2683, 55164,490, 6900, 6834, 317, 2844, 55165,44429,9174, 55167,55168,8926, 39119,55166,2110, 2844, 2272, 317, 3429, 590, 55170,1459, 55172,55174,343, 363, - 55173,55175,55176,317, 1459, 490, 55179,55180,55181,55184,55185,43829,350, 55187,55188,10058,55189,55191,370, 55186,2272, 390, 33966,8333, 44716,345, 2272, - 2003, 55190,343, 317, 317, 16871,317, 55193,55196,332, 565, 55200,19916,55203,317, 10035,8957, 55204,55205,1601, 7866, 55206,317, 55194,55195,574, 390, - 590, 317, 21190,490, 55197,317, 55198,351, 55199,317, 24438,55201,317, 55202,3236, 317, 20015,50854,5216, 317, 7579, 382, 35902,28822,363, 418, 345, - 55208,55209,55210,55213,15074,55214,55216,511, 55217,55218,55221,55237,55239,55251,55252,3726, 317, 1345, 13269,2357, 1358, 6227, 55211,356, 55212,317, 317, + 1347, 4952, 14826,4982, 55146,317, 1325, 317, 55148,38220,317, 55149,55150,55151,55152,55153,55154,332, 55155,5991, 466, 4980, 351, 317, 4984, 6402, 317, + 2128, 317, 490, 1358, 5207, 317, 55156,370, 6021, 55158,55160,2110, 55161,565, 317, 362, 6814, 55159,55163,55169,55171,55177,501, 332, 55178,55182,5623, + 2683, 55164,490, 6900, 6834, 317, 2844, 55165,44429,9174, 55167,55168,8926, 39119,55166,2110, 2844, 2272, 317, 3429, 590, 55170,1459, 55172,55174,343, 363, + 55173,55175,55176,317, 1459, 490, 55179,55180,55181,55184,55185,43829,350, 55187,55188,10058,55189,55191,370, 55186,2272, 390, 33966,8333, 44716,345, 2272, + 2003, 55190,343, 317, 317, 16871,317, 55193,55196,332, 565, 55200,19916,55203,317, 10035,8957, 55204,55205,1601, 7866, 55206,317, 55194,55195,574, 390, + 590, 317, 21190,490, 55197,317, 55198,351, 55199,317, 24438,55201,317, 55202,3236, 317, 20015,50854,5216, 317, 7579, 382, 35902,28822,363, 418, 345, + 55208,55209,55210,55213,15074,55214,55216,511, 55217,55218,55221,55237,55239,55251,55252,3726, 317, 1345, 13269,2357, 1358, 6227, 55211,356, 55212,317, 317, 17583,317, 55215,343, 317, 6529, 317, 317, 2156, 490, 5120, 317, 466, 317, 55219,55220,317, 1347, 21869,9162, 10255,55222,371, 55224,55229,55235,23681, - 55223,5450, 55225,55226,55227,55228,55230,53072,55231,373, 5367, 55232,55233,55234,55236,25938,55238,4561, 3652, 55240,55245,55246,30206,55247,55248,55250,317, - 6388, 55241,55242,55243,55244,55249,5439, 55254,343, 332, 490, 55256,55257,55258,55262,12598,596, 55266,55269,55271,55273,12880,427, 558, 345, 317, 348, - 15510,55259,6402, 55260,55261,55263,635, 55264,55265,490, 55267,55268,7760, 363, 16235,317, 7657, 317, 5991, 55270,317, 317, 317, 55272,55275,55278,365, - 55276,55277,55279,363, 55281,26080,55290,55297,55300,317, 55302,55304,55307,2584, 6638, 9027, 55309,55311,596, 55317,55318,55321,13686,317, 490, 404, 6063, + 55223,5450, 55225,55226,55227,55228,55230,53072,55231,373, 5367, 55232,55233,55234,55236,25938,55238,4561, 3652, 55240,55245,55246,30206,55247,55248,55250,317, + 6388, 55241,55242,55243,55244,55249,5439, 55254,343, 332, 490, 55256,55257,55258,55262,12598,596, 55266,55269,55271,55273,12880,427, 558, 345, 317, 348, + 15510,55259,6402, 55260,55261,55263,635, 55264,55265,490, 55267,55268,7760, 363, 16235,317, 7657, 317, 5991, 55270,317, 317, 317, 55272,55275,55278,365, + 55276,55277,55279,363, 55281,26080,55290,55297,55300,317, 55302,55304,55307,2584, 6638, 9027, 55309,55311,596, 55317,55318,55321,13686,317, 490, 404, 6063, 317, 2171, 6975, 55282,55284,55287,55283,55285,55286,55288,55289,55291,55294,55292,317, 317, 55293,317, 10347,345, 55295,404, 5748, 55296,55298,13262,55299, 7385, 317, 9537, 17454,343, 5890, 12226,55301,317, 317, 317, 55303,55305,7865, 490, 55306,55308,350, 450, 55310,317, 490, 55312,55315,55313,2171, 25177, 55314,317, 55316,4952, 30957,466, 370, 2571, 317, 6555, 317, 55319,55320,11376,1266, 633, 55322,371, 55324,370, 55326,4336, 55331,55334,55336,459, 55338, - 5171, 4984, 55339,55341,55345,55354,29521,1588, 55325,8557, 14768,317, 55327,2369, 553, 25300,55328,55329,317, 55330,317, 1025, 633, 370, 332, 55332,6402, - 1347, 317, 317, 55333,55335,371, 490, 31144,317, 317, 317, 460, 55337,354, 4963, 55340,317, 10939,355, 5130, 55342,55343,55344,4984, 317, 7527, 317, + 5171, 4984, 55339,55341,55345,55354,29521,1588, 55325,8557, 14768,317, 55327,2369, 553, 25300,55328,55329,317, 55330,317, 1025, 633, 370, 332, 55332,6402, + 1347, 317, 317, 55333,55335,371, 490, 31144,317, 317, 317, 460, 55337,354, 4963, 55340,317, 10939,355, 5130, 55342,55343,55344,4984, 317, 7527, 317, 55346,55347,55348,490, 5439, 55349,317, 24398,317, 317, 55350,8301, 362, 55351,7127, 651, 55352,55353,55355,55357,55368,55371,55373,55377,55391,404, 55394, - 55396,55397,10081,55405,490, 55358,1459, 490, 317, 55360,5120, 55363,55365,30267,490, 651, 55359,317, 55361,55362,490, 490, 1109, 317, 2142, 5652, 1160, + 55396,55397,10081,55405,490, 55358,1459, 490, 317, 55360,5120, 55363,55365,30267,490, 651, 55359,317, 55361,55362,490, 490, 1109, 317, 2142, 5652, 1160, 5942, 490, 2537, 55364,1087, 317, 1459, 55366,55367,490, 490, 55369,19401,55370,55372,1109, 490, 16790,15419,55374,317, 357, 8510, 55375,1160, 6996, 24119, - 55376,4980, 371, 5033, 55378,1459, 55389,55379,317, 55380,6089, 317, 2260, 55381,317, 317, 55382,55384,317, 55385,55383,5201, 18587,5225, 356, 317, 7242, + 55376,4980, 371, 5033, 55378,1459, 55389,55379,317, 55380,6089, 317, 2260, 55381,317, 317, 55382,55384,317, 55385,55383,5201, 18587,5225, 356, 317, 7242, 55386,55387,55388,5477, 55390,355, 381, 370, 365, 55392,1459, 55393,345, 55395,365, 7672, 317, 351, 2533, 2571, 317, 55398,883, 55399,55403,18577,55404, 317, 55400,317, 317, 55401,370, 2571, 317, 55402,7888, 24957,55407,1358, 351, 55409,55410,317, 15330,55415,55417,55418,55422,2066, 501, 55408,55411,55412, 6917, 351, 55413,363, 55414,5663, 7911, 55416,47599,55419,355, 55421,317, 55420,4591, 55423,55424,55425,965, 3605, 345, 55427,55434,55436,55441,55442,55447, 6294, 55428,365, 9789, 11279,55429,15017,6463, 55430,5570, 317, 55432,55431,317, 9244, 55433,317, 343, 29974,357, 10283,55435,317, 317, 317, 317, 20509, 9450, 55437,6207, 317, 55440,55438,373, 55439,10196,5447, 21470,7419, 574, 565, 6964, 343, 9265, 348, 351, 55443,55444,55445,365, 55446,24667,362, 51212, - 55449,490, 2134, 317, 35333,490, 565, 55451,345, 55453,55454,2146, 362, 55455,20672,565, 2012, 13914,30882,55456,55457,55459,490, 55465,379, 55466,379, + 55449,490, 2134, 317, 35333,490, 565, 55451,345, 55453,55454,2146, 362, 55455,20672,565, 2012, 13914,30882,55456,55457,55459,490, 55465,379, 55466,379, 55468,1588, 55460,55461,55462,55464,47599,55463,4925, 317, 55467,1109, 1030, 55469,393, 317, 55471,55476,22866,55477,1060, 55478,55480,363, 55472,55473,55474, 55475,55479,45493,55481,17211,28600,55482,20441,33650,55484,365, 55485,490, 22685,367, 51212,345, 2035, 55498,55486,55488,55492,55494,55487,55489,2738, 55490, 55491,55493,55495,55496,55497,55500,55501,55503,2381, 317, 55504,1044, 43909,317, 55502,55505,317, 55506,55507,350, 55508,55509,55519,55539,55558,55582,55598, 55615,55620,55644,55650,55677,55679,55684,55694,55725,55729,55773,55790,55800,55816,55845,55949,55965,56069,56072,56076,55510,55511,55512,55513,55514,55515,55516, - 55517,55518,343, 317, 55520,351, 55521,33398,55523,55528,55532,55536,55537,3505, 2156, 317, 343, 490, 55522,41067,21074,363, 317, 4943, 317, 317, 317, + 55517,55518,343, 317, 55520,351, 55521,33398,55523,55528,55532,55536,55537,3505, 2156, 317, 343, 490, 55522,41067,21074,363, 317, 4943, 317, 317, 317, 55524,317, 55525,55526,55527,55529,55530,55531,370, 2094, 30957,466, 370, 2571, 55533,317, 55534,55535,501, 317, 363, 55538,370, 2571, 317, 7196, 55540, 55541,501, 55546,55547,55548,55549,18978,2254, 350, 55542,55543,55544,55545,1943, 7850, 27851,356, 490, 55550,55556,55551,55552,55553,55554,55555,1358, 55557, - 841, 55559,380, 55560,55565,55566,55569,55570,55580,393, 490, 55561,55562,21495,55563,55564,41584,596, 317, 8099, 345, 351, 5991, 466, 317, 55567,317, - 55568,5709, 2272, 2080, 343, 55571,55572,55575,32397,2163, 55578,55573,55574,633, 55576,55577,55579,55581,1501, 317, 50949,55583,55587,55595,46653,2022, 362, - 2022, 55596,55597,1526, 55584,317, 55585,55586,590, 450, 55588,55589,55594,55590,55591,55592,55593,317, 317, 605, 317, 317, 343, 55599,317, 317, 7401, + 841, 55559,380, 55560,55565,55566,55569,55570,55580,393, 490, 55561,55562,21495,55563,55564,41584,596, 317, 8099, 345, 351, 5991, 466, 317, 55567,317, + 55568,5709, 2272, 2080, 343, 55571,55572,55575,32397,2163, 55578,55573,55574,633, 55576,55577,55579,55581,1501, 317, 50949,55583,55587,55595,46653,2022, 362, + 2022, 55596,55597,1526, 55584,317, 55585,55586,590, 450, 55588,55589,55594,55590,55591,55592,55593,317, 317, 605, 317, 317, 343, 55599,317, 317, 7401, 55610,55611,55612,350, 55613,55614,55600,55602,55603,55604,554, 55606,55607,40690,490, 55609,317, 55601,32606,317, 55605,412, 38128,317, 55608,362, 32249, 317, 8578, 12423,316, 2060, 637, 1030, 317, 370, 370, 363, 317, 9083, 351, 1791, 466, 4965, 2553, 363, 55616,55617,317, 11388,2219, 55618,390, 55619, 55621,55625,55629,370, 27061,55630,55636,55638,345, 490, 55622,5447, 55623,382, 363, 55624,55626,55627,55628,55631,55633,55632,317, 317, 55634,317, 55635, - 410, 3375, 55637,55639,55640,55642,55643,317, 55641,317, 317, 2146, 7143, 345, 5120, 5027, 317, 55645,55646,55648,25646,6917, 55649,55647,317, 1998, 343, - 55651,55655,55656,55665,39260,55666,18460,2222, 350, 490, 55668,55673,596, 350, 317, 55652,15213,55654,7428, 1453, 13679,55653,390, 2222, 21274,350, 551, - 55657,55659,55658,317, 317, 55660,55661,55662,55663,16384,466, 370, 317, 55664,16384,466, 317, 1999, 3529, 363, 317, 466, 1345, 55667,363, 317, 4591, + 410, 3375, 55637,55639,55640,55642,55643,317, 55641,317, 317, 2146, 7143, 345, 5120, 5027, 317, 55645,55646,55648,25646,6917, 55649,55647,317, 1998, 343, + 55651,55655,55656,55665,39260,55666,18460,2222, 350, 490, 55668,55673,596, 350, 317, 55652,15213,55654,7428, 1453, 13679,55653,390, 2222, 21274,350, 551, + 55657,55659,55658,317, 317, 55660,55661,55662,55663,16384,466, 370, 317, 55664,16384,466, 317, 1999, 3529, 363, 317, 466, 1345, 55667,363, 317, 4591, 350, 55669,55671,55670,2586, 2586, 55672,317, 55674,38685,55675,55676,55678,317, 362, 55680,5087, 6817, 55682,55681,48900,55683,55685,55686,343, 55687,55691, 43399,55692,404, 9702, 317, 490, 393, 317, 55688,55689,55690,5742, 1160, 317, 13960,317, 317, 406, 345, 317, 363, 363, 55693,55695,2515, 55698,55703, 55704,55705,48900,55708,55709,55723,55696,356, 55697,317, 7906, 55699,55700,55701,55702,2187, 16187,2163, 44265,2261, 1033, 55706,55707,55710,55711,55712,55713, @@ -10293,22 +10288,22 @@ static const unsigned int ChildLocs[185261] = 43697,55770,55731,55737,55732,55733,55734,55735,55736,55738,55740,55744,55739,55741,55742,55743,55746,1020, 36631,55749,55751,55750,8066, 55753,2163, 5784, 55755, 1915, 33890,55756,55761,55757,55758,55759,490, 1347, 401, 55760,2272, 55762,55763,55764,55765,55766,55768,18526,55769,55771,317, 55772,55774,55775,55776,55778, 55782,55785,363, 55777,6697, 55779,55780,2948, 596, 5828, 55781,10253,18142,55783,4218, 317, 8783, 55784,21444,317, 55786,55788,55787,317, 55789,6420, 29140, - 55791,55792,317, 9170, 55793,317, 433, 55794,8178, 55795,55796,4984, 2537, 501, 55797,2004, 55798,317, 2004, 8526, 5711, 345, 317, 317, 7779, 317, 1347, + 55791,55792,317, 9170, 55793,317, 433, 55794,8178, 55795,55796,4984, 2537, 501, 55797,2004, 55798,317, 2004, 8526, 5711, 345, 317, 317, 7779, 317, 1347, 345, 55799,490, 18166,317, 55801,55802,55803,363, 343, 55804,2553, 317, 55805,55809,10081,545, 14535,317, 533, 24225,439, 351, 2272, 2364, 317, 55806, 343, 26001,2553, 350, 2146, 55807,317, 317, 4925, 55808,317, 55810,55811,55813,55814,317, 317, 317, 317, 53257,332, 55812,14337,10877,317, 55815,55817, 55819,426, 55820,12429,55821,55827,45345,15983,362, 55828,55830,5872, 23690,55832,55833,10515,55838,55844,365, 55818,428, 7449, 356, 55822,19617,55823,27732, - 55824,404, 26518,317, 55825,55826,13689,55829,55831,10520,1597, 55834,55835,55836,317, 12478,55837,13177,317, 404, 28529,55839,55840,55841,317, 317, 356, + 55824,404, 26518,317, 55825,55826,13689,55829,55831,10520,1597, 55834,55835,55836,317, 12478,55837,13177,317, 404, 28529,55839,55840,55841,317, 317, 356, 55842,317, 55843,12731,2022, 12478,55846,55852,55854,55855,55862,55863,55865,2546, 28720,501, 55868,55873,45858,55874,55933,55938,55946,55947,3361, 55847,49547, - 382, 55849,10560,317, 419, 55848,351, 317, 501, 55850,55851,55853,384, 608, 55856,317, 317, 7618, 16017,55857,55859,55858,55860,7192, 55861,48240,5037, - 55864,363, 13670,381, 55866,3529, 381, 55867,55869,55871,15221,12593,350, 4984, 55870,350, 55872,350, 351, 349, 13288,351, 7625, 55875,55877,55876,390, + 382, 55849,10560,317, 419, 55848,351, 317, 501, 55850,55851,55853,384, 608, 55856,317, 317, 7618, 16017,55857,55859,55858,55860,7192, 55861,48240,5037, + 55864,363, 13670,381, 55866,3529, 381, 55867,55869,55871,15221,12593,350, 4984, 55870,350, 55872,350, 351, 349, 13288,351, 7625, 55875,55877,55876,390, 55878,55880,55881,55889,55893,351, 55896,55898,55902,9853, 55903,55915,55923,55879,28917,35368,55882,55883,55885,55884,55886,55887,55888,55890,55891,55892,55894, 55895,55897,55899,55900,55901,317, 9549, 4268, 363, 18154,39541,55904,55905,55908,55910,55906,55907,55909,55911,55912,55913,55914,20660,55916,345, 345, 55920, - 55917,55918,55919,2156, 8081, 55921,55922,47159,521, 28361,55924,55927,55925,55926,13323,1347, 55928,8065, 55929,55930,55931,55932,17358,5450, 55934,4965, 3646, + 55917,55918,55919,2156, 8081, 55921,55922,47159,521, 28361,55924,55927,55925,55926,13323,1347, 55928,8065, 55929,55930,55931,55932,17358,5450, 55934,4965, 3646, 317, 55936,55935,3007, 55937,41371,490, 17917,55939,55940,55943,55944,55941,55942,317, 5492, 370, 10674,1347, 55945,5431, 8882, 382, 55948,55950,55952,55962, 4952, 2317, 8506, 39465,5611, 390, 490, 55951,5392, 6555, 1347, 345, 55953,317, 345, 1548, 317, 55954,2058, 509, 55956,4952, 55959,4980, 55960,31026,55955, 55957,55958,363, 7389, 11648,55961,55963,55964,4980, 381, 345, 949, 55966,55967,55976,55981,55984,55985,55990,55992,55995,55998,39260,56001,56006,56012,56013, - 56016,56028,370, 56030,56055,7651, 5037, 26518,56062,56066,343, 380, 356, 7785, 55968,55969,55971,6089, 55972,55973,55974,317, 380, 55970,2222, 317, 370, - 317, 317, 356, 5055, 439, 6674, 7368, 6674, 55975,4925, 317, 24007,55977,55979,317, 55978,55980,1358, 12461,370, 55982,55983,5105, 24051,1109, 5223, 317, + 56016,56028,370, 56030,56055,7651, 5037, 26518,56062,56066,343, 380, 356, 7785, 55968,55969,55971,6089, 55972,55973,55974,317, 380, 55970,2222, 317, 370, + 317, 317, 356, 5055, 439, 6674, 7368, 6674, 55975,4925, 317, 24007,55977,55979,317, 55978,55980,1358, 12461,370, 55982,55983,5105, 24051,1109, 5223, 317, 55986,55987,55988,55989,55991,2369, 370, 55993,55994,380, 317, 5255, 501, 343, 371, 343, 393, 380, 55996,381, 55997,55999,367, 56000,36321,370, 56002, 56003,56004,55022,317, 317, 56005,56007,56009,56010,350, 7925, 56008,381, 5241, 6071, 350, 56011,363, 5332, 12060,554, 427, 343, 56014,350, 56015,56017, 56020,56022,56018,56019,317, 317, 317, 317, 12109,2369, 56021,56023,56024,56025,56026,56027,56029,370, 412, 56031,56032,2119, 56033,1230, 56036,37596,56037, @@ -10316,87 +10311,87 @@ static const unsigned int ChildLocs[185261] = 566, 4564, 56053,37391,426, 373, 971, 1588, 29522,56056,317, 4045, 56057,56058,56059,56060,56061,3125, 565, 56063,56064,56065,56067,56068,2227, 56070,56071, 4591, 12025,380, 501, 7880, 7386, 351, 5159, 56073,56074,56075,12696,2405, 56077,2108, 56078,317, 56079,56081,317, 56082,56086,56089,27623,56091,490, 56094, 56095,56098,56083,56084,56085,56087,56088,34849,31822,56090,31310,56092,56093,19065,56096,56097,612, 608, 19111,607, 4090, 1430, 56100,56101,56105,56107,56109, - 363, 56111,56112,5084, 5205, 56102,317, 317, 317, 56104,7384, 317, 2357, 56103,56106,317, 56108,317, 56110,56113,365, 365, 56114,490, 317, 5325, 363, - 363, 16917,317, 56116,56120,56127,56135,27623,56154,490, 317, 1943, 381, 317, 317, 56117,2357, 56118,56119,56121,56122,56123,56124,56125,56126,56128,317, + 363, 56111,56112,5084, 5205, 56102,317, 317, 317, 56104,7384, 317, 2357, 56103,56106,317, 56108,317, 56110,56113,365, 365, 56114,490, 317, 5325, 363, + 363, 16917,317, 56116,56120,56127,56135,27623,56154,490, 317, 1943, 381, 317, 317, 56117,2357, 56118,56119,56121,56122,56123,56124,56125,56126,56128,317, 317, 56129,56130,56131,56132,56133,56134,56136,56143,33155,56145,56149,56137,56138,56139,56140,56141,56142,56144,34662,56146,56147,56148,56150,56151,56152,56153, - 56155,56170,56177,56243,56246,56296,56300,56335,56341,56342,56344,56364,56369,56379,56397,56399,56403,56404,56413,56436,56461,56462,490, 56465,56466,56467,1020, - 56156,380, 56168,56169,317, 317, 317, 5120, 56157,490, 56158,56159,56160,56161,56162,56163,56164,56165,56166,56167,6402, 56171,56173,2683, 56175,317, 317, - 56172,317, 8488, 466, 56174,381, 384, 56176,384, 384, 56178,56182,56183,56194,10072,56201,56222,338, 56223,317, 56242,490, 2146, 56179,12752,56180,370, + 56155,56170,56177,56243,56246,56296,56300,56335,56341,56342,56344,56364,56369,56379,56397,56399,56403,56404,56413,56436,56461,56462,490, 56465,56466,56467,1020, + 56156,380, 56168,56169,317, 317, 317, 5120, 56157,490, 56158,56159,56160,56161,56162,56163,56164,56165,56166,56167,6402, 56171,56173,2683, 56175,317, 317, + 56172,317, 8488, 466, 56174,381, 384, 56176,384, 384, 56178,56182,56183,56194,10072,56201,56222,338, 56223,317, 56242,490, 2146, 56179,12752,56180,370, 56181,6458, 427, 317, 476, 56184,1230, 56185,56186,343, 2272, 56187,56188,56189,56190,56192,317, 370, 2117, 3366, 370, 345, 56191,370, 56193,4738, 16517, - 56195,3023, 2086, 56197,2222, 56196,317, 345, 56198,317, 56199,1347, 6578, 5300, 56200,637, 56202,1347, 56210,56214,56215,20956,56218,56220,56221,1160, 317, - 56203,56204,56205,56206,56207,56208,56209,317, 56211,56213,38461,404, 317, 1194, 317, 56212,28479,56216,56217,13137,56216,47526,17019,5126, 56219,345, 1345, - 2108, 345, 4980, 5205, 363, 350, 565, 56224,56225,56234,32397,56237,56238,2087, 56226,56229,7141, 56232,56233,4980, 317, 345, 1347, 56227,56228,1347, 8266, - 596, 437, 1160, 56230,1267, 317, 633, 2381, 317, 56231,365, 20055,56235,56236,332, 490, 363, 363, 2110, 56239,2035, 56240,56241,317, 339, 56244,365, + 56195,3023, 2086, 56197,2222, 56196,317, 345, 56198,317, 56199,1347, 6578, 5300, 56200,637, 56202,1347, 56210,56214,56215,20956,56218,56220,56221,1160, 317, + 56203,56204,56205,56206,56207,56208,56209,317, 56211,56213,38461,404, 317, 1194, 317, 56212,28479,56216,56217,13137,56216,47526,17019,5126, 56219,345, 1345, + 2108, 345, 4980, 5205, 363, 350, 565, 56224,56225,56234,32397,56237,56238,2087, 56226,56229,7141, 56232,56233,4980, 317, 345, 1347, 56227,56228,1347, 8266, + 596, 437, 1160, 56230,1267, 317, 633, 2381, 317, 56231,365, 20055,56235,56236,332, 490, 363, 363, 2110, 56239,2035, 56240,56241,317, 339, 56244,365, 56245,317, 2279, 317, 2577, 56247,2156, 56249,56267,56268,56269,56275,56277,56279,56282,56287,56288,56289,56295,741, 56248,490, 5401, 380, 317, 55543,56250, - 56253,56261,56262,56251,56252,317, 339, 3284, 2102, 345, 56254,5897, 351, 56255,8948, 56257,56258,56256,11196,11196,56259,56260,18848,56263,56264,56265,3284, + 56253,56261,56262,56251,56252,317, 339, 3284, 2102, 345, 56254,5897, 351, 56255,8948, 56257,56258,56256,11196,11196,56259,56260,18848,56263,56264,56265,3284, 56266,4591, 3529, 345, 439, 317, 5300, 56270,10316,56272,56273,2134, 56271,350, 490, 317, 350, 56274,501, 23696,2334, 317, 56276,605, 4591, 2163, 56278, - 45441,5662, 56280,49032,490, 362, 56281,317, 16017,29906,317, 56283,56284,351, 56285,56286,3075, 1358, 1347, 1347, 343, 56290,56291,56294,56292,56293,317, - 25114,56297,317, 56299,370, 56298,382, 2086, 6623, 343, 56301,56304,56307,25086,363, 56333,1160, 56302,56303,5616, 363, 56305,56306,9938, 8446, 56308,362, + 45441,5662, 56280,49032,490, 362, 56281,317, 16017,29906,317, 56283,56284,351, 56285,56286,3075, 1358, 1347, 1347, 343, 56290,56291,56294,56292,56293,317, + 25114,56297,317, 56299,370, 56298,382, 2086, 6623, 343, 56301,56304,56307,25086,363, 56333,1160, 56302,56303,5616, 363, 56305,56306,9938, 8446, 56308,362, 56309,56310,317, 1999, 351, 317, 56311,56315,15260,5840, 56317,56319,13914,56321,56324,6765, 56327,4789, 56330,317, 1060, 56312,56313,56314,56316,1347, 56318, 317, 343, 56320,56322,317, 343, 56323,56325,317, 56326,6420, 389, 56328,56329,439, 384, 56331,56332,2206, 22412,4925, 317, 56334,317, 427, 56336,36630, - 56338,56340,317, 56337,381, 56339,8447, 317, 5266, 365, 5294, 56343,317, 56345,56346,3361, 56348,56351,56353,56355,15842,56363,390, 317, 5238, 317, 490, - 3182, 651, 5022, 13650,56347,317, 10279,661, 317, 2146, 371, 56349,56350,18333,490, 345, 51063,619, 43075,11485,38196,56352,13790,6228, 317, 633, 317, + 56338,56340,317, 56337,381, 56339,8447, 317, 5266, 365, 5294, 56343,317, 56345,56346,3361, 56348,56351,56353,56355,15842,56363,390, 317, 5238, 317, 490, + 3182, 651, 5022, 13650,56347,317, 10279,661, 317, 2146, 371, 56349,56350,18333,490, 345, 51063,619, 43075,11485,38196,56352,13790,6228, 317, 633, 317, 317, 317, 490, 56354,22945,5126, 56356,56362,536, 317, 1020, 56357,317, 339, 1044, 56358,56360,317, 345, 317, 345, 56361,56359,317, 2108, 490, 24137, 490, 1347, 56365,317, 56366,56367,5213, 10217,40659,5126, 56368,345, 23887,317, 370, 363, 363, 404, 56370,56372,56373,345, 317, 56375,56376,56377,56378, 317, 1108, 2110, 317, 56371,6817, 343, 345, 56374,351, 18244,2719, 317, 317, 317, 6227, 56380,7618, 56384,490, 56386,317, 6600, 56387,343, 56389,56391, - 56392,25016,56381,56382,56383,633, 543, 10189,1347, 317, 56385,3611, 31824,596, 1353, 332, 2035, 5241, 56388,11485,6228, 317, 317, 362, 317, 56390,317, - 7874, 317, 1912, 317, 56393,317, 56394,56395,56396,56398,381, 390, 317, 741, 6834, 55411,317, 56400,56402,317, 404, 56401,27845,466, 50069,363, 317, + 56392,25016,56381,56382,56383,633, 543, 10189,1347, 317, 56385,3611, 31824,596, 1353, 332, 2035, 5241, 56388,11485,6228, 317, 317, 362, 317, 56390,317, + 7874, 317, 1912, 317, 56393,317, 56394,56395,56396,56398,381, 390, 317, 741, 6834, 55411,317, 56400,56402,317, 404, 56401,27845,466, 50069,363, 317, 351, 317, 367, 3941, 56405,27765,56406,317, 56408,56409,56407,56410,56411,56412,4984, 56414,365, 56415,56417,56421,56422,5661, 332, 4738, 56423,56424,56430, 56435,14535,381, 56416,27957,56418,490, 37402,6834, 56419,56420,490, 9174, 5173, 8926, 6901, 2178, 56425,4984, 56429,2022, 553, 56426,317, 56427,56428,56431, 350, 56432,56434,56433,2586, 2586, 4738, 317, 56437,56439,56441,23624,56442,56453,56457,6255, 56459,56438,2033, 351, 362, 56440,14062,317, 958, 56443,56444, 56445,317, 343, 343, 343, 317, 56446,56450,317, 345, 317, 56447,56448,56449,34319,56451,56452,56454,56456,56455,12329,56458,36342,350, 317, 5105, 13638, 56460,56463,56464,2551, 554, 317, 5381, 317, 2155, 1347, 7214, 317, 317, 356, 404, 20684,404, 56468,2590, 56470,56472,883, 317, 56469,5120, 56471,56473, - 56474,2808, 635, 56476,20231,56478,56480,56482,56486,4060, 56487,56488,56489,56477,34687,56479,56481,317, 317, 56483,56484,3314, 56485,1915, 612, 30221,4589, + 56474,2808, 635, 56476,20231,56478,56480,56482,56486,4060, 56487,56488,56489,56477,34687,56479,56481,317, 317, 56483,56484,3314, 56485,1915, 612, 30221,4589, 370, 3726, 56491,4060, 356, 345, 345, 317, 367, 56494,56496,44581,19922,56498,56502,56495,56497,3688, 56499,317, 56500,317, 56501,56503,56504,56508,56521, - 56529,56535,56541,56545,56551,56556,6866, 56561,56580,56594,56606,56693,56708,192, 56824,56848,56899,56910,56956,56971,56972,56973,24024,317, 317, 317, 317, - 317, 317, 317, 317, 317, 56505,317, 24100,56506,317, 56507,345, 13457,317, 56509,380, 56510,56513,56516,56519,56520,56511,317, 317, 56512,56514,7456, + 56529,56535,56541,56545,56551,56556,6866, 56561,56580,56594,56606,56693,56708,192, 56824,56848,56899,56910,56956,56971,56972,56973,24024,317, 317, 317, 317, + 317, 317, 317, 317, 317, 56505,317, 24100,56506,317, 56507,345, 13457,317, 56509,380, 56510,56513,56516,56519,56520,56511,317, 317, 56512,56514,7456, 317, 10149,317, 56515,5223, 1871, 317, 56517,590, 596, 56518,32873,6551, 332, 380, 9436, 317, 6808, 351, 56522,56523,2322, 56524,965, 56526,317, 56527, - 427, 523, 1347, 365, 56525,317, 56528,5482, 42110,56530,56531,1347, 2272, 4952, 56532,56533,2077, 317, 56534,4717, 380, 18034,6696, 1453, 2134, 56536,365, + 427, 523, 1347, 365, 56525,317, 56528,5482, 42110,56530,56531,1347, 2272, 4952, 56532,56533,2077, 317, 56534,4717, 380, 18034,6696, 1453, 2134, 56536,365, 56537,56538,56539,317, 2568, 1109, 5891, 27765,317, 56540,28413,2219, 56542,565, 9474, 7428, 56543,317, 317, 9672, 56544,56546,15118,56547,343, 56548,56549, - 317, 596, 356, 363, 22724,490, 356, 971, 5836, 2078, 56550,490, 2110, 6409, 56552,56554,56555,56553,317, 343, 8979, 56557,6578, 56559,343, 56558,317, - 56560,418, 317, 317, 574, 316, 1347, 56562,501, 26221,37595,56563,345, 56564,3119, 56565,56567,56570,56575,56576,317, 56577,1721, 56579,317, 320, 1267, + 317, 596, 356, 363, 22724,490, 356, 971, 5836, 2078, 56550,490, 2110, 6409, 56552,56554,56555,56553,317, 343, 8979, 56557,6578, 56559,343, 56558,317, + 56560,418, 317, 317, 574, 316, 1347, 56562,501, 26221,37595,56563,345, 56564,3119, 56565,56567,56570,56575,56576,317, 56577,1721, 56579,317, 320, 1267, 620, 732, 56566,732, 669, 56568,56569,669, 732, 620, 620, 621, 649, 621, 56571,56572,56574,620, 669, 56573,839, 732, 56578,1909, 320, 740, 56581, - 56582,56583,1358, 56584,56588,56590,56591,17158,5428, 317, 5428, 317, 7866, 351, 317, 1160, 9244, 317, 343, 56585,317, 56586,56587,56589,343, 362, 2110, - 15030,56592,466, 363, 56593,56595,1588, 56598,56602,7689, 24918,56605,2110, 56596,317, 596, 317, 56597,56599,9922, 56600,56601,56603,317, 56604,5634, 5477, + 56582,56583,1358, 56584,56588,56590,56591,17158,5428, 317, 5428, 317, 7866, 351, 317, 1160, 9244, 317, 343, 56585,317, 56586,56587,56589,343, 362, 2110, + 15030,56592,466, 363, 56593,56595,1588, 56598,56602,7689, 24918,56605,2110, 56596,317, 596, 317, 56597,56599,9922, 56600,56601,56603,317, 56604,5634, 5477, 21347,2022, 343, 317, 56607,56612,56630,56643,56647,56649,52560,56650,56654,56658,56659,56664,56666,56676,56680,56687,317, 56690,5517, 56608,490, 56611,56609, 56610,1453, 1430, 56613,56615,56616,56614,56617,56625,56618,56623,56619,56620,56622,56621,56624,56626,56627,56628,56629,56631,608, 56638,41941,42940,56632,56633, - 56634,56635,56636,56637,56639,56640,56641,56642,317, 56644,31423,55960,56645,490, 14841,397, 56646,381, 17228,56648,56651,56653,56652,56655,56656,56657,8451, + 56634,56635,56636,56637,56639,56640,56641,56642,317, 56644,31423,55960,56645,490, 14841,397, 56646,381, 17228,56648,56651,56653,56652,56655,56656,56657,8451, 56660,343, 317, 56661,6203, 4788, 56662,56663,56665,56667,56669,56670,56675,56668,2369, 565, 56671,6255, 56672,56673,56674,56677,343, 56678,56679,56681,42138, 56685,2108, 56682,56683,56684,317, 521, 56686,1060, 56688,562, 56689,56691,56692,317, 390, 56694,317, 317, 15571,362, 56696,56701,56706,5793, 1481, 56695, 363, 56697,565, 343, 12312,363, 4789, 56698,317, 317, 56699,56700,56702,56703,56704,56705,2211, 50469,56707,56709,317, 350, 54450,56710,11505,56711,56712, 56713,56718,56721,56723,56752,56757,56758,56760,56761,56762,56764,1347, 56770,39466,56771,56775,56782,427, 56817,56819,56823,56714,317, 29424,2004, 317, 56715, 56716,56717,56719,317, 568, 317, 371, 56720,380, 2280, 490, 56722,11373,56724,56733,56734,56735,56738,3023, 56742,56743,56744,56747,14829,6601, 56748,56749, 543, 553, 56725,56726,56727,56728,56729,56730,56731,56732,56736,56737,363, 380, 56739,317, 9244, 56740,56741,363, 18840,12525,2948, 3529, 7785, 1358, 43038, - 371, 439, 56745,439, 317, 56746,7662, 2405, 971, 56750,14575,56751,6551, 317, 363, 6551, 17136,56753,56754,56755,56756,3076, 12303,56759,1347, 741, 7713, - 332, 9573, 343, 1358, 6048, 363, 317, 345, 14951,370, 56763,439, 56765,13839,5537, 31944,317, 317, 56766,56768,3031, 317, 370, 317, 56767,370, 317, - 7888, 370, 10674,317, 370, 56769,317, 317, 404, 10471,10476,317, 426, 1459, 317, 33571,56772,56773,56774,4952, 356, 371, 317, 317, 5538, 36081,317, + 371, 439, 56745,439, 317, 56746,7662, 2405, 971, 56750,14575,56751,6551, 317, 363, 6551, 17136,56753,56754,56755,56756,3076, 12303,56759,1347, 741, 7713, + 332, 9573, 343, 1358, 6048, 363, 317, 345, 14951,370, 56763,439, 56765,13839,5537, 31944,317, 317, 56766,56768,3031, 317, 370, 317, 56767,370, 317, + 7888, 370, 10674,317, 370, 56769,317, 317, 404, 10471,10476,317, 426, 1459, 317, 33571,56772,56773,56774,4952, 356, 371, 317, 317, 5538, 36081,317, 56776,56778,54381,56779,56780,29521,56777,10149,317, 390, 29521,56781,439, 427, 356, 56783,56784,5684, 317, 317, 332, 7657, 56785,317, 56786,56792,56794, - 56797,56805,2413, 5537, 31023,56806,51386,56807,56808,56809,5037, 56813,56787,56789,56791,56788,56790,4962, 56793,7368, 9696, 23325,56795,56796,14535,6696, 476, + 56797,56805,2413, 5537, 31023,56806,51386,56807,56808,56809,5037, 56813,56787,56789,56791,56788,56790,4962, 56793,7368, 9696, 23325,56795,56796,14535,6696, 476, 56798,56803,317, 56799,56800,56801,550, 56802,370, 56804,2510, 9590, 6598, 3076, 381, 393, 350, 7368, 1060, 1060, 2171, 2261, 7481, 56810,317, 56811,56812, 5406, 56814,56815,2108, 9822, 56816,380, 428, 56818,56820,56821,42266,2063, 56822,380, 381, 56825,56826,56828,56832,5138, 30882,8137, 56836,56837,348, 56838, - 22786,554, 380, 56839,56842,56843,29521,317, 1481, 2218, 317, 317, 56827,56829,22409,396, 317, 317, 317, 317, 56831,317, 56830,56833,56834,56835,2680, + 22786,554, 380, 56839,56842,56843,29521,317, 1481, 2218, 317, 317, 56827,56829,22409,396, 317, 317, 317, 317, 56831,317, 56830,56833,56834,56835,2680, 605, 56840,56841,56844,351, 56846,56845,56847,4564, 21234,427, 39109,356, 56849,56851,7857, 56859,6089, 56863,56873,56877,56878,2402, 56879,56884,317, 56887, - 9141, 56893,56897,343, 56850,589, 56852,5653, 317, 56853,10119,56856,5458, 13766,56854,56855,317, 317, 380, 345, 1526, 56857,56858,3182, 56860,317, 355, - 56862,29521,56861,56864,56865,56866,13394,56869,56871,427, 1453, 2719, 56867,56868,56870,56872,56874,20523,317, 343, 382, 5869, 317, 5241, 56875,56876,9482, + 9141, 56893,56897,343, 56850,589, 56852,5653, 317, 56853,10119,56856,5458, 13766,56854,56855,317, 317, 380, 345, 1526, 56857,56858,3182, 56860,317, 355, + 56862,29521,56861,56864,56865,56866,13394,56869,56871,427, 1453, 2719, 56867,56868,56870,56872,56874,20523,317, 343, 382, 5869, 317, 5241, 56875,56876,9482, 317, 317, 370, 367, 56880,490, 56882,35628,501, 56881,56883,56885,367, 56886,990, 4965, 56888,56892,317, 56889,56890,56891,56894,371, 56895,56896,56898, 56900,317, 56903,56904,18257,2081, 56905,56906,317, 390, 56908,56901,56902,21786,317, 56907,343, 317, 56909,11144,23192,317, 56911,56915,56928,56929,56933, 1700, 317, 42816,317, 317, 56912,56913,56914,332, 490, 56916,56920,56927,5295, 317, 7525, 56917,56919,317, 5201, 56918,6425, 1347, 5328, 317, 317, 56921, 56922,343, 56923,56924,317, 56925,56926,317, 29979,56930,490, 15464,49315,56931,2219, 56932,1347, 10320,2413, 36909,317, 56934,56940,56943,56947,56952,56955, 19390,56935,56936,56937,56938,56939,56941,56942,56944,56945,56946,56948,56949,56950,56951,23609,56953,365, 56954,56957,56958,501, 20909,8906, 56961,56963,56964, - 56967,56968,56969,317, 2177, 56959,32534,16910,56960,5120, 10317,6228, 362, 385, 44431,16528,56962,7389, 9557, 3999, 56965,56966,18848,56970,317, 343, 317, + 56967,56968,56969,317, 2177, 56959,32534,16910,56960,5120, 10317,6228, 362, 385, 44431,16528,56962,7389, 9557, 3999, 56965,56966,18848,56970,317, 343, 317, 6546, 7495, 56974,3429, 427, 56975,345, 317, 380, 56977,56979,5084, 56981,1060, 345, 317, 56982,56984,635, 6532, 56985,3557, 56988,56989,43588,56986,56987, 56990,56992,345, 56993,57002,22420,57011,339, 57012,339, 56994,56995,56996,56997,56998,56999,57000,57001,57003,5211, 57004,57009,57005,57006,57007,57008,57010, 450, 57013,57019,57021,57039,57046,57048,57050,57054,57055,57056,57057,57059,57064,57081,57095,57096,965, 57097,57109,57115,57132,57133,57135,11158,57137,57138, 57014,490, 57018,490, 57015,57016,57017,9832, 345, 317, 1020, 351, 57020,57022,317, 57024,57025,57029,57023,380, 2033, 2033, 466, 57026,57027,317, 57028, - 57030,5752, 57031,1331, 57032,345, 317, 343, 5536, 57033,1347, 57034,57035,33511,2261, 2060, 57036,57037,57038,57040,6713, 57042,427, 4249, 57041,317, 8978, - 362, 57043,317, 382, 381, 370, 57044,57045,596, 317, 57047,16308,5611, 490, 48787,12001,317, 57049,380, 20535,57051,57052,57053,21318,1347, 4373, 2845, + 57030,5752, 57031,1331, 57032,345, 317, 343, 5536, 57033,1347, 57034,57035,33511,2261, 2060, 57036,57037,57038,57040,6713, 57042,427, 4249, 57041,317, 8978, + 362, 57043,317, 382, 381, 370, 57044,57045,596, 317, 57047,16308,5611, 490, 48787,12001,317, 57049,380, 20535,57051,57052,57053,21318,1347, 4373, 2845, 354, 57058,317, 57060,57061,390, 22791,57062,317, 57063,41894,370, 57065,57067,57072,57076,9699, 2584, 370, 57080,57066,371, 1033, 57068,466, 57070,57071, 57069,1018, 1018, 317, 317, 317, 317, 317, 317, 356, 466, 363, 317, 476, 1915, 2146, 57073,57074,10291,57075,370, 1347, 2146, 10253,345, 5406, 57077, - 57078,57079,57082,57085,57087,57088,6599, 1108, 12454,16092,57089,1100, 317, 57092,351, 490, 57093,16092,57083,57084,317, 57086,2067, 16092,1345, 317, 317, - 317, 2546, 57090,317, 57091,37220,370, 7737, 9175, 57094,5694, 317, 354, 57098,57101,57102,57103,57104,362, 362, 365, 48605,343, 57105,57108,380, 371, + 57078,57079,57082,57085,57087,57088,6599, 1108, 12454,16092,57089,1100, 317, 57092,351, 490, 57093,16092,57083,57084,317, 57086,2067, 16092,1345, 317, 317, + 317, 2546, 57090,317, 57091,37220,370, 7737, 9175, 57094,5694, 317, 354, 57098,57101,57102,57103,57104,362, 362, 365, 48605,343, 57105,57108,380, 371, 380, 57099,57100,5225, 9567, 1881, 317, 390, 6961, 317, 57106,466, 57107,317, 317, 6309, 5201, 317, 501, 18042,57110,9059, 317, 317, 427, 16626,57112, 317, 57111,57113,6036, 57114,8035, 543, 57116,11855,57117,373, 32606,2022, 966, 57119,57125,57126,15047,393, 32015,57118,363, 392, 57120,4267, 57121,57122, - 57123,57124,345, 5701, 412, 14289,3987, 317, 317, 428, 57127,57131,317, 57128,57129,57130,17964,57134,57136,1194, 11347,427, 5439, 57141,1060, 14746,380, + 57123,57124,345, 5701, 412, 14289,3987, 317, 317, 428, 57127,57131,317, 57128,57129,57130,17964,57134,57136,1194, 11347,427, 5439, 57141,1060, 14746,380, 16298,57142,36917,6833, 57145,57147,57143,57144,57146,57149,57150,57152,57160,57161,57162,57164,57167,57169,57170,1914, 57175,57176,57177,50060,3999, 57182,57183, 57186,57187,43002,57191,57193,371, 11055,490, 57153,57159,490, 5624, 57154,490, 57155,57156,57157,57158,4949, 34634,427, 39009,57163,57165,57166,317, 57168, 50639,490, 501, 551, 630, 363, 349, 8224, 345, 44746,57171,6394, 317, 57172,57173,57174,2134, 19960,43502,23291,363, 363, 5055, 439, 363, 57178,57179, @@ -10405,42 +10400,42 @@ static const unsigned int ChildLocs[185261] = 57201,57205,57212,351, 57220,57223,57224,57231,57234,57236,57238,57241,57242,57243,57248,27587,57202,57204,10012,57203,57206,2584, 57209,57207,57208,2022, 57210, 57211,351, 57213,22356,57214,57217,2405, 2203, 317, 20552,57215,356, 3987, 57216,27211,362, 57218,57219,57221,57222,14144,22952,20551,2366, 6547, 6855, 32869, 57225,57228,57229,362, 57226,57227,5793, 479, 448, 57230,2272, 57232,57233,418, 8205, 57235,57237,6834, 14883,2021, 490, 57239,380, 57240,17444,57244,57245, - 57246,362, 44653,2022, 2849, 57247,57249,57255,57250,490, 57251,57252,57253,57254,57256,6907, 57259,57260,57261,57262,57264,57265,57267,57268,57269,57270,8451, + 57246,362, 44653,2022, 2849, 57247,57249,57255,57250,490, 57251,57252,57253,57254,57256,6907, 57259,57260,57261,57262,57264,57265,57267,57268,57269,57270,8451, 590, 18794,57272,57281,57282,57283,57284,18794,57273,57274,9624, 13863,343, 57277,36446,9914, 317, 57280,5037, 6089, 57275,57276,317, 10946,363, 57278,57279, 14549,363, 396, 4943, 317, 5841, 558, 317, 1325, 9844, 345, 9624, 57285,345, 57286,57287,2022, 9914, 317, 3124, 370, 363, 433, 57288,57296,57299,57300, 57339,57341,57343,57346,57353,57364,57366,57369,57376,57404,57408,10012,29305,57289,350, 373, 57290,57292,4965, 57294,490, 3429, 2464, 57291,332, 404, 57293, 351, 404, 363, 57295,2193, 57297,57298,390, 317, 57301,57302,57303,57305,57306,57338,5273, 317, 2272, 21318,57304,7408, 16968,317, 16968,1711, 10487,57307, - 351, 3987, 57309,57315,57320,57324,57327,57329,57330,370, 57331,317, 317, 57308,608, 3987, 57310,57311,57312,57313,57314,57316,57317,57318,317, 57319,1135, + 351, 3987, 57309,57315,57320,57324,57327,57329,57330,370, 57331,317, 317, 57308,608, 3987, 57310,57311,57312,57313,57314,57316,57317,57318,317, 57319,1135, 350, 57321,57322,57323,14951,57325,57326,390, 317, 34395,317, 5663, 11196,57328,28650,15221,365, 363, 57332,7618, 1020, 44163,57333,57334,57335,57336,16153, 57337,57340,57342,21838,57344,401, 317, 11279,57345,362, 57347,57348,57349,356, 57350,2510, 317, 5650, 382, 57351,57352,5477, 21910,57354,57355,57356,57363, - 317, 566, 4268, 21602,2571, 404, 57357,36046,57360,57362,21936,57358,5447, 466, 57359,1325, 5054, 448, 57361,317, 5324, 397, 2150, 19548,57365,1347, 412, - 57367,343, 2413, 8083, 57368,57370,57373,57374,57375,385, 57371,317, 317, 57372,317, 15842,471, 404, 363, 5836, 5655, 5611, 20535,363, 2219, 363, 381, - 57377,57383,33966,57391,57394,57378,57380,57379,5324, 5200, 57381,317, 7640, 57382,57384,57388,57385,57386,5394, 466, 2155, 7377, 57387,10120,8544, 57389,356, + 317, 566, 4268, 21602,2571, 404, 57357,36046,57360,57362,21936,57358,5447, 466, 57359,1325, 5054, 448, 57361,317, 5324, 397, 2150, 19548,57365,1347, 412, + 57367,343, 2413, 8083, 57368,57370,57373,57374,57375,385, 57371,317, 317, 57372,317, 15842,471, 404, 363, 5836, 5655, 5611, 20535,363, 2219, 363, 381, + 57377,57383,33966,57391,57394,57378,57380,57379,5324, 5200, 57381,317, 7640, 57382,57384,57388,57385,57386,5394, 466, 2155, 7377, 57387,10120,8544, 57389,356, 57390,382, 5616, 5550, 57392,57393,13996,343, 55228,57395,6598, 13596,57400,57396,57397,57398,57399,380, 5419, 317, 57401,57402,57403,57405,57407,57406,24722, 343, 44592,57409,57410,57411,57413,57418,339, 57425,57453,57465,343, 57477,57481,57482,57484,362, 57487,57504,404, 57414,57415,57416,57417,2537, 363, 57419, 57421,57422,57423,57424,4984, 57420,2035, 11158,57426,57430,57435,57441,57444,317, 57427,57428,57429,57431,57434,332, 57432,57433,57436,2143, 362, 57437,57438, 57439,57440,317, 57442,1526, 57443,57445,57447,57450,57446,5225, 18577,57448,57449,2184, 5524, 21680,356, 57451,317, 57452,466, 57454,57460,332, 57463,57464, - 57455,1160, 317, 317, 12416,57456,57457,57458,57459,345, 637, 2261, 57461,57462,57466,57467,57469,57470,57473,57475,2631, 44910,8455, 57468,365, 57468,2357, + 57455,1160, 317, 317, 12416,57456,57457,57458,57459,345, 637, 2261, 57461,57462,57466,57467,57469,57470,57473,57475,2631, 44910,8455, 57468,365, 57468,2357, 317, 3284, 57471,57472,57474,34320,57476,350, 57478,554, 57480,28694,16166,57479,7949, 317, 5022, 317, 384, 57483,343, 57485,343, 57486,351, 332, 32092, - 351, 317, 647, 57488,4268, 57493,24818,20984,57489,317, 343, 57492,57490,57491,1347, 30324,317, 57494,57500,57501,57495,343, 57496,57497,317, 317, 1160, - 317, 317, 317, 57498,57499,57502,57503,57505,317, 351, 57506,345, 57507,356, 57509,339, 57510,57515,57523,57527,57528,8207, 4974, 51212,57534,57542,433, - 57545,5742, 2405, 57549,351, 1337, 317, 2203, 6834, 317, 317, 543, 14829,57511,57514,32606,370, 317, 317, 26518,57512,57513,4965, 57516,317, 57517,317, + 351, 317, 647, 57488,4268, 57493,24818,20984,57489,317, 343, 57492,57490,57491,1347, 30324,317, 57494,57500,57501,57495,343, 57496,57497,317, 317, 1160, + 317, 317, 317, 57498,57499,57502,57503,57505,317, 351, 57506,345, 57507,356, 57509,339, 57510,57515,57523,57527,57528,8207, 4974, 51212,57534,57542,433, + 57545,5742, 2405, 57549,351, 1337, 317, 2203, 6834, 317, 317, 543, 14829,57511,57514,32606,370, 317, 317, 26518,57512,57513,4965, 57516,317, 57517,317, 39260,57518,1347, 57519,363, 57520,57521,57522,7734, 39260,1358, 10538,39260,10946,57524,317, 345, 57525,57526,427, 350, 7095, 4984, 57529,57530,57532,57533, - 490, 57531,2557, 20552,57535,57536,57538,57539,317, 57541,356, 32358,317, 57537,428, 15066,57216,965, 1325, 489, 317, 52739,2571, 317, 57540,20551,317, + 490, 57531,2557, 20552,57535,57536,57538,57539,317, 57541,356, 32358,317, 57537,428, 15066,57216,965, 1325, 489, 317, 52739,2571, 317, 57540,20551,317, 317, 57218,57543,57544,57546,57547,57548,57550,57551,57553,57558,57560,57561,7225, 57569,57576,18299,57577,57580,57587,23738,317, 13525,57554,57555,57556,57557, - 57559,39102,12478,317, 57562,57567,57568,57563,57565,57564,5223, 57566,351, 343, 57570,57575,343, 57571,57572,57573,57574,29831,317, 57578,57579,380, 350, + 57559,39102,12478,317, 57562,57567,57568,57563,57565,57564,5223, 57566,351, 343, 57570,57575,343, 57571,57572,57573,57574,29831,317, 57578,57579,380, 350, 343, 390, 57581,57583,57582,57584,9938, 57586,57585,472, 27334,501, 57588,2134, 57589,5126, 57221,57591,427, 57594,57595,350, 497, 57619,57622,57623,57592, 57593,317, 44592,31158,6326, 57596,4952, 57604,57610,350, 551, 57612,57613,2117, 317, 57597,57603,57598,2156, 12631,57601,57599,5898, 4949, 57600,1347, 57602, 14571,356, 10877,5662, 317, 57605,578, 380, 382, 57606,57607,317, 15110,21413,317, 57608,351, 17724,317, 57609,5441, 426, 370, 317, 370, 2272, 57611, 31380,57614,57616,36199,57618,2387, 2551, 57615,57617,4268, 343, 57620,2366, 317, 57621,19187,5459, 11881,1526, 57624,343, 14571,57625,57627,57631,57634,57636, 317, 57637,57638,57641,2171, 57645,590, 57646,2067, 57649,57651,57652,501, 317, 9525, 365, 57628,57629,57630,490, 490, 317, 332, 7005, 317, 362, 57632, - 479, 57633,363, 57635,28836,4984, 317, 317, 427, 1108, 57639,490, 351, 57640,5836, 370, 434, 5149, 2381, 57642,466, 317, 57643,57644,317, 9175, 558, - 450, 2078, 57647,9521, 57648,7062, 5663, 57650,590, 317, 363, 2366, 57653,57654,57656,57660,57661,57663,57669,490, 57673,57682,57685,57686,57690,57692,490, + 479, 57633,363, 57635,28836,4984, 317, 317, 427, 1108, 57639,490, 351, 57640,5836, 370, 434, 5149, 2381, 57642,466, 317, 57643,57644,317, 9175, 558, + 450, 2078, 57647,9521, 57648,7062, 5663, 57650,590, 317, 363, 2366, 57653,57654,57656,57660,57661,57663,57669,490, 57673,57682,57685,57686,57690,57692,490, 3987, 57693,362, 11648,57226,57657,57658,2078, 490, 350, 404, 317, 7005, 362, 20621,317, 317, 57659,16278,370, 479, 317, 57662,57664,57665,57666,57667, - 57668,57670,57671,57672,57674,57675,13369,4738, 57679,2272, 8178, 57681,439, 6203, 57676,317, 15459,7618, 57677,57678,57680,419, 363, 5663, 7866, 57683,317, - 57684,317, 317, 2063, 317, 317, 317, 4976, 490, 57687,57688,332, 57689,2035, 57691,356, 10546,317, 490, 2036, 2845, 57694,13730,317, 1000, 57696,6935, - 57697,57700,57701,57705,490, 362, 57698,20857,362, 57699,50600,317, 317, 3573, 345, 2222, 12756,9756, 4268, 57702,57703,57704,12800,365, 363, 57707,2004, - 57708,345, 50664,339, 317, 490, 53682,356, 57709,490, 332, 57710,57712,57717,57729,57730,57734,57736,57739,57740,57746,57747,57748,57753,57756,1230, 490, + 57668,57670,57671,57672,57674,57675,13369,4738, 57679,2272, 8178, 57681,439, 6203, 57676,317, 15459,7618, 57677,57678,57680,419, 363, 5663, 7866, 57683,317, + 57684,317, 317, 2063, 317, 317, 317, 4976, 490, 57687,57688,332, 57689,2035, 57691,356, 10546,317, 490, 2036, 2845, 57694,13730,317, 1000, 57696,6935, + 57697,57700,57701,57705,490, 362, 57698,20857,362, 57699,50600,317, 317, 3573, 345, 2222, 12756,9756, 4268, 57702,57703,57704,12800,365, 363, 57707,2004, + 57708,345, 50664,339, 317, 490, 53682,356, 57709,490, 332, 57710,57712,57717,57729,57730,57734,57736,57739,57740,57746,57747,57748,57753,57756,1230, 490, 2146, 2844, 57713,57714,57715,365, 490, 2807, 490, 57716,10898,317, 317, 2322, 2110, 2348, 317, 52725,2845, 356, 371, 57718,57721,343, 57723,317, 57724, 404, 57726,57719,54972,57720,57722,10641,5661, 57725,4962, 404, 57727,57728,57731,1347, 6834, 29531,57732,7797, 57733,317, 317, 490, 5217, 57735,363, 57737, 384, 57738,982, 4186, 57483,1459, 2058, 5439, 57741,57742,343, 371, 11280,3284, 363, 57743,57744,57745,1345, 2369, 10878,55347,363, 43191,57749,57750,57751, @@ -10448,98 +10443,98 @@ static const unsigned int ChildLocs[185261] = 57889,57893,57897,19617,57900,949, 345, 57758,965, 317, 57759,2261, 12417,57761,317, 574, 317, 342, 57762,57763,490, 1109, 9530, 317, 5996, 351, 57760, 2222, 9981, 49843,437, 19455,317, 317, 57765,490, 388, 57766,511, 9938, 57768,2117, 57769,345, 57770,57771,57772,57774,57775,11959,2077, 57776,57779,57781, 554, 12237,5419, 57782,57783,4041, 57784,57786,7592, 45987,365, 965, 370, 448, 57777,57778,381, 10559,7618, 11709,57780,6598, 578, 370, 3742, 673, 57785, - 5677, 1603, 57787,535, 57789,2541, 57788,57790,57791,1481, 57793,57794,317, 12598,57795,317, 339, 57801,57806,57809,57810,17098,57814,57817,57822,57823,5163, + 5677, 1603, 57787,535, 57789,2541, 57788,57790,57791,1481, 57793,57794,317, 12598,57795,317, 339, 57801,57806,57809,57810,17098,57814,57817,57822,57823,5163, 317, 14805,370, 3167, 1481, 5439, 57796,57799,651, 57797,740, 57798,57800,57802,57804,57803,57805,57807,57808,13109,317, 317, 317, 57811,490, 3284, 57812, - 57813,363, 26204,490, 57815,57816,363, 490, 8177, 2280, 317, 317, 57818,57819,57820,57821,57462,490, 57824,57826,1033, 57828,363, 1020, 1020, 57829,5826, + 57813,363, 26204,490, 57815,57816,363, 490, 8177, 2280, 317, 317, 57818,57819,57820,57821,57462,490, 57824,57826,1033, 57828,363, 1020, 1020, 57829,5826, 57830,2767, 637, 32434,16024,343, 363, 396, 57833,57851,57854,25128,317, 57856,57834,11404,57838,57846,57835,57836,317, 57837,15540,2188, 57839,57845,57840, - 57841,57842,57843,57844,57847,57848,57849,57850,57852,57853,490, 317, 57855,384, 2317, 351, 7401, 57857,57860,57862,1347, 57858,317, 5392, 57859,317, 2110, + 57841,57842,57843,57844,57847,57848,57849,57850,57852,57853,490, 317, 57855,384, 2317, 351, 7401, 57857,57860,57862,1347, 57858,317, 5392, 57859,317, 2110, 2381, 57066,3361, 57861,317, 2105, 637, 1266, 317, 633, 1347, 345, 7143, 1347, 4980, 1160, 23582,57863,343, 317, 57864,8296, 23524,4965, 57867,16187,57869, - 9938, 57873,317, 390, 57868,317, 57870,396, 317, 490, 4980, 57871,351, 57872,317, 8613, 317, 57875,1347, 57876,317, 5611, 381, 7450, 39450,6859, 384, + 9938, 57873,317, 390, 57868,317, 57870,396, 317, 490, 4980, 57871,351, 57872,317, 8613, 317, 57875,1347, 57876,317, 5611, 381, 7450, 39450,6859, 384, 9884, 57879,57880,57881,49464,50035,343, 317, 57882,370, 363, 57885,363, 363, 404, 57887,57888,363, 57886,8296, 36541,11607,11141,16187,57890,363, 57892, - 317, 57891,44143,25025,57894,7214, 317, 57896,57895,57898,5611, 2110, 57899,317, 317, 57901,2219, 25128,57902,57903,345, 57904,1347, 317, 965, 2086, 1347, + 317, 57891,44143,25025,57894,7214, 317, 57896,57895,57898,5611, 2110, 57899,317, 317, 57901,2219, 25128,57902,57903,345, 57904,1347, 317, 965, 2086, 1347, 2086, 1347, 57905,57906,57907,57909,57913,57915,57916,57923,57930,57933,437, 57934,57944,365, 57951,57953,57955,57956,317, 390, 57910,317, 2021, 57911,57912, - 621, 4925, 4980, 317, 57914,7852, 6855, 2110, 57917,57919,57921,57922,57918,16596,317, 317, 317, 317, 317, 362, 1526, 317, 57920,490, 883, 490, 490, - 949, 57924,536, 57927,57925,57926,57928,57929,13338,317, 2063, 57931,22032,57932,490, 6486, 7834, 439, 4984, 345, 57935,317, 4591, 57936,57938,57941,427, + 621, 4925, 4980, 317, 57914,7852, 6855, 2110, 57917,57919,57921,57922,57918,16596,317, 317, 317, 317, 317, 362, 1526, 317, 57920,490, 883, 490, 490, + 949, 57924,536, 57927,57925,57926,57928,57929,13338,317, 2063, 57931,22032,57932,490, 6486, 7834, 439, 4984, 345, 57935,317, 4591, 57936,57938,57941,427, 57942,57937,41257,57939,57940,26642,3387, 57943,317, 57945,57949,9027, 57950,332, 17856,57946,57947,57948,57952,317, 57954,7622, 34545,490, 385, 57957,57958, - 57960,57961,5279, 57962,57969,57976,2609, 57997,57998,58003,58005,343, 7473, 58014,58023,58027,58039,58041,58043,343, 3529, 11158,490, 317, 317, 5652, 343, + 57960,57961,5279, 57962,57969,57976,2609, 57997,57998,58003,58005,343, 7473, 58014,58023,58027,58039,58041,58043,343, 3529, 11158,490, 317, 317, 5652, 343, 373, 317, 2391, 57963,57964,8322, 511, 57966,57965,57967,57968,57970,57972,57973,317, 57974,57971,371, 23178,57975,384, 42843,428, 57977,57982,543, 11533, - 1230, 57983,9909, 46462,57984,57985,9420, 2571, 13478,57987,57988,57991,57992,57996,317, 2272, 32840,57978,57979,57980,57981,1522, 2272, 533, 317, 57986,1044, + 1230, 57983,9909, 46462,57984,57985,9420, 2571, 13478,57987,57988,57991,57992,57996,317, 2272, 32840,57978,57979,57980,57981,1522, 2272, 533, 317, 57986,1044, 18941,2117, 57989,466, 4591, 57990,2206, 3869, 343, 2060, 363, 57993,57994,320, 1292, 57995,370, 2634, 351, 317, 511, 20382,7942, 46350,5055, 57999,58001, 40790,58000,384, 317, 58002,58004,5223, 370, 19664,58006,58007,58008,2063, 58009,7073, 343, 58012,589, 58010,58011,58013,58015,58016,58022,7952, 58017,58018, 58019,58020,58021,31380,16917,550, 2171, 36199,58024,3646, 58025,7196, 6312, 605, 58026,355, 2117, 12849,58028,58034,332, 58038,58029,58030,58032,58031,58033, - 343, 58035,58036,58037,52622,14669,58040,30214,6354, 58042,58044,317, 58045,590, 4591, 5688, 6394, 317, 58047,58048,370, 58049,58050,7384, 58054,53211,381, + 343, 58035,58036,58037,52622,14669,58040,30214,6354, 58042,58044,317, 58045,590, 4591, 5688, 6394, 317, 58047,58048,370, 58049,58050,7384, 58054,53211,381, 58061,47644,999, 605, 12422,4938, 2533, 501, 58051,58052,58053,4937, 58055,58060,317, 4938, 58056,317, 317, 58057,317, 633, 317, 58058,317, 317, 58059, 58062,58063,2261, 58064,44525,5644, 58066,58069,58070,58071,350, 58101,58111,58116,58117,58121,58140,58141,58142,58155,356, 5459, 490, 58067,965, 490, 58068, - 490, 11146,490, 317, 605, 2590, 317, 7852, 553, 317, 490, 58072,58076,58093,4925, 58073,381, 1481, 317, 58074,20848,15772,58075,5825, 936, 2060, 3502, + 490, 11146,490, 317, 605, 2590, 317, 7852, 553, 317, 490, 58072,58076,58093,4925, 58073,381, 1481, 317, 58074,20848,15772,58075,5825, 936, 2060, 3502, 16603,58077,10422,380, 58080,370, 343, 58081,58082,58088,23859,1060, 2997, 58092,58078,58079,351, 476, 605, 58083,58084,58085,58086,58087,58089,12154,58091, - 380, 1194, 58090,2301, 2261, 58094,58099,58100,363, 373, 5226, 4249, 58095,317, 58096,5447, 58097,2510, 317, 382, 58098,2156, 58102,58103,58106,345, 427, - 5241, 317, 58104,317, 11388,58105,58107,58108,58109,58110,339, 28631,5689, 1913, 58112,58113,58115,1108, 427, 5464, 58114,382, 37381,6355, 490, 439, 4738, + 380, 1194, 58090,2301, 2261, 58094,58099,58100,363, 373, 5226, 4249, 58095,317, 58096,5447, 58097,2510, 317, 382, 58098,2156, 58102,58103,58106,345, 427, + 5241, 317, 58104,317, 11388,58105,58107,58108,58109,58110,339, 28631,5689, 1913, 58112,58113,58115,1108, 427, 5464, 58114,382, 37381,6355, 490, 439, 4738, 19978,501, 490, 343, 58118,2322, 58120,58119,58122,5855, 58124,58125,58136,317, 550, 5223, 58123,7949, 50574,7192, 439, 2219, 5399, 58126,58133,58127,58128, 58129,317, 58130,58131,5201, 317, 58132,410, 5447, 58134,382, 58135,5477, 10120,58137,58138,58139,356, 5221, 2510, 22791,31987,7852, 2310, 58143,58144,58145, 58151,317, 345, 343, 3031, 317, 404, 8390, 20674,58146,382, 57429,8456, 30399,22930,58147,58150,58148,58149,5225, 1325, 317, 58132,5365, 8136, 466, 58152, 58153,58154,58156,58157,58158,317, 6266, 2272, 316, 58160,58162,58161,58163,5663, 58164,58167,58180,58185,58195,58216,58230,58231,58244,58245,365, 58269,58272, - 58279,58284,58303,58318,58324,58326,58330,58335,58366,58367,58369,58371,58373,58165,58166,58168,50480,2081, 6089, 58169,1109, 58170,317, 58175,15355,58179,2272, - 9699, 343, 490, 370, 1428, 5032, 58171,58174,343, 2317, 596, 58172,58173,637, 8248, 6996, 317, 1011, 317, 673, 1025, 1353, 7911, 501, 370, 1160, 5037, - 317, 9930, 5054, 58176,58177,58178,317, 317, 433, 1347, 58181,58182,58183,317, 10407,1992, 4980, 58184,9325, 10422,466, 317, 1347, 317, 58186,317, 317, - 7511, 6354, 58187,58193,16535,58188,58189,351, 58190,58191,317, 317, 317, 58192,1325, 5113, 351, 58194,58196,58197,58201,362, 58206,58207,343, 21554,1230, - 58211,380, 5362, 317, 317, 24111,4564, 58198,58199,356, 58200,5201, 317, 58202,1230, 58203,317, 1347, 5709, 58204,21541,58205,317, 574, 345, 370, 345, + 58279,58284,58303,58318,58324,58326,58330,58335,58366,58367,58369,58371,58373,58165,58166,58168,50480,2081, 6089, 58169,1109, 58170,317, 58175,15355,58179,2272, + 9699, 343, 490, 370, 1428, 5032, 58171,58174,343, 2317, 596, 58172,58173,637, 8248, 6996, 317, 1011, 317, 673, 1025, 1353, 7911, 501, 370, 1160, 5037, + 317, 9930, 5054, 58176,58177,58178,317, 317, 433, 1347, 58181,58182,58183,317, 10407,1992, 4980, 58184,9325, 10422,466, 317, 1347, 317, 58186,317, 317, + 7511, 6354, 58187,58193,16535,58188,58189,351, 58190,58191,317, 317, 317, 58192,1325, 5113, 351, 58194,58196,58197,58201,362, 58206,58207,343, 21554,1230, + 58211,380, 5362, 317, 317, 24111,4564, 58198,58199,356, 58200,5201, 317, 58202,1230, 58203,317, 1347, 5709, 58204,21541,58205,317, 574, 345, 370, 345, 523, 351, 58208,2279, 317, 58209,2272, 351, 58210,58212,58213,58214,58215,317, 4965, 58217,490, 317, 2541, 58218,971, 58219,58221,58222,58223,317, 58226, - 58228,58229,1459, 11308,317, 6674, 332, 6920, 380, 9781, 58220,380, 2380, 58224,58225,7911, 58227,332, 9012, 1020, 351, 6632, 14991,2156, 439, 332, 317, + 58228,58229,1459, 11308,317, 6674, 332, 6920, 380, 9781, 58220,380, 2380, 58224,58225,7911, 58227,332, 9012, 1020, 351, 6632, 14991,2156, 439, 332, 317, 551, 58232,13338,58243,27874,33890,317, 363, 58233,7241, 58234,58235,58239,317, 427, 6172, 58236,58237,21690,5394, 466, 1347, 2012, 58238,5394, 466, 58240, 58241,58242,363, 28141,6847, 343, 58246,58247,58254,58255,58259,58260,58262,58263,58266,46120,317, 490, 58267,37431,58248,58249,58250,58253,466, 373, 58251, - 5053, 1347, 58252,5709, 14409,3429, 12696,58256,58257,58258,317, 317, 40848,22122,370, 58261,345, 5428, 58264,58265,2288, 6228, 317, 317, 317, 345, 317, + 5053, 1347, 58252,5709, 14409,3429, 12696,58256,58257,58258,317, 317, 40848,22122,370, 58261,345, 5428, 58264,58265,2288, 6228, 317, 317, 317, 345, 317, 2589, 363, 490, 7657, 58268,6993, 58270,2022, 2163, 317, 58271,58273,6704, 58276,58278,317, 58274,58275,58277,13638,45719,1383, 11844,5891, 45719,58280,58281, - 14377,58282,58283,317, 32011,14146,39260,58285,58291,58293,58295,58298,54368,58286,5808, 58287,58288,58289,58290,356, 317, 1347, 5226, 58292,396, 2181, 332, - 58294,1345, 574, 5392, 348, 345, 58296,58297,2272, 9347, 58299,2310, 58300,58301,58302,58304,7356, 58305,9422, 58308,58310,58312,58313,553, 58314,58316,5037, + 14377,58282,58283,317, 32011,14146,39260,58285,58291,58293,58295,58298,54368,58286,5808, 58287,58288,58289,58290,356, 317, 1347, 5226, 58292,396, 2181, 332, + 58294,1345, 574, 5392, 348, 345, 58296,58297,2272, 9347, 58299,2310, 58300,58301,58302,58304,7356, 58305,9422, 58308,58310,58312,58313,553, 58314,58316,5037, 58317,58306,2035, 58307,38209,58309,58311,317, 317, 317, 317, 596, 332, 58315,317, 363, 58319,58323,58320,58322,339, 58321,9067, 356, 317, 58325,58327, 58328,58329,384, 490, 8095, 332, 380, 317, 370, 16915,990, 380, 317, 4980, 371, 58331,58332,351, 490, 13262,4984, 58333,58334,20231,36969,58336,58337, 490, 58340,58355,55086,11195,350, 58356,58358,58363,5570, 56872,317, 490, 8301, 317, 58338,58339,23696,9246, 1108, 58341,58342,58344,18639,58347,58348,58352, 58343,57079,1345, 58345,37246,58346,21700,4591, 58349,58351,1428, 7514, 58350,58353,58354,317, 348, 317, 317, 58357,317, 58359,54496,58360,58361,58362,58364, 58365,380, 5038, 58368,2322, 373, 317, 317, 428, 58370,380, 317, 58372,317, 4593, 6486, 58374,58375,5105, 320, 58376,58379,58381,58396,58397,58399,58401, - 58405,58408,58410,58412,58419,58421,58423,58425,58426,58431,58484,30069,58485,2026, 490, 343, 373, 7954, 58377,317, 2537, 10836,490, 25525,58378,58380,3854, + 58405,58408,58410,58412,58419,58421,58423,58425,58426,58431,58484,30069,58485,2026, 490, 343, 373, 7954, 58377,317, 2537, 10836,490, 25525,58378,58380,3854, 20574,14341,317, 371, 11235,317, 58382,9730, 58384,58388,317, 317, 58383,6228, 317, 2077, 317, 4980, 58385,9938, 58386,58387,58389,58390,58391,58393,58392, 1347, 5113, 22021,58394,58395,57460,317, 317, 58398,8655, 317, 7618, 13638,13638,58400,58402,58403,58404,10056,362, 317, 363, 57251,490, 12399,490, 13003, 332, 490, 345, 371, 58406,971, 490, 5836, 34510,58407,971, 332, 3284, 373, 317, 317, 58409,3079, 57713,1430, 7389, 12142,363, 58411,439, 58413,58415, - 741, 58416,58417,58414,354, 1109, 3284, 19979,2012, 1325, 2163, 401, 58418,317, 58420,343, 5295, 18084,58422,49264,16508,5611, 404, 15445,58424,1530, 490, + 741, 58416,58417,58414,354, 1109, 3284, 19979,2012, 1325, 2163, 401, 58418,317, 58420,343, 5295, 18084,58422,49264,16508,5611, 404, 15445,58424,1530, 490, 433, 317, 58427,58429,362, 58430,8205, 10538,23927,58428,363, 6394, 317, 12463,511, 558, 490, 370, 5836, 58432,56734,58433,4982, 58463,58464,58466,58467, 58468,558, 58483,490, 19913,363, 58434,58440,58451,5896, 58435,58437,58438,58436,9482, 363, 58439,58441,58445,28327,58447,58450,58442,58443,58444,58446,58448, - 58449,39541,9815, 28588,10317,6598, 58452,58453,58456,58457,58458,58462,3236, 551, 6562, 501, 385, 58454,381, 58455,439, 390, 439, 58459,58460,58461,8125, - 439, 7592, 3529, 317, 901, 58465,351, 16651,439, 490, 40823,6551, 58469,427, 1076, 58473,427, 343, 58482,58470,566, 490, 58471,58472,1526, 58474,490, - 396, 58477,58480,317, 381, 11844,13003,58481,58475,58476,58478,58479,7892, 3284, 39984,43283,578, 16830,7939, 57256,365, 1109, 58486,58488,58489,58487,332, - 6525, 29040,317, 58491,58496,58498,58506,2022, 58507,58513,58515,58516,58533,58534,332, 58492,58493,58494,5943, 317, 58495,317, 490, 58497,332, 317, 317, + 58449,39541,9815, 28588,10317,6598, 58452,58453,58456,58457,58458,58462,3236, 551, 6562, 501, 385, 58454,381, 58455,439, 390, 439, 58459,58460,58461,8125, + 439, 7592, 3529, 317, 901, 58465,351, 16651,439, 490, 40823,6551, 58469,427, 1076, 58473,427, 343, 58482,58470,566, 490, 58471,58472,1526, 58474,490, + 396, 58477,58480,317, 381, 11844,13003,58481,58475,58476,58478,58479,7892, 3284, 39984,43283,578, 16830,7939, 57256,365, 1109, 58486,58488,58489,58487,332, + 6525, 29040,317, 58491,58496,58498,58506,2022, 58507,58513,58515,58516,58533,58534,332, 58492,58493,58494,5943, 317, 58495,317, 490, 58497,332, 317, 317, 490, 332, 380, 317, 58499,362, 58505,58500,58501,317, 2571, 12417,58502,393, 58503,58504,5241, 2219, 317, 2163, 317, 332, 58508,11295,11533,58509,58510, - 58511,58512,58514,4318, 317, 2809, 362, 9174, 58517,58521,58524,2022, 362, 58528,2326, 317, 58532,58518,58520,13856,58519,6600, 58522,58523,6046, 317, 317, + 58511,58512,58514,4318, 317, 2809, 362, 9174, 58517,58521,58524,2022, 362, 58528,2326, 317, 58532,58518,58520,13856,58519,6600, 58522,58523,6046, 317, 317, 56872,3504, 4980, 317, 58525,58527,317, 58526,8205, 565, 58529,24067,5300, 58530,58531,5955, 18978,317, 2652, 58535,58538,1588, 14995,58544,58547,58554,58557, - 2004, 58558,565, 58560,58561,58566,58568,58657,58658,58659,58536,58537,317, 7156, 2060, 633, 317, 339, 45162,58539,57111,58540,58541,58542,58543,58545,317, - 350, 12478,58546,58548,58550,317, 381, 58549,2610, 58551,58552,58553,58555,58556,317, 40690,363, 490, 490, 490, 15596,32837,14792,356, 317, 58559,3941, + 2004, 58558,565, 58560,58561,58566,58568,58657,58658,58659,58536,58537,317, 7156, 2060, 633, 317, 339, 45162,58539,57111,58540,58541,58542,58543,58545,317, + 350, 12478,58546,58548,58550,317, 381, 58549,2610, 58551,58552,58553,58555,58556,317, 40690,363, 490, 490, 490, 15596,32837,14792,356, 317, 58559,3941, 404, 317, 2156, 373, 370, 58562,58563,317, 58564,390, 317, 58565,350, 317, 14571,317, 2022, 9298, 58567,8926, 20146,434, 58569,58570,58572,58578,58584, - 58588,58590,58596,58601,10877,21301,58602,58609,58613,58616,58625,58632,58650,53405,58652,501, 2156, 58571,384, 356, 58573,58574,58575,551, 439, 58576,6514, + 58588,58590,58596,58601,10877,21301,58602,58609,58613,58616,58625,58632,58650,53405,58652,501, 2156, 58571,384, 356, 58573,58574,58575,551, 439, 58576,6514, 58577,58579,58580,6166, 58581,381, 4268, 58582,317, 58583,2601, 356, 58585,343, 58586,58587,317, 317, 58589,11442,9590, 12429,428, 58591,58593,58595,52893, - 58592,58594,6697, 26135,511, 58597,58600,605, 58598,1060, 58599,350, 7505, 58603,58607,58608,7449, 511, 58604,6724, 58606,1347, 58605,317, 356, 466, 317, + 58592,58594,6697, 26135,511, 58597,58600,605, 58598,1060, 58599,350, 7505, 58603,58607,58608,7449, 511, 58604,6724, 58606,1347, 58605,317, 356, 466, 317, 317, 2510, 5717, 5492, 58610,5337, 58611,31123,58612,58614,58615,58617,58618,58623,58624,4268, 1526, 20989,58619,58620,58621,58622,54242,8519, 4268, 3884, 58626, 58629,58630,317, 363, 58627,317, 24400,58628,317, 7834, 317, 2108, 8254, 350, 58631,2509, 6724, 58633,58635,58636,14688,58639,58640,58643,58644,58634,58637, 58638,356, 58641,58642,2369, 2102, 58645,58647,58646,5226, 58648,58649,58651,363, 58653,58654,26257,58656,42216,390, 350, 58655,58660,58661,54681,201, 58781, 58789,343, 58795,58796,6923, 58662,5238, 58663,317, 58664,317, 5634, 317, 2271, 317, 12044,317, 317, 317, 5054, 47476,15596,1347, 202, 6046, 58665,58668, 58672,58685,58691,58697,58699,58703,58711,58713,58714,58715,58720,22559,16129,58722,58729,58732,58739,58759,24528,58769,58770,317, 58780,58666,343, 4564, 57365, 12863,58667,3031, 58669,58670,574, 5840, 58671,56793,47678,317, 3884, 371, 7785, 317, 551, 1525, 4943, 58673,58674,58676,58682,343, 38692,58675,381, 58677, - 58681,1525, 1347, 466, 58678,58679,58680,58683,58684,58182,58686,58687,58689,466, 343, 396, 5717, 58688,22912,35591,58690,317, 427, 58692,58694,58693,2600, + 58681,1525, 1347, 466, 58678,58679,58680,58683,58684,58182,58686,58687,58689,466, 343, 396, 5717, 58688,22912,35591,58690,317, 427, 58692,58694,58693,2600, 58695,58696,14449,26684,3505, 58698,32672,578, 12864,550, 58700,58701,58702,439, 34975,58704,58706,428, 58708,24048,58705,22809,58707,1347, 36641,5363, 58709, 350, 58710,58712,10580,428, 58716,6021, 2156, 58717,2184, 10283,356, 37497,11613,10238,371, 382, 58718,58719,58721,2405, 1588, 350, 58723,384, 58724,58725, 356, 5335, 511, 25337,20766,58726,58727,58728,1526, 12360,48488,29321,58730,58731,58733,58734,58735,2261, 58737,58736,501, 1347, 466, 5441, 58738,605, 58740, 58743,58746,58747,363, 8023, 58749,58753,1347, 58741,58742,1526, 58744,2568, 58745,471, 5492, 58748,58750,28262,58751,5441, 5487, 58752,427, 381, 345, 31123, 58754,58755,58756,58757,58758,58760,58761,58765,370, 58766,58767,2193, 58762,605, 58763,9609, 58764,343, 1526, 5634, 371, 58768,1347, 317, 5363, 58771,58772, 58775,58777,58779,58773,58774,58776,58778,5487, 356, 33572,6312, 2117, 58782,5238, 5538, 58783,58788,590, 1009, 7831, 58784,58785,58786,58787,356, 58790,58791, - 58792,58793,58794,58797,317, 7340, 345, 58799,58803,58805,58808,10877,1347, 58813,58816,58817,7797, 58818,19446,58800,58801,58802,363, 365, 58804,7606, 490, - 317, 58806,58807,317, 332, 58809,58812,317, 681, 370, 58810,58811,58814,5661, 58815,466, 5943, 37875,317, 21413,317, 317, 317, 29083,317, 2022, 404, - 7582, 58820,58825,5159, 58828,58833,58837,2022, 362, 58847,58848,58853,345, 58854,58821,574, 22685,58822,58823,58824,58826,9914, 58827,317, 6674, 2402, 501, + 58792,58793,58794,58797,317, 7340, 345, 58799,58803,58805,58808,10877,1347, 58813,58816,58817,7797, 58818,19446,58800,58801,58802,363, 365, 58804,7606, 490, + 317, 58806,58807,317, 332, 58809,58812,317, 681, 370, 58810,58811,58814,5661, 58815,466, 5943, 37875,317, 21413,317, 317, 317, 29083,317, 2022, 404, + 7582, 58820,58825,5159, 58828,58833,58837,2022, 362, 58847,58848,58853,345, 58854,58821,574, 22685,58822,58823,58824,58826,9914, 58827,317, 6674, 2402, 501, 58829,2271, 22114,58830,58831,58832,427, 58834,58835,58836,362, 5154, 58838,58839,1347, 58840,58841,4268, 343, 5220, 1526, 21186,58842,58843,58844,58845,58846, 16920,351, 58849,317, 58850,58851,58852,58855,58856,58859,57966,58860,58857,58858,58862,58863,350, 2381, 58865,2380, 12291,15596,317, 58864,317, 317, 58866, 58867,363, 363, 58868,32461,317, 58870,58872,58873,490, 58874,58875,58879,58880,58882,2035, 10538,58883,489, 2272, 365, 317, 343, 58871,490, 365, 13376, 2272, 317, 4965, 971, 370, 58876,58877,58878,317, 2369, 28141,317, 58881,6713, 5687, 1479, 6713, 58884,58885,363, 5652, 1087, 362, 58886,58887,58904,58908, 58912,58920,58925,204, 59863,59865,59868,210, 60537,60600,214, 215, 61368,61380,216, 61621,61632,218, 62351,62360,220, 63146,63252,224, 63546,63550,63554, - 63558,63607,58888,58890,58898,58889,2058, 58891,58892,58893,58894,58895,58896,58897,58899,58900,58901,58902,58903,11091,58905,58906,58907,58909,58910,58911,621, + 63558,63607,58888,58890,58898,58889,2058, 58891,58892,58893,58894,58895,58896,58897,58899,58900,58901,58902,58903,11091,58905,58906,58907,58909,58910,58911,621, 58913,58915,58918,58919,58914,58916,58917,58921,58922,317, 58910,58923,58924,58926,58927,58928,58929,1020, 58930,58932,58935,58940,58945,58975,59006,59012,59014, - 59033,59036,59054,59058,205, 59182,206, 59314,59320,59373,207, 208, 209, 59770,59791,59813,59826,59827,59858,58931,58933,58934,551, 317, 551, 11617,6600, + 59033,59036,59054,59058,205, 59182,206, 59314,59320,59373,207, 208, 209, 59770,59791,59813,59826,59827,59858,58931,58933,58934,551, 317, 551, 11617,6600, 317, 317, 58936,58937,58939,58938,343, 58941,58942,58944,490, 363, 381, 58943,390, 5823, 8446, 58946,58947,58948,58949,58956,58961,58968,362, 15618,58972, 317, 1347, 33948,16310,317, 490, 338, 317, 49332,7035, 317, 317, 17454,20702,489, 1347, 317, 2715, 8275, 317, 58950,58951,15108,9909, 58953,350, 16290, 58955,332, 58952,317, 332, 317, 58954,58957,2537, 33895,58960,317, 12949,345, 58958,2184, 58959,5991, 5250, 317, 10114,317, 317, 345, 2381, 8455, 58962, @@ -10549,158 +10544,158 @@ static const unsigned int ChildLocs[185261] = 58993,58995,58996,58997,317, 317, 58999,59001,1347, 5570, 4984, 59002,5328, 59005,53743,490, 363, 317, 59007,317, 2381, 5431, 317, 59010,317, 59008,59009, 317, 59011,380, 59013,9554, 551, 9289, 59015,59018,59022,466, 59026,59029,59030,59031,9186, 59016,317, 490, 6486, 59017,317, 317, 332, 365, 427, 59019, 59020,59021,59023,30878,1347, 14833,59025,317, 5223, 1060, 59024,317, 370, 59027,59028,25767,7916, 2280, 7386, 46462,15169,18664,317, 8594, 6409, 2001, 59032, - 317, 49440,59034,317, 59035,5213, 553, 351, 317, 8100, 382, 5120, 317, 19829,351, 317, 343, 2222, 59037,317, 59038,59040,59052,59053,4925, 574, 490, + 317, 49440,59034,317, 59035,5213, 553, 351, 317, 8100, 382, 5120, 317, 19829,351, 317, 343, 2222, 59037,317, 59038,59040,59052,59053,4925, 574, 490, 317, 357, 317, 1160, 2067, 605, 363, 381, 59039,29069,2369, 5223, 2060, 1325, 10891,59041,2571, 317, 59044,59047,59042,59043,59045,59046,317, 59048,59051, 10877,363, 317, 12423,59049,2732, 59050,317, 1325, 10877,317, 8722, 317, 2022, 343, 59055,59056,348, 317, 6409, 332, 19978,59057,59059,59060,59061,59065, 12756,1459, 5241, 18978,362, 490, 343, 7678, 317, 59062,14837,59063,59064,59066,59067,59068,59069,59070,59105,59107,59120,59123,59124,59126,7143, 59135,59150, - 59164,59170,59175,59176,59180,345, 59071,59074,59077,3599, 365, 59087,59088,59093,59094,59095,2074, 59097,59098,9473, 362, 317, 59103,59072,59073,2163, 317, - 320, 317, 59075,59076,59078,59079,47011,59080,59084,59085,18908,59081,59082,59083,19201,18299,59086,317, 59089,317, 59090,59091,59092,8099, 355, 17748,5570, - 363, 5793, 343, 317, 490, 2396, 59096,490, 371, 348, 317, 59099,317, 59101,490, 373, 59100,380, 59102,2381, 59104,317, 31606,20178,59106,59108,971, - 317, 12233,59109,59110,59115,59116,49445,16628,317, 343, 343, 8718, 5241, 371, 965, 58259,55907,15540,59111,59112,19200,59113,18908,2272, 59081,59114,5570, + 59164,59170,59175,59176,59180,345, 59071,59074,59077,3599, 365, 59087,59088,59093,59094,59095,2074, 59097,59098,9473, 362, 317, 59103,59072,59073,2163, 317, + 320, 317, 59075,59076,59078,59079,47011,59080,59084,59085,18908,59081,59082,59083,19201,18299,59086,317, 59089,317, 59090,59091,59092,8099, 355, 17748,5570, + 363, 5793, 343, 317, 490, 2396, 59096,490, 371, 348, 317, 59099,317, 59101,490, 373, 59100,380, 59102,2381, 59104,317, 31606,20178,59106,59108,971, + 317, 12233,59109,59110,59115,59116,49445,16628,317, 343, 343, 8718, 5241, 371, 965, 58259,55907,15540,59111,59112,19200,59113,18908,2272, 59081,59114,5570, 317, 59117,59118,6519, 59119,370, 59121,59122,30315,10519,59125,1481, 2381, 59127,59129,20276,59133,15095,59128,59130,317, 348, 317, 3284, 59131,59132,59134, - 332, 14616,317, 59136,59142,59145,59147,543, 59149,317, 59137,59139,2146, 59141,29424,317, 11591,7399, 59138,59140,363, 357, 317, 1700, 345, 2108, 1358, - 59143,59144,9422, 59146,8488, 317, 2078, 363, 4788, 59148,5611, 350, 427, 59151,5896, 6195, 59153,59156,59161,6601, 5956, 317, 15334,7385, 59162,390, 1078, + 332, 14616,317, 59136,59142,59145,59147,543, 59149,317, 59137,59139,2146, 59141,29424,317, 11591,7399, 59138,59140,363, 357, 317, 1700, 345, 2108, 1358, + 59143,59144,9422, 59146,8488, 317, 2078, 363, 4788, 59148,5611, 350, 427, 59151,5896, 6195, 59153,59156,59161,6601, 5956, 317, 15334,7385, 59162,390, 1078, 317, 59152,317, 17535,59154,1358, 59155,317, 18454,317, 5862, 37456,16570,332, 59157,490, 59158,59159,5570, 8419, 59160,3031, 343, 351, 59163,59165,59166, 343, 748, 317, 59169,2391, 19872,59167,59168,6920, 317, 365, 49994,59171,59173,317, 373, 59172,59174,7072, 317, 317, 59177,59179,317, 59178,8828, 10592, 317, 3375, 59181,5890, 317, 3522, 14561,6817, 59183,59185,59187,6179, 370, 59189,59194,59184,59186,317, 1160, 490, 490, 490, 59188,317, 51202,59190,59191, - 59193,11147,17939,59192,363, 2035, 317, 490, 2242, 59195,59218,59231,59242,59249,59251,59261,59265,59272,59273,59277,59278,59282,3987, 59286,59287,17998,2134, - 59303,59304,59196,59197,23403,24455,59204,59209,59210,59213,17357,317, 46856,59198,59202,317, 59199,317, 59200,345, 59201,317, 59203,59205,59206,317, 5624, - 317, 332, 59207,59208,365, 59211,59212,59214,317, 59215,59216,59217,59219,1189, 59220,7514, 16603,59227,6419, 332, 20848,59221,59225,59226,17462,317, 1109, - 365, 490, 59222,59223,59224,8522, 59228,59229,317, 59230,59232,59233,59235,59236,59237,59240,59241,6228, 12429,6387, 317, 6409, 317, 59234,2184, 317, 339, + 59193,11147,17939,59192,363, 2035, 317, 490, 2242, 59195,59218,59231,59242,59249,59251,59261,59265,59272,59273,59277,59278,59282,3987, 59286,59287,17998,2134, + 59303,59304,59196,59197,23403,24455,59204,59209,59210,59213,17357,317, 46856,59198,59202,317, 59199,317, 59200,345, 59201,317, 59203,59205,59206,317, 5624, + 317, 332, 59207,59208,365, 59211,59212,59214,317, 59215,59216,59217,59219,1189, 59220,7514, 16603,59227,6419, 332, 20848,59221,59225,59226,17462,317, 1109, + 365, 490, 59222,59223,59224,8522, 59228,59229,317, 59230,59232,59233,59235,59236,59237,59240,59241,6228, 12429,6387, 317, 6409, 317, 59234,2184, 317, 339, 33717,10058,16970,2012, 59238,59239,17990,45460,317, 59243,317, 59244,10995,965, 7779, 7301, 59247,317, 356, 9385, 59245,317, 317, 356, 59246,59248,59250, - 59252,58331,59255,59257,59258,59259,59260,317, 490, 2142, 59253,59254,317, 59256,317, 59262,59263,20516,356, 356, 59264,59266,59267,59269,317, 490, 365, - 59271,2631, 317, 1108, 317, 5241, 317, 32242,2156, 317, 317, 59268,59270,59274,1345, 13023,59275,59276,7174, 317, 317, 59279,16187,466, 59281,23695,317, + 59252,58331,59255,59257,59258,59259,59260,317, 490, 2142, 59253,59254,317, 59256,317, 59262,59263,20516,356, 356, 59264,59266,59267,59269,317, 490, 365, + 59271,2631, 317, 1108, 317, 5241, 317, 32242,2156, 317, 317, 59268,59270,59274,1345, 13023,59275,59276,7174, 317, 317, 59279,16187,466, 59281,23695,317, 16092,317, 380, 59280,1459, 5295, 490, 343, 59283,59284,317, 8275, 24111,59285,2211, 5033, 317, 59288,59291,59293,59296,343, 59297,370, 6420, 5325, 59301, - 596, 317, 59289,21314,317, 6382, 59290,26249,59292,59294,5343, 5055, 59295,15193,1992, 59298,9667, 8419, 59300,6278, 490, 59299,59302,362, 59305,59307,2280, - 59306,5687, 5570, 2381, 59308,317, 59309,317, 59310,59311,59312,59313,317, 59315,59318,317, 59316,59317,1160, 7385, 2142, 7953, 8766, 5439, 317, 59319,332, + 596, 317, 59289,21314,317, 6382, 59290,26249,59292,59294,5343, 5055, 59295,15193,1992, 59298,9667, 8419, 59300,6278, 490, 59299,59302,362, 59305,59307,2280, + 59306,5687, 5570, 2381, 59308,317, 59309,317, 59310,59311,59312,59313,317, 59315,59318,317, 59316,59317,1160, 7385, 2142, 7953, 8766, 5439, 317, 59319,332, 59321,8828, 59344,2086, 59352,5793, 2402, 59366,59367,59370,28434,59371,5809, 59372,1753, 12429,370, 59322,59323,59325,59329,59331,8926, 59332,59338,59341,11357, 5624, 26250,7184, 59324,365, 332, 2212, 59326,59327,59328,59330,2110, 357, 490, 332, 59333,59334,59336,51054,365, 59335,317, 59337,8594, 59339,59340,11186, - 59342,59343,574, 6854, 59345,59346,2715, 6228, 59347,59349,15293,5570, 2571, 35294,317, 317, 59351,317, 5961, 59348,59350,381, 2301, 406, 59353,59355,1358, - 59357,24059,4591, 59365,59354,59356,59358,59360,59359,59361,404, 59362,59363,317, 59364,20178,343, 59368,59369,2406, 317, 1347, 1160, 29108,25961,317, 317, + 59342,59343,574, 6854, 59345,59346,2715, 6228, 59347,59349,15293,5570, 2571, 35294,317, 317, 59351,317, 5961, 59348,59350,381, 2301, 406, 59353,59355,1358, + 59357,24059,4591, 59365,59354,59356,59358,59360,59359,59361,404, 59362,59363,317, 59364,20178,343, 59368,59369,2406, 317, 1347, 1160, 29108,25961,317, 317, 19989,1481, 11146,4984, 5619, 59374,13190,59375,59376,59463,59464,59469,59474,59483,59485,15837,59488,59497,59506,59518,59524,59530,6600, 59540,59542,59551,59560, 489, 59591,59596,59377,59378,59384,2353, 59389,317, 59393,404, 59394,59404,59413,59428,59431,490, 59440,59452,380, 59459,59461,30882,8642, 2156, 27461,59379, - 59381,23348,59380,59382,59383,317, 24644,59385,59387,317, 59386,382, 21067,345, 5836, 59388,317, 345, 40465,317, 345, 59390,5684, 59299,59391,59392,8049, + 59381,23348,59380,59382,59383,317, 24644,59385,59387,317, 59386,382, 21067,345, 5836, 59388,317, 345, 40465,317, 345, 59390,5684, 59299,59391,59392,8049, 59395,59400,59396,59397,59398,59399,59401,59402,59403,8748, 59405,59409,316, 59406,59407,356, 59408,20480,317, 59410,53334,401, 5441, 59411,59412,59414,59415, - 59423,59426,6834, 345, 25898,30085,59416,59418,59417,59419,59421,59420,7986, 317, 59422,59424,59425,317, 343, 59427,59429,317, 59430,490, 6928, 965, 3772, - 7322, 490, 363, 4268, 59432,59437,59438,59433,59435,59436,59434,59439,59441,59442,59443,19828,380, 59447,4925, 11446,59444,1347, 59445,59446,317, 427, 5492, - 6355, 10253,59448,59449,59450,59451,59453,1588, 59455,4045, 59454,59456,59457,59458,59460,1108, 351, 332, 59462,381, 5173, 5105, 317, 59465,59467,317, 2328, + 59423,59426,6834, 345, 25898,30085,59416,59418,59417,59419,59421,59420,7986, 317, 59422,59424,59425,317, 343, 59427,59429,317, 59430,490, 6928, 965, 3772, + 7322, 490, 363, 4268, 59432,59437,59438,59433,59435,59436,59434,59439,59441,59442,59443,19828,380, 59447,4925, 11446,59444,1347, 59445,59446,317, 427, 5492, + 6355, 10253,59448,59449,59450,59451,59453,1588, 59455,4045, 59454,59456,59457,59458,59460,1108, 351, 332, 59462,381, 5173, 5105, 317, 59465,59467,317, 2328, 59466,59468,427, 13368,20909,59470,59471,350, 59472,59473,317, 2541, 317, 363, 317, 317, 49994,317, 6409, 390, 596, 59475,4925, 15095,317, 59476,59478, 59477,59479,59480,59481,55791,317, 590, 433, 59482,2063, 2036, 59484,1881, 381, 59486,362, 59487,9083, 348, 59489,59490,565, 390, 6937, 348, 14991,59491, 1345, 565, 59495,574, 433, 6228, 740, 20741,59492,59494,317, 4873, 356, 345, 59493,5055, 17711,317, 59496,317, 13171,6195, 59498,2413, 59501,59502,31023, - 362, 59504,12417,351, 35352,59505,317, 59499,317, 317, 637, 6996, 59500,355, 428, 392, 11918,39796,59503,1531, 2063, 59507,59509,59510,59517,3854, 514, - 332, 59508,5487, 317, 3854, 317, 5223, 317, 317, 59511,351, 362, 317, 59512,59513,59514,59515,59516,317, 36102,1347, 2510, 317, 59519,59521,2022, 317, + 362, 59504,12417,351, 35352,59505,317, 59499,317, 317, 637, 6996, 59500,355, 428, 392, 11918,39796,59503,1531, 2063, 59507,59509,59510,59517,3854, 514, + 332, 59508,5487, 317, 3854, 317, 5223, 317, 317, 59511,351, 362, 317, 59512,59513,59514,59515,59516,317, 36102,1347, 2510, 317, 59519,59521,2022, 317, 558, 59520,317, 59522,59523,317, 362, 350, 7045, 33957,59525,59528,363, 317, 59526,59527,59529,1347, 971, 59531,59532,59534,59537,380, 317, 5087, 11289, - 59538,317, 59533,2184, 5073, 632, 59535,5447, 7142, 317, 59536,320, 2081, 365, 59539,59541,59543,59545,59546,59549,317, 371, 490, 1078, 59544,317, 317, + 59538,317, 59533,2184, 5073, 632, 59535,5447, 7142, 317, 59536,320, 2081, 365, 59539,59541,59543,59545,59546,59549,317, 371, 490, 1078, 59544,317, 317, 317, 7567, 1588, 2110, 2381, 24810,381, 2110, 362, 59547,59548,2117, 4925, 5033, 2067, 317, 317, 59550,317, 343, 317, 5891, 7928, 59552,59553,59554,17919, 1597, 59556,59558,345, 317, 25407,4564, 345, 1347, 428, 8741, 433, 14883,382, 59555,317, 59557,59559,59561,390, 59562,59564,59571,59179,5662, 59583,59586, 59587,317, 1230, 59590,348, 363, 472, 317, 317, 317, 2402, 59563,12943,7625, 4045, 59565,59568,8214, 59566,59567,22742,59569,490, 59570,23534,317, 40847, - 373, 59572,5611, 5447, 8977, 26336,59581,59582,23844,59573,317, 2156, 59578,317, 59574,59575,2156, 4268, 59576,59577,5847, 448, 59579,59580,40848,2156, 317, - 29642,317, 59584,59585,317, 356, 466, 9139, 59588,59589,637, 317, 8301, 466, 490, 362, 363, 317, 2948, 59592,59593,59594,345, 44631,59595,317, 317, + 373, 59572,5611, 5447, 8977, 26336,59581,59582,23844,59573,317, 2156, 59578,317, 59574,59575,2156, 4268, 59576,59577,5847, 448, 59579,59580,40848,2156, 317, + 29642,317, 59584,59585,317, 356, 466, 9139, 59588,59589,637, 317, 8301, 466, 490, 362, 363, 317, 2948, 59592,59593,59594,345, 44631,59595,317, 317, 317, 5423, 6607, 59597,59598,59605,59606,59609,59610,8392, 59613,3075, 59614,59619,59672,59688,59690,59692,9699, 7473, 317, 5891, 59599,2178, 59602,59603,59604, - 371, 59600,19620,883, 59601,5571, 20382,13392,427, 343, 380, 5032, 317, 3987, 5105, 7386, 6402, 5890, 59607,26830,490, 490, 2022, 317, 59608,317, 4717, - 317, 2132, 5836, 363, 317, 317, 59611,50351,59612,5105, 381, 5223, 317, 59615,59616,380, 12988,59617,59618,8357, 5570, 59339,5032, 637, 59620,59621,345, - 633, 649, 20008,59622,4952, 59633,59638,59647,59648,13258,2022, 59652,59654,59655,59656,59658,59661,317, 317, 1160, 5826, 936, 2388, 1000, 317, 317, 317, - 373, 59623,59624,339, 59625,59626,59630,59631,1168, 317, 59627,59628,59629,59632,317, 17454,2715, 59634,2261, 59635,59636,59637,317, 2512, 59639,317, 317, - 370, 59640,317, 14295,5483, 59641,23819,59642,59643,59644,59645,59646,36123,59649,59650,317, 41130,10471,317, 317, 317, 59651,317, 6249, 317, 59653,317, - 1588, 317, 356, 317, 381, 350, 317, 990, 39003,59657,2024, 59659,5088, 59660,59662,59663,1160, 551, 59664,356, 551, 317, 59665,317, 59666,1160, 317, + 371, 59600,19620,883, 59601,5571, 20382,13392,427, 343, 380, 5032, 317, 3987, 5105, 7386, 6402, 5890, 59607,26830,490, 490, 2022, 317, 59608,317, 4717, + 317, 2132, 5836, 363, 317, 317, 59611,50351,59612,5105, 381, 5223, 317, 59615,59616,380, 12988,59617,59618,8357, 5570, 59339,5032, 637, 59620,59621,345, + 633, 649, 20008,59622,4952, 59633,59638,59647,59648,13258,2022, 59652,59654,59655,59656,59658,59661,317, 317, 1160, 5826, 936, 2388, 1000, 317, 317, 317, + 373, 59623,59624,339, 59625,59626,59630,59631,1168, 317, 59627,59628,59629,59632,317, 17454,2715, 59634,2261, 59635,59636,59637,317, 2512, 59639,317, 317, + 370, 59640,317, 14295,5483, 59641,23819,59642,59643,59644,59645,59646,36123,59649,59650,317, 41130,10471,317, 317, 317, 59651,317, 6249, 317, 59653,317, + 1588, 317, 356, 317, 381, 350, 317, 990, 39003,59657,2024, 59659,5088, 59660,59662,59663,1160, 551, 59664,356, 551, 317, 59665,317, 59666,1160, 317, 24024,42654,8258, 317, 317, 317, 1353, 317, 1025, 1353, 59667,317, 59670,59668,59669,59671,59673,59674,59677,59679,59684,317, 59686,317, 317, 1347, 59675, 317, 59676,363, 59678,345, 2156, 382, 490, 317, 59680,59681,1325, 59683,317, 59682,343, 59685,596, 317, 390, 490, 59687,990, 36760,59689,4576, 59691, 551, 7695, 371, 19913,59693,59701,59705,59715,59730,490, 362, 59734,59736,59738,59739,1345, 59760,59767,3987, 317, 59768,5241, 59694,332, 5120, 59697,59699, - 317, 20149,59700,59695,343, 59696,5570, 59698,11855,317, 13457,59702,317, 6228, 59703,3999, 59704,12423,317, 317, 380, 317, 317, 5942, 381, 965, 6402, + 317, 20149,59700,59695,343, 59696,5570, 59698,11855,317, 13457,59702,317, 6228, 59703,3999, 59704,12423,317, 317, 380, 317, 317, 5942, 381, 965, 6402, 317, 317, 59706,59708,59710,317, 343, 59707,4040, 59709,6270, 10172,466, 370, 317, 317, 59711,345, 404, 59712,19186,59714,59713,651, 59716,59721,59722, 317, 59724,317, 427, 7405, 317, 59717,59718,3869, 317, 59719,59720,59723,18116,59725,317, 59729,317, 59726,59727,59728,317, 7560, 345, 4268, 2381, 59731, 317, 18084,59733,1347, 357, 59732,5570, 343, 5477, 363, 59735,59737,36441,2261, 371, 2261, 44010,10815,3869, 317, 317, 381, 50464,393, 59740,59753,59758, - 59759,59741,59745,990, 317, 1109, 51210,59747,1109, 59750,2396, 59752,5241, 59742,317, 59743,317, 59744,317, 317, 317, 317, 317, 59746,33056,6956, 317, + 59759,59741,59745,990, 317, 1109, 51210,59747,1109, 59750,2396, 59752,5241, 59742,317, 59743,317, 59744,317, 317, 317, 317, 317, 59746,33056,6956, 317, 345, 59748,59749,59751,317, 8804, 1160, 6207, 59754,59755,363, 5174, 10149,317, 990, 59756,59757,317, 13947,2381, 345, 5174, 5441, 1950, 317, 7850, 59761, - 59762,59765,5684, 317, 1030, 59766,317, 317, 59763,59764,404, 5273, 6382, 317, 1347, 2142, 29447,404, 317, 12616,343, 380, 332, 3854, 59769,351, 343, - 350, 5459, 490, 59771,59772,59773,11211,59787,59790,317, 490, 21274,5828, 59774,59775,633, 59776,2566, 22275,59780,4591, 59781,351, 317, 59783,59784,1347, - 59785,345, 317, 6228, 350, 317, 59777,59778,59779,343, 317, 14108,317, 7785, 317, 317, 59782,7523, 490, 1160, 1160, 317, 332, 490, 317, 345, 363, - 5570, 59786,2584, 363, 404, 59788,390, 5447, 59789,5624, 59792,59793,59795,59798,317, 59811,317, 317, 317, 20265,317, 11339,317, 59794,5399, 343, 317, - 6228, 339, 9768, 5611, 1109, 3284, 317, 10592,59796,382, 59797,4925, 5054, 404, 59799,59800,59801,59803,24185,59806,8099, 401, 59802,596, 16910,317, 1481, - 371, 565, 13216,59804,317, 9768, 490, 59805,59807,59808,59809,59810,18829,59812,12696,59814,466, 59816,59822,317, 59825,59815,317, 10316,371, 317, 317, + 59762,59765,5684, 317, 1030, 59766,317, 317, 59763,59764,404, 5273, 6382, 317, 1347, 2142, 29447,404, 317, 12616,343, 380, 332, 3854, 59769,351, 343, + 350, 5459, 490, 59771,59772,59773,11211,59787,59790,317, 490, 21274,5828, 59774,59775,633, 59776,2566, 22275,59780,4591, 59781,351, 317, 59783,59784,1347, + 59785,345, 317, 6228, 350, 317, 59777,59778,59779,343, 317, 14108,317, 7785, 317, 317, 59782,7523, 490, 1160, 1160, 317, 332, 490, 317, 345, 363, + 5570, 59786,2584, 363, 404, 59788,390, 5447, 59789,5624, 59792,59793,59795,59798,317, 59811,317, 317, 317, 20265,317, 11339,317, 59794,5399, 343, 317, + 6228, 339, 9768, 5611, 1109, 3284, 317, 10592,59796,382, 59797,4925, 5054, 404, 59799,59800,59801,59803,24185,59806,8099, 401, 59802,596, 16910,317, 1481, + 371, 565, 13216,59804,317, 9768, 490, 59805,59807,59808,59809,59810,18829,59812,12696,59814,466, 59816,59822,317, 59825,59815,317, 10316,371, 317, 317, 371, 59817,59818,59820,59821,3284, 16910,382, 59819,11844,16508,390, 317, 8828, 59823,10172,466, 11864,59824,2402, 362, 404, 404, 59828,59835,1194, 59837, - 59839,59840,3999, 362, 59841,59843,59844,59845,59846,11158,59847,59856,490, 59829,59830,59831,59832,59833,59834,373, 317, 59836,24281,59838,9581, 1347, 317, + 59839,59840,3999, 362, 59841,59843,59844,59845,59846,11158,59847,59856,490, 59829,59830,59831,59832,59833,59834,373, 317, 59836,24281,59838,9581, 1347, 317, 574, 351, 476, 59842,9609, 4267, 11434,317, 317, 4268, 380, 7035, 59848,59855,18420,4738, 18420,59849,59850,59851,59852,59853,59854,345, 59857,59859,46641, - 22341,371, 9422, 1347, 59862,317, 59860,59861,317, 317, 59864,345, 29906,59866,59867,7521, 356, 317, 317, 21384,740, 345, 1347, 4396, 490, 59869,1943, + 22341,371, 9422, 1347, 59862,317, 59860,59861,317, 317, 59864,345, 29906,59866,59867,7521, 356, 317, 317, 21384,740, 345, 1347, 4396, 490, 59869,1943, 59870,350, 59871,59898,59901,59931,59967,59982,59986,59997,59999,60006,60009,60012,60058,211, 60178,60182,60203,212, 60416,213, 60519,60524,60528,60529,60530, 60533,10489,59872,59881,9443, 2298, 1033, 59882,59883,59884,2063, 59889,59893,59895,59897,317, 59873,59877,59879,317, 6228, 317, 410, 59874,10891,53149,31894, 385, 317, 4789, 59875,59876,317, 370, 59878,4573, 15334,317, 317, 8258, 317, 59880,8136, 466, 7941, 317, 317, 59885,59886,5942, 59887,1160, 59888,52497, - 317, 317, 59890,362, 59892,6676, 2222, 317, 439, 7916, 59891,554, 362, 15337,317, 317, 13324,428, 317, 363, 59894,5105, 12454,543, 362, 59896,317, - 59899,2022, 10956,5809, 59900,59902,59905,59906,59910,59913,59919,317, 59922,59926,56512,59903,59904,867, 2035, 448, 1109, 59907,59908,363, 59909,317, 971, - 2110, 317, 5223, 33252,317, 59911,317, 59912,5295, 5295, 317, 59914,554, 59916,350, 362, 317, 317, 59915,1347, 59917,390, 317, 59918,59920,317, 317, + 317, 317, 59890,362, 59892,6676, 2222, 317, 439, 7916, 59891,554, 362, 15337,317, 317, 13324,428, 317, 363, 59894,5105, 12454,543, 362, 59896,317, + 59899,2022, 10956,5809, 59900,59902,59905,59906,59910,59913,59919,317, 59922,59926,56512,59903,59904,867, 2035, 448, 1109, 59907,59908,363, 59909,317, 971, + 2110, 317, 5223, 33252,317, 59911,317, 59912,5295, 5295, 317, 59914,554, 59916,350, 362, 317, 317, 59915,1347, 59917,390, 317, 59918,59920,317, 317, 59921,20331,363, 59923,317, 59924,59925,317, 46344,59927,59930,59928,59929,59932,59936,59938,59946,59955,59956,59960,59966,365, 59933,11613,2094, 59934,59935, 9548, 343, 317, 4965, 59937,11128,317, 1588, 397, 317, 59939,59940,317, 26581,6046, 5173, 59941,4564, 59942,59943,59944,59945,59947,59951,59952,59953,59948, - 59949,59950,4564, 343, 12277,59954,351, 370, 605, 343, 59957,59958,59959,59961,59962,59963,59964,490, 2073, 490, 404, 2715, 371, 317, 332, 6228, 332, - 59965,7143, 2715, 5611, 2381, 55228,332, 5890, 6394, 1459, 59968,466, 1230, 59969,59972,59973,59975,59976,317, 59977,59978,59979,10476,363, 59970,5991, 466, + 59949,59950,4564, 343, 12277,59954,351, 370, 605, 343, 59957,59958,59959,59961,59962,59963,59964,490, 2073, 490, 404, 2715, 371, 317, 332, 6228, 332, + 59965,7143, 2715, 5611, 2381, 55228,332, 5890, 6394, 1459, 59968,466, 1230, 59969,59972,59973,59975,59976,317, 59977,59978,59979,10476,363, 59970,5991, 466, 51461,59971,14337,466, 343, 362, 317, 59974,2510, 1962, 466, 596, 32383,9067, 3504, 466, 2571, 317, 317, 6638, 15138,317, 426, 317, 317, 59980,59981, - 2581, 59983,59984,5661, 59985,8948, 362, 317, 59987,59989,59990,59992,59994,2004, 554, 317, 59995,59988,317, 317, 317, 6050, 356, 16651,317, 59991,6996, - 7028, 59993,59996,317, 2222, 59998,7214, 371, 43123,60000,317, 60003,350, 60004,1108, 60005,60001,59994,60002,5238, 317, 317, 5761, 343, 317, 345, 404, + 2581, 59983,59984,5661, 59985,8948, 362, 317, 59987,59989,59990,59992,59994,2004, 554, 317, 59995,59988,317, 317, 317, 6050, 356, 16651,317, 59991,6996, + 7028, 59993,59996,317, 2222, 59998,7214, 371, 43123,60000,317, 60003,350, 60004,1108, 60005,60001,59994,60002,5238, 317, 317, 5761, 343, 317, 345, 404, 60007,60008,60010,3999, 490, 379, 490, 317, 60011,317, 60013,60017,60019,2275, 60024,60026,60029,60030,10149,565, 60046,60054,60055,60056,60057,332, 37194, 332, 1108, 60014,317, 60015,332, 60016,60018,565, 621, 60020,317, 317, 317, 1728, 317, 60021,317, 60022,60023,427, 60025,60027,362, 5439, 60028,60031, - 60032,554, 60038,362, 60044,60045,317, 345, 9537, 60033,60035,60036,317, 317, 60034,363, 12988,60037,317, 317, 60039,19398,60040,317, 60042,60043,5241, + 60032,554, 60038,362, 60044,60045,317, 345, 9537, 60033,60035,60036,317, 317, 60034,363, 12988,60037,317, 317, 60039,19398,60040,317, 60042,60043,5241, 2272, 60041,350, 7273, 317, 317, 317, 11198,2187, 317, 317, 60047,2396, 7954, 60053,317, 60048,60049,60050,60051,60052,1347, 317, 363, 343, 5991, 15058, 4984, 317, 2222, 26076,332, 6565, 317, 60059,60064,360, 317, 60060,2035, 60061,60062,370, 60063,317, 45099,371, 60065,60072,60073,60078,60094,60101,60102, - 60106,60111,60126,15983,60127,60128,60142,433, 60145,60147,60149,60156,60173,60175,490, 60177,332, 60066,2086, 60067,60069,60071,30022,1109, 20763,317, 2134, + 60106,60111,60126,15983,60127,60128,60142,433, 60145,60147,60149,60156,60173,60175,490, 60177,332, 60066,2086, 60067,60069,60071,30022,1109, 20763,317, 2134, 2146, 60068,317, 60070,25563,5201, 350, 1526, 5492, 343, 14810,317, 371, 60074,60075,60076,60077,317, 5991, 466, 16307,317, 60079,60080,60086,60087,60089, - 60090,60092,4268, 2162, 8695, 357, 2067, 51343,60081,349, 60082,60083,317, 412, 60084,60085,381, 390, 15330,60088,7055, 404, 317, 60091,317, 60093,4591, + 60090,60092,4268, 2162, 8695, 357, 2067, 51343,60081,349, 60082,60083,317, 412, 60084,60085,381, 390, 15330,60088,7055, 404, 317, 60091,317, 60093,4591, 5742, 565, 60095,3854, 60097,317, 317, 60096,60098,365, 60099,60100,5447, 5847, 351, 6598, 12025,578, 9857, 590, 363, 490, 60103,60104,60105,60107,60110, - 60108,60109,2401, 393, 60112,565, 343, 60117,356, 60120,60122,317, 60113,317, 883, 60114,60115,60116,7079, 60118,60119,6228, 345, 4980, 60121,351, 6318, - 60123,60124,343, 60125,30423,317, 16535,3079, 9914, 14069,392, 60129,18191,60131,60133,384, 60137,60140,20310,60130,4268, 16092,317, 60132,317, 489, 3987, - 317, 371, 1347, 5862, 2571, 60134,60135,60136,317, 363, 2336, 1347, 25415,317, 57672,60138,60139,6228, 317, 16092,11344,2077, 32297,317, 60141,428, 8522, - 60143,8178, 350, 60144,60146,11607,60148,50937,4984, 694, 60150,317, 13023,60152,25193,4984, 60155,60151,371, 867, 2219, 60153,317, 343, 60154,9124, 317, + 60108,60109,2401, 393, 60112,565, 343, 60117,356, 60120,60122,317, 60113,317, 883, 60114,60115,60116,7079, 60118,60119,6228, 345, 4980, 60121,351, 6318, + 60123,60124,343, 60125,30423,317, 16535,3079, 9914, 14069,392, 60129,18191,60131,60133,384, 60137,60140,20310,60130,4268, 16092,317, 60132,317, 489, 3987, + 317, 371, 1347, 5862, 2571, 60134,60135,60136,317, 363, 2336, 1347, 25415,317, 57672,60138,60139,6228, 317, 16092,11344,2077, 32297,317, 60141,428, 8522, + 60143,8178, 350, 60144,60146,11607,60148,50937,4984, 694, 60150,317, 13023,60152,25193,4984, 60155,60151,371, 867, 2219, 60153,317, 343, 60154,9124, 317, 3645, 384, 60157,60161,60166,60168,4952, 60172,13066,20848,317, 373, 373, 38780,28079,60158,2163, 60160,317, 60159,10796,13573,8682, 60162,317, 60163,60164, - 60165,60167,41328,60169,332, 60170,4987, 404, 60171,7941, 343, 13686,380, 60174,3432, 17583,47678,428, 60176,5238, 390, 25404,55469,501, 1345, 60179,5241, - 60180,60181,428, 41639,317, 317, 317, 317, 60183,60184,490, 60186,574, 60187,60193,60197,345, 357, 363, 60185,590, 11347,1044, 557, 60188,60192,6917, - 317, 317, 60189,637, 60190,317, 694, 8948, 2271, 356, 1194, 60191,10058,317, 60194,1266, 317, 60195,60196,2272, 317, 60198,317, 317, 60199,393, 1347, + 60165,60167,41328,60169,332, 60170,4987, 404, 60171,7941, 343, 13686,380, 60174,3432, 17583,47678,428, 60176,5238, 390, 25404,55469,501, 1345, 60179,5241, + 60180,60181,428, 41639,317, 317, 317, 317, 60183,60184,490, 60186,574, 60187,60193,60197,345, 357, 363, 60185,590, 11347,1044, 557, 60188,60192,6917, + 317, 317, 60189,637, 60190,317, 694, 8948, 2271, 356, 1194, 60191,10058,317, 60194,1266, 317, 60195,60196,2272, 317, 60198,317, 317, 60199,393, 1347, 60200,60201,60202,60204,18422,381, 23348,60205,60210,60229,60232,60248,60261,60263,60265,60294,60297,60301,60303,60319,60326,60336,965, 60353,60366,60399,60408, 60410,317, 60414,60206,2271, 490, 317, 60207,60208,332, 3505, 60209,5392, 5611, 7460, 332, 60211,60217,60219,343, 60221,60223,1160, 60212,380, 60213,60215, - 433, 317, 60214,9067, 373, 60216,24655,433, 523, 5447, 33962,60218,33467,60220,433, 6598, 380, 539, 362, 60222,15027,60224,30685,60225,60226,60227,343, + 433, 317, 60214,9067, 373, 60216,24655,433, 523, 5447, 33962,60218,33467,60220,433, 6598, 380, 539, 362, 60222,15027,60224,30685,60225,60226,60227,343, 60228,2035, 605, 60230,3726, 1358, 2584, 60231,332, 47868,317, 60233,60234,60238,60239,60240,60241,20219,60243,60246,60247,317, 1345, 60235,60236,60237,14359, - 60242,2210, 60244,539, 60245,349, 60249,60253,60257,60250,2715, 60251,317, 356, 60252,370, 317, 382, 42472,343, 60254,7764, 60255,60256,10422,466, 317, - 5709, 3031, 60258,60260,5226, 60259,60262,5993, 2381, 554, 60264,60266,60267,60268,60269,60270,60271,5449, 60273,60275,60283,60288,60291,46121,7481, 54993,317, - 596, 6757, 343, 404, 10894,16078,60272,4591, 317, 317, 25726,29248,60274,317, 317, 60276,60277,60279,317, 60278,5476, 397, 60280,60281,380, 60282,381, - 2163, 60284,60285,4591, 60286,60287,58395,60289,60290,2060, 373, 60292,60293,7467, 5828, 60295,60296,14337,317, 60298,60299,362, 50561,317, 317, 343, 2551, - 317, 317, 60300,21037,345, 476, 317, 4980, 1347, 11443,46553,60302,45367,9692, 363, 11245,60304,60309,60311,60317,9199, 60305,3387, 60306,60307,40841,317, - 60308,60310,349, 5457, 9832, 363, 60312,60314,60313,317, 60315,356, 60316,382, 5459, 60318,60320,60322,317, 60323,1325, 60321,380, 2317, 317, 60324,317, + 60242,2210, 60244,539, 60245,349, 60249,60253,60257,60250,2715, 60251,317, 356, 60252,370, 317, 382, 42472,343, 60254,7764, 60255,60256,10422,466, 317, + 5709, 3031, 60258,60260,5226, 60259,60262,5993, 2381, 554, 60264,60266,60267,60268,60269,60270,60271,5449, 60273,60275,60283,60288,60291,46121,7481, 54993,317, + 596, 6757, 343, 404, 10894,16078,60272,4591, 317, 317, 25726,29248,60274,317, 317, 60276,60277,60279,317, 60278,5476, 397, 60280,60281,380, 60282,381, + 2163, 60284,60285,4591, 60286,60287,58395,60289,60290,2060, 373, 60292,60293,7467, 5828, 60295,60296,14337,317, 60298,60299,362, 50561,317, 317, 343, 2551, + 317, 317, 60300,21037,345, 476, 317, 4980, 1347, 11443,46553,60302,45367,9692, 363, 11245,60304,60309,60311,60317,9199, 60305,3387, 60306,60307,40841,317, + 60308,60310,349, 5457, 9832, 363, 60312,60314,60313,317, 60315,356, 60316,382, 5459, 60318,60320,60322,317, 60323,1325, 60321,380, 2317, 317, 60324,317, 6506, 317, 317, 60325,867, 4591, 2416, 2074, 396, 489, 60327,317, 60329,60330,60331,317, 60333,332, 317, 317, 60328,343, 343, 1481, 60332,60334,60335, 428, 60337,13135,60351,317, 60338,317, 60345,60339,60340,60341,60342,60343,60344,60346,60349,60347,60348,1325, 466, 2510, 60350,397, 5324, 23268,60352,60354, - 60355,60357,60362,60364,60365,9319, 2110, 60356,5270, 490, 56231,317, 7035, 60358,39398,60359,60361,2117, 4925, 24281,60360,1020, 1358, 317, 60363,317, 7386, + 60355,60357,60362,60364,60365,9319, 2110, 60356,5270, 490, 56231,317, 7035, 60358,39398,60359,60361,2117, 4925, 24281,60360,1020, 1358, 317, 60363,317, 7386, 31083,60367,60369,60371,60378,60379,370, 2022, 60384,60387,60394,404, 501, 60397,363, 317, 380, 60368,9186, 356, 60370,428, 6203, 60372,317, 60373,60374, - 345, 60375,9422, 7764, 9739, 8304, 60376,60377,523, 1325, 428, 466, 1588, 5616, 317, 60380,317, 317, 3645, 10561,60381,317, 20178,317, 60382,60383,466, - 317, 60385,60386,60388,5431, 60389,2610, 6089, 60392,2134, 317, 317, 373, 317, 2156, 60390,317, 60391,370, 317, 1526, 5201, 18587,60393,345, 20524,317, - 60395,60396,47505,317, 60398,5717, 5554, 60400,60401,60402,60403,44910,60405,558, 345, 5154, 60404,363, 433, 381, 60406,5652, 60407,18333,12231,433, 317, + 345, 60375,9422, 7764, 9739, 8304, 60376,60377,523, 1325, 428, 466, 1588, 5616, 317, 60380,317, 317, 3645, 10561,60381,317, 20178,317, 60382,60383,466, + 317, 60385,60386,60388,5431, 60389,2610, 6089, 60392,2134, 317, 317, 373, 317, 2156, 60390,317, 60391,370, 317, 1526, 5201, 18587,60393,345, 20524,317, + 60395,60396,47505,317, 60398,5717, 5554, 60400,60401,60402,60403,44910,60405,558, 345, 5154, 60404,363, 433, 381, 60406,5652, 60407,18333,12231,433, 317, 60409,7891, 5890, 60411,60412,10815,317, 32491,3031, 60413,317, 15531,29147,60415,317, 60417,60419,60425,60426,60429,60430,12565,17333,19016,60431,60434,14561, 390, 5689, 60418,6516, 427, 39520,317, 60420,317, 60424,317, 60421,60423,11647,60422,380, 343, 466, 317, 2715, 348, 9859, 371, 7567, 60427,60428,49396, 490, 44010,1109, 365, 345, 60432,60433,51079,317, 60435,60436,60438,490, 343, 12246,38739,317, 8593, 5611, 60437,33511,5367, 317, 60439,60444,60446,60454, - 60455,60456,60461,60463,60465,60503,60504,60517,37723,351, 60518,60440,317, 363, 60442,60443,317, 1230, 60441,590, 466, 317, 2845, 384, 965, 60445,317, + 60455,60456,60461,60463,60465,60503,60504,60517,37723,351, 60518,60440,317, 363, 60442,60443,317, 1230, 60441,590, 466, 317, 2845, 384, 965, 60445,317, 1011, 381, 317, 26830,317, 60447,5746, 317, 3361, 1160, 637, 1300, 6996, 317, 317, 633, 317, 317, 60448,317, 317, 356, 317, 39005,317, 51190,39381, - 60450,393, 6600, 60452,317, 60449,7064, 4949, 60451,7911, 39520,7618, 363, 9624, 60453,371, 363, 404, 427, 2948, 345, 10519,381, 2590, 2142, 2155, 490, - 60457,317, 60458,1347, 60460,5628, 317, 317, 7983, 60459,317, 60462,345, 396, 5746, 365, 343, 60464,60466,60469,60471,60475,404, 60497,317, 317, 4591, - 6607, 363, 2001, 60467,6195, 60468,4925, 7311, 317, 2280, 317, 60470,8099, 8484, 2715, 317, 60472,34487,53036,24570,317, 60473,15307,317, 7399, 10196,317, - 1109, 2272, 60474,7225, 60476,396, 60480,60482,60483,60485,60489,2054, 60491,5836, 60493,332, 6486, 60477,60478,2142, 60479,60481,355, 741, 490, 10254,380, + 60450,393, 6600, 60452,317, 60449,7064, 4949, 60451,7911, 39520,7618, 363, 9624, 60453,371, 363, 404, 427, 2948, 345, 10519,381, 2590, 2142, 2155, 490, + 60457,317, 60458,1347, 60460,5628, 317, 317, 7983, 60459,317, 60462,345, 396, 5746, 365, 343, 60464,60466,60469,60471,60475,404, 60497,317, 317, 4591, + 6607, 363, 2001, 60467,6195, 60468,4925, 7311, 317, 2280, 317, 60470,8099, 8484, 2715, 317, 60472,34487,53036,24570,317, 60473,15307,317, 7399, 10196,317, + 1109, 2272, 60474,7225, 60476,396, 60480,60482,60483,60485,60489,2054, 60491,5836, 60493,332, 6486, 60477,60478,2142, 60479,60481,355, 741, 490, 10254,380, 345, 11855,60484,2537, 9364, 317, 317, 345, 60486,20848,60488,7187, 60487,2163, 7187, 60490,25193,6854, 362, 1331, 60492,490, 2317, 60494,60495,60496,60498, - 490, 60499,2219, 60500,60501,36766,6486, 1481, 5163, 317, 60502,26076,2503, 60505,60506,60508,350, 363, 5661, 317, 345, 1230, 60516,33040,60507,317, 5223, + 490, 60499,2219, 60500,60501,36766,6486, 1481, 5163, 317, 60502,26076,2503, 60505,60506,60508,350, 363, 5661, 317, 345, 1230, 60516,33040,60507,317, 5223, 1230, 317, 6949, 60509,1347, 2024, 60511,29108,60513,348, 317, 11962,1230, 60510,2328, 60512,605, 434, 2322, 60514,60515,651, 29108,15117,5241, 380, 13659, - 60520,373, 60521,317, 60522,60523,15536,60525,2568, 317, 7401, 350, 13181,60526,332, 317, 317, 60527,2117, 317, 317, 350, 2117, 351, 574, 343, 350, + 60520,373, 60521,317, 60522,60523,15536,60525,2568, 317, 7401, 350, 13181,60526,332, 317, 317, 60527,2117, 317, 317, 350, 2117, 351, 574, 343, 350, 60531,60532,1108, 2035, 2022, 60534,5570, 6993, 60535,60536,490, 11294,17677,5439, 60538,60550,60554,60565,60566,60570,60575,60577,12288,60583,60587,60595,60597, 60539,60540,60541,60543,351, 27177,350, 60542,350, 60544,60549,60545,60546,60547,60548,60551,60552,60553,396, 605, 60555,60560,60564,15146,60556,60557,60558, 8948, 343, 60559,60561,317, 349, 351, 60562,343, 60563,47780,317, 2298, 511, 6778, 60567,60568,396, 60569,15146,350, 60571,11147,60572,350, 60573,60574, 60576,11663,60578,982, 57574,5677, 317, 60580,26871,350, 60579,2219, 2219, 60581,317, 351, 60582,7508, 380, 60584,381, 60585,5309, 317, 13364,60586,60588, 60594,60589,60590,60591,60592,60593,351, 20465,20465,60596,2568, 2152, 60598,380, 60599,317, 60601,60602,60603,60604,14720,2398, 60605,1347, 60665,60710,60781, - 426, 60784,4150, 60882,60888,60893,60897,55769,60606,60608,4965, 60611,317, 60622,60635,60658,60661,1060, 60664,60607,404, 363, 1347, 60609,60610,60612,363, - 343, 40460,60621,60613,60619,60620,60614,60615,60616,60617,60618,332, 3664, 317, 317, 60623,60624,60625,60629,60633,60626,60627,317, 60628,60630,60631,5623, + 426, 60784,4150, 60882,60888,60893,60897,55769,60606,60608,4965, 60611,317, 60622,60635,60658,60661,1060, 60664,60607,404, 363, 1347, 60609,60610,60612,363, + 343, 40460,60621,60613,60619,60620,60614,60615,60616,60617,60618,332, 3664, 317, 317, 60623,60624,60625,60629,60633,60626,60627,317, 60628,60630,60631,5623, 32563,60632,60634,60636,15618,60638,60640,60654,60655,60656,60637,1347, 5746, 60639,60641,317, 9450, 60642,60643,60645,60646,317, 60644,60647,60648,60652,60649, 60650,60651,317, 9313, 381, 60653,428, 345, 60657,51212,317, 60659,60660,317, 317, 317, 385, 1347, 317, 16970,382, 60662,8301, 60663,49315,370, 60666, 60668,1720, 2021, 60669,60670,60671,60687,60690,60695,317, 60705,60667,4266, 363, 343, 427, 490, 1347, 345, 60672,316, 60676,60677,60683,317, 60673,60674, 60675,7242, 60678,60682,60679,60680,5418, 60681,60684,4751, 60685,60686,343, 60688,60689,60691,2809, 60692,60694,404, 60693,60696,60700,60703,60697,60698,60699, 60701,60702,60704,60706,60707,60708,60709,60711,1720, 14444,350, 554, 6532, 60712,60765,60772,60773,5120, 60775,60777,1042, 60713,60732,332, 2146, 60735,60736, - 60743,60748,60753,60755,60763,404, 12154,9059, 60714,60719,60728,60731,60715,60716,60717,60718,60720,60722,60721,60723,60724,60725,60726,60727,317, 317, 345, - 4268, 60729,60730,32532,317, 7744, 466, 60733,363, 60734,317, 384, 9696, 60737,8047, 60738,60739,60740,60741,60742,1998, 2146, 317, 60744,60747,317, 393, + 60743,60748,60753,60755,60763,404, 12154,9059, 60714,60719,60728,60731,60715,60716,60717,60718,60720,60722,60721,60723,60724,60725,60726,60727,317, 317, 345, + 4268, 60729,60730,32532,317, 7744, 466, 60733,363, 60734,317, 384, 9696, 60737,8047, 60738,60739,60740,60741,60742,1998, 2146, 317, 60744,60747,317, 393, 60745,60746,317, 317, 32350,363, 317, 345, 317, 7911, 317, 363, 60749,60750,345, 1160, 3079, 350, 345, 2171, 60751,317, 317, 317, 317, 60752,59500, - 363, 60754,5223, 343, 60756,15540,8683, 9699, 60758,317, 60757,60759,60760,60761,2510, 60762,317, 60764,317, 60766,60770,60767,60768,60769,60771,20995,348, + 363, 60754,5223, 343, 60756,15540,8683, 9699, 60758,317, 60757,60759,60760,60761,2510, 60762,317, 60764,317, 60766,60770,60767,60768,60769,60771,20995,348, 14399,2022, 17375,60774,5120, 551, 363, 363, 317, 60776,382, 6228, 842, 3999, 317, 590, 60778,60779,60780,60782,57850,60783,60785,59779,60787,348, 60792, 60801,28447,466, 60813,60837,60878,60786,345, 60788,60789,371, 60790,9048, 60791,317, 317, 317, 317, 317, 317, 317, 317, 317, 5037, 60793,60796,60799, - 60794,1194, 23353,60795,60797,60798,60800,5225, 60802,317, 60804,60805,60806,343, 317, 317, 317, 60803,317, 6170, 317, 363, 1347, 339, 345, 345, 382, + 60794,1194, 23353,60795,60797,60798,60800,5225, 60802,317, 60804,60805,60806,343, 317, 317, 317, 60803,317, 6170, 317, 363, 1347, 339, 345, 345, 382, 60807,60810,1347, 60808,60809,317, 52144,60811,60812,15540,60814,60815,60816,16330,60826,60817,7506, 1347, 60818,60819,60820,60821,60822,60823,60824,60825,60827, 60830,60833,5603, 60828,60829,60831,60832,393, 6355, 28547,339, 4591, 317, 345, 60834,60835,60836,343, 40319,60838,4591, 60839,317, 9695, 60840,60842,60843, 60848,60854,60857,5731, 11038,60864,60869,60874,3717, 28878,60841,31613,317, 8682, 60844,60845,60846,60847,10422,27814,317, 317, 60849,60850,60851,60852,60853, @@ -10709,228 +10704,228 @@ static const unsigned int ChildLocs[185261] = 7064, 9303, 60898,60899,60910,60928,317, 60900,60901,60906,427, 5241, 1347, 30314,345, 60902,60903,7514, 60904,60905,60907,60908,60909,6212, 317, 60911,60912, 317, 60917,965, 60913,60916,317, 317, 60914,60915,370, 317, 60918,60919,60923,9070, 58309,60920,60921,60922,317, 7560, 381, 60924,60925,60926,60927,60929, 60930,60931,60933,60932,60934,60935,60936,60940,60958,60960,61015,61017,61083,61084,61097,20255,28126,61098,61105,61141,61156,61235,61243,61256,61259,61274,61300, - 61349,61351,61354,61355,490, 61357,60937,60938,60939,317, 60941,317, 60945,60946,317, 60952,60955,365, 343, 60956,60942,18969,60944,60943,60947,60948,490, + 61349,61351,61354,61355,490, 61357,60937,60938,60939,317, 60941,317, 60945,60946,317, 60952,60955,365, 343, 60956,60942,18969,60944,60943,60947,60948,490, 60949,60950,332, 4268, 317, 15817,362, 317, 60951,883, 60953,365, 317, 60954,365, 5570, 371, 371, 13638,490, 317, 317, 60957,23244,5687, 60959,60961, - 60962,60968,60978,60979,60984,60985,60999,61002,15387,317, 61003,7385, 15721,332, 60963,60966,60967,41735,332, 60964,60965,5032, 317, 317, 317, 1358, 317, - 317, 2142, 9226, 60969,60970,60971,60975,6471, 17445,356, 490, 5570, 2142, 60972,11669,60974,2322, 60973,2272, 60976,343, 317, 317, 60977,317, 332, 9427, - 2715, 60980,60981,60982,350, 12993,317, 2683, 317, 574, 60983,23199,5483, 8993, 365, 60986,60987,2024, 20865,14708,9648, 60993,362, 15733,60996,60998,317, + 60962,60968,60978,60979,60984,60985,60999,61002,15387,317, 61003,7385, 15721,332, 60963,60966,60967,41735,332, 60964,60965,5032, 317, 317, 317, 1358, 317, + 317, 2142, 9226, 60969,60970,60971,60975,6471, 17445,356, 490, 5570, 2142, 60972,11669,60974,2322, 60973,2272, 60976,343, 317, 317, 60977,317, 332, 9427, + 2715, 60980,60981,60982,350, 12993,317, 2683, 317, 574, 60983,23199,5483, 8993, 365, 60986,60987,2024, 20865,14708,9648, 60993,362, 15733,60996,60998,317, 6736, 2391, 317, 317, 60988,60989,60990,60992,317, 7592, 9878, 60086,60991,317, 356, 466, 1020, 317, 6578, 60994,466, 317, 317, 317, 60995,60997,17400, - 363, 61000,61001,16908,1358, 9244, 317, 5890, 317, 61004,61005,61006,317, 61010,18147,390, 61007,317, 498, 317, 61008,61009,345, 8451, 1033, 61011,317, + 363, 61000,61001,16908,1358, 9244, 317, 5890, 317, 61004,61005,61006,317, 61010,18147,390, 61007,317, 498, 317, 61008,61009,345, 8451, 1033, 61011,317, 61012,61014,317, 317, 317, 61013,7225, 2584, 27540,61016,7225, 332, 949, 61018,61019,61023,558, 43123,2084, 61031,61034,61035,31813,61037,61038,61042,61064, 61065,343, 61081,61020,61021,466, 2108, 14561,317, 51212,317, 8722, 61022,3284, 3284, 490, 5836, 356, 317, 61024,61026,61029,317, 61025,61027,61028,61030, 2222, 61032,61033,14170,345, 317, 61036,565, 466, 8333, 61039,332, 61040,317, 61041,4960, 4949, 61043,61045,404, 8357, 3710, 61047,61048,61049,61052,61053, - 61054,61057,61059,61063,61044,381, 61046,10877,317, 428, 317, 9624, 317, 317, 317, 5483, 365, 317, 61050,2369, 2210, 61051,61055,1358, 61056,61058,7850, - 6780, 61060,61061,61062,317, 61066,61073,343, 61074,28654,343, 317, 7974, 61067,61068,437, 61069,61070,61071,61072,317, 490, 5355, 61075,7142, 61077,6551, + 61054,61057,61059,61063,61044,381, 61046,10877,317, 428, 317, 9624, 317, 317, 317, 5483, 365, 317, 61050,2369, 2210, 61051,61055,1358, 61056,61058,7850, + 6780, 61060,61061,61062,317, 61066,61073,343, 61074,28654,343, 317, 7974, 61067,61068,437, 61069,61070,61071,61072,317, 490, 5355, 61075,7142, 61077,6551, 61079,61076,317, 317, 61078,16508,371, 61080,61082,12901,351, 373, 61085,8301, 2077, 5054, 2024, 61086,48033,61088,61090,61094,14535,501, 554, 61096,20870, - 15274,8766, 317, 317, 343, 2156, 370, 2117, 317, 61087,61089,363, 61091,61092,61093,5225, 356, 1943, 317, 61095,34925,317, 37113,61099,61101,61102,1020, - 883, 61104,61100,1060, 317, 501, 317, 317, 5037, 1606, 61103,61106,61110,61111,61113,61117,61121,61124,61128,61137,61139,20512,5325, 317, 13638,61107,3361, + 15274,8766, 317, 317, 343, 2156, 370, 2117, 317, 61087,61089,363, 61091,61092,61093,5225, 356, 1943, 317, 61095,34925,317, 37113,61099,61101,61102,1020, + 883, 61104,61100,1060, 317, 501, 317, 317, 5037, 1606, 61103,61106,61110,61111,61113,61117,61121,61124,61128,61137,61139,20512,5325, 317, 13638,61107,3361, 61108,14558,61109,61112,551, 351, 8296, 61114,13559,2222, 574, 1060, 61115,61116,351, 61118,501, 61119,61120,9067, 317, 490, 867, 5117, 10878,61122,15108, - 61123,61125,61126,2067, 2067, 317, 61127,2067, 317, 404, 61129,34254,61132,61133,362, 61135,25782,332, 5441, 317, 61130,317, 317, 61131,317, 1347, 574, - 317, 382, 363, 345, 61134,317, 370, 317, 356, 61136,317, 2406, 317, 317, 490, 61138,6228, 990, 1325, 466, 317, 317, 7672, 7055, 363, 350, 363, + 61123,61125,61126,2067, 2067, 317, 61127,2067, 317, 404, 61129,34254,61132,61133,362, 61135,25782,332, 5441, 317, 61130,317, 317, 61131,317, 1347, 574, + 317, 382, 363, 345, 61134,317, 370, 317, 356, 61136,317, 2406, 317, 317, 490, 61138,6228, 990, 1325, 466, 317, 317, 7672, 7055, 363, 350, 363, 61140,8116, 61142,6179, 2134, 61145,61143,61144,5105, 380, 317, 1267, 633, 1588, 61146,61149,550, 61151,61153,13766,362, 61155,61147,13736,61148,317, 61150, - 61152,317, 61154,2036, 7490, 61157,31191,61164,61172,61173,543, 61183,61193,61195,61199,2022, 61213,61218,61222,61224,61229,61232,56831,61233,61234,61158,2171, + 61152,317, 61154,2036, 7490, 61157,31191,61164,61172,61173,543, 61183,61193,61195,61199,2022, 61213,61218,61222,61224,61229,61232,56831,61233,61234,61158,2171, 61160,1078, 382, 61162,317, 61163,3505, 61159,61161,7419, 61165,61168,61169,384, 61170,2402, 345, 61166,8136, 466, 61167,867, 514, 551, 2022, 2022, 61171, - 351, 11654,345, 61174,61177,5611, 565, 13023,867, 61178,490, 317, 61181,317, 61182,5037, 6089, 317, 317, 61175,9322, 61176,2272, 1479, 61179,61180,317, - 558, 7672, 317, 61184,13650,61186,61187,5623, 12454,5379, 61188,1020, 61189,317, 317, 61185,61190,466, 61191,61192,61194,373, 6355, 867, 371, 5687, 2381, + 351, 11654,345, 61174,61177,5611, 565, 13023,867, 61178,490, 317, 61181,317, 61182,5037, 6089, 317, 317, 61175,9322, 61176,2272, 1479, 61179,61180,317, + 558, 7672, 317, 61184,13650,61186,61187,5623, 12454,5379, 61188,1020, 61189,317, 317, 61185,61190,466, 61191,61192,61194,373, 6355, 867, 371, 5687, 2381, 61196,363, 61197,317, 61198,6228, 551, 61200,61202,554, 61205,61206,15745,61208,61209,61210,404, 345, 61212,2067, 9931, 61201,381, 317, 362, 29982,61203, - 61204,2074, 61207,2369, 48208,61211,61214,61215,61216,23306,317, 2155, 317, 5808, 317, 380, 317, 317, 574, 317, 371, 382, 61217,317, 61219,2537, 317, + 61204,2074, 61207,2369, 48208,61211,61214,61215,61216,23306,317, 2155, 317, 5808, 317, 380, 317, 317, 574, 317, 371, 382, 61217,317, 61219,2537, 317, 317, 317, 61221,10609,61220,61223,59954,317, 2369, 7654, 61225,61227,61226,61228,61230,61231,343, 8367, 317, 2110, 332, 380, 317, 867, 317, 2142, 16582, 5570, 6318, 342, 28722,61236,61237,16310,553, 61241,345, 61238,317, 61240,61239,317, 317, 61242,371, 2402, 8296, 317, 61244,23019,61248,12598,317, 61251, - 317, 317, 388, 8000, 362, 14425,16138,61245,61246,12423,61247,317, 348, 382, 61249,1347, 490, 61250,1160, 61252,61254,61255,317, 61253,5223, 651, 350, + 317, 317, 388, 8000, 362, 14425,16138,61245,61246,12423,61247,317, 348, 382, 61249,1347, 490, 61250,1160, 61252,61254,61255,317, 61253,5223, 651, 350, 317, 61257,317, 61258,61260,317, 61265,61266,19648,332, 61267,61269,61270,61272,317, 373, 317, 370, 4591, 5570, 61261,61262,61263,5032, 6409, 317, 61264, - 521, 9581, 2142, 317, 61268,490, 317, 6458, 7672, 357, 317, 61271,53036,61273,61275,61276,61281,2533, 61282,14821,61283,317, 61284,61286,2381, 61297,7668, + 521, 9581, 2142, 317, 61268,490, 317, 6458, 7672, 357, 317, 61271,53036,61273,61275,61276,61281,2533, 61282,14821,61283,317, 61284,61286,2381, 61297,7668, 5836, 61277,345, 553, 61279,61280,61278,490, 36735,15463,427, 2035, 317, 6402, 10619,5105, 2110, 317, 61285,12925,3999, 3529, 2024, 317, 381, 867, 61287, - 20331,61290,61293,20237,61288,61289,61291,61292,490, 61294,61295,61296,3751, 4591, 61298,61299,42887,371, 61301,61304,61306,61314,61315,8175, 61316,61317,9909, - 61323,15745,61326,45908,61328,61331,61334,61348,2184, 12700,490, 13566,61302,3751, 61303,476, 61305,61307,61309,384, 61308,317, 2387, 61310,61312,466, 317, + 20331,61290,61293,20237,61288,61289,61291,61292,490, 61294,61295,61296,3751, 4591, 61298,61299,42887,371, 61301,61304,61306,61314,61315,8175, 61316,61317,9909, + 61323,15745,61326,45908,61328,61331,61334,61348,2184, 12700,490, 13566,61302,3751, 61303,476, 61305,61307,61309,384, 61308,317, 2387, 61310,61312,466, 317, 61311,317, 61313,4563, 6598, 356, 379, 332, 61318,61319,61320,61321,61322,61324,363, 61325,5428, 61327,7850, 317, 317, 61329,61330,390, 61332,61333,61335, - 584, 61337,61339,61340,350, 61341,61342,7688, 514, 61336,317, 61338,2219, 317, 2142, 10561,61343,61332,12556,4738, 2022, 404, 61346,61344,61345,61347,390, - 332, 53623,596, 61350,317, 317, 2053, 363, 2066, 61352,61353,380, 356, 466, 317, 5309, 9859, 351, 4564, 61356,15745,6420, 21188,61358,61359,351, 2110, - 351, 61360,7954, 867, 317, 38658,61361,61362,61363,343, 61365,61367,6228, 317, 317, 8301, 385, 362, 332, 2058, 13076,317, 1108, 2381, 5241, 61364,5439, + 584, 61337,61339,61340,350, 61341,61342,7688, 514, 61336,317, 61338,2219, 317, 2142, 10561,61343,61332,12556,4738, 2022, 404, 61346,61344,61345,61347,390, + 332, 53623,596, 61350,317, 317, 2053, 363, 2066, 61352,61353,380, 356, 466, 317, 5309, 9859, 351, 4564, 61356,15745,6420, 21188,61358,61359,351, 2110, + 351, 61360,7954, 867, 317, 38658,61361,61362,61363,343, 61365,61367,6228, 317, 317, 8301, 385, 362, 332, 2058, 13076,317, 1108, 2381, 5241, 61364,5439, 8937, 61366,371, 61369,61372,61374,61376,61370,61371,61373,61375,612, 17249,61377,61378,61379,61381,61382,61384,61383,365, 217, 317, 381, 61507,61556,61564, 61569,61573,61575,381, 61593,61619,501, 61385,61386,38461,61397,345, 61404,56455,61411,61414,61433,61436,61451,61471,15480,61473,61474,61506,61387,61388,61394, 61395,61396,971, 6355, 343, 428, 6294, 317, 15324,61389,61390,61391,61393,317, 1915, 4267, 6166, 9917, 61392,345, 317, 5037, 21067,15063,20880,317, 61398, 343, 61399,5662, 5717, 61400,61403,61401,61402,427, 1526, 1347, 61405,317, 61409,5487, 61406,6546, 9624, 370, 15881,61407,35352,317, 2368, 35349,20320,61408, - 11434,343, 523, 351, 61410,356, 605, 10487,7866, 61412,61413,61415,61416,61417,61421,61422,61424,5223, 61425,61426,427, 13847,317, 343, 317, 6902, 317, - 61418,61419,317, 61420,317, 317, 490, 7594, 5241, 370, 466, 317, 61423,317, 61427,61429,61431,317, 317, 317, 61428,5055, 10351,5167, 317, 61430,1347, - 317, 5896, 490, 351, 61432,61434,61435,10075,10076,61437,61438,61445,61446,61439,61442,61444,61440,317, 61441,1347, 61443,317, 12564,61447,61449,605, 404, - 61448,5991, 466, 12423,61450,317, 317, 965, 317, 1347, 397, 317, 317, 29853,61452,61453,61458,1358, 61461,332, 350, 61463,61466,61469,2222, 490, 5241, + 11434,343, 523, 351, 61410,356, 605, 10487,7866, 61412,61413,61415,61416,61417,61421,61422,61424,5223, 61425,61426,427, 13847,317, 343, 317, 6902, 317, + 61418,61419,317, 61420,317, 317, 490, 7594, 5241, 370, 466, 317, 61423,317, 61427,61429,61431,317, 317, 317, 61428,5055, 10351,5167, 317, 61430,1347, + 317, 5896, 490, 351, 61432,61434,61435,10075,10076,61437,61438,61445,61446,61439,61442,61444,61440,317, 61441,1347, 61443,317, 12564,61447,61449,605, 404, + 61448,5991, 466, 12423,61450,317, 317, 965, 317, 1347, 397, 317, 317, 29853,61452,61453,61458,1358, 61461,332, 350, 61463,61466,61469,2222, 490, 5241, 317, 61454,317, 317, 8049, 61456,61457,317, 61455,7911, 343, 61459,61460,61462,8021, 317, 317, 317, 8044, 317, 317, 61464,5055, 61465,61467,350, 61468, - 317, 317, 1347, 5037, 32982,2236, 61470,17649,345, 342, 2054, 363, 419, 42375,61472,332, 5428, 404, 949, 42580,61475,61476,61479,61485,61487,61491,3999, + 317, 317, 1347, 5037, 32982,2236, 61470,17649,345, 342, 2054, 363, 419, 42375,61472,332, 5428, 404, 949, 42580,61475,61476,61479,61485,61487,61491,3999, 61492,61493,61495,501, 11242,61496,61502,61503,317, 5457, 317, 317, 26037,428, 61477,371, 61478,317, 61480,61481,317, 637, 633, 317, 61482,61483,61484, 5022, 6598, 551, 61486,3366, 2206, 61488,61489,61490,551, 392, 439, 317, 6514, 61494,317, 11434,381, 61497,61498,61499,61500,61501,27846,2060, 61504,61505, 22561,511, 1347, 490, 490, 61508,61516,61519,61520,61523,990, 61524,61528,61529,61530,3709, 11279,61540,61547,61551,35926,61553,61554,2134, 10876,61509,12262, - 317, 61510,61513,466, 12000,61514,61511,343, 61512,370, 363, 7689, 317, 5037, 6996, 317, 343, 5190, 317, 317, 61515,410, 1347, 466, 7891, 61517,317, - 61518,350, 9818, 61521,61522,466, 317, 3131, 317, 317, 2406, 317, 343, 7045, 590, 317, 362, 317, 61525,6555, 317, 61526,61527,380, 3640, 3079, 568, - 61531,61537,61539,427, 61532,61533,61534,61535,61536,61538,378, 317, 61541,5241, 48479,5793, 61542,338, 61544,61545,2328, 61543,370, 61546,350, 317, 419, - 61548,2108, 317, 317, 61549,61550,490, 61552,5105, 2420, 61555,345, 332, 2132, 61557,61561,61558,61559,61560,61562,61563,410, 433, 61565,471, 15380,350, + 317, 61510,61513,466, 12000,61514,61511,343, 61512,370, 363, 7689, 317, 5037, 6996, 317, 343, 5190, 317, 317, 61515,410, 1347, 466, 7891, 61517,317, + 61518,350, 9818, 61521,61522,466, 317, 3131, 317, 317, 2406, 317, 343, 7045, 590, 317, 362, 317, 61525,6555, 317, 61526,61527,380, 3640, 3079, 568, + 61531,61537,61539,427, 61532,61533,61534,61535,61536,61538,378, 317, 61541,5241, 48479,5793, 61542,338, 61544,61545,2328, 61543,370, 61546,350, 317, 419, + 61548,2108, 317, 317, 61549,61550,490, 61552,5105, 2420, 61555,345, 332, 2132, 61557,61561,61558,61559,61560,61562,61563,410, 433, 61565,471, 15380,350, 61566,61567,61527,61568,381, 317, 332, 2163, 345, 317, 4965, 15951,317, 61570,61571,61572,61574,61576,510, 61577,351, 16630,61580,2845, 61583,396, 33816, - 61584,61586,61587,61591,61592,317, 371, 2222, 2280, 317, 350, 61578,1108, 61579,343, 61581,61582,317, 7490, 371, 9383, 61585,317, 13498,351, 35902,7951, - 1020, 8000, 46097,13638,317, 12631,49576,343, 533, 61588,32011,61589,356, 466, 362, 61590,2124, 2510, 8301, 501, 1325, 466, 362, 2301, 317, 61594,343, + 61584,61586,61587,61591,61592,317, 371, 2222, 2280, 317, 350, 61578,1108, 61579,343, 61581,61582,317, 7490, 371, 9383, 61585,317, 13498,351, 35902,7951, + 1020, 8000, 46097,13638,317, 12631,49576,343, 533, 61588,32011,61589,356, 466, 362, 61590,2124, 2510, 8301, 501, 1325, 466, 362, 2301, 317, 61594,343, 61595,396, 61596,565, 10172,61597,61604,61607,61611,61613,61618,427, 32372,5055, 317, 61598,61599,8136, 12454,61600,61602,61603,2171, 9832, 317, 351, 15646, - 466, 61601,351, 404, 317, 32408,61605,61606,61608,61610,61609,27691,317, 61612,345, 9174, 61614,61615,317, 317, 61616,61617,5956, 8722, 351, 466, 350, + 466, 61601,351, 404, 317, 32408,61605,61606,61608,61610,61609,27691,317, 61612,345, 9174, 61614,61615,317, 317, 61616,61617,5956, 8722, 351, 466, 350, 61620,317, 6089, 373, 380, 1588, 10855,2067, 61622,61624,8952, 317, 61629,61623,61625,61626,61627,61628,61630,61631,61633,61635,61642,11280,61643,61634,61636, 61637,10217,61638,61639,61641,52058,61640,61644,61645,61649,61651,61669,61705,61718,61722,61727,61731,61757,219, 61943,61966,62016,62038,62076,62077,62160,62246, 62292,62313,62317,4980, 62342,62346,61646,61647,61648,9422, 2108, 9027, 5483, 14462,11663,2004, 61650,343, 10098,574, 61652,9538, 61657,61658,61661,61662,61666, - 345, 61667,61653,317, 61655,5032, 61654,61656,56278,317, 61659,490, 490, 61660,9573, 4211, 345, 61663,61665,4591, 61664,9695, 356, 379, 466, 2276, 317, - 343, 371, 3422, 6294, 317, 61668,61670,61672,61673,61676,61678,61681,61682,61686,61690,2171, 61693,61698,61700,61701,61702,25114,317, 370, 61671,345, 490, + 345, 61667,61653,317, 61655,5032, 61654,61656,56278,317, 61659,490, 490, 61660,9573, 4211, 345, 61663,61665,4591, 61664,9695, 356, 379, 466, 2276, 317, + 343, 371, 3422, 6294, 317, 61668,61670,61672,61673,61676,61678,61681,61682,61686,61690,2171, 61693,61698,61700,61701,61702,25114,317, 370, 61671,345, 490, 371, 61674,61675,61677,61679,380, 317, 61680,20871,490, 6901, 317, 30310,14170,61683,5742, 61684,61685,10742,317, 61687,36541,61688,61689,61691,61692,61694, 61696,61695,371, 490, 61697,61699,6551, 2317, 1108, 490, 355, 6231, 61703,61704,61706,2058, 61708,1347, 61711,61713,61714,61716,61707,22599,362, 466, 61709, - 362, 61710,10626,381, 61712,36871,466, 2310, 61715,5793, 343, 317, 476, 61717,350, 370, 317, 6917, 11147,7852, 61719,61720,61721,5897, 5138, 351, 5788, + 362, 61710,10626,381, 61712,36871,466, 2310, 61715,5793, 343, 317, 476, 61717,350, 370, 317, 6917, 11147,7852, 61719,61720,61721,5897, 5138, 351, 5788, 61723,61724,11619,2156, 490, 317, 61725,6138, 18848,61726,466, 8937, 61728,61729,61730,351, 5662, 404, 862, 949, 2035, 2077, 61732,9983, 61734,945, 61743, - 61744,61750,61753,61733,14062,61735,6486, 61737,61740,61736,61738,363, 61739,317, 61741,61735,61742,466, 2571, 362, 363, 317, 8722, 317, 16277,24305,4965, + 61744,61750,61753,61733,14062,61735,6486, 61737,61740,61736,61738,363, 61739,317, 61741,61735,61742,466, 2571, 362, 363, 317, 8722, 317, 16277,24305,4965, 350, 381, 2236, 49766,61745,61747,350, 61746,317, 356, 10877,4591, 317, 2369, 61748,317, 61749,61751,2509, 590, 6409, 317, 61752,1027, 10130,61754,61755, - 61756,50843,61758,6834, 19661,61765,61767,61769,345, 317, 61759,61762,61764,1160, 61760,61761,621, 1266, 317, 317, 317, 6228, 317, 516, 362, 61763,317, + 61756,50843,61758,6834, 19661,61765,61767,61769,345, 317, 61759,61762,61764,1160, 61760,61761,621, 1266, 317, 317, 317, 6228, 317, 516, 362, 61763,317, 61766,317, 5661, 3284, 13110,61768,4230, 61770,61779,61780,61781,350, 61790,61791,61792,61824,61826,61832,61847,61858,61866,61868,61872,61873,61874,33846,61771, - 5624, 61772,61774,61775,61778,6402, 332, 371, 971, 317, 317, 345, 61773,332, 317, 11844,365, 20913,61776,7328, 61777,370, 20419,317, 5225, 356, 371, + 5624, 61772,61774,61775,61778,6402, 332, 371, 971, 317, 317, 345, 61773,332, 317, 11844,365, 20913,61776,7328, 61777,370, 20419,317, 5225, 356, 371, 971, 5838, 11346,8177, 363, 14561,351, 1194, 2631, 2171, 317, 317, 61782,7523, 490, 61785,61787,550, 61788,2211, 61783,363, 61784,61786,61789,17434,17434, 428, 621, 363, 61793,61801,61808,61809,61812,61814,61815,2396, 61816,61817,61822,61823,61794,61796,317, 61797,61798,317, 1358, 61795,317, 320, 317, 32079, 317, 1871, 317, 10619,345, 382, 15110,61799,61800,61802,61807,61803,61804,61805,61806,61810,3529, 317, 61811,61813,317, 317, 490, 317, 11844,362, 58447, - 5909, 12849,20146,370, 2322, 596, 5570, 6755, 61818,61819,12803,343, 317, 317, 26029,18064,370, 2571, 61820,345, 7673, 10376,317, 5418, 61821,317, 317, + 5909, 12849,20146,370, 2322, 596, 5570, 6755, 61818,61819,12803,343, 317, 317, 26029,18064,370, 2571, 61820,345, 7673, 10376,317, 5418, 61821,317, 317, 5055, 1526, 7888, 365, 332, 365, 61825,317, 61827,61829,363, 61831,317, 3869, 317, 317, 61828,332, 61830,61833,61836,61837,5662, 2402, 61841,61842,61844, - 61846,61834,317, 1325, 61835,332, 365, 317, 61838,61839,317, 24281,61840,2222, 317, 371, 317, 317, 317, 317, 61843,61845,317, 4267, 13296,5987, 332, - 6228, 7606, 317, 590, 61848,61849,61850,61851,61852,61853,61854,61855,1143, 61856,61857,14361,633, 371, 61859,332, 61860,61863,23304,9573, 8301, 1345, 8722, - 22828,61861,2317, 61862,61864,61865,381, 6486, 7072, 61867,363, 6412, 1160, 1358, 317, 5711, 61869,54452,2584, 317, 61870,61871,1459, 3375, 317, 2176, 5570, + 61846,61834,317, 1325, 61835,332, 365, 317, 61838,61839,317, 24281,61840,2222, 317, 371, 317, 317, 317, 317, 61843,61845,317, 4267, 13296,5987, 332, + 6228, 7606, 317, 590, 61848,61849,61850,61851,61852,61853,61854,61855,1143, 61856,61857,14361,633, 371, 61859,332, 61860,61863,23304,9573, 8301, 1345, 8722, + 22828,61861,2317, 61862,61864,61865,381, 6486, 7072, 61867,363, 6412, 1160, 1358, 317, 5711, 61869,54452,2584, 317, 61870,61871,1459, 3375, 317, 2176, 5570, 61875,9182, 61877,2146, 61893,61896,57489,61902,61909,61912,61920,61929,61935,61942,34510,61876,61878,61880,61886,61887,61892,61879,13595,1358, 61881,61882,13631, - 61883,61884,61885,61888,61889,61890,61891,525, 2094, 349, 61894,61895,14418,3869, 61897,61899,61901,61898,380, 317, 427, 61900,545, 61903,61905,61904,7506, + 61883,61884,61885,61888,61889,61890,61891,525, 2094, 349, 61894,61895,14418,3869, 61897,61899,61901,61898,380, 317, 427, 61900,545, 61903,61905,61904,7506, 59422,317, 61906,61907,61908,317, 10738,61910,514, 61911,61913,61914,61917,317, 61919,61915,61916,59436,4591, 57130,61918,61921,61926,61927,61922,61923,61924, - 61925,61928,61930,53917,8649, 61931,61932,61933,61934,9853, 965, 61936,61940,61937,61938,61939,61941,61944,61946,61947,2539, 61954,61955,61956,61958,61965,317, - 23481,343, 15509,596, 61945,1347, 5428, 380, 4949, 317, 61948,2381, 61951,61949,61950,61952,6607, 11921,370, 61953,343, 5217, 1108, 317, 2146, 35192,2381, + 61925,61928,61930,53917,8649, 61931,61932,61933,61934,9853, 965, 61936,61940,61937,61938,61939,61941,61944,61946,61947,2539, 61954,61955,61956,61958,61965,317, + 23481,343, 15509,596, 61945,1347, 5428, 380, 4949, 317, 61948,2381, 61951,61949,61950,61952,6607, 11921,370, 61953,343, 5217, 1108, 317, 2146, 35192,2381, 35822,350, 5793, 61957,61959,61960,61962,5205, 61963,404, 11034,332, 61961,317, 317, 589, 351, 2537, 345, 61964,332, 345, 10188,370, 61967,61969,61972, - 59319,61978,61982,61988,317, 61991,61993,62014,62015,61968,317, 61970,61971,53961,61973,61975,61977,345, 3646, 61974,349, 356, 466, 55557,317, 61976,380, + 59319,61978,61982,61988,317, 61991,61993,62014,62015,61968,317, 61970,61971,53961,61973,61975,61977,345, 3646, 61974,349, 356, 466, 55557,317, 61976,380, 61979,1160, 61980,61981,61983,61985,61984,317, 61986,61987,61989,61990,365, 2024, 350, 61992,20207,19434,61994,61998,13314,62002,62008,62009,317, 345, 62011, 61995,61996,61997,61999,62001,317, 317, 12225,62000,62003,317, 62004,2142, 22412,4591, 345, 1160, 14410,316, 317, 62005,62006,62007,5611, 427, 393, 25086, 5055, 21621,62010,62012,536, 62013,694, 390, 8301, 5005, 317, 12429,62017,62019,9170, 62020,6409, 62023,62025,62027,62028,62033,62035,62036,2022, 62037,62018, - 317, 317, 62021,355, 62022,317, 6036, 62024,349, 1160, 1243, 8301, 44550,62026,466, 362, 12417,5428, 392, 1030, 390, 317, 2357, 1300, 2391, 62029,516, + 317, 317, 62021,355, 62022,317, 6036, 62024,349, 1160, 1243, 8301, 44550,62026,466, 362, 12417,5428, 392, 1030, 390, 317, 2357, 1300, 2391, 62029,516, 11089,62030,37568,62031,62032,427, 8301, 28196,7401, 370, 11236,2844, 62034,13683,351, 26065,949, 62039,62040,62043,554, 62044,62048,62050,62051,62053,62055, 62060,355, 62066,62067,62069,3987, 36538,381, 317, 362, 62041,62042,317, 8301, 317, 1481, 1345, 12108,19665,62045,62046,317, 1060, 20159,390, 62047,62049, 4984, 363, 479, 62052,363, 1347, 3284, 5836, 62054,381, 4576, 62056,396, 62057,62058,5836, 317, 339, 62059,4925, 2108, 317, 62061,62062,62063,317, 62065, - 317, 317, 5105, 490, 11938,8488, 317, 1347, 9575, 62064,6228, 2584, 2077, 317, 55228,13914,62068,62070,62071,62075,4591, 345, 343, 1588, 62072,7765, 345, + 317, 317, 5105, 490, 11938,8488, 317, 1347, 9575, 62064,6228, 2584, 2077, 317, 55228,13914,62068,62070,62071,62075,4591, 345, 343, 1588, 62072,7765, 345, 62073,370, 62074,370, 10674,62078,62079,62080,62084,62085,62087,370, 62088,62089,62091,62103,62106,965, 62108,62112,62120,345, 62159,2537, 867, 62081,62083, - 2272, 317, 13056,62082,1020, 5439, 6546, 490, 490, 317, 380, 62086,317, 317, 5828, 382, 2291, 19811,351, 2058, 62090,62092,62093,633, 8301, 15001,2077, + 2272, 317, 13056,62082,1020, 5439, 6546, 490, 490, 317, 380, 62086,317, 317, 5828, 382, 2291, 19811,351, 2058, 62090,62092,62093,633, 8301, 15001,2077, 511, 62094,362, 62096,5872, 55440,317, 10131,2277, 343, 62095,6228, 317, 633, 62097,362, 62102,62098,62099,5241, 62100,62101,1033, 339, 317, 4472, 62104, - 345, 5836, 62105,25872,397, 62107,30499,62109,62110,62111,317, 490, 2142, 317, 990, 365, 317, 381, 62113,62116,62118,317, 62114,62115,317, 317, 317, + 345, 5836, 62105,25872,397, 62107,30499,62109,62110,62111,317, 490, 2142, 317, 990, 365, 317, 381, 62113,62116,62118,317, 62114,62115,317, 317, 317, 636, 317, 62117,317, 62119,62121,62124,62125,62128,62130,62133,2022, 62134,62136,62139,62142,32105,62145,62151,62154,6195, 62158,317, 22060,5840, 343, 62122, - 62123,317, 2027, 345, 317, 61665,317, 317, 317, 62126,24281,4591, 62127,317, 345, 317, 9624, 7401, 317, 5037, 62129,62131,62132,24051,317, 54226,4965, + 62123,317, 2027, 345, 317, 61665,317, 317, 317, 62126,24281,4591, 62127,317, 345, 317, 9624, 7401, 317, 5037, 62129,62131,62132,24051,317, 54226,4965, 6937, 6763, 382, 5055, 55135,62135,370, 384, 356, 8722, 62137,62138,62140,62141,5032, 9422, 62143,62144,317, 317, 5328, 393, 62146,62150,62147,62149,62148, 412, 317, 1588, 4564, 356, 466, 317, 342, 490, 62152,62153,62155,343, 7062, 317, 5105, 62156,62157,2272, 2063, 46697,332, 62161,19507,62162,62163,62165, 62170,2022, 15031,62171,62174,62181,7577, 317, 2070, 317, 317, 317, 317, 351, 317, 62164,390, 16871,345, 317, 382, 317, 62166,317, 5570, 356, 62167, - 5054, 317, 382, 62168,62169,5477, 21910,317, 317, 370, 2117, 345, 62172,3361, 62173,62175,62178,4984, 62180,380, 62176,62177,5464, 5847, 2510, 62179,371, - 2219, 17943,6021, 62182,62185,62186,62189,62194,62199,62204,62207,62209,62213,62224,62225,62230,62234,62241,62244,565, 343, 62183,317, 62184,2193, 8642, 6354, + 5054, 317, 382, 62168,62169,5477, 21910,317, 317, 370, 2117, 345, 62172,3361, 62173,62175,62178,4984, 62180,380, 62176,62177,5464, 5847, 2510, 62179,371, + 2219, 17943,6021, 62182,62185,62186,62189,62194,62199,62204,62207,62209,62213,62224,62225,62230,62234,62241,62244,565, 343, 62183,317, 62184,2193, 8642, 6354, 398, 62187,41935,2156, 62188,62190,62191,62192,62193,317, 5105, 16672,317, 62195,62196,317, 317, 62197,370, 62198,10105,62200,62201,62203,62202,62205,62206, 317, 7834, 345, 4965, 62208,9649, 317, 62210,317, 62211,35704,317, 62212,62214,62215,62221,317, 371, 5450, 62216,62217,62218,62219,62220,62222,9804, 62223, - 317, 62226,62228,62227,62229,62231,62232,9057, 62233,5763, 62235,62239,2551, 62236,62237,62238,62240,62242,62243,365, 41583,59527,62245,380, 1347, 466, 842, + 317, 62226,62228,62227,62229,62231,62232,9057, 62233,5763, 62235,62239,2551, 62236,62237,62238,62240,62242,62243,365, 41583,59527,62245,380, 1347, 466, 842, 62247,62256,62261,62269,62270,62272,9119, 62273,62276,62277,62278,62281,62291,1020, 373, 62248,62249,5655, 31866,62251,62252,62253,62250,62254,62255,62257,62258, - 62259,62260,381, 10820,62262,62263,317, 62268,317, 370, 62264,490, 62265,62266,2381, 62267,40848,5226, 355, 350, 62271,317, 62274,317, 62275,338, 365, - 365, 883, 343, 20166,27177,867, 317, 2586, 62279,62280,343, 3422, 33202,1915, 62282,62286,62288,62289,62290,343, 58436,54059,317, 62283,62284,62285,9059, + 62259,62260,381, 10820,62262,62263,317, 62268,317, 370, 62264,490, 62265,62266,2381, 62267,40848,5226, 355, 350, 62271,317, 62274,317, 62275,338, 365, + 365, 883, 343, 20166,27177,867, 317, 2586, 62279,62280,343, 3422, 33202,1915, 62282,62286,62288,62289,62290,343, 58436,54059,317, 62283,62284,62285,9059, 317, 2219, 2219, 62287,317, 596, 12057,317, 412, 3529, 2566, 6546, 10561,971, 5836, 317, 62293,62294,62295,2546, 317, 62300,317, 62305,550, 62308,62311, - 62312,317, 317, 62296,62297,62298,62299,62301,62302,62303,345, 6046, 62304,339, 11962,317, 13190,393, 551, 404, 62306,62307,44550,380, 317, 10422,466, - 16138,12641,356, 15058,62309,51097,317, 2406, 62310,2035, 9993, 30116,343, 317, 62314,2108, 62316,62315,397, 317, 62318,62319,62322,3988, 62335,62336,5241, + 62312,317, 317, 62296,62297,62298,62299,62301,62302,62303,345, 6046, 62304,339, 11962,317, 13190,393, 551, 404, 62306,62307,44550,380, 317, 10422,466, + 16138,12641,356, 15058,62309,51097,317, 2406, 62310,2035, 9993, 30116,343, 317, 62314,2108, 62316,62315,397, 317, 62318,62319,62322,3988, 62335,62336,5241, 62338,62339,62341,2402, 345, 62320,62321,317, 356, 7428, 370, 317, 317, 62323,62324,637, 6228, 317, 317, 1087, 317, 317, 2261, 62325,356, 10891,62327, - 466, 62328,2052, 2673, 62331,317, 62334,18448,6736, 11654,62326,381, 367, 7785, 39532,62329,62330,343, 317, 62332,11617,3529, 62333,3987, 351, 62337,990, - 317, 1347, 381, 317, 62340,7225, 351, 62343,350, 62345,7191, 14695,351, 62344,351, 363, 317, 351, 6551, 62347,62348,1347, 14883,62349,9623, 2124, 363, + 466, 62328,2052, 2673, 62331,317, 62334,18448,6736, 11654,62326,381, 367, 7785, 39532,62329,62330,343, 317, 62332,11617,3529, 62333,3987, 351, 62337,990, + 317, 1347, 381, 317, 62340,7225, 351, 62343,350, 62345,7191, 14695,351, 62344,351, 363, 317, 351, 6551, 62347,62348,1347, 14883,62349,9623, 2124, 363, 7850, 317, 62350,6651, 1787, 62352,62353,62357,2066, 62354,62355,317, 62356,62358,62359,62361,62362,62363,62364,62365,62366,62435,221, 222, 223, 63100,63120, 63122,63126,62367,62373,62379,62381,11838,62391,62396,62397,62400,62408,62411,62412,62413,2146, 62416,62422,62429,62430,62431,2163, 62432,62433,466, 380, 62368, - 62369,62372,62370,317, 62371,317, 5223, 62374,62375,62376,5717, 62378,62377,5447, 466, 427, 373, 18675,317, 62380,362, 350, 317, 1060, 317, 317, 4925, + 62369,62372,62370,317, 62371,317, 5223, 62374,62375,62376,5717, 62378,62377,5447, 466, 427, 373, 18675,317, 62380,362, 350, 317, 1060, 317, 317, 4925, 3599, 317, 62382,350, 62384,62387,62383,62385,62386,62388,62389,62390,317, 351, 62392,343, 62393,62394,62395,317, 20509,317, 5711, 362, 317, 332, 55568, 62398,62399,466, 317, 317, 29521,62401,62402,62403,62404,62405,62406,62407,62409,545, 2036, 62410,370, 6188, 1358, 317, 356, 371, 2044, 62414,10926,10185, - 62415,343, 363, 4965, 466, 62417,371, 62418,490, 62420,2222, 317, 62419,317, 6191, 62421,62423,15872,62424,350, 62425,490, 2022, 4965, 317, 62427,370, - 5652, 317, 1459, 332, 2142, 62426,965, 62428,345, 472, 317, 489, 490, 501, 61987,317, 1347, 382, 10422,3999, 2402, 317, 2146, 371, 62434,490, 2279, + 62415,343, 363, 4965, 466, 62417,371, 62418,490, 62420,2222, 317, 62419,317, 6191, 62421,62423,15872,62424,350, 62425,490, 2022, 4965, 317, 62427,370, + 5652, 317, 1459, 332, 2142, 62426,965, 62428,345, 472, 317, 489, 490, 501, 61987,317, 1347, 382, 10422,3999, 2402, 317, 2146, 371, 62434,490, 2279, 596, 317, 62436,62437,62444,62447,62469,62500,62511,62526,62528,62534,62538,62543,62544,62554,62573,62582,62587,62598,62599,62608,62665,62676,62678,62685,62687, - 62688,62438,317, 6504, 5737, 62440,62441,5223, 332, 62439,8020, 466, 317, 62442,62443,373, 62445,389, 343, 62446,62448,62451,62454,62456,62462,62464,4789, - 62468,341, 62449,62450,381, 41868,5930, 2381, 2145, 62452,17358,62453,62455,5238, 5988, 62457,62458,62461,1109, 3573, 62459,343, 62460,23267,7834, 5324, 6382, - 365, 399, 25696,62463,6108, 1347, 62188,62465,1999, 62466,5718, 62467,3649, 25361,62470,370, 62473,62482,2171, 62492,62493,3236, 62499,5054, 62471,5447, 5987, + 62688,62438,317, 6504, 5737, 62440,62441,5223, 332, 62439,8020, 466, 317, 62442,62443,373, 62445,389, 343, 62446,62448,62451,62454,62456,62462,62464,4789, + 62468,341, 62449,62450,381, 41868,5930, 2381, 2145, 62452,17358,62453,62455,5238, 5988, 62457,62458,62461,1109, 3573, 62459,343, 62460,23267,7834, 5324, 6382, + 365, 399, 25696,62463,6108, 1347, 62188,62465,1999, 62466,5718, 62467,3649, 25361,62470,370, 62473,62482,2171, 62492,62493,3236, 62499,5054, 62471,5447, 5987, 62472,62474,26135,62476,62479,62475,9141, 52847,62477,62478,62480,62481,62483,62487,62488,62484,62486,3854, 62485,5447, 434, 41483,356, 5847, 2510, 317, 62489, - 62490,62491,1325, 41090,62494,8178, 62495,62496,62497,21048,62498,7640, 466, 62501,426, 62505,317, 5120, 62509,317, 62502,62503,62504,62506,62507,317, 6265, - 62508,356, 21494,62510,62512,62516,62522,62524,62525,62513,9832, 447, 62514,62515,62517,62519,317, 62518,317, 34600,9482, 62520,3854, 5174, 317, 62521,2156, - 30039,62523,7858, 24883,5556, 2060, 2368, 332, 350, 62527,317, 62529,62531,317, 317, 2004, 427, 62530,62532,41737,62533,62535,6021, 2108, 62536,4738, 350, + 62490,62491,1325, 41090,62494,8178, 62495,62496,62497,21048,62498,7640, 466, 62501,426, 62505,317, 5120, 62509,317, 62502,62503,62504,62506,62507,317, 6265, + 62508,356, 21494,62510,62512,62516,62522,62524,62525,62513,9832, 447, 62514,62515,62517,62519,317, 62518,317, 34600,9482, 62520,3854, 5174, 317, 62521,2156, + 30039,62523,7858, 24883,5556, 2060, 2368, 332, 350, 62527,317, 62529,62531,317, 317, 2004, 427, 62530,62532,41737,62533,62535,6021, 2108, 62536,4738, 350, 350, 62537,2222, 317, 12934,362, 38877,62539,62540,62541,62542,5447, 433, 350, 52092,62545,62547,62550,16804,62551,62546,62548,62549,317, 62552,62553,62555, - 16854,62557,62560,62565,62571,28795,2143, 62556,6923, 7990, 62558,317, 62559,62561,2219, 1347, 9832, 62563,62562,317, 5447, 466, 9139, 62564,13914,62566,5365, + 16854,62557,62560,62565,62571,28795,2143, 62556,6923, 7990, 62558,317, 62559,62561,2219, 1347, 9832, 62563,62562,317, 5447, 466, 9139, 62564,13914,62566,5365, 62567,62568,62569,62570,62572,62574,343, 62575,350, 490, 62578,62580,62576,62577,317, 62579,62581,62583,566, 62584,4045, 62585,62586,5365, 1526, 62588,62591, 62595,62596,356, 62589,21669,62590,466, 62592,62594,24884,62593,21690,14983,62597,22163,48488,62600,62606,62601,62603,62602,62604,62605,62607,317, 62609,62610, - 62616,62623,62632,5611, 62633,62640,62641,62643,1044, 490, 965, 62644,62650,62659,62239,1526, 5788, 317, 62611,62612,62613,62614,62615,317, 317, 8395, 345, - 62617,3854, 62620,62621,62618,62619,62622,5717, 5553, 2551, 62624,62625,62627,1347, 26103,317, 2156, 62626,5254, 10422,466, 370, 317, 363, 62628,62629,8136, + 62616,62623,62632,5611, 62633,62640,62641,62643,1044, 490, 965, 62644,62650,62659,62239,1526, 5788, 317, 62611,62612,62613,62614,62615,317, 317, 8395, 345, + 62617,3854, 62620,62621,62618,62619,62622,5717, 5553, 2551, 62624,62625,62627,1347, 26103,317, 2156, 62626,5254, 10422,466, 370, 317, 363, 62628,62629,8136, 466, 62630,62631,9782, 2156, 5238, 62634,62635,62639,317, 62636,317, 5201, 62637,62638,317, 433, 317, 44056,6036, 62642,32092,428, 428, 10559,62645,62646, - 22079,362, 3987, 363, 62647,6089, 7035, 10878,62648,5447, 62649,382, 1526, 7888, 62651,9450, 62652,2022, 62655,62657,62658,317, 990, 62653,332, 9422, 317, - 62654,62656,22912,7368, 24638,2063, 62660,62663,2715, 41438,5447, 466, 62661,62662,5221, 5727, 62664,317, 62666,317, 2402, 62670,498, 62671,317, 62674,363, + 22079,362, 3987, 363, 62647,6089, 7035, 10878,62648,5447, 62649,382, 1526, 7888, 62651,9450, 62652,2022, 62655,62657,62658,317, 990, 62653,332, 9422, 317, + 62654,62656,22912,7368, 24638,2063, 62660,62663,2715, 41438,5447, 466, 62661,62662,5221, 5727, 62664,317, 62666,317, 2402, 62670,498, 62671,317, 62674,363, 62667,62669,381, 343, 25609,62668,6108, 1347, 5054, 62672,350, 62673,317, 49168,4249, 362, 62675,2117, 2117, 62677,62679,62680,62683,62684,22809,6265, 10820, 62681,381, 11962,490, 62682,41731,356, 9130, 317, 317, 32673,317, 7834, 5226, 343, 351, 62686,2117, 510, 317, 381, 5991, 466, 351, 317, 317, 62689, - 5241, 62690,62692,62695,62713,62718,62723,62724,536, 62725,62727,62745,62761,19872,62768,62778,345, 62786,317, 62797,62799,317, 317, 62691,62693,389, 343, + 5241, 62690,62692,62695,62713,62718,62723,62724,536, 62725,62727,62745,62761,19872,62768,62778,345, 62786,317, 62797,62799,317, 317, 62691,62693,389, 343, 2402, 554, 380, 62694,343, 62696,62710,62711,62712,317, 317, 2571, 317, 317, 62697,317, 62698,62699,62700,62701,62702,62703,62704,62705,62706,62707,62708, - 62709,551, 2117, 20496,11897,317, 370, 62714,62715,554, 317, 2171, 62717,317, 7990, 317, 2171, 317, 62716,317, 363, 381, 343, 317, 1998, 62719,317, + 62709,551, 2117, 20496,11897,317, 370, 62714,62715,554, 317, 2171, 62717,317, 7990, 317, 2171, 317, 62716,317, 363, 381, 343, 317, 1998, 62719,317, 317, 62720,5611, 351, 343, 6596, 317, 62721,62722,6089, 5661, 317, 1358, 2171, 1060, 62726,62728,62732,62736,2222, 62739,511, 5956, 62744,11636,13323,62729, 317, 2156, 62731,317, 62730,317, 317, 11144,317, 12001,10375,317, 62733,433, 62734,62735,5570, 382, 62737,62738,317, 62740,62743,317, 8178, 62741,62742, - 498, 343, 2317, 343, 490, 317, 1160, 62746,62754,317, 23192,62755,317, 62756,62757,62759,62747,62750,5942, 317, 740, 426, 370, 345, 62748,6382, 5612, - 317, 381, 62749,7567, 62751,62752,1347, 490, 9832, 62753,7865, 345, 5200, 370, 317, 428, 15510,343, 370, 23072,410, 62758,10877,31894,9479, 317, 1060, - 317, 317, 317, 5737, 6420, 317, 62760,382, 33467,343, 62762,1347, 62764,62763,317, 17768,2715, 317, 4944, 62765,317, 317, 345, 62766,62767,317, 345, + 498, 343, 2317, 343, 490, 317, 1160, 62746,62754,317, 23192,62755,317, 62756,62757,62759,62747,62750,5942, 317, 740, 426, 370, 345, 62748,6382, 5612, + 317, 381, 62749,7567, 62751,62752,1347, 490, 9832, 62753,7865, 345, 5200, 370, 317, 428, 15510,343, 370, 23072,410, 62758,10877,31894,9479, 317, 1060, + 317, 317, 317, 5737, 6420, 317, 62760,382, 33467,343, 62762,1347, 62764,62763,317, 17768,2715, 317, 4944, 62765,317, 317, 345, 62766,62767,317, 345, 1526, 10674,2275, 62769,47011,317, 62772,62773,1345, 62775,317, 62770,317, 345, 62771,10217,317, 7785, 62774,24304,2510, 317, 62776,62777,5793, 427, 62779, - 62782,1347, 62785,62780,551, 62781,380, 317, 5223, 62783,62784,62787,62793,62795,2117, 317, 370, 332, 5295, 62788,62789,62791,62792,2317, 62790,317, 317, + 62782,1347, 62785,62780,551, 62781,380, 317, 5223, 62783,62784,62787,62793,62795,2117, 317, 370, 332, 5295, 62788,62789,62791,62792,2317, 62790,317, 317, 14537,370, 317, 3079, 7888, 10674,62794,949, 371, 1358, 62796,7514, 62798,27238,1481, 62800,332, 62801,365, 317, 30300,317, 62802,62803,62804,62820,62845, 62861,62862,62883,62901,62907,62908,62913,62917,62931,62953,62960,62964,28974,62996,62998,63033,63067,63069,63093,63095,19744,63099,21833,332, 418, 62805,62814, 62815,62816,62819,381, 345, 317, 62806,5428, 62810,62807,6021, 62808,62809,2094, 5201, 317, 62811,62812,62813,317, 381, 5223, 317, 317, 382, 6163, 62817, - 62818,50042,317, 317, 62821,62823,62831,10506,27058,62833,62836,62838,433, 62841,62843,404, 62822,62824,62825,62826,490, 62829,62827,62828,62830,317, 5464, - 21470,2510, 62832,2402, 317, 1481, 1481, 62834,62835,345, 30514,6425, 317, 62837,12795,62839,28767,62840,351, 62842,40625,1347, 62844,2145, 5019, 466, 363, + 62818,50042,317, 317, 62821,62823,62831,10506,27058,62833,62836,62838,433, 62841,62843,404, 62822,62824,62825,62826,490, 62829,62827,62828,62830,317, 5464, + 21470,2510, 62832,2402, 317, 1481, 1481, 62834,62835,345, 30514,6425, 317, 62837,12795,62839,28767,62840,351, 62842,40625,1347, 62844,2145, 5019, 466, 363, 5174, 62846,62848,62849,62850,62847,380, 31029,1160, 7852, 332, 434, 17434,382, 62851,21518,62852,466, 62859,317, 62853,317, 62854,317, 5773, 62855,62856, 62857,62858,62860,317, 380, 748, 6204, 317, 62863,62865,62875,62876,62880,62882,365, 62864,883, 317, 5200, 490, 62866,490, 459, 351, 62867,5464, 62868, - 62874,382, 62869,62870,62871,11362,317, 62872,62873,370, 317, 17917,14535,62877,20589,62878,41483,62879,466, 317, 317, 62881,332, 25572,4773, 62884,7401, - 317, 62888,363, 62891,62885,62886,12957,317, 62887,7088, 363, 62889,62890,62892,62896,62893,317, 466, 62894,317, 62895,5394, 466, 373, 401, 62897,317, - 62898,5464, 62899,382, 5055, 62900,5477, 5343, 27851,62902,62906,62903,62904,62905,356, 21153,317, 62909,62910,381, 317, 62911,317, 356, 62912,2510, 317, + 62874,382, 62869,62870,62871,11362,317, 62872,62873,370, 317, 17917,14535,62877,20589,62878,41483,62879,466, 317, 317, 62881,332, 25572,4773, 62884,7401, + 317, 62888,363, 62891,62885,62886,12957,317, 62887,7088, 363, 62889,62890,62892,62896,62893,317, 466, 62894,317, 62895,5394, 466, 373, 401, 62897,317, + 62898,5464, 62899,382, 5055, 62900,5477, 5343, 27851,62902,62906,62903,62904,62905,356, 21153,317, 62909,62910,381, 317, 62911,317, 356, 62912,2510, 317, 2156, 382, 5515, 343, 30249,345, 62914,2108, 62916,62915,317, 317, 62918,62919,62924,62929,2027, 393, 62920,62921,62922,62923,62925,36314,62926,7222, 62927, 62928,7028, 62930,62932,62936,62939,62949,317, 62951,62933,317, 62934,62935,21046,62937,62938,5447, 466, 447, 317, 33232,317, 20629,348, 317, 62940,10196, - 5394, 62941,382, 62942,62943,62944,380, 317, 62945,62946,62947,62948,62950,5991, 466, 370, 317, 62952,19894,317, 62954,363, 317, 62955,332, 62958,5991, + 5394, 62941,382, 62942,62943,62944,380, 317, 62945,62946,62947,62948,62950,5991, 466, 370, 317, 62952,19894,317, 62954,363, 317, 62955,332, 62958,5991, 8948, 317, 317, 504, 741, 62956,9590, 62957,62959,62961,356, 466, 62962,317, 62963,62965,62971,62975,62980,14316,62991,5223, 62995,36217,62966,343, 62967, - 62968,62970,62969,317, 43834,5447, 5987, 351, 62972,13944,62974,317, 62973,317, 4267, 10422,466, 62976,381, 8151, 5201, 62977,62978,317, 62979,339, 317, + 62968,62970,62969,317, 43834,5447, 5987, 351, 62972,13944,62974,317, 62973,317, 4267, 10422,466, 62976,381, 8151, 5201, 62977,62978,317, 62979,339, 317, 317, 38563,536, 5399, 62981,62987,5336, 62982,62983,62984,62985,62986,356, 317, 18675,5550, 4564, 5447, 62988,382, 62989,62990,62992,317, 62993,317, 62994, - 448, 39546,317, 62997,53322,317, 62999,63000,63002,63010,370, 63012,63013,2222, 63019,63032,33717,317, 63001,20354,63003,63006,2391, 20372,63004,63005,1325, - 5113, 21886,63007,63008,63009,427, 511, 63011,343, 501, 5836, 498, 8470, 401, 2163, 380, 63014,63015,381, 63017,63016,356, 5395, 2510, 317, 345, 356, + 448, 39546,317, 62997,53322,317, 62999,63000,63002,63010,370, 63012,63013,2222, 63019,63032,33717,317, 63001,20354,63003,63006,2391, 20372,63004,63005,1325, + 5113, 21886,63007,63008,63009,427, 511, 63011,343, 501, 5836, 498, 8470, 401, 2163, 380, 63014,63015,381, 63017,63016,356, 5395, 2510, 317, 345, 356, 63018,6387, 317, 382, 370, 63020,63025,63026,63028,63030,63031,63021,8231, 63022,63023,63024,63027,34487,5748, 63029,24698,539, 63034,63038,63054,63055,63056, - 63064,450, 36697,7949, 63035,363, 332, 63037,63036,8081, 348, 63039,63041,25953,63046,63048,55765,63050,345, 7792, 317, 63040,63042,10172,63043,63044,317, - 1992, 30609,343, 63045,63047,23500,38438,63049,317, 8440, 63051,63052,10422,466, 1033, 317, 63053,25362,867, 4554, 332, 390, 317, 1915, 63057,40345,2033, - 1347, 63059,351, 63063,63058,63060,63061,1347, 63062,63065,63066,5717, 5167, 63068,317, 316, 33398,1345, 24398,11716,404, 370, 63070,63071,63076,63089,373, - 9095, 883, 971, 7990, 317, 63072,63075,317, 523, 63073,317, 63074,380, 317, 350, 332, 63077,605, 63081,63085,381, 63078,63080,317, 63079,1347, 317, + 63064,450, 36697,7949, 63035,363, 332, 63037,63036,8081, 348, 63039,63041,25953,63046,63048,55765,63050,345, 7792, 317, 63040,63042,10172,63043,63044,317, + 1992, 30609,343, 63045,63047,23500,38438,63049,317, 8440, 63051,63052,10422,466, 1033, 317, 63053,25362,867, 4554, 332, 390, 317, 1915, 63057,40345,2033, + 1347, 63059,351, 63063,63058,63060,63061,1347, 63062,63065,63066,5717, 5167, 63068,317, 316, 33398,1345, 24398,11716,404, 370, 63070,63071,63076,63089,373, + 9095, 883, 971, 7990, 317, 63072,63075,317, 523, 63073,317, 63074,380, 317, 350, 332, 63077,605, 63081,63085,381, 63078,63080,317, 63079,1347, 317, 7098, 317, 4984, 382, 63082,1347, 317, 317, 317, 63083,63084,63086,317, 490, 63087,63088,5701, 356, 466, 317, 63090,5717, 7035, 393, 22542,317, 63091, - 63092,1444, 21036,2369, 63094,34170,1358, 63096,317, 345, 63097,63098,397, 317, 63101,63103,63109,26065,390, 63112,2503, 317, 63113,63115,63116,63118,6318, - 63119,63102,433, 501, 63104,63107,427, 317, 63105,317, 5819, 63106,317, 433, 370, 63108,63110,63111,2117, 5223, 317, 63114,15058,370, 345, 590, 1109, + 63092,1444, 21036,2369, 63094,34170,1358, 63096,317, 345, 63097,63098,397, 317, 63101,63103,63109,26065,390, 63112,2503, 317, 63113,63115,63116,63118,6318, + 63119,63102,433, 501, 63104,63107,427, 317, 63105,317, 5819, 63106,317, 433, 370, 63108,63110,63111,2117, 5223, 317, 63114,15058,370, 345, 590, 1109, 2381, 317, 317, 371, 317, 490, 11347,13638,8213, 317, 63117,1108, 2402, 351, 317, 450, 63121,2117, 63123,343, 343, 4965, 466, 2272, 351, 63124,63125, 63127,63130,63141,63128,63129,63131,2503, 63133,63136,36917,63139,63132,371, 63134,63135,63137,63138,63140,9573, 450, 63142,35333,63145,63143,14806,45844,63144, - 320, 63147,63153,63157,63158,63159,63158,63160,63158,63163,63166,63189,8281, 365, 63196,63198,363, 63199,63200,63203,63251,63148,1277, 63150,30285,63152,317, - 63149,620, 619, 63151,619, 30285,63154,740, 63150,63155,619, 30285,63156,619, 740, 63150,63152,619, 63152,619, 63150,619, 63161,63162,317, 63164,1347, + 320, 63147,63153,63157,63158,63159,63158,63160,63158,63163,63166,63189,8281, 365, 63196,63198,363, 63199,63200,63203,63251,63148,1277, 63150,30285,63152,317, + 63149,620, 619, 63151,619, 30285,63154,740, 63150,63155,619, 30285,63156,619, 740, 63150,63152,619, 63152,619, 63150,619, 63161,63162,317, 63164,1347, 63165,350, 63167,345, 63168,63169,63170,10664,63171,20623,63175,63176,63178,63181,63183,63188,63172,63173,63174,63177,63179,63180,63182,63184,63185,63186,63187, 343, 10069,8170, 63190,63194,317, 63195,63191,63192,59217,63193,317, 7043, 63197,1347, 317, 381, 317, 551, 63201,63202,63204,63249,63250,63205,317, 63206, 63209,63212,63215,63207,63208,63210,5700, 63211,63213,63214,317, 51326,63216,63222,63224,8681, 63225,63230,63231,63239,63242,4788, 63217,63218,63219,63220,63221, - 9547, 343, 63223,2546, 8926, 13945,63226,63229,63227,63228,8815, 2145, 63232,63235,63233,63234,339, 10252,317, 317, 63236,63237,63238,63240,345, 63241,498, - 5640, 63243,5732, 63248,63244,63245,63246,63247,19562,6514, 317, 490, 9825, 63253,63257,63258,63270,63274,1912, 63276,63277,356, 1791, 63281,971, 317, 317, + 9547, 343, 63223,2546, 8926, 13945,63226,63229,63227,63228,8815, 2145, 63232,63235,63233,63234,339, 10252,317, 317, 63236,63237,63238,63240,345, 63241,498, + 5640, 63243,5732, 63248,63244,63245,63246,63247,19562,6514, 317, 490, 9825, 63253,63257,63258,63270,63274,1912, 63276,63277,356, 1791, 63281,971, 317, 317, 63254,63255,63256,14561,63259,63260,63261,63269,63262,57555,63265,63263,63264,21786,63266,63267,63268,63271,63272,63273,63275,63278,2022, 63279,63280,63282,63283, 63284,63285,63286,317, 63287,63302,63312,63323,63332,63344,63349,63352,63355,63356,63359,63390,63402,63436,63437,63443,63499,63520,63541,63542,63544,1042, 63288, 22685,63292,1526, 317, 397, 63289,63290,63291,63293,63294,965, 26662,345, 317, 63295,63299,63300,370, 317, 317, 63296,63297,63298,418, 317, 5167, 63301, 370, 5441, 1325, 466, 1347, 11986,63303,11855,63305,63308,63309,6993, 63304,20207,60502,317, 63306,63307,63310,63311,2184, 5223, 2334, 355, 63313,11663,63318, 11346,466, 2022, 63319,63314,63316,2156, 317, 63315,317, 63317,61976,63320,63321,63322,63324,7865, 2298, 17677,20245,63325,2022, 22641,63329,63326,1347, 63327, - 63328,63330,63331,63333,63340,543, 63334,63335,63337,317, 1160, 317, 63336,317, 381, 63338,63339,317, 317, 63341,63342,63343,63345,2077, 63346,317, 363, - 63347,2609, 27199,3387, 63348,44088,393, 365, 2381, 317, 7949, 63350,63351,6993, 63353,317, 63354,490, 343, 2368, 23883,490, 4564, 317, 63357,63358,317, + 63328,63330,63331,63333,63340,543, 63334,63335,63337,317, 1160, 317, 63336,317, 381, 63338,63339,317, 317, 63341,63342,63343,63345,2077, 63346,317, 363, + 63347,2609, 27199,3387, 63348,44088,393, 365, 2381, 317, 7949, 63350,63351,6993, 63353,317, 63354,490, 343, 2368, 23883,490, 4564, 317, 63357,63358,317, 37152,7850, 1992, 63360,63361,63363,63364,63365,554, 63366,63368,63370,63376,1347, 63380,965, 63382,63386,63387,350, 2081, 5428, 3284, 317, 370, 63362,46591, - 490, 332, 317, 490, 3750, 351, 551, 2022, 63367,343, 332, 317, 1135, 5890, 44631,63369,63371,1194, 63372,63373,362, 63374,317, 63375,317, 317, 357, + 490, 332, 317, 490, 3750, 351, 551, 2022, 63367,343, 332, 317, 1135, 5890, 44631,63369,63371,1194, 63372,63373,362, 63374,317, 63375,317, 317, 357, 1109, 317, 317, 1347, 317, 1347, 5332, 317, 26123,317, 63377,63378,63379,63381,317, 6089, 63383,5447, 63385,1347, 63384,46013,31999,317, 9573, 317, 63388, 63389,8557, 6203, 63391,63392,63393,1020, 63394,63397,6974, 317, 63395,428, 63396,5991, 63398,63399,63400,317, 448, 2022, 1992, 2705, 363, 63401,63403,63404, 63410,9657, 63411,488, 63412,63418,63420,511, 317, 317, 63426,63432,317, 332, 589, 1444, 5838, 63405,63407,9443, 63406,466, 2271, 317, 42197,63408,63409, 5717, 365, 4268, 1194, 317, 2369, 536, 317, 63413,63414,63416,63415,410, 12925,466, 5399, 63417,63419,476, 351, 10476,63421,63422,317, 32024,384, 63423, 63424,63425,2036, 63427,63429,63431,4952, 317, 317, 382, 63428,317, 63430,63433,63434,63435,2322, 44631,63438,388, 4564, 1020, 317, 63439,12668,514, 63440, - 43090,317, 63442,317, 63441,63444,63447,63448,63452,63453,63456,63457,63459,63467,8392, 63470,63471,63473,63482,63483,63488,63491,63495,1020, 12429,63498,317, + 43090,317, 63442,317, 63441,63444,63447,63448,63452,63453,63456,63457,63459,63467,8392, 63470,63471,63473,63482,63483,63488,63491,63495,1020, 12429,63498,317, 63445,7823, 370, 2187, 63446,339, 317, 384, 12291,63449,63450,63451,370, 10476,5332, 11564,317, 2247, 63454,12691,4982, 370, 63455,317, 381, 63458,20539, 466, 404, 41998,63460,317, 63462,63463,63464,63461,370, 2184, 5488, 10422,317, 317, 2067, 404, 2845, 1347, 63465,317, 63466,28417,317, 63468,16024,63469, - 2551, 381, 317, 12642,345, 317, 428, 40385,317, 63472,63474,63476,63481,63475,389, 637, 8258, 317, 317, 633, 1155, 63477,63479,317, 63478,6028, 466, - 317, 63480,434, 317, 10891,370, 317, 63484,63485,17919,63486,3987, 6266, 5394, 63487,382, 1347, 2368, 63489,428, 63490,317, 59020,5241, 63492,63493,317, + 2551, 381, 317, 12642,345, 317, 428, 40385,317, 63472,63474,63476,63481,63475,389, 637, 8258, 317, 317, 633, 1155, 63477,63479,317, 63478,6028, 466, + 317, 63480,434, 317, 10891,370, 317, 63484,63485,17919,63486,3987, 6266, 5394, 63487,382, 1347, 2368, 63489,428, 63490,317, 59020,5241, 63492,63493,317, 63494,317, 63496,63497,317, 12958,523, 605, 596, 317, 380, 11146,63500,46568,370, 63501,63508,63510,317, 63512,317, 370, 971, 63502,48475,8020, 63503, 63504,63505,63507,490, 2063, 317, 1992, 882, 317, 63506,63509,63511,6036, 2156, 370, 63513,63514,24695,317, 63515,317, 1353, 317, 317, 63516,16626,20591, 8125, 433, 2631, 63517,362, 317, 317, 621, 343, 2107, 370, 63518,61116,63519,1347, 5126, 63521,1459, 63525,63527,18406,362, 63532,63533,63534,7940, 63536, 63539,63540,363, 59178,63522,63523,5241, 11831,21834,317, 63524,63526,63528,3529, 63529,63530,63531,24192,370, 63535,356, 63537,351, 19284,363, 317, 63538, 317, 7805, 63543,565, 317, 317, 63545,4984, 33469,490, 63547,63549,63548,63551,2387, 63553,63552,63555,63556,63557,63559,63561,63563,63564,63568,63571,63573, 343, 63574,63576,63577,63580,63581,63598,63599,33549,3987, 351, 13638,63560,381, 63562,2117, 63565,317, 574, 63566,63567,2533, 351, 63569,63570,427, 19578, - 63572,12588,596, 317, 34149,2012, 63575,44630,1347, 365, 317, 10480,1347, 63578,351, 63579,63582,741, 63587,2086, 63590,8254, 63592,63596,63597,35429,5481, - 63583,7577, 63584,317, 345, 63585,317, 317, 380, 63586,317, 63588,63589,2271, 63591,343, 42074,23107,52146,317, 58241,317, 63593,15540,63594,63595,380, + 63572,12588,596, 317, 34149,2012, 63575,44630,1347, 365, 317, 10480,1347, 63578,351, 63579,63582,741, 63587,2086, 63590,8254, 63592,63596,63597,35429,5481, + 63583,7577, 63584,317, 345, 63585,317, 317, 380, 63586,317, 63588,63589,2271, 63591,343, 42074,23107,52146,317, 58241,317, 63593,15540,63594,63595,380, 63600,332, 63605,63601,11809,20684,63602,63603,63604,8296, 63606,63608,63609,63610,63648,63654,63656,1242, 63659,63661,63665,63667,63727,63729,63737,63739,63744, 63747,63749,63751,63767,63775,6402, 63778,63787,63806,63809,226, 64038,64041,64104,63611,63614,63623,63626,63632,63612,63613,63615,63620,949, 63616,63617,63618, 317, 63619,317, 63621,63622,63624,63625,63627,63628,63629,63630,63631,1080, 63633,63634,63635,63636,63637,63638,63639,63640,63641,63642,63643,63644,63645,63646, 63647,1111, 63649,63650,63651,63652,63653,63655,63657,63658,4881, 63660,63662,63663,63664,63666,63668,63669,6935, 63670,63671,11833,565, 63672,565, 63674,23183, - 63675,63677,63680,3429, 63681,63689,63690,350, 24310,365, 3611, 63673,390, 63676,4925, 317, 3236, 317, 343, 490, 63678,15766,317, 63679,1526, 6334, 396, + 63675,63677,63680,3429, 63681,63689,63690,350, 24310,365, 3611, 63673,390, 63676,4925, 317, 3236, 317, 343, 490, 63678,15766,317, 63679,1526, 6334, 396, 63682,13457,63683,63684,949, 63685,63686,63687,63688,317, 315, 741, 63691,63698,936, 767, 63702,317, 2464, 8224, 63705,63707,1020, 63710,63719,4336, 63692, 63696,63693,315, 1251, 2462, 63694,63695,63697,63699,63700,63701,63703,63704,63706,343, 63708,63709,317, 63711,63712,63713,317, 63714,317, 5071, 63715,63716, 1266, 63717,63718,63720,351, 63722,51456,63721,63723,1266, 5942, 63724,63725,63726,949, 19097,1999, 63728,63730,63731,63732,63734,63733,63735,63736,63738,63740, @@ -10943,48 +10938,48 @@ static const unsigned int ChildLocs[185261] = 25970,2178, 317, 343, 6578, 63842,63843,523, 370, 363, 63845,466, 317, 317, 317, 63824,6468, 317, 63847,1345, 6599, 63848,6578, 345, 317, 63849,63851, 63850,2184, 21833,596, 1160, 390, 343, 63854,317, 317, 63855,63856,63864,448, 12731,317, 317, 63857,317, 1548, 63860,8023, 45496,63858,63859,332, 63861, 63863,7888, 63862,2184, 410, 5488, 8020, 21833,596, 317, 63865,63866,63868,23178,1347, 596, 45011,63871,63875,63869,63870,317, 25651,317, 63872,17897,63874, - 63873,356, 466, 5487, 16931,63876,63877,63885,317, 63886,63887,63878,1347, 5960, 10487,356, 63879,466, 370, 63883,317, 63880,63881,63882,63884,6188, 317, - 349, 317, 36710,2510, 7618, 63889,63890,20509,356, 343, 2584, 63891,63893,63896,63901,2146, 63894,317, 5872, 63895,448, 5054, 63897,63898,317, 5055, 332, + 63873,356, 466, 5487, 16931,63876,63877,63885,317, 63886,63887,63878,1347, 5960, 10487,356, 63879,466, 370, 63883,317, 63880,63881,63882,63884,6188, 317, + 349, 317, 36710,2510, 7618, 63889,63890,20509,356, 343, 2584, 63891,63893,63896,63901,2146, 63894,317, 5872, 63895,448, 5054, 63897,63898,317, 5055, 332, 20310,63899,63900,63902,63903,2211, 63904,317, 11388,343, 317, 343, 12417,63908,63911,19833,63916,63918,63929,490, 63930,317, 63933,28795,63935,63942,63947, 63953,5608, 63954,1345, 63909,317, 370, 63910,428, 63912,63915,63913,9303, 1033, 63914,63917,317, 2022, 63919,63928,1347, 317, 63920,63923,4965, 343, 63924, - 317, 317, 63921,63922,343, 7064, 317, 63925,16112,10641,63926,63927,11782,1230, 7590, 867, 448, 390, 2610, 63931,317, 63932,466, 63934,17955,9064, 490, - 12732,63936,63938,63939,1347, 5661, 63940,2184, 63937,345, 2086, 17883,5611, 5464, 317, 317, 63941,2004, 23078,23078,15066,317, 63943,317, 63944,7073, 351, + 317, 317, 63921,63922,343, 7064, 317, 63925,16112,10641,63926,63927,11782,1230, 7590, 867, 448, 390, 2610, 63931,317, 63932,466, 63934,17955,9064, 490, + 12732,63936,63938,63939,1347, 5661, 63940,2184, 63937,345, 2086, 17883,5611, 5464, 317, 317, 63941,2004, 23078,23078,15066,317, 63943,317, 63944,7073, 351, 61418,63945,63946,410, 356, 466, 12275,317, 15117,63948,63949,63950,63951,19194,63952,36641,466, 63955,63956,363, 1109, 1588, 63958,63960,63962,63969,63970, - 63972,54831,63973,63975,63978,63983,63984,64005,965, 64006,64012,64013,64017,64018,64019,63959,490, 332, 373, 13338,63961,23819,63963,317, 63964,343, 6021, - 2571, 63965,4789, 317, 317, 5363, 317, 381, 63966,370, 63967,63968,345, 16620,351, 2022, 317, 317, 332, 28548,63971,317, 24398,2022, 370, 362, 317, + 63972,54831,63973,63975,63978,63983,63984,64005,965, 64006,64012,64013,64017,64018,64019,63959,490, 332, 373, 13338,63961,23819,63963,317, 63964,343, 6021, + 2571, 63965,4789, 317, 317, 5363, 317, 381, 63966,370, 63967,63968,345, 16620,351, 2022, 317, 317, 332, 28548,63971,317, 24398,2022, 370, 362, 317, 345, 8083, 2022, 63974,63976,63977,46516,345, 63979,63981,596, 363, 32258,365, 40712,63980,363, 45787,63982,362, 317, 54827,1992, 370, 381, 350, 63985, 370, 63986,2537, 63987,2272, 317, 63988,63990,63992,63993,365, 397, 3505, 53186,5241, 317, 43566,317, 363, 370, 63989,317, 371, 362, 317, 363, 14174, - 63991,317, 8968, 63994,63996,64001,21269,317, 64002,2272, 363, 317, 63995,356, 317, 4965, 15071,317, 1109, 317, 9595, 63997,1347, 63998,63999,64000,343, - 30039,64003,317, 64004,64007,317, 64008,22699,64011,574, 317, 574, 64009,363, 380, 64010,317, 317, 345, 23078,511, 343, 317, 64014,362, 317, 317, + 63991,317, 8968, 63994,63996,64001,21269,317, 64002,2272, 363, 317, 63995,356, 317, 4965, 15071,317, 1109, 317, 9595, 63997,1347, 63998,63999,64000,343, + 30039,64003,317, 64004,64007,317, 64008,22699,64011,574, 317, 574, 64009,363, 380, 64010,317, 317, 345, 23078,511, 343, 317, 64014,362, 317, 317, 64015,64016,2510, 3999, 350, 2291, 2291, 14537,1108, 8230, 565, 19922,363, 64020,6334, 362, 64024,60804,317, 317, 18244,64026,64027,345, 64028,64031,64029, - 5447, 317, 64030,4267, 382, 50012,64033,6851, 317, 32468,5746, 389, 64035,64039,64040,64042,19187,64045,64050,64101,64103,64043,64044,49086,605, 64046,351, + 5447, 317, 64030,4267, 382, 50012,64033,6851, 317, 32468,5746, 389, 64035,64039,64040,64042,19187,64045,64050,64101,64103,64043,64044,49086,605, 64046,351, 64047,64048,1300, 64049,605, 339, 3230, 64051,936, 866, 736, 64055,64060,1276, 958, 64064,64066,64100,2856, 64052,64053,936, 64054,3502, 945, 397, 64056, 64057,1266, 945, 64058,64059,64061,64062,64063,1108, 64065,64067,1302, 64069,9965, 64072,1394, 317, 64068,633, 7156, 64070,64071,9967, 621, 1309, 64073,64080, - 64081,64082,64099,64074,64075,64076,64077,64078,64079,64083,64084,64087,64088,317, 889, 8344, 64089,27446,20008,64090,64093,64098,317, 1018, 1160, 64085,317, + 64081,64082,64099,64074,64075,64076,64077,64078,64079,64083,64084,64087,64088,317, 889, 8344, 64089,27446,20008,64090,64093,64098,317, 1018, 1160, 64085,317, 64086,732, 317, 317, 317, 64091,64092,6228, 317, 64094,317, 64095,64096,64097,1430, 2856, 64102,64105,64106,64107,64108,64109,64113,64114,64121,64128,64131, - 228, 64787,64795,64798,229, 65995,66066,234, 66470,66516,66523,66527,66528,235, 67127,67128,67135,67142,237, 67396,67401,67403,67405,67443,4797, 64110,4798, + 228, 64787,64795,64798,229, 65995,66066,234, 66470,66516,66523,66527,66528,235, 67127,67128,67135,67142,237, 67396,67401,67403,67405,67443,4797, 64110,4798, 4797, 64112,4797, 4797, 4798, 4797, 64111,637, 11091,2515, 64115,64116,64117,64118,64119,64120,64122,64125,64123,64124,64126,64127,64129,64130,64132,64133,64134, - 64136,64156,64194,64260,64264,64278,64299,64306,64349,64382,64397,64405,64488,64545,64546,64583,64586,64592,64634,64696,64721,64742,349, 64754,64774,1358, 317, - 317, 317, 317, 317, 317, 64135,1100, 64137,64139,64144,64147,29108,1020, 350, 64153,501, 17889,64155,317, 362, 332, 317, 12371,317, 64138,24908,317, + 64136,64156,64194,64260,64264,64278,64299,64306,64349,64382,64397,64405,64488,64545,64546,64583,64586,64592,64634,64696,64721,64742,349, 64754,64774,1358, 317, + 317, 317, 317, 317, 317, 64135,1100, 64137,64139,64144,64147,29108,1020, 350, 64153,501, 17889,64155,317, 362, 332, 317, 12371,317, 64138,24908,317, 380, 64140,317, 64141,343, 64142,317, 64143,574, 9548, 6996, 2767, 8451, 317, 317, 371, 380, 64145,64146,4984, 317, 2163, 357, 317, 317, 384, 16464, 578, 9012, 317, 64148,345, 317, 64149,357, 10471,7990, 64150,317, 64152,64151,8178, 10626,16277,363, 356, 317, 363, 64154,371, 317, 363, 343, 64157, - 64159,64160,64170,64179,64183,64187,64189,317, 64193,64158,64161,357, 362, 64166,64167,64168,317, 64169,1230, 317, 64162,64164,64163,64165,1347, 339, 1943, - 5960, 343, 64171,64172,5447, 1020, 64174,45865,317, 317, 380, 64173,637, 317, 633, 317, 317, 1358, 317, 64175,64176,64177,64178,5701, 55019,3869, 2163, + 64159,64160,64170,64179,64183,64187,64189,317, 64193,64158,64161,357, 362, 64166,64167,64168,317, 64169,1230, 317, 64162,64164,64163,64165,1347, 339, 1943, + 5960, 343, 64171,64172,5447, 1020, 64174,45865,317, 317, 380, 64173,637, 317, 633, 317, 317, 1358, 317, 64175,64176,64177,64178,5701, 55019,3869, 2163, 64180,64181,5250, 64182,551, 64184,554, 7871, 64186,5926, 317, 317, 345, 64185,14644,317, 317, 64188,363, 64190,64191,317, 64192,371, 23624,11347,64195, - 5270, 64197,64199,64200,2024, 64204,64206,343, 64239,64240,64242,64243,64249,553, 64250,2589, 64253,357, 64256,7698, 16603,64196,10578,8446, 1108, 351, 8177, - 64198,39047,7010, 5309, 7866, 343, 7698, 3284, 317, 1358, 5105, 64201,317, 363, 64203,17095,64202,419, 350, 317, 64205,1481, 64207,64212,317, 362, 317, - 2381, 317, 64215,64238,2108, 1700, 317, 64208,64209,64210,317, 5447, 64211,2510, 382, 5616, 343, 64213,317, 317, 317, 317, 64214,317, 317, 7887, 370, - 317, 6228, 40388,64216,356, 64219,64223,22240,64228,55898,64231,64232,20103,64235,41013,64217,64218,64220,64221,64222,64224,64225,64226,64227,64229,64230,363, - 11978,64233,64234,1194, 64236,64237,1078, 8177, 404, 317, 12142,11347,3529, 64241,351, 419, 380, 317, 6036, 11146,32685,64244,1109, 64246,64248,317, 351, + 5270, 64197,64199,64200,2024, 64204,64206,343, 64239,64240,64242,64243,64249,553, 64250,2589, 64253,357, 64256,7698, 16603,64196,10578,8446, 1108, 351, 8177, + 64198,39047,7010, 5309, 7866, 343, 7698, 3284, 317, 1358, 5105, 64201,317, 363, 64203,17095,64202,419, 350, 317, 64205,1481, 64207,64212,317, 362, 317, + 2381, 317, 64215,64238,2108, 1700, 317, 64208,64209,64210,317, 5447, 64211,2510, 382, 5616, 343, 64213,317, 317, 317, 317, 64214,317, 317, 7887, 370, + 317, 6228, 40388,64216,356, 64219,64223,22240,64228,55898,64231,64232,20103,64235,41013,64217,64218,64220,64221,64222,64224,64225,64226,64227,64229,64230,363, + 11978,64233,64234,1194, 64236,64237,1078, 8177, 404, 317, 12142,11347,3529, 64241,351, 419, 380, 317, 6036, 11146,32685,64244,1109, 64246,64248,317, 351, 64245,8177, 64247,317, 16067,8177, 363, 9768, 371, 370, 2584, 1459, 64251,490, 64252,43000,317, 17588,64254,384, 64255,317, 8177, 64257,363, 64258,64259, - 2402, 8275, 2366, 64261,350, 317, 380, 57760,64262,350, 12417,64263,380, 479, 2272, 404, 46214,490, 317, 64265,39137,64268,64273,490, 64274,64277,8522, + 2402, 8275, 2366, 64261,350, 317, 380, 57760,64262,350, 12417,64263,380, 479, 2272, 404, 46214,490, 317, 64265,39137,64268,64273,490, 64274,64277,8522, 18232,317, 380, 64266,64267,317, 317, 332, 3284, 363, 5032, 64269,64272,22157,2156, 7916, 64270,64271,365, 5120, 317, 64275,64276,22021,466, 317, 64279, - 11158,38951,64280,64283,64289,64291,362, 64292,64294,11945,64296,64297,3646, 5055, 1347, 1347, 317, 1109, 7399, 317, 64281,64282,317, 64284,64286,64285,4984, + 11158,38951,64280,64283,64289,64291,362, 64292,64294,11945,64296,64297,3646, 5055, 1347, 1347, 317, 1109, 7399, 317, 64281,64282,317, 64284,64286,64285,4984, 17658,64287,64288,2288, 7939, 64290,7389, 317, 363, 605, 64293,15778,317, 10538,380, 35916,64295,7095, 381, 2060, 1060, 370, 380, 490, 64298,64300,64301, 64302,317, 64303,2222, 2410, 317, 64305,1230, 427, 5105, 5217, 5241, 317, 427, 490, 370, 390, 317, 6814, 64304,345, 466, 5120, 353, 317, 373, 64307, 64309,64312,64313,64315,64316,64326,64329,64343,1444, 2070, 64344,64348,64308,64310,64282,317, 317, 317, 64311,6996, 8248, 6829, 551, 64314,25563,1347, 39134, 317, 64317,13914,64318,64319,10877,370, 57507,64320,64322,64323,64324,12348,355, 64321,64325,2366, 351, 317, 64327,64328,317, 64330,64333,64334,22796,64335, - 6917, 64338,64339,64340,317, 2272, 64342,15334,5037, 15952,27235,3124, 64331,381, 381, 64332,10487,24393,523, 382, 25545,4563, 64336,64337,317, 6514, 390, + 6917, 64338,64339,64340,317, 2272, 64342,15334,5037, 15952,27235,3124, 64331,381, 381, 64332,10487,24393,523, 382, 25545,4563, 64336,64337,317, 6514, 390, 1030, 428, 7419, 382, 64341,6917, 1160, 317, 10487,390, 5394, 64345,15745,64347,490, 2087, 64346,29679,317, 317, 11040,317, 317, 64350,24814,64369,64371, 64374,64375,64376,64378,64381,565, 317, 5173, 490, 317, 64351,64357,365, 490, 64361,64362,64366,64368,317, 64352,64353,64354,64355,64356,64358,64359,64360, 64363,64364,64365,64367,490, 317, 11052,1044, 64370,46486,5836, 64372,317, 64373,5223, 46188,64377,64379,64380,345, 64383,47902,64387,64388,64390,64393,64395, @@ -10992,130 +10987,130 @@ static const unsigned int ChildLocs[185261] = 317, 363, 64401,317, 64402,1999, 5483, 5464, 4980, 23533,317, 466, 64404,64406,655, 64407,64425,64434,64438,64439,362, 64444,64446,64454,64455,64458,64460, 64464,64467,64469,64475,64477,64485,64486,1109, 64487,64408,64411,64413,317, 64414,64415,64416,64417,332, 3717, 64422,317, 1460, 36617,362, 64409,64410,64412, 317, 5570, 317, 345, 351, 11496,345, 332, 317, 2533, 64418,317, 317, 55364,64419,64420,64421,317, 44098,2593, 64423,64424,64426,64427,363, 64428,64429, - 64432,590, 11235,317, 26121,9648, 6228, 317, 343, 317, 64430,64431,971, 64433,317, 64435,64436,12226,64437,590, 64440,7403, 64441,64443,489, 317, 317, - 317, 5017, 6999, 5392, 64442,317, 351, 317, 596, 19733,10994,380, 64445,1100, 64447,64449,64450,64451,64453,64448,64452,1108, 317, 363, 381, 404, 317, - 64456,64457,64459,351, 363, 5991, 466, 64461,64462,64463,64465,8484, 317, 565, 64466,545, 393, 2272, 64468,1230, 317, 565, 2227, 317, 317, 8243, 489, + 64432,590, 11235,317, 26121,9648, 6228, 317, 343, 317, 64430,64431,971, 64433,317, 64435,64436,12226,64437,590, 64440,7403, 64441,64443,489, 317, 317, + 317, 5017, 6999, 5392, 64442,317, 351, 317, 596, 19733,10994,380, 64445,1100, 64447,64449,64450,64451,64453,64448,64452,1108, 317, 363, 381, 404, 317, + 64456,64457,64459,351, 363, 5991, 466, 64461,64462,64463,64465,8484, 317, 565, 64466,545, 393, 2272, 64468,1230, 317, 565, 2227, 317, 317, 8243, 489, 64470,64472,433, 466, 64474,317, 404, 46591,317, 64471,472, 317, 381, 4268, 317, 64473,317, 1108, 7196, 64476,64478,64480,64481,64482,9624, 2413, 64483, - 350, 18420,64484,350, 317, 2351, 64479,317, 38850,4949, 317, 317, 317, 351, 2222, 36461,351, 5205, 6674, 64489,5022, 64495,64501,64511,64512,64513,317, - 64522,64523,64530,64533,64535,345, 64538,64541,64542,64544,11307,343, 317, 7878, 317, 64490,64491,64493,64494,64492,64496,1347, 64497,64500,317, 6450, 2291, - 2715, 317, 64498,7871, 1347, 64499,317, 317, 490, 1347, 317, 64502,64503,11114,64504,1358, 25883,64505,64507,2705, 33936,317, 2391, 64510,1020, 380, 5105, + 350, 18420,64484,350, 317, 2351, 64479,317, 38850,4949, 317, 317, 317, 351, 2222, 36461,351, 5205, 6674, 64489,5022, 64495,64501,64511,64512,64513,317, + 64522,64523,64530,64533,64535,345, 64538,64541,64542,64544,11307,343, 317, 7878, 317, 64490,64491,64493,64494,64492,64496,1347, 64497,64500,317, 6450, 2291, + 2715, 317, 64498,7871, 1347, 64499,317, 317, 490, 1347, 317, 64502,64503,11114,64504,1358, 25883,64505,64507,2705, 33936,317, 2391, 64510,1020, 380, 5105, 7399, 6901, 351, 64506,64508,64509,317, 6228, 21506,370, 2571, 317, 18500,317, 1078, 15388,317, 551, 317, 46661,64514,64517,64521,2402, 404, 1444, 64515, 64516,317, 64518,15821,64519,317, 23928,22650,1160, 317, 317, 53862,1615, 320, 27446,541, 64520,382, 2110, 11147,317, 5483, 36710,3688, 490, 363, 64524, 64525,64526,317, 64527,64528,64529,1325, 8948, 64531,317, 64532,64534,6486, 64536,317, 7940, 64537,317, 24399,64539,3987, 2024, 57308,350, 64540,5898, 38850, 4949, 55092,48846,46954,466, 317, 317, 64543,317, 39602,401, 396, 380, 64547,64548,64551,64557,64560,14121,64561,64562,4980, 64578,64582,3284, 25975,20532, 3869, 3075, 317, 64549,343, 317, 64550,64552,317, 64554,343, 64553,64555,64556,64558,351, 1992, 64559,317, 363, 1347, 397, 370, 317, 317, 363, 13908, 7672, 3075, 9680, 5611, 64563,64566,466, 64569,64572,64575,64564,39002,64565,317, 8519, 39569,64567,64568,64570,64571,356, 64573,64574,64576,64577,1347, 64579, - 64581,64580,637, 317, 320, 1160, 5570, 43879,2533, 64584,64585,317, 30821,7871, 64587,64588,64589,64591,317, 24570,370, 317, 381, 317, 371, 404, 382, - 64590,363, 596, 317, 433, 22621,64593,64594,64595,64597,64599,64600,64612,64613,2022, 64614,64617,64618,64619,64622,64627,64633,501, 5623, 439, 10429,2110, + 64581,64580,637, 317, 320, 1160, 5570, 43879,2533, 64584,64585,317, 30821,7871, 64587,64588,64589,64591,317, 24570,370, 317, 381, 317, 371, 404, 382, + 64590,363, 596, 317, 433, 22621,64593,64594,64595,64597,64599,64600,64612,64613,2022, 64614,64617,64618,64619,64622,64627,64633,501, 5623, 439, 10429,2110, 448, 12138,64596,29210,7850, 317, 5687, 7865, 64598,370, 52725,317, 317, 64601,365, 64602,64604,64606,365, 3645, 64608,427, 317, 64603,317, 317, 64605, - 64607,317, 4943, 861, 64609,64610,5619, 64611,317, 1345, 363, 64615,64616,553, 14289,14744,64620,64621,2027, 317, 64623,14144,64625,539, 317, 64624,317, - 363, 64626,64628,64631,1020, 64632,345, 317, 842, 633, 64629,362, 317, 381, 64630,565, 6402, 317, 349, 365, 2577, 380, 357, 64635,64638,64639,2077, + 64607,317, 4943, 861, 64609,64610,5619, 64611,317, 1345, 363, 64615,64616,553, 14289,14744,64620,64621,2027, 317, 64623,14144,64625,539, 317, 64624,317, + 363, 64626,64628,64631,1020, 64632,345, 317, 842, 633, 64629,362, 317, 381, 64630,565, 6402, 317, 349, 365, 2577, 380, 357, 64635,64638,64639,2077, 64642,64645,64646,64656,64667,64669,64671,64672,4984, 56188,516, 64674,64676,64692,64693,8639, 64636,1109, 2086, 64637,382, 1999, 370, 381, 64640,39046,64641, - 5255, 2024, 317, 8083, 64643,64644,317, 514, 2193, 61961,64647,5840, 25151,64649,64651,10907,343, 64652,64655,2584, 2272, 64648,64650,363, 64653,428, 7360, - 64654,26702,362, 64657,64661,64218,596, 382, 64658,64659,317, 64660,64662,317, 64663,356, 466, 317, 64664,1347, 64665,370, 317, 64666,370, 10674,5225, - 1325, 317, 1347, 64668,427, 64670,3529, 990, 396, 317, 64673,351, 6866, 317, 8403, 1060, 64675,317, 64677,64681,64683,64684,350, 64688,64690,1347, 317, + 5255, 2024, 317, 8083, 64643,64644,317, 514, 2193, 61961,64647,5840, 25151,64649,64651,10907,343, 64652,64655,2584, 2272, 64648,64650,363, 64653,428, 7360, + 64654,26702,362, 64657,64661,64218,596, 382, 64658,64659,317, 64660,64662,317, 64663,356, 466, 317, 64664,1347, 64665,370, 317, 64666,370, 10674,5225, + 1325, 317, 1347, 64668,427, 64670,3529, 990, 396, 317, 64673,351, 6866, 317, 8403, 1060, 64675,317, 64677,64681,64683,64684,350, 64688,64690,1347, 317, 64678,317, 64679,18882,64680,317, 317, 380, 317, 64682,362, 558, 64685,64687,317, 1347, 64686,317, 64689,64691,64694,4738, 64695,7911, 8325, 317, 64697, 64699,64702,1430, 64703,64704,64706,1109, 64707,64708,64710,64715,450, 365, 64698,6387, 64700,64701,7698, 63824,381, 412, 64705,3529, 5993, 5570, 5862, 64709, - 317, 390, 2652, 64711,4965, 363, 64712,64713,64714,317, 64716,317, 332, 64717,5896, 64718,64719,64720,64722,64728,64734,2086, 20276,5561, 64723,64724,1109, - 64725,64726,64727,317, 64729,64730,50974,317, 12949,20977,317, 14773,8695, 24070,64731,47245,490, 4591, 64732,6089, 428, 11918,317, 64733,10015,12612,8125, - 4949, 64735,373, 64739,64740,6402, 64741,1108, 558, 64736,64737,64738,2110, 1347, 1347, 490, 28468,2184, 64743,64746,317, 64747,64749,345, 64750,317, 404, - 64753,64744,382, 317, 64745,466, 20578,317, 2261, 64748,396, 7651, 14916,9859, 9170, 64751,5862, 64752,949, 64755,64759,64762,501, 64763,12556,64764,2134, - 64765,64767,64770,64772,64773,20130,362, 6638, 64756,317, 2272, 317, 64757,64758,64760,7365, 317, 363, 64761,550, 427, 10016,25563,363, 64766,363, 351, - 64768,7062, 64769,343, 317, 21013,6546, 554, 64771,3125, 317, 332, 343, 1992, 317, 317, 3987, 2261, 12696,317, 64775,64776,44550,64778,64779,64781,362, + 317, 390, 2652, 64711,4965, 363, 64712,64713,64714,317, 64716,317, 332, 64717,5896, 64718,64719,64720,64722,64728,64734,2086, 20276,5561, 64723,64724,1109, + 64725,64726,64727,317, 64729,64730,50974,317, 12949,20977,317, 14773,8695, 24070,64731,47245,490, 4591, 64732,6089, 428, 11918,317, 64733,10015,12612,8125, + 4949, 64735,373, 64739,64740,6402, 64741,1108, 558, 64736,64737,64738,2110, 1347, 1347, 490, 28468,2184, 64743,64746,317, 64747,64749,345, 64750,317, 404, + 64753,64744,382, 317, 64745,466, 20578,317, 2261, 64748,396, 7651, 14916,9859, 9170, 64751,5862, 64752,949, 64755,64759,64762,501, 64763,12556,64764,2134, + 64765,64767,64770,64772,64773,20130,362, 6638, 64756,317, 2272, 317, 64757,64758,64760,7365, 317, 363, 64761,550, 427, 10016,25563,363, 64766,363, 351, + 64768,7062, 64769,343, 317, 21013,6546, 554, 64771,3125, 317, 332, 343, 1992, 317, 317, 3987, 2261, 12696,317, 64775,64776,44550,64778,64779,64781,362, 64785,64777,355, 380, 5328, 380, 64780,2222, 363, 317, 64782,317, 64783,317, 64784,64786,317, 343, 343, 64788,64790,64792,64794,1347, 64789,64791,64793, - 2300, 16751,607, 612, 1383, 8937, 64796,10898,1060, 64797,317, 317, 6581, 2997, 64799,64801,490, 64803,64800,43246,64802,64804,64805,64806,64807,64898,230, + 2300, 16751,607, 612, 1383, 8937, 64796,10898,1060, 64797,317, 317, 6581, 2997, 64799,64801,490, 64803,64800,43246,64802,64804,64805,64806,64807,64898,230, 231, 65191,65221,65273,65331,232, 65455,65462,65466,65502,65543,65600,65615,65714,65723,233, 65842,65907,65918,65961,65972,65976,65989,64808,64810,64819,64835, - 64839,5464, 64841,64855,64856,64860,64861,64872,64875,64888,64891,64894,64896,317, 350, 64809,64811,64812,64814,410, 12925,3999, 64813,26612,2247, 6042, 356, + 64839,5464, 64841,64855,64856,64860,64861,64872,64875,64888,64891,64894,64896,317, 350, 64809,64811,64812,64814,410, 12925,3999, 64813,26612,2247, 6042, 356, 64815,2510, 317, 382, 64816,64818,64817,5096, 317, 397, 64820,6270, 370, 64821,64822,64830,64832,11034,17009,317, 345, 64834,11034,21413,356, 370, 64823, - 476, 64824,64825,317, 351, 317, 64826,64827,64828,64829,64831,317, 64833,17358,2601, 317, 2809, 466, 2402, 64836,64837,64838,5055, 64840,317, 363, 343, - 12696,3677, 317, 317, 3503, 51212,6546, 6089, 550, 64842,64846,64847,64850,64853,64854,317, 64843,64844,64845,10680,5225, 5447, 466, 317, 26354,596, 1615, + 476, 64824,64825,317, 351, 317, 64826,64827,64828,64829,64831,317, 64833,17358,2601, 317, 2809, 466, 2402, 64836,64837,64838,5055, 64840,317, 363, 343, + 12696,3677, 317, 317, 3503, 51212,6546, 6089, 550, 64842,64846,64847,64850,64853,64854,317, 64843,64844,64845,10680,5225, 5447, 466, 317, 26354,596, 1615, 13695,317, 64848,15754,317, 2322, 64849,317, 64851,64852,30890,316, 2060, 2510, 317, 12925,317, 317, 23106,332, 370, 64857,490, 317, 64858,64859,10812, - 466, 64862,64863,64866,64870,64864,64865,523, 356, 466, 317, 26531,64867,64868,64869,64871,6046, 356, 20865,16053,64873,64874,317, 5573, 11263,317, 3853, + 466, 64862,64863,64866,64870,64864,64865,523, 356, 466, 317, 26531,64867,64868,64869,64871,6046, 356, 20865,16053,64873,64874,317, 5573, 11263,317, 3853, 356, 412, 41577,13154,4965, 317, 4738, 350, 64876,64881,64877,317, 64878,5991, 466, 541, 317, 64879,64880,64882,64884,64886,26440,6724, 64883,64885,64887, - 8612, 64889,5626, 317, 64890,389, 343, 64892,317, 64893,64895,16503,2022, 64897,64899,64901,64904,31580,64911,362, 64912,64917,64923,64900,317, 2156, 1526, + 8612, 64889,5626, 317, 64890,389, 343, 64892,317, 64893,64895,16503,2022, 64897,64899,64901,64904,31580,64911,362, 64912,64917,64923,64900,317, 2156, 1526, 605, 64902,64903,26204,317, 64905,867, 5079, 64907,9696, 47256,317, 64906,1109, 6996, 317, 1358, 345, 64908,317, 1160, 317, 356, 64909,317, 382, 64910, - 10592,317, 12281,545, 64913,317, 6724, 363, 64915,317, 64914,351, 5238, 5325, 64916,10237,5558, 64918,64919,317, 64920,64921,64922,371, 37490,64924,9832, + 10592,317, 12281,545, 64913,317, 6724, 363, 64915,317, 64914,351, 5238, 5325, 64916,10237,5558, 64918,64919,317, 64920,64921,64922,371, 37490,64924,9832, 64926,64927,5120, 5719, 64925,5720, 317, 64928,64937,64938,64947,64960,64974,64980,26074,64986,65047,317, 65062,65069,65082,971, 64929,64932,64933,317, 16398, - 64930,343, 5273, 64931,2715, 5363, 64934,317, 64935,64936,317, 5241, 345, 5717, 64939,317, 64942,64943,64945,4268, 64940,21168,64941,466, 6555, 5167, 5324, + 64930,343, 5273, 64931,2715, 5363, 64934,317, 64935,64936,317, 5241, 345, 5717, 64939,317, 64942,64943,64945,4268, 64940,21168,64941,466, 6555, 5167, 5324, 64944,55228,40868,2510, 64946,5464, 5262, 64948,64952,11388,64954,64955,64958,64949,64950,64951,466, 24400,317, 64953,64956,64957,64959,64961,3649, 343, 45759, 317, 64964,64969,64972,64962,64963,1347, 5399, 64965,64966,64967,64968,397, 64970,64971,64973,5447, 466, 5516, 5310, 12487,2510, 2117, 64975,350, 5362, 24224, 64976,64977,501, 18166,317, 64978,64979,64981,64983,64984,30514,5488, 64982,64985,490, 64987,64993,64995,65000,65008,490, 65041,65043,65044,64988,64989,64990, 5167, 64991,410, 5447, 466, 64992,5447, 466, 6020, 514, 64994,489, 64996,64997,64998,64999,356, 5054, 317, 65001,65004,21464,65002,65003,41385,1325, 65005, 65007,65006,1526, 5535, 56621,2601, 317, 317, 65009,65013,65014,65019,65024,65027,65039,65010,65011,5447, 65012,5225, 382, 65015,65016,5556, 65017,65018,65020, - 65022,65023,65021,65025,65026,7577, 5487, 381, 65028,65031,65029,65030,65032,65034,65033,65035,65036,65037,356, 65038,317, 65040,5492, 2601, 65042,317, 410, + 65022,65023,65021,65025,65026,7577, 5487, 381, 65028,65031,65029,65030,65032,65034,65033,65035,65036,65037,356, 65038,317, 65040,5492, 2601, 65042,317, 410, 10422,10877,317, 7988, 5487, 393, 65045,65046,410, 356, 10147,317, 317, 65048,65052,65055,65058,65049,65050,5447, 65051,382, 5869, 332, 65053,65054,65056, 65057,10422,466, 3854, 317, 65059,65060,65061,65063,65065,65066,65068,1700, 317, 65064,65067,23401,63461,2184, 65070,65071,65074,65081,317, 867, 65072,65073, 25639,65075,65076,1325, 65077,65078,65079,65080,4267, 1325, 65083,2815, 65084,1112, 65085,866, 2786, 1087, 928, 65086,65087,65093,65097,65105,65127,65131,65133, 65138,65152,65153,65158,65161,65164,65167,65168,65172,65181,65182,19215,65187,621, 637, 7155, 3599, 6088, 31413,317, 515, 2593, 345, 65088,550, 14548,65090, 65091,9914, 65092,2719, 380, 371, 65089,11086,343, 343, 371, 317, 317, 5197, 363, 65094,65096,24393,11373,65095,317, 317, 7010, 2521, 65098,65099,65101, - 65102,65103,38081,317, 356, 65100,380, 317, 317, 8882, 14303,317, 37785,390, 12298,317, 390, 1160, 381, 65104,384, 65106,65108,65109,65110,350, 5105, - 65112,65115,65116,5120, 65119,65123,343, 65107,65111,351, 65113,65114,5221, 43207,7698, 4591, 317, 37029,65117,65118,6195, 65120,65121,65122,6088, 356, 466, - 317, 65124,65125,65126,65128,65129,3236, 65130,1526, 37126,363, 578, 343, 13730,343, 574, 65132,434, 501, 65134,65135,428, 65137,343, 351, 19655,5962, + 65102,65103,38081,317, 356, 65100,380, 317, 317, 8882, 14303,317, 37785,390, 12298,317, 390, 1160, 381, 65104,384, 65106,65108,65109,65110,350, 5105, + 65112,65115,65116,5120, 65119,65123,343, 65107,65111,351, 65113,65114,5221, 43207,7698, 4591, 317, 37029,65117,65118,6195, 65120,65121,65122,6088, 356, 466, + 317, 65124,65125,65126,65128,65129,3236, 65130,1526, 37126,363, 578, 343, 13730,343, 574, 65132,434, 501, 65134,65135,428, 65137,343, 351, 19655,5962, 65136,317, 371, 393, 317, 393, 380, 65139,317, 65140,2222, 350, 65142,65143,65144,351, 65141,2603, 17358,332, 25415,65145,317, 5793, 65149,65146,65147, - 65148,65150,65151,65033,24479,370, 13646,65154,65155,65156,33878,2134, 6355, 390, 471, 65157,363, 65159,12696,65160,1325, 363, 65162,65163,13715,317, 345, - 371, 466, 65165,65166,317, 545, 11617,58763,476, 65169,65170,65171,566, 371, 350, 350, 1020, 21123,5634, 350, 439, 490, 65173,65175,65177,65179,605, - 65174,596, 381, 8567, 65176,317, 65178,1011, 50973,1924, 317, 633, 351, 65180,3361, 2261, 1060, 8125, 65183,65185,65186,317, 317, 5447, 21157,65184,393, - 30608,15734,2627, 65188,65190,65189,396, 14549,65192,65193,65194,11928,350, 2222, 65196,65197,65199,65203,2222, 65207,36068,65214,65217,1160, 15130,317, 351, + 65148,65150,65151,65033,24479,370, 13646,65154,65155,65156,33878,2134, 6355, 390, 471, 65157,363, 65159,12696,65160,1325, 363, 65162,65163,13715,317, 345, + 371, 466, 65165,65166,317, 545, 11617,58763,476, 65169,65170,65171,566, 371, 350, 350, 1020, 21123,5634, 350, 439, 490, 65173,65175,65177,65179,605, + 65174,596, 381, 8567, 65176,317, 65178,1011, 50973,1924, 317, 633, 351, 65180,3361, 2261, 1060, 8125, 65183,65185,65186,317, 317, 5447, 21157,65184,393, + 30608,15734,2627, 65188,65190,65189,396, 14549,65192,65193,65194,11928,350, 2222, 65196,65197,65199,65203,2222, 65207,36068,65214,65217,1160, 15130,317, 351, 8223, 317, 65195,317, 1033, 16651,317, 65198,3999, 317, 317, 65200,65201,65202,65204,2188, 317, 65206,65205,15042,370, 317, 65208,351, 65209,65210,65211, 65212,65213,65215,6726, 65216,65218,65219,65220,65222,65225,65231,65232,65235,65241,65250,65263,65264,65223,332, 65224,20629,65226,65227,65230,317, 36641,65228, - 5717, 37037,65229,2117, 2117, 350, 22809,65233,57932,15940,65234,466, 3368, 317, 5399, 6123, 65236,65237,21188,316, 65238,65240,65239,523, 356, 10195,2510, - 317, 5464, 28910,65242,65244,65248,65243,6271, 65245,65246,10422,9385, 317, 25338,65247,404, 448, 1526, 65249,65251,65254,65257,65252,10528,65253,356, 9130, - 21434,65255,65256,5991, 8553, 5399, 65258,65259,65260,65261,4268, 65262,356, 404, 2510, 65265,65267,65268,65269,65272,18588,65266,356, 466, 511, 24504,5611, + 5717, 37037,65229,2117, 2117, 350, 22809,65233,57932,15940,65234,466, 3368, 317, 5399, 6123, 65236,65237,21188,316, 65238,65240,65239,523, 356, 10195,2510, + 317, 5464, 28910,65242,65244,65248,65243,6271, 65245,65246,10422,9385, 317, 25338,65247,404, 448, 1526, 65249,65251,65254,65257,65252,10528,65253,356, 9130, + 21434,65255,65256,5991, 8553, 5399, 65258,65259,65260,65261,4268, 65262,356, 404, 2510, 65265,65267,65268,65269,65272,18588,65266,356, 466, 511, 24504,5611, 65270,65271,4564, 5447, 466, 65274,65279,65283,65286,65310,65312,65314,65315,317, 65323,10528,65275,1347, 65276,317, 65277,65278,317, 5238, 3503, 317, 19478, - 2036, 351, 7949, 65280,317, 16579,317, 5201, 65281,490, 9931, 1347, 65282,60061,65284,2035, 65285,1109, 317, 317, 2260, 65287,65295,65299,65301,65306,345, + 2036, 351, 7949, 65280,317, 16579,317, 5201, 65281,490, 9931, 1347, 65282,60061,65284,2035, 65285,1109, 317, 317, 2260, 65287,65295,65299,65301,65306,345, 65288,65289,65290,65291,65292,65293,65294,65296,65297,317, 317, 65298,65300,317, 490, 317, 65302,65303,317, 65304,16860,317, 65305,55384,317, 317, 65307, - 6013, 65308,65309,596, 317, 4268, 1347, 5167, 351, 65311,65313,351, 2222, 317, 427, 65316,65321,65317,65319,65318,317, 65320,65322,7784, 7579, 65324,317, + 6013, 65308,65309,596, 317, 4268, 1347, 5167, 351, 65311,65313,351, 2222, 317, 427, 65316,65321,65317,65319,65318,317, 65320,65322,7784, 7579, 65324,317, 65328,4576, 65325,3284, 345, 65326,22020,65327,370, 317, 5201, 7888, 65329,65330,65332,65337,350, 65339,13658,2247, 65343,2503, 65345,65346,65348,65349,13273, - 343, 317, 65350,65333,501, 317, 490, 381, 2183, 65334,65335,65336,65338,384, 396, 65340,317, 65341,317, 466, 65342,4564, 1325, 466, 65344,2586, 351, + 343, 317, 65350,65333,501, 317, 490, 381, 2183, 65334,65335,65336,65338,384, 396, 65340,317, 65341,317, 466, 65342,4564, 1325, 466, 65344,2586, 351, 466, 5663, 65347,350, 5223, 47075,1999, 6601, 396, 5138, 317, 3869, 65351,380, 65352,65354,65372,31154,65376,65379,65384,65385,65387,65388,65396,317, 65441, 65448,65453,65353,362, 13631,65355,1347, 28207,65356,14708,38710,5662, 605, 65360,65357,65358,381, 12433,317, 590, 65359,24638,4949, 16860,16153,10471,65361, - 65369,3236, 5400, 65362,65363,65364,65365,65366,65367,65368,65370,65371,351, 65373,65374,4738, 11249,317, 317, 13679,317, 565, 65375,12731,317, 350, 362, + 65369,3236, 5400, 65362,65363,65364,65365,65366,65367,65368,65370,65371,351, 65373,65374,4738, 11249,317, 317, 13679,317, 565, 65375,12731,317, 350, 362, 65377,39339,65378,10487,574, 12731,65380,65381,65382,4976, 5991, 65383,317, 4965, 466, 317, 65386,439, 370, 466, 21074,317, 65389,65391,65395,350, 10626, - 578, 317, 439, 65390,4984, 65392,65393,65394,65397,65398,65400,65406,65408,65410,317, 65413,65416,65417,65419,65421,65422,65427,65437,10538,390, 5238, 9664, + 578, 317, 439, 65390,4984, 65392,65393,65394,65397,65398,65400,65406,65408,65410,317, 65413,65416,65417,65419,65421,65422,65427,65437,10538,390, 5238, 9664, 65399,65401,65403,65402,65404,65405,65407,317, 590, 351, 317, 345, 65409,472, 362, 317, 8488, 317, 9182, 1358, 13659,65411,65412,28207,7592, 65414,65415, 5223, 1100, 553, 351, 350, 10561,1108, 65418,466, 65420,15221,7852, 332, 5836, 65423,24775,2553, 65425,32626,4982, 65424,65426,1020, 13307,9057, 65428,65432, 317, 25503,65429,65430,1526, 65431,65433,65434,65435,65436,1325, 466, 5226, 65438,65439,20360,10197,65440,65442,7618, 65443,47010,65444,511, 362, 350, 65445, 65446,10081,317, 13235,5223, 351, 382, 5717, 356, 65447,18454,65449,2222, 350, 65451,2845, 350, 65452,490, 317, 65450,41584,362, 65454,65456,65457,65459, - 65458,5441, 5273, 65460,65461,16365,35229,43878,490, 65463,8926, 65464,551, 65465,22685,65467,65478,12109,65484,1020, 65495,65497,390, 65498,65501,5226, 2024, - 356, 21483,65468,65474,65476,14316,410, 62590,65469,382, 65470,65472,65471,380, 9139, 5477, 65473,7682, 370, 65475,65477,5464, 466, 4268, 5226, 65479,2024, - 21672,65480,65481,65482,65483,65485,8488, 65486,2024, 65487,362, 65491,42859,65494,5441, 21417,5190, 317, 1347, 381, 317, 8139, 65488,65489,65490,5459, 6670, - 65492,65493,5487, 345, 2576, 9450, 65496,10238,5500, 65499,65500,65503,65508,65509,1998, 65516,60668,65525,65526,4266, 65529,24119,65540,65541,317, 343, 501, + 65458,5441, 5273, 65460,65461,16365,35229,43878,490, 65463,8926, 65464,551, 65465,22685,65467,65478,12109,65484,1020, 65495,65497,390, 65498,65501,5226, 2024, + 356, 21483,65468,65474,65476,14316,410, 62590,65469,382, 65470,65472,65471,380, 9139, 5477, 65473,7682, 370, 65475,65477,5464, 466, 4268, 5226, 65479,2024, + 21672,65480,65481,65482,65483,65485,8488, 65486,2024, 65487,362, 65491,42859,65494,5441, 21417,5190, 317, 1347, 381, 317, 8139, 65488,65489,65490,5459, 6670, + 65492,65493,5487, 345, 2576, 9450, 65496,10238,5500, 65499,65500,65503,65508,65509,1998, 65516,60668,65525,65526,4266, 65529,24119,65540,65541,317, 343, 501, 65504,65506,5661, 14523,53131,65507,29355,2108, 65505,2509, 356, 466, 317, 1347, 466, 4591, 31185,42002,1999, 578, 22338,350, 65510,343, 65512,65515,12869, 317, 351, 65511,317, 18946,5464, 345, 65513,65514,39059,2330, 350, 65517,371, 12795,65518,65519,65522,65523,20664,12631,11330,65520,65521,24596,11280,65524, - 370, 17988,390, 65527,65528,345, 65530,65533,65536,317, 65537,26484,65539,65531,65532,356, 466, 5174, 317, 65534,65535,370, 317, 26746,65538,370, 2571, - 5223, 26683,8136, 466, 9444, 363, 363, 65542,317, 65544,7911, 65546,65549,65555,65562,65566,65567,65568,65569,65572,65576,6601, 385, 65582,65587,65593,5037, + 370, 17988,390, 65527,65528,345, 65530,65533,65536,317, 65537,26484,65539,65531,65532,356, 466, 5174, 317, 65534,65535,370, 317, 26746,65538,370, 2571, + 5223, 26683,8136, 466, 9444, 363, 363, 65542,317, 65544,7911, 65546,65549,65555,65562,65566,65567,65568,65569,65572,65576,6601, 385, 65582,65587,65593,5037, 65597,2222, 65598,317, 65021,350, 7711, 64723,317, 5255, 6565, 65545,317, 2222, 65547,65548,20909,65550,65554,46491,363, 9931, 5105, 65551,65552,5991, 10877, - 345, 317, 65553,5611, 5167, 5943, 6691, 65556,380, 5223, 489, 65560,65557,1325, 466, 65558,65559,65561,356, 466, 317, 4965, 6598, 65563,65564,65565,317, - 44702,4437, 14470,351, 12987,565, 10086,404, 490, 27185,317, 65570,65571,65573,65574,65575,317, 317, 350, 12966,6596, 317, 317, 317, 317, 371, 317, + 345, 317, 65553,5611, 5167, 5943, 6691, 65556,380, 5223, 489, 65560,65557,1325, 466, 65558,65559,65561,356, 466, 317, 4965, 6598, 65563,65564,65565,317, + 44702,4437, 14470,351, 12987,565, 10086,404, 490, 27185,317, 65570,65571,65573,65574,65575,317, 317, 350, 12966,6596, 317, 317, 317, 317, 371, 317, 10561,317, 317, 351, 65577,41418,65578,2317, 65579,65580,14649,317, 25260,65581,65583,54860,363, 12154,466, 65584,65585,65586,65588,65589,65590,16651,65591, 65592,317, 317, 8614, 1999, 490, 65594,65596,65595,65599,317, 7142, 15464,65601,490, 343, 317, 65605,65607,317, 65602,65603,65604,3884, 5225, 1526, 65606, 380, 5363, 65595,65608,65613,65609,65610,65611,10674,65612,5365, 1325, 466, 65614,317, 65616,65626,65644,65645,9680, 65646,65655,65658,65669,65671,65695,65696, 65699,34849,65712,65617,65620,65622,27955,65623,1526, 65625,317, 65618,65619,317, 8567, 65621,5365, 558, 65624,65627,11276,65630,65632,65634,65640,5273, 65628, 410, 65629,466, 317, 65631,317, 2369, 13839,466, 511, 317, 65633,6266, 356, 317, 65635,65638,65636,65637,65639,12277,370, 65641,8296, 65642,65643,65647, - 65650,65652,542, 2184, 65648,24479,5273, 65649,466, 410, 317, 5399, 317, 65651,343, 65213,3284, 65653,5464, 317, 65654,381, 317, 22122,65656,65657,317, + 65650,65652,542, 2184, 65648,24479,5273, 65649,466, 410, 317, 5399, 317, 65651,343, 65213,3284, 65653,5464, 317, 65654,381, 317, 22122,65656,65657,317, 396, 362, 65659,65661,65663,65660,65662,990, 65629,466, 317, 317, 317, 65664,65666,65665,24589,8544, 65667,65668,65670,439, 7385, 65672,65679,65684,41264, 65673,65674,65678,65675,65676,65677,356, 466, 317, 373, 25420,5464, 5847, 351, 65680,65681,7988, 65272,65682,65683,25568,2413, 65685,65687,65691,65686,65688, - 65689,5447, 65690,21575,343, 65692,65693,65694,65697,363, 611, 65698,65700,65559,34396,65705,65706,65710,40024,65701,65702,65703,1109, 965, 5093, 65704,317, + 65689,5447, 65690,21575,343, 65692,65693,65694,65697,363, 611, 65698,65700,65559,34396,65705,65706,65710,40024,65701,65702,65703,1109, 965, 5093, 65704,317, 6468, 5226, 65707,65709,65708,5254, 65711,65713,6589, 6222, 65715,65716,65717,65718,490, 7988, 427, 317, 26676,65719,65720,65721,1347, 65722,65724,65728,56088, 332, 65730,65731,356, 65725,2086, 65726,608, 65727,62602,317, 65729,58569,1588, 1459, 317, 1347, 65732,65733,65740,65757,65762,350, 65773,65776,65788,65803, 65806,65824,65838,65734,65737,5764, 65738,65735,343, 65736,14523,17358,65739,466, 65741,65745,490, 4943, 317, 65746,65747,65750,65753,65755,65742,317, 65743, - 65744,65748,65749,65751,65752,317, 8243, 1108, 356, 379, 466, 5399, 317, 65754,7629, 5447, 9385, 54527,6228, 351, 317, 65756,466, 9057, 65758,13110,356, + 65744,65748,65749,65751,65752,317, 8243, 1108, 356, 379, 466, 5399, 317, 65754,7629, 5447, 9385, 54527,6228, 351, 317, 65756,466, 9057, 65758,13110,356, 490, 65759,65760,5441, 356, 65761,65763,21598,65767,18712,1943, 65769,490, 65764,466, 5260, 317, 65765,317, 21438,65766,317, 48320,30423,317, 65768,65770, 7376, 65771,65772,2510, 317, 317, 7521, 345, 382, 7327, 2163, 351, 65774,371, 65775,65777,65780,65783,317, 65784,317, 65778,5717, 65779,5324, 5054, 65781, - 7377, 65782,5447, 466, 2510, 5225, 5273, 510, 65785,65786,65787,317, 32693,317, 476, 65789,65793,20958,65796,2571, 65802,65790,381, 1347, 1347, 65791,6270, - 356, 10891,65792,317, 382, 5550, 2537, 2078, 65794,343, 65795,65797,65798,65800,65799,466, 317, 317, 1347, 65801,62179,6496, 65804,343, 350, 65805,317, + 7377, 65782,5447, 466, 2510, 5225, 5273, 510, 65785,65786,65787,317, 32693,317, 476, 65789,65793,20958,65796,2571, 65802,65790,381, 1347, 1347, 65791,6270, + 356, 10891,65792,317, 382, 5550, 2537, 2078, 65794,343, 65795,65797,65798,65800,65799,466, 317, 317, 1347, 65801,62179,6496, 65804,343, 350, 65805,317, 65807,5991, 379, 65811,52020,65814,65816,317, 65823,13307,24692,13098,65808,65809,65810,4268, 12785,332, 46853,382, 65812,7865, 65813,371, 317, 65815,65817, 11279,65820,11619,65821,65818,65819,356, 466, 1347, 65822,65825,317, 65828,65829,65830,65832,65835,65826,65827,5447, 466, 5225, 65831,65833,65834,6265, 65143, - 65836,65837,65839,65840,65841,65843,65849,317, 65851,2024, 65854,65858,490, 12154,16871,65867,65870,65896,65897,65901,6757, 65905,65844,65845,65846,565, 490, + 65836,65837,65839,65840,65841,65843,65849,317, 65851,2024, 65854,65858,490, 12154,16871,65867,65870,65896,65897,65901,6757, 65905,65844,65845,65846,565, 490, 65847,12631,12631,65848,317, 65477,356, 317, 42746,65850,317, 65852,6430, 1160, 60667,381, 65853,317, 65855,65856,8364, 6312, 65857,65859,396, 65863,65865, 13307,6266, 343, 65860,65861,65862,427, 317, 20253,15618,317, 5828, 65864,343, 35367,339, 317, 18142,65866,466, 317, 1160, 1347, 5399, 317, 356, 65868, - 12360,65869,5093, 317, 65871,65877,65880,65883,317, 65872,65874,65875,1325, 466, 65873,410, 356, 5987, 351, 317, 5174, 343, 65876,7988, 65878,65879,380, - 20998,65881,350, 317, 65882,380, 5394, 466, 65884,65885,8660, 65888,65893,65886,1428, 65887,65889,65890,65891,65892,65894,65895,380, 5335, 427, 367, 317, + 12360,65869,5093, 317, 65871,65877,65880,65883,317, 65872,65874,65875,1325, 466, 65873,410, 356, 5987, 351, 317, 5174, 343, 65876,7988, 65878,65879,380, + 20998,65881,350, 317, 65882,380, 5394, 466, 65884,65885,8660, 65888,65893,65886,1428, 65887,65889,65890,65891,65892,65894,65895,380, 5335, 427, 367, 317, 65898,65900,27154,317, 343, 65899,545, 2732, 65902,65903,65904,466, 317, 351, 65906,3529, 351, 3529, 65908,4960, 351, 380, 65909,65910,65912,65913,65915, - 501, 439, 381, 65911,12463,5055, 5717, 410, 46568,1325, 466, 65914,317, 351, 10081,65916,350, 15758,65917,350, 2134, 350, 9938, 1347, 619, 65919,317, + 501, 439, 381, 65911,12463,5055, 5717, 410, 46568,1325, 466, 65914,317, 351, 10081,65916,350, 15758,65917,350, 2134, 350, 9938, 1347, 619, 65919,317, 65921,65934,404, 65948,317, 65960,1526, 317, 65920,65322,356, 2078, 317, 22809,5038, 65922,65927,65928,317, 574, 65923,65925,466, 18695,317, 370, 65926, - 65924,49082,448, 2369, 343, 2401, 2156, 317, 65929,65930,16651,9938, 363, 65932,5273, 317, 65931,4564, 5447, 65933,65935,65938,490, 65939,65941,65945,317, - 65936,633, 10422,466, 65937,317, 356, 5793, 317, 317, 1325, 65940,490, 382, 22800,5273, 65942,65943,65944,18587,10674,65946,5447, 466, 65947,673, 5249, + 65924,49082,448, 2369, 343, 2401, 2156, 317, 65929,65930,16651,9938, 363, 65932,5273, 317, 65931,4564, 5447, 65933,65935,65938,490, 65939,65941,65945,317, + 65936,633, 10422,466, 65937,317, 356, 5793, 317, 317, 1325, 65940,490, 382, 22800,5273, 65942,65943,65944,18587,10674,65946,5447, 466, 65947,673, 5249, 317, 5488, 351, 5441, 65949,356, 12849,5273, 65950,8139, 65951,65955,65952,65953,65954,65956,65957,65958,8544, 65959,19237,317, 1526, 5441, 1347, 17358,65962, 65964,65965,65966,65969,349, 13638,65963,8099, 1915, 356, 5492, 317, 1135, 65967,65968,65970,574, 65971,1347, 466, 501, 65973,2077, 2024, 2035, 65974,46121, 317, 317, 390, 380, 65975,5255, 343, 390, 1796, 10943,65977,65978,65979,65983,65988,317, 1915, 1347, 317, 317, 363, 439, 65980,65981,65982,65984,22201, @@ -11125,160 +11120,160 @@ static const unsigned int ChildLocs[185261] = 66029,66031,66032,612, 66034,16278,608, 66041,66046,66035,66038,22866,66036,66037,66039,66040,66042,66045,66043,66044,1024, 396, 317, 351, 608, 66048,34639, 66049,1193, 317, 3037, 612, 34752,7892, 66052,66056,66058,65344,381, 66053,66054,66055,66057,66059,427, 66060,66062,66064,66065,66063,66067,66071,66076,66097, 66109,66111,66127,66131,66147,66151,66154,66068,26310,317, 66069,66070,49440,66072,66075,66073,66074,66077,490, 317, 1347, 66079,1109, 66084,2060, 4591, 66086, - 66092,317, 490, 490, 317, 66078,596, 345, 66080,317, 66081,14708,2409, 4952, 66083,25351,66082,578, 66085,1065, 66087,66091,66088,66089,66090,5701, 362, + 66092,317, 490, 490, 317, 66078,596, 345, 66080,317, 66081,14708,2409, 4952, 66083,25351,66082,578, 66085,1065, 66087,66091,66088,66089,66090,5701, 362, 66093,66094,66095,8804, 66096,356, 10253,66098,66105,66106,23490,66099,66101,66102,66100,26872,6222, 66103,1065, 4090, 66104,66107,66108,66110,66112,1078, 66114, - 66123,66113,66115,66116,5828, 66118,66117,15213,63926,2551, 20883,384, 3505, 317, 66119,66122,317, 66120,66121,9947, 8377, 66124,66125,66126,1347, 608, 6222, + 66123,66113,66115,66116,5828, 66118,66117,15213,63926,2551, 20883,384, 3505, 317, 66119,66122,317, 66120,66121,9947, 8377, 66124,66125,66126,1347, 608, 6222, 66128,66129,66130,66132,66133,317, 66142,66144,350, 317, 66146,6242, 317, 66134,317, 66135,8207, 66136,365, 345, 317, 23018,317, 2391, 8213, 66137,66141, - 66138,66139,66140,66143,317, 339, 5087, 345, 317, 66145,1345, 1160, 490, 345, 363, 339, 363, 66148,35237,66150,66149,39034,66152,317, 343, 66153,317, + 66138,66139,66140,66143,317, 339, 5087, 345, 317, 66145,1345, 1160, 490, 345, 363, 339, 363, 66148,35237,66150,66149,39034,66152,317, 343, 66153,317, 7622, 317, 317, 363, 317, 66155,66156,40467,317, 66157,8136, 466, 2022, 551, 6546, 66158,66159,66162,66178,66223,66242,66281,66289,66309,66312,66317,66322, - 66325,66330,66339,66378,66384,66398,66400,66419,345, 66441,15571,66464,66466,317, 317, 317, 66160,66161,1358, 490, 317, 317, 66163,66165,2387, 66169,5517, + 66325,66330,66339,66378,66384,66398,66400,66419,345, 66441,15571,66464,66466,317, 317, 317, 66160,66161,1358, 490, 317, 317, 66163,66165,2387, 66169,5517, 66172,2279, 66173,404, 66177,371, 66164,356, 317, 317, 317, 5238, 66166,66168,343, 5055, 317, 66167,66170,66171,317, 343, 53671,490, 66174,29405,66176, 317, 20992,66175,317, 20077,66179,66182,66189,14974,66190,363, 66207,2022, 66220,66222,1347, 66180,356, 66181,317, 1108, 317, 1160, 404, 66183,6486, 66185, - 317, 66184,7668, 404, 66186,317, 8766, 2715, 66187,66188,6486, 317, 7916, 621, 362, 9567, 949, 66191,66195,66196,66198,9624, 66202,38127,66203,39187,7990, - 34545,66206,2271, 317, 317, 66192,317, 66193,404, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 66194,317, 5037, 4949, 7911, 4949, - 66197,66199,662, 345, 66200,66201,317, 6840, 343, 345, 404, 317, 317, 345, 404, 1943, 5663, 2236, 66204,66205,2510, 7623, 317, 633, 66208,66209,2024, + 317, 66184,7668, 404, 66186,317, 8766, 2715, 66187,66188,6486, 317, 7916, 621, 362, 9567, 949, 66191,66195,66196,66198,9624, 66202,38127,66203,39187,7990, + 34545,66206,2271, 317, 317, 66192,317, 66193,404, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 66194,317, 5037, 4949, 7911, 4949, + 66197,66199,662, 345, 66200,66201,317, 6840, 343, 345, 404, 317, 317, 345, 404, 1943, 5663, 2236, 66204,66205,2510, 7623, 317, 633, 66208,66209,2024, 1358, 66214,66216,350, 33878,66219,1160, 7698, 6355, 1347, 66210,12037,66213,317, 66211,66212,57600,350, 4943, 4980, 1347, 317, 66215,66217,363, 66218,18030, 363, 350, 66221,317, 24298,489, 7386, 31822,20909,66224,66230,66233,66236,66240,350, 66241,9289, 523, 66225,66227,66228,384, 5105, 317, 66226,66229,37773, - 317, 317, 317, 317, 11144,5105, 343, 66231,385, 317, 66232,317, 351, 11034,1444, 317, 317, 356, 7821, 66234,428, 10223,433, 1230, 12429,317, 9624, - 66235,317, 45142,66237,34630,66238,66239,12886,466, 363, 66243,66245,66247,66253,66259,66260,66261,66263,66264,66272,350, 57899,66273,66278,317, 66280,7428, - 590, 66244,605, 66246,1358, 1033, 362, 66248,4738, 66251,66252,317, 5105, 66249,2222, 2134, 66250,66254,66257,66255,317, 66256,66258,12731,6917, 66262,317, + 317, 317, 317, 317, 11144,5105, 343, 66231,385, 317, 66232,317, 351, 11034,1444, 317, 317, 356, 7821, 66234,428, 10223,433, 1230, 12429,317, 9624, + 66235,317, 45142,66237,34630,66238,66239,12886,466, 363, 66243,66245,66247,66253,66259,66260,66261,66263,66264,66272,350, 57899,66273,66278,317, 66280,7428, + 590, 66244,605, 66246,1358, 1033, 362, 66248,4738, 66251,66252,317, 5105, 66249,2222, 2134, 66250,66254,66257,66255,317, 66256,66258,12731,6917, 66262,317, 439, 370, 370, 66265,66266,66267,66271,66268,66269,66270,11921,15772,345, 5439, 66274,66277,4738, 343, 16008,350, 437, 350, 317, 66275,317, 5896, 66276, 7618, 317, 317, 66279,6598, 317, 11181,66282,66285,66286,66287,4253, 11613,66283,66284,406, 448, 4949, 9447, 466, 2156, 363, 13611,317, 66288,466, 66290, - 370, 404, 66291,66292,66297,66305,66306,2022, 66307,57643,11626,365, 357, 317, 2715, 356, 2537, 5055, 66293,66295,66296,2117, 57643,317, 66294,8488, 6993, - 317, 66298,317, 317, 66299,10891,66301,11612,5661, 66302,66303,4984, 317, 317, 66300,317, 5336, 392, 1588, 412, 350, 66304,35025,16117,365, 66308,2715, + 370, 404, 66291,66292,66297,66305,66306,2022, 66307,57643,11626,365, 357, 317, 2715, 356, 2537, 5055, 66293,66295,66296,2117, 57643,317, 66294,8488, 6993, + 317, 66298,317, 317, 66299,10891,66301,11612,5661, 66302,66303,4984, 317, 317, 66300,317, 5336, 392, 1588, 412, 350, 66304,35025,16117,365, 66308,2715, 351, 66310,551, 2222, 66311,66313,66315,490, 17375,1358, 66314,66316,1481, 66318,317, 1347, 66319,66320,66321,46506,10894,15156,66323,365, 66324,317, 57281, 2078, 317, 66326,66327,343, 66328,317, 317, 317, 27776,2024, 382, 66329,16651,66331,66332,35822,2609, 66334,32606,4591, 2571, 15441,49165,66336,66337,66338, - 66333,370, 66335,3869, 370, 363, 66340,66343,66347,66350,2539, 66353,66370,66371,38982,317, 66373,5441, 66374,2351, 66341,356, 66342,363, 66344,501, 317, - 66345,345, 66286,66346,2004, 345, 380, 66348,43967,343, 350, 2272, 317, 317, 345, 66349,351, 11905,343, 66351,351, 66352,2381, 317, 317, 317, 5898, - 578, 11965,5159, 2152, 66354,66355,66356,66360,66361,3999, 66362,33877,66364,6601, 5956, 66365,66366,66367,66368,7852, 466, 317, 6831, 66357,8526, 66358,6599, + 66333,370, 66335,3869, 370, 363, 66340,66343,66347,66350,2539, 66353,66370,66371,38982,317, 66373,5441, 66374,2351, 66341,356, 66342,363, 66344,501, 317, + 66345,345, 66286,66346,2004, 345, 380, 66348,43967,343, 350, 2272, 317, 317, 345, 66349,351, 11905,343, 66351,351, 66352,2381, 317, 317, 317, 5898, + 578, 11965,5159, 2152, 66354,66355,66356,66360,66361,3999, 66362,33877,66364,6601, 5956, 66365,66366,66367,66368,7852, 466, 317, 6831, 66357,8526, 66358,6599, 54031,66359,317, 27765,578, 35043,392, 439, 66363,466, 17255,363, 317, 317, 2261, 13611,3361, 6188, 66369,58656,66372,317, 345, 317, 8325, 1160, 66375, 66376,66377,66379,12849,66380,6409, 5611, 1358, 66381,2288, 66382,66383,316, 317, 15293,466, 4591, 317, 66385,66386,66387,66389,35480,66391,66392,4980, 66396, 5624, 1459, 551, 3366, 66388,14932,466, 317, 317, 66390,66393,3999, 66395,363, 9012, 317, 317, 317, 43846,66167,363, 66394,9779, 317, 1347, 12704,66397, 66399,8357, 66401,66402,5300, 66403,66406,66409,66410,15745,350, 66411,66414,965, 66415,66416,16264,7064, 317, 501, 66404,1347, 317, 2391, 66405,317, 66407, - 66408,12696,370, 21137,317, 363, 20688,345, 11855,1325, 57131,317, 317, 1160, 317, 66412,2322, 66413,12756,6620, 350, 362, 22763,66417,351, 59002,343, + 66408,12696,370, 21137,317, 363, 20688,345, 11855,1325, 57131,317, 317, 1160, 317, 66412,2322, 66413,12756,6620, 350, 362, 22763,66417,351, 59002,343, 66418,317, 5035, 317, 66420,66421,66424,66425,317, 66426,66428,66429,66436,66440,949, 5428, 1020, 365, 66422,66423,5159, 343, 332, 1020, 2610, 380, 11034, 317, 317, 15221,317, 66427,2515, 363, 66430,38708,66435,343, 317, 66431,66432,10641,7401, 1444, 2732, 66433,66434,15561,317, 2219, 66437,345, 66438,66439, - 370, 317, 2094, 1526, 31227,343, 343, 362, 317, 66442,66446,66459,9909, 1020, 343, 66462,66463,66443,66445,3772, 317, 18739,66444,5687, 332, 356, 7871, - 5174, 5201, 7433, 867, 47897,66447,66449,5223, 66458,317, 66448,3987, 406, 4949, 28462,6228, 8488, 66450,66452,12416,66453,66455,4952, 10149,66456,5911, 2631, - 66457,404, 5573, 12302,19814,66451,24393,355, 66454,6195, 32011,356, 466, 317, 1358, 66460,66461,490, 8955, 7399, 2067, 4591, 66465,15618,4965, 317, 4965, + 370, 317, 2094, 1526, 31227,343, 343, 362, 317, 66442,66446,66459,9909, 1020, 343, 66462,66463,66443,66445,3772, 317, 18739,66444,5687, 332, 356, 7871, + 5174, 5201, 7433, 867, 47897,66447,66449,5223, 66458,317, 66448,3987, 406, 4949, 28462,6228, 8488, 66450,66452,12416,66453,66455,4952, 10149,66456,5911, 2631, + 66457,404, 5573, 12302,19814,66451,24393,355, 66454,6195, 32011,356, 466, 317, 1358, 66460,66461,490, 8955, 7399, 2067, 4591, 66465,15618,4965, 317, 4965, 365, 362, 66467,66468,357, 66469,12949,5439, 2322, 66471,66473,66477,66482,66486,66492,66496,66501,7460, 66504,66507,66508,66472,25805,351, 18761,370, 66474, 66475,35186,66476,396, 18762,66478,66479,66480,396, 66481,1193, 66483,607, 66484,66485,66487,66491,28164,66488,66489,66490,66493,66494,19065,20441,9172, 66495, 66497,66500,34639,66498,396, 66499,66502,66503,10381,66505,363, 66506,66509,66510,66065,66515,66511,66512,66514,66513,66517,2546, 66518,66520,66519,66521,66522, 345, 339, 66524,66525,66526,2581, 62013,381, 2503, 43592,66529,365, 351, 66530,66531,66552,66593,66647,66682,66707,66711,66733,66754,66755,66757,66763,66787, - 66827,66854,66872,66877,66880,236, 66988,67038,67078,67087,67101,67109,67120,66532,66534,317, 1325, 14316,66548,332, 66550,38920,66551,66533,66535,66536,6532, - 66537,6002, 66538,2156, 66540,2571, 66541,66543,66546,66547,7405, 317, 356, 15237,66539,66542,66544,66545,343, 343, 390, 371, 32658,2402, 5752, 61843,317, + 66827,66854,66872,66877,66880,236, 66988,67038,67078,67087,67101,67109,67120,66532,66534,317, 1325, 14316,66548,332, 66550,38920,66551,66533,66535,66536,6532, + 66537,6002, 66538,2156, 66540,2571, 66541,66543,66546,66547,7405, 317, 356, 15237,66539,66542,66544,66545,343, 343, 390, 371, 32658,2402, 5752, 61843,317, 66549,553, 356, 466, 1358, 317, 370, 317, 317, 949, 66553,66558,66562,66571,66584,2116, 66587,66589,4980, 317, 66590,7314, 371, 66554,317, 574, 66555, 66556,24059,332, 345, 317, 343, 345, 66557,66559,66561,558, 2044, 317, 4984, 317, 317, 66560,596, 4980, 317, 317, 16637,39796,66563,317, 31606,57899, - 66564,66569,317, 490, 9304, 317, 345, 1358, 343, 29449,28479,66565,24024,66566,66567,317, 317, 317, 317, 637, 317, 633, 1160, 5033, 317, 7925, 317, + 66564,66569,317, 490, 9304, 317, 345, 1358, 343, 29449,28479,66565,24024,66566,66567,317, 317, 317, 317, 637, 317, 633, 1160, 5033, 317, 7925, 317, 66568,317, 12154,4984, 363, 66570,66572,66576,317, 66577,66578,3125, 66582,66583,66573,66574,15504,356, 66575,317, 10471,7990, 550, 7777, 6228, 317, 12006, - 317, 23376,66579,66581,2271, 66580,66585,363, 66586,332, 317, 317, 332, 317, 317, 2503, 66588,317, 9768, 554, 5732, 883, 317, 317, 5238, 370, 371, + 317, 23376,66579,66581,2271, 66580,66585,363, 66586,332, 317, 317, 332, 317, 317, 2503, 66588,317, 9768, 554, 5732, 883, 317, 317, 5238, 370, 371, 317, 66591,66592,317, 370, 2571, 317, 345, 66594,66595,345, 66597,66610,66611,343, 66642,66643,66646,317, 5423, 2533, 12429,317, 5788, 5611, 66596,66598, 6195, 66599,2024, 31580,363, 596, 66608,14093,345, 317, 47948,356, 317, 66600,66602,66605,66606,317, 66607,317, 66601,66603,5255, 66604,10471,1358, 66609, - 66612,66614,5825, 320, 633, 66615,66620,66623,66624,66625,66628,66629,66632,4952, 66633,66634,66635,3075, 11158,66636,5037, 66640,66641,317, 66613,18947,2503, - 17445,66616,380, 66617,1230, 66618,66619,66621,9914, 66622,397, 23325,317, 28650,450, 66626,6420, 66627,317, 637, 6996, 1160, 633, 317, 649, 11786,356, + 66612,66614,5825, 320, 633, 66615,66620,66623,66624,66625,66628,66629,66632,4952, 66633,66634,66635,3075, 11158,66636,5037, 66640,66641,317, 66613,18947,2503, + 17445,66616,380, 66617,1230, 66618,66619,66621,9914, 66622,397, 23325,317, 28650,450, 66626,6420, 66627,317, 637, 6996, 1160, 633, 317, 649, 11786,356, 5217, 370, 1160, 1078, 15123,551, 66630,355, 428, 66631,48588,356, 5255, 465, 1347, 47566,317, 317, 3599, 317, 66637,66638,66639,428, 428, 2063, 20977, - 317, 317, 317, 317, 317, 8301, 2077, 2171, 317, 2503, 317, 66644,66645,66648,5896, 66650,66652,66661,554, 66663,15732,66666,66669,66670,66672,317, 4982, + 317, 317, 317, 317, 317, 8301, 2077, 2171, 317, 2503, 317, 66644,66645,66648,5896, 66650,66652,66661,554, 66663,15732,66666,66669,66670,66672,317, 4982, 3987, 317, 7698, 317, 1358, 2163, 317, 66649,317, 2134, 5793, 1030, 66651,384, 317, 15682,1347, 317, 317, 66653,363, 350, 48421,66654,26830,66656,66657, - 6420, 66659,317, 10538,317, 6674, 389, 66655,363, 2405, 2405, 66658,1135, 8614, 6674, 35678,6674, 4949, 66660,362, 317, 7785, 66655,66662,317, 7698, 371, + 6420, 66659,317, 10538,317, 6674, 389, 66655,363, 2405, 2405, 66658,1135, 8614, 6674, 35678,6674, 4949, 66660,362, 317, 7785, 66655,66662,317, 7698, 371, 12994,2132, 4591, 66664,66665,12994,317, 317, 317, 317, 317, 404, 66667,66668,17565,12994,1453, 66671,332, 26076,66673,12994,66675,66674,12994,1108, 12920, 5962, 66676,66680,6555, 66677,317, 596, 66678,66679,1108, 317, 317, 66681,66683,1453, 66684,2084, 66685,66686,32289,66690,66691,66692,46214,66694,66696,66700, - 350, 343, 351, 343, 511, 384, 13392,2219, 317, 57722,22983,317, 66687,66688,66689,362, 317, 345, 1358, 28201,12696,15778,8178, 66693,66695,662, 317, + 350, 343, 351, 343, 511, 384, 13392,2219, 317, 57722,22983,317, 66687,66688,66689,362, 317, 345, 1358, 28201,12696,15778,8178, 66693,66695,662, 317, 390, 317, 382, 390, 66697,66698,466, 343, 350, 350, 66699,351, 466, 26001,350, 66701,66704,317, 30090,2298, 66702,66703,380, 66705,4965, 66706,66708, - 28720,66709,66710,6763, 66712,66715,66717,6954, 66720,66721,66725,66726,4976, 66728,66713,332, 66714,317, 317, 14251,3284, 25086,1347, 66716,345, 6228, 317, - 332, 12057,66718,362, 66719,332, 9059, 1194, 363, 351, 11339,2551, 390, 4944, 4976, 66722,66723,66724,396, 317, 2317, 16508,66727,66729,66730,317, 317, + 28720,66709,66710,6763, 66712,66715,66717,6954, 66720,66721,66725,66726,4976, 66728,66713,332, 66714,317, 317, 14251,3284, 25086,1347, 66716,345, 6228, 317, + 332, 12057,66718,362, 66719,332, 9059, 1194, 363, 351, 11339,2551, 390, 4944, 4976, 66722,66723,66724,396, 317, 2317, 16508,66727,66729,66730,317, 317, 2171, 317, 66731,66732,66734,66735,7866, 66736,66739,66741,2222, 66742,66743,317, 66750,66751,66753,8392, 6847, 66737,66738,317, 16854,490, 66740,566, 11613, 466, 362, 3529, 66744,11662,351, 31797,66747,66745,66746,4943, 66748,66749,66752,350, 2222, 317, 9064, 450, 1347, 66756,1347, 66758,66759,66760,9702, 66762, - 66761,44910,317, 66764,44555,66766,66770,66772,66773,66785,390, 66786,317, 9262, 371, 66765,371, 317, 1347, 66767,317, 1160, 317, 66768,66769,1347, 317, - 343, 66771,363, 5838, 363, 9575, 404, 66774,1194, 66775,317, 16023,66781,362, 66783,2584, 317, 66784,2551, 317, 2551, 317, 356, 66776,2067, 317, 317, + 66761,44910,317, 66764,44555,66766,66770,66772,66773,66785,390, 66786,317, 9262, 371, 66765,371, 317, 1347, 66767,317, 1160, 317, 66768,66769,1347, 317, + 343, 66771,363, 5838, 363, 9575, 404, 66774,1194, 66775,317, 16023,66781,362, 66783,2584, 317, 66784,2551, 317, 2551, 317, 356, 66776,2067, 317, 317, 66777,66780,15680,4980, 66778,66779,15968,317, 66782,404, 317, 11928,4980, 371, 381, 350, 317, 66397,1060, 1428, 396, 317, 404, 34975,363, 37776,66788, 66810,66812,2024, 66815,965, 8172, 66817,66820,11879,66821,66822,66823,66824,317, 66789,7127, 371, 66792,6063, 66793,66808,66809,1481, 317, 651, 66790,66791, - 1266, 1112, 672, 317, 66794,66795,66796,66797,317, 66801,66803,66804,1700, 317, 6420, 10506,466, 7805, 317, 6458, 8099, 9226, 66798,11881,66799,317, 365, - 66800,7888, 5225, 356, 11607,396, 741, 11831,66802,16508,317, 5838, 363, 66805,66806,1109, 9857, 66807,317, 13478,9174, 66811,10560,404, 6674, 317, 3505, - 867, 37205,66813,8446, 7143, 9931, 317, 66814,317, 317, 317, 418, 66816,332, 5611, 317, 1347, 350, 66818,66819,351, 317, 466, 2022, 66825,66826,5055, + 1266, 1112, 672, 317, 66794,66795,66796,66797,317, 66801,66803,66804,1700, 317, 6420, 10506,466, 7805, 317, 6458, 8099, 9226, 66798,11881,66799,317, 365, + 66800,7888, 5225, 356, 11607,396, 741, 11831,66802,16508,317, 5838, 363, 66805,66806,1109, 9857, 66807,317, 13478,9174, 66811,10560,404, 6674, 317, 3505, + 867, 37205,66813,8446, 7143, 9931, 317, 66814,317, 317, 317, 418, 66816,332, 5611, 317, 1347, 350, 66818,66819,351, 317, 466, 2022, 66825,66826,5055, 317, 345, 949, 66828,66835,66843,66846,16017,66847,7334, 4984, 404, 66848,66851,317, 18070,66853,11940,317, 13174,66829,317, 2272, 66830,317, 66831,66834, 66832,66833,6228, 317, 1353, 20331,66836,66839,317, 66840,66837,66838,66841,66842,20909,66844,19691,66845,317, 9027, 381, 317, 357, 317, 595, 317, 66849, 66850,317, 317, 16017,66852,317, 2211, 2211, 363, 42690,66855,66857,66858,66860,66862,1358, 66864,66865,66870,317, 66856,14337,12237,24209,350, 317, 25545, 345, 317, 551, 39793,6419, 66859,6089, 66861,1325, 379, 12237,6275, 317, 317, 66863,490, 558, 317, 66866,66869,66867,66868,15646,466, 317, 1489, 19303, 66871,317, 19661,2036, 13124,30882,317, 317, 339, 66873,66874,490, 66875,317, 317, 66160,317, 1230, 490, 382, 3284, 66876,332, 13559,66878,66879,66881, 15867,65528,1358, 1347, 350, 66884,370, 317, 66882,2845, 66883,419, 4943, 66885,66886,66895,66898,66901,66946,66948,66956,66962,66963,350, 66965,66966,66979, - 5105, 16123,7784, 66987,66887,5611, 66888,66891,66892,66893,66894,5439, 2110, 2537, 748, 490, 18736,66889,490, 363, 317, 317, 66890,490, 9993, 439, 439, + 5105, 16123,7784, 66987,66887,5611, 66888,66891,66892,66893,66894,5439, 2110, 2537, 748, 490, 18736,66889,490, 363, 317, 317, 66890,490, 9993, 439, 439, 317, 350, 317, 5891, 317, 332, 38431,4949, 66896,66897,4943, 426, 380, 6674, 317, 317, 66899,66900,2081, 1060, 317, 6648, 3645, 2381, 317, 1266, 66902, - 66903,66910,6195, 8023, 66911,66912,66914,66917,357, 1160, 66943,427, 5037, 66945,317, 66904,10429,66905,66906,66908,427, 10454,380, 66907,371, 371, 4943, - 66909,22412,390, 439, 343, 66913,8354, 363, 66915,66916,317, 47317,5255, 343, 2369, 5943, 66918,66923,66927,4965, 13658,66929,66930,66931,5644, 605, 6601, + 66903,66910,6195, 8023, 66911,66912,66914,66917,357, 1160, 66943,427, 5037, 66945,317, 66904,10429,66905,66906,66908,427, 10454,380, 66907,371, 371, 4943, + 66909,22412,390, 439, 343, 66913,8354, 363, 66915,66916,317, 47317,5255, 343, 2369, 5943, 66918,66923,66927,4965, 13658,66929,66930,66931,5644, 605, 6601, 3869, 66936,66938,66941,66942,66919,66920,66921,4949, 9695, 66922,427, 2219, 427, 371, 38493,2117, 426, 45883,66924,66925,66926,66928,40798,16031,501, 11940, - 2948, 8224, 66932,13219,66934,66933,66935,66937,25847,384, 15260,66939,66940,514, 350, 578, 32892,317, 317, 66944,14344,428, 2063, 66947,351, 1109, 362, - 66949,66950,66952,66953,66954,317, 66955,317, 317, 66951,317, 317, 317, 3284, 427, 66957,66958,66960,317, 66959,1383, 317, 66961,11346,66964,396, 317, - 7618, 66967,54212,332, 6195, 66968,66972,66976,66977,13394,66978,427, 5037, 317, 380, 5611, 17768,380, 66969,11945,317, 317, 66971,317, 66970,317, 317, + 2948, 8224, 66932,13219,66934,66933,66935,66937,25847,384, 15260,66939,66940,514, 350, 578, 32892,317, 317, 66944,14344,428, 2063, 66947,351, 1109, 362, + 66949,66950,66952,66953,66954,317, 66955,317, 317, 66951,317, 317, 317, 3284, 427, 66957,66958,66960,317, 66959,1383, 317, 66961,11346,66964,396, 317, + 7618, 66967,54212,332, 6195, 66968,66972,66976,66977,13394,66978,427, 5037, 317, 380, 5611, 17768,380, 66969,11945,317, 317, 66971,317, 66970,317, 317, 7142, 317, 351, 5439, 694, 317, 317, 66973,317, 66974,350, 490, 66975,317, 536, 404, 1588, 351, 363, 66980,66981,66983,343, 66984,66985,317, 66982, - 317, 1347, 317, 15839,380, 66986,427, 6394, 9878, 66989,66992,66993,66997,67016,67018,362, 350, 67020,67023,15337,67024,67033,317, 66990,66991,54278,5909, - 317, 317, 332, 6486, 5046, 1044, 17454,317, 66994,66996,66995,32950,4949, 466, 4962, 317, 6204, 66998,24120,67000,67006,67007,13607,332, 67009,67010,434, + 317, 1347, 317, 15839,380, 66986,427, 6394, 9878, 66989,66992,66993,66997,67016,67018,362, 350, 67020,67023,15337,67024,67033,317, 66990,66991,54278,5909, + 317, 317, 332, 6486, 5046, 1044, 17454,317, 66994,66996,66995,32950,4949, 466, 4962, 317, 6204, 66998,24120,67000,67006,67007,13607,332, 67009,67010,434, 2584, 67011,67014,66999,4949, 448, 5255, 350, 380, 67001,67003,11055,67002,2108, 10560,10560,67004,67005,317, 427, 341, 54243,2108, 578, 12060,2334, 67008, 37793,15221,67012,2310, 67013,67015,67017,67019,52924,5836, 332, 67021,67022,8695, 317, 490, 22681,384, 67025,67027,362, 26394,363, 67031,317, 317, 27787, 67026,4965, 67028,67029,67030,4591, 4591, 67032,67034,490, 67035,67036,332, 317, 67037,317, 67039,67040,67042,363, 61385,67043,67049,67050,67053,67055,67057, - 1358, 67065,67067,67072,348, 317, 317, 363, 67077,2326, 7312, 596, 317, 67041,63824,63824,63824,67044,67045,350, 11144,381, 317, 990, 14483,466, 370, - 67046,67048,11911,4980, 67047,2719, 345, 2211, 3529, 67051,393, 67052,67054,338, 2067, 317, 67056,67058,6394, 67064,15334,67059,67061,67062,12434,370, 317, - 67063,1060, 317, 67060,427, 9479, 389, 370, 355, 392, 21168,558, 15510,5037, 4984, 67066,390, 67068,317, 466, 67069,5363, 317, 67070,67071,1347, 590, - 396, 17926,67073,23015,67074,7367, 363, 404, 1358, 67076,694, 317, 19922,1347, 317, 67075,462, 363, 67079,67081,67084,67086,371, 67080,67082,67083,6228, - 317, 317, 1160, 317, 332, 67085,490, 351, 44294,67088,67089,67091,67092,67093,67094,466, 67095,362, 67098,578, 11055,67099,404, 558, 384, 67090,381, - 38861,363, 596, 1160, 317, 12966,1109, 1347, 381, 317, 11229,67096,67097,317, 16319,404, 67100,363, 67102,67104,2610, 6713, 44636,67103,317, 317, 317, - 8529, 7590, 7064, 67105,67106,67107,317, 67108,949, 67110,67113,343, 345, 67114,67115,14792,67116,67117,67118,67119,67111,317, 317, 317, 6514, 1345, 1160, - 67112,380, 370, 501, 317, 6412, 67121,67123,67125,350, 10633,13638,4984, 490, 11146,67126,67122,317, 317, 343, 343, 3284, 11242,317, 67124,490, 9567, + 1358, 67065,67067,67072,348, 317, 317, 363, 67077,2326, 7312, 596, 317, 67041,63824,63824,63824,67044,67045,350, 11144,381, 317, 990, 14483,466, 370, + 67046,67048,11911,4980, 67047,2719, 345, 2211, 3529, 67051,393, 67052,67054,338, 2067, 317, 67056,67058,6394, 67064,15334,67059,67061,67062,12434,370, 317, + 67063,1060, 317, 67060,427, 9479, 389, 370, 355, 392, 21168,558, 15510,5037, 4984, 67066,390, 67068,317, 466, 67069,5363, 317, 67070,67071,1347, 590, + 396, 17926,67073,23015,67074,7367, 363, 404, 1358, 67076,694, 317, 19922,1347, 317, 67075,462, 363, 67079,67081,67084,67086,371, 67080,67082,67083,6228, + 317, 317, 1160, 317, 332, 67085,490, 351, 44294,67088,67089,67091,67092,67093,67094,466, 67095,362, 67098,578, 11055,67099,404, 558, 384, 67090,381, + 38861,363, 596, 1160, 317, 12966,1109, 1347, 381, 317, 11229,67096,67097,317, 16319,404, 67100,363, 67102,67104,2610, 6713, 44636,67103,317, 317, 317, + 8529, 7590, 7064, 67105,67106,67107,317, 67108,949, 67110,67113,343, 345, 67114,67115,14792,67116,67117,67118,67119,67111,317, 317, 317, 6514, 1345, 1160, + 67112,380, 370, 501, 317, 6412, 67121,67123,67125,350, 10633,13638,4984, 490, 11146,67126,67122,317, 317, 343, 343, 3284, 11242,317, 67124,490, 9567, 317, 40718,490, 67129,67131,67130,67132,67133,317, 67134,619, 67136,5286, 67137,4617, 490, 339, 67139,22210,67140,67141,317, 24195,67138,2272, 4619, 67143, 67146,396, 317, 345, 371, 345, 67148,67144,67145,67147,67149,67150,67151,342, 67152,67153,67155,67180,67185,67205,67215,67226,67234,67238,67242,67243,67245, - 67253,67286,67308,67311,67319,67320,67362,67382,67383,15274,2067, 67388,67389,404, 2416, 390, 67154,21067,371, 34177,365, 67156,67160,67164,67167,67172,350, - 67173,67174,9876, 67176,67178,67157,332, 1915, 390, 67158,2086, 67159,67161,12434,343, 317, 317, 67162,317, 67163,8557, 317, 317, 371, 6817, 67165,317, + 67253,67286,67308,67311,67319,67320,67362,67382,67383,15274,2067, 67388,67389,404, 2416, 390, 67154,21067,371, 34177,365, 67156,67160,67164,67167,67172,350, + 67173,67174,9876, 67176,67178,67157,332, 1915, 390, 67158,2086, 67159,67161,12434,343, 317, 317, 67162,317, 67163,8557, 317, 317, 371, 6817, 67165,317, 67166,317, 317, 16129,543, 32952,15337,350, 67168,67169,67170,1347, 317, 67171,317, 404, 7792, 332, 741, 7990, 317, 2108, 59612,9692, 6578, 3529, 20098, - 317, 317, 67175,427, 1347, 471, 67177,317, 317, 351, 67179,365, 2105, 11347,67181,67182,67184,317, 343, 362, 317, 345, 317, 67183,67183,67186,565, - 67187,67190,37659,317, 67193,1020, 67200,362, 67201,67203,490, 565, 15130,20112,9436, 371, 317, 317, 8023, 317, 67188,67189,343, 384, 384, 317, 371, + 317, 317, 67175,427, 1347, 471, 67177,317, 317, 351, 67179,365, 2105, 11347,67181,67182,67184,317, 343, 362, 317, 345, 317, 67183,67183,67186,565, + 67187,67190,37659,317, 67193,1020, 67200,362, 67201,67203,490, 565, 15130,20112,9436, 371, 317, 317, 8023, 317, 67188,67189,343, 384, 384, 317, 371, 2171, 8301, 2077, 363, 53186,67191,7949, 67192,476, 332, 67194,317, 2222, 67195,317, 317, 67199,67196,67197,67198,3361, 428, 317, 428, 370, 67202,61697, 317, 5836, 67204,317, 317, 317, 390, 11915,67206,35445,67207,317, 67208,67209,67211,67213,67214,6551, 363, 389, 1347, 2219, 317, 351, 2222, 49497,67210, 350, 67212,1358, 348, 8600, 490, 2193, 15377,317, 351, 350, 317, 317, 317, 67216,67218,67224,6387, 67225,67217,317, 32267,6594, 351, 67219,8948, 24145, - 67220,9832, 67222,67223,5581, 345, 5055, 67221,2845, 67227,67229,67230,317, 67233,24393,317, 479, 67228,6228, 317, 317, 317, 362, 2022, 317, 1160, 317, + 67220,9832, 67222,67223,5581, 345, 5055, 67221,2845, 67227,67229,67230,317, 67233,24393,317, 479, 67228,6228, 317, 317, 317, 362, 2022, 317, 1160, 317, 67231,67232,2156, 317, 317, 66808,5570, 61807,5032, 53593,67235,5662, 15749,67236,317, 67237,350, 439, 317, 3999, 5662, 396, 5130, 317, 675, 67239,67240, - 67241,350, 332, 8563, 5225, 356, 466, 4591, 317, 317, 317, 1597, 11921,67244,317, 2210, 317, 1108, 67246,67247,67250,67252,2391, 363, 317, 9695, 317, + 67241,350, 332, 8563, 5225, 356, 466, 4591, 317, 317, 317, 1597, 11921,67244,317, 2210, 317, 1108, 67246,67247,67250,67252,2391, 363, 317, 9695, 317, 35294,21413,67248,317, 67249,317, 381, 589, 317, 2671, 67251,10878,404, 363, 351, 317, 362, 317, 67254,67255,67258,67259,67261,15745,67263,2022, 67266, - 67268,8023, 67279,67282,48353,5898, 67256,67257,551, 1345, 10877,5241, 317, 1345, 317, 3505, 67260,67262,65477,3284, 67264,67265,350, 317, 472, 345, 5105, + 67268,8023, 67279,67282,48353,5898, 67256,67257,551, 1345, 10877,5241, 317, 1345, 317, 3505, 67260,67262,65477,3284, 67264,67265,350, 317, 472, 345, 5105, 11473,67267,20712,490, 67269,317, 67276,67277,373, 317, 345, 317, 67270,67271,67272,67273,67274,67275,67278,317, 67271,67280,370, 6598, 363, 67281,67283, 67284,67285,67287,67288,67289,67291,67296,67300,6578, 18234,67301,67302,4987, 6601, 10081,15377,55678,345, 7405, 67307,2298, 4280, 5281, 7405, 450, 317, 67290, 67292,20909,5353, 3023, 67293,339, 5841, 6601, 67294,380, 380, 490, 3111, 1732, 67295,6604, 345, 67297,67298,7438, 67299,412, 2381, 67303,67304,67306,64537, - 14786,390, 67305,363, 5428, 396, 332, 67309,67310,7399, 67312,67313,67315,343, 10223,2391, 67316,12297,67318,1325, 380, 1347, 317, 67314,67317,6593, 317, - 13685,381, 380, 371, 28112,1060, 317, 67321,38636,67322,67326,67327,67334,67336,67337,7850, 6651, 6532, 67340,67353,317, 5055, 67361,6993, 67323,67325,2211, - 7785, 13392,67324,2366, 2405, 317, 380, 317, 381, 317, 67328,12349,67330,67331,67332,11034,67333,2402, 9420, 404, 5037, 5809, 67329,363, 363, 1358, 317, + 14786,390, 67305,363, 5428, 396, 332, 67309,67310,7399, 67312,67313,67315,343, 10223,2391, 67316,12297,67318,1325, 380, 1347, 317, 67314,67317,6593, 317, + 13685,381, 380, 371, 28112,1060, 317, 67321,38636,67322,67326,67327,67334,67336,67337,7850, 6651, 6532, 67340,67353,317, 5055, 67361,6993, 67323,67325,2211, + 7785, 13392,67324,2366, 2405, 317, 380, 317, 381, 317, 67328,12349,67330,67331,67332,11034,67333,2402, 9420, 404, 5037, 5809, 67329,363, 363, 1358, 317, 8526, 1347, 317, 363, 11687,317, 1992, 365, 390, 11146,317, 67335,67338,370, 67339,842, 67341,67342,67345,26175,362, 7850, 67348,56429,67352,317, 67343, - 5223, 317, 5223, 317, 317, 67344,67346,5650, 317, 317, 67347,67349,317, 12949,317, 67350,67351,67354,67356,67357,11128,363, 5624, 67360,317, 317, 382, + 5223, 317, 5223, 317, 317, 67344,67346,5650, 317, 317, 67347,67349,317, 12949,317, 67350,67351,67354,67356,67357,11128,363, 5624, 67360,317, 317, 382, 67355,5896, 317, 1481, 317, 7910, 67358,317, 1992, 67359,490, 1526, 6228, 1160, 317, 8301, 2077, 317, 317, 2381, 13638,67363,67365,2509, 67368,67376,67377, 67378,362, 67380,67381,317, 67364,7792, 1109, 317, 6551, 6551, 3284, 67366,317, 67367,351, 4949, 67369,67370,10476,67374,362, 37254,501, 2024, 67371,67373, 5896, 67372,5616, 427, 2024, 6645, 317, 67375,990, 18166,6551, 9163, 343, 363, 12803,439, 67379,363, 7866, 7734, 12704,362, 317, 67384,18084,67385,67386, 67387,433, 345, 343, 317, 350, 317, 67390,67391,67393,11146,332, 67392,67394,67395,67397,67398,1108, 67399,67400,67402,390, 67404,67406,67408,67412,67414, 67418,67419,67422,67423,67424,67427,67433,67434,67436,1020, 67437,67439,67440,11346,339, 15618,67407,362, 637, 1300, 320, 5022, 317, 317, 317, 67409,10316, - 4949, 67410,490, 883, 67411,479, 44431,317, 46112,381, 8828, 317, 67413,450, 11702,67415,5896, 67416,363, 362, 13632,11280,363, 67417,317, 6420, 317, + 4949, 67410,490, 883, 67411,479, 44431,317, 46112,381, 8828, 317, 67413,450, 11702,67415,5896, 67416,363, 362, 13632,11280,363, 67417,317, 6420, 317, 12605,6195, 317, 7214, 16535,317, 67420,67421,380, 551, 3505, 67425,16553,11040,67426,317, 16670,356, 27689,5836, 67428,67432,317, 8274, 67429,67431,67430, 65517,9450, 428, 381, 2188, 67435,13638,10185,949, 5993, 351, 7214, 317, 332, 490, 1992, 50879,18688,67438,351, 362, 15130,345, 350, 363, 2073, 11388, 365, 67441,317, 67442,67444,1943, 67447,1881, 67452,67445,67446,67448,67449,67450,67451,605, 56278,67453,67454,67456,342, 67467,67468,67486,67488,67494,67500, - 67502,67506,239, 68375,242, 69114,244, 69795,69806,245, 250, 70877,251, 252, 253, 254, 255, 256, 72169,72202,72237,259, 266, 73954,269, 74159,270, + 67502,67506,239, 68375,242, 69114,244, 69795,69806,245, 250, 70877,251, 252, 253, 254, 255, 256, 72169,72202,72237,259, 266, 73954,269, 74159,270, 74305,7053, 392, 380, 15226,61657,67455,4797, 42613,4797, 67457,4797, 19789,40499,67464,67466,67458,317, 67459,67460,67461,67462,67463,67465,67469,67471,67477, 541, 67483,67470,928, 67472,67473,67474,67475,67476,317, 67478,67479,67480,67481,67482,67484,67485,620, 67487,67489,67490,67491,67492,67493,67495,67496,67497, 67498,67499,67501,67503,67504,67505,67507,67508,67509,67510,67511,67528,67559,67595,67614,67626,67644,67667,67682,67718,67720,240, 67838,241, 68083,68085,68100, 68105,68186,68220,68278,68309,68335,68346,68355,68373,67512,67516,317, 350, 67517,67521,5120, 8178, 67523,317, 67527,12225,67513,67514,4603, 317, 317, 67515, 381, 317, 4925, 1287, 67518,67519,67520,317, 67522,578, 16277,67524,317, 67526,46954,4952, 67525,2078, 65775,67529,67538,317, 67542,490, 67546,67548,67550, - 67554,9265, 67558,317, 67530,390, 317, 317, 490, 67531,67532,67533,26310,67535,428, 1347, 67534,7776, 6300, 67536,317, 67537,317, 67539,545, 390, 317, - 67540,1160, 67541,363, 2110, 1459, 67543,490, 67545,317, 67544,317, 9198, 11939,317, 317, 4984, 67547,317, 317, 2067, 317, 1347, 317, 317, 317, 345, - 363, 67549,14595,317, 67551,67553,17410,67552,10817,21786,317, 67555,67556,1943, 317, 317, 21296,67557,67560,67563,317, 67570,67576,67578,67581,317, 5840, + 67554,9265, 67558,317, 67530,390, 317, 317, 490, 67531,67532,67533,26310,67535,428, 1347, 67534,7776, 6300, 67536,317, 67537,317, 67539,545, 390, 317, + 67540,1160, 67541,363, 2110, 1459, 67543,490, 67545,317, 67544,317, 9198, 11939,317, 317, 4984, 67547,317, 317, 2067, 317, 1347, 317, 317, 317, 345, + 363, 67549,14595,317, 67551,67553,17410,67552,10817,21786,317, 67555,67556,1943, 317, 317, 21296,67557,67560,67563,317, 67570,67576,67578,67581,317, 5840, 317, 67561,7657, 343, 5032, 2387, 59021,67562,67564,67565,7916, 7385, 67566,6993, 317, 67567,2272, 67568,427, 67569,6546, 1881, 67571,67573,29922,67574,58387, 317, 317, 317, 2715, 67572,317, 67575,2409, 380, 67577,466, 350, 362, 345, 22114,317, 5037, 67579,67580,67582,21772,67587,317, 427, 317, 67583,67584, - 317, 67585,67586,67588,67591,67594,67589,67590,67592,67593,949, 67596,10442,317, 67598,67603,317, 350, 67604,67605,67607,362, 2571, 67608,5120, 5295, 8205, - 343, 67597,357, 317, 317, 317, 317, 5355, 67599,343, 67600,67602,12262,317, 381, 67601,1194, 317, 1347, 317, 5809, 317, 2078, 317, 317, 317, 2035, + 317, 67585,67586,67588,67591,67594,67589,67590,67592,67593,949, 67596,10442,317, 67598,67603,317, 350, 67604,67605,67607,362, 2571, 67608,5120, 5295, 8205, + 343, 67597,357, 317, 317, 317, 317, 5355, 67599,343, 67600,67602,12262,317, 381, 67601,1194, 317, 1347, 317, 5809, 317, 2078, 317, 317, 317, 2035, 490, 1347, 67606,317, 317, 317, 8448, 6228, 317, 2077, 5483, 317, 351, 350, 22370,317, 5295, 67609,2110, 3284, 45672,45719,67610,67611,67612,67613,67615, 356, 5623, 350, 2845, 365, 67616,20623,67618,5561, 67623,317, 67617,317, 2222, 67619,317, 317, 67620,67621,67622,67624,350, 67625,479, 67627,67629,67630, 67636,67638,332, 2022, 67639,67640,317, 357, 67628,7328, 1347, 5711, 351, 5108, 67631,317, 67632,7401, 67633,370, 317, 5223, 32022,67635,1230, 317, 32297, 67634,32092,351, 67637,404, 351, 1109, 1358, 67641,381, 67643,67642,67645,67650,67651,67653,67658,362, 67662,67663,67666,466, 317, 67646,317, 67647,67648, 9436, 317, 38833,351, 67649,8612, 2060, 36963,14571,8948, 317, 13427,1347, 317, 317, 393, 67652,382, 7916, 12154,67654,2178, 67655,67656,317, 67657,67659, - 15540,67660,67661,67664,67665,867, 2537, 42582,380, 317, 67668,67672,67673,5561, 67674,317, 67675,489, 67676,450, 67677,317, 67680,1109, 370, 67669,1020, - 67670,67671,1109, 317, 317, 317, 317, 5619, 433, 5896, 351, 317, 67678,67679,1602, 649, 633, 320, 67681,317, 46531,67683,67684,5711, 55333,67685,5120, - 67686,404, 67693,5217, 40600,67713,67714,67715,67716,317, 7928, 317, 4984, 5105, 4984, 2208, 67687,48845,14337,388, 67688,67690,6186, 317, 67689,67691,317, + 15540,67660,67661,67664,67665,867, 2537, 42582,380, 317, 67668,67672,67673,5561, 67674,317, 67675,489, 67676,450, 67677,317, 67680,1109, 370, 67669,1020, + 67670,67671,1109, 317, 317, 317, 317, 5619, 433, 5896, 351, 317, 67678,67679,1602, 649, 633, 320, 67681,317, 46531,67683,67684,5711, 55333,67685,5120, + 67686,404, 67693,5217, 40600,67713,67714,67715,67716,317, 7928, 317, 4984, 5105, 4984, 2208, 67687,48845,14337,388, 67688,67690,6186, 317, 67689,67691,317, 67692,317, 2322, 404, 1347, 7785, 15600,25782,67694,317, 67695,317, 67515,5447, 67711,6089, 15378,67712,1160, 317, 67696,67697,67698,67699,67700,67701,67702, - 67703,67704,67708,67705,67706,67707,67709,67710,12625,317, 317, 6322, 490, 363, 2845, 371, 317, 317, 490, 67717,7850, 356, 355, 67719,9581, 345, 401, - 67721,67725,67726,67728,67730,67731,370, 67732,24279,67734,490, 317, 37402,317, 45154,317, 67722,67723,67724,490, 3284, 2322, 6899, 317, 35307,317, 317, + 67703,67704,67708,67705,67706,67707,67709,67710,12625,317, 317, 6322, 490, 363, 2845, 371, 317, 317, 490, 67717,7850, 356, 355, 67719,9581, 345, 401, + 67721,67725,67726,67728,67730,67731,370, 67732,24279,67734,490, 317, 37402,317, 45154,317, 67722,67723,67724,490, 3284, 2322, 6899, 317, 35307,317, 317, 317, 67727,317, 67729,61789,6834, 490, 317, 490, 317, 16620,5836, 67733,2306, 317, 2086, 46530,67735,490, 67736,67737,67755,67756,67758,67762,67773,67774, 67777,22157,67790,67796,67800,50595,67805,67807,67817,67819,67831,67833,67835,427, 67738,67739,67740,67741,67743,8243, 317, 37821,67745,67749,67750,67751,67752, 2631, 317, 67753,19455,7590, 317, 6920, 317, 317, 67742,67744,6961, 6961, 67746,390, 55639,6318, 317, 1459, 67747,317, 490, 1109, 67748,2510, 490, 23995, @@ -11287,79 +11282,79 @@ static const unsigned int ChildLocs[185261] = 67787,317, 67789,67779,67780,5190, 67782,1347, 1347, 2222, 397, 317, 67786,317, 7590, 21434,67788,351, 13174,67791,67792,67793,501, 67794,317, 412, 67795, 390, 1358, 317, 317, 317, 1347, 10878,317, 6228, 317, 2366, 2077, 317, 49562,67797,46954,67798,404, 490, 317, 404, 67799,317, 317, 5687, 5300, 18029, 345, 67801,67802,67804,343, 317, 2715, 427, 10626,317, 6690, 2603, 317, 66949,490, 67803,317, 6420, 47180,67806,2371, 362, 18840,740, 67808,67809,67810, - 67811,12616,39054,2571, 67812,28079,7949, 345, 67814,67815,67816,2631, 8766, 390, 316, 389, 5481, 2142, 13228,343, 317, 67813,26328,349, 15961,317, 2077, - 8281, 5896, 31236,362, 363, 1109, 490, 365, 317, 25782,67818,7399, 5365, 5447, 466, 317, 67820,67828,67829,6546, 7385, 317, 67821,67824,343, 381, 317, - 67825,343, 67822,67823,1325, 2537, 466, 67826,67827,1588, 2549, 4984, 2210, 2551, 6046, 2715, 317, 2105, 67830,7668, 317, 2715, 332, 2715, 67832,501, 7651, + 67811,12616,39054,2571, 67812,28079,7949, 345, 67814,67815,67816,2631, 8766, 390, 316, 389, 5481, 2142, 13228,343, 317, 67813,26328,349, 15961,317, 2077, + 8281, 5896, 31236,362, 363, 1109, 490, 365, 317, 25782,67818,7399, 5365, 5447, 466, 317, 67820,67828,67829,6546, 7385, 317, 67821,67824,343, 381, 317, + 67825,343, 67822,67823,1325, 2537, 466, 67826,67827,1588, 2549, 4984, 2210, 2551, 6046, 2715, 317, 2105, 67830,7668, 317, 2715, 332, 2715, 67832,501, 7651, 317, 67834,2510, 381, 67836,9444, 351, 44297,317, 5662, 67837,67839,619, 67841,67851,67857,2077, 67858,67860,10506,67861,67862,10962,67865,67867,27101,67874, - 67878,67890,67891,67897,67898,67905,67906,4984, 5074, 67840,363, 67842,380, 490, 363, 67843,317, 317, 67844,365, 67848,317, 67850,13875,2997, 365, 317, - 67845,29441,317, 67846,1347, 2809, 317, 67847,1347, 67849,4952, 332, 490, 390, 317, 5419, 427, 67852,18209,67853,67854,67855,67856,317, 8148, 317, 317, + 67878,67890,67891,67897,67898,67905,67906,4984, 5074, 67840,363, 67842,380, 490, 363, 67843,317, 317, 67844,365, 67848,317, 67850,13875,2997, 365, 317, + 67845,29441,317, 67846,1347, 2809, 317, 67847,1347, 67849,4952, 332, 490, 390, 317, 5419, 427, 67852,18209,67853,67854,67855,67856,317, 8148, 317, 317, 45844,317, 5570, 317, 9696, 31062,490, 590, 345, 317, 365, 351, 317, 67859,2571, 317, 317, 1020, 489, 1030, 371, 343, 67863,317, 1109, 42966,67864, - 67866,466, 67868,67871,67872,5379, 370, 5616, 317, 381, 67873,388, 317, 67869,332, 33426,67870,5570, 5570, 7183, 317, 1300, 317, 633, 317, 8301, 2631, + 67866,466, 67868,67871,67872,5379, 370, 5616, 317, 381, 67873,388, 317, 67869,332, 33426,67870,5570, 5570, 7183, 317, 1300, 317, 633, 317, 8301, 2631, 2077, 332, 24455,317, 5616, 67875,381, 317, 539, 19478,380, 6492, 317, 67876,10626,5040, 14902,363, 67877,67879,9992, 67882,67883,67884,67886,67887,67889, 67880,67881,5526, 382, 390, 362, 867, 6278, 317, 490, 2178, 332, 67885,466, 67888,6964, 317, 24070,5684, 24242,1044, 67892,380, 67893,67894,67895,67896, 58359,404, 380, 67899,67900,380, 317, 67902,317, 317, 67901,6996, 317, 317, 29848,67903,317, 67904,370, 428, 393, 490, 949, 67907,67915,67916,67926, - 67971,67973,67980,67994,67996,68001,68005,68008,68012,68016,68019,68021,68022,68025,68026,68035,317, 5037, 68080,68082,490, 317, 9993, 2171, 7490, 67908,317, - 67910,2553, 67914,67909,67911,317, 67912,1791, 6176, 67913,4949, 479, 4949, 67917,67918,501, 2368, 67921,317, 67919,67920,317, 317, 317, 4591, 6179, 1358, - 67922,9818, 67925,12463,67923,10528,370, 67924,14662,317, 317, 67927,67929,67932,12109,67939,67941,67944,67949,67951,36225,67952,67955,6601, 67957,67962,4980, + 67971,67973,67980,67994,67996,68001,68005,68008,68012,68016,68019,68021,68022,68025,68026,68035,317, 5037, 68080,68082,490, 317, 9993, 2171, 7490, 67908,317, + 67910,2553, 67914,67909,67911,317, 67912,1791, 6176, 67913,4949, 479, 4949, 67917,67918,501, 2368, 67921,317, 67919,67920,317, 317, 317, 4591, 6179, 1358, + 67922,9818, 67925,12463,67923,10528,370, 67924,14662,317, 317, 67927,67929,67932,12109,67939,67941,67944,67949,67951,36225,67952,67955,6601, 67957,67962,4980, 67966,67967,67969,67970,7850, 6917, 380, 362, 67928,11198,343, 317, 536, 317, 67930,4949, 426, 67931,4949, 390, 1347, 5962, 1347, 317, 67933,67934,67935, 362, 317, 67936,390, 317, 351, 2024, 351, 21938,1109, 2584, 67937,1020, 362, 67938,351, 551, 351, 317, 317, 363, 4984, 574, 67940,4591, 17887,67942, - 67943,490, 396, 427, 317, 67945,317, 990, 67946,67947,332, 7411, 67948,317, 404, 317, 317, 9179, 317, 7389, 9450, 67950,381, 65159,2236, 433, 317, - 362, 54360,5891, 67953,317, 433, 67954,4984, 317, 62675,351, 465, 67956,67958,67959,67961,317, 990, 67960,490, 371, 8275, 67963,67964,67965,426, 363, + 67943,490, 396, 427, 317, 67945,317, 990, 67946,67947,332, 7411, 67948,317, 404, 317, 317, 9179, 317, 7389, 9450, 67950,381, 65159,2236, 433, 317, + 362, 54360,5891, 67953,317, 433, 67954,4984, 317, 62675,351, 465, 67956,67958,67959,67961,317, 990, 67960,490, 371, 8275, 67963,67964,67965,426, 363, 67968,317, 1109, 380, 428, 25568,1266, 317, 317, 633, 2077, 317, 971, 7990, 67972,317, 5223, 317, 949, 1011, 55820,67974,67976,551, 67977,317, 26108, - 67975,67978,67979,5032, 67981,67982,67984,67986,67987,590, 365, 317, 67989,349, 67990,14117,6402, 4980, 317, 370, 317, 67983,317, 317, 67985,7142, 1108, + 67975,67978,67979,5032, 67981,67982,67984,67986,67987,590, 365, 317, 67989,349, 67990,14117,6402, 4980, 317, 370, 317, 67983,317, 317, 67985,7142, 1108, 365, 24777,317, 67988,427, 18322,490, 317, 67991,67992,67993,345, 67995,47253,2134, 350, 317, 3750, 2142, 67997,67998,8557, 67999,39649,5226, 68000,68002, 1881, 31150,68003,365, 1347, 490, 317, 1109, 68004,6975, 68006,12142,68007,31986,317, 317, 396, 317, 8178, 5836, 2610, 68009,68011,68010,9449, 345, 68013, 68015,317, 68014,317, 68017,68018,363, 6993, 28795,3284, 365, 317, 2631, 317, 1109, 68020,345, 18978,2869, 404, 68023,68024,3726, 332, 450, 68027,68028, - 68029,68031,7871, 15637,68033,5561, 68030,490, 68032,317, 1358, 489, 68034,68036,68039,68049,68053,68054,2022, 11196,68069,68078,317, 365, 68079,2609, 317, - 68037,5266, 68038,10594,18068,490, 51054,317, 1220, 2035, 68040,5687, 6713, 21126,317, 68042,68043,68046,68047,317, 9702, 490, 68041,514, 27079,7386, 7521, - 68044,68045,1416, 6917, 9300, 5032, 490, 317, 68048,5241, 21621,317, 68050,317, 68052,68051,3726, 490, 343, 11052,2551, 389, 3529, 68055,68056,68057,332, - 68060,68063,317, 68066,332, 68058,68059,68061,56988,68062,317, 317, 317, 68064,317, 68065,2845, 2844, 68067,68068,68070,68071,7672, 68074,68075,68077,7143, - 317, 28771,68072,68073,867, 51136,2142, 317, 60514,68076,317, 427, 317, 5687, 5120, 8301, 345, 5120, 18657,2609, 12849,7386, 6402, 514, 68081,332, 317, - 46304,61273,44592,343, 68084,365, 345, 68086,68088,5022, 68089,68091,332, 27846,58377,68094,68096,2332, 317, 2322, 68087,332, 317, 51317,68090,11648,317, - 68092,5836, 317, 332, 490, 68093,68095,7790, 5694, 490, 390, 68097,68098,5537, 867, 317, 12590,1347, 68099,317, 68101,68104,317, 68102,68103,2110, 1108, + 68029,68031,7871, 15637,68033,5561, 68030,490, 68032,317, 1358, 489, 68034,68036,68039,68049,68053,68054,2022, 11196,68069,68078,317, 365, 68079,2609, 317, + 68037,5266, 68038,10594,18068,490, 51054,317, 1220, 2035, 68040,5687, 6713, 21126,317, 68042,68043,68046,68047,317, 9702, 490, 68041,514, 27079,7386, 7521, + 68044,68045,1416, 6917, 9300, 5032, 490, 317, 68048,5241, 21621,317, 68050,317, 68052,68051,3726, 490, 343, 11052,2551, 389, 3529, 68055,68056,68057,332, + 68060,68063,317, 68066,332, 68058,68059,68061,56988,68062,317, 317, 317, 68064,317, 68065,2845, 2844, 68067,68068,68070,68071,7672, 68074,68075,68077,7143, + 317, 28771,68072,68073,867, 51136,2142, 317, 60514,68076,317, 427, 317, 5687, 5120, 8301, 345, 5120, 18657,2609, 12849,7386, 6402, 514, 68081,332, 317, + 46304,61273,44592,343, 68084,365, 345, 68086,68088,5022, 68089,68091,332, 27846,58377,68094,68096,2332, 317, 2322, 68087,332, 317, 51317,68090,11648,317, + 68092,5836, 317, 332, 490, 68093,68095,7790, 5694, 490, 390, 68097,68098,5537, 867, 317, 12590,1347, 68099,317, 68101,68104,317, 68102,68103,2110, 1108, 68106,68127,68131,68140,68147,396, 68151,27477,68155,68158,68160,68163,68165,68167,68171,68173,68175,68178,68179,68183,68184,68185,317, 14561,949, 2366, 68107, - 68109,490, 68110,68111,68114,68115,68116,6900, 68117,68119,68120,317, 68121,68124,3505, 68126,7850, 317, 19617,68108,2351, 490, 332, 51339,5570, 68112,1943, + 68109,490, 68110,68111,68114,68115,68116,6900, 68117,68119,68120,317, 68121,68124,3505, 68126,7850, 317, 19617,68108,2351, 490, 332, 51339,5570, 68112,1943, 68113,16596,1688, 633, 317, 317, 317, 317, 317, 317, 317, 317, 317, 2272, 1189, 317, 68118,339, 43254,5120, 2105, 371, 26249,7850, 489, 7776, 68122, 68123,317, 68125,48303,12349,490, 68128,351, 68129,419, 596, 68130,68132,41137,68134,68135,68133,317, 10295,317, 59601,68136,490, 7672, 68137,68138,68139, 68141,68142,68143,68145,68146,2035, 2381, 317, 68144,317, 1347, 1347, 490, 5217, 1347, 68148,68149,68150,68152,68153,345, 68154,6138, 317, 2369, 381, 26249, - 317, 68156,317, 15017,68157,6847, 2317, 317, 68159,4965, 68161,68162,317, 317, 53115,6859, 68164,317, 68166,6517, 6516, 68168,1347, 68169,68170,3284, 390, - 317, 8937, 396, 2317, 5836, 317, 68172,382, 1060, 317, 46856,565, 362, 10189,68174,317, 68176,68177,19478,317, 9422, 490, 381, 1020, 20857,18420,1020, + 317, 68156,317, 15017,68157,6847, 2317, 317, 68159,4965, 68161,68162,317, 317, 53115,6859, 68164,317, 68166,6517, 6516, 68168,1347, 68169,68170,3284, 390, + 317, 8937, 396, 2317, 5836, 317, 68172,382, 1060, 317, 46856,565, 362, 10189,68174,317, 68176,68177,19478,317, 9422, 490, 381, 1020, 20857,18420,1020, 428, 343, 4984, 68180,343, 3987, 68181,20331,68182,2142, 6600, 6546, 6036, 345, 21434,11347,949, 68187,68188,68189,68192,68201,68202,2116, 317, 68207,68209, - 68212,68218,68219,949, 7225, 6834, 365, 490, 365, 38681,317, 332, 68190,68191,68193,68199,68200,490, 371, 68194,68197,317, 672, 15105,317, 2077, 317, - 1160, 7155, 317, 68195,649, 68196,68198,365, 5538, 68203,15090,68204,68205,6382, 68206,68208,1033, 68210,68211,68213,68216,1358, 362, 68217,18978,53450,7225, + 68212,68218,68219,949, 7225, 6834, 365, 490, 365, 38681,317, 332, 68190,68191,68193,68199,68200,490, 371, 68194,68197,317, 672, 15105,317, 2077, 317, + 1160, 7155, 317, 68195,649, 68196,68198,365, 5538, 68203,15090,68204,68205,6382, 68206,68208,1033, 68210,68211,68213,68216,1358, 362, 68217,18978,53450,7225, 362, 68214,365, 68215,317, 5038, 64065,68221,68223,317, 68229,68232,68236,68242,68251,40600,68252,8403, 68254,68256,68258,68265,68270,317, 68222,343, 68224, 1109, 68227,490, 317, 317, 24435,57921,68225,317, 317, 5355, 68226,68228,68230,427, 68231,332, 3987, 68233,68235,574, 68234,351, 68237,343, 68240,68238, 68239,68241,2809, 317, 6691, 68243,68245,490, 1347, 68244,7560, 21745,5717, 68246,317, 68247,68250,2184, 68248,68249,404, 21495,13927,5464, 317, 68253,36630, - 2078, 317, 68255,317, 16063,466, 370, 68257,68259,68260,68263,317, 68261,9624, 68262,38135,48341,6021, 439, 317, 68264,348, 68266,5096, 7405, 68267,317, + 2078, 317, 68255,317, 16063,466, 370, 68257,68259,68260,68263,317, 68261,9624, 68262,38135,48341,6021, 439, 317, 68264,348, 68266,5096, 7405, 68267,317, 317, 317, 6607, 317, 68268,317, 5482, 68269,317, 68271,68277,68272,2036, 317, 68273,68274,68275,68276,2174, 317, 990, 68279,68280,68282,68284,501, 68286, - 317, 68287,68288,68289,343, 68297,68302,68306,68307,68281,6555, 350, 317, 5611, 362, 1347, 317, 68283,2510, 1347, 68285,448, 2387, 29805,4952, 317, 2310, + 317, 68287,68288,68289,343, 68297,68302,68306,68307,68281,6555, 350, 317, 5611, 362, 1347, 317, 68283,2510, 1347, 68285,448, 2387, 29805,4952, 317, 2310, 21304,345, 345, 351, 5570, 2236, 317, 7698, 27989,22632,7196, 350, 351, 68290,1347, 68295,350, 68291,68292,68293,68294,68296,490, 68298,68300,536, 68301, 345, 68299,317, 9822, 68303,68304,68305,6419, 15074,55335,350, 350, 68308,19460,15378,68310,68318,68319,68325,5611, 68331,370, 68311,68313,2001, 6409, 68314, 68316,68317,2387, 68312,2537, 317, 590, 370, 370, 317, 4925, 68315,317, 317, 393, 10236,565, 317, 5238, 25872,68320,11986,317, 68322,343, 317, 68323, - 317, 68321,317, 370, 7919, 317, 68324,332, 317, 317, 5570, 68326,990, 2590, 68327,5207, 68328,68329,68330,4965, 317, 1347, 317, 490, 4984, 490, 1347, + 317, 68321,317, 370, 7919, 317, 68324,332, 317, 317, 5570, 68326,990, 2590, 68327,5207, 68328,68329,68330,4965, 317, 1347, 317, 490, 4984, 490, 1347, 351, 390, 365, 2317, 345, 317, 68332,68333,68334,56531,21434,15130,317, 9538, 40552,490, 68336,13422,68338,68340,5991, 17601,8023, 68341,490, 68343,18640, - 8392, 68344,317, 68345,2509, 1000, 50552,1109, 34344,5223, 68337,490, 10506,68339,3284, 68342,5294, 370, 30811,5138, 23996,6847, 9624, 68347,362, 68350,404, - 68348,2219, 68349,9351, 68351,68352,68353,68354,1347, 6514, 68356,68358,332, 68359,317, 68360,332, 68361,362, 1358, 68362,2156, 68363,2178, 68371,68372,490, + 8392, 68344,317, 68345,2509, 1000, 50552,1109, 34344,5223, 68337,490, 10506,68339,3284, 68342,5294, 370, 30811,5138, 23996,6847, 9624, 68347,362, 68350,404, + 68348,2219, 68349,9351, 68351,68352,68353,68354,1347, 6514, 68356,68358,332, 68359,317, 68360,332, 68361,362, 1358, 68362,2156, 68363,2178, 68371,68372,490, 68357,10480,17490,5623, 317, 20312,317, 356, 390, 1347, 390, 53153,51614,2035, 68364,68368,68365,68366,68367,68369,68370,551, 2631, 396, 356, 356, 68374, 317, 317, 490, 589, 68376,68378,8514, 867, 317, 68377,332, 2110, 68379,68381,68464,68466,243, 68923,68962,68969,69018,69077,1044, 69082,69108,69109,69112, - 68380,6563, 68382,68383,68384,68385,68386,68389,8023, 68392,68393,68401,68406,68425,68430,68455,68460,59348,596, 317, 15721,317, 3941, 317, 501, 2584, 317, - 68387,55166,317, 3688, 68388,345, 68390,20178,68391,5328, 343, 68394,2184, 68395,317, 68396,68397,68399,317, 5439, 5457, 1347, 317, 343, 350, 382, 7672, + 68380,6563, 68382,68383,68384,68385,68386,68389,8023, 68392,68393,68401,68406,68425,68430,68455,68460,59348,596, 317, 15721,317, 3941, 317, 501, 2584, 317, + 68387,55166,317, 3688, 68388,345, 68390,20178,68391,5328, 343, 68394,2184, 68395,317, 68396,68397,68399,317, 5439, 5457, 1347, 317, 343, 350, 382, 7672, 363, 370, 5054, 68398,317, 317, 9720, 363, 68400,466, 317, 28981,16623,68402,68403,317, 16623,45577,466, 363, 317, 68404,317, 6402, 317, 317, 68405, - 68407,68409,7993, 61233,362, 68417,317, 68422,68408,68410,68413,2116, 68416,68411,68412,4591, 317, 345, 317, 1526, 68414,371, 427, 68415,68418,68421,466, + 68407,68409,7993, 61233,362, 68417,317, 68422,68408,68410,68413,2116, 68416,68411,68412,4591, 317, 345, 317, 1526, 68414,371, 427, 68415,68418,68421,466, 68419,68420,317, 380, 6420, 317, 418, 68423,317, 68424,3999, 317, 68426,68427,21271,67687,317, 68428,68429,68431,68434,68436,68437,68438,68439,68441,68442, - 68444,68448,2381, 68449,68452,68453,390, 16220,317, 68432,24090,332, 68433,68435,10453,10454,5324, 30164,9214, 23696,65590,1345, 317, 68440,317, 317, 7871, + 68444,68448,2381, 68449,68452,68453,390, 16220,317, 68432,24090,332, 68433,68435,10453,10454,5324, 30164,9214, 23696,65590,1345, 317, 68440,317, 317, 7871, 7916, 5570, 24398,68443,55010,68445,68447,68446,68450,15464,68451,2272, 317, 365, 5439, 332, 5694, 356, 20497,605, 6195, 68454,68456,511, 362, 68457,24957, - 68458,363, 68459,68461,68463,7398, 68462,489, 5793, 2322, 68465,317, 68467,317, 68468,68469,68471,68474,514, 316, 490, 332, 365, 332, 68470,9337, 339, + 68458,363, 68459,68461,68463,7398, 68462,489, 5793, 2322, 68465,317, 68467,317, 68468,68469,68471,68474,514, 316, 490, 332, 365, 332, 68470,9337, 339, 28334,9720, 68472,2510, 68473,343, 332, 370, 490, 68475,68529,68588,7942, 68633,68680,68709,68740,68802,68833,68874,317, 68476,68478,68481,68485,68487,68490, 68495,11040,68496,68500,68503,68507,68509,2295, 68516,68519,7035, 350, 317, 371, 5223, 317, 2576, 317, 68477,16129,511, 68479,68480,317, 14790,317, 68482, - 14999,350, 60574,36472,68483,68484,68486,6917, 317, 419, 2298, 68488,317, 317, 68489,2510, 39812,68491,68493,68492,68494,54538,350, 350, 1325, 5223, 373, - 390, 317, 68497,68499,605, 68498,351, 8948, 382, 68501,380, 466, 2134, 317, 317, 68502,17471,6203, 371, 68504,37584,343, 317, 332, 68505,68506,351, + 14999,350, 60574,36472,68483,68484,68486,6917, 317, 419, 2298, 68488,317, 317, 68489,2510, 39812,68491,68493,68492,68494,54538,350, 350, 1325, 5223, 373, + 390, 317, 68497,68499,605, 68498,351, 8948, 382, 68501,380, 466, 2134, 317, 317, 68502,17471,6203, 371, 68504,37584,343, 317, 332, 68505,68506,351, 867, 68508,2108, 48289,68510,68511,9450, 68512,2108, 350, 68513,68514,68515,2222, 43000,9289, 2108, 351, 351, 6673, 5896, 16464,317, 466, 362, 343, 68517, 68518,363, 350, 66268,5896, 380, 317, 343, 362, 68520,2134, 351, 68521,15821,68523,68524,1060, 68525,39569,1999, 385, 343, 68522,5663, 9444, 68526,68527, - 68528,68530,13653,68531,68533,68534,68535,24008,68537,68541,68548,68554,68559,68564,68567,23881,68576,68578,68583,343, 68585,2222, 2577, 2222, 68532,16579,350, - 4738, 32298,350, 29307,10185,2222, 5392, 1033, 68536,31227,350, 16860,68538,317, 317, 68539,68540,68542,68545,479, 68547,450, 8522, 2087, 68543,30795,350, - 68544,317, 68546,350, 317, 1453, 2219, 317, 2222, 317, 381, 68549,317, 68550,68552,3999, 362, 317, 68551,15047,33386,350, 68553,479, 68555,68557,8136, - 466, 37194,5431, 1060, 317, 317, 68556,68558,7384, 14084,317, 371, 2134, 68560,6598, 501, 68562,2022, 317, 317, 68561,12478,68563,362, 68565,345, 350, + 68528,68530,13653,68531,68533,68534,68535,24008,68537,68541,68548,68554,68559,68564,68567,23881,68576,68578,68583,343, 68585,2222, 2577, 2222, 68532,16579,350, + 4738, 32298,350, 29307,10185,2222, 5392, 1033, 68536,31227,350, 16860,68538,317, 317, 68539,68540,68542,68545,479, 68547,450, 8522, 2087, 68543,30795,350, + 68544,317, 68546,350, 317, 1453, 2219, 317, 2222, 317, 381, 68549,317, 68550,68552,3999, 362, 317, 68551,15047,33386,350, 68553,479, 68555,68557,8136, + 466, 37194,5431, 1060, 317, 317, 68556,68558,7384, 14084,317, 371, 2134, 68560,6598, 501, 68562,2022, 317, 317, 68561,12478,68563,362, 68565,345, 350, 68566,345, 24051,68568,351, 1383, 33256,350, 68569,511, 16679,68571,1108, 68575,5810, 380, 511, 10041,68570,68572,68573,68574,351, 4738, 317, 68577,24065, 68579,10907,9938, 68581,68582,12416,68580,68584,68586,68587,68589,68592,68593,68596,68603,5423, 68606,68609,68612,68617,68618,68621,68626,68628,26436,332, 68590, 68591,8765, 490, 317, 12246,2078, 68594,68595,350, 11662,317, 12732,68597,68598,68600,68601,68602,68599,350, 28972,317, 15308,317, 4965, 343, 26065,66688, @@ -11367,52 +11362,52 @@ static const unsigned int ChildLocs[185261] = 35982,8594, 343, 350, 68504,396, 68611,373, 3284, 68613,10487,490, 68616,3987, 68614,350, 68615,13650,12710,317, 536, 2509, 68619,2222, 317, 553, 45257, 55409,68620,350, 10922,13653,68622,68623,317, 2110, 68624,68625,68627,68629,356, 68630,68631,68632,68634,68646,68660,68670,68677,384, 68635,17021,68636,68637, 68639,68640,381, 4045, 68642,17375,68643,68645,7940, 7392, 317, 68638,350, 5838, 68641,68644,68647,317, 2134, 68649,68650,350, 68652,68653,68654,14263,68656, - 10820,68659,317, 68648,317, 350, 9059, 8600, 350, 68651,45194,317, 350, 2184, 7949, 5626, 350, 350, 350, 350, 1453, 317, 68655,15461,16464,317, 2568, - 36302,350, 68657,10081,68658,362, 68661,68665,2152, 68666,68668,11418,68669,68662,2222, 68663,22983,68664,317, 7624, 9938, 2222, 7651, 350, 68667,350, 2222, - 31770,68671,382, 1060, 68672,68674,5896, 68673,5896, 351, 362, 317, 16017,68675,24229,68676,13670,5662, 317, 349, 68678,68679,317, 11418,350, 1453, 5897, + 10820,68659,317, 68648,317, 350, 9059, 8600, 350, 68651,45194,317, 350, 2184, 7949, 5626, 350, 350, 350, 350, 1453, 317, 68655,15461,16464,317, 2568, + 36302,350, 68657,10081,68658,362, 68661,68665,2152, 68666,68668,11418,68669,68662,2222, 68663,22983,68664,317, 7624, 9938, 2222, 7651, 350, 68667,350, 2222, + 31770,68671,382, 1060, 68672,68674,5896, 68673,5896, 351, 362, 317, 16017,68675,24229,68676,13670,5662, 317, 349, 68678,68679,317, 11418,350, 1453, 5897, 396, 68681,68688,68697,68704,68707,350, 380, 68682,68686,1108, 68687,317, 466, 68683,1108, 68685,68684,350, 317, 1108, 68689,68691,68692,68694,68696,68690, - 2507, 39812,68693,466, 350, 68695,40248,351, 343, 1108, 371, 68698,68700,317, 373, 381, 68703,13670,351, 543, 1020, 68699,68701,343, 317, 2222, 511, + 2507, 39812,68693,466, 350, 68695,40248,351, 343, 1108, 371, 68698,68700,317, 373, 381, 68703,13670,351, 543, 1020, 68699,68701,343, 317, 2222, 511, 68702,317, 37220,317, 343, 6596, 317, 8116, 2222, 371, 317, 68705,68706,350, 36242,396, 380, 371, 68708,68710,68718,68731,68735,68737,31959,38267,68711, 350, 68714,68715,380, 6736, 2510, 16463,68717,68712,68713,68716,1108, 350, 418, 68719,68721,68724,68728,68729,68730,68720,317, 5138, 5897, 48845,362, 68722, - 68723,68725,351, 350, 68726,45287,68727,350, 10185,350, 39812,350, 5866, 68732,350, 17255,465, 68733,350, 362, 54047,68734,13392,350, 38893,343, 351, + 68723,68725,351, 350, 68726,45287,68727,350, 10185,350, 39812,350, 5866, 68732,350, 17255,465, 68733,350, 362, 54047,68734,13392,350, 38893,343, 351, 1060, 68736,317, 3284, 9644, 68738,68739,15459,317, 317, 68741,68742,68743,68745,68765,11940,8545, 371, 68766,68775,68777,68781,68793,68794,68762,68796,68797, 5037, 68798,48354,4949, 68744,68746,371, 350, 68747,68748,68750,68751,68760,68762,68763,343, 2298, 6598, 68749,362, 351, 14834,14841,351, 68752,68753,68754, - 68757,14952,68759,16092,2584, 9012, 13686,13219,35678,479, 14470,990, 5662, 317, 68755,68756,68758,1830, 381, 68761,14353,68764,428, 67813,11743,68767,9450, + 68757,14952,68759,16092,2584, 9012, 13686,13219,35678,479, 14470,990, 5662, 317, 68755,68756,68758,1830, 381, 68761,14353,68764,428, 67813,11743,68767,9450, 9624, 19287,68773,2391, 68774,39082,68768,68769,370, 9139, 68770,68771,68772,4965, 43729,37239,317, 68776,9444, 351, 363, 350, 68778,68779,68780,6598, 14708, - 4738, 317, 1108, 371, 14689,317, 10560,479, 62117,5896, 371, 6598, 362, 381, 317, 317, 317, 68782,68792,6996, 2119, 68783,32534,22775,9624, 68784,7504, + 4738, 317, 1108, 371, 14689,317, 10560,479, 62117,5896, 371, 6598, 362, 381, 317, 317, 317, 68782,68792,6996, 2119, 68783,32534,22775,9624, 68784,7504, 466, 68788,11242,317, 68790,12423,550, 3020, 6894, 68785,68786,68787,68789,317, 5450, 2156, 68791,2510, 28707,16092,541, 60586,2087, 6596, 38982,350, 68795, 12789,317, 2108, 450, 15017,2058, 5309, 501, 15457,11307,10022,68799,68800,68801,68803,68808,68818,68821,68830,68832,317, 371, 32289,566, 396, 10185,68804, 68806,68807,566, 349, 68805,317, 381, 317, 1108, 317, 68809,350, 68810,350, 68815,68816,1060, 371, 68817,350, 553, 350, 68811,68813,68811,68812,68814, - 8722, 68812,317, 6917, 351, 15892,9938, 350, 350, 371, 68819,68820,350, 350, 350, 350, 317, 350, 396, 419, 566, 371, 68822,68823,396, 380, 437, + 8722, 68812,317, 6917, 351, 15892,9938, 350, 350, 371, 68819,68820,350, 350, 350, 350, 317, 350, 396, 419, 566, 371, 68822,68823,396, 380, 437, 514, 381, 343, 68826,2222, 68824,317, 68825,317, 350, 33733,350, 68827,317, 317, 68828,68829,5866, 380, 68831,371, 1060, 343, 68834,68835,2134, 68839, - 68844,317, 68845,68846,68847,68854,68860,68861,68864,68866,68868,351, 68872,2108, 343, 21274,343, 68836,68838,68837,5662, 23576,362, 68840,9938, 68841,2577, + 68844,317, 68845,68846,68847,68854,68860,68861,68864,68866,68868,351, 68872,2108, 343, 21274,343, 68836,68838,68837,5662, 23576,362, 68840,9938, 68841,2577, 68842,23881,68843,317, 4965, 343, 350, 363, 31580,466, 5662, 317, 1358, 1358, 14296,68848,68849,15581,10185,362, 68850,25455,1358, 33028,317, 68851,68852, 6691, 345, 345, 317, 317, 68853,12060,345, 68855,351, 317, 2222, 68858,16129,68856,350, 9521, 68857,350, 68859,16436,317, 350, 5626, 68862,68863,24229, 381, 4965, 317, 466, 68865,362, 317, 317, 2298, 68867,37393,8178, 317, 350, 68869,68870,68871,362, 42724,68873,12713,8023, 68875,68894,68911,68921,68922, - 1108, 68876,68878,350, 68879,8325, 68881,68885,345, 7408, 68877,11147,9644, 404, 1358, 317, 68880,62036,317, 10487,68882,68883,343, 317, 68884,317, 1108, + 1108, 68876,68878,350, 68879,8325, 68881,68885,345, 7408, 68877,11147,9644, 404, 1358, 317, 68880,62036,317, 10487,68882,68883,343, 317, 68884,317, 1108, 317, 317, 68886,68890,363, 466, 317, 68887,47444,68888,14834,362, 42535,68889,317, 7911, 68891,14834,5956, 68893,10538,68892,317, 47444,39009,68895,68896, 2510, 2134, 68897,42672,68904,8649, 68906,1108, 501, 2108, 380, 343, 68898,68899,22130,317, 68900,345, 68901,68902,1999, 21274,5896, 21274,13335,9567, 68903, - 371, 68905,1358, 11349,49576,350, 6206, 4738, 68907,3999, 68909,317, 68908,68910,350, 68912,68916,2152, 68918,5737, 68920,4576, 350, 68913,68914,68915,1998, + 371, 68905,1358, 11349,49576,350, 6206, 4738, 68907,3999, 68909,317, 68908,68910,350, 68912,68916,2152, 68918,5737, 68920,4576, 350, 68913,68914,68915,1998, 350, 317, 317, 68917,10629,5223, 68919,317, 12731,27614,350, 605, 350, 9644, 427, 350, 16876,412, 68924,68935,68936,68938,9623, 9163, 418, 68947,68948, - 68951,68953,68955,68956,68960,68961,25909,2279, 68925,68928,68929,68933,7521, 401, 6471, 68926,317, 68927,7035, 332, 365, 68930,2110, 490, 68931,68932,317, + 68951,68953,68955,68956,68960,68961,25909,2279, 68925,68928,68929,68933,7521, 401, 6471, 68926,317, 68927,7035, 332, 365, 68930,2110, 490, 68931,68932,317, 2211, 68934,7567, 6607, 68937,14131,68939,8333, 6461, 68940,68943,343, 68941,68942,317, 317, 68944,28631,68945,4268, 68946,7223, 965, 2280, 2227, 5241, 68949, - 68950,317, 490, 68952,15027,15095,68954,373, 317, 8400, 332, 317, 68957,68958,68959,7411, 317, 345, 490, 2413, 6458, 332, 68963,317, 68964,5173, 350, - 365, 68965,317, 595, 68966,68967,68968,2163, 68970,2280, 68971,68972,317, 380, 68974,490, 68978,68979,68986,68988,68998,69004,69013,69014,69015,6021, 343, + 68950,317, 490, 68952,15027,15095,68954,373, 317, 8400, 332, 317, 68957,68958,68959,7411, 317, 345, 490, 2413, 6458, 332, 68963,317, 68964,5173, 350, + 365, 68965,317, 595, 68966,68967,68968,2163, 68970,2280, 68971,68972,317, 380, 68974,490, 68978,68979,68986,68988,68998,69004,69013,69014,69015,6021, 343, 343, 317, 68973,363, 68975,5273, 58812,68976,38027,883, 68977,1588, 5439, 2178, 5652, 343, 1347, 2188, 7225, 2188, 68980,390, 68982,68983,317, 343, 68981, - 5942, 317, 633, 43960,68984,317, 68985,55670,15618,466, 317, 68987,68989,68990,68991,2058, 9522, 26769,68994,68997,8766, 317, 20146,2322, 5570, 317, 317, - 23337,11263,317, 68992,1347, 68993,7389, 476, 2272, 370, 3076, 68995,62105,363, 317, 68996,345, 1077, 8948, 68999,20638,5005, 7949, 69001,345, 69000,1300, - 317, 317, 317, 363, 69002,317, 4984, 69003,317, 1160, 11761,9626, 5037, 69005,2298, 69009,69011,6917, 69012,69006,69007,69008,69010,356, 343, 466, 2603, - 317, 317, 31806,466, 19922,317, 9878, 24070,501, 2184, 69016,69017,6231, 365, 69019,69035,69046,69057,69064,2184, 69020,69021,69022,69029,69031,69034,373, - 384, 69023,69024,69025,69026,69027,69028,7448, 5394, 10877,4952, 69030,317, 15130,5991, 466, 1160, 69032,69033,69036,69038,7386, 69045,69037,2183, 69039,356, - 10877,69040,69041,69042,69043,69044,15260,17341,356, 3999, 343, 317, 38066,8116, 13837,69047,69049,69050,69052,69054,2568, 69055,380, 26627,69048,350, 2387, + 5942, 317, 633, 43960,68984,317, 68985,55670,15618,466, 317, 68987,68989,68990,68991,2058, 9522, 26769,68994,68997,8766, 317, 20146,2322, 5570, 317, 317, + 23337,11263,317, 68992,1347, 68993,7389, 476, 2272, 370, 3076, 68995,62105,363, 317, 68996,345, 1077, 8948, 68999,20638,5005, 7949, 69001,345, 69000,1300, + 317, 317, 317, 363, 69002,317, 4984, 69003,317, 1160, 11761,9626, 5037, 69005,2298, 69009,69011,6917, 69012,69006,69007,69008,69010,356, 343, 466, 2603, + 317, 317, 31806,466, 19922,317, 9878, 24070,501, 2184, 69016,69017,6231, 365, 69019,69035,69046,69057,69064,2184, 69020,69021,69022,69029,69031,69034,373, + 384, 69023,69024,69025,69026,69027,69028,7448, 5394, 10877,4952, 69030,317, 15130,5991, 466, 1160, 69032,69033,69036,69038,7386, 69045,69037,2183, 69039,356, + 10877,69040,69041,69042,69043,69044,15260,17341,356, 3999, 343, 317, 38066,8116, 13837,69047,69049,69050,69052,69054,2568, 69055,380, 26627,69048,350, 2387, 69051,419, 345, 69053,317, 5991, 466, 30357,317, 34600,69042,69056,350, 69058,69060,22809,514, 990, 343, 8207, 69062,69059,2381, 351, 69061,554, 26277, - 317, 317, 69063,69065,6240, 69067,3338, 69068,69070,69073,69074,69066,4952, 317, 69069,317, 69071,69072,596, 52644,69075,363, 69076,60070,317, 69078,317, + 317, 317, 69063,69065,6240, 69067,3338, 69068,69070,69073,69074,69066,4952, 317, 69069,317, 69071,69072,596, 52644,69075,363, 69076,60070,317, 69078,317, 1932, 69079,69080,69081,69083,11388,69085,69088,2322, 69089,69096,69097,2381, 69098,5793, 69099,69104,69084,16424,317, 54968,362, 867, 317, 10628,350, 69086, - 7273, 69087,2322, 69090,69094,29069,69091,69092,69093,317, 1160, 1992, 363, 363, 69095,356, 466, 2510, 21741,53832,370, 2537, 29069,365, 2584, 66769,365, - 370, 2178, 69100,69101,8643, 317, 69102,69103,466, 27732,317, 69105,69106,317, 69107,2381, 339, 69110,69111,36049,69113,69115,16092,39818,69120,69124,1060, + 7273, 69087,2322, 69090,69094,29069,69091,69092,69093,317, 1160, 1992, 363, 363, 69095,356, 466, 2510, 21741,53832,370, 2537, 29069,365, 2584, 66769,365, + 370, 2178, 69100,69101,8643, 317, 69102,69103,466, 27732,317, 69105,69106,317, 69107,2381, 339, 69110,69111,36049,69113,69115,16092,39818,69120,69124,1060, 5241, 5872, 554, 69130,69116,69118,69117,69119,69121,69122,69123,69125,69126,69127,69128,69129,69131,317, 69132,69133,69134,69193,69212,69251,69275,69306,69310, 69331,69332,69360,69361,69368,69418,69465,69550,69552,69589,69598,69676,69693,69713,69715,69736,69740,69781,69135,69147,69149,69152,69153,69156,1194, 511, 69161, - 69165,69169,69170,39466,69171,69177,69182,1131, 69187,69188,317, 69136,69137,69139,69141,69143,69145,6050, 4943, 1347, 317, 1347, 69138,6355, 69140,551, 5255, + 69165,69169,69170,39466,69171,69177,69182,1131, 69187,69188,317, 69136,69137,69139,69141,69143,69145,6050, 4943, 1347, 317, 1347, 69138,6355, 69140,551, 5255, 69142,8746, 530, 69144,317, 39406,69146,5223, 317, 2024, 69148,35005,69150,317, 69151,35524,6598, 12025,38013,8254, 17591,2510, 343, 2184, 69154,4563, 69155, 363, 4757, 1347, 345, 2156, 69157,69158,317, 501, 5962, 69159,69160,69162,2533, 67885,69164,384, 317, 6081, 317, 69163,381, 28241,21412,12696,6668, 69166, 69167,345, 1347, 4267, 69168,356, 2156, 16090,2222, 29108,351, 6187, 39003,1345, 370, 69172,317, 5991, 11373,3854, 69174,24504,69175,4980, 317, 370, 69173, @@ -11421,403 +11416,403 @@ static const unsigned int ChildLocs[185261] = 501, 69201,4980, 69206,69209,4949, 69195,356, 69196,5727, 332, 8177, 69197,69198,69200,69199,4984, 363, 23973,317, 317, 9182, 69202,23193,69204,69203,69205, 356, 69207,479, 69208,43060,10476,69210,363, 69211,69213,332, 69214,69218,69220,69224,69225,69229,317, 69236,69240,317, 381, 10655,5441, 69215,69216,69217, 466, 350, 69219,35005,351, 69221,69222,362, 317, 69223,317, 61789,5866, 69226,55491,1033, 69227,69228,356, 4952, 370, 3854, 317, 317, 1588, 62729,69230, - 412, 393, 370, 381, 69231,621, 1266, 317, 633, 69232,5447, 5847, 370, 568, 317, 69233,69234,317, 69235,345, 28578,69237,12685,317, 69238,69239,317, + 412, 393, 370, 381, 69231,621, 1266, 317, 633, 69232,5447, 5847, 370, 568, 317, 69233,69234,317, 69235,345, 28578,69237,12685,317, 69238,69239,317, 4564, 356, 317, 69241,69244,69246,69242,69243,69245,317, 11824,317, 1700, 69247,69248,382, 69249,574, 317, 69250,1160, 345, 5488, 69252,69255,404, 69258, 69260,69262,69268,362, 490, 69271,6136, 433, 69272,2391, 317, 490, 5241, 317, 69253,2001, 69254,1325, 21988,69256,9695, 69257,69259,317, 332, 8205, 69261, - 2022, 2391, 9624, 12025,317, 2142, 69263,317, 69267,370, 69264,69265,69266,32902,317, 69269,6036, 384, 69270,317, 317, 490, 1358, 433, 69273,317, 8136, + 2022, 2391, 9624, 12025,317, 2142, 69263,317, 69267,370, 69264,69265,69266,32902,317, 69269,6036, 384, 69270,317, 317, 490, 1358, 433, 69273,317, 8136, 466, 69274,5221, 2571, 69276,69277,69278,69281,69283,69284,69285,3999, 69287,69289,69291,69297,69299,32485,69303,69304,2509, 10538,23751,35677,68502,578, 69279, - 69280,19283,356, 10877,69282,58436,317, 317, 476, 10877,13659,24570,2510, 23576,15457,13837,2577, 69286,6831, 10580,69288,2024, 16318,2193, 317, 69290,1345, - 10561,1358, 2108, 2586, 10041,69292,8553, 69293,1588, 317, 69294,69295,69296,370, 69298,317, 990, 69300,466, 317, 317, 69301,69302,605, 317, 33712,317, + 69280,19283,356, 10877,69282,58436,317, 317, 476, 10877,13659,24570,2510, 23576,15457,13837,2577, 69286,6831, 10580,69288,2024, 16318,2193, 317, 69290,1345, + 10561,1358, 2108, 2586, 10041,69292,8553, 69293,1588, 317, 69294,69295,69296,370, 69298,317, 990, 69300,466, 317, 317, 69301,69302,605, 317, 33712,317, 69305,363, 69307,69308,356, 69309,10487,371, 5656, 381, 16767,69311,69314,69316,10629,2188, 350, 69319,10845,69323,69325,69330,1230, 69312,69313,490, 69315, 317, 69317,69318,362, 4980, 69320,69321,69322,18946,356, 317, 5241, 5241, 490, 9027, 69324,9383, 69326,4757, 332, 69327,381, 15095,69328,69329,1325, 30706, 5447, 4984, 18470,18203,351, 433, 317, 1998, 479, 5223, 3236, 7942, 48482,69333,69336,69342,69343,69344,365, 69349,69350,10072,69352,69353,2222, 69354,69358, 317, 22130,3987, 348, 490, 69359,69334,578, 317, 317, 317, 69335,33255,317, 317, 69337,489, 69341,362, 350, 317, 5105, 69338,1347, 39569,69339,69340, - 4965, 44992,31135,8266, 5810, 21274,1998, 24570,345, 1999, 12731,35973,6917, 69345,5809, 69346,69347,69348,418, 380, 317, 6036, 69351,317, 2152, 7592, 2152, + 4965, 44992,31135,8266, 5810, 21274,1998, 24570,345, 1999, 12731,35973,6917, 69345,5809, 69346,69347,69348,418, 380, 317, 6036, 69351,317, 2152, 7592, 2152, 7866, 6709, 4965, 350, 69355,69356,20660,69357,2546, 397, 2510, 317, 6532, 27584,7951, 5423, 317, 370, 466, 365, 69362,565, 69363,69366,539, 2146, 69367, 69364,60676,12616,69365,16672,46641,69369,69371,69373,69374,69378,69388,8660, 13023,69392,69396,69398,69399,69403,596, 69404,390, 4372, 69405,69409,69410,69411, 69416,69417,317, 5655, 69370,23920,362, 350, 2146, 343, 35751,382, 69372,317, 69375,363, 69376,69377,317, 69379,404, 317, 317, 69382,69384,565, 69385, 317, 69380,317, 7913, 356, 69381,10149,2510, 317, 1992, 5055, 41130,317, 317, 69383,2391, 17642,69386,69387,345, 317, 69389,31338,69391,32603,317, 69390, - 317, 490, 317, 69393,317, 69394,69395,2322, 317, 5662, 404, 317, 2222, 16331,365, 501, 69397,1345, 17099,69400,5896, 69401,69402,18460,350, 385, 317, - 317, 9624, 317, 20615,371, 317, 317, 1347, 317, 371, 11678,66949,351, 363, 69406,69407,3611, 317, 317, 317, 69408,6593, 12700,69412,69414,69415,317, + 317, 490, 317, 69393,317, 69394,69395,2322, 317, 5662, 404, 317, 2222, 16331,365, 501, 69397,1345, 17099,69400,5896, 69401,69402,18460,350, 385, 317, + 317, 9624, 317, 20615,371, 317, 317, 1347, 317, 371, 11678,66949,351, 363, 69406,69407,3611, 317, 317, 317, 69408,6593, 12700,69412,69414,69415,317, 69413,490, 16579,317, 370, 2063, 363, 351, 350, 2391, 69419,69421,69423,69425,343, 350, 69450,362, 69453,69455,69462,5126, 1428, 69463,363, 1160, 69420, 20075,2357, 30214,317, 11831,6170, 69422,351, 7622, 58206,2631, 1358, 69424,5450, 6834, 339, 384, 7116, 31775,490, 69426,69428,2022, 363, 69438,37596,69442, 6163, 69446,69448,69449,5087, 69427,69429,69432,69430,69431,343, 10408,404, 69433,69434,69435,69436,69437,69439,69440,69441,69443,2155, 1588, 317, 69444,69445, - 317, 317, 5055, 345, 317, 69447,1347, 8804, 6188, 69451,350, 69452,345, 317, 7149, 69454,1347, 8569, 317, 69456,428, 343, 69461,317, 69457,69458,8611, - 69459,69460,317, 2211, 9732, 69464,317, 69466,69470,69471,69483,36417,69501,69503,69505,317, 357, 2163, 69512,69518,69520,69537,69548,1109, 2004, 26721,7776, - 69467,29304,317, 317, 69468,345, 69469,69472,69473,69475,3529, 5611, 317, 332, 69474,69476,69477,69478,69479,69480,69481,69482,69484,69485,350, 69489,9537, + 317, 317, 5055, 345, 317, 69447,1347, 8804, 6188, 69451,350, 69452,345, 317, 7149, 69454,1347, 8569, 317, 69456,428, 343, 69461,317, 69457,69458,8611, + 69459,69460,317, 2211, 9732, 69464,317, 69466,69470,69471,69483,36417,69501,69503,69505,317, 357, 2163, 69512,69518,69520,69537,69548,1109, 2004, 26721,7776, + 69467,29304,317, 317, 69468,345, 69469,69472,69473,69475,3529, 5611, 317, 332, 69474,69476,69477,69478,69479,69480,69481,69482,69484,69485,350, 69489,9537, 69493,69496,317, 5105, 433, 332, 69486,69487,69488,69490,69491,69492,69494,69495,523, 433, 69497,69498,69499,69500,15459,351, 2146, 2357, 4060, 11911,69502, 38751,69504,6547, 40281,396, 7327, 69506,69508,317, 69507,69509,69510,69511,69513,69517,3111, 317, 69514,69515,69516,69519,371, 317, 345, 489, 69521,69526, - 365, 69529,343, 5213, 69534,317, 69536,7698, 69522,69523,69524,69525,30579,317, 317, 317, 6406, 362, 69527,317, 69528,370, 382, 2108, 26788,69530,382, - 69531,6674, 17943,6021, 69532,69533,7888, 69535,57506,317, 317, 69538,69539,3361, 69541,1943, 69547,317, 380, 69540,1347, 6266, 69542,69545,69543,69544,380, + 365, 69529,343, 5213, 69534,317, 69536,7698, 69522,69523,69524,69525,30579,317, 317, 317, 6406, 362, 69527,317, 69528,370, 382, 2108, 26788,69530,382, + 69531,6674, 17943,6021, 69532,69533,7888, 69535,57506,317, 317, 69538,69539,3361, 69541,1943, 69547,317, 380, 69540,1347, 6266, 69542,69545,69543,69544,380, 69546,5105, 596, 317, 69549,539, 365, 317, 69551,380, 317, 69553,69558,69559,69565,69567,69568,2163, 69569,69583,69588,362, 317, 345, 382, 69554,69555, - 373, 69556,7640, 69557,2510, 382, 5055, 5250, 69560,69563,404, 345, 317, 69561,69562,69564,317, 390, 362, 317, 69566,5570, 1347, 37305,60449,317, 317, + 373, 69556,7640, 69557,2510, 382, 5055, 5250, 69560,69563,404, 345, 317, 69561,69562,69564,317, 390, 362, 317, 69566,5570, 1347, 37305,60449,317, 317, 4060, 317, 5105, 69570,69579,363, 317, 69581,1481, 69571,317, 317, 69572,69573,317, 69574,69575,69576,69577,69578,317, 25988,69580,5431, 4591, 345, 69582, - 317, 69584,11626,69585,69586,11626,69587,5238, 2004, 69590,69591,69596,69597,490, 2110, 1347, 69592,69594,8139, 69593,69595,17917,5488, 9720, 1444, 490, 2533, + 317, 69584,11626,69585,69586,11626,69587,5238, 2004, 69590,69591,69596,69597,490, 2110, 1347, 69592,69594,8139, 69593,69595,17917,5488, 9720, 1444, 490, 2533, 949, 69599,69607,69608,69609,69610,69618,69619,13113,69623,69642,362, 69643,69644,6409, 69647,69653,69657,69663,11183,1030, 69664,7850, 5241, 69600,69602,69603, 69604,69605,2537, 12854,69601,1109, 8354, 8083, 490, 2086, 12448,317, 39550,69606,363, 8214, 317, 317, 345, 4965, 343, 2381, 867, 490, 69611,69612,69613, - 317, 317, 317, 69614,69615,317, 43944,69617,317, 317, 69616,476, 426, 511, 476, 317, 2369, 1479, 69620,69622,18739,317, 4267, 56358,1160, 317, 381, - 69621,6228, 317, 7118, 317, 1160, 343, 1347, 69624,69629,1347, 317, 471, 317, 69630,69640,2317, 490, 69625,2211, 69626,370, 317, 21365,69627,69628,356, + 317, 317, 317, 69614,69615,317, 43944,69617,317, 317, 69616,476, 426, 511, 476, 317, 2369, 1479, 69620,69622,18739,317, 4267, 56358,1160, 317, 381, + 69621,6228, 317, 7118, 317, 1160, 343, 1347, 69624,69629,1347, 317, 471, 317, 69630,69640,2317, 490, 69625,2211, 69626,370, 317, 21365,69627,69628,356, 13928,5226, 1109, 9200, 317, 69631,69637,317, 317, 69632,69633,69634,69635,69636,69638,69639,69641,2368, 371, 5431, 69645,5055, 332, 69646,490, 69648,69650, 345, 317, 69649,69651,8649, 69652,6064, 363, 1347, 69654,5428, 69655,317, 69656,317, 10815,351, 317, 69658,69662,363, 317, 332, 69659,317, 69660,33467, - 317, 1325, 3640, 69661,363, 20997,69665,69668,69669,4944, 345, 345, 317, 69666,9182, 317, 69667,25086,2142, 317, 6420, 317, 574, 317, 317, 69670,2537, - 69674,14388,1347, 69675,345, 69671,19510,637, 317, 936, 410, 317, 69672,317, 363, 69673,11724,317, 317, 5412, 343, 69677,332, 69679,67680,5481, 332, + 317, 1325, 3640, 69661,363, 20997,69665,69668,69669,4944, 345, 345, 317, 69666,9182, 317, 69667,25086,2142, 317, 6420, 317, 574, 317, 317, 69670,2537, + 69674,14388,1347, 69675,345, 69671,19510,637, 317, 936, 410, 317, 69672,317, 363, 69673,11724,317, 317, 5412, 343, 69677,332, 69679,67680,5481, 332, 15745,490, 69680,6197, 69681,69688,69690,69678,2612, 317, 69682,69683,69684,69685,69686,69687,317, 351, 69689,350, 54166,5742, 343, 317, 9852, 371, 69691, 6300, 490, 69692,69694,5960, 35155,11986,69695,69697,69698,4984, 69700,69701,69708,39812,317, 6964, 489, 357, 351, 317, 69696,371, 351, 69699,384, 69702, 69704,69705,363, 317, 2406, 69703,5896, 4952, 317, 332, 14388,69706,466, 317, 69707,1347, 317, 4267, 12277,1588, 69709,69710,380, 33729,69711,317, 69712, - 1998, 428, 22130,317, 20975,382, 69714,345, 349, 69716,883, 69721,69733,2279, 596, 317, 69717,9224, 317, 69719,69718,69720,990, 69722,69729,317, 1160, - 8345, 69723,69724,370, 4982, 317, 69725,317, 69726,1060, 2719, 633, 381, 69727,317, 28691,1155, 69728,69730,24978,69731,1347, 317, 48051,7214, 345, 4984, + 1998, 428, 22130,317, 20975,382, 69714,345, 349, 69716,883, 69721,69733,2279, 596, 317, 69717,9224, 317, 69719,69718,69720,990, 69722,69729,317, 1160, + 8345, 69723,69724,370, 4982, 317, 69725,317, 69726,1060, 2719, 633, 381, 69727,317, 28691,1155, 69728,69730,24978,69731,1347, 317, 48051,7214, 345, 4984, 69732,370, 371, 351, 2590, 69734,317, 31405,365, 1843, 69735,69737,69738,69739,317, 15380,343, 343, 576, 558, 356, 428, 317, 380, 59557,349, 18748, 382, 69741,619, 69742,69744,672, 69745,69748,69750,1347, 69751,2063, 69752,69754,69757,69758,2402, 69760,69761,69764,69767,69768,3710, 69771,69774,541, 69743, - 343, 694, 2888, 69746,350, 69747,69749,382, 3031, 2308, 24305,363, 24398,2571, 69753,5205, 6089, 317, 317, 69755,382, 69756,476, 541, 69759,33343,3901, - 317, 9027, 633, 8322, 69762,14449,381, 345, 69763,69765,5689, 10519,2553, 363, 11344,2033, 69766,2369, 381, 2060, 9557, 345, 69769,69770,317, 32430,370, - 345, 69772,69773,13760,317, 637, 38353,8258, 2060, 633, 476, 69775,3076, 39835,69778,69779,2272, 5872, 69780,1428, 4789, 2277, 69776,69777,68211,1345, 2074, - 3338, 434, 11488,317, 380, 69782,69783,69788,5991, 69789,362, 69790,39812,69792,317, 69794,69784,69785,69786,69787,380, 10626,5810, 1999, 24570,69791,351, - 69793,351, 1358, 11648,69796,69798,69799,69800,69804,332, 69805,351, 490, 69797,69801,317, 69802,69803,69807,317, 69809,380, 69813,317, 69816,69808,7776, + 343, 694, 2888, 69746,350, 69747,69749,382, 3031, 2308, 24305,363, 24398,2571, 69753,5205, 6089, 317, 317, 69755,382, 69756,476, 541, 69759,33343,3901, + 317, 9027, 633, 8322, 69762,14449,381, 345, 69763,69765,5689, 10519,2553, 363, 11344,2033, 69766,2369, 381, 2060, 9557, 345, 69769,69770,317, 32430,370, + 345, 69772,69773,13760,317, 637, 38353,8258, 2060, 633, 476, 69775,3076, 39835,69778,69779,2272, 5872, 69780,1428, 4789, 2277, 69776,69777,68211,1345, 2074, + 3338, 434, 11488,317, 380, 69782,69783,69788,5991, 69789,362, 69790,39812,69792,317, 69794,69784,69785,69786,69787,380, 10626,5810, 1999, 24570,69791,351, + 69793,351, 1358, 11648,69796,69798,69799,69800,69804,332, 69805,351, 490, 69797,69801,317, 69802,69803,69807,317, 69809,380, 69813,317, 69816,69808,7776, 6240, 69810,69811,69812,69814,5120, 69815,14150,351, 69817,246, 365, 70013,247, 6585, 248, 70249,70252,70254,249, 70341,70371,70373,70414,70416,70417,69818, 69819,69820,69821,69823,69827,69834,69847,69849,69854,69855,69867,365, 69870,69883,69897,69914,69942,69943,69952,69954,69984,69987,69990,69994,69998,317, 70010, 70011,351, 27535,343, 317, 69822,317, 69824,69825,6780, 554, 381, 367, 317, 490, 1109, 1108, 8488, 69826,317, 69828,69829,317, 69830,2024, 466, 69832, - 317, 317, 69831,381, 69833,317, 2024, 317, 5224, 317, 605, 1321, 10943,69835,5394, 565, 69837,12141,69838,69845,16123,69846,363, 41564,5851, 69836,317, - 384, 317, 382, 317, 363, 317, 69839,681, 69840,43516,317, 633, 317, 649, 1353, 69842,69843,466, 5217, 69844,1160, 317, 317, 317, 69841,317, 317, - 69848,317, 4965, 69850,69851,362, 69852,12696,350, 501, 37610,317, 69853,339, 317, 317, 317, 317, 317, 26034,2178, 69030,44790,343, 317, 69856,2462, - 58333,69857,69859,69863,1444, 69865,317, 355, 20509,490, 317, 317, 317, 317, 69858,69860,69861,69862,69864,371, 2177, 565, 69866,4925, 69868,1109, 362, - 69869,69871,69872,2227, 69878,558, 69879,24279,69880,69881,317, 317, 379, 5840, 380, 317, 1347, 69873,1060, 317, 69874,69875,69876,69877,317, 317, 1992, + 317, 317, 69831,381, 69833,317, 2024, 317, 5224, 317, 605, 1321, 10943,69835,5394, 565, 69837,12141,69838,69845,16123,69846,363, 41564,5851, 69836,317, + 384, 317, 382, 317, 363, 317, 69839,681, 69840,43516,317, 633, 317, 649, 1353, 69842,69843,466, 5217, 69844,1160, 317, 317, 317, 69841,317, 317, + 69848,317, 4965, 69850,69851,362, 69852,12696,350, 501, 37610,317, 69853,339, 317, 317, 317, 317, 317, 26034,2178, 69030,44790,343, 317, 69856,2462, + 58333,69857,69859,69863,1444, 69865,317, 355, 20509,490, 317, 317, 317, 317, 69858,69860,69861,69862,69864,371, 2177, 565, 69866,4925, 69868,1109, 362, + 69869,69871,69872,2227, 69878,558, 69879,24279,69880,69881,317, 317, 379, 5840, 380, 317, 1347, 69873,1060, 317, 69874,69875,69876,69877,317, 317, 1992, 1109, 490, 351, 558, 38244,39231,317, 69882,69884,6546, 69885,69888,69889,69892,69895,317, 69896,317, 2004, 390, 69886,69887,565, 7672, 317, 317, 23533, 54501,69890,345, 69891,351, 370, 2571, 317, 69893,69894,1160, 9581, 633, 69898,69901,69903,69906,1020, 69907,69908,69909,69910,69911,1347, 2078, 317, 69899, 25525,4925, 69900,511, 317, 6674, 6388, 69902,317, 9695, 10560,6859, 363, 317, 379, 490, 69904,317, 317, 69905,490, 1345, 317, 382, 317, 501, 40281, - 317, 317, 317, 1020, 5295, 2272, 43634,354, 350, 69912,11342,69913,381, 69915,5896, 69916,69917,69919,69924,69927,69928,2022, 69934,12696,69938,69939,365, + 317, 317, 317, 1020, 5295, 2272, 43634,354, 350, 69912,11342,69913,381, 69915,5896, 69916,69917,69919,69924,69927,69928,2022, 69934,12696,69938,69939,365, 317, 317, 317, 14444,362, 317, 317, 13258,466, 5611, 317, 317, 6228, 317, 490, 17926,317, 69918,1011, 14444,9186, 69920,317, 69923,11749,69921,69922, 356, 5058, 69925,69926,1160, 343, 490, 2291, 490, 69929,351, 8035, 69933,362, 317, 69930,69931,69932,439, 1347, 363, 317, 69935,363, 69936,317, 69937, 69940,69941,365, 1078, 590, 317, 317, 317, 590, 554, 317, 64463,511, 551, 69944,69948,69949,17583,69950,69951,351, 317, 370, 357, 69945,23859,69946, 69947,12243,5611, 551, 8035, 317, 1011, 69953,2035, 5131, 69955,69956,2012, 69957,317, 69962,2533, 69964,69965,69967,69969,69971,365, 69980,69983,427, 13881, - 365, 1109, 317, 317, 6826, 317, 69958,317, 1383, 69961,380, 317, 32249,317, 317, 14062,69959,69960,490, 24242,13011,317, 69963,1109, 11607,51940,8281, + 365, 1109, 317, 317, 6826, 317, 69958,317, 1383, 69961,380, 317, 32249,317, 317, 14062,69959,69960,490, 24242,13011,317, 69963,1109, 11607,51940,8281, 19478,7928, 317, 317, 637, 317, 5397, 370, 16651,362, 317, 1160, 1155, 317, 69966,363, 605, 69968,2381, 11607,69970,6996, 633, 317, 490, 317, 69972, - 6713, 69973,69975,69976,404, 317, 14316,7214, 5223, 317, 69974,363, 317, 7911, 69977,69979,69978,501, 5841, 69981,12144,45918,69982,69985,6021, 69986,1160, - 501, 7384, 69988,371, 2022, 350, 10471,4279, 69989,2222, 6013, 596, 317, 384, 317, 317, 351, 317, 69991,2631, 69992,69993,351, 57253,317, 1160, 317, - 490, 490, 5793, 6209, 69995,10877,2631, 69996,3869, 69997,69999,350, 70001,317, 332, 362, 70004,2631, 70005,70006,70007,370, 350, 3284, 70000,317, 490, + 6713, 69973,69975,69976,404, 317, 14316,7214, 5223, 317, 69974,363, 317, 7911, 69977,69979,69978,501, 5841, 69981,12144,45918,69982,69985,6021, 69986,1160, + 501, 7384, 69988,371, 2022, 350, 10471,4279, 69989,2222, 6013, 596, 317, 384, 317, 317, 351, 317, 69991,2631, 69992,69993,351, 57253,317, 1160, 317, + 490, 490, 5793, 6209, 69995,10877,2631, 69996,3869, 69997,69999,350, 70001,317, 332, 362, 70004,2631, 70005,70006,70007,370, 350, 3284, 70000,317, 490, 5353, 490, 317, 70002,70003,317, 637, 317, 490, 343, 490, 317, 490, 70008,70009,317, 390, 490, 5793, 317, 70012,3869, 7490, 490, 70014,42505,70015, 70022,70024,70026,70028,70039,70041,70043,70051,70056,70081,70084,70095,70106,70124,70125,70131,70132,70136,70137,317, 70016,362, 34261,5661, 10633,317, 70017, 16278,70021,596, 317, 70018,5159, 57131,362, 317, 363, 70020,15952,317, 70019,317, 70023,370, 10505,19493,317, 2077, 382, 5126, 70025,70027,48320,23305, - 2391, 317, 490, 23995,35774,381, 70029,70030,70031,70032,70036,70037,70038,317, 2077, 70033,70035,70034,11089,1020, 363, 351, 363, 2571, 380, 356, 466, - 2584, 317, 317, 70040,35962,67184,16923,33846,317, 1526, 70042,343, 479, 317, 317, 1358, 490, 2298, 70044,70047,70048,8178, 343, 70045,317, 317, 317, + 2391, 317, 490, 23995,35774,381, 70029,70030,70031,70032,70036,70037,70038,317, 2077, 70033,70035,70034,11089,1020, 363, 351, 363, 2571, 380, 356, 466, + 2584, 317, 317, 70040,35962,67184,16923,33846,317, 1526, 70042,343, 479, 317, 317, 1358, 490, 2298, 70044,70047,70048,8178, 343, 70045,317, 317, 317, 70046,16637,1347, 70049,4982, 70050,70052,70053,70054,70055,70057,70058,70062,70064,12109,70065,70066,70067,70068,11236,27732,351, 7949, 6601, 70077,70078,70080, 317, 317, 10011,14341,70059,317, 317, 70060,5037, 70061,363, 5684, 70063,553, 384, 1060, 8325, 317, 317, 2152, 44592,317, 70069,70070,70071,3023, 70073, - 70076,362, 385, 317, 427, 1160, 27367,317, 317, 63336,317, 1160, 70072,70074,479, 345, 70075,317, 382, 332, 6013, 343, 363, 70079,16867,3999, 317, - 70082,70083,1481, 38875,3987, 2156, 11198,70085,5897, 70089,317, 2291, 70090,70091,5623, 965, 490, 70092,404, 2357, 70093,70086,1943, 70087,70088,12731,343, + 70076,362, 385, 317, 427, 1160, 27367,317, 317, 63336,317, 1160, 70072,70074,479, 345, 70075,317, 382, 332, 6013, 343, 363, 70079,16867,3999, 317, + 70082,70083,1481, 38875,3987, 2156, 11198,70085,5897, 70089,317, 2291, 70090,70091,5623, 965, 490, 70092,404, 2357, 70093,70086,1943, 70087,70088,12731,343, 362, 70094,70096,56759,70098,15745,70102,404, 70097,551, 70099,551, 70100,70101,14932,466, 36081,70103,70104,317, 317, 70105,317, 7214, 404, 404, 70107, - 70108,5665, 70110,70111,565, 70112,317, 70115,70117,317, 70118,6409, 70119,317, 1135, 5037, 44745,20382,2063, 24260,70109,18192,14341,11874,2272, 370, 6598, - 317, 317, 13011,11236,1383, 70113,490, 70114,13178,343, 490, 70116,3999, 384, 4984, 20684,351, 70120,70121,70122,70123,10617,501, 990, 356, 381, 380, - 317, 317, 1915, 371, 317, 5105, 16704,317, 70126,70127,70128,317, 10035,6036, 8296, 2272, 8658, 70129,23516,317, 70130,16092,382, 70133,68324,23345,5309, + 70108,5665, 70110,70111,565, 70112,317, 70115,70117,317, 70118,6409, 70119,317, 1135, 5037, 44745,20382,2063, 24260,70109,18192,14341,11874,2272, 370, 6598, + 317, 317, 13011,11236,1383, 70113,490, 70114,13178,343, 490, 70116,3999, 384, 4984, 20684,351, 70120,70121,70122,70123,10617,501, 990, 356, 381, 380, + 317, 317, 1915, 371, 317, 5105, 16704,317, 70126,70127,70128,317, 10035,6036, 8296, 2272, 8658, 70129,23516,317, 70130,16092,382, 70133,68324,23345,5309, 1020, 70134,70135,10894,11442,10505,54046,70138,70139,70140,371, 70143,70147,70149,70154,70157,70159,70160,70164,70167,70173,70184,59225,70209,70221,70229,70231, - 317, 70242,589, 70246,4965, 9244, 2272, 317, 7797, 70141,370, 317, 317, 31403,70142,6834, 15876,490, 317, 70144,350, 317, 2222, 70145,317, 70146,317, + 317, 70242,589, 70246,4965, 9244, 2272, 317, 7797, 70141,370, 317, 317, 31403,70142,6834, 15876,490, 317, 70144,350, 317, 2222, 70145,317, 70146,317, 317, 70148,69474,350, 317, 5273, 317, 317, 70150,15863,362, 1020, 70153,317, 2389, 70151,70152,10422,466, 2571, 317, 317, 317, 70155,2022, 317, 70156, 317, 590, 490, 11485,39119,70158,317, 3611, 317, 490, 365, 490, 2156, 70161,70162,70163,70165,317, 317, 596, 4060, 1459, 2845, 317, 70166,7871, 70168, 370, 5266, 49165,70169,24487,490, 17019,14198,70170,466, 70171,332, 70172,7911, 351, 2024, 5046, 70174,5205, 12332,70177,12796,490, 70178,70180,317, 70183, 2110, 70175,490, 70176,1481, 10898,590, 2110, 40806,11198,590, 70179,363, 317, 490, 490, 6900, 8403, 70181,6851, 70182,7850, 370, 70185,5561, 70187,70190, 70191,70194,70196,70198,70199,70201,70203,70204,70207,1109, 332, 70186,6900, 380, 332, 3505, 45402,5898, 10429,5105, 382, 70188,40798,70189,39569,317, 30878, - 317, 363, 6420, 317, 317, 363, 70192,4984, 70193,48922,317, 317, 404, 351, 70195,490, 2078, 70197,10561,70200,380, 343, 317, 70202,384, 2584, 345, + 317, 363, 6420, 317, 317, 363, 70192,4984, 70193,48922,317, 317, 404, 351, 70195,490, 2078, 70197,10561,70200,380, 343, 317, 70202,384, 2584, 345, 317, 36630,490, 70205,590, 370, 553, 317, 70206,70208,317, 317, 590, 365, 332, 70210,1347, 70213,70214,70215,70216,70218,404, 70219,11263,550, 70211, - 70212,18409,3676, 70217,466, 317, 317, 317, 317, 317, 14350,1347, 317, 389, 70220,22496,22560,70222,5120, 70224,70225,20757,70226,70228,54275,9780, 317, + 70212,18409,3676, 70217,466, 317, 317, 317, 317, 317, 14350,1347, 317, 389, 70220,22496,22560,70222,5120, 70224,70225,20757,70226,70228,54275,9780, 317, 27061,70223,317, 5120, 370, 362, 317, 317, 317, 2381, 1992, 70227,317, 4984, 343, 1160, 16063,490, 317, 70230,2381, 350, 5238, 362, 5825, 476, 70232, - 317, 70233,70234,70239,362, 70240,70241,8054, 551, 22502,1588, 384, 70235,70237,70238,70236,476, 355, 351, 3999, 317, 1160, 70243,70244,2022, 17583,317, + 317, 70233,70234,70239,362, 70240,70241,8054, 551, 22502,1588, 384, 70235,70237,70238,70236,476, 355, 351, 3999, 317, 1160, 70243,70244,2022, 17583,317, 317, 365, 317, 5120, 64777,1345, 70245,317, 39569,466, 317, 2036, 70247,70248,317, 5611, 1481, 465, 70250,13899,70251,490, 70253,22525,70255,70256,70257, - 490, 443, 70258,70260,70261,70264,70265,70272,70274,28836,70276,70277,70279,70283,70285,70288,70292,70300,70316,70321,70323,70328,70330,350, 1383, 317, 367, + 490, 443, 70258,70260,70261,70264,70265,70272,70274,28836,70276,70277,70279,70283,70285,70288,70292,70300,70316,70321,70323,70328,70330,350, 1383, 317, 367, 70259,1347, 16029,317, 39397,70262,949, 317, 70263,8553, 2022, 317, 52862,317, 9922, 6420, 317, 363, 5149, 5841, 10188,3599, 70266,8948, 70268,70269,14553, 70271,70267,5709, 476, 70270,12017,317, 343, 351, 37609,70273,350, 350, 37610,70275,351, 365, 317, 317, 501, 21424,317, 70278,5711, 4965, 2188, 19652, - 70280,427, 70282,70281,70284,351, 363, 317, 350, 365, 317, 3611, 4984, 7060, 70286,332, 70287,490, 35794,2181, 70289,317, 7949, 70290,5840, 15646,9648, + 70280,427, 70282,70281,70284,351, 363, 317, 350, 365, 317, 3611, 4984, 7060, 70286,332, 70287,490, 35794,2181, 70289,317, 7949, 70290,5840, 15646,9648, 343, 70291,317, 3987, 4984, 67094,70293,70295,70298,70299,317, 12154,70294,70296,70297,9124, 35724,317, 70301,466, 2022, 70302,63124,70303,317, 33201,16620, - 554, 8000, 317, 574, 6089, 317, 317, 70304,12605,70305,2077, 70307,4562, 70308,70310,70311,362, 70313,9914, 70314,317, 10519,6420, 553, 70306,4268, 317, + 554, 8000, 317, 574, 6089, 317, 317, 70304,12605,70305,2077, 70307,4562, 70308,70310,70311,362, 70313,9914, 70314,317, 10519,6420, 553, 70306,4268, 317, 380, 5273, 317, 5223, 317, 70309,479, 351, 14523,439, 317, 70312,317, 343, 6724, 9922, 476, 55534,35013,70315,70317,70318,2035, 57265,2272, 70319,70320, - 9265, 363, 70322,25114,16660,317, 17019,3987, 390, 70324,16092,317, 1358, 343, 5273, 1033, 70325,32546,22469,317, 20712,514, 70326,70327,70329,466, 1020, + 9265, 363, 70322,25114,16660,317, 17019,3987, 390, 70324,16092,317, 1358, 343, 5273, 1033, 70325,32546,22469,317, 20712,514, 70326,70327,70329,466, 1020, 70331,70332,59435,70333,70334,70335,70336,70337,317, 3529, 18940,70338,70339,4789, 317, 439, 1108, 2631, 6502, 363, 5841, 317, 380, 317, 5273, 317, 27498, - 11227,14069,7000, 11619,12106,70340,70342,8100, 70344,70353,70363,70365,70370,70343,343, 971, 371, 5313, 362, 566, 1459, 351, 70345,70347,41533,70348,2568, + 11227,14069,7000, 11619,12106,70340,70342,8100, 70344,70353,70363,70365,70370,70343,343, 971, 371, 5313, 362, 566, 1459, 351, 70345,70347,41533,70348,2568, 317, 317, 27266,70349,70351,490, 70346,32372,317, 2298, 350, 70350,317, 70352,350, 70354,2021, 70355,380, 70357,70359,70361,11613,317, 596, 70356,70358, - 6726, 70360,990, 466, 317, 70362,371, 343, 566, 396, 380, 5742, 20476,70364,343, 350, 9720, 317, 70366,70368,317, 70369,365, 70367,31023,317, 384, - 351, 384, 10926,384, 70372,356, 70374,70375,70377,70379,70381,70382,70387,70389,17042,7384, 70390,70391,70393,70396,317, 70398,70399,70404,70407,70412,317, - 1992, 381, 28698,363, 1044, 70376,384, 10623,70378,70380,8695, 24185,16092,317, 3505, 70383,551, 6598, 70384,551, 37610,70385,466, 70386,317, 317, 317, + 6726, 70360,990, 466, 317, 70362,371, 343, 566, 396, 380, 5742, 20476,70364,343, 350, 9720, 317, 70366,70368,317, 70369,365, 70367,31023,317, 384, + 351, 384, 10926,384, 70372,356, 70374,70375,70377,70379,70381,70382,70387,70389,17042,7384, 70390,70391,70393,70396,317, 70398,70399,70404,70407,70412,317, + 1992, 381, 28698,363, 1044, 70376,384, 10623,70378,70380,8695, 24185,16092,317, 3505, 70383,551, 6598, 70384,551, 37610,70385,466, 70386,317, 317, 317, 5898, 550, 4949, 70388,490, 317, 965, 21274,490, 4965, 5561, 490, 66258,1020, 384, 12789,362, 343, 70392,439, 317, 317, 2571, 345, 317, 317, 70394, - 363, 70395,404, 384, 1998, 11844,1230, 350, 6917, 317, 356, 343, 317, 490, 317, 70397,14462,2078, 8874, 356, 466, 12721,466, 317, 8811, 70400,317, + 363, 70395,404, 384, 1998, 11844,1230, 350, 6917, 317, 356, 343, 317, 490, 317, 70397,14462,2078, 8874, 356, 466, 12721,466, 317, 8811, 70400,317, 3869, 70401,4591, 2022, 362, 317, 70402,70403,317, 317, 70405,2022, 70406,6532, 317, 466, 565, 317, 7948, 5840, 70408,350, 9479, 317, 70409,1060, 52535, - 466, 70410,317, 317, 70411,466, 317, 20869,5809, 70413,8281, 2163, 70415,367, 7523, 466, 70418,385, 70421,466, 70423,51025,17040,349, 317, 70419,2272, + 466, 70410,317, 317, 70411,466, 317, 20869,5809, 70413,8281, 2163, 70415,367, 7523, 466, 70418,385, 70421,466, 70423,51025,17040,349, 317, 70419,2272, 70420,70422,370, 70424,70426,70431,70443,70467,70502,70536,70540,70578,70583,70591,70649,70705,70778,70783,70792,70793,70810,70827,70845,70846,70862,70864,70872, 70873,70425,317, 2566, 317, 317, 70427,9943, 70428,70429,317, 317, 70430,2035, 339, 3869, 1108, 9454, 317, 70432,70433,70434,1998, 70437,67256,70439,70440, - 12721,70441,578, 2117, 343, 70435,883, 70436,332, 70438,317, 317, 4267, 5611, 343, 70442,70444,1526, 70445,70453,70457,38081,70465,70466,404, 70446,350, - 6991, 362, 317, 38227,70447,70448,70449,70450,70451,70452,70454,5836, 70455,317, 70456,345, 70458,8301, 70460,70462,70463,70464,2571, 1347, 317, 70459,317, - 1347, 70461,5223, 381, 2391, 356, 466, 317, 363, 5022, 4591, 14132,949, 70468,10442,2705, 70470,70479,27664,70496,70497,22711,70498,35480,70499,490, 317, + 12721,70441,578, 2117, 343, 70435,883, 70436,332, 70438,317, 317, 4267, 5611, 343, 70442,70444,1526, 70445,70453,70457,38081,70465,70466,404, 70446,350, + 6991, 362, 317, 38227,70447,70448,70449,70450,70451,70452,70454,5836, 70455,317, 70456,345, 70458,8301, 70460,70462,70463,70464,2571, 1347, 317, 70459,317, + 1347, 70461,5223, 381, 2391, 356, 466, 317, 363, 5022, 4591, 14132,949, 70468,10442,2705, 70470,70479,27664,70496,70497,22711,70498,35480,70499,490, 317, 351, 3987, 70469,428, 70471,70472,70476,343, 70478,351, 28447,345, 70473,317, 489, 70474,70475,70477,317, 1347, 39684,8381, 70480,70483,317, 16368,70486, 10149,350, 385, 70489,70490,70491,70493,10035,70481,70482,551, 20098,70484,70485,70487,317, 22561,70488,5447, 350, 466, 433, 10815,362, 317, 2402, 25067, 70492,70494,14951,70495,345, 343, 10878,363, 10855,9027, 70500,365, 70501,1109, 8275, 70503,70507,70509,70511,70513,490, 350, 70515,70516,70523,1453, 70525, 489, 70530,351, 70532,70535,70504,578, 317, 70505,70506,2298, 5896, 384, 317, 13686,317, 343, 70508,380, 70510,350, 343, 11146,371, 1999, 10629,70512, 380, 70514,24793,12514,6917, 4962, 6602, 15899,3529, 351, 27652,3529, 3284, 2187, 70517,70518,70522,1588, 437, 317, 3573, 11613,70519,5836, 70520,70521,66271, - 2036, 317, 393, 11146,70524,490, 70526,12696,466, 70527,70528,317, 317, 12930,3284, 57803,70529,317, 70531,317, 70533,466, 317, 70534,317, 511, 4980, + 2036, 317, 393, 11146,70524,490, 70526,12696,466, 70527,70528,317, 317, 12930,3284, 57803,70529,317, 70531,317, 70533,466, 317, 70534,317, 511, 4980, 8266, 1481, 1033, 70537,70538,343, 70539,6540, 317, 1999, 551, 19453,595, 356, 2832, 70541,2078, 70542,35973,70543,70545,70549,70552,70553,70557,70572,70573, - 13670,10471,70574,70577,63668,490, 345, 1998, 317, 38461,70544,3079, 18907,466, 317, 70546,356, 10877,2571, 70547,70548,317, 381, 70550,70551,7062, 439, + 13670,10471,70574,70577,63668,490, 345, 1998, 317, 38461,70544,3079, 18907,466, 317, 70546,356, 10877,2571, 70547,70548,317, 381, 70550,70551,7062, 439, 351, 6036, 363, 5926, 427, 70554,70556,439, 317, 317, 2078, 5943, 365, 70555,70558,70561,70562,70567,70570,317, 44767,317, 317, 343, 2809, 70559,70560, 356, 19291,5174, 362, 317, 8544, 13161,70563,9649, 70564,2184, 70565,12925,70566,21048,5226, 317, 70568,317, 20331,70569,317, 343, 5611, 70571,490, 49815, 10364,70575,332, 70576,1999, 5810, 70579,70580,70581,70582,70584,70586,6468, 7386, 70587,70589,2381, 42448,70585,5325, 317, 2845, 70588,70590,317, 490, 11844, 70592,70593,70596,70598,7689, 50595,70602,70607,490, 70609,70614,70620,70625,50595,35854,70626,70628,70629,380, 7386, 54110,17160,317, 317, 317, 6674, 70594, 2219, 70595,5896, 317, 8948, 362, 13394,9012, 317, 565, 70597,70599,317, 25086,5216, 52774,70600,317, 70601,65739,64282,332, 8023, 741, 370, 317, 70603, 70604,70605,70606,5238, 70608,11516,553, 17583,5849, 6967, 5727, 6063, 385, 70610,343, 70611,70612,1160, 19283,7214, 317, 70613,356, 5742, 70615,70616,70617, - 362, 2208, 317, 70619,362, 1345, 2322, 412, 362, 2571, 70618,317, 8301, 14501,70621,363, 317, 70622,70623,70624,427, 317, 8178, 5225, 356, 466, 362, - 363, 70627,317, 345, 5624, 70630,70631,70648,18077,68269,317, 2110, 70632,70645,317, 637, 5942, 5942, 651, 317, 633, 1155, 633, 5134, 70633,70634,6195, - 70636,332, 8948, 7143, 15121,7993, 70637,70639,70642,70644,317, 11086,4949, 70635,70638,476, 317, 70640,70641,14340,70643,70646,351, 70647,1160, 317, 317, - 345, 70650,70651,70653,317, 70657,70660,70662,70663,70670,70671,70672,70677,70685,70695,70696,70697,350, 371, 317, 1325, 317, 70652,384, 6228, 317, 2631, + 362, 2208, 317, 70619,362, 1345, 2322, 412, 362, 2571, 70618,317, 8301, 14501,70621,363, 317, 70622,70623,70624,427, 317, 8178, 5225, 356, 466, 362, + 363, 70627,317, 345, 5624, 70630,70631,70648,18077,68269,317, 2110, 70632,70645,317, 637, 5942, 5942, 651, 317, 633, 1155, 633, 5134, 70633,70634,6195, + 70636,332, 8948, 7143, 15121,7993, 70637,70639,70642,70644,317, 11086,4949, 70635,70638,476, 317, 70640,70641,14340,70643,70646,351, 70647,1160, 317, 317, + 345, 70650,70651,70653,317, 70657,70660,70662,70663,70670,70671,70672,70677,70685,70695,70696,70697,350, 371, 317, 1325, 317, 70652,384, 6228, 317, 2631, 317, 317, 70654,70655,70656,317, 2067, 70658,18611,70659,317, 1108, 363, 48051,433, 70661,363, 4925, 363, 70664,70668,363, 70669,5624, 70665,317, 24661, 70666,404, 70667,2022, 363, 350, 5055, 62550,18257,317, 6036, 384, 70673,3640, 70675,317, 38193,345, 70674,317, 356, 466, 362, 317, 317, 345, 70676, - 1347, 10471,317, 31834,2631, 70678,317, 404, 1266, 317, 2210, 345, 70679,70683,1358, 5711, 70684,404, 317, 317, 70680,6402, 70681,1548, 356, 70682,363, - 5033, 317, 317, 1531, 363, 363, 70686,70687,12598,70688,363, 70694,404, 382, 6179, 332, 11613,70689,70690,16917,317, 317, 7622, 317, 381, 5054, 317, + 1347, 10471,317, 31834,2631, 70678,317, 404, 1266, 317, 2210, 345, 70679,70683,1358, 5711, 70684,404, 317, 317, 70680,6402, 70681,1548, 356, 70682,363, + 5033, 317, 317, 1531, 363, 363, 70686,70687,12598,70688,363, 70694,404, 382, 6179, 332, 11613,70689,70690,16917,317, 317, 7622, 317, 381, 5054, 317, 70691,20523,2094, 345, 70692,70693,370, 7055, 351, 363, 380, 70698,70704,5547, 70699,70701,70700,70702,70703,70706,355, 70711,70715,70721,70722,70726,70756, - 70758,63504,70763,70765,70767,70769,8178, 70771,70772,70775,550, 2110, 70707,5040, 317, 70709,70710,70708,70712,397, 70714,384, 7698, 380, 70713,31812,397, - 17410,70716,70718,317, 7428, 70720,317, 317, 70717,317, 1347, 70719,408, 5761, 433, 5652, 317, 17699,370, 6598, 70723,380, 70724,70725,317, 490, 7567, + 70758,63504,70763,70765,70767,70769,8178, 70771,70772,70775,550, 2110, 70707,5040, 317, 70709,70710,70708,70712,397, 70714,384, 7698, 380, 70713,31812,397, + 17410,70716,70718,317, 7428, 70720,317, 317, 70717,317, 1347, 70719,408, 5761, 433, 5652, 317, 17699,370, 6598, 70723,380, 70724,70725,317, 490, 7567, 70727,332, 70731,70744,3999, 70746,317, 70753,70754,70755,5623, 70728,70729,6547, 70730,637, 317, 70732,70734,10538,70733,70735,317, 362, 317, 70736,70740, - 70737,70738,70739,70741,70742,70743,70745,6831, 70747,12434,404, 317, 317, 317, 70748,317, 317, 70752,317, 70749,70750,70751,448, 7590, 363, 363, 2203, - 565, 12590,59928,70757,551, 29666,16291,2219, 70759,15600,317, 70760,317, 70762,70761,351, 1588, 433, 317, 6036, 9624, 48991,70764,350, 14415,317, 8274, - 10878,70766,2310, 466, 2117, 317, 1347, 5223, 40625,317, 70768,317, 574, 70770,10550,1194, 70773,363, 490, 5174, 70774,4591, 70776,345, 5828, 70777,317, - 5561, 27985,317, 490, 70779,15754,70781,317, 70780,363, 70782,1347, 70784,8172, 25441,46527,70787,70788,317, 7850, 363, 70785,70786,68400,15814,343, 317, - 70789,7657, 70790,70791,70794,7698, 48764,70796,59647,70798,362, 70803,70804,70806,10447,70807,6923, 70808,1109, 343, 70809,539, 70795,37988,317, 317, 332, - 317, 317, 565, 317, 70797,317, 317, 70799,332, 14168,1992, 9699, 70801,70800,70802,70805,1020, 317, 5055, 741, 5055, 5428, 365, 345, 44066,6402, 317, + 70737,70738,70739,70741,70742,70743,70745,6831, 70747,12434,404, 317, 317, 317, 70748,317, 317, 70752,317, 70749,70750,70751,448, 7590, 363, 363, 2203, + 565, 12590,59928,70757,551, 29666,16291,2219, 70759,15600,317, 70760,317, 70762,70761,351, 1588, 433, 317, 6036, 9624, 48991,70764,350, 14415,317, 8274, + 10878,70766,2310, 466, 2117, 317, 1347, 5223, 40625,317, 70768,317, 574, 70770,10550,1194, 70773,363, 490, 5174, 70774,4591, 70776,345, 5828, 70777,317, + 5561, 27985,317, 490, 70779,15754,70781,317, 70780,363, 70782,1347, 70784,8172, 25441,46527,70787,70788,317, 7850, 363, 70785,70786,68400,15814,343, 317, + 70789,7657, 70790,70791,70794,7698, 48764,70796,59647,70798,362, 70803,70804,70806,10447,70807,6923, 70808,1109, 343, 70809,539, 70795,37988,317, 317, 332, + 317, 317, 565, 317, 70797,317, 317, 70799,332, 14168,1992, 9699, 70801,70800,70802,70805,1020, 317, 5055, 741, 5055, 5428, 365, 345, 44066,6402, 317, 2317, 343, 2272, 427, 70811,70812,66645,317, 70813,15745,70815,70817,70819,70823,70826,5739, 317, 53186,70814,317, 1325, 589, 70816,58037,317, 332, 70818, 317, 339, 9878, 70820,362, 70821,70822,1347, 2036, 363, 6228, 8301, 64140,70824,7916, 317, 5353, 317, 1109, 70825,317, 6089, 370, 317, 70828,11619,70830, 596, 70831,7631, 28011,350, 13003,70832,14905,70833,70839,3987, 70844,490, 70829,1030, 7045, 317, 356, 5872, 317, 317, 351, 2024, 317, 551, 70834,70836, - 17290,362, 350, 4984, 343, 317, 70835,511, 370, 4980, 356, 317, 70837,70838,16410,317, 70840,70841,1325, 70842,70843,1347, 350, 362, 490, 317, 971, - 70847,70858,70860,2022, 539, 350, 24090,365, 70848,9027, 70849,70850,381, 30012,317, 70851,70852,70853,70854,70855,70856,70857,345, 70859,317, 44620,4980, - 13221,317, 7785, 317, 6607, 317, 70861,16891,371, 70863,3284, 339, 317, 5836, 70865,70867,5205, 15457,2271, 363, 70868,70869,70870,317, 317, 70866,317, + 17290,362, 350, 4984, 343, 317, 70835,511, 370, 4980, 356, 317, 70837,70838,16410,317, 70840,70841,1325, 70842,70843,1347, 350, 362, 490, 317, 971, + 70847,70858,70860,2022, 539, 350, 24090,365, 70848,9027, 70849,70850,381, 30012,317, 70851,70852,70853,70854,70855,70856,70857,345, 70859,317, 44620,4980, + 13221,317, 7785, 317, 6607, 317, 70861,16891,371, 70863,3284, 339, 317, 5836, 70865,70867,5205, 15457,2271, 363, 70868,70869,70870,317, 317, 70866,317, 384, 523, 63548,2553, 17410,317, 31824,1347, 28691,1347, 345, 70871,317, 19390,2326, 68714,70874,70875,343, 12798,410, 317, 7073, 2171, 317, 317, 70876, 70878,70879,70880,70882,24876,51518,2279, 675, 5896, 1020, 3023, 70881,6601, 14574,619, 70883,70884,70912,70945,28836,70979,46641,70981,71004,71013,71019,71021, 2362, 5279, 22100,350, 28945,332, 351, 70885,70886,362, 70889,70890,70896,8403, 70902,70905,501, 317, 1481, 339, 317, 29673,501, 70887,345, 381, 20178, - 1230, 317, 70888,5896, 7850, 7785, 70891,11146,2316, 490, 490, 11844,339, 70892,70893,70894,70895,70897,70900,9170, 1481, 317, 70898,70899,70901,317, 317, - 58377,317, 343, 2116, 70903,70904,31167,7306, 14561,70906,466, 70911,6228, 70907,317, 4974, 6420, 317, 70908,70909,70910,18244,70913,70914,70916,6504, 362, + 1230, 317, 70888,5896, 7850, 7785, 70891,11146,2316, 490, 490, 11844,339, 70892,70893,70894,70895,70897,70900,9170, 1481, 317, 70898,70899,70901,317, 317, + 58377,317, 343, 2116, 70903,70904,31167,7306, 14561,70906,466, 70911,6228, 70907,317, 4974, 6420, 317, 70908,70909,70910,18244,70913,70914,70916,6504, 362, 356, 70917,1060, 70925,70931,70933,70935,70938,70943,8506, 317, 2012, 12789,70915,10798,317, 404, 70918,70920,70923,6412, 70919,380, 45787,70921,317, 70922, - 317, 70924,70926,70928,317, 70927,70929,70930,373, 70932,317, 70934,2117, 596, 317, 70936,70937,7448, 5464, 466, 317, 70939,70940,70941,70942,70944,345, - 2571, 70946,70948,70951,70955,14767,70957,70961,70962,70967,70970,317, 70976,70978,317, 343, 70947,10840,3284, 427, 3284, 5836, 2317, 70949,2134, 70950,332, + 317, 70924,70926,70928,317, 70927,70929,70930,373, 70932,317, 70934,2117, 596, 317, 70936,70937,7448, 5464, 466, 317, 70939,70940,70941,70942,70944,345, + 2571, 70946,70948,70951,70955,14767,70957,70961,70962,70967,70970,317, 70976,70978,317, 343, 70947,10840,3284, 427, 3284, 5836, 2317, 70949,2134, 70950,332, 2402, 317, 605, 5991, 406, 1588, 317, 317, 70952,317, 70953,317, 70954,70956,5537, 343, 317, 741, 345, 10891,70958,389, 404, 363, 70959,10891,70960, 362, 427, 490, 317, 1100, 317, 317, 4984, 5223, 8948, 6717, 363, 16623,15253,1345, 14062,16137,9592, 2571, 70963,70965,476, 70964,466, 1160, 317, 70966, 1194, 70968,317, 404, 5809, 70969,466, 1160, 70971,5273, 1020, 70972,70973,70974,70975,466, 317, 70977,389, 2156, 351, 7689, 70980,38877,45865,8828, 70982, - 490, 396, 70984,501, 70985,70986,70987,70988,70989,12642,70990,70997,6831, 70998,70999,34344,70983,363, 2132, 363, 4962, 4976, 363, 343, 8296, 317, 1030, - 9624, 332, 317, 14439,16670,317, 332, 317, 1108, 14571,7306, 70991,70992,3284, 70996,45155,70993,70994,70995,2035, 23247,343, 2110, 4962, 71000,71001,2110, + 490, 396, 70984,501, 70985,70986,70987,70988,70989,12642,70990,70997,6831, 70998,70999,34344,70983,363, 2132, 363, 4962, 4976, 363, 343, 8296, 317, 1030, + 9624, 332, 317, 14439,16670,317, 332, 317, 1108, 14571,7306, 70991,70992,3284, 70996,45155,70993,70994,70995,2035, 23247,343, 2110, 4962, 71000,71001,2110, 71002,71003,71005,71006,71007,71009,4563, 71010,46452,5836, 596, 363, 45345,8456, 343, 71008,11145,46486,71011,71012,1347, 71014,2280, 71015,71016,5836, 71017, 343, 71018,2184, 9170, 3284, 14038,71020,9623, 6228, 71022,4213, 71024,71027,71028,71029,511, 71030,33877,71033,71034,71035,71039,71042,71044,4949, 71023,71025, - 10257,71026,13790,466, 345, 16032,42986,4943, 9696, 71031,9450, 71032,317, 343, 7785, 22561,19665,317, 23311,71036,71037,71038,71040,71041,71043,2592, 5653, + 10257,71026,13790,466, 345, 16032,42986,4943, 9696, 71031,9450, 71032,317, 343, 7785, 22561,19665,317, 23311,71036,71037,71038,71040,71041,71043,2592, 5653, 71045,412, 1588, 10158,356, 1347, 11324,71046,71099,1060, 71126,668, 71156,1060, 345, 71190,71204,71047,71048,71050,1383, 71052,71054,426, 71057,71064,71069, - 371, 71072,71075,71077,71088,71094,71096,6674, 2004, 317, 317, 71049,427, 15646,466, 362, 317, 67754,384, 71051,71053,381, 343, 8296, 350, 651, 7095, - 317, 471, 71055,317, 71056,317, 71058,71059,317, 523, 2193, 15244,71060,1992, 71061,71062,71063,71065,1345, 317, 2035, 71068,5363, 71066,71067,356, 4591, + 371, 71072,71075,71077,71088,71094,71096,6674, 2004, 317, 317, 71049,427, 15646,466, 362, 317, 67754,384, 71051,71053,381, 343, 8296, 350, 651, 7095, + 317, 471, 71055,317, 71056,317, 71058,71059,317, 523, 2193, 15244,71060,1992, 71061,71062,71063,71065,1345, 317, 2035, 71068,5363, 71066,71067,356, 4591, 317, 11089,24684,71070,71071,34987,466, 1160, 3869, 2391, 71073,71074,317, 3869, 12925,466, 15247,18333,1020, 363, 317, 71076,317, 23391,363, 7698, 71078, - 404, 71079,71081,71080,71082,71085,71083,71084,71086,71087,10487,356, 7504, 466, 317, 10890,71089,71090,332, 71092,317, 317, 8301, 317, 18127,1347, 9170, + 404, 71079,71081,71080,71082,71085,71083,71084,71086,71087,10487,356, 7504, 466, 317, 10890,71089,71090,332, 71092,317, 317, 8301, 317, 18127,1347, 9170, 317, 317, 7785, 490, 317, 71091,317, 317, 71093,57457,3284, 332, 46183,71095,350, 990, 7698, 6046, 71097,466, 27528,317, 6412, 317, 71098,6228, 25732, 1160, 71100,8184, 71104,71108,350, 71118,71120,71122,71123,71124,6340, 11332,9909, 317, 7850, 2024, 2222, 71101,71102,317, 71103,71105,71106,317, 317, 71107, - 466, 2222, 362, 71109,71115,71116,15646,71110,2571, 32473,317, 71111,71114,71112,71113,71117,71119,362, 46697,71121,317, 350, 350, 1108, 351, 370, 3284, + 466, 2222, 362, 71109,71115,71116,15646,71110,2571, 32473,317, 71111,71114,71112,71113,71117,71119,362, 46697,71121,317, 350, 350, 1108, 351, 370, 3284, 317, 71125,71127,71129,71131,71132,71133,350, 71136,71142,71148,1108, 71154,71155,18849,317, 60259,466, 71128,6228, 621, 351, 7916, 401, 317, 317, 71130, 466, 380, 1347, 32383,4965, 343, 332, 351, 351, 71134,317, 71135,427, 14586,370, 71137,71138,2948, 332, 11249,71139,317, 543, 1243, 317, 317, 71140, - 71141,370, 71143,71147,2317, 71144,466, 71145,71146,439, 3529, 370, 3869, 551, 351, 466, 317, 2406, 71149,71152,71153,1230, 71150,71151,990, 42731,3999, + 71141,370, 71143,71147,2317, 71144,466, 71145,71146,439, 3529, 370, 3869, 551, 351, 466, 317, 2406, 71149,71152,71153,1230, 71150,71151,990, 42731,3999, 317, 351, 20766,317, 511, 317, 12696,490, 71157,71158,71161,71164,2334, 71165,71166,71167,71170,71171,71174,71176,71179,71180,71187,14644,71159,317, 71160, - 4984, 883, 71162,27860,71163,5616, 3522, 4984, 490, 351, 11347,23624,3284, 1453, 71168,39736,332, 3284, 71169,350, 8099, 370, 317, 9170, 317, 71172,466, - 370, 317, 71173,371, 1526, 71175,355, 2693, 317, 71177,71178,1020, 2391, 317, 5174, 390, 15951,317, 71181,71183,71186,317, 971, 71182,317, 71184,317, + 4984, 883, 71162,27860,71163,5616, 3522, 4984, 490, 351, 11347,23624,3284, 1453, 71168,39736,332, 3284, 71169,350, 8099, 370, 317, 9170, 317, 71172,466, + 370, 317, 71173,371, 1526, 71175,355, 2693, 317, 71177,71178,1020, 2391, 317, 5174, 390, 15951,317, 71181,71183,71186,317, 971, 71182,317, 71184,317, 1347, 5217, 71185,371, 16589,5840, 71188,4952, 71189,370, 6406, 3422, 2260, 317, 2541, 71191,71192,71194,490, 71195,71196,71197,71198,71200,71201,349, 71193, - 317, 10422,12434,317, 317, 363, 350, 2077, 2024, 511, 5363, 317, 490, 317, 490, 371, 71199,14716,317, 49269,37649,365, 2222, 317, 1234, 633, 351, + 317, 10422,12434,317, 317, 363, 350, 2077, 2024, 511, 5363, 317, 490, 317, 490, 371, 71199,14716,317, 49269,37649,365, 2222, 317, 1234, 633, 351, 8125, 71202,71203,2277, 15017,370, 1267, 2077, 317, 3599, 6412, 5241, 71205,71206,2631, 490, 1243, 71222,71236,71255,71256,574, 71279,71280,71281,71282,71292, - 71207,596, 380, 71209,71218,71219,20663,71221,317, 9581, 71208,39530,10422,466, 317, 317, 71210,7035, 317, 71211,317, 356, 1108, 317, 2077, 71212,448, - 18127,71213,71214,3599, 317, 71216,71217,6089, 990, 1992, 390, 363, 71215,12303,381, 370, 1109, 390, 71220,317, 476, 550, 19487,2156, 370, 7437, 317, + 71207,596, 380, 71209,71218,71219,20663,71221,317, 9581, 71208,39530,10422,466, 317, 317, 71210,7035, 317, 71211,317, 356, 1108, 317, 2077, 71212,448, + 18127,71213,71214,3599, 317, 71216,71217,6089, 990, 1992, 390, 363, 71215,12303,381, 370, 1109, 390, 71220,317, 476, 550, 19487,2156, 370, 7437, 317, 317, 317, 2188, 13954,71223,370, 371, 71225,71227,71228,55194,71229,71233,33936,71234,317, 536, 317, 5273, 71224,2188, 363, 71226,384, 2022, 4969, 46108, - 317, 350, 332, 71230,350, 71232,34987,466, 317, 71231,10422,466, 2222, 404, 565, 390, 43865,71235,1033, 2391, 71237,71238,71239,71240,381, 71241,371, + 317, 350, 332, 71230,350, 71232,34987,466, 317, 71231,10422,466, 2222, 404, 565, 390, 43865,71235,1033, 2391, 71237,71238,71239,71240,381, 71241,371, 71244,971, 71246,317, 370, 10907,317, 45033,9702, 1791, 380, 2134, 11280,1548, 71242,19661,2058, 317, 71243,317, 58008,317, 317, 317, 1160, 46262,71245, 317, 317, 71247,2022, 45995,317, 71254,317, 6228, 320, 71248,71249,9624, 71251,71252,317, 2405, 66194,5840, 5037, 2391, 317, 7408, 5898, 317, 317, 71250, - 317, 3648, 362, 317, 1999, 5159, 23881,317, 71253,363, 343, 1160, 371, 371, 317, 71257,71262,71267,71272,71276,393, 71258,71261,317, 317, 621, 842, + 317, 3648, 362, 317, 1999, 5159, 23881,317, 71253,363, 343, 1160, 371, 371, 317, 71257,71262,71267,71272,71276,393, 71258,71261,317, 317, 621, 842, 3599, 16401,317, 7401, 381, 2571, 317, 2272, 3869, 1347, 71259,37874,71260,31380,5960, 637, 6996, 6996, 6420, 1992, 317, 71263,71264,71266,5611, 2116, 55831, - 3284, 1108, 14645,317, 71265,317, 317, 317, 16589,71268,370, 71270,343, 71269,345, 12237,317, 351, 71271,317, 1615, 2171, 13318,12237,370, 2571, 317, + 3284, 1108, 14645,317, 71265,317, 317, 317, 16589,71268,370, 71270,343, 71269,345, 12237,317, 351, 71271,317, 1615, 2171, 13318,12237,370, 2571, 317, 71273,71274,71275,71277,71278,7823, 2715, 317, 14470,71283,71285,363, 71287,71288,390, 71290,71284,2391, 2381, 71286,2571, 371, 437, 71289,390, 38135,71291, 317, 370, 14905,2510, 13638,5149, 45499,71293,71294,26076,317, 317, 490, 3284, 351, 8281, 71295,71296,71315,71316,14746,71327,1060, 71342,345, 2035, 71385, 17255,71297,2188, 71298,71299,71300,71302,71303,71307,71310,71311,71312,17745,317, 71314,6555, 11613,71301,317, 1347, 350, 317, 71304,466, 1266, 317, 35705, 71305,11089,362, 2036, 317, 71306,1078, 7878, 71308,317, 596, 363, 71309,69041,15244,466, 6713, 1160, 1347, 317, 1345, 2184, 317, 65743,351, 71313,71317, 2845, 71319,71321,490, 566, 9702, 71322,317, 8519, 317, 71325,356, 317, 71318,38415,21245,6046, 71320,14865,350, 437, 2184, 5441, 7072, 71323,404, 16092, - 71324,7072, 10877,362, 501, 7428, 71326,16075,466, 71328,6917, 7261, 71332,2188, 71334,71338,71339,71329,71330,71331,317, 71333,350, 14483,3999, 64020,317, - 317, 71335,466, 71337,71336,317, 7857, 317, 350, 71340,71341,71343,371, 71345,71347,343, 71349,71354,71355,71358,1329, 12360,350, 71362,71344,384, 317, + 71324,7072, 10877,362, 501, 7428, 71326,16075,466, 71328,6917, 7261, 71332,2188, 71334,71338,71339,71329,71330,71331,317, 71333,350, 14483,3999, 64020,317, + 317, 71335,466, 71337,71336,317, 7857, 317, 350, 71340,71341,71343,371, 71345,71347,343, 71349,71354,71355,71358,1329, 12360,350, 71362,71344,384, 317, 448, 389, 317, 71346,63987,17601,46661,317, 71348,390, 71350,71351,71352,6859, 6021, 317, 351, 343, 317, 2997, 317, 317, 66537,351, 466, 317, 71353, - 14278,317, 633, 71356,71357,501, 1347, 466, 71359,6409, 365, 14717,71360,71361,949, 71363,71369,71370,19163,71373,2627, 16651,71374,1194, 71379,71384,1160, - 71364,5898, 551, 71366,71365,371, 71367,71368,71371,71372,2503, 317, 4563, 53043,71375,71376,71377,511, 1160, 345, 71378,71380,71382,71381,71383,71386,371, + 14278,317, 633, 71356,71357,501, 1347, 466, 71359,6409, 365, 14717,71360,71361,949, 71363,71369,71370,19163,71373,2627, 16651,71374,1194, 71379,71384,1160, + 71364,5898, 551, 71366,71365,371, 71367,71368,71371,71372,2503, 317, 4563, 53043,71375,71376,71377,511, 1160, 345, 71378,71380,71382,71381,71383,71386,371, 71387,71389,490, 71392,71388,5991, 596, 317, 71390,71391,317, 71393,71394,71395,71398,71415,71454,71467,71472,71485,71489,71493,71498,71508,71514,71583,71621, - 71658,71667,8613, 71676,71708,71717,71728,71791,71800,71804,71805,71806,5363, 596, 8506, 71396,71397,317, 3599, 1347, 466, 16138,317, 317, 12925,466, 317, - 71399,6991, 71401,71403,71407,343, 71409,71413,317, 345, 490, 71400,71402,371, 20113,371, 381, 317, 317, 596, 71404,3284, 317, 317, 71405,356, 466, - 370, 317, 317, 71406,2146, 71408,332, 1109, 390, 13498,3284, 71410,317, 317, 71412,71411,371, 3284, 1109, 5836, 6780, 317, 71414,8296, 397, 365, 332, - 317, 15387,13881,543, 71416,71421,71426,71449,71452,71453,317, 71417,317, 71418,71419,71420,22650,1267, 317, 317, 1353, 1155, 317, 1353, 2086, 317, 317, + 71658,71667,8613, 71676,71708,71717,71728,71791,71800,71804,71805,71806,5363, 596, 8506, 71396,71397,317, 3599, 1347, 466, 16138,317, 317, 12925,466, 317, + 71399,6991, 71401,71403,71407,343, 71409,71413,317, 345, 490, 71400,71402,371, 20113,371, 381, 317, 317, 596, 71404,3284, 317, 317, 71405,356, 466, + 370, 317, 317, 71406,2146, 71408,332, 1109, 390, 13498,3284, 71410,317, 317, 71412,71411,371, 3284, 1109, 5836, 6780, 317, 71414,8296, 397, 365, 332, + 317, 15387,13881,543, 71416,71421,71426,71449,71452,71453,317, 71417,317, 71418,71419,71420,22650,1267, 317, 317, 1353, 1155, 317, 1353, 2086, 317, 317, 1267, 317, 317, 317, 317, 317, 317, 317, 71422,71424,71425,71423,317, 316, 71427,71432,71434,5457, 71428,317, 1347, 71429,370, 317, 71430,2156, 10674, 317, 466, 317, 71431,32010,71433,15618,317, 596, 317, 55907,71435,71437,71441,71446,71436,71438,71439,71440,71442,8684, 71443,71444,71445,71447,71448,71450, 71451,1160, 3987, 317, 317, 345, 1347, 1358, 317, 380, 867, 2110, 71455,511, 71456,365, 71464,71465,5793, 317, 345, 44883,332, 2503, 332, 317, 48840, 317, 362, 317, 71457,71458,3023, 8223, 71459,71460,6601, 37254,71462,2391, 28462,426, 71461,71463,396, 71466,317, 8557, 490, 317, 17477,350, 380, 71468, 71469,71470,71471,1033, 71473,351, 71474,71475,490, 490, 44716,71476,363, 511, 490, 317, 3361, 71477,71479,71481,38194,71482,2571, 5005, 71483,317, 71478, - 5197, 371, 71480,14316,317, 381, 1588, 71484,356, 2719, 317, 71486,6021, 71487,71488,71490,317, 317, 317, 6578, 317, 71491,71492,317, 27912,71494,350, + 5197, 371, 71480,14316,317, 381, 1588, 71484,356, 2719, 317, 71486,6021, 71487,71488,71490,317, 317, 317, 6578, 317, 71491,71492,317, 27912,71494,350, 71495,71497,19174,332, 317, 71496,317, 317, 71499,490, 71506,317, 71500,71501,71502,71503,71504,71505,71507,71509,317, 71510,3787, 380, 71511,2351, 16633, 371, 490, 3283, 71512,11844,396, 3284, 1109, 71513,71515,5896, 71520,71527,71532,5655, 71534,71535,38654,71551,71555,71556,71558,338, 71568,71569,71572,71573, 71577,11510,71578,343, 2271, 596, 489, 317, 71516,1444, 71518,317, 565, 71517,317, 343, 365, 317, 427, 317, 317, 345, 71519,3284, 15051,71521,71522, - 71523,350, 71526,357, 317, 2210, 71524,71525,3284, 22241,5105, 370, 71528,71529,1109, 71531,317, 7949, 363, 18675,71530,317, 3640, 356, 71533,343, 9422, + 71523,350, 71526,357, 317, 2210, 71524,71525,3284, 22241,5105, 370, 71528,71529,1109, 71531,317, 7949, 363, 18675,71530,317, 3640, 356, 71533,343, 9422, 2948, 5126, 10058,71536,71539,71544,584, 71545,71547,71548,317, 71549,362, 317, 317, 71537,71538,5365, 356, 466, 2510, 317, 317, 71540,57063,370, 71543, - 345, 332, 71541,317, 71542,355, 370, 71546,4984, 5570, 2211, 1347, 12700,3284, 71550,5616, 2261, 11648,5838, 15138,5897, 71552,71553,362, 71554,317, 8325, + 345, 332, 71541,317, 71542,355, 370, 71546,4984, 5570, 2211, 1347, 12700,3284, 71550,5616, 2261, 11648,5838, 15138,5897, 71552,71553,362, 71554,317, 8325, 1347, 317, 1230, 317, 317, 2322, 371, 345, 7399, 363, 12726,317, 317, 343, 71557,71557,343, 1011, 356, 9385, 71559,71561,71562,317, 71563,71564,11055, 357, 4984, 363, 71560,332, 7657, 7657, 71565,8281, 71566,317, 43829,71567,71570,71571,1347, 9938, 22370,501, 345, 5457, 317, 365, 317, 62668,71574,71575, - 466, 373, 5226, 317, 317, 382, 5524, 71576,317, 71579,71580,71581,71582,71584,71592,2533, 71594,71612,365, 71614,9289, 71618,7850, 71620,2357, 71585,5120, + 466, 373, 5226, 317, 317, 382, 5524, 71576,317, 71579,71580,71581,71582,71584,71592,2533, 71594,71612,365, 71614,9289, 71618,7850, 71620,2357, 71585,5120, 343, 71587,2146, 71586,3284, 4984, 4952, 317, 339, 71588,71589,71590,71591,351, 351, 71593,317, 9265, 1020, 71595,1230, 2402, 71599,71602,71603,317, 71606, - 71610,71596,71597,71598,71600,71601,363, 516, 317, 9624, 1526, 317, 71604,404, 71605,9319, 381, 428, 5038, 71607,6166, 71608,382, 71609,370, 71611,381, - 12277,71613,4965, 71615,3079, 71616,71617,1358, 317, 7618, 13658,317, 5037, 365, 71619,317, 490, 71622,71623,71628,71629,71633,15090,71635,71636,71641,2146, - 71647,71648,71650,71652,71653,490, 365, 317, 317, 6409, 14611,71624,71626,596, 71627,5836, 71625,39009,11114,57320,362, 64979,1060, 50575,317, 317, 317, - 18915,380, 1060, 71630,332, 351, 2351, 5432, 2271, 71631,71632,69042,317, 317, 6354, 9696, 362, 69168,1160, 71634,351, 14569,6228, 317, 1929, 2546, 317, - 317, 317, 3079, 363, 71637,71638,71640,3236, 13807,2308, 41323,317, 8948, 317, 6598, 317, 71639,317, 1347, 9444, 6598, 51361,490, 71642,18138,332, 490, - 71644,3284, 71646,71643,2063, 554, 71645,397, 4591, 2271, 5570, 71649,466, 8423, 71651,10763,7734, 71654,5825, 3228, 317, 71655,8125, 31352,71656,71657,317, - 2066, 71659,71660,71661,71663,357, 317, 4591, 1358, 71665,317, 317, 343, 332, 554, 71662,71664,317, 15202,381, 351, 71666,1160, 1347, 466, 34041,7523, + 71610,71596,71597,71598,71600,71601,363, 516, 317, 9624, 1526, 317, 71604,404, 71605,9319, 381, 428, 5038, 71607,6166, 71608,382, 71609,370, 71611,381, + 12277,71613,4965, 71615,3079, 71616,71617,1358, 317, 7618, 13658,317, 5037, 365, 71619,317, 490, 71622,71623,71628,71629,71633,15090,71635,71636,71641,2146, + 71647,71648,71650,71652,71653,490, 365, 317, 317, 6409, 14611,71624,71626,596, 71627,5836, 71625,39009,11114,57320,362, 64979,1060, 50575,317, 317, 317, + 18915,380, 1060, 71630,332, 351, 2351, 5432, 2271, 71631,71632,69042,317, 317, 6354, 9696, 362, 69168,1160, 71634,351, 14569,6228, 317, 1929, 2546, 317, + 317, 317, 3079, 363, 71637,71638,71640,3236, 13807,2308, 41323,317, 8948, 317, 6598, 317, 71639,317, 1347, 9444, 6598, 51361,490, 71642,18138,332, 490, + 71644,3284, 71646,71643,2063, 554, 71645,397, 4591, 2271, 5570, 71649,466, 8423, 71651,10763,7734, 71654,5825, 3228, 317, 71655,8125, 31352,71656,71657,317, + 2066, 71659,71660,71661,71663,357, 317, 4591, 1358, 71665,317, 317, 343, 332, 554, 71662,71664,317, 15202,381, 351, 71666,1160, 1347, 466, 34041,7523, 8639, 351, 71668,332, 2503, 381, 71674,71675,2391, 2553, 317, 351, 71669,71673,345, 317, 1160, 71670,71671,637, 6996, 317, 317, 694, 71672,6394, 15226, - 18014,363, 2108, 71677,71678,71681,71685,71686,71689,71690,71691,71693,6675, 362, 8266, 71694,71697,71698,71703,71704,427, 71706,7657, 4186, 343, 317, 2086, - 6923, 490, 71679,71680,30218,345, 2142, 1109, 317, 71682,71683,71684,317, 7852, 388, 3772, 317, 2546, 71687,71688,317, 317, 476, 6046, 332, 5309, 7494, - 741, 317, 5328, 71692,317, 20331,5482, 317, 46531,71695,490, 317, 17944,317, 71696,7523, 18333,71699,57308,71702,317, 59466,71700,71701,370, 2150, 7913, + 18014,363, 2108, 71677,71678,71681,71685,71686,71689,71690,71691,71693,6675, 362, 8266, 71694,71697,71698,71703,71704,427, 71706,7657, 4186, 343, 317, 2086, + 6923, 490, 71679,71680,30218,345, 2142, 1109, 317, 71682,71683,71684,317, 7852, 388, 3772, 317, 2546, 71687,71688,317, 317, 476, 6046, 332, 5309, 7494, + 741, 317, 5328, 71692,317, 20331,5482, 317, 46531,71695,490, 317, 17944,317, 71696,7523, 18333,71699,57308,71702,317, 59466,71700,71701,370, 2150, 7913, 5991, 71705,4952, 12120,317, 5447, 17160,71707,317, 2142, 332, 71709,59522,5241, 71710,71711,71712,2627, 71713,71501,71716,1588, 16589,1481, 317, 71714,71715, - 13898,7871, 7785, 71718,71719,71721,565, 71722,71726,17677,9595, 71720,362, 317, 71723,71724,317, 71725,373, 71727,1000, 8722, 71729,71731,1033, 71732,471, + 13898,7871, 7785, 71718,71719,71721,565, 71722,71726,17677,9595, 71720,362, 317, 71723,71724,317, 71725,373, 71727,1000, 8722, 71729,71731,1033, 71732,471, 10750,71735,71736,71746,71756,317, 71757,71760,71762,71782,490, 371, 71730,10185,317, 71733,343, 71734,44930,4591, 1060, 351, 71737,71738,71741,71742,71743, 490, 71744,71745,317, 317, 356, 64680,71739,71740,476, 8906, 71747,476, 317, 71748,5279, 71749,10422,71750,10877,370, 362, 2571, 16797,71751,71754,71755, 10487,5270, 71752,2387, 23118,71753,426, 1060, 317, 317, 1044, 71758,6673, 356, 345, 2163, 8603, 317, 2271, 71759,466, 9695, 317, 44194,317, 317, 71761, - 14337,343, 351, 71763,317, 317, 71764,71766,10946,5840, 71769,9624, 71771,14842,71772,71773,71774,71776,5840, 71777,380, 71765,356, 356, 71767,71768,9914, + 14337,343, 351, 71763,317, 317, 71764,71766,10946,5840, 71769,9624, 71771,14842,71772,71773,71774,71776,5840, 71777,380, 71765,356, 356, 71767,71768,9914, 6673, 439, 56798,356, 71770,317, 22591,56804,317, 71775,1999, 490, 32011,71778,71780,384, 71781,71779,380, 56816,356, 356, 545, 71783,71790,10898,71784, 71785,71786,71787,2553, 6532, 5623, 71788,71789,7785, 71792,71797,40536,317, 71793,8281, 317, 71794,1347, 71795,71796,390, 71798,71799,17229,317, 71801,71802, 71803,2631, 33962,1358, 317, 317, 490, 6355, 390, 317, 36875,14551,332, 15138,23082,10997,343, 3854, 1108, 71807,566, 257, 490, 317, 258, 71971,71977, 72043,3773, 72044,72063,4797, 72112,72153,13736,72166,71808,71809,71820,545, 7582, 71824,12696,71830,2156, 71833,71835,71839,71849,71871,71873,71875,71876,71878, - 71879,13031,71810,71817,71818,71819,1168, 71811,8695, 317, 71812,554, 317, 1601, 10149,71813,71814,71815,4789, 71816,317, 317, 12731,370, 9298, 1999, 9140, + 71879,13031,71810,71817,71818,71819,1168, 71811,8695, 317, 71812,554, 317, 1601, 10149,71813,71814,71815,4789, 71816,317, 317, 12731,370, 9298, 1999, 9140, 6255, 71821,71823,2035, 1020, 2211, 317, 61062,71822,630, 5570, 15100,6993, 71825,71827,71826,317, 71828,18978,71829,1358, 71831,317, 71832,511, 4738, 71834, 350, 317, 2035, 2272, 633, 71836,363, 71838,71837,317, 13670,12616,71840,317, 71841,71843,71845,71846,71847,1347, 71848,404, 590, 316, 13962,71842,45441, - 71844,14337,389, 6354, 971, 62675,4925, 317, 34987,14172,6713, 317, 1160, 4591, 13670,15244,466, 545, 365, 2391, 71850,357, 490, 71853,71855,56440,8553, - 71856,16022,71859,71862,71863,71851,332, 71852,317, 317, 71854,317, 351, 317, 351, 64318,16651,71857,362, 8100, 317, 71858,22441,466, 317, 637, 5942, + 71844,14337,389, 6354, 971, 62675,4925, 317, 34987,14172,6713, 317, 1160, 4591, 13670,15244,466, 545, 365, 2391, 71850,357, 490, 71853,71855,56440,8553, + 71856,16022,71859,71862,71863,71851,332, 71852,317, 317, 71854,317, 351, 317, 351, 64318,16651,71857,362, 8100, 317, 71858,22441,466, 317, 637, 5942, 633, 633, 1325, 3999, 71860,71861,317, 56440,317, 71864,71869,317, 317, 32639,71865,71867,71866,71868,7911, 317, 71870,317, 7657, 71872,2317, 23612,71874, 1347, 1358, 9313, 317, 350, 17335,317, 42408,332, 390, 58577,317, 317, 71877,317, 317, 1087, 317, 356, 466, 317, 71880,71888,39575,71914,433, 21190, - 71927,71931,71932,71943,71950,71963,71965,71967,11613,71968,71969,390, 317, 373, 71881,71884,1358, 71882,3999, 362, 317, 2420, 71883,317, 317, 36102,7821, - 71885,5464, 388, 71886,3999, 71887,605, 1160, 11716,10609,317, 381, 71889,71898,5737, 317, 71899,71911,71890,1347, 71894,13378,1943, 71891,5226, 317, 317, - 317, 71892,317, 370, 317, 317, 5201, 7577, 71893,5201, 10680,5225, 5447, 466, 1347, 1347, 71895,2184, 71896,5464, 71897,397, 317, 418, 5167, 363, 466, + 71927,71931,71932,71943,71950,71963,71965,71967,11613,71968,71969,390, 317, 373, 71881,71884,1358, 71882,3999, 362, 317, 2420, 71883,317, 317, 36102,7821, + 71885,5464, 388, 71886,3999, 71887,605, 1160, 11716,10609,317, 381, 71889,71898,5737, 317, 71899,71911,71890,1347, 71894,13378,1943, 71891,5226, 317, 317, + 317, 71892,317, 370, 317, 317, 5201, 7577, 71893,5201, 10680,5225, 5447, 466, 1347, 1347, 71895,2184, 71896,5464, 71897,397, 317, 418, 5167, 363, 466, 9832, 362, 317, 71900,351, 351, 71905,71901,71902,12958,9832, 71903,71904,5105, 1160, 71906,427, 20082,71907,71910,71908,71909,71912,71913,427, 317, 21392, - 71915,71922,373, 450, 1347, 1358, 317, 71916,71917,345, 2571, 22176,71918,71919,71920,71921,317, 317, 71923,5991, 71924,28078,338, 16579,1060, 71925,5942, - 428, 2631, 317, 370, 382, 71926,428, 71928,71929,351, 71930,450, 1347, 2222, 390, 71933,71935,362, 8243, 71934,71936,5281, 71937,10877,362, 317, 317, + 71915,71922,373, 450, 1347, 1358, 317, 71916,71917,345, 2571, 22176,71918,71919,71920,71921,317, 317, 71923,5991, 71924,28078,338, 16579,1060, 71925,5942, + 428, 2631, 317, 370, 382, 71926,428, 71928,71929,351, 71930,450, 1347, 2222, 390, 71933,71935,362, 8243, 71934,71936,5281, 71937,10877,362, 317, 317, 71938,317, 71939,71940,71941,71942,10894,71944,71947,317, 2298, 71948,317, 14296,317, 71945,71946,2510, 3999, 7073, 317, 31642,351, 20423,71949,71951,71954, 71956,350, 350, 490, 71957,71958,71962,5661, 71952,317, 748, 71953,490, 71955,317, 33256,71959,317, 71960,71961,23534,5040, 459, 71964,317, 71966,12732, 71970,71972,71973,71975,317, 363, 71974,1347, 40465,29066,71976,349, 5481, 317, 71978,71982,71986,69067,71993,71996,71998,72006,72017,72019,14410,72031,72040, - 7850, 72041,7523, 71979,350, 71980,6402, 71981,317, 551, 7948, 350, 543, 596, 748, 71983,343, 5105, 71984,317, 5463, 317, 317, 317, 71985,317, 343, - 317, 71987,350, 71988,382, 71992,1347, 390, 7850, 36871,6917, 5896, 351, 71989,71991,71990,71994,381, 350, 381, 5309, 71995,317, 71997,466, 317, 6228, + 7850, 72041,7523, 71979,350, 71980,6402, 71981,317, 551, 7948, 350, 543, 596, 748, 71983,343, 5105, 71984,317, 5463, 317, 317, 317, 71985,317, 343, + 317, 71987,350, 71988,382, 71992,1347, 390, 7850, 36871,6917, 5896, 351, 71989,71991,71990,71994,381, 350, 381, 5309, 71995,317, 71997,466, 317, 6228, 317, 633, 317, 1914, 1347, 317, 317, 71999,343, 72001,350, 72002,362, 72005,317, 72000,72003,72004,466, 362, 541, 317, 7405, 72007,401, 72008,72009, - 72012,72013,2012, 72014,72015,16579,72016,317, 380, 70463,2381, 317, 72010,317, 72011,317, 476, 7954, 3361, 365, 54047,8830, 466, 11434,490, 1347, 9680, - 490, 6199, 5890, 72018,489, 72020,72022,72023,357, 72029,64377,317, 6394, 72021,356, 466, 44620,317, 72024,317, 356, 5343, 317, 317, 72025,72026,317, - 72027,72028,370, 317, 5250, 370, 1526, 396, 317, 72030,72032,72034,12276,11089,317, 350, 72035,72038,72039,72033,72036,72037,380, 351, 3999, 6917, 351, - 16098,45877,10430,351, 72042,72045,317, 72050,72056,317, 72060,72062,363, 343, 72046,72048,363, 1526, 72047,317, 5840, 5464, 466, 2171, 317, 72049,363, + 72012,72013,2012, 72014,72015,16579,72016,317, 380, 70463,2381, 317, 72010,317, 72011,317, 476, 7954, 3361, 365, 54047,8830, 466, 11434,490, 1347, 9680, + 490, 6199, 5890, 72018,489, 72020,72022,72023,357, 72029,64377,317, 6394, 72021,356, 466, 44620,317, 72024,317, 356, 5343, 317, 317, 72025,72026,317, + 72027,72028,370, 317, 5250, 370, 1526, 396, 317, 72030,72032,72034,12276,11089,317, 350, 72035,72038,72039,72033,72036,72037,380, 351, 3999, 6917, 351, + 16098,45877,10430,351, 72042,72045,317, 72050,72056,317, 72060,72062,363, 343, 72046,72048,363, 1526, 72047,317, 5840, 5464, 466, 2171, 317, 72049,363, 72051,72055,72052,339, 3079, 72053,422, 72054,24322,396, 72057,72059,1347, 72058,7941, 54266,990, 72061,990, 11753,10907,72064,72065,72066,72067,72069,72073, - 350, 72074,72084,72089,72099,72100,72111,20779,15993,48791,317, 72068,990, 10422,466, 24007,317, 2272, 72070,317, 317, 72071,72072,47516,1871, 363, 363, + 350, 72074,72084,72089,72099,72100,72111,20779,15993,48791,317, 72068,990, 10422,466, 24007,317, 2272, 72070,317, 317, 72071,72072,47516,1871, 363, 363, 22269,351, 12949,28755,72075,72078,72079,72082,72076,317, 72077,317, 2948, 2708, 15221,350, 72080,345, 72081,72083,317, 70703,5273, 343, 72085,1347, 72086, - 72088,370, 317, 5991, 16651,317, 1160, 317, 10628,72087,26789,379, 466, 362, 317, 317, 72090,401, 8136, 2108, 317, 72091,362, 317, 33888,72092,5213, - 23524,10295,8863, 6228, 990, 356, 72093,317, 72094,46507,317, 351, 317, 1992, 9680, 317, 72095,22716,539, 17091,6917, 72097,72096,3032, 54603,1347, 5450, + 72088,370, 317, 5991, 16651,317, 1160, 317, 10628,72087,26789,379, 466, 362, 317, 317, 72090,401, 8136, 2108, 317, 72091,362, 317, 33888,72092,5213, + 23524,10295,8863, 6228, 990, 356, 72093,317, 72094,46507,317, 351, 317, 1992, 9680, 317, 72095,22716,539, 17091,6917, 72097,72096,3032, 54603,1347, 5450, 565, 450, 72098,2322, 2322, 317, 31822,72101,10626,72105,72106,72107,6089, 476, 72102,72103,72104,317, 6089, 61346,10422,72108,317, 317, 382, 72109,72110, - 5974, 11613,72113,72121,72131,72144,72149,8023, 72152,10641,72114,72115,1481, 72116,14649,6917, 1060, 72118,965, 72119,13171,22809,47968,343, 51854,72117,3079, + 5974, 11613,72113,72121,72131,72144,72149,8023, 72152,10641,72114,72115,1481, 72116,14649,6917, 1060, 72118,965, 72119,13171,22809,47968,343, 51854,72117,3079, 15732,343, 2134, 2222, 373, 72120,1358, 9557, 3999, 317, 72122,72126,4984, 343, 21240,72127,3987, 72123,351, 466, 72124,72125,350, 15892,72128,18227,72129, 72130,317, 351, 6596, 72132,1060, 72134,72143,72133,9078, 72135,72142,10421,380, 72136,621, 6996, 633, 574, 72138,6195, 4965, 9624, 8023, 466, 343, 18460, - 72140,4789, 16363,6089, 72137,72139,9695, 72141,57887,363, 380, 8139, 6420, 2222, 381, 72145,2156, 382, 397, 381, 72147,9325, 72146,72148,8654, 343, 5273, + 72140,4789, 16363,6089, 72137,72139,9695, 72141,57887,363, 380, 8139, 6420, 2222, 381, 72145,2156, 382, 397, 381, 72147,9325, 72146,72148,8654, 343, 5273, 523, 343, 9878, 72150,72151,428, 380, 317, 371, 72154,2298, 2298, 15031,72155,72157,72162,370, 345, 362, 1160, 8096, 72156,317, 10487,72158,5727, 72160, - 1526, 72161,8446, 1347, 5126, 72159,363, 72163,13954,427, 72164,72165,2815, 72167,350, 31751,10147,350, 19922,72168,14062,5742, 350, 46856,345, 2070, 1347, - 72170,72171,72174,72175,72172,72173,72176,72189,72193,2193, 9623, 72177,72178,351, 72181,72182,32407,72183,13071,72187,72188,317, 637, 72179,317, 72180,5055, - 6607, 332, 356, 1347, 351, 389, 4591, 72184,72186,12434,72185,317, 370, 50639,317, 15571,15253,72190,72192,317, 12656,72191,20146,388, 558, 1345, 5717, + 1526, 72161,8446, 1347, 5126, 72159,363, 72163,13954,427, 72164,72165,2815, 72167,350, 31751,10147,350, 19922,72168,14062,5742, 350, 46856,345, 2070, 1347, + 72170,72171,72174,72175,72172,72173,72176,72189,72193,2193, 9623, 72177,72178,351, 72181,72182,32407,72183,13071,72187,72188,317, 637, 72179,317, 72180,5055, + 6607, 332, 356, 1347, 351, 389, 4591, 72184,72186,12434,72185,317, 370, 50639,317, 15571,15253,72190,72192,317, 12656,72191,20146,388, 558, 1345, 5717, 2044, 22802,2510, 72194,72195,72198,72199,72201,13233,72196,72197,345, 2184, 1347, 2184, 13962,72200,5991, 343, 317, 11073,72203,72205,52647,362, 72207,72214, 5295, 72232,27851,72235,72236,72204,350, 8455, 72206,4757, 72208,72210,2036, 72213,317, 64621,72209,64739,72211,72212,72215,72216,72218,72219,72224,72226,72230, 19829,565, 72217,29878,545, 72220,72221,67390,72222,72223,72225,317, 15901,72227,72229,72228,5619, 6964, 72231,72233,490, 490, 72234,781, 72238,72243,72245, - 345, 72248,33428,4937, 59260,12616,72249,10320,72251,72255,2024, 72239,72240,72241,72242,72244,317, 317, 72246,72247,2280, 3227, 72250,949, 1131, 489, 2240, + 345, 72248,33428,4937, 59260,12616,72249,10320,72251,72255,2024, 72239,72240,72241,72242,72244,317, 317, 72246,72247,2280, 3227, 72250,949, 1131, 489, 2240, 1347, 317, 72252,72253,317, 72254,72256,72257,49652,72263,260, 2401, 72522,72525,261, 72739,72741,72744,262, 72830,72835,72840,263, 72986,264, 73203,73206, 265, 73290,28190,73294,72258,72259,72260,72261,72262,620, 72264,72265,72268,72278,72288,72296,72299,72305,72315,72318,72323,72326,72343,72356,72413,72424,72471, - 72476,72501,72508,72517,317, 72519,72521,317, 371, 381, 317, 72266,25092,72267,465, 16960,72269,72270,72271,72272,72276,317, 5105, 1992, 317, 72273,317, + 72476,72501,72508,72517,317, 72519,72521,317, 371, 381, 317, 72266,25092,72267,465, 16960,72269,72270,72271,72272,72276,317, 5105, 1992, 317, 72273,317, 72274,317, 29766,370, 72275,5225, 5394, 466, 72277,466, 317, 317, 2024, 363, 6275, 317, 317, 317, 6240, 72279,72280,5891, 72287,1160, 11146,72281,72283, 72286,72282,72284,72285,3284, 14483,7401, 466, 1962, 317, 501, 72289,6599, 72290,350, 883, 72293,317, 317, 371, 72291,5742, 72292,16860,72294,72295,15457, 16960,351, 15325,72297,1998, 44544,46394,72298,72300,3368, 363, 72301,72303,72304,317, 317, 72302,317, 1347, 317, 45906,2178, 382, 317, 12586,72306,10709, - 72309,10877,72311,362, 72312,8296, 317, 72307,317, 362, 1347, 317, 72308,6894, 72310,317, 72313,351, 72314,317, 381, 332, 5536, 6402, 72316,350, 553, + 72309,10877,72311,362, 72312,8296, 317, 72307,317, 362, 1347, 317, 72308,6894, 72310,317, 72313,351, 72314,317, 381, 332, 5536, 6402, 72316,350, 553, 5836, 317, 5896, 72317,385, 362, 39569,317, 5570, 317, 317, 317, 350, 2022, 72319,72321,72320,317, 8136, 466, 2571, 317, 317, 404, 24638,9695, 16146, 345, 19922,317, 72322,1531, 4563, 363, 72324,466, 72325,2022, 343, 317, 18127,1020, 55611,9479, 317, 317, 72327,5897, 2705, 350, 72330,2024, 72331,72335, - 72337,490, 16092,6901, 350, 2022, 72341,72342,350, 72328,72329,2413, 317, 72332,363, 72333,72334,5355, 5488, 72336,466, 317, 317, 53775,551, 44738,2705, - 34987,72338,362, 72339,72340,5809, 16354,5055, 2553, 5809, 39003,5810, 72344,72346,72347,72348,2024, 72350,72352,2086, 59504,72353,5255, 317, 72345,7392, 6674, - 72349,317, 317, 72351,404, 70179,350, 317, 72354,466, 490, 10223,317, 72355,317, 72357,72358,72359,72363,72377,72378,72379,45119,72381,72387,72404,2171, + 72337,490, 16092,6901, 350, 2022, 72341,72342,350, 72328,72329,2413, 317, 72332,363, 72333,72334,5355, 5488, 72336,466, 317, 317, 53775,551, 44738,2705, + 34987,72338,362, 72339,72340,5809, 16354,5055, 2553, 5809, 39003,5810, 72344,72346,72347,72348,2024, 72350,72352,2086, 59504,72353,5255, 317, 72345,7392, 6674, + 72349,317, 317, 72351,404, 70179,350, 317, 72354,466, 490, 10223,317, 72355,317, 72357,72358,72359,72363,72377,72378,72379,45119,72381,72387,72404,2171, 72406,72407,8022, 72408,72409,46646,72411,72412,1358, 4952, 356, 1230, 47396,10429,6673, 2322, 11443,12590,72360,72361,72362,5832, 317, 11883,5866, 501, 72364, - 72369,72370,12556,72372,343, 12454,72373,32249,72375,72376,1060, 1999, 350, 343, 380, 7035, 72365,72366,72367,2247, 65944,317, 72368,384, 7590, 317, 350, + 72369,72370,12556,72372,343, 12454,72373,32249,72375,72376,1060, 1999, 350, 343, 380, 7035, 72365,72366,72367,2247, 65944,317, 72368,384, 7590, 317, 350, 317, 72371,501, 67937,9649, 390, 72374,345, 4268, 5926, 13367,356, 1999, 317, 370, 5223, 401, 317, 11743,11687,317, 621, 72380,13392,1358, 317, 11242, 317, 8766, 7035, 317, 371, 12902,72382,72383,351, 11687,317, 72384,11280,72385,317, 345, 45719,72386,605, 3284, 6048, 1345, 8273, 72388,345, 72389,15842, 10626,72390,72391,72392,72393,72394,72395,72396,72397,72398,72399,72400,72401,72402,72403,72405,317, 12487,345, 22945,8178, 5836, 27990,9878, 9624, 2577, 39450, - 72410,363, 427, 9176, 370, 428, 5851, 2063, 384, 7480, 15685,72414,317, 72416,72422,317, 72415,72417,72418,72419,72420,72421,72423,3079, 317, 2024, 317, + 72410,363, 427, 9176, 370, 428, 5851, 2063, 384, 7480, 15685,72414,317, 72416,72422,317, 72415,72417,72418,72419,72420,72421,72423,3079, 317, 2024, 317, 1160, 404, 317, 22090,35386,651, 72425,673, 633, 72426,72427,72429,72434,72435,72436,72440,72443,72444,72446,16825,72448,72450,72454,72456,72459,72465,72466, 317, 72470,393, 551, 550, 72428,5962, 637, 14589,45529,72430,339, 317, 72431,9450, 380, 362, 317, 72432,72433,27795,412, 72437,72438,316, 72439,17021, - 343, 390, 72441,9878, 72442,3366, 356, 5634, 6917, 390, 317, 1992, 363, 72445,343, 370, 362, 4980, 5037, 5557, 317, 18429,72447,24132,18492,350, 343, - 72449,5896, 9450, 578, 317, 550, 72451,72452,72453,317, 2117, 7942, 72455,26242,317, 317, 317, 317, 317, 6080, 72457,370, 317, 30944,72458,72460,6228, - 339, 10422,3999, 26658,2402, 72463,317, 317, 6736, 317, 72461,72462,72464,5225, 1325, 3999, 72467,5558, 2063, 381, 72468,317, 72469,20113,317, 1926, 317, - 13683,351, 72472,72473,332, 370, 363, 72474,2590, 8304, 490, 72475,7785, 317, 2086, 317, 317, 371, 12696,18490,72477,72487,72489,350, 370, 72496,317, - 72497,72498,2222, 72478,317, 8695, 317, 54267,24438,5399, 1347, 72485,72486,2260, 72479,72480,72481,72482,72483,72484,11761,2261, 22716,5037, 1700, 345, 345, + 343, 390, 72441,9878, 72442,3366, 356, 5634, 6917, 390, 317, 1992, 363, 72445,343, 370, 362, 4980, 5037, 5557, 317, 18429,72447,24132,18492,350, 343, + 72449,5896, 9450, 578, 317, 550, 72451,72452,72453,317, 2117, 7942, 72455,26242,317, 317, 317, 317, 317, 6080, 72457,370, 317, 30944,72458,72460,6228, + 339, 10422,3999, 26658,2402, 72463,317, 317, 6736, 317, 72461,72462,72464,5225, 1325, 3999, 72467,5558, 2063, 381, 72468,317, 72469,20113,317, 1926, 317, + 13683,351, 72472,72473,332, 370, 363, 72474,2590, 8304, 490, 72475,7785, 317, 2086, 317, 317, 371, 12696,18490,72477,72487,72489,350, 370, 72496,317, + 72497,72498,2222, 72478,317, 8695, 317, 54267,24438,5399, 1347, 72485,72486,2260, 72479,72480,72481,72482,72483,72484,11761,2261, 22716,5037, 1700, 345, 345, 72488,7185, 317, 72490,16319,72491,596, 72493,345, 343, 72492,317, 317, 448, 43237,466, 19922,317, 72494,72495,20674,490, 965, 27913,363, 448, 72499, 317, 343, 1078, 72500,1347, 21495,72502,390, 72503,72505,317, 72507,317, 345, 1108, 2108, 351, 363, 343, 317, 72504,4738, 317, 45868,317, 54501,72506, - 6204, 45441,25736,404, 4738, 72509,72510,490, 596, 72511,72516,44046,4925, 7045, 72512,72513,72515,317, 72514,317, 7187, 72518,428, 11146,5991, 3999, 350, + 6204, 45441,25736,404, 4738, 72509,72510,490, 596, 72511,72516,44046,4925, 7045, 72512,72513,72515,317, 72514,317, 7187, 72518,428, 11146,5991, 3999, 350, 385, 72520,317, 6412, 9696, 2261, 11347,7035, 72523,70714,72524,351, 43027,351, 72526,317, 72527,72528,72542,72543,72548,72551,72570,72583,72586,72588,72618, - 72619,72620,72631,72636,72659,72688,72716,72723,72726,72732,72738,5890, 390, 72529,62338,72533,72534,72537,345, 72541,490, 72530,554, 72532,362, 3987, 317, - 72531,370, 3338, 7401, 2022, 317, 15913,3999, 317, 72535,317, 72536,1704, 72538,10422,72539,466, 5353, 72540,19171,5840, 317, 362, 24504,317, 3078, 4965, - 350, 72544,72545,332, 351, 11346,14615,68563,72546,362, 5022, 72547,2272, 72549,362, 72550,37649,72552,1358, 72553,72560,72564,72568,343, 16220,317, 2022, + 72619,72620,72631,72636,72659,72688,72716,72723,72726,72732,72738,5890, 390, 72529,62338,72533,72534,72537,345, 72541,490, 72530,554, 72532,362, 3987, 317, + 72531,370, 3338, 7401, 2022, 317, 15913,3999, 317, 72535,317, 72536,1704, 72538,10422,72539,466, 5353, 72540,19171,5840, 317, 362, 24504,317, 3078, 4965, + 350, 72544,72545,332, 351, 11346,14615,68563,72546,362, 5022, 72547,2272, 72549,362, 72550,37649,72552,1358, 72553,72560,72564,72568,343, 16220,317, 2022, 362, 317, 72554,9759, 72555,317, 72556,317, 15202,317, 1358, 35295,363, 72557,72558,72559,317, 72561,384, 72562,501, 4952, 317, 2063, 6563, 72563,72037, - 28462,551, 675, 2163, 30957,72565,2571, 72566,317, 72567,317, 72569,1325, 466, 362, 317, 72571,72577,490, 317, 72572,9913, 6486, 72573,72574,72576,317, - 7785, 10592,317, 317, 317, 15842,72575,5838, 404, 72578,72580,1358, 350, 551, 317, 72579,317, 317, 72581,317, 317, 11939,72582,363, 5213, 363, 428, + 28462,551, 675, 2163, 30957,72565,2571, 72566,317, 72567,317, 72569,1325, 466, 362, 317, 72571,72577,490, 317, 72572,9913, 6486, 72573,72574,72576,317, + 7785, 10592,317, 317, 317, 15842,72575,5838, 404, 72578,72580,1358, 350, 551, 317, 72579,317, 317, 72581,317, 317, 11939,72582,363, 5213, 363, 428, 72584,2254, 37251,350, 72585,5662, 381, 317, 72587,31052,317, 317, 19324,317, 37194,21245,72589,21274,373, 72590,317, 2184, 32289,72594,317, 19181,68901, 12731,4738, 8392, 72591,2568, 362, 72592,72593,72595,72596,7618, 72603,72605,350, 72606,72611,72612,72614,72615,1444, 8125, 317, 37723,1453, 317, 2222, 72597, - 35678,7365, 72599,4949, 66746,72598,72600,2193, 9696, 72601,419, 2568, 72602,317, 72604,317, 72607,72610,501, 72608,72609,381, 2222, 396, 412, 23849,350, + 35678,7365, 72599,4949, 66746,72598,72600,2193, 9696, 72601,419, 2568, 72602,317, 72604,317, 72607,72610,501, 72608,72609,381, 2222, 396, 412, 23849,350, 2219, 1108, 10580,72613,12314,350, 6415, 27369,72616,72617,15221,15221,419, 4984, 1108, 1108, 350, 1358, 317, 1347, 2086, 317, 72621,72627,72628,15993,72622, - 72623,3599, 8948, 72624,72625,317, 14909,2715, 317, 6996, 317, 7865, 38667,317, 72626,72629,466, 350, 72630,317, 72632,11442,363, 350, 72633,72635,317, + 72623,3599, 8948, 72624,72625,317, 14909,2715, 317, 6996, 317, 7865, 38667,317, 72626,72629,466, 350, 72630,317, 72632,11442,363, 350, 72633,72635,317, 72634,466, 350, 31227,501, 343, 317, 72637,72638,72640,72642,72644,72646,11709,362, 72652,72653,6601, 72656,72658,11040,384, 16264,384, 380, 317, 72639, - 380, 72641,433, 72643,2551, 72645,343, 72647,72648,72649,72650,72651,12144,345, 72654,2163, 72655,545, 72657,363, 2521, 18840,439, 10907,363, 317, 2134, - 72660,72663,72664,72667,72669,72670,72676,490, 72677,72678,72681,8177, 72682,332, 72685,72687,8722, 72661,1913, 4873, 371, 72662,15319,3284, 19324,317, 317, - 72665,72666,3022, 5836, 72668,317, 30301,2071, 551, 6228, 72671,332, 72674,27723,2058, 404, 317, 2272, 72672,317, 8529, 72673,11831,345, 317, 72675,317, + 380, 72641,433, 72643,2551, 72645,343, 72647,72648,72649,72650,72651,12144,345, 72654,2163, 72655,545, 72657,363, 2521, 18840,439, 10907,363, 317, 2134, + 72660,72663,72664,72667,72669,72670,72676,490, 72677,72678,72681,8177, 72682,332, 72685,72687,8722, 72661,1913, 4873, 371, 72662,15319,3284, 19324,317, 317, + 72665,72666,3022, 5836, 72668,317, 30301,2071, 551, 6228, 72671,332, 72674,27723,2058, 404, 317, 2272, 72672,317, 8529, 72673,11831,345, 317, 72675,317, 317, 343, 5300, 5037, 363, 338, 33821,46664,72679,72680,419, 370, 15326,72683,72684,317, 317, 2142, 25190,317, 317, 72686,5055, 351, 6552, 72689,72690, - 72692,72703,72704,72707,72709,16825,72710,72714,1481, 72715,490, 16865,11663,72691,72693,381, 41003,72694,72695,1601, 72697,72698,72699,58309,427, 72696,8718, + 72692,72703,72704,72707,72709,16825,72710,72714,1481, 72715,490, 16865,11663,72691,72693,381, 41003,72694,72695,1601, 72697,72698,72699,58309,427, 72696,8718, 72700,72701,5447, 72702,9313, 382, 351, 2086, 317, 72705,317, 72706,5488, 370, 18587,72708,317, 9931, 317, 514, 1345, 3999, 317, 380, 28588,4965, 72711, 370, 356, 317, 427, 72712,317, 1459, 596, 72713,72717,343, 350, 404, 72720,72721,72718,72719,72722,1999, 72724,371, 2254, 351, 23995,72725,363, 72727, 72731,317, 1160, 72728,6996, 317, 633, 317, 317, 317, 72729,317, 7214, 37918,317, 317, 317, 990, 351, 72730,371, 1160, 2551, 404, 72733,34257,16651, 317, 72734,317, 72735,72737,5334, 72736,351, 46262,317, 72740,12487,1444, 25289,72742,12494,2212, 72743,551, 34803,72745,72747,373, 72746,72748,619, 72749, 72750,72762,72763,72770,72776,380, 72780,72782,72793,72799,72812,72819,317, 72825,72828,317, 317, 72751,72752,351, 22983,317, 8301, 72753,72757,72758,28250, 72759,362, 2022, 72761,317, 1060, 1160, 72754,72755,72756,439, 72760,363, 1194, 317, 317, 317, 317, 545, 356, 427, 317, 554, 362, 10354,37194,72764, - 72765,24192,72767,1347, 72769,16296,72766,362, 590, 72768,317, 343, 317, 317, 9688, 380, 72771,24322,72775,72772,343, 72773,2571, 317, 317, 72774,428, - 2510, 2509, 72766,72777,3987, 6089, 72778,5687, 317, 72779,317, 7986, 317, 72781,2272, 72783,72784,72786,72787,350, 2566, 404, 72791,72792,72785,2416, 350, + 72765,24192,72767,1347, 72769,16296,72766,362, 590, 72768,317, 343, 317, 317, 9688, 380, 72771,24322,72775,72772,343, 72773,2571, 317, 317, 72774,428, + 2510, 2509, 72766,72777,3987, 6089, 72778,5687, 317, 72779,317, 7986, 317, 72781,2272, 72783,72784,72786,72787,350, 2566, 404, 72791,72792,72785,2416, 350, 71162,8948, 8830, 350, 72788,362, 2571, 4980, 72789,317, 34334,5055, 72790,428, 356, 350, 317, 317, 11940,428, 72794,351, 1915, 350, 15066,5951, 72795, 404, 72796,1999, 343, 404, 1160, 72797,317, 72798,317, 345, 4268, 62970,4965, 72800,33398,72802,72807,72809,72811,6412, 17019,72801,10392,9624, 72803,72804, - 24008,317, 72806,381, 6674, 384, 72805,1444, 317, 15334,72808,466, 10223,7405, 317, 317, 8587, 3999, 317, 72810,72813,72814,7114, 72817,317, 72815,317, + 24008,317, 72806,381, 6674, 384, 72805,1444, 317, 15334,72808,466, 10223,7405, 317, 317, 8587, 3999, 317, 72810,72813,72814,7114, 72817,317, 72815,317, 8178, 72816,72818,5501, 345, 72820,4591, 317, 72821,362, 24664,72824,317, 72822,72823,356, 466, 6736, 7857, 72826,317, 72827,37194,501, 10956,72829,66662, 2272, 72831,72832,72833,72834,363, 43037,596, 5055, 9171, 343, 57204,574, 72836,72837,72839,14217,24579,72838,72841,38517,72842,343, 1020, 317, 72843,72844, 72847,72860,72864,72871,72875,72877,72878,72884,72885,72890,72901,72908,72925,72931,72936,72957,72958,72965,72977,72978,72983,72845,6578, 351, 72846,332, 42075, - 72848,72849,72850,565, 51102,72852,17469,72853,72856,2022, 72857,350, 363, 72858,72376,404, 35267,72859,72851,5898, 7368, 13999,16989,317, 317, 5223, 381, - 12844,72854,396, 72855,16616,363, 33469,21274,72861,72862,72863,12487,12696,428, 8023, 317, 16672,51142,72865,72866,68815,350, 351, 343, 72868,317, 2152, - 72869,72870,317, 39315,350, 72867,31227,1020, 351, 72872,332, 2317, 317, 72873,15274,56343,1347, 72874,317, 501, 343, 1020, 350, 72876,25415,2222, 317, + 72848,72849,72850,565, 51102,72852,17469,72853,72856,2022, 72857,350, 363, 72858,72376,404, 35267,72859,72851,5898, 7368, 13999,16989,317, 317, 5223, 381, + 12844,72854,396, 72855,16616,363, 33469,21274,72861,72862,72863,12487,12696,428, 8023, 317, 16672,51142,72865,72866,68815,350, 351, 343, 72868,317, 2152, + 72869,72870,317, 39315,350, 72867,31227,1020, 351, 72872,332, 2317, 317, 72873,15274,56343,1347, 72874,317, 501, 343, 1020, 350, 72876,25415,2222, 317, 317, 350, 72879,317, 72880,5343, 317, 72881,72882,72883,53095,5655, 363, 72886,343, 72887,72888,72889,2036, 317, 1345, 1347, 317, 317, 1943, 370, 72891, - 5896, 14003,381, 72893,365, 72894,72895,3079, 1358, 10081,72897,72900,72892,371, 3284, 317, 27367,3284, 317, 317, 351, 12142,14695,72896,317, 72898,317, + 5896, 14003,381, 72893,365, 72894,72895,3079, 1358, 10081,72897,72900,72892,371, 3284, 317, 27367,3284, 317, 317, 351, 12142,14695,72896,317, 72898,317, 72899,72902,72907,596, 12631,72903,72905,72904,317, 5828, 72906,72909,1358, 72923,427, 72924,317, 317, 320, 740, 72910,72912,317, 9624, 72913,511, 72915, - 72916,72918,72919,72920,1160, 15891,10560,72911,6343, 1453, 16092,7368, 9696, 25986,9357, 25986,72914,2374, 428, 392, 553, 5575, 72917,2577, 15748,72921,406, - 72922,343, 390, 4965, 5861, 317, 9425, 72926,72928,68787,72929,317, 317, 1347, 72927,370, 25782,356, 72930,317, 317, 345, 2024, 6532, 350, 381, 490, + 72916,72918,72919,72920,1160, 15891,10560,72911,6343, 1453, 16092,7368, 9696, 25986,9357, 25986,72914,2374, 428, 392, 553, 5575, 72917,2577, 15748,72921,406, + 72922,343, 390, 4965, 5861, 317, 9425, 72926,72928,68787,72929,317, 317, 1347, 72927,370, 25782,356, 72930,317, 317, 345, 2024, 6532, 350, 381, 490, 2301, 541, 72932,317, 9119, 2110, 72933,72934,3999, 48247,2156, 356, 72935,317, 13679,1347, 72937,10487,10592,72938,72939,72942,72943,1347, 2058, 72945,72950, - 37352,11928,72951,72952,317, 317, 72940,7504, 33875,72485,7821, 9720, 72941,72944,1266, 317, 317, 363, 2178, 72946,19661,15118,317, 72947,72948,1160, 317, + 37352,11928,72951,72952,317, 317, 72940,7504, 33875,72485,7821, 9720, 72941,72944,1266, 317, 317, 363, 2178, 72946,19661,15118,317, 72947,72948,1160, 317, 381, 1347, 317, 72949,18978,2208, 2024, 7871, 4984, 317, 317, 72953,8000, 317, 72956,5037, 72954,18192,72955,371, 317, 14834,11040,351, 390, 72959,71964, 332, 350, 2317, 72961,317, 31181,72960,72962,317, 351, 72963,72964,428, 390, 72966,351, 72968,72970,72971,72972,62315,72967,2609, 317, 62315,2609, 62315, - 317, 72969,351, 5037, 11442,317, 404, 72973,72975,350, 317, 72974,72976,7911, 350, 9878, 63484,7850, 72979,11442,72980,72981,343, 7405, 72982,317, 2126, + 317, 72969,351, 5037, 11442,317, 404, 72973,72975,350, 317, 72974,72976,7911, 350, 9878, 63484,7850, 72979,11442,72980,72981,343, 7405, 72982,317, 2126, 72984,351, 343, 72985,379, 5450, 72987,72988,14493,72989,7367, 72990,73071,73114,355, 73146,73178,73196,73198,72991,72993,72995,73002,73007,73008,73009,73010, - 73020,73021,73022,73023,73032,73033,73036,73055,73059,73063,73066,73068,72992,5644, 9938, 2272, 72994,317, 2568, 72996,72997,72998,14561,363, 370, 362, 317, - 72999,73000,73001,317, 15016,33469,351, 2024, 73003,29181,2568, 73004,73005,73006,514, 1325, 2024, 466, 73011,14316,73018,73012,73013,2208, 73014,73015,317, - 990, 14316,317, 381, 73016,73017,73019,363, 317, 317, 2310, 4965, 58943,370, 4962, 317, 380, 5032, 73024,73025,6994, 2024, 73026,883, 317, 65586,2317, + 73020,73021,73022,73023,73032,73033,73036,73055,73059,73063,73066,73068,72992,5644, 9938, 2272, 72994,317, 2568, 72996,72997,72998,14561,363, 370, 362, 317, + 72999,73000,73001,317, 15016,33469,351, 2024, 73003,29181,2568, 73004,73005,73006,514, 1325, 2024, 466, 73011,14316,73018,73012,73013,2208, 73014,73015,317, + 990, 14316,317, 381, 73016,73017,73019,363, 317, 317, 2310, 4965, 58943,370, 4962, 317, 380, 5032, 73024,73025,6994, 2024, 73026,883, 317, 65586,2317, 9444, 1325, 466, 317, 73027,2024, 73029,73031,10709,32534,317, 73028,2571, 1347, 381, 32534,73030,466, 317, 4982, 1347, 317, 2571, 363, 5363, 317, 73034, 46099,73035,2188, 4949, 7911, 10560,9444, 66407,6704, 350, 317, 73037,2631, 73038,2388, 73041,73044,362, 73045,317, 317, 73054,58150,317, 5126, 2086, 73039, 6596, 317, 73040,345, 317, 7560, 345, 4268, 472, 73042,38431,9624, 73043,51910,317, 5581, 2035, 5663, 1588, 12463,20062,317, 73046,73047,539, 317, 73050, - 3577, 73051,73048,73049,28092,73052,73053,46262,390, 317, 73056,433, 73058,73057,350, 72907,4965, 350, 2222, 317, 73060,73062,73061,73064,16438,8948, 317, + 3577, 73051,73048,73049,28092,73052,73053,46262,390, 317, 73056,433, 73058,73057,350, 72907,4965, 350, 2222, 317, 73060,73062,73061,73064,16438,8948, 317, 2222, 419, 73065,9914, 317, 2631, 5991, 73067,466, 317, 35043,479, 73069,73070,73072,73077,73078,73081,73082,73086,343, 73087,73089,73091,73092,73093,73095, 73096,73100,73106,73108,317, 73112,363, 317, 32258,73073,73076,10422,466, 73074,317, 73075,351, 554, 351, 317, 2222, 73079,73080,370, 317, 2222, 73083, - 317, 543, 13914,351, 22559,362, 363, 61418,317, 73084,73085,393, 73088,317, 8600, 72764,471, 4952, 73090,47779,11244,11244,317, 363, 971, 345, 748, - 317, 73094,5309, 490, 350, 72282,1459, 380, 317, 2402, 68504,73097,343, 21882,317, 73098,73099,73101,73102,73103,67569,73104,73105,15758,73107,5464, 379, + 317, 543, 13914,351, 22559,362, 363, 61418,317, 73084,73085,393, 73088,317, 8600, 72764,471, 4952, 73090,47779,11244,11244,317, 363, 971, 345, 748, + 317, 73094,5309, 490, 350, 72282,1459, 380, 317, 2402, 68504,73097,343, 21882,317, 73098,73099,73101,73102,73103,67569,73104,73105,15758,73107,5464, 379, 466, 2510, 73109,2024, 404, 317, 73110,73111,466, 317, 9720, 317, 317, 73113,73115,73117,73118,73124,73127,73128,73129,73131,73135,73136,73139,11418,73140, - 73145,317, 8178, 317, 73116,317, 1325, 3640, 1700, 373, 13258,73119,73123,16553,73120,7389, 12696,73121,73122,24398,22591,2571, 317, 9623, 73125,73126,381, - 1160, 317, 317, 2134, 350, 350, 381, 8992, 73130,73132,8553, 317, 317, 73133,25077,9479, 6420, 317, 73134,1194, 380, 511, 373, 9567, 317, 73137,317, - 2178, 5359, 73138,554, 466, 317, 317, 2655, 6598, 2060, 15001,8136, 466, 16022,15253,317, 29408,390, 317, 7688, 73141,73144,73142,73143,73147,371, 6917, + 73145,317, 8178, 317, 73116,317, 1325, 3640, 1700, 373, 13258,73119,73123,16553,73120,7389, 12696,73121,73122,24398,22591,2571, 317, 9623, 73125,73126,381, + 1160, 317, 317, 2134, 350, 350, 381, 8992, 73130,73132,8553, 317, 317, 73133,25077,9479, 6420, 317, 73134,1194, 380, 511, 373, 9567, 317, 73137,317, + 2178, 5359, 73138,554, 466, 317, 317, 2655, 6598, 2060, 15001,8136, 466, 16022,15253,317, 29408,390, 317, 7688, 73141,73144,73142,73143,73147,371, 6917, 73148,73150,73152,73153,20113,2590, 21186,73158,73160,73166,73170,73171,73172,73173,73175,343, 73176,317, 73177,43607,1358, 9914, 2134, 343, 317, 73149,73151, 64177,363, 73154,73155,317, 73156,73157,25258,11196,317, 73159,73161,73162,4965, 10907,6601, 73163,350, 73164,365, 73165,2108, 73167,6904, 332, 317, 73168, - 24398,22437,370, 362, 19504,73169,1347, 343, 332, 343, 345, 7785, 22114,73174,362, 317, 2510, 5662, 317, 14350,390, 1358, 1358, 4925, 11442,2222, 317, + 24398,22437,370, 362, 19504,73169,1347, 343, 332, 343, 345, 7785, 22114,73174,362, 317, 2510, 5662, 317, 14350,390, 1358, 1358, 4925, 11442,2222, 317, 362, 8296, 350, 365, 73179,73180,73187,32013,73188,73190,73191,28241,73193,345, 73194,343, 371, 73195,343, 13392,343, 501, 73181,73182,16187,5662, 73183, - 73184,73185,5447, 466, 73186,380, 2391, 317, 73189,41553,317, 317, 2280, 11249,73192,2188, 317, 32360,11347,317, 73197,350, 343, 11280,6917, 350, 8099, + 73184,73185,5447, 466, 73186,380, 2391, 317, 73189,41553,317, 317, 2280, 11249,73192,2188, 317, 32360,11347,317, 73197,350, 343, 11280,6917, 350, 8099, 4304, 350, 73199,73200,16670,73201,73202,11146,363, 73204,317, 73205,73207,73208,73210,73219,73223,73241,73248,73253,73255,73257,73258,73261,73265,73269,73247, 73284,343, 73288,450, 73209,73211,73217,1915, 73218,4980, 73212,3079, 73214,73215,317, 317, 317, 73213,381, 332, 73216,64719,317, 73220,7337, 73221,14561, - 73222,43298,18460,317, 317, 6596, 5223, 381, 317, 317, 633, 73224,73226,73227,73230,73233,73234,73237,72376,317, 3987, 73239,11346,73225,551, 356, 7582, - 16092,73228,317, 73229,317, 317, 7821, 317, 73231,73232,427, 2368, 317, 1011, 317, 345, 15960,6036, 1160, 363, 1588, 73235,73236,73238,7285, 3284, 466, + 73222,43298,18460,317, 317, 6596, 5223, 381, 317, 317, 633, 73224,73226,73227,73230,73233,73234,73237,72376,317, 3987, 73239,11346,73225,551, 356, 7582, + 16092,73228,317, 73229,317, 317, 7821, 317, 73231,73232,427, 2368, 317, 1011, 317, 345, 15960,6036, 1160, 363, 1588, 73235,73236,73238,7285, 3284, 466, 73240,6917, 73242,68581,73243,553, 16288,16979,73247,6917, 73244,73245,73246,73249,317, 5991, 317, 14172,73250,317, 317, 73251,73252,73254,317, 317, 73256, 8296, 8392, 68174,317, 343, 384, 2222, 5392, 73259,351, 11158,1358, 73260,6674, 5717, 317, 14337,1383, 317, 10877,317, 317, 317, 317, 317, 15130,73262, 73264,317, 73263,8553, 356, 72022,73266,73267,5793, 351, 317, 73268,6996, 24398,397, 370, 73270,73271,317, 73273,73275,73276,60691,73277,73281,73282,73283, - 4982, 317, 50145,73272,2368, 317, 490, 351, 2368, 73274,8023, 20641,380, 380, 363, 1347, 73278,57336,351, 317, 73279,317, 73280,351, 5482, 7368, 384, + 4982, 317, 50145,73272,2368, 317, 490, 351, 2368, 73274,8023, 20641,380, 380, 363, 1347, 73278,57336,351, 317, 73279,317, 73280,351, 5482, 7368, 384, 1060, 50145,317, 73285,11652,350, 450, 73286,7949, 7949, 5037, 14645,73287,317, 32957,363, 73289,73291,73292,2145, 317, 73293,73295,390, 2510, 73296,73299, 2156, 3079, 73302,317, 317, 8136, 73297,345, 6904, 10878,73298,1526, 356, 317, 48435,73300,73301,2272, 5217, 73303,73304,317, 73305,267, 73474,73500,73517, 73529,73541,73555,73559,73563,73565,73578,73608,73637,73687,268, 73817,73874,73910,73928,73935,73942,73943,73944,5711, 73306,7916, 12920,343, 332, 73307,73308, @@ -11825,435 +11820,435 @@ static const unsigned int ChildLocs[185261] = 401, 71440,73310,2271, 478, 317, 73312,73314,2094, 317, 73315,73316,73318,356, 466, 73319,380, 3853, 73321,30712,73327,73330,73332,73344,6736, 73322,73324, 73326,73323,2236, 73325,73328,73329,73331,2156, 5335, 5624, 73333,73337,519, 2128, 73334,10714,73335,73336,73338,73339,41065,73340,73341,73342,73343,53274,30685, 73346,73347,73353,73355,73348,73351,73349,73350,73352,5441, 5167, 73354,52593,12598,34396,30477,5447, 466, 433, 565, 317, 47256,73358,6709, 73360,14409,73359, - 73361,73363,2368, 22737,73365,73364,2110, 2156, 345, 29735,37598,73367,450, 2110, 4925, 9454, 4925, 357, 7657, 332, 73370,73374,73371,73372,356, 73373,317, + 73361,73363,2368, 22737,73365,73364,2110, 2156, 345, 29735,37598,73367,450, 2110, 4925, 9454, 4925, 357, 7657, 332, 73370,73374,73371,73372,356, 73373,317, 382, 363, 41130,6433, 22546,45506,73376,73378,317, 73377,2134, 73379,53888,7340, 1160, 460, 73381,73387,73391,3901, 73382,73384,73383,504, 73385,73386,73388, 20856,73389,73390,2155, 363, 73392,57932,73393,73394,457, 381, 390, 73397,73398,8636, 2143, 73399,2510, 73400,73401,73402,351, 9162, 73404,73408,73405,73407, 73406,73409,2060, 73411,28380,73415,73412,990, 490, 73413,73414,40832,490, 490, 60747,73417,73421,73429,73430,1020, 73434,73435,73439,73451,28382,73418,73419, - 8139, 73420,317, 5365, 73422,73428,1347, 73423,73424,73425,343, 73426,73427,596, 26642,73431,21001,73432,73433,317, 317, 514, 317, 8544, 345, 382, 5492, + 8139, 73420,317, 5365, 73422,73428,1347, 73423,73424,73425,343, 73426,73427,596, 26642,73431,21001,73432,73433,317, 317, 514, 317, 8544, 345, 382, 5492, 5441, 5709, 73436,73437,73438,35409,345, 73440,73445,73448,73441,5167, 2156, 550, 73442,73443,73444,343, 5324, 5492, 73446,73447,4267, 5502, 73449,23702,73450, 1526, 30877,73453,73456,73457,73459,8649, 73454,381, 51268,504, 73455,433, 2163, 33469,73458,317, 73460,343, 25938,55772,73461,73462,6255, 73464,73465,73466, - 490, 317, 73467,73469,73470,5220, 5363, 1531, 14223,73473,73475,73484,2357, 73486,73490,73499,5226, 351, 73476,73479,73481,73482,5272, 73477,73478,317, 317, - 317, 345, 10891,21036,2510, 73480,574, 5323, 4591, 5399, 73483,5711, 73485,73487,73489,15772,490, 490, 11146,317, 8455, 73488,3284, 11280,317, 633, 4925, + 490, 317, 73467,73469,73470,5220, 5363, 1531, 14223,73473,73475,73484,2357, 73486,73490,73499,5226, 351, 73476,73479,73481,73482,5272, 73477,73478,317, 317, + 317, 345, 10891,21036,2510, 73480,574, 5323, 4591, 5399, 73483,5711, 73485,73487,73489,15772,490, 490, 11146,317, 8455, 73488,3284, 11280,317, 633, 4925, 2584, 2391, 73491,8125, 73493,472, 73494,605, 1160, 44345,317, 317, 317, 73492,317, 633, 356, 317, 1992, 12527,73495,73496,317, 633, 3529, 371, 35292, 73497,73498,427, 317, 393, 73501,73503,73505,73509,73511,73513,46173,73514,317, 73515,317, 40568,73502,48143,393, 339, 73504,2584, 448, 371, 448, 73506, 73507,545, 545, 14263,545, 5324, 545, 390, 73508,1060, 741, 12019,73510,73512,351, 73516,2719, 381, 2366, 365, 5891, 345, 73518,73525,73526,1347, 73527, 351, 73528,317, 501, 73519,73522,73520,73521,73523,73524,501, 1347, 73522,9938, 317, 343, 73530,73540,362, 362, 73531,73533,73535,73536,20341,381, 73532, 10422,10877,317, 317, 73534,578, 6033, 5447, 41857,6433, 371, 73537,363, 7368, 73538,5055, 73539,6514, 73542,501, 73547,73549,73551,73553,5241, 73554,73543, - 6834, 317, 5836, 53626,73544,6834, 25493,317, 317, 317, 20913,73545,2077, 10172,73546,362, 8643, 1230, 317, 317, 439, 476, 4253, 73548,73550,2117, 317, - 29917,381, 317, 73552,365, 29531,2110, 8926, 73556,317, 5836, 73557,7403, 2210, 73558,34426,73560,3242, 6207, 382, 1358, 73561,73562,490, 554, 343, 363, + 6834, 317, 5836, 53626,73544,6834, 25493,317, 317, 317, 20913,73545,2077, 10172,73546,362, 8643, 1230, 317, 317, 439, 476, 4253, 73548,73550,2117, 317, + 29917,381, 317, 73552,365, 29531,2110, 8926, 73556,317, 5836, 73557,7403, 2210, 73558,34426,73560,3242, 6207, 382, 1358, 73561,73562,490, 554, 343, 363, 41483,16146,8136, 466, 4952, 2510, 317, 317, 73564,73566,73567,73568,317, 73572,73573,554, 73575,25003,5619, 5570, 343, 5809, 73569,73571,554, 3611, 10936, - 73570,317, 54450,390, 380, 381, 351, 73574,1329, 2108, 73576,317, 317, 73577,73579,73584,73585,73589,73591,73593,73594,11344,73600,350, 73604,317, 2845, - 73607,332, 450, 61303,73580,73581,73582,73583,3284, 450, 73586,317, 5217, 2094, 3284, 450, 73587,73588,6967, 73590,35443,9914, 48906,450, 16910,490, 317, - 73592,317, 362, 317, 73595,73597,2208, 317, 73596,317, 5897, 350, 317, 356, 11640,73598,73599,73601,73602,574, 2261, 48906,73603,73605,45868,363, 370, - 350, 1588, 73606,6967, 317, 1444, 317, 47792,12696,362, 73609,73612,73613,73616,73618,73619,73632,317, 73633,73635,73636,350, 317, 2631, 317, 52647,317, - 362, 317, 73610,490, 5217, 73611,6656, 2110, 2107, 350, 370, 73614,317, 20909,73615,365, 1020, 317, 5055, 3284, 317, 490, 332, 5836, 73617,39719,351, - 351, 363, 73620,73623,73630,73631,317, 73621,5226, 428, 73622,317, 317, 345, 370, 32491,5717, 317, 73624,317, 683, 22650,5463, 633, 317, 12447,428, - 16112,73625,73626,428, 73627,1444, 73628,73629,5037, 412, 6598, 551, 4476, 428, 439, 363, 381, 381, 2261, 554, 363, 6332, 363, 382, 42666,363, 406, - 73634,351, 404, 5727, 428, 428, 605, 578, 404, 355, 466, 428, 949, 320, 73638,73639,73643,73645,7214, 73659,73663,73665,73666,73667,12448,73668,5428, - 73675,73679,73686,1060, 1230, 7114, 73640,554, 6354, 2584, 73641,2035, 12864,73642,5487, 381, 317, 73644,412, 1060, 73646,73650,73651,8223, 73654,511, 362, - 73656,6601, 73657,73658,317, 1347, 380, 4952, 73647,73648,73649,24310,6704, 317, 317, 72174,317, 4949, 355, 4949, 317, 363, 380, 73652,317, 3361, 317, - 73653,18460,14251,363, 73655,317, 545, 18840,543, 70072,73660,551, 73661,73662,73664,365, 57791,30782,356, 351, 490, 317, 24903,6780, 11612,439, 476, - 17842,4925, 73669,73671,7976, 490, 73670,317, 6228, 317, 317, 73672,73673,73674,6195, 370, 9695, 370, 73676,73677,73678,31380,73680,73681,9162, 73684,365, - 6420, 2272, 73682,73683,351, 73685,2053, 448, 2026, 590, 19872,73688,317, 9185, 7495, 46954,6855, 73689,73690,42243,1428, 539, 22912,73789,73810,73691,1266, - 1160, 1000, 317, 317, 317, 633, 73692,73694,73696,73722,73725,73726,73732,73736,73744,9657, 54189,73754,73755,73762,73767,73768,73771,73784,393, 73786,1871, + 73570,317, 54450,390, 380, 381, 351, 73574,1329, 2108, 73576,317, 317, 73577,73579,73584,73585,73589,73591,73593,73594,11344,73600,350, 73604,317, 2845, + 73607,332, 450, 61303,73580,73581,73582,73583,3284, 450, 73586,317, 5217, 2094, 3284, 450, 73587,73588,6967, 73590,35443,9914, 48906,450, 16910,490, 317, + 73592,317, 362, 317, 73595,73597,2208, 317, 73596,317, 5897, 350, 317, 356, 11640,73598,73599,73601,73602,574, 2261, 48906,73603,73605,45868,363, 370, + 350, 1588, 73606,6967, 317, 1444, 317, 47792,12696,362, 73609,73612,73613,73616,73618,73619,73632,317, 73633,73635,73636,350, 317, 2631, 317, 52647,317, + 362, 317, 73610,490, 5217, 73611,6656, 2110, 2107, 350, 370, 73614,317, 20909,73615,365, 1020, 317, 5055, 3284, 317, 490, 332, 5836, 73617,39719,351, + 351, 363, 73620,73623,73630,73631,317, 73621,5226, 428, 73622,317, 317, 345, 370, 32491,5717, 317, 73624,317, 683, 22650,5463, 633, 317, 12447,428, + 16112,73625,73626,428, 73627,1444, 73628,73629,5037, 412, 6598, 551, 4476, 428, 439, 363, 381, 381, 2261, 554, 363, 6332, 363, 382, 42666,363, 406, + 73634,351, 404, 5727, 428, 428, 605, 578, 404, 355, 466, 428, 949, 320, 73638,73639,73643,73645,7214, 73659,73663,73665,73666,73667,12448,73668,5428, + 73675,73679,73686,1060, 1230, 7114, 73640,554, 6354, 2584, 73641,2035, 12864,73642,5487, 381, 317, 73644,412, 1060, 73646,73650,73651,8223, 73654,511, 362, + 73656,6601, 73657,73658,317, 1347, 380, 4952, 73647,73648,73649,24310,6704, 317, 317, 72174,317, 4949, 355, 4949, 317, 363, 380, 73652,317, 3361, 317, + 73653,18460,14251,363, 73655,317, 545, 18840,543, 70072,73660,551, 73661,73662,73664,365, 57791,30782,356, 351, 490, 317, 24903,6780, 11612,439, 476, + 17842,4925, 73669,73671,7976, 490, 73670,317, 6228, 317, 317, 73672,73673,73674,6195, 370, 9695, 370, 73676,73677,73678,31380,73680,73681,9162, 73684,365, + 6420, 2272, 73682,73683,351, 73685,2053, 448, 2026, 590, 19872,73688,317, 9185, 7495, 46954,6855, 73689,73690,42243,1428, 539, 22912,73789,73810,73691,1266, + 1160, 1000, 317, 317, 317, 633, 73692,73694,73696,73722,73725,73726,73732,73736,73744,9657, 54189,73754,73755,73762,73767,73768,73771,73784,393, 73786,1871, 317, 73693,5447, 343, 21123,370, 73695,345, 73697,73698,73703,73707,73710,73711,73721,1060, 4564, 73699,73700,73701,73702,317, 73704,73705,73706,73708,73709, - 4591, 427, 73712,73713,73715,317, 73720,515, 73714,73716,41064,73717,73718,73719,60316,2510, 519, 476, 73723,10257,6894, 73724,343, 2222, 317, 332, 3967, + 4591, 427, 73712,73713,73715,317, 73720,515, 73714,73716,41064,73717,73718,73719,60316,2510, 519, 476, 73723,10257,6894, 73724,343, 2222, 317, 332, 3967, 73727,73728,73729,73731,343, 439, 73359,381, 30039,511, 73730,317, 73733,73734,4267, 5105, 73735,2705, 73737,73741,73743,73738,73739,73740,73742,317, 33557, - 73745,73746,73753,73747,73748,73749,73750,73751,466, 317, 73752,6021, 1347, 47505,19790,6551, 73756,4984, 2211, 73760,317, 317, 73757,73758,73759,21006,317, - 1266, 317, 8301, 36631,8049, 73761,317, 73763,73764,73765,41938,3505, 317, 73766,566, 2260, 73769,465, 73770,20711,5763, 73772,63194,73773,73776,73783,5717, + 73745,73746,73753,73747,73748,73749,73750,73751,466, 317, 73752,6021, 1347, 47505,19790,6551, 73756,4984, 2211, 73760,317, 317, 73757,73758,73759,21006,317, + 1266, 317, 8301, 36631,8049, 73761,317, 73763,73764,73765,41938,3505, 317, 73766,566, 2260, 73769,465, 73770,20711,5763, 73772,63194,73773,73776,73783,5717, 7689, 317, 317, 73774,1999, 73775,73777,73778,73780,73781,73779,73782,2280, 356, 73785,8100, 73787,32377,73788,5447, 5987, 22021,317, 73790,73792,73800,73806, 73791,8566, 73793,73799,2184, 317, 73794,73795,73796,73797,73798,356, 466, 317, 31068,8020, 73801,73803,73802,317, 10422,5395, 317, 7372, 73804,382, 73805, - 404, 30314,73807,73808,73809,5464, 9130, 2510, 73811,73813,73816,317, 317, 73812,456, 317, 381, 73814,2368, 73815,5477, 317, 427, 73818,73820,73821,554, - 73824,73828,73835,73837,29321,29906,73841,73842,20956,73846,73847,73851,2654, 7565, 73865,6471, 73871,6964, 343, 317, 317, 73819,357, 317, 6674, 46591,2067, - 73822,3664, 73823,2609, 370, 73825,73826,73827,2110, 1606, 73829,73831,5459, 73832,73833,73834,73830,5447, 466, 4266, 317, 15196,498, 35725,73836,72702,2271, + 404, 30314,73807,73808,73809,5464, 9130, 2510, 73811,73813,73816,317, 317, 73812,456, 317, 381, 73814,2368, 73815,5477, 317, 427, 73818,73820,73821,554, + 73824,73828,73835,73837,29321,29906,73841,73842,20956,73846,73847,73851,2654, 7565, 73865,6471, 73871,6964, 343, 317, 317, 73819,357, 317, 6674, 46591,2067, + 73822,3664, 73823,2609, 370, 73825,73826,73827,2110, 1606, 73829,73831,5459, 73832,73833,73834,73830,5447, 466, 4266, 317, 15196,498, 35725,73836,72702,2271, 22578,317, 5055, 5201, 317, 5570, 38244,380, 6763, 73838,490, 490, 73839,350, 73840,4984, 73843,73844,7892, 9832, 73845,17239,9052, 73848,34396,73849,73850, 73852,73853,7368, 73861,317, 73854,380, 73856,73858,10820,317, 73855,370, 73857,73859,73860,73862,73864,73863,2369, 73866,73868,73867,21801,317, 73869,73870, - 5447, 466, 39546,5457, 60228,73872,73873,73875,73878,317, 73881,73882,73884,47480,73885,73887,73888,73897,73903,73904,73909,317, 14561,317, 73876,317, 633, - 317, 317, 363, 73877,317, 317, 4925, 1160, 73879,73880,45954,490, 390, 73883,332, 2035, 370, 24137,317, 363, 73886,1044, 382, 317, 73889,73893,7988, + 5447, 466, 39546,5457, 60228,73872,73873,73875,73878,317, 73881,73882,73884,47480,73885,73887,73888,73897,73903,73904,73909,317, 14561,317, 73876,317, 633, + 317, 317, 363, 73877,317, 317, 4925, 1160, 73879,73880,45954,490, 390, 73883,332, 2035, 370, 24137,317, 363, 73886,1044, 382, 317, 73889,73893,7988, 73890,73891,73892,24530,5054, 448, 73894,73895,73896,1347, 6670, 73898,73899,73900,73901,73902,316, 12291,362, 2310, 73905,73908,6704, 73906,404, 317, 73907, - 343, 490, 41483,5991, 466, 3854, 317, 23092,590, 73911,6547, 1020, 73912,73915,73916,4591, 73917,4965, 73919,6849, 73920,73922,73923,7850, 317, 39046,351, + 343, 490, 41483,5991, 466, 3854, 317, 23092,590, 73911,6547, 1020, 73912,73915,73916,4591, 73917,4965, 73919,6849, 73920,73922,73923,7850, 317, 39046,351, 73913,3529, 73914,7911, 39357,317, 73918,3529, 317, 73921,10476,2156, 363, 317, 380, 317, 11473,73924,73925,73926,73927,73929,490, 73934,317, 490, 73930, 73931,73932,73933,574, 8281, 73936,363, 3284, 73937,73938,73939,343, 73940,73941,2845, 15837,73945,433, 73947,589, 73951,4064, 466, 73952,1059, 590, 73946, 539, 73948,574, 73949,73950,73953,73955,73961,73983,73987,13434,73990,73991,73956,73957,73958,73959,317, 6834, 343, 371, 73960,63759,317, 31987,317, 19390, 363, 2381, 73962,73963,73974,73976,427, 73964,13457,73965,73966,73968,19283,501, 73967,73967,363, 73969,363, 73972,404, 317, 73970,73971,73973,970, 73975, 9067, 343, 26934,2705, 73977,7785, 73979,73980,73982,317, 949, 73978,73981,371, 1481, 15839,565, 73984,545, 73986,73985,73988,45213,73989,73992,74057,74099, - 74144,39147,74158,73993,73994,73996,73998,74000,6401, 74003,74005,74007,74011,74017,74024,74025,74038,74045,2219, 17745,74050,74056,317, 317, 6978, 317, 317, - 73995,8519, 73997,511, 73999,554, 551, 1549, 74001,1999, 74002,29424,317, 74004,36232,317, 1345, 11539,74006,1347, 74008,370, 74009,74010,356, 466, 317, + 74144,39147,74158,73993,73994,73996,73998,74000,6401, 74003,74005,74007,74011,74017,74024,74025,74038,74045,2219, 17745,74050,74056,317, 317, 6978, 317, 317, + 73995,8519, 73997,511, 73999,554, 551, 1549, 74001,1999, 74002,29424,317, 74004,36232,317, 1345, 11539,74006,1347, 74008,370, 74009,74010,356, 466, 317, 5005, 74012,317, 74016,317, 433, 365, 74013,74014,74015,5561, 356, 3599, 4952, 317, 317, 74018,5896, 74019,7490, 6036, 23019,5159, 74020,13269,37649,74021, - 74023,2391, 370, 7064, 19287,3999, 74022,371, 12062,332, 350, 363, 490, 317, 5363, 317, 74026,74027,317, 370, 13387,5273, 24664,16302,317, 74028,1060, + 74023,2391, 370, 7064, 19287,3999, 74022,371, 12062,332, 350, 363, 490, 317, 5363, 317, 74026,74027,317, 370, 13387,5273, 24664,16302,317, 74028,1060, 317, 74029,2022, 385, 317, 74030,74032,2171, 385, 317, 74031,74033,74034,2323, 7192, 45287,24775,5105, 74035,74036,74036,74037,370, 74039,74043,74040,74041, - 74042,74044,74046,1077, 371, 74047,317, 25114,362, 74048,74049,3987, 365, 5809, 74051,356, 466, 45759,74055,74052,74053,74054,74058,1453, 74068,74072,7582, + 74042,74044,74046,1077, 371, 74047,317, 25114,362, 74048,74049,3987, 365, 5809, 74051,356, 466, 45759,74055,74052,74053,74054,74058,1453, 74068,74072,7582, 350, 2381, 74087,74089,317, 74091,34948,74093,20117,74096,363, 2022, 2568, 5661, 74059,74065,5661, 74060,74062,74061,317, 15540,74061,317, 74063,74064,10422, - 9624, 3999, 11236,50639,74066,317, 317, 74067,39003,6736, 317, 5896, 74069,389, 4962, 363, 74070,317, 317, 74071,437, 381, 5661, 317, 54582,74073,8506, - 370, 74075,22079,2510, 466, 74074,34862,317, 14773,476, 74076,74077,74079,4249, 74081,74084,22591,362, 36225,363, 74085,2222, 317, 839, 74086,1160, 370, + 9624, 3999, 11236,50639,74066,317, 317, 74067,39003,6736, 317, 5896, 74069,389, 4962, 363, 74070,317, 317, 74071,437, 381, 5661, 317, 54582,74073,8506, + 370, 74075,22079,2510, 466, 74074,34862,317, 14773,476, 74076,74077,74079,4249, 74081,74084,22591,362, 36225,363, 74085,2222, 317, 839, 74086,1160, 370, 47840,74078,74080,317, 381, 74082,74083,23436,1992, 1109, 40892,349, 2063, 74088,317, 1135, 332, 370, 5159, 10876,74090,45995,6831, 370, 317, 351, 57681, - 74092,363, 2134, 74094,5441, 74095,371, 74097,554, 317, 317, 74098,74100,74102,74104,74106,74116,74119,5159, 74121,74123,74126,5441, 74131,74132,74134,2134, - 74143,74101,36232,74103,551, 551, 351, 7734, 317, 49269,74105,1020, 74107,74108,74109,74111,74110,12931,317, 74112,74113,45914,74114,74115,74117,317, 370, + 74092,363, 2134, 74094,5441, 74095,371, 74097,554, 317, 317, 74098,74100,74102,74104,74106,74116,74119,5159, 74121,74123,74126,5441, 74131,74132,74134,2134, + 74143,74101,36232,74103,551, 551, 351, 7734, 317, 49269,74105,1020, 74107,74108,74109,74111,74110,12931,317, 74112,74113,45914,74114,74115,74117,317, 370, 74118,317, 1999, 21274,74120,351, 74122,12142,466, 317, 4477, 74124,74125,12429,15646,41962,10011,74127,74129,2024, 74130,317, 5661, 404, 4980, 428, 74128, 71284,8035, 380, 450, 317, 2024, 5159, 2067, 317, 317, 2758, 46858,3999, 6917, 317, 7261, 1347, 32485,2317, 2222, 74133,14410,317, 5022, 10928,16535,74135, 74140,74142,74136,410, 74137,74138,11716,12429,466, 362, 541, 5961, 7942, 550, 317, 74139,317, 74141,363, 74145,19872,74146,2219, 74147,74149,74150,74152, - 74153,350, 74148,2184, 74151,390, 74154,317, 317, 6228, 43110,11038,74155,74156,74157,363, 1033, 1998, 350, 74160,605, 74161,74162,74167,74170,74173,370, + 74153,350, 74148,2184, 74151,390, 74154,317, 317, 6228, 43110,11038,74155,74156,74157,363, 1033, 1998, 350, 74160,605, 74161,74162,74167,74170,74173,370, 74174,74175,74190,74222,74272,74273,74275,74283,74298,74299,74300,74303,393, 1999, 19565,343, 74163,490, 74164,74165,74166,74168,317, 7035, 74169,543, 19544, 74171,605, 74172,351, 317, 317, 317, 8346, 6847, 1347, 345, 2110, 8178, 351, 351, 539, 74176,565, 2022, 390, 317, 74182,5241, 74177,74180,74181,74178, 448, 74179,2156, 345, 74183,74185,74188,363, 74184,2279, 317, 74186,74187,4965, 614, 74189,317, 5482, 317, 317, 6704, 317, 74191,74193,17019,5537, 74200, 74201,74206,74208,317, 74192,3284, 7892, 74194,74196,363, 74195,4268, 2163, 8231, 74197,74198,10254,317, 6172, 74199,5717, 5447, 466, 317, 1347, 9528, 74202, 3124, 317, 74203,74204,74205,317, 74207,343, 649, 74209,74214,74218,74219,404, 74221,74210,74211,401, 74212,74213,317, 345, 73706,24577,74215,5652, 74216, - 74217,317, 74220,74223,74232,74240,74248,74254,10946,74255,74263,74224,13638,317, 74225,74231,74226,2156, 401, 74227,74228,74229,74230,356, 74233,466, 2271, + 74217,317, 74220,74223,74232,74240,74248,74254,10946,74255,74263,74224,13638,317, 74225,74231,74226,2156, 401, 74227,74228,74229,74230,356, 74233,466, 2271, 43065,74238,74239,356, 466, 74234,74235,21137,74236,13338,74237,7834, 317, 5459, 7888, 10674,74241,74243,6165, 74242,74244,74245,74246,74247,74249,74252,74250, 74251,317, 74253,345, 317, 362, 74256,74257,74260,74261,14799,380, 339, 11560,317, 74258,74259,8557, 7834, 317, 317, 34487,401, 74262,74264,74267,74265, 317, 74266,393, 74268,490, 2503, 317, 11786,74269,74271,345, 74270,74080,8139, 393, 6171, 74274,46637,3505, 3505, 551, 2510, 8304, 363, 74276,74277,74278, - 5241, 74281,74282,4976, 6736, 489, 317, 381, 74279,74280,490, 74284,74286,362, 7892, 74287,363, 74285,13920,317, 74288,74297,74289,74290,6996, 320, 649, + 5241, 74281,74282,4976, 6736, 489, 317, 381, 74279,74280,490, 74284,74286,362, 7892, 74287,363, 74285,13920,317, 74288,74297,74289,74290,6996, 320, 649, 74291,317, 7222, 74294,317, 74292,74293,6172, 1526, 74295,74296,883, 365, 74301,74302,6046, 6831, 971, 74304,74306,74319,74329,74347,74351,74352,74353,74354, - 74356,74361,741, 74362,74368,74371,74307,74309,370, 74310,74313,74316,2322, 971, 1108, 74318,381, 11280,74308,61544,74311,74312,371, 74314,317, 74315,317, + 74356,74361,741, 74362,74368,74371,74307,74309,370, 74310,74313,74316,2322, 971, 1108, 74318,381, 11280,74308,61544,74311,74312,371, 74314,317, 74315,317, 74317,13638,565, 74320,74321,17471,74328,28124,74322,74323,74326,74324,13638,74325,371, 23651,3284, 74327,2203, 5570, 74330,1526, 74332,380, 74339,74340,74341, - 332, 74344,74345,74331,40718,362, 74333,2381, 370, 74334,74335,74336,74337,74338,3751, 317, 1020, 2074, 5623, 350, 28068,74342,74343,74346,74348,74349,565, + 332, 74344,74345,74331,40718,362, 74333,2381, 370, 74334,74335,74336,74337,74338,3751, 317, 1020, 2074, 5623, 350, 28068,74342,74343,74346,74348,74349,565, 74350,27053,356, 29654,42843,61726,3007, 74355,11831,5793, 74357,74358,11346,33238,317, 17856,9696, 74359,74360,371, 27913,18849,390, 2631, 74363,74365,74367, 74364,74366,370, 3284, 23524,6388, 348, 28341,74369,5891, 74370,45033,74372,74374,74377,13638,74378,74373,74375,8295, 13638,33549,2381, 74376,74379,74381,74382, 74385,74388,74396,74399,74402,272, 74857,74862,74868,273, 75357,274, 276, 76044,76049,76057,76068,76074,277, 76503,278, 77109,77171,282, 77409,77423,77482, 77483,77545,74380,6332, 6964, 74383,74384,365, 74386,74387,74389,74393,74390,74391,74392,74394,74395,74397,74398,74400,74401,74403,74404,74406,74407,74443,74462, - 74474,74479,74485,74501,74506,74527,74531,74552,74595,74636,74693,74697,74705,74706,74767,74781,74801,74814,74825,74832,74843,74852,74405,533, 343, 317, 2035, + 74474,74479,74485,74501,74506,74527,74531,74552,74595,74636,74693,74697,74705,74706,74767,74781,74801,74814,74825,74832,74843,74852,74405,533, 343, 317, 2035, 74408,74412,74414,74420,74427,74435,74437,317, 74439,16915,317, 317, 19720,74409,9454, 74410,5392, 6283, 74411,490, 317, 490, 34257,74413,511, 74415,17760, 74416,3284, 74417,373, 74418,74419,363, 348, 74421,6002, 74425,74426,74422,74423,74424,2381, 2381, 74428,74429,7328, 490, 382, 317, 5761, 317, 74430,11144, 74431,317, 31023,317, 74433,74434,14062,74432,2004, 381, 1358, 1347, 74436,74438,363, 2368, 2035, 74440,74442,74441,317, 30478,74444,74445,74447,370, 74449, 74452,74454,74456,74457,74458,317, 74459,2073, 317, 7149, 404, 490, 74446,7567, 11669,74448,380, 7408, 12329,74450,62267,74451,9702, 6900, 18281,490, 15752, 363, 74453,370, 63562,74455,20497,21186,317, 317, 317, 317, 317, 11962,3987, 490, 8470, 9422, 1160, 379, 74460,74461,343, 5701, 362, 317, 74463,19922, 74464,74465,74466,382, 74467,2584, 74468,74472,317, 2108, 5439, 332, 21094,370, 490, 317, 393, 23524,363, 74469,74470,74471,74473,1453, 74475,332, 74476, - 40898,74477,74478,2178, 74480,74481,2715, 6532, 7428, 74483,74484,5022, 317, 2178, 74482,1160, 74486,74489,317, 74491,74493,74494,362, 1588, 317, 74500,362, - 490, 490, 74487,365, 22786,74488,74490,1999, 74492,466, 7408, 363, 7408, 317, 74495,74496,74499,343, 74497,2210, 365, 5241, 74498,2078, 317, 382, 490, - 317, 317, 6334, 74502,74503,10305,74505,5022, 3361, 317, 1109, 26867,74504,6420, 490, 317, 74507,74508,2178, 74510,490, 332, 74511,332, 74513,74518,317, - 74520,490, 74521,74523,74525,19258,74526,74509,74512,1194, 66451,2413, 9695, 10877,74514,6013, 74516,74517,56831,74515,22560,363, 18941,9298, 5087, 1020, 4984, - 317, 317, 74519,365, 5991, 351, 363, 365, 466, 74522,363, 74524,317, 317, 317, 466, 8216, 317, 317, 589, 466, 317, 74528,19157,74530,74529,490, + 40898,74477,74478,2178, 74480,74481,2715, 6532, 7428, 74483,74484,5022, 317, 2178, 74482,1160, 74486,74489,317, 74491,74493,74494,362, 1588, 317, 74500,362, + 490, 490, 74487,365, 22786,74488,74490,1999, 74492,466, 7408, 363, 7408, 317, 74495,74496,74499,343, 74497,2210, 365, 5241, 74498,2078, 317, 382, 490, + 317, 317, 6334, 74502,74503,10305,74505,5022, 3361, 317, 1109, 26867,74504,6420, 490, 317, 74507,74508,2178, 74510,490, 332, 74511,332, 74513,74518,317, + 74520,490, 74521,74523,74525,19258,74526,74509,74512,1194, 66451,2413, 9695, 10877,74514,6013, 74516,74517,56831,74515,22560,363, 18941,9298, 5087, 1020, 4984, + 317, 317, 74519,365, 5991, 351, 363, 365, 466, 74522,363, 74524,317, 317, 317, 466, 8216, 317, 317, 589, 466, 317, 74528,19157,74530,74529,490, 365, 3966, 317, 2035, 527, 74532,74541,381, 74549,74550,43385,74551,20592,490, 365, 74533,317, 5439, 490, 74534,74535,9174, 74536,74538,490, 4186, 74540, 6851, 867, 11485,2272, 74537,3284, 74539,2576, 3284, 1162, 35182,14062,74542,3031, 74543,5223, 74544,53354,74545,25135,74546,74548,11388,317, 15942,317, 11485, 2322, 2110, 11434,381, 2509, 74547,37402,9649, 17760,490, 27477,74553,74560,74562,2146, 74563,2024, 74566,10928,74567,74570,74574,74585,74588,74590,74591,74592, - 74593,370, 565, 74594,381, 5173, 490, 44788,317, 74554,382, 74559,9174, 317, 7514, 39655,74555,74557,317, 74556,317, 490, 38507,74558,1999, 74561,1999, - 317, 317, 2117, 427, 317, 74564,6179, 4925, 74565,356, 5570, 2571, 317, 74568,6600, 27851,8384, 51426,362, 74569,1459, 8100, 490, 350, 5419, 673, 4788, + 74593,370, 565, 74594,381, 5173, 490, 44788,317, 74554,382, 74559,9174, 317, 7514, 39655,74555,74557,317, 74556,317, 490, 38507,74558,1999, 74561,1999, + 317, 317, 2117, 427, 317, 74564,6179, 4925, 74565,356, 5570, 2571, 317, 74568,6600, 27851,8384, 51426,362, 74569,1459, 8100, 490, 350, 5419, 673, 4788, 1194, 10422,74571,74572,74573,317, 1347, 8977, 2402, 3075, 12303,2060, 74575,8301, 74577,74579,74580,74581,22370,74583,74584,26033,74576,471, 39198,381, 57713, - 6179, 317, 317, 6551, 5570, 5223, 74578,381, 381, 53506,5872, 370, 490, 5447, 363, 317, 74582,2533, 332, 332, 466, 16466,74586,74587,74589,317, 317, + 6179, 317, 317, 6551, 5570, 5223, 74578,381, 381, 53506,5872, 370, 490, 5447, 363, 317, 74582,2533, 332, 332, 466, 16466,74586,74587,74589,317, 317, 317, 22232,317, 15770,490, 317, 74596,74607,74614,74617,1020, 9909, 74619,74621,74624,490, 74630,74631,74632,490, 74597,317, 365, 74599,74600,74601,74604, - 1459, 74605,332, 6901, 74598,317, 1347, 12494,74602,332, 74603,317, 5447, 371, 74606,74608,317, 501, 11607,74609,490, 74611,554, 5428, 317, 74610,8811, - 317, 6551, 74612,5033, 5570, 317, 74613,6486, 5328, 317, 317, 1481, 20219,490, 74615,74616,317, 317, 317, 31980,363, 74618,490, 317, 5611, 2012, 5120, + 1459, 74605,332, 6901, 74598,317, 1347, 12494,74602,332, 74603,317, 5447, 371, 74606,74608,317, 501, 11607,74609,490, 74611,554, 5428, 317, 74610,8811, + 317, 6551, 74612,5033, 5570, 317, 74613,6486, 5328, 317, 317, 1481, 20219,490, 74615,74616,317, 317, 317, 31980,363, 74618,490, 317, 5611, 2012, 5120, 382, 317, 1459, 490, 74620,59909,45941,317, 1108, 6420, 370, 5611, 74622,74623,74625,74626,74627,74628,74629,1347, 5032, 2163, 490, 490, 351, 5810, 74633, - 74634,74635,74637,5896, 74639,74641,74644,380, 74650,317, 74666,74668,74669,18581,362, 74674,74681,74683,74685,74689,19303,74690,74691,343, 2509, 74638,6352, + 74634,74635,74637,5896, 74639,74641,74644,380, 74650,317, 74666,74668,74669,18581,362, 74674,74681,74683,74685,74689,19303,74690,74691,343, 2509, 74638,6352, 40281,490, 351, 74640,317, 5896, 74642,490, 4984, 490, 74643,317, 317, 317, 45938,1481, 1913, 74645,490, 490, 8948, 31433,74647,1459, 74649,74646,74648, 74651,74654,74657,74660,2022, 53775,74662,74664,74665,317, 74652,380, 74653,5439, 490, 362, 74655,74656,466, 6318, 362, 317, 373, 2510, 74658,74659,74661, 466, 317, 74663,317, 370, 490, 317, 317, 317, 74667,17871,29531,4591, 17760,40281,6901, 11388,317, 35710,466, 10894,2077, 74670,74672,362, 64218,74673, 2021, 317, 74671,418, 74675,74676,13369,74680,4591, 2541, 8023, 7399, 317, 8023, 343, 74677,74679,317, 74678,16552,4949, 317, 8022, 9575, 317, 365, 74682, - 9557, 380, 365, 2022, 74684,317, 74686,317, 5033, 4984, 74688,427, 74687,23949,58701,1700, 1347, 339, 5742, 365, 44394,6227, 1913, 5405, 12696,74692,362, - 11147,74694,29531,74696,317, 9186, 74695,5626, 317, 317, 74698,74699,5727, 74701,15732,385, 74702,11716,74704,317, 490, 596, 1078, 362, 317, 317, 317, + 9557, 380, 365, 2022, 74684,317, 74686,317, 5033, 4984, 74688,427, 74687,23949,58701,1700, 1347, 339, 5742, 365, 44394,6227, 1913, 5405, 12696,74692,362, + 11147,74694,29531,74696,317, 9186, 74695,5626, 317, 317, 74698,74699,5727, 74701,15732,385, 74702,11716,74704,317, 490, 596, 1078, 362, 317, 317, 317, 5273, 74700,12987,4984, 490, 10878,10832,1347, 69935,74703,23372,317, 317, 317, 2568, 13427,317, 356, 74707,74719,74722,74725,74728,74733,74735,490, 74737, 74740,74741,74742,74746,74747,74748,74751,74757,74758,74764,74765,7688, 363, 74766,74708,332, 74710,74712,2142, 74713,18794,74717,5266, 490, 317, 404, 74709, 52647,8766, 74711,3284, 74714,2317, 74715,5687, 5570, 317, 74716,74718,7116, 883, 553, 332, 16278,74720,381, 74721,60693,380, 381, 317, 317, 317, 74723, 74724,317, 317, 1383, 2571, 317, 1160, 317, 317, 74726,74727,1160, 74729,74731,1030, 74730,74732,74734,74736,490, 4925, 317, 317, 1109, 4984, 74738,58323, 74739,345, 339, 61207,466, 605, 404, 2053, 370, 351, 74743,74744,74745,396, 536, 332, 11198,17637,370, 2022, 363, 317, 74749,74750,74752,74754,74756, - 317, 36081,25501,74753,317, 345, 317, 74755,7035, 363, 382, 317, 380, 6944, 11928,365, 345, 74759,4965, 1914, 37821,317, 74763,584, 74760,14132,1347, - 11596,74761,74762,317, 351, 8766, 317, 351, 6002, 28514,490, 370, 74768,2510, 74770,490, 74772,350, 74773,74775,74778,427, 74769,15515,350, 350, 8446, - 74771,5624, 3854, 362, 317, 490, 490, 332, 34987,25077,466, 19922,317, 74774,74776,71687,74777,32924,74779,58200,317, 317, 74780,317, 317, 10891,2571, - 317, 317, 317, 74782,35155,74784,343, 554, 74787,9702, 74788,362, 543, 74789,6849, 74790,74793,74800,49023,365, 1481, 74783,317, 6002, 490, 47253,317, + 317, 36081,25501,74753,317, 345, 317, 74755,7035, 363, 382, 317, 380, 6944, 11928,365, 345, 74759,4965, 1914, 37821,317, 74763,584, 74760,14132,1347, + 11596,74761,74762,317, 351, 8766, 317, 351, 6002, 28514,490, 370, 74768,2510, 74770,490, 74772,350, 74773,74775,74778,427, 74769,15515,350, 350, 8446, + 74771,5624, 3854, 362, 317, 490, 490, 332, 34987,25077,466, 19922,317, 74774,74776,71687,74777,32924,74779,58200,317, 317, 74780,317, 317, 10891,2571, + 317, 317, 317, 74782,35155,74784,343, 554, 74787,9702, 74788,362, 543, 74789,6849, 74790,74793,74800,49023,365, 1481, 74783,317, 6002, 490, 47253,317, 317, 74785,317, 74786,8926, 24316,317, 317, 9174, 8431, 5223, 74791,390, 74792,6834, 365, 332, 317, 490, 490, 74794,74796,343, 543, 74799,2058, 74795, 74797,356, 74798,4563, 543, 2178, 74802,74803,49364,37126,471, 74804,74805,9483, 74806,74808,74809,1020, 2233, 12920,24038,558, 362, 317, 558, 362, 19953, - 36075,345, 490, 74807,16157,317, 6050, 6551, 5120, 8600, 10081,382, 6651, 74810,637, 74813,74811,74812,74815,74817,74821,74822,6651, 5611, 50766,74816,2381, - 9937, 74818,317, 74819,74820,317, 351, 7490, 317, 5538, 490, 13124,74823,363, 74824,7273, 7386, 2537, 74826,448, 63762,5087, 5105, 74828,74830,74827,317, - 6021, 74829,74831,14217,74833,5464, 74834,362, 74838,11615,345, 74835,74836,466, 490, 382, 317, 7405, 74837,74839,74840,74841,74842,317, 7223, 345, 4268, - 74844,13338,4591, 367, 74845,74849,490, 4965, 74851,1230, 1597, 12696,351, 74846,317, 74847,637, 8248, 317, 317, 317, 317, 74848,7941, 74850,363, 351, + 36075,345, 490, 74807,16157,317, 6050, 6551, 5120, 8600, 10081,382, 6651, 74810,637, 74813,74811,74812,74815,74817,74821,74822,6651, 5611, 50766,74816,2381, + 9937, 74818,317, 74819,74820,317, 351, 7490, 317, 5538, 490, 13124,74823,363, 74824,7273, 7386, 2537, 74826,448, 63762,5087, 5105, 74828,74830,74827,317, + 6021, 74829,74831,14217,74833,5464, 74834,362, 74838,11615,345, 74835,74836,466, 490, 382, 317, 7405, 74837,74839,74840,74841,74842,317, 7223, 345, 4268, + 74844,13338,4591, 367, 74845,74849,490, 4965, 74851,1230, 1597, 12696,351, 74846,317, 74847,637, 8248, 317, 317, 317, 317, 74848,7941, 74850,363, 351, 317, 2261, 363, 949, 317, 48319,74853,74854,74856,353, 7334, 3987, 74855,2110, 351, 343, 362, 317, 1108, 74858,565, 74859,74860,16898,14549,1351, 74861, 15196,367, 345, 356, 74863,74865,74867,339, 2328, 74864,74866,44909,5624, 2162, 74869,74873,490, 345, 74879,74870,74871,74872,74874,74876,74875,74877,74878, 74880,396, 74881,74882,74883,74904,74906,74937,74945,74956,74961,74968,74975,74992,74996,75006,75092,75132,75186,75193,75201,75205,75282,75310,75333,75339,75342, - 75346,52812,75356,74884,74885,74886,74889,74890,74892,5020, 74893,74894,74896,74897,965, 74898,74900,74902,74887,1060, 74888,10877,362, 385, 490, 14425,317, + 75346,52812,75356,74884,74885,74886,74889,74890,74892,5020, 74893,74894,74896,74897,965, 74898,74900,74902,74887,1060, 74888,10877,362, 385, 490, 14425,317, 317, 74891,351, 343, 2156, 339, 4965, 317, 316, 393, 5991, 466, 17856,6275, 74895,14558,12423,19187,381, 74899,317, 10891,3999, 317, 317, 6195, 74901, 466, 2022, 6348, 350, 317, 343, 1347, 317, 351, 2060, 351, 74903,317, 6036, 74905,10471,5926, 21241,381, 317, 574, 10609,74907,74923,490, 332, 74925, - 1347, 404, 74931,74933,317, 74908,74909,10487,317, 343, 362, 74910,317, 1044, 2272, 74911,74912,74915,74913,317, 363, 10376,2410, 74914,10373,2530, 317, + 1347, 404, 74931,74933,317, 74908,74909,10487,317, 343, 362, 74910,317, 1044, 2272, 74911,74912,74915,74913,317, 363, 10376,2410, 74914,10373,2530, 317, 317, 74916,74919,74917,74918,74920,74921,74922,317, 9313, 345, 4268, 9929, 74924,74926,74927,74928,74929,74930,74932,74934,74936,74935,317, 12429,74938,74942, 2024, 73709,74944,317, 351, 74939,74940,371, 1347, 5538, 6228, 317, 74941,317, 34320,74943,24756,332, 345, 343, 317, 71750,74946,1230, 74947,1358, 74948, - 74949,74953,317, 74954,74955,558, 317, 74950,6326, 8125, 4249, 2156, 7073, 74951,74952,317, 316, 385, 317, 1358, 2156, 6195, 2260, 490, 14537,2184, 2060, + 74949,74953,317, 74954,74955,558, 317, 74950,6326, 8125, 4249, 2156, 7073, 74951,74952,317, 316, 385, 317, 1358, 2156, 6195, 2260, 490, 14537,2184, 2060, 317, 317, 74957,74959,8014, 5737, 404, 74958,74960,317, 74891,74962,317, 350, 74964,74965,2222, 37220,74963,16186,74966,74967,1000, 74969,11505,2022, 74972, 8882, 74973,74970,490, 317, 74971,10058,971, 7785, 74974,74976,74978,74979,74981,74983,74985,74988,74990,74977,21274,66977,2402, 363, 49058,550, 74980,74982, 5896, 490, 74984,74986,74987,31433,9567, 1999, 5809, 74989,74991,74993,74995,4984, 74994,332, 317, 46796,867, 490, 16021,20909,74997,74998,13066,75000,75003, - 75005,490, 4045, 66324,74999,363, 75001,75002,75004,75007,75010,565, 75011,75073,501, 339, 75074,75075,75084,539, 75085,75088,75090,75091,75008,75009,350, - 9702, 380, 12668,317, 75012,11786,75023,75027,75032,75034,75041,75044,75046,75059,75065,75066,317, 75013,75015,370, 75017,75014,75016,75018,317, 75019,317, + 75005,490, 4045, 66324,74999,363, 75001,75002,75004,75007,75010,565, 75011,75073,501, 339, 75074,75075,75084,539, 75085,75088,75090,75091,75008,75009,350, + 9702, 380, 12668,317, 75012,11786,75023,75027,75032,75034,75041,75044,75046,75059,75065,75066,317, 75013,75015,370, 75017,75014,75016,75018,317, 75019,317, 75020,75021,75022,317, 13961,75024,75026,75025,363, 317, 317, 2280, 317, 317, 75028,75029,1347, 75030,75031,356, 339, 317, 317, 75033,427, 75035,75038, 75040,7062, 5425, 363, 75036,13956,75037,75039,448, 381, 75042,317, 75043,75045,69648,75047,75050,1230, 75053,75056,75048,75049,7222, 317, 317, 75051,75052, 332, 75054,75055,5225, 5991, 466, 317, 75057,3032, 75058,434, 75060,75063,75061,75062,75064,20320,404, 404, 4045, 75067,75070,40428,75068,75069,75071,75072, 317, 1325, 40866,1950, 351, 5022, 351, 551, 10580,427, 5126, 7711, 75076,75077,14501,317, 317, 6195, 75081,317, 8051, 8614, 317, 317, 332, 351, 75078, - 317, 317, 75079,75080,75082,317, 75083,4984, 316, 317, 317, 75086,317, 75087,16876,75089,605, 71567,590, 317, 6769, 75093,75094,75095,75096,1020, 343, + 317, 317, 75079,75080,75082,317, 75083,4984, 316, 317, 317, 75086,317, 75087,16876,75089,605, 71567,590, 317, 6769, 75093,75094,75095,75096,1020, 343, 75102,75108,75111,75131,3182, 34721,317, 971, 29104,317, 317, 9869, 490, 19237,521, 490, 75097,45119,75098,75099,75100,75101,317, 75103,75104,75105,75106, - 75107,2022, 596, 75109,75110,637, 5825, 390, 75112,2063, 36457,75119,75122,75126,317, 75130,345, 75113,75114,75117,5644, 404, 75115,356, 466, 2022, 317, + 75107,2022, 596, 75109,75110,637, 5825, 390, 75112,2063, 36457,75119,75122,75126,317, 75130,345, 75113,75114,75117,5644, 404, 75115,356, 466, 2022, 317, 25302,514, 75116,75118,317, 317, 5727, 75120,75121,363, 6420, 2156, 317, 362, 317, 317, 4980, 317, 75123,317, 75124,317, 5324, 75125,75127,75128,75129, - 5365, 356, 466, 2571, 332, 1020, 317, 75133,75136,75137,75138,75147,4982, 75157,75158,75162,2022, 490, 75164,75171,75177,1337, 75178,75180,75184,75185,373, - 31585,6607, 365, 2171, 21903,2537, 75134,75135,426, 4960, 11147,317, 12907,13187,490, 5120, 75139,75142,75144,20871,317, 75146,317, 26505,75140,356, 466, - 75141,2571, 317, 371, 75143,75145,75148,2086, 5399, 31433,75155,1459, 1347, 384, 75149,75150,5325, 75151,75152,75153,75154,533, 75156,317, 18406,501, 6834, + 5365, 356, 466, 2571, 332, 1020, 317, 75133,75136,75137,75138,75147,4982, 75157,75158,75162,2022, 490, 75164,75171,75177,1337, 75178,75180,75184,75185,373, + 31585,6607, 365, 2171, 21903,2537, 75134,75135,426, 4960, 11147,317, 12907,13187,490, 5120, 75139,75142,75144,20871,317, 75146,317, 26505,75140,356, 466, + 75141,2571, 317, 371, 75143,75145,75148,2086, 5399, 31433,75155,1459, 1347, 384, 75149,75150,5325, 75151,75152,75153,75154,533, 75156,317, 18406,501, 6834, 590, 317, 317, 543, 75159,75161,3529, 75160,396, 566, 5028, 75163,317, 2369, 75165,75169,4984, 7214, 381, 317, 75166,381, 317, 363, 75167,75168,15618, - 11533,75170,637, 5942, 320, 363, 75172,5295, 317, 75176,75173,75174,75175,317, 317, 332, 362, 7674, 345, 5158, 363, 345, 7919, 365, 75179,2022, 2510, + 11533,75170,637, 5942, 320, 363, 75172,5295, 317, 75176,75173,75174,75175,317, 317, 332, 362, 7674, 345, 5158, 363, 345, 7919, 365, 75179,2022, 2510, 343, 23411,75181,75182,1347, 404, 350, 317, 2155, 21834,317, 75183,501, 9624, 345, 4591, 9832, 490, 363, 351, 3999, 34607,75187,75188,317, 75189,75190, 75191,75192,2033, 332, 75194,350, 75195,356, 75198,75199,365, 75196,317, 75197,6036, 8991, 75200,317, 75202,317, 75203,17586,75204,75206,75210,75211,75215, - 75216,741, 75221,75224,343, 75226,75228,75229,75236,75239,75243,75246,75268,75273,11040,75276,75277,75281,10255,490, 75207,317, 75208,75209,3505, 44630,596, + 75216,741, 75221,75224,343, 75226,75228,75229,75236,75239,75243,75246,75268,75273,11040,75276,75277,75281,10255,490, 75207,317, 75208,75209,3505, 44630,596, 332, 6851, 476, 389, 75212,332, 2110, 317, 75213,5611, 317, 75214,1943, 21132,404, 317, 380, 9696, 75217,1481, 75219,9909, 343, 75218,1160, 317, 75220, - 490, 490, 75222,75223,11918,2272, 351, 7785, 11940,412, 490, 75225,490, 10898,75227,11146,8594, 4984, 75230,75231,317, 4591, 75232,5634, 75233,317, 317, + 490, 490, 75222,75223,11918,2272, 351, 7785, 11940,412, 490, 75225,490, 10898,75227,11146,8594, 4984, 75230,75231,317, 4591, 75232,5634, 75233,317, 317, 10252,345, 75234,75235,5447, 5113, 7419, 75237,6859, 317, 75238,317, 5033, 490, 370, 2317, 343, 75240,6602, 75241,75242,13905,75244,317, 75245,2110, 75247, - 75253,75257,75264,53775,317, 75248,317, 75249,5055, 380, 75250,12598,75251,75252,8419, 5447, 49995,7567, 343, 1347, 18387,26080,5197, 514, 332, 75254,381, - 317, 748, 317, 75255,75256,317, 363, 6020, 12461,75258,70114,317, 317, 75260,75259,2184, 7223, 5464, 75261,1588, 75262,75263,317, 351, 75265,75266,317, + 75253,75257,75264,53775,317, 75248,317, 75249,5055, 380, 75250,12598,75251,75252,8419, 5447, 49995,7567, 343, 1347, 18387,26080,5197, 514, 332, 75254,381, + 317, 748, 317, 75255,75256,317, 363, 6020, 12461,75258,70114,317, 317, 75260,75259,2184, 7223, 5464, 75261,1588, 75262,75263,317, 351, 75265,75266,317, 75267,317, 5250, 24322,75269,75271,75272,75270,990, 966, 75274,75275,568, 971, 345, 370, 75278,75279,75280,6615, 2219, 75283,75284,1109, 75286,75287,14865, - 2402, 75288,11921,75290,75294,75285,1347, 317, 351, 605, 75289,1160, 75291,75293,350, 16825,350, 10709,75292,10714,450, 7618, 350, 4965, 317, 317, 2171, - 637, 22090,6996, 317, 633, 75295,1526, 17063,75300,75302,75308,75309,5872, 317, 7651, 317, 75296,75297,365, 2146, 8218, 343, 5898, 75298,75299,317, 317, + 2402, 75288,11921,75290,75294,75285,1347, 317, 351, 605, 75289,1160, 75291,75293,350, 16825,350, 10709,75292,10714,450, 7618, 350, 4965, 317, 317, 2171, + 637, 22090,6996, 317, 633, 75295,1526, 17063,75300,75302,75308,75309,5872, 317, 7651, 317, 75296,75297,365, 2146, 8218, 343, 5898, 75298,75299,317, 317, 75301,317, 3361, 50480,30549,8281, 75303,75307,317, 317, 75304,75305,75306,317, 363, 6996, 320, 1020, 317, 7086, 75311,75312,75313,317, 17919,75316,75317, - 75328,75330,317, 75332,75314,345, 75315,543, 356, 466, 317, 1347, 362, 332, 75318,9320, 8569, 75327,75319,317, 75321,57489,10253,350, 75326,2108, 3505, - 75320,27416,460, 75322,75323,75324,75325,33017,6355, 75329,75331,75334,27022,75337,75335,75336,317, 9567, 75338,7911, 401, 75340,75341,5665, 1020, 343, 7698, + 75328,75330,317, 75332,75314,345, 75315,543, 356, 466, 317, 1347, 362, 332, 75318,9320, 8569, 75327,75319,317, 75321,57489,10253,350, 75326,2108, 3505, + 75320,27416,460, 75322,75323,75324,75325,33017,6355, 75329,75331,75334,27022,75337,75335,75336,317, 9567, 75338,7911, 401, 75340,75341,5665, 1020, 343, 7698, 10550,317, 317, 75343,20641,75344,2022, 75345,317, 5608, 365, 365, 38799,26034,2829, 2261, 75347,75350,75351,75352,1428, 75353,332, 490, 10375,75348,75349, - 6228, 6996, 317, 633, 8301, 317, 5055, 2146, 2110, 316, 7448, 2510, 75354,351, 404, 317, 75355,380, 21742,317, 371, 5570, 1444, 1481, 20835,75358,396, + 6228, 6996, 317, 633, 8301, 317, 5055, 2146, 2110, 316, 7448, 2510, 75354,351, 404, 317, 75355,380, 21742,317, 371, 5570, 1444, 1481, 20835,75358,396, 75361,75364,75366,75359,462, 75360,75362,75363,75365,75367,2585, 75368,67397,75424,275, 75563,371, 75623,75683,26076,75733,75764,75765,75767,75770,75369,75370, 75374,75376,75377,75378,75379,75380,75388,75397,317, 75414,75415,317, 75417,5223, 75420,5363, 2067, 75423,2222, 75371,23079,75372,2022, 2067, 2067, 75373,75375, - 363, 2551, 317, 317, 4965, 565, 1020, 351, 75381,5896, 6726, 7734, 75385,75387,5662, 1453, 40460,75382,75383,75384,6847, 75386,351, 741, 317, 345, 5663, - 365, 75389,75390,75396,75391,75395,2631, 2631, 75392,75393,75394,5241, 317, 11505,75398,75400,75401,75404,11040,75405,75407,345, 75411,75412,317, 75399,2086, - 75402,317, 75403,75406,356, 10891,2063, 466, 2571, 75408,317, 589, 75409,75410,75413,75416,388, 1358, 61665,2163, 75418,2208, 15440,317, 901, 56788,345, + 363, 2551, 317, 317, 4965, 565, 1020, 351, 75381,5896, 6726, 7734, 75385,75387,5662, 1453, 40460,75382,75383,75384,6847, 75386,351, 741, 317, 345, 5663, + 365, 75389,75390,75396,75391,75395,2631, 2631, 75392,75393,75394,5241, 317, 11505,75398,75400,75401,75404,11040,75405,75407,345, 75411,75412,317, 75399,2086, + 75402,317, 75403,75406,356, 10891,2063, 466, 2571, 75408,317, 589, 75409,75410,75413,75416,388, 1358, 61665,2163, 75418,2208, 15440,317, 901, 56788,345, 75419,490, 75421,75422,75425,75426,75431,75437,75445,75449,75450,75453,75458,75460,75463,75464,75466,75472,75479,75481,75510,75514,75540,75553,75555,75557,75558, - 75561,350, 380, 317, 356, 75427,316, 2510, 75428,1347, 75429,427, 75430,40847,317, 75432,75433,75435,75436,5653, 20641,75434,990, 5223, 390, 317, 1347, - 381, 18307,317, 384, 596, 367, 382, 345, 1347, 75438,11709,75443,23950,2402, 75444,75439,317, 75440,75441,75442,389, 5841, 381, 6713, 24867,75446,2024, + 75561,350, 380, 317, 356, 75427,316, 2510, 75428,1347, 75429,427, 75430,40847,317, 75432,75433,75435,75436,5653, 20641,75434,990, 5223, 390, 317, 1347, + 381, 18307,317, 384, 596, 367, 382, 345, 1347, 75438,11709,75443,23950,2402, 75444,75439,317, 75440,75441,75442,389, 5841, 381, 6713, 24867,75446,2024, 75447,6081, 75448,356, 317, 3361, 317, 317, 317, 1033, 990, 317, 362, 356, 40781,75451,75452,2077, 1347, 75454,9590, 27498,317, 75455,75456,637, 75457, 21303,371, 1060, 75459,75461,2222, 31413,1347, 75462,363, 317, 317, 401, 75465,1347, 2298, 13719,47847,75467,75469,363, 317, 11511,75471,543, 75468,75470, 317, 75473,5447, 75476,5224, 75478,371, 75474,6916, 75475,7222, 36133,382, 75477,75480,381, 6415, 317, 10538,75482,75485,75490,19665,75494,75500,75506,75509, 75483,75484,2330, 9922, 75486,75487,5411, 75488,317, 339, 75489,345, 25903,317, 317, 317, 75491,75492,75493,317, 5055, 9313, 1347, 75495,7360, 75496,75498, - 75499,75497,75501,75505,317, 1347, 75502,75503,75504,1347, 54292,5717, 75507,75508,75511,8047, 332, 75512,75513,75515,75519,75526,75527,75537,75538,490, 9644, - 345, 75516,317, 75518,75517,60645,3605, 317, 75520,38566,370, 1347, 75521,363, 1020, 47341,75522,332, 75525,2553, 317, 380, 343, 317, 343, 11648,426, + 75499,75497,75501,75505,317, 1347, 75502,75503,75504,1347, 54292,5717, 75507,75508,75511,8047, 332, 75512,75513,75515,75519,75526,75527,75537,75538,490, 9644, + 345, 75516,317, 75518,75517,60645,3605, 317, 75520,38566,370, 1347, 75521,363, 1020, 47341,75522,332, 75525,2553, 317, 380, 343, 317, 343, 11648,426, 1160, 317, 75523,490, 317, 75524,9319, 363, 382, 16917,350, 75528,75529,75530,2146, 8682, 343, 75531,31612,5449, 75532,75535,28104,75536,75533,75534,48487, - 42075,73130,13722,317, 9822, 316, 20641,75539,75541,75542,2036, 75543,2553, 12616,75545,75546,7035, 75552,317, 362, 2369, 343, 5910, 350, 75544,382, 317, + 42075,73130,13722,317, 9822, 316, 20641,75539,75541,75542,2036, 75543,2553, 12616,75545,75546,7035, 75552,317, 362, 2369, 343, 5910, 350, 75544,382, 317, 3639, 14278,8756, 381, 75547,466, 75548,362, 75549,317, 75550,75551,3079, 490, 365, 75554,2024, 511, 8569, 10855,2078, 317, 365, 52231,343, 75556,15449, 317, 351, 64626,351, 52231,15734,332, 75559,317, 396, 75560,75562,317, 380, 343, 343, 75564,75565,75571,2354, 75576,75587,45400,490, 75588,75589,75592, 75597,75599,75614,419, 75622,2067, 332, 8431, 490, 75566,75568,13853,75569,11921,75567,24059,381, 317, 36754,11921,381, 75570,56108,7990, 15504,317, 75572, 3052, 75573,370, 75574,5273, 317, 381, 1347, 75575,75577,343, 317, 2087, 75578,75581,75582,9392, 75583,75584,46188,317, 75585,565, 75579,596, 362, 75580, 317, 2366, 350, 3664, 362, 370, 317, 317, 6598, 10907,75586,466, 1347, 19617,7460, 596, 511, 9657, 14883,373, 75590,11749,75591,317, 75593,75594,39064, - 75595,317, 428, 317, 2156, 71601,4982, 317, 317, 10081,2510, 3999, 355, 317, 75596,466, 317, 1347, 15330,75598,317, 15510,75600,75601,75602,75606,317, + 75595,317, 428, 317, 2156, 71601,4982, 317, 317, 10081,2510, 3999, 355, 317, 75596,466, 317, 1347, 15330,75598,317, 15510,75600,75601,75602,75606,317, 5108, 370, 317, 75603,28691,317, 75604,75605,651, 390, 433, 75607,75608,2381, 75609,75610,75611,75612,75613,12421,75615,2272, 75616,75617,363, 5961, 75618, - 75619,317, 75620,75621,2568, 47781,2997, 75624,75625,75626,317, 10907,75628,75638,75640,75644,343, 390, 75674,345, 363, 479, 317, 317, 54890,317, 343, - 75627,75629,345, 75631,75632,75633,75634,439, 75635,75637,1588, 317, 4984, 75630,1160, 42797,1160, 317, 317, 317, 6145, 9504, 317, 363, 6046, 11782,5037, + 75619,317, 75620,75621,2568, 47781,2997, 75624,75625,75626,317, 10907,75628,75638,75640,75644,343, 390, 75674,345, 363, 479, 317, 317, 54890,317, 343, + 75627,75629,345, 75631,75632,75633,75634,439, 75635,75637,1588, 317, 4984, 75630,1160, 42797,1160, 317, 317, 317, 6145, 9504, 317, 363, 6046, 11782,5037, 7261, 317, 317, 317, 1108, 370, 72829,5993, 317, 317, 3078, 363, 75636,17583,4984, 75639,2022, 44883,370, 317, 75641,75642,75643,11324,633, 75645,75647, - 75648,75649,23207,75650,2134, 2022, 75651,75653,75663,29910,75669,404, 75672,75646,15581,317, 317, 2271, 339, 9069, 8948, 479, 5993, 382, 590, 380, 317, + 75648,75649,23207,75650,2134, 2022, 75651,75653,75663,29910,75669,404, 75672,75646,15581,317, 317, 2271, 339, 9069, 8948, 479, 5993, 382, 590, 380, 317, 6046, 16704,427, 75652,351, 2035, 57678,6645, 317, 16278,75654,75659,75660,3023, 75661,2022, 384, 6601, 70352,404, 10467,75662,32950,75655,75656,75657,75658, - 553, 363, 553, 39003,428, 6089, 356, 75664,75665,75666,75667,75668,6089, 370, 362, 2571, 363, 2571, 363, 75670,356, 75671,317, 363, 7214, 75673,1033, + 553, 363, 553, 39003,428, 6089, 356, 75664,75665,75666,75667,75668,6089, 370, 362, 2571, 363, 2571, 363, 75670,356, 75671,317, 363, 7214, 75673,1033, 75675,75679,75682,75676,75677,75678,2571, 317, 75680,75681,75684,75686,75706,75708,75730,59119,363, 75685,380, 2572, 317, 1060, 14461,47313,363, 75687,75690, - 75698,4304, 75699,317, 75688,75689,356, 8023, 466, 317, 317, 75691,637, 317, 1230, 317, 4982, 75696,75697,1347, 32840,75692,75693,75694,75695,5158, 332, - 543, 6598, 317, 75700,75701,317, 2510, 466, 6710, 75702,75703,75704,75705,343, 7585, 75707,345, 52414,5717, 75709,75711,75712,345, 75713,75715,75722,1060, - 343, 36936,75725,75726,75729,75710,356, 8125, 317, 75714,75716,363, 75717,345, 75718,2163, 75719,75720,75721,2551, 75723,9720, 404, 404, 75724,317, 7590, + 75698,4304, 75699,317, 75688,75689,356, 8023, 466, 317, 317, 75691,637, 317, 1230, 317, 4982, 75696,75697,1347, 32840,75692,75693,75694,75695,5158, 332, + 543, 6598, 317, 75700,75701,317, 2510, 466, 6710, 75702,75703,75704,75705,343, 7585, 75707,345, 52414,5717, 75709,75711,75712,345, 75713,75715,75722,1060, + 343, 36936,75725,75726,75729,75710,356, 8125, 317, 75714,75716,363, 75717,345, 75718,2163, 75719,75720,75721,2551, 75723,9720, 404, 404, 75724,317, 7590, 4949, 75727,75728,385, 385, 1230, 2208, 5960, 5840, 10422,3999, 317, 317, 362, 1358, 75731,14503,1230, 2067, 1078, 75732,2510, 466, 363, 317, 363, 75734, - 317, 6831, 75736,75738,75739,75745,75752,75753,5477, 46821,317, 75735,2362, 75737,33351,57128,4984, 75740,317, 75743,64377,466, 75741,75742,317, 8882, 2033, + 317, 6831, 75736,75738,75739,75745,75752,75753,5477, 46821,317, 75735,2362, 75737,33351,57128,4984, 75740,317, 75743,64377,466, 75741,75742,317, 8882, 2033, 75744,466, 5896, 75746,1345, 317, 317, 75747,75748,317, 6996, 317, 317, 317, 317, 317, 317, 75749,75750,13631,351, 466, 4591, 64342,428, 6354, 69184, - 4268, 75751,590, 23995,75754,75755,75758,75759,75760,75761,75762,404, 317, 590, 2063, 75756,75757,12696,5217, 370, 345, 605, 363, 351, 7389, 370, 7405, + 4268, 75751,590, 23995,75754,75755,75758,75759,75760,75761,75762,404, 317, 590, 2063, 75756,75757,12696,5217, 370, 345, 605, 363, 351, 7389, 370, 7405, 317, 75763,363, 35828,75766,17889,371, 595, 317, 7988, 75768,75769,75771,5896, 14981,74466,75772,75773,75775,75776,75780,317, 75774,345, 75777,75778,75779, 2206, 75781,75782,75783,75784,75785,75786,75789,75801,75812,75818,75834,75838,565, 75858,75859,75863,75866,75883,75930,75959,75963,75976,76011,76021,76038,76040, 2236, 76042,332, 2631, 75787,317, 490, 75788,5428, 343, 1020, 490, 317, 75790,75794,67953,2236, 75798,75799,3987, 75791,75792,75793,596, 317, 381, 20613, - 75795,2715, 75797,75796,6002, 317, 1700, 2381, 365, 317, 75800,2537, 7314, 15618,4965, 75802,5570, 75803,75808,317, 338, 13434,20487,36463,317, 3987, 317, - 75804,466, 75806,12199,317, 2584, 317, 380, 317, 75805,356, 466, 19922,317, 75807,12434,75809,75810,75811,380, 75813,64700,75814,14695,2171, 75816,3987, - 2184, 428, 4268, 2261, 317, 75815,317, 75817,75819,75822,75823,2572, 501, 501, 75826,75827,75829,18978,75830,75832,75833,317, 75820,75821,15424,3429, 317, - 1060, 75824,75825,7408, 15332,5663, 75828,332, 490, 317, 317, 501, 8384, 317, 343, 356, 16030,362, 75831,490, 317, 490, 332, 501, 343, 30393,1358, + 75795,2715, 75797,75796,6002, 317, 1700, 2381, 365, 317, 75800,2537, 7314, 15618,4965, 75802,5570, 75803,75808,317, 338, 13434,20487,36463,317, 3987, 317, + 75804,466, 75806,12199,317, 2584, 317, 380, 317, 75805,356, 466, 19922,317, 75807,12434,75809,75810,75811,380, 75813,64700,75814,14695,2171, 75816,3987, + 2184, 428, 4268, 2261, 317, 75815,317, 75817,75819,75822,75823,2572, 501, 501, 75826,75827,75829,18978,75830,75832,75833,317, 75820,75821,15424,3429, 317, + 1060, 75824,75825,7408, 15332,5663, 75828,332, 490, 317, 317, 501, 8384, 317, 343, 356, 16030,362, 75831,490, 317, 490, 332, 501, 343, 30393,1358, 2590, 75835,2163, 3751, 317, 75836,343, 16002,350, 317, 317, 75837,370, 1358, 14425,75839,75840,75846,75849,9289, 75853,75854,343, 75841,681, 43754,75842, - 317, 317, 1353, 1155, 889, 1353, 8301, 2631, 5108, 362, 5570, 3361, 362, 12154,317, 75843,7568, 75844,75845,75847,317, 75848,317, 637, 22650,6996, 317, - 633, 317, 633, 317, 317, 75850,317, 476, 75851,370, 2571, 45119,317, 317, 75852,317, 381, 6036, 351, 75855,75856,75857,317, 9696, 1347, 75860,350, + 317, 317, 1353, 1155, 889, 1353, 8301, 2631, 5108, 362, 5570, 3361, 362, 12154,317, 75843,7568, 75844,75845,75847,317, 75848,317, 637, 22650,6996, 317, + 633, 317, 633, 317, 317, 75850,317, 476, 75851,370, 2571, 45119,317, 317, 75852,317, 381, 6036, 351, 75855,75856,75857,317, 9696, 1347, 75860,350, 466, 75862,363, 75861,9214, 5241, 5105, 69463,317, 75864,2036, 75865,490, 46954,363, 75867,75868,39907,75869,2024, 75870,75871,75872,11236,2022, 75881,75882, 36075,345, 350, 9695, 14610,450, 350, 75873,32949,75875,75876,11236,75880,404, 317, 343, 9695, 75874,317, 343, 5217, 1345, 381, 317, 390, 317, 75877, - 4980, 75878,75879,412, 392, 949, 75884,75885,75896,2077, 75898,75909,53682,1020, 75914,75918,75928,490, 4980, 1603, 75929,949, 4591, 317, 5943, 317, 365, - 75886,75888,1020, 317, 75894,317, 75895,75887,75889,317, 356, 466, 75890,362, 317, 75892,75891,2272, 75893,16365,9696, 75897,371, 2381, 6228, 2809, 317, - 10392,10664,317, 75899,15215,75900,6555, 9479, 75903,1347, 75904,75906,16163,1548, 317, 7035, 2758, 14409,476, 75901,551, 317, 343, 75902,476, 7615, 1999, - 20682,75905,9162, 362, 11709,1588, 6696, 75907,75908,317, 490, 75910,75911,75913,1347, 2317, 75912,6834, 370, 75915,75917,3079, 10487,317, 390, 8446, 317, + 4980, 75878,75879,412, 392, 949, 75884,75885,75896,2077, 75898,75909,53682,1020, 75914,75918,75928,490, 4980, 1603, 75929,949, 4591, 317, 5943, 317, 365, + 75886,75888,1020, 317, 75894,317, 75895,75887,75889,317, 356, 466, 75890,362, 317, 75892,75891,2272, 75893,16365,9696, 75897,371, 2381, 6228, 2809, 317, + 10392,10664,317, 75899,15215,75900,6555, 9479, 75903,1347, 75904,75906,16163,1548, 317, 7035, 2758, 14409,476, 75901,551, 317, 343, 75902,476, 7615, 1999, + 20682,75905,9162, 362, 11709,1588, 6696, 75907,75908,317, 490, 75910,75911,75913,1347, 2317, 75912,6834, 370, 75915,75917,3079, 10487,317, 390, 8446, 317, 75916,5896, 45834,317, 317, 317, 4935, 345, 317, 75919,490, 8096, 75921,8217, 75922,75924,75926,75920,5711, 317, 317, 75923,357, 75925,75927,2211, 31436, - 2272, 404, 2291, 6314, 317, 75931,69723,75933,75936,75938,75939,75940,75942,75943,75944,15732,74892,75950,9454, 5911, 13020,75953,75954,75957,75958,317, 5517, - 75932,342, 363, 75934,10796,75935,1060, 5022, 351, 317, 9993, 12277,9878, 32092,343, 75937,317, 5482, 6402, 317, 317, 317, 12025,3361, 317, 27092,365, - 75941,18839,10538,11443,466, 317, 363, 7976, 317, 317, 1459, 345, 75945,554, 75948,75946,317, 317, 75947,356, 466, 75949,75951,75952,363, 317, 5896, - 317, 5105, 19830,317, 317, 380, 2022, 362, 363, 450, 75955,6576, 10085,343, 75956,317, 373, 2134, 7386, 2203, 75960,9575, 75962,75961,317, 490, 350, + 2272, 404, 2291, 6314, 317, 75931,69723,75933,75936,75938,75939,75940,75942,75943,75944,15732,74892,75950,9454, 5911, 13020,75953,75954,75957,75958,317, 5517, + 75932,342, 363, 75934,10796,75935,1060, 5022, 351, 317, 9993, 12277,9878, 32092,343, 75937,317, 5482, 6402, 317, 317, 317, 12025,3361, 317, 27092,365, + 75941,18839,10538,11443,466, 317, 363, 7976, 317, 317, 1459, 345, 75945,554, 75948,75946,317, 317, 75947,356, 466, 75949,75951,75952,363, 317, 5896, + 317, 5105, 19830,317, 317, 380, 2022, 362, 363, 450, 75955,6576, 10085,343, 75956,317, 373, 2134, 7386, 2203, 75960,9575, 75962,75961,317, 490, 350, 21013,75964,343, 75973,75974,317, 75965,75972,343, 9938, 317, 317, 1160, 75966,317, 75968,1347, 75971,23382,317, 75967,75969,75970,75975,558, 75977,15934, 75982,75984,317, 75986,75987,75988,332, 75990,75993,317, 22341,7865, 75978,75981,5891, 69200,75979,75980,6497, 6668, 75983,317, 348, 2060, 75985,3787, 17160, 390, 371, 5309, 75989,317, 75991,75992,75994,6388, 76000,76003,76004,75995,75996,75997,75998,75999,6486, 33467,76001,76002,76005,76006,1444, 76007,76008,76009, - 76010,317, 23996,76012,76016,317, 76017,36342,76018,7866, 76020,343, 490, 76013,76014,76015,350, 350, 11533,9878, 317, 351, 490, 350, 76019,317, 381, - 2156, 76022,76025,317, 8125, 76027,76028,76029,76031,76032,5488, 76033,76034,76037,6917, 76023,317, 317, 317, 574, 345, 76024,1160, 317, 1160, 317, 427, - 76026,8978, 2568, 22608,363, 18794,345, 76030,11612,491, 317, 18127,412, 317, 317, 363, 392, 345, 317, 476, 5872, 5809, 76035,1078, 1358, 317, 1347, + 76010,317, 23996,76012,76016,317, 76017,36342,76018,7866, 76020,343, 490, 76013,76014,76015,350, 350, 11533,9878, 317, 351, 490, 350, 76019,317, 381, + 2156, 76022,76025,317, 8125, 76027,76028,76029,76031,76032,5488, 76033,76034,76037,6917, 76023,317, 317, 317, 574, 345, 76024,1160, 317, 1160, 317, 427, + 76026,8978, 2568, 22608,363, 18794,345, 76030,11612,491, 317, 18127,412, 317, 317, 363, 392, 345, 317, 476, 5872, 5809, 76035,1078, 1358, 317, 1347, 317, 76036,5537, 2571, 57033,7941, 351, 76039,345, 17462,76041,317, 551, 76043,5237, 363, 370, 76045,76046,501, 12226,2719, 76047,76048,936, 76050,76053, 76055,317, 6778, 76051,76052,371, 317, 76054,76056,619, 76058,76063,76065,50563,332, 76067,5526, 1481, 76059,76062,76060,5173, 76061,11388,5427, 490, 76064, 76066,971, 11145,76069,363, 76072,381, 2037, 76070,76071,76073,317, 1430, 57130,434, 76075,76076,76082,76094,76101,76111,76119,76124,76137,76140,332, 76144, - 76158,76184,76236,76260,76282,76329,76331,76401,76413,76430,76465,76467,76486,76494,76502,76077,76079,317, 76080,1011, 76078,343, 362, 66859,2271, 389, 2077, - 76081,317, 10422,10147,363, 317, 317, 76083,2058, 76084,76086,76089,76091,10506,317, 317, 76093,31001,332, 317, 317, 5428, 371, 76085,317, 447, 317, + 76158,76184,76236,76260,76282,76329,76331,76401,76413,76430,76465,76467,76486,76494,76502,76077,76079,317, 76080,1011, 76078,343, 362, 66859,2271, 389, 2077, + 76081,317, 10422,10147,363, 317, 317, 76083,2058, 76084,76086,76089,76091,10506,317, 317, 76093,31001,332, 317, 317, 5428, 371, 76085,317, 447, 317, 317, 76087,317, 317, 76088,317, 363, 6046, 317, 76090,2348, 76092,317, 382, 490, 317, 5942, 320, 2077, 332, 76095,76097,317, 76099,8392, 536, 76100, 971, 76096,76098,2537, 317, 1109, 11366,351, 13559,10629,76102,76103,76104,53022,76105,76107,76108,317, 317, 380, 332, 14425,320, 596, 11128,317, 76106, - 5428, 363, 47678,76109,317, 317, 76110,396, 7114, 76112,76113,317, 554, 76114,362, 76115,76116,511, 317, 345, 345, 2156, 6917, 8882, 596, 596, 380, + 5428, 363, 47678,76109,317, 317, 76110,396, 7114, 76112,76113,317, 554, 76114,362, 76115,76116,511, 317, 345, 345, 2156, 6917, 8882, 596, 596, 380, 350, 343, 76117,76118,76120,76121,380, 5687, 1358, 76123,343, 76122,404, 371, 2242, 76125,76126,76130,76131,76132,76135,317, 11388,365, 76127,76128,76129, 9930, 343, 76133,6993, 317, 76134,76136,439, 393, 12696,428, 76138,590, 590, 76139,370, 76141,2067, 1345, 48609,76142,466, 317, 76143,2110, 76145,76147, - 76149,76152,2022, 317, 76154,76156,7711, 7850, 76146,317, 1044, 3284, 317, 10471,76148,390, 67597,76150,490, 76151,76153,6900, 9436, 1481, 76155,11485,2844, + 76149,76152,2022, 317, 76154,76156,7711, 7850, 76146,317, 1044, 3284, 317, 10471,76148,390, 67597,76150,490, 76151,76153,6900, 9436, 1481, 76155,11485,2844, 76157,317, 76159,76160,2148, 76162,76163,15334,13023,76167,76168,76170,76177,490, 76178,76181,7892, 76183,343, 15047,1325, 317, 332, 76161,53961,15334,76164, 76165,5862, 76166,373, 7377, 23268,317, 490, 1358, 21070,350, 317, 1020, 76169,33899,21296,76171,76175,362, 350, 317, 1230, 15305,317, 76172,31538,76174, 4980, 381, 317, 76173,363, 363, 2521, 76176,404, 350, 363, 38194,76179,15027,76180,3611, 332, 363, 76182,6228, 1184, 76185,76196,76203,76206,76209,76212, - 76215,76216,76218,76220,76225,76229,76231,76232,2108, 76234,76235,76186,5570, 490, 8455, 76188,76189,76194,317, 76187,317, 317, 76190,317, 76191,5439, 317, + 76215,76216,76218,76220,76225,76229,76231,76232,2108, 76234,76235,76186,5570, 490, 8455, 76188,76189,76194,317, 76187,317, 317, 76190,317, 76191,5439, 317, 76192,2142, 76193,317, 6458, 2715, 401, 8296, 605, 11146,317, 76195,38048,76197,76198,76199,76200,76202,2551, 35828,76201,5033, 76204,317, 12625,7850, 76205, - 7850, 317, 6648, 2288, 76207,19463,317, 317, 76208,76210,76211,76213,370, 317, 5611, 2551, 76214,490, 363, 5184, 384, 7590, 7360, 5223, 76217,13908,345, + 7850, 317, 6648, 2288, 76207,19463,317, 317, 76208,76210,76211,76213,370, 317, 5611, 2551, 76214,490, 363, 5184, 384, 7590, 7360, 5223, 76217,13908,345, 8274, 38461,76219,76221,317, 1358, 76222,76224,9422, 76223,605, 2402, 6228, 317, 740, 24054,2631, 317, 317, 5205, 317, 558, 317, 317, 317, 317, 28335, 67597,332, 365, 7185, 76226,490, 76227,317, 76228,10329,12598,76230,342, 62000,1194, 38449,5120, 363, 404, 76233,76237,11442,76238,76239,76240,76243,76247, 490, 76248,343, 76250,76254,2022, 76255,76257,76258,365, 317, 13323,343, 317, 49429,15581,2022, 317, 351, 317, 12799,33343,76241,76242,317, 317, 18692, - 317, 365, 404, 76244,36115,365, 501, 317, 9832, 490, 2078, 317, 76245,345, 76246,343, 867, 20782,317, 8357, 1347, 317, 471, 33895,317, 1459, 5793, - 76249,363, 317, 76251,76252,12943,76253,363, 363, 501, 2533, 5890, 428, 5896, 76256,4564, 41346,14170,317, 6420, 1266, 320, 76259,633, 649, 633, 381, + 317, 365, 404, 76244,36115,365, 501, 317, 9832, 490, 2078, 317, 76245,345, 76246,343, 867, 20782,317, 8357, 1347, 317, 471, 33895,317, 1459, 5793, + 76249,363, 317, 76251,76252,12943,76253,363, 363, 501, 2533, 5890, 428, 5896, 76256,4564, 41346,14170,317, 6420, 1266, 320, 76259,633, 649, 633, 381, 317, 56440,76261,535, 76262,373, 52890,6089, 76263,76264,76265,76268,76269,317, 317, 14410,76271,76272,76280,343, 356, 382, 2156, 1230, 6546, 343, 18905, - 317, 633, 363, 76266,16867,362, 466, 6255, 5683, 466, 76267,4789, 351, 316, 317, 381, 1526, 18138,363, 363, 345, 12563,437, 2108, 76270,596, 317, + 317, 633, 363, 76266,16867,362, 466, 6255, 5683, 466, 76267,4789, 351, 316, 317, 381, 1526, 18138,363, 363, 345, 12563,437, 2108, 76270,596, 317, 8948, 34185,5840, 365, 2593, 4447, 3075, 3076, 428, 351, 76273,19661,343, 76279,317, 76274,76276,356, 428, 2571, 362, 76278,76275,350, 76277,6352, 64784, - 76281,382, 4318, 76283,76290,76293,76294,76295,76296,37949,76297,76298,76300,76301,76304,76305,76306,76320,76323,76328,76284,76285,76286,76287,76288,76289,2537, + 76281,382, 4318, 76283,76290,76293,76294,76295,76296,37949,76297,76298,76300,76301,76304,76305,76306,76320,76323,76328,76284,76285,76286,76287,76288,76289,2537, 76291,6551, 76292,362, 1044, 381, 1060, 16790,2540, 382, 490, 317, 317, 317, 343, 317, 2627, 2134, 5355, 351, 568, 76299,1481, 5701, 317, 317, 17375, 16863,370, 476, 76302,317, 533, 317, 76303,476, 2107, 76307,76312,76315,76318,8455, 317, 76308,76309,76310,76311,351, 10291,317, 363, 76313,76314,27702, 8296, 76316,76317,11844,20085,2317, 76319,4925, 13735,31806,76321,5441, 76322,3361, 76324,76325,76327,2261, 3361, 1020, 317, 76326,427, 2206, 1060, 363, 10329, 76330,76332,76333,76335,76338,76341,75970,76342,76345,76348,76350,76352,76358,76362,76366,76370,76382,76385,76399,76400,317, 317, 363, 317, 1109, 317, 22578, 76334,381, 8948, 4949, 345, 371, 317, 381, 381, 76336,5464, 76337,2301, 6089, 317, 76339,501, 76340,7588, 7667, 317, 317, 317, 317, 590, 76343,76344, - 2551, 8051, 404, 76346,2537, 18183,5624, 317, 76347,332, 2537, 8926, 16517,76349,317, 76351,76353,76355,3023, 76356,5926, 6601, 345, 15540,76354,317, 2171, + 2551, 8051, 404, 76346,2537, 18183,5624, 317, 76347,332, 2537, 8926, 16517,76349,317, 76351,76353,76355,3023, 76356,5926, 6601, 345, 15540,76354,317, 2171, 339, 26271,332, 317, 317, 1358, 343, 76357,317, 371, 9171, 317, 76359,76361,317, 76360,11921,37568,76363,351, 76364,317, 76365,76367,76368,76369,76371, - 76373,76380,345, 76381,317, 332, 363, 67387,76372,76374,76340,317, 76376,404, 13376,76378,363, 76379,317, 317, 76375,76377,343, 317, 69469,13076,7091, + 76373,76380,345, 76381,317, 332, 363, 67387,76372,76374,76340,317, 76376,404, 13376,76378,363, 76379,317, 317, 76375,76377,343, 317, 69469,13076,7091, 317, 2086, 2142, 5538, 4984, 5120, 381, 20032,76383,1347, 76384,5033, 20985,320, 6486, 76386,76387,76393,317, 76397,17335,4591, 76388,6492, 76391,490, 76389, - 76390,317, 17453,76392,7672, 5033, 76394,76395,76396,5483, 5483, 317, 6409, 4591, 76398,8136, 466, 4591, 12399,428, 76402,76403,76404,76407,76408,1331, 317, + 76390,317, 17453,76392,7672, 5033, 76394,76395,76396,5483, 5483, 317, 6409, 4591, 76398,8136, 466, 4591, 12399,428, 76402,76403,76404,76407,76408,1331, 317, 76410,76411,332, 3869, 76405,1078, 317, 76406,16865,76409,490, 11831,7266, 332, 317, 332, 6808, 12925,19661,76412,4984, 317, 317, 332, 25114,76414,76418, - 76420,76422,362, 596, 76423,317, 76426,553, 76415,332, 356, 76416,14716,317, 565, 382, 76417,28578,317, 1347, 76419,76421,2402, 2503, 633, 338, 332, + 76420,76422,362, 596, 76423,317, 76426,553, 76415,332, 356, 76416,14716,317, 565, 382, 76417,28578,317, 1347, 76419,76421,2402, 2503, 633, 338, 332, 1108, 76424,76425,76427,76429,2178, 317, 76428,317, 621, 13178,76431,370, 76433,373, 76437,5661, 76439,76440,490, 76442,76444,76445,76459,76463,3987, 76432, - 363, 76434,10894,1194, 19784,76435,3999, 2271, 343, 355, 76436,404, 317, 31380,7035, 345, 76438,16162,901, 343, 2571, 317, 317, 1020, 76441,404, 370, + 363, 76434,10894,1194, 19784,76435,3999, 2271, 343, 355, 76436,404, 317, 31380,7035, 345, 76438,16162,901, 343, 2571, 317, 317, 1020, 76441,404, 370, 76443,2271, 76446,76447,76449,56717,76451,317, 317, 76455,5037, 317, 6394, 76448,317, 574, 2590, 2163, 382, 76450,76452,76453,76454,76456,76458,76457,48247, - 2610, 2369, 370, 76460,2022, 427, 76461,76462,2368, 2369, 5255, 356, 466, 76464,4965, 9170, 348, 76466,2081, 76468,350, 12312,76472,466, 76475,76477,9289, + 2610, 2369, 370, 76460,2022, 427, 76461,76462,2368, 2369, 5255, 356, 466, 76464,4965, 9170, 348, 76466,2081, 76468,350, 12312,76472,466, 76475,76477,9289, 370, 76484,30944,2004, 76469,1347, 76470,76471,317, 76473,76474,317, 76476,404, 565, 76478,7504, 2156, 76479,76480,501, 2022, 356, 317, 317, 439, 10520, 76481,76482,76483,574, 2022, 501, 363, 22717,25578,5037, 5105, 356, 439, 6736, 76485,2022, 363, 370, 76487,76489,14263,76488,1347, 397, 20660,76490,76491, 76492,76493,76495,76496,1325, 466, 76497,27528,76498,76499,446, 490, 12742,33429,76500,76501,3429, 351, 350, 25114,365, 1526, 2413, 1928, 76504,279, 14991, 280, 76820,281, 76966,76967,77038,77040,77044,77091,77106,76505,76506,76507,76514,76525,2219, 76533,76542,76548,76549,76559,76562,76563,76564,76572,1588, 76687, - 76694,76696,76700,76702,76711,76722,76723,76724,76508,21274,578, 76511,76512,76509,381, 332, 76510,317, 76513,76515,76516,76518,76519,76522,76524,10317,317, - 6270, 317, 317, 9170, 317, 3987, 1160, 76517,2134, 68715,5105, 9069, 317, 990, 1526, 15244,466, 76520,76521,7405, 476, 30397,76523,5221, 15646,317, 373, + 76694,76696,76700,76702,76711,76722,76723,76724,76508,21274,578, 76511,76512,76509,381, 332, 76510,317, 76513,76515,76516,76518,76519,76522,76524,10317,317, + 6270, 317, 317, 9170, 317, 3987, 1160, 76517,2134, 68715,5105, 9069, 317, 990, 1526, 15244,466, 76520,76521,7405, 476, 30397,76523,5221, 15646,317, 373, 60668,410, 76526,76529,1060, 317, 76527,32589,14786,18700,76528,317, 22497,1992, 76530,76531,76532,76534,76536,76541,404, 76535,76537,76539,551, 76538,76540, 76543,76545,76544,317, 68693,76546,2546, 76547,363, 37126,363, 363, 16187,76550,76554,76557,349, 76558,76551,15244,16137,466, 1347, 351, 317, 32534,76552, 76553,317, 317, 29284,554, 9648, 4960, 362, 7419, 76555,427, 317, 4268, 76556,317, 21732,317, 363, 76560,5033, 76561,2381, 343, 2462, 373, 13914,20382, 76565,76567,76568,76571,14768,317, 7405, 76566,76569,76570,317, 466, 5441, 23516,317, 317, 317, 27367,76573,13392,317, 317, 317, 43452,76544,76574,76579, 73076,427, 30882,317, 2156, 5325, 76575,76576,76577,76578,5459, 370, 2509, 317, 76580,76586,76588,76604,76609,76610,76621,76626,76631,2848, 28836,76638,76645, 76654,76658,76659,76669,76674,76680,26518,76685,76581,1060, 76583,76584,373, 76582,317, 30310,24828,76585,370, 76587,76589,76592,76598,76600,76590,76591,32473, - 76593,76594,76595,466, 317, 317, 76596,343, 76597,76599,317, 41931,41923,76601,5441, 76602,76603,393, 10120,317, 76605,76606,76607,76608,2510, 5226, 4268, + 76593,76594,76595,466, 317, 317, 76596,343, 76597,76599,317, 41931,41923,76601,5441, 76602,76603,393, 10120,317, 76605,76606,76607,76608,2510, 5226, 4268, 10523,76611,76615,76616,76620,5225, 76612,76613,523, 76614,317, 373, 2156, 5542, 2627, 76617,76618,76619,10422,466, 317, 76622,76624,76623,350, 5732, 76625, 76627,76628,76629,76630,343, 412, 4267, 76632,76636,76633,76634,76635,356, 76637,448, 317, 1230, 382, 62168,7327, 76639,76641,76644,28548,76640,5447, 21470, 2510, 371, 76642,76643,76646,76649,6272, 5241, 76647,76648,5543, 76650,76651,29241,76652,76653,457, 381, 76655,76656,76657,5628, 1347, 401, 317, 49332,76660, - 76661,76663,76664,76665,10069,28552,4304, 76662,459, 390, 17255,76666,76668,76667,6055, 8020, 466, 317, 1325, 20858,363, 76670,76672,76671,76673,76675,317, + 76661,76663,76664,76665,10069,28552,4304, 76662,459, 390, 17255,76666,76668,76667,6055, 8020, 466, 317, 1325, 20858,363, 76670,76672,76671,76673,76675,317, 76676,76677,76678,76679,433, 76681,76682,76684,76683,380, 5324, 76686,76688,12025,76690,11939,76692,317, 2163, 76689,5325, 26349,365, 76691,317, 29066,28043, 76693,76695,76697,317, 3075, 317, 76698,317, 362, 12925,466, 362, 317, 76699,8197, 76701,350, 9993, 1358, 76703,76705,76706,40781,28727,76710,317, 76704, 53001,2117, 76707,317, 76708,76709,317, 5662, 350, 2310, 317, 76712,76714,76719,490, 883, 1954, 11339,4564, 365, 76713,76715,76716,76718,317, 550, 10422, 466, 24577,53890,61603,76717,2271, 5105, 5447, 466, 317, 489, 5325, 76720,332, 6420, 76721,971, 384, 11241,5266, 350, 404, 348, 317, 76725,351, 12199, - 76726,317, 404, 2391, 76727,76740,76746,76750,76753,76759,76761,76763,76764,6294, 76767,76769,76773,76781,76792,76793,76796,76805,76809,76810,76818,25681,317, - 76819,76728,76732,373, 350, 2146, 317, 76733,76738,76729,343, 317, 76730,76731,2208, 466, 8023, 16138,15750,317, 317, 76734,350, 76736,76735,410, 4591, + 76726,317, 404, 2391, 76727,76740,76746,76750,76753,76759,76761,76763,76764,6294, 76767,76769,76773,76781,76792,76793,76796,76805,76809,76810,76818,25681,317, + 76819,76728,76732,373, 350, 2146, 317, 76733,76738,76729,343, 317, 76730,76731,2208, 466, 8023, 16138,15750,317, 317, 76734,350, 76736,76735,410, 4591, 76737,5394, 596, 317, 410, 15293,76739,5399, 317, 317, 345, 1992, 2156, 343, 76741,76742,76743,12642,76744,76745,317, 37292,12642,662, 317, 317, 10997, 76747,317, 22138,76749,76748,76751,76752,317, 15750,565, 43876,317, 6228, 76754,22786,350, 76757,24209,362, 1109, 11266,25545,317, 317, 76755,76756,76758, 76760,31413,3361, 370, 1108, 5652, 317, 363, 351, 5241, 76762,343, 10012,10012,40248,76765,350, 10907,76766,11324,4477, 351, 76768,28337,10422,16651,76770, - 675, 76771,565, 76772,345, 19283,317, 76774,76775,76777,5033, 317, 2134, 76780,350, 6318, 2272, 545, 11347,76776,16775,19163,466, 317, 32505,76778,343, + 675, 76771,565, 76772,345, 19283,317, 76774,76775,76777,5033, 317, 2134, 76780,350, 6318, 2272, 545, 11347,76776,16775,19163,466, 317, 32505,76778,343, 76779,5038, 332, 12854,6578, 568, 13419,76782,76785,76786,11059,373, 3987, 351, 76788,76783,363, 76784,12151,345, 428, 466, 317, 317, 76787,317, 76789, 554, 76790,362, 4984, 317, 76791,76794,76795,2086, 2402, 19430,2236, 317, 76797,554, 350, 4965, 76800,76803,76804,2368, 317, 317, 76798,76799,76801,76802, 317, 60449,343, 350, 351, 2156, 363, 2110, 76806,2035, 6817, 13393,76808,76807,6083, 12732,76811,76812,76814,76816,418, 76760,5561, 6138, 317, 317, 76813, 317, 2272, 76720,332, 76815,39520,332, 490, 317, 76817,12719,363, 13950,76821,76822,76823,76824,3342, 76825,76836,76845,76857,76861,76865,76871,76883,76884, - 76889,76901,76916,76917,76941,53920,76942,76947,76950,76957,76965,35345,71431,343, 76826,76827,3751, 76832,76833,317, 356, 412, 5174, 317, 317, 76828,4984, - 2156, 76829,76830,76831,427, 76834,76835,5689, 5616, 4564, 76837,76838,76839,12846,76840,590, 76842,14174,5173, 2156, 317, 317, 490, 18700,76841,317, 6425, + 76889,76901,76916,76917,76941,53920,76942,76947,76950,76957,76965,35345,71431,343, 76826,76827,3751, 76832,76833,317, 356, 412, 5174, 317, 317, 76828,4984, + 2156, 76829,76830,76831,427, 76834,76835,5689, 5616, 4564, 76837,76838,76839,12846,76840,590, 76842,14174,5173, 2156, 317, 317, 490, 18700,76841,317, 6425, 76843,76844,9325, 1347, 8544, 1347, 76846,76847,76850,490, 76852,76854,76856,332, 6179, 345, 76848,76849,20382,25978,76851,317, 5908, 596, 317, 76853,15058, 343, 66607,1160, 317, 317, 370, 381, 317, 342, 76855,365, 317, 422, 76858,343, 76859,317, 76860,317, 489, 7916, 343, 317, 350, 76862,317, 76864, - 317, 76863,373, 433, 76866,76867,76868,76869,76870,489, 332, 5447, 466, 25978,6904, 343, 514, 76872,76873,5033, 76876,76879,76881,76874,317, 76875,317, - 317, 356, 388, 466, 317, 1044, 545, 490, 76877,76878,76880,380, 72882,76882,317, 332, 867, 2086, 2381, 1347, 22003,370, 76885,76886,76888,317, 6145, + 317, 76863,373, 433, 76866,76867,76868,76869,76870,489, 332, 5447, 466, 25978,6904, 343, 514, 76872,76873,5033, 76876,76879,76881,76874,317, 76875,317, + 317, 356, 388, 466, 317, 1044, 545, 490, 76877,76878,76880,380, 72882,76882,317, 332, 867, 2086, 2381, 1347, 22003,370, 76885,76886,76888,317, 6145, 351, 76887,317, 317, 363, 382, 5055, 427, 27101,5201, 50684,76890,76892,76893,18422,76900,65263,343, 317, 76891,363, 24756,2108, 343, 6402, 349, 76894, - 76895,76896,76897,76898,76899,32544,10877,76902,76903,76906,1331, 76907,317, 76908,76913,76915,317, 76904,76905,6402, 554, 343, 76909,76910,427, 76911,317, + 76895,76896,76897,76898,76899,32544,10877,76902,76903,76906,1331, 76907,317, 76908,76913,76915,317, 76904,76905,6402, 554, 343, 76909,76910,427, 76911,317, 317, 6382, 76912,317, 4268, 76914,317, 343, 5611, 9038, 317, 317, 2260, 76918,317, 76920,76929,76930,76936,76939,317, 61919,2110, 76919,2078, 76921,14184, 76922,76923,76924,76925,76926,76927,76928,2272, 76931,76932,76933,317, 1020, 317, 5430, 317, 15163,317, 2413, 382, 76934,76935,7919, 2369, 76937,317, 76938, - 2590, 76940,19284,2116, 317, 317, 317, 14399,1347, 5223, 76943,6195, 6648, 490, 350, 2593, 76945,76944,76946,4984, 6002, 363, 554, 16880,317, 390, 1347, - 741, 343, 76948,2108, 76949,317, 76951,76956,76952,76954,76953,317, 9053, 356, 466, 317, 76955,76958,76960,76961,3854, 76959,365, 5439, 10820,76962,332, + 2590, 76940,19284,2116, 317, 317, 317, 14399,1347, 5223, 76943,6195, 6648, 490, 350, 2593, 76945,76944,76946,4984, 6002, 363, 554, 16880,317, 390, 1347, + 741, 343, 76948,2108, 76949,317, 76951,76956,76952,76954,76953,317, 9053, 356, 466, 317, 76955,76958,76960,76961,3854, 76959,365, 5439, 10820,76962,332, 76964,381, 427, 76963,5017, 370, 19665,350, 18387,490, 466, 76968,76969,3243, 76974,76975,76976,76980,76982,76983,10223,76986,76993,76999,77002,77005,77010, - 77011,77017,77030,77034,77036,77037,6674, 317, 6674, 9914, 29164,76970,76971,11347,2537, 6402, 76972,76973,5483, 5481, 20516,76766,332, 317, 31580,76977,317, - 351, 76978,5055, 4976, 363, 363, 76979,76981,13262,380, 5793, 12796,6278, 76984,11146,5033, 971, 363, 317, 76985,317, 16416,1160, 76987,76988,2142, 317, - 76989,76991,12704,36614,317, 317, 76990,9052, 317, 76992,317, 76994,11245,2022, 76998,357, 317, 7567, 5570, 76995,76996,4949, 370, 1345, 317, 76997,348, - 77000,77001,317, 15685,339, 596, 4976, 317, 332, 67281,71534,317, 77003,381, 77004,466, 9139, 466, 35794,77006,77007,42234,317, 343, 28082,317, 5570, + 77011,77017,77030,77034,77036,77037,6674, 317, 6674, 9914, 29164,76970,76971,11347,2537, 6402, 76972,76973,5483, 5481, 20516,76766,332, 317, 31580,76977,317, + 351, 76978,5055, 4976, 363, 363, 76979,76981,13262,380, 5793, 12796,6278, 76984,11146,5033, 971, 363, 317, 76985,317, 16416,1160, 76987,76988,2142, 317, + 76989,76991,12704,36614,317, 317, 76990,9052, 317, 76992,317, 76994,11245,2022, 76998,357, 317, 7567, 5570, 76995,76996,4949, 370, 1345, 317, 76997,348, + 77000,77001,317, 15685,339, 596, 4976, 317, 332, 67281,71534,317, 77003,381, 77004,466, 9139, 466, 35794,77006,77007,42234,317, 343, 28082,317, 5570, 77008,77009,33201,317, 317, 14974,363, 501, 350, 13679,67301,317, 362, 77012,77014,77016,317, 77013,77015,317, 15646,55270,317, 317, 77018,77026,77027, - 50002,77028,77029,77019,77021,9914, 77020,77022,466, 317, 317, 317, 9624, 20702,77023,77024,2060, 77025,6195, 2510, 11921,317, 741, 362, 350, 317, 317, - 77031,4965, 77033,77032,11442,77035,5105, 9170, 317, 9878, 380, 350, 12988,8301, 9450, 77039,77041,77042,77043,77045,77047,77048,77053,77056,77062,36647,343, + 50002,77028,77029,77019,77021,9914, 77020,77022,466, 317, 317, 317, 9624, 20702,77023,77024,2060, 77025,6195, 2510, 11921,317, 741, 362, 350, 317, 317, + 77031,4965, 77033,77032,11442,77035,5105, 9170, 317, 9878, 380, 350, 12988,8301, 9450, 77039,77041,77042,77043,77045,77047,77048,77053,77056,77062,36647,343, 77064,6471, 1109, 77065,77067,77072,77076,77077,332, 77078,77088,350, 77090,77046,317, 1345, 17039,317, 77049,317, 11236,77050,2631, 317, 317, 72585,77051, - 3999, 77052,362, 1160, 77054,8096, 77055,13638,317, 317, 590, 17926,317, 345, 317, 2142, 316, 77057,15637,28190,77059,362, 332, 317, 77060,77061,317, + 3999, 77052,362, 1160, 77054,8096, 77055,13638,317, 317, 590, 17926,317, 345, 317, 2142, 316, 77057,15637,28190,77059,362, 332, 317, 77060,77061,317, 317, 77058,596, 317, 35591,384, 22636,317, 77063,363, 385, 2156, 501, 2142, 381, 317, 77066,33567,4980, 384, 317, 363, 77068,317, 77070,77069,10223, - 12943,428, 77071,8047, 317, 317, 317, 317, 42456,77073,44506,351, 27623,77075,3987, 332, 10439,77074,356, 466, 2271, 1160, 10619,317, 11235,10946,5033, - 317, 5033, 77079,46173,77080,77082,36541,8296, 77081,350, 317, 317, 77083,466, 343, 77084,317, 77086,317, 637, 77085,77087,77089,317, 317, 75678,317, - 428, 5033, 350, 363, 5205, 77092,77093,356, 77095,28250,343, 77096,77098,77099,381, 77104,6817, 77094,16534,317, 351, 77097,8296, 77100,489, 75275,1020, + 12943,428, 77071,8047, 317, 317, 317, 317, 42456,77073,44506,351, 27623,77075,3987, 332, 10439,77074,356, 466, 2271, 1160, 10619,317, 11235,10946,5033, + 317, 5033, 77079,46173,77080,77082,36541,8296, 77081,350, 317, 317, 77083,466, 343, 77084,317, 77086,317, 637, 77085,77087,77089,317, 317, 75678,317, + 428, 5033, 350, 363, 5205, 77092,77093,356, 77095,28250,343, 77096,77098,77099,381, 77104,6817, 77094,16534,317, 351, 77097,8296, 77100,489, 75275,1020, 77103,10506,77101,77102,77105,501, 27851,77107,77108,77110,77116,77124,10596,77128,77135,2553, 77139,77144,77148,77167,9702, 317, 63175,46046,77111,317, 77112, 2058, 317, 332, 61280,26249,426, 8177, 77113,77114,77115,77117,6108, 77118,11245,77120,77121,77122,342, 77119,490, 57768,365, 77123,558, 77125,382, 77126, 7095, 466, 77127,466, 77129,77131,77132,7225, 46344,77134,77130,77133,2058, 2291, 6763, 77136,77137,77138,77140,2058, 317, 77141,317, 77142,77143,77145,77146, 77147,77149,77150,490, 363, 77153,490, 317, 365, 77155,77159,77162,33429,77164,39719,6808, 1943, 365, 46230,77151,77152,490, 2110, 490, 77154,77156,77157, 77158,29531,490, 77160,317, 2004, 77161,77163,27279,77165,77166,2976, 77168,77169,77170,427, 8440, 77172,77173,77174,317, 77175,77176,77179,77184,77198,77208, 77210,77214,77218,45793,77224,77227,77231,77236,77247,77261,77281,77284,965, 77294,77372,77383,46513,77401,77404,77406,77407,77177,77178,317, 317, 20380,77180, - 20312,966, 404, 77183,404, 77181,77182,590, 77185,77186,77187,4115, 77193,362, 77194,77195,317, 77196,5037, 317, 362, 317, 4943, 77188,13553,77189,501, - 362, 4591, 317, 2210, 5037, 2156, 77190,77191,351, 77192,55812,28068,9422, 382, 77197,77199,77200,371, 77202,77203,317, 404, 450, 77206,77201,7088, 2142, + 20312,966, 404, 77183,404, 77181,77182,590, 77185,77186,77187,4115, 77193,362, 77194,77195,317, 77196,5037, 317, 362, 317, 4943, 77188,13553,77189,501, + 362, 4591, 317, 2210, 5037, 2156, 77190,77191,351, 77192,55812,28068,9422, 382, 77197,77199,77200,371, 77202,77203,317, 404, 450, 77206,77201,7088, 2142, 317, 362, 55265,317, 38927,77204,466, 10946,317, 77205,381, 317, 77207,11347,77209,20149,362, 7419, 53552,32500,7091, 7785, 77211,317, 7911, 77212,77213, - 18454,77215,3987, 317, 77217,370, 77216,363, 317, 1160, 1325, 363, 317, 2261, 67687,2381, 77219,77222,362, 317, 3987, 77220,16651,2156, 77221,50810,404, + 18454,77215,3987, 317, 77217,370, 77216,363, 317, 1160, 1325, 363, 317, 2261, 67687,2381, 77219,77222,362, 317, 3987, 77220,16651,2156, 77221,50810,404, 77223,1065, 1065, 317, 77225,20779,77226,77228,77230,29143,965, 77229,612, 1193, 396, 18138,9170, 77232,345, 77235,77233,77234,77237,2081, 1345, 77240,77241, 77242,362, 77246,317, 365, 343, 77238,77239,590, 332, 317, 9473, 1109, 77243,12142,77244,77245,317, 5908, 2171, 317, 351, 317, 4980, 345, 317, 55131, 77248,77249,9557, 77252,1444, 76218,77253,4591, 77256,2419, 77258,1588, 43914,7565, 345, 363, 77250,77251,3999, 317, 317, 317, 28479,3646, 77254,3079, 71386, - 77255,77257,1347, 2510, 77259,317, 317, 77260,345, 77262,70289,12971,77263,77264,317, 77272,77275,77276,363, 77280,373, 388, 317, 317, 379, 1347, 317, - 317, 77265,77268,381, 6340, 77270,77266,343, 77267,77269,77271,77273,10878,77274,9666, 317, 317, 7227, 363, 64564,317, 317, 77277,77279,317, 77278,317, + 77255,77257,1347, 2510, 77259,317, 317, 77260,345, 77262,70289,12971,77263,77264,317, 77272,77275,77276,363, 77280,373, 388, 317, 317, 379, 1347, 317, + 317, 77265,77268,381, 6340, 77270,77266,343, 77267,77269,77271,77273,10878,77274,9666, 317, 317, 7227, 363, 64564,317, 317, 77277,77279,317, 77278,317, 466, 2184, 317, 363, 543, 490, 5661, 77282,77283,382, 2322, 68987,317, 77285,2142, 16934,77290,77291,77292,317, 77286,317, 317, 77287,33530,77288,77289, - 77293,9095, 28214,77295,77297,77308,77310,77311,6600, 77312,77314,490, 77316,77323,77325,77327,77352,77353,77356,77357,77364,77365,12756,77370,26034,77371,7350, + 77293,9095, 28214,77295,77297,77308,77310,77311,6600, 77312,77314,490, 77316,77323,77325,77327,77352,77353,77356,77357,77364,77365,12756,77370,26034,77371,7350, 77296,365, 317, 3869, 317, 2317, 77298,77299,77300,77302,7839, 77307,49165,1347, 317, 7941, 317, 5037, 31484,77301,6546, 741, 317, 317, 317, 928, 77303, - 77304,5419, 77305,8049, 10246,6923, 74899,27564,317, 317, 49685,382, 77306,68592,6294, 317, 77309,317, 9301, 2272, 4980, 317, 77313,362, 381, 381, 1881, + 77304,5419, 77305,8049, 10246,6923, 74899,27564,317, 317, 49685,382, 77306,68592,6294, 317, 77309,317, 9301, 2272, 4980, 317, 77313,362, 381, 381, 1881, 363, 390, 5328, 371, 77315,3726, 1799, 77317,77318,77320,343, 77321,12803,317, 1347, 317, 3967, 77319,317, 16704,46534,343, 370, 77322,317, 370, 77324, 47396,390, 5538, 363, 77326,3361, 8083, 401, 77328,77339,77340,12151,5840, 77342,77343,77344,2022, 2022, 77346,350, 77347,77348,6601, 77349,77350,317, 77329, - 77330,77331,77332,77333,77334,77335,77336,77337,77338,4280, 343, 5281, 38910,7590, 428, 426, 45083,77341,16380,380, 317, 351, 380, 6420, 317, 317, 427, - 385, 351, 1992, 77345,396, 4268, 2509, 317, 6674, 20015,77351,2272, 370, 317, 24185,5624, 5836, 363, 77354,77355,77358,77359,317, 77360,380, 16131,9720, - 317, 22350,20276,8419, 380, 317, 77361,77362,77363,317, 317, 35321,77366,77368,77369,77367,317, 317, 7073, 10487,317, 15510,370, 317, 371, 7657, 317, - 77373,77378,7871, 77379,350, 77381,77382,3726, 77374,16186,317, 2381, 77377,57713,1345, 77375,77376,2110, 741, 6481, 351, 343, 5836, 317, 77380,317, 558, - 1347, 74780,370, 466, 343, 384, 77384,77388,8023, 77391,332, 77393,77396,77397,77400,11308,317, 77385,317, 77386,77387,77389,317, 317, 77390,77392,357, - 370, 5120, 77394,356, 77395,317, 3429, 1347, 363, 77398,317, 77399,363, 317, 13387,2381, 1481, 77402,77403,55417,317, 7055, 77405,8948, 362, 2381, 317, + 77330,77331,77332,77333,77334,77335,77336,77337,77338,4280, 343, 5281, 38910,7590, 428, 426, 45083,77341,16380,380, 317, 351, 380, 6420, 317, 317, 427, + 385, 351, 1992, 77345,396, 4268, 2509, 317, 6674, 20015,77351,2272, 370, 317, 24185,5624, 5836, 363, 77354,77355,77358,77359,317, 77360,380, 16131,9720, + 317, 22350,20276,8419, 380, 317, 77361,77362,77363,317, 317, 35321,77366,77368,77369,77367,317, 317, 7073, 10487,317, 15510,370, 317, 371, 7657, 317, + 77373,77378,7871, 77379,350, 77381,77382,3726, 77374,16186,317, 2381, 77377,57713,1345, 77375,77376,2110, 741, 6481, 351, 343, 5836, 317, 77380,317, 558, + 1347, 74780,370, 466, 343, 384, 77384,77388,8023, 77391,332, 77393,77396,77397,77400,11308,317, 77385,317, 77386,77387,77389,317, 317, 77390,77392,357, + 370, 5120, 77394,356, 77395,317, 3429, 1347, 363, 77398,317, 77399,363, 317, 13387,2381, 1481, 77402,77403,55417,317, 7055, 77405,8948, 362, 2381, 317, 16917,13753,490, 77408,332, 18084,2603, 77410,32759,77412,1108, 77416,56278,77419,77411,77413,77414,77415,77417,77418,317, 77420,77421,77422,77424,77426,77439, - 77461,77481,20516,77425,74827,2074, 317, 1347, 77427,77428,77429,5727, 77432,77435,77438,501, 33170,8035, 317, 77430,2222, 317, 77431,12017,6195, 317, 343, + 77461,77481,20516,77425,74827,2074, 317, 1347, 77427,77428,77429,5727, 77432,77435,77438,501, 33170,8035, 317, 77430,2222, 317, 77431,12017,6195, 317, 343, 343, 317, 5991, 466, 317, 1160, 545, 450, 77433,77434,77436,317, 28691,77437,317, 1018, 363, 77440,77442,31015,2024, 77443,77444,77447,77452,77453,77457, - 317, 77460,6996, 3987, 77441,24291,3987, 317, 530, 77445,370, 77446,427, 24356,554, 4965, 23819,466, 77448,5174, 77449,77450,77451,317, 2156, 12422,317, - 317, 317, 317, 317, 565, 6195, 77454,77455,317, 77456,466, 317, 1347, 77458,317, 317, 37649,77459,42505,466, 317, 5087, 2298, 77462,9198, 18639,4982, - 77474,77475,4757, 77477,77478,338, 971, 77479,77480,77463,77464,77465,77466,77467,77468,77469,77470,77471,77472,77473,3039, 2063, 77476,370, 382, 27199,370, + 317, 77460,6996, 3987, 77441,24291,3987, 317, 530, 77445,370, 77446,427, 24356,554, 4965, 23819,466, 77448,5174, 77449,77450,77451,317, 2156, 12422,317, + 317, 317, 317, 317, 565, 6195, 77454,77455,317, 77456,466, 317, 1347, 77458,317, 317, 37649,77459,42505,466, 317, 5087, 2298, 77462,9198, 18639,4982, + 77474,77475,4757, 77477,77478,338, 971, 77479,77480,77463,77464,77465,77466,77467,77468,77469,77470,77471,77472,77473,3039, 2063, 77476,370, 382, 27199,370, 2060, 2680, 15334,2272, 2024, 490, 11236,77484,77486,77488,77490,77491,77493,77494,77495,77496,77502,77507,363, 77513,77524,77537,2298, 77542,77543,553, 77485, 3505, 4949, 77487,4965, 332, 77489,367, 5055, 450, 3361, 14695,77492,1459, 12721,351, 1351, 382, 1459, 1347, 11346,77497,77498,362, 77501,12302,536, 77499, - 1266, 317, 317, 77500,317, 317, 317, 37040,317, 317, 7214, 11347,77503,77504,317, 77505,77506,1331, 427, 77508,77509,77511,77512,363, 10538,77510,9447, + 1266, 317, 317, 77500,317, 317, 317, 37040,317, 317, 7214, 11347,77503,77504,317, 77505,77506,1331, 427, 77508,77509,77511,77512,363, 10538,77510,9447, 17421,11959,10854,317, 12417,77514,77519,77521,77523,621, 16603,317, 50854,77515,77518,5763, 77516,77517,15346,5736, 77520,345, 356, 317, 20684,9313, 77522, - 382, 381, 48074,52622,77525,77529,77530,77531,77532,77534,345, 77536,77526,343, 77527,1347, 77528,72585,317, 433, 5483, 7095, 380, 317, 21067,363, 317, - 1243, 363, 77533,19665,2271, 428, 77535,46111,433, 4738, 490, 77538,77539,77541,77540,511, 345, 77544,77546,77547,77549,365, 971, 77548,382, 53920,1588, + 382, 381, 48074,52622,77525,77529,77530,77531,77532,77534,345, 77536,77526,343, 77527,1347, 77528,72585,317, 433, 5483, 7095, 380, 317, 21067,363, 317, + 1243, 363, 77533,19665,2271, 428, 77535,46111,433, 4738, 490, 77538,77539,77541,77540,511, 345, 77544,77546,77547,77549,365, 971, 77548,382, 53920,1588, 77550,77560,77561,77565,77568,77596,77605,77613,77625,77642,77652,77677,77683,77695,77711,77762,284, 466, 78609,78687,78748,78791,78837,78844,78851,78854,78858, 78862,77551,4797, 77552,77556,77553,77554,77555,77557,317, 11073,317, 77558,77559,345, 1522, 77562,77563,77564,1060, 77566,380, 345, 77567,621, 77569,77570, 77572,77574,77581,77586,77591,370, 77592,77593,77571,13559,356, 514, 77573,596, 77575,11702,2108, 77576,317, 77577,7035, 77578,77579,7834, 317, 77580,77582, - 77583,77584,77585,19065,77587,77588,77589,77590,77594,77595,17215,6581, 345, 77597,77600,317, 77602,490, 2366, 77604,77598,357, 77599,317, 317, 77601,1660, - 7704, 490, 8403, 8926, 77603,9624, 77606,77607,77608,77610,77611,2022, 6450, 18406,17375,1459, 11408,380, 365, 1109, 77609,363, 345, 57654,6108, 77612,7095, + 77583,77584,77585,19065,77587,77588,77589,77590,77594,77595,17215,6581, 345, 77597,77600,317, 77602,490, 2366, 77604,77598,357, 77599,317, 317, 77601,1660, + 7704, 490, 8403, 8926, 77603,9624, 77606,77607,77608,77610,77611,2022, 6450, 18406,17375,1459, 11408,380, 365, 1109, 77609,363, 345, 57654,6108, 77612,7095, 2317, 77614,77615,77618,490, 490, 6834, 77619,77621,77622,332, 20814,77623,77624,77616,77617,317, 77620,11485,2110, 13386,10625,317, 22223,13559,317, 77626, - 77628,77629,77633,77639,1347, 20814,31739,6222, 77627,27913,5890, 551, 77630,77631,77632,77634,77638,77635,77636,77637,6778, 77640,607, 77641,77643,77647,2381, - 77649,77650,77651,401, 351, 77644,2261, 77645,77646,317, 15059,343, 77648,439, 22782,605, 427, 317, 345, 77653,343, 77656,77658,77663,77665,77666,1030, + 77628,77629,77633,77639,1347, 20814,31739,6222, 77627,27913,5890, 551, 77630,77631,77632,77634,77638,77635,77636,77637,6778, 77640,607, 77641,77643,77647,2381, + 77649,77650,77651,401, 351, 77644,2261, 77645,77646,317, 15059,343, 77648,439, 22782,605, 427, 317, 345, 77653,343, 77656,77658,77663,77665,77666,1030, 390, 77670,77672,77676,2355, 17471,77654,53552,77655,77657,77659,77662,14266,77660,77661,77664,5055, 77667,77669,5662, 77668,317, 317, 65100,10946,27614,77671, 6203, 77673,1526, 77674,77675,77678,2015, 24836,77680,2177, 77682,16093,381, 1108, 339, 77679,77681,5570, 77684,77687,77688,17216,1479, 18855,77693,3658, 77685, - 77686,1000, 351, 1020, 433, 77689,77690,317, 77691,77692,77694,18333,77696,77700,5840, 77701,77702,77706,1044, 77710,77697,3611, 77698,17196,77699,390, 390, + 77686,1000, 351, 1020, 433, 77689,77690,317, 77691,77692,77694,18333,77696,77700,5840, 77701,77702,77706,1044, 77710,77697,3611, 77698,17196,77699,390, 390, 317, 332, 77703,77704,77705,77707,7368, 539, 77708,77709,77712,77715,77717,38893,77719,490, 77720,22945,77725,77731,7481, 426, 77732,77734,77736,77753,77755, - 77758,77759,77713,35170,356, 1109, 11198,13638,77714,4949, 77716,77718,317, 17249,490, 9492, 317, 5217, 18921,9214, 77721,77722,77723,77724,2078, 317, 317, - 5120, 883, 390, 345, 343, 77726,77727,5662, 77729,8178, 77730,427, 370, 77728,363, 12696,345, 370, 77733,1601, 8264, 5891, 15512,1071, 77735,31977,2626, + 77758,77759,77713,35170,356, 1109, 11198,13638,77714,4949, 77716,77718,317, 17249,490, 9492, 317, 5217, 18921,9214, 77721,77722,77723,77724,2078, 317, 317, + 5120, 883, 390, 345, 343, 77726,77727,5662, 77729,8178, 77730,427, 370, 77728,363, 12696,345, 370, 77733,1601, 8264, 5891, 15512,1071, 77735,31977,2626, 77737,77741,77752,77738,77739,317, 77740,5477, 5742, 77742,7225, 363, 6228, 3387, 2301, 77743,77747,2503, 77750,77744,401, 51029,77745,77746,2272, 77748,77749, - 439, 77751,316, 77754,356, 590, 317, 77756,77757,77760,7506, 77761,317, 26935,77763,77767,77779,28270,77780,77781,77782,77784,77786,12796,77789,77793,345, - 490, 490, 365, 77764,77765,345, 6923, 77766,77768,317, 77769,77771,77773,77776,390, 2219, 4943, 77770,1347, 24229,77772,77774,77775,317, 77777,77778,317, - 4984, 471, 317, 490, 317, 390, 6900, 427, 33713,317, 43285,77783,77785,356, 11884,77787,351, 1030, 77788,317, 317, 77790,18042,2291, 77792,77791,2116, + 439, 77751,316, 77754,356, 590, 317, 77756,77757,77760,7506, 77761,317, 26935,77763,77767,77779,28270,77780,77781,77782,77784,77786,12796,77789,77793,345, + 490, 490, 365, 77764,77765,345, 6923, 77766,77768,317, 77769,77771,77773,77776,390, 2219, 4943, 77770,1347, 24229,77772,77774,77775,317, 77777,77778,317, + 4984, 471, 317, 490, 317, 390, 6900, 427, 33713,317, 43285,77783,77785,356, 11884,77787,351, 1030, 77788,317, 317, 77790,18042,2291, 77792,77791,2116, 66820,7450, 11089,77794,77796,77866,77892,77987,78138,78184,78222,78236,78247,78325,78329,78334,78345,78364,78375,78396,78443,78450,78486,78559,78583,78585,78591, 78605,78607,77795,77797,77802,77818,77824,365, 77828,77829,77830,77833,77840,77847,77849,77852,77857,77862,14062,77798,343, 8647, 77800,77799,1526, 77801,77803, 77813,77804,77805,77809,77811,77806,54242,77807,77808,77810,77812,77814,77815,77816,77817,5687, 32683,77819,77822,77820,77821,77823,77825,6309, 63065,26409,77826, - 77827,12262,1526, 27851,12761,77831,359, 317, 77832,412, 77834,53402,77835,77836,77837,77838,77839,77841,77844,77842,77843,77845,77846,29624,3649, 77848,317, + 77827,12262,1526, 27851,12761,77831,359, 317, 77832,412, 77834,53402,77835,77836,77837,77838,77839,77841,77844,77842,77843,77845,77846,29624,3649, 77848,317, 356, 2247, 77850,42347,77851,32769,6308, 2601, 77853,77854,77855,77856,5093, 41159,5337, 2601, 77858,77859,77860,77861,77863,77865,77864,77867,22499,77869,77880, 77881,77883,77885,77890,77868,77870,32768,77872,77876,41036,77871,77873,77874,77875,77877,77878,77879,9482, 1033, 9141, 356, 77882,363, 77884,77886,77887,77889, 2102, 77888,3505, 3243, 77891,77893,77895,77907,77921,317, 77929,77932,77980,355, 77983,317, 13307,2590, 77894,511, 317, 56401,77896,77898,77897,77897,77899, 77903,77900,77901,77902,77904,77905,77906,77908,1524, 6308, 77909,77911,77914,77910,77912,77913,466, 77915,1526, 77916,77917,77918,77919,77920,380, 77922,77926, 77923,77924,77925,77927,77928,77930,77931,382, 5556, 24567,12696,32606,2108, 9876, 77933,77935,77945,77973,77976,77979,20766,77934,77936,77938,77939,77937,65827, 34440,77940,77941,77942,2601, 62515,22912,77943,77944,77946,77947,77950,77934,12760,77954,77962,77970,77948,77949,77951,77952,77953,77955,77958,77959,77956,77957, - 24938,18166,77960,37675,77961,13154,77963,77964,77965,77967,77966,77968,77969,77971,77972,1526, 317, 77974,77975,317, 77977,77978,2601, 21188,24937,13307,390, + 24938,18166,77960,37675,77961,13154,77963,77964,77965,77967,77966,77968,77969,77971,77972,1526, 317, 77974,77975,317, 77977,77978,2601, 21188,24937,13307,390, 77981,77982,2601, 2600, 396, 77984,317, 77985,77986,77988,77990,78109,343, 78128,317, 78133,78135,511, 77989,1526, 54242,356, 77991,77995,77997,78000,78001, - 78098,78102,78106,77992,77994,24600,77993,77996,6308, 2601, 5337, 77998,77999,317, 78002,78006,78008,78017,78025,78029,78030,78037,78038,78040,78043,78045,9289, + 78098,78102,78106,77992,77994,24600,77993,77996,6308, 2601, 5337, 77998,77999,317, 78002,78006,78008,78017,78025,78029,78030,78037,78038,78040,78043,78045,9289, 78047,78061,78067,78081,78086,78087,78089,343, 78003,427, 78004,78005,78007,476, 2732, 78009,78012,78015,11702,78016,78010,317, 78011,78013,78014,381, 68815, - 350, 12840,33839,78018,78019,78024,343, 78020,78021,78022,78023,78026,78027,78028,12025,3869, 5336, 78031,78032,78033,345, 466, 343, 78034,78036,78035,7389, + 350, 12840,33839,78018,78019,78024,343, 78020,78021,78022,78023,78026,78027,78028,12025,3869, 5336, 78031,78032,78033,345, 466, 343, 78034,78036,78035,7389, 545, 77884,9878, 78039,24403,78041,511, 1347, 78042,5447, 1347, 466, 78044,78046,78048,78049,78054,77835,78056,356, 1915, 56791,5335, 78050,78051,78052,78053, 78055,78057,78058,78059,78060,2601, 78062,78063,78064,78065,78066,78068,78069,3311, 78072,78073,317, 78070,3649, 78071,78074,78077,78078,78080,29435,78075,13098, - 78076,9482, 10877,317, 356, 5661, 78079,78082,78085,380, 78083,78084,10877,2156, 371, 317, 1526, 77926,78088,78090,78091,78092,466, 78094,78095,4965, 530, + 78076,9482, 10877,317, 356, 5661, 78079,78082,78085,380, 78083,78084,10877,2156, 371, 317, 1526, 77926,78088,78090,78091,78092,466, 78094,78095,4965, 530, 381, 78093,1325, 21013,78096,78097,7419, 466, 501, 58756,78099,78101,78100,61885,77993,78103,78104,78105,26135,1526, 78107,78108,78110,345, 78112,343, 77934, 78118,49012,78111,78113,78114,78115,78116,78117,78119,53287,78123,78120,65709,78122,78121,78124,78127,78125,78126,78129,466, 343, 78131,78130,78132,78134,26761, 317, 78136,78137,317, 78139,78143,78147,77934,78148,78153,317, 78163,78169,78172,78173,78176,78140,78142,1526, 78141,317, 6504, 317, 78144,78145,78146,78149, - 78150,78151,78152,410, 356, 3854, 78154,511, 78157,78159,78155,29364,78156,78158,78160,78161,78162,78164,78165,78167,78166,78168,78170,78171,78174,78175,370, + 78150,78151,78152,410, 356, 3854, 78154,511, 78157,78159,78155,29364,78156,78158,78160,78161,78162,78164,78165,78167,78166,78168,78170,78171,78174,78175,370, 378, 78177,78178,2247, 78179,78183,78180,78182,78181,78185,3557, 78198,78199,78201,78205,490, 78214,78218,78186,78188,78191,78194,78196,1526, 511, 6441, 78187, 78189,78190,78192,78193,78195,78197,41036,41489,41059,8519, 25393,78200,50374,317, 1526, 12761,78202,78204,78203,78206,5272, 78207,5336, 1526, 78208,78209,78213, 78210,78211,78212,410, 363, 466, 78215,78216,78217,78219,78221,13307,78220,78223,78224,317, 78227,24200,78230,78235,39297,2007, 357, 490, 78225,6594, 78226, 362, 439, 22114,78228,78229,1526, 367, 1526, 78231,78232,78234,78233,62602,5337, 6275, 78237,351, 78239,78244,78246,1999, 356, 78238,5556, 78240,5337, 78241, - 78242,5164, 356, 1526, 78243,78245,12761,1526, 370, 24400,78248,10489,78249,78254,78260,2134, 78265,78269,78281,78301,20351,78307,2081, 78308,78309,78313,317, - 78250,78251,317, 78252,78253,18104,431, 381, 317, 30713,343, 2146, 27452,45872,363, 1325, 78255,57937,1347, 78256,78257,78258,78259,78261,78262,2184, 5488, - 5464, 317, 78263,78264,356, 397, 370, 317, 78266,541, 78267,78268,78270,78273,78271,78272,78274,78276,78277,78275,1526, 78278,3649, 78279,78280,356, 434, + 78242,5164, 356, 1526, 78243,78245,12761,1526, 370, 24400,78248,10489,78249,78254,78260,2134, 78265,78269,78281,78301,20351,78307,2081, 78308,78309,78313,317, + 78250,78251,317, 78252,78253,18104,431, 381, 317, 30713,343, 2146, 27452,45872,363, 1325, 78255,57937,1347, 78256,78257,78258,78259,78261,78262,2184, 5488, + 5464, 317, 78263,78264,356, 397, 370, 317, 78266,541, 78267,78268,78270,78273,78271,78272,78274,78276,78277,78275,1526, 78278,3649, 78279,78280,356, 434, 78282,78283,78284,62523,78288,78290,78299,63065,77951,78285,78287,78286,78289,2247, 78291,78292,78296,78297,78293,78294,78295,2369, 410, 1526, 77949,29362,78298, 2601, 78300,78302,317, 317, 78303,78304,5840, 5037, 5483, 5250, 18587,78305,78306,316, 363, 53322,345, 78310,78312,466, 317, 317, 317, 78311,317, 39676, - 317, 8122, 317, 78314,78315,17358,317, 30553,78316,78317,78318,78321,78322,317, 78319,78320,370, 317, 21393,370, 2261, 32010,78323,78324,30882,1078, 317, + 317, 8122, 317, 78314,78315,17358,317, 30553,78316,78317,78318,78321,78322,317, 78319,78320,370, 317, 21393,370, 2261, 32010,78323,78324,30882,1078, 317, 1588, 9917, 317, 28220,78326,78327,78328,78258,370, 78330,439, 78331,317, 78332,78333,410, 8553, 6420, 78335,78337,78339,78343,2316, 317, 356, 78336,78338, - 345, 1526, 7857, 29194,78340,78342,50634,1526, 2601, 317, 78341,410, 5324, 10238,78344,77993,78346,78350,78356,78362,343, 78347,78349,24499,31123,78348,1526, + 345, 1526, 7857, 29194,78340,78342,50634,1526, 2601, 317, 78341,410, 5324, 10238,78344,77993,78346,78350,78356,78362,343, 78347,78349,24499,31123,78348,1526, 1526, 24570,78351,317, 78352,78353,78354,78355,317, 78357,78360,1526, 78358,78359,78361,24568,78363,1526, 78365,78367,64205,78373,29364,1526, 2108, 78366,78368, 5337, 78371,5400, 78369,78370,78372,5441, 356, 78374,78376,78383,339, 78386,78389,78390,78377,78381,78378,78379,78380,78382,41271,380, 78384,78385,78387,78388, 6308, 65709,12761,78391,503, 78393,78392,78394,78395,78397,78405,78408,78417,78422,78441,24499,78398,78399,78400,78403,1526, 317, 2601, 1526, 78401,29515,78402, @@ -12262,49 +12257,49 @@ static const unsigned int ChildLocs[185261] = 574, 78275,78446,78447,78448,78449,78451,78454,78480,78484,78485,490, 1526, 1525, 78452,317, 78453,78455,78460,26135,78465,363, 78466,78468,78470,78472,78473, 78477,78478,41404,78456,78457,78458,78459,78461,78462,5337, 78463,78464,1526, 77993,25392,22834,2601, 78467,42036,9141, 12656,78469,78471,16316,78064,78378,78300, 78474,78475,78476,26135,63065,78479,343, 78481,78482,78483,76585,5336, 78487,78493,78503,77887,78510,78220,78512,78519,78531,78537,78558,59447,343, 356, 78488, - 78489,447, 6305, 53623,78490,24600,78491,78492,60260,1526, 511, 78494,78495,78498,78501,78496,78497,78499,78500,28013,78156,78502,78504,62523,78507,78508,317, + 78489,447, 6305, 53623,78490,24600,78491,78492,60260,1526, 511, 78494,78495,78498,78501,78496,78497,78499,78500,28013,78156,78502,78504,62523,78507,78508,317, 78509,5487, 78505,5363, 78506,1526, 418, 317, 1453, 78511,77888,9078, 1526, 78513,78515,439, 317, 78514,1526, 78516,78517,78518,78520,78523,5379, 78359,78521, 24569,78522,78524,501, 78525,78526,78527,78528,78529,78530,78532,32869,78533,78534,384, 373, 29435,1526, 22912,78535,78536,78538,78542,78104,382, 78546,78550, - 78554,78539,78541,78540,78543,78544,78545,78547,78549,78548,317, 78551,22912,78552,78553,78555,78557,78556,78560,78562,78570,78572,78573,78577,32683,362, 1526, + 78554,78539,78541,78540,78543,78544,78545,78547,78549,78548,317, 78551,22912,78552,78553,78555,78557,78556,78560,78562,78570,78572,78573,78577,32683,362, 1526, 78561,53131,24938,78563,2601, 63339,78564,78565,362, 78566,31952,78569,11191,78567,78568,2193, 78571,370, 7727, 317, 17745,511, 13307,356, 78574,550, 78575, 78576,42202,356, 78578,21188,1526, 78580,42366,6308, 78579,317, 78581,78582,317, 78584,410, 356, 9313, 78586,78588,24938,78374,78587,50374,2317, 22809,78589, - 24569,78590,78592,78594,78596,78602,78604,2601, 78593,5093, 13954,54241,317, 317, 78595,13631,317, 45202,78597,78601,343, 30532,78598,78599,78600,78603,439, + 24569,78590,78592,78594,78596,78602,78604,2601, 78593,5093, 13954,54241,317, 317, 78595,13631,317, 45202,78597,78601,343, 30532,78598,78599,78600,78603,439, 24938,2355, 28262,33572,78606,78608,488, 78610,78613,78622,78625,78628,78633,78635,78636,78638,78644,29108,2679, 78645,78649,78651,78652,78653,78664,78668,78674, - 78682,78684,78686,78611,78612,78614,78618,78621,78615,78616,78617,78619,78620,2631, 78623,78624,78626,32769,78627,371, 2108, 41584,78629,553, 5841, 78632,553, + 78682,78684,78686,78611,78612,78614,78618,78621,78615,78616,78617,78619,78620,2631, 78623,78624,78626,32769,78627,371, 2108, 41584,78629,553, 5841, 78632,553, 78630,78631,6696, 1060, 12226,78634,317, 6598, 8254, 78637,39495,78639,428, 78641,78640,356, 396, 78642,11613,78643,5619, 350, 11229,78646,64321,78647,78648, - 78650,317, 2405, 12593,13066,317, 78654,78660,4952, 6388, 317, 49205,78655,78656,9590, 48917,12417,393, 78657,381, 78658,78659,78661,370, 78662,78663,427, - 392, 2601, 78665,78666,78667,22561,27846,350, 351, 8567, 2381, 6195, 78669,78670,78671,3311, 362, 363, 78672,2212, 511, 605, 381, 351, 78673,6081, 5492, - 1033, 510, 4268, 343, 78675,78676,8695, 78679,530, 2146, 11783,78681,78677,11279,78678,6696, 434, 78680,476, 7072, 78683,78685,39866,439, 380, 42216,1912, - 9388, 78688,78693,78698,78699,78701,350, 78705,16860,78707,2134, 78718,78720,14213,78722,345, 78725,78729,78733,78739,78741,78743,1020, 2291, 343, 78689,7242, - 317, 78690,78691,490, 490, 490, 22828,565, 345, 380, 78692,78694,4984, 78697,317, 390, 1108, 363, 78695,317, 317, 401, 7785, 78696,317, 3284, 317, + 78650,317, 2405, 12593,13066,317, 78654,78660,4952, 6388, 317, 49205,78655,78656,9590, 48917,12417,393, 78657,381, 78658,78659,78661,370, 78662,78663,427, + 392, 2601, 78665,78666,78667,22561,27846,350, 351, 8567, 2381, 6195, 78669,78670,78671,3311, 362, 363, 78672,2212, 511, 605, 381, 351, 78673,6081, 5492, + 1033, 510, 4268, 343, 78675,78676,8695, 78679,530, 2146, 11783,78681,78677,11279,78678,6696, 434, 78680,476, 7072, 78683,78685,39866,439, 380, 42216,1912, + 9388, 78688,78693,78698,78699,78701,350, 78705,16860,78707,2134, 78718,78720,14213,78722,345, 78725,78729,78733,78739,78741,78743,1020, 2291, 343, 78689,7242, + 317, 78690,78691,490, 490, 490, 22828,565, 345, 380, 78692,78694,4984, 78697,317, 390, 1108, 363, 78695,317, 317, 401, 7785, 78696,317, 3284, 317, 371, 317, 317, 18937,7888, 489, 9680, 317, 78700,7657, 317, 317, 78702,18692,78703,317, 317, 78704,2272, 5104, 78706,317, 466, 57768,317, 380, 21864, - 317, 78708,78709,8264, 2271, 78710,317, 78711,78713,317, 343, 78717,78712,317, 1347, 370, 19534,317, 78714,78715,78716,8613, 965, 78719,404, 317, 419, - 748, 367, 363, 78721,9364, 345, 2067, 78723,11272,60932,317, 78724,78726,5159, 78727,78728,332, 2381, 490, 78730,78732,8095, 317, 78731,7488, 1358, 568, - 78734,317, 35972,78737,9869, 371, 11858,78735,78736,317, 78738,317, 317, 6188, 5238, 9436, 78740,363, 317, 6551, 10809,317, 489, 78742,317, 934, 317, + 317, 78708,78709,8264, 2271, 78710,317, 78711,78713,317, 343, 78717,78712,317, 1347, 370, 19534,317, 78714,78715,78716,8613, 965, 78719,404, 317, 419, + 748, 367, 363, 78721,9364, 345, 2067, 78723,11272,60932,317, 78724,78726,5159, 78727,78728,332, 2381, 490, 78730,78732,8095, 317, 78731,7488, 1358, 568, + 78734,317, 35972,78737,9869, 371, 11858,78735,78736,317, 78738,317, 317, 6188, 5238, 9436, 78740,363, 317, 6551, 10809,317, 489, 78742,317, 934, 317, 78744,78745,2078, 78746,78747,428, 78749,78752,78753,1109, 78754,12966,19478,78764,78767,78768,317, 78769,78774,78776,78777,78778,78779,78780,78783,490, 78750, - 71315,5457, 78751,490, 1358, 10734,14483,490, 317, 72680,1109, 1383, 651, 1205, 317, 1331, 15179,9866, 75678,78755,539, 78756,317, 78762,476, 362, 404, + 71315,5457, 78751,490, 1358, 10734,14483,490, 317, 72680,1109, 1383, 651, 1205, 317, 1331, 15179,9866, 75678,78755,539, 78756,317, 78762,476, 362, 404, 78757,739, 78758,9298, 78761,5872, 317, 317, 1112, 651, 78759,78760,356, 78763,78765,6013, 78766,317, 41304,8281, 381, 2844, 2004, 317, 317, 2067, 14455, 380, 78770,78771,5120, 2271, 78772,78773,633, 3742, 78775,317, 317, 317, 501, 317, 317, 5294, 317, 332, 317, 448, 317, 350, 317, 2178, 1160, 78781, 356, 78782,6081, 332, 8281, 5701, 78784,317, 78789,78785,78786,78787,78788,78790,317, 78792,1109, 78794,78797,78799,78803,78807,433, 2022, 9590, 343, 78812, 78814,78817,78821,78828,78829,78836,490, 78793,490, 490, 471, 78795,317, 78796,317, 2272, 317, 345, 78798,4965, 78800,362, 78801,78802,490, 78804,78805, - 18588,78806,18588,28578,596, 317, 78808,78809,56125,78810,78811,78813,5406, 6594, 78815,78816,9981, 370, 350, 78818,78819,78820,78822,78825,2022, 78827,317, + 18588,78806,18588,28578,596, 317, 78808,78809,56125,78810,78811,78813,5406, 6594, 78815,78816,9981, 370, 350, 78818,78819,78820,78822,78825,2022, 78827,317, 78823,78824,390, 78826,5708, 1194, 356, 466, 370, 317, 371, 2033, 78830,78831,78832,78833,1065, 78834,78835,65900,363, 390, 4925, 380, 78838,2380, 78840, - 78839,317, 78841,317, 78842,317, 78843,78845,78847,78848,10408,78846,78849,78850,78852,78853,11442,78855,78856,78857,78859,78860,78861,490, 6834, 77622,332, + 78839,317, 78841,317, 78842,317, 78843,78845,78847,78848,10408,78846,78849,78850,78852,78853,11442,78855,78856,78857,78859,78860,78861,490, 6834, 77622,332, 12616,6355, 78863,19493,78867,78868,78869,78870,78872,78864,78865,78866,317, 78871,317, 3284, 6789, 78873,23516,78875,78877,78880,1242, 286, 79492,79508,79511, 288, 79810,79897,79908,290, 80303,80322,80331,80364,4253, 291, 80600,80603,80609,80636,80645,80665,80696,80700,80707,78874,78876,78878,78879,78881,1084, 78882, 78883,78901,78911,78912,78918,78926,78927,78946,78955,78957,79039,287, 79352,79355,79359,79402,79454,79466,79479,349, 6975, 79483,79485,5120, 381, 490, 78884, 78889,371, 78895,357, 78898,2146, 78900,78885,867, 78887,5037, 78886,6278, 1325, 78888,382, 39628,78890,8419, 78893,78891,78892,5570, 317, 6937, 748, 78894, - 5052, 1347, 741, 317, 78896,363, 2381, 78897,78899,2155, 30514,78902,78903,78904,78908,78909,78910,54100,1108, 12371,8446, 78905,317, 75403,78906,490, 345, - 78907,78913,78916,78914,78915,78917,78919,9557, 78920,78922,33957,2117, 48254,317, 78924,32087,7689, 317, 78921,317, 78923,6940, 24943,78925,317, 370, 2571, + 5052, 1347, 741, 317, 78896,363, 2381, 78897,78899,2155, 30514,78902,78903,78904,78908,78909,78910,54100,1108, 12371,8446, 78905,317, 75403,78906,490, 345, + 78907,78913,78916,78914,78915,78917,78919,9557, 78920,78922,33957,2117, 48254,317, 78924,32087,7689, 317, 78921,317, 78923,6940, 24943,78925,317, 370, 2571, 381, 363, 54307,356, 343, 8626, 78928,78929,78933,317, 78936,78939,1030, 50221,1347, 78930,7910, 78931,13025,78932,78934,317, 332, 370, 317, 78935,78937, - 78938,78940,362, 78945,6402, 78941,490, 78942,78943,317, 78944,10471,8906, 490, 1999, 78947,565, 78951,78953,78948,78949,78950,78952,78954,78956,2356, 380, + 78938,78940,362, 78945,6402, 78941,490, 78942,78943,317, 78944,10471,8906, 490, 1999, 78947,565, 78951,78953,78948,78949,78950,78952,78954,78956,2356, 380, 450, 396, 78958,78962,78964,78974,78992,78993,78994,78999,79001,79003,79021,79022,79024,79028,79029,79030,79032,79037,78959,78960,348, 5190, 15571,78961,14959, - 332, 1100, 317, 332, 371, 12994,78963,490, 332, 363, 6450, 317, 78965,78969,78972,565, 501, 78966,78968,317, 78967,8926, 78970,78971,317, 33979,489, - 78973,317, 78975,317, 490, 78978,78987,78990,78991,317, 78976,78977,78979,317, 371, 78981,78982,78985,317, 78980,317, 22918,39912,2310, 2380, 317, 317, - 78983,363, 317, 78984,317, 1347, 6600, 490, 317, 345, 5328, 7657, 78986,2380, 1430, 12931,78988,490, 317, 317, 78989,1160, 317, 332, 317, 1347, 1109, + 332, 1100, 317, 332, 371, 12994,78963,490, 332, 363, 6450, 317, 78965,78969,78972,565, 501, 78966,78968,317, 78967,8926, 78970,78971,317, 33979,489, + 78973,317, 78975,317, 490, 78978,78987,78990,78991,317, 78976,78977,78979,317, 371, 78981,78982,78985,317, 78980,317, 22918,39912,2310, 2380, 317, 317, + 78983,363, 317, 78984,317, 1347, 6600, 490, 317, 345, 5328, 7657, 78986,2380, 1430, 12931,78988,490, 317, 317, 78989,1160, 317, 332, 317, 1347, 1109, 317, 343, 5238, 5687, 2683, 78995,78997,5028, 78998,24574,1358, 404, 427, 78996,23267,317, 397, 370, 317, 317, 351, 2271, 79000,9930, 9993, 317, 79002, - 79004,79012,79018,79020,317, 79005,79007,79010,79011,317, 79006,79008,79009,5087, 596, 343, 29120,8096, 79013,317, 2086, 6294, 79014,79015,79016,317, 5792, - 79017,317, 5570, 5033, 2322, 317, 2271, 317, 9624, 317, 490, 20535,79019,8254, 317, 317, 1358, 5862, 317, 5223, 3284, 2369, 345, 343, 79023,2317, 7523, + 79004,79012,79018,79020,317, 79005,79007,79010,79011,317, 79006,79008,79009,5087, 596, 343, 29120,8096, 79013,317, 2086, 6294, 79014,79015,79016,317, 5792, + 79017,317, 5570, 5033, 2322, 317, 2271, 317, 9624, 317, 490, 20535,79019,8254, 317, 317, 1358, 5862, 317, 5223, 3284, 2369, 345, 343, 79023,2317, 7523, 351, 343, 4591, 79025,79026,79027,10832,363, 345, 79031,17543,79033,79034,466, 317, 2155, 5167, 79035,317, 317, 79036,5570, 79038,317, 79040,79041,79042, 365, 317, 79043,317, 11648,79044,317, 6420, 8804, 317, 79045,79062,79081,79090,79175,79183,79186,79196,79212,79216,79224,79234,79241,79252,79261,79268,79271, 79274,79297,79304,79306,79326,79342,79348,2134, 79046,6904, 19617,79047,79050,79053,43881,79055,79059,489, 79061,14832,2566, 79048,79049,363, 28461,79051,79052, @@ -12314,62 +12309,62 @@ static const unsigned int ChildLocs[185261] = 317, 79100,11952,79102,79103,79104,79106,79113,79114,79154,6831, 79157,79161,28525,25525,4949, 79098,79099,553, 2193, 79101,13611,11883,10580,7276, 12825,31105, 28789,79105,79107,79108,13687,79109,79112,4960, 28462,79110,79111,427, 7940, 79115,79116,9695, 363, 2024, 79118,79122,539, 78590,79126,79128,79130,11716,79134, 79137,79138,79144,79145,79148,79152,48427,79117,426, 28462,79119,79120,2290, 79121,439, 11884,79123,79125,11918,2261, 79124,3243, 396, 1383, 11884,412, 79127, - 958, 3243, 317, 317, 362, 343, 79129,332, 79124,317, 79131,79132,79133,351, 6645, 79135,79136,380, 317, 380, 79139,79141,79142,79140,29036,380, 3869, + 958, 3243, 317, 317, 362, 343, 79129,332, 79124,317, 79131,79132,79133,351, 6645, 79135,79136,380, 317, 380, 79139,79141,79142,79140,29036,380, 3869, 514, 3869, 73971,79143,79146,79147,12696,3243, 9878, 79149,3505, 79151,371, 79150,343, 2261, 2181, 36190,343, 79153,11124,79155,79156,66197,79158,79159,79160, - 501, 373, 351, 2261, 48204,1358, 8219, 381, 79162,79164,79163,350, 1999, 343, 1453, 412, 2024, 17001,317, 79166,404, 351, 350, 1999, 22212,79168,350, - 363, 501, 317, 317, 79170,2134, 476, 12756,356, 565, 371, 14832,79172,350, 79173,317, 28707,371, 79092,1358, 343, 2067, 79176,79177,7624, 79178,317, - 79179,79180,381, 79181,79182,8807, 384, 317, 371, 1481, 317, 345, 426, 79069,7384, 3076, 79184,79185,79187,79188,79191,79192,21552,79194,365, 79189,1998, - 79190,2551, 566, 396, 390, 30126,79193,28476,317, 79195,15325,2074, 79197,79203,393, 79205,79211,13905,79198,501, 79199,22269,79202,501, 79200,1020, 343, + 501, 373, 351, 2261, 48204,1358, 8219, 381, 79162,79164,79163,350, 1999, 343, 1453, 412, 2024, 17001,317, 79166,404, 351, 350, 1999, 22212,79168,350, + 363, 501, 317, 317, 79170,2134, 476, 12756,356, 565, 371, 14832,79172,350, 79173,317, 28707,371, 79092,1358, 343, 2067, 79176,79177,7624, 79178,317, + 79179,79180,381, 79181,79182,8807, 384, 317, 371, 1481, 317, 345, 426, 79069,7384, 3076, 79184,79185,79187,79188,79191,79192,21552,79194,365, 79189,1998, + 79190,2551, 566, 396, 390, 30126,79193,28476,317, 79195,15325,2074, 79197,79203,393, 79205,79211,13905,79198,501, 79199,22269,79202,501, 79200,1020, 343, 2298, 79201,553, 5105, 2102, 343, 79204,2134, 11070,501, 79206,79207,6563, 79208,6318, 79209,343, 343, 317, 553, 501, 317, 56343,317, 6917, 33957,79210, - 373, 345, 317, 971, 351, 79213,31062,317, 79214,22666,7858, 79215,79217,79219,79220,79222,79223,79218,79221,371, 79225,79227,79230,79232,79233,351, 1588, + 373, 345, 317, 971, 351, 79213,31062,317, 79214,22666,7858, 79215,79217,79219,79220,79222,79223,79218,79221,371, 79225,79227,79230,79232,79233,351, 1588, 79226,29120,13177,79228,381, 79229,317, 317, 37331,79231,3243, 390, 79235,8009, 79236,12756,317, 349, 1588, 79237,79238,79239,79240,79242,79245,79247,79248, 79251,27732,317, 362, 316, 79243,79244,6402, 317, 79246,574, 343, 5033, 79249,79250,343, 350, 317, 501, 362, 6083, 27664,371, 4952, 49853,6645, 79253, 365, 79254,79255,79258,345, 14832,317, 12700,79256,79257,21553,79259,79260,79262,3505, 79263,79265,33572,79264,12711,79266,79267,79269,79270,465, 79272,79273, - 317, 16288,49881,6340, 350, 2369, 79275,79281,79285,79287,79289,79290,79296,36461,79276,541, 79280,5526, 2391, 79277,79279,79278,351, 384, 15566,349, 350, + 317, 16288,49881,6340, 350, 2369, 79275,79281,79285,79287,79289,79290,79296,36461,79276,541, 79280,5526, 2391, 79277,79279,79278,351, 384, 15566,349, 350, 317, 79282,343, 79284,317, 79283,79286,2586, 79288,553, 79291,14595,79294,79292,79293,9444, 79067,10317,79295,427, 566, 501, 79298,79300,22337,380, 79301, 79303,317, 343, 79299,79302,10580,393, 393, 380, 11533,79305,501, 79307,79313,36461,79317,79319,79325,3023, 79308,363, 79309,79310,79311,79312,363, 79314, 79315,79316,79318,539, 79320,79322,412, 79321,9930, 9930, 79323,79324,79327,79333,370, 79335,79338,2301, 79339,79328,381, 79329,12756,350, 2568, 79330,79331, 79332,2507, 79334,381, 317, 3243, 356, 36115,79336,79337,373, 1999, 2152, 371, 317, 343, 317, 79340,79341,79343,317, 79344,79345,79346,79347,79349,79351, 46221,380, 79350,381, 39082,356, 79353,79354,2510, 42018,317, 79356,79357,79358,317, 5328, 1347, 79360,79364,34993,79365,79368,79371,79372,74148,79382,79384, - 79385,79391,79392,79395,79397,79398,79400,79401,2184, 2948, 79361,7356, 490, 348, 5140, 79362,317, 79363,3751, 490, 393, 7891, 317, 345, 79366,79367,4984, + 79385,79391,79392,79395,79397,79398,79400,79401,2184, 2948, 79361,7356, 490, 348, 5140, 79362,317, 79363,3751, 490, 393, 7891, 317, 345, 79366,79367,4984, 317, 362, 4984, 357, 54294,79369,79370,16464,371, 2156, 2078, 317, 332, 5995, 5058, 345, 317, 345, 79373,5956, 79378,317, 2132, 1109, 21955,79381,79374, - 79377,21680,79375,13766,79376,317, 79379,317, 79380,351, 4564, 596, 317, 79383,370, 79386,79388,79390,4984, 501, 427, 79387,79389,380, 317, 317, 317, + 79377,21680,79375,13766,79376,317, 79379,317, 79380,351, 4564, 596, 317, 79383,370, 79386,79388,79390,4984, 501, 427, 79387,79389,380, 317, 317, 317, 79393,79394,2322, 27913,79396,6063, 490, 397, 79399,317, 34287,1109, 317, 7399, 2110, 380, 380, 79403,79404,79405,79413,12994,79417,79418,7865, 79423,79424, - 79427,79438,79439,79444,79451,26830,417, 317, 2142, 29475,365, 317, 1588, 79406,79411,590, 79407,79408,5392, 79409,79410,79412,54792,5828, 79414,317, 2271, + 79427,79438,79439,79444,79451,26830,417, 317, 2142, 29475,365, 317, 1588, 79406,79411,590, 79407,79408,5392, 79409,79410,79412,54792,5828, 79414,317, 2271, 317, 317, 79415,79416,605, 6623, 363, 365, 79419,11469,79420,79421,79422,7117, 1044, 317, 365, 490, 590, 50217,317, 396, 7185, 5711, 365, 79425,79426, - 79428,79434,79435,317, 79429,79430,79431,79432,79433,79436,79437,79440,79442,79443,317, 1588, 332, 79441,317, 990, 357, 317, 5105, 317, 317, 351, 317, + 79428,79434,79435,317, 79429,79430,79431,79432,79433,79436,79437,79440,79442,79443,317, 1588, 332, 79441,317, 990, 357, 317, 5105, 317, 317, 351, 317, 79445,79446,2272, 370, 79449,2571, 2381, 490, 2163, 332, 19414,79447,345, 33571,79448,79450,79452,79453,79455,390, 31518,79456,79458,79461,317, 79462,79457, - 79459,79460,79463,79465,79464,49712,317, 79467,79468,79469,79475,79477,2601, 2134, 343, 79478,34127,79470,2163, 79474,79471,79472,79473,1020, 9470, 79476,363, - 363, 11928,317, 381, 14316,317, 2510, 350, 1444, 1020, 14144,79480,37118,317, 79481,317, 79482,79484,490, 965, 350, 363, 317, 79486,79491,66655,9702, + 79459,79460,79463,79465,79464,49712,317, 79467,79468,79469,79475,79477,2601, 2134, 343, 79478,34127,79470,2163, 79474,79471,79472,79473,1020, 9470, 79476,363, + 363, 11928,317, 381, 14316,317, 2510, 350, 1444, 1020, 14144,79480,37118,317, 79481,317, 79482,79484,490, 965, 350, 363, 317, 79486,79491,66655,9702, 79487,79488,79490,317, 317, 317, 1292, 1267, 79489,363, 6555, 428, 79493,79501,79503,79505,66503,79494,79495,79496,1243, 79498,10382,79497,79499,79500,34213, 2733, 596, 79502,427, 611, 6580, 79504,22939,6778, 34639,608, 396, 79506,608, 79507,79509,79510,317, 79512,381, 79513,79515,79516,79521,79523,79527,79537, 79545,79556,79558,79559,8403, 79585,33917,79635,289, 79774,79793,79801,370, 79803,79804,79805,390, 350, 6578, 317, 79514,28734,6675, 370, 2022, 362, 79517, - 79519,343, 5570, 350, 608, 79520,79518,345, 6013, 490, 48569,23995,2610, 8311, 79522,490, 371, 79524,79525,79526,350, 351, 2044, 317, 450, 15772,317, + 79519,343, 5570, 350, 608, 79520,79518,345, 6013, 490, 48569,23995,2610, 8311, 79522,490, 371, 79524,79525,79526,350, 351, 2044, 317, 450, 15772,317, 356, 466, 11709,317, 79528,79530,317, 55568,2222, 79535,350, 6468, 317, 79529,7657, 79531,79532,317, 79533,317, 48162,79534,373, 5634, 79536,79538,79539, - 79540,79542,79543,6222, 79541,53593,317, 79544,381, 8957, 79546,79550,79553,79554,79547,79548,79549,1325, 79551,317, 79552,363, 390, 79555,317, 4738, 317, - 79557,343, 6221, 2298, 79560,867, 79565,79567,5611, 79568,8099, 79570,79571,79574,79575,79579,79580,79581,79584,15754,12994,79561,79563,2631, 79564,79562,332, - 66655,8611, 332, 12994,66655,317, 64251,79566,11709,2036, 490, 12642,317, 490, 317, 317, 317, 317, 79569,2381, 317, 317, 317, 317, 14754,39015,317, - 317, 79572,38304,79573,11709,317, 2178, 7386, 317, 2210, 317, 6541, 79576,23595,79578,489, 351, 401, 317, 317, 317, 79577,30835,5201, 53131,317, 363, + 79540,79542,79543,6222, 79541,53593,317, 79544,381, 8957, 79546,79550,79553,79554,79547,79548,79549,1325, 79551,317, 79552,363, 390, 79555,317, 4738, 317, + 79557,343, 6221, 2298, 79560,867, 79565,79567,5611, 79568,8099, 79570,79571,79574,79575,79579,79580,79581,79584,15754,12994,79561,79563,2631, 79564,79562,332, + 66655,8611, 332, 12994,66655,317, 64251,79566,11709,2036, 490, 12642,317, 490, 317, 317, 317, 317, 79569,2381, 317, 317, 317, 317, 14754,39015,317, + 317, 79572,38304,79573,11709,317, 2178, 7386, 317, 2210, 317, 6541, 79576,23595,79578,489, 351, 401, 317, 317, 317, 79577,30835,5201, 53131,317, 363, 12625,363, 11709,362, 7672, 317, 748, 7149, 317, 79582,2067, 79583,68828,317, 381, 79586,79588,79589,79594,79601,16464,79603,79604,332, 79608,79610,79614, 79616,79632,79634,2155, 79587,356, 5226, 2537, 332, 365, 317, 79590,79592,79593,2391, 317, 9909, 79591,317, 382, 12949,410, 5241, 2510, 348, 5217, 79595, - 39072,79597,17357,317, 79598,79596,9549, 317, 317, 6978, 1347, 490, 6492, 79599,79600,79602,6415, 317, 523, 379, 514, 317, 13920,373, 343, 351, 6551, - 15311,490, 59462,79605,345, 79606,317, 79607,2178, 79609,16651,362, 5120, 317, 79611,490, 40281,345, 79612,4591, 317, 79613,4108, 317, 380, 79615,363, - 1588, 317, 51025,6847, 10422,317, 79617,2146, 79619,79620,79627,79628,21830,79618,382, 5476, 79621,79622,2272, 343, 317, 2381, 31645,79623,79624,1347, 596, + 39072,79597,17357,317, 79598,79596,9549, 317, 317, 6978, 1347, 490, 6492, 79599,79600,79602,6415, 317, 523, 379, 514, 317, 13920,373, 343, 351, 6551, + 15311,490, 59462,79605,345, 79606,317, 79607,2178, 79609,16651,362, 5120, 317, 79611,490, 40281,345, 79612,4591, 317, 79613,4108, 317, 380, 79615,363, + 1588, 317, 51025,6847, 10422,317, 79617,2146, 79619,79620,79627,79628,21830,79618,382, 5476, 79621,79622,2272, 343, 317, 2381, 31645,79623,79624,1347, 596, 79625,79626,79629,317, 1160, 79630,79631,317, 317, 17454,1347, 317, 1347, 9362, 79633,5439, 317, 362, 8419, 317, 2537, 343, 12696,79636,79637,79638,79646, 79654,79660,79667,79672,79675,79679,79685,362, 79696,79708,79712,79722,79727,79731,79733,79737,79746,79754,55946,79756,79769,365, 79639,79640,79641,2462, 79644, - 397, 4573, 79642,317, 317, 79643,79645,79647,79652,68454,343, 79653,9914, 317, 4949, 5324, 79648,5428, 79651,79649,79650,58359,7801, 371, 371, 343, 490, - 6486, 2222, 79655,79656,79657,79658,79659,79661,79662,79664,6318, 79666,317, 317, 381, 5428, 363, 332, 380, 1347, 79663,317, 2060, 350, 1943, 4268, 4965, - 79665,21067,2163, 2134, 7386, 332, 317, 5428, 5428, 317, 79668,363, 490, 79670,317, 79669,317, 79671,54488,79673,79674,79676,79677,5058, 79678,343, 317, - 28295,2210, 7384, 351, 7360, 317, 7095, 501, 79680,79683,7360, 79684,41817,382, 79681,79682,675, 396, 7403, 79686,362, 79688,79689,79694,18211,79687,2184, + 397, 4573, 79642,317, 317, 79643,79645,79647,79652,68454,343, 79653,9914, 317, 4949, 5324, 79648,5428, 79651,79649,79650,58359,7801, 371, 371, 343, 490, + 6486, 2222, 79655,79656,79657,79658,79659,79661,79662,79664,6318, 79666,317, 317, 381, 5428, 363, 332, 380, 1347, 79663,317, 2060, 350, 1943, 4268, 4965, + 79665,21067,2163, 2134, 7386, 332, 317, 5428, 5428, 317, 79668,363, 490, 79670,317, 79669,317, 79671,54488,79673,79674,79676,79677,5058, 79678,343, 317, + 28295,2210, 7384, 351, 7360, 317, 7095, 501, 79680,79683,7360, 79684,41817,382, 79681,79682,675, 396, 7403, 79686,362, 79688,79689,79694,18211,79687,2184, 410, 5488, 12925,79690,332, 3725, 363, 79691,79692,79693,79695,7940, 317, 10580,79697,79706,350, 79707,79698,79699,79700,79701,79705,79702,79703,79704,79709, 47635,79710,2610, 381, 317, 2272, 566, 332, 317, 79711,79713,79715,79717,79721,79714,79716,380, 574, 6645, 79718,317, 79719,404, 5226, 8979, 79720,21303, 545, 79723,79724,79725,79726,10407,6607, 317, 748, 380, 317, 60329,3361, 317, 317, 343, 4965, 490, 490, 317, 317, 381, 317, 490, 1913, 675, 79728, 317, 490, 79729,79730,11357,1109, 8355, 79732,79734,79735,79736,10815,343, 317, 12752,7657, 9537, 27954,5223, 351, 27954,79738,79739,79740,12625,9246, 79743, - 345, 6713, 343, 24100,41518,317, 79741,317, 5650, 79742,73971,79744,79745,79747,79751,2654, 79753,317, 79748,317, 317, 79749,79750,79752,317, 332, 317, - 5476, 345, 15753,79755,554, 748, 317, 79757,1033, 15380,79758,79759,79760,79761,79762,79763,79764,79765,79766,79767,79768,317, 535, 79770,3869, 10796,2541, - 9029, 79771,79772,79773,79775,79776,79777,79779,79539,2022, 6519, 79780,79784,79786,79790,79791,332, 54237,79778,317, 2053, 490, 317, 79781,79782,490, 7385, + 345, 6713, 343, 24100,41518,317, 79741,317, 5650, 79742,73971,79744,79745,79747,79751,2654, 79753,317, 79748,317, 317, 79749,79750,79752,317, 332, 317, + 5476, 345, 15753,79755,554, 748, 317, 79757,1033, 15380,79758,79759,79760,79761,79762,79763,79764,79765,79766,79767,79768,317, 535, 79770,3869, 10796,2541, + 9029, 79771,79772,79773,79775,79776,79777,79779,79539,2022, 6519, 79780,79784,79786,79790,79791,332, 54237,79778,317, 2053, 490, 317, 79781,79782,490, 7385, 949, 5624, 79783,351, 79785,79787,32336,4982, 79788,5530, 883, 6408, 317, 53728,79789,382, 1347, 433, 79792,43861,390, 79794,317, 6033, 64182,7940, 79798, - 345, 79795,332, 5055, 317, 79796,371, 79797,79799,466, 317, 317, 317, 362, 79800,317, 79802,317, 58439,356, 8642, 490, 404, 8392, 79806,490, 490, + 345, 79795,332, 5055, 317, 79796,371, 79797,79799,466, 317, 317, 317, 362, 79800,317, 79802,317, 58439,356, 8642, 490, 404, 8392, 79806,490, 490, 79807,79808,79809,79811,79813,79814,30373,79815,79834,79837,79842,79848,79856,79859,79869,79873,79890,79812,608, 545, 2733, 79816,79822,79823,6221, 79824,79825, 79828,79830,79833,34849,79817,33650,79818,15105,79819,607, 396, 79820,79821,351, 2464, 79826,79827,608, 10382,79829,79831,24871,79832,6778, 48102,79835,19082, 79836,651, 710, 56093,79838,612, 79839,22866,6222, 79840,79841,79843,79844,79845,79846,79847,79849,20441,79851,79853,17213,79850,79852,26872,79854,79855,79857, @@ -12378,36 +12373,36 @@ static const unsigned int ChildLocs[185261] = 79893,79894,79896,79898,79901,79902,3366, 79905,79899,79900,79903,79904,79906,79907,317, 2730, 317, 57696,5105, 79909,79917,79928,79964,79992,80010,61790,80030, 80031,80038,80057,80124,80126,80159,80170,80175,80207,80251,80276,80289,80291,5457, 79910,9209, 6834, 79912,343, 79913,79914,8419, 79915,9262, 46796,317, 79911, 427, 317, 5120, 57323,317, 317, 345, 2022, 317, 317, 317, 79916,317, 79918,79919,79920,4949, 79921,79927,551, 1999, 79922,332, 5969, 79923,79926,79924, - 79925,1347, 21470,65068,79929,2279, 79932,79938,79943,79950,79954,741, 883, 79955,79963,79930,990, 79931,317, 574, 21955,5459, 2024, 79933,79935,317, 2537, - 317, 79934,490, 8748, 79936,79937,35409,317, 79939,79941,79940,79942,317, 79944,79945,79946,332, 69641,79947,79948,79949,79951,6691, 6954, 79953,7910, 1160, - 79952,317, 362, 4980, 317, 1020, 574, 370, 317, 79956,79958,2326, 79962,79957,7986, 2571, 317, 12277,79959,317, 867, 79960,317, 5037, 25279,79961,490, + 79925,1347, 21470,65068,79929,2279, 79932,79938,79943,79950,79954,741, 883, 79955,79963,79930,990, 79931,317, 574, 21955,5459, 2024, 79933,79935,317, 2537, + 317, 79934,490, 8748, 79936,79937,35409,317, 79939,79941,79940,79942,317, 79944,79945,79946,332, 69641,79947,79948,79949,79951,6691, 6954, 79953,7910, 1160, + 79952,317, 362, 4980, 317, 1020, 574, 370, 317, 79956,79958,2326, 79962,79957,7986, 2571, 317, 12277,79959,317, 867, 79960,317, 5037, 25279,79961,490, 345, 6565, 6387, 490, 317, 6379, 317, 8925, 490, 317, 4462, 79965,79968,362, 79986,350, 565, 79987,79988,34344,79989,8405, 490, 47847,79966,490, 79967, 317, 20167,5392, 490, 2280, 317, 363, 490, 79969,317, 2322, 317, 79970,345, 79979,362, 317, 79984,79971,1597, 79973,79972,79974,79975,79976,79977,79978, 79980,79981,79982,79983,79985,363, 404, 317, 17760,317, 36631,317, 79990,6964, 79991,13466,6614, 590, 26065,317, 348, 450, 79993,5611, 79994,79995,43038, - 79999,80000,80002,1548, 80005,2110, 317, 13670,343, 11809,351, 44696,79996,317, 79998,317, 79997,9298, 1347, 317, 384, 317, 511, 596, 345, 490, 317, + 79999,80000,80002,1548, 80005,2110, 317, 13670,343, 11809,351, 44696,79996,317, 79998,317, 79997,9298, 1347, 317, 384, 317, 511, 596, 345, 490, 317, 38707,490, 80001,5623, 1347, 80003,351, 317, 365, 553, 80004,410, 80006,79404,10877,19504,80007,80008,80009,80011,80012,80013,80016,80020,80021,80025,80027, 362, 80014,17449,317, 80015,5570, 351, 80017,80018,317, 317, 80019,363, 20265,80022,80023,80024,9289, 316, 9321, 5689, 80026,351, 363, 2322, 7834, 80028, 317, 80029,317, 317, 317, 17583,80032,380, 80033,80034,80035,80036,6638, 2532, 46188,80037,80039,80043,80044,365, 80047,80053,80040,26912,317, 7155, 80041, 80042,317, 69495,317, 80045,80046,80048,80049,80050,80051,80052,80054,80055,80056,8177, 317, 80058,80061,80063,80065,80066,34442,80067,80068,80069,80122,80123, 9993, 1100, 501, 6318, 80059,80060,317, 574, 44892,15100,5711, 4984, 80062,8569, 345, 80064,348, 2142, 317, 317, 7408, 8224, 9554, 501, 2845, 5836, 80070, - 80106,80120,10519,80121,50087,2584, 317, 80071,490, 80073,80075,80076,80078,80081,80083,80087,80089,317, 80094,80095,80097,80101,80102,80103,2035, 317, 345, - 25016,80072,80074,9504, 2146, 76375,13846,6726, 80077,22323,80079,80080,80082,343, 476, 4591, 317, 317, 490, 80084,57323,490, 80085,80086,11836,1109, 2086, - 2086, 80088,380, 317, 9064, 2146, 448, 80090,317, 18387,343, 80091,80092,490, 5711, 490, 80093,7062, 9702, 80096,80098,317, 19351,4984, 80100,317, 490, + 80106,80120,10519,80121,50087,2584, 317, 80071,490, 80073,80075,80076,80078,80081,80083,80087,80089,317, 80094,80095,80097,80101,80102,80103,2035, 317, 345, + 25016,80072,80074,9504, 2146, 76375,13846,6726, 80077,22323,80079,80080,80082,343, 476, 4591, 317, 317, 490, 80084,57323,490, 80085,80086,11836,1109, 2086, + 2086, 80088,380, 317, 9064, 2146, 448, 80090,317, 18387,343, 80091,80092,490, 5711, 490, 80093,7062, 9702, 80096,80098,317, 19351,4984, 80100,317, 490, 80099,433, 2134, 2134, 2035, 36463,345, 8219, 80104,80105,4591, 490, 80107,6409, 80108,9364, 80112,80114,1020, 80115,80116,80118,80119,80109,80110,80111,80113, 1347, 50196,80117,551, 9702, 2510, 9702, 596, 317, 25386,80125,15179,2369, 317, 80127,80130,80131,80137,80141,2222, 317, 80142,343, 80143,4952, 80145,80147, - 9779, 80153,80154,1060, 53355,80158,1588, 5105, 317, 13233,80128,80129,317, 80132,80135,317, 3941, 80133,596, 317, 596, 80134,5611, 80136,317, 40125,5619, + 9779, 80153,80154,1060, 53355,80158,1588, 5105, 317, 13233,80128,80129,317, 80132,80135,317, 3941, 80133,596, 317, 596, 80134,5611, 80136,317, 40125,5619, 80138,80139,11418,2381, 41229,80140,317, 545, 565, 4952, 317, 317, 317, 22597,551, 9182, 14810,7514, 382, 363, 490, 317, 80144,16651,80146,317, 80148, - 80151,80149,80150,80152,2369, 380, 363, 80155,80156,80157,2509, 363, 490, 6923, 2568, 80160,2134, 317, 80161,80162,80166,539, 80168,2081, 574, 317, 5446, - 80163,80165,7098, 80164,80167,381, 317, 6514, 317, 80169,949, 80171,80173,439, 16438,317, 80172,80174,637, 1266, 317, 633, 317, 1353, 1915, 362, 317, - 80176,16876,19617,80181,80184,80190,2298, 80193,80195,80196,80203,365, 357, 317, 80177,80180,317, 80178,80179,17454,80182,1347, 80183,80185,6780, 80186,6420, - 317, 80187,80188,317, 5105, 80189,317, 5421, 317, 317, 370, 80191,7327, 5055, 80192,371, 80194,56278,317, 8323, 370, 488, 12756,317, 80197,80198,404, + 80151,80149,80150,80152,2369, 380, 363, 80155,80156,80157,2509, 363, 490, 6923, 2568, 80160,2134, 317, 80161,80162,80166,539, 80168,2081, 574, 317, 5446, + 80163,80165,7098, 80164,80167,381, 317, 6514, 317, 80169,949, 80171,80173,439, 16438,317, 80172,80174,637, 1266, 317, 633, 317, 1353, 1915, 362, 317, + 80176,16876,19617,80181,80184,80190,2298, 80193,80195,80196,80203,365, 357, 317, 80177,80180,317, 80178,80179,17454,80182,1347, 80183,80185,6780, 80186,6420, + 317, 80187,80188,317, 5105, 80189,317, 5421, 317, 317, 370, 80191,7327, 5055, 80192,371, 80194,56278,317, 8323, 370, 488, 12756,317, 80197,80198,404, 1347, 80200,317, 365, 4249, 80199,7986, 370, 80201,345, 80202,317, 80204,381, 58156,6551, 26271,80205,80206,80208,370, 80212,80219,80220,80227,350, 80233, - 80235,80239,80240,80241,80245,80247,343, 80209,80211,317, 11809,80210,80213,31485,490, 80215,80214,42074,343, 2715, 79944,80216,80217,317, 80218,370, 476, - 317, 13062,317, 317, 317, 380, 80221,80222,64151,2146, 80223,80224,80225,80226,21417,371, 80228,80229,80231,80230,317, 14662,317, 80232,356, 3999, 2510, + 80235,80239,80240,80241,80245,80247,343, 80209,80211,317, 11809,80210,80213,31485,490, 80215,80214,42074,343, 2715, 79944,80216,80217,317, 80218,370, 476, + 317, 13062,317, 317, 317, 380, 80221,80222,64151,2146, 80223,80224,80225,80226,21417,371, 80228,80229,80231,80230,317, 14662,317, 80232,356, 3999, 2510, 317, 5226, 5167, 339, 80234,5295, 1347, 2317, 80236,5295, 80237,80238,14645,317, 362, 1347, 317, 2381, 80242,80243,80244,370, 317, 18587,65612,80246,80248, 80249,80250,80252,80257,80261,80262,12796,80265,80267,80269,80275,2462, 317, 80253,80254,8365, 80256,36102,490, 317, 9779, 8419, 18907,317, 80255,370, 74812, - 317, 1109, 6227, 490, 317, 370, 317, 3428, 51054,490, 7990, 9573, 317, 80258,317, 80260,393, 317, 317, 80259,867, 6387, 317, 80263,5033, 49396,317, - 80264,9215, 343, 80266,5570, 5727, 80268,317, 79790,317, 80270,80271,596, 80272,427, 343, 80273,317, 80274,7386, 2142, 317, 80277,80280,80285,80288,343, + 317, 1109, 6227, 490, 317, 370, 317, 3428, 51054,490, 7990, 9573, 317, 80258,317, 80260,393, 317, 317, 80259,867, 6387, 317, 80263,5033, 49396,317, + 80264,9215, 343, 80266,5570, 5727, 80268,317, 79790,317, 80270,80271,596, 80272,427, 343, 80273,317, 80274,7386, 2142, 317, 80277,80280,80285,80288,343, 362, 80278,2413, 3688, 80279,317, 317, 317, 490, 2829, 80281,80283,80284,317, 80282,2610, 345, 80286,490, 6441, 64347,332, 363, 58794,317, 62487,13338, 80287,80290,5055, 317, 80292,80294,2035, 80298,2391, 27819,80302,80293,80295,5570, 80296,490, 80297,80299,2510, 80300,80301,80304,80305,80308,80310,80312,80316, 80317,80306,80307,80309,604, 3658, 1791, 80311,80313,34691,19278,80314,80315,80318,80320,80319,80321,80323,80324,80327,80325,80326,80328,80329,80330,80332,80359, @@ -12415,341 +12410,341 @@ static const unsigned int ChildLocs[185261] = 80342,80345,80350,80353,80343,80344,80346,80347,317, 80348,80349,80351,80352,80354,80356,80358,365, 339, 7116, 5355, 80361,80363,490, 80365,490, 14062,80366, 80367,80368,80369,80385,80388,80396,345, 80404,80415,596, 80419,80475,80476,80534,6231, 80544,80571,80577,80581,80582,80587,80589,80592,80599,80370,5241, 80381, 80382,317, 566, 317, 317, 80371,80373,10436,80372,80374,370, 5087, 80378,363, 80375,39805,80376,80377,317, 80379,80380,80383,80384,80386,350, 39970,15090, - 80387,426, 7035, 11952,8178, 317, 17469,80389,345, 80390,80394,80391,350, 80393,317, 80392,317, 39575,80395,9938, 2108, 363, 345, 80397,80402,80403,8506, - 80398,52425,317, 351, 80399,362, 17109,80401,2357, 80400,439, 4965, 439, 39357,362, 317, 80405,5273, 80407,10578,14991,317, 317, 80409,80411,80412,317, + 80387,426, 7035, 11952,8178, 317, 17469,80389,345, 80390,80394,80391,350, 80393,317, 80392,317, 39575,80395,9938, 2108, 363, 345, 80397,80402,80403,8506, + 80398,52425,317, 351, 80399,362, 17109,80401,2357, 80400,439, 4965, 439, 39357,362, 317, 80405,5273, 80407,10578,14991,317, 317, 80409,80411,80412,317, 80406,466, 317, 2571, 5005, 32473,317, 4268, 80408,551, 80410,317, 317, 350, 1588, 80413,80414,19170,14071,54422,490, 80416,80417,317, 2108, 332, 80418, - 23928,80420,80423,80424,80429,80432,80434,80435,80436,80438,80447,80453,15745,80454,80457,80459,80460,80463,80472,19287,317, 2146, 24804,80421,80422,1999, 6593, + 23928,80420,80423,80424,80429,80432,80434,80435,80436,80438,80447,80453,15745,80454,80457,80459,80460,80463,80472,19287,317, 2146, 24804,80421,80422,1999, 6593, 80425,80428,45496,80426,10393,80427,345, 10253,80430,80431,317, 351, 21274,317, 80433,15017,554, 2271, 317, 14358,80437,5226, 490, 80439,8281, 80440,11608, - 80441,80442,345, 8488, 5184, 396, 1109, 80443,80445,80446,80444,439, 28586,80448,384, 80452,9289, 14826,7385, 80449,317, 574, 80450,28707,39341,80451,317, - 12696,14537,351, 351, 2193, 80455,2004, 5223, 19287,490, 80456,317, 64035,317, 24038,80458,2272, 317, 365, 355, 80461,2549, 363, 404, 317, 5654, 317, - 2156, 80462,80464,80465,80470,5241, 80471,11920,8272, 80466,21495,80467,80468,80469,356, 59408,317, 345, 5482, 317, 80473,317, 1624, 2731, 79901,80474,839, + 80441,80442,345, 8488, 5184, 396, 1109, 80443,80445,80446,80444,439, 28586,80448,384, 80452,9289, 14826,7385, 80449,317, 574, 80450,28707,39341,80451,317, + 12696,14537,351, 351, 2193, 80455,2004, 5223, 19287,490, 80456,317, 64035,317, 24038,80458,2272, 317, 365, 355, 80461,2549, 363, 404, 317, 5654, 317, + 2156, 80462,80464,80465,80470,5241, 80471,11920,8272, 80466,21495,80467,80468,80469,356, 59408,317, 345, 5482, 317, 80473,317, 1624, 2731, 79901,80474,839, 80477,80479,80484,80486,351, 80494,80498,80510,80511,80515,80521,80522,80529,80532,80478,316, 971, 80480,80481,371, 11940,80482,80483,80485,373, 317, 80487, - 80490,80491,80492,80488,342, 80489,3987, 565, 2260, 6645, 25114,80493,971, 317, 317, 971, 80495,80496,80497,380, 80499,2381, 80503,80506,80508,80509,1230, + 80490,80491,80492,80488,342, 80489,3987, 565, 2260, 6645, 25114,80493,971, 317, 317, 971, 80495,80496,80497,380, 80499,2381, 80503,80506,80508,80509,1230, 80500,80501,80502,44883,44883,80504,80505,80507,2004, 44882,11940,3505, 80512,80513,80514,80516,80517,80518,80519,80520,80523,80526,6338, 80528,80524,362, 80525, - 2219, 80527,3243, 1020, 80530,80531,80533,80535,356, 317, 382, 80538,80536,80537,317, 6996, 317, 633, 80539,9938, 80541,80540,29424,80542,80543,80545,2163, + 2219, 80527,3243, 1020, 80530,80531,80533,80535,356, 317, 382, 80538,80536,80537,317, 6996, 317, 633, 80539,9938, 80541,80540,29424,80542,80543,80545,2163, 343, 80548,348, 80549,29424,80550,404, 80552,80553,80554,80559,80563,80564,317, 80568,80546,317, 80547,390, 371, 971, 5727, 596, 596, 3505, 2193, 80551, - 73085,10538,339, 345, 3529, 2022, 80555,80557,317, 11104,18333,80556,48900,80558,80560,80561,80562,32982,317, 2381, 350, 80565,80566,80567,478, 80569,406, + 73085,10538,339, 345, 3529, 2022, 80555,80557,317, 11104,18333,80556,48900,80558,80560,80561,80562,32982,317, 2381, 350, 80565,80566,80567,478, 80569,406, 80570,1915, 80572,317, 596, 80573,1481, 80574,4591, 350, 12994,80575,80576,10580,2063, 43411,5105, 371, 80578,5394, 317, 5395, 80579,22894,80580,490, 14461, - 471, 7722, 348, 317, 80583,43829,345, 1912, 80584,317, 80586,5074, 80585,80588,466, 596, 317, 380, 80590,80591,80593,80596,596, 971, 80594,80595,466, + 471, 7722, 348, 317, 80583,43829,345, 1912, 80584,317, 80586,5074, 80585,80588,466, 596, 317, 380, 80590,80591,80593,80596,596, 971, 80594,80595,466, 317, 64332,317, 2510, 317, 80597,80598,80601,80602,332, 80604,80605,80606,80607,80608,80610,80615,80616,80627,80631,338, 80633,80611,9929, 363, 80612,68113, 2134, 380, 8231, 317, 8852, 80613,343, 80614,80617,80619,80622,80623,80618,80620,2035, 80621,6598, 501, 4952, 362, 80624,80625,80626,345, 80628,343, 80629, - 345, 28220,343, 80630,362, 80632,80634,80635,317, 77641,80637,77641,80640,80644,2004, 1020, 80638,80639,80641,80642,80643,339, 80646,80651,80652,80657,380, + 345, 28220,343, 80630,362, 80632,80634,80635,317, 77641,80637,77641,80640,80644,2004, 1020, 80638,80639,80641,80642,80643,339, 80646,80651,80652,80657,380, 80660,80661,80647,80649,80650,80648,19106,19074,80653,80654,80655,80656,80658,80659,80662,5211, 80663,80664,80666,80667,80668,80670,80674,80679,80689,80691,80692, 6755, 14991,80669,80671,2067, 80672,80673,8384, 22945,80675,2108, 80677,80676,80678,351, 9768, 5419, 80680,2108, 362, 332, 80685,596, 80688,490, 80681,80682, 80684,343, 80683,80686,80687,80690,317, 332, 17160,332, 80693,80694,80695,80697,4150, 80698,80699,80701,13650,7566, 80705,80702,80703,80704,80706,80708,19283, 80710,460, 466, 80711,80722,80724,6138, 80709,1109, 80712,80718,80713,80714,80715,80716,80717,80719,80720,80721,80723,7149, 5295, 80725,80729,80731,80743,80749, 80754,80756,80760,7869, 293, 81225,81226,81234,295, 81614,81615,296, 298, 82260,82261,82264,82282,82288,301, 82550,82559,82561,82613,82618,82627,82678,82680, 82694,82697,56281,80726,4797, 11077,4797, 4797, 80727,80728,80730,45290,11091,80732,80737,80733,80734,80735,80736,80738,80739,80740,80741,80742,80744,80745,80746, - 80747,80748,80750,80751,80752,80753,80755,80757,80758,80759,80761,2601, 80764,80762,80763,80765,80768,80770,80784,80794,80798,80803,80820,80835,80859,80860,294, + 80747,80748,80750,80751,80752,80753,80755,80757,80758,80759,80761,2601, 80764,80762,80763,80765,80768,80770,80784,80794,80798,80803,80820,80835,80859,80860,294, 80953,80959,80982,80991,80993,81081,81118,81168,81179,81192,81195,81198,81216,80766,7785, 317, 5891, 317, 80767,46514,317, 80769,2036, 317, 317, 343, 10898, - 7939, 59714,80771,317, 80773,80777,80782,317, 80783,2146, 371, 80772,380, 80774,80775,80776,14491,317, 5241, 12054,12731,350, 80764,80778,362, 1347, 317, - 317, 80779,80781,80780,15899,370, 1347, 80785,80790,2024, 8117, 80791,3078, 80792,362, 40690,61831,10956,5295, 11346,80786,80787,2156, 80788,5737, 1109, 5105, - 317, 2070, 371, 380, 5861, 80789,11442,317, 5105, 362, 490, 16941,80793,69221,605, 80795,2568, 2105, 80796,80797,349, 38047,317, 317, 2510, 80799,317, - 511, 2381, 80800,2156, 551, 80801,80802,25352,317, 80804,80806,80808,466, 12141,362, 80810,80813,80815,80816,20937,80817,317, 362, 350, 317, 80805,317, - 5662, 80807,5273, 317, 565, 80368,351, 6599, 13387,11905,16433,80809,466, 350, 14852,317, 80811,12696,80812,80814,7191, 317, 427, 19902,80818,80819,367, - 490, 80821,80822,80824,80827,80829,2222, 80832,80833,317, 317, 317, 356, 80823,80825,80826,317, 80828,5896, 80830,3023, 362, 6601, 18839,439, 80831,8488, - 6379, 553, 80834,54798,404, 590, 2134, 80836,317, 471, 80838,80839,2081, 80840,80848,80850,80853,24577,80837,2322, 11831,65454,466, 351, 332, 80841,362, - 2301, 80844,7053, 80842,80843,80845,80846,80847,80849,490, 77143,317, 80851,362, 350, 317, 80852,501, 390, 4952, 12151,428, 80854,80857,343, 3999, 4591, - 362, 80858,317, 5397, 317, 57166,80855,13559,490, 80856,317, 5266, 1347, 317, 17239,17791,80861,80864,554, 80872,2022, 317, 15799,80862,11484,11749,8926, + 7939, 59714,80771,317, 80773,80777,80782,317, 80783,2146, 371, 80772,380, 80774,80775,80776,14491,317, 5241, 12054,12731,350, 80764,80778,362, 1347, 317, + 317, 80779,80781,80780,15899,370, 1347, 80785,80790,2024, 8117, 80791,3078, 80792,362, 40690,61831,10956,5295, 11346,80786,80787,2156, 80788,5737, 1109, 5105, + 317, 2070, 371, 380, 5861, 80789,11442,317, 5105, 362, 490, 16941,80793,69221,605, 80795,2568, 2105, 80796,80797,349, 38047,317, 317, 2510, 80799,317, + 511, 2381, 80800,2156, 551, 80801,80802,25352,317, 80804,80806,80808,466, 12141,362, 80810,80813,80815,80816,20937,80817,317, 362, 350, 317, 80805,317, + 5662, 80807,5273, 317, 565, 80368,351, 6599, 13387,11905,16433,80809,466, 350, 14852,317, 80811,12696,80812,80814,7191, 317, 427, 19902,80818,80819,367, + 490, 80821,80822,80824,80827,80829,2222, 80832,80833,317, 317, 317, 356, 80823,80825,80826,317, 80828,5896, 80830,3023, 362, 6601, 18839,439, 80831,8488, + 6379, 553, 80834,54798,404, 590, 2134, 80836,317, 471, 80838,80839,2081, 80840,80848,80850,80853,24577,80837,2322, 11831,65454,466, 351, 332, 80841,362, + 2301, 80844,7053, 80842,80843,80845,80846,80847,80849,490, 77143,317, 80851,362, 350, 317, 80852,501, 390, 4952, 12151,428, 80854,80857,343, 3999, 4591, + 362, 80858,317, 5397, 317, 57166,80855,13559,490, 80856,317, 5266, 1347, 317, 17239,17791,80861,80864,554, 80872,2022, 317, 15799,80862,11484,11749,8926, 80863,80865,80868,554, 80870,362, 80871,317, 317, 1060, 317, 80866,80867,6598, 551, 80869,439, 370, 466, 317, 9575, 490, 80873,80874,80876,80879,80888, - 2024, 80890,57654,80893,80894,80908,80930,80931,675, 80932,6601, 80933,80935,80941,439, 80950,80952,35308,382, 317, 13648,29457,479, 80875,479, 317, 6594, - 6864, 9696, 61919,80877,317, 2117, 2117, 80878,371, 3023, 365, 9878, 39326,80880,80883,16651,5662, 350, 80884,80885,25351,71991,14470,80881,565, 80882,4980, - 9444, 2405, 6703, 8421, 2948, 3529, 317, 10592,317, 396, 317, 427, 7463, 80886,80887,1060, 396, 317, 1060, 1358, 1060, 356, 490, 490, 80889,10046,6648, - 45460,317, 7850, 80891,80892,3284, 317, 5423, 11198,350, 80895,501, 80897,80899,13258,80903,350, 80906,317, 80907,43203,7405, 80896,317, 69317,80898,317, - 317, 80900,80901,28208,80902,404, 80904,80905,381, 350, 12054,80909,80911,80913,80917,3023, 80918,80921,8023, 362, 350, 80923,80925,66175,80927,12423,1160, - 5201, 80910,1999, 350, 10632,2066, 2022, 317, 5942, 5216, 317, 80912,4949, 5840, 371, 317, 80914,80916,317, 8488, 19665,80915,490, 9012, 2271, 4949, 2584, - 2108, 9012, 2997, 371, 317, 80919,2222, 80920,317, 351, 2024, 404, 80922,390, 80924,5055, 317, 317, 20115,80926,57847,439, 80928,80929,53140,351, 2021, + 2024, 80890,57654,80893,80894,80908,80930,80931,675, 80932,6601, 80933,80935,80941,439, 80950,80952,35308,382, 317, 13648,29457,479, 80875,479, 317, 6594, + 6864, 9696, 61919,80877,317, 2117, 2117, 80878,371, 3023, 365, 9878, 39326,80880,80883,16651,5662, 350, 80884,80885,25351,71991,14470,80881,565, 80882,4980, + 9444, 2405, 6703, 8421, 2948, 3529, 317, 10592,317, 396, 317, 427, 7463, 80886,80887,1060, 396, 317, 1060, 1358, 1060, 356, 490, 490, 80889,10046,6648, + 45460,317, 7850, 80891,80892,3284, 317, 5423, 11198,350, 80895,501, 80897,80899,13258,80903,350, 80906,317, 80907,43203,7405, 80896,317, 69317,80898,317, + 317, 80900,80901,28208,80902,404, 80904,80905,381, 350, 12054,80909,80911,80913,80917,3023, 80918,80921,8023, 362, 350, 80923,80925,66175,80927,12423,1160, + 5201, 80910,1999, 350, 10632,2066, 2022, 317, 5942, 5216, 317, 80912,4949, 5840, 371, 317, 80914,80916,317, 8488, 19665,80915,490, 9012, 2271, 4949, 2584, + 2108, 9012, 2997, 371, 317, 80919,2222, 80920,317, 351, 2024, 404, 80922,390, 80924,5055, 317, 317, 20115,80926,57847,439, 80928,80929,53140,351, 2021, 6036, 4268, 80934,66451,345, 428, 80936,12946,80938,13177,363, 80939,5809, 80937,356, 367, 363, 80940,80942,80946,501, 61340,350, 49562,80949,317, 20664, - 80943,10550,80944,545, 2405, 317, 1011, 30881,80945,7450, 7618, 5888, 363, 80947,2510, 19460,380, 80948,2521, 1060, 80951,345, 2024, 384, 80954,16187,317, + 80943,10550,80944,545, 2405, 317, 1011, 30881,80945,7450, 7618, 5888, 363, 80947,2510, 19460,380, 80948,2521, 1060, 80951,345, 2024, 384, 80954,16187,317, 1194, 80955,80956,12651,7940, 343, 16018,80957,350, 11533,427, 80958,80960,5896, 80961,80962,80966,380, 80967,80970,80971,80973,80975,4591, 34820,80978,80980, - 10081,362, 80981,490, 16092,317, 1160, 80963,39187,80965,20869,5105, 80964,10422,10877,2026, 2161, 317, 1109, 317, 7522, 80968,5896, 37816,80969,350, 317, - 4976, 8613, 17366,10561,490, 80972,350, 466, 317, 427, 80974,476, 317, 80976,80977,4962, 558, 2156, 16092,1481, 558, 970, 351, 80979,2022, 11089,382, + 10081,362, 80981,490, 16092,317, 1160, 80963,39187,80965,20869,5105, 80964,10422,10877,2026, 2161, 317, 1109, 317, 7522, 80968,5896, 37816,80969,350, 317, + 4976, 8613, 17366,10561,490, 80972,350, 466, 317, 427, 80974,476, 317, 80976,80977,4962, 558, 2156, 16092,1481, 558, 970, 351, 80979,2022, 11089,382, 2298, 7091, 356, 28250,4952, 4984, 55609,384, 317, 317, 80983,80984,80987,2715, 80988,596, 80989,80990,80985,80986,351, 317, 80992,949, 80994,80995,80997, - 81002,81007,81017,81021,81024,81026,81035,81036,81038,81041,81048,81052,81053,81055,81069,81073,81078,317, 81079,8748, 80996,317, 15951,2081, 384, 80998,2509, - 4476, 80999,81000,5538, 356, 2719, 81001,81003,81004,380, 578, 380, 81005,81006,81008,81009,81010,81011,81012,362, 81013,81014,81016,3987, 605, 317, 605, - 1060, 81015,1060, 1597, 5809, 542, 5126, 81018,466, 17803,317, 317, 427, 2948, 2060, 81019,81020,81022,380, 81023,551, 578, 17477,81025,1325, 81027,7499, - 81033,11918,81028,5962, 351, 81029,81030,81031,81032,81034,393, 371, 490, 43966,4965, 317, 81037,5809, 370, 81039,81040,371, 343, 382, 13715,14549,317, - 81042,81043,30957,81045,490, 370, 545, 317, 390, 81047,371, 317, 390, 350, 6089, 81044,4984, 81046,5862, 349, 81049,5896, 553, 81050,81051,10907,384, + 81002,81007,81017,81021,81024,81026,81035,81036,81038,81041,81048,81052,81053,81055,81069,81073,81078,317, 81079,8748, 80996,317, 15951,2081, 384, 80998,2509, + 4476, 80999,81000,5538, 356, 2719, 81001,81003,81004,380, 578, 380, 81005,81006,81008,81009,81010,81011,81012,362, 81013,81014,81016,3987, 605, 317, 605, + 1060, 81015,1060, 1597, 5809, 542, 5126, 81018,466, 17803,317, 317, 427, 2948, 2060, 81019,81020,81022,380, 81023,551, 578, 17477,81025,1325, 81027,7499, + 81033,11918,81028,5962, 351, 81029,81030,81031,81032,81034,393, 371, 490, 43966,4965, 317, 81037,5809, 370, 81039,81040,371, 343, 382, 13715,14549,317, + 81042,81043,30957,81045,490, 370, 545, 317, 390, 81047,371, 317, 390, 350, 6089, 81044,4984, 81046,5862, 349, 81049,5896, 553, 81050,81051,10907,384, 13610,1108, 553, 317, 2024, 5793, 380, 1347, 317, 317, 371, 10878,317, 1453, 1230, 81054,356, 35634,9540, 536, 317, 501, 2369, 390, 81056,81059,81062, 81066,379, 81057,33890,81058,356, 596, 2571, 317, 317, 332, 380, 81060,317, 350, 81061,7910, 404, 371, 351, 2402, 81063,81065,317, 351, 81064,81067, - 81068,81070,17039,81071,7871, 343, 363, 2627, 2298, 6900, 81072,6736, 317, 7911, 16876,81074,81075,81076,362, 363, 81077,317, 9567, 345, 363, 10878,343, + 81068,81070,17039,81071,7871, 343, 363, 2627, 2298, 6900, 81072,6736, 317, 7911, 16876,81074,81075,81076,362, 363, 81077,317, 9567, 345, 363, 10878,343, 14938,23199,2272, 81080,11336,81082,81083,81084,81087,81088,81099,81101,317, 81104,81106,36974,1347, 81107,81112,2390, 81115,81117,350, 1030, 363, 81085,81086, 317, 81089,81090,48845,81091,81092,332, 350, 33156,2584, 81096,5205, 20545,81097,81098,317, 550, 9695, 479, 351, 317, 380, 6578, 317, 81093,490, 81094, - 3284, 404, 81095,971, 28124,317, 81100,317, 2219, 317, 489, 8296, 332, 490, 317, 370, 81102,81103,351, 81105,71490,81108,81111,5662, 363, 44767,5105, + 3284, 404, 81095,971, 28124,317, 81100,317, 2219, 317, 489, 8296, 332, 490, 317, 370, 81102,81103,351, 81105,71490,81108,81111,5662, 363, 44767,5105, 81109,81110,565, 5896, 5662, 9012, 1345, 78648,990, 81113,3999, 363, 81114,317, 379, 31023,317, 317, 7688, 81116,42575,605, 371, 19913,350, 81119,81124, 81127,2024, 437, 81157,81158,10223,81159,81160,81163,81167,6089, 71185,81120,81123,590, 2078, 6551, 81121,81122,81125,317, 7913, 38168,8020, 379, 28250,47492, - 81126,32226,466, 81128,317, 1266, 81129,81132,5991, 81137,2413, 81139,466, 81141,81143,81145,81149,81152,81153,81154,317, 356, 33202,81130,448, 81131,2272, + 81126,32226,466, 81128,317, 1266, 81129,81132,5991, 81137,2413, 81139,466, 81141,81143,81145,81149,81152,81153,81154,317, 356, 33202,81130,448, 81131,2272, 1347, 81133,81136,81134,64165,81135,57240,6598, 81138,8254, 81140,2156, 393, 476, 2272, 81142,30674,7941, 24041,81144,4563, 49082,317, 406, 9301, 81146,81147, - 81148,317, 81150,2261, 81151,363, 48630,404, 6355, 1060, 530, 11783,5038, 22460,1531, 3652, 81155,81156,439, 6036, 6000, 380, 466, 4591, 317, 317, 370, - 81161,3284, 81162,81164,25180,81166,363, 4980, 590, 81165,38461,81169,317, 351, 2024, 81171,81173,81175,18794,81176,2188, 81177,81170,450, 81172,81174,362, - 1459, 81178,317, 81180,3999, 81189,81191,490, 317, 317, 81181,81183,81184,81187,81188,1160, 8381, 8254, 81182,81185,317, 81186,1347, 370, 8647, 356, 466, + 81148,317, 81150,2261, 81151,363, 48630,404, 6355, 1060, 530, 11783,5038, 22460,1531, 3652, 81155,81156,439, 6036, 6000, 380, 466, 4591, 317, 317, 370, + 81161,3284, 81162,81164,25180,81166,363, 4980, 590, 81165,38461,81169,317, 351, 2024, 81171,81173,81175,18794,81176,2188, 81177,81170,450, 81172,81174,362, + 1459, 81178,317, 81180,3999, 81189,81191,490, 317, 317, 81181,81183,81184,81187,81188,1160, 8381, 8254, 81182,81185,317, 81186,1347, 370, 8647, 356, 466, 5661, 15334,81190,317, 44702,81193,10997,81194,81196,5464, 466, 350, 362, 33883,317, 81197,2809, 81199,81201,81202,343, 4965, 81206,6089, 81207,81210,81212, - 385, 32249,81215,1347, 550, 81200,9609, 81203,81205,11373,81204,396, 5295, 9644, 551, 81208,363, 81209,81211,12907,1588, 363, 317, 1525, 81213,384, 317, - 317, 317, 81214,36269,5037, 317, 81217,332, 81219,81218,81220,1060, 81221,81222,81223,81224,38196,427, 19287,81227,67287,590, 345, 8896, 26830,81229,380, + 385, 32249,81215,1347, 550, 81200,9609, 81203,81205,11373,81204,396, 5295, 9644, 551, 81208,363, 81209,81211,12907,1588, 363, 317, 1525, 81213,384, 317, + 317, 317, 81214,36269,5037, 317, 81217,332, 81219,81218,81220,1060, 81221,81222,81223,81224,38196,427, 19287,81227,67287,590, 345, 8896, 26830,81229,380, 81233,590, 367, 317, 81228,81230,81231,81232,8827, 81235,75562,81236,81262,81293,81302,81317,81334,81335,81344,81350,81425,81430,81433,81462,81466,81497,81498, - 81527,81584,434, 350, 81603,81605,81606,350, 15513,350, 81237,81238,81240,81244,81245,81248,81251,81252,81261,380, 343, 13611,16248,81239,30793,317, 439, + 81527,81584,434, 350, 81603,81605,81606,350, 15513,350, 81237,81238,81240,81244,81245,81248,81251,81252,81261,380, 343, 13611,16248,81239,30793,317, 439, 35604,466, 317, 81241,351, 81242,363, 10354,81243,26394,317, 81246,81247,410, 6195, 81249,71110,370, 14806,317, 317, 81250,1347, 12138,52497,317, 81253, 81254,5537, 81255,317, 428, 81256,356, 12556,81257,81259,5661, 10149,81260,9298, 3710, 343, 550, 317, 355, 81258,14146,12448,5394, 35085,2603, 81263,81264, - 81266,901, 81268,81271,2036, 81272,81273,345, 81276,343, 81278,81287,81288,2271, 14337,40111,317, 317, 81265,29838,1347, 4268, 81267,355, 81269,81270,1032, - 55697,81274,317, 81275,81277,30314,5689, 81279,11336,81286,81280,694, 81281,81282,81283,81284,81285,81289,81290,81291,81292,81294,81299,81295,350, 81296,350, + 81266,901, 81268,81271,2036, 81272,81273,345, 81276,343, 81278,81287,81288,2271, 14337,40111,317, 317, 81265,29838,1347, 4268, 81267,355, 81269,81270,1032, + 55697,81274,317, 81275,81277,30314,5689, 81279,11336,81286,81280,694, 81281,81282,81283,81284,81285,81289,81290,81291,81292,81294,81299,81295,350, 81296,350, 81297,81298,81300,16464,362, 81301,68174,5324, 81303,81309,81311,81313,23305,362, 81314,317, 317, 2391, 81304,81307,343, 317, 5105, 81305,10943,81306,81308, 81310,5105, 6596, 317, 81312,2156, 12612,317, 317, 317, 12612,81315,317, 81316,7055, 11840,32289,390, 81318,317, 81319,81320,317, 81322,81327,81328,81329, - 32485,20613,81330,81331,8882, 81333,6228, 842, 317, 10283,11089,466, 362, 363, 317, 317, 81321,7405, 81323,81325,81326,317, 81324,317, 317, 370, 596, - 466, 317, 317, 22560,19283,351, 363, 345, 16187,317, 351, 2156, 370, 427, 317, 81332,351, 317, 8587, 343, 1065, 501, 317, 81336,343, 16464,2134, + 32485,20613,81330,81331,8882, 81333,6228, 842, 317, 10283,11089,466, 362, 363, 317, 317, 81321,7405, 81323,81325,81326,317, 81324,317, 317, 370, 596, + 466, 317, 317, 22560,19283,351, 363, 345, 16187,317, 351, 2156, 370, 427, 317, 81332,351, 317, 8587, 343, 1065, 501, 317, 81336,343, 16464,2134, 81337,5662, 350, 81340,81343,16023,81338,81339,363, 38271,317, 81341,81342,605, 11607,12525,6021, 317, 511, 511, 81345,44566,81346,8741, 2369, 2366, 11196, 27765,6599, 466, 81347,81348,7568, 2310, 81349,471, 4984, 439, 81351,81352,81355,81359,81362,81370,81378,81379,26790,81381,1998, 81396,81399,81422,28836,81424, - 81353,10351,81354,380, 362, 317, 317, 81356,382, 350, 5662, 350, 8047, 5662, 81357,81358,5626, 6598, 7734, 81360,81361,81363,81364,81365,81368,362, 350, - 578, 356, 466, 317, 81366,356, 466, 81367,362, 317, 317, 39532,69947,81369,4965, 317, 81371,81372,81373,81374,81375,4984, 81376,81377,380, 31227,343, - 439, 81380,351, 317, 6204, 4949, 7389, 81382,21274,81383,81384,81387,4738, 3663, 4952, 5662, 81388,81391,81393,81394,12554,10560,4949, 578, 10761,81385,351, - 81386,317, 52197,7592, 578, 7477, 81389,81390,81392,1020, 384, 16863,28664,317, 10926,81395,3366, 350, 2219, 81397,81398,24638,317, 419, 2108, 30957,370, + 81353,10351,81354,380, 362, 317, 317, 81356,382, 350, 5662, 350, 8047, 5662, 81357,81358,5626, 6598, 7734, 81360,81361,81363,81364,81365,81368,362, 350, + 578, 356, 466, 317, 81366,356, 466, 81367,362, 317, 317, 39532,69947,81369,4965, 317, 81371,81372,81373,81374,81375,4984, 81376,81377,380, 31227,343, + 439, 81380,351, 317, 6204, 4949, 7389, 81382,21274,81383,81384,81387,4738, 3663, 4952, 5662, 81388,81391,81393,81394,12554,10560,4949, 578, 10761,81385,351, + 81386,317, 52197,7592, 578, 7477, 81389,81390,81392,1020, 384, 16863,28664,317, 10926,81395,3366, 350, 2219, 81397,81398,24638,317, 419, 2108, 30957,370, 2571, 6242, 81400,13288,81402,6598, 81406,81408,55672,14834,81410,350, 81413,81415,317, 81421,741, 81401,2063, 1453, 10561,317, 81403,317, 81404,317, 81405, 8948, 9012, 10560,479, 5898, 2033, 16871,81407,81407,81409,2036, 2708, 351, 317, 5765, 81411,15221,81412,81414,81416,81417,81420,4738, 350, 39128,4949, 55808, 81418,5223, 81419,15892,2108, 479, 4949, 351, 317, 11709,362, 13670,81423,5105, 362, 350, 9938, 32297,81426,81428,81427,81429,81431,81432,19283,9938, 43431, - 81434,81435,81440,81441,81442,81444,8756, 350, 317, 81457,81460,11607,11040,384, 479, 479, 317, 81436,81437,12731,362, 81438,81439,466, 1160, 1266, 317, - 317, 317, 317, 317, 317, 317, 16399,3999, 363, 317, 317, 1588, 380, 551, 4965, 81443,81445,81446,13631,7035, 81448,81450,81451,380, 5662, 81454,3079, + 81434,81435,81440,81441,81442,81444,8756, 350, 317, 81457,81460,11607,11040,384, 479, 479, 317, 81436,81437,12731,362, 81438,81439,466, 1160, 1266, 317, + 317, 317, 317, 317, 317, 317, 16399,3999, 363, 317, 317, 1588, 380, 551, 4965, 81443,81445,81446,13631,7035, 81448,81450,81451,380, 5662, 81454,3079, 81455,390, 511, 81447,2584, 81449,317, 9425, 7618, 9012, 81452,350, 81453,7063, 16187,317, 49082,14320,5309, 11761,81456,7035, 5037, 7850, 511, 81458,81459, - 363, 3079, 10149,535, 390, 81461,490, 317, 350, 363, 317, 317, 9064, 81463,12651,16187,350, 81465,476, 371, 81464,81467,81468,81472,81481,81484,554, - 81486,10185,2584, 362, 81487,2035, 24637,81490,81494,345, 81496,81469,317, 1453, 317, 81471,81470,428, 81473,81477,81478,81479,5138, 317, 1358, 6420, 2134, + 363, 3079, 10149,535, 390, 81461,490, 317, 350, 363, 317, 317, 9064, 81463,12651,16187,350, 81465,476, 371, 81464,81467,81468,81472,81481,81484,554, + 81486,10185,2584, 362, 81487,2035, 24637,81490,81494,345, 81496,81469,317, 1453, 317, 81471,81470,428, 81473,81477,81478,81479,5138, 317, 1358, 6420, 2134, 81474,317, 81476,81475,363, 501, 317, 317, 317, 332, 390, 22339,4965, 466, 81480,2181, 350, 371, 81482,317, 81483,81485,350, 13136,317, 10590,81488, 12704,81489,380, 81491,81492,362, 14575,81493,3987, 317, 4982, 16008,5809, 81495,9878, 64695,9878, 589, 4738, 317, 466, 81499,1220, 81500,81501,81503,81505, - 81506,81508,81510,81512,81513,81517,81518,81521,81522,373, 13650,317, 22924,2402, 7068, 81502,2402, 490, 40690,81504,81507,363, 4984, 81509,466, 12287,450, - 16024,675, 1345, 81511,317, 15138,350, 81514,350, 81515,365, 450, 1108, 317, 553, 5223, 381, 317, 81516,37635,8254, 382, 317, 81519,81520,317, 558, - 345, 382, 380, 2022, 13426,81523,637, 66258,81524,362, 317, 81526,5943, 81525,362, 396, 31822,42672,317, 949, 47526,81528,2856, 81530,6917, 81531,350, + 81506,81508,81510,81512,81513,81517,81518,81521,81522,373, 13650,317, 22924,2402, 7068, 81502,2402, 490, 40690,81504,81507,363, 4984, 81509,466, 12287,450, + 16024,675, 1345, 81511,317, 15138,350, 81514,350, 81515,365, 450, 1108, 317, 553, 5223, 381, 317, 81516,37635,8254, 382, 317, 81519,81520,317, 558, + 345, 382, 380, 2022, 13426,81523,637, 66258,81524,362, 317, 81526,5943, 81525,362, 396, 31822,42672,317, 949, 47526,81528,2856, 81530,6917, 81531,350, 81535,81537,81541,1358, 81529,317, 381, 8178, 1345, 9938, 317, 81532,81534,317, 317, 81533,81536,384, 8296, 81538,4738, 11249,362, 350, 81540,81539,12934, - 317, 11702,2193, 1347, 362, 317, 14361,81542,81543,81547,81549,81559,81561,81563,81564,539, 81566,81568,33878,81572,81577,81579,81581,81582,370, 317, 380, + 317, 11702,2193, 1347, 362, 317, 14361,81542,81543,81547,81549,81559,81561,81563,81564,539, 81566,81568,33878,81572,81577,81579,81581,81582,370, 317, 380, 1230, 32950,81544,81545,448, 317, 10454,28233,7368, 81546,12312,81548,13017,33398,22996,81550,81551,37773,55160,45851,490, 81552,32952,57517,81553,81555,81556, - 81557,81558,10538,16264,4949, 2260, 81554,1383, 52723,10147,317, 439, 317, 7662, 2236, 317, 2510, 7986, 9590, 317, 3505, 5038, 28348,81560,16923,551, 380, + 81557,81558,10538,16264,4949, 2260, 81554,1383, 52723,10147,317, 439, 317, 7662, 2236, 317, 2510, 7986, 9590, 317, 3505, 5038, 28348,81560,16923,551, 380, 44224,81562,45496,7592, 28066,1347, 81565,28239,6036, 81567,439, 317, 28789,81569,12593,81570,545, 350, 381, 81571,2369, 6563, 4952, 339, 14571,81573,81576, - 81574,81575,363, 5217, 1345, 317, 24638,81578,44767,317, 81580,350, 35353,81583,19632,2063, 6355, 350, 81585,23950,2077, 81588,81589,2401, 81593,2171, 2272, + 81574,81575,363, 5217, 1345, 317, 24638,81578,44767,317, 81580,350, 35353,81583,19632,2063, 6355, 350, 81585,23950,2077, 81588,81589,2401, 81593,2171, 2272, 48207,81594,81596,81601,81602,81586,81587,317, 81590,5537, 343, 22717,81591,578, 14146,428, 81592,317, 12590,11229,5737, 81595,2036, 2108, 81597,3999, 81599, - 363, 9012, 317, 81598,381, 7408, 351, 81600,2546, 15961,9878, 14865,9012, 371, 81604,1108, 380, 1481, 428, 2024, 350, 350, 38967,81607,81608,81609,1397, + 363, 9012, 317, 81598,381, 7408, 351, 81600,2546, 15961,9878, 14865,9012, 371, 81604,1108, 380, 1481, 428, 2024, 350, 350, 38967,81607,81608,81609,1397, 22338,64719,350, 38290,70498,4952, 81613,9914, 479, 81610,81611,317, 81612,10796,384, 19287,590, 2004, 81616,390, 81617,81618,81619,81663,81664,297, 81775, - 81776,2058, 81800,7878, 81802,81620,81622,317, 574, 81624,81626,81628,81629,7678, 81632,81634,81635,81662,81621,356, 3999, 317, 317, 5619, 5619, 81623,490, - 8626, 490, 81625,363, 81627,466, 2022, 2022, 7035, 317, 1347, 317, 317, 6994, 5040, 81630,81631,8613, 28836,81633,370, 404, 31403,317, 11450,317, 2631, - 317, 81636,5619, 81637,81645,81646,81648,81649,13781,81650,81651,81653,1060, 81656,490, 1459, 8626, 380, 317, 343, 317, 343, 490, 81638,81644,81639,490, - 81640,81641,81642,81643,370, 81647,317, 30882,490, 81652,1580, 1060, 8626, 81654,490, 81655,37825,5020, 81657,81658,81659,81660,81661,56982,317, 81665,317, + 81776,2058, 81800,7878, 81802,81620,81622,317, 574, 81624,81626,81628,81629,7678, 81632,81634,81635,81662,81621,356, 3999, 317, 317, 5619, 5619, 81623,490, + 8626, 490, 81625,363, 81627,466, 2022, 2022, 7035, 317, 1347, 317, 317, 6994, 5040, 81630,81631,8613, 28836,81633,370, 404, 31403,317, 11450,317, 2631, + 317, 81636,5619, 81637,81645,81646,81648,81649,13781,81650,81651,81653,1060, 81656,490, 1459, 8626, 380, 317, 343, 317, 343, 490, 81638,81644,81639,490, + 81640,81641,81642,81643,370, 81647,317, 30882,490, 81652,1580, 1060, 8626, 81654,490, 81655,37825,5020, 81657,81658,81659,81660,81661,56982,317, 81665,317, 38471,81668,81675,81677,81678,81683,5020, 317, 404, 317, 370, 81666,14444,20920,351, 9624, 596, 81667,363, 10354,439, 370, 317, 5537, 81669,2021, 38710, 7389, 81670,81672,404, 81674,7401, 15249,1194, 362, 384, 1160, 345, 7053, 81671,45286,343, 81673,363, 2507, 404, 81676,5561, 345, 350, 2021, 404, 38337, 343, 541, 81679,2022, 370, 81680,81681,370, 2171, 363, 396, 75525,350, 81682,349, 317, 43837,81684,501, 15066,9878, 81685,370, 81686,81688,396, 81689, 81690,81691,81693,81696,81698,81700,81715,81774,81687,350, 428, 551, 541, 7826, 6046, 554, 317, 427, 370, 19617,9170, 2584, 381, 14644,81692,2705, 81694, - 466, 81695,317, 381, 2022, 3387, 343, 81697,317, 5005, 23014,16651,343, 317, 317, 81699,370, 370, 466, 605, 535, 12291,370, 81701,317, 81703,350, - 362, 81705,34396,81706,81709,81702,34149,23950,404, 81704,10147,317, 317, 9720, 1160, 2369, 351, 81707,380, 81708,356, 81710,363, 81711,466, 81712,317, + 466, 81695,317, 381, 2022, 3387, 343, 81697,317, 5005, 23014,16651,343, 317, 317, 81699,370, 370, 466, 605, 535, 12291,370, 81701,317, 81703,350, + 362, 81705,34396,81706,81709,81702,34149,23950,404, 81704,10147,317, 317, 9720, 1160, 2369, 351, 81707,380, 81708,356, 81710,363, 81711,466, 81712,317, 23950,317, 317, 81713,81714,81716,81718,81719,81723,22734,31644,81750,81753,350, 81754,81758,81759,363, 2584, 81760,81763,350, 22415,81717,350, 384, 11089, - 479, 317, 81720,81721,6894, 81722,317, 1453, 81724,81726,16401,81729,12151,81730,345, 81733,81739,81740,385, 12774,1347, 81741,81745,81747,317, 565, 551, - 81725,11089,81727,81728,5270, 60693,11373,514, 15123,551, 81731,22241,428, 81732,11918,351, 380, 501, 17791,393, 605, 81734,81735,23306,317, 2071, 317, - 81736,81737,81738,2510, 1020, 39055,1588, 384, 14320,466, 404, 81742,9878, 81743,12616,316, 516, 81744,2156, 2219, 81746,81748,81749,8412, 350, 317, 1383, + 479, 317, 81720,81721,6894, 81722,317, 1453, 81724,81726,16401,81729,12151,81730,345, 81733,81739,81740,385, 12774,1347, 81741,81745,81747,317, 565, 551, + 81725,11089,81727,81728,5270, 60693,11373,514, 15123,551, 81731,22241,428, 81732,11918,351, 380, 501, 17791,393, 605, 81734,81735,23306,317, 2071, 317, + 81736,81737,81738,2510, 1020, 39055,1588, 384, 14320,466, 404, 81742,9878, 81743,12616,316, 516, 81744,2156, 2219, 81746,81748,81749,8412, 350, 317, 1383, 356, 427, 81751,479, 356, 81752,350, 10561,4925, 81755,14311,81756,23306,81757,39055,16179,1588, 27196,1588, 81761,2117, 363, 24938,81762,81764,81765,81767, - 81771,9420, 363, 427, 317, 317, 350, 2171, 81766,317, 317, 81552,404, 4965, 350, 81768,81769,81770,404, 81772,466, 317, 317, 81773,317, 5163, 2022, + 81771,9420, 363, 427, 317, 317, 350, 2171, 81766,317, 317, 81552,404, 4965, 350, 81768,81769,81770,404, 81772,466, 317, 317, 81773,317, 5163, 2022, 75520,81777,2275, 50600,81779,541, 345, 81780,81781,81789,81790,12622,81793,81795,1109, 317, 365, 81778,15417,54053,81782,370, 81783,2571, 81787,317, 81784, 81785,81786,81788,2060, 2022, 1060, 317, 81791,390, 476, 11404,81792,317, 81794,9064, 466, 34944,404, 317, 7401, 317, 317, 1580, 81796,81797,81798,81799, 317, 81801,38337,81803,16093,2533, 380, 81804,81805,8563, 81807,370, 2381, 356, 363, 317, 350, 317, 381, 317, 81806,81808,81809,81813,81818,81835,81852, - 81885,81888,81908,81911,81912,299, 82026,300, 363, 82138,82144,82154,82201,3529, 82252,82254,82255,82256,317, 971, 81810,81811,351, 81812,81814,81817,343, + 81885,81888,81908,81911,81912,299, 82026,300, 363, 82138,82144,82154,82201,3529, 82252,82254,82255,82256,317, 971, 81810,81811,351, 81812,81814,81817,343, 4949, 81815,343, 81816,2021, 380, 81819,317, 81821,5294, 81823,81834,81820,81822,489, 4952, 5662, 13638,501, 10629,10894,81824,2024, 554, 81829,16024,81830, - 66252,81832,345, 81833,55170,380, 6596, 81825,81826,317, 81828,317, 81827,317, 33875,2571, 317, 1347, 3338, 350, 439, 81831,605, 439, 23328,1358, 317, + 66252,81832,345, 81833,55170,380, 6596, 81825,81826,317, 81828,317, 81827,317, 33875,2571, 317, 1347, 3338, 350, 439, 81831,605, 439, 23328,1358, 317, 370, 81836,81838,81843,81845,384, 6375, 7850, 81846,81848,81849,81851,15951,351, 2551, 81837,345, 317, 38461,4952, 62572,13868,362, 14316,38487,81839,81840, 317, 317, 343, 3284, 31380,81841,317, 81842,81844,81847,351, 350, 4984, 7785, 350, 81850,10422,6089, 11831,439, 81853,81855,81858,81863,343, 81864,11608, - 81872,81874,81880,81884,2134, 81854,13659,11147,317, 81856,4873, 16910,56281,81857,5662, 81859,37251,8178, 371, 5662, 81860,81861,65398,363, 81862,3710, 2566, - 2310, 81445,31227,5662, 439, 14316,81865,81866,81867,24638,363, 23524,23524,345, 317, 1358, 81868,81869,81870,81871,8390, 5896, 81873,16187,343, 317, 553, - 343, 8488, 317, 12931,362, 81875,39984,81878,81876,2845, 490, 363, 31952,81877,81879,13004,81881,350, 362, 81882,317, 317, 362, 2222, 5662, 48324,317, - 81883,26065,466, 317, 2134, 81886,317, 551, 317, 81887,7389, 81889,2146, 81890,81892,81893,81900,81901,81903,9420, 29485,81905,5862, 81906,554, 81891,317, + 81872,81874,81880,81884,2134, 81854,13659,11147,317, 81856,4873, 16910,56281,81857,5662, 81859,37251,8178, 371, 5662, 81860,81861,65398,363, 81862,3710, 2566, + 2310, 81445,31227,5662, 439, 14316,81865,81866,81867,24638,363, 23524,23524,345, 317, 1358, 81868,81869,81870,81871,8390, 5896, 81873,16187,343, 317, 553, + 343, 8488, 317, 12931,362, 81875,39984,81878,81876,2845, 490, 363, 31952,81877,81879,13004,81881,350, 362, 81882,317, 317, 362, 2222, 5662, 48324,317, + 81883,26065,466, 317, 2134, 81886,317, 551, 317, 81887,7389, 81889,2146, 81890,81892,81893,81900,81901,81903,9420, 29485,81905,5862, 81906,554, 81891,317, 317, 81894,81895,81896,81898,317, 427, 317, 81897,5862, 317, 404, 81899,466, 317, 427, 7949, 81902,81904,10956,317, 81907,317, 5152, 317, 81909,14062, 81910,25151,8223, 81913,81915,3529, 18839,81916,77449,23172,81914,23172,317, 20319,81917,81919,81925,81929,81951,81953,81958,81959,81964,81965,81972,82013,23019, 9914, 82017,82020,82025,317, 1230, 81918,2222, 2317, 2718, 81920,81922,81923,81924,317, 81921,25077,317, 317, 317, 363, 14341,81926,11347,81927,14535,81928, - 371, 29848,317, 81930,81931,81932,81935,81940,81942,3999, 81943,5683, 39187,81944,81945,81947,81949,81950,5898, 428, 965, 81933,3361, 6355, 81934,81936,6831, - 362, 81937,81938,5223, 317, 1479, 350, 5896, 9012, 38707,33156,2571, 81939,363, 535, 13161,32226,81941,2334, 48917,439, 533, 317, 37886,81946,2261, 2553, - 81948,351, 2758, 412, 439, 2063, 5836, 7261, 11236,81952,317, 317, 1160, 1020, 2317, 81954,4738, 81955,81956,380, 382, 356, 16992,81957,466, 11146,345, - 427, 81960,36199,35705,81961,7149, 81962,20610,81963,345, 317, 363, 16029,2997, 4980, 81966,81968,81971,4980, 345, 81967,5995, 15881,317, 317, 81969,404, - 81970,7911, 4984, 396, 1100, 10626,81973,81975,81979,81980,81982,47487,511, 81990,81991,2058, 82003,350, 82007,12774,82011,24299,81301,82012,81974,370, 6831, + 371, 29848,317, 81930,81931,81932,81935,81940,81942,3999, 81943,5683, 39187,81944,81945,81947,81949,81950,5898, 428, 965, 81933,3361, 6355, 81934,81936,6831, + 362, 81937,81938,5223, 317, 1479, 350, 5896, 9012, 38707,33156,2571, 81939,363, 535, 13161,32226,81941,2334, 48917,439, 533, 317, 37886,81946,2261, 2553, + 81948,351, 2758, 412, 439, 2063, 5836, 7261, 11236,81952,317, 317, 1160, 1020, 2317, 81954,4738, 81955,81956,380, 382, 356, 16992,81957,466, 11146,345, + 427, 81960,36199,35705,81961,7149, 81962,20610,81963,345, 317, 363, 16029,2997, 4980, 81966,81968,81971,4980, 345, 81967,5995, 15881,317, 317, 81969,404, + 81970,7911, 4984, 396, 1100, 10626,81973,81975,81979,81980,81982,47487,511, 81990,81991,2058, 82003,350, 82007,12774,82011,24299,81301,82012,81974,370, 6831, 1999, 81976,81977,1325, 81978,8772, 4980, 81981,2117, 2719, 381, 4980, 317, 317, 2024, 433, 81983,81985,8488, 51551,81989,317, 81984,317, 81986,317, 81988, - 317, 4949, 81987,40111,384, 428, 2546, 317, 317, 47915,8224, 574, 2627, 317, 81992,81995,371, 81996,2024, 21190,26385,81997,81999,82001,82002,350, 317, - 81993,1347, 1325, 317, 317, 317, 317, 317, 317, 317, 317, 317, 13877,317, 317, 363, 81994,317, 7911, 363, 363, 3075, 11782,5037, 578, 4952, 317, - 6996, 5483, 317, 317, 81998,363, 317, 82000,2317, 404, 351, 13863,370, 2571, 404, 82004,24841,82005,82006,4984, 545, 317, 343, 381, 370, 371, 5628, - 490, 82008,82010,82009,317, 370, 16278,637, 317, 12523,317, 2117, 2108, 6228, 10894,8301, 317, 82014,82015,5537, 82016,2401, 317, 317, 48651,381, 343, + 317, 4949, 81987,40111,384, 428, 2546, 317, 317, 47915,8224, 574, 2627, 317, 81992,81995,371, 81996,2024, 21190,26385,81997,81999,82001,82002,350, 317, + 81993,1347, 1325, 317, 317, 317, 317, 317, 317, 317, 317, 317, 13877,317, 317, 363, 81994,317, 7911, 363, 363, 3075, 11782,5037, 578, 4952, 317, + 6996, 5483, 317, 317, 81998,363, 317, 82000,2317, 404, 351, 13863,370, 2571, 404, 82004,24841,82005,82006,4984, 545, 317, 343, 381, 370, 371, 5628, + 490, 82008,82010,82009,317, 370, 16278,637, 317, 12523,317, 2117, 2108, 6228, 10894,8301, 317, 82014,82015,5537, 82016,2401, 317, 317, 48651,381, 343, 24242,545, 9557, 82018,82019,1588, 6831, 82021,82022,5623, 501, 466, 350, 363, 4280, 82024,317, 2193, 5898, 317, 82023,1345, 2609, 343, 3772, 1108, 14680, 82027,14080,62731,82031,82032,82028,389, 82029,10012,2402, 317, 389, 82030,6021, 373, 317, 317, 2117, 370, 82033,949, 320, 82034,82035,82037,82043,82066, 82076,82079,554, 82086,82089,82097,82098,82111,82112,82113,82119,38800,82135,82136,7452, 345, 5836, 32950,382, 14341,82036,54067,82038,82039,82042,5864, 82040, - 82041,13679,32958,15757,350, 2776, 82044,82045,82046,81892,82048,82050,27614,82051,82052,82053,25067,2402, 82056,82065,345, 550, 317, 382, 50610,317, 380, - 82047,317, 317, 427, 82049,11918,371, 1108, 412, 10878,45397,80974,12142,317, 2405, 4563, 317, 317, 350, 82054,356, 466, 2571, 82055,20319,317, 317, + 82041,13679,32958,15757,350, 2776, 82044,82045,82046,81892,82048,82050,27614,82051,82052,82053,25067,2402, 82056,82065,345, 550, 317, 382, 50610,317, 380, + 82047,317, 317, 427, 82049,11918,371, 1108, 412, 10878,45397,80974,12142,317, 2405, 4563, 317, 317, 350, 82054,356, 466, 2571, 82055,20319,317, 317, 317, 428, 82057,82060,82061,82062,81948,82063,82064,82058,82059,6696, 7592, 6709, 82067,82069,7401, 4738, 317, 4952, 82074,14663,82075,381, 82068,4949, 26788, - 82070,82072,82071,82073,47493,15221,10641,2117, 36461,6598, 32308,82077,82078,1526, 55991,1194, 13753,511, 82080,9624, 554, 466, 82082,362, 385, 317, 7073, + 82070,82072,82071,82073,47493,15221,10641,2117, 36461,6598, 32308,82077,82078,1526, 55991,1194, 13753,511, 82080,9624, 554, 466, 82082,362, 385, 317, 7073, 82084,82085,5517, 317, 350, 349, 82081,5223, 317, 4980, 2222, 82083,317, 362, 18840,6736, 5205, 14170,371, 11146,2247, 65775,82087,82088,82090,9624, 16651, - 82094,8296, 317, 317, 317, 82091,82092,317, 317, 13670,29108,5662, 10486,317, 82093,82095,82096,362, 10486,317, 317, 317, 439, 15474,384, 82099,9624, - 82104,82073,54745,82100,362, 25021,317, 82101,82102,82103,317, 3284, 1160, 2247, 343, 82105,82107,82106,24398,554, 317, 82108,82109,82110,13062,1444, 490, + 82094,8296, 317, 317, 317, 82091,82092,317, 317, 13670,29108,5662, 10486,317, 82093,82095,82096,362, 10486,317, 317, 317, 439, 15474,384, 82099,9624, + 82104,82073,54745,82100,362, 25021,317, 82101,82102,82103,317, 3284, 1160, 2247, 343, 82105,82107,82106,24398,554, 317, 82108,82109,82110,13062,1444, 490, 317, 2108, 605, 10946,2117, 2024, 1597, 5838, 82114,362, 82115,82116,15804,605, 54119,37391,82117,82118,317, 317, 317, 317, 317, 317, 2272, 317, 82120, 82133,501, 343, 18420,82134,317, 82121,82122,8258, 317, 12447,82123,356, 72605,31380,82125,466, 511, 82126,82128,82130,82132,4949, 82124,20098,10012,10022, - 15221,82127,9244, 82129,2553, 82131,1444, 2060, 363, 351, 2503, 82137,350, 9567, 35973,317, 82139,17462,466, 317, 82140,332, 82141,6593, 82142,82143,317, + 15221,82127,9244, 82129,2553, 82131,1444, 2060, 363, 351, 2503, 82137,350, 9567, 35973,317, 82139,17462,466, 317, 82140,332, 82141,6593, 82142,82143,317, 82145,390, 317, 82147,1347, 471, 16053,82152,12756,433, 511, 82153,317, 82146,7698, 317, 82148,362, 17009,317, 82149,6669, 2272, 82150,82151,6388, 10956, 46954,317, 596, 43709,82155,82156,82162,82163,82171,82173,82175,82176,82177,82178,82183,2222, 82185,82197,62338,82200,82157,82158,5866, 82159,2369, 82160,82161, - 363, 45496,476, 82164,317, 82168,5159, 82169,362, 82170,317, 381, 20652,82165,1060, 82166,82167,16092,351, 351, 82172,7035, 8020, 379, 3999, 33877,363, + 363, 45496,476, 82164,317, 82168,5159, 82169,362, 82170,317, 381, 20652,82165,1060, 82166,82167,16092,351, 351, 82172,7035, 8020, 379, 3999, 33877,363, 317, 427, 317, 317, 5255, 317, 82174,1033, 8296, 82179,82180,27123,15326,82181,82182,36049,3284, 317, 317, 82184,82186,82189,82196,350, 5662, 82187,82188, 317, 317, 82190,82191,317, 363, 19591,82192,82193,82194,82195,351, 82198,379, 82199,82202,10487,82203,371, 9624, 82205,317, 82218,66820,16825,82220,82222, - 370, 82223,82224,11146,27192,82247,38685,350, 7261, 82204,6894, 7850, 317, 551, 8695, 12563,466, 317, 427, 82206,82210,9624, 82213,82215,7073, 5005, 385, + 370, 82223,82224,11146,27192,82247,38685,350, 7261, 82204,6894, 7850, 317, 551, 8695, 12563,466, 317, 427, 82206,82210,9624, 82213,82215,7073, 5005, 385, 2402, 82216,8116, 82207,82208,605, 82209,4564, 466, 317, 317, 317, 317, 17038,82211,317, 558, 12421,82212,605, 74433,5861, 343, 578, 82214,427, 16704, - 82217,21605,2063, 82219,345, 82221,17240,317, 356, 2317, 2078, 428, 81354,82225,82233,82234,82236,82237,82238,82241,82242,363, 82244,82245,350, 317, 317, - 12291,82226,82227,82229,82228,2405, 4949, 479, 4960, 4949, 466, 82230,82231,82232,82235,462, 6696, 381, 390, 317, 317, 382, 317, 7451, 82239,82240,390, - 396, 10086,5663, 16179,82243,82246,384, 8125, 82248,351, 2316, 82249,82250,82251,82253,38927,317, 5332, 404, 1526, 82257,5087, 350, 15130,82258,82259,6996, - 466, 370, 317, 371, 11324,605, 82262,1060, 82263,82265,82268,82279,390, 82266,82267,317, 43193,371, 46183,52919,82269,82271,82276,317, 82270,82272,1481, + 82217,21605,2063, 82219,345, 82221,17240,317, 356, 2317, 2078, 428, 81354,82225,82233,82234,82236,82237,82238,82241,82242,363, 82244,82245,350, 317, 317, + 12291,82226,82227,82229,82228,2405, 4949, 479, 4960, 4949, 466, 82230,82231,82232,82235,462, 6696, 381, 390, 317, 317, 382, 317, 7451, 82239,82240,390, + 396, 10086,5663, 16179,82243,82246,384, 8125, 82248,351, 2316, 82249,82250,82251,82253,38927,317, 5332, 404, 1526, 82257,5087, 350, 15130,82258,82259,6996, + 466, 370, 317, 371, 11324,605, 82262,1060, 82263,82265,82268,82279,390, 82266,82267,317, 43193,371, 46183,52919,82269,82271,82276,317, 82270,82272,1481, 82274,82273,490, 82275,11347,82277,82278,82280,82281,77177,832, 82283,490, 82284,82287,82285,82286,539, 390, 82289,82290,82291,381, 605, 82292,34346,61080, 49832,82293,82294,82295,82296,82299,82303,7582, 14501,82309,82320,82321,82337,82338,82398,82411,82424,1347, 82489,82532,82537,82538,10907,82542,82545,82547,82297, 382, 350, 479, 317, 82298,5862, 10147,317, 82300,82301,39970,12931,61338,82302,7401, 317, 565, 35328,82304,82305,30126,82307,82308,43879,82306,1358, 24836, - 2568, 6917, 82310,350, 317, 82311,82312,82314,1601, 82316,82319,27295,8488, 1108, 82313,3361, 551, 1999, 545, 82315,82317,82318,38654,10664,82322,82325,7850, + 2568, 6917, 82310,350, 317, 82311,82312,82314,1601, 82316,82319,27295,8488, 1108, 82313,3361, 551, 1999, 545, 82315,82317,82318,38654,10664,82322,82325,7850, 82328,384, 82329,82332,82323,82324,82326,371, 3284, 82327,317, 371, 5836, 19872,82330,351, 11146,8296, 82331,82333,8639, 13554,13638,82336,2381, 317, 82334, - 82335,4984, 15852,8275, 82339,82341,82342,82345,82346,82348,82365,9696, 82367,82368,82371,5217, 82381,82382,82385,82386,82392,82394,437, 317, 82340,350, 317, + 82335,4984, 15852,8275, 82339,82341,82342,82345,82346,82348,82365,9696, 82367,82368,82371,5217, 82381,82382,82385,82386,82392,82394,437, 317, 82340,350, 317, 363, 11844,28698,6593, 82343,2117, 82344,4984, 9914, 317, 317, 317, 370, 82347,350, 637, 82349,320, 1722, 14773,633, 551, 2077, 82350,1358, 82355,82358, - 2022, 82360,82361,64783,82362,82363,621, 1267, 317, 317, 82351,47755,82352,501, 82354,5898, 82353,30998,82356,82357,317, 82359,27367,2222, 5684, 2071, 343, + 2022, 82360,82361,64783,82362,82363,621, 1267, 317, 317, 82351,47755,82352,501, 82354,5898, 82353,30998,82356,82357,317, 82359,27367,2222, 5684, 2071, 343, 356, 10626,427, 356, 427, 427, 82364,363, 2310, 2272, 5898, 4949, 82366,47716,350, 317, 4984, 82369,82370,82372,82373,6599, 363, 82374,350, 82375,82377, - 5379, 317, 317, 356, 2067, 404, 27787,5223, 317, 363, 351, 545, 82376,57566,82378,363, 82379,82380,39297,317, 1020, 82383,317, 82384,8639, 363, 7618, - 82387,25193,38365,82388,82389,317, 82390,82391,82393,12625,350, 5662, 317, 9289, 1347, 82395,10476,317, 82396,1160, 82397,18885,404, 82399,82402,82405,1194, + 5379, 317, 317, 356, 2067, 404, 27787,5223, 317, 363, 351, 545, 82376,57566,82378,363, 82379,82380,39297,317, 1020, 82383,317, 82384,8639, 363, 7618, + 82387,25193,38365,82388,82389,317, 82390,82391,82393,12625,350, 5662, 317, 9289, 1347, 82395,10476,317, 82396,1160, 82397,18885,404, 82399,82402,82405,1194, 7785, 317, 317, 82400,317, 6089, 82401,370, 317, 82403,2156, 82404,419, 6420, 82406,82408,82410,82407,317, 82409,381, 82412,6387, 82420,82421,82422,82423, - 317, 82413,82419,20297,82414,317, 82415,356, 82416,3999, 82417,317, 82418,23801,5418, 14251,466, 317, 20909,7949, 317, 2610, 317, 363, 351, 371, 2058, + 317, 82413,82419,20297,82414,317, 82415,356, 82416,3999, 82417,317, 82418,23801,5418, 14251,466, 317, 20909,7949, 317, 2610, 317, 363, 351, 371, 2058, 371, 82425,356, 82459,82460,19953,466, 82461,82463,62731,82484,82486,1347, 82487,82488,550, 370, 317, 82426,82427,82428,82431,82432,82433,2413, 82437,82439, - 5793, 82440,82443,82446,82447,82451,16363,82455,82458,5105, 356, 356, 73504,15076,2584, 9914, 69145,317, 82429,32034,48270,6894, 82430,428, 2146, 384, 317, - 380, 1325, 34948,82434,82435,428, 578, 317, 390, 371, 82436,82438,355, 392, 428, 380, 1347, 501, 317, 8977, 317, 82441,13269,82442,384, 317, 6355, - 363, 396, 1992, 82444,363, 1588, 82445,370, 558, 32016,2590, 428, 82448,82449,82450,390, 990, 382, 533, 343, 396, 317, 11761,1526, 82452,82453,363, + 5793, 82440,82443,82446,82447,82451,16363,82455,82458,5105, 356, 356, 73504,15076,2584, 9914, 69145,317, 82429,32034,48270,6894, 82430,428, 2146, 384, 317, + 380, 1325, 34948,82434,82435,428, 578, 317, 390, 371, 82436,82438,355, 392, 428, 380, 1347, 501, 317, 8977, 317, 82441,13269,82442,384, 317, 6355, + 363, 396, 1992, 82444,363, 1588, 82445,370, 558, 32016,2590, 428, 82448,82449,82450,390, 990, 382, 533, 343, 396, 317, 11761,1526, 82452,82453,363, 82454,317, 551, 11229,82456,82457,22518,390, 6228, 38769,317, 351, 350, 13020,343, 1020, 450, 82462,551, 7053, 82464,11442,82466,82467,82469,82470,16825, - 1194, 9914, 82477,404, 5742, 56788,82481,317, 82465,1347, 317, 370, 350, 49999,82468,2022, 7651, 392, 82471,9557, 82472,317, 82473,82474,82475,82476,370, + 1194, 9914, 82477,404, 5742, 56788,82481,317, 82465,1347, 317, 370, 350, 49999,82468,2022, 7651, 392, 82471,9557, 82472,317, 82473,82474,82475,82476,370, 363, 82478,82479,363, 82480,82482,82483,82485,370, 56705,363, 69375,363, 6046, 61665,82490,82491,82497,12109,82498,82510,82514,2222, 82517,82518,82522,82528, 35415,12312,82492,466, 82493,82494,20869,1060, 317, 605, 476, 533, 605, 24130,82495,1230, 2571, 82496,6409, 317, 380, 82499,82500,1230, 10422,82501,20393, - 82502,82504,77052,22716,82507,82508,82509,1060, 373, 25934,5281, 10189,9696, 16875,25078,551, 82503,393, 7506, 511, 82505,317, 82506,317, 351, 501, 317, + 82502,82504,77052,22716,82507,82508,82509,1060, 373, 25934,5281, 10189,9696, 16875,25078,551, 82503,393, 7506, 511, 82505,317, 82506,317, 351, 501, 317, 404, 4268, 5836, 18941,50854,25545,1060, 50854,6425, 384, 439, 82511,370, 343, 605, 6228, 82512,370, 539, 317, 58769,82513,381, 5332, 1060, 351, 32011, - 15738,82515,48991,82516,2022, 2222, 5005, 545, 6089, 317, 2134, 1108, 82519,428, 9878, 82520,82521,12925,13631,3999, 5159, 82523,4982, 82524,2022, 82527,427, - 82525,82526,15293,379, 466, 15253,317, 82529,4738, 2022, 362, 363, 317, 5332, 9557, 82530,66820,10517,317, 345, 82531,476, 5862, 350, 384, 82533,317, - 82534,82535,82536,363, 363, 511, 404, 48014,82539,5272, 2509, 551, 82540,550, 22469,317, 82541,381, 18048,356, 317, 82543,2509, 82544,462, 82546,371, + 15738,82515,48991,82516,2022, 2222, 5005, 545, 6089, 317, 2134, 1108, 82519,428, 9878, 82520,82521,12925,13631,3999, 5159, 82523,4982, 82524,2022, 82527,427, + 82525,82526,15293,379, 466, 15253,317, 82529,4738, 2022, 362, 363, 317, 5332, 9557, 82530,66820,10517,317, 345, 82531,476, 5862, 350, 384, 82533,317, + 82534,82535,82536,363, 363, 511, 404, 48014,82539,5272, 2509, 551, 82540,550, 22469,317, 82541,381, 18048,356, 317, 82543,2509, 82544,462, 82546,371, 82336,82548,10487,370, 82549,317, 13554,44431,82551,476, 82555,380, 316, 82556,380, 365, 82552,82553,82554,317, 82557,82558,82560,82562,605, 82572,82582, 82601,82608,6515, 82609,82610,82563,82564,82565,317, 82566,82568,82569,82570,543, 317, 471, 15951,82567,9878, 24577,5280, 317, 15253,317, 5022, 343, 82571, 24530,82573,82574,343, 2261, 1020, 82576,82577,82581,7678, 7582, 5273, 15951,82575,990, 10422,466, 317, 7857, 1358, 317, 82578,1087, 356, 82579,82580,35724, 317, 317, 5430, 1347, 317, 390, 343, 3007, 82583,82587,82591,82593,82596,373, 82584,2022, 82585,317, 363, 5537, 363, 82586,380, 362, 363, 5037, 22983, - 82588,317, 82589,82590,317, 82592,2022, 82594,31023,363, 317, 82595,82597,511, 9648, 317, 501, 82598,317, 82599,317, 82600,5773, 26381,82602,14938,317, - 82604,82607,530, 2134, 380, 82603,15326,5836, 317, 82605,3284, 82606,356, 10891,370, 317, 1230, 4984, 317, 501, 2134, 371, 382, 2033, 317, 370, 363, + 82588,317, 82589,82590,317, 82592,2022, 82594,31023,363, 317, 82595,82597,511, 9648, 317, 501, 82598,317, 82599,317, 82600,5773, 26381,82602,14938,317, + 82604,82607,530, 2134, 380, 82603,15326,5836, 317, 82605,3284, 82606,356, 10891,370, 317, 1230, 4984, 317, 501, 2134, 371, 382, 2033, 317, 370, 363, 82611,82612,46329,5241, 82614,3869, 1060, 82616,82617,82615,317, 949, 2261, 2476, 2462, 4336, 1358, 82619,2219, 1791, 1060, 82620,82623,2645, 317, 16749,82621, - 82622,82624,317, 82625,82626,82628,82629,82630,82633,82636,82637,82646,82647,82649,5623, 82650,82653,82658,82659,82662,82671,82673,5894, 965, 82677,82631,1020, - 10081,82632,82634,466, 82635,1453, 82638,82642,82643,82644,82639,82640,82641,44265,317, 82645,82648,82651,362, 82652,565, 466, 3967, 82654,317, 350, 2108, - 82655,317, 82656,82657,317, 27286,317, 82660,82661,2254, 2298, 82663,33844,9274, 82664,82667,82670,317, 317, 82665,11040,82666,82668,82669,317, 2507, 590, - 82672,317, 596, 605, 317, 82674,13954,553, 82675,82676,82679,339, 82681,82682,2631, 365, 356, 82683,82684,82687,949, 12154,1151, 317, 82685,82686,4197, + 82622,82624,317, 82625,82626,82628,82629,82630,82633,82636,82637,82646,82647,82649,5623, 82650,82653,82658,82659,82662,82671,82673,5894, 965, 82677,82631,1020, + 10081,82632,82634,466, 82635,1453, 82638,82642,82643,82644,82639,82640,82641,44265,317, 82645,82648,82651,362, 82652,565, 466, 3967, 82654,317, 350, 2108, + 82655,317, 82656,82657,317, 27286,317, 82660,82661,2254, 2298, 82663,33844,9274, 82664,82667,82670,317, 317, 82665,11040,82666,82668,82669,317, 2507, 590, + 82672,317, 596, 605, 317, 82674,13954,553, 82675,82676,82679,339, 82681,82682,2631, 365, 356, 82683,82684,82687,949, 12154,1151, 317, 82685,82686,4197, 1132, 317, 82688,82691,3227, 82689,82690,317, 82692,317, 673, 82693,82695,1108, 949, 82696,82698,82701,82702,82705,82708,82709,82711,82713,82714,82716,82722, - 82723,82726,82730,82736,34293,82699,21303,82700,317, 13190,317, 12931,343, 40526,1358, 65775,82703,82704,3529, 396, 7010, 396, 5866, 82706,350, 350, 317, + 82723,82726,82730,82736,34293,82699,21303,82700,317, 13190,317, 12931,343, 40526,1358, 65775,82703,82704,3529, 396, 7010, 396, 5866, 82706,350, 350, 317, 82707,1347, 38692,82710,343, 82712,343, 3529, 35043,1358, 6546, 343, 2058, 317, 363, 351, 82715,317, 57241,343, 63291,5896, 82717,82719,490, 38793,82720, 82721,6412, 550, 82718,554, 6968, 381, 511, 11235,317, 24638,82724,82725,317, 82727,82729,317, 61338,2219, 82728,44431,2058, 382, 390, 82731,82732,82733, 82734,82735,2742, 82738,82742,82750,82752,82755,82759,82761,82766,82788,82792,82796,82808,82811,82813,82831,82834,82838,82839,82842,82849,82854,82855,82859,82865, 82875,82836,82882,82883,82897,82909,82739,82740,82741,82743,82747,82749,82744,82745,82746,82748,82751,82753,82754,82756,82757,82758,82760,82762,82763,82764,82765, 82767,82771,82778,77143,3710, 82781,82785,82786,82768,82769,82770,82772,82773,82774,82775,82776,82777,82779,82780,82782,2222, 317, 82783,363, 82784,490, 28413, - 50458,82787,2553, 5623, 339, 82789,82790,82791,3031, 82793,380, 2373, 22995,71740,82794,82795,82797,490, 82799,363, 82805,82807,82798,82800,490, 82801,2260, + 50458,82787,2553, 5623, 339, 82789,82790,82791,3031, 82793,380, 2373, 22995,71740,82794,82795,82797,490, 82799,363, 82805,82807,82798,82800,490, 82801,2260, 12429,5430, 1160, 82802,82803,345, 82804,8583, 317, 1108, 339, 82806,596, 5776, 32191,82809,19106,82810,5459, 82812,56100,362, 82814,27184,5120, 82821,82822, 82823,82826,82829,317, 5623, 589, 501, 82815,82817,28836,82816,2357, 5623, 14529,511, 82818,82819,82820,68062,7360, 82824,82825,466, 31505,365, 6834, 82827, 82828,82830,3446, 82832,82833,82835,82836,82837,6002, 363, 317, 1060, 82840,82841,82843,82847,82844,82845,82846,380, 82848,16093,9993, 76324,82850,82851,82852, - 82853,82856,82857,82858,381, 49591,82860,82863,82861,82862,82864,2462, 4336, 2461, 2475, 2492, 2532, 2549, 82866,82868,82870,82871,82873,82867,20806,82869,1721, - 317, 2060, 82872,22939,82874,82876,39637,317, 82879,490, 501, 19307,82877,40721,590, 82878,82880,82881,82835,82836,82884,82885,1087, 672, 632, 82886,1230, + 82853,82856,82857,82858,381, 49591,82860,82863,82861,82862,82864,2462, 4336, 2461, 2475, 2492, 2532, 2549, 82866,82868,82870,82871,82873,82867,20806,82869,1721, + 317, 2060, 82872,22939,82874,82876,39637,317, 82879,490, 501, 19307,82877,40721,590, 82878,82880,82881,82835,82836,82884,82885,1087, 672, 632, 82886,1230, 362, 82887,1428, 82893,2402, 82894,1038, 1107, 637, 5074, 82888,476, 82889,82890,82891,82892,317, 82895,317, 82896,82898,82902,466, 82906,82908,82899,82900, 82901,18123,82903,82904,343, 82905,7360, 2272, 82907,949, 17565,63202,2506, 82910,82911,82912,82913,82933,82935,303, 83071,83083,83088,304, 83167,83197,83208, 83211,83228,83244,83246,83247,83252,305, 83350,83359,83365,83375,83380,83400,83451,83457,83460,83464,83473,82914,541, 3869, 12429,82915,5628, 558, 82928,82916, 82917,82918,82919,82920,82921,82922,82923,82924,82925,82926,82927,82929,82930,82931,82932,82934,82936,82937,82938,82939,82941,82948,82950,82951,82952,82959,82960, 82961,82964,82974,82975,82994,83023,83024,83025,83027,83043,83055,83059,83061,83063,83065,83066,12088,380, 7477, 390, 317, 8281, 317, 317, 82940,82942,21090, - 82943,82945,82947,5033, 82944,466, 7949, 82946,2022, 317, 1020, 332, 367, 7035, 82949,5611, 363, 2110, 1020, 363, 317, 11357,32289,25562,317, 8926, 8525, - 365, 343, 13457,5325, 4984, 82953,365, 4984, 82954,490, 82956,596, 590, 82955,317, 490, 82957,82958,7579, 2533, 490, 317, 5891, 332, 6415, 20995,3611, - 490, 7579, 490, 82962,82963,2845, 13392,2845, 511, 82965,362, 82966,82969,82972,82967,317, 82968,82970,82971,5943, 748, 54996,332, 37575,82973,490, 381, - 490, 371, 317, 317, 317, 2503, 363, 490, 317, 82976,82985,8023, 4984, 82986,82989,10626,82990,82992,1155, 82993,490, 82977,82978,82980,29531,82982,1481, + 82943,82945,82947,5033, 82944,466, 7949, 82946,2022, 317, 1020, 332, 367, 7035, 82949,5611, 363, 2110, 1020, 363, 317, 11357,32289,25562,317, 8926, 8525, + 365, 343, 13457,5325, 4984, 82953,365, 4984, 82954,490, 82956,596, 590, 82955,317, 490, 82957,82958,7579, 2533, 490, 317, 5891, 332, 6415, 20995,3611, + 490, 7579, 490, 82962,82963,2845, 13392,2845, 511, 82965,362, 82966,82969,82972,82967,317, 82968,82970,82971,5943, 748, 54996,332, 37575,82973,490, 381, + 490, 371, 317, 317, 317, 2503, 363, 490, 317, 82976,82985,8023, 4984, 82986,82989,10626,82990,82992,1155, 82993,490, 82977,82978,82980,29531,82982,1481, 82984,357, 11388,10898,489, 11388,82979,6996, 39691,82981,317, 82983,317, 317, 1459, 3284, 343, 53525,82987,82988,14645,2272, 82991,362, 82995,82998,82999, - 83000,83001,83002,83003,83010,83014,83015,83019,83020,971, 82996,317, 317, 317, 6901, 82997,1345, 883, 371, 317, 317, 9878, 343, 605, 2110, 317, 317, - 489, 317, 317, 362, 363, 5017, 19307,317, 490, 490, 390, 370, 83004,3999, 83007,1160, 404, 317, 83005,317, 317, 651, 1060, 83006,83008,83009,3284, + 83000,83001,83002,83003,83010,83014,83015,83019,83020,971, 82996,317, 317, 317, 6901, 82997,1345, 883, 371, 317, 317, 9878, 343, 605, 2110, 317, 317, + 489, 317, 317, 362, 363, 5017, 19307,317, 490, 490, 390, 370, 83004,3999, 83007,1160, 404, 317, 83005,317, 317, 651, 1060, 83006,83008,83009,3284, 4925, 13158,83011,83013,34925,40546,83012,404, 1913, 9690, 34721,15017,317, 83016,83017,83018,365, 345, 490, 36437,9993, 83021,83022,83026,83028,317, 83029, - 83031,350, 10840,15821,5379, 83032,83034,83035,83040,6089, 9530, 68435,83030,10454,10454,4943, 990, 40164,2077, 4965, 2022, 362, 15935,363, 14446,83033,390, + 83031,350, 10840,15821,5379, 83032,83034,83035,83040,6089, 9530, 68435,83030,10454,10454,4943, 990, 40164,2077, 4965, 2022, 362, 15935,363, 14446,83033,390, 317, 83036,317, 83037,83038,83039,83041,428, 83042,605, 5538, 317, 332, 83044,13920,83045,83046,19913,83047,490, 83049,83050,83053,4782, 317, 490, 11198, - 317, 501, 83048,83051,83052,490, 67597,317, 44105,8920, 317, 971, 2078, 83054,553, 3429, 365, 6546, 490, 83056,12154,83057,332, 83058,83060,350, 317, - 83062,74387,343, 39298,1108, 348, 2351, 7322, 83064,2022, 11613,317, 317, 42580,83067,83069,332, 83070,2211, 83068,317, 83072,83074,9450, 83075,373, 6555, + 317, 501, 83048,83051,83052,490, 67597,317, 44105,8920, 317, 971, 2078, 83054,553, 3429, 365, 6546, 490, 83056,12154,83057,332, 83058,83060,350, 317, + 83062,74387,343, 39298,1108, 348, 2351, 7322, 83064,2022, 11613,317, 317, 42580,83067,83069,332, 83070,2211, 83068,317, 83072,83074,9450, 83075,373, 6555, 83073,83076,4773, 83080,83077,6778, 83078,83079,396, 83081,83082,1160, 32201,83084,83085,83086,83087,2110, 39034,83089,70087,83099,83100,83102,83104,83105,83109, - 83110,83111,83118,83129,83133,83138,83140,83141,83147,83162,83164,83165,3987, 971, 23092,16483,12651,83090,83091,5419, 2022, 83092,12360,83098,637, 23092,4925, - 362, 48359,317, 380, 10223,317, 83093,83095,2809, 83096,5961, 83097,10876,25995,9425, 490, 6089, 317, 83094,7449, 317, 15616,363, 466, 466, 317, 9450, + 83110,83111,83118,83129,83133,83138,83140,83141,83147,83162,83164,83165,3987, 971, 23092,16483,12651,83090,83091,5419, 2022, 83092,12360,83098,637, 23092,4925, + 362, 48359,317, 380, 10223,317, 83093,83095,2809, 83096,5961, 83097,10876,25995,9425, 490, 6089, 317, 83094,7449, 317, 15616,363, 466, 466, 317, 9450, 362, 363, 317, 345, 57668,635, 43914,317, 332, 83101,83103,8301, 356, 20592,1358, 83106,83107,83108,510, 12651,83112,380, 83113,83114,83115,83116,83117, - 25190,37357,83119,83120,1943, 363, 83122,9198, 317, 2533, 83127,317, 83128,11654,363, 83121,317, 317, 15044,3999, 83123,317, 371, 83124,6996, 320, 317, + 25190,37357,83119,83120,1943, 363, 83122,9198, 317, 2533, 83127,317, 83128,11654,363, 83121,317, 317, 15044,3999, 83123,317, 371, 83124,6996, 320, 317, 317, 317, 317, 550, 1020, 83125,12434,83126,2276, 16138,5005, 5022, 355, 16075,5537, 10505,83130,83131,83132,12864,31398,83134,83135,83136,351, 5087, 83137, 317, 5058, 2108, 1020, 317, 551, 6036, 317, 2108, 350, 317, 317, 83139,1992, 3361, 317, 9336, 363, 5392, 1108, 501, 83142,404, 83143,33846,3869, 83144, 83145,370, 7850, 83146,370, 79720,18661,363, 332, 362, 317, 9170, 8177, 427, 5570, 949, 83148,5431, 83149,83153,75286,362, 29407,83154,83156,29673,83160, 317, 83150,490, 83151,83152,5431, 83155,14695,1347, 83157,83159,83158,11840,12429,83161,317, 362, 8099, 83163,350, 2717, 382, 317, 2610, 83166,501, 79882, 83168,83177,83179,83181,83184,83187,83189,83195,83196,83169,83170,83171,83172,83174,83173,6228, 3314, 83175,83176,83178,83180,83182,83183,17249,83185,83186,23468, 31822,612, 83188,490, 611, 83190,83192,83191,83193,83194,317, 396, 19082,1100, 1108, 83198,83201,83205,83207,83199,83200,83202,83203,83204,83206,83209,83210, - 3630, 4076, 317, 39953,45379,39637,83212,83213,433, 596, 83214,317, 83218,83221,83222,83224,590, 5624, 5623, 388, 35307,363, 83215,83217,83216,83219,2357, + 3630, 4076, 317, 39953,45379,39637,83212,83213,433, 596, 83214,317, 83218,83221,83222,83224,590, 5624, 5623, 388, 35307,363, 83215,83217,83216,83219,2357, 83220,381, 2357, 466, 384, 317, 27903,3052, 83223,2086, 83225,83226,7850, 83227,83229,83230,83239,83242,83231,83232,83235,83237,83233,83234,83236,34691,24361, 83238,83240,83241,83243,83245,39134,466, 971, 12756,83248,490, 83249,83250,83251,1108, 83253,66727,83254,345, 9171, 2058, 80105,317, 83255,421, 83256,83260, 83263,83264,83269,11388,83272,83274,83277,83280,83284,83290,1060, 83291,83292,83297,83309,83310,83344,83346,543, 83347,83349,33440,381, 317, 83257,4591, 83258, - 427, 1194, 427, 427, 427, 427, 427, 83259,83261,83262,345, 2261, 949, 633, 2074, 16288,317, 5223, 83265,389, 6450, 83266,1999, 83267,6834, 49429,317, + 427, 1194, 427, 427, 427, 427, 427, 83259,83261,83262,345, 2261, 949, 633, 2074, 16288,317, 5223, 83265,389, 6450, 83266,1999, 83267,6834, 49429,317, 12429,317, 317, 83268,83270,317, 317, 317, 83271,2035, 83273,365, 83275,2134, 2022, 83276,427, 8926, 317, 40790,490, 8926, 10836,83278,1347, 13538,32746, - 83279,83281,345, 83283,26280,83282,317, 3726, 2178, 83285,343, 350, 83286,83288,317, 83289,343, 317, 28836,5392, 2271, 317, 71494,490, 317, 83287,1481, - 54727,6900, 317, 343, 362, 343, 43275,7419, 51025,2066, 317, 350, 427, 490, 371, 35774,317, 2022, 83293,83294,317, 317, 18661,7973, 317, 10715,8830, + 83279,83281,345, 83283,26280,83282,317, 3726, 2178, 83285,343, 350, 83286,83288,317, 83289,343, 317, 28836,5392, 2271, 317, 71494,490, 317, 83287,1481, + 54727,6900, 317, 343, 362, 343, 43275,7419, 51025,2066, 317, 350, 427, 490, 371, 35774,317, 2022, 83293,83294,317, 317, 18661,7973, 317, 10715,8830, 83295,362, 83296,11782,5037, 83298,83299,332, 5120, 437, 553, 317, 2627, 390, 83300,317, 3284, 490, 317, 83301,83302,83303,83304,9174, 83306,83307,83308, 2110, 867, 6901, 317, 317, 317, 83305,1481, 41735,2845, 3284, 6901, 3429, 83311,83312,317, 428, 83314,83316,83319,83320,83321,12943,8948, 83333,83337,83343, - 590, 343, 388, 55181,317, 380, 317, 343, 343, 83313,343, 433, 83315,83317,83318,9702, 8304, 2402, 363, 343, 345, 83322,8506, 83332,317, 1347, 317, - 83323,14571,83325,83326,1020, 83329,362, 2272, 6601, 501, 83330,4949, 83324,12019,381, 3079, 83327,83328,345, 434, 83331,2510, 5841, 426, 2510, 5055, 476, + 590, 343, 388, 55181,317, 380, 317, 343, 343, 83313,343, 433, 83315,83317,83318,9702, 8304, 2402, 363, 343, 345, 83322,8506, 83332,317, 1347, 317, + 83323,14571,83325,83326,1020, 83329,362, 2272, 6601, 501, 83330,4949, 83324,12019,381, 3079, 83327,83328,345, 434, 83331,2510, 5841, 426, 2510, 5055, 476, 1358, 83334,83335,83336,2845, 45496,2060, 381, 15224,12154,83338,1383, 396, 332, 83340,317, 83342,83339,83341,11753,317, 41786,2022, 5866, 83345,5570, 83348, 949, 11786,365, 490, 317, 10580,332, 2035, 83351,596, 83356,83352,83353,83354,83355,83357,83358,83360,83362,83361,83363,83364,83366,83369,83370,332, 83373, 83367,83368,83371,83372,6645, 501, 83374,83376,16989,351, 536, 2869, 83377,40474,2705, 83379,42592,343, 83378,1023, 17196,83381,83384,83390,83392,6903, 25002, 83397,83382,83383,83385,83388,83386,83387,83389,83391,83393,83395,83394,490, 83396,83398,83399,83401,490, 83403,83406,83411,83413,83419,83420,83423,83425,83429, - 83432,83434,83436,83437,83438,83445,83448,83449,501, 490, 83450,83402,490, 83404,490, 7384, 1345, 83405,428, 83407,83408,83410,83409,317, 83412,574, 2078, + 83432,83434,83436,83437,83438,83445,83448,83449,501, 490, 83450,83402,490, 83404,490, 7384, 1345, 83405,428, 83407,83408,83410,83409,317, 83412,574, 2078, 317, 83414,83415,83416,83417,83418,2078, 380, 83421,83422,9265, 83424,83426,83427,83428,2003, 83430,83431,1347, 317, 30214,83433,4984, 43275,381, 345, 83435, 345, 2222, 1020, 362, 317, 345, 345, 43690,2132, 673, 2272, 883, 33533,317, 371, 55568,317, 83439,83441,83442,83444,362, 15399,317, 8176, 83440,83443, - 332, 317, 52231,14415,317, 7850, 396, 83446,317, 5611, 396, 1358, 83447,317, 343, 8281, 9174, 317, 1345, 13881,13498,363, 83452,83453,83455,18581,2070, + 332, 317, 52231,14415,317, 7850, 396, 83446,317, 5611, 396, 1358, 83447,317, 343, 8281, 9174, 317, 1345, 13881,13498,363, 83452,83453,83455,18581,2070, 317, 574, 83454,83456,490, 83458,83459,2665, 83461,83462,83463,83465,83468,83472,83466,83467,83469,317, 83470,317, 83471,83474,83475,40474,42592,42592,83476, 2086, 83477,83497,307, 83717,83721,83738,308, 83847,83851,309, 83956,83726,83964,83973,83979,83985,84045,84051,84062,84072,84088,84090,84154,84165,84187,84223, 84234,2779, 83478,83483,83493,83479,83480,83481,83482,317, 83484,83485,83486,83487,83488,83489,83490,83491,83492,83494,83495,83496,83498,83499,83500,83501,83502, 83513,83527,83533,83534,83536,83543,83552,83558,83559,83572,83580,83604,83623,83624,83640,83660,83682,83685,83689,83696,83703,83709,83713,83714,83503,332, 83505, - 83506,83507,83508,83510,83512,490, 3611, 6693, 490, 83504,16535,317, 5836, 317, 61831,317, 83509,3284, 5836, 18782,83511,339, 8296, 3284, 46099,11146,343, - 83514,83517,371, 83520,83526,971, 18047,83515,83516,83518,2210, 83519,15721,83521,83525,5662, 370, 350, 83522,317, 8274, 83523,1160, 83524,448, 448, 317, + 83506,83507,83508,83510,83512,490, 3611, 6693, 490, 83504,16535,317, 5836, 317, 61831,317, 83509,3284, 5836, 18782,83511,339, 8296, 3284, 46099,11146,343, + 83514,83517,371, 83520,83526,971, 18047,83515,83516,83518,2210, 83519,15721,83521,83525,5662, 370, 350, 83522,317, 8274, 83523,1160, 83524,448, 448, 317, 4965, 317, 83528,66554,2279, 83529,83531,317, 83530,317, 317, 63138,317, 83532,490, 317, 2590, 13457,553, 351, 83535,10382,2110, 14144,9214, 2322, 83537, - 12309,3611, 83538,83539,83541,317, 16535,3284, 1481, 365, 317, 1109, 357, 83540,1331, 343, 3284, 367, 83542,490, 15480,317, 83544,83546,5991, 10185,317, + 12309,3611, 83538,83539,83541,317, 16535,3284, 1481, 365, 317, 1109, 357, 83540,1331, 343, 3284, 367, 83542,490, 15480,317, 83544,83546,5991, 10185,317, 83547,83548,83549,317, 83545,10505,371, 345, 7116, 12696,7651, 343, 605, 14615,17471,83550,35975,83551,317, 83553,317, 83554,83555,343, 11928,83557,11485, - 380, 83556,317, 1020, 1881, 2035, 339, 317, 2134, 13434,83560,9450, 83566,4965, 317, 83567,83568,83570,83571,83561,83562,317, 83563,83564,83565,9298, 5836, + 380, 83556,317, 1020, 1881, 2035, 339, 317, 2134, 13434,83560,9450, 83566,4965, 317, 83567,83568,83570,83571,83561,83562,317, 83563,83564,83565,9298, 5836, 83569,11280,83573,83574,83575,83577,2035, 317, 2222, 362, 83578,1108, 83579,5295, 2081, 317, 565, 2035, 14252,5836, 83576,5836, 343, 5838, 83581,83584,37927, - 83591,83595,83597,83600,26005,83603,7356, 971, 5120, 83582,83583,7306, 363, 83585,83586,83587,83588,83590,596, 7657, 6402, 365, 12931,365, 83589,2715, 5570, + 83591,83595,83597,83600,26005,83603,7356, 971, 5120, 83582,83583,7306, 363, 83585,83586,83587,83588,83590,596, 7657, 6402, 365, 12931,365, 83589,2715, 5570, 2317, 9214, 605, 83592,1109, 83593,83594,6993, 83596,83598,83599,5836, 5328, 363, 317, 83601,83602,7273, 62208,2210, 2178, 2381, 2210, 83605,83606,83609,83612, - 83614,83615,83616,6600, 317, 490, 83617,83618,7823, 83619,83621,317, 83622,3688, 1526, 83607,83608,317, 83610,490, 317, 7894, 83611,2381, 317, 83613,2715, + 83614,83615,83616,6600, 317, 490, 83617,83618,7823, 83619,83621,317, 83622,3688, 1526, 83607,83608,317, 83610,490, 317, 7894, 83611,2381, 317, 83613,2715, 365, 5037, 36649,317, 350, 365, 317, 13174,5120, 317, 490, 2715, 490, 339, 351, 83620,371, 490, 489, 2036, 83625,380, 317, 83627,83629,83630,83635, - 83639,317, 338, 489, 83626,1347, 867, 9179, 317, 83628,332, 2066, 363, 5619, 83631,83634,83632,83633,339, 2316, 83636,5991, 24443,83638,5687, 317, 490, + 83639,317, 338, 489, 83626,1347, 867, 9179, 317, 83628,332, 2066, 363, 5619, 83631,83634,83632,83633,339, 2316, 83636,5991, 24443,83638,5687, 317, 490, 83637,400, 566, 83641,83642,2462, 83651,83657,2461, 83643,83648,83644,2462, 83645,740, 315, 83646,83647,83649,83650,83652,83653,6228, 83654,83655,83656,83658, - 83659,83661,9739, 83666,83667,83668,9483, 83669,12789,83672,83673,83675,7949, 83679,83680,83681,83662,317, 356, 83663,83665,317, 83664,20779,2178, 1108, 5836, - 317, 2381, 62086,317, 5295, 317, 6937, 14455,3284, 5295, 83670,83671,83674,83676,5687, 83678,317, 365, 83677,5033, 2142, 38220,2380, 11146,2004, 565, 2134, - 19988,332, 83683,55479,83684,2402, 490, 2590, 83686,332, 83688,18064,2035, 83687,11388,5836, 2381, 83690,1459, 382, 83694,2108, 83691,83692,83693,83695,351, + 83659,83661,9739, 83666,83667,83668,9483, 83669,12789,83672,83673,83675,7949, 83679,83680,83681,83662,317, 356, 83663,83665,317, 83664,20779,2178, 1108, 5836, + 317, 2381, 62086,317, 5295, 317, 6937, 14455,3284, 5295, 83670,83671,83674,83676,5687, 83678,317, 365, 83677,5033, 2142, 38220,2380, 11146,2004, 565, 2134, + 19988,332, 83683,55479,83684,2402, 490, 2590, 83686,332, 83688,18064,2035, 83687,11388,5836, 2381, 83690,1459, 382, 83694,2108, 83691,83692,83693,83695,351, 83697,5608, 83700,83701,83702,2317, 25114,83698,2317, 83699,404, 13233,8281, 1108, 83704,83705,3284, 45923,6866, 2317, 83706,379, 83708,490, 83707,7850, 13638, 490, 345, 83710,404, 83711,83712,52928,317, 356, 13434,43913,317, 363, 83715,83716,428, 83718,432, 46452,83720,14170,83719,13638,3243, 18853,83722,83729, 83731,83723,83724,83725,83727,83728,83730,83732,83733,83734,83735,83736,83737,83739,43060,363, 83740,83743,82302,45345,317, 83741,83742,1881, 83744,83748,83753, 83757,83759,83762,83764,83767,83773,83781,83782,83801,83805,83813,83815,30804,83819,83830,83833,12216,83838,83841,83846,2844, 2298, 83745,2533, 83747,6388, 59723, - 83746,317, 18820,83749,2022, 83750,83752,558, 5105, 83751,8296, 6228, 317, 3284, 388, 317, 83754,83755,58710,67564,2210, 83756,9450, 2134, 362, 1453, 317, - 371, 83758,466, 363, 350, 2142, 83760,2188, 317, 4952, 362, 2631, 5561, 83761,83763,83765,351, 83766,83768,317, 83769,83770,83772,566, 48330,350, 351, + 83746,317, 18820,83749,2022, 83750,83752,558, 5105, 83751,8296, 6228, 317, 3284, 388, 317, 83754,83755,58710,67564,2210, 83756,9450, 2134, 362, 1453, 317, + 371, 83758,466, 363, 350, 2142, 83760,2188, 317, 4952, 362, 2631, 5561, 83761,83763,83765,351, 83766,83768,317, 83769,83770,83772,566, 48330,350, 351, 83771,5626, 351, 466, 83774,351, 39812,83775,83776,22130,83777,83778,363, 1033, 350, 362, 351, 4738, 362, 80843,47873,4965, 350, 317, 83779,33846,83780, 466, 317, 1347, 317, 5241, 83783,83786,83787,83789,83791,83795,83796,83799,15031,2581, 83800,490, 83784,490, 83785,1160, 363, 317, 45033,404, 317, 83788, - 15480,317, 5611, 3284, 317, 396, 83790,83792,332, 83793,83794,83797,83798,70462,11608,350, 4591, 57850,45286,1347, 83802,12774,83803,7579, 11665,51317,343, - 83804,4984, 79515,363, 5828, 55446,2163, 26250,317, 39970,490, 83806,45851,83807,351, 36437,83809,10185,350, 83811,317, 83812,437, 317, 83808,317, 317, + 15480,317, 5611, 3284, 317, 396, 83790,83792,332, 83793,83794,83797,83798,70462,11608,350, 4591, 57850,45286,1347, 83802,12774,83803,7579, 11665,51317,343, + 83804,4984, 79515,363, 5828, 55446,2163, 26250,317, 39970,490, 83806,45851,83807,351, 36437,83809,10185,350, 83811,317, 83812,437, 317, 83808,317, 317, 490, 971, 83810,5570, 16951,350, 741, 317, 317, 83814,6967, 490, 2004, 317, 83816,490, 83818,83817,350, 2510, 59259,1020, 83820,83821,37441,83822,12525, - 75101,83823,83824,83825,33315,2184, 46854,83826,11836,83829,74524,379, 317, 5105, 381, 317, 2142, 343, 317, 2117, 33969,4603, 317, 535, 5464, 11034,466, + 75101,83823,83824,83825,33315,2184, 46854,83826,11836,83829,74524,379, 317, 5105, 381, 317, 2142, 343, 317, 2117, 33969,4603, 317, 535, 5464, 11034,466, 317, 317, 390, 83827,83828,2715, 13683,1345, 83831,83832,1347, 345, 83834,4952, 317, 317, 83835,350, 363, 5611, 317, 380, 83836,83837,44399,317, 18820, - 83839,317, 363, 83840,83842,83843,83844,83845,12694,351, 2680, 54361,12401,83848,490, 83849,83850,83852,42554,83856,83860,83861,83862,83866,83872,83874,317, - 83853,83855,380, 83854,490, 5205, 19307,365, 5623, 317, 31505,83857,83858,31505,490, 83859,19307,6763, 365, 332, 82100,317, 83863,317, 83864,22210,2291, + 83839,317, 363, 83840,83842,83843,83844,83845,12694,351, 2680, 54361,12401,83848,490, 83849,83850,83852,42554,83856,83860,83861,83862,83866,83872,83874,317, + 83853,83855,380, 83854,490, 5205, 19307,365, 5623, 317, 31505,83857,83858,31505,490, 83859,19307,6763, 365, 332, 82100,317, 83863,317, 83864,22210,2291, 83865,5623, 83867,343, 2351, 317, 83870,317, 317, 19307,317, 83868,83869,83871,83873,83875,83876,83877,83880,83882,83887,83890,69088,83906,433, 7865, 83910, - 83914,83926,83937,83938,83943,83948,83950,83953,83954,83955,83878,317, 2631, 83879,83881,27954,381, 83883,11064,83884,83885,317, 70459,365, 83886,350, 5401, - 83888,7785, 883, 83889,83891,390, 362, 83893,427, 317, 83896,83899,83900,83902,83903,83905,39328,83892,9357, 83894,6598, 14832,317, 49073,83895,317, 2310, - 8603, 11939,79716,11347,343, 83897,83898,5663, 490, 351, 343, 11831,7149, 83901,80497,45441,1358, 23247,39637,83904,343, 16825,83907,83908,2108, 14865,662, + 83914,83926,83937,83938,83943,83948,83950,83953,83954,83955,83878,317, 2631, 83879,83881,27954,381, 83883,11064,83884,83885,317, 70459,365, 83886,350, 5401, + 83888,7785, 883, 83889,83891,390, 362, 83893,427, 317, 83896,83899,83900,83902,83903,83905,39328,83892,9357, 83894,6598, 14832,317, 49073,83895,317, 2310, + 8603, 11939,79716,11347,343, 83897,83898,5663, 490, 351, 343, 11831,7149, 83901,80497,45441,1358, 23247,39637,83904,343, 16825,83907,83908,2108, 14865,662, 83909,3236, 343, 350, 37528,54019,5818, 390, 9224, 351, 2035, 1109, 83911,23247,382, 317, 4965, 83912,16825,317, 83913,4984, 83915,6855, 83919,8178, 83920, 83924,83916,27913,83917,6602, 83918,83921,317, 83922,83923,25193,38232,317, 83925,83806,37996,83927,83928,22267,83929,8273, 83931,83932,83933,83934,83935,83936, 16226,9878, 83930,351, 317, 350, 2272, 343, 13076,317, 14359,317, 351, 365, 12287,317, 351, 565, 12933,605, 867, 61350,971, 5248, 620, 370, 10664, 17063,11040,1020, 5526, 83939,490, 1358, 6532, 83940,83942,8446, 6227, 317, 83941,33578,2134, 83944,363, 83947,350, 83945,83946,351, 439, 2156, 1109, 83949, - 351, 350, 590, 317, 351, 350, 317, 317, 83951,83952,52206,16187,9938, 605, 371, 8281, 5611, 83957,83959,83958,83960,83961,83962,83963,83965,83967,363, + 351, 350, 590, 317, 351, 350, 317, 317, 83951,83952,52206,16187,9938, 605, 371, 8281, 5611, 83957,83959,83958,83960,83961,83962,83963,83965,83967,363, 83970,83972,83966,4984, 4984, 9483, 83968,83969,83971,14439,605, 1347, 56154,371, 83974,20159,83975,2004, 83978,390, 42573,11280,83976,83977,83980,83981,83984, - 83982,317, 83983,351, 15066,83986,83987,83990,5241, 83993,83994,83995,83996,84009,84014,84017,31246,84028,84039,84040,84042,490, 6964, 2142, 317, 24836,317, - 83988,2402, 317, 83989,9549, 317, 1915, 17469,2077, 83991,46706,317, 83992,4965, 384, 350, 370, 317, 15758,7184, 317, 34628,490, 2719, 317, 83997,8594, + 83982,317, 83983,351, 15066,83986,83987,83990,5241, 83993,83994,83995,83996,84009,84014,84017,31246,84028,84039,84040,84042,490, 6964, 2142, 317, 24836,317, + 83988,2402, 317, 83989,9549, 317, 1915, 17469,2077, 83991,46706,317, 83992,4965, 384, 350, 370, 317, 15758,7184, 317, 34628,490, 2719, 317, 83997,8594, 83999,84001,362, 84003,84004,84005,84006,7785, 83998,84000,7419, 351, 84002,362, 350, 317, 32760,2219, 47883,381, 52239,332, 12696,371, 317, 84007,84008, 84010,351, 84012,4732, 317, 4949, 84011,568, 332, 33169,24570,84013,5105, 2142, 5447, 84015,9522, 16307,44072,84016,370, 84018,8683, 84019,39581,84020,48057, - 317, 84021,84022,351, 466, 8686, 317, 406, 60933,84023,84024,84025,84026,84027,84029,490, 317, 362, 3079, 84030,84031,357, 362, 6242, 84032,84037,450, - 365, 390, 2381, 317, 84033,84036,84034,84035,351, 48162,317, 5687, 84038,6228, 343, 317, 380, 17434,317, 350, 345, 84041,9383, 84043,317, 84044,2163, + 317, 84021,84022,351, 466, 8686, 317, 406, 60933,84023,84024,84025,84026,84027,84029,490, 317, 362, 3079, 84030,84031,357, 362, 6242, 84032,84037,450, + 365, 390, 2381, 317, 84033,84036,84034,84035,351, 48162,317, 5687, 84038,6228, 343, 317, 380, 17434,317, 350, 345, 84041,9383, 84043,317, 84044,2163, 46856,574, 476, 84046,84049,84047,84048,84050,84052,84053,84054,84055,84056,84057,84058,84059,84060,84061,553, 84063,84066,84068,84070,84064,84065,42843,84067, 84069,84071,84073,84074,84075,84083,84084,84085,84086,84087,84076,84080,19243,10911,84077,84079,84078,84081,84082,565, 381, 84089,84091,84092,84102,84111,84116, - 84117,31786,84118,60598,84121,84123,84130,84137,84139,84142,450, 84150,84151,84152,84153,7114, 332, 84093,84095,84097,343, 84101,351, 84094,317, 84096,9244, - 317, 317, 84098,84099,84100,345, 8296, 13652,84103,84107,84108,8178, 84104,84105,7142, 84106,2211, 332, 2322, 2110, 73199,8296, 84109,84110,5896, 362, 565, - 84112,553, 84115,317, 84113,343, 84114,419, 2310, 428, 3505, 84119,84120,490, 20995,345, 6855, 84122,2178, 317, 317, 3284, 16589,84124,84125,84126,490, - 13638,84128,490, 343, 84129,351, 84127,65900,317, 6551, 4952, 317, 84131,84132,332, 381, 84134,84135,9688, 7940, 317, 84133,37703,37703,84136,2134, 317, + 84117,31786,84118,60598,84121,84123,84130,84137,84139,84142,450, 84150,84151,84152,84153,7114, 332, 84093,84095,84097,343, 84101,351, 84094,317, 84096,9244, + 317, 317, 84098,84099,84100,345, 8296, 13652,84103,84107,84108,8178, 84104,84105,7142, 84106,2211, 332, 2322, 2110, 73199,8296, 84109,84110,5896, 362, 565, + 84112,553, 84115,317, 84113,343, 84114,419, 2310, 428, 3505, 84119,84120,490, 20995,345, 6855, 84122,2178, 317, 317, 3284, 16589,84124,84125,84126,490, + 13638,84128,490, 343, 84129,351, 84127,65900,317, 6551, 4952, 317, 84131,84132,332, 381, 84134,84135,9688, 7940, 317, 84133,37703,37703,84136,2134, 317, 84138,350, 317, 390, 6551, 490, 332, 84140,350, 1109, 84141,84143,419, 371, 10543,84145,84147,15457,317, 84149,317, 2317, 84144,84146,317, 490, 84148, - 1020, 7892, 5836, 428, 2566, 350, 2316, 13638,2035, 7850, 317, 84155,84158,84159,84161,84156,84157,45239,2004, 84160,501, 84162,84164,84163,46183,883, 2317, + 1020, 7892, 5836, 428, 2566, 350, 2316, 13638,2035, 7850, 317, 84155,84158,84159,84161,84156,84157,45239,2004, 84160,501, 84162,84164,84163,46183,883, 2317, 84166,84167,84168,84171,84180,84183,371, 10629,6645, 80796,381, 84169,84170,2004, 67524,351, 2134, 317, 7261, 84172,84174,5159, 8519, 84178,84173,2134, 84175, 350, 84176,84177,84179,351, 365, 362, 84181,371, 84182,11347,343, 3284, 84184,84185,84186,84188,637, 84192,84195,84221,84189,84190,84191,84193,84194,84196, 936, 84199,1442, 1943, 84204,84207,84197,84198,1251, 945, 2856, 84200,84201,949, 84202,84203,84205,84206,14361,1302, 84208,84209,9965, 8047, 9978, 84210,84211, - 84212,9969, 3933, 84213,317, 84214,317, 84218,317, 84215,84216,84217,84219,84220,84222,5241, 390, 84224,84225,607, 84228,84229,84230,84231,84233,14799,5428, + 84212,9969, 3933, 84213,317, 84214,317, 84218,317, 84215,84216,84217,84219,84220,84222,5241, 390, 84224,84225,607, 84228,84229,84230,84231,84233,14799,5428, 16749,84226,84227,5640, 343, 317, 490, 15772,6568, 8296, 13950,84232,2117, 16910,50665,66110,84235,84239,84070,2503, 84240,84244,84236,84237,84238,84241,84242, 84243,4197, 672, 2503, 84245,84247,84246,317, 3226, 84248,317, 84249,1009, 594 }; @@ -12758,7 +12753,7 @@ static const unsigned short Ranks[197839] = 0, 8373, 21965,31881,9875, 27672,35491,30539,29222,19587,12627,10616,10236,10798,36023,19553,38974,13149,30125,17647,35835,35880,33012,29843,34634,38543,38535, 34466,37183,34374,33298,37355,39386,9877, 18650,18911,29370,28853,36516,36439,22394,39192,34402,35820,35070,37824,35594,36626,34317,33985,37389,38180,8025, 38063, 35262,33644,37110,23828,38286,20534,36238,25722,39240,33241,36493,36483,33752,38868,29413,36785,26811,18287,35583,21586,26347,39274,35535,38066,36482,36571,33702, - 25510,33633,37558,37524,28569,34797,33358,23183,36640,34569,36931,35876,33138,36118,25252,38373,36624,36764,39239,24471,33059,34676,35587,21647,28765,36917,2723, + 25510,33633,37558,37524,28569,34797,33358,23183,36640,34569,36931,35876,33138,36118,25252,38373,36624,36764,39239,24471,33059,34676,35587,21647,28765,36917,2723, 36218,33414,35225,35346,34701,25609,36885,39178,36609,28479,36180,38261,33988,35182,25804,34588,36386,25942,34176,30620,36870,12628,29534,34634,37382,22277,38198, 38595,35327,17190,14076,14299,37894,30244,39085,33669,32915,33192,32923,38854,37857,31685,36431,37868,37856,38893,36811,38388,35973,37607,37967,1880, 24949,22205, 32788,34763,23649,34050,35544,39322,33088,37664,34808,32971,38506,36031,39238,33863,33677,38789,36786,39076,37511,28489,37430,36462,34594,33032,35089,36963,19588, @@ -12766,22 +12761,22 @@ static const unsigned short Ranks[197839] = 29914,36862,38518,32849,38512,29651,38676,27339,13747,33163,37235,23201,27215,18644,19960,38341,36512,39366,12805,17076,36796,32784,13416,14235,28567,12863,14408, 37344,2253, 1510, 34, 21329,7998, 29956,20158,21749,13392,4560, 8677, 32816,23656,2402, 23024,19751,10893,1965, 25995,17459,22427,28510,15336,13575,20585,29937, 6165, 3226, 17765,14908,23018,20590,1516, 19972,23016,17131,13707,32047,20591,10115,12973,16180,30162,29101,28437,31319,18064,19206,12680,24291,26053,392, 19684, - 20013,7902, 5630, 11090,16408,27701,28179,30760,11290,21660,32934,758, 3973, 2798, 6295, 4225, 6683, 2048, 5278, 5733, 5430, 4659, 2973, 4936, 3100, 4202, 3585, - 24986,746, 2096, 3286, 3245, 2665, 2019, 2111, 2671, 2576, 2500, 1001, 1895, 2891, 2982, 4552, 4431, 3358, 765, 1702, 1267, 340, 3614, 23758,484, 3336, 8860, + 20013,7902, 5630, 11090,16408,27701,28179,30760,11290,21660,32934,758, 3973, 2798, 6295, 4225, 6683, 2048, 5278, 5733, 5430, 4659, 2973, 4936, 3100, 4202, 3585, + 24986,746, 2096, 3286, 3245, 2665, 2019, 2111, 2671, 2576, 2500, 1001, 1895, 2891, 2982, 4552, 4431, 3358, 765, 1702, 1267, 340, 3614, 23758,484, 3336, 8860, 11488,32814,4753, 4720, 4130, 4642, 4369, 4540, 4536, 4222, 4309, 19564,3853, 4398, 2902, 4293, 4452, 24110,19818,26173,33006,20682,10051,14060,11326,32026,27243, - 19784,25482,8783, 21439,10031,22622,11239,31625,11495,5437, 20569,5828, 5257, 3579, 4290, 4679, 4595, 3772, 3078, 3359, 3202, 3529, 4209, 20703,5245, 4316, 4235, - 4099, 4153, 3662, 3436, 3295, 3321, 3219, 3073, 3154, 3472, 4405, 6059, 5226, 5726, 5023, 4622, 4873, 4249, 4477, 4047, 3783, 3299, 3698, 3151, 3512, 4631, 4515, - 5744, 5617, 4646, 4711, 5176, 5085, 4862, 4003, 4526, 3963, 3559, 3473, 3385, 3894, 3097, 3563, 3562, 4190, 5719, 4835, 4739, 5281, 4695, 4889, 4669, 4557, 4751, - 3761, 3487, 4073, 4686, 3107, 3991, 4028, 4076, 5756, 5576, 5571, 5144, 5020, 3798, 4108, 3964, 4043, 3176, 3275, 3841, 3693, 3373, 5455, 4983, 5116, 4627, 4660, - 3918, 4224, 2928, 4314, 3640, 2719, 3925, 4000, 4336, 5882, 5713, 5452, 4929, 4030, 4386, 3746, 4271, 3268, 3623, 3530, 3274, 3087, 3347, 5487, 5433, 5294, 5265, - 5332, 3970, 3953, 3855, 3971, 4109, 3213, 3118, 4334, 5593, 5150, 5291, 4681, 4510, 4497, 3595, 3130, 4205, 3875, 4394, 3905, 32810,17113,24567,29505,26612,4658, + 19784,25482,8783, 21439,10031,22622,11239,31625,11495,5437, 20569,5828, 5257, 3579, 4290, 4679, 4595, 3772, 3078, 3359, 3202, 3529, 4209, 20703,5245, 4316, 4235, + 4099, 4153, 3662, 3436, 3295, 3321, 3219, 3073, 3154, 3472, 4405, 6059, 5226, 5726, 5023, 4622, 4873, 4249, 4477, 4047, 3783, 3299, 3698, 3151, 3512, 4631, 4515, + 5744, 5617, 4646, 4711, 5176, 5085, 4862, 4003, 4526, 3963, 3559, 3473, 3385, 3894, 3097, 3563, 3562, 4190, 5719, 4835, 4739, 5281, 4695, 4889, 4669, 4557, 4751, + 3761, 3487, 4073, 4686, 3107, 3991, 4028, 4076, 5756, 5576, 5571, 5144, 5020, 3798, 4108, 3964, 4043, 3176, 3275, 3841, 3693, 3373, 5455, 4983, 5116, 4627, 4660, + 3918, 4224, 2928, 4314, 3640, 2719, 3925, 4000, 4336, 5882, 5713, 5452, 4929, 4030, 4386, 3746, 4271, 3268, 3623, 3530, 3274, 3087, 3347, 5487, 5433, 5294, 5265, + 5332, 3970, 3953, 3855, 3971, 4109, 3213, 3118, 4334, 5593, 5150, 5291, 4681, 4510, 4497, 3595, 3130, 4205, 3875, 4394, 3905, 32810,17113,24567,29505,26612,4658, 27760,4448, 4245, 2736, 18564,4558, 4482, 32640,30791,32943,2548, 18182,12731,23263,14712,4009, 3893, 4579, 31751,32024,16210,32148,4150, 29573,33000,15385,31908, 8886, 16987,4925, 4339, 26765,4745, 18770,22538,11286,21230,4670, 4055, 4572, 26100,4623, 4454, 9935, 11318,8852, 32890,8709, 4490, 23422,14619,17642,13043,12850, 19128,6518, 15760,14033,29487,23605,33383,32969,8961, 6846, 20676,15672,18269,18760,32231,14543,14194,22865,18602,10169,30533,27397,37729,36331,33349,37987,35049, 35706,2407, 9401, 2171, 3836, 9796, 32479,33050,2187, 11676,4120, 4488, 23874,4166, 28256,8894, 4609, 4364, 5264, 24014,3003, 4586, 4425, 7780, 2867, 4412, 26306, - 5039, 32996,6833, 9638, 38267,31773,6308, 21941,2868, 14435,4443, 4716, 21007,25293,29977,6016, 3589, 23140,15513,2778, 29332,17067,3912, 3190, 11596,3189, 2452, + 5039, 32996,6833, 9638, 38267,31773,6308, 21941,2868, 14435,4443, 4716, 21007,25293,29977,6016, 3589, 23140,15513,2778, 29332,17067,3912, 3190, 11596,3189, 2452, 343, 13246,2776, 23157,6223, 11852,31068,25321,20142,3538, 3892, 2587, 1585, 5462, 29054,757, 19130,26929,20828,4332, 19732,24095,18244,34575,20810,2120, 17320, - 12235,20677,20343,33680,27075,28749,20211,27555,19984,36522,38591,18336,34765,31525,14974,11415,36813,18135,9016, 2108, 7056, 29856,4302, 6983, 20960,4114, 4531, + 12235,20677,20343,33680,27075,28749,20211,27555,19984,36522,38591,18336,34765,31525,14974,11415,36813,18135,9016, 2108, 7056, 29856,4302, 6983, 20960,4114, 4531, 4514, 4265, 38642,37657,17103,4119, 32820,8, 63, 10250,16219,24261,19323,17214,27831,3440, 11617,4027, 26955,22220,11111,5298, 22534,4735, 13460,1629, 29773, 25554,10501,20362,6021, 3861, 10756,13191,4641, 460, 30072,8208, 1340, 23728,27477,14280,30547,20733,3211, 5927, 5153, 39287,20314,6129, 28263,23866,3823, 35350, 17645,29132,4029, 1564, 2643, 13895,2896, 56, 24216,24214,7650, 347, 21816,1587, 6234, 11863,22745,9002, 19430,8957, 30274,33051,3458, 14438,29749,1203, 17984, @@ -12790,7 +12785,7 @@ static const unsigned short Ranks[197839] = 37926,24453,4574, 31094,3637, 16783,1658, 9243, 11670,12944,8744, 32004,4503, 4411, 29082,20725,30069,15061,3065, 1307, 2441, 7397, 31891,33106,4136, 25828,26219, 1718, 26722,3552, 2431, 10472,27671,10149,3626, 2045, 32878,25050,3958, 8144, 1435, 708, 11, 27852,10002,1577, 12897,10575,30070,11772,5992, 12353,16936,29056, 623, 32892,9660, 20821,2378, 23771,32344,10523,13115,17254,32707,8131, 19596,16548,18775,20166,490, 32012,11556,31069,8958, 23130,31070,1970, 23, 10006,18425, - 9724, 10487,1431, 13237,15961,9260, 25506,25302,3093, 24055,23064,32848,30062,31403,1691, 21485,17246,25590,9349, 19125,22473,23034,8737, 10896,23196,12310,9751, + 9724, 10487,1431, 13237,15961,9260, 25506,25302,3093, 24055,23064,32848,30062,31403,1691, 21485,17246,25590,9349, 19125,22473,23034,8737, 10896,23196,12310,9751, 7, 17594,7649, 7268, 4663, 33098,22260,17919,17183,11886,1193, 20720,9728, 213, 21807,10673,11887,20487,6, 21901,5863, 5747, 2877, 18339,7206, 23143,23820, 23204,16340,18655,9289, 9083, 1174, 3339, 33095,16342,540, 27810,17362,31883,1, 3830, 14611,5639, 22461,7656, 4383, 27767,29059,14441,8029, 29660,5506, 20562, 2978, 11470,9, 20718,11391,29434,6241, 32796,3, 16345,14855,17002,19377,27140,5, 32605,20370,24, 7900, 27538,11240,24953,3197, 28252,30896,22053,26477, @@ -12798,32 +12793,32 @@ static const unsigned short Ranks[197839] = 5312, 19701,14056,11907,17944,26101,8362, 7524, 5118, 9817, 6560, 7403, 693, 10741,15284,12770,14674,5538, 27400,9922, 6086, 4051, 13141,6429, 10494,12357,21513, 1997, 20746,14697,27724,2931, 12158,27076,25234,32849,20191,2742, 17392,18736,24733,13037,2833, 19376,1321, 6099, 17295,13552,29326,18066,19438,20332,1637, 20400, 23571,16308,18730,14406,9637, 19052,15249,10302,5641, 6992, 13680,8391, 18431,6506, 23988,17285,227, 1752, 17323,7540, 8819, 5741, 8306, 7745, 6772, 5795, 13118, - 6564, 6017, 9680, 12366,10151,1993, 3989, 4042, 5755, 10362,10074,296, 10852,7658, 5742, 3156, 3631, 20576,22718,1720, 2472, 26854,4652, 2692, 16840,5137, 6318, + 6564, 6017, 9680, 12366,10151,1993, 3989, 4042, 5755, 10362,10074,296, 10852,7658, 5742, 3156, 3631, 20576,22718,1720, 2472, 26854,4652, 2692, 16840,5137, 6318, 5628, 13534,7087, 1356, 14425,10012,32776,16736,30765,1887, 14442,18337,22457,8827, 5261, 13294,20183,297, 16810,17380,5302, 25816,17999,13058,7438, 20167,15098, - 8778, 6613, 10946,11141,11218,10906,22453,7594, 14807,32805,4924, 14790,451, 33040,5382, 29792,14411,23590,4683, 2881, 4982, 505, 33028,5049, 5805, 21336,4783, - 32926,3121, 13346,11200,7340, 7154, 15143,2642, 17510,14677,11532,3666, 14154,32033,11390,5467, 32040,6990, 16466,28452,12223,7042, 963, 17062,15839,3517, 7443, - 6262, 18495,4089, 2024, 86, 13427,23644,13830,10762,5665, 11278,4906, 11306,5030, 23987,29277,5212, 23131,22825,14263,7947, 6765, 23207,25955,16020,3617, 150, + 8778, 6613, 10946,11141,11218,10906,22453,7594, 14807,32805,4924, 14790,451, 33040,5382, 29792,14411,23590,4683, 2881, 4982, 505, 33028,5049, 5805, 21336,4783, + 32926,3121, 13346,11200,7340, 7154, 15143,2642, 17510,14677,11532,3666, 14154,32033,11390,5467, 32040,6990, 16466,28452,12223,7042, 963, 17062,15839,3517, 7443, + 6262, 18495,4089, 2024, 86, 13427,23644,13830,10762,5665, 11278,4906, 11306,5030, 23987,29277,5212, 23131,22825,14263,7947, 6765, 23207,25955,16020,3617, 150, 17996,3681, 655, 17754,26339,17730,14988,16456,21568,10874,20489,30065,31868,8572, 3220, 1534, 7782, 1501, 14999,25954,27864,16023,534, 33091,2428, 6002, 22831, 27459,5948, 30061,14501,25953,1592, 27806,13004,14763,23938,2801, 7687, 224, 21631,17992,30647,32183,32014,14922,1113, 11804,30571,8530, 25793,12660,30089,20880, 4220, 29142,32439,20691,13572,31585,8623, 23122,29254,12101,16558,26844,23720,8597, 27369,30924,7672, 32728,5949, 15811,1550, 10845,19126,3276, 23813,3885, 25820, 30218,27534,33, 25254,21619,1097, 11977,8574, 13455,7681, 613, 22997,855, 16533,4259, 5323, 2610, 28416,33235,14039,9216, 10166,19536,25794,26317,30304,31782, 17003,13618,14709,29220,9985, 1583, 14468,12146,6758, 9434, 15959,25951,27454,32063,761, 25638,12056,9773, 14150,27845,28833,27453,27452,22862,18763,32080,22886, 16467,22911,25946,32102,31865,24075,15172,24969,33084,26669,32103,32110,26745,28841,2076, 18038,29754,29289,31996,31747,12260,31189,25558,7526, 12681,26183,15626, - 25695,34550,33063,3237, 4318, 13061,2841, 16679,2783, 10743,350, 28138,8460, 8271, 25058,29565,1929, 4732, 4379, 4233, 4146, 4422, 36478,35444,33587,29557,4676, + 25695,34550,33063,3237, 4318, 13061,2841, 16679,2783, 10743,350, 28138,8460, 8271, 25058,29565,1929, 4732, 4379, 4233, 4146, 4422, 36478,35444,33587,29557,4676, 6197, 64, 23111,16575,9462, 16576,21857,29934,23533,1909, 2234, 31199,4849, 19175,7666, 5273, 10961,29432,29433,27469,33383,11721,16455,16582,26989,33465,32793, - 32794,668, 12670,25309,29563,26911,3938, 27759,26262,25312,17094,34290,20525,2413, 10076,27141,2668, 17082,29560,18000,9151, 20990,9405, 32796,1083, 10109,785, + 32794,668, 12670,25309,29563,26911,3938, 27759,26262,25312,17094,34290,20525,2413, 10076,27141,2668, 17082,29560,18000,9151, 20990,9405, 32796,1083, 10109,785, 15337,6361, 4186, 5721, 10662,23110,19196,11728,27883,10540,2960, 3216, 19365,11123,29436,4987, 9465, 13891,14281,28178,21793,29802,1911, 29437,3158, 27127,29439, - 33614,30055,20579,25821,31103,32800,31162,34375,1996, 4465, 4701, 26336,28741,28738,4255, 20616,32253,30575,4357, 23616,7796, 26893,23614,1042, 31763,26885,792, + 33614,30055,20579,25821,31103,32800,31162,34375,1996, 4465, 4701, 26336,28741,28738,4255, 20616,32253,30575,4357, 23616,7796, 26893,23614,1042, 31763,26885,792, 20563,4740, 32950,25705,38978,29478,29570,34216,16140,25700,34122,4858, 18325,9504, 26870,32458,22250,34460,32972,37925,14300,469, 21791,2908, 427, 21909,25629, 3090, 27803,32581,6777, 10040,3725, 20667,493, 9528, 30053,6182, 706, 27802,5014, 1073, 1194, 8346, 1419, 31849,3454, 31101,33537,39016,5439, 17854,30064,30415, 3165, 32984,15908,23826,32217,27345,2098, 29501,14165,23753,29491,4619, 4719, 4077, 4655, 28371,2201, 37937,12387,4696, 25314,22640,15402,32618,9363, 32972,33757, 12328,27247,30404,35516,31314,32960,29707,22652,13388,4019, 7160, 30283,32845,22654,1896, 34003,11726,34194,32595,20775,34901,32844,33601,33593,33864,31177,19884, - 29928,31727,18327,33374,23255,26617,31845,31454,16192,6076, 249, 21787,26103,15653,18653,29380,31842,29067,5011, 32078,24168,13399,3494, 8069, 16592,3568, 68, + 29928,31727,18327,33374,23255,26617,31845,31454,16192,6076, 249, 21787,26103,15653,18653,29380,31842,29067,5011, 32078,24168,13399,3494, 8069, 16592,3568, 68, 20235,19437,27259,9368, 23101,15219,21910,13915,6893, 16927,15873,27911,10023,25875,7596, 15678,17959,20779,7928, 12707,14448,5406, 13628,10532,648, 26102,13404, 32982,34020,17659,2020, 19907,4569, 4567, 28429,4710, 14106,30314,27363,2383, 33875,22183,34362,24210,21600,20869,33407,24777,28499,18321,34744,25282,21601,35036, - 28491,21604,33579,27038,32970,27976,33858,31051,18575,1785, 16396,1439, 4713, 29589,12318,4424, 4601, 22093,26347,33736,21626,8416, 12810,34779,24462,31766,8975, - 20985,4294, 21851,34744,21871,29904,21549,34560,20173,29103,17812,30042,34632,16828,23180,4476, 31774,35257,15928,12164,35608,14195,31775,18297,32792,1695, 7308, - 4304, 4613, 28722,4629, 19486,27872,34869,4350, 5834, 31713,9380, 24556,8019, 23254,36685,6986, 17028,34583,6679, 2293, 33039,5677, 32995,5560, 27420,36437,5235, + 28491,21604,33579,27038,32970,27976,33858,31051,18575,1785, 16396,1439, 4713, 29589,12318,4424, 4601, 22093,26347,33736,21626,8416, 12810,34779,24462,31766,8975, + 20985,4294, 21851,34744,21871,29904,21549,34560,20173,29103,17812,30042,34632,16828,23180,4476, 31774,35257,15928,12164,35608,14195,31775,18297,32792,1695, 7308, + 4304, 4613, 28722,4629, 19486,27872,34869,4350, 5834, 31713,9380, 24556,8019, 23254,36685,6986, 17028,34583,6679, 2293, 33039,5677, 32995,5560, 27420,36437,5235, 13458,32097,32865,4427, 12466,34513,4743, 36797,28950,1419, 5603, 31784,4408, 35501,35299,4374, 9207, 7897, 38326,2032, 12207,18973,27867,2647, 4810, 1481, 29086, 31001,36467,1640, 33103,19082,26141,26142,12758,38876,2401, 2900, 38112,17802,1276, 18918,933, 27001,22059,32398,23454,23455,32984,4541, 37657,9132, 13054,26970, 856, 21130,26968,21563,25091,13019,22069,20379,23479,13585,32437,24296,22079,32445,29019,26901,18600,32468,30338,38719,6137, 13592,27889,29017,25064,819, 32483, @@ -12837,13 +12832,13 @@ static const unsigned short Ranks[197839] = 18098,32394,31333,28639,15014,22520,28016,18162,11114,19302,32955,19089,25454,24674,26166,10967,28485,8171, 32525,12436,29504,14827,12688,17961,32592,35242,22233, 21141,10174,12708,26080,22190,33081,19240,4664, 33032,25182,14547,20934,22641,18389,25868,22406,27957,24979,32202,25326,20935,16638,17960,27251,17017,26678,21716, 30504,25746,29826,9488, 21833,20559,24818,17241,18871,27710,29030,7638, 15834,9575, 12399,32769,26007,25069,31226,10170,18388,23601,29384,24731,12764,14708,25749, - 10176,14288,20439,18239,15667,13956,21863,31522,25931,9586, 28526,29695,17563,11746,21585,22537,32650,15802,30407,25457,16375,26126,27047,18786,31313,11752,8578, + 10176,14288,20439,18239,15667,13956,21863,31522,25931,9586, 28526,29695,17563,11746,21585,22537,32650,15802,30407,25457,16375,26126,27047,18786,31313,11752,8578, 16429,23449,15681,27238,27236,26532,18426,21347,32602,24052,32412,11066,31155,20948,9831, 29601,15220,15325,20735,27245,23586,15803,15433,21232,18047,10586,31072, 15860,28758,24363,31661,29729,9558, 24810,18246,24700,22845,23476,26324,7914, 23782,27632,27960,24701,29200,6289, 9694, 14251,24304,26045,30014,19845,30373,31324, 21591,23809,11851,4950, 22417,24616,16041,32738,15524,22075,26573,19020,5483, 20444,19723,18364,20593,5705, 26849,32930,7754, 7292, 22539,26657,25619,31839,23710, 17665,32298,31637,20037,25596,22320,6899, 25433,27704,10578,29692,24099,32493,28283,23444,12744,18053,25550,33085,16075,27216,20752,13405,1442, 7049, 11552,29698, - 21622,24017,12564,32698,16296,11489,14111,19250,17822,18624,21074,21511,18403,22856,30059,32792,28827,33007,3074, 25785,25859,12803,5371, 6120, 10275,21444,8168, - 689, 192, 2812, 291, 1362, 20940,30657,3669, 13360,2233, 14629,26460,15899,19767,10135,24844,8956, 26762,14896,3234, 28, 31588,1009, 6700, 17306,17369,8281, + 21622,24017,12564,32698,16296,11489,14111,19250,17822,18624,21074,21511,18403,22856,30059,32792,28827,33007,3074, 25785,25859,12803,5371, 6120, 10275,21444,8168, + 689, 192, 2812, 291, 1362, 20940,30657,3669, 13360,2233, 14629,26460,15899,19767,10135,24844,8956, 26762,14896,3234, 28, 31588,1009, 6700, 17306,17369,8281, 13281,24984,7965, 17000,23341,28823,5972, 312, 5557, 16730,5638, 17331,10301,5990, 28114,7457, 2595, 14403,29769,32890,13614,19641,26274,26628,31465,30927,25866, 8322, 24256,32871,18243,10966,25608,26198,16565,19258,18367,32954,28861,24928,29005,32163,15369,25585,13790,29836,15813,27952,31680,27354,8942, 13809,8866, 30989, 29359,17283,29714,13975,23735,16070,29828,18103,26372,12465,30071,27046,22707,31639,27275,13332,845, 17309,29885,15788,19281,32540,31242,17979,29686,33002,33093, @@ -12852,50 +12847,50 @@ static const unsigned short Ranks[197839] = 34033,15339,16632,25860,27329,33072,16589,17958,3756, 3878, 6492, 13121,22971,15829,15011,27244,18380,31874,35564,38077,30581,38748,38897,39415,17488,2455, 22174, 30437,11731,26712,2807, 28898,12778,4556, 28718,18409,32748,16359,4639, 31546,4270, 28717,30037,30559,4651, 27115,4573, 11099,30873,14501,9515, 4426, 33105,32952, 27973,13935,35527,25329,12678,24903,30254,38062,36497,37587,32933,27467,6507, 915, 4260, 4142, 3348, 4547, 4767, 4625, 30857,4697, 17178,313, 10788,10716,15615, - 29070,25333,19413,10265,30701,2572, 19713,32887,27792,16728,6588, 17318,31218,16386,20596,31524,20121,15911,2494, 4504, 4592, 4274, 4718, 4035, 4770, 5224, 4680, + 29070,25333,19413,10265,30701,2572, 19713,32887,27792,16728,6588, 17318,31218,16386,20596,31524,20121,15911,2494, 4504, 4592, 4274, 4718, 4035, 4770, 5224, 4680, 31058,18082,19127,32975,31121,29110,32976,20224,32805,32801,2269, 8325, 7711, 21427,5469, 11422,19021,21429,5205, 1755, 7653, 27688,24282,10069,32786,31792,11425, 24705,4617, 6093, 8476, 12950,3817, 39317,24284,32982,17006,27399,24698,5194, 22869,28492,6986, 4748, 4287, 12550,23099,15145,30967,9912, 30970,30029,7052, 12836, 9711, 30971,16516,19116,16289,30972,30977,2909, 10391,13904,31654,13897,17120,5248, 4975, 16646,30043,4382, 27664,31244,4254, 4764, 22847,11082,24486,10894,22179, - 33062,1426, 4535, 16259,30988,26085,857, 6791, 15154,9706, 21497,28592,21496,3582, 33060,14670,18023,28594,30986,20636,30315,24995,22506,15389,4980, 39184,8547, + 33062,1426, 4535, 16259,30988,26085,857, 6791, 15154,9706, 21497,28592,21496,3582, 33060,14670,18023,28594,30986,20636,30315,24995,22506,15389,4980, 39184,8547, 29382,26015,19431,4546, 4741, 30028,4395, 4709, 17292,22956,29150,4568, 21764,11478,6705, 25342,12970,8992, 17712,22699,24293,24589,23620,3355, 6824, 4434, 30846, 31779,13549,28001,1486, 11993,27624,22692,11656,4781, 1537, 10590,17414,3726, 4897, 23067,37635,36985,4053, 28706,4722, 31188,28435,4083, 30526,15254,22557,19336, 30720,19493,21049,9268, 5555, 4527, 11505,9840, 16181,14456,20140,7277, 25346,5641, 4565, 4585, 4441, 4389, 12267,18296,21247,32791,23948,22846,5943, 4582, 28697, 33013,33013,4554, 4542, 31772,16984,24696,6173, 29967,17821,14153,13561,25595,26121,14242,28166,17653,17606,32881,27277,10116,36109,28060,21536,4973, 11319,20861, 11635,13089,25308,13162,30832,6305, 28331,23108,16427,13795,27019,25477,23400,31539,13209,979, 36210,15535,38750,33037,11874,31334,32962,6655, 31437,22430,27554, 8988, 11433,32068,17125,13101,6397, 26549,10119,29766,9335, 26696,6563, 13026,4227, 36281,8652, 8766, 4645, 8079, 4530, 13309,4241, 5210, 15529,12594,13319,36110, - 33222,34529,20507,10342,27892,35934,17764,18443,37603,23498,37585,38829,38474,23475,24646,36218,31191,4944, 4634, 27981,27079,19948,15477,27884,14381,27931,943, - 7094, 933, 11899,13192,23357,38442,8124, 353, 9419, 25120,21114,19542,39264,34727,6594, 36607,2165, 2307, 11888,31770,1039, 9117, 2093, 5586, 30285,9021, 5685, - 20765,12525,23153,9427, 9764, 19184,35574,10527,19158,9767, 12909,7828, 14387,2330, 18553,22022,9284, 9769, 16361,32914,32949,32889,20530,4971, 18291,6071, 2682, - 9373, 4033, 11751,7124, 15275,22019,5908, 32914,10686,13182,8063, 15367,22017,32907,2755, 22016,18550,16651,7900, 9188, 21775,27122,15569,30020,23054,32321,8915, - 15542,18544,9100, 20394,27048,7685, 36005,36621,35794,39216,4854, 8058, 20973,5102, 8663, 32308,24598,36142,13851,7676, 19422,32060,23487,32307,32246,28995,2002, + 33222,34529,20507,10342,27892,35934,17764,18443,37603,23498,37585,38829,38474,23475,24646,36218,31191,4944, 4634, 27981,27079,19948,15477,27884,14381,27931,943, + 7094, 933, 11899,13192,23357,38442,8124, 353, 9419, 25120,21114,19542,39264,34727,6594, 36607,2165, 2307, 11888,31770,1039, 9117, 2093, 5586, 30285,9021, 5685, + 20765,12525,23153,9427, 9764, 19184,35574,10527,19158,9767, 12909,7828, 14387,2330, 18553,22022,9284, 9769, 16361,32914,32949,32889,20530,4971, 18291,6071, 2682, + 9373, 4033, 11751,7124, 15275,22019,5908, 32914,10686,13182,8063, 15367,22017,32907,2755, 22016,18550,16651,7900, 9188, 21775,27122,15569,30020,23054,32321,8915, + 15542,18544,9100, 20394,27048,7685, 36005,36621,35794,39216,4854, 8058, 20973,5102, 8663, 32308,24598,36142,13851,7676, 19422,32060,23487,32307,32246,28995,2002, 8227, 20972,21735,16836,25138,20971,37935,13239,17018,3818, 23326,5526, 18942,23390,3856, 27914,8347, 7609, 17681,21867,3240, 32295,39041,21678,31445,8033, 17831, 23321,26895,38573,8661, 10865,25364,23389,25144,31136,11694,18290,16312,29873,20143,8167, 18532,7605, 8489, 17206,28033,32930,38244,11996,37594,33093,9595, 22056, 7255, 10300,21768,11036,33413,5761, 12939,30375,13038,14055,13693,1195, 6728, 10794,11330,13588,20709,31900,17711,14857,4551, 17224,10849,30260,20825,18068,16314, - 22830,13571,38501,23494,27010,20969,32881,31760,19624,25770,14305,24854,32880,33113,31509,6180, 2739, 1268, 24611,25146,32937,4589, 19922,9125, 4693, 4327, 2354, + 22830,13571,38501,23494,27010,20969,32881,31760,19624,25770,14305,24854,32880,33113,31509,6180, 2739, 1268, 24611,25146,32937,4589, 19922,9125, 4693, 4327, 2354, 497, 13471,27199,23047,32106,27823,32277,30252,23372,30013,3645, 8927, 15546,21990,21729,8262, 18430,7880, 14363,19356,30248,11756,16540,9751, 25156,3733, 21986, 18511,37726,21086,5727, 21981,27272,14358,18509,32232,11145,19428,6348, 17736,18504,9835, 25167,7562, 21721,1612, 23297,18503,27511,25095,8868, 9724, 16054,14283, 10446,31141,19207,15491,18944,21080,813, 13185,21030,9226, 2388, 12038,23294,1665, 29012,13186,19708,32963,1403, 6047, 25233,24303,19915,22703,20867,4258, 37348, 9371, 10884,26151,19720,20541,27300,22038,10480,30011,17928,11163,21968,25713,10451,23259,10586,18255,17061,9314, 16997,323, 16111,31030,12965,25075,25179,30223, 27475,10472,11050,15240,30010,23335,13383,32193,14750,35409,5977, 20928,9467, 14925,14447,23199,37380,17699,37056,15547,24263,4737, 32855,21920,10891,18779,19256, - 19873,32855,19893,21574,22281,28443,11387,22370,19073,12942,18796,13109,38105,18247,28488,33090,30024,18268,34766,16871,10195,11846,23513,8584, 10925,13222,2058, - 25101,26740,19671,10464,33087,27506,32923,30396,1400, 15493,14180,11588,12769,9607, 24260,18631,20233,35742,19602,6108, 13090,14296,12940,35372,5941, 26383,9571, - 34540,27372,20138,14814,27353,25011,25204,36713,21328,37838,33625,37635,38927,35573,30592,30156,2252, 30666,36613,34830,3433, 4862, 11810,20970,27357,309, 5449, + 19873,32855,19893,21574,22281,28443,11387,22370,19073,12942,18796,13109,38105,18247,28488,33090,30024,18268,34766,16871,10195,11846,23513,8584, 10925,13222,2058, + 25101,26740,19671,10464,33087,27506,32923,30396,1400, 15493,14180,11588,12769,9607, 24260,18631,20233,35742,19602,6108, 13090,14296,12940,35372,5941, 26383,9571, + 34540,27372,20138,14814,27353,25011,25204,36713,21328,37838,33625,37635,38927,35573,30592,30156,2252, 30666,36613,34830,3433, 4862, 11810,20970,27357,309, 5449, 29020,26148,6673, 23323,29422,9077, 23272,16319,9813, 5237, 30215,10210,23267,21070,17090,14799,23316,10081,33019,30008,21523,5192, 33043,10659,23391,10989,13173, 32159,27407,19924,14397,15428,26385,26386,30006,25199,17055,31377,29736,10706,32142,13878,32139,27439,27442,27866,17104,29029,21412,10480,26138,13612,9464, 12788, 10247,11718,2919, 21066,21742,7565, 16052,8012, 10216,16090,10753,23878,9467, 10853,22392,16627,14391,27518,31941,12665,25368,1227, 13459,2606, 30005,10511,14348, 29224,23298,17874,5200, 14812,18483,14347,11712,18481,12016,6163, 8884, 10591,33012,10102,20385,32134,14838,32133,10864,25684,19792,19217,27859,12728,10805,20550, 26133,18044,23038,21063,4757, 13243,10409,23237,32203,11986,26187,11699,38906,25568,24249,29927,34549,26925,33088,28000,8713, 16706,26122,17686,12675,31306,24913, 22983,15814,20174,15437,8560, 21239,1623, 23238,30467,21893,5413, 16666,18477,26055,38385,36149,18277,27739,21738,27705,24149,8579, 7893, 7392, 18475,14345,26132, - 12384,30446,8484, 17904,13711,13055,29753,19642,19228,4344, 32125,32811,12166,15167,27490,17825,25123,13115,6975, 3179, 27, 8549, 9128, 25876,12274,13067,3664, + 12384,30446,8484, 17904,13711,13055,29753,19642,19228,4344, 32125,32811,12166,15167,27490,17825,25123,13115,6975, 3179, 27, 8549, 9128, 25876,12274,13067,3664, 24459,22031,11476,23225,30184,23264,7739, 25224,31736,16081,14338,30180,7010, 5735, 23258,6978, 21056,17893,25230,7368, 21, 18275,8156, 14191,17707,1879, 15276, 19911,837, 18645,33103,21009,31228,21054,13080,33030,13320,18108,22076,36471,32841,30316,31773,12660,28527,23217,29996,1645, 19835,29037,8423, 32781,24240,24270, 13344,18861,18274,20041,25880,14726,25235,9634, 24269,14137,8481, 28083,75, 3737, 19, 23029,32084,18456,8129, 32082,12257,5443, 15479,26104,32979,27612,30747, 12735,36136,36904,14189,12802,24770,30247,19486,11869,1871, 6722, 18945,31066,26981,35429,36166,18677,18453,19408,3752, 36834,18452,21507,32846,18451,13868,25369, 21903,34806,7497, 10068,31732,33039,30168,12896,29444,19237,32211,23790,16283,13429,2033, 16682,38232,15321,32233,4219, 19895,10555,6178, 6901, 15465,6480, 33042, - 6230, 32052,9791, 30157,15482,809, 9092, 690, 20728,17579,4860, 31142,7817, 19213,30154,19390,20662,25246,8503, 17243,39000,10192,6909, 14346,25372,1686, 7543, + 6230, 32052,9791, 30157,15482,809, 9092, 690, 20728,17579,4860, 31142,7817, 19213,30154,19390,20662,25246,8503, 17243,39000,10192,6909, 14346,25372,1686, 7543, 13889,871, 23085,19360,21884,22772,12796,10117,16049,18003,33829,9196, 18936,26581,27838,16968,12830,15148,27150,30148,13137,30147,2443, 13296,19929,32034,30146, - 8111, 32030,7994, 27654,23216,5556, 9880, 6643, 26094,5969, 19947,15144,29, 14818,5465, 32867,32955,25467,25133,18565,16908,2678, 10046,2998, 5481, 13984,8381, - 18007,28495,17926,2582, 21038,33095,13588,2890, 23210,21037,21874,23198,13892,18971,2916, 33047,32006,28678,25258,2102, 10493,11014,4001, 257, 18264,2271, 383, + 8111, 32030,7994, 27654,23216,5556, 9880, 6643, 26094,5969, 19947,15144,29, 14818,5465, 32867,32955,25467,25133,18565,16908,2678, 10046,2998, 5481, 13984,8381, + 18007,28495,17926,2582, 21038,33095,13588,2890, 23210,21037,21874,23198,13892,18971,2916, 33047,32006,28678,25258,2102, 10493,11014,4001, 257, 18264,2271, 383, 4128, 26130,31011,1244, 13286,21873,4937, 8472, 6413, 21882,1861, 5624, 22928,29042,9494, 31144,23200,2403, 27909,31123,11997,13198,38684,13847,33086,3167, 27779, 15454,13435,35710,35407,12338,31457,21045,22650,19597,17931,20220,19298,6487, 9410, 25718,21298,21576,15008,26363,32775,21184,16882,17839,30957,17005,23822,33036, 1913, 18679,10824,3279, 15982,17353,21868,14596,13816,20846,38019,36951,32938,20715,13540,28931,27143,33006,21650,32805,6671, 10578,13274,16912,4141, 13693,32985, @@ -12905,11 +12900,11 @@ static const unsigned short Ranks[197839] = 23330,32283,14960,36030,36369,9487, 10047,37980,11437,22217,6020, 1742, 16396,8674, 9084, 26807,2117, 16732,24496,21212,14958,21111,9154, 13268,28837,29987,23883, 28836,31310,20451,2788, 6375, 31716,1817, 31957,20069,27532,26976,15565,7186, 11089,29980,6585, 1202, 30886,6889, 25381,29050,32314,6147, 6535, 33094,16309,31336, 21019,19384,29979,3425, 16530,642, 17071,24433,19823,18347,22589,19925,17477,10606,29978,5697, 31950,13396,1124, 18641,31699,25385,3489, 32751,15089,21825,16722, - 15105,18640,6000, 7113, 29497,9302, 10737,32054,1913, 10568,2305, 23929,12790,10611,29385,17471,31152,18366,10746,12812,31003,18335,23002,29053,6569, 4121, 4464, + 15105,18640,6000, 7113, 29497,9302, 10737,32054,1913, 10568,2305, 23929,12790,10611,29385,17471,31152,18366,10746,12812,31003,18335,23002,29053,6569, 4121, 4464, 31166,7015, 15090,10189,1644, 12184,3341, 33045,28139,27773,6634, 28800,8201, 18587,26112,7347, 20560,13785,33077,32850,19727,24683,28145,31459,20123,5196, 14434, 6489, 31924,3684, 12147,26285,16514,14687,6468, 8375, 13029,12025,15779,31920,4749, 26091,8734, 6390, 18637,16520,23163,28887,29673,16312,38607,36143,39071,23957, 25716,27172,12107,19169,22146,22286,14801,2238, 34663,26022,11729,36859,37692,35358,38634,38600,33917,34417,19195,36762,4, 19997,21570,24086,10467,8314, 13746, - 24772,24948,36906,7343, 4259, 38312,13183,32970,34865,9727, 21048,3228, 6836, 30877,24595,19986,14936,10769,9971, 5064, 494, 486, 1167, 3344, 2367, 17869,7463, + 24772,24948,36906,7343, 4259, 38312,13183,32970,34865,9727, 21048,3228, 6836, 30877,24595,19986,14936,10769,9971, 5064, 494, 486, 1167, 3344, 2367, 17869,7463, 24484,20276,10936,25520,19686,25086,18257,29420,24609,23373,17284,3707, 6396, 8641, 24300,31678,15751,677, 24180,718, 6619, 16508,2745, 28067,1676, 6718, 28445, 26913,22920,31217,35193,36474,38133,19806,19885,22551,25099,32153,35017,21711,32401,21482,21331,6841, 19456,12995,15127,21935,25441,11575,33000,21987,18855,26074, 17199,12926,32804,18659,20837,14605,10859,14633,3116, 27073,33055,33021,5257, 1758, 21487,6323, 19114,25476,19961,30851,30935,11079,17706,28121,17522,11646,20029, @@ -12924,7 +12919,7 @@ static const unsigned short Ranks[197839] = 26521,19993,654, 29618,24067,23089,1893, 23692,1695, 13, 2774, 2208, 6109, 18900,26403,14737,20958,37158,10134,16255,31960,35265,26483,14649,2836, 222, 18331, 33097,18001,13249,17302,11157,23835,13530,5621, 37285,8061, 7755, 34942,34194,19989,14318,10614,44072,34858,41088,27949,35084,41087,44072,34231,41087,21700,19137, 14612,13163,41087,12374,34613,34363,6874, 21567,36459,20066,6552, 37331,33519,36067,33232,9542, 4190, 38985,17589,6355, 17588,15848,37796,32937,684, 18870,15590, - 38059,34230,9233, 4825, 27978,34230,37556,38956,36245,44072,33088,19284,35581,27763,700, 32812,41087,39026,21645,38955,35053,36956,22222,32912,28417,17069,425, + 38059,34230,9233, 4825, 27978,34230,37556,38956,36245,44072,33088,19284,35581,27763,700, 32812,41087,39026,21645,38955,35053,36956,22222,32912,28417,17069,425, 41086,25263,32609,35950,19322,37331,11770,3502, 23098,37330,24822,38955,34230,10055,21425,27948,23610,32912,33519,33993,22221,34761,44071,30634,15603,4749, 29341, 17356,1897, 12850,38378,22840,34717,19321,41086,1411, 7373, 19992,16666,25103,38955,39419,14185,36077,33568,44071,38955,41086,18663,6700, 22954,4789, 15210,13178, 1233, 28594,33162,36853,38117,33380,38891,19057,34000,36982,39369,37687,31919,30165,32975,6308, 38830,33077,6425, 20193,33544,23704,17569,492, 9420, 23689,44071, @@ -12934,42 +12929,42 @@ static const unsigned short Ranks[197839] = 18662,36077,38954,38954,41085,15208,31939,38386,32114,44069,28, 18276,14566,487, 18661,38208,41084,12171,23097,24760,11850,5824, 37330,309, 44069,24205,10359, 29555,9239, 3903, 868, 31359,44069,20895,18724,17651,38158,31547,44069,15793,41084,1150, 4787, 37330,38818,22866,15847,14918,38632,39189,6453, 17586,38953,36076, 6322, 44068,29554,2410, 19988,34230,44068,37134,38953,14381,38054,37811,13392,44068,2233, 37927,27284,34867,36371,32911,9119, 7262, 7141, 17585,34229,34828,36076, - 17260,7400, 34794,28437,36604,22397,33908,18660,2322, 21062,4013, 14077,34888,16688,37329,6414, 32911,6927, 21012,16664,2470, 33082,2235, 439, 37928,21566,9008, + 17260,7400, 34794,28437,36604,22397,33908,18660,2322, 21062,4013, 14077,34888,16688,37329,6414, 32911,6927, 21012,16664,2470, 33082,2235, 439, 37928,21566,9008, 26584,29346,35264,10808,17584,21565,41084,5866, 34285,3543, 21564,23249,22035,9028, 14148,5803, 16663,18594,28023,26348,27815,8547, 9498, 3827, 3706, 12053,13874, 8651, 21627,35413,13657,2707, 30307,36090,17583,21563,29160,36076,2966, 21847,37329,23226,32199,33519,8900, 44068,6424, 31158,44067,38953,17868,16656,10948,37667, 5500, 30624,4612, 8546, 22220,35053,18148,2438, 4870, 16662,27168,7368, 7445, 6354, 44067,17582,29173,20869,26934,26789,23258,13110,14076,10286,33392,21279,23271, 13784,21058,8635, 38017,37178,6211, 854, 23832,18377,9845, 13400,23949,3965, 8041, 7267, 478, 13070,13696,36155,15853,44067,37329,20690,33411,5849, 36362,10366, - 35360,5923, 32621,32177,12330,44067,18705,19319,35610,27114,17108,37435,33600,8545, 8637, 5800, 20901,11465,5941, 34102,10203,19434,33646,35499,3072, 17297,9921, - 15846,22076,39208,29473,718, 29430,4134, 3795, 1086, 2912, 15365,34674,4807, 14470,78, 29318,6139, 30127,12188,18639,1129, 30714,9717, 15256,21351,25263,6792, + 35360,5923, 32621,32177,12330,44067,18705,19319,35610,27114,17108,37435,33600,8545, 8637, 5800, 20901,11465,5941, 34102,10203,19434,33646,35499,3072, 17297,9921, + 15846,22076,39208,29473,718, 29430,4134, 3795, 1086, 2912, 15365,34674,4807, 14470,78, 29318,6139, 30127,12188,18639,1129, 30714,9717, 15256,21351,25263,6792, 4407, 19851,8165, 2632, 10690,5844, 37188,12133,6020, 15845,4420, 20666,41084,602, 5297, 2461, 38686,16661,3090, 29482,39355,31152,3643, 3322, 20229,21562,21561, - 25132,37329,14377,6707, 38723,37328,3100, 10110,14011,10134,3997, 6920, 1843, 10369,8193, 33223,17753,5250, 4080, 17581,3737, 12690,2666, 2486, 19991,16660,5912, - 5577, 595, 16976,3722, 10189,213, 4299, 9552, 30645,34815,11555,36076,35053,10807,31764,1136, 8049, 30593,6264, 6699, 13692,3752, 8404, 24323,5355, 3418, 1979, - 18659,11800,37173,4615, 33141,3752, 16054,36660,37362,19193,14661,38257,24314,17498,34069,33281,35900,9657, 5582, 18450,12516,7323, 25920,22848,37088,3773, 3025, - 5323, 18658,34229,4189, 3040, 17733,2641, 1677, 17580,21560,8544, 2181, 6551, 38837,7460, 33046,20937,2706, 16607,23343,26769,17769,8390, 31952,19318,32911,8543, + 25132,37329,14377,6707, 38723,37328,3100, 10110,14011,10134,3997, 6920, 1843, 10369,8193, 33223,17753,5250, 4080, 17581,3737, 12690,2666, 2486, 19991,16660,5912, + 5577, 595, 16976,3722, 10189,213, 4299, 9552, 30645,34815,11555,36076,35053,10807,31764,1136, 8049, 30593,6264, 6699, 13692,3752, 8404, 24323,5355, 3418, 1979, + 18659,11800,37173,4615, 33141,3752, 16054,36660,37362,19193,14661,38257,24314,17498,34069,33281,35900,9657, 5582, 18450,12516,7323, 25920,22848,37088,3773, 3025, + 5323, 18658,34229,4189, 3040, 17733,2641, 1677, 17580,21560,8544, 2181, 6551, 38837,7460, 33046,20937,2706, 16607,23343,26769,17769,8390, 31952,19318,32911,8543, 22219,44066,13444,25248,34330,44066,7344, 35052,7972, 25013,17228,33409,36075,44066,32911,44066,12863,7349, 12015,29369,32713,36176,8294, 16951,17548,22625,38963, 17932,32952,17289,36706,24197,31343,22218,29553,44065,774, 7720, 18147,41083,28835,19282,30868,35003,17710,38953,12926,5665, 36075,34591,18657,26520,41083,15792, 33773,25967,7565, 11659,37202,37326,19226,1983, 1260, 2251, 3021, 35038,30086,11260,3824, 36625,16369,1816, 25834,44065,6497, 21559,19388,36316,15844,32910,24113, 22217,38021,36075,38952,4168, 15843,41083,41083,1771, 30445,5356, 8702, 27896,15114,15842,12687,4508, 26519,37328,16659,32831,36592,44065,26782,36075,2084, 19987, 35052,1177, 10512,36074,10691,35052,41082,41082,33518,27947,32910,35052,15388,3988, 8190, 14317,38952,3519, 3494, 14216,35291,9856, 9800, 17133,37038,31721,20419, 30005,39006,13819,13109,44065,35478,9720, 23279,4620, 19687,10365,23096,36074,44064,21424,29969,27424,36712,35154,37328,6600, 44064,11423,20637,44064,460, 44064, - 32138,35051,2967, 21514,25732,11747,38476,15207,4747, 10133,4305, 18704,37304,27951,33273,38952,3634, 911, 12197,4997, 2560, 6439, 36897,11086,6557, 25673,3980, + 32138,35051,2967, 21514,25732,11747,38476,15207,4747, 10133,4305, 18704,37304,27951,33273,38952,3634, 911, 12197,4997, 2560, 6439, 36897,11086,6557, 25673,3980, 16958,4350, 2590, 29552,34229,38508,21166,34725,34344,11877,15456,22379,33357,25440,32899,41082,37402,6461, 26007,13806,33854,418, 18656,37406,12819,35811,39273, - 300, 16184,1917, 38742,34426,8542, 717, 38811,34552,457, 39235,18476,21558,1385, 37909,26518,38181,5445, 3589, 11160,12233,4942, 36825,19990,21557,572, 2991, + 300, 16184,1917, 38742,34426,8542, 717, 38811,34552,457, 39235,18476,21558,1385, 37909,26518,38181,5445, 3589, 11160,12233,4942, 36825,19990,21557,572, 2991, 29909,16539,5065, 2771, 3502, 624, 1005, 5703, 772, 37598,1820, 1099, 7052, 20781,1254, 32227,1600, 14075,18655,173, 21556,30291,29904,39371,22130,34193,23065, 21444,35533,16331,22292,7890, 21800,21555,19102,33493,35337,12473,2773, 13574,21554,4777, 8337, 26728,17308,20447,37600,38063,4287, 21827,38450,28208,17236,36275, - 31968,304, 36709,30484,27946,28222,12689,10949,2918, 1544, 32602,32632,16637,860, 2716, 44063,69, 26435,9265, 3055, 13397,18376,29880,9129, 13108,33518,5811, + 31968,304, 36709,30484,27946,28222,12689,10949,2918, 1544, 32602,32632,16637,860, 2716, 44063,69, 26435,9265, 3055, 13397,18376,29880,9129, 13108,33518,5811, 19989,28893,25481,31413,38952,29551,11446,2759, 44063,14674,5938, 22216,41082,29550,31358,37328,8767, 44063,44063,34, 10632,44062,8314, 34229,1998, 44062,32773, 38978,35051,629, 13913,39150,34228,5973, 25371,16630,2242, 4790, 25213,1967, 11463,18907,9129, 13518,33257,6882, 25000,38877,20102,33186,30626,24643,37853,17466, - 34474,36074,33518,18703,37396,2033, 13391,1184, 32839,36560,25262,13620,21423,508, 17579,44062,21535,21766,25261,32802,33518,37327,3839, 4020, 4007, 19777,8267, + 34474,36074,33518,18703,37396,2033, 13391,1184, 32839,36560,25262,13620,21423,508, 17579,44062,21535,21766,25261,32802,33518,37327,3839, 4020, 4007, 19777,8267, 8266, 33025,486, 38951,2004, 5439, 6805, 37328,1570, 376, 659, 1711, 4705, 9682, 13578,17578,35051,35133,27121,1097, 33002,3142, 33869,4219, 5041, 4121, 34727, - 38256,35051,35386,33473,35694,11238,26551,4606, 36074,17425,680, 1328, 946, 26559,33976,38951,496, 37327,25070,1723, 38577,1056, 600, 44062,1288, 1565, 1908, + 38256,35051,35386,33473,35694,11238,26551,4606, 36074,17425,680, 1328, 946, 26559,33976,38951,496, 37327,25070,1723, 38577,1056, 600, 44062,1288, 1565, 1908, 9497, 33517,44061,17829,11004,41081,38951,11897,44061,26517,29742,32808,38951,9131, 3242, 37383,22904,26186,33278,21553,35783,18610,35587,36073,38017,11151,36329, - 25381,4298, 8748, 19317,38758,27945,36073,13124,38950,38950,35493,38950,41081,34297,35050,37327,33075,14673,4563, 13111,1057, 34760,36073,37327,15087,36164,8835, + 25381,4298, 8748, 19317,38758,27945,36073,13124,38950,38950,35493,38950,41081,34297,35050,37327,33075,14673,4563, 13111,1057, 34760,36073,37327,15087,36164,8835, 12392,10005,18940,8422, 16583,15324,11318,34186,11645,22784,35384,30471,22763,39180,22694,44061,10968,185, 6420, 23723,21982,31147,27829,31145,35050,11085,31273, 34656,15402,35771,23520,18877,1807, 31357,4697, 21440,13888,21552,36687,29935,12249,35413,26874,33768,1654, 35640,26056,8727, 10561,36073,36501,24919,5138, 17261, - 17274,8830, 4329, 31913,20916,33199,27887,38537,22383,30986,7501, 35327,3300, 9536, 5043, 19988,5095, 4469, 6353, 23227,7633, 30769,24112,37326,358, 7540, 8421, + 17274,8830, 4329, 31913,20916,33199,27887,38537,22383,30986,7501, 35327,3300, 9536, 5043, 19988,5095, 4469, 6353, 23227,7633, 30769,24112,37326,358, 7540, 8421, 7637, 13573,35050,41081,41081,2078, 32732,23095,44061,38069,44060,33662,33044,30568,25260,719, 5129, 29664,7175, 9819, 15793,7348, 2884, 10109,9913, 23712,19494, - 37110,677, 9426, 779, 7687, 3355, 5395, 30206,29628,5444, 15206,2022, 14343,11738,5161, 7170, 1950, 4468, 5443, 13572,11644,6018, 34617,11084,3450, 6184, 568, + 37110,677, 9426, 779, 7687, 3355, 5395, 30206,29628,5444, 15206,2022, 14343,11738,5161, 7170, 1950, 4468, 5443, 13572,11644,6018, 34617,11084,3450, 6184, 568, 5208, 13107,1808, 9007, 3176, 21209,38630,17577,17576,36820,21551,19914,14740,38432,44060,27944,7004, 6509, 9343, 5042, 9542, 4470, 488, 44060,548, 12745,18146, 21422,14379,35050,38950,9497, 2569, 27733,27586,3144, 1070, 37535,34369,31688,5783, 2753, 19987,8265, 10637,2254, 13106,3143, 5865, 4054, 9541, 18198,8600, 31818, 31684,35676,4854, 31018,37747,23713,38152,25259,36920,15841,11006,5405, 5810, 18654,22211,33000,1687, 24622,32902,212, 7680, 490, 14570,37326,1467, 1369, 25918, @@ -12994,13 +12989,13 @@ static const unsigned short Ranks[197839] = 19985,28978,4419, 14147,37816,36372,28066,34228,19984,34228,11244,24173,39199,11735,15791,23025,4786, 35049,17854,36370,16656,5155, 30994,9973, 34073,15840,21547, 38489,35159,37325,23094,41078,35051,41078,32039,31356,36071,215, 24105,36573,3090, 41077,14993,9531, 36835,38949,35858,11654,35962,36618,3611, 313, 44057,35694, 38661,26777,12998,19217,16655,8829, 31238,44056,4053, 36071,20283,19983,38948,44056,18145,44056,26514,34958,11237,18576,5516, 37099,36570,44056,11038,17574,24110, - 7980, 18144,41077,44055,29549,648, 9540, 37946,969, 4032, 988, 3672, 3772, 41077,27941,41077,34227,44055,18791,20784,19095,31106,1378, 36732,35789,32527,1525, + 7980, 18144,41077,44055,29549,648, 9540, 37946,969, 4032, 988, 3672, 3772, 41077,27941,41077,34227,44055,18791,20784,19095,31106,1378, 36732,35789,32527,1525, 33618,37873,41076,34738,41076,3016, 17727,26464,15567,39193,19984,32490,26175,37794,9954, 24108,22214,12618,33517,35280,26513,41076,18143,23329,3987, 36627,36301, 17547,38948,3610, 44055,7636, 3480, 27588,7719, 326, 22147,41076,1787, 38948,19983,41075,17546,16631,13972,18702,41075,36071,722, 20664,32770,38948,44055,35049, 28400,38947,15023,35877,44054,33091,33230,29682,33834,29184,485, 1657, 44054,44054,30688,29548,33954,9439, 231, 21546,2557, 12317,36042,39013,12687,21545,41075, 44054,38625,30385,28311,33493,21365,38947,41075,15022,44053,400, 6804, 1079, 3371, 38537,38947,15373,1202, 44053,2588, 4910, 8402, 9919, 15839,15838,15837,44053, 34171,44053,35844,19286,27349,6520, 31355,41074,35049,41074,44052,37880,32910,7231, 31354,35048,44052,18142,34227,23123,36071,33517,36070,44052,21421,41074,13688, - 34964,20255,9198, 727, 18806,18774,15318,34230,16375,39110,34088,26512,36515,34758,41074,822, 22931,9872, 23709,13976,33599,4538, 36070,44052,6196, 6875, 3543, + 34964,20255,9198, 727, 18806,18774,15318,34230,16375,39110,34088,26512,36515,34758,41074,822, 22931,9872, 23709,13976,33599,4538, 36070,44052,6196, 6875, 3543, 37325,19052,37893,41073,37128,9197, 34153,35619,38947,33516,25257,41073,44051,3351, 32909,36070,37863,27940,24008,26511,17573,36617,35284,8080, 24109,33838,25055, 38958,44051,41073,39285,33788,44051,33266,26954,15387,12216,37324,22417,1415, 529, 1521, 23086,12403,2874, 4043, 21749,25316,5966, 6496, 2485, 37324,3679, 44051, 36789,36771,27820,33955,22213,36840,38946,33254,15204,34039,33013,36836,2055, 4445, 33516,37722,2021, 16195,19316,4804, 28990,28770,3241, 646, 2873, 19421,16024, @@ -13012,7 +13007,7 @@ static const unsigned short Ranks[197839] = 15665,8828, 31993,22930,44048,7561, 18099,38265,38218,10972,12314,11643,4543, 3959, 29464,31140,14267,35602,5984, 38820,858, 23534,24486,35240,2095, 34712,10508, 36698,14296,17545,36069,36482,35048,16630,33516,7230, 31353,36068,33515,2402, 44048,44048,37324,23418,38946,34605,39383,26160,1848, 23267,34997,38520,39310,44048, 36017,16652,38946,6063, 24638,12191,37323,15405,35048,13190,16108,19207,25114,33373,34702,18819,22754,19387,44047,31488,37323,34355,15409,10054,17083,22756,31467, - 3856, 12872,28188,19017,38423,37226,33419,37323,28980,35638,26383,38946,44047,20900,19315,38945,33044,44047,33515,34992,39295,35619,24382,7968, 34025,14564,8897, + 3856, 12872,28188,19017,38423,37226,33419,37323,28980,35638,26383,38946,44047,20900,19315,38945,33044,44047,33515,34992,39295,35619,24382,7968, 34025,14564,8897, 36068,44047,22843,7451, 33868,33652,6874, 36043,39122,37323,30505,35047,36068,7148, 32994,19314,29546,926, 19787,23093,44046,36068,17068,37672,44046,44046,34599, 21481,31476,36795,14320,38910,32581,41072,36733,37855,36402,2236, 39028,3176, 39010,34613,37322,19982,39241,28793,29985,44046,3023, 25935,32066,44045,1303, 41072, 32983,35047,3238, 14068,32821,15195,22314,37852,21382,21420,34887,35853,34079,15617,34227,34229,34890,38945,44045,33515,28314,33555,20872,38945,38989,29545,20281, @@ -13025,16 +13020,16 @@ static const unsigned short Ranks[197839] = 31350,22710,44043,11896,21763,27017,2143, 9539, 29132,7372, 32817,18479,44043,38944,16314,9238, 4585, 36066,13658,38943,36139,11895,41070,32908,31349,38943,35686, 18141,32633,35047,41070,34226,2917, 16629,54, 8183, 25181,325, 30626,38997,1586, 41070,16628,2110, 1907, 18701,24985,248, 14630,35037,5067, 23092,2728, 35029, 29223,25821,14315,34226,29521,34393,34169,15202,36472,6532, 1453, 24946,31464,7476, 37455,31308,2254, 37022,32908,37968,35336,38332,44042,34048,34226,35598,22842, - 41069,37322,1851, 41069,1126, 41069,37321,4138, 9118, 44042,39280,35571,97, 25629,873, 13597,30116,7287, 15386,18700,33279,41069,3412, 17783,32827,4998, 5473, + 41069,37322,1851, 41069,1126, 41069,37321,4138, 9118, 44042,39280,35571,97, 25629,873, 13597,30116,7287, 15386,18700,33279,41069,3412, 17783,32827,4998, 5473, 44042,11975,41068,17155,4537, 10709,6310, 5627, 1140, 41068,21543,35587,37543,24084,14795,31498,4998, 25891,33840,37397,18140,44042,37321,27934,21070,19946,15385, - 13970,1895, 26433,3477, 9004, 8719, 16000,41068,18699,36288,38943,36157,37098,3089, 24108,24107,41068,14314,17570,22225,33665,1321, 36065,33850,13687,26509,7371, - 38943,17067,41067,36065,38942,9237, 33515,38414,34689,38768,34661,21215,25924,25072,37321,18327,24207,731, 36215,8646, 20502,7370, 38942,39055,33514,31165,2372, - 36456,34328,12726,22644,38430,37458,10813,4955, 38308,32221,31049,34390,19313,39209,696, 39329,35460,37718,44041,33200,24944,23091,27933,41067,21419,14331,1402, + 13970,1895, 26433,3477, 9004, 8719, 16000,41068,18699,36288,38943,36157,37098,3089, 24108,24107,41068,14314,17570,22225,33665,1321, 36065,33850,13687,26509,7371, + 38943,17067,41067,36065,38942,9237, 33515,38414,34689,38768,34661,21215,25924,25072,37321,18327,24207,731, 36215,8646, 20502,7370, 38942,39055,33514,31165,2372, + 36456,34328,12726,22644,38430,37458,10813,4955, 38308,32221,31049,34390,19313,39209,696, 39329,35460,37718,44041,33200,24944,23091,27933,41067,21419,14331,1402, 1176, 44041,18780,44041,34022,36458,44041,29343,4746, 37321,2751, 767, 41067,1055, 14563,36093,23090,2917, 19896,41067,41066,41066,26393,12679,9761, 2410, 10589, 3386, 27371,41066,1123, 749, 13969,44040,1968, 275, 32737,9496, 15384,37314,24703,41066,14955,9388, 16710,13104,8516, 1102, 2717, 35570,18762,31386,20188,20297, 6220, 2669, 38956,36506,38400,33300,2645, 15449,36892,33782,32347,38942,20836,26029,1783, 26318,28781,32025,20262,38401,33334,1066, 34169,3112, 29179,17237,24106, 26629,44040,8456, 19982,35046,15790,2295, 41065,7097, 14071,33055,12563,15201,36065,37320,1466, 2797, 12614,22730,22463,1420, 14816,44040,6479, 15853,3175, 35263, - 20729,37320,3933, 38942,44040,6413, 9056, 7342, 23577,19139,1368, 1147, 1831, 2181, 27666,14984,31742,41065,35116,37320,15718,37719,18139,151, 16820,20101,6984, + 20729,37320,3933, 38942,44040,6413, 9056, 7342, 23577,19139,1368, 1147, 1831, 2181, 27666,14984,31742,41065,35116,37320,15718,37719,18139,151, 16820,20101,6984, 19187,28860,6273, 20333,9015, 27666,5290, 3320, 6160, 19846,11802,26579,19842,26270,20204,25819,26404,27618,32746,26369,27411,27401,23828,23900,28584,14880,20206, 31537,31698,23352,14732,28389,23271,13602,28876,20431,17311,17027,10377,18825,28164,30342,13081,31192,31396,31892,16720,32087,27657,15654,13148,29350,32544,28226, 31750,20195,26239,29963,11633,1127, 17428,41065,41065,44039,10770,17047,28150,400, 92, 5472, 38439,44039,573, 384, 23990,4621, 704, 19067,33964,30766,44039, @@ -13042,15 +13037,15 @@ static const unsigned short Ranks[197839] = 41064,25254,44038,8714, 2540, 15484,22701,11431,16525,8448, 37319,6735, 1618, 7288, 10241,41064,37319,36064,33073,34225,13615,15106,19312,44038,37319,9218, 25552, 38941,33802,296, 751, 772, 121, 14542,853, 3385, 247, 19967,41064,37338,26326,18698,36064,38839,23664,6644, 18796,14313,16284,41063,3972, 30227,6051, 26486, 10635,22562,35046,41063,3583, 4160, 6092, 21542,29584,8436, 32908,38941,38940,8357, 33611,38940,39405,18321,21805,16272,14261,31348,26584,3279, 18420,4893, 39092, - 34225,44038,27389,11261,44038,29016,44037,525, 15107,2054, 14820,31347,36064,21607,17075,5402, 20380,9342, 26141,2310, 20034,32908,3322, 11642,34225,24106,2053, + 34225,44038,27389,11261,44038,29016,44037,525, 15107,2054, 14820,31347,36064,21607,17075,5402, 20380,9342, 26141,2310, 20034,32908,3322, 11642,34225,24106,2053, 34225,13659,18378,51, 4733, 23402,2388, 44037,19008,11747,152, 17184,20061,39124,37319,1638, 44037,35734,1793, 12767,6495, 8401, 9341, 11844,1504, 36064,29544, 23344,33632,12125,37318,16608,7148, 29083,18528,36157,5669, 34713,34506,37840,4920, 17569,4150, 16547,26881,35711,32864,37866,2260, 34723,35046,38153,44037,44036, 6550, 32306,29240,1164, 16781,29123,24441,27816,26106,27817,31082,29055,28532,31250,27942,27811,791, 38762,5244, 19859,13689,28740,22212,32907,32364,34224,37799, - 36761,38080,20662,38940,38940,33433,569, 14952,44036,2380, 475, 31213,7561, 2675, 2643, 10944,20455,338, 17279,811, 2514, 30807,2834, 32517,25810,443, 2499, + 36761,38080,20662,38940,38940,33433,569, 14952,44036,2380, 475, 31213,7561, 2675, 2643, 10944,20455,338, 17279,811, 2514, 30807,2834, 32517,25810,443, 2499, 20415,14103,19235,37877,2714, 38939,31621,14395,44036,32698,12309,7912, 33420,21357,16962,33040,44036,31409,38529,33869,28969,36063,44035,38939,25716,25714,36952, 44035,8645, 22743,32710,16744,38114,32936,35730,36981,25, 9116, 5248, 16678,17695,16185,18590,11010,28915,13408,2460, 31356,27129,41063,44035,16778,5334, 13522, 30238,10544,18649,31055,6734, 9117, 12698,29544,26876,32907,38939,41063,232, 8941, 20405,27930,14789,44035,38939,2248, 33123,33514,38680,24105,39340,20014,24104, - 44034,7756, 18230,41062,16194,38938,10864,44034,41062,6066, 44034,10863,20135,25253,12372,2872, 35311,19771,11276,3398, 17741,2187, 3202, 14608,34823,37834,6914, + 44034,7756, 18230,41062,16194,38938,10864,44034,41062,6066, 44034,10863,20135,25253,12372,2872, 35311,19771,11276,3398, 17741,2187, 3202, 14608,34823,37834,6914, 5667, 21541,34953,8231, 26508,12013,27765,12163,2325, 41062,38938,31346,35045,5184, 37318,12439,14266,37379,16651,6096, 29543,41062,26, 5650, 22060,3457, 37318, 38938,41061,10805,28185,13704,11894,27932,973, 38084,38938,17066,12007,21540,22211,33115,33361,2612, 4947, 19978,5442, 36063,24103,23266,44034,37318,12685,44033, 41061,33514,38937,44033,9161, 24420,25460,24560,37317,1791, 26024,5381, 29929,4683, 9719, 11358,36481,37317,41061,26507,36960,32703,21418,19352,31345,36063,44033, @@ -13067,46 +13062,46 @@ static const unsigned short Ranks[197839] = 35144,679, 21411,11910,671, 10406,5821, 32808,12636,11743,15191,31753,27445,9010, 32005,2984, 17278,19999,8919, 11895,19975,21535,15806,32153,22908,8879, 24080, 23300,17529,12034,38036,16045,28851,36811,44029,36868,34077,16193,679, 556, 33160,36083,37184,6565, 1075, 14839,30530,38473,44029,36061,4747, 44028,29541,38935, 37316,41059,216, 18137,37965,41059,357, 6777, 21534,44028,8329, 41059,44028,23885,38935,33513,41058,38934,41058,37316,36061,36061,44028,32906,28303,23565,13440, - 41058,22, 21417,34223,44027,12613,23086,19978,21569,38934,18468,763, 36060,38934,6675, 8767, 585, 35277,36060,35703,1367, 15112,35242,5957, 38973,31863,5331, + 41058,22, 21417,34223,44027,12613,23086,19978,21569,38934,18468,763, 36060,38934,6675, 8767, 585, 35277,36060,35703,1367, 15112,35242,5957, 38973,31863,5331, 44027,27018,29761,2833, 38934,11100,22810,11966,39140,32906,19523,32870,35728,21022,7477, 27370,29540,34564,38402,37316,35994,19028,35977,24102,36064,4248, 29794, 9162, 6303, 10362,34434,3306, 5923, 25251,6697, 41058,32905,35044,31610,19974,18627,2567, 12081,8778, 14024,5636, 18735,33477,29329,1209, 4690, 5613, 17569,35091, 9538, 31342,41057,27365,2210, 38456,19310,32905,744, 41057,34279,38933,8994, 7722, 36319,182, 16627,35637,34223,31341,36060,23085,10054,38933,35044,3998, 30293, 44027,33731,2755, 7647, 34677,9115, 38933,1824, 24101,37661,38933,37315,5206, 32905,32905,29539,3763, 13833,5861, 10053,37315,24100,36060,321, 16885,38932,17435, 41057,18145,20556,34222,16823,41057,29538,37315,19973,14069,20660,38932,44027,32409,44026,41056,31653,35044,41056,44026,34222,26506,2433, 25748,34183,36059,15848, - 41056,14938,21416,22017,5117, 4916, 41056,22162,22015,2792, 7038, 38403,23513,38932,35957,657, 41055,19972,41055,35969,37315,38932,34671,11148,32904,381, 7809, + 41056,14938,21416,22017,5117, 4916, 41056,22162,22015,2792, 7038, 38403,23513,38932,35957,657, 41055,19972,41055,35969,37315,38932,34671,11148,32904,381, 7809, 11445,41055,9760, 205, 33053,529, 38931,38931,21415,21414,41055,13443,33389,2409, 44026,24099,41054,6599, 29537,32904,44026,7808, 3117, 3036, 6674, 31340,37314, 27931,19309,163, 20524,1073, 38931,20659,36059,44025,7807, 31339,32904,11658,41054,5808, 38931,38930,31734,21413,34222,19484,144, 16747,44025,36954,29536,33012, 820, 1541, 28469,35043,35189,20004,37400,37806,3174, 2353, 2180, 1678, 912, 12565,429, 10935,36206,34222,22209,37944,35354,8070, 41054,90, 32417,27971,32828, 32904,38527,32903,37314,32903,1722, 14306,1329, 17227,27727,41054,38930,794, 24098,2444, 37728,27153,33669,21533,41053,15787,38373,3529, 35867,26054,31338,15478, 27183,6192, 33249,7443, 31060,32164,845, 19850,21532,44025,31542,26937,7635, 34351,37502,41053,4479, 40, 18701,2255, 24907,15377,11610,25871,11155,12112,32989, 14476,34212,23000,9494, 26505,31125,17542,39319,33638,38930,36983,10320,19971,3678, 32197,32646,16650,24228,38149,18648,41053,37401,25250,44025,20762,36785,23084, - 8637, 18926,34185,5702, 29366,36674,35369,39284,35222,44024,37345,35915,27930,23127,7789, 15393,23793,33764,27511,17145,850, 33494,37781,28366,3415, 35200,2684, + 8637, 18926,34185,5702, 29366,36674,35369,39284,35222,44024,37345,35915,27930,23127,7789, 15393,23793,33764,27511,17145,850, 33494,37781,28366,3415, 35200,2684, 5566, 13665,6069, 32844,44024,21412,1997, 36059,5616, 3465, 15831,8686, 37823,548, 23499,5483, 1636, 11452,28628,16673,30662,18797,22313,16579,21924,44024,28145, 35992,36219,2058, 33071,6891, 36583,38680,41053,18277,139, 32938,1701, 32542,13184,22359,22982,25581,13570,37759,22605,31370,2750, 23293,5012, 41052,44024,13104, - 34726,14561,6464, 24985,9433, 7211, 33428,30481,32898,4072, 7370, 4291, 21531,17197,41052,10690,36670,35884,38625,23303,44023,26504,18672,41052,36515,44023,4748, + 34726,14561,6464, 24985,9433, 7211, 33428,30481,32898,4072, 7370, 4291, 21531,17197,41052,10690,36670,35884,38625,23303,44023,26504,18672,41052,36515,44023,4748, 37314,34587,28501,904, 4835, 34288,33513,15018,16626,28642,41052,41051,44023,38930,12921,1666, 11640,18741,8539, 44023,19308,5041, 7096, 19080,34493,7704, 32753, 36059,38929,35489,36191,11049,23414,44022,38929,3456, 29535,28154,17743,35043,44022,16389,33513,44022,41051,11196,324, 6100, 41051,27929,30895,39017,37339,17541, - 27928,44022,2097, 15830,9745, 4933, 16075,2453, 5665, 13390,4527, 35441,22152,5850, 22847,29419,13389,34221,44021,41051,20235,4335, 303, 2228, 24965,33095,76, + 27928,44022,2097, 15830,9745, 4933, 16075,2453, 5665, 13390,4527, 35441,22152,5850, 22847,29419,13389,34221,44021,41051,20235,4335, 303, 2228, 24965,33095,76, 32997,9774, 30305,33969,33018,19970,1361, 31379,3785, 35180,31973,34608,34027,36548,30056,3700, 17735,27558,18696,44021,29265,18136,22208,29258,24531,4886, 41050, 30889,1082, 29729,32903,41050,20658,7529, 5562, 32890,8161, 18647,7456, 35043,9918, 9356, 32939,37017,20741,19780,7093, 37394,1373, 37822,18646,38020,13569,21513, 32841,6255, 12876,34221,17949,5914, 34024,38082,8603, 22029,41050,33462,38929,10509,17211,7314, 743, 3455, 37392,11422,5997, 13227,24754,28363,25802,3575, 18292, 31337,5010, 33055,44021,5937, 2010, 38618,14275,19711,26503,29469,4846, 35708,19202,35603,27927,38929,6969, 3609, 24957,36723,35043,24097,38928,38282,15207,41050, 8685, 35496,22207,11639,15895,20107,44021,41049,16493,36441,17654,33131,39252,28719,44020,17355,33060,27211,26312,38439,31812,44020,19942,9495, 39036,17065,31252, 44020,8420, 36048,34023,2436, 44020,32903,38928,4727, 12612,44019,8975, 28983,26494,28803,11863,36699,2875, 3373, 37163,2911, 19969,5690, 37099,9340, 19968,37917, - 14560,35771,7169, 37314,38928,38928,29555,36058,17064,29534,44019,44019,16390,10804,25496,41049,12370,41049,224, 1892, 6293, 35042,19391,6327, 34317,10129,4264, - 29510,4823, 44019,30052,8439, 8781, 44018,21411,33512,38805,9887, 44018,32573,26502,38927,11048,13103,14619,35715,37468,37313,23440,411, 38927,44018,1014, 6888, + 14560,35771,7169, 37314,38928,38928,29555,36058,17064,29534,44019,44019,16390,10804,25496,41049,12370,41049,224, 1892, 6293, 35042,19391,6327, 34317,10129,4264, + 29510,4823, 44019,30052,8439, 8781, 44018,21411,33512,38805,9887, 44018,32573,26502,38927,11048,13103,14619,35715,37468,37313,23440,411, 38927,44018,1014, 6888, 11109,2838, 7287, 32829,30352,44018,34057,1955, 34968,33099,38409,36058,855, 36887,10803,13568,18189,35203,38629,33534,18624,17568,13950,9602, 5548, 35076,34451, 39308,12004,11674,36651,16092,33384,33848,41049,17567,7168, 35365,11537,11608,7949, 9352, 33914,18464,29109,8186, 23064,17566,10802,36394,12683,14068,16867,16649, 35509,29308,35918,35042,34655,31193,33512,18695,38040,38927,33512,30760,16764,14280,25534,37313,37313,21530,37313,18135,37528,41048,41048,34534,16625,37312,44017, - 33512,31494,41048,5691, 38977,24096,2306, 1704, 14761,20095,44017,25249,9809, 41048,6404, 19967,4006, 15200,18529,11444,3986, 36058,12694,24137,6696, 6494, 5401, + 33512,31494,41048,5691, 38977,24096,2306, 1704, 14761,20095,44017,25249,9809, 41048,6404, 19967,4006, 15200,18529,11444,3986, 36058,12694,24137,6696, 6494, 5401, 25368,13567,2832, 38927,19966,25248,36770,32, 32923,15951,19817,35123,11475,19889,36399,16690,38693,27926,32245,41047,44017,22206,16, 19036,18201,179, 28691, 32614,26937,1419, 24311,33511,12483,39378,18645,36176,22348,35042,2127, 39173,19094,14559,38025,35989,34221,31856,25738,34685,36575,22176,33952,13223,23326,13102, - 37393,39400,32902,37312,41047,12313,16648,37796,7170, 25725,33943,3961, 25723,23144,41047,1106, 18800,31562,7230, 1349, 29309,36571,21594,32901,18463,33292,3321, - 36058,22773,3868, 37013,22037,6634, 32776,21273,7293, 17306,8135, 1600, 19326,15252,11666,38988,5981, 17098,1042, 5002, 6526, 27844,39320,8253, 6752, 29097,9752, + 37393,39400,32902,37312,41047,12313,16648,37796,7170, 25725,33943,3961, 25723,23144,41047,1106, 18800,31562,7230, 1349, 29309,36571,21594,32901,18463,33292,3321, + 36058,22773,3868, 37013,22037,6634, 32776,21273,7293, 17306,8135, 1600, 19326,15252,11666,38988,5981, 17098,1042, 5002, 6526, 27844,39320,8253, 6752, 29097,9752, 4327, 6017, 18540,31405,13985,6919, 34014,15929,3061, 29609,27607,38625,23110,19965,5545, 7786, 9089, 36549,34221,38387,37934,29130,33492,34882,37262,38860,37052, - 35988,21529,34028,23511,28370,10632,6062, 39057,10400,13991,1809, 23273,31631,39120,33629,37493,22372,41047,11343,32569,37312,28725,1863, 36057,22632,4080, 847, - 38926,18130,18134,35669,26317,17315,3743, 29596,37147,33511,37227,16451,33337,12151,20665,25681,7958, 13606,8994, 13656,36798,29758,9640, 18644,20848,38120,4905, - 38926,44017,44016,37993,1437, 19219,33831,33987,44016,44016,33029,30298,44016,37312,41046,21546,36900,4720, 4103, 5432, 32501,3809, 38713,7982, 39389,11657,3220, + 35988,21529,34028,23511,28370,10632,6062, 39057,10400,13991,1809, 23273,31631,39120,33629,37493,22372,41047,11343,32569,37312,28725,1863, 36057,22632,4080, 847, + 38926,18130,18134,35669,26317,17315,3743, 29596,37147,33511,37227,16451,33337,12151,20665,25681,7958, 13606,8994, 13656,36798,29758,9640, 18644,20848,38120,4905, + 38926,44017,44016,37993,1437, 19219,33831,33987,44016,44016,33029,30298,44016,37312,41046,21546,36900,4720, 4103, 5432, 32501,3809, 38713,7982, 39389,11657,3220, 17109,7593, 35251,24647,5513, 13871,15829,8757, 12682,35598,44015,20889,797, 33421,15737,13141,36057,44015,12312,38079,38153,14641,36088,32902,35042,41046,38647, 38910,3, 2258, 21724,21528,33973,19964,44015,22999,18359,10663,15287,33406,13568,38091,28136,41046,33511,32902,10959,41046,35041,35041,26281,3240, 31336,44015, 27925,44014,36057,15657,38926,24095,41045,1761, 20680,876, 9511, 11, 16647,35273,37499,11143,44014,38926,4953, 6976, 25683,37127,34220,35011,4810, 8505, 14365, @@ -13118,15 +13113,15 @@ static const unsigned short Ranks[197839] = 20137,37468,33525,24050,4843, 24542,37311,38564,3431, 2785, 29463,17276,29574,18845,38925,33681,9858, 19962,37310,44011,38925,3314, 41044,44011,37310,21410,11835, 44010,44010,13388,38925,8644, 31334,8930, 260, 29674,17738,19983,19004,11296,26500,29860,20732,26703,26975,12981,4361, 24184,41044,19178,15799,10128,11823,44010, 7716, 13314,41044,16624,6423, 12311,16807,28234,44010,41043,36056,44009,44009,6695, 15199,18643,10361,21527,19961,41043,24191,44009,2109, 38636,8003, 34256,12681, - 44009,44008,38924,2026, 15677,23083,6515, 31578,7718, 27813,35408,44008,37674,30001,29532,34868,7732, 166, 25422,13625,731, 33032,32446,14218,7753, 3992, 9757, - 25539,29756,6162, 26980,31364,31254,22436,12928,21122,16292,18026,32215,6912, 15355,8970, 26399,13218,29752,17467,19833,29, 5496, 17250,19795,38924,24692,2603, + 44009,44008,38924,2026, 15677,23083,6515, 31578,7718, 27813,35408,44008,37674,30001,29532,34868,7732, 166, 25422,13625,731, 33032,32446,14218,7753, 3992, 9757, + 25539,29756,6162, 26980,31364,31254,22436,12928,21122,16292,18026,32215,6912, 15355,8970, 26399,13218,29752,17467,19833,29, 5496, 17250,19795,38924,24692,2603, 2713, 688, 35040,9853, 25319,30292,31285,31633,33338,16465,622, 2352, 380, 33934,32880,31315,2208, 31333,44008,12187,399, 615, 23082,29531,14602,898, 26465, 6938, 879, 8678, 4349, 1763, 23081,37310,44008,292, 19474,14824,41043,17321,41043,9560, 7789, 35040,32902,41042,17539,38924,17134,36055,44007,198, 10284,37310, 21409,4252, 3320, 26795,1430, 7365, 41042,24856,31332,44007,38924,13226,21408,22738,19976,38361,35715,36790,18289,32901,320, 8718, 37720,31308,3768, 44007,44007, 38923,11638,17565,22529,13101,31390,44006,34219,31331,17564,34432,30569,26149,31330,18425,3319, 32901,38923,30148,44006,2227, 1737, 37309,38923,11183,19960,32901, 25247,12322,15296,5024, 12613,36037,41042,8367, 14692,3224, 21363,16166,33825,16818,38623,16882,2409, 10360,2521, 16474,38379,38639,19959,41042,44006,4845, 11733, - 35040,38923,38922,14558,35142,26501,20315,32901,20975,22091,7759, 9819, 38922,624, 7347, 18133,36923,38922,4563, 16206,7444, 17563,6261, 34363,3658, 2956, 4878, - 26446,13024,34219,33825,41041,27921,1515, 8729, 21569,19752,39054,38922,12784,26508,24009,2193, 23320,790, 41041,36055,44006,41041,1885, 12917,29977,17251,344, + 35040,38923,38922,14558,35142,26501,20315,32901,20975,22091,7759, 9819, 38922,624, 7347, 18133,36923,38922,4563, 16206,7444, 17563,6261, 34363,3658, 2956, 4878, + 26446,13024,34219,33825,41041,27921,1515, 8729, 21569,19752,39054,38922,12784,26508,24009,2193, 23320,790, 41041,36055,44006,41041,1885, 12917,29977,17251,344, 10347,32903,25729,30597,37837,1228, 21084,28458,34597,30325,44005,16440,2282, 38896,27860,2633, 11171,9663, 13598,28163,34552,29423,1618, 11011,25505,28559,31607, 33676,35597,33664,7884, 33025,41041,19222,16646,44005,41040,29192,14554,32099,20722,37237,21543,38981,39261,24701,2961, 13100,38185,2916, 33392,23542,26756,25765, 1279, 16008,23591,136, 9256, 33074,26465,44005,1637, 3384, 9733, 38694,17217,2155, 37772,36949,19655,3383, 37148,13762,37144,38566,39106,11429,35281,34254,33840, @@ -13134,23 +13129,23 @@ static const unsigned short Ranks[197839] = 31706,24623,22573,24072,21560,13180,17504,18312,24189,31882,24403,24192,31442,16648,26325,16758,18414,7746, 31446,33092,39316,1656, 2284, 31448,759, 38943,36321, 44005,32869,36652,44004,35039,2531, 18318,2642, 36159,6906, 30676,2408, 35193,11621,2871, 1287, 12372,32900,18948,24011,8393, 25756,20872,44004,36055,38921,27920, 85, 25261,24596,17264,34219,21549,36252,14259,1830, 32951,3767, 10349,1136, 29530,21663,33012,33510,25840,34219,2674, 1103, 175, 14768,6635, 6462, 33705,26549, - 4527, 28817,21996,27067,31755,37309,2498, 38920,16954,97, 3482, 20573,14471,30609,17503,32879,15759,13099,15298,34731,12512,35951,3171, 32057,37575,34218,2283, + 4527, 28817,21996,27067,31755,37309,2498, 38920,16954,97, 3482, 20573,14471,30609,17503,32879,15759,13099,15298,34731,12512,35951,3171, 32057,37575,34218,2283, 30454,3015, 11080,1654, 882, 12522,36055,37479,36860,38920,12701,19070,16026,2715, 353, 2536, 9149, 5611, 13231,7652, 5404, 5530, 12310,18642,5441, 2004, 14067, 12680,637, 38027,1997, 20310,24231,14687,13566,17618,4946, 2105, 27955,9787, 13969,13387,38392,14747,44004,31150,15828,14017,37564,36337,44004,17562,8134, 24614, 33083,33916,44003,38789,12294,16051,8827, 28091,13565,11962,38827,37761,26766,9537, 12985,2740, 11079,38111,34936,36273,16645,17561,24874,27671,174, 12578,38872, 37721,35863,32811,38962,32898,44003,37999,32900,36865,16217,41040,13967,21801,41040,37309,21114,32562,37980,31264,13564,11892,11358,38236,29529,8079, 25537,29196, 36048,37824,35039,16430,5987, 41039,44003,37309,44003,5567, 34229,38894,14312,21525,33510,15383,25246,19974,29829,374, 27801,1754, 1807, 1036, 4446, 38166,20497, - 33638,13563,17671,6742, 14557,10837,10359,36201,16644,24094,14633,23509,24361,33677,18970,26952,36513,19958,34339,3639, 4774, 4533, 36054,35399,23079,6628, 9036, - 34683,14881,41039,18021,17997,36034,36054,36054,4400, 33024,33029,29958,4755, 10907,38829,9139, 32900,33509,35716,38920,5505, 18649,18972,38720,19307,15361,4337, + 33638,13563,17671,6742, 14557,10837,10359,36201,16644,24094,14633,23509,24361,33677,18970,26952,36513,19958,34339,3639, 4774, 4533, 36054,35399,23079,6628, 9036, + 34683,14881,41039,18021,17997,36034,36054,36054,4400, 33024,33029,29958,4755, 10907,38829,9139, 32900,33509,35716,38920,5505, 18649,18972,38720,19307,15361,4337, 28524,39197,13602,36958,37846,22430,44002,34607,24093,37062,8304, 26325,3888, 4056, 21120,22, 19850,1175, 31318,7382, 21755,28365,24748,6755, 26811,23977,19657, - 3699, 26172,37895,18700,10308,8133, 12244,4788, 12664,38331,39161,35400,703, 17041,22809,33730,8002, 4188, 7883, 9667, 25877,39077,31908,37308,35416,17560,5529, + 3699, 26172,37895,18700,10308,8133, 12244,4788, 12664,38331,39161,35400,703, 17041,22809,33730,8002, 4188, 7883, 9667, 25877,39077,31908,37308,35416,17560,5529, 4769, 23974,9003, 6127, 35147,35162,19957,30738,38079,38080,33283,39332,34235,33267,39135,8133, 35441,19742,14066,4326, 18191,34524,28286,34845,28528,9844, 34405, 14460,44002,8001, 32015,22589,9214, 36991,24411,15198,18641,44002,34218,22205,31554,9337, 32900,37944,22650,16438,19101,21524,37308,41039,33509,38014,6953, 36268, - 14779,954, 944, 38020,18593,19710,27061,36050,36702,32438,23799,36404,37418,36625,33750,33844,25711,38871,26868,29902,32405,11015,37041,18164,19097,11974,3777, + 14779,954, 944, 38020,18593,19710,27061,36050,36702,32438,23799,36404,37418,36625,33750,33844,25711,38871,26868,29902,32405,11015,37041,18164,19097,11974,3777, 5755, 14065,8092, 5648, 29134,27919,12214,10511,32796,10588,34092,16643,35039,14110,34217,26875,21277,35165,38093,11669,39295,17559,35737,21548,13715,26945,31329, 15017,17052,11355,17063,11017,22062,26068,12915,29105,462, 352, 44002,41039,31328,38920,38919,505, 6392, 10685,30994,30495,24092,41038,36054,814, 12721,16035, 7539, 26500,31327,19723,3318, 1207, 27918,33509,3161, 410, 25426,44001,41038,34736,2379, 34218,13328,1884, 29737,25245,30685,24933,98, 8038, 23799,24554,25499, - 33982,36531,36053,36053,28514,37308,10772,41038,6606, 22705,44001,38919,34218,10199,655, 20656,44001,14275,9286, 20214,41038,33509,8311, 37308,44001,38604,4578, + 33982,36531,36053,36053,28514,37308,10772,41038,6606, 22705,44001,38919,34218,10199,655, 20656,44001,14275,9286, 20214,41038,33509,8311, 37308,44001,38604,4578, 9339, 25581,36053,33508,33610,29528,22204,13123,730, 5305, 32931,34848,32900,29527,1347, 29946,34015,36344,25033,36062,37819,11514,20183,32323,10587,21639,31221, 11789,14064,18606,6918, 44000,19956,3751, 32863,1827, 14556,101, 1982, 41037,24166,12309,356, 19955,11973,2658, 303, 278, 4418, 11078,98, 17558,1316, 30619, 32238,20261,288, 2739, 498, 24103,10016,36053,33508,16623,8766, 33761,44000,24132,37347,38919,32899,32899,41037,35817,35617,23493,36653,15382,5899, 10857,21849, @@ -13164,14 +13159,14 @@ static const unsigned short Ranks[197839] = 20238,1768, 4396, 4605, 3096, 938, 689, 901, 352, 1969, 820, 9717, 21523,23660,38768,3940, 21407,41036,36052,41036,13686,19718,33015,7891, 12135,32998,34217, 34217,17386,20628,36052,34849,13561,16110,15196,14912,26761,14554,36530,8132, 29353,27916,9918, 11047,37307,15195,2652, 11637,7095, 8131, 16642,34618,36962,31689, 36997,37655,34982,43998,6182, 12967,14063,4745, 319, 1187, 24012,12364,2598, 20824,7788, 20217,21117,22934,29803,15785,18938,20654,41035,4413, 35868,31325,22032, - 2504, 12679,30015,32865,15376,25243,31324,2207, 218, 8859, 16463,23936,23503,15419,21067,35143,3985, 20437,37103,41035,4268, 27915,9338, 8605, 17276,5571, 8649, + 2504, 12679,30015,32865,15376,25243,31324,2207, 218, 8859, 16463,23936,23503,15419,21067,35143,3985, 20437,37103,41035,4268, 27915,9338, 8605, 17276,5571, 8649, 6103, 1261, 1325, 1083, 4247, 12611,6147, 36019,43998,2257, 4218, 6077, 408, 18841,17352,9465, 1221, 3848, 11692,22674,35038,16844,19457,19648,33063,11776,31838, - 21522,11354,19953,37074,23236,34231,539, 3349, 3986, 11353,3736, 8001, 10127,7443, 34188,14062,17557,5241, 10033,13408,7165, 24709,17556,1075, 28427,2757, 2818, - 3897, 31175,1924, 9921, 8905, 26638,38471,30886,10112,8001, 2311, 20194,2212, 1435, 10585,13239,37107,8225, 32823,5659, 14463,517, 24576,25013,6895, 16972,7535, + 21522,11354,19953,37074,23236,34231,539, 3349, 3986, 11353,3736, 8001, 10127,7443, 34188,14062,17557,5241, 10033,13408,7165, 24709,17556,1075, 28427,2757, 2818, + 3897, 31175,1924, 9921, 8905, 26638,38471,30886,10112,8001, 2311, 20194,2212, 1435, 10585,13239,37107,8225, 32823,5659, 14463,517, 24576,25013,6895, 16972,7535, 35929,16017,37367,31323,35262,37306,6201, 15826,43997,142, 34839,4811, 13298,31222,13155,19791,27660,25742,28664,15790,32932,33025,25021,21406,28315,20435,30023, 32002,31843,30596,18029,21304,28450,34951,5527, 43997,14458,5094, 17555,17554,41035,2673, 36519,11351,32760,35038,43997,36228,38582,33453,38409,36248,7959, 43997, 35828,8684, 3945, 16472,34651,26672,37442,14574,37690,36722,35976,41035,23078,41034,20079,13390,12306,26599,34869,38617,23644,12561,11369,10804,32888,11974,38647, - 8774, 9005, 9174, 22245,36704,23935,36840,31710,38819,26808,6228, 18521,1664, 43996,4608, 37920,7271, 8121, 20590,23220,10818,37306,10358,13915,20935,37306,7715, + 8774, 9005, 9174, 22245,36704,23935,36840,31710,38819,26808,6228, 18521,1664, 43996,4608, 37920,7271, 8121, 20590,23220,10818,37306,10358,13915,20935,37306,7715, 34875,6873, 22495,35038,35038,20653,10187,2231, 13685,10199,34636,7012, 23662,12231,2833, 20256,1632, 43996,36756,8698, 29854,19449,3387, 5103, 34492,2253, 32924, 29477,41034,36972,37544,34629,38781,10562,5017, 34857,23346,824, 2672, 1523, 29526,35451,29647,12719,16641,17553,14341,41034,34086,14783,36409,41034,38917,43996, 33677,1653, 36578,15188,41033,34571,1030, 11934,35156,36700,41033,41033,17062,6530, 30242,13386,20726,35072,25242,17061,15551,24492,43996,38988,16484,9537, 33066, @@ -13183,18 +13178,18 @@ static const unsigned short Ranks[197839] = 13829,5221, 7242, 32859,43993,2267, 12979,13129,23077,43993,8288, 17199,38694,28085,4471, 38048,20921,10205,38293,35121,7173, 32630,21521,7360, 22391,20798,15331, 32914,873, 18171,9882, 6850, 5410, 16554,15690,20417,37884,12874,17820,22193,2916, 22203,34216,322, 16772,29428,25241,38916,29583,29129,30979,16550,31623,43993, 4838, 36096,37500,6698, 1483, 37113,2845, 2101, 12920,1049, 11502,33397,38202,19214,8476, 3564, 12250,2998, 19066,14858,31510,20520,8614, 36598,34371,32779,34092, - 2325, 24090,34216,15825,35650,33507,37304,43993,37304,38916,41031,34611,7718, 41031,43992,38915,16914,18733,34657,35037,22202,25048,11022,30348,3631, 35302,7078, + 2325, 24090,34216,15825,35650,33507,37304,43993,37304,38916,41031,34611,7718, 41031,43992,38915,16914,18733,34657,35037,22202,25048,11022,30348,3631, 35302,7078, 35915,13884,32846,38915,36051,11235,4952, 30485,12334,33682,32534,35502,43992,41030,29798,3382, 41030,38152,25666,29672,43992,3766, 2641, 2037, 3454, 889, 43992, 33323,12746,9489, 35363,41030,37539,36051,41030,1465, 1464, 38813,13122,38915,41029,37304,21237,38915,4919, 33507,16622,36357,18132,28082,38914,30578,38298,25240, 35560,15380,15455,36274,18, 98, 1756, 30668,354, 21406,41029,34436,35591,14311,23614,38914,35610,27432,43991,15015,34216,32899,17060,29525,1251, 43991,14061, 305, 1644, 27234,35498,37303,35907,6321, 37336,38914,12369,30076,27941,43991,43991,43990,31321,9917, 41029,11891,41029,36932,41028,41028,41028,23355,17537,34216, - 36051,15014,35037,25239,37303,22268,10584,27913,32949,1157, 34249,29081,2380, 23076,22201,22440,23980,14108,21159,38972,37303,38914,36050,36050,36050,37303,2832, + 36051,15014,35037,25239,37303,22268,10584,27913,32949,1157, 34249,29081,2380, 23076,22201,22440,23980,14108,21159,38972,37303,38914,36050,36050,36050,37303,2832, 41028,27912,8701, 37084,36877,43990,33063,23075,4755, 1779, 36637,2819, 30337,23661,11477,17537,24994,12747,14241,43990,27802,38913,4909, 36085,38761,43990,21104, 38913,6146, 6251, 9416, 10560,16935,13386,30101,41027,32898,43989,38913,34617,5249, 35037,43989,38913,1525, 1683, 7889, 41027,5701, 3176, 5748, 33507,38912,15824, - 34215,1998, 43989,33506,1575, 24360,14553,3628, 11133,24089,6843, 9753, 37402,39298,38030,10608,41027,41027,34270,5027, 12199,10322,43989,37635,38770,12086,1260, + 34215,1998, 43989,33506,1575, 24360,14553,3628, 11133,24089,6843, 9753, 37402,39298,38030,10608,41027,41027,34270,5027, 12199,10322,43989,37635,38770,12086,1260, 2712, 31051,2235, 23041,2796, 38912,33821,1040, 34215,34751,3173, 41026,43988,23074,6361, 41026,36350,2711, 27865,683, 13939,1711, 4912, 16493,37375,41026,17107, - 10956,21520,41026,34777,39253,38072,34658,43988,29208,37302,39371,41025,9946, 37271,41025,35036,19952,9460, 18131,23754,35870,36844,13676,36854,4978, 10582,6677, - 33115,10792,24347,6515, 37302,8867, 13765,37844,18308,30934,43988,18107,36486,7985, 11941,7119, 12478,37113,19711,22902,19054,17342,16970,6455, 38912,24088,7074, + 10956,21520,41026,34777,39253,38072,34658,43988,29208,37302,39371,41025,9946, 37271,41025,35036,19952,9460, 18131,23754,35870,36844,13676,36854,4978, 10582,6677, + 33115,10792,24347,6515, 37302,8867, 13765,37844,18308,30934,43988,18107,36486,7985, 11941,7119, 12478,37113,19711,22902,19054,17342,16970,6455, 38912,24088,7074, 33459,33494,35334,41025,19972,38912,16191,41025,31240,591, 6158, 41024,33222,2209, 34934,41024,21405,10619,13729,37992,37302,5440, 36525,36748,37302,27301,39244, 21841,2013, 25277,32898,38911,34215,14489,17046,26498,43988,41024,37084,33506,38303,43987,23663,2351, 41024,38078,3381, 11656,992, 35582,935, 2435, 222, 15090, 41023,2831, 2261, 1906, 38629,38911,980, 3060, 835, 38911,22221,4967, 35666,29434,38581,38911,37301,10583,3528, 986, 29481,38385,32898,4330, 27855,37104,12883, @@ -13205,11 +13200,11 @@ static const unsigned short Ranks[197839] = 2408, 34214,20652,4231, 177, 36385,15013,211, 28325,23643,32678,34969,27008,25238,43986,34214,7359, 43985,36234,27939,43985,38910,2658, 11139,41023,32897,31319, 16190,43985,34213,8078, 36049,2100, 2086, 3453, 11234,36049,12366,22199,38910,41022,33879,5807, 22959,32986,38909,37301,41022,37878,2350, 43985,35036,13683,25514, 161, 15458,38909,972, 36049,14060,7888, 35271,18130,12368,33554,25237,29524,43984,35036,37300,36048,20225,35035,38909,36048,41022,37300,43984,20654,691, 15012, - 36048,43984,14310,38909,9916, 43984,9337, 32822,37067,30852,38947,11075,9038, 36501,35035,709, 39309,38908,41022,37300,23073,34478,35035,37300,17536,41021,5206, + 36048,43984,14310,38909,9916, 43984,9337, 32822,37067,30852,38947,11075,9038, 36501,35035,709, 39309,38908,41022,37300,23073,34478,35035,37300,17536,41021,5206, 37299,28324,20651,38131,39157,3767, 43983,31318,13096,138, 36048,14542,12678,7882, 37339,10356,23607,35035,8538, 29512,22054,37699,31831,38058,33490,15011,41021, 37299,39237,43983,31317,31316,23072,21519,38908,8683, 31206,9536, 4945, 36047,7345, 23071,15449,43983,43983,2104, 1928, 2335, 1965, 8027, 30445,9849, 6694, 16189, 33505,13376,27911,3345, 26648,9305, 36047,23070,20234,43982,1569, 16188,13965,43982,37299,23069,3000, 33505,37728,891, 1053, 3896, 39220,6113, 16187,33505,34213, - 36029,10355,31143,38176,3267, 34090,37299,33504,41021,28379,38908,32897,16186,19305,43982,43982,965, 4193, 38908,43981,26495,36047,13459,1831, 10086,2359, 920, + 36029,10355,31143,38176,3267, 34090,37299,33504,41021,28379,38908,32897,16186,19305,43982,43982,965, 4193, 38908,43981,26495,36047,13459,1831, 10086,2359, 920, 15194,3058, 2536, 41021,37298,38907,43981,5754, 2923, 37298,29523,35034,654, 6795, 22464,43981,37298,3630, 9320, 8262, 10535,13560,26828,5099, 3880, 22198,43981, 43980,868, 24086,18640,16639,5610, 35952,34161,14367,16824,10626,7442, 10198,12280,6169, 118, 26217,1823, 29579,32422,14989,28972,29150,11936,9113, 32893,36075, 2351, 23007,24085,43980,9917, 34338,25140,25930,14326,19951,30857,43980,17894,37889,35068,9118, 34213,3012, 5864, 35154,251, 12916,11833,23151,32897,31315,30019, @@ -13220,59 +13215,59 @@ static const unsigned short Ranks[197839] = 14532,1868, 39232,15489,13037,645, 34043,35034,12367,37297,34800,9914, 16779,34213,43978,6181, 8643, 41020,451, 34447,37977,13094,2723, 21528,32121,32783,17163, 274, 35034,36046,32880,3162, 8364, 7648, 19802,12873,27910,34395,8130, 36337,33958,18639,41020,32896,41019,33658,12185,25216,15415,43978,10121,24485,35372,26668, 25209,43978,38868,35034,43978,35033,37297,39395,23067,38907,43977,25895,16184,39067,17535,43977,2407, 5577, 23351,15010,18129,7369, 15164,34248,7308, 15983,26114, - 14309,13052,37914,7346, 14059,27575,22579,43977,33504,17059,25826,41019,38907,7538, 43977,37478,18690,35846,8, 32442,10512,20115,6174, 32981,32838,30120,934, + 14309,13052,37914,7346, 14059,27575,22579,43977,33504,17059,25826,41019,38907,7538, 43977,37478,18690,35846,8, 32442,10512,20115,6174, 32981,32838,30120,934, 29636,16565,34181,33494,41019,25882,35659,12951,31313,38908,11203,35403,38907,12677,35349,31431,43976,28193,32952,30129,27498,21560,3912, 23724,41019,15783,13344, 9242, 32896,37843,11233,17058,7307, 7647, 18128,37883,33504,3479, 31312,35245,38247,36455,14453,34006,36866,8993, 12022,16982,28664,8259, 39086,8485, 17234,14552, 36046,6859, 25509,6549, 16907,37297,10800,18851,35063,14125,24390,30061,27045,27606,38906,43976,37297,9535, 35033,37296,20650,19304,38906,41018,38906,33564,11481, - 38525,34558,43976,27909,20015,30821,14490,35569,35086,10186,38256,26019,9201, 29118,36801,13768,441, 10123,7692, 13196,9484, 22419,5772, 19235,7431, 20353,6953, - 331, 15980,20850,6027, 28018,33002,10738,24607,3724, 10805,258, 30361,11201,19535,3821, 1390, 389, 16924,21469,32734,20912,12622,15694,206, 23314,5519, 594, + 38525,34558,43976,27909,20015,30821,14490,35569,35086,10186,38256,26019,9201, 29118,36801,13768,441, 10123,7692, 13196,9484, 22419,5772, 19235,7431, 20353,6953, + 331, 15980,20850,6027, 28018,33002,10738,24607,3724, 10805,258, 30361,11201,19535,3821, 1390, 389, 16924,21469,32734,20912,12622,15694,206, 23314,5519, 594, 9599, 13996,5816, 21883,8068, 40, 4299, 5881, 11979,13284,26659,985, 18322,308, 233, 13417,13591,10666,2065, 18099,8509, 27694,17753,6106, 20248,32805,32955, 3281, 35879,15585,13936,4591, 30245,4338, 29488,1260, 24152,36782,10364,26494,10445,19251,36046,43976,27021,22083,11655,43975,43975,15252,37152,27221,41018,18289, 33222,13595,38906,4784, 36935,26586,27949,1207, 24805,1762, 43975,21404,23376,1477, 2915, 30217,38905,43975,33504,8311, 37938,25019,13682,5609, 31146,19769,29889, 1534, 2297, 11654,23457,21184,3266, 1655, 38303,37296,2305, 2671, 26991,12041,37385,18147,2657, 32464,38159,34561,21270,23599,43974,34309,10621,25081,12299,35892, - 36907,38484,43974,9686, 15122,4926, 3608, 733, 969, 63, 22452,2437, 29776,19562,10724,25869,26464,21871,32189,27925,22386,2036, 1585, 37296,18127,10508,1597, + 36907,38484,43974,9686, 15122,4926, 3608, 733, 969, 63, 22452,2437, 29776,19562,10724,25869,26464,21871,32189,27925,22386,2036, 1585, 37296,18127,10508,1597, 2530, 25849,10191,31311,38905,33369,3752, 35033,11008,14595,33716,30045,6147, 30995,41018,39227,14154,11186,36902,37753,27581,37891,1522, 18989,6066, 14058,29506, - 33276,36659,16183,34083,24084,19180,36533,33503,2727, 34526,999, 25325,34809,37183,37128,928, 38144,18480,37254,33238,33019,4900, 8883, 37420,23847,35637,1290, + 33276,36659,16183,34083,24084,19180,36533,33503,2727, 34526,999, 25325,34809,37183,37128,928, 38144,18480,37254,33238,33019,4900, 8883, 37420,23847,35637,1290, 34868,35033,34212,16862,31923,24286,30908,4506, 30264,12676,33005,37579,30271,24905,196, 39294,38905,28332,29866,34670,341, 38905,35032,22624,1616, 19303,43974, 43974,4726, 431, 7147, 34212,22197,2000, 38904,29521,22449,7683, 31310,1005, 38904,22196,3607, 33553,33503,21403,33185,37296,23066,22008,28739,21792,7502, 26263, 15782,18126,11916,35682,43973,37805,16748,35551,34995,36302,38904,38077,10126,35194,29278,34742,36129,38322,38904,2882, 1825, 41018,43973,4417, 12991,17057,34604, 24175,21245,43973,38705,7217, 36841,14057,25595,29520,29717,33883,14560,13252,37327,8355, 2204, 16775,22236,2944, 29003,1613, 8018, 14056,34961,36593,32896,31309, 39159,43973,12732,15257,43972,12563,485, 19639,6285, 32145,11491,23821,12301,9988, 43972,35032,9716, 17887,32791,43972,5740, 12586,26272,38903,4797, 25128,25870, 856, 9303, 5903, 26332,3493, 14022,8538, 2043, 5040, 9336, 8269, 12458,18207,8888, 7858, 15022,19395,6493, 18125,34212,33503,12842,22067,7002, 3435, 38421,18638, - 36517,22195,6072, 11385,644, 14667,26180,36319,29066,43972,10512,34835,34343,7595, 4922, 9572, 8509, 13152,12307,21517,6934, 3047, 5732, 5335, 20299,9069, 2686, - 7457, 15691,28695,4234, 2368, 8764, 1635, 30295,20655,30527,14968,18523,37830,6451, 53, 1528, 27219,14568,20629,2608, 34949,36111,5753, 1061, 38855,10125,1698, + 36517,22195,6072, 11385,644, 14667,26180,36319,29066,43972,10512,34835,34343,7595, 4922, 9572, 8509, 13152,12307,21517,6934, 3047, 5732, 5335, 20299,9069, 2686, + 7457, 15691,28695,4234, 2368, 8764, 1635, 30295,20655,30527,14968,18523,37830,6451, 53, 1528, 27219,14568,20629,2608, 34949,36111,5753, 1061, 38855,10125,1698, 4577, 8912, 17526,10118,32414,9244, 43971,34070,22639,30723,14134,2254, 1735, 877, 6744, 2397, 5181, 29199,3048, 28940,25751,10468,25274,14735,7063, 536, 16309, - 11264,24551,27176,7009, 16638,18924,20592,1808, 656, 3284, 13558,284, 2937, 13608,36910,24224,11636,11396,25398,7955, 22855,23385,9530, 35098,34877,43971,1004, + 11264,24551,27176,7009, 16638,18924,20592,1808, 656, 3284, 13558,284, 2937, 13608,36910,24224,11636,11396,25398,7955, 22855,23385,9530, 35098,34877,43971,1004, 1784, 5979, 1743, 4300, 5439, 2640, 31884,6422, 9534, 1673, 2974, 15193,10124,14055,6155, 3057, 14929,13305,7002, 12777,11635,32896,43971,15192,8107, 11176,37574, 27908,17492,36508,38441,34861,35032,15235,18067,33819,32961,9165, 14096,38363,26853,1603, 13229,23019,5747, 10859,41017,6016, 16637,21324,36912,43971,19302,14670, 14741,20106,41017,41017,5146, 19949,11634,8000, 32731,18637,21859,20535,25118,8046, 10558,9728, 9236, 10357,31308,14054,19948,9335, 3965, 10108,32254,19072,29868, - 36764,23796,19807,4388, 32301,9715, 35565,37295,32986,1345, 22729,34398,38783,3506, 6915, 35491,10110,31617,32813,29879,29483,32092,18218,24193,16032,37295,9941, + 36764,23796,19807,4388, 32301,9715, 35565,37295,32986,1345, 22729,34398,38783,3506, 6915, 35491,10110,31617,32813,29879,29483,32092,18218,24193,16032,37295,9941, 21999,39275,23005,6421, 36245,23501,6549, 30186,6468, 9424, 4955, 4489, 21056,25495,12355,1670, 30668,21516,16132,38903,36046,13121,20694,9140, 8261, 41017,20177, 2234, 14053,19911,33519,30243,34823,26829,35032,4388, 24245,10641,13563,35417,17226,19963,16181,25832,15251,21515,13, 19821,18857,23014,33004,31118,41016,17281, 41016,23162,43970,37295,37295,37610,33544,6764, 24318,38989,11074,14349,21511,27907,31032,18636,35306,33503,31307,22195,3448, 41016,4481, 16636,27906,28619,10499, 1419, 27945,39285,14033,32767,14669,6039, 11910,43970,25814,13964,17534,22194,18839,26882,37294,14052,26493,33914,43970,16985,27905,38903,41016,33502,31306,12853, - 8170, 29153,15191,35331,878, 20805,15289,34674,25937,33366,9316, 14069,32802,2546, 43970,26492,24263,34660,3248, 7805, 2926, 2373, 1464, 37488,33955,26257,1484, + 8170, 29153,15191,35331,878, 20805,15289,34674,25937,33366,9316, 14069,32802,2546, 43970,26492,24263,34660,3248, 7805, 2926, 2373, 1464, 37488,33955,26257,1484, 3393, 24028,18348,41015,21889,21449,5859, 9916, 37198,36017,20649,36401,20648,38903,15431,14051,35268,41015,22316,26491,26490,9114, 444, 555, 14308,43969,11285, 803, 6934, 29327,32331,36481,27177,1170, 32848,33980,36994,13040,22124,24374,858, 4596, 9800, 28300,14796,38190,37882,43969,37912,6031, 16635,38114,22298,34747, 5576, 33399,22984,39167,43969,38210,2713, 18478,4504, 38715,19912,13681,36472,41015,37187,7310, 20519,5089, 20185,1678, 35318,37972,4656, 41015,31061,10582,14086, 5062, 37055,34212,34286,4409, 20908,36856,12754,38073,6269, 38961,19947,14329,37130,27901,17348,37517,35615,10630,14050,8645, 16634,35431,21514,16633,12306,27993, 38062,36744,25553,7094, 7999, 6775, 10941,1742, 13094,12765,5472, 11971,536, 29704,1402, 7757, 7832, 2878, 1230, 21513,6721, 24666,25672,4383, 8862, 12783,35172, - 15732,33071,34211,34682,33502,34004,35031,6320, 39396,16621,13385,43969,841, 1392, 2689, 1321, 18635,16900,1754, 2702, 13636,5615, 7998, 607, 31253,7377, 2363, - 8227, 684, 28345,14049,7881, 38120,34535,21018,16681,9759, 18124,35031,11970,25908,34460,6604, 28613,24773,43968,43968,38902,1899, 11818,19946,5528, 34211,3675, - 33092,41014,9648, 21512,1194, 5036, 41014,34019,39025,22129,43968,34211,29342,861, 3821, 3718, 1882, 5596, 3011, 3744, 1524, 38934,17395,33667,6061, 13125,6690, - 2328, 4338, 17223,8642, 24628,37652,41014,13494,29946,15190,43968,15781,33996,29333,35519,6672, 2615, 25234,1433, 23582,11267,12286,38952,43967,43967,43967,7981, + 15732,33071,34211,34682,33502,34004,35031,6320, 39396,16621,13385,43969,841, 1392, 2689, 1321, 18635,16900,1754, 2702, 13636,5615, 7998, 607, 31253,7377, 2363, + 8227, 684, 28345,14049,7881, 38120,34535,21018,16681,9759, 18124,35031,11970,25908,34460,6604, 28613,24773,43968,43968,38902,1899, 11818,19946,5528, 34211,3675, + 33092,41014,9648, 21512,1194, 5036, 41014,34019,39025,22129,43968,34211,29342,861, 3821, 3718, 1882, 5596, 3011, 3744, 1524, 38934,17395,33667,6061, 13125,6690, + 2328, 4338, 17223,8642, 24628,37652,41014,13494,29946,15190,43968,15781,33996,29333,35519,6672, 2615, 25234,1433, 23582,11267,12286,38952,43967,43967,43967,7981, 43967,36033,35495,27904,19971,36045,32434,6411, 35031,37294,431, 11653,8765, 1449, 22403,38366,31305,21511,43966,33154,32452,36045,35031,35030,3174, 18935,43966, 11889,4412, 38902,2647, 11041,18634,34457,17552,11563,20144,9002, 36045,31304,31531,21298,43966,20197,6732, 6095, 4495, 9397, 6460, 18123,11465,2661, 6317, 20456, - 43966,12556,39189,2378, 1288, 3246, 20428,1894, 34745,14541,17758,23519,36180,35098,37370,18633,15237,32915,31140,36045,9909, 5852, 12675,13582,2270, 7713, 6492, + 43966,12556,39189,2378, 1288, 3246, 20428,1894, 34745,14541,17758,23519,36180,35098,37370,18633,15237,32915,31140,36045,9909, 5852, 12675,13582,2270, 7713, 6492, 5153, 7653, 36531,4345, 28158,14906,9567, 15345,4647, 19304,664, 21370,2282, 173, 3765, 3764, 1549, 12360,38902,36044,9355, 10689,37294,33502,41014,43965,13931, 36044,26489,32895,4480, 36513,34211,4963, 12674,37294,34210,38218,21510,38902,33502,15823,38496,34210,38901,12583,17031,6975, 24771,34384,8540, 17533,41013,35333, - 18903,159, 37959,10157,28856,18372,19204,23192,16546,22536,30579,15865,28679,32844,25840,23876,18557,32903,28185,32326,18499,22956,842, 26276,28898,37293,7815, + 18903,159, 37959,10157,28856,18372,19204,23192,16546,22536,30579,15865,28679,32844,25840,23876,18557,32903,28185,32326,18499,22956,842, 26276,28898,37293,7815, 34164,6485, 2281, 667, 11460,26455,16632,8694, 29183,37293,780, 21402,38901,25233,29519,32895,32895,31303,35030,41013,37610,35293,34210,41013,7455, 43965,36044, - 36044,38901,37293,26488,43965,3812, 7717, 36043,27960,37974,11443,18122,41013,38901,37293,41012,41012,22193,15009,35030,2602, 18121,15215,18120,41012,34564,698, + 36044,38901,37293,26488,43965,3812, 7717, 36043,27960,37974,11443,18122,41013,38901,37293,41012,41012,22193,15009,35030,2602, 18121,15215,18120,41012,34564,698, 4696, 13557,24968,3216, 19945,41012,41011,1198, 20562,10367,12366,17954,15163,15189,1736, 35370,29528,18575,840, 23882,7574, 24395,616, 10420,41011,18941,41011, 35030,35750,37995,37045,34628,29518,20589,35757,36819,22390,33324,16884,504, 31235,36657,2870, 43965,26487,25232,35029,8724, 38900,35946,22192,29517,43964,34210, 22191,31302,34209,20647,6932, 14245,1608, 31375,39196,9758, 24175,36043,18119,9798, 9533, 33501,14575,37301,35983,12828,28952,19944,38900,13424,27903,77, 19111, - 3058, 19149,12192,18579,25813,5269, 7804, 31821,43964,43964,17630,21401,20118,11064,10469,38353,2223, 325, 20945,402, 5378, 13785,33925,34831,1554, 1949, 9346, + 3058, 19149,12192,18579,25813,5269, 7804, 31821,43964,43964,17630,21401,20118,11064,10469,38353,2223, 325, 20945,402, 5378, 13785,33925,34831,1554, 1949, 9346, 6059, 36336,15326,36043,15764,6365, 43964,38900,34209,36402,33599,38886,23849,10052,4944, 32422,21509,20355,38778,9860, 7615, 43963,657, 3065, 35175,13789,17126, 29733,6931, 25350,17551,9296, 24962,9269, 1287, 861, 5152, 36528,7001, 3234, 19305,13267,1877, 8162, 35029,19301,34209,7043, 14048,34209,2922, 38546,11817,43963, 6503, 25480,3866, 33061,13265,10713,32390,9718, 34779,30719,30227,30452,35115,33552,30828,36454,17634,24381,37071,24563,25089,21699,3426, 7997, 9195, 34223,13553, @@ -13282,17 +13277,17 @@ static const unsigned short Ranks[197839] = 41010,2655, 7466, 22320,11652,32304,35276,571, 14792,27574,1723, 38754,31301,43962,8664, 15008,32894,4381, 37647,36399,7186, 32802,18118,4675, 41010,23916,43962, 32947,20857,38899,24066,667, 14159,16366,36118,38745,34408,30144,39234,7932, 11455,41009,34443,10798,33920,28195,5472, 43962,2233, 35029,38268,24083,26486,25231, 38899,34208,22717,35029,16428,34812,31300,10507,7441, 13555,1717, 12294,5964, 11073,37292,43962,13803,36138,36042,17174,6872, 35829,35411,14257,977, 7599, 27902, - 12610,348, 4092, 6954, 5221, 36042,38899,33462,37201,7146, 18689,27901,5935, 17532,38898,34328,34034,31299,25230,32894,18632,11633,34967,10581,11351,35035,545, + 12610,348, 4092, 6954, 5221, 36042,38899,33462,37201,7146, 18689,27901,5935, 17532,38898,34328,34034,31299,25230,32894,18632,11633,34967,10581,11351,35035,545, 18079,41009,30911,30612,25613,41009,20081,13680,27119,18631,8570, 9749, 24118,34209,11843,35144,19943,1813, 6132, 13396,23120,31752,38933,6632, 34222,41009,33131, 35865,11886,535, 37292,1803, 16619,13120,6597, 30312,26485,34208,36043,13738,38898,720, 43961,34208,31298,37952,12872,39010,4908, 8825, 37330,37413,35834,24470, 15188,36387,18621,20233,30659,26798,1363, 33940,9391, 39005,4322, 2207, 9573, 41008,33501,5986, 43961,15609,31142,24694,23921,17288,31447,39115,37292,3686, 19392, 11530,38441,7828, 38748,31345,25427,18161,16788,10051,36042,26940,36921,34207,7880, 9698, 5752, 5039, 1335, 9714, 7646, 7345, 38477,12691,21163,38518,22190,17460, - 28265,38119,253, 520, 28790,25770,7480, 395, 1046, 2628, 29233,16759,127, 21507,32894,23993,33855,5269, 17550,38898,24401,615, 5067, 29161,25029,799, 1729, + 28265,38119,253, 520, 28790,25770,7480, 395, 1046, 2628, 29233,16759,127, 21507,32894,23993,33855,5269, 17550,38898,24401,615, 5067, 29161,25029,799, 1729, 16631,1621, 1610, 37634,38346,38898,1780, 15187,11969,31055,15822,35561,5340, 27202,13093,33537,7167, 36023,22189,4304, 13092,20294,12775,41008,37292,2704, 39271, - 3929, 21506,10123,19942,43961,4803, 17007,8328, 23283,38897,18630,41008,15380,8202, 7683, 13384,9656, 36577,23196,25743,37903,6719, 10621,24825,11254,2820, 6199, + 3929, 21506,10123,19942,43961,4803, 17007,8328, 23283,38897,18630,41008,15380,8202, 7683, 13384,9656, 36577,23196,25743,37903,6719, 10621,24825,11254,2820, 6199, 11559,19970,41008,15494,43961,15580,17444,29368,16439,36041,27900,9757, 37291,43960,22188,34651,21236,26479,34774,37291,35147,3172, 455, 33501,36339,36233,36580, 2052, 6524, 36850,2108, 22187,41007,34829,13130,35843,10506,32929,4380, 33501,32894,16455,36041,36041,2454, 43960,6477, 589, 37291,1829, 43960,24715,38897,26214, - 33969,36573,37291,13101,35036,19969,24082,19815,43960,19968,41007,16182,34594,28050,43959,16491,19967,29516,17150,20898,37290,8642, 37290,6319, 15007,32901,2387, + 33969,36573,37291,13101,35036,19969,24082,19815,43960,19968,41007,16182,34594,28050,43959,16491,19967,29516,17150,20898,37290,8642, 37290,6319, 15007,32901,2387, 10127,8732, 29515,35836,43959,43959,36720,16914,34207,16630,21278,37756,17976,18662,26484,16761,34001,43959,35473,36709,31144,33552,25428,37019,22843,15780,10570, 25475,33106,43958,35862,14036,36261,3380, 16628,32993,13828,1849, 36390,43958,8310, 21946,32928,37476,36817,26904,13256,43958,17343,4151, 34207,33500,14537,39305, 18117,35028,37290,38897,10801,2844, 7548, 25527,31184,16047,32849,32167,5133, 287, 15898,25874,10816,16413,5042, 5532, 4786, 23740,16387,36041,33586,38463,25229, @@ -13301,16 +13296,16 @@ static const unsigned short Ranks[197839] = 37289,41006,5344, 3239, 43957,38896,21033,36637,28273,21505,20710,33222,36831,4377, 22678,7872, 19448,37753,36648,32674,32999,36329,32112,27690,8526, 38286,14090, 25463,33121,8496, 32255,21708,19205,16064,26645,30811,15689,23679,32824,6664, 8912, 22921,15686,32488,27772,19269,19265,32496,15614,31107,27661,21504,38896,43957, 15780,35048,35028,17548,16776,33768,36643,33500,26483,43957,26482,35313,35050,37289,5347, 24982,37807,30344,11968,32945,13439,22152,31875,21823,2130, 28220,41006, - 37604,35028,1582, 27060,33782,41006,41006,43957,35027,4785, 7879, 24141,35449,3788, 31297,19009,1428, 1121, 30643,32929,32123,14509,18642,34207,7733, 34148,7343, - 6900, 41005,36878,4165, 31296,6104, 979, 14133,2107, 38896,43956,22872,22186,31295,15779,36040,38896,43956,21551,1167, 43956,19941,33500,2644, 33500,15778,6094, + 37604,35028,1582, 27060,33782,41006,41006,43957,35027,4785, 7879, 24141,35449,3788, 31297,19009,1428, 1121, 30643,32929,32123,14509,18642,34207,7733, 34148,7343, + 6900, 41005,36878,4165, 31296,6104, 979, 14133,2107, 38896,43956,22872,22186,31295,15779,36040,38896,43956,21551,1167, 43956,19941,33500,2644, 33500,15778,6094, 23065,32893,43956,31294,37288,35567,12305,41005,34206,43955,34206,31108,27348,27682,26506,38895,6084, 18629,35682,38895,12304,33379,17055,7261, 30583,34206,18933, - 8645, 175, 21503,20967,10873,22098,6208, 21150,16650,27541,32441,21493,26481,5894, 32886,27128,2609, 27939,11118,1930, 23121,5669, 10261,14885,882, 27706,2969, + 8645, 175, 21503,20967,10873,22098,6208, 21150,16650,27541,32441,21493,26481,5894, 32886,27128,2609, 27939,11118,1930, 23121,5669, 10261,14885,882, 27706,2969, 8916, 393, 11417,33072,10833,19311,19940,32981,984, 32340,964, 29313,18214,9045, 25643,3366, 25299,21897,29532,18628,6858, 3393, 11632,4445, 1159, 34206,28894, 2859, 19516,41005,13554,31155,43955,29514,31506,8955, 27899,15821,33499,38895,3327, 32828,41005,41004,11888,43955,3059, 36040,43955,12122,38895,20535,43954,29511, 14254,23334,14667,33695,1637, 7093, 10122,14666,37288,37288,22185,43954,35774,37288,37287,2558, 9113, 26480,43954,23064,27898,35027,34205,33499,34205,38894,33499, 34205,36039,14665,29513,36039,38894,37287,18602,43954,38894,57, 20158,35714,25508,30860,37501,37729,5976, 20497,38826,24808,35563,2279, 23619,16629,7500, 26706, - 41004,2683, 41004,30380,41004,6476, 11072,9756, 41003,20320,5093, 5092, 11967,13553,37287,37997,17547,701, 5482, 14551,16618,13982,30795,32773,43953,19939,2918, - 9838, 36568,34096,34919,19938,33282,12871,6093, 29512,32720,33499,4031, 37480,32986,10354,14048,35847,18627,3002, 37611,5911, 7440, 21502,9124, 17573,15820,8537, + 41004,2683, 41004,30380,41004,6476, 11072,9756, 41003,20320,5093, 5092, 11967,13553,37287,37997,17547,701, 5482, 14551,16618,13982,30795,32773,43953,19939,2918, + 9838, 36568,34096,34919,19938,33282,12871,6093, 29512,32720,33499,4031, 37480,32986,10354,14048,35847,18627,3002, 37611,5911, 7440, 21502,9124, 17573,15820,8537, 4052, 38241,13637,15186,32868,8531, 13962,16628,35608,32893,1981, 12673,4324, 6708, 33863,2412, 16627,29094,25661,33286,3661, 36103,43953,24142,36039,893, 15534, 43953,28048,36039,31293,16181,34101,3690, 6277, 37772,34352,25680,33517,37316,10557,17546,27569,26802,38894,36558,35027,27897,41003,36038,163, 31889,24385,16894, 17545,6363, 22104,43953,17870,25392,31410,16617,35654,36038,31890,36038,33916,36038,38739,31292,475, 18965,27952,17084,19466,167, 6778, 32327,15161,6533, 31931, @@ -13318,34 +13313,34 @@ static const unsigned short Ranks[197839] = 455, 10705,15185,6126, 38893,3950, 30735,7878, 41003,8077, 32861,2861, 13158,13961,8542, 31414,36832,28616,29511,32893,14664,4032, 32399,36437,34205,8680, 13354, 43952,9744, 29510,20325,1268, 3230, 22188,5869, 28311,19670,11071,10797,8845, 13091,18237,35027,34879,35026,19300,11657,33498,29509,16252,32738,34680,43952,22124, 36343,32559,22905,34204,39293,19966,18688,43951,9857, 38917,38221,14663,27946,18176,43951,32941,43951,43951,1993, 17129,43950,33498,41002,38893,19937,38893,23861, - 35026,43950,38892,41002,1337, 4639, 43950,43950,19615,29276,11966,18626,17542,36037,33498,35026,35756,8248, 37012,734, 35885,38322,16333,35026,37571,38689,4723, + 35026,43950,38892,41002,1337, 4639, 43950,43950,19615,29276,11966,18626,17542,36037,33498,35026,35756,8248, 37012,734, 35885,38322,16333,35026,37571,38689,4723, 22166,35025,17530,41002,41002,5151, 20884,7000, 23063,31291,21400,3448, 34204,7645, 38892,10496,32893,38892,1840, 36037,22733,6882, 9532, 1377, 14405,3469, 26892, 13090,23062,16180,11631,9350, 38832,5049, 25364,41001,36975,15342,27896,38132,41001,16616,2904, 1802, 38892,18625,32834,21399,43949,38891,41001,18687,31290,38891, - 27895,31298,34386,25200,36037,38891,16697,10881,5731, 27267,28464,24047,33082,38894,43949,1567, 37286,32892,38489,43949,38157,37006,20302,12215,2407, 43949,5230, + 27895,31298,34386,25200,36037,38891,16697,10881,5731, 27267,28464,24047,33082,38894,43949,1567, 37286,32892,38489,43949,38157,37006,20302,12215,2407, 43949,5230, 13630,6770, 10432,16129,43948,8494, 17054,17541,5194, 19071,35025,4724, 22207,37931,31919,36280,24855,43948,12121,5565, 36036,8210, 31484,19299,35025,36036,35025, 32892,35873,28225,35148,5771, 29508,25925,35024,37286,4411, 5551, 15173,19445,33673,37286,37285,38891,20564,20090,29792,34815,41001,7516, 24431,39059,43948,34300, - 37285,38890,37886,34273,18694,6318, 41000,38890,26479,37255,23061,11629,25375,1433, 34853,43948,36821,38890,30900,10171,3447, 13414,21398,7306, 58, 17453,3481, - 18923,22485,16234,20065,32284,18697,23060,6491, 21501,36036,4604, 23833,6871, 41000,37285,43947,13383,38131,41000,31758,22184,41000,32892,15725,37266,15184,5564, + 37285,38890,37886,34273,18694,6318, 41000,38890,26479,37255,23061,11629,25375,1433, 34853,43948,36821,38890,30900,10171,3447, 13414,21398,7306, 58, 17453,3481, + 18923,22485,16234,20065,32284,18697,23060,6491, 21501,36036,4604, 23833,6871, 41000,37285,43947,13383,38131,41000,31758,22184,41000,32892,15725,37266,15184,5564, 32892,37285,1543, 37284,9713, 16179,34204,2973, 43947,26212,14662,15777,36036,18624,43947,2595, 38890,785, 36698,23059,35769,43947,25228,34484,37361,36201,35024, 8188, 40999,34204,36035,14661,43946,38889,2550, 14549,38889,40999,8536, 43946,32531,10688,37627,38848,25227,29507,11442,40999,6938, 24574,39347,38352,40999,43946, 33849,6895, 37991,43946,18785,23318,40998,37679,22323,35024,10050,28516,33498,43945,38889,37284,23304,15099,3310, 3133, 40998,34649,34203,29506,35, 6862, 17505, 33741,29820,10539,10535,38889,4908, 14047,27085,16615,37284,16903,38888,38255,34570,18233,35473,38184,4552, 40998,37559,38888,6870, 8076, 7305, 37284,40998,20594, 11965,22183,37283,36438,13679,37283,11640,29065,34203,15183,37283,20312,40997,6472, 27778,15244,33497,38019,27279,6598, 35024,31829,28855,33081,32365,30292,43945, 35023,37283,40997,32974,36253,17597,36852,33399,37522,33118,31455,18188,36921,20924,2060, 24934,5030, 12546,19584,40997,8630, 38888,43945,35023,37103,35061,13678, - 37282,36035,32891,40997,43945,35013,38888,26478,23791,28603,25226,40996,27645,38887,17634,31289,40996,36353,7037, 31288,38887,13960,25225,40996,32891,34203,5368, + 37282,36035,32891,40997,43945,35013,38888,26478,23791,28603,25226,40996,27645,38887,17634,31289,40996,36353,7037, 31288,38887,13960,25225,40996,32891,34203,5368, 40996,36035,32891,37282,36035,7634, 31287,36529,14264,2696, 36034,43944,2797, 43944,40995,35023,36034,35023,36034,35953,40995,25224,38887,26517,26920,43944,29505, 38887,36034,8188, 25223,3214, 12120,43944,25222,33497,37678,24169,25221,21262,11964,35022,32891,29504,34203,40995,22998,11630,26477,27894,38886,20646,18116,35022, 43943,36981,16178,40995,9566, 4076, 36033,34267,15776,37282,8828, 24081,43943,306, 32807,43943,10598,35022,10505,15975,33434,14101,36231,37282,35022,10358,36436, 30510,35021,2174, 37281,29503,36033,37641,14306,40994,36033,35021,40994,9928, 33891,35756,40994,7546, 36593,43943,37281,19965,38886,43942,38464,36517,28916,24063, - 16114,29603,25220,22182,43942,21397,31286,43942,33497,13677,6236, 6936, 23058,12119,31050,34731,33497,26838,35021,29502,34202,290, 27871,30587,15823,22495,4301, - 34202,32947,39143,37703,6643, 43942,27893,24080,38477,7304, 16626,15379,43941,10738,386, 19964,10103,38886,12008,9775, 14548,43941,37281,12454,43941,20645,6254, + 16114,29603,25220,22182,43942,21397,31286,43942,33497,13677,6236, 6936, 23058,12119,31050,34731,33497,26838,35021,29502,34202,290, 27871,30587,15823,22495,4301, + 34202,32947,39143,37703,6643, 43942,27893,24080,38477,7304, 16626,15379,43941,10738,386, 19964,10103,38886,12008,9775, 14548,43941,37281,12454,43941,20645,6254, 38886,7715, 843, 11161,17581,8824, 36290,22181,18126,26476,36033,27892,37281,4885, 43941,2582, 11760,40994,43940,4267, 40993,43940,23057,9444, 8535, 18686,17053, - 36032,24079,34202,4011, 31955,31183,38021,39389,15775,4075, 40993,12624,4325, 8260, 31285,43940,38531,29022,36994,38885,11963,2266, 19565,36458,30367,38815,2917, + 36032,24079,34202,4011, 31955,31183,38021,39389,15775,4075, 40993,12624,4325, 8260, 31285,43940,38531,29022,36994,38885,11963,2266, 19565,36458,30367,38815,2917, 3679, 17185,5406, 4099, 16614,43940,6917, 33897,9531, 18623,17540,40993,5438, 33835,917, 8524, 23634,22389,5995, 28849,29551,12290,34758,17539,43939,14660,20778, 38318,22349,37645,36477,39404,11375,32838,8129, 31284,14569,10687,29501,37280,15182,40993,37280,11070,35021,43939,14778,32882,10993,43939,15378,11651,32890,32890, 35343,24078,24443,29500,6065, 19293,22400,39355,39128,30094,43939,38885,43938,38885,9001, 7414, 26018,17440,10049,40992,13382,37280,43938,19963,3623, 36032,35020, 35269,18622,32975,6317, 43938,34202,15377,21341,15181,23056,31283,27074,3879, 34389,36128,25219,9538, 5099, 1938, 22099,27819,25218,37280,24077,43938,15819,11232, - 15774,35020,33496,27526,33234,13675,37264,23382,33729,16901,38355,30945,39392,40992,36833,37279,43937,40992,43937,14238,21396,43937,37279,7804, 43937,3202, 5897, + 15774,35020,33496,27526,33234,13675,37264,23382,33729,16901,38355,30945,39392,40992,36833,37279,43937,40992,43937,14238,21396,43937,37279,7804, 43937,3202, 5897, 24524,23033,20644,14368,36833,43936,32890,40992,40991,653, 18858,18621,32862,43936,34201,31282,17529,13962,19962,36032,1404, 22656,29047,7971, 3503, 34320,37950, 11962,22043,31281,22180,37309,17525,19961,40991,22744,43936,36608,38644,22302,40991,21500,38468,31353,36140,2429, 22267,35020,7689, 27891,11887,38365,35020,37228, 14046,40991,18620,5088, 143, 6015, 16951,32871,30674,27197,33340,1447, 24825,2878, 32832,19997,24114,26182,6801, 37279,19960,38885,13813,34659,14515,23902,20563, @@ -13353,8 +13348,8 @@ static const unsigned short Ranks[197839] = 34650,34201,40990,11109,10201,20920,34838,37065,6796, 27459,21341,39345,40990,16795,27822,252, 19548,5454, 29147,15382,16166,33267,7890, 36032,12134,35019,25508, 32850,14288,14497,38402,32927,25689,38671,39028,39419,22264,1344, 39092,15303,38884,34201,37279,14070,26454,38780,13552,6933, 2630, 43935,35988,4444, 40989,18115, 36601,17538,14386,43934,12870,38884,10861,27891,13084,36275,12365,29499,1554, 30384,37711,28093,4956, 37994,26943,16705,32896,5715, 3882, 12555,12869,27890,15818, - 3911, 35162,1690, 14190,15127,2526, 8965, 30847,34201,18619,18618,32902,7794, 6774, 37683,27982,38297,12118,39316,39148,12879,9915, 35019,40989,33496,40989,7877, - 6250, 35085,34454,17668,6145, 15719,7876, 15298,30717,32669,35098,501, 26625,19923,33496,12303,35019,16769,40989,2480, 9184, 31279,20644,33496,8419, 38356,2796, + 3911, 35162,1690, 14190,15127,2526, 8965, 30847,34201,18619,18618,32902,7794, 6774, 37683,27982,38297,12118,39316,39148,12879,9915, 35019,40989,33496,40989,7877, + 6250, 35085,34454,17668,6145, 15719,7876, 15298,30717,32669,35098,501, 26625,19923,33496,12303,35019,16769,40989,2480, 9184, 31279,20644,33496,8419, 38356,2796, 16177,9551, 32890,19773,43934,38884,9914, 17537,19935,4979, 33753,3528, 21499,200, 23962,10514,38424,33495,3074, 15838,32881,30953,11629,24076,32958,26475,14461, 34576,2683, 36629,3091, 32963,15376,34957,9231, 43934,7596, 17536,2847, 32200,30235,6316, 35019,35078,33011,35018,22797,26444,36031,43934,16992,5528, 30178,20370, 10939,34200,40988,43933,1282, 18949,24512,18394,43933,34463,4824, 9412, 36793,11219,40988,38737,30937,7260, 25750,35018,32245,40988,40988,34215,10686,33288,11214, @@ -13366,7 +13361,7 @@ static const unsigned short Ranks[197839] = 20855,29650,43930,20642,17001,11709,32402,14439,10352,26474,34200,21498,43930,17052,10357,3035, 13551,13550,16624,11074,2316, 21926,19944,19934,33950,38882,15817, 303, 2571, 33494,40985,22012,17528,40985,20641,43930,21497,7344, 35018,30717,37568,40985,33478,32832,14185,26473,16742,821, 11429,25217,35876,6410, 38882,40984, 36421,36030,37142,33393,33800,36030,34199,15816,38882,36820,12378,2478, 38296,37278,1817, 5298, 674, 5400, 33494,36030,21496,32055,14363,38882,21750,36029,17426, - 40984,34949,10615,30830,36029,31275,17051,1446, 1059, 34698,38881,11886,16623,43929,31575,38881,43929,12364,43929,43929,2275, 12452,38881,32889,23054,13676,7875, + 40984,34949,10615,30830,36029,31275,17051,1446, 1059, 34698,38881,11886,16623,43929,31575,38881,43929,12364,43929,43929,2275, 12452,38881,32889,23054,13676,7875, 16622,13675,36029,11231,29497,4098, 25264,36029,30774,29496,36374,34199,38271,43928,36858,3730, 38207,35017,26737,33279,36014,30613,43928,12868,38881,37277,22179, 31481,43928,43928,27527,21596,34115,13119,32890,6926, 2714, 9185, 14044,6019, 11043,2741, 38880,33493,23807,36028,3750, 26472,1073, 37277,32038,34171,37198,43927, 33493,24364,38880,43927,33493,43927,22178,18617,33493,6857, 12672,40984,2157, 17535,38880,36593,5276, 18114,37071,38880,34199,13380,2222, 6693, 5268, 11350,37277, @@ -13392,14 +13387,14 @@ static const unsigned short Ranks[197839] = 36908,34740,35968,40975,43916,37273,21394,37272,18685,8075, 29487,19296,29446,18684,504, 13738,4052, 8239, 12, 3192, 31796,25907,23009,16724,31435,17577,24604, 23693,19933,34929,124, 38874,5409, 35014,17534,43915,36024,9147, 36000,36925,6325, 28534,1485, 18612,27886,19043,19932,37199,36390,2588, 26181,23050,27044,24072, 32886,5193, 33661,2554, 19268,36023,6596, 11960,34598,7110, 36023,13088,30392,40974,8823, 11906,34055,24345,43915,32516,31265,19295,27005,20163,1102, 1343, 37272, - 5575, 32091,16531,36471,566, 22902,43915,23298,35093,24429,4443, 36822,3527, 34942,4966, 32556,28938,33490,18683,21323,37272,2072, 10580,7633, 15524,43915,7912, + 5575, 32091,16531,36471,566, 22902,43915,23298,35093,24429,4443, 36822,3527, 34942,4966, 32556,28938,33490,18683,21323,37272,2072, 10580,7633, 15524,43915,7912, 32886,961, 33490,13547,35014,31056,5985, 35853,1076, 25555,926, 7147, 709, 24302,18611,33719,7756, 11230,22174,3823, 38874,12669,19955,43914,33320,11441,26464, 36023,18682,9755, 23049,37272,43914,34196,43914,37256,4910, 21671,13378,14545,13165,38710,407, 33099,33106,32199,36023,16878,38873,37006,38873,24723,36371,14585, 16336,38465,37271,9020, 12971,3866, 39267,1300, 26463,31264,23157,11181,27885,14305,21852,18681,16680,40974,7957, 12668,37752,15872,3370, 25803,43914,11039,12492, 35078,1103, 14576,14706,33033,5890, 37271,6859, 38258,22966,21522,18363,18226,37271,36551,35750,13673,18108,40974,36523,13672,533, 9225, 43913,17797,2300, 14544, 40974,36256,28797,7577, 28331,20446,4681, 36022,40973,32781,43913,26462,23048,35731,40973,13377,40973,13546,19294,38873,10890,17375,24588,22514,31263,9253, 37271, 40973,28877,40972,15752,40972,33489,25392,36022,37951,29486,19954,1702, 19197,15568,29293,30928,19931,38873,19953,40972,37516,26707,18112,38872,37270,38872,36767, - 15827,10271,21738,14109,31009,19134,3847, 4637, 37270,43913,2874, 36022,14130,19293,11882,12501,40972,1410, 37270,38872,266, 36022,24071,33443,6195, 32507,8808, + 15827,10271,21738,14109,31009,19134,3847, 4637, 37270,43913,2874, 36022,14130,19293,11882,12501,40972,1410, 37270,38872,266, 36022,24071,33443,6195, 32507,8808, 1594, 7874, 7873, 32968,19930,25766,20413,34208,35175,3735, 38872,36255,20311,40971,6999, 18610,932, 5750, 6419, 34376,4674, 8043, 38099,12866,9407, 28309,38871, 31262,38007,2567, 3381, 37270,21583,22173,43913,37269,22949,43912,43912,37328,7969, 42, 31314,14021,1922, 18368,6771, 21409,22841,14031,24483,33080,21081,33054, 12045,16509,32963,11253,16621,24628,38324,28602,5791, 24510,13376,35841,34187,38270,9754, 29485,43912,32885,3982, 4402, 10182,3466, 8763, 35013,3303, 40971,38871, @@ -13411,7 +13406,7 @@ static const unsigned short Ranks[197839] = 37267,1909, 1992, 3035, 10859,38870,40969,33800,16173,11440,17047,43910,40969,3922, 35012,43910,33488,16172,43910,12864,37267,3200, 33488,37648,43909,43909,27882, 43909,43909,34195,37267,40969,7714, 6053, 43908,37267,24067,21393,36020,38870,40968,27881,37266,21392,43908,1375, 43908,27880,30713,36920,20434,27879,26500,40968, 3912, 5440, 33331,19952,38869,10047,43908,37266,40968,35009,35012,43907,37266,37859,15177,24066,43907,16620,43907,14542,12300,37983,38869,14304,38869,19292,36020, - 3771, 496, 13539,43907,17533,535, 38485,15864,37266,25067,14396,43906,13980,37265,32901,35011,36541,11959,32788,35982,36020,36669,2999, 29250,36860,16171,2630, + 3771, 496, 13539,43907,17533,535, 38485,15864,37266,25067,14396,43906,13980,37265,32901,35011,36541,11959,32788,35982,36020,36669,2999, 29250,36860,16171,2630, 29670,27878,34194,16610,14491,40968,23333,26328,31748,35142,38869,32831,35451,35011,32850,33448,38868,35959,7570, 7303, 4636, 18154,32885,9097, 11229,13118,38868, 18680,3538, 27878,37265,23047,43906,21391,3789, 9633, 35011,43906,22172,12687,38964,20189,13877,32884,9637, 38931,43906,38968,39017,13872,3861, 43905,17680,13034, 11038,34194,27684,20514,38868,38868,26827,32884,43905,11025,8465, 38952,8458, 32623,16609,6800, 11447,40967,40967,12360,38867,40967,6987, 33488,35011,10356,21491, @@ -13421,28 +13416,28 @@ static const unsigned short Ranks[197839] = 2712, 19461,19928,18916,25208,43905,17042,35087,13374,37794,18106,35010,2831, 15428,22258,10796,18607,40966,7713, 15004,34194,40966,6124, 39119,11347,38278,27877, 1149, 26146,22456,32884,37264,9753, 40966,6986, 7558, 23245,4836, 21490,37264,8399, 1374, 2972, 14654,38867,2594, 32884,33488,3501, 1735, 4192, 13545,3050, 29479, 35010,13087,23046,4031, 6340, 621, 8122, 24065,16862,43904,3811, 34898,2138, 22764,24372,2432, 30644,25476,28088,2379, 11346,22352,317, 18028,6338, 20887,17741, - 10227,12061,25049,22796,16792,31194,21307,9194, 32224,3254, 17957,4200, 15003,21139,24298,533, 27876,10120,1679, 30670,3916, 27589,36019,21747,10351,27875,4097, - 29478,6180, 10153,40965,2917, 8681, 35797,14181,23203,2065, 6578, 32840,22402,13698,20637,15125,13687,37944,26735,40965,29477,24064,502, 38866,40965,5098, 1791, + 10227,12061,25049,22796,16792,31194,21307,9194, 32224,3254, 17957,4200, 15003,21139,24298,533, 27876,10120,1679, 30670,3916, 27589,36019,21747,10351,27875,4097, + 29478,6180, 10153,40965,2917, 8681, 35797,14181,23203,2065, 6578, 32840,22402,13698,20637,15125,13687,37944,26735,40965,29477,24064,502, 38866,40965,5098, 1791, 3032, 30192,29493,20077,2565, 23895,31827,19927,30606,19951,7439, 11835,674, 3014, 24877,34795,2847, 4977, 37433,43904,40965,37264,17183,17492,10350,1727, 11958, 13985,3242, 37978,382, 4990, 20354,30839,36019,24883,13086,31257,23877,6144, 33023,15418,170, 3379, 15245,610, 2030, 43904,2726, 17532,975, 38584,2023, 27174, 600, 16170,33487,34193,35416,34193,2435, 11648,15374,34927,9711, 35275,13373,7302, 10355,19926,29476,18231,2948, 21390,32883,40964,4215, 40964,36226,38166,12863, 8590, 40964,31600,36652,17531,36018,3013, 32883,1937, 40964,38866,36679,33792,40963,6485, 38866,33381,43904,38607,11228,40963,3431, 43903,33680,36018,18679,10752, - 19925,8396, 22626,39251,3001, 315, 15772,3895, 34173,763, 10909,11227,24371,7851, 23045,329, 11192,21535,16242,29321,21489,1778, 29855,25192,40963,318, 5009, + 19925,8396, 22626,39251,3001, 315, 15772,3895, 34173,763, 10909,11227,24371,7851, 23045,329, 11192,21535,16242,29321,21489,1778, 29855,25192,40963,318, 5009, 17993,36018,23044,15373,39252,35010,2877, 34193,23043,38168,24009,35009,27485,15078,30374,31133,33558,10531,20803,17046,82, 21488,68, 5917, 13335,36018,35144, 35009,38866,18105,33487,1757, 16608,37264,15002,38986,33487,14303,40963,35975,25207,40962,38374,32883,4096, 40962,16169,5747, 33580,270, 32479,29475,34193,16607, 43903,35009,38865,40962,36378,40962,26630,353, 32334,40961,31256,19950,35009,17045,43903,10785,2406, 35008,38865,6671, 1677, 30525,26268,6192, 2830, 2009, 25206, - 35590,38865,19291,11037,5795, 43903,40961,1767, 10354,35008,27874,7454, 37263,37778,19924,18606,43902,13300,9112, 31255,25205,36232,26459,2484, 11628,281, 7363, + 35590,38865,19291,11037,5795, 43903,40961,1767, 10354,35008,27874,7454, 37263,37778,19924,18606,43902,13300,9112, 31255,25205,36232,26459,2484, 11628,281, 7363, 24730,3172, 276, 1114, 729, 7979, 12116,8641, 14042,36017,37263,35008,390, 22941,43902,3430, 33041,43902,43902,21487,14041,22858,27873,15813,38865,11069,19949, 36996,34192,36017,38429,36017,38864,38864,17530,10808,36017,43901,33487,4266, 37263,43901,43901,18605,2985, 9294, 11881,22222,32883,43901,25204,36016,6224, 43900, 34654,8991, 20636,37263,37262,43900,19948,10353,33486,36016,40961,43900,35396,40961,10504,31254,38864,27872,11983,27825,16168,10119,12667,15812,43900,36112,18604, - 7514, 1008, 4725, 33486,3762, 40960,32840,19923,4444, 18104,35008,15176,3476, 33486,6314, 36198,37791,3158, 1786, 31253,30605,7555, 43899,5142, 14302,20007,4096, + 7514, 1008, 4725, 33486,3762, 40960,32840,19923,4444, 18104,35008,15176,3476, 33486,6314, 36198,37791,3158, 1786, 31253,30605,7555, 43899,5142, 14302,20007,4096, 33533,36540,17057,26458,37262,37262,21486,37751,40960,38864,43899,21389,35920,13372,43899,11036,43899,43898,24063,2138, 1793, 18603,22278,30935,21485,12666,17564, - 27158,36016,16167,14837,31825,15372,20042,18602,35733,33570,26931,8259, 13117,13116,31252,43898,38863,13187,31325,3410, 7001, 18601,8308, 4442, 3051, 43898,37, + 27158,36016,16167,14837,31825,15372,20042,18602,35733,33570,26931,8259, 13117,13116,31252,43898,38863,13187,31325,3410, 7001, 18601,8308, 4442, 3051, 43898,37, 7301, 38863,21484,36002,15175,3402, 9193, 5662, 18600,11345,12299,410, 15384,20303,23709,18708,21689,23711,32662,17500,17190,38863,38863,30960,32892,43898,40960, 34192,3934, 33486,6774, 23671,40960,18821,2863, 34842,17012,26218,14963,5700, 4526, 43897,8073, 38862,3983, 20746,13085,15095,35010,5476, 5614, 1169, 16478,37881, 5873, 40959,37249,8822, 35007,33485,39319,5060, 38862,13084,38146,29215,18599,89, 7872, 27871,17418,15811,8218, 25105,11079,31251,1199, 27572,143, 14541,37679, - 1589, 10684,13544,38862,23042,5807, 27720,43897,38862,18598,27693,13492,9913, 2234, 13083,1597, 5932, 38861,908, 21483,15051,13613,21482,543, 5031, 1210, 2443, - 27870,43897,43897,19922,21214,10418,40959,33933,11627,6418, 38861,43896,37164,12251,2150, 43896,2380, 12115,43896,37262,5277, 18103,35650,2281, 4775, 11068,4416, + 1589, 10684,13544,38862,23042,5807, 27720,43897,38862,18598,27693,13492,9913, 2234, 13083,1597, 5932, 38861,908, 21483,15051,13613,21482,543, 5031, 1210, 2443, + 27870,43897,43897,19922,21214,10418,40959,33933,11627,6418, 38861,43896,37164,12251,2150, 43896,2380, 12115,43896,37262,5277, 18103,35650,2281, 4775, 11068,4416, 1272, 5217, 33267,5653, 3139, 13253,13894,37757,10670,13543,35007,37989,9337, 31250,43896,36160,10444,43895,398, 19921,34580,43895,36016,40959,15371,7074, 38861, 38861,8761, 33485,40959,15772,14301,43895,26457,40958,9353, 34192,3863, 16618,17625,15810,17529,6253, 38860,11067,20635,16166,10858,2483, 37261,27869,22171,21481, 18678,32882,29474,40958,32882,37261,7532, 24062,33264,31249,27868,37261,9111, 33485,38860,7996, 31248,21388,35007,37296,2409, 37261,15174,10683,43895,9110, 38860, @@ -13452,7 +13447,7 @@ static const unsigned short Ranks[197839] = 24871,36106,37748,40956,35006,15809,25697,917, 16617,43892,36123,36015,6475, 40956,16606,38858,36153,21479,32865,20936,1248, 31857,35943,7453, 40956,43891,38858, 3633, 43891,19290,40956,17043,24058,15771,19554,30414,13516,43891,39215,32769,33484,16605,16797,15627,29436,2302, 16236,35873,33634,28944,1862, 19056,3842, 14829, 14653,33729,34548,43891,32587,2129, 14876,43890,40955,29742,43890,21478,38122,2323, 3085, 36803,43890,5091, 128, 807, 5482, 7563, 1707, 1869, 32882,35006,14652, - 43890,29807,299, 25019,6449, 36015,31246,36580,25503,6194, 12298,19920,38858,15172,11226,43889,18676,6551, 25038,33484,4635, 29470,43889,43889,6007, 3238, 7803, + 43890,29807,299, 25019,6449, 36015,31246,36580,25503,6194, 12298,19920,38858,15172,11226,43889,18676,6551, 25038,33484,4635, 29470,43889,43889,6007, 3238, 7803, 38858,40955,56, 26704,1102, 3085, 11244,22145,43889,6320, 23045,18785,30398,34191,6164, 17526,43888,25474,1550, 34899,22170,15770,43888,15370,36015,24057,43888, 10197,36272,29224,29283,16671,11979,39413,27866,37260,39412,40955,9710, 19919,35360,29831,865, 7867, 25203,19947,33484,33130,28447,33945,43888,36014,40955,43887, 28090,38970,36014,6731, 40954,34923,12665,23040,13115,37259,38857,38857,12495,9447, 13671,19958,40954,32931,43887,11344,21477,43887,10857,38857,39152,34191,11066, @@ -13468,8 +13463,8 @@ static const unsigned short Ranks[197839] = 15000,38854,43880,725, 37256,37007,38854,33483,19946,38854,19917,12647,5863, 25244,37256,21061,22167,40949,31240,37256,22515,40948,40948,5892, 8680, 40948,38854, 43880,33482,15171,40948,37256,14040,40947,2628, 40947,36489,15768,6529, 36012,928, 7160, 25568,27468,26451,35168,13989,35004,32881,40947,36012,8534, 16132,16201, 39337,36940,28360,5605, 11613,10579,11034,3633, 1646, 7018, 13278,2159, 20020,32913,36675,19916,34189,35004,33482,36012,40947,21244,17953,34189,5806, 25202,18102, - 38622,5529, 38853,11624,33482,16208,43880,17035,9915, 17524,8679, 33482,43880,15767,16537,2947, 5608, 4600, 3809, 36898,3011, 4593, 31192,2795, 21381,16858,4137, - 37255,40946,14642,38828,31239,18101,22774,9234, 34271,33502,34553,34189,4560, 22499,15604,13461,39416,33604,39061,21039,6351, 38853,18674,40946,38853,43879,7514, + 38622,5529, 38853,11624,33482,16208,43880,17035,9915, 17524,8679, 33482,43880,15767,16537,2947, 5608, 4600, 3809, 36898,3011, 4593, 31192,2795, 21381,16858,4137, + 37255,40946,14642,38828,31239,18101,22774,9234, 34271,33502,34553,34189,4560, 22499,15604,13461,39416,33604,39061,21039,6351, 38853,18674,40946,38853,43879,7514, 43879,37255,31238,35003,35472,38828,43879,37086,37255,40946,37255,43879,35003,731, 8418, 1250, 478, 40946,29467,32722,31237,5889, 66, 15448,33481,17523,43878, 5965, 11534,13094,36510,36011,38853,43878,31236,27864,43878,15422,5255, 43878,37254,43877,23036,21384,2281, 40945,40945,38852,5404, 39410,43877,73, 10651,11647, 7755, 22282,31235,32329,36011,33481,331, 43877,38852,7537, 10681,15369,43877,7712, 40945,27863,31234,40945,27530,32280,33481,340, 5803, 30650,15646,16604,24054, @@ -13479,31 +13474,31 @@ static const unsigned short Ranks[197839] = 36010,35083,22149,17006,38108,38787,40943,34113,17727,36316,30242,34188,3010, 30234,38850,34547,15807,9425, 39190,12971,25665,12862,36010,15353,18099,14651,29461, 28438,5653, 9351, 34536,36010,36010,40942,37854,26763,15170,33244,27338,15169,37253,17316,9620, 43875,35003,19944,34214,18869,38850,34367,43874,33480,43874,38850, 37646,43874,43874,32316,20630,34433,38850,43873,43873,26449,43873,36009,40942,34188,35002,35002,43873,33480,30062,28742,23287,16615,21471,43872,15168,35561,35002, - 21382,35188,12357,38849,38849,26233,36601,32514,31432,1828, 10196,43872,18595,25200,33479,43872,13371,13419,43872,38849,40942,9912, 20571,2690, 43871,40942,9854, + 21382,35188,12357,38849,38849,26233,36601,32514,31432,1828, 10196,43872,18595,25200,33479,43872,13371,13419,43872,38849,40942,9912, 20571,2690, 43871,40942,9854, 38849,34188,29480,17669,38848,659, 38732,43871,43871,35002,13659,11646,35001,36009,31233,35001,20629,35001,12608,26448,39143,36009,37253,26447,4374, 28877,43871, - 37253,38001,43870,43870,761, 27387,16334,35149,1032, 14999,40941,35001,36009,10046,34187,14998,17041,43870,17523,36008,9914, 15367,38814,37253,40941,31295,6252, + 37253,38001,43870,43870,761, 27387,16334,35149,1032, 14999,40941,35001,36009,10046,34187,14998,17041,43870,17523,36008,9914, 15367,38814,37253,40941,31295,6252, 35634,3949, 36008,6730, 1568, 6143, 38848,36008,43870,22165,31232,38572,43869,43869,7300, 40941,17040,40941,37252,27859,43869,28466,43869,34187,23035,3500, 33479, 20055,37252,37591,37252,27858,36565,25887,32690,12851,13370,31439,27857,29460,29156,43868,38645,8990, 35000,43868,14997,23034,2974, 35000,43868,38848,7366, 40940, 28749,25199,38848,34187,14891,5888, 14297,38847,38847,43868,34187,5330, 14724,32838,5416, 17522,34186,38847,9219, 37252,36008,32214,43867,25198,43867,12114,25370, 43867,19464,37251,662, 17586,29902,35786,11482,37192,36007,29459,35000,40940,26654,10349,38847,16257,16665,37993,37251,40940,13063,9911, 33520,1943, 22164,19288, 32880,20628,40940,24051,23628,2017, 24801,14996,1622, 22458,6335, 3059, 9233, 34186,33210,40939,24050,43867,17040,388, 682, 21654,1155, 38033,43866,34754,18927, 137, 10731,3058, 25197,9232, 35470,3526, 2829, 12356,7659, 562, 43866,40939,43866,36007,27856,37251,19943,43866,34186,36007,43865,43865,33517,43865,33163,15143, - 38846,4823, 13981,21470,37251,2497, 43865,6985, 43864,25306,37250,16615,25196,19287,2280, 17522,40939,7031, 4010, 33479,19915,27492,38846,172, 35961,40939,633, + 38846,4823, 13981,21470,37251,2497, 43865,6985, 43864,25306,37250,16615,25196,19287,2280, 17522,40939,7031, 4010, 33479,19915,27492,38846,172, 35961,40939,633, 20114,30185,1135, 1874, 43864,35171,11645,37250,19751,1366, 43864,37750,43864,40938,37250,43863,36007,37250,34186,43863,16605,13369,35000,25195,37249,1756, 43863, 40938,32882,31231,27855,40938,24049,34388,18673,21381,43863,32880,40938,33479,20627,40937,40937,19942,32801,12861,34185,32880,32880,10856,5437, 34778,34999,36006, - 2470, 15167,27854,43862,34999,34999,43862,159, 23924,5471, 3614, 38169,40937,37062,40937,43862,36006,40936,7349, 13717,12923,43862,38573,23033,32879,38846,396, + 2470, 15167,27854,43862,34999,34999,43862,159, 23924,5471, 3614, 38169,40937,37062,40937,43862,36006,40936,7349, 13717,12923,43862,38573,23033,32879,38846,396, 829, 36006,40936,33478,38846,31230,43861,40936,33478,34999,37663,43861,40936,34185,17521,32710,34998,38845,6697, 156, 19520,32428,19988,36006,12355,36005,43861, 9752, 29624,25880,14296,34185,12639,16602,909, 27321,33071,16601,40935,23032,23031,36005,38845,37249,43861,35562,40935,38845,40935,38845,32879,16600,22163,23708, 33920,27853,34998,19941,23030,38844,43860,38844,40935,34998,848, 37249,2959, 40934,43860,9231, 29458,34998,22162,40934,27719,31995,18741,2743, 43860,38844,10855, - 36005,40934,38844,8732, 28393,30084,37249,884, 13542,33478,38488,31229,43860,32879,18017,43859,26570,18423,43859,40934,12860,26446,38843,37248,27852,18672,8999, + 36005,40934,38844,8732, 28393,30084,37249,884, 13542,33478,38488,31229,43860,32879,18017,43859,26570,18423,43859,40934,12860,26446,38843,37248,27852,18672,8999, 43859,37248,43859,37248,43858,36005,15872,26445,34185,34875,10045,32879,36004,43858,2233, 542, 22345,6320, 30130,16370,9517, 40933,38843,37248,36290,43858,34236, 31228,32878,21469,43858,43857,19914,37265,25804,17539,1023, 14718,31774,29457,37807,19286,25255,43857,20217,26444,12607,5931, 13114,40933,218, 43857,34997,34997, - 15366,36004,40933,24433,43857,160, 22929,4532, 43856,13541,11033,13080,11276,18607,35409,34336,35374,43856,31094,37242,40933,12664,6474, 27947,30163,15581,8573, + 15366,36004,40933,24433,43857,160, 22929,4532, 43856,13541,11033,13080,11276,18607,35409,34336,35374,43856,31094,37242,40933,12664,6474, 27947,30163,15581,8573, 22932,11909,43856,35591,12656,447, 3086, 22604,37247,18594,43856,34709,37247,14650,2230, 38843,25194,34366,15806,21468,38119,4644, 26443,33769,24742,36129,37247, 43855,31227,36004,37370,197, 30112,43855,9520, 37121,3171, 2529, 386, 12161,34184,34184,33216,2367, 1981, 24048,24047,11522,37247,7995, 17520,7203, 37593,35170, 36004,34747,22745,40932,31440,7630, 43855,40932,7643, 35128,20185,43855,40932,30255,28907,24046,25601,10998,36003,2334, 3298, 12663,1680, 12297,4603, 13540,23862, 15444,43854,3734, 32878,36003,40932,2670, 30570,37246,40931,34997,412, 16733,37275,34044,18098,573, 38967,4163, 29456,27851,124, 11065,27777,21143,36003,34694, - 38843,40931,18982,18097,12296,19940,34184,32878,527, 36003,17521,1148, 33044,3474, 19285,26442,38842,34997,4115, 24183,22161,43854,37014,34996,12113,32878,1187, + 38843,40931,18982,18097,12296,19940,34184,32878,527, 36003,17521,1148, 33044,3474, 19285,26442,38842,34997,4115, 24183,22161,43854,37014,34996,12113,32878,1187, 14, 7774, 32815,3606, 5569, 7020, 670, 20289,30782,39388,23908,57, 35185,37700,3676, 40931,32877,34184,43854,43854,43853,38842,37246,43853,38842,36002,43853, 43853,43852,40931,3762, 351, 19284,38717,38499,43852,13670,43852,21467,34183,36002,36002,36002,38842,43852,18096,43851,43851,33102,2638, 21380,7629, 17519,25193, 20626,38841,37497,34183,29455,34996,25192,9913, 5574, 7415, 33516,6313, 22404,2154, 925, 18671,73, 23927,11032,43851,34183,19283,12859,36001,13955,17039,30801, @@ -13525,14 +13520,14 @@ static const unsigned short Ranks[197839] = 19939,43845,28655,25187,24116,37242,6490, 37681,26857,34993,37242,43844,40925,21378,34993,9341, 8173, 32137,26436,35999,32798,12857,18094,37241,40925,19938,31224, 24043,43844,43844,37241,38838,38838,33477,4822, 14293,38837,35998,26435,43844,43843,43843,32876,39142,43843,43843,35998,37241,20623,31223,40925,43842,43842,38837, 40924,43842,35998,43842,43841,37241,9155, 40924,16698,17036,36517,33797,31936,22785,151, 19912,6750, 10215,16768,6199, 12861,22328,34181,24392,12660,9192, 40924, - 2744, 27217,38837,14230,13120,8869, 21644,23863,32008,1565, 4699, 12777,2484, 32360,24042,3911, 27594,12066,2092, 23767,6115, 4036, 3477, 21375,21310,32035,4170, - 10895,25090,23428,15208,987, 15803,4771, 32492,3860, 342, 7790, 26637,19006,30153,24500,25418,20871,22858,30190,25475,11827,6625, 29858,29870,27478,3133, 8133, - 14994,31460,3781, 18123,674, 29848,12368,6652, 37240,7182, 14702,164, 16227,14621,9136, 4630, 32920,13579,10892,15102,174, 6512, 5147, 29884,19359,101, 5380, - 31360,15261,9870, 14707,28362,23759,25526,20721,21149,22333,2532, 18061,21577,15946,3525, 31304,26526,978, 9940, 29450,14808,9869, 27975,29453,43841,38837,9820, + 2744, 27217,38837,14230,13120,8869, 21644,23863,32008,1565, 4699, 12777,2484, 32360,24042,3911, 27594,12066,2092, 23767,6115, 4036, 3477, 21375,21310,32035,4170, + 10895,25090,23428,15208,987, 15803,4771, 32492,3860, 342, 7790, 26637,19006,30153,24500,25418,20871,22858,30190,25475,11827,6625, 29858,29870,27478,3133, 8133, + 14994,31460,3781, 18123,674, 29848,12368,6652, 37240,7182, 14702,164, 16227,14621,9136, 4630, 32920,13579,10892,15102,174, 6512, 5147, 29884,19359,101, 5380, + 31360,15261,9870, 14707,28362,23759,25526,20721,21149,22333,2532, 18061,21577,15946,3525, 31304,26526,978, 9940, 29450,14808,9869, 27975,29453,43841,38837,9820, 37093,32633,1015, 6528, 6729, 1092, 20795,1275, 11033,16165,22003,7744, 13899,2720, 38785,21465,18592,16964,1259, 25566,5183, 5338, 26530,1405, 29244,11207,31241, 4599, 4359, 16337,39386,27848,18218,15790,14575,40924,31197,25579,16586,6826, 7247, 5463, 28661,18244,27881,31172,26631,5438, 7887, 35998,33026,14229,23269,20776, - 19046,33477,768, 16675,31832,21428,8112, 683, 15170,16186,28482,21640,2953, 2052, 32940,21464,40923,8621, 43841,21463,34993,15184,7645, 25612,36931,971, 4600, - 43841,36205,40923,13079,16613,14536,9765, 20826,7375, 15507,4481, 9798, 13629,31103,4450, 8497, 8104, 550, 6838, 27714,26719,16170,30918,26726,27847,23117,2219, + 19046,33477,768, 16675,31832,21428,8112, 683, 15170,16186,28482,21640,2953, 2052, 32940,21464,40923,8621, 43841,21463,34993,15184,7645, 25612,36931,971, 4600, + 43841,36205,40923,13079,16613,14536,9765, 20826,7375, 15507,4481, 9798, 13629,31103,4450, 8497, 8104, 550, 6838, 27714,26719,16170,30918,26726,27847,23117,2219, 22040,10517,7861, 11233,27703,32389,9692, 18346,17912,21584,24075,23296,28333,13648,24605,25822,2089, 18464,31503,3285, 202, 12384,15047,24909,9293, 20828,20771, 5769, 28158,13407,22261,7004, 38836,43840,19626,27707,21242,18349,31565,11389,34181,7097, 33037,5786, 19754,43840,43840,32875,35072,37342,5664, 16612,17890,31572, 33521,35375,36418,29470,37562,8677, 25044,39224,24404,22069,1412, 30423,4489, 7628, 15309,6442, 5333, 36974,10154,2069, 9334, 23014,33415,37492,28552,33302,36634, @@ -13540,7 +13535,7 @@ static const unsigned short Ranks[197839] = 36487,36731,37589,10578,34484,35997,38339,38836,37240,38835,6594, 35997,21462,13368,32993,38703,30729,38835,25163,6431, 22654,37589,37240,33022,38835,16611,35997, 19911,38250,40923,154, 33001,10340,15841,19787,21709,32152,30729,20223,25488,15802,5223, 7164, 29449,34306,16957,39167,17848,1332, 11957,22312,30202,37240,37239, 5311, 23364,40922,37239,7627, 35997,36998,34121,43839,22020,33023,40922,39286,32131,33476,40922,16685,18437,37239,3316, 20764,43839,9235, 13214,21377,272, 32749, - 31222,43839,34181,43838,6773, 34180,30917,40922,1107, 43838,18669,2140, 22159,5563, 43838,1349, 7166, 15164,4978, 3729, 32875,15765,27846,32033,32853,25940,8417, + 31222,43839,34181,43838,6773, 34180,30917,40922,1107, 43838,18669,2140, 22159,5563, 43838,1349, 7166, 15164,4978, 3729, 32875,15765,27846,32033,32853,25940,8417, 38835,34180,38834,34992,34992,29448,43838,38834,37939,7442, 1975, 19296,43837,2607, 43837,73, 2094, 11607,18731,25240,30708,31365,9893, 16662,725, 2004, 32902, 14895,1952, 23069,20633,32944,12181,22132,18626,10202,3906, 24040,32875,37239,40921,32350,18199,34992,12112,34104,33661,19910,29447,24039,6868, 36598,34208,38096, 4505, 23484,22618,12659,38189,14396,40921,18591,2662, 37997,17044,18271,3071, 24873,43837,23247,4463, 36803,34839,36216,4802, 38834,32874,2584, 32799,43837,36678, @@ -13570,11 +13565,11 @@ static const unsigned short Ranks[197839] = 43829,141, 1288, 27978,11814,8862, 16071,10405,20547,24035,19198,32987,28439,30800,22667,32478,24124,32663,33474,14580,20549,35105,31672,26432,8374, 27470,19904, 12954,21458,8506, 7853, 11127,35256,6222, 2952, 5274, 30000,14535,28070,11941,8396, 38828,14679,636, 33902,1262, 8392, 7999, 19427,20540,1380, 38775,28163,29388, 30928,6626, 19903,19902,11438,16596,19901,38395,26431,26762,15537,19900,33536,23419,38276,22592,18739,5297, 18364,29931,40915,34988,25002,2423, 6114, 10235,23580, - 23416,18372,13478,21947,26391,33474,6795, 1088, 9062, 17516,43829,8784, 1689, 2968, 5647, 31619,10044,35993,23023,18374,17991,35520,23022,16154,2193, 4352, 7871, + 23416,18372,13478,21947,26391,33474,6795, 1088, 9062, 17516,43829,8784, 1689, 2968, 5647, 31619,10044,35993,23023,18374,17991,35520,23022,16154,2193, 4352, 7871, 3348, 23346,1458, 43829,15210,15362,22493,1237, 29442,38312,43829,25046,6474, 32454,29441,34177,12656,20039,6699, 3147, 11955,16745,5606, 29102,17567,24227,11065, 1810, 22226,29873,17689,11679,5607, 32980,24035,10679,37288,8271, 35062,20181,26430,32580,11418,34988,21224,6142, 11879,7626, 9982, 34164,37461,32782,11855,26542, - 29184,13382,11030,537, 23840,29349,32420,26760,3350, 1685, 43828,35993,38827,5661, 21457,1457, 6579, 18202,9908, 27479,13891,26748,19935,34821,13808,12512,9369, - 1303, 25051,18587,43828,43828,32195,43828,43827,43827,9750, 34988,24843,24391,1310, 32819,18474,30744,14991,31719,960, 22154,40915,38827,37234,35509,43827,5296, + 29184,13382,11030,537, 23840,29349,32420,26760,3350, 1685, 43828,35993,38827,5661, 21457,1457, 6579, 18202,9908, 27479,13891,26748,19935,34821,13808,12512,9369, + 1303, 25051,18587,43828,43828,32195,43828,43827,43827,9750, 34988,24843,24391,1310, 32819,18474,30744,14991,31719,960, 22154,40915,38827,37234,35509,43827,5296, 481, 18586,37708,335, 19489,35992,3088, 6092, 8697, 26429,15800,305, 5485, 40914,32268,10854,37234,2242, 12855,7299, 5437, 31216,15361,12605,7802, 23021,40914, 7298, 37070,6925, 7144, 43827,31215,1796, 4169, 592, 3028, 9708, 29440,3641, 29997,1854, 21374,7072, 374, 26428,34177,31214,38827,1379, 643, 314, 24034,31008, 3188, 31213,18092,1236, 39033,39034,881, 34987,43826,14292,35992,5515, 35372,40914,31212,13953,40914,14990,7071, 16163,43826,1809, 27748,20424,18091,7473, 37234, @@ -13583,25 +13578,25 @@ static const unsigned short Ranks[197839] = 34177,38826,10349,37233,43824,17515,10345,12604,9491, 2009, 6063, 948, 8139, 32920,21280,7557, 34889,34407,37418,10145,11730,34987,31210,43824,7642, 14038,33909, 35992,21455,17514,35991,38826,40913,9107, 40913,35991,21373,40912,35991,19933,24033,8864, 37233,36657,34986,43823,11437,26427,26426,14291,43823,24419,36605,32910, 11029,32873,37581,3212, 14037,34176,38107,3361, 6945, 29307,13206,26425,11644,355, 12085,6250, 9707, 43823,22153,10148,29439,8995, 11973,33051,40912,30199,31353, - 13668,5301, 10117,27041,10116,18585,6625, 21372,38825,38825,40912,14988,24032,16607,14647,40912,35991,31209,38825,6692, 35233,37232,1432, 43823,43822,32518,2996, + 13668,5301, 10117,27041,10116,18585,6625, 21372,38825,38825,40912,14988,24032,16607,14647,40912,35991,31209,38825,6692, 35233,37232,1432, 43823,43822,32518,2996, 11954,10576,1448, 7437, 38188,37232,11953,19899,34986,37232,21454,35990,12854,43822,43822,32873,40911,35990,43822,38825,35990,34986,33918,35990,40911,18584,38003, - 4018, 8561, 35989,6122, 9477, 10753,13879,38080,29438,31208,38824,38836,37735,21214,24088,26424,40911,43821,1756, 16655,1160, 7493, 34270,43821,2513, 24031,4152, + 4018, 8561, 35989,6122, 9477, 10753,13879,38080,29438,31208,38824,38836,37735,21214,24088,26424,40911,43821,1756, 16655,1160, 7493, 34270,43821,2513, 24031,4152, 38225,37232,18788,25015,17841,34176,40911,11952,36143,43821,34176,627, 1139, 12603,31207,38824,20621,40910,38824,43821,40910,16595,38824,24030,43820,43820,37231, - 34986,40910,17020,25179,15441,12295,24608,43820,40910,21453,12654,40909,11951,32889,32873,1173, 16469,8950, 5525, 39383,7258, 6771, 9528, 6121, 7436, 22739,8994, + 34986,40910,17020,25179,15441,12295,24608,43820,40910,21453,12654,40909,11951,32889,32873,1173, 16469,8950, 5525, 39383,7258, 6771, 9528, 6121, 7436, 22739,8994, 7435, 37284,8819, 43820,38823,43819,8395, 17025,10167,4151, 21153,9503, 335, 38823,8394, 16606,6013, 17513,6004, 21371,37231,35989,15798,8993, 18583,19278,37231, 1624, 27455,23631,40909,25178,13077,15161,11062,21978,14534,32873,35831,21452,17512,5796, 16365,16605,37530,33012,23158,22152,37738,38195,33474,43819,692, 31542, 32154,19898,7870, 38549,9910, 5718, 34511,5447, 6867, 43819,12352,1126, 5392, 18545,31611,15100,13538,38436,26447,9355, 21451,3314, 2503, 19827,33474,21450,38797, 18729,33206,4017, 40909,32872,2215, 36427,25420,35989,2862, 34985,43819,40909,21666,35989,17983,43818,43818,38823,24952,3524, 31206,34908,9898, 12933,15713,33076, - 7660, 13667,16592,34985,24194,5660, 9909, 10348,16162,37231,27159,29764,19932,34176,37230,40908,38823,7625, 36970,43818,34985,2995, 798, 19861,40908,34729,3011, + 7660, 13667,16592,34985,24194,5660, 9909, 10348,16162,37231,27159,29764,19932,34176,37230,40908,38823,7625, 36970,43818,34985,2995, 798, 19861,40908,34729,3011, 38822,1610, 10411,957, 8532, 32810,21152,7619, 6315, 8545, 40908,43818,43817,448, 12455,16752,23999,37188,11342,4150, 33473,31483,13076,16604,17511,25086,14036, - 33846,15160,25021,23152,29045,38822,27090,7785, 17034,8818, 21449,19897,16603,32686,33960,9191, 12294,19896,10115,33473,15797,17510,6407, 1224, 26295,1190, 8424, - 38822,38469,5436, 16602,4784, 40908,9818, 12293,21641,9586, 8535, 14010,24906,14052,43817,43817,33100,36741,8662, 18173,35268,38822,15763,43817,12351,9228, 2634, + 33846,15160,25021,23152,29045,38822,27090,7785, 17034,8818, 21449,19897,16603,32686,33960,9191, 12294,19896,10115,33473,15797,17510,6407, 1224, 26295,1190, 8424, + 38822,38469,5436, 16602,4784, 40908,9818, 12293,21641,9586, 8535, 14010,24906,14052,43817,43817,33100,36741,8662, 18173,35268,38822,15763,43817,12351,9228, 2634, 17509,43816,16601,12292,15159,17965,34454,20309,17508,43816,43816,18582,36963,17507,9632, 8072, 38821,1228, 4324, 19895,38821,719, 19894,19277,17506,8643, 18664, 4636, 14533,39078,9527, 1847, 27074,19666,214, 16513,32774,28636,9827, 200, 8736, 25897,13734,1826, 8992, 30603,2251, 18581,13075,19276,24029,34985,20620,43816, 37230,25034,5634, 22668,9912, 5657, 9190, 17271,35894,18580,34984,261, 22028,11762,18958,6561, 24970,5788, 3651, 1354, 5018, 11186,26286,22439,21268,31622,32892, 14910,31620,19668,10727,1147, 32425,5746, 26011,13674,23345,28058,4827, 10715,31755,32187,5520, 8511, 9987, 17447,11270,13548,14495,9561, 26587,15467,16357,25741, 4999, 11413,4721, 16127,9479, 32009,4054, 21448,5945, 9189, 5090, 30808,811, 33476,36394,31730,2493, 29172,17619,13477,39028,38504,9069, 27405,21075,2570, 27581, - 23097,14431,33018,1569, 30531,12027,19877,3208, 15439,9966, 11990,7856, 30251,15707,5987, 29566,4931, 17020,43815,29197,10055,8616, 11541,32872,1164, 7690, 9937, + 23097,14431,33018,1569, 30531,12027,19877,3208, 15439,9966, 11990,7856, 30251,15707,5987, 29566,4931, 17020,43815,29197,10055,8616, 11541,32872,1164, 7690, 9937, 23137,8128, 10575,6770, 17505,14294,28581,11321,1355, 4284, 27613,20814,37487,22164,31387,1136, 22525,4297, 13493,21447,6438, 31205,23907,27402,20457,11806,34175, 29169,33457,25570,36668,19893,12702,3507, 3473, 11175,31943,13952,15158,7450, 12590,19931,1795, 34175,8639, 5031, 16972,43815,21370,43815,40907,43815,37230,38821, 7365, 14646,35988,43814,43814,27643,21369,17033,37038,13537,17504,13536,43814,18090,43814,37647,2711, 29374,16613,8463, 16600,9706, 5310, 5910, 13074,11622,21793, @@ -13611,14 +13606,14 @@ static const unsigned short Ranks[197839] = 10301,332, 6998, 8044, 14816,2211, 17502,25296,35988,4536, 8991, 2904, 7434, 37957,40907,38820,26423,23394,38820,16696,11950,9217, 37480,14936,6987, 791, 22151, 4904, 23529,35988,5296, 4328, 28393,12653,4074, 32965,9106, 3959, 2077, 19252,23742,3728, 35771,27350,10043,244, 22139,13133,15988,25855,2449, 13814,16672,20421, 20450,15801,27458,19892,29436,10042,766, 38819,30400,7642, 16983,8504, 26422,640, 31233,282, 32372,13472,38317,17499,11621,12030,35027,35988,3559, 14831,31566, - 11213,22208,29108,34174,82, 2229, 23563,10958,27542,16671,30786,32942,16007,27304,15972,13994,1921, 15062,23127,24428,18622,28850,8442, 24905,33025,11901,867, + 11213,22208,29108,34174,82, 2229, 23563,10958,27542,16671,30786,32942,16007,27304,15972,13994,1921, 15062,23127,24428,18622,28850,8442, 24905,33025,11901,867, 26249,25300,8329, 11210,4438, 3374, 27840,38819,37229,40907,9749, 37229,8004, 43812,3525, 25170,37229,31204,38819,38819,27819,11949,40906,43812,26421,35987,32808, 8039, 5951, 2379, 27559,29099,24714,29106,29107,40906,24719,43812,24366,43812,25779,25177,31203,33994,37229,43811,33692,22973,15957,29038,38818,32872,18707,39118, 16599,20790,38818,8356, 32847,6527, 34178,38392,24915,37265,38818,43811,39360,27839,40906,38818,43811,37228,31202,34174,27838,38817,36153,35987,26456,11146,38817, 38817,34984,43811,19274,38817,43810,43810,35987,35123,11723,2825, 16594,43810,38816,34983,43810,34983,43809,35987,37228,43809,12853,25176,34174,43809,40906,38816, 26621,26420,26419,43809,38816,9526, 36135,32871,34983,37228,43808,37228,34983,40905,10500,5470, 36859,40905,11878,4323, 27521,10344,34173,43808,35986,6670, 43808, - 15762,40905,25175,31525,34173,40905,43808,16598,31201,43807,40904,18336,13535,36086,19444,33114,38725,33473,35634,8257, 7939, 1616, 14987,32809,6548, 12350,6473, - 38851,24615,43807,11222,34173,23018,19892,24487,40904,36825,20116,7070, 9105, 14646,35749,36044,43807,34982,38816,38815,40904,34173,38196,35986,38815,40904,400, + 15762,40905,25175,31525,34173,40905,43808,16598,31201,43807,40904,18336,13535,36086,19444,33114,38725,33473,35634,8257, 7939, 1616, 14987,32809,6548, 12350,6473, + 38851,24615,43807,11222,34173,23018,19892,24487,40904,36825,20116,7070, 9105, 14646,35749,36044,43807,34982,38816,38815,40904,34173,38196,35986,38815,40904,400, 27972,20611,33561,13557,43807,3750, 6062, 18030,33620,37221,13497,38740,13440,29435,9349, 37227,17514,26418,40903,33473,33472,21367,13345,14290,43806,34172,29434, 35986,34172,38815,32871,33472,23017,3518, 17032,12349,14986,35986,34982,32822,38815,43806,32871,34982,1236, 19703,13796,31988,21425,20619,40903,38814,40903,38814, 43806,40903,40902,13666,24028,37227,25174,34982,31200,40902,27837,37227,38814,28875,36461,33472,6870, 43806,32871,13366,43805,43805,37227,11221,43805,16038,22150, @@ -13634,29 +13629,29 @@ static const unsigned short Ranks[197839] = 43801,34979,33843,33797,34188,38810,29429,40898,36848,34979,23176,40898,38857,25902,34684,22889,38810,19624,37387,13365,3558, 13664,5929, 40897,34979,28981,37223, 37223,3531, 38809,43801,34688,968, 37222,18578,40897,38151,22844,26415,5514, 43800,25599,16620,32870,26903,38571,38809,35983,13663,6984, 43800,2873, 24026,40897, 43800,24025,35983,32869,33471,3302, 19271,20617,10347,21366,8263, 38845,1731, 38338,26401,11367,36287,37718,32964,26877,43800,23015,7711, 16241,29428,43799,11641, - 35403,43799,29427,5560, 6916, 40897,40896,43799,2304, 43799,40896,2463, 25535,5887, 43798,38809,34170,22660,4575, 37222,8784, 8206, 21208,40896,7276, 4271, 8764, + 35403,43799,29427,5560, 6916, 40897,40896,43799,2304, 43799,40896,2463, 25535,5887, 43798,38809,34170,22660,4575, 37222,8784, 8206, 21208,40896,7276, 4271, 8764, 38550,36884,36280,40896,37222,37180,34743,13951,34170,38809,43798,22147,34170,38370,43798,38053,33068,43798,12852,11028,40895,38808,37222,34978,18088,37221,15759, 3810, 2099, 29426,22603,8759, 21444,12741,30246,435, 40895,1527, 37221,31193,5444, 23014,27832,35983,23155,4214, 17629,28662,37976,38808,40895,40895,18263,33301, 29425,35270,8235, 9512, 25519,38788,16984,34509,33268,29424,11720,14802,33789,3409, 10195,8256, 17031,25169,19890,37221,815, 6417, 11877,17400,24988,40894,20624, - 33282,40894,36480,7710, 19270,21171,9330, 34161,8306, 7801, 37540,43797,1212, 13494,35982,22408,10496,31259,11570,10656,21443,4116, 21553,38327,28229,3800, 6416, + 33282,40894,36480,7710, 19270,21171,9330, 34161,8306, 7801, 37540,43797,1212, 13494,35982,22408,10496,31259,11570,10656,21443,4116, 21553,38327,28229,3800, 6416, 1108, 13443,39272,14288,27609,23266,3678, 37221,2952, 6815, 43797,19722,19889,3890, 20506,7164, 36603,32780,39405,34169,19269,43797,43797,38808,23013,11987,40894, 43796,35099,40894,35982,43796,3309, 7994, 17513,40893,40893,35982,40893,32869,38808,43796,43796,26514,40893,22146,29423,38807,34169,7980, 33470,5130, 30500,24498, - 7725, 8863, 35982,29422,34978,32869,43795,33464,15822,38807,34455,18087,34169,12652,16597,40892,491, 23401,23134,279, 28606,40892,711, 12409,38807,16945,8918, + 7725, 8863, 35982,29422,34978,32869,43795,33464,15822,38807,34455,18087,34169,12652,16597,40892,491, 23401,23134,279, 28606,40892,711, 12409,38807,16945,8918, 34745,5192, 38807,39266,33035,16160,3382, 40892,30764,26197,43795,40892,1565, 16313,18577,37220,9101, 13950,1425, 22015,17512,40891,10114,38806,10138,38806,24854, 1197, 21442,15359,31192,20806,34978,14985,43795,1746, 10556,33038,22378,6428, 1656, 9327, 10541,12074,26414,13662,34169,8013, 21975,40891,13364,43795,6526, 19888, 24024,12108,7868, 26932,3237, 32869,37510,35981,38806,40891,34168,7108, 9193, 34978,40891,15758,21365,40890,40890,5107, 15320,12470,29720,29199,4410, 32859,34236, 16591,23012,19268,20616,10330,14883,34977,26413,38806,40890,1072, 37220,33470,6037, 38805,26412,14532,36693,31191,29421,43794,14607,482, 28946,10437,43794,12117, - 1511, 20178,32704,3365, 11640,27757,2571, 25651,26411,7720, 37813,36085,30629,21857,9100, 40890,6310, 35981,43794,741, 33470,9908, 35404,5652, 10041,14951,4951, + 1511, 20178,32704,3365, 11640,27757,2571, 25651,26411,7720, 37813,36085,30629,21857,9100, 40890,6310, 35981,43794,741, 33470,9908, 35404,5652, 10041,14951,4951, 20926,40889,88, 8015, 31016,32773,40889,43794,37220,33470,43793,43793,40889,34977,1392, 39018,6251, 14552,35415,20344,37005,38805,16159,14638,6383, 43793,19887, 2263, 40889,25168,21162,43793,43792,24023,43792,25167,11948,29420,43792,37776,37220,9705, 33469,38805,38805,8638, 35981,43792,17511,2661, 10714,34168,35981,31190, 36683,40888,8673, 43791,35814,7193, 8478, 19693,2075, 2211, 5854, 28867,8733, 9054, 2838, 450, 14779,26986,17132,22224,17030,12588,124, 6779, 25088,19505,26445, - 20395,482, 10160,26220,20794,5964, 32882,21442,26246,37219,27831,40888,28050,22336,32962,13872,38804,16158,19975,28407,22192,15794,8598, 29970,245, 6539, 7245, + 20395,482, 10160,26220,20794,5964, 32882,21442,26246,37219,27831,40888,28050,22336,32962,13872,38804,16158,19975,28407,22192,15794,8598, 29970,245, 6539, 7245, 32077,12291,17500,17499,18576,587, 10823,23116,26488,23845,32974,28934,4853, 7822, 19886,31119,208, 35807,43791,37219,34758,35491,8412, 38805,39309,2074, 32370, 21441,553, 20327,40888,35980,4730, 16596,5909, 18161,17498,15156,15793,7266, 17275,24003,27393,23527,35051,7433, 11783,38959,33339,43791,37274,8184, 471, 13849, 15951,38120,18575,21440,15273,33221,4228, 11341,43791,35980,2964, 34131,11903,1840, 21424,28922,2585, 19425,13848,20966,119, 4175, 29167,29345,10343,37211,21893, 23011,9525, 22145,11340,18998,16802,9227, 11510,38725,426, 31748,35896,11862,38329,16885,17497,38776,19930,32908,33147,18574,33052,22835,17496,32613,9907, 29446, 8840, 17074,18086,38804,32868,34168,14035,33114,43790,10346,43790,9226, 37219,35209,16595,4116, 10002,4038, 22786,13534,13906,21439,2899, 37904,16876,14571,38804, - 7343, 34168,7654, 37888,517, 36970,12346,2998, 40888,32868,8990, 2246, 9826, 26786,35089,25592,8632, 34177,35867,34661,28778,19885,24000,10953,31189,1968, 7357, + 7343, 34168,7654, 37888,517, 36970,12346,2998, 40888,32868,8990, 2246, 9826, 26786,35089,25592,8632, 34177,35867,34661,28778,19885,24000,10953,31189,1968, 7357, 29942,5407, 16539,24821,36060,5188, 931, 9236, 26244,20819,21649,16709,4758, 18792,12478,5749, 24879,32809,35001,2565, 3943, 13533,7993, 35644,8071, 7060, 19884, 43790,43790,27830,6178, 4217, 27733,32165,5149, 34167,31188,21438,28340,36401,35530,43789,26892,12345,32178,40887,38910,29419,8414, 35980,40887,38804,8413, 13110, 39373,40887,25280,21364,40887,32599,17030,4985, 35980,18573,3497, 1702, 27829,43789,35775,844, 4056, 33479,6907, 30498,21211,8393, 2121, 29418,43789,43789,38803, @@ -13667,57 +13662,57 @@ static const unsigned short Ranks[197839] = 34977,6290, 25165,17389,24049,33469,43786,38801,28565,31185,12107,19729,35577,18404,34045,5965, 38801,25597,23379,34422,24021,38657,38801,37218,8180, 12385,43786, 37473,17028,39237,32868,1521, 37871,6883, 40886,40886,35978,40885,43786,37217,5698, 43785,38182,15358,43785,32868,27523,43785,35978,33468,31184,3809, 39353,29416, 12344,40885,43785,7979, 43784,40885,43784,40885,12438,32867,43784,19265,15357,40884,1418, 37454,2388, 15548,14988,5714, 21734,15367,31183,34166,36505,38801,37751, - 39153,35978,40884,37217,39066,37217,33545,40884,35978,6798, 35977,36300,18661,23007,43784,19267,20614,8862, 13362,34956,20613,21363,35869,9748, 14983,25164,3257, + 39153,35978,40884,37217,39066,37217,33545,40884,35978,6798, 35977,36300,18661,23007,43784,19267,20614,8862, 13362,34956,20613,21363,35869,9748, 14983,25164,3257, 43783,43783,38800,43783,34166,40884,40883,40883,33468,35977,8305, 37217,34166,18660,34651,35377,36752,14643,39109,38800,27824,31651,5329, 37216,23006,24020,43783, 27823,37216,1643, 5604, 20399,31322,13931,9661, 29940,23777,8115, 40883,38800,23005,27822,13949,22143,38800,19266,13109,40883,40882,34977,38799,33508,40882,21362, 17027,30278,36846,24019,40882,4136, 23004,32435,30441,3253, 17089,19626,5748, 35972,21361,40882,7090, 19882,21437,21182,38633,24167,43782,17532,22726,38452,33482, 11639,33468,37216,29415,775, 16829,9478, 25663,18561,18659,43782,35977,21363,8861, 21436,37216,43782,13661,17510,4525, 40881,35977,25163,7799, 22369,19265,37215, - 24018,18483,11946,28112,35976,37215,1776, 40881,25996,9959, 38879,38516,5963, 4440, 40881,38799,43782,37215,37215,20612,24017,2241, 3135, 15049,23003,145, 5058, + 24018,18483,11946,28112,35976,37215,1776, 40881,25996,9959, 38879,38516,5963, 4440, 40881,38799,43782,37215,37215,20612,24017,2241, 3135, 15049,23003,145, 5058, 28842,15723,32815,37467,40881,11026,5064, 1128, 40880,4439, 26429,31271,20244,9943, 4666, 34235,26093,33378,39216,6307, 16884,6466, 16594,7257, 34976,43781,34166, 32867,7143, 40880,4379, 35976,35952,22734,88, 16790,33430,18085,37668,763, 2187, 15792,1462, 2495, 34976,40880,35427,37214,10494,37538,9099, 27821,33468,33515, 31811,37214,34713,13532,43781,12651,43781,37114,22775,13361,7190, 5176, 17026,38799,37214,38799,38724,29414,40880,34976,38798,24016,43781,34976,37214,25162,15791, 38798,43780,31182,34165,25161,27820,38798,1062, 5191, 16377,28149,27109,37458,37207,2823, 13895,32867,43780,43780,929, 18572,36142,9906, 14642,43780,3631, 33467, 38798,40879,35976,14641,40879,4478, 35976,33468,14034,32130,43779,38797,26409,13948,26554,30031,40879,35975,43779,1575, 24015,872, 31602,21934,32867,34165,34165, - 37497,14982,40879,38797,32653,37213,40878,40878,38797,11063,2173, 1652, 37213,43779,34165,6866, 34975,14178,40878,18658,38797,33467,38796,40878,15356,38182,735, - 31181,6406, 24014,39125,7069, 25160,25950,14640,40877,8304, 15756,40877,18657,5070, 34094,11072,5132, 35975,35975,29413,38796,34164,38796,29412,27819,32684,2941, - 18945,11875,23802,40877,37873,35975,43779,38754,31180,11209,31179,27382,17509,37213,9909, 8183, 38796,25159,37651,40877,2681, 6061, 5542, 15790,11062,19881,4504, + 37497,14982,40879,38797,32653,37213,40878,40878,38797,11063,2173, 1652, 37213,43779,34165,6866, 34975,14178,40878,18658,38797,33467,38796,40878,15356,38182,735, + 31181,6406, 24014,39125,7069, 25160,25950,14640,40877,8304, 15756,40877,18657,5070, 34094,11072,5132, 35975,35975,29413,38796,34164,38796,29412,27819,32684,2941, + 18945,11875,23802,40877,37873,35975,43779,38754,31180,11209,31179,27382,17509,37213,9909, 8183, 38796,25159,37651,40877,2681, 6061, 5542, 15790,11062,19881,4504, 9188, 1834, 2396, 1927, 3960, 19880,22328,16593,3007, 43778,38795,37213,33957,19879,3638, 4005, 13531,40876,32866,34975,6091, 37760,12106,40876,4394, 37283,26889, 24736,35974,43778,38869,34065,10040,43778,34975,33141,8758, 43778,34164,43777,6141, 13660,37212,1662, 13626,19260,12343,20592,10678,35974,43777,40876,38795,35974, - 34888,34164,10853,9489, 43777,12601,35974,2643, 7916, 32866,36900,43777,36491,2254, 12600,40876,38795,38795,30903,34164,39175,29411,26408,20611,43776,26407,6036, + 34888,34164,10853,9489, 43777,12601,35974,2643, 7916, 32866,36900,43777,36491,2254, 12600,40876,38795,38795,30903,34164,39175,29411,26408,20611,43776,26407,6036, 43776,43776,36829,40875,1213, 43776,38977,27818,34975,29410,34163,23002,38794,31178,5328, 3690, 16213,16207,6309, 21435,34163,13071,8575, 36476,6090, 4633, 35667, 34378,40875,19878,24013,38794,38794,40875,37212,18084,38794,34037,7800, 43775,27817,15155,4950, 10345,43775,23001,38793,34264,38424,38793,33467,37212,13465,43775, 35439,2387, 29409,35973,38793,38840,40875,43775,1087, 38793,24012,32782,38792,34974,17475,34974,37212,24011,4679, 12622,6305, 29408,8127, 302, 2229, 1162, 35973, 34974,10493,420, 43774,26406,11435,15578,5295, 34974,43774,37211,11875,15526,19504,1942, 24630,31177,10113,6983, 1394, 8913, 29683,37211,17508,11874,26405,40874, 6458, 38792,1805, 17449,9498, 1194, 43774,11434,40874,2970, 17495,769, 14107,28812,6581, 34163,225, 39035,38538,32866,13947,32866,14981,33477,37172,33467,33370, - 31176,8392, 1714, 22142,35009,36937,31175,5780, 4068, 5982, 33002,709, 5282, 33307,9187, 27816,3769, 11872,33074,3833, 2140, 2057, 25158,24796,38190,24865,3027, - 28802,30816,7936, 35973,38792,34230,21360,23922,35538,236, 18097,33083,17770,28791,33466,25157,35973,34163,26039,23969,34973,37211,40874,28926,898, 36479,6133, - 13273,15789,20753,126, 34162,40874,34179,9908, 11025,17025,38988,18656,21359,43774,40873,584, 15355,8412, 4597, 4056, 646, 3446, 13795,16589,16592,29407,1446, + 31176,8392, 1714, 22142,35009,36937,31175,5780, 4068, 5982, 33002,709, 5282, 33307,9187, 27816,3769, 11872,33074,3833, 2140, 2057, 25158,24796,38190,24865,3027, + 28802,30816,7936, 35973,38792,34230,21360,23922,35538,236, 18097,33083,17770,28791,33466,25157,35973,34163,26039,23969,34973,37211,40874,28926,898, 36479,6133, + 13273,15789,20753,126, 34162,40874,34179,9908, 11025,17025,38988,18656,21359,43774,40873,584, 15355,8412, 4597, 4056, 646, 3446, 13795,16589,16592,29407,1446, 4994, 19264,40873,4596, 10852,848, 34162,1730, 27182,35972,18779,29406,3313, 492, 21434,21433,21432,23922,14340,31174,10344,17494,38792,16157,33466,29405,14287, - 17507,4513, 24010,22477,5402, 33601,24009,26404,38791,6593, 19929,15755,22141,34973,3656, 39035,38791,37775,31173,34604,43773,36474,29404,4678, 25159,26436,9704, + 17507,4513, 24010,22477,5402, 33601,24009,26404,38791,6593, 19929,15755,22141,34973,3656, 39035,38791,37775,31173,34604,43773,36474,29404,4678, 25159,26436,9704, 43773,35972,40873,19877,43773,32865,34973,38791,6598, 26293,23825,439, 13462,2230, 26615,2907, 29881,14871,2573, 10574,38791,34162,8533, 26088,15354,40873,10183, 32796,29403,33466,12851,36330,29402,27815,35972,9684, 17341,43773,10039,27814,38790,13659,4168, 14531,13486,2352, 8126, 11433,5862, 43772,14286,6193, 37211,34162, 33661,30146,43772,43772,27813,14033,8182, 40872,24008,43772,37210,3939, 34161,25156,18083,34161,7739, 22281,36707,7669, 2683, 37210,9488, 17024,13552,13530,40872, 14980,23163,24007,37431,36495,18102,4918, 206, 32910,37210,6308, 9225, 3496, 34973,40872,5981, 37643,6797, 32865,19263,1766, 22266,23000,40872,6796, 408, 38790, - 12342,35972,43771,40871,35971,34161,16588,23056,21431,124, 5345, 817, 12067,40871,35971,35971,43771,14756,43771,612, 15754,17506,11024,43771,13360,13108,401, + 12342,35972,43771,40871,35971,34161,16588,23056,21431,124, 5345, 817, 12067,40871,35971,35971,43771,14756,43771,612, 15754,17506,11024,43771,13360,13108,401, 23408,14798,36507,10112,18571,29582,33466,38670,34245,38855,34161,12599,40871,4801, 11671,40871,22140,30787,17999,35971,8303, 37082,22999,40870,1254, 21430,13070, - 18570,5038, 8757, 18569,32865,13069,16587,23834,35725,38723,27812,29401,9848, 38064,12536,28712,38582,36944,18805,24463,9118, 10815,25239,38419,10845,37210,9186, - 15154,18568,15788,33584,43770,33838,32865,35970,9967, 20610,43770,514, 18812,7227, 35150,16310,16001,35914,9703, 6915, 14530,12650,21429,10793,1766, 24409,8255, + 18570,5038, 8757, 18569,32865,13069,16587,23834,35725,38723,27812,29401,9848, 38064,12536,28712,38582,36944,18805,24463,9118, 10815,25239,38419,10845,37210,9186, + 15154,18568,15788,33584,43770,33838,32865,35970,9967, 20610,43770,514, 18812,7227, 35150,16310,16001,35914,9703, 6915, 14530,12650,21429,10793,1766, 24409,8255, 11945,17630,12649,5805, 10111,21428,11339,43770,16591,38790,4595, 38790,37323,25632,4133, 15353,36332,18082,34972,26403,3951, 38789,8665, 40870,43770,6472, 32864, - 31172,33465,14588,39313,24573,14285,34972,40870,37077,20609,37888,6105, 36008,8181, 38612,7799, 40870,19262,17505,37209,38789,4993, 38789,23484,40869,31171,7142, - 25155,11657,35970,31170,43769,40869,17504,7256, 12289,34160,26636,10343,25154,13359,43769,22373,40869,43769,38789,34160,43769,626, 34972,22998,38788,8122, 1998, + 31172,33465,14588,39313,24573,14285,34972,40870,37077,20609,37888,6105, 36008,8181, 38612,7799, 40870,19262,17505,37209,38789,4993, 38789,23484,40869,31171,7142, + 25155,11657,35970,31170,43769,40869,17504,7256, 12289,34160,26636,10343,25154,13359,43769,22373,40869,43769,38789,34160,43769,626, 34972,22998,38788,8122, 1998, 39062,8413, 33107,36804,38788,40869,13658,35155,1315, 2527, 38788,24359,35304,32864,43768,3315, 4122, 1636, 12799,17023,43768,628, 19618,38788,22139,3537, 40868, - 33465,7978, 22997,313, 18934,919, 21427,5868, 19261,31719,14284,34972,37209,27811,38787,43768,29400,25323,1822, 14985,38787,34160,40868,68, 16818,26886,1782, + 33465,7978, 22997,313, 18934,919, 21427,5868, 19261,31719,14284,34972,37209,27811,38787,43768,29400,25323,1822, 14985,38787,34160,40868,68, 16818,26886,1782, 13721,24590,32508,23483,23179,28347,32879,40868,14639,37532,3276, 43768,19928,40868,921, 32864,155, 4869, 23545,30731,16752,35844,43767,43767,33465,37665,21809, 40867,43767,40867,2015, 33465,18567,33684,22887,22996,37997,27810,43767,33229,26402,32864,18140,27695,34971,4992, 34971,4296, 7798, 20608,38787,15753,35970,18655, 18081,1801, 14283,40867,32863,43766,29399,27809,38787,15752,7709, 40867,40866,18080,43766,37209,34160,2642, 38786,8860, 32656,32863,38786,754, 37209,17666,35970, - 40866,1125, 37208,11220,5846, 34971,6795, 31169,34971,34970,33177,26571,19927,7163, 40866,22138,37707,25419,11638,16156,22145,37208,9224, 7556, 34159,5435, 8987, + 40866,1125, 37208,11220,5846, 34971,6795, 31169,34971,34970,33177,26571,19927,7163, 40866,22138,37707,25419,11638,16156,22145,37208,9224, 7556, 34159,5435, 8987, 4678, 34970,19926,16590,21358,1430, 28734,26535,13205,9776, 29864,32863,43766,40866,43766,14032,17069,3105, 12341,25153,12598,38786,33817,35561,37764,40865,32754, 10492,34947,37444,12648,17493,32863,40865,32884,27808,40865,1678, 2777, 12341,3119, 38786,43765,40865,9223, 32679,8385, 31215,6769, 35969,14979,33464,22609,14978, 33464,36105,29548,3134, 16589,35969,18566,35391,34159,33464,38785,37100,43765,37208,40864,5367, 37208,6471, 43765,33464,38785,34902,13107,34159,40864,980, 37207, 40864,29398,37207,22995,30535,38785,13086,43765,43764,10038,40864,28415,22137,8125, 26899,12290,43764,37207,1304, 28364,21426,7525, 7324, 13529,43764,21425,11619, - 18654,5812, 333, 6011, 18967,21752,7089, 1483, 7006, 32484,32901,28386,15999,35803,34970,37207,7342, 35479,35692,5794, 16588,33553,15751,5175, 34734,1701, 710, + 18654,5812, 333, 6011, 18967,21752,7089, 1483, 7006, 32484,32901,28386,15999,35803,34970,37207,7342, 35479,35692,5794, 16588,33553,15751,5175, 34734,1701, 710, 21357,10690,43764,37206,29397,38785,19260,27807,34159,17492,7885, 19259,19925,12340,19258,17503,21356,8302, 9098, 10110,40863,8301, 7797, 675, 11954,18653,31769, - 1931, 14146,34158,35969,37799,37206,35969,32862,43763,32678,33399,18600,18210,34970,17502,10814,43763,33463,35295,36353,36742,43763,36452,24559,17491,4095, 9329, + 1931, 14146,34158,35969,37799,37206,35969,32862,43763,32678,33399,18600,18210,34970,17502,10814,43763,33463,35295,36353,36742,43763,36452,24559,17491,4095, 9329, 12989,16085,1806, 37720,26777,34860,18840,20444,21424,9803, 19876,40863,342, 27246,21423,24146,8780, 31214,28376,37899,2796, 14529,34158,4907, 17930,9963, 22994, 14784,797, 10573,22993,7555, 998, 35422,8911, 1777, 4323, 12288,4186, 18565,16043,34771,20050,19875,3524, 2828, 1117, 1735, 34158,34346,35968,1989, 11944,16836, 34393,2846, 8394, 36582,1018, 17490,18564,892, 8989, 5861, 8817, 14031,1295, 38791,11943,4834, 6624, 33113,22136,40863,6250, 2303, 40863,34969,7364, 40862,36030, @@ -13725,30 +13720,30 @@ static const unsigned short Ranks[197839] = 38784,34969,34968,35968,24006,18079,38784,43762,40862,40861,43762,43762,1896, 13946,11811,21414,3208, 35967,2456, 11306,7382, 2658, 3047, 25152,5448, 21422,43761, 24005,43761,2540, 24004,22965,11432,1790, 27944,16276,11061,21421,7567, 43761,36049,29442,43761,43760,38784,33376,26401,20607,43760,36921,23511,38783,35967,34158, 4438, 12597,34157,43760,15903,27806,34157,33463,38783,37206,34968,40861,27805,39372,34157,40861,43760,38783,19257,43759,34157,37205,24916,34156,15352,29396,34156, - 35967,35967,17501,43759,43759,43759,17022,40861,34968,38507,34156,17974,25151,34968,43758,35966,33102,31553,11431,26406,4191, 43758,29395,40860,43758,36938,4978, + 35967,35967,17501,43759,43759,43759,17022,40861,34968,38507,34156,17974,25151,34968,43758,35966,33102,31553,11431,26406,4191, 43758,29395,40860,43758,36938,4978, 6089, 21772,19372,38655,43758,22134,15750,37205,43757,11942,38783,43757,43757,34156,13508,31, 7876, 26698,38782,422, 11803,14977,40860,16587,9415, 32862,13945, 43757,829, 38782,17021,34155,17500,38782,43756,36159,38782,40860,37205,1175, 37205,645, 25856,24003,32862,7068, 14282,43756,1996, 40860,38781,37204,43756,43756, 43755,43755,187, 8479, 35700,30315,38781,10152,8813, 33462,33462,43755,759, 34967,32862,28334,12195,40859,25150,26647,20258,10767,34967,20606,38781,19256,29394, 14281,34155,37204,11212,38781,43755,19924,9097, 38207,27804,7624, 32861,43754,29393,40859,27803,27802,9222, 31168,30780,5799, 37204,442, 37204,10424,43754,26400, 13515,38527,43754,7357, 43754,4991, 38196,34052,40859,195, 13113,26614,38780,40859,38780,21477,32861,7226, 38780,9096, 36717,4632, 14369,29392,37203,43753,17970, 32450,40858,11603,33275,30564,29391,33462,43753,21837,20928,43753,38780,5713, 35966,22252,11941,37203,228, 9942, 6959, 4164, 35969,19874,6198, 4265, 38572,14030, - 17256,18563,19873,1163, 5606, 12339,21027,40858,29390,43753,37203,33462,33461,16641,39122,27801,40858,18652,35966,40858,38142,26922,27288,12287,38779,30596,20, + 17256,18563,19873,1163, 5606, 12339,21027,40858,29390,43753,37203,33462,33461,16641,39122,27801,40858,18652,35966,40858,38142,26922,27288,12287,38779,30596,20, 2336, 29859,9620, 17969,32950,823, 13603,24942,38884,13617,27539,32514,30253,10962,21872,32913,18429,14749,695, 9562, 1019, 32861,28289,8030, 17690,38779,25327, 34417,17489,25929,43752,38372,9905, 2864, 5748, 8254, 7432, 19923,8124, 33555,799, 7708, 43752,2024, 20565,21420,37203,26399,37375,4720, 34155,8300, 9907, 27813, 35912,37202,43752,14976,17020,43752,12850,4731, 40857,15649,22043,25665,22270,36324,38263,4443, 38779,43751,1178, 24002,15153,43751,38779,34155,40857,43751,33461, - 7992, 38194,4743, 5747, 35339,515, 22548,18172,29389,12105,13845,34619,6362, 17777,43751,9360, 14975,7977, 440, 22287,359, 13512,31059,23122,878, 678, 7976, - 37963,35966,24001,11583,16586,22991,26823,18526,37305,43750,18971,37264,26150,25572,43750,8532, 9524, 37202,34154,1674, 2814, 21419,7088, 38672,3506, 18562,1647, - 7255, 43750,43750,34967,21675,5327, 40857,26128,34154,38778,40857,11430,22133,27800,16585,33461,34515,29388,31167,15351,36031,6469, 8699, 1251, 37138,5166, 3800, - 36910,38811,14638,35805,29762,34154,15749,28064,43749,1385, 33442,29387,43749,34967,37202,393, 4190, 34154,38778,33526,789, 29886,34966,8391, 37975,5524, 5613, + 7992, 38194,4743, 5747, 35339,515, 22548,18172,29389,12105,13845,34619,6362, 17777,43751,9360, 14975,7977, 440, 22287,359, 13512,31059,23122,878, 678, 7976, + 37963,35966,24001,11583,16586,22991,26823,18526,37305,43750,18971,37264,26150,25572,43750,8532, 9524, 37202,34154,1674, 2814, 21419,7088, 38672,3506, 18562,1647, + 7255, 43750,43750,34967,21675,5327, 40857,26128,34154,38778,40857,11430,22133,27800,16585,33461,34515,29388,31167,15351,36031,6469, 8699, 1251, 37138,5166, 3800, + 36910,38811,14638,35805,29762,34154,15749,28064,43749,1385, 33442,29387,43749,34967,37202,393, 4190, 34154,38778,33526,789, 29886,34966,8391, 37975,5524, 5613, 37202,40856,10004,17499,9358, 2471, 37533,19255,2035, 2324, 19783,911, 38778,8859, 22132,16584,40856,38778,37201,29616,43749,38777,37201,37591,31947,36060,17019, 3905, 17549,37201,3748, 29386,37201,24819,24000,25103,7554, 1182, 8988, 18904,21515,27608,34966,38051,40856,3904, 17018,11637,38777,37200,19922,26398,23999,33461, 35478,7707, 15787,17760,10792,9702, 40856,37200,34153,33460,43749,38777,2669, 37200,38777,40855,21303,9747, 10676,40855,14136,11636,14974,34966,19921,294, 43748, 37200,43748,16586,35965,38776,9523, 926, 11622,28585,31166,43748,1252, 37199,25149,40855,40855,2405, 6982, 9487, 40854,2046, 34153,3199, 12104,35965,26397,20605, - 26396,40854,15748,20604,32944,2172, 37199,43748,7796, 33803,17488,43747,18078,3226, 7553, 35965,2657, 17498,22990,20603,43747,26395,6981, 1941, 36458,29385,3770, - 38776,11060,19254,15152,31165,19253,21418,34153,38776,43747,23998,25148,17487,34966,13106,26394,8299, 5605, 31570,17916,33808,31164,2302, 22138,32970,34965,3445, + 26396,40854,15748,20604,32944,2172, 37199,43748,7796, 33803,17488,43747,18078,3226, 7553, 35965,2657, 17498,22990,20603,43747,26395,6981, 1941, 36458,29385,3770, + 38776,11060,19254,15152,31165,19253,21418,34153,38776,43747,23998,25148,17487,34966,13106,26394,8299, 5605, 31570,17916,33808,31164,2302, 22138,32970,34965,3445, 4833, 35178,831, 28413,33068,8706, 34528,33396,11915,39217,2068, 27799,7991, 16583,162, 32789,43747,680, 11507,11316,2008, 2577, 39294,16408,11927,25232,11059, 27798,37199,33460,759, 17349,2748, 3429, 14016,3314, 1532, 3009, 185, 17032,9906, 22989,3761, 17017,32861,8298, 9328, 38776,517, 2231, 2914, 19920,1005, 33759, - 40854,43746,29384,33923,33460,35425,15747,36158,43746,35965,14224,37199,39333,11635,40854,29383,34965,10116,1681, 9905, 19872,1730, 34965,31567,6595, 7706, 813, + 40854,43746,29384,33923,33460,35425,15747,36158,43746,35965,14224,37199,39333,11635,40854,29383,34965,10116,1681, 9905, 19872,1730, 34965,31567,6595, 7706, 813, 4336, 6121, 1362, 2841, 34923,7225, 10791,11994,16317,34251,4492, 19231,21355,38092,10194,14637,29382,21486,5362, 36347,26531,3982, 40853,37198,8816, 19069,13540, 25461,37040,38242,33460,37621,7067, 30923,6249, 1922, 11429,36972,11873,37198,38775,22988,16585,14973,32998,28339,19252,6768, 43746,16582,24910,27797,40853,43746, 7534, 5266, 7254, 40853,19251,404, 38775,34965,43745,38775,33707,40853,33459,31163,36858,11634,34964,34153,43745,5559, 43745,31162,29381,35350,3087, 22131,34152, @@ -13761,7 +13756,7 @@ static const unsigned short Ranks[197839] = 34964,2459, 5276, 22834,35949,1343, 17484,15454,21415,35963,39135,8672, 33831,7641, 7867, 17026,24375,8936, 18559,1320, 37882,385, 12953,34152,6140, 11428,13993, 22985,19808,38772,12905,13395,16300,3920, 38653,19552,32553,17019,18467,320, 19255,14279,15744,70, 14624,38772,37195,32860,43742,4055, 12646,25830,40848,35010, 37335,30018,24456,3805, 2418, 43741,27794,8297, 38772,34963,14029,9701, 18558,27444,5928, 39108,11358,4279, 35962,43741,38771,37195,13358,34151,26393,40848,43741, - 27793,13657,40848,23996,35962,20599,13942,17016,22129,31160,32860,37195,34151,43741,38771,21354,43740,25145,38771,23995,11618,15150,32858,10342,14226,40847,311, + 27793,13657,40848,23996,35962,20599,13942,17016,22129,31160,32860,37195,34151,43741,38771,21354,43740,25145,38771,23995,11618,15150,32858,10342,14226,40847,311, 8746, 23979,5100, 32902,7990, 34963,840, 38771,4477, 33459,14278,17015,40847,8070, 19050,29378,422, 2429, 21414,25144,11872,27792,14277,23994,43740,26392,43740, 43740,38770,17496,1002, 8531, 12596,38770,6767, 14846,14526,18557,3146, 37195,30854,37194,1882, 35962,33459,43739,38770,40847,5, 4446, 32873,29554,34404,15766, 34963,6943, 1345, 3958, 14972,9406, 29631,6405, 21540,24172,1309, 14402,5573, 595, 7240, 38770,2315, 35962,40847,22127,9904, 26790,21413,31159,835, 11332,19851, @@ -13771,7 +13766,7 @@ static const unsigned short Ranks[197839] = 19919,17014,40845,34492,43738,19918,16581,34962,43738,9700, 13356,31155,40845,35960,38768,23992,40845,29401,38768,43737,12549,37541,16938,9221, 37117,14636,33458, 22128,26390,40844,20598,20597,43737,30795,9630, 34934,13486,29376,880, 14148,22657,4602, 4800, 3986, 28047,3950, 8253, 14279,38767,40844,21822,11058,38767,37193, 29375,31154,40844,37761,35960,13941,29374,5469, 14635,28275,34150,43737,15149,18649,38767,20596,2575, 15743,31153,25142,4990, 32859,19249,14028,37193,17013,23991, - 5030, 15349,17483,18648,33458,12849,3313, 43737,4742, 43736,34962,6139, 43736,11022,18076,38767,8389, 38766,35851,6980, 17012,40844,7331, 37439,13995,11632,4782, + 5030, 15349,17483,18648,33458,12849,3313, 43737,4742, 43736,34962,6139, 43736,11022,18076,38767,8389, 38766,35851,6980, 17012,40844,7331, 37439,13995,11632,4782, 35843,33457,1606, 5402, 19917,40843,5572, 15148,14634,33457,22127,34150,14525,34961,14633,15348,40843,2034, 11426,25141,11218,19248,35960,34150,40843,18647,33457, 33457,21353,38423,43736,2039, 34150,36543,589, 3523, 21113,8496, 26426,29226,19865,34961,43736,2682, 35959,43735,1273, 43735,27791,34149,20574,2989, 13067,13654, 35959,33456,40843,30136,40842,18556,38766,34961,43735,43735,43734,2341, 6249, 8252, 6415, 36360,33336,29373,35627,32682,39188,43734,17494,43734,19868,10491,35959, @@ -13781,14 +13776,14 @@ static const unsigned short Ranks[197839] = 40840,37501,39089,40840,12848,33367,38765,32859,38765,43732,15741,37193,43732,31629,34917,8832, 21599,24918,21168,33811,26833,32622,34516,16842,43732,43731,14053, 38765,18645,34960,38764,13104,298, 698, 26135,33028,22662,4890, 32582,7328, 21185,3770, 30767,28896,32993,9563, 22681,10919,28641,25837,1982, 13527,11761,43731, 19113,21411,25423,831, 15783,28815,12768,7707, 361, 4908, 21978,10789,5659, 10549,16595,37192,33137,40840,32859,38764,25635,9941, 14274,23383,37651,40839,40839, - 24451,33456,21410,43731,36505,38764,35045,40839,29547,16354,20945,7327, 23990,38764,43731,7533, 38763,33456,32858,33744,34960,30661,34960,27747,35958,35530,4098, + 24451,33456,21410,43731,36505,38764,35045,40839,29547,16354,20945,7327, 23990,38764,43731,7533, 38763,33456,32858,33744,34960,30661,34960,27747,35958,35530,4098, 27789,11631,40839,26389,35958,9347, 35958,397, 15786,40838,26388,21352,11425,37192,5247, 38763,43730,27788,40838,34959,21367,38454,3981, 37192,38763,43730,16154, 14632,4476, 36014,35957,40838,40838,35957,18644,37192,9629, 19916,40837,40837,43730,18643,16580,13940,43730,43729,43729,19915,37191,19246,40837,22983,655, 29247, 16806,23027,28647,20594,40837,4724, 22982,43729,35957,16153,33455,6669, 2761, 30552,25331,8987, 40836,11499,1008, 7734, 1000, 14007,23989,34148,38763,25140,31150, 34276,38762,18642,35935,39156,10683,11057,3612, 7401, 10342,8123, 4467, 13526,11871,5326, 40836,17011,649, 13355,18555,4852, 10037,40836,43729,32898,39074,29371, 21520,850, 40836,11616,38762,43728,43728,849, 19567,2567, 15588,25139,12059,35670,38762,13103,7353, 13818,21489,5725, 13521,31149,33915,34959,8738, 12939,13102, - 18554,36502,38762,18641,40835,22981,33455,783, 12639,14273,33455,3577, 27787,4244, 10013,33059,2946, 6794, 43728,33113,34959,495, 9543, 37564,20220,3847, 2714, - 10463,3005, 2563, 12311,37191,43728,20113,23690,38761,324, 21846,710, 33105,11366,4407, 6602, 19397,21413,24234,31628,18488,32958,3507, 17843,6312, 16311,6627, + 18554,36502,38762,18641,40835,22981,33455,783, 12639,14273,33455,3577, 27787,4244, 10013,33059,2946, 6794, 43728,33113,34959,495, 9543, 37564,20220,3847, 2714, + 10463,3005, 2563, 12311,37191,43728,20113,23690,38761,324, 21846,710, 33105,11366,4407, 6602, 19397,21413,24234,31628,18488,32958,3507, 17843,6312, 16311,6627, 38406,22189,32779,21752,40835,38761,43727,5361, 16583,1497, 13171,17745,18946,8935, 5681, 14524,29370,40835,36202,40835,11121,31148,32858,15785,37191,40834,38761, 32217,543, 32305,7360, 23988,1884, 22628,26387,25138,22126,35957,33893,25885,29369,40834,34959,6060, 28529,27873,33068,2479, 4831, 16211,43727,34416,33039,40834, 17010,37191,43727,34148,15347,29368,34958,43727,17492,21351,35956,29367,43726,43726,34148,4821, 40834,31147,27786,34958,21350,40833,4719, 11338,31146,15346,38160, @@ -13797,7 +13792,7 @@ static const unsigned short Ranks[197839] = 26385,2524, 18075,35956,25238,40833,13066,17481,7975, 18553,10490,742, 2874, 15442,20301,28525,19589,30853,21409,9114, 12847,32253,34873,632, 43724,1600, 19346, 10981,23560,34147,43724,11424,8371, 33455,43724,9486, 43724,35956,20614,4949, 34847,4503, 1408, 26987,15146,31406,11337,37844,28935,33685,12645,3010, 5254, 32620, 8388, 40833,32407,12768,19864,37643,34957,38761,7383, 23295,38760,37190,23987,2232, 7718, 10018,28568,10281,21931,36619,43723,38125,3819, 32677,28968,43723,27298, - 10674,16579,40832,38760,38760,43723,10341,40832,25137,3630, 18074,7953, 16333,32876,4095, 43723,29366,1015, 2670, 5963, 16582,189, 570, 6282, 11068,40832,173, + 10674,16579,40832,38760,38760,43723,10341,40832,25137,3630, 18074,7953, 16333,32876,4095, 43723,29366,1015, 2670, 5963, 16582,189, 570, 6282, 11068,40832,173, 28710,22125,37190,37189,22979,27784,14272,43722,35955,38760,16779,26866,29448,31884,13805,33080,32858,43722,38080,37207,35068,36465,16581,11217,18904,20287,33584, 31377,11048,4776, 35955,19881,35955,40832,43722,6151, 43722,3683, 17921,35284,3008, 34147,38759,38759,36570,39353,19906,5037, 7928, 18996,8122, 22473,38059,37189, 10985,25832,33402,40831,22124,35255,21728,32955,43721,2809, 2852, 10754,25003,11624,8179, 31964,35955,9522, 33454,35954,40831,36781,16580,14523,31145,34147,40831, @@ -13808,9 +13803,9 @@ static const unsigned short Ranks[197839] = 27342,34147,5980, 19913,43719,21773,39312,29174,43719,2132, 38758,43719,43719,40830,40830,21349,5240, 9743, 14244,34624,15145,43718,18073,34146,17589,32857,30297, 6793, 3600, 25594,43718,4210, 3650, 21407,14026,2488, 34957,33454,40830,3412, 3927, 12338,7431, 21406,5089, 9346, 5804, 6059, 26967,11615,5803, 25273,37188,17941, 8410, 847, 12283,37188,36812,17737,34956,34608,13537,40829,23222,34146,38548,29191,18402,21348,33586,31129,27379,5107, 35213,18894,14205,16064,43718,35954,16578, - 4624, 10991,10483,43718,33164,17491,18072,38758,10787,1916, 32184,11335,43717,43717,16579,35039,10327,17510,18071,43717,34146,19863,16577,9521, 11423,38758,1885, + 4624, 10991,10483,43718,33164,17491,18072,38758,10787,1916, 32184,11335,43717,43717,16579,35039,10327,17510,18071,43717,34146,19863,16577,9521, 11423,38758,1885, 10203,5444, 21405,36045,43717,29655,33548,14522,18551,4976, 38806,23986,3478, 11759,19862,24027,14025,18070,32493,18940,12282,16739,23955,38903,2126, 3408, 17490, - 7221, 3611, 28816,25136,20631,919, 2809, 17144,18984,23250,33169,9156, 4209, 25135,16578,40829,18550,43716,23985,34146,40829,29761,9485, 3380, 33056,38758,5512, + 7221, 3611, 28816,25136,20631,919, 2809, 17144,18984,23250,33169,9156, 4209, 25135,16578,40829,18550,43716,23985,34146,40829,29761,9485, 3380, 33056,38758,5512, 34956,40829,35901,37188,40828,24196,37870,20249,16152,43716,37171,38002,37449,43716,35954,14024,18549,43716,40828,38757,38757,40828,9903, 18069,37187,43715,34956, 16012,13905,20115,26605,20674,8815, 22977,33233,37187,43715,18548,26383,37187,35434,35095,38757,17009,8570, 40828,37187,35954,9627, 23984,13525,4189, 43715,18335, 22123,40827,28684,38786,16576,18547,32857,34956,752, 5253, 10193,7794, 38757,2512, 7297, 38756,2932, 18637,40827,10192,38756,32857,34145,34104,29364,7223, 18636, @@ -13818,9 +13813,9 @@ static const unsigned short Ranks[197839] = 21240,1347, 34620,9379, 17480,10786,13524,14807,35719,32857,21347,10299,33453,19912,43714,43713,40827,19911,4746, 5886, 38756,21346,10489,18068,38755,18252,43713, 19243,37186,2656, 40826,13065,43713,20592,26116,11023,1055, 32811,36692,3444, 31142,15344,22976,314, 18792,19910,4851, 34145,40826,23983,9847, 38755,18067,22122, 38389,11216,21510,25397,16499,38755,5558, 20591,5436, 18546,10572,5802, 37186,25134,35953,21345,40826,35462,19861,36936,11422,1297, 13939,32856,37104,40826,36760, - 32856,38755,16169,29966,6996, 27783,35684,26382,33089,31141,35974,39019,19937,3109, 7807, 40825,35952,35952,1213, 13064,43713,34144,38754,33096,38754,24002,2217, + 32856,38755,16169,29966,6996, 27783,35684,26382,33089,31141,35974,39019,19937,3109, 7807, 40825,35952,35952,1213, 13064,43713,34144,38754,33096,38754,24002,2217, 43712,31140,11021,38754,221, 34955,43712,43712,32856,6979, 14630,1240, 29363,6669, 5174, 35952,33453,18066,4322, 1713, 9345, 3701, 34800,43712,40825,7618, 29043, - 32856,20590,32855,17489,29362,16151,40825,40825,33453,37186,799, 40824,819, 40824,37185,43711,17479,40824,29361,6726, 2336, 10892,37090,34955,43711,17008,3006, + 32856,20590,32855,17489,29362,16151,40825,40825,33453,37186,799, 40824,819, 40824,37185,43711,17479,40824,29361,6726, 2336, 10892,37090,34955,43711,17008,3006, 40824,35952,12846,6865, 27782,5622, 12103,26381,26390,40823,26384,9270, 40823,3682, 39243,9902, 32855,5173, 5499, 31139,40823,1096, 15891,15343,43711,37572,38754, 34955,40823,38753,24064,1390, 43711,5468, 5477, 31349,15784,10673,35951,14590,449, 1445, 2417, 1784, 26380,20970,14023,1238, 27781,33307,34987,33452,7667, 34144, 5778, 134, 27780,2725, 38753,35049,37185,3276, 35855,43710,23982,38753,26379,38753,25133,40822,8387, 14270,12280,15342,19860,36061,1528, 27932,15739,35951,30361, @@ -13837,20 +13832,20 @@ static const unsigned short Ranks[197839] = 15305,21632,21462,23530,24829,25911,22879,18443,17478,22974,10850,9520, 3363, 43705,32854,6785, 17243,29355,3557, 12642,3946, 35950,20328,36541,15341,552, 25042, 14520,19858,43705,24, 12278,35950,34062,21403,32854,34953,27566,36101,35949,31136,1908, 6867, 37183,1295, 13522,35779,13521,35160,8359, 25129,8557, 12455,12337, 38749,43705,40819,36073,10035,13100,18498,37182,19908,17596,43705,38749,31466,16148,34141,5322, 27778,87, 32854,14519,34464,36012,37182,14969,38540,37182,35949, - 34953,32853,35949,4322, 37182,37181,961, 21890,35949,43704,43704,37181,15737,32680,8882, 13063,34953,230, 10846,29214,18238,17477,21344,32804,24445,3346, 5499, + 34953,32853,35949,4322, 37182,37181,961, 21890,35949,43704,43704,37181,15737,32680,8882, 13063,34953,230, 10846,29214,18238,17477,21344,32804,24445,3346, 5499, 10785,2200, 16577,992, 5398, 889, 19086,32976,13062,38749,38176,16576,31135,36217,2523, 12641,6864, 18544,27086,14413,3657, 25000,30574,246, 1840, 19857,43704, 6854, 43704,40818,40818,9698, 14269,14645,2325, 13474,17536,19907,19264,22377,30551,9184, 35948,1613, 33049,13061,18543,1381, 13660,9237, 10849,40818,19656,33109, - 13491,14268,37181,40818,34953,20587,978, 10402,27783,28905,38748,35080,29744,7363, 38748,32853,40817,35948,32938,43703,40817,38020,27777,15144,35138,3980, 458, + 13491,14268,37181,40818,34953,20587,978, 10402,27783,28905,38748,35080,29744,7363, 38748,32853,40817,35948,32938,43703,40817,38020,27777,15144,35138,3980, 458, 43703,33451,36674,4723, 5571, 43703,35040,39316,9183, 1189, 11597,33180,3362, 37181,38187,34952,12101,30457,12844,34141,37180,35948,35948,35947,40817,40817,39318, 1894, 40816,43703,2815, 31712,21402,26031,11614,5604, 43702,22973,38748,5540, 13112,18542,34955,38748,5331, 21401,21218,29354,10841,25172,14353,32978,22647,43702, 19864,14282,28441,31223,18541,28865,11, 21490,16031,40816,19906,35947,43702,13099,3331, 12843,26373,5696, 40816,33001,29953,22308,40816,28513,11684,280, 32779, 34891,7974, 18635,6247, 818, 6248, 14968,15736,28634,5330, 20586,6668, 23219,38747,25128,35947,29978,8533, 4675, 27776,17476,18063,43702,34141,38747,43701,37180, 38747,26372,18357,15340,38747,5470, 1444, 40815,38746,33451,34952,23525,40815,4175, 10102,15228,11474,27625,17704,24446,38746,9220, 33451,23978,237, 14292,43701, - 34952,9094, 26843,43701,25127,1039, 2673, 14628,34952,43701,14627,253, 18326,5252, 40815,33091,8251, 13060,18617,37180,40815,13452,9049, 33859,1395, 24086,9932, + 34952,9094, 26843,43701,25127,1039, 2673, 14628,34952,43701,14627,253, 18326,5252, 40815,33091,8251, 13060,18617,37180,40815,13452,9049, 33859,1395, 24086,9932, 43700,35947,30809,25045,37216,7997, 19905,27305,34951,26371,40814,14674,34034,2906, 9862, 11792,43700,7087, 4185, 812, 9011, 39245,37572,38729,35423,33165,33959, 34472,25027,19946,28963,27958,21531,19840,15285,5249, 29251,18802,8700, 23624,17909,11071,30269,15519,16663,38746,33450,28274,38890,1333, 13746,14626,33450,38746, - 43700,20682,24351,38438,12912,1831, 28499,38745,10674,40814,3903, 11056,27775,37029,38306,40814,43700,26370,40814,17006,40813,7281, 33084,35759,38745,27774,2152, - 26476,27773,25126,11055,34141,21400,7623, 34951,43699,10848,38745,10488,43699,29353,5081, 37180,21399,10847,21027,14668,38745,21186,43699,25342,33450,38744,1489, + 43700,20682,24351,38438,12912,1831, 28499,38745,10674,40814,3903, 11056,27775,37029,38306,40814,43700,26370,40814,17006,40813,7281, 33084,35759,38745,27774,2152, + 26476,27773,25126,11055,34141,21400,7623, 34951,43699,10848,38745,10488,43699,29353,5081, 37180,21399,10847,21027,14668,38745,21186,43699,25342,33450,38744,1489, 26414,16888,33111,17485,1686, 34242,7866, 8131, 43699,43698,1763, 13426,34398,25773,9001, 19347,32853,5712, 21173,37410,24516,13220,40813,34294,8027, 37179,38744, 3151, 34140,37179,13213,34671,2112, 8296, 38269,43698,32853,33450,37179,695, 32852,32852,35946,29899,32958,10790,24775,4154, 6691, 40813,37308,23977,30764,35946, 20395,18988,37366,40813,31134,34140,32852,35112,21343,34951,43698,21342,6592, 35717,6736, 33016,26189,17480,21398,23280,10339,38873,33449,11562,10628,20510,33449, @@ -13865,7 +13860,7 @@ static const unsigned short Ranks[197839] = 530, 10414,1489, 33448,18189,40809,34785,27724,35178,33527,35946,43694,12842,40809,23923,43694,40808,7208, 15091,43694,31611,43693,976, 3640, 15141,40808,35566, 36624,4016, 29279,25719,34748,35019,38038,3788, 37176,10044,32693,7883, 30517,40808,8756, 8141, 34494,30165,43693,11054,43693,34961,32851,26366,16575,27777,21395, 8759, 38796,35780,2959, 37164,29348,34670,26491,13323,27927,14967,43693,21804,21155,18062,37846,43692,16572,20583,34139,40808,38742,14719,34498,25124,43692,37176, - 33263,35034,10434,18999,4896, 37176,14966,6833, 3781, 18178,7430, 6140, 5962, 9327, 16395,35843,7030, 34139,4973, 34139,40807,43692,18954,21394,31132,4989, 5171, + 33263,35034,10434,18999,4896, 37176,14966,6833, 3781, 18178,7430, 6140, 5962, 9327, 16395,35843,7030, 34139,4973, 34139,40807,43692,18954,21394,31132,4989, 5171, 38742,31131,37117,34237,20582,26365,749, 12594,43692,15735,35945,40807,40807,245, 17475,9900, 37399,386, 15045,27448,24935,31182,7246, 9080, 37176,35945,36870, 2513, 12326,20581,38742,38539,43691,36642,22120,11018,37716,36455,12593,6350, 8527, 19855,2986, 28324,38742,37175,9626, 519, 6566, 18910,5523, 24177,4525, 34142, 16435,12260,10878,35981,31856,34949,29347,2286, 37175,14922,35945,29442,18061,16362,1657, 32778,25894,19238,31130,1382, 14819,318, 28217,12547,26631,37672,25359, @@ -13873,24 +13868,24 @@ static const unsigned short Ranks[197839] = 17474,31128,18633,34948,43691,38741,34948,33448,22971,2724, 121, 26990,19978,24667,38741,40806,3860, 40806,40806,16146,544, 34947,40806,6667, 13351,33663,19406, 18535,35945,37175,43691,15337,18534,2032, 16574,37935,12130,115, 29346,29345,17004,23973,5434, 32851,3369, 26364,43690,3027, 29344,8814, 21340,10846,21339,43690, 15752,13938,33447,31127,639, 31609,14624,31126,22970,40805,24329,37203,29991,11435,43690,40805,7362, 36849,4867, 34947,511, 39120,31125,18897,24012,35992,37564, - 4378, 6591, 21173,34139,22969,4507, 38102,10371,40805,34947,7750, 31124,34645,7987, 19854,19902,1373, 686, 37175,11405,34969,3672, 25217,15781,34432,588, 5360, + 4378, 6591, 21173,34139,22969,4507, 38102,10371,40805,34947,7750, 31124,34645,7987, 19854,19902,1373, 686, 37175,11405,34969,3672, 25217,15781,34432,588, 5360, 10109,21338,38741,8385, 5480, 35004,38258,8532, 21337,35022,38740,38740,38740,19901,43690,38154,32851,43689,43689,33024,25764,28182,13057,6623, 36746,38935,34717, 36807,35623,40805,43689,24171,38582,14518,35944,37174,38740,40804,39000,14796,36287,32380,7141, 34594,29099,29270,40804,14456,37231,33447,18828,40804,38739,34138, - 43689,43688,10240,31123,43688,43688,43688,32851,1466, 36476,21336,9518, 38739,34947,16305,5511, 150, 5676, 30728,19805,33329,18902,12523,28813,24447,35758,6246, - 38739,34946,6450, 32368,19307,7065, 43687,23972,37054,10341,17473,4466, 35966,33679,620, 40804,34138,34628,38739,38738,17552,22524,32947,40803,31824,14950,4054, + 43689,43688,10240,31123,43688,43688,43688,32851,1466, 36476,21336,9518, 38739,34947,16305,5511, 150, 5676, 30728,19805,33329,18902,12523,28813,24447,35758,6246, + 38739,34946,6450, 32368,19307,7065, 43687,23972,37054,10341,17473,4466, 35966,33679,620, 40804,34138,34628,38739,38738,17552,22524,32947,40803,31824,14950,4054, 19853,27770,32850,6863, 40803,34138,8409, 38404,3406, 23339,106, 7033, 18941,10120,17056,4886, 10136,16777,28471,35944,35944,17484,37174,3700, 5458, 25294,43687, 21335,16224,35944,40803,2727, 4673, 33639,33447,4629, 8446, 31479,32692,13098,15686,21334,13179,9687, 43687,5502, 1507, 8433, 10671,43687,20580,35180,36543,35704, 37174,13056,33262,4853, 189, 6642, 27769,1641, 7265, 25067,35578,17505,37849,40803,1980, 40802,11667,3523, 37554,24806,36591,1652, 8510, 1853, 3229, 13520,40802, 4869, 13308,1011, 13134,8121, 32813,40802,2192, 28353,36173,38738,35794,34906,4855, 6452, 238, 26550,3296, 21985,32095,24197,32406,36608,5104, 15886,34946,37769, - 34946,38738,34138,1721, 34946,43686,2913, 5674, 3681, 29399,9949, 964, 25775,463, 16005,22119,34946,16482,29002,8646, 33447,43686,19237,8082, 38738,23796,8295, - 40802,40801,35760,8526, 32260,34945,12841,43686,27768,26746,32546,2230, 22968,3452, 26883,34773,12164,13519,43686,26855,34137,8927, 19887,786, 20411,8985, 7222, + 34946,38738,34138,1721, 34946,43686,2913, 5674, 3681, 29399,9949, 964, 25775,463, 16005,22119,34946,16482,29002,8646, 33447,43686,19237,8082, 38738,23796,8295, + 40802,40801,35760,8526, 32260,34945,12841,43686,27768,26746,32546,2230, 22968,3452, 26883,34773,12164,13519,43686,26855,34137,8927, 19887,786, 20411,8985, 7222, 35893,43685,43685,503, 5662, 12871,18970,6432, 2483, 40801,35943,10845,23971,12592,16145,13330,25819,26033,36731,35943,19037,15336,40801,33446,44, 30467,35955, 35725,22953,34754,40801,36189,37174,21333,19556,7752, 27767,37173,34945,19718,15530,7611, 3131, 26662,9182, 31122,37351,35415,16144,8384, 36749,10974,18671,26546, 34137,26363,18533,36163,24683,3126, 7361, 36171,18632,34945,13937,38737,7530, 34959,37173,34137,43685,36865,40800,542, 29343,21332,35943,2647, 37318,10571,14851, 29342,818, 28729,38737,4321, 8069, 29604,36998,38737,20773,34302,17472,29534,32895,15140,15917,30035,28388,18316,28937,23970,38, 58, 13055,11746,21381,35363, 11548,10097,212, 5797, 25649,23206,32858,37232,7882, 23079,470, 5744, 11421,39276,7233, 3368, 43685,34574,1432, 22548,27232,8858, 1873, 38500,40800,6091, 38737, 27248,40800,21393,25931,17513,38895,21397,28810,31521,39087,17471,28297,34772,38448,34161,38736,6550, 8984, 14020,43684,13097,17217,36072,38736,24135,4904, 18213, - 38371,15466,1580, 2572, 5397, 31460,37299,5535, 18532,2805, 32850,10570,11612,790, 32976,19747,9180, 9899, 27766,34945,26362,28976,36899,34944,33648,22118,2083, + 38371,15466,1580, 2572, 5397, 31460,37299,5535, 18532,2805, 32850,10570,11612,790, 32976,19747,9180, 9899, 27766,34945,26362,28976,36899,34944,33648,22118,2083, 32883,16807,33702,334, 1635, 20579,21392,33446,14990,35228,1397, 6590, 40800,29341,38736,1217, 22967,353, 5859, 1072, 33609,6272, 1053, 1546, 37929,21860,21377, 36966,19852,18224,2007, 15780,6713, 33446,1634, 34137,2038, 31550,21299,6995, 17470,36989,7792, 1833, 17469,14019,15139,40799,24538,36396,43684,28354,12640,40799, 3758, 36615,543, 4373, 13001,12076,32880,5612, 16253,12544,19779,2434, 30946,30796,1730, 7800, 4051, 23969,22117,33446,38763,34944,11798,38736,43684,43684,33445, @@ -13918,11 +13913,11 @@ static const unsigned short Ranks[197839] = 10107,38982,34942,14516,37168,14515,43676,3246, 16814,35564,37168,40793,36727,23965,35599,32847,17002,40793,4008, 35061,14018,38731,3655, 43675,9746, 39230,27763, 5433, 40792,35854,38723,11627,34107,14218,16570,11364,23944,17479,14212,14164,2031, 33324,33443,17001,8958, 21558,27476,19503,2206, 37168,10843,40792,21328,29824, 12091,21327,27256,15180,34379,32866,37736,35722,19213,38426,12276,21388,38405,8813, 25586,27023,32833,34134,17478,37167,37167,8249, 18703,24870,32800,31116,32847, - 21326,37167,27664,35213,21570,38033,18528,12094,32128,43675,748, 37167,25376,21325,33443,26357,38057,40792,5908, 16569,43675,43675,31115,11626,34942,15732,2984, + 21326,37167,27664,35213,21570,38033,18528,12094,32128,43675,748, 37167,25376,21325,33443,26357,38057,40792,5908, 16569,43675,43675,31115,11626,34942,15732,2984, 29337,34190,677, 43674,3599, 38731,35937,36738,37384,35147,38731,4167, 35840,13653,3506, 13054,38391,33859,13095,33442,6524, 633, 25951,7704, 38730,21568,40792, 3172, 43674,33442,31085,38243,43674,12275,21387,7341, 14017,39294,24781,33587,32278,8283, 43674,37781,29475,37166,32847,19231,1700, 9482, 43673,37166,38730,34941, 32846,7703, 31114,3265, 21217,1123, 10314,26072,38941,34133,35034,1782, 34133,162, 6266, 34941,5279, 1378, 19848,118, 3782, 7986, 615, 1871, 14016,16585,35895, - 33550,38730,4207, 19847,12274,23160,37166,27762,1033, 37690,34900,24665,874, 13053,19846,7061, 22262,37166,34941,14223,20304,510, 37165,27761,40791,8524, 4849, + 33550,38730,4207, 19847,12274,23160,37166,27762,1033, 37690,34900,24665,874, 13053,19846,7061, 22262,37166,34941,14223,20304,510, 37165,27761,40791,8524, 4849, 20578,2339, 17858,11169,31113,998, 33866,33442,23964,43673,25971,2357, 21142,20584,7340, 33602,13490,33179,15488,31842,13094,34133,26123,1154, 34133,35937,40791, 43673,1938, 26356,32150,37411,9898, 38714,35937,43673,43672,5885, 17104,1619, 1445, 16019,38939,13330,1832, 38730,14266,35937,9897, 13651,29565,10294,40791,33442, 2570, 38767,28783,888, 43672,3170, 14015,19899,43672,17465,14014,32846,40791,47, 200, 11903,16271,22303,19439,33441,33441,40790,31481,38557,12840,9745, 34648, @@ -13932,13 +13927,13 @@ static const unsigned short Ranks[197839] = 16739,6424, 11214,1119, 606, 3522, 2406, 31127,1134, 15707,22681,38728,755, 43671,594, 111, 32009,8751, 32727,38728,25115,11179,3924, 38808,1189, 22964,43671, 40790,29334,33441,39310,40790,3169, 666, 31404,34132,34147,5325, 38728,2599, 1748, 25114,12335,16143,36716,37443,3831, 35936,2756, 43670,11331,33441,35936,36304, 21005,35936,11221,19155,15778,21721,20342,13935,40789,3953, 31947,39270,8636, 6862, 22114,1899, 31111,12591,822, 38599,31110,21386,37695,43670,40789,32846,10195, - 36881,35760,4115, 36673,20537,33036,34674,33933,18527,18080,11678,19230,43670,43670,22561,35428,34940,33440,17477,39110,16568,3312, 19845,33440,18, 9022, 2827, + 36881,35760,4115, 36673,20537,33036,34674,33933,18527,18080,11678,19230,43670,43670,22561,35428,34940,33440,17477,39110,16568,3312, 19845,33440,18, 9022, 2827, 14622,1782, 13638,270, 19027,1506, 21385,35935,37165,2863, 31617,398, 22875,14414,244, 19381,34184,14013,12938,39325,34647,35966,3756, 31954,21384,10190,10783, - 26906,42, 14601,2279, 1826, 38480,1515, 34558,10842,43669,32845,40789,35935,43669,29290,37163,33855,35935,4503, 12638,8531, 35664,34940,37165,29333,43669,3168, + 26906,42, 14601,2279, 1826, 38480,1515, 34558,10842,43669,32845,40789,35935,43669,29290,37163,33855,35935,4503, 12638,8531, 35664,34940,37165,29333,43669,3168, 29332,10177,15777,37164,26090,33384,13730,17957,9180, 3291, 6916, 36933,40789,43669,33101,4499, 178, 11330,8983, 25113,14012,4213, 1563, 25340,19844,12637,10727, 23869,34940,38727,12098,34132,7973, 16567,12273,36673,39257,191, 18059,34940,33274,34492,21490,25112,43668,34939,19229,40788,20577,29331,43668,2190, 38727,40788, 15335,43668,1704, 4502, 37164,43668,43667,38727,4745, 37164,17549,38727,21383,34939,25233,20576,8755, 31109,38726,18058,4243, 43667,7449, 4594, 33876,2309, 31616, - 14534,8635, 27759,5324, 34518,32845,40788,35935,40788,15776,1761, 35934,3598, 6814, 10336,33139,9896, 25361,3837, 43667,129, 15133,836, 34939,1632, 11419,3862, + 14534,8635, 27759,5324, 34518,32845,40788,35935,40788,15776,1761, 35934,3598, 6814, 10336,33139,9896, 25361,3837, 43667,129, 15133,836, 34939,1632, 11419,3862, 2738, 31108,4409, 23963,43667,37164,34905,588, 34132,38726,1904, 34131,35934,3379, 26354,31107,37163,20575,32845,32845,8068, 33238,23962,43666,893, 166, 16780, 37873,8857, 31764,31106,1300, 26105,32844,5359, 40787,37992,13092,19897,15334,27758,43666,37163,5926, 5293, 994, 12636,1171, 1036, 32977,43666,25111,34131,34131, 33170,37163,43666,419, 20401,31266,12334,6913, 9895, 14964,35934,3699, 3238, 14529,26417,5602, 36646,24624,43665,10867,12635,11418,34131,7339, 27757,18440,33440, @@ -13948,13 +13943,13 @@ static const unsigned short Ranks[197839] = 709, 12272,19842,43664,26353,40787,34130,13586,6853, 8800, 9498, 28810,16999,9219, 35933,429, 36553,43664,1492, 3605, 977, 43664,5951, 10620,7105, 36526,43664, 33439,34938,34130,22962,35933,16569,13091,9894, 43663,19228,29626,11417,43663,40786,21323,43663,37162,25636,38183,43663,35932,40786,32844,877, 33439,2766, 40786, 43662,43662,5366, 4377, 43662,37162,40786,3056, 40785,34130,21322,8523, 40785,16568,7985, 38726,38726,38725,23773,2773, 35714,11093,32893,20855,36926,43662,35932, - 40785,7880, 35932,21201,38725,23959,295, 19227,32844,18057,35741,21380,21032,31628,43661,10841,38725,43661,17464,43661,43661,25860,18676,19652,25109,1092, 770, + 40785,7880, 35932,21201,38725,23959,295, 19227,32844,18057,35741,21380,21032,31628,43661,10841,38725,43661,17464,43661,43661,25860,18676,19652,25109,1092, 770, 37162,246, 1976, 31359,12874,14098,18096,26276,8627, 19029,38358,43660,814, 21862,16877,34129,27753,33309,34938,6766, 17565,18629,34129,34254,40785,7445, 18525, - 5904, 7338, 38685,14963,10106,35932,9091, 4534, 40784,5479, 5104, 5729, 32844,31104,40784,15333,35721,5925, 7448, 43660,2128, 43660,34938,2209, 43660,37162,9588, + 5904, 7338, 38685,14963,10106,35932,9091, 4534, 40784,5479, 5104, 5729, 32844,31104,40784,15333,35721,5925, 7448, 43660,2128, 43660,34938,2209, 43660,37162,9588, 3521, 23958,31554,9326, 13514,40784,806, 7751, 5587, 25792,40784,27408,21379,35931,21047,40783,4184, 10340,3536, 25631,13090,40783,33439,40783,13652,17476,38725, 40783,2083, 43659,7551, 34129,37161,34938,43659,26740,7933, 179, 4520, 15936,28028,32849,16399,18826,19896,35931,13089,32843,9460, 39298,3282, 36671,32843,43659, - 2141, 5036, 5251, 40782,35747,4734, 264, 38724,13651,34129,31103,16567,43659,29330,29329,43658,43658,33438,25265,31102,3057, 12973,40782,29643,43658,34622,8294, - 26352,3938, 12839,43658,40782,15731,31101,38724,40782,25108,6177, 21321,32843,5781, 14263,40781,22112,3755, 33017,3311, 22928,35880,40781,37161,1262, 22475,385, + 2141, 5036, 5251, 40782,35747,4734, 264, 38724,13651,34129,31103,16567,43659,29330,29329,43658,43658,33438,25265,31102,3057, 12973,40782,29643,43658,34622,8294, + 26352,3938, 12839,43658,40782,15731,31101,38724,40782,25108,6177, 21321,32843,5781, 14263,40781,22112,3755, 33017,3311, 22928,35880,40781,37161,1262, 22475,385, 7951, 25283,40781,21320,19895,16801,19013,18524,39288,43657,29279,19841,36915,26291,38724,7360, 8676, 40781,38724,32843,31100,34799,10189,3056, 21319,34128,37888, 3310, 832, 32209,15332,43657,34128,32996,19226,12097,34128,43657,34121,796, 22111,31099,43657,7972, 6978, 11787,26601,5134, 2872, 35931,14362,43656,38723,14011, 38638,22606,34937,39222,34149,32842,3598, 2002, 43656,35931,33816,35930,8634, 40780,8408, 8633, 38723,31098,38863,31097,32842,38466,34084,33424,18188,40780,34128, @@ -13964,16 +13959,16 @@ static const unsigned short Ranks[197839] = 9103, 2830, 6914, 34825,2861, 7346, 33235,43654,43654,36420,40779,34127,2892, 18522,838, 19363,2544, 16819,37161,35540,31458,21378,34797,11053,43653,32842,35929, 5542, 33588,37160,38722,3517, 37160,19788,33926,34937,8982, 19893,9856, 698, 37547,37160,37160,43653,4697, 27088,18521,11329,4391, 15734,10781,16565,6169, 34319, 37662,13807,37884,34610,16940,16415,6134, 13008,9059, 21319,14902,10532,36314,22610,34496,28194,37342,34374,32842,36520,25105,43653,12076,29328,40779,22961,12837, - 27752,14514,22041,27418,37159,17368,11935,2569, 7162, 29726,8886, 38280,37899,8985, 18251,33359,21656,31914,23892,557, 29403,715, 5530, 17713,3660, 13052,2221, + 27752,14514,22041,27418,37159,17368,11935,2569, 7162, 29726,8886, 38280,37899,8985, 18251,33359,21656,31914,23892,557, 29403,715, 5530, 17713,3660, 13052,2221, 8177, 28461,7421, 33567,13465,28027,40778,7337, 8257, 1038, 17726,4135, 36933,36000,12948,37940,38863,39359,34855,31136,16911,11934,2230, 36373,39236,15931,16196, 19565,6930, 32408,32717,1339, 37159,40778,32922,43653,24745,31141,6665, 11052,5358, 7252, 13836,2432, 19840,4374, 38722,19411,10984,13584,10618,21377,1210, 31519, - 22318,6675, 815, 10065,33540,7237, 34205,12271,21355,35665,21454,1166, 16796,34412,13051,17463,20868,5292, 33415,1481, 35032,10811,40778,38448,17475,1666, 3754, - 46, 34937,3055, 43652,40778,34937,3520, 13513,34838,33839,2349, 1795, 1344, 621, 11453,37996,38659,599, 5274, 17773,3606, 25658,16555,1089, 875, 163, 9934, + 22318,6675, 815, 10065,33540,7237, 34205,12271,21355,35665,21454,1166, 16796,34412,13051,17463,20868,5292, 33415,1481, 35032,10811,40778,38448,17475,1666, 3754, + 46, 34937,3055, 43652,40778,34937,3520, 13513,34838,33839,2349, 1795, 1344, 621, 11453,37996,38659,599, 5274, 17773,3606, 25658,16555,1089, 875, 163, 9934, 40777,37910,43652,1319, 33438,19831,29327,15079,30637,18370,35106,18056,4093, 6791, 10538,37159,2032, 30106,15475,27751,5541, 2693, 28169,35532,12332,38722,31095, 18482,4781, 38721,36191,40777,34936,37159,3753, 29506,1011, 40777,32911,3494, 38721,1299, 15579,32382,25967,16558,12270,16688,28728,15134,10034,43652,40777,20573, - 37158,28987,35380,32841,9101, 32471,38721,34936,19839,43652,2440, 35926,33538,37076,19892,34755,34849,38721,40776,16258,43651,28588,34936,38927,14912,39287,4197, + 37158,28987,35380,32841,9101, 32471,38721,34936,19839,43652,2440, 35926,33538,37076,19892,34755,34849,38721,40776,16258,43651,28588,34936,38927,14912,39287,4197, 40776,17474,21262,6913, 28224,5983, 43651,15047,5942, 17319,11762,36786,37158,7528, 34344,1253, 10033,3367, 33288,29326,25104,10669,40776,16998,35929,18055,40776, - 43651,27750,591, 21318,13650,8984, 19838,7527, 7063, 13050,37158,16142,43651,14750,9771, 17269,36308,17501,17213,13649,268, 735, 1576, 8160, 33515,2183, 1657, + 43651,27750,591, 21318,13650,8984, 19838,7527, 7063, 13050,37158,16142,43651,14750,9771, 17269,36308,17501,17213,13649,268, 735, 1576, 8160, 33515,2183, 1657, 35929,18687,19837,40775,6307, 29325,43650,38720,43650,4030, 28258,14010,16852,19124,4247, 14009,35940,32671,26593,19836,43650,34936,25103,40775,40775,18520,37158, 35764,35523,43650,23954,995, 16997,20572,34127,9345, 26995,38720,10486,33099,33438,26298,8632, 20162,1917, 36534,21067,29324,12615,10188,34935,2066, 37157,38907, 27749,37157,1777, 1828, 16564,36255,7550, 34935,34090,2392, 14728,19835,38844,6244, 8983, 37157,40775,35929,9090, 16141,6852, 30333,13924,34811,28532,4328, 31094, @@ -13981,10 +13976,10 @@ static const unsigned short Ranks[197839] = 6191, 36742,40774,22959,7447, 23953,20571,35928,28351,25899,18627,37156,38720,27747,38471,32841,7576, 14621,38921,20570,37915,3679, 19156,7446, 4519, 13512,37156, 21376,34126,30641,38720,12096,15656,35657,11016,43649,40774,4161, 18054,38719,43649,40773,29323,36007,26351,37155,43649,6962, 19514,7611, 22445,22112,27088,16242, 4852, 13361,32897,22444,7623, 32853,26581,12994,28443,23626,28744,26277,26786,9195, 18994,2660, 31176,22165,23774,8307, 5925, 4090, 20201,20404,32869,35560,19257, - 2135, 18859,24517,19226,35769,1933, 33053,11902,7585, 22547,28852,13775,37654,19833,33536,24663,31428,35866,38083,34579,11768,31384,20392,35420,21060,33019,7984, + 2135, 18859,24517,19226,35769,1933, 33053,11902,7585, 22547,28852,13775,37654,19833,33536,24663,31428,35866,38083,34579,11768,31384,20392,35420,21060,33019,7984, 17858,35928,31493,22285,18521,30133,13006,19148,31362,31090,37673,2573, 37102,5061, 3587, 27500,11165,28916,1140, 21739,28505,13076,35071,12735,37482,35498,19335, - 14265,43648,38719,4956, 4071, 2432, 8660, 36350,8121, 10566,16073,43648,17272,4558, 38241,8648, 25123,19224,34031,38719,23952,34935,37155,37155,23951,11050,426, - 16996,12331,28433,38719,202, 31540,2178, 576, 17975,311, 26563,34708,37155,3378, 1654, 8793, 37154,40773,37321,20569,4228, 33101,5522, 34495,37660,14939,6817, + 14265,43648,38719,4956, 4071, 2432, 8660, 36350,8121, 10566,16073,43648,17272,4558, 38241,8648, 25123,19224,34031,38719,23952,34935,37155,37155,23951,11050,426, + 16996,12331,28433,38719,202, 31540,2178, 576, 17975,311, 26563,34708,37155,3378, 1654, 8793, 37154,40773,37321,20569,4228, 33101,5522, 34495,37660,14939,6817, 5129, 40773,34935,35928,5323, 38718,22937,31093,346, 979, 34126,19832,14513,16317,36848,38718,17473,38718,31664,33190,33438,43648,37154,18880,17725,31789,28880, 2986, 9375, 39370,20797,4134, 25102,39014,38489,38589,43648,32841,9089, 39031,4070, 31227,28612,31759,34982,22677,1181, 1968, 7703, 2111, 2121, 4110, 11328,33473, 22082,4333, 3272, 15952,25101,2323, 14620,38718,2706, 8383, 13921,3116, 493, 20504,12592,6821, 34926,10337,2006, 1032, 27746,40773,29322,361, 33913,12634,14008, @@ -14005,35 +14000,35 @@ static const unsigned short Ranks[197839] = 32920,12095,10411,16922,907, 27993,23733,17207,24668,35079,35925,10339,34250,34125,36989,34125,35925,22981,34125,34290,33864,21767,6488, 28852,37646,26303,39082, 37151,35835,19701,15329,39406,40767,4768, 28886,33812,5933, 30226,18032,33436,8531, 43642,9354, 36358,28153,16163,32400,10825,27382,9535, 21795,19001,2743, 20446, 7125, 28911,16583,34559,6256, 14115,14034,11946,17213,28704,16841,2989, 29330,34342,24367,32124,27415,21339,19606,31752,29908,12654,3053, 14887,32897,38714,35925, - 40766,40766,39323,34934,16687,21316,36915,6663, 43642,40766,38006,35131,39062,9727, 36643,12836,16424,34705,22513,38640,17470,6010, 21538,22797,15328,14418,1598, + 40766,40766,39323,34934,16687,21316,36915,6663, 43642,40766,38006,35131,39062,9727, 36643,12836,16424,34705,22513,38640,17470,6010, 21538,22797,15328,14418,1598, 35925,118, 32775,38713,12094,19222,20565,30483,40766,35924,26348,28764,34124,43642,34934,37081,18823,38713,43642,18515,6977, 669, 3518, 43641,32788,33436,21368, 5884, 34124,34792,2771, 9217, 4674, 12633,29320,24426,33270,27958,10187,21315,43641,28971,15730,15305,21367,7564, 33436,17136,21053,3173, 9624, 43641,26255,35924, - 43641,38284,12351,1551, 35714,4832, 37151,27191,39099,4019, 2490, 14511,32905,1038, 4258, 11866,13087,20709,24517,35379,788, 10834,38426,12475,7569, 34366,2727, + 43641,38284,12351,1551, 35714,4832, 37151,27191,39099,4019, 2490, 14511,32905,1038, 4258, 11866,13087,20709,24517,35379,788, 10834,38426,12475,7569, 34366,2727, 15181,43640,15774,4631, 40765,18625,21215,34106,38713,43640,16562,15777,40765,36388,40765,13951,38698,37236,17869,16561,33522,38026,32297,34716,21799,39205,43640, 38260,39292,38139,21203,33749,35948,31978,38713,17308,34381,38757,40765,35924,17460,34724,37151,8293, 34124,33825,38757,15937,23945,31091,27745,43640,4003, 13510, 36445,18514,11014,38712,19599,38712,40764,37150,37150,38712,29319,4874, 1298, 3095, 4513, 11265,2747, 4065, 40764,18052,36305,3198, 39387,27446,34432,32870,18051, - 43639,21131,23890,11543,34124,37006,10294,32823,33264,33098,35162,1559, 12378,36452,27580,937, 9344, 37317,43639,2781, 16560,261, 26422,32036,43639,5601, 6088, + 43639,21131,23890,11543,34124,37006,10294,32823,33264,33098,35162,1559, 12378,36452,27580,937, 9344, 37317,43639,2781, 16560,261, 26422,32036,43639,5601, 6088, 32840,25097,3880, 33922,39031,35048,22487,21366,17433,13151,32926,43639,31066,36243,33989,15729,43638,35924,6790, 16559,9325, 12461,14619,37827,2502, 5076, 25827, - 19987,40764,9697, 1141, 9966, 43638,34809,38712,38711,15728,22057,464, 32854,9454, 20546,14934,1129, 288, 571, 10980,5322, 29318,16566,30126,35261,31090,1648, + 19987,40764,9697, 1141, 9966, 43638,34809,38712,38711,15728,22057,464, 32854,9454, 20546,14934,1129, 288, 571, 10980,5322, 29318,16566,30126,35261,31090,1648, 31835,35327,40764,663, 1575, 43638,34878,43638,26626,275, 8331, 37145,5664, 18097,2525, 14786,30904,22324,35923,10489,1256, 5844, 27039,43637,40763,16139,12107, 1355, 23814,8812, 21310,35712,32008,43637,12993,29246,292, 16558,37150,32949,21128,37039,713, 25957,38168,38641,27160,34977,43637,24866,34309,43637,37576,43636, 31281,36683,21636,1300, 26927,28260,3054, 2868, 766, 35923,598, 10363,39141,27414,19502,302, 39210,11135,26137,28610,487, 11816,30805,661, 25829,23500,18556, - 22711,29974,706, 28546,34991,19489,15132,1359, 7365, 16839,35605,39022,33413,27972,27744,40763,31089,36286,582, 23912,17459,10565,36547,12329,30744,38227,2177, - 38711,34123,8530, 36882,19828,43636,37150,18759,22617,7429, 1290, 28872,3377, 2405, 15141,1036, 2348, 1596, 29331,21365,43636,40763,43636,35772,36890,18590,7250, - 34933,34933,21662,11375,11609,33051,34981,3026, 43635,1359, 5156, 19603,38311,11819,8369, 33347,35555,6765, 2260, 26245,14726,7971, 32373,33985,14960,37149,1501, + 22711,29974,706, 28546,34991,19489,15132,1359, 7365, 16839,35605,39022,33413,27972,27744,40763,31089,36286,582, 23912,17459,10565,36547,12329,30744,38227,2177, + 38711,34123,8530, 36882,19828,43636,37150,18759,22617,7429, 1290, 28872,3377, 2405, 15141,1036, 2348, 1596, 29331,21365,43636,40763,43636,35772,36890,18590,7250, + 34933,34933,21662,11375,11609,33051,34981,3026, 43635,1359, 5156, 19603,38311,11819,8369, 33347,35555,6765, 2260, 26245,14726,7971, 32373,33985,14960,37149,1501, 16138,13445,34371,8142, 40763,8119, 6120, 19827,11933,9515, 18513,2794, 43635,5191, 23239,12629,38711,43635,38711,43635,40762,4242, 195, 33435,40762,32840,34933, - 35923,40762,43634,37376,37149,13509,9216, 37149,1044, 8381, 32357,24742,7970, 40762,34123,6172, 10105,20194,1621, 3062, 28068,8753, 10443,32763,3451, 9576, 417, + 35923,40762,43634,37376,37149,13509,9216, 37149,1044, 8381, 32357,24742,7970, 40762,34123,6172, 10105,20194,1621, 3062, 28068,8753, 10443,32763,3451, 9576, 417, 16975,26914,5940, 33491,38255,2692, 14221,2005, 8013, 22190,10150,2355, 13495,17144,660, 4002, 7249, 34198,15909,16991,38710,40761,26311,13934,7295, 35923,43634, 31088,8427, 22753,22109,34537,35416,8380, 15222,26997,39131,7969, 5250, 43634,43634,43633,789, 37212,1789, 1012, 12134,1394, 17922,937, 21364,3464, 29317,33435, - 34134,43633,15133,8983, 34141,15194,3167, 2431, 38123,5424, 8636, 1624, 1378, 24947,3308, 3830, 33802,5271, 37954,601, 31918,9794, 1111, 8406, 11932,33145,6215, + 34134,43633,15133,8983, 34141,15194,3167, 2431, 38123,5424, 8636, 1624, 1378, 24947,3308, 3830, 33802,5271, 37954,601, 31918,9794, 1111, 8406, 11932,33145,6215, 19794,15727,18272,1278, 9023, 33689,3604, 217, 16183,8, 29312,2338, 9121, 17502,31230,32190,32807,3307, 38328,29581,18362,3964, 14155,15726,43633,1746, 26783, - 27103,611, 2121, 45, 18371,625, 32466,7676, 5610, 9282, 14214,12432,12757,13097,16938,10779,15246,32549,28124,38179,9334, 1299, 28534,17517,1200, 34759,130, + 27103,611, 2121, 45, 18371,625, 32466,7676, 5610, 9282, 14214,12432,12757,13097,16938,10779,15246,32549,28124,38179,9334, 1299, 28534,17517,1200, 34759,130, 32868,24809,13259,15908,3603, 35922,2046, 27062,1428, 23592,3236, 1835, 3450, 779, 17379,1864, 12031,8982, 39311,15647,1523, 15131,4206, 37418,10840,18512,35922, - 35184,43633,34120,18511,36276,1760, 5062, 9481, 29316,35922,12632,19221,37149,22184,4630, 40761,43632,38710,736, 4197, 1848, 32937,4326, 15400,32403,24526,8353, + 35184,43633,34120,18511,36276,1760, 5062, 9481, 29316,35922,12632,19221,37149,22184,4630, 40761,43632,38710,736, 4197, 1848, 32937,4326, 15400,32403,24526,8353, 5883, 6025, 31649,11624,35922,16328,18510,1696, 36392,34552,34933,16684,38710,40761,40761,37924,885, 451, 4048, 14429,3191, 34932,2156, 27189,18969,9514, 10786, 3752, 13508,1705, 817, 37148,18509,37935,31990,23727,43632,14618,43632,40760,4780, 37148,36504,22028,3751, 4168, 40760,1915, 33435,43632,11048,6243, 31087,34123, 32839,37746,29554,35353,1190, 1573, 34123,40760,35921,4270, 34732,36755,34145,33193,28267,34752,23944,39007,24531,32135,8856, 6101, 23450,38710,38709,1401, 11865, - 15111,15168,43631,10564,34015,17866,37148,19525,8139, 10379,13049,33470,36070,34122,7336, 19826,15773,13725,34374,38709,43631,13086,18050,4722, 34751,30831,9324, + 15111,15168,43631,10564,34015,17866,37148,19525,8139, 10379,13049,33470,36070,34122,7336, 19826,15773,13725,34374,38709,43631,13086,18050,4722, 34751,30831,9324, 35677,34132,36099,2668, 38709,35921,13050,43631,19276,15775,33314,33642,38709,18624,43631,4501, 16704,43630,35921,40760,29031,775, 30305,16137,36671,16119,43630, 38708,29007,37148,6403, 34038,16557,18508,32244,33353,37147,35353,31086,18049,2404, 43630,43630,22108,8405, 3879, 182, 31085,40759,37818,8176, 1898, 25451,19891, 40759,27540,22472,1979, 34932,36783,35157,15000,13838,14945,37377,8045, 10839,19205,26347,37147,33965,37147,34932,1346, 14510,4866, 13048,15746,35254,38708,43629, @@ -14043,13 +14038,13 @@ static const unsigned short Ranks[197839] = 21558,3622, 4865, 5477, 6029, 2040, 6349, 7547, 67, 2696, 13924,21652,40759,37146,5435, 8379, 19625,7084, 19825,10485,29477,15462,23838,18507,10838,3723, 11124, 2242, 24068,18305,23942,12236,16591,9088, 34931,26346,23417,11132,25867,28682,1506, 43629,33048,43628,10104,43628,31084,33557,32839,35784,33320,19210,25096,33024, 31815,14610,37133,30404,38830,35499,37292,29314,37146,38707,37562,17103,35920,5408, 35920,28462,32789,20076,28115,11929,4640, 70, 15958,1369, 11598,24454,19828, - 26436,17159,22936,17280,16474,11063,943, 23870,1391, 31557,6566, 27743,19144,5476, 43628,1513, 10930,4521, 33858,18850,25725,6008, 8959, 2278, 13446,19861,5658, + 26436,17159,22936,17280,16474,11063,943, 23870,1391, 31557,6566, 27743,19144,5476, 43628,1513, 10930,4521, 33858,18850,25725,6008, 8959, 2278, 13446,19861,5658, 34037,37664,36490,35273,9571, 39054,30968,628, 33028,19890,43628,28135,24868,34458,15725,43627,4947, 34931,43627,26345,21314,43627,1963, 2065, 36870,27592,10886, 13648,9323, 4351, 18048,37912,38707,5321, 15130,38128,34779,43627,35476,23574,24244,35919,24571,4303, 26752,35569,10562,2794, 25682,22956,39037,40759,33050,38074, 14440,43626,3166, 35919,2867, 3449, 38707,36713,34931,35865,38707,491, 25095,25094,548, 38609,2958, 1574, 2307, 7161, 36079,34394,1491, 3448, 29313,32770,34122, - 43626,25093,40758,23941,40758,43626,32892,29408,29546,34433,14826,29312,33205,35919,28095,27742,40758,21771,513, 31685,26178,40758,37146,12385,37145,34931,1653, - 1609, 38706,4782, 40757,26344,403, 7889, 26768,36579,2458, 26655,24154,39413,39069,24762,13481,36085,35919,34767,37145,35374,43626,43625,27918,43625,2826, 59, - 18183,1463, 2347, 43625,7006, 22107,37145,32839,37145,23008,32838,34930,4439, 12332,33414,43625,32838,34122,35918,8631, 21313,43624,37144,8855, 9893, 19220,2597, + 43626,25093,40758,23941,40758,43626,32892,29408,29546,34433,14826,29312,33205,35919,28095,27742,40758,21771,513, 31685,26178,40758,37146,12385,37145,34931,1653, + 1609, 38706,4782, 40757,26344,403, 7889, 26768,36579,2458, 26655,24154,39413,39069,24762,13481,36085,35919,34767,37145,35374,43626,43625,27918,43625,2826, 59, + 18183,1463, 2347, 43625,7006, 22107,37145,32839,37145,23008,32838,34930,4439, 12332,33414,43625,32838,34122,35918,8631, 21313,43624,37144,8855, 9893, 19220,2597, 22502,21363,3629, 38706,5440, 35556,13047,13370,26576,16383,7526, 43624,30080,22277,1387, 43624,35918,7511, 16554,34930,156, 2099, 32846,11281,25966,19556,28941, 30544,7801, 29311,28988,11930,36516,2253, 9904, 29310,14509,9292, 13046,847, 33269,43624,37489,20541,19022,38706,32867,35418,29693,40757,3104, 32838,16794,10570, 4884, 37601,34122,31083,39218,18508,639, 17469,40757,40757,27741,30057,11864,33017,40756,43623,33434,27740,1700, 3387, 6119, 25881,29809,470, 27016,1958, 24846, @@ -14061,7 +14056,7 @@ static const unsigned short Ranks[197839] = 18107,14655,10218,105, 24656,2090, 22918,11486,32325,28696,9177, 15129,21360,2168, 10337,6687, 18047,9513, 21359,35175,1101, 12552,40755,2360, 8920, 23776,13647, 37143,26195,32811,38019,14354,32901,16029,21235,36196,7525, 30129,406, 7479, 29712,30692,24690,30041,25092,5371, 1007, 19277,29767,10143,37989,12419,36049,29542, 38675,3447, 29309,32107,15327,43621,34929,37143,14617,33328,35914,43621,21802,17458,43621,33239,14521,34589,18506,36511,14003,36985,28643,43620,37408,16353,10505, - 35971,38150,32212,19376,17037,43620,8178, 19824,35917,17650,34121,16565,32685,21311,23940,378, 35378,7639, 16410,27258,39271,911, 43620,1960, 15128,4166, 9506, + 35971,38150,32212,19376,17037,43620,8178, 19824,35917,17650,34121,16565,32685,21311,23940,378, 35378,7639, 16410,27258,39271,911, 43620,1960, 15128,4166, 9506, 15127,39184,18879,33434,199, 23488,26343,910, 34928,885, 2333, 22385,4076, 25002,34928,34928,34783,28885,38467,4717, 2845, 11317,43620,24044,37671,1765, 38186, 8528, 17468,14533,4159, 22939,34411,3906, 8118, 31081,23679,40754,9269, 7160, 19823,3999, 38704,27322,38660,40754,8854, 16076,39020,3330, 38704,36365,32838,12607, 28125,40754,23702,13045,43619,32837,33434,3318, 32131,35956,11045,34928,36122,6012, 10763,6690, 14508,14505,14002,13825,1465, 456, 8553, 12579,28367,32288,13069, @@ -14070,24 +14065,24 @@ static const unsigned short Ranks[197839] = 13085,40753,43618,43618,35917,31360,21172,43618,19889,1758, 32772,31761,38396,40753,28022,11537,21310,5320, 28487,4064, 19190,30700,43617,31320,6414, 33522,21958, 894, 8364, 36179,17935,12096,35479,16553,14507,11212,3403, 37143,2137, 19852,17748,24548,17841,24038,20885,1213, 35795,31454,17958,37142,35226,13944,33472,29915, 38703,43617,34121,43617,33424,16993,31080,32837,33073,36462,25646,13663,15075,8981, 33911,38958,21356,13507,21355,37142,43617,43616,11073,15771,21354,36357,35916, - 2335, 28785,14246,34836,25091,22954,38703,3535, 40753,43616,2846, 22953,9376, 26931,17467,37462,18253,37142,7248, 24102,20250,7638, 34301,35761,35575,33671,6261, + 2335, 28785,14246,34836,25091,22954,38703,3535, 40753,43616,2846, 22953,9376, 26931,17467,37462,18253,37142,7248, 24102,20250,7638, 34301,35761,35575,33671,6261, 22199,35521,24956,40752,10855,37142,37680,11415,33433,22952,43616,31475,36929,38956,15724,12835,35516,4007, 4091, 38703,43616,43615,17115,43615,25457,12628,10780, 2418, 25074,10032,32837,30566,40752,33433,27737,25438,34927,27736,18505,37141,40752,744, 3263, 18805,32181,28602,36727,6442, 30214,30173,33683,10522,36137,36787, 16552,19822,19082,26016,24337,43615,34927,38702,43615,18623,13084,31079,16136,1594, 36094,19888,2268, 40752,9362, 35916,29546,31607,4818, 14295,40751,10779,40751, 12644,14285,9621, 729, 1247, 9409, 4773, 18504,40751,11095,35259,23894,37347,43614,31702,38870,5062, 43614,39226,1279, 39356,497, 1633, 18046,40751,2466, 18503, 25144,8510, 30016,16564,27601,37141,33215,3347, 5475, 17457,15126,38094,4205, 34926,9903, 29308,9334, 37141,19756,9160, 6764, 36376,21309,37141,37140,28967,33326, - 18502,40750,27082,36720,35336,35816,32836,43614,36041,43614,38702,13043,14247,21353,14001,13476,39211,10031,34398,37576,37245,872, 18998,10929,36076,4576, 7062, + 18502,40750,27082,36720,35336,35816,32836,43614,36041,43614,38702,13043,14247,21353,14001,13476,39211,10031,34398,37576,37245,872, 18998,10929,36076,4576, 7062, 4071, 35483,19821,958, 17456,5225, 3287, 14000,2331, 13042,43613,3547, 34121,29323,4442, 605, 6277, 6994, 7865, 14946,10700,3985, 10103,24945,40750,35272,21352, 9623, 24886,36231,5330, 10869,38074,5193, 33105,7247, 9902, 38405,34106,8397, 7122, 17247,27180,37756,35021,7332, 4864, 37363,37054,28455,24240,18307,16887,30856, 37140,35638,37970,3026, 12968,33540,1442, 1227, 12935,30436,38728,36504,33015,29975,43613,2948, 22253,33135,13932,32918,38205,38283,6789, 37140,43613,35916,26342, 43613,38702,26341,29307,2468, 38231,43612,40750,7083, 13646,43612,40750,37140,18605,32787,43612,26340,8752, 37139,37139,37139,25090,38702,10334,28321,94, 16982, - 770, 23588,28928,15005,7675, 4727, 20707,30474,7740, 27717,15583,13733,18382,28929,23807,32328,19764,28558,26463,30858,15400,32898,31476,16026,28409,18505,8251, - 27510,2509, 21083,13506,25089,43612,15966,23062,23910,31860,21349,38701,17551,19108,35916,34926,38701,10320,4346, 38701,35915,32780,12959,43611,38701,25435,3884, + 770, 23588,28928,15005,7675, 4727, 20707,30474,7740, 27717,15583,13733,18382,28929,23807,32328,19764,28558,26463,30858,15400,32898,31476,16026,28409,18505,8251, + 27510,2509, 21083,13506,25089,43612,15966,23062,23910,31860,21349,38701,17551,19108,35916,34926,38701,10320,4346, 38701,35915,32780,12959,43611,38701,25435,3884, 7864, 7863, 14554,13730,1052, 8805, 599, 9262, 534, 21657,34964,38382,37443,22106,1109, 43611,37139,5793, 35915,2430, 1548, 38700,1044, 2429, 18622,40749,20123, - 1920, 10157,4183, 390, 2314, 15768,40749,35915,31078,27735,15599,629, 26424,842, 22218,219, 18512,1644, 1759, 27734,17072,38122,2544, 21955,29057,12328,2708, - 36739,1558, 38199,2655, 413, 386, 70, 38700,43, 3235, 38700,21308,26339,43611,38700,25088,33433,3828, 3118, 32836,464, 9695, 16551,8378, 16550,43611,7791, + 1920, 10157,4183, 390, 2314, 15768,40749,35915,31078,27735,15599,629, 26424,842, 22218,219, 18512,1644, 1759, 27734,17072,38122,2544, 21955,29057,12328,2708, + 36739,1558, 38199,2655, 413, 386, 70, 38700,43, 3235, 38700,21308,26339,43611,38700,25088,33433,3828, 3118, 32836,464, 9695, 16551,8378, 16550,43611,7791, 7071, 26027,34926,12035,17466,34586,33585,14616,8853, 37138,36373,29107,19887,1133, 750, 9074, 6641, 37138,11, 17252,29306,4779, 34079,40749,12724,35915,21351, - 30558,255, 8938, 28921,40749,19927,35813,34121,23180,43610,35980,10820,38695,37502,18392,38476,14935,3081, 36044,19820,35467,11044,38292,38229,38817,16235,6137, + 30558,255, 8938, 28921,40749,19927,35813,34121,23180,43610,35980,10820,38695,37502,18392,38476,14935,3081, 36044,19820,35467,11044,38292,38229,38817,16235,6137, 9292, 43610,717, 18905,33072,20896,3413, 11987,11189,18137,4639, 16348,24631,33433,7359, 19819,2573, 35310,7223, 13573,37421,7860, 33306,35441,8599, 40748,25087, 38699,31077,18167,26357,3331, 22342,34926,786, 37138,37381,21307,34936,1640, 18072,3239, 7836, 2932, 19918,38699,15723,20743,12240,33432,1373, 14004,40748,37013, 32998,34925,30573,9581, 21963,12228,471, 6402, 22837,30993,28128,15125,15770,2938, 16550,15769,8377, 2730, 25913,16496,1513, 43610,35697,34925,43610,43609,34874, @@ -14106,34 +14101,34 @@ static const unsigned short Ranks[197839] = 7885, 38946,7681, 21951,32875,7187, 27192,28573,32267,30972,34698,13752,30797,37135,38695,40743,43601,35167,18498,2277, 40743,37094,35912,37135,16548,38695,21819, 38311,33343,23142,29360,1452, 32835,37900,2359, 14600,32835,7622, 29304,35912,38694,43601,34923,40742,15326,20833,40742,8858, 19622,23855,38694,13083,31071,43600, 43600,43600,33430,40742,15721,10333,38694,43600,3517, 37134,32834,29303,19818,4730, 16730,20695,25447,21410,40742,1732, 8811, 3034, 37689,5396, 37577,1428, 19817, - 34613,30526,13482,4849, 3064, 34974,38079,11929,6312, 27868,8371, 3060, 33544,19157,35622,15764,11608,9900, 33432,32935,33745,35611,18781,29992,19491,29316,6175, + 34613,30526,13482,4849, 3064, 34974,38079,11929,6312, 27868,8371, 3060, 33544,19157,35622,15764,11608,9900, 33432,32935,33745,35611,18781,29992,19491,29316,6175, 1324, 6011, 36675,15151,29625,33619,34428,2269, 22375,20165,32961,40741,32834,21386,34119,21301,25085,22104,43599,10030,16992,23938,43599,23502,34923,33430,10777, 12268,38694,27730,5180, 34192,29302,7402, 34266,40741,4346, 9559, 16499,28654,14836,43599,38849,27729,38888,43599,31070,1060, 43598,38693,32834,36999,31355,40741, - 13645,17455,36830,11716,29009,19785,23703,37120,16991,37107,38301,32874,3689, 35672,33430,4031, 7015, 30992,7895, 2089, 5807, 20131,7934, 38343,757, 19004,3157, + 13645,17455,36830,11716,29009,19785,23703,37120,16991,37107,38301,32874,3689, 35672,33430,4031, 7015, 30992,7895, 2089, 5807, 20131,7934, 38343,757, 19004,3157, 25084,2377, 19702,1275, 3204, 43598,33684,34119,24285,24838,38693,33430,33931,34923,4348, 8389, 37134,40741,7185, 16703,36217,40740,34119,29474,54, 24706,23308, - 34082,35824,19423,34702,27600,19816,33429,43598,7909, 37134,31069,19884,34922,29595,35912,43598,43597,43597,28049,2898, 16287,29723,37124,16821,38030,13504,6206, + 34082,35824,19423,34702,27600,19816,33429,43598,7909, 37134,31069,19884,34922,29595,35912,43598,43597,43597,28049,2898, 16287,29723,37124,16821,38030,13504,6206, 34922,466, 33350,2234, 3363, 36697,12902,28985,15763,12267,3670, 9078, 4113, 36890,39248,26335,6319, 31568,23670,37180,38370,43597,19815,35762,27705,37134,12929, 32887,24958,24685,29944,22123,24528,22118,695, 31298,1266, 19991,10983,18396,24791,7238, 19982,21565,9906, 32784,28947,13122,33086,5924, 11623,10837,40740,16135, 22949,38693,40740,7445, 25155,35230,32899,7607, 32922,16905,7894, 10561,19331,23860,39376,18360,22489,38693,19883,31068,13644,27728,25083,22103,40740,18044,33429, 22291,7062, 1285, 11390,12612,801, 2310, 1152, 37133,631, 25082,294, 12209,28855,16562,29816,36050,11928,37133,38908,5264, 43597,14264,21348,34118,12266,36807, - 13503,4671, 13998,33313,19814,19882,11325,5710, 33131,2273, 25081,22948,38930,1712, 26210,9119, 26170,17454,19813,43596,33185,19812,38692,23078,33009,36676,5926, + 13503,4671, 13998,33313,19814,19882,11325,5710, 33131,2273, 25081,22948,38930,1712, 26210,9119, 26170,17454,19813,43596,33185,19812,38692,23078,33009,36676,5926, 39382,35746,3073, 37133,5960, 19032,13290,3072, 18497,4946, 9899, 35100,35911,2191, 16883,43596,144, 19101,43596,7621, 748, 8557, 38692,91, 11995,34468,19034, 3234, 20044,3602, 33429,1862, 612, 25080,26788,9511, 37046,9185, 25952,4863, 18496,31644,3516, 2457, 2753, 18351,18760,10100,3446, 3304, 701, 21347,2598, 16547, - 6247, 20, 14097,428, 11807,21300,19714,25615,16988,28253,34554,2755, 33793,17335,26334,21299,39009,36586,43596,2292, 33429,27727,38692,19219,4985, 8522, 6257, - 19811,29285,29301,10102,36358,37015,24602,282, 22895,28879,9071, 11414,1144, 23185,685, 9803, 1204, 12316,16846,20358,35643,3618, 3165, 12625,1906, 8450, 1995, + 6247, 20, 14097,428, 11807,21300,19714,25615,16988,28253,34554,2755, 33793,17335,26334,21299,39009,36586,43596,2292, 33429,27727,38692,19219,4985, 8522, 6257, + 19811,29285,29301,10102,36358,37015,24602,282, 22895,28879,9071, 11414,1144, 23185,685, 9803, 1204, 12316,16846,20358,35643,3618, 3165, 12625,1906, 8450, 1995, 12265,21894,26666,14271,9601, 13824,35700,35068,19810,9557, 6993, 33428,3733, 4350, 3463, 36650,40739,38073,43595,37785,35911,13929,38176,43595,898, 215, 20605, 35484,620, 3138, 231, 5928, 33445,2747, 809, 763, 29553,9114, 38692,10836,2834, 3903, 43595,27726,4029, 8258, 34865,23937,15720,37754,10484,18621,7444, 13502, - 7750, 12705,25838,37390,43595,37922,37133,36730,22102,43594,39040,19809,33619,40739,31067,4670, 13997,37132,11043,4441, 3103, 5979, 406, 29300,21638,38691,8852, + 7750, 12705,25838,37390,43595,37922,37133,36730,22102,43594,39040,19809,33619,40739,31067,4670, 13997,37132,11043,4441, 3103, 5979, 406, 29300,21638,38691,8852, 13643,27725,31066,38691,17463,14615,38691,27724,37132,6523, 35788,36520,31083,3101, 21346,38691,5205, 6661, 16721,14264,43594,233, 15080,7221, 18043,13041,40739, 37132,597, 18703,1904, 3621, 4001, 14506,15762,1515, 13040,24276,6763, 9694, 13039,11607,21345,7082, 38055,8980, 433, 30205,3749, 17066,37132,1830, 4799, 28296, 21846,3689, 25533,24192,43594,1180, 35911,38953,31065,5657, 35903,28932,10785,2082, 40739,40738,18495,8248, 20031,21976,26333,21298,5923, 7968, 34295,26134,29299, - 26332,31064,36829,36400,9480, 29298,21980,32737,32782,19808,14129,37377,3698, 6242, 21344,8292, 3445, 22947,3145, 20562,34673,30175,16577,26060,3007, 11927,2502, + 26332,31064,36829,36400,9480, 29298,21980,32737,32782,19808,14129,37377,3698, 6242, 21344,8292, 3445, 22947,3145, 20562,34673,30175,16577,26060,3007, 11927,2502, 29297,585, 888, 23294,1967, 1253, 795, 11606,37131,38690,5467, 43594,2346, 43593,43593,3055, 43593,23936,16546,782, 2173, 12183,21343,15761,29296,32834,18042, 16561,35911,23935,29295,27723,562, 23570,24493,18267,34986,32322,4261, 2376, 2568, 3376, 21297,34934,37131,33062,18825,43593,3930, 7826, 16007,10386,8228, 37344, 34922,10744,2888, 36285,27568,28282,37131,6246, 33527,10312,38754,40738,43592,34118,1618, 839, 18494,31946,2748, 469, 34922,2045, 1737, 40738,13038,21342,18659, - 34921,16990,40738,26331,38690,12327,35910,40737,23934,6245, 25941,15760,33262,2751, 6762, 15745,10101,30503,22101,8810, 1032, 38458,6689, 1938, 20561,36068,523, + 34921,16990,40738,26331,38690,12327,35910,40737,23934,6245, 25941,15760,33262,2751, 6762, 15745,10101,30503,22101,8810, 1032, 38458,6689, 1938, 20561,36068,523, 19650,27063,17411,144, 5374, 15122,40737,8615, 5095, 256, 32425,24157,16188,1168, 8457, 9167, 37229,31131,5324, 34979,33781,2155, 12123,4373, 4016, 31390,10087, - 3381, 18002,7809, 12093,31063,10332,10337,9001, 21341,21340,16016,522, 32833,38690,22946,6118, 19881,29294,11013,16134,5474, 33428,16133,19807,9693, 1679, 2106, + 3381, 18002,7809, 12093,31063,10332,10337,9001, 21341,21340,16016,522, 32833,38690,22946,6118, 19881,29294,11013,16134,5474, 33428,16133,19807,9693, 1679, 2106, 10335,19398,15270,6373, 14505,22945,27867,40737,38690,34118,8174, 372, 17177,222, 10179,38639,16850,3380, 11605,33428,22944,6992, 2316, 19679,4022, 11604,37131, 7247, 5882, 12215,26734,37130,34118,32833,3826, 43592,25587,36034,9541, 34101,1738, 27641,25761,6214, 23930,27722,33017,27466,21110,9692, 34043,6174, 15759,34539, 31860,16545,11603,38683,1350, 26954,7246, 22471,19806,32775,38970,5858, 35740,8063, 26241,7862, 13996,11413,33289,19805,20560,43592,13928,43592,11042,8117, 10100, @@ -14148,18 +14143,18 @@ static const unsigned short Ranks[197839] = 19398,43590,32411,8591, 20534,17523,21112,37346,14114,11841,7810, 39343,21099,31053,10646,26040,6842, 27677,4173, 21826,22601,13966,11515,22582,10624,14040,39131, 38697,10768,36609,5028, 17416,23926,14143,7466, 29882,23420,9969, 31023,32388,36810,30732,25833,367, 2272, 26918,7507, 22826,20416,9922, 469, 9834, 36846,35545, 20558,2869, 17455,2497, 2088, 32922,13081,38983,43590,19217,17045,13080,20485,15072,35909,43589,4716, 1574, 38823,18041,26390,25065,35768,38092,15666,24500,31006, - 1903, 14163,8376, 34921,40734,34299,8173, 35656,43589,38688,19879,8861, 33744,27804,38688,38338,510, 1750, 4622, 11601,10775,27887,21332,5515, 20662,6991, 1179, + 1903, 14163,8376, 34921,40734,34299,8173, 35656,43589,38688,19879,8861, 33744,27804,38688,38338,510, 1750, 4622, 11601,10775,27887,21332,5515, 20662,6991, 1179, 26394,18620,7333, 1167, 37229,43589,7726, 12202,43589,18040,1776, 38688,13500,29309,21241,38850,13499,33785,16497,15121,11411,3718, 15113,3414, 36697,43588,40734, 31059,363, 38899,18470,23932,27718,13079,11862,24295,9176, 8526, 13774,32940,22630,36824,20557,36116,2845, 25182,37129,34117,16560,37129,37129,40734,19878,33240, 15280,29291,18619,32832,43588,2870, 19877,17462,31058,29449,37735,5694, 32001,31057,752, 2445, 24784,19956,17395,7115, 29387,29176,32810,13714,4034, 8997, 38362, 35909,11054,1973, 19796,10098,22100,6144, 6797, 194, 18042,3142, 32832,34117,26329,34504,22099,43588,37078,35601,32154,21299,27717,39077,40734,34794,43588,38369, - 10141,34075,36205,28369,43587,7844, 32384,23057,12534,450, 3428, 40733,38688,23931,437, 15086,23336,18795,36753,11600,21169,34472,25077,13474,37451,17461,8809, + 10141,34075,36205,28369,43587,7844, 32384,23057,12534,450, 3428, 40733,38688,23931,437, 15086,23336,18795,36753,11600,21169,34472,25077,13474,37451,17461,8809, 4218, 36428,25017,5600, 40733,34117,33237,21296,38687,16544,31056,15755,36700,23986,30156,33580,18490,38687,19876,32590,18288,18322,5929, 23656,32831,37129,43587, 34116,2442, 37128,19216,43587,15776,6413, 8116, 34116,12325,2199, 4179, 5088, 13498,18489,2501, 5087, 4798, 7081, 25853,25800,18397,32815,4131, 19477,15940,38687, 13610,43587,28739,34177,2113, 8115, 8247, 34044,38687,15732,43586,14378,38686,20344,27836,43586,43586,40733,15683,34921,33427,6939, 12611,22941,25076,35908,32831, - 8750, 13497,15754,17450,888, 31211,33723,9435, 17192,23588,8375, 25289,38686,43586,16122,34440,13468,12388,38959,18488,11410,29290,4125, 27712,17460,38628,3033, + 8750, 13497,15754,17450,888, 31211,33723,9435, 17192,23588,8375, 25289,38686,43586,16122,34440,13468,12388,38959,18488,11410,29290,4125, 27712,17460,38628,3033, 30030,33244,36244,5645, 43585,15304,3749, 9509, 32207,33833,33536,34573,35640,37182,36577,37732,38667,13469,16811,18716,21891,24056,26269,28036,30241,21300,21331, - 32782,20512,10694,33377,38193,40733,38950,6260, 40732,38686,34116,38994,32831,22510,33133,34707,28051,229, 32055,22121,25282,28291,32790,30670,15648,19916,1972, + 32782,20512,10694,33377,38193,40733,38950,6260, 40732,38686,34116,38994,32831,22510,33133,34707,28051,229, 32055,22121,25282,28291,32790,30670,15648,19916,1972, 11926,18487,36893,10204,6784, 7386, 8066, 37981,35753,16132,7294, 34116,24618,12624,9509, 39201,11925,16947,37128,25220,12952,35944,15120,31354,17157,36139,34448, 20317,33678,9691, 4820, 11340,148, 9042, 27653,28319,24621,3297, 33331,6412, 40732,40732,7524, 33427,19215,34772,18486,736, 35289,23930,9479, 38686,2672, 40732, 7080, 26328,1012, 33164,4408, 40731,25588,23635,43585,43585,34991,8065, 12590,33427,9621, 14958,10331,36449,43585,32967,35216,13927,34115,31055,11409,3979, 38685, @@ -14170,125 +14165,125 @@ static const unsigned short Ranks[197839] = 12262,12261,43583,38685,35908,43583,38684,33912,31054,43582,38684,38684,25072,43582,37128,7060, 32830,32830,31053,37127,34920,38684,34115,43582,29287,16989,34920, 43582,34920,43581,38683,27716,43581,32830,34115,32829,23928,38683,29286,35908,18038,1106, 38683,33426,29378,2462, 593, 40730,40730,6823, 17449,35063,31052,15324, 34114,515, 3460, 39328,38068,7244, 13085,24704,12022,38588,35907,8291, 33373,31051,18484,21329,31451,4478, 18618,13995,43581,20636,19309,11622,103, 32895,34919, - 36450,38739,40730,39022,35907,856, 38965,28806,10686,11621,43581,6087, 29285,78, 20500,40730,26327,23927,3375, 35466,10965,20558,30468,33426,18543,10970,1783, + 36450,38739,40730,39022,35907,856, 38965,28806,10686,11621,43581,6087, 29285,78, 20500,40730,26327,23927,3375, 35466,10965,20558,30468,33426,18543,10970,1783, 40729,38442,10333,26326,34919,19441,2597, 796, 14613,1605, 19708,27715,34114,37127,8630, 10124,23926,43580,27714,11000,43580,38563,12271,13496,35907,40729,34626, 21460,337, 12706,27986,32829,38964,27713,37127,26325,33450,6957, 18483,40729,9620, 33062,7470, 2975, 12895,7120, 1870, 26863,5473, 4571, 20398,6818, 7379, 43580, 3769, 37127,7428, 13072,20025,35907,16481,15300,2868, 3268, 10111,28307,8808, 2801, 18482,6241, 16543,40729,9321, 18818,7427, 38588,38756,33088,2240, 23204,40728, 3817, 3187, 2142, 28123,30187,34424,1682, 8953, 12915,19682,3557, 603, 1944, 2600, 4711, 23752,33935,33603,35606,24808,29233,3743, 4902, 7855, 26324,224, 10929, 136, 10101,32955,34911,1916, 33438,33571,34086,3001, 19562,29705,16199,33426,19874,2306, 3748, 18037,32829,29284,39309,4072, 31050,1277, 7219, 2968, 29283,37126, - 33426,40728,12260,8289, 22068,33218,17130,5673, 436, 15031,27618,6919, 11861,38335,619, 37196,38745,34555,15119,8402, 21328,18617,20556,16130,7389, 34919,48, + 33426,40728,12260,8289, 22068,33218,17130,5673, 436, 15031,27618,6919, 11861,38335,619, 37196,38745,34555,15119,8402, 21328,18617,20556,16130,7389, 34919,48, 16721,16131,34736,7059, 39307,9619, 4653, 38812,9731, 13077,33425,25071,13642,43580,38375,34777,29325,35923,21295,40728,40728,23925,10623,38212,8064, 29220,38107, 37666,43579,43579,43579,37653,38671,7441, 35906,26323,16542,43579,20555,32829,18692,38758,6240, 24749,32828,12589,43578,39096,35906,4074, 20053,13766,38145,33567, 38683,4561, 15406,32828,17459,34519,26322,43578,36245,36105,9196, 1542, 4830, 38730,29941,35607,38682,5867, 43578,379, 43578,37126,17458,950, 35976,10896,38728, 11285,1565, 10762,33821,33525,19436,36408,35228,33476,2797, 14584,34243,23096,20214,5524, 6478, 17606,13298,25150,26330,17485,6486, 36142,34053,43577,17448,39169, - 39004,1746, 34919,28314,43577,1028, 21737,580, 38145,9451, 30046,19925,3177, 5263, 43577,7243, 37414,33925,35199,15629,1062, 32828,15323,6244, 15118,38782,8083, + 39004,1746, 34919,28314,43577,1028, 21737,580, 38145,9451, 30046,19925,3177, 5263, 43577,7243, 37414,33925,35199,15629,1062, 32828,15323,6244, 15118,38782,8083, 2034, 17027,4251, 8625, 15351,24090,3232, 34918,40727,43577,43576,38682,40727,16988,26538,6522, 43576,40727,2891, 20974,38055,35806,33308,11673,23616,33203,11018, 14389,4241, 5176, 11511,1249, 31049,5978, 27712,20554,34114,958, 23924,1450, 38682,5045, 21819,26853,36168,5466, 34918,35202,38388,34601,14413,38628,35614,33449, - 980, 8583, 33594,33578,19055,7952, 43576,846, 18544,36188,2042, 24152,34433,4764, 17447,2791, 4715, 36826,10483,34114,34918,18111,1258, 3117, 27703,33425,9342, + 980, 8583, 33594,33578,19055,7952, 43576,846, 18544,36188,2042, 24152,34433,4764, 17447,2791, 4715, 36826,10483,34114,34918,18111,1258, 3117, 27703,33425,9342, 43576,2259, 18481,12205,1640, 12092,37636,17457,3985, 15117,24185,34544,16845,21943,34918,40727,13209,13994,9898, 4414, 38682,1219, 12285,10652,9672, 12373,15116, 26230,35125,15197,11323,32828,34807,19214,14612,35456,1676, 5423, 34263,15018,21059,4165, 1068, 4712, 9690, 4015, 6485, 22894,38681,478, 36497,13993,21327,21326, 5857, 38757,6780, 13412,37126,20697,51, 21802,5029, 4006, 43575,4478, 18480,33003,3889, 8576, 7545, 20479,24525,7529, 1032, 35906,33425,5373, 34662,35906,15753, - 33335,6369, 1627, 33443,32896,11620,33759,21325,364, 2926, 14160,32545,35562,16541,6767, 15115,1444, 24939,903, 7636, 7749, 15114,2985, 9508, 4094, 36864,1439, + 33335,6369, 1627, 33443,32896,11620,33759,21325,364, 2926, 14160,32545,35562,16541,6767, 15115,1444, 24939,903, 7636, 7749, 15114,2985, 9508, 4094, 36864,1439, 12353,24312,10707,7321, 25127,1633, 16911,32482,39299,28751,1753, 198, 16540,40726,32827,40726,35905,13700,16313,37126,33587,16559,29282,37125,40726,33065,32944, - 18920,31048,23564,22939,29281,5224, 10332,35067,608, 21014,27982,5911, 37085,4933, 2309, 15752,857, 33223,3971, 15625,36928,2940, 8374, 10096,1731, 9057, 4404, - 34966,15113,22077,4751, 6650, 8641, 7403, 7784, 17864,6435, 6911, 2887, 7490, 16340,8926, 10774,12259,9530, 24357,18479,38078,8604, 29054,31462,35902,17446,2026, + 18920,31048,23564,22939,29281,5224, 10332,35067,608, 21014,27982,5911, 37085,4933, 2309, 15752,857, 33223,3971, 15625,36928,2940, 8374, 10096,1731, 9057, 4404, + 34966,15113,22077,4751, 6650, 8641, 7403, 7784, 17864,6435, 6911, 2887, 7490, 16340,8926, 10774,12259,9530, 24357,18479,38078,8604, 29054,31462,35902,17446,2026, 7378, 3104, 27354,28783,4493, 5470, 2533, 5673, 2965, 37125,2054, 614, 33635,39398,19793,14302,28028,17917,3707, 4222, 40726,39314,43575,8979, 13992,17445,33425, 33424,15112,11924,37125,14769,19488,25777,16400,610, 1354, 1922, 4187, 7143, 36741,4494, 1697, 15111,1663, 6482, 10051,34339,1396, 436, 29348,3168, 3910, 15751, - 27550,17444,36231,38934,7689, 7056, 9619, 4637, 15202,16539,339, 30674,23532,13991,13865,34537,944, 9865, 2458, 1680, 6910, 5458, 36548,32781,39049,22184,1550, + 27550,17444,36231,38934,7689, 7056, 9619, 4637, 15202,16539,339, 30674,23532,13991,13865,34537,944, 9865, 2458, 1680, 6910, 5458, 36548,32781,39049,22184,1550, 5684, 33081,27816,38732,3009, 10001,15248,4695, 1515, 1387, 18707,12258,30748,17443,5776, 11599,31111,5349, 1269, 4397, 25735,36529,1027, 223, 22507,12837,28356, 9897, 8418, 4938, 9996, 27607,13218,37629,37125,6348, 36923,38675,43575,36539,39378,38532,36668,14548,32766,7058, 10329,29209,3286, 37474,21984,37446,27148,34238, - 30158,19792,34252,12623,43575,33905,13356,37124,33042,21294,43574,622, 3200, 5652, 7549, 112, 37782,34970,136, 4349, 13577,26359,20480,36685,4237, 32337,4681, - 6981, 33760,2494, 1113, 8084, 4797, 2651, 6296, 43574,6545, 9689, 37018,4026, 26872,29203,2686, 4050, 7297, 4204, 12454,17129,38681,43574,43574,13495,5223, 5745, + 30158,19792,34252,12623,43575,33905,13356,37124,33042,21294,43574,622, 3200, 5652, 7549, 112, 37782,34970,136, 4349, 13577,26359,20480,36685,4237, 32337,4681, + 6981, 33760,2494, 1113, 8084, 4797, 2651, 6296, 43574,6545, 9689, 37018,4026, 26872,29203,2686, 4050, 7297, 4204, 12454,17129,38681,43574,43574,13495,5223, 5745, 17442,11689,7172, 8525, 31449,15750,3336, 38041,37129,19068,38913,33424,1669, 929, 8264, 26266,16788,14173,4906, 35868,4892, 2132, 484, 1936, 2186, 17062,10606, 4440, 3407, 25070,16538,2087, 7286, 10346,3049, 7592, 14194,20269,7866, 43573,18478,17441,2535, 29168,34972,4735, 17440,2326, 12257,3313, 3966, 35780,4951, 33212, 7338, 37324,10624,20959,15325,668, 476, 488, 16233,10571,2604, 2060, 16765,705, 5439, 8524, 15387,4061, 4631, 9073, 6243, 1088, 11598,12622,6909, 3115, 16537, - 15608,11865,19009,2299, 7334, 10557,11040,3862, 37548,30921,5453, 19173,14262,2227, 1878, 38681,12588,6793, 823, 1425, 3298, 17972,5947, 4434, 14444,29262,1549, + 15608,11865,19009,2299, 7334, 10557,11040,3862, 37548,30921,5453, 19173,14262,2227, 1878, 38681,12588,6793, 823, 1425, 3298, 17972,5947, 4434, 14444,29262,1549, 12055,2930, 35347,13036,16253,22525,13494,2765, 11939,18009,3389, 6991, 37850,18477,28348,8978, 2451, 19229,10331,21324,43573,11322,6383, 32816,35661,34322,26163, 4833, 12621,23702,10749,18942,5149, 4068, 2772, 3297, 2500, 3566, 10330,5801, 38507,37124,778, 10352,11923,5800, 17439,35096,5207, 10826,31539,35088,21938,13642, 19610,7875, 5530, 20464,16378,2574, 18352,7959, 51, 5543, 29789,27416,38171,11788,2593, 23838,3385, 5035, 7333, 38998,35905,34131,21323,39307,2592, 7446, 33453, 33424,28669,6622, 32815,37709,35562,34412,34958,23956,1591, 43573,37716,34417,35905,37702,34363,17968,30123,38681,32660,4301, 9300, 5556, 9212, 23923,35020,11408, 26321,40725,3493, 12324,35785,20571,8274, 11321,40725,36245,31952,9436, 7861, 6544, 19791,11597,17438,26925,6908, 7180, 26995,11297,25006,27477,9896, 9175, 17437, - 5520, 3592, 34081,17436,1471, 3192, 11750,5262, 2371, 4952, 34621,12115,705, 43573,1017, 2956, 14728,2832, 6096, 36485,28650,35519,18749,36871,15988,1138, 671, + 5520, 3592, 34081,17436,1471, 3192, 11750,5262, 2371, 4952, 34621,12115,705, 43573,1017, 2956, 14728,2832, 6096, 36485,28650,35519,18749,36871,15988,1138, 671, 2457, 1957, 1117, 33944,13710,26263,29698,32919,39007,23234,4797, 11649,2076, 43572,6578, 36021,37231,7212, 908, 15749,3601, 40725,37124,2106, 35182,33495,33395, 38381,35905,7982, 35274,37631,18715,21854,43572,43572,13211,36737,11147,34261,6411, 1804, 5264, 6181, 2570, 2809, 6761, 14502,15748,10329,18476,11922,34690,22515, 38408,3762, 25773,39071,19223,3596, 16786,8885, 22888,10257,31704,1128, 34254,36434,12922,18900,9174, 15804,19976,8352, 5887, 6285, 20801,33671,38164,3949, 21322, 37295,38680,39118,37395,5170, 43572,36352,22938,6242, 9625, 35326,3758, 9895, 19840,22219,36191,11921,27445,9508, 19011,35672,33342,23957,8749, 15747,6760, 40725, - 22937,13348,40724,18475,16536,40724,43571,10835,23037,28142,972, 6861, 28820,8563, 5656, 21321,4551, 884, 26320,3174, 26166,16535,5034, 2194, 12065,13558,3838, - 2566, 7079, 21320,13990,1276, 26729,28037,11921,35947,16987,34113,43571,29280,13926,15322,40724,27711,14184,2055, 21763,1062, 3313, 12015,13424,10969,25228,3066, + 22937,13348,40724,18475,16536,40724,43571,10835,23037,28142,972, 6861, 28820,8563, 5656, 21321,4551, 884, 26320,3174, 26166,16535,5034, 2194, 12065,13558,3838, + 2566, 7079, 21320,13990,1276, 26729,28037,11921,35947,16987,34113,43571,29280,13926,15322,40724,27711,14184,2055, 21763,1062, 3313, 12015,13424,10969,25228,3066, 7854, 6281, 25069,11320,27759,36665,2742, 32827,17568,23350,10232,33424,31047,43571,21294,35267,37124,10482,34113,8373, 25357,36404,40724,4593, 43571,16534,43570, - 40723,32433,35307,15198,34841,33060,31310,6393, 2610, 33145,8174, 3825, 14319,7440, 514, 3061, 18846,38046,5536, 18562,17633,1750, 2327, 8032, 4601, 1565, 8372, + 40723,32433,35307,15198,34841,33060,31310,6393, 2610, 33145,8174, 3825, 14319,7440, 514, 3061, 18846,38046,5536, 18562,17633,1750, 2327, 8032, 4601, 1565, 8372, 8490, 13064,13493,9894, 12620,38274,4246, 5799, 16986,1623, 17435,2153, 3214, 4393, 15110,20424,15109,9688, 10828,26424,33064,3293, 7648, 21866,9099, 34324,11596, 4737, 8377, 11319,17434,2383, 3984, 35611,37558,1357, 7078, 5295, 11318,6437, 21319,14331,34877,21318,29304,25890,34184,1317, 8977, 7396, 3310, 4995, 33616,37448, - 8347, 18089,27729,13122,19595,33301,40723,21212,15841,23357,11494,20951,15321,38680,21317,15746,30057,37358,22723,43570,2917, 5413, 16533,13375,4321, 8807, 6165, + 8347, 18089,27729,13122,19595,33301,40723,21212,15841,23357,11494,20951,15321,38680,21317,15746,30057,37358,22723,43570,2917, 5413, 16533,13375,4321, 8807, 6165, 10874,14760,13312,4000, 1055, 11317,2285, 20712,3308, 35285,3084, 16532,26207,6861, 37089,19790,12256,9690, 3727, 14099,6988, 21447,30701,27710,8250, 19041,33814, 3231, 10751,7548, 3019, 12619,33245,8669, 809, 30833,27871,19313,31225,38031,2622, 7133, 22408,33512,5554, 34912,36417,728, 7576, 2612, 39159,3722, 11039,10328, 28582,34113,22706,19043,18736,8558, 21623,31125,15333,13524,16698,16558,12323,18036,34831,28977,33654,7734, 15458,20308,15745,37837,34987,8371, 11807,17453,34971, 14132,35551,38108,3267, 28313,38003,36315,34961,31618,5907, 9320, 19789,8668, 18474,11595,23922,9591, 26319,35904,10834,1157, 14957,37123,43570,29279,11920,43570, - 16557,447, 38680,6521, 31046,40723,4714, 37123,9671, 19236,38278,34917,1334, 33089,9394, 37578,7878, 27200,43569,13727,21293,33423,37668,1155, 10103,24790,1214, + 16557,447, 38680,6521, 31046,40723,4714, 37123,9671, 19236,38278,34917,1334, 33089,9394, 37578,7878, 27200,43569,13727,21293,33423,37668,1155, 10103,24790,1214, 33212,14117,1863, 2471, 1142, 2433, 14627,36587,7347, 32049,6785, 10814,3009, 6057, 34917,34917,1531, 27709,35541,1409, 22936,28406,357, 28714,40723,35904,38680, 3726, 29278,43569,11792,37123,38679,22935,43569,31237,22479,37317,40722,18932,25417,106, 10147,20553,35904,6850, 43569,37123,18473,38481,5655, 37122,28175,13492, - 29983,34113,1134, 37122,19873,581, 13553,26273,29571,1564, 16018,12785,34532,25425,43568,35136,37122,40722,32827,43568,38277,13288,23490,37122,40722,3046, 4862, + 29983,34113,1134, 37122,19873,581, 13553,26273,29571,1564, 16018,12785,34532,25425,43568,35136,37122,40722,32827,43568,38277,13288,23490,37122,40722,3046, 4862, 3937, 9687, 9491, 18801,12255,3136, 10593,36163,21778,35145,21185,399, 29680,34917,37419,40722,34916,15351,29277,38679,34112,35319,29276,1855, 18616,5959, 25068, - 34963,15108,1805, 38567,9319, 39306,34999,2703, 8667, 3198, 28043,14409,8796, 16326,29740,4481, 38028,8267, 34325,17550,1610, 12592,14051,15848,15097,13035,3798, - 3655, 12254,12253,40721,28103,3399, 1877, 10836,25876,38437,2948, 34112,9737, 1692, 18068,21187,11504,1226, 31321,4006, 10194,22781,25585,31787,20651,29363,4127, + 34963,15108,1805, 38567,9319, 39306,34999,2703, 8667, 3198, 28043,14409,8796, 16326,29740,4481, 38028,8267, 34325,17550,1610, 12592,14051,15848,15097,13035,3798, + 3655, 12254,12253,40721,28103,3399, 1877, 10836,25876,38437,2948, 34112,9737, 1692, 18068,21187,11504,1226, 31321,4006, 10194,22781,25585,31787,20651,29363,4127, 9318, 7214, 34414,17842,34581,856, 1914, 3475, 4372, 3197, 5920, 337, 1237, 3819, 12322,43568,13989,19213,22958,25170,2881, 1437, 6665, 2853, 3695, 1609, 15961, 812, 27708,37643,3787, 35904,4184, 15107,7827, 43568,8633, 3760, 36905,12499,5910, 36354,13491,21292,29275,38679,34788,6881, 33049,6803, 5341, 37121,29738,15106, 4291, 17407,24839,36967,7628, 20649,13988,2602, 13490,36114,10450,12252,6849, 36836,6347, 38598,2268, 12575,9720, 21695,229, 40721,31806,33064,1858, 19096,19872, - 31070,10288,4689, 38679,34358,38678,38843,6520, 3993, 17901,2446, 9953, 32827,37767,40721,5427, 11038,20863,40721,15744,17433,34307,4421, 1459, 4500, 8315, 4105, - 4375, 6426, 11201,1190, 2056, 35236,33155,13402,13390,11121,20001,25234,9822, 34517,36313,9124, 5232, 38765,25837,24236,21316,16089,3270, 893, 34753,5610, 392, - 37376,7602, 6543, 34564,23673,22501,14620,13000,10133,11919,32826,2105, 544, 4721, 11412,4523, 15574,14686,15836,3443, 31151,26821,35691,8286, 3254, 7810, 5958, + 31070,10288,4689, 38679,34358,38678,38843,6520, 3993, 17901,2446, 9953, 32827,37767,40721,5427, 11038,20863,40721,15744,17433,34307,4421, 1459, 4500, 8315, 4105, + 4375, 6426, 11201,1190, 2056, 35236,33155,13402,13390,11121,20001,25234,9822, 34517,36313,9124, 5232, 38765,25837,24236,21316,16089,3270, 893, 34753,5610, 392, + 37376,7602, 6543, 34564,23673,22501,14620,13000,10133,11919,32826,2105, 544, 4721, 11412,4523, 15574,14686,15836,3443, 31151,26821,35691,8286, 3254, 7810, 5958, 12704,10101,6849, 3736, 19788,35284,35247,7276, 4392, 1048, 20040,38718,3624, 12251,7081, 7547, 11918,33240,2907, 11917,946, 3114, 6687, 29730,2951, 19492,25181, 4621, 1679, 18384,1473, 4965, 6715, 1390, 7332, 672, 26040,13301,11916,6848, 18472,6792, 35655,27763,3836, 37121,26318,9173, 13096,23905,8114, 14660,16800,31389, - 34947,35857,13319,33197,5678, 935, 3565, 15743,32328,10181,9949, 7082, 8992, 17158,12886,1122, 21315,6747, 36527,9801, 13034,34112,3627, 25067,35903,33496,3374, + 34947,35857,13319,33197,5678, 935, 3565, 15743,32328,10181,9949, 7082, 8992, 17158,12886,1122, 21315,6747, 36527,9801, 13034,34112,3627, 25067,35903,33496,3374, 1466, 4417, 3729, 2361, 9317, 5361, 27730,1879, 6331, 14689,2861, 37053,8529, 39326,3603, 2206, 36140,6367, 40720,18471,7077, 5721, 17179,25066,43567,35453,10088, 5537, 9686, 4752, 32817,966, 334, 1087, 1899, 37291,4717, 17415,2354, 3826, 8542, 43567,27707,43567,38678,34916,7174, 21291,6227, 35848,15259,5552, 8806, 31110, 36208,14181,18232,18470,638, 3944, 33589,38713,8007, 7076, 5189, 5239, 6104, 2914, 9516, 28015,9893, 12858,17432,10228,13499,9989, 17401,31127,27774,8666, 34227, 23205,12250,38994,28487,43567,38214,38948,2610, 26152,26159,1778, 8020, 8085, 33947,8082, 34916,35477,38192,35743,26460,24025,32826,34112,38678,22571,494, 40720, - 43566,43566,38678,3189, 1479, 5831, 2733, 2264, 1819, 4344, 5561, 23595,37121,21314,15742,17173,25896,329, 7833, 26223,32983,30030,20727,1418, 4318, 7581, 3082, + 43566,43566,38678,3189, 1479, 5831, 2733, 2264, 1819, 4344, 5561, 23595,37121,21314,15742,17173,25896,329, 7833, 26223,32983,30030,20727,1418, 4318, 7581, 3082, 2870, 2021, 35511,11225,5649, 1626, 13489,13488,10556,18622,11845,18319,30288,23981,36867,7835, 16829,10327,6856, 25194,18469,4049, 29190,38677,2397, 5124, 21200, - 25709,4209, 1243, 2415, 12021,4166, 33929,17698,33788,34916,9863, 16786,6782, 13065,15479,17040,35717,722, 14501,15105,3196, 5169, 36254,6573, 38009,16531,2404, - 8908, 36287,3689, 1446, 9883, 15913,37948,4669, 15104,5758, 6913, 15717,6668, 33902,7014, 20692,39269,37028,8539, 14127,13487,34769,14269,3530, 2173, 38339,3411, + 25709,4209, 1243, 2415, 12021,4166, 33929,17698,33788,34916,9863, 16786,6782, 13065,15479,17040,35717,722, 14501,15105,3196, 5169, 36254,6573, 38009,16531,2404, + 8908, 36287,3689, 1446, 9883, 15913,37948,4669, 15104,5758, 6913, 15717,6668, 33902,7014, 20692,39269,37028,8539, 14127,13487,34769,14269,3530, 2173, 38339,3411, 5798, 9136, 34111,1031, 1161, 6759, 2483, 15904,13307,39047,34151,16530,20715,3241, 7600, 19787,16529,571, 6086, 32826,40720,18616,16556,3247, 28000,34916,43566, - 43566,22934,7748, 26972,6694, 29821,37121,27706,43565,13925,34770,43565,13987,54, 10095,21313,855, 2624, 8388, 40720,33595,15341,43565,37337,7538, 95, 3883, + 43566,22934,7748, 26972,6694, 29821,37121,27706,43565,13925,34770,43565,13987,54, 10095,21313,855, 2624, 8388, 40720,33595,15341,43565,37337,7538, 95, 3883, 27540,13673,27684,26443,23489,16051,912, 11758,7546, 1612, 22926,18615,37120,32785,2890, 3835, 37120,7967, 34627,35882,38677,32697,29928,375, 26620,8880, 19804, 6626, 6357, 23044,26736,29127,20829,12194,43565,38451,14752,16555,9239, 15789,43564,8960, 27480,43564,4553, 29933,1239, 5954, 1599, 11915,3846, 739, 24488,34575, - 7963, 2519, 20153,6009, 8290, 12097,34764,21312,4406, 1308, 23792,14569,21311,1946, 20386,36392,3398, 9061, 11594,23991,35907,17456,37120,21290,3133, 5977, 9618, + 7963, 2519, 20153,6009, 8290, 12097,34764,21312,4406, 1308, 23792,14569,21311,1946, 20386,36392,3398, 9061, 11594,23991,35907,17456,37120,21290,3133, 5977, 9618, 43564,1493, 29274,13398,33423,14791,27705,34915,38677,2428, 37120,34111,43564,37119,38677,8748, 3611, 40719,33423,17168,4796, 40719,11938,5569, 60, 5478, 26432, - 23561,26209,38624,2665, 10945,19176,6010, 2303, 37587,3859, 23729,10861,40719,13076,35903,10435,22933,35903,21952,33423,43563,40719,37778,34915,23921,4827, 5218, + 23561,26209,38624,2665, 10945,19176,6010, 2303, 37587,3859, 23729,10861,40719,13076,35903,10435,22933,35903,21952,33423,43563,40719,37778,34915,23921,4827, 5218, 3829, 7311, 4687, 4091, 18674,19786,38676,29137,5047, 21555,13769,19234,26190,20805,32911,9172, 39219,21973,2139, 26240,12249,9341, 13347,34915,779, 4250, 27081, - 19785,29685,12832,27704,33432,1288, 34983,38676,399, 36343,19127,29273,25065,19212,6200, 3474, 7058, 31045,38921,26057,26896,33221,15741,10667,14956,36723,5612, + 19785,29685,12832,27704,33432,1288, 34983,38676,399, 36343,19127,29273,25065,19212,6200, 3474, 7058, 31045,38921,26057,26896,33221,15741,10667,14956,36723,5612, 13986,1371, 13985,7159, 17458,18468,16554,15716,25064,43563,38219,3102, 13346,27703,40718,36867,36284,43563,12587,12390,7619, 31653,10773,10666,34285,33422,35903, 336, 8432, 36280,31898,31114,12248,19784,38043,38514,35902,35361,19783,13984,34111,37875,40718,37119,32863,34268,12321,13486,13641,9617, 38676,9340, 3808, 35902, 34915,28566,33834,37272,739, 16528,31835,34590,40718,13485,9203, 29890,25879,36986,20721,39146,33422,1076, 9892, 8976, 30470,39115,35745,3402, 12644,15246,26385, 38733,31928,34357,21134,9171, 302, 38453,29898,38987,43563,33422,40718,38676,1437, 2793, 3115, 38789,37931,43562,12822,19871,37119,32826,40717,6283, 1883, 37119, 32819,23920,14955,36863,16553,35019,34914,32302,39215,17326,953, 33422,38629,1042, 34914,34111,3675, 40717,13345,23919,43562,18096,9743, 33382,15320,35902,35902, - 1646, 40717,3761, 29272,37256,37118,23918,35901,43562,37465,15740,43562,35650,5168, 43561,1211, 921, 33847,40717,4673, 43561,1294, 5401, 14500,40716,3373, 8975, + 1646, 40717,3761, 29272,37256,37118,23918,35901,43562,37465,15740,43562,35650,5168, 43561,1211, 921, 33847,40717,4673, 43561,1294, 5401, 14500,40716,3373, 8975, 16527,2596, 25063,40716,37118,11743,35213,33976,8629, 11593,25062,6585, 10481,38675,34914,21310,38675,34110,943, 37118,35901,32825,11619,27702,9170, 31044,12618, - 37118,3703, 1381, 29373,12320,32825,2104, 37117,34198,35901,18035,28860,33421,1677, 9202, 34914,2085, 174, 12278,40716,33626,35901,13311,8221, 23091,37117,1140, + 37118,3703, 1381, 29373,12320,32825,2104, 37117,34198,35901,18035,28860,33421,1677, 9202, 34914,2085, 174, 12278,40716,33626,35901,13311,8221, 23091,37117,1140, 8980, 18467,43561,43561,43560,38675,2305, 12586,23917,34462,852, 784, 34913,1429, 524, 34913,10161,38743,11164,11232,1250, 34813,34129,26471,37117,34110,32973, - 43560,3035, 38675,16130,26317,12831,18979,26746,22932,37117,12247,29271,40716,21309,10094,32825,2518, 18722,15715,11407,35900,3313, 38412,26316,13075,15714,1333, - 2277, 37727,17906,14954,13074,26315,43560,43560,1244, 19216,19849,2370, 38674,43559,35701,13033,12894,15739,4242, 37116,15738,16697,37116,9169, 35900,28511,4053, + 43560,3035, 38675,16130,26317,12831,18979,26746,22932,37117,12247,29271,40716,21309,10094,32825,2518, 18722,15715,11407,35900,3313, 38412,26316,13075,15714,1333, + 2277, 37727,17906,14954,13074,26315,43560,43560,1244, 19216,19849,2370, 38674,43559,35701,13033,12894,15739,4242, 37116,15738,16697,37116,9169, 35900,28511,4053, 20350,667, 34110,37116,12528,6788, 23477,403, 652, 17438,40715,43559,37116,34913,1107, 10018,37566,5611, 21308,3612, 7931, 30976,43559,14201,1217, 35900,13344, 18614,21542,13983,16643,19782,37115,22931,28645,6871, 10827,15103,24042,36675,14817,10530,22850,36449,31043,31042,13073,2313, 10833,34730,40715,40715,34913,12830, 36410,21307,35732,29270,3581, 10093,2274, 4975, 36727,19781,43559,3646, 20196,36351,22518,33421,852, 20499,1677, 34221,23808,7545, 24262,4588, 33651,36555,26962, 7293, 4600, 19780,12880,40715,28961,35878,8137, 6730, 40714,26314,43558,24597,40714,33117,32802,35957,3267, 33449,31041,29574,1850, 35064,897, 3951, 35367,36344, - 21306,43558,22098,891, 3227, 6056, 16526,5018, 38726,7292, 7966, 26313,33421,22097,2170, 20442,2967, 5400, 12714,18613,43558,30968,38674,1076, 38674,43558,1218, - 5654, 12246,5568, 7114, 7782, 13350,3312, 15185,33919,27076,32825,34940,22224,31904,3365, 19211,35900,37115,40714,13992,8582, 15463,32954,6037, 14493,37900,4474, - 43557,37115,43557,25061,38674,5937, 9392, 3984, 21090,4072, 11859,2617, 16557,5187, 43557,27701,30887,40714,34912,38112,38673,33421,40713,43557,3637, 8963, 1273, + 21306,43558,22098,891, 3227, 6056, 16526,5018, 38726,7292, 7966, 26313,33421,22097,2170, 20442,2967, 5400, 12714,18613,43558,30968,38674,1076, 38674,43558,1218, + 5654, 12246,5568, 7114, 7782, 13350,3312, 15185,33919,27076,32825,34940,22224,31904,3365, 19211,35900,37115,40714,13992,8582, 15463,32954,6037, 14493,37900,4474, + 43557,37115,43557,25061,38674,5937, 9392, 3984, 21090,4072, 11859,2617, 16557,5187, 43557,27701,30887,40714,34912,38112,38673,33421,40713,43557,3637, 8963, 1273, 22441,29204,33420,3162, 35899,40713,3678, 1781, 703, 40713,3372, 40713,35899,38049,6085, 8523, 18008,34527,19779,38566,34226,43556,8512, 16525,38673,35539,12123, - 4741, 8246, 13484,2748, 37285,39117,6990, 18278,8370, 3323, 28401,23566,28910,31200,33420,32824,38673,17502,35899,43556,14655,34017,38673,43556,37560,10186,8851, + 4741, 8246, 13484,2748, 37285,39117,6990, 18278,8370, 3323, 28401,23566,28910,31200,33420,32824,38673,17502,35899,43556,14655,34017,38673,43556,37560,10186,8851, 17363,36788,43556,31040,34912,6239, 5746, 37115,13640,37368,35646,20096,34088,21289,1364, 7877, 43555,6129, 427, 34449,12359,38275,35141,27332,40712,8344, 34275, 9742, 40712,35899,20792,37070,11984,3190, 31039,936, 33420,31639,40712,37522,15319,37254,37114,40712,6519, 15409,33140,21505,38517,15068,20782,38672,36192,43555, 35898,17201,7452, 7657, 14302,76, 24265,13882,38672,33846,36178,15318,23916,23101,10772,34541,11719,40711,3859, 18466,214, 31945,36314,37114,16986,37641,38672, 17455,29269,3816, 18578,43555,37436,2461, 43555,20552,35898,37114,35367,35898,8064, 16129,28930,9087, 32320,38672,31038,3465, 36062,40711,24111,40711,43554,19778, - 34552,43554,15903,21838,39203,17454,11542,38671,35898,37114,21305,38671,38671,40711,40710,40710,27349,4557, 6847, 37500,3088, 33498,3335, 19777,33036,2117, 6884, + 34552,43554,15903,21838,39203,17454,11542,38671,35898,37114,21305,38671,38671,40711,40710,40710,27349,4557, 6847, 37500,3088, 33498,3335, 19777,33036,2117, 6884, 26382,25040,22918,36950,14448,10360,18763,24279,8961, 36506,17266,32080,1280, 11860,6306, 27095,36034,38002,6860, 34912,43554,43554,10697,10089,23915,38671,34912, 38670,31037,40710,12091,9339, 20009,16270,35897,27700,764, 920, 34911,26312,37113,11125,11859,34911,38670,14953,3410, 43553,7218, 33532,7834, 12669,39362,15077, - 20296,36891,37007,43553,33420,22930,36974,1091, 43553,35897,43553,16128,13072,11211,16127,23914,11618,37113,5855, 23913,32285,33419,6139, 10665,5291, 1615, 1928, + 20296,36891,37007,43553,33420,22930,36974,1091, 43553,35897,43553,16128,13072,11211,16127,23914,11618,37113,5855, 23913,32285,33419,6139, 10665,5291, 1615, 1928, 16266,3472, 34055,43552,1771, 14499,6907, 2557, 22424,37092,43552,776, 43552,36283,35897,34357,33435,29323,17930,43552,32824,38670,43551,38670,11858,3834, 12829, 18034,34911,8369, 37113,35897,33419,10480,34911,19210,13071,34805,32234,43551,34110,34910,43551,18465,34910,20130,15102,32824,13144,2321, 24602,37883,7036, 27699, 22611,4533, 43551,2700, 32824,33542,31036,34931,35896,37113,26311,43550,5094, 4133, 11857,4848, 29268,742, 24912,16126,37112,38797,34021,14524,1800, 8522, 38669, - 37112,19209,39214,39190,34937,1048, 35614,37112,15737,18033,36283,40710,39178,29267,13639,22096,32150,558, 12042,33029,3408, 26389,23232,3039, 10555,38669,7544, + 37112,19209,39214,39190,34937,1048, 35614,37112,15737,18033,36283,40710,39178,29267,13639,22096,32150,558, 12042,33029,3408, 26389,23232,3039, 10555,38669,7544, 15317,2171, 35896,21304,23912,38669,34910,64, 11592,811, 3275, 12245,228, 18464,23524,37112,33837,26310,34109,20254,5843, 40709,35645,6034, 15713,32823,35896, 1327, 15242,37004,38669,18463,19870,43550,15075,245, 19208,4488, 4733, 10554,33697,35044,11316,15388,3727, 33566,34109,2178, 15736,3335, 38274,13032,8665, 25101, 32823,1915, 7981, 23778,645, 12782,18002,33865,11569,5433, 25206,3861, 35896,19776,1979, 18719,13619,37183,36944,9639, 24449,20374,23558,36413,22955,36752,16994, @@ -14301,7 +14296,7 @@ static const unsigned short Ranks[197839] = 2692, 19774,36565,36039,35895,32822,31035,13924,40708,27250,43548,9741, 40708,16552,19829,13638,1790, 21288,35894,27698,29265,21287,32822,37083,37930,34108,16292, 27146,23911,43547,17489,21036,43547,4916, 43547,43547,4372, 25060,8978, 16551,25059,7980, 6275, 33260,25467,17165,34910,9622, 40708,4266, 710, 1912, 32866,21302, 16550,35894,866, 36203,19773,1772, 22072,1292, 35894,3329, 16523,38668,21484,13029,29437,10092,9500, 15099,3516, 26308,43546,36607,38668,32822,13923,33422,28593, - 903, 37111,43546,40707,38668,43546,1949, 22415,866, 6660, 2470, 10091,7075, 7635, 2403, 35283,14535,111, 3316, 23354,22694,141, 28400,1581, 15303,32385,7389, + 903, 37111,43546,40707,38668,43546,1949, 22415,866, 6660, 2470, 10091,7075, 7635, 2403, 35283,14535,111, 3316, 23354,22694,141, 28400,1581, 15303,32385,7389, 36375,23113,6659, 24257,43546,33418,37111,29162,38786,25723,17431,33418,3937, 34909,4915, 19207,15098,14497,21346,37206,38668,13343,7702, 5024, 34982,21286,16125, 31698,32822,10664,31034,35894,22778,3747, 3746, 40707,15712,34104,9647, 43545,18462,11315,38816,16702,17490,36762,29339,31326,2875, 43545,26307,31105,62, 19020, 26306,20565,40707,17764,38667,22250,23910,22963,37111,40707,586, 23909,37110,38667,35893,16124,43545,32821,1694, 3101, 29264,37456,881, 26168,10311,22094,12090, @@ -14317,20 +14312,20 @@ static const unsigned short Ranks[197839] = 19770,37851,38141,33543,22926,40703,40703,37962,43543,6542, 37439,34907,1908, 43542,5204, 6084, 12616,18027,5653, 11313,40703,15735,19939,16135,125, 34535,37234, 38664,2172, 4831, 15850,18459,2259, 18458,2813, 12244,18457,38664,43542,22925,38018,38232,18635,8289, 22092,17283,36456,27696,15652,8559, 10325,18026,3144, 12243, 4620, 5432, 10553,6055, 6009, 318, 1998, 13786,29708,20568,9960, 2182, 16355,28633,17559,25673,21115,31876,33056,27927,6466, 12048,24156,33417,26301,38664,11406, - 16120,18456,21297,1025, 22648,7859, 3464, 20420,17428,1631, 16520,2140, 20495,22091,33937,26300,29260,12615,21296,31033,21295,11856,15709,11209,7876, 739, 291, + 16120,18456,21297,1025, 22648,7859, 3464, 20420,17428,1631, 16520,2140, 20495,22091,33937,26300,29260,12615,21296,31033,21295,11856,15709,11209,7876, 739, 291, 3094, 38664,9223, 1326, 33960,1101, 18055,25305,32102,3150, 10309,26116,299, 17970,17427,36768,5656, 3193, 6233, 2015, 2958, 15423,35808,40702,34907,20551,33995, 33526,19769,37109,13027,20655,37613,33961,4440, 18455,33417,40702,4439, 7158, 43542,962, 28338,31853,1798, 22893,37105,33494,14544,8095, 2033, 12585,13479,10243, - 1847, 37109,4160, 17374,39156,25058,33467,34108,18454,18453,37108,828, 22840,40702,5882, 23904,8846, 3053, 43542,43541,1989, 10324,7376, 6650, 16519,18452,6054, + 1847, 37109,4160, 17374,39156,25058,33467,34108,18454,18453,37108,828, 22840,40702,5882, 23904,8846, 3053, 43542,43541,1989, 10324,7376, 6650, 16519,18452,6054, 21294,3124, 2083, 33417,32820,18611,35893,38663,15316,7073, 40702,43541,40701,43541,25057,29259,2997, 40701,34907,38663,34560,29258,15734,6008, 13026,39090,34905, 32812,11590,37002,8522, 11855,27695,17452,37108,21283,37108,15102,34107,34612,33751,1474, 40701,2911, 7711, 21561,34388,15906,9890, 13637,13980,40701,32819,12242, - 36420,31928,19869,37815,15733,5190, 40700,19768,33650,34107,31032,40700,43541,34907,31031,10330,37108,2054, 4159, 43540,13342,27821,19205,34057,14260,32819,4161, - 11447,10877,38293,34107,30450,14591,35408,27130,8521, 38468,21293,6348, 15158,37420,6827, 33515,37107,37107,9355, 15095,34906,29760,21292,38367,32819,18276,8821, + 36420,31928,19869,37815,15733,5190, 40700,19768,33650,34107,31032,40700,43541,34907,31031,10330,37108,2054, 4159, 43540,13342,27821,19205,34057,14260,32819,4161, + 11447,10877,38293,34107,30450,14591,35408,27130,8521, 38468,21293,6348, 15158,37420,6827, 33515,37107,37107,9355, 15095,34906,29760,21292,38367,32819,18276,8821, 17951,23903,18025,1010, 11083,8152, 19703,18451,35378,22212,12847,1154, 18520,21815,9091, 25986,35390,20550,3597, 40700,7291, 21123,27694,5510, 38663,18450,32975, 19868,10479,39275,8747, 37107,15804,43540,363, 4164, 2932, 10368,17589,10552,19104,37382,34394,27693,13636,2629, 38663,37107,2477, 37394,38662,12241,3894, 18024, 8288, 37106,15315,29947,13979,40700,38662,18449,5842, 749, 7863, 7226, 39212,2180, 22090,34107,1234, 17426,23011,34241,34442,32855,36327,7331, 2732, 34786,14023, 19767,8977, 13478,1270, 9336, 38662,8172, 33416,13477,38662,21282,15732,36828,32046,32616,14494,11405,15094,7618, 35893,5797, 5652, 13918,18448,10769,14259,11037, 43540,2096, 34106,25056,40699,38661,34906,16985,35892,31030,17763,25055,35892,2709, 8985, 38993,1617, 10185,23902,12584,35892,37106,26299,1854, 28901,26298,35892, - 16518,12319,8972, 23901,43540,18447,33839,6278, 4945, 21291,39279,40699,43539,35891,7965, 37106,2404, 2477, 2051, 1304, 27692,34906,35720,40699,43539,43539,2595, + 16518,12319,8972, 23901,43540,18447,33839,6278, 4945, 21291,39279,40699,43539,35891,7965, 37106,2404, 2477, 2051, 1304, 27692,34906,35720,40699,43539,43539,2595, 38932,1794, 10375,635, 34617,9142, 2567, 1861, 418, 1521, 40699,11178,903, 3620, 43539,38661,32805,953, 34781,1133, 36691,3654, 16517,43538,34906,10663,29257, 9476, 22089,3116, 6751, 21790,4944, 2011, 35725,895, 30281,3894, 16516,3680, 24169,14080,1706, 5762, 5519, 2023, 12645,7847, 1153, 6086, 19755,12093,33452,43538, 3364, 9337, 2380, 28359,12614,26297,29256,27691,32819,43538,40698,40698,14258,2816, 22263,29171,13635,34799,36585,37106,34905,38906,11912,16515,19766,16514,35891, @@ -14342,16 +14337,16 @@ static const unsigned short Ranks[197839] = 11011,13920,13634,43536,10476,20547,35890,37104,37104,317, 18172,19867,18038,34205,7072, 38372,33721,36934,35031,21288,33128,14565,1557, 11615,32818,2758, 13341, 27688,17636,7330, 32818,17423,21287,1738, 7149, 6360, 5167, 13919,37640,4240, 40696,16983,7358, 5938, 19593,26395,23978,27782,6408, 33458,17554,15731,20546,11854, 36632,6989, 34911,35890,38659,16982,16549,36899,7543, 2699, 43536,10662,18745,33487,27687,11853,6787, 43536,32817,1025, 18446,14923,38659,14493,38659,33416,37915, - 11911,2148, 29255,43535,35890,27686,43535,38659,34106,20000,19765,38658,37104,1004, 8768, 39417,1577, 3379, 19204,1161, 18025,9889, 37104,5433, 39158,27499,878, + 11911,2148, 29255,43535,35890,27686,43535,38659,34106,20000,19765,38658,37104,1004, 8768, 39417,1577, 3379, 19204,1161, 18025,9889, 37104,5433, 39158,27499,878, 19764,1398, 37103,12283,36239,27685,43535,19763,8171, 904, 1301, 30750,32916,3664, 22924,12240,36988,10184,8913, 14057,7745, 36025,6859, 26296,8287, 37103,43535, 43534,15708,4847, 7527, 10661,40696,37766,5745, 11840,37850,7789, 15730,3721, 22895,16287,15497,10323,12239,36526,10872,17073,8805, 32724,11588,13475,5518, 21286, 38658,27684,16548,19549,37103,1636, 10768,35889,16513,14492,37814,5395, 43534,40695,38965,37443,37103,13633,20545,2112, 13830,2461, 18020,6076, 16538,8051, 17422, 5517, 43534,39273,25051,15729,942, 6685, 7858, 12612,21285,11587,9475, 10090,34904,31027,6407, 29254,12089,34105,5290, 29252,43534,40695,27683,43533,40695,34904, - 31026,37102,34105,5188, 1267, 35889,18891,14491,12611,6786, 4113, 13632,34105,2088, 21284,18445,10551,8883, 33356,12318,38658,34904,37102,19866,38658,33196,5944, + 31026,37102,34105,5188, 1267, 35889,18891,14491,12611,6786, 4113, 13632,34105,2088, 21284,18445,10551,8883, 33356,12318,38658,34904,37102,19866,38658,33196,5944, 1404, 6710, 12319,29023,37102,3363, 34904,1665, 3081, 3619, 33428,8804, 5473, 17458,40695,19203,33416,6173, 24555,10790,23723,12238,4791, 8244, 2612, 7633, 43533, 2780, 23900,23899,40694,43533,34105,43533,40694,37102,19251,32229,112, 16547,22087,11680,18609,18306,34903,14882,29536,964, 19202,37101,10255,33415,31025,34903, - 12582,7241, 979, 13978,18274,16512,33964,38925,5610, 27093,6240, 35695,21283,11811,37515,14106,12670,38387,37335,38972,36647,21282,2374, 31024,15093,3444, 102, - 26813,2786, 22591,29160,9443, 19533,33464,22733,33106,26840,17907,6053, 3600, 12610,32817,34903,33442,37221,38483,34582,32817,8113, 30979,43532,38657,14644,6846, + 12582,7241, 979, 13978,18274,16512,33964,38925,5610, 27093,6240, 35695,21283,11811,37515,14106,12670,38387,37335,38972,36647,21282,2374, 31024,15093,3444, 102, + 26813,2786, 22591,29160,9443, 19533,33464,22733,33106,26840,17907,6053, 3600, 12610,32817,34903,33442,37221,38483,34582,32817,8113, 30979,43532,38657,14644,6846, 33470,22208,28854,35889,10858,26545,37527,26400,10565,34104,40694,28208,7354, 7106, 17023,9782, 31129,25896,30727,22950,3628, 32426,1980, 26824,13669,849, 14026, 23930,11407,4041, 27341,36169,4942, 9658, 35832,18250,24502,15314,13631,40694,43532,23898,3775, 31168,43532,36660,43532,39041,34903,22826,24791,6239, 2504, 21436, 23188,3325, 26128,9510, 5261, 31023,13482,14610,14103,2651, 15128,32817,15483,26343,5991, 13977,22086,7157, 36679,38657,14301,37101,5284, 5222, 37649,33415,37101, @@ -14366,21 +14361,21 @@ static const unsigned short Ranks[197839] = 1527, 27680,37099,22167,38822,29192,16980,5586, 18025,23080,10193,33023,12120,32429,25730,25246,34901,38655,34901,19201,31020,8626, 26809,4172, 40692,22922,31164, 17068,22318,11009,43529,22085,8614, 32979,29247,8945, 34901,11553,26516,13024,37269,26295,32249,33414,33413,43529,10268,20120,6123, 7284, 18444,13152,1212, 15311, 304, 1212, 25048,43528,34463,14583,40691,9310, 22084,34103,27366,21035,32940,526, 25645,14261,5234, 31582,21922,20221,31474,8050, 35572,12439,7205, 31019,34103, - 15495,34103,38655,4713, 32893,33413,15594,38655,11852,36838,23896,6924, 35887,35887,40691,35887,22765,43528,27679,38654,14256,22083,26294,5796, 43528,27619,170, + 15495,34103,38655,4713, 32893,33413,15594,38655,11852,36838,23896,6924, 35887,35887,40691,35887,22765,43528,27679,38654,14256,22083,26294,5796, 43528,27619,170, 32992,35886,26293,562, 25923,16477,25061,26963,10388,2405, 11456,23241,19134,37099,5693, 36289,33117,26292,265, 11763,35653,37182,6758, 17420,1920, 11088,11909, - 43528,34901,32377,31358,33413,5033, 17449,5758, 11534,34629,3515, 13023,29246,25047,13068,14255,36682,36006,3321, 37099,29269,37839,12293,30507,19414,43527,9505, + 43528,34901,32377,31358,33413,5033, 17449,5758, 11534,34629,3515, 13023,29246,25047,13068,14255,36682,36006,3321, 37099,29269,37839,12293,30507,19414,43527,9505, 8061, 33183,33948,33061,22931,20544,5408, 21625,15528,3775, 38654,35065,21281,30874,34103,35886,32816,34844,36267,34102,15706,7875, 37098,12088,21278,15727,38313, - 37098,1771, 43527,3541, 43527,32815,9888, 22921,4819, 40691,4351, 18443,18021,34900,13197,26959,38098,13976,4321, 40691,8971, 19200,33474,21859,3032, 32716,1226, + 37098,1771, 43527,3541, 43527,32815,9888, 22921,4819, 40691,4351, 18443,18021,34900,13197,26959,38098,13976,4321, 40691,8971, 19200,33474,21859,3032, 32716,1226, 15679,15726,19761,14882,34102,19038,38584,26604,4465, 26291,7426, 9474, 18899,13975,34102,34900,23408,35042,2118, 43527,17448,5727, 40690,37098,10766,5032, 16326, 21277,29245,25046,13915,20543,38654,38991,43526,43526,21266,25497,1206, 43526,34098,38951,37098,11404,16979,11421,3317, 25045,368, 315, 5742, 40690,8520, 11264, - 9104, 2716, 1502, 2199, 43526,33862,5975, 21280,36429,20542,283, 1787, 3247, 7979, 7743, 19109,37097,18040,13022,34792,483, 20124,12381,34485,38335,3334, 4112, + 9104, 2716, 1502, 2199, 43526,33862,5975, 21280,36429,20542,283, 1787, 3247, 7979, 7743, 19109,37097,18040,13022,34792,483, 20124,12381,34485,38335,3334, 4112, 32815,3405, 110, 11668,6305, 33032,35602,25044,14254,27678,9740, 13021,19760,8659, 3442, 18442,4660, 4907, 37097,24811,31018,11703,34544,35924,43525,31017,43525, 13887,38508,8286, 33413,25043,43525,18794,37404,40690,13474,43525,43524,18608,43524,43524,4158, 37097,6304, 36494,8520, 34458,3597, 40690,38654,43524,11908,18020, - 5289, 19199,43523,14488,23791,18441,34102,15091,33412,37641,13629,35049,43523,34900,7539, 37097,2869, 14950,9167, 12237,27431,12316,1187, 2593, 17800,6284, 2290, + 5289, 19199,43523,14488,23791,18441,34102,15091,33412,37641,13629,35049,43523,34900,7539, 37097,2869, 14950,9167, 12237,27431,12316,1187, 2593, 17800,6284, 2290, 2014, 27009,19078,16540,17414,9617, 35563,2973, 26984,14949,43523,405, 34900,15224,21276,14487,37096,43523,38653,40689,23895,21279,38653,665, 33022,13448,17419, 5958, 4413, 21275,38653,10644,7522, 40689,37096,37096,38653,43522,19759,17418,4320, 15495,4587, 10614,31016,2014, 26143,1830, 18440,26290,9166, 35886,13460,19758, 35022,43522,18439,34467,25042,14948,40689,43522,8170, 33412,37096,2637, 35165,24309,19198,7216, 10660,29244,38652,20105,32815,1917, 9684, 11586,9887, 1641, 14276, - 33412,34899,27814,38652,9614, 29793,26289,43522,10321,24119,33433,17856,17586,15310,34534,2619, 28857,26207,38652,38652,21076,37095,43521,37095,22588,8981, 7921, + 33412,34899,27814,38652,9614, 29793,26289,43522,10321,24119,33433,17856,17586,15310,34534,2619, 28857,26207,38652,38652,21076,37095,43521,37095,22588,8981, 7921, 25116,36207,14064,5122, 13709,33020,32462,23371,10114,40689,36330,38651,37095,34101,40688,35886,36195,9470, 28126,8229, 16012,1684, 11836,19442,22291,39402,34944, 9683, 20956,32813,21278,30374,2546, 10404,33996,35934,19757,18526,16065,21503,18528,19550,19546,10079,21473,27908,7387, 14486,14054,38275,38974,4310, 30891,29245, 12828,36411,35895,43521,37176,31397,37800,35407,30865,1645, 28227,36527,25259,4819, 34483,8090, 18429,38119,20797,3343, 4935, 30190,6867, 33352,20587,34041,39352, @@ -14392,103 +14387,103 @@ static const unsigned short Ranks[197839] = 26461,32988,1780, 7486, 4507, 19342,17417,37094,14888,43520,26288,24226,37093,37093,38650,43520,43520,43520,43519,36101,38262,14608,28744,18249,35885,33597,37093, 43519,35884,40687,43519,43519,43518,43518,40687,29243,33411,38919,37616,37519,19073,36103,19755,15090,33830,15725,39380,38974,33610,19754,12608,25056,36250,35657, 29851,20150,9315, 33794,36446,3246, 38567,32884,37461,38601,28990,37625,37270,7542, 19753,35453,36570,32943,14848,6684, 30195,38474,36098,21273,32027,30497,38879, - 20738,38756,37969,38374,37416,36614,36613,26335,18764,6746, 19752,20523,23642,21272,22284,11704,36790,38162,10588,9613, 13974,6845, 11311,33727,37499,37039,8072, - 33120,17663,24015,27924,15982,21271,21967,21145,32908,35799,3471, 2079, 5892, 2390, 13317,33439,32895,33213,37281,36623,34519,33068,35134,33049,22438,9247, 9638, + 20738,38756,37969,38374,37416,36614,36613,26335,18764,6746, 19752,20523,23642,21272,22284,11704,36790,38162,10588,9613, 13974,6845, 11311,33727,37499,37039,8072, + 33120,17663,24015,27924,15982,21271,21967,21145,32908,35799,3471, 2079, 5892, 2390, 13317,33439,32895,33213,37281,36623,34519,33068,35134,33049,22438,9247, 9638, 25783,25958,13501,13910,17724,31438,30548,25084,12371,12710,17479,16339,15978,34851,35595,31441,7156, 36647,29242,37093,11907,19751,19750,37092,4188, 38650,34101, 32948,3695, 43518,37289,29556,3768, 35446,5089, 13200,18046,18585,30675,8746, 7145, 34100,18607,33480,22920,27677,40687,34574,15676,43518,43517,37525,2792, 16088, 28711,35922,21270,30270,38949,4239, 31015,25041,22243,36383,34791,18606,29241,34100,11613,29240,40686,169, 13973,23858,11446,10764,37155,29239,34883,23894,43517, 14607,43517,16228,11906,12691,31014,43517,441, 19749,2008, 10463,17807,33093,30345,28772,24288,4961, 6636, 29294,17683,7978, 33410,36721,34924,34100,31013,20496, 37968,5394, 35884,39065,33257,33410,7202, 14722,35884,37092,24288,3421, 33423,34840,34959,43516,2599, 35884,25040,8982, 13020,20541,6443, 31178,18983,26515,22919, - 35883,40686,10088,18743,19759,32814,38483,34899,35733,26411,35883,37092,29238,19864,16545,13942,20540,34438,40686,37092,9730, 38708,27676,1387, 27755,15724,4883, + 35883,40686,10088,18743,19759,32814,38483,34899,35733,26411,35883,37092,29238,19864,16545,13942,20540,34438,40686,37092,9730, 38708,27676,1387, 27755,15724,4883, 32814,43516,37399,35883,38649,35883,21276,2304, 32814,43516,33410,43516,43515,3747, 13019,21269,7335, 17415,4212, 37091,37091,40686,26287,37091,35763,38649,34924, 10582,6171, 32813,35722,11051,35882,38649,38819,1314, 7521, 13914,25039,14253,43515,43515,6518, 37091,34100,2024, 10659,37090,34898,40685,11007,17447,37954,11403, 43515,11006,17446,25038,34898,15705,12235,11402,18018,34898,20231,43514,6560, 43514,36821,40685,35831,39123,34898,1716, 22918,12827,24495,14606,27159,29337,38191, - 6858, 916, 12234,32813,43514,875, 43514,10014,33450,28983,12155,26286,2910, 35882,3676, 34897,33410,34586,33409,39321,10320,15089,15723,43513,38649,24640,4239, + 6858, 916, 12234,32813,43514,875, 43514,10014,33450,28983,12155,26286,2910, 35882,3676, 34897,33410,34586,33409,39321,10320,15089,15723,43513,38649,24640,4239, 33417,18437,32813,2127, 27276,20132,8803, 31012,18677,289, 1995, 12173,17093,29322,5394, 9752, 17515,17473,35309,34897,35882,33409,31998,40685,40685,26652,32813, - 10590,31004,9891, 40684,38648,21275,9079, 15360,38648,13835,117, 17493,4319, 32182,17036,23902,27105,32294,24248,33641,33850,25953,40684,7301, 16281,39416,7742, + 10590,31004,9891, 40684,38648,21275,9079, 15360,38648,13835,117, 17493,4319, 32182,17036,23902,27105,32294,24248,33641,33850,25953,40684,7301, 16281,39416,7742, 19863,39224,17429,43513,31705,32812,23893,43513,37281,35735,20539,16978,34099,107, 9930, 25985,28275,28656,18210,40684,43513,40684,2527, 8109, 20663,14754,11751, 26285,33409,3164, 27675,32812,13340,34897,33409,6517, 6587, 43512,1266, 38648,37417,31011,18136,43512,12906,35882,11914,1101, 13191,37960,35752,2126, 25037,43512, 16648,23279,43512,37090,37090,10182,32771,35006,12580,14195,40683,22082,40683,27905,71, 30316,19825,2429, 18039,14423,15408,6248, 30507,30432,12218,29237,35313, 30267,37090,26320,38648,23892,12826,15088,39039,33408,40683,22081,32812,38647,37089,35881,17414,17413,39206,21274,40683,10745,15894,33739,17603,38993,43511,37089, 31010,27674,40682,43511,33408,34897,35881,22080,43511,40682,21268,36739,4532, 29236,4112, 33215,29799,534, 32725,38367,43511,23411,13628,1133, 36123,14252,35881, 26284,1540, 21267,1127, 9898, 1841, 9903, 4448, 5221, 34104,5132, 29258,38647,33063,33408,1165, 25036,38647,5633, 35883,21266,36552,29975,38173,6032, 36758,38647, - 38646,37089,38646,35201,34099,34896,25035,19862,6976, 43510,3117, 17445,33965,24329,43510,6304, 11036,22079,38006,32812,13748,472, 25399,13067,7439, 2606, 495, + 38646,37089,38646,35201,34099,34896,25035,19862,6976, 43510,3117, 17445,33965,24329,43510,6304, 11036,22079,38006,32812,13748,472, 25399,13067,7439, 2606, 495, 34795,26066,812, 20726,32416,43510,10475,43510,34526,15308,19748,15939,37089,27673,21207,2118, 43509,40682,291, 15087,10549,16509,1546, 17876,8802, 17259,13972, 2267, 21698,39268,19379,22728,317, 16231,10319,10474,43509,43509,34099,38646,6757, 33057,26283,16508,21265,19747,36419,8970, 24298,35881,43509,7699, 35346,16131, 40682,3071, 37025,38646,5726, 7425, 35549,27944,13971,37953,172, 8801, 5843, 32849,177, 2496, 15307,29235,25565,36766,40681,15772,23831,40681,31009,537, 36670, - 9050, 24694,32532,3213, 26365,15814,32811,569, 7081, 23941,4011, 4225, 36426,34099,38645,7857, 1074, 40681,43508,3070, 43508,34851,29217,21264,21263,17790,9888, - 39268,29640,26282,36188,40681,26281,4914, 6190, 34896,13473,31008,5651, 531, 30363,34098,15704,34896,37088,38869,43508,1298, 40680,8663, 40680,37088,37088,1017, - 43508,7617, 4157, 2551, 32768,29143,40680,3069, 635, 19725,7520, 8285, 741, 5472, 6303, 29126,8367, 18436,22917,16507,7856, 29234,1825, 1937, 625, 22078,1734, - 2013, 12, 23954,29827,21288,1845, 29602,23729,6875, 11304,31024,11361,29381,23128,29266,21971,20993,27254,27731,30580,27270,27060,1054, 10490,1824, 38645,9963, + 9050, 24694,32532,3213, 26365,15814,32811,569, 7081, 23941,4011, 4225, 36426,34099,38645,7857, 1074, 40681,43508,3070, 43508,34851,29217,21264,21263,17790,9888, + 39268,29640,26282,36188,40681,26281,4914, 6190, 34896,13473,31008,5651, 531, 30363,34098,15704,34896,37088,38869,43508,1298, 40680,8663, 40680,37088,37088,1017, + 43508,7617, 4157, 2551, 32768,29143,40680,3069, 635, 19725,7520, 8285, 741, 5472, 6303, 29126,8367, 18436,22917,16507,7856, 29234,1825, 1937, 625, 22078,1734, + 2013, 12, 23954,29827,21288,1845, 29602,23729,6875, 11304,31024,11361,29381,23128,29266,21971,20993,27254,27731,30580,27270,27060,1054, 10490,1824, 38645,9963, 18435,2746, 1428, 150, 17046,33408,31007,142, 19197,34098,2860, 34003,40680,1869, 38596,14561,2594, 7905, 13724,1947, 6447, 2791, 897, 17688,29104,12610,36346, 11005,1793, 33407,1174, 39359,6145, 13782,18434,22916,18017,37088,31739,12315,14484,22915,38396,5881, 7772, 9160, 36053,3443, 1021, 35880,40679,32803,43507,40679, 40679,34098,34896,16977,35880,2654, 2525, 34895,1343, 10718,26367,787, 1845, 40679,29149,40678,27746,21170,11395,43507,33407,99, 24125,3463, 15828,17087,20290, - 1859, 25551,28844,27184,29058,12598,37087,20729,36417,12825,43507,32811,11723,39070,34098,5061, 19653,26280,15306,21273,28624,28769,11585,39118,15305,37315,584, + 1859, 25551,28844,27184,29058,12598,37087,20729,36417,12825,43507,32811,11723,39070,34098,5061, 19653,26280,15306,21273,28624,28769,11585,39118,15305,37315,584, 6911, 16828,8607, 12600,13759,16976,14015,25650,43507,12087,38645,27672,38268,4987, 5723, 24356,37087,2593, 7155, 11144,24726,2866, 2790, 1905, 40678,16975,24550, 31006,2564, 22077,39254,16544,7831, 34070,24681,26107,17444,38645,5148, 2276, 584, 32286,35135,33407,17312,37087,18605,34895,37087,9168, 17412,29233,43506,12104, 39320,18016,25034,29232,43506,6621, 1062, 32333,34013,37253,40678,33407,43506,35635,37086,26320,35333,30248,43506,28152,10473,35880,43505,1452, 17739,29231,17443, 3303, 3514, 1473, 1607, 38644,34097,753, 22643,36581,43505,16758,4592, 43505,1470, 37922,19746,22076,34895,941, 7424, 6156, 6667, 30678,1000, 644, 23891,11905, - 16506,43505,12239,38644,22160,10832,35880,43504,19861,38644,35879,21003,1278, 6610, 40678,37086,10548,34895,410, 5739, 5744, 40677,802, 21582,22914,20538,518, + 16506,43505,12239,38644,22160,10832,35880,43504,19861,38644,35879,21003,1278, 6610, 40678,37086,10548,34895,410, 5739, 5744, 40677,802, 21582,22914,20538,518, 34397,43504,14797,693, 20772,18860,20215,5227, 4747, 38705,30279,6228, 11985,17411,26287,36842,4917, 5147, 28521,23315,32806,37086,11131,15169,10234,9681, 21262, 3560, 18974,29115,3011, 18432,9709, 7558, 334, 24546,21099,15488,28612,21478,5979, 11904,18433,27043,21377,682, 17720,25397,756, 26113,10285,12862,447, 38688, 16543,1244, 3053, 157, 14251,3909, 1606, 563, 29467,33712,8662, 7045, 43504,39344,40677,40677,10170,2102, 31100,15304,15086,5709, 43504,417, 22075,34894,18432, 24509,35879,40677,35548,32811,15486,871, 34894,14250,38644,17530,4672, 34097,23890,8625, 35879,14935,10215,391, 159, 226, 20788,14450,833, 20537,421, 34097, - 16117,29230,37086,879, 31005,4591, 43503,217, 43503,21272,13970,18897,43503,23889,13913,5743, 14641,27721,18015,15630,7046, 23491,40676,12442,27548,6175, 8585, + 16117,29230,37086,879, 31005,4591, 43503,217, 43503,21272,13970,18897,43503,23889,13913,5743, 14641,27721,18015,15630,7046, 23491,40676,12442,27548,6175, 8585, 40676,33409,18434,19551,5985, 6988, 32811,23888,37112,37085,20326,20555,33107,37085,40676,43503,39154,16542,26605,33643,35965,21791,40676,500, 21545,21261,18431, 27671,32810,19673,43502,258, 13472,4235, 21961,43502,6349, 36633,21592,40675,22507,36309,40675,32810,26822,40675,26286,4093, 6656, 15288,12493,27130,11266,10547, 36893,11903,38643,17576,6657, 21788,35488,8285, 6406, 20172,8291, 22913,40675,13339,40674,12940,36345,5122, 38643,3492, 43502,40674,43502,37085,34076,38643,40674, 38643,23549,18029,43501,35879,12951,15722,43501,43501,35878,4500, 531, 2734, 6454, 34630,38803,36229,13893,13960,40674,18537,20266,38642,391, 2090, 12607,15085, 17410,1582, 35878,30452,38302,34894,21260,899, 20087,37085,15115,17711,31496,34097,23887,4491, 31004,17442,34659,43501,38642,12314,19750,18077,20202,36059,37499, - 37084,43500,32810,13066,38642,43500,22074,18014,32810,11208,40673,37084,23369,38642,43500,34096,21271,17441,43500,38641,24566,30614,43499,40673,20536,27670,760, + 37084,43500,32810,13066,38642,43500,22074,18014,32810,11208,40673,37084,23369,38642,43500,34096,21271,17441,43500,38641,24566,30614,43499,40673,20536,27670,760, 43499,31003,37084,338, 1919, 38641,9613, 26279,11207,16541,3902, 43499,33406,32962,38330,35024,40673,18489,13912,9335, 39211,33445,25033,14483,32263,25411,10246, 16974,16505,38790,13694,23886,43499,32809,35878,40673,40672,33406,38641,33406,15721,37084,35878,43498,27669,25786,9210, 40672,26278,12193,38510,40672,35877,40672, 43498,249, 27138,10107,32451,14444,9768, 24542,19385,29336,29511,32910,26402,18482,32894,19559,9472, 43498,19028,34894,33246,452, 43498,26417,35877,43497,35877, 6857, 16084,4712, 16371,11139,35877,33406,18430,35876,35876,6, 17847,1033, 25763,26370,8849, 4512, 22476,9672, 24727,32916,32978,20835,18728,25766,20899,30758, 13203,17230,22553,27011,26448,32135,1652, 8084, 8118, 8788, 3135, 43497,15729,16606,35876,33505,9676, 13937,14407,11271,17676,9936, 13928,8247, 36408,40671,16893, - 18088,17813,2116, 18663,37083,40671,238, 27433,22542,7519, 932, 31112,33405,1018, 16540,14605,1583, 25227,5124, 40671,29229,16686,43497,6, 7896, 40671,1272, - 7139, 37709,36097,38641,35302,34096,21259,40670,36070,33405,17465,33937,13510,43497,34468,7698, 33170,37040,12313,27686,43496,43496,16504,18429,20535,14249,4473, - 1788, 10440,29810,10784,6932, 8838, 34828,25525,18449,40670,1383, 16756,10472,35760,105, 1343, 2456, 12233,7423, 17409,8775, 27263,36428,38640,16973,23885,278, + 18088,17813,2116, 18663,37083,40671,238, 27433,22542,7519, 932, 31112,33405,1018, 16540,14605,1583, 25227,5124, 40671,29229,16686,43497,6, 7896, 40671,1272, + 7139, 37709,36097,38641,35302,34096,21259,40670,36070,33405,17465,33937,13510,43497,34468,7698, 33170,37040,12313,27686,43496,43496,16504,18429,20535,14249,4473, + 1788, 10440,29810,10784,6932, 8838, 34828,25525,18449,40670,1383, 16756,10472,35760,105, 1343, 2456, 12233,7423, 17409,8775, 27263,36428,38640,16973,23885,278, 34427,6906, 32948,26715,125, 35939,25758,29064,23938,17932,18625,35118,40670,10546,10087,7055, 8519, 10763,5365, 38640,33405,29228,37083,37083,2229, 37215,23884, - 3212, 10545,43496,34893,976, 34126,35876,320, 3599, 26453,7813, 4436, 3491, 1312, 17142,32053,23584,33405,27668,12606,16503,19860,40670,15084,40669,8238, 9886, + 3212, 10545,43496,34893,976, 34126,35876,320, 3599, 26453,7813, 4436, 3491, 1312, 17142,32053,23584,33405,27668,12606,16503,19860,40670,15084,40669,8238, 9886, 29472,8800, 17009,35486,16057,12560,18620,29235,33781,8797, 5501, 32867,8834, 26739,32936,8459, 12575,10350,2879, 767, 12168,14960,19539,18019,22384,34630,26082, 16236,24550,12649,24120,19517,23574,29353,29588,20473,20964,14102,27465,31581,7606, 9149, 12828,27456,17451,33919,36413,35686,109, 20922,15994,7741, 38640,36841, - 1058, 32260,38637,12073,10762,11035,21875,37083,237, 26653,25198,7977, 15083,15720,15059,20657,11902,27667,10965,27929,29878,1616, 18428,12349,11973,3266, 7740, + 1058, 32260,38637,12073,10762,11035,21875,37083,237, 26653,25198,7977, 15083,15720,15059,20657,11902,27667,10965,27929,29878,1616, 18428,12349,11973,3266, 7740, 15328,27064,2984, 1951, 17373,27077,12000,27742,37082,30076,3284, 3052, 20328,27498,6322, 33685,14205,26277,14604,29238,2632, 17408,17496,19183,43496,32809,34893, - 21270,16516,14603,40669,254, 10328,32809,2664, 5146, 7976, 15924,13969,11901,1047, 6302, 11584,34096,2808, 2507, 29227,43495,12535,166, 29109,645, 5128, 2303, + 21270,16516,14603,40669,254, 10328,32809,2664, 5146, 7976, 15924,13969,11901,1047, 6302, 11584,34096,2808, 2507, 29227,43495,12535,166, 29109,645, 5128, 2303, 37082,737, 3371, 2455, 20534,33175,10539,40669,37082,34893,4556, 944, 34096,43495,918, 256, 788, 17324,5922, 7329, 21258,38640,453, 6031, 43495,40669,29226, - 38639,14248,33404,33404,3018, 14482,40668,4407, 40668,4070, 7356, 22912,31002,32809,33404,13338,34095,35097,38639,40668,40668,12605,38639,43495,10327,19859,5974, + 38639,14248,33404,33404,3018, 14482,40668,4407, 40668,4070, 7356, 22912,31002,32809,33404,13338,34095,35097,38639,40668,40668,12605,38639,43495,10327,19859,5974, 20533,34893,40667,4406, 20532,194, 2473, 10270,29034,29605,28284,32591,3995, 9885, 30810,36172,9086, 38698,14481,25905,6196, 8551, 2343, 12831,18733,32820,13018, 32808,1897, 25032,23324,6975, 14247,34892,26276,1540, 34095,43494,37082,10318,38639,40667,39201,37949,29225,43494,40667,31725,33404,36113,33403,34095,22073,34187, 30725,13968,1872, 6151, 32741,33391,4972, 6006, 11310,2005, 141, 8297, 21803,38638,1844, 1007, 34095,35875,27875,18604,25031,35875,14246,43494,34892,37081,27666, 40667,38638,39018,33364,37817,37206,3370, 33403,22911,3978, 43494,38638,37081,1308, 17512,26275,29224,38638,34904,40666,43493,38378,13017,14388,32808,37081,34892, - 22072,35875,34892,11612,14946,43493,17407,26274,32808,38637,4211, 23883,25030,9334, 34094,18427,19858,547, 25, 7910, 9612, 21269,40666,5841, 37081,17440,39, + 22072,35875,34892,11612,14946,43493,17407,26274,32808,38637,4211, 23883,25030,9334, 34094,18427,19858,547, 25, 7910, 9612, 21269,40666,5841, 37081,17440,39, 26601,40666,43493,1272, 38637,30870,19820,40666,40665,43493,8799, 15082,8969, 5054, 43492,23882,34891,2206, 34094,40665,38637,38637,25029,37080,29223,35875,21268, - 37080,23423,37080,2113, 31681,13561,18179,4830, 27112,27925,19324,33403,35500,32865,34791,21267,35874,13065,14085,411, 17191,10317,18426,35126,1834, 37080,8281, + 37080,23423,37080,2113, 31681,13561,18179,4830, 27112,27925,19324,33403,35500,32865,34791,21267,35874,13065,14085,411, 17191,10317,18426,35126,1834, 37080,8281, 9730, 34891,33546,31816,7719, 10936,27487,30183,1639, 17406,12604,1548, 40665,5005, 40665,32256,37066,26215,27665,35998,9209, 35874,43492,43492,32808,19745,19744, 11900,39168,18425,35874,37079,35874,30464,35894,43492,43491,6238, 40664,13337,33403,37079,40664,43491,34094,6137, 34756,13733,22071,9390, 4931, 15468,12603,18162, 9115, 11065,38504,3969, 34094,35888,7975, 6844, 5795, 6053, 36239,5357, 25027,35873,21266,19203,172, 22037,32814,37320,25164,31001,3760, 34446,1362, 38486,33660, - 32777,17399,13199,38636,14860,12485,3720, 18424,13016,18423,14245,40664,37079,34891,43491,15703,43491,40664,37079,35873,25028,34093,17405,18422,9333, 37120,814, - 553, 10761,10397,2448, 4092, 8086, 32311,37078,36020,6709, 15719,13041,32742,34305,34891,38636,7154, 16502,18421,34906,656, 1502, 4715, 11464,30743,1985, 5840, + 32777,17399,13199,38636,14860,12485,3720, 18424,13016,18423,14245,40664,37079,34891,43491,15703,43491,40664,37079,35873,25028,34093,17405,18422,9333, 37120,814, + 553, 10761,10397,2448, 4092, 8086, 32311,37078,36020,6709, 15719,13041,32742,34305,34891,38636,7154, 16502,18421,34906,656, 1502, 4715, 11464,30743,1985, 5840, 10544,34093,43490,557, 23281,10831,34510,28283,20531,7887, 35716,10460,2848, 11988,20981,32912,3369, 1106, 31633,7231, 5043, 43490,18511,19569,34890,40663,43490, 24218,2008, 2084, 9064, 4934, 43490,12312,8015, 40663,39246,11309,13967,11583,32276,13624,38354,16539,36102,27885,34470,4868, 9768, 43489,18420,14480,23359,12232, 7796, 37178,17404,13864,38431,37505,34774,37922,18419,19743,38636,32807,7855, 35111,5187, 2782, 36031,35477,5085, 4208, 4721, 4362, 7328, 21257,34890,10543,38636, 37078,5060, 25027,31000,4405, 34890,38635,17403,35156,33817,40663,43489,29222,40663,33402,6238, 17402,34890,3478, 3775, 6390, 6065, 3677, 10225,9895, 16501,20504, 38856,34390,39341,38635,35873,43489,35873,10760,34703,30401,19742,17401,20530,43489,40662,37078,22215,33101,3442, 14945,37078,43488,37077,27876,40662,21265,22031, 19093,38635,5902, 1009, 36934,23316,17690,4522, 25684,33175,38635,43488,38634,21264,16972,9611, 40662,43488,43488,38634,1594, 8976, 40662,15081,12788,23184,37314, - 14479,14913,10542,8661, 15080,15718,656, 31959,2084, 3513, 17439,26997,3080, 18209,2955, 31093,25656,3006, 34093,3391, 30999,7964, 2645, 37405,38634,33402,7057, - 34889,40661,8624, 27227,3015, 8851, 15079,21096,13627,5319, 839, 32807,740, 21710,28493,7859, 37386,8726, 15717,33968,18791,18506,15429,15916,34450,2358, 4412, - 26490,36774,1954, 17704,32995,11587,33043,7506, 2453, 21477,14504,3245, 40661,10829,14811,6226, 14051,4404, 20529,19506,2888, 4671, 33872,9610, 43487,19857,3675, + 14479,14913,10542,8661, 15080,15718,656, 31959,2084, 3513, 17439,26997,3080, 18209,2955, 31093,25656,3006, 34093,3391, 30999,7964, 2645, 37405,38634,33402,7057, + 34889,40661,8624, 27227,3015, 8851, 15079,21096,13627,5319, 839, 32807,740, 21710,28493,7859, 37386,8726, 15717,33968,18791,18506,15429,15916,34450,2358, 4412, + 26490,36774,1954, 17704,32995,11587,33043,7506, 2453, 21477,14504,3245, 40661,10829,14811,6226, 14051,4404, 20529,19506,2888, 4671, 33872,9610, 43487,19857,3675, 30998,15078,34093,37003,21878,1955, 2754, 6910, 22740,35042,35872,34889,21256,18418,11611,9456, 24199,37422,12801,39299,43487,4636, 27603,20754,34715,24909,40661, - 8284, 8445, 14986,24024,1090, 649, 2037, 5298, 36756,32259,7834, 9210, 26764,13363,24317,7854, 19741,20494,6712, 38634,6724, 19856,1375, 18417,9619, 30386,6057, + 8284, 8445, 14986,24024,1090, 649, 2037, 5298, 36756,32259,7834, 9210, 26764,13363,24317,7854, 19741,20494,6712, 38634,6724, 19856,1375, 18417,9619, 30386,6057, 1603, 2713, 5899, 2855, 783, 38633,4392, 1888, 11622,36602,870, 29892,5901, 14462,31279,5479, 22497,1794, 19241,30475,11610,11034,16500,38832,38707,35812,10880, 35881,32807,35872,9024, 1607, 11076,18416,21255,17438,18415,10773,6850, 10689,5256, 10687,43487,12231,11582,43487,43486,16499,15716,39277,37077,29221,13064,34889, 29773,19740,3142, 1158, 4047, 4556, 3401, 573, 38551,1756, 4739, 5708, 13012,32807,37077,40661,11634,19739,21254,24475,11033,14572,17400,14684,28270,16498,37028, 25733,21205,37077,18414,19302,37076,40660,14944,37076,9890, 20528,7788, 10095,34840,12824,32799,38955,9927, 28407,11032,38171,23678,19738,33402,40660,33402,40660, 43486,34203,40660,30997,43486,19855,43486,14943,10658,40659,18013,43485,18413,33693,33581,34715,38633,27664,10657,29220,10316,19737,19736,16486,945, 3932, 26273, - 9314, 17399,37190,5900, 10541,43485,26272,40659,34092,11609,16497,38633,35872,19735,20847,38633,3652, 40659,34889,34888,38632,34888,14942,40659,34888,30349,8518, + 9314, 17399,37190,5900, 10541,43485,26272,40659,34092,11609,16497,38633,35872,19735,20847,38633,3652, 40659,34889,34888,38632,34888,14942,40659,34888,30349,8518, 18278,16496,38879,13394,14478,17979,40658,19854,34092,12579,10025,38632,32806,7649, 26271,27663,27662,34888,37076,40658,43485,37076,14092,43485,37075,33401,11004, - 20527,40658,34887,34887,43484,38632,34887,40658,43484,29219,35872,29218,6003, 15077,8884, 25188,8660, 9208, 14602,34092,38632,40657,43484,35871,40657,35871,6301, - 30996,32806,37075,7963, 33401,43484,38631,521, 19853,1650, 15303,43483,38631,34887,13336,18603,40657,8169, 35871,35871,32806,35870,43483,43483,6303, 7517, 8850, + 20527,40658,34887,34887,43484,38632,34887,40658,43484,29219,35872,29218,6003, 15077,8884, 25188,8660, 9208, 14602,34092,38632,40657,43484,35871,40657,35871,6301, + 30996,32806,37075,7963, 33401,43484,38631,521, 19853,1650, 15303,43483,38631,34887,13336,18603,40657,8169, 35871,35871,32806,35870,43483,43483,6303, 7517, 8850, 40657,43483,43482,40656,20526,2640, 34092,4436, 34091,7697, 12630,40656,35697,43482,40656,43482,40656,40655,25026,10471,20525,14941,30995,35321,33401,43482,10326, 13151,38170,19170,43481,37083,8112, 12230,10279,6242, 24574,22070,18602,43481,20524,40655,40655,8231, 43481,23846,939, 816, 43481,37075,37595,26048,40655,33401, 33699,26270,18412,25025,34886,31877,37075,9992, 38631,36180,32806,12311,37074,21263,38580,35448,16443,14078,33423,821, 30994,34886,43480,26933,29217,31671,33400, @@ -14497,12 +14492,12 @@ static const unsigned short Ranks[197839] = 43478,37074,38630,40653,43478,927, 11899,40653,12823,38022,21253,8517, 838, 37073,34886,29215,38630,36928,33400,19734,5203, 40652,2628, 34287,43478,40652,33400, 34090,43478,21261,40652,35730,13334,30991,34886,34090,2745, 32805,43477,40652,34090,29214,37073,37073,18601,31218,15701,2177, 8283, 30990,17437,800, 37073,18012, 27659,5597, 43477,30989,37072,14244,6856, 26268,5092, 9332, 43477,43477,40651,34885,18600,40651,21260,43476,27658,33399,14243,33399,34089,1014, 43476,33399,38630, - 43476,35870,40651,43476,15150,2031, 38629,13626,38629,11851,24572,13625,37072,29213,38629,35870,35220,13063,40651,35870,2749, 21259,34089,2789, 3034, 8659, 5173, + 43476,35870,40651,43476,15150,2031, 38629,13626,38629,11851,24572,13625,37072,29213,38629,35870,35220,13063,40651,35870,2749, 21259,34089,2789, 3034, 8659, 5173, 35869,40650,336, 43475,12086,7103, 30988,43475,19733,43475,43475,13911,34089,34089,34088,37072,8975, 40650,35269,13624,3512, 43474,33067,34885,32805,34885,38629, 43474,40650,25024,37778,37072,12602,14242,22069,40650,4214, 10966,3641, 35814,3811, 11321,43474,35869,43474,40649,43473,37071,2566, 34088,19906,8623, 516, 34088, 43473,35869,37071,26271,35869,23691,43473,35868,1371, 6725, 20904,35516,22166,11552,24820,43473,26923,43472,43472,34080,29212,43472,18358,34088,4953, 1237, 13623, - 34885,13560,37071,29206,3490, 43472,325, 29211,34884,32805,38628,43471,19196,40649,32805,27657,22909,43471,34884,2312, 37071,35796,32804,6237, 439, 36397,6236, - 31482,2601, 36018,14447,15970,25185,43471,38628,38628,39041,16495,9680, 2746, 10315,18411,33079,2524, 38342,20845,1794, 16494,3947, 3211, 3296, 13471,11581,3598, + 34885,13560,37071,29206,3490, 43472,325, 29211,34884,32805,38628,43471,19196,40649,32805,27657,22909,43471,34884,2312, 37071,35796,32804,6237, 439, 36397,6236, + 31482,2601, 36018,14447,15970,25185,43471,38628,38628,39041,16495,9680, 2746, 10315,18411,33079,2524, 38342,20845,1794, 16494,3947, 3211, 3296, 13471,11581,3598, 1010, 43471,35868,43470,22068,14940,34878,14713,21108,2103, 26267,30792,16173,35943,35140,27220,43470,17170,7153, 15715,25023,21258,5220, 11308,15076,2205, 19732, 25022,32804,4345, 43470,35868,15999,38066,25577,25852,1551, 38190,16493,1835, 7327, 3837, 6405, 1816, 26266,5921, 16538,2260, 27428,24670,21655,23256,366, 43470, 38628,36964,43469,43469,40649,34884,37070,35868,34087,38627,40649,43469,38627,38627,37070,35867,40648,21252,43469,43468,34884,38627,10902,40648,37070,38626,20522, @@ -14511,7 +14506,7 @@ static const unsigned short Ranks[197839] = 34086,11850,1631, 28237,37068,1882, 3597, 30986,38626,10509,7438, 219, 18598,32804,34882,488, 12085,3233, 23955,37068,43467,43467,19852,18011,40646,10181,27656, 35867,2565, 34086,26265,27655,7615, 6302, 40646,34086,40646,11606,2637, 3041, 1758, 33082,8590, 1018, 38350,43466,5701, 20520,34086,18597,26264,34882,19851,22574, 43466,8622, 35866,4320, 7138, 40645,35866,34085,37239,33713,40645,3005, 16970,40645,7778, 35866,37068,18410,1199, 1734, 29252,15713,16373,31714,16360,26478,21734, - 26009,28132,15509,18930,15318,16962,6229, 19295,33082,19445,36439,37068,37750,7290, 21251,40645,2287, 25020,20519,26263,43466,9207, 40644,37067,15075,5186, 8366, + 26009,28132,15509,18930,15318,16962,6229, 19295,33082,19445,36439,37068,37750,7290, 21251,40645,2287, 25020,20519,26263,43466,9207, 40644,37067,15075,5186, 8366, 15192,33398,40644,5027, 43466,33397,43465,5742, 3274, 4904, 2957, 35866,40644,32803,30985,2358, 14477,8519, 30176,43465,24851,27654,35198,39070,18409,38626,22907, 30984,9679, 33397,35865,37821,37067,8621, 38626,38983,37067,38625,38625,1655, 3242, 3409, 2813, 32803,16116,43465,25019,35865,22067,43465,37765,23906,15645,38625, 2741, 838, 13909,14241,10325,43464,34882,40644,22906,16969,22905,43464,7056, 35865,23880,40643,14939,10180,25018,37067,19850,40643,14601,43464,27653,29210,43464, @@ -14529,17 +14524,17 @@ static const unsigned short Ranks[197839] = 35352,25622,15714,2411, 16490,933, 40638,21255,18407,2196, 34408,34741,7071, 37364,32802,43459,35453,37871,10759,38621,37064,35863,5325, 494, 7027, 10710,31097, 26711,30203,25879,32498,29675,10337,40638,74, 32059,10292,2454, 2244, 33078,4744, 16587,19560,3596, 32801,32221,1951, 19193,26429,34309,40637,16968,11898,17398, 17436,34084,4090, 17133,1822, 20517,13622,1793, 5839, 32801,16536,16967,22064,43458,11849,2467, 7399, 9739, 38621,40637,35862,2966, 16489,34879,40, 9328, 29549, - 24073,1936, 1484, 11848,32801,578, 23549,21916,21254,30979,43458,25015,40637,18699,5864, 10216,5686, 11306,21248,40637,33395,32801,40636,40636,39055,6611, 6666, - 6014, 10766,32930,16610,6210, 27750,13224,43458,32800,35541,20069,3883, 6949, 16527,32116,33540,34879,43458,10675,951, 43457,29203,21253,5249, 1799, 1843, 3505, + 24073,1936, 1484, 11848,32801,578, 23549,21916,21254,30979,43458,25015,40637,18699,5864, 10216,5686, 11306,21248,40637,33395,32801,40636,40636,39055,6611, 6666, + 6014, 10766,32930,16610,6210, 27750,13224,43458,32800,35541,20069,3883, 6949, 16527,32116,33540,34879,43458,10675,951, 43457,29203,21253,5249, 1799, 1843, 3505, 33285,35325,15183,23877,10758,38621,38621,31332,33460,34083,2738, 32877,9484, 8516, 21384,22901,29835,1031, 30978,17397,32454,21247,33395,37230,22852,34200,34879, - 596, 11820,24835,19612,40636,1348, 34083,34083,2909, 14869,3674, 18347,14240,32942,38620,40636,30977,36723,39256,40635,36152,7240, 38620,38454,25747,30976,749, - 43457,40635,3051, 30975,37064,43457,34083,39186,7787, 27649,19192,22063,19849,34684,7663, 37016,2663, 9841, 29640,6004, 292, 9769, 2407, 10357,2218, 10584,9206, + 596, 11820,24835,19612,40636,1348, 34083,34083,2909, 14869,3674, 18347,14240,32942,38620,40636,30977,36723,39256,40635,36152,7240, 38620,38454,25747,30976,749, + 43457,40635,3051, 30975,37064,43457,34083,39186,7787, 27649,19192,22063,19849,34684,7663, 37016,2663, 9841, 29640,6004, 292, 9769, 2407, 10357,2218, 10584,9206, 34082,43457,12820,35862,43456,25290,12578,2370, 22437,12320,29202,43456,2700, 37760,6904, 21246,36055,5566, 6506, 10129,8528, 2656, 17683,1824, 1301, 33395,38529, 43456,43456,34878,4913, 40635,38620,6095, 2823, 3934, 5627, 6830, 4034, 38620,40635,43455,30974,43455,23876,43455,40634,19728,8448, 38559,27851,11586,14476,19727, 26414,7677, 24859,2439, 10865,3661, 9926, 26582,34878,21245,25996,34878,37064,32800,40634,25014,17362,25507,17396,8223, 16690,6405, 28033,37064,14998,34405,22772, 8349, 17395,6271, 18406,2822, 39339,5593, 21167,4227, 33121,9678, 26041,9884, 3481, 2987, 10211,43455,38840,35862,14600,18010,19191,35862,38619,33395,32800,40634, 43454,7738, 15713,22482,14475,37804,18963,31030,38619,13966,37768,15712,2094, 3259, 1971, 13077,10757,17394,21244,34878,43454,4501, 43454,10699,7239, 6170, 37374, - 10540,43454,33394,33394,37655,43453,13881,15663,2019, 5294, 34877,10179,37063,38619,23551,34009,33069,4450, 37407,37517,21243,1201, 10323,38619,34082,40634,1902, + 10540,43454,33394,33394,37655,43453,13881,15663,2019, 5294, 34877,10179,37063,38619,23551,34009,33069,4450, 37407,37517,21243,1201, 10323,38619,34082,40634,1902, 15712,10085,11030,21242,38024,19133,38197,43453,43453,11847,34082,6005, 38618,40633,21252,37063,40633,43453,35036,38618,34248,35861,27149,2421, 21646,5039, 38618, 37063,33394,40633,36924,27557,38696,33394,32211,13783,30551,158, 11829,29203,10470,33142,21251,43452,34877,43452,43452,43452,43451,40633,40632,43451,32800,43451, 43451,40632,7238, 9536, 38618,5051, 30178,37063,38617,35861,22178,38617,34877,43450,37062,34082,39098,40632,552, 30973,38617,33393,17627,35861,40632,43450,23875, @@ -14549,43 +14544,43 @@ static const unsigned short Ranks[197839] = 25583,43447,171, 9392, 20247,38195,15700,16114,43447,17908,13014,35860,22900,33393,14937,25012,19726,43447,19848,5554, 7055, 30971,30970,33107,38615,27646,43447, 40630,30098,26260,43446,23874,21648,34643,13114,38615,35860,40630,13907,38028,32846,1572, 33545,13103,37062,4295, 38615,18479,38615,40629,7874, 31595,38614,40629, 43446,33392,40629,34875,17814,16535,9473, 43446,3045, 18009,40629,34080,35521,38614,35860,34875,43446,20515,26259,36010,38614,13184,8484, 4464, 2793, 4167, 17670, - 13779,6473, 8402, 2352, 28667,32124,16966,22062,38614,43445,15699,9331, 33614,40628,15301,34875,43445,26258,43445,30557,34875,23873,12819,1937, 347, 1635, 2746, + 13779,6473, 8402, 2352, 28667,32124,16966,22062,38614,43445,15699,9331, 33614,40628,15301,34875,43445,26258,43445,30557,34875,23873,12819,1937, 347, 1635, 2746, 1040, 4802, 8088, 21495,25405,35360,28987,8968, 38204,18405,19725,21240,35414,35077,15199,23670,29200,35184,18997,23872,43445,1826, 3400, 13013,17952,24399,10539, 15708,34614,10091,663, 1946, 38990,1222, 7853, 43444,32799,37177,35859,25222,33392,18596,34080,31806,35859,892, 29199,40628,23871,43444,12577,40628,9609, 35859, - 25367,33392,22899,11401,10830,34874,30546,5356, 43444,38216,31478,16965,33636,31370,35859,321, 23459,8363, 1110, 15827,13702,2721, 8127, 23946,435, 1948, 3909, + 25367,33392,22899,11401,10830,34874,30546,5356, 43444,38216,31478,16965,33636,31370,35859,321, 23459,8363, 1110, 15827,13702,2721, 8127, 23946,435, 1948, 3909, 4545, 1699, 12576,35285,5166, 38613,43444,40628,3745, 37062,15698,25164,6223, 1881, 1119, 3517, 409, 4245, 16511,32914,43443,13012,35858,43443,18595,4187, 43443, 33392,1030, 22061,10655,1969, 23609,40627,21840,8515, 5679, 24802,35858,32799,43443,12083,34080,43442,5059, 43442,38613,32799,38613,33391,498, 40627,39075,20514, 38613,34874,15073,16488,43442,35858,40627,43442,35858,40627,19847,43441,37403,43441,38612,11605,9608, 8168, 6785, 4267, 38778,33239,32798,43441,22488,19403,14142, 32550,20513,10419,7808, 14307,1124, 2469, 5145, 4091, 3004, 33391,3504, 9313, 6169, 17393,434, 21239,43441,37584,33282,34874,18870,31916,30866,32105,10023,43440, 38612,30969,43440,5744, 9472, 33936,18008,4531, 40626,25011,14474,37177,26674,16820,27645,37062,1790, 6620, 950, 37061,32798,37838,35291,18404,35828,32619,32798, - 40626,35857,5465, 43440,37061,34874,43440,4268, 40626,2968, 4144, 35857,3732, 27723,20575,10756,29524,369, 4948, 24895,29632,13764,35316,37061,11193,848, 9380, - 1044, 3440, 4821, 2600, 6168, 5431, 15072,2166, 3141, 33953,38335,19724,37061,38431,43439,29198,6756, 15071,17037,5097, 33833,4564, 10316,40626,1792, 2250, 6641, + 40626,35857,5465, 43440,37061,34874,43440,4268, 40626,2968, 4144, 35857,3732, 27723,20575,10756,29524,369, 4948, 24895,29632,13764,35316,37061,11193,848, 9380, + 1044, 3440, 4821, 2600, 6168, 5431, 15072,2166, 3141, 33953,38335,19724,37061,38431,43439,29198,6756, 15071,17037,5097, 33833,4564, 10316,40626,1792, 2250, 6641, 1104, 9677, 5490, 18430,9017, 21238,34369,38612,21249,43439,40625,4370, 15373,4358, 9634, 3915, 38408,7491, 794, 2973, 3845, 7852, 15461,34080,19723,3295, 33478, 11395,40625,8967, 24997,43439,10755,7163, 30898,9866, 9143, 40625,18594,40625,12805,17967,33766,4148, 23315,35643,1828, 1438, 35058,34672,5886, 4354, 17324,12986, 22708,17859,12229,33926,29197,40624,8365, 21237,27669,21236,33391,29242,38612,38611,34079,43439,37189,22836,32798,43438,40624,43438,17794,43438,34873,38200,22898, 32386,37060,37060,7737, 11029,21235,17392,8798, 35626,6903, 13011,37060,38611,43438,6482, 19722,11305,30463,19721,2345, 19720,38891,15038,34079,40624,10177,15707, - 10237,20816,35857,736, 6879, 40624,34079,25010,43437,30968,35857,32797,16964,43437,26257,43437,40623,43437,36314,40623,43436,21248,38611,36176,43436,10022,7137, + 10237,20816,35857,736, 6879, 40624,34079,25010,43437,30968,35857,32797,16964,43437,26257,43437,40623,43437,36314,40623,43436,21248,38611,36176,43436,10022,7137, 43436,35856,38611,37060,38610,7851, 23928,32930,26204,9506, 25009,35856,43436,38610,27166,43435,33391,35856,14488,43435,43435,35856,11254,37859,19803,38668,20000, - 3337, 4551, 18517,38610,13338,16639,29648,8446, 34914,32797,31949,11710,8196, 10952,40623,38429,34459,37059,34079,21247,20512,20190,36927,29412,26256,17427,2916, + 3337, 4551, 18517,38610,13338,16639,29648,8446, 34914,32797,31949,11710,8196, 10952,40623,38429,34459,37059,34079,21247,20512,20190,36927,29412,26256,17427,2916, 7289, 40623,35802,29872,37059,35855,30700,25008,40622,32797,21915,40622,9676, 2374, 4861, 18403,10313,32598,38610,7437, 18593,8401, 30967,35855,34541,8619, 20511, 38609,43435,35855,40622,1205, 29994,372, 3439, 3378, 1427, 221, 5063, 27335,2735, 34333,4087, 34078,33966,43434,25007,30966,40622,19846,19189,28538,38609,40621, 4882, 13062,4391, 29196,10829,15700,38609,10021,40621,43434,38609,36815,5681, 31226,11029,21234,15706,12600,23809,31504,8487, 13222,1617, 1796, 30965,43434,34078, - 35204,1366, 7336, 20254,32405,3122, 24838,15070,18146,897, 12640,12599,18519,19719,29195,5401, 37059,17435,40621,6937, 22896,7484, 12581,703, 9882, 21297,350, + 35204,1366, 7336, 20254,32405,3122, 24838,15070,18146,897, 12640,12599,18519,19719,29195,5401, 37059,17435,40621,6937, 22896,7484, 12581,703, 9882, 21297,350, 14046,34078,32797,43434,37059,1276, 33390,15697,19188,33390,5430, 40621,13010,5345, 27429,15705,38608,12082,38608,3281, 11205,43433,38608,18592,22633,2770, 18206, 4588, 16445,24532,4319, 10956,34078,16487,34077,15293,35691,13190,487, 20063,2176, 27644,11120,37058,12987,11469,38608,38607,2708, 2667, 2258, 11002,29194,40620, 40620,6843, 2495, 13240,7534, 18609,32796,34873,14473,4090, 10227,22038,37433,10084,13009,15069,19718,9289, 35102,29193,43433,2958, 37353,3534, 30597,30964,38607, 9888, 8618, 6696, 16364,7873, 43433,21233,38545,40620,38264,38607,438, 7214, 35996,23888,11846,5165, 35855,40620,380, 20544,37058,28160,26993,40619,34077,30963, 25006,32796,43433,38607,27643,37058,43432,758, 32796,34077,16534,16963,40619,13332,6083, 17678,43432,18402,43432,38606,32796,14556,294, 10325,32837,20532,39354, 39040,24418,9205, 40619,40619,43432,43431,43431,8518, 17434,34873,4052, 34307,40618,37058,29192,43431,33390,43431,21359,38606,21246,32869,38763,18756,37482,22897, - 22527,5646, 3079, 12712,14685,16101,12474,29157,20955,35298,9515, 32881,6697, 32688,27124,19995,35682,28748,14777,14636,28838,2036, 2369, 31674,13250,4688, 2444, + 22527,5646, 3079, 12712,14685,16101,12474,29157,20955,35298,9515, 32881,6697, 32688,27124,19995,35682,28748,14777,14636,28838,2036, 2369, 31674,13250,4688, 2444, 22585,27221,14184,17716,920, 24266,28522,6131, 18076,12314,27067,22045,8640, 34656,6419, 38606,31186,37057,25848,38760,32694,33103,32325,25705,33648,36124,38265, 37469,40618,2605, 35135,35531,38575,32451,22914,27312,34191,40618,37057,21245,10748,28734,8197, 33822,36213,35854,30554,33952,43430,38219,36521,35954,31278,21159, 38340,34491,35278,3595, 36123,38261,37243,5242, 7326, 21232,9756, 33468,130, 7040, 19062,32278,4905, 26773,14254,16853,28875,17391,18534,6987, 29166,12900,43430, - 40618,33875,25560,36969,20376,38667,28408,38858,23555,37220,32971,27264,9312, 4095, 16701,16486,3540, 5861, 19717,14636,7554, 14867,26138,5877, 9304, 43430,2423, + 40618,33875,25560,36969,20376,38667,28408,38858,23555,37220,32971,27264,9312, 4095, 16701,16486,3540, 5861, 19717,14636,7554, 14867,26138,5877, 9304, 43430,2423, 3147, 22773,19696,18592,33536,4045, 6842, 19415,8242, 33337,23684,3388, 38864,39097,2978, 9225, 12598,13469,37808,33003,37323,7388, 7309, 33946,40617,2367, 15359, 33823,43430,5938, 82, 26536,1715, 24499,17844,26227,22425,21532,29945,30713,24472,32812,11638,22021,1006, 1334, 96, 5919, 20868,24398,32342,21767,50, 10096, - 33908,40617,22060,40617,11788,887, 403, 273, 23642,40617,26544,3048, 25528,36150,4204, 3655, 9505, 18401,7224, 17830,24253,31105,31007,33905,9311, 31097,2325, - 1872, 6516, 37036,37226,33917,21231,38412,33648,28391,17873,15704,21230,23384,94, 34077,11579,35854,34076,35854,27642,34873,30962,40616,4051, 35854,30961,9883, + 33908,40617,22060,40617,11788,887, 403, 273, 23642,40617,26544,3048, 25528,36150,4204, 3655, 9505, 18401,7224, 17830,24253,31105,31007,33905,9311, 31097,2325, + 1872, 6516, 37036,37226,33917,21231,38412,33648,28391,17873,15704,21230,23384,94, 34077,11579,35854,34076,35854,27642,34873,30962,40616,4051, 35854,30961,9883, 35403,16113,26255,38606,8745, 43429,37057,17433,23870,15300,40616,40616,16533,26254,40616,34872,33390,35853,34872,43429,33389,30810,6167, 33389,34076,14335,13965, 34872,43429,6300, 43429,38605,4029, 27641,15068,23869,10835,25005,32795,9165, 32783,27640,25004,40615,37695,17892,36728,16691,43428,43428,19845,13357,16485,43428, 211, 6303, 32833,16024,23028,10143,34872,33389,29191,6584, 1243, 32869,35853,18400,4943, 6090, 13906,458, 12310,34871,38605,1054, 9956, 30960,37057,406, 35853, @@ -14596,7 +14591,7 @@ static const unsigned short Ranks[197839] = 35852,16304,35852,43426,547, 13739,22746,18590,2714, 31879,1986, 19844,40612,30959,38604,22059,33388,27639,12602,19712,43426,29861,7631, 18986,9330, 35852,43425, 19106,36077,12309,35852,38604,33388,37056,32786,6855, 34076,35851,15642,22058,33388,3301, 33388,32795,40612,10175,13905,32795,22057,37056,1456, 12947,465, 10313, 19083,43425,35851,27991,43425,40612,2369, 8175, 1177, 33387,34075,3191, 21242,32794,37055,37300,32962,13007,35851,37055,25780,33045,1936, 14239,11599,32794,43425, - 40612,1808, 35851,29190,37055,32794,34075,11576,33387,43424,7355, 34075,19187,38603,34870,34075,35850,11897,34074,43424,34074,34563,3808, 6863, 22980,730, 1807, + 40612,1808, 35851,29190,37055,32794,34075,11576,33387,43424,7355, 34075,19187,38603,34870,34075,35850,11897,34074,43424,34074,34563,3808, 6863, 22980,730, 1807, 234, 16354,4035, 33380,23396,7417, 8472, 19602,16725,7207, 1982, 5913, 4316, 34074,35637,757, 2729, 2897, 33520,33387,38992,11047,10349,21640,31594,35018,35027, 6780, 17432,38603,43424,13904,32794,35850,23868,40611,14238,40611,34074,1356, 38603,29189,38690,22896,11845,31316,15053,14597,40611,27638,43424,5328, 17389,38970, 19711,12596,11020,35283,21227,18192,555, 12509,16272,27637,10538,2082, 31471,7614, 29791,14947,37153,3056, 16484,1514, 38937,33387,26504,37055,7613, 43423,37054, @@ -14605,8 +14600,8 @@ static const unsigned short Ranks[197839] = 5393, 37053,17210,19977,35850,33386,38602,22008,31404,14236,38602,14400,33386,43422,40610,17770,43422,43422,36398,6300, 35849,35849,37053,12090,26108,38967,16482, 8966, 18313,30958,35849,9887, 841, 5272, 43422,43421,43421,14596,21241,2251, 24064,8765, 10020,34870,34072,40610,34073,4619, 20593,38602,8744, 38602,38601,18399, 27636,40610,43421,26251,27028,34870,38601,38601,35849,15064,13964,18398,40610,25348,19642,38601,18007,1476, 33467,27635,22056,22055,33386,762, 40609,34073,12081, - 32793,34869,17431,30957,8400, 43421,5792, 35848,37053,1883, 43420,19609,40609,40609,23867,28961,37091,9886, 5126, 6030, 40609,6029, 43420,715, 6723, 9471, 8704, - 43420,39353,13467,37933,33386,37742,29623,7612, 33385,43420,38600,34869,12603,43419,29187,27634,34869,4369, 20510,16124,15074,34977,16987,32793,4629, 4829, 1388, + 32793,34869,17431,30957,8400, 43421,5792, 35848,37053,1883, 43420,19609,40609,40609,23867,28961,37091,9886, 5126, 6030, 40609,6029, 43420,715, 6723, 9471, 8704, + 43420,39353,13467,37933,33386,37742,29623,7612, 33385,43420,38600,34869,12603,43419,29187,27634,34869,4369, 20510,16124,15074,34977,16987,32793,4629, 4829, 1388, 13292,5471, 15268,14613,31341,31381,21041,22532,18280,29270,18174,15290,19756,6967, 10283,14187,22811,18310,15266,23380,15085,29814,29804,7712, 32018,25411,29611, 6134, 19185,34073,26485,27050,37073,7786, 34869,30956,40608,10882,30955,40608,10654,40608,38600,4578, 38449,34868,38392,9476, 37053,11001,14595,14936,33106,35661, 2373, 9809, 18813,34868,12140,3378, 3068, 30031,35566,21544,3468, 19843,20553,1846, 4482, 38202,35385,31940,20509,9675, 26190,37818,40608,40607,34868,12308,21643, @@ -14616,20 +14611,20 @@ static const unsigned short Ranks[197839] = 32904,4370, 5609, 13963,8399, 34072,2003, 7021, 11575,16532,14404,2382, 38411,6265, 1399, 17388,20507,43417,35848,40607,6686, 12574,5164, 38599,34016,15699,40607, 40607,38599,43417,4186, 14594,37315,5464, 30954,5308, 8278, 29587,19409,13466,32793,7872, 27233,13005,5509, 23865,31415,31002,23864,2581, 40606,37052,38598,34072, 35847,22895,38598,10083,19709,11203,35847,33105,34867,3901, 37911,15697,21224,29004,9503, 25501,16454,35847,33385,34867,40606,369, 3815, 10312,37831,18396,38598, - 734, 27031,34312,29829,32436,34661,43417,40606,3232, 31212,2146, 5121, 43417,43416,19488,40606,5364, 39183,40605,35818,43416,37698,43416,40605,8974, 35847,6960, + 734, 27031,34312,29829,32436,34661,43417,40606,3232, 31212,2146, 5121, 43417,43416,19488,40606,5364, 39183,40605,35818,43416,37698,43416,40605,8974, 35847,6960, 1776, 8285, 14969,13033,16621,37051,20498,25278,11120,18298,34160,35951,35688,31645,583, 2322, 40605,43416,18893,15696,43415,2495, 881, 35776,12833,38649,15558, 26852,33866,17583,16480,32919,7871, 36837,5957, 37204,30953,13661,33220,34867,32790,5078, 32874,35163,33571,2939, 14237,40605,16531,10652,27955,9607, 13962,19123, 21223,27129,18460,34072,19842,32792,38598,40604,5791, 40604,38597,38597,27632,29451,38000,17993,19581,3647, 6476, 11867,4190, 2625, 32777,8265, 35132,36622,12596, - 33120,40604,27631,7973, 25003,5890, 37714,43415,6004, 26249,16479,35846,13004,5916, 3416, 6231, 24853,33724,35181,34142,13667,43415,35846,36196,37051,27630,5354, + 33120,40604,27631,7973, 25003,5890, 37714,43415,6004, 26249,16479,35846,13004,5916, 3416, 6231, 24853,33724,35181,34142,13667,43415,35846,36196,37051,27630,5354, 35764,848, 32891,496, 33436,3644, 1037, 7525, 36473,2712, 6080, 12571,907, 34515,289, 38512,5907, 25270,7961, 13744,1649, 14672,33333,5366, 8521, 14305,23548, 18735,16530,10697,30728,37190,18596,26248,35846,40604,34765,627, 38597,16332,7785, 38597,13903,38596,33385,34071,43415,37051,43414,40603,1541, 23008,9421, 17026, 3196, 40603,15698,21222,957, 4707, 23909,12762,30346,14969,6646, 22985,19325,34071,43414,5083, 35489,43414,5110, 4675, 8111, 3684, 31452,16973,7745, 9504, 33856, - 8592, 19824,33949,36362,2439, 15697,7489, 12595,5608, 8074, 9674, 34100,15575,37433,34867,40603,11400,1490, 22894,27629,23863,14593,1367, 3258, 9502, 1289, 3702, - 3948, 2171, 1325, 4667, 33649,3173, 7972, 17387,10971,7325, 12598,13961,15064,8364, 10481,13960,14472,38416,10311,43414,37621,17229,31873,35955,35476,1554, 6788, + 8592, 19824,33949,36362,2439, 15697,7489, 12595,5608, 8074, 9674, 34100,15575,37433,34867,40603,11400,1490, 22894,27629,23863,14593,1367, 3258, 9502, 1289, 3702, + 3948, 2171, 1325, 4667, 33649,3173, 7972, 17387,10971,7325, 12598,13961,15064,8364, 10481,13960,14472,38416,10311,43414,37621,17229,31873,35955,35476,1554, 6788, 5565, 33216,16478,12760,2936, 10942,14058,9164, 12594,32792,22053,32782,35286,1943, 12048,40603,35458,15142,7189, 20819,28350,38596,16821,22580,17024,17386,33576, - 14872,26247,4317, 5424, 11897,15553,19184,34071,40602,36360,35846,6639, 6146, 33137,29591,6484, 3295, 9882, 4193, 17385,37579,20450,10035,7930, 30301,19933,6755, + 14872,26247,4317, 5424, 11897,15553,19184,34071,40602,36360,35846,6639, 6146, 33137,29591,6484, 3295, 9882, 4193, 17385,37579,20450,10035,7930, 30301,19933,6755, 17994,27934,4048, 10510,3243, 39138,34537,35252,11574,21221,6902, 43413,10754,8514, 5120, 37028,31102,9991, 28592,37295,15478,13465,3129, 26716,31604,20658,17340, - 15063,33782,29847,26510,21220,39222,3746, 10938,19708,13742,7324, 7152, 36944,26161,11028,5817, 12798,21219,1470, 906, 13623,29231,5749, 5704, 3209, 1708, 8241, + 15063,33782,29847,26510,21220,39222,3746, 10938,19708,13742,7324, 7152, 36944,26161,11028,5817, 12798,21219,1470, 906, 13623,29231,5749, 5704, 3209, 1708, 8241, 13817,34490,4368, 11896,12593,10082,5764, 4903, 15688,37928,28814,14714,15369,38718,13464,3263, 11009,5635, 29772,5837, 837, 2089, 5835, 1945, 1678, 3711, 22593, 12228,36157,1186, 9310, 2726, 24181,37986,15452,27435,25205,20019,34583,21165,33860,11027,16477,22435,34834,35845,19393,26748,38596,35417,9881, 35913,18395,35920, 38691,4226, 12592,10753,7151, 3774, 6541, 10537,24776,5429, 5708, 1549, 15062,11304,2401, 38388,40602,23862,30762,21218,35798,17430,2812, 18394,38596,16476,43413, @@ -14637,36 +14632,36 @@ static const unsigned short Ranks[197839] = 13959,11895,14328,34715,16473,13345,34773,15696,35854,17915,24726,26869,32983,35792,3531, 17390,27628,35845,39043,7422, 16529,5185, 7752, 11025,16472,10081,18397, 27458,19705,19704,38941,8513, 15695,10310,33385,7850, 6224, 13168,38924,10620,16288,21216,21787,21215,4182, 5763, 22890,2637, 14187,12591,18392,38595,13958,15811, 7436, 11843,22974,544, 7007, 8110, 18391,11878,35864,9501, 8109, 13002,12573,35845,40602,3126, 20472,11303,3833, 34039,35167,15061,14471,6404, 18390,40602,13957, - 17383,39219,37983,16471,32916,14470,36133,11648,16091,12279,38595,37472,5031, 5469, 11573,33608,11560,19661,23587,33290,38583,33551,15588,16668,8512, 16653,8965, + 17383,39219,37983,16471,32916,14470,36133,11648,16091,12279,38595,37472,5031, 5469, 11573,33608,11560,19661,23587,33290,38583,33551,15588,16668,8512, 16653,8965, 18389,35201,11572,35845,9439, 10599,5801, 36999,21845,10074,33168,39104,43413,15060,4679, 4968, 22834,31865,15128,1470, 2452, 6069, 38347,3063, 13956,12227,43413, 7971, 3802, 20560,5391, 8620, 34409,14469,7970, 21075,20950,36714,13986,16065,13001,23172,35862,39148,31477,2412, 3924, 3991, 12226,9919, 36383,7098, 17382,37048, - 26245,39239,34828,17245,6117, 15152,20515,35540,9503, 33537,32822,3965, 13000,7070, 15059,6003, 7551, 9673, 7587, 17328,13342,38042,21214,10752,36927,9816, 9189, + 26245,39239,34828,17245,6117, 15152,20515,35540,9503, 33537,32822,3965, 13000,7070, 15059,6003, 7551, 9673, 7587, 17328,13342,38042,21214,10752,36927,9816, 9189, 8964, 14468,16470,14467,36316,10309,14914,13768,34783,18376,9738, 22520,37118,8114, 20530,33995,15556,11114,38678,5789, 20685,19703,10208,11969,16469,8963, 33384, 17381,9233, 34682,16898,16488,37613,33028,32795,37575,15447,10751,33938,4153, 7323, 3027, 17575,13724,18195,24799,38594,39371,15058,25623,18255,35844,34849,35844, - 10268,33282,964, 13769,4303, 18388,3361, 15793,22893,19702,12225,5880, 32792,37518,17380,37292,36952,12101,12816,33201,21855,22917,8810, 22448,43412,21239,1769, - 2512, 8199, 2652, 15389,28006,7069, 3741, 13175,1592, 8942, 6928, 25002,13955,8396, 25172,7584, 16599,34054,2807, 2264, 4266, 3237, 5119, 15694,5390, 3311, 9500, + 10268,33282,964, 13769,4303, 18388,3361, 15793,22893,19702,12225,5880, 32792,37518,17380,37292,36952,12101,12816,33201,21855,22917,8810, 22448,43412,21239,1769, + 2512, 8199, 2652, 15389,28006,7069, 3741, 13175,1592, 8942, 6928, 25002,13955,8396, 25172,7584, 16599,34054,2807, 2264, 4266, 3237, 5119, 15694,5390, 3311, 9500, 11894,37636,5722, 1641, 10155,7092, 883, 35639,6967, 20544,6156, 7751, 103, 1130, 20153,11893,24638,21213,38263,2806, 5564, 8597, 13035,2783, 2805, 11302,16806, 33426,13646,9072, 34563,2571, 4973, 11127,43412,6683, 39019,36761,23919,31807,33384,38137,40601,21238,40601,43412,35844,37051,32791,26244,19701,43412,23861,43411, 26243,33384,43411,8398, 40601,15694,8062, 5516, 27056,12818,37050,40601,13462,40600,15693,38594,15057,34866,19182,16468,43411,21212,21211,13453,6062, 25781,34951, - 38594,24610,13983,2560, 19150,24341,34866,37050,26242,16962,38594,37050,18588,43411,37050,2826, 5813, 31372,16952,13025,10302,34382,11116,20556,19748,6299, 2428, + 38594,24610,13983,2560, 19150,24341,34866,37050,26242,16962,38594,37050,18588,43411,37050,2826, 5813, 31372,16952,13025,10302,34382,11116,20556,19748,6299, 2428, 12953,8191, 15422,27496,20780,4411, 18387,17379,3140, 8240, 7033, 38135,15056,29727,10080,21210,18333,38012,33618,27903,38325,4233, 959, 12408,12636,24612,35129, 7058, 5865, 27833,3746, 16066,34071,2319, 27315,30871,22970,24220,38554,34998,33384,3591, 21209,31997,6212, 35959,37814,39406,32791,18006,23804,38799,18494,18151, 217, 5287, 14958,1646, 16706,33101,19200,24373,38593,14935,23179,34866,34206,19700,33383,907, 1746, 12999,7736, 5853, 10750,18386,15055,11328,7178, 17840,19399, 16276,2887, 38593,456, 5568, 12303,22105,12817,22628,131, 25484,37049,6722, 34293,31502,34116,23634,32791,43410,37454,38593,7695, 33299,7849, 28392,2844, 13886, 19699,38679,14684,4812, 27853,8213, 13098,38230,16506,39379,31447,33002,19698,29778,15403,12435,16543,14139,16325,11521,39392,25267,33068,7802, 28768,16485,14549, 15794,27629,20808,32144,13537,15185,13193,8037, 27476,26579,23737,43410,23310,30284,2427, 18925,4763, 1407, 8414, 8867, 25464,29168,43410,34692,16420,25480,43410, - 30952,40600,35563,37049,22197,12471,29911,15887,23327,8060, 28685,27330,20619,31836,8239, 15057,37464,10516,24729,4577, 8798, 11352,36468,28850,6346, 26389,1556, - 33592,39164,23707,16612,24693,24620,17497,29124,5851, 15818,35053,18, 32847,11024,6359, 32791,3100, 4818, 39149,43409,40600,8433, 43409,30951,38619,12998,1693, + 30952,40600,35563,37049,22197,12471,29911,15887,23327,8060, 28685,27330,20619,31836,8239, 15057,37464,10516,24729,4577, 8798, 11352,36468,28850,6346, 26389,1556, + 33592,39164,23707,16612,24693,24620,17497,29124,5851, 15818,35053,18, 32847,11024,6359, 32791,3100, 4818, 39149,43409,40600,8433, 43409,30951,38619,12998,1693, 34866,1794, 40600,22052,35485,1780, 19697,38593,35844,35843,43409,34070,33383,24127,27627,37049,34865,38592,37049,12997,40599,33383,29186,35843,29185,18385,19841, - 43409,34743,12572,37048,34865,31269,30950,43408,26241,36404,37838,31823,38592,40599,34070,28388,40599,20506,38592,26890,30949,40599,34070,40598,40598,33622,1096, - 7287, 18005,20, 14018,31574,33959,24122,34070,29771,22892,21776,40598,15693,43408,3052, 37048,10536,38592,38591,14680,11452,40598,2441, 15692,43408,34865,9161, - 13902,15580,43408,2957, 35074,18004,25001,40597,33383,37048,9113, 26067,33259,12996,29935,37017,12201,247, 10854,4185, 3324, 12510,8108, 16467,21343,35631,1019, - 27029,39029,12371,3014, 8030, 32974,25989,2123, 30311,37829,5389, 1399, 4659, 3043, 8322, 1791, 9673, 35919,26033,909, 39114,35887,3957, 27288,32792,43407,1221, + 43409,34743,12572,37048,34865,31269,30950,43408,26241,36404,37838,31823,38592,40599,34070,28388,40599,20506,38592,26890,30949,40599,34070,40598,40598,33622,1096, + 7287, 18005,20, 14018,31574,33959,24122,34070,29771,22892,21776,40598,15693,43408,3052, 37048,10536,38592,38591,14680,11452,40598,2441, 15692,43408,34865,9161, + 13902,15580,43408,2957, 35074,18004,25001,40597,33383,37048,9113, 26067,33259,12996,29935,37017,12201,247, 10854,4185, 3324, 12510,8108, 16467,21343,35631,1019, + 27029,39029,12371,3014, 8030, 32974,25989,2123, 30311,37829,5389, 1399, 4659, 3043, 8322, 1791, 9673, 35919,26033,909, 39114,35887,3957, 27288,32792,43407,1221, 2638, 10079,8107, 14592,1107, 12370,1548, 776, 3904, 8315, 16825,6540, 40597,33579,13461,39339,43407,3594, 38591,40597,11023,30048,34526,38591,35843,13620,33757, 617, 38591,22891,40597,1772, 40596,23860,34865,18062,35843,33382,38590,38590,40596,37048,43407,38590,22890,43407,18384,29184,43406,38590,6299, 40596,38589,29183, 4500, 34864,15691,34864,136, 18587,29616,7969, 120, 18383,22051,43406,564, 12542,3450, 27505,16961,18357,3969, 24600,12051,5213, 31591,3854, 13342,19159,33071, - 3799, 16466,15741,28832,15901,33370,4367, 6553, 12906,36655,10485,2971, 23677,1580, 13460,3751, 5248, 37047,8205, 28873,417, 13272,5037, 11022,29926,9802, 1069, - 4803, 25947,8308, 7781, 13646,8466, 26484,18901,2942, 28465,16723,8348, 21003,1938, 25929,32085,16624,38722,32292,6270, 33047,36316,38598,34816,25360,29154,4789, + 3799, 16466,15741,28832,15901,33370,4367, 6553, 12906,36655,10485,2971, 23677,1580, 13460,3751, 5248, 37047,8205, 28873,417, 13272,5037, 11022,29926,9802, 1069, + 4803, 25947,8308, 7781, 13646,8466, 26484,18901,2942, 28465,16723,8348, 21003,1938, 25929,32085,16624,38722,32292,6270, 33047,36316,38598,34816,25360,29154,4789, 33227,1290, 27380,3435, 12927,18080,33097,4907, 4902, 9889, 38589,18711,17464,34069,1231, 22050,35842,34069,39133,38589,35143,38589,38588,34069,16528,37743,29182, 35842,43406,19181,35842,34069,15054,1040, 106, 32533,16465,43406,38588,7962, 39387,5238, 3148, 36332,35626,12911,9499, 35842,38588,5471, 36718,38217,35440,13954, 38588,7803, 19696,40596,5289, 43405,34864,1265, 34864,38587,33382,35841,30948,30947,9085, 14934,43405,38587,27626,27625,34068,36568,6481, 38587,40595,33382,37047, @@ -14674,13 +14669,13 @@ static const unsigned short Ranks[197839] = 34863,13110,43404,43404,1395, 25979,34068,38587,884, 19083,19380,13619,33381,580, 32790,12224,38586,23050,38041,11416,38048,12590,774, 14236,37047,19840,19180, 43404,16112,18382,3529, 652, 9215, 38586,40594,23859,26203,32909,31429,30789,25000,31334,32688,13837,30375,25734,171, 2494, 37609,11841,7906, 259, 3039, 13313, 29815,29758,23505,250, 19239,33406,34068,40594,16527,12589,26239,43403,7027, 30731,11513,29181,40594,40594,1926, 24438,8191, 4591, 13330,34067,16151,34863,29180, - 43403,23858,40593,26238,13329,18586,5363, 3327, 17887,37047,11298,30944,35841,13618,38586,878, 1843, 40593,19839,6928, 10122,17429,9757, 7362, 1436, 36798,9268, + 43403,23858,40593,26238,13329,18586,5363, 3327, 17887,37047,11298,30944,35841,13618,38586,878, 1843, 40593,19839,6928, 10122,17429,9757, 7362, 1436, 36798,9268, 10732,18564,18381,38133,30182,35841,17345,35840,43403,19695,32779,14713,15601,5025, 2514, 33668,5756, 2165, 9823, 20207,8000, 6434, 9323, 38910,15690,33426,16464, - 38586,25442,1123, 37046,27624,430, 27125,10651,11201,475, 43403,7270, 40593,334, 10019,2909, 3552, 32851,14898,34863,426, 43402,43402,38585,4487, 29925,7032, + 38586,25442,1123, 37046,27624,430, 27125,10651,11201,475, 43403,7270, 40593,334, 10019,2909, 3552, 32851,14898,34863,426, 43402,43402,38585,4487, 29925,7032, 4534, 12801,5241, 634, 43402,43402,542, 13860,17378,11774,40593,2175, 3878, 33381,10336,10650,43401,20613,2908, 35632,40592,20505,43401,35840,34862,24689,43401, 16463,29085,22624,2523, 26841,40592,32790,23849,36441,131, 15, 16462,12995,19579,709, 40592,38585,19179,34862,37046,37046,40592,11399,40591,40591,26237,26236, - 8743, 19838,947, 18553,15, 8696, 24886,26839,37046,681, 15692,43401,37045,22888,4265, 2300, 31762,22049,20257,20180,35840,20504,13617,40591,35840,7630, 3773, - 3959, 3936, 35332,26731,39013,27623,43400,35839,38585,20071,6574, 19694,43400,35839,11892,32790,35839,180, 8497, 36539,8167, 21208,34862,21796,34067,18003,3231, + 8743, 19838,947, 18553,15, 8696, 24886,26839,37046,681, 15692,43401,37045,22888,4265, 2300, 31762,22049,20257,20180,35840,20504,13617,40591,35840,7630, 3773, + 3959, 3936, 35332,26731,39013,27623,43400,35839,38585,20071,6574, 19694,43400,35839,11892,32790,35839,180, 8497, 36539,8167, 21208,34862,21796,34067,18003,3231, 34067,43400,7611, 35831,11398,35839,9204, 36220,9338, 2452, 3511, 6854, 35838,877, 36775,37508,39193,39389,11969,34067,34242,29841,38928,13475,43400,13459,22887, 43399,39093,29179,40591,40590,40590,40590,18297,37313,12816,1364, 27261,32790,16442,25836,35226,21125,33875,5920, 27487,43399,365, 9829, 25468,11891,35838,28308, 40590,43399,20503,4071, 22048,16111,40589,33820,43399,14591,769, 17, 5958, 23719,40589,35838,33381,13071,19693,33912,34021,34862,17521,19299,38585,577, 15298, @@ -14690,89 +14685,89 @@ static const unsigned short Ranks[197839] = 21205,18265,1478, 37044,15691,27622,1046, 12571,17428,3935, 39331,3893, 26772,2750, 19573,38584,3649, 18656,19178,40588,43397,34861,22963,344, 4941, 20267,38584, 6480, 7322, 19691,40588,4367, 9880, 35837,13457,43397,1423, 25655,3983, 4720, 10749,35774,11300,13456,43397,12628,11890,34573,10671,30328,34845,33380,3368, 11021, 22206,23983,21204,7968, 31440,43396,38584,8318, 40588,19177,38583,40587,17427,21203,11419,24999,11324,245, 32977,6814, 36637,11702,22047,35193,38583,1639, 19837, - 43396,2321, 10320,1259, 24998,37044,43396,24997,9492, 38583,34066,27165,29500,18834,20227,5838, 3673, 10534,407, 11055,26234,4828, 1173, 37044,43396,938, 3672, - 2744, 11840,30943,34066,10469,14235,38583,39033,1472, 3230, 714, 36991,11675,37044,27356,2562, 43395,29400,30942,15137,1363, 2033, 35837,35837,40587,35837,55, + 43396,2321, 10320,1259, 24998,37044,43396,24997,9492, 38583,34066,27165,29500,18834,20227,5838, 3673, 10534,407, 11055,26234,4828, 1173, 37044,43396,938, 3672, + 2744, 11840,30943,34066,10469,14235,38583,39033,1472, 3230, 714, 36991,11675,37044,27356,2562, 43395,29400,30942,15137,1363, 2033, 35837,35837,40587,35837,55, 13088,11246,10468,21038,33539,3999, 38582,32863,19690,38582,24748,35836,10748,18762,8238, 37043,3439, 34861,40587,13953,2580, 15053,34066,38779,1985, 25180,43395, 43395,8834, 16915,19412,17426,23857,31820,11527,8282, 34596,8658, 2824, 32789,26233,43395,40587,29177,43394,43394,16526,33811,38582,43394,17092,35836,36744,34861, 43394,28605,34861,11976,14915,31235,35836,43393,40586,38916,32789,37043,20171,17790,1823, 554, 24587,10, 17160,22046,32789,36129,33233,43393,43393,5163, 15690, 19176,43393,37693,37043,40586,34066,1100, 37538,15689,37214,18191,37043,43392,4584, 36069,21280,40586,12080,34065,5379, 37025,5463, 38582,530, 37042,27621,13455, - 40586,38581,36863,34065,29176,13968,27620,24996,3725, 1303, 31659,1720, 3229, 499, 43392,5999, 7694, 22045,43392,32788,43392,30941,43391,5081, 3835, 37236,6002, + 40586,38581,36863,34065,29176,13968,27620,24996,3725, 1303, 31659,1720, 3229, 499, 43392,5999, 7694, 22045,43392,32788,43392,30941,43391,5081, 3835, 37236,6002, 21202,38581,38520,14933,26232,3539, 43391,13952,30940,7990, 40585,38581,29175,19175,29174,25914,43391,30939,1186, 13901,10467,18002,35836,9309, 36221,40585,35835, 17375,11839,8617, 7213, 32941,16460,36158,43391,2258, 33044,3390, 21201,16525,19689,9498, 27858,38581,11671,43390,11299,29148,43390,40585,4827, 660, 43390,24972, 34860,9497, 30938,38580,34860,43390,984, 35835,38628,29173,43389,13900,3113, 1551, 38580,19424,23301,36046,34065,24995,29172,815, 4805, 15160,19397,29955,11570, 2213, 30103,38218,7730, 11889,27619,21761,736, 3719, 7848, 5004, 20971,2179, 35531,4670, 37042,4028, 5985, 16459,7609, 40585,12067,27618,43389,289, 21694,40584, 6146, 35056,10174,16458,3149, 37042,43389,40584,1841, 35835,875, 40584,4771, 4410, 38580,19174,27617,38580,2511, 4962, 23448,45, 6905, 920, 43389,37042,21744, - 43388,31993,36229,34860,19836,19688,43388,21151,37041,12307,13951,43388,43388,40584,12570,12815,20502,38579,43387,43387,21237,33700,40583,43387,19981,33380,1651, + 43388,31993,36229,34860,19836,19688,43388,21151,37041,12307,13951,43388,43388,40584,12570,12815,20502,38579,43387,43387,21237,33700,40583,43387,19981,33380,1651, 33052,27616,37041,43387,2996, 15462,16524,7321, 19039,11888,34698,1183, 35711,1464, 7888, 33380,2239, 40583,37041,4132, 6784, 33209,8973, 40583,1572, 14234,38680, - 2000, 30937,17425,37041,38579,38579,35835,33380,33416,33379,22399,40583,37216,29910,38579,8848, 17424,34860,1929, 92, 32392,12569,25900,32061,9830, 23856,5742, + 2000, 30937,17425,37041,38579,38579,35835,33380,33416,33379,22399,40583,37216,29910,38579,8848, 17424,34860,1929, 92, 32392,12569,25900,32061,9830, 23856,5742, 15689,4050, 1045, 8144, 32769,29808,31145,11661,36539,33379,6247, 40582,9084, 33379,945, 35373,33106,3337, 9055, 8106, 10747,7691, 15034,33734,15688,21607,35716, 21200,39037,39273,5327, 17881,831, 7320, 21199,24546,17374,1154, 35521,4756, 36702,33967,10746,22604,1536, 13950,11372,38135,29171,19793,7582, 12152,25502,21198, 38532,10440,27615,9879, 43386,39119,35737,38578,29170,26231,32972,40582,14590,38578,43386,37802,38578,29169,38072,15297,43386,18001,32870,34859,376, 34722,32788, 6189, 40582,21236,43386,13949,8237, 1786, 3998, 7237, 18462,1712, 19687,43385,31647,33327,22202,27104,282, 737, 27443,36502,12223,34065,32788,40582,32461,32788, 16891,25788,38423,5428, 28072,15548,26897,15662,30039,20893,1964, 27231,43385,9469, 43385,34064,35834,1163, 2381, 37021,33745,37503,7521, 43385,10220,17402,12588, - 1266, 6331, 36338,43384,13264,22886,22885,40581,1952, 40581,17373,2623, 27614,34859,40581,15687,35834,14972,1762, 36504,10, 14472,15030,6715, 28423,31067,749, + 1266, 6331, 36338,43384,13264,22886,22885,40581,1952, 40581,17373,2623, 27614,34859,40581,15687,35834,14972,1762, 36504,10, 14472,15030,6715, 28423,31067,749, 11908,8573, 3080, 7057, 8654, 32883,32779,28342,11710,21769,12760,10600,11832,18868,17649,29376,31686,28051,31650,13491,21073,19260,11666,23452,5113, 9590, 11173, - 15882,9905, 17867,25812,9496, 26737,3354, 3035, 5809, 33379,38714,22120,15868,5450, 23420,6445, 32800,26497,26124,29533,30329,863, 10181,29633,7985, 16110,2114, - 23168,10052,14996,43384,40581,7651, 8511, 28613,5474, 43384,16123,43384,33328,13866,18585,33378,37040,40580,3051, 4082, 28120,27613,6324, 43383,9675, 19686,7008, + 15882,9905, 17867,25812,9496, 26737,3354, 3035, 5809, 33379,38714,22120,15868,5450, 23420,6445, 32800,26497,26124,29533,30329,863, 10181,29633,7985, 16110,2114, + 23168,10052,14996,43384,40581,7651, 8511, 28613,5474, 43384,16123,43384,33328,13866,18585,33378,37040,40580,3051, 4082, 28120,27613,6324, 43383,9675, 19686,7008, 35834,27563,409, 13864,31264,9606, 13423,32967,9738, 13523,29691,3613, 40580,13005,40580,34859,24994,19864,949, 16457,5658, 2420, 4597, 15686,33376,25992,11379, - 20882,27297,19377,37513,34709,32661,43383,20075,16960,37040,19685,2609, 29421,13948,11200,38578,9672, 1147, 36378,33998,21776,6235, 37040,34064,36808,4795, 7757, + 20882,27297,19377,37513,34709,32661,43383,20075,16960,37040,19685,2609, 29421,13948,11200,38578,9672, 1147, 36378,33998,21776,6235, 37040,34064,36808,4795, 7757, 10745,40580,38577,34859,10999,23855,9974, 26858,17692,29523,18748,4401, 14932,27842,16886,15527,43383,1278, 12994,11298,27612,16456,18634,28707,27611,37040,43383, - 2216, 4860, 32787,2081, 3518, 1662, 30412,3793, 33507,19684,43382,26632,38577,12079,16523,3724, 5118, 21197,11020,38577,33020,27492,11398,32866,31700,6298, 7541, + 2216, 4860, 32787,2081, 3518, 1662, 30412,3793, 33507,19684,43382,26632,38577,12079,16523,3724, 5118, 21197,11020,38577,33020,27492,11398,32866,31700,6298, 7541, 3982, 15685,8236, 35842,15014,22093,17248,526, 8935, 29630,2403, 17372,5683, 7102, 35075,27430,1770, 619, 7385, 20111,9614, 23039,34289,11297,1757, 24496,19683, 33078,11944,31592,426, 15738,37717,4028, 31708,33590,26871,13097,33060,8105, 8104, 34858,40579,30936,17371,34064,34778,17455,13603,9308, 13454,12993,6853, 21235, - 23854,35834,23853,43382,43382,17370,5202, 37039,38577,38576,30394,23852,5080, 22044,9468, 27610,35998,40579,43382,34064,40579,43381,40579,9160, 2636, 11019,6188, - 6974, 30935,40578,10649,38576,33378,22801,38576,32014,43381,30934,30933,18000,5082, 32419,20501,20500,38576,666, 12683,987, 19173,37039,4499, 38329,2453, 2511, + 23854,35834,23853,43382,43382,17370,5202, 37039,38577,38576,30394,23852,5080, 22044,9468, 27610,35998,40579,43382,34064,40579,43381,40579,9160, 2636, 11019,6188, + 6974, 30935,40578,10649,38576,33378,22801,38576,32014,43381,30934,30933,18000,5082, 32419,20501,20500,38576,666, 12683,987, 19173,37039,4499, 38329,2453, 2511, 16954,5648, 33690,35833,15052,38575,40578,31634,8742, 34858,377, 25375,27156,31963,38801,34063,37039,22043,13899,34063,35833,17383,29168,12306,7961, 43381,12328, 12992,9885, 22042,18380,5837, 11852,11887,12507,10308,21196,13947,3517, 40578,9307, 43381,12587,38575,43380,34858,40578,16799,37039,33026,3981, 7629, 4086, 22542, 5219, 16455,17369,32787,4070, 43380,11397,2534, 10098,5511, 28763,36581,5916, 38575,10744,43380,26282,40577,438, 35825,43380,9467, 7236, 15051,6479, 996, 38575, - 1394, 19172,35833,16454,34063,14233,37038,4694, 21984,21195,5515, 38574,19682,21194,40577,1313, 43379,30932,5247, 8616, 29167,40577,35833,520, 34329,10307,1947, + 1394, 19172,35833,16454,34063,14233,37038,4694, 21984,21195,5515, 38574,19682,21194,40577,1313, 43379,30932,5247, 8616, 29167,40577,35833,520, 34329,10307,1947, 289, 10401,11096,35848,2366, 2417, 35359,32198,23987,3399, 19681,5899, 801, 38574,20782,35069,1248, 21905,8525, 17179,23842,38574,35832,43379,30931,43379,38574, 38573,17778,40577,15850,34602,35940,37038,16453,21193,22340,36150,33839,32787,9306, 13898,11886,32787,37749,23497,38441,35832,33086,10500,33135,8994, 38573,43379, 10533,34858,26230,43378,27149,40576,37996,40576,33378,5514, 19680,4643, 18379,21192,28060,2635, 524, 35138,8658, 40576,7458, 23759,14875,13453,33980,960, 17368, 18378,1719, 12222,2843, 37681,15050,34804,40576,26397,38573,43378,13844,32786,43378,19679,15688,29166,38573,40575,5397, 15501,23851,7693, 38572,1377, 32996,33095, - 18377,22884,22635,3045, 32786,3104, 2950, 16452,33751,453, 10532,40575,34099,19171,11604,34857,37038,35832,34857,38572,1016, 29716,2357, 36648,37038,26074,2004, + 18377,22884,22635,3045, 32786,3104, 2950, 16452,33751,453, 10532,40575,34099,19171,11604,34857,37038,35832,34857,38572,1016, 29716,2357, 36648,37038,26074,2004, 24993,10018,43378,34063,43377,21191,38512,5353, 37037,872, 34075,34857,31742,2874, 15684,7235, 19678,36628,38243,902, 6001, 32043,8313, 38867,17244,35249,28982, 35324,43377,2699, 23462,25518,37758,40575,34232,22355,35832,43377,26229,43377,12814,16451,11574,8281, 29793,15050,459, 3782, 11535,40575,9539, 1349, 30930,37095, 19483,2245, 18957,14260,17412,17367,14466,43376,38572,860, 14661,21190,3408, 34329,16450,15683,6682, 36137,33368,2914, 38572,2320, 21064,34062,32769,19677,40574, 19811,38571,12755,37502,36782,19765,1078, 34792,26353,33935,43376,38589,5025, 16157,7435, 4130, 12991,31802,6986, 35746,38571,43376,38571,28796,11838,7262, 38571, 37037,34857,24241,43376,34999,8667, 30698,36865,25014,27339,24992,38570,32634,26430,10504,29068,9979, 1910, 23026,11920,6203, 14520,17471,30785,6332, 30861,32845, - 10591,2306, 36766,38380,20018,39348,32823,12068,14626,36924,37552,3432, 203, 21847,1146, 43375,6691, 34062,30929,4216, 38570,43375,43375,33378,29165,9203, 3218, + 10591,2306, 36766,38380,20018,39348,32823,12068,14626,36924,37552,3432, 203, 21847,1146, 43375,6691, 34062,30929,4216, 38570,43375,43375,33378,29165,9203, 3218, 19170,40574,33037,43375,11625,28548,22041,37704,1753, 43374,43374,43374,40574,40574,30928,43374,27413,24991,24824,33851,38570,34062,29164,22883,38570,9329, 16522, 9159, 34062,35831,34115,21234,40573,1416, 28034,36219,1056, 24990,19169,43373,30927,1690, 34856,40573,32786,22040,29163,29162,11199,22039,35831,12773,34061,18413, 37037,18197,14589,16521,12823,12813,38569,36432,8421, 14232,11215,13328,38569,22882,20382,43373,579, 18180,22490,8865, 26420,43373,43373,43372,30926,39326,19676, 40573,23850,32786,32785,21189,16449,40573,4435, 43372,34061,13327,37541,13616,30925,43372,2289, 22110,33119,16490,40572,30924,22351,43372,38569,3662, 1545, 26332, 29830,10078,13542,3085, 21672,30322,38569,8125, 3814, 7628, 11454,37612,40572,5825, 29088,4575, 14688,9153, 12812,38567,34061,1971, 6969, 15595,35831,8280, 32785, - 14931,30923,29161,4859, 34501,28230,36277,39056,10531,22214,38807,8235, 6082, 43371,38568,20499,11603,34061,40572,25365,19835,16448,617, 20317,20987,23681,8595, + 14931,30923,29161,4859, 34501,28230,36277,39056,10531,22214,38807,8235, 6082, 43371,38568,20499,11603,34061,40572,25365,19835,16448,617, 20317,20987,23681,8595, 24222,19310,31991,23290,27609,6401, 37410,16338,5348, 20498,40572,23849,28710,43371,3772, 14588,43371,43371,591, 24919,19675,38568,17423,10530,33951,40571,29160, 23848,40571,34060,181, 38568,34060,35831,5819, 13946,10319,35274,34856,38568,17762,38567,4711, 17654,20497,23847,43370,35830,37037,35830,40571,17999,43370,27608, - 43370,33339,10998,30922,40571,8796, 35748,37036,15682,40570,40570,4674, 10564,34060,28982,38567,21233,40570,11198,32785,43370,1812, 43369,11645,34060,34856,9496, + 43370,33339,10998,30922,40571,8796, 35748,37036,15682,40570,40570,4674, 10564,34060,28982,38567,21233,40570,11198,32785,43370,1812, 43369,11645,34060,34856,9496, 5728, 17855,33377,6028, 35830,19834,8847, 13897,14465,4775, 37036,29159,43369,768, 15695,32112,34059,21232,19833,34059,6852, 40570,34856,7517, 5647, 34855,16447, 3210, 17998,33231,1431, 24892,32785,3767, 37036,24989,24727,2357, 23846,2903, 29158,7286, 43369,35830,36274,43369,38567,37826,37294,11569,28305,21188,40569,36320, 8615, 27607,40569,38920,28721,2800, 20496,22038,37036,11837,18524,17422,29157,15049,5692, 32784,34717,38102,35457,40569,15048,13936,43368,43368,34855,37256,22869, 35936,37035,38567,757, 16955,14993,16414,25920,19678,31822,27953,13882,20281,13856,17712,34059,21231,26825,25383,34059,23567,1174, 43368,43368,16097,40569,24988, - 25109,43367,38566,24381,39292,22503,34954,17421,14930,34058,40568,4131, 34855,37035,43367,33377,43367,1314, 18376,3163, 29381,11296,37035,35704,29156,35829,8397, + 25109,43367,38566,24381,39292,22503,34954,17421,14930,34058,40568,4131, 34855,37035,43367,33377,43367,1314, 18376,3163, 29381,11296,37035,35704,29156,35829,8397, 34855,6973, 26228,38566,39127,2627, 19674,17420,33377,17366,33377,22354,8962, 13452,17365,17364,37035,22037,15047,32784,32784,9566, 14361,5852, 4740, 11902,43367, 36709,34854,12568,27606,40568,32795,1249, 22273,38566,1109, 40568,11540,1466, 17176,15046,36728,6985, 5793, 39402,25922,16446,19168,5218, 15045,38566,19673,33376, - 40568,38565,37034,43366,38707,11393,33870,21230,37391,26879,38485,29155,19832,27605,34058,15687,30921,40567,19060,10529,43366,21187,3503, 12160,22569,12305,3977, + 40568,38565,37034,43366,38707,11393,33870,21230,37391,26879,38485,29155,19832,27605,34058,15687,30921,40567,19060,10529,43366,21187,3503, 12160,22569,12305,3977, 40567,23845,38084,1280, 38565,1458, 9158, 37034,37034,3320, 12221,12586,4666, 37034,4574, 15044,16445,29190,8977, 18542,36666,6027, 23844,40567,43366,38026,38565, 13611,17772,14231,2681, 38565,971, 25336,28104,38834,20865,167, 13165,17744,18375,13326,13463,26227,43366,43365,38564,38564,31075,14243,10439,3541, 32990,29644, - 40567,37033,19167,33157,36018,39399,8339, 25114,7920, 37033,40566,43365,6871, 12304,12141,6237, 2493, 7354, 22798,35932,24987,32475,4528, 6279, 23843,19166,1118, + 40567,37033,19167,33157,36018,39399,8339, 25114,7920, 37033,40566,43365,6871, 12304,12141,6237, 2493, 7354, 22798,35932,24987,32475,4528, 6279, 23843,19166,1118, 6933, 29552,39339,7434, 34854,34437,6166, 40566,19672,11836,9884, 25110,34058,43365,19831,40566,32818,18584,6721, 19671,40566,10711,6468, 37033,23842,9466, 14587, 17363,732, 24986,7285, 32784,5679, 34854,32783,43365,8846, 16520,151, 26226,43364,14586,27604,38564,30920,3426, 15296,34058,40565,9083, 2455, 27603,22881,34854, 1927, 33056,32783,34057,19670,33376,35339,30919,40565,8742, 37286,28545,33286,37033,32783,35829,30918,40565,38564,32783,17997,35475,6656, 34997,21927,14813,30458, - 6081, 29154,43364,43364,35829,6080, 33016,30917,37460,34501,11568,28010,38563,13451,20495,21229,34407,43364,2288, 36411,30544,25841,3489, 43363,23965,23418,9455, + 6081, 29154,43364,43364,35829,6080, 33016,30917,37460,34501,11568,28010,38563,13451,20495,21229,34407,43364,2288, 36411,30544,25841,3489, 43363,23965,23418,9455, 19799,26012,38563,30916,40565,38563,43363,35829,15681,8961, 23841,15680,38563,40564,37032,40564,34647,43363,40564,14929,33900,34853,37032,19830,43363,6583, 40564, - 12945,33826,6234, 12655,20163,30812,12213,36700,16444,33889,43362,2710, 14232,38562,38562,43362,14585,16109,37032,38562,1850, 1197, 9878, 5790, 27132,32782,2698, - 9883, 40563,6582, 11993,5596, 20594,10712,8898, 7446, 38562,38089,32948,37364,43362,36439,19829,34038,25143,527, 34729,37032,3744, 21110,32782,1781, 11861,2076, - 8517, 33847,29153,38859,3388, 22993,10828,34241,8720, 21344,2009, 40563,32973,40563,33376,3349, 26475,38561,24985,43362,34057,43361,8061, 37031,18771,43361,9877, - 43361,38561,28692,6079, 19165,36941,10391,13896,26151,8972, 606, 32782,33000,38341,34853,32782,43361,40563,38433,41, 20494,40562,37094,40562,37031,35828,5789, + 12945,33826,6234, 12655,20163,30812,12213,36700,16444,33889,43362,2710, 14232,38562,38562,43362,14585,16109,37032,38562,1850, 1197, 9878, 5790, 27132,32782,2698, + 9883, 40563,6582, 11993,5596, 20594,10712,8898, 7446, 38562,38089,32948,37364,43362,36439,19829,34038,25143,527, 34729,37032,3744, 21110,32782,1781, 11861,2076, + 8517, 33847,29153,38859,3388, 22993,10828,34241,8720, 21344,2009, 40563,32973,40563,33376,3349, 26475,38561,24985,43362,34057,43361,8061, 37031,18771,43361,9877, + 43361,38561,28692,6079, 19165,36941,10391,13896,26151,8972, 606, 32782,33000,38341,34853,32782,43361,40563,38433,41, 20494,40562,37094,40562,37031,35828,5789, 38561,22415,3877, 34853,35576,24984,29152,17996,34853,40562,19669,32781,21228,37031,32781,38561,33376,40562,23477,13895,43360,6655, 38076,19164,37031,29151,40561, 43360,17362,40561,38560,3463, 16108,19163,18717,9202, 32781,18583,35828,21392,5691, 38560,43360,43360,19668,38720,8614, 4710, 40561,34057,34057,43359,34056,40561, 24160,12567,34056,28094,38560,43359,13124,38560,29150,9201, 35828,38559,19162,32781,32780,34852,40560,34852,26983,37030,37030,33375,37030,34056,9495, 37030,35828, 36976,15472,34852,13450,10827,21227,7177, 1804, 31590,8795, 2313, 37961,3112, 169, 21705,21811,7627, 31434,11072,40560,685, 3793, 20280,17713,9322, 38805,34056, 34852,864, 12495,4881, 19328,3008, 27974,6972, 33322,37029,12984,43359,24983,43359,34851,1784, 12585,35927,12566,34055,32780,26225,35827,6026, 21226,37029,34055, 43358,37029,12125,16622,35827,40560,1576, 34851,32780,1160, 35827,2947, 28125,1451, 38559,43358,38559,43358,37029,18374,37819,35602,11885,21225,43358,28972,34768, - 40560,22880,33804,34267,9451, 38966,1447, 28708,7644, 28726,34477,4817, 40559,38559,852, 33705,3438, 38558,5099, 21773,30517,29613,11913,29236,33031,13381,236, + 40560,22880,33804,34267,9451, 38966,1447, 28708,7644, 28726,34477,4817, 40559,38559,852, 33705,3438, 38558,5099, 21773,30517,29613,11913,29236,33031,13381,236, 21596,27602,12584,4573, 37028,36767,19667,10010,35827,5060, 43357,5925, 18373,20905,27601,237, 31375,12741,13326,23840,34055,36807,24166,17903,20736,34851,30915, 19161,43357,36315,43357,1149, 33646,9082, 35826,2561, 23289,10017,32780,34851,38558,29149,29148,22036,11197,34055,8845, 38558,37028,40559,913, 8234, 18372,43357, 492, 36738,11131,9081, 34850,32904,32824,34734,22035,6901, 807, 33375,5690, 14584,17995,1771, 38558,30914,32779,4403, 470, 5146, 32733,27687,26840,28171,26224, @@ -14782,17 +14777,17 @@ static const unsigned short Ranks[197839] = 40557,9899, 21186,37600,1752, 3031, 35169,36791,33993,34049,27572,31812,32774,30240,18049,17273,31767,18463,12980,17357,40557,123, 40557,33375,22879,7692, 26223, 38557,34054,4555, 10977,15686,4069, 5058, 14443,43354,5879, 20493,26222,2749, 11567,26290,35826,489, 446, 14028,6760, 23755,13844,14141,32855,19608,31820,22563, 12373,25777,35826,12229,120, 14357,2958, 29357,25325,22528,32858,31268,26221,35826,27600,12303,34054,43354,13325,11396,7212, 7136, 20492,40556,35825,35825,34650, - 9328, 43354,12318,43353,18371,9465, 7433, 16061,18910,7784, 38557,30912,33375,1349, 34219,34053,16442,13169,43353,43353,8960, 16959,9882, 22033,40556,96, 9920, + 9328, 43354,12318,43353,18371,9465, 7433, 16061,18910,7784, 38557,30912,33375,1349, 34219,34053,16442,13169,43353,43353,8960, 16959,9882, 22033,40556,96, 9920, 38282,699, 2275, 2375, 761, 9464, 2769, 38557,26178,43353,34514,3162, 643, 1698, 697, 43352,15043,18370,3766, 95, 22878,43352,14587,19666,15678,2499, 21510, 834, 27856,20886,339, 754, 29487,35851,38556,3849, 11687,32318,32779,2516, 6042, 11106,15295,7054, 19665,15042,9671, 35705,5079, 3265, 1355, 17361,708, 21915, - 1703, 32879,12732,20818,35791,7144, 11566,4919, 8794, 33374,2778, 6175, 16200,38143,19274,12277,31920,24735,18369,34053,32853,18574,11602,37026,35384,43352,1988, - 14202,14464,19664,21336,31319,15041,43352,34850,897, 4047, 1545, 11884,34555,43351,21224,1482, 43351,34850,43351,1498, 137, 32807,24406,8726, 12154,16519,8619, + 1703, 32879,12732,20818,35791,7144, 11566,4919, 8794, 33374,2778, 6175, 16200,38143,19274,12277,31920,24735,18369,34053,32853,18574,11602,37026,35384,43352,1988, + 14202,14464,19664,21336,31319,15041,43352,34850,897, 4047, 1545, 11884,34555,43351,21224,1482, 43351,34850,43351,1498, 137, 32807,24406,8726, 12154,16519,8619, 13059,1313, 35804,26220,7783, 13945,40556,2833, 10826,386, 18522,34347,11286,9605, 26219,29113,14230,11395,25912,11601,19578,32779,40556,35639,37026,1394, 24982, - 3246, 34692,11196,33143,2495, 39089,6099, 9964, 16588,36139,3455, 347, 25864,11695,24469,22050,17360,34315,26331,8452, 19945,410, 29846,23387,15890,2023, 5512, + 3246, 34692,11196,33143,2495, 39089,6099, 9964, 16588,36139,3455, 347, 25864,11695,24469,22050,17360,34315,26331,8452, 19945,410, 29846,23387,15890,2023, 5512, 23580,9670, 32935,25446,32779,5260, 888, 17265,13615,838, 6964, 8636, 7610, 25521,10334,5832, 11102,7608, 24601,521, 40555,30487,1985, 2592, 1451, 21065,32768, 34053,2611, 6619, 21185,4409, 40555,40555,27588,43351,35825,29146,19160,34849,10768,32495,36862,38556,16107,34053,43350,35305,40555,34849,37026,29145,27954,25677, 12583,38191,37026,8741, 8971, 22881,35825,11905,43350,21223,38420,35824,11394,5595, 8613, 40554,43350,5362, 23839,30911,38556,43350,27599,6783, 36307,40554,43349, - 35824,7432, 34849,40554,2246, 34849,43349,33374,37025,37025,43349,27598,38556,43349,17993,38332,36362,21222,24981,34052,11835,7782, 11295,37885,37617,26493,1676, + 35824,7432, 34849,40554,2246, 34849,43349,33374,37025,37025,43349,27598,38556,43349,17993,38332,36362,21222,24981,34052,11835,7782, 11295,37885,37617,26493,1676, 2823, 467, 8513, 21028,26808,20994,34457,40554,43348,39246,22032,19511,13324,38786,32778,5920, 17796,34122,23607,6539, 17359,14735,37572,21184,6923, 24011,32162, 34803,34471,23275,36121,4108, 34807,36265,9327, 27881,33995,39302,24980,43348,12565,37025,43348,38555,29144,7421, 21988,43348,30910,35824,3311, 22031,5741, 33374, 33310,35389,15040,32526,33720,10509,2666, 10711,36003,10191,9019, 14479,32778,28205,1499, 33167,36816,33156,40553,37101,33996,23106,19663,4156, 8516, 40553,12302, @@ -14803,19 +14798,19 @@ static const unsigned short Ranks[197839] = 21183,11834,34600,3777, 10131,8104, 28430,32785,39130,9644, 18368,333, 34879,31759,1768, 21221,6538, 25640,2635, 38554,34848,132, 3404, 22117,28336,31847,28266, 31323,15370,20491,5508, 7870, 5246, 15685,33373,19159,572, 37778,43345,26218,37024,38554,11393,43345,37024,5919, 34847,1895, 15293,5646, 13032,33624,40552,12220, 34847,1702, 9604, 40552,4294, 33901,8970, 23838,18627,38719,29142,198, 23182,17678,766, 19181,37024,36473,1308, 15677,37286,7083, 34597,34052,36851,13323,37023, - 22029,37511,13894,30909,5689, 3778, 32777,24979,21912,12082,18401,22623,26217,35276,10825,16685,8514, 18582,34847,23837,22307,4598, 37023,33720,23146,33891,7780, - 36902,10318,8589, 17933,1403, 39137,12023,25178,38979,28975,22877,31596,33649,24770,8406, 2061, 10996,6133, 31743,23653,43345,31286,891, 34764,5946, 37828,1948, + 22029,37511,13894,30909,5689, 3778, 32777,24979,21912,12082,18401,22623,26217,35276,10825,16685,8514, 18582,34847,23837,22307,4598, 37023,33720,23146,33891,7780, + 36902,10318,8589, 17933,1403, 39137,12023,25178,38979,28975,22877,31596,33649,24770,8406, 2061, 10996,6133, 31743,23653,43345,31286,891, 34764,5946, 37828,1948, 117, 3629, 697, 2320, 862, 36912,36329,2992, 38102,36463,11850,3720, 13884,12248,37929,38257,40552,43345,14229,43344,26216,21220,18581,37023,17992,16517,39093, 43344,43344,32777,37023,17991,37022,5645, 436, 1124, 1683, 37022,5553, 23836,3593, 344, 988, 4238, 38575,7607, 35823,109, 37022,11392,38554,37022,6615, 17068, - 38881,34617,8785, 3671, 43344,30737,40551,23835,3298, 35751,23314,19828,23627,5552, 43343,22028,35605,8037, 1708, 15317,268, 18873,31435,6154, 1448, 15981,8851, + 38881,34617,8785, 3671, 43344,30737,40551,23835,3298, 35751,23314,19828,23627,5552, 43343,22028,35605,8037, 1708, 15317,268, 18873,31435,6154, 1448, 15981,8851, 18914,214, 1166, 26408,34539,21923,28518,36977,4535, 6767, 33250,38652,34847,15261,43343,10844,19, 2894, 24562,13926,21539,32516,26402,13050,640, 47, 29347, 26215,10252,28362,130, 32874,770, 37651,3050, 968, 38472,18367,34846,7847, 21182,10640,11268,16985,18366,9652, 23834,8305, 20719,40551,8740, 9494, 37713,13449, 37066,38290,8959, 18365,43343,31406,15238,26032,26164,21181,2150, 23365,15039,36310,22027,12650,25295,35044,21180,781, 10986,18364,1327, 2100, 4285, 24607,35753, - 953, 17358,19989,34189,37729,31348,7291, 17825,2830, 2899, 7138, 500, 23054,13348,17418,22249,32777,18580,20386,36364,35421,37021,34846,1221, 19661,21584,1016, - 38554,34237,34833,34452,37603,10648,43343,33020,36453,453, 43342,37588,21611,729, 32776,33420,34846,40551,27596,15073,15535,32184,1358, 34846,34845,43342,4530, + 953, 17358,19989,34189,37729,31348,7291, 17825,2830, 2899, 7138, 500, 23054,13348,17418,22249,32777,18580,20386,36364,35421,37021,34846,1221, 19661,21584,1016, + 38554,34237,34833,34452,37603,10648,43343,33020,36453,453, 43342,37588,21611,729, 32776,33420,34846,40551,27596,15073,15535,32184,1358, 34846,34845,43342,4530, 37725,37021,24978,35823,40551,13614,35822,40550,33373,11833,43342,43342,34032,1775, 43341,15627,24977,21219,35220,38553,9200, 43341,34845,7606, 4402, 5462, 27595, 5152, 29141,21179,34845,34052,32776,29140,2323, 20490,4404, 7540, 21178,4799, 15676,1560, 15038,11883,35752,31130,37252,23960,38553,38553,34845,29139,40550,27594, - 37021,33373,17417,20052,14419,21383,34844,32863,20027,35660,38853,17990,32776,21218,2071, 13448,32900,12621,25003,32776,10528,21177,16597,12144,29693,6074, 9904, + 37021,33373,17417,20052,14419,21383,34844,32863,20027,35660,38853,17990,32776,21218,2071, 13448,32900,12621,25003,32776,10528,21177,16597,12144,29693,6074, 9904, 10369,10077,38607,8793, 18363,36674,11882,28254,31830,27627,20026,20212,34051,16516,43341,43341,43340,40550,1596, 27070,2243, 8192, 23083,25757,26657,15037,40550, 7539, 11565,33065,43340,43340,24104,43340,19827,43339,26214,23833,4529, 9325, 40549,34051,38553,34844,40549,14928,43339,30908,27593,43339,43339,16958,38552,38566, 40549,32775,16106,33372,32775,9199, 10647,26213,40549,38552,38552,35822,35822,4778, 13944,17989,22876,36561,34221,3161, 21288,34125,40548,38552,32775,13893,40548, @@ -14824,22 +14819,22 @@ static const unsigned short Ranks[197839] = 38595,34603,19140,14957,33321,27329,35688,40547,34844,473, 8824, 26691,7814, 10922,2078, 13672,4925, 35783,1905, 16441,6345, 34977,11564,1974, 27591,34843,15036, 34783,21133,34050,38551,30906,34843,43337,35821,35990,6236, 24303,43337,43336,43336,34843,24023,203, 30919,2953, 13057,12301,8844, 37020,32775,43336,27590,35567, 37020,9385, 15407,36879,37020,11129,19139,33074,39333,29849,34841,43336,30213,17988,37721,36635,33309,36273,34050,26099,449, 32967,38057,13049,15169,26309,40547, - 37795,23926,8984, 37941,35821,18362,32971,43335,36564,38551,38551,30696,35821,27589,33372,30905,8060, 40546,38551,33372,10466,19619,26000,15292,30904,27588,4628, + 37795,23926,8984, 37941,35821,18362,32971,43335,36564,38551,38551,30696,35821,27589,33372,30905,8060, 40546,38551,33372,10466,19619,26000,15292,30904,27588,4628, 40546,33372,40546,14927,8969, 40546,5974, 9881, 19825,22873,38550,34495,16957,35821,38550,37019,32774,21215,23338,40545,27587,29135,34843,20489,35820,33371,40545, 10646,33371,43335,19568,13958,34820,23831,335, 38550,38550,35820,36419,17357,7085, 12219,24352,8325, 31785,13756,39088,35397,31147,35664,30648,43335,33369,36533, 40545,1336, 19070,35935,17416,26035,20488,38549,8657, 21214,38549,36058,20620,6981, 34842,21176,34842,43335,23323,20487,23497,43334,7691, 25226,37019,6292, 19463, 37019,21715,33371,11195,43334,33890,38549,27735,16381,3049, 3853, 9121, 15229,23416,25932,16683,16248,26956,3593, 13943,37959,34886,21733,1488, 127, 19393,11584, 1979, 25295,12564,32683,17305,1719, 22026,3160, 2592, 38791,16848,33784,8809, 38417,14924,18361,31225,37908,33371,2102, 36414,32774,37848,915, 43334,36525,19975, 32016,34842,29134,11161,37057,8138, 34081,37019,43334,397, 43333,40545,34074,22943,43333,4438, 6233, 34620,37803,32148,4492, 27235,30903,34049,960, 37894,15710, - 999, 863, 34842,22025,4048, 2904, 38549,2557, 6359, 38548,457, 1792, 3427, 38208,4986, 5201, 19157,952, 34049,40544,22072,34049,148, 23218,1859, 997, 2066, - 20641,34049,19156,4176, 358, 10355,271, 830, 10059,16934,7438, 1688, 4454, 11999,7491, 23240,3102, 20609,36465,666, 2074, 9739, 8792, 21175,2318, 26893,8004, + 999, 863, 34842,22025,4048, 2904, 38549,2557, 6359, 38548,457, 1792, 3427, 38208,4986, 5201, 19157,952, 34049,40544,22072,34049,148, 23218,1859, 997, 2066, + 20641,34049,19156,4176, 358, 10355,271, 830, 10059,16934,7438, 1688, 4454, 11999,7491, 23240,3102, 20609,36465,666, 2074, 9739, 8792, 21175,2318, 26893,8004, 6872, 33983,27185,3822, 31608,25399,39342,17081,34089,37472,15035,7626, 29553,9438, 10399,24938,37982,35515,21428,13878,12989,21247,34768,6158, 22959,36456,20877, - 3120, 38884,35967,1444, 10631,10080,3090, 5158, 29595,21856,37473,35113,34690,19675,14462,12771,34537,34813,9022, 29133,4484, 14508,43333,34677,9305, 13321,4437, + 3120, 38884,35967,1444, 10631,10080,3090, 5158, 29595,21856,37473,35113,34690,19675,14462,12771,34537,34813,9022, 29133,4484, 14508,43333,34677,9305, 13321,4437, 22891,28504,29461,16684,34841,7402, 15687,13027,13892,30188,1072, 8135, 32126,14023,9980, 36046,1715, 910, 38406,397, 9972, 22468,29103,31890,25291,31276,40544, 15771,17402,3510, 2344, 13854,1362, 1966, 2743, 3369, 3437, 3228, 12738,276, 27360,37768,5184, 35820,34048,34841,24711,35254,33998,10306,2895, 17356,17977,30306, 2105, 6444, 1397, 5293, 43333,1670, 8661, 38034,4226, 43332,5461, 5117, 40544,43332,32774,33370,30263,27597,26211,13349,3509, 2865, 1701, 21213,28549,14511,34048, - 43332,13016,35820,43332,8902, 43331,37018,37018,7690, 37862,27268,15842,29132,43331,40544,43331,32774,43331,43330,460, 1006, 25483,40543,40543,2428, 31002,395, - 37018,6358, 30902,39259,2257, 15856,17390,30419,33849,37018,40543,987, 37984,3670, 11390,40543,16290,38548,35819,5833, 2608, 40542,26231,428, 31216,3492, 2188, + 43332,13016,35820,43332,8902, 43331,37018,37018,7690, 37862,27268,15842,29132,43331,40544,43331,32774,43331,43330,460, 1006, 25483,40543,40543,2428, 31002,395, + 37018,6358, 30902,39259,2257, 15856,17390,30419,33849,37018,40543,987, 37984,3670, 11390,40543,16290,38548,35819,5833, 2608, 40542,26231,428, 31216,3492, 2188, 12011,5602, 3521, 21968,23874,3297, 2864, 36046,18360,750, 3003, 37898,23631,43330,34841,6842, 30901,18329,466, 5253, 528, 31331,575, 24446,726, 949, 36161, 29131,26210,1112, 18190,43330,2508, 9453, 10618,32985,10261,33915,9304, 15469,12988,30039,24797,3111, 676, 17889,590, 5, 13662,10283,36443,20838,9324, 37017, 34841,3247, 1993, 1333, 2946, 13208,6698, 34048,43330,21266,2319, 20822,22400,8612, 27586,22872,994, 25865,12218,32995,9303, 208, 23022,3110, 40542,3669, 21322, @@ -14851,26 +14846,26 @@ static const unsigned short Ranks[197839] = 987, 37016,10170,17154,1582, 40539,11168,712, 15917,31859,20666,2032, 6979, 43327,10563,21174,2665, 1031, 423, 17805,34111,13994,6979, 19275,4498, 6403, 10743, 5849, 18131,10527,12217,37576,1163, 713, 6531, 40539,27823,36182,20243,36484,43326,40539,12531,26742,40539,21211,2301, 9318, 887, 452, 40538,29888,15683,17985, 32773,14583,34047,43326,178, 14924,19823,43326,11831,19567,2399, 38493,16956,43326,38545,40538,37016,196, 27583,11017,38545,40538,38545,10824,6922, 15034,36748, - 30898,12987,38545,3488, 23593,7689, 19154,3592, 40538,21271,33369,468, 10670,40537,32773,38936,27691,24101,36434,33214,15033,12216,18359,37865,38544,8363, 523, - 38455,19001,1757, 24973,43325,36165,5563, 40537,819, 2302, 508, 2591, 37016,25025,438, 10869,561, 1687, 7932, 22081,21391,29539,35243,5287, 15218,38544,3109, + 30898,12987,38545,3488, 23593,7689, 19154,3592, 40538,21271,33369,468, 10670,40537,32773,38936,27691,24101,36434,33214,15033,12216,18359,37865,38544,8363, 523, + 38455,19001,1757, 24973,43325,36165,5563, 40537,819, 2302, 508, 2591, 37016,25025,438, 10869,561, 1687, 7932, 22081,21391,29539,35243,5287, 15218,38544,3109, 35818,6136, 25522,28535,5131, 4669, 37015,27701,38848,35818,38544,516, 35818,34572,2291, 34461,1145, 34010,20708,32565,13772,27224,3227, 33710,13612,34047,37015, 31675,16103,389, 2174, 10609,9745, 33252,26080,37573,4677, 32885,15675,10716,37015,29895,43325,24296,22839,33584,32770,21173,16880,33717,36262,17354,7994, 40537, - 37334,25495,434, 15341,13584,37015,43325,34761,38544,34266,16440,43325,21612,36127,29657,18358,7191, 15032,8944, 18783,15031,15030,12582,29706,10780,37945,9157, + 37334,25495,434, 15341,13584,37015,43325,34761,38544,34266,16440,43325,21612,36127,29657,18358,7191, 15032,8944, 18783,15031,15030,12582,29706,10780,37945,9157, 22055,3901, 12027,21210,2829, 1529, 14461,1566, 18357,3947, 18356,9986, 3006, 20671,36386,24969,4389, 13379,34952,37529,34805,14452,30317,24739,38543,17353,43324, 34166,43324,43324,40537,16439,32772,10169,35817,32772,21172,10526,9493, 18355,12986,19660,20383,5934, 17370,13914,37014,24972,37014,9186, 15107,11293,17014,24986, 27935,11016,18304,36892,38762,3611, 6576, 12532,9876, 19288,35006,6719, 8513, 11874,11506,11579,38503,3132, 9997, 34047,26784,10322,11292,38543,38543,36517,24971, - 19726,36307,26209,9875, 40536,43324,18371,34154,43323,34047,2343, 34963,38603,1858, 35662,3296, 3159, 3048, 40536,36743,1068, 14020,17352,5136, 2265, 23997,4850, + 19726,36307,26209,9875, 40536,43324,18371,34154,43323,34047,2343, 34963,38603,1858, 35662,3296, 3159, 3048, 40536,36743,1068, 14020,17352,5136, 2265, 23997,4850, 6052, 959, 12870,7473, 3040, 34721,17124,34840,4554, 2822, 4855, 40536,31095,635, 18413,10316,35817,43323,580, 34721,35763,38423,38816,43323,24970,33369,33369, - 5329, 27582,12077,16515,43323,15427,10370,12080,3815, 15656,6579, 15868,20757,2301, 437, 707, 1935, 7322, 730, 39144,14473,963, 427, 36420,24134,99, 2131, + 5329, 27582,12077,16515,43323,15427,10370,12080,3815, 15656,6579, 15868,20757,2301, 437, 707, 1935, 7322, 730, 39144,14473,963, 427, 36420,24134,99, 2131, 21722,20234,27006,21736,20866,19337,7302, 314, 11932,31803,21095,11563,5192, 18354,30474,9013, 12471,5357, 27926,29399,29130,17992,11015,5564, 4078, 35981,11643, 15486,9221, 18206,30388,12303,35817,35817,30897,37014,43322,21210,23129,38205,29471,134, 25028,31284,25445,23349,3508, 18617,446, 24082,29843,25084,35816,30896, 28705,33460,36903,16102,14859,14228,34840,30895,6187, 17139,432, 32772,11014,20486,2125, 36387,31351,35022,870, 8619, 40536,2312, 43322,34840,2083, 24684,18353, 1700, 26258,10315,32842,37014,40535,621, 3112, 1500, 2526, 36663,2125, 21181,37013,40535,12215,15674,21171,11291,7735, 37629,33292,872, 6676, 18578,43322,34428, 2673, 16913,10908,19322,19368,6756, 4919, 7121, 8400, 17351,14460,16438,37013,622, 7320, 27114,8518, 6185, 17919,24971,38397,28445,23061,18857,43322,4562, 34660, - 1330, 2350, 1558, 4315, 4297, 5419, 1964, 4412, 28665,19848,38728,11881,12256,9492, 13731,8673, 24561,26950,38121,3673, 34321,22871,38399,32228,8103, 11239,7234, + 1330, 2350, 1558, 4315, 4297, 5419, 1964, 4412, 28665,19848,38728,11881,12256,9492, 13731,8673, 24561,26950,38121,3673, 34321,22871,38399,32228,8103, 11239,7234, 18352,1043, 12581,34699,8512, 7959, 34839,43321,40535,43321,37013,22023,34038,19659,43321,10612,15011,31294,19658,13861,16902,27737,19084,34212,17493,13524,38543, 1514, 3359, 3167, 38032,4499, 4260, 10827,4101, 14696,8650, 22760,33631,34046,10534,33129,33138,35400,15721,35816,13447,34029,32831,33818,38360,27581,38016,43321, - 38542,18810,12769,28074,33374,17938,33030,35472,25518,7604, 20919,15755,37660,36928,37013,33116,12985,24126,13446,15029,5741, 35900,7846, 2522, 10742,11013,9737, + 38542,18810,12769,28074,33374,17938,33030,35472,25518,7604, 20919,15755,37660,36928,37013,33116,12985,24126,13446,15029,5741, 35900,7846, 2522, 10742,11013,9737, 34046,37822,21170,19926,11621,15425,26502,17156,8396, 32772,10077,15485,16437,4273, 21658,13397,6779, 13187,12609,4254, 21065,34859,11492,6453, 26774,31515,39238, 8907, 8818, 4772, 7022, 5935, 25291,3318, 3271, 11104,4252, 3209, 2231, 5078, 5706, 3442, 34220,25745,20776,14523,32093,21169,38825,30085,9874, 36016,8132, 34749, 15875,38123,10149,36601,4947, 19657,19508,33246,141, 3743, 6984, 3610, 10076,8233, 37605,25655,21168,29391,9669, 15673,7538, 24656,38697,9650, 9615, 21098,36269, @@ -14880,40 +14875,40 @@ static const unsigned short Ranks[197839] = 35450,1573, 2256, 34137,12214,1909, 1254, 19655,6904, 21714,37104,36589,23530,15782,7502, 36055,10763,12984,21629,38570,26264,574, 19135,28779,33369,33824,26050, 19654,27636,8783, 36792,17984,5967, 20551,5928, 2470, 4538, 20618,21949,9546, 43320,33059,35110,30497,3555, 35784,38349,1957, 1262, 1498, 6902, 8428, 4628, 40534, 19822,34046,34046,43320,32771,33368,23830,11389,1344, 38542,38065,34430,21183,11388,22022,5361, 27580,38541,16101,38541,38541,34839,18577,37012,16100,15682,40533, - 12811,37012,35816,37012,33368,30894,9461, 35537,21918,12810,43319,33368,33368,43319,43319,40533,21209,35817,38541,39213,664, 16561,22870,25121,7193, 748, 5389, + 12811,37012,35816,37012,33368,30894,9461, 35537,21918,12810,43319,33368,33368,43319,43319,40533,21209,35817,38541,39213,664, 16561,22870,25121,7193, 748, 5389, 784, 2182, 1547, 34798,32771,13156,273, 5736, 33367,34113,37012,1456, 37011,33367,37011,43319,37840,22021,8739, 34838,7958, 35815,5399, 5024, 38540,10314,38540, 38540,15624,37011,34045,218, 26196,7625, 16931,34738,11599,15681,40533,33367,8166, 36740,6232, 9187, 22039,8436, 9934, 35815,17350,18350,4985, 34989,14940,36105, - 35815,43318,4111, 3553, 8069, 11471,21167,35720,12433,7397, 35631,35427,43318,867, 25694,431, 14123,27995,13118,40533,14583,13677,38407,29253,669, 28826,6983, + 35815,43318,4111, 3553, 8069, 11471,21167,35720,12433,7397, 35631,35427,43318,867, 25694,431, 14123,27995,13118,40533,14583,13677,38407,29253,669, 28826,6983, 1881, 1599, 21289,9156, 5144, 33117,37011,10700,43318,36334,24894,26775,14594,4295, 11389,36443,36785,18515,24728,4739, 6841, 11012,6149, 30179,8510, 3248, 14208, 14183,35611,16164,39399,33541,7353, 9460, 38540,38477,39383,14897,30893,31045,43318,18576,43317,34045,38539,40532,33367,24170,1798, 37176,22453,43317,34045,19674, - 34838,12983,43317,14227,43317,828, 11598,40532,38539,36508,35932,2173, 28168,37770,30892,38902,19653,2804, 9873, 3237, 34382,43316,186, 26550,15672,35930,8361, - 19652,10899,21166,8277, 36895,35784,14533,8743, 36626,20691,9090, 3877, 3821, 22870,37255,15561,270, 28620,20485,1427, 1223, 33686,8833, 2804, 35592,12450,3328, - 26122,16773,13648,33771,17058,27026,30891,25842,13942,40532,34045,2751, 7124, 21165,18575,38628,11629,38359,7414, 33377,34838,17349,9450, 20357,34867,38539,8738, + 34838,12983,43317,14227,43317,828, 11598,40532,38539,36508,35932,2173, 28168,37770,30892,38902,19653,2804, 9873, 3237, 34382,43316,186, 26550,15672,35930,8361, + 19652,10899,21166,8277, 36895,35784,14533,8743, 36626,20691,9090, 3877, 3821, 22870,37255,15561,270, 28620,20485,1427, 1223, 33686,8833, 2804, 35592,12450,3328, + 26122,16773,13648,33771,17058,27026,30891,25842,13942,40532,34045,2751, 7124, 21165,18575,38628,11629,38359,7414, 33377,34838,17349,9450, 20357,34867,38539,8738, 38539,33366,10168,33934,7688, 35815,23829,12213,6968, 12209,4758, 1951, 6108, 7574, 4906, 34044,40532,19417,14458,13479,35962,10525,14075,19339,17348,34634,32806, - 43316,18349,36552,14919,190, 2478, 7428, 16202,38820,33654,695, 33430,1974, 19153,4365, 5008, 961, 1900, 3172, 14457,2775, 23751,3980, 6344, 8008, 11273,3596, + 43316,18349,36552,14919,190, 2478, 7428, 16202,38820,33654,695, 33430,1974, 19153,4365, 5008, 961, 1900, 3172, 14457,2775, 23751,3980, 6344, 8008, 11273,3596, 1022, 15410,30525,22987,21164,36237,15631,31067,18348,3654, 9896, 4858, 12513,6702, 11562,18347,10741,38538,34044,584, 1509, 6028, 3945, 19651,1237, 16198,26250, 11561,34076,3296, 35814,20298,37172,21876,13215,34769,15612,9302, 28339,11880,34991,34885,1571, 33963,7169, 38568,14702,6637, 16436,6900, 35457,22942,14235,36629, 12212,15671,11597,37189,10842,37966,34527,30901,38174,3926, 10313,6291, 7626, 35814,3762, 33366,35814,37703,3465, 43316,12982,6652, 35076,35697,1345, 32711,33366, - 13941,29129,15290,27579,43316,21496,38696,35148,14744,33512,36040,19901,33565,34156,2760, 17053,7319, 29374,35858,38793,20533,33630,13445,38866,7967, 1035, 1202, - 18728,13955,15833,8375, 3595, 13352,38347,10726,34288,8330, 7391, 33901,26112,7449, 12897,3044, 35814,35813,33561,26207,13891,43315,3008, 34838,17446,2846, 5750, + 13941,29129,15290,27579,43316,21496,38696,35148,14744,33512,36040,19901,33565,34156,2760, 17053,7319, 29374,35858,38793,20533,33630,13445,38866,7967, 1035, 1202, + 18728,13955,15833,8375, 3595, 13352,38347,10726,34288,8330, 7391, 33901,26112,7449, 12897,3044, 35814,35813,33561,26207,13891,43315,3008, 34838,17446,2846, 5750, 13409,11503,35048,12809,38990,33055,19138,30695,35757,11011,35099,37852,37136,30782,40531,6961, 35944,39073,16077,29656,33566,10296,21163,14064,40531,39168,43315, 25885,34149,34914,27005,15503,38845,34365,33225,15887,12204,1999, 35860,35859,35813,35108,17347,7537, 3259, 35604,16860,32881,13521,34722,33971,31935,5848, 13442, 19047,33763,9562, 33359,21852,19040,15028,2560, 36708,43315,18294,35157,31220,26989,31385,32921,33923,10172,11879,11462,38958,37985,11560,35849,32598,7150, 11059, 38500,34475,30527,37263,12113,21015,3046, 19764,33788,13019,442, 14646,1012, 12436,26745,20913,14531,11883,13600,31656,11663,35099,12313,17346,15600,7268, 23421, 16435,36564,29086,38591,37068,38170,17345,26206,7431, 32771,12563,39077,8612, 24130,35813,37318,24712,5360, 33655,32876,34425,18346,8843, 29128,43315,43314,26205, - 12076,1837, 43314,29127,38538,38538,37010,15165,12075,33366,16099,22020,38538,1284, 7802, 3993, 25983,9025, 8119, 29189,2754, 19821,38511,13590,29056,15935,1575, + 12076,1837, 43314,29127,38538,38538,37010,15165,12075,33366,16099,22020,38538,1284, 7802, 3993, 25983,9025, 8119, 29189,2754, 19821,38511,13590,29056,15935,1575, 19440,28206,33100,18049,13999,28777,36798,3676, 18793,31872,26917,15670,33674,14837,21939,3332, 4181, 15669,14549,19206,39065,21033,2806, 3897, 38047,8939, 34195, 7495, 33159,6394, 36433,30890,22652,34837,23571,26229,5144, 37010,43314,13818,6339, 33949,11156,38254,990, 24858,1921, 16373,35092,39359,10379,39382,36109,21179, - 3530, 8993, 38164,15668,1788, 13071,10789,38753,34358,26342,740, 43314,13304,18471,29142,12976,8351, 38304,33126,43313,9399, 2908, 4046, 2951, 12580,17344,8957, + 3530, 8993, 38164,15668,1788, 13071,10789,38753,34358,26342,740, 43314,13304,18471,29142,12976,8351, 38304,33126,43313,9399, 2908, 4046, 2951, 12580,17344,8957, 909, 9324, 40531,31576,8480, 24969,25106,37409,34774,40531,13319,5057, 33946,14923,19820,43313,34044,33365,30144,16695,38537,38537,15680,33365,35813,43313,43313, 35812,37010,40530,23965,37010,36048,43312,35343,27018,32771,36030,34837,4816, 3956, 43312,29520,35812,15320,20336,6754, 33365,26204,14790,14617,6452, 2346, 23433, 15493,5885, 37309,23812,40530,11439,20051,34044,37406,34043,16434,43312,37036,27002,15944,37667,34154,43312,9450, 14658,29668,35037,40530,8509, 33375,29555,24695, - 36641,37828,19191,14922,14921,13125,38537,37504,33, 9659, 27741,33018,16022,19429,18541,32926,26759,169, 8280, 37477,32796,43311,668, 38537,40530,389, 710, - 37009,11596,354, 5091, 2163, 33216,4515, 31948,25169,216, 292, 11794,40529,11387,8968, 14252,160, 2706, 23619,34041,19819,37009,31109,36423,33365,33787,8959, - 15290,37520,43311,38536,30075,37009,24968,17796,36047,37009,36833,16700,37312,10994,34273,19332,34043,43311,31708,40529,38536,2124, 15679,13978,16433,1088, 2521, - 24766,43311,4302, 373, 37008,2491, 34837,21843,2705, 33283,34837,34836,43310,20823,866, 16194,43310,37053,22869,34836,29519,84, 23604,986, 394, 300, 482, - 10976,20305,32814,27578,43310,1711, 40529,33364,43310,21162,29126,14513,8252, 37733,21161,15027,38536,32755,34635,37008,34836,10305,5040, 35127,37431,1047, 2624, - 31867,26537,20933,27577,43309,24967,4642, 3639, 3595, 34019,13444,36224,6680, 21160,37140,19650,34043,34043,19507,15678,34042,638, 31305,12117,9717, 2707, 3756, + 36641,37828,19191,14922,14921,13125,38537,37504,33, 9659, 27741,33018,16022,19429,18541,32926,26759,169, 8280, 37477,32796,43311,668, 38537,40530,389, 710, + 37009,11596,354, 5091, 2163, 33216,4515, 31948,25169,216, 292, 11794,40529,11387,8968, 14252,160, 2706, 23619,34041,19819,37009,31109,36423,33365,33787,8959, + 15290,37520,43311,38536,30075,37009,24968,17796,36047,37009,36833,16700,37312,10994,34273,19332,34043,43311,31708,40529,38536,2124, 15679,13978,16433,1088, 2521, + 24766,43311,4302, 373, 37008,2491, 34837,21843,2705, 33283,34837,34836,43310,20823,866, 16194,43310,37053,22869,34836,29519,84, 23604,986, 394, 300, 482, + 10976,20305,32814,27578,43310,1711, 40529,33364,43310,21162,29126,14513,8252, 37733,21161,15027,38536,32755,34635,37008,34836,10305,5040, 35127,37431,1047, 2624, + 31867,26537,20933,27577,43309,24967,4642, 3639, 3595, 34019,13444,36224,6680, 21160,37140,19650,34043,34043,19507,15678,34042,638, 31305,12117,9717, 2707, 3756, 11290,21159,8791, 19695,35812,40529,34812,30102,23828,4880, 33364,37008,29234,10629,33594,13318,43309,14920,22019,37008,38536,33364,34836,21782,27694,32376,11878, 6758, 25590,6372, 9479, 26248,22438,43309,32770,379, 37343,8967, 34835,477, 23992,21208,27561,33814,2863, 33837,34633,37033,34893,29455,37604,35801,36230,27161, 37161,39256,22590,31538,38540,38491,43309,38535,22886,24966,43308,37007,24259,38535,18017,23769,27646,30889,5390, 2627, 10740,10310,32155,11559,14550,10304,17935, @@ -14921,70 +14916,70 @@ static const unsigned short Ranks[197839] = 35734,43308,32770,26203,17412,33284,27029,38534,37007,43308,32770,38534,35230,43307,35812,37007,8397, 21880,34835,38534,34297,23540,30221,34582,35811,27576,38534, 33364,944, 1765, 43307,40528,35811,43307,22377,23903,34042,30151,32715,6813, 17364,976, 25193,6016, 9239, 9668, 43307,10465,24965,38533,22868,34042,27118,34205, 11289,10167,35635,26202,13508,38533,27453,27575,36794,36845,29308,43306,35811,38327,40528,34054,33363,38975,39269,22018,7135, 35811,26505,33130,14919,43306,40528, - 35810,34368,21481,39327,38533,43306,43306,35037,38533,43305,43305,26201,35810,21207,6186, 39047,33903,5148, 11010,35810,40527,40527,28881,39306,24964,35810,4089, + 35810,34368,21481,39327,38533,43306,43306,35037,38533,43305,43305,26201,35810,21207,6186, 39047,33903,5148, 11010,35810,40527,40527,28881,39306,24964,35810,4089, 43305,19643,34835,38532,12300,8394, 36659,21158,40527,40527,18344,14341,735, 38256,18343,33363,29028,40526,26200,38569,40526,43305,43304,15667,14456,34542,10371, 34291,17782,8966, 38532,30779,34042,37007,6035, 14449,13723,20152,43304,40526,1160, 24963,24405,540, 40526,33363,38532,38532,33157,40525,38531,43304,29125,34041, 21206,38622,18168,10428,12627,557, 30888,22234,40525,35809,14918,37006,2793, 32769,40525,3697, 38531,27574,1086, 462, 7619, 40525,19185,12074,11386,34041,14162, 29124,4054, 25477,22346,38516,34308,30276,32769,22692,16971,35308,34543,43304,1593, 35809,32912,13925,35353,31559,26199,4857, 21157,6629, 14226,24395,14156,43303, - 7603, 13890,35809,43303,5643, 17411,25112,40524,5357, 34835,43303,1674, 33363,34834,35599,35505,27573,43303,36096,43302,38715,36627,8059, 3132, 10885,20434,3632, + 7603, 13890,35809,43303,5643, 17411,25112,40524,5357, 34835,43303,1674, 33363,34834,35599,35505,27573,43303,36096,43302,38715,36627,8059, 3132, 10885,20434,3632, 34213,38531,43302,10943,3538, 34302,40524,8806, 2337, 37426,38004,2565, 11009,43302,33119,8611, 38531,18573,3007, 43302,26198,449, 38251,29123,34041,34416,40524, 38530,37006,33757,17983,20484,34041,20212,38530,31791,5631, 1934, 43301,34834,1595, 252, 7753, 2422, 1440, 6022, 6399, 29122,38397,33256,39111,6808, 35808,14438, - 35809,30887,19649,33711,35844,40524,38460,12578,924, 2964, 37037,14458,35808,15857,504, 36068,3286, 8508, 33362,18841,3591, 20905,30109,22150,27572,693, 1992, + 35809,30887,19649,33711,35844,40524,38460,12578,924, 2964, 37037,14458,35808,15857,504, 36068,3286, 8508, 33362,18841,3591, 20905,30109,22150,27572,693, 1992, 511, 402, 33362,2205, 10166,586, 38340,37006,43301,21401,21205,43301,15289,20117,10823,43301,616, 40523,34182,43300,38459,30886,9602, 4088, 12073,43300,27154, 132, 35263,35709,12562,40523,3618, 1132, 3379, 12375,9240, 29739,16003,29302,29121,40523,34040,19648,37006,40523,34121,3663, 4630, 22206,28889,32769,20006,18342, 370, 40522,27317,33362,7966, 16432,29661,27620,6044, 1564, 25284,22048,26197,40522,29120,20483,38323,32769,10524,34529,40522,34897,13611,18985,6160, 17271,39014, 27016,37005,27571,43300,37005,24895,38946,7149, 36149,36896,38648,37563,37590,1379, 4882, 23406,9667, 32790,10075,38530,32843,13128,15039,43300,15288,38700,34040, 38173,2840, 14428,7148, 33747,38657,1235, 34239,2907, 420, 6999, 30512,33437,7654, 125, 36584,2520, 1572, 35808,8790, 17137,11385,1913, 29119,7736, 31427,14582, 9491, 4436, 12211,3123, 10645,21204,3949, 5240, 21488,35634,24626,37602,1618, 9082, 14571,6225, 18881,29629,19183,25319,37474,10937,37907,14669,25488,26663,24718, - 17721,34929,29530,33289,34474,10851,3820, 12981,2227, 14237,7055, 34834,27395,37962,15666,19940,6164, 34828,35808,23827,23292,10231,36847,19318,11313,43299,7434, + 17721,34929,29530,33289,34474,10851,3820, 12981,2227, 14237,7055, 34834,27395,37962,15666,19940,6164, 34828,35808,23827,23292,10231,36847,19318,11313,43299,7434, 38413,33590,13652,37352,40522,25023,12257,23208,34206,19152,37454,3668, 506, 40521,37699,5971, 43299,3667, 40521,11384,43299,43299,40521,18997,36536,28071,26129, 13418,38530,14564,18821,24184,24570,3565, 13611,34332,34834,21203,34065,4472, 1348, 34040,16431,27702,31347,36961,10009,11354,17609,7000, 26946,8502, 36215,37453, - 30390,21518,38569,5398, 22867,38529,34743,3047, 10807,3507, 79, 17756,11678,533, 35344,14805,1880, 689, 33001,37309,13940,38529,15175,13056,419, 3590, 1312, + 30390,21518,38569,5398, 22867,38529,34743,3047, 10807,3507, 79, 17756,11678,533, 35344,14805,1880, 689, 33001,37309,13940,38529,15175,13056,419, 3590, 1312, 38899,39009,9560, 35990,32854,33561,40521,36183,34066,7068, 38465,34827,18319,1662, 2906, 319, 12577,16414,37162,36998,33351,24774,9301, 19647,31287,19809,27203, 6940, 19646,13514,36946,10987,36829,29954,38230,35392,38610,36663,34222,36450,38824,36615,35832,37675,3589, 11182,8340, 37611,37005,8511, 3088, 34040,15287,35169, - 19871,3456, 23867,12146,37806,20072,37836,37522,36804,28562,16206,25215,33220,22929,39344,10568,29262,30959,31828,38231,27302,2505, 32879,429, 20470,314, 4673, + 19871,3456, 23867,12146,37806,20072,37836,37522,36804,28562,16206,25215,33220,22929,39344,10568,29262,30959,31828,38231,27302,2505, 32879,429, 20470,314, 4673, 35886,34126,39358,37020,7474, 32835,37848,39260,27948,24007,34190,16430,3920, 16329,43298,12561,25651,30885,22594,3226, 26334,876, 13576,43298,16046,34308,13699, - 32855,33523,16098,22432,3295, 16376,37173,36664,33997,12707,30210,43298,33013,22017,22866,35808,36443,37593,38889,25962,30477,140, 15026,6051, 4823, 13443,5111, + 32855,33523,16098,22432,3295, 16376,37173,36664,33997,12707,30210,43298,33013,22017,22866,35808,36443,37593,38889,25962,30477,140, 15026,6051, 4823, 13443,5111, 20574,20039,13976,10668,16449,33897,11288,15665,6044, 5898, 15050,8730, 3342, 10543,35051,33267,35805,1616, 281, 28456,43298,36364,43297,19645,7254, 36288,37389, 6834, 3928, 33605,17886,863, 795, 4381, 15420,8675, 6298, 39281,20852,16464,19763,33639,37550,35824,38529,36087,38529,34039,11830,43297,43297,46, 43297,40520, 22016,13497,11634,11877,17341,29783,34789,11491,32997,32958,37222,34413,29118,40520,37144,38528,10739,21156,8101, 14225,26682,672, 37784,8278, 37005,43296,37004, 20080,1651, 2490, 1933, 1991, 35807,11405,57, 1965, 3742, 103, 35203,27570,10675,12210,582, 6753, 8406, 26157,8610, 19818,5431, 34778,34039,29822,381, 14455, - 18432,30983,384, 3255, 19644,407, 35103,36679,125, 11008,16429,32768,21794,17340,24122,38490,23826,2217, 19423,40520,241, 711, 29117,12576,34386,7843, 6188, - 35256,37004,2449, 37004,34833,43296,39140,8609, 4306, 6840, 43296,35807,40520,19396,9080, 13317,15950,39045,7534, 8372, 40519,3209, 23825,35807,43296,40519,6025, + 18432,30983,384, 3255, 19644,407, 35103,36679,125, 11008,16429,32768,21794,17340,24122,38490,23826,2217, 19423,40520,241, 711, 29117,12576,34386,7843, 6188, + 35256,37004,2449, 37004,34833,43296,39140,8609, 4306, 6840, 43296,35807,40520,19396,9080, 13317,15950,39045,7534, 8372, 40519,3209, 23825,35807,43296,40519,6025, 35807,3876, 11194,19643,24089,572, 7557, 16260,13610,40519,40519,43295,4497, 185, 32596,331, 21155,2081, 18968,328, 14529,130, 12209,707, 6116, 1100, 16954, - 19506,14573,32021,18572,1162, 34039,29116,30044,16149,13859,9263, 31956,5031, 9832, 14811,13108,26569,3506, 15664,35806,9872, 6297, 36204,9128, 25386,664, 7523, + 19506,14573,32021,18572,1162, 34039,29116,30044,16149,13859,9263, 31956,5031, 9832, 14811,13108,26569,3506, 15664,35806,9872, 6297, 36204,9128, 25386,664, 7523, 17643,4114, 34708,16428,3564, 1409, 572, 29734,8911, 7492, 33012,7089, 7536, 35806,40518,34858,35075,37004,13889,18341,15025,43295,3588, 22865,37003,40518,39143, 27621,15106,12016,13478,15192,18237,17537,27569,37889,5229, 2176, 26572,4520, 26253,7278, 2587, 15512,7319, 1571, 1451, 24144,35806,34659,32640,30161,26340,38350, 38803,3046, 5288, 13055,18007,32065,38528,10822,27568,43295,12021,5287, 15286,33362,27567,8277, 10165,28639,37003,17410,738, 26224,23824,38528,34435,32085,20052, - 39159,29115,11174,3236, 7233, 15024,14647,19642,10583,33374,1369, 28336,21154,229, 6839, 7965, 4408, 8507, 35642,28114,14454,2396, 35690,2688, 5157, 2862, 3701, - 35127,6402, 15738,7952, 5792, 360, 1244, 5123, 40518,31096,23397,18340,21153,37508,17118,14778,25491,1912, 3654, 21726,5460, 20425,5997, 4863, 30615,25646,4836, + 39159,29115,11174,3236, 7233, 15024,14647,19642,10583,33374,1369, 28336,21154,229, 6839, 7965, 4408, 8507, 35642,28114,14454,2396, 35690,2688, 5157, 2862, 3701, + 35127,6402, 15738,7952, 5792, 360, 1244, 5123, 40518,31096,23397,18340,21153,37508,17118,14778,25491,1912, 3654, 21726,5460, 20425,5997, 4863, 30615,25646,4836, 5294, 6360, 11876,8017, 9088, 29531,10607,7598, 8290, 2953, 6752, 925, 34137,24616,21152,37082,17539,12666,534, 13939,17061,2139, 4474, 36942,6620, 4044, 17339, - 15663,11787,33265,9534, 3575, 14929,4325, 12763,1034, 35556,5687, 19612,26721,5668, 8506, 9732, 37663,12178,23311,21867,34330,33555,13547,35006,23624,4436, 918, + 15663,11787,33265,9534, 3575, 14929,4325, 12763,1034, 35556,5687, 19612,26721,5668, 8506, 9732, 37663,12178,23311,21867,34330,33555,13547,35006,23624,4436, 918, 34613,2657, 24645,12208,1210, 38542,22311,17608,30120,27189,8956, 19597,35818,8266, 4441, 12099,5009, 6362, 32321,33741,22630,2552, 2455, 34124,19051,37429,13174, - 14987,15662,36359,35589,20010,20887,37949,6982, 16427,19641,10402,10914,240, 5217, 2040, 15661,13938,11007,19640,14833,35378,4521, 2157, 16533,8602, 2695, 9666, - 30627,7862, 15410,682, 4457, 15023,21687,17099,34042,34039,39301,22750,32247,9665, 9472, 17439,22111,33646,6596, 11444,35144,6822, 12380,36248,2070, 6364, 3876, + 14987,15662,36359,35589,20010,20887,37949,6982, 16427,19641,10402,10914,240, 5217, 2040, 15661,13938,11007,19640,14833,35378,4521, 2157, 16533,8602, 2695, 9666, + 30627,7862, 15410,682, 4457, 15023,21687,17099,34042,34039,39301,22750,32247,9665, 9472, 17439,22111,33646,6596, 11444,35144,6822, 12380,36248,2070, 6364, 3876, 6751, 10738,10419,17338,17337,32895,21613,11875,4617, 21151,34038,36931,12980,36562,5879, 1868, 6115, 7535, 11827,35566,21150,2985, 2876, 8403, 1441, 2700, 27726, - 16105,3547, 17336,9155, 21149,32126,36837,32086,36788,21148,18339,15693,2634, 1183, 37404,1779, 37169,2811, 5160, 9533, 37331,37003,1400, 2030, 1368, 39050,9741, + 16105,3547, 17336,9155, 21149,32126,36837,32086,36788,21148,18339,15693,2634, 1183, 37404,1779, 37169,2811, 5160, 9533, 37331,37003,1400, 2030, 1368, 39050,9741, 8656, 23052,19639,1200, 2124, 2320, 10321,9765, 34502,5116, 33361,9300, 16514,25703,21931,19817,21195,36310,2126, 37740,21366,21556,9871, 8789, 37096,22962,36616, 34291,30127,31753,17335,19638,8100, 36971,12979,22516,32509,3687, 36195,2660, 25095,1161, 34832,3273, 8922, 15168,26126,1331, 31580,23865,9693, 10328,35342,10954, - 12567,36439,549, 37966,10843,15660,7416, 2857, 1165, 16426,1057, 3731, 32993,15022,11558,19637,18907,1630, 5529, 5084, 10074,3461, 36136,17334,36370,29219,8655, - 35211,15216,36499,7405, 8057, 2873, 3814, 1511, 38745,802, 1857, 2126, 3925, 15200,2559, 2083, 11780,7792, 7518, 22014,28207,7845, 2727, 1644, 3946, 28021,2999, - 8955, 11006,5153, 11874,21409,19154,489, 1978, 2745, 2277, 1307, 5030, 12575,16425,38076,4784, 4171, 2695, 4264, 6538, 6679, 5898, 37484,5219, 23830,9896, 6681, - 19154,8099, 7320, 3196, 11352,12574,3111, 17684,3999, 375, 27406,7025, 5692, 4831, 2200, 7844, 33056,4506, 33165,4319, 6075, 10072,9229, 13923,34187,14516,3245, - 27681,5405, 11756,18993,10581,4867, 11243,2562, 2427, 11287,12142,5562, 4888, 18350,37086,33412,2574, 12832,35767,19736,35472,35851,904, 8192, 26694,1590, 6019, - 5333, 1945, 13042,13247,35368,34388,5102, 8954, 33143,10923,16424,4075, 17147,21107,21835,6395, 23070,17333,3964, 19636,14891,4641, 14093,37367,2779, 35995,930, - 31599,38780,3120, 3133, 7100, 36286,21048,1613, 32852,4914, 1329, 2556, 28718,2224, 33036,10523,3368, 20372,12207,18338,21147,10645,6537, 15659,1405, 33379,9366, - 2915, 5312, 24672,43295,17332,12285,10073,33875,25796,22657,38758,37357,32835,33909,33268,11557,21146,21145,5326, 19635,876, 20465,21449,29498,11016,5813, 6265, + 12567,36439,549, 37966,10843,15660,7416, 2857, 1165, 16426,1057, 3731, 32993,15022,11558,19637,18907,1630, 5529, 5084, 10074,3461, 36136,17334,36370,29219,8655, + 35211,15216,36499,7405, 8057, 2873, 3814, 1511, 38745,802, 1857, 2126, 3925, 15200,2559, 2083, 11780,7792, 7518, 22014,28207,7845, 2727, 1644, 3946, 28021,2999, + 8955, 11006,5153, 11874,21409,19154,489, 1978, 2745, 2277, 1307, 5030, 12575,16425,38076,4784, 4171, 2695, 4264, 6538, 6679, 5898, 37484,5219, 23830,9896, 6681, + 19154,8099, 7320, 3196, 11352,12574,3111, 17684,3999, 375, 27406,7025, 5692, 4831, 2200, 7844, 33056,4506, 33165,4319, 6075, 10072,9229, 13923,34187,14516,3245, + 27681,5405, 11756,18993,10581,4867, 11243,2562, 2427, 11287,12142,5562, 4888, 18350,37086,33412,2574, 12832,35767,19736,35472,35851,904, 8192, 26694,1590, 6019, + 5333, 1945, 13042,13247,35368,34388,5102, 8954, 33143,10923,16424,4075, 17147,21107,21835,6395, 23070,17333,3964, 19636,14891,4641, 14093,37367,2779, 35995,930, + 31599,38780,3120, 3133, 7100, 36286,21048,1613, 32852,4914, 1329, 2556, 28718,2224, 33036,10523,3368, 20372,12207,18338,21147,10645,6537, 15659,1405, 33379,9366, + 2915, 5312, 24672,43295,17332,12285,10073,33875,25796,22657,38758,37357,32835,33909,33268,11557,21146,21145,5326, 19635,876, 20465,21449,29498,11016,5813, 6265, 12778,5350, 37748,33802,28055,9427, 7734, 17331,17330,11873,7420, 38262,21471,14670,18337,34471,28584,13442,10303,2549, 37615,31387,38407,30116,6838, 19801,10302, 17329,32943,11857,24439,10301,37050,12573,36485,15069,18011,36433,608, 13291,1508, 10579,37579,15003,12070,12978,11872,11849,14453,22988,36965,24793,23385,28228, - 19697,36750,34830,5430, 32404,17328,23235,37897,34336,22519,24804,37003,19411,576, 8159, 19634,4665, 8788, 5143, 11187,2949, 21570,18336,16423,11556,8360, 8359, + 19697,36750,34830,5430, 32404,17328,23235,37897,34336,22519,24804,37003,19411,576, 8159, 19634,4665, 8788, 5143, 11187,2949, 21570,18336,16423,11556,8360, 8359, 16422,10300,11871,17327,34109,18571,38528,43294,376, 7843, 32119,15021,37355,15131,40518,27806,26355,3653, 8654, 14452,38794,7352, 32768,30885,15676,22864,14562, 7134, 38527,36724,34038,34038,32768,40517,43294,35806,43294,43294,884, 1682, 22863,908, 43293,43293,28291,38305,28986,38527,38527,695, 35823,8276, 40517,22862, - 2990, 34930,33242,33534,2408, 11329,11508,39063,17941,11745,4543, 30565,22751,15426,24712,12242,8458, 17965,26914,27736,37291,12711,28486,32577,20858,12093,7684, + 2990, 34930,33242,33534,2408, 11329,11508,39063,17941,11745,4543, 30565,22751,15426,24712,12242,8458, 17965,26914,27736,37291,12711,28486,32577,20858,12093,7684, 33361,18570,9664, 15104,34038,43293,30884,43293,34037,10464,43292,3280, 21144,34833,23516,30350,13107,7818, 540, 16395,22015,13888,2084, 11873,5783, 8804, 38527, 5258, 32778,8626, 1286, 35805,38526,21010,11908,19633,11485,36499,37535,14370,38526,10644,11653,35352,2517, 31292,14451,8741, 15658,9295, 33688,38880,38667,12814, - 35761,25782,9312, 38076,20604,39283,16264,7687, 38526,29114,43292,34833,12560,30883,1422, 15020,43292,38526,3394, 10608,35805,265, 32019,3731, 1500, 19632,8543, - 10072,13393,28896,40517,13937,18569,43292,11363,13887,1647, 13869,15978,18654,17326,10933,19816,35110,13228,2442, 27355,12206,27910,21869,16507,3869, 6915, 9419, + 35761,25782,9312, 38076,20604,39283,16264,7687, 38526,29114,43292,34833,12560,30883,1422, 15020,43292,38526,3394, 10608,35805,265, 32019,3731, 1500, 19632,8543, + 10072,13393,28896,40517,13937,18569,43292,11363,13887,1647, 13869,15978,18654,17326,10933,19816,35110,13228,2442, 27355,12206,27910,21869,16507,3869, 6915, 9419, 9027, 18509,20717,31805,874, 1154, 2073, 30383,21202,38525,15675,24962,22634,34475,16700,35257,317, 25558,27566,3783, 18979,32183,5080, 4844, 19631,1614, 16421, 23952,3846, 18335,18504,1770, 1384, 1321, 9153, 33696,37482,31718,36386,6182, 1277, 29757,9299, 38096,37002,17982,22861,4045, 6618, 43291,35805,38525,35805,32768, 16513,8954, 38724,37846,5791, 29452,38525,34833,31730,43291,19630,2664, 37856,31709,43291,33110,38525,17007,36297,33657,35804,37002,24961,35804,34832,24083,32864, @@ -14992,17 +14987,17 @@ static const unsigned short Ranks[197839] = 43290,40516,9490, 32765,9601, 32764,34612,33404,26216,19584,20603,30881,3300, 22014,34862,20193,33361,34832,43290,43290,18568,40515,43289,37002,12572,38524,40515, 43289,38524,40515,34037,35804,40515,26196,9198, 9773, 37582,36943,43289,40514,34832,28811,32763,43289,40514,1676, 40514,805, 40514,3033, 17325,14917,30880,32762, 4263, 8747, 22646,1522, 5616, 2931, 37001,37001,3307, 3516, 17324,10299,8787, 22407,23744,34831,590, 17981,16953,14916,2722, 27563,34831,24625,1896, 4528, 22013, - 12571,32939,17323,20482,10298,14273,6536, 15737,6799, 35181,21947,13079,37503,27717,26195,8505, 19990,33120,20099,4419, 33650,19151,2844, 25315,34050,2356, 8842, + 12571,32939,17323,20482,10298,14273,6536, 15737,6799, 35181,21947,13079,37503,27717,26195,8505, 19990,33120,20099,4419, 33650,19151,2844, 25315,34050,2356, 8842, 13375,17448,6750, 35476,21442,30879,7252, 19629,37361,21006,39405,9952, 9340, 36600,14581,4435, 1861, 33761,31938,19592,36167,7531, 18433,43288,2957, 37001,15657, 459, 4942, 22363,24357,3070, 27048,10737,18334,17322,10709,28674,19815,43288,21709,31846,35141,3099, 34037,19628,27945,1207, 3678, 37001,7937, 11005,11004,26194, - 27562,31023,2631, 30705,21641,35803,43288,43288,15019,43287,25726,27561,32858,29112,43287,43287,15285,32307,39259,34831,43287,40513,43286,40513,33606,27560,6851, + 27562,31023,2631, 30705,21641,35803,43288,43288,15019,43287,25726,27561,32858,29112,43287,43287,15285,32307,39259,34831,43287,40513,43286,40513,33606,27560,6851, 25018,110, 29741,3848, 21575,22044,11130,17354,31373,26888,32912,30016,25938,29146,4668, 8965, 43286,34831,34144,31017,38524,32922,1728, 12756,17527,34531,34830, 36993,40513,19814,34830,10993,24960,24959,43286,5360, 7211, 43286,35803,32761,43285,2671, 23823,30231,24958,34037,35243,32760,43285,34036,38524,11005,8359, 12042, 6971, 43285,21201,33361,560, 35302,27794,27367,33725,37407,15226,37001,34036,38854,12205,35803,1850, 18330,22301,27314,40513,11595,34830,35803,18333,43285,43284, 10164,1071, 11193,37000,1919, 38523,17321,2486, 29094,13784,15152,27306,13441,33810,34830,1217, 33573,21158,10739,23822,1726, 26654,36226,8598, 34829,38523,18228, 28061,15656,17320,31779,35344,29111,43284,7886, 35414,35802,26193,20635,28928,38523,35802,43284,35412,35802,43284,43283,14244,24957,32759,31797,27559,40512,14580, - 30343,40512,21780,30122,15655,16952,33360,1212, 5230, 12394,20977,43283,15487,38157,35802,6753, 9514, 8499, 11539,1211, 12086,38531,12570,33986,15018,20679,421, - 32833,94, 19985,8379, 20542,14311,5775, 23062,8953, 22000,593, 6026, 37892,34829,43283,1267, 33913,29110,40512,8378, 16420,21142,13936,27285,15714,21836,4293, + 30343,40512,21780,30122,15655,16952,33360,1212, 5230, 12394,20977,43283,15487,38157,35802,6753, 9514, 8499, 11539,1211, 12086,38531,12570,33986,15018,20679,421, + 32833,94, 19985,8379, 20542,14311,5775, 23062,8953, 22000,593, 6026, 37892,34829,43283,1267, 33913,29110,40512,8378, 16420,21142,13936,27285,15714,21836,4293, 12977,16419,35913,11003,12569,28080,1376, 24633,3794, 19813,40512,16658,38138,37000,14579,38523,6718, 12467,2447, 39327,25735,35801,34829,32903,5077, 33360,38136, 36125,34036,38522,37000,38522,34829,16511,33501,6921, 29202,37000,43283,38522,335, 27745,4130, 2583, 34036,34035,17980,905, 19306,24898,36999,36695,1206, 24958, 40511,37197,14578,5200, 17111,31583,17319,34095,25530,23470,4215, 33052,3390, 35632,8952, 10297,7733, 30614,16765,7291, 1294, 21679,15017,35991,538, 7187, 18888, @@ -15012,10 +15007,10 @@ static const unsigned short Ranks[197839] = 21918,16097,15654,12568,37556,38520,8481, 38520,25621,43282,13127,12316,32758,16510,4941, 3116, 33444,18780,6947, 33543,35839,43281,17408,39007,38520,5687, 34827, 17407,29108,33509,35602,40509,24956,4590, 10463,23821,37575,5594, 15338,18332,30878,43281,34110,21199,18567,716, 35799,9600, 986, 12573,20445,43281,5615, 32822, 9918, 324, 14628,2136, 36064,30309,7549, 21895,35025,19627,2537, 32575,12183,5788, 20089,2958, 12808,30093,43281,32257,31606,36999,36304,35115,26192,19150,15255, - 21198,10313,22011,16932,32757,13609,6078, 2104, 9736, 30877,19110,10518,33187,12724,24955,17406,24353,22329,16953,12975,36999,10462,20481,1202, 34827,12204,1487, + 21198,10313,22011,16932,32757,13609,6078, 2104, 9736, 30877,19110,10518,33187,12724,24955,17406,24353,22329,16953,12975,36999,10462,20481,1202, 34827,12204,1487, 21197,34292,27557,32756,12808,34827,1846, 30876,43280,15674,573, 14915,11192,34034,9459, 30875,43280,14577,36998,43280,31505,2539, 11594,951, 10163,22860,24954, 19626,2385, 34034,32755,35458,27556,8244, 3256, 35677,1837, 12662,37037,35799,38520,2239, 9869, 9772, 14452,4044, 11286,7686, 11285,7593, 11284,8653, 40509,34741, - 43280,27555,18566,6235, 36998,36552,38519,29088,8275, 43279,13608,43279,10778,35100,20480,34591,36690,36090,37259,17318,5183, 15653,1963, 9663, 33819,8140, 5170, + 43280,27555,18566,6235, 36998,36552,38519,29088,8275, 43279,13608,43279,10778,35100,20480,34591,36690,36090,37259,17318,5183, 15653,1963, 9663, 33819,8140, 5170, 13822,32754,43279,43279,32753,34827,1384, 7696, 12203,2484, 35526,5511, 32897,33360,40509,37926,7646, 10162,24953,36998,36063,32642,6516, 38902,40509,35799,36998, 30874,32752,516, 23058,12226,3501, 7395, 8688, 24322,16161,6677, 12567,31535,25633,33038,1210, 3092, 14292,28711,34398,38519,36442,11417,38519,12845,23098,36839, 18573,34503,34002,36997,35799,36997,841, 24497,13782,3527, 28253,18331,38652,38802,7197, 13303,9461, 1634, 30985,28962,20766,25450,17981,915, 27210,1114, 14788, @@ -15030,33 +15025,33 @@ static const unsigned short Ranks[197839] = 35950,40505,22008,35516,1349, 12974,23092,40505,32749,36818,2263, 5325, 10071,16415,36996,552, 34826,38516,40505,303, 33190,36996,9937, 10888,38516,34033,22859, 35673,34032,27058,15651,19149,21195,35801,31262,33161,5318, 33495,40505,38516,38516,43275,21194,30869,33358,1452, 20877,34517,18595,17249,10773,4929, 23890,36897, 28895,32248,12967,6300, 15279,32172,30082,19186,23387,32666,13750,32239,34145,9154, 32319,5830, 11554,18890,36672,37998,39225,29105,38515,40504,38515,8964, 19809, - 35797,34825,24688,43275,43275,8002, 915, 4538, 43274,10519,43274,6220, 4396, 35663,36185,25706,14576,37595,34197,35797,15282,2636, 17943,34032,34825,8307, 8370, + 35797,34825,24688,43275,43275,8002, 915, 4538, 43274,10519,43274,6220, 4396, 35663,36185,25706,14576,37595,34197,35797,15282,2636, 17943,34032,34825,8307, 8370, 3986, 4589, 19623,12961,4936, 2395, 22012,11001,21137,36996,40504,5142, 7430, 6653, 9820, 35002,12148,690, 464, 30576,420, 25402,32973,1051, 38515,36995,24950, 33358,43274,11916,13425,33358,34825,26189,34825,35797,19148,37946,18338,195, 37300,11191,18216,43274,13933,40504,34032,43273,32748,40504,29104,35796,21136,36995, 19622,6398, 40503,32583,2033, 33357,35796,34848,38515,32747,34032,43273,16951,43273,34824,43273,13607,7133, 36169,20634,465, 31578,15650,16601,9543, 16563,28070, 7090, 22325,10079,1341, 10830,26244,38695,9906, 35796,11380,8889, 29103,33357,574, 40503,36995,28480,38514,40503,8504, 40503,40502,34031,13886,8737, 16704,38514, 21135,43272,35796,43272,43272,40502,8000, 13495,32310,19147,2493, 43272,43271,2517, 34031,7842, 1261, 4485, 39411,7329, 16299,19621,2276, 12202,8870, 5003, 23556, 37574,36008,21193,40502,40502,43271,129, 40501,38514,17317,7050, 5773, 3771, 337, 521, 16916,574, 10522,14223,33357,38514,3404, 19808,6899, 40501,43271,43271, - 3410, 33357,654, 31305,34031,43270,43270,22570,14575,38513,34824,32746,40501,21192,40501,14574,43270,40500,43270,16950,34031,32745,36995,34824,43269,43269,8393, + 3410, 33357,654, 31305,34031,43270,43270,22570,14575,38513,34824,32746,40501,21192,40501,14574,43270,40500,43270,16950,34031,32745,36995,34824,43269,43269,8393, 17405,43269,38513,38513,34030,40500,8207, 35795,38513,43269,26188,35795,40500,34030,23819,35795,36994,43268,38512,40500,29102,18327,25187,16414,34833,34030,43268, 22858,43268,32744,33818,40499,38639,19807,24949,9109, 6850, 43268,43267,36994,23818,14913,27554,7957, 32047,40499,34694,36994,10821,40499,34030,40499,6050, 17404, - 36994,29101,37755,34824,17403,43267,31438,12807,36993,24948,20478,19146,43267,43267,9735, 36266,18326,35795,1760, 35794,43266,34029,30868,43266,37379,1283, 9079, + 36994,29101,37755,34824,17403,43267,31438,12807,36993,24948,20478,19146,43267,43267,9735, 36266,18326,35795,1760, 35794,43266,34029,30868,43266,37379,1283, 9079, 37149,33356,43266,38512,22140,16509,13053,43266,922, 35794,36993,43265,17088,40498,1699, 40498,1805, 38512,24929,277, 29452,35954,1229, 18055,2952, 26001,37908, 43265,1132, 1490, 35689,5076, 43265,13616,43265,21093,6259, 37013,35187,40498,11408,1390, 330, 20802,31938,1857, 1471, 35794,239, 3766, 22036,33091,29921,22533, 11551,25349,9868, 40498,35794,4499, 18563,35793,43264,678, 1908, 12973,17316,43264,1960, 5359, 18538,43264,43264,35793,4743, 8392, 40497,43263,43263,35793,18325, 38512,14519,12299,35793,43263,859, 10293,3743, 3074, 8830, 14222,34029,36993,17979,4042, 40497,13932,13931,9298, 3346, 17978,34438,36993,43263,35683,38511,43262, 35792,436, 13316,36992,18562,27553,32050,11190,17977,7602, 907, 3955, 27552,8608, 17402,38601,34029,40497,43262,16413,525, 778, 34029,35609,39068,33518,32743, 23376,38264,4664, 19357,7634, 4085, 11051,39141,10294,33356,9443, 38831,15649,36992,15014,40497,2422, 13736,15013,9086, 43262,19730,6049, 38511,33785,35192,29100, - 5507, 19145,6401, 17281,34223,168, 3850, 27869,17557,7956, 38097,17315,40496,38511,7601, 40496,34028,23817,36992,36151,21134,36992,32742,12739,35877,34794,2912, + 5507, 19145,6401, 17281,34223,168, 3850, 27869,17557,7956, 38097,17315,40496,38511,7601, 40496,34028,23817,36992,36151,21134,36992,32742,12739,35877,34794,2912, 43262,35792,26761,32944,32203,36797,22795,34683,32999,8072, 14573,40496,9255, 38511,36369,16095,18561,6676, 4777, 17976,2222, 19144,36991,3348, 33356,21191,27551, 38510,34823,40496,40495,34028,34823,43261,35296,35792,13930,43261,43261,43261,26922,28611,40495,19331,4794, 19781,43260,8391, 12398,13885,16508,34028,21133,43260, 1638, 10643,34028,4358, 4155, 30255,34098,20477,34823,36991,8098, 29099,35792,9807, 43260,34823,43260,12247,24179,30493,14912,38510,34051,27550,43259,24449,43259, 31715,34822,43259,13095,693, 16219,38510,38510,30867,33446,38928,5460, 43259,36991,33356,13061,21190,27474,36081,21189,38254,43258,40495,40495,40494,35791,34485, 32900,33355,34027,38509,9599, 34027,29098,36776,3278, 36991,26187,3723, 35791,148, 19660,26186,28621,36990,43258,43258,40494,34027,38509,5836, 34027,43258,37490, - 43257,23816,15189,10782,34134,17314,9595, 12857,30593,21089,12913,36366,858, 3666, 33190,37024,23785,34007,34373,34189,522, 34822,24947,14911,32111,2011, 2254, + 43257,23816,15189,10782,34134,17314,9595, 12857,30593,21089,12913,36366,858, 3666, 33190,37024,23785,34007,34373,34189,522, 34822,24947,14911,32111,2011, 2254, 3108, 40494,2384, 208, 33643,221, 31075,43257,34296,35791,36990,16492,43257,1675, 36990,29097,33355,35791,40494,26185,27071,34822,38509,10256,35790,38509,38508, 39172,32069,38029,34026,11000,36082,22587,43257,38508,40493,36775,32864,36160,40493,22007,43256,7841, 35790,38508,36990,43256,32593,21106,43256,23815,4776, 12806, - 40493,43256,8624, 2501, 40493,109, 2581, 12390,11307,32374,17351,30159,43255,40492,22835,2902, 43255,7731, 38178,43255,40492,43255,38392,21935,36989,38431,7600, + 40493,43256,8624, 2501, 40493,109, 2581, 12390,11307,32374,17351,30159,43255,40492,22835,2902, 43255,7731, 38178,43255,40492,43255,38392,21935,36989,38431,7600, 1332, 8607, 745, 23814,38508,2670, 14221,14572,14571,18560,1224, 21136,14486,40492,7781, 29096,7429, 37158,29812,34822,8232, 19149,12298,14570,39130,6713, 15281, 16094,36989,8164, 26398,22857,40492,26184,19620,40491,38507,38507,1181, 43254,34821,32366,27549,4210, 29608,34961,36349,26457,28804,15673,40491,34821,18520,34931, 34030,34026,28409,34026,35586,25603,21138,40491,38507,2379, 38993,20486,33355,33864,34026,43254,35790,35057,17975,40491,5340, 22878,35819,27101,35292,5847, 12431, @@ -15066,14 +15061,14 @@ static const unsigned short Ranks[197839] = 36988,9880, 19806,4688, 5660, 17879,36676,35143,16282,14365,13485,26183,33438,43253,38506,13315,22275,20727,43252,16412,32740,40490,40489,35789,1734, 13437,16411, 35789,38506,25102,271, 6970, 3067, 12955,43252,8057, 36988,22327,10658,40489,40489,43252,13437,38942,3345, 36938,12566,38900,19403,26069,20356,10910,18315,12110, 12516,24458,35399,13812,32997,20949,20438,30334,2654, 28036,30624,11001,12722,3464, 18658,28640,7183, 19827,15012,19527,13621,13099,6891, 26170,25492,7132, 34886, - 6903, 26182,38198,40489,11383,40488,7432, 36988,34820,26181,15648,2938, 2772, 10171,23813,5259, 6672, 38505,6478, 5888, 19618,21132,4394, 11445,5968, 20274,7519, + 6903, 26182,38198,40489,11383,40488,7432, 36988,34820,26181,15648,2938, 2772, 10171,23813,5259, 6672, 38505,6478, 5888, 19618,21132,4394, 11445,5968, 20274,7519, 20879,12121,24289,35486,33534,35810,33913,25702,34990,35696,14188,13333,22234,22804,24954,33354,40488,23812,43252,34025,22006,40488,33464,15672,22855,5286, 35789, 40488,30665,26180,19805,969, 17809,38505,15671,19142,8951, 34025,16949,24945,36987,18661,33037,36987,1194, 29087,14146,30241,1980, 24908,12574,26587,8455, 36345, 14448,36861,38083,32739,6048, 11953,29711,36783,13929,8097, 36621,521, 3107, 3587, 4081, 10937,5675, 36987,18324,33690,29376,11779,16410,4984, 11151,28378,27346, 43251,34820,18896,34819,43251,38505,30866,26179,15670,4879, 35789,43251,43251,11113,21131,36114,19495,24944,279, 25149,7367, 14220,3723, 24242,19340,4983, 29095, 188, 33354,43250,19617,34129,14541,43250,5650, 17312,11553,38505,18820,32890,37120,4865, 10796,21130,36987,43250,29094,43250,23811,34025,3187, 13605,36986,34025, 6749, 34819,40487,38504,40487,36108,40487,2280, 30681,40487,38504,25974,2276, 32588,19999,24904,25861,3653, 10161,19616,6357, 29065,37558,1084, 6136, 826, 13113, - 6163, 12972,839, 28761,22151,7963, 25774,2072, 43249,38504,43249,36910,16948,40486,22854,36986,11868,12565,40486,22005,37191,13884,403, 26299,11520,9315, 1353, + 6163, 12972,839, 28761,22151,7963, 25774,2072, 43249,38504,43249,36910,16948,40486,22854,36986,11868,12565,40486,22005,37191,13884,403, 26299,11520,9315, 1353, 14734,2583, 6477, 756, 20462,13541,2590, 40486,43249,36986,35788,38504,43249,8950, 35366,30478,43248,16409,32787,23810,35788,12296,38552,38503,17973,32738,16093, 32237,418, 35788,22004,34067,34653,10284,8231, 434, 29408,619, 17208,38704,43248,1270, 20481,11869,3273, 32737,35788,28135,18111,33354,43248,4170, 10897,24999, 4318, 6397, 23582,43248,13743,23250,13194,35787,43247,38810,37787,43247,36986,32428,26936,12224,43247,43247,43246,34024,999, 2204, 38503,26696,36382,34267,10820, @@ -15081,9 +15076,9 @@ static const unsigned short Ranks[197839] = 23809,20859,33369,3745, 9955, 18323,30267,36985,12095,19804,43246,17972,43246,21188,7671, 18559,34819,32429,38502,35840,38307,43246,10642,19615,1012, 40486,38502, 22952,1365, 12201,19141,43245,25517,15647,21129,32736,33353,14985,18322,2319, 30865,35787,34819,13928,15010,35787,16947,4911, 43245,39021,38501,5002, 9317, 30864, 78, 31151,2039, 35786,10479,39289,37813,2442, 4516, 5894, 8317, 7773, 38770,14447,518, 27083,28892,32907,33039,1151, 43245,34024,38773,38501,29092,40485,19140, - 34818,30863,13603,43245,1903, 11194,9070, 6555, 4597, 40485,2347, 32568,11862,43244,36985,43244,16946,38501,37343,5071, 9959, 19614,186, 31028,30280,15646,3499, - 34441,10817,6467, 38117,16293,4540, 4945, 21128,36932,9297, 8594, 18321,415, 1185, 16945,16944,1724, 17598,4798, 5795, 29260,669, 5032, 21127,10988,19131,4267, - 38501,35786,17238,33647,36277,38500,825, 12295,2913, 19460,8652, 36985,19803,17311,12071,40485,115, 31380,5753, 12971,38966,21126,939, 3352, 5835, 40485,2995, + 34818,30863,13603,43245,1903, 11194,9070, 6555, 4597, 40485,2347, 32568,11862,43244,36985,43244,16946,38501,37343,5071, 9959, 19614,186, 31028,30280,15646,3499, + 34441,10817,6467, 38117,16293,4540, 4945, 21128,36932,9297, 8594, 18321,415, 1185, 16945,16944,1724, 17598,4798, 5795, 29260,669, 5032, 21127,10988,19131,4267, + 38501,35786,17238,33647,36277,38500,825, 12295,2913, 19460,8652, 36985,19803,17311,12071,40485,115, 31380,5753, 12971,38966,21126,939, 3352, 5835, 40485,2995, 30862,12663,13063,904, 28151,132, 25351,24943,6200, 29091,21187,40484,19613,40484,9330, 36985,33560,40484,5388, 33353,36984,35811,7925, 8230, 21125,2157, 19612, 43244,24942,38500,22398,34024,1144, 22885,18320,25546,9488, 35786,15645,40484,9153, 4550, 15009,21124,6114, 15644,15643,2521, 1305, 40483,36403,6536, 38494,33506, 23808,29906,30690,36919,34023,34818,36459,38972,658, 489, 12958,10145,4718, 1601, 27547,26847,30844,3807, 15689,12564,22852,1102, 12070,8274, 9196, 18319,35786, @@ -15092,7 +15087,7 @@ static const unsigned short Ranks[197839] = 35456,43241,20475,43241,32735,40483,34023,36507,25942,1745, 17268,30097,43241,36984,26178,37417,35282,3628, 32460,35785,26177,26176,14496,35785,8736, 17970,43241, 32734,33074,40483,40482,13883,34071,15668,34818,22003,16943,35785,34198,38499,38499,34817,33758,28017,22191,13602,7864, 32146,27014,384, 9187, 28732,28853,28666, 28156,21712,14503,15754,8850, 4909, 754, 13927,37673,32733,30026,733, 25237,5280, 7472, 35773,35932,19639,39134,22838,29951,21123,18058,12563,11867,924, 22617, - 27535,6544, 4635, 15008,11463,8348, 14214,12200,1488, 15923,1937, 27681,6887, 20906,17547,12970,30337,18318,30208,559, 7190, 5707, 5127, 3945, 13436,25296,7532, + 27535,6544, 4635, 15008,11463,8348, 14214,12200,1488, 15923,1937, 27681,6887, 20906,17547,12970,30337,18318,30208,559, 7190, 5707, 5127, 3945, 13436,25296,7532, 21122,3024, 32564,7768, 15453,38499,24941,29405,8735, 10257,6828, 11018,16133,32830,3768, 29656,29853,18317,17866,9296, 9502, 3103, 2645, 26386,43240,16092,43240, 38499,1039, 34014,36844,27545,21121,24940,5670, 30622,3347, 33371,11500,43240,37732,40482,22851,17310,34023,26, 21781,8477, 32857,7962, 35273,5649, 6183, 17079, 22992,15401,20796,19992,7955, 33442,24282,8251, 21293,43240,3791, 23806,30983,40482,40482,16506,43239,22002,43239,16134,40481,27544,487, 17969,40481,40481,35784, @@ -15100,7 +15095,7 @@ static const unsigned short Ranks[197839] = 40481,107, 16534,4989, 6499, 5182, 6010, 16606,7969, 2422, 30360,7404, 33043,13128,31489,33505,4147, 22024,20454,21120,3825, 180, 2940, 31594,18694,33642,21468, 3186, 39414,10035,5174, 27782,35176,19611,6213, 6000, 15003,24587,2476, 7516, 35393,22001,35784,36983,40480,24639,9158, 35784,19315,37885,35283,23273,3434, 15007, 6434, 13926,10569,18316,3062, 34022,6162, 26744,906, 36649,34022,1326, 20853,34817,10819,43239,35784,3787, 27543,36983,26175,36473,39036,26862,1820, 22317,38646, - 31583,2088, 43238,40480,24255,19406,22070,2489, 35783,5645, 38498,13925,3333, 31115,10375,22082,43238,17401,3446, 11552,5788, 23667,43238,21146,30861,27951,374, + 31583,2088, 43238,40480,24255,19406,22070,2489, 35783,5645, 38498,13925,3333, 31115,10375,22082,43238,17401,3446, 11552,5788, 23667,43238,21146,30861,27951,374, 12969,43238,40480,10016,12805,20473,31934,6781, 38515,34817,24938,15667,43237,33352,34816,769, 40480,7919, 3299, 17968,8786, 38106,5125, 14316,19610,33352,21504, 43237,14730,179, 27808,34816,32732,34316,25900,31219,19609,10520,6419, 40479,681, 18315,43237,8785, 17309,8949, 1435, 12562,8096, 38498,9865, 2921, 18314,12354, 32945,5523, 6222, 32784,12068,23784,17308,17487,14446,18439,26184,34022,36983,38498,24578,9309, 23056,23565,29990,17758,22186,15514,31709,4918, 7915, 15549,30604, @@ -15109,15 +15104,15 @@ static const unsigned short Ranks[197839] = 4429, 3561, 37311,38497,15532,37424,35783,34021,1770, 34816,27542,19607,12968,32731,7146, 9864, 6675, 12199,40478,7145, 37644,40478,38497,9487, 32730,30860,35537, 35288,12888,3257, 15821,16093,39382,11626,5293, 26174,24007,10004,1543, 28851,34644,6295, 1936, 20011,37002,38677,30859,36982,19800,36388,9486, 40478,38205,34628, 35715,10070,941, 30858,10992,34815,26173,2691, 40477,13051,7663, 34843,29925,3954, 4548, 7000, 4210, 32771,10097,8971, 33843,11593,6617, 40477,2858, 8841, 18558, - 6616, 10073,14445,21119,9161, 7961, 26139,11137,27979,5469, 13435,8948, 17307,760, 2366, 15082,26098,29253,32961,18718,8358, 10384,21118,19606,7066, 4888, 4301, + 6616, 10073,14445,21119,9161, 7961, 26139,11137,27979,5469, 13435,8948, 17307,760, 2366, 15082,26098,29253,32961,18718,8358, 10384,21118,19606,7066, 4888, 4301, 39169,19267,4770, 4148, 10519,6806, 32361,25055,22314,6294, 7318, 34567,1611, 35783,15006,32366,38483,19333,27541,34021,37040,15642,34021,6742, 35782,32651,19383, 33905,19138,13085,19605,24522,32010,40477,1152, 22409,5385, 5642, 11284,8019, 25206,36925,4572, 2587, 17306,3813, 21117,6535, 30536,30340,19604,21169,19603,36713, 38221,19602,40477,11382,43237,13434,7624, 8784, 20957,43236,33116,26022,21186,34539,25714,2152, 33451,16091,13529,18956,37998,34414,4390, 9485, 38985,24575,35440, 8947, 9735, 18204,35012,16661,36116,4389, 7231, 7065, 21116,6293, 13242,33352,21115,21114,20361,21461,36986,4571, 18313,38627,17967,43236,6047, 35782,22000,40476, 25763,32729,35782,3391, 39310,10818,40476,19601,38497,2484, 21113,33199,8503, 28086,9173, 37814,4229, 14763,32728,23804,6006, 23803,33352,12804,14219,6131, 23802, - 8772, 983, 7064, 8752, 14802,5787, 29088,24937,21999,43236,33351,17966,26172,6920, 32727,3332, 9879, 40476,9878, 14218,38496,19799,40476,43236,39008,34021,234, + 8772, 983, 7064, 8752, 14802,5787, 29088,24937,21999,43236,33351,17966,26172,6920, 32727,3332, 9879, 40476,9878, 14218,38496,19799,40476,43236,39008,34021,234, 11189,23927,5445, 16505,40475,16406,3652, 26171,40475,30857,22850,38496,40475,18312,30856,40475,36982,20472,43235,40474,33351,29087,19880,32726,38496,34213,30855, - 36981,1722, 29639,27127,8163, 8840, 32725,12561,24936,34815,3224, 2283, 25054,35782,264, 23801,43235,19798,14115,17965,43235,32724,40474,43235,26857,37964,5551, + 36981,1722, 29639,27127,8163, 8840, 32725,12561,24936,34815,3224, 2283, 25054,35782,264, 23801,43235,19798,14115,17965,43235,32724,40474,43235,26857,37964,5551, 43234,2093, 27540,18557,7101, 32815,34815,34820,6048, 3255, 36394,17305,24060,37065,24503,23114,38977,37879,27922,9604, 23914,29086,3944, 12751,18311,9863, 11866, 13924,8510, 26170,29379,5207, 29879,37031,36430,40474,8095, 43234,8651, 2898, 40474,868, 17057,21844,2551, 14444,18220,8783, 35179,9862, 16941,11283,19600,10639, 27539,10734,3491, 13923,15641,17400,5786, 34020,43234,1626, 21260,31677,31747,43234,36981,33067,20391,8943, 16405,21112,2177, 28298,5353, 8312, 26406,36981,24732, @@ -15126,16 +15121,16 @@ static const unsigned short Ranks[197839] = 36980,38239,18310,18309,11105,13433,16504,19797,34228,1668, 5090, 18308,3492, 38726,18346,20400,13609,22986,5162, 37521,25126,38903,23800,705, 21577,19599,12197, 43232,14443,12673,3148, 19598,9294, 6476, 15637,19597,18307,2404, 12561,27726,1161, 344, 8247, 36980,2151, 40472,38495,12179,38495,24934,25209,11229,107, 22135, 1950, 832, 40472,1592, 38495,20856,2030, 11662,37977,886, 38494,85, 32723,39408,43232,13340,2633, 21998,3610, 22478,3436, 2361, 16452,33174,36980,34592,35326, - 12023,240, 2589, 15576,34426,35655,29084,12974,33956,2029, 901, 26968,8273, 10999,34953,5648, 34624,19596,43231,34147,36980,3435, 35422,5970, 38494,4971, 683, - 12967,9865, 38494,43231,18306,34815,6159, 32142,36979,43231,15671,30854,2518, 35489,17303,5411, 10354,6142, 20849,9976, 43231,26169,3919, 1528, 6725, 10048,181, + 12023,240, 2589, 15576,34426,35655,29084,12974,33956,2029, 901, 26968,8273, 10999,34953,5648, 34624,19596,43231,34147,36980,3435, 35422,5970, 38494,4971, 683, + 12967,9865, 38494,43231,18306,34815,6159, 32142,36979,43231,15671,30854,2518, 35489,17303,5411, 10354,6142, 20849,9976, 43231,26169,3919, 1528, 6725, 10048,181, 6064, 21216,5564, 17189,3957, 362, 8179, 30780,15636,3948, 4052, 1977, 1258, 161, 9086, 30679,21286,2340, 40472,8604, 40472,35781,24306,18827,30480,17718,22079, 9923, 33351,14569,18305,43230,35781,35780,8055, 16005,7112, 16879,36979,43230,43230,5637, 21110,17302,395, 9642, 22848,35621,43230,40471,11828,36979,3237, 25634, 34770,4970, 16940,6046, 7132, 35212,43229,22440,35780,20596,34814,9861, 6747, 7230, 15005,8782, 11865,37536,39368,12432,9885, 32902,11308,36072,16817,34346,38836, 37231,21109,18507,15666,33351,3264, 4969, 16403,10644,9860, 5091, 24824,18130,12617,15591,27037,10733,17301,33350,21604,7080, 27711,24472,21634,6060, 832, 37618, 10416,1749, 24920,24040,14576,20461,34814,5914, 15567,413, 9055, 5962, 27569,4139, 24722,34020,7636, 11081,9151, 1172, 20300,19401,24915,461, 8390, 16147,36820, - 18193,13601,25496,33795,11012,19530,36979,26915,6877, 35365,20955,10244,37800,15589,17302,13833,16708,4549, 12966,33108,13432,19796,38494,12293,24933,27430,5643, + 18193,13601,25496,33795,11012,19530,36979,26915,6877, 35365,20955,10244,37800,15589,17302,13833,16708,4549, 12966,33108,13432,19796,38494,12293,24933,27430,5643, 22154,13600,25922,26743,21256,8781, 21108,33350,43229,1027, 9252, 1509, 2580, 3163, 12534,33585,20604,24149,21404,13431,40471,43229,32722,37906,36978,32721,43229, - 24932,38493,12067,8229, 43228,38493,39342,38904,43228,24931,43228,15665,40471,38493,11940,38493,33363,3102, 20471,3875, 5969, 35780,34814,34020,34814,26713,3976, + 24932,38493,12067,8229, 43228,38493,39342,38904,43228,24931,43228,15665,40471,38493,11940,38493,33363,3102, 20471,3875, 5969, 35780,34814,34020,34814,26713,3976, 13430,23887,35780,11864,38492,11551,37870,24020,9746, 2427, 12558,33350,27538,34020,40471,32793,37898,34019,43228,40470,38492,33128,15004,13921,18344,7255, 12965, 38492,34359,24547,13920,27537,21107,20470,22315,7595, 43227,27536,16090,27031,3007, 38524,4276, 12557,6534, 11550,5510, 9276, 602, 43227,9323, 26851,26407,34168, 8470, 39061,39008,35955,32974,33881,34944,33217,30853,11028,23666,34735,1594, 35502,38492,43227,34813,22847,12803,14910,16838,34326,43227,34622,4575, 19695,18499, @@ -15144,12 +15139,12 @@ static const unsigned short Ranks[197839] = 37680,34367,38536,18302,32311,9468, 32719,40470,2517, 1563, 37658,24310,40470,32936,43226,12964,18301,17299,17298,17297,11281,10998,32032,38490,10817,40470,23156, 9859, 38490,38626,26164,34813,38490,2945, 36978,38490,40469,16402,18556,32718,33350,30852,2564, 43226,35219,5808, 2075, 16784,37723,24929,5878, 34138,35779,33349, 8272, 21997,43225,21183,43225,36978,43225,33047,40469,34150,26163,40469,991, 36494,39147,7049, 38795,39290,34813,43225,9772, 35779,40469,10459,13919,9858, 30389, - 921, 36087,518, 21690,3280, 27092,36434,16106,34019,28380,31326,18535,36274,30851,818, 33217,2250, 18300,10069,2856, 11216,2298, 33058,10997,10292,6533, 3061, + 921, 36087,518, 21690,3280, 27092,36434,16106,34019,28380,31326,18535,36274,30851,818, 33217,2250, 18300,10069,2856, 11216,2298, 33058,10997,10292,6533, 3061, 12292,36977,13598,9293, 19137,935, 3119, 2758, 9438, 14, 2259, 32786,15733,28478,15986,32880,29808,32380,970, 8704, 14908,32081,22196,11952,36784,1665, 10927, - 12560,31253,14815,6778, 13918,26377,6475, 34577,5100, 34493,14025,30288,11280,8684, 7158, 12559,13839,11488,15012,8928, 6045, 34019,13739,15634,19595,25247,4481, + 12560,31253,14815,6778, 13918,26377,6475, 34577,5100, 34493,14025,30288,11280,8684, 7158, 12559,13839,11488,15012,8928, 6045, 34019,13739,15634,19595,25247,4481, 21106,30273,10517,13917,22330,36977,33349,7, 21911,38489,10487,38058,33040,31722,9642, 20469,38056,7411, 18898,35612,35315,8509, 15279,37224,11809,19477,40468, 9729, 38722,43224,40468,842, 38651,23799,2711, 14675,3878, 13035,13916,22501,7869, 43224,36977,16503,10816,43224,290, 9608, 738, 9484, 13565,43224,38489,13429, - 375, 40468,40468,40467,18943,8096, 8508, 3131, 43223,18555,40467,97, 21929,11597,25659,21470,11744,20564,28775,20981,28546,15650,30966,4627, 38761,34019,2062, + 375, 40468,40468,40467,18943,8096, 8508, 3131, 43223,18555,40467,97, 21929,11597,25659,21470,11744,20564,28775,20981,28546,15650,30966,4627, 38761,34019,2062, 7974, 7273, 31980,25904,25635,29205,5023, 36144,10326,43223,20808,16401,7241, 15230,9322, 5397, 19594,12558,16400,40467,28628,34686,35119,7213, 33118,33090,30721, 11184,21928,10094,16399,19593,14248,34609,20141,17964,34743,12963,8616, 14442,25906,14441,12656,7599, 3201, 35368,596, 11549,5906, 40467,36447,37109,26006,36371, 34239,36267,21272,835, 33100,37951,5782, 34831,4856, 2872, 6364, 22846,7984, 20017,30035,17296,9662, 8946, 35819,11279,36153,37652,21480,22911,35766,20186,17201, @@ -15158,43 +15153,43 @@ static const unsigned short Ranks[197839] = 4569, 17295,27535,15633,1914, 12291,36977,9857, 16939,629, 2618, 2492, 8945, 3638, 17294,35542,608, 17171,13749,1220, 40466,32717,35779,43223,40466,34813,32716, 34812,2964, 38489,14781,40466,27534,21182,34812,36155,9217, 38899,33349,38489,6980, 40465,38134,43222,22980,5817, 35778,38488,31545,232, 25504,40465,1665, 11862, 19258,14866,34232,11548,5292, 33048,29462,11449,35885,1986, 2227, 27533,35439,971, 35640,946, 4663, 9678, 43222,3726, 11088,24775,18935,21181,7982, 364, 22987, - 32715,43222,161, 937, 31363,43222,43221,33742,12961,40465,7229, 1932, 30850,33513,11644,33560,38201,771, 1536, 1521, 4055, 8410, 38167,8613, 8990, 9384, 9746, + 32715,43222,161, 937, 31363,43222,43221,33742,12961,40465,7229, 1932, 30850,33513,11644,33560,38201,771, 1536, 1521, 4055, 8410, 38167,8613, 8990, 9384, 9746, 10029,10229,10412,10702,11195,4729, 11523,11880,12133,12357,12729,13158,13678,13873,14211,14535,5407, 15116,15446,15638,15993,16568,16808,16853,17674,18166,18101, 5863, 18095,19323,19512,20329,20992,20696,21332,22061,22631,22169,6392, 22816,23194,24085,24652,25253,25917,25958,25589,26686,27351,6786, 27320,28943,27874,29221, 29055,30193,31681,33020,33058,33352,7220, 33194,33527,33646,33773,34199,34120,34540,34030,35194,35546,7731, 35007,36337,36296,36490,36853,35773,36973,36787,36426, 37331,7957, 36676,37483,38094,37648,38037,38094,38572,39416,38535,13900,20991,36881,8628, 12686,6865, 34422,15997,6689, 12944,37252,40465,34018,27532,34898,35778, - 30849,43221,36976,19793,3477, 26162,21104,21103,36976,40464,40464,43221,38488,17672,33827,21996,40464,25353,24928,30377,36976,29083,29082,355, 18232,25690,1185, + 30849,43221,36976,19793,3477, 26162,21104,21103,36976,40464,40464,43221,38488,17672,33827,21996,40464,25353,24928,30377,36976,29083,29082,355, 18232,25690,1185, 4641, 36976,38488,18554,29081,19591,3705, 8944, 28062,6297, 43221,43220,40464,36975,34812,33349,17399,38488,38487,38487,14909,19136,13915,40463,26161,12556,40463, 35778,34812,40463,12555,38487,3858, 43220,38487,34811,43220,20702,2956, 2356, 718, 43220,21757,36427,2416, 37074,3378, 38708,13882,17728,34811,2072, 6161, 38486, - 12557,17293,19792,2280, 9150, 15003,8034, 5048, 4794, 21087,32846,2454, 27531,16502,17749,37742,12960,28424,17398,33348,34018,2169, 4185, 12585,17857,15926,2949, - 10027,5320, 6581, 13428,38286,18198,2047, 21294,3331, 2855, 7284, 35764,1373, 24400,12597,6355, 11861,35740,38544,34900,1014, 28638,15089,31997,12254,20656,2342, + 12557,17293,19792,2280, 9150, 15003,8034, 5048, 4794, 21087,32846,2454, 27531,16502,17749,37742,12960,28424,17398,33348,34018,2169, 4185, 12585,17857,15926,2949, + 10027,5320, 6581, 13428,38286,18198,2047, 21294,3331, 2855, 7284, 35764,1373, 24400,12597,6355, 11861,35740,38544,34900,1014, 28638,15089,31997,12254,20656,2342, 21924,7044, 9266, 817, 22102,9483, 7730, 7795, 43219,3034, 22845,16427,26758,17671,34018,40463,34811,43219,37031,36975,10815,18034,33258,36975,8606, 40462,33348, 30848,12290,24927,33348,40462,34811,38486,2014, 17703,35851,38486,16881,34810,30847,43219,10814,36606,1250, 29954,32778,34368,19015,4012, 43219,38486,11592,34810, 89, 25207,10976,10613,5479, 36975,28216,19791,38752,22759,31967,27530,27529,20468,33348,8162, 37688,21208,35778,27423,28435,12643,12554,43218,12289,20467,35777, - 1337, 40462,35777,2626, 29780,35777,16088,12195,43218,21180,19537,33132,8734, 24926,26160,12288,19281,138, 18164,616, 13621,3585, 293, 1011, 18476,38859,2933, + 1337, 40462,35777,2626, 29780,35777,16088,12195,43218,21180,19537,33132,8734, 24926,26160,12288,19281,138, 18164,616, 13621,3585, 293, 1011, 18476,38859,2933, 1319, 25554,29952,37674,21313,7053, 33355,34067,1185, 18553,17292,8917, 30846,40462,114, 27298,7816, 43218,38485,38365,30663,37855,8948, 26941,35777,1440, 23411, 43218,7729, 13914,26592,25678,2110, 5550, 498, 16500,31982,19590,26360,11827,38485,13050,40461,2147, 12287,43217,14568,40461,32852,5124, 35776,11591,43217,43217, - 36575,33347,40461,27914,17963,9482, 40461,20466,227, 14567,35155,40460,4112, 36172,34018,175, 32320,21161,32016,12362,15002,36471,37796,8610, 32607,22702,9241, + 36575,33347,40461,27914,17963,9482, 40461,20466,227, 14567,35155,40460,4112, 36172,34018,175, 32320,21161,32016,12362,15002,36471,37796,8610, 32607,22702,9241, 6488, 14095,12194,19589,9065, 40460,35776,28996,32645,19963,20352,33668,1284, 11775,14217,19284,6466, 21102,8605, 30392,3890, 4524, 22149,2440, 9078, 6837, 18400, 23939,7227, 28290,28374,36411,15557,32555,31405,43217,38485,35776,43216,35244,36974,40460,38485,43216,43216,34017,30302,16060,24898,5399, 11877,32523,11968,34670, 5705, 6400, 10626,15092,26159,40460,8161, 33333,39415,6184, 19790,43216,7209, 2871, 33509,22685,34017,6379, 12284,9676, 10120,4057, 35776,30845,30844,40459,11187, 38484,8650, 15632,15227,13314,10813,6399, 19588,9481, 34810,11381,18298,23797,43215,38484,36974,40459,9458, 12553,11547,35775,8604, 7622, 26158,9457, 40459,38484, 2146, 40459,11826,38484,33347,19072,1801, 36051,25045,3594, 10366,21101,4265, 2577, 11381,6615, 20758,35670,7868, 810, 4082, 12184,9714, 8087, 34751,313, 15941, - 23453,3002, 47, 19003,37025,2694, 899, 22844,43215,21995,938, 34017,40458,35775,20465,43215,36974,35775,14417,35775,3158, 38483,21179,40458,38301,18203,1985, + 23453,3002, 47, 19003,37025,2694, 899, 22844,43215,21995,938, 34017,40458,35775,20465,43215,36974,35775,14417,35775,3158, 38483,21179,40458,38301,18203,1985, 20968,28897,26851,7349, 22646,32480,7315, 15225,2632, 38483,36974,2559, 487, 43215,43214,43214,123, 8612, 30408,4677, 512, 6796, 13426,140, 28347,43214,21614, 7515, 32714,38483,726, 24723,19135,15582,2275, 2704, 25799,38996,43214,36973,14864,17463,10441,33556,25602,30749,39362,36973,7228, 43213,16631,43213,12286,43213, 32713,40458,34017,24437,31, 1606, 21396,7870, 15292,32206,30439,21635,19334,40458,4775, 4774, 19024,35774,23796,43213,32712,35899,43212,4289, 38704,20468,14596, 38483,10733,3776, 17033,21178,9278, 390, 5636, 40457,30843,43212,35149,8686, 28029,32711,28352,186, 38446,1345, 987, 36202,8507, 36204,29080,36973,828, 40457, - 18629,22843,1867, 26474,29940,31940,6897, 11277,40457,15663,36787,11153,16087,3665, 40457,16086,36973,29079,7419, 15001,14950,30842,40456,2426, 43212,32617,2901, - 40456,34016,35774,5833, 43212,23795,38482,24999,40456,26634,40456,38482,22842,19789,17962,15278,4165, 19134,34026,36972,30841,40455,38737,20464,38482,10732,1153, + 18629,22843,1867, 26474,29940,31940,6897, 11277,40457,15663,36787,11153,16087,3665, 40457,16086,36973,29079,7419, 15001,14950,30842,40456,2426, 43212,32617,2901, + 40456,34016,35774,5833, 43212,23795,38482,24999,40456,26634,40456,38482,22842,19789,17962,15278,4165, 19134,34026,36972,30841,40455,38737,20464,38482,10732,1153, 37249,8733, 35935,40455,599, 26381,28099,40455,12066,4350, 35555,34322,40455,11223,11797,4129, 21100,11860,14216,43211,40454,40454,40454,34016,33347,35042,24925, 34016,8649, 2339, 17291,37809,9535, 25031,34118,39112,40454,43211,15000,35774,11859,36972,27870,6515, 26157,18552,43211,6183, 33513,9597, 12959,23794,35774,36972, - 34016,27528,5550, 34015,3627, 39001,38482,220, 19587,20191,23134,40453,11858,33616,34096,11947,20319,29185,1021, 10412,21099,28552,32614,1596, 21129,3344, 1870, + 34016,27528,5550, 34015,3627, 39001,38482,220, 19587,20191,23134,40453,11858,33616,34096,11947,20319,29185,1021, 10412,21099,28552,32614,1596, 21129,3344, 1870, 12556,16397,22238,17409,1956, 22540,16034,853, 16352,33948,32710,38051,16501,38481,14999,32709,36972,30840,35223,5877, 40453,12555,1604, 40453,17290,71, 16494, 7815, 18712,11095,9159, 7770, 26709,19627,31146,14773,16795,414, 10580,3368, 15812,11388,20210,271, 12004,9661, 43211,290, 5392, 16230,36971,34015,27527,35773, 17961,25602,11029,608, 2150, 38577,127, 2318, 3696, 12269,15662,6717, 32644,16128,5652, 17289,22443,34015,36333,37113,5739, 13781,2204, 34810,43210,27078,34015, 35773,36971,43210,36971,7531, 21098,25256,40453,816, 19586,273, 3223, 8603, 30839,3695, 10833,43210,39101,20176,21647,335, 19285,28536,19275,26373,11430,19768, - 32950,18551,12193,16396,3968, 34143,11380,18812,21177,40452,34014,34014,24948,27638,3462, 2149, 40452,43210,40452,38481,3328, 13420,6119, 58, 25220,902, 7129, + 32950,18551,12193,16396,3968, 34143,11380,18812,21177,40452,34014,34014,24948,27638,3462, 2149, 40452,43210,40452,38481,3328, 13420,6119, 58, 25220,902, 7129, 13021,19361,18150,11012,26092,21163,8268, 5509, 16661,4593, 29956,40452,34014,19012,36971,43209,13053,32208,22614,7728, 31491,17973,30434,13881,13751,5699, 34209, 9856, 31068,21097,4067, 43209,18297,21096,43209,11342,10458,4361, 20939,16844,117, 12453,40451,15789,12710,14966,9090, 20684,32647,35828,24924,32687,35773,11812, 17960,22401,724, 2261, 14562,8732, 13091,43209,11857,35153,34738,3953, 4148, 32243,18506,21060,29078,15490,11137,3105, 38043,32830,35773,35772,37235,35218,10021, @@ -15206,34 +15201,34 @@ static const unsigned short Ranks[197839] = 23792,34012,9956, 39258,27635,8533, 18220,14215,951, 8876, 3801, 13427,14998,18294,37205,19583,43205,7227, 3043, 6674, 14997,10159,4130, 17135,6575, 13313,35771, 8648, 33018,39151,34075,21929,36969,33546,19582,7048, 37282,18549,4901, 26741,36969,30837,24923,11186,38480,22840,10291,43205,3513, 40449,38480,26156,9456, 38479, 1081, 14514,35493,37589,43204,19787,27525,32963,28605,30836,30835,33771,34809,22839,43204,35771,35771,15933,35321,10115,8504, 14886,3171, 20463,38479,15685,38479, - 17667,25490,38479,3476, 6969, 38478,33346,7142, 17288,37523,12285,38478,6030, 29170,37383,34012,3045, 43204,467, 8215, 6516, 8094, 34012,15661,36968,32997,2608, + 17667,25490,38479,3476, 6969, 38478,33346,7142, 17288,37523,12285,38478,6030, 29170,37383,34012,3045, 43204,467, 8215, 6516, 8094, 34012,15661,36968,32997,2608, 11379,35770,23791,17478,34503,36968,40449,2548, 616, 36106,27524,30834,43204,13597,39311,20462,43203,40449,34809,33386,43203,27827,27523,16085,10812,38478,36968, 27522,35770,24922,880, 33851,15236,3309, 17958,34012,28513,38478,43203,18548,40448,35770,6295, 30833,36968,35770,38477,38477,12091,215, 14408,14439,12554,12597, 21095,26565,1544, 259, 7059, 1336, 7530, 12462,5268, 9875, 29077,3512, 2165, 11378,5832, 30832,36939,14107,27521,30831,29076,43203,38477,32707,43202,11347,27079, 5365, 34338,7938, 33342,35769,5509, 8502, 2235, 4069, 1844, 3122, 16395,7960, 13426,21094,9660, 14908,26155,36967,24921,40448,43202,14907,43202,35433,35769,18293, - 11278,23790,37192,5222, 19762,30830,11303,35112,34078,43202,43201,5507, 26154,34326,38477,38476,19786,6061, 36967,6182, 5686, 6780, 34011,43201,38476,21994,2180, + 11278,23790,37192,5222, 19762,30830,11303,35112,34078,43202,43201,5507, 26154,34326,38477,38476,19786,6061, 36967,6182, 5686, 6780, 34011,43201,38476,21994,2180, 34126,43201,35769,29075,19504,12066,27734,13312,40448,43201,9855, 23789,15685,32706,2882, 8963, 34095,35769,38381,9321, 36967,40448,40447,34011,5245, 36105,33054, 34058,32365,19268,32815,8731, 14566,12451,21093,4471, 40447,745, 8031, 16937,36967,33345,16500,35768,43200,19339,22448,14545,35289,39058,7727, 19133,34444,21175, 3650, 21092,34808,14996,16009,15630,34011,23219,34011,40447,10290,11277,34373,33345,2536, 5232, 28327,33016,37116,40447,33345,38476,6849, 34808,13596,43200,32705, 36966,30829,1305, 25177,33034,23221,22838,1620, 17474,6633, 13655,614, 11022,15043,4127, 25831,35891,37270,35171,5508, 26556,40446,33345,34010,23788,43200,43200, 38476,43199,17555,38475,36911,12957,38475,11276,33795,19354,11669,31304,14, 12546,13595,36966,21091,13912,34808,17524,43199,20460,8054, 22341,34808,43199,17222, - 28233,17287,38475,38475,34010,29074,33755,35947,37110,43199,19828,43198,40446,35768,40446,34010,16936,18292,37470,428, 1727, 12031,38230,6994, 38213,37871,8527, + 28233,17287,38475,38475,34010,29074,33755,35947,37110,43199,19828,43198,40446,35768,40446,34010,16936,18292,37470,428, 1727, 12031,38230,6994, 38213,37871,8527, 18185,38856,9750, 1839, 31317,40446,10708,34340,35495,10068,40445,29607,11269,36667,7330, 35927,26238,21926,8026, 36861,38474,31731,21090,43198,5582, 43198,31114, - 43198,43197,634, 30460,28027,22187,11856,34544,10731,9480, 40445,26992,1301, 19545,28927,35926,34010,15629,39403,33509,21089,6113, 16394,15628,16393,40445,4520, - 1921, 29395,35145,30435,43197,22837,16774,32704,40445,36966,17286,36381,7778, 40444,34807,40444,1857, 32856,7203, 16327,6474, 12553,17495,11178,37999,14438,3963, + 43198,43197,634, 30460,28027,22187,11856,34544,10731,9480, 40445,26992,1301, 19545,28927,35926,34010,15629,39403,33509,21089,6113, 16394,15628,16393,40445,4520, + 1921, 29395,35145,30435,43197,22837,16774,32704,40445,36966,17286,36381,7778, 40444,34807,40444,1857, 32856,7203, 16327,6474, 12553,17495,11178,37999,14438,3963, 38281,6030, 43197,20461,40444,34807,34009,15627,33187,35768,25724,33344,40444,30617,3006, 21088,3360, 4940, 11275,34807,23787,40443,22836,43197,10289,43196,28328, 754, 8602, 36966,43196,34857,43196,764, 3649, 7529, 38474,9455, 40443,40443,33344,40443,38474,27520,30828,34009,23749,33028,34910,23087,7766, 35899,8357, 20783, - 37711,23018,36965,12612,2195, 7025, 26689,32632,29057,20376,31530,25802,20460,2721, 43196,19581,37425,43195,36965,9230, 65, 19580,9662, 4402, 18543,10514,4786, - 16078,23092,5175, 10486,32341,1468, 18291,8820, 12305,9437, 973, 8407, 21087,8358, 85, 5355, 14014,27921,13124,1804, 32801,1529, 9687, 23404,14089,4165, 2397, - 31580,14780,974, 11642,310, 25845,4046, 31376,782, 25531,24059,19857,11791,7826, 48, 3777, 5448, 5695, 12882,7548, 22374,12121,22637,26594,18370,20226,8255, - 157, 3070, 21410,32447,4225, 8034, 10928,30704,32117,31413,7623, 24151,26118,15132,2373, 31159,25462,2663, 32865,2525, 25993,9387, 19579,18616,23190,29409,8132, + 37711,23018,36965,12612,2195, 7025, 26689,32632,29057,20376,31530,25802,20460,2721, 43196,19581,37425,43195,36965,9230, 65, 19580,9662, 4402, 18543,10514,4786, + 16078,23092,5175, 10486,32341,1468, 18291,8820, 12305,9437, 973, 8407, 21087,8358, 85, 5355, 14014,27921,13124,1804, 32801,1529, 9687, 23404,14089,4165, 2397, + 31580,14780,974, 11642,310, 25845,4046, 31376,782, 25531,24059,19857,11791,7826, 48, 3777, 5448, 5695, 12882,7548, 22374,12121,22637,26594,18370,20226,8255, + 157, 3070, 21410,32447,4225, 8034, 10928,30704,32117,31413,7623, 24151,26118,15132,2373, 31159,25462,2663, 32865,2525, 25993,9387, 19579,18616,23190,29409,8132, 3504, 30, 17627,20392,1170, 20854,9374, 941, 22116,15258,13420,25041,32926,19521,22771,30277,7581, 34009,43195,21993,33581,18290,15626,35768,4015, 15532,19578, 21086,14567,26153,1443, 7494, 15773,16499,14094,33286,7110, 35767,36965,12259,685, 13311,43195,40442,38474,17397,40442,30827,36965,23905,34009,37940,33344,23716, 34807,27602,33344,43195,28483,34861,43194,39247,1722, 40442,2184, 37073,40442,34008,26152,33753,35767,21085,35767,3744, 8943, 17396,43194,36964,43194,38473,17285, 23786,10516,40441,33253,16084,10067,39211,17584,43194,32703,4939, 24920,38473,30826,35046,8728, 10064,6654, 32702,9874, 40441,34008,29775,28978,22976,8389, 40441, 38473,26151,34078,14906,5715, 12447,43193,38473,13911,14995,7857, 29841,17395,20321,33343,34008,9894, 43193,10361,30141,30254,21123,37670,7210, 3554, 35693,40441, - 8045, 35164,16429,43193,36964,36964,24919,12425,4147, 5607, 5740, 8942, 16392,22289,35291,5641, 33902,39136,8730, 11377,36964,3444, 27855,4982, 38231,38472,4129, - 5831, 309, 13425,35767,17957,27519,36186,7099, 16498,18670,35766,14214,17956,21992,214, 36633,36837,3362, 8356, 36963,22321,11590,33377,20459,43193,22835,5640, + 8045, 35164,16429,43193,36964,36964,24919,12425,4147, 5607, 5740, 8942, 16392,22289,35291,5641, 33902,39136,8730, 11377,36964,3444, 27855,4982, 38231,38472,4129, + 5831, 309, 13425,35767,17957,27519,36186,7099, 16498,18670,35766,14214,17956,21992,214, 36633,36837,3362, 8356, 36963,22321,11590,33377,20459,43193,22835,5640, 15720,3710, 33343,24884,22724,13343,43192,9454, 1252, 36605,2983, 14565,18547,12284,40440,43192,34008,747, 7427, 2152, 38359,36263,33343,38201,37146,34007,43192, 33343,36963,14715,39123,7234, 15260,12891,19577,33562,40440,6531, 14437,19576,18289,2489, 38519,38038,323, 11279,28013,8318, 30154,34806,35565,36057,37487,16497, 19132,19880,18149,31087,8388, 14905,38128,33342,881, 2919, 26528,32374,29871,5259, 37344,12943,34820,24151,28825,7580, 4661, 1391, 16344,27201,1316, 36469,19218, @@ -15242,48 +15237,48 @@ static const unsigned short Ranks[197839] = 19068,4349, 8928, 21084,9923, 9339, 34577,21174,18784,5956, 21083,5507, 370, 6232, 32968,36963,20907,9815, 32740,29552,11533,19131,5071, 38472,7661, 1223, 17567, 6890, 21991,43191,3310, 13594,3089, 43191,5777, 36962,23785,34806,38472,40439,24918,21173,43191,36962,38472,33342,43190,29490,38471,10013,22834,43190,29073,26150, 35766,35766,14904,38471,16391,27518,37998,35508,2205, 17284,23000,43190,36962,26149,37533,38471,4049, 10587,43190,19130,9320, 2653, 38471,43189,6231, 11077,23784, - 39290,33342,43189,36874,35765,11152,34007,29072,16079,8230, 36222,18498,9486, 21172,28231,2160, 29071,33064,33334,2806, 33362,27517,43189,12283,21082,27506,6473, + 39290,33342,43189,36874,35765,11152,34007,29072,16079,8230, 36222,18498,9486, 21172,28231,2160, 29071,33064,33334,2806, 33362,27517,43189,12283,21082,27506,6473, 10066,32701,8506, 21670,4878, 40439,33342,18626,323, 29619,14412,14378,2383, 35145,9478, 22833,18288,43189,7063, 43188,30825,34806,35765,32700,43188,5075, 38384, 33299,19785,33146,38470,34805,22832,3674, 8506, 35590,4348, 7771, 4873, 36064,11185,14994,43188,30940,37865,43188,32987,43187,23783,12301,17283,40439,16948,34447, - 1378, 30321,17282,34120,40439,35931,9077, 3189, 11217,4808, 5458, 43187,38775,7062, 30824,7840, 35765,32699,13880,34706,30888,30463,2765, 8505, 12723,34115,8093, + 1378, 30321,17282,34120,40439,35931,9077, 3189, 11217,4808, 5458, 43187,38775,7062, 30824,7840, 35765,32699,13880,34706,30888,30463,2765, 8505, 12723,34115,8093, 14436,13424,16083,5429, 36962,21081,8060, 38470,14435,27850,17755,10211,5193, 499, 10455,6343, 23118,18138,10306,33632,30387,18665,7054, 38407,18264,33558,17293, 9659, 6921, 32896,23939,2870, 6571, 18643,43187,24464,15597,31777,15674,14966,20827,9544, 14669,34007,16390,38470,7954, 645, 32834,9873, 12282,4409, 28977,24914, - 14457,17994,8647, 33341,40438,36961,24488,40438,43187,19595,14662,25662,618, 24010,28813,24576,11394,22390,38470,33068,21071,13248,6324, 29320,28846,20632,7980, + 14457,17994,8647, 33341,40438,36961,24488,40438,43187,19595,14662,25662,618, 24010,28813,24576,11394,22390,38470,33068,21071,13248,6324, 29320,28846,20632,7980, 28576,21171,14380,36541,36556,3045, 25178,3272, 10635,5399, 7509, 7122, 28346,16389,19575,37657,8780, 31670,31517,38911,31154,11333,16074,27989,25965,13368,21179, - 25318,11546,24223,13568,6397, 18287,21990,37892,35572,35765,23782,43186,34244,16869,30825,37823,34006,27207,8839, 38469,36961,35764,38469,28870,40438,31160,4154, + 25318,11546,24223,13568,6397, 18287,21990,37892,35572,35765,23782,43186,34244,16869,30825,37823,34006,27207,8839, 38469,36961,35764,38469,28870,40438,31160,4154, 43186,5168, 11184,43186,12001,34006,13423,34978,3677, 7313, 5324, 23781,4470, 40438,23780,32698,40437,11459,36266,43186,43185,40437,2812, 11301,11183,10093,19574, 8538, 26306,13505,26148,26687,40437,43185,21989,34805,43185,38469,40437,33341,40436,2042, 207, 3338, 28607,13359,594, 1964, 37176,2814, 1223, 623, 20458,26147, - 9319, 29028,36961,12122,43185,22831,32697,38469,17281,34805,38468,17280,38468,40436,37214,43184,21080,34928,36247,30823,36961,12551,8838, 33341,11182,21079,8925, + 9319, 29028,36961,12122,43185,22831,32697,38469,17281,34805,38468,17280,38468,40436,37214,43184,21080,34928,36247,30823,36961,12551,8838, 33341,11182,21079,8925, 35239,23779,2466, 2930, 19784,40436,43184,40436,29121,3466, 11273,36390,28538,21170,38468,26146,37136,34862,22830,27516,34006,9733, 34805,4877, 43184,35764,27515, 34804,33341,14982,34514,33340,30822,26145,35436,43184,34984,10067,3786, 4879, 13649,17327,24993,40435,38468,13879,43183,10990,15830,36960,10557,36960,17955,43183, 35764,40435,12552,16388,10200,38861,33340,29070,35764,2322, 9318, 3942, 8699, 38467,6532, 35847,1567, 36960,29069,23778,38467,4885, 14258,4229, 12192,18016,38998, 35763,7777, 7684, 18546,43183,30821,34804,1508, 14903,36960,15660,970, 43183,43182,38770,38223,14207,7418, 15659,17393,35763,35763,29068,32696,24917,33340,12780, - 43182,27441,13878,35763,19263,34006,8633, 155, 22829,5639, 43182,10638,40435,40435,43182,38604,17701,1634, 1067, 5685, 482, 10013,3807, 33340,14993,17279,3044, + 43182,27441,13878,35763,19263,34006,8633, 155, 22829,5639, 43182,10638,40435,40435,43182,38604,17701,1634, 1067, 5685, 482, 10013,3807, 33340,14993,17279,3044, 24916,33339,4293, 13503,25470,32953,35889,14434,33726,11589,35762,13972,5090, 15658,40434,2168, 34401,34804,38467,34352,38417,10293,38543,34429,36423,40434,36959, - 29067,40434,16496,35762,32388,36536,26153,30443,2915, 3367, 38467,43181,8523, 8092, 26301,13338,9333, 40434,10014,36959,38466,6652, 21169,43181,30820,40433,4761, + 29067,40434,16496,35762,32388,36536,26153,30443,2915, 3367, 38467,43181,8523, 8092, 26301,13338,9333, 40434,10014,36959,38466,6652, 21169,43181,30820,40433,4761, 12065,40433,32814,13200,34804,38466,23777,43181,34803,6401, 3236, 28998,43181,37672,43180,34005,40433,11825,34280,30485,21789,9989, 22891,40433,18545,34191,32083, 43180,36959,9317, 18554,36550,9329, 7898, 959, 12913,34803,13310,31845,21988,36959,40432,20457,3403, 5089, 36958,30819,14564,22828,30818,38466,650, 24915,16082, 12802,36958,30817,27630,43180,35762,602, 11780,13593,36958,35762,38466,20996,11598,8102, 33697,7426, 29897,43180,43179,10312,43179,32695,13877,16387,43179,24292, 15657,40432,6508, 9388, 35679,38465,43179,38108,30816,35918,26899,10911,25661,6370, 34005,40432,30815,27514,43178,658, 18544,1219, 40432,21317,43178,43178,30814, - 38465,12281,40431,32834,29066,43178,34803,40431,4184, 33943,30813,39378,43177,14563,13525,481, 43177,32694,4588, 35761,17954,38465,2394, 43177,33801,8234, 1738, + 38465,12281,40431,32834,29066,43178,34803,40431,4184, 33943,30813,39378,43177,14563,13525,481, 43177,32694,4588, 35761,17954,38465,2394, 43177,33801,8234, 1738, 34803,40431,6202, 38276,38465,33339,16247,38464,27434,40431,7208, 18286,13876,36958,43177,38464,6396, 550, 40430,32693,33339,12875,43176,34802,35761,21422,29494, 32692,38464,14169,4205, 36957,1355, 16081,36957,38464,40430,26144,34802,10996,14434,12064,22677,24914,32937,14764,36913,34600,36957,26143,36132,13592,33458,34005, - 35996,28883,7953, 32691,14213,34802,34005,35058,9596, 22827,35761,36957,21078,26142,40430,34888,8160, 38463,43176,10642,36956,18477,17953,17278,7207, 33339,1621, + 35996,28883,7953, 32691,14213,34802,34005,35058,9596, 22827,35761,36957,21078,26142,40430,34888,8160, 38463,43176,10642,36956,18477,17953,17278,7207, 33339,1621, 36956,40430,19783,6342, 5999, 11588,37027,14433,38463,20456,718, 13422,15625,38515,12063,35761,6130, 38463,19812,40429,38463,23776,38462,34004,35760,40429,34419, 43176,17291,43176,583, 17277,36956,38462,29065,5846, 43175,34004,30812,43175,36021,38457,18126,21783,40429,14562,30811,38462,43175,40429,43175,887, 38810,31563, 33288,18285,38911,43174,37046,36108,22817,40428,35760,24101,8847, 2626, 3098, 26141,5053, 38462,12801,23775,10989,10947,5123, 24913,19542,33478,34004,39082,39187, - 22365,43174,27513,40428,40428,33338,43174,19782,43174,43173,35357,37801,10292,25544,17814,6967, 9195, 932, 19672,692, 11272,4429, 15624,38461,12280,3087, 2552, - 40428,38351,35760,13309,4261, 40427,30409,38461,120, 3876, 3574, 19738,3082, 39205,19907,36648,33338,43173,19895,36956,40427,31110,26294,12601,3047, 33465,3294, - 21330,8021, 18680,30406,11771,16566,38873,30810,21987,11339,193, 12046,33683,10515,12514,25201,21612,21047,35875,19129,36100,23055,11948,36324,36199,43173,2182, + 22365,43174,27513,40428,40428,33338,43174,19782,43174,43173,35357,37801,10292,25544,17814,6967, 9195, 932, 19672,692, 11272,4429, 15624,38461,12280,3087, 2552, + 40428,38351,35760,13309,4261, 40427,30409,38461,120, 3876, 3574, 19738,3082, 39205,19907,36648,33338,43173,19895,36956,40427,31110,26294,12601,3047, 33465,3294, + 21330,8021, 18680,30406,11771,16566,38873,30810,21987,11339,193, 12046,33683,10515,12514,25201,21612,21047,35875,19129,36100,23055,11948,36324,36199,43173,2182, 36587,26075,3757, 38467,13591,30998,39355,18929,36955,33338,4921, 16121,9194, 20071,18543,19573,10811,4292, 40427,10457,10514,37662,21986,35760,40427,37946,38163, 37671,35759,34802,43173,19572,36081,17276,9581, 26596,39418,37556,37098,33432,38461,27753,30809,43172,37746,31798,32554,32979,14769,188, 24724,2210, 11741,22450, 26611,12279,23774,43172,17275,18542,39399,8091, 35759,36955,24112,32896,4366, 27713,18284,32924,43172,35204,7633, 33338,34801,8864, 38461,2245, 36059,34801,34801, - 36955,18795,3740, 9582, 9595, 30808,1668, 10771,33851,43172,37486,39341,1754, 6494, 15623,36955,13910,38460,34004,38460,22826,26140,10651,20455,33125,22825,8779, + 36955,18795,3740, 9582, 9595, 30808,1668, 10771,33851,43172,37486,39341,1754, 6494, 15623,36955,13910,38460,34004,38460,22826,26140,10651,20455,33125,22825,8779, 24912,21077,34801,17357,17874,34800,43171,21076,26894,37601,38919,9067, 12551,6112, 14686,1493, 13852,14671,17550,1391, 24778,7726, 36558,43171,19143,17274,23773, 36954,25988,21075,33431,28244,43171,43171,38460,40426,36954,40426,36954,36954,34800,38460,23451,6152, 35533,8577, 43170,9810, 10311,1892, 11587,38459,31929,32709, 17227,40426,5594, 43170,2103, 40426,14212,23772,29064,38459,30807,10810,27512,40425,22824,40425,38266,43170,26139,18794,10694,12643,1890, 30995,22823,38459,43170, 34003,39354,34003,34800,24635,2652, 21074,40425,8159, 40425,34800,11108,5074, 6614, 43169,38459,5556, 13241,13562,5056, 19391,22032,2372, 33602,36953,11546,22822, - 40424,34003,6746, 29787,21985,43169,36953,35759,36953,34003,1455, 14822,36953,38460,43169,38682,35759,12522,38820,34799,21073,38458,33337,36952,43169,36952,3874, + 40424,34003,6746, 29787,21985,43169,36953,35759,36953,34003,1455, 14822,36953,38460,43169,38682,35759,12522,38820,34799,21073,38458,33337,36952,43169,36952,3874, 17273,19571,23771,1352, 20518,35758,16495,30806,2965, 17952,36952,16386,13421,14902,36952,11586,43168,43168,9193, 38298,11535,17, 14921,30262,30805,37936,35758, 13420,39346,33337,34799,6848, 12441,27223,5510, 9316, 35758,33855,11181,34799,1019, 19201,33085,33337,4640, 14992,14901,11892,13419,6835, 1891, 43168,33734,36426, 34719,10809,2333, 38458,33337,12550,35758,155, 38403,34002,34799,34798,10310,43168,10978,23770,34002,38458,43167,22576,43167,5794, 32213,38458,16080,8601, 43167, @@ -15296,7 +15291,7 @@ static const unsigned short Ranks[197839] = 43164,33336,4375, 29062,43164,20454,23889,22820,40421,8271, 15622,327, 39065,30800,17270,34001,19124,40421,27508,35756,20453,10637,38046,30799,35002,15621,10353, 40421,40421,7725, 21071,659, 43163,32688,19780,16933,35755,9593, 5549, 7776, 19123,35755,38966,15892,36949,38455,37498,43163,6233, 43163,2929, 23769,2013, 34797, 40420,30495,10636,26, 30508,21566,209, 35755,13875,43163,1003, 30996,8387, 21070,34797,18540,43162,40420,34797,34797,21362,13307,21333,38455,24482,22819,43162, - 13758,38455,5569, 11271,43162,29061,26941,35755,33336,33335,17951,13589,7959, 36688,38455,5161, 3279, 1970, 21069,19569,36949,4004, 26137,34796,35042,4463, 5704, + 13758,38455,5569, 11271,43162,29061,26941,35755,33336,33335,17951,13589,7959, 36688,38455,5161, 3279, 1970, 21069,19569,36949,4004, 26137,34796,35042,4463, 5704, 5088, 6779, 33761,43162,39275,38454,39346,26509,19568,7683, 33335,34796,12956,30798,33004,3673, 7951, 43161,12191,36949,35754,11585,21984,14431,14560,34070,43161, 20452,21983,43161,38454,18282,7598, 38526,35410,43161,38454,43160,40420,6778, 43160,27507,19567,38454,23540,942, 33008,35754,33261,12975,21068,34424,28775,10555, 34752,22845,3390, 31950,17277,30262,28306,43160,36948,33335,21166,36836,1569, 11853,11871,30086,27118,9292, 18127,13417,35126,20451,11824,36948,454, 30637,10662, @@ -15308,7 +15303,7 @@ static const unsigned short Ranks[197839] = 22142,17693,4005, 28557,23768,43159,19122,33333,25775,10456,20449,10807,14066,35545,34795,43159,16932,24803,30479,15971,22331,43159,21978,4626, 40417,13457,11426, 26136,17949,18836,18259,14920,31425,22467,1764, 23767,22203,14559,26135,12278,10012,43158,8270, 38453,7724, 24933,40417,35752,43158,33606,33832,316, 12549,43158, 33333,16931,43158,33634,40417,33333,38187,26134,36947,43157,40417,32872,32686,579, 19172,27504,43157,28925,37580,40416,29059,33283,43157,13558,39195,25253,43157, - 33987,20435,13416,27503,34795,13415,3248, 20669,13909,43156,38453,22566,34000,26133,21164,36946,32685,40416,21163,672, 14484,40416,28382,23466,7211, 15620,8269, + 33987,20435,13416,27503,34795,13415,3248, 20669,13909,43156,38453,22566,34000,26133,21164,36946,32685,40416,21163,672, 14484,40416,28382,23466,7211, 15620,8269, 10309,34794,1187, 16930,21066,38452,27698,12549,30793,953, 365, 2590, 20448,18536,4586, 941, 15276,6304, 43156,12800,38452,1686, 2789, 29058,19566,4317, 43156, 39185,43156,6230, 10484,4183, 6776, 4785, 30792,37668,35070,10455,17392,43155,40416,8090, 5955, 18281,36946,8353, 16384,35633,19286,5131, 12119,17252,21531,32985, 38994,10513,21065,10995,40415,43155,43155,18280,19301,11686,18797,40415,35264,43155,16383,36946,22611,32296,8134, 33084,8790, 30095,15984,4272, 21323,21211,27837, @@ -15316,26 +15311,26 @@ static const unsigned short Ranks[197839] = 34794,4984, 6737, 43154,19650,32777,32600,30791,27502,36946,14899,43154,35752,40415,2475, 36945,7993, 26600,8332, 4048, 11331,13588,34794,12190,2558, 38452,40415, 30790,8571, 19565,29819,38452,2273, 43154,36767,34000,36945,34211,26132,29057,38451,33333,43153,21162,36945,11822,6919, 6464, 14898,43153,43153,43153,34794,38451, 7627, 11790,20208,9149, 7597, 16929,30789,22818,33061,38987,17078,38673,20198,40414,31974,38451,26131,32594,43152,36945,1023, 36944,3121, 17440,29751,5350, 10065, - 37712,43152,6783, 15953,21328,40414,37749,27843,3722, 27501,43152,17948,28872,34000,12955,38451,8355, 16928,26130,34165,35197,22085,21977,24868,33332,38125,2069, + 37712,43152,6783, 15953,21328,40414,37749,27843,3722, 27501,43152,17948,28872,34000,12955,38451,8355, 16928,26130,34165,35197,22085,21977,24868,33332,38125,2069, 17269,5101, 17268,32381,22675,13250,33999,33332,35752,35752,38450,15349,43152,2700, 37549,33332,1220, 23135,16077,36944,27500,38463,30788,16076,38450,21976,40414, - 24911,36944,22817,43151,36944,33332,43151,43151,11647,6580, 21161,35751,6463, 40414,43151,32684,33999,33999,25938,12548,7579, 16492,38450,35231,36943,36943,7596, - 27499,1588, 29056,36943,7769, 18006,38904,43150,23766,36944,28886,12014,7425, 9453, 20447,24910,43150,11376,9731, 19564,21160,40413,4667, 33331,43150,8837, 5457, + 24911,36944,22817,43151,36944,33332,43151,43151,11647,6580, 21161,35751,6463, 40414,43151,32684,33999,33999,25938,12548,7579, 16492,38450,35231,36943,36943,7596, + 27499,1588, 29056,36943,7769, 18006,38904,43150,23766,36944,28886,12014,7425, 9453, 20447,24910,43150,11376,9731, 19564,21160,40413,4667, 33331,43150,8837, 5457, 43150,32683,32682,37227,23765,26129,34793,6398, 6745, 30425,34793,13908,25816,19563,14211,43149,40413,23764,21064,38450,39101,30277,20967,20888,35751,24250,43149, 35990,10206,38449,40413,32448,38449,40413,43149,40412,8386, 43149,40412,28510,10288,27498,34793,3800, 17267,30787,26128,43148,37421,40412,40412,43148,38449,13587, 40411,43148,23763,32681,13907,29689,29055,38449,33331,34105,37872,30786,43148,36943,6744, 3740, 35751,21762,31465,43147,43147,26127,18166,35751,35138,24738,26126, 10597,38555,38320,237, 7475, 28493,29351,32952,21024,32130,14430,40411,1547, 14683,18279,43147,18535,38448,30785,12799,40411,8443, 10081,21735,8246, 4528, 20697, - 822, 13047,649, 38448,43147,33999,35485,19562,28074,21063,12462,23476,35750,2000, 22327,38448,13257,33331,12798,5021, 35750,191, 8646, 18522,28904,32811,9101, + 822, 13047,649, 38448,43147,33999,35485,19562,28074,21063,12462,23476,35750,2000, 22327,38448,13257,33331,12798,5021, 35750,191, 8646, 18522,28904,32811,9101, 37087,31900,33998,3774, 37122,135, 6621, 31689,40411,13934,34873,35597,33345,34822,24105,35845,32149,29922,27633,22705,10365,15644,22564,6525, 25444,33708,27709, - 575, 28474,36554,4109, 35125,3383, 2290, 6773, 4023, 1131, 17039,3032, 17845,4318, 6125, 27497,3483, 17801,21576,34346,36121,32873,4769, 43146,1589, 10064,3479, + 575, 28474,36554,4109, 35125,3383, 2290, 6773, 4023, 1131, 17039,3032, 17845,4318, 6125, 27497,3483, 17801,21576,34346,36121,32873,4769, 43146,1589, 10064,3479, 12713,31734,10698,439, 4018, 26123,11375,21575,2645, 4900, 19201,33511,5382, 38448,34793,297, 15947,3366, 10717,326, 3505, 35750,3461, 43146,35750,8386, 14558, - 2488, 23697,36942,38630,2300, 29054,40410,37550,43146,33331,39384,11542,15196,10512,13720,33330,10979,408, 15965,30634,6472, 16649,22759,25130,35050,31249,3044, + 2488, 23697,36942,38630,2300, 29054,40410,37550,43146,33331,39384,11542,15196,10512,13720,33330,10979,408, 15965,30634,6472, 16649,22759,25130,35050,31249,3044, 37696,22310,23719,43146,43145,18278,18277,38447,33330,2631, 30784,38447,43145,2951, 10158,2474, 24215,5073, 37933,12708,4958, 12072,12336,14042,36512,17987,27749, 35749,10454,5505, 32680,1252, 2155, 3802, 23762,12416,40410,17391,27496,12277,33330,38252,21062,31446,40410,34792,38447,35749,40410,26125,12797,33224,38884,35106, 26124,2448, 21675,36942,34792,38751,34089,43145,36925,2304, 1639, 13906,750, 34255,10063,34792,3584, 16075,34409,18219,38963,587, 7141, 33330,23761,36942,43145, 38447,34792,2933, 4968, 39119,36942,761, 32679,36941,34791,7566, 35532,32977,28054,18063,32500,29631,17438,6194, 29274,328, 26123,26192,43144,10988,11794,18345, 3143, 3360, 6922, 38771,34170,1082, 43144,38438,37053,18144,21479,6908, 3693, 16120,8112, 12407,3990, 40409,26091,37114,5381, 12712,22261,7820, 17871,3834, 36495, 29722,33588,12364,33691,17594,17010,29590,12885,3599, 38446,43144,3106, 16, 13794,2399, 32676,17436,10359,30410,24821,12127,18756,31473,31512,3043, 3157, 38446, - 1990, 4365, 33318,36941,4728, 1879, 808, 36941,40409,9584, 228, 6653, 26470,35749,38446,3274, 1216, 2950, 1257, 3586, 14432,1318, 32739,30948,18586,675, 2299, + 1990, 4365, 33318,36941,4728, 1879, 808, 36941,40409,9584, 228, 6653, 26470,35749,38446,3274, 1216, 2950, 1257, 3586, 14432,1318, 32739,30948,18586,675, 2299, 21061,14311,24909,36941,39169,14785,38446,36940,16382,39151,33901,32721,21430,21746,21060,28259,10876,16668,22816,14557,38615,29053,30783,35292,23425,10635,38445, 8961, 10806,24647,10190,37120,24876,58, 16899,36940,8706, 161, 845, 27495,20203,38526,1562, 30686,15619,27461,288, 10805,332, 43144,35294,13401,32932,26916, 43143,38445,38445,2102, 25284,29052,43143,40409,5453, 21059,32678,30782,43143,33998,35749,40409,38445,14838,1402, 36940,36940,5122, 40408,35748,30781,38444,20446, @@ -15344,11 +15339,11 @@ static const unsigned short Ranks[197839] = 30780,13859,26750,4969, 36799,29246,38415,21525,35298,14897,16491,2296, 13755,31869,394, 7923, 43141,43141,31626,34296,26684,43141,20184,37618,16509,37394,29049, 33329,38503,4768, 36939,40408,22815,9872, 36939,40407,34207,15653,43141,35747,24434,32674,9477, 43140,27728,43140,1094, 36039,17031,30236,32673,27492,10308,43140, 24907,4893, 19132,36938,33329,1307, 29397,24906,34790,15652,17716,34790,38444,15651,14327,554, 13810,29180,34229,23256,35747,43140,38444,36938,38444,40407,21159, - 34700,19121,10730,14556,15275,16927,17946,40407,35747,43139,33997,38935,11584,12503,40407,40406,32672,40406,9871, 2427, 40406,1243, 43139,36006,21975,43139,2147, + 34700,19121,10730,14556,15275,16927,17946,40407,35747,43139,33997,38935,11584,12503,40407,40406,32672,40406,9871, 2427, 40406,1243, 43139,36006,21975,43139,2147, 205, 3664, 22814,40406,38443,2821, 43139,10011,38443,38365,36938,5121, 26122,22813,21974,40405,33997,38443,38443,34245,26121,40405,33997,43138,13903,43138,40405, 40405,19499,26120,37549,19120,11334,34980,38738,35747,40404,36938,21973,38442,35746,2845, 13586,27491,43138,33321,34790,35746,38931,37995,10634,38971,30779,20170, 19468,7839, 19561,12750,27616,33776,43138,40404,37035,34959,2445, 7417, 26943,26119,37128,10994,31, 13413,35332,43137,37327,23020,32790,11232,3859, 33010,15666, - 10993,9592, 38442,36937,18465,6231, 22818,21057,16926,16438,36028,34303,8613, 32865,29687,6665, 30183,14030,13599,38442,6763, 17390,8602, 2481, 14530,37791,6191, + 10993,9592, 38442,36937,18465,6231, 22818,21057,16926,16438,36028,34303,8613, 32865,29687,6665, 30183,14030,13599,38442,6763, 17390,8602, 2481, 14530,37791,6191, 4032, 16028,18828,18032,340, 43137,9146, 34790,14029,1338, 31563,33329,22293,33329,30778,40404,43137,40404,12188,34370,36937,1628, 166, 13874,19119,30777,26118, 24905,35746,33997,7514, 14210,22967,7936, 33178,9476, 3581, 40403,40403,43137,19654,31399,33031,33328,30776,38619,34789,21956,43136,35746,19937,43136,36937,36666, 43136,37623,43136,22572,4527, 43135,34563,34789,14990,31621,18149,40403,12869,23532,9057, 9133, 28563,13074,33996,25961,20950,32873,23705,28165,21741,6874, 25791, @@ -15362,8 +15357,8 @@ static const unsigned short Ranks[197839] = 23995,25556,27218,29396,4590, 18771,9068, 31459,22812,10453,7682, 36846,19560,29048,35415,12052,33615,34789,1298, 3636, 14233,21206,16380,13685,43132,29287,25593, 15671,10242,21158,29837,11960,3141, 2841, 33183,19522,34340,31887,6833, 21054,10729,38027,28183,43132,35745,32788,9508, 26047,13502,33452,10829,12389,1241, 27490, 40402,33995,27489,33995,40402,40402,43132,35262,23758,43131,33995,43131,36936,33917,23757,9067, 36936,36935,43131,27488,24321,40402,34922,23756,30774,30487,21053, - 38440,15650,35745,43131,17389,29047,19117,36935,30834,24904,13030,40401,32840,17315,43130,13873,43130,40401,15618,24054,19146,38440,38439,37109,34789,33328,6118, - 36040,2788, 27487,32671,40401,35745,43130,26117,36935,30773,5386, 34855,9591, 27619,36935,13306,22811,43130,35744,43129,30772,1712, 13130,17497,36934,268, 5787, + 38440,15650,35745,43131,17389,29047,19117,36935,30834,24904,13030,40401,32840,17315,43130,13873,43130,40401,15618,24054,19146,38440,38439,37109,34789,33328,6118, + 36040,2788, 27487,32671,40401,35745,43130,26117,36935,30773,5386, 34855,9591, 27619,36935,13306,22811,43130,35744,43129,30772,1712, 13130,17497,36934,268, 5787, 18749,32670,39361,34660,40401,27486,19116,9731, 33328,24903,40400,35744,36934,26116,40400,40400,40400,14429,36934,8268, 37945,14896,10061,33337,36614,43129,24902, 32669,10592,35744,982, 372, 33995,12795,32668,19777,40399,18534,30771,43129,24901,14578,17266,16074,13872,27485,31485,4269, 35959,34894,27769,110, 6847, 11450, 35744,38439,43129,36934,36933,26115,32667,4553, 6128, 33327,6471, 10010,34218,4463, 3222, 13305,13871,43128,43128,43128,21972,33994,35743,43128,18533,26114,43127, @@ -15375,51 +15370,51 @@ static const unsigned short Ranks[197839] = 14555,8598, 38438,11819,30371,27480,24899,43125,35742,43125,8384, 24174,635, 43125,16073,10157,43124,14082,20262,40397,33994,18401,38438,38437,16072,43124,24898, 34787,40397,35897,40396,35742,23754,14554,6077, 19115,380, 34806,5917, 14209,13870,33342,4585, 24897,38437,30100,35742,9075, 33994,3044, 43124,7130, 36932,29045, 43124,38437,3923, 21155,684, 30767,6651, 2252, 2393, 13585,37647,843, 1150, 19069,32664,24896,5738, 35015,40396,40396,32663,16490,8267, 37616,4250, 30766,17387, - 26112,2145, 24895,23753,35741,10737,27479,16489,35741,40396,1417, 12060,5968, 38437,32662,5548, 43123,40395,38436,14208,16071,19114,43123,14207,21968,38436,8089, + 26112,2145, 24895,23753,35741,10737,27479,16489,35741,40396,1417, 12060,5968, 38437,32662,5548, 43123,40395,38436,14208,16071,19114,43123,14207,21968,38436,8089, 38436,38436,4153, 36931,15214,21967,3662, 2134, 12793,3899, 474, 15617,9529, 40395,40395,30765,20445,4316, 5830, 7129, 36931,19113,3533, 40395,33327,6462, 14607, 16070,40394,35741,10987,40394,35741,17265,12547,34787,28703,13584,14897,33987,32661,36931,1466, 18276,24606,11545,21051,18275,25068,37319,18063,22807,27797,40394, 3515, 211, 43123,40394,8053, 33993,27478,33993,20976,28105,36931,11818,33992,2862, 38504,38435,34231,8508, 37741,34787,62, 32943,2750, 16593,10118,22986,15265, - 28363,32941,8500, 6966, 38435,36930,16379,35854,38435,8266, 7424, 36930,30682,33326,33842,3022, 37979,43123,43122,25119,39324,36930,40393,33993,1271, 23804,765, + 28363,32941,8500, 6966, 38435,36930,16379,35854,38435,8266, 7424, 36930,30682,33326,33842,3022, 37979,43123,43122,25119,39324,36930,40393,33993,1271, 23804,765, 40393,8277, 35740,33993,35740,5967, 9870, 8666, 40393,20763,36930,7513, 13583,24890,36929,12517,14553,18274,26844,40393,43122,36107,35233,37384,40392,40392,10804, 37669,36036,40392,38852,38435,35740,34786,43122,40392,2371, 2122, 12776,30764,36929,3592, 38104,20086,43122,37992,12187,27622,40391,35030,33992,38434,33011,36929, 10474,1546, 658, 35740,43121,33326,36929,11583,35739,13193,29044,36718,13970,1257, 20990,25245,33701,43121,3982, 19557,10803,40391,1962, 24750,12276,17944,35739, 30451,43121,18532,34850,40391,38741,15727,18772,10930,24894,38976,27477,29043,38434,43121,39220,7881, 30763,22806,19841,37057,38434,29852,213, 25461,16167,32847, 704, 2983, 5216, 6384, 35739,10728,341, 6379, 30496,26538,24648,19556,13259,7317, 31263,14422,36928,43120,8828, 27476,19776,43120,15285,3721, 15610,33326,18106, - 33779,30762,36928,8729, 37698,3765, 40391,38434,36928,8287, 38433,35739,33326,17264,16069,30761,33325,35738,34786,18039,32946,38433,32660,24534,1094, 1615, 1462, + 33779,30762,36928,8729, 37698,3765, 40391,38434,36928,8287, 38433,35739,33326,17264,16069,30761,33325,35738,34786,18039,32946,38433,32660,24534,1094, 1615, 1462, 4664, 33992,16488,32659,43120,21966,21667,32995,33325,33325,43120,38433,38398,43119,3021, 3637, 3294, 32418,7423, 43119,33325,22805,32497,12547,43119,21965,40390, 34786,6716, 32658,43119,5387, 38433,38432,38432,32657,35738,38432,38432,34786,36928,43118,31786,34785,20444,33992,37951,21241,5611, 35738,21238,12844,12546,33582, - 11854,40390,33324,14206,33699,40390,16599,837, 3105, 10986,37240,29042,15273,40390,33123,108, 9475, 36569,25047,8818, 7369, 257, 28129,1114, 7621, 18273,866, + 11854,40390,33324,14206,33699,40390,16599,837, 3105, 10986,37240,29042,15273,40390,33123,108, 9475, 36569,25047,8818, 7369, 257, 28129,1114, 7621, 18273,866, 16378,37867,30760,33992,5181, 474, 43118,9735, 20585,36927,898, 1907, 11632,25944,17034,31577,1654, 6387, 23071,31536,32933,6333, 35221,14427,19775,6006, 35738, 29958,34791,29558,30759,40389,43118,36927,34785,43118,10503,21659,27805,13930,8425, 30937,19849,33088,1807, 13601,17963,33035,20291,20309,25605,29600,24177,17202, 43117,38390,43117,33803,25400,15907,17927,31623,19416,12960,27676,29690,19345,38431,24511,38431,33991,30004,21683,30989,6299, 28533,14255,37341,3057, 7164, 34629, 28241,43117,22804,327, 27621,3020, 16924,15649,43117,43116,13411,22803,40389,35737,4427, 2732, 34509,11433,24893,23036,1650, 36927,39352,40389,3490, 3532, 34712, 16923,34785,14858,7866, 38431,30758,29041,20443,2171, 103, 40389,34785,26111,34243,36927,11962,24133,21050,16377,7849, 34746,4899, 4502, 10015,18488,5428, 11855, - 9474, 15616,15272,8951, 43116,33324,19112,7620, 16643,32796,16922,9730, 23752,15271,30757,36926,43116,8227, 39375,18272,12548,43116,23790,21004,38431,40388,8597, - 19774,29040,36926,3084, 36926,43115,2295, 23779,26301,43115,34784,33991,34665,24476,43115,7206, 9452, 33324,563, 25124,37549,26110,22802,6650, 33324,6775, 1488, + 9474, 15616,15272,8951, 43116,33324,19112,7620, 16643,32796,16922,9730, 23752,15271,30757,36926,43116,8227, 39375,18272,12548,43116,23790,21004,38431,40388,8597, + 19774,29040,36926,3084, 36926,43115,2295, 23779,26301,43115,34784,33991,34665,24476,43115,7206, 9452, 33324,563, 25124,37549,26110,22802,6650, 33324,6775, 1488, 38430,33991,20442,34045,31499,35737,24328,37249,6918, 30756,29039,20278,21049,32537,17263,10655,32383,37845,43115,14895,32656,17386,38430,35737,38521,43114,43114, - 32816,35623,19555,33963,33363,12059,43114,33991,35737,43114,38430,40388,38430,40388,43113,22801,15787,27475,34784,38425,27293,36926,3365, 33323,3833, 40388,6743, + 32816,35623,19555,33963,33363,12059,43114,33991,35737,43114,38430,40388,38430,40388,43113,22801,15787,27475,34784,38425,27293,36926,3365, 33323,3833, 40388,6743, 38429,8052, 27787,36925,8383, 17611,40387,33443,33548,12113,13410,17262,38001,22964,33070,37332,1241, 13304,35736,13046,25290,39176,15606,40387,40387,40387,16068, 8036, 33645,30755,11374,43113,35432,29038,36925,38429,43113,36925,30754,43113,40386,23626,43112,180, 36883,32857,29076,19045,37832,238, 6849, 36190,35736,32655, 32654,34952,2146, 37758,34962,17894,35629,21048,34784,33879,114, 21356,22728,593, 2557, 2253, 10156,8025, 26919,39027,32667,35190,18697,37571,24751,32877,19554, - 8683, 40386,38429,11817,38429,36885,24408,8778, 43112,4938, 38428,12545,38428,5317, 12045,7188, 10643,33341,6514, 10036,40386,29037,25344,36925,10060,43112,4519, - 19553,15615,2252, 11180,31800,43112,27474,17261,37104,35754,35736,43111,38428,5876, 11839,35736,11544,5386, 12954,6181, 17260,15614,43111,32115,43111,4596, 6896, + 8683, 40386,38429,11817,38429,36885,24408,8778, 43112,4938, 38428,12545,38428,5317, 12045,7188, 10643,33341,6514, 10036,40386,29037,25344,36925,10060,43112,4519, + 19553,15615,2252, 11180,31800,43112,27474,17261,37104,35754,35736,43111,38428,5876, 11839,35736,11544,5386, 12954,6181, 17260,15614,43111,32115,43111,4596, 6896, 936, 13378,21888,8747, 34011,5960, 2722, 31369,32892,12186,19552,14509,29594,15534,39042,36851,5036, 4462, 20536,9651, 16958,12934,14182,16857,24935,28464,26665, 19904,32432,38428,36924,34784,43111,34783,27473,43110,40386,38427,43110,27195,40385,35694,33991,36074,34783,33883,36924,7226, 7528, 19773,19551,24892,36924,33990, 15837,56, 24425,37936,26676,27277,14426,8777, 27515,30936,19772,3160, 21047,36924,1698, 17880,40385,40385,6895, 14470,33525,32653,28040,43110,24891,21026,10277, 16921,40385,12024,20441,21057,38194,39067,35735,38427,4818, 5485, 3171, 38784,328, 2168, 34783,40384,2575, 11816,40384,15613,4317, 43110,43109,11543,43109,27402, - 19550,27472,14989,18271,38100,43109,33827,32020,7128, 43109,38427,34029,34763,37603,37186,6552, 36163,34754,36923,3243, 15856,40384,5739, 21046,43108,18270,9473, + 19550,27472,14989,18271,38100,43109,33827,32020,7128, 43109,38427,34029,34763,37603,37186,6552, 36163,34754,36923,3243, 15856,40384,5739, 21046,43108,18270,9473, 30753,35735,27471,36262,37911,35735,28577,12934,34357,29472,22719,37225,17658,19549,39357,34783,31724,10059,12185,33994,38608,19548,21162,18391,20275,18016,27087, 19847,30091,25983,33077,35787,32770,22800,15619,2589, 23933,25014,2787, 3034, 35214,19410,24882,35743,32939,18292,8387, 26656,24444,8437, 7298, 32814,14890,19485, 36953,40384,1737, 10197,2213, 32695,37155,26651,36739,1285, 40383,24599,11549,43108,39236,15612,38427,26425,11822,37957,12953,36923,18269,13740,36923,12952,11854, 12169,40383,32927,34782,22483,37855,35735,35734,18557,20025,9148, 10287,18563,35116,38214,21004,12434,16819,25638,35290,40383,33008,39155,9272, 31981,11250,39285, - 44, 12246,8270, 32921,30759,18235,32782,5885, 2068, 6470, 2912, 34782,16376,12547,26891,606, 33649,2458, 35579,3400, 16397,16353,34837,36342,14746,36427,725, + 44, 12246,8270, 32921,30759,18235,32782,5885, 2068, 6470, 2912, 34782,16376,12547,26891,606, 33649,2458, 35579,3400, 16397,16353,34837,36342,14746,36427,725, 10135,15538,18417,7735, 14937,23162,20583,30752,32652,35734,7139, 3140, 7825, 10286,23969,22799,24365,21154,15838,7198, 3137, 3941, 15527,38963,9291, 21045,21044, - 15855,8646, 43108,43108,3774, 12544,29036,16487,38426,29035,5737, 43107,11815,43107,23454,37881,37697,33548,7909, 13210,14552,19443,3019, 35734,12184,36361,1324, + 15855,8646, 43108,43108,3774, 12544,29036,16487,38426,29035,5737, 43107,11815,43107,23454,37881,37697,33548,7909, 13210,14552,19443,3019, 35734,12184,36361,1324, 13409,40383,641, 12646,20229,43107,11885,17779,19547,3126, 32786,9852, 16286,18293,23706,19855,13710,16656,26951,7286, 40382,34013,36923,40382,36922,11373,40382, - 43107,43106,35734,34782,35733,43106,35733,18356,5109, 112, 23951,27491,35140,38950,30174,11853,19546,35733,17684,13634,19545,6592, 36922,21964,37129,8265, 6075, + 43107,43106,35734,34782,35733,43106,35733,18356,5109, 112, 23951,27491,35140,38950,30174,11853,19546,35733,17684,13634,19545,6592, 36922,21964,37129,8265, 6075, 13869,40382,12792,12058,12172,15270,3537, 9854, 4347, 1060, 4068, 3376, 1526, 18268,43106,35733,23322,1077, 13546,11606,13888,37802,33323,20116,36402,27470,17622, 34695,38426,21693,33990,2963, 2673, 36948,28651,6530, 43106,940, 22976,6395, 15648,35732,12543,3934, 18531,30751,35732,16187,13451,20698,18856,11154,6615, 33990, - 35732,10727,19111,10985,4807, 19544,23751,16727,21043,35238,5506, 34782,34949,39319,10032,22025,20716,14988,31771,28111,4876, 11542,19518,38287,37293,38794,2510, + 35732,10727,19111,10985,4807, 19544,23751,16727,21043,35238,5506, 34782,34949,39319,10032,22025,20716,14988,31771,28111,4876, 11542,19518,38287,37293,38794,2510, 18267,16375,8645, 4344, 25498,35732,12891,1798, 38426,8226, 6568, 35732,19826,28301,16827,27942,1156, 37905,37660,43105,43105,32651,15264,32995,321, 32919,18117, 9657, 3595, 36683,27469,35731,35731,35731,34781,43105,34781,35731,35730,29034,12542,40381,40381,32650,43105,27468,43104,27467,34781,30750,43104,35241,27466,34462, 22798,40381,40381,29033,33990,38426,35222,38425,33740,35730,24890,34781,12951,38425,40380,29032,38425,15391,19110,30749,412, 38425,36922,13905,35730,7393, 43104, @@ -15441,11 +15436,11 @@ static const unsigned short Ranks[197839] = 37759,38419,33466,33530,34296,37171,32967,21961,24887,38515,37509,12950,34173,34520,19778,15301,14987,43095,36849,18534,256, 11150,6832, 18264,43095,40374,38419, 2992, 36918,33987,12057,29718,32798,28590,77, 32646,33321,36918,14870,7061, 10154,6965, 43094,3742, 40374,14205,38419,40374,38418,33987,19108,27460,29028,29385, 33321,11582,24886,33986,40374,10123,19938,10306,24885,11757,27459,90, 36, 40373,43094,551, 32645,40373,32644,29027,2457, 5461, 26161,38418,22795,43094,23227, - 4146, 24225,430, 12137,19047,11402,18263,2161, 8338, 52, 16213,22966,12686,4092, 10807,27785,27464,9246, 23463,43094,43093,5785, 5456, 36918,17705,23423,2768, + 4146, 24225,430, 12137,19047,11402,18263,2161, 8338, 52, 16213,22966,12686,4092, 10807,27785,27464,9246, 23463,43094,43093,5785, 5456, 36918,17705,23423,2768, 30607,25297,971, 25097,8354, 26104,5216, 8755, 1152, 4815, 30741,2117, 43093,16919,22794,11269,23748,13904,17258,8244, 32781,13562,10983,36918,11378,30740,19640, 43093,43093,33321,4871, 18568,7916, 32091,29026,13622,29025,36917,29622,4916, 38418,32643,6341, 3898, 27458,3933, 8727, 25825,38418,27457,35727,35726,9313, 34778, 7895, 29024,23747,7681, 31294,28747,13303,1452, 19543,350, 38417,40373,28131,9869, 1102, 10554,31837,1745, 36917,17384,30739,9370, 21960,43092,19771,21608,17383, - 29719,1481, 34778,10982,29023,12275,7594, 1704, 7950, 7686, 38417,1664, 7416, 29022,9417, 28094,1659, 9981, 13014,43092,33986,6673, 343, 34778,14092,9451, 3120, + 29719,1481, 34778,10982,29023,12275,7594, 1704, 7950, 7686, 38417,1664, 7416, 29022,9417, 28094,1659, 9981, 13014,43092,33986,6673, 343, 34778,14092,9451, 3120, 5880, 7527, 6978, 6745, 15611,8225, 23958,2789, 6808, 30641,13302,20113,15332,474, 33419,7516, 29158,12424,11917,29175,21039,10992,24884,16374,20438,38417,24388, 35726,35726,43092,32432,38417,43092,3897, 15359,35726,20053,6831, 19542,35725,40373,3446, 33063,18040,17953,21038,43091,18262,8455, 4794, 16373,16372,16371,19541, 34777,14894,1772, 6337, 19979,29075,33017,12949,15610,8592, 36460,20786,18069,31275,20437,33986,32642,27456,43091,8411, 32654,12791,31878,31369,36585,38974,36917, @@ -15469,8 +15464,8 @@ static const unsigned short Ranks[197839] = 6363, 25785,30613,18613,10713,12109,26428,30719,35445,40365,836, 34774,37965,38411,26098,43083,1935, 24430,17257,3963, 14424,23744,36913,20837,22790,4709, 17941, 40365,14545,36913,36913,9589, 40365,36913,34774,40365,32633,26097,43083,4290, 40364,4145, 23743,34379,39152,33021,114, 5513, 18835,20908,30122,32137,17371,38411, 7415, 8644, 14957,13903,38410,7723, 9866, 19677,2170, 36912,43082,21958,5000, 604, 16144,588, 34339,18882,16686,18260,3636, 8941, 35721,27452,4939, 31350,37350, - 10153,981, 35664,7769, 34773,21150,7315, 5427, 36912,2368, 40364,40364,6370, 13416,33984,36912,8643, 35349,37519,43082,40364,27451,13299,27450,18259,5957, 2145, - 1266, 919, 3538, 2244, 2595, 33846,34773,36912,401, 43082,21957,37587,36726,33871,26096,43082,26095,8478, 43081,26094,34773,36839,2139, 40363,35721,38410,2805, + 10153,981, 35664,7769, 34773,21150,7315, 5427, 36912,2368, 40364,40364,6370, 13416,33984,36912,8643, 35349,37519,43082,40364,27451,13299,27450,18259,5957, 2145, + 1266, 919, 3538, 2244, 2595, 33846,34773,36912,401, 43082,21957,37587,36726,33871,26096,43082,26095,8478, 43081,26094,34773,36839,2139, 40363,35721,38410,2805, 40363,16918,34773,6970, 20348,40363,38992,29302,11267,16370,21461,8503, 14985,40363,38410,40362,38410,3932, 43081,38409,34940,99, 17358,19713,43081,23931,27449, 38409,36911,14891,17380,40362,40362,986, 18387,6613, 3339, 13775,40362,8596, 36549,6740, 21036,35721,19767,6713, 38409,34812,36911,35721,40361,24881,4027, 25660, 33319,35720,43081,40361,30023,36911,33984,38409,30543,32632,30175,23742,34772,43080,36911,18528,17379,29014,5915, 2609, 24243,31799,15430,38408,8190, 24752,36852, @@ -15480,52 +15475,52 @@ static const unsigned short Ranks[197839] = 1206, 14983,29980,40360,37267,36910,38407,40360,20686,43080,1630, 13406,3877, 8081, 10465,14457,38866,2405, 13362,10980,11667,11541,27707,35720,35713,29012,22935, 10979,43079,27447,40360,15643,30734,6460, 34464,1416, 36551,27446,43079,9588, 40360,43079,8641, 8595, 16553,3882, 30417,26063,43079,36379,36910,18256,32630,35720, 40359,23740,36910,1709, 33984,38618,12181,35032,17514,40359,43078,40359,38407,43078,35720,146, 9403, 33397,1207, 27473,33153,21290,2052, 38407,43078,5431, 34536, - 37514,40359,37494,35684,2923, 38394,30733,43078,15851,34565,36254,36643,32327,17216,36555,38918,38597,43077,25313,946, 38407,40358,36909,33319,36909,4738, 8606, + 37514,40359,37494,35684,2923, 38394,30733,43078,15851,34565,36254,36643,32327,17216,36555,38918,38597,43077,25313,946, 38407,40358,36909,33319,36909,4738, 8606, 5954, 43077,2394, 37958,9146, 34995,3607, 38110,37675,19341,3099, 7029, 16943,2963, 35700,11430,36580,21715,7020, 40358,27649,34771,37923,22339,36947,17531,15316, 43077,7525, 32629,43077,43076,32628,35958,40358,43076,3924, 13405,8776, 35879,2630, 26702,43076,22460,32535,13867,8437, 38406,10832,9290, 16367,13581,27445,33318, - 23739,7013, 9046, 40358,35437,26092,37499,34771,4909, 7967, 31691,9957, 43076,15642,43075,15607,9853, 19539,1094, 36618,36909,35719,33307,33709,11850,19538,9655, + 23739,7013, 9046, 40358,35437,26092,37499,34771,4909, 7967, 31691,9957, 43076,15642,43075,15607,9853, 19539,1094, 36618,36909,35719,33307,33709,11850,19538,9655, 16366,34230,33950,4884, 3069, 24234,38406,10009,10058,18255,19766,8264, 35719,22789,19875,43075,40357,20434,43075,43075,35083,32627,36909,43074,33650,40357,13043, 1774, 30066,25540,16365,5414, 43074,29011,37213,34771,11579,22493,31777,6356, 26091,36535,43074,9070, 36908,249, 15687,37494,18254,19537,17978,21820,30732,27444, 4479, 21034,33318,38347,35719,7964, 43074,36467,37496,31033,18691,7206, 35426,36908,38355,7205, 3659, 35719,12539,36908,7046, 33112,4026, 22948,33318,38406,24880, - 67, 12538,5285, 30739,2820, 17378,9587, 34771,22080,16842,22133,17256,7348, 35411,1356, 32873,6726, 10443,33984,18724,11849,32533,37780,25107,15641,5019, 6977, - 7837, 21956,6330, 36908,33318,3434, 38406,43073,29370,30731,40357,14543,36907,14203,3311, 18253,9852, 18883,21033,40357,4793, 123, 2411, 29033,23810,810, 1248, + 67, 12538,5285, 30739,2820, 17378,9587, 34771,22080,16842,22133,17256,7348, 35411,1356, 32873,6726, 10443,33984,18724,11849,32533,37780,25107,15641,5019, 6977, + 7837, 21956,6330, 36908,33318,3434, 38406,43073,29370,30731,40357,14543,36907,14203,3311, 18253,9852, 18883,21033,40357,4793, 123, 2411, 29033,23810,810, 1248, 24463,3786, 2104, 27361,30837,5214, 2250, 12650,8461, 24783,28031,43073,19765,5396, 19764,27602,43073,40356,25696,38405,40356,43073,27443,27442,28680,2111, 40356, 12178,40356,25390,9865, 43072,1675, 4496, 6013, 10030,3552, 699, 20672,30705,18993,4668, 6127, 18527,40355,33, 1241, 13488,9836, 3720, 32870,28667,25184,12043, 17785,18233,12251,27700,26248,30998,25221,25846,12737,25889,18723,19007,15054,32917,21451,22651,31074,29709,15833,38978,20433,9311, 24733,29634,40355,16364,34354, 11178,2079, 19974,31552,1604, 33983,12055,18953,11335,19763,33830,32985,31987,24570,30222,744, 20549,15182,180, 22469,43072,12948,19580,36187,34315,12213,22676, - 33317,43072,2415, 35324,40355,38634,32013,32273,40355,11578,35587,8502, 10008,37221,6343, 17304,35718,16917,18943,34770,8051, 9870, 24946,5829, 25087,24540,8263, + 33317,43072,2415, 35324,40355,38634,32013,32273,40355,11578,35587,8502, 10008,37221,6343, 17304,35718,16917,18943,34770,8051, 9870, 24946,5829, 25087,24540,8263, 32822,4937, 636, 43072,36094,38405,22788,34770,34379,34724,43071,38405,13866,6238, 36603,36907,22562,16484,12775,12787,28874,12813,33653,38069,43071,2147, 30773, - 9977, 20389,40354,36340,36638,9069, 9864, 23436,30730,7249, 36567,20998,23652,23738,7300, 34770,5199, 26090,23737,11814,30881,6712, 37611,40354,5087, 32919,5225, + 9977, 20389,40354,36340,36638,9069, 9864, 23436,30730,7249, 36567,20998,23652,23738,7300, 34770,5199, 26090,23737,11814,30881,6712, 37611,40354,5087, 32919,5225, 11356,1075, 10348,40354,382, 25854,7680, 4025, 7793, 4024, 4434, 14982,38405,38404,21032,11540,27441,36907,36907,167, 30600,29526,33983,40354,18114,43071,30561, 27440,19105,348, 40353,9586, 15724,15640,4289, 2965, 43071,19042,1206, 8670, 21955,501, 35623,37993,43070,33983,37, 7022, 10631,32798,29010,40353,40353,43070, - 36906,23736,36906,19555,7592, 33983,36906,23735,3327, 38404,36906,43070,43070,35718,43069,43069,36905,39282,14202,29009,36905,35718,10801,34770,12380,43069,1590, + 36906,23736,36906,19555,7592, 33983,36906,23735,3327, 38404,36906,43070,43070,35718,43069,43069,36905,39282,14202,29009,36905,35718,10801,34770,12380,43069,1590, 31862,9786, 40353,22787,40352,30729,34508,10107,4898, 8640, 35302,11707,17085,17483,38404,22442,1297, 13252,22175,40352,16859,43069,2720, 33982,38404,40352,35696, 21149,40352,35718,11558,27439,40351,13254,40351,13580,29516,35014,40351,34769,2236, 21877,43068,43068,27344,11577,17377,32626,30728,36905,40351,685, 25997,21031, 425, 31849,3079, 36905,33982,19160,43068,13450,38403,1878, 35717,36905,43068,26089,2725, 20507,43067,40350,36904,26088,35767,40350,12786,37333,35717,19528,21030, 43067,993, 32625,27438,21954,1705, 30639,43067,20537,25407,15516,8881, 8976, 20004,9605, 36066,34341,34769,43067,18550,31236,13902,39385,38403,38912,6083, 43066, - 43066,30727,35717,35717,13901,6355, 11539,40350,2994, 2861, 35716,3149, 13900,4027, 14980,12272,16115,14314,21953,20432,40350,6917, 1812, 40349,19746,32624,4772, + 43066,30727,35717,35717,13901,6355, 11539,40350,2994, 2861, 35716,3149, 13900,4027, 14980,12272,16115,14314,21953,20432,40350,6917, 1812, 40349,19746,32624,4772, 43066,38403,40349,33317,1689, 20566,14542,24879,29008,21148,27437,40349,40349,43066,36904,43065,34769,21147,8775, 13899,11515,4938, 15606,17939,3489, 11266,38289, 37458,43065,6292, 40348,35716,33982,43065,4625, 43065,13579,1489, 17582,10007,30726,21952,93, 13791,16064,14692,3143, 307, 2378, 40348,29007,36904,9729, 39230, 34769,13800,43064,30616,14981,9597, 21030,43064,43064,43064,4908, 43063,919, 12090,40348,34818,20431,29872,27849,40348,28056,35716,38658,19347,23246,2110, 39095, 5284, 3226, 9457, 5291, 29079,43063,32623,26087,6742, 6230, 26086,17255,7862, 4584, 34768,6092, 7775, 7125, 43063,35716,8141, 493, 35877,16916,43063,10970,14980, 37500,1271, 40347,13042,5160, 38403,18734,13898,34334,23377,32597,30725,8316, 13298,4981, 36613,33317,34720,30724,5374, 30723,38402,4611, 4792, 30625,27502,33982, 43062,35715,35715,36825,7303, 21283,34907,7414, 7865, 21029,9729, 13897,40347,7864, 43062,2200, 36368,38402,38402,43062,35715,9068, 43062,8353, 18252,39377,10800, - 32622,34768,36909,2487, 9654, 34567,21028,19536,26085,33317,25728,40347,16175,33981,14423,18526,10284,34102,18485,29006,8380, 37977,16063,3364, 985, 38402,5635, - 30722,3033, 43061,10057,36330,24878,34768,43061,35315,43061,27998,15605,43061,36904,9310, 33981,29005,2151, 17938,13875,43060,17254,21157,38664,30721,38401,3347, + 32622,34768,36909,2487, 9654, 34567,21028,19536,26085,33317,25728,40347,16175,33981,14423,18526,10284,34102,18485,29006,8380, 37977,16063,3364, 985, 38402,5635, + 30722,3033, 43061,10057,36330,24878,34768,43061,35315,43061,27998,15605,43061,36904,9310, 33981,29005,2151, 17938,13875,43060,17254,21157,38664,30721,38401,3347, 36903,11538,36903,36127,14422,43060,38612,30720,38874,15639,11265,27436,21951,40347,43060,40346,43060,11032,19958,33981,12537,30719,21146,5547, 35713,19933,25563, 11630,1422, 11858,23189,16363,17253,39030,11371,36892,23734,33445,22786,26084,40346,36903,40346,43059,36903,3672, 38401,14421,4693, 22746,3799, 34768,36902,33316, 23733,43059,23732,38401,30718,40346,33981,21027,21222,30717,26226,43059,36902,36902,16915,38401,35715,35714,33316,21656,36902,33980,15638,38400,43059,38400,40345, - 29004,4111, 33316,13404,2377, 16062,8498, 7948, 19472,40345,33980,38400,43058,40345,33980,7524, 25628,12785,38553,18525,35714,43058,22011,30716,20430,36901,3042, - 43058,31795,13367,40345,29889,27543,38641,34767,40344,40344,35714,9309, 11813,38400,38399,10217,40344,38249,40344,38399,38399,40343,40343,43058,7523, 33316,2444, - 39035,22785,8940, 21026,23731,7522, 2886, 19535,33980,8088, 19002,33315,2819, 21469,9067, 10012,30577,1310, 22785,14420,18251,8224, 27255,22784,34767,21025,8835, + 29004,4111, 33316,13404,2377, 16062,8498, 7948, 19472,40345,33980,38400,43058,40345,33980,7524, 25628,12785,38553,18525,35714,43058,22011,30716,20430,36901,3042, + 43058,31795,13367,40345,29889,27543,38641,34767,40344,40344,35714,9309, 11813,38400,38399,10217,40344,38249,40344,38399,38399,40343,40343,43058,7523, 33316,2444, + 39035,22785,8940, 21026,23731,7522, 2886, 19535,33980,8088, 19002,33315,2819, 21469,9067, 10012,30577,1310, 22785,14420,18251,8224, 27255,22784,34767,21025,8835, 37842,32621,43057,19762,40343,43057,5546, 16914,43057,33979,35714,43057,26083,25927,40343,43056,33979,32620,38014,373, 36901,22783,37598,12206,6983, 22782,35713, - 15315,19534,36745,36901,24322,34767,43056,11576,18250,6625, 43056,32619,40342,43056,14419,1763, 29003,36901,34263,23730,7204, 38399,11248,15268,43055,38398,8594, - 38398,7722, 5316, 40342,14541,36900,43055,26146,33979,33704,16099,37385,10724,33886,38398,32618,36900,23729,38986,12839,2512, 24442,10056,24877,502, 8124, 2794, + 15315,19534,36745,36901,24322,34767,43056,11576,18250,6625, 43056,32619,40342,43056,14419,1763, 29003,36901,34263,23730,7204, 38399,11248,15268,43055,38398,8594, + 38398,7722, 5316, 40342,14541,36900,43055,26146,33979,33704,16099,37385,10724,33886,38398,32618,36900,23729,38986,12839,2512, 24442,10056,24877,502, 8124, 2794, 25022,8352, 10283,17252,36145,31548,37002,1660, 13896,38427,37967,8143, 7721, 107, 6860, 14351,5186, 37622,15319,7413, 8497, 6896, 10960,36350,462, 14511,15267, - 1270, 7836, 35668,8087, 16362,467, 1052, 43055,975, 35713,34767,16361,40342,21993,9655, 13403,1050, 6741, 8354, 10990,33837,1205, 38398,5738, 6291, 2786, 909, + 1270, 7836, 35668,8087, 16362,467, 1052, 43055,975, 35713,34767,16361,40342,21993,9655, 13403,1050, 6741, 8354, 10990,33837,1205, 38398,5738, 6291, 2786, 909, 27014,40342,29745,19613,9471, 40341,10723,35960,11848,19533,7059, 43055,21950,1815, 40341,11806,11847,1307, 12180,6229, 40341,40341,2321, 43054,18249,40340,36900, 43054,34766,35237,3398, 8639, 19532,30406,38397,33475,35713,29002,38405,43054,19531,11537,43054,33738,23728,30715,30714,40340,29001,40340,36900,21024,43053,34766, - 8223, 43053,15604,22687,22859,38397,43053,38397,31015,40340,32617,33315,40339,9585, 38397,40339,30713,32616,19055,19104,14979,38396,29000,11545,40339,16360,2055, + 8223, 43053,15604,22687,22859,38397,43053,38397,31015,40340,32617,33315,40339,9585, 38397,40339,30713,32616,19055,19104,14979,38396,29000,11545,40339,16360,2055, 23920,33723,36899,34954,14201,19761,33979,38396,21346,23727,36899,38396,43053,37608,6076, 39026,9470, 17937,40339,13578,37632,11453,12545,21023,43052,43052,38396, 23726,38395,5682, 17235,21022,11536,18248,15603,40338,14540,38840,33133,30712,10449,36899,27082,18967,34851,37437,25768,40338,43052,36899,33100,38842,35713,28999, 35712,40338,43052,10152,23725,40338,43051,38395,16913,34451,33946,43051,35166,40337,34766,4360, 40337,40337,38395,26065,28998,43051,40337,43051,28997,43050,43050, @@ -15540,12 +15535,12 @@ static const unsigned short Ranks[197839] = 27432,33978,40333,33978,35711,43044,16912,14500,21019,3648, 38392,33314,43044,32704,9075, 547, 22779,40333,11027,27431,14200,369, 33049,12054,36897,11575,27430, 13577,5393, 8989, 40333,14890,43044,28993,33977,5636, 16105,43044,160, 10394,2937, 5790, 2042, 11565,29645,8219, 1051, 16873,20944,10282,38496,34931,1643, 38392, 36896,36896,36896,19515,43043,1630, 30708,38392,30707,14978,40333,3208, 35711,34764,36896,38392,34764,27429,7965, 19103,32612,23724,36895,11176,36895,30706,23723, - 29645,26080,7899, 33619,40332,43043,9135, 35474,43043,38359,38391,9584, 36895,11574,43043,3023, 1795, 30489,15601,29117,3497, 16046,4058, 30705,22778,35711,4710, + 29645,26080,7899, 33619,40332,43043,9135, 35474,43043,38359,38391,9584, 36895,11574,43043,3023, 1795, 30489,15601,29117,3497, 16046,4058, 30705,22778,35711,4710, 38391,35351,10978,34764,6368, 4127, 14976,18650,34790,35711,17936,40332,17375,1331, 40332,43042,33977,43042,40332,40331,28992,38427,28991,38391,17935,43042,22777, 23722,28990,19102,36895,3426, 36454,13894,38685,20369,8733, 13155,11380,19796,31976,27428,38391,40331,7774, 24876,22205,43042,33977,28989,34117,14199,38118,40331, 43041,40331,5495, 8308, 24478,40330,35243,11175,38494,2296, 38390,35710,6552, 1030, 338, 19101,28988,38390,16911,1688, 6847, 43041,10281,34895,12784,38325,33977, 26079,43041,1480, 19530,15600,43041,754, 17481,36355,40330,7045, 8958, 14539,30704,36894,38651,2454, 38798,15963,8426, 2363, 12544,22776,34030,43040,1865, 13285, - 380, 22407,38390,36894,35710,38390,38389,16061,14538,27427,35710,43040,35710,36765,33977,8279, 34477,30117,24875,38389,38389,13163,40330,103, 34323,28449,3260, + 380, 22407,38390,36894,35710,38390,38389,16061,14538,27427,35710,43040,35710,36765,33977,8279, 34477,30117,24875,38389,38389,13163,40330,103, 34323,28449,3260, 26869,16760,27610,38389,26522,30155,1904, 34414,9092, 21364,24820,10730,3951, 33313,8593, 43040,36894,34764,10451,43040,38388,43039,24874,8351, 26078,35253,15266, 14834,38263,36926,5244, 10674,34767,39043,27408,23683,13576,31587,13893,27426,38404,18523,43039,31648,32979,36284,43039,40330,33313,36894,14198,39387,14823,33516, 43039,43038,23839,34763,33089,36893,9833, 43038,1847, 25162,27716,20439,6460, 43038,43038,17374,38388,38388,36648,40329,34763,10594,28097,36893,43037,33970,17934, @@ -15553,7 +15548,7 @@ static const unsigned short Ranks[197839] = 20428,11263,29247,40329,38388,33803,22775,28722,2117, 40329,36892,9145, 21018,43037,8053, 10151,5601, 8165, 23375,28713,33313,7283, 19759,43036,26076,17250,34763, 15599,7679, 22368,33976,43036,40328,18247,8496, 17249,35709,535, 31185,43036,40328,22629,10717,11856,20427,35544,35437,738, 24794,31227,40328,18522,18521,17373, 2355, 18246,38387,16482,26329,23721,38387,24873,33922,15777,32970,6229, 8774, 28669,12635,40328,30067,21017,21948,38559,32768,23769,10280,22774,43036,26075,20350, - 7225, 10541,1074, 8939, 2586, 26074,34505,7521, 11370,16481,13041,305, 32817,8802, 2488, 17296,20426,9532, 28987,6672, 24669,22773,36062,19233,25401,6612, 8238, + 7225, 10541,1074, 8939, 2586, 26074,34505,7521, 11370,16481,13041,305, 32817,8802, 2488, 17296,20426,9532, 28987,6672, 24669,22773,36062,19233,25401,6612, 8238, 1408, 32611,17879,29019,3997, 8495, 14418,9060, 15163,29092,9583, 33976,30703,38387,34669,40327,1083, 33313,36892,40327,3346, 16670,43035,32610,39280,18520,16669, 25919,35709,40327,33080,36892,36484,40327,43035,6176, 34859,20136,16388,32659,5828, 18519,7044, 32609,36731,37688,36891,43035,32818,35752,25692,34223,17867,35297, 35341,40326,43035,31966,36891,10305,18753,39378,19529,34786,37586,43034,40326,14339,38387,35196,30702,21720,35709,30444,17237,27979,34762,17248,2366, 39337,43034, @@ -15575,18 +15570,18 @@ static const unsigned short Ranks[197839] = 19755,40320,5592, 34836,21014,34759,43027,38382,19097,22771,7773, 43027,23349,33311,24870,40320,9582, 4192, 37287,33884,33310,43027,40320,39409,38817,16307,38382, 35705,2013, 33638,14157,1642, 10844,33724,3483, 3441, 15597,22263,37185,39103,16355,40320,40319,38382,36374,34115,38382,15624,5949, 14353,37118,32601,37411,18243, 14977,36888,35705,29659,20423,38381,38381,35056,36864,39150,40319,36706,12043,30515,2982, 30145,22770,34759,12052,36581,43026,22290,2870, 27992,28643,35705,35916, - 20422,43026,43026,17116,810, 14515,43026,40319,7076, 8822, 43025,1415, 38942,36888,28983,5907, 40319,38381,27424,6075, 20421,6459, 33973,13802,43025,35704,2625, + 20422,43026,43026,17116,810, 14515,43026,40319,7076, 8822, 43025,1415, 38942,36888,28983,5907, 40319,38381,27424,6075, 20421,6459, 33973,13802,43025,35704,2625, 7618, 10511,23719,32600,5545, 19522,40318,38381,25, 35704,28982,40318,39099,29908,34697,25363,17932,38380,11260,4126, 35845,35704,43025,3806, 40318,38380,33973, 25078,5120, 4434, 19096,36334,34758,10450,38380,36887,33973,9191, 33973,35848,6529, 40318,8155, 36887,33776,14690,43025,28981,32848,9712, 37521,32620,13891,33847, 43024,36666,35047,40317,1306, 7947, 38353,691, 14889,17372,21013,11705,35907,11319,28052,35148,40317,15263,43024,40317,33310,36887,2169, 35704,27423,31749,19095, 40317,34758,15262,38380,38379,27422,36119,37355,37219,26296,43024,43024,28980,40316,43023,30697,40316,40316,43023,43023,40316,40315,32599,35740,26070,35703,36887, 28979,43023,36886,6293, 40315,21468,11259,40315,12051,38379,7345, 14888,16445,34758,14537,7512, 35520,25659,9289, 33288,38379,5073, 8262, 34758,33310,20292,16059, 1384, 17818,5428, 8261, 43022,11810,6773, 34757,9861, 35703,21145,36886,43022,37674,6578, 15635,19094,32598,1325, 38379,38378,21945,38378,34757,21144,38378,43022, - 1324, 5395, 17828,35703,6710, 33310,40315,37318,26069,34789,36886,23718,33972,2885, 28978,34757,36886,19754,43022,33972,40314,40314,2768, 19093,40314,8956, 3696, + 1324, 5395, 17828,35703,6710, 33310,40315,37318,26069,34789,36886,23718,33972,2885, 28978,34757,36886,19754,43022,33972,40314,40314,2768, 19093,40314,8956, 3696, 11533,13890,35703,43021,43021,34506,25298,36885,27421,10449,38220,38196,24308,36885,16354,27420,5359, 32911,11809,38378,32597,35702,32596,43021,6916, 13297,38377, 18242,13401,16480,5289, 30658,43021,16479,7946, 2067, 5072, 32560,10736,31195,11560,6830, 16269,31677,11258,14976,32595,33972,798, 15634,33968,26068,40314,35702, 998, 28977,18369,31985,9306, 7658, 33309,10167,6915, 3244, 9727, 23717,33972,33737,11532,3582, 5827, 6152, 25884,37760,1531, 23020,28392,13075,12426,34300,30696, - 32594,39403,14691,35702,40313,13296,12947,33531,19453,43020,38377,30695,1036, 34757,30694,36885,28976,17371,43020,33971,33731,495, 5119, 10055,3130, 10510,9288, + 32594,39403,14691,35702,40313,13296,12947,33531,19453,43020,38377,30695,1036, 34757,30694,36885,28976,17371,43020,33971,33731,495, 5119, 10055,3130, 10510,9288, 7058, 19521,31937,5966, 4365, 40313,34756,26067,12541,9652, 19520,19348,16963,30693,3858, 12946,43020,1182, 36389,11257,17243,2689, 16909,14417,43020,30692,12050, 26066,32593,43019,7678, 17931,4503, 7616, 23738,36461,40313,32926,33962,33971,36635,14395,43019,10304,10380,16559,36598,10719,33927,13411,19654,33675,27059,12049, 35692,21094,26065,39380,28113,34122,6227, 35928,11282,34756,38377,32855,12782,40313,12264,27419,35702,16123,35518,39262,35701,12829,14416,37304,32946,29933,21051, @@ -15594,7 +15589,7 @@ static const unsigned short Ranks[197839] = 23995,19519,4342, 43019,18517,34756,35701,38376,43018,3297, 34756,40312,8070, 38376,14910,7224, 31863,33714,19753,40311,38972,35701,30140,13889,267, 36969,36884, 43018,19518,36884,13709,36431,3444, 27219,32751,31528,650, 9532, 342, 39080,14536,9610, 28478,26064,26063,1498, 10599,38169,38376,9641, 6772, 30954,11195,31603, 18241,7072, 2186, 34755,43018,38376,35871,15261,9108, 33901,40311,20672,21463,3451, 34755,28179,20813,22729,2203, 38717,21012,33970,19517,22769,25, 31040,40311, - 34755,13575,20420,9190, 37756,43018,30611,30691,35701,35700,32592,10149,43017,7591, 26354,20419,43017,4128, 40311,37409,9450, 3580, 43017,36975,34755,4583, 3221, + 34755,13575,20420,9190, 37756,43018,30611,30691,35701,35700,32592,10149,43017,7591, 26354,20419,43017,4128, 40311,37409,9450, 3580, 43017,36975,34755,4583, 3221, 16910,34754,7203, 38375,6292, 865, 9860, 33309,40310,28975,11808,26062,38375,43017,30690,2994, 14415,3296, 6125, 19923,33970,1623, 7917, 25226,4848, 4433, 22977, 25214,21011,5875, 15957,9449, 22201,8637, 5553, 1652, 6964, 43016,38305,15596,33970,3898, 30421,43016,24869,13888,5140, 8494, 7314, 34502,21010,24095,39200,11572, 28974,2185, 8493, 26061,35570,20418,34754,33387,33309,35700,43016,33312,35886,43016,40310,6469, 15638,32813,15870,38980,35392,43015,36884,20082,33270,17242,35700, @@ -15605,57 +15600,57 @@ static const unsigned short Ranks[197839] = 2509, 22276,38375,38938,33308,3018, 17930,40308,34351,40308,8154, 40308,40307,37685,36069,35699,8996, 40307,38374,10303,32676,4469, 40307,98, 11656,39023,38616, 3395, 38374,21143,19751,11570,990, 30514,7024, 4498, 40307,27417,1362, 35325,38374,35190,981, 40306,5915, 36212,34298,21943,27457,8153, 43013,30687,36883,22766, 12206,33308,38374,34941,38373,15193,43013,6963, 18515,24867,84, 32503,27809,3917, 26356,26380,22873,25549,22969,7223, 38373,33928,9580, 24814,32955,7720, 33308, - 43013,38373,40306,1962, 11045,28973,17929,9797, 43012,13615,33307,34753,24207,10148,43012,3197, 40306,26427,16476,30796,15260,4497, 27257,6181, 361, 1978, 1895, - 38764,12781,34753,33467,43012,6962, 43012,43011,12047,40306,33307,43011,43011,19750,43011,10828,33307,28972,6385, 7852, 31333,37716,38496,34753,43010,2191, 8260, + 43013,38373,40306,1962, 11045,28973,17929,9797, 43012,13615,33307,34753,24207,10148,43012,3197, 40306,26427,16476,30796,15260,4497, 27257,6181, 361, 1978, 1895, + 38764,12781,34753,33467,43012,6962, 43012,43011,12047,40306,33307,43011,43011,19750,43011,10828,33307,28972,6385, 7852, 31333,37716,38496,34753,43010,2191, 8260, 10140,24949,346, 6976, 27416,12841,32590,21942,2639, 17241,38811,38729,19092,40305,35699,1032, 13972,10054,36883,14108,37012,32079,34050,11530,43010,16254,23695, 36883,2088, 2065, 43010,43010,24241,43009,43009,43009,38373,28180,31942,21941,15708,33969,40305,40305,38372,40305,37337,36882,17928,24965,21940,5781, 34753,34752, - 14195,38372,480, 30686,346, 32222,34871,38372,31250,6121, 16184,4371, 26387,18240,6777, 26038,35322,35801,35699,39151,29880,32843,10392,7833, 3593, 1725, 6397, + 14195,38372,480, 30686,346, 32222,34871,38372,31250,6121, 16184,4371, 26387,18240,6777, 26038,35322,35801,35699,39151,29880,32843,10392,7833, 3593, 1725, 6397, 29225,8149, 43009,23714,38372,18036,35362,36882,34752,3940, 8492, 13887,10082,38549,18239,5802, 5385, 36617,25861,19919,15559,19745,40304,3319, 10989,16693,40304, 8349, 35296,40304,471, 33997,16353,1688, 34184,9145, 15839,4719, 2767, 43008,2022, 33440,26059,10988,21009,34752,9469, 12540,15984,30601,12945,21008,34625,43008, 38371,395, 38371,43008,19061,23528,5290, 43008,26058,22001,40304,1314, 14414,15595,12539,21007,26448,43007,35698,38371,38371,3514, 13620,1762, 24354,2983, 38370, - 40303,19091,40303,34041,43007,38370,27415,40303,17927,33307,38370,15594,40303,38370,13864,2857, 827, 33969,11368,34752,466, 20397,37170,8126, 12424,36882,6468, + 40303,19091,40303,34041,43007,38370,27415,40303,17927,33307,38370,15594,40303,38370,13864,2857, 827, 33969,11368,34752,466, 20397,37170,8126, 12424,36882,6468, 7057, 11843,4767, 802, 24926,9072, 21006,12538,19516,5703, 18238,3770, 22173,30426,12960,12302,2630, 43007,33968,22177,25289,40302,33693,36630,34751,43007,33306, 35920,35731,23713,24866,38369,30685,43006,43006,12025,807, 24022,8379, 33306,33968,11842,10630,4495, 14413,21142,1204, 12270,40302,30684,36033,34839,1659, 22584, - 8221, 33480,38716,36882,1549, 11807,17926,3005, 30683,35227,43006,5504, 865, 12819,36881,16908,28971,131, 16038,3713, 21957,25582,29361,19749,34751,19748,3974, + 8221, 33480,38716,36882,1549, 11807,17926,3005, 30683,35227,43006,5504, 865, 12819,36881,16908,28971,131, 16038,3713, 21957,25582,29361,19749,34751,19748,3974, 34751,40302,40302,31083,33626,43006,43005,21274,2145, 43005,14887,36881,34751,8049, 27414,5561, 16907,28970,1348, 38369,33968,7772, 40301,12535,24931,27999,17925, 2350, 8673, 24349,34601,43005,9189, 38369,40301,43005,38369,43004,8739, 38368,5169, 17780,5455, 35698,39144,34750,479, 15253,15259,33968,33306,26057,38368,33306, 33967,12269,26542,15604,5964, 11367,12534,207, 33305,27413,36881,9859, 9188, 30682,23429,34746,43004,40301,40301,14194,40300,33305,5596, 1146, 10764,21005,40300, 222, 43004,28641,24562,43004,38368,43003,25507,32589,21004,24865,14844,33274,34750,36881,22765,24061,29060,43003,33967,43003,8086, 5754, 17370,43003,33967,43002, 21939,33333,36174,34396,32790,34750,33967,28969,32813,40300,21938,8938, 38371,43002,34750,43002,37425,26157,35636,34749,14027,15593,34110,11309,26404,23013,25034, - 31691,8891, 19515,43002,16056,233, 16352,153, 8773, 554, 14412,36880,446, 38368,25939,1692, 2416, 1944, 6374, 1145, 43001,210, 637, 19989,31579,15859,2142, + 31691,8891, 19515,43002,16056,233, 16352,153, 8773, 554, 14412,36880,446, 38368,25939,1692, 2416, 1944, 6374, 1145, 43001,210, 637, 19989,31579,15859,2142, 28387,4909, 32784,31156,21108,24888,11952,15700,28167,22387,12413,32038,2149, 11550,8537, 27080,24549,26348,20801,27970,6297, 12868,26071,14052,11980,26784,19801, 21003,34627,36880,36079,35093,33037,23392,6975, 13295,43001,9858, 43001,36880,38367,34749,36308,23775,5336, 39147,34749,36751,9187, 17250,19342,43001,22764,40300, 40299,39300,31082,33383,14839,16906,43000,33940,4595, 8085, 3526, 3242, 33305,21937,24864,40299,6846, 32588,35698,7344, 10799,35698,27178,38367,2402, 21257,33305, 4662, 43000,33304,2130, 35011,24945,9287, 38291,28272,12314,36880,39329,43000,2465, 33457,34967,19514,12984,16055,13886,32444,43000,42999,40299,19513,38367,33966, 28968,6302, 9695, 17924,33966,33966,243, 11069,16528,27680,36879,15632,38367,38366,40299,34243,18129,3973, 19289,5055, 16307,36661,27099,6577, 2959, 13799,29386, - 140, 12418,37373,10212,4643, 22597,40298,38366,4025, 18514,26056,38366,6290, 32587,962, 34360,21002,38366,9849, 17751,19512,1240, 40298,33304,2887, 35697,2690, + 140, 12418,37373,10212,4643, 22597,40298,38366,4025, 18514,26056,38366,6290, 32587,962, 34360,21002,38366,9849, 17751,19512,1240, 40298,33304,2887, 35697,2690, 33304,19747,40298,35697,26055,23285,13453,11170,16351,40298,6513, 42999,38365,4906, 20417,546, 34749,40297,22019,632, 29857,32586,42999,2189, 33304,19746,32999, 16940,35228,942, 2401, 38365,11533,8048, 40297,42999,747, 19702,4759, 22899,13574,38365,36879,2196, 38365,8220, 10504,40297,9065, 16833,40297,13526,22106,17366, 42998,21046,2693, 23096,32585,2708, 21224,17240,5883, 23342,8175, 10509,281, 23742,38364,35463,1581, 15592,18056,38444,31013,36879,26054,12944,38736,27412,42998, 28967,18268,12533,42998,16470,39196,30681,34748,10302,40296,42998,42997,4208, 38858,3043, 35697,4004, 10147,10977,32584,1123, 22763,34748,9106, 34748,9569, 22914, 35673,24852,21141,39308,34469,36271,36476,11366,26920,31855,18100,34479,20572,10798,23816,37518,33966,34748,32301,9581, 42997,18513,10987,36879,42997,40296,33965, - 22762,42997,5243, 7124, 19511,2267, 16905,35697,9726, 34747,5242, 37831,35696,28966,34747,497, 971, 5933, 33471,21240,4461, 40296,28203,14325,19044,30680,4125, - 42996,38, 11093,28100,1646, 15224,13253,23301,17197,28715,32889,17528,29649,19605,15172,32912,32281,31930,7056, 17923,27692,38089,23558,38364,42996,17239,2523, - 38364,42996,1372, 1789, 27411,39365,6671, 33303,35696,12780,34747,38364,6592, 8491, 33965,3005, 36081,331, 35696,26106,6973, 9009, 34589,38643,15464,36234,9945, + 22762,42997,5243, 7124, 19511,2267, 16905,35697,9726, 34747,5242, 37831,35696,28966,34747,497, 971, 5933, 33471,21240,4461, 40296,28203,14325,19044,30680,4125, + 42996,38, 11093,28100,1646, 15224,13253,23301,17197,28715,32889,17528,29649,19605,15172,32912,32281,31930,7056, 17923,27692,38089,23558,38364,42996,17239,2523, + 38364,42996,1372, 1789, 27411,39365,6671, 33303,35696,12780,34747,38364,6592, 8491, 33965,3005, 36081,331, 35696,26106,6973, 9009, 34589,38643,15464,36234,9945, 13752,33553,34693,38126,35627,20702,28465,28196,26095,24435,33994,1214, 17709,2060, 24863,8219, 32972,15631,35892,17922,42996,42995,10976,27410,11174,8152, 42995, 2823, 18237,23734,25911,21936,4496, 35696,9857, 40296,42995,15258,40295,27409,4065, 31717,44, 19015,33965,34747,33689,36878,34746,36878,37402,38363,1961, 31564, 20907,13294,23712,35235,174, 16672,17200,40295,14974,19745,28965,9144, 23977,21001,24862,13038,33303,6497, 19510,17811,12079,32418,36524,33965,14193,8720, 33483, - 9286, 3873, 42995,42994,35695,12268,38363,42994,42994,34543,14973,35695,9064, 524, 42994,4236, 17921,30679,20416,38363,38363,14984,40295,19509,12753,36090,5329, + 9286, 3873, 42995,42994,35695,12268,38363,42994,42994,34543,14973,35695,9064, 524, 42994,4236, 17921,30679,20416,38363,38363,14984,40295,19509,12753,36090,5329, 13011,19090,309, 726, 1153, 4661, 19744,34746,42993,9063, 4288, 16475,33241,32858,425, 36971,19743,14, 14432,8379, 17621,109, 18342,29167,42993,11365,33964, - 18512,35307,40295,5018, 27975,12959,7423, 37639,15257,26053,8627, 32583,18236,70, 2659, 11162,21704,29495,19561,21466,36395,33042,19089,25975,11561,3846, 7898, + 18512,35307,40295,5018, 27975,12959,7423, 37639,15257,26053,8627, 32583,18236,70, 2659, 11162,21704,29495,19561,21466,36395,33042,19089,25975,11561,3846, 7898, 20415,38362,2586, 27220,39174,11364,11363,19088,18380,30050,34746,9468, 9305, 27128,40294,27910,18511,33303,42993,169, 38362,9448, 34746,37059,28964,22761,42993, 3017, 38362,38362,38361,5503, 4478, 42992,42992,42992,17369,19742,36878,36878,38361,11569,10005,34745,14192,11568,40294,36352,24861,24860,42992,35695,38361,13863, 21140,15584,5684, 40294,38361,40294,38360,10646,39397,24859,861, 11173,30678,38360,512, 3390, 9143, 34687,26102,13573,4087, 28963,27408,14191,35695,40293,26052, - 40293,20414,34225,30677,40293,33303,10508,38360,32582,6354, 5591, 7511, 23711,6771, 19741,19087,27407,38360,33302,37279,14534,5635, 38359,35694,3694, 12779,4980, + 40293,20414,34225,30677,40293,33303,10508,38360,32582,6354, 5591, 7511, 23711,6771, 19741,19087,27407,38360,33302,37279,14534,5635, 38359,35694,3694, 12779,4980, 40293,7590, 7343, 4260, 38359,22760,42991,9856, 42991,7123, 27017,33843,24541,36006,37704,33695,25926,20291,32068,35694,39374,42991,14972,1767, 35694,34745,13376, 28962,5454, 38359,3862, 30653,8108, 16720,31712,7733, 36972,17119,210, 21000,12275,32335,13017,30676,42991,38359,12532,38358,6914, 7862, 19086,38358,42990,14886, 3531, 15377,32581,42990,3264, 8559, 13389,24, 36344,42990,35697,6041, 18013,37423,40292,29644,42990,36877,42989,13640,14190,30675,32580,42989,40292,34399,13409, 14533,32803,20413,33964,36877,42989,33302,22759,27406,38358,28961,33302,35694,42989,40292,11841,36877,42988,38358,4618, 42988,32773,33125,40292,42988,38527,17117, - 30440,31826,20393,34860,36019,17345,37348,6845, 29238,16761,30145,33579,23715,38679,11978,24032,31262,32538,42988,38357,40291,2638, 40291,11172,20412,8726, 1302, + 30440,31826,20393,34860,36019,17345,37348,6845, 29238,16761,30145,33579,23715,38679,11978,24032,31262,32538,42988,38357,40291,2638, 40291,11172,20412,8726, 1302, 36877,34745,30771,9186, 21935,34931,16054,11567,26051,42987,24858,21993,15955,33097,33064,20999,545, 38357,38357,3326, 31059,36780,38894,836, 40291,34745,12046, - 13293,38357,32459,36027,33435,42987,3295, 38356,31391,42987,11806,33302,40291,36876,8151, 35693,38545,38356,38356,3104, 42987,35693,40290,10146,4067, 10507,7589, + 13293,38357,32459,36027,33435,42987,3295, 38356,31391,42987,11806,33302,40291,36876,8151, 35693,38545,38356,38356,3104, 42987,35693,40290,10146,4067, 10507,7589, 11256,5998, 39354,5963, 33964,13885,8084, 8218, 40290,19508,18280,37456,33160,17368,10665,40290,12778,958, 14885,23808,5119, 19085,35693,1044, 28917,40290,42986, - 24857,38755,38356,33231,1095, 13653,37890,36876,9142, 34744,12045,905, 34170,42986,17641,15591,4999, 3325, 42986,10721,40289,38796,24537,312, 26828,38269,1148, + 24857,38755,38356,33231,1095, 13653,37890,36876,9142, 34744,12045,905, 34170,42986,17641,15591,4999, 3325, 42986,10721,40289,38796,24537,312, 26828,38269,1148, 4718, 22107,35235,9393, 13884,10262,1176, 15522,16934,631, 6974, 35556,1221, 35693,6394, 42986,36876,23710,10720,8501, 40289,38355,34667,39086,33430,2956, 34744, 42985,22758,3626, 9447, 23812,31892,34174,40289,35651,3225, 24690,42985,3139, 32044,38355,17238,16474,24847,33964,33963,12267,5358, 42985,6371, 8507, 33075,36482, 38355,38215,308, 38355,27549,40289,36876,42985,2097, 26050,5003, 38354,29338,34823,42984,40288,38354,38354,38354,35692,42984,28960,15256,36875,33963,11805,36875, @@ -15665,13 +15660,13 @@ static const unsigned short Ranks[197839] = 32043,42982,42982,26280,42981,12508,30674,38353,40287,5921, 14030,37276,26046,27450,40287,35692,35082,3881, 30773,26020,6913, 28959,33050,32578,13, 2652, 27516, 42981,10974,24951,40287,18238,36873,15255,36519,3460, 223, 12266,30673,2289, 19506,19083,38352,35692,20637,32781,20891,39027,28073,32577,18510,22757,28958,42981, 35691,33962,22756,36961,21933,11840,23709,38352,42981,7510, 9410, 3440, 230, 40287,18509,27404,33301,36886,18508,40286,36873,34743,4407, 22512,10252,20997,23109, - 5258, 33769,27281,19507,31167,445, 13758,3625, 2970, 19535,29624,34743,34005,16904,40286,36873,2538, 38352,32830,1592, 32470,15269,8793, 32576,8475, 34066,5502, - 18122,23245,812, 8555, 2764, 38973,16052,40286,12943,42980,150, 7771, 20996,16872,13565,2207, 8288, 36104,36754,33962,36646,39010,8767, 29122,1747, 38352,7342, + 5258, 33769,27281,19507,31167,445, 13758,3625, 2970, 19535,29624,34743,34005,16904,40286,36873,2538, 38352,32830,1592, 32470,15269,8793, 32576,8475, 34066,5502, + 18122,23245,812, 8555, 2764, 38973,16052,40286,12943,42980,150, 7771, 20996,16872,13565,2207, 8288, 36104,36754,33962,36646,39010,8767, 29122,1747, 38352,7342, 4235, 21932,5734, 40286,7028, 1728, 33777,38351,36155,28957,13428,40285,22755,1727, 31843,2823, 33184,38957,33670,28956,6844, 19739,15148,19058,36270,32775,42980, - 35691,38351,15590,27403,11362,38351,34050,1146, 15254,733, 30303,8875, 27330,7121, 40285,35691,34743,17008,18507,14971,34743,20410,40285,95, 35427,17367,4468, - 38351,12531,32764,18790,16051,24854,1200, 36213,33962,13883,21138,6912, 39356,34742,13483,27402,28955,18506,18505,30672,42980,40285,11361,7945, 272, 33962,5241, + 35691,38351,15590,27403,11362,38351,34050,1146, 15254,733, 30303,8875, 27330,7121, 40285,35691,34743,17008,18507,14971,34743,20410,40285,95, 35427,17367,4468, + 38351,12531,32764,18790,16051,24854,1200, 36213,33962,13883,21138,6912, 39356,34742,13483,27402,28955,18506,18505,30672,42980,40285,11361,7945, 272, 33962,5241, 36873,35691,34742,38475,35161,791, 42980,14884,19505,12044,17366,8636, 38528,15630,35690,36962,14883,1476, 33736,10053,883, 42979,9061, 34383,34742,40284,19738, - 17349,35931,4897, 6766, 7705, 33724,36359,37312,9285, 42979,138, 16085,26868,33301,34742,30671,36872,32575,14188,19737,13511,36887,35690,17920,14882,4431, 4624, + 17349,35931,4897, 6766, 7705, 33724,36359,37312,9285, 42979,138, 16085,26868,33301,34742,30671,36872,32575,14188,19737,13511,36887,35690,17920,14882,4431, 4624, 4315, 36872,34285,40284,12942,42979,34741,30670,39282,26655,5198, 16050,14881,28954,17919,38646,7812, 42979,13299,8635, 39350,5017, 24485,38259,18440,5503, 38456, 13831,30291,12069,8444, 32827,21746,36548,22854,35978,19667,12, 571, 407, 19504,63, 11058,17445,26045,9185, 30669,260, 28952,1913, 3609, 14970,34108,12941, 35265,14701,37669,33300,15589,36107,40284,1263, 11171,7303, 17335,17237,12940,18948,10506,33834,8634, 1392, 15437,18581,34078,40284,33415,19245,11898,24732,16471, @@ -15685,7 +15680,7 @@ static const unsigned short Ranks[197839] = 4617, 2854, 5006, 35712,9252, 42977,36871,1493, 33961,35141,12938,34012,12530,21136,814, 20700,12641,25803,25796,19499,3252, 26305,26043,8955, 18232,42976,37330, 38349,33148,31942,33299,29344,10248,40282,20408,36871,19082,42976,36871,34741,14879,36870,676, 36870,38349,28951,34741,42976,2555, 17653,34585,12208,11512,42976, 10952,28939,37278,40282,32574,4400, 1528, 32573,16470,16049,16469,27400,35689,36572,10301,38349,33961,5733, 33961,42975,19735,36870,3007, 23847,22868,17234,19498, - 15252,9651, 19497,3142, 32572,35459,15251,34753,32575,13269,22752,42975,8692, 4536, 6109, 26527,181, 32229,7519, 11360,20989,7588, 35689,42975,42975,38348,9650, + 15252,9651, 19497,3142, 32572,35459,15251,34753,32575,13269,22752,42975,8692, 4536, 6109, 26527,181, 32229,7519, 11360,20989,7588, 35689,42975,42975,38348,9650, 34740,42974,38348,42974,38348,5874, 32571,17918,2222, 24362,20407,4086, 23708,38178,33335,2992, 38348,19496,33299,20406,35688,16235,15629,40282,25374,33606,42974, 11529,9725, 12043,28888,34364,40281,25794,37427,21740,18987,31769,36870,38347,1323, 16347,30668,42974,40281,15628,40281,33121,1643, 2518, 2401, 11839,35688,42973, 5645, 31521,38702,20988,33961,33960,26820,3835, 32570,7422, 33015,33038,2629, 38347,10796,38347,29216,13572,38565,30667,33960,19081,20640,40281,34605,40280,40280, @@ -15694,8 +15689,8 @@ static const unsigned short Ranks[197839] = 42972,40280,26041,13862,32568,35687,28949,42971,38346,21930,35687,38346,24849,38057,34740,8590, 30664,956, 9847, 9467, 14410,19495,20986,19494,16346,36869,27398, 21929,40279,38345,16334,30663,31625,33960,40279,27397,40279,10973,34740,2028, 40279,36869,20405,14259,12265,6607, 37999,35687,33960,15627,33959,10003,36868,35260, 11565,12264,36868,25943,27396,237, 4282, 24910,32837,33298,22693,32567,16903,42971,28948,40278,14186,15626,23707,42971,40278,3738, 13291,38345,18231,33764,28947, - 10279,1503, 19493,7518, 35364,2592, 24848,35859,3103, 40278,32566,25963,26040,15250,21358,6074, 42971,21069,42970,21134,35687,13036,36868,4182, 21928,18262,3115, - 12777,10300,36868,38659,12263,38345,34740,42970,40278,22947,17232,34739,42970,11528,40277,38345,16902,33559,35686,30662,2537, 30661,26039,33959,17231,42970,5544, + 10279,1503, 19493,7518, 35364,2592, 24848,35859,3103, 40278,32566,25963,26040,15250,21358,6074, 42971,21069,42970,21134,35687,13036,36868,4182, 21928,18262,3115, + 12777,10300,36868,38659,12263,38345,34740,42970,40278,22947,17232,34739,42970,11528,40277,38345,16902,33559,35686,30662,2537, 30661,26039,33959,17231,42970,5544, 32565,21133,2922, 10795,9304, 36867,14877,11803,35686,19734,40277,30660,13400,42969,40277,38344,36867,28946,33298,16029,33298,30659,7832, 34739,34739,36248,36867, 32564,8217, 4003, 35686,21132,34739,7202, 24847,5158, 14185,22749,33959,2991, 21818,19080,35686,38344,42969,40277,42969,23706,38344,35685,3113, 30658,37859,40276, 7707, 35268,8216, 15587,40276,5847, 40276,7769, 34202,36867,16619,5197, 34738,21927,17365,36866,34738,34738,4771, 11331,42969,12776,42968,33959,36866,7140, 34738, @@ -15703,11 +15698,11 @@ static const unsigned short Ranks[197839] = 36499,42968,33528,38343,27226,5213, 24881,3292, 33958,36866,19079,19078,21130,22748,33958,23705,37681,165, 40275,35186,32563,23389,34737,28944,36865,12042,33020, 40275,40275,15, 8092, 561, 521, 7942, 34056,22747,26038,40274,36865,15249,42967,42967,36865,35685,36865,33958,8378, 32562,38343,891, 40274,40274,36864,23730, 35152,36864,36864,24846,36864,38342,8150, 22746,30800,35055,21926,22064,36268,36737,14518,33788,18854,37412,35698,13149,2644, 4568, 36863,27615,26089,33957,35685, - 33957,23082,30599,25369,6300, 18230,16102,6919, 9123, 30656,38342,188, 13399,19492,8214, 10051,38342,9724, 38342,16901,5823, 9649, 27395,37988,30158,27804,4088, + 33957,23082,30599,25369,6300, 18230,16102,6919, 9123, 30656,38342,188, 13399,19492,8214, 10051,38342,9724, 38342,16901,5823, 9649, 27395,37988,30158,27804,4088, 11692,35862,14184,1285, 42967,35648,8229, 38589,9418, 34111,1214, 42967,36644,35345,42966,750, 20472,36863,6338, 29236,20985,16468,21129,32561,36863,31138,10228, 35770,9466, 42966,6770, 18503,40274,6829, 30655,30654,7172, 83, 444, 25509,27388,5285, 606, 15179,5480, 22552,24787,10562,18952,13922,24167,18351,30762,17600, 16098,20177,7440, 9738, 4917, 15066,9823, 12511,2415, 11254,15586,3360, 10695,13875,11750,8703, 15886,32988,12700,10543,13914,12143,33297,17593,32515,5171, 18354, - 13997,13881,17363,4639, 40273,14532,11297,21974,2218, 20403,17793,1947, 6769, 18395,33957,42966,38341,38703,21102,42966,5873, 16900,42965,30653,2872, 35984,8215, + 13997,13881,17363,4639, 40273,14532,11297,21974,2218, 20403,17793,1947, 6769, 18395,33957,42966,38341,38703,21102,42966,5873, 16900,42965,30653,2872, 35984,8215, 19641,32560,4374, 28943,30652,38341,27394,24845,30651,28942,33957,35735,897, 40273,20984,27486,37078,38341,40273,36863,4903, 8258, 38341,13398,34989,40273,42965, 110, 25238,30959,11620,773, 4457, 12176,2091, 42965,42965,10719,696, 2275, 14966,20983,26628,20539,14409,260, 8687, 22897,31945,1553, 40272,35684,10145,32559, 40272,35684,26806,23302,34204,34423,33003,4574, 14876,26037,36862,33194,16467,13570,22927,1109, 30650,33297,37875,40272,35684,34216,29606,34903,38838,15625,33956, @@ -15723,19 +15718,19 @@ static const unsigned short Ranks[197839] = 3805, 4373, 33295,36859,34736,40267,20979,8725, 13861,18227,36858,40267,42958,2332, 5501, 10972,22744,30647,35682,13569,28940,18226,26026,38336,38336,3686, 15624, 16899,33954,38335,12529,19729,14530,27230,30211,24841,17463,428, 2101, 28939,5376, 10628,22743,15893,7120, 4467, 40267,46, 3676, 29499,20134,12604,28300,21937, 15070,16159,9283, 33295,24328,35682,42958,42957,40267,7422, 34736,13035,26036,4707, 42957,12774,13290,490, 35681,13879,551, 40266,576, 42957,11359,10791,27390, - 7233, 7676, 42957,30646,34731,13289,36858,23704,17916,26035,42956,27389,5845, 33953,39260,11253,17086,5788, 35879,35760,7421, 16584,19074,33590,33017,23703,6961, - 7768, 16047,42956,32552,38335,42956,35681,34736,42956,42955,19490,35681,16046,19772,35681,9722, 42955,35, 15126,33953,14239,34910,16447,36486,27617,42955,3510, + 7233, 7676, 42957,30646,34731,13289,36858,23704,17916,26035,42956,27389,5845, 33953,39260,11253,17086,5788, 35879,35760,7421, 16584,19074,33590,33017,23703,6961, + 7768, 16047,42956,32552,38335,42956,35681,34736,42956,42955,19490,35681,16046,19772,35681,9722, 42955,35, 15126,33953,14239,34910,16447,36486,27617,42955,3510, 12291,9381, 33055,10841,20469,17915,33953,19728,16536,33953,40266,24006,916, 12088,36673,4766, 16345,36619,14068,38335,35680,24423,38890,38335,126, 30662,18537, 31852,23367,20525,36858,1811, 28021,21128,33953,38334,26199,17896,17518,35447,27388,35680,6108, 4466, 38334,38334,28614,35675,36858,42955,33236,8443, 686, 33852, 4742, 26034,33087,20094,23181,36857,14393,21127,16045,10264,35850,35331,20402,32, 475, 14407,3676, 33952,3052, 37914,5280, 22940,6289, 11289,23696,17230,42954, 42954,42954,40266,40266,29686,33952,27162,10066,33952,8946, 15983,15962,16344,35917,5307, 19727,36857,16167,36857,42954,42953,22742,28938,23509,18225,576, 36857, - 36856,8588, 24840,23968,33087,26242,1184, 35155,36856,33294,40265,38334,23996,38333,40265,16216,35680,42953,12528,1203, 42953,36856,34735,26033,36188,3291, 175, + 36856,8588, 24840,23968,33087,26242,1184, 35155,36856,33294,40265,38334,23996,38333,40265,16216,35680,42953,12528,1203, 42953,36856,34735,26033,36188,3291, 175, 16297,27387,27386,3647, 28937,9465, 26711,40265,30645,17914,9721, 36856,37438,20978,35153,33218,1505, 40265,33952,34918,24091,38333,1766, 20595,22251,18224,36855, - 30644,38333,3504, 2317, 2003, 927, 8245, 9935, 9079, 34410,23343,20431,21465,11696,13798,35680,7509, 38333,35679,21126,42953,9580, 5590, 14113,40264,36855,7520, - 34735,38332,4934, 28, 15710,33294,40264,1548, 14965,17056,27385,8490, 19489,20977,37112,34576,30643,36855,42952,1108, 21681,6960, 36744,35052,36743,11361,2810, + 30644,38333,3504, 2317, 2003, 927, 8245, 9935, 9079, 34410,23343,20431,21465,11696,13798,35680,7509, 38333,35679,21126,42953,9580, 5590, 14113,40264,36855,7520, + 34735,38332,4934, 28, 15710,33294,40264,1548, 14965,17056,27385,8490, 19489,20977,37112,34576,30643,36855,42952,1108, 21681,6960, 36744,35052,36743,11361,2810, 4288, 32772,10278,3439, 7412, 16275,10136,36903,4623, 36855,6647, 42952,11523,34618,42952,42952,15247,15533,8083, 35496,31207,37650,40264,38332,3225, 34735,17361, - 42951,42951,32551,21921,40264,35679,38332,24839,38332,12773,5732, 240, 28936,14964,40263,36138,38331,2689, 27384,38331,40263,17913,3895, 600, 35097,34532,1580, - 42951,30642,21125,42951,42950,38331,11802,2349, 42950,8499, 23702,985, 37364,42950,35679,1627, 42950,26032,42949,656, 36854,40263,38331,660, 4660, 35338,7861, + 42951,42951,32551,21921,40264,35679,38332,24839,38332,12773,5732, 240, 28936,14964,40263,36138,38331,2689, 27384,38331,40263,17913,3895, 600, 35097,34532,1580, + 42951,30642,21125,42951,42950,38331,11802,2349, 42950,8499, 23702,985, 37364,42950,35679,1627, 42950,26032,42949,656, 36854,40263,38331,660, 4660, 35338,7861, 33294,34735,33951,3553, 18223,720, 40263,33951,1317, 7710, 37787,42949,26804,36385,40262,28935,11169,42949,42949,36854,21920,15623,13979,40262,39396,40262,33294, 2742, 6512, 24838,21124,13014,6667, 36854,3001, 38330,42948,19726,32550,26795,32637,35679,7201, 24837,40262,16044,13288,19488,35215,16379,28934,10627,40261,42948, 42948,21123,38330,42948,16465,13860,38330,42947,3943, 36736,35224,33951,33951,10626,24836,23504,28346,2295, 26362,38330,28933,39221,40261,40261,31203,36854,23665, @@ -15748,19 +15743,19 @@ static const unsigned short Ranks[197839] = 24074,18222,9647, 24912,34224,20064,10615,35031,36729,35818,39185,18221,19487,19778,35676,24752,17229,62, 14962,11766,42943,22741,27141,35112,9708, 33950,38326, 22740,42942,34909,21724,27378,40258,26908,30639,18498,6646, 33025,33293,35687,26030,15641,21453,42942,33293,33292,37737,11358,36643,22739,19723,42942,3522, 32548, 35167,32547,35910,36877,13371,37152,38325,3857, 6911, 16342,6572, 12536,36523,8849, 22907,42942,17452,19705,15918,32868,25131,38513,31307,11951,9524, 7380, 23556, - 28193,28484,21369,19954,5886, 27752,30646,11890,14278,11624,161, 26162,2354, 4835, 15176,3235, 33292,33292,8498, 35676,23699,38403,42941,40258,12527,42941,7859, - 5427, 19071,15302,28031,15584,17760,9629, 12160,33083,33425,23698,34893,20265,38325,16898,26029,35675,13568,15491,27377,19486,9846, 12772,38291,40258,42941,7717, - 26028,17911,28931,26027,35868,35675,4622, 38325,40257,997, 42941,34734,42940,30638,16897,42940,15246,30637,567, 15622,36852,8148, 38325,8394, 7943, 124, 3487, + 28193,28484,21369,19954,5886, 27752,30646,11890,14278,11624,161, 26162,2354, 4835, 15176,3235, 33292,33292,8498, 35676,23699,38403,42941,40258,12527,42941,7859, + 5427, 19071,15302,28031,15584,17760,9629, 12160,33083,33425,23698,34893,20265,38325,16898,26029,35675,13568,15491,27377,19486,9846, 12772,38291,40258,42941,7717, + 26028,17911,28931,26027,35868,35675,4622, 38325,40257,997, 42941,34734,42940,30638,16897,42940,15246,30637,567, 15622,36852,8148, 38325,8394, 7943, 124, 3487, 37608,38324,2533, 37326,33672,2226, 39053,40257,42940,1811, 31954,37031,793, 34719,9646, 21943,22492,3470, 12937,11782,36620,6290, 15545,39140,14406,920, 36852, 38324,38324,12535,28930,19722,17910,8834, 40257,3102, 33292,35182,42940,34733,21122,3433, 42939,38843,16896,36752,8737, 34065,17074,38238,4695, 36790,40257,33950, 25332,23651,16341,17228,38371,20787,30636,8497, 40256,38324,32546,33291,30635,12040,26064,33930,5913, 36851,18124,42939,7675, 35675,13287,2792, 36851,18497,40256, - 21919,15245,2087, 35675,19721,336, 24839,10971,40256,2982, 91, 14528,14637,40256,36851,35720,36724,4104, 562, 35674,640, 17359,38984,12039,18824,15372,3803, + 21919,15245,2087, 35675,19721,336, 24839,10971,40256,2982, 91, 14528,14637,40256,36851,35720,36724,4104, 562, 35674,640, 17359,38984,12039,18824,15372,3803, 23750,1010, 4283, 8933, 4158, 28929,5887, 4558, 4453, 19485,8071, 4007, 34980,892, 33950,34906,3050, 36851,33511,33302,9313, 24013,35674,6124, 25546,4465, 13396, 16340,29372,31632,16542,1282, 36850,42939,36919,623, 27295,29575,33727,3230, 14959,39375,38323,38323,7043, 34733,23697,33949,34733,23696,16043,11801,38323,42939, 27999,12047,36577,42938,23377,11527,11252,33455,16917,15129,36815,35819,37055,38200,14961,27549,13395,27463,34862,31979,33312,14942,12892,3110, 13876,40255,13394, 11582,16339,4996, 16338,37650,42938,35674,16464,17823,36850,2629, 782, 34875,4244, 37026,20975,692, 42938,4526, 42938,42937,28928,40255,24834,6843, 27376,38323, - 21918,16895,258, 40255,38322,35019,2663, 2909, 5282, 14182,1219, 2487, 22738,23695,9855, 36850,32545,17947,17227,36850,33949,42937,36849,2486, 3082, 33291,9719, - 7767, 19070,5085, 26026,34733,8890, 40255,18496,40254,21917,15244,40254,38322,35964,42937,34732,18495,42937,32, 42936,42936,38322,36849,36849,40254,3819, 742, + 21918,16895,258, 40255,38322,35019,2663, 2909, 5282, 14182,1219, 2487, 22738,23695,9855, 36850,32545,17947,17227,36850,33949,42937,36849,2486, 3082, 33291,9719, + 7767, 19070,5085, 26026,34733,8890, 40255,18496,40254,21917,15244,40254,38322,35964,42937,34732,18495,42937,32, 42936,42936,38322,36849,36849,40254,3819, 742, 29041,33291,6036, 20974,9139, 42936,38322,34892,19964,17065,16042,36849,17358,40254,40253,33949,35674,18202,42936,15621,16041,34574,3831, 42935,30634,33949,40253, 11564,36848,32544,35673,35673,14527,26798,38318,33418,38826,10789,30633,1071, 32543,10788,13567,19069,33948,24368,4464, 1769, 30632,18220,21650,35382,1314, 13447, 9626, 20307,42935,35673,6789, 17388,20401,25545,26025,6430, 36262,33277,17357,8006, 10625,7420, 1932, 40253,36027,42935,35673,36722,20368,42935,40253,40252,40252, @@ -15779,7 +15774,7 @@ static const unsigned short Ranks[197839] = 42929,30628,16040,33289,21914,40247,38318,42929,15209,1956, 37284,16645,12970,15987,16069,36847,8632, 35669,37019,18219,12534,26017,33289,20972,14404,42928,35669, 11250,34130,34564,16334,26016,37049,25712,37388,33254,16351,38703,28903,39138,23088,34785,15729,33378,39191,8679, 36569,1678, 2539, 512, 34480,667, 2247, 33066, 34286,21756,33633,33793,5797, 37111,34373,10793,20745,38533,96, 12163,39047,16333,365, 4285, 39122,4178, 1928, 5702, 40247,13284,37233,15582,12936,18218,10504, - 22273,13393,42928,17908,42928,19066,2256, 12840,42928,28921,16890,31534,11249,2248, 23133,10650,1716, 32854,479, 19209,8659, 27327,19200,37196,10089,33574,1450, + 22273,13393,42928,17908,42928,19066,2256, 12840,42928,28921,16890,31534,11249,2248, 23133,10650,1716, 32854,479, 19209,8659, 27327,19200,37196,10089,33574,1450, 35669,34731,2867, 6346, 12608,8631, 1532, 14001,26084,13283,38317,34730,27371,12771,35668,35668,42927,38317,3581, 7700, 37080,7411, 9717, 6106, 36396,4905, 21913, 4463, 4047, 3343, 28325,37771,32536,5400, 42927,21078,22679,38317,3648, 22800,30214,20783,27370,24828,42927,22710,29391,13580,38380,22734,32402,31255,905, 30761, 27396,11449,32118,24088,23576,35312,23081,38095,35668,40247,40246,42927,36847,35668,34730,40246,38317,35292,36846,37919,42926,12831,15342,209, 2086, 7956, 20971, @@ -15801,19 +15796,19 @@ static const unsigned short Ranks[197839] = 33945,40239,42917,10001,38310,13391,14694,20966,32525,33743,36842,35664,14960,38309,42917,42917,42917,33286,19164,24822,16886,3972, 38554,27365,30618,42916,10502, 18614,2804, 35622,7485, 34726,17380,42916,33961,36399,40239,26512,4583, 29193,35664,39119,19064,15619,34726,36842,35425,15459,17353,36842,39182,39235,26483,20398, 28916,5157, 33945,17591,1172, 36053,23690,16087,38309,42916,33285,824, 3425, 34703,250, 23915,38309,19063,42916,42915,26352,8333, 20397,792, 14303,743, 36841, - 34726,33285,36235,12037,25824,4847, 37294,42915,6528, 38309,685, 3382, 20396,38308,29027,30617,33894,35791,10000,19062,1286, 13034,38308,7715, 40239,42915,1112, - 40238,30616,40238,5897, 5086, 10048,8831, 16462,15592,19750,2421, 22965,36841,38308,34725,12260,13854,5874, 42915,35664,3184, 21011,40238,42914,17781,701, 8839, + 34726,33285,36235,12037,25824,4847, 37294,42915,6528, 38309,685, 3382, 20396,38308,29027,30617,33894,35791,10000,19062,1286, 13034,38308,7715, 40239,42915,1112, + 40238,30616,40238,5897, 5086, 10048,8831, 16462,15592,19750,2421, 22965,36841,38308,34725,12260,13854,5874, 42915,35664,3184, 21011,40238,42914,17781,701, 8839, 38716,35129,1829, 23689,8214, 20965,17224,38308,5500, 42914,15618,7221, 20964,39035,27024,37317,10776,36841,35664,40238,38307,24278,38047,10445,6046, 31096,17352, 42914,7419, 28609,42914,30615,233, 15566,14959,26281,5240, 24319,30614,10444,4659, 33944,42913,12523,8830, 40237,13281,8953, 42913,38307,13563,17906,33944,27364, 3894, 38307,26014,40237,34725,4621, 15240,19476,11836,40237,19475,42913,34460,42913,883, 42912,1348, 28915,1180, 40237,895, 12522,23024,5196, 4233, 26013,18492, - 5289, 5960, 35663,42912,27363,6644, 33944,1099, 34725,18491,40236,2434, 30613,34725,28914,596, 16017,5356, 26555,36841,10443,20395,42912,42912,30612,2822, 9999, - 8952, 28913,22729,2468, 403, 14401,5239, 20044,33944,37773,184, 2554, 32267,16298,25489,17043,42911,11149,27362,12671,19446,1189, 1723, 25288,25126,2176, 680, + 5289, 5960, 35663,42912,27363,6644, 33944,1099, 34725,18491,40236,2434, 30613,34725,28914,596, 16017,5356, 26555,36841,10443,20395,42912,42912,30612,2822, 9999, + 8952, 28913,22729,2468, 403, 14401,5239, 20044,33944,37773,184, 2554, 32267,16298,25489,17043,42911,11149,27362,12671,19446,1189, 1723, 25288,25126,2176, 680, 6511, 38727,38092,17167,22728,27094,19717,42911,137, 37876,6842, 33285,17351,35663,6352, 20394,32524,13562,37470,17905,38799,4179, 16359,35452,38511,10501,33089, 16933,34159,34724,40236,14178,18669,29226,10996,32523,36840,35663,15617,42911,32066,17904,16461,24821,14177,22727,42911,38307,38306,8147, 36840,32522,40236,36840, 6073, 42910,23688,33943,6845, 20516,8936, 24820,4740, 33943,30611,35183,262, 33943,35663,9059, 28912,8146, 34724,42910,33943,42910,9852, 42910,42909,40236,21118, 11356,42909,42909,2019, 40235,35662,34724,16460,18490,32521,3918, 27361,8584, 18489,35662,33285,9303, 10968,35662,33284,38306,33942,35662,1158, 4459, 29257,33284, 10297,22615,32302,14730,35661,34339,14427,19686,2153, 25935,30272,12036,42909,40235,36840,6072, 34724,26012,36839,42908,19716,9444, 33284,42908,42908,36839,34723, - 17350,19061,6071, 33486,5501, 33261,37258,3402, 33284,42908,35865,7823, 19474,18134,42907,38306,133, 29653,22266,10802,24816,20963,10246,20962,3573, 14958,7266, + 17350,19061,6071, 33486,5501, 33261,37258,3402, 33284,42908,35865,7823, 19474,18134,42907,38306,133, 29653,22266,10802,24816,20963,10246,20962,3573, 14958,7266, 27980,33947,3359, 15998,25011,37455,17223,15854,19868,3998, 18171,2467, 13108,6963, 35309,5342, 12174,38677,36839,35063,35687,33417,34570,18216,22828,20195,36213, 14190,11299,39014,6003, 22806,32243,287, 1765, 8087, 14325,29365,24006,38306,33368,20617,3557, 20103,24944,8489, 1847, 11608,36216,1763, 24599,1518, 26435,33019, 6105, 34318,35661,36903,5456, 33847,34742,39402,30677,34683,19953,3433, 36562,23876,15831,1578, 16894,19473,5643, 19715,35589,42907,5560, 2643, 9844, 12533,10045, @@ -15823,39 +15818,39 @@ static const unsigned short Ranks[197839] = 32807,31949,20966,6496, 15702,9700, 24378,22294,10453,22791,3488, 25633,24070,42906,10049,15139,33023,40234,42905,11126,5245, 11247,6643, 36838,34677,13390,34595, 34073,30609,34723,42905,575, 933, 1969, 225, 2770, 27790,16527,17200,27362,12655,16218,16623,4420, 33965,6580, 12406,31757,40234,34723,1512, 7622, 28020,23727, 34015,23687,30608,1431, 18214,13389,19472,22906,13157,5198, 34723,17222,17195,930, 36838,40233,38305,42905,33071,42905,1206, 36777,35134,38432,36838,29888,32520, - 14176,42904,37373,16330,34785,8487, 40233,20476,18732,19471,10717,18213,12935,40233,21909,35660,40233,40232,33942,38305,42904,42904,3937, 565, 23125,38348,2793, + 14176,42904,37373,16330,34785,8487, 40233,20476,18732,19471,10717,18213,12935,40233,21909,35660,40233,40232,33942,38305,42904,42904,3937, 565, 23125,38348,2793, 17221,37049,2025, 11163,2395, 20206,21881,12638,34625,6527, 16159,18588,2127, 2119, 7637, 36232,5761, 17437,2214, 35776,13529,35660,38305,13801,40232,19470,35660, 33942,38803,29855,30607,33283,38304,28911,1420, 18488,10083,16337,6851, 40232,453, 13874,37042,10716,12934,19881,11524,17220,36837,11523,9643, 40232,33945,36061, 36872,42904,42903,40231,22540,33942,1228, 21183,40231,20049,1912, 18406,4087, 937, 24849,5737, 34722,5070, 1395, 3909, 38085,7830, 42903,37700,14524,3621, 30356, 12531,38304,38304,14538,14400,14957,6043, 38304,751, 7200, 33941,40231,11351,28211,37253,36913,4363, 12420,11443,10830,32963,3962, 30633,21908,13280,18212,14523, - 2688, 26158,2901, 42903,5288, 18211,4933, 18210,2291, 362, 6837, 27893,3146, 23686,16459,14869,40231,501, 12530,34722,6291, 2040, 21706,206, 38161,1959, 3479, + 2688, 26158,2901, 42903,5288, 18211,4933, 18210,2291, 362, 6837, 27893,3146, 23686,16459,14869,40231,501, 12530,34722,6291, 2040, 21706,206, 38161,1959, 3479, 21637,11623,1584, 25823,2635, 7312, 17219,1709, 34027,12835,17903,42903,36837,35659,24818,16460,9281, 638, 29281,32519,13722,16885,239, 13858,23763,35468,33878, 36573,40230,37290,33451,28869,8723, 42902,3424, 6104, 28174,42902,33283,717, 29179,21306,40230,16884,38303,27203,36837,5642, 40230,21117,35659,13033,27997,14449, 10048,19469,38762,38303,1889, 20393,10296,34722,16040,42902,306, 798, 36837,12770,38303,3443, 38303,6648, 42902,32518,6576, 18743,10424,34790,12933,28910,36836, - 33504,42901,33941,42901,5877, 42901,36836,36836,7765, 33941,40230,20392,34085,38187,40229,38302,40229,42901,23685,30606,34722,19713,2469, 25915,9843, 3587, 8893, - 17221,36836,27359,36955,36835,23684,37983,16883,38302,28909,37613,40229,33787,9137, 6159, 3580, 13642,42900,32549,508, 36474,40229,32787,17349,40228,33283,5779, - 19712,21853,36835,35659,34061,7341, 40228,13032,22295,35064,37690,22910,34721,8583, 15670,34817,25754,1785, 17913,27125,674, 9970, 42900,36638,1299, 30605,999, - 21762,4263, 26269,541, 16776,31608,38302,14522,14883,28107,42900,30604,4207, 33191,42900,40228,34721,4663, 3160, 39153,26887,42899,20391,36835,10142,207, 1710, - 16239,13318,10492,16038,9753, 16136,8035, 7723, 30975,14388,28038,37349,26011,34721,9642, 17218,28338,36555,3423, 33941,19468,32517,9851, 7053, 798, 5139, 9280, + 33504,42901,33941,42901,5877, 42901,36836,36836,7765, 33941,40230,20392,34085,38187,40229,38302,40229,42901,23685,30606,34722,19713,2469, 25915,9843, 3587, 8893, + 17221,36836,27359,36955,36835,23684,37983,16883,38302,28909,37613,40229,33787,9137, 6159, 3580, 13642,42900,32549,508, 36474,40229,32787,17349,40228,33283,5779, + 19712,21853,36835,35659,34061,7341, 40228,13032,22295,35064,37690,22910,34721,8583, 15670,34817,25754,1785, 17913,27125,674, 9970, 42900,36638,1299, 30605,999, + 21762,4263, 26269,541, 16776,31608,38302,14522,14883,28107,42900,30604,4207, 33191,42900,40228,34721,4663, 3160, 39153,26887,42899,20391,36835,10142,207, 1710, + 16239,13318,10492,16038,9753, 16136,8035, 7723, 30975,14388,28038,37349,26011,34721,9642, 17218,28338,36555,3423, 33941,19468,32517,9851, 7053, 798, 5139, 9280, 42899,7410, 6396, 6972, 19711,40228,7857, 2530, 7829, 33036,5425, 35483,36835,28908,704, 6801, 7139, 42899,20961,36834,7079, 29509,6950, 34903,8786, 33481,14399, - 424, 14207,10047,13020,8298, 31388,9170, 26010,36326,33283,14049,14398,13873,3646, 19710,4180, 40227,14956,9714, 21116,33545,8255, 42899,28176,1013, 1407, 1685, + 424, 14207,10047,13020,8298, 31388,9170, 26010,36326,33283,14049,14398,13873,3646, 19710,4180, 40227,14956,9714, 21116,33545,8255, 42899,28176,1013, 1407, 1685, 38302,22196,9110, 37224,10559,32810,38301,35659,23683,251, 27708,33918,38301,9475, 21115,2719, 35658,34721,36834,33892,8722, 33531,38821,18487,28907,30603,37512, 21907,40227,35658,40227,36834,18608,38301,3329, 961, 38301,17217,12308,19059,24817,13009,37790,38300,8022, 18864,20960,12173,4813, 21602,13357,36834,42898,13561, 36833,33282,31754,34600,31778,23682,38300,10295,27260,20959,42898,22726,9058, 13279,1038, 8829, 42898,42898,8951, 8950, 35658,8047, 42897,24092,42897,28858,40227, - 10517,35191,12172,355, 38284,18855,6158, 16997,35703,8904, 23073,28236,2886, 40226,9576, 33282,19033,34720,15659,33940,33940,33940,917, 2428, 3438, 35325,1148, - 8237, 40226,13049,32516,30602,40226,35658,4388, 36622,3344, 5778, 26009,2828, 12529,5988, 4346, 36833,3447, 30601,40226,26008,1924, 18209,35777,435, 21983,9232, + 10517,35191,12172,355, 38284,18855,6158, 16997,35703,8904, 23073,28236,2886, 40226,9576, 33282,19033,34720,15659,33940,33940,33940,917, 2428, 3438, 35325,1148, + 8237, 40226,13049,32516,30602,40226,35658,4388, 36622,3344, 5778, 26009,2828, 12529,5988, 4346, 36833,3447, 30601,40226,26008,1924, 18209,35777,435, 21983,9232, 10723,16808,37283,40225,34720,9713, 16882,35596,5565, 9807, 7978, 20958,25567,15511,18177,22616,23772,3096, 1514, 32609,13954,18208,8835, 38300,27195,4340, 10058, 17437,24755,12761,24362,32759,271, 13202,28403,7505, 42897,668, 19245,10603,27730,40225,3216, 21044,24117,6194, 4887, 12132,20957,22874,38300,12528,19467,18207, - 31104,23745,8051, 6610, 6355, 23522,15440,18392,7201, 8408, 13764,18686,29694,4279, 36833,10798,32448,2646, 6255, 2644, 468, 11689,32906,40225,5069, 9474, 1011, + 31104,23745,8051, 6610, 6355, 23522,15440,18392,7201, 8408, 13764,18686,29694,4279, 36833,10798,32448,2646, 6255, 2644, 468, 11689,32906,40225,5069, 9474, 1011, 19351,7878, 2396, 25969,39232,12932,19466,6924, 22990,29866,18259,928, 5004, 38260,28906,42897,42896,4824, 40225,3634, 19280,887, 10099,4415, 13031,21906,36833, 40224,32964,8745, 23715,8589, 29798,14981,10426,17404,10000,19465,19058,33940,9805, 42896,26304,34720,42896,30600,8145, 8949, 11355,2074, 11354,33939,5140, 42896, 40224,27358,35058,38299,18486,21114,1673, 30599,38299,8828, 42895,33282,2651, 17902,34720,36832,4706, 30598,35657,2216, 5606, 36527,42895,36154,27570,38299,12527, - 40224,4565, 15343,3996, 11835,6827, 23805,7955, 17216,23681,18738,38299,38298,35101,15616,459, 34719,3785, 24816,42895,7613, 393, 21905,25707,27357,122, 3405, + 40224,4565, 15343,3996, 11835,6827, 23805,7955, 17216,23681,18738,38299,38298,35101,15616,459, 34719,3785, 24816,42895,7613, 393, 21905,25707,27357,122, 3405, 29453,12504,15217,35657,21642,33136,19464,18899,18206,2538, 8486, 14840,1052, 2118, 32011,762, 4548, 7311, 14868,11562,33979,12035,35887,14204,10184,31398,33282, 18214,1230, 790, 36027,9842, 6826, 6810, 11705,11246,22725,30597,23680,32515,27356,839, 33562,35657,32514,35657,6458, 8496, 42895,38298,389, 5044, 17901,22724, 26238,31605,32909,42894,24815,32513,14867,35656,42894,17900,26007,42894,40224,42894,42893,35656,33939,34719,30596,33281,8787, 15579,38298,38298,24814,33939,19970, - 3309, 17215,15578,30850,36281,4823, 24813,33170,32512,28905,6910, 33774,38297,40223,38297,5499, 17899,42893,40223,33939,46, 792, 19463,11522,2903, 440, 6971, - 63, 11301,26973,30372,31137,42893,7041, 35656,40223,19462,26443,38297,22802,2981, 12975,22723,697, 204, 7587, 26006,34719,7280, 38718,36832,3671, 9850, 3872, + 3309, 17215,15578,30850,36281,4823, 24813,33170,32512,28905,6910, 33774,38297,40223,38297,5499, 17899,42893,40223,33939,46, 792, 19463,11522,2903, 440, 6971, + 63, 11301,26973,30372,31137,42893,7041, 35656,40223,19462,26443,38297,22802,2981, 12975,22723,697, 204, 7587, 26006,34719,7280, 38718,36832,3671, 9850, 3872, 24812,42893,92, 16458,27161,32995,7119, 30483,26561,38297,9998, 38296,33317,12854,14081,27355,40223,9641, 2279, 11162,11403,35656,5355, 9849, 20956,8082, 42892, 37035,36832,18481,20685,34719,12841,23679,38296,20955,36832,7118, 10294,18485,28818,12259,19461,6122, 35655,22423,11796,36831,42892,29354,38296,2943, 17865,42892, 20487,26079,8144, 8721, 19709,38328,27354,2439, 33938,42892,40222,42891,5257, 8377, 25117,37726,42891,34718,882, 20390,37414,38296,40222,32854,31885,13696,35441, @@ -15878,36 +15873,36 @@ static const unsigned short Ranks[197839] = 39264,8812, 35802,12730,8454, 13513,22252,4097, 36379,34801,4418, 3235, 36597,14812,7220, 33937,10604,23741,1589, 35651,17680,42881,28897,38291,10160,25249,32503, 7039, 445, 21904,35651,3551, 10500,36827,18203,10277,7126, 34904,6645, 24807,18202,4232, 40215,40215,39199,42881,38291,20602,3278, 40215,19057,38855,5301, 20951, 7221, 18201,3469, 2943, 20950,2932, 3342, 15575,33284,5997, 42881,36878,16033,11244,21953,20949,1995, 14518,518, 16848,33104,20046,42881,6893, 14879,20878,19457, - 34715,12526,10715,18200,1708, 37483,20948,13388,18645,15574,5338, 18250,38684,4791, 5256, 22717,20947,12930,11784,11243,34715,19456,40215,14174,24806,525, 1912, + 34715,12526,10715,18200,1708, 37483,20948,13388,18645,15574,5338, 18250,38684,4791, 5256, 22717,20947,12930,11784,11243,34715,19456,40215,14174,24806,525, 1912, 1703, 25921,39314,24856,8772, 35650,36827,18199,9983, 14954,42880,23621,19455,16328,6738, 10008,34633,9971, 3101, 14953,17211,12525,40214,13558,38291,26199,42880, 42880,2605, 486, 2018, 8347, 32225,14865,34509,21112,42880,4979, 653, 32143,35382,1818, 8221, 38530,1888, 14517,4022, 7199, 26003,15573,827, 18698,5467, 20946, - 3979, 33936,33936,18198,33936,36826,17894,13871,6970, 6351, 16453,21903,14396,33279,40214,35867,35650,7198, 19736,28896,25217,29208,12171,5280, 14864,8485, 8582, + 3979, 33936,33936,18198,33936,36826,17894,13871,6970, 6351, 16453,21903,14396,33279,40214,35867,35650,7198, 19736,28896,25217,29208,12171,5280, 14864,8485, 8582, 9848, 20064,32502,42879,40214,22090,34715,38506,36826,11794,140, 28523,21097,5123, 5179, 38291,37, 11098,1682, 13657,7036, 13969,7967, 20420,32724,19236,18175, 22629,37533,4662, 10714,1060, 12129,11294,20099,3645, 1707, 19364,21902,19707,24195,10984,33279,13557,25998,6708, 9584, 18482,28319,32902,42879,35650,40214,11352, 24338,1856, 40213,8719, 36826,6969, 35650,33279,34714,40213,5238, 30589,42879,33936,17347,27347,42879,23139,38290,1248, 33935,6457, 21701,6447, 36165,35014,36826, 33935,37174,6669, 21901,13029,8254, 11793,27346,32501,10983,12663,30358,28895,22716,699, 4201, 38449,27345,35397,40213,34714,42878,16452,25997,40213,28894,42878, - 28893,40212,7837, 38294,8081, 12929,20385,36828,36825,33211,1904, 2129, 5872, 14952,20209,28235,38290,38290,37986,33935,653, 9464, 25456,36825,13277,19706,575, + 28893,40212,7837, 38294,8081, 12929,20385,36828,36825,33211,1904, 2129, 5872, 14952,20209,28235,38290,38290,37986,33935,653, 9464, 25456,36825,13277,19706,575, 19705,34287,235, 42878,2166, 38290,5424, 40212,40212,10499,1050, 38289,14951,13168,1034, 9995, 42878,36825,9711, 16810,42877,25996,38289,32500,38289,13918,33671, - 371, 12582,3834, 14173,40212,36825,38289,9574, 13028,38124,13027,40211,16327,24805,28892,28671,38008,37987,40211,2869, 19454,42877,38426,20945,11560,38288,1729, + 371, 12582,3834, 14173,40212,36825,38289,9574, 13028,38124,13027,40211,16327,24805,28892,28671,38008,37987,40211,2869, 19454,42877,38426,20945,11560,38288,1729, 15329,25458,1082, 5988, 3594, 42877,19973,2056, 13435,25995,9443, 40211,37730,17210,6840, 12279,38288,14863,33278,38288,38288,14172,38302,5156, 7411, 27344,20406, 11418,5931, 29957,35649,33278,23503,3168, 42877,40211,25466,33458,34714,34714,42876,8628, 14171,40210,36824,6509, 42876,38971,4855, 11520,2034, 15620,35457,11519, 1726, 38287,42876,39245,40210,3462, 22004,7138, 16032,32499,38287,35792,3593, 32498,2591, 3442, 23673,23672,2821, 34713,902, 528, 1200, 34713,42876,6456, 33278, 40210,33935,9507, 11161,38287,1927, 7418, 42875,33934,9573, 33934,35649,42875,3183, 1611, 25994,18891,37683,42875,16326,25993,12768,19453,38287,40210,33278,22715, 14516,28891,24804,11363,34713,22714,34713,33934,34782,30588,19967,38286,27343,42875,1574, 19704,42874,38200,35638,38234,17209,35649,32099,35698,21914,33763,22231, - 23897,38286,3661, 18930,3324, 38692,32497,17849,21059,2517, 23148,11834,21243,35857,36047,32648,1648, 42874,37337,32496,42874,3215, 34152,14756,35030,33305,7962, + 23897,38286,3661, 18930,3324, 38692,32497,17849,21059,2517, 23148,11834,21243,35857,36047,32648,1648, 42874,37337,32496,42874,3215, 34152,14756,35030,33305,7962, 40209,17346,841, 5958, 24858,5195, 4824, 36498,11252,36823,35433,11518,36538,15572,17208,34521,21986,5266, 24335,17207,29274,21900,16374,33835,6365, 35987,12524, 12034,34194,15571,19452,23224,34009,6127, 21821,36618,35552,3334, 34382,23133,38864,36249,14874,29973,18197,26382,33611,21945,14701,12983,38372,31902,39111,24106, 12999,35921,39211,39361,13698,20856,35590,18061,11953,38708,25779,14976,23840,37131,42874,2400, 20944,11242,9463, 32918,8948, 35234,33934,33933,24158,5953, 20943, 17206,37667,34582,36824,32673,32495,3764, 40209,37614,24803,36824,15614,36824,27359,38286,38286,3893, 906, 21111,9057, 25112,37439,28444,36181,17893,10442,18196, 5753, 18084,34026,6612, 40209,40209,22713,34004,17892,23671,20384,20383,3422, 21899,25992,3432, 15950,36436,2426, 38042,38914,7515, 12170,6395, 17198,13387,24950, 32129,32869,12928,10493,38562,38209,34475,9279, 32020,37378,36006,25622,2105, 38585,35434,28964,31415,35544,37707,36479,32574,26964,25349,29287,17205,11253,33872, - 23505,34739,35483,35620,26225,13386,9462, 34498,12767,16526,38029,14950,32821,36641,39082,17105,7051, 36314,12169,33336,33533,8771, 7310, 13870,34220,14949,7514, + 23505,34739,35483,35620,26225,13386,9462, 34498,12767,16526,38029,14950,32821,36641,39082,17105,7051, 36314,12169,33336,33533,8771, 7310, 13870,34220,14949,7514, 3468, 10498,7219, 13385,10713,16325,19056,34139,24641,27953,19451,20942,34044,20875,7409, 9670, 3625, 34466,33922,10485,35534,6103, 5321, 16324,18657,32817,17345, 36221,38909,38482,34814,16451,35649,32408,34780,8046, 32494,38285,42873,15238,21898,40208,28890,35648,42873,11833,29029,8770, 20941,3375, 17204,13384,38285,36823, - 21205,38285,35927,27274,2099, 5581, 26999,25522,34712,29905,13513,2, 141, 14948,13383,18195,10982,14395,61, 11, 10981,10497,19450,82, 36542,1781, 3262, + 21205,38285,35927,27274,2099, 5581, 26999,25522,34712,29905,13513,2, 141, 14948,13383,18195,10982,14395,61, 11, 10981,10497,19450,82, 36542,1781, 3262, 36724,22698,16194,21486,14639,7039, 15112,40208,42873,40208,42873,38097,23670,40208,14170,24802,40207,38285,36823,42872,22712,15109,34712,13869,10045,37754,34712, 30693,17203,28329,7467, 20717,11971,3201, 24593,15863,17511,19513,42872,28653,25384,38284,23063,20139,31331,24004,15296,20997,14560,242, 28264,35648,37476,38284, - 27342,42872,28889,24801,36823,39347,27341,21110,33277,19055,35254,36823,36407,42872,38030,39125,33277,38284,42871,12311,12503,34212,13284,40207,40207,9635, 2886, + 27342,42872,28889,24801,36823,39347,27341,21110,33277,19055,35254,36823,36407,42872,38030,39125,33277,38284,42871,12311,12503,34212,13284,40207,40207,9635, 2886, 30587,16646,40207,27318,953, 38424,36822,20598,901, 42871,40206,42871,42871,25934,34504,40206,10305,7410, 35731,23544,38167,35648,34918,25516,34712,33691,27554, 13933,9722, 11341,9623, 7410, 15911,24940,13737,40206,3406, 2641, 37556,34215,40206,13260,30113,34711,5072, 37378,34424,42870,24315,37277,14118,36933,18194,38284, 39408,15644,39203,33858,35993,24641,23378,21002,15327,37307,40205,42870,33779,6271, 19598,29862,5878, 38501,20793,695, 26662,26438,3495, 19449,14947,16617,26350, @@ -15915,52 +15910,52 @@ static const unsigned short Ranks[197839] = 16323,27054,34222,7678, 26023,17588,7828, 9840, 22760,14453,20162,15727,32806,15498,37727,36000,25639,37535,38283,38283,11707,30576,35845,39366,36500,27482,33450, 19448,18193,7954, 9278, 42870,8253, 36238,33960,5996, 38839,38497,37015,4777, 5213, 27949,33806,29120,28328,10750,30106,6613, 28102,31638,24031,32563,9152, 37241, 34450,38252,19700,5423, 3744, 5287, 35376,11241,18192,181, 3472, 1633, 39101,31858,12033,9929, 31667,31638,23100,12847,6455, 195, 2785, 31524,13282,17202,10496, - 36336,36483,14060,9939, 5429, 1209, 34744,5138, 1931, 1229, 38283,40205,35884,34711,27735,2578, 16345,9811, 3114, 24367,1215, 9681, 17592,5275, 2398, 4495, 6124, - 1457, 23886,6229, 18989,11342,34591,37937,4468, 28633,36822,7946, 42870,21252,38676,23193,12927,10529,26437,19120,21818,19447,15346,843, 20146,16977,4737, 2907, + 36336,36483,14060,9939, 5429, 1209, 34744,5138, 1931, 1229, 38283,40205,35884,34711,27735,2578, 16345,9811, 3114, 24367,1215, 9681, 17592,5275, 2398, 4495, 6124, + 1457, 23886,6229, 18989,11342,34591,37937,4468, 28633,36822,7946, 42870,21252,38676,23193,12927,10529,26437,19120,21818,19447,15346,843, 20146,16977,4737, 2907, 18191,17220,6609, 36822,33696,33258,15570,24840,19446,11832,29918,20940,3615, 24233,38802,20946,14946,16322,38654,8556, 39208,30025,14293,3019, 2666, 32379,22307, 34249,14056,35419,42869,37581,18122,33204,4007, 33790,14945,20293,33640,6567, 31016,40205,40205,42869,40204,2027, 22299,36127,16634,24800,37, 42869,23694,42869, 38283,37664,35648,42868,10495,17888,42868,37947,26792,16881,31901,25736,34900,4562, 1692, 16402,31683,20515,23050,34410,34482,6737, 32784,21719,37275,40204,37058, 35647,35647,42868,13153,8213, 30020,38282,35517,11464,16208,8934, 38142,27340,38282,42868,15702,4902, 11831,31402,6205, 23149,32793,2098, 385, 24354,38282,32981, - 7614, 16107,21728,31546,13398,35647,13382,10783,32023,21705,6668, 15569,6042, 4765, 1450, 3563, 9461, 42867,3100, 36822,13026,20382,1901, 18073,25008,25824,8810, + 7614, 16107,21728,31546,13398,35647,13382,10783,32023,21705,6668, 15569,6042, 4765, 1450, 3563, 9461, 42867,3100, 36822,13026,20382,1901, 18073,25008,25824,8810, 36317,30586,30455,15610,40204,35088,1854, 12168,37744,38635,42867,42867,37190,11028,33027,1873, 27310,30585,22368,32972,42867,42866,16450,30584,40204,42866,30563, 38953,25991,35647,23806,35958,35065,244, 8009, 38005,25990,31897,34255,38725,8876, 853, 38887,35287,11502,11615,21016,33554,38282,39081,35479,7285, 35778,25989, 34711,37628,35704,36636,4451, 8517, 34371,37126,18454,14862,12855,36400,912, 16321,42866,33833,9181, 28888,42866,42865,42865,40203,20381,36611,13719,16850,42865, - 32029,5791, 26661,13276,33530,38281,42865,30456,684, 34711,36475,23726,42864,17443,17590,2399, 35646,14319,42864,40203,33165,38909,33950,33907,2485, 24005,7134, + 32029,5791, 26661,13276,33530,38281,42865,30456,684, 34711,36475,23726,42864,17443,17590,2399, 35646,14319,42864,40203,33165,38909,33950,33907,2485, 24005,7134, 1396, 3042, 781, 13853,8581, 37457,25257,20703,34646,39159,32951,34555,37630,28621,31184,14601,1697, 33287,29212,29015,36689,37853,12032,42864,35449,30083,25675, 32893,5623, 5115, 28065,25487,8041, 17173,35329,32530,28419,29267,33687,39261,32173,1664, 15054,3363, 39327,42864,42863,12461,25733,1588, 32659,5384, 20939,18190, 35111,6556, 35646,33277,38281,29615,32767,40203,35646,42863,9890, 39178,34710,36821,21897,2129, 18494,1026, 37207,18730,10980,7125, 2451, 8910, 15568,42863,18189, 36821,9181, 12167,7814, 26380,20100,13381,9448, 26224,33401,2893, 30658,5896, 38735,21354,6688, 2639, 8395, 9555, 5642, 4268, 18752,5567, 14300,38291,8484, 40203, 29768,39400,23555,14282,26222,33370,37869,39362,33766,19291,13006,1632, 18374,36185,5022, 10497,12060,17620,23884,32906,24977,26440,30390,17314,4995, 9674, 13011, 8587, 13967,19788,19739,12291,15967,24627,26992,23231,3701, 18529,21267,12288,20758,27205,22731,9975, 11037,7976, 15728,5653, 31080,1209, 29613,28340,861, 18629, - 9356, 2010, 47, 11485,4516, 28133,27679,19730,30534,4053, 29883,35330,1530, 42863,2628, 22762,19575,31641,28901,28471,13977,11287,22207,24931,31000,12935,6693, + 9356, 2010, 47, 11485,4516, 28133,27679,19730,30534,4053, 29883,35330,1530, 42863,2628, 22762,19575,31641,28901,28471,13977,11287,22207,24931,31000,12935,6693, 9249, 28359,28097,38364,22282,24139,1311, 25393,23480,33425,42862,35665,1134, 24008,23190,37022,33159,4815, 1707, 35618,10046,4432, 1911, 13380,8933, 589, 18010, - 2197, 36289,14944,4390, 2886, 32774,16031,40202,38281,18921,27331,6058, 31573,15966,34710,16449,25380,35294,36024,37813,3686, 13912,36821,10491,10979,24129,9839, + 2197, 36289,14944,4390, 2886, 32774,16031,40202,38281,18921,27331,6058, 31573,15966,34710,16449,25380,35294,36024,37813,3686, 13912,36821,10491,10979,24129,9839, 14943,20938,20937,25988,34710,33277,36821,38683,40202,40202,19703,30703,42862,42862,42862,28887,36227,28700,18461,21896,9612, 20796,33276,15612,831, 32766,36255, 26108,37080,6224, 18043,42861,38281,20853,40202,15380,23669,6179, 42861,25676,8564, 12980,37924,34710,36581,19445,27392,12094,9460, 12794,26902,12524,5995, 18343, 31089,35777,25856,32906,36681,38840,25669,30583,9994, 33091,8066, 34459,13846,14942,3833, 18188,27339,36260,22087,2240, 926, 42861,16448,27122,34709,6171, 10251, - 38475,42861,14941,10731,33566,9502, 18913,4106, 2426, 22969,6008, 22662,2601, 7241, 42860,34942,20936,36424,35172,17201,25221,20935,29435,5320, 20270,36820,1172, - 30975,7827, 19079,16573,27863,3730, 26850,4066, 18991,35500,25286,22173,39044,24845,37210,14468,37516,34179,32992,17200,10726,589, 23766,33276,27338,9640, 1128, + 38475,42861,14941,10731,33566,9502, 18913,4106, 2426, 22969,6008, 22662,2601, 7241, 42860,34942,20936,36424,35172,17201,25221,20935,29435,5320, 20270,36820,1172, + 30975,7827, 19079,16573,27863,3730, 26850,4066, 18991,35500,25286,22173,39044,24845,37210,14468,37516,34179,32992,17200,10726,589, 23766,33276,27338,9640, 1128, 7562, 39257,16108,39288,5295, 21751,6923, 34808,9369, 16899,33822,934, 7592, 20934,14940,39349,18151,36860,31809,38280,12166,19438,7615, 21175,39234,21815,24017, 17556,10978,19444,17199,37493,4822, 12926,19443,10198,5422, 36806,9592, 35630,16715,17793,35597,11830,18187,18186,34728,34642,8099, 10494,5421, 33070,20380,12498, 40201,36701,11475,17198,14394,33868,36065,34233,26134,1242, 34568,38812,9789, 13836,36993,32210,28498,35012,32804,20933,9862, 37905,28547,37599,9838, 9277, 12925, - 35627,6041, 11240,33859,13868,38138,14393,14392,14939,9373, 22419,39189,37348,39152,32076,6467, 34542,17822,9136, 38003,5888, 17197,3738, 2425, 7698, 2487, 5398, - 8208, 7218, 7204, 17196,13867,8932, 5202, 8562, 11954,5307, 4435, 11517,34812,18185,9135, 32800,34140,36470,16320,4821, 3224, 10276,4686, 37046,23046,1514, 321, + 35627,6041, 11240,33859,13868,38138,14393,14392,14939,9373, 22419,39189,37348,39152,32076,6467, 34542,17822,9136, 38003,5888, 17197,3738, 2425, 7698, 2487, 5398, + 8208, 7218, 7204, 17196,13867,8932, 5202, 8562, 11954,5307, 4435, 11517,34812,18185,9135, 32800,34140,36470,16320,4821, 3224, 10276,4686, 37046,23046,1514, 321, 20932,3170, 12060,3848, 13379,19585,10531,6079, 5504, 3446, 15745,6998, 9837, 25266,12165,883, 12523,6525, 7513, 20931,17195,7826, 10275,15567,37293,28214,34313, 8826, 37150,34452,10493,25362,16319,16318,12522,16027,2434, 1518, 16317,12924,1568, 7714, 15332,11813,25812,19442,5319, 1931, 20930,38411,4728, 37024,5889, 20929, 32812,18618,20928,3083, 28286,3566, 34389,11516,7953, 8931, 13022,20927,13378,11239,1622, 1599, 2611, 2763, 8804, 3256, 8760, 13647,20047,6466, 7228, 35573,39194, - 15566,20926,33316,35646,19441,17194,3461, 5895, 4547, 12923,36545,17193,10977,14318,21798,37650,34750,14483,18623,30582,29144,20354,7364, 25916,18184,8863, 4, - 526, 30572,5353, 14861,36820,42860,34019,10168,17837,27231,8877, 27188,30329,21164,35198,6642, 34664,12165,6204, 15927,20925,13377,5615, 28441,9639, 26830,8627, + 15566,20926,33316,35646,19441,17194,3461, 5895, 4547, 12923,36545,17193,10977,14318,21798,37650,34750,14483,18623,30582,29144,20354,7364, 25916,18184,8863, 4, + 526, 30572,5353, 14861,36820,42860,34019,10168,17837,27231,8877, 27188,30329,21164,35198,6642, 34664,12165,6204, 15927,20925,13377,5615, 28441,9639, 26830,8627, 40201,33933,37764,37168,16316,24190,10712,11515,35227,37015,2682, 17192,29085,39299,20924,18183,37639,36083,2636, 31560,3900, 33257,6187, 38633,33698,39049,33440, 21595,37982,34333,32982,23687,42860,33469,10492,38354,13866,19440,39004,3308, 1552, 14787,9706, 16315,38739,13865,38580,16149,8769, 11829,4345, 18182,6608, 35424, - 37552,26228,19439,8346, 8930, 10711,33746,5428, 10695,42860,19438,18181,12521,39094,13864,10491,18180,5605, 7476, 3923, 42859,20083,11238,18179,9044, 19437,2112, + 37552,26228,19439,8346, 8930, 10711,33746,5428, 10695,42860,19438,18181,12521,39094,13864,10491,18180,5605, 7476, 3923, 42859,20083,11238,18179,9044, 19437,2112, 13543,3013, 35355,26487,6498, 27137,1545, 10797,6736, 20923,3457, 13863,13862,29493,12164,33933,25549,38922,38776,17391,6892, 30657,24580,34713,16314,17694,18852, 20363,35574,15010,34119,24799,36820,20061,10169,22552,12116,5255, 28919,188, 220, 36151,455, 87, 3675, 17555,7085, 34848,37676,19669,38165,11681,37816,14391, - 20922,565, 9777, 4462, 15565,15564,38706,21093,8973, 6394, 4691, 4498, 34022,32785,20921,13376,31407,42859,9836, 11237,38450,33154,20920,8080, 13809,15974,7265, - 34146,19436,17191,24459,20919,4517, 11514,19435,6524, 4512, 1396, 4664, 4726, 5685, 38764,37401,6038, 6964, 11828,36544,38280,815, 720, 2472, 1397, 1970, 858, + 20922,565, 9777, 4462, 15565,15564,38706,21093,8973, 6394, 4691, 4498, 34022,32785,20921,13376,31407,42859,9836, 11237,38450,33154,20920,8080, 13809,15974,7265, + 34146,19436,17191,24459,20919,4517, 11514,19435,6524, 4512, 1396, 4664, 4726, 5685, 38764,37401,6038, 6964, 11828,36544,38280,815, 720, 2472, 1397, 1970, 858, 36562,1539, 36946,18957,12950,27984,38150,16906,5952, 4998, 19434,30351,22143,34987,34527,12966,8483, 19433,1555, 15081,35377,32034,32481,2851, 13018,35946,11827, - 11513,7904, 21078,33728,14668,12219,36820,34278,10085,24015,6830, 42859,9459, 23252,26098,10045,17190,16313,42859,1358, 11826,32909,23622,15563,20918,9164, 4896, + 11513,7904, 21078,33728,14668,12219,36820,34278,10085,24015,6830, 42859,9459, 23252,26098,10045,17190,16313,42859,1358, 11826,32909,23622,15563,20918,9164, 4896, 24299,19432,18481,16731,20917,34713,23199,37775,32993,14352,14071,33041,1078, 25125,475, 36914,3088, 8212, 15022,33751,42858,14390,20916,38280,9458, 34551,13375, - 2053, 8465, 13369,9760, 30684,319, 15160,6556, 35510,33676,34046,423, 19436,965, 9031, 27167,11956,3365, 25173,28365,1002, 10259,28590,26327,9557, 2326, 2103, + 2053, 8465, 13369,9760, 30684,319, 15160,6556, 35510,33676,34046,423, 19436,965, 9031, 27167,11956,3365, 25173,28365,1002, 10259,28590,26327,9557, 2326, 2103, 2616, 3315, 4143, 8586, 8845, 6375, 7200, 9482, 17189,37376,7217, 7309, 15562,34782,3730, 33874,27943,3155, 34124,10274,10273,25276,2070, 34028,21368,9134, 10870, 15561,9835, 17188,16312,998, 18391,17187,27463,2251, 5438, 6315, 38349,37366,17186,8079, 17185,18922,21979,12521,11512,20915,36264,15110,13080,22036,633, 15964, 17383,22870,13374,15137,5233, 748, 36705,27967,3899, 32793,9422, 33116,37035,24619,26346,37189,25271,6766, 27457,2049, 3357, 18311,2353, 38446,8345, 13300,33276, @@ -15969,30 +15964,30 @@ static const unsigned short Ranks[197839] = 37869,7429, 31512,11511,30426,20293,11138,38605,31958,37866,8331, 2398, 8929, 34245,12997,6023, 38216,20913,35232,42858,37429,36831,12550,12323,11701,907, 32759, 38837,38280,13932,38279,28422,15558,3078, 7050, 38197,8482, 33871,37186,36496,7975, 36220,13861,7825, 12520,19557,26948,321, 20912,29991,28075,12161,5306, 30350, 17184,8475, 4192, 17815,5054, 26202,14388,21574,9638, 21895,33276,1048, 24066,20362,6274, 12922,9133, 8077, 34419,7952, 3234, 10490,2693, 5544, 6684, 31526,17183, - 15771,9990, 20624,37801,5212, 13860,11825,1153, 12835,10989,42858,34667,37359,14938,17161,34020,13373,25994,6393, 26371,18178,7408, 27796,14522,13343,38317,6891, + 15771,9990, 20624,37801,5212, 13860,11825,1153, 12835,10989,42858,34667,37359,14938,17161,34020,13373,25994,6393, 26371,18178,7408, 27796,14522,13343,38317,6891, 17595,20755,33965,7137, 13154,25453,21459,11034,34541,34603,32493,13413,4149, 11668,18620,38851,1769, 18231,38502,20911,535, 26087,6523, 36252,26513,15557,13859, 10027,7968, 7336, 10710,17182,10489,18177,4811, 26507,17802,18614,31197,32835,15556,7512, 7115, 13776,19431,37586,33737,9243, 14704,15881,29345,825, 1421, 36772, 2376, 9176, 1962, 8384, 38002,6386, 3632, 36547,32918,35398,12519,26085,3208, 4177, 39365,7385, 5115, 10976,14540,11199,377, 13973,36496,10975,2509, 12921,27843, - 8473, 38702,5703, 32907,32299,24777,38547,19343,38224,12920,21736,36477,5972, 22380,1939, 16008,14274,13953,20910,18641,7131, 30411,17695,18176,13681,19430,7713, + 8473, 38702,5703, 32907,32299,24777,38547,19343,38224,12920,21736,36477,5972, 22380,1939, 16008,14274,13953,20910,18641,7131, 30411,17695,18176,13681,19430,7713, 32962,12509,37498,20909,13866,34209,3908, 1559, 38279,38682,4045, 33932,35645,42857,28886,1486, 1545, 36819,33932,36447,30581,38128,34709,33627,28767,8212, 36594, 22711,15555,11236,2250, 23730,4399, 18480,15554,9834, 20908,13587,7340, 42857,22710,3224, 35041,12256,38279,33984,37956,16542,38279,11559,33275,27229,25987,19192, 17322,17891,40201,18005,36982,27758,42857,3830, 42857,28927,337, 14491,42856,16030,10709,13372,39107,19429,5736, 4780, 25009,29522,30699,37877,531, 38278,36069, 20907,30580,20906,42856,32392,26431,32852,33004,42856,36819,19702,28885,7504, 15404,1482, 39398,39039,3323, 12379,10458,10488,8211, 10272,10271,13371,19428,22343, 20449,5953, 9327, 5212, 4262, 36829,2822, 15518,35317,33921,15553,23722,9273, 12845,13015,8412, 11510,8623, 8914, 13654,11293,33320,23733,16285,40201,9132, 13370, - 35701,28929,37054,35645,12518,9180, 37089,34256,20905,28884,36331,36028,37709,974, 33400,27003,37647,31960,641, 4202, 7037, 2463, 13162,9361, 6800, 36187,2026, - 3701, 16246,26841,32907,5951, 34516,5349, 10974,4243, 8626, 23835,19427,29448,25408,12160,7614, 21557,35992,16310,11824,1826, 22831,2281, 8545, 30550,1356, 5559, + 35701,28929,37054,35645,12518,9180, 37089,34256,20905,28884,36331,36028,37709,974, 33400,27003,37647,31960,641, 4202, 7037, 2463, 13162,9361, 6800, 36187,2026, + 3701, 16246,26841,32907,5951, 34516,5349, 10974,4243, 8626, 23835,19427,29448,25408,12160,7614, 21557,35992,16310,11824,1826, 22831,2281, 8545, 30550,1356, 5559, 18628,3579, 34359,42856,17898,28816,35494,34607,26442,11859,34709,10487,15233,17303,35856,38651,35224,19426,3361, 16309,28232,5487, 19623,8337, 38278,5431, 24798, 1135, 35646,5604, 4790, 24797,1572, 7034, 42855,19425,42855,10376,37077,42855,1816, 12159,42855,37669,32850,27964,9302, 4683, 2114, 9301, 36134,37957,11792,10044, 14387,3200, 11509,777, 33275,12517,6890, 14386,28064,24990,30491,35119,2986, 5197, 3238, 13366,16482,15846,11305,10309,34932,10043,17181,15304,23668,2702, 23667, 40200,34016,24325,38704,37474,33468,33404,23589,33253,17180,35525,9711, 26358,42854,11160,25523,9847, 30990,16546,38445,2814, 25299,7123, 11802,10973,21517,13575, - 32896,9456, 11235,3614, 8210, 16308,18175,39255,37199,19424,4201, 38014,35645,35645,40200,1025, 16529,8076, 2722, 38706,7951, 36819,38278,34709,33275,38300,5402, - 3496, 4699, 19423,33659,4661, 20930,22715,23856,18399,38458,13369,3500, 2885, 5894, 6735, 32750,37540,18174,10972,2989, 19422,8625, 42854,2691, 5108, 12396,8466, - 8594, 12576,25736,31399,15443,399, 19590,7546, 17476,6157, 10042,3922, 8624, 7216, 5738, 37156,35263,5603, 34233,13368,11234,15552,6156, 14937,13858,1718, 2400, - 8187, 10041,4316, 4594, 17890,40200,15237,15525,33932,42854,35109,13367,8481, 16302,13660,17164,3549, 33028,8075, 10100,16586,4232, 10158,13991,2037, 18041,9994, + 32896,9456, 11235,3614, 8210, 16308,18175,39255,37199,19424,4201, 38014,35645,35645,40200,1025, 16529,8076, 2722, 38706,7951, 36819,38278,34709,33275,38300,5402, + 3496, 4699, 19423,33659,4661, 20930,22715,23856,18399,38458,13369,3500, 2885, 5894, 6735, 32750,37540,18174,10972,2989, 19422,8625, 42854,2691, 5108, 12396,8466, + 8594, 12576,25736,31399,15443,399, 19590,7546, 17476,6157, 10042,3922, 8624, 7216, 5738, 37156,35263,5603, 34233,13368,11234,15552,6156, 14937,13858,1718, 2400, + 8187, 10041,4316, 4594, 17890,40200,15237,15525,33932,42854,35109,13367,8481, 16302,13660,17164,3549, 33028,8075, 10100,16586,4232, 10158,13991,2037, 18041,9994, 35025,2665, 8623, 13510,4088, 1223, 8344, 4546, 3687, 33251,6732, 16833,3962, 2962, 4915, 17330,1653, 22363,35218,8435, 7253, 12105,25139,21426,16572,23152,27672, 1910, 4243, 2438, 14810,20904,37932,4406, 22209,29664,36819,21491,479, 17179,20903,10831,26616,15362,17178,34395,17177,19421,30072,2480, 16307,8343, 1943, 37089, 7202, 444, 5026, 4241, 38191,20842,1469, 4332, 34587,33304,9466, 36687,1311, 8821, 8480, 4616, 12919,2740, 7974, 2249, 16306,3567, 7103, 13120,2173, 2162, 10026, - 19481,36107,36900,15354,5919, 34512,1805, 20902,16305,10708,38082,6968, 21872,5075, 19773,32978,12162,34986,33990,13554,17620,9336, 21959,25918,6392, 2231, 3397, + 19481,36107,36900,15354,5919, 34512,1805, 20902,16305,10708,38082,6968, 21872,5075, 19773,32978,12162,34986,33990,13554,17620,9336, 21959,25918,6392, 2231, 3397, 3294, 4717, 14152,1375, 8768, 8209, 17219,15371,35421,7976, 10826,7091, 19420,14385,9480, 38127,33597,9455, 37924,38832,4200, 34058,5396, 20284,37437,39377,14321, 16304,37051,5966, 8159, 859, 10317,21413,3356, 37056,16251,6167, 2007, 11479,7923, 2880, 35765,17222,26821,34816,35173,33186,37393,20613,2676, 38212,2966, 17151, 22642,11708,6465, 2680, 35643,9454, 6098, 1351, 22531,32978,2437, 17176,16487,27494,15286,35207,25564,1475, 23248,996, 7413, 7032, 1886, 8767, 15041,6645, 32951, @@ -16001,58 +15996,58 @@ static const unsigned short Ranks[197839] = 10395,33029,8180, 7011, 35230,8074, 35911,36389,18358,10465,36906,29601,18584,33582,34170,6797, 33865,20901,35999,5017, 18173,16021,26578,32286,38706,21433,23058, 23553,16966,38175,6811, 36818,32842,576, 609, 19419,667, 9621, 1631, 9758, 2794, 38024,6921, 35216,19418,12751,2220, 6391, 3652, 36735,11823,3685, 20914,37840, 27053,16302,38301,11233,33108,33161,12058,31813,35645,3495, 1393, 7461, 19417,38973,36694,36816,22636,37597,27247,26690,34025,38842,20225,38995,29788,30347,34131, - 32918,33962,13268,36445,39185,20900,11822,19074,17810,22288,37079,21084,18577,11815,2720, 17005,37052,14347,29637,33139,23787,38278,20899,32801,38042,8928, 8313, + 32918,33962,13268,36445,39185,20900,11822,19074,17810,22288,37079,21084,18577,11815,2720, 17005,37052,14347,29637,33139,23787,38278,20899,32801,38042,8928, 8313, 11103,28098,16031,30981,32955,3592, 10640,1380, 34842,38792,29831,6319, 35245,10022,131, 8324, 34894,38709,29503,20876,24662,38717,2417, 8205, 36519,13346,28434, - 5447, 33250,8869, 20827,89, 9824, 35858,12158,18172,9589, 6825, 5602, 15057,11781,28599,38480,11150,33546,16959,12483,6607, 25066,38813,13823,34951,39098,5893, + 5447, 33250,8869, 20827,89, 9824, 35858,12158,18172,9589, 6825, 5602, 15057,11781,28599,38480,11150,33546,16959,12483,6607, 25066,38813,13823,34951,39098,5893, 2498, 5277, 31610,3515, 7258, 13024,9328, 11945,13134,28357,15335,38277,4578, 34184,18950,19538,36120,33532,5420, 7613, 33021,6390, 3285, 19416,27397,30365,26027, 1481, 2993, 2032, 5383, 6227, 13638,19415,11635,13990,9553, 17792,9020, 2259, 8956, 5780, 17824,33523,33854,34733,9348, 21972,2435, 22736,10679,36392,17636,17490, 37988,19721,37580,37157,38677,11821,34704,31236,15033,4776, 5231, 37258,7568, 8236, 15995,9700, 3159, 26519,36396,29964,7107, 38660,1290, 3698, 34218,27238,12017, 31196,4789, 2646, 10648,37171,17918,34073,38444,34024,10677,11508,8622, 29876,12658,18048,32202,17644,40200,4261, 2505, 17173,7824, 20898,4936, 4086, 6522, 10838, 13713,43, 21475,8927, 12681,10270,16278,13790,8479, 15551,9630, 40199,11410,30081,22919,26608,28399,15855,32230,34317,13704,37651,38037,23962,33516,38422,36785, - 29603,33648,36532,13569,19414,1319, 31090,38277,16301,39310,8299, 20749,36818,6966, 5558, 16279,4736, 8404, 17779,7049, 1564, 551, 5203, 3828, 1499, 8621, 8819, + 29603,33648,36532,13569,19414,1319, 31090,38277,16301,39310,8299, 20749,36818,6966, 5558, 16279,4736, 8404, 17779,7049, 1564, 551, 5203, 3828, 1499, 8621, 8819, 42854,30754,29227,19413,22198,17364,30468,38638,25570,4638, 19412,2553, 9131, 38183,6040, 7950, 19497,10971,10269,20897,33714,34447,5994, 34500,20896,8766, 18454, - 36818,8478, 31041,14111,26227,37960,20895,17065,3031, 5382, 4000, 10121,6570, 24817,6606, 6289, 14934,19614,36478,29518,35038,35837,14865,36128,8477, 35190,9916, + 36818,8478, 31041,14111,26227,37960,20895,17065,3031, 5382, 4000, 10121,6570, 24817,6606, 6289, 14934,19614,36478,29518,35038,35837,14865,36128,8477, 35190,9916, 20132,8202, 18586,1512, 7853, 6283, 36778,5137, 2710, 11232,3904, 7496, 12451,30207,4614, 36591,17975,12288,3907, 27384,20208,33752,25231,8138, 6696, 19114,36019, - 9679, 24424,32492,32774,16331,8405, 7682, 23081,33662,19997,27772,38881,37672,4110, 21932,3939, 37835,3109, 3955, 10049,2681, 1230, 35279,3469, 5901, 3358, 5754, - 34646,7383, 16545,1564, 3747, 5273, 3266, 16988,36514,20943,7784, 19411,13366,35035,5892, 35744,38537,9126, 13857,25186,2491, 37738,1810, 7886, 3423, 1231, 953, + 9679, 24424,32492,32774,16331,8405, 7682, 23081,33662,19997,27772,38881,37672,4110, 21932,3939, 37835,3109, 3955, 10049,2681, 1230, 35279,3469, 5901, 3358, 5754, + 34646,7383, 16545,1564, 3747, 5273, 3266, 16988,36514,20943,7784, 19411,13366,35035,5892, 35744,38537,9126, 13857,25186,2491, 37738,1810, 7886, 3423, 1231, 953, 36475,35916,6775, 2498, 17172,15694,34731,11820,13365,9637, 9095, 20884,15959,24812,10707,36008,30420,2622, 491, 2071, 33971,2423, 1873, 32992,10970,10953,27383, 18258,31265,23434,33275,26015,36818,42853,33274,33932,27337,17432,24136,37878,38277,21320,17956,8895, 38277,16481,10906,35644,983, 34155,33032,38276,20888,38948, 3300, 30045,3742, 1024, 1093, 33800,25029,23932,12674,35821,8631, 38119,13167,38186,19579,19328,23197,32811,5545, 22857,40199,22818,37569,9179, 6544, 28525,42853, - 10969,38276,18171,35710,30579,1728, 21228,40199,40199,9707, 33881,15931,15572,19410,30872,35550,7086, 34894,33448,32166,19054,11414,36172,23870,34993,38235,9846, + 10969,38276,18171,35710,30579,1728, 21228,40199,40199,9707, 33881,15931,15572,19410,30872,35550,7086, 34894,33448,32166,19054,11414,36172,23870,34993,38235,9846, 36620,37879,38997,42853,36924,36224,35644,36133,3200, 22639,18927,24042,17950,28224,33914,10883,30861,34056,13697,311, 38276,38598,26428,15236,3156, 30740,38323, - 7866, 22086,954, 20789,2566, 12470,13364,35938,35502,1718, 3101, 13556,33703,37112,10968,36381,2198, 38053,34708,36375,27325,556, 5918, 31106,1631, 22658,76, + 7866, 22086,954, 20789,2566, 12470,13364,35938,35502,1718, 3101, 13556,33703,37112,10968,36381,2198, 38053,34708,36375,27325,556, 5918, 31106,1631, 22658,76, 26077,39278,42853,40198,36567,18479,25075,36070,36022,18813,34130,19701,36817,38951,38276,8252, 36510,19799,15186,35985,22526,42852,40198,1071, 23739,24772,32788, 26650,40198,4178, 16880,318, 24392,731, 2041, 23547,29364,7767, 31368,4416, 33064,3955, 20686,5072, 38275,1903, 35644,40198,16300,17378,12176,25986,250, 34708, 1930, 27168,22097,36901,15042,20519,20561,20888,998, 37145,18748,37036,20186,26858,11819,25469,38106,29295,16834,15550,24887,24153,30366,10722,34081,8160, 22429, 29266,2655, 5820, 17171,8765, 23166,31790,10356,4946, 545, 7481, 18236,35109,38475,18195,37492,13238,16196,3892, 19726,36862,18549,22676,33944,13846,28140,28247, 12077,3367, 32925,8168, 35401,24513,17600,3892, 34216,17170,21706,23771,20894,38273,36616,13612,16299,4572, 9946, 20893,11950,22406,38880,4040, 38314,35263,12516, - 35448,10268,20892,18170,4344, 38766,11830,15549,3341, 20891,37763,19671,11231,33358,16298,17169,37427,17168,12562,4334, 16297,8476, 28802,7949, 7407, 16296,5254, + 35448,10268,20892,18170,4344, 38766,11830,15549,3341, 20891,37763,19671,11231,33358,16298,17169,37427,17168,12562,4334, 16297,8476, 28802,7949, 7407, 16296,5254, 13707,23875,35320,5641, 37273,36817,32295,33274,38051,32921,5844, 35644,414, 2964, 359, 25308,27232,609, 37021,40197,6, 32859,25709,21520,2701, 255, 15064, 42852,32491,2086, 40197,3343, 22641,9361, 36858,306, 22829,15548,1092, 926, 17454,577, 37137,33931,38275,40197,10213,42852,3585, 34708,18240,16095,40197,42852, 24489,543, 19067,856, 32490,34112,19874,42851,12766,38275,38275,22709,32795,33315,25862,35252,33636,30427,36817,2373, 24796,2215, 26353,40196,33274,4090, 36817, 38274,37446,34332,35643,22898,21398,33872,3212, 36058,29999,37507,26509,26928,42851,12659,16868,1877, 36816,36816,36628,42851,42851,6121, 33274,27812,18823,23666, 11351,30578,16029,19715,36816,35613,32489,21894,35442,8820, 17139,26531,16086,10112,36816,42850,42850,5701, 29426,21893,5279, 19370,29813,14515,19053,35871,21109, 16447,37322,32743,16879,10513,36815,7993, 24795,36815,32331,12186,26962,11048,36219,706, 23801,14614,34158,2700, 603, 9387, 38437,42850,33084,32059,40196,36815, - 2516, 40196,22116,10995,24414,20379,10015,2292, 9599, 16172,25962,1693, 39292,31468,9291, 17519,33434,33398,246, 10647,3610, 5998, 709, 35643,7417, 21664,3213, + 2516, 40196,22116,10995,24414,20379,10015,2292, 9599, 16172,25962,1693, 39292,31468,9291, 17519,33434,33398,246, 10647,3610, 5998, 709, 35643,7417, 21664,3213, 40196,14514,5010, 11722,12714,32566,7278, 10746,22051,29883,37866,375, 5953, 20506,35066,30313,33128,33473,39229,143, 28883,14384,5183, 13405,2949, 38139,39318, 23260,15531,23438,6734, 2620, 18489,15295,4753, 35221,30359,21933,37913,2188, 35643,17635,29499,36213,35236,17548,19523,35871,31792,12261,13380,36668,2572, 34952, - 39174,36063,33350,38710,37460,38649,34590,9793, 9403, 19267,19493,37994,19957,36861,14558,12518,353, 1671, 9362, 15269,10295,40195,40195,33931,931, 25653,9764, - 12520,590, 15547,33872,34199,31944,28413,36815,25048,23937,11655,33725,696, 13631,921, 20986,24788,658, 5628, 35503,35520,31574,3364, 38032,23090,32477,5662, + 39174,36063,33350,38710,37460,38649,34590,9793, 9403, 19267,19493,37994,19957,36861,14558,12518,353, 1671, 9362, 15269,10295,40195,40195,33931,931, 25653,9764, + 12520,590, 15547,33872,34199,31944,28413,36815,25048,23937,11655,33725,696, 13631,921, 20986,24788,658, 5628, 35503,35520,31574,3364, 38032,23090,32477,5662, 14045,10658,29455,22185,42850,36828,19052,36304,16513,32958,12688,9825, 17214,6, 1156, 409, 22, 10521,36761,20127,1058, 23337,560, 18830,12560,9674, 35535, - 5810, 6013, 31162,14564,36357,34827,9829, 32333,21334,12890,687, 13737,35742,36725,35643,33774,28329,4895, 33715,8926, 5993, 6155, 38809,29052,15007,2473, 1703, + 5810, 6013, 31162,14564,36357,34827,9829, 32333,21334,12890,687, 13737,35742,36725,35643,33774,28329,4895, 33715,8926, 5993, 6155, 38809,29052,15007,2473, 1703, 35900,38618,25443,10137,15378,16163,34577,9671, 10078,35347,13471,33380,5786, 38162,5704, 38274,42849,8251, 38634,20157,36814,29, 11698,29195,581, 4181, 31508, - 30259,33048,16859,30577,12684,38531,12918,37102,20893,40195,9833, 4081, 33931,26554,35362,40195,4049, 21101,25678,36909,10442,21064,33573,35642,26826,42849,7454, + 30259,33048,16859,30577,12684,38531,12918,37102,20893,40195,9833, 4081, 33931,26554,35362,40195,4049, 21101,25678,36909,10442,21064,33573,35642,26826,42849,7454, 38315,28299,36814,25985,38857,38274,38274,20890,22671,34304,36814,34873,532, 250, 14466,25652,32931,19230,2397, 36814,42849,40194,39358,8395, 36397,32932,37352, 17964,32965,14987,23192,32488,1775, 2350, 18047,14480,34609,27830,23665,14403,33931,36516,34699,42849,31796,35642,2786, 42848,30576,26052,12519,9993, 40194,23059, 1393, 32856,3571, 12031,3441, 28882,17344,37686,1043, 1034, 28521,6020, 14933,23664,40194,1199, 11887,17843,14383,740, 32208,34068,42848,35678,655, 35841,34195, 34593,34708,16446,26251,40194,33273,12866,40193,25984,11152,15634,9759, 183, 10142,38273,33930,38273,24794,42848,42848,24976,20289,36634,16462,31506,22665,18768, 16295,18458,39039,20886,35236,22802,12869,37074,32936,10780,42847,7508, 42847,33930,35642,38273,21108,33389,38815,3101, 34618,11312,35122,38845,37836,2905, 39392, 9056, 38273,20707,32062,22680,39400,33260,19051,20889,16878,10429,35089,5084, 12157,14932,16977,13862,7845, 36684,37762,13117,23228,11958,14167,34431,21876,26261, - 29182,14216,18926,24281,28948,7379, 23481,26675,34525,37064,20609,36732,26359,38519,42847,4820, 20090,40193,17204,42847,19862,27393,42846,9453, 18706,19176,5525, + 29182,14216,18926,24281,28948,7379, 23481,26675,34525,37064,20609,36732,26359,38519,42847,4820, 20090,40193,17204,42847,19862,27393,42846,9453, 18706,19176,5525, 17167,20887,29096,39006,42846,20886,28881,22122,24221,3938, 34151,40193,37537,39065,36813,35995,18478,4844, 40193,29863,2504, 35925,38272,2550, 25332,14382,36732, 1709, 37531,36048,33273,40192,15546,22871,2904, 36912,33930,6930, 38375,2741, 1581, 42846,985, 53, 14916,8609, 18611,13365,12625,10126,13045,30845,29898,26875, - 14736,28475,26388,31386,23461,40192,1615, 13856,22426,21137,280, 4239, 30320,14931,32953,13961,19041,32296,8874, 7948, 9525, 1855, 38272,3431, 8836, 14930,1227, - 36430,5734, 42846,27537,26036,31048,35898,23260,16294,2082, 219, 28570,6398, 28637,25066,26699,38272,16293,9130, 40192,28880,871, 4002, 27968,26016,7929, 1242, + 14736,28475,26388,31386,23461,40192,1615, 13856,22426,21137,280, 4239, 30320,14931,32953,13961,19041,32296,8874, 7948, 9525, 1855, 38272,3431, 8836, 14930,1227, + 36430,5734, 42846,27537,26036,31048,35898,23260,16294,2082, 219, 28570,6398, 28637,25066,26699,38272,16293,9130, 40192,28880,871, 4002, 27968,26016,7929, 1242, 25757,40192,35642,42845,40191,38272,28879,3409, 20601,30124,3289, 34833,20885,33094,15844,2262, 42845,9747, 12, 1831, 10653,31720,3199, 27529,27940,23659,14381, 4554, 38271,21194,12262,19457,603, 38250,7764, 119, 2459, 18393,19094,15079,30051,17127,36813,7586, 30735,25664,31514,9474, 21529,35641,6575, 40191,42845,38271, 212, 1542, 33930,42845,671, 13852,2908, 34707,19700,36813,17538,30575,34707,19699,14380,2372, 37223,36813,1228, 12740,1186, 86, 372, 2627, 2425, 36812,19698, @@ -16066,10 +16061,10 @@ static const unsigned short Ranks[197839] = 36811,42841,12030,38269,34625,15288,16306,23853,36220,36353,10431,20188,35740,16292,7673, 2626, 38563,32819,21747,36453,2903, 11013,42841,37662,32484,34705,14928, 42841,30203,2219, 17141,3737, 757, 18648,26534,1166, 8843, 6486, 32860,37806,486, 22659,33867,35301,704, 42840,34735,12345,13771,26608,30734,648, 3220, 35535, 677, 38900,42840,4705, 1, 22241,2817, 14526,799, 26677,13197,16205,4117, 27519,29726,7798, 25078,12293,20117,26529,16088,25524,15387,14035,31985,31019,15621, - 27146,8078, 1999, 2424, 12794,14705,9004, 27384,25394,27938,27450,32717,20017,28345,25345,1859, 13119,18054,14179,4603, 42840,33057,9864, 9159, 24516,27504,861, - 42840,711, 21453,33098,146, 2854, 31652,13941,32946,31290,13280,11116,4085, 3502, 20455,1513, 40190,30573,42839,36811,35071,831, 29000,3562, 1705, 30794,1684, + 27146,8078, 1999, 2424, 12794,14705,9004, 27384,25394,27938,27450,32717,20017,28345,25345,1859, 13119,18054,14179,4603, 42840,33057,9864, 9159, 24516,27504,861, + 42840,711, 21453,33098,146, 2854, 31652,13941,32946,31290,13280,11116,4085, 3502, 20455,1513, 40190,30573,42839,36811,35071,831, 29000,3562, 1705, 30794,1684, 10267,3134, 9128, 8042, 30947,33900,35513,38269,8924, 34705,30958,23160,26131,29101,40189,38129,332, 11868,25731,430, 22399,36810,1842, 23663,38104,25036,29392, - 20378,9445, 2661, 21144,40189,17889,32483,36810,40189,10441,35640,11350,34705,35640,36810,30572,40189,77, 3287, 16291,19049,32482,36810,40188,2740, 1347, 4616, + 20378,9445, 2661, 21144,40189,17889,32483,36810,40189,10441,35640,11350,34705,35640,36810,30572,40189,77, 3287, 16291,19049,32482,36810,40188,2740, 1347, 4616, 25983,1045, 906, 2999, 518, 1822, 2779, 2064, 27443,45, 7608, 2202, 25151,2144, 2002, 541, 7855, 1790, 25032,10628,34551,37955,14927,38269,36809,3501, 28878, 66, 22884,33273,38269,12255,329, 3362, 9845, 34705,32010,1372, 566, 19409,411, 33273,2784, 25982,27340,34745,25981,2298, 3876, 19408,14926,38268,28877,36809, 36809,9442, 38268,14925,20882,24425,42839,35640,16921,28876,3856, 2484, 837, 25060,40188,28875,2739, 42839,1270, 40188,35669,15235,880, 32931,34704,42839,28874, @@ -16078,10 +16073,10 @@ static const unsigned short Ranks[197839] = 3584, 42837,21107,9572, 42837,461, 10365,29234,7173, 10706,448, 18844,35554,36808,35639,8341, 38146,17887,35639,991, 3660, 7197, 38267,27334,5682, 40186,24792, 18476,2988, 5730, 40186,40186,34545,1255, 8143, 23662,42837,35639,30714,14000,6573, 35168,42837,37116,25978,35638,42836,30569,211, 8776, 14907,40186,42836,42836, 42836,33929,40185,38267,30384,32481,35638,13855,2110, 20800,25035,34749,23453,36389,4231, 20881,42835,5957, 34762,12765,40185,14513,33484,42835,28750,35826,36808, - 915, 33678,27333,40185,40185,42835,16211,22443,38267,10619,21891,21703,35638,10440,23661,26200,32480,768, 34703,1907, 16445,19696,682, 32479,42835,17166,492, + 915, 33678,27333,40185,40185,42835,16211,22443,38267,10619,21891,21703,35638,10440,23661,26200,32480,768, 34703,1907, 16445,19696,682, 32479,42835,17166,492, 25324,32478,35738,8923, 38267,20581,36634,40184,25977,19695,36808,588, 40184,33928,38266,27599,42834,36875,8475, 34642,42834,17886,38266,11349,38266,42834,42834, - 42833,38266,27332,35390,42833,35638,27662,929, 25023,21275,182, 32782,2104, 29297,17612,26215,18714,24880,28562,38267,17543,24, 32898,1331, 25292,15413,8310, - 23602,14130,23746,31547,18316,19327,18386,29598,29838,11778,18008,15690,27116,30805,25857,28137,32859,16856,17416,18035,16995,7348, 17393,32905,18065,11439,169, + 42833,38266,27332,35390,42833,35638,27662,929, 25023,21275,182, 32782,2104, 29297,17612,26215,18714,24880,28562,38267,17543,24, 32898,1331, 25292,15413,8310, + 23602,14130,23746,31547,18316,19327,18386,29598,29838,11778,18008,15690,27116,30805,25857,28137,32859,16856,17416,18035,16995,7348, 17393,32905,18065,11439,169, 29887,7282, 16694,29713,28873,35637,40184,33497,4179, 21691,33928,42833,42833,40184,36448,34156,34703,35947,30022,39156,38353,32584,36579,23076,33237,32477,40183, 35637,42832,28330,13854,34450,1718, 33685,17165,20880,24791,6508, 36807,33272,37276,30568,36807,40183,34703,38265,38265,42832,33928,2421, 19011,33488,13624,25093, 9297, 38265,11204,36807,42832,17251,5203, 33198,40183,27331,42832,32497,35637,37189,36856,7092, 220, 24432,42831,34739,18169,36803,3591, 33169,26160,17885,25542, @@ -16091,13 +16086,13 @@ static const unsigned short Ranks[197839] = 1112, 26606,15052,12968,8208, 13594,15010,33079,2227, 24275,22541,31951,35575,5606, 8500, 18427,19781,17196,37876,18652,18308,28446,8296, 38633,22736,30425,17615, 23091,32256,32943,12013,24126,8220, 20879,871, 34334,2634, 58, 1297, 40182,7507, 21890,40182,36807,42831,1484, 2902, 2371, 16444,3100, 1414, 189, 33927,32475, 2948, 723, 613, 28871,7339, 13126,29582,35637,2818, 1009, 198, 40182,30427,3736, 355, 454, 644, 42831,32474,15716,42830,12518,42830,3357, 19048,36806,25976, - 17633,40182,6464, 36949,34268,38264,38790,20720,27328,42830,42830,42829,792, 26953,42829,33545,15418,20878,34703,2136, 28118,33054,32431,31976,38264,6952, 9414, + 17633,40182,6464, 36949,34268,38264,38790,20720,27328,42830,42830,42829,792, 26953,42829,33545,15418,20878,34703,2136, 28118,33054,32431,31976,38264,6952, 9414, 10233,27860,37071,22708,34702,31565,39403,36806,10967,16290,28429,1525, 18102,24963,16346,10351,5891, 6692, 21338,12003,38752,36347,18168,5360, 37491,16289,20877, 37809,16288,31767,28335,9850, 1501, 16287,26689,10787,13363,117, 14931,25347,19195,19248,13262,30522,5053, 15636,24790,821, 3141, 19047,1372, 3984, 411, 32780, 33926,29502,115, 24843,16876,26752,3583, 42829,38264,8718, 17146,18475,30, 6600, 26724,8045, 38264,1098, 36806,8586, 530, 42829,33272,25975,32768,12916,28870, 24415,23407,33214,40181,17341,36806,18090,5670, 35125,29989,17449,40181,40181,14952,36809,42828,42828,36654,7603, 37694,38263,33815,12764,38263,12254,5601, 38263, 24789,19046,27296,18167,34702,42828,40181,9441, 5536, 14002,3566, 9657, 3607, 5275, 12044,7136, 20876,42828,36805,32473,20087,35636,32904,37380,38263,35636,37048, - 18407,40180,4619, 36535,36805,42827,33272,11008,42827,462, 29805,1004, 42827,3361, 35636,38262,27327,42827,33927,40180,24788,2738, 3099, 2026, 1444, 1963, 3659, + 18407,40180,4619, 36535,36805,42827,33272,11008,42827,462, 29805,1004, 42827,3361, 35636,38262,27327,42827,33927,40180,24788,2738, 3099, 2026, 1444, 1963, 3659, 35636,2168, 2660, 537, 1361, 24544,2316, 38262,2123, 40180,36805,24787,36805,11791,79, 15234,20875,4978, 17855,3012, 32502,432, 8269, 29719,31544,5091, 27969, 32472,2201, 3429, 40180,11348,22707,33272,1512, 12517,1461, 260, 3922, 11628,6, 6025, 1779, 33271,3154, 14169,247, 40179,21106,42826,38262,276, 2038, 15612, 17585,11404,16858,24069,13144,27571,11714,31214,33134,19406,12605,42826,40179,27326,9478, 40179,235, 31983,3609, 34702,36984,38262,10786,35635,38261,36804,24786, @@ -16114,42 +16109,42 @@ static const unsigned short Ranks[197839] = 23053,30024,7759, 2258, 2703, 3263, 804, 37398,38464,30564,15268,1495, 3604, 33270,33270,21889,34700,33656,16285,13279,29097,21311,17602,26774,33692,21648,42823, 39161,11715,19635,32874,25703,42823,26111,30787,27787,11557,38260,24767,37793,7422, 36191,7146, 34303,3233, 33301,33385,9721, 13034,33241,38580,3603, 38782,36803, 22619,36584,18500,37066,38774,9415, 30884,13853,9635, 6605, 31733,18165,18375,7196, 21015,3612, 32970,11345,21104,10483,20872,31902,14377,17164,10009,26754,32175, - 8033, 8723, 37122,25945,33842,22924,35488,35912,19694,4525, 16876,38260,159, 7947, 553, 15981,23660,27147,14376,148, 9631, 11238,22804,24672,6296, 1601, 3816, + 8033, 8723, 37122,25945,33842,22924,35488,35912,19694,4525, 16876,38260,159, 7947, 553, 15981,23660,27147,14376,148, 9631, 11238,22804,24672,6296, 1601, 3816, 26140,24750,25683,1567, 26201,22391,11898,20659,22602,35508,13554,250, 36803,27322,35634,5777, 33926,10057,5016, 36803,12915,13275,15668,29264,15175,36186,15651, - 14168,32789,240, 20871,15543,40178,32610,97, 1832, 32910,22556,9006, 10495,32661,27877,20910,22949,13201,18461,15819,14203,15216,18754,18962,28531,28724,5696, + 14168,32789,240, 20871,15543,40178,32610,97, 1832, 32910,22556,9006, 10495,32661,27877,20910,22949,13201,18461,15819,14203,15216,18754,18962,28531,28724,5696, 26731,14921,2167, 2081, 20969,35833,19514,27321,36844,38940,33926,18474,3301, 3788, 5966, 18164,34631,42823,37925,34867,37248,37872,35453,36462,24461,36803,36802, 18473,6393, 32524,14138,3735, 32876,32470,36873,29797,33925,4287, 10706,9125, 34856,3353, 36802,42823,42822,40177,36802,30310,12843,36802,40177,23251,26458,10617, 42822,34453,23659,32957,12909,29165,24107,5381, 10266,8829, 36599,11528,34387,10966,25974,32992,33750,11699,30347,32901,32797,32954,31851,23482,30105,10385,12089, 13373,17950,32966,21443,23191,25259,27131,21417,12577,24212,19891,32912,32902,33086,4847, 3077, 22941,12421,19150,21253,11385,27522,15130,16066,19762,20364,12648, - 37539,17918,33669,23836,26312,246, 15074,37839,6925, 32469,14375,21823,62, 1876, 2997, 36801,1423, 42822,164, 317, 23156,147, 27346,30706,2736, 33925,6429, + 37539,17918,33669,23836,26312,246, 15074,37839,6925, 32469,14375,21823,62, 1876, 2997, 36801,1423, 42822,164, 317, 23156,147, 27346,30706,2736, 33925,6429, 22356,16505,496, 3499, 25973,219, 17624,12797,39106,2669, 24784,32772,18472,17163,1547, 18158,30475,18163,21888,34662,38819,579, 38260,13288,22705,30563,34700, 5028, 13527,33925,3292, 13362,20870,8205, 27597,17162,35633,39016,9183, 2122, 42822,15912,328, 626, 32979,33925,32468,35373,37068,36801,378, 51, 4498, 32973, 2396, 18365,7924, 4320, 20311,11955,33270,34700,5093, 18448,42821,129, 2342, 1210, 1436, 42821,5202, 17901,28869,36163,38259,42821,22704,36801,13361,15913,32919, - 22683,532, 1716, 3360, 276, 15655,18299,22615,32927,32455,23448,28658,24783,4894, 28995,42821,37018,12513,37224,6153, 36215,35475,16284,42820,5154, 30802,2624, + 22683,532, 1716, 3360, 276, 15655,18299,22615,32927,32455,23448,28658,24783,4894, 28995,42821,37018,12513,37224,6153, 36215,35475,16284,42820,5154, 30802,2624, 33818,40177,3127, 461, 13723,3219, 2563, 6128, 24782,33270,24781,38259,33924,8827, 3223, 42820,5589, 10325,27764,42820,36801,30562,2, 19026,5875, 26455,11760, - 8098, 4736, 10421,30622,32074,29864,20286,22587,32375,18434,1725, 22119,22686,24461,16887,27630,17949,2817, 22991,314, 606, 2751, 30630,32176,4778, 24003,3940, + 8098, 4736, 10421,30622,32074,29864,20286,22587,32375,18434,1725, 22119,22686,24461,16887,27630,17949,2817, 22991,314, 606, 2751, 30630,32176,4778, 24003,3940, 8899, 4857, 24780,1715, 3098, 4474, 35633,40177,681, 30561,42820,42819,30812,38259,32861,10877,9649, 1197, 251, 25358,32395,95, 4198, 28957,5420, 14380,17419, 15995,22784,24330,19693,32975,12526,538, 37606,5083, 27320,40176,3286, 22824,12907,2, 4189, 16197,22789,29111,34264,22703,37847,32467,199, 42819,4657, 12676, 42819,22511,24355,9458, 35065,9440, 1821, 33269,3734, 747, 311, 1321, 36495,26621,13851,1638, 3556, 1097, 16283,36800,3872, 5640, 26314,20869,38065,14953,14255, 24388,31658,32466,759, 13664,34700,883, 2787, 22424,13743,23399,33014,18516,13234,15178,24475,33038,30702,21797,2340, 1839, 20868,42819,12155,34699,1783, 12919, 31872,37369,2623, 1520, 590, 42818,25972,25365,37194,16027,2062, 12512,35207,7763, 42818,8474, 3153, 36800,25971,14920,3081, 30560,13852,12253,27319,42818,40176, - 1524, 25148,30880,19404,8073, 13274,2782, 1674, 33924,5157, 42818,33269,27021,32196,152, 2515, 804, 32850,28868,673, 22702,29654,36800,6469, 55, 10982,329, + 1524, 25148,30880,19404,8073, 13274,2782, 1674, 33924,5157, 42818,33269,27021,32196,152, 2515, 804, 32850,28868,673, 22702,29654,36800,6469, 55, 10982,329, 7251, 33924,33269,40176,42817,19403,2996, 1978, 2025, 4, 3491, 32170,25280,19303,38217,14374,36800,10860,20867,37776,6477, 3658, 36457,40176,40175,38806,35633, 36799,581, 3097, 25970,25969,26936,1630, 1342, 35633,4353, 19017,29976,14918,19374,22130,28844,38919,36224,10438,15457,38259,13466,33183,34574,24867,16426,11683, 32965,34260,20268,38258,21103,24891,33924,7585, 33269,35290,18075,36322,3555, 38622,16443,32, 30333,16644,1821, 29348,15605,11593,17742,24713,5829, 27239,16568, - 195, 24779,32791,20778,26566,30490,20459,24316,33888,9275, 34749,13675,38258,14859,17560,19402,34484,42817,21887,896, 42817,15542,8457, 36799,24074,16363,168, - 23757,32023,13210,1487, 3459, 31371,40175,25422,32189,23441,38745,34427,36799,42817,40175,19044,35589,36796,37324,13082,28, 19731,23241,32979,22167,39188,712, - 841, 20267,453, 3428, 40175,27592,19107,10631,9026, 2024, 10460,6631, 9, 3975, 15497,26806,17158,23857,29118,3997, 1450, 121, 38258,32960,10966,38258,6178, + 195, 24779,32791,20778,26566,30490,20459,24316,33888,9275, 34749,13675,38258,14859,17560,19402,34484,42817,21887,896, 42817,15542,8457, 36799,24074,16363,168, + 23757,32023,13210,1487, 3459, 31371,40175,25422,32189,23441,38745,34427,36799,42817,40175,19044,35589,36796,37324,13082,28, 19731,23241,32979,22167,39188,712, + 841, 20267,453, 3428, 40175,27592,19107,10631,9026, 2024, 10460,6631, 9, 3975, 15497,26806,17158,23857,29118,3997, 1450, 121, 38258,32960,10966,38258,6178, 12864,1212, 7506, 383, 16748,25038,31335,10785,18966,40174,23120,4708, 38, 26229,16803,31711,2631, 28187,28116,9344, 30781,25667,13496,30494,22714,28479,30562, - 26032,32274,753, 31901,42816,40174,513, 16240,26482,38257,13594,38635,4259, 2249, 957, 2781, 38107,33516,13837,28867,24734,35632,6288, 40174,40174,20866,639, + 26032,32274,753, 31901,42816,40174,513, 16240,26482,38257,13594,38635,4259, 2249, 957, 2781, 38107,33516,13837,28867,24734,35632,6288, 40174,40174,20866,639, 35632,35860,42816,42816,18162,6453, 25493,35634,40173,35632,8184, 9451, 24779,9178, 887, 39215,2704, 1573, 10108,3135, 3211, 38257,27318,1874, 26284,15879,31223, - 15778,34645,7178, 42816,35404,18161,32304,3427, 18449,32465,37029,35379,21102,38148,42815,12511,31678,30405,36799,1232, 36940,33923,7762, 16026,15023,24916,227, + 15778,34645,7178, 42816,35404,18161,32304,3427, 18449,32465,37029,35379,21102,38148,42815,12511,31678,30405,36799,1232, 36940,33923,7762, 16026,15023,24916,227, 15956,3359, 11347,49, 9714, 1389, 2096, 36113,8103, 34347,42815,720, 21101,42815,19043,5891, 9977, 7946, 6770, 34495,38444,35765,8577, 35814,40173,16304,12029, - 30559,19687,23348,25115,14248,39194,1377, 13688,29040,1842, 18059,26295,32830,4212, 27258,20152,29707,39001,16282,19744,19890,10515,40173,52, 354, 20155,9383, + 30559,19687,23348,25115,14248,39194,1377, 13688,29040,1842, 18059,26295,32830,4212, 27258,20152,29707,39001,16282,19744,19890,10515,40173,52, 354, 20155,9383, 26780,30326,18373,34135,42815,17398,135, 8625, 29343,22185,20670,28431,21886,21100,581, 40173,38257,16999,42814,32819,25968,42814,35973,33923,40172,35632,32838, - 35164,3864, 34557,35826,36798,42814,42814,36798,35746,19042,28866,34550,35253,8073, 25111,34106,4400, 6733, 1541, 919, 16680,24413,36071,18878,711, 4966, 4893, + 35164,3864, 34557,35826,36798,42814,42814,36798,35746,19042,28866,34550,35253,8073, 25111,34106,4400, 6733, 1541, 919, 16680,24413,36071,18878,711, 4966, 4893, 16281,19516,2190, 26493,2460, 1744, 5177, 8922, 942, 28502,28865,2687, 35177,5279, 29404,1789, 29703,64, 3951, 6344, 13105,16442,764, 69, 40172,16437,17882, - 28864,42813,36798,42813,35631,36798,42813,11299,12252,34699,40172,35838,38257,33019,37644,2426, 20484,39163,19735,20687,12914,9124, 22863,33835,7047, 11245,5416, + 28864,42813,36798,42813,35631,36798,42813,11299,12252,34699,40172,35838,38257,33019,37644,2426, 20484,39163,19735,20687,12914,9124, 22863,33835,7047, 11245,5416, 37710,36832,33923,11817,9450, 28812,22893,36797,16025,34937,10616,34699,35886,1159, 13138,12755,30667,32251,11816,20239,13166,8921, 16659,4085, 13650,33268,16016, 8473, 39380,14654,29254,20242,29050,27541,20865,13360,6226, 28863,42813,30538,27319,35631,38256,3218, 2451, 27188,40172,3217, 19401,724, 1264, 89, 5975, 17245, 31543,254, 16254,790, 32629,2659, 1756, 1178, 768, 10293,39076,24778,26357,22021,52, 3806, 27685,33015,16633,3285, 16729,4116, 2370, 11609,870, 1733, 30117, @@ -16161,8 +16156,8 @@ static const unsigned short Ranks[197839] = 21371,28250,6143, 16875,5963, 35193,27170,2514, 29953,17503,38256,19399,1933, 34698,9992, 12632,42812,16280,24285,4397, 8472, 16441,12251,5583, 18960,3498, 34284, 15541,9332, 7612, 42811,33259,33922,35324,18159,7541, 27152,38987,21099,36753,17219,21098,20878,523, 5580, 6235, 33219,34207,10597,6841, 26643,25967,34697,28861, 34697,6050, 42811,20815,31833,38256,34697,24776,40170,11900,16440,30557,33922,38865,9818, 9708, 12250,40170,33268,33922,28587,27316,33921,20143,30006,12154,36796, - 35578,38256,42811,38255,10344,22775,40170,2496, 15985,5772, 8683, 8366, 38362,15542,23658,42811,33268,36269,42810,20503,7945, 9448, 42810,40170,1303, 27204,4084, - 35853,10139,36796,26793,37503,15540,16, 3467, 2980, 27583,12039,3152, 42810,40169,1632, 32966,36796,11257,22701,25391,15503,17587,5981, 42810,20785,563, 5654, + 35578,38256,42811,38255,10344,22775,40170,2496, 15985,5772, 8683, 8366, 38362,15542,23658,42811,33268,36269,42810,20503,7945, 9448, 42810,40170,1303, 27204,4084, + 35853,10139,36796,26793,37503,15540,16, 3467, 2980, 27583,12039,3152, 42810,40169,1632, 32966,36796,11257,22701,25391,15503,17587,5981, 42810,20785,563, 5654, 26289,6678, 32071,34865,32528,36342,10040,37770,7364, 24417,4716, 7823, 3004, 11230,56, 23021,2192, 22041,15763,9839, 24382,30287,32939,31343,961, 29523,19246, 6977, 630, 25092,35630,11526,16439,40169,9439, 33268,27087,23027,38255,1050, 28524,32988,20282,27103,3720, 14746,37615,16892,10912,20374,35199,37660,2142, 36795, 30567,32990,35630,17948,26872,35431,3798, 8797, 11379,19897,36230,582, 36795,20864,8763, 26019,19672,36356,35085,19273,38939,40169,22383,38288,30691,24221,34870, @@ -16187,7 +16182,7 @@ static const unsigned short Ranks[197839] = 38245,34695,33265,14167,16041,19395,34694,40162,40162,33315,37043,36001,24850,36791,35624,36791,37543,33265,33796,33920,27552,40162,30551,25959,36791,32457,38245, 40161,28856,40161,33919,32807,33919,22155,40161,40161,36084,40160,38245,34694,32839,15065,34781,36522,21177,3358, 2622, 12484,27311,28855,17339,27686,36790,28882, 13911,7944, 3151, 25958,30550,33919,33427,24772,33122,33491,14757,5313, 35624,38873,37388,36790,26212,40160,38482,42798,31273,32891,29919,17452,37809,40160,39363, - 39330,10708,13550,17880,40160,27447,33007,38244,9138, 34415,37685,38244,42797,17338,32840,40159,19035,20862,27310,19903,37358,1317, 26551,38316,35322,36790,6159, + 39330,10708,13550,17880,40160,27447,33007,38244,9138, 34415,37685,38244,42797,17338,32840,40159,19035,20862,27310,19903,37358,1317, 26551,38316,35322,36790,6159, 1950, 38602,28397,11074,16892,3778, 3150, 24369,29319,5871, 38244,16438,33069,36790,33919,36789,36306,42797,2680, 7037, 37294,35623,34823,32456,35358,34694,17467, 13850,42797,34694,22699,14511,40159,8044, 42797,40159,36789,42796,36855,28500,38619,7584, 21882,12587,33264,20373,30549,19034,34693,35095,33383,40159,36789,38244, 33264,42796,19042,10138,24634,18064,42796,13583,33918,19691,33174,42796,35623,32791,9261, 15080,24879,29731,40158,12058,20372,36789,12988,9843, 33264,36788,33390, @@ -16201,12 +16196,12 @@ static const unsigned short Ranks[197839] = 18135,16124,40155,11158,36786,42792,35622,35622,42791,23653,33918,10965,38242,33263,40155,29833,32447,36786,42791,38242,36282,22697,35594,27308,40155,10159,10039, 37431,7215, 32316,371, 10266,21395,42791,35393,4428, 40154,36166,37920,25069,38242,12798,42791,42790,34691,35446,34510,37985,32827,34669,34631,20861,17158,36786, 27501,36294,23652,10784,33002,34314,35724,7053, 42790,14781,9926, 38416,1804, 18531,42790,6056, 35621,36785,9816, 10137,33263,32988,34691,14919,38981,1003, 18487, - 37156,32446,40154,32445,40154,20781,30546,37545,33918,36785,9438, 36785,34691,40154,35621,28836,31312,35621,18328,38945,10750,13025,42790,27214,8203, 703, 3096, + 37156,32446,40154,32445,40154,20781,30546,37545,33918,36785,9438, 36785,34691,40154,35621,28836,31312,35621,18328,38945,10750,13025,42790,27214,8203, 703, 3096, 26983,10394,16389,19551,40153,33917,28853,28587,13, 3815, 18459,17368,2899, 32789,18157,14173,26597,19394,25919,2200, 8946, 33917,33917,22490,35621,401, 37453, - 1580, 38241,18156,9405, 3426, 32823,34400,30875,18197,21588,516, 21276,553, 17660,2621, 15027,36785,6288, 3282, 18105,1426, 13756,26193,34691,38241,213, 360, + 1580, 38241,18156,9405, 3426, 32823,34400,30875,18197,21588,516, 21276,553, 17660,2621, 15027,36785,6288, 3282, 18105,1426, 13756,26193,34691,38241,213, 360, 19949,15233,2513, 38241,1776, 36784,42789,25173,15610,42789,35425,28502,20086,22995,12912,16278,11644,29567,36291,39274,38241,23749,16871,22696,33245,11345,10202, 33177,17332,33365,2898, 3425, 2395, 14480,36521,15207,26307,28417,38330,34690,36784,33263,2341, 10965,35620,10435,21301,27877,33667,36263,42789,4104, 42789,17879, - 4810, 19689,40153,33917,34690,14918,6019, 22387,1222, 29730,31424,3733, 28353,2238, 17366,3149, 26882,33256,22688,33325,1470, 1172, 19790,39005,37732,35620,6120, + 4810, 19689,40153,33917,34690,14918,6019, 22387,1222, 29730,31424,3733, 28353,2238, 17366,3149, 26882,33256,22688,33325,1470, 1172, 19790,39005,37732,35620,6120, 37271,33414,42788,34690,38240,35620,20860,40153,32444,38240,8826, 33262,12908,23329,40153,30545,42788,2866, 33916,13358,38240,42788,2001, 35620,1605, 1052, 42788, 42787,3656, 19356,36784,36784,35248,36783,13024,13848,33262,42787,35619,37109,12733,36895,15512,33262,18470,30544,36783,16576,37598,35642,27158,39000,38076,32775, 15361,18895,34690,18225,25909,24831,35619,33262,36566,33535,27297,37456,32122,13215,32287,32236,37246,40152,40152,35986,27307,42787,2780, 38644,2620, 860, 34482, @@ -16215,48 +16210,48 @@ static const unsigned short Ranks[197839] = 30605,15699,38239,28851,36782,14873,30019,38239,42785,42785,36782,4315, 36782,10964,25954,42785,27305,11183,1694, 36782,26860,28850,37182,40151,36781,19033,33916, 8043, 21093,32128,32443,40151,36781,38238,1388, 36781,33261,10334,40151,28849,36781,20671,2274, 27304,33916,35618,34689,35777,38238,35618,28848,27303,38238,35618, 24771,31215,32442,35618,35617,6223, 33916,42784,11344,36780,38238,32441,40151,5633, 40150,38237,33575,35779,35649,42784,33915,34802,42784,8954, 28847,35438,42784, - 42783,33261,33261,7611, 24807,13001,37822,23506,35318,36889,10264,727, 11064,18260,38505,11814,3706, 28211,27302,30543,40150,440, 30880,40150,3095, 38237,825, - 2994, 26395,36780,22090,10739,36780,22381,1462, 3576, 14659,36263,7115, 13849,17298,30587,27355,2061, 22694,38273,9307, 2023, 625, 3281, 2483, 38237,42783,3280, - 2166, 3655, 61, 2199, 886, 2482, 952, 36995,802, 34321,36, 1629, 3423, 1744, 32440,9917, 35182,2859, 777, 82, 24548,1775, 71, 5459, 31117,1839, 2049, + 42783,33261,33261,7611, 24807,13001,37822,23506,35318,36889,10264,727, 11064,18260,38505,11814,3706, 28211,27302,30543,40150,440, 30880,40150,3095, 38237,825, + 2994, 26395,36780,22090,10739,36780,22381,1462, 3576, 14659,36263,7115, 13849,17298,30587,27355,2061, 22694,38273,9307, 2023, 625, 3281, 2483, 38237,42783,3280, + 2166, 3655, 61, 2199, 886, 2482, 952, 36995,802, 34321,36, 1629, 3423, 1744, 32440,9917, 35182,2859, 777, 82, 24548,1775, 71, 5459, 31117,1839, 2049, 2588, 191, 2167, 31864,12005,28201,20440,26235,23816,29426,19355,13195,31309,42783,883, 29538,27249,25225,42783,13946,42782,2340, 32922,15487,38760,40150,34646, 5194, 34689,42782,21880,33260,39288,27486,36193,36340,38237,12476,38236,19393,2553, 1617, 293, 9939, 18318,31520,19373,42782,40149,28846,32406,34314,36780,39222, - 32969,16279,34689,42782,36351,8123, 26624,42781,1989, 35617,24897,40149,11086,30698,38970,767, 7550, 22684,22851,30761,40149,25892,1000, 42781,40149,12554,8149, + 32969,16279,34689,42782,36351,8123, 26624,42781,1989, 35617,24897,40149,11086,30698,38970,767, 7550, 22684,22851,30761,40149,25892,1000, 42781,40149,12554,8149, 30542,33260,24770,17156,14166,14165,42781,36779,36779,42781,35617,14539,40148,30541,42780,42780,34688,38236,1454, 33260,33260,811, 5871, 38236,42780,36779,38236, 37530,10136,14849,40148,42780,35617,34107,11222,33316,40148,35616,42779,22693,40148,33259,21879,30540,15618,35960,32363,38648,27301,42779,38248,33247,36779,42779, 39226,6572, 38235,27300,18469,32829,37316,40147,36600,29748,6018, 38235,6222, 42779,42778,25953,40147,21684,23990,32356,34688,16393,15187,7346, 37939,20859,36988, 32756,25952,35616,36293,36778,34311,38188,30539,33915,30553,42778,10378,12516,12153,12515,13023,37101,25951,34265,15297,557, 28845,40147,42778,42778,38235,23066, 42777,35616,267, 10954,8758, 14420,15308,34369,13826,20815,35408,38920,42777,42777,3148, 3357, 785, 33915,31044,330, 7786, 21327,1628, 2339, 2226, 2121, 34688, - 16990,17700,23531,40147,4656, 30660,34674,32806,40146,9437, 7276, 29403,38683,29145,33915,36866,42777,21069,10454,27361,4518, 23498,40146,16974,21403,24160,8010, + 16990,17700,23531,40147,4656, 30660,34674,32806,40146,9437, 7276, 29403,38683,29145,33915,36866,42777,21069,10454,27361,4518, 23498,40146,16974,21403,24160,8010, 38235,7682, 38234,3594, 42776,28844,13765,28843,33126,40146,17337,35786,36013,34866,17206,15538,31837,42776,12974,36937,37733,40146,38443,30174,40145,35387,17878, 28842,36778,36045,32848,17155,22590,37621,37200,28933,2273, 33139,18849,42776,14373,26694,10657,14074,7776, 19151,17265,29137,17811,28604,24665,38105,11476,20646, 34193,34260,6022, 19392,38071,26863,2375, 22225,20200,23286,34360,38971,17886,30763,22790,27627,32681,32875,11555,14164,38234,32439,38234,36175,16870,38234,33914, - 33259,21092,17877,19687,40145,32438,40145,27299,5956, 3458, 13272,14372,40145,40144,13847,30538,34688,35616,21091,19032,42776,1469, 1902, 15570,40144,34787,6507, + 33259,21092,17877,19687,40145,32438,40145,27299,5956, 3458, 13272,14372,40145,40144,13847,30538,34688,35616,21091,19032,42776,1469, 1902, 15570,40144,34787,6507, 42775,23651,20370,42775,21878,13022,40144,30537,36778,36778,42775,40144,17336,2029, 28841,2500, 32437,13848,21877,20858,23650,40143,38233,32436,35615,38459,42775, 16277,38530,34687,33132,38111,42774,42774,30536,27551,25092,34687,36777,32966,20857,1774, 3342, 42774,40143,37427,42774,14999,38772,33030,34013,23649,42773,38233, - 35997,35615,42773,37645,36777,37692,3182, 13271,12514,11554,38233,30535,18468,27298,3309, 3195, 36777,3068, 29489,42773,19031,38233,42773,3067, 32435,36736,6571, - 17154,2551, 3496, 27297,2791, 10292,27410,1460, 42772,40143,1361, 2587, 842, 1492, 32336,2604, 36777,3181, 21436,42772,40143,16022,27296,135, 1283, 14652,8762, + 35997,35615,42773,37645,36777,37692,3182, 13271,12514,11554,38233,30535,18468,27298,3309, 3195, 36777,3068, 29489,42773,19031,38233,42773,3067, 32435,36736,6571, + 17154,2551, 3496, 27297,2791, 10292,27410,1460, 42772,40143,1361, 2587, 842, 1492, 32336,2604, 36777,3181, 21436,42772,40143,16022,27296,135, 1283, 14652,8762, 6336, 689, 4673, 870, 16276,20856,33914,30534,34687,8580, 12248,38232,7338, 42772,28840,1988, 15609,20369,42772,42771,42771,7941, 17876,2926, 36776,8141, 37083, 22692,24769,8494, 33407,5600, 36776,40142,33914,12152,20855,14163,9436, 38232,12151,32434,14857,30533,30532,33259,4286, 18467,21090,42771,35615,35615,40142,36776, 13553,32433,38232,17946,40142,39301,42771,33865,27360,1875, 36971,5588, 2993, 32432,42770,42770,34880,36710,36776,4932, 33259,13160,42770,19363,33914,12762,25051, 3732, 33903,22691,33258,32431,27295,42770,42769,32329,35614,5543, 591, 34687,13270,33258,36775,4206, 31541,36775,17897,24768,27294,59, 5767, 20894,2858, 35614, 19709,13552,33913,20807,34686,8140, 40142,25950,38002,33258,31123,36775,35026,32798,32823,8490, 27425,22715,38232,4735, 33913,38363,16058,40141,42769,8945, 33913, - 38231,40141,24767,36636,29666,35614,19030,36775,13021,1903, 19279,22690,38231,36774,35614,42769,40141,31401,38231,25949,4205, 5955, 27293,35613,4873, 35431,2699, + 38231,40141,24767,36636,29666,35614,19030,36775,13021,1903, 19279,22690,38231,36774,35614,42769,40141,31401,38231,25949,4205, 5955, 27293,35613,4873, 35431,2699, 40141,2248, 3401, 42769,14510,18084,33258,291, 20368,5587, 32430,9570, 185, 357, 27261,443, 21392,16021,40140,10963,27292,42768,14856,12911,33257,6221, 40140, 17875,1888, 30776,38231,40140,21876,38230,13846,27291,3803, 67, 11665,2059, 30629,10553,13867,31411,16201,16014,11919,2247, 27839,17442,10993,42768,8250, 33306, - 27290,18186,12509,33913,15232,27481,36144,525, 15277,33257,2947, 1894, 2382, 25948,8920, 38230,36774,10962,7035, 42768,11343,19686,318, 40140,13023,37833,3215, + 27290,18186,12509,33913,15232,27481,36144,525, 15277,33257,2947, 1894, 2382, 25948,8920, 38230,36774,10962,7035, 42768,11343,19686,318, 40140,13023,37833,3215, 33287,13845,14371,37459,40139,33912,42768,29013,27289,38230,35209,34686,27288,40139,11789,12247,42767,36774,38230,33912,40139,35613,40139,27287,15537,515, 33257, - 21849,30531,36774,3207, 5237, 36773,33257,35613,36773,42767,17335,28839,36773,20367,33912,42767,32429,42767,38216,30530,42766,39075,28838,36869,35613,37222,8716, - 38664,243, 30806,2586, 36773,40138,42766,40138,26739,23768,19779,34672,13847,2857, 3214, 464, 22088,23648,14660,40138,35612,11788,28837,19391,390, 40138,517, + 21849,30531,36774,3207, 5237, 36773,33257,35613,36773,42767,17335,28839,36773,20367,33912,42767,32429,42767,38216,30530,42766,39075,28838,36869,35613,37222,8716, + 38664,243, 30806,2586, 36773,40138,42766,40138,26739,23768,19779,34672,13847,2857, 3214, 464, 22088,23648,14660,40138,35612,11788,28837,19391,390, 40138,517, 8249, 28836,31315,33912,32428,42766,34863,42766,30863,24766,37927,33256,30529,42765,37818,40137,984, 42765,34686,3867, 36077,2946, 29244,42765,16804,34686,33911, - 2272, 21875,21089,14370,38229,20366,34663,17153,30594,1743, 32427,14509,24765,19685,5392, 42765,35612,27286,36772,27285,40137,22413,27284,21874,37931,24258,129, + 2272, 21875,21089,14370,38229,20366,34663,17153,30594,1743, 32427,14509,24765,19685,5392, 42765,35612,27286,36772,27285,40137,22413,27284,21874,37931,24258,129, 12933,31165,12910,11229,12028,33911,8944, 31931,38229,12761,27283,35612,38229,5082, 16437,15608,22990,11927,17, 6433, 28052,9569, 34522,1132, 42764,17152,38229, 32426,20555,38228,9435, 24764,665, 5776, 7301, 290, 5252, 14369,21808,18021,17422,17236,5632, 32425,23912,15536,42764,42764,21438,26051,25974,20689,26260,17782, - 20365,2264, 23663,15313,16436,23427,6586, 42764,36225,265, 32832,28745,36099,16603,33911,17279,21873,811, 36984,37106,1583, 38900,1578, 21415,2145, 8943, 773, + 20365,2264, 23663,15313,16436,23427,6586, 42764,36225,265, 32832,28745,36099,16603,33911,17279,21873,811, 36984,37106,1583, 38900,1578, 21415,2145, 8943, 773, 22344,7161, 32745,1788, 2000, 2244, 20854,6661, 29593,9568, 42763,42763,36772,17874,42763,40137,27754,35612,35611,33911,37238,8715, 42763,8042, 35250,42762,37073, 8041, 42762,7196, 13844,21872,17873,16020,37838,32424,17685,40137,30528,12760,42762,562, 3213, 3050, 33053,33910,42762,25070,38389,34057,38228,9842, 26518,33910, 27282,17334,6119, 40136,42761,28609,38228,42761,33256,28835,23647,38228,40136,21871,40136,34558,3041, 42761,33702,33339,24763,20364,14508,40136,33747,595, 34685, - 33256,30094,40135,36772,33910,36772,33910,35611,25947,5632, 14855,36692,6855, 9925, 42761,502, 8931, 33521,1193, 42760,11157,38227,4674, 35611,16855,36771,9434, - 34685,9433, 42760,42760,27132,1486, 40135,35611,40135,13357,4668, 42760,31816,629, 15809,508, 15607,1130, 5453, 35346,308, 17091,39117,33256,34685,20363,4110, + 33256,30094,40135,36772,33910,36772,33910,35611,25947,5632, 14855,36692,6855, 9925, 42761,502, 8931, 33521,1193, 42760,11157,38227,4674, 35611,16855,36771,9434, + 34685,9433, 42760,42760,27132,1486, 40135,35611,40135,13357,4668, 42760,31816,629, 15809,508, 15607,1130, 5453, 35346,308, 17091,39117,33256,34685,20363,4110, 13551,6177, 40135,7505, 40134,34685,36771,40134,42759,30527,10783,10782,2856, 32242,33255,42759,34684,35610,36771,28834,42759,17872,9298, 33909,31899,40134,34684, 33651,38227,42759,19024,28833,34090,33086,1296, 34228,18155,38446,1310, 33255,34684,33909,18466,30526,38227,7034, 34684,30525,16869,35610,42758,8248, 32423,21088, 24762,32422,6642, 1020, 40134,33909,17333,4370, 8376, 25778,40133,19029,12027,4793, 35001,35680,19353,33909,38923,21627,38227,18154,5542, 32421,33255,20362,42758, @@ -16270,11 +16265,11 @@ static const unsigned short Ranks[197839] = 40131,40131,9653, 3495, 32419,37343,33846,39003,16529,18118,35706,25484,32982,33584,40131,32418,35609,28830,1450, 32722,11557,34813,37159,37133,37169,26410,38961, 16017,15395,22915,13933,40130,40130,37506,23090,40130,29717,29255,18211,30836,36749,24164,36769,35872,38695,38867,11314,18330,13484,22680,32891,29573,4142, 34052, 34682,38396,24651,38225,30092,34648,31590,30462,27590,42755,26024,40130,28475,42754,18632,26174,42754,37572,29923,19921,16346,40129,42754,35736,42754,40129,26488, - 36709,36650,29859,38297,31695,39160,37697,36769,37626,35683,30099,42753,25945,36781,33868,27637,38295,33465,39030,16664,35718,37532,42753,31221,26503,35016,7089, + 36709,36650,29859,38297,31695,39160,37697,36769,37626,35683,30099,42753,25945,36781,33868,27637,38295,33465,39030,16664,35718,37532,42753,31221,26503,35016,7089, 36936,33219,38577,34555,33722,37470,34813,30643,42753,38568,9276, 38224,19389,14217,24834,27280,28358,32802,39066,29375,42753,6251, 14795,22062,38926,33065,26236, 38224,28216,34077,33058,36768,40129,40129,35609,22689,6017, 40128,34226,9447, 11026,42752,35272,30978,22716,37747,20384,37365,28260,27313,36751,34884,37280,38112, 21296,34682,8672, 31056,20502,38586,9609, 38167,6619, 1295, 25944,33873,35094,2338, 35609,36551,1708, 35506,37748,26192,28320,11787,35609,27279,14369,42752,10498, - 32857,16016,35608,35608,38098,5354, 28829,27527,12508,42752,835, 25082,2410, 15228,19388,19387,20849,29786,21600,12438,22113,1371, 42752,1824, 23815,15032,7329, + 32857,16016,35608,35608,38098,5354, 28829,27527,12508,42752,835, 25082,2410, 15228,19388,19387,20849,29786,21600,12438,22113,1371, 42752,1824, 23815,15032,7329, 7712, 1932, 11715,17871,12962,8156, 25341,2972, 5835, 35582,11989,19386,324, 19385,34682,32417,820, 4462, 15299,10038,6732, 4176, 450, 42751,2770, 20361,15492, 2725, 1514, 4660, 5992, 1849, 10963,13339,34682,19384,2782, 4892, 31394,3874, 37368,299, 17151,39134,38756,3552, 27628,42751,35608,42751,33254,27853,32416,30523, 40128,3669, 36768,40128,4872, 38791,40128,30522,24761,38224,36768,36768,42751,6392, 38224,18464,11237,35608,40127,34272,33908,36767,7275, 30473,42750,42750,22688, @@ -16284,11 +16279,11 @@ static const unsigned short Ranks[197839] = 38222,22244,16435,13842,20835,4901, 32413,6909, 33253,24759,17870,40126,32412,8257, 8537, 17332,34733,38222,18463,17869,5825, 21683,36767,2095, 35606,33253,36766, 14854,38221,1269, 24758,38632,11786,42748,19877,42748,37001,35338,5799, 27277,36639,35606,242, 30768,18110,5486, 13883,16913,8249, 37253,12888,33824,16867,18698, 38221,24870,33907,2268, 4414, 36766,40126,6958, 354, 10434,35606,23916,20070,9890, 7274, 35, 28316,21942,1774, 17723,3641, 5182, 24440,12613,33096,32806,17732, - 32330,32719,15991,15383,18560,12010,24766,30191,17263,21651,15765,27100,27901,3028, 38221,15230,1926, 14284,35606,36766,33253,14003,36809,33167,33907,6287, 774, - 34680,13841,6131, 4770, 20848,32411,25941,4702, 27796,42748,3865, 30521,1944, 36766,33907,33252,21867,42748,5631, 38221,21083,9109, 1762, 24157,35092,9740, 8114, + 32330,32719,15991,15383,18560,12010,24766,30191,17263,21651,15765,27100,27901,3028, 38221,15230,1926, 14284,35606,36766,33253,14003,36809,33167,33907,6287, 774, + 34680,13841,6131, 4770, 20848,32411,25941,4702, 27796,42748,3865, 30521,1944, 36766,33907,33252,21867,42748,5631, 38221,21083,9109, 1762, 24157,35092,9740, 8114, 37052,18462,10893,23646,38068,4339, 42747,21082,24351,11855,37897,42747,15375,8948, 36896,42747,14943,9915, 8040, 3051, 7567, 3210, 6667, 39044,36125,17504,22638, - 2008, 3418, 18959,25940,42747,33991,10482,19383,42746,30520,33906,33906,36765,42746,35916,30602,36765,118, 15037,35605,16177,30523,42746,977, 27276,11785,2198, - 28042,14226,1696, 14937,12230,957, 559, 1929, 2450, 8375, 13018,35939,24, 18037,2619, 1523, 13845,33906,23886,21717,3654, 40125,12246,3551, 28828,36765,6957, + 2008, 3418, 18959,25940,42747,33991,10482,19383,42746,30520,33906,33906,36765,42746,35916,30602,36765,118, 15037,35605,16177,30523,42746,977, 27276,11785,2198, + 28042,14226,1696, 14937,12230,957, 559, 1929, 2450, 8375, 13018,35939,24, 18037,2619, 1523, 13845,33906,23886,21717,3654, 40125,12246,3551, 28828,36765,6957, 1864, 16273,14312,8631, 14506,33252,19028,6220, 2992, 2658, 21866,22635,36765,2981, 15229,21865,33906,35605,34680,33905,28687,4008, 42746,24757,11342,8164, 12964, 20011,14368,19382,32410,14505,27275,33252,17868,6641, 4843, 15606,4343, 3279, 21590,40125,35605,38220,40125,3389, 40125,38220,7642, 17036,36764,10615,1497, 25939, 15228,26674,39247,14162,32409,8825, 12514,9431, 32408,157, 18153,14367,633, 25938,38220,10669,15012,42745,16014,17867,2272, 4313, 20509,19381,36749,35605,42745, @@ -16309,14 +16304,14 @@ static const unsigned short Ranks[197839] = 16548,38216,33964,23559,38216,28820,26986,35439,40118,38551,33251,38650,30874,32996,1579, 3950, 1097, 40118,27091,35601,35601,39164,33227,25931,36559,16171,38216, 33251,42739,38012,22686,17872,35601,27271,19025,36207,6268, 7337, 35603,33250,42739,505, 27683,25668,19380,30514,32403,21859,14083,14804,1163, 14851,7940, 33903, 13269,5286, 1638, 23668,36761,33903,40118,27308,12908,1147, 39066,6640, 32944,10524,24752,22685,32090,1063, 20626,30723,6471, 3514, 13268,13681,23880,8619, 14504, - 38215,35601,36761,5630, 13267,33903,28543,30251,38215,2184, 14930,19982,24751,33183,19024,11933,42739,32218,21674,17862,35314,25930,21858,830, 9680, 42739,2718, + 38215,35601,36761,5630, 13267,33903,28543,30251,38215,2184, 14930,19982,24751,33183,19024,11933,42739,32218,21674,17862,35314,25930,21858,830, 9680, 42739,2718, 39312,42738,16431,36761,4618, 5284, 42738,13431,38342,35600,39349,39209,34677,1559, 23643,6356, 26779,24697,16271,33250,12512,15357,10135,35971,13771,16011,40118, - 22684,42738,15225,326, 10645,3834, 11783,33694,42738,3212, 6776, 13838,37926,6766, 23642,30513,12245,40117,34677,9840, 5193, 13356,6391, 39138,512, 1996, 9375, + 22684,42738,15225,326, 10645,3834, 11783,33694,42738,3212, 6776, 13838,37926,6766, 23642,30513,12245,40117,34677,9840, 5193, 13356,6391, 39138,512, 1996, 9375, 11336,32822,1436, 32803,32520,3052, 23856,5550, 38215,30422,38215,21079,18460,38214,32998,16270,7711, 38214,42737,13548,16010,40117,38214,22594,19379,5341, 37810, 17224,34621,40117,3093, 25384,36761,4808, 40117,36959,42737,34677,42737,25929,3211, 1918, 36806,37074,38214,42737,20245,36760,33250,42736,42736,42736,36135,40116, 11736,8428, 7464, 16689,15197,3988, 42736,19684,4069, 27959,24842,27262,12566,17670,27002,27966,36760,25928,36760,28819,7699, 42735,38213,33981,38213,42735,35600, 22862,25927,15604,24750,22683,42735,20359,42735,35600,34677,13351,42734,38213,23641,38213,42734,9669, 42734,42734,14693,21078,36733,20883,36760,27270,21857,12511, - 40116,42733,15224,2815, 40116,32402,32401,28818,42733,40116,36759,34676,33903,30512,36759,36759,13017,24343,8714, 4550, 55, 5870, 32400,8356, 23084,36759,4734, + 40116,42733,15224,2815, 40116,32402,32401,28818,42733,40116,36759,34676,33903,30512,36759,36759,13017,24343,8714, 4550, 55, 5870, 32400,8356, 23084,36759,4734, 22268,32399,13965,19023,38212,40115,42733,33069,42733,36758,34834,42732,30511,16430,42732,40115,40115,22372,42732,40115,38212,38212,35600,25926,42732,38212,42731, 33250,33902,13266,17331,33249,42731,40114,18459,35599,33457,8470, 22682,40114,40114,22681,33902,42731,36758,36758,36758,14850,36757,42731,40114,34676,42730,12244, 36757,391, 33902,40113,33249,17861,13265,28817,42730,34676,33902,38211,40113,36757,36757,13264,33901,32398,42730,10290,40113,34676,42730,40113,21077,10961,10778, @@ -16336,10 +16331,10 @@ static const unsigned short Ranks[197839] = 36804,33898,36752,42715,20357,12149,38206,12241,36962,7214, 2617, 19375,18147,40105,30506,939, 15489,40105,40104,34672,33247,33247,32390,36751,42715,38206,20844, 1265, 17148,19019,35596,38205,18817,147, 4943, 19145,32953,22568,6638, 6639, 40104,39024,11785,25391,28654,36720,6452, 1424, 20710,26597,38205,38208,42715,42715, 27612,42714,14848,40104,35596,10433,28815,30505,32389,27263,40104,30504,8941, 6389, 34672,36751,6463, 13355,17858,39195,6604, 35596,35722,4342, 36751,19374,35595, - 6286, 38205,16198,16426,34672,32388,42714,16860,17328,13354,27262,40103,38205,863, 42714,17147,36193,30503,1522, 11567,3413, 9445, 2459, 12907,4163, 18554,5114, + 6286, 38205,16198,16426,34672,32388,42714,16860,17328,13354,27262,40103,38205,863, 42714,17147,36193,30503,1522, 11567,3413, 9445, 2459, 12907,4163, 18554,5114, 42714,35595,42713,30502,42713,40103,42713,42713,28814,32387,42712,24743,38204,22676,3262, 36751,35595,33255,34479,34671,30501,11553,10960,23522,40103,2162, 22109, 5824, 23638,40103,42712,8246, 33315,40102,3699, 38204,38204,35595,28771,42712,4788, 2311, 14915,4001, 20145,37988,28813,42712,10288,10, 20843,14914,42711,36750, - 10481,766, 8469, 42711,36051,29926,11215,1057, 12840,854, 28812,2843, 66, 270, 23012,560, 6791, 33247,39251,8919, 37068,14913,16269,4581, 25598,22898,2707, + 10481,766, 8469, 42711,36051,29926,11215,1057, 12840,854, 28812,2843, 66, 270, 23012,560, 6791, 33247,39251,8919, 37068,14913,16269,4581, 25598,22898,2707, 3592, 38204,42711,15601,33247,9587, 42711,13836,33246,14144,30110,32386,8137, 10777,33421,1637, 23637,34671,25501,34248,37861,42710,8196, 19064,28428,31328,32385, 34671,40102,32359,33898,32384,27377,6350, 30500,7003, 9902, 12695,32171,20164,19018,37798,11781,36750,40102,38228,40102,38203,40101,34671,15272,33898,40101,14365, 14912,33092,34720,32383,36750,33246,38814,28811,42710,42710,36750,42710,34670,39410,36749,35956,40101,36888,641, 12393,9457, 17857,42709,10299,28810,38991,25919, @@ -16370,7 +16365,7 @@ static const unsigned short Ranks[197839] = 27252,27640,21297,35586,33048,4657, 42693,36741,34585,42692,36741,38192,42692,32442,1273, 1372, 8179, 34788,20841,42692,40087,42692,24480,40087,42691,956, 40086, 31715,33893,38192,24339,36740,31073,16004,1511, 42691,37907,40086,36740,42691,42691,42690,12509,40086,37727,36740,2600, 35586,42690,27251,32376,4397, 25374,26948, 21063,42690,36174,36740,37849,38759,40086,42690,40085,18449,38192,40085,31263,42689,40085,23633,4105, 33460,14766,4738, 36739,24735,32375,22724,30074,36058,35586, - 17652,17325,20840,40085,40084,42689,42689,42689,14844,7671, 42688,35586,10959,40084,38192,3210, 36739,26854,40084,40084,17853,32834,36985,17341,42688,42688,779, + 17652,17325,20840,40085,40084,42689,42689,42689,14844,7671, 42688,35586,10959,40084,38192,3210, 36739,26854,40084,40084,17853,32834,36985,17341,42688,42688,779, 42688,36193,38844,40083,38191,42687,42687,32374,38191,21845,21844,35388,35585,35585,30493,42687,38191,33242,38191,40083,35781,40083,38568,42687,33113,30451,33242, 35015,17484,38190,36014,36739,23632,38190,18448,30492,36739,14682,6730, 28830,37534,40083,2190, 34666,26955,33242,13935,36738,38190,35585,38190,35585,13263,42686, 32373,33893,35584,33242,24032,5014, 36738,33893,32372,42686,22675,23631,38952,25917,36738,32371,38189,40082,34665,33092,2746, 35584,42686,40082,38189,42686,42685, @@ -16383,28 +16378,28 @@ static const unsigned short Ranks[197839] = 42678,36195,42678,38187,27247,8039, 28849,3550, 38206,22670,42677,34664,4807, 9055, 27832,42677,38187,33240,37984,34664,36736,9360, 33892,17077,29995,33240,38187, 34664,15599,32369,36736,32368,20354,36645,33892,32367,42677,6388, 26345,20839,19370,37118,5452, 40077,38186,40076,6451, 33892,42677,16859,7759, 23628,42676,36735, 40076,40076,38186,35583,2109, 12757,40076,35583,42676,11338,40075,40075,17146,20838,34775,32814,35023,36735,37993,25915,3855, 34664,36794,32962,30883,23627,34663, - 38186,17323,23626,38186,11219,42676,16291,42676,33240,22669,35582,33546,25914,35582,12906,7758, 32366,38185,35633,42675,38185,34663,11142,11555,42675,33891,3222, + 38186,17323,23626,38186,11219,42676,16291,42676,33240,22669,35582,33546,25914,35582,12906,7758, 32366,38185,35633,42675,38185,34663,11142,11555,42675,33891,3222, 30486,36776,35582,30485,36735,34663,35582,33240,27606,38794,23141,18145,22009,36095,16435,19955,42675,38827,37642,42675,13544,18144,21842,42674,42674,37867,32365, - 15598,23625,38185,33891,27715,25913,30484,23624,4283, 37349,42674,32364,1439, 22402,27246,30483,34663,34662,42674,23168,42673,38185,42673,28797,9990, 42673,9056, + 15598,23625,38185,33891,27715,25913,30484,23624,4283, 37349,42674,32364,1439, 22402,27246,30483,34663,34662,42674,23168,42673,38185,42673,28797,9990, 42673,9056, 42673,975, 38184,40075,42672,38448,36576,40075,38184,37515,12024,35628,19867,36735,40074,30160,20837,36626,35581,7121, 14159,5223, 42672,25912,33891,10132,40074, 32363,28796,34002,7670, 42672,42672,23143,8366, 42671,33239,479, 10787,20836,25839,40074,24732,35581,29569,16858,40074,40073,34662,36734,38184,30482,40073,24731, 36400,34662,33974,42671,28795,34097,4806, 42671,5013, 40073,33239,36734,40073,33891,27245,33016,18314,36734,28418,25911,42671,40072,39326,42670,36317,39406,38184, 19014,42670,33529,9445, 27244,18761,33006,35171,35581,7945, 4118, 36734,33239,38183,35581,42670,19675,15597,36733,33890,10199,42670,38183,6175, 7854, 30481,42669, - 2266, 961, 23623,18446,38183,42669,3577, 42669,25910,11505,19674,31874,16268,37953,25389,39135,42669,34588,42668,42668,16857,30572,34299,12756,34662,34661,8136, + 2266, 961, 23623,18446,38183,42669,3577, 42669,25910,11505,19674,31874,16268,37953,25389,39135,42669,34588,42668,42668,16857,30572,34299,12756,34662,34661,8136, 40072,19673,40072,42668,30991,33239,20557,17075,40072,40071,21841,24501,36733,40071,21840,28794,2412, 16424,33099,22668,35580,16267,24730,42668,27624,38183,27243, 11779,36733,35580,15596,42667,36733,10958,19672,38182,17145,18445,35580,35580,34661,18444,40071,18443,38182,42667,13777,35579,28793,17322,25909,33238,27242,34553, 27241,33890,42667,28792,40071,33238,34661,35579,40070,11552,17321,42667,38182,27240,27558,15595,38143,42666,37708,4524, 34661,10479,42666,42666,35017,17144,25908, 42666,34660,32362,42665,34660,18442,30480,42665,42665,24729,11337,38182,12508,36732,35799,19369,42665,5278, 28791,42664,42664,42664,36327,40070,38181,34660,36732, 16423,38181,28790,32361,42664,28789,34904,38181,42663,36732,39031,42663,16003,33574,30840,20353,35579,23911,13843,34318,42663,28788,21839,40070,33238,38022,40070, 7114, 38181,21061,20352,13262,7757, 38180,17320,3486, 40069,42663,12329,42662,28787,40069,10776,30479,21838,34660,36732,27239,17319,34659,16856,26735,25921,22035, - 34329,24592,30478,10432,15594,36731,33890,15532,21837,40069,17143,42662,23622,37333,25574,36731,542, 32940,25907,36731,37839,33316,40069,38556,42662,21314,1736, - 29974,38543,35081,32567,31918,15577,37387,42662,42661,42661,38180,16266,16422,42661,2897, 22085,378, 32928,1143, 20917,29514,1604, 12446,3494, 21836,2481, 192, + 34329,24592,30478,10432,15594,36731,33890,15532,21837,40069,17143,42662,23622,37333,25574,36731,542, 32940,25907,36731,37839,33316,40069,38556,42662,21314,1736, + 29974,38543,35081,32567,31918,15577,37387,42662,42661,42661,38180,16266,16422,42661,2897, 22085,378, 32928,1143, 20917,29514,1604, 12446,3494, 21836,2481, 192, 6511, 21835,312, 31933,1838, 18127,17102,33966,36731,37305,32512,474, 29665,212, 6134, 284, 23265,333, 13179,13154,3730, 23859,27096,970, 33481,33832,25153, 39266,32360,364, 346, 1732, 18143,40068,40068,28786,38180,30477,33238,35579,42661,33890,37478,16855,16854,33889,36639,33117,42660,17318,42660,35523,42660,32359, 36462,5775, 9123, 13015,33237,35578,27238,34659,38180,38179,22667,38179,33889,42660,40068,36730,36730,16265,42659,34659,42659,37200,16002,19671,15220,36730,36730, 20351,7853, 28785,15593,5073, 33237,17923,7939, 38179,40068,42659,4766, 40067,3549, 11778,42659,13543,38854,33889,38179,38178,30476,36729,14158,29623,42658,33889, 34659,20425,11336,32082,32358,21834,19368,32899,24867,42658,35578,33024,5154, 23074,36729,14157,13014,42658,42658,33237,31267,7113, 29467,35578,12884,24941,10704, - 40067,42657,42657,36186,36729,27237,36729,36728,30475,7411, 14842,38178,40067,36469,39113,35755,37769,33931,21060,42657,21059,27236,36728,35578,20835,38178,8468, + 40067,42657,42657,36186,36729,27237,36729,36728,30475,7411, 14842,38178,40067,36469,39113,35755,37769,33931,21060,42657,21059,27236,36728,35578,20835,38178,8468, 42657,32357,948, 40067,22095,40066,40066,3891, 2214, 28784,24887,42656,42656,42656,35338,20350,42656,32356,32355,40066,40066,40065,8579, 9429, 42655,42655,38178, 35577,38177,36728,40065,39082,8245, 33237,25906,36728,42655,40065,38177,33236,9428, 38177,40065,33236,24728,42655,33888,38177,9427, 32354,42654,38176,33888,30474, 1615, 40064,40064,33097,36674,42654,42654,42654,40064,3819, 42653,40064,33888,42653,36727,42653,36727,34658,38176,37950,42653,34368,42652,38232,7499, 4023, 27830, @@ -16423,7 +16418,7 @@ static const unsigned short Ranks[197839] = 14840,23961,28980,13261,35821,21054,38171,33233,32348,36720,24365,9296, 35573,40055,35573,19012,34656,38186,40055,35953,35348,36720,34493,38171,8373, 16849,42643, 36796,37900,31489,35960,36987,33887,1853, 22702,42643,16840,42643,37331,27209,26003,3966, 17835,23747,23399,33932,38249,16724,20600,36498,24366,11810,38268,38920, 34376,2249, 42643,27884,22937,32517,42642,19011,11150,42642,11335,36720,13147,36719,24725,26742,34304,42642,33232,32866,33607,33039,38895,42642,22664,17142,32347, - 40055,40055,40054,38171,12905,34196,37561,25903,36719,33232,5599, 21799,2474, 30022,33232,42641,35573,38913,42641,36719,40054,35322,37753,38171,42641,35572,3234, + 40055,40055,40054,38171,12905,34196,37561,25903,36719,33232,5599, 21799,2474, 30022,33232,42641,35573,38913,42641,36719,40054,35322,37753,38171,42641,35572,3234, 5116, 42641,36719,34968,16889,33737,34656,32346,27233,28778,33232,14872,37626,26532,39110,24613,37777,33639,35572,34524,36655,32410,42640,36225,3440, 38170,33720, 3456, 9295, 40054,36718,40054,33231,19667,9176, 40053,27721,11236,32896,36295,37628,42640,33886,36718,24724,34655,42640,38170,22663,42640,36718,19666,42639,33231, 36718,40053,38170,34655,22767,38170,29468,34655,42639,36717,42639,36717,38169,30751,38831,5855, 7816, 10692,33231,36717,19459,16421,38169,42639,39349,19822,29903, @@ -16439,19 +16434,19 @@ static const unsigned short Ranks[197839] = 22661,1236, 122, 21701,33023,28615,1672, 13012,31000,4739, 1108, 20347,20433,40046,22660,2296, 2337, 36714,5501, 42631,39166,22334,2943, 36054,1395, 5794, 42631, 42631,1377, 34167,13949,8341, 39366,29564,21830,6218, 42631,14156,38166,34053,1413, 10039,34443,33492,36714,15592,37825,21827,23931,21087,21287,16155,35741,33920, 30724,37258,19319,35671,24140,20078,38918,24168,36691,34934,39252,37923,37970,23178,35574,37471,22585,38305,35264,35924,35464,38073,35371,38464,38074,38655,29347, - 21948,38609,36763,38631,20833,33216,39381,27543,20832,29025,34053,28932,24959,35410,37891,36310,6834, 22970,38081,28024,22583,28385,22996,27233,11171,7168, 7670, + 21948,38609,36763,38631,20833,33216,39381,27543,20832,29025,34053,28932,24959,35410,37891,36310,6834, 22970,38081,28024,22583,28385,22996,27233,11171,7168, 7670, 11881,14727,357, 24723,36714,42630,40045,20347,37147,21621,42630,42630,1061, 36714,40045,15219,38165,19276,19679,21051,38165,42630,7504, 8939, 42629,24722,10287, - 42629,15218,23617,18142,8830, 14138,33229,30462,38165,3360, 34653,40045,34848,37343,35570,27231,855, 4765, 9815, 21050,3871, 6513, 16162,37636,35585,35195,3640, - 22777,33728,42629,36592,18439,14155,38165,6863, 20763,35631,25900,42629,36579,33229,40045,42628,40044,14154,35570,42628,27230,40044,42628,42628,16000,33885,4064, + 42629,15218,23617,18142,8830, 14138,33229,30462,38165,3360, 34653,40045,34848,37343,35570,27231,855, 4765, 9815, 21050,3871, 6513, 16162,37636,35585,35195,3640, + 22777,33728,42629,36592,18439,14155,38165,6863, 20763,35631,25900,42629,36579,33229,40045,42628,40044,14154,35570,42628,27230,40044,42628,42628,16000,33885,4064, 34653,1229, 37123,4174, 1975, 9054, 27229,19367,16264,8380, 33229,16263,23999,38190,33884,22447,36713,42627,14153,1203, 33152,14948,8566, 33395,20607,38164,42627, 4701, 28775,1724, 36713,23616,14299,38164,40044,30461,30460,5498, 21049,40044,5681, 13834,40043,20346,40043,36713,38164,5171, 1818, 24442,21048,33229,11188,35847, - 37481,6890, 42627,22297,34767,38164,40043,4700, 42627,42626,25899,10613,21047,5466, 7710, 13011,42626,27228,19366,10262,13352,38163,42626,33228,14362,24721,592, + 37481,6890, 42627,22297,34767,38164,40043,4700, 42627,42626,25899,10613,21047,5466, 7710, 13011,42626,27228,19366,10262,13352,38163,42626,33228,14362,24721,592, 13974,8134, 30028,2499, 8712, 33884,42626,34653,2814, 32823,35570,12239,17848,27410,37526,42625,36081,31640,42625,16098,40043,37034,32340,30459,21829,36713,38163, 20831,32339,1820, 1527, 23615,36114,38163,38163,1013, 42625,13135,4249, 42625,1336, 11809,38162,40042,4355, 33228,17610,33476,40042,21046,25898,5165, 7669, 32338, - 37321,36121,40042,33228,22659,6069, 22302,34706,19664,22658,30458,33884,40042,6827, 40041,21828,7272, 9564, 42624,38162,18141,34893,3729, 33176,24364,6925, 2687, + 37321,36121,40042,33228,22659,6069, 22302,34706,19664,22658,30458,33884,40042,6827, 40041,21828,7272, 9564, 42624,38162,18141,34893,3729, 33176,24364,6925, 2687, 36712,15591,428, 30261,32337,23672,36712,31757,34992,33739,38149,28914,23707,37884,25961,18140,31909,35142,15531,27227,27488,29078,33612,42624,33986,869, 42624, 2436, 11974,30336,34652,36712,38162,16623,36249,40041,3278, 25897,33828,1614, 32336,2971, 28081,14122,5117, 19365,15590,40041,42624,25811,38162,6189, 28774,38161, - 32335,33228,32334,42623,632, 31922,34652,42623,32251,38658,32852,16534,24692,40041,13842,9210, 17141,1121, 33227,29572,23520,18139,648, 42623,42623,14152,4891, + 32335,33228,32334,42623,632, 31922,34652,42623,32251,38658,32852,16534,24692,40041,13842,9210, 17141,1121, 33227,29572,23520,18139,648, 42623,42623,14152,4891, 11550,42622,40040,38161,33227,9989, 11149,11549,461, 19224,7583, 6731, 22768,1132, 10947,18695,11310,16890,9452, 21423,26305,14608,40040,9633, 23478,38246,34652, 42622,3421, 34648,35850,40040,42622,32127,5432, 37447,34420,42622,42621,36712,29249,36711,21827,40040,6570, 40039,33227,38161,19622,5185, 42621,40039,11504,35569, 19663,34652,40039,15217,30457,42621,36697,42621,3719, 12754,21045,35710,25896,15999,40039,38161,30950,38160,42620,30456,3785, 28773,33227,20345,2900, 36711,38160, @@ -16464,29 +16459,29 @@ static const unsigned short Ranks[197839] = 20716,5052, 1961, 8711, 3574, 10960,15998,4494, 23613,21824,36709,27983,42614,25893,5068, 1381, 34264,30450,21043,23612,38159,37942,19943,33882,20828,34651,35567, 33224,14727,33224,32331,36709,36350,20343,5191, 18968,37623,19461,42614,42614,38516,2896, 36709,38338,33645,28767,371, 37917,3356, 20827,37038,34035,813, 11659, 28766,3208, 37785,3420, 7073, 30813,137, 27119,4899, 19685,32070,8158, 11525,15619,16217,1999, 971, 1401, 13774,20761,4698, 26602,2721, 28349,4930, 6174, 14917, - 42614,32330,9275, 35311,19242,35892,2942, 2778, 7195, 9163, 25892,769, 3092, 36966,40036,39193,3092, 42613,35834,27042,29159,6987, 35567,8038, 2813, 20285,4788, + 42614,32330,9275, 35311,19242,35892,2942, 2778, 7195, 9163, 25892,769, 3092, 36966,40036,39193,3092, 42613,35834,27042,29159,6987, 35567,8038, 2813, 20285,4788, 14648,19855,31703,9030, 40035,33968,39025,40035,42613,37638,33721,5080, 40035,42613,35566,27223,42613,36708,25062,7046, 33048,35161,28765,38158,19661,28764,38158, 33882,22656,15216,30449,40035,5823, 17269,4699, 23611,12904,17317,35150,40034,23589,1033, 6858, 42612,22655,36949,33882,20342,18138,40034,20341,36708,36708,42612, - 35244,8038, 40034,14500,404, 20340,38158,14499,33066,19010,22654,12022,35566,9706, 40034,35566,42612,35126,8133, 40033,24720,24719,30448,38158,13260,12505,424, + 35244,8038, 40034,14500,404, 20340,38158,14499,33066,19010,22654,12022,35566,9706, 40034,35566,42612,35126,8133, 40033,24720,24719,30448,38158,13260,12505,424, 36288,14716,33270,37885,7381, 4472, 10286,20339,18137,40033,40033,42612,12506,263, 26785,14838,19660,34395,15588,23610,42611,38435,32329,35566,11046,33882,34650, 25891,38157,40033,36708,25890,22329,6906, 19777,19659,38157,35647,40032,22653,38157,8372, 15202,14150,19658,38157,6823, 20338,18014,42611,38709,1809, 42611,40032, 37640,33326,32828,32328,19364,33224,12477,32752,32702,14374,21759,16277,4324, 29861,7668, 17128,33881,25310,11601,11503,18438,36707,23900,33389,20337,42611,40032, - 21913,38130,19526,24718,36814,22269,28920,14910,36990,37348,36104,42610,35804,37020,35565,18437,42610,24717,7937, 28763,2610, 20182,35565,42610,32414,30774,6837, + 21913,38130,19526,24718,36814,22269,28920,14910,36990,37348,36104,42610,35804,37020,35565,18437,42610,24717,7937, 28763,2610, 20182,35565,42610,32414,30774,6837, 22652,24716,34650,40032,35565,42610,36757,36707,11548,25889,34650,3653, 10131,450, 42609,4178, 27222,42609,36707,22651,42609,8490, 42609,40031,38156,40031,21042, 36707,7111, 34650,9122, 14149,22650,21567,19657,6117, 2737, 35314,32071,8057, 30532,40031,5051, 42608,33881,10956,28651,36706,15587,9174, 42608,32327,25888,35565, 42608,34649,35564,33881,5012, 14148,42608,7409, 12021,33881,15973,29330,36770,38929,33838,40031,12147,22649,27324,36612,21823,33224,6338, 42607,31064,38156,34697, - 19009,35407,10285,35134,42607,35564,35564,15997,1284, 446, 38156,17845,34968,24187,16268,12370,19656,38642,38896,3217, 8404, 802, 34244,23951,35909,228, 8218, + 19009,35407,10285,35134,42607,35564,35564,15997,1284, 446, 38156,17845,34968,24187,16268,12370,19656,38642,38896,3217, 8404, 802, 34244,23951,35909,228, 8218, 30331,1932, 34726,16520,938, 15688,12289,23611,12856,36089,35564,26477,6088, 37480,32558,36706,13259,17844,23609,34444,15996,42607,243, 6068, 34649,25887,42607, 9053, 34649,33880,13010,35563,35563,38156,21041,2349, 40030,21040,42606,5350, 33880,34649,5629, 1354, 5910, 36706,17168,28762,38650,42606,19008,36706,6980, 39318, - 9723, 21611,23608,28148,21892,30447,12505,18184,36721,40030,30446,40030,35563,34301,26560,35101,24621,20336,6765, 1729, 5285, 5675, 42606,1645, 40030,29334,6102, - 19714,22047,36947,17961,3784, 10327,14498,36705,2856, 4570, 22675,37635,36705,27556,19363,7822, 14909,42606,38155,40029,28761,626, 35563,22648,34118,7283, 6857, + 9723, 21611,23608,28148,21892,30447,12505,18184,36721,40030,30446,40030,35563,34301,26560,35101,24621,20336,6765, 1729, 5285, 5675, 42606,1645, 40030,29334,6102, + 19714,22047,36947,17961,3784, 10327,14498,36705,2856, 4570, 22675,37635,36705,27556,19363,7822, 14909,42606,38155,40029,28761,626, 35563,22648,34118,7283, 6857, 29989,30445,42605,35696,32326,12504,42605,21039,4549, 42605,40029,36705,42605,31616,28760,17843,36705,34648,7229, 11572,1881, 33223,42604,605, 1508, 35427,32325, 38868,22596,40029,36960,9894, 2128, 12020,4748, 10425,36929,22605,32559,7218, 12803,38533,18436,32324,36355,33880,18690,42604,40029,36209,38155,29319,8823, 13009, 171, 42604,37219,35767,35562,2449, 2895, 42604,4016, 33223,26310,1613, 40028,38801,2884, 38155,23781,42603,11333,36306,38155,477, 27937,38154,8037, 42603,35024, 38154,35562,36704,30591,3277, 1184, 31910,38154,40028,30444,36704,25886,33223,27221,35562,35924,35562,38154,14147,40028,3818, 37826,36704,30443,7032, 33880,33879, - 35561,1392, 42603,4738, 42603,35561,42602,35561,33879,11547,40028,40027,42602,38153,27220,36704,38272,38153,33361,15586,32323,31567,853, 15215,42602,35561,3066, + 35561,1392, 42603,4738, 42603,35561,42602,35561,33879,11547,40028,40027,42602,38153,27220,36704,38272,38153,33361,15586,32323,31567,853, 15215,42602,35561,3066, 35560,33223,32322,42602,32829,36703,14146,42601,18435,35560,34648,21038,40027,33879,37833,38153,36227,30442,42601,21037,40027,32321,36703,20335,1330, 38153,10431, - 18136,316, 963, 24923,33881,15834,38152,36391,36292,38152,24283,17139,33372,25885,35560,12020,2637, 1671, 33879,3040, 1422, 11777,17316,40027,34648,38152,1893, + 18136,316, 963, 24923,33881,15834,38152,36391,36292,38152,24283,17139,33372,25885,35560,12020,2637, 1671, 33879,3040, 1422, 11777,17316,40027,34648,38152,1893, 38152,17315,2387, 5597, 32639,33424,33878,38293,2028, 42601,19362,11373,35560,9274, 35559,42601,38999,23607,35678,19655,3147, 42600,22647,3854, 35433,27219,28759, 10284,37197,702, 32320,33878,33490,3091, 40026,40026,11332,27218,15585,33878,19007,33222,40026,19361,40026,42600,13831,10478,26652,33878,40025,36464,13589,19006, 42600,13258,2028, 34648,25847,38151,21036,38151,33222,30720,33114,42600,42599,20334,19654,3680, 31880,11502,40025,42599,36022,36015,34476,25884,34647,35559,15214, @@ -16497,13 +16492,13 @@ static const unsigned short Ranks[197839] = 3323, 5353, 35558,34646,33877,31254,37896,15404,42596,10610,13841,42595,38150,9837, 40023,36702,38150,38149,32318,4517, 6461, 14908,9632, 25882,1893, 26767,13127, 33748,34440,42595,38149,30101,19142,40023,33729,33354,2812, 40022,34646,1215, 590, 14144,42595,42595,42594,10028,8017, 21821,2197, 42594,28756,2618, 21820,10609, 17842,35558,29411,42594,42594,40022,40022,17841,42593,42593,33221,9631, 9630, 42593,32317,37246,42593,9444, 10959,40022,38926,36701,38149,35558,18135,42592,40021, - 27217,12750,10059,3728, 42592,11808,35557,24713,11545,38037,35557,40021,38149,35794,40021,187, 1064, 21717,27216,42592,5276, 747, 422, 38148,12503,32007,2080, + 27217,12750,10059,3728, 42592,11808,35557,24713,11545,38037,35557,40021,38149,35794,40021,187, 1064, 21717,27216,42592,5276, 747, 422, 38148,12503,32007,2080, 34222,38614,38148,28755,34756,13257,9424, 20332,25030,14696,24084,7503, 33221,32316,980, 34646,23604,1081, 3039, 34645,7936, 37229,34645,5628, 42592,34718,24712, - 19005,36758,1196, 4805, 40021,24268,25728,42591,32315,42591,12502,24711,21092,22755,37609,24710,38148,36701,7667, 13256,3870, 5869, 8371, 10430,42591,42591,2552, + 19005,36758,1196, 4805, 40021,24268,25728,42591,32315,42591,12502,24711,21092,22755,37609,24710,38148,36701,7667, 13256,3870, 5869, 8371, 10430,42591,42591,2552, 21819,5497, 3276, 42590,18903,25698,34645,42590,37768,42590,4396, 12903,37815,3727, 42590,30439,25881,40020,38148,15213,38147,38147,19653,9052, 35557,36701,27215, 42589,28754,42589,25880,29, 3745, 10766,12924,14667,19166,33007,30922,11289,17947,6941, 500, 40020,219, 8302, 38315,36701,33877,35557,1591, 40020,37016,42589, 19652,10263,3137, 11187,40020,26165,36025,12237,25030,14907,10958,35556,35556,2050, 42589,8760, 10261,40019,17840,6016, 37617,2698, 42588,34645,36700,6638, 28753, - 32314,37555,42588,27594,20331,42588,14906,40019,33220,33876,33876,36700,42588,33220,2913, 5955, 27885,18023,5895, 40019,7644, 10774,3359, 1425, 3652, 3419, 3355, + 32314,37555,42588,27594,20331,42588,14906,40019,33220,33876,33876,36700,42588,33220,2913, 5955, 27885,18023,5895, 40019,7644, 10774,3359, 1425, 3652, 3419, 3355, 1061, 3573, 2941, 3726, 28752,14497,9629, 3651, 5541, 10260,42587,6889, 24037,42587,3829, 38147,36700,2991, 941, 19651,2094, 33876,38147,40019,27214,36547,42587, 37513,18434,29314,24709,37279,33220,18082,9836, 31005,28751,16847,34644,42587,42586,33220,6907, 5698, 5390, 33219,38146,33219,14917,34644,2855, 37843,20330,33876, 33219,9628, 38146,23603,35556,20885,33219,40018,17839,25879,33218,25878,38146,8488, 42586,3288, 37340,1591, 18134,27213,12504,21818,38738,38146,134, 36653,32863, @@ -16511,36 +16506,36 @@ static const unsigned short Ranks[197839] = 954, 36699,2894, 481, 2697, 42585,8339, 36699,13840,34763,38215,27611,231, 37861,33385,39074,40017,728, 12473,42585,16261,26127,10913,58, 4199, 35751,12150, 38504,20741,21011,16457,25356,20825,36699,2551, 40017,1714, 7404, 30300,39404,34469,34966,1062, 6955, 13839,14496,28750,12145,36699,32242,40017,40017,4429, 42585, 2368, 2079, 19886,17761,26177,33277,33875,36698,3131, 9051, 916, 29509,2811, 3343, 33218,34320,21530,1437, 34228,11501,24402,27322,25877,20824,673, 4941, 11590, - 37612,26470,19359,36698,28749,24708,30438,42585,24707,1283, 542, 2196, 10130,40016,42584,1336, 28748,36698,7270, 24706,42584,362, 2854, 28811,1003, 1276, 2078, + 37612,26470,19359,36698,28749,24708,30438,42585,24707,1283, 542, 2196, 10130,40016,42584,1336, 28748,36698,7270, 24706,42584,362, 2854, 28811,1003, 1276, 2078, 7510, 20823,2777, 15096,36698,38514,24705,12236,33218,12501,4461, 38145,32313,38145,3561, 16846,38145,838, 38144,13929,7943, 6262, 19531,36697,10773,3692, 12019, 33218,38144,38144,32312,30437,30436,34643,36697,32311,34643,31493,42584,35767,4539, 5455, 28936,38481,20329,40016,40016,36697,1968, 9294, 12235,40016,25876,14837, 42584,34643,19650,42583,42583,23602,42583,20953,18777,38692,42583,20822,40015,33217,34945,7522, 9331, 42582,33217,21817,14451,21816,33217,6449, 34643,23601,36547, - 32259,35982,23600,20983,36697,3691, 40015,30921,34642,15584,20328,42582,913, 10259,27212,40015,34642,2662, 20821,25875,7403, 1296, 32310,9831, 39320,14905,1946, + 32259,35982,23600,20983,36697,3691, 40015,30921,34642,15584,20328,42582,913, 10259,27212,40015,34642,2662, 20821,25875,7403, 1296, 32310,9831, 39320,14905,1946, 25874,25873,42582,21815,3042, 4690, 16419,42582,36696,38144,25872,24704,36696,33875,35556,27211,2585, 37732,11807,11335,1424, 692, 9274, 10849,6995, 4460, 34546, 12503,13350,8338, 35555,42581,35959,8072, 1672, 40015,19002,34642,42581,17837,40014,19418,18767,22, 3807, 17771,25737,21464,33985,31556,3090, 3572, 35866,38355, 34642,9137, 2423, 38617,6637, 7348, 14968,1346, 520, 42581,36887,38143,16260,162, 5484, 26842,3725, 25063,374, 40014,35555,1819, 38143,42581,16584,3449, 38143, - 38143,36268,21475,36819,33231,33936,38951,36696,36696,1107, 1503, 38142,890, 9423, 34641,2550, 22646,22645,38142,190, 14234,35555,38142,17836,37312,2990, 2295, + 38143,36268,21475,36819,33231,33936,38951,36696,36696,1107, 1503, 38142,890, 9423, 34641,2550, 22646,22645,38142,190, 14234,35555,38142,17836,37312,2990, 2295, 36695,40014,39085,29576,25871,13255,34590,14495,17314,42580,15212,14836,2776, 38101,8578, 42580,36834,42580,36695,36695,38142,34641,33875,34051,42580,37123,34641, 37934,21814,24703,13254,36695,33977,40014,27210,35555,42579,40013,35455,36757,32828,38141,40013,32309,38141,12234,40013,40013,7110, 32308,24702,8710, 5549, 37795, 1755, 42579,38141,42579,9423, 38141,34641,6122, 38140,36694,11148,4282, 4842, 12749,30435,30434,38140,21157,42579,42578,33875,38140,24287,40012,37168,16259,42578, 40012,22644,40012,38140,24701,3354, 42578,21034,3358, 38139,2989, 33874,19001,2480, 25925,28747,16418,35554,21813,40012,5079, 722, 1987, 434, 10129,33770,28746, 34640,7935, 4300, 35554,3038, 2775, 23599,42578,42577,30433,35310,34640,24700,2668, 5424, 1412, 38139,7934, 36396,1852, 38139,20327,38139,9012, 19358,19582,38138, - 38518,2475, 31922,35554,1406, 2940, 1627, 3650, 42577,2479, 2810, 780, 34640,39257,28745,29265,30926,33276,33217,36694,203, 35482,21033,34640,2140, 798, 2584, + 38518,2475, 31922,35554,1406, 2940, 1627, 3650, 42577,2479, 2810, 780, 34640,39257,28745,29265,30926,33276,33217,36694,203, 35482,21033,34640,2140, 798, 2584, 38138,42577,42577,42576,10680,40011,38138,28744,867, 36694,32307,24699,17138,8917, 5733, 17313,12018,3890, 24698,35554,23907,9563, 42576,1853, 3233, 24595,10608, - 24697,5496, 28223,12678,38732,6286, 18133,2685, 15993,20684,4199, 27209,24399,9121, 9830, 19337,24696,63, 36847,21507,42576,33216,32306,16845,16405,16417,1188, + 24697,5496, 28223,12678,38732,6286, 18133,2685, 15993,20684,4199, 27209,24399,9121, 9830, 19337,24696,63, 36847,21507,42576,33216,32306,16845,16405,16417,1188, 38138,42576,187, 30850,2781, 6521, 33216,28743,2156, 16844,34639,699, 15530,20820,1711, 9835, 12144,19357,28742,37481,10552,21227,34488,16416,10128,981, 35095, - 35467,14904,36694,19000,42575,13829,28741,36693,42575,2430, 8781, 19007,3532, 6906, 40011,36693,9443, 2399, 2336, 24911,25870,2790, 17847,9562, 1994, 38137,7821, + 35467,14904,36694,19000,42575,13829,28741,36693,42575,2430, 8781, 19007,3532, 6906, 40011,36693,9443, 2399, 2336, 24911,25870,2790, 17847,9562, 1994, 38137,7821, 28740,31232,19694,32305,3087, 12661,16258,34701,37922,39224,5598, 37201,36693,36693,1823, 33363,42575,24277,38137,23598,30432,21032,6569, 36692,18999,17137,42575, 27499,30130,33967,38137,38137,678, 33874,15529,20819,20818,25869,35553,3554, 32304,30431,40011,9422, 40011,13823,24848,17136,42574,42574,29027,14903,9909, 34956, 5389, 23597,20326,42574,33430,42574,42573,3159, 19604,30833,40010,30430,24695,14143,28739,38136,35645,5125, 32994,10573,13855,30228,19591,8089, 39334,7688, 27061, - 13055,23006,31971,7541, 15916,33093,12342,9842, 33362,35426,28694,29919,33542,35430,5830, 25236,628, 32303,40010,597, 38662,35723,22229,22735,11147,21031,388, + 13055,23006,31971,7541, 15916,33093,12342,9842, 33362,35426,28694,29919,33542,35430,5830, 25236,628, 32303,40010,597, 38662,35723,22229,22735,11147,21031,388, 34364,12017,24201,33705,585, 18995,25973,38038,34498,987, 973, 39298,17135,19953,42573,20817,460, 25868,30429,35553,26321,1620, 28041,38136,2603, 40010,34793, - 35962,17532,9298, 7610, 17319,17134,40010,119, 21091,24131,2624, 265, 8672, 24694,42573,2980, 42573,2516, 11884,3643, 6039, 32302,26611,5380, 7045, 8337, 1166, + 35962,17532,9298, 7610, 17319,17134,40010,119, 21091,24131,2624, 265, 8672, 24694,42573,2980, 42573,2516, 11884,3643, 6039, 32302,26611,5380, 7045, 8337, 1166, 11146,38136,20325,15639,13539,36692,2346, 2093, 33874,13401,1670, 974, 28738,6822, 42572,35753,19356,3844, 16187,677, 854, 643, 3493, 13007,8467, 42572,35553, - 2720, 29188,33216,17092,23596,35553,35643,9627, 9626, 12143,2802, 16415,36692,8267, 36692,598, 780, 10702,9021, 15528,1118, 3613, 7903, 1610, 25867,35835,3256, - 4215, 30883,25866,10007,4222, 42572,9237, 21030,35553,42572,304, 8938, 40009,38290,5078, 1602, 15583,716, 21923,30560,37102,38136,34221,26241,4204, 4258, 4804, + 2720, 29188,33216,17092,23596,35553,35643,9627, 9626, 12143,2802, 16415,36692,8267, 36692,598, 780, 10702,9021, 15528,1118, 3613, 7903, 1610, 25867,35835,3256, + 4215, 30883,25866,10007,4222, 42572,9237, 21030,35553,42572,304, 8938, 40009,38290,5078, 1602, 15583,716, 21923,30560,37102,38136,34221,26241,4204, 4258, 4804, 20003,20324,1400, 170, 14394,9988, 40009,2906, 42571,35945,33874,38946,14494,13353,17133,32894,36691,1020, 42571,6285, 427, 34639,2064, 10283,34639,38135,36691, - 4347, 2833, 42571,40009,13349,35552,42571,42570,6836, 36691,36691,33873,42570,22782,13679,7194, 19435,36124,36690,15211,40009,28737,42570,22097,42570,42569,594, + 4347, 2833, 42571,40009,13349,35552,42571,42570,6836, 36691,36691,33873,42570,22782,13679,7194, 19435,36124,36690,15211,40009,28737,42570,22097,42570,42569,594, 42569,21029,24693,11331,4124, 42569,34639,35507,38360,13006,34638,40008,40008,13005,14142,5348, 35552,33216,38135,38858,42569,3576, 7850, 5729, 34638,21812,42568, 42568,36690,42568,17686,30363,30428,15001,29317,29684,24131,40008,42568,33215,35800,38310,40008,42567,21811,35552,34638,34908,7851, 9421, 3571, 38542,28736,42567, 38135,32940,40007,38135,34638,2580, 8487, 38134,38134,35552,5153, 28735,32301,5679, 32300,40007,26539,37117,38134,40007,30427,34637,37049,34637,10772,4461, 29126, @@ -16550,46 +16545,46 @@ static const unsigned short Ranks[197839] = 14141,2607, 9011, 28310,24689,4529, 9987, 32777,36689,42565,30425,9173, 42565,21810,13477,37731,7225, 10282,38133,38133,28731,40005,24691,3037, 16413,3802, 10957, 36689,10258,7991, 2853, 3970, 1742, 21498,24690,42565,38132,10954,36096,15209,16880,32298,21809,42565,32994,26294,35918,36297,32297,13899,11806,34637,12901,35551, 30424,42564,33215,35551,13253,18998,3421, 42564,10953,20322,5275, 40005,9986, 13537,42564,42564,20321,12900,17835,20320,7502, 8708, 35551,7501, 36689,5774, 42563, - 36688,36688,21028,39177,22642,34796,185, 5730, 20862,32861,14902,16490,28157,8157, 21160,34920,36688,6335, 5639, 34636,14901,5627, 36768,5397, 15594,42563,1152, + 36688,36688,21028,39177,22642,34796,185, 5730, 20862,32861,14902,16490,28157,8157, 21160,34920,36688,6335, 5639, 34636,14901,5627, 36768,5397, 15594,42563,1152, 9968, 38132,36688,17940,1837, 693, 33358,35991,31048,37469,39143,13348,10388,15166,18582,13979,18131,42563,36687,40005,2450, 30423,37876,32296,23595,34636,10281, - 34636,42563,14165,33171,34636,15366,36309,30712,36486,7850, 29284,31669,27207,40004,315, 13289,32887,6829, 33008,35712,3016, 38610,12500,3653, 28517,2942, 7269, + 34636,42563,14165,33171,34636,15366,36309,30712,36486,7850, 29284,31669,27207,40004,315, 13289,32887,6829, 33008,35712,3016, 38610,12500,3653, 28517,2942, 7269, 32295,9834, 36687,3114, 38132,38132,11776,7308, 34635,1935, 32294,34067,33873,20319,23594,15527,35550,17132,33725,25575,27891,36436,29994,33215,22355,1216, 24121, 28509,24209,34018,19452,32809,19283,9043, 18130,19596,38040,1817, 36177,1313, 39365,8979, 7977, 1901, 8878, 4109, 7948, 2920, 18075,38381,38877,38825,38289,20816, 31396,36635,17834,14140,36712,38131,12367,6150, 33978,25865,22814,22641,10242,38131,22198,9285, 1296, 21034,22682,40004,38131,5970, 36687,42562,4521, 21027,40004, - 17312,42562,27206,13828,42562,40004,1164, 24926,13557,27508,37961,36687,14609,21035,10035,20815,28730,36130,35478,42562,42561,38131,33214,20714,8255, 6623, 1007, + 17312,42562,27206,13828,42562,40004,1164, 24926,13557,27508,37961,36687,14609,21035,10035,20815,28730,36130,35478,42562,42561,38131,33214,20714,8255, 6623, 1007, 2907, 33873,42561,21808,11544,30422,42561,21807,10607,33214,38130,24689,36686,42561,34635,42560,34635,11543,5423, 21806,40003,40003,24688,18997,28729,15995,35550, 33214,12748,3089, 35550,11330,40003,38130,24687,24686,40003,22359,38130,42560,34635,33873,12929,30421,37256,6347, 34430,24685,20127,10395,3962, 6701, 36686,33872, 22926,33872,19649,42560,40002,40002,20318,36686,3570, 40002,30420,40002,8241, 21026,24684,36686,33214,40001,36685,35550,23593,990, 24683,34634,34634,420, 22162, 3492, 2549, 38428,20317,3293, 12747,42560,32204,5678, 33213,8244, 666, 1306, 42559,24682,42559,34634,40001,42559,18129,5577, 36995,33213,33213,35241,21025,36685, - 36685,33213,33872,31702,7193, 36685,28728,33212,5759, 42559,27205,42558,38130,36402,23592,4725, 36323,27070,9705, 1341, 35549,34634,35549,23591,14835,34633,2734, + 36685,33213,33872,31702,7193, 36685,28728,33212,5759, 42559,27205,42558,38130,36402,23592,4725, 36323,27070,9705, 1341, 35549,34634,35549,23591,14835,34633,2734, 35549,13004,37272,28727,18996,39050,34633,33212,10127,33212,7408, 38129,40001,4426, 13838,21805,30419,9050, 9704, 40001,11542,8370, 35549,36684,42558,38129,38129, 36469,9561, 18271,36684,18433,40000,19648,42558,27204,6448, 38905,38123,17311,38129,5388, 42558,40000,34214,42557,36684,42557,16975,38110,42557,3207, 4964, 35548, 23843,40000,460, 38128,3491, 357, 37734,16412,876, 40000,35548,34633,36684,42557,33212,28709,36641,8822, 9833, 33880,29648,5738, 14834,42556,27203,34633,21024, 36393,3548, 10126,2717, 42556,27062,18432,15581,33211,32293,42556,16257,12016,15208,15994,33872,39999,35548,39999,38128,2424, 39999,12015,36683,5387, 42556,36683, - 3420, 13837,36683,28726,5868, 33871,12114,2427, 4798, 33871,16842,35548,8973, 8233, 15526,32292,3485, 18431,42555,5953, 27886,29982,4581, 1687, 8026, 4174, 9844, + 3420, 13837,36683,28726,5868, 33871,12114,2427, 4798, 33871,16842,35548,8973, 8233, 15526,32292,3485, 18431,42555,5953, 27886,29982,4581, 1687, 8026, 4174, 9844, 21804,39999,38635,36683,20814,1741, 31584,17131,35246,5728, 33766,27202,39998,36682,33871,27201,38128,721, 13892,36259,14923,2603, 911, 17937,254, 26831,11228, 31092,22027,16860,30878,31169,15993,14366,774, 18995,38128,38686,42555,20813,42555,23392,38127,39998,42555,3407, 13139,21023,12367,6836, 30906,42554,34632,42554, 36682,11964,42554,32553,33871,39998,38127,39998,42554,38127,36682,3086, 39997,27200,34632,35547,39997,652, 26371,11801,17394,4079, 31499,4602, 32892,19647,36682, 13252,42553,6568, 33211,42553,29415,10257,10701,21803,42553,9293, 6892, 29315,39997,5870, 21408,12449,36681,38127,3649, 39166,32291,39997,14493,36990,42553,22640, - 38126,42552,38126,2165, 42552,25864,20812,38774,39996,36681,35728,1707, 38126,27199,38126,42552,807, 24608,6081, 795, 16385,11825,8979, 35547,5013, 38125,5235, + 38126,42552,38126,2165, 42552,25864,20812,38774,39996,36681,35728,1707, 38126,27199,38126,42552,807, 24608,6081, 795, 16385,11825,8979, 35547,5013, 38125,5235, 28725,505, 39996,714, 42552,42551,35547,13432,6964, 3713, 22639,5992, 33232,33870,42551,4890, 36681,31031,39996,26624,35352,18128,17310,15207,36681,19646,30418, - 32290,39028,1814, 14355,42551,34632,2842, 39996,30417,21022,18994,23590,30416,162, 11274,35704,32332,39335,38125,583, 27257,3088, 25479,42551,157, 30939,275, + 32290,39028,1814, 14355,42551,34632,2842, 39996,30417,21022,18994,23590,30416,162, 11274,35704,32332,39335,38125,583, 27257,3088, 25479,42551,157, 30939,275, 39995,105, 13556,2225, 19645,35547,475, 29334,21156,42550,36954,35051,1305, 25152,620, 30415,38125,27406,26189,36680,32289,10606,5386, 19852,8821, 28724,25863, - 2939, 42550,2658, 3648, 6618, 35546,2477, 2476, 33698,834, 1182, 2548, 24081,42550,39995,3087, 1794, 32875,37610,12120,34870,4785, 33276,710, 36094,1039, 6954, + 2939, 42550,2658, 3648, 6618, 35546,2477, 2476, 33698,834, 1182, 2548, 24081,42550,39995,3087, 1794, 32875,37610,12120,34870,4785, 33276,710, 36094,1039, 6954, 1116, 12502,19355,38593,6015, 18430,30742,33870,37255,10952,9625, 33870,28723,14900,42550,42549,36714,14557,28962,20316,33211,23589,42549,34632,12014,17130,38125, 7336, 38124,33211,19487,21021,8937, 38124,42549,38124,35546,42549,8618, 11226,42548,38124,11500,36680,33586,13348,36730,36870,33870,2195, 30763,34631,7933, 33210, - 39995,38123,38123,3193, 11144,42548,39995,31337,3575, 33869,42548,21249,14710,37027,14899,9832, 42548,139, 8240, 42547,42547,35546,36680,34631,35546,17746,736, + 39995,38123,38123,3193, 11144,42548,39995,31337,3575, 33869,42548,21249,14710,37027,14899,9832, 42548,139, 8240, 42547,42547,35546,36680,34631,35546,17746,736, 924, 14898,12233,18993,6941, 7429, 8450, 19480,844, 16854,20811,1740, 10834,7424, 32288,16841,35029,39994,25862,42547,42547,35011,32287,17833,13536,3647, 36680, 6506, 38123,26315,39994,39994,2077, 38123,27198,23588,10700,8071, 34631,35545,6835, 36576,34249,42546,25861,39994,1695, 578, 31809,1803, 143, 13223,33210,33210, 33869,32956,37170,18143,42546,32286,12746,33869,21802,19109,42546,11346,1906, 22305,42546,8707, 39993,425, 39993,3574, 18127,37098,15337,39993,17426,26419,36036, 35902,2873, 36679,844, 20315,39993,21335,20314,33869,42545,15580,42545,42545,36679,1233, 2266, 27197,7820, 32862,34631,885, 28140,19931,39992,186, 19969,18126, 42545,42544,42544,38208,42544,36679,33210,22638,12232,31065,34630,23439,30703,88, 20810,119, 921, 39992,39992,17832,33209,16256,42544,15206,13535,10956,38334, - 12499,42543,6706, 36679,21801,691, 3388, 31275,35644,32657,13219,36678,36672,38580,24238,376, 2893, 11182,917, 11406,23587,39992,36678,39991,6612, 23686,4618, - 16, 14193,688, 30631,1131, 9432, 17261,21465,28709,12299,13022,14764,7269, 12087,23233,27170,31272,6835, 9560, 19112,39991,4460, 39991,31249,34294,39991,1443, - 38122,42543,5618, 6590, 1653, 18429,9420, 8417, 29077,4899, 39032,39990,39990,813, 38880,13639,14897,10502,27254,35545,24749,7307, 39076,33473,1218, 36636,1077, + 12499,42543,6706, 36679,21801,691, 3388, 31275,35644,32657,13219,36678,36672,38580,24238,376, 2893, 11182,917, 11406,23587,39992,36678,39991,6612, 23686,4618, + 16, 14193,688, 30631,1131, 9432, 17261,21465,28709,12299,13022,14764,7269, 12087,23233,27170,31272,6835, 9560, 19112,39991,4460, 39991,31249,34294,39991,1443, + 38122,42543,5618, 6590, 1653, 18429,9420, 8417, 29077,4899, 39032,39990,39990,813, 38880,13639,14897,10502,27254,35545,24749,7307, 39076,33473,1218, 36636,1077, 42543,18428,7942, 783, 20313,36678,35097,14159,16411,42543,4935, 2022, 35545,11541,42542,33868,36713,37748,39990,38257,24569,28722,42542,34630,35545,42542,42542, 25787,6334, 23586,33147,32838,36678,25058,2963, 39990,39198,39989,39989,33209,42541,35544,19796,42541,39989,11778,36677,42541,9591, 34220,38288,38605,35544,20312, - 34097,8485, 33209,42541,28721,24681,34802,36677,10186,42540,9487, 20471,25321,21020,21019,4655, 42540,15992,38122,35544,13695,19060,8369, 38122,287, 21387,9565, + 34097,8485, 33209,42541,28721,24681,34802,36677,10186,42540,9487, 20471,25321,21020,21019,4655, 42540,15992,38122,35544,13695,19060,8369, 38122,287, 21387,9565, 10955,14896,16676,15991,15490,32017,35084,24711,15420,908, 15623,42540,39989,15525,25860,38122,19644,11775,34630,29583,38121,14833,16840,6772, 3874, 15223,33436, 21719,42540,36677,39988,36677,4769, 10951,33938,17831,15579,16297,42539,17664,42539,33209,18427,22637,33208,19966,2096, 36676,42539,17309,14139,365, 42539,13531, 16100,35544,30414,11122,42538,36676,20311,18081,1934, 37804,817, 34630,35543,10771,10280,39988,5385, 27196,12498,20310,39988,38121,20309,39988,11805,18125,39987, @@ -16597,15 +16592,15 @@ static const unsigned short Ranks[197839] = 38120,2679, 39987,34629,42538,34629,11804,7335, 32285,13003,18124,36675,11211,18992,42537,17308,21277,5540, 37245,24680,32670,22, 12619,23829,16255,15907,37658, 21018,14098,33247,32849,37637,35543,39987,10429,39254,33660,3668, 28147,42537,11506,10453,37316,27517,37457,39298,34014,9986, 1193, 37417,8896, 11420,5322, 35449, 37345,1532, 22993,17129,2993, 7026, 30283,25817,27323,32822,25719,6013, 38120,7031, 39407,42537,42537,19914,38000,37073,36445,18991,42536,25710,10062,36675,39986, - 35542,33868,30428,32284,34629,8769, 12157,36047,30413,2059, 33868,28720,39986,11329,27195,39986,35238,33067,2696, 33208,39986,18260,9833, 25787,11455,32169,5354, + 35542,33868,30428,32284,34629,8769, 12157,36047,30413,2059, 33868,28720,39986,11329,27195,39986,35238,33067,2696, 33208,39986,18260,9833, 25787,11455,32169,5354, 18876,4638, 6437, 27451,10064,22917,22010,4405, 24737,29464,25190,34583,19354,10256,16431,12785,4841, 5087, 35542,34810,35542,13347,1302, 11934,5026, 5176, 36765, 38437,5067, 20432,17307,6232, 6157, 1694, 38988,1787, 39985,3397, 23516,2988, 39985,3493, 31494,12468,33207,34530,1121, 37326,5253, 17128,38120,37110,19353,37730, 39049,35542,42536,11803,13251,3276, 951, 11490,8588, 38008,34629,12414,28965,11499,38591,1098, 23636,8896, 38171,15792,34277,23756,4511, 10954,7299, 38606,27194, 10255,2724, 32283,12996,9172, 20735,31102,21426,6398, 12601,24679,5850, 16941,11578,6417, 34274,10362,6794, 26344,21619,27504,14134,22636,6545, 27590,31361,34098, - 42536,17306,504, 5625, 21140,24082,31595,38261,38841,7050, 39985,38120,39060,28964,34628,7462, 28713,2695, 39985,5318, 12192,25388,2971, 629, 32108,21199,8059, + 42536,17306,504, 5625, 21140,24082,31595,38261,38841,7050, 39985,38120,39060,28964,34628,7462, 28713,2695, 39985,5318, 12192,25388,2971, 629, 32108,21199,8059, 39256,34966,32456,17809,7384, 34006,31852,25620,19352,39984,24722,35005,22264,37514,23585,34628,4566, 6528, 27157,39984,36675,21017,8820, 38119,38119,35541,35541, 39984,42536,7044, 17830,42535,4156, 21291,11482,36814,1328, 2277, 13038,20084,5609, 4547, 38781,20724,16864,37724,21940,38119,33500,30209,38119,13246,34566,15103, - 42535,11620,25650,33868,39984,39983,42535,39983,11774,39983,19962,17829,38118,10605,38118,39983,33207,38860,39982,17305,18426,22537,19351,1753, 32835,31601,6387, + 42535,11620,25650,33868,39984,39983,42535,39983,11774,39983,19962,17829,38118,10605,38118,39983,33207,38860,39982,17305,18426,22537,19351,1753, 32835,31601,6387, 10452,1316, 33867,11225,39982,42535,14813,18123,3534, 39982,1991, 33207,42534,24678,755, 26609,19836,39982,29816,27876,10033,21016,39981,9831, 39981,9073, 30412, 42534,3783, 1435, 27052,39981,3888, 42534,38118,32282,33207,39981,8484, 11224,24677,34202,34628,42534,702, 42533,23647,38118,38621,18122,11802,14894,32281,42533, 36674,36674,34554,451, 6834, 36674,19350,18472,42533,17828,39980,19742,42533,42532,13250,42532,3869, 27193,27192,39980,21564,21015,14893,34587,23584,34628,19810, @@ -16618,15 +16613,15 @@ static const unsigned short Ranks[197839] = 2902, 14892,19306,22554,2820, 18989,33206,42529,9828, 18119,28717,6597, 3579, 12908,3108, 13002,4313, 22463,3817, 19348,1651, 2515, 35149,829, 16715,13329,16532, 10125,25148,28040,33825,4795, 15990,36651,2194, 28670,42529,36671,27507,29775,21406,36035,3221, 34190,42529,39978,20807,6826, 38421,23583,34358,17808,23259,38763, 14348,42528,27190,26961,10953,42528,35, 32970,24214,776, 11717,6450, 989, 27222,19171,9832, 8201, 33132,29712,9830, 755, 29299,24659,30447,19468,3906, 19347, - 3017, 33866,39978,33206,17071,6899, 445, 14360,15522,5557, 5802, 32279,37742,29281,15810,9829, 1984, 28716,2475, 746, 36518,789, 843, 36203,38116,14138,8916, - 23655,3194, 33506,35592,5846, 39977,39977,39977,23582,25532,18584,14088,24676,1986, 5822, 8544, 39977,35231,16738,42528,15435,13827,38674,23891,2856, 3418, 3352, + 3017, 33866,39978,33206,17071,6899, 445, 14360,15522,5557, 5802, 32279,37742,29281,15810,9829, 1984, 28716,2475, 746, 36518,789, 843, 36203,38116,14138,8916, + 23655,3194, 33506,35592,5846, 39977,39977,39977,23582,25532,18584,14088,24676,1986, 5822, 8544, 39977,35231,16738,42528,15435,13827,38674,23891,2856, 3418, 3352, 3490, 98, 25984,3489, 13533,38116,38116,230, 10952,33866,37445,14137,23873,22813,38115,689, 11197,33014,29605,30862,27265,7093, 25606,6332, 38115,25516,38235, 13536,36192,6176, 617, 42528,35734,38115,1636, 2752, 13545,32278,28721,38684,12028,42527,39976,22632,16416,39976,35572,3374, 38319,33205,16410,15521,21014,42527, - 29785,5252, 33205,6978, 34380,11159,37070,37381,38413,4934, 25300,31401,12142,5583, 16253,14891,39976,3421, 22040,5043, 13836,37563,21799,1911, 7995, 4308, 589, + 29785,5252, 33205,6978, 34380,11159,37070,37381,38413,4934, 25300,31401,12142,5583, 16253,14891,39976,3421, 22040,5043, 13836,37563,21799,1911, 7995, 4308, 589, 34996,5296, 15520,2286, 38115,42527,35442,42527,20306,37048,2152, 18136,23581,3180, 32911,31208,12231,10254,20216,4853, 14890,4997, 14085,9204, 19182,33257,24406, 19973,8759, 9198, 9295, 19346,39976,1215, 787, 39303,39975,42526,38114,33205,33205,36671,36671,3130, 35539,38114,42526,34157,37455,37851,13826,39351,38114,39975, 15577,33204,28807,647, 6825, 29368,28089,33712,5718, 25857,1725, 3, 3071, 17167,13968,42526,28085,8132, 33204,29131,27311,38114,16409,11929,25874,13532,30411, - 2924, 13217,19641,21798,21013,32277,36670,38113,9828, 33866,34627,36670,6833, 31295,5495, 8936, 33865,5446, 28715,15205,35539,35539,12141,25856,34627,30794,2073, + 2924, 13217,19641,21798,21013,32277,36670,38113,9828, 33866,34627,36670,6833, 31295,5495, 8936, 33865,5446, 28715,15205,35539,35539,12141,25856,34627,30794,2073, 38113,42526,8368, 38113,38113,38112,39975,39114,25855,3784, 35693,7030, 24675,35539,33204,42525,20312,33204,2536, 39975,28714,38112,42525,4698, 8367, 18988,42525, 21797,2447, 38238,3677, 22240,36670,16252,296, 8146, 31986,295, 8653, 39974,8483, 21012,3763, 3488, 19882,1294, 38112,146, 14889,4102, 32471,2332, 10164,23021, 2389, 38555,23948,39300,14143,37796,38720,22420,5798, 16600,16408,21011,10770,6284, 36670,3223, 36669,9559, 34207,8388, 19476,4787, 28713,12140,4589, 42525,11268, @@ -16635,15 +16630,15 @@ static const unsigned short Ranks[197839] = 5701, 10435,22271,1902, 32276,25854,11540,38647,36233,3525, 12013,27649,33203,38891,1343, 10821,15536,13001,1875, 25309,5909, 36668,36668,5347, 4029, 23996,39973, 28746,38225,38111,42523,21472,36299,3400, 33203,38111,1462, 5697, 20941,18987,23483,42523,1911, 34447,11822,39973,25853,30410,1469, 21932,35538,39973,21010,15989, 33865,20305,42523,38111,34998,15988,1316, 914, 35334,36569,15518,32385,14831,16251,39972,33203,10279,42523,35538,32778,42522,1874, 42522,30409,14492,39972,19640, - 39972,39972,7708, 21863,23375,12230,21796,2116, 27189,11773,7591, 18737,4102, 3668, 599, 35566,12082,42522,42522,22631,39971,14136,2257, 32777,33044,23580,369, + 39972,39972,7708, 21863,23375,12230,21796,2116, 27189,11773,7591, 18737,4102, 3668, 599, 35566,12082,42522,42522,22631,39971,14136,2257, 32777,33044,23580,369, 35538,7086, 33202,33073,6783, 6671, 2141, 2553, 12037,23593,19951,39971,36202,18118,32275,33018,2164, 20097,37152,38110,16407,34274,10124,33263,12012,18986,10265, 15167,8935, 38110,42521,39971,18424,39971,22630,39970,42521,10428,33865,38685,8617, 32611,42521,34728,30186,39007,11801,39970,9049, 33864,19639,15221,32274,13834, 18176,5077, 38110,26284,9703, 42521,8200, 32879,37255,17304,42520,8243, 19345,1186, 35887,38110,1829, 38109,22629,6388, 38006,42520,39970,38109,22628,35221,15576, - 12745,2684, 39970,35537,9048, 34626,6168, 39164,36667,25852,33202,31011,20595,19344,34626,20806,35355,1397, 15517,13689,36055,9791, 29139,36181,12964,9755, 2520, - 13833,33202,16250,31741,2789, 34688,36667,33202,22132,8706, 39057,9419, 32993,18484,13000,11, 15928,18309,22558,13257,22816,9907, 26070,3487, 32838,18913,3206, + 12745,2684, 39970,35537,9048, 34626,6168, 39164,36667,25852,33202,31011,20595,19344,34626,20806,35355,1397, 15517,13689,36055,9791, 29139,36181,12964,9755, 2520, + 13833,33202,16250,31741,2789, 34688,36667,33202,22132,8706, 39057,9419, 32993,18484,13000,11, 15928,18309,22558,13257,22816,9907, 26070,3487, 32838,18913,3206, 37579,39969,2512, 42520,9594, 4398, 22215,21795,33201,36667,38109,32273,1459, 35537,42520,33201,14491,7204, 36237,1360, 15575,2367, 39969,36667,15574,26083,20199, 35232,39969,32547,42519,39969,11328,13531,39968,30408,30418,42519,21794,39968,38109,39968,12229,34626,19159,33201,25851,22627,12702,9558, 1773, 38108,18117,33864, - 1327, 36666,228, 28629,597, 145, 36918,1752, 5785, 4789, 35095,10031,737, 3619, 3388, 37402,42519,2041, 4642, 6705, 20471,34504,2137, 37396,36666,34625,9026, + 1327, 36666,228, 28629,597, 145, 36918,1752, 5785, 4789, 35095,10031,737, 3619, 3388, 37402,42519,2041, 4642, 6705, 20471,34504,2137, 37396,36666,34625,9026, 2176, 1649, 25850,27188,38357,39051,38108,14888,14887,42519,6012, 11772,36666,8464, 24943,39968,39967,26958,14700,8873, 2847, 6982, 1967, 34151,1271, 10040,34460, 26787,35793,33785,922, 21446,10477,35085,28466,32906,16249,15204,20626,38027,25088,4075, 17911,30285,30552,28209,20422,15439,35108,24281,3471, 3719, 14681,34641, 27725,34117,5354, 16248,15516,33201,17827,7218, 17826,42518,37368,34625,34204,37442,34494,38039,28606,6157, 34625,11470,22626,34625,30407,18985,36666,34624,13530, @@ -16651,41 +16646,41 @@ static const unsigned short Ranks[197839] = 24319,25052,29622,39967,34022,18248,1871, 8023, 12264,26876,38487,13226,22073,20304,17825,8131, 30948,13344,2571, 25060,18984,38648,27187,33864,5422, 12249,33864, 5384, 24673,34624,6662, 28132,24623,7100, 9827, 42518,35537,32298,34154,35536,10278,15203,39967,34624,38108,42518,24672,39967,1925, 26479,36665,42517,37221,39966, 32272,2748, 14358,33264,39966,42517,263, 42517,611, 15684,26672,36056,6690, 8199, 17675,38387,2376, 10253,6217, 23783,2085, 42517,39966,20805,23841,10277,42516, - 9557, 36665,38108,42516,17225,217, 241, 4850, 21805,13832,42516,12830,35391,6500, 416, 6905, 30406,4074, 21348,6689, 39966,39965,2448, 10252,36664,4362, 341, + 9557, 36665,38108,42516,17225,217, 241, 4850, 21805,13832,42516,12830,35391,6500, 416, 6905, 30406,4074, 21348,6689, 39966,39965,2448, 10252,36664,4362, 341, 35536,24671,623, 9950, 32271,42516,35091,36502,36464,42515,35674,37371,14645,17050,14597,28711,19039,20723,21793,34624,855, 16258,33870,38107,39060,886, 31355, - 758, 22161,25625,1458, 35536,22625,34623,20303,30328,485, 8568, 39965,23579,30458,13831,8758, 8034, 36664,9932, 1502, 39965,3275, 1293, 26750,5586, 22861,6233, - 2733, 597, 27415,5910, 18548,32906,19817,18842,31569,21691,30915,9999, 38849,37137,7712, 35176,34384,39965,5931, 15554,27658,12603,18842,21258,29177,29795,7629, + 758, 22161,25625,1458, 35536,22625,34623,20303,30328,485, 8568, 39965,23579,30458,13831,8758, 8034, 36664,9932, 1502, 39965,3275, 1293, 26750,5586, 22861,6233, + 2733, 597, 27415,5910, 18548,32906,19817,18842,31569,21691,30915,9999, 38849,37137,7712, 35176,34384,39965,5931, 15554,27658,12603,18842,21258,29177,29795,7629, 24426,4911, 42515,15202,21917,38872,35041,26548,15646,7334, 42515,38107,42515,4221, 39317,30047,18314,9556, 11498,38362,39158,1704, 33863,39964,27497,4346, 18121, 28686,18092,33863,35536,32270,4366, 25924,38107,33800,17019,20804,13051,20875,29591,26439,32800,35744,38107,28374,39964,38106,22624,37228,33162,155, 16497,34391, 17285,27800,35188,21120,39964,15960,20946,20527,33286,25396,15717,18487,18983,1691, 2056, 6788, 24225,17303,4477, 33796,5784, 4763, 31303,9826, 35400,13249,19065, 33560,1689, 4861, 37921,20803,12500,3838, 38103,33867,14932,11771,39964,19343,5843, 18116,13343,9624, 11497,35535,39963,15370,42514,42514,38106,34623,12497,35535, 39344,20302,11539,36664,38277,8937, 20393,20802,36664,2066, 6624, 14063,18282,12744,8419, 14084,13825,35481,42514,42514,34623,37317,27186,18423,8887, 36667,30405, 39963,14504,35513,42513,38164,27185,5197, 13520,39963,8198, 42513,36978,27184,1323, 16222,30348,8336, 18422,38106,28474,17125,168, 33049,13596,13842,33422,17347, - 37283,5051, 3476, 10366,29562,7963, 36520,37560,2319, 3942, 39963,39962,18153,15987,24670,3077, 133, 33200,16448,8757, 612, 1426, 25871,14886,32920,33200,5512, - 30377,36361,38106,39962,36663,10950,39049,36607,37821,14830,13828,39962,42513,25849,33085,38105,16365,18982,1000, 30404,17824,4493, 25848,38105,4593, 1035, 965, - 27335,42513,35535,1778, 27377,35535,35534,7044, 7306, 42512,4819, 1391, 39962,38105,918, 34623,6703, 32269,4163, 42512,36069,30403,2480, 11800,39961,12011,7664, + 37283,5051, 3476, 10366,29562,7963, 36520,37560,2319, 3942, 39963,39962,18153,15987,24670,3077, 133, 33200,16448,8757, 612, 1426, 25871,14886,32920,33200,5512, + 30377,36361,38106,39962,36663,10950,39049,36607,37821,14830,13828,39962,42513,25849,33085,38105,16365,18982,1000, 30404,17824,4493, 25848,38105,4593, 1035, 965, + 27335,42513,35535,1778, 27377,35535,35534,7044, 7306, 42512,4819, 1391, 39962,38105,918, 34623,6703, 32269,4163, 42512,36069,30403,2480, 11800,39961,12011,7664, 28710,42512,25847,6541, 21072,33863,6387, 3501, 42512,29465,15975,10251,5317, 1312, 19995,2790, 12999,11725,14652,2728, 2410, 36265,35534,39961,16950,36091,35833, 33049,8854, 6501, 9272, 6406, 29290,35534,36663,34010,12899,39961,13248,39961,16406,34695,2741, 7133, 33356,26898,20801,9010, 10025,16303,33877,38105,14624,18597, - 33326,33863,39960,33862,5055, 8705, 8366, 24669,36663,39960,42511,39960,33862,28709,5383, 38104,39960,42511,7663, 42511,35534,34622,36663,38104,38104,42511,3608, + 33326,33863,39960,33862,5055, 8705, 8366, 24669,36663,39960,42511,39960,33862,28709,5383, 38104,39960,42511,7663, 42511,35534,34622,36663,38104,38104,42511,3608, 36662,42510,38104,7755, 39959,34622,39959,33200,24539,39959,37138,22623,33862,38103,33200,17124,28385,10276,23578,38103,35533,34902,34857,27183,24668,35533,42510, - 42510,34622,20301,36662,38103,8704, 42510,42509,38103,15986,38102,12998,42509,42509,32938,23577,34622,36662,42509,2674, 42508,37762,35533,22622,42508,30402,3547, + 42510,34622,20301,36662,38103,8704, 42510,42509,38103,15986,38102,12998,42509,42509,32938,23577,34622,36662,42509,2674, 42508,37762,35533,22622,42508,30402,3547, 2716, 35533,1775, 20800,4108, 13385,42508,2680, 33862,406, 2869, 18844,23165,10585,23360,24555,34872,37201,42508,16486,17562,29804,36029,23224,33199,32268,24667, 39959,36662,38102,7940, 42507,5926, 34127,35878,22821,36661,20578,34621,5725, 22410,5234, 24666,36735,2948, 22813,2827, 7508, 33067,36864,24114,16059,20405,27053, - 32485,20027,34621,37401,11977,9886, 36902,4848, 15630,568, 20023,20300,28760,8350, 2705, 28645,42507,30395,8423, 38102,27781,35532,33519,6888, 2530, 13529,3573, + 32485,20027,34621,37401,11977,9886, 36902,4848, 15630,568, 20023,20300,28760,8350, 2705, 28645,42507,30395,8423, 38102,27781,35532,33519,6888, 2530, 13529,3573, 25846,28708,12997,30459,18428,35532,29230,6067, 10123,39958,27182,33861,35532,35846,24665,36661,26658,4228, 42507,30401,36661,42507,32267,33861,42506,16405,23576, 35532,38102,42506,16404,34141,2511, 30400,39958,18115,20799,9120, 19165,7185, 30913,91, 3486, 32266,20299,9292, 14869,7939, 33400,19342,39958,4808, 26665,42506, 34621,32022,36222,14135,28707,35075,10949,39958,33199,4702, 30399,20475,28010,39957,14134,38101,34380,34568,25328,2619, 36383,38432,39957,27381,11748,421, 19789, 9013, 5763, 20184,7634, 349, 34621,39957,30652,2347, 10789,876, 23524,12742,27473,9098, 35881,24518,7581, 22721,15201,39957,23970,39956,19179,1234, 32886,17123, 8130, 11039,1036, 10459,27395,26582,13705,12190,3667, 31204,24033,24783,5177, 8232, 19786,32856,24492,8467, 17865,35401,9721, 29457,2447, 34620,42506,13247,15573, 38101,5585, 34620,33861,2423, 33861,35483,36661,3546, 2320, 33206,42505,1967, 17284,8805, 42505,30398,24796,38101,36660,25235,35531,4617, 42505,19341,39956,42505, - 42504,38101,36800,27652,11770,20605,20279,42504,39956,16246,38100,25845,24593,664, 1035, 38100,32265,28706,36660,3086, 38100,37985,39956,5708, 134, 24936,3891, - 15381,11117,27266,19716,17623,13896,14196,11226,36038,25208,12743,38100,32812,38236,4014, 19340,19339,4637, 1225, 14090,17122,6152, 8129, 27181,18114,21792,5296, + 42504,38101,36800,27652,11770,20605,20279,42504,39956,16246,38100,25845,24593,664, 1035, 38100,32265,28706,36660,3086, 38100,37985,39956,5708, 134, 24936,3891, + 15381,11117,27266,19716,17623,13896,14196,11226,36038,25208,12743,38100,32812,38236,4014, 19340,19339,4637, 1225, 14090,17122,6152, 8129, 27181,18114,21792,5296, 1473, 862, 6636, 82, 33002,42504,13246,42504,34620,27180,16707,10975,17506,42503,23438,25542,35550,38099,33860,3897, 33199,34451,18634,28705,39955,14572,33199, 9554, 4323, 27179,11222,42503,38099,15985,579, 22621,35903,2151, 9372, 30197,8756, 38492,12175,5590, 31445,32264,37639,38099,34620,834, 8370, 33158,36260,35028, - 36660,34703,39955,5316, 12228,35531,31463,38099,37851,35934,6311, 31095,7445, 21147,38675,3921, 29619,39955,33990,38994,9150, 7109, 17776,32855,25511,38498,7754, + 36660,34703,39955,5316, 12228,35531,31463,38099,37851,35934,6311, 31095,7445, 21147,38675,3921, 29619,39955,33990,38994,9150, 7109, 17776,32855,25511,38498,7754, 36187,16838,13528,37208,3042, 33860,13840,1491, 36660,39148,37694,13342,28704,10948,34217,7256, 33860,10772,9291, 23575,39296,24664,31291,38033,3839, 18421,36485, 22706,35812,24113,33303,30752,15550,33014,20298,15984,42503,13483,15572,38295,37584,1947, 35052,34619,3651, 31128,38098,2092, 11496,38098,227, 910, 14490,39955, - 13627,35531,39954,36659,22620,5556, 21791,39954,29372,17121,42503,34619,18113,39954,54, 16245,20297,38098,32810,32937,12482,532, 14357,1855, 9271, 1773, 199, + 13627,35531,39954,36659,22620,5556, 21791,39954,29372,17121,42503,34619,18113,39954,54, 16245,20297,38098,32810,32937,12482,532, 14357,1855, 9271, 1773, 199, 25848,25413,5555, 4920, 18112,293, 18533,7762, 6460, 20983,13475,33860,28732,28703,13341,1676, 13340,15750,8197, 32813,1522, 32275,32983,20798,17120,4286, 20797, 17119,2535, 15515,6764, 7402, 12499,16812,6584, 10699,20796,5908, 1157, 21258,4704, 3631, 9119, 14356,2451, 39954,28702,13339,33859,27178,7707, 9788, 38098,26845, 10304,33859,42502,28701,30397,9241, 17804,8518, 36659,34619,23218,30396,3510, 39953,33859,42502,1906, 28372,42502,31, 21220,22742,42502,13245,39953,21790,25056, @@ -16693,10 +16688,10 @@ static const unsigned short Ranks[197839] = 21790,36281,28700,18111,17302,661, 24960,36987,28699,34694,18725,18110,36166,2890, 8287, 23884,20961,12139,2315, 15925,3646, 38096,9668, 15571,1946, 1917, 38096, 1382, 1741, 25466,35530,36659,34619,335, 442, 25844,16403,451, 38096,25843,17118,36658,34618,42501,11117,15570,37996,2058, 1394, 17822,28698,8128, 33198,27177, 25842,302, 16511,11322,2938, 14725,38096,187, 2986, 26644,42501,34618,32263,78, 2985, 2547, 25841,647, 7295, 16465,36145,3724, 36184,35781,24058,38095,30775, - 2892, 42501,1590, 1171, 9290, 34618,32262,39953,2732, 36148,2853, 34618,35530,33198,39040,540, 26546,5783, 35972,42500,23574,34617,42500,33210,165, 20795,1683, + 2892, 42501,1590, 1171, 9290, 34618,32262,39953,2732, 36148,2853, 34618,35530,33198,39040,540, 26546,5783, 35972,42500,23574,34617,42500,33210,165, 20795,1683, 1087, 2937, 751, 18786,3723, 14355,34610,28697,34617,34937,36658,30395,33198,33859,11143,2546, 39952,569, 42500,42500,12742,42499,7571, 6611, 42499,42499,42499, 24333,33858,28696,34617,33198,394, 36658,16402,33858,21010,1112, 4841, 14371,20876,32419,2443, 2691, 42498,9984, 24978,13244,17916,33858,39952,36658,37314,38095, - 35530,7610, 771, 36657,36657,34617,39952,20794,39952,35530,42498,17821,38095,39951,11327,734, 38095,33858,1846, 15569,35906,20296,42498,22815,39951,31589,292, + 35530,7610, 771, 36657,36657,34617,39952,20794,39952,35530,42498,17821,38095,39951,11327,734, 38095,33858,1846, 15569,35906,20296,42498,22815,39951,31589,292, 11503,19420,26060,35529,15600,38116,39951,11432,39951,30394,9681, 37382,42498,152, 35995,38094,36149,39950,36657,39950,17820,20436,36657,7643, 33998,11799,36656, 10822,39371,32660,42497,42497,17301,38094,39183,4889, 16244,23159,42497,993, 10698,36656,38094,27176,748, 3500, 6284, 39950,20874,4431, 39950,24662,507, 13338, 33857,13527,3145, 6985, 8520, 13484,8482, 39949,34616,570, 23082,1177, 2366, 36656,42497,39949,42496,32261,4365, 1165, 11326,38094,3356, 25840,42496,6283, 35529, @@ -16708,14 +16703,14 @@ static const unsigned short Ranks[197839] = 25305,11259,24466,32866,16645,23215,14383,12584,10677,11084,22326,20307,28412,17516,32264,28610,12763,30695,13123,24523,27291,26783,31618,2353, 15251,13879,30964, 24405,28053,20891,13829,18420,29529,42494,13387,5113, 13105,27828,3598, 23433,39946,32973,30391,25844,19593,11700,10998,37962,430, 8703, 27768,17081,9211, 20736, 28117,13436,30383,9032, 32903,10398,39946,6495, 17157,24495,27807,16069,6596, 17175,1815, 27575,3129, 7719, 2221, 5821, 5152, 3128, 12898,14354,13828,4072, 27832, - 16243,1093, 2422, 42494,28555,14884,19242,414, 7652, 7625, 7507, 20483,360, 9051, 30887,11140,8807, 33197,39946,35528,38093,19839,12811,25453,11312,357, 2799, - 27185,15446,10758,32260,19998,650, 34616,42494,15164,22529,36654,17818,18419,38092,5808, 10604,42494,15444,266, 32879,494, 32926,32415,20791,2791, 9570, 8335, + 16243,1093, 2422, 42494,28555,14884,19242,414, 7652, 7625, 7507, 20483,360, 9051, 30887,11140,8807, 33197,39946,35528,38093,19839,12811,25453,11312,357, 2799, + 27185,15446,10758,32260,19998,650, 34616,42494,15164,22529,36654,17818,18419,38092,5808, 10604,42494,15444,266, 32879,494, 32926,32415,20791,2791, 9570, 8335, 9267, 20986,22690,14941,24639,14308,31062,23552,18781,42493,23932,42493,12248,1388, 3721, 9288, 14320,12822,8913, 4932, 12806,519, 9035, 8707, 24826,42493,38092, 39946,20295,1483, 28694,38092,6038, 36258,966, 35528,13335,16836,21009,27174,8480, 38092,42493,17817,35527,34615,42492,21008,453, 42492,39945,17512,38462,42492, 35592,36653,28693,5907, 35527,9568, 246, 38091,347, 32259,13243,15568,505, 19019,5547, 7850, 36444,12138,574, 21789,2529, 17582,36653,31690,39945,33197,34615, 25835,22211,4979, 8859, 42492,4083, 10250,7938, 3762, 14488,16515,25834,42491,8127, 5494, 1485, 8933, 23572,1089, 11797,6447, 35527,38091,19638,37115,33089,42491, 28754,3357, 3868, 42491,1891, 7701, 8947, 34375,36388,7819, 2036, 42491,2021, 546, 39945,35527,38091,34615,7002, 39945,8819, 4580, 33856,890, 35526,38091,38090, - 32258,29380,15514,34510,42490,7267, 26642,34615,36653,37634,39944,38090,35526,7753, 39944,19847,9554, 36417,16549,17542,38286,38144,34653,6918, 12165,17329,4766, + 32258,29380,15514,34510,42490,7267, 26642,34615,36653,37634,39944,38090,35526,7753, 39944,19847,9554, 36417,16549,17542,38286,38144,34653,6918, 12165,17329,4766, 21498,2316, 3578, 33813,9169, 28857,12108,11925,18689,6313, 15271,11680,32837,32143,22335,3314, 7527, 34614,42490,39056,32257,3235, 1892, 16890,15723,42490,42490, 39944,42489,792, 3485, 1170, 26221,21950,34614,35420,8754, 3568, 38431,42489,33907,30687,38206,42489,39250,42489,13824,42488,11155,33856,14883,11591,38090,22575, 34308,39944,33197,42488,36653,26097,25671,7500, 19637,21788,34548,38090,5624, 36652,36203,32920,38965,33196,33196,17117,19336,20790,31231,17372,36688,13489,11769, @@ -16723,25 +16718,25 @@ static const unsigned short Ranks[197839] = 17299,8150, 33196,30058,11873,867, 9701, 36117,9684, 33009,34055,38089,33856,39943,39943,36652,33196,37087,30390,12496,42487,2936, 457, 32132,7372, 1802, 13823, 686, 35949,36652,9118, 33378,28692,28883,25833,1399, 692, 1754, 6173, 789, 12854,20699,42487,1181, 642, 3036, 145, 32910,1960, 498, 717, 39942,18981,42487, 19335,969, 501, 32254,39942,16400,6666, 33025,38089,25832,38089,25831,25830,2923, 5421, 38089,8242, 10476,20817,4477, 3193, 42487,25829,34614,8507, 21787,39942, - 20789,34613,39942,283, 471, 30201,17560,6325, 2215, 9656, 32262,13036,28270,14748,22555,19611,1398, 9424, 19724,21085,23940,10560,16252,19741,31202,1860, 9007, - 6949, 5438, 7314, 27208,28390,42486,34613,24348,7609, 2047, 1051, 34403,23426,32239,11142,206, 26756,27030,24447,12349,32116,17116,15567,42486,38088,16399,6831, - 33855,21786,39941,42486,35525,42486,28691,33195,26930,42485,38735,39941,30389,33855,38154,36652,20205,34530,27586,5347, 2446, 28081,2984, 34613,39941,33195,8365, + 20789,34613,39942,283, 471, 30201,17560,6325, 2215, 9656, 32262,13036,28270,14748,22555,19611,1398, 9424, 19724,21085,23940,10560,16252,19741,31202,1860, 9007, + 6949, 5438, 7314, 27208,28390,42486,34613,24348,7609, 2047, 1051, 34403,23426,32239,11142,206, 26756,27030,24447,12349,32116,17116,15567,42486,38088,16399,6831, + 33855,21786,39941,42486,35525,42486,28691,33195,26930,42485,38735,39941,30389,33855,38154,36652,20205,34530,27586,5347, 2446, 28081,2984, 34613,39941,33195,8365, 15566,2975, 22581,32409,34717,25828,16669,39941,17672,38259,38088,38462,19866,33195,36651,39940,6635, 1639, 27585,28187,35460,28638,21785,1669, 39940,25827,42485, 18418,12996,11768,13214,39940,21784,7499, 25826,42485,33855,39940,36651,42485,34613,35525,19636,39939,20294,9170, 20788,39939,36651,42484,36651,39939,632, 15983, 42484,42484,38088,36650,13242,14133,33195,42484,42483,42483,19921,32253,21783,38088,2891, 42483,36650,5050, 33855,42483,12995,27173,39939,17298,38087,9047, 12431, 34372,31154,16981,37702,6005, 6665, 37878,42482,8361, 17816,37223,38087,39131,12584,13455,38087,3108, 33606,11495,38937,24657,9354, 931, 35525,8616, 30817,19680, 20293,33194,25825,38087,23571,39938,33812,23570,7266, 21782,983, 23181,42482,42482,36650,102, 21845,659, 2510, 33031,33854,13988,38086,39938,35013,13111,39324, - 17116,1571, 25824,11234,21781,27655,34612,42482,7210, 25059,27915,28134,18417,15565,36650,21257,38086,35525,36120,39938,286, 16079,30388,15199,7192, 4257, 9417, + 17116,1571, 25824,11234,21781,27655,34612,42482,7210, 25059,27915,28134,18417,15565,36650,21257,38086,35525,36120,39938,286, 16079,30388,15199,7192, 4257, 9417, 42481,31998,13827,34962,42481,34244,35170,33194,35524,35214,30486,18980,28690,348, 42481,36649,23811,38086,38086,12897,16242,6283, 20787,28963,39938,34049,35524, 1359, 37558,5076, 33194,42481,11767,39937,33854,21780,42480,8334, 36649,35786,3888, 31666,18108,12498,23431,34405,38857,32252,35642,20786,28251,42480,32251,23569, - 16603,38533,33381,23618,19374,39004,5505, 23768,15330,35983,42480,32420,34680,12766,11773,35524,8932, 38085,35989,10947,4592, 18107,20785,2340, 8702, 39937,9117, + 16603,38533,33381,23618,19374,39004,5505, 23768,15330,35983,42480,32420,34680,12766,11773,35524,8932, 38085,35989,10947,4592, 18107,20785,2340, 8702, 39937,9117, 6719, 8912, 18673,10122,39937,25656,437, 10475,33194,4050, 29352,39322,2532, 8753, 10275,634, 5847, 5696, 5990, 15513,15512,6820, 39937,1137, 35158,16835,18979, 3455, 21007,35524,38085,35524,8364, 36649,12227,13334,11325,39936,32250,42480,34612,21779,4044, 19635,39936,39936,8818, 39936,24656,5010, 35540,34612,33854,25823, 11537,35523,1463, 22011,32249,12910,42479,19456,35996,22964,33854,34925,37233,35052,36649,3769, 29294,12896,14353,33193,20784,34178,35523,38085,2744, 42479,36648, - 42479,38643,37592,15058,16116,4227, 28689,32248,35523,1666, 42479,7191, 42478,15194,25822,9770, 14830,11766,4000, 11536,39935,12112,36242,42478,35523,568, 8578, + 42479,38643,37592,15058,16116,4227, 28689,32248,35523,1666, 42479,7191, 42478,15194,25822,9770, 14830,11766,4000, 11536,39935,12112,36242,42478,35523,568, 8578, 20292,30387,39935,18978,42478,12994,17077,25821,18359,33708,34100,32793,1648, 35522,39935,5151, 34612,36648,36082,16834,24655,11141,35039,39935,8333, 19634,42478, 39934,1126, 36686,9442, 32098,17115,3891, 5597, 20783,17681,39934,29767,25805,11494,14487,10030,13826,18546,4430, 14882,3351, 2164, 16398,42477,23568,42477,42477, - 23567,19420,27172,33853,23265,31532,9827, 39934,8327, 33853,33853,15564,9063, 31474,39934,12495,38822,24913,21502,37325,1500, 38085,38084,34445,38815,39933,4977, + 23567,19420,27172,33853,23265,31532,9827, 39934,8327, 33853,33853,15564,9063, 31474,39934,12495,38822,24913,21502,37325,1500, 38085,38084,34445,38815,39933,4977, 3076, 42477,3031, 11472,15982,12497,24899,20782,19334,8933, 38084,38084,10427,33623,42476,36196,15563,6634, 36301,34611,36648,20291,39933,278, 3554, 18908,14041, 34611,16600,26066,35363,13109,17297,33193,36066,25820,38084,42476,22618,7060, 26619,36138,35522,23566,22874,31181,34611,38669,38083,28688,16833,37933,34611,36648, 34610,3127, 30386,30385,33853,23880,927, 14352,39933,27281,5584, 7401, 20936,8772, 14970,25593,14339,39933,1945, 42476,30384,12539,38083,42476,16042,24520,36521, @@ -16753,11 +16748,11 @@ static const unsigned short Ranks[197839] = 32247,15035,17114,15602,33541,42473,18415,322, 36647,14131,34592,24759,2935, 841, 27171,1682, 1371, 17155,2509, 2394, 34610,17815,36646,2774, 416, 32246,33612, 39931,42473,38682,25817,17113,166, 3417, 368, 851, 36851,33713,2583, 36646,32984,34610,996, 8765, 25964,956, 23126,295, 18113,37012,19685,5346, 5654, 10387, 19805,8067, 25333,1403, 33459,34609,39930,15021,38082,33274,35521,42472,24653,38898,34686,17256,29942,10951,36646,14881,42472,33209,36639,28685,36646,33192,21778, - 22922,31992,33456,42472,36645,23688,31972,35432,37779,2081, 14307,18414,10945,19549,12227,22616,13901,25789,29044,12495,20781,39347,20780,16240,16239,12894,4636, + 22922,31992,33456,42472,36645,23688,31972,35432,37779,2081, 14307,18414,10945,19549,12227,22616,13901,25789,29044,12495,20781,39347,20780,16240,16239,12894,4636, 10697,12893,16238,19332,23132,5682, 23278,23942,8824, 16746,36830,36706,26142,23920,36363,27644,38103,29296,15969,33783,8580, 38899,20954,8521, 7536, 31735,31551, 31669,16434,34285,7304, 5079, 13783,29135,36838,16092,39241,17287,18473,33018,30963,14774,24403,12114,17897,15326,13672,22395,27616,29139,38999,831, 37200,20779, 29033,28617,33100,26709,25816,37096,38575,15198,33192,39930,28968,24163,27479,37812,16161,42472,3607, 23185,35521,42471,26176,34609,18413,38082,12298,31020,36540, - 29886,39930,35484,38082,39930,33852,33852,3079, 21006,251, 2890, 21777,15981,11324,20289,14130,36645,36018,38288,38082,393, 12494,39929,30382,35521,8577, 1880, + 29886,39930,35484,38082,39930,33852,33852,3079, 21006,251, 2890, 21777,15981,11324,20289,14130,36645,36018,38288,38082,393, 12494,39929,30382,35521,8577, 1880, 39351,30923,38081,36211,803, 20952,13871,42471,17117,37591,6861, 24652,14880,25815,20778,38081,39929,34499,34181,38081,25814,42471,6904, 42471,19331,42470,37329, 17485,20680,18239,22695,25718,18977,39929,12277,39929,36645,38485,34502,5782, 15509,5539, 24998,34609,6263, 10426,17295,32974,25168,19330,36645,36644,4115, 26757, 38204,29617,35279,33852,26416,8799, 24153,23563,42470,42470,32245,42470,22975,39928,39928,42469,30238,33192,42469,36644,19329,35520,38081,42469,42469,42468,11758, @@ -16765,7 +16760,7 @@ static const unsigned short Ranks[197839] = 42467,2422, 34609,39928,6505, 14133,3995, 4932, 15182,36644,34324,14486,39927,31793,34608,34608,33460,37274,36946,36307,34608,12226,35520,37226,17814,6762, 37044, 21004,28684,5114, 33851,6739, 5382, 15282,15197,35520,1924, 36644,42467,30381,38080,33851,34608,35314,15508,34491,1772, 10274,33850,39927,35520,9441, 34406,35519, 27097,35519,33093,17112,19327,16237,36894,14129,22535,14879,824, 13283,21681,26594,36503,3878, 2348, 26094,16356,19366,33493,38080,18106,34607,42467,30380,19632, - 3797, 38080,36643,8449, 35519,30567,42466,38080,33192,39927,20777,6903, 30379,35745,28683,33850,39927,42466,806, 39926,2246, 22186,33850,10425,39926,8286, 5009, + 3797, 38080,36643,8449, 35519,30567,42466,38080,33192,39927,20777,6903, 30379,35745,28683,33850,39927,42466,806, 39926,2246, 22186,33850,10425,39926,8286, 5009, 25812,14878,28682,20288,5827, 7697, 10944,30378,42466,42466,33850,2621, 36643,320, 10290,27170,42465,3356, 32915,18874,16226,21119,16831,42465,39926,34607,28681, 33191,33191,18412,38610,37001,42465,7709, 1499, 37607,19644,11492,36643,35289,33191,36643,35519,906, 33849,3625, 21003,34219,39926,9287, 15784,34037,38079,19326, 35518,7406, 28680,13087,39925,42465,35944,32243,16830,3167, 42464,38079,33849,16397,16396,36642,38079,33849,21776,38079,42464,33110,22614,38078,14485,39192,42464, @@ -16775,7 +16770,7 @@ static const unsigned short Ranks[197839] = 21141,16902,37077,36135,38078,35803,27571,26237,35648,30377,39924,42462,35391,36802,32242,39924,42462,23561,33633,2293, 32983,38077,533, 21013,33848,34606,37261, 4378, 34725,5806, 7013, 27822,3644, 21861,2139, 36642,1959, 2189, 25607,21775,3158, 15566,33336,34015,23560,34605,35518,27502,32241,38077,33006,15196,35518,12820, 17394,4237, 35588,6080, 31085,17813,39923,35517,24745,810, 14351,9269, 42461,30826,899, 14246,34988,17812,8583, 14828,19530,19649,9983, 15195,267, 28984,11399, - 25005,35470,652, 42461,33848,36641,38077,4492, 8596, 14551,65, 31421,39923,9924, 21774,42461,39155,3085, 15092,873, 2983, 33411,32501,323, 836, 37387,6819, + 25005,35470,652, 42461,33848,36641,38077,4492, 8596, 14551,65, 31421,39923,9924, 21774,42461,39155,3085, 15092,873, 2983, 33411,32501,323, 836, 37387,6819, 28679,36641,39923,5677, 3999, 38077,19631,36641,16122,35517,7190, 801, 19301,25232,27390,27116,20920,34031,38249,38076,37494,10696,17115,37116,39174,17205,38224, 7321, 37154,30770,21002,1999, 4151, 21001,42461,3113, 32887,42460,38076,27294,35517,9209, 197, 20577,2549, 14142,19758,29801,19389,35039,33191,34605,21773,32240, 29699,39923,36084,17294,39922,3996, 2545, 21809,833, 28115,678, 24704,27918,15507,19313,25758,1110, 21561,33848,38747,34562,39922,16925,35651,10630,27169,30376, @@ -16785,13 +16780,13 @@ static const unsigned short Ranks[197839] = 36978,36141,31550,38076,9826, 3146, 37282,11765,32238,22612,39920,32924,32237,39920,18411,5113, 29344,30577,32252,21895,36640,37911,42459,8911, 24380,7637, 33847, 29469,39920,29537,42459,27578,3145, 19630,7333, 38075,9286, 37889,39920,42459,1998, 2393, 1977, 7948, 36640,22611,33847,2474, 37009,38075,33190,42458,38075,13233, 459, 42458,2413, 39919,19629,1221, 12523,36714,2694, 661, 1326, 7662, 10445,42458,9886, 39919,33847,936, 35516,3920, 4843, 27678,38075,2445, 6513, 9416, 39919, - 9555, 23569,28675,42458,20775,42457,3931, 22610,39919,4230, 36748,60, 30293,3362, 30591,13605,16158,31785,13410,31116,14868,36640,39918,4697, 15998,42457,2752, - 9622, 36250,14665,34860,38085,37947,17314,37949,14854,327, 1180, 32480,6476, 23612,5083, 26651,25865,14079,2087, 28438,21899,5112, 28030,3565, 9825, 2362, 9621, + 9555, 23569,28675,42458,20775,42457,3931, 22610,39919,4230, 36748,60, 30293,3362, 30591,13605,16158,31785,13410,31116,14868,36640,39918,4697, 15998,42457,2752, + 9622, 36250,14665,34860,38085,37947,17314,37949,14854,327, 1180, 32480,6476, 23612,5083, 26651,25865,14079,2087, 28438,21899,5112, 28030,3565, 9825, 2362, 9621, 2436, 35253,29263,8321, 25809,36639,29292,38074,5150, 12136,38074,38074,12493,24552,13331,32979,34347,19405,34863,36639,5519, 7906, 39918,32893,33190,36639,38074, - 38073,28683,33846,36639,36638,15980,23559,39918,42457,39918,14827,39917,34605,34604,10720,35972,32424,7136, 38073,23558,20999,11220,33846,34604,36638,18721,9520, + 38073,28683,33846,36639,36638,15980,23559,39918,42457,39918,14827,39917,34605,34604,10720,35972,32424,7136, 38073,23558,20999,11220,33846,34604,36638,18721,9520, 15554,9195, 30922,9699, 36838,30811,38390,8624, 6831, 3960, 2799, 33418,12892,24048,20101,33802,4694, 33346,37174,26058,33643,11795,42457,39917,33129,36638,42456, 36491,25281,18342,14350,3157, 19325,42456,38561,20774,16234,14876,11491,38924,42456,24684,35239,3806, 19158,12010,28673,1434, 20773,19324,39917,35516,34604,21854, - 425, 16531,1640, 21668,3853, 33360,14484,32820,25395,42456,35495,29067,15094,37370,38073,7420, 19143,8817, 42455,34604,33189,42455,39917,28674,38073,42455,2653, + 425, 16531,1640, 21668,3853, 33360,14484,32820,25395,42456,35495,29067,15094,37370,38073,7420, 19143,8817, 42455,34604,33189,42455,39917,28674,38073,42455,2653, 4765, 19552,39916,33846,42455,21771,42454,27167,28175,28673,42454,6066, 14349,33846,42454,23191,42454,10474,38072,38399,28126,2018, 37367,24483,39916,12492,10571, 23575,6101, 8868, 33558,37437,34521,10736,19628,21287,27625,26273,3783, 33189,34938,33843,8939, 35515,34897,33189,3643, 13853,8018, 10679,42453,14450,7370, 36638, 2125, 36637,34439,20772,9698, 30374,36488,37238,38072,33189,35409,9982, 11275,8016, 13825,36712,31069,25224,4526, 36895,35446,38072,16141,25808,31955,34387,23263, @@ -16799,41 +16794,41 @@ static const unsigned short Ranks[197839] = 25415,16847,26517,38369,32236,13822,4608, 34603,39916,39915,33845,37383,15979,15194,10046,8766, 23721,37670,15978,19627,36637,36703,36636,10950,39915,36636,37251, 42453,2115, 5727, 915, 26211,16394,11323,30533,35515,11140,42453,37408,39915,42452,39915,42452,36636,42452,39914,37971,8576, 38072,35434,38149,862, 2582, 28672, 42452,1593, 2224, 18467,31768,1015, 14228,32637,18807,16259,42451,6100, 38475,11543,38557,42451,2550, 42451,21770,42451,33845,34771,38070,39914,919, 30488,36636, - 5111, 12891,1526, 2773, 4933, 10248,38071,36635,27166,17811,6729, 35757,33188,35515,9697, 33845,27241,35733,8931, 39386,1978, 20548,20771,39914,10029,6744, 5025, - 12876,13333,12890,18105,37943,42450,14519,196, 37858,33188,2260, 14186,30373,38071,18747,42450,7498, 42450,36635,9620, 29466,33845,28410,38071,2730, 7034, 791, + 5111, 12891,1526, 2773, 4933, 10248,38071,36635,27166,17811,6729, 35757,33188,35515,9697, 33845,27241,35733,8931, 39386,1978, 20548,20771,39914,10029,6744, 5025, + 12876,13333,12890,18105,37943,42450,14519,196, 37858,33188,2260, 14186,30373,38071,18747,42450,7498, 42450,36635,9620, 29466,33845,28410,38071,2730, 7034, 791, 12937,34045,33188,22609,11535,33188,10121,20770,36719,32070,10446,26352,28087,2443, 35504,27577,1727, 38723,1520, 35250,37141,3003, 3000, 2003, 38925,25807,17799, 38664,7345, 12491,39914,34603,42450,29576,15977,33783,8242, 1916, 2934, 34364,34218,42449,27165,11219,27164,16826,32235,25806,36635,33844,25805,3205, 3416, 31972, 5852, 33187,8930, 32552,29207,39913,35869,30554,34603,17270,38650,38071,30051,9593, 9116, 26144,39913,21456,7559, 42449,38635,8398, 18243,36635,30372,21694,32234, 30371,37839,38730,35107,34458,42449,39229,19626,36634,39913,36634,33844,12792,39913,38070,20287,39912,11764,37210,2311, 20769,2476, 23557,7189, 37231,42449,42448, 20975,15231,39912,21774,38623,17910,16825,33844,24647,16014,38070,42448,175, 8546, 37943,36694,15232,39008,10165,19323,42448,1202, 12147,30619,16185,700, 11490, - 2498, 18196,26781,32233,25644,39912,10424,33773,35345,37782,28250,5687, 28913,33265,35515,33296,27163,42448,22780,28671,33577,9402, 11058,22837,16072,27693,1251, - 5870, 30955,30859,75, 36382,3720, 24390,6412, 38070,14854,42447,13525,13466,35972,16440,10862,10297,30724,27670,28005,5695, 18104,32018,3422, 32536,24316,3927, + 2498, 18196,26781,32233,25644,39912,10424,33773,35345,37782,28250,5687, 28913,33265,35515,33296,27163,42448,22780,28671,33577,9402, 11058,22837,16072,27693,1251, + 5870, 30955,30859,75, 36382,3720, 24390,6412, 38070,14854,42447,13525,13466,35972,16440,10862,10297,30724,27670,28005,5695, 18104,32018,3422, 32536,24316,3927, 308, 10703,18103,1895, 36634,29660,35471,42447,35761,3624, 3068, 33844,286, 13332,33187,28670,28669,34603,13114,30565,35629,39912,38070,14666,39911,38936,35514, 9546, 36634,32935,7188, 33843,34592,11763,19032,23213,33058,25287,29363,22844,11983,669, 3588, 29811,14588,32162,37890,38281,22237,24720,35577,42447,17293,35888, - 38804,32172,8444, 9754, 33187,9060, 34602,42447,36167,36165,37417,36391,23556,9518, 39911,4366, 34100,33843,26079,36757,28533,37361,34856,34708,34932,38069,8682, + 38804,32172,8444, 9754, 33187,9060, 34602,42447,36167,36165,37417,36391,23556,9518, 39911,4366, 34100,33843,26079,36757,28533,37361,34856,34708,34932,38069,8682, 34602,12969,33843,20998,33843,18102,31137,14678,20768,35618,33187,2278, 29021,12494,38069,33929,8185, 29355,36633,35040,42446,36633,12296,16393,42446,39911,16824, 35514,35514,36633,33186,34602,31728,27162,39911,16866,23941,33984,38069,36061,6801, 32860,16233,39910,39910,29725,32461,34602,21769,34281,38105,4931, 39910,39910, - 6537, 24828,42446,4793, 7459, 4657, 34442,12000,38573,34282,13805,2012, 4284, 28018,38069,37155,27161,14483,34881,19883,14128,15976,39909,315, 9805, 24176,955, + 6537, 24828,42446,4793, 7459, 4657, 34442,12000,38573,34282,13805,2012, 4284, 28018,38069,37155,27161,14483,34881,19883,14128,15976,39909,315, 9805, 24176,955, 20286,42446,39909,20767,33324,12225,16218,33186,11612,8791, 20769,39909,22712,32701,351, 34601,773, 37550,13238,38068,20285,42445,24646,30413,39116,38068,42445, - 6953, 38346,42445,38068,33842,3719, 33186,42445,35107,38210,35514,42444,38068,775, 36337,34601,38067,42444,33504,39909,24645,28668,38067,35079,15506,39908,6704, - 36633,18101,28986,24769,36876,38035,7706, 11218,14875,17109,42444,35563,37749,34864,33462,36632,20973,5717, 1740, 15828,31497,14096,854, 15717,38488,36632,4494, + 6953, 38346,42445,38068,33842,3719, 33186,42445,35107,38210,35514,42444,38068,775, 36337,34601,38067,42444,33504,39909,24645,28668,38067,35079,15506,39908,6704, + 36633,18101,28986,24769,36876,38035,7706, 11218,14875,17109,42444,35563,37749,34864,33462,36632,20973,5717, 1740, 15828,31497,14096,854, 15717,38488,36632,4494, 38067,42444,6728, 18100,9981, 36632,38067,36075,19322,32762,30642,9619, 33978,948, 19220,2223, 19767,32232,9285, 2454, 42443,38066,36632,738, 36874,32231,39344, 27391,6551, 42443,22154,36631,39908,5113, 38066,25804,38066,2193, 35299,5737, 29973,10781,34601,1034, 22608,38066,35513,14826,19321,3204, 35513,38065,16823,39908, 12490,42443,3460, 35513,1740, 19699,39908,35513,38859,34601,32230,39907,33842,1576, 15257,27404,20284,35030,28667,39907,42443,34255,25297,35512,20575,42442,36631, - 19625,30370,25803,12009,12203,33773,4579, 6761, 37599,3572, 39161,33842,32229,35512,2809, 34197,38616,28666,42442,27348,42442,36631,35512,22607,38065,20766,6830, + 19625,30370,25803,12009,12203,33773,4579, 6761, 37599,3572, 39161,33842,32229,35512,2809, 34197,38616,28666,42442,27348,42442,36631,35512,22607,38065,20766,6830, 36631,28665,5473, 762, 17810,1699, 30369,5971, 8332, 17809,10273,35261,42442,13524,36088,21388,28664,35512,7929, 23555,32867,33240,37419,36630,19320,12779,14507, 30368,42441,42441,28495,360, 969, 14825,39907,36630,2982, 30512,8929, 38065,33186,42441,42441,6065, 12889,35296,10943,38065,25802,7937, 35357,38918,22606,42440, 36630,18410,33185,7400, 3649, 35511,39907,32228,39906,38064,15975,35911,39906,6824, 33842,33977,31352,37080,38064,18099,35462,35036,21603,18409,36813,32440,37904, - 35511,23554,35921,12135,39906,20909,25797,38064,33004,33792,38064,36168,10120,9879, 22105,3567, 38935,20404,14598,13237,38063,30885,26117,36630,36629,9115, 724, + 35511,23554,35921,12135,39906,20909,25797,38064,33004,33792,38064,36168,10120,9879, 22105,3567, 38935,20404,14598,13237,38063,30885,26117,36630,36629,9115, 724, 30435,21221,15165,4062, 12527,23732,32776,24306,20929,26226,29832,27708,20245,28829,26625,14243,5034, 39906,25989,25076,25739,4571, 14373,25147,2477, 39905,35557, - 5934, 34718,25999,11589,32826,28632,26541,38686,10774,19319,10574,38666,38063,25786,3138, 347, 39175,11024,8893, 27752,14852,18608,5889, 26013,25275,33801,8474, + 5934, 34718,25999,11589,32826,28632,26541,38686,10774,19319,10574,38666,38063,25786,3138, 347, 39175,11024,8893, 27752,14852,18608,5889, 26013,25275,33801,8474, 9034, 3925, 9321, 42440,25573,24644,39905,2271, 39255,39905,36629,10695,34811,35615,22787,6153, 20461,28579,38063,23518,33185,8085, 6498, 19843,42440,7983, 38063, - 25071,29617,33104,33841,36505,39905,13030,24529,14049,38492,24043,93, 18098,33109,26392,10408,2693, 35413,34483,1479, 11217,878, 26272,493, 37745,654, 7078, + 25071,29617,33104,33841,36505,39905,13030,24529,14049,38492,24043,93, 18098,33109,26392,10408,2693, 35413,34483,1479, 11217,878, 26272,493, 37745,654, 7078, 6951, 3491, 3156, 2330, 32227,15232,8928, 42440,38033,34600,34497,39904,16392,26561,35914,9804, 39904,28663,37061,28539,32226,34600,23356,35689,39904,25801,38610, - 39904,17676,34600,30393,38140,7714, 18097,42439,39903,26988,38365,37257,18273,33841,38611,42439,14482,33185,30367,12008,19607,42439,39903,42439,1974, 13564,996, + 39904,17676,34600,30393,38140,7714, 18097,42439,39903,26988,38365,37257,18273,33841,38611,42439,14482,33185,30367,12008,19607,42439,39903,42439,1974, 13564,996, 25754,21219,37571,38062,9097, 17820,10429,21589,22899,10767,33841,42438,20997,39903,8479, 24643,35511,36629,34600,3387, 16823,3293, 18846,34159,42438,18766,36629, - 2751, 32076,2245, 42438,8197, 17500,13941,37444,36628,32874,33695,35351,28728,42438,35775,34158,38711,3178, 24682,34599,35257,3843, 6155, 9278, 22404,24642,3885, - 37907,28201,4280, 9837, 11216,39903,34520,36628,8927, 36628,34768,15136,9268, 7869, 20283,23553,36628,8362, 20996,1122, 33841,11652,13062,21307,37245,23552,2933, + 2751, 32076,2245, 42438,8197, 17500,13941,37444,36628,32874,33695,35351,28728,42438,35775,34158,38711,3178, 24682,34599,35257,3843, 6155, 9278, 22404,24642,3885, + 37907,28201,4280, 9837, 11216,39903,34520,36628,8927, 36628,34768,15136,9268, 7869, 20283,23553,36628,8362, 20996,1122, 33841,11652,13062,21307,37245,23552,2933, 33185,1877, 34099,34599,38062,8987, 38960,42437,35511,30749,29986,28949,39902,8743, 35510,35184,33840,35237,32225,19091,4896, 22168,37868,32224,39902,42437,35510, 39411,36127,10942,32909,450, 3792, 17240,36544,19189,13028,39902,42437,39162,39902,42437,10941,36627,39901,33184,10766,3473, 21348,35299,34599,5841, 19678,28747, 14348,10028,8738, 9415, 38062,42436,17292,4460, 9169, 35510,27160,3974, 2834, 19303,27099,33598,37185,12297,34548,6633, 17808,30366,32223,10909,34599,15561,38062, @@ -16843,22 +16838,22 @@ static const unsigned short Ranks[197839] = 37559,17721,6099, 19318,15505,11215,3350, 24626,22604,39899,5554, 8916, 10241,9744, 13824,33512,6120, 32930,13984,6653, 11536,9414, 22603,38060,33353,35509,34598, 3292, 36189,10694,23025,35509,39899,33213,6009, 32934,3292, 3590, 12888,4220, 5596, 9822, 3832, 7705, 38574,11901,28541,34598,6760, 34302,15193,10291,13366,34598, 32929,3354, 10682,33904,24195,38075,42436,39085,33840,14127,36145,29012,35967,15504,24639,22164,8575, 36626,23551,22602,27394,11762,3914, 26956,35509,34598,42436, - 33839,35509,39899,984, 38060,39121,42435,30465,25799,3978, 27723,19739,319, 14481,33184,26963,25798,42435,32136,42435,5528, 19624,39898,9267, 17106,2001, 8070, + 33839,35509,39899,984, 38060,39121,42435,30465,25799,3978, 27723,19739,319, 14481,33184,26963,25798,42435,32136,42435,5528, 19624,39898,9267, 17106,2001, 8070, 28779,28969,18142,22229,2466, 34261,16391,7077, 42435,17939,36626,13331,28661,42434,329, 16963,27307,30272,15974,5274, 10118,20763,38099,16390,36099,8909, 12007, 16389,32624,3591, 36626,3433, 13862,9114, 23943,39898,34597,26545,34575,38744,15055,37614,16541,33066,21834,39048,35508,34051,18225,42434,19324,42434,31203,18801, - 4014, 21165,17613,32961,33839,22601,2327, 42434,30200,20804,11761,8241, 39898,39898,3054, 38060,7506, 33839,11489,34512,33839,10117,8240, 17807,30364,20282,5644, + 4014, 21165,17613,32961,33839,22601,2327, 42434,30200,20804,11761,8241, 39898,39898,3054, 38060,7506, 33839,11489,34512,33839,10117,8240, 17807,30364,20282,5644, 25698,42433,20179,39102,39897,42433,20762,14126,34787,32222,7332, 20281,20761,29993,23946,1329, 38059,29687,20760,25408,1684, 9758, 20995,9825, 22600,4932, 38059, 36625,17317,954, 32506,24591,5676, 35508,39897,19156,35053,33183,10052,13188,5781, 38059,35508,36919,25618,18985,33183,28357,29896,10027,42433,32989,39897,27158, 39330,27157,33838,38959,28660,31450,22599,24638,12489,35322,39897,2884, 39896,42433,36625,17291,10247,35508,3269, 5841, 21309,34465,37860,35904,25797,7403, 34523, - 39133,6474, 22075,38059,11890,38058,16232,20280,15973,6360, 939, 7621, 8009, 7820, 108, 18041,650, 32221,18408,42432,33183,24978,3333, 2469, 2509, 2798, 7399, + 39133,6474, 22075,38059,11890,38058,16232,20280,15973,6360, 939, 7621, 8009, 7820, 108, 18041,650, 32221,18408,42432,33183,24978,3333, 2469, 2509, 2798, 7399, 1734, 39896,36978,23456,34950,11501,6301, 6603, 8126, 2821, 3626, 38058,28420,640, 26732,42432,42432,38058,20279,15559,27156,39896,11659,34597,10193,68, 16231, - 16415,23550,38058,13523,38057,11577,39243,6446, 36625,34597,33838,28941,32980,4976, 37594,42432,13236,17105,11761,32673,9979, 42431,38623,36780,35381,24637,3782, + 16415,23550,38058,13523,38057,11577,39243,6446, 36625,34597,33838,28941,32980,4976, 37594,42432,13236,17105,11761,32673,9979, 42431,38623,36780,35381,24637,3782, 28659,32904,36209,33838,39896,3144, 42431,39895,36451,14283,32002,37195,42431,4324, 30499,1436, 37659,33173,38057,35718,36625,4768, 9107, 32220,36203,2473, 12745, 21491,2369, 33403,17104,5190, 6250, 21261,38794,4455, 23533,36746,30363,24678,2548, 35507,39895,35934,19298,37395,39204,14874,21777,33236,23764,4135, 874, 42431, 6116, 26833,21653,34302,35208,23549,35192,38057,27155,18405,2097, 32235,34597,3349, 42430,36303,42430,30362,2889, 1130, 23548,17833,7425, 23547,20339,20478,34596, 36624,42430,31739,27154,33183,30361,32803,35616,1384, 38057,38056,39895,33182,21598,21786,39895,20756,38056,10602,35386,39894,15192,26912,38056,37045,36677,39894, 42430,8239, 39894,42429,38056,33838,8383, 9930, 14818,6737, 993, 17547,35023,20603,42429,42429,6070, 17396,28095,37308,12006,38055,38055,28658,32219,11144,24636, - 3487, 21594,23971,5585, 39894,42429,32218,13335,12739,8465, 38055,30360,192, 32019,38055,5726, 13821,12224,9821, 8361, 42428,524, 31859,1160, 3566, 28073,1354, + 3487, 21594,23971,5585, 39894,42429,32218,13335,12739,8465, 38055,30360,192, 32019,38055,5726, 13821,12224,9821, 8361, 42428,524, 31859,1160, 3566, 28073,1354, 2692, 612, 23661,3718, 396, 1242, 39893,35405,35507,31627,3660, 968, 778, 38054,3143, 39893,34596,140, 33244,13039,31727,24021,9144, 28780,24036,24768,21669, 30726,30367,27419,31705,36264,33182,17806,39893,42428,9824, 3801, 5049, 20994,12069,4465, 33837,36624,3274, 36624,35507,20921,28315,21665,7756, 42428,5273, 37545, 42428,34596,42427,24635,6445, 18975,33182,19317,4065, 28657,30359,42427,23238,39893,42427,36624,42427,42426,28656,38054,833, 232, 24624,15972,38426,8125, 28655, @@ -16866,12 +16861,12 @@ static const unsigned short Ranks[197839] = 38053,11220,39892,11999,14309,366, 26095,42425,35506,3527, 36623,7402, 25796,33037,19274,14125,1275, 141, 9272, 23429,24305,34257,31289,39892,34596,658, 27153, 30819,3484, 8033, 27152,34595,13330,18937,24857,42425,33182,39891,7497, 9945, 34715,4640, 30358,33837,21170,38053,36223,33101,5772, 32353,32217,25210,2192, 12991, 22556,33837,35506,42425,36623,39891,42425,2602, 10940,42424,30357,33836,35506,34595,42424,8574, 31443,39891,39891,3415, 26891,36623,35498,42424,19934,9, 23407, - 2581, 1626, 31211,33980,39038,1928, 2314, 1449, 26810,35506,4468, 300, 7505, 1958, 732, 2334, 42424,35505,9820, 8850, 1149, 26054,42423,3084, 23492,2138, 2731, + 2581, 1626, 31211,33980,39038,1928, 2314, 1449, 26810,35506,4468, 300, 7505, 1958, 732, 2334, 42424,35505,9820, 8850, 1149, 26054,42423,3084, 23492,2138, 2731, 22598,772, 23546,2691, 35505,2932, 262, 2563, 5468, 33613,25104,26369,12566,14873,32054,34385,36651,35357,6316, 38053,39890,35505,2118, 637, 17045,23545,20759, 9284, 2313, 9593, 34595,945, 27151,42423,11017,32949,26049,38207,42423,633, 26949,3348, 42423,2544, 13823,307, 15558,21768,33181,2046, 3642, 29508,25795,38053, - 3273, 807, 7, 2920, 24109,10856,17864,26814,12374,39890,13822,33984,1028, 32191,15559,26692,1263, 30838,24923,35468,242, 868, 25218,14461,3483, 8360, 1340, - 1028, 370, 624, 13000,11360,571, 1569, 13047,35468,32967,2852, 771, 28653,34595,38052,18094,16388,10796,18666,3565, 44, 4923, 19620,20769,35186,2191, 1801, - 3482, 3481, 42422,35505,39194,36161,28652,19652,832, 2981, 33386,32696,9012, 22126,25322,15631,39361,31042,16230,30198,5054, 3977, 3166, 24720,2730, 42422,1383, + 3273, 807, 7, 2920, 24109,10856,17864,26814,12374,39890,13822,33984,1028, 32191,15559,26692,1263, 30838,24923,35468,242, 868, 25218,14461,3483, 8360, 1340, + 1028, 370, 624, 13000,11360,571, 1569, 13047,35468,32967,2852, 771, 28653,34595,38052,18094,16388,10796,18666,3565, 44, 4923, 19620,20769,35186,2191, 1801, + 3482, 3481, 42422,35505,39194,36161,28652,19652,832, 2981, 33386,32696,9012, 22126,25322,15631,39361,31042,16230,30198,5054, 3977, 3166, 24720,2730, 42422,1383, 20374,11166,27622,1817, 2657, 80, 15642,1050, 28565,11258,1252, 122, 8014, 17644,32528,23544,25794,11488,19622,23572,19316,33062,2729, 35715,173, 3153, 31858, 29585,36622,35504,6703, 15557,5306, 19210,28651,1614, 554, 4244, 38052,31770,36327,11760,16387,38315,10272,37440,7882, 42422,36622,975, 25459,2465, 30903,42422, 34011,36918,22597,24057,138, 4501, 24443,17566,22595,33075,23632,6218, 36282,176, 28971,25335,33680,34594,38052,12185,14480,8305, 3647, 1608, 607, 7265, 31839, @@ -16880,25 +16875,25 @@ static const unsigned short Ranks[197839] = 14663,35504,1295, 9828, 20277,35504,7496, 17805,34594,3407, 5883, 10939,33836,497, 30499,38009,20758,3950, 23988,18326,8136, 1761, 6534, 31124,1844, 3564, 38051, 38051,42421,6386, 20992,2154, 19025,36622,4957, 25793,20276,3896, 5352, 33181,9265, 29702,39379,2292, 4194, 7977, 38384,12005,7132, 13821,5189, 20757,3800, 42421, 32216,9696, 32215,14382,39889,13073,17185,12493,11139,38051,14346,19621,6759, 12223,24018,38051,566, 17804,38050,20165,19315,27525,42421,13820,28623,30453,17290, - 36621,14415,849, 22228,39889,34594,39889,32214,19620,28650,39888,11396,28309,19744,479, 2543, 17289,9283, 11138,17257,176, 20028,19314,7915, 16267,14345,2163, - 2690, 1169, 236, 33054,3949, 20991,16822,510, 7366, 24267,33543,520, 18515,2851, 18407,7267, 24932,16229,1537, 433, 28649,2153, 3340, 32954,1235, 1196, 9942, + 36621,14415,849, 22228,39889,34594,39889,32214,19620,28650,39888,11396,28309,19744,479, 2543, 17289,9283, 11138,17257,176, 20028,19314,7915, 16267,14345,2163, + 2690, 1169, 236, 33054,3949, 20991,16822,510, 7366, 24267,33543,520, 18515,2851, 18407,7267, 24932,16229,1537, 433, 28649,2153, 3340, 32954,1235, 1196, 9942, 18093,24235,13329,19077,27264,28648,14112,39888,38050,23542,7922, 17803,32109,11759,10271,42421,12738,33993,37534,38564,13142,36021,36621,2137, 8585, 18406,33836, 42420,18405,2190, 1358, 34601,34431,28259,30355,36621,34594,20275,38050,33181,30354,28647,33181,19619,38050,3718, 6902, 39888,30353,15569,31971,39013,7608, 20661, - 18092,12273,42420,37296,7187, 33836,42420,35504,20274,36455,33835,32213,39888,42420,25792,42419,10764,36621,34426,24634,4150, 11137,13150,12918,38049,1448, 8238, + 18092,12273,42420,37296,7187, 33836,42420,35504,20274,36455,33835,32213,39888,42420,25792,42419,10764,36621,34426,24634,4150, 11137,13150,12918,38049,1448, 8238, 27140,6660, 36134,34260,2333, 8516, 448, 42419,701, 34400,22500,894, 3272, 39887,2738, 4176, 42419,20770,23212,33180,39887,39887,30352,36620,10653,42419,42418, 27150,38049,1148, 39887,33017,476, 37801,3937, 33883,285, 20482,39886,5110, 42418,17288,22596,16821,42418,42418,42417,6115, 30351,32212,15970,38049,8032, 10270, - 2737, 23541,3222, 4490, 36620,6567, 32211,523, 19218,1203, 22100,2868, 33604,34593,34593,13820,19883,34906,39886,36879,17472,30073,19618,36620,34593,25791,8573, + 2737, 23541,3222, 4490, 36620,6567, 32211,523, 19218,1203, 22100,2868, 33604,34593,34593,13820,19883,34906,39886,36879,17472,30073,19618,36620,34593,25791,8573, 20273,17287,42417,4842, 34679,4372, 7399, 42417,7498, 42417,33835,8331, 38049,408, 252, 20756,39886,3503, 23654,42416,113, 32959,37505,35538,17660,20919,37132, 10693,37853,38284,39886,9696, 17802,6457, 22791,18076,30355,8464, 6459, 33180,13939,38896,35503,18974,33835,9466, 39885,35503,38048,21767,33180,39885,24633,14479, 35503,30350,37039,5008, 25064,24578,28646,4733, 458, 12159,38066,34593,28645,7028, 2235, 2570, 27149,30349,39885,39885,12488,13235,13819,36620,32210,3078, 20990, 33835,30348,33180,17868,39884,3083, 38, 22627,33179,33873,23078,39132,1526, 2579, 19313,34654,6435, 11487,42416,37527,39884,16228,36619,38048,42416,37429,27252, 42416,37820,8196, 7818, 15, 36217,27545,2637, 17877,12902,33075,15352,31501,8856, 16450,636, 14041,36619,39884,38048,3126, 25790,1753, 38048,5771, 13819,39884, - 39883,6632, 5867, 27906,38047,38047,33834,18, 42415,34397,37569,1246, 11223,23540,38202,10625,5251, 30347,36619,2138, 39883,39883,39883,3419, 24644,14478,3917, + 39883,6632, 5867, 27906,38047,38047,33834,18, 42415,34397,37569,1246, 11223,23540,38202,10625,5251, 30347,36619,2138, 39883,39883,39883,3419, 24644,14478,3917, 39882,16978,35874,29960,34592,38047,19617,39882,36619,22595,39882,30582,38321,39882,25789,18973,12004,30346,25788,32209,36618,39881,42415,42415,11486,34592,12990, 39881,35503,33631,10763,42415,20996,370, 6609, 29936,11070,17215,5638, 10451,14877,27535,7245, 32489,3275, 9411, 38047,30345,32208,38046,35502,42414,36618,39881, - 38046,22092,39881,19607,34592,36618,39880,39880,38046,12717,42414,32922,28644,35428,32863,8693, 25355,33018,7042, 830, 34808,1501, 18091,31743,3271, 8909, 3188, - 21073,18457,36618,38046,112, 8282, 3035, 34592,19444,33617,33687,35502,38255,2460, 38045,30115,9282, 5339, 19135,39880,1, 24490,30493,25412,2444, 2617, 2443, - 32968,336, 23712,2888, 794, 3347, 981, 20423,42414,889, 3717, 31199,28103,463, 1641, 17044,22237,8951, 33174,1494, 10075,1786, 1405, 3716, 716, 3082, 1837, + 38046,22092,39881,19607,34592,36618,39880,39880,38046,12717,42414,32922,28644,35428,32863,8693, 25355,33018,7042, 830, 34808,1501, 18091,31743,3271, 8909, 3188, + 21073,18457,36618,38046,112, 8282, 3035, 34592,19444,33617,33687,35502,38255,2460, 38045,30115,9282, 5339, 19135,39880,1, 24490,30493,25412,2444, 2617, 2443, + 32968,336, 23712,2888, 794, 3347, 981, 20423,42414,889, 3717, 31199,28103,463, 1641, 17044,22237,8951, 33174,1494, 10075,1786, 1405, 3716, 716, 3082, 1837, 2979, 17876,35502,37069,3142, 12134,32003,15328,18591,26947,24632,23539,12737,34591,36617,35502,20383,21766,20989,42414,42413,38045,17103,39348,42413,28643,24631, 8002, 33085,9683, 32797,39024,28668,37495,35035,13951,17102,39880,39879,39113,12379,1944, 21198,19977,3644, 34965,37755,38998,36511,32589,39879,42413,34785,26495, 32345,23325,38199,34253,36708,32723,34565,12887,28642,35501,6225, 38884,35501,6346, 28461,34494,39879,37175,33179,28641,38045,23974,39879,39878,33949,36880,23538, @@ -16911,40 +16906,40 @@ static const unsigned short Ranks[197839] = 6631, 16049,42410,42409,19312,42409,18831,35500,9282, 23706,6504, 9168, 17800,35300,4385, 27145,42409,13818,10246,417, 17799,25787,42409,2636, 8698, 37679,39191, 22936,29383,19755,36616,1823, 39170,21739,16386,35821,10601,39876,35928,1649, 26503,12138,33502,20988,28638,33178,8816, 34590,21742,37322,34590,33085,3799, 36348, 37242,39875,2797, 18089,20780,36616,38042,30343,15191,38042,18, 23834,19858,9094, 967, 16960,9339, 3665, 7615, 20768,11823,22153,14075,16367,13804,31087,29036, - 17548,22743,31170,14322,18909,19568,31455,12006,38042,18270,18419,24962,7777, 5318, 5872, 14145,14872,13826,21760,15366,34562,27481,7305, 16226,34976,10743,8668, - 13641,31501,22938,27144,7572, 6263, 14871,38917,35064,15976,5500, 5250, 12168,25052,1414, 16039,33461,2635, 30096,24844,33638,24211,9618, 22442,34904,14032,5770, + 17548,22743,31170,14322,18909,19568,31455,12006,38042,18270,18419,24962,7777, 5318, 5872, 14145,14872,13826,21760,15366,34562,27481,7305, 16226,34976,10743,8668, + 13641,31501,22938,27144,7572, 6263, 14871,38917,35064,15976,5500, 5250, 12168,25052,1414, 16039,33461,2635, 30096,24844,33638,24211,9618, 22442,34904,14032,5770, 35499,23732,38691,37673,12735,38042,13521,42408,42408,42408,42408,13818,38041,42407,38041,30342,16385,36616,36616,21764,36615,15190,10335,15541,10949,19311,12886, 7220, 42407,25786,29795,14823,42407,33833,39875,42407,20987,42406,8685, 42406,37057,13702,36615,4387, 1017, 38041,33780,30492,42406,2352, 35372,33049,14333,34130, 42406,42405,38041,38179,33833,15969,36615,39059,37517,26466,36997,34653,33009,23029,22591,38040,42405,15555,12133,33178,38769,35499,380, 12132,5876, 25153,15322, 34919,4714, 42405,774, 11322,35499,3578, 31711,8614, 12491,30846,13383,22796,42405,1587, 15249,33178,14477,34201,39875,32892,36615,42404,36614,37223,38040,42404, - 30225,39875,21533,12629,42404,1447, 24628,5810, 32206,22626,742, 25566,22122,13498,24830,14870,34425,14869,13668,19688,1231, 12859,32205,38040,4064, 38579,5840, - 35499,3675, 38040,16244,9317, 15503,20755,1751, 3563, 25785,38039,33833,25784,39874,27069,2812, 11326,5094, 9869, 1764, 42404,15554,15968,36614,2899, 4869, 5725, + 30225,39875,21533,12629,42404,1447, 24628,5810, 32206,22626,742, 25566,22122,13498,24830,14870,34425,14869,13668,19688,1231, 12859,32205,38040,4064, 38579,5840, + 35499,3675, 38040,16244,9317, 15503,20755,1751, 3563, 25785,38039,33833,25784,39874,27069,2812, 11326,5094, 9869, 1764, 42404,15554,15968,36614,2899, 4869, 5725, 35498,4767, 5381, 42403,42403,4395, 12131,3761, 36614,20059,224, 16157,38039,485, 6282, 24627,33177,3606, 33833,30341,25197,23537,28637,13520,6216, 32204,32088, - 1873, 2580, 429, 18972,4520, 42403,33177,12110,36614,27143,18117,28636,42403,42402,22590,32515,17936,4084, 18200,34965,36613,17101,34590,38731,34294,17850,665, - 18404,1080, 32807,9819, 38758,22589,5780, 37663,28997,15967,42402,39874,5930, 37981,20991,27142,33832,25783,39874,35498,42402,28355,36613,18404,38039,42402,1901, + 1873, 2580, 429, 18972,4520, 42403,33177,12110,36614,27143,18117,28636,42403,42402,22590,32515,17936,4084, 18200,34965,36613,17101,34590,38731,34294,17850,665, + 18404,1080, 32807,9819, 38758,22589,5780, 37663,28997,15967,42402,39874,5930, 37981,20991,27142,33832,25783,39874,35498,42402,28355,36613,18404,38039,42402,1901, 39874,12252,3690, 14654,39873,39873,37531,1546, 42401,24626,18403,22201,12003,34589,38039,38906,42401,6340, 19310,32808,39412,35316,7699, 37479,11241,29853,12880, 21202,27427,17100,5024, 39873,73, 21865,4790, 17049,26180,20148,29428,12720,15623,19194,21571,24312,26034,27789,36613,24030,34596,7304, 34589,38490,8127, 36682, 8613, 38038,39873,27141,1863, 42401,30521,34589,10762,23374,39283,38038,16820,36613,8031, 14822,20271,27140,20986,34989,30759,34589,27139,22588,27836,36889,24625, - 34735,295, 24174,9828, 14183,18060,14465,16248,28061,30941,29112,32913,5352, 39095,39872,28635,7849, 18088,17798,42401,39397,14734,34588,3500, 226, 15553,3650, + 34735,295, 24174,9828, 14183,18060,14465,16248,28061,30941,29112,32913,5352, 39095,39872,28635,7849, 18088,17798,42401,39397,14734,34588,3500, 226, 15553,3650, 23985,6630, 880, 34588,14123,3740, 38038,19614,34588,30340,34235,33087,4433, 17761,30339,36612,9281, 25, 26081,1091, 32031,9212, 21350,29051,24776,26864,10721, 15211,15915,29338,32952,160, 32203,33832,4377, 12734,22587,37306,16642,39419,30338,38038,17835,13307,35498,24150,10269,39872,248, 30337,38037,20270,34588,39872, - 34161,8905, 39872,1960, 20269,21763,42400,9167, 2883, 19613,27138,35498,36612,11382,35497,39871,12002,17286,13234,3718, 2265, 3167, 12130,33177,33832,42400,1759, + 34161,8905, 39872,1960, 20269,21763,42400,9167, 2883, 19613,27138,35498,36612,11382,35497,39871,12002,17286,13234,3718, 2265, 3167, 12130,33177,33832,42400,1759, 27137,38037,36612,5603, 18704,26907,42400,42400,9113, 35497,16384,39871,22821,35214,13407,1385, 8907, 19698,36612,23269,18310,5709, 9554, 42399,38037,42399,33832, - 39871,38037,39871,39870,42399,34587,38036,27136,23536,25743,19451,9915, 8749, 35497,22586,39870,42399,39870,6064, 24624,19309,33177,17285,36611,14821,18087,8612, - 35802,27647,36611,25782,13817,9695, 1292, 536, 1008, 30465,10472,36279,35222,36005,10268,20268,19612,19611,23116,10600,33176,5465, 8359, 14476,14326,25781,2133, - 27135,15552,13327,42398,38036,23535,33831,35497,42398,15966,34959,23398,26909,28634,21437,37166,33792,24623,6566, 20552,33266,35683,3292, 39870,42398,22480,861, + 39871,38037,39871,39870,42399,34587,38036,27136,23536,25743,19451,9915, 8749, 35497,22586,39870,42399,39870,6064, 24624,19309,33177,17285,36611,14821,18087,8612, + 35802,27647,36611,25782,13817,9695, 1292, 536, 1008, 30465,10472,36279,35222,36005,10268,20268,19612,19611,23116,10600,33176,5465, 8359, 14476,14326,25781,2133, + 27135,15552,13327,42398,38036,23535,33831,35497,42398,15966,34959,23398,26909,28634,21437,37166,33792,24623,6566, 20552,33266,35683,3292, 39870,42398,22480,861, 39869,33176,39869,223, 19065,38130,1490, 33273,25529,38036,33710,27827,176, 15912,6743, 34541,563, 14820,24397,12733,1002, 3715, 10022,24979,19296,6541, 35569, 37298,6721, 786, 8056, 38660,34660,8069, 23536,29614,6629, 42398,10948,42397,42397,39869,15722,6386, 32864,42397,37414,35496,13519,38036,32202,29102,36611,36611, 34587,42397,28633,20754,37405,27134,13816,42396,32949,24622,4876, 30462,97, 10177,9556, 13369,35496,35496,638, 27133,42396,36734,36610,11122,16594,39869,36610, 35496,42396,35840,42396,36610,39868,13745,17848,23534,235, 22459,27223,2994, 29502,30980,32971,26408,17089,26693,5219, 20257,33035,32566,18131,33176,33831,26225, - 27132,5352, 10471,35495,2258, 33826,2667, 3916, 9308, 16819,6098, 1482, 28228,22761,13283,33833,2943, 11362,14980,822, 9993, 33053,39291,3608, 33022,15327,7415, + 27132,5352, 10471,35495,2258, 33826,2667, 3916, 9308, 16819,6098, 1482, 28228,22761,13283,33833,2943, 11362,14980,822, 9993, 33053,39291,3608, 33022,15327,7415, 34689,38296,32911,29920,14344,35340,3414, 34988,19192,36110,29998,8918, 27716,30684,16768,5947, 864, 27824,25032,1348, 412, 7390, 22741,32101,249, 22492,33841, - 10128,29907,29463,8124, 7507, 6458, 29196,25987,6702, 23132,20267,12620,13990,263, 3519, 22486,22083,2475, 29610,31382,31688,17290,3510, 46, 20753,33372,1070, + 10128,29907,29463,8124, 7507, 6458, 29196,25987,6702, 23132,20267,12620,13990,263, 3519, 22486,22083,2475, 29610,31382,31688,17290,3510, 46, 20753,33372,1070, 16667,14343,38035,20373,10470,33356,35495,24139,35981,91, 17797,2542, 1443, 25780,1603, 12490,33176,8195, 34587,25779,17796,38035,2023, 33831,42395,2472, 32201, 18402,20266,27916,35495,771, 35495,3642, 974, 42395,38035,28632,20985,8316, 862, 35650,24076,8749, 17099,17830,13233,19610,2078, 39868,3261, 42395,27131,17284, - 12989,37919,32200,5380, 42395,1096, 30336,38035,568, 14113,7848, 30335,42394,12222,21762,39267,20539,6829, 731, 42394,13326,3081, 10267,33175,7606, 894, 7732, + 12989,37919,32200,5380, 42395,1096, 30336,38035,568, 14113,7848, 30335,42394,12222,21762,39267,20539,6829, 731, 42394,13326,3081, 10267,33175,7606, 894, 7732, 17469,33831,42394,5769, 6396, 36895,23579,42394,20752,28873,22585,601, 32199,42393,661, 31267,18401,42393,19609,13518,33105,19308,10938,32198,30334,30042,32879, - 39228,38590,30640,13517,39868,15189,24368,39868,38034,18400,2737, 16585,10339,28631,19945,34584,27130,21761,24592,25214,3367, 8526, 31407,5811, 6543, 4403, 3632, + 39228,38590,30640,13517,39868,15189,24368,39868,38034,18400,2737, 16585,10339,28631,19945,34584,27130,21761,24592,25214,3367, 8526, 31407,5811, 6543, 4403, 3632, 32421,27984,26801,4066, 11626,4428, 10947,34587,39867,25630,38094,19608,27879,42393,32839,14475,1557, 39867,38034,28630,10026,36610,42393,33830,36609,12732,35494, 37858,25559,14525,29297,39867,25525,12465,37043,36609,39867,37335,42392,4766, 8478, 35494,36182,27129,33830,33830,23533,3852, 42392,42392,35494,35494,12731,13815, 35493,42392,42391,16383,15551,11321,42391,39866,28629,39866,32913,33830,27128,7331, 8926, 20265,18399,30333,27127,36609,35751,5502, 42391,20151,35346,37755,20803, @@ -16955,7 +16950,7 @@ static const unsigned short Ranks[197839] = 39864,4763, 12000,38032,42389,3274, 33828,34586,36608,42389,36608,35492,30330,1169, 36607,39864,6701, 39864,19607,586, 6758, 33175,19606,17794,18970,3526, 18398, 42388,3065, 42388,33828,36607,42388,36607,38032,39864,42388,42387,38032,36607,20264,34585,21759,33828,38032,8123, 13814,38031,32190,34585,33827,5149, 24620,42387, 42387,11999,27126,925, 24619,23532,28628,24618,3915, 42387,20263,9046, 33174,33827,16382,36606,6700, 42386,28627,42386,42386,39863,34504,33827,25777,30329,33174, - 39863,8815, 7932, 34585,33827,10761,32189,35492,2339, 36606,42386,33826,368, 20751,38031,2213, 25776,737, 7107, 42385,13232,39863,6215, 39863,36606,18969,3525, + 39863,8815, 7932, 34585,33827,10761,32189,35492,2339, 36606,42386,33826,368, 20751,38031,2213, 25776,737, 7107, 42385,13232,39863,6215, 39863,36606,18969,3525, 38031,11998,5537, 20982,42385,33826,39862,34585,32188,10423,19605,1203, 14473,20262,11136,14867,8358, 42385,42385,6280, 34297,11135,36606,22583,39862,34584,30328, 42384,486, 12486,36605,35492,25775,42384,35491,35491,32187,2855, 36605,9112, 36605,13813,18968,19604,36605,36604,42384,3948, 11534,42384,28626,28611,42383,30327, 36604,10760,34584,6345, 38031,3930, 28625,39862,38030,10422,38030,27125,1092, 1811, 42383,35491,36604,25774,1145, 39862,38030,42383,33826,18967,21758,16818,38030, @@ -16981,41 +16976,41 @@ static const unsigned short Ranks[197839] = 36596,36596,42368,38025,23525,33822,4175, 2400, 780, 8237, 20977,16815,38025,9820, 38024,13515,35483,21749,9977, 34577,25762,36596,42368,32178,959, 1233, 15964, 38024,33822,39851,37658,14121,1945, 34577,39851,2953, 3928, 33171,42367,36596,21748,42367,36595,7186, 34577,18085,17279,35483,36595,34576,17278,17787,11532,37692, 7578, 42367,28613,22575,42367,5724, 29763,439, 19595,35482,38024,42366,42366,42366,39851,13226,27116,35482,42366,42365,24609,38024,36595,10855,33171,4898, 42365, - 35482,10935,39850,20256,32177,38023,2497, 8814, 33171,1879, 28612,22574,36595,39850,36594,16814,25437,42365,11757,17786,36594,6500, 42365,33822,38023,36594,7577, + 35482,10935,39850,20256,32177,38023,2497, 8814, 33171,1879, 28612,22574,36595,39850,36594,16814,25437,42365,11757,17786,36594,6500, 42365,33822,38023,36594,7577, 35482,21747,3077, 42364,42364,27115,2666, 640, 33170,36594,35481,8698, 42364,678, 34576,33170,22573,28888,5232, 18962,39850,10115,23524,34757,32176,36593,38023, 8570, 33822,7494, 17785,18390,42364,42363,35481,39850,735, 28611,39849,5007, 33821,36593,33170,24608,6037, 609, 36593,8030, 10759,35481,13225,33479,3666, 22572, - 34576,19594,30317,22571,38023,6344, 29440,16813,34576,30316,34575,39849,4394, 23523,39849,12728,42363,33821,34575,20255,17784,22570,34575,34575,1341, 35481,3590, + 34576,19594,30317,22571,38023,6344, 29440,16813,34576,30316,34575,39849,4394, 23523,39849,12728,42363,33821,34575,20255,17784,22570,34575,34575,1341, 35481,3590, 38022,21746,12727,39849,23522,36593,42363,35480,435, 42363,3851, 38022,3689, 36592,38022,38022,39848,20254,10934,39848,42362,23521,27114,39848,36592,36592,42362, 12726,5765, 34574,27113,35480,25761,7930, 17783,11756,35480,17782,5865, 42362,42362,39308,39848,39847,42361,24607,33170,863, 42361,35480,257, 8477, 32175,10114, - 1660, 19303,19593,9280, 11317,33821,6385, 27112,36592,39847,13224,35479,6563, 42361,21745,12725,33169,33821,35479,654, 38021,35479,42361,39847,42360,33169,7106, + 1660, 19303,19593,9280, 11317,33821,6385, 27112,36592,39847,13224,35479,6563, 42361,21745,12725,33169,33821,35479,654, 38021,35479,42361,39847,42360,33169,7106, 4337, 42360,32174,39847,34574,14469,39247,42360,27111,35479,1644, 22569,34574,8813, 39846,34574,4043, 32173,3429, 23560,31740,23161,36850,24606,18961,42360,42359, 17277,19592,38021,395, 32172,39846,2810, 32171,33820,14120,34573,33820,17276,583, 38021,42359,27110,34573,20976,34573,22568,36591,4278, 14119,2665, 2365, 13514, - 22567,823, 33820,35478,39846,15963,35478,42359,21744,42359,7185, 38021,12219,6384, 35478,38020,21743,42358,35478,25854,30315,36591,19591,2095, 33169,38020,849, + 22567,823, 33820,35478,39846,15963,35478,42359,21744,42359,7185, 38021,12219,6384, 35478,38020,21743,42358,35478,25854,30315,36591,19591,2095, 33169,38020,849, 36591,20975,32170,14817,34652,36591,33169,33820,39846,42358,9976, 7846, 35477,39845,1239, 38020,14468,3589, 8029, 9279, 12481,35477,34573,20974,39845,17275,42358, 39845,38020,4107, 34572,34572,20973,32169,657, 2979, 34572,10421,38019,1839, 5006, 9693, 6699, 42358,38019,5188, 30398,16375,25760,22566,34572,5673, 13808,39845, 9165, 1340, 4149, 39844,13807,27109,19249,5839, 2906, 34571,28610,6757, 23520,17781,9278, 35477,12218,2549, 36590,1365, 33168,1505, 39844,1339, 4202, 36590,38019, 39844,7751, 9413, 18960,9277, 32168,42357,1158, 33819,10933,12217,35477,28609,33168,18389,13806,12982,2622, 32167,15184,7493, 28608,703, 1164, 14118,39844,23519, 35476,33168,42357,19590,11531,14816,42357,11755,36590,42357,11316,42356,5351, 18959,11754,10113,22565,42356,42356,7845, 33819,16374,34571,14117,15547,14815,39843, - 36590,20750,42356,2399, 33168,2398, 42355,25759,39843,36589,36589,30314,33819,19589,42355,5419, 35476,38019,12981,13223,5270, 42355,42355,18958,20972,13805,4299, + 36590,20750,42356,2399, 33168,2398, 42355,25759,39843,36589,36589,30314,33819,19589,42355,5419, 35476,38019,12981,13223,5270, 42355,42355,18958,20972,13805,4299, 16812,27108,38018,773, 39843,33167,19588,35476,8357, 38018,9412, 38018,15183,21742,21741,33167,12980,14116,1112, 20971,42354,33167,39843,42354,30313,19587,38018, 17780,13513,24605,39842,16811,16810,34571,33167,38017,7844, 27107,24604,1319, 14467,33166,39842,38017,38017,11753,28607,33166,32166,14115,39842,3605, 33166,42354, 42354,36589,7492, 36589,13804,39842,15182,6383, 38017,39841,24603,10265,16224,9411, 36588,28606,38016,24602,42353,3355, 16809,8356, 38016,42353,11995,24601,42353, 34439,33819,33818,34678,39841,39841,38016,34571,42353,23518,27106,42352,32165,34570,3259, 21740,38016,9819, 39841,2898, 36588,9550, 33858,39840,42352,42352,18957, 42352,42351,20253,25758,28605,32164,39840,38015,28604,39840,39840,18956,8355, 19586,2132, 19585,1318, 42351,33166,25757,16378,35632,38398,26002,23973,28006,33065, - 33070,33065,33011,33063,36377,7421, 32159,32799,7, 14342,14889,27142,8068, 33165,32292,39839,3418, 23517,36588,15962,1232, 1068, 39839,8028, 17274,2263, 7843, + 33070,33065,33011,33063,36377,7421, 32159,32799,7, 14342,14889,27142,8068, 33165,32292,39839,3418, 23517,36588,15962,1232, 1068, 39839,8028, 17274,2263, 7843, 5436, 34102,33427,35476,20349,38482,665, 9276, 30902,18398,663, 12489,1325, 4277, 23681,25756,25755,39312,1428, 19584,14466,20970,36588,3421, 15181,59, 21012, 37784,17294,19860,8400, 10026,9817, 10112,13816,833, 4064, 34085,3560, 20749,5858, 18084,17461,38015,310, 445, 1465, 37063,1757, 14814,38243,36587,18388,42351, 30312,3484, 36587,38299,13803,7750, 42351,42350,10025,7041, 39839,38015,11004,1790, 2706, 3723, 4154, 1832, 3513, 1293, 1977, 9440, 9389, 2738, 2107, 11781,33404, 10469,26205,14866,9410, 39839,8476, 12488,38015,36928,39838,30196,42350,7657, 34391,35169,42350,13718,32061,9264, 5818, 2295, 2154, 10315,34346,3537, 33141,35373, 34726,16471,2400, 3709, 24942,23207,9756, 36151,20969,17280,1668, 19583,37511,35475,15180,38570,13667,39838,28603,42350,33818,38656,7302, 37096,24600,30311,36587, - 25754,31527,32163,2840, 3562, 27986,30646,619, 42349,5618, 11642,11033,18012,11025,22825,2066, 19272,42349,34776,39838,24599,39838,38014,20968,36587,10420,8194, - 19302,15502,5553, 39837,36586,17149,42349,33958,34636,33818,1472, 16373,36586,6112, 35475,21739,33165,33165,10597,29513,15501,38014,38084,5536, 42349,36251,414, + 25754,31527,32163,2840, 3562, 27986,30646,619, 42349,5618, 11642,11033,18012,11025,22825,2066, 19272,42349,34776,39838,24599,39838,38014,20968,36587,10420,8194, + 19302,15502,5553, 39837,36586,17149,42349,33958,34636,33818,1472, 16373,36586,6112, 35475,21739,33165,33165,10597,29513,15501,38014,38084,5536, 42349,36251,414, 17187,35220,38613,17082,11466,8290, 31783,780, 37795,36586,34950,25229,35311,11920,7282, 21492,20442,9007, 11904,21385,33939,30843,36199,4063, 5980, 21903,12500, 530, 24229,7213, 9431, 19301,10692,13815,1721, 7504, 38014,8222, 18776,10372,7159, 35663,1197, 7934, 35055,35475,23602,12129,25089,42348,1743, 36276,34561,35082, 28383,226, 34570,39837,34852,42348,28177,6818, 9439, 38592,4012, 42348,13325,34160,14341,5403, 17726,18612,2280, 35016,33818,1602, 13256,35232,37551,20748,42348, 35475,21738,30310,1836, 37273,2841, 36649,42347,3524, 20804,38014,42347,35047,30309,35813,42347,34570,38013,25753,1613, 4219, 33165,24998,20747,33172,34570,42347, - 34569,2976, 37721,25798,39837,4470, 15262,21160,38175,12604,1915, 9692, 32162,39837,19300,38013,42346,17097,20746,21265,30308,37339,2294, 32161,42346,2187, 3178, - 6111, 24917,889, 30307,42346,5838, 16675,36586,22096,39836,13814,20962,17257,34569,32966,42346,27105,19222,18955,16808,29291,38013,29788,287, 38013,10245,452, + 34569,2976, 37721,25798,39837,4470, 15262,21160,38175,12604,1915, 9692, 32162,39837,19300,38013,42346,17097,20746,21265,30308,37339,2294, 32161,42346,2187, 3178, + 6111, 24917,889, 30307,42346,5838, 16675,36586,22096,39836,13814,20962,17257,34569,32966,42346,27105,19222,18955,16808,29291,38013,29788,287, 38013,10245,452, 18421,2115, 29517,27562,1961, 42345,35474,39836,25752,5672, 1901, 4581, 32309,36392,13760,34206,35070,5900, 18439,38904,1278, 32969,9624, 30381,35912,39836,35435, 38408,17624,34063,38912,20745,33486,38736,28799,1480, 20943,12325,36296,34730,29211,151, 3966, 27383,26779,32891,4555, 19813,34639,2406, 13813,20666,36690,17443, 20744,15171,19090,16570,20743,39094,2892, 35131,18302,15059,30306,35474,38012,2689, 38012,42345,42345,6521, 28602,42345,38012,17273,23628,18685,421, 2244, 33188, @@ -17030,14 +17025,14 @@ static const unsigned short Ranks[197839] = 18083,8697, 35145,7576, 42339,20964,11605,42339,37602,36583,20754,42338,28599,714, 33816,12723,14811,39832,28598,38009,34361,38009,42338,30303,33567,37325,39832, 7025, 20250,11131,33816,12479,3203, 38400,39831,39274,35472,33816,25750,2977, 20743,37859,39831,42338,27639,10419,12979,1447, 220, 18120,35471,36583,32159,23055, 717, 33510,38710,38008,5369, 30, 1928, 11526,22598,18283,19753,12885,33045,2616, 2976, 18385,22563,37803,22454,38008,13217,38709,17778,25749,28597,42338,42337, - 33162,34567,24596,39831,19581,42337,38008,34567,9045, 25039,39831,33162,19580,39830,33816,30302,35471,33057,33815,2471, 42337,36550,17777,23516,10931,42337,956, + 33162,34567,24596,39831,19581,42337,38008,34567,9045, 25039,39831,33162,19580,39830,33816,30302,35471,33057,33815,2471, 42337,36550,17777,23516,10931,42337,956, 19579,39830,1099, 19826,2801, 27180,38008,2085, 11428,12216,38007,42336,31091,6562, 2794, 13324,15500,34567,35471,28009,17014,39830,6440, 12857,36989,24764,21737, 4973, 39830,24595,35471,30582,3034, 3561, 42336,6164, 39126,36258,1125, 6054, 17233,24557,10023,30588,6602, 340, 30266,8067, 22909,19578,33073,1556, 5537, 23515, 1510, 33350,33162,30301,17272,28596,5523, 35470,42336,42336,39829,7183, 42335,3272, 4460, 5210, 42335,33104,5066, 489, 8611, 24460,36583,10930,42335,37605,18384, 35390,28595,25748,797, 39829,7660, 120, 24161,33083,1269, 19928,27834,2420, 26176,31531,149, 12440,24637,178, 1627, 11105,3799, 8759, 26673,20963,14865,31876, - 26560,10022,13323,29881,38588,20742,33162,36678,42335,22562,9029, 35225,3340, 4959, 33165,25452,35016,4991, 36582,34750,38075,9780, 4580, 25618,29395,7387, 2155, + 26560,10022,13323,29881,38588,20742,33162,36678,42335,22562,9029, 35225,3340, 4959, 33165,25452,35016,4991, 36582,34750,38075,9780, 4580, 25618,29395,7387, 2155, 32117,1024, 34600,21302,39352,7304, 23820,1113, 31395,5379, 5732, 11792,823, 10021,1213, 12704,25378,11238,209, 20741,2330, 2910, 34345,38690,16695,11791,15499, - 17096,32765,31723,37419,32158,31378,27102,2137, 26501,42334,34566,35087,17776,23514,4654, 39829,39829,42334,42334,37249,37206,39828,42334,30832,38007,36582,4545, + 17096,32765,31723,37419,32158,31378,27102,2137, 26501,42334,34566,35087,17776,23514,4654, 39829,39829,42334,42334,37249,37206,39828,42334,30832,38007,36582,4545, 22561,12884,11752,35679,33456,15960,38007,12478,9409, 11814,27101,2809, 28594,34908,4226, 42333,274, 38036,33161,34566,42333,24594,31917,19577,12722,35470,13812, 6754, 24150,34881,34566,15545,28593,36957,34566,16990,12883,33815,34081,9163, 23513,9408, 29955,27605,223, 42333,42333,38166,22560,2771, 34565,37529,39828,30300, 39828,18952,42332,6382, 42332,10946,32157,27123,26392,37432,3041, 33341,36582,6061, 38007,34565,42332,38006,20679,3370, 38006,24593,12477,18082,36664,12215,33161, @@ -17045,9 +17040,9 @@ static const unsigned short Ranks[197839] = 18883,34565,33161,28592,39827,39827,20962,34565,20249,27099,36581,35470,7817, 33161,34564,35744,10547,16323,33815,37213,21418,10475,36581,17095,7816, 30299,18081, 38109,28684,33160,11790,14864,24592,39827,8335, 37124,36581,42330,27098,35609,33768,36089,34564,35470,36581,24591,38005,42330,35469,32293,15498,22718,22111,23388, 14340,1638, 31738,8330, 3717, 34564,36244,33814,18951,34615,42330,5905, 676, 1094, 4544, 3408, 33814,42330,35469,18383,22559,37042,3667, 11378,10282,11045,18074, - 8485, 38067,32156,33814,8696, 2367, 42329,20740,33160,23859,6282, 30071,19576,35469,9407, 35469,39826,19575,11610,34598,19386,22558,36373,7116, 3857, 2777, 8541, + 8485, 38067,32156,33814,8696, 2367, 42329,20740,33160,23859,6282, 30071,19576,35469,9407, 35469,39826,19575,11610,34598,19386,22558,36373,7116, 3857, 2777, 8541, 10691,3480, 33042,15817,9469, 11130,29124,33052,42329,36812,42329,36580,32155,32154,37596,42329,36580,39300,25746,33814,36580,4427, 34564,16223,28591,604, 35546, - 42328,38005,8790, 34969,39139,33813,21800,34213,8568, 5372, 29747,107, 16620,3141, 42328,20324,7708, 8329, 724, 36754,38041,4285, 12667,1797, 26361,22977,3790, + 42328,38005,8790, 34969,39139,33813,21800,34213,8568, 5372, 29747,107, 16620,3141, 42328,20324,7708, 8329, 724, 36754,38041,4285, 12667,1797, 26361,22977,3790, 33813,38524,5949, 13212,22544,37393,2788, 38841,6520, 28590,10945,14339,17429,39826,21912,32579,13007,14642,11529,30704,5493, 38391,503, 5868, 29416,14245,15497, 1544, 30038,36711,16094,11484,31245,24489,32625,42328,3649, 415, 35468,2329, 33813,36580,23350,42328,33160,22397,42327,37042,28589,39826,5130, 1628, 34563,35468, 33160,2450, 9102, 11192,6145, 39826,11991,42327,2541, 38101,34549,31534,36579,42327,38005,15959,6628, 22107,3270, 1475, 33239,35468,37817,38747,2470, 35468,42327, @@ -17061,23 +17056,23 @@ static const unsigned short Ranks[197839] = 32100,33967,36578,15544,30297,42323,8245, 42323,35492,22556,30396,42322,35235,39100,36514,39823,36577,25745,35620,24307,33811,23511,38003,37149,39823,42322,39822, 35466,33811,27094,36577,24589,38224,14862,19298,33255,33193,16895,14556,28653,25443,17369,42322,33166,33735,8901, 16423,35665,35154,33670,14905,39822,39822,28586, 14861,30296,662, 38003,606, 36319,1474, 8658, 38877,39822,42322,19574,34561,24372,1364, 37293,22357,2503, 11483,11216,33770,1213, 27093,14810,30295,14072,11315, - 42321,4459, 42321,20826,9177, 23051,4331, 23891,15672,5722, 4972, 17094,9263, 2548, 22555,31072,1874, 7929, 33159,42321,11993,30294,5721, 34561,24045,22469,2992, + 42321,4459, 42321,20826,9177, 23051,4331, 23891,15672,5722, 4972, 17094,9263, 2548, 22555,31072,1874, 7929, 33159,42321,11993,30294,5721, 34561,24045,22469,2992, 14114,35466,42321,8236, 21732,39821,20031,36577,19179,25939,42320,22513,20246,39363,38003,35911,22554,421, 5743, 1509, 7624, 38835,6477, 17322,14422,33941,21792, 34091,30985,6186, 9709, 36234,29476,923, 6024, 28262,9916, 29449,16564,21572,9273, 30041,25135,9350, 34434,5304, 39129,270, 416, 6055, 33742,33158,27105,15510, 34948,12637,10409,4309, 30914,19644,36366,22427,37548,33215,15187,26842,36705,24441,23364,12128,19797,38411,4458, 37017,16865,10018,9618, 10698,11174,18286,37583, 33051,33439,36065,20825,20918,28666,33163,19378,19270,33682,17271,1199, 6110, 42320,38436,33163,42320,39821,17773,32152,42320,35783,4516, 15020,29115,11528,16507, 29451,6776, 13732,26516,11548,18080,3020, 29944,15837,1897, 42319,36577,38002,37362,30293,6519, 17093,17172,8695, 14478,33158,20245,8695, 42319,33812,11482,21997, 994, 19920,25223,36074,12487,32942,18865,2997, 13810,21930,26073,13446,13867,12153,5436, 1282, 6757, 24588,36115,39260,21457,20737,30292,18949,9933, 28415,14387, - 27609,37872,17732,39209,42319,9438, 17853,39821,34943,42319,36381,11394,13221,30291,27204,36701,6373, 42318,42318,34561,8694, 24771,16737,2698, 32953,1322, 4669, + 27609,37872,17732,39209,42319,9438, 17853,39821,34943,42319,36381,11394,13221,30291,27204,36701,6373, 42318,42318,34561,8694, 24771,16737,2698, 32953,1322, 4669, 18889,35077,18079,35466,11434,1745, 10678,15237,25385,30924,5220, 38002,14873,26341,33886,28867,23415,9499, 21886,7109, 39038,1408, 25382,38379,33463,21925,36576, - 23984,14377,38237,33070,3383, 31352,22850,21057,11755,35466,38002,33722,38002,39821,38001,22319,36576,33810,39820,42318,36576,18078,42318,12475,36576,5148, 9678, + 23984,14377,38237,33070,3383, 31352,22850,21057,11755,35466,38002,33722,38002,39821,38001,22319,36576,33810,39820,42318,36576,18078,42318,12475,36576,5148, 9678, 39820,39158,1390, 42317,16222,20959,42317,16805,1706, 12978,36575,3156, 28585,42317,30290,35729,42317,42316,38001,34561,7928, 11751,8610, 36575,21338,38001,39820, 11291,39820,19573,15432,42316,42316,26723,17270,36575,33810,26255,9967, 35033,38759,9081, 33042,25200,1404, 29342,13161,13560,8609, 37475,405, 10923,32894,34861, 32577,39819,201, 26496,42316,38001,16372,38000,38933,24587,19297,42315,42315,42315,505, 15958,38000,35465,34560,35465,38478,12179,42315,1101, 38000,33810,35465, 33144,28584,38000,35465,37999,13780,42314,36575,39819,39819,42314,14498,38810,34562,36726,34082,17138,23080,29201,5575, 37466,33611,11529,39819,33765,19296,37999, 38814,17570,37412,4557, 14018,700, 33672,20958,1406, 6350, 32999,23311,32537,7911, 7962, 2961, 38389,23510,34929,3163, 37937,37999,29525,27328,14754,18755,29151, - 35464,30844,32795,8608, 2770, 28933,1193, 452, 33810,33158,39818,34560,36574,17361,39818,36574,15957,37887,4689, 17772,8027, 39142,8420, 3713, 3000, 14336,4, - 13199,520, 21593,27045,31915,3673, 9103, 13940,14043,12679,10180,9792, 9311, 975, 22696,14126,14337,3202, 33158,8354, 12220,27052,24693,27835,28449,30836,1989, + 35464,30844,32795,8608, 2770, 28933,1193, 452, 33810,33158,39818,34560,36574,17361,39818,36574,15957,37887,4689, 17772,8027, 39142,8420, 3713, 3000, 14336,4, + 13199,520, 21593,27045,31915,3673, 9103, 13940,14043,12679,10180,9792, 9311, 975, 22696,14126,14337,3202, 33158,8354, 12220,27052,24693,27835,28449,30836,1989, 20244,6278, 32551,20918,995, 28205,7024, 14860,42314,945, 14113,18948,37999,37998,39818,15543,33182,35464,36995,22553,25744,5269, 32151,28583,1368, 18382,42314, 16220,142, 15956,42313,33157,38846,537, 18486,20566,10406,154, 7275, 36574,34560,25743,32150,32149,11256,3140, 2311, 39818,37509,935, 27332,21, 7141, 34560, 42313,37998,17481,32148,4201, 17269,8921, 39817,18947,34559,9879, 15179,25196,39817,35464,30429,397, 33046,2060, 39369,32832,36242,33157,39333,32147,25742,39817, @@ -17095,8 +17090,8 @@ static const unsigned short Ranks[197839] = 14733,7135, 19570,24585,1042, 28582,42309,17091,183, 2558, 13321,19293,36964,20732,19292,1972, 14853,18087,37997,35219,24584,12214,33809,33808,34558,36572,33155, 37996,2769, 14111,36572,6331, 11213,7829, 6202, 7960, 4552, 26254,9636, 3161, 11427,7513, 28042,5860, 145, 30486,2540, 21354,20731,14461,18380,32706,13068,16463, 3749, 35463,33382,21770,38306,32997,36572,42309,36571,42308,36571,42308,39814,27091,39813,37996,37996,24714,36571,37996,33808,35463,20956,32913,38036,37995,23508, - 16220,27090,42308,42308,32400,35020,4930, 18946,12720,3099, 2687, 18156,6936, 5164, 3412, 30289,31569,21813,27398,7521, 103, 17863,28098,8817, 4103, 32519,9513, - 7554, 4065, 6454, 25031,12405,17462,28155,15740,27623,18294,14012,6858, 18141,20463,21254,26852,30788,23714,20675,7290, 13817,25436,17597,24543,22034,28045,827, + 16220,27090,42308,42308,32400,35020,4930, 18946,12720,3099, 2687, 18156,6936, 5164, 3412, 30289,31569,21813,27398,7521, 103, 17863,28098,8817, 4103, 32519,9513, + 7554, 4065, 6454, 25031,12405,17462,28155,15740,27623,18294,14012,6858, 18141,20463,21254,26852,30788,23714,20675,7290, 13817,25436,17597,24543,22034,28045,827, 7575, 14460,37995,21731,32736,17090,31432,7262, 22552,1597, 3394, 13678,27749,21843,20956,12671,42307,42307,5199, 37564,19993,33502,2850, 28634,37995,6638, 12976, 13800,2090, 23783,33155,12486,33808,35462,34558,39813,15859,10638,15262,23368,33155,30288,42307,33808,42307,34219,42306,35462,24757,34557,28581,34047,11992,37995, 34916,42306,37994,33807,36571,18945,39813,35406,6457, 1985, 10689,2508, 729, 36570,2300, 6832, 913, 21191,2176, 18379,30287,17339,27089,21730,1421, 22655,36348, @@ -17104,7 +17099,7 @@ static const unsigned short Ranks[197839] = 28143,42305,15803,42305,13320,5174, 33251,39812,60, 37993,39812,25127,968, 7605, 24024,24545,37234,36570,16126,37993,42305,13729,2247, 9180, 20033,25789,37516, 14458,17769,259, 7246, 11061,27088,7075, 10981,37993,38272,39812,25947,13799,4174, 15129,36569,28616,7532, 747, 33807,34345,37260,36569,27561,33154,18944,17768, 24583,7775, 33034,10758,20548,37175,37325,39811,19569,14232,35462,39811,39811,34403,19635,33154,1568, 20542,22321,37993,6081, 33154,6754, 23792,34866,34042,22563, - 13188,20288,35108,24071,34177,33045,255, 42305,15541,2944, 15840,9558, 33807,37932,31700,35325,1276, 23514,13167,18920,39811,19291,34197,42304,28833,36569,9437, + 13188,20288,35108,24071,34177,33045,255, 42305,15541,2944, 15840,9558, 33807,37932,31700,35325,1276, 23514,13167,18920,39811,19291,34197,42304,28833,36569,9437, 25980,3129, 20349,34996,37992,34557,25741,16032,10467,12127,38367,34007,9262, 7367, 1411, 20377,33153,28809,35461,4616, 34733,15495,16219,5418, 549, 39810,37145, 14457,35775,42304,42304,42304,24246,34974,8495, 36569,21370,17767,34186,7400, 14808,20955,18360,12281,4875, 14437,11861,22947,38993,3387, 7, 26823,3956, 27166, 20249,17605,33153,36568,10595,22428,42303,14424,35271,37291,22671,19499,30285,33153,5764, 8235, 10596,35461,35177,18077,42303,33153,11314,12877,39403,42303,23507, @@ -17112,20 +17107,20 @@ static const unsigned short Ranks[197839] = 249, 9846, 26131,4995, 8748, 32337,1789, 11212,35860,31417,37992,11312,10111,19290,20582,33806,37991,11750,6900, 33152,35118,35461,42303,37991,42302,35460,33806, 37991,144, 5862, 7399, 35460,18377,42302,28579,22296,27422,9436, 24872,3350, 17268,28578,11991,33791,3346, 37991,3739, 2234, 22551,34557,34557,791, 24143,33806, 33152,15953,33103,34556,10942,15753,39810,12752,42302,39367,36325,17766,35460,36308,37990,33934,20730,27087,36424,15952,42302,36957,9043, 25740,37990,17089,28577, - 15951,37990,199, 42301,21729,37990,33298,36624,38279,12334,3146, 38248,42301,42301,34334,42301,38466,37895,23505,9261, 37119,19289,38608,34465,1185, 14291,8967, + 15951,37990,199, 42301,21729,37990,33298,36624,38279,12334,3146, 38248,42301,42301,34334,42301,38466,37895,23505,9261, 37119,19289,38608,34465,1185, 14291,8967, 23929,16437,34024,16006,15281,35537,33806,11311,34556,32995,6885, 15494,15371,39809,1353, 36969,2115, 955, 36568,35101,42300,33152,13140,10655,39809,35227,15111, 18368,27386,33349,42300,34556,7022, 18943,37989,17528,22703,37989,11310,7983, 28576,33805,24953,37989,11990,31530,13319,20729,17088,39809,4393, 11527,42300,37989, - 13798,35460,18211,34039,39809,27086,21728,14455,184, 2768, 8644, 33177,23007,2936, 27803,19288,28575,11580,13511,33152,15493,21315,20316,1589, 4786, 42300,6281, + 13798,35460,18211,34039,39809,27086,21728,14455,184, 2768, 8644, 33177,23007,2936, 27803,19288,28575,11580,13511,33152,15493,21315,20316,1589, 4786, 42300,6281, 13811,18680,1700, 14859,31721,20728,448, 12071,353, 22531,24773,14589,12404,25894,37988,20954,22550,35459,42299,411, 17591,7612, 9617, 18613,42299,33151,29801, 20937,25254,37191,33327,30284,20953,17087,31840,23261,1171, 38662,3396, 38767,31932,34420,27911,28880,16249,4643, 34556,33151,32143,4024, 39808,688, 35651,34555, - 42299,2375, 16218,12772,17105,17769,15109,34383,11788,27394,42299,2664, 27085,39808,20952,30283,39340,25739,39808,5500, 24284,36568,11481,5952, 34555,17765,4545, + 42299,2375, 16218,12772,17105,17769,15109,34383,11788,27394,42299,2664, 27085,39808,20952,30283,39340,25739,39808,5500, 24284,36568,11481,5952, 34555,17765,4545, 37562,835, 39808,19329,29949,2682, 23566,36567,5425, 10065,36604,37032,33666,12881,21716,28490,39807,15540,28574,9690, 26473,34518,35013,17376,26930,42298,35459, - 11221,16804,28573,30326,24206,42298,35459,25105,20038,3696, 19132,12176,32889,14743,19475,30884,2510, 15424,35059,33379,23657,6889, 15026,19257,12762,32970,5262, + 11221,16804,28573,30326,24206,42298,35459,25105,20038,3696, 19132,12176,32889,14743,19475,30884,2510, 15424,35059,33379,23657,6889, 15026,19257,12762,32970,5262, 2096, 13318,38420,30904,1636, 33151,10071,6518, 32309,18076,5488, 27084,20236,20727,42298,393, 36393,24022,6459, 29646,35080,2493, 33330,5604, 942, 42298,35459, 12125,34972,13797,13796,20242,4256, 17328,33508,37988,28803,37388,33151,39807,28572,36567,39807,18156,11309,39807,2392, 36567,42297,4181, 33781,37988,22793,35458, 10595,34555,6149, 1370, 28269,33540,19005,37988,35458,12255,7105, 3377, 235, 16290,32058,32142,24582,37987,12485,35458,9405, 34555,18376,12250,30169,17267,33088, 21389,18069,42297,9357, 18194,34554,835, 23795,39239,37093,5147, 2338, 7028, 19498,24180,16772,9521, 28473,21727,42297,14835,19710,24581,35458,17312,24580,23504, - 7870, 36567,26927,20241,12529,12124,20360,37178,3328, 3640, 35837,10462,35457,39806,2547, 33805,21588,39806,15177,1862, 42297,42296,42296,5779, 25738,17086,3076, + 7870, 36567,26927,20241,12529,12124,20360,37178,3328, 3640, 35837,10462,35457,39806,2547, 33805,21588,39806,15177,1862, 42297,42296,42296,5779, 25738,17086,3076, 36566,42296,27969,36566,36958,2919, 8654, 19287,35636,221, 32797,19793,10941,330, 38248,36566,39206,28571,11211,33449,8812, 36566,39806,39806,39805,7398, 10342, 34214,37987,36565,39805,35457,33805,33805,20122,875, 32025,5088, 1752, 38053,8693, 29916,34445,21726,34554,28570,24173,18942,1170, 23510,2607, 5315, 7503, 35553, 33698,32922,39805,1365, 36315,12213,33329,33969,33804,12689,12123,24523,37987,5046, 39805,33134,28600,455, 8842, 19568,38656,35457,42296,19567,37987,37986,34554, @@ -17133,33 +17128,33 @@ static const unsigned short Ranks[197839] = 35405,19344,42295,36565,42295,42295,1129, 33954,35023,14182,10110,31598,36272,13454,10567,20409,36932,26343,27083,35456,13488,1492, 22422,11446,16145,4162, 36565, 18941,1579, 15492,2656, 36565,30751,29144,39202,39250,6781, 36564,34756,8193, 17784,37973,21283,25704,35401,31166,39379,37041,38688,35469,25966,37986,13505,38346, 17875,12122,38831,36054,39199,38314,13317,14335,38864,5378, 20726,11210,19286,37986,38356,25904,8610, 23654,33150,8494, 30282,4605, 16175,17764,32141,39804,39803, - 34554,42295,11787,12484,18075,8655, 13316,37985,18074,17085,11209,14334,33078,38851,20725,16217,30459,42294,37985,33804,24579,35456,39803,14807,1249, 16590,7502, - 28569,42294,38336,33400,35921,37897,2063, 23982,33804,36998,2462, 3872, 3526, 23577,7501, 16216,14858,5173, 23503,2849, 12464,26588,24019,18073,33011,17339,9435, + 34554,42295,11787,12484,18075,8655, 13316,37985,18074,17085,11209,14334,33078,38851,20725,16217,30459,42294,37985,33804,24579,35456,39803,14807,1249, 16590,7502, + 28569,42294,38336,33400,35921,37897,2063, 23982,33804,36998,2462, 3872, 3526, 23577,7501, 16216,14858,5173, 23503,2849, 12464,26588,24019,18073,33011,17339,9435, 22412,39803,25737,38534,18072,20326,18394,2846, 16215,39803,10264,28194,37637,15765,38247,16803,42294,13633,39802,39802,20032,34323,30912,8155, 32982,22547,36564, 34682,22883,5858, 27565,21725,39802,20724,12483,12880,19285,8328, 13810,35371,27323,20723,5377, 39802,25736,13510,36564,39801,32140,39801,34129,25735,27131,42294, 18872,37341,9434, 8145, 37069,9433, 42293,35693,13940,18573,15491,37514,42293,8919, 37985,18071,33014,36684,13809,29075,42293,11786,4284, 15490,38175,34311,35837, 27082,37985,31630,8066, 12121,18070,38565,19572,35525,16214,33840,39138,284, 33985,19527,19669,578, 36564,38023,2617, 18536,38632,5956, 21724,2606, 3812, 10017, - 607, 671, 14522,4005, 3028, 1994, 17084,38151,11936,6422, 1765, 15786,12422,17929,21273,37984,14751,1498, 35624,13315,29577,19284,13314,20722,37184,6599, 1139, - 2999, 21455,18581,30889,24144,24663,5778, 16213,469, 2289, 7393, 1103, 10940,989, 26909,18369,38947,24996,21860,1189, 21814,29125,3712, 32853,33150,5552, 8192, - 8032, 21405,38887,12120,20721,15810,901, 19283,9404, 7397, 33150,10244,39080,28568,26046,17083,286, 3040, 12832,22183,29899,16590,23528,36563,4852, 2215, 7704, - 39358,2769, 37984,39801,10921,22659,34694,4379, 26111,32139,30281,33397,698, 11690,10418,35456,674, 39, 24578,32326,33803,4311, 33149,16371,28567,42293,6007, + 607, 671, 14522,4005, 3028, 1994, 17084,38151,11936,6422, 1765, 15786,12422,17929,21273,37984,14751,1498, 35624,13315,29577,19284,13314,20722,37184,6599, 1139, + 2999, 21455,18581,30889,24144,24663,5778, 16213,469, 2289, 7393, 1103, 10940,989, 26909,18369,38947,24996,21860,1189, 21814,29125,3712, 32853,33150,5552, 8192, + 8032, 21405,38887,12120,20721,15810,901, 19283,9404, 7397, 33150,10244,39080,28568,26046,17083,286, 3040, 12832,22183,29899,16590,23528,36563,4852, 2215, 7704, + 39358,2769, 37984,39801,10921,22659,34694,4379, 26111,32139,30281,33397,698, 11690,10418,35456,674, 39, 24578,32326,33803,4311, 33149,16371,28567,42293,6007, 33149,10466,35189,32413,14050,22210,37984,42292,28566,34553,30589,36080,18657,34939,17844,15138,22313,31701,11101,19640,16212,11090,31212,39801,39800,28565,25262, 13987,8417, 38397,38967,11208,23700,12335,24410,39800,14710,33149,38608,35456,39224,37713,36723,23352,36879,37984,34553,35455,37228,20951,39800,26836,19400,14523, 7251, 36563,3639, 23167,2885, 37704,34879,9432, 42292,27495,33803,42292,21901,35455,37983,34553,34553,35455,11315,37983,2716, 13909,42292,17862,1418, 33803,34552, - 33149,35455,34552,8566, 8462, 35570,9110, 36029,13509,806, 25740,2767, 27081,6455, 20720,35532,15539,39800,34552,34587,30323,1651, 13372,42291,36825,1085, 9816, + 33149,35455,34552,8566, 8462, 35570,9110, 36029,13509,806, 25740,2767, 27081,6455, 20720,35532,15539,39800,34552,34587,30323,1651, 13372,42291,36825,1085, 9816, 18069,7553, 4331, 31464,1822, 10594,7140, 18098,27407,38410,3080, 11798,14857,29858,34552,16831,37983,37983,30280,20950,27368,8474, 35454,28226,39799,42291,37982, 42291,32138,23502,14110,36563,36563,39799,13487,35699,3268, 36562,27080,37696,26014,25732,36693,2080, 42291,5005, 14454,39799,12212,39799,42290,24577,36377,15749, 36033,11988,16692,34127,37982,23770,6376, 39798,39798,19282,18940,33148,35367,42290,5149, 32550,30783,30973,39091,21881,7095, 36947,14342,21383,6280, 35288,30553, - 28245,23439,24182,8046, 27205,25352,34798,35306,28678,19359,30697,4727, 36166,20949,39798,42290,21718,33148,33845,39798,5745, 34489,33803,367, 20255,22251,7840, + 28245,23439,24182,8046, 27205,25352,34798,35306,28678,19359,30697,4727, 36166,20949,39798,42290,21718,33148,33845,39798,5745, 34489,33803,367, 20255,22251,7840, 23148,34942,7130, 17082,680, 17282,3060, 6726, 13065,10465,18591,20719,24707,24465,36698,21360,34269,14013,12482,27449,551, 9600, 18803,35822,21666,4851, 34265, - 35381,18068,20923,26277,21723,34551,35727,11526,30279,30278,36562,8607, 27206,6385, 15489,9260, 28733,21722,4868, 39797,39797,2062, 32977,8972, 16211,22546,8353, + 35381,18068,20923,26277,21723,34551,35727,11526,30279,30278,36562,8607, 27206,6385, 15489,9260, 28733,21722,4868, 39797,39797,2062, 32977,8972, 16211,22546,8353, 36562,8692, 9962, 11602,24795,1365, 26643,26681,34551,42290,19126,30456,17141,36510,4691, 9084, 10464,9485, 20520,12204,976, 33734,17420,7212, 11480,37982,21001, - 10939,3721, 20718,30680,18067,37982,33454,37578,25734,33148,37981,30949,27079,35454,5777, 12988,19357,32945,36562,36561,33150,32137,1562, 24640,36561,8461, 7211, - 4850, 11479,37205,33618,42289,14333,19281,22436,20717,33148,17081,17763,37981,39797,17762,6887, 28035,29215,30277,10359,17839,18972,13220,42289,36613,1867, 468, - 22178,29596,5137, 34873,37790,3339, 26523,7943, 6885, 33982,1056, 5169, 8831, 25407,15570,3204, 35454,2984, 13650,6507, 17909,27668,12481,29621,10755,26053,351, + 10939,3721, 20718,30680,18067,37982,33454,37578,25734,33148,37981,30949,27079,35454,5777, 12988,19357,32945,36562,36561,33150,32137,1562, 24640,36561,8461, 7211, + 4850, 11479,37205,33618,42289,14333,19281,22436,20717,33148,17081,17763,37981,39797,17762,6887, 28035,29215,30277,10359,17839,18972,13220,42289,36613,1867, 468, + 22178,29596,5137, 34873,37790,3339, 26523,7943, 6885, 33982,1056, 5169, 8831, 25407,15570,3204, 35454,2984, 13650,6507, 17909,27668,12481,29621,10755,26053,351, 24069,13644,39380,11971,23594,14152,31188,9287, 7046, 36318,25430,11672,6859, 13336,9471, 19006,34072,33236,37981,39797,36561,3974, 34551,3890, 1647, 20240,17346, - 937, 9109, 39796,39796,33802,11832,38160,33802,8473, 14332,4962, 4327, 2009, 38980,21455,22892,20341,7174, 9998, 28787,33802,33802,39796,28564,17761,8173, 6343, - 38996,25010,21031,39038,42289,18705,35454,6693, 29277,21081,15105,31035,24730,8564, 34866,22228,33153,4021, 4886, 27579,15475,15048,14331,28563,30276,15538,2952, + 937, 9109, 39796,39796,33802,11832,38160,33802,8473, 14332,4962, 4327, 2009, 38980,21455,22892,20341,7174, 9998, 28787,33802,33802,39796,28564,17761,8173, 6343, + 38996,25010,21031,39038,42289,18705,35454,6693, 29277,21081,15105,31035,24730,8564, 34866,22228,33153,4021, 4886, 27579,15475,15048,14331,28563,30276,15538,2952, 20988,36561,22545,42289,32136,39796,35453,34551,39795,30275,30274,34550,2197, 36560,37981,42288,30956,3454, 21721,25733,35453,32135,35453,37980,33147,27078,28562, 39795,27171,33147,38235,39795,42288,12904,20716,22544,10593,6109, 12474,2027, 12719,2706, 42288,32134,42288,10029,25732,12397,39370,36176,17266,34550,27077,33801, 34295,12211,33801,35453,32772,42287,36241,36363,32834,35123,34550,26591,28561,37653,33201,36560,37980,11207,18438,39795,36560,5961, 35086,42287,27076,35618,17080, @@ -17174,11 +17169,11 @@ static const unsigned short Ranks[197839] = 34578,24575,27071,42282,5231, 39792,14289,38933,36443,11274,4033, 9219, 310, 1204, 19774,6794, 32864,21856,22239,15746,3217, 22859,10352,5905, 39792,35451,35568, 36760,14328,16802,25692,21362,1857, 36559,42282,10928,36994,35450,8024, 12469,35450,39792,37978,1558, 39791,33244,11205,33918,11747,37209,19118,14856,18375,42282, 36558,38491,27679,10243,15539,33146,15537,39791,28560,164, 14855,14091,13535,17910,17265,27347,37978,16602,39296,5790, 42281,381, 33064,6330, 7703, 12479,10938, - 1510, 4363, 35450,39791,3855, 9279, 8064, 29860,714, 5781, 20851,27762,22933,13312,33009,17264,1915, 24891,36782,42281,33145,35450,34548,3936, 8272, 35848,7533, - 2497, 406, 35449,2460, 34515,30257,35728,33799,38023,3945, 42281,42281,2021, 36558,29593,2728, 15221,15259,16809,34548,3392, 38662,25338,18505,16508,27366,6589, + 1510, 4363, 35450,39791,3855, 9279, 8064, 29860,714, 5781, 20851,27762,22933,13312,33009,17264,1915, 24891,36782,42281,33145,35450,34548,3936, 8272, 35848,7533, + 2497, 406, 35449,2460, 34515,30257,35728,33799,38023,3945, 42281,42281,2021, 36558,29593,2728, 15221,15259,16809,34548,3392, 38662,25338,18505,16508,27366,6589, 4014, 33799,27070,28559,12647,42280,10263,35449,12672,5336, 36562,1984, 5843, 22505,34457,33149,27069,39791,34891,8026, 15950,34548,25730,37023,16798,39790,31186, 19276,42280,36558,33798,23446,24128,39790,5671, 33184,42280,13201,28558,33145,30271,24448,21008,36523,42280,37124,21606,561, 7488, 16919,24041,10291,10958,35449, - 42279,36558,39790,33798,34547,2528, 13808,25729,33338,36223,34547,37978,39790,13959,36557,42279,13794,42279,39183,39789,4042, 30679,37977,37977,39789,15949,5426, + 42279,36558,39790,33798,34547,2528, 13808,25729,33338,36223,34547,37978,39790,13959,36557,42279,13794,42279,39183,39789,4042, 30679,37977,37977,39789,15949,5426, 39789,38414,30510,25728,23501,28557,25727,37977,3201, 17501,29932,4329, 35841,8811, 36557,142, 15708,499, 26973,19491,4902, 4628, 27178,32839,7307, 27013,23276, 28544,19282,14167,21936,23145,16055,27818,20846,26442,23594,9703, 14854,39789,16179,11795,2508, 18710,16210,1875, 33034,10622,32272,35031,30270,42279,22543,32129, 7328, 31869,23500,33798,6277, 16368,24574,25726,6006, 38797,16209,39788,17077,18374,15175,27123,42278,33369,34024,6314, 12196,5987, 19564,4970, 6680, 12878,35107, @@ -17192,20 +17187,20 @@ static const unsigned short Ranks[197839] = 30332,10269,12106,35448,9689, 20700,464, 34898,22541,17657,42277,4971, 36557,42277,10552,33797,16553,39786,34547,37976,13508,36557,2419, 37774,3306, 13434,22540, 42277,37976,36556,2922, 6745, 34825,27227,12718,36556,19734,6473, 128, 2796, 31149,13820,23823,24859,2792, 12480,10688,7936, 6876, 35383,36206,5208, 11839,35724, 14453,39258,36644,11646,34955,10175,2800, 27641,39786,30623,17263,20947,42276,14452,21720,17262,2007, 12222,409, 5092, 32896,34547,24573,20237,7005, 34112,38654, - 2044, 1382, 34546,35229,20236,32127,20946,25668,10589,32126,37975,39786,37975,31679,27316,32125,26526,14189,480, 18004,37734,35448,20235,23121,37975,5599, 7519, - 36556,34359,29354,36008,25351,34546,37975,3629, 12859,30269,7182, 9042, 9688, 30268,18063,9162, 42276,29022,25723,42276,32124,6439, 32123,3968, 39786,20945,9035, + 2044, 1382, 34546,35229,20236,32127,20946,25668,10589,32126,37975,39786,37975,31679,27316,32125,26526,14189,480, 18004,37734,35448,20235,23121,37975,5599, 7519, + 36556,34359,29354,36008,25351,34546,37975,3629, 12859,30269,7182, 9042, 9688, 30268,18063,9162, 42276,29022,25723,42276,32124,6439, 32123,3968, 39786,20945,9035, 29148,4173, 37773,33797,33144,38069,6143, 33797,3015, 29772,37974,36556,17608,9271, 22539,19563,32122,39785,979, 23369,20944,20234,39785,17261,19562,36854,32954, 13821,13921,34663,35585,19734,8134, 39785,3797, 19388,38312,25486,14804,12259,2852, 18022,20032,196, 24001,42276,712, 30584,2344, 454, 7181, 12907,36122,32925, 6276, 37974,27067,36555,24572,33658,42275,9975, 16367,33797,35448,35007,37624,19935,34546,18704,33144,33796,25722,27066,27065,34675,39785,36555,33796,36555,39784, 34546,20233,39784,23499,36555,545, 23430,24571,17506,10634,36646,35447,911, 42275,25721,15394,5649, 32121,24570,27064,24788,13216,25969,19561,33796,42275,19560, 538, 4340, 12813,33052,12210,35388,2017, 36716,5935, 13806,37400,3486, 39784,42275,11752,35447,13219,7398, 4929, 28223,42274,14327,17076,7317, 20710,36554,20709, 36554,1919, 977, 12974,42274,19275,5989, 364, 26574,34545,27063,15722,21445,13544,10463,19031,20342,636, 11722,16344,18062,30187,21226,23079,28970,24569,39784, - 15212,1245, 21188,656, 21124,32991,19033,32829,26010,32147,37293,3674, 15484,38774,4013, 24921,20943,33775,35447,8147, 779, 8472, 11525,15314,11265,10937,4756, + 15212,1245, 21188,656, 21124,32991,19033,32829,26010,32147,37293,3674, 15484,38774,4013, 24921,20943,33775,35447,8147, 779, 8472, 11525,15314,11265,10937,4756, 2924, 10462,9616, 21135,6439, 10287,24194,36938,8327, 4892, 8829, 28176,42274,42274,25204,8910, 25750,18950,29415,30332,20882,29612,10461,6288, 34745,30267,27177, - 37974,9, 10978,27734,12143,8471, 4897, 18373,27062,5763, 8352, 35579,35627,36052,34332,7180, 15947,11985,21661,11725,17464,33931,3887, 38170,7702, 39188,9687, - 34642,42273,906, 2349, 17456,31174,24780,32700,14507,17518,12156,10241,27826,5549, 10719,15711,33796,6598, 37974,22141,35447,42273,39783,18939,36554,42273,4818, + 37974,9, 10978,27734,12143,8471, 4897, 18373,27062,5763, 8352, 35579,35627,36052,34332,7180, 15947,11985,21661,11725,17464,33931,3887, 38170,7702, 39188,9687, + 34642,42273,906, 2349, 17456,31174,24780,32700,14507,17518,12156,10241,27826,5549, 10719,15711,33796,6598, 37974,22141,35447,42273,39783,18939,36554,42273,4818, 4787, 10185,29743,26025,15618,9615, 13805,34507,11784,12877,6384, 19274,18421,33795,10015,17075,36567,38807,22538,8663, 32000,891, 7397, 20942,28279,39783,27776, - 35446,39783,15535,24568,29813,16366,24568,22537,13530,26393,15946,37973,37973,35446,2090, 35446,6963, 128, 33077,6005, 37973,39404,20708,5284, 38592,5637, 4762, + 35446,39783,15535,24568,29813,16366,24568,22537,13530,26393,15946,37973,37973,35446,2090, 35446,6963, 128, 33077,6005, 37973,39404,20708,5284, 38592,5637, 4762, 398, 33144,37973,30266,39783,32936,33143,9275, 12717,34545,35446,35445,39782,36554,37488,35445,33143,37972,34545,32120,39782,11478,39782,37273,21774,36489,28556, 30265,10073,9264, 33563,36553,36553,33143,9839, 28453,36553,5888, 20110,31012,18569,35445,32290,33795,34545,42273,27061,35976,30264,24747,17514,17184,39782,42272, 16243,16699,11739,20345,36553,42272,42272,3620, 33322,17074,36552,45, 7129, 20232,2840, 42272,16137,13245,42271,30263,10592,15174,25191,3030, 4577, 42271,19559, @@ -17214,32 +17209,32 @@ static const unsigned short Ranks[197839] = 16787,6472, 31596,42270,17687,22535,39781,28757,35444,24899,34544,12473,36390,19890,42270,28555,9867, 4659, 18061,32119,35444,37972,12716,33142,24464,33142,35287, 36551,42270,23498,6347, 42270,3233, 15483,33795,7491, 33879,2975, 18371,3439, 42269,24274,35444,34501,39780,42269,33794,42269,23497,15173,23496,683, 28554,12472, 21718,18370,39780,38995,33046,15945,34927,42269,36551,36551,39780,36551,12209,39780,13506,9403, 3303, 42268,37534,10415,39779,39779,10489,42268,36550,39350,11984, - 32340,37972,36550,33794,2601, 9413, 14852,39779,16365,14326,37425,8120, 30262,23495,33142,5435, 19171,12008,12876,39345,32669,13793,42268,4240, 257, 32945,5135, + 32340,37972,36550,33794,2601, 9413, 14852,39779,16365,14326,37425,8120, 30262,23495,33142,5435, 19171,12008,12876,39345,32669,13793,42268,4240, 257, 32945,5135, 17354,9818, 19178,10927,38501,6374, 29971,3546, 39779,27791,37972,2433, 11306,12715,38696,14430,9108, 42268,5249, 15172,20707,36550,11477,36126,42267,28975,37971, 20941,9024, 7427, 24943,14325,20706,19273,23380,22056,38917,1041, 19558,36872,4888, 20705,14108,18988,21007,25093,34645,35163,38135,8360, 18248,35946,6241, 22421, 32831,34657,18938,30261,18937,39778,39778,35443,25720,18369,37971,2179, 36550,33142,39778,24242,30260,23979,12117,10602,2989, 36549,23494,51, 14008,19557,15171, 33794,206, 28044,33141,16801,10518,34544,5045, 2124, 39327,14944,33151,19441,35443,10591,466, 25833,5230, 33790,37971,39778,618, 14324,33794,36549,38945,19026, - 27058,35443,7701, 37971,35131,1962, 5081, 27870,9496, 4082, 5746, 9965, 19893,36549,33141,18368,11783,5792, 3338, 5861, 17260,35889,2935, 16207,12049,37970,7253, + 27058,35443,7701, 37971,35131,1962, 5081, 27870,9496, 4082, 5746, 9965, 19893,36549,33141,18368,11783,5792, 3338, 5861, 17260,35889,2935, 16207,12049,37970,7253, 11476,34008,33125,9259, 18060,2977, 17259,39777,36549,6045, 38509,31551,23493,38590,16206,412, 36115,9107, 5947, 35443,36548,35815,10926,30259,11782,39777,37970, 37531,33793,39777,6256, 11510,33141,39348,35442,21717,36548,34544,3014, 13505,42267,42267,42267,15534,20940,35442,37970,33057,36548,24566,39777,34404,28553,20939, - 42266,1383, 28418,24565,35442,12780,929, 37970,33141,34130,1367, 10090,5268, 33140,39776,39776,923, 413, 10610,12875,33692,37969,18059,35442,19960,826, 1781, + 42266,1383, 28418,24565,35442,12780,929, 37970,33141,34130,1367, 10090,5268, 33140,39776,39776,923, 413, 10610,12875,33692,37969,18059,35442,19960,826, 1781, 32104,11746,42266,34543,42266,29305,3219, 36548,34543,37969,21716,42266,30258,39776,23492,37969,32230,7749, 4140, 26378,28127,39061,35441,498, 27365,42265,37655, - 37119,3052, 5417, 14451,7509, 6661, 9258, 19272,321, 11531,33793,17736,38509,39776,23572,36289,42265,11745,33793,16476,20231,34368,42265,16113,42265,33303,8918, - 42264,35441,26512,29685,51, 39775,27106,36547,16495,42264,12471,32118,42264,37969,42264,716, 42263,36547,20704,37968,8926, 39775,31553,12399,35441,42263,4148, - 17073,35165,31930,37217,42263,36547,27356,39775,39775,18323,25971,7323, 8917, 36719,1865, 10014,4106, 30790,9817, 24743,20768,1702, 16205,28563,13310,9673, 153, - 3941, 25486,22227,16983,26682,20703,7409, 17193,2294, 5499, 12116,7039, 6329, 32802,13309,16714,19271,2594, 10936,2410, 38746,39774,21715,13804,10949,8563, 4525, - 24558,37523,6017, 6310, 33140,34171,32931,20984,16204,1474, 20407,5988, 8326, 4126, 17072,17649,4658, 11601,10769,16203,2046, 3618, 23491,2212, 6185, 36884,5660, + 37119,3052, 5417, 14451,7509, 6661, 9258, 19272,321, 11531,33793,17736,38509,39776,23572,36289,42265,11745,33793,16476,20231,34368,42265,16113,42265,33303,8918, + 42264,35441,26512,29685,51, 39775,27106,36547,16495,42264,12471,32118,42264,37969,42264,716, 42263,36547,20704,37968,8926, 39775,31553,12399,35441,42263,4148, + 17073,35165,31930,37217,42263,36547,27356,39775,39775,18323,25971,7323, 8917, 36719,1865, 10014,4106, 30790,9817, 24743,20768,1702, 16205,28563,13310,9673, 153, + 3941, 25486,22227,16983,26682,20703,7409, 17193,2294, 5499, 12116,7039, 6329, 32802,13309,16714,19271,2594, 10936,2410, 38746,39774,21715,13804,10949,8563, 4525, + 24558,37523,6017, 6310, 33140,34171,32931,20984,16204,1474, 20407,5988, 8326, 4126, 17072,17649,4658, 11601,10769,16203,2046, 3618, 23491,2212, 6185, 36884,5660, 6907, 18170,23347,15247,33793,21330,6171, 39774,1506, 20406,17071,31187,24901,36630,8905, 37927,38879,7970, 2482, 6750, 28702,26895,29143,37181,15884,17258,38488, 15721,16392,22322,11676,10024,22358,17717,574, 20740,21000,3346, 7179, 7199, 4422, 13456,6040, 23868,24782,36920,15533,1768, 7842, 34543,12145,36547,10756,28552, 42263,42262,36546,42262,27057,15060,33140,34941,4266, 21714,20938,35364,25719,35441,22491,39154,14802,31615,11983,14323,27793,32117,4737, 14436,30257,17757,34543, 34372,34301,11774,14306,18936,11524,33792,19297,24893,19454,37158,42262,15681,37968,33475,29998,26521,23490,34884,1923, 3967, 12470,37968,10109,4874, 7543, 33140, 37440,39774,21713,992, 9964, 29198,273, 12115,11554,11457,5224, 1079, 19270,39129,14851,16432,24564,1855, 30256,3617, 8325, 6391, 22655,20230,6627, 21743,35861, - 35440,21712,25718,22851,42262,36546,5209, 35070,12874,36645,16832,20702,3976, 20701,34542,35758,32383,37629,808, 2607, 18558,26162,24563,19554,9347, 5784, 6274, + 35440,21712,25718,22851,42262,36546,5209, 35070,12874,36645,16832,20702,3976, 20701,34542,35758,32383,37629,808, 2607, 18558,26162,24563,19554,9347, 5784, 6274, 20700,18058,6593, 20699,37968,19647,38127,7700, 11523,36546,37967,6098, 36546,12873,612, 7935, 10240,8191, 15494,10013,36969,3889, 14322,17070,38828,4172, 37967, 32116,25517,24562,42261,10414,36545,11098,19350,277, 20704,240, 499, 2052, 13604,11475,6597, 1507, 555, 20381,27737,34335,21473,1022, 32908,28396,33448,36011, 29228,4457, 566, 33659,33792,42261,38721,7210, 42261,25851,32115,11305,42261,24561,11781,32114,12972,7128, 14567,14801,3483, 8106, 10239,28551,20698,15944,12714, 37967,6004, 23980,12977,39774,37967,16202,14850,31452,5535, 39773,33714,4696, 2006, 32113,2853, 35397,983, 42260,4489, 15943,28550,12469,12971,34542,33010,33139, - 23821,6561, 34337,37966,39773,23005,5875, 20848,34629,480, 14384,33522,34542,14800,42260,1836, 2365, 1209, 33792,28549,39773,42260,39773,42260,36545,11769,9548, + 23821,6561, 34337,37966,39773,23005,5875, 20848,34629,480, 14384,33522,34542,14800,42260,1836, 2365, 1209, 33792,28549,39773,42260,39773,42260,36545,11769,9548, 42259,37966,42259,16201,11100,42259,9525, 37345,36872,11078,21764,36955,12834,6729, 19658,3535, 33575,22751,34014,12472,36669,4466, 20675,147, 1081, 37966,34349, 38468,38251,39772,9041, 35440,42259,15506,23753,7989, 22002,31834,13881,11586,11103,15577,14155,32800,32843,18946,11397,5023, 36133,38267,19269,16756,20351,39772, 19290,23819,28427,27888,9878, 34542,31345,37966,24560,34541,37965,37965,12468,15942,27056,36545,23554,12387,336, 2351, 20697,16618,19117,18496,38877,35440,32112, @@ -17248,7 +17243,7 @@ static const unsigned short Ranks[197839] = 15941,37965,36545,39772,35440,34541,100, 10108,27228,14321,19268,14849,32111,33792,23489,17259,7934, 42258,30255,7302, 38592,31929,39771,42258,33791,35439,22322, 35439,32110,11206,23488,25717,42258,42257,19267,20696,19254,27562,14848,31788,13308,42257,2273, 21037,28530,38548,25724,26575,17575,4695, 16200,42257,32810,13732, 35439,13803,33620,32851,5946, 32345,34913,25128,9547, 36818,33791,33791,27055,29547,15093,35409,18410,30766,26727,42257,35761,33617,19966,24129,27634,20695,25171, - 33208,3967, 14089,28548,23487,35439,37965,37964,42256,36544,42256,514, 39771,33791,16800,10346,33790,42256,39771,15987,19266,34610,42256,32109,37964,27054,5820, + 33208,3967, 14089,28548,23487,35439,37965,37964,42256,36544,42256,514, 39771,33791,16800,10346,33790,42256,39771,15987,19266,34610,42256,32109,37964,27054,5820, 18628,9739, 7913, 18833,24380,17069,39771,10971,13632,216, 5911, 26681,19221,27626,3684, 15482,12872,33139,32108,6287, 18682,14884,3467, 14705,35397,24983,34541, 34541,39770,4785, 39770,8904, 12871,7500, 17068,22919,37142,37181,42255,35342,13317,19265,6039, 14628,39367,39337,37964,37524,34540,39770,28547,8324, 12540,37407, 9716, 9106, 36544,35890,36341,32386,2364, 38494,34538,14290,30993,36046,33790,42255,24559,37281,18100,42255,34540,36080,34540,39770,37964,37963,33139,34444,13948, @@ -17256,22 +17251,22 @@ static const unsigned short Ranks[197839] = 36871,24297,34259,31299,24961,35386,32060,35438,8190, 34540,34539,39769,22242,37727,10601,30254,4930, 14847,39769,37441,38420,1168, 14954,35438,33790,7261, 12970, 20937,7021, 5208, 22171,24387,22534,12815,18057,8690, 36511,32999,34386,13504,30253,33005,17258,10755,4615, 35438,22475,39068,39372,42254,33139,33790,22547,39769, 39768,3816, 33789,35438,33138,2649, 24744,21632,36544,39768,18935,37963,13792,9816, 9161, 42254,38842,17756,19264,34539,753, 39768,9274, 30252,33789,15170,33789, - 36543,4364, 1129, 35628,3251, 34048,10412,13791,37963,35437,2438, 9815, 2787, 6214, 36543,34258,36543,15480,28159,9686, 33138,13790,299, 38942,32948,36936,3337, + 36543,4364, 1129, 35628,3251, 34048,10412,13791,37963,35437,2438, 9815, 2787, 6214, 36543,34258,36543,15480,28159,9686, 33138,13790,299, 38942,32948,36936,3337, 42254,42254,42253,13218,42253,39768,36026,33138,36543,42253,39767,14846,34539,20229,37963,42253,13548,1335, 39053,19909,23881,28172,29782,39261,39106,9577, 16459, - 19053,10903,34120,22135,38086,37513,30054,18518,12954,34732,36990,32437,14695,36066,16929,5387, 14845,29756,7225, 34206,37936,28681,23788,32151,35694,38590,7004, + 19053,10903,34120,22135,38086,37513,30054,18518,12954,34732,36990,32437,14695,36066,16929,5387, 14845,29756,7225, 34206,37936,28681,23788,32151,35694,38590,7004, 905, 2592, 20994,15309,12078,18410,38603,25798,23102,8461, 35121,18606,16716,10272,14643,31380,34036,6224, 14485,35603,36961,36792,35129,13206,21519,37763,30538, 25573,38779,9723, 11092,20693,38501,34400,8513, 34692,19255,16404,21050,15479,42252,6951, 17067,27052,6381, 9160, 39767,5595, 42252,1907, 22533,39767,14107,38617, 3179, 11780,17066,14310,10238,6816, 36542,36542,19754,5075, 16797,12969,16796,36894,9159, 35437,11779,36415,16199,3327, 16746,20228,23486,13802,13801,18056,23033, 30260,32107,24558,33789,42252,30251,30250,5027, 36854,13287,10197,10303,11205,18055,1433, 14844,42252,36261,25355,36843,24847,11304,42251,38600,28546,2432, 11128, 23467,33788,11778,7327, 32106,37053,8025, 9974, 39767,42251,42251,16118,17655,27051,33788,37962,39766,11304,35437,42251,25715,9973, 34163,30249,3640, 39766,42250, 27967,34539,42250,42250,16795,7748, 10935,4105, 15532,21711,34538,13503,4576, 42250,15915,2671, 1157, 2299, 527, 25159,32868,36722,37246,33138,42249,36542,23086, - 36542,34538,25312,7693, 33788,1057, 10925,35437,25311,13355,35436,42249,33788,37962,3588, 31772,39391,35436,33787,23485,19113,42249,30248,28545,17755,33137,7841, + 36542,34538,25312,7693, 33788,1057, 10925,35437,25311,13355,35436,42249,33788,37962,3588, 31772,39391,35436,33787,23485,19113,42249,30248,28545,17755,33137,7841, 289, 4802, 5230, 34479,28544,15940,34287,12968,34538,34538,8024, 28921,37962,35436,1520, 26887,4220, 35790,17257,34537,34215,37962,39766,37961,25714,35316,35598, - 37164,16794,34537,42249,20936,13217,37961,34321,36541,3139, 32105,25614,34595,36604,39766,1830, 27656,14691,20331,28543,42248,12460,37961,39765,9814, 35436,5376, + 37164,16794,34537,42249,20936,13217,37961,34321,36541,3139, 32105,25614,34595,36604,39766,1830, 27656,14691,20331,28543,42248,12460,37961,39765,9814, 35436,5376, 20643,29091,33441,23484,42248,6898, 28542,42248,28541,32482,36541,20227,42248,30676,36541,42247,9863, 23483,30247,27050,37503,12467,33787,37397,13789,30246,25713, 5951, 20692,12873,28294,31977,21036,39765,24557,20935,570, 15226,1306, 1801, 4515, 18054,4197, 7604, 3000, 30245,39223,6213, 1127, 34537,35435,35061,39765,37961, 35435,27235,17321,34537,16347,15531,33787,19228,20226,33137,8351, 29633,18597,32739,34536,395, 37960,1309, 32104,33103,36755,14320,13502,14748,32272,15478,38593, - 36541,18367,32867,42247,5670, 28108,13148,39765,7298, 30380,5112, 6626, 30244,57, 20586,5574, 28785,29093,21480,7179, 39764,15939,37960,116, 31423,34016,2196, + 36541,18367,32867,42247,5670, 28108,13148,39765,7298, 30380,5112, 6626, 30244,57, 20586,5574, 28785,29093,21480,7179, 39764,15939,37960,116, 31423,34016,2196, 33137,33137,37960,32103,12967,24556,39764,15938,35435,13788,33787,37960,13216,36540,27922,1858, 23554,39764,34238,27493,38788,42247,11522,18053,33693,12713,20492, 34299,20934,42247,32906,21013,42246,4928, 12350,36540,35435,35434,8068, 38674,33786,36540,20933,38110,3168, 35673,35434,33786,19556,36540,35118,37959,12942,32102, 32947,30243,33786,42246,36539,39764,42246,6800, 42246,39763,34239,1334, 21580,15477,3437, 33786,25695,33785,39763,23846,23410,7924, 30820,26092,36637,2490, 36945, @@ -17283,10 +17278,10 @@ static const unsigned short Ranks[197839] = 6321, 20, 9125, 759, 5384, 9288, 14224,6031, 4228, 33076,26109,21193,10880,8501, 8273, 9555, 17430,1549, 23034,2773, 17495,39760,12145,28557,7301, 8334, 32652, 37185,35433,32770,24555,3255, 12208,36539,42243,10934,39760,21542,28540,35810,37957,17256,33904,36965,9913, 35554,27314,33709,37957,4405, 7499, 38340,42243,20690, 10236,20689,19262,6068, 5426, 18050,35600,14450,9402, 7300, 15835,37957,37037,6697, 20688,42243,35274,42242,20687,20686,42242,37975,35433,32101,33596,39192,31577, - 15476,8747, 20685,11777,18050,23344,33126,34278,7063, 36964,6528, 42242,16793,33961,36539,42242,39760,28539,29667,6328, 32456,38383,38130,6948, 11204,39759,8254, + 15476,8747, 20685,11777,18050,23344,33126,34278,7063, 36964,6528, 42242,16793,33961,36539,42242,39760,28539,29667,6328, 32456,38383,38130,6948, 11204,39759,8254, 23236,10235,34536,39012,33738,2544, 32746,35529,7444, 34425,23482,17065,36399,39759,6725, 37426,38469,39759,42241,42241,42241,25380,36654,36159,32789,17064,37398, 39759,23559,36538,34361,34535,42241,35433,28538,33136,8219, 33785,30504,4723, 38929,23468,10933,37372,33785,35897,42240,13963,21127,18204,21340,14, 17666,16805, - 16391,11998,7207, 30401,39758,9526, 5263, 34535,12410,37314,6696, 27665,2531, 32990,16464,12705,8515, 14614,17556,21732,38210,28516,33514,17063,19199,21737,9550, + 16391,11998,7207, 30401,39758,9526, 5263, 34535,12410,37314,6696, 27665,2531, 32990,16464,12705,8515, 14614,17556,21732,38210,28516,33514,17063,19199,21737,9550, 35265,17160,36749,33553,33842,28101,15921,20947,32872,4132, 17795,19249,14932,26213,27553,25557,29629,27438,4575, 96, 37957,16792,42240,3638, 12162,7118, 27950, 3847, 6805, 33785,22380,23734,19261,11592,24622,8976, 37956,8119, 33027,33405,30034,33530,4113, 42240,36538,24016,26680,27049,21126,29679,20684,20811,33100,34692, 37485,10868,14106,672, 12477,2674, 35510,39019,11189,42240,15344,958, 16998,28251,21654,29133,10633,23421,9312, 14745,35585,3380, 5578, 10590,35433,15611,24702, @@ -17296,7 +17291,7 @@ static const unsigned short Ranks[197839] = 1880, 23833,5021, 10994,16709,13800,19260,13799,18632,11473,8317, 9601, 4281, 31065,14843,7453, 7632, 23688,3583, 11693,6659, 33790,6183, 19137,39391,26932,42238, 2363, 31599,9070, 16948,6243, 5170, 14376,10926,36687,33289,38526,13798,17062,18048,297, 19259,18778,33100,26540,20308,31652,31672,16385,27049,18333,16517,32933, 29824,25065,23803,34811,17754,32999,9320, 11472,38787,25314,32744,36990,21709,39758,38277,39757,36538,32099,38134,39757,33784,11471,14842,32963,13305,10754,35432, - 42237,17212,24138,28866,36907,21516,42237,16271,16541,37167,18047,39757,42237,3354, 35432,36537,34535,35461,34535,39757,22260,39042,42237,10107,33784,39756,8810, + 42237,17212,24138,28866,36907,21516,42237,16271,16541,37167,18047,39757,42237,3354, 35432,36537,34535,35461,34535,39757,22260,39042,42237,10107,33784,39756,8810, 28794,31202,20303,42236,39756,21708,42236,11992,28731,36537,6344, 37213,26291,42236,26515,12372,4142, 38755,31782,42236,17255,34534,8295, 33526,36537,32980,35460, 28219,36537,38268,42235,7706, 18390,1680, 10633,25077,26778,42235,1366, 27781,9123, 21196,6902, 15936,42235,37956,33136,3138, 8470, 42235,39756,15703,8454, 18856, 15900,800, 17697,37905,35432,36005,12844,400, 29527,17753,14407,39134,38396,29779,8233, 30308,42234,27048,30242,37591,20365,19500,16751,18046,3623, 28257,37956, @@ -17314,52 +17309,52 @@ static const unsigned short Ranks[197839] = 42229,1006, 3560, 3266, 24355,1382, 2418, 12, 4410, 6599, 23361,14955,38433,34335,29414,14849,25061,38981,16843,34704,39751,778, 18366,39751,3731, 35815,38737, 36346,30239,13797,37954,42229,19258,6595, 38965,7656, 35430,28522,36535,16633,31240,39751,30181,1481, 14448,25711,725, 7699, 33775,36058,2365, 11775,8063, 38731, 19257,34107,32931,28053,3532, 34365,15731,24301,36162,14841,38310,35774,19433,12137,33045,19280,38107,36537,19416,39278,33783,28387,38369,42229,33388,9565, 42229, - 32818,34532,37449,37390,25373,12113,39750,19668,11744,19168,35827,39750,38500,25037,32349,2136, 33348,269, 20925,37954,33443,39209,2048, 11240,5689, 37794,1825, - 21957,35120,39750,28157,37674,34147,19256,1420, 36534,42228,37954,4283, 5207, 3710, 33414,20989,20252,20012,17229,743, 6196, 16362,37954,3417, 4929, 33135,9104, + 32818,34532,37449,37390,25373,12113,39750,19668,11744,19168,35827,39750,38500,25037,32349,2136, 33348,269, 20925,37954,33443,39209,2048, 11240,5689, 37794,1825, + 21957,35120,39750,28157,37674,34147,19256,1420, 36534,42228,37954,4283, 5207, 3710, 33414,20989,20252,20012,17229,743, 6196, 16362,37954,3417, 4929, 33135,9104, 20681,6342, 11127,37953,7698, 32095,33782,12112,36983,9103, 2895, 23388,39750,36534,33195,13796,12111,1629, 32961,10238,22200,36534,37565,23748,33782,38467,22528, 3796, 15925,35430,38487,9182, 12064,22576,30447,19518,12110,2539, 19554,8564, 14317,11776,12476,20680,18412,16197,15475,37997,14316,5550, 32094,36534,25710,33134, 6950, 36533,39749,35430,8118, 39749,20223,42228,14749,32465,11773,35074,36533,35266,37953,29458,42228,32283,26496,33268,18042,11918,32093,29324,34063,21351,39749, - 36533,20008,34532,22805,33158,5383, 34881,37332,37917,11303,36083,42228,16081,33782,24551,6487, 12339,20394,8021, 31766,2924, 8309, 4541, 24767,33782,10262,1923, + 36533,20008,34532,22805,33158,5383, 34881,37332,37917,11303,36083,42228,16081,33782,24551,6487, 12339,20394,8021, 31766,2924, 8309, 4541, 24767,33782,10262,1923, 38911,6517, 8603, 19196,14621,4286, 34626,9431, 37498,25526,34499,39749,33781,7468, 502, 32780,30009,8554, 12189,12726,32802,18424,3966, 33134,18549,17060,19255, - 7261, 3381, 39748,6594, 36592,42227,32048,34532,29857,123, 19698,32966,6244, 15354,15440,4129, 9666, 20315,13699,16906,10850,37953,24581,10078,37953,37566,4965, + 7261, 3381, 39748,6594, 36592,42227,32048,34532,29857,123, 19698,32966,6244, 15354,15440,4129, 9666, 20315,13699,16906,10850,37953,24581,10078,37953,37566,4965, 34358,39197,35318,37952,27783,42227,35430,442, 34995,34641,38705,23254,18187,11870,3036, 21629,27044,33996,36560,18757,10881,35649,39246,37816,12104,22527,36294, - 36533,4147, 13963,36857,33532,33804,38071,16361,39002,11982,35387,5348, 36532,9319, 36532,42227,20222,35429,35429,37952,36532,18384,33134,32092,22526,39748,6786, + 36533,4147, 13963,36857,33532,33804,38071,16361,39002,11982,35387,5348, 36532,9319, 36532,42227,20222,35429,35429,37952,36532,18384,33134,32092,22526,39748,6786, 7090, 42227,5110, 16196,15474,22979,14579,28535,36937,1258, 3022, 745, 27600,21616,26508,31022,25211,12401,17384,36360,35429,34820,27043,6887, 9516, 22867,31329, 27780,3265, 6845, 24271,6276, 22607,4336, 32457,42226,39379,772, 849, 16394,214, 5090, 28623,11930,39748,32679,9469, 5209, 3559, 32305,42226,35565,36083,11020, 16846,18081,7299, 11346,172, 4997, 25776,17617,32925,2727, 10888,34976,26725,34531,6180, 19898,1761, 16556,7992, 5898, 33134,21707,42226,11589,9143, 32809,28191, - 1241, 106, 19450,22945,4106, 16095,30771,926, 895, 6491, 196, 42226,14798,34531,34531,37952,42225,26677,37952,904, 31395,63, 34610,6734, 12923,14174,5129, + 1241, 106, 19450,22945,4106, 16095,30771,926, 895, 6491, 196, 42226,14798,34531,34531,37952,42225,26677,37952,904, 31395,63, 34610,6734, 12923,14174,5129, 2996, 13119,6088, 8441, 5459, 15718,36980,12931,27786,3150, 3864, 37875,33454,827, 3069, 3032, 524, 17254,4467, 1315, 33885,11290,3542, 9813, 36532,2269, 30940, - 30230,42225,35878,37180,32585,34267,33133,37504,33133,42225,36531,7814, 38449,17469,32939,554, 21969,37230,33221,32831,17962,15406,7244, 13410,15523,15586,9632, - 1920, 35683,23331,732, 14315,37520,25198,21972,35837,23911,37954,14059,39748,14543,42225,33485,34531,34638,37951,39160,39747,33781,33495,24552,7875, 7178, 604, + 30230,42225,35878,37180,32585,34267,33133,37504,33133,42225,36531,7814, 38449,17469,32939,554, 21969,37230,33221,32831,17962,15406,7244, 13410,15523,15586,9632, + 1920, 35683,23331,732, 14315,37520,25198,21972,35837,23911,37954,14059,39748,14543,42225,33485,34531,34638,37951,39160,39747,33781,33495,24552,7875, 7178, 604, 5812, 32862,30349,15909,8916, 39747,37465,18041,9685, 34033,8689, 7396, 32151,26942,39747,33781,26960,28272,13280,37166,5206, 18040,15473,10234,5171, 36112,24087, 39747,5435, 29522,6352, 35242,38978,4305, 17652,16939,25709,1510, 5631, 35925,957, 36242,38583,27042,38253,25266,42224,42224,37951,38674,39746,42224,12206,33133, 34972,27041,7260, 42224,8049, 24778,3545, 8350, 523, 9684, 20679,4633, 37509,37951,18852,12685,34530,34530,37951,11470,39225,23913,21755,33664,36070,16195,33975, 12579,9222, 6962, 23284,35155,12475,3199, 11343,37734,7807, 4915, 17188,39347,32122,22525,33085,35518,39746,33272,37950,30238,33133,37286,18039,32091,21695,36311, 595, 16425,26313,5316, 3263, 33083,9066, 32969,35600,15139,42223,39746,37950,14105,38833,42223,35791,39340,15932,6279, 23567,17765,29441,35503,24370,38518,34679, 28630,37950,35026,36531,1675, 42223,36763,42223,35705,20632,23872,31896,12865,38472,23736,28534,26450,9957, 33132,30237,4762, 36531,37744,21866,30506,36531,42222, - 4830, 2014, 22766,13628,16597,15774,4665, 11595,30631,42222,20221,42222,2116, 2207, 38901,25481,27690,24146,11968,611, 18444,21835,8801, 11222,19168,16446,4826, + 4830, 2014, 22766,13628,16597,15774,4665, 11595,30631,42222,20221,42222,2116, 2207, 38901,25481,27690,24146,11968,611, 18444,21835,8801, 11222,19168,16446,4826, 9254, 13761,1672, 38492,33764,31511,19048,144, 1819, 607, 1087, 22776,5266, 21457,39027,19254,15637,36340,42222,17642,36886,37820,22727,15364,29382,29205,13925, 9639, 38801,7638, 21101,38826,24396,16194,2343, 32752,5349, 32090,36841,12205,39080,42221,244, 6003, 37950,37949,42221,15529,42221,33781,42221,37949,25708,12962, 3508, 35104,29981,9257, 13306,34530,37304,12098,38620,230, 847, 35195,16446,10687,3151, 10686,795, 36059,29147,16193,5860, 36530,38368,12204,32089,2151, 14803, - 16790,9102, 14314,12870,19553,27040,16789,42220,38882,17059,15169,12712,33957,33780,42220,39746,35429,13501,42220,30087,33559,39745,1846, 42220,27243,26623,7326, + 16790,9102, 14314,12870,19553,27040,16789,42220,38882,17059,15169,12712,33957,33780,42220,39746,35429,13501,42220,30087,33559,39745,1846, 42220,27243,26623,7326, 23604,38098,33947,9628, 11720,4171, 32862,38189,1862, 1072, 25869,9978, 27959,15874,14653,5430, 39745,37393,36754,990, 15826,11712,33415,18038,32714,2639, 12869, 17058,5636, 11203,39331,33132,3635, 19076,19598,15517,37193,14231,29823,13795,13204,12474,30570,37391,7318, 22324,534, 24527,2884, 42219,12961,39745,42219,21706, 42219,14832,32975,35459,21758,42219,35941,42218,24506,36530,42218,39265,1282, 39410,27039,18037,36552,20038,2889, 36530,12466,76, 29371,28601,37949,481, 37949, 7456, 2506, 20678,19253,19252,2490, 8925, 2435, 22524,12868,33780,3843, 6327, 12109,28155,4993, 18036,352, 18287,19780,3666, 20677,33780,33780,3604, 24571,33204, 24290,20929,2786, 34530,37948,1016, 31868,36530,38021,38882,39745,16411,37948,9546, 24102,33779,15168,5669, 34529,35428,12867,10012,29443,16898,39214,1468, 33519, - 37948,38916,21024,14313,20313,36528,29405,14401,1421, 7447, 8902, 8901, 42218,16452,14551,32141,33973,38529,7375, 4635, 19251,10233,30630,21705,30236,12473,7932, + 37948,38916,21024,14313,20313,36528,29405,14401,1421, 7447, 8902, 8901, 42218,16452,14551,32141,33973,38529,7375, 4635, 19251,10233,30630,21705,30236,12473,7932, 7931, 37282,10919,42218,36306,6151, 3386, 4860, 30680,4992, 5549, 2586, 7813, 20236,17902,39744,12852,37715,39744,2527, 37948,11743,17565,15933,37947,10470,25801, 21606,4812, 7299, 1530, 36529,34429,13230,35817,18933,27147,36958,34947,19724,10105,10753,39744,42217,37947,15167,42217,8260, 10232,36529,24551,33779,3711, 32088, - 39744,20928,37947,17254,35428,35210,36529,12465,42217,30235,33779,18932,30234,39743,39743,36529,38128,27038,2055, 1451, 3867, 2920, 10460,2101, 7298, 3845, 8669, + 39744,20928,37947,17254,35428,35210,36529,12465,42217,30235,33779,18932,30234,39743,39743,36529,38128,27038,2055, 1451, 3867, 2920, 10460,2101, 7298, 3845, 8669, 2981, 5265, 37947,15166,27037,218, 35428,42217,34529,2817, 33779,36528,9272, 4363, 39079,12464,39743,15472,39743,42216,20220,20927,33778,37946,37946,19552,20926, 26367,39179,37946,35428,42216,35427,39742,679, 37946,32087,18365,39742,36528,36528,42216,42216,38551,30233,13794,18340,32560,34529,33751,32986,39398,687, 39742, 36528,2075, 1816, 42215,33132,555, 1693, 1588, 37945,42215,33778,34529,16063,234, 14104,9158, 37928,33778,25008,20219,42215,937, 24959,37945,42215,3587, 17752, 33778,33044,26397,5044, 9785, 37, 9910, 31490,39263,34528,32597,30505,33712,42214,23246,35306,42214,17747,18727,16788,11126,28533,35492,37945,28532,25707,13906, 629, 7485, 28766,33777,4041, 42214,22523,20756,29626,14797,39742,17253,4761, 37945,29419,18056,6057, 38818,42214,19344,37944,23871,42213,1480, 19462,35494,15240, - 34739,36527,3162, 38285,20427,3031, 42213,37944,30232,3244, 24448,36207,8083, 25498,28059,35392,34283,33888,38902,25605,11019,24534,32925,6597, 26967,33657,1957, + 34739,36527,3162, 38285,20427,3031, 42213,37944,30232,3244, 24448,36207,8083, 25498,28059,35392,34283,33888,38902,25605,11019,24534,32925,6597, 26967,33657,1957, 3411, 5524, 42213,10459,35686,33688,33882,20318,20944,39103,36448,34381,36118,37929,34641,35916,38681,35763,26547,34490,31473,18706,33890,34720,34093,2731, 10297, 9864, 31032,17696,25155,14789,2150, 11473,26747,19697,35124,37266,32714,35192,36384,27419,38041,35125,13305,28249,38360,10749,1332, 19289,26609,35194,35999,31676, - 36527,36561,32086,32085,38212,4341, 5837, 12108,1234, 39741,39741,26391,36680,20676,36986,6002, 33777,32084,39741,2469, 42213,6712, 24208,32083,20925,37704,5450, + 36527,36561,32086,32085,38212,4341, 5837, 12108,1234, 39741,39741,26391,36680,20676,36986,6002, 33777,32084,39741,2469, 42213,6712, 24208,32083,20925,37704,5450, 32115,37944,27036,39191,32082,15714,33033,1538, 2780, 37944,8606, 788, 17057,12107,2974, 9220, 38445,39741,4652, 1857, 17751,16881,34144,33132,39740,42212,34528, 42212,14447,42212,42212,3716, 38207,2941, 6516, 39740,25706,33131,34528,39740,37943,8965, 39740,33777,42211,39739,36527,2791, 24155,22744,13536,37943,5111, 32234, 18109,28317,42211,39739,7395, 36527,6294, 16192,30231,35430,28738,37137,595, 22003,34448,5332, 39739,2109, 2089, 29867,22182,14555,8689, 35211,35593,33897,18583, @@ -17371,10 +17366,10 @@ static const unsigned short Ranks[197839] = 32896,20821,10777,11556,5601, 34899,20467,39373,33616,37225,34787,32132,33036,8755, 33279,26413,34687,14840,13793,9430, 15471,35487,4991, 34676,34665,37264,33978, 37072,37103,16215,20014,36206,34527,34527,37311,35426,18436,33708,13374,39270,35554,13327,12471,35692,3341, 36167,37835,7464, 29638,8746, 12106,26805,37433,15117, 18353,6425, 10721,38023,34655,26951,30730,28837,36525,34990,24549,33131,715, 1874, 36599,16449,36525,23480,3013, 42209,13792,33776,6274, 33776,78, 8343, 26568, - 11734,16994,36795,25024,16814,27028,6195, 3730, 8855, 5243, 14797,30228,2203, 23214,7020, 5007, 13215,33130,33043,24876,890, 42208,33776,28530,8563, 42208,6499, - 11818,39737,13214,12463,37942,21373,39737,36278,35426,31, 11545,10080,34944,39737,32484,4719, 21750,42208,35426,42208,10261,33775,12960,1976, 34526,18611,2632, + 11734,16994,36795,25024,16814,27028,6195, 3730, 8855, 5243, 14797,30228,2203, 23214,7020, 5007, 13215,33130,33043,24876,890, 42208,33776,28530,8563, 42208,6499, + 11818,39737,13214,12463,37942,21373,39737,36278,35426,31, 11545,10080,34944,39737,32484,4719, 21750,42208,35426,42208,10261,33775,12960,1976, 34526,18611,2632, 13498,26984,9039, 5346, 15470,39737,39736,23223,22522,37942,15597,11742,10704,26848,1870, 20770,2560, 2744, 30227,1751, 15165,33775,33627,7191, 9365, 7930, 18361, - 37793,38435,877, 39736,42207,3822, 21685,42207,4196, 35425,14119,32078,8460, 3873, 39736,22393,36525,11547,13497,20799,20218,18364,15414,19634,42207,19095,4928, + 37793,38435,877, 39736,42207,3822, 21685,42207,4196, 35425,14119,32078,8460, 3873, 39736,22393,36525,11547,13497,20799,20218,18364,15414,19634,42207,19095,4928, 30226,20922,13392,39736,16500,15345,8502, 2589, 34526,5043, 21189,37668,1350, 10902,28134,6694, 10589,23243,1179, 32089,11775,5170, 271, 14875,33130,8745, 33692, 8097, 19250,29074,19498,29062,34526,36524,26763,37416,11518,39735,16359,37382,37643,6811, 21841,37942,7171, 7137, 19749,19058,1411, 7616, 30516,23562,3114, 28395, 14919,14997,673, 7721, 31163,11557,7377, 27387,15164,16927,377, 19333,32956,33622,34526,39197,34568,6839, 20674,7742, 17922,12470,29917,34257,33130,19119,32990, @@ -17383,13 +17378,13 @@ static const unsigned short Ranks[197839] = 16580,30549,218, 24031,3682, 30152,37577,8043, 22670,6892, 30962,8117, 42207,39735,23478,33059,25703,19550,34072,36524,36524,37894,4736, 15286,42206,42206,13593, 8062, 32801,29892,6798, 26789,27093,1511, 36656,15824,818, 24649,34699,22049,9408, 14729,7997, 20911,24215,4275, 13363,31018,23319,39297,2045, 35124,19765,38722, 3344, 35953,37759,13451,38410,33770,9453, 23119,39213,32041,33307,37942,18929,42206,2150, 2074, 7591, 39735,37941,38358,37941,32631,37941,38631,37505,25702,42206, - 211, 3410, 36524,34525,33130,42205,33836,28220,32927,39735,32510,24232,34525,37940,20009,25697,29130,22807,8198, 28762,26480,2212, 37097,22033,34489,22233,6412, + 211, 3410, 36524,34525,33130,42205,33836,28220,32927,39735,32510,24232,34525,37940,20009,25697,29130,22807,8198, 28762,26480,2212, 37097,22033,34489,22233,6412, 28930,34370,1913, 33684,5498, 38967,26290,12594,32030,33876,6980, 3639, 39287,3384, 33672,42205,38054,32827,34108,39734,8744, 9911, 14839,11774,35425,33603,17750, 25730,30225,39734,32821,14445,35320,20965,22521,20671,35168,16267,33129,37940,32909,5552, 12050,37143,37940,10752,35425,13850,20921,176, 32539,3935, 31624,31417, 9130, 22360,3907, 32965,2531, 21194,11897,38766,2896, 21187,3589, 37940,38940,18034,6275, 24273,32077,37939,42205,12469,42205,6569, 42204,1889, 22520,11483,22063, 30224,37939,1912, 17940,8363, 64, 10003,31292,42204,391, 9038, 32357,3634, 4840, 145, 27034,463, 16190,33129,39734,37514,277, 21980,23672,12743,12804,13999, 29852,39734,42204,9256, 2775, 29358,4866, 7151, 5379, 7395, 37939,42204,6625, 27224,1539, 33129,23077,1201, 30999,1977, 39733,33129,11125,16096,35425,9258, 32076, - 37448,6380, 37939,35424,42203,23477,42203,39733,33129,2808, 3351, 9429, 39733,37938,567, 2362, 42203,36523,37938,9972, 25701,6826, 24337,13213,32951,33263,951, + 37448,6380, 37939,35424,42203,23477,42203,39733,33129,2808, 3351, 9429, 39733,37938,567, 2362, 42203,36523,37938,9972, 25701,6826, 24337,13213,32951,33263,951, 8086, 35576,20920,29679,5714, 17776,15527,2417, 1089, 18221,33015,12037,35850,10011,36523,32075,37938,373, 15914,24989,1911, 32839,18849,16358,33128,68, 28902, 27557,2417, 19312,20352,29018,23704,12327,22039,25493,32888,32074,39733,30300,20367,35424,1640, 9037, 42203,39732,28529,13496,2020, 33151,33775,22120,16357,39732, 20217,18363,39732,38066,34134,36523,34449,12292,18980,42202,37938,38292,34922,7603, 31888,33128,38844,18033,35152,3078, 35066,26468,17251,37619,1536, 33128,33923, @@ -17398,21 +17393,21 @@ static const unsigned short Ranks[197839] = 42200,30627,38447,24548,33774,32071,24547,37937,39731,33774,23473,42200,22519,32070,9156, 42200,23472,33127,42200,3077, 37936,39731,42199,42199,37936,2025, 33127, 35424,11374,9911, 38659,20500,26971,25825,37936,33774,39325,830, 32917,27031,26437,35423,39730,37936,39730,35056,35423,37935,8323, 29003,35222,38016,728, 19757, 5862, 2631, 4475, 24691,26093,37935,3899, 11483,8798, 7713, 21754,42199,564, 7334, 25603,5548, 10230,36521,39730,39730,36521,126, 14829,6660, 5463, 11218,32794, - 21320,34525,6961, 15468,24762,6886, 6815, 9404, 14664,23638,11469,21337,6693, 35963,31668,30431,13761,18032,42199,8915, 14961,5429, 1251, 31888,3098, 18031,6190, + 21320,34525,6961, 15468,24762,6886, 6815, 9404, 14664,23638,11469,21337,6693, 35963,31668,30431,13761,18032,42199,8915, 14961,5429, 1251, 31888,3098, 18031,6190, 1380, 25813,19249,12105,14312,8605, 39210,6354, 39729,17656,25339,4996, 14948,8322, 38091,34524,36521,36521,18551,35353,6379, 38646,33572,16000,24317,33127,37935, 37935,35914,26047,19248,33412,39204,14717,10088,14342,37934,30519,14801,36001,8010, 39729,39109,42198,36520,27563,2590, 22128,22512,17310,32991,19465,16189,36983, 38070,30323,19340,1291, 2135, 29060,37934,10053,151, 7949, 10343,23195,20873,22871,26688,9618, 10415,12626,3508, 27345,33021,23471,510, 3954, 22833,16241,28904, 12593,15586,24079,28035,9519, 29039,37841,7943, 34901,7088, 42198,42198,32532,2262, 12103,12068,29016,26154,4508, 37938,16263,20623,1010, 10498,2858, 27003,34868, 21316,1956, 23473,36090,6747, 17226,32834,30099,14745,33012,28863,42198,39729,14122,1442, 34524,27030,1020, 5739, 586, 19549,26356,32816,38827,20180,37934,15526, - 14311,39729,26843,34313,33105,15153,10258,1730, 37934,8022, 8562, 6273, 33192,30421,38458,17056,16188,3111, 21246,12415,19496,27740,42197,6077, 37933,11521,8116, - 37933,35423,42197,24954,36876,1409, 27098,11981,30221,39728,39728,263, 29461,21325,39728,39728,673, 26999,5993, 5057, 7930, 1228, 12468,2963, 3184, 7697, 1984, - 31692,22422,1765, 3406, 19175,9078, 26499,18832,35973,19351,1320, 3539, 27615,32694,24140,17520,3180, 25416,42197,30220,33773,35423,12467,5186, 37630,34223,6454, - 35010,23037,367, 18887,18648,2163, 35312,32240,24109,34525,34795,34853,5547, 35967,37936,38151,22509,12959,37933,17055,2511, 37933,14310,1079, 823, 28370,7838, - 42197,34735,13791,20670,36063,39727,35731,36190,39727,42196,18433,19106,17316,39727,7918, 269, 4267, 28467,27309,29568,10924,14796,36520,31683,37307,17250,3076, + 14311,39729,26843,34313,33105,15153,10258,1730, 37934,8022, 8562, 6273, 33192,30421,38458,17056,16188,3111, 21246,12415,19496,27740,42197,6077, 37933,11521,8116, + 37933,35423,42197,24954,36876,1409, 27098,11981,30221,39728,39728,263, 29461,21325,39728,39728,673, 26999,5993, 5057, 7930, 1228, 12468,2963, 3184, 7697, 1984, + 31692,22422,1765, 3406, 19175,9078, 26499,18832,35973,19351,1320, 3539, 27615,32694,24140,17520,3180, 25416,42197,30220,33773,35423,12467,5186, 37630,34223,6454, + 35010,23037,367, 18887,18648,2163, 35312,32240,24109,34525,34795,34853,5547, 35967,37936,38151,22509,12959,37933,17055,2511, 37933,14310,1079, 823, 28370,7838, + 42197,34735,13791,20670,36063,39727,35731,36190,39727,42196,18433,19106,17316,39727,7918, 269, 4267, 28467,27309,29568,10924,14796,36520,31683,37307,17250,3076, 35202,22741,15873,15525,37932,33127,35422,36558,42196,18928,10104,39727,38320,21703,39726,27029,35519,32165,34524,24546,37886,42196,39726,37526,24545,34259,30219, 15562,35422,304, 6746, 19613,15287,5718, 37932,33884,27028,18621,36511,39726,23470,17749,42196,21702,764, 37932,42195,39726,9428, 16119,22472,37932,35765,36583, 26076,35787,27027,37931,18416,2680, 9831, 28826,13965,23983,35497,24136,4329, 13271,34556,5050, 34913,14838,28037,9456, 9105, 35480,32069,23469,25941,15436,14444, - 5162, 37931,18927,37931,35422,15467,9813, 20669,12461,38106,36520,42195,42195,42195,18555,11007,36976,42194,38022,42194,33503,36111,17519,33634,37811,14795,9971, + 5162, 37931,18927,37931,35422,15467,9813, 20669,12461,38106,36520,42195,42195,42195,18555,11007,36976,42194,38022,42194,33503,36111,17519,33634,37811,14795,9971, 18362,37931,34524,35422,17021,30218,1015, 42194,19247,42194,576, 30945,32928,27026,36939,11587,30330,28361,29670,34963,35130,14158,42193,33773,32989,30217,39725, 42193,23270,9872, 32801,25094,23512,29073,39725,38941,12075,26855,32885,13658,32811,30216,31357,19369,13701,30756,23117,17054,36429,20016,42193,11796,22640,34152, 9427, 22405,22861,7918, 25978,13421,37826,37472,23057,13957,24283,24708,15466,16918,12, 9683, 38839,38777,16216,22444,26485,29647,29709,34602,35266,36644,12033, @@ -17421,21 +17416,21 @@ static const unsigned short Ranks[197839] = 28526,7104, 42192,39724,37930,39724,20187,15051,39724,38885,28303,7867, 8632, 7133, 34918,37930,4657, 13212,20215,42192,36520,10229,8900, 21062,4878, 5150, 19548, 39724,26738,33099,10280,10912,6960, 35893,33888,18030,42192,559, 21700,42192,341, 37929,32530,1600, 13495,1976, 916, 756, 35421,20607,42191,39723,31453,31923, 36519,42191,21290,20470,1914, 17249,28525,37929,42191,34863,13299,35421,10923,34252,23810,7891, 19246,37553,12103,15931,42191,42190,20918,42190,13849,37929,37929, - 24826,42190,17748,15163,37928,14225,42190,36519,2973, 20667,32968,42189,39723,20023,16731,20666,29999,20665,6425, 18312,33021,1399, 3577, 18908,42189,36449,5169, + 24826,42190,17748,15163,37928,14225,42190,36519,2973, 20667,32968,42189,39723,20023,16731,20666,29999,20665,6425, 18312,33021,1399, 3577, 18908,42189,36449,5169, 32287,36519,42189,10751,1814, 5303, 33020,6126, 33080,22753,17942,15640,9298, 10432,7084, 25721,16681,7640, 10161,11539,19300,6559, 28974,31138,5964, 14379,26156, 17303,21094,4321, 2822, 11737,26186,19299,25686,13656,13062,24147,25098,28195,23226,9436, 4706, 30166,13295,14482,24557,12233,42189,35421,38316,681, 509, 18469, - 2310, 6751, 37928,42188,14443,37928,33126,28524,30215,34679,20664,2309, 6674, 6142, 36519,9155, 20917,42188,24188,27025,20570,1188, 15757,11880,12672,9234, 8115, - 3828, 39723,24386,39723,42188,16355,29562,37928,37927,33066,32671,10939,27024,5229, 42188,13211,18925,2614, 4750, 11950,7467, 9433, 12466,23136,39722,22621,9202, + 2310, 6751, 37928,42188,14443,37928,33126,28524,30215,34679,20664,2309, 6674, 6142, 36519,9155, 20917,42188,24188,27025,20570,1188, 15757,11880,12672,9234, 8115, + 3828, 39723,24386,39723,42188,16355,29562,37928,37927,33066,32671,10939,27024,5229, 42188,13211,18925,2614, 4750, 11950,7467, 9433, 12466,23136,39722,22621,9202, 20713,33384,13790,18961,37834,7066, 12793,28614,34040,5281, 8320, 37065,8638, 1177, 33420,13595,2246, 2959, 15633,19245,4212, 5909, 24509,19244,39722,37871,22288, 3372, 37724,18871,262, 805, 37377,37927,39722,4877, 4675, 16266,13789,33220,35043,33490,37080,18139,34195,34838,35827,33815,38721,42187,28384,519, 28199,39722, - 42187,33439,42187,32453,3801, 10228,19942,16186,10071,38982,3170, 29560,30918,37976,36634,18029,9762, 37220,7941, 29759,33226,12465,30214,18028,16185,9255, 9426, - 13788,13791,37528,38133,5164, 22696,35394,26140,35067,22055,9947, 39721,35649,1843, 17053,20663,33630,6885, 34761,33002,26557,42187,22478,21559,14258,16989,5109, + 42187,33439,42187,32453,3801, 10228,19942,16186,10071,38982,3170, 29560,30918,37976,36634,18029,9762, 37220,7941, 29759,33226,12465,30214,18028,16185,9255, 9426, + 13788,13791,37528,38133,5164, 22696,35394,26140,35067,22055,9947, 39721,35649,1843, 17053,20663,33630,6885, 34761,33002,26557,42187,22478,21559,14258,16989,5109, 8792, 17052,1941, 25847,1624, 20760,35421,12615,10685,1427, 39721,2415, 2664, 11741,32556,17375,37927,35267,21586,14442,37927,35986,3486, 4687, 7038, 10227,13303, 13787,14309,12463,30213,27404,39721,42186,34523,42186,33703,6097, 22146,39721,27375,1642, 16077,6177, 1016, 24544,1713, 34826,261, 13786,37022,2613, 39720,32067, 36302,35420,37926,9154, 507, 742, 42186,19243,28523,12460,16176,33929,25698,37988,17051,37926,9036, 5319, 22357,21699,32066,14441,21698,36843,20916,28522,10922, 34380,36518,42186,32065,39720,38834,24543,33669,38517,32064,4803, 42185,9035, 34523,18826,28600,15541,30212,32063,36898,42185,22516,11980,36518,39720,35420,35420, 38089,14103,34609,38374,42185,35272,38559,5267, 42185,17747,25283,20045,33773,739, 42184,36518,26020,13784,33772,34523,1543, 18983,3507, 2554, 42184,33772,20214, - 22246,26849,33176,36460,2851, 42184,2726, 36413,1692, 28521,39720,33126,42184,35420,42183,33772,19242,33772,37926,35419,32062,18924,37926,5118, 94, 19394,697, + 22246,26849,33176,36460,2851, 42184,2726, 36413,1692, 28521,39720,33126,42184,35420,42183,33772,19242,33772,37926,35419,32062,18924,37926,5118, 94, 19394,697, 32927,12464,16532,37790,32263,24862,16394,32822,11272,33595,1893, 38272,111, 18572,32968,738, 21697,12569,11979,4814, 37925,11858,28030,12457,34103,27023,34522, 39719,6523, 39011,38657,28556,31444,37925,30211,39719,23761,33374,15523,13783,35107,28520,37925,34623,32061,280, 28772,35419,24073,31582,34522,42183,5246, 22638, 30090,33771,42183,34522,39719,14257,17406,37925,39719,24542,42183,8468, 7340, 13518,37546,39718,90, 24347,14851,31457,20213,5608, 7147, 34522,34547,7113, 34125, @@ -17443,7 +17438,7 @@ static const unsigned short Ranks[197839] = 36517,30078,28949,17612,7259, 6825, 36273,38762,16929,10819,18027,33771,5828, 12541,17784,10259,38656,5841, 9250, 18361,17431,1241, 23794,2547, 15243,17052,16543, 36147,415, 19146,27022,39718,36232,6341, 27021,18360,12158,1453, 21472,1416, 14593,37703,28854,4039, 32393,1066, 36517,8116, 39718,23600,13431,14794,31970,35419, 867, 11202,13785,8321, 19241,42182,20915,37924,30135,4476, 35533,9101, 9473, 6246, 20774,18026,14166,9254, 37924,26639,32136,27744,27256,29842,33058,23030,39030, - 37852,27520,18923,18947,35419,24541,9812, 8189, 38742,17656,17049,16184,9100, 7208, 42182,4172, 36871,39717,5247, 17, 31529,27879,28200,7667, 32869,20793,628, + 37852,27520,18923,18947,35419,24541,9812, 8189, 38742,17656,17049,16184,9100, 7208, 42182,4172, 36871,39717,5247, 17, 31529,27879,28200,7667, 32869,20793,628, 12337,1543, 11661,35418,37924,37420,25454,11467,39717,19546,13160,23883,4930, 37215,18502,20062,3961, 14047,12102,27369,930, 12808,4867, 10684,27020,666, 14837, 1103, 33126,6337, 26817,18025,42182,25693,42181,10683,27844,1329, 116, 24474,6414, 10932,10226,35418,35340,33126,33771,35418,808, 7260, 10452,923, 5836, 26308, 3995, 9887, 20513,4964, 33820,4239, 16183,37923,16699,3568, 3729, 22374,34563,8188, 42181,34153,35389,22666,24314,23956,6242, 8688, 36179,28780,39717,7645, 14859, @@ -17455,13 +17450,13 @@ static const unsigned short Ranks[197839] = 17248,43, 32168,13192,22515,15522,36516,4563, 2037, 8809, 4968, 19199,32898,22907,15581,24539,14260,4040, 1090, 36516,6211, 30209,39079,42178,33133,27018,20914, 22514,42177,3544, 24538,42177,39716,34612,35206,37152,16432,10224,42177,14835,36516,39715,33274,27017,39715,33125,2364, 12711,35741,38017,36515,35127,42177,32847, 13036,21009,23648,8080, 22285,14574,18209,36515,17815,14073,39263,7341, 4404, 28871,28457,16759,31934,37119,36926,4912, 26697,23583,28017,14991,33266,32813,28561, - 5522, 30226,3379, 6440, 29988,28917,20661,37951,18022,36212,18915,16025,37582,39205,25129,37356,3462, 12463,18642,18824,28519,36515,33334,20660,34521,3480, 9655, + 5522, 30226,3379, 6440, 29988,28917,20661,37951,18022,36212,18915,16025,37582,39205,25129,37356,3462, 12463,18642,18824,28519,36515,33334,20660,34521,3480, 9655, 36483,13302,42176,24537,42176,37923,37187,39715,27016,20659,17745,37922,42176,14440,11519,32771,1211, 38108,38158,27144,7996, 14835,23145,35839,34394,34453,29245, 35725,20159,29507,38862,34633,11292,15355,4667, 35853,30385,3177, 27872,19292,37922,4355, 7207, 32966,16970,35128,10458,39715,2487, 6814, 38697,33887,33723,42176, 39714,42175,11553,20980,42175,9321, 8204, 28161,19239,35417,21660,39714,36515,1869, 1099, 16476,3267, 25933,29398,5205, 39714,36514,5497, 21154,34876,16712,38782, - 38109,5694, 19238,22023,8320, 34903,29874,42175,3815, 36730,35417,20658,18959,20657,27536,37388,36974,20211,37193,32060,18021,19968,34411,11834,3975, 35891,111, - 2082, 32841,11444,20355,21271,14512,9492, 14518,26078,9176, 2912, 4832, 17701,630, 9099, 13301,11308,20656,34307,33152,13172,10000,28696,12861,5534, 13296,9811, - 37139,630, 32261,35713,18808,31714,35198,39714,8921, 19237,19236,24513,3183, 27015,12761,20219,38172,10192,37656,35968,33928,14467,17650,17247,39713,42175,2978, + 38109,5694, 19238,22023,8320, 34903,29874,42175,3815, 36730,35417,20658,18959,20657,27536,37388,36974,20211,37193,32060,18021,19968,34411,11834,3975, 35891,111, + 2082, 32841,11444,20355,21271,14512,9492, 14518,26078,9176, 2912, 4832, 17701,630, 9099, 13301,11308,20656,34307,33152,13172,10000,28696,12861,5534, 13296,9811, + 37139,630, 32261,35713,18808,31714,35198,39714,8921, 19237,19236,24513,3183, 27015,12761,20219,38172,10192,37656,35968,33928,14467,17650,17247,39713,42175,2978, 37922,385, 36810,34521,14834,42174,39713,3417, 42174,1686, 6340, 42174,27014,33770,7925, 39713,7490, 33770,4260, 39713,38245,16182,28685,35417,37922,33770,12269, 28518,20528,23403,14833,10010,35417,36799,10838,16510,15902,17048,6711, 32953,15227,31026,20655,34616,21487,34623,26753,34521,16444,24080,6523, 34322,15397,37921, 30208,991, 11800,8899, 11201,16113,3355, 2029, 3377, 20606,39712,11200,12865,37512,7127, 35071,26785,33640,10749,34520,37921,37921,23253,29261,7573, 7177, 36514, @@ -17474,25 +17469,25 @@ static const unsigned short Ranks[197839] = 20248,33806,37076,1114, 6383, 39099,4841, 34010,12101,22528,27396,29777,28862,7277, 20024,20305,30653,28151,16180,13299,38140,21534,32224,35820,17047,36043,30157, 14971,32213,27155,19233,27567,9614, 12100,38037,20649,13784,33860,12588,20091,26187,7296, 30168,31034,6278, 33813,25223,10353,6096, 2543, 37972,32923,33970,37418, 33280,7037, 4887, 13783,33757,13930,24532,14915,9015, 11199,38529,27034,32833,18811,19632,34519,11779,36513,2148, 1318, 33124,30098,32591,1370, 38007,30206,29830, - 38923,32430,37037,17046,1469, 14888,35463,36937,37920,27110,1471, 11123,37136,16010,3257, 26351,6418, 17385,11911,33065,33124,27011,38606,15461,35200,26803,2885, + 38923,32430,37037,17046,1469, 14888,35463,36937,37920,27110,1471, 11123,37136,16010,3257, 26351,6418, 17385,11911,33065,33124,27011,38606,15461,35200,26803,2885, 7893, 3040, 39711,2542, 18358,14650,17744,35906,23466,13494,3944, 39711,36513,9810, 9519, 28492,35327,27263,39711,33124,2743, 35626,20646,15930,11122,33124,37920, 7839, 30205,27010,34519,24564,33084,39711,38953,2686, 7570, 20648,13133,36702,9606, 10931,37154,23465,39123,11958,34075,3548, 39710,32058,36512,32057,7175, 37973, 35415,42171,42171,33123,36512,37919,5348, 39710,35503,42170,22803,39186,35415,39130,20913,42170,35301,29661,10748,9682, 20168,36512,39710,10791,11623,37919,35415, 18921,34519,32056,33123,39710,20209,42170,42170,28910,4955, 42169,15161,39709,42169,19446,33308,35280,33431,36389,38005,20912,42169,13782,8572, 23464,4591, 18848, - 13781,20647,38757,39709,39709,37017,42169,20367,39709,37919,38304,39708,14441,14306,10930,7812, 1341, 1651, 6451, 34250,12099,2280, 15460,5593, 2690, 10929,3671, + 13781,20647,38757,39709,39709,37017,42169,20367,39709,37919,38304,39708,14441,14306,10930,7812, 1341, 1651, 6451, 34250,12099,2280, 15460,5593, 2690, 10929,3671, 35984,34566,8604, 23272,24324,1620, 34518,36512,2910, 25774,29868,32833,38621,37919,35415,22656,4615, 3016, 5462, 9120, 6724, 5546, 33734,35473,42168,39708,38180, 8023, 16794,38815,15459,18018,38565,37557,1557, 8603, 12159,42168,42168,33085,3674, 11584,17379,33208,39708,35905,36511,33175,33104,23051,9970, 35371,37248,35702, 33769,34830,39708,24536,7572, 39707,28513,30100,37947,35239,4694, 24535,254, 36511,27009,36511,3623, 5626, 28512,36511,6150, 16179,17045,15250,21269,5676, 11795, - 38775,33044,21044,11420,12003,34141,10119,21275,10225,3205, 13293,3455, 17688,3621, 3768, 1709, 3612, 4800, 8909, 5978, 8897, 1856, 4238, 22157,2690, 13780,4514, + 38775,33044,21044,11420,12003,34141,10119,21275,10225,3205, 13293,3455, 17688,3621, 3768, 1709, 3612, 4800, 8909, 5978, 8897, 1856, 4238, 22157,2690, 13780,4514, 19232,4682, 25272,32499,5620, 24534,5835, 4963, 28403,20646,12461,33873,14639,37918,13298,16178,13779,10928,4590, 20557,22388,2266, 25248,1291, 3978, 11531,36002, - 14305,11569,963, 25386,508, 12202,10298,42168,33769,21508,37659,10258,35414,35414,2348, 17246,27008,39707,37918,9821, 34518,37741,2850, 38611,35517,1841, 3249, - 1883, 20858,2181, 42167,28511,15521,39707,38785,11087,38285,19961,38742,18431,15007,38409,38673,21771,8455, 31898,32017,30095,10696,13982,7818, 1881, 6177, 8003, + 14305,11569,963, 25386,508, 12202,10298,42168,33769,21508,37659,10258,35414,35414,2348, 17246,27008,39707,37918,9821, 34518,37741,2850, 38611,35517,1841, 3249, + 1883, 20858,2181, 42167,28511,15521,39707,38785,11087,38285,19961,38742,18431,15007,38409,38673,21771,8455, 31898,32017,30095,10696,13982,7818, 1881, 6177, 8003, 1281, 31503,14404,4881, 4094, 5121, 1455, 13297,1155, 5047, 9137, 3516, 1505, 1245, 8803, 13538,26675,17377,35405,36092,7736, 34324,6825, 20522,33063,15016,15360, - 3340, 10190,22807,34492,20208,15160,37918,33035,6395, 39707,34518,39706,39706,42167,18920,37320,42167,37379,42167,34136,670, 35414,37918,34114,16089,9958, 3997, + 3340, 10190,22807,34492,20208,15160,37918,33035,6395, 39707,34518,39706,39706,42167,18920,37320,42167,37379,42167,34136,670, 35414,37918,34114,16089,9958, 3997, 42166,18357,37917,1706, 39706,35414,30204,28510,37917,34970,33123,39706,39705,33123,35413,35849,31893,39302,36263,18919,29826,34518,871, 3438, 468, 36510,37776, 36510,11112,29950,37784,12377,7955, 35363,20508,30871,35881,13296,8386, 15496,931, 10656,651, 9424, 33936,22484,37998,17917,157, 36589,8385, 9244, 21164,32925, 22249,23968,19809,30319,38668,5644, 33318,14410,39304,38926,16177,38188,29355,42166,39705,17044,3343, 39705,35728,33122,6898, 31251,7326, 36778,1497, 37339,15458, - 33769,12098,35764,28509,34287,27961,25406,10908,5419, 11739,1730, 18851,9722, 10257,37917,32055,37436,13493,24533,32054,36510,21885,2766, 587, 19544,34517,3192, + 33769,12098,35764,28509,34287,27961,25406,10908,5419, 11739,1730, 18851,9722, 10257,37917,32055,37436,13493,24533,32054,36510,21885,2766, 587, 19544,34517,3192, 42166,38727,37917,14100,30826,15027,11517,33768,39705,19949,38086,42166,724, 36516,36156,1739, 39704,33768,27997,24532,42165,7344, 21902,37916,12595,42165,39704, 31788,2390, 6749, 33023,24643,35413,12863,773, 7882, 33892,7103, 34927,39704,33768,34649,28508,767, 39704,42165,36146,11738,29870,37916,37916,23463,23462,32053, 758, 15159,24531,6813, 36451,37916,38839,42165,18017,23435,21369,37259,42164,11465,16785,34476,14793,36504,33818,25405,3965, 22513,20207,10251,5056, 11407,28507, @@ -17500,14 +17495,14 @@ static const unsigned short Ranks[197839] = 21393,21695,37915,34517,32052,37677,36509,24227,32051,20206,37915,30203,10256,24530,34517,22512,35900,28506,15416,36718,2, 17043,33122,13210,6277, 25370,15776, 26125,35889,662, 33981,104, 10224,33687,11229,19231,11198,33122,13954,37915,30202,37392,5545, 6760, 4340, 3232, 8319, 7069, 10457,9613, 1803, 8900, 1814, 21246, 15526,652, 32050,787, 1624, 5229, 25694,28505,975, 11464,281, 19103,33710,605, 913, 21499,1376, 441, 37749,978, 1238, 14304,11961,14776,33118,32056,12985, - 35413,34516,11770,24529,11173,32801,33665,33644,32049,32048,42162,7074, 4885, 35586,9286, 6043, 20836,30192,10595,26693,4340, 18884,36345,13386,5178, 27275,6692, + 35413,34516,11770,24529,11173,32801,33665,33644,32049,32048,42162,7074, 4885, 35586,9286, 6043, 20836,30192,10595,26693,4340, 18884,36345,13386,5178, 27275,6692, 20645,33357,33954,34516,42162,39702,38129,39702,12860,33121,212, 13295,20644,31490,39070,36509,42162,13492,35413,36509,42162,37914,11978,39702,27006,32989,11977, 13209,35412,42161,34516,6170, 1586, 31658,35821,34279,37914,42161,39702,9400, 7498, 34043,29237,39701,37914,28504,38214,42161,9153, 17988,39701,25251,1944, 12200, 17743,2338, 20098,6169, 33121,19230,34565,35766,11302,26547,39391,4865, 42161,6149, 10921,18016,39701,39701,28503,33121,37914,26377,42160,39700,34816,34516,42160, 39700,27, 12199,20911,35412,8467, 34515,39032,33768,36508,39700,9152, 1360, 5949, 28502,42160,17042,38901,42160,33121,8650, 21342,12710,37212,22511,36508,36508, 985, 2230, 4686, 9097, 18015,19229,19228,900, 30428,12064,12733,37319,14439,25352,37913,39700,33767,42159,42159,35412,39699,9399, 39699,16784,42159,32047,33005, 33120,16783,15158,36508,35412,9096, 12709,37913,33767,39699,36507,39012,42159,9253, 42158,34020,26214,6381, 33242,28737,39699,9252, 24528,35411,28002,34515,30895, - 42158,37913,18234,42158,28501,36806,4204, 25693,17391,39698,1633, 19352,28864,29273,925, 42158,23461,789, 29982,10456,17742,1918, 31804,22176,32426,9222, 7452, + 42158,37913,18234,42158,28501,36806,4204, 25693,17391,39698,1633, 19352,28864,29273,925, 42158,23461,789, 29982,10456,17742,1918, 31804,22176,32426,9222, 7452, 39275,38528,42157,11769,42157,6453, 24404,34515,7696, 37768,32021,34579,19136,15120,21281,23460,38508,20550,14438,12097,34515,42157,39698,42157,1983, 24991,34375, 14250,34514,39698,33230,26565,38728,70, 17041,18858,20910,37913,38954,12460,35333,12459,17741,14375,9545, 24527,31074,37705,35341,37621,37669,56, 17132,14829, 26945,25556,19227,25713,2101, 17245,32980,34105,35411,39698,39697,6108, 15929,42156,37912,25692,42156,39697,4456, 20643,17040,24028,13084,12862,19226,42156,33120, @@ -17520,48 +17515,48 @@ static const unsigned short Ranks[197839] = 26552,16947,29517,36680,42153,36506,28498,36506,17585,37911,35652,34513,6094, 28209,789, 33812,2931, 19542,39695,5547, 39695,39037,20909,39694,10411,14437,17180, 27659,27799,42153,37911,37910,32646,36729,7019, 4143, 1227, 39251,42152,39694,3633, 42152,42152,37910,33765,30199,36800,12537,42152,271, 30063,12599,32909,24635, 33027,31904,39694,6272, 42151,39011,39694,34513,33765,33765,36465,37197,33178,22668,28564,42151,32044,17181,37030,35355,35260,38461,39693,38088,2765, 37212,19122, - 22573,761, 3137, 37910,4761, 42151,36506,36506,3322, 37910,1835, 15157,2251, 2839, 42151,34513,39693,11301,2526, 435, 15397,3075, 35956,37909,30198,13555,158, + 22573,761, 3137, 37910,4761, 42151,36506,36506,3322, 37910,1835, 15157,2251, 2839, 42151,34513,39693,11301,2526, 435, 15397,3075, 35956,37909,30198,13555,158, 30984,3123, 32918,32271,26028,30602,4426, 11300,42150,8913, 25690,12707,18918,14101,42150,37909,5635, 22026,10447,10914,343, 9458, 42150,38232,2545, 28671,39693, 10920,22514,37909,3715, 27003,42150,38602,36560,39693,30373,39692,42149,7325, 42149,18157,472, 12141,27753,31640,20204,33764,36505,7324, 16782,42149,28497,30197, 35409,30196,42149,11463,39692,20013,12457,17740,27875,11299,4801, 37909,2678, 10588,42148,6271, 34512,16640,28496,38088,16981,20750,14279,42148,33933,39692,13221, 7571, 42148,39374,38846,25689,37908,37908,39692,510, 33764,39691,35409,165, 10747,28495,36505,6270, 33764,10975,36822,37529,36505,17244,28494,37908,23457,34512, 37908,39691,36595,39691,36505,28966,17243,42148,42147,2319, 42147,39691,36500,39690,7565, 2059, 12402,9523, 19908,23077,10262,15445,37273,39293,1151, 756, 38679, - 12749,4880, 39690,38902,1064, 38698,25049,4619, 33764,34883,2397, 6422, 20388,9359, 303, 12340,5416, 19541,37060,38109,33119,11690,37907,34748,6438, 1093, 1801, + 12749,4880, 39690,38902,1064, 38698,25049,4619, 33764,34883,2397, 6422, 20388,9359, 303, 12340,5416, 19541,37060,38109,33119,11690,37907,34748,6438, 1093, 1801, 13267,20368,10588,10652,13923,13735,18764,15412,7669, 12624,5731, 20641,7396, 14303,39690,6095, 31190,14828,855, 39690,42147,8326, 21077,19144,32881,20618,20654, 7950, 35279,6884, 39689,10223,36801,11462,21244,16813,17639,6215, 15860,32953,36504,42147,42146,9423, 39689,37724,14242,33109,10139,33960,34201,12860,28202,20640, 36588,28861,28101,31176,34773,33200,21885,14827,35674,30195,37303,30765,33481,11197,42146,37907,34167,9157, 18644,36504,42146,37907,36437,32968,32089,9, 32792, 36080,1251, 33763,36827,16781,24087,34326,4784, 23456,255, 10974,33497,37441,38537,11461,11250,11768,33905,33529,37649,39689,42146,42145,42145,34376,25318,27385, 36504,35408,37907,27, 9422, 30779,29089,31937,25973,14856,476, 42145,15696,37906,12126,33963,27934,35885,2161, 837, 667, 32511,27002,27004,1139, 12396,18300, 13008,21524,19487,28344,8487, 24857,35028,17632,27472,657, 9809, 10703,20639,3115, 10017,3802, 26564,30586,29091,29440,12955,34178,8114, 39689,14498,5668, 34232, - 33894,2564, 3479, 16780,20203,42145,31787,4475, 4886, 36802,37906,32043,42144,3075, 34462,37906,25348,12154,16779,34512,28493,24525,28477,346, 9763, 19952,49, + 33894,2564, 3479, 16780,20203,42145,31787,4475, 4886, 36802,37906,32043,42144,3075, 34462,37906,25348,12154,16779,34512,28493,24525,28477,346, 9763, 19952,49, 13776,32226,30809,6441, 33071,2393, 6205, 25878,16652,15587,32816,33380,33119,11120,33763,17242,35606,39031,14678,37906,33119,12197,13203,23637,5210, 35408,15519, - 26240,19513,13717,15654,30954,21692,8742, 37905,23455,32042,1167, 29412,16830,18810,16775,2838, 30194,36504,1153, 17775,31768,13045,37462,42144,30970,37905,6661, - 3445, 42144,39688,42144,11942,37678,30849,34025,13294,6094, 470, 7811, 15455,18013,22077,26928,19224,36503,38875,18917,12096,25843,15454,17039,36793,36705,2913, + 26240,19513,13717,15654,30954,21692,8742, 37905,23455,32042,1167, 29412,16830,18810,16775,2838, 30194,36504,1153, 17775,31768,13045,37462,42144,30970,37905,6661, + 3445, 42144,39688,42144,11942,37678,30849,34025,13294,6094, 470, 7811, 15455,18013,22077,26928,19224,36503,38875,18917,12096,25843,15454,17039,36793,36705,2913, 2210, 11460,11196,16176,7206, 4928, 17038,14302,9421, 13181,7395, 16175,22688,22213,14301,19223,29592,20638,16174,18012,21688,15453,18011,6812, 2002, 16173,33989, 33433,34892,37656,37905,16778,42143,26886,21757,16172,15452,20637,9095, 31028,42143,337, 42143,36503,36451,12161,37905,30933,37904,32041,31629,37030,36783,34512, - 27001,19222,39688,11007,37904,27923,16468,27326,35528,39688,34758,299, 20196,28555,8773, 8750, 28923,11563,30696,35939,37203,4921, 362, 5134, 19221,18144,678, + 27001,19222,39688,11007,37904,27923,16468,27326,35528,39688,34758,299, 20196,28555,8773, 8750, 28923,11563,30696,35939,37203,4921, 362, 5134, 19221,18144,678, 6716, 6490, 4010, 7066, 12136,5288, 34236,2541, 11640,9119, 30193,38352,38578,39172,34247,870, 38261,34656,17277,21831,941, 30138,33961,20636,32180,14826,32861, 33248,4713, 1606, 710, 1666, 7675, 976, 14426,584, 1955, 14373,538, 4587, 7810, 2297, 3030, 14899,12518,20232,32772,42143,33082,27000,28492,803, 42142,38558, 29680,37281,21555,20635,35820,14581,37904,6639, 33102,42142,13778,34511,39688,9493, 32246,29371,1066, 13293,3698, 13734,24716,39687,15928,7205, 33763,22509,32443, - 36503,39687,9402, 17086,31635,22467,33635,42142,35408,26999,12196,12789,36503,21691,12195,33253,24536,42142,2507, 2545, 18010,33539,8060, 14981,39270,2172, 882, + 36503,39687,9402, 17086,31635,22467,33635,42142,35408,26999,12196,12789,36503,21691,12195,33253,24536,42142,2507, 2545, 18010,33539,8060, 14981,39270,2172, 882, 17037,5580, 1409, 9944, 3570, 1663, 33020,8454, 1164, 28725,32845,17036,11195,7889, 12217,38925,33405,28491,4760, 37904,16920,39342,4817, 33763,42141,8584, 34333, 39227,4806, 38177,39687,8106, 3229, 20865,35191,37148,7475, 6998, 5672, 33635,26701,33285,34458,28758,6723, 4992, 4237, 38492,7316, 28716,12659,10179,38086,37747, 20665,10666,2925, 24930,12046,1671, 4439, 14093,12916,1662, 7597, 31033,23637,38176,14825,36331,22361,28342,29181,42141,33823,21494,33426,36502,6386, 28394,32935, - 39687,15029,39686,4170, 18356,5449, 23, 20634,469, 39686,30192,1582, 10455,39250,25026,25688,3131, 3342, 1079, 13437,8608, 11298,28490,12695,39686,6918, 94, + 39687,15029,39686,4170, 18356,5449, 23, 20634,469, 39686,30192,1582, 10455,39250,25026,25688,3131, 3342, 1079, 13437,8608, 11298,28490,12695,39686,6918, 94, 29518,2715, 23617,25964,9523, 16726,28784,18138,11994,28549,13753,10878,26898,30752,21380,31409,32985,33814,2063, 15368,29008,16171,27688,38863,38253,32339,35408, 25687,42141,18270,33862,11831,34039,12652,25575,30378,10576,37903,39686,39685,34027,3499, 36082,34511,17241,37903,9612, 35647,35407,8059, 24977,14100,3282, 16370, 4926, 14644,32942,12232,37336,9363, 7908, 10009,9780, 31327,42141,5404, 7790, 34802,1235, 5092, 6421, 17035,9112, 19220,12127,22674,31159,18861,2927, 24685,10927, - 42140,37740,17171,33042,5266, 38882,42140,26473,3247, 36266,35407,37903,11119,42140,33482,4259, 37290,26533,28489,200, 1019, 39280,2788, 38514,10454,4513, 1086, + 42140,37740,17171,33042,5266, 38882,42140,26473,3247, 36266,35407,37903,11119,42140,33482,4259, 37290,26533,28489,200, 1019, 39280,2788, 38514,10454,4513, 1086, 13996,26307,6073, 10556,32989,34711,5634, 36295,2196, 14824,18709,14300,23826,6280, 33626,21023,35407,32040,39685,5588, 37903,25531,39685,39685,36502,3399, 38771, 35407,32827,14299,13360,33762,22217,37451,14792,18916,6560, 38411,3871, 34172,37902,8912, 42140,30191,18496,38581,37902,25686,30190,8318, 26998,1526, 22382,42139, - 38736,3028, 42139,35406,33762,39010,28292,42139,3472, 33762,14099,825, 20711,37902,39684,37902,34511,11517,4939, 38322,14298,14077,42139,34312,19610,29059,3341, + 38736,3028, 42139,35406,33762,39010,28292,42139,3472, 33762,14099,825, 20711,37902,39684,37902,34511,11517,4939, 38322,14298,14077,42139,34312,19610,29059,3341, 36502,39684,29045,29893,21824,18009,37901,2228, 39684,35124,24514,2605, 23198,32894,1608, 12181,2831, 8163, 2437, 11719,10765,11080,7606, 5891, 4009, 6138, 30189, 20482,481, 4519, 36100,1060, 3910, 1038, 7064, 6590, 7531, 3874, 27244,39221,3665, 36012,2158, 18008,7215, 34511,14297,28488,37901,36824,6288, 28067,42138,39291, - 26803,38669,20908,8011, 42138,16228,39684,39683,3584, 34224,4282, 29291,24687,21071,29995,17387,38275,16319,3660, 15858,20166,2589, 12526,34062,16170,39153,9715, + 26803,38669,20908,8011, 42138,16228,39684,39683,3584, 34224,4282, 29291,24687,21071,29995,17387,38275,16319,3660, 15858,20166,2589, 12526,34062,16170,39153,9715, 14484,17789,42138,1150, 233, 10572,370, 7602, 7538, 2571, 5716, 5044, 22461,14206,27218,34796,1940, 35406,18915,33608,33119,14296,37901,19330,34510,20907,10815, - 2044, 18836,1225, 3376, 26599,12692,27015,27941,37631,14483,25685,37901,36523,39683,11169,36004,42138,13491,35809,17603,33806,42137,37900,39683,32039,10279,9412, + 2044, 18836,1225, 3376, 26599,12692,27015,27941,37631,14483,25685,37901,36523,39683,11169,36004,42138,13491,35809,17603,33806,42137,37900,39683,32039,10279,9412, 37900,29969,9974, 39683,13781,297, 9377, 2044, 39682,37947,30188,42137,42137,42137,42136,17240,39682,42136,21539,10984,42136,25684,12958,26997,27762,7489, 20906, - 36824,9398, 34510,33118,15520,37060,11118,19728,32038,30187,7394, 33265,7695, 6521, 38960,11401,13964,7929, 35234,8634, 34180,32037,39682,8113, 18325,42136,1999, + 36824,9398, 34510,33118,15520,37060,11118,19728,32038,30187,7394, 33265,7695, 6521, 38960,11401,13964,7929, 35234,8634, 34180,32037,39682,8113, 18325,42136,1999, 36502,15927,42135,15156,18007,32925,38122,20638,15019,21191,18288,39407,23454,13563,9041, 32036,42135,42135,42135,31866,29390,37900,38806,35804,17193,38115,24984, 39084,16456,33921,9681, 37900,34061,34507,33118,9544, 33762,16354,3231, 28553,37165,18355,37899,2005, 32981,28487,929, 42134,35597,1500, 5375, 5544, 17423,10061, 5543, 24244,6736, 19219,38922,42134,33057,21118,38251,556, 37899,37899,42134,15926,34510,36509,20202,33118,36002,39682,16169,12957,33761,30186,24524,17739,26996, @@ -17570,7 +17565,7 @@ static const unsigned short Ranks[197839] = 114, 24523,17239,20905,34510,39681,16353,37775,7394, 35405,42133,4200, 36501,23480,38528,42133,36501,36501,39680,35404,18354,32836,785, 8602, 32270,376, 39680, 12194,7406, 33118,18353,36500,27347,27840,37829,32772,36500,33117,14436,34509,39680,20129,34925,13868,35404,5172, 30185,39680,8095, 21238,35807,25683,27548,37898, 39679,39679,42133,34509,35111,39679,39679,33117,723, 367, 14435,10100,3191, 37898,12193,20209,39367,146, 1796, 9391, 14469,16083,18649,6804, 35404,15935,16782, - 42133,38133,39678,30075,35465,18885,12696,14323,11872,18398,33196,31182,36871,37948,42132,34509,22508,30184,19540,37146,34509,37898,39678,42132,39678,20904,3004, + 42133,38133,39678,30075,35465,18885,12696,14323,11872,18398,33196,31182,36871,37948,42132,34509,22508,30184,19540,37146,34509,37898,39678,42132,39678,20904,3004, 28245,23370,8466, 15780,3663, 33761,33117,39678,12455,19836,36037,36500,8349, 25682,16703,42132,34480,20632,42132,34508,32035,36976,34684,18352,16436,26995,32034, 37520,23212,31014,30268,1467, 32219,36500,26634,38574,10802,30598,37897,34508,34508,37897,26994,35404,30183,3522, 37098,16776,7838, 38155,35132,30198,42131,32849, 25681,32033,39677,39677,34241,37897,10746,24565,23482,17238,28486,42131,17004,42131,36499,42131,42130,33760,2437, 35785,16775,34200,39677,36499,42130,26993,11975, @@ -17582,13 +17577,13 @@ static const unsigned short Ranks[197839] = 35054,29586,10255,36497,35403,36497,38848,36385,42128,3632, 17135,38355,1425, 42127,7924, 874, 20630,3224, 30645,38, 20693,38226,359, 28019,917, 30776,13292, 26992,28959,28485,42127,1712, 39675,284, 37989,42127,29307,36645,35304,35820,27102,31549,36497,2600, 33148,27475,36496,35420,26113,39675,33523,28484,1242, 33116, 35402,35078,31174,2696, 32030,6750, 23452,39675,5762, 42127,7510, 22923,33116,35402,37894,9688, 15925,37091,20903,28483,23451,39314,42126,25679,6378, 42126,37894, - 13489,15518,439, 42126,25129,24653,1886, 39674,6334, 37483,33783,16168,25678,34507,42126,16773,39674,33271,42125,35402,36934,42125,23384,10744,34338,429, 2740, + 13489,15518,439, 42126,25129,24653,1886, 39674,6334, 37483,33783,16168,25678,34507,42126,16773,39674,33271,42125,35402,36934,42125,23384,10744,34338,429, 2740, 4966, 28746,23495,16128,23481,23760,10851,18678,28460,34271,6210, 2204, 34507,25146,33759,37894,28372,42125,26467,37431,25677,30181,42125,1578, 33600,20063,20629, 1042, 2364, 20628,39253,6959, 4816, 1729, 13777,33758,15517,28482,39674,38340,38356,20627,34827,36496,19538,28047,19994,38013,4039, 6883, 34401,42124,85, 35402, 34922,39674,30974,31893,1300, 909, 28481,37894,42124,42124,42124,17893,5074, 35977,27531,29225,17434,9283, 21113,20058,33, 19218,10318,3767, 13776,16778,37842, - 5239, 15451,15980,16525,2718, 11063,33615,12820,7497, 11194,33116,6811, 13291,25949,3646, 4856, 14755,32850,33454,12709,11766,9646, 10008,17034,7496, 2531, 5987, + 5239, 15451,15980,16525,2718, 11063,33615,12820,7497, 11194,33116,6811, 13291,25949,3646, 4856, 14755,32850,33454,12709,11766,9646, 10008,17034,7496, 2531, 5987, 36468,17033,11459,14791,2170, 38442,17617,37277,34168,10521,7511, 28767,1592, 4361, 13289,27950,28520,31198,33361,37965,10756,35903,20626,37793,8136, 17032,34804, - 15450,8896, 18054,33510,39673,13775,38532,8895, 16167,2636, 32908,11516,19217,17031,19216,33719,741, 23551,10060,26715,7542, 12752,33086,38888,22507,4901, 4089, + 15450,8896, 18054,33510,39673,13775,38532,8895, 16167,2636, 32908,11516,19217,17031,19216,33719,741, 23551,10060,26715,7542, 12752,33086,38888,22507,4901, 4089, 25676,30813,26818,5369, 5939, 8771, 12836,14294,16893,6512, 35589,8553, 21690,20625,37479,36244,32913,19215,8317, 34664,32474,11875,35247,29778,23591,37452,34097, 38554,38160,8024, 12341,13774,2027, 9499, 5986, 6382, 3395, 18006,33891,29990,13773,39232,5288, 39334,29850,31775,38467,5785, 34805,22997,9251, 4589, 15511,34010, 36376,9265, 465, 27108,5204, 8058, 5029, 11458,11766,31398,33390,18265,12177,39181,7770, 1731, 38084,37706,21540,35128,878, 30925,17063,14790,19214,7650, 16797, @@ -17597,35 +17592,35 @@ static const unsigned short Ranks[197839] = 36496,8911, 15448,18005,37893,3921, 16163,42122,35568,33034,35163,3686, 10639,7018, 19210,18004,20624,11456,3536, 20271,10298,20623,14822,16162,17030,14626,12422, 42122,14293,8186, 10681,14821,35401,6593, 18003,34016,38996,35808,20622,10007,21661,10222,37137,23603,33365,20415,4656, 39079,17029,15447,19209,37849,37891,29468, 37589,21689,19537,22386,11600,25193,12095,29165,34507,30736,20670,14336,33503,33719,23395,19262,31289,6184, 14057,34685,33821,4943, 35803,5283, 2426, 6148, 14298, - 35033,13290,18002,37061,33115,13208,39673,39673,29961,9420, 42122,2849, 16559,23850,7477, 6269, 16127,7671, 12234,14112,34809,27226,39672,42122,37893,33639,6276, + 35033,13290,18002,37061,33115,13208,39673,39673,29961,9420, 42122,2849, 16559,23850,7477, 6269, 16127,7671, 12234,14112,34809,27226,39672,42122,37893,33639,6276, 10680,30708,15923,39146,5417, 6810, 5070, 10473,1065, 24018,22344,4815, 17176,4693, 39672,30950,30180,42121,18351,2136, 19208,34506,14292,14100,32412,20621,36495, - 37863,23242,12858,16161,16160,32423,36376,9249, 37441,23322,35863,33819,4962, 13289,15684,5834, 6093, 3796, 2826, 13288,30331,4927, 20620,18712,34401,17028,6658, + 37863,23242,12858,16161,16160,32423,36376,9249, 37441,23322,35863,33819,4962, 13289,15684,5834, 6093, 3796, 2826, 13288,30331,4927, 20620,18712,34401,17028,6658, 37696,8894, 33683,22998,5563, 5076, 36945,2275, 6496, 7222, 7846, 14651,20409,7636, 19207,20619,34582,10142,37561,42121,34753,31951,34506,6007, 34415,10006,18001, - 7928, 22506,37409,16159,27839,14291,15446,17027,12857,11455,12459,2042, 19206,39172,42121,37573,11499,16158,11808,16296,17026,13054,5996, 20261,10403,11765,4236, + 7928, 22506,37409,16159,27839,14291,15446,17027,12857,11455,12459,2042, 19206,39172,42121,37573,11499,16158,11808,16296,17026,13054,5996, 20261,10403,11765,4236, 19205,13313,1291, 32215,14437,13244,11263,17025,6896, 11454,6728, 20161,22950,36778,2334, 35966,33115,8893, 13771,3459, 3524, 8792, 14290,28909,31847,28912,33845, 7601, 34126,36406,13287,22505,10926,42121,32028,17235,13164,37306,39404,8686, 30179,32888,36359,35894,42120,20201,39672,19891,36178,34761,37893,8453, 16157,36104, - 33779,28588,14568,33971,37817,14820,39672,25675,694, 3406, 37329,360, 21333,28778,12955,105, 29158,7488, 34635,42120,2743, 4028, 4800, 4926, 7158, 192, 6353, + 33779,28588,14568,33971,37817,14820,39672,25675,694, 3406, 37329,360, 21333,28778,12955,105, 29158,7488, 34635,42120,2743, 4028, 4800, 4926, 7158, 192, 6353, 24352,21688,10743,547, 1096, 1716, 1815, 25674,33758,5416, 1939, 13900,13959,13793,39671,34506,19204,6107, 37892,20200,5246, 9611, 20618,35915,26416,29264,37720, 37396,38586,42120,32027,22853,33513,20269,34606,14036,7487, 42120,35081,18615,1272, 38083,7047, 26193,37524,14297,6761, 13276,5363, 12448,37288,29384,14141,25645, 35522,18829,17090,25004,6623, 36495,42119,16147,19536,38656,29702,37140,42119,34997,36360,2530, 28806,32052,14819,19016,31288,35401,15922,42119,25673,14788,24521, 20617,12458,6168, 14434,33889,6037, 34724,33721,6657, 42119,37892,36529,42118,42118,21687,38242,42118,14356,24027,38510,21074,33115,30178,28170,3710, 2655, 36495, 42118,36495,3340, 28479,33758,33758,13587,27520,11117,37892,37892,37891,36494,8316, 32790,38095,4838, 30722,39671,33211,7919, 11481,14612,29425,3661, 24409,31229, 3529, 2416, 12920,20634,6809, 5215, 24547,13161,17300,19538,29821,21132,38795,15036,22222,24416,13172,27287,8377, 16641,4969, 15611,32067,4780, 23107,15782,28530, - 1835, 28276,1602, 17024,37913,42117,37862,34506,27889,36880,42117,36942,36494,38836,39671,31520,22504,39671,42117,33757,36435,35401,31210,26314,9970, 301, 9848, - 26902,17051,36984,4926, 10587,5466, 36911,38977,42117,42116,37891,35401,33757,592, 9166, 42116,33115,18913,10221,32924,42116,17023,3004, 8601, 22503,36494,922, + 1835, 28276,1602, 17024,37913,42117,37862,34506,27889,36880,42117,36942,36494,38836,39671,31520,22504,39671,42117,33757,36435,35401,31210,26314,9970, 301, 9848, + 26902,17051,36984,4926, 10587,5466, 36911,38977,42117,42116,37891,35401,33757,592, 9166, 42116,33115,18913,10221,32924,42116,17023,3004, 8601, 22503,36494,922, 42116,31276,25171,36494,561, 34922,33757,17737,36493,39670,38074,42115,42115,33114,42115,34505,39670,22601,26990,15445,37891,723, 13766,10747,18646,16143,38928, 37540,20616,12457,20155,11885,34031,20615,36021,39670,7600, 25672,5378, 34505,42115,33114,36792,28478,35400,37891,1048, 1530, 7819, 4512, 5308, 786, 8289, 37890, 1769, 35400,2133, 16754,30163,254, 2281, 27196,11206,6293, 8600, 17736,28477,37680,12456,42114,1853, 37890,11214,12586,4634, 34612,33757,37688,1733, 4671, 39670, - 33819,36493,19064,42114,27542,3697, 31598,37890,30177,3458, 31284,39669,38306,36493,18980,39669,37890,42114,25440,39669,42114,7809, 26989,34505,33335,42113,9419, + 33819,36493,19064,42114,27542,3697, 31598,37890,30177,3458, 31284,39669,38306,36493,18980,39669,37890,42114,25440,39669,42114,7809, 26989,34505,33335,42113,9419, 5108, 42113,37889,3753, 34190,32973,33599,7295, 18000,4310, 33726,6446, 17165,42113,32026,10586,18386,34861,36493,32025,1131, 42113,33598,383, 34505,15921,23450, - 35400,39669,33756,34504,17999,9616, 37167,35400,34046,36512,30863,20902,42112,35399,21285,36492,26988,37445,24728,8599, 2707, 27012,15154,4392, 5542, 33620,9030, + 35400,39669,33756,34504,17999,9616, 37167,35400,34046,36512,30863,20902,42112,35399,21285,36492,26988,37445,24728,8599, 2707, 27012,15154,4392, 5542, 33620,9030, 37889,20948,14818,36913,34017,9969, 36383,32379,23904,33621,34626,16772,14817,38693,27010,33756,34504,33756,17735,5859, 42112,16352,14787,26987,39668,42112,19535, 1023, 26986,18912,34504,14268,14067,4255, 16082,35349,21547,39668,288, 3981, 26374,13106,39668,4562, 21855,7837, 33114,35399,4732, 37351,15444,2175, 12963,30176, 30617,5730, 33756,20901,13286,39668,36492,37889,28476,33755,42112,39667,36492,36242,42111,42111,37889,19203,9664, 22538,33755,36492,39667,37888,16126,38866,34400, 35758,42111,9680, 14804,33755,37888,32024,37888,38538,34765,34504,35583,770, 39667,34142,580, 10196,33799,28323,14433,10220,38357,39667,42111,14098,39666,33755, - 510, 14131,2255, 13770,1605, 5729, 24414,11434,6452, 5541, 25671,3854, 25892,28699,1270, 19212,2616, 2705, 22163,19202,17022,1753, 1226, 17816,29822,4376, 1247, + 510, 14131,2255, 13770,1605, 5729, 24414,11434,6452, 5541, 25671,3854, 25892,28699,1270, 19212,2616, 2705, 22163,19202,17022,1753, 1226, 17816,29822,4376, 1247, 1700, 34503,8452, 38309,1401, 36414,39666,4963, 8338, 18990,2875, 22670,14729,33153,6470, 17751,24520,36491,21954,8561, 29198,7747, 38554,20199,12455,3888, 14475, - 35268,5748, 42110,33754,2977, 37995,25006,36253,33754,29014,22502,24189,30175,36296,11769,23425,6583, 370, 27917,3702, 15762,42110,37175,39360,1052, 16324,1216, + 35268,5748, 42110,33754,2977, 37995,25006,36253,33754,29014,22502,24189,30175,36296,11769,23425,6583, 370, 27917,3702, 15762,42110,37175,39360,1052, 16324,1216, 24307,27873,7896, 5858, 1218, 37888,42110,994, 5844, 21726,39666,11297,33401,35625,24065,23009,39341,37580,33116,32887,37372,36100,13488,34503,39226,39144,36491, 38937,18018,8822, 36491,19479,39666,33349,29875,17998,33834,36049,35399,30618,32994,36037,19201,21259,34503,32023,34390,37887,39665,37774,20614,18027,32890,33355, 10925,22437,6172, 7586, 34402,10210,37259,36182,16871,39665,42110,34503,7285, 39665,12954,42109,37887,36491,2895, 36490,12118,20265,37887,28475,25543,9679, 19534, @@ -17634,7 +17629,7 @@ static const unsigned short Ranks[197839] = 13359,39664,42109,37886,39664,32285,37886,36490,20900,11737,14959,34502,37023,17109,28335,6437, 22684,10775,39017,42109,32022,34502,42109,42108,22501,28473,37624, 13059,23825,33915,33459,37885,34667,31500,39664,36489,37885,22326,26059,35398,42108,33202,18765,34441,31680,36994,34654,26330,13277,25700,30502,4015, 38824,33113, 33754,36489,16156,2896, 1771, 29865,28191,24657,14197,39059,10742,12453,26985,20613,16322,20612,21948,19450,143, 25762,11116,37885,39664,35398,33058,10901,37885, - 23449,34789,36489,32021,10194,5816, 37884,39663,42108,37884,3074, 14097,36489,28472,35397,33753,34108,4970, 39663,9397, 36488,5945, 4356, 39663,14536,38816,8858, + 23449,34789,36489,32021,10194,5816, 37884,39663,42108,37884,3074, 14097,36489,28472,35397,33753,34108,4970, 39663,9397, 36488,5945, 4356, 39663,14536,38816,8858, 30176,13880,14048,3244, 34501,19845,8808, 36488,19533,42108,15920,34501,5378, 5492, 23448,20611,14096,42107,33945,37884,39663,12093,15443,23550,32869,38788,35613, 35229,19200,17574,3647, 37884,39662,13044,37883,17997,15442,31330,37577,39662,21686,42107,42107,2588, 38352,30174,27907,42107,34501,33113,356, 33753,974, 32411, 7717, 37, 8984, 2114, 2189, 30173,3709, 30172,27829,36604,21964,17450,17187,25923,13769,9418, 35397,12856,11043,30171,38636,7436, 38168,8736, 17234,15593,35397, @@ -17647,14 +17642,14 @@ static const unsigned short Ranks[197839] = 29388,6060, 42104,1626, 17275,32019,33112,3354, 34173,6036, 11764,33179,26501,33752,14287,37198,38833,35625,35396,42104,24256,25569,28544,33538,42104,33496,34825, 30753,14240,42104,39660,39659,6167, 27680,39659,42103,28467,12855,18910,37882,13780,10924,22504,34557,31659,26984,11816,2940, 39659,37881,25459,18909,18863,28022, 34501,39659,38231,13235,38895,36446,39658,36299,42103,7197, 33308,10525,15918,42103,35895,24517,42103,7036, 36487,39658,914, 10005,36546,36472,18908,32018,39658, - 19199,35680,15153,32702,33752,42102,5607, 402, 4354, 32627,26282,19481,33870,9378, 35378,199, 2650, 16044,21617,25166,30438,26717,28659,30134,626, 22159,8741, + 19199,35680,15153,32702,33752,42102,5607, 402, 4354, 32627,26282,19481,33870,9378, 35378,199, 2650, 16044,21617,25166,30438,26717,28659,30134,626, 22159,8741, 184, 8387, 20002,39170,8892, 39658,33112,24269,34511,3230, 33112,42102,12009,26450,12706,35436,35396,42102,7927, 1020, 21017,22257,33752,10219,2018, 7808, 25642, 42102,33906,39657,42101,17996,39657,34500,42101,739, 23359,24473,38892,42101,17913,12572,1764, 36486,34500,19532,37881,20767,39657,14786,20419,28086,4286, 25559, 9396, 32017,24516,42101,2130, 29968,30916,7156, 10174,25670,12452,23901,18350,34500,37881,36486,35396,34730,4062, 42100,34500,25669,39657,5785, 42100,37346,32016, - 25748,42100,42100,42099,37055,12854,37881,33752,36486,33223,32015,17604,14432,33112,29652,24410,36486,9059, 19198,15440,42099,3814, 35421,37619,33111,23445,9543, + 25748,42100,42100,42099,37055,12854,37881,33752,36486,33223,32015,17604,14432,33112,29652,24410,36486,9059, 19198,15440,42099,3814, 35421,37619,33111,23445,9543, 642, 10049,31433,6926, 19998,36726,11797,13086,19197,10876,20606,20605,6441, 38368,34290,31671,14650,857, 13768,2124, 33565,35395,24393,13285,39656,9698, 32938, 17021,42099,37880,42099,21082,35135,36368,25849,34308,37880,39333,4580, 28466,10919,28302,7779, 4435, 42098,39656,13487,39656,29164,42098,30420,9034, 15712,42098, - 11515,20198,2375, 39656,23581,35395,34546,28477,6958, 32856,42098,12054,30167,37880,35395,4768, 18451,39081,38800,20683,9199, 11514,1810, 5004, 21231,5155, 5226, + 11515,20198,2375, 39656,23581,35395,34546,28477,6958, 32856,42098,12054,30167,37880,35395,4768, 18451,39081,38800,20683,9199, 11514,1810, 5004, 21231,5155, 5226, 32757,14527,24411,13640,14324,34428,31562,16343,5034, 23561,14814,19196,30376,35588,7746, 2386, 17754,28465,8968, 4208, 35906,16137,10451,2648, 422, 10740,39655, 29394,34499,1491, 37566,22100,19188,21029,14414,23444,23774,28464,31299,5375, 31486,5775, 12853,5140, 9647, 35396,39655,20759,22232,32014,11763,35969,28246,37384, 12852,13147,1869, 14688,14240,21521,32851,6378, 29251,6757, 4598, 21066,5693, 32898,14813,3498, 15439,31376,37030,32891,33223,4742, 9417, 38384,4195, 5866, 38549, @@ -17662,10 +17657,10 @@ static const unsigned short Ranks[197839] = 15438,23187,29671,34389,20604,21317,20603,30638,42097,14785,17019,28792,21168,35559,5107, 6221, 9122, 28973,39163,38400,35502,35282,34150,37542,21017,32401,36485, 30739,42097,32615,34837,15437,12032,32928,37470,17424,42097,34499,20989,33941,37880,33751,42097,36485,19197,33717,38234,37879,39655,39654,9940, 8014, 20197,20230, 10218,10678,19195,36809,16351,10276,28327,36873,36485,39654,39654,13207,37879,36078,36420,39654,24515,36485,17734,9093, 3827, 42096,1271, 9248, 20602,14286,20840, - 4546, 37879,35395,39257,28463,5815, 32837,3166, 16771,39653,20196,35770,18907,33904,35917,1716, 14196,4783, 9395, 4925, 35930,9266, 28204,9092, 16350,35445,4474, + 4546, 37879,35395,39257,28463,5815, 32837,3166, 16771,39653,20196,35770,18907,33904,35917,1716, 14196,4783, 9395, 4925, 35930,9266, 28204,9092, 16350,35445,4474, 437, 24514,33524,22697,35394,36484,17018,21345,33559,25668,37461,24836,42096,30166,15231,1352, 42096,20559,36583,10677,36950,18604,36161,35394,39653,14227,42096, - 9812, 28462,19531,42095,42095,631, 4576, 15617,32913,10099,16770,37879,755, 16332,3732, 19194,10733,4692, 8808, 27108,12951,33402,37878,21653,38734,38772,9840, - 38885,36518,42095,33111,202, 11762,19619,27643,5814, 2324, 45, 27287,8187, 17773,20601,24670,8560, 10585,15515,38701,28375,11296,42095,4837, 7659, 1434, 7017, + 9812, 28462,19531,42095,42095,631, 4576, 15617,32913,10099,16770,37879,755, 16332,3732, 19194,10733,4692, 8808, 27108,12951,33402,37878,21653,38734,38772,9840, + 38885,36518,42095,33111,202, 11762,19619,27643,5814, 2324, 45, 27287,8187, 17773,20601,24670,8560, 10585,15515,38701,28375,11296,42095,4837, 7659, 1434, 7017, 2976, 20600,12950,10047,21260,6339, 42094,5986, 277, 18009,29915,17648,35624,4294, 30607,36358,5879, 19586,34499,36484,16155,38562,28981,26983,22102,30165,39653, 30164,27866,16154,26012,602, 10730,12247,1687, 10495,16349,34499,16769,22721,4360, 17995,13767,37705,30163,19530,6601, 39653,15152,39652,42094,33751,36484,13206, 33111,34853,6690, 17233,5813, 10218,24513,11115,42094,36513,29842,1788, 38227,34498,26982,42094,21476,11974,39652,9475, 39652,15151,36115,11172,9406, 4645, 21879, @@ -17676,16 +17671,16 @@ static const unsigned short Ranks[197839] = 35512,35639,36126,35394,39651,3198, 34696,23424,22312,13821,23777,11200,2691, 36802,2441, 38324,34498,1942, 4866, 2141, 1712, 37023,1063, 5773, 2598, 2048, 32058, 38061,12404,16660,33243,16316,3779, 3319, 733, 35574,711, 9247, 17474,33007,4651, 11030,38093,9808, 1111, 2951, 7035, 12705,42090,37878,5077, 7312, 32957,36742, 4854, 12614,16146,10847,36556,7827, 34114,7923, 2317, 42090,39650,982, 25710,4654, 9598, 1822, 1612, 4380, 4275, 33518,28360,2421, 29525,555, 29584,163, 32476, - 9495, 19010,4312, 24512,25672,20273,19414,16150,42089,18539,30746,37407,14083,36345,35406,36483,38004,39358,11114,39650,22194,38245,25667,25666,6451, 11453,4473, + 9495, 19010,4312, 24512,25672,20273,19414,16150,42089,18539,30746,37407,14083,36345,35406,36483,38004,39358,11114,39650,22194,38245,25667,25666,6451, 11453,4473, 42089,39650,34429,27448,42089,39650,18654,37139,27251,1043, 30207,9968, 42089,42088,14784,19529,32012,36483,18905,15340,4518, 4836, 24511,30160,39649,34269,15514, 10584,42088,35393,8347, 42088,10918,4835, 18904,32011,36483,32010,21682,20511,30159,39649,23442,5112, 26149,17862,42088,42087,39649,37877,15156,37877,42087,15504, 13893,22265,34677,36368,28460,19108,9149, 42087,25665,23210,14847,34498,33110,33751,37877,42087,17732,30158,39649,39648,15916,39648,42086,37079,7836, 6415, 29049, 30905,37877,9695, 24510,36428,622, 36482,39648,30157,37876,25664,17231,37876,36482,33109,37876,61, 10127,5059, 22458,14163,27674,7621, 1463, 2125, 30656,26089, - 13236,16767,33079,21181,31510,31504,32352,17840,24344,9342, 21625,17017,39202,2167, 5291, 9807, 14285,13605,33109,35816,32610,34497,36482,15915,34497,39648,1171, + 13236,16767,33079,21181,31510,31504,32352,17840,24344,9342, 21625,17017,39202,2167, 5291, 9807, 14285,13605,33109,35816,32610,34497,36482,15915,34497,39648,1171, 26506,21970,38818,25933,6976, 10397,767, 1478, 1799, 13056,36088,33750,35116,37469,8547, 10030,33227,42086,22500,21745,32878,1591, 33109,6959, 9390, 37876,34059, 17994,37875,1524, 33750,25663,16502,525, 9646, 2779, 8315, 7204, 26964,5023, 20701,33636,15436,24497,34497,20897,6356, 12896,2521, 3781, 28572,33109,6290, 31434, 28368,13622,34497,26687,531, 6957, 12773,26889,25842,8177, 24239,30084,23875,9441, 221, 15773,17348,37875,3025, 26283,8782, 19016,20737,1014, 2037, 2, 26191, - 11089,16483,5619, 189, 16719,6815, 3895, 598, 11300,14744,2988, 21171,26861,16800,8787, 10687,12402,11921,10942,12433,18045,30595,5165, 5759, 33069,30829,2324, + 11089,16483,5619, 189, 16719,6815, 3895, 598, 11300,14744,2988, 21171,26861,16800,8787, 10687,12402,11921,10942,12433,18045,30595,5165, 5759, 33069,30829,2324, 24579,1935, 32523,18702,31513,33916,404, 3842, 15119,39647,18153,6656, 19192,15209,13766,30156,39647,15914,36361,15264,36364,35943,42086,19008,36719,37875,17993, 10217,28084,37308,37875,36629,31042,3498, 34496,4993, 39052,35103,23787,22660,24159,6559, 34366,39647,35393,20193,10500,8314, 8685, 34496,10922,6147, 17992,36482, 36481,36586,8495, 27620,8770, 3478, 42086,36481,24686,3570, 28759,36481,32009,377, 24995,32008,17571,14737,26859,16348,42085,24509,24134,33750,36892,26249,34496, @@ -17693,11 +17688,11 @@ static const unsigned short Ranks[197839] = 37969,801, 33750,34496,518, 33146,36943,42085,38890,11736,2542, 37153,35726,5832, 35996,33594,17016,4757, 21456,28697,5680, 36863,33959,42084,2931, 18349,34579, 38747,3039, 21681,32007,1733, 21368,26980,22187,27943,35317,33597,17067,25800,1126, 11761,5163, 8062, 33290,39332,9414, 18165,13566,34886,10338,34311,6956, 17990, 29837,13284,25829,7007, 39021,17974,19191,4352, 38541,5122, 6565, 30859,18519,1975, 790, 10450,1389, 39647,42084,14721,8559, 15149,33500,37428,3398, 5887, 36170, - 9781, 27593,37874,18348,17731,24508,33749,37299,10396,31745,12450,36481,7570, 10639,37874,35393,37874,19190,42084,10583,37464,18903,35021,15256,39646,23934,2764, + 9781, 27593,37874,18348,17731,24508,33749,37299,10396,31745,12450,36481,7570, 10639,37874,35393,37874,19190,42084,10583,37464,18903,35021,15256,39646,23934,2764, 37276,4484, 10649,10839,14770,23166,39646,42084,3520, 18768,558, 483, 39646,5053, 2, 30803,13509,25186,10818,37798,42, 20343,1579, 10087,19353,33067,28989, 13470,13953,11053,31570,12192,34495,6128, 33733,22378,39064,34175,20377,42083,2018, 1256, 11052,5417, 10280,575, 25434,42083,36480,30992,7887, 34648,2220, 10669, 6881, 12851,19189,5372, 3265, 5343, 34495,39646,23366,26685,38957,5886, 14811,7392, 5441, 17431,38812,34495,37874,24507,14198,9837, 39645,11099,257, 10917,33266, - 9037, 20599,16767,1861, 42083,9074, 1860, 10058,19246,2474, 8552, 83, 33108,441, 26850,1047, 15435,16347,17989,26627,4545, 348, 31296,36480,39318,39645,363, + 9037, 20599,16767,1861, 42083,9074, 1860, 10058,19246,2474, 8552, 83, 33108,441, 26850,1047, 15435,16347,17989,26627,4545, 348, 31296,36480,39318,39645,363, 16966,19188,42083,42082,37873,21295,42082,39076,18902,37510,32006,42082,42082,29751,26979,8465, 42081,36480,42081,39645,36480,13, 20617,32608,11023,33026,27089, 12261,10328,14622,28677,95, 10039,20141,17895,42081,42081,42080,12321,21680,37873,25479,2848, 22499,28698,2268, 404, 2704, 17230,12949,42080,39645,4010, 33749, 6095, 1115, 15544,133, 33040,15512,36544,24596,5228, 28889,35393,13989,3408, 32917,4145, 8910, 33108,37873,23494,36479,42080,3436, 21679,12948,34495,2431, 42080, @@ -17707,12 +17702,12 @@ static const unsigned short Ranks[197839] = 39235,17590,37944,17376,35099,34494,14782,12449,37872,36341,24506,6381, 26728,28077,18375,22246,37872,24375,33748,39643,9806, 8909, 34063,23441,30154,18900,24505, 36728,36479,18899,39643,16766,8908, 42078,39643,36478,4108, 38587,16150,15314,19186,10921,17988,5592, 16783,20597,24504,10409,2072, 373, 35227,26977,13282,36729, 37906,42077,9033, 33747,42077,2768, 3795, 30721,10449,5417, 26976,36478,33107,39643,18347,24675,37872,24503,14431,7034, 1003, 37978,33067,6947, 16723,14430,21325, - 2883, 3818, 35391,42077,157, 33747,39642,6689, 4759, 12092,37863,42077,17220,32145,12502,12091,3974, 2355, 38857,34953,35391,42076,37872,11513,32002,35391,1049, - 8357, 37871,2505, 39642,25340,39177,39642,38729,39642,28458,36478,19528,33641,13765,19059,8109, 5180, 23765,21264,29800,34291,24613,36041,24098,30754,5065, 9061, - 24632,29789,9748, 37893,7311, 32488,3412, 16336,36922,35504,3664, 4760, 852, 4981, 21295,32487,35015,30229,2852, 7126, 33601,17472,9310, 17987,35739,36076,8246, - 13480,10799,2934, 19129,42076,12456,26975,256, 4180, 10289,32798,1845, 29023,17791,4796, 1347, 20896,39012,26446,42076,35390,38213,19527,36372,17728,33747,1236, + 2883, 3818, 35391,42077,157, 33747,39642,6689, 4759, 12092,37863,42077,17220,32145,12502,12091,3974, 2355, 38857,34953,35391,42076,37872,11513,32002,35391,1049, + 8357, 37871,2505, 39642,25340,39177,39642,38729,39642,28458,36478,19528,33641,13765,19059,8109, 5180, 23765,21264,29800,34291,24613,36041,24098,30754,5065, 9061, + 24632,29789,9748, 37893,7311, 32488,3412, 16336,36922,35504,3664, 4760, 852, 4981, 21295,32487,35015,30229,2852, 7126, 33601,17472,9310, 17987,35739,36076,8246, + 13480,10799,2934, 19129,42076,12456,26975,256, 4180, 10289,32798,1845, 29023,17791,4796, 1347, 20896,39012,26446,42076,35390,38213,19527,36372,17728,33747,1236, 4799, 2109, 39641,37871,4304, 4137, 20596,20595,28457,21900,25661,36478,33107,30951,7735, 108, 5199, 24737,19519,33050,17997,1315, 17489,17824,7807, 884, 25660, - 7745, 37871,32001,221, 6068, 38521,2017, 2310, 736, 1158, 36454,612, 9811, 5064, 26974,3073, 5491, 10920,4144, 16346,232, 7173, 14359,22603,42076,5245, 5638, + 7745, 37871,32001,221, 6068, 38521,2017, 2310, 736, 1158, 36454,612, 9811, 5064, 26974,3073, 5491, 10920,4144, 16346,232, 7173, 14359,22603,42076,5245, 5638, 14758,4825, 2063, 34494,7922, 11973,35390,8326, 36477,26973,37871,38986,6394, 12704,6688, 8232, 4509, 1066, 13356,32237,18898,35390,30153,39641,7926, 19185,32000, 42075,42075,42075,38888,36477,39641,17727,36477,19526,42075,35390,33747,37870,37406,33353,34494,39641,28456,36354,39640,24502,42074,16345,688, 36477,17015,33107, 39640,3741, 19184,4425, 20594,12849,27154,39640,12453,36476,35389,17014,23440,12703,10254,35389,8346, 33746,37870,18542,37870,11760,36710,37870,12347,36278,20593, @@ -17721,7 +17716,7 @@ static const unsigned short Ranks[197839] = 21991,27533,35389,33746,39639,16765,15434,36700,32445,31509,29456,34493,42074,5185, 36475,22498,36475,15148,39639,24817,170, 10692,15910,36475,36475,35388,10528, 14095,21678,36474,4083, 36474,36474,22305,36268,36474,42073,2345, 2798, 42073,6450, 15926,28455,36473,8312, 19952,2677, 17097,631, 8890, 13189,6380, 17985,31325, 3231, 4458, 8185, 3795, 10216,35388,39638,15433,35482,4633, 5078, 8575, 20592,8451, 3155, 12452,22530,3072, 6216, 24208,37869,15432,13281,4890, 6209, 42073,12451, - 9394, 13485,28801,39011,42073,14781,39638,20591,13280,34493,19525,869, 16243,28511,36473,17726,42072,33106,39638,24500,42072,1407, 25331,33095,36789,12400,832, + 9394, 13485,28801,39011,42073,14781,39638,20591,13280,34493,19525,869, 16243,28511,36473,17726,42072,33106,39638,24500,42072,1407, 25331,33095,36789,12400,832, 7528, 39638,42072,9542, 5728, 1440, 37240,36473,101, 18691,22479,29543,24518,14760,39637,20590,35388,6895, 19983,25624,13484,5667, 36473,42072,26972,35388,22497, 42071,38269,14780,3708, 36472,23439,8231, 33106,37869,39637,19182,16764,39637,33746,37869,13764,34116,33106,8558, 36826,37003,25659,30152,38886,26971,15339,34489, 37868,36422,10215,42071,25658,42071,28106,10021,20142,34493,35387,29962,10582,37072,16521,34448,39637,37332,4895, 17725,35387,11735,26970,35387,11759,24841,37919, @@ -17733,35 +17728,35 @@ static const unsigned short Ranks[197839] = 30144,13205,4438, 2194, 33744,7203, 39635,8788, 23909,25472,34491,39635,39635,24497,31998,33105,42068,2430, 39634,37867,25914,11451,1021, 15869,29504,34446,37162, 36322,34939,5692, 35591,29305,8057, 29743,13482,42068,30212,7630, 13481,38953,3996, 33013,42067,8184, 11734,35387,2777, 11758,23438,33744,39634,4511, 39634,27240, 33156,1537, 6558, 35386,37195,36471,9736, 13728,34491,31997,34459,10527,37535,28454,37867,17983,20322,728, 19524,7202, 10682,20589,8169, 5414, 37964,36269,35726, - 20588,34491,18897,25772,8762, 3159, 38313,37866,34951,20587,42067,25163,524, 4333, 33003,27201,1533, 14082,42067,20586,42067,20189,28015,25474,7125, 16195,7016, + 20588,34491,18897,25772,8762, 3159, 38313,37866,34951,20587,42067,25163,524, 4333, 33003,27201,1533, 14082,42067,20586,42067,20189,28015,25474,7125, 16195,7016, 37014,34491,28416,37866,37866,1803, 7911, 28784,42066,627, 5913, 16635,13762,14151,39634,35386,34864,34176,35585,29257,32856,6449, 37921,11972,36471,36471,37047, - 6165, 7102, 11512,11450,17951,1192, 17229,37866,33744,7779, 24740,20585,17982,15147,6258, 21675,3291, 31996,42066,31995,6435, 32987,37865,2441, 2612, 28451,1497, + 6165, 7102, 11512,11450,17951,1192, 17229,37866,33744,7779, 24740,20585,17982,15147,6258, 21675,3291, 31996,42066,31995,6435, 32987,37865,2441, 2612, 28451,1497, 5633, 39633,39633,10448,15511,39633,17998,23535,13779,33743,637, 30143,36471,37865,25656,30142,8684, 33883,10469,7487, 9313, 676, 23138,33917,266, 2865, 19984, 29288,20584,33743,25883,15146,13589,21674,6994, 12608,38784,33105,17551,39633,39632,24339,23717,35386,32982,39632,11888,4121, 11733,38765,32477,4961, 23994,42066, - 25957,8889, 39632,34011,42066,34490,20895,4125, 20583,38127,25279,18419,8383, 35386,20582,17488,39632,13761,36470,9810, 33678,39208,10919,17724,27647,20581,3873, + 25957,8889, 39632,34011,42066,34490,20895,4125, 20583,38127,25279,18419,8383, 35386,20582,17488,39632,13761,36470,9810, 33678,39208,10919,17724,27647,20581,3873, 19023,38881,14809,20580,11757,38307,37865,23428,24203,13417,29001,12505,10408,9743, 33428,31824,37865,36659,2515, 2226, 39631,14284,30113,39383,1219, 12570,16174, 15499,9104, 27111,6059, 12090,39102,13760,37076,36457,34490,18346,36470,9033, 37832,36470,42065,11294,31965,35117,42065,34490,27482,14709,42065,39631,42065,17013, 33598,22418,93, 12848,37289,11235,35428,1111, 9660, 3616, 31829,6338, 20894,36470,34292,4894, 11649,42064,10913,14731,3808, 39631,42064,42064,16343,24188,23860, 22494,39631,4935, 26967,54, 16318,2166, 20464,10623,15919,29201,20238,17355,33390,15430,26991,19178,28450,8183, 32916,5345, 4834, 32809,30141,27812,34490,22493, 10676,923, 1420, 28979,8780, 17444,17728,12652,10566,23629,12017,11566,11370,36629,33471,8676, 12307,35320,17981,15429,25536,37864,23201,296, 19177,16763,33499, - 33743,42064,11783,39630,3154, 9967, 1715, 21673,35303,17228,37864,26966,6894, 33104,36211,16418,8741, 3037, 17300,20860,20188,984, 2252, 12415,13759,30522,3961, + 33743,42064,11783,39630,3154, 9967, 1715, 21673,35303,17228,37864,26966,6894, 33104,36211,16418,8741, 3037, 17300,20860,20188,984, 2252, 12415,13759,30522,3961, 8716, 5314, 13395,20522,42063,10245,13278,33930,12450,24627,24894,37864,27900,39630,26965,30140,9678, 34489,19176,20579,17980,33080,39630,30001,4424, 11371,29618, 36599,18973,34204,407, 17233,37435,33104,35529,20578,36965,35344,6622, 39414,1475, 37864,10213,3943, 15145,21672,42063,31994,35385,8005, 39265,14193,35385,35059, - 24496,1623, 37863,34489,23002,37192,42063,5253, 34149,30683,11293,37863,5625, 39630,22875,28737,33104,12847,27068,39629,37863,8020, 40, 37250,36469,362, 4820, + 24496,1623, 37863,34489,23002,37192,42063,5253, 34149,30683,11293,37863,5625, 39630,22875,28737,33104,12847,27068,39629,37863,8020, 40, 37250,36469,362, 4820, 11190,15428,3853, 34770,12846,32191,893, 11931,20187,39291,15053,38982,26062,27720,1340, 15629,426, 1146, 33371,447, 3590, 3212, 1172, 3584, 2954, 19175,38629, 35391,17012,20577,25424,24432,17227,37863,25655,31993,12702,558, 14909,37862,33142,35509,39238,35385,13841,11497,37955,42063,36973,21671,31301,17011,34489,33305, 37880,21862,7201, 26964,11732,39629,16149,10310,3646, 19174,15144,42062,32952,12701,36124,38409,30139,13778,266, 5558, 7478, 6726, 7354, 26513,25218,20576,38676, - 2235, 33407,6322, 38012,17417,8890, 34786,38829,14808,39104,8182, 19173,8864, 39139,35385,29508,38100,30699,35908,33332,36450,34733,20121,13758,15427,20575,4782, + 2235, 33407,6322, 38012,17417,8890, 34786,38829,14808,39104,8182, 19173,8864, 39139,35385,29508,38100,30699,35908,33332,36450,34733,20121,13758,15427,20575,4782, 6808, 8055, 35384,36469,24495,17226,20574,36469,152, 12700,37331,42062,20531,23437,39629,26963,4925, 6591, 12635,1205, 35384,33348,39629,38741,24494,36469,34489, 26755,6337, 19523,37862,25654,36117,42062,23436,12449,33278,20963,7495, 33743,24609,1323, 27388,2980, 35985,42062,14088,18918,32719,27011,33656,7834, 11042,12838, 1415, 19519,21567,3221, 5128, 2766, 8611, 29317,19172,13318,13957,33284,9966, 15398,7485, 42061,34488,39628,20893,42061,28367,35571,32819,14070,42061,37862,36574, - 9541, 37862,37861,35384,39628,11619,30138,16762,33104,37344,26340,36103,34488,21286,30137,21670,34341,33103,38332,37861,34314,12089,37447,36468,5632, 33742,6406, + 9541, 37862,37861,35384,39628,11619,30138,16762,33104,37344,26340,36103,34488,21286,30137,21670,34341,33103,38332,37861,34314,12089,37447,36468,5632, 33742,6406, 35549,34625,39628,17979,10214,20573,7694, 10332,35412,7859, 16148,16147,16980,34764,19171,33711,18015,18876,20572,36946,14283,35384,18199,31992,14093,8019, 39628, 3241, 7015, 42061,20892,42060,35383,33103,18345,20186,26962,42060,33103,31991,5812, 34488,36468,35383,14807,36468,12191,33742,42060,3386, 5811, 42060,33742,21669, 24493,42059,25653,36468,22901,20830,33103,9049, 15912,3586, 4614, 12508,27316,42059,33102,7484, 22492,34488,37861,33102,36467,80, 15485,2135, 32907,23611,35505, 23435,39627,39627,37118,4924, 42059,37861,36467,36945,25652,13757,7806, 13277,5011, 15343,35945,24289,21974,15203,20571,17599,10918,34598,29636,19522,11882,36698, 5859, 2298, 8966, 35671,38601,25651,25650,33952,3459, 33019,21668,6208, 38461,10213,7966, 10884,5244, 19532,27200,13649,33102,23434,17978,37726,279, 5242, 25580, - 12088,33259,30907,23606,449, 31204,4382, 1859, 34119,15426,12087,1149, 12448,24883,39627,33106,16647,35270,15425,39356,20570,33742,1410, 1667, 38753,2154, 6388, + 12088,33259,30907,23606,449, 31204,4382, 1859, 34119,15426,12087,1149, 12448,24883,39627,33106,16647,35270,15425,39356,20570,33742,1410, 1667, 38753,2154, 6388, 37423,14282,20569,17248,42059,4218, 4274, 11957,13546,7294, 35223,5019, 42058,35168,21754,33154,7269, 15424,42058,36467,36467,3201, 39171,17479,6124, 8450, 39627, 27417,37860,17723,17290,21626,36837,19170,35524,30205,2501, 28255,34350,12874,20891,35870,18949,34487,15423,30136,5344, 29479,30135,9415, 34781,33645,35366,10502, 7693, 12447,820, 12919,8311, 10004,19529,37860,24492,20568,33741,14092,42058,35383,36466,35017,36597,24491,42058,17977,42057,20614,35383,16551,36466,37367,18110, @@ -17769,7 +17764,7 @@ static const unsigned short Ranks[197839] = 5985, 36465,37859,14983,19521,11328,20185,42057,23893,14281,13756,33101,24490,25868,42056,6807, 34487,34093,16761,35382,38693,19169,33101,14806,13585,10806,14280, 39071,34487,34843,9805, 33101,35382,39626,11078,42056,1903, 14150,38137,34487,21998,20443,13276,42056,27456,7293, 28913,42056,39121,12490,37859,35382,39626,36416, 325, 30103,30133,42055,34486,24489,23998,43, 8701, 1994, 32770,19138,10131,21958,24444,31600,32373,23287,27963,25145,19136,5320, 11248,6161, 25252,20036,30402, - 35242,20722,27712,28692,13995,23270,17225,8229, 25952,2736, 16342,33101,16156,8629, 10141,18170,1596, 184, 2835, 37859,39625,503, 32348,28627,31990,42055,66, + 35242,20722,27712,28692,13995,23270,17225,8229, 25952,2736, 16342,33101,16156,8629, 10141,18170,1596, 184, 2835, 37859,39625,503, 32348,28627,31990,42055,66, 35617,26394,35271,42055,39625,39625,3696, 16406,39625,37859,25647,31989,37858,42055,15143,22001,21112,28458,3255, 39107,6955, 39270,3545, 7811, 17975,20290,19168, 8690, 39624,34486,33078,11511,34486,25646,36465,28449,42054,36465,39624,37480,28583,37858,23433,36775,34595,26961,34924,13463,587, 9686, 29610,33741,39624,13275, 39624,39623,42054,33741,17224,20775,28448,33741,37858,16244,25645,42054,8344, 16912,9032, 35350,30132,16560,39008,34514,33100,11510,9809, 42054,42053,23432,10916, @@ -17780,7 +17775,7 @@ static const unsigned short Ranks[197839] = 39621,21665,28878,19166,37537,39621,14426,15911,6164, 3738, 42052,42051,31987,36464,39621,33100,8740, 23430,31986,42051,3622, 1496, 9965, 38453,19517,39620,42051, 35380,11509,39620,4254, 3964, 705, 28248,13203,30740,10917,5250, 15142,31149,17974,19516,39620,19515,35380,28172,1778, 26957,20184,33097,42051,37856,34484,35293, 38270,33740,18344,22488,37856,19169,35380,8056, 10252,39620,14753,19165,39619,39619,36464,28444,23913,36463,42050,2701, 28468,42050,42050,42050,34484,35379,37856, - 39619,25643,34483,30130,39619,4424, 42049,30129,39618,39618,42049,22341,21664,42049,39618,15510,42049,15509,16340,37855,32807,12545,6207, 42048,34483,20567,3585, + 39619,25643,34483,30130,39619,4424, 42049,30129,39618,39618,42049,22341,21664,42049,39618,15510,42049,15509,16340,37855,32807,12545,6207, 42048,34483,20567,3585, 37855,42048,2328, 36463,11971,36463,39618,35379,34483,20566,14279,7805, 25928,28727,17836,37855,42048,42048,39617,6336, 33100,16755,8421, 37855,30128,37854,37854, 42047,18869,25642,36463,7990, 31029,21663,17223,34483,36462,36462,42047,42047,18343,11813,42047,24488,42046,26942,23429,37854,42046,31044,8380, 19215,28459,33099, 42046,28355,35379,28443,34482,32735,5175, 22480,9987, 3207, 32944,33750,23151,8182, 28591,28442,18323,36759,33632,39296,10915,35797,35330,15144,38670,18895,37904, @@ -17792,53 +17787,53 @@ static const unsigned short Ranks[197839] = 34482,4038, 25160,4953, 5457, 28440,12958,4022, 33008,18057,402, 20205,42044,31157,1183, 39001,37895,37698,35364,20563,19162,8554, 35005,6094, 20809,7195, 12444, 27755,32393,24474,36461,37853,18342,39616,24507,25641,7569, 9964, 17972,34592,42044,25903,20889,21527,4592, 33866,21662,24431,24486,35104,42044,93, 22750,39616, 6584, 16677,2649, 21661,2635, 1529, 39615,16760,36035,1098, 16946,36561,17971,36461,16145,20562,32192,15608,28439,28765,37853,42043,1834, 37306,85, 9111, 17970, - 39615,9608, 11970,34488,37853,43, 33511,33740,1086, 30127,1231, 14625,36461,25640,15457,42043,15455,38997,33099,21195,15384,37297,10654,1180, 29557,3648, 6191, - 39157,24053,3424, 25135,30960,11374,1312, 26996,25639,4517, 6687, 39615,25638,15910,16759,42043,42043,37666,37852,15941,23427,7483, 22719,36460,39615,34482,1080, - 38499,11311,35417,38339,2830, 5573, 21318,15657,21759,22623,7726, 16058,17832,31286,11189,39614,34413,32938,13029,9089, 17010,19161,14374,34993,36470,20561,639, + 39615,9608, 11970,34488,37853,43, 33511,33740,1086, 30127,1231, 14625,36461,25640,15457,42043,15455,38997,33099,21195,15384,37297,10654,1180, 29557,3648, 6191, + 39157,24053,3424, 25135,30960,11374,1312, 26996,25639,4517, 6687, 39615,25638,15910,16759,42043,42043,37666,37852,15941,23427,7483, 22719,36460,39615,34482,1080, + 38499,11311,35417,38339,2830, 5573, 21318,15657,21759,22623,7726, 16058,17832,31286,11189,39614,34413,32938,13029,9089, 17010,19161,14374,34993,36470,20561,639, 20560,8310, 19862,3369, 28263,13221,21111,99, 26856,1773, 8384, 22375,26837,31282,17892,20321,24756,36306,33739,33771,42042,42042,37852,39614,39614,37852,38414, 38934,289, 11847,4385, 19691,17461,14335,17527,2123, 8906, 21034,21466,9088, 19665,37852,33395,14805,10675,37166,36515,17270,17755,39286,12899,37360,10868,29662, 34253,6590, 2218, 14804,32933,35378,35907,18718,38583,6252, 23282,34872,39089,34558,35549,33762,33799,31222,26814,39081,30929,14278,37571,8753, 35338,36181,23098, - 36056,12071,35553,36460,34048,1441, 6716, 35526,33189,39245,16144,20559,17009,37874,31729,10113,8258, 14277,24412,2767, 5792, 2851, 6654, 4706, 13273,2629, 2406, + 36056,12071,35553,36460,34048,1441, 6716, 35526,33189,39245,16144,20559,17009,37874,31729,10113,8258, 14277,24412,2767, 5792, 2851, 6654, 4706, 13273,2629, 2406, 26127,18565,39142,13293,26293,36010,38462,6034, 27073,27181,10999,35647,39297,33226,35170,1425, 34701,21367,29087,19606,36915,13798,18571,37865,12962,28240,27798, 18893,42042,38494,37851,728, 12914,42042,2703, 20558,36141,5936, 18247,19075,6944, 12428,34835,27906,23146,38866,38890,11731,42041,28503,39094,10663,35546,42041, - 3263, 17967,24161,1376, 42041,12166,42041,35378,26804,2763, 1375, 1417, 36379,93, 21688,31190,8534, 34881,33095,11313,16042,16143,19160,914, 38922,32983,2248, + 3263, 17967,24161,1376, 42041,12166,42041,35378,26804,2763, 1375, 1417, 36379,93, 21688,31190,8534, 34881,33095,11313,16042,16143,19160,914, 38922,32983,2248, 15422,2745, 4088, 5464, 10940,37108,1854, 34644,36784,35317,30618,32786,6989, 19159,19833,6135, 26363,39274,18065,13755,33551,21411,11982,21234,9607, 1974, 24097, 23426,15013,42040,37851,28450,23335,29710,3396, 35477,37851,31057,3338, 13926,36460,1475, 11509,33387,2763, 6732, 36460,3172, 36662,26958,20183,32436,34193,19278, 39387,37851,31983,28438,33437,6497, 42040,26447,32395,3804, 10907,34109,31731,6459, 15140,38351,30675,36459,647, 10304,34481,22058,36459,16635,36459,33845,33739, 37850,26957,30440,19000,1444, 12948,34917,27676,24485,10701,22487,17008,42040,31982,19158,25637,42040,42039,36459,42039,24484,25636,42039,10251,36458,39614,25635, 20888,2091, 23486,26956,28437,42039,26815,34760,37850,35377,36458,33739,20887,31981,4199, 10579,38464,7051, 18892,26782,35522,33098,42038,16339,39613,35569,37054, 37850,387, 35377,2562, 38838,803, 7919, 11112,33739,20886,42038,1633, 9573, 15139,42038,26955,2049, 16142,36458,20182,4561, 34148,13272,42038,22971,729, 33098, - 42037,17969,37516,37850,6220, 1308, 12845,32196,713, 14938,14276,33098,1195, 12142,13202,35544,42037,33738,14779,15421,19157,31980,13777,39613,21660,2947, 3243, + 42037,17969,37516,37850,6220, 1308, 12845,32196,713, 14938,14276,33098,1195, 12142,13202,35544,42037,33738,14779,15421,19157,31980,13777,39613,21660,2947, 3243, 12607,25228,5374, 2306, 21861,9804, 10558,39613,12394,19156,18341,24483,42037,13201,33098,35377,1800, 35950,7018, 39073,17007,19152,38471,35898,18977,9871, 23596, 22123,7083, 483, 26419,4654, 824, 8098, 6219, 38506,4025, 36007,37849,11975,39613,16141,14275,19155,11969,19838,26514,42037,1313, 24427,39612,551, 14274,21622, 1309, 33271,36458,33738,39612,35377,36457,17968,42036,36457,12711,2654, 39612,39612,6295, 22131,11292,33738,18746,39120,20557,42036,37849,42036,20181,33738,16737, - 42036,16338,35376,18891,42035,37849,42035,9395, 34320,34549,33737,35376,42035,37849,33737,5109, 31979,2930, 42035,35376,158, 35376,5691, 39611,33595,25634,5822, + 42036,16338,35376,18891,42035,37849,42035,9395, 34320,34549,33737,35376,42035,37849,33737,5109, 31979,2930, 42035,35376,158, 35376,5691, 39611,33595,25634,5822, 14803,5346, 42034,30126,28436,39611,37848,37979,33320,34481,39204,33583,22486,33097,36457,12626,17222,23425,34481,13754,14104,459, 24584,25458,20180,39611,11968, 35375,17618,35375,6377, 18890,37848,42034,31978,990, 42034,39611,5203, 42034,23700,15271,21853,9031, 28146,36338,26050,35375,21659,36755,38774,33050,34437,39610, 30125,38809,42033,6385, 42033,37848,42033,22485,37848,14425,36457,37847,15138,34481,37847,11177,18340,39610,29652,33761,22241,31710,7393, 17006,1405, 42033,37847, 39610,19558,10084,4133, 6146, 12448,4274, 22484,17301,6733, 19154,11111,36456,4247, 12549,17967,14481,13753,39610,908, 21042,11493,19582,14802,20556,9719, 20588, - 23309,37825,11804,39609,33097,31977,35375,31976,36456,31210,10914,5084, 21658,2820, 17005,10447,9607, 34480,39609,34332,36456,42032,42032,37847,33081,23393,1314, + 23309,37825,11804,39609,33097,31977,35375,31976,36456,31210,10914,5084, 21658,2820, 17005,10447,9607, 34480,39609,34332,36456,42032,42032,37847,33081,23393,1314, 13380,15573,36018,973, 36929,20555,15883,34351,39609,30466,37846,36120,17924,33737,37846,37846,20979,37846,9963, 35582,26954,31975,1110, 17721,33097,38737,37260, 10180,34480,19693,20554,39609,22483,17266,22938,39608,33097,33068,4021, 42032,2381, 9087, 30528,33256,23424,8597, 37248,42032,20553,15909,35374,5608, 5327, 17563, 6465, 21657,36774,34480,15885,7804, 32578,30746,15692,29570,17720,33096,42031,4488, 21656,33737,2344, 15137,42031,13752,19239,23262,11281,6369, 30124,32214,42031, 5705, 34661,31383,27117,22482,20179,31974,31973,35374,21655,33736,39608,37845,35863,36456,42031,34816,22481,37845,2129, 20719,16140,4632, 1370, 10407,10250,37174, 1364, 6996, 14656,37837,28795,9703, 15150,20232,2843, 36455,39608,25451,26705,8519, 21654,15706,29545,35754,33736,42030,33736,18847,27547,30123,6106, 2079, 20552, 20051,14962,802, 27668,29459,11579,37845,18446,5121, 6085, 29081,31808,17966,25909,32280,26237,16068,434, 14591,26764,5343, 31953,28571,20681,8596, 19153,17965, - 27035,11449,15205,23685,8600, 2001, 1449, 34385,19152,38097,32695,22480,36464,24262,8228, 24245,32494,11756,36056,39608,13271,3889, 36455,42030,20551,36624,3811, + 27035,11449,15205,23685,8600, 2001, 1449, 34385,19152,38097,32695,22480,36464,24262,8228, 24245,32494,11756,36056,39608,13271,3889, 36455,42030,20551,36624,3811, 33691,28435,37845,18159,8055, 26234,13751,8449, 42030,24482,25721,33736,34480,21653,34479,3737, 34479,13480,17964,34064,35501,28297,42030,4833, 38678,1586, 34888, 1739, 3844, 28242,19151,21652,39607,12012,13750,1079, 11967,15908,33279,14778,38852,39607,36251,33735,22128,20885,30122,35374,39607,19514,10097,32851,8343, 39123, - 8161, 33096,5663, 10096,14801,24291,9838, 20987,18960,1476, 15892,30121,35374,32876,14658,31966,25633,28434,37679,2296, 17221,35373,34791,22042,8088, 22815,7639, + 8161, 33096,5663, 10096,14801,24291,9838, 20987,18960,1476, 15892,30121,35374,32876,14658,31966,25633,28434,37679,2296, 17221,35373,34791,22042,8088, 22815,7639, 34567,18892,2848, 17963,9807, 33452,25632,33735,38162,25631,29931,4814, 11730,1460, 22270,15755,7482, 42029,39607,42029,27921,37844,33096,23852,3714, 16337,23802, 25465,1856, 3543, 5582, 1815, 25630,14383,30502,31972,15907,20550,4038, 36455,18339,19243,15104,23309,17004,36455,3571, 37844,17003,3187, 4444, 25448,28751,30608, 30934,30120,42029,34978,5351, 17682,35368,38296,26658,38060,4359, 18338,30119,13442,33735,8682, 22479,9414, 38324,15136,15508,30118,39606,3506, 8889, 16202,19150, 23171,7172, 34230,9606, 18215,24326,6953, 17002,20549,30409,5313, 35937,33877,34479,26953,2204, 42029,39606,42028,20548,5282, 36454,35373,8203, 30117,20547,36454, - 42028,10578,37170,38856,2750, 18693,18889,33096,8739, 36959,33735,12429,38219,39606,9904, 28233,42028,14777,31971,33095,25851,19223,37486,22478,10810,1037, 9250, - 5434, 4649, 4609, 7489, 15930,39152,30116,23423,37844,42028,12700,11603,21253,8227, 9032, 3420, 26725,2328, 17482,35224,4122, 11061,26251,928, 7283, 26230,9058, + 42028,10578,37170,38856,2750, 18693,18889,33096,8739, 36959,33735,12429,38219,39606,9904, 28233,42028,14777,31971,33095,25851,19223,37486,22478,10810,1037, 9250, + 5434, 4649, 4609, 7489, 15930,39152,30116,23423,37844,42028,12700,11603,21253,8227, 9032, 3420, 26725,2328, 17482,35224,4122, 11061,26251,928, 7283, 26230,9058, 4107, 35295,17326,39173,25317,37786,31970,33095,42027,36454,12089,9352, 37100,33622,33807,3229, 12945,11619,22924,20909,37722,2401, 6591, 19513,25629,14171,39606, 37106,3150, 11729,37844,3805, 27591,28219,28976,24660,37020,26646,13749,15140,33095,35006,8044, 14028,20884,17166,3475, 10098,32152,35260,10067,14273,15398,10760, 617, 11896,19149,1232, 17234,38222,34479,10003,5904, 33569,19740,42027,39605,29885,37843,35373,10406,38114,35373,37428,35594,39605,37843,18337,24002,33095,35372, 42027,35372,39323,35372,26952,35866,42027,42026,17099,26951,26950,42026,37352,4391, 38204,9174, 33898,14091,6749, 33734,28994,2584, 30115,33109,25628,36454,11291, - 42026,35136,34538,20883,37843,36126,35372,42026,28290,11448,35371,37843,39605,42025,37842,42025,26949,38329,32959,2059, 10183,31491,1760, 6509, 7803, 15420,2955, + 42026,35136,34538,20883,37843,36126,35372,42026,28290,11448,35371,37843,39605,42025,37842,42025,26949,38329,32959,2059, 10183,31491,1760, 6509, 7803, 15420,2955, 3140, 27191,10916,18692,15419,19148,35866,42025,39364,35371,27268,1862, 22551,25547,37842,7597, 6670, 20178,3908, 15516,34478,34681,37842,39605,33305,39604,42025, 2100, 16336,36976,34478,42024,37842,28411,15427,1056, 16040,17873,17552,33499,39604,30114,2261, 2801, 2939, 27102,36453,5475, 6860, 6949, 8865, 4829, 9677, 38394, 37841,39604,17305,30438,36616,13748,37841,32223,37894,36453,12446,14800,5243, 35151,39020,42024,16335,3914, 33081,37841,23422,30600,42024,38876,37841,42024,36786, @@ -17846,12 +17841,12 @@ static const unsigned short Ranks[197839] = 446, 13944,15292,1981, 34477,17888,35467,37840,16758,33698,37945,37018,39603,16473,15190,8040, 1616, 13747,35370,16757,6822, 35000,39603,4957, 38078,42023,36537, 37840,27776,29839,11364,7171, 34009,29052,33487,36453,36452,14026,8148, 9836, 8154, 16535,3930, 14271,18888,8907, 35967,20882,35370,10913,5345, 7984, 4648, 19382, 20177,36452,39603,1026, 4246, 13241,32924,32891,18690,6389, 5698, 37839,10188,38030,25627,2985, 20546,34477,11447,24481,33281,42023,42023,33094,30112,28512,13479, - 34477,39603,42022,25626,20176,39254,18052,42022,16658,25004,6309, 30239,14559,23606,11359,37105,37144,42022,33636,34615,30306,13269,151, 19147,3690, 19146,567, + 34477,39603,42022,25626,20176,39254,18052,42022,16658,25004,6309, 30239,14559,23606,11359,37105,37144,42022,33636,34615,30306,13269,151, 19147,3690, 19146,567, 28316,18336,20536,20545,3814, 13316,23609,21836,7481, 39602,10915,22574,29731,15945,42022,39064,35882,615, 36452,42021,6091, 22477,18365,2849, 17942,42021,35370, 28433,36452,42021,34476,25625,38578,37839,34466,34476,33734,36451,13146,29800,33207,31969,30111,3291, 7084, 12445,17961,36451,6218, 20544,1898, 38562,17001,30303, 37378,27933,16342,9803, 3097, 38652,22649,6806, 8452, 34757,28834,38698,42021,30110,8806, 32347,14776,35491,13268,39399,33094,37839,33734,33463,37975,39602,42020, - 19511,392, 29539,42020,10011,15906,37839,42020,36623,9462, 723, 19145,34751,3283, 33246,1159, 13600,7885, 7124, 6470, 4560, 11674,38184,33304,12444,38141,4253, - 36451,29939,15529,15418,24786,1046, 5833, 9151, 13746,795, 16015,11937,702, 39602,635, 24252,36219,21233,37211,21804,16139,25473,28130,3582, 5227, 3165, 2394, + 19511,392, 29539,42020,10011,15906,37839,42020,36623,9462, 723, 19145,34751,3283, 33246,1159, 13600,7885, 7124, 6470, 4560, 11674,38184,33304,12444,38141,4253, + 36451,29939,15529,15418,24786,1046, 5833, 9151, 13746,795, 16015,11937,702, 39602,635, 24252,36219,21233,37211,21804,16139,25473,28130,3582, 5227, 3165, 2394, 30109,37838,12198,11565,35749,37838,6092, 36966,13713,1107, 26948,18335,37597,4544, 39090,36522,10069,22204,6268, 12944,25624,35370,3521, 20543,30012,21086,28831, 39328,15234,38095,34476,19510,42020,37838,42019,6515, 7691, 39187,20542,32449,1173, 12479,35800,39176,14359,31167,5235, 39317,27225,17000,42019,38929,20833,23015, 7216, 37758,37838,39602,1517, 3489, 17960,17632,33943,8888, 33734,17715,19144,36805,39601,35692,31968,18887,42019,42019,2605, 1162, 29912,33340,2416, 11755,36451, @@ -17859,11 +17854,11 @@ static const unsigned short Ranks[197839] = 19509,21651,20330,36450,39285,3886, 14775,33094,23421,33069,33896,30108,31303,7390, 35007,33094,32864,34475,42018,33733,37837,34706,226, 31420,27436,4480, 17096, 36221,6768, 12690,14983,7552, 5491, 36721,10765,19143,359, 3553, 5656, 31400,28271,9712, 11570,116, 159, 34143,35746,4440, 29867,9965, 427, 24327,29039,26518, 9413, 27352,33777,13917,20512,24853,4402, 13627,20539,18013,6623, 4401, 343, 42018,36595,35369,12151,21306,22192,5688, 16138,22853,2659, 2345, 37701,11188,13267, - 613, 3977, 32157,3099, 20957,15443,14270,16999,1384, 4261, 10477,20286,2954, 16711,14497,37837,5527, 38476,2766, 2970, 6789, 4758, 19142,14102,8897, 37723,2039, + 613, 3977, 32157,3099, 20957,15443,14270,16999,1384, 4261, 10477,20286,2954, 16711,14497,37837,5527, 38476,2766, 2970, 6789, 4758, 19142,14102,8897, 37723,2039, 10446,31302,8738, 12447,11187,105, 5750, 32836,1625, 9330, 38738,35369,14798,5540, 7802, 39384,11446,800, 6722, 17958,32706,36305,24480,20114,31488,12531,38482, 33372,39601,36248,13745,3353, 6449, 35667,10405,10002,13266,14797,37837,19141,42018,27994,37346,36450,20881,23214,36450,9335, 33733,36920,33733,8017, 10249,37985, 12434,13797,39601,11031,875, 21977,20696,42018,16137,42017,24479,35369,35057,39601,42017,37084,36473,42017,39600,6377, 35653,34475,21116,33093,36210,38056,10404, - 36395,15557,33733,42017,33732,17927,22607,35452,28432,32617,39600,36450,22476,42016,35328,36449,35792,17821,35209,31627,26548,34284,30053,26976,30107,42016,9412, + 36395,15557,33733,42017,33732,17927,22607,35452,28432,32617,39600,36450,22476,42016,35328,36449,35792,17821,35209,31627,26548,34284,30053,26976,30107,42016,9412, 33022,7925, 37836,39600,35369,16998,34475,35368,15613,39229,10461,15864,33093,7493, 33732,33549,32868,18885,37836,33093,34475,39600,16412,37496,26947,42016,37836, 37836,39599,21765,7272, 28822,14019,39599,33269,36449,25623,17334,29209,14774,15083,5563, 34450,34646,35974,39599,42016,22475,33732,808, 32051,8464, 24833,32897, 16334,33093,42015,5270, 7744, 9605, 33982,19981,3645, 30106,33092,42015,39599,13200,12757,29303,22278,39064,25970,34005,23420,4544, 12792,10530,26552,10001,28698, @@ -17884,14 +17879,14 @@ static const unsigned short Ranks[197839] = 26466,19367,35332,14792,16403,6880, 9901, 33074,32900,19137,4614, 34472,28429,33731,11508,39592,38627,42010,36446,32568,9446, 33046,30664,17989,42010,35367,23418, 20536,37832,39592,9147, 39592,39592,37832,30102,2374, 754, 20779,15505,34166,4217, 8991, 14852,909, 11945,33924,33310,14247,9907, 38894,11838,27372,8405, 14791, 16331,37831,33731,33090,37398,37831,39591,28428,34472,29427,39591,2499, 12837,42010,42010,35366,36446,18822,20149,38219,25268,38319,9676, 16134,39591,3687, 37892, - 38584,42009,33731,38686,26942,39591,23417,33280,9892, 30101,16330,33730,11381,32950,39590,17667,37831,42009,42009,16329,345, 8690, 10473,33514,18872,3466, 6272, - 34764,34365,19506,17955,42009,1884, 7609, 663, 36143,17029,36682,37831,38830,24476,33090,28427,34780,15658,34283,42008,42008,30100,30951,18332,665, 3867, 8691, + 38584,42009,33731,38686,26942,39591,23417,33280,9892, 30101,16330,33730,11381,32950,39590,17667,37831,42009,42009,16329,345, 8690, 10473,33514,18872,3466, 6272, + 34764,34365,19506,17955,42009,1884, 7609, 663, 36143,17029,36682,37831,38830,24476,33090,28427,34780,15658,34283,42008,42008,30100,30951,18332,665, 3867, 8691, 31966,23416,21649,42008,12342,35059,37415,34472,19886,22504,955, 7122, 20535,9999, 37830,42008,28431,26941,34472,10693,2245, 33047,34666,6655, 20534,25621,20533, 33184,263, 3539, 852, 3079, 36773,36845,26530,17885,1002, 27259,39390,30819,39180,33208,26620,26940,8016, 34471,14423,14313,25620,42007,39590,19707,35366,12190, 36446,37188,18758,908, 9411, 32983,24900,30386,38376,22766,24301,27655,31965,10720,37828,2854, 29280,39590,37319,2776, 8557, 22474,33090,37830,750, 35366,34471, 33730,9600, 6266, 36445,26939,5311, 35366,38182,23415,33730,34772,18409,19433,34890,14423,32980,21230,5943, 39590,37830,39589,16404,11691,11289,15905,39589,42007, 14267,1211, 17954,31964,35365,42007,4428, 37897,35994,39243,22567,11618,14266,10914,38156,15416,3797, 36445,6028, 549, 8152, 26076,14790,32449,37830,2181, 32689, - 14860,1621, 21514,32887,17015,29939,24537,38031,20093,35412,15920,28243,35032,37448,29256,20366,22274,42007,35365,29425,39589,39293,26938,37848,37829,24475,2015, + 14860,1621, 21514,32887,17015,29939,24537,38031,20093,35412,15920,28243,35032,37448,29256,20366,22274,42007,35365,29425,39589,39293,26938,37848,37829,24475,2015, 10056,24348,34074,24474,5534, 14422,7257, 17083,34318,42006,9801, 16993,42006,39589,42006,37829,36445,35339,39588,42006,9612, 36842,39588,34349,30909,37536,35688, 23507,30172,35313,34471,34303,36122,37312,19752,37306,35863,32885,36911,13525,7292, 16390,25667,13534,27078,11128,15220,16468,36777,17742,5631, 34841,32957,16874, 30256,16710,23781,6440, 11593,34760,24277,13285,20532,9270, 37842,25491,18301,25304,11755,10905,33008,39588,6055, 9018, 33322,20915,35178,33423,36606,16053,19248, @@ -17911,19 +17906,19 @@ static const unsigned short Ranks[197839] = 39584,10551,25111,7860, 13261,12313,3766, 10913,39583,25618,33089,42003,2562, 6130, 18668,19134,24343,16774,35199,2651, 7389, 14788,16117,26758,5878, 32956,21505, 6763, 27965,333, 37253,42002,38798,33597,15301,34979,1762, 21149,16726,6807, 17981,5351, 19261,3586, 35806,134, 2271, 34997,26678,10318,34242,6945, 22462,33729, 36443,22472,4400, 36443,33089,38366,9961, 34913,15904,8054, 18330,39583,2839, 12243,24470,16492,23414,35480,20170,8887, 34899,33275,12084,35363,36443,42002,31959, - 39583,42002,8448, 772, 24290,26279,37826,19133,33207,3281, 1672, 11227,26327,8937, 21798,282, 11473,23443,8620, 21509,10239,7795, 9003, 32800,26944,30797,5292, + 39583,42002,8448, 772, 24290,26279,37826,19133,33207,3281, 1672, 11227,26327,8937, 21798,282, 11473,23443,8620, 21509,10239,7795, 9003, 32800,26944,30797,5292, 24657,17750,20387,19424,496, 3643, 17140,27255,11658,28652,14973,15505,19132,7316, 6649, 14944,2408, 22984,24325,8791, 12867,1018, 37826,27113,27385,32910,21806, 12505,25617,36483,22034,20137,29180,16131,4362, 33729,39583,39582,39582,37982,15415,37826,42002,28424,35363,12429,127, 3371, 27578,30400,1792, 7332, 19262,36092, 2309, 7904, 31484,36443,714, 11428,17904,4542, 37111,22471,8505, 3659, 20875,20169,9409, 38469,39582,36188,35514,10117,9213, 23413,23412,24469,42001,36442,33746, 17951,22471,123, 21648,2703, 19131,17447,37789,25616,33728,3956, 10875,23411,39153,33538,20526,11753,1059, 8827, 39303,36948,34469,18329,34469,1921, 38422,22906, - 1303, 2951, 4335, 24706,19130,1376, 35936,26935,23410,10918,13853,18883,37754,30096,42001,20874,5135, 25567,5415, 16991,25959,16990,37825,26934,14553,39087,2464, + 1303, 2951, 4335, 24706,19130,1376, 35936,26935,23410,10918,13853,18883,37754,30096,42001,20874,5135, 25567,5415, 16991,25959,16990,37825,26934,14553,39087,2464, 27799,3604, 15283,6342, 4732, 12172,2193, 6333, 6600, 34468,36631,2994, 37825,35348,15510,3787, 11978,1105, 33110,20332,1532, 39582,36442,36214,22306,39581,10401, - 23409,38609,37167,37604,30095,36442,6748, 31958,34468,33728,37799,3628, 5463, 2558, 17631,16989,7801, 34928,20525,1286, 11445,22673,33822,36741,19129,37825,4757, + 23409,38609,37167,37604,30095,36442,6748, 31958,34468,33728,37799,3628, 5463, 2558, 17631,16989,7801, 34928,20525,1286, 11445,22673,33822,36741,19129,37825,4757, 42001,27895,28683,16037,35365,340, 16227,4891, 7664, 1181, 21285,967, 3535, 16988,21259,28539,29585,11637,19816,36610,15357,25610,42001,35363,42000,37825,35363, - 8225, 35362,42000,37824,10739,8015, 5942, 42000,19128,4255, 3550, 5489, 7295, 2329, 5198, 6805, 20765,38126,2724, 1417, 467, 715, 42000,41999,39581,36442,1916, + 8225, 35362,42000,37824,10739,8015, 5942, 42000,19128,4255, 3550, 5489, 7295, 2329, 5198, 6805, 20765,38126,2724, 1417, 467, 715, 42000,41999,39581,36442,1916, 32799,32470,346, 35641,7325, 1456, 20648,38750,21476,30841,4885, 9084, 33412,14037,38062,25915,34097,35527,37557,10964,32776,2304, 17218,10576,31957,41999,30228, 3049, 5220, 35626,17516,11444,4258, 36441,34156,38357,5496, 33824,34064,28423,6962, 4702, 35362,24828,31956,41999,37824,5422, 15338,14081,33728,41999,34468,37333, - 33728,35362,30094,15135,3797, 14787,7661, 37675,23652,33202,37860,12097,20589,34427,12842,33915,41998,2836, 16987,33048,12055,9281, 15414,3457, 4685, 9408, 8180, + 33728,35362,30094,15135,3797, 14787,7661, 37675,23652,33202,37860,12097,20589,34427,12842,33915,41998,2836, 16987,33048,12055,9281, 15414,3457, 4685, 9408, 8180, 37902,3084, 17944,6050, 25806,23819,13260,39581,19362,12024,18919,37487,39279,36795,33740,7800, 24125,11443,6237, 41998,1657, 16855,16002,41998,38513,41998,27956, 25685,19577,6381, 1372, 16347,2765, 18079,33376,30093,5948, 6162, 12189,26034,34468,14841,7665, 1071, 37563,3444, 11049,35846,35455,39284,25615,28422,37824,34467, 32699,39231,28421,3155, 14420,10211,19127,41997,39581,35021,23408,39580,2420, 5832, 33772,37824,23537,39580,22690,30482,37823,6479, 12578,20524,16130,34467,28420, @@ -17931,7 +17926,7 @@ static const unsigned short Ranks[197839] = 19124,39580,20523,15413,18328,41996,25614,30092,13198,719, 34584,23866,8737, 36441,41996,16986,10738,12446,9083, 41996,21647,21176,35593,16328,35362,14090,10912, 37519,41996,20070,33156,23546,19629,38019,23557,2165, 7917, 39579,41995,36441,39579,6105, 8681, 7833, 18882,16327,7956, 37804,8736, 16128,20452,17717,41995,15903, 2128, 7430, 7388, 12941,4105, 1585, 34467,37823,2315, 41995,3935, 41995,3549, 38358,41994,16102,9799, 41994,21676,23407,7690, 30546,34887,22521,8594, 21646,10674, - 39579,39116,1607, 30091,15412,21864,37334,4756, 39579,34467,36602,1413, 32657,7198, 33079,33727,16985,24992,4252, 18881,81, 41994,22470,236, 32845,1693, 5063, + 39579,39116,1607, 30091,15412,21864,37334,4756, 39579,34467,36602,1413, 32657,7198, 33079,33727,16985,24992,4252, 18881,81, 41994,22470,236, 32845,1693, 5063, 11314,28054,25245,19294,20329,9357, 31403,19123,34945,36137,11467,32106,2016, 1204, 17945,23361,8532, 32841,16974,4399, 36279,38622,16944,32952,11468,6253, 30085, 10319,24217,15408,31163,34158,27190,20522,22951,284, 38456,23118,18465,11777,39330,18381,32072,30932,35361,41994,36441,30090,38947,15134,32949,28418,28417,39578, 10347,41993,41993,11183,12224,5063, 35361,20873,22469,39578,11727,38258,16755,6001, 35963,34874,37822,11507,41993,33046,36696,16162,6371, 35361,18327,36440,37262, @@ -17941,104 +17936,104 @@ static const unsigned short Ranks[197839] = 6179, 33305,36302,38939,33727,33092,9452, 41992,27030,41992,28489,19121,11726,37822,19120,39578,35139,41992,31038,34958,35666,20521,10210,8426, 8886, 37582,38642, 13776,26932,3673, 6804, 15411,35784,41992,17638,7533, 30181,37767,26931,33088,9306, 37395,33727,39577,34466,39577,36440,25512,26930,14793,33440,34466,23538,41991, 37218,1274, 1597, 38450,30200,19505,33727,39066,34274,34466,30088,16326,35360,34643,392, 17716,39577,41991,33726,16127,15410,17217,39577,41991,31955,14427,23718, - 36440,30087,23159,27184,7373, 1288, 34239,3290, 2333, 2539, 12441,2045, 18880,14786,33087,39576,36439,39576,35360,8336, 37979,33726,39576,785, 7121, 7694, 3095, - 10779,33292,6091, 16982,32864,15379,37682,14344,37858,36669,14771,33087,39576,39129,26935,22591,39575,10247,19389,11182,37051,29628,5062, 14265,5460, 15938,4178, + 36440,30087,23159,27184,7373, 1288, 34239,3290, 2333, 2539, 12441,2045, 18880,14786,33087,39576,36439,39576,35360,8336, 37979,33726,39576,785, 7121, 7694, 3095, + 10779,33292,6091, 16982,32864,15379,37682,14344,37858,36669,14771,33087,39576,39129,26935,22591,39575,10247,19389,11182,37051,29628,5062, 14265,5460, 15938,4178, 8308, 7210, 11752,10673,3841, 35360,34578,22808,28788,33739,15704,19832,41991,41990,25613,5581, 4217, 13997,16536,18229,20567,784, 12521,19119,17404,12241,32884, - 24093,4684, 25608,34572,37654,4189, 2689, 23356,4625, 41990,28252,31120,18567,17232,15409,36553,15408,16126,8593, 39258,19118,20520,28373,33205,17216,8179, 5156, + 24093,4684, 25608,34572,37654,4189, 2689, 23356,4625, 41990,28252,31120,18567,17232,15409,36553,15408,16126,8593, 39258,19118,20520,28373,33205,17216,8179, 5156, 10918,39575,31954,38228,34462,18427,16937,13549,18804,10303,621, 32826,4621, 9301, 31953,14664,2916, 5623, 20925,25107,38502,13281,6951, 12786,25316,22560,36733, 3782, 27519,3994, 23925,3804, 10676,6535, 7380, 11836,17659,28198,11688,31982,37216,14264,38975,15407,12445,13258,41990,20252,7016, 3122, 18058,25601,12543,27748, - 33903,36439,28014,37618,31952,4390, 9407, 37822,20519,34960,15432,20518,26613,32536,9244, 38701,31951,38889,23872,22727,37194,16475,7630, 28593,32804,38652,7273, + 33903,36439,28014,37618,31952,4390, 9407, 37822,20519,34960,15432,20518,26613,32536,9244, 38701,31951,38889,23872,22727,37194,16475,7630, 28593,32804,38652,7273, 16735,11513,2518, 12494,1286, 9998, 5202, 4476, 7065, 12706,18589,34793,2649, 7964, 6326, 19117,38596,6066, 15628,11866,39070,32926,37491,17860,18187,37821,24536, 35359,14263,1814, 613, 16125,41990,33466,36873,5007, 11249,37821,26929,36439,19227,39575,34465,37821,37821,34465,41989,15504,35359,36439,41989,41989,30086,35359, 38704,9806, 41989,5774, 8592, 11181,19116,22577,39575,32845,11681,20681,30040,36438,12083,18514,3125, 30080,31950,23406,38401,38017,851, 7263, 28049,19905,11036, 27651,38585,14262,4297, 8885, 35487,38805,37820,8053, 8884, 11442,37820,39198,1127, 18539,2321, 1952, 10054,16891,10413,3905, 13512,29074,11261,21153,5720, 37097, 3792, 3629, 22894,14502,9393, 36303,33642,2393, 3904, 34685,37701,7598, 19504,39574,5715, 41988,23405,31261,3321, 34465,7566, 8447, 10672,16124,33894,3993, 19115, 36160,3031, 17960,2520, 4652, 4559, 1601, 1151, 12703,7433, 3097, 24936,20517,33637,22126,6145, 39574,6803, 13740,7799, 13257,37958,37713,10374,34896,33620,14411, - 23868,8052, 24478,36397,3289, 33726,33966,19358,795, 33726,22468,32590,3380, 32932,15766,31819,37416,11547,7491, 34175,34497,32984,33087,28598,1643, 6802, 5589, + 23868,8052, 24478,36397,3289, 33726,33966,19358,795, 33726,22468,32590,3380, 32932,15766,31819,37416,11547,7491, 34175,34497,32984,33087,28598,1643, 6802, 5589, 19114,12082,2867, 9997, 24556,6771, 35840,25329,38608,1145, 34695,305, 9603, 2993, 6253, 821, 3794, 7953, 3907, 4662, 1571, 33725,2767, 35271,30625,24148,16981, 2803, 2146, 13739,6317, 5533, 20516,19113,20872,33087,34465,41988,15533,5480, 3757, 31694,2929, 191, 39069,9406, 1413, 3658, 17875,6433, 13886,13799,37820,36438, 15133,35852,15902,1529, 41988,41988,33725,34464,6496, 18497,36704,24038,655, 19112,27236,37193,17787,3485, 37820,29489,20515,6514, 17215,36438,3156, 16349,10737, 1951, 18326,14089,12444,14088,984, 5459, 5491, 4081, 28950,35493,13083,11106,31949,30085,28416,36553,37819,39169,18325,33086,18324,5655, 20253,2862, 36438,41987, - 41987,2298, 320, 11961,39301,35577,11105,21644,27742,14419,4063, 3513, 5566, 33144,13256,14856,15797,5773, 33763,20871,29038,35247,32588,22467,22000,32065,885, + 41987,2298, 320, 11961,39301,35577,11105,21644,27742,14419,4063, 3513, 5566, 33144,13256,14856,15797,5773, 33763,20871,29038,35247,32588,22467,22000,32065,885, 22577,2764, 13544,19373,1374, 5630, 8591, 7597, 38151,23541,5831, 33392,33348,11235,33725,33086,22142,9198, 33046,17950,18740,22466,4398, 5168, 37819,211, 13908, - 14531,15294,10214,11966,41987,6271, 6035, 41987,28415,39574,37819,13197,33535,15132,6090, 7101, 6735, 16980,6924, 4977, 25612,11965,1386, 25937,16979,3127, 3996, - 3443, 10607,33725,5980, 26467,41986,39574,28414,34691,4780, 17984,36526,10911,30296,537, 579, 20514,24468,20168,5533, 41986,18229,11441,39573,14770,2327, 3509, + 14531,15294,10214,11966,41987,6271, 6035, 41987,28415,39574,37819,13197,33535,15132,6090, 7101, 6735, 16980,6924, 4977, 25612,11965,1386, 25937,16979,3127, 3996, + 3443, 10607,33725,5980, 26467,41986,39574,28414,34691,4780, 17984,36526,10911,30296,537, 579, 20514,24468,20168,5533, 41986,18229,11441,39573,14770,2327, 3509, 17949,36437,15406,39573,13738,25500,35359,35358,20870,39573,8499, 36437,30259,37112,39573,41986,16754,41986,41985,36437,31647,22465,72, 21821,6801, 4311, 17715, 2503, 30500,10209,36437,2988, 16753,1142, 7201, 3373, 19111,6820, 38917,11751,11750,5227, 1582, 28809,20167,14785,6206, 16123,2897, 18879,33724,37819,39218,12698, 14879,9805, 11440,37818,41985,41985,31948,39572,17214,33724,33086,1755, 7014, 10671,32857,6074, 8805, 12036,3188, 29681,2621, 30084,39572,20513,41985,20166,39572, 34604,10417,33433,10246,33086,15131,8172, 30083,13439,6950, 35171,9488, 879, 546, 26633,9344, 9691, 15215,13255,15543,799, 8993, 28413,11104,10208,16523,37155, 11315,5890, 37464,23767,11764,10361,6524, 14132,21020,25611,20414,4169, 20480,34754,7171, 10400,8735, 20259,19970,11749,39266,28646,37800,41984,37818,16978,11067, 34793,37214,1706, 24774,7708, 178, 4994, 24902,18605,26069,31037,39046,7722, 24383,1357, 5943, 28109,59, 6258, 32570,8837, 22842,9602, 7439, 3431, 41984,36436, - 28869,18014,1091, 34439,13229,6116, 5532, 8789, 34258,15503,12139,38428,24162,2216, 16122,2045, 33724,41984,8014, 6686, 28412,1894, 3536, 36436,33724,41984,9804, + 28869,18014,1091, 34439,13229,6116, 5532, 8789, 34258,15503,12139,38428,24162,2216, 16122,2045, 33724,41984,8014, 6686, 28412,1894, 3536, 36436,33724,41984,9804, 37941,1864, 34483,2107, 33161,1594, 15786,8249, 2769, 20204,19010,35164,15210,10670,20512,1996, 19503,37818,14769,12940,19110,39572,39571,34464,16121,36436,41983, - 14418,36436,14768,28730,36764,591, 18422,39571,31178,17616,35275,3254, 38093,35536,15405,24928,19109,2031, 8051, 4781, 30519,17714,25538,3136, 8752, 268, 8680, + 14418,36436,14768,28730,36764,591, 18422,39571,31178,17616,35275,3254, 38093,35536,15405,24928,19109,2031, 8051, 4781, 30519,17714,25538,3136, 8752, 268, 8680, 30666,33217,36435,9288, 26067,22968,20660,41983,37818,683, 22752,1815, 1959, 5932, 12841,2713, 23099,14097,10669,32026,1090, 41983,41983,31947,1351, 22995,24490, 14087,15901,33085,41982,22018,19561,1653, 27429,37817,7180, 34449,377, 4391, 23280,9629, 28946,13116,3227, 11439,38332,12108,19859,8511, 33508,17009,38709,39571, 27758,1292, 28578,32628,7916, 13775,2778, 5414, 4731, 23404,31946,5376, 1777, 12782,35492,6970, 886, 10019,35646,3857, 41982,10973,20380,37817,1076, 6014, 30632, - 36435,12840,33715,23403,10207,10668,15284,11679,3434, 5690, 232, 24467,12440,3432, 16977,39242,5242, 20511,31029,18341,16412,5996, 13737,11438,38553,37013,220, - 14784,28858,6692, 9081, 569, 25360,4759, 33036,35358,33250,33085,41982,8128, 38699,1695, 3121, 2163, 3454, 6034, 3638, 3813, 34464,35961,39018,437, 28421,5356, + 36435,12840,33715,23403,10207,10668,15284,11679,3434, 5690, 232, 24467,12440,3432, 16977,39242,5242, 20511,31029,18341,16412,5996, 13737,11438,38553,37013,220, + 14784,28858,6692, 9081, 569, 25360,4759, 33036,35358,33250,33085,41982,8128, 38699,1695, 3121, 2163, 3454, 6034, 3638, 3813, 34464,35961,39018,437, 28421,5356, 1991, 2079, 5565, 17948,13039,4682, 6255, 41982,41981,9269, 24466,16325,41981,19502,35358,11437,3714, 11566,15948,5970, 16120,19108,20510,34846,36435,34919,27566, - 14767,22527,17947,12839,16976,19107,16119,41981,9268, 11748,888, 39062,20958,13254,11549,8065, 19571,37547,12439,39571,11747,13253,27136,8734, 37432,18105,1546, - 15203,34464,28436,35621,36992,35126,38247,931, 275, 837, 33735,38015,2110, 2263, 1452, 967, 18012,261, 1605, 4063, 36651,5647, 751, 22464,37817,39570,5885, + 14767,22527,17947,12839,16976,19107,16119,41981,9268, 11748,888, 39062,20958,13254,11549,8065, 19571,37547,12439,39571,11747,13253,27136,8734, 37432,18105,1546, + 15203,34464,28436,35621,36992,35126,38247,931, 275, 837, 33735,38015,2110, 2263, 1452, 967, 18012,261, 1605, 4063, 36651,5647, 751, 22464,37817,39570,5885, 5478, 37886,41981,18393,38563,15404,41980,25207,14920,13252,11451,25565,25401,3459, 308, 10444,35531,4447, 2762, 27595,7973, 13075,566, 21620,4579, 8107, 20251, 41980,24465,36098,20165,2546, 9170, 9574, 27601,2133, 11288,31201,6599, 12748,1690, 11355,5511, 29229,19884,34543,28246,3781, 12188,4848, 9996, 34886,34253,14783, 26504,18750,39570,13291,24611,11448,20493,39341,28023,41980,5241, 33431,30311,277, 37945,18466,16612,13261,21135,1262, 4560, 7557, 9476, 2643, 1367, 625, 31841, 30556,1631, 4586, 7937, 9405, 5214, 22244,2029, 7270, 15884,35815,25610,8151, 3854, 9116, 4809, 37752,15582,20489,29807,8852, 39570,29071,37817,37816,328, 19588, 4306, 9608, 12111,7520, 5316, 35023,7490, 9224, 7032, 13757,865, 30838,38950,37816,24983,25184,39570,15564,9803, 41980,37816,41979,28690,32758,33828,33685,15323, 17113,28118,25393,34465,7139, 35583,4202, 27470,14392,30264,27893,9246, 10443,32521,5826, 16118,1473, 32656,10130,35992,41979,11675,12715,3947, 956, 5087, 41979, - 25760,15403,343, 762, 1972, 3241, 29301,8399, 29530,12591,24233,10667,1580, 934, 5650, 8972, 4858, 2549, 1265, 26994,3635, 5126, 37595,8883, 3596, 19106,5994, + 25760,15403,343, 762, 1972, 3241, 29301,8399, 29530,12591,24233,10667,1580, 934, 5650, 8972, 4858, 2549, 1265, 26994,3635, 5126, 37595,8883, 3596, 19106,5994, 5922, 15241,13736,33031,9623, 35515,21412,16614,39569,5251, 20712,20276,17772,34393,34353,28712,33723,16372,31424,29657,10967,3934, 3138, 33295,26045,34749,16117, 8482, 37816,5941, 5695, 19187,39569,889, 19105,12081,38333,36660,10459,5629, 3704, 27246,38085,35113,12338,11981,26642,15595,6971, 37958,6144, 12884,10430,24334, 6505, 5874, 10173,20730,33992,14782,1706, 2569, 1307, 636, 11725,7291, 4713, 14781,38120,39011,2781, 24113,33085,41979,37403,13099,8986, 37815,35358,19104,30941, 19392,38833,7603, 6571, 3821, 4971, 20911,18121,23695,26589,19103,7544, 2099, 3507, 1968, 882, 6126, 4062, 3576, 19604,20509,16975,11564,28332,15502,17946,26928, - 19102,30082,38212,5559, 8440, 12653,35041,17945,35246,5588, 4361, 5630, 31808,30308,37432,36997,27040,5344, 20508,41978,23136,34463,41978,16974,22506,36130,4623, + 19102,30082,38212,5559, 8440, 12653,35041,17945,35246,5588, 4361, 5630, 31808,30308,37432,36997,27040,5344, 20508,41978,23136,34463,41978,16974,22506,36130,4623, 4281, 6217, 7290, 3548, 11162,4961, 16973,7096, 38287,29047,41978,34471,36691,41978,24464,10910,37633,35033,26656,37815,36852,31945,4098, 38181,18389,6428, 18177, - 17722,5940, 16116,32923,5498, 10685,31944,15130,35309,5124, 8932, 6542, 41977,3453, 12846,32994,36296,8795, 34920,36275,34280,24533,13735,26618,3903, 8048, 5518, - 7310, 15645,32863,22707,39229,28254,38130,3850, 7823, 39363,39569,30081,41977,39569,33554,32691,33706,15919,22901,22431,527, 1866, 20507,30393,19101,1302, 1072, - 26168,21115,10482,2303, 4384, 7487, 34068,12838,5495, 9404, 35718,27913,1603, 35073,2877, 36087,34295,26478,37798,30201,33675,2378, 2710, 10705,6558, 20506,5945, + 17722,5940, 16116,32923,5498, 10685,31944,15130,35309,5124, 8932, 6542, 41977,3453, 12846,32994,36296,8795, 34920,36275,34280,24533,13735,26618,3903, 8048, 5518, + 7310, 15645,32863,22707,39229,28254,38130,3850, 7823, 39363,39569,30081,41977,39569,33554,32691,33706,15919,22901,22431,527, 1866, 20507,30393,19101,1302, 1072, + 26168,21115,10482,2303, 4384, 7487, 34068,12838,5495, 9404, 35718,27913,1603, 35073,2877, 36087,34295,26478,37798,30201,33675,2378, 2710, 10705,6558, 20506,5945, 23393,4634, 7031, 11746,2742, 1642, 31943,39420,20164,41977,36435,33874,5495, 3098, 6024, 33774,5006, 34690,37699,12352,20089,18854,8274, 24164,3115, 6878, 23444, - 21226,26399,25427,34060,11053,24270,35103,29073,12242,29766,33581,20869,34463,37815,31942,647, 11745,12837,19100,27041,7596, 37815,4969, 24463,14261,10245,6621, - 32808,32906,36697,26927,19099,39568,604, 35357,1461, 2409, 6588, 14417,7469, 5310, 23402,41977,18878,8804, 41976,15402,6800, 10836,2323, 544, 509, 17871,4131, + 21226,26399,25427,34060,11053,24270,35103,29073,12242,29766,33581,20869,34463,37815,31942,647, 11745,12837,19100,27041,7596, 37815,4969, 24463,14261,10245,6621, + 32808,32906,36697,26927,19099,39568,604, 35357,1461, 2409, 6588, 14417,7469, 5310, 23402,41977,18878,8804, 41976,15402,6800, 10836,2323, 544, 509, 17871,4131, 2847, 19649,3770, 3939, 750, 32413,27428,1140, 5311, 379, 2153, 19666,27019,1373, 22414,34979,37814,33723,3253, 41976,41976,37814,3281, 4001, 16843,33094,19300, 3091, 21340,20816,36434,13686,35024,9995, 11744,7595, 37906,4813, 6447, 25563,8050, 17944,41976,3320, 38624,41975,33085,22463,33723,15900,9952, 8882, 3859, 32816, 11180,31941,21643,23817,20227,13462,26042,3699, 16115,2856, 37529,4729, 28787,36434,35357,34463,39568,8178, 10736,1496, 31940,7197, 34463,15247,39385,17943,34659, - 11103,35357,12836,970, 35357,41975,30080,1878, 37814,14676,39568,33084,31939,543, 41975,19501,33723,8177, 36434,34597,11964,36780,24462,12438,35356,19098,9960, + 11103,35357,12836,970, 35357,41975,30080,1878, 37814,14676,39568,33084,31939,543, 41975,19501,33723,8177, 36434,34597,11964,36780,24462,12438,35356,19098,9960, 16986,38943,34917,30079,28411,34462,37814,39568,33084,3534, 3688, 14772,37813,38363,37064,34635,35356,36434,36433,37813,31938,37813,21907,34273,39567,3207, 41975, 9802, 25609,41974,31937,6799, 38134,928, 37813,35356,39567,33184,39567,33084,30448,17861,34862,41974,37812,36479,35356,39567,41974,21642,12697,39566,34462,34462, 35687,37265,16338,38223,34336,38206,31703,15620,14046,13262,15313,24293,33673,33921,30204,25997,30783,28003,35166,21391,35406,35323,18531,18123,17763,23308,34756, 27973,22106,29688,22403,23456,24911,38777,26004,21251,22022,26315,38351,38334,35352,37863,37941,30745,27673,26650,28456,33477,18469,16650,17923,15781,20056,35768, - 33200,34268,31781,33732,35282,36400,35823,36907,36650,38356,35294,35032,35112,34920,35319,39374,38614,9931, 14741,20526,9947, 18046,10666,20505,39566,24235,6809, + 33200,34268,31781,33732,35282,36400,35823,36907,36650,38356,35294,35032,35112,34920,35319,39374,38614,9931, 14741,20526,9947, 18046,10666,20505,39566,24235,6809, 34596,36883,37710,20033,4923, 31365,12790,38236,34508,25043,34501,38687,7777, 34143,23067,26167,41974,35468,23600,37544,19430,38444,14916,36493,19027,39566,25167, 32369,18701,38808,12835,3794, 14267,33396,41973,41973,21474,3059, 23998,5772, 4125, 23257,6562, 36988,3559, 1897, 6270, 6446, 2457, 25449,14260,10665,9500, 10403, 634, 10307,32915,32567,20240,11339,19312,36627,14170,34571,19097,9994, 35519,20504,36186,37974,39168,19630,2982, 8733, 5281, 8587, 2362, 32507,37445,4588, 12437, 25991,19096,32753,39217,11743,38472,7798, 20931,15401,37890,16972,38405,10622,3038, 19095,34781,30430,38499,15386,38435,7120, 21641,34133,17713,34176,41973,39566, 16363,38548,20503,21680,29406,28945,24545,36241,34554,12826,14689,25357,15004,17816,8164, 35355,17203,38654,14971,14766,3887, 23469,5984, 8176, 30910,17942,12080, - 34087,144, 36009,23668,19094,26559,1246, 1477, 37783,32367,15088,38811,8175, 36602,2699, 18879,8310, 29721,2411, 33405,33317,33188,3549, 205, 2284, 3358, 4139, + 34087,144, 36009,23668,19094,26559,1246, 1477, 37783,32367,15088,38811,8175, 36602,2699, 18879,8310, 29721,2411, 33405,33317,33188,3549, 205, 2284, 3358, 4139, 1434, 15431,30610,32796,7905, 33722,12256,34462,15129,26926,36433,24461,13502,10575,16971,39565,37432,36433,20163,37812,39565,5771, 10442,20502,41973,852, 31936, 30789,37812,28352,3021, 32371,2657, 27207,20501,5312, 7075, 7489, 41972,13845,22265,20500,34461,30194,33885,21225,27631,9444, 6656, 23319,16114,16970,35355,33084, - 37812,41972,2766, 8462, 23401,39565,1802, 27109,14690,37811,21640,35355,39393,4161, 39388,29066,9080, 39565,41972,6620, 39564,3952, 23400,37811,12436,34281,5689, + 37812,41972,2766, 8462, 23401,39565,1802, 27109,14690,37811,21640,35355,39393,4161, 39388,29066,9080, 39565,41972,6620, 39564,3952, 23400,37811,12436,34281,5689, 3609, 23959,4868, 5147, 36140,24047,39564,33722,9194, 613, 23486,21639,30078,5947, 12939,33083,5857, 18031,19467,8881, 36433,41972,41971,41971,37811,39564,37811, 10912,33149,29311,41971,10854,39564,36363,35355,20162,28545,34641,3793, 10909,36661,27284,20499,9079, 21124,10454,25608,11696,19003,31381,34826,31935,33701,35354, 6948, 31934,37810,35354,39563,36432,39563,37810,33944,36432,16752,2797, 33517,6553, 30077,34461,36432,34461,544, 33083,33722,36432,28410,41971,35499,895, 35354, 2203, 34461,11682,3505, 28238,1868, 37810,39563,9993, 1320, 12585,10574,25607,10329,36311,36431,39563,20498,2906, 9031, 20517,41970,34460,7861, 12802,37486,26925, 5628, 37808,8653, 36276,35478,38969,37597,15501,3419, 32861,15400,36603,37671,1837, 18838,9713, 16324,33551,36431,30559,37810,37809,31994,34460,6058, 35069,34460, - 41970,7586, 34460,18119,28056,11436,27648,33428,8007, 16969,16113,34459,21638,2894, 4631, 5256, 34459,5146, 17941,4080, 32804,28046,19662,371, 3796, 23409,3722, + 41970,7586, 34460,18119,28056,11436,27648,33428,8007, 16969,16113,34459,21638,2894, 4631, 5256, 34459,5146, 17941,4080, 32804,28046,19662,371, 3796, 23409,3722, 4990, 6143, 25219,35596,38555,7045, 31913,1595, 19093,3658, 38209,5494, 36435,4194, 10908,9992, 33628,38317,9797, 13734,14512,14020,7119, 10441,34585,37716,27260, - 16803,16068,41970,20868,6267, 20611,15128,16968,33193,19152,14251,41970,2225, 10907,2731, 1325, 12834,4235, 2156, 11086,20497,11134,35354,3376, 6593, 23746,2293, + 16803,16068,41970,20868,6267, 20611,15128,16968,33193,19152,14251,41970,2225, 10907,2731, 1325, 12834,4235, 2156, 11086,20497,11134,35354,3376, 6593, 23746,2293, 6724, 5172, 13177,1745, 22564,1265, 6216, 20932,14742,36573,22092,12079,6117, 21109,9699, 18160,36567,23568,8340, 26647,14259,41969,22170,18230,24815,14871,12833, - 11742,33083,35353,41969,7797, 20100,25330,31244,33542,19490,37425,3858, 2543, 6325, 36431,39562,14042,3338, 9078, 30747,20402,5939, 17102,1878, 36276,33722,1868, + 11742,33083,35353,41969,7797, 20100,25330,31244,33542,19490,37425,3858, 2543, 6325, 36431,39562,14042,3338, 9078, 30747,20402,5939, 17102,1878, 36276,33722,1868, 5680, 31118,32496,5423, 8730, 15845,2348, 13445,3030, 33585,33979,11135,38313,19915,34263,33930,41969,10915,36136,26318,19092,39562,1301, 39562,1694, 1065, 15030, - 16766,6720, 4676, 32956,13478,35353,15500,26924,2821, 21637,2131, 1536, 22523,16967,20496,26734,23288,33078,4175, 33375,16966,9403, 41969,19500,26727,9601, 9600, + 16766,6720, 4676, 32956,13478,35353,15500,26924,2821, 21637,2131, 1536, 22523,16967,20496,26734,23288,33078,4175, 33375,16966,9403, 41969,19500,26727,9601, 9600, 15852,10519,18317,14258,10955,9763, 13095,20495,36576,7832, 19270,26867,31271,28820,30496,14416,21636,35286,35558,29963,10553,16965,34399,16203,6033, 39562,26923, 7013, 41968,34596,37809,30076,31601,35180,2453, 39155,29665,38999,37809,36663,5167, 135, 21995,4544, 23935,14276,24250,23583,29407,26000,31801,33032,14304,31933, - 33385,9238, 11576,24305,22517,1043, 30247,21826,12078,6215, 1758, 38430,11963,32378,14257,16112,28409,1487, 15899,11506,5264, 10906,26922,6620, 33083,35119,9435, + 33385,9238, 11576,24305,22517,1043, 30247,21826,12078,6215, 1758, 38430,11963,32378,14257,16112,28409,1487, 15899,11506,5264, 10906,26922,6620, 33083,35119,9435, 2522, 3411, 35103,21282,11717,4296, 3473, 7947, 35497,31932,18323,10399,37809,35353,35353,36431,19091,26921,31177,35031,36428,38980,20867,35109,36013,36430,17940, - 21635,1448, 37808,4543, 15306,39561,17939,23399,33082,15006,10735,772, 34854,17213,33082,36430,30893,1243, 10005,17938,5133, 13251,1245, 23167,18808,34463,5396, + 21635,1448, 37808,4543, 15306,39561,17939,23399,33082,15006,10735,772, 34854,17213,33082,36430,30893,1243, 10005,17938,5133, 13251,1245, 23167,18808,34463,5396, 35674,7091, 7689, 34266,35386,4684, 37131,38874,18322,41968,28408,37950,3780, 15896,3250, 2359, 860, 6614, 25, 578, 20408,19943,23129,3801, 7096, 18345,32844, - 15250,24927,33070,7355, 24675,24991,1573, 14805,28936,22330,18953,19569,712, 7831, 10333,16461,28693,25378,14250,17628,8983, 16256,29938,9224, 7111, 3283, 1084, + 15250,24927,33070,7355, 24675,24991,1573, 14805,28936,22330,18953,19569,712, 7831, 10333,16461,28693,25378,14250,17628,8983, 16256,29938,9224, 7111, 3283, 1084, 14445,35352,6336, 20832,137, 20494,7620, 20161,39561,18716,32783,14893,25322,18200,16523,37808,14815,39237,41968,17712,33713,39561,22462,36947,8391, 2599, 34459, 1317, 10095,32369,31003,23041,33499,12435,1526, 20608,10094,23126,16964,1647, 35750,5167, 692, 41968,8446, 20493,11179,30075,41967,28407,39561,34098,33311,39560, - 33124,29791,34459,36430,17711,41967,3022, 12077,6214, 13733,27454,31535,19919,36194,20493,11540,12210,26751,36430,31373,34686,8013, 14086,37808,39560,41967,7480, + 33124,29791,34459,36430,17711,41967,3022, 12077,6214, 13733,27454,31535,19919,36194,20493,11540,12210,26751,36430,31373,34686,8013, 14086,37808,39560,41967,7480, 34458,38011,36429,41967,16369,41966,32086,41966,36039,17937,13732,12322,11741,25998,39560,14415,1920, 12434,4457, 17513,16682,33614,35660,39560,12887,9146, 30074, 6186, 13793,13258,22461,21418,36531,773, 7846, 25545,12849,16598,16186,8093, 16591,37831,27133,34458,17936,39295,33367,7442, 34938,25212,34262,22770,27524,15399, 21041,28727,16963,12696,32103,41966,30078,15398,35079,36214,24219,36098,18837,38835,35352,41966,33082,23169,17697,39179,37824,34547,1363, 24511,26700,36429,39559, @@ -18048,80 +18043,80 @@ static const unsigned short Ranks[197839] = 33728,12180,36690,21541,31746,34354,15096,4949, 16178,36725,37618,1158, 19013,19315,1777, 7279, 19096,35500,35557,6784, 37975,21197,721, 20759,8115, 16742,32771, 6517, 27303,19585,15969,30943,28884,7849, 9857, 15698,17263,19532,8539, 848, 27157,22052,19118,27374,14332,4280, 31, 3016, 24803,2483, 839, 21624,23437,31886, 26815,18807,1306, 239, 7308, 16711,3602, 1681, 8540, 25701,19529,4976, 14116,19797,21530,13018,226, 15324,8656, 6818, 19680,11294,32322,24871,10488,1138, 25249, - 9955, 3044, 21255,11451,14200,12716,16421,29229,14604,10684,39140,33015,35861,5688, 15310,14821,6537, 2291, 3442, 20147,3205, 36484,36275,25442,33602,35297,6443, + 9955, 3044, 21255,11451,14200,12716,16421,29229,14604,10684,39140,33015,35861,5688, 15310,14821,6537, 2291, 3442, 20147,3205, 36484,36275,25442,33602,35297,6443, 38968,3105, 16362,16168,3312, 35682,23075,19287,19888,14208,28025,6819, 17508,14772,11305,29248,31347,20398,6688, 13170,12611,12651,30612,720, 14360,29485,25771, 22819,9948, 3829, 9933, 12580,29183,27279,5098, 14286,6260, 19443,19719,16315,17138,28282,25530,11900,14699,32050,25353,37807,7101, 3695, 7743, 24394,28003,38152, 14780,7376, 6619, 39559,41965,28020,10792,36923,22179,9796, 20492,35532,34876,10162,26459,37446,29527,36297,34101,18226,37713,36143,37044,35675,11337,26981,33300, 33474,36086,34616,38004,39559,41964,35352,15792,13731,25156,6032, 26920,11435,33082,31762,30073,5884, 24460,20491,38054,6444, 13164,13244,6989, 33081,6616, 38433, - 9223, 29836,14779,38180,19415,31931,19499,41964,35730,2664, 5317, 1593, 6341, 6997, 5938, 2681, 1966, 10231,28411,3456, 880, 11581,37807,36429,2130, 15397,9392, + 9223, 29836,14779,38180,19415,31931,19499,41964,35730,2664, 5317, 1593, 6341, 6997, 5938, 2681, 1966, 10231,28411,3456, 880, 11581,37807,36429,2130, 15397,9392, 39559,41964,3015, 37354,31930,36706,12433,34458,30072,37081,11962,11142,37807,41964,23398,17658,6802, 30788,39558,23017,8732, 35661,19794,17466,33593,32899,36508, 15922,31026,7184, 26349,4292, 4182, 18880,28626,33817,2583, 15496,30017,30839,35212,20866,5539, 14256,34458,23053,11441,17468,2048, 33721,6798, 19090,20490,41963, - 31428,18833,36348,13176,9054, 4877, 14900,36627,7594, 36429,41963,1139, 2972, 11879,30060,16093,10201,35908,4988, 34427,4749, 1788, 3627, 10911,10196,2735, 3536, + 31428,18833,36348,13176,9054, 4877, 14900,36627,7594, 36429,41963,1139, 2972, 11879,30060,16093,10201,35908,4988, 34427,4749, 1788, 3627, 10911,10196,2735, 3536, 13202,34237,26960,41963,41963,17428,30071,41962,2698, 27635,19400,4475, 33291,41962,33461,19894,17710,41962,6603, 29913,16962,12443,35352,24996,13749,27603,25767, 31929,32956,34145,36428,21039,35214,41962,20243,7831, 33081,2412, 17980,25606,31928,38337,34457,7970, 39558,11285,20771,33481,34289,33143,34971,35415,36292,25390, 3076, 30070,39558,28558,35351,8049, 26087,1578, 33688,11951,36715,20161,35922,41961,9654, 33801,15396,35351,691, 6581, 28405,25420,21397,13682,37026,37114,15898, 1927, 2718, 24637,30869,38312,34116,37264,35711,1725, 37523,29948,34996,16160,26439,19740,26802,4473, 12832,29894,28404,20489,35351,37807,13811,36428,16961,26220, 16960,17935,16323,33136,35300,41961,20488,35013,29360,35351,39558,484, 33535,41961,28403,32967,33721,41961,9962, 16959,16787,37806,29784,39557,29035,11442,41960, 26919,41960,37645,16322,39557,30069,8936, 34928,20487,4832, 8461, 14765,17709,24459,37676,3194, 7589, 348, 5413, 3394, 1951, 10440,21605,507, 38191,27814,14219, - 17934,15068,41960,11302,33562,35197,10038,37134,35174,20474,28632,7915, 41960,2071, 34457,41959,9522, 36428,2113, 38420,12076,34049,41959,9077, 20486,41959,727, + 17934,15068,41960,11302,33562,35197,10038,37134,35174,20474,28632,7915, 41960,2071, 34457,41959,9522, 36428,2113, 38420,12076,34049,41959,9077, 20486,41959,727, 11684,33081,14698,37146,35842,3523, 8307, 6378, 30068,927, 32934,39557,15041,8880, 37806,14493,12317,25433,30324,5687, 41959,29431,35350,34457,41958,19089,15395, 34026,670, 20831,8879, 38465,23848,2905, 33038,39557,34099,18877,21634,2219, 39556,10573,7479, 19498,33663,27858,19081,37806,5490, 31927,34457,41958,13774,41958, 3913, 39556,35350,39556,35350,39556,17212,39555,41958,33610,27521,32872,6797, 36589,36597,19088,19087,34456,4334, 34456,32372,13196,36428,35062,18876,9076, 39555, - 31317,39555,35350,22810,571, 37657,21550,33721,17933,35349,3713, 21633,39555,37806,41957,365, 30470,41957,36427,13477,22460,25591,31926,36574,1027, 3570, 8556, + 31317,39555,35350,22810,571, 37657,21550,33721,17933,35349,3713, 21633,39555,37806,41957,365, 30470,41957,36427,13477,22460,25591,31926,36574,1027, 3570, 8556, 20160,27667,15127,1136, 14414,41957,2144, 39554,41957,37805,35065,39554,34456,30160,21632,1130, 21631,34040,16958,35380,8182, 37026,35971,830, 15499,512, 36427, 19086,35123,13730,14617,33081,35349,34849,21255,16111,29031,41956,41956,33080,31836,36427,39235,39554,26918,23740,36907,10734,5263, 35763,9795, 8731, 9540, 11102, 1919, 10572,27528,31925,12695,805, 406, 41956,35349,41956,33634,10900,5727, 7196, 16957,16956,3206, 41955,41955,41955,15394,11740,31924,41955,8174, 27846,12287, 3030, 6324, 34456,10439,16110,33046,36365,11178,19085,27440,37790,39554,4755, 20501,33301,14255,30560,13773,30197,10206,34445,10862,34455,7192, 7843, 11990,10492, 10898,2481, 3148, 5719, 19084,11498,34263,6949, 18562,8169, 27051,38509,33721,7797, 23805,27793,17729,38820,37261,35501,20120,37100,3072, 36620,17826,11753,25626, - 6594, 12589,17920,30060,28742,14846,229, 18152,27988,7894, 10536,26583,24268,20879,501, 32774,25536,18848,22697,11448,4067, 15281,5349, 23124,9988, 14901,517, + 6594, 12589,17920,30060,28742,14846,229, 18152,27988,7894, 10536,26583,24268,20879,501, 32774,25536,18848,22697,11448,4067, 15281,5349, 23124,9988, 14901,517, 24297,15445,3207, 18850,6257, 442, 12351,33077,6023, 12823,4774, 7120, 8339, 13934,19417,29204,338, 23630,9720, 27027,3980, 25273,2390, 139, 13303,10520,28182, 19447,1524, 5967, 10091,325, 2337, 9066, 1674, 17898,3902, 4991, 17991,16870,27617,10125,29606,25553,23282,4, 30091,10668,22047,17673,25943,387, 15805,27579, - 3837, 18094,492, 220, 2497, 1264, 1858, 12497,6307, 8243, 16349,11487,10370,18832,17164,26338,15480,18619,28406,12966,33024,12084,12450,16826,18630,4199, 8857, + 3837, 18094,492, 220, 2497, 1264, 1858, 12497,6307, 8243, 16349,11487,10370,18832,17164,26338,15480,18619,28406,12966,33024,12084,12450,16826,18630,4199, 8857, 8816, 7544, 26057,27317,15469,16567,7845, 28071,20545,18222,10043,432, 12079,26884,12244,264, 31649,1848, 22, 14538,25158,29392,13916,26472,24294,13174,23881, 1541, 23756,9290, 24558,11830,30616,24419,15471,9304, 32828,24971,16262,19085,20060,19466,33829,33681,33041,36208,36085,23379,36968,36397,35862,37840,10904,14110, 23138,17350,13839,5798, 8729, 2377, 13393,18408,8234, 23837,22848,6557, 11505,33255,7768, 39093,36358,35474,12938,36510,14413,34639,33398,22459,36324,34455,14412, 38090,41954,20160,19083,39553,20485,35349,34455,16549,17148,7256, 37843,28923,34673,32457,41954,2719, 26155,11386,10979,8351, 171, 5901, 32093,24869,28868,17781, 5468, 15293,4923, 6556, 41954,41954,39553,32876,35348,39553,37805,34455,41953,31923,33720,37805,8224, 37805,41953,20601,34917,7593, 7170, 39553,7388, 35348,13832, 28760,18708,35348,30067,7100, 32048,41953,41953,39552,37804,34561,24458,37804,8012, 20159,2726, 39388,24457,41952,39552,20865,24456,41952,4573, 39256,20864,39552, - 35348,20863,10272,14254,373, 1070, 26723,22289,16193,6056, 38305,4837, 37804,22578,8595, 19385,32035,29080,32868,35251,2626, 6624, 27057,6486, 1490, 25367,869, + 35348,20863,10272,14254,373, 1070, 26723,22289,16193,6056, 38305,4837, 37804,22578,8595, 19385,32035,29080,32868,35251,2626, 6624, 27057,6486, 1490, 25367,869, 9688, 31891,14085,8102, 20158,2229, 38013,392, 21994,3197, 39552,10441,1029, 79, 33031,2911, 22361,32712,2188, 2058, 582, 24455,37804,19932,33542,34454,16815, 37617,1619, 10437,30369,17211,37803,20484,39551,4516, 443, 17370,30066,41952,5204, 4812, 20483,39551,41952,3021, 36608,13250,12937,4653, 16955,8048, 11434,37803, 20862,34454,8878, 5040, 26917,41951,39551,9402, 20861,37633,8716, 1750, 9075, 8877, 34209,14778,21630,41951,24454,33720,36427,11035,13772,14236,30065,31922,37880, 37624,1463, 7181, 30177,11217,33720,37904,5761, 4922, 35770,25605,35347,39551,39550,41951,30064,18875,36426,41951,26440,39550,13476,37803,5489, 34454,39550,33578, - 5655, 1820, 41950,37841,1958, 10803,25118,25468,38495,6015, 18662,24059,20482,38038,9883, 32466,7030, 32618,19099,13945,28840,13754,21772,2902, 38327,20569,7688, + 5655, 1820, 41950,37841,1958, 10803,25118,25468,38495,6015, 18662,24059,20482,38038,9883, 32466,7030, 32618,19099,13945,28840,13754,21772,2902, 38327,20569,7688, 20939,33008,2459, 20150,17925,33913,33694,8848, 8054, 24453,19497,22458,36426,39550,41950,18321,18438,35347,20860,285, 7925, 28554,5412, 15979,15678,9794, 37854, 34634,36530,28687,3516, 3898, 31283,32910,37151,18583,15393,37002,8876, 11914,36342,32291,38113,35161,38690,8173, 34725,39388,20348,11739,19082,39549,19081,30115, 7687, 15217,4611, 25133,8342, 23397,33720,10093,41950,23396,36426,41950,14634,21270,36355,20157,22203,23112,33755,18874,17899,36956,34355,35347,26205,17338,39549, 36426,16751,33160,38906,41949,16139,33127,37771,18320,37803,33719,35513,5039, 17097,33719,39549,37802,5902, 31784,34818,37802,28402,36425,34454,25642,41949,39549, 41949,20481,29532,37802,35536,33080,19125,41949,36134,708, 2389, 39548,30379,20823,41948,39548,31300,4862, 3262, 39548,41948,37802,34453,34453,41948,38916,34453, 2449, 33102,10364,197, 1069, 29377,39548,32155,41948,24280,37801,28401,37801,34453,745, 41947,14777,41947,13771,12936,23568,12102,20272,3396, 33719,13249,22457, - 9991, 9539, 39547,39547,16537,33719,35471,14192,33861,39547,33228,34123,4630, 15498,11433,14411,12432,15720,41947,36425,3455, 13236,30063,33718,20387,34824,2896, + 9991, 9539, 39547,39547,16537,33719,35471,14192,33861,39547,33228,34123,4630, 15498,11433,14411,12432,15720,41947,36425,3455, 13236,30063,33718,20387,34824,2896, 33718,36425,21712,28400,35347,14606,2594, 16083,30062,6057, 32083,17932,35043,8730, 9243, 32244,36280,8875, 30061,10244,34844,35852,24795,32797,20606,36425,33228, 37441,39373,8460, 4079, 35083,24452,21424,1519, 24451,9675, 41947,8812, 35743,8128, 1535, 33925,36424,39092,21629,17708,26916,34452,37327,6213, 1755, 14847,14899, 41946,2762, 41946,41946,9539, 37351,39547,37801,31528,6142, 33625,19496,24625,37801,39546,41946,11107,35742,16321,19080,37800,36152,20480,33486,41945,13614,33851, - 20156,39546,12442,5368, 36424,34289,35279,41945,35346,5003, 38377,41945,28399,35050,12270,31036,33981,6084, 20859,26915,37800,33588,2858, 29418,7003, 6898, 532, - 10062,29207,177, 32949,1661, 20630,8635, 35465,3875, 37800,36259,10571,35200,38883,41945,35346,41944,34452,14819,1089, 36808,36747,17564,14410,32310,41944,6618, - 34087,25287,5983, 15971,13729,37496,1030, 10664,12831,5297, 5796, 11284,36839,34988,331, 36147,2226, 39546,39546,23188,37800,16320,26914,36210,31242,1284, 2073, + 20156,39546,12442,5368, 36424,34289,35279,41945,35346,5003, 38377,41945,28399,35050,12270,31036,33981,6084, 20859,26915,37800,33588,2858, 29418,7003, 6898, 532, + 10062,29207,177, 32949,1661, 20630,8635, 35465,3875, 37800,36259,10571,35200,38883,41945,35346,41944,34452,14819,1089, 36808,36747,17564,14410,32310,41944,6618, + 34087,25287,5983, 15971,13729,37496,1030, 10664,12831,5297, 5796, 11284,36839,34988,331, 36147,2226, 39546,39546,23188,37800,16320,26914,36210,31242,1284, 2073, 36818,11009,8111, 39545,232, 4176, 16125,3448, 18664,5391, 13248,12075,38776,35983,26819,7927, 20479,11961,8445, 6658, 1168, 1065, 3429, 35442,31921,6920, 13020, 33718,35346,15472,33718,35160,38627,35346,9166, 36409,3841, 19449,21147,2818, 21175,34483,28398,2446, 12830,38907,14977,13475,4389, 39545,6269, 5377, 31920,39545, 7324, 33403,19979,37799,28038,2883, 26913,28397,992, 816, 6323, 17931,5373, 7686, 19079,1993, 6513, 41944,41944,17930,36527,18319,23971,1263, 18892,35345,23031, - 28396,4992, 3988, 30133,36539,34901,14996,32653,35514,35345,15530,30060,22786,41943,33877,33795,36424,25898,5948, 26218,32352,35789,35971,16003,12930,34954,9808, - 17929,22456,34006,37909,20458,12747,41943,36347,25383,16232,35993,36765,11406,29061,15412,20814,37799,11258,36424,13535,24822,8047, 13247,37799,14084,41943,6433, + 28396,4992, 3988, 30133,36539,34901,14996,32653,35514,35345,15530,30060,22786,41943,33877,33795,36424,25898,5948, 26218,32352,35789,35971,16003,12930,34954,9808, + 17929,22456,34006,37909,20458,12747,41943,36347,25383,16232,35993,36765,11406,29061,15412,20814,37799,11258,36424,13535,24822,8047, 13247,37799,14084,41943,6433, 9522, 11101,41943,8195, 38681,29214,39317,39545,32931,10905,31815,9046, 19283,36423,24191,36423,38486,35345,20858,15897,35672,36893,41942,34260,20612,41942,37799, - 36423,37294,38185,866, 29316,3685, 14071,37798,11724,32513,28322,33005,8794, 7836, 26912,39544,9538, 2836, 30382,22939,11665,39544,62, 6741, 6603, 20867,8998, - 2202, 39251,3269, 26396,8261, 22836,5437, 41942,26826,18382,6993, 13314,37798,28672,41942,4735, 37798,35592,38576,10688,20857,11043,35060,41941,39544,35479,9074, + 36423,37294,38185,866, 29316,3685, 14071,37798,11724,32513,28322,33005,8794, 7836, 26912,39544,9538, 2836, 30382,22939,11665,39544,62, 6741, 6603, 20867,8998, + 2202, 39251,3269, 26396,8261, 22836,5437, 41942,26826,18382,6993, 13314,37798,28672,41942,4735, 37798,35592,38576,10688,20857,11043,35060,41941,39544,35479,9074, 20427,12236,23177,32916,35132,38159,34452,33061,23947,27066,28395,35466,38379,32313,15743,41941,37907,12306,9859, 4339, 36401,39544,30059,12694,22455,37262,10205, 2274, 21891,16827,38323,31101,6796, 14253,2807, 5771, 16195,25154,17486,24814,35465,31919,15392,37798,34323,33717,31354,41941,30058,41941,38519,21628,41940,41940, - 26911,11738,41940,25174,39543,5415, 35345,20155,37797,6432, 19495,22454,39543,13334,16360,34725,41940,1209, 37797,30539,33090,39543,39043,19677,23395,26910,7488, + 26911,11738,41940,25174,39543,5415, 35345,20155,37797,6432, 19495,22454,39543,13334,16360,34725,41940,1209, 37797,30539,33090,39543,39043,19677,23395,26910,7488, 22900,36503,29470,27791,14764,27990,27042,36423,41939,8223, 68, 37797,398, 33717,39543,41939,5833, 41939,35647,31918,29492,37797,41939,41938,11504,26044,12829, - 12416,20478,7378, 1429, 18631,37913,33856,37796,39542,25604,39315,28394,188, 32979,290, 10345,3401, 41938,2044, 20477,132, 35344,37796,5883, 41938,41938,4384, - 33697,28911,10255,14398,14420,35611,33717,33080,39542,38678,16109,36422,37623,8768, 20856,41937,23186,41937,36422,41937,3633, 34452,4778, 36422,16190,36422,3662, + 12416,20478,7378, 1429, 18631,37913,33856,37796,39542,25604,39315,28394,188, 32979,290, 10345,3401, 41938,2044, 20477,132, 35344,37796,5883, 41938,41938,4384, + 33697,28911,10255,14398,14420,35611,33717,33080,39542,38678,16109,36422,37623,8768, 20856,41937,23186,41937,36422,41937,3633, 34452,4778, 36422,16190,36422,3662, 34435,18318,41937,28393,7830, 21627,30132,36421,2312, 28392,296, 28391,34451,20067,34709,41936,20154,33080,41936,39542,7483, 39542,41936,21626,31909,25867,39541, 11737,39541,33135,34765,7128, 33882,627, 1955, 38093,2507, 37665,41936,34776,23394,15126,36899,41935,38443,36999,33220,36215,37796,11432,37796,2860, 32773,12828, 38165,27342,9643, 16108,14606,14008,18414,13142,5804, 33535,3053, 32864,35344,12935,6617, 3254, 1814, 41935,418, 135, 5488, 2506, 8459, 680, 20109,41935,34451, 38823,671, 24451,39541,1462, 33079,9030, 26909,16750,20153,30057,39541,326, 888, 8740, 18809,35323,33647,13017,7583, 20972,35344,33079,28390,38497,36421,21795, 78, 4910, 20338,31907,32861,32037,37795,33898,3071, 33590,31917,25603,30056,21945,6717, 3003, 39540,26908,33142,3787, 16802,37166,37707,36421,416, 5818, 22216, - 36027,892, 35111,49, 12083,20528,1471, 32976,14566,17593,33014,12941,12786,28769,18947,22209,31635,21386,21702,21419,31660,28520,23094,11841,28735,161, 1973, + 36027,892, 35111,49, 12083,20528,1471, 32976,14566,17593,33014,12941,12786,28769,18947,22209,31635,21386,21702,21419,31660,28520,23094,11841,28735,161, 1973, 23578,16221,32638,2739, 29909,2384, 38657,36421,35344,14421,27598,36655,8921, 36766,38847,32149,10398,37795,41935,23194,17313,37282,39540,17095,15043,30943,36239, 1333, 36420,1174, 37795,864, 26366,1915, 3550, 4650, 2219, 15607,21886,20843,41934,21833,39540,36420,34451,10243,41934,25602,37534,37795,19078,20475,39540,31916, 35343,8341, 33717,37794,39539,41934,1596, 11723,29713,6267, 35343,41934,7195, 26907,31915,6948, 16954,25601,25886,37123,22453,36419,37099,36640,41933,4775, 35612, @@ -18133,34 +18128,34 @@ static const unsigned short Ranks[197839] = 39537,38711,11225,32824,25599,2715, 30281,869, 37793,37793,26906,15896,2685, 37793,17928,19172,7255, 1728, 36260,31864,38743,30543,19075,14663,39051,28815,36649, 35074,37009,22078,16106,41931,36419,17706,26905,22452,41930,11960,41930,4941, 39537,832, 17705,16748,33716,12692,21625,41930,35281,16747,30055,41930,16952,14328, 32179,7923, 41929,2300, 35081,33078,38361,41929,32622,39536,33078,17747,15125,2860, 9705, 12447,7797, 19651,16278,37509,2282, 17983,34093,41929,39536,8901, 41929, - 32981,39536,25598,8771, 41928,23542,33078,1607, 24579,37793,33716,23392,26661,36169,24654,16105,12582,31722,5711, 31297,33378,9073, 10663,7657, 2195, 6266, 9141, + 32981,39536,25598,8771, 41928,23542,33078,1607, 24579,37793,33716,23392,26661,36169,24654,16105,12582,31722,5711, 31297,33378,9073, 10663,7657, 2195, 6266, 9141, 744, 2161, 35343,36418,32121,30054,34450,35342,37792,1925, 19971,9679, 3558, 30793,41928,32882,5377, 39536,5809, 8679, 39136,39535,41928,507, 35342,38005,33715, - 37792,39535,28388,12187,20854,18317,25597,39535,37792,35141,34827,16951,27614,41928,36503,9193, 35286,6067, 15353,27405,30053,1933, 36294,2623, 2210, 14251,2935, + 37792,39535,28388,12187,20854,18317,25597,39535,37792,35141,34827,16951,27614,41928,36503,9193, 35286,6067, 15353,27405,30053,1933, 36294,2623, 2210, 14251,2935, 9796, 38215,28762,38783,36784,19521,19428,38008,15119,16104,9990, 33807,11736,6587, 35007,34027,14534,11896,7577, 37233,37286,27743,35066,41927,33078,35738,18316, - 37792,11283,808, 4816, 30663,18664,31009,25157,39390,12440,36819,15413,36227,12175,15726,2338, 41927,38575,15391,14440,23775,39535,39534,41927,39534,28387,6586, - 39534,41927,21662,30052,34450,16746,26904,12826,4847, 5937, 8534, 19269,19074,19494,10204,19073,33715,33715,7795, 37791,15883,27160,27874,24448,41926,32993,8874, + 37792,11283,808, 4816, 30663,18664,31009,25157,39390,12440,36819,15413,36227,12175,15726,2338, 41927,38575,15391,14440,23775,39535,39534,41927,39534,28387,6586, + 39534,41927,21662,30052,34450,16746,26904,12826,4847, 5937, 8534, 19269,19074,19494,10204,19073,33715,33715,7795, 37791,15883,27160,27874,24448,41926,32993,8874, 15626,34450,24447,38699,39240,26575,10092,41926,3639, 14763,41926,3385, 27977,36418,41926,22052,28386,31912,37791,31911,39534,34450,36418,26299,33094,41925,31910, 23391,41925,41925,28385,200, 17704,41925,24446,13473,34449,32312,27738,37791,33715,34449,38558,25596,25595,4063, 36418,29004,10733,36417,34449,37791,37933,37790, 41924,33714,31909,37790,16950,10885,10932,20475,32324,41924,30051,34681,34032,17350,4884, 19072,14649,34449,13246,20151,793, 1942, 28582,16654,27825,21460,31135, 18254,20150,36417,17703,33714,35436,37790,29797,35613,11578,12430,1277, 16755,32300,36053,39533,17702,28099,39302,11735,18315,32001,24618,35342,10904,39533,33714, 7317, 34073,41924,37008,37957,30688,9989, 18272,4683, 15390,35941,10903,33714,16949,8306, 35342,41924,33005,35341,35341,24798,2697, 24807,29299,13058,38437,26118, 37790,16622,8729, 17927,26903,7706, 39533,41923,41923,39533,35026,14477,15087,31908,33713,18314,6512, 20149,2620, 3523, 11959,2619, 20474,28551,4515, 38755,33077, - 128, 25624,7012, 35534,37987,41923,16948,33713,10091,6555, 35341,31907,28384,2975, 41923,31237,33713,25594,12018,2332, 13245,39295,35341,14762,38525,8011, 902, + 128, 25624,7012, 35534,37987,41923,16948,33713,10091,6555, 35341,31907,28384,2975, 41923,31237,33713,25594,12018,2332, 13245,39295,35341,14762,38525,8011, 902, 37789,12439,14287,41922,13472,18309,2611, 8008, 5760, 14083,901, 36, 6462, 3707, 36417,37789,643, 2043, 38050,15389,5447, 16319,34437,25593,35340,3736, 33077, 13770,41922,8224, 38295,17701,41922,3716, 41922,37789,34448,20853,8590, 18379,34874,13666,18352,36408,9778, 11354,33446,10426,26017,37789,34579,19071,27176,36493, 36417,9088, 33557,37788,16103,3712, 35559,4216, 12019,10905,27677,16104,15555,23967,234, 38905,35340,35090,39532,34064,9650, 7741, 7560, 29981,28066,1787, 21322, - 25998,4828, 9209, 32927,5189, 12616,18981,27987,15396,8728, 38587,33927,2290, 38707,7453, 32039,22223,38669,32011,443, 20473,2233, 35402,35216,955, 21425,557, + 25998,4828, 9209, 32927,5189, 12616,18981,27987,15396,8728, 38587,33927,2290, 38707,7453, 32039,22223,38669,32011,443, 20473,2233, 35402,35216,955, 21425,557, 34436,2618, 20472,1534, 16947,13727,25571,2019, 35113,32156,25227,3933, 4295, 1496, 38455,13975,3260, 32580,9342, 22350,8091, 14890,4635, 7508, 9599, 383, 35539, - 25671,12885,41921,5240, 39532,2944, 2867, 10324,27516,4565, 12825,7678, 842, 32950,32762,41921,5881, 37765,13514,36952,26081,35340,37788,14250,3182, 28383,247, - 10434,12131,38221,30257,29930,38304,11793,21896,35811,1671, 37788,35340,13511,15517,39532,41921,30050,35339,14082,36416,26902,37788,35485,204, 33713,11242,9674, - 20471,29878,17289,30711,21624,34408,13574,10536,36415,15587,3280, 4310, 8416, 10948,5493, 7289, 3780, 9793, 29630,7029, 1192, 32612,7481, 33201,477, 834, 3058, + 25671,12885,41921,5240, 39532,2944, 2867, 10324,27516,4565, 12825,7678, 842, 32950,32762,41921,5881, 37765,13514,36952,26081,35340,37788,14250,3182, 28383,247, + 10434,12131,38221,30257,29930,38304,11793,21896,35811,1671, 37788,35340,13511,15517,39532,41921,30050,35339,14082,36416,26902,37788,35485,204, 33713,11242,9674, + 20471,29878,17289,30711,21624,34408,13574,10536,36415,15587,3280, 4310, 8416, 10948,5493, 7289, 3780, 9793, 29630,7029, 1192, 32612,7481, 33201,477, 834, 3058, 3715, 33239,36327,53, 2145, 22663,17411,2915, 20532,10438,7117, 39532,38240,27714,33243,24955,12771,7599, 16102,13901,20470,7011, 16946,9959, 8803, 5038, 24445, 36467,34448,37787,32317,16101,17360,3261, 30049,41921,6947, 23366,33136,956, 10515,14249,33310,12824,22286,10972,33744,12941,14135,36146,25910,36422,1420, 33077, - 1988, 12619,17318,9267, 13890,27687,33722,38507,6268, 11176,14171,29985,9988, 38584,16945,15388,25870,36378,39531,39531,20148,30048,41920,39531,30047,290, 1785, - 33945,6879, 12312,15124,5504, 30046,1013, 14410,16944,18547,39290,29200,32834,16100,36040,20469,31566,35970,15387,6326, 19070,14248,10203,5018, 11175,25679,4989, + 1988, 12619,17318,9267, 13890,27687,33722,38507,6268, 11176,14171,29985,9988, 38584,16945,15388,25870,36378,39531,39531,20148,30048,41920,39531,30047,290, 1785, + 33945,6879, 12312,15124,5504, 30046,1013, 14410,16944,18547,39290,29200,32834,16100,36040,20469,31566,35970,15387,6326, 19070,14248,10203,5018, 11175,25679,4989, 35339,39531,2331, 37787,19069,37787,39530,26901,31412,18873,41920,8260, 39104,1625, 4360, 41920,37787,39210,38744,11958,39530,502, 23617,10202,34319,13726,27909, 11693,2267, 2221, 37250,8512, 980, 11056,34, 2862, 22633,31561,36416,2846, 31906,30353,497, 1940, 3496, 29119,18777,24204,10820,37786,12532,9105, 15386,20218, - 2486, 10683,8444, 14409,16318,1531, 32894,6923, 23208,5376, 37786,35339,39530,36416,39530,41920,36416,9076, 22451,41919,30045,23390,30044,29750,6752, 32877,7685, + 2486, 10683,8444, 14409,16318,1531, 32894,6923, 23208,5376, 37786,35339,39530,36416,39530,41920,36416,9076, 22451,41919,30045,23390,30044,29750,6752, 32877,7685, 4358, 12466,34200,16824,4384, 21971,6935, 13635,34850,16588,35883,35929,33644,13952,21623,39090,15521,31533,4257, 5098, 31130,2358, 23299,20221,35507,37786,34896, 21334,41919,25149,37786,35954,10437,33219,7028, 33863,20147,1598, 3012, 9867, 6259, 37734,10201,14776,19068,7684, 26208,37687,8589, 8488, 27341,31905,13781,34755, 35912,26900,14386,33706,20441,37736,14247,3137, 4652, 33359,38664,1208, 192, 3228, 6648, 14180,2756, 1471, 36415,24444,32873,37147,674, 824, 25741,16099,34621, @@ -18170,20 +18165,20 @@ static const unsigned short Ranks[197839] = 9307, 30963,10113,17926,19067,10902,14774,31274,23351,13897,6089, 2672, 11860,12368,1395, 13295,7666, 38153,13722,1258, 1092, 5315, 6046, 10817,29874,37482,16098, 36607,7387, 14471,34036,17064,12957,37354,36366,27077,2363, 3607, 4038, 2241, 7922, 8970, 11567,16097,32836,5982, 12834,25893,6088, 8172, 25387,5884, 13721,36498, 36664,27036,36416,16822,33868,3364, 6266, 15385,12429,38605,36916,37483,38621,33489,25687,20689,20517,3119, 28686,9791, 10661,34680,11119,32928,11071,5337, 18486, - 3017, 28080,14176,16096,36096,10436,25827,39228,34572,33712,248, 38070,344, 4124, 11296,707, 1652, 349, 20146,9598, 8688, 15650,8226, 20467,35795,9072, 2442, + 3017, 28080,14176,16096,36096,10436,25827,39228,34572,33712,248, 38070,344, 4124, 11296,707, 1652, 349, 20146,9598, 8688, 15650,8226, 20467,35795,9072, 2442, 21842,2393, 19034,3352, 9071, 1875, 10435,9992, 28828,15384,2653, 3601, 36463,24754,32346,19066,16942,4960, 2979, 17925,22181,5106, 5581, 5827, 36877,35419,14245, 12893,20466,4242, 36415,26462,17508,24020,35374,8305, 36194,27659,31557,1750, 21636,8842, 12074,33990,25828,41918,8045, 34381,7592, 25445,33712,24147,33392,11912, - 8981, 3682, 34146,18457,12409,21983,19948,29490,35621,37799,38056,13720,37976,37374,28735,9597, 8117, 19065,6481, 33711,345, 20551,16470,25415,22366,17622,295, - 10799,9379, 31906,24976,11237,25344,13619,15590,31545,27964,21526,2610, 28561,33204,41918,1663, 36004,18798,24320,32900,38916,33089,32711,14433,4111, 9548, 3509, + 8981, 3682, 34146,18457,12409,21983,19948,29490,35621,37799,38056,13720,37976,37374,28735,9597, 8117, 19065,6481, 33711,345, 20551,16470,25415,22366,17622,295, + 10799,9379, 31906,24976,11237,25344,13619,15590,31545,27964,21526,2610, 28561,33204,41918,1663, 36004,18798,24320,32900,38916,33089,32711,14433,4111, 9548, 3509, 30831,11054,36133,12606,5181, 36157,18699,17258,20777,32781,1795, 18837,28382,5033, 26376,23789,12284,35338,20199,15770,32933,20465,17064,1793, 17626,30982,30108, - 39529,21622,3273, 20464,3728, 28959,21621,2765, 36415,36415,15123,1721, 35338,14408,5912, 24323,23645,33076,18313,36414,483, 7566, 18872,11673,10837,37785,3919, + 39529,21622,3273, 20464,3728, 28959,21621,2765, 36415,36415,15123,1721, 35338,14408,5912, 24323,23645,33076,18313,36414,483, 7566, 18872,11673,10837,37785,3919, 3190, 14947,9070, 16095,8588, 21975,38813,6795, 20463,11174,15621,13244,39331,15383,13762,26910,34392,19494,20852,37784,41917,6721, 34742,36384,28381,23389,37784, 34447,37192,18158,29010,15895,38715,39221,8601, 5640, 34053,6093, 30261,36315,17110,9254, 33817,5141, 4337, 39529,18871,10241,9391, 17385,2677, 21713,9633, 31690, 8109, 4101, 16061,28380,16713,12682,37784,19994,4872, 30194,11158,22046,742, 9148, 11173,6072, 29471,24533,14643,23406,2005, 12930,8873, 12428,39529,36414,14081, - 15382,28379,27983,32919,32700,41917,34447,41917,41917,9145, 12691,14407,11733,15049,32288,33107,29112,16094,9306, 35319,16383,37784,10759,30041,30573,15265,8666, - 34044,10863,41916,15820,32905,29780,20659,39528,6710, 18315,30040,38964,6127, 26899,3075, 25592,22509,41916,31148,30210,1013, 18227,35338,34370,36414,3471, 1316, + 15382,28379,27983,32919,32700,41917,34447,41917,41917,9145, 12691,14407,11733,15049,32288,33107,29112,16094,9306, 35319,16383,37784,10759,30041,30573,15265,8666, + 34044,10863,41916,15820,32905,29780,20659,39528,6710, 18315,30040,38964,6127, 26899,3075, 25592,22509,41916,31148,30210,1013, 18227,35338,34370,36414,3471, 1316, 16384,944, 8873, 13243,16317,20462,33089,28378,7591, 21002,11172,35794,35045,11957,6380, 13227,27381,17744,30930,32821,38154,37040,18512,15550,14080,13385,13777, - 29187,9028, 19531,31362,4131, 15943,13444,549, 16320,32833,29100,3411, 25137,17985,33711,9039, 16595,23211,36003,18757,4945, 15598,236, 20378,15536,17494,165, + 29187,9028, 19531,31362,4131, 15943,13444,549, 16320,32833,29100,3411, 25137,17985,33711,9039, 16595,23211,36003,18757,4945, 15598,236, 20378,15536,17494,165, 11040,3869, 24118,28192,27786,26278,29540,29231,28130,5745, 16288,7361, 14565,32932,30088,10619,1714, 1173, 4740, 32645,2768, 12903,2444, 36741,37730,8447, 21188, 14244,12812,7590, 26622,10240,31622,36617,21055,7582, 28377,24170,26570,5989, 2832, 8906, 374, 19261,8283, 2831, 17476,23877,21620,37783,2119, 1077, 30193,37783, 13719,36414,53, 1408, 39528,12668,36568,33711,2479, 4569, 2784, 7462, 35338,23388,37783,9596, 35337,33076,14773,6945, 4273, 7102, 6118, 14243,37475,7486, 12822, @@ -18192,8 +18187,8 @@ static const unsigned short Ranks[197839] = 33040,3316, 14009,26130,22081,12006,19063,746, 2472, 1353, 26898,33075,30039,36413,3973, 33319,20459,14772,35298,33767,14390,5876, 11628,20466,39412,12793,38908, 7235, 9549, 25690,8855, 35552,13527,23427,36407,2928, 29516,3106, 4245, 3714, 7463, 8430, 28864,13971,23097,3940, 4303, 37518,8727, 16689,38281,24535,24498,19062, 31104,22220,1502, 26944,4501, 23264,30827,3010, 8841, 10200,9969, 11574,25403,2925, 30909,35975,35895,22452,34923,36144,16424,12901,34879,16678,7027, 19638,35429, - 31887,5458, 12427,11171,4280, 20458,10900,8587, 28412,39219,14242,13370,3096, 17923,41915,37782,11170,20457,8295, 19936,3290, 5067, 3183, 20965,2930, 733, 6210, - 11732,33547,16093,23581,6636, 23200,8389, 34683,5401, 36763,1629, 1320, 3575, 4078, 23601,14241,13763,33745,30635,18312,5299, 4693, 11651,11169,9069, 26260,3307, + 31887,5458, 12427,11171,4280, 20458,10900,8587, 28412,39219,14242,13370,3096, 17923,41915,37782,11170,20457,8295, 19936,3290, 5067, 3183, 20965,2930, 733, 6210, + 11732,33547,16093,23581,6636, 23200,8389, 34683,5401, 36763,1629, 1320, 3575, 4078, 23601,14241,13763,33745,30635,18312,5299, 4693, 11651,11169,9069, 26260,3307, 36413,39262,14850,36586,1732, 33075,41915,2828, 1560, 1517, 3076, 4215, 39527,37395,9473, 23717,34955,23466,37782,37782,41915,37919,2072, 33691,5370, 35337,12821, 19061,35321,27269,7142, 14435,2290, 12559,4159, 7585, 10910,39527,30038,5068, 16140,21251,35385,541, 10744,28184,19587,29106,12889,13974,32789,37966,26897,30590, 2192, 12073,28551,899, 6605, 38110,3654, 8731, 19980,168, 30330,39527,193, 41915,3631, 3196, 36412,16652,258, 568, 28824,33939,39033,28822,27512,12087,11280, @@ -18211,11 +18206,11 @@ static const unsigned short Ranks[197839] = 39521,13717,37779,31898,36409,13195,41908,11430,18867,30032,41908,25589,31451,7385, 6621, 15046,16941,31897,25177,41908,38443,36753,24875,38502,27215,25464,31293, 23493,9547, 33668,15667,36409,13716,17921,17920,30916,35184,21423,33394,31076,20851,37779,2785, 22450,36409,22449,35447,28504,30031,8222, 37778,34445,33074,33709, 39521,17698,9029, 37778,14760,18308,4198, 37778,34445,7778, 5787, 15513,36536,37778,24439,31896,41907,33073,30030,31751,3406, 31895,34444,39521,39521,2496, 13715, - 11257,34153,33152,37777,15497,33709,36409,21618,33073,31894,33073,41907,4104, 19491,39520,35745,41907,3606, 1838, 6377, 3713, 19059,7017, 10199,35723,15378,9459, + 11257,34153,33152,37777,15497,33709,36409,21618,33073,31894,33073,41907,4104, 19491,39520,35745,41907,3606, 1838, 6377, 3713, 19059,7017, 10199,35723,15378,9459, 5314, 13481,21221,19058,16940,16939,23592,26023,10899,39520,18738,41907,36408,20985,12819,16938,20455,10612,30777,31593,11461,39520,36408,41906,36408,39520,36369, 7921, 35221,38149,16937,32853,3418, 553, 24232,5069, 3077, 2350, 9611, 1007, 493, 1848, 1859, 1256, 3230, 24440,12271,7137, 12759,9002, 37172,600, 20454,19057, 7794, 3067, 12818,4013, 2995, 13185,22304,23901,10691,20453,356, 117, 2099, 3203, 18866,35604,2732, 30370,3605, 33557,34689,16221,6265, 14770,26797,7555, 38173, - 2783, 19490,25588,5303, 3522, 11529,6359, 8841, 10106,6217, 28736,5019, 1782, 10034,37450,5839, 4651, 1890, 14530,34946,32832,13719,10569,33813,1250, 37984,4186, + 2783, 19490,25588,5303, 3522, 11529,6359, 8841, 10106,6217, 28736,5019, 1782, 10034,37450,5839, 4651, 1890, 14530,34946,32832,13719,10569,33813,1250, 37984,4186, 25292,670, 14013,35336,10198,9826, 20452,15377,23512,8304, 34506,12445,5166, 20451,6087, 37777,36408,28371,41906,19489,39519,39519,11440,30965,3813, 6087, 24436, 7408, 2506, 35755,9421, 6286, 33828,39519,10219,5211, 7145, 3605, 15893,7071, 3338, 10006,36468,1119, 2270, 34722,472, 846, 726, 33073,4533, 16117,33388,33072, 10731,39519,21268,11167,38071,4541, 2776, 5457, 4871, 13454,4141, 24702,5311, 7793, 28302,7290, 33242,39132,6577, 4455, 28370,18241,12469,19056,41906,11731,12535, @@ -18224,19 +18219,19 @@ static const unsigned short Ranks[197839] = 5587, 25538,34444,39518,11501,39517,34444,29181,34443,31893,33072,37776,15891,39517,39517,27144,7503, 4480, 6719, 11429,9510, 10660,14021,14769,3260, 41905,33709, 36272,11730,19054,5201, 35137,39517,2392, 3758, 21583,36367,39386,37361,36782,11456,2829, 32935,1883, 1054, 9401, 8242, 3812, 15496,17696,28368,39516,19488,36407, 33072,17218,18853,5726, 7040, 477, 958, 2753, 37776,8593, 967, 12220,997, 36670,8153, 35993,28273,10898,35336,8715, 1256, 1255, 881, 5487, 2398, 3337, 39516, - 19487,12185,38065,41905,3405, 24438,24437,33071,14634,6966, 3780, 35904,5300, 22882,26892,11889,20449,3872, 25183,33071,37776,7095, 14949,39516,30029,41904,2383, - 31760,267, 1727, 8009, 180, 7646, 19926,952, 15897,20850,16936,16092,14768,12070,34705,20448,38233,36407,37776,41904,2683, 6209, 4994, 23736,5142, 34258,3384, + 19487,12185,38065,41905,3405, 24438,24437,33071,14634,6966, 3780, 35904,5300, 22882,26892,11889,20449,3872, 25183,33071,37776,7095, 14949,39516,30029,41904,2383, + 31760,267, 1727, 8009, 180, 7646, 19926,952, 15897,20850,16936,16092,14768,12070,34705,20448,38233,36407,37776,41904,2683, 6209, 4994, 23736,5142, 34258,3384, 12817,35484,33035,37775,19053,15484,17708,2634, 5309, 5624, 3298, 38090,35335,35335,23385,32927,12933,33071,39057,34584,41904,34456,35335,35335,1083, 33071,10909, 33070,39516,34443,35805,36701,8108, 3558, 37121,36407,33070,39515,34967,26891,39515,2299, 12245,38333,37775,15890,7742, 37775,9144, 37775,30028,36839,3290, 28951, 11729,19486,35334,33664,13669,33463,41904,38341,9790, 10296,35567,24043,35334,12122,3749, 13714,3666, 5471, 11602,2562, 16935,28777,36407,36406,36091,26890,35334, - 35334,6495, 26889,12253,1281, 35485,3902, 13068,36406,8905, 2819, 33708,1877, 14599,20144,39515,41903,5105, 16321,41903,8171, 14079,10396,36564,39515,33609,9434, + 35334,6495, 26889,12253,1281, 35485,3902, 13068,36406,8905, 2819, 33708,1877, 14599,20144,39515,41903,5105, 16321,41903,8171, 14079,10396,36564,39515,33609,9434, 12223,17986,37684,9388, 18783,14078,41903,8107, 37774,33070,12932,19052,41903,33708,39514,37849,24842,35957,41902,35333,36406,33070,7118, 4387, 10351,37994,37203, 9188, 33401,11615,37161,5766, 33769,13713,5086, 17919,35819,38383,35333,4587, 8609, 39514,19463,39107,12816,16934,12620,20447,2619, 5168, 10037,8871, 3700, 21897, 12069,19051,41902,12931,33025,13956,12126,39088,2979, 16091,14616,33010,20446,7775, 7313, 26096,33640,1491, 33009,2485, 3235, 14843,20841,3792, 8094, 15435,34478, 10659,20445,11231,10434,21910,37267,37774,34821,9067, 14965,20444,33979,39202,33069,6086, 4582, 34059,7256, 8742, 21474,17918,8969, 41902,34443,6794, 33319,22448, 37774,20143,35333,23384,1811, 15375,526, 1941, 8745, 7690, 2147, 32787,35370,6002, 18939,16933,14270,17895,21329,34448,16512,36406,21206,5752, 20443,11388,10421, - 12001,28091,12815,7526, 35377,15374,4288, 8022, 41902,12438,5836, 25889,26090,27051,13301,26640,41901,8341, 36075,32914,681, 23010,492, 2402, 2028, 3155, 2569, - 1169, 33708,23487,34496,27798,32279,17457,8195, 19050,34277,38829,7392, 35333,37774,27634,13471,23383,33708,10658,1458, 37517,2097, 17344,5290, 1234, 1147, 675, + 12001,28091,12815,7526, 35377,15374,4288, 8022, 41902,12438,5836, 25889,26090,27051,13301,26640,41901,8341, 36075,32914,681, 23010,492, 2402, 2028, 3155, 2569, + 1169, 33708,23487,34496,27798,32279,17457,8195, 19050,34277,38829,7392, 35333,37774,27634,13471,23383,33708,10658,1458, 37517,2097, 17344,5290, 1234, 1147, 675, 1496, 1766, 13242,6376, 39083,16090,7767, 28271,14578,32873,9987, 34609,15373,14240,35554,12411,5598, 25317,12552,16361,15082,8344, 8154, 23255,14577,9986, 35723, 38184,16932,38780,24062,7812, 8734, 18599,36044,32788,14671,4698, 14358,5573, 37616,41901,17917,20442,19049,8870, 37773,35649,4368, 7249, 13712,21364,30151,26794, 542, 17441,962, 17373,3703, 36508,8181, 34599,12063,22788,9409, 33664,16371,38681,26300,12814,16089,9590, 36577,21936,6445, 33398,34545,25547,11428,1570, 10897, @@ -18244,13 +18239,13 @@ static const unsigned short Ranks[197839] = 17914,28414,12949,22073,9296, 2185, 36492,22445,9353, 8071, 11260,37773,13240,12610,33724,41901,27461,10896,9400, 33506,19929,10395,3960, 10196,37239,33069,10657, 12737,38069,38751,1561, 12677,3166, 17913,17093,9132, 4883, 250, 31418,7167, 4077, 2269, 10032,6208, 33435,41900,26313,17912,39514,39514,33939,33052,31426,36232, 4294, 32881,4430, 7550, 4529, 5918, 36886,22447,4691, 10568,3041, 9399, 10433,12423,5280, 19048,13711,41900,14406,36950,2670, 2650, 1000, 3764, 2795, 17911,27331, - 15467,2640, 7536, 5132, 26259,31778,41900,35000,19047,25142,12642,11577,36181,16744,29863,23613,26028,39513,39083,35332,13341,17910,19046,39196,14175,34176,4894, - 4622, 1585, 4872, 16687,5375, 2067, 19036,1697, 37133,860, 38731,3788, 2062, 8639, 32613,6944, 8189, 4309, 2859, 18533,1673, 8044, 18437,12675,34720,7383, 7839, - 36956,17078,29011,2108, 1533, 33893,4804, 6399, 38254,33190,5411, 23261,25555,17002,20264,16088,38139,14077,35879,39513,7322, 31892,37773,20037,16931,28459,1719, + 15467,2640, 7536, 5132, 26259,31778,41900,35000,19047,25142,12642,11577,36181,16744,29863,23613,26028,39513,39083,35332,13341,17910,19046,39196,14175,34176,4894, + 4622, 1585, 4872, 16687,5375, 2067, 19036,1697, 37133,860, 38731,3788, 2062, 8639, 32613,6944, 8189, 4309, 2859, 18533,1673, 8044, 18437,12675,34720,7383, 7839, + 36956,17078,29011,2108, 1533, 33893,4804, 6399, 38254,33190,5411, 23261,25555,17002,20264,16088,38139,14077,35879,39513,7322, 31892,37773,20037,16931,28459,1719, 6445, 3417, 3757, 12677,10471,6483, 24261,12489,23085,29387,33298,34281,18362,28469,35235,2414, 12363,16087,5689, 41900,16086,2644, 36084,5456, 33986,1115, 33121, 18307,682, 12068,4140, 2991, 7483, 6444, 5770, 2712, 1160, 3136, 10850,39513,41899,41899,23382,41899,36681,9595, 16930,5627, 6012, 16085,35067,2224, 2510, 15036, - 9053, 22618,17430,3574, 7326, 25801,843, 4039, 2978, 1105, 840, 11728,10195,20954,31891,21988,17207,30027,39513,41899,2929, 8106, 322, 35398,5678, 31100,9349, - 24967,33504,25981,28419,23864,1093, 2634, 19045,6085, 12184,13710,37773,33820,3187, 33697,12689,37491,11100,4455, 33413,8677, 20441,19044,2015, 15205,19043,3350, + 9053, 22618,17430,3574, 7326, 25801,843, 4039, 2978, 1105, 840, 11728,10195,20954,31891,21988,17207,30027,39513,41899,2929, 8106, 322, 35398,5678, 31100,9349, + 24967,33504,25981,28419,23864,1093, 2634, 19045,6085, 12184,13710,37773,33820,3187, 33697,12689,37491,11100,4455, 33413,8677, 20441,19044,2015, 15205,19043,3350, 1861, 25337,36393,16084,6071, 7382, 10008,2642, 4754, 6207, 9537, 7680, 2593, 9624, 6085, 3144, 9014, 35745,15350,6084, 13239,15546,10491,6278, 5537, 36405,23023, 37983,36405,383, 9511, 1159, 1199, 601, 3095, 2892, 9594, 13007,13373,35560,12744,37772,16083,12555,34536,25901,8607, 23437,11164,8368, 28308,6063, 37045,10895, 20440,21672,37159,1105, 2217, 29295,7146, 5625, 15179,37059,3277, 1864, 6083, 18146,4573, 5182, 11611,20174,38117,26009,6793, 15157,33386,19042,7155, 15372,41898, @@ -18263,10 +18258,10 @@ static const unsigned short Ranks[197839] = 7792, 4066, 16071,12595,21356,28190,15522,26888,41897,10466,9096, 26445,19116,39511,39511,41897,41896,33159,3942, 9761, 19485,35766,34884,37771,31890,24435,32842, 2911, 20881,815, 25587,34056,33068,36241,15371,10567,33144,20849,37773,41896,17445,27096,2723, 1047, 4496, 2550, 33413,11161,23304,4986, 9029, 36534,35925,10239, 36405,19039,6376, 17695,41896,36404,31889,39511,35757,6818, 33609,37770,19868,1285, 37682,2138, 4256, 41896,9968, 32825,9985, 8957, 13156,2297, 36631,13708,32826, - 41895,24434,34443,8294, 26197,2305, 4444, 15829,39145,10657,36290,11021,23320,10194,6021, 15905,16926,20142,39510,33670,28367,743, 12237,2945, 4446, 5842, 6064, + 41895,24434,34443,8294, 26197,2305, 4444, 15829,39145,10657,36290,11021,23320,10194,6021, 15905,16926,20142,39510,33670,28367,743, 12237,2945, 4446, 5842, 6064, 11522,24526,1189, 32806,11281,36404,12273,41895,41895,6685, 12806,2921, 16657,4889, 26278,16192,36509,8270, 8586, 10055,16081,33670,19037,37213,35004,34356,11581, 15390,18721,26865,1989, 7480, 36032,26563,37215,13237,6585, 3622, 23449,11757,7288, 39113,17128,7117, 9066, 6943, 16925,39510,3428, 12324,8585, 11805,26864,35969, - 5770, 1124, 8350, 1887, 33605,14239,15758,36380,38081,8823, 6878, 12658,4234, 15135,6816, 9594, 37770,33562,7152, 21985,13707,11426,23552,41895,2244, 5904, 6141, + 5770, 1124, 8350, 1887, 33605,14239,15758,36380,38081,8823, 6878, 12658,4234, 15135,6816, 9594, 37770,33562,7152, 21985,13707,11426,23552,41895,2244, 5904, 6141, 7381, 29398,36404,41894,5829, 11425,20437,24433,33068,26373,9563, 15145,38568,5371, 16924,9065, 10602,15370,24539,298, 33707,37263,19512,12930,11935,14076,20141, 17694,38716,37770,19676,11424,966, 19699,24432,37770,41894,14404,33068,133, 36404,10193,36403,38607,30755,903, 17693,26233,2761, 441, 36403,19898,24431,38779, 41894,39510,16743,106, 26887,11719,2411, 37769,37769,33707,26886,22446,8555, 38484,21617,36403,35332,16928,37769,12183,19484,41894,39510,34442,6939, 36682,33876, @@ -18277,8 +18272,8 @@ static const unsigned short Ranks[197839] = 35607,41893,16589,35258,18669,36402,26704,6640, 7287, 35550,36194,918, 31926,18975,25759,24567,19085,34416,28366,12422,16080,23441,5864, 9205, 6701, 2851, 20900, 27343,12736,15675,27324,32603,20651,1519, 39509,34036,14426,34557,22348,3771, 34808,25585,24430,4572, 7263, 34467,41893,17206,13238,14766,35153,3305, 6706, 12991, 37472,36230,37956,5866, 32848,19396,18057,16203,6557, 3635, 41893,1577, 2278, 41893,679, 16799,34442,33067,3369, 39509,3995, 35331,268, 7307, 11636,35908,36402, - 31522,16250,33416,34528,36444,32592,17692,31888,41892,33215,36926,36318,33067,30312,2725, 137, 27840,16212,39509,5666, 37768,41892,34185,16313,33982,13469,3125, - 19002,28408,5793, 38430,39508,23380,26885,39508,36068,32269,41892,35680,35331,27756,39508,4650, 16922,12437,6322, 11160,32125,35331,4082, 30025,14403,28266,8005, + 31522,16250,33416,34528,36444,32592,17692,31888,41892,33215,36926,36318,33067,30312,2725, 137, 27840,16212,39509,5666, 37768,41892,34185,16313,33982,13469,3125, + 19002,28408,5793, 38430,39508,23380,26885,39508,36068,32269,41892,35680,35331,27756,39508,4650, 16922,12437,6322, 11160,32125,35331,4082, 30025,14403,28266,8005, 3124, 5950, 35487,25647,6609, 3556, 7717, 34993,27196,30024,24429,13237,33911,8584, 2441, 34123,23379,39508,32492,23131,33440,4510, 17478,30023,38193,32849,35305, 34442,39507,20848,22445,36402,16034,15740,35260,41892,6820, 16742,3728, 7791, 20435,35430,23674,33058,7169, 21797,36402,41891,37465,33124,20372,41891,16079,37768, 39507,38029,37563,35888,36151,30545,17333,21314,32964,33033,38118,41891,3262, 41891,2380, 4399, 4703, 14774,4882, 3476, 39507,41890,183, 11323,28365,41890,14075, @@ -18286,19 +18281,19 @@ static const unsigned short Ranks[197839] = 1487, 10172,18395,26062,32860,16626,26058,25251,32918,17908,197, 61, 32013,35330,39506,11280,14402,30022,36401,5343, 36401,13765,39506,12807,1226, 39506,34441, 4077, 41889,6554, 8457, 8583, 33707,12690,5686, 1290, 21840,24582,797, 9957, 16741,41889,11525,41889,10063,4613, 41889,33706,28363,664, 38152,30021,12103,34441, 37768,1122, 41888,21512,28362,23640,35340,185, 24103,33087,33706,2950, 13468,25584,15120,34441,21616,31887,18306,36401,31886,2521, 39505,34441,18865,6553, 16078, - 15119,9673, 2238, 19038,310, 41888,2807, 558, 20140,16921,37767,3228, 35203,37767,35330,34440,35788,1179, 13236,23337,37767,7958, 133, 7107, 39505,756, 9043, + 15119,9673, 2238, 19038,310, 41888,2807, 558, 20140,16921,37767,3228, 35203,37767,35330,34440,35788,1179, 13236,23337,37767,7958, 133, 7107, 39505,756, 9043, 27811,33706,34471,21615,39505,41888,731, 20187,39505,6031, 35330,4020, 6831, 15889,34440,41888,2094, 34261,13235,755, 33066,41887,11727,7065, 7920, 33706,37767, 618, 15097,18864,41887,39504,27091,26884,35329,6552, 3152, 35329,6265, 41887,2020, 11293,28586,3022, 12144,3304, 641, 39504,30961,23017,35329,30155,17691,32799, 5474, 2495, 21830,41887,41886,10730,41886,5946, 8170, 10432,36456,33539,785, 8169, 7025, 1552, 15494,8340, 23378,37766,1966, 26883,13764,26882,34440,12436,37766, 36400,35329,13194,22444,37766,37766,37765,33066,35328,37765,33705,18305,33066,15888,33066,4454, 37765,11159,12689,23377,25583,36400,17205,36400,41886,33065,34440, 28361,41886,34070,39504,37765,34439,33065,37764,8802, 6551, 28360,35328,8339, 14757,35328,30020,12688,33705,36400,28359,41885,33705,12182,31885,41885,18304,25582, 11284,17433,31884,11279,39504,33357,6375, 36399,17204,38893,39503,12812,20847,21614,5414, 16312,30019,31883,37764,18863,22443,36399,41885,41885,41884,18133,39503, - 16311,36399,24428,35207,36399,15887,32829,31882,36398,36398,35328,37764,15493,37764,41884,39043,39503,3711, 34439,41884,35327,9064, 6615, 41884,16740,20434,5623, - 37240,37763,5686, 11744,12811,35997,2576, 17112,16869,17409,3784, 13706,25410,6804, 29533,27024,3547, 6414, 36398,33469,34439,36017,35327,32832,35327,3779, 7565, + 16311,36399,24428,35207,36399,15887,32829,31882,36398,36398,35328,37764,15493,37764,41884,39043,39503,3711, 34439,41884,35327,9064, 6615, 41884,16740,20434,5623, + 37240,37763,5686, 11744,12811,35997,2576, 17112,16869,17409,3784, 13706,25410,6804, 29533,27024,3547, 6414, 36398,33469,34439,36017,35327,32832,35327,3779, 7565, 25581,39503,9800, 17203,35327,4492, 34439,19483,36398,8301, 39502,39502,35326,20139,16310,11348,41883,2520, 11955,6817, 9956, 24427,37763,765, 28358,25580,13705, - 35326,26881,29, 16816,32713,3118, 8303, 18862,5685, 5936, 34054,39502,33372,24605,41883,9396, 30018,34030,39502,41883,2103, 14765,8963, 467, 3694, 36122,5734, + 35326,26881,29, 16816,32713,3118, 8303, 18862,5685, 5936, 34054,39502,33372,24605,41883,9396, 30018,34030,39502,41883,2103, 14765,8963, 467, 3694, 36122,5734, 15230,21702,30017,39501,36398,5532, 22442,555, 17907,37763,15896,6854, 18658,33259,35326,33070,11726,24426,2905, 25022,26880,37763,8952, 39501,37762,39501,36967, - 36397,24425,41883,28357,41882,12898,36356,32825,32368,36397,33705,28280,15118,16077,7829, 11749,29429,16504,33951,1941, 16413,34033,33693,15369,6584, 8008, 176, + 36397,24425,41883,28357,41882,12898,36356,32825,32368,36397,33705,28280,15118,16077,7829, 11749,29429,16504,33951,1941, 16413,34033,33693,15369,6584, 8008, 176, 6101, 16250,37762,31881,26529,36397,39501,41882,33704,39500,36397,39500,4851, 3555, 33704,37762,39500,7380, 26879,23824,39500,14756,16739,32821,38169,37135,16048, 14911,39499,37681,41882,24863,4772, 29976,39286,36396,17509,12375,18682,37762,36845,1567, 3735, 39499,19482,30016,26878,39499,39499,19037,17845,15593,36336,31880, 4103, 37942,37761,21811,39498,37761,33065,35326,28356,41882,26877,37544,41881,33065,10892,38025,9536, 34438,41881,36396,35325,2114, 39498,31879,36396,13467,10238, @@ -18307,14 +18302,14 @@ static const unsigned short Ranks[197839] = 41880,6820, 18860,37760,25579,7655, 31604,24099,41880,33064,24424,35325,41880,34638,12169,6718, 38309,19035,31878,32763,1982, 41879,22763,41879,35324,27570,12810, 5145, 35324,25578,31877,35000,23376,34438,4333, 356, 36395,2825, 33515,14494,12262,33351,4431, 6947, 41879,1581, 31876,12321,19321,19162,13100,5310, 26398,34766, 37925,19540,36479,33064,37759,2880, 32458,15540,3046, 26462,16019,39223,13378,35324,18859,1992, 25577,16738,36395,33063,10729,1184, 19341,34438,30013,15491,19034, - 3810, 2839, 17906,17905,30012,31561,36395,7097, 6511, 39497,7888, 24845,35733,1940, 39497,41879,37759,34746,34437,17121,41878,12181,41878,37739,41878,33576,1302, + 3810, 2839, 17906,17905,30012,31561,36395,7097, 6511, 39497,7888, 24845,35733,1940, 39497,41879,37759,34746,34437,17121,41878,12181,41878,37739,41878,33576,1302, 31875,6240, 26876,9672, 34327,3669, 41878,10907,41877,33703,15490,41877,9799, 13908,33999,35528,27035,39497,36394,33703,39496,2035, 6494, 34864,41877,782, 37759, 41877,26875,3326, 36235,39496,3317, 20844,2742, 2790, 28644,41876,6431, 6205, 24423,18858,33127,8869, 35324,22441,20516,19481,41876,34437,41876,16309,33063,31874, 28355,35462,11718,41876,14401,11500,39051,36394,13704,33063,28354,19033,22440,104, 32888,18303,7790, 41875,10089,31873,37759,3253, 36394,1108, 36394,41875,30011, - 5481, 37758,11098,15886,6347, 39496,34162,23904,33703,33702,37918,25576,17904,14400,4612, 35323,966, 36393,38495,39496,39495,39495,39495,19032,18857,34776,2953, - 16919,35240,24455,5116, 41875,4893, 21613,16737,37758,41875,41874,11717,16918,33702,3195, 22323,28353,39495,2080, 16291,23669,34437,30579,33835,36332,9517, 3462, + 5481, 37758,11098,15886,6347, 39496,34162,23904,33703,33702,37918,25576,17904,14400,4612, 35323,966, 36393,38495,39496,39495,39495,39495,19032,18857,34776,2953, + 16919,35240,24455,5116, 41875,4893, 21613,16737,37758,41875,41874,11717,16918,33702,3195, 22323,28353,39495,2080, 16291,23669,34437,30579,33835,36332,9517, 3462, 3164, 16010,34437,4081, 644, 29588,33702,41874,39494,39494,19454,37758,15117,34436,11716,23375,35793,148, 7907, 25242,59, 39494,28912,10431,29116,20645,36943, - 19663,35980,15244,38546,13473,31959,34830,10728,22336,16078,38781,32893,35899,4169, 41874,33063,35323,22596,6154, 611, 35482,5848, 4523, 23735,16707,32954,6816, + 19663,35980,15244,38546,13473,31959,34830,10728,22336,16078,38781,32893,35899,4169, 41874,33063,35323,22596,6154, 611, 35482,5848, 4523, 23735,16707,32954,6816, 33062,13763,15368,13703,25675,21612,26874,36393,6443, 11170,15808,33062,29809,39494,37758,3029, 28352,37369,35503,27864,41874,35277,38702,11499,33702,38132,13243, 28436,11082,41873,34202,13466,33701,7740, 25575,28381,13469,33701,39493,36393,9535, 31872,2363, 32160,33062,31871,35323,10394,10625,13688,20913,6908, 22533,29156, 12645,6844, 31046,5867, 17203,3765, 30654,25081,2101, 7501, 30290,31996,15635,26257,13559,1482, 13461,8304, 30843,32826,16944,15778,20144,38318,31589,32823,19637, @@ -18327,7 +18322,7 @@ static const unsigned short Ranks[197839] = 1445, 20977,10916,22133,28782,8947, 24026,28648,33015,15430,28991,29871,30925,32859,26668,22575,183, 16495,37756,21611,178, 9931, 35322,30150,28629,41, 15974, 35322,19320,139, 5769, 8220, 20751,3994, 41871,20075,41871,35322,5342, 5530, 30008,10727,35321,20841,8904, 14755,10726,41870,100, 5297, 24470,26701,36487,41870, 30530,6335, 2036, 21778,23918,10077,8447, 2250, 21167,19, 16917,41870,31868,35321,1117, 8801, 33700,4102, 33061,532, 34435,37756,33700,32053,41870,41869,21610, - 12809,4725, 3252, 26979,23403,2288, 23374,8146, 3719, 36106,23222,5683, 33852,12307,14237,3603, 806, 19480,35334,5506, 23762,36342,19620,39491,33249,2445, 381, + 12809,4725, 3252, 26979,23403,2288, 23374,8146, 3719, 36106,23222,5683, 33852,12307,14237,3603, 806, 19480,35334,5506, 23762,36342,19620,39491,33249,2445, 381, 12587,7954, 10567,20137,41869,19419,16405,31867,16736,35321,36392,550, 10162,34435,36195,17566,851, 31516,33681,7179, 28351,8565, 1720, 39312,39491,18000,36459, 3028, 15489,2579, 424, 41869,33297,31297,10561,3681, 28350,22439,30007,20840,39491,41869,39490,41868,9671, 33700,37870,30891,966, 355, 22698,36972,36168,11030, 20813,14903,30879,28755,26965,14281,41868,37803,24487,31932,15184,13645,24941,36380,23943,38177,28221,32842,17400,7116, 6294, 41868,37756,34435,1161, 26018,11639, @@ -18335,7 +18330,7 @@ static const unsigned short Ranks[197839] = 33700,27134,4661, 4196, 5233, 5165, 12131,12195,13100,8120, 22065,21609,27656,5173, 5494, 15401,33028,1544, 36392,11590,9301, 827, 9512, 24138,16006,26120,31866, 797, 27854,33311,30250,15576,38992,2070, 8219, 458, 886, 32961,7061, 18124,6391, 16106,22712,20724,14550,16749,9760, 41868,13251,25469,24402,15450,39490,13870, 39277,30006,35321,26873,28701,38566,511, 17201,33061,30005,41867,37400,41867,30004,41867,33699,37756,5184, 6056, 36391,18302,18301,35320,39490,13762,23475,26350, - 22084,35320,18651,4120, 3337, 41867,34435,39490,35320,33699,31865,41866,37755,22438,37755,34434,36391,41866,3375, 37755,33699,17689,22437,39489,36391,39489,7518, + 22084,35320,18651,4120, 3337, 41867,34435,39490,35320,33699,31865,41866,37755,22438,37755,34434,36391,41866,3375, 37755,33699,17689,22437,39489,36391,39489,7518, 38014,9258, 5159, 11770,26308,15885,34530,307, 36391,39489,39489,39488,16308,25573,32875,455, 332, 30003,35320,22045,21608,37755,36390,28349,9955, 37754,34652, 17934,8644, 41866,38989,37754,41866,9811, 31646,35727,39488,41865,17200,39488,2685, 23981,109, 17955,41865,30002,342, 39488,31400,33061,39487,17199,26872,34434, 715, 37754,10699,30001,41865,6614, 553, 39487,3189, 35319,1165, 21, 25572,33699,12180,17198,6493, 260, 26871,41865,7306, 39487,33698,37754,1041, 41864,33060, @@ -18348,7 +18343,7 @@ static const unsigned short Ranks[197839] = 11498,20134,41860,3569, 9796, 33059,25568,9795, 39483,6204, 31855,33058,29998,35317,41859,32888,38930,33698,35317,17901,28346,22435,22434,37751,33058,23413,29997, 22569,564, 29996,20839,4571, 34967,34242,17900,39483,37751,36654,35316,38889,29995,15894,32715,33697,41859,15949,39483,12397,209, 9019, 1612, 3630, 405, 37750, 37750,3621, 16075,274, 41859,8903, 33058,28433,15876,1137, 5786, 13801,25567,965, 4309, 12687,41859,16916,26868,41858,20430,12066,39483,26063,24416,11497,33058, - 34432,954, 23369,39482,810, 37750,35021,8105, 3117, 33057,36304,41858,1671, 21703,17899,16074,16915,33158,8042, 33057,32330,33057,39482,37750,36524,11591,5690, + 34432,954, 23369,39482,810, 37750,35021,8105, 3117, 33057,36304,41858,1671, 21703,17899,16074,16915,33158,8042, 33057,32330,33057,39482,37750,36524,11591,5690, 41858,1791, 35316,11715,691, 17686,13761,17197,7254, 37749,19659,24437,31854,27528,2969, 632, 26358,20429,29994,36606,19031,14754,5225, 37749,14753,19528,41858, 36388,31853,11954,35919,35079,28404,6608, 1225, 10525,26535,22799,29076,33097,31124,33697,41857,14215,36388,21174,9396, 2308, 416, 7080, 32845,12258,16447,23178, 1872, 1694, 26124,9984, 41857,12808,39124,41857,39268,35265,35488,39482,18298,34432,23088,6411, 8647, 1978, 41857,2385, 10794,20428,37749,34554,26867,22433,37749, @@ -18359,14 +18354,14 @@ static const unsigned short Ranks[197839] = 208, 32851,1381, 12007,21, 7413, 5869, 33084,687, 10576,30689,9275, 10288,28918,9954, 39480,23367,37485,38306,35316,37748,18853,41855,36520,484, 13234,20041, 5224, 15366,35315,17584,9266, 34412,36146,36385,7913, 7482, 39480,39479,37747,37779,3113, 36385,3381, 38159,35315,28345,37747,1926, 16303,22612,13191,38451,39479, 1542, 22946,39479,2220, 153, 16048,14752,662, 33076,12928,41855,36385,39479,17573,19105,30669,37217,36807,41855,4570, 21524,10428,1201, 37747,9734, 4859, 19029, - 16072,12853,36781,22071,39478,6332, 8581, 8725, 23694,19028,7912, 28344,24415,5808, 32361,1894, 18700,14603,4359, 33697,33381,201, 32779,17378,34431,20426,9788, + 16072,12853,36781,22071,39478,6332, 8581, 8725, 23694,19028,7912, 28344,24415,5808, 32361,1894, 18700,14603,4359, 33697,33381,201, 32779,17378,34431,20426,9788, 7589, 10890,9983, 1961, 4338, 1722, 14235,33056,1807, 29541,27319,5759, 25565,36385,34572,7008, 13190,12927,36678,22434,352, 14234,660, 9200, 6691, 25250,30665, - 1536, 31656,1619, 6531, 8670, 8276, 29891,36384,19027,16912,5935, 38714,2091, 33791,36384,2195, 9240, 1346, 35315,35315,4882, 34293,34916,32837,41854,39478,9385, - 25564,37252,36853,4019, 13760,33696,39478,31850,33799,29993,36384,18852,8455, 24414,36257,37450,34704,36384,28494,35901,539, 12686,112, 33393,41854,35314,896, - 31849,1254, 1001, 788, 13464,978, 383, 1250, 608, 745, 1800, 17898,1599, 696, 3135, 2071, 30233,37747,2289, 36383,39478,2330, 864, 826, 31848,15316,1784, + 1536, 31656,1619, 6531, 8670, 8276, 29891,36384,19027,16912,5935, 38714,2091, 33791,36384,2195, 9240, 1346, 35315,35315,4882, 34293,34916,32837,41854,39478,9385, + 25564,37252,36853,4019, 13760,33696,39478,31850,33799,29993,36384,18852,8455, 24414,36257,37450,34704,36384,28494,35901,539, 12686,112, 33393,41854,35314,896, + 31849,1254, 1001, 788, 13464,978, 383, 1250, 608, 745, 1800, 17898,1599, 696, 3135, 2071, 30233,37747,2289, 36383,39478,2330, 864, 826, 31848,15316,1784, 564, 35314,10654,1278, 31847,15365,8554, 11496,1660, 41854,39477,15544,39477,14751,37746,41854,39477,20133,35314,36383,6030, 21213,503, 15481,39284,14647,41853, 41853,36662,39477,65, 23426,16815,17154,33908,812, 1433, 1138, 33409,38181,37746,5108, 24223,41853,8104, 18851,12571,22431,19475,25563,21382,272, 6576, 28627, - 25338,16407,39476,41853,35952,15364,21607,19119,24679,39476,41852,20837,24806,3259, 3336, 2806, 35314,20836,850, 2760, 8800, 33696,1268, 6892, 14833,408, 202, + 25338,16407,39476,41853,35952,15364,21607,19119,24679,39476,41852,20837,24806,3259, 3336, 2806, 35314,20836,850, 2760, 8800, 33696,1268, 6892, 14833,408, 202, 7391, 21127,39476,35356,1369, 3554, 16307,12926,41852,3568, 18296,1247, 4758, 8218, 7253, 10905,5622, 31846,17123,37746,18295,39476,33696,33696,37746,3705, 11952, 34519,746, 39475,31845,33695,4798, 36383,16734,17684,39475,39475,28656,37745,34226,41852,33695,29992,39475,12434,19474,26676,34431,13759,35313,1806, 41852,41851, 39474,23366,39474,15883,11951,23365,2371, 30370,25562,39474,546, 3629, 22776,29991,41851,39474,20870,34271,34755,33056,6221, 12591,13208,29990,15963,36383,39473, @@ -18374,15 +18369,15 @@ static const unsigned short Ranks[197839] = 34431,34431,33055,16207,37247,31844,41850,37745,37745,41850,35313,39473,37795,20425,776, 24413,23364,8676, 33694,25561,15488,11725,76, 25098,37284,2972, 22430, 17196,38053,22880,38814,21606,33694,33694,39473,23363,19473,20022,41850,37539,27968,35435,36433,28934,3306, 14233,37552,37745,12179,37744,36382,1335, 13569,11928, 3553, 25930,10725,37722,20835,41849,41849,37117,12557,7390, 33039,36174,35313,14232,5856, 31843,36382,41849,12925,8902, 36382,17195,33229,36645,32611,7167, 18850, - 20433,38049,36183,33055,39413,28342,3152, 12881,10187,18036,13702,12692,13701,8096, 25883,32944,19442,37744,39472,4123, 37744,3069, 27217,41849,34430,36382,3316, + 20433,38049,36183,33055,39413,28342,3152, 12881,10187,18036,13702,12692,13701,8096, 25883,32944,19442,37744,39472,4123, 37744,3069, 27217,41849,34430,36382,3316, 14526,28341,37163,37744,39472,20424,38795,6235, 9006, 8439, 12852,5013, 3571, 9781, 12320,26749,36130,18354,14322,39472,29988,20602,16733,13463,34430,32273,11096, 37743,17194,33617,41848,24412,35312,572, 41848,29030,37743,41848,22429,39237,21605,9534, 29987,36381,13758,19472,36759,41848,9794, 9127, 33641,10566,37471,33055, 35312,36265,25158,39472,41847,19471,33055,33054,37743,41847,25080,33694,4797, 41847,22613,37743,34430,8337, 8105, 37538,6161, 33693,7911, 27584,19026,39471,39471, - 33693,33693,19025,18849,33054,39305,36381,16732,7208, 36960,17021,20621,28340,39471,12421,41847,18294,13233,2064, 25560,36545,15882,10783,5853, 13106,39471,5061, - 33054,39470,15116,37742,37570,36381,11516,16071,35312,31010,37291,38343,11820,38620,29986,20132,7321, 18702,41846,33424,39470,41846,34854,29985,11278,41846,9873, + 33693,33693,19025,18849,33054,39305,36381,16732,7208, 36960,17021,20621,28340,39471,12421,41847,18294,13233,2064, 25560,36545,15882,10783,5853, 13106,39471,5061, + 33054,39470,15116,37742,37570,36381,11516,16071,35312,31010,37291,38343,11820,38620,29986,20132,7321, 18702,41846,33424,39470,41846,34854,29985,11278,41846,9873, 41846,23362,4783, 26864,35312,28339,25009,1039, 19024,10653,39470,14231,13232,1773, 14230,20982,13013,33909,24411,14073,41845,34513,39470,13462,36381,41845,39469, 7007, 9593, 39469,35311,39469,31842,324, 8407, 29357,41845,38470,3769, 29032,34411,12572,17722,38806,36515,14492,8868, 38342,30399,2211, 16269,38875,3926, 10652, - 5529, 41845,29984,39469,3272, 37742,23361,35311,37687,24410,6945, 33192,28432,34430,860, 28821,39468,35311,26863,38239,12685,2352, 11724,26862,3151, 33270,3848, + 5529, 41845,29984,39469,3272, 37742,23361,35311,37687,24410,6945, 33192,28432,34430,860, 28821,39468,35311,26863,38239,12685,2352, 11724,26862,3151, 33270,3848, 17683,20131,18689,26861,39468,41844,15363,16911,20423,36380,12665,365, 2314, 6829, 39165,8569, 15989,1643, 6891, 28338,1723, 7157, 8816, 5688, 15603,18848,24409, 12684,39468,39468,39467,28420,39467,7827, 39075,31841,41844,38278,41844,35298,18033,39467,41844,41843,2623, 8054, 29965,27500,26860,2109, 32994,29901,33138,11723, 37742,25559,35311,18815,1618, 35310,1698, 28337,41843,12065,39334,33693,37742,5621, 24326,7602, 15501,345, 13880,1554, 39467,12924,902, 8622, 17883,33054,37741, @@ -18393,7 +18388,7 @@ static const unsigned short Ranks[197839] = 8376, 18183,4754, 18453,6280, 10888,15260,21172,21602,30040,38183,8368, 39116,21870,22820,36860,26511,29136,31150,4540, 24644,29043,12420,16910,31171,7751, 37568, 7023, 36819,34129,36793,16072,32868,2693, 31429,35968,24407,36466,36618,36125,38325,3174, 16304,7096, 9793, 2012, 41841,13189,8007, 39466,41840,23359,41840,39465, 5493, 1201, 32941,21829,32959,39276,19023,20422,3604, 6583, 4313, 33692,13231,33053,19470,33572,194, 28903,41840,34429,39465,39465,11092,7564, 37740,39465,38734, - 36380,21601,41840,39464,33053,17897,3194, 21431,29980,38570,39464,6184, 33224,36379,1925, 12417,25717,697, 18827,36379,5106, 34429,41839,37740,29979,9025, 992, + 36380,21601,41840,39464,33053,17897,3194, 21431,29980,38570,39464,6184, 33224,36379,1925, 12417,25717,697, 18827,36379,5106, 34429,41839,37740,29979,9025, 992, 41839,4611, 33053,15029,41839,29978,18845,41839,27792,28227,34814,33692,38165,7681, 39464,35310,17353,90, 1353, 31838,15307,29327,33053,5855, 23358,29977,14399, 39464,37740,39463,989, 39463,29976,23357,8454, 14072,9061, 37740,23590,16069,39463,36571,35402,20833,39463,20448,1584, 13460,26859,8866, 25902,16731,38935,28335, 17681,37739,9141, 1460, 5845, 12135,41838,26858,39462,15362,35310,12807,22889,9265, 29975,41838,29974,20421,23992,29973,39462,13066,41838,36379,21600,31837,23949, @@ -18406,9 +18401,9 @@ static const unsigned short Ranks[197839] = 11060,41834,28332,35308,14763,34427,911, 16067,1117, 2318, 23462,3302, 11095,37737,35307,28096,32956,39458,39457,173, 32595,41834,34427,33691,26710,33104,36093, 23368,18292,39457,858, 19022,1659, 33927,36378,2776, 3609, 31983,778, 11280,38824,16129,15880,774, 21992,16027,2936, 31498,33051,2294, 11091,21594,37737,33051, 29967,29966,34426,35307,41834,36378,10691,2866, 37101,37097,41834,39151,19021,39457,11094,33051,5694, 24405,14762,14761,23354,36856,36378,41833,33155,36045,36377, - 18844,36609,14748,37737,28473,19345,38778,33159,36930,37736,37736,14070,10887,9787, 37736,7005, 20832,37736,36377,41833,10192,38144,2465, 20831,8415, 3015, 5309, + 18844,36609,14748,37737,28473,19345,38778,33159,36930,37736,37736,14070,10887,9787, 37736,7005, 20832,37736,36377,41833,10192,38144,2465, 20831,8415, 3015, 5309, 11208,6717, 11722,35307,29072,35307,37714,28331,5486, 35306,10462,19020,35842,23659,39457,13229,25557,34426,5308, 19947,8867, 38699,276, 25257,35738,33050,12419, - 4453, 12418,30414,33691,29965,19091,37735,37735,33691,38976,33690,7166, 22884,22570,12432,33690,33033,8728, 7919, 20130,39132,33334,34426,6653, 35306,14760,2875, + 4453, 12418,30414,33691,29965,19091,37735,37735,33691,38976,33690,7166, 22884,22570,12432,33690,33033,8728, 7919, 20130,39132,33334,34426,6653, 35306,14760,2875, 17921,17601,23305,24661,41833,9786, 4796, 38406,15761,5620, 20129,16730,23353,8453, 26754,34426,5307, 378, 10461,32803,3186, 17895,4193, 432, 17352,36013,23352, 9060, 33104,31943,6911, 25556,30092,590, 41833,10191,11992,23235,3463, 7933, 3684, 2194, 41832,41832,18291,18843,41832,39456,33690,35306,36377,35306,28543,33051, 24404,23488,7095, 19792,12350,33690,36377,809, 21831,41832,32108,39456,37735,21593,39456,39456,3050, 11277,19469,37735,5485, 25555,26855,31835,11400,7680, 34644, @@ -18418,7 +18413,7 @@ static const unsigned short Ranks[197839] = 22425,10886,41829,476, 21605,81, 7868, 22235,32949,39454,12064,29771,39454,36065,31084,33767,24403,26854,22424,522, 14930,522, 33010,7901, 4104, 32961,33049, 14546,35305,41829,37733,653, 18842,39454,39454,34425,41829,41829,26853,32829,22423,39453,2618, 16301,2050, 32658,36987,38050,41828,12063,41828,13473,37732,36677, 10866,35667,33885,23691,30938,15878,16066,11721,21292,33686,11422,19916,36375,536, 1679, 13456,4666, 29724,23832,25981,5666, 17578,32266,35305,33694,37154,41828, - 28329,24313,32969,21390,36051,7826, 37732,39453,35305,36375,39453,37732,32935,6700, 19, 2724, 1324, 3027, 3068, 39453,41828,26606,19421,35234,28675,18841,934, + 28329,24313,32969,21390,36051,7826, 37732,39453,35305,36375,39453,37732,32935,6700, 19, 2724, 1324, 3027, 3068, 39453,41828,26606,19421,35234,28675,18841,934, 29322,39452,686, 33227,35304,3972, 17894,32965,39452,39452,33049,18670,37940,35304,18290,35852,39452,36375,7563, 4861, 793, 41827,39451,35539,39451,39451,11093, 34424,38273,17679,4168, 20420,17893,37732,37731,24402,12431,17678,37731,5413, 39451,33689,21592,35304,41827,37423,15485,34424,15484,37731,33331,41827,35304,33689, 11948,36375,37403,41827,33049,15852,23882,37731,6423, 12542,37113,13898,9059, 41826,38240,4487, 49, 23651,12567,15922,30364,19231,21671,24914,3193, 12178,14398, @@ -18426,15 +18421,15 @@ static const unsigned short Ranks[197839] = 9591, 26851,1692, 23003,38522,39449,34423,36374,31831,4613, 39449,31257,36434,39449,16726,9792, 16065,33689,29963,41825,37730,37730,35890,18234,9351, 39449,36374, 41825,25554,36374,38124,36374,35328,35303,37730,39448,13755,18288,33233,37729,31402,21591,30564,12177,33688,41825,41825,14069,39448,8799, 39448,36357,39448,35303, 25553,39447,34423,39447,36373,39447,33688,35303,28426,15599,29845,34852,36373,36550,36869,39201,38777,38495,41824,41824,34423,23539,39447,28244,34734,37729,35323, - 36373,7799, 32643,32665,14014,33030,34133,41824,36373,23072,34423,39446,34422,36372,14198,37729,36212,37729,20419,17892,12806,12805,9239, 16909,13700,7481, 9386, + 36373,7799, 32643,32665,14014,33030,34133,41824,36373,23072,34423,39446,34422,36372,14198,37729,36212,37729,20419,17892,12806,12805,9239, 16909,13700,7481, 9386, 11632,34970,38238,38375,14192,39212,29550,24900,33354,39012,25046,14791,35426,29486,25395,12382,32884,7189, 5395, 19848,27190,22232,32185,31279,18761,32509,27472, 37771,32032,17347,15417,22691,22014,18551,29607,35997,21953,8952, 7847, 8456, 14794,15425,39446,6264, 37135,41824,23351,33688,31609,34941,35012,27591,37728,25809, 33688,20059,30583,33687,20128,34415,31927,16402,14528,29332,25358,39446,33463,6430, 23630,16841,16750,37224,17734,39243,16299,2494, 9791, 33299,36372,27518,16725, 31830,34422,8705, 41823,7908, 31829,15483,29962,17118,34000,33577,35878,37237,36372,18840,36372,37728,31828,28328,37728,20418,35988,9953, 10904,33143,9952, 15114, - 35303,13913,1844, 15989,10190,31827,23252,28011,19018,37728,34422,34422,25552,15113,41823,35552,10617,18916,27282,8168, 39446,14759,35302,3525, 34478,15877,9189, - 4610, 1240, 1361, 35856,41823,27623,35302,33914,33048,20127,41823,23350,6382, 9689, 41822,34444,41822,41822,3866, 7252, 32469,29961,35302,34421,35348,36371,3663, + 35303,13913,1844, 15989,10190,31827,23252,28011,19018,37728,34422,34422,25552,15113,41823,35552,10617,18916,27282,8168, 39446,14759,35302,3525, 34478,15877,9189, + 4610, 1240, 1361, 35856,41823,27623,35302,33914,33048,20127,41823,23350,6382, 9689, 41822,34444,41822,41822,3866, 7252, 32469,29961,35302,34421,35348,36371,3663, 6374, 34329,8866, 33743,28829,17677,1749, 6773, 16522,2507, 29410,27862,8717, 305, 4881, 20417,32964,20748,34077,35258,35310,6424, 38869,37000,19017,41822,37727, - 37727,34421,39445,35302,19016,27194,38543,23349,34741,3993, 24401,41821,34280,34515,2845, 41821,16619,38010,37727,15141,21590,41821,39445,37324,33687,2187, 7437, + 37727,34421,39445,35302,19016,27194,38543,23349,34741,3993, 24401,41821,34280,34515,2845, 41821,16619,38010,37727,15141,21590,41821,39445,37324,33687,2187, 7437, 41821,4831, 26850,27826,27306,37851,36371,2616, 36371,4918, 6263, 33048,12484,33574,28327,41820,22422,5769, 13425,24255,33074,22846,20401,39445,14884,10042,21448, 4330, 13260,19015,2475, 38915,25298,1879, 4012, 4036, 13406,6582, 13228,20416,37490,17296,33753,29114,17094,26129,26915,816, 21501,21529,37727,33687,35928,34421, 38026,19601,14035,20828,37726,33716,29835,4959, 41820,12417,16064,7378, 6581, 17823,4213, 30043,9785, 4224, 39052,18383,34474,38536,1578, 41820,39445,41820,38576, @@ -18446,7 +18441,7 @@ static const unsigned short Ranks[197839] = 34420,33686,37726,2735, 18714,36369,37725,29957,35301,41818,2663, 9670, 13819,16063,33686,17891,35300,41818,34018,11938,14149,34896,35929,19014,29956,35300,37725, 16908,28677,37725,29955,36369,27437,35307,24399,33048,35300,37059,21587,24430,35300,23347,20894,33474,37607,39442,41818,25550,25641,27488,3515, 8449, 32399,39441, 22961,18367,38343,37882,8543, 38586,28953,32831,33277,36067,12570,33637,11720,35218,41818,41817,41817,33047,38626,33973,33686,19466,21659,41817,33056,30907,33066, - 33010,33999,36518,7798, 18287,7150, 32716,39441,41817,99, 35046,39258,41816,20126,32396,39441,16504,37180,35506,36939,33253,4972, 39441,19465,2865, 21939,1827, + 33010,33999,36518,7798, 18287,7150, 32716,39441,41817,99, 35046,39258,41816,20126,32396,39441,16504,37180,35506,36939,33253,4972, 39441,19465,2865, 21939,1827, 19013,36564,33686,2568, 15112,9087, 1196, 11891,33622,816, 9509, 24553,10221,4357, 28879,36619,7572, 33094,6160, 39440,28323,14068,36369,22421,35207,39440,37177, 14445,594, 39370,33441,11212,36369,7196, 11157,25231,41816,16062,36368,33685,12416,593, 12386,37664,10392,33402,10585,38613,4031, 14228,41816,23599,23247,37848, 34410,13213,13023,19012,7004, 35299,33853,35354,32911,4061, 4860, 33047,29669,33347,37725,37724,39440,39440,21390,35896,33707,14396,41816,33685,39439,14067,39063, @@ -18455,20 +18450,20 @@ static const unsigned short Ranks[197839] = 13404,14066,30304,7918, 29077,35298,35614,14942,36368,33094,34698,18838,35298,34420,39203,36835,13238,15701,36368,32780,10401,11087,2834, 18773,9868, 11512,35905, 35298,5339, 39097,20622,26847,10563,31824,37126,41814,33685,21103,20880,7309, 3014, 690, 3478, 39439,36367,32057,31823,31822,36367,13334,41814,33685,41814,39438, 41813,310, 29954,39438,25549,31821,41813,2882, 3240, 1658, 26726,39438,41813,41813,37723,3963, 41812,1555, 41812,34419,35298,12323,2937, 7320, 39438,35087,35297, - 37723,1054, 12098,39437,36367,34419,41812,2219, 37723,34419,34726,3758, 1108, 14323,36987,22922,34058,39437,2718, 9982, 38197,14756,41812,17890,35297,41811,7879, - 1224, 34218,30415,23346,36367,9790, 20533,30660,34721,12176,33743,38358,37103,31814,19464,34342,11132,11421,25548,18201,37625,10788,24097,41811,36366,36366,1518, - 541, 7917, 39437,16298,16061,11544,20413,32953,41811,18750,2143, 19011,6263, 22653,16060,17625,28322,36366,20412,26846,34419,39088,39437,12193,35297,41811,9588, - 33046,6851, 3452, 34505,33684,33347,3374, 503, 38720,31820,41810,18837,39436,31819,20411,13754,35977,167, 3009, 17905,32552,32952,30007,19959,23696,13919,5732, + 37723,1054, 12098,39437,36367,34419,41812,2219, 37723,34419,34726,3758, 1108, 14323,36987,22922,34058,39437,2718, 9982, 38197,14756,41812,17890,35297,41811,7879, + 1224, 34218,30415,23346,36367,9790, 20533,30660,34721,12176,33743,38358,37103,31814,19464,34342,11132,11421,25548,18201,37625,10788,24097,41811,36366,36366,1518, + 541, 7917, 39437,16298,16061,11544,20413,32953,41811,18750,2143, 19011,6263, 22653,16060,17625,28322,36366,20412,26846,34419,39088,39437,12193,35297,41811,9588, + 33046,6851, 3452, 34505,33684,33347,3374, 503, 38720,31820,41810,18837,39436,31819,20411,13754,35977,167, 3009, 17905,32552,32952,30007,19959,23696,13919,5732, 33046,36082,33046,26845,9533, 16724,25547,34534,1255, 20413,25409,13227,6262, 39436,33046,35382,8102, 32796,29953,28503,2070, 2949, 31974,17676,4887, 28285,36779, 19463,34418,34116,33254,37723,33632,24300,14364,41810,6806, 15682,4744, 41810,39436,37901,36366,36365,4987, 26770,29849,41810,29952,10236,23345,20826,3068, 33684, 18836,39436,1876, 15222,18303,11739,35297,34301,39085,35272,37722,15622,1535, 37722,8101, 33218,26985,13699,33408,21079,31818,15055,39435,35927,33684,22643,28150, 34567,41809,33621,8409, 9383, 39435,13137,38789,5882, 20068,7530, 38148,14395,39435,37722,8217, 39435,14227,34681,41809,17209,34418,36365,37360,13457,34164,16906, - 4308, 19010,27490,14226,41809,34802,20125,39434,22565,261, 12498,36257,33684,38091,4076, 11403,14065,13226,38417,35296,19462,39434,25546,12548,5101, 14394,7109, + 4308, 19010,27490,14226,41809,34802,20125,39434,22565,261, 12498,36257,33684,38091,4076, 11403,14065,13226,38417,35296,19462,39434,25546,12548,5101, 14394,7109, 345, 35296,41809,25497,36365,41808,31817,36365,18835,35296,34172,15482,37068,29951,34418,36240,38661,25545,39434,34418,11714,38192,35449,35296,12062,36364,36364, - 35014,38348,20124,4061, 6332, 24715,26844,20123,25544,36364,6753, 14393,36786,39434,8006, 24398,25543,184, 21278,3600, 32947,18601,19930,16382,33683,24753,7673, - 17731,10050,28321,37722,14697,32817,39405,38461,30096,34004,33605,36906,4569, 41808,34417,27081,8319, 5693, 21400,90, 8871, 14073,13323,2186, 31092,22247,6652, + 35014,38348,20124,4061, 6332, 24715,26844,20123,25544,36364,6753, 14393,36786,39434,8006, 24398,25543,184, 21278,3600, 32947,18601,19930,16382,33683,24753,7673, + 17731,10050,28321,37722,14697,32817,39405,38461,30096,34004,33605,36906,4569, 41808,34417,27081,8319, 5693, 21400,90, 8871, 14073,13323,2186, 31092,22247,6652, 24359,35151,18503,39433,27741,35530,26843,24525,1078, 25379,33683,12922,8731, 27148,36863,26484,31408,37721,35793,36590,5398, 27695,34417,26208,39433,24420,17675, - 30059,39433,14419,41808,24552,38309,29480,34696,7319, 126, 21393,36364,18173,10226,33683,36363,41808,3403, 38641,39433,20122,12175,28232,36229,9611, 28390,1197, + 30059,39433,14419,41808,24552,38309,29480,34696,7319, 126, 21393,36364,18173,10226,33683,36363,41808,3403, 38641,39433,20122,12175,28232,36229,9611, 28390,1197, 28618,2216, 41807,37721,41807,39432,39432,6917, 2609, 35295,36403,17691,33778,33232,37817,36363,39432,35829,5204, 36884,33856,33683,29691,33045,26842,35750,35295, 22419,8052, 535, 31164,17299,34417,38124,21756,36770,23344,3026, 20121,41807,363, 1095, 24940,13046,5097, 13668,23523,24198,10863,20336,7664, 31361,6343, 32947, 21454,33704,32886,16905,5516, 10393,30966,34340,38856,33019,5194, 37721,10433,34417,5412, 20410,7653, 37721,20260,38846,41807,41806,36363,39204,36363,33853,41806, @@ -18476,7 +18471,7 @@ static const unsigned short Ranks[197839] = 708, 9493, 28320,39431,35274,39431,1670, 31077,26905,11599,13459,20402,285, 8077, 30236,3655, 114, 2206, 14840,11724,26451,31058,3209, 34121,873, 26841,35578, 6961, 60, 5368, 21928,31877,41805,1030, 37720,4795, 35942,35250,39431,30296,896, 10927,30081,28569,18282,35423,33595,35846,19098,41805,38163,10016,30897,39430, 327, 27663,28039,3628, 19768,34165,4757, 39430,30879,39002,26840,30403,19771,34524,15938,8536, 25403,29950,41805,34926,12995,39430,2271, 35295,36362,36361,41805, - 39430,33741,16896,41804,39429,3992, 50, 20553,38634,26846,36361,39429,2974, 41804,39429,39429,33412,39096,22366,26901,26952,9394, 10752,5751, 16489,6292, 7022, + 39430,33741,16896,41804,39429,3992, 50, 20553,38634,26846,36361,39429,2974, 41804,39429,39429,33412,39096,22366,26901,26952,9394, 10752,5751, 16489,6292, 7022, 23899,19633,15267,3409, 11719,24629,2116, 3067, 18834,39428,25542,33329,14220,36361,8041, 16904,23415,37825,34416,28319,20119,39428,33492,13698,33001,34319,35307, 19009,37079,3962, 39428,41804,9981, 2076, 14392,15360,3134, 39428,9866, 33682,23605,10562,23343,34416,36361,11713,35295,10189,16297,2749, 29949,26839,25541,20825, 8451, 33045,71, 22787,27933,41804,32636,1143, 35830,23342,37743,10903,30280,25540,36222,33682,36387,32772,30424,36360,37720,39427,18286,13354,17557,1068, 30549, @@ -18484,9 +18479,9 @@ static const unsigned short Ranks[197839] = 530, 6577, 14361,31815,31642,41803,28317,29948,33681,15891,19163,34022,34416,41803,15000,37719,29947,41802,37719,371, 17888,41802,38903,29485,15634,13458,14225, 27880,27228,16296,5061, 16, 5206, 32630,32870,33045,11947,16215,4385, 20473,32998,2098, 11636,37719,41802,1600, 39427,41802,4230, 16023,16903,6203, 22418,37500, 39426,7476, 36360,35294,29946,38316,39426,30892,1724, 19161,2604, 315, 2132, 30716,10898,22068,33066,20371,9551, 9139, 33208,3163, 26275,41801,23682,30824,17365, - 11494,33045,14755,35294,39426,9264, 37719,13796,34416,592, 3227, 23278,34415,33681,748, 27179,36185,36360,15294,30433,38331,39426,38889,16154,16274,32810,9532, + 11494,33045,14755,35294,39426,9264, 37719,13796,34416,592, 3227, 23278,34415,33681,748, 27179,36185,36360,15294,30433,38331,39426,38889,16154,16274,32810,9532, 34415,29172,17017,15094,36360,41801,37718,37468,34415,38927,34695,38600,31882,35646,36325,19451,41801,37718,11718,38603,12174,34585,38611,37519,37972,27139,23432, - 21395,34589,34415,12838,41801,39273,41800,41800,15359,9142, 6647, 37050,4211, 7824, 13636,28542,37718,15170,38786,34605,19305,6982, 37532,12529,36826,26107,7327, + 21395,34589,34415,12838,41801,39273,41800,41800,15359,9142, 6647, 37050,4211, 7824, 13636,28542,37718,15170,38786,34605,19305,6982, 37532,12529,36826,26107,7327, 36941,10450,1386, 1380, 26838,4462, 26837,14754,37204,41800,41800,36359,6202, 36359,33044,39425,41799,33681,33149,16295,12606,41799,38908,38824,37718,22417,22877, 32236,22416,6943, 41799,25502,37717,9024, 35294,20824,37717,39425,39141,15110,37717,33611,32824,34642,15482,13188,2578, 36359,41799,41798,37717,15744,39425,41798, 16693,35515,15875,8740, 33416,36359,39166,37716,13753,25537,41798,34414,37896,34414,4086, 6942, 10561,6201, 39425,35294,33044,28316,38944,8184, 39409,35190,25431, @@ -18496,12 +18491,12 @@ static const unsigned short Ranks[197839] = 35293,35292,963, 33043,41796,39424,41796,33043,33680,34414,37715,39423,13752,16294,37715,34414,39423,24023,32028,4119, 21371,34413,315, 41796,10651,12922,39216, 28314,33680,6373, 41796,39423,37271,41795,36582,9381, 34413,28168,39423,14753,35773,24395,16348,34092,39422,24967,25438,19811,41795,23339,19461,37715,2679, 32619, 12855,9017, 34481,41795,5017, 34299,39422,39422,29580,22415,32770,37775,19806,9221, 35292,32871,10391,13225,38339,10560,39422,27652,28859,41795,35106,30655,34788, - 41794,26778,41794,24394,36311,34732,1419, 39421,37714,2622, 22155,6049, 33096,1673, 15358,17112,7475, 12520,6651, 31987,13224,36357,24758,33753,36185,38001,5961, + 41794,26778,41794,24394,36311,34732,1419, 39421,37714,2622, 22155,6049, 33096,1673, 15358,17112,7475, 12520,6651, 31987,13224,36357,24758,33753,36185,38001,5961, 84, 27312,26250,21327,32182,41794,34640,7562, 41794,34413,12642,37714,14310,22414,30180,41793,41793,26836,12681,35073,37714,23, 1517, 9996, 30111,17372,32820, 23291,27020,28076,13832,17693,32809,26264,18976,10264,28279,3627, 33732,22413,17448,6695, 30411,36447,25557,39421,38963,38671,3626, 29259,36150,28740,17777,36917, 38897,41793,26596,39421,41793,39421,41792,11479,30509,33498,33211,13835,32943,39420,27187,38940,2070, 8137, 39420,34936,9023, 8301, 35883,38943,35292,37714,33396, 28313,37661,4509, 4356, 22885,34413,39420,41792,41792,41792,19008,24415,21586,37713,28581,12061,36244,10575,24789,37391,33680,39420,36029,36357,15874,25535,16902, - 12060,26835,7578, 15936,28076,39419,28258,15016,35606,36440,34412,33608,34887,37713,36357,17050,41791,29435,41791,41791,33680,39299,39241,4337, 13955,7389, 829, + 12060,26835,7578, 15936,28076,39419,28258,15016,35606,36440,34412,33608,34887,37713,36357,17050,41791,29435,41791,41791,33680,39299,39241,4337, 13955,7389, 829, 41791,38034,28377,13827,25765,37615,2266, 29942,26520,2160, 19460,39419,35292,26834,35291,15108,1566, 29597,34678,33679,36357,4383, 39419,16274,35291,20695,19459, 21585,41790,14973,41790,38032,21584,37713,37713,39419,41790,38121,29175,26791,34199,35044,36356,5484, 35291,41790,38259,36356,41789,39418,19633,33043,10235,33391, 39418,37712,32381,37263,36240,34608,34362,20408,41789,27321,37712,37487,35736,39418,33272,26259,26833,33679,28312,29941,41789,14064,37248,35536,41789,23338,34095, @@ -18511,9 +18506,9 @@ static const unsigned short Ranks[197839] = 15866,22546,29850,13767,41788,6079, 10354,33358,33054,37712,3214, 23544,8608, 5768, 33033,28310,38995,36355,31548,19770,13697,6550, 30335,24393,34275,13277,32932, 20117,27090,13750,28309,3112, 39416,36324,9664, 20823,11276,19458,29940,18951,31675,33434,1966, 3527, 24503,25430,27338,23664,26498,36542,33679,26583,32852,41788, 32745,2602, 32972,32558,1403, 24085,20133,35624,1714, 9382, 18656,14616,1253, 3017, 12216,8904, 11198,28012,38534,28169,17610,36355,25044,39416,37914,34412,37620, - 34372,12804,9506, 28356,8798, 17190,5991, 41787,28141,35605,20443,8538, 1856, 5216, 17673,15873,39416,7910, 41787,34411,23074,34191,34705,15673,37711,22541,6262, + 34372,12804,9506, 28356,8798, 17190,5991, 41787,28141,35605,20443,8538, 1856, 5216, 17673,15873,39416,7910, 41787,34411,23074,34191,34705,15673,37711,22541,6262, 30807,13223,6382, 21339,25762,6027, 37008,34167,19719,36205,24664,33964,34306,3181, 20581,8751, 35414,1910, 10551,4011, 4958, 21543,7244, 37451,41787,39334,18598, - 4332, 35290,39415,33488,8226, 28354,17435,33679,38719,27610,38024,36011,31813,39306,9732, 9238, 39009,35290,36540,14464,38515,31632,33678,39415,14062,2107, 8797, + 4332, 35290,39415,33488,8226, 28354,17435,33679,38719,27610,38024,36011,31813,39306,9732, 9238, 39009,35290,36540,14464,38515,31632,33678,39415,14062,2107, 8797, 37711,33678,22412,19457,4648, 41787,6159, 37711,24320,37711,25616,36376,9416, 11997,1166, 6917, 368, 9025, 32840,9993, 37537,21263,36431,31160,3475, 37909,35117, 39415,12332,17852,23468,25077,25863,33796,10429,34689,35776,41786,2882, 22411,14694,37710,41786,1971, 4308, 1719, 34411,7194, 12415,16057,34411,2937, 10650,12280, 24332,20057,23337,20822,2983, 17886,2249, 41786,41786,12058,36572,14746,33042,32205,36165,41785,39415,13696,18269,415, 39414,39414,17672,36355,39414,3206, 11493, @@ -18524,26 +18519,26 @@ static const unsigned short Ranks[197839] = 4212, 34672,35289,33318,39413,36354,21582,34795,16020,37709,6747, 34466,13222,24603,41783,39413,1146, 3886, 33041,24458,7909, 24392,26375,22770,4628, 38949,11572, 41783,27333,36354,39413,33678,39413,39412,31862,26830,33041,26490,5411, 20406,23655,35741,37989,7285, 19006,16901,14744,19005,32797,3353, 35231,6579, 212, 28924, 32999,36353,26972,27004,41783,39412,32821,35159,39412,41783,34410,34410,32937,13695,37709,36353,39412,9762, 16900,34409,38166,41782,7388, 15872,34409,13221,26829, - 26828,37709,8709, 16255,24452,39411,41782,23335,14752,41782,16293,17774,456, 3352, 31810,23334,8408, 32541,41782,38510,37232,41781,7029, 24076,3465, 32146,9514, - 4305, 6782, 5982, 20718,7420, 32434,2764, 69, 23142,28144,24479,14168,2124, 11965,39411,31809,39411,37708,32219,16899,39411,28307,17928,34189,21581,8005, 3865, + 26828,37709,8709, 16255,24452,39411,41782,23335,14752,41782,16293,17774,456, 3352, 31810,23334,8408, 32541,41782,38510,37232,41781,7029, 24076,3465, 32146,9514, + 4305, 6782, 5982, 20718,7420, 32434,2764, 69, 23142,28144,24479,14168,2124, 11965,39411,31809,39411,37708,32219,16899,39411,28307,17928,34189,21581,8005, 3865, 16898,33566,23950,2928, 217, 14442,39410,29937,36353,9951, 4859, 41781,2004, 12680,36353,33200,33678,9784, 3757, 37708,314, 41781,37708,41781,23754,31808,11625, 33740,33467,13279,37708,34029,30074,35129,27333,36352,41780,34409,41780,9108, 14771,10024,15835,9393, 33479,19004,36226,12414,28306,35288,41780,39410,36333,35753, 35288,33041,38661,21580,31807,39410,23333,16330,16056,35295,35288,39410,17884,8900, 16721,41780,13694,37707,41779,41779,8335, 8099, 22992,16754,10144,32572,19003, 16897,1073, 16762,7471, 1886, 33677,41779,6331, 37707,15107,37707,37085,9367, 6746, 23332,23331,35288,41779,19002,35287,16896,20405,15357,41778,18830,5828, 16895, - 5587, 14751,16894,16055,16054,37678,13749,2337, 36352,36352,41778,39409,9392, 37656,17805,5827, 35287,11651,29410,5466, 32965,17883,14273,35287,20404,31718,6877, - 2882, 41778,3261, 41778,39409,37537,11155,9716, 6862, 6130, 31513,32941,36382,41777,39409,39409,2491, 33589,41777,5527, 37707,2748, 25168,41777,10428,8674, 2625, - 25679,12057,41777,8113, 9057, 16524,33012,29936,41776,29935,31806,26719,19234,25976,9783, 38615,37022,33041,27033,25210,2799, 7433, 35424,39063,34409,23330,6158, + 5587, 14751,16894,16055,16054,37678,13749,2337, 36352,36352,41778,39409,9392, 37656,17805,5827, 35287,11651,29410,5466, 32965,17883,14273,35287,20404,31718,6877, + 2882, 41778,3261, 41778,39409,37537,11155,9716, 6862, 6130, 31513,32941,36382,41777,39409,39409,2491, 33589,41777,5527, 37707,2748, 25168,41777,10428,8674, 2625, + 25679,12057,41777,8113, 9057, 16524,33012,29936,41776,29935,31806,26719,19234,25976,9783, 38615,37022,33041,27033,25210,2799, 7433, 35424,39063,34409,23330,6158, 18285,2149, 35287,2962, 5826, 11717,34408,11228,17670,26827,36352,1129, 12326,4279, 482, 13693,2314, 2688, 20688,491, 12699,37569,31805,41776,19001,31804,33677, 41776,38457,39408,7193, 9391, 19000,2292, 36351,34408,30025,39408,41776,31986,37706,1518, 14975,25932,1357, 34408,34408,31803,23213,16053,37706,41775,41775,16720, 36351,24391,41775,41775,39408,38536,39408,6578, 11420,37706,37706,4103, 12413,35286,37705,33677,35286,9980, 1229, 9237, 41774,8796, 15549,14209,6716, 3657, 37705, - 7435, 35504,39407,41774,33696,34643,12803,23994,18999,41774,41774,39407,33677,35286,20116,25917,19308,26826,38440,33676,39407,36351,41773,41773,2638, 6877, 851, + 7435, 35504,39407,41774,33696,34643,12803,23994,18999,41774,41774,39407,33677,35286,20116,25917,19308,26826,38440,33676,39407,36351,41773,41773,2638, 6877, 851, 4922, 1541, 4414, 37452,3626, 8040, 16893,8166, 16052,37766,17819,21129,38377,9135, 39407,37705,37705,35286,34407,25532,37704,6889, 7319, 29934,17611,20115,34407, 35285,33676,41773,28305,18829,37704,35285,35285,37704,35285,19208,14387,21579,41773,10233,17188,41772,20114,35284,36351,26825,6492, 37704,35284,36350,37703,31802, 35284,39406,28304,895, 35284,2057, 37703,41772,26824,39406,36350,1357, 41772,9669, 41772,41771,1635, 31801,26125,31800,6612, 41771,11090,33040,28303,39406,25531, - 14223,3755, 19615,25039,8334, 6261, 35283,41771,36350,17669,39406,37703,35283,37703,41771,23329,23328,37702,37702,31799,41770,37702,26823,39405,17668,41770,9668, + 14223,3755, 19615,25039,8334, 6261, 35283,41771,36350,17669,39406,37703,35283,37703,41771,23329,23328,37702,37702,31799,41770,37702,26823,39405,17668,41770,9668, 26822,41770,9140, 14743,41770,41769,12921,22408,35283,39405,37702,35283,33676,39405,36350,41769,29933,33676,33675,39405,6491, 26821,11711,39404,41769,41769,36349, 36349,24165,34407,36349,36349,33040,35282,36348,37701,21578,34407,9045, 32044,37701,36387,37701,39404,5069, 35282,36348,8753, 41768,34406,35282,6611, 39404,41768, - 41768,35282,7652, 35281,33675,33675,36348,24390,41768,29932,19603,36348,41767,35281,22411,35523,21577,41767,36347,37701,22407,39404,33040,22406,37700,41767,9950, + 41768,35282,7652, 35281,33675,33675,36348,24390,41768,29932,19603,36348,41767,35281,22411,35523,21577,41767,36347,37701,22407,39404,33040,22406,37700,41767,9950, 33040,16292,32170,16051,31798,1215, 1535, 24198,5934, 6840, 39403,7093, 14061,21576,4966, 15106,34406,9022, 39403,17667,15871,15105,41767,5578, 41766,41766,35662, 39403,36347,37700,29931,29930,37700,13457,25530,39403,39402,9021, 29929,39402,20820,34406,18284,41766,17666,14060,41766,29928,25529,34406,37700,23861,5141, 39402, 33675,22549,2056, 39402,28302,39401,35281,7164, 41765,37699,31797,39401,41765,23327,37699,41765,36347,10729,33674,26132,35917,19277,10188,30324,31796,39401,39401, @@ -18571,14 +18566,14 @@ static const unsigned short Ranks[197839] = 2175, 4364, 1748, 2198, 5383, 8674, 35551,33157,37184,33035,16713,34400,37064,41742,3710, 29916,36337,39390,31777,37689,15478,41742,23323,29915,5854, 19452,37688, 41742,24380,41741,32318,26811,20814,41741,18823,21569,37688,39390,39267,24671,25522,34874,35278,37227,35150,39390,39050,34400,37688,36337,28289,33668,39390,23322, 39389,9978, 26810,26809,44, 6855, 23467,9236, 18936,14757,12171,36714,9235, 15104,16049,8795, 25521,7114, 23698,33933,9205, 36922,5022, 35271,13843,39072,30594, - 28843,33404,369, 11745,35328,7588, 11419,25520,7484, 19651,35271,6609, 4018, 41741,20296,41741,41740,28288,24379,34400,34400,19451,36337,39389,18822,39389,8794, + 28843,33404,369, 11745,35328,7588, 11419,25520,7484, 19651,35271,6609, 4018, 41741,20296,41741,41740,28288,24379,34400,34400,19451,36337,39389,18822,39389,8794, 13567,36336,41740,3239, 34348,16888,39389,33035,24378,37688,39388,36336,21568,33035,41740,41740,14057,2186, 41739,29914,41739,24377,21567,33668,6549, 41739,25519, 31776,4167, 37687,28287,15103,17659,41739,37687,41738,41738,41738,41738,35271,20402,11944,7651, 17658,39388,35271,29913,28286,13455,27065,1950, 12170,33035,39388, 3886, 29912,33034,41737,39388,34399,34282,29911,20109,33034,28285,23321,29910,26808,8004, 25518,14740,31775,4756, 4331, 15191,29909,23793,39387,26807,511, 41737, 41737,26806,39387,10556,12428,36336,26805,15869,39387,24376,41737,37687,34399,12679,37687,39387,14056,35270,35270,9138, 41736,28284,13184,37538,33668,25517,39386, 41736,31774,41736,2881, 39386,19450,33034,33034,36336,41736,34399,39386,7249, 24375,35270,34249,36335,31773,36335,37686,10231,15477,12169,41735,41735,36335,37686, 41735,33667,41735,34399,37686,17657,39386,17656,11705,8899, 29908,23012,33667,35270,16289,7650, 37686,34398,39385,41734,35269,21566,36335,11490,9448, 21565,33667, - 2123, 37777,41734,25516,41734,13183,37685,6888, 5577, 20108,2392, 37685,41734,41733,33033,14384,26804,37685,285, 32524,18278,35269,1617, 3620, 31772,15388,1792, + 2123, 37777,41734,25516,41734,13183,37685,6888, 5577, 20108,2392, 37685,41734,41733,33033,14384,26804,37685,285, 32524,18278,35269,1617, 3620, 31772,15388,1792, 41733,31771,8793, 5073, 4965, 39385,24721,6225, 33667,33033,26803,36270,39385,26802,35269,37685,19449,36334,31770,12168,39385,37684,20639,37684,39384,21564,37684, 41733,36334,15476,20107,33314,26801,41733,1957, 34398,39384,36334,41732,37684,6490, 9263, 23320,37683,4964, 41732,29907,35269,34730,31769,39384,8003, 13057,30170, 2122, 37683,16712,32265,37683,34205,26800,41732,15868,21563,24374,39384,35268,37683,36334,36333,39383,16288,37682,12678,39383,36333,11943,39383,31768,13454,33264, @@ -18592,21 +18587,21 @@ static const unsigned short Ranks[197839] = 14054,38421,39377,29186,39350,35361,36236,33900,11206,29901,33665,35267,39377,18820,37678,12056,5262, 29900,14383,3437, 17183,39377,36250,17655,30033,35522,31765, 11418,18995,14748,27808,37678,15867,31764,13692,41726,29899,39376,34134,35266,36330,8724, 8165, 26796,34395,21562,10312,19876,7231, 149, 5327, 25356,11070,10020, 30054,1556, 4152, 14747,3727, 22737,12802,25330,15354,12801,23573,5682, 8099, 92, 1622, 11000,30933,28942,22482,20104,32905,10387,17902,34395,29119,3372, 23317, - 17879,14746,36610,14926,19256,33665,15528,10427,16887,14224,35266,31763,29898,796, 14439,12207,35521,16048,23966,621, 16785,19088,9401, 15709,4041, 9218, 2527, + 17879,14746,36610,14926,19256,33665,15528,10427,16887,14224,35266,31763,29898,796, 14439,12207,35521,16048,23966,621, 16785,19088,9401, 15709,4041, 9218, 2527, 36247,35818,41726,36882,1143, 10884,8442, 38141,30683,8360, 23095,38476,284, 3271, 19643,23673,16099,228, 6854, 26292,35173,14153,37678,26795,569, 2030, 18994, 35266,2957, 30494,33758,25751,511, 29774,4311, 13583,32, 2633, 27890,22988,10436,14545,29188,25838,36330,10555,688, 19782,22416,41726,1008, 24046,12167,23316, 7496, 35054,25130,14677,35630,9386, 433, 10577,32140,15365,21243,22734,41726,7916, 12412,11417,14223,8580, 16047,18304,18865,2354, 30503,7176, 20582,15017,20104, - 16630,39220,5001, 34175,3726, 23315,26794,17654,33032,7003, 16886,37677,10883,16046,36330,39376,3624, 33664,6440, 8723, 4846, 17878,36646,10187,9380, 35177,5454, - 7789, 37369,4711, 8164, 33182,30689,9979, 7021, 14222,25194,25278,5109, 5260, 11683,1723, 19931,7679, 28264,33444,1994, 25281,4586, 6373, 4730, 7284, 37158,6942, + 16630,39220,5001, 34175,3726, 23315,26794,17654,33032,7003, 16886,37677,10883,16046,36330,39376,3624, 33664,6440, 8723, 4846, 17878,36646,10187,9380, 35177,5454, + 7789, 37369,4711, 8164, 33182,30689,9979, 7021, 14222,25194,25278,5109, 5260, 11683,1723, 19931,7679, 28264,33444,1994, 25281,4586, 6373, 4730, 7284, 37158,6942, 1660, 4102, 4637, 38112,10649,1424, 39030,4539, 32548,3180, 10426,1352, 4505, 4020, 8857, 3541, 11891,5167, 35529,28323,4606, 19087,14140,41725,1099, 14067,14745, 5933, 1188, 12411,2716, 21934,4336, 28207,9978, 13219,6005, 6362, 27560,33667,11167,18993,15353,11188,39376,13182,16506,3912, 41725,36329,15056,33664,41725,33718, 11728,1976, 37888,8261, 37677,11972,17346,35717,5093, 16030,7156, 7950, 16626,35797,35100,33664,41725,12676,16936,18276,25514,8216, 41724,28942,39376,33032,33664, - 21561,2192, 11942,37677,34395,3741, 37590,11851,10053,39375,7988, 25662,13218,6595, 9782, 15352,4256, 9977, 32275,36457,7020, 36312,33786,7678, 39375,14806,1432, + 21561,2192, 11942,37677,34395,3741, 37590,11851,10053,39375,7988, 25662,13218,6595, 9782, 15352,4256, 9977, 32275,36457,7020, 36312,33786,7678, 39375,14806,1432, 9540, 1287, 13741,31456,10648,18672,33332,13217,20400,18992,7677, 33807,34915,38300,39396,18991,7272, 20810,12800,10647,23358,41724,17661,32727,2769, 4773, 27308, 30195,29754,21743,12100,29063,15147,24759,41724,18990,33456,2568, 15475,19181,41724,34133,36329,14744,12055,41723,7908, 33031,34394,37677,16885,34394,33416,33339, 39375,14317,914, 27209,32887,16045,8837, 17596,3754, 9736, 11436,2377, 20242,3938, 39230,2757, 5932, 12410,18989,33663,12187,21639,41723,9379, 7649, 13216,37676, 13691,20399,3885, 30237,18338,32600,18275,30711,16044,13415,20398,12409,18988,12191,21794,34394,14793,33848,20085,21420,41723,37676,18118,25439,23889,36813,31038, - 31425,30755,41723,21613,33198,14094,33493,409, 7871, 24274,20103,14743,12799,13838,4392, 32947,13746,20809,37676,20140,12787,36822,8441, 34394,6330, 36596,5343, + 31425,30755,41723,21613,33198,14094,33493,409, 7871, 24274,20103,14743,12799,13838,4392, 32947,13746,20809,37676,20140,12787,36822,8441, 34394,6330, 36596,5343, 26626,25513,35266,28280,8215, 36329,15866,33663,41722,21560,39301,41722,37676,36329,28422,33663,24501,36328,37952,6493, 3601, 32813,36460,20396,20134,38680,22338, 7283, 20785,22665,22896,33197,10478,9378, 41722,11704,18274,22151,30240,13042,26544,11596,7737, 28279,28278,4167, 10646,39330,35814,16884,9171, 2962, 33663,41722, 35265,7551, 34011,41721,16677,2293, 33125,39375,20397,37825,33211,4037, 2449, 35157,29418,10230,7387, 25596,9175, 37893,25512,1198, 6276, 5526, 11157,2069, 11273, @@ -18617,7 +18612,7 @@ static const unsigned short Ranks[197839] = 18160,14170,8332, 35739,15101,6730, 29411,18819,25419,38370,31133,7825, 1506, 35265,35766,18986,35265,41720,21508,1217, 573, 16062,37530,22748,26201,8581, 11075, 37674,29578,31759,33031,35185,41720,33031,41720,39373,33662,37108,18273,39373,37373,41720,28276,37674,6704, 19407,25510,41719,21559,28275,2608, 5482, 23424,33030, 37674,1696, 22468,36224,37593,20396,36349,19865,17959,36779,7787, 19111,35945,41719,23314,37149,22400,8333, 29896,35265,39373,36328,41719,18818,39373,7676, 12797, - 23015,37144,79, 23312,37289,36177,28089,896, 13232,10881,5060, 35933,35264,826, 9262, 39372,19448,36327,36074,38632,8634, 36327,4454, 11703,81, 31143,2351, + 23015,37144,79, 23312,37289,36177,28089,896, 13232,10881,5060, 35933,35264,826, 9262, 39372,19448,36327,36074,38632,8634, 36327,4454, 11703,81, 31143,2351, 12391,14118,22230,31921,29249,20154,33455,18985,5373, 38270,7915, 679, 17545,13618,33568,33039,11505,16042,5931, 3712, 12212,24427,1070, 14382,35985,6408, 10031, 30354,488, 16188,10126,36365,31716,1611, 1305, 25987,3849, 10577,3611, 35946,17267,33762,22395,27373,27769,19224,41719,38061,35127,1799, 23268,2575, 13215,23174, 4787, 20149,27583,35259,4183, 35653,473, 16725,7163, 28505,34757,33030,6685, 37674,41718,16094,35264,37136,8039, 5768, 12408,4559, 10425,35658,19447,36327,12426, @@ -18632,48 +18627,48 @@ static const unsigned short Ranks[197839] = 33030,37672,24367,33662,34869,37978,41715,28271,7002, 6489, 39370,36324,41714,3319, 13180,41714,18667,35262,39370,3619, 16285,16284,41714,29895,24366,21557,36324, 9261, 39369,26791,29894,33030,9946, 28270,33661,37671,36324,29893,33661,37671,18674,2880, 39369,18270,39369,39369,17182,39368,34392,35261,11488,17700,38215,36024, 25508,25617,41714,35261,16223,41713,3683, 39368,33029,34392,39368,36323,14381,33468,22005,6387, 30927,33661,1274, 20392,18269,20101,29892,23310,35187,39368,37943, - 36323,35261,41713,7998, 37116,35452,36512,28786,41713,14052,41713,26790,29840,2391, 24365,27854,39367,36323,36323,37680,31126,39367,4278, 3344, 17874,9781, 5131, + 36323,35261,41713,7998, 37116,35452,36512,28786,41713,14052,41713,26790,29840,2391, 24365,27854,39367,36323,36323,37680,31126,39367,4278, 3344, 17874,9781, 5131, 6577, 36141,39367,10317,34076,28604,34007,34391,39367,33657,30469,33580,26598,36289,36982,20256,34331,4276, 21748,36322,22398,36322,23177,36478,41712,36322,18268, - 11267,32827,15584,36855,39366,37381,39366,33661,36322,34046,2167, 39366,36014,12920,11086,29891,6940, 33029,12425,35756,1866, 28026,25988,24457,719, 38637,6675, + 11267,32827,15584,36855,39366,37381,39366,33661,36322,34046,2167, 39366,36014,12920,11086,29891,6940, 33029,12425,35756,1866, 28026,25988,24457,719, 38637,6675, 1516, 6163, 4707, 11753,14814,15348,26171,12684,12376,9685, 36321,36321,39366,11172,765, 2288, 37554,16434,34185,41712,39365,38170,29847,17096,34580,23071,28269, 620, 37671,36173,1393, 11716,7788, 4453, 20391,14742,22319,10551,34872,41712,28230,39365,37671,41712,13179,34391,20100,39365,29890,13966,24364,970, 36321,26789, - 35122,39365,39364,36321,35261,17159,33330,24710,38897,29889,17653,41711,37670,14109,804, 30702,36894,36320,38960,41711,4059, 37670,19445,10388,37670,28268,5562, + 35122,39365,39364,36321,35261,17159,33330,24710,38897,29889,17653,41711,37670,14109,804, 30702,36894,36320,38960,41711,4059, 37670,19445,10388,37670,28268,5562, 599, 19444,25507,9975, 1357, 34391,12166,31752,13178,10880,3124, 33641,651, 12795,6940, 7396, 28267,41711,10083,36011,25506,9377, 23724,36868,37670,33995,22397, 36977,39364,35260,37669,6608, 27633,41711,21808,14738,36320,37669,31751,7587, 41710,18816,10900,29888,21556,25505,35548,14508,35260,12675,41710,18984,30477,31750, 10344,25366,10387,33541,29887,20390,7407, 24725,9055, 21305,24171,31749,35260,35285,41710,20616,12406,37669,33660,36320,36996,6576, 31748,39364,13742,15315,25504, 28266,2741, 13286,37669,1095, 33760,18983,25948,15153,38085,37561,7012, 14970,35260,18815,5930, 20960,22456,3597, 22465,35215,29433,6929, 4921, 37056,21673,14707, 36041,5816, 2913, 1122, 12992,31732,21873,38361,20389,29260,18982,35679,7073, 10385,27414,32701,34391,28265,29765,35654,23309,14051,36320,20740,39364,38631,14050, - 33660,22396,37668,41710,34390,35259,5752, 30119,24178,506, 32972,34390,37094,35191,8002, 36373,12986,37694,34390,34390,41709,10879,23641,35062,6111, 12029,3192, - 3402, 33108,37565,952, 35259,1690, 25503,10382,3427, 35768,41709,29886,37668,480, 14431,37600,23308,12631,41709,35462,20388,1257, 33469,13690,34389,37668,2660, + 33660,22396,37668,41710,34390,35259,5752, 30119,24178,506, 32972,34390,37094,35191,8002, 36373,12986,37694,34390,34390,41709,10879,23641,35062,6111, 12029,3192, + 3402, 33108,37565,952, 35259,1690, 25503,10382,3427, 35768,41709,29886,37668,480, 14431,37600,23308,12631,41709,35462,20388,1257, 33469,13690,34389,37668,2660, 4852, 10229,33029,26825,6082, 39415,13572,39363,39363,37668,33419,29544,33660,41709,41708,24363,35259,33660,31747,3252, 34389,9945, 34523,35944,15952,33659,41708, 26788,41708,12200,12696,32651,39036,18665,35653,38279,34389,41708,8440, 18981,39363,559, 31301,9580, 5626, 30464,37000,39363,20099,36678,4734, 5379, 11643,34569, 25502,39362,37667,20098,37667,33659,3588, 5724, 20387,7914, 37667,22253,15099,10175,5586, 5410, 34691,33780,10645,444, 3992, 4124, 35259,6140, 41707,39362,41707, 41707,31746,2239, 34880,34389,16732,12497,4234, 38174,4753, 32729,1439, 36930,29041,4710, 34140,35909,36319,41707,5282, 36236,5546, 6201, 41706,22148,7377, 16040, - 16882,506, 34887,13661,16039,20097,1486, 2480, 4487, 4811, 23307,7386, 15862,32872,37667,34304,12481,6029, 3587, 11152,8722, 19370,1987, 35258,11715,33348,7391, - 33007,16038,6416, 24362,37490,29846,41706,34611,11941,20157,25339,23510,33484,4026, 36352,38090,28617,39329,14091,36053,18710,817, 1839, 3665, 6718, 6070, 3154, + 16882,506, 34887,13661,16039,20097,1486, 2480, 4487, 4811, 23307,7386, 15862,32872,37667,34304,12481,6029, 3587, 11152,8722, 19370,1987, 35258,11715,33348,7391, + 33007,16038,6416, 24362,37490,29846,41706,34611,11941,20157,25339,23510,33484,4026, 36352,38090,28617,39329,14091,36053,18710,817, 1839, 3665, 6718, 6070, 3154, 25373,21816,10043,14780,18875,31486,13745,17181,23306,20260,19991,13069,33073,6534, 5551, 39362,35258,22747,25501,38046,35367,26588,37981,33510,28210,22511,41706, 20806,41706,22061,41705,35258,39210,18980,20386,11519,9775, 11944,28925,41705,1418, 142, 34306,16674,33659,34978,8301, 28655,37606,25619,26164,33659,35356,17786, 14741,41705,38418,16327,16229,10831,29885,23305,2544, 41705,8553, 2934, 7978, 1736, 14399,23244,33854,3580, 8962, 36925,8775, 16240,34201,12794,19431,37666,17873, 14220,36583,15668,27657,23304,21332,5881, 39362,14022,27514,9789, 3133, 11151,18814,19443,38647,36432,41704,41704,34113,33043,41704,35568,26787,11013,8861, 36319, - 34388,36401,41704,41703,41703,6864, 34062,2460, 2359, 35561,14360,6009, 35258,34822,41703,28264,12292,20747,33029,33831,10704,19131,654, 18093,31665,39361,9813, - 719, 29402,22580,12054,37122,12295,16037,8163, 34328,34388,19761,751, 17652,41703,18843,41702,41702,28295,20805,19594,41702,41702,16736,8151, 21092,5717, 7258, + 34388,36401,41704,41703,41703,6864, 34062,2460, 2359, 35561,14360,6009, 35258,34822,41703,28264,12292,20747,33029,33831,10704,19131,654, 18093,31665,39361,9813, + 719, 29402,22580,12054,37122,12295,16037,8163, 34328,34388,19761,751, 17652,41703,18843,41702,41702,28295,20805,19594,41702,41702,16736,8151, 21092,5717, 7258, 31256,2007, 14711,12553,20284,30709,13504,1503, 25406,8966, 7560, 373, 13012,17182,31047,36037,22779,3049, 16442,263, 24091,33771,32824,18051,39361,22080,15024, - 26117,2730, 39102,21545,36851,38834,17030,9154, 33478,9155, 37666,28263,36594,38203,3081, 99, 18042,26786,33099,2042, 15832,35564,37666,33574,34388,18813,9788, + 26117,2730, 39102,21545,36851,38834,17030,9154, 33478,9155, 37666,28263,36594,38203,3081, 99, 18042,26786,33099,2042, 15832,35564,37666,33574,34388,18813,9788, 396, 27775,764, 9234, 37666,2928, 18630,28004,18005,34388,36319,26247,39361,36319,41701,6875, 7806, 1982, 26785,33658,26784,38028,36840,12171,34714,37100,35347, 36170,9944, 31745,36318,38886,4819, 33001,12693,36619,38731,20156,15009,29884,5576, 34387,37665,37789,565, 34387,19442,18812,37658,17705,35775,5375, 33028,29883, - 41701,23750,31744,25334,39361,37665,33658,39360,35257,33028,2853, 34351,39360,36899,3884, 37665,15861,14462,37665,39360,3497, 11085,24361,3512, 34387,902, 190, + 41701,23750,31744,25334,39361,37665,33658,39360,35257,33028,2853, 34351,39360,36899,3884, 37665,15861,14462,37665,39360,3497, 11085,24361,3512, 34387,902, 190, 41701,28262,35257,1553, 26649,5420, 1033, 29559,39360,41701,37709,33023,171, 17740,6935, 26422,20385,7873, 26268,35989,9177, 294, 9285, 36502,39098,33658,33603, 37812,38220,41700,9787, 763, 17872,36318,24594,28261,38233,14219,32805,19014,36318,13788,35257,12992,1289, 33047,18711,35257,36318,10721,36556,38321,37743,33839, - 33028,34387,33658,35256,38769,39359,29018,23303,41700,20926,41700,1685, 39026,2179, 18811,31979,33657,4568, 28260,15860,34192,16707,16881,31592,41700,7720, 198, + 33028,34387,33658,35256,38769,39359,29018,23303,41700,20926,41700,1685, 39026,2179, 18811,31979,33657,4568, 28260,15860,34192,16707,16881,31592,41700,7720, 198, 33013,24063,38503,21197,35797,41699,5059, 10424,41699,24204,36317,264, 35256,23302,33598,38481,16722,35364,41699,32768,33028,41699,13177,14429,35936,29882,15472, - 9914, 1374, 7648, 3132, 36904,37664,39359,13419,36317,41698,31743,41698,11714,1358, 3865, 41698,1132, 1293, 958, 2419, 35256,41698,41697,6893, 2308, 4017, 3959, + 9914, 1374, 7648, 3132, 36904,37664,39359,13419,36317,41698,31743,41698,11714,1358, 3865, 41698,1132, 1293, 958, 2419, 35256,41698,41697,6893, 2308, 4017, 3959, 21555,31742,36412,22989,35605,2729, 33079,24827,5144, 25500,34386,36317,39359,31741,35074,36317,14053,33588,37664,12053,39359,17628,36316,41697,35138,13448,34386, 32829,37664,404, 13261,10887,1330, 9920, 10804,36316,16969,34160,41697,31024,29267,21810,7449, 31258,4692, 13490,2348, 5728, 1531, 8038, 34750,1863, 15968,12026, - 8439, 22395,113, 6607, 1827, 5825, 3160, 41697,4037, 17530,18475,15098,7250, 8541, 15097,32839,14049,37686,3289, 14048,25499,14559,23301,39358,33027,37664,8214, + 8439, 22395,113, 6607, 1827, 5825, 3160, 41697,4037, 17530,18475,15098,7250, 8541, 15097,32839,14049,37686,3289, 14048,25499,14559,23301,39358,33027,37664,8214, 6887, 13353,5182, 34386,7039, 15471,22795,8761, 38740,17788,16283,5409, 34407,41696,7305, 36316,23300,21690,2277, 41696,9389, 1061, 3740, 14986,5824, 39358,38465, 5492, 9780, 41696,479, 9632, 32992,2400, 14011,15429,20258,33004,28956,32878,1165, 12070,5613, 10671,24030,29125,33027,10587,10712,14892,18886,8848, 7450, 22255, 25012,19871,4846, 22944,7787, 7376, 27642,15523,18765,15703,5370, 29424,19683,29604,14740,12336,11894,29528,5548, 22798,11480,13507,14069,5247, 32207,38233,38755, - 26673,22748,38631,6965, 31895,13533,22342,201, 21452,8130, 17643,30864,10664,36559,21554,27851,20384,17242,24987,591, 5856, 21725,1120, 27240,5324, 34910,3586, + 26673,22748,38631,6965, 31895,13533,22342,201, 21452,8130, 17643,30864,10664,36559,21554,27851,20384,17242,24987,591, 5856, 21725,1120, 27240,5324, 34910,3586, 30842,2031, 16801,4839, 2561, 22455,3715, 4779, 15463,28059,113, 27086,2735, 32948,17038,8815, 7068, 11972,32529,26002,25437,32962,26491,2628, 8431, 5508, 10150, 26457,15632,22600,5362, 26507,3434, 12849,2001, 23966,10457,4644, 15843,17496,7138, 2771, 7607, 5544, 31984,8721, 29155,20916,24830,18381,20096,41696,10720,18267, 9897, 37973,36316,35393,37279,26783,29881,34386,18266,37477,34385,41695,11272,33657,29880,35256,3567, 687, 39358,25588,33027,15433,38900,24248,4471, 39358,36655, @@ -18682,7 +18677,7 @@ static const unsigned short Ranks[197839] = 31739,6649, 18977,12793,6939, 10423,13263,35255,36315,26765,962, 15889,38068,41694,39357,25498,29879,41694,15096,25497,20803,20095,16880,19148,2661, 11037,22144, 33896,5369, 41693,36876,37663,31738,14784,39357,10386,33026,20802,2304, 31737,15347,17, 29046,8089, 1044, 26056,9364, 4970, 16182,10980,9881, 25747,9547, 32821, 19472,28900,19661,11426,15407,25823,32904,13706,22700,34385,12817,25324,15346,14356,24652,20384,30632,2283, 13225,9779, 34468,14047,29164,13451,5978, 9341, 38956, - 3131, 38156,25496,7786, 39357,35255,1011, 23297,41693,483, 24360,41693,34385,27545,31910,35832,23296,3920, 20521,14739,20382,14637,37663,39356,7914, 31693,5016, + 3131, 38156,25496,7786, 39357,35255,1011, 23297,41693,483, 24360,41693,34385,27545,31910,35832,23296,3920, 20521,14739,20382,14637,37663,39356,7914, 31693,5016, 39414,28025,16879,12298,12405,714, 13608,39356,19368,36252,1838, 31057,38569,38872,8898, 30548,31339,16993,16663,16318,11233,41693,22006,41692,39356,39116,33859, 35217,14762,16433,37995,37311,38458,23450,33799,34434,2945, 39248,12770,38802,11702,1468, 16999,34179,31217,37357,16036,11611,30599,21408,32626,1317, 10644,31655, 3657, 6839, 13689,4986, 19544,35255,2952, 14433,37597,38796,11530,18958,35281,3025, 35246,9388, 2182, 14045,2185, 3191, 35255,41692,39411,35431,10093,35410,35371, @@ -18690,18 +18685,18 @@ static const unsigned short Ranks[197839] = 36955,25139,1218, 32962,3334, 1525, 5723, 41691,38220,5453, 21779,18881,37024,28730,1570, 26990,19575,33829,20219,19076,39355,34384,39263,19441,33785,8162, 33026, 8001, 17180,36315,34384,16706,1226, 9589, 8299, 1332, 34384,26304,6206, 11150,22279,37662,17945,1479, 8907, 41691,37208,18975,24004,35210,36314,39355,41691,37774, 36314,15670,26718,29878,26781,25495,4779, 26341,20380,30354,940, 20561,15825,33775,35212,41690,33025,37434,14217,4418, 3401, 10186,599, 23731,36314,2881, 26780, - 4080, 41690,11939,1085, 3625, 36314,38961,8902, 1813, 41690,24359,8206, 182, 6189, 17616,30449,2112, 3333, 1770, 2468, 4330, 33006,1465, 25494,3018, 39046,2980, + 4080, 41690,11939,1085, 3625, 36314,38961,8902, 1813, 41690,24359,8206, 182, 6189, 17616,30449,2112, 3333, 1770, 2468, 4330, 33006,1465, 25494,3018, 39046,2980, 13688,37287,30535,39355,12052,33496,23295,29877,1812, 2179, 22778,2088, 1555, 3130, 1811, 2696, 6927, 22050,34431,32844,23523,36313,37662,6260, 16282,5525, 30423, - 28259,2185, 11084,560, 1667, 10872,10878,6711, 123, 2419, 26593,39355,9018, 1218, 33657,17871,39354,27648,1335, 3624, 39361,36492,3257, 1352, 1247, 1748, 2844, + 28259,2185, 11084,560, 1667, 10872,10878,6711, 123, 2419, 26593,39355,9018, 1218, 33657,17871,39354,27648,1335, 3624, 39361,36492,3257, 1352, 1247, 1748, 2844, 36948,3400, 33234,35517,16789,31736,11181,3524, 32942,1627, 16959,36025,37992,26779,1381, 1740, 14738,35203,33657,4335, 15345,36505,32981,18974,39354,7586, 41690, 35028,1397, 41689,24358,41689,35254,25493,41689,33656,37662,21528,17870,28234,3256, 17869,2970, 8721, 1416, 41689,30114,31841,31436,3129, 17626,39354,15095,24357, 21828,3190, 12792,651, 38513,32884,1431, 1851, 12051,6828, 5477, 15385,37428,3703, 1850, 33056,14737,2178, 23851,37662,462, 34146,10548,30725,39354,3332, 35254, - 2880, 7724, 20379,35527,36548,34384,11392,3552, 3255, 1742, 16168,26553,1954, 37661,16234,1352, 22169,5766, 10185,3566, 21051,16878,13287,36313,1281, 16300,2467, + 2880, 7724, 20379,35527,36548,34384,11392,3552, 3255, 1742, 16168,26553,1954, 37661,16234,1352, 22169,5766, 10185,3566, 21051,16878,13287,36313,1281, 16300,2467, 21960,1323, 2467, 923, 39353,37661,19440,34512,5524, 3623, 18264,35965,10745,3254, 20, 7987, 30282,23841,23451,1246, 301, 14290,803, 10877,15344,14737,13687, 17868,9588, 41688,33656,9778, 39353,7434, 29834,18810,14046,25492,41688,6036, 33025,23402,13902,35383,25845,16877,39353,35941,10899,30301,12725,37661,39353,33025, 28258,39352,33656,28257,2758, 25491,18263,707, 13176,34383,26778,26777,41688,2359, 1289, 33498,24374,28999,21645,35254,41688,1259, 17592,17651,34021,16793,17867, 33411,41687,8673, 14736,34383,35253,36878,7478, 3971, 6939, 20378,19439,29876,5483, 23294,11271,36519,24356,37661,35253,33025,36313,6684, 30171,9786, 33656,39352, - 293, 18441,618, 31828,30655,2805, 2504, 3128, 3189, 16876,2838, 1261, 13468,1461, 7248, 14735,4277, 20377,25478,2041, 3188, 2577, 36656,136, 39352,2503, 1871, + 293, 18441,618, 31828,30655,2805, 2504, 3128, 3189, 16876,2838, 1261, 13468,1461, 7248, 14735,4277, 20377,25478,2041, 3188, 2577, 36656,136, 39352,2503, 1871, 37268,3253, 37798,41687,29875,35542,28256,16705,37660,31393,38223,9233, 39352,34383,33471,90, 7294, 21550,465, 2134, 2111, 2502, 30327,3474, 19254,14216,29770, 8792, 10876,1870, 38714,14889,1075, 1411, 894, 35335,28508,1520, 22935,20543,29984,37660,28791,41687,22888,36, 733, 502, 81, 859, 10228,16792,35253,12165, 10898,41687,37660,11487,5220, 33655,27085,23293,6430, 10385,31529,1657, 14592,36518,36313,39351,39351,8449, 16143,31001,24355,23292,5619, 38320,37330,22010,33025, @@ -18711,8 +18706,8 @@ static const unsigned short Ranks[197839] = 37659,41686,22394,31320,3334, 41685,15078,4913, 39198,34347,38491,37365,24353,124, 16366,2576, 33655,9666, 23291,34382,37659,41685,41685,39351,11340,36426,37659, 38456,37673,37658,18283,39205,10420,2466, 35252,16037,2133, 18148,34382,17051,328, 6931, 28756,32939,31811,17865,24352,388, 26686,6510, 34382,35252,39350,33024, 12674,3546, 34138,37658,29874,364, 37658,34382,37658,41685,2010, 14099,2843, 34381,24504,32983,12050,11938,13743,14735,345, 13258,35822,9777, 39350,35251,35251, - 17179,39350,1208, 1037, 11493,29873,14734,39350,4133, 39349,288, 13500,18809,37657,17649,11937,33655,34381,33024,33655,41684,2265, 8078, 17709,6389, 9585, 252, - 34381,39349,17864,10307,6372, 29872,33654,20375,41684,34381,18782,35198,1588, 11860,41684,26776,2804, 34421,2385, 26877,39349,41684,22393,5510, 1900, 10496,6648, + 17179,39350,1208, 1037, 11493,29873,14734,39350,4133, 39349,288, 13500,18809,37657,17649,11937,33655,34381,33024,33655,41684,2265, 8078, 17709,6389, 9585, 252, + 34381,39349,17864,10307,6372, 29872,33654,20375,41684,34381,18782,35198,1588, 11860,41684,26776,2804, 34421,2385, 26877,39349,41684,22393,5510, 1900, 10496,6648, 39349,39348,41683,33654,41683,3528, 28087,3252, 2653, 8213, 22392,41683,34380,23290,21864,24688,3622, 38541,38712,27767,16306,10124,34210,7477, 675, 8672, 33024, 9260, 3618, 25487,499, 37652,36677,35732,9232, 38925,14045,15469,34025,619, 27307,18260,41683,26775,29393,33096,33654,30107,34232,12252,2969, 17648,13685,13843, 35687,39348,41682,23289,16875,14229,33654,12424,37657,32794,33024,818, 3187, 5446, 21552,28255,39348,28953,369, 37723,3551, 31734,547, 37657,1398, 41682,14037, @@ -18720,27 +18715,27 @@ static const unsigned short Ranks[197839] = 11143,37506,33023,41682,41681,9020, 39348,2265, 37656,7091, 34380,291, 15859,485, 3399, 1415, 35251,37777,41681,2243, 1738, 16703,119, 15234,1535, 37656,35251, 41681,6683, 900, 2682, 301, 2879, 17294,17863,39347,33023,16280,8811, 34380,7907, 16702,36311,34379,36311,41681,37655,41680,36311,15958,39347,31732,37655,29127, 22381,32113,7490, 39347,37655,15858,10897,28506,34379,37655,36311,20801,9665, 39347,18355,746, 2214, 5104, 8865, 12049,3508, 14946,29535,36119,27413,7154, 30541, - 27462,16035,21551,39346,26521,15857,4393, 36189,41680,35250,17647,8528, 18867,7317, 33732,35762,39346,29871,39346,41680,26773,39346,36459,23288,23287,1058, 2669, - 16139,11149,507, 25486,15468,37654,36310,39345,39170,12163,41680,33023,25485,3638, 39345,15856,8448, 39345,36310,33023,1516, 3340, 11844,33080,5508, 20374,3644, + 27462,16035,21551,39346,26521,15857,4393, 36189,41680,35250,17647,8528, 18867,7317, 33732,35762,39346,29871,39346,41680,26773,39346,36459,23288,23287,1058, 2669, + 16139,11149,507, 25486,15468,37654,36310,39345,39170,12163,41680,33023,25485,3638, 39345,15856,8448, 39345,36310,33023,1516, 3340, 11844,33080,5508, 20374,3644, 8593, 17862,20364,39345,41679,39344,37200,21218,41679,34379,36310,9259, 33396,37654,24763,39344,33653,35026,17542,34152,32885,23743,38611,30818,35876,39212,41679, 29497,29870,18088,37436,41679,3127, 33332,41678,37683,17646,41678,41678,17861,37654,10643,5712, 25484,37654,36310,10507,41678,41677,21987,14615,1500, 30021,16770, 29869,31448,24351,8332, 14214,39098,24350,25483,29037,7374, 39344,41677,33022,28100,20861,18259,15467,24932,36309,9019, 35250,16279,21497,23286,7064, 12404,22391, - 12963,37653,33408,32793,16874,33653,16694,39344,33182,14044,34379,37653,35711,2895, 29868,36309,37653,35250,34614,28254,33218,9530, 27334,25992,27699,41677,6028, + 12963,37653,33408,32793,16874,33653,16694,39344,33182,14044,34379,37653,35711,2895, 29868,36309,37653,35250,34614,28254,33218,9530, 27334,25992,27699,41677,6028, 37653,36309,22390,33309,39343,2598, 11413,37990,33647,29725,3426, 30913,38673,6792, 19583,19863,33255,13043,27375,41677,17645,14945,13450,41676,11638,32607,37652, 34803,33844,19173,7131, 3116, 33022,7280, 38035,17996,15739,41676,14733,39343,2555, 37208,35250,39343,41676,4257, 16056,27252,14213,36309,35385,34516,41676,37119, - 33653,39343,33491,11881,22308,3325, 32157,34508,34985,39097,545, 22275,21042,18518,5599, 6156, 28253,39342,39342,31731,1485, 1609, 23223,20373,36308,3572, 8761, - 28425,33551,1828, 3970, 14043,35369,34965,29867,29177,25482,2666, 28665,28252,8447, 849, 17860,15093,39342,11511,14212,12722,33707,37934,4826, 10125,19731,2416, - 18258,32805,31730,13337,33040,29866,35249,8695, 25147,39342,35390,4600, 2842, 20093,26772,13742,4452, 38946,39341,13479,24349,5757, 20800,14734,2841, 29072,1554, + 33653,39343,33491,11881,22308,3325, 32157,34508,34985,39097,545, 22275,21042,18518,5599, 6156, 28253,39342,39342,31731,1485, 1609, 23223,20373,36308,3572, 8761, + 28425,33551,1828, 3970, 14043,35369,34965,29867,29177,25482,2666, 28665,28252,8447, 849, 17860,15093,39342,11511,14212,12722,33707,37934,4826, 10125,19731,2416, + 18258,32805,31730,13337,33040,29866,35249,8695, 25147,39342,35390,4600, 2842, 20093,26772,13742,4452, 38946,39341,13479,24349,5757, 20800,14734,2841, 29072,1554, 2652, 1331, 27, 14599,1659, 20210,16701,33507,37652,31664,1037, 17859,2786, 24344,41675,14211,28251,35990,41675,11083,397, 27440,26052,19133,30550,15905,20372, 17661,13333,11148,3511, 20371,32681,7899, 24292,265, 21973,20370,11713,17858,11712,9776, 30476,7675, 18972,32825,7250, 14210,8298, 31348,1698, 22610,35249,13820, 4410, 19875,12937,32893,14765,20546,37422,15466,36308,3416, 5807, 33022,7785, 3991, 11701,33652,36916,41675,31729,8719, 3251, 34196,3549, 14907,20369,11409,32803, - 19691,35317,20216,19438,15218,12846,20368,35249,32942,38117,10184,20367,18480,8897, 22389,34003,33073,14032,34682,11440,34378,36308,24348,41675,34583,38637,1244, + 19691,35317,20216,19438,15218,12846,20368,35249,32942,38117,10184,20367,18480,8897, 22389,34003,33073,14032,34682,11440,34378,36308,24348,41675,34583,38637,1244, 15124,11068,1977, 36308,4045, 28906,21911,5104, 4160, 14733,1819, 9053, 27709,15986,37752,37218,5330, 39341,12048,36035,41674,1484, 10419,35601,37313,17857,12790, 9775, 32463,4513, 933, 33952,24457,34378,28250,34378,21550,850, 32097,37142,41674,21549,5853, 33022,10227,22429,37652,28693,22622,36016,34378,1327, 10944,38428, 24981,17114,5944, 34626,36953,19760,15343,35706,12919,34377,11700,34377,37652,41674,28249,34377,32605,19437,39236,33021,25481,16133,41674,33132,37651,37651,21548, - 994, 2069, 33704,1012, 3548, 15342,11524,37651,36307,41673,25480,31728,23285,2158, 37651,2968, 39341,17644,5415, 18303,4957, 41673,17298,1311, 5711, 22388,621, + 994, 2069, 33704,1012, 3548, 15342,11524,37651,36307,41673,25480,31728,23285,2158, 37651,2968, 39341,17644,5415, 18303,4957, 41673,17298,1311, 5711, 22388,621, 38252,845, 9400, 6139, 7476, 1232, 11166,12809,20104,6587, 34948,3871, 948, 41673,6745, 37650,38416,17856,20366,16034,16873,18971,6321, 33091,35249,35556,12403, - 6033, 10875,16872,1175, 26006,2558, 33021,13741,33021,1829, 30275,24067,22558,19395,6950, 26137,3584, 37650,38619,9664, 38452,36307,33902,38853,33652,36307,301, + 6033, 10875,16872,1175, 26006,2558, 33021,13741,33021,1829, 30275,24067,22558,19395,6950, 26137,3584, 37650,38619,9664, 38452,36307,33902,38853,33652,36307,301, 23898,35836,5779, 7881, 20365,14732,33313,9974, 6439, 11147,20704,12789,31727,14312,4456, 12814,35075,2487, 33652,7426, 36307,18441,30212,41673,9587, 14209,38271, 14499,20364,35248,20518,23284,34688,13579,8964, 950, 29159,34377,9586, 8212, 3146, 17855,37650,15044,8568, 35841,9018, 15383,477, 10066,18727,2465, 34702,16231, 37650,33652,14931,429, 33169,35610,23495,875, 10742,9774, 37649,39341,7549, 1513, 18257,34687,16700,6606, 2824, 33021,35248,97, 14731,833, 3165, 1449, 20807, @@ -18752,9 +18747,9 @@ static const unsigned short Ranks[197839] = 31725,39339,32836,35248,9172, 14513,5181, 5536, 16031,18967,9136, 38087,8211, 6401, 16030,11710,27574,12758,28337,7441, 10418,14728,18966,11709,5180, 6874, 12401, 27420,41671,35247,39339,8671, 37260,14727,39363,20362,1984, 11828,3545, 7890, 3424, 33651,37649,29865,5997, 29864,41671,37649,33020,6548, 39338,8437, 10874,37717, 13740,28247,23016,33651,9785, 13739,12423,24347,7281, 34376,16029,41671,14207,13449,37008,13211,37648,33651,10550,39338,37648,15464,15341,32666,31724,39338,33098, - 3734, 38057,27589,35219,16028,37648,39338,18744,34778,31171,28246,34370,36305,41671,2093, 34438,41670,2714, 41670,10896,41670,41670,37648,41669,14042,6053, 1504, + 3734, 38057,27589,35219,16028,37648,39338,18744,34778,31171,28246,34370,36305,41671,2093, 34438,41670,2714, 41670,10896,41670,41670,37648,41669,14042,6053, 1504, 37647,31723,19436,18224,14377,3436, 3217, 33020,3205, 39337,36283,33650,41669,33650,7473, 37647,25477,5306, 2883, 35776,9663, 26771,12400,20361,15340,35046,36249, - 34604,15815,38592,3437, 4609, 41669,36304,16698,41669,16027,20125,37041,41668,31722,36304,33326,6404, 24308,39337,28245,26770,41668,10087,20799,35247,11936,5722, + 34604,15815,38592,3437, 4609, 41669,36304,16698,41669,16027,20125,37041,41668,31722,36304,33326,6404, 24308,39337,28245,26770,41668,10087,20799,35247,11936,5722, 25263,15339,37920,35247,35247,5305, 41668,33060,359, 10373,8896, 37647,39337,16026,36304,9597, 11949,6260, 5664, 39337,11270,22637,9051, 3534, 4118, 32881,18965, 29863,9943, 34969,11486,41668,3505, 38436,17853,39174,37647,41667,29369,20598,26683,2035, 15764,36717,36092,21272,41667,14316,8922, 20360,2967, 14726,39336,41667, 17852,19100,37646,26410,34262,35970,35609,17416,41667,37601,19473,9178, 10873,41666,21077,28244,32883,39336,34376,41666,41666,8895, 26598,41666,37646,35246,33020, @@ -18763,16 +18758,16 @@ static const unsigned short Ranks[197839] = 6212, 41664,15462,16870,39335,14206,9229, 12399,7475, 37874,13209,16025,36303,12634,6938, 9529, 11708,36303,39335,2756, 7474, 15338,41664,15861,33650,34375,31282, 33650,37106,989, 18990,35633,13684,37645,36302,33699,17643,16942,34375,25476,26527,34297,30869,20811,25109,34606,38497,20092,28065,12422,24619,33020,29862,16024, 35246,9771, 34118,227, 16023,20359,34057,15337,18964,17177,12046,14724,38724,37864,4296, 4269, 16869,37624,34490,12118,10484,5980, 26769,38499,35245,15753,35417, - 20091,15331,20090,31469,37645,22386,37645,13738,1253, 11386,38560,7019, 4233, 11707,38452,6437, 8482, 16743,37494,36207,34375,13448,11842,35910,6647, 10781,9584, - 20089,39335,41663,33019,33324,252, 16965,19038,33893,34374,13779,19287,41663,20088,12398,20358,35245,10719,33649,34891,14376,24346,37644,37644,33649,41663,9528, + 20091,15331,20090,31469,37645,22386,37645,13738,1253, 11386,38560,7019, 4233, 11707,38452,6437, 8482, 16743,37494,36207,34375,13448,11842,35910,6647, 10781,9584, + 20089,39335,41663,33019,33324,252, 16965,19038,33893,34374,13779,19287,41663,20088,12398,20358,35245,10719,33649,34891,14376,24346,37644,37644,33649,41663,9528, 33649,36302,5261, 23281,16278,22609,31721,31720,41663,22608,36302,35245,41662,12421,39334,37644,29861,33649,39334,10549,20087,2152, 1430, 21669,23280,39334,34374, 18263,39334,7906, 24040,13175,22385,19435,12162,33019,41662,35245,41662,28242,37644,37643,36302,29692,35244,37643,12381,947, 11263,33648,36301,19434,33230,26768, - 33648,36301,36585,12987,12917,36301,38440,8432, 34479,36301,21547,33648,7960, 39333,41662,33648,41661,23237,18808,39333,36300,33935,37011,25201,243, 24422,6209, + 33648,36301,36585,12987,12917,36301,38440,8432, 34479,36301,21547,33648,7960, 39333,41662,33648,41661,23237,18808,39333,36300,33935,37011,25201,243, 24422,6209, 31978,32138,17642,41661,39333,17851,34128,36300,35244,41661,23489,19632,39333,33019,36300,5304, 41661,12672,41660,37868,36300,35034,39332,15461,38143,41660,36299, - 12671,25335,41660,34374,37121,12787,13208,34441,6547, 31911,28472,39332,35244,9135, 37643,30828,39055,14732,36299,38035,16022,19433,26459,14041,28241,35801,5058, + 12671,25335,41660,34374,37121,12787,13208,34441,6547, 31911,28472,39332,35244,9135, 37643,30828,39055,14732,36299,38035,16022,19433,26459,14041,28241,35801,5058, 16868,12397,1177, 7412, 6575, 8436, 18963,4275, 10872,33746,25772,39385,9302, 41660,2775, 35244,35243,32808,41659,35546,4206, 7954, 27631,5145, 7246, 12996,23277, 7016, 29697,38125,4222, 37643,8037, 491, 39242,9903, 37642,1488, 12825,6083, 34982,14392,7897, 27237,2842, 10580,12883,23989,2170, 6302, 2218, 405, 21130,21870, - 24794,2388, 617, 1853, 36569,14736,35671,11546,11107,11917,24924,2184, 11686,38804,20745,6081, 8036, 8297, 14040,37353,25475,20357,39332,37021,31803,39127,1604, + 24794,2388, 617, 1853, 36569,14736,35671,11546,11107,11917,24924,2184, 11686,38804,20745,6081, 8036, 8297, 14040,37353,25475,20357,39332,37021,31803,39127,1604, 36444,16864,35281,37642,32986,1639, 31719,14913,17434,18807,32784,13361,36299,33583,39158,20356,37642,39332,18633,39184,34337,29189,33853,33701,41659,35701,39331, 39331,36299,2211, 36298,5848, 16556,8500, 18559,33647,39331,10433,25474,5575, 39331,8791, 15279,35243,22159,31718,37823,39330,39330,36672,23279,41659,607, 28485, 36298,12420,33019,29860,31717,10086,37642,26767,35243,41659,35187,29859,10384,1842, 28160,12045,15100,36600,14723,18767,34562,34250,1736, 32820,20211,32884,10642, @@ -18781,34 +18776,34 @@ static const unsigned short Ranks[197839] = 39329,21546,33647,3924, 945, 8441, 15038,33091,21745,25473,24514,32886,23278,10871,33907,17804,41657,39329,35242,21545,11771,33629,32917,31597,41657,33647,29627, 38480,33126,41657,15509,231, 41657,28835,2607, 36501,34703,6052, 8235, 4732, 87, 27546,2835, 18114,10204,20190,32258,27334,23595,30784,29706,14653,27137,23435, 12916,3119, 6866, 25734,9017, 28463,35383,33924,23515,11211,20251,29993,39329,37641,21544,21543,20355,34094,23770,2106, 33006,11699,36298,35242,3661, 20228,18806, - 35699,15473,5303, 13249,25472,36297,23206,28240,7674, 38155,12756,12161,18882,11485,8790, 41656,31713,4890, 7243, 437, 20734,11441,10548,33647,38469,6051, 2966, + 35699,15473,5303, 13249,25472,36297,23206,28240,7674, 38155,12756,12161,18882,11485,8790, 41656,31713,4890, 7243, 437, 20734,11441,10548,33647,38469,6051, 2966, 39328,31712,31711,7162, 7316, 1721, 4289, 17990,22063,25534,12781,33018,25241,35121,37640,39328,8895, 37640,41656,13814,10718,34315,23277,13737,36297,37640,36062, 31251,41656,28239,12670,8867, 35242,12160,39328,19431,39328,41656,20086,26595,34842,13797,19791,10870,34606,41655,17176,28238,363, 4371, 5145, 2164, 35392,33646, 32786,37278,28237,18805,39327,34374,37157,36297,37640,37639,41655,25471,9784, 23276,39327,35241,27199,35241,33018,39327,34139,37991,39327,36297,8035, 35998,23275, - 13447,32794,8446, 41655,29858,33646,6259, 41655,9942, 35241,88, 939, 17526,41654,14730,41654,358, 2711, 32954,12486,1910, 37639,4608, 669, 17859,7090, 7089, + 13447,32794,8446, 41655,29858,33646,6259, 41655,9942, 35241,88, 939, 17526,41654,14730,41654,358, 2711, 32954,12486,1910, 37639,4608, 669, 17859,7090, 7089, 39326,21542,41654,39326,39326,10226,41654,31710,29857,41653,29856,37639,32857,2926, 32882,1140, 14657,32241,8551, 3435, 7088, 18959,41653,37639,18958,38087,11144, 39326,41653,16021,33018,34373,2142, 23011,454, 5924, 21068,4139, 7673, 12396,18957,11956,38898,27465,37638,6838, 15453,35595,5415, 19046,11495,18500,12786,35105, 39325,1081, 35241,19601,120, 9663, 515, 37638,12388,37638,183, 37090,22384,13684,37638,9091, 8373, 17850,16115,4724, 9004, 9050, 16494,7506, 33191,16441,21435, - 36446,6366, 2725, 39325,37637,39325,2217, 3547, 35240,7289, 35810,13800,19629,41653,29855,1979, 23761,2533, 102, 33646,26766,3093, 5057, 14205,6646, 8398, 946, - 37637,33646,18770,34943,39325,15092,18956,33482,6879, 12633,33887,26835,39417,38311,34373,39324,39324,39324,2243, 8445, 14478,31709,35838,14729,23220,39324,6744, - 20949,20354,35581,11742,33600,24400,7261, 934, 39044,5305, 1584, 9835, 21882,25752,36964,39323,16867,24199,14204,39323,24344,698, 26421,10486,23395,41652,2942, + 36446,6366, 2725, 39325,37637,39325,2217, 3547, 35240,7289, 35810,13800,19629,41653,29855,1979, 23761,2533, 102, 33646,26766,3093, 5057, 14205,6646, 8398, 946, + 37637,33646,18770,34943,39325,15092,18956,33482,6879, 12633,33887,26835,39417,38311,34373,39324,39324,39324,2243, 8445, 14478,31709,35838,14729,23220,39324,6744, + 20949,20354,35581,11742,33600,24400,7261, 934, 39044,5305, 1584, 9835, 21882,25752,36964,39323,16867,24199,14204,39323,24344,698, 26421,10486,23395,41652,2942, 41652,1097, 20012,41652,39323,9583, 1360, 31981,180, 9102, 9279, 35156,18254,745, 30011,1876, 17175,430, 6546, 17849,38143,35240,14600,37637,4221, 34373,38697, - 36395,37881,41652,39323,5020, 23539,14330,20353,36194,12419,13329,13365,14039,34373,33314,33018,39322,37895,35240,34372,3064, 37637,39277,36296,35580,9797, 2027, + 36395,37881,41652,39323,5020, 23539,14330,20353,36194,12419,13329,13365,14039,34373,33314,33018,39322,37895,35240,34372,3064, 37637,39277,36296,35580,9797, 2027, 29854,9972, 37636,19430,27239,33186,39322,4491, 39015,14728,22383,37636,8296, 9098, 4091, 1508, 8161, 19219,31708,27898,20352,9374, 6880, 33100,33645,35150,36823, 28236,26765,33645,13174,41651,2927, 34372,35240,11316,36525,33182,19694,26764,17998,23274,8160, 12044,36578,25119,29853,34766,1726, 30444,41651,39322,13076,41651, 37714,39322,23274,33319,6090, 16847,3454, 4358, 3522, 41651,37636,16020,16019,14203,35855,32873,36296,36296,14375,37636,13446,17848,13736,18955,13173,36296,39321, - 7018, 6050, 36393,36295,41650,10641,35239,17641,214, 29768,33017,37635,24343,31004,35239,41650,35239,39293,20798,5279, 10457,14202,35239,39321,6027, 32916,3398, + 7018, 6050, 36393,36295,41650,10641,35239,17641,214, 29768,33017,37635,24343,31004,35239,41650,35239,39293,20798,5279, 10457,14202,35239,39321,6027, 32916,3398, 18681,37129,6714, 18253,36745,36594,37030,16018,39321,15460,37635,41650,34372,34372,37612,37359,1497, 27095,34752,28759,26763,25470,37635,34611,34371,16866,33645, 33645,12669,33992,37635,18804,35081,39321,26817,22716,38940,5340, 41650,35884,34371,41649,35238,41649,41649,12785,39320,29877,5767, 38049,30395,39320,37634,39320, 2403, 33522,35671,41649,31707,39320,3565, 34371,15091,26957,2092, 23273,35238,31674,39319,32571,35238,25600,32519,9373, 37521,5410, 39319,37634,41648,41648,13172, 37634,28235,36295,25142,21459,14721,29140,37634,39319,36750,25469,2419, 4248, 11759,30018,21091,20351,18954,11976,38719,41648,26830,11424,329, 11344,13682,11411, - 1242, 28234,15336,15090,6886, 28058,38486,21052,319, 12331,37633,17080,32996,35600,18953,4433, 13110,298, 9483, 16865,31419,33644,1135, 21420,23153,35238,1551, + 1242, 28234,15336,15090,6886, 28058,38486,21052,319, 12331,37633,17080,32996,35600,18953,4433, 13110,298, 9483, 16865,31419,33644,1135, 21420,23153,35238,1551, 38914,23115,23639,27211,18048,41648,31706,22382,26520,41647,33017,10224,2817, 22381,36295,34665,3261, 41647,34371,12395,28233,36295,21541,4255, 593, 33198,25594, 34370,41647,41647,39319,7558, 41646,36294,9400, 35066,1055, 541, 15677,33238,2811, 33491,15089,33644,22380,35237,20085,2723, 41646,34162,41646,11246,36795,21309, 26762,35375,41646,41645,23517,38599,37662,14720,15362,31053,39336,41645,32808,23272,26761,23271,35237,26760,33017,35237,39318,33017,29852,39318,33016,41645,41645, - 35901,37633,41644,41644,17640,34370,31705,35237,37408,37642,36249,28232,41644,26759,37633,34370,242, 16017,24760,2073, 12784,28373,17882,33644,13653,39318,4883, + 35901,37633,41644,41644,17640,34370,31705,35237,37408,37642,36249,28232,41644,26759,37633,34370,242, 16017,24760,2073, 12784,28373,17882,33644,13653,39318,4883, 17847,20481,41644,31756,41643,3702, 1930, 5574, 1187, 37244,5721, 31313,36340,35236,19098,1615, 5533, 8324, 9449, 30991,33587,37918,23867,8435, 41643,486, 11360, - 2773, 18803,1195, 9016, 3979, 15335,33083,36005,6973, 12783,36294,39127,38943,41643,21540,24342,15459,36294,24341,31704,35236,31703,41643,17483,10526,16033,7469, + 2773, 18803,1195, 9016, 3979, 15335,33083,36005,6973, 12783,36294,39127,38943,41643,21540,24342,15459,36294,24341,31704,35236,31703,41643,17483,10526,16033,7469, 9845, 8756, 26758,11143,36294,41642,41642,39318,33644,33016,41642,16864,24813,37633,36849,1608, 26154,20350,34470,26757,37194,26756,22379,33643,38452,38153,38493, 39317,28231,33643,34370,13171,25468,32088,17225,19409,36281,29851,5929, 16016,9582, 38930,41642,41641,34570,28230,37600,23270,33643,29876,36293,37590,41641,36293, 41641,38282,3157, 11924,19375,9378, 5228, 22701,31316,12201,12782,14719,30021,997, 13630,8176, 5766, 3170, 37632,14394,37632,9477, 35236,24340,9971, 38350,36293, @@ -18829,7 +18824,7 @@ static const unsigned short Ranks[197839] = 37628,8275, 32639,8712, 32874,6495, 3205, 15088,35842,3929, 4508, 4940, 32993,37009,16860,6319, 34138,10181,8034, 39287,16859,12159,31697,7482, 39312,20797,33641, 10180,16858,36260,2538, 11270,31819,6574, 31969,37903,3969, 3363, 34367,6645, 1697, 33088,9581, 1417, 15862,41634,5056, 12997,37214,7672, 7155, 32848,12394,36200, 33256,33076,32726,36728,4709, 6522, 17174,797, 21358,39312,28397,31696,3813, 24604,35233,22376,3734, 24337,34636,20084,41634,8550, 37628,869, 37627,7671, 12778, - 35278,14717,36322,35233,21631,6781, 15767,22679,25945,2339, 3265, 12499,13680,38561,28937,11082,10225,37386,33400,3171, 2667, 17246,4624, 26751,38550,3535, 5756, + 35278,14717,36322,35233,21631,6781, 15767,22679,25945,2339, 3265, 12499,13680,38561,28937,11082,10225,37386,33400,3171, 2667, 17246,4624, 26751,38550,3535, 5756, 10640,36290,39312,26182,38688,14738,39157,13368,38535,10233,9969, 33145,37058,35233,9941, 36290,5452, 16014,18802,11934,24336,17694,14716,170, 4288, 31854,10274, 9564, 17696,6025, 24797,5163, 18250,39311,16013,35232,3961, 23936,37187,37744,5308, 14715,18950,4537, 37627,5681, 28226,8033, 25343,2270, 10179,37011,38798,16012, 37627,21538,14200,37766,20083,382, 3558, 32547,13326,10417,35655,743, 6791, 6080, 14199,3431, 18949,16011,6873, 1589, 15616,10178,14198,33641,18249,3366, 24466, @@ -18840,98 +18835,98 @@ static const unsigned short Ranks[197839] = 37626,33524,1845, 6589, 28818,5055, 3206, 20345,3602, 8567, 4158, 28887,27697,39311,5238, 20796,9049, 11705,14714,20344,16197,36158,15086,35218,5658, 35232,22375, 28224,37626,15238,580, 2597, 41631,23267,6815, 5765, 20343,12041,24108,16067,41631,16010,39311,33640,39310,2747, 12040,35232,25533,34915,4999, 10748,41631,25465, 12393,37626,41630,29848,37625,37625,39310,21977,17637,2326, 41630,18185,5779, 38415,24334,31694,32877,39310,8920, 20777,15180,36797,9384, 4083, 17310,3674, 34856, - 10128,3958, 39310,17842,11081,33014,18946,36289,3891, 22248,26750,35231,41630,10868,35231,30532,39309,34366,6790, 18558,38550,13678,10882,36362,39309,29847,4651, - 3922, 20421,18725,19292,7499, 14357,3533, 5815, 31834,37877,8000, 33640,41630,22374,35002,825, 22864,34366,6789, 5269, 14713,31693,4162, 15085,5680, 29846,1892, + 10128,3958, 39310,17842,11081,33014,18946,36289,3891, 22248,26750,35231,41630,10868,35231,30532,39309,34366,6790, 18558,38550,13678,10882,36362,39309,29847,4651, + 3922, 20421,18725,19292,7499, 14357,3533, 5815, 31834,37877,8000, 33640,41630,22374,35002,825, 22864,34366,6789, 5269, 14713,31693,4162, 15085,5680, 29846,1892, 33640,33395,16716,13634,11409,36441,34871,39359,8670, 10335,5625, 12039,4656, 37882,13067,11704,4413, 27441,9968, 18408,34151,39309,33640,9769, 20342,6024, 34341, 18945,8295, 10638,14712,34397,12685,33639,15329,33147,37625,38303,20579,17841,17840,14080,13677,29721,10311,20341,19821,28586,31692,34366,12392,6049, 20340,41629, - 10224,12418,602, 13400,20448,9789, 37625,24878,1190, 13117,41629,6607, 2331, 19690,13403,30706,39309,36289,6370, 10483,13444,12343,22373,41629,2329, 18104,3271, + 10224,12418,602, 13400,20448,9789, 37625,24878,1190, 13117,41629,6607, 2331, 19690,13403,30706,39309,36289,6370, 10483,13444,12343,22373,41629,2329, 18104,3271, 4752, 5516, 8294, 17194,18944,11138,12777,23684,33639,14373,29098,39308,36289,20795,183, 23893,24950,33639,947, 3968, 2390, 17819,35873,27780,41629,41628,15084, 20339,28223,41628,27883,9008, 1697, 27923,24336,13219,26848,9891, 1396, 39308,34366,41628,11408,25464,41628,39308,605, 5393, 6240, 36992,20338,2288, 3791, 17123, 10642,34565,10667,12085,6573, 10546,7835, 3901, 3585, 14787,17839,3492, 12915,36659,39308,28222,39307,38022,38984,30457,13443,20048,25463,5278, 9383, 14196,14711, 41627,27770,35231,36288,29420,41627,29845,7001, 39307,34365,39307,30623,2803, 2522, 41627,36288,17173,39307,820, 3083, 7604, 10894,4138, 1519, 2578, 22029,29646, 8331, 12776,35599,15699,30877,12395,39306,9940, 41627,35231,38487,23285,37624,34211,36288,25462,31691,29498,36288,39306,33014,35230,17636,10867,18943,11483,35230, - 39306,35230,35230,41626,39306,37624,16856,38802,912, 6161, 32878,11576,27663,20818,26452,4137, 12062,1148, 891, 12664,31833,16009,1813, 28221,39305,36287,8031, + 39306,35230,35230,41626,39306,37624,16856,38802,912, 6161, 32878,11576,27663,20818,26452,4137, 12062,1148, 891, 12664,31833,16009,1813, 28221,39305,36287,8031, 36921,14195,4135, 5722, 6714, 39305,10893,37655,11703,1, 5186, 12701,23818,13205,39305,41626,29844,39305,8894, 12775,4794, 4689, 9527, 13903,28220,37624,34365, - 37976,36287,33013,39304,3020, 3251, 6239, 36007,33172,12158,7199, 23266,33639,17172,6205, 29843,977, 13278,33638,17191,10716,5445, 12038,970, 4195, 26589,7098, + 37976,36287,33013,39304,3020, 3251, 6239, 36007,33172,12158,7199, 23266,33639,17172,6205, 29843,977, 13278,33638,17191,10716,5445, 12038,970, 4195, 26589,7098, 33530,3693, 8157, 23485,23714,19525,22157,30012,20176,21233,1552, 12037,2683, 16008,33373,38667,26495,11652,116, 20612,3810, 20838,20890,31813,32975,3386, 32875, 33437,1667, 1655, 10728,25461,31690,13204,33638,11698,13428,31689,31688,31687,35229,26749,26748,41626,22372,37624,35782,41626,39304,38597,6751, 21357,15394,20337, - 13676,6204, 31665,2647, 18942,584, 9191, 30642,27917,28808,20336,10416,17838,5217, 38776,10637,4752, 24785,13136,33638,19124,13675,6112, 9228, 12391,12417,3288, + 13676,6204, 31665,2647, 18942,584, 9191, 30642,27917,28808,20336,10416,17838,5217, 38776,10637,4752, 24785,13136,33638,19124,13675,6112, 9228, 12391,12417,3288, 29842,34283,22371,31584,34842,8372, 31686,7087, 27805,41625,31685,1722, 14194,13887,33013,3900, 41625,7192, 8863, 13674,14179,9442, 5880, 17837,21537,41625,37623, 18248,5942, 15725,30710,10070,15048,23537,39304,18941,2029, 33638,41625,20045,8785, 33013,41624,24335,17635,41624,24334,33637,41624,18801,37623,12266,41624,23265, 37061,3470, 3129, 13104,39304,2934, 14710,5277, 41623,34654,41623,7839, 32978,29358,5306, 9768, 18940,25110,14193,3577, 4231, 17890,36287,893, 2323, 29781,18902, - 23446,27037,13673,14010,21143,36973,8376, 32440,16581,1162, 18939,17415,29891,20335,2018, 37135,31585,22168,41623,2762, 5806, 3270, 1252, 14304,33105,7670, 2526, + 23446,27037,13673,14010,21143,36973,8376, 32440,16581,1162, 18939,17415,29891,20335,2018, 37135,31585,22168,41623,2762, 5806, 3270, 1252, 14304,33105,7670, 2526, 32045,3820, 25609,6872, 6966, 11702,10636,27710,29008,33306,14709,16855,14708,22370,1157, 28350,6203, 10415,14707,17836,12390,36287,20334,8210, 16276,35229,13672, - 27995,15347,2815, 1650, 9967, 9644, 2537, 12774,2241, 7669, 3957, 39303,33637,37623,37623,38242,20794,26747,26746,39303,14036,28219,1268, 36286,16854,20333,5879, + 27995,15347,2815, 1650, 9967, 9644, 2537, 12774,2241, 7669, 3957, 39303,33637,37623,37623,38242,20794,26747,26746,39303,14036,28219,1268, 36286,16854,20333,5879, 9580, 9382, 32921,35229,31495,20793,1037, 37622,37622,37622,15083,17634,7086, 25460,37622,8789, 33196,35229,18103,34365,41623,36117,37621,37969,31039,5592, 16853, - 418, 15758,34926,7912, 787, 33637,4985, 14192,29841,7848, 16852,4558, 13671,18938,16007,22749,16851,9675, 9767, 9766, 352, 23458,6587, 18514,30969,8578, 3227, - 16850,23989,19869,10635,12389,5015, 20332,16849,20331,39303,39303,10866,18937,14726,38583,5679, 37262,33234,10414,35228,10634,39302,28218,8893, 41622,39302,1956, - 24358,28217,28149,9381, 14451,4036, 32918,3497, 8116, 10238,10865,14249,2613, 16937,2379, 7618, 14874,3870, 14517,102, 3714, 16895,31234,19482,25886,28216,7911, + 418, 15758,34926,7912, 787, 33637,4985, 14192,29841,7848, 16852,4558, 13671,18938,16007,22749,16851,9675, 9767, 9766, 352, 23458,6587, 18514,30969,8578, 3227, + 16850,23989,19869,10635,12389,5015, 20332,16849,20331,39303,39303,10866,18937,14726,38583,5679, 37262,33234,10414,35228,10634,39302,28218,8893, 41622,39302,1956, + 24358,28217,28149,9381, 14451,4036, 32918,3497, 8116, 10238,10865,14249,2613, 16937,2379, 7618, 14874,3870, 14517,102, 3714, 16895,31234,19482,25886,28216,7911, 7280, 34365,34364,21991,30693,41622,5878, 15328,6937, 17010,16848,39109,28396,36689,19355,9579, 16847,13670,34364,7112, 7373, 6841, 36854,34499,20082,497, 26816, - 28349,358, 20578,17835,18936,15327,18935,24333,5295, 2506, 3704, 26036,35269,13003,38013,20330,20329,39302,1940, 41622,7939, 22832,28231,16640,37621,38975,6079, + 28349,358, 20578,17835,18936,15327,18935,24333,5295, 2506, 3704, 26036,35269,13003,38013,20330,20329,39302,1940, 41622,7939, 22832,28231,16640,37621,38975,6079, 21822,9677, 32903,3972, 7764, 15326,25010,21182,5368, 38772,730, 7632, 21235,34237,18934,14191,17834,33499,38266,20328,20179,34671,37208,25959,8030, 36814,19288, - 21590,7838, 11445,27107,36524,13669,13668,3153, 7910, 16006,39302,22096,3357, 9381, 8660, 14190,1760, 29331,14706,17633,35060,20412,168, 17833,23, 4751, 4844, - 5822, 31832,28625,39301,2169, 13203,41622,37621,20327,8720, 33935,18933,9966, 34364,16941,25799,2920, 9578, 16846,33531,2584, 34122,1505, 39301,41621,39301,8432, + 21590,7838, 11445,27107,36524,13669,13668,3153, 7910, 16006,39302,22096,3357, 9381, 8660, 14190,1760, 29331,14706,17633,35060,20412,168, 17833,23, 4751, 4844, + 5822, 31832,28625,39301,2169, 13203,41622,37621,20327,8720, 33935,18933,9966, 34364,16941,25799,2920, 9578, 16846,33531,2584, 34122,1505, 39301,41621,39301,8432, 18247,26745,36286,41621,34364,15719,39086,8444, 41621,3229, 8550, 41621,35228,39301,18932,15325,18931,8892, 41620,41620,26744,31696,31684,35228,41620,18246,37621, 33637,34363,29840,18800,39300,20288,21902,25459,20792,33013,37885,18245,21536,34363,34911,36286,27001,9924, 20326,39300,41620,22879,39300,18930,19429,19517,22689, 38979,17073,6082, 43, 30690,24065,1509, 4421, 6065, 4163, 19763,8483, 11241,10945,16978,12360,18168,25592,9645, 17024,16114,12234,29869,13927,20767,17780,18859, - 28304,20458,11350,29218,32312,14024,15876,34005,39300,9015, 30726,37620,29396,11480,11989,39299,33012,22369,37870,13667,317, 16817,32735,32991,36979,36922,5159, + 28304,20458,11350,29218,32312,14024,15876,34005,39300,9015, 30726,37620,29396,11480,11989,39299,33012,22369,37870,13667,317, 16817,32735,32991,36979,36922,5159, 1851, 33623,33556,35216,7428, 12912,34801,18235,9048, 17832,8159, 5321, 37821,13088,28922,19354,8471, 36496,7643, 2774, 302, 6329, 38753,30105,10105,38102,35896, 8995, 9134, 16581,4263, 7783, 17831,27531,2962, 37620,13666,29668,30044,8862, 12388,41619,36419,2238, 20128,19428,29579,27417,635, 33912,9276, 1512, 25057,39112, 5979, 1685, 39299,36286,7408, 36285,6078, 41619,13202,20325,37620,35228,17048,19427,9662, 27938,33636,31683,28215,33012,15457,20081,29280,10084,41619,19426,31285, 41619,29839,41618,4680, 23306,21249,20324,39299,15334,27151,21493,38408,20323,37854,41618,25458,31682,38045,33636,35227,33636,34363,34325,39315,3048, 26167,35443, 18929,26834,36285,36285,24332,26096,722, 21817,28395,24272,8320, 39299,6467, 33012,1464, 3857, 17731,547, 25212,32884,25778,37823,6509, 10633,13201,14705,34675, 7372, 17830,41618,10864,36285,8577, 14704,6236, 866, 34851,38703,14703,23445,32960,35313,37541,23264,8431, 19800,33626,36574,39298,11442,31497,36138,22771,33012, - 37620,7736, 39238,36284,7371, 33011,27956,39298,35227,34363,39165,41618,1908, 3621, 4141, 12773,4840, 14189,8719, 38604,41617,39298,22827,41617,19425,36284,2284, + 37620,7736, 39238,36284,7371, 33011,27956,39298,35227,34363,39165,41618,1908, 3621, 4141, 12773,4840, 14189,8719, 38604,41617,39298,22827,41617,19425,36284,2284, 18244,41617,17604,25457,8669, 28649,22794,34362,32467,33271,4962, 39298,24530,36438,20080,16275,8434, 6545, 25701,41617,13168,41616,23263,39297,22634,41616,12609, 41616,865, 14878,6399, 41616,35227,41615,33011,20791,26585,35765,37905,25456,2575, 33232,2774, 23676,27294,1950, 15183,16696,8788, 9661, 5005, 12036,41615,39297, - 34362,34272,41615,6103, 430, 34362,26743,6252, 37619,41615,19664,31907,24502,37619,1116, 10933,39125,943, 38054,19424,28214,31707,39297,2467, 35227,8292, 1041, + 34362,34272,41615,6103, 430, 34362,26743,6252, 37619,41615,19664,31907,24502,37619,1116, 10933,39125,943, 38054,19424,28214,31707,39297,2467, 35227,8292, 1041, 14105,1926, 3452, 14372,37619,6936, 30837,10632,38234,15324,20228,5663, 41614,8891, 26742,39343,35226,27378,36897,38843,39297,23262,41614,29566,41614,35226,41614, 14702,12035,39154,14792,15323,5784, 14186,37047,1661, 26181,33830,37843,5494, 19423,34090,13331,35910,16845,29394,33984,16919,9397, 21951,9299, 20647,18243,39296, 41613,41613,17405,20322,41613,20790,39296,37619,35226,41613,37091,33736,36284,36284,633, 21976,12034,12348,4293, 41612,35025,37769,4191, 23261,2807, 37618,34362, 35226,7000, 37618,39296,23260,17632,22368,12914,41612,35225,23259,41612,39296,39295,41612,9965, 26741,35225,37618,32680,34135,2345, 7731, 20992,13574,1058, 33037, 38035,33880,6328, 10681,24650,7244, 41611,506, 18709,36079,15796,17196,41611,39295,4250, 41611,6048, 8978, 22300,37618,34233,21467,36590,34762,33636,27025,20049, - 9095, 37811,13403,38103,10383,32227,37088,18242,36209,14725,39295,32258,11080,41611,37617,41610,39295,13442,14831,8232, 11697,15456,26147,20941,33384,1710, 2356, + 9095, 37811,13403,38103,10383,32227,37088,18242,36209,14725,39295,32258,11080,41611,37617,41610,39295,13442,14831,8232, 11697,15456,26147,20941,33384,1710, 2356, 23945,36973,28199,1583, 2615, 33563,32908,8103, 12327,25079,28743,39294,41610,7191, 4956, 23289,41610,37617,28261,14160,6306, 5184, 36595,14002,23843,37617,35082, 37617,36832,15115,33280,41610,14188,37901,20664,25715,10631,41609,55, 20321,281, 17829,15322,1200, 769, 190, 18928,18927,1098, 3331, 28213,41609,37127,34361, 2831, 34240,3082, 30479,36822,3826, 33635,18926,1478, 67, 18925,24564,16844,16005,1292, 388, 10177,1852, 512, 14187,41609,41609,19422,23683,8715, 36734,39294, 1522, 24115,39294,18241,24331,13735,2452, 7243, 16843,35225,41608,34188,41608,35225,35586,41608,28212,35399,23175,41608,39294,41607,41607,205, 3546, 13242,32529, 8158, 4343, 12482,22367,33635,39293,41607,36283,35564,41607,33011,37779,37616,15940,41606,37808,41606,605, 34755,39293,37573,36283,41606,32774,25471,11371,17171, - 38751,158, 7873, 26169,16148,34361,8209, 33409,34313,26487,38422,20583,7454, 382, 36405,36283,36986,2297, 7540, 5394, 41606,29248,21535,278, 14210,2003, 5720, + 38751,158, 7873, 26169,16148,34361,8209, 33409,34313,26487,38422,20583,7454, 382, 36405,36283,36986,2297, 7540, 5394, 41606,29248,21535,278, 14210,2003, 5720, 15116,13290,30589,30603,2923, 16605,28211,38511,444, 26641,41605,39293,29838,36283,38961,8189, 30894,35224,41605,41605,25455,14066,9526, 39293,37616,29535,33635, 9227, 12387,20055,4221, 35238,15082,386, 7417, 10641,33041,18924,35224,3496, 19238,24246,6788, 27495,3324, 6461, 20750,39394,36198,35588,37616,14701,39091,11407, 1125, 21692,36282,41605,37616,36042,13167,38237,41604,37615,31523,16004,2027, 35861,26918,25768,14001,15897,30104,331, 4347, 4895, 8314, 37615,2217, 26740,35224, - 2328, 38743,2054, 39292,33011,36791,41604,41604,269, 873, 21837,1379, 6848, 18923,25878,5276, 12772,41604,39292,34361,36282,14186,25454,20320,9226, 17828,6023, + 2328, 38743,2054, 39292,33011,36791,41604,41604,269, 873, 21837,1379, 6848, 18923,25878,5276, 12772,41604,39292,34361,36282,14186,25454,20320,9226, 17828,6023, 16842,18027,27907,41603,32789,39292,41603,4220, 23258,24330,3468, 422, 18311,205, 29286,5126, 16935,21547,30611,25562,36109,3107, 11701,36580,21532,4452, 18905, 37296,41603,26739,35224,25190,25453,21534,41603,29310,3791, 5903, 28570,39292,41602,16582,31681,9577, 14629,38009,41602,33010,36282,39291,2464, 33635,19421,35223, 13665,33137,39294,31680,10389,31814,29837,10630,14185,18028,13337,37615,20468,41602,4382, 37223,2567, 21516,2763, 41602,36282,10863,14465,35987,1100, 1718, 23627, 8293, 28210,9783, 39291,16695,37615,15831,35223,41601,33073,3434, 2587, 31679,35223,38137,27120,25788,36768,22366,36281,41601,39291,31678,37614,33329,37614,36440, - 15560,41601,28455,19266,33634,37614,14700,4920, 22762,39291,30615,18922,10629,3123, 4307, 12666,8787, 13391,37614,10628,4536, 20319,8029, 86, 35223,34086,424, + 15560,41601,28455,19266,33634,37614,14700,4920, 22762,39291,30615,18922,10629,3123, 4307, 12666,8787, 13391,37614,10628,4536, 20319,8029, 86, 35223,34086,424, 2881, 27981,6318, 20318,15121,22934,10537,7472, 33634,41601,22365,33634,36281,2669, 23257,41600,34361,36869,41600,9576, 826, 12309,34360,41600,31677,35222,39290, 9134, 26267,35222,20317,37613,22364,39290,7486, 33021,33010,35688,19420,900, 37613,35222,39290,39290,28209,34965,39289,33634,2525, 34729,37613,37613,15830,41600, 32948,36281,30336,36281,39289,242, 37612,28208,34360,8668, 41599,12157,24304,39289,27165,38826,39289,31676,39145,34924,14035,37612,5072, 38808,8890, 8889, 31675, 9225, 29836,37612,1510, 41599,29979,39288,39199,7384, 758, 39172,35222,26738,37612,32358,4035, 31916,39288,13734,6549, 13449,29835,28207,14034,34307,12386,41599, 12487,3428, 15321,2508, 23170,35221,455, 8923, 29834,39306,32903,38203,20610,1334, 10627,13863,22020,3511, 33446,15320,21302,30274,16841,385, 17964,27779,25706, - 17827,33864,1751, 7560, 29524,22667,30239,1503, 35221,23908,15319,17826,37283,3683, 38006,702, 30977,8442, 33195,969, 15943,35280,16003,12898,41599,17825,8888, + 17827,33864,1751, 7560, 29524,22667,30239,1503, 35221,23908,15319,17826,37283,3683, 38006,702, 30977,8442, 33195,969, 15943,35280,16003,12898,41599,17825,8888, 36280,12238,1805, 28907,16840,20316,39288,36996,24329,81, 15333,9014, 32421,3973, 41598,3482, 24917,19645,36684,7054, 33119,33010,36769,1299, 25285,2655, 25377, 8694, 10715,3122, 12421,330, 32830,15480,7579, 18799,16002,25379,16571,16839,17824,37628,37134,10234,34360,3175, 2722, 4851, 9343, 26407,32390,9777, 8036, 20315, 7729, 10372,10661,13441,24938,1442, 28026,2857, 26720,7383, 34278,12665,5409, 41598,41598,39288,39287,36280,39287,4585, 7782, 17823,1421, 15455,39287,41598,24436, 3860, 18893,4360, 36280,35221,34787,39287,34360,33633,651, 36172,5148, 29833,7016, 9939, 41597,25452,8887, 39286,41597,6488, 15454,34878,2382, 34359,37611,33010, - 27940,2519, 20531,3784, 14699,19419,41597,28206,18921,34736,3301, 23318,6508, 25843,35221,16636,17491,37082,41597,29346,9257, 14033,41596,37611,17982,19872,2546, + 27940,2519, 20531,3784, 14699,19419,41597,28206,18921,34736,3301, 23318,6508, 25843,35221,16636,17491,37082,41597,29346,9257, 14033,41596,37611,17982,19872,2546, 38322,35220,36808,41596,452, 7482, 27771,26492,17247,17803,4099, 8158, 12651,38841,29255,35224,35432,2866, 35640,38345,26418,14161,35476,18920,2615, 5877, 26206, - 35245,38636,12445,24010,34286,17914,12065,37611,41596,37611,10273,9972, 11700,23256,26030,11696,37610,33633,15855,37610,41596,10862,7584, 8748, 37610,23255,6077, + 35245,38636,12445,24010,34286,17914,12065,37611,41596,37611,10273,9972, 11700,23256,26030,11696,37610,33633,15855,37610,41596,10862,7584, 8748, 37610,23255,6077, 24286,39286,18798,10714,8667, 13166,20005,21360,4397, 36280,16274,16694,37610,20789,22363,9133, 15453,28205,39286,811, 18251,17170,31674,19418,41595,3395, 37609, 33009,20788,33633,26737,34359,4137, 26788,21506,31673,18015,34041,36563,28044,13890,3103, 39286,20787,36279,21730,7781, 35014,33716,41595,37609,22362,28204,41595, 26736,16001,1436, 37201,13200,7182, 41595,8401, 35068,33009,17405,539, 2301, 16515,12033,4762, 16273,1472, 15149,1719, 23040,10258,203, 7435, 1932, 37609,39285, 6765, 4792, 22827,26800,4924, 41594,8330, 18797,5195, 37609,39285,39285,12354,39285,41594,15854,31672,34359,16273,25694,11134,26086,1287, 4955, 14698,17180,33009, 17631,28203,6886, 12385,16409,3852, 5871, 22361,8230, 11554,13726,2212, 26420,14697,5555, 5978, 10413,3110, 29321,414, 98, 25587,3061, 20623,14828,30873,24510, - 31671,10382,22360,38315,38237,17822,9575, 2530, 20639,33214,12525,19426,8273, 9050, 41594,2077, 9691, 18919,1053, 29930,24396,982, 4500, 26697,8006, 17982,1757, + 31671,10382,22360,38315,38237,17822,9575, 2530, 20639,33214,12525,19426,8273, 9050, 41594,2077, 9691, 18919,1053, 29930,24396,982, 4500, 26697,8006, 17982,1757, 41594,15705,41593,7224, 31670,17662,36279,9047, 38727,13199,29071,17821,35620,7583, 37608,37608,10083,18918,7382, 18240,39281,4927, 19326,34953,16000,7370, 20314, - 16693,37608,1305, 6712, 39284,29832,36279,2575, 10206,13938,18567,25704,6122, 9308, 24257,41593,33633,11699,23254,34359,30131,35495,9417, 37608,33009,39284,460, + 16693,37608,1305, 6712, 39284,29832,36279,2575, 10206,13938,18567,25704,6122, 9308, 24257,41593,33633,11699,23254,34359,30131,35495,9417, 37608,33009,39284,460, 39284,12771,1802, 14866,16838,2642, 36605,35220,10626,784, 8886, 2574, 2128, 20313,34680,35220,39304,15643,9126, 26809,34807,33632,26735,2987, 15999,41593,41593, - 625, 28966,17169,33008,11327,24165,33632,18796,7242, 350, 5616, 31232,15452,20271,26982,23045,17820,6045, 10823,8239, 33146,38692,2931, 5646, 22002,11137,9529, + 625, 28966,17169,33008,11327,24165,33632,18796,7242, 350, 5616, 31232,15452,20271,26982,23045,17820,6045, 10823,8239, 33146,38692,2931, 5646, 22002,11137,9529, 20412,7582, 2534, 5729, 4880, 3474, 4136, 30581,4396, 9975, 3869, 19233,26011,201, 803, 1429, 4341, 4750, 10894,5678, 3415, 9216, 7294, 11784,4459, 3416, 32783, 5523, 41592,33008,35825,15888,35186,28202,30988,15659,7581, 20312,34337,5821, 33707,16764,3436, 13664,7369, 4482, 14184,6999, 3220, 6488, 3294, 29095,32826,15954, - 34157,15130,18004,8881, 1707, 35856,7471, 5521, 16301,9964, 4367, 14979,8831, 25073,19818,19820,11136,36695,26476,15081,1085, 39357,4627, 5977, 28805,752, 7024, + 34157,15130,18004,8881, 1707, 35856,7471, 5521, 16301,9964, 4367, 14979,8831, 25073,19818,19820,11136,36695,26476,15081,1085, 39357,4627, 5977, 28805,752, 7024, 22508,36493,16837,37471,15643,21623,17819,4425, 3345, 12770,15318,13911,3902, 28277,39108,37142,3588, 33397,419, 9220, 26213,9938, 22359,1917, 11695,26734,39284, 41592,33008,26733,37607,34358,9937, 13165,39283,39283,12664,37607,3847, 9660, 37607,18239,13440,39283,23253,39283,27327,35005,37349,822, 39282,23252,41592,32489, 3977, 39186,8666, 3716, 10274,2836, 2479, 18795,10422,35220,36279,39282,37607,700, 154, 3485, 19533,29272,13198,472, 9765, 15998,20311,1035, 28201,3601, 36063, @@ -18946,84 +18941,84 @@ static const unsigned short Ranks[197839] = 13825,33520,24892,34210,36466,25449,19209,39279,18053,8718, 12769,38410,28197,12283,31555,36276,33007,33655,5019, 38694,12768,35931,29217,16836,7668, 37604,36276, 5219, 23608,498, 11685,5491, 37607,33970,2419, 2057, 20338,22699,37150,7588, 38077,11134,25394,14696,41588,31665,14029,36276,30558,19141,41588,18916,35218,39180, 31664,1802, 37087,36276,33690,2361, 7668, 41588,461, 14256,31969,37278,7734, 8717, 36275,18944,35978,20308,18915,4648, 20307,22358,8208, 4688, 37604,11269,34357, - 33006,24328,960, 37604,36275,39278,14500,17989,27272,37604,39278,1923, 32872,36762,10625,33892,14183,12032,14182,11697,26004,8566, 11133,13439,35759,35104,5764, + 33006,24328,960, 37604,36275,39278,14500,17989,27272,37604,39278,1923, 32872,36762,10625,33892,14183,12032,14182,11697,26004,8566, 11133,13439,35759,35104,5764, 34815,3482, 14181,18914,9763, 18966,37880,41587,36275,11406,11696,29210,13196,5364, 30900,37750,14180,2384, 20306,39246,11695,35958,1118, 7067, 17818,41587,17885, - 34665,17817,3956, 37761,17883,39278,17371,14127,9422, 3712, 6054, 39162,33631,31663,39278,39277,16272,38417,10221,41587,35218,2144, 33690,2596, 15193,24758,6202, + 34665,17817,3956, 37761,17883,39278,17371,14127,9422, 3712, 6054, 39162,33631,31663,39278,39277,16272,38417,10221,41587,35218,2144, 33690,2596, 15193,24758,6202, 7909, 13195,32398,7737, 1128, 34089,1563, 14695,4981, 20305,38439,36271,5956, 32969,16325,34357,41587,18293,25448,16271,25447,3043, 3901, 2734, 8575, 20304,26771, - 35218,23249,17168,36626,3735, 1990, 9380, 4253, 3946, 16767,35217,8716, 3430, 9762, 11353,26396,26271,30672,5579, 6116, 27639,5014, 20270,22518,18913,12031,509, + 35218,23249,17168,36626,3735, 1990, 9380, 4253, 3946, 16767,35217,8716, 3430, 9762, 11353,26396,26271,30672,5579, 6116, 27639,5014, 20270,22518,18913,12031,509, 10751,15316,38280,3179, 11889,33631,25346,41586,2936, 17816,16835,11160,5028, 17842,18793,37160,23945,33034,8825, 10423,32854,35217,11592,35024,22357,8520, 41586, 30865,39277,35217,41586,33006,38018,1138, 8618, 28120,24833,16220,38124,27987,20054,2502, 29677,17757,27771,18912,485, 7935, 31185,16883,38552,15376,35883,23940, 35246,9356, 14694,16444,15757,34080,19831,10306,18964,17815,33654,17397,23472,38246,3679, 37792,41586,24327,26731,1002, 36275,22121,9224, 26865,4810, 36154,16834, 34675,20784,41585,3024, 15879,33330,23378,2668, 12767,18911,7368, 38865,8549, 4213, 37603,15996,6787, 10624,11405,9379, 37229,27661,31662,37941,23248,28196,12663, - 3318, 8329, 39277,29829,7733, 20783,31661,41585,31660,1293, 9378, 6935, 37603,26730,18910,33006,11925,33630,15451,33006,37996,39277,26729,23247,18792,33946,7905, + 3318, 8329, 39277,29829,7733, 20783,31661,41585,31660,1293, 9378, 6935, 37603,26730,18910,33006,11925,33630,15451,33006,37996,39277,26729,23247,18792,33946,7905, 37603,22356,41585,15816,16833,13078,41585,2946, 7732, 8861, 9573, 17814,1077, 20303,3481, 9377, 18909,16832,24326,34040,5819, 24325,24324,33005,37603,34356,41584, - 12662,33005,33005,14905,15995,33005,39276,35217,3756, 17813,16831,20436,676, 27000,25237,14362,23517,16280,37602,12641,20854,18653,37648,22720,41584,914, 2158, + 12662,33005,33005,14905,15995,33005,39276,35217,3756, 17813,16831,20436,676, 27000,25237,14362,23517,16280,37602,12641,20854,18653,37648,22720,41584,914, 2158, 30822,10176,36274,35216,34356,1993, 11614,29828,9083, 23246,8715, 31241,29465,35590,35216,4421, 14693,9761, 10412,7470, 20302,1515, 20477,33932,4390, 20673,22731, - 15882,36274,31744,1230, 32965,17381,15994,17812,34356,37602,6400, 35892,41584,12416,41584,36274,33004,36274,7381, 24323,22355,41583,3149, 5451, 15315,16830,8027, + 15882,36274,31744,1230, 32965,17381,15994,17812,34356,37602,6400, 35892,41584,12416,41584,36274,33004,36274,7381, 24323,22355,41583,3149, 5451, 15315,16830,8027, 17167,20078,41583,33507,7492, 39276,12913,41583,2518, 39276,4809, 24322,33630,32464,22354,8207, 41583,41582,4684, 26188,41582,18545,15993,26881,39276,36273,34356, 41582,6138, 17811,6475, 32992,1179, 22195,39275,4816, 33630,35899,3845, 41582,35216,17166,16308,8664, 8443, 2210, 28188,11694,8803, 10543,29276,2329, 3332, 21225, 24703,17810,39105,37602,2837, 23105,28979,36145,36890,22226,1983, 31383,20587,15614,41581,1186, 12623,41581,2698, 33489,37269,41581,36273,35488,33162,31478,24964, - 5840, 30929,12180,20301,14692,34853,20300,1369, 32648,26988,36379,29827,982, 3831, 6463, 41581,20299,3144, 37943,14691,26262,23084,9963, 14179,20298,41580,528, + 5840, 30929,12180,20301,14692,34853,20300,1369, 32648,26988,36379,29827,982, 3831, 6463, 41581,20299,3144, 37943,14691,26262,23084,9963, 14179,20298,41580,528, 5367, 15314,22238,5553, 18908,38553,2897, 9572, 18907,4647, 32798,20297,35621,15313,13663,13662,17809,14690,13194,4458, 13212,12030,13193,6934, 9760, 16829,21293, 10861,11132,11694,16110,24104,2065, 5408, 15312,6933, 34355,6803, 38447,24321,6507, 13532,27784,12225,15853,31659,18906,18905,10471,22353,17629,37602,10623,16828, 6545, 1827, 7279, 10860,1291, 7469, 946, 15992,15084,28681,6651, 9571, 11693,16827,11404,36273,11126,33630,3789, 34392,12972,19892,34355,28567,37601,32787,31444, 33497,34355,35434,20351,13423,32870,32205,30890,25400,36135,36273,1553, 28213,30609,33796,33000,11867,15705,36722,872, 20034,22352,41580,33652,33158,25446,38700, 27704,38189,34355,28195,34354,26409,8786, 34354,20077,11658,33004,36272,41580,38807,31181,39091,21820,35061,26042,37440,20963,15312,22136,9570, 7780, 13661,16826, 27253,29575,14156,7432, 37323,32356,25782,33022,31049,9377, 17808,15502,34111,38687,20296,10847,12631,17016,21680,32894,322, 36967,9849, 20422,28650,9257, 36272, - 39275,33004,35833,6814, 29658,35568,2755, 39275,27731,34700,37601,2775, 26297,5054, 35216,39275,39274,35215,35280,12661,24973,24251,21707,37230,33759,3288, 9892, + 39275,33004,35833,6814, 29658,35568,2755, 39275,27731,34700,37601,2775, 26297,5054, 35216,39275,39274,35215,35280,12661,24973,24251,21707,37230,33759,3288, 9892, 7278, 5763, 15976,24889,29887,12766,14401,2127, 35096,37601,22351,30987,38115,8442, 5407, 41580,30778,38314,11131,38905,24756,10622,3473, 39274,209, 12851,12415, 37601,39274,39274,23245,25445,24320,29826,41579,627, 1191, 489, 2935, 7667, 37600,18238,3709, 11403,15450,7908, 178, 11347,14689,35215,6999, 29825,29824,36272, 34354,20036,41579,16256,9733, 35565,708, 8280, 5996, 41579,15767,20554,41579,24077,34354,26728,33629,38363,33629,34353,33629,18904,33629,41578,36665,33004,41578, 609, 38739,7622, 26574,41578,38047,39273,13660,9223, 39273,12440,39273,549, 5905, 13040,39273,7907, 445, 8871, 35869,35923,3422, 37600,17165,41578,1783, 37560, 7557, 14178,11729,8157, 17807,10542,3139, 5585, 35654,41577,33628,41577,16729,24319,28090,15592,7823, 33003,39272,41577,41577,18635,34353,1501, 35215,37600,26727, 22350,24318,25444,9256, 33003,17164,34353,37600,36272,15077,31658,37599,29823,34750,37599,16270,37599,3931, 41576,18237,14371,8236, 35215,5046, 37862,18415,14927, - 7981, 33003,5275, 36030,11482,6162, 15239,35214,13659,1534, 9376, 23119,5490, 20295,19860,1505, 7468, 17239,8401, 39272,33003,41576,6201, 14688,22349,2905, 7906, + 7981, 33003,5275, 36030,11482,6162, 15239,35214,13659,1534, 9376, 23119,5490, 20295,19860,1505, 7468, 17239,8401, 39272,33003,41576,6201, 14688,22349,2905, 7906, 41576,41576,41575,31921,32921,21649,35060,41575,12660,13438,5342, 12932,1438, 36271,2981, 32198,13528,24124,14286,39240,32836,4954, 23340,5762, 415, 11035,19318, 29678,11692,2614, 13538,3057, 6102, 37599,11693,7905, 17163,28194,3725, 1406, 36271,1145, 13009,15852,10822,39272,37598,8606, 33628,28193,2660, 35214,6427, 37781, 13164,9525, 15991,23460,35214,23772,19416,15449,17162,15448,41575,41575,41574,6937, 39272,35214,37380,41574,12403,36271,6155, 7727, 7904, 39351,37598,3708, 39271, 33002,18903,41574,37598,20294,29822,1542, 34912,35213,7277, 9085, 13541,2091, 17638,36271,36270,11481,2676, 474, 41574,36768,35213,24317,25443,33002,11692,41573, - 15076,20782,34353,39271,4672, 39271,16659,41573,34352,37598,4420, 20076,37597,34352,41573,35213,39271,41573,36270,33628,363, 41572,33628,35213,36270,9824, 564, - 35736,22174,36692,14168,9540, 19843,5612, 32220,1310, 17943,38172,37143,39270,35212,6267, 33627,26726,21532,23244,39270,41572,35212,37597,6743, 26725,41572,7779, + 15076,20782,34353,39271,4672, 39271,16659,41573,34352,37598,4420, 20076,37597,34352,41573,35213,39271,41573,36270,33628,363, 41572,33628,35213,36270,9824, 564, + 35736,22174,36692,14168,9540, 19843,5612, 32220,1310, 17943,38172,37143,39270,35212,6267, 33627,26726,21532,23244,39270,41572,35212,37597,6743, 26725,41572,7779, 628, 4191, 8663, 37597,39270,4921, 10411,15990,41572,9814, 34889,9222, 33627,23068,6372, 37597,36270,1664, 18093,9759, 32806,41571,9372, 36269,33627,41571,41571, 35212,2347, 6047, 824, 20075,5422, 16991,25852,39270,39269,9936, 31657,6998, 13731,18791,23243,41571,28287,9371, 41570,37596,41570,35548,31656,33627,39269,34352, 26724,26755,20068,14105,3717, 32976,37743,8555, 34259,21531,25442,34352,41570,31655,39269,12414,12413,29549,29821,41570,33002,20552,15989,17022,104, 4922, 18261, 14597,28915,9524, 10859,37170,22348,37596,39269,41569,25441,16825,4166, 24316,4387, 12659,11079,10892,37596,36335,22865,35212,32899,38140,786, 39268,41569,36974, - 31654,34529,21530,28659,10323,41569,13332,11130,29820,24315,41569,37596,39268,37595,21704,6561, 13192,36348,8714, 1495, 25470,1379, 26723,41568,9659, 440, 8681, - 13143,7234, 6823, 25670,30325,21315,32158,32951,32718,2016, 23896,14783,12720,39268,36405,28214,18236,6436, 1806, 7260, 29782,21940,33171,41568,34351,11124,8548, - 36254,32996,39268,35948,36269,19415,3225, 1453, 30958,16950,11724,1304, 2553, 6644, 37595,7189, 31134,2614, 1813, 12040,23633,7123, 14782,15734,25116,25195,500, - 18902,10546,17253,29819,34351,11129,41568,25903,24974,41568,20995,10858,1410, 11838,744, 9370, 41567,15075,1905, 36269,33742,41567,1178, 31653,35063,15851,1374, + 31654,34529,21530,28659,10323,41569,13332,11130,29820,24315,41569,37596,39268,37595,21704,6561, 13192,36348,8714, 1495, 25470,1379, 26723,41568,9659, 440, 8681, + 13143,7234, 6823, 25670,30325,21315,32158,32951,32718,2016, 23896,14783,12720,39268,36405,28214,18236,6436, 1806, 7260, 29782,21940,33171,41568,34351,11124,8548, + 36254,32996,39268,35948,36269,19415,3225, 1453, 30958,16950,11724,1304, 2553, 6644, 37595,7189, 31134,2614, 1813, 12040,23633,7123, 14782,15734,25116,25195,500, + 18902,10546,17253,29819,34351,11129,41568,25903,24974,41568,20995,10858,1410, 11838,744, 9370, 41567,15075,1905, 36269,33742,41567,1178, 31653,35063,15851,1374, 13191,17806,41567,4144, 6790, 33626,23575,2830, 25189,33626,6957, 2855, 29818,29817,41567,37595,38849,15447,1545, 39267,12412,31693,38050,36036,39276,36269,36268, - 955, 17995,34351,33605,1661, 28162,9523, 33626,1324, 39267,19689,26236,9962, 776, 10164,27181,17749,32817,20293,2245, 33382,9152, 15836,29213,241, 37827,4967, - 6316, 10757,269, 2954, 2892, 6076, 583, 5677, 4535, 9961, 37940,22489,25176,231, 28292,1068, 34351,8551, 15093,36268,8950, 4354, 4557, 8026, 1942, 37595,5317, + 955, 17995,34351,33605,1661, 28162,9523, 33626,1324, 39267,19689,26236,9962, 776, 10164,27181,17749,32817,20293,2245, 33382,9152, 15836,29213,241, 37827,4967, + 6316, 10757,269, 2954, 2892, 6076, 583, 5677, 4535, 9961, 37940,22489,25176,231, 28292,1068, 34351,8551, 15093,36268,8950, 4354, 4557, 8026, 1942, 37595,5317, 16277,52, 5333, 30294,31091,41566,27493,16116,18864,23242,39267,31643,8763, 30278,39267,41566,41566,3991, 33030,3990, 20292,19541,3064, 23241,3926, 37594,39266, - 14177,33626,31652,41566,21361,41565,39266,33002,39266,33625,41565,15196,31651,33940,3056, 60, 7892, 20018,37401,580, 8998, 31088,19243,13687,1291, 3018, 2878, + 14177,33626,31652,41566,21361,41565,39266,33002,39266,33625,41565,15196,31651,33940,3056, 60, 7892, 20018,37401,580, 8998, 31088,19243,13687,1291, 3018, 2878, 35608,23434,16824,35798,83, 37047,12382,6407, 38991,16165,4173, 4822, 17628,41565,39266,15988,36268,41565,2557, 28752,32970,36375,20396,1717, 35778,129, 19674, 23464,6491, 3206, 37659,26683,8713, 32707,33302,766, 41564,37915,11931,2424, 9960, 16074,26553,1797, 29032,33656,35908,36540,9658, 25520,24968,28676,1467, 25972, 5928, 41564,18790,17805,2325, 4549, 22782,29803,26722,8306, 721, 30804,3967, 6289, 38623,5174, 29816,37594,6487, 34174,16269,29815,23240,36268,36267,37594,41564, 37594,28192,15446,33001,37593,31021,3271, 37593,9245, 19617,13195,36267,35211,34350,11943,14345,32222,34350,33625,25435,33625,37593,39265,33662,35211,39265,25744, 36267,2525, 41564,33001,39265,36267,39265,32910,41563,19876,179, 1133, 16268,6317, 673, 29814,5634, 35211,30798,1674, 41563,10220,37593,38801,30142,28191,41563, 2346, 22347,28190,6544, 25440,41563,14176,8934, 41562,39264,9959, 16823,28776,12658,4990, 39264,3733, 16822,2135, 26721,39264,2391, 15987,20074,5927, 944, 15311, - 38551,35211,14687,1440, 4584, 868, 10729,37178,13658,39264,1823, 27847,14344,8327, 16611,6435, 6658, 11538,27842,7276, 21905,14175,16821,7922, 17677,35241,6786, + 38551,35211,14687,1440, 4584, 868, 10729,37178,13658,39264,1823, 27847,14344,8327, 16611,6435, 6658, 11538,27842,7276, 21905,14175,16821,7922, 17677,35241,6786, 29813,25439,20073,15074,41562,41562,1774, 29812,5046, 4961, 41562,41561,29811,13163,39263,21529,41561,41561,7731, 20072,37592,10713,41561,18789,10175,35210,37592, 24314,41560,33168,7904, 41560,41560,36266,39263,2543, 19663,18235,35210,41560,24313,1233, 8811, 282, 2317, 11372,115, 10920,35000,31650,36118,9617, 21139,15986, 35845,5339, 41559,15556,32468,20933,11933,2040, 17804,17161,20781,31649,37592,37592,35210,41559,34350,35210,39263,37591,39263,39262,18901,41559,3852, 19279,18965, 23747,13272,11180,31648,11461,35149,3830, 32226,17803,12912,9758, 4442, 35209,15985,34350,26720,11078,19227,12337,597, 41559,29810,1769, 2415, 19414,36266,36266, - 563, 18234,2237, 34902,33958,37591,34349,26719,9657, 39262,34935,3250, 12683,41558,11268,35209,2242, 33625,37591,3204, 26718,6543, 19413,17627,20780,11480,9656, + 563, 18234,2237, 34902,33958,37591,34349,26719,9657, 39262,34935,3250, 12683,41558,11268,35209,2242, 33625,37591,3204, 26718,6543, 19413,17627,20780,11480,9656, 3932, 17946,24312,41558,9375, 37591,41558,3542, 24311,31647,35209,5260, 41558,34349,13730,39262,13437,35185,11691,20779,34349,37590,37590,41557,20071,6486, 41557, - 35209,41557,23239,33624,33001,37590,18788,34349,20070,41557,36266,6997, 15850,33001,41556,35208,41556,15849,33624,29809,17160,721, 39262,35923,39261,33000,7472, + 35209,41557,23239,33624,33001,37590,18788,34349,20070,41557,36266,6997, 15850,33001,41556,35208,41556,15849,33624,29809,17160,721, 39262,35923,39261,33000,7472, 33624,23238,41556,33624,12411,2633, 14723,28189,35208,25438,6785, 41556,34348,35208,36265,39261,41555,34984,1459, 41555,19412,33623,21528,14028,39261,36265,23237, 20778,36265,15848,36265,19411,14722,36264,39261,39260,37590,33000,26232,28188,6258, 41555,41555,33718,31646,41554,24310,37589,36264,6813, 21527,41554,4306, 33000, 39260,36264,39260,41554,38264,12574,39260,37589,36264,16267,39259,20069,35208,16381,22669,36263,14466,37279,34796,41554,9106, 243, 8419, 27865,5764, 36719,24309, 17626,20731,15445,41553,18787,17427,16692,37589,18233,33623,34348,41553,33000,8096, 38507,28187,28186,24308,21526,37589,41553,11932,41553,2817, 39259,37588,15073, 18786,28185,19410,37588,10638,36263,37588,9859, 41552,32999,7367, 24307,39259,35207,10541,4100, 18800,21642,41552,1120, 10219,38360,35207,6434, 24549,38736,34153, 33740,41552,10540,34539,25437,36263,34348,14027,39259,8885, 39258,33302,33207,36263,37588,41552,33623,9522, 11931,18900,14174,20786,33623,16820,34348,10857,39258, - 39258,8206, 23236,25436,25776,37492,35082,35207,41551,18785,559, 3668, 28184,39258,29808,3126, 39257,12148,11986,37845,36262,28096,12381,15984,30785,39257,9045, - 10621,4612, 17802,2499, 10548,23676,1553, 447, 1997, 935, 2965, 41, 32909,20291,37810,38558,24306,39257,31975,1220, 37587,12697,34, 4207, 30821,1239, 156, + 39258,8206, 23236,25436,25776,37492,35082,35207,41551,18785,559, 3668, 28184,39258,29808,3126, 39257,12148,11986,37845,36262,28096,12381,15984,30785,39257,9045, + 10621,4612, 17802,2499, 10548,23676,1553, 447, 1997, 935, 2965, 41, 32909,20291,37810,38558,24306,39257,31975,1220, 37587,12697,34, 4207, 30821,1239, 156, 41551,562, 34430,13570,1691, 3545, 34347,9574, 36262,37460,31293,15983,31645,39257,12029,20290,5341, 10539,35207,29807,34347,2175, 10925,2149, 35206,24422,35241, 17003,39256,12380,3429, 33622,34347,1748, 26660,33477,7778, 37887,29806,10538,39256,34154,20289,20068,37587,32999,37484,38701,2601, 31780,38274,34876,37850,36970, 32826,34454,38402,19676,39024,8430, 21962,8345, 11694,33615,20288,35206,39256,36262,26310,6932, 37548,31984,14482,14686,14685,33622,41551,41551,41550,33622,34347, - 34346,1975, 466, 28183,22346,1378, 32384,37587,6154, 36262,18552,5143, 12765,23235,13251,36534,39256,13436,15982,33096,9958, 33052,4708, 34975,41550,37587,8884, - 25435,5075, 7666, 41550,10381,4060, 15451,32999,32999,21525,37586,41550,22230,39255,19384,26101,29805,22345,37586,29804,34346,41549,28535,74, 32794,18803,1959, + 34346,1975, 466, 28183,22346,1378, 32384,37587,6154, 36262,18552,5143, 12765,23235,13251,36534,39256,13436,15982,33096,9958, 33052,4708, 34975,41550,37587,8884, + 25435,5075, 7666, 41550,10381,4060, 15451,32999,32999,21525,37586,41550,22230,39255,19384,26101,29805,22345,37586,29804,34346,41549,28535,74, 32794,18803,1959, 25636,20501,8929, 21697,25261,31462,15762,28670,25666,17545,18, 5094, 20441,11408,37586,121, 33060,20844,313, 8628, 11479,7556, 9895, 14026,18899,35206,28182, 663, 23174,35206,39255,20748,4534, 25294,13573,1013, 7777, 14684,13946,10476,39255,49, 5994, 36489,30110,12379,31644,9044, 20287,30518,17625,25025,15981,35885, 21375,31643,22344,41549,41549,23234,20777,8785, 36261,5444, 29803,24045,6328, 28181,41549,16293,39255,37586,9132, 13435,39254,37585,31642,30334,622, 14330,23158, @@ -19033,13 +19028,13 @@ static const unsigned short Ranks[197839] = 28180,29802,32022,10290,34614,5050, 38528,32764,22598,41546,36872,37725,28179,34345,36259,31571,26716,1296, 6167, 18898,39254,35514,39253,113, 33621,20426,22342, 10082,26845,22341,24358,41546,37584,9935, 37584,33621,4016, 18897,9782, 17624,18231,11691,3384, 41545,36259,10536,25888,34091,3012, 9568, 41545,41545,5481, 20775, 20774,33621,36259,35204,41545,24304,35204,25702,36259,41544,8661, 1389, 17216,10712,15979,26816,8240, 8776, 15728,6368, 7617, 38726,7783, 6403, 39253,38164,39253, - 15444,29801,39253,41544,2702, 17623,41544,35204,41544,39252,11478,8441, 41543,37583,2805, 9461, 35679,34345,942, 7228, 22054,15674,41543,13729,732, 20633,7467, + 15444,29801,39253,41544,2702, 17623,41544,35204,41544,39252,11478,8441, 41543,37583,2805, 9461, 35679,34345,942, 7228, 22054,15674,41543,13729,732, 20633,7467, 13190,2313, 4380, 28716,7466, 3756, 2440, 601, 7312, 25062,36258,2746, 26715,39252,900, 4017, 29800,9999, 36073,39165,41543,13770,37583,15211,33278,32824,34345, 36258,34345,39252,14173,8940, 17614,30073,13189,23836,36367,3066, 41543,39252,25434,32998,34344,5698, 22256,35204,41542,36258,25140,5305, 4918, 28138,20286,10410, - 37437,5053, 9221, 4381, 9757, 33621,32998,5662, 4829, 3707, 39251,37583,39251,32998,31640,29799,34344,9369, 7730, 16691,41542,24112,32599,12214,20773,15372,9934, + 37437,5053, 9221, 4381, 9757, 33621,32998,5662, 4829, 3707, 39251,37583,39251,32998,31640,29799,34344,9369, 7730, 16691,41542,24112,32599,12214,20773,15372,9934, 23042,1885, 27398,38860,29972,29798,28178,33620,8205, 19409,5480, 41542,39251,19408,14369,28177,23233,35300,39251,39411,26883,21524,34344,32997,35203,16266,41542, - 35203,41541,10871,1279, 16121,12410,17159,9756, 17800,39250,22904,6426, 32997,36258,41541,7014, 26714,4451, 32997,37583,33620,33620,16205,39250,24338,11690,6871, - 3225, 33747,41541,1243, 32997,5761, 23232,4356, 34344,39157,32996,41541,14683,33813,28648,15978,28430,8525, 2205, 9655, 1773, 5037, 41540,15309,27818,37220,1883, + 35203,41541,10871,1279, 16121,12410,17159,9756, 17800,39250,22904,6426, 32997,36258,41541,7014, 26714,4451, 32997,37583,33620,33620,16205,39250,24338,11690,6871, + 3225, 33747,41541,1243, 32997,5761, 23232,4356, 34344,39157,32996,41541,14683,33813,28648,15978,28430,8525, 2205, 9655, 1773, 5037, 41540,15309,27818,37220,1883, 17158,35203,41540,36257,25433,15308,15443,37582,41540,35203,41540,41539,32996,18230,41539,39250,41539,29797,13728,41539,41538,41538,39250,39249,31639,35202,37582, 41538,32996,41538,33620,35202,37582,6936, 37582,24303,39249,41537,41537,36257,35202,37581,35202,37581,41537,10620,36257,7903, 18784,26713,26712,35201,25432,39249, 39249,25431,31638,12764,33619,29755,35359,34779,35834,37386,30899,37298,32996,4262, 29677,8712, 39248,13162,3885, 38448,375, 24302,32995,41537,14721,39354,27605, @@ -19047,16 +19042,16 @@ static const unsigned short Ranks[197839] = 13727,36257,36256,33619,13726,15847,31637,37580,5373, 4607, 36256,10218,35200,39248,41535,1337, 12378,8711, 35029,37963,20304,36256,35200,28176,6199, 7465, 10413, 38502,9374, 38028,37588,149, 4944, 32851,17491,4085, 34343,24301,20067,32995,10534,33619,34009,36256,13725,12657,1479, 3356, 32995,2914, 39248,22340,34217,17124, 36843,25430,9933, 36255,36931,11690,22094,32882,1826, 27358,19407,1051, 18783,23231,6299, 10619,18896,11401,30079,16260,2757, 31416,17622,4079, 41535,26211,32994, - 25578,28902,31636,32994,7404, 33711,1298, 18229,6852, 7386, 32494,14368,36255,24300,5451, 15307,13656,4489, 13188,18954,13655,5617, 39247,41535,39247,31635,139, + 25578,28902,31636,32994,7404, 33711,1298, 18229,6852, 7386, 32494,14368,36255,24300,5451, 15307,13656,4489, 13188,18954,13655,5617, 39247,41535,39247,31635,139, 37580,36415,32079,36736,29794,6748, 34342,20285,19706,33619,12418,33108,27022,626, 26471,6558, 36255,39247,15977,35877,14172,1550, 37580,1964, 11689,31634,38000, - 24000,38901,1842, 39247,10533,16265,34234,29793,732, 3047, 15976,23469,20108,32815,29597,5805, 7665, 37676,1569, 38862,1835, 19253,10499,28277,12409,13674,876, + 24000,38901,1842, 39247,10533,16265,34234,29793,732, 3047, 15976,23469,20108,32815,29597,5805, 7665, 37676,1569, 38862,1835, 19253,10499,28277,12409,13674,876, 8946, 26711,32994,11688,17882,18782,1017, 4093, 28675,30431,33022,26321,36255,28608,5818, 18781,14025,35749,36254,19803,27175,8710, 31633,22819,4566, 37601,35394, 19404,988, 16232,32994,29191,29792,28175,26710,10379,27047,35200,32644,41535,39246,28174,26709,312, 19899,37301,29728,8709, 33180,3311, 6410, 8580, 14402,23229, 8076, 36721,36254,12377,39246,35200,37251,22974,17799,39246,41534,41534,41534,36254,41534,11689,36254,3844, 41533,36755,18780,6327, 22339,41533,41533,41533,33618, - 20066,36253,37580,34342,10711,41532,37579,5995, 30926,10532,10710,20892,19729,17621,32929,712, 29791,39246,20065,39245,37579,41532,24299,37579,22338,1518, 4101, - 36253,41532,1151, 16692,41532,9373, 33197,12763,17798,37579,2632, 9372, 4793, 34342,4197, 37578,38470,29790,38606,37578,34688,37578,31632,28173,8204, 36253,2829, + 20066,36253,37580,34342,10711,41532,37579,5995, 30926,10532,10710,20892,19729,17621,32929,712, 29791,39246,20065,39245,37579,41532,24299,37579,22338,1518, 4101, + 36253,41532,1151, 16692,41532,9373, 33197,12763,17798,37579,2632, 9372, 4793, 34342,4197, 37578,38470,29790,38606,37578,34688,37578,31632,28173,8204, 36253,2829, 41531,29474,19909,41531,36253,29318,34981,13358,16690,7999, 24454,41531,37578,12408,21523,33618,41531,33629,25120,34616,17797,30218,15769,17796,4219, 14720,33296, - 29736,12656,39263,15306,41530,36252,39084,28192,22682,20545,31430,6485, 41530,17620,24298,26708,514, 16816,37060,2390, 4395, 20284,8156, 15975,20283,15974,6433, + 29736,12656,39263,15306,41530,36252,39084,28192,22682,20545,31430,6485, 41530,17620,24298,26708,514, 16816,37060,2390, 4395, 20284,8156, 15975,20283,15974,6433, 39314,18895,2865, 6643, 20282,16815,7130, 3851, 9957, 34342,6741, 7821, 37577,37075,14719,36956,7241, 21312,33618,35199,29789,37577,39022,41530,33618,2934, 16264, 41530,37577,3790, 30656,9311, 37646,31631,41529,9131, 720, 9080, 35985,4059, 17795,1368, 1947, 4507, 38382,35931,3682, 4880, 17794,9755, 32094,33492,8860, 39245, 13187,37495,9615, 31630,21848,17619,4556, 13654,15421,37577,4842, 10174,7464, 25811,6731, 20772,36252,37576,39245,22337,12464,28172,39245,7315, 17793,35199,41529, @@ -19067,18 +19062,18 @@ static const unsigned short Ranks[197839] = 3435, 19874,18485,11128,11812,37829,2113, 11551,27841,11399,5672, 14723,9799, 37272,21850,3425, 39244,12654,21874,35699,37575,25429,28170,21521,39243,25428,11267, 35198,41527,38010,32993,34341,34341,28169,11687,25427,254, 28494,17477,7398, 13684,2024, 20280,17792,12910,41527,1590, 27846,20770,16813,34417,41526,41526,22336, 29788,33617,31628,26705,26704,18228,15442,37575,36251,18779,17617,7664, 8440, 39243,37575,41526,39243,41526,37574,39243,39242,13041,20275,11384,41525,30816,33087, - 39242,5497, 17616,39242,29787,37574,41525,37574,35198,33617,23230,41525,1239, 4782, 5005, 6011, 15973,7580, 33617,15807,18894,9371, 39313,23130,32163,36430,1414, + 39242,5497, 17616,39242,29787,37574,41525,37574,35198,33617,23230,41525,1239, 4782, 5005, 6011, 15973,7580, 33617,15807,18894,9371, 39313,23130,32163,36430,1414, 2967, 8177, 3989, 7275, 38553,28731,2148, 5977, 8429, 38882,34914,5572, 5989, 29271,23035,41525,36251,41524,33617,41524,41524,12762,17156,28773,35642,34576,26376, - 33338,33072,38549,33616,41524,5408, 26703,6367, 6935, 37574,39242,340, 26702,4542, 4218, 41523,36251,3449, 13427,10856,29786,2236, 35505,36259,32601,41523,8859, - 25456,1326, 15990,13185,38386,39241,29785,15441,37573,36251,6334, 39241,39241,36827,35805,38979,762, 11085,22805,33081,17846,17720,5334, 1852, 12241,8801, 2849, - 3448, 15652,41523,39241,41523,35198,23953,14367,2092, 41522,15744,11073,1350, 34216,5945, 8660, 8547, 7111, 2385, 15972,41522,2120, 29153,14204,7076, 7903, 6995, + 33338,33072,38549,33616,41524,5408, 26703,6367, 6935, 37574,39242,340, 26702,4542, 4218, 41523,36251,3449, 13427,10856,29786,2236, 35505,36259,32601,41523,8859, + 25456,1326, 15990,13185,38386,39241,29785,15441,37573,36251,6334, 39241,39241,36827,35805,38979,762, 11085,22805,33081,17846,17720,5334, 1852, 12241,8801, 2849, + 3448, 15652,41523,39241,41523,35198,23953,14367,2092, 41522,15744,11073,1350, 34216,5945, 8660, 8547, 7111, 2385, 15972,41522,2120, 29153,14204,7076, 7903, 6995, 5318, 18893,15846,7471, 4841, 1902, 6931, 6259, 4998, 15304,35197,33816,17615,36250,37573,20769,37573,37573,9567, 30366,39099,11727,12593,38249,41522,37572,14682, 36250,5372, 18227,15440,36250,13160,6425, 26701,31627,34340,36250,36588,33616,20279,38578,41522,5944, 36249,39240,34890,12653,15439,28168,41521,35197,21520,31089, 33616,34340,37572,33616,2134, 20278,3550, 5450, 10855,28167,4254, 15971,9871, 38932,8708, 34340,14681,4118, 31229,13724,33908,5218, 13135,41521,5616, 23229,23228, 25426,36751,32993,33394,31626,32992,20064,569, 23031,28198,34208,15303,1311, 3656, 6345, 12657,2010, 15679,37031,36933,21014,22972,34344,19406,20768,39240,31625, 9781, 32992,38952,37572,39240,39240,26700,30433,18778,37572,2608, 13723,33615,24297,34340,41521,37571,1067, 27266,24296,3911, 9654, 41521,6884, 10081,14718,16578, - 39239,33615,37571,36249,41520,20277,34339,41520,11928,32930,14023,24295,20767,41520,39239,6046, 36249,2047, 26699,29784,39239,18799,2815, 24504,30555,9983, 588, - 5033, 1463, 17929,10854,37571,36249,36406,2239, 3683, 34443,4550, 3324, 37571,32992,12407,37467,38383,13184,33892,13652,15114,4380, 3433, 29783,23431,24294,9043, + 39239,33615,37571,36249,41520,20277,34339,41520,11928,32930,14023,24295,20767,41520,39239,6046, 36249,2047, 26699,29784,39239,18799,2815, 24504,30555,9983, 588, + 5033, 1463, 17929,10854,37571,36249,36406,2239, 3683, 34443,4550, 3324, 37571,32992,12407,37467,38383,13184,33892,13652,15114,4380, 3433, 29783,23431,24294,9043, 7663, 11682,29519,14062,12761,31624,39239,33615,24293,33615,41520,41519,17791,24292,14577,38487,34339,22431,4717, 29964,37570,41519,26604,39238,18777,36321,39238, 7328, 35197,20276,15438,3829, 31623,272, 16624,33457,7662, 20063,16812,41519,39238,12760,16811,2535, 36248,2126, 27289,11398,1289, 4057, 37570,14366,37570,41519, 37570,39238,8858, 37569,10718,23776,31622,729, 41518,31621,35197,11688,24291,31620,2701, 21519,38294,37352,28166,34339,11927,36248,1609, 32833,25449,37235,13950, @@ -19086,25 +19081,25 @@ static const unsigned short Ranks[197839] = 13159,2559, 23360,4456, 41518,12694,22364,41518,41517,9370, 19405,23227,39237,457, 1693, 41517,37569,34338,41517,25425,39237,39237,39237,31619,26698,36248,41517, 41516,41516,39236,24290,39236,261, 12119,2524, 8985, 22396,4424, 21711,33614,21518,39236,14171,5624, 36247,18776,27508,39236,39244,35196,12155,41516,35196,37569, 3064, 31618,12154,5574, 28165,39235,14717,6258, 4778, 14170,8857, 18225,36247,33614,39235,37569,2389, 24289,8707, 12376,5036, 21517,26697,34435,31619,31617,32992, - 12400,2756, 7902, 8856, 8574, 32991,20723,4172, 2686, 27390,3625, 15302,2633, 16810,25858,17790,38542,5719, 32845,14675,31616,28164,27034,16809,14620,275, 4517, + 12400,2756, 7902, 8856, 8574, 32991,20723,4172, 2686, 27390,3625, 15302,2633, 16810,25858,17790,38542,5719, 32845,14675,31616,28164,27034,16809,14620,275, 4517, 28119,10173,5585, 5199, 13651,17155,39235,13183,32991,32991,35196,10216,37061,3843, 39235,9754, 37860,31995,37594,21516,3177, 7902, 26696,41516,3148, 3842, 41515, 39234,39234,41515,34338,26695,31844,3451, 35691,17614,35106,33172,28163,34338,41515,37910,38962,20062,36247,15658,7820, 14022,39234,35196,39234,10393,15437,31615, - 23226,33614,13434,17613,33057,7776, 13182,22354,5331, 34860,41515,12153,8095, 4485, 36247,16273,39233,39233,37568,36246,17154,35195,37568,29781,15071,15070,399, + 23226,33614,13434,17613,33057,7776, 13182,22354,5331, 34860,41515,12153,8095, 4485, 36247,16273,39233,39233,37568,36246,17154,35195,37568,29781,15071,15070,399, 5042, 39233,2078, 34724,7322, 14680,16388,6930, 10409,8414, 13852,35796,33168,7641, 3811, 13389,17789,36246,38847,39128,17153,29505,10529,33624,14679,9255, 31614, 17637,41514,39233,3476, 3701, 25424,704, 9042, 7647, 1557, 33891,39353,33749,21741,33381,31654,32786,38195,34771,23755,951, 37568,16808,33166,35604,18891,35368, 16807,35255,37931,16450,34581,33134,33572,38480,35930,11907,26184,36452,35994,15147,29913,37338,7765, 23195,34775,4335, 8025, 9107, 33201,32391,29542,37421,32571, 12682,24768,20268,37347,9044, 13902,33702,4928, 36033,4510, 6511, 38010,38144,38134,36382,34518,35206,15661,13645,10056,35656,26776,11686,34485,37568,4449, 41514, - 41514,14537,4157, 31259,35717,34295,38430,34885,25412,13539,21597,10550,36312,34060,27510,36612,7631, 11003,35053,26585,20253,20275,21515,19722,11266,41514,5675, - 35195,41513,16923,798, 5037, 16806,30520,7315, 31948,20693,1772, 31536,19238,38665,17788,20834,37968,37567,12759,5943, 24288,15301,18890,17787,29300,681, 7350, + 41514,14537,4157, 31259,35717,34295,38430,34885,25412,13539,21597,10550,36312,34060,27510,36612,7631, 11003,35053,26585,20253,20275,21515,19722,11266,41514,5675, + 35195,41513,16923,798, 5037, 16806,30520,7315, 31948,20693,1772, 31536,19238,38665,17788,20834,37968,37567,12759,5943, 24288,15301,18890,17787,29300,681, 7350, 20274,39389,15364,38474,14868,7830, 2197, 38767,35620,4280, 33784,5120, 36146,34620,17786,37423,36992,14318,4857, 8763, 16805,3540, 21919,2626, 10636,37266,37491, 37737,37830,32118,16004,37285,5412, 12018,10538,19147,38211,22283,36152,16013,27343,4729, 7110, 12375,39016,34905,27409,19938,37512,27608,32991,34528,34632,38853, - 18809,34485,14211,26070,33765,11397,10853,13005,11362,5849, 30319,28289,30408,5492, 10724,35876,27546,17253,27353,35945,1248, 722, 10852,38816,36437,15300,6033, + 18809,34485,14211,26070,33765,11397,10853,13005,11362,5849, 30319,28289,30408,5492, 10724,35876,27546,17253,27353,35945,1248, 722, 10852,38816,36437,15300,6033, 11251,38905,15970,16428,16050,20273,6427, 2447, 7573, 38878,38211,20647,14169,11179,34903,10104,33401,35290,9281, 38424,32878,31228,21379,15348,14585,28764,37115, 3861, 3645, 5058, 20844,34852,2199, 4246, 17785,19992,9300, 14172,24708,27912,23443,2715, 6110, 11024,11467,7254, 18109,5737, 7858, 28554,30352,15363,15598,15113, 16928,15299,18266,11359,8290, 36364,34251,13093,11307,9753, 38998,2376, 37806,20272,8855, 11685,26026,19524,22389,19634,34936,35698,26319,39179,3594, 36299,14580, - 16112,8700, 10533,2349, 3221, 34854,14678,3128, 16753,12393,17784,34094,35607,2356, 15298,13033,29780,3149, 26361,41513,3065, 1259, 4694, 8548, 7703, 278, 4469, + 16112,8700, 10533,2349, 3221, 34854,14678,3128, 16753,12393,17784,34094,35607,2356, 15298,13033,29780,3149, 26361,41513,3065, 1259, 4694, 8548, 7703, 278, 4469, 26993,32450,4638, 533, 1489, 2752, 35874,3759, 8254, 1953, 6178, 35188,16804,31692,39232,18889,6572, 12374,37434,14168,10494,18887,24521,26275,16571,24468,41513, - 61, 33881,20766,37567,33614,37567,37567,34338,30191,37801,12633,41513,41512,23225,1178, 27732,29061,20271,18888,6446, 5015, 2278, 29638,539, 14544,18978,9752, + 61, 33881,20766,37567,33614,37567,37567,34338,30191,37801,12633,41513,41512,23225,1178, 27732,29061,20271,18888,6446, 5015, 2278, 29638,539, 14544,18978,9752, 4315, 24462,12028,2803, 277, 23083,17675,20270,26769,664, 29634,33085,17333,26505,21880,17583,19636,31475,4703, 22335,1295, 20102,15025,8024, 17799,16856,20073, 5162, 7865, 13158,35195,15466,3692, 8681, 38951,37566,34797,33613,36246,41512,8802, 22334,39232,931, 845, 22333,18224,37247,24287,36246,34337,5615, 37736,41512, 20765,25423,37566,34256,25465,31673,24309,29034,2216, 33578,17612,35195,34337,33971,28162,12027,33613,28287,195, 2463, 34179,4603, 39232,6148, 41512,16803,34337, @@ -19112,24 +19107,24 @@ static const unsigned short Ranks[197839] = 5976, 5161, 15969,30984,15162,2492, 4903, 28107,5965, 26103,11369,10172,8023, 6431, 16802,4277, 11185,36739,5743, 26252,34520,26827,36155,34915,29779,14925,24016, 7337, 25094,15651,38784,34957,14167,23782,41511,35194,17782,33613,36245,968, 4182, 29740,12787,15067,10178,15297,25696,20269,16702,34405,15968,22645,17151,13650, 14135,6668, 17781,35545,20764,22300,36245,33613,11266,1150, 1258, 1733, 2257, 3404, 11817,1900, 37566,26693,1377, 36730,35194,28161,37565,32990,37373,26555,37565, - 37365,17150,5217, 36245,14384,38135,38764,36245,14021,35708,8735, 6316, 1699, 9751, 39231,9048, 34956,3571, 35497,20061,15967,37515,13812,30472,900, 14472,2511, + 37365,17150,5217, 36245,14384,38135,38764,36245,14021,35708,8735, 6316, 1699, 9751, 39231,9048, 34956,3571, 35497,20061,15967,37515,13812,30472,900, 14472,2511, 16179,2880, 6198, 1687, 4534, 6101, 7498, 36777,36179,10408,15296,2139, 14365,24970,35716,23748,2215, 29635,32346,12833,37466,15067,7747, 37565,39176,22248,26148, 35194,38895,33612,28293,18887,39297,25036,33349,34043,39084,33612,39231,17406,36478,25960,37246,39230,39230,7709, 17780,26805,18150,10926,25256,38711,39230,37565, 23751,32990,36244,12738,41511,28160,3330, 37027,41511,37564,18890,15966,9165, 33355,10951,29655,34182,39213,35194,6670, 15083,34337,20763,41510,41510,41510,41510, 31613,26692,10407,8573, 39230,15356,14166,41509,22332,21514,34611,20268,37564,6100, 100, 35435,25422,39229,9192, 36244,33145,34233,10300,35083,27216,35938,21513, 29778,32195,39229,2068, 24738,7750, 29540,41509,34631,14894,26691,19404,14676,36244,14151,34336,30896,36954,33612,17149,37564,2736, 29936,33612,33628,36003,18223, 39229,37564,7181, 21610,26690,33611,34482,35951,39229,14675,34336,23224,27509,35193,32990,13265,35979,41509,41509,14256,24285,36244,39228,34845,34336,3329, 37563, - 18478,38438,37588,37563,11926,9129, 11736,37563,35193,11190,16801,15066,29362,34742,14674,7992, 14582,20832,31612,2360, 12026,6328, 10601,69, 15060,17381,9071, + 18478,38438,37588,37563,11926,9129, 11736,37563,35193,11190,16801,15066,29362,34742,14674,7992, 14582,20832,31612,2360, 12026,6328, 10601,69, 15060,17381,9071, 28537,21494,18752,12784,12638,19555,28261,32921,1981, 14720,14217,8686, 25187,13850,13228,27585,5328, 33035,21189,4145, 14716,20267,36152,11925,16262,32990,28752, - 34336,32966,3841, 41508,36243,443, 32989,32041,18472,26689,9041, 8170, 29777,4960, 9653, 18643,1992, 39369,9556, 16261,3955, 4680, 23585,9566, 7463, 12909,1308, + 34336,32966,3841, 41508,36243,443, 32989,32041,18472,26689,9041, 8170, 29777,4960, 9653, 18643,1992, 39369,9556, 16261,3955, 4680, 23585,9566, 7463, 12909,1308, 19403,35193,9861, 18886,14165,38401,3048, 41508,17779,5443, 18774,41508,39228,7661, 37563,39228,30047,11077,34219,960, 15965,21970,32871,28848,33580,27718,16800, 7702, 8284, 35387,13649,13181,20266,24966,16961,35714,32825,13433,15730,6257, 9041, 34335,38944,1067, 22259,23405,33304,24818,39045,34656,33377,930, 25687,22661, 5462, 6153, 32989,36243,33611,16260,28159,25421,28973,7679, 5142, 24284,13722,28158,29776,4226, 39216,37562,18385,36418,39048,12032,37562,39228,24646,7901, 38863, 9013, 18885,13613,25548,34335,19402,28173,26688,33840,39227,4251, 14590,2603, 3282, 31408,12758,34335,808, 31611,16946,27582,37715,19543,12779,5237, 22999,41508, 11076,13048,10629,28897,4121, 37562,11158,19853,7300, 37695,18884,5052, 36796,16673,35143,34800,22960,3700, 11091,37649,41507,18883,35160,19930,1143, 4187, 12239, 27164,21023,14188,38837,19553,3036, 2568, 21121,18713,17008,24499,31679,14349,1293, 10182,31990,13648,8374, 8428, 27553,15436,726, 22339,12373,20168,2802, 28212, - 46, 5588, 32825,28161,18882,12053,15295,34335,35736,20265,13654,32705,36099,7030, 15964,37776,12496,41507,33611,41507,28481,26610,39227,39227,34334,35193,6075, - 29959,32934,26616,31492,565, 1925, 4149, 1237, 13255,31723,30365,20842,11334,13087,31603,23234,25179,3738, 37005,16302,39025,11226,32850,13372,25085,30243,7331, + 46, 5588, 32825,28161,18882,12053,15295,34335,35736,20265,13654,32705,36099,7030, 15964,37776,12496,41507,33611,41507,28481,26610,39227,39227,34334,35193,6075, + 29959,32934,26616,31492,565, 1925, 4149, 1237, 13255,31723,30365,20842,11334,13087,31603,23234,25179,3738, 37005,16302,39025,11226,32850,13372,25085,30243,7331, 7775, 10924,37442,29550,16107,34569,21969,27151,28462,39239,37554,36823,38599,15459,19689,37302,20264,37634,39181,16799,16339,25012,29641,18938,25244,32166,27538, 28527,20976,20263,28069,34693,38008,28394,32989,15615,12468,17778,25756,32935,12739,23958,20790,22960,10840,13070,32579,18881,31650,35361,9513, 20198,4750, 14372, 36908,35995,18880,1109, 20625,37724,20358,19934,29741,38273,14753,11864,34445,38845,12654,27163,37773,4917, 9369, 34960,15963,39021,9747, 33754,24600,12743,13121, @@ -19137,14 +19132,14 @@ static const unsigned short Ranks[197839] = 15633,16418,17001,24005,4646, 8621, 33647,19576,26706,15888,38345,31704,7109, 15962,26333,4120, 35192,25420,4989, 5651, 22309,32773,35964,30790,39269,21682,14673, 36927,13647,16436,8300, 33154,27364,6853, 35261,32174,38768,35859,14277,11583,5893, 18776,26498,18070,2435, 2066, 11130,33352,4119, 11396,6366, 34533,20262,38850, 32897,10099,37630,35114,30416,28186,34211,21344,15840,34559,31724,36812,16477,18879,6365, 4982, 19316,8498, 3803, 4035, 8039, 10188,12372,23274,33929,36243,30830, - 33611,17777,34685,23223,2925, 18878,28448,12229,34035,12025,36243,4650, 9191, 9036, 20764,6937, 21254,8657, 34392,33610,2837, 6238, 7050, 2189, 1268, 6339, 259, + 33611,17777,34685,23223,2925, 18878,28448,12229,34035,12025,36243,4650, 9191, 9036, 20764,6937, 21254,8657, 34392,33610,2837, 6238, 7050, 2189, 1268, 6339, 259, 14314,768, 3430, 2086, 1363, 2199, 2205, 587, 258, 2673, 33593,11127,18877,20261,7026, 5962, 27262,10617,5693, 33754,16191,36056,5507, 15272,36010,24182,24988, 27376,22799,20260,7830, 1105, 14164,16849,33475,35547,29775,20259,38860,31610,3275, 15898,15396,17148,28197,20399,26639,37562,36242,11926,23222,41507,5141, 29326, 21803,37096,38848,29774,83, 20258,1747, 38827,30188,31713,21151,41506,11767,15574,36848,15069,25242,2241, 793, 6413, 3562, 21146,24878,28386,17657,13646,20257, 21399,25264,18876,436, 6554, 25398,11833,38109,10605,1370, 12725,23786,7143, 6301, 18713,2147, 5198, 11484,1056, 15961,4058, 8854, 14163,41506,33048,41506,15756, - 29773,39113,17611,22559,34649,34334,21572,9351, 23128,36333,18222,33168,34318,39227,8783, 28157,12024,28156,32989,41506,20256,20627,34884,10873,30131,37056,1456, + 29773,39113,17611,22559,34649,34334,21572,9351, 23128,36333,18222,33168,34318,39227,8783, 28157,12024,28156,32989,41506,20256,20627,34884,10873,30131,37056,1456, 28515,7979, 41505,34334,13266,5825, 26105,9742, 5607, 25243,20762,41505,529, 687, 1896, 3091, 5236, 36242,39226,4058, 7579, 14191,12039,27245,30878,23221,24283, - 27214,2754, 3887, 9565, 22420,39307,25288,12908,22331,3437, 39226,29790,5674, 34885,5817, 2043, 1171, 5666, 7857, 22042,25053,36538,35551,34334,1948, 1588, 5778, + 27214,2754, 3887, 9565, 22420,39307,25288,12908,22331,3437, 39226,29790,5674, 34885,5817, 2043, 1171, 5666, 7857, 22042,25053,36538,35551,34334,1948, 1588, 5778, 8220, 6193, 13601,4342, 41505,24790,37835,2835, 36951,20255,36532,1277, 1701, 4950, 2125, 4136, 3185, 38195,37561,12296,33610,41505,20669,39316,8, 4901, 25447, 574, 18445,41504,1868, 814, 1517, 572, 20849,19812,41504,12231,6798, 34215,20254,4193, 9194, 34859,30376,38168,13204,37561,342, 18678,6601, 35258,36089,41504, 35192,36242,38483,39226,39226,5041, 18875,32989,39225,39401,37561,36242,37561,1106, 2679, 11395,2448, 7774, 17130,2405, 12371,13180,35480,4679, 33176,2961, 15349, @@ -19153,22 +19148,22 @@ static const unsigned short Ranks[197839] = 36241,28154,5573, 9784, 15768,34999,39225,22600,41502,37560,35192,3063, 10531,31609,41502,6542, 5216, 256, 37560,10616,12756,30944,35191,7274, 16897,41501,37872, 38552,37505,18873,23365,20253,35943,23173,41501,32990,21216,24508,29772,18221,41501,34000,1074, 1983, 1231, 153, 16190,34639,15155,11613,34684,14782,783, 14613, 3186, 1747, 30651,16866,19866,32740,15135,22620,507, 14563,1598, 22494,13607,41501,35396,41500,15637,34333,34029,41500,35191,34521,33741,31608,33610,41500,35191, - 28153,26413,31935,7942, 27988,38081,12406,20252,32491,20251,31607,41500,39224,33017,14203,32984,36241,31631,20378,36240,21479,25050,7281, 21045,20688,36717,3236, + 28153,26413,31935,7942, 27988,38081,12406,20252,32491,20251,31607,41500,39224,33017,14203,32984,36241,31631,20378,36240,21479,25050,7281, 21045,20688,36717,3236, 15504,23478,22409,1924, 9690, 17776,41499,466, 10572,37560,30318,38463,33943,37559,31606,31988,37559,37687,39224,3109, 41499,26679,37559,31330,38078,8427, 41499, - 41499,35705,16321,16443,35958,12370,18220,33099,17775,17774,31605,15845,36295,39224,38493,2345, 33418,21512,24282,41498,15960,37559,34333,13889,31604,37558,5902, + 41499,35705,16321,16443,35958,12370,18220,33099,17775,17774,31605,15845,36295,39224,38493,2345, 33418,21512,24282,41498,15960,37559,34333,13889,31604,37558,5902, 882, 38131,41498,34387,22330,37558,41498,38344,26977,32988,37558,1396, 4100, 9368, 8826, 24850,6074, 6868, 37893,27483,19467,36888,41498,3711, 5051, 15346,33778, - 7876, 7271, 14368,1234, 8706, 31603,32893,41497,16259,36240,41497,34333,29771,22329,6934, 8439, 34333,35191,39224,10709,3334, 29770,9162, 1955, 8094, 20901,7273, + 7876, 7271, 14368,1234, 8706, 31603,32893,41497,16259,36240,41497,34333,29771,22329,6934, 8439, 34333,35191,39224,10709,3334, 29770,9162, 1955, 8094, 20901,7273, 34332,5657, 37558,349, 23587,34607,33610,36240,41497,39223,22328,39223,39223,24281,36211,39223,5584, 28914,19505,28152,11259,10406,16857,37733,29383,37568,39222, 39222,38787,18219,6424, 31602,9564, 33746,9956, 22362,39222,35471,23220,33866,39222,8438, 19166,15067,15959,39221,19401,11924,12405,32988,1120, 37557,37557,33609, 41497,36240,23219,24280,25418,41496,37557,35190,35875,39221,10708,34624,35383,16101,34437,4707, 39406,37268,7072, 14162,39221,22811,37731,34396,35909,34994,34123, 39221,41496,37557,37556,37556,20690,16798,14019,34332,37556,6711, 35510,10405,14672,13720,39220,11394,10215,28151,27534,11002,35190,32988,32988,550, 33609,35190, 12404,32934,5406, 3910, 22327,36239,39220,20060,5925, 1735, 15958,1738, 5583, 41496,11684,3614, 9520, 41496,15294,8022, 6784, 14161,13645,17773,5804, 3919, 39220, 34332,23218,41495,29769,20760,9830, 39220,1289, 22125,29723,36239,9979, 1192, 26686,34316,34332,29768,24515,35190,34331,41495,34331,32987,568, 8328, 2566, 10725, - 33956,5340, 6133, 12369,39219,32987,34331,442, 2850, 19366,9682, 26969,27526,14417,8642, 31662,16797,22685,32787,10615,20495,31450,34077,6073, 3453, 16050,9861, + 33956,5340, 6133, 12369,39219,32987,34331,442, 2850, 19366,9682, 26969,27526,14417,8642, 31662,16797,22685,32787,10615,20495,31450,34077,6073, 3453, 16050,9861, 15937,530, 9220, 20426,675, 12138,31344,27894,37556,13432,21511,18872,14018,3642, 4075, 23217,15875,17470,972, 26441,20974,1238, 16689,22421,27841,19211,36239, 892, 19422,35189,34331,31601,39219,39219,41495,34330,18772,28150,32987,6682, 16796,39219,41495,2414, 12755,4706, 38349,14160,41494,18871,25417,41494,34330,33609, 37555,26685,9012, 1447, 32987,39218,36239,31600,3954, 41494,29767,12368,10850,17772,36238,31034,14076,37555,36238,37555,6045, 28013,31599,36238,31598,28149,19400, - 7901, 31597,14159,37555,41494,35189,11477,13431,33099,37771,34317,37400,41493,31596,32775,31595,41493,41493,34330,11437,37554,1173, 24671,9645, 13691,35665,6708, + 7901, 31597,14159,37555,41494,35189,11477,13431,33099,37771,34317,37400,41493,31596,32775,31595,41493,41493,34330,11437,37554,1173, 24671,9645, 13691,35665,6708, 14671,10890,5901, 11476,32986,36238,14363,35189,11683,41493,39218,8883, 17771,39278,1701, 32913,33609,2342, 12952,7104, 11393,778, 13644,10171,7272, 18870,25099, 20171,19399,5215, 21510,4755, 17770,11475,22326,7493, 7271, 41492,24279,9011, 41492,9519, 7819, 1659, 31728,38323,41492,955, 22345,1838, 13179,3851, 9652, 41492, 4157, 5942, 4730, 34330,7085, 7900, 5407, 8853, 9040, 17769,41491,29805,37554,10170,9750, 37808,15293,37554,11126,2894, 1566, 22673,22388,39218,31594,28148,20759, @@ -19176,9 +19171,9 @@ static const unsigned short Ranks[197839] = 11923,31593,5582, 41491,32986,39218,10848,18868,6197, 15435,15291,35188,17767,13178,5659, 3840, 11922,41491,35188,2299, 13247,25810,570, 794, 37404,2857, 28830, 18203,32003,35069,2058, 2552, 29766,30412,7188, 20758,25416,36237,11840,14337,37833,35188,34329,25653,20757,653, 34246,1534, 39217,21562,8852, 34406,36237,11704, 34330,13643,3710, 39217,14992,10075,27596,37554,33608,292, 8832, 20073,7084, 15844,6916, 34714,41490,34329,17454,728, 14017,41490,18840,32986,17207,37536,31329, - 36454,19117,37371,6631, 8125, 13177,33871,34819,37473,41490,38391,34052,13430,11474,14532,10208,33081,36267,24278,32986,22325,4834, 351, 14715,33727,16769,120, + 36454,19117,37371,6631, 8125, 13177,33871,34819,37473,41490,38391,34052,13430,11474,14532,10208,33081,36267,24278,32986,22325,4834, 351, 14715,33727,16769,120, 13374,31471,36236,2840, 35188,26684,16683,36236,22049,23698,37987,35539,19858,10169,15476,2229, 4509, 13399,38471,23693,29020,24603,24713,7373, 19107,38264,11146, - 13876,10997,13180,37105,3371, 32119,31612,19398,28376,41490,36170,34329,6686, 8779, 21434,18598,5283, 37553,32835,8782, 38345,7818, 39217,17907,3899, 32842,9039, + 13876,10997,13180,37105,3371, 32119,31612,19398,28376,41490,36170,34329,6686, 8779, 21434,18598,5283, 37553,32835,8782, 38345,7818, 39217,17907,3899, 32842,9039, 37390,36888,30471,6072, 27845,25884,15085,37476,2343, 31867,38023,6948, 33031,9891, 2149, 36204,20540,16629,7594, 33673,34329,6196, 13642,2194, 39322,4386, 11097, 39217,37553,38390,13847,18867,12182,37708,5760, 35229,18866,39390,34921,31078,36694,18865,34276,19232,11411,13641,8508, 33472,12200,37810,33112,20207,33786,38082, 11639,2709, 24939,34807,33290,27198,29154,7899, 36236,26919,20656,36312,27283,6219, 4613, 22832,8302, 2977, 17412,18864,41489,33561,29620,4559, 30013,37924,32854, @@ -19190,7 +19185,7 @@ static const unsigned short Ranks[197839] = 30537,38373,37552,25414,36234,17146,41487,39215,35187,39214,37552,33362,34880,20249,21573,22876,33899,37551,36640,39214,36074,41487,34328,37551,41487,36234,41486, 9780, 10899,41486,34328,20059,39214,28146,34293,41486,41486,21628,39214,36234,39213,39213,32985,41485,41485,32984,35187,33867,36817,31591,29765,22324,41485,12023, 35323,39213,37551,39213,37551,41485,39212,35187,39212,39212,35186,39212,31590,39211,35186,37550,41484,37550,39211,38336,29764,33607,4386, 37550,25413,31589,33607, - 34378,41484,39211,39211,39210,41484,36233,22830,36429,16795,34832,16835,11411,30718,30048,12125,10964,16547,13266,33053,30355,13987,25412,39210,28369,31771,3600, + 34378,41484,39211,39211,39210,41484,36233,22830,36429,16795,34832,16835,11411,30718,30048,12125,10964,16547,13266,33053,30355,13987,25412,39210,28369,31771,3600, 36826,37550,26228,32984,31588,22559,35186,9368, 12403,26664,34734,35684,4685, 36233,718, 41484,4448, 39210,33809,33607,2252, 28577,13863,32984,3317, 11011,38344, 39210,39209,2264, 37549,35186,33607,38931,41483,24276,37549,35185,471, 20248,17570,39209,35185,35094,35329,610, 32709,24505,17174,24252,17766,13640,18663,32828, 24340,20058,2342, 18862,5927, 20002,20247,6582, 26659,3350, 4808, 20755,37549,18218,28145,10410,21068,1619, 33606,37549,24275,14044,38289,10707,32290,4451, 26021, @@ -19205,21 +19200,21 @@ static const unsigned short Ranks[197839] = 27225,19395,6195, 9705, 19088,18858,38767,18236,4272, 34727,17764,25175,26911,3544, 19501,10378,20390,11682,5816, 31586,37547,37461,36917,6431, 5614, 15748,21380, 14668,2721, 34408,35921,23404,26705,5071, 34975,41477,23215,21000,18217,35966,2195, 6119, 36231,37883,32625,18722,36261,13753,28689,37665,14765,8493, 33364,37365, 27469,12319,3543, 41477,16368,36231,10079,33344,15290,5803, 33604,41477,32983,3699, 36231,33210,8174, 39175,37412,24484,36371,32073,33715,35139,9309, 33606,34326, - 37131,37867,27290,21088,71, 12515,27271,38242,30388,15726,17763,38460,30378,10951,34326,33765,18585,27533,37458,22323,37547,433, 39206,22972,7660, 34363,5339, + 37131,37867,27290,21088,71, 12515,27271,38242,30388,15726,17763,38460,30378,10951,34326,33765,18585,27533,37458,22323,37547,433, 39206,22972,7660, 34363,5339, 5454, 11125,9038, 10168,34421,538, 13013,37547,19394,15953,31657,23214,21407,15289,39206,2999, 309, 26641,35423,2241, 38524,30802,34941,34248,36184,22239,33295, 28884,32176,9569, 22272,37785,39286,41477,33606,26772,38596,32982,8437, 11264,39206,41476,23213,38663,8882, 41476,30220,35184,31245,7239, 35183,2261, 1561, 39206, - 3481, 39205,9748, 33653,36369,17144,14667,13175,2247, 31588,1453, 2287, 41476,15288,3755, 21509,2927, 34545,31585,8498, 39264,34326,30758,1625, 7083, 16930,5851, + 3481, 39205,9748, 33653,36369,17144,14667,13175,2247, 31588,1453, 2287, 41476,15288,3755, 21509,2927, 34545,31585,8498, 39264,34326,30758,1625, 7083, 16930,5851, 41476,15378,41475,36231,2384, 18502,2967, 34637,2681, 39205,111, 27269,9563, 33280,484, 6571, 34001,10167,10847,1576, 159, 8436, 1559, 37878,35690,38043,21961, 10404,1495, 41475,34326,15077,39205,27460,11085,9779, 36407,20754,35183,27162,29393,3909, 4034, 35719,34325,4416, 41475,805, 29365,34486,16299,31568,25408,14552, 30798,8123, 29844,22322,4304, 20753,15952,21441,37547,7094, 12020,23140,10214,12402,29763,8028, 14775,38609,3310, 10986,31584,24581,13503,21508,35204,37527,38453, 41475,25407,7161, 14252,11263,7371, 10510,33972,32233,22910,28200,41474,34550,35183,38538,2414, 3125, 25444,38846,35202,41474,22867,2157, 11124,18857,35259,17578, 37546,36912,1725, 226, 32886,37685,37546,34277,24068,37062,35093,35183,21284,20752,1888, 13567,3038, 38199,34575,37546,32982,38032,35182,25277,9181, 35571,41474, - 15287,26221,3124, 36230,25406,41474,28144,41473,25405,37546,36230,7270, 15951,2651, 740, 2326, 1128, 20245,897, 17507,5974, 34454,39205,21507,2606, 33679,6256, - 464, 37380,17211,36942,2287, 1899, 545, 1833, 1885, 17152,14503,33278,29762,20079,34210,2720, 29672,41473,36525,32982,26683,16517,2263, 13429,25404,3024, 782, + 15287,26221,3124, 36230,25406,41474,28144,41473,25405,37546,36230,7270, 15951,2651, 740, 2326, 1128, 20245,897, 17507,5974, 34454,39205,21507,2606, 33679,6256, + 464, 37380,17211,36942,2287, 1899, 545, 1833, 1885, 17152,14503,33278,29762,20079,34210,2720, 29672,41473,36525,32982,26683,16517,2263, 13429,25404,3024, 782, 480, 39204,34325,38172,75, 5950, 20902,33605,38555,3412, 26539,5667, 10403,14473,5975, 6870, 20148,28674,29083,14711,12754,9954, 36230,857, 32982,34658,35348, - 31187,37545,9447, 10213,39095,11609,16453,2177, 1114, 23212,22722,36129,27745,31079,38394,3011, 24869,28480,26682,39204,24632,19393,33078,37257,38834,41473,6958, + 31187,37545,9447, 10213,39095,11609,16453,2177, 1114, 23212,22722,36129,27745,31079,38394,3011, 24869,28480,26682,39204,24632,19393,33078,37257,38834,41473,6958, 35447,39204,36816,37350,29146,3698, 34244,41473,3123, 35381,19369,8914, 38044,34325,2925, 28307,39204,24273,36230,1587, 25403,39367,38314,1780, 33599,41472,38558, - 14623,41472,41472,36040,1690, 25402,28143,9715, 21785,35226,36818,34588,6807, 12177,41472,37545,9366, 15759,35864,37405,9562, 5304, 20244,20088,18856,41471,2767, + 14623,41472,41472,36040,1690, 25402,28143,9715, 21785,35226,36818,34588,6807, 12177,41472,37545,9366, 15759,35864,37405,9562, 5304, 20244,20088,18856,41471,2767, 5642, 24251,18219,25895,36874,37545,37545,36229,35421,24861,7470, 25401,31433,27689,20243,41471,22582,734, 34325,17610,1623, 35182,29761,37544,17762,766, 28955, 14666,1924, 30112,27167,19547,1721, 28640,33225,32512,39203,7462, 1344, 10895,4541, 37544,41471,38389,13639,20508,31613,16872,2482, 9128, 28142,41471,30588,13528, 11687,2214, 36963,33605,39203,18329,18855,10377,17761,36481,23313,12401,35559,559, 20938,33762,34451,19215,28141,29996,38039,36229,31272,9953, 23028,41470,35607, @@ -19229,27 +19224,27 @@ static const unsigned short Ranks[197839] = 14664,34127,36902,5755, 13717,18256,3660, 35182,17143,38708,31582,3867, 16262,37544,34324,33604,8546, 31581,7185, 39200,14663,25561,10614,12152,35199,27646,41469, 6570, 20240,201, 34324,36229,23660,2040, 39357,14662,5442, 37184,26680,20912,13610,35182,6099, 6569, 38185,9127, 10078,9483, 11123,18853,35933,11776,39200,37544, 16617,15660,39200,24259,21789,41469,28139,20105,15843,36285,34716,39200,23155,39199,41468,7998, 33604,20239,37501,28138,7469, 5710, 14661,37543,1566, 14881,19392, - 41468,12753,36918,36930,30137,22961,41468,3472, 35772,28203,20509,24563,836, 14297,3405, 5461, 2824, 34323,39223,22841,33245,1346, 12494,743, 3023, 37217,8178, + 41468,12753,36918,36930,30137,22961,41468,3472, 35772,28203,20509,24563,836, 14297,3405, 5461, 2824, 34323,39223,22841,33245,1346, 12494,743, 3023, 37217,8178, 9003, 36554,32791,34331,21289,10077,15118,38649,34991,34323,17293,37543,35181,16793,12907,31661,34323,18705,24036,11262,36229,41468,34323,18216,9747, 41467,41467, 13592,39199,12021,12363,36576,41467,35737,23032,20629,15065,13916,36339,36228,8426, 12362,37999,22321,7729, 5434, 32981,31482,29840,33604,34300,4249, 3022, 14157, - 16341,39199,14015,4959, 36228,37543,36228,15286,28137,41467,39199,37543,37542,39198,24272,14361,30253,36312,30920,1809, 31580,17337,38060,39198,29589,14685,5337, - 20238,12652,32981,25399,33604,9471, 35795,12752,36470,33514,29759,6423, 20237,7578, 41466,13157,11965,37093,41466,41466,34322,31537,3025, 9518, 35181,15842,1005, - 1100, 23253,13638,37542,36228,16931,21506,36809,33603,36227,15950,37788,13428,436, 5211, 31441,25727,32006,2680, 34322,3122, 41466,29758,9175, 39198,2839, 1563, - 5151, 7997, 41465,22982,15949,34087,3173, 28136,41465,11468,4290, 7232, 20330,41465,21578,39198,10846,13637,37542,14479,18770,35181,24271,24270,11686,31579,989, - 20236,3828, 30430,7013, 15948,11122,35754,2672, 41465,15947,5924, 37463,39197,3809, 9037, 8536, 36098,12789,10524,4123, 35181,30419,11998,21219,31602,34875,316, + 16341,39199,14015,4959, 36228,37543,36228,15286,28137,41467,39199,37543,37542,39198,24272,14361,30253,36312,30920,1809, 31580,17337,38060,39198,29589,14685,5337, + 20238,12652,32981,25399,33604,9471, 35795,12752,36470,33514,29759,6423, 20237,7578, 41466,13157,11965,37093,41466,41466,34322,31537,3025, 9518, 35181,15842,1005, + 1100, 23253,13638,37542,36228,16931,21506,36809,33603,36227,15950,37788,13428,436, 5211, 31441,25727,32006,2680, 34322,3122, 41466,29758,9175, 39198,2839, 1563, + 5151, 7997, 41465,22982,15949,34087,3173, 28136,41465,11468,4290, 7232, 20330,41465,21578,39198,10846,13637,37542,14479,18770,35181,24271,24270,11686,31579,989, + 20236,3828, 30430,7013, 15948,11122,35754,2672, 41465,15947,5924, 37463,39197,3809, 9037, 8536, 36098,12789,10524,4123, 35181,30419,11998,21219,31602,34875,316, 41464,17609,8028, 30140,16400,18253,39197,37542,38377,41464,15841,30066,10732,1176, 22649,34322,6768, 32774,35180,13156,39197,11075,41464,31430,18852,15476,16792, - 38385,17724,35440,4687, 39197,35180,26679,38691,41464,33476,36227,35438,36227,29151,13636,17760,17759,37541,31578,37555,36227,14660,37574,28135,819, 22883,6710, + 38385,17724,35440,4687, 39197,35180,26679,38691,41464,33476,36227,35438,36227,29151,13636,17760,17759,37541,31578,37555,36227,14660,37574,28135,819, 22883,6710, 25790,5101, 41463,39196,924, 15015,1611, 30141,7788, 12361,41463,33603,36226,12151,15840,9517, 33603,36226,20751,15973,19748,23211,33798,1149, 13427,41463,10530, 36226,37216,37261,9219, 14659,6568, 9253, 17546,21265,3697, 34111,24705,21462,32981,38911,33248,35616,36226,36354,663, 22018,34322,41463,23210,28134,38495,17758, 39196,41462,36752,24747,37541,41462,32981,41462,35180,2560, 6484, 41462,39352,22946,37541,28133,37081,25398,15064,41461,6098, 5639, 37541,35404,22320,20750,17807, 39196,12751,37540,31577,17911,36225,39196,41461,37540,33559,1063, 1422, 37653,1577, 9036, 37791,34461,22227,21505,3542, 11878,13716,2184, 31559,1455, 41461,36225, - 1074, 39374,8035, 14676,5236, 12736,2621, 2431, 17757,33150,16791,20235,34638,33346,13174,9277, 24645,25826,3591, 9568, 8581, 35838,37507,36235,29040,4393, 9058, + 1074, 39374,8035, 14676,5236, 12736,2621, 2431, 17757,33150,16791,20235,34638,33346,13174,9277, 24645,25826,3591, 9568, 8581, 35838,37507,36235,29040,4393, 9058, 6642, 37475,35924,38534,31576,41461,24269,39195,39100,39195,41460,18517,6311, 34321,10, 22219,2542, 32683,26303,10295,12238,31558,26354,25726,19508,32839,19386, 35202,38194,39195,38887,3696, 39195,37540,33603,36225,35140,15739,39390,28237,18411,35385,9938, 31626,33111,35180,27706,1410, 15962,2456, 5710, 37540,22236,17143, 24186,32261,12081,18963,23010,8188, 6188, 29362,13876,18455,4021, 12616,32817,15568,18317,36335,34353,23004,8020, 9376, 37539,19049,29373,34353,32843,27669,31472, 25265,37179,37385,19856,1931, 3203, 877, 20701,9014, 37539,947, 11893,910, 7840, 32785,1527, 4123, 32980,1120, 4162, 37539,15839,22306,11046,28132,23209,24039, 26678,41460,20056,1073, 37539,35179,35379,16968,41460,3176, 2119, 37341,32980,31575,74, 15756,31021,4224, 17142,8974, 27111,4373, 5252, 14603,27009,389, 21907, - 16372,8725, 25928,37538,17498,6991, 32980,1354, 14558,35579,25397,13173,25784,15946,2659, 1763, 13635,14156,17608,3709, 9035, 14271,6703, 32860,30855,3452, 6541, + 16372,8725, 25928,37538,17498,6991, 32980,1354, 14558,35579,25397,13173,25784,15946,2659, 1763, 13635,14156,17608,3709, 9035, 14271,6703, 32860,30855,3452, 6541, 14658,18851,18215,20234,26051,15070,31574,35709,36734,39407,6380, 37538,37538,37538,39194,39194,38399,22319,35179,11685,28906,14375,41460,2305, 29237,36225,41459, 30026,22297,38923,13708,23844,32951,24740,32917,15673,25512,1059, 12360,6256, 1825, 29227,7577, 7714, 12810,1890, 27503,24755,1830, 1579, 20845,1035, 16989,36718, 35902,14584,3768, 12020,2168, 23182,21899,500, 13634,37942,21374,36224,18155,37239,32570,36423,24341,34507,38441,33427,37219,36287,26677,10916,19321,20233,41459, @@ -19259,33 +19254,33 @@ static const unsigned short Ranks[197839] = 12543,8092, 28131,15284,37537,35178,37536,10888,37486,20859,11392,3620, 37536,34411,20749,39193,38150,29756,37812,41458,39193,33602,24377,21557,33212,37964,33602, 33759,41458,4975, 25396,33826,39372,37083,7361, 22396,29827,26676,23208,29755,34321,33602,39193,39192,29754,31573,34091,37615,38655,36175,41458,3471, 41458,39192, 15433,37536,37536,33601,11494,5522, 41457,23293,3504, 36224,22108,29526,3755, 33601,39192,22318,36783,33461,25395,37008,35178,14315,37535,39207,37379,2273, 22067, - 31050,34155,41457,39346,36668,22317,4283, 29753,41457,8662, 38040,32541,36220,41457,39192,33974,11681,10248,9364, 37405,20931,36285,14104,35638,37646,35178,6350, + 31050,34155,41457,39346,36668,22317,4283, 29753,41457,8662, 38040,32541,36220,41457,39192,33974,11681,10248,9364, 37405,20931,36285,14104,35638,37646,35178,6350, 31875,9052, 4046, 23485,35774,37063,29537,34938,1784, 32140,22915,25115,18116,22411,35402,39191,4953, 10166,30179,3602, 33591,29121,28133,20381,38140,15283,18849, - 15447,34898,33776,11959,15945,15282,34345,33564,14155,35695,14911,38539,27291,8425, 17891,34402,34570,31572,36022,16496,18848,36199,15281,3567, 1991, 15944,9746, + 15447,34898,33776,11959,15945,15282,34345,33564,14155,35695,14911,38539,27291,8425, 17891,34402,34570,31572,36022,16496,18848,36199,15281,3567, 1991, 15944,9746, 13098,15943,22686,12365,18847,27807,37932,34767,29545,37930,35755,14657,41456,6071, 17607,27352,4678, 9249, 16918,32914,38378,27514,14656,29750,33235,37698,14425, 33841,4741, 12116,37065,256, 12443,37923,9609, 35504,23578,17755,24268,16688,7555, 41456,36959,41456,32389,60, 15280,37702,31571,37535,41456,35177,4879, 32980, 14154,6422, 3203, 34251,9778, 2976, 272, 39191,35177,10076,20231,15785,5521, 862, 15942,29777,19145,30027,38713,6567, 3470, 39191,37625,36530,12821,36908,38104, - 34380,35389,35487,34601,37535,19102,16679,36935,37535,4590, 33233,23417,25755,29924,27153,33921,41455,32185,21504,37557,33601,37439,30448,2650, 34140,36076,3469, - 38761,19586,32979,14014,37650,38346,41455,32979,39191,2237, 21780,20834,28893,3498, 10144,33863,14589,21503,32911,41455,2407, 25293,9374, 10165,30712,9192, 5591, - 1476, 2572, 8572, 33423,36051,12750,1538, 15692,28130,33878,15321,38383,3328, 20230,3259, 29503,18246,8839, 14249,759, 23249,12400,32973,3195, 20748,2017, 7897, + 34380,35389,35487,34601,37535,19102,16679,36935,37535,4590, 33233,23417,25755,29924,27153,33921,41455,32185,21504,37557,33601,37439,30448,2650, 34140,36076,3469, + 38761,19586,32979,14014,37650,38346,41455,32979,39191,2237, 21780,20834,28893,3498, 10144,33863,14589,21503,32911,41455,2407, 25293,9374, 10165,30712,9192, 5591, + 1476, 2572, 8572, 33423,36051,12750,1538, 15692,28130,33878,15321,38383,3328, 20230,3259, 29503,18246,8839, 14249,759, 23249,12400,32973,3195, 20748,2017, 7897, 5358, 30286,5824, 28868,11101,3005, 1929, 14285,21956,3773, 20340,16790,4450, 4506, 9952, 3415, 3545, 7865, 12347,37095,27359,23773,457, 1238, 38685,11680,39033, - 14153,18214,37004,36224,33687,17100,6234, 5286, 41455,34410,17754,33601,33600,34673,38067,39190,25394,4856, 12092,36224,2044, 41454,33365,4760, 7561, 4353, 3278, + 14153,18214,37004,36224,33687,17100,6234, 5286, 41455,34410,17754,33601,33600,34673,38067,39190,25394,4856, 12092,36224,2044, 41454,33365,4760, 7561, 4353, 3278, 14293,31052,34035,36966,8019, 12362,39190,7576, 34921,10710,17753,18846,30772,4118, 19758,26075,32282,39190,35615,14655,20599,35177,20055,41454,7973, 41454,39190, 31570,3541, 17382,12797,12651,15941,3143, 35547,12906,41454,33919,23108,15940,36421,39189,41453,39189,41453,33600,36398,33271,1867, 37780,37534,35772,22231,20300, 3062, 32939,17752,32979,5873, 36174,1491, 37534,2998, 11730,2356, 38666,36223,37534,2286, 146, 30002,5048, 18281,14332,31247,8091, 36292,34321,18769,5661, 33600, 20851,41453,36333,4948, 30114,19863,6326, 9561, 14152,27507,37534,28129,10038,30297,5570, 34840,1958, 38179,21667,20047,15381,2133, 35057,4595, 31569,7902, 28542, - 2413, 20229,11083,10678,11287,37292,37148,37165,2754, 14654,41453,39189,8571, 33187,14653,2365, 15138,23713,35177,36891,36223,29770,37810,28404,14058,1898, 862, + 2413, 20229,11083,10678,11287,37292,37148,37165,2754, 14654,41453,39189,8571, 33187,14653,2365, 15138,23713,35177,36891,36223,29770,37810,28404,14058,1898, 862, 3695, 32382,41452,23217,23268,27442,29559,37533,34320,32979,33991,25136,21942,17751,37533,35176,33600,33160,36223,11683,39189,37533,20228,41452,6409, 7759, 23865, 1368, 11094,16634,6315, 1049, 38111,32978,36344,25669,29021,35176,7082, 37533,39188,37532,41452,41452,35176,39188,26908,11821,36661,15403,18213,18207,38361,20227, 25258,2574, 35090,36161,5035, 25637,32978,17702,393, 16379,37532,9338, 54, 16708,1356, 36223,3185, 1015, 36222,1351, 11679,38855,19045,18768,37532,37532,37531, - 41451,41451,11074,417, 3540, 3184, 41451,2924, 14151,26415,39117,39188,37531,21502,361, 38867,36222,24035,4093, 37531,16979,41451,21082,1774, 33709,10844,6209, + 41451,41451,11074,417, 3540, 3184, 41451,2924, 14151,26415,39117,39188,37531,21502,361, 38867,36222,24035,4093, 37531,16979,41451,21082,1774, 33709,10844,6209, 4160, 5875, 4716, 9324, 8486, 6682, 34699,24051,1833, 36072,37864,15573,5517, 2315, 32925,5954, 6566, 694, 15442,36412,20430,35176,32110,26675,37531,34238,25197, - 15857,33599,34678,41450,20652,41450,29752,20266,20357,39163,10075,12749,928, 32880,41450,3692, 12719,9085, 32978,26615,12796,37869,17750,3432, 27325,39188,7157, + 15857,33599,34678,41450,20652,41450,29752,20266,20357,39163,10075,12749,928, 32880,41450,3692, 12719,9085, 32978,26615,12796,37869,17750,3432, 27325,39188,7157, 266, 29734,35703,29751,12399,2749, 19484,19665,37530,36222,35735,4729, 33077,9782, 28635,21501,412, 25982,269, 39187,37530,2213, 4211, 38449,39187,37530,41450, 204, 23348,41449,596, 1543, 690, 24267,5633, 8020, 20226,1110, 18845,1902, 10164,12019,3708, 3884, 3539, 14360,36222,26674,36715,2678, 36967,2046, 867, 34325, - 36221,41449,15432,35175,1836, 29948,3737, 3656, 3662, 9951, 8018, 37169,8705, 12018,57, 6896, 24836,18774,17899,31311,20225,34320,41449,39187,30488,39315,4458, + 36221,41449,15432,35175,1836, 29948,3737, 3656, 3662, 9951, 8018, 37169,8705, 12018,57, 6896, 24836,18774,17899,31311,20225,34320,41449,39187,30488,39315,4458, 41449,37791,25944,38260,24654,35175,37530,41448,35175,6812, 35175,28128,17606,39187,5994, 28001,41448,31568,11894,32889,25393,2537, 33599,9010, 35174,10647,36221, - 36221,41448,36221,39186,39186,17432,23207,1082, 828, 21559,33528,41448,37529,34499,35174,1048, 6681, 35747,16789,23206,35174,22316,21500,39186,93, 13216,1364, + 36221,41448,36221,39186,39186,17432,23207,1082, 828, 21559,33528,41448,37529,34499,35174,1048, 6681, 35747,16789,23206,35174,22316,21500,39186,93, 13216,1364, 9274, 4988, 597, 2588, 8794, 30628,23726,15018,4303, 35166,20224,3268, 38936,25864,21499,30501,37215,28242,27230,9261, 2256, 37529,476, 15832,23795,7380, 22508, 22202,8199, 12748,9745, 14150,5128, 13171,1632, 4532, 17749,14428,26191,14469,1885, 22004,399, 4100, 11939,18646,25471,15628,39186,10867,11815,32899,41447,13714, 6194, 3531, 1075, 18939,7012, 9950, 23043,9365, 41447,7379, 25392,12359,17748,20223,38290,37484,25693,16256,26247,35174,35173,15701,16784,36612,33781,19167,33869, @@ -19296,26 +19291,26 @@ static const unsigned short Ranks[197839] = 21497,36896,22672,31527,24823,12856,31663,27460,19541,18418,26203,6193, 37802,25995,8203, 28126,34319,1328, 19842,39184,39183,18767,39183,694, 522, 14652,32977, 41446,37559,37528,39183,28125,31567,3029, 805, 39183,20222,37528,29749,16686,16454,13341,31356,32977,36529,21321,36490,33906,28384,37638,11473,38031,11970,39182, 2087, 34593,34067,41446,41446,29735,41446,32168,33598,34362,24266,18399,41445,36286,31776,3793, 24039,35796,34505,23204,33598,39182,39182,30164,34060,77, 23355, - 41445,41445,2524, 14827,41445,21655,11391,36128,41444,793, 26438,14499,39182,13860,107, 4583, 2961, 7269, 14717,2960, 15279,154, 1283, 17747,24865,1660, 7513, + 41445,41445,2524, 14827,41445,21655,11391,36128,41444,793, 26438,14499,39182,13860,107, 4583, 2961, 7269, 14717,2960, 15279,154, 1283, 17747,24865,1660, 7513, 33598,41444,35913,2383, 35240,23171,33968,16788,34319,34319,1891, 5406, 17605,37105,13633,5, 1609, 943, 42, 17746,18844,17139,14682,3541, 32977,28265,12747, - 14149,8288, 12824,7884, 16787,23203,35173,35172,6192, 12358,16786,6325, 37528,1503, 33597,31566,25452,23244,1, 1245, 39181,25390,37528,35172,1182, 4312, 540, + 14149,8288, 12824,7884, 16787,23203,35173,35172,6192, 12358,16786,6325, 37528,1503, 33597,31566,25452,23244,1, 1245, 39181,25390,37528,35172,1182, 4312, 540, 4497, 3059, 36240,12194,36536,12746,39247,29748,20648,26998,34456,32818,15242,33073,5661, 18715,6051, 23367,24710,29747,12149,10276,6012, 31379,17609,41444,10594, - 32779,2381, 13700,7504, 31205,16183,27800,29282,2534, 21633,8210, 16439,27912,4387, 31572,4672, 25916,1262, 29450,32977,20584,41444,16475,11261,22614,2889, 5361, + 32779,2381, 13700,7504, 31205,16183,27800,29282,2534, 21633,8210, 16439,27912,4387, 31572,4672, 25916,1262, 29450,32977,20584,41444,16475,11261,22614,2889, 5361, 3273, 28129,3063, 31248,7564, 1997, 8228, 22315,41443,2620, 39181,9486, 28034,5136, 19578,23972,3570, 17745,1440, 15521,17421,26456,16538,39338,32980,28011,31122, 2842, 30841,32779,17744,18922,14822,22026,31565,32976,29746,39181,39181,33597,33174,41443,28, 3055, 4644, 4385, 32371,8435, 25354,30997,10331,2020, 23251,19534, 1799, 22337,24680,17743,9271, 11159,41443,7816, 41443,41442,122, 25389,22769,33103,18843,84, 17119,27462,262, 8429, 32100,29069,31391,21204,13304,8243, 18373, - 9719, 9579, 1193, 4236, 2068, 37321,26008,34696,21269,39180,758, 62, 8680, 27957,30450,37527,35610,844, 6995, 31507,31119,36192,34476,7877, 1014, 37527,143, + 9719, 9579, 1193, 4236, 2068, 37321,26008,34696,21269,39180,758, 62, 8680, 27957,30450,37527,35610,844, 6995, 31507,31119,36192,34476,7877, 1014, 37527,143, 22125,34318,27794,34318,29541,34227,13792,2679, 6614, 9827, 3181, 25551,38796,37567,2711, 34383,814, 12426,32650,24480,34440,15302,33277,38228,3054, 13166,17015, - 3222, 7184, 27565,36765,34357,2670, 33231,8678, 9146, 32158,11982,29882,32809,685, 35444,17325,36835,37377,23623,22499,41442,26667,28705,11678,26452,32870,6268, + 3222, 7184, 27565,36765,34357,2670, 33231,8678, 9146, 32158,11982,29882,32809,685, 35444,17325,36835,37377,23623,22499,41442,26667,28705,11678,26452,32870,6268, 39081,17299,10331,2025, 7659, 38849,1499, 15056,15214,10866,42, 2901, 1860, 5366, 96, 8425, 2169, 2938, 14502,24230,36538,794, 35258,9744, 27929,8424, 26591, 13170,72, 15229,538, 2183, 30829,2964, 28112,18570,36484,3706, 28124,26562,10104,3864, 25548,36788,3480, 22983,36442,38349,36764,39370,15798,11382,34069,11975, 30294,7183, 32807,18842,37513,31906,28380,35011,9560, 8851, 39139,39180,14351,379, 4965, 32505,642, 19012,25742,9009, 23202,36220,22314,4540, 1832, 39180,37097, 23697,8207, 23721,16785,75, 14148,13107,18006,7946, 36924,30822,2529, 23115,27271,24265,3490, 29941,20897,14651,12745,24827,36662,35897,20995,8256, 16001,39180, - 23432,20222,26638,36891,38115,8892, 9980, 20221,23613,12650,7730, 11648,24792,6968, 41442,41442,39179,25388,20747,28123,9777, 31992,34318,41441,8854, 13623,4442, + 23432,20222,26638,36891,38115,8892, 9980, 20221,23613,12650,7730, 11648,24792,6968, 41442,41442,39179,25388,20747,28123,9777, 31992,34318,41441,8854, 13623,4442, 25527,27924,9213, 22204,37527,33, 997, 522, 140, 650, 2923, 18841,21906,38371,28426,37527,41441,38699,26673,4510, 35480,16685,5479, 20746,39179,20745,35172, - 9931, 2493, 2473, 35172,33637,2209, 24336,36574,17576,18840,11677,7658, 32950,20220,20698,21178,20915,5733, 27665,21458,41441,32976,37526,14709,2064, 41441,3776, + 9931, 2493, 2473, 35172,33637,2209, 24336,36574,17576,18840,11677,7658, 32950,20220,20698,21178,20915,5733, 27665,21458,41441,32976,37526,14709,2064, 41441,3776, 37526,7896, 35171,36220,5572, 41440,32976,18212,24264,24263,16684,20408,41440,35261,34318,37526,35171,5534, 28312,32976,5754, 37526,39179,10705,39412,24540,34455, - 4057, 11390,5874, 5303, 2516, 36219,38886,38772,36701,28122,35171,10375,39179,41440,41440,11121,35171,34317,30888,1732, 9949, 89, 17742,30258,10843,7575, 118, + 4057, 11390,5874, 5303, 2516, 36219,38886,38772,36701,28122,35171,10375,39179,41440,41440,11121,35171,34317,30888,1732, 9949, 89, 17742,30258,10843,7575, 118, 9948, 37525,4626, 41, 31112,21696,9921, 8501, 2418, 222, 9190, 463, 28057,12900,28832,4705, 13632,38511,20219,12357,13631,39089,33173,36491,197, 10278,18563, 4413, 27121,4984, 2577, 2353, 32339,5486, 8850, 10401,781, 33346,24034,38016,12308,18766,9, 14650,2697, 14460,4005, 11808,11677,33597,9572, 17004,7956, 32139, 37525,38316,41439,20054,37525,12356,37525,41439,37524,41439,39178,19391,38599,36219,36219,39178,33597,37524,39178,39178,39121,13155,29745,4728, 3400, 41439,13154, @@ -19325,19 +19320,19 @@ static const unsigned short Ranks[197839] = 29743,11073,36236,32635,16683,16411,17740,33596,41437,20744,22313,39177,39177,2343, 38435,29742,8327, 41437,28120,26672,37523,3705, 23199,25386,20218,38679,36218, 1443, 14359,39176,32975,35379,37523,3967, 20217,3394, 14012,36218,39176,8423, 11681,32975,322, 35170,15939,21032,27208,37449,33213,3555, 6123, 22158,11279,19375, 41436,4271, 36218,35727,4015, 1315, 14649,9776, 41436,5035, 29741,33596,36326,9076, 41436,3147, 34246,34556,150, 27754,2228, 37088,295, 109, 2603, 17739,15938, - 6136, 1191, 16783,640, 1713, 10842,41436,10545,14638,32900,41435,15431,12649,36217,41435,25385,41435,3617, 27436,2127, 18104,14147,35657,8462, 4192, 14733,7815, + 6136, 1191, 16783,640, 1713, 10842,41436,10545,14638,32900,41435,15431,12649,36217,41435,25385,41435,3617, 27436,2127, 18104,14147,35657,8462, 4192, 14733,7815, 24070,7776, 13630,1223, 1906, 1339, 1562, 6363, 2041, 7895, 59, 20213,36906,16488,10271,33027,26592,19741,34461,17738,10841,4300, 8849, 12648,37523,41435,14358, - 28996,1972, 14708,39207,23612,5237, 17535,35010,41434,1033, 13422,6883, 20216,3260, 1504, 4107, 15795,5873, 8422, 36703,12437,6927, 12599,12744,7209, 35169,1472, - 13470,25660,4471, 37805,29232,8421, 8202, 20215,23198,33512,34921,18010,20214,32975,2262, 20743,24260,14343,32505,38936,39207,21495,31563,10212,26671,41434,6191, + 28996,1972, 14708,39207,23612,5237, 17535,35010,41434,1033, 13422,6883, 20216,3260, 1504, 4107, 15795,5873, 8422, 36703,12437,6927, 12599,12744,7209, 35169,1472, + 13470,25660,4471, 37805,29232,8421, 8202, 20215,23198,33512,34921,18010,20214,32975,2262, 20743,24260,14343,32505,38936,39207,21495,31563,10212,26671,41434,6191, 35689,85, 397, 11295,18839,513, 34497,11119,38025,36575,18838,5214, 18837,8420, 1162, 1416, 2965, 8155, 33596,39176,37523,14635,25616,4911, 15937,14146,20213, 32975,18836,41434,17022,35490,16782,18835,2039, 26926,36864,22134,10840,32974,4555, 31533,20212,16238,1024, 25072,5302, 26669,35169,18532,24259,41434,26670,41433, 39176,2900, 38968,14145,33686,38147,7135, 15278,3139, 23197,7182, 478, 5490, 31469,9743, 19789,31562,11498,79, 26328,1360, 30854,12765,19167,14274,27446,15399, 17327,3132, 33747,9214, 13593,12718,16226,21316,32792,34377,35210,39175,37442,38616,14648,33115,10156,12355,11193,36696,41433,33727,10613,33739,36217,29740,37522, - 5478, 41433,30478,9947, 37474,35169,10122,22426,41433,25630,9367, 33595,533, 36217,19390,4754, 25577,26669,41432,33595,25161,33595,1782, 10162,33877,38009,1834, + 5478, 41433,30478,9947, 37474,35169,10122,22426,41433,25630,9367, 33595,533, 36217,19390,4754, 25577,26669,41432,33595,25161,33595,1782, 10162,33877,38009,1834, 39175,37522,41432,450, 18834,25384,24143,1421, 24141,29090,24258,18833,15176,10478,31480,37338,17604,23680,208, 2455, 37626,33595,39175,29739,39060,17737,36952, 35003,25154,37522,34316,32889,34810,9034, 38797,12354,31660,39146,706, 21858,5940, 3315, 1224, 16805,39175,36732,9449, 2413, 13713,3692, 1137, 20742,28658,37522, 17603,3732, 39174,12398,11260,20741,2646, 20732,35169,7455, 20065,37521,15177,2820, 38092,4692, 4264, 15155,31280,35594,14144,33003,33594,39174,37521,19846,31561, - 25304,3542, 23471,39174,5759, 36217,7495, 37521,3092, 22312,36881,36216,34519,8781, 41432,41432,25383,14573,3186, 4171, 36979,9217, 1155, 17736,14003,20353,1143, + 25304,3542, 23471,39174,5759, 36217,7495, 37521,3092, 22312,36881,36216,34519,8781, 41432,41432,25383,14573,3186, 4171, 36979,9217, 1155, 17736,14003,20353,1143, 3707, 918, 10839,15225,6463, 9216, 6632, 5570, 31560,20740,9364, 7170, 25157,19950,33361,6484, 5755, 24257,10838,17735,12397,21938,3953, 37356,8746, 18493,38740, 37521,10400,16255,39174,39173,1142, 5581, 14143,1135, 27080,16955,30287,1454, 23196,12148,14011,26421,24256,10755,24255,36216,39173,36216,37520,36216,34316,37520, 13424,10211,37520,37520,21518,3397, 16682,38644,41431,33594,30199,34909,2787, 2963, 20053,13438,36015,35168,22491,12647,2877, 25382,1507, 11052,2519, 2240, 12485, @@ -19346,23 +19341,23 @@ static const unsigned short Ranks[197839] = 32754,17012,21321,5800, 23170,26030,36215,10950,11164,16138,22678,121, 18390,3786, 24350,20110,25905,29738,24058,10839,16637,39173,4376, 44, 9755, 2615, 32291, 18955,9294, 27691,3709, 31031,27926,12407,30209,22519,22262,34316,11680,32819,6152, 1049, 25808,10681,6783, 21229,14647,13168,17734,4952, 20211,7390, 17733,16781, 2695, 17732,36811,9515, 29737,14707,29960,36494,12477,32133,26987,8878, 27903,14906,20029,8964, 34676,14880,18765,38780,26577,30216,2734, 36215,34315,15809,39172, - 3183, 38683,36365,23479,35137,34284,9946, 36197,35168,35667,32546,15920,21134,20526,1669, 18688,26288,37018,20223,17985,3396, 35341,16604,6866, 14121,27644,5632, + 3183, 38683,36365,23479,35137,34284,9946, 36197,35168,35667,32546,15920,21134,20526,1669, 18688,26288,37018,20223,17985,3396, 35341,16604,6866, 14121,27644,5632, 39172,12396,7160, 37519,35197,12519,24228,567, 32863,25977,16745,34315,37519,39172,38147,31470,33594,39172,3564, 2814, 7646, 1634, 36253,996, 32925,16254,14142, 6044, 15837,686, 14357,6151, 41431,14010,12500,12905,36215,17731,34315,41431,33919,12904,6022, 13773,15520,2961, 34507,41430,41430,164, 8675, 26200,29669,37542, 33874,41430,27766,41430,23885,37835,15669,39335,1023, 14086,19534,37078,18580,5571, 22405,34783,35168,9766, 18125,20091,17544,34315,10689,17309,41429,34573,36214, 23195,11118,37519,41429,29643,40, 16579,27496,28079,36684,13464,37953,6565, 22933,18516,34018,32919,7181, 36506,4532, 20440,38695,7755, 8656, 41429,4825, 34072, 14721,37359,35337,11966,3866, 8704, 229, 26819,34901,37545,38236,10809,31861,36680,26265,6641, 38290,20210,17242,11940,27289,20209,33026,37518,8703, 3468, 20208, - 1385, 23401,37518,33601,35432,15697,17730,39178,11259,16253,3637, 14141,35167,36214,11921,37518,4117, 31559,35167,34314,18832,12155,4704, 10161,8545, 35167,1359, + 1385, 23401,37518,33601,35432,15697,17730,39178,11259,16253,3637, 14141,35167,36214,11921,37518,4117, 31559,35167,34314,18832,12155,4704, 10161,8545, 35167,1359, 37518,5900, 17729,420, 8403, 20418,29641,16625,30118,14864,14695,11327,37805,14646,39171,41429,41428,7070, 23022,4952, 38526,28985,31052,22310,17127,22488,41428, 27, 6894, 30952,16249,6542, 15277,24254,34314,35167,33594,14706,38648,8201, 35166,23205,34441,6799, 32049,41428,3808, 92, 32538,16680,33290,37792,38873,37608, 18137,13712,27824,6200, 37263,20417,39145,29092,33994,11106,13423,4034, 19389,9253, 20739,8200, 32973,32589,15936,35925,33748,37517,11920,9252, 23194,15822,16780, - 3319, 9033, 19035,11748,32973,41428,18210,33258,5802, 22309,20207,7159, 8570, 10160,32973,36214,26368,14826,21698,34714,6505, 39171,37495,2922, 37517,14140,567, + 3319, 9033, 19035,11748,32973,41428,18210,33258,5802, 22309,20207,7159, 8570, 10160,32973,36214,26368,14826,21698,34714,6505, 39171,37495,2922, 37517,14140,567, 8987, 4291, 13492,2918, 16779,12743,35166,13711,13153,29736,20738,22308,41427,2043, 30083,41427,39171,37517,38351,23193,34314,16252,41427,32973,5570, 9251, 32544, - 23192,12596,10074,35976,27340,14139,10399,1745, 24253,34314,31558,18673,39092,21319,36475,14645,37125,24071,1135, 41427,37517,18086,36045,33715,41426,29454,1361, + 23192,12596,10074,35976,27340,14139,10399,1745, 24253,34314,31558,18673,39092,21319,36475,14645,37125,24071,1135, 41427,37517,18086,36045,33715,41426,29454,1361, 13666,18035,32972,12353,36885,17728,39171,1297, 37719,37516,14009,27374,41426,17016,27491,3789, 22433,25381,18764,3776, 6489, 18831,34313,35166,36214,8434, 17136, 41426,21494,6135, 7460, 16251,16679,34313,17978,12147,33489,7426, 10696,41426,2529, 29735,10398,8848, 14138,1069, 7019, 35158,15724,35464,35166,11389,2307, 35616, 10871,34438,9314, 37832,28661,23191,2785, 581, 37737,14137,19237,3988, 35942,8154, 24252,22912,34664,8017, 39170,39395,39170,34631,27727,39170,34313,23190,21489, - 15063,38997,37516,36044,32836,34844,34712,21884,30574,18835,38309,22474,34890,35839,31557,5301, 3694, 38278,20052,28119,19327,38468,23189,20737,41425,41425,2559, + 15063,38997,37516,36044,32836,34844,34712,21884,30574,18835,38309,22474,34890,35839,31557,5301, 3694, 38278,20052,28119,19327,38468,23189,20737,41425,41425,2559, 41425,28118,36213,3618, 896, 17602,15046,35165,41425,39170,38451,38773,36879,19388,31556,33838,14157,2975, 5661, 39169,24888,5923, 14644,3871, 8689, 27604,39343, 36238,17808,23718,588, 9303, 15072,2547, 1144, 19035,38672,37516,37516,36923,14705,33080,5734, 41424,16109,17175,34298,28093,18181,33899,9774, 268, 1080, 14007, 26590,1560, 41424,1116, 33092,36857,9489, 35165,6237, 22498,26667,7014, 24092,35847,20125,33178,376, 17679,31371,11785,15062,3083, 29734,41424,23042,2017, 39169, @@ -19371,7 +19366,7 @@ static const unsigned short Ranks[197839] = 32841,20403,37515,36213,41422,15181,18179,14201,36171,11462,6417, 9183, 24811,29890,3, 20205,18860,5013, 33070,37270,28676,19647,26222,11117,20204,37515,22307, 37515,34312,34312,1190, 19897,8016, 3838, 15935,20203,8569, 41422,11676,7130, 18256,3329, 35164,6327, 35164,7554, 26311,28794,18829,37514,14008,37274,35164,35164, 5337, 2838, 18763,834, 25674,39168,32972,36213,35163,3327, 1478, 11919,32783,34012,37514,36535,41422,26665,23188,39168,41421,15923,18828,21097,423, 17424,30513, - 24974,27274,6342, 29906,29733,25247,3617, 24834,39167,16250,11072,36246,34312,35779,39167,23464,36212,8153, 36212,27863,33695,36212,776, 22392,39167,12395,245, + 24974,27274,6342, 29906,29733,25247,3617, 24834,39167,16250,11072,36246,34312,35779,39167,23464,36212,8153, 36212,27863,33695,36212,776, 22392,39167,12395,245, 7612, 24893,19577,86, 30848,20202,18827,8847, 14643,20201,6709, 37514,41421,23187,33479,22828,36212,33593,33616,7459, 31556,39167,41421,35630,36211,23677,33453, 34312,2384, 12352,41421,35163,38345,15823,4097, 41420,36211,31555,41420,27135,14136,6564, 35163,17135,36211,21493,28117,41420,18416,2312, 39166,20051,34311,32972, 4020, 34311,36211,32972,41420,19386,33593,7773, 32578,20200,11675,20199,41419,22131,168, 9215, 37307,9771, 33570,37514,39166,37513,8183, 37456,25582,20198,34311, @@ -19381,10 +19376,10 @@ static const unsigned short Ranks[197839] = 17511,8780, 39165,31554,36210,12412,33659,31553,41418,39165,3091, 37374,29417,1988, 27468,3417, 15275,37005,20195,20194,6421, 27065,41418,7377, 35162,33526,15061, 26663,41418,33592,13710,15060,4033, 41418,33592,28720,8779, 2472, 36209,35162,10085,23471,32971,29315,5660, 35162,25380,38681,37019,11438,36209,41417,29731,37512, 5659, 37511,11507,20860,16631,29460,34310,38759,37511,149, 22747,7162, 24634,16249,4445, 37007,24250,33592,9775, 41417,28269,34310,15934,387, 19364,1121, 16678, - 17600,16677,36209,38289,41417,17599,41417,15059,23186,37511,39165,33575,26627,26662,31552,41416,23185,15871,9250, 18684,37511,16387,8334, 2137, 19140,28238,5012, + 17600,16677,36209,38289,41417,17599,41417,15059,23186,37511,39165,33575,26627,26662,31552,41416,23185,15871,9250, 18684,37511,16387,8334, 2137, 19140,28238,5012, 38259,3041, 15058,36578,41416,8433, 33592,8342, 39168,19455,19193,37510,6114, 13757,9742, 20619,339, 12490,16790,30741,31726,15057,10260,41416,10397,26661,18223, 1524, 41416,34114,38055,17598,25379,8199, 20736,16778,2757, 27757,23184,41415,41415,38291,1953, 2719, 36209,36208,23307,13422,37510,23065,19022,41415,20170,31551, - 24249,37371,10210,39164,41415,2218, 1105, 35161,11303,34310,15505,29730,13167,419, 37510,15274,20193,156, 2159, 12889,12324,30455,22788,2464, 26867,19908,3020, + 24249,37371,10210,39164,41415,2218, 1105, 35161,11303,34310,15505,29730,13167,419, 37510,15274,20193,156, 2159, 12889,12324,30455,22788,2464, 26867,19908,3020, 11604,32794,19462,11015,13275,26524,29044,36501,15042,38180,2382, 32818,39164,298, 29810,18825,37510,39208,32338,37509,1263, 37509,13152,5140, 39164,8453, 41414, 23183,35161,39164,18824,41414,16676,41414,32862,25589,29303,16763,33977,37209,2463, 2921, 41414,10800,20744,8418, 39163,23518,17750,39163,24655,37509,2462, 41413, 24764,28115,11472,2051, 14641,16744,37467,23182,41413,6043, 6109, 3467, 41413,925, 3302, 7455, 14893,13166,37761,38958,34976,41413,25378,35595,39321,39163,18823, @@ -19394,11 +19389,11 @@ static const unsigned short Ranks[197839] = 7563, 170, 25376,16248,11257,9877, 41411,33591,1851, 18305,41410,32123,5080, 4643, 38334,29729,4958, 29460,17706,14788,36738,3261, 33060,19319,1987, 23669,38987, 11338,41410,31549,8011, 31548,4727, 8090, 34309,4957, 41410,39162,5853, 3210, 23903,5120, 8293, 13709,13028,9291, 23982,10612,20192,35161,33591,31122,14651,10368, 10754,6708, 17059,11912,2496, 10159,41410,11470,3779, 14640,11341,35161,15933,11679,6134, 29910,11674,14134,3634, 12739,25225,21491,6782, 2175, 27673,15932,30102, - 11772,36207,219, 35166,41409,41409,28114,35466,8014, 7879, 19837,29268,1767, 23923,21300,15750,1797, 15056,10723,28113,37509,18821,9513, 37508,14581,11128,366, + 11772,36207,219, 35166,41409,41409,28114,35466,8014, 7879, 19837,29268,1767, 23923,21300,15750,1797, 15056,10723,28113,37509,18821,9513, 37508,14581,11128,366, 11519,17134,4584, 2535, 34229,28112,37046,2824, 8677, 35894,37508,2581, 39162,33809,37637,24335,6503, 41409,39162,39161,41409,39161,13712,28519,41408,17726,32188, 36633,11854,13145,35122,7168, 41408,37140,36273,37162,36207,41408,6284, 39161,8198, 27573,27071,6723, 37508,28111,5872, 18981,36477,22648,17849,35160,37508,35474, 11071,35160,39161,25473,3544, 39160,1586, 29943,37507,18761,7553, 12738,39160,17725,16084,28899,12645,39096,3029, 34529,34064,8735, 6586, 38771,28215,18820,12017, - 28164,7405, 17724,23328,32686,38671,41408,8617, 3538, 5621, 9249, 39096,26660,13057,35159,32186,23089,39160,14548,10529,15430,39160,35645,26659,41407,37559,3372, + 28164,7405, 17724,23328,32686,38671,41408,8617, 3538, 5621, 9249, 39096,26660,13057,35159,32186,23089,39160,14548,10529,15430,39160,35645,26659,41407,37559,3372, 6563, 9032, 19385,11673,33591,36772,15972,38534,34309,35286,39159,2649, 20191,36207,20190,35160,41407,15835,15348,25375,38945,38722,37277,16247,5139, 20735,18760, 34309,930, 4954, 15429,11678,3394, 29728,13138,35160,27996,15273,21490,37742,4375, 25500,29727,33093,29726,11918,37507,37507,28142,4916, 10158,8287, 39002,33229, 26658,1976, 39126,35159,38556,828, 12392,7406, 23800,38640,29725,38922,37855,10418,36207,33590,39159,39159,22913,41407,39323,39159,28110,33590,22749,3138, 27022, @@ -19414,33 +19409,33 @@ static const unsigned short Ranks[197839] = 20185,18030,13629,26655,39156,37366,27650,8013, 33570,9808, 6591, 36205,39155,41401,17722,21372,41401,8702, 13708,13420,412, 32840,38126,17101,2256, 18816,35729, 25946,24052,20732,37504,2085, 2063, 2515, 21693,3367, 20184,37257,22756,549, 2840, 37364,32720,15931,33931,2394, 36204,39155,34308,14703,26558,16246,32970,11070, 36204,39155,5336, 41401,37504,39155,10611,11698,34128,41400,21398,37504,3393, 1532, 31194,33589,20731,37503,36204,35159,3918, 39279,2536, 1480, 632, 37865,39154, - 38938,6539, 7041, 2010, 8152, 10374,2678, 871, 12759,33429,11388,2788, 8432, 36204,10223,4216, 10886,36203,10373,37503,36203,132, 18302,4302, 35196,36120,6097, + 38938,6539, 7041, 2010, 8152, 10374,2678, 871, 12759,33429,11388,2788, 8432, 36204,10223,4216, 10886,36203,10373,37503,36203,132, 18302,4302, 35196,36120,6097, 3792, 12351,19692,9945, 18815,10540,16809,6371, 1225, 41400,35706,8880, 34308,341, 14131,10490,665, 4200, 14615,7552, 34315,14356,10395,31472,11425,39154,24217, - 11255,34984,41400,20049,29763,29723,16575,21414,8286, 28108,3521, 7274, 36726,10157,9741, 7364, 17721,34261,1781, 1454, 32606,17739,26298,17837,16675,12350,7011, + 11255,34984,41400,20049,29763,29723,16575,21414,8286, 28108,3521, 7274, 36726,10157,9741, 7364, 17721,34261,1781, 1454, 32606,17739,26298,17837,16675,12350,7011, 34282,30580,37701,21421,41400,27962,39154,23233,34576,37781,37503,12289,209, 8708, 23292,19971,2389, 18273,28107,15055,41399,25372,17720,25790,23106,30770,33411, 28295,24812,41399,22305,20048,41399,34307,37901,22304,22536,24200,28782,1872, 26977,34192,20183,3917, 1887, 4898, 34271,17990,4008, 41399,274, 24884,15272,20182, - 33191,15930,41398,37503,26654,389, 32846,514, 8285, 387, 19092,14974,19985,3145, 2903, 16886,18814,2360, 35882,15779,18275,777, 35445,29423,33518,34156,4502, - 33942,27828,32931,5897, 29984,1829, 32847,9718, 7590, 108, 6640, 24789,12130,29722,30741,37004,587, 2528, 17356,3931, 16156,11911,15271,37959,2492, 19291,9900, + 33191,15930,41398,37503,26654,389, 32846,514, 8285, 387, 19092,14974,19985,3145, 2903, 16886,18814,2360, 35882,15779,18275,777, 35445,29423,33518,34156,4502, + 33942,27828,32931,5897, 29984,1829, 32847,9718, 7590, 108, 6640, 24789,12130,29722,30741,37004,587, 2528, 17356,3931, 16156,11911,15271,37959,2492, 19291,9900, 4647, 5310, 30715,19709,18813,1937, 1191, 586, 32991,13590,21608,2094, 2324, 39154,23181,27512,10759,32970,41398,1100, 19225,15819,16776,15683,4147, 8684, 35158, - 9774, 37357,9944, 2143, 29721,35158,31547,2223, 7010, 36175,2047, 39153,41398,39153,36694,28484,41398,1530, 30295,38280,11191,3204, 18181,7696, 18830,35890,6436, + 9774, 37357,9944, 2143, 29721,35158,31547,2223, 7010, 36175,2047, 39153,41398,39153,36694,28484,41398,1530, 30295,38280,11191,3204, 18181,7696, 18830,35890,6436, 33571,30473,35158,3630, 35356,783, 10330,17133,1538, 8151, 12501,3490, 8445, 41397,20181,398, 19018,33586,14841,34307,4355, 18812,1198, 30017,33735,21748,37769, - 34307,15270,20180,9740, 35158,7009, 30756,3898, 34846,9031, 4839, 14303,17798,7900, 39153,33807,34737,6345, 5700, 21281,15201,4423, 18209,36696,32485,37502,7237, - 11115,36611,37085,39153,7728, 2420, 37502,34307,32970,41397,2502, 37502,15929,6102, 11114,17719,11387,14130,20179,37354,6376, 5846, 10760,423, 33589,34306,1448, - 35342,37677,35157,33589,29720,41397,2535, 34739,37502,21487,12527,15928,32903,4158, 20178,17718,10394,7363, 10610,31682,3573, 29401,35881,38825,4738, 20339,4368, + 34307,15270,20180,9740, 35158,7009, 30756,3898, 34846,9031, 4839, 14303,17798,7900, 39153,33807,34737,6345, 5700, 21281,15201,4423, 18209,36696,32485,37502,7237, + 11115,36611,37085,39153,7728, 2420, 37502,34307,32970,41397,2502, 37502,15929,6102, 11114,17719,11387,14130,20179,37354,6376, 5846, 10760,423, 33589,34306,1448, + 35342,37677,35157,33589,29720,41397,2535, 34739,37502,21487,12527,15928,32903,4158, 20178,17718,10394,7363, 10610,31682,3573, 29401,35881,38825,4738, 20339,4368, 29620,922, 10917,36123,34319,9211, 34360,39080,36533,32257,31614,26364,34687,18931,29157,19380,14129,12218,38347,31098,16775,39176,11282,37857,26637,9368, 20177, 7362, 34084,5133, 16022,15558,6362, 39277,28865,38434,22768,28123,16875,11402,20379,7223, 37816,1294, 15910,25597,26339,9363, 995, 37299,5262, 4607, 20172,39046, 8974, 4002, 3283, 22293,7940, 18921,3239, 10523,6813, 7087, 7941, 20176,8150, 14639,7284, 5814, 6926, 13628,17717,33276,39214,39417,9299, 20175,10138,38773,12826, 2093, 18580,21089,2200, 6115, 8874, 13515,7987, 13391,36162,20174,27040,32161,23105,32785,4423, 1821, 5837, 8549, 1833, 13967,3992, 2430, 9290, 26261,25132,12035, 12282,34355,37138,20615,39170,11050,36291,13804,36272,34829,37245,2156, 7651, 7264, 13751,4272, 3976, 8773, 8321, 29364,11984,38318,17034,34183,37139,21232,38136, - 34355,33589,33932,38505,37502,6493, 5235, 33077,35153,33042,38418,36708,13627,31717,2528, 11459,15747,35124,15927,36328,12349,23328,11706,863, 30534,1304, 3501, + 34355,33589,33932,38505,37502,6493, 5235, 33077,35153,33042,38418,36708,13627,31717,2528, 11459,15747,35124,15927,36328,12349,23328,11706,863, 30534,1304, 3501, 11645,19509,34352,6717, 6812, 25414,21337,34701,19707,36323,38853,14638,33682,30476,35183,16245,9888, 30063,6706, 25674,8701, 18811,33375,7423, 16587,35157,28106, 4248, 21176,36203,36311,21898,23225,1558, 41397,39152,13419,35157,38317,17085,41396,15269,30286,23728,41396,2919, 38949,1520, 2876, 15926,34306,9689, 9943, 33128, 4611, 34710,35473,1330, 19399,14128,3840, 35157,17716,5758, 10137,6021, 3305, 37501,41396,37501,35684,37501,11895,41396,17715,9651, 36203,33588,35156,18759,34306, 39074,2203, 17714,3916, 36584,20173,5922, 18810,39152,41395,36202,29719,33588,10885,23180,41395,23179,31546,41395,29688,36202,28871,35151,33588,10151,962, 17572, - 32987,2236, 2759, 6040, 2398, 10797,2650, 8438, 7510, 3312, 20820,33294,2860, 23178,8879, 1494, 37501,31258,7803, 10414,11853,13883,15834,29695,37500,12911,8149, + 32987,2236, 2759, 6040, 2398, 10797,2650, 8438, 7510, 3312, 20820,33294,2860, 23178,8879, 1494, 37501,31258,7803, 10414,11853,13883,15834,29695,37500,12911,8149, 14834,15925,23211,36202,36202,34306,116, 5614, 41395,29748,35962,12348,24244,25371,7551, 33849,16193,19128,29182,37547,15061,24725,9248, 35156,24111,3479, 18809, 33588,34305,29718,1691, 24243,6933, 7657, 39234,16674,39152,38393,7458, 37970,11671,10068,17132,7268, 15054,10609,9558, 13626,14127,3393, 2828, 36201,35156,17131, - 41394,2877, 24242,5592, 37876,34710,16673,2106, 10393,3765, 34477,6562, 34440,3600, 914, 10392,1264, 13625,5543, 14126,1731, 5700, 11245,965, 4864, 3064, 1359, + 41394,2877, 24242,5592, 37876,34710,16673,2106, 10393,3765, 34477,6562, 34440,3600, 914, 10392,1264, 13625,5543, 14126,1731, 5700, 11245,965, 4864, 3064, 1359, 36201,37127,41394,33532,37500,26653,32087,20476,22761,5757, 24302,38294,41394,1523, 32991,39034,39152,39005,34145,22279,37500,27425,37500,41394,41393,28105,24241, 36201,940, 23529,28181,4726, 29466,36640,5504, 15268,15924,19271,10836,33130,38787,12530,26649,3616, 1350, 20432,17130,18847,5535, 12864,29717,41393,33587,24121, 26652,37499,38567,36201,39151,36200,35156,13151,33587,11917,29716,34305,37499,14007,41393,28104,35155,37499,41393,35155,36200,41392,1655, 33587,5380, 30405,25377, @@ -19456,16 +19451,16 @@ static const unsigned short Ranks[197839] = 34833,37206,24630,433, 983, 28695,2747, 26650,12347,18208,19383,14125,9029, 12800,1717, 32576,17711,1759, 19570,35154,41387,20438,25042,34303,13123,34198,34948, 2315, 21376,39255,41387,27861,39148,35153,38662,39148,349, 37495,36867,18978,9145, 1741, 9042, 35486,16244,16771,41387,33821,41386,35153,8284, 16770,20168,17710, 38531,33550,41386,13778,9557, 30353,5801, 877, 10564,27120,5449, 37712,11224,9739, 9512, 41386,34092,34303,41386,35893,32573,29710,37640,33628,19310,16769,34303, - 39148,6001, 39147,34300,34213,39240,33322,36743,33518,21733,41385,41385,32969,39147,15335,35975,7572, 38240,23040,32968,34817,26699,20453,38238,4140, 41385,5050, + 39148,6001, 39147,34300,34213,39240,33322,36743,33518,21733,41385,41385,32969,39147,15335,35975,7572, 38240,23040,32968,34817,26699,20453,38238,4140, 41385,5050, 24896,34877,20728,35153,32968,1849, 26649,6639, 33390,38931,41385,41384,11068,11409,37495,12644,18806,10608,14124,41384,39147,19382,22401,501, 25326,37495,20316, 37153,39147,31543,38348,29090,33586,39146,17709,2800, 14123,770, 20273,16080,33950,23113,37267,20479,4493, 5960, 354, 5367, 15452,27032,13624,31542,10383,12014, - 39146,12902,24239,39146,26648,37434,2709, 35052,29709,20727,16830,34344,13436,33213,585, 13349,29635,16768,38184,27362,26647,36792,33316,2102, 14836,34902,5179, + 39146,12902,24239,39146,26648,37434,2709, 35052,29709,20727,16830,34344,13436,33213,585, 13349,29635,16768,38184,27362,26647,36792,33316,2102, 14836,34902,5179, 23710,10259,19057,7837, 1400, 15265,6042, 13163,33436,37349,3564, 17597,35306,35337,7640, 32794,26569,1280, 33586,22300,3826, 41384,32968,3694, 35923,37495,23174, 32968,8283, 4915, 28101,14050,3277, 16522,13255,18805,36121,22033,37494,37494,23173,1552, 25835,509, 35153,14355,36756,1214, 645, 9713, 38367,9463, 19737,11738, 7361, 38194,26489,18501,37494,8700, 36199,20761,33586,1888, 26041,35497,35266,29708,15053,33585,33585,37494,1034, 14063,16134,10607,30010,16743,38147,13162,39063, 17699,35662,33652,37725,15448,41384,17127,39290,36199,11469,10704,8891, 6361, 20167,33910,23172,33585,32967,21355,11386,28501,1104, 26219,32802,34303,17125,21274, 34302,41383,35152,22752,41383,41383,32973,41383,37493,8878, 39146,32396,37413,36198,36991,41382,35152,33585,22299,23286,33584,39145,13707,12441,39145,37107,33584, - 37493,37463,36866,37304,41382,23171,41382,38105,12643,37493,9930, 39145,21919,39145,29707,26064,11370,26646,28100,21485,39144,41382,1096, 18385,41381,13418,1891, + 37493,37463,36866,37304,41382,23171,41382,38105,12643,37493,9930, 39145,21919,39145,29707,26064,11370,26646,28100,21485,39144,41382,1096, 18385,41381,13418,1891, 8756, 39144,34302,41381,37493,36198,35152,4325, 28845,39144,7800, 14116,15419,20080,38645,10156,10528,14636,22053,7457, 17441,33365,41381,15830,41381,37492,37492, 4078, 14702,1134, 18696,17486,39144,41380,39143,30845,29968,25152,35152,24078,13090,11517,39143,10527,33144,14029,8853, 36351,24238,33520,37492,24237,35151,36198, 41380,41380,25982,3913, 781, 5789, 22309,9028, 36544,809, 24041,37381,41380,36769,38914,26258,22298,22113,12736,25720,22613,7008, 1759, 36198,11988,1309, 18804, @@ -19474,11 +19469,11 @@ static const unsigned short Ranks[197839] = 21483,7727, 5213, 15264,16518,18757,17708,6707, 20166,2113, 6604, 26729,2284, 24237,10897,8777, 26645,29359,16767,35151,31539,41379,38898,4140, 20165,16243,11066, 35151,36197,18802,8877, 6882, 41378,8198, 134, 25370,39143,39142,17554,5753, 17351,28127,13670,15204,41378,36377,16766,5102, 41378,31538,17707,14701,32705,37491, 41378,35150,3825, 36197,41377,1115, 6958, 19917,17706,34974,25984,950, 8576, 10479,9131, 4665, 8566, 38303,19343,825, 32924,18801,36197,3636, 14006,11065,34302, - 37491,39142,2016, 39142,1996, 36196,39142,41377,556, 267, 37491,37491,7550, 6193, 24591,22297,25369,32790,35150,25720,1986, 41377,14700,22484,16765,5335, 8776, - 13161,7549, 37243,9773, 16764,9951, 6903, 39141,39141,41377,39141,39335,41376,2835, 578, 19749,41376,2573, 5993, 22909,35150,26644,23170,19105,24236,14699,1029, + 37491,39142,2016, 39142,1996, 36196,39142,41377,556, 267, 37491,37491,7550, 6193, 24591,22297,25369,32790,35150,25720,1986, 41377,14700,22484,16765,5335, 8776, + 13161,7549, 37243,9773, 16764,9951, 6903, 39141,39141,41377,39141,39335,41376,2835, 578, 19749,41376,2573, 5993, 22909,35150,26644,23170,19105,24236,14699,1029, 604, 34302,15052,12642,39141,14634,33584,12394,35150,6190, 10606,36346,981, 5489, 10003,33623,9362, 33584,41376,17705,38240,35146,8693, 25755,39140,35149,17596, 35149,23390,36601,1925, 34599,38718,26564,1192, 28146,21482,18756,39140,34301,2164, 41376,35149,35149,35148,12453,24235,39140,39140,36196,25543,37490,36196,34301, - 6881, 14633,31537,5519, 17602,36196,39139,300, 9889, 1327, 4801, 3165, 27172,2564, 5409, 9459, 5575, 36, 13664,10959,3385, 35189,5197, 7726, 264, 16667,6133, + 6881, 14633,31537,5519, 17602,36196,39139,300, 9889, 1327, 4801, 3165, 27172,2564, 5409, 9459, 5575, 36, 13664,10959,3385, 35189,5197, 7726, 264, 16667,6133, 5974, 32769,5921, 33596,39139,39139,26643,36195,36195,37016,187, 8264, 34301,37490,34678,20726,20164,39139,32951,2430, 156, 32758,31514,33583,41375,34301,14005, 14121,15263,39138,37555,31492,38689,34084,21263,11385,41375,18355,37490,41375,36349,35237,5899, 39138,26721,11915,6680, 37820,41375,14004,6314, 34037,35412,34331, 15870,36448,34714,37552,39138,39138,14632,12013,41374,37490,21481,31536,12641,41374,34300,39345,34300,39137,5941, 36195,39137,10526,39101,38574,24535,35922,34945, @@ -19486,9 +19481,9 @@ static const unsigned short Ranks[197839] = 23072,38364,28719,35148,16868,20725,31535,31064,36784,36195,30803,38225,18800,34644,2151, 26344,26156,28768,37489,39052,41373,38479,37329,20661,34348,35147,32967, 31646,37489,18018,29765,33265,21156,21914,15424,15613,26279,24377,28197,36295,39136,29263,19683,39136,38021,950, 26837,18407,37489,38386,12735,28099,2286, 10391, 32096,20904,35666,35147,17126,31012,2283, 10155,27692,2816, 25657,26543,12809,36284,16762,5711, 34300,41373,32081,18799,35147,33583,4210, 37489,26648,11397,12420, - 14121,16242,34299,9843, 34305,13160,8953, 32856,27990,32732,36194,30621,41372,5614, 39136,37488,41372,39136,22296,36194,33331,34299,39135,2733, 35161,24677,4333, + 14121,16242,34299,9843, 34305,13160,8953, 32856,27990,32732,36194,30621,41372,5614, 39136,37488,41372,39136,22296,36194,33331,34299,39135,2733, 35161,24677,4333, 122, 8722, 32966,39135,34299,34299,10390,37488,30177,6141, 15481,15525,36194,13622,37228,28098,36194,41372,25018,33884,4272, 32871,41372,13706,32966,23169,26077, - 41371,41371,41371,41371,1843, 20074,29462,9361, 32966,29819,33006,37488,14640,34298,29212,18822,41370,38748,9398, 16152,35147,32966,19381,32965,21677,36699,8876, + 41371,41371,41371,41371,1843, 20074,29462,9361, 32966,29819,33006,37488,14640,34298,29212,18822,41370,38748,9398, 16152,35147,32966,19381,32965,21677,36699,8876, 6502, 41370,7067, 33910,37322,10165,36336,39135,35146,15921,3137, 37488,34412,37141,37487,17038,17595,35146,41370,24055,31534,23168,5418, 33583,41370,15071,15508, 19814,5716, 32502,38223,35952,33874,32965,35658,38969,41369,41369,3466, 27505,8094, 23100,16761,37238,24617,20046,37506,41369,39135,37161,7248, 25494,3169, 41369, 38350,37487,34977,33906,5992, 34294,33728,39134,15262,14354,13417,17594,22295,6370, 41368,16241,16671,29705,11064,4384, 26847,5621, 24729,34645,21990,10525,21933, @@ -19500,9 +19495,9 @@ static const unsigned short Ranks[197839] = 33643,41365,34298,41365,13705,35145,11468,34399,41365,26730,35145,5004, 41365,6097, 18798,1163, 2577, 14234,29098,24676,12203,20942,33628,35804,17080,23358,39377, 36821,20773,38542,38689,14892,15319,30664,6032, 35709,23334,33035,9026, 8552, 24230,32965,31530,41364,15427,22294,11467,24229,4827, 5871, 35220,41364,13620,20162, 9247, 33582,39132,31108,33582,41364,4156, 38096,28548,31268,6323, 39128,18797,38407,33272,34666,35748,36192,36192,5012, 41364,9804, 15195,36192,2732, 7700, 31093, - 41363,30454,32964,16367,656, 12078,2154, 5757, 22920,7672, 37487,31529,1577, 33829,20903,18796,41363,13506,9117, 37592,34297,32964,4469, 11562,35145,37487,2827, + 41363,30454,32964,16367,656, 12078,2154, 5757, 22920,7672, 37487,31529,1577, 33829,20903,18796,41363,13506,9117, 37592,34297,32964,4469, 11562,35145,37487,2827, 37486,37486,16240,15261,32932,3825, 32964,17125,23193,6132, 296, 33776,20161,4329, 9214, 21133,37486,23166,39137,39132,35145,37486,22293,5940, 33504,3216, 15260, - 16760,35144,503, 39132,39131,42, 28170,20160,31528,3175, 34297,35335,41363,12734,1006, 4806, 12012,10883,29785,24228,24227,41363,36192,11113,5215, 35362,7227, + 16760,35144,503, 39132,39131,42, 28170,20160,31528,3175, 34297,35335,41363,12734,1006, 4806, 12012,10883,29785,24228,24227,41363,36192,11113,5215, 35362,7227, 14510,41362,41362,5790, 34384,18207,869, 30667,24094,28221,13922,21723,29704,39267,41362,38202,41362,38691,37485,34114,14353,10833,41361,2184, 11670,18755,17593, 5465, 34292,7537, 33582,34297,30882,33045,41361,39131,37485,41361,39338,35144,34297,34296,26640,37485,38896,24964,242, 7553, 28688,36664,12345,6221, 18139,22292, 39131,41361,24226,35670,41360,20045,36897,35144,39131,39130,19380,14161,12287,4170, 34846,18795,37485,5412, 37899,32894,38530,7772, 38056,13619,41360,18794,33568, @@ -19511,29 +19506,29 @@ static const unsigned short Ranks[197839] = 28771,11509,33659,34868,33067,3510, 41359,4914, 13618,14628,35144,38311,35678,37356,34524,2439, 38386,22557,39130,36191,36191,419, 36762,23766,41359,15136,30351, 10605,22197,38142,34224,29122,16323,29703,7771, 30648,41358,2038, 3019, 32851,2718, 39129,12011,7522, 30221,12732,12010,23546,11669,32830,41358,33582,33581,37484, 12639,36467,7376, 38198,37777,17123,12344,8326, 4056, 12818,14120,10476,15219,12657,34850,18491,657, 15200,18792,32697,10604,35143,4071, 17122,1080, 32947,28322, - 35143,17968,5196, 3153, 528, 21966,27435,7935, 29715,8146, 18754,36190,896, 17828,36190,12882,20159,20158,25367,39129,41358,41358,16239,6560, 6482, 13149,4604, + 35143,17968,5196, 3153, 528, 21966,27435,7935, 29715,8146, 18754,36190,896, 17828,36190,12882,20159,20158,25367,39129,41358,41358,16239,6560, 6482, 13149,4604, 10742,904, 1311, 8431, 41357,39129,1920, 32963,16199,26335,11668,28096,9738, 20157,10616,16238,20156,5178, 10389,2724, 21670,20155,31278,17933,8053, 17365,31798, 1658, 19653,7794, 20098,32778,25877,15806,8565, 10832,20154,33581,21479,36190,2162, 21495,32587,1926, 12860,1271, 17595,3952, 7108, 14627,24831,5448, 6638, 20153, - 8544, 20152,9556, 13157,41357,16758,37483,4120, 6741, 11112,9605, 21102,34, 17517,36388,15243,9348, 20322,17533,26639,41357,36190,31526,22006,31525,8089, 6369, + 8544, 20152,9556, 13157,41357,16758,37483,4120, 6741, 11112,9605, 21102,34, 17517,36388,15243,9348, 20322,17533,26639,41357,36190,31526,22006,31525,8089, 6369, 32885,21554,18083,17121,14119,16757,8415, 28841,25337,30806,1281, 7467, 36189,35290,557, 32963,39107,36760,16756,37483,33043,29702,32963,37483,21451,33054,14595, 5309, 36497,41357,21506,38248,6042, 12146,39271,39129,2238, 33958,16237,33581,18787,5049, 3392, 10831,16755,37483,26158,12731,189, 2169, 32500,11672,12202,20088, 33036,24802,23172,8640, 41356,38748,12901,39128,31524,33906,33581,26638,32962,19186,38734,34119,21674,39128,14626,14352,39128,22494,5371, 15259,6318, 35573,32883, - 3287, 6420, 15946,41356,3615, 28095,33318,31523,474, 14485,29828,7107, 12012,18284,940, 36406,33768,37632,22833,7106, 20151,37574,35143,36279,13617,27985,2368, - 32841,19628,17084,1544, 948, 14731,36887,5364, 16754,12009,34343,27304,24178,15867,34002,38052,19432,1261, 41356,18862,34384,18723,9360, 6519, 16753,35641,8462, - 820, 35889,840, 29701,9527, 28210,36658,36908,39128,16376,33112,8929, 22664,854, 225, 29738,12978,5405, 28057,37482,34826,36189,34296,25366,32962,489, 5225, + 3287, 6420, 15946,41356,3615, 28095,33318,31523,474, 14485,29828,7107, 12012,18284,940, 36406,33768,37632,22833,7106, 20151,37574,35143,36279,13617,27985,2368, + 32841,19628,17084,1544, 948, 14731,36887,5364, 16754,12009,34343,27304,24178,15867,34002,38052,19432,1261, 41356,18862,34384,18723,9360, 6519, 16753,35641,8462, + 820, 35889,840, 29701,9527, 28210,36658,36908,39128,16376,33112,8929, 22664,854, 225, 29738,12978,5405, 28057,37482,34826,36189,34296,25366,32962,489, 5225, 25841,20554,37482,41356,41355,37898,32962,33580,26025,7466, 11077,34569,34012,36737,32297,35143,37482,11119,33048,17703,36584,9016, 12824,33261,2314, 247, 24659, 17070,9876, 14785,22616,34059,38517,28834,19594,17743,6835, 25417,33804,16138,34566,8473, 34503,28094,36594,38764,41355,12002,41355,41355,21904,35856,19725,36591, 10092,36418,28368,17198,30961,29375,9878, 32601,37482,34255,41354,14005,30742,19314,36228,35172,36189,34296,28093,41354,41354,38979,36810,10072,34296,39127,29035, 35142,5095, 39120,34736,4257, 14921,26660,35191,24117,31392,7545, 19240,14625,39127,22586,33798,12335,24739,39418,24387,33011,18206,36950,41354,19681,17619,41353, 37481,33998,35142,30088,20839,17710,41353,11914,39127,23858,2436, 29700,41353,18744,35142,39364,29169,32962,22257,27182,36310,36189,39171,33033,30142,4648, 32984, - 24460,32961,31189,39127,19372,21020,8760, 2640, 15893,25991,29599,6706, 13616,32691,18332,41353,12393,3739, 10673,38489,36747,36026,13704,41352,12715,36904,1026, - 20150,20149,36188,11111,17702,8845, 9359, 36188,39126,1174, 39126,39005,32539,38692,94, 36188,8367, 12538,37481,36188,39173,6974, 27296,20060,32042,1634, 4155, + 24460,32961,31189,39127,19372,21020,8760, 2640, 15893,25991,29599,6706, 13616,32691,18332,41353,12393,3739, 10673,38489,36747,36026,13704,41352,12715,36904,1026, + 20150,20149,36188,11111,17702,8845, 9359, 36188,39126,1174, 39126,39005,32539,38692,94, 36188,8367, 12538,37481,36188,39173,6974, 27296,20060,32042,1634, 4155, 9555, 15920,18791,28824,6604, 35993,35800,41352,36187,17591,41352,35142,15426,33580,17120,37886,2527, 20148,32240,41352,37481,17119,16669,41351,35141,24864,34894, 30219,9554, 29475,20147,35141,16832,35090,39126,37857,39126,34670,36978,32473,29312,34295,37733,39125,20857,25680,33003,25303,37869,20744,19160,22284,30150,20742, 32404,438, 41351,37481,13079,11190,32998,34880,41351,16399,25691,37480,35141,27364,10092,1946, 2075, 10503,38477,26664,29197,17817,2962, 25552,39125,33252,32871, 22180,26337,36187,35141,37480,25365,34088,36187,7267, 34225,33084,12730,37480,36218,37480,37196,25213,41351,34295,19379,36948,22254,37479,6538, 35953,41350,39149, - 33580,41350,32028,34082,41350,17791,11879,13504,39125,25685,24224,20044,10372,39401,37864,7157, 24223,33580,4484, 26637,7465, 38068,41350,14002,20043,36187,4100, - 16421,32888,25641,29240,15425,35870,1818, 37479,29838,27421,3247, 32895,39125,22602,41349,35140,23164,39124,36186,3837, 5300, 2060, 1086, 1398, 33406,4983, 8564, + 33580,41350,32028,34082,41350,17791,11879,13504,39125,25685,24224,20044,10372,39401,37864,7157, 24223,33580,4484, 26637,7465, 38068,41350,14002,20043,36187,4100, + 16421,32888,25641,29240,15425,35870,1818, 37479,29838,27421,3247, 32895,39125,22602,41349,35140,23164,39124,36186,3837, 5300, 2060, 1086, 1398, 33406,4983, 8564, 16386,4002, 13384,25053,32892,13641,33366,8872, 37521,35215,35091,9481, 16239,34593,4982, 34281,9315, 33500,41349,28657,26636,41349,19402,38039,18790,36559,33607, 38729,35018,39124,39124,36460,36186,22822,32376,11175,575, 208, 32201,23163,33635,9650, 33579,9455, 35787,35333,16616,29970,13027,30651,31522,24222,24221,33704, 37479,34422,36880,35140,37565,12638,13183,11667,19928,32540,24220,2376, 10830,18217,36109,36186,35596,18527,37632,39124,36453,41349,20724,20146,36186,33579,32851, @@ -19542,28 +19537,28 @@ static const unsigned short Ranks[197839] = 35997,24507,37398,17231,17403,18934,23731,20143,37121,35140,35529,33537,5021, 5541, 8145, 8416, 33317,32920,13614,12728,20142,5870, 37592,33975,18788,35407,32504, 30036,24386,12008,12727,8699, 36159,6637, 18066,5718, 29402,5195, 8698, 5016, 22030,38996,8844, 5159, 14118,13156,6802, 9213, 35780,13126,1315, 4135, 34464,15918, 15917,18787,5405, 21342,21890,30971,14623,10603,11765,30709,11666,15916,18786,20141,28128,9942, 6255, 39123,35002,14117,20140,38581,7737, 16419,35009,4069, 16949, - 5589, 35139,29006,20139,38756,5715, 26333,17700,18785,10602,15915,16845,20138,17699,41348,18784,17778,761, 10829,3740, 23169,18783,7898, 22007,20137,35675,1406, + 5589, 35139,29006,20139,38756,5715, 26333,17700,18785,10602,15915,16845,20138,17699,41348,18784,17778,761, 10829,3740, 23169,18783,7898, 22007,20137,35675,1406, 34254,37555,4954, 20136,33011,25793,9553, 31804,15944,16752,7105, 10601,11108,34718,18492,36012,9941, 2047, 15258,15257,36608,7237, 34979,35637,18912,8697, 13155, 13367,35508,8596, 28723,26280,35933,7180, 13154,34650,20135,38404,35001,32810,38807,20134,6559, 5971, 15256,20883,36951,8844, 33772,38296,34279,13613,32781,10388, 3728, 18378,21784,22739,4253, 34324,14116,27439,36771,5114, 29724,16670,27449,10600,18782,67, 26775,5973, 20133,34990,11383,36185,26904,39281,20628,11350,31880, - 38243,37387,32961,2595, 35860,17698,39227,15255,35989,16236,36980,15918,36148,2391, 22109,17118,39123,3003, 5127, 20132,8563, 35786,15914,32994,18781,16751,4875, - 9884, 5292, 6106, 12343,2677, 10230,14136,31397,1710, 22098,36528,7179, 25286,3383, 37478,29699,32193,36185,22144,21361,17697,12726,33237,20131,17696,20130,3712, + 38243,37387,32961,2595, 35860,17698,39227,15255,35989,16236,36980,15918,36148,2391, 22109,17118,39123,3003, 5127, 20132,8563, 35786,15914,32994,18781,16751,4875, + 9884, 5292, 6106, 12343,2677, 10230,14136,31397,1710, 22098,36528,7179, 25286,3383, 37478,29699,32193,36185,22144,21361,17697,12726,33237,20131,17696,20130,3712, 5048, 10660,16750,9358, 1970, 26322,38324,13612,5447, 13434,12972,17166,34814,35707,34826,34240,27126,24280,23844,36546,25413,11665,15913,26969,24717,25652,32955, - 35904,14487,17091,20766,17695,7292, 23341,33340,11382,17694,171, 3063, 9552, 1331, 19625,1936, 10828,4332, 1342, 35195,19559,35538,38352,7360, 37058,4059, 6089, + 35904,14487,17091,20766,17695,7292, 23341,33340,11382,17694,171, 3063, 9552, 1331, 19625,1936, 10828,4332, 1342, 35195,19559,35538,38352,7360, 37058,4059, 6089, 3636, 2503, 35494,15426,6844, 18059,35807,21692,4369, 7216, 37605,36410,33621,21765,4530, 4791, 30942,1866, 34105,3278, 34538,25818,15808,433, 15954,4449, 20129, - 33403,29832,19048,33175,24183,36953,16749,20022,10340,27295,12725,14115,17131,23878,9740, 33407,10387,26078,36196,28079,17693,6993, 17692,11202,25487,14040,8562, + 33403,29832,19048,33175,24183,36953,16749,20022,10340,27295,12725,14115,17131,23878,9740, 33407,10387,26078,36196,28079,17693,6993, 17692,11202,25487,14040,8562, 32788,3288, 14340,9212, 6189, 34356,6636, 17140,7488, 8561, 5972, 11664,13153,14233,38878,15254,7455, 32271,17691,9858, 35999,35685,28885,36846,6705, 32416,33738, 22136,15253,33242,15252,4531, 4143, 35376,17690,17689,32936,35341,24590,10554,37701,38799,15912,14622,4610, 34557,5580, 8100, 31500,11663,2583, 6402, 26722,11381, 10154,23321,18780,17688,38241,1889, 9025, 17687,4878, 7454, 38029,20128,14621,11413,30149,17142,34005,35833,33694,33284,11380,11379,35249,34581,3807, 4913, 17686, 34930,11378,8843, 16398,13611,15251,35988,9737, 7770, 19614,4448, 15035,10386,2537, 1059, 9736, 35267,37424,8842, 17685,13610,12724,32446,17684,34442,7464, 26635, - 34467,14001,23162,38196,2035, 37478,36185,37478,36185,17683,41348,38986,39123,15911,13152,38624,3881, 18779,32063,38831,19329,37478,2941, 14620,18778,7104, 2050, - 8282, 18307,6131, 8841, 37272,39057,33976,37385,30644,14619,7103, 9940, 17682,31200,33878,41348,20418,37677,34957,37788,16562,38989,9995, 33221,33579,34320,8718, + 34467,14001,23162,38196,2035, 37478,36185,37478,36185,17683,41348,38986,39123,15911,13152,38624,3881, 18779,32063,38831,19329,37478,2941, 14620,18778,7104, 2050, + 8282, 18307,6131, 8841, 37272,39057,33976,37385,30644,14619,7103, 9940, 17682,31200,33878,41348,20418,37677,34957,37788,16562,38989,9995, 33221,33579,34320,8718, 35512,18284,865, 8110, 10827,37462,19129,17681,37725,34488,12170,38003,6360, 30032,26568,34107,5834, 3559, 36857,32771,1901, 11107,12862,9666, 3764, 12728,12356, 37477,12124,15146,16598,37596,10599,16748,20127,33710,7769, 18405,32344,26846,2479, 35490,18777,26562,8643, 12007,27452,17680,36328,17679,35739,16747,14225,15910, 14114,19560,16746,10385,4877, 16745,38668,286, 23976,32576,38701,16674,5969, 11067,33054,37360,25830,3055, 38655,27963,26708,38783,1104, 7280, 12540,34383,36386, - 16744,13384,34920,34452,604, 16995,36707,8550, 34088,27270,7359, 24677,6170, 70, 8488, 28084,16422,9200, 558, 2955, 28156,29746,35628,18610,18726,4795, 1739, + 16744,13384,34920,34452,604, 16995,36707,8550, 34088,27270,7359, 24677,6170, 70, 8488, 28084,16422,9200, 558, 2955, 28156,29746,35628,18610,18726,4795, 1739, 35782,26916,15675,37811,18566,7148, 29703,1490, 22138,13943,8853, 8382, 6673, 19407,27744,33667,32725,17273,33188,13322,30980,8931, 23447,26194,1537, 69, 28284, - 12340,6518, 11106,38335,23400,15250,35205,11105,41347,7995, 35288,35880,15009,1283, 17013,18776,13609,37477,8319, 21615,17678,7656, 7102, 30015,15909,34247,478, + 12340,6518, 11106,38335,23400,15250,35205,11105,41347,7995, 35288,35880,15009,1283, 17013,18776,13609,37477,8319, 21615,17678,7656, 7102, 30015,15909,34247,478, 14896,17677,1300, 3533, 17162,5767, 37570,9735, 38225,5011, 10826,12006,4010, 23290,5672, 14113,13151,18775,12005,5920, 17707,20126,35049,8118, 8144, 6739, 15908, 19162,34796,20947,18774,15249,39112,35173,36845,13608,33678,11662,37972,22337,33809,33911,36888,5059, 29698,5919, 36775,10825,3624, 35823,20125,17676,18773,11104, 41347,29962,37415,41347,11103,25059,9211, 34595,28797,39392,33955,38169,14712,37916,4027, 9810, 16743,7035, 38594,12423,34928,7178, 5010, 9024, 7453, 8712, 31248, @@ -19571,19 +19566,19 @@ static const unsigned short Ranks[197839] = 33364,12981,6130, 17529,33633,7655, 20226,13607,7352, 10153,12723,18772,35663,23409,34274,12722,38331,21839,33072,29697,32961,7768, 16742,12721,37327,13606,34925, 38227,1211, 7767, 34340,4581, 34336,33387,15906,18525,22335,35843,18444,18886,11913,5152, 5143, 26426,28310,6781, 20123,33887,25580,36131,11102,19264,6869, 10152, 5915, 30621,10455,20122,37525,34391,34669,33882,15905,35583,25364,5441, 13150,25956,9643, 14112,34163,16741,13532,18771,17675,19474,10151,33079,10384,12341,31666, - 20121,32187,12720,17674,14617,17673,17672,16431,34947,20120,23789,9356, 7176, 7897, 33578,15563,13149,8281, 13148,32961,34675,9232, 39241,17301,20998,11377,6780, - 33293,24394,6359, 12719,9333, 36667,17671,36170,8696, 33870,38620,4074, 27447,37226,33122,7359, 20699,23060,15247,12718,17670,2468, 4004, 8903, 24379,12717,9938, + 20121,32187,12720,17674,14617,17673,17672,16431,34947,20120,23789,9356, 7176, 7897, 33578,15563,13149,8281, 13148,32961,34675,9232, 39241,17301,20998,11377,6780, + 33293,24394,6359, 12719,9333, 36667,17671,36170,8696, 33870,38620,4074, 27447,37226,33122,7359, 20699,23060,15247,12718,17670,2468, 4004, 8903, 24379,12717,9938, 18291,8840, 28248,37149,23690,8012, 17262,29869,18753,15904,36184,16740,16739,20119,18770,17531,23026,30327,35139,37326,41347,39123,38209,32960,39122,36184,11376, 37477,7175, 37159,4307, 10383,24219,101, 10150,34561,11653,4331, 15903,36237,8695, 20118,9734, 13147,9937, 15246,33197,14079,38404,6558, 11661,20117,34950,15499, - 6554, 1768, 4937, 20116,39122,12004,4188, 9210, 36778,33328,39122,37583,38948,6501, 12340,37511,15245,15902,11101,9355, 27700,18769,7068, 29367,16103,19932,6635, - 36993,10149,16738,14616,32167,8415, 35438,12716,38095,18768,12715,20115,33578,15244,15829,24218,39, 21202,39335,35139,15605,20543,11819,39254,7570, 7896, 9936, - 2515, 3226, 3269, 3123, 5390, 11497,12900,25363,9511, 11837,38333,32882,24217,26005,36671,22303,36563,6868, 4356, 3423, 6580, 8840, 9246, 35139,13604,21228,6035, + 6554, 1768, 4937, 20116,39122,12004,4188, 9210, 36778,33328,39122,37583,38948,6501, 12340,37511,15245,15902,11101,9355, 27700,18769,7068, 29367,16103,19932,6635, + 36993,10149,16738,14616,32167,8415, 35438,12716,38095,18768,12715,20115,33578,15244,15829,24218,39, 21202,39335,35139,15605,20543,11819,39254,7570, 7896, 9936, + 2515, 3226, 3269, 3123, 5390, 11497,12900,25363,9511, 11837,38333,32882,24217,26005,36671,22303,36563,6868, 4356, 3423, 6580, 8840, 9246, 35139,13604,21228,6035, 10148,22290,5869, 14928,32875,15901,10382,31209,29564,30508,11404,8725, 12936,12276,21922,11660,33815,21478,12003,12506,8276, 18767,33503,20831,33421,34295,34105, 11471,39122,36377,378, 8280, 41346,727, 26912,32997,34727,17679,18638,14615,14876,16737,33172,37477,14111,27809,9100, 32004,34655,36110,6197, 34208,3403, 11230, - 14715,12714,12339,17669,34762,2240, 38548,8694, 418, 5579, 2489, 3121, 15243,20723,2322, 21008,28515,22823,10524,14110,18766,712, 6129, 17668,39088,7358, 5000, + 14715,12714,12339,17669,34762,2240, 38548,8694, 418, 5579, 2489, 3121, 15243,20723,2322, 21008,28515,22823,10524,14110,18766,712, 6129, 17668,39088,7358, 5000, 25389,34517,24216,12548,41346,35138,17244,36184,26903,33578,3706, 39121,1987, 5336, 33948,27432,19988,35138,7238, 35312,6704, 27050,34079,32535,4184, 36184,38179, 34071,12539,23048,20366,23161,31521,24215,30360,4897, 37476,3790, 39091,35735,33808,37476,33711,23160,39121,20722,932, 9908, 35138,34330,13416,31520,15828,37476, - 29696,21376,31591,17228,38048,11847,14832,10882,9929, 39121,34294,21825,33578,38760,41346,2949, 36183,19720,38123,36183,37476,14077,21117,34294,34132,41346,5342, + 29696,21376,31591,17228,38048,11847,14832,10882,9929, 39121,34294,21825,33578,38760,41346,2949, 36183,19720,38123,36183,37476,14077,21117,34294,34132,41346,5342, 14885,15051,4271, 22289,41345,12145,36183,12637,35138,37747,18765,34269,25362,35137,3569, 4275, 32708,9551, 2213, 13146,5918, 8279, 6349, 34294,37475,21732,38197, 10881,4857, 37475,2362, 31367,12636,14000,34560,23159,28091,28451,41345,14614,20114,12344,12713,16736,17667,4378, 33577,29695,21477,41345,33656,28090,33577,37916, 12338,19832,41345,7471, 33062,24823,19378,37475,19371,34985,39121,37583,5099, 41344,16735,36958,37896,17666,21138,36681,21417,37475,34614,5898, 39120,23158,35137, @@ -19591,8 +19586,8 @@ static const unsigned short Ranks[197839] = 38675,37474,39120,39120,35864,39120,25361,39119,35136,4173, 7880, 36538,25366,25561,17665,33550,34486,37474,36183,73, 20113,885, 1713, 31153,37453,11320,15967, 8519, 17307,37320,41343,38018,6547, 24421,2313, 17794,29278,14131,36292,39265,37723,37115,36951,2829, 36007,38402,35345,35470,7129, 35329,38044,5268, 38705,24423, 17559,41343,36780,4964, 9881, 128, 64, 37010,2188, 33303,11633,2106, 33577,15050,19063,1567, 14593,30233,24718,9138, 32917,27678,4201, 20112,29790,1467, 26634, - 713, 39119,21630,20046,37751,33226,10770,2677, 36763,36227,3863, 14962,17664,13145,41343,41343,32520,35830,38930,36182,35136,9354, 41342,272, 21526,35937,7723, - 20138,36642,5801, 2409, 28447,8875, 25320,11568,15845,2597, 23499,31825,36329,18639,34892,37473,23817,34622,36830,35874,27007,29131,38276,35425,14351,11254,2232, + 713, 39119,21630,20046,37751,33226,10770,2677, 36763,36227,3863, 14962,17664,13145,41343,41343,32520,35830,38930,36182,35136,9354, 41342,272, 21526,35937,7723, + 20138,36642,5801, 2409, 28447,8875, 25320,11568,15845,2597, 23499,31825,36329,18639,34892,37473,23817,34622,36830,35874,27007,29131,38276,35425,14351,11254,2232, 35609,4301, 32042,16734,3725, 35334,8145, 29762,16733,16552,38246,18582,14613,21063,41342,25940,36995,1095, 432, 546, 39115,20111,25505,17178,18802,36647,33189, 28045,35802,23514,2143, 7829, 32927,38157,5671, 38676,2756, 10523,36943,37254,12002,25102,15921,13144,7357, 18726,19473,26633,32847,30556,17456,17066,27556,11392, 24469,16039,10456,22612,14967,14355,26580,5736, 3453, 9579, 5811, 4289, 7419, 5975, 6505, 18070,15076,35756,3250, 7101, 38327,21502,2115, 12646,6629, 22139,34007, @@ -19607,10 +19602,10 @@ static const unsigned short Ranks[197839] = 37622,39117,32784,19425,26946,36903,38545,36181,33203,41338,35135,41338,37619,39117,26980,33419,24363,41337,24744,34293,28405,41337,41337,34858,899, 30732,32960, 19377,2492, 39116,16483,37472,32997,33124,39116,32794,694, 32959,31516,11464,15826,32959,35084,41337,41336,20039,2156, 10212,9425, 41336,16668,19376,2373, 28084, 308, 5212, 34292,25360,39116,23650,34292,7463, 3810, 9150, 11099,34292,39116,33576,11344,20731,836, 12074,35239,38750,20335,38479,3018, 24123,21999,41336,36180, - 27568,16235,5939, 3754, 33582,592, 874, 651, 5971, 32959,23725,30542,4247, 38239,41336,13998,35134,36180,770, 18205,41335,31797,983, 32999,24407,2779, 804, + 27568,16235,5939, 3754, 33582,592, 874, 651, 5971, 32959,23725,30542,4247, 38239,41336,13998,35134,36180,770, 18205,41335,31797,983, 32999,24407,2779, 804, 26171,17473,39115,33576,149, 11353,22769,39115,3202, 36404,18751,15858,6117, 13877,7462, 2461, 20720,33575,5916, 15900,36328,29949,12392,34065,41335,1808, 17060, 19543,5867, 30164,20109,31081,3391, 10381,11271,20108,27286,9874, 36500,5814, 28603,35134,16667,34292,29690,36171,36180,31515,36180,15241,34291,6557, 15451,34276, - 32959,34577,22669,33575,3024, 34560,34008,20038,36968,36179,5179, 11695,39115,20719,31514,37472,39115,41335,19375,31513,1458, 32031,14350,8325, 39114,2731, 8775, + 32959,34577,22669,33575,3024, 34560,34008,20038,36968,36179,5179, 11695,39115,20719,31514,37472,39115,41335,19375,31513,1458, 32031,14350,8325, 39114,2731, 8775, 41335,26631,37512,16732,41334,36179,34291,12144,3002, 14697,34291,513, 22801,39074,4451, 6684, 26630,18169,29689,39114,1995, 31512,22285,6481, 24212,41334,32958, 31637,10371,22864,12143,26629,39114,39114,19374,39113,25654,30652,20107,37033,15213,22284,10380,1301, 35933,18760,41334,37471,15125,11006,41334,37471,2920, 34789, 35558,41333,35134,39113,37165,13978,13415,2282, 10147,9168, 28497,850, 36409,4060, 1556, 24963,37258,34291,3823, 37711,5211, 6226, 15825,38216,14107,14610,14609, @@ -19645,14 +19640,14 @@ static const unsigned short Ranks[197839] = 18745,27587,28083,34354,36167,3754, 33568,41311,2594, 3348, 22451,13910,35366,39099,38559,28918,37889,20591,35747,41310,13701,10573,33568,22276,24361,36167,28063, 7761, 35636,15898,4645, 20104,8011, 39098,8303, 13808,10379,31498,34968,23152,23954,36167,16229,2876, 32954,24201,37457,18205,12774,32936,13415,18599,34083,11824, 3692, 21245,36166,35623,3232, 22925,7811, 37457,33568,11786,35233,32498,28062,18744,18759,25627,35123,35315,35490,33680,39098,34285,8195, 192, 41310,11676,23202, - 8333, 33136,35123,8428, 12358,7548, 17581,18198,41310,9245, 41310,34284,41309,41309,34840,36166,41309,2431, 16228,37456,36166,41309,25727,35351,33134,31497,9230, + 8333, 33136,35123,8428, 12358,7548, 17581,18198,41310,9245, 41310,34284,41309,41309,34840,36166,41309,2431, 16228,37456,36166,41309,25727,35351,33134,31497,9230, 38540,20103,41308,19761,25615,32350,33449,11044,27658,37456,7766, 36166,41308,12999,16729,35123,11910,41308,4323, 34247,10245,30606,38868,22275,39098,37456,41308, 27674,41307,23919,16028,8081, 37962,38257,36165,28876,14695,740, 33567,276, 41307,16664,2730, 39098,2762, 11325,29938,19427,10795,41307,36091,36165,20035,41307, 37456,39097,17111,35122,16770,5065, 11915,13700,41306,35122,37455,36034,16663,32696,15897,35225,23151,14106,41306,41306,33876,13414,20511,29456,15799,12558,28410, - 16925,30397,13297,21374,10701,18169,24980,23985,32971,17580,18743,457, 36165,14505,7806, 29492,17231,28490,29283,29922,6630, 7142, 39097,26059,17972,10061,4986, + 16925,30397,13297,21374,10701,18169,24980,23985,32971,17580,18743,457, 36165,14505,7806, 29492,17231,28490,29283,29922,6630, 7142, 39097,26059,17972,10061,4986, 9927, 24060,11662,32971,24025,19211,14162,5620, 13607,36466,14557,39372,5656, 41306,3540, 10700,25351,35122,8427, 14694,39097,8874, 41305,11062,23150,41305,31761, - 31496,31495,36165,2296, 25350,35122,35470,41305,35121,15578,36898,2485, 38137,34523,6527, 1764, 1046, 13685,14220,3072, 18758,35256,36164,8618, 39097,37756,9022, - 33323,28061,37737,15434,33552,20794,37455,24200,15238,23745,18757,18756,41305,22737,34284,327, 13947,38620,36891,41304,1341, 6856, 8514, 29783,39096,27058,644, + 31496,31495,36165,2296, 25350,35122,35470,41305,35121,15578,36898,2485, 38137,34523,6527, 1764, 1046, 13685,14220,3072, 18758,35256,36164,8618, 39097,37756,9022, + 33323,28061,37737,15434,33552,20794,37455,24200,15238,23745,18757,18756,41305,22737,34284,327, 13947,38620,36891,41304,1341, 6856, 8514, 29783,39096,27058,644, 29608,41304,31586,3478, 3850, 33775,4950, 21676,16728,24216,3642, 15386,38711,32905,10824,12712,36164,41304,9182, 6421, 5842, 26616,24051,14034,1336, 1346, 11742, 12352,4845, 39096,33567,28663,25279,39106,13143,37455,26885,4231, 28060,8560, 41304,4483, 16662,14105,5273, 28620,37455,4055, 11675,12142,41303,12635,39096,41303, 32954,31494,27315,17291,39096,1260, 35121,24199,18976,5655, 39095,21470,22274,1813, 17110,596, 26615,35935,11462,34284,37454,856, 10106,37058,1195, 24877,27539, @@ -19664,21 +19659,21 @@ static const unsigned short Ranks[197839] = 3020, 7452, 20660,30189,41301,37132,37452,35825,39233,41300,2237, 31491,41300,35593,29893,17658,1329, 21812,12467,21678,21144,24493,41300,24416,27991,41300,15045, 39093,23149,35120,35120,3390, 39093,24196,5503, 20240,11655,24522,11383,35096,35090,37784,41299,14475,18197,28058,39093,20710,33341,3915, 31636,36905,18753,22112, 13995,41299,18752,14605,38968,7569, 5009, 34994,15823,10378,34933,10206,35119,37452,41299,8434, 22873,36754,37908,35119,24195,37452,41299,13602,26109,13597,17657, - 14103,33566,13141,19978,34283,17126,34283,8277, 25202,41298,1429, 24453,2369, 28341,10513,37451,39092,39127,38224,4452, 20709,18281,20708,26614,37021,22118,2287, + 14103,33566,13141,19978,34283,17126,34283,8277, 25202,41298,1429, 24453,2369, 28341,10513,37451,39092,39127,38224,4452, 20709,18281,20708,26614,37021,22118,2287, 2969, 39300,1131, 10036,37126,35311,15423,34283,12000,37451,28057,21469,39092,2676, 25550,8163, 29298,15044,216, 14604,8300, 37584,15237,13599,23570,37770,22581, 37451,34915,15422,32953,4314, 33566,4486, 12265,30037,11923,23232,41298,26923,1257, 26613,37447,36162,35008,41298,41298,41297,37609,21949,41297,5760, 24194,21609, 36162,13994,38182,41297,1065, 15236,33185,33731,6357, 23680,21468,2381, 24155,37654,36162,31490,36161,20477,8129, 2987, 20224,2501, 32953,38203,41297,3563, 41296, - 35119,29674,32953,37451,5897, 12149,36161,4753, 37270,13186,34283,6602, 38171,22466,41296,34282,2500, 36251,37697,16660,41296,39092,15518,41296,3908, 26612,3864, - 35119,38878,13140,21467,24852,9082, 37450,1478, 28805,32953,34834,35118,20098,41295,35118,35118,36161,20034,34282,34282,22272,35118,35117,28948,36161,20119,8296, + 35119,29674,32953,37451,5897, 12149,36161,4753, 37270,13186,34283,6602, 38171,22466,41296,34282,2500, 36251,37697,16660,41296,39092,15518,41296,3908, 26612,3864, + 35119,38878,13140,21467,24852,9082, 37450,1478, 28805,32953,34834,35118,20098,41295,35118,35118,36161,20034,34282,34282,22272,35118,35117,28948,36161,20119,8296, 7437, 36000,33137,4949, 15896,41295,38300,16727,36175,38557,38488,25348,9733, 1699, 19497,26100,12872,10793,3597, 11964,36160,37450,39232,34079,20318,37450,39092, - 1267, 22732,13173,29211,37629,37450,2605, 24193,2604, 39091,39091,3691, 37449,41295,16182,36246,15895,35117,13139,23148,18742,36313,14166,4508, 29673,24192,7007, + 1267, 22732,13173,29211,37629,37450,2605, 24193,2604, 39091,39091,3691, 37449,41295,16182,36246,15895,35117,13139,23148,18742,36313,14166,4508, 29673,24192,7007, 2358, 10542,13138,560, 350, 6532, 32952,19455,39091,11928,1120, 9772, 28167,2015, 37449,35534,23797,37449,3537, 1057, 1799, 32952,1724, 36160,177, 38633,28574, 34282,16608,41295,19772,36160,26611,1664, 24757,39091,23765,34281,7508, 158, 36789,21609,879, 19870,3325, 39090,28056,39090,39207,37449,36160,37448,6679, 11250, - 20033,9649, 37448,39090,32952,39090,35117,32948,6254, 4050, 30673,39089,6738, 7944, 11486,33566,2874, 12336,41294,34281,4146, 34980,2131, 37389,303, 37711,1121, + 20033,9649, 37448,39090,32952,39090,35117,32948,6254, 4050, 30673,39089,6738, 7944, 11486,33566,2874, 12336,41294,34281,4146, 34980,2131, 37389,303, 37711,1121, 37448,28032,36159,33758,22271,31489,29672,1890, 13683,33030,19271,9521, 16665,11059,10096,16726,6905, 2599, 7355, 35859,6633, 36298,3062, 1502, 37448,25347,33565, 38721,35117,15894,28055,37826,39089,34166,14301,10522,27675,39089,39231,95, 19378,14673,7792, 15001,17460,25891,17860,20264,41294,34226,36935,20032,33565,32952, - 41294,34958,22270,11461,14344,36159,22084,15716,33899,39089,34394,36409,13328,32992,20048,9480, 39088,33565,16725,41294,27106,11061,39088,2134, 32951,31488,2082, - 26610,2337, 1082, 5799, 37688,11732,5535, 10699,36159,23786,21443,12335,38328,31247,16572,18751,34525,19576,39281,34063,36817,12225,12334,20097,29649,4330, 2649, + 41294,34958,22270,11461,14344,36159,22084,15716,33899,39089,34394,36409,13328,32992,20048,9480, 39088,33565,16725,41294,27106,11061,39088,2134, 32951,31488,2082, + 26610,2337, 1082, 5799, 37688,11732,5535, 10699,36159,23786,21443,12335,38328,31247,16572,18751,34525,19576,39281,34063,36817,12225,12334,20097,29649,4330, 2649, 21148,32147,2737, 2826, 24191,10377,23093,5990, 18530,33565,36159,5534, 12669,35189,18196,37447,13137,37447,29114,1871, 7356, 17656,13680,16324,3010, 39088,39088, 17535,31495,35524,14603,39087,34281,33662,16642,16724,39305,35816,24046,31487,38712,34281,41293,12895,36278,39087,32554,26871,6681, 2189, 22005,32726,18507,14909, 7697, 527, 26586,7041, 9367, 32201,12825,15241,14951,1539, 29339,30917,20050,15140,7465, 25628,10761,16501,2468, 18320,6514, 11133,20274,33001,3750, 21416,10778, @@ -19689,13 +19684,13 @@ static const unsigned short Ranks[197839] = 20031,36158,14343,3135, 36158,4876, 36585,20263,35695,7747, 27810,35254,8080, 36790,10376,8194, 19944,8142, 20263,11754,38235,37329,34663,34470,3218, 4700, 14338, 17109,13347,18741,20096,11999,21708,41293,889, 9280, 29178,24190,37447,36158,1689, 449, 39086,13928,33194,6626, 15015,32171,15893,34280,41293,9702, 20095,38564, 37446,15822,3651, 41293,2708, 32984,15892,16723,33576,1599, 35116,33564,1088, 35116,2695, 1350, 199, 12041,247, 14693,15821,24189,19364,9935, 367, 14878,25482, - 11375,29424,28053,32951,17655,37446,34465,1235, 24761,11374,15235,1980, 8971, 16980,38650,83, 8588, 25346,5932, 116, 11631,2201, 34909,28838,32370,41292,2956, + 11375,29424,28053,32951,17655,37446,34465,1235, 24761,11374,15235,1980, 8971, 16980,38650,83, 8588, 25346,5932, 116, 11631,2201, 34909,28838,32370,41292,2956, 37446,3614, 17578,12633,37033,5056, 27962,15930,35472,651, 6775, 27713,38229,38547,39086,34597,33991,21446,1026, 39085,19834,2514, 12894,36158,38211,32989,37446, 21466,34143,27582,39085,12893,30654,35116,35616,338, 5723, 34305,36130,33081,7660, 23184,18473,20094,34753,28255,23764,2158, 2648, 9732, 9020, 15891,37961,39022, 6107, 32951,7589, 37570,39139,27276,35116,41292,25345,33836,36157,34280,36157,5708, 13699,26609,35115,13507,13760,38154,37788,37605,27660,37792,9208, 39085,37445, 23336,37445,35115,36217,3882, 30284,15204,23147,24188,35115,34280,31486,36157,35115,19363,35114,39085,1992, 15159,41292,11826,10069,34280,18034,37328,41292,28842, 29669,3315, 32951,39084,17577,22268,41291,5178, 11060,41291,41291,41291,41290,6790, 32120,21465,36157,1504, 3073, 37445,34279,37445,39084,39084,18523,769, 21904, - 2301, 37444,5035, 2332, 10983,23445,3958, 36868,7715, 12038,1542, 4378, 2514, 20030,34046,41290,36156,18750,22267,18660,33058,34279,21464,28636,39084,37444,1063, + 2301, 37444,5035, 2332, 10983,23445,3958, 36868,7715, 12038,1542, 4378, 2514, 20030,34046,41290,36156,18750,22267,18660,33058,34279,21464,28636,39084,37444,1063, 11998,7895, 6188, 15890,39083,33299,30068,22266,15820,37444,37444,35114,39083,31485,25817,16403,32950,37443,12927,16214,37443,41290,7972, 10390,20830,7993, 37443, 41290,41289,39032,20410,25446,3392, 34008,24135,3705, 35016,7342, 13904,37237,35433,29298,25780,20182,18267,39083,9550, 7523, 33059,11383,33072,32029,26707,21686, 21548,19080,22723,22189,41289,39083,35536,28743,1007, 28596,244, 7705, 514, 3913, 28733,1266, 11919,38460,27930,796, 14949,1803, 16245,14385,3915, 33151,24345, @@ -19705,15 +19700,15 @@ static const unsigned short Ranks[197839] = 21503,39080,41287,24187,28049,34278,9508, 18740,11918,37442,894, 39080,39080,11674,39080,29667,39079,41287,7644, 37057,26482,3286, 36997,35114,37442,585, 25341, 31483,26013,35113,9382, 37441,3539, 39079,31482,36156,7080, 24186,18194,8335, 41286,15421,34221,32950,1139, 39225,13993,24185,41286,28048,41286,8426, 39078,34277, 19757,18193,39079,37441,33275,24664,38015,37441,14342,18749,10447,37441,13142,39079,33238,35057,41286,36614,37440,848, 34277,37156,19522,7635, 16226,39078,37440, - 39078,37354,38304,33001,33262,36076,32950,22913,7893, 1688, 37440,31481,36156,28047,33312,26614,28895,38230,33039,35980,20640,33567,570, 21463,9737, 9549, 113, - 4815, 23145,33782,39164,1923, 993, 18748,11659,7354, 31480,33564,41285,37440,20093,34819,35444,11997,12711,36052,4251, 18747,32730,34277,6273, 36067,38587,7174, + 39078,37354,38304,33001,33262,36076,32950,22913,7893, 1688, 37440,31481,36156,28047,33312,26614,28895,38230,33039,35980,20640,33567,570, 21463,9737, 9549, 113, + 4815, 23145,33782,39164,1923, 993, 18748,11659,7354, 31480,33564,41285,37440,20093,34819,35444,11997,12711,36052,4251, 18747,32730,34277,6273, 36067,38587,7174, 30568,24184,2282, 32950,31479,5002, 7010, 38185,37439,20246,38581,29666,26029,41285,32491,4606, 35113,3613, 39132,25340,37439,36102,35100,2055, 29665,12437,21313, - 32820,12333,16469,19078,33090,34658,34277,37134,23144,41285,839, 36126,4110, 33017,34393,21335,19247,39078,39078,41285,41284,38798,36079,15041,35113,8542, 3458, - 37439,16658,30449,240, 36642,26608,30692,6314, 3914, 10146,5671, 3240, 4796, 7205, 26738,30736,1586, 37926,2114, 26695,9019, 283, 21782,1274, 11658,26511,3484, - 1970, 3420, 28691,6270, 23202,11650,23562,37232,34275,41284,36155,7266, 18729,33755,447, 26037,1441, 24951,9394, 14078,24376,22930,18353,20538,5315, 21040,1929, + 32820,12333,16469,19078,33090,34658,34277,37134,23144,41285,839, 36126,4110, 33017,34393,21335,19247,39078,39078,41285,41284,38798,36079,15041,35113,8542, 3458, + 37439,16658,30449,240, 36642,26608,30692,6314, 3914, 10146,5671, 3240, 4796, 7205, 26738,30736,1586, 37926,2114, 26695,9019, 283, 21782,1274, 11658,26511,3484, + 1970, 3420, 28691,6270, 23202,11650,23562,37232,34275,41284,36155,7266, 18729,33755,447, 26037,1441, 24951,9394, 14078,24376,22930,18353,20538,5315, 21040,1929, 33564,31327,26607,20092,30070,34276,6407, 5196, 41284,9125, 36155,39077,29664,34273,16225,34276,20028,36155,41284,37439,37453,33841,39056,26606,38498,16722,24183, 39077,41283,3017, 672, 259, 39077,41283,924, 1064, 21264,993, 13135,7966, 35, 17059,33975,28147,5640, 34396,4875, 6187, 6876, 12766,27097,14602,27451,12332, - 36885,34403,35178,41283,35113,37438,38644,23970,39077,36155,37438,38666,41283,10559,19492,2561, 15208,36055,3110, 14601,4270, 8166, 36095,30595,19621,11356,9018, + 36885,34403,35178,41283,35113,37438,38644,23970,39077,36155,37438,38666,41283,10559,19492,2561, 15208,36055,3110, 14601,4270, 8166, 36095,30595,19621,11356,9018, 23689,36466,21174,36840,17108,36154,21920,18746,38067,1818, 17475,6538, 32120,36154,7892, 3939, 17654,17151,24829,29663,11227,41282,24389,15906,30647,26605,32949, 41282,33343,12710,37438,35112,37336,36154,12442,39076,11718,4577, 32069,27529,25769,15154,18739,27015,37438,28046,30673,18587,19185,37437,18745,6246, 33570,33385, 33167,6230, 2069, 11947,39076,25769,19544,20278,616, 13727,28694,30965,10050,2959, 810, 38118,21462,3162, 30716,1412, 17653,1919, 2879, 1840, 2825, 29662,37437, @@ -19722,37 +19717,37 @@ static const unsigned short Ranks[197839] = 41280,29661,31260,14609,38913,36154,36153,20462,23143,15420,39076,32949,34799,18192,37437,41280,21832,20027,14389,37131,38962,37759,30184,25191,16705,14341,38412, 20664,37437,41279,35112,41279,618, 37436,21461,15889,25176,10922,41279,39075,23543,36779,35422,8982, 27403,34487,28044,41279,35454,20705,19361,36153,25339,20091, 34276,38597,13780,37436,9874, 41278,36153,29660,24450,37634,6556, 1798, 32889,17651,39305,16310,8216, 2212, 15040,17650,29659,18191,39289,12709,17649,11909,20314, - 12502,23780,36153,12892,10205,18190,35133,25614,182, 30027,1280, 16430,19360,12390,17648,5970, 10823,38733,2014, 1994, 13141,36152,39075,28321,35137,32967,7114, - 9783, 41278,36152,20090,39075,39075,39074,6734, 15826,9226, 28807,37436,37436,10698,12141,15419,25523,35112,31657,10722,37164,14102,41278,41278,39074,14600,3979, + 12502,23780,36153,12892,10205,18190,35133,25614,182, 30027,1280, 16430,19360,12390,17648,5970, 10823,38733,2014, 1994, 13141,36152,39075,28321,35137,32967,7114, + 9783, 41278,36152,20090,39075,39075,39074,6734, 15826,9226, 28807,37436,37436,10698,12141,15419,25523,35112,31657,10722,37164,14102,41278,41278,39074,14600,3979, 31088,13755,11005,11904,31006,4960, 21839,32957,4564, 28348,13683,15118,14594,13351,28285,1876, 33614,37092,32934,29658,23109,4861, 32430,24279,25222,22101,16615, 9995, 12266,18806,32435,28881,22852,13430,27104,1870, 29241,22258,529, 24568,17740,27555,33679,2075, 19147,14972,31776,33451,9053, 26604,41277,35437,41277,41277, - 32949,37570,17336,22792,22264,39074,39074,37435,30135,33895,39073,35670,36152,36889,25576,33179,37510,30136,36772,23165,38203,35809,32833,5619, 2059, 35211,2802, + 32949,37570,17336,22792,22264,39074,39074,37435,30135,33895,39073,35670,36152,36889,25576,33179,37510,30136,36772,23165,38203,35809,32833,5619, 2059, 35211,2802, 34919,9255, 27303,23297,38453,19252,33095,1648, 38434,11996,4655, 24222,34374,37435,20371,39073,37435,33417,39100,36152,34055,37047,37435,27337,16055,6678, 41277, 33563,2810, 19161,17524,11492,34276,28278,41276,15039,36151,34275,23142,6880, 39073,29657,36151,39073,32949,10714,36151,41276,36151,10368,41276,31478,1116, 35111, 29656,11995,41276,11994,33563,39072,41275,16657,15418,41275,33563,6879, 41275,1641, 38876,41275,41274,37434,6714, 20704,28043,659, 3145, 13270,11098,17079,33930, - 2311, 11864,3681, 22758,36661,22298,7643, 41274,4139, 39072,4703, 24182,36398,13711,18744,36150,18189,20703,26603,16224,41274,34487,37434,9197, 25001,16996,1519, + 2311, 11864,3681, 22758,36661,22298,7643, 41274,4139, 39072,4703, 24182,36398,13711,18744,36150,18189,20703,26603,16224,41274,34487,37434,9197, 25001,16996,1519, 34177,34192,29058,31756,39072,41274,35331,35111,36644,10270,33562,3685, 31366,35326,25814,8833, 12708,24658,5533, 36446,13998,39072,36150,33394,3935, 30489,17737, 4806, 8362, 36898,35641,41273,35111,3683, 16503,31477,17399,32990,20089,36150,19293,39071,35009,35111,24787,41273,9047, 17768,18742,38397,41273,34275,39071,11993, 22263,4642, 41273,14340,41272,11673,35308,41272,34837,7814, 21460,36150,8162, 31086,4894, 8533, 35163,38569,4240, 6965, 15038,35110,29655,34275,37757,37434,33562, 39071,2160, 5567, 2871, 29288,37434,31476,26602,5798, 41272,39071,29654,31475,37433,39070,29653,41272,31474,37841,35600,26415,9928, 30876,9251, 17311,12369,31467, 35320,41271,4725, 41271,41271,34275,35110,39070,9490, 19334,37540,36149,11349,11096,3438, 13320,35948,9954, 30368,35110,7252, 10145,38011,18738,1133, 2285, 21055, - 19086,5008, 3870, 15157,2307, 3754, 5670, 29417,2374, 15888,30777,33756,37675,36416,2760, 6403, 19664,15948,32919,13789,15979,28890,17359,19188,37689,32856,4077, + 19086,5008, 3870, 15157,2307, 3754, 5670, 29417,2374, 15888,30777,33756,37675,36416,2760, 6403, 19664,15948,32919,13789,15979,28890,17359,19188,37689,32856,4077, 4625, 11097,7451, 39050,960, 23141,37433,41271,37433,39070,31473,41270,36149,3464, 913, 39070,39069,17107,41270,37433,41270,35110,32948,39069,37432,28042,39069, 39069,39068,41270,9005, 41269,39068,39068,39117,34274,41269,39068,41269,41269,41268,37432,39067,26601,41268,11496,37432,1797, 37432,20702,39067,30087,39067,25338, 41268,41268,35109,37431,41267,300, 8669, 15996,32969,32862,30362,33562,11992,41267,18087,5101, 31472,36149,13140,17106,37818,38658,39067,35109,41267,37431,26860, 35109,26619,14599,36480,17105,17576,36149,35729,36148,20088,25337,41267,32948,14692,20087,32948,37203,7668, 37431,28041,18743,39066,20086,20213,7407, 17374,22394, 23829,39029,30738,31013,35713,36148,36498,21459,19272,13927,39066,36148,37623,35387,16120,33010,1939, 24849,34058,34878,34296,36148,41266,35903,34274,10697,35109, - 13992,11249,13411,15421,20026,27834,36147,34274,37752,41266,32948,35108,36147,1245, 17104,17575,34274,25791,39066,9606, 41266,10879,925, 1656, 5066, 2392, 1264, + 13992,11249,13411,15421,20026,27834,36147,34274,37752,41266,32948,35108,36147,1245, 17104,17575,34274,25791,39066,9606, 41266,10879,925, 1656, 5066, 2392, 1264, 16223,2248, 18720,35108,36147,41266,17647,39066,24181,5097, 14101,20085,11373,17646,24180,16719,15887,36147,5096, 7470, 12673,24580,29333,26194,39065,26838,29389, - 14061,37431,16209,3128, 6186, 4842, 8087, 5509, 19704,28040,2098, 37209,33102,3307, 38062,348, 4496, 18525,32363,29895,34523,7951, 34096,25521,35999,35108,2226, + 14061,37431,16209,3128, 6186, 4842, 8087, 5509, 19704,28040,2098, 37209,33102,3307, 38062,348, 4496, 18525,32363,29895,34523,7951, 34096,25521,35999,35108,2226, 32957,36156,6678, 37430,38861,15545,14809,35555,5166, 14339,35108,41265,36146,37438,35107,37430,37430,39065,41265,35102,38100,36309,37430,18188,37580,36146,29997, - 35107,26600,39065,11527,36146,9648, 37429,37429,41265,39065,16510,25681,17103,32192,33528,8774, 8276, 13697,36197,16718,2541, 29483,3702, 39360,14239,10883,3569, + 35107,26600,39065,11527,36146,9648, 37429,37429,41265,39065,16510,25681,17103,32192,33528,8774, 8276, 13697,36197,16718,2541, 29483,3702, 39360,14239,10883,3569, 28774,30368,9501, 29284,26934,22367,18919,33055,7552, 28326,31277,33118,9353, 31008,20066,17403,33562,3164, 12530,32947,32947,20167,37923,37429,34273,39064,41265, - 22485,34824,29652,1744, 30862,34273,41264,7100, 35395,18175,32844,18060,29651,37844,31471,16155,8275, 1755, 33645,37900,9731, 6866, 7213, 26599,28117,29650,6480, + 22485,34824,29652,1744, 30862,34273,41264,7100, 35395,18175,32844,18060,29651,37844,31471,16155,8275, 1755, 33645,37900,9731, 6866, 7213, 26599,28117,29650,6480, 32947,39064,23963,41264,29649,15031,13970,20423,14843,8779, 15441,26387,16957,24179,31307,26839,34983,41264,13601,36962,12300,29100,36139,19142,35212,32181,32308, 38276,33360,27012,17766,7293, 12049,10963,13083,23104,32914,23197,10374,32839,19019,30382,10458,31041,15278,20015,24243,4726, 18742,13600,14100,36918,37429,36894, 21458,39064,22262,8558, 13599,24585,34946,37428,37252,36471,11255,41264,12618,20139,37866,35107,35037,22261,34310,36140,26598,37428,25336,22695,20025,34273,35107, - 34273,41263,39064,12140,4327, 34272,6649, 35822,9207, 13134,33882,37428,37428,6419, 41263,35106,41263,5299, 17645,4530, 32814,37427,12040,16717,34272,36146,6313, + 34273,41263,39064,12140,4327, 34272,6649, 35822,9207, 13134,33882,37428,37428,6419, 41263,35106,41263,5299, 17645,4530, 32814,37427,12040,16717,34272,36146,6313, 15417,39063,34272,1208, 34914,38915,36145,24178,32947,11248,4752, 39063,41263,32946,39063,11908,18741,241, 36652,38649,29648,33561,35106,37443,35936,21365,21076, 28039,19996,31470,9583, 27743,13133,37518,12891,32946,18737,5991, 31469,12890,18187,22260,14598,36078,2569, 37427,35106,19359,41262,39063,34957,41262,41262,41262, 36326,38052,12632,23215,37243,12084,39062,7693, 4298, 4874, 15816,17863,15886,41261,37884,14691,41261,15815,39062,4073, 11571,17102,39062,35106,37427,17101,41261, @@ -19767,10 +19762,10 @@ static const unsigned short Ranks[197839] = 35104,27682,17509,922, 41257,37830,36144,38473,17574,39059,35104,33772,37425,32944,32943,5990, 41257,17098,815, 8556, 31466,36144,4888, 11095,21457,35104,26592, 9507, 24175,16656,37424,1595, 39059,2317, 41256,14338,8086, 13989,24174,21058,20096,36144,35103,39059,34271,36143,34271,24673,38742,765, 23149,28808,34270,35893, 37424,13325,31895,39058,24346,13493,41256,14747,32943,34270,33561,39058,351, 39058,35629,35384,38927,19358,753, 25331,33560,24, 9545, 27391,9627, 37639,20701, - 6865, 4353, 738, 36143,33560,16222,33112,32293,37424,10508,23093,34270,10878,32941,29920,12388,28034,1540, 39023,9647, 33973,10386,14870,488, 11059,15751,9352, + 6865, 4353, 738, 36143,33560,16222,33112,32293,37424,10508,23093,34270,10878,32941,29920,12388,28034,1540, 39023,9647, 33973,10386,14870,488, 11059,15751,9352, 101, 10037,28965,10204,13834,24784,41256,41256,41255,41255,20022,38234,33663,39058,20082,41255,41255,41254,34270,41254,6963, 3659, 23465,39057,38871,27604,41254, 679, 37424,35580,41254,1667, 8274, 36143,6536, 2164, 17662,37466,36738,35103,34210,10695,27299,4195, 2598, 41253,36143,16473,17573,2062, 39057,37423,33880,39057, - 14337,39057,36142,15417,38571,13663,39419,13132,41253,6555, 33793,6925, 24193,6070, 33975,41253,607, 35103,27399,18400,18420,25307,39056,982, 6502, 41253,2612, + 14337,39057,36142,15417,38571,13663,39419,13132,41253,6555, 33793,6925, 24193,6070, 33975,41253,607, 35103,27399,18400,18420,25307,39056,982, 6502, 41253,2612, 36142,9646, 39056,36142,37340,1438, 10822,41252,36142,39056,10904,22259,16655,10068,39056,35103,2494, 9442, 38368,8658, 36141,294, 36060,35102,17579,17097,26591, 28599,3521, 28033,39055,36141,3705, 18604,41252,37423,41252,41, 9431, 25912,33560,26590,243, 32943,36141,29638,35102,23138,12387,11713,21404,4447, 35102,39055, 26589,32943,7460, 36141,29637,31465,41252,344, 20081,39055,2648, 15814,20021,4702, 10821,35102,15885,7890, 39055,37423,33903,41251,19357,34269,4270, 21456,41251, @@ -19779,15 +19774,15 @@ static const unsigned short Ranks[197839] = 33157,35101,33496,39221,14128,25329,8141, 16714,37421,36108,15099,41251,1658, 16713,20700,31733,638, 14164,13131,32948,5187, 39054,26588,41250,37421,36140,37631, 12139,251, 6097, 11094,15415,39054,32883,9506, 33674,39054,34871,37421,6166, 41250,41250,35101,36139,11460,34334,40, 4948, 32866,146, 13596,1183, 10025,32942, 15234,12706,249, 24990,13647,39054,37421,20020,41250,38838,35100,34269,38372,7981, 2579, 29216,34236,18492,30211,32941,17642,14596,39053,41249,32334,36875,31885, - 16350,84, 24743,16804,36368,22481,28673,25421,25100,36480,37169,33559,18588,10840,15044,37420,31464,20080,16355,11672,37420,14253,36139,20492,586, 9973, 6817, + 16350,84, 24743,16804,36368,22481,28673,25421,25100,36480,37169,33559,18588,10840,15044,37420,31464,20080,16355,11672,37420,14253,36139,20492,586, 9973, 6817, 64, 35625,37420,34721,7155, 2068, 18769,24172,33797,37420,41249,41249,7992, 11671,8657, 41249,14174,41248,35868,28032,2997, 41248,37419,4408, 36711,35100,16221, 470, 3033, 34748,11907,41248,29635,8986, 2034, 8815, 18987,23137,19356,34508,41248,13625,4599, 11459,2866, 14595,15414,2795, 36680,10521,34268,26172,10380,30139, 6930, 16578,28470,5346, 1954, 24813,10373,32583,8839, 9548, 10501,41247,41247,37867,27044,35100,34290,41247,34268,36139,5100, 33895,19638,34311,11906,15037,37334, 33592,13139,19545,34268,1117, 17170,3249, 2061, 18415,13450,39053,894, 24171,8085, 31463,41247,36492,39053,35100,4837, 4678, 12705,33988,8899, 4009, 37419,29769, 39053,14481,34268,9206, 4470, 38546,37419,1274, 32941,41246,39052,28031,10520,24170,1614, 20079,41246,25328,24169,312, 26525,34267,36139,11670,1169, 6430, 34267, - 8425, 36138,4269, 7460, 37419,39052,37541,39052,8838, 39108,10144,5126, 33009,22663,32894,41246,35709,10431,8424, 38643,39052,39269,1728, 13130,34637,33671,5969, + 8425, 36138,4269, 7460, 37419,39052,37541,39052,8838, 39108,10144,5126, 33009,22663,32894,41246,35709,10431,8424, 38643,39052,39269,1728, 13130,34637,33671,5969, 10820,38328,32941,130, 22503,37418,35099,38100,37578,27089,34900,4154, 36630,39051,10066,11366,18789,5257, 14618,274, 3936, 15270,26947,29806,1392, 32941,26115, - 1629, 41246,2761, 41245,37418,37418,17096,7844, 5821, 35055,41245,41245,35099,27946,39051,16901,7353, 29696,27290,37418,35099,36138,33559,13410,2772, 39253,4203, + 1629, 41246,2761, 41245,37418,37418,17096,7844, 5821, 35055,41245,41245,35099,27946,39051,16901,7353, 29696,27290,37418,35099,36138,33559,13410,2772, 39253,4203, 35557,41245,2551, 8413, 33310,33725,4826, 6207, 11967,32940,10889,39051,5, 22447,33992,4281, 22214,35225,33558,31462,31461,18184,9147, 26458,22790,41244,39051, 1437, 35850,33558,8656, 15884,35033,1479, 14099,23701,2613, 35099,6924, 11355,29600,9017, 3217, 4107, 28267,86, 35744,41244,20019,34722,35098,39050,41244,36138, 41244,24746,37417,15233,39050,9547, 18738,33652,41243,39050,41243,41243,18737,31460,19355,25327,12889,37417,37023,35158,15413,38921,34267,41243,41242,14098,25326, @@ -19797,18 +19792,18 @@ static const unsigned short Ranks[197839] = 9545, 13747,34266,27422,17215,33321,35795,225, 3685, 27980,10034,13594,28585,35200,33442,5029, 36095,12137,12924,16335,14901,18192,22023,22356,21630,34933,10143, 36137,6144, 6297, 8722, 15412,6490, 12474,6128, 6069, 35326,38415,6601, 7173, 37971,13248,27054,1269, 35548,2089, 25783,37616,10943,8010, 15883,38579,20568,32838, 27300,12569,8527, 11990,33811,384, 21517,4117, 17336,37834,20499,6329, 37620,21454,33387,34253,19735,34167,13182,21657,34847,8110, 7468, 26073,13593,34266,14095, - 39048,5114, 35830,10065,12888,164, 25324,32940,25323,15036,21515,12630,41241,35762,41240,33557,18183,41240,39048,39048,69, 32959,21198,38875,35857,33689,1804, + 39048,5114, 35830,10065,12888,164, 25324,32940,25323,15036,21515,12630,41241,35762,41240,33557,18183,41240,39048,39048,69, 32959,21198,38875,35857,33689,1804, 37416,36043,16654,37416,2597, 6149, 39048,16870,37970,20699,21453,24168,265, 41240,18736,17641,21452,24167,41240,41239,37495,37416,37416,34266,36137,2298, 41239, 41239,32780,23386,24166,15232,37676,24816,36137,37415,39064,3119, 1670, 6703, 16544,25327,33398,27057,21192,35949,6985, 9692, 23864,37301,30432,35707,37145,34265, 16710,33654,12173,14594,39149,2947, 26646,20076,3178, 17562,11711,41239,12044,29945,32098,29633,31883,20017,3365, 38193,10375,18735,9729, 36137,13988,34885,14593, 72, 17838,32675,32655,28618,41238,16220,24165,35097,39047,31763,35097,36472,41238,20698,8491, 20076,39047,39047,7236, 30902,20075,959, 4383, 36599,24164,41238, 8773, 39047,72, 5589, 22115,15862,27138,35015,33836,19354,35097,21838,36750,864, 18660,39046,15035,39046,8691, 24445,23632,22619,12331,29536,6187, 39068,39342, 31735,38013,39201,13336,19656,35339,22921,36461,37689,22065,34266,17714,37336,27702,36050,36553,8150, 35097,7153, 6408, 21, 556, 167, 79, 234, 36136,25322, - 39046,41238,36136,41237,35096,39046,1326, 7765, 4576, 8492, 26602,6429, 9016, 21451,37415,8873, 14592,11870,2859, 5669, 22257,35096,17470,33033,35175,39045,2613, + 39046,41238,36136,41237,35096,39046,1326, 7765, 4576, 8492, 26602,6429, 9016, 21451,37415,8873, 14592,11870,2859, 5669, 22257,35096,17470,33033,35175,39045,2613, 15186,9696, 2585, 18734,29095,17640,39045,1338, 8713, 1423, 11868,620, 23046,39040,32940,31332,5818, 12389,33202,6428, 36591,631, 41237,41237,2576, 5335, 18736, - 787, 17733,14094,20641,35668,18733,17094,1413, 15363,13409,20697,25670,5797, 12704,30834,2864, 18735,11669,16653,41237,13977,39045,41236,3009, 15231,39381,1825, + 787, 17733,14094,20641,35668,18733,17094,1413, 15363,13409,20697,25670,5797, 12704,30834,2864, 18735,11669,16653,41237,13977,39045,41236,3009, 15231,39381,1825, 28030,4641, 4354, 36372,10064,36136,6427, 37357,179, 11399,21722,41236,6942, 1417, 28476,119, 36183,17598,952, 18732,41236,41236,23845,7274, 36233,21699,37341, - 19631,34080,293, 36136,32830,21869,20706,3981, 11585,37181,37627,30784,37187,33484,29450,19965,3328, 1789, 38880,37174,16096,33983,28892,11247,16734,36820,991, + 19631,34080,293, 36136,32830,21869,20706,3981, 11585,37181,37627,30784,37187,33484,29450,19965,3328, 1789, 38880,37174,16096,33983,28892,11247,16734,36820,991, 3884, 6527, 6530, 27756,35576,16282,359, 13394,16922,24617,27117,33345,41235,10063,35096,35096,41235,25321,18182,37415,37415,39045,5446, 36135,4485, 24163,20016, 18734,36135,12703,358, 33024,2940, 9004, 3681, 34265,29632,16219,13408,20015,24162,37414,4911, 30232,10596,16709,36135,9645, 11656,18731,16953,41235,41235,39044, 36135,8273, 41234,37414,41234,30321,6883, 2310, 9934, 36134,17639,41234,3062, 41234,10316,28029,1130, 32693,32989,5299, 34265,19968,7642, 16002,15882,10808,19353, @@ -19819,14 +19814,14 @@ static const unsigned short Ranks[197839] = 17572,32939,26583,24161,39043,18181,41231,36133,17093,17092,21450,41231,21449,38491,41231,25320,37412,35095,37411,15813,6992, 31455,4751, 39043,29630,30482,39043, 7641, 13592,5138, 24160,35095,3413, 5809, 5272, 5578, 1351, 7741, 17255,18729,35080,17088,37804,8703, 26582,6185, 33609,32938,12887,41230,36133,41230,33556,32938, 25319,39042,26581,22398,24236,27206,29662,41230,41230,8772, 41229,36133,32938,4685, 5301, 25318,32561,4245, 15132,31454,35094,7409, 4418, 11458,38486,41229,37411, - 37411,3824, 8194, 39042,2121, 19352,26580,39042,26579,21448,11058,15812,35094,25317,24159,32938,28027,39042,15811,13405,37411,25316,36132,39041,23134,33555,2361, + 37411,3824, 8194, 39042,2121, 19352,26580,39042,26579,21448,11058,15812,35094,25317,24159,32938,28027,39042,15811,13405,37411,25316,36132,39041,23134,33555,2361, 12628,34166,6738, 41229,41229,39041,41228,41228,31453,1424, 41228,39041,500, 9544, 5717, 4701, 15229,8140, 4836, 17638,9933, 17091,28026,24369,3562, 37410,39041, - 7991, 41228,18732,41227,5612, 16218,41227,17571,31452,22254,41227,36132,41227,41226,34264,6198, 36132,32937,12886,13986,37410,19351,33555,37410,41226,13985,6864, + 7991, 41228,18732,41227,5612, 16218,41227,17571,31452,22254,41227,36132,41227,41226,34264,6198, 36132,32937,12886,13986,37410,19351,33555,37410,41226,13985,6864, 6535, 39040,41226,12627,39040,577, 31451,41226,34272,39040,26578,38738,34782,12626,41225,33555,15810,35094,7724, 41225,36588,13696,13984,41225,39040,34264,41225, - 41224,37410,35094,14336,37409,7154, 14335,31450,37831,20922,33447,30541,23303,34264,37409,34264,33555,32627,4564, 36132,26120,218, 35093,15410,35093,4079, 112, + 41224,37410,35094,14336,37409,7154, 14335,31450,37831,20922,33447,30541,23303,34264,37409,34264,33555,32627,4564, 36132,26120,218, 35093,15410,35093,4079, 112, 28509,26832,775, 14770,9754, 7151, 27899,27171,28723,16905,4658, 13004,5271, 10889,36131,10358,17570,2806, 36187,26577,8535, 601, 33979,11905,28823,2790, 41224, 33554,11057,13404,3703, 5946, 11809,26, 16741,28025,17541,39136,14334,34263,11963,13362,17090,29629,41224,37409,1785, 6358, 9497, 38308,8298, 13137,29438,39039, - 33554,7011, 3008, 36842,13136,18728,2003, 34263,19350,8888, 37409,17089,118, 37353,33554,36285,16707,34786,20073,41224,41223,25315,20072,32859,12625,34263,1022, + 33554,7011, 3008, 36842,13136,18728,2003, 34263,19350,8888, 37409,17089,118, 37353,33554,36285,16707,34786,20073,41224,41223,25315,20072,32859,12625,34263,1022, 36131,18638,38938,32768,34263,16706,37408,17569,6929, 35093,7738, 39039,37408,41223,5001, 16705,5137, 23133,37408,24782,24158,39039,41223,8271, 35093,6060, 36131, 19349,37408,24157,22253,21591,2754, 23124,41223,32885,17292,5668, 36131,35092,32937,41222,31894,14091,28024,5370, 37407,36130,35092,25314,279, 35092,39303,31449, 41222,32755,827, 3324, 11092,36821,10877,32937,13591,14333,8321, 37407,3182, 18180,39039,25033,28023,36020,2596, 41222,115, 4802, 8806, 36130,20696,41222,15013, @@ -19839,39 +19834,39 @@ static const unsigned short Ranks[197839] = 39035,28626,33552,165, 11606,7057, 35090,41217,41217,37404,9769, 33552,10876,16651,5033, 41217,41216,23130,28021,35090,7813, 36127,9468, 31442,33552,28020,31441, 20694,4353, 16562,104, 32423,20491,29700,29624,37404,34262,41216,8771, 8319, 34286,37506,8749, 29352,5298, 11801,1517, 39035,6040, 14332,18177,8938, 11220,10360, 32936,41216,4605, 39409,36127,34262,34261,19838,13403,36127,35301,3561, 41216,15409,15881,37404,7546, 41215,19348,36127,37404,39035,35090,36126,35003,25313,37135, - 12624,10810,5752, 38177,39035,39034,260, 17468,32190,14706,33791,33205,11014,12551,12386,37789,41215,34132,36126,29356,2534, 32817,9259, 37392,37403,8654, 1126, + 12624,10810,5752, 38177,39035,39034,260, 17468,32190,14706,33791,33205,11014,12551,12386,37789,41215,34132,36126,29356,2534, 32817,9259, 37392,37403,8654, 1126, 8980, 35008,14689,41215,9589, 30737,24585,10609,38710,9002, 12662,39034,9205, 37403,9238, 14331,7812, 33552,8653, 29623,15131,26573,3250, 33135,2288, 14563,29187, 719, 5751, 18874,31440,4482, 33551,7688, 23973,32481,10987,14688,20012,41215,18728,10518,41214,31439,37403,33551,32936,17359,20600,472, 32827,35089,34012,31970, - 5325, 11731,41214,11618,17976,2596, 1432, 29386,38809,20898,17382,28313,34261,33551,29134,36126,13134,14687,9001, 29622,11457,37403,32355,7723, 35089,41214,7716, - 5730, 32723,5611, 12406,29851,1046, 18727,37402,41214,25807,20071,32289,37402,37305,5388, 41213,37402,16225,30118,11989,37402,35461,24153,21967,24001,26572,1856, + 5325, 11731,41214,11618,17976,2596, 1432, 29386,38809,20898,17382,28313,34261,33551,29134,36126,13134,14687,9001, 29622,11457,37403,32355,7723, 35089,41214,7716, + 5730, 32723,5611, 12406,29851,1046, 18727,37402,41214,25807,20071,32289,37402,37305,5388, 41213,37402,16225,30118,11989,37402,35461,24153,21967,24001,26572,1856, 39034,31328,14330,39034,39033,18727,36206,20070,20069,41213,25336,36126,8058, 6368, 37447,13402,16650,9362, 31349,35165,32856,39033,11456,35778,25312,30313,38864, - 36125,41213,39033,18052,33551,35089,35089,10474,39033,25311,23129,35656,32232,37819,29694,3627, 27400,2021, 3013, 3520, 18726,10595,12330,20068,14591,8557, 8690, + 36125,41213,39033,18052,33551,35089,35089,10474,39033,25311,23129,35656,32232,37819,29694,3627, 27400,2021, 3013, 3520, 18726,10595,12330,20068,14591,8557, 8690, 8009, 5234, 15228,17636,37401,37567,41213,36125,4033, 38876,1399, 8999, 11323,6251, 1010, 8278, 20340,39032,6634, 18725,9015, 27936,41212,15809,33604,26998,37401, 20067,6409, 34511,35088,25806,37426,35088,2745, 17635,16704,28019,14590,8, 10374,916, 20066,2891, 10373,1427, 87, 5487, 13129,18724,3532, 14589,17634,32890, 33550,18723,20065,35612,22711,7694, 104, 9331, 17708,27471,10997,15227,1754, 24840,7172, 17677,20064,36125,8008, 11988,14588,2424, 2793, 3509, 10594,5836, 21512, 10466,16861,17397,14587,6125, 20063,12329,20062,15639,34506,28018,34867,29621,2163, 29454,37401,39032,34187,16753,26905,1949, 34261,3215, 35533,37449,28017,15411, 8556, 41212,1602, 36125,36124,15880,9929, 2302, 13128,39032,9141, 33550,194, 22280,33550,20693,33550,33910,36225,20061,9727, 22249,35790,15879,7811, 1454, 31168, - 25310,16649,36124,18722,15878,18721,3503, 13983,29599,36124,34034,36124,15408,39032,27852,24152,21447,41212,39, 7450, 15877,8836, 1064, 56, 1168, 4250, 384, - 5404, 3823, 34690,1930, 4671, 16703,6203, 18720,9081, 1319, 28016,10366,16702,34261,706, 15407,32936,25309,4300, 33549,8872, 39031,2208, 38617,16701,41212,19, + 25310,16649,36124,18722,15878,18721,3503, 13983,29599,36124,34034,36124,15408,39032,27852,24152,21447,41212,39, 7450, 15877,8836, 1064, 56, 1168, 4250, 384, + 5404, 3823, 34690,1930, 4671, 16703,6203, 18720,9081, 1319, 28016,10366,16702,34261,706, 15407,32936,25309,4300, 33549,8872, 39031,2208, 38617,16701,41212,19, 13127,22248,5532, 11904,19347,26896,26571,9124, 11455,7006, 7279, 12623,12800,41211,37401,39031,41211,71, 39031,31438,37400,1787, 5531, 13126,12702,15226,12701, - 14090,33488,4553, 17633,28015,15876,3613, 37400,20060,6863, 1527, 20175,9644, 5403, 23526,41211,3303, 14586,14693,41211,6357, 1980, 36123,20011,11371,38012,9204, + 14090,33488,4553, 17633,28015,15876,3613, 37400,20060,6863, 1527, 20175,9644, 5403, 23526,41211,3303, 14586,14693,41211,6357, 1980, 36123,20011,11371,38012,9204, 34260,18719,39031,11091,9203, 35088,32935,26570,6676, 7640, 41210,36123,7889, 10142,15225,37802,2847, 1176, 10684,36190,14089,2733, 8193, 12885,10365,28014,32935, 33549,2161, 18050,8412, 27775,3106, 8689, 20059,39030,2816, 17343,29324,38142,20058,37400,4715, 7352, 9350, 34231,5046, 41210,5210, 467, 15406,20057,35798,11575, 14686,15808,3061, 33879,39030,32935,13, 4049, 9504, 36123,29620,34693,37766,4624, 33549,14666,26971,14486,37400,29619,38310,3382, 14525,35420,8541, 17756,18726, - 32935,13401,10333,20237,25620,504, 11903,12884,19294,4299, 2762, 31437,20692,34260,6367, 3680, 8270, 39030,31436,18725,13133,4014, 37399,41210,15807,17567,5000, + 32935,13401,10333,20237,25620,504, 11903,12884,19294,4299, 2762, 31437,20692,34260,6367, 3680, 8270, 39030,31436,18725,13133,4014, 37399,41210,15807,17567,5000, 17632,35575,34260,4040, 13053,12328,29618,4946, 37399,13400,7311, 2904, 9361, 41210,18718,2520, 37302,20057,21128,32604,18911,24172,15875,23896,12026,39045,22932, 17417,38909,2513, 804, 33549,5135, 33627,14329,41209,36526,29617,37824,39030,2158, 37399,11902,6848, 32934,35088,16420,12385,29616,37399,857, 29615,33548,35087, - 1654, 2876, 1607, 15034,4999, 41209,3270, 1696, 36123,41209,33026,14685,358, 10507,34260,28013,24151,26569,41209,10062,35087,16648,2381, 35173,36464,38141,1566, + 1654, 2876, 1607, 15034,4999, 41209,3270, 1696, 36123,41209,33026,14685,358, 10507,34260,28013,24151,26569,41209,10062,35087,16648,2381, 35173,36464,38141,1566, 1477, 37398,5256, 41208,4856, 1516, 39029,18176,13132,29614,11090,31435,33548,7153, 41208,19346,15405,39029,1717, 2761, 16700,29613,38545,18717,14585,41208,18716, 37398,32934,7545, 39029,13695,36122,20691,2586, 5007, 20056,29561,20055,10130,32, 1900, 3672, 5233, 274, 4008, 334, 20054,18715,6633, 9158, 32971,17719,12622, - 1863, 29223,9245, 18714,995, 39217,6567, 193, 13125,34943,6166, 17631,21347,37350,7005, 35087,4813, 639, 25677,7449, 1111, 36122,17630,11370,4805, 9052, 6862, + 1863, 29223,9245, 18714,995, 39217,6567, 193, 13125,34943,6166, 17631,21347,37350,7005, 35087,4813, 639, 25677,7449, 1111, 36122,17630,11370,4805, 9052, 6862, 36122,17629,13124,16699,12327,3753, 10141,9622, 20053,13590,1141, 20488,11369,5486, 33850,12700,15874,12391,17088,9981, 5069, 18713,561, 38888,10422,33548,18712, 10818,17628,18711,49, 1353, 7652, 33469,35087,37398,38590,37398,41208,13716,38817,36122,9932, 37397,779, 24981,18710,36121,3772, 17664,20052,35987,31434,41207, 36934,31433,24150,41207,41207,25308,39029,41207,35086,41206,2308, 29612,41206,9643, 39028,34259,11368,6660, 17627,37274,24149,36121,33548,26568,6722, 36121,19345, 20690,35086,22567,36121,41206,3791, 41206,36120,25307,916, 9227, 13123,32934,41205,28012,22247,2471, 34259,9642, 39028,17566,26567,4119, 21132,34522,3258, 36120, 41205,34259,39409,4013, 33547,35086,32934,26566,29611,18175,39028,11246,12925,7459, 8423, 38865,2568, 33547,12621,41205,32933,14584,34836,37397,37397,19115,37397, 41205,37396,37396,31432,626, 33565,18845,22246,1004, 7894, 12326,8211, 6809, 8924, 17884,25262,2789, 39028,25999,37396,38725,12892,19854,2180, 10848,31576,37396, - 15806,5365, 21593,37395,28011,39027,41204,41204,11056,26565,37395,33547,34259,7152, 7893, 13496,33547,2935, 8671, 9202, 16561,34071,9037, 41204,18174,41204,3572, + 15806,5365, 21593,37395,28011,39027,41204,41204,11056,26565,37395,33547,34259,7152, 7893, 13496,33547,2935, 8671, 9202, 16561,34071,9037, 41204,18174,41204,3572, 21152,37395,9243, 39027,35086,32933,35085,28010,36120,31431,37395,41203,41203,23128,11668,41203,18173,37394,11454,31416,41203,15404,16217,32933,17565,28009,39027, 41202,16698,32933,41202,32932,14684,37394,39027,26564,5333, 39026,34258,41202,33546,34258,29610,41202,5896, 9931, 15715,33171,10372,18737,39026,37394,35085,36101, 22114,24468,16965,28891,15956,37394,39026,30540,36120,20689,19344,10592,37393,39026,37393,28008,5518, 16697,37393,35085,28007,9123, 10203,14583,20010,24148,19343, @@ -19879,8 +19874,8 @@ static const unsigned short Ranks[197839] = 33545,41200,37392,33545,273, 7152, 3873, 26412,20749,15800,28006,2945, 5163, 6632, 35084,36119,37392,41200,36119,5706, 24147,29609,41200,39025,10140,18709,35084, 20009,29608,36119,11055,10817,34258,484, 8652, 5270, 18708,8424, 31430,14582,14581,6418, 14463,16696,33545,5989, 10517,12883,24146,37392,36119,7990, 37392,19795, 34257,25134,32641,34257,8269, 37981,17087,35571,36154,20016,5995, 34954,41199,32966,38954,35512,10364,25305,31429,41199,36118,10917,14367,20772,11571,32867,41199, - 5326, 31019,34632,28005,39024,17564,37391,29607,20784,34136,41199,31428,37715,41198,2631, 880, 16485,37391,356, 29606,4684, 8192, 26563,26695,304, 26771,670, - 35217,37391,34257,5569, 41198,18071,35084,445, 15033,12135,13399,39024,37391,39024,35084,17086,1028, 13516,859, 41198,33545,36118,4256, 11664,3518, 12680,702, + 5326, 31019,34632,28005,39024,17564,37391,29607,20784,34136,41199,31428,37715,41198,2631, 880, 16485,37391,356, 29606,4684, 8192, 26563,26695,304, 26771,670, + 35217,37391,34257,5569, 41198,18071,35084,445, 15033,12135,13399,39024,37391,39024,35084,17086,1028, 13516,859, 41198,33545,36118,4256, 11664,3518, 12680,702, 9505, 32911,566, 26177,2542, 20051,34257,41198,37390,31427,37390,36391,41197,734, 17085,13131,3670, 30694,41197,37586,11901,5716, 17084,33051,2074, 17725,21995, 20050,41197,33981,33544,38247,41197,16216,32360,2142, 6861, 2864, 17663,25304,15873,24629,5319, 36118,31426,39024,12990,11269,7639, 17122,36118,14321,24674,21446, 14197,19974,14269,4269, 4523, 9242, 41196,37390,37390,26562,34256,34256,28004,32932,2237, 520, 25382,24238,34256,41196,5332, 641, 382, 490, 11111,22310,35086, @@ -19892,30 +19887,30 @@ static const unsigned short Ranks[197839] = 198, 16097,37389,13932,36914,992, 31421,33544,21443,34591,29603,36115,20048,61, 7104, 21842,2799, 34255,10139,3060, 33543,41193,15402,38368,17083,35083,36115, 14088,751, 33805,36115,1740, 37388,4700, 7910, 34142,41193,163, 23879,8084, 21438,12134,34254,37388,33770,7310, 41192,32932,39022,41192,11667,17562,26561,16647, 37388,16646,15159,17626,39022,3389, 9349, 36115,1739, 41192,364, 27919,8885, 33947,8555, 9726, 41192,35083,995, 15804,2784, 36114,823, 7742, 29173,10138,28001, - 28575,10522,35083,210, 30424,24202,25302,634, 12384,19341,34497,6245, 31420,10874,5894, 3615, 36114,21442,35370,12383,24586,31419,39021,10516,11655,39021,9670, + 28575,10522,35083,210, 30424,24202,25302,634, 12384,19341,34497,6245, 31420,10874,5894, 3615, 36114,21442,35370,12383,24586,31419,39021,10516,11655,39021,9670, 8, 10921,28625,30722,34935,3392, 32931,35082,20047,41191,29602,37388,20046,41191,755, 26560,30364,9241, 33543,6018, 18724,12882,20045,39021,33543,12698,38726, - 26965,37387,17561,3249, 10202,39021,4555, 11900,29708,39020,37387,7987, 7079, 35082,29601,4417, 34377,5157, 33543,38162,38319,9201, 9725, 26559,17082,34140,385, + 26965,37387,17561,3249, 10202,39021,4555, 11900,29708,39020,37387,7987, 7079, 35082,29601,4417, 34377,5157, 33543,38162,38319,9201, 9725, 26559,17082,34140,385, 36834,27699,35979,24994,10593,10515,37387,19340,28000,29625,26558,15803,8316, 9767, 39020,17560,35822,8139, 38497,36114,5475, 34214,18723,33475,8611, 3120, 39272, 35082,1045, 32756,41191,39020,14087,16695,12325,27999,5474, 18552,11666,32931,11538,15224,39020,2306, 19823,18170,39019,41191,6563, 23921,32931,32931,15223,36114, 36861,7235, 35082,9503, 37387,41190,3942, 13589,7078, 32930,37386,752, 35659,35785,35151,649, 7257, 25767,19077,15222,20044,14086,39019,2627, 34254,18366,36167, 32857,39019,5232, 38613,16611,2873, 17338,39122,10060,20043,3727, 18707,37310,18706,26557,12697,1338, 1001, 14326,37386,33542,9000, 8422, 36113,18169,31418,32780, - 20109,18168,41190,24144,23705,23991,16514,31417,29600,12133,13920,8429, 4940, 41190,27998,41190,41189,2585, 981, 35081,617, 9766, 3372, 38841,760, 4382, 3285, + 20109,18168,41190,24144,23705,23991,16514,31417,29600,12133,13920,8429, 4940, 41190,27998,41190,41189,2585, 981, 35081,617, 9766, 3372, 38841,760, 4382, 3285, 37012,7821, 20042,27997,6190, 39019,31416,5209, 23124,24597,36113,9359, 16214,10061,32930,3284, 18167,11987,15032,32264,34117,3736, 4865, 4887, 17081,1637, 11793, 3919, 41189,32212,32635,32861,7278, 34254,27996,22245,27995,473, 39018,41189,17625,41189,11665,5125, 15872,10873,41188,41188,7151, 26556,41188,31415,36113,20007, 34254,9922, 13327,12324,7077, 41188,15401,41187,1412, 14683,37386,31414,13588,10702,12382,16910,37386,37385,1376, 18633,8411, 41187,35806,39018,187, 4138, 23944, 32974,27900,1561, 33732,15031,41187,41187,36579,14740,39018,657, 18784,1322, 31413,15871,516, 41186,20416,11245,7651, 3836, 17757,39111,39223,37691,11089,37385, - 25301,1025, 18705,37385,20688,1451, 39018,14682,34031,11244,29599,35081,29666,19339,39017,27994,1669, 36113,29587,23123,10201,27993,2368, 41186,11913,196, 2621, + 25301,1025, 18705,37385,20688,1451, 39018,14682,34031,11244,29599,35081,29666,19339,39017,27994,1669, 36113,29587,23123,10201,27993,2368, 41186,11913,196, 2621, 11283,32795,27965,32247,33283,31645,19936,12381,19074,186, 26494,21521,13316,32846,32641,4505, 15849,9855, 33046,28481,32228,6279, 37086,25676,34245,28690,36112, 41186,34964,29598,36112,14708,36112,34253,26254,34253,37385,32930,582, 37384,24143,37384,18193,33104,35888,22244,5968, 34253,25300,5705, 33029,41186,20041,26555, - 20687,25100,39003,17881,37384,41185,20006,41185,34253,2146, 2815, 10315,18704,18703,9930, 32930,39017,6356, 31208,36112,33542,41185,35105,37693,33542,38582,1824, + 20687,25100,39003,17881,37384,41185,20006,41185,34253,2146, 2815, 10315,18704,18703,9930, 32930,39017,6356, 31208,36112,33542,41185,35105,37693,33542,38582,1824, 37384,3239, 3477, 33980,34777,8083, 21441,29080,3403, 15221,32956,17624,41185,39017,41184,29597,5667, 34252,37617,32929,14855,27992,8769, 21440,23122,3269, 41184, - 9358, 39017,20040,27902,41184,34252,37383,34252,21439,37383,41184,37383,9418, 1433, 35362,32929,12258,1459, 24093,378, 17623,18166,39336,14580,18722,11654,5270, + 9358, 39017,20040,27902,41184,34252,37383,34252,21439,37383,41184,37383,9418, 1433, 35362,32929,12258,1459, 24093,378, 17623,18166,39336,14580,18722,11654,5270, 16694,32929,18721,27991,5915, 1227, 35081,16213,41183,4699, 9929, 297, 25299,36111,15400,33509,3059, 2677, 35081,34199,1831, 5156, 16693,2728, 26554,14953,16212, 18702,34252,18701,36301,41183,31412,41183,29929,41183,20292,29596,36111,37383,33542,32960,20005,6479, 13982,33541,31411,3449, 37546,41182,36111,41182,39016,18720, 34251,33541,20039,25976,35080,36150,27990,37382,37382,34251,37978,34981,36509,24142,21438,36111,32929,31410,25298,32928,36110,37708,20004,35823,26110,41182,33090, - 35080,24141,37382,35080,3336, 35080,35079,36110,859, 17646,31409,4191, 3881, 1459, 33541,17622,8554, 32928,41182,16211,32928,10, 5850, 3952, 3697, 12696,8710, - 3484, 18700,2701, 25297,29595,41181,10371,41181,13587,13981,17621,15399,22243,20686,2436, 1494, 18165,37382,9013, 7099, 6426, 37381,176, 29594,14751,10593,248, - 3753, 7917, 14579,18462,41181,12674,38560,26553,5893, 39016,36110,11986,38740,14681,7150, 938, 3930, 1941, 8835, 27283,25063,41181,32928,4873, 35079,41180,790, + 35080,24141,37382,35080,3336, 35080,35079,36110,859, 17646,31409,4191, 3881, 1459, 33541,17622,8554, 32928,41182,16211,32928,10, 5850, 3952, 3697, 12696,8710, + 3484, 18700,2701, 25297,29595,41181,10371,41181,13587,13981,17621,15399,22243,20686,2436, 1494, 18165,37382,9013, 7099, 6426, 37381,176, 29594,14751,10593,248, + 3753, 7917, 14579,18462,41181,12674,38560,26553,5893, 39016,36110,11986,38740,14681,7150, 938, 3930, 1941, 8835, 27283,25063,41181,32928,4873, 35079,41180,790, 39016,3413, 11367,36110,35079,37381,23209,7234, 12829,37381,39016,35079,26552,3074, 37596,31408,41180,13089,39015,36109,36109,24140,25296,14680,32927,36109,34251, 37381,14578,26551,9012, 36410,41180,37380,36109,6737, 24139,15398,33541,39015,20685,26379,14325,39015,41180,20684,32927,41179,23121,4447, 39015,41179,19413,12695, 38950,33540,9921, 18164,41179,35538,2309, 39195,18699,12620,11452,16645,23120,29593,39014,14582,175, 4467, 19878,36164,24521,5231, 11735,34251,15622,6622, 38778, @@ -19929,23 +19924,23 @@ static const unsigned short Ranks[197839] = 12748,33539,41174,1442, 41173,913, 17161,10200,36107,9543, 2231, 26549,20036,16209,27989,1279, 18615,36277,27305,2396, 35517,4866, 684, 27768,4529, 41173,24134, 18718,37466,41173,16052,6878, 37318,34249,33989,41173,20681,39010,33539,41172,11451,20733,37378,12619,37378,41172,41172,15802,25294,37378,16208,19659,39413,35077, 27988,22240,39010,41172,39010,25402,37311,37377,17559,33538,35077,29589,37648,13315,27987,20035,23800,37377,37377,36106,34249,32927,37377,18696,30969,34112,41171, - 25293,38063,34249,39009,17558,39009,17334,20788,22239,16644,41171,37376,41171,33503,33538,7374, 8082, 41171,31402,20680,35076,18162,27517,37376,6884, 589, 1294, + 25293,38063,34249,39009,17558,39009,17334,20788,22239,16644,41171,37376,41171,33503,33538,7374, 8082, 41171,31402,20680,35076,18162,27517,37376,6884, 589, 1294, 8216, 8999, 734, 11845,7852, 36106,35076,41170,12881,907, 37841,6455, 200, 23553,11985,14085,18695,13121,6073, 5666, 31207,27986,697, 21448,28804,4416, 25292, 41170,14577,35076,36106,210, 25994,13983,36582,20679,18623,15030,127, 155, 2646, 509, 12541,22170,5709, 28831,2084, 13120,6018, 402, 6310, 10370,655, 29896, - 7887, 39009,25291,3553, 30379,23708,23937,29728,39009,33538,9724, 410, 18161,19769,10957,18694,32927,30528,27985,37376,3302, 9371, 33538,2202, 12355,37376,74, + 7887, 39009,25291,3553, 30379,23708,23937,29728,39009,33538,9724, 410, 18161,19769,10957,18694,32927,30528,27985,37376,3302, 9371, 33538,2202, 12355,37376,74, 32848,39008,1628, 41170,513, 39008,9502, 18853,19913,24350,12428,41170,11664,3702, 12132,35275,27193,17619,2918, 39058,37375,35719,21248,20111,37631,29588,15575, 12099,36106,6539, 9764, 1954, 38378,35076,41169,37375,10871,27994,23118,5440, 37244,20001,34921,34843,35792,6928, 29587,35723,25532,5134, 33470,4322, 25290,15801, - 29586,25289,39008,32926,3732, 6724, 14272,27984,26548,3107, 41169,39008,33537,27983,33537,4956, 37375,15800,37912,36105,9723, 17282,22523,15220,35075,24133,5892, - 34169,33537,29585,362, 1003, 7722, 102, 10816,17618,7748, 15502,23117,15870,1298, 5255, 7188, 17617,37322,14895,638, 17669,25795,7192, 39394,17723,2848, 895, + 29586,25289,39008,32926,3732, 6724, 14272,27984,26548,3107, 41169,39008,33537,27983,33537,4956, 37375,15800,37912,36105,9723, 17282,22523,15220,35075,24133,5892, + 34169,33537,29585,362, 1003, 7722, 102, 10816,17618,7748, 15502,23117,15870,1298, 5255, 7188, 17617,37322,14895,638, 17669,25795,7192, 39394,17723,2848, 895, 1423, 20131,8081, 39045,11113,15219,3671, 3708, 36105,2130, 11466,19510,14084,17616,2899, 11653,28281,1547, 15391,16690,5243, 5849, 13130,32926,41169,3304, 35075, 37375,16237,6417, 23116,3839, 41169,5988, 7233, 8871, 31401,39007,41168,37413,25288,17060,4352, 37854,13919,25287,37916,36026,7544, 37374,4298, 33537,34249,17557, - 37082,12380,27982,13129,10566,17078,21350,19266,35937,16207,33955,31036,33974,7264, 26423,11652,16689,18693,18692,13119,20034,6366, 7986, 41168,845, 32926,7892, - 18160,12880,39007,7098, 8553, 17615,37374,4415, 6755, 39007,325, 15218,29584,3008, 11076,19337,28004,18576,39007,30518,890, 31614,35586,22025,33706,517, 5914, + 37082,12380,27982,13129,10566,17078,21350,19266,35937,16207,33955,31036,33974,7264, 26423,11652,16689,18693,18692,13119,20034,6366, 7986, 41168,845, 32926,7892, + 18160,12880,39007,7098, 8553, 17615,37374,4415, 6755, 39007,325, 15218,29584,3008, 11076,19337,28004,18576,39007,30518,890, 31614,35586,22025,33706,517, 5914, 5445, 27186,1797, 10520,25579,33536,39006,14576,33536,106, 12323,8409, 37718,29185,38262,17614,307, 2301, 851, 15552,33501,5205, 35101,18717,33923,15161,35213, 18691,3371, 307, 30815,41168,34836,9463, 16908,14640,9348, 34531,821, 15869,13355,4422, 25106,39006,21644,6148, 17169,278, 3191, 3321, 22967,24528,39355,15933, 16265,20277,10369,31400,53, 9277, 25760,34930,20968,34449,8413, 8688, 27187,3199, 14200,35528,22210,20466,1274, 998, 33536,41168,3185, 29583,19336,17613,41167, - 7764, 20033,17612,35075,4927, 12879,3913, 16688,20032,36105,12333,20031,2761, 41167,33536,34248,32928,10514,37374,2034, 417, 14083,2166, 18690,262, 16687,1445, - 13118,468, 32926,18541,9893, 13533,29171,37374,3990, 2523, 13433,20241,16863,20030,7650, 34421,14062,10136,6253, 7543, 716, 33188,37373,41167,18159,20029,546, + 7764, 20033,17612,35075,4927, 12879,3913, 16688,20032,36105,12333,20031,2761, 41167,33536,34248,32928,10514,37374,2034, 417, 14083,2166, 18690,262, 16687,1445, + 13118,468, 32926,18541,9893, 13533,29171,37374,3990, 2523, 13433,20241,16863,20030,7650, 34421,14062,10136,6253, 7543, 716, 33188,37373,41167,18159,20029,546, 3862, 37373,5207, 11450,35102,20028,14632,1744, 2802, 15396,4804, 2243, 41167,27904,6148, 31399,32925,41166,39006,41166,36097,12914,36105,9357, 17556,41166,18689, 41166,52, 16686,661, 3822, 11366,172, 15868,17611,20027,18717,1493, 1806, 9850, 2653, 20133,35075,33854,7821, 339, 16657,23312,17610,35074,25745,9847, 29136, 41165,39006,39005,37373,35074,24925,4791, 36104,32925,35074,38393,4653, 16316,27107,13582,37342,31977,20365,36258,37913,18208,13586,11651,21437,36104,41165,36104, @@ -19954,7 +19949,7 @@ static const unsigned short Ranks[197839] = 3108, 20852,8292, 9564, 3844, 5125, 33268,2318, 1422, 23625,9200, 4749, 8814, 39005,35074,39005,41164,14082,30, 20337,35073,39005,36104,30231,33535,31398,34235, 35886,7655, 6923, 12694,11984,6554, 1118, 13194,7886, 6701, 13585,31397,35237,32925,2890, 39056,36831,27981,4981, 20025,38799,9322, 625, 686, 24952,34553,28994, 1366, 26287,2237, 12322,13116,548, 2491, 19480,283, 37372,10363,26546,8651, 37372,8079, 37372,17554,158, 10815,34925,7567, 8407, 13115,10377,9347, 25431,18158, - 326, 12131,37955,41164,8721, 34248,37371,17608,11377,34248,27980,37765,39004,39004,27979,33808,31903,38503,34481,15596,27064,15867,36971,30557,31269,6702, 9654, + 326, 12131,37955,41164,8721, 34248,37371,17608,11377,34248,27980,37765,39004,39004,27979,33808,31903,38503,34481,15596,27064,15867,36971,30557,31269,6702, 9654, 7578, 7746, 39391,22299,23508,33053,36868,39328,9950, 32769,12139,31780,37847,15350,28068,41164,39004,39004,41164,39003,32886,38897,41163,11983,33535,41163,34248, 19335,35073,33535,41163,13980,39003,41163,6631, 12511,38302,41162,36103,35949,35233,7542, 9639, 36103,13093,37371,34033,41162,10870,35073,6991, 35073,41162,35245, 39003,36103,13694,41162,33535,20030,36103,41161,35072,23283,13979,35418,13128,10060,6807, 41161,5768, 18157,36102,38539,38400,37371,10852,35072,33251,15939,22171, @@ -19966,7 +19961,7 @@ static const unsigned short Ranks[197839] = 11899,11662,34446,29581,31037,35251,7662, 39401,33533,39001,41159,35570,29222,19435,13861,32900,20181,31738,12057,13973,21921,21079,8209, 12270,37369,12917,15880, 32912,38523,1568, 11364,18686,1426, 26544,38928,24697,29011,39160,5492, 26866,38915,35445,23899,332, 9636, 39001,36101,37757,4599, 24295,2439, 10207,19900,20094, 30436,36869,38792,11251,31385,22331,11843,33777,3118, 16294,21541,36435,15844,24561,24594,27784,17832,33767,16566,35768,33709,9345, 20023,3183, 23541,10267,25936, - 846, 21450,24731,19776,14863,18442,30245,15561,9148, 28428,19737,6026, 26133,3264, 34679,36112,24229,3152, 38266,39149,21352,37414,35973,26288,34500,5497, 5908, + 846, 21450,24731,19776,14863,18442,30245,15561,9148, 28428,19737,6026, 26133,3264, 34679,36112,24229,3152, 38266,39149,21352,37414,35973,26288,34500,5497, 5908, 39148,20863,30139,38630,33533,37369,7842, 3537, 38693,36180,34480,21950,36914,8758, 37644,1477, 1453, 15785,14823,6102, 25897,28622,14555,34309,35781,36414,36686, 34832,35389,34996,8065, 7728, 9998, 7639, 35787,11199,31079,35244,2717, 21433,33106,26741,19349,14842,22817,12011,8887, 12425,11272,37199,39034,22172,10256,12496, 30555,18561,18412,28631,9000, 10305,16530,11365,26708,22271,2051, 28821,15945,32788,3160, 27169,28009,14489,32300,37736,8932, 24254,33344,37182,29563,6354, 15878, @@ -19976,11 +19971,11 @@ static const unsigned short Ranks[197839] = 2545, 16261,10864,33314,25284,37368,29579,36101,9961, 36101,37287,39001,39000,4249, 22238,12051,36830,37372,8268, 37062,29578,1204, 30389,22237,8870, 36101,37368, 3534, 3462, 39112,41159,39000,41159,34247,41158,39000,32982,37950,41158,4415, 33533,13397,41158,25020,27974,37094,34247,37368,41158,35071,34752,2242, 3181, 20020, 37141,41157,22236,41157,39000,7019, 41157,18683,8571, 12564,34068,38999,38999,3244, 34895,37873,5485, 36935,38999,41157,35071,15174,10135,41156,38999,16949,20897, - 19336,38209,36100,15865,38113,34594,35087,34375,32156,41156,36834,17934,14080,37090,38999,36811,32268,11616,32945,2839, 36086,38924,38998,18682,28954,15215,4750, + 19336,38209,36100,15865,38113,34594,35087,34375,32156,41156,36834,17934,14080,37090,38999,36811,32268,11616,32945,2839, 36086,38924,38998,18682,28954,15215,4750, 16654,11449,11412,152, 7232, 27483,27474,4522, 8140, 21021,37367,38998,3790, 36461,19333,25893,26543,37583,38998,27973,12130,38163,18156,9638, 33533,5703, 18155, 24294,37367,31396,31686,35624,35584,41156,17605,8138, 41156,41155,29141,36100,8833, 26411,16649,15864,2285, 30289,10358,38998,34246,37367,38997,38997,41155,35277, 41155,37367,1964, 38997,41155,4351, 25283,35690,7638, 37366,38997,41154,37366,11243,41154,25282,2191, 702, 39015,13021,10448,23685,35941,33532,20730,2411, 33532, - 41154,5045, 33532,6630, 423, 7401, 31676,17218,74, 16852,986, 3758, 32878,22755,21806,20067,21892,20000,20019,7448, 36100,14618,34246,38996,41154,38996,8769, + 41154,5045, 33532,6630, 423, 7401, 31676,17218,74, 16852,986, 3758, 32878,22755,21806,20067,21892,20000,20019,7448, 36100,14618,34246,38996,41154,38996,8769, 8047, 31338,22235,38996,38996,21436,29718,10243,28268,24132,41153,38995,34246,26210,14006,41153,35070,38015,32924,37366,17803,16574,19332,35110,16206,36286,37366, 37365,38995,36100,17963,8075, 33298,22524,7263, 16643,29577,8552, 28798,26008,38533,34857,34473,6877, 18154,34246,4194, 23115,15394,886, 1142, 17801,10477,25090, 27711,23114,27164,9637, 26519,1232, 17604,13977,36054,41153,34245,35779,39375,22234,38995,32987,9785, 7763, 16642,9240, 20737,38995,36759,36099,6526, 16295,39385, @@ -19988,20 +19983,20 @@ static const unsigned short Ranks[197839] = 34453,20145,29152,23113,39023,27746,29515,37365,2919, 36153,38808,34709,37365,36162,33532,41152,37490,34782,41152,352, 19830,37290,24131,36099,31394,36099,39410, 26542,37364,37375,27280,38031,32615,38265,41151,34138,27379,37604,6778, 18681,20018,20017,38994,2201, 29149,20016,32837,38129,15698,38993,35651,36586,21150,34132, 35380,19972,38993,1553, 38993,41151,13396,18153,1405, 33531,14346,33096,41151,24219,1115, 22955,8200, 26365,15572,29089,2504, 32776,18618,13763,32362,23785,20643, - 41151,32773,2889, 26557,34496,18715,1285, 25281,36, 16505,3441, 15863,13584,28840,22158,26747,36596,38993,41150,27972,22233,41150,33531,50, 38735,12943,9023, + 41151,32773,2889, 26557,34496,18715,1285, 25281,36, 16505,3441, 15863,13584,28840,22158,26747,36596,38993,41150,27972,22233,41150,33531,50, 38735,12943,9023, 3544, 11982,13127,38992,27971,31393,26541,33531,41150,15862,34593,4096, 11088,18680,8832, 18679,18678,33531,20678,47, 19999,16204,10059,8540, 7874, 34245,29096, - 16203,10362,21435,16641,13827,24130,36099,20015,20014,10133,17603,36692,31392,36098,36098,15029,2201, 24037,13813,41150,41149,15861,16680,20013,41149,34971,3383, - 27970,35070,33041,13829,37448,27336,41149,33530,41149,19887,34069,22792,41148,39262,16679,15798,29576,41148,3180, 27293,38983,27350,36098,1703, 18677,15797,3177, - 24129,14079,10813,1619, 7580, 24128,126, 4466, 18956,21053,26136,23649,29414,33049,36676,36563,16640,30014,37383,6909, 39124,37786,22709,15860,9576, 38454,7447, + 16203,10362,21435,16641,13827,24130,36099,20015,20014,10133,17603,36692,31392,36098,36098,15029,2201, 24037,13813,41150,41149,15861,16680,20013,41149,34971,3383, + 27970,35070,33041,13829,37448,27336,41149,33530,41149,19887,34069,22792,41148,39262,16679,15798,29576,41148,3180, 27293,38983,27350,36098,1703, 18677,15797,3177, + 24129,14079,10813,1619, 7580, 24128,126, 4466, 18956,21053,26136,23649,29414,33049,36676,36563,16640,30014,37383,6909, 39124,37786,22709,15860,9576, 38454,7447, 18570,35975,26632,11052,15583,34972,9122, 21434,37364,5052, 11677,37424,24553,2211, 38233,41148,10229,13583,41148,41147,35070,30007,33972,37364,41147,41147,38992, 17745,20012,37364,36098,41147,35314,37288,12129,9694, 10058,25083,14806,26423,10935,16678,844, 24127,7721, 36097,36097,3243, 22689,37363,41146,11448,33530,32924, 9668, 9500, 38992,35070,22232,33530,37363,38992,32924,11447,31391,29575,41146,36649,31390,38991,41146,37520,27969,38991,66, 20011,37109,30501,15358,799, 39121, 33703,7248, 38253,24835,33572,7793, 11909,20192,15859,26540,41146,18428,32888,8955, 2837, 41145,5108, 32075,9721, 16204,37413,8248, 725, 18676,34719,41145,35179, 29862,252, 11981,17076,38991,29574,1663, 9121, 37363,38991,37363,7810, 15858,3461, 22740,15857,34534,38990,41145,8968, 19174,30931,6254, 3262, 18895,21223,14124, 25503,21492,20359,25599,14758,9164, 26974,32223,23052,32831,18245,15117,27133,600, 6929, 7398, 4232, 9231, 3195, 26342,23699,24681,27729,36282,26539,39376,12875, - 30049,35872,17107,36279,34385,7350, 41145,3929, 6529, 7758, 5617, 34771,4980, 34545,28298,33148,41144,27629,7985, 6912, 1922, 5299, 39048,15028,11049,6138, 9763, + 30049,35872,17107,36279,34385,7350, 41145,3929, 6529, 7758, 5617, 34771,4980, 34545,28298,33148,41144,27629,7985, 6912, 1922, 5299, 39048,15028,11049,6138, 9763, 16677,9011, 18675,30429,15212,33235,7761, 30561,34101,15149,34421,38793,36450,17212,26537,24491,22645,3578, 10410,22141,28078,31517,32980,35500,20010,32527,41144, - 23430,9065, 33340,41144,8048, 24126,38990,8558, 33431,35448,8191, 25280,34172,38470,37362,37362,33530,32923,19998,37362,35069,32923,7076, 12378,29128,3989, 3029, + 23430,9065, 33340,41144,8048, 24126,38990,8558, 33431,35448,8191, 25280,34172,38470,37362,37362,33530,32923,19998,37362,35069,32923,7076, 12378,29128,3989, 3029, 28293,29667,25529,14572,38544,957, 41144,37362,28055,37361,35721,25279,38990,4871, 35777,34306,35309,38479,12321,10355,4155, 32342,37430,5617, 15076,38341,32281, 33445,10869,16639,5568, 34396,36078,36423,16459,29141,11648,12692,17602,41143,41143,14324,1866, 7760, 39283,10860,12878,12377,17055,14323,36638,18424,188, 30872, 2013, 2645, 18674,37478,38065,30442,1493, 8551, 35831,1205, 27248,21326,30792,38990,36494,24421,21898,10439,2836, 35296,37361,24125,38989,31389,10812,36097,41143, @@ -20011,18 +20006,18 @@ static const unsigned short Ranks[197839] = 26502,10868,34916,35507,36096,34897,27967,36096,41140,35068,28580,1758, 32923,36341,13692,33529,38988,1, 244, 191, 20009,30, 131, 8194, 20310,24124,33529, 34180,29894,37360,35068,37360,41140,36096,38810,6457, 38988,3179, 4790, 38988,35068,16202,12128,26537,27, 5546, 15393,1404, 37360,37360,34245,1178, 36096,33528, 2293, 38988,34084,32923,41139,41139,6736, 21679,10867,19997,5177, 12507,9927, 11277,35068,33528,28637,10057,37359,14679,41139,36095,3037, 6990, 16675,11363,31109, - 20, 21761,9010, 31387,7787, 1591, 20621,19434,41139,380, 194, 1606, 37359,11980,33488,36707,6922, 17075,25278,38987,17553,38987,35067,2466, 22416,27098,683, + 20, 21761,9010, 31387,7787, 1591, 20621,19434,41139,380, 194, 1606, 37359,11980,33488,36707,6922, 17075,25278,38987,17553,38987,35067,2466, 22416,27098,683, 7446, 7229, 23112,3175, 17601,18673,13379,33810,38987,41138,41138,9762, 13126,36975,35067,20008,21190,13582,37542,4754, 11647,41138,38987,41138,36102,12255,22912, 38382,14202,17833,18471,41137,38986,41137,35351,36687,24456,38986,37764,37359,37444,23928,36032,26536,41137,35067,12052,38418,36828,19121,12667,22200,7535, 20608, 26300,771, 31799,12408,8969, 33354,29573,9707, 3374, 35685,37359,21992,9524, 35938,18125,41137,33057,4021, 11087,38986,34550,31158,8467, 41136,5704, 37358,33528, - 3612, 34310,22376,35266,3840, 34700,4343, 3071, 15607,34532,4748, 15027,34244,32799,37358,28379,21080,38099,19470,2753, 27547,34446,37147,3459, 2644, 23584,2533, + 3612, 34310,22376,35266,3840, 34700,4343, 3071, 15607,34532,4748, 15027,34244,32799,37358,28379,21080,38099,19470,2753, 27547,34446,37147,3459, 2644, 23584,2533, 6921, 15825,35304,2835, 11362,13581,38588,19180,35289,8064, 3495, 12300,38986,27043,22522,16811,18672,15964,29048,3544, 10775,2012, 25839,41136,37277,26535,38985, 2798, 37690,41136,41136,36938,32922,10361,38227,8284, 36095,19367,16915,3388, 1836, 26939,38800,36095,35110,9926, 14571,38321,33528,41135,38496,38985,2752, 41135, 37358,22231,3533, 20454,41135,22230,34244,34244,36095,38985,34976,20478,33942,38505,38985,22789,22925,41135,38984,34244,35543,32922,41134,8626, 26790,37014,37964, 28482,38646,18671,13976,33938,34170,27882,32795,17209,35408,38734,41134,27326,27032,35540,8615, 339, 27760,3458, 174, 20599,13770,22434,14786,10237,10339,14810, 13044,26940,11605,8940, 16281,17033,17074,36094,2341, 15245,27966,34838,33000,6298, 6738, 15691,14933,17774,32852,2539, 3098, 6239, 31805,28924,21499,23814,26890, 38136,8998, 31386,37358,31385,38422,38984,41134,8869, 38984,41134,41133,27965,41133,37757,32922,32922,41133,37357,33527,27964,37357,16638,33527,34163,15392,33527, - 19349,37357,37357,17552,35067,38984,36094,1905, 15874,25862,41133,24832,37356,788, 8868, 173, 4096, 26534,31384,636, 26533,37356,24123,38983,936, 949, 9636, + 19349,37357,37357,17552,35067,38984,36094,1905, 15874,25862,41133,24832,37356,788, 8868, 173, 4096, 26534,31384,636, 26533,37356,24123,38983,936, 949, 9636, 17600,38983,3387, 16086,41132,34243,36094,35066,38983,10591,30892,35506,41132,27963,35066,41132,41132,36094,16933,32921,15904,36093,19141,41131,41131,29572,37356, 30289,12551,38983,24691,37356,33193,32921,37355,20007,35730,37355,41131,10513,39213,35094,26044,41131,34748,23111,4895, 37355,36093,28039,39025,38982,37114,38088, 36093,41130,38982,33527,14867,20529,32127,32996,33313,17534,22229,35105,16201,16637,5517, 37355,27962,31383,33526,33526,34367,38982,18388,41130,16200,37354,41130, @@ -20046,7 +20041,7 @@ static const unsigned short Ranks[197839] = 37347,32918,35063,38972,36088,13974,1893, 17071,37347,41116,41116,35063,41116,35063,36088,41116,33525,34239,36088,17771,19902,20005,13394,34239,23675,12727,11242, 6498, 15213,36977,38972,27961,36088,33525,5891, 34017,34238,959, 8252, 32918,15856,35063,33525,15025,35062,35593,23106,41115,37347,41115,38972,38971,35062,19996, 31376,32782,22370,37347,41115,38971,10693,1067, 19329,20004,35062,41115,3268, 7541, 7350, 38971,36087,31375,9120, 11051,41114,35482,737, 19328,41114,15855,23105, - 38971,35062,36087,37346,36087,9635, 28278,37346,33524,37346,34207,34238,12723,33808,41114,41114,20674,21430,32241,31586,41113,36087,33327,24653,6553, 1621, 1152, + 38971,35062,36087,37346,36087,9635, 28278,37346,33524,37346,34207,34238,12723,33808,41114,41114,20674,21430,32241,31586,41113,36087,33327,24653,6553, 1621, 1152, 41113,36806,38934,5967, 8315, 32051,23104,14570,37019,3835, 35061,38770,37346,3532, 33591,36086,14857,13744,2177, 32918,33524,41113,23103,9499, 1849, 13393,29568, 27960,20673,20672,41113,31374,33206,37345,18152,19995,31373,21429,37125,38284,16198,1743, 36086,36509,34238,3742, 17598,37345,18151,735, 34549,10449,20003,35061, 38970,15389,27628,35061,8768, 41112,34060,19327,38970,41112,36499,32917,33078,37345,6876, 17715,36086,37345,18089,34651,12127,1759, 21031,28945,36622,2672, 13580, @@ -20060,18 +20055,18 @@ static const unsigned short Ranks[197839] = 32358,23967,34804,2710, 5922, 18839,31697,36085,22224,10056,34237,38966,2827, 41106,27958,41105,38075,41105,11361,3957, 41105,22117,38966,37340,31370,23667,38892, 31369,6068, 17597,36084,36084,34236,37340,20671,35253,32916,41105,41104,4036, 12047,36100,35550,29566,38966,38965,29565,41104,36084,14078,37340,1832, 37340,19325, 27957,34236,34236,23374,396, 4640, 38638,34000,1620, 12359,5568, 18710,35059,31368,28383,36084,37339,15788,13312,33173,17596,9009, 32916,33522,20670,6628, 32916, - 36083,32916,37339,4012, 14676,33522,41104,4325, 31367,41104,26525,32853,23102,33522,37339,35059,35133,36083,17595,35058,39027,38965,34236,35058,14675,32987,7230, - 11310,7194, 18816,3073, 22180,41103,28391,27351,37339,27956,41103,18669,19993,35058,9922, 1074, 32282,31366,20002,31826,13579,13578,4521, 20982,32299,27367,2939, + 36083,32916,37339,4012, 14676,33522,41104,4325, 31367,41104,26525,32853,23102,33522,37339,35059,35133,36083,17595,35058,39027,38965,34236,35058,14675,32987,7230, + 11310,7194, 18816,3073, 22180,41103,28391,27351,37339,27956,41103,18669,19993,35058,9922, 1074, 32282,31366,20002,31826,13579,13578,4521, 20982,32299,27367,2939, 7874, 19322,38364,32649,41103,32104,37468,37338,20669,41103,22267,20001,21807,41102,24117,38965,21428,8997, 35058,36083,33522,41102,41102,8549, 7761, 2011, 41102, 32289,6416, 18668,37990,34235,38965,35057,38964,35057,24655,33786,35979,34148,37628,38919,34240,38730,33521,31365,18468,23457,30506,38594,30520,38746,36083,41101, 32784,21996,19835,41101,37338,33061,33949,16669,13566,38593,31384,38964,36082,41101,36082,33521,31746,33521,17011,15706,36082,34109,32647,38147,18709,41101,35968, 27955,37338,41100,4183, 35780,21927,38932,41100,25272,1091, 41100,24218,41100,12376,41099,24116,38007,4376, 2354, 38964,25271,29564,38964,37086,20277,32915,17685, - 36075,1104, 15101,1476, 18667,37338,35438,37337,36082,41099,41099,11898,38963,41099,19324,12615,23101,11241,27954,18708,36081,41098,37337,34235,13596,37337,4633, - 12536,26175,38963,37337,8418, 30314,29558,41098,611, 13382,22903,5403, 37412,41098,41098,41097,36081,41097,37336,21090,1533, 14954,41097,1141, 12188,3466, 3586, + 36075,1104, 15101,1476, 18667,37338,35438,37337,36082,41099,41099,11898,38963,41099,19324,12615,23101,11241,27954,18708,36081,41098,37337,34235,13596,37337,4633, + 12536,26175,38963,37337,8418, 30314,29558,41098,611, 13382,22903,5403, 37412,41098,41098,41097,36081,41097,37336,21090,1533, 14954,41097,1141, 12188,3466, 3586, 38872,3531, 8007, 13111,14137,37836,27438,2174, 37609,2760, 20000,9089, 12398,35301,8599, 5913, 6988, 13577,38474,33059,37259,31458,22539,8050, 13082,15853,29325, 38524,41097,1550, 1370, 14540,16191,35057,27953,41096,15212,10604,37336,27952,17594,32062,34235,36081,6533, 29563,35057,29512,31419,15770,21633,29193,41096,37336, 34235,2172, 5684, 28190,30358,16171,32915,41096,38963,35595,36081,39292,41096,38963,36080,38522,34933,35056,35558,32776,37336,19572,37335,34234,41095,31291,34234, - 34883,26202,16714,16067,38962,33850,41095,38146,34647,22593,30590,8548, 38962,41095,27788,25560,25096,29521,29796,18540,38898,13153,41095,32858,17239,14939,3739, + 34883,26202,16714,16067,38962,33850,41095,38146,34647,22593,30590,8548, 38962,41095,27788,25560,25096,29521,29796,18540,38898,13153,41095,32858,17239,14939,3739, 37335,41094,35617,38044,33205,29562,4603, 41094,11240,36080,36080,32658,38962,31364,35056,38962,41094,38961,35056,22223,23917,38961,19999,19992,32915,32915,41094, 38961,16197,25270,7309, 29932,8649, 35056,41093,33521,12375,38961,32914,25269,26524,38960,18862,31363,20668,30229,38960,32914,22838,25268,38642,12111,37335,39162, 8006, 41093,37335,37334,8648, 41093,38969,1679, 21427,34234,1969, 38960,29592,30090,31344,38960,41093,34234,11050,1864, 37408,6330, 29561,33507,32204,18279,38959, @@ -20079,7 +20074,7 @@ static const unsigned short Ranks[197839] = 38959,35310,35055,41092,31362,10692,25266,41092,3916, 38760,37334,13973,38958,41091,34232,24115,41091,35448,38958,36079,41091,32913,34278,36079,35055,29559,18666, 38958,36824,41091,15852,16926,27650,37072,1886, 23103,38136,31099,34335,34615,36078,15460,37333,26523,33520,36078,20667,30824,16655,41090,17070,29558,37333,24961, 36052,14319,26302,29557,35054,18150,34232,33520,36078,38958,11239,41090,26996,37333,37333,35443,36078,23100,21994,38957,30046,13282,13824,37501,5201, 2687, 24062, - 700, 21029,15735,29696,32797,19278,14703,2053, 25216,20486,2174, 4417, 6483, 20812,31519,21303,13429,4864, 1562, 28753,6723, 9325, 5692, 25108,7575, 28825,57, + 700, 21029,15735,29696,32797,19278,14703,2053, 25216,20486,2174, 4417, 6483, 20812,31519,21303,13429,4864, 1562, 28753,6723, 9325, 5692, 25108,7575, 28825,57, 8657, 13834,13894,25404,31045,39, 16664,2328, 13347,3843, 30170,27740,28240,12750,31206,21026,16616,31120,8117, 17272,38957,18707,19660,8789, 18706,20824,34259, 26613,5521, 38957,37332,13690,18951,38957,25972,19991,31643,36009,41090,32913,34232,33520,16423,22876,8474, 25073,18165,8582, 7418, 19571,7725, 8108, 32586,29917, 4078, 22433,25409,18878,8679, 9784, 19998,12513,36366,33730 @@ -20087,2727 +20082,2728 @@ static const unsigned short Ranks[197839] = #define SizeChildMapEntry 8 static const unsigned char ChildMap[13547*8] = { - 251,244,63, 152,255,255,255,7, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 64, 0, 0, 0, 0, 128,0, - 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 128,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 8, 0, 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 0, 128,0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 16, 128,63, 0, 255,255,127,1, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 128,0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 56, 2, 0, - 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 16, 0, 2, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 8, 0, 8, 0, 0, 0, 0, 0, 17, 0, 8, 0, 0, 0, 0, 0, 17, 73, 18, 0, - 0, 0, 0, 0, 14, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 1, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 1, 0, 16, 0, 0, 0, 0, 0, 129,73, 0, 0, - 0, 0, 0, 0, 16, 16, 0, 0, 0, 0, 0, 0, 17, 64, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 1, 48, 0, 0, 0, 0, 0, 0, 1, 65, 18, 0, - 0, 0, 0, 0, 0, 16, 8, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 16, 0, 4, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 16, 64, 0, 0, - 0, 0, 0, 0, 16, 65, 2, 0, 0, 0, 0, 0, 0, 32, 8, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 8, 72, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, - 0, 0, 0, 0, 17, 65, 16, 0, 0, 0, 0, 0, 0, 128,34, 0, 0, 0, 0, 0, 1, 0, 2, 1, 0, 0, 0, 0, 64, 0, 4, 0, 0, 0, 0, 0, 0, 24, 88, 0, - 0, 0, 0, 0, 1, 64, 16, 0, 0, 0, 0, 0, 16, 1, 0, 0, 0, 0, 0, 0, 17, 73, 0, 0, 0, 0, 0, 0, 8, 32, 4, 0, 0, 0, 0, 0, 32, 0, 8, 0, - 0, 0, 0, 0, 96, 4, 40, 0, 0, 0, 0, 0, 4, 96, 102,0, 0, 0, 0, 0, 1, 65, 16, 0, 0, 0, 0, 0, 64, 36, 4, 0, 0, 0, 0, 0, 8, 0, 14, 0, - 0, 0, 0, 0, 25, 64, 0, 0, 0, 0, 0, 0, 0, 1, 16, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 32, 74, 0, 0, 0, 0, 0, 32, 168,58, 0, - 0, 0, 0, 0, 8, 0, 0, 1, 0, 0, 0, 0, 16, 8, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 16, 72, 18, 0, 0, 0, 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 0, 136,68, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 16, 65, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 4, 0, 16, 1, - 0, 0, 0, 0, 149,209,24, 0, 0, 0, 0, 0, 4, 8, 0, 0, 0, 0, 0, 0, 0, 64, 2, 0, 0, 0, 0, 0, 0, 40, 2, 0, 0, 0, 0, 0, 36, 48, 16, 0, - 0, 0, 0, 0, 0, 32, 10, 0, 0, 0, 0, 0, 145,65, 66, 0, 0, 0, 0, 0, 17, 1, 2, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 6, 0, - 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 192,0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 145,65, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, - 0, 0, 0, 0, 0, 8, 4, 0, 0, 0, 0, 0, 17, 65, 0, 1, 0, 0, 0, 0, 0, 32, 2, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 8, 8, 0, 0, - 0, 0, 0, 0, 0, 16, 2, 0, 64, 0, 0, 0, 0, 0, 8, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 0, 1, 0, 0, 1, 0, 133,36, 8, 0, - 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 8, 2, 0, 0, 0, 0, 0, 0, 128,1, 0, 244,63, 0, 12, 200,86, 0, - 0, 4, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 112,63, 0, 0, 0, 4, 0, 0, 240,62, 0, 0, 0, 0, 0, 0, 48, 40, 0, 1, 0, 0, 0, - 0, 112,62, 0, 1, 0, 8, 0, 0, 48, 8, 0, 1, 0, 1, 2, 0, 48, 8, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 8, 64, 0, 0, - 0, 0, 32, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 4, 0, 0, 0, 0, 0, 0, 176,32, 0, 0, 0, 0, 0, 0, 128,0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, - 0, 80, 8, 0, 2, 2, 0, 0, 0, 16, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 16, 16, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, - 0, 240,49, 0, 0, 0, 8, 0, 0, 224,61, 0, 0, 0, 0, 0, 0, 96, 16, 0, 8, 0, 0, 0, 0, 48, 62, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, - 0, 240,63, 0, 0, 0, 0, 0, 0, 240,35, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, - 0, 0, 40, 0, 0, 0, 0, 0, 0, 160,0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 128,16, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, - 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 0, 0, 0, 0, 80, 16, 0, 0, 0, 0, 0, 0, 144,0, 0, 0, 0, 0, 0, 0, 48, 19, 0, 0, 0, 0, 0, - 0, 224,63, 0, 0, 0, 0, 0, 0, 32, 2, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 160,36, 0, 0, 0, 0, 0, 0, 144,59, 0, 0, 0, 0, 0, - 0, 112,63, 0, 0, 0, 0, 0, 0, 192,63, 0, 0, 0, 0, 0, 0, 208,30, 0, 0, 0, 0, 0, 0, 96, 13, 0, 0, 0, 0, 0, 0, 208,63, 0, 0, 0, 0, 0, - 0, 32, 54, 0, 0, 0, 0, 0, 0, 240,61, 0, 0, 0, 0, 0, 0, 144,13, 0, 0, 0, 0, 0, 0, 160,14, 0, 0, 0, 0, 0, 0, 176,47, 0, 0, 0, 0, 0, - 0, 16, 1, 0, 0, 0, 0, 0, 0, 128,44, 0, 0, 0, 0, 0, 0, 160,63, 0, 0, 0, 0, 0, 0, 128,17, 0, 0, 0, 0, 0, 0, 32, 16, 0, 0, 0, 0, 0, - 0, 208,48, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 64, 0, 0, 1, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, - 0, 240,0, 0, 0, 0, 0, 0, 0, 48, 16, 0, 0, 0, 0, 0, 0, 64, 2, 0, 0, 0, 0, 0, 0, 16, 57, 0, 0, 0, 0, 0, 0, 48, 22, 0, 0, 0, 0, 0, - 0, 128,18, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 8, 0, 0, 32, 24, 0, 0, 128,0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, - 0, 0, 32, 0, 0, 4, 0, 0, 0, 0, 32, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 32, 0, 2, 0, 255,63, 0, 255,255,255,3, 0, 0, 2, 0, 24, 0, 0, 0, - 0, 32, 0, 0, 0, 4, 4, 0, 0, 240,127,0, 13, 145,12, 0, 0, 240,63, 0, 0, 16, 12, 1, 0, 16, 0, 0, 0, 16, 8, 0, 0, 48, 0, 0, 0, 0, 4, 0, - 0, 240,8, 0, 0, 0, 4, 0, 0, 224,34, 0, 0, 0, 0, 0, 0, 16, 32, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, - 0, 208,33, 0, 0, 32, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 32, 0, 0, 0, 0, 2, 0, 0, 128,0, 0, 0, 0, 8, 0, - 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 1, 0, 0, 0, 0, 16, 16, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 129,0, 0, 0, 0, 0, 0, 0, 0, 12, 0, - 0, 0, 0, 0, 1, 128,0, 0, 0, 240,63, 0, 7, 134,9, 0, 0, 112,23, 0, 0, 16, 12, 0, 0, 240,10, 0, 1, 8, 13, 2, 0, 96, 33, 0, 1, 0, 1, 0, - 0, 96, 0, 0, 1, 0, 1, 2, 0, 96, 0, 0, 1, 0, 65, 2, 0, 32, 16, 0, 1, 0, 1, 0, 0, 32, 0, 0, 1, 0, 0, 0, 0, 128,32, 0, 0, 0, 0, 0, - 0, 128,0, 0, 1, 0, 1, 0, 0, 16, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 64, 16, 0, 0, 224,3, 0, 0, 0, 8, 0, 0, 160,0, 0, 0, 0, 1, 0, - 0, 48, 3, 0, 1, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 128,1, 0, 0, 0, 8, 0, 0, 96, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 8, 0, - 0, 32, 12, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 8, 0, 0, 32, 32, 0, 0, 0, 0, 0, 0, 64, 32, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, - 0, 0, 16, 0, 1, 0, 8, 0, 0, 32, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 16, 0, 0, 0, 240,63, 0, 17, 153,13, 0, 0, 224,7, 0, 8, 16, 8, 0, - 0, 0, 10, 0, 0, 0, 0, 0, 0, 240,3, 0, 16, 0, 4, 0, 0, 160,0, 0, 1, 0, 1, 0, 0, 64, 32, 0, 0, 0, 0, 0, 0, 160,0, 0, 1, 0, 1, 2, - 0, 32, 1, 0, 0, 0, 0, 0, 0, 160,3, 0, 0, 32, 0, 0, 0, 128,1, 0, 0, 0, 0, 0, 0, 242,63, 0, 187,158,239,2, 0, 48, 32, 0, 0, 0, 0, 0, - 0, 176,9, 0, 49, 0, 69, 2, 0, 0, 0, 0, 0, 0, 65, 0, 0, 160,2, 0, 0, 0, 0, 0, 0, 224,0, 0, 0, 0, 0, 0, 0, 192,1, 0, 0, 0, 0, 0, - 0, 16, 8, 0, 0, 0, 0, 0, 0, 192,5, 0, 0, 0, 0, 0, 0, 48, 3, 0, 9, 9, 69, 2, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 1, 0, 65, 0, - 0, 240,63, 0, 1, 4, 3, 2, 0, 64, 1, 0, 0, 0, 0, 0, 0, 128,3, 0, 0, 0, 0, 0, 4, 112,63, 0, 127,63, 239,2, 0, 128,0, 0, 0, 1, 0, 0, - 0, 240,62, 4, 255,255,239,3, 0, 112,56, 0, 11, 30, 127,2, 0, 112,48, 0, 13, 25, 69, 2, 64, 116,48, 0, 127,255,239,3, 0, 16, 32, 0, 9, 216,69, 2, - 0, 0, 0, 0, 1, 0, 64, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 128,2, 0, 0, 8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 8, 0, - 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 40, 0, 1, 0, 1, 2, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 28, 0, 0, 0, 0, 0, - 0, 16, 28, 0, 0, 0, 0, 0, 0, 160,1, 0, 3, 8, 4, 0, 0, 0, 0, 0, 4, 0, 32, 0, 0, 32, 0, 0, 8, 0, 0, 0, 0, 128,0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 16, 16, 0, - 0, 0, 0, 0, 0, 0, 132,0, 0, 160,0, 0, 1, 0, 65, 0, 0, 32, 0, 0, 0, 0, 64, 0, 0, 32, 0, 0, 0, 0, 1, 0, 0, 32, 0, 0, 17, 0, 0, 0, - 0, 160,1, 0, 1, 0, 3, 0, 0, 0, 0, 0, 24, 0, 2, 0, 0, 0, 0, 0, 0, 1, 32, 0, 0, 32, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 16, 0, 64, 0, - 0, 0, 0, 0, 0, 1, 0, 2, 0, 144,18, 0, 4, 0, 8, 0, 0, 128,12, 0, 0, 0, 0, 0, 0, 80, 23, 0, 4, 0, 72, 0, 0, 32, 24, 0, 0, 0, 0, 0, - 0, 16, 0, 0, 0, 0, 8, 0, 0, 64, 2, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 16, 8, 0, 0, 0, 16, 0, 0, 0, 8, 0, 0, 0, 0, 0, 1, 24, 0, 0, - 0, 128,0, 0, 0, 0, 64, 0, 0, 160,0, 0, 17, 0, 0, 0, 0, 240,63, 0, 0, 0, 8, 0, 0, 192,5, 0, 128,2, 12, 0, 0, 192,3, 0, 0, 0, 4, 0, - 0, 32, 4, 0, 0, 0, 0, 0, 0, 128,7, 0, 32, 32, 0, 0, 0, 128,6, 0, 0, 0, 0, 0, 0, 96, 0, 0, 1, 0, 2, 0, 0, 64, 4, 0, 0, 4, 8, 0, - 0, 64, 18, 0, 1, 0, 1, 0, 0, 96, 14, 0, 0, 0, 8, 0, 0, 96, 52, 0, 0, 0, 0, 0, 0, 64, 8, 0, 0, 0, 0, 0, 0, 114,58, 0, 1, 0, 0, 0, - 0, 64, 36, 0, 0, 0, 8, 0, 0, 32, 32, 0, 0, 0, 8, 0, 0, 240,63, 0, 0, 0, 60, 0, 0, 192,14, 0, 0, 0, 8, 0, 0, 32, 7, 0, 0, 0, 4, 0, - 0, 0, 18, 0, 0, 32, 0, 0, 0, 176,0, 0, 0, 0, 2, 0, 0, 16, 0, 0, 0, 0, 4, 0, 0, 16, 1, 0, 0, 0, 8, 0, 0, 192,4, 0, 0, 0, 8, 0, - 0, 128,8, 0, 0, 0, 0, 0, 0, 240,58, 0, 0, 0, 8, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 144,32, 0, 0, 0, 0, 0, 0, 128,2, 0, 0, 0, 0, 0, - 0, 32, 16, 0, 0, 0, 4, 0, 0, 192,2, 0, 0, 0, 8, 0, 0, 240,63, 0, 8, 0, 12, 0, 0, 112,10, 0, 0, 16, 8, 0, 0, 0, 0, 0, 0, 16, 4, 0, - 0, 80, 6, 0, 0, 32, 4, 0, 0, 16, 2, 0, 64, 32, 0, 0, 0, 240,13, 0, 0, 0, 2, 0, 0, 80, 0, 0, 0, 0, 24, 0, 0, 16, 3, 0, 0, 16, 8, 0, - 0, 144,32, 0, 0, 0, 8, 0, 0, 240,61, 0, 0, 0, 8, 0, 0, 16, 8, 0, 0, 0, 4, 0, 0, 112,19, 0, 1, 0, 1, 0, 0, 112,51, 0, 1, 0, 1, 2, - 0, 32, 3, 0, 0, 0, 0, 0, 0, 240,63, 0, 32, 16, 8, 0, 0, 16, 2, 0, 0, 0, 8, 0, 0, 64, 8, 0, 0, 0, 4, 0, 0, 16, 2, 0, 0, 32, 0, 0, - 0, 16, 0, 0, 0, 0, 2, 0, 0, 144,8, 0, 0, 0, 8, 0, 0, 16, 4, 0, 0, 0, 8, 0, 0, 16, 32, 0, 0, 0, 8, 0, 0, 48, 46, 0, 0, 0, 8, 0, - 0, 32, 0, 0, 9, 0, 0, 0, 0, 64, 24, 0, 0, 0, 4, 0, 0, 48, 22, 0, 0, 32, 0, 0, 0, 48, 12, 0, 0, 0, 8, 0, 0, 144,0, 0, 0, 0, 8, 0, - 0, 240,63, 0, 0, 32, 8, 0, 0, 48, 36, 0, 8, 0, 8, 0, 0, 80, 0, 0, 0, 0, 4, 0, 0, 16, 26, 0, 0, 32, 0, 0, 0, 16, 1, 0, 0, 0, 2, 0, - 0, 48, 0, 0, 0, 0, 8, 0, 0, 80, 1, 0, 0, 0, 8, 0, 0, 80, 0, 0, 0, 0, 8, 0, 0, 240,63, 0, 8, 16, 8, 0, 0, 144,4, 0, 0, 0, 12, 0, - 0, 32, 0, 0, 0, 0, 4, 0, 0, 48, 16, 0, 0, 32, 0, 0, 0, 16, 58, 0, 0, 0, 2, 0, 0, 48, 51, 0, 0, 0, 8, 0, 0, 16, 0, 0, 4, 0, 0, 0, - 0, 16, 2, 0, 0, 0, 0, 0, 0, 16, 4, 0, 0, 0, 0, 0, 0, 112,0, 0, 0, 0, 4, 0, 0, 112,0, 0, 0, 0, 0, 0, 0, 16, 12, 0, 0, 0, 0, 0, - 0, 176,0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 0, 112,2, 0, 0, 0, 0, 0, 0, 112,4, 0, 0, 17, 0, 0, 0, 208,0, 0, 0, 0, 0, 0, - 0, 112,32, 0, 4, 0, 0, 0, 0, 240,47, 0, 0, 0, 8, 0, 0, 80, 32, 0, 0, 0, 4, 0, 0, 240,1, 0, 0, 0, 0, 0, 0, 80, 2, 0, 0, 0, 0, 0, - 0, 48, 4, 0, 64, 0, 0, 0, 0, 64, 0, 0, 15, 184,22, 0, 0, 64, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 136,0, 4, 0, 0, 0, 0, 0, 128,0, 64, 0, 0, 0, 0, 0, 64, 0, 12, 0, 0, 0, 0, 0, 19, 73, 18, 0, - 0, 0, 0, 0, 10, 41, 14, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 16, 0, 8, 0, 0, 0, 0, 0, 64, 8, 10, 0, 0, 0, 0, 0, 40, 16, 8, 0, - 0, 0, 0, 0, 1, 65, 0, 0, 0, 0, 0, 0, 4, 32, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 0, - 0, 0, 0, 0, 0, 64, 4, 0, 0, 0, 0, 0, 66, 16, 0, 0, 0, 0, 0, 0, 0, 32, 32, 0, 0, 0, 0, 0, 10, 8, 12, 0, 0, 0, 0, 0, 8, 0, 4, 0, - 0, 0, 0, 0, 149,72, 2, 0, 0, 0, 0, 0, 0, 16, 6, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 8, 38, 0, 0, 0, 0, 0, 38, 80, 66, 0, - 0, 0, 0, 0, 0, 132,0, 0, 0, 0, 0, 0, 17, 1, 0, 1, 0, 0, 0, 0, 4, 0, 0, 2, 0, 0, 0, 0, 25, 65, 2, 0, 0, 0, 0, 0, 8, 44, 96, 0, - 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 64, 0, 2, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 2, 16, 0, 0, 0, 0, 0, 0, 0, 136,0, 0, - 0, 0, 0, 0, 1, 1, 16, 0, 0, 0, 0, 0, 25, 8, 132,0, 0, 0, 0, 0, 49, 73, 18, 0, 0, 0, 0, 0, 0, 64, 0, 1, 0, 0, 0, 0, 17, 1, 0, 0, - 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 81, 65, 18, 0, 0, 0, 0, 0, 2, 32, 8, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 1, 32, 2, 0, - 0, 0, 0, 0, 145,64, 144,0, 0, 0, 0, 0, 0, 144,66, 0, 0, 0, 0, 0, 8, 8, 2, 0, 0, 0, 0, 0, 4, 64, 0, 0, 0, 0, 0, 0, 1, 8, 2, 0, - 0, 0, 0, 0, 4, 48, 26, 0, 0, 0, 0, 0, 0, 32, 4, 0, 0, 0, 0, 0, 4, 33, 2, 0, 0, 0, 32, 0, 17, 66, 16, 0, 0, 0, 0, 0, 4, 20, 4, 0, - 0, 0, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 32, 32, 6, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 128,32, 6, 0, 0, 0, 0, 0, 144,0, 0, 0, - 0, 0, 0, 0, 17, 37, 0, 0, 0, 0, 0, 0, 0, 40, 8, 0, 0, 0, 0, 0, 17, 73, 16, 0, 0, 0, 0, 0, 64, 0, 8, 0, 0, 0, 0, 0, 64, 32, 8, 0, - 0, 0, 0, 0, 17, 81, 16, 0, 0, 0, 0, 0, 72, 32, 46, 0, 0, 0, 0, 0, 64, 33, 0, 0, 0, 0, 0, 0, 0, 1, 8, 0, 0, 0, 0, 0, 0, 24, 2, 0, - 0, 0, 0, 0, 4, 12, 0, 0, 0, 0, 0, 0, 128,4, 0, 0, 0, 0, 0, 0, 0, 104,26, 0, 0, 0, 0, 0, 16, 4, 12, 0, 0, 0, 0, 0, 129,0, 0, 0, - 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 32, 0, 6, 0, 0, 0, 0, 0, 17, 33, 4, 0, 0, 0, 0, 0, 0, 72, 2, 0, 0, 64, 0, 0, 145,73, 22, 0, - 0, 0, 0, 0, 4, 48, 12, 0, 0, 0, 0, 0, 128,1, 0, 0, 0, 0, 0, 0, 1, 160,8, 0, 0, 0, 0, 0, 0, 72, 0, 2, 0, 0, 0, 0, 0, 64, 66, 0, - 0, 224,0, 0, 1, 0, 65, 0, 0, 128,0, 0, 1, 0, 69, 0, 0, 64, 0, 0, 0, 0, 4, 3, 1, 208,0, 4, 0, 0, 196,2, 0, 0, 0, 0, 12, 0, 4, 0, - 0, 64, 0, 0, 16, 0, 0, 0, 0, 64, 0, 0, 0, 0, 2, 0, 0, 96, 8, 0, 0, 0, 16, 0, 0, 0, 0, 0, 6, 33, 0, 0, 0, 0, 0, 0, 8, 32, 0, 0, - 0, 0, 0, 0, 6, 0, 4, 0, 0, 0, 0, 0, 16, 0, 4, 1, 0, 32, 0, 0, 149,249,24, 0, 0, 0, 0, 0, 0, 25, 2, 0, 0, 0, 0, 0, 0, 64, 10, 0, - 0, 0, 0, 0, 4, 0, 130,0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 8, 0, 2, 0, 0, 0, 0, 0, 16, 24, 0, 0, 0, 0, 0, 0, 4, 128,0, 0, - 0, 0, 0, 0, 17, 0, 16, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 16, 136,32, 0, 0, 0, 0, 0, 68, 176,2, 0, 0, 0, 0, 0, 4, 4, 0, 0, - 0, 0, 0, 0, 145,65, 18, 0, 0, 0, 0, 0, 0, 32, 132,0, 0, 0, 0, 0, 16, 64, 16, 0, 0, 0, 0, 0, 96, 16, 8, 0, 0, 0, 0, 0, 80, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 8, 0, 0, 0, 0, 0, 0, 176,20, 0, 0, 0, 0, 0, 17, 65, 0, 0, 0, 0, 0, 0, 8, 16, 0, 0, 0, 0, 0, 0, 8, 4, 0, 0, - 0, 64, 0, 0, 129,65, 64, 0, 0, 0, 0, 0, 16, 0, 65, 0, 0, 0, 0, 0, 0, 40, 0, 2, 0, 0, 0, 0, 0, 32, 12, 0, 0, 64, 0, 0, 1, 0, 138,0, - 0, 0, 0, 0, 17, 0, 0, 1, 0, 64, 0, 0, 0, 0, 128,2, 0, 254,63, 0, 255,189,109,1, 0, 16, 0, 0, 0, 32, 0, 0, 0, 96, 4, 0, 0, 4, 0, 0, - 0, 240,15, 0, 8, 16, 12, 0, 0, 240,55, 0, 0, 16, 12, 0, 0, 48, 0, 0, 0, 2, 4, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, - 0, 64, 0, 0, 0, 16, 0, 0, 0, 112,36, 0, 0, 2, 4, 0, 0, 240,51, 0, 4, 0, 4, 0, 0, 160,6, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 1, - 0, 240,16, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 1, 0, 0, 32, 3, 0, 0, 0, 1, 0, 0, 240,31, 0, 0, 32, 9, 0, 0, 224,13, 0, 0, 0, 0, 0, - 0, 224,17, 0, 0, 0, 0, 0, 0, 128,5, 0, 0, 0, 0, 0, 0, 96, 7, 0, 0, 0, 0, 0, 0, 64, 22, 0, 0, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 0, - 0, 240,27, 0, 8, 2, 70, 0, 0, 80, 19, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 192,0, 0, 0, 0, 0, 0, 0, 64, 4, 0, 0, 0, 0, 0, - 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 4, 0, 0, 0, 240,30, 0, 66, 136,136,0, 0, 32, 5, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 128,0, 0, - 0, 0, 52, 0, 0, 0, 0, 0, 0, 112,48, 0, 0, 0, 0, 0, 0, 32, 4, 0, 0, 0, 16, 0, 0, 240,51, 0, 8, 16, 8, 0, 0, 208,51, 0, 4, 0, 8, 0, - 0, 16, 0, 0, 129,0, 0, 0, 0, 32, 0, 0, 0, 16, 0, 0, 0, 64, 6, 0, 0, 64, 0, 0, 0, 176,57, 0, 0, 0, 0, 0, 0, 112,1, 0, 0, 0, 0, 0, - 0, 48, 13, 0, 16, 0, 8, 0, 0, 192,7, 0, 0, 0, 0, 2, 0, 0, 4, 0, 0, 4, 0, 0, 0, 112,45, 0, 0, 0, 8, 0, 0, 0, 0, 64, 0, 0, 0, 0, - 0, 208,13, 0, 0, 1, 8, 0, 0, 96, 1, 0, 0, 0, 0, 0, 0, 16, 33, 0, 0, 128,8, 0, 0, 224,11, 0, 0, 0, 0, 0, 0, 0, 17, 0, 1, 65, 2, 0, - 0, 0, 0, 0, 128,64, 0, 0, 0, 0, 0, 0, 16, 0, 16, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 16, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 16, 16, 1, - 0, 128,4, 0, 24, 0, 0, 0, 0, 0, 0, 0, 144,0, 64, 0, 0, 0, 0, 0, 0, 1, 64, 0, 0, 128,32, 0, 0, 2, 4, 0, 0, 160,1, 0, 4, 0, 128,2, - 0, 240,63, 0, 127,21, 207,0, 0, 112,30, 0, 8, 16, 12, 0, 0, 176,63, 0, 16, 16, 12, 2, 0, 16, 0, 0, 64, 16, 0, 0, 0, 0, 0, 0, 0, 128,8, 0, - 0, 240,39, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 16, 0, 0, 0, 32, 0, 0, 0, 0, 8, 0, 0, 32, 33, 0, 0, 0, 0, 0, 0, 64, 9, 0, 0, 0, 8, 0, - 0, 240,7, 0, 0, 32, 0, 0, 0, 32, 5, 0, 20, 0, 2, 0, 0, 160,16, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 64, 0, 0, 224,47, 0, 8, 0, 6, 0, - 0, 208,63, 0, 0, 0, 0, 2, 0, 160,1, 0, 0, 0, 0, 0, 0, 128,0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 8, 2, 0, 0, 0, 192,15, 0, 16, 0, 8, 0, - 0, 16, 27, 0, 8, 16, 8, 0, 0, 0, 0, 0, 4, 0, 8, 0, 0, 32, 56, 0, 0, 16, 0, 0, 0, 0, 16, 0, 128,0, 0, 0, 0, 240,55, 0, 24, 0, 8, 0, - 0, 32, 36, 0, 0, 0, 0, 0, 0, 224,56, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 20, 8, 0, 0, 240,32, 0, 72, 0, 8, 0, 0, 64, 0, 0, 0, 128,0, 0, - 0, 32, 8, 0, 0, 0, 0, 0, 0, 64, 16, 0, 0, 0, 8, 0, 0, 0, 0, 0, 128,64, 16, 0, 0, 64, 1, 0, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 32, 0, - 0, 0, 1, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 64, 8, 1, 0, 0, 0, 0, 16, 17, 0, 0, 0, 0, 8, 0, 2, 0, 0, 0, 0, 240,63, 64, 125,191,206,3, - 0, 144,30, 0, 8, 16, 8, 0, 0, 112,8, 0, 0, 16, 12, 0, 0, 128,4, 0, 0, 0, 0, 0, 0, 192,3, 0, 8, 0, 4, 0, 0, 208,63, 0, 0, 32, 1, 0, - 0, 80, 21, 0, 0, 0, 4, 0, 0, 0, 32, 0, 4, 0, 0, 0, 0, 112,0, 0, 0, 0, 2, 0, 0, 48, 0, 0, 0, 0, 2, 0, 0, 224,7, 0, 16, 16, 8, 0, - 0, 64, 0, 0, 0, 32, 0, 0, 0, 240,31, 0, 0, 0, 0, 0, 0, 112,7, 0, 13, 16, 10, 0, 0, 0, 2, 0, 8, 0, 0, 0, 0, 224,61, 0, 1, 0, 2, 0, - 0, 0, 8, 0, 1, 0, 0, 0, 0, 128,9, 0, 9, 0, 8, 0, 0, 16, 59, 0, 8, 0, 8, 0, 0, 176,4, 0, 0, 32, 8, 0, 0, 0, 0, 0, 1, 8, 1, 0, - 0, 0, 0, 0, 32, 64, 0, 0, 0, 208,2, 0, 16, 0, 8, 0, 0, 64, 16, 0, 0, 0, 2, 0, 0, 0, 0, 0, 129,0, 2, 0, 0, 0, 0, 0, 2, 0, 32, 0, - 0, 0, 0, 0, 1, 0, 18, 0, 0, 128,0, 0, 0, 1, 128,0, 0, 0, 0, 0, 16, 96, 16, 0, 0, 64, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, - 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 32, 0, 16, 8, 24, 0, 0, 128,2, 0, 48, 4, 16, 2, 0, 0, 0, 0, 16, 224,16, 0, 0, 0, 0, 0, 1, 0, 128,0, - 0, 0, 0, 0, 144,8, 0, 0, 0, 0, 0, 0, 132,0, 64, 0, 0, 96, 9, 0, 0, 0, 0, 0, 0, 128,0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, - 0, 244,127,0, 253,40, 95, 0, 0, 176,38, 0, 12, 16, 12, 0, 0, 176,6, 0, 4, 16, 12, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 48, 18, 0, 0, 0, 4, 0, - 0, 112,6, 0, 0, 0, 32, 0, 0, 144,15, 0, 0, 32, 128,0, 0, 64, 9, 0, 0, 0, 0, 0, 0, 96, 1, 0, 0, 0, 2, 0, 0, 224,2, 0, 68, 0, 8, 0, - 0, 64, 3, 0, 0, 0, 0, 0, 0, 32, 4, 0, 1, 0, 0, 0, 0, 0, 6, 0, 16, 0, 0, 0, 0, 224,31, 0, 6, 0, 8, 0, 0, 0, 33, 0, 0, 0, 16, 0, - 0, 240,63, 0, 1, 0, 0, 0, 0, 48, 4, 0, 0, 0, 0, 0, 0, 160,32, 0, 0, 0, 0, 0, 0, 32, 6, 0, 9, 32, 7, 0, 0, 0, 43, 0, 0, 0, 0, 0, - 0, 64, 27, 0, 0, 0, 9, 0, 0, 0, 12, 0, 128,0, 0, 0, 0, 0, 25, 0, 0, 0, 2, 0, 0, 128,52, 0, 4, 32, 8, 0, 0, 0, 0, 0, 16, 128,8, 0, - 0, 0, 5, 0, 192,0, 0, 0, 0, 0, 4, 0, 0, 32, 0, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 240,127,0, 70, 3, 156,1, 0, 144,13, 0, 8, 0, 12, 0, - 0, 48, 0, 0, 0, 16, 8, 0, 0, 0, 22, 0, 0, 0, 4, 0, 0, 96, 10, 0, 0, 32, 32, 0, 0, 128,7, 0, 4, 0, 2, 0, 0, 16, 2, 0, 4, 0, 8, 0, - 0, 32, 3, 0, 0, 144,8, 0, 0, 160,33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 2, 0, 144,46, 0, 20, 16, 12, 0, 0, 64, 10, 0, 0, 0, 0, 0, - 0, 240,63, 0, 128,0, 132,0, 0, 0, 8, 0, 1, 0, 1, 0, 0, 0, 32, 0, 16, 0, 0, 0, 0, 160,19, 0, 4, 16, 44, 0, 0, 64, 13, 0, 4, 0, 12, 0, - 0, 64, 45, 0, 29, 144,12, 0, 0, 0, 8, 0, 128,0, 0, 0, 0, 244,127,0, 242,215,156,0, 0, 0, 0, 0, 0, 16, 128,0, 0, 144,58, 0, 0, 16, 12, 0, - 0, 48, 8, 0, 0, 0, 8, 0, 0, 16, 24, 0, 0, 0, 4, 0, 0, 208,0, 0, 12, 32, 0, 0, 0, 0, 10, 0, 0, 0, 2, 0, 0, 96, 27, 0, 0, 0, 8, 0, - 0, 240,58, 0, 0, 0, 0, 0, 0, 64, 1, 0, 2, 0, 4, 0, 0, 144,3, 0, 0, 16, 8, 0, 0, 16, 18, 0, 8, 0, 0, 0, 0, 0, 6, 0, 16, 0, 8, 0, - 0, 0, 16, 0, 0, 0, 2, 0, 0, 144,63, 0, 0, 0, 12, 0, 0, 240,63, 0, 1, 0, 96, 0, 0, 32, 10, 0, 0, 0, 0, 0, 0, 0, 16, 0, 33, 0, 5, 2, - 0, 0, 47, 0, 96, 32, 42, 0, 0, 96, 8, 0, 0, 0, 0, 0, 0, 176,63, 0, 0, 0, 1, 0, 0, 16, 0, 0, 1, 0, 1, 0, 0, 0, 22, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 8, 2, 0, 0, 0, 0, 0, 0, 128,32, 0, 0, 0, 0, 0, 32, 0, 32, 0, 0, 0, 16, 0, 96, 0, 0, 0, 0, 240,127,0, 10, 139,252,0, - 0, 144,52, 0, 4, 0, 12, 0, 0, 0, 26, 0, 0, 16, 12, 0, 0, 32, 8, 0, 32, 0, 4, 0, 0, 160,5, 0, 0, 32, 0, 0, 0, 32, 12, 0, 0, 0, 2, 1, - 0, 192,17, 0, 2, 0, 8, 0, 0, 112,45, 0, 0, 0, 0, 0, 0, 128,8, 0, 4, 16, 8, 0, 0, 80, 22, 0, 16, 0, 8, 0, 0, 0, 0, 0, 0, 0, 33, 0, - 0, 0, 2, 0, 128,0, 0, 0, 0, 144,58, 0, 0, 20, 8, 0, 0, 32, 62, 0, 0, 0, 0, 0, 0, 112,22, 0, 0, 0, 12, 0, 0, 240,6, 0, 0, 0, 0, 0, - 0, 128,24, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 32, 0, 0, 0, 0, 0, 0, 32, 2, 0, 0, 0, 240,127,0, 130,45, 140,2, 0, 208,28, 0, 8, 0, 12, 0, - 0, 48, 57, 0, 0, 0, 0, 0, 0, 240,56, 0, 0, 0, 4, 0, 0, 32, 32, 0, 0, 0, 10, 0, 0, 128,44, 0, 0, 32, 0, 0, 0, 0, 8, 0, 0, 128,2, 0, - 0, 0, 1, 0, 0, 0, 10, 0, 0, 32, 6, 0, 0, 2, 8, 0, 0, 224,12, 0, 0, 0, 0, 0, 0, 128,16, 0, 32, 0, 8, 0, 0, 224,24, 0, 0, 0, 0, 0, - 0, 32, 18, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 32, 0, 0, 128,22, 0, 32, 0, 8, 0, 0, 96, 44, 0, 4, 0, 140,0, 0, 160,47, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 65, 0, 1, 2, 0, 128,62, 0, 32, 0, 14, 0, 0, 0, 40, 0, 1, 0, 0, 0, 0, 176,63, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, - 0, 0, 0, 0, 36, 52, 10, 0, 0, 0, 0, 0, 2, 8, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 16, 244,63, 0, 255,255,255,3, 0, 0, 0, 0, 0, 1, 2, 0, - 0, 0, 0, 0, 237,21, 44, 0, 0, 224,34, 0, 3, 8, 4, 0, 0, 160,5, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 8, 0, 3, 0, 0, 2, - 0, 240,51, 0, 16, 2, 0, 0, 0, 0, 6, 0, 0, 128,0, 0, 0, 0, 24, 0, 0, 32, 0, 0, 0, 16, 0, 0, 0, 4, 0, 0, 0, 32, 0, 0, 239,60, 118,0, - 0, 96, 32, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 160,14, 0, 203,32, 6, 2, 0, 32, 0, 0, 131,0, 4, 0, 0, 32, 0, 0, 129,0, 2, 0, - 0, 32, 0, 0, 129,0, 4, 0, 0, 32, 0, 0, 129,0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 1, 0, 0, 0, 0, 128,0, 12, 0, 0, 0, 0, 0, 0, 25, 8, 0, - 0, 0, 0, 0, 145,128,0, 0, 0, 0, 0, 0, 27, 1, 28, 0, 0, 0, 0, 0, 217,224,12, 0, 0, 0, 0, 0, 0, 32, 16, 0, 0, 0, 0, 0, 16, 16, 32, 0, - 0, 96, 16, 0, 2, 0, 4, 0, 0, 0, 0, 0, 146,0, 4, 0, 0, 32, 2, 0, 255,255,94, 1, 0, 128,0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 78, 47, 30, 3, - 0, 0, 0, 0, 145,68, 16, 0, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 0, 0, 0, 32, 4, 2, 0, 0, 0, 0, 16, 17, 4, 0, 0, 0, 0, 0, 20, 0, 8, 0, - 0, 0, 0, 0, 132,0, 8, 0, 0, 0, 0, 0, 16, 65, 8, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 17, 65, 22, 1, - 0, 0, 0, 0, 12, 16, 12, 1, 0, 0, 0, 0, 1, 65, 4, 0, 0, 0, 0, 0, 8, 32, 36, 1, 0, 32, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 16, 32, 8, 0, - 0, 0, 0, 0, 0, 0, 24, 0, 0, 224,1, 0, 9, 0, 132,0, 0, 32, 0, 0, 16, 0, 0, 0, 0, 32, 0, 0, 32, 0, 0, 0, 0, 32, 0, 0, 64, 0, 0, 0, - 0, 0, 0, 0, 137,28, 66, 0, 0, 0, 0, 0, 0, 8, 0, 2, 0, 0, 0, 0, 0, 120,16, 0, 0, 0, 0, 0, 4, 8, 6, 0, 0, 0, 0, 0, 16, 65, 4, 0, - 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 129,28, 2, 0, 0, 0, 0, 0, 128,1, 0, 1, 0, 0, 2, 0, 90, 105,14, 1, 0, 0, 0, 0, 17, 57, 4, 0, - 0, 0, 0, 0, 205,40, 14, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 17, 0, 10, 0, 0, 0, 0, 0, 1, 65, 8, 0, 0, 0, 0, 0, 8, 50, 4, 0, - 0, 0, 0, 0, 89, 104,14, 0, 0, 0, 0, 0, 16, 3, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 0, 0, 8, 8, 8, 0, - 0, 0, 0, 0, 0, 65, 16, 0, 0, 0, 0, 0, 146,0, 0, 0, 0, 0, 0, 0, 64, 0, 32, 0, 0, 0, 0, 0, 17, 1, 16, 1, 0, 0, 0, 0, 0, 96, 24, 2, - 0, 0, 0, 0, 0, 64, 32, 0, 0, 0, 0, 0, 0, 16, 14, 0, 0, 0, 0, 0, 0, 64, 8, 0, 0, 0, 0, 0, 0, 0, 10, 1, 0, 0, 0, 0, 73, 88, 54, 1, - 0, 0, 0, 0, 1, 1, 8, 0, 0, 0, 0, 0, 8, 40, 12, 0, 0, 0, 0, 0, 16, 1, 4, 0, 0, 4, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 66, 0, 0, 0, - 0, 0, 0, 0, 132,52, 166,0, 0, 0, 0, 0, 32, 0, 96, 0, 0, 0, 0, 0, 69, 72, 112,1, 0, 0, 0, 0, 9, 72, 0, 0, 0, 0, 0, 0, 65, 56, 0, 0, - 0, 0, 0, 0, 0, 128,4, 2, 0, 0, 0, 0, 149,65, 24, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 32, 0, 0, 16, 1, 0, 0, 0, 0, 0, 0, 0, 136,4, 0, - 0, 0, 0, 0, 0, 64, 36, 0, 0, 0, 0, 0, 2, 128,0, 0, 0, 0, 0, 0, 17, 1, 4, 0, 0, 0, 0, 0, 8, 32, 2, 0, 0, 0, 0, 0, 17, 65, 2, 0, - 0, 0, 0, 0, 16, 9, 4, 0, 16, 0, 0, 0, 219,42, 14, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 0, 0, 16, 1, 16, 0, 0, 0, 0, 0, 8, 0, 6, 0, - 0, 0, 0, 0, 0, 16, 12, 0, 0, 72, 0, 0, 191,125,95, 1, 0, 0, 0, 0, 12, 184,10, 0, 0, 0, 0, 0, 16, 1, 0, 1, 0, 0, 0, 0, 21, 0, 0, 0, - 0, 0, 0, 0, 1, 1, 4, 0, 0, 0, 0, 0, 21, 73, 18, 0, 0, 128,0, 0, 8, 8, 2, 0, 0, 0, 0, 0, 8, 168,12, 0, 0, 0, 0, 0, 16, 0, 20, 0, - 0, 0, 0, 0, 17, 65, 4, 0, 0, 0, 0, 0, 2, 32, 0, 0, 0, 112,48, 0, 16, 97, 0, 0, 0, 80, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 96, 0, 0, - 0, 0, 0, 0, 16, 0, 0, 2, 0, 0, 0, 0, 8, 192,0, 0, 0, 0, 0, 0, 1, 8, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 2, 24, 22, 0, - 0, 0, 0, 0, 1, 144,0, 0, 0, 0, 0, 0, 1, 8, 0, 0, 0, 0, 0, 0, 16, 16, 4, 0, 0, 32, 0, 0, 17, 1, 4, 0, 0, 32, 0, 0, 19, 1, 4, 0, - 0, 0, 0, 0, 17, 1, 16, 0, 0, 0, 0, 0, 0, 24, 70, 0, 0, 0, 0, 0, 2, 0, 16, 0, 0, 0, 0, 0, 17, 1, 8, 0, 0, 96, 0, 0, 154,49, 62, 1, - 0, 0, 0, 0, 0, 33, 0, 0, 0, 32, 0, 0, 18, 96, 34, 0, 0, 0, 0, 0, 128,0, 4, 0, 0, 0, 0, 0, 1, 65, 0, 1, 0, 0, 0, 0, 0, 24, 8, 0, - 0, 0, 0, 0, 21, 0, 8, 0, 0, 0, 0, 0, 17, 81, 10, 3, 0, 0, 0, 0, 16, 32, 2, 0, 0, 0, 0, 0, 27, 36, 22, 0, 0, 0, 0, 0, 16, 56, 0, 0, - 0, 0, 0, 0, 8, 16, 6, 0, 0, 0, 0, 0, 24, 48, 4, 0, 0, 0, 0, 0, 2, 65, 6, 0, 0, 0, 0, 0, 36, 0, 8, 0, 0, 0, 0, 0, 64, 64, 0, 0, - 0, 0, 0, 0, 19, 57, 2, 0, 0, 0, 0, 0, 0, 24, 12, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 16, 32, 4, 0, 0, 0, 0, 0, 0, 32, 4, 1, - 0, 0, 0, 0, 8, 16, 4, 0, 0, 0, 0, 0, 17, 0, 20, 1, 0, 0, 0, 0, 38, 56, 30, 0, 0, 0, 0, 0, 16, 8, 14, 0, 0, 0, 0, 0, 17, 0, 4, 1, - 0, 0, 0, 0, 6, 168,4, 0, 0, 0, 0, 0, 145,65, 22, 0, 0, 0, 0, 0, 0, 96, 52, 0, 0, 40, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 8, 128,0, - 0, 0, 0, 0, 0, 17, 8, 0, 0, 8, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 8, 10, 0, 0, 0, 0, 0, 33, 185,14, 0, 0, 128,0, 0, 1, 0, 0, 0, - 0, 32, 0, 0, 4, 32, 2, 0, 0, 32, 0, 0, 221,255,246,3, 0, 0, 0, 0, 206,189,94, 1, 0, 0, 0, 0, 2, 3, 0, 0, 0, 112,0, 0, 21, 65, 4, 1, - 0, 0, 0, 0, 0, 33, 68, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 1, 4, 12, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 32, 0, 0, 16, 68, 12, 0, - 0, 0, 0, 0, 1, 5, 0, 0, 0, 0, 0, 0, 12, 0, 2, 0, 0, 0, 0, 0, 0, 96, 32, 0, 0, 0, 0, 0, 4, 0, 128,0, 0, 0, 0, 0, 17, 201,22, 1, - 0, 0, 0, 0, 0, 17, 2, 0, 0, 0, 0, 0, 8, 96, 6, 0, 0, 0, 0, 0, 28, 32, 12, 0, 0, 0, 0, 0, 0, 4, 8, 0, 0, 0, 0, 0, 24, 0, 4, 0, - 0, 0, 0, 0, 16, 1, 8, 0, 0, 0, 0, 0, 18, 184,39, 1, 0, 0, 0, 0, 211,153,4, 1, 0, 0, 0, 0, 17, 32, 0, 2, 0, 0, 0, 0, 2, 192,8, 0, - 0, 0, 0, 0, 1, 65, 4, 1, 0, 0, 0, 0, 4, 17, 36, 0, 0, 0, 0, 0, 132,16, 4, 0, 0, 32, 0, 0, 16, 2, 0, 0, 0, 0, 8, 0, 95, 232,42, 1, - 0, 96, 36, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 17, 64, 16, 0, 0, 0, 0, 0, 4, 0, 2, 0, - 0, 0, 0, 0, 16, 1, 12, 0, 0, 0, 0, 0, 8, 32, 44, 0, 0, 0, 0, 0, 17, 17, 4, 0, 0, 0, 0, 0, 0, 16, 2, 1, 0, 36, 0, 0, 1, 69, 0, 0, - 0, 0, 0, 0, 0, 32, 142,0, 0, 96, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 2, 8, 8, 0, 0, 32, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 2, 64, 0, 0, - 0, 0, 0, 0, 0, 48, 8, 0, 0, 0, 0, 0, 2, 248,18, 0, 0, 0, 0, 0, 48, 128,0, 0, 0, 0, 0, 0, 17, 33, 0, 0, 0, 0, 0, 0, 16, 81, 4, 0, - 0, 0, 0, 0, 57, 64, 0, 0, 0, 0, 0, 0, 17, 32, 8, 0, 0, 32, 0, 0, 21, 96, 0, 0, 0, 0, 0, 0, 16, 32, 0, 0, 0, 0, 0, 0, 4, 1, 32, 0, - 0, 0, 0, 0, 0, 73, 8, 0, 0, 0, 0, 0, 8, 24, 2, 0, 0, 0, 0, 0, 17, 0, 8, 1, 0, 32, 0, 0, 144,0, 4, 0, 0, 0, 0, 0, 1, 64, 0, 1, - 0, 48, 0, 0, 17, 65, 0, 0, 0, 0, 0, 0, 4, 1, 8, 0, 0, 32, 0, 0, 8, 16, 4, 0, 0, 0, 0, 0, 8, 64, 4, 0, 0, 0, 0, 0, 4, 32, 2, 0, - 0, 0, 0, 0, 0, 8, 6, 0, 0, 0, 0, 0, 2, 0, 12, 0, 0, 0, 0, 0, 4, 8, 4, 0, 0, 0, 0, 0, 0, 1, 4, 1, 0, 0, 0, 0, 4, 4, 64, 0, - 0, 0, 0, 0, 5, 0, 8, 0, 0, 0, 0, 0, 76, 125,14, 3, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 0, 0, 1, 32, 16, 0, 0, 0, 0, 0, 0, 40, 0, 0, - 0, 0, 0, 0, 25, 97, 24, 1, 0, 0, 0, 0, 42, 186,4, 0, 0, 0, 0, 0, 8, 0, 128,0, 0, 0, 0, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 208,8, 0, - 0, 0, 0, 0, 5, 65, 12, 0, 0, 0, 0, 0, 2, 8, 0, 1, 0, 0, 0, 0, 128,97, 0, 0, 0, 0, 0, 0, 2, 0, 70, 0, 0, 0, 0, 0, 255,105,30, 3, - 0, 0, 0, 0, 2, 40, 2, 0, 0, 0, 0, 0, 17, 73, 2, 0, 0, 0, 0, 0, 66, 1, 0, 0, 0, 0, 0, 0, 4, 8, 2, 0, 0, 0, 0, 0, 8, 40, 130,0, - 0, 0, 0, 0, 20, 0, 6, 0, 0, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 0, 1, 96, 18, 0, 0, 0, 0, 0, 21, 65, 0, 0, 0, 0, 0, 0, 28, 4, 1, 0, - 0, 32, 0, 0, 0, 33, 0, 0, 0, 32, 0, 0, 1, 1, 20, 0, 0, 64, 0, 0, 1, 32, 0, 0, 0, 0, 0, 0, 11, 18, 8, 0, 0, 0, 0, 0, 132,0, 0, 0, - 0, 0, 0, 0, 17, 64, 2, 0, 0, 0, 0, 0, 66, 56, 76, 0, 0, 0, 8, 0, 255,233,30, 1, 0, 0, 0, 0, 136,177,110,0, 0, 0, 0, 0, 8, 65, 72, 0, - 0, 0, 0, 0, 145,4, 0, 0, 0, 0, 0, 0, 26, 57, 6, 0, 0, 0, 0, 0, 13, 64, 8, 0, 0, 48, 48, 0, 0, 0, 132,0, 0, 0, 0, 0, 17, 9, 2, 0, - 0, 0, 0, 0, 145,1, 0, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 11, 104,12, 0, 0, 0, 0, 0, 68, 0, 4, 0, 0, 0, 0, 0, 0, 8, 78, 1, - 0, 0, 0, 0, 32, 32, 22, 0, 0, 0, 0, 0, 68, 65, 0, 1, 0, 0, 0, 0, 0, 128,0, 1, 0, 0, 0, 0, 0, 128,4, 0, 0, 0, 0, 0, 144,65, 0, 0, - 0, 0, 0, 0, 2, 16, 66, 0, 0, 0, 0, 0, 24, 8, 4, 0, 0, 0, 0, 0, 9, 17, 4, 0, 0, 0, 0, 0, 86, 192,0, 0, 0, 0, 0, 0, 32, 32, 24, 0, - 0, 0, 0, 0, 25, 121,6, 0, 0, 0, 0, 0, 8, 8, 4, 1, 0, 0, 0, 0, 1, 40, 2, 0, 0, 0, 0, 0, 17, 8, 0, 0, 0, 0, 0, 0, 64, 8, 0, 0, - 0, 0, 0, 0, 129,1, 0, 0, 0, 0, 0, 0, 72, 64, 0, 0, 0, 0, 0, 0, 16, 32, 32, 0, 16, 0, 0, 0, 177,123,126,1, 0, 0, 0, 0, 170,56, 18, 0, - 0, 0, 0, 0, 0, 0, 8, 1, 0, 0, 0, 0, 1, 16, 2, 0, 0, 0, 0, 0, 242,81, 21, 1, 0, 0, 0, 0, 16, 64, 2, 0, 0, 0, 0, 0, 0, 48, 6, 0, - 0, 0, 0, 0, 8, 32, 18, 0, 0, 0, 0, 0, 1, 33, 16, 0, 0, 32, 0, 0, 1, 32, 0, 0, 0, 0, 0, 0, 0, 56, 2, 1, 0, 0, 0, 0, 136,0, 12, 0, - 0, 0, 0, 0, 16, 0, 12, 0, 0, 0, 0, 0, 0, 50, 2, 0, 0, 0, 0, 0, 255,253,126,3, 0, 0, 0, 0, 9, 0, 96, 0, 0, 0, 0, 0, 128,4, 8, 0, - 0, 0, 0, 0, 17, 1, 12, 0, 0, 0, 0, 0, 0, 8, 32, 0, 0, 0, 0, 0, 17, 40, 16, 0, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 0, 0, 17, 81, 0, 0, - 0, 0, 0, 0, 0, 32, 0, 1, 0, 0, 0, 0, 16, 89, 12, 0, 0, 0, 0, 0, 16, 32, 6, 1, 0, 0, 0, 0, 32, 40, 0, 0, 0, 0, 0, 0, 129,0, 72, 0, - 0, 0, 0, 0, 147,73, 4, 0, 16, 0, 0, 0, 81, 73, 28, 0, 0, 0, 0, 0, 4, 8, 64, 0, 0, 0, 0, 0, 1, 192,0, 0, 0, 0, 0, 0, 0, 128,2, 0, - 0, 64, 0, 0, 191,219,108,1, 0, 0, 0, 0, 1, 64, 18, 0, 0, 0, 0, 0, 0, 144,0, 0, 0, 0, 0, 0, 8, 0, 4, 1, 0, 0, 0, 0, 1, 73, 2, 0, - 0, 0, 0, 0, 48, 32, 0, 0, 0, 0, 0, 0, 0, 33, 128,0, 0, 0, 0, 0, 1, 72, 0, 0, 0, 0, 0, 0, 128,193,8, 0, 0, 0, 0, 0, 144,1, 2, 0, - 0, 0, 0, 0, 0, 8, 32, 1, 0, 0, 0, 0, 129,169,0, 0, 0, 0, 0, 0, 1, 1, 64, 0, 0, 0, 0, 0, 21, 68, 0, 0, 0, 0, 0, 0, 149,241,8, 0, - 0, 0, 0, 0, 132,48, 134,1, 0, 0, 0, 0, 0, 36, 4, 0, 0, 32, 1, 0, 147,221,126,0, 0, 0, 0, 0, 232,185,94, 0, 0, 0, 0, 0, 17, 4, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 8, 65, 0, 0, 0, 0, 0, 0, 18, 56, 6, 1, 0, 0, 0, 0, 0, 28, 4, 1, 0, 0, 0, 0, 19, 17, 24, 0, - 0, 0, 0, 0, 146,124,42, 1, 0, 0, 0, 0, 128,16, 0, 0, 0, 0, 0, 0, 3, 64, 4, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 32, 64, 6, 1, - 0, 0, 0, 0, 0, 40, 4, 0, 0, 0, 0, 0, 145,66, 16, 0, 0, 0, 0, 0, 0, 48, 2, 0, 0, 0, 0, 0, 4, 48, 10, 0, 0, 36, 32, 0, 255,255,127,3, - 0, 64, 40, 0, 0, 0, 0, 0, 0, 4, 0, 0, 79, 191,126,1, 0, 0, 0, 0, 0, 56, 4, 0, 0, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 2, 52, 0, 0, - 0, 0, 0, 0, 83, 193,16, 0, 0, 0, 0, 0, 1, 40, 8, 0, 0, 32, 0, 0, 121,101,4, 1, 0, 0, 0, 0, 1, 32, 4, 2, 0, 0, 0, 0, 4, 17, 0, 0, - 0, 0, 0, 0, 28, 64, 0, 0, 0, 0, 0, 0, 8, 4, 8, 0, 0, 0, 0, 0, 1, 64, 8, 0, 0, 0, 0, 0, 1, 32, 0, 0, 0, 0, 0, 0, 21, 65, 18, 1, - 0, 0, 0, 0, 4, 41, 26, 1, 0, 0, 0, 0, 144,64, 0, 0, 0, 0, 0, 0, 80, 65, 4, 1, 0, 0, 0, 0, 17, 32, 2, 0, 0, 0, 0, 0, 8, 0, 0, 2, - 0, 0, 0, 0, 25, 57, 2, 0, 0, 0, 0, 0, 72, 97, 14, 1, 0, 32, 0, 0, 129,67, 52, 1, 0, 0, 0, 0, 85, 96, 6, 2, 0, 0, 0, 0, 16, 32, 0, 2, - 0, 0, 0, 0, 0, 56, 7, 0, 0, 0, 0, 0, 145,65, 20, 0, 0, 0, 0, 0, 0, 233,10, 2, 0, 0, 0, 0, 10, 32, 32, 0, 0, 0, 0, 0, 133,48, 46, 0, - 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 4, 32, 8, 0, 0, 0, 0, 0, 83, 65, 86, 0, 0, 0, 0, 0, 6, 176,38, 3, 0, 0, 0, 0, 135,32, 2, 0, - 0, 0, 0, 0, 113,57, 12, 0, 0, 0, 0, 0, 192,64, 0, 0, 0, 0, 0, 0, 2, 40, 20, 0, 0, 0, 0, 0, 72, 0, 8, 0, 0, 0, 0, 0, 76, 32, 0, 0, - 0, 0, 0, 0, 125,247,255,1, 0, 0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 1, 33, 2, 0, 0, 0, 0, 0, 8, 4, 4, 2, 0, 0, 0, 0, 128,0, 8, 0, - 0, 0, 0, 0, 128,32, 4, 0, 0, 0, 0, 0, 17, 0, 2, 0, 0, 0, 0, 0, 0, 160,0, 0, 0, 0, 0, 0, 0, 33, 0, 1, 0, 0, 0, 0, 21, 5, 24, 0, - 0, 0, 0, 0, 128,129,0, 0, 0, 0, 0, 0, 16, 33, 4, 0, 0, 0, 0, 0, 132,33, 20, 1, 0, 0, 0, 0, 16, 1, 10, 0, 0, 0, 0, 0, 32, 32, 0, 0, - 0, 240,62, 0, 17, 97, 148,3, 0, 112,4, 0, 0, 0, 0, 0, 0, 240,34, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 160,7, 0, 0, 0, 0, 0, - 0, 240,42, 0, 0, 0, 0, 0, 0, 240,22, 0, 0, 0, 0, 0, 0, 240,5, 0, 0, 0, 0, 0, 0, 128,9, 0, 0, 0, 0, 0, 0, 32, 0, 0, 8, 36, 0, 0, - 0, 32, 0, 0, 16, 0, 2, 0, 0, 32, 0, 0, 0, 128,4, 0, 0, 0, 0, 0, 0, 128,36, 0, 0, 0, 0, 0, 9, 64, 20, 0, 0, 0, 0, 0, 0, 32, 20, 0, - 0, 0, 0, 0, 49, 65, 38, 0, 0, 32, 0, 0, 2, 40, 2, 0, 0, 0, 0, 0, 8, 0, 8, 1, 0, 32, 0, 0, 1, 65, 4, 0, 0, 0, 0, 0, 145,65, 16, 0, - 0, 0, 0, 0, 16, 8, 2, 0, 0, 0, 0, 0, 22, 64, 2, 0, 0, 32, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 0, 120,2, 0, 0, 0, 0, 0, 8, 18, 0, 0, - 0, 32, 0, 0, 255,245,175,3, 0, 0, 0, 0, 66, 32, 4, 0, 0, 0, 0, 0, 0, 64, 0, 2, 0, 0, 0, 0, 0, 4, 2, 0, 0, 0, 0, 0, 17, 7, 16, 0, - 0, 32, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 32, 32, 34, 0, 0, 32, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 129,32, 16, 0, 0, 0, 0, 1, 16, 17, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 81, 68, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 80, 36, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 128,65, 0, 0, 0, 0, 0, 0, 145,69, 12, 0, 0, 32, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 19, 81, 0, 1, 0, 0, 1, 0, 255,241,126,1, - 0, 0, 0, 0, 0, 80, 16, 1, 0, 192,48, 0, 0, 0, 0, 0, 0, 32, 32, 0, 138,57, 74, 1, 0, 32, 8, 0, 1, 0, 16, 0, 0, 32, 0, 0, 1, 64, 4, 0, - 0, 0, 0, 0, 16, 72, 2, 0, 0, 0, 0, 0, 82, 56, 166,1, 0, 0, 0, 0, 145,65, 2, 0, 0, 32, 0, 0, 27, 0, 76, 0, 0, 0, 0, 0, 4, 0, 16, 0, - 0, 0, 0, 0, 0, 64, 64, 0, 0, 0, 0, 0, 64, 16, 28, 1, 0, 0, 0, 0, 20, 0, 4, 0, 0, 32, 0, 0, 4, 32, 68, 0, 0, 0, 0, 0, 16, 17, 16, 0, - 0, 0, 0, 0, 0, 17, 0, 1, 0, 0, 0, 0, 81, 112,28, 0, 0, 0, 0, 0, 4, 0, 8, 2, 0, 32, 0, 0, 8, 0, 6, 0, 0, 0, 0, 0, 88, 0, 0, 0, - 0, 0, 0, 0, 144,0, 8, 0, 0, 0, 0, 0, 37, 160,126,1, 0, 0, 0, 0, 133,0, 0, 0, 0, 0, 0, 0, 2, 32, 0, 1, 0, 0, 0, 0, 129,64, 2, 0, - 0, 0, 0, 0, 134,192,56, 0, 0, 0, 0, 0, 8, 16, 38, 0, 0, 0, 0, 0, 6, 41, 4, 0, 0, 0, 0, 0, 81, 65, 5, 1, 0, 0, 0, 0, 72, 34, 46, 2, - 0, 0, 0, 0, 16, 0, 18, 0, 0, 0, 0, 0, 9, 0, 0, 2, 0, 0, 0, 0, 17, 1, 0, 2, 0, 0, 0, 0, 8, 41, 14, 1, 0, 0, 0, 0, 73, 0, 0, 0, - 0, 0, 0, 0, 136,32, 6, 0, 0, 0, 0, 0, 24, 0, 8, 0, 0, 0, 0, 0, 1, 64, 80, 0, 0, 0, 0, 0, 177,245,30, 1, 0, 0, 0, 0, 89, 32, 4, 2, - 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 145,1, 4, 0, 0, 0, 0, 0, 0, 32, 6, 0, 0, 0, 0, 0, 0, 33, 12, 0, 0, 240,46, 0, 10, 112,38, 0, - 0, 0, 0, 0, 4, 2, 4, 0, 0, 0, 0, 0, 9, 0, 4, 0, 0, 0, 0, 0, 68, 1, 0, 0, 0, 0, 0, 0, 139,213,28, 0, 0, 0, 0, 0, 4, 32, 9, 0, - 0, 0, 0, 0, 2, 160,0, 0, 0, 0, 0, 0, 1, 64, 2, 0, 0, 0, 0, 0, 153,85, 118,1, 0, 0, 0, 0, 104,49, 38, 1, 0, 0, 0, 0, 1, 128,4, 0, - 0, 0, 0, 0, 4, 48, 70, 2, 0, 0, 0, 0, 195,4, 0, 0, 0, 0, 0, 0, 21, 49, 4, 0, 0, 0, 0, 0, 8, 8, 4, 0, 0, 0, 0, 0, 0, 16, 16, 0, - 0, 0, 0, 0, 32, 0, 18, 0, 0, 0, 0, 0, 92, 144,8, 2, 0, 0, 0, 0, 66, 241,4, 0, 0, 0, 0, 0, 16, 65, 16, 0, 0, 0, 0, 0, 68, 0, 0, 0, - 0, 0, 0, 0, 132,1, 8, 0, 0, 0, 0, 0, 5, 53, 33, 0, 0, 0, 0, 0, 2, 49, 4, 0, 0, 0, 0, 0, 132,40, 2, 0, 0, 0, 0, 0, 1, 104,6, 3, - 0, 0, 0, 0, 17, 97, 12, 0, 0, 0, 0, 0, 9, 32, 6, 2, 0, 32, 0, 0, 17, 64, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 32, 2, 3, - 0, 0, 0, 0, 28, 96, 12, 0, 0, 0, 0, 0, 145,65, 4, 0, 0, 0, 0, 0, 145,0, 16, 0, 0, 8, 3, 0, 223,251,94, 1, 0, 0, 0, 0, 206,189,62, 3, - 0, 0, 0, 0, 0, 32, 18, 0, 0, 0, 0, 0, 97, 65, 2, 0, 0, 0, 0, 0, 13, 97, 24, 2, 0, 48, 36, 0, 0, 0, 0, 0, 0, 112,16, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 81, 97, 24, 1, 0, 0, 0, 0, 0, 40, 32, 0, 0, 0, 0, 0, 145,0, 0, 0, 0, 0, 0, 0, 0, 9, 4, 0, 0, 0, 0, 0, 64, 32, 0, 0, - 0, 32, 0, 0, 0, 8, 0, 0, 0, 36, 0, 0, 1, 5, 4, 0, 0, 0, 0, 0, 64, 40, 14, 0, 0, 0, 0, 0, 9, 0, 2, 0, 0, 112,4, 0, 72, 8, 14, 0, - 0, 0, 0, 0, 89, 4, 40, 0, 0, 0, 0, 0, 0, 33, 2, 1, 0, 0, 0, 0, 8, 0, 4, 2, 0, 0, 0, 0, 64, 1, 4, 2, 0, 0, 0, 0, 1, 96, 16, 0, - 0, 0, 0, 0, 16, 8, 6, 0, 0, 0, 0, 0, 92, 63, 142,3, 0, 0, 0, 0, 1, 9, 16, 0, 0, 0, 0, 0, 17, 96, 0, 0, 0, 0, 0, 0, 153,1, 10, 0, - 0, 0, 0, 0, 0, 81, 12, 1, 0, 0, 0, 0, 68, 100,8, 0, 0, 96, 8, 0, 0, 32, 4, 0, 0, 32, 0, 0, 1, 65, 20, 0, 0, 0, 0, 0, 160,64, 0, 0, - 0, 0, 0, 0, 6, 0, 1, 0, 0, 0, 0, 0, 144,1, 16, 0, 0, 0, 0, 0, 5, 0, 1, 0, 0, 0, 0, 0, 93, 104,14, 2, 0, 0, 0, 0, 1, 69, 16, 0, - 0, 0, 0, 0, 128,8, 0, 0, 0, 0, 0, 0, 16, 40, 0, 0, 0, 32, 2, 0, 0, 64, 4, 0, 0, 32, 0, 0, 0, 32, 4, 0, 0, 0, 0, 0, 17, 69, 0, 0, - 0, 0, 0, 0, 1, 0, 42, 0, 0, 0, 0, 0, 2, 8, 16, 0, 0, 0, 0, 0, 129,64, 12, 0, 0, 0, 0, 0, 145,0, 0, 1, 0, 0, 0, 0, 8, 65, 4, 0, - 0, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, 29, 44, 30, 1, 0, 0, 0, 0, 80, 0, 14, 0, 0, 0, 0, 0, 21, 209,24, 1, 0, 0, 0, 0, 0, 24, 4, 0, - 0, 0, 0, 0, 16, 48, 8, 0, 0, 0, 0, 0, 145,9, 28, 1, 0, 0, 0, 0, 0, 32, 14, 0, 0, 0, 0, 0, 8, 0, 130,0, 0, 0, 0, 0, 16, 65, 0, 1, - 0, 0, 0, 0, 128,0, 2, 0, 0, 0, 0, 0, 0, 16, 32, 0, 0, 0, 0, 0, 30, 137,8, 0, 0, 0, 0, 0, 18, 0, 18, 0, 0, 0, 0, 0, 0, 9, 2, 0, - 0, 0, 0, 0, 4, 40, 6, 0, 0, 32, 0, 0, 64, 104,132,0, 0, 0, 0, 0, 17, 64, 0, 1, 0, 8, 16, 0, 255,239,255,3, 0, 0, 0, 0, 222,189,94, 1, - 0, 0, 0, 0, 17, 72, 0, 0, 0, 0, 0, 0, 129,68, 2, 0, 0, 0, 0, 0, 1, 65, 2, 1, 0, 0, 0, 0, 0, 24, 6, 0, 0, 0, 0, 0, 0, 96, 2, 0, - 0, 0, 4, 0, 112,73, 4, 1, 0, 0, 0, 0, 0, 65, 20, 1, 0, 0, 0, 0, 0, 0, 12, 2, 0, 0, 0, 0, 3, 65, 0, 0, 0, 0, 0, 0, 9, 1, 12, 1, - 0, 0, 0, 0, 20, 4, 4, 0, 0, 0, 0, 0, 0, 65, 0, 1, 0, 0, 0, 0, 129,0, 8, 0, 0, 0, 0, 0, 64, 0, 0, 2, 0, 0, 0, 0, 1, 66, 16, 1, - 0, 0, 0, 0, 145,69, 10, 1, 0, 0, 0, 0, 16, 72, 0, 0, 0, 0, 0, 0, 0, 32, 34, 0, 0, 0, 0, 0, 20, 8, 6, 0, 0, 40, 0, 0, 145,65, 18, 3, - 0, 0, 0, 0, 0, 56, 34, 1, 0, 0, 0, 0, 3, 8, 6, 0, 0, 0, 0, 0, 147,88, 12, 0, 0, 32, 0, 0, 16, 64, 12, 0, 0, 0, 0, 0, 0, 0, 36, 0, - 0, 16, 0, 0, 17, 38, 4, 0, 0, 0, 0, 0, 65, 64, 0, 0, 0, 0, 0, 0, 128,40, 34, 0, 0, 0, 0, 0, 80, 1, 0, 0, 0, 0, 0, 0, 17, 73, 20, 3, - 0, 0, 0, 0, 28, 32, 4, 0, 0, 32, 0, 0, 81, 227,92, 1, 0, 112,36, 0, 24, 0, 12, 0, 0, 32, 0, 0, 16, 64, 4, 0, 0, 0, 0, 0, 1, 32, 36, 0, - 0, 32, 0, 0, 1, 4, 0, 0, 0, 0, 0, 0, 0, 40, 8, 2, 0, 32, 0, 0, 16, 0, 4, 0, 0, 240,60, 0, 18, 2, 4, 0, 0, 240,8, 0, 0, 0, 0, 0, - 0, 32, 0, 0, 16, 4, 0, 0, 0, 0, 0, 0, 21, 98, 4, 1, 0, 0, 0, 0, 88, 185,4, 0, 0, 0, 0, 0, 0, 8, 4, 2, 0, 0, 0, 0, 16, 2, 2, 0, - 0, 112,12, 0, 2, 80, 0, 0, 0, 0, 1, 0, 4, 56, 94, 3, 0, 0, 0, 0, 152,0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 128,1, 8, 0, - 0, 0, 0, 0, 0, 4, 12, 0, 0, 0, 0, 0, 1, 4, 0, 0, 0, 64, 0, 0, 209,77, 126,0, 0, 0, 0, 0, 0, 8, 34, 0, 0, 240,62, 0, 59, 73, 20, 3, - 0, 240,24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 12, 1, 0, 0, 0, 0, 21, 44, 13, 0, 0, 32, 1, 0, 36, 36, 62, 2, 0, 0, 0, 0, 32, 0, 64, 0, - 0, 32, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 16, 81, 12, 0, 0, 0, 0, 0, 17, 104,4, 0, 0, 0, 0, 0, 64, 168,12, 0, 0, 0, 0, 0, 8, 33, 0, 0, - 0, 0, 0, 0, 11, 48, 14, 1, 0, 0, 0, 0, 5, 32, 0, 0, 0, 0, 0, 0, 0, 128,6, 0, 0, 0, 0, 0, 4, 40, 62, 0, 0, 0, 0, 0, 9, 64, 0, 0, - 0, 0, 0, 0, 20, 8, 4, 0, 0, 0, 0, 0, 17, 96, 16, 1, 0, 0, 0, 0, 31, 252,14, 0, 0, 0, 0, 0, 0, 40, 140,0, 0, 96, 0, 0, 16, 1, 4, 0, - 0, 0, 0, 0, 192,1, 0, 0, 0, 0, 0, 0, 136,0, 0, 0, 0, 0, 0, 0, 145,65, 12, 0, 0, 0, 0, 0, 145,41, 2, 0, 0, 0, 0, 0, 0, 16, 0, 1, - 0, 0, 0, 0, 17, 81, 16, 1, 0, 96, 24, 0, 10, 184,6, 0, 0, 224,32, 0, 0, 0, 0, 0, 0, 64, 63, 0, 0, 0, 0, 0, 0, 80, 25, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 1, 16, 0, 0, 0, 0, 0, 5, 60, 140,0, 0, 0, 0, 0, 16, 9, 0, 0, 0, 0, 0, 0, 16, 8, 4, 0, 0, 0, 0, 0, 150,36, 44, 0, - 0, 0, 0, 0, 148,4, 0, 0, 0, 96, 0, 0, 26, 0, 4, 0, 0, 0, 0, 0, 0, 32, 24, 1, 0, 0, 0, 0, 1, 57, 4, 2, 0, 0, 0, 0, 1, 24, 16, 0, - 0, 0, 0, 0, 24, 253,190,0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 215,201,72, 0, 0, 0, 0, 0, 0, 8, 16, 0, 0, 0, 0, 0, 16, 1, 2, 0, - 0, 0, 0, 0, 1, 0, 8, 1, 0, 32, 0, 0, 151,93, 94, 0, 0, 0, 0, 0, 68, 104,2, 1, 0, 0, 0, 0, 23, 56, 7, 0, 0, 0, 0, 0, 16, 65, 18, 0, - 0, 0, 0, 0, 1, 48, 6, 0, 0, 0, 0, 0, 4, 40, 0, 0, 0, 32, 0, 0, 0, 0, 0, 1, 0, 240,59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 24, 4, 0, - 0, 0, 0, 0, 255,248,111,0, 0, 0, 0, 0, 129,73, 4, 1, 0, 0, 0, 0, 1, 8, 18, 0, 0, 0, 0, 0, 4, 160,129,0, 0, 0, 0, 0, 129,64, 6, 0, - 0, 0, 0, 0, 8, 136,0, 0, 0, 0, 0, 0, 16, 72, 24, 1, 0, 0, 0, 0, 0, 176,0, 0, 0, 0, 0, 0, 129,64, 18, 0, 0, 0, 0, 0, 160,41, 132,0, - 0, 32, 0, 0, 17, 65, 20, 1, 0, 0, 0, 0, 0, 8, 12, 0, 0, 0, 0, 0, 21, 96, 20, 0, 0, 32, 0, 0, 0, 4, 0, 0, 0, 224,0, 0, 0, 34, 28, 0, - 0, 0, 0, 0, 4, 20, 0, 0, 0, 0, 0, 0, 66, 128,14, 0, 0, 0, 0, 0, 131,208,88, 0, 0, 0, 0, 0, 64, 4, 0, 0, 0, 0, 0, 0, 128,5, 0, 0, - 0, 0, 0, 0, 129,65, 16, 0, 0, 0, 0, 0, 4, 9, 0, 0, 0, 0, 0, 0, 11, 61, 30, 1, 0, 0, 16, 0, 32, 0, 0, 0, 0, 32, 32, 0, 4, 0, 4, 0, - 0, 0, 0, 0, 247,237,30, 1, 0, 32, 0, 0, 28, 56, 10, 0, 0, 32, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 16, 97, 8, 0, 0, 0, 0, 0, 4, 56, 134,0, - 0, 0, 0, 0, 9, 1, 4, 0, 0, 0, 0, 0, 64, 1, 8, 0, 0, 0, 0, 0, 21, 8, 4, 0, 0, 0, 0, 0, 92, 172,12, 0, 0, 0, 0, 0, 40, 0, 0, 0, - 0, 0, 0, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 160,8, 0, 0, 32, 16, 0, 8, 32, 0, 0, 0, 224,8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 4, 2, - 0, 0, 0, 0, 128,12, 8, 0, 0, 0, 0, 0, 1, 72, 2, 0, 0, 0, 0, 0, 17, 201,22, 0, 0, 0, 0, 0, 1, 40, 10, 0, 0, 0, 0, 0, 66, 25, 12, 0, - 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 4, 32, 128,0, 0, 0, 0, 0, 1, 0, 12, 0, 0, 0, 0, 0, 5, 32, 16, 0, 0, 0, 0, 0, 128,32, 0, 0, - 0, 224,34, 0, 74, 178,76, 1, 0, 0, 0, 0, 17, 0, 16, 1, 0, 96, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 64, 6, 0, 0, 0, 0, 0, 21, 32, 1, 0, - 0, 0, 0, 0, 132,32, 0, 0, 0, 0, 0, 0, 3, 128,160,0, 0, 0, 0, 0, 8, 40, 4, 0, 0, 0, 0, 0, 17, 65, 16, 1, 0, 0, 0, 0, 68, 8, 0, 0, - 0, 232,45, 0, 16, 9, 4, 0, 0, 96, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145,9, 2, 0, 0, 0, 0, 0, 144,9, 0, 0, 0, 0, 0, 0, 1, 0, 40, 0, - 0, 0, 0, 0, 16, 8, 6, 2, 0, 32, 0, 0, 129,1, 84, 0, 0, 64, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 54, 24, 14, 0, 0, 0, 0, 0, 1, 1, 20, 0, - 0, 0, 0, 0, 8, 80, 2, 0, 0, 0, 0, 0, 32, 40, 10, 0, 0, 128,0, 0, 255,255,255,3, 0, 32, 0, 0, 110,189,127,1, 0, 0, 0, 0, 17, 9, 4, 0, - 0, 0, 0, 0, 29, 0, 4, 3, 0, 0, 0, 0, 1, 40, 0, 0, 0, 0, 0, 0, 0, 33, 8, 0, 0, 0, 0, 0, 0, 100,0, 0, 0, 0, 0, 0, 1, 32, 4, 0, - 0, 0, 0, 0, 0, 36, 64, 0, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 0, 0, 93, 66, 12, 0, 0, 0, 0, 0, 4, 2, 0, 2, 0, 0, 0, 0, 17, 3, 0, 0, - 0, 0, 0, 0, 17, 65, 18, 0, 0, 0, 0, 0, 0, 8, 24, 0, 0, 0, 0, 0, 0, 33, 10, 0, 0, 0, 0, 0, 128,8, 8, 2, 0, 0, 0, 0, 64, 40, 18, 0, - 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 0, 0, 128,0, 16, 0, 0, 0, 0, 0, 209,73, 28, 0, 0, 0, 0, 0, 8, 32, 26, 0, 0, 0, 0, 0, 1, 128,16, 0, - 0, 0, 0, 0, 89, 64, 16, 0, 0, 0, 0, 0, 81, 120,0, 0, 0, 0, 0, 0, 27, 209,82, 0, 0, 0, 0, 0, 20, 49, 0, 0, 0, 0, 0, 0, 9, 232,14, 1, - 0, 32, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 18, 248,40, 0, 0, 0, 0, 0, 0, 64, 20, 0, 0, 0, 0, 0, 83, 104,0, 2, 0, 0, 0, 0, 64, 65, 0, 0, - 0, 0, 0, 0, 0, 8, 14, 0, 0, 0, 0, 0, 9, 64, 2, 0, 0, 0, 0, 0, 25, 113,118,0, 0, 0, 0, 0, 194,40, 12, 0, 0, 0, 0, 0, 5, 41, 6, 0, - 0, 0, 0, 0, 0, 96, 12, 2, 0, 0, 0, 0, 0, 41, 0, 2, 0, 0, 0, 0, 16, 64, 0, 1, 0, 0, 0, 0, 239,105,45, 3, 0, 0, 2, 0, 0, 8, 4, 0, - 16, 0, 0, 0, 27, 65, 14, 2, 0, 0, 0, 0, 2, 8, 6, 0, 0, 0, 0, 0, 17, 0, 12, 2, 0, 0, 0, 0, 145,65, 18, 1, 0, 0, 0, 0, 2, 40, 0, 0, - 0, 0, 0, 0, 0, 40, 12, 0, 0, 0, 0, 0, 3, 0, 8, 2, 0, 0, 0, 0, 17, 32, 0, 0, 0, 0, 0, 0, 27, 25, 4, 0, 0, 0, 0, 0, 8, 8, 12, 0, - 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 125,124,30, 3, 0, 0, 0, 0, 8, 45, 4, 2, 0, 0, 0, 0, 17, 97, 4, 0, 0, 0, 0, 0, 129,64, 0, 0, - 0, 0, 0, 0, 64, 8, 12, 0, 0, 0, 0, 0, 69, 0, 8, 0, 0, 0, 0, 0, 4, 40, 4, 0, 0, 0, 0, 0, 145,145,24, 0, 0, 0, 0, 0, 6, 168,8, 0, - 0, 0, 0, 0, 1, 80, 0, 2, 0, 0, 0, 0, 145,73, 64, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 17, 65, 8, 1, 0, 0, 0, 0, 25, 33, 12, 1, - 0, 0, 0, 0, 17, 32, 4, 0, 0, 0, 0, 0, 55, 217,70, 1, 0, 0, 0, 0, 77, 56, 44, 0, 0, 0, 0, 0, 144,96, 0, 0, 0, 0, 0, 0, 8, 1, 8, 0, - 0, 0, 0, 0, 24, 40, 6, 0, 0, 0, 0, 0, 72, 1, 8, 0, 0, 0, 0, 0, 89, 42, 12, 0, 0, 0, 0, 0, 88, 1, 8, 0, 0, 0, 0, 0, 4, 41, 18, 0, - 0, 0, 0, 0, 16, 1, 4, 1, 0, 0, 0, 0, 2, 64, 8, 0, 0, 0, 0, 0, 153,97, 92, 2, 0, 0, 0, 0, 0, 72, 16, 2, 0, 0, 0, 0, 16, 64, 8, 0, - 0, 0, 0, 0, 18, 8, 14, 1, 0, 0, 0, 0, 16, 112,12, 0, 0, 0, 0, 0, 0, 40, 90, 0, 0, 32, 0, 0, 0, 65, 0, 1, 0, 0, 0, 0, 2, 128,72, 0, - 0, 0, 0, 0, 4, 120,86, 1, 0, 0, 0, 0, 32, 0, 4, 0, 0, 0, 0, 0, 2, 8, 10, 0, 0, 0, 0, 0, 0, 53, 4, 1, 0, 0, 0, 0, 76, 0, 8, 0, - 0, 0, 0, 0, 73, 104,7, 3, 0, 0, 0, 0, 87, 96, 44, 2, 0, 0, 0, 0, 64, 32, 0, 2, 0, 0, 0, 0, 68, 42, 76, 3, 0, 32, 0, 0, 129,64, 4, 0, - 0, 0, 0, 0, 149,73, 0, 0, 0, 112,40, 0, 32, 0, 4, 0, 0, 0, 0, 0, 12, 65, 0, 1, 0, 0, 0, 0, 8, 16, 32, 0, 0, 32, 0, 0, 183,89, 118,3, - 0, 0, 0, 0, 0, 40, 144,0, 0, 0, 0, 0, 97, 16, 6, 2, 0, 96, 8, 0, 1, 69, 16, 0, 0, 96, 19, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 2, 1, 4, 1, 0, 0, 0, 0, 17, 64, 18, 0, 0, 32, 4, 0, 0, 1, 4, 0, 0, 0, 0, 0, 119,120,20, 0, 0, 0, 0, 0, 144,8, 16, 0, - 0, 32, 0, 0, 16, 1, 6, 0, 0, 0, 0, 0, 32, 105,0, 0, 0, 0, 0, 0, 1, 128,0, 1, 0, 32, 1, 0, 0, 65, 0, 0, 0, 0, 0, 0, 70, 179,4, 0, - 0, 0, 0, 0, 17, 97, 0, 0, 0, 0, 0, 0, 8, 32, 0, 1, 0, 0, 0, 0, 24, 40, 4, 2, 0, 0, 0, 0, 17, 65, 24, 0, 0, 0, 0, 0, 66, 0, 8, 0, - 0, 96, 2, 0, 255,253,95, 1, 0, 32, 0, 0, 248,189,14, 1, 0, 0, 0, 0, 1, 64, 12, 0, 0, 0, 0, 0, 16, 3, 18, 1, 0, 0, 0, 0, 145,73, 2, 0, - 0, 0, 0, 0, 0, 168,2, 0, 0, 0, 0, 0, 12, 0, 12, 2, 0, 0, 0, 0, 4, 65, 0, 0, 0, 0, 0, 0, 19, 81, 0, 0, 0, 0, 0, 0, 0, 56, 14, 0, - 0, 224,1, 0, 61, 11, 1, 2, 0, 96, 0, 0, 1, 0, 0, 0, 0, 48, 5, 0, 97, 10, 35, 2, 0, 32, 0, 0, 128,0, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, - 0, 32, 128,0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 184,164,0, 0, 0, 0, 0, 68, 34, 0, 0, 0, 0, 0, 0, 129,0, 16, 0, 0, 32, 0, 0, 127,253,90, 1, - 0, 0, 0, 0, 32, 56, 24, 0, 0, 0, 0, 0, 17, 64, 18, 1, 0, 0, 0, 0, 0, 32, 8, 1, 0, 0, 0, 0, 8, 0, 64, 0, 0, 0, 0, 0, 0, 40, 38, 0, - 0, 0, 0, 0, 4, 16, 0, 0, 0, 112,32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 10, 0, 0, 0, 0, 0, 48, 16, 0, 0, 0, 0, 0, 0, 61, 120,6, 0, - 0, 8, 0, 0, 74, 32, 8, 0, 0, 40, 0, 0, 17, 8, 4, 0, 0, 0, 0, 0, 17, 9, 102,0, 0, 0, 0, 0, 72, 32, 66, 1, 0, 0, 0, 0, 16, 0, 12, 1, - 0, 0, 0, 0, 1, 0, 16, 1, 0, 4, 0, 0, 153,9, 2, 0, 0, 0, 0, 0, 4, 0, 14, 0, 0, 0, 0, 0, 68, 40, 2, 0, 0, 0, 0, 0, 193,32, 0, 0, - 0, 0, 0, 0, 81, 0, 4, 0, 0, 128,0, 0, 0, 0, 16, 0, 0, 32, 32, 0, 181,89, 94, 1, 0, 32, 0, 0, 56, 57, 20, 1, 0, 0, 0, 0, 9, 56, 14, 0, - 0, 0, 0, 0, 24, 0, 6, 0, 0, 0, 0, 0, 0, 16, 64, 0, 0, 0, 0, 0, 16, 81, 0, 0, 0, 224,0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 72, 48, 4, 2, - 0, 0, 0, 0, 1, 48, 2, 0, 0, 0, 0, 0, 16, 129,0, 0, 0, 0, 0, 0, 147,89, 82, 0, 0, 0, 0, 0, 36, 41, 10, 0, 0, 0, 0, 0, 1, 97, 4, 0, - 0, 0, 0, 0, 1, 64, 132,0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 64, 40, 0, 0, 0, 0, 0, 0, 0, 40, 18, 0, 0, 0, 0, 0, 0, 17, 32, 0, - 0, 160,0, 0, 80, 12, 4, 3, 0, 0, 0, 0, 8, 32, 16, 0, 0, 32, 0, 0, 14, 184,44, 0, 0, 0, 0, 0, 8, 0, 10, 0, 0, 0, 0, 0, 0, 36, 6, 0, - 0, 0, 1, 64, 157,253,126,3, 0, 0, 0, 0, 132,56, 142,1, 0, 0, 0, 0, 132,65, 0, 0, 0, 0, 0, 0, 33, 168,6, 0, 0, 0, 0, 0, 84, 0, 0, 0, - 0, 0, 0, 0, 17, 88, 0, 1, 0, 0, 0, 0, 2, 56, 4, 1, 0, 0, 0, 0, 1, 41, 2, 1, 0, 0, 0, 0, 17, 1, 6, 0, 0, 0, 0, 0, 128,72, 12, 0, - 0, 0, 4, 0, 16, 0, 0, 0, 0, 0, 0, 0, 49, 8, 32, 1, 0, 0, 0, 0, 18, 1, 0, 0, 0, 0, 0, 0, 17, 3, 16, 0, 0, 0, 0, 0, 12, 0, 5, 0, - 0, 0, 0, 0, 1, 64, 4, 0, 0, 32, 0, 0, 16, 0, 8, 0, 0, 0, 0, 0, 144,0, 8, 1, 0, 0, 0, 0, 17, 64, 4, 0, 0, 0, 0, 0, 20, 188,6, 0, - 0, 0, 0, 0, 2, 1, 4, 0, 0, 0, 0, 0, 0, 1, 20, 1, 0, 0, 0, 0, 1, 192,16, 0, 0, 0, 0, 0, 4, 144,0, 0, 0, 0, 0, 0, 64, 4, 4, 0, - 0, 0, 0, 0, 145,77, 82, 1, 0, 0, 0, 0, 70, 41, 66, 0, 0, 32, 0, 0, 16, 1, 4, 0, 0, 0, 0, 0, 25, 17, 12, 0, 0, 0, 0, 0, 2, 48, 6, 0, - 0, 0, 0, 0, 10, 0, 24, 0, 0, 0, 0, 0, 2, 0, 4, 0, 0, 0, 0, 0, 69, 40, 10, 0, 0, 0, 0, 0, 1, 0, 20, 0, 0, 0, 0, 0, 18, 0, 4, 0, - 0, 0, 0, 0, 10, 0, 8, 0, 0, 0, 0, 0, 2, 128,2, 0, 0, 0, 0, 0, 127,191,238,3, 0, 0, 0, 0, 16, 9, 18, 1, 0, 0, 0, 0, 64, 0, 10, 0, - 0, 0, 0, 0, 4, 0, 0, 1, 0, 0, 0, 0, 4, 0, 10, 0, 0, 0, 0, 0, 144,76, 8, 0, 0, 0, 0, 0, 17, 9, 18, 0, 0, 0, 0, 0, 4, 1, 132,0, - 0, 32, 16, 0, 19, 64, 14, 0, 0, 128,21, 0, 0, 0, 0, 0, 0, 40, 0, 0, 2, 136,44, 0, 0, 0, 16, 0, 0, 0, 4, 0, 0, 0, 0, 0, 16, 65, 12, 0, - 0, 0, 0, 0, 40, 1, 0, 0, 0, 4, 0, 0, 208,25, 20, 0, 0, 0, 0, 0, 16, 0, 10, 0, 0, 232,32, 0, 17, 65, 20, 1, 0, 112,46, 0, 0, 0, 0, 0, - 0, 112,51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 4, 0, 0, 0, 0, 0, 27, 8, 28, 0, 0, 0, 0, 0, 16, 0, 6, 0, 0, 0, 0, 0, 0, 16, 0, 2, - 0, 0, 0, 0, 89, 68, 8, 0, 0, 0, 0, 0, 0, 3, 4, 1, 0, 0, 0, 0, 81, 65, 2, 0, 0, 0, 0, 0, 1, 8, 20, 0, 0, 0, 0, 0, 68, 96, 32, 0, - 0, 0, 0, 0, 132,0, 16, 0, 0, 0, 0, 0, 6, 0, 2, 0, 0, 0, 0, 0, 174,153,12, 0, 0, 0, 0, 0, 0, 0, 18, 1, 0, 32, 0, 0, 81, 65, 2, 0, - 0, 0, 0, 0, 18, 73, 0, 0, 0, 240,32, 0, 16, 64, 8, 0, 0, 0, 0, 0, 145,81, 18, 0, 0, 0, 0, 0, 4, 32, 18, 0, 0, 0, 0, 0, 20, 64, 16, 0, - 0, 0, 0, 0, 1, 32, 12, 2, 0, 0, 0, 0, 128,0, 10, 0, 0, 0, 0, 0, 0, 96, 4, 0, 0, 0, 0, 0, 111,185,38, 0, 0, 0, 0, 0, 145,72, 2, 0, - 0, 0, 0, 0, 0, 64, 2, 1, 0, 0, 0, 0, 64, 4, 8, 0, 0, 0, 0, 0, 4, 96, 4, 0, 0, 0, 0, 0, 2, 0, 10, 0, 0, 0, 0, 0, 129,1, 4, 0, - 0, 0, 0, 0, 0, 192,8, 0, 0, 0, 5, 0, 93, 97, 10, 0, 0, 0, 0, 0, 0, 41, 10, 1, 0, 0, 0, 0, 68, 0, 12, 3, 0, 0, 0, 0, 80, 1, 4, 0, - 0, 4, 0, 0, 15, 57, 142,3, 0, 0, 0, 0, 17, 9, 0, 0, 0, 0, 0, 0, 81, 64, 0, 0, 0, 0, 0, 0, 73, 65, 28, 0, 0, 0, 0, 0, 147,33, 14, 1, - 0, 0, 0, 0, 125,104,46, 2, 0, 0, 0, 0, 4, 32, 10, 0, 0, 0, 0, 0, 68, 41, 64, 0, 0, 0, 0, 0, 9, 16, 0, 0, 0, 0, 8, 0, 17, 65, 0, 0, - 0, 0, 0, 0, 128,48, 0, 0, 0, 0, 32, 0, 251,109,78, 1, 0, 0, 0, 0, 12, 61, 14, 1, 0, 0, 0, 0, 64, 0, 0, 1, 0, 0, 16, 0, 0, 44, 0, 0, - 0, 0, 0, 0, 0, 4, 64, 0, 0, 0, 0, 0, 48, 89, 28, 0, 0, 0, 0, 0, 8, 24, 4, 0, 0, 0, 0, 0, 1, 104,4, 0, 0, 0, 0, 0, 144,80, 0, 0, - 0, 0, 0, 0, 159,125,30, 1, 0, 0, 0, 0, 132,61, 10, 2, 0, 0, 0, 0, 8, 0, 16, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 16, 9, 8, 0, - 0, 0, 0, 0, 17, 81, 68, 0, 0, 0, 0, 0, 34, 0, 64, 0, 0, 0, 0, 0, 8, 104,24, 0, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 0, 0, 138,48, 14, 0, - 0, 0, 0, 0, 8, 128,32, 0, 0, 32, 0, 0, 183,125,94, 2, 0, 0, 0, 0, 136,152,10, 2, 0, 0, 0, 0, 128,0, 0, 1, 0, 16, 0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 18, 32, 34, 0, 0, 0, 0, 0, 2, 65, 8, 0, 0, 0, 0, 0, 8, 20, 0, 2, 0, 0, 0, 0, 0, 32, 58, 0, 0, 0, 0, 0, 16, 40, 2, 0, - 0, 0, 0, 0, 5, 24, 6, 1, 0, 0, 0, 0, 17, 97, 16, 0, 16, 124,40, 0, 255,255,254,3, 0, 0, 0, 0, 32, 32, 10, 0, 0, 0, 0, 0, 53, 65, 44, 0, - 0, 4, 0, 0, 0, 64, 0, 0, 0, 4, 0, 0, 4, 0, 0, 0, 0, 16, 0, 0, 136,40, 0, 0, 0, 128,0, 0, 16, 0, 0, 0, 0, 64, 0, 0, 1, 0, 8, 0, - 16, 64, 0, 0, 255,255,255,3, 0, 0, 0, 0, 15, 44, 14, 0, 0, 0, 0, 0, 128,0, 0, 2, 0, 0, 0, 0, 23, 107,22, 1, 0, 32, 0, 0, 0, 47, 26, 0, - 0, 96, 4, 0, 4, 56, 30, 1, 0, 0, 0, 0, 21, 108,14, 0, 0, 0, 0, 0, 128,4, 0, 2, 0, 0, 0, 0, 80, 64, 4, 0, 0, 0, 0, 0, 4, 104,0, 0, - 0, 0, 0, 0, 0, 9, 6, 0, 16, 240,4, 0, 239,141,6, 0, 0, 0, 0, 0, 16, 73, 0, 0, 0, 32, 6, 0, 0, 1, 0, 0, 0, 0, 0, 0, 149,85, 28, 3, - 0, 0, 0, 0, 0, 12, 18, 1, 0, 0, 0, 0, 129,64, 16, 0, 0, 0, 0, 0, 149,121,26, 0, 0, 0, 0, 0, 24, 64, 0, 0, 0, 0, 0, 0, 68, 108,0, 0, - 0, 0, 0, 0, 255,217,94, 1, 0, 16, 0, 0, 1, 64, 2, 0, 0, 0, 0, 0, 8, 32, 6, 1, 0, 0, 0, 0, 16, 16, 16, 0, 0, 0, 0, 0, 32, 0, 16, 0, - 0, 0, 0, 0, 20, 137,8, 0, 0, 0, 0, 0, 16, 128,4, 0, 0, 0, 0, 0, 0, 40, 10, 0, 0, 0, 0, 0, 0, 136,6, 0, 0, 32, 0, 0, 255,125,22, 3, - 0, 0, 0, 0, 66, 62, 70, 0, 0, 0, 0, 0, 2, 0, 0, 1, 0, 32, 4, 0, 0, 0, 4, 2, 0, 0, 0, 0, 64, 0, 16, 0, 0, 0, 0, 0, 1, 32, 2, 1, - 0, 0, 0, 0, 1, 64, 64, 0, 0, 0, 0, 0, 16, 9, 16, 0, 0, 32, 0, 0, 16, 65, 4, 0, 0, 0, 0, 0, 17, 56, 0, 0, 0, 0, 0, 0, 32, 2, 16, 0, - 0, 0, 0, 0, 64, 40, 16, 0, 0, 0, 0, 0, 140,44, 14, 2, 0, 0, 0, 0, 68, 25, 16, 0, 0, 0, 0, 0, 16, 4, 4, 0, 0, 0, 0, 0, 32, 1, 8, 0, - 0, 0, 0, 0, 1, 73, 16, 0, 0, 0, 0, 0, 219,249,86, 0, 0, 0, 0, 0, 0, 232,8, 0, 0, 0, 0, 0, 17, 65, 4, 1, 0, 0, 0, 0, 8, 32, 14, 0, - 0, 0, 0, 0, 16, 96, 0, 0, 0, 0, 0, 0, 25, 8, 0, 0, 0, 0, 0, 0, 8, 0, 12, 0, 0, 0, 0, 0, 0, 32, 8, 3, 0, 0, 0, 0, 130,0, 0, 0, - 0, 0, 0, 0, 17, 1, 32, 0, 0, 0, 0, 0, 25, 121,26, 0, 16, 0, 0, 0, 8, 16, 86, 0, 0, 0, 0, 0, 144,0, 4, 0, 0, 0, 0, 0, 1, 21, 20, 0, - 0, 0, 0, 0, 95, 126,142,2, 0, 0, 0, 0, 19, 73, 4, 1, 0, 0, 0, 0, 24, 0, 6, 1, 0, 112,32, 0, 0, 0, 4, 0, 0, 0, 0, 0, 48, 32, 64, 0, - 0, 0, 0, 0, 19, 1, 28, 0, 0, 0, 0, 0, 0, 0, 6, 1, 0, 0, 0, 0, 25, 96, 6, 0, 0, 0, 0, 0, 156,72, 8, 0, 0, 0, 0, 0, 80, 33, 4, 1, - 0, 0, 0, 0, 25, 229,68, 0, 0, 0, 0, 0, 0, 34, 16, 0, 0, 0, 0, 0, 145,77, 22, 0, 0, 0, 0, 0, 0, 40, 2, 1, 0, 0, 0, 0, 8, 56, 70, 1, - 0, 32, 0, 0, 0, 25, 36, 1, 0, 0, 0, 0, 0, 96, 0, 1, 0, 0, 0, 0, 96, 56, 0, 0, 0, 0, 0, 0, 191,125,127,3, 0, 0, 0, 0, 111,127,14, 3, - 0, 0, 0, 0, 76, 64, 0, 0, 0, 0, 0, 0, 144,1, 0, 0, 0, 32, 0, 0, 8, 0, 4, 0, 0, 0, 0, 0, 133,68, 20, 0, 0, 0, 0, 0, 145,69, 0, 0, - 0, 0, 0, 0, 2, 0, 64, 0, 0, 0, 0, 0, 145,113,82, 1, 0, 0, 0, 0, 4, 0, 20, 0, 0, 0, 0, 0, 1, 40, 34, 0, 0, 0, 0, 0, 1, 0, 6, 0, - 0, 0, 0, 0, 4, 48, 6, 0, 0, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 36, 0, 6, 2, 0, 0, 0, 0, 49, 32, 78, 3, 0, 0, 0, 0, 69, 36, 28, 0, - 0, 0, 0, 0, 17, 128,0, 0, 0, 0, 0, 0, 149,65, 16, 0, 0, 32, 0, 0, 83, 209,86, 3, 0, 16, 0, 0, 72, 48, 14, 0, 0, 0, 0, 0, 17, 0, 6, 0, - 0, 0, 0, 0, 8, 38, 78, 3, 0, 0, 0, 0, 65, 0, 12, 0, 0, 0, 0, 0, 48, 96, 4, 0, 0, 64, 0, 0, 69, 0, 8, 0, 0, 0, 0, 0, 68, 96, 88, 0, - 0, 96, 0, 0, 9, 64, 12, 1, 0, 0, 0, 0, 68, 116,90, 1, 0, 0, 0, 0, 0, 4, 0, 1, 0, 0, 0, 0, 17, 73, 8, 0, 0, 0, 0, 0, 145,65, 18, 2, - 0, 0, 0, 0, 0, 0, 6, 2, 0, 0, 0, 0, 20, 20, 4, 0, 0, 0, 0, 0, 51, 176,0, 1, 0, 0, 0, 0, 5, 48, 6, 0, 0, 0, 0, 0, 255,103,125,3, - 0, 0, 0, 0, 197,41, 14, 0, 0, 32, 4, 0, 0, 48, 6, 0, 0, 0, 0, 0, 145,68, 2, 0, 0, 32, 0, 0, 213,217,94, 1, 0, 0, 0, 0, 64, 33, 6, 0, - 0, 0, 0, 0, 1, 32, 0, 2, 0, 0, 0, 0, 8, 25, 2, 0, 0, 0, 0, 0, 12, 32, 8, 0, 0, 48, 0, 0, 0, 64, 6, 0, 0, 0, 0, 0, 4, 40, 2, 0, - 0, 0, 0, 0, 196,4, 14, 3, 0, 0, 0, 0, 151,93, 20, 0, 0, 0, 0, 0, 2, 8, 4, 0, 0, 0, 0, 0, 5, 4, 4, 0, 0, 32, 0, 0, 0, 16, 4, 0, - 0, 0, 0, 0, 147,97, 22, 1, 0, 0, 0, 0, 8, 16, 6, 1, 0, 0, 0, 0, 0, 32, 68, 0, 0, 0, 0, 0, 128,65, 8, 1, 0, 0, 0, 0, 0, 32, 64, 0, - 0, 0, 0, 0, 8, 4, 10, 0, 0, 0, 0, 0, 4, 32, 64, 0, 0, 0, 0, 0, 0, 16, 100,0, 0, 0, 0, 0, 147,20, 8, 0, 0, 0, 0, 0, 0, 44, 0, 0, - 0, 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 145,0, 28, 0, 0, 0, 0, 0, 16, 0, 4, 2, 0, 0, 0, 0, 16, 16, 8, 0, 0, 0, 0, 0, 255,127,127,3, - 0, 0, 0, 0, 206,127,76, 1, 0, 0, 0, 0, 3, 65, 0, 1, 0, 0, 0, 0, 129,4, 16, 0, 0, 0, 0, 0, 64, 67, 4, 1, 0, 0, 0, 0, 0, 0, 100,0, - 0, 0, 0, 0, 133,0, 4, 0, 0, 0, 0, 0, 17, 65, 86, 1, 0, 0, 0, 0, 72, 40, 14, 2, 0, 0, 0, 0, 5, 32, 12, 0, 0, 0, 0, 0, 29, 40, 11, 0, - 0, 0, 0, 0, 1, 65, 14, 0, 0, 0, 0, 0, 1, 96, 4, 0, 0, 0, 0, 0, 21, 32, 14, 2, 0, 0, 0, 0, 0, 32, 30, 2, 0, 0, 0, 0, 145,77, 18, 2, - 0, 0, 0, 0, 145,97, 68, 0, 0, 0, 0, 0, 4, 12, 4, 0, 0, 0, 0, 0, 16, 56, 6, 0, 0, 0, 0, 0, 5, 40, 4, 0, 0, 0, 0, 0, 0, 9, 8, 0, - 0, 0, 0, 0, 42, 57, 14, 0, 0, 0, 0, 0, 1, 8, 0, 1, 0, 0, 0, 0, 11, 0, 8, 0, 0, 0, 0, 0, 48, 77, 16, 0, 0, 0, 0, 0, 145,81, 4, 0, - 0, 0, 0, 0, 0, 33, 6, 0, 0, 0, 0, 0, 8, 32, 6, 0, 0, 0, 0, 0, 31, 124,28, 0, 0, 0, 0, 0, 153,89, 20, 0, 0, 0, 0, 0, 24, 48, 14, 0, - 0, 0, 0, 0, 65, 4, 16, 0, 0, 0, 0, 0, 4, 0, 64, 0, 0, 0, 0, 0, 189,65, 92, 1, 0, 0, 0, 0, 6, 4, 30, 0, 0, 0, 0, 0, 66, 8, 46, 1, - 0, 0, 0, 0, 20, 48, 0, 0, 0, 0, 0, 0, 4, 8, 8, 0, 0, 0, 0, 0, 12, 120,5, 0, 0, 32, 0, 0, 17, 33, 4, 1, 0, 0, 0, 0, 5, 0, 4, 0, - 0, 0, 0, 0, 145,65, 20, 1, 0, 0, 0, 0, 70, 44, 12, 2, 0, 0, 0, 0, 0, 76, 16, 0, 0, 0, 0, 0, 68, 0, 1, 0, 0, 8, 0, 0, 28, 41, 14, 0, - 0, 0, 0, 0, 81, 0, 12, 0, 0, 0, 0, 0, 87, 104,12, 0, 0, 0, 0, 0, 1, 32, 6, 0, 0, 0, 0, 0, 4, 113,76, 0, 0, 32, 0, 0, 0, 48, 12, 0, - 0, 0, 0, 0, 149,101,88, 0, 0, 0, 0, 0, 0, 96, 24, 0, 0, 144,0, 0, 215,127,22, 3, 0, 0, 0, 0, 16, 44, 2, 0, 0, 0, 0, 0, 20, 1, 4, 0, - 0, 0, 0, 0, 56, 65, 0, 0, 0, 0, 0, 0, 2, 0, 12, 1, 0, 0, 0, 0, 0, 48, 64, 0, 0, 0, 0, 0, 0, 44, 68, 0, 0, 0, 0, 0, 24, 65, 0, 0, - 0, 0, 0, 0, 132,1, 0, 2, 0, 0, 0, 0, 37, 32, 12, 0, 0, 0, 0, 0, 4, 64, 4, 0, 0, 0, 0, 0, 255,109,95, 1, 0, 0, 0, 0, 145,72, 16, 0, - 0, 0, 0, 0, 138,56, 6, 1, 0, 32, 0, 0, 0, 40, 0, 0, 0, 224,40, 0, 0, 0, 4, 0, 0, 0, 0, 0, 4, 96, 0, 0, 0, 0, 0, 0, 49, 77, 0, 0, - 0, 0, 0, 0, 0, 16, 66, 0, 0, 0, 0, 0, 29, 42, 4, 0, 0, 0, 0, 0, 129,0, 4, 0, 0, 32, 0, 0, 25, 65, 0, 0, 0, 0, 0, 0, 21, 64, 4, 0, - 0, 0, 0, 0, 64, 1, 4, 0, 0, 32, 0, 0, 2, 0, 14, 0, 0, 0, 0, 0, 72, 0, 4, 0, 0, 0, 0, 0, 0, 48, 10, 0, 0, 32, 0, 0, 179,217,84, 0, - 0, 0, 0, 0, 64, 56, 2, 0, 0, 0, 0, 0, 0, 9, 14, 1, 0, 0, 0, 0, 16, 40, 12, 0, 0, 32, 0, 0, 0, 65, 4, 0, 0, 0, 0, 0, 8, 32, 10, 0, - 0, 0, 0, 0, 29, 104,0, 0, 0, 0, 0, 0, 64, 32, 68, 0, 0, 0, 0, 0, 1, 8, 10, 0, 0, 0, 0, 0, 255,125,94, 3, 0, 0, 0, 0, 1, 45, 46, 0, - 0, 0, 0, 0, 1, 24, 6, 1, 0, 0, 0, 0, 208,69, 30, 0, 0, 0, 0, 0, 80, 20, 4, 2, 0, 240,44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145,77, 20, 1, - 0, 0, 0, 0, 64, 56, 0, 0, 0, 0, 0, 0, 24, 41, 2, 1, 0, 0, 0, 0, 162,0, 4, 0, 0, 0, 0, 0, 16, 17, 12, 1, 0, 0, 0, 0, 146,64, 0, 0, - 0, 0, 0, 0, 85, 32, 4, 0, 0, 32, 0, 0, 109,16, 14, 0, 0, 0, 0, 0, 0, 65, 2, 0, 0, 0, 0, 0, 222,60, 142,2, 0, 0, 0, 0, 144,64, 16, 0, - 0, 0, 0, 0, 16, 73, 2, 0, 0, 0, 0, 0, 0, 60, 4, 0, 0, 0, 0, 0, 17, 48, 0, 0, 0, 0, 0, 0, 243,77, 0, 0, 0, 0, 0, 0, 8, 32, 8, 0, - 0, 0, 0, 0, 20, 28, 64, 0, 0, 0, 0, 0, 20, 1, 0, 2, 0, 0, 0, 0, 29, 44, 0, 0, 0, 0, 0, 0, 17, 9, 72, 0, 0, 0, 0, 0, 251,249,126,0, - 0, 0, 0, 0, 8, 56, 14, 0, 0, 0, 0, 0, 0, 8, 30, 2, 0, 0, 0, 0, 0, 41, 4, 0, 0, 0, 0, 0, 32, 32, 4, 0, 0, 0, 0, 0, 0, 32, 24, 0, - 0, 0, 0, 0, 136,17, 64, 0, 0, 0, 0, 0, 17, 97, 16, 3, 0, 0, 0, 0, 17, 9, 0, 2, 0, 160,0, 0, 39, 100,96, 0, 0, 96, 0, 0, 0, 0, 4, 0, - 0, 32, 8, 0, 2, 0, 0, 0, 0, 32, 0, 0, 2, 0, 0, 0, 0, 32, 32, 0, 2, 0, 0, 0, 0, 0, 0, 0, 245,36, 6, 0, 0, 0, 0, 0, 2, 2, 0, 0, - 0, 0, 0, 0, 33, 96, 6, 0, 0, 0, 0, 0, 16, 2, 4, 0, 0, 0, 0, 0, 32, 0, 0, 1, 16, 0, 0, 0, 255,255,255,3, 0, 0, 0, 0, 206,61, 62, 2, - 0, 96, 4, 0, 183,24, 84, 1, 0, 0, 0, 0, 8, 24, 6, 0, 0, 0, 0, 0, 16, 40, 68, 1, 0, 0, 0, 0, 16, 24, 4, 0, 0, 0, 0, 0, 154,65, 12, 0, - 0, 112,36, 0, 63, 53, 20, 1, 0, 0, 0, 0, 17, 8, 16, 0, 0, 0, 0, 0, 17, 80, 4, 0, 0, 0, 0, 0, 64, 32, 64, 0, 0, 224,16, 0, 144,4, 4, 0, - 0, 0, 0, 0, 0, 88, 8, 0, 0, 32, 4, 0, 0, 89, 4, 1, 0, 0, 0, 0, 147,249,30, 3, 0, 0, 0, 0, 48, 32, 8, 0, 0, 0, 0, 0, 0, 16, 4, 1, - 0, 0, 0, 0, 4, 0, 132,2, 0, 0, 0, 0, 0, 9, 0, 1, 0, 0, 0, 0, 238,186,174,0, 0, 0, 0, 0, 145,72, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 16, 1, 0, 32, 4, 0, 130,0, 12, 0, 0, 0, 0, 0, 18, 65, 0, 0, 0, 0, 0, 0, 17, 8, 10, 0, 0, 0, 0, 0, 0, 128,16, 0, - 0, 0, 0, 0, 149,100,122,2, 0, 0, 0, 0, 1, 8, 16, 0, 0, 0, 0, 0, 17, 24, 28, 0, 0, 0, 4, 0, 177,121,92, 1, 0, 0, 0, 0, 0, 56, 14, 1, - 0, 0, 0, 0, 138,0, 0, 0, 0, 32, 0, 0, 8, 24, 12, 0, 0, 0, 0, 0, 16, 48, 16, 0, 0, 0, 0, 0, 127,253,78, 2, 0, 0, 0, 0, 0, 0, 78, 0, - 0, 0, 0, 0, 16, 16, 64, 0, 0, 0, 0, 0, 17, 44, 34, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 20, 65, 4, 2, 0, 0, 0, 0, 4, 44, 18, 1, - 0, 0, 0, 0, 145,193,0, 0, 0, 0, 0, 0, 238,190,46, 2, 0, 0, 0, 0, 128,4, 2, 0, 0, 0, 0, 0, 21, 41, 80, 0, 0, 0, 0, 0, 144,72, 0, 1, - 0, 0, 0, 0, 148,0, 4, 1, 0, 0, 0, 0, 31, 1, 0, 2, 0, 160,5, 0, 86, 56, 12, 1, 0, 0, 0, 0, 132,0, 4, 0, 0, 0, 0, 0, 16, 88, 72, 0, - 0, 0, 0, 0, 128,72, 4, 2, 0, 32, 0, 0, 0, 2, 4, 1, 0, 0, 0, 0, 211,105,22, 0, 0, 0, 0, 0, 0, 32, 72, 1, 0, 0, 0, 0, 1, 48, 10, 0, - 0, 0, 0, 0, 0, 33, 4, 0, 0, 0, 0, 0, 0, 104,10, 0, 0, 0, 0, 0, 144,49, 0, 0, 0, 0, 0, 0, 17, 121,18, 1, 0, 0, 0, 0, 0, 168,34, 0, - 0, 0, 0, 0, 1, 56, 6, 0, 0, 0, 0, 0, 0, 48, 0, 2, 0, 0, 0, 0, 16, 21, 0, 0, 0, 0, 0, 0, 16, 5, 0, 0, 0, 0, 0, 0, 17, 57, 0, 0, - 0, 0, 0, 0, 8, 0, 68, 0, 0, 0, 0, 0, 92, 174,14, 1, 0, 0, 0, 0, 48, 21, 4, 0, 0, 0, 0, 0, 80, 40, 0, 0, 0, 0, 0, 0, 150,32, 68, 0, - 0, 0, 0, 0, 145,8, 2, 2, 0, 0, 0, 0, 85, 3, 0, 0, 0, 0, 0, 0, 145,5, 8, 0, 0, 0, 0, 0, 255,255,126,3, 0, 0, 0, 0, 34, 37, 14, 1, - 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 0, 0, 8, 16, 16, 0, 0, 0, 0, 0, 9, 48, 66, 3, 0, 0, 0, 0, 1, 73, 2, 1, 0, 0, 0, 0, 80, 64, 0, 0, - 0, 0, 0, 0, 5, 0, 17, 0, 0, 0, 0, 0, 8, 32, 32, 0, 0, 0, 0, 0, 29, 40, 44, 2, 0, 0, 0, 0, 40, 0, 52, 0, 0, 0, 0, 0, 25, 0, 4, 0, - 0, 32, 0, 0, 191,81, 126,1, 0, 32, 0, 0, 238,49, 46, 2, 0, 0, 0, 0, 76, 0, 8, 1, 0, 0, 0, 0, 8, 17, 0, 1, 0, 32, 0, 0, 225,48, 110,2, - 0, 0, 0, 0, 93, 224,44, 2, 0, 0, 0, 0, 73, 65, 0, 2, 0, 0, 0, 0, 144,0, 12, 0, 0, 0, 0, 0, 129,8, 8, 0, 0, 0, 0, 0, 4, 48, 77, 0, - 0, 0, 0, 0, 20, 112,4, 2, 0, 32, 0, 0, 3, 0, 0, 0, 0, 0, 1, 0, 37, 49, 122,0, 0, 0, 0, 0, 80, 0, 0, 1, 0, 0, 0, 0, 148,69, 8, 0, - 0, 0, 0, 0, 0, 32, 2, 1, 0, 0, 0, 0, 0, 0, 64, 2, 0, 0, 0, 0, 144,73, 70, 2, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 80, 0, 6, 0, - 0, 0, 0, 0, 8, 40, 0, 0, 0, 0, 0, 0, 19, 65, 18, 0, 0, 32, 0, 0, 255,111,124,3, 0, 0, 0, 0, 110,60, 62, 2, 0, 0, 0, 0, 24, 1, 0, 0, - 0, 0, 0, 0, 144,69, 0, 0, 0, 0, 0, 0, 16, 89, 0, 0, 0, 0, 0, 0, 17, 73, 28, 3, 0, 0, 0, 0, 128,40, 36, 0, 0, 0, 0, 0, 8, 8, 10, 0, - 0, 0, 0, 0, 68, 32, 140,0, 0, 0, 0, 0, 64, 8, 34, 0, 0, 0, 0, 0, 109,46, 60, 2, 0, 0, 0, 0, 4, 4, 136,0, 0, 0, 0, 0, 132,64, 12, 0, - 0, 0, 0, 0, 145,68, 28, 0, 0, 0, 0, 0, 0, 1, 20, 0, 0, 0, 0, 0, 77, 116,13, 0, 0, 0, 0, 0, 85, 0, 8, 0, 0, 0, 0, 0, 148,0, 0, 0, - 0, 0, 0, 0, 17, 64, 0, 2, 0, 0, 0, 0, 96, 0, 2, 0, 0, 0, 0, 0, 32, 0, 46, 1, 0, 0, 0, 0, 84, 96, 4, 0, 0, 0, 0, 0, 48, 0, 12, 0, - 0, 96, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 32, 33, 0, 1, 0, 0, 0, 0, 151,93, 8, 0, 0, 0, 0, 0, 145,73, 70, 3, 0, 0, 0, 0, 28, 0, 0, 0, - 0, 32, 0, 0, 17, 65, 4, 1, 0, 0, 0, 0, 16, 56, 2, 0, 0, 0, 0, 0, 80, 32, 0, 0, 0, 0, 0, 0, 9, 1, 0, 1, 0, 0, 0, 0, 64, 0, 92, 0, - 0, 16, 0, 0, 255,125,127,3, 0, 0, 0, 0, 0, 32, 30, 0, 0, 0, 0, 0, 144,1, 0, 3, 0, 0, 0, 0, 128,32, 2, 0, 0, 0, 0, 0, 64, 0, 128,0, - 0, 0, 0, 0, 105,32, 12, 3, 0, 0, 0, 0, 74, 1, 12, 0, 0, 0, 0, 0, 32, 37, 0, 0, 0, 0, 0, 0, 249,125,23, 0, 0, 0, 0, 0, 9, 48, 46, 1, - 0, 16, 0, 0, 16, 0, 12, 0, 0, 32, 0, 0, 17, 64, 12, 0, 0, 0, 0, 0, 32, 8, 0, 0, 0, 0, 0, 0, 64, 8, 16, 0, 0, 0, 0, 0, 16, 82, 8, 0, - 0, 0, 0, 0, 8, 24, 0, 0, 0, 0, 0, 0, 1, 100,12, 0, 0, 0, 0, 0, 160,0, 0, 0, 0, 0, 0, 0, 147,89, 20, 1, 0, 0, 0, 0, 2, 40, 2, 1, - 0, 0, 0, 0, 128,64, 8, 0, 0, 32, 0, 0, 17, 65, 16, 0, 0, 0, 0, 0, 16, 96, 8, 0, 0, 32, 0, 0, 81, 1, 4, 0, 0, 0, 0, 0, 1, 74, 2, 0, - 0, 0, 0, 0, 155,85, 28, 0, 0, 0, 0, 0, 14, 40, 30, 1, 0, 32, 0, 0, 17, 65, 16, 1, 0, 0, 0, 0, 132,64, 0, 0, 0, 0, 0, 0, 4, 9, 14, 1, - 0, 0, 0, 0, 21, 32, 8, 0, 0, 32, 2, 0, 4, 0, 2, 0, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 0, 0, 0, 32, 28, 0, 0, 0, 0, 0, 16, 68, 8, 0, - 0, 0, 0, 0, 0, 8, 8, 1, 0, 0, 0, 0, 89, 96, 4, 0, 0, 0, 0, 0, 5, 32, 4, 0, 0, 32, 0, 0, 128,16, 32, 0, 0, 0, 0, 0, 149,65, 8, 0, - 0, 0, 0, 0, 64, 16, 64, 0, 0, 0, 0, 0, 149,93, 22, 1, 0, 0, 0, 0, 64, 73, 0, 0, 0, 0, 0, 0, 16, 80, 0, 0, 0, 0, 0, 0, 16, 64, 4, 0, - 0, 0, 0, 0, 64, 40, 42, 2, 0, 0, 0, 0, 9, 1, 24, 0, 0, 0, 0, 0, 4, 0, 4, 2, 0, 0, 0, 0, 2, 24, 0, 0, 0, 0, 0, 0, 149,253,76, 2, - 0, 0, 0, 0, 0, 32, 66, 0, 0, 0, 0, 0, 21, 52, 10, 0, 0, 0, 0, 0, 24, 68, 0, 0, 0, 0, 0, 0, 19, 89, 0, 0, 0, 0, 0, 0, 0, 56, 10, 1, - 0, 0, 0, 0, 20, 32, 130,0, 0, 0, 0, 0, 50, 65, 68, 0, 0, 0, 0, 0, 1, 32, 32, 0, 0, 0, 0, 0, 181,87, 94, 2, 0, 32, 0, 0, 12, 52, 70, 0, - 0, 0, 4, 0, 17, 253,16, 1, 0, 0, 0, 0, 1, 8, 6, 1, 0, 0, 0, 0, 128,48, 0, 1, 0, 0, 0, 0, 20, 65, 0, 1, 0, 0, 0, 0, 149,121,6, 1, - 0, 0, 0, 0, 0, 40, 6, 0, 0, 0, 0, 0, 140,0, 0, 0, 16, 32, 0, 0, 16, 25, 12, 0, 0, 0, 0, 0, 65, 65, 4, 0, 0, 32, 0, 0, 19, 136,0, 0, - 0, 0, 0, 0, 16, 105,0, 0, 0, 0, 0, 0, 20, 60, 14, 1, 0, 0, 0, 0, 128,12, 0, 0, 0, 0, 0, 0, 144,40, 8, 0, 0, 0, 0, 0, 17, 9, 0, 1, - 0, 0, 0, 0, 0, 40, 34, 0, 0, 0, 0, 0, 17, 8, 4, 0, 0, 0, 0, 0, 16, 40, 4, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 68, 8, 8, 0, - 0, 0, 0, 0, 91, 108,14, 0, 0, 0, 0, 0, 1, 32, 10, 0, 0, 0, 0, 0, 25, 33, 0, 2, 0, 0, 0, 0, 1, 24, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, - 0, 0, 32, 0, 19, 67, 18, 0, 0, 0, 0, 0, 74, 63, 126,1, 0, 0, 0, 0, 0, 8, 40, 0, 0, 0, 0, 0, 72, 0, 20, 0, 0, 0, 0, 0, 73, 0, 24, 0, - 0, 0, 0, 0, 129,129,0, 0, 0, 0, 0, 0, 129,5, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 4, 1, 0, 1, 0, 0, 0, 0, 32, 2, 2, 0, - 0, 0, 0, 0, 0, 28, 68, 0, 0, 0, 0, 0, 0, 234,4, 0, 0, 0, 0, 0, 2, 154,12, 0, 0, 0, 0, 0, 255,255,238,3, 0, 0, 0, 0, 96, 124,46, 0, - 0, 0, 0, 0, 21, 69, 0, 1, 0, 0, 0, 0, 68, 36, 0, 0, 0, 0, 0, 0, 19, 73, 0, 1, 0, 0, 0, 0, 16, 9, 4, 1, 0, 0, 0, 0, 17, 8, 2, 0, - 0, 0, 0, 0, 65, 8, 0, 0, 0, 0, 0, 0, 5, 64, 0, 0, 0, 0, 0, 0, 64, 128,8, 0, 0, 0, 0, 0, 4, 4, 1, 0, 0, 0, 0, 0, 149,68, 16, 1, - 0, 0, 0, 0, 0, 164,4, 0, 0, 0, 0, 0, 16, 72, 6, 0, 0, 0, 0, 0, 32, 32, 16, 0, 0, 0, 0, 0, 177,57, 4, 0, 0, 0, 0, 0, 0, 1, 12, 0, - 0, 0, 0, 0, 0, 17, 2, 1, 0, 0, 0, 0, 89, 105,86, 0, 0, 0, 0, 0, 16, 9, 16, 1, 0, 0, 0, 0, 32, 0, 2, 0, 0, 0, 0, 0, 20, 32, 132,0, - 0, 0, 0, 0, 33, 40, 10, 2, 0, 0, 0, 0, 202,60, 110,2, 0, 0, 0, 0, 0, 36, 2, 0, 0, 0, 0, 0, 19, 13, 4, 0, 0, 0, 0, 0, 0, 4, 72, 0, - 0, 0, 0, 0, 36, 0, 2, 0, 0, 0, 0, 0, 4, 36, 0, 0, 0, 0, 0, 0, 49, 37, 32, 0, 0, 0, 0, 0, 22, 125,84, 1, 0, 0, 0, 0, 5, 32, 8, 0, - 0, 0, 0, 0, 148,1, 0, 0, 0, 0, 0, 0, 32, 1, 16, 0, 0, 0, 0, 0, 17, 8, 0, 1, 16, 32, 0, 0, 255,255,94, 0, 0, 0, 0, 0, 0, 25, 20, 0, - 0, 160,0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 17, 73, 18, 1, 0, 0, 0, 0, 10, 40, 4, 0, 0, 0, 0, 0, 3, 97, 4, 1, 0, 32, 1, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 78, 8, 8, 0, 0, 0, 0, 0, 8, 32, 96, 0, 0, 96, 4, 0, 64, 0, 4, 0, 0, 0, 0, 0, 9, 8, 0, 0, 0, 0, 0, 0, 25, 9, 22, 1, - 0, 0, 0, 0, 16, 96, 2, 0, 0, 0, 0, 0, 0, 48, 4, 1, 0, 0, 0, 0, 17, 64, 24, 0, 0, 0, 0, 0, 4, 4, 0, 1, 0, 0, 0, 0, 144,32, 0, 0, - 0, 0, 0, 0, 1, 0, 116,0, 0, 0, 0, 0, 4, 48, 128,0, 0, 0, 0, 0, 0, 96, 16, 0, 0, 0, 0, 0, 0, 8, 4, 1, 0, 0, 0, 0, 147,20, 24, 0, - 0, 0, 0, 0, 16, 65, 18, 1, 0, 0, 0, 0, 24, 32, 128,0, 0, 0, 0, 0, 16, 144,0, 0, 0, 0, 0, 0, 1, 88, 16, 0, 0, 0, 0, 0, 17, 96, 16, 0, - 0, 0, 0, 0, 0, 160,2, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 16, 1, 0, 0, 0, 0, 17, 81, 2, 0, 0, 32, 0, 0, 2, 0, 4, 0, - 0, 0, 0, 0, 95, 77, 12, 1, 0, 0, 0, 0, 66, 40, 12, 3, 0, 0, 0, 0, 17, 64, 2, 1, 0, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 16, 0, 24, 0, - 0, 0, 0, 0, 132,12, 6, 1, 0, 0, 0, 0, 5, 32, 6, 0, 0, 0, 0, 0, 80, 0, 4, 0, 0, 112,32, 0, 211,89, 20, 1, 0, 0, 0, 0, 34, 32, 2, 0, - 0, 0, 0, 0, 93, 32, 14, 1, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 85, 224,8, 0, 0, 32, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 8, 0, 1, - 0, 0, 0, 0, 4, 160,72, 0, 0, 96, 22, 0, 94, 6, 6, 0, 0, 0, 0, 0, 8, 0, 152,0, 0, 0, 0, 0, 2, 68, 8, 0, 0, 0, 0, 0, 0, 80, 0, 2, - 0, 160,0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 249,109,12, 3, 0, 0, 0, 0, 0, 16, 26, 1, 0, 0, 0, 0, 17, 1, 22, 0, 0, 0, 0, 0, 211,88, 4, 0, - 0, 32, 0, 0, 0, 64, 4, 0, 0, 0, 0, 0, 18, 96, 0, 0, 0, 0, 0, 0, 16, 73, 4, 1, 0, 0, 0, 0, 20, 32, 0, 0, 0, 0, 0, 0, 1, 41, 16, 2, - 0, 0, 0, 0, 253,189,78, 0, 0, 0, 0, 0, 16, 0, 32, 0, 0, 0, 0, 0, 12, 0, 12, 0, 0, 0, 0, 0, 128,1, 4, 0, 0, 0, 0, 0, 149,128,8, 1, - 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 0, 0, 17, 200,0, 0, 0, 0, 0, 0, 95, 127,30, 1, 0, 0, 0, 0, 49, 8, 64, 0, 16, 128,0, 0, 158,89, 76, 1, - 0, 0, 0, 0, 16, 8, 0, 1, 0, 0, 0, 0, 32, 40, 4, 0, 0, 0, 0, 0, 154,57, 4, 1, 0, 0, 0, 0, 0, 40, 12, 1, 0, 0, 0, 0, 161,16, 0, 0, - 0, 0, 0, 0, 0, 8, 2, 1, 0, 0, 0, 0, 132,72, 68, 0, 0, 0, 0, 0, 24, 145,70, 0, 0, 224,7, 0, 0, 0, 4, 0, 0, 32, 60, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 215,221,77, 0, 0, 0, 0, 0, 68, 33, 2, 0, 0, 0, 0, 0, 145,64, 16, 0, 0, 0, 0, 0, 128,0, 2, 1, 0, 0, 0, 0, 16, 68, 0, 0, - 0, 0, 0, 0, 20, 32, 8, 0, 0, 0, 0, 0, 4, 8, 134,0, 0, 0, 0, 0, 17, 100,0, 0, 0, 0, 0, 0, 128,8, 2, 0, 0, 0, 0, 0, 32, 130,0, 0, - 0, 32, 0, 0, 0, 128,6, 0, 0, 0, 0, 0, 64, 68, 0, 0, 0, 0, 0, 0, 64, 48, 16, 0, 0, 0, 0, 0, 17, 66, 0, 0, 0, 0, 0, 0, 64, 40, 8, 0, - 0, 8, 0, 0, 151,121,94, 2, 0, 96, 4, 0, 19, 1, 4, 1, 0, 96, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 24, 1, 0, 0, 0, 0, 16, 121,0, 1, - 0, 32, 0, 0, 32, 56, 6, 0, 0, 0, 0, 0, 18, 8, 0, 0, 0, 0, 0, 0, 21, 37, 16, 2, 0, 64, 0, 0, 149,192,0, 0, 0, 0, 0, 0, 0, 76, 0, 0, - 0, 0, 0, 0, 64, 44, 4, 0, 0, 0, 0, 0, 16, 24, 1, 0, 0, 4, 0, 0, 0, 16, 1, 0, 0, 0, 0, 0, 29, 65, 56, 1, 0, 0, 0, 0, 255,61, 190,3, - 0, 0, 0, 0, 128,69, 0, 0, 0, 224,39, 0, 255,251,78, 1, 0, 0, 0, 0, 10, 40, 6, 0, 0, 0, 0, 0, 1, 64, 128,1, 0, 0, 0, 0, 64, 0, 64, 0, - 0, 0, 0, 0, 8, 32, 14, 1, 0, 0, 0, 0, 0, 16, 72, 0, 0, 0, 0, 0, 20, 32, 4, 0, 0, 0, 0, 0, 8, 0, 2, 1, 0, 0, 0, 0, 64, 33, 2, 0, - 0, 0, 0, 0, 0, 160,16, 0, 0, 0, 0, 0, 147,80, 24, 0, 0, 0, 0, 0, 0, 128,64, 0, 0, 0, 0, 0, 25, 1, 8, 1, 0, 96, 2, 0, 8, 48, 6, 2, - 0, 0, 0, 0, 64, 80, 0, 0, 0, 0, 0, 0, 16, 2, 0, 0, 0, 32, 0, 0, 3, 96, 0, 0, 0, 0, 0, 0, 12, 44, 6, 2, 0, 0, 0, 0, 16, 41, 4, 0, - 0, 32, 0, 0, 6, 56, 70, 1, 0, 0, 0, 0, 8, 8, 6, 1, 0, 0, 0, 0, 124,36, 13, 2, 0, 0, 0, 0, 145,196,0, 0, 0, 0, 0, 0, 49, 0, 0, 0, - 0, 0, 0, 0, 49, 65, 0, 1, 0, 32, 0, 0, 17, 89, 20, 1, 0, 0, 0, 0, 20, 4, 0, 0, 0, 0, 0, 0, 80, 33, 0, 0, 0, 0, 0, 0, 148,141,12, 2, - 0, 0, 0, 0, 192,0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 133,32, 8, 2, 0, 0, 0, 0, 16, 41, 0, 0, 0, 0, 0, 0, 20, 16, 100,0, - 0, 32, 1, 0, 8, 6, 6, 0, 0, 0, 0, 0, 221,53, 126,1, 0, 0, 0, 0, 4, 4, 28, 2, 0, 0, 0, 0, 1, 17, 0, 0, 0, 0, 0, 0, 12, 132,8, 0, - 0, 0, 0, 0, 52, 56, 64, 0, 0, 0, 0, 0, 140,52, 0, 0, 0, 0, 0, 0, 144,64, 4, 0, 0, 0, 0, 0, 16, 17, 0, 1, 0, 0, 0, 0, 16, 8, 8, 0, - 0, 0, 0, 0, 220,184,172,2, 0, 0, 0, 0, 0, 4, 6, 0, 0, 0, 0, 0, 16, 132,0, 0, 0, 0, 0, 0, 92, 36, 12, 0, 0, 32, 0, 0, 49, 57, 12, 0, - 0, 32, 0, 0, 17, 1, 4, 1, 0, 0, 0, 0, 128,4, 12, 0, 0, 32, 8, 0, 48, 0, 0, 0, 0, 0, 0, 0, 132,0, 0, 2, 0, 0, 0, 0, 255,117,254,1, - 0, 0, 0, 0, 128,4, 4, 2, 0, 0, 0, 0, 147,25, 4, 1, 0, 0, 0, 0, 10, 16, 4, 0, 0, 0, 0, 0, 50, 4, 0, 0, 0, 0, 0, 0, 64, 64, 4, 0, - 0, 0, 0, 0, 122,20, 5, 0, 0, 0, 0, 0, 72, 1, 4, 0, 0, 32, 0, 0, 1, 8, 6, 0, 0, 0, 0, 0, 8, 144,2, 0, 0, 32, 4, 0, 211,73, 78, 1, - 0, 0, 0, 0, 129,0, 88, 0, 0, 0, 0, 0, 114,1, 5, 0, 0, 0, 0, 0, 52, 0, 4, 0, 0, 0, 0, 0, 64, 33, 4, 0, 0, 0, 0, 0, 178,243,28, 0, - 0, 0, 0, 0, 128,64, 4, 0, 0, 0, 0, 0, 190,49, 30, 0, 0, 240,63, 0, 127,251,78, 1, 0, 240,23, 0, 0, 0, 0, 0, 0, 240,19, 0, 0, 0, 0, 0, - 0, 208,1, 0, 0, 0, 0, 0, 0, 64, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 128,1, 0, 0, 0, 0, 16, 64, 18, 0, 0, 0, 0, 0, 16, 32, 6, 0, - 0, 0, 0, 0, 0, 32, 128,0, 0, 96, 0, 0, 144,20, 12, 1, 0, 0, 0, 0, 0, 65, 8, 0, 0, 0, 0, 0, 147,133,4, 0, 0, 0, 0, 0, 34, 4, 12, 0, - 0, 32, 1, 0, 16, 24, 4, 0, 0, 0, 0, 0, 2, 0, 14, 0, 0, 0, 0, 0, 24, 8, 12, 2, 0, 0, 0, 0, 33, 0, 224,0, 0, 224,10, 0, 0, 148,0, 0, - 0, 144,18, 0, 0, 0, 0, 0, 0, 16, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 16, 4, 0, 0, 0, 0, 0, 204,60, 46, 2, 0, 0, 0, 0, 0, 1, 64, 1, - 0, 0, 0, 0, 8, 16, 12, 0, 0, 0, 0, 0, 16, 25, 70, 0, 0, 0, 0, 0, 48, 1, 4, 0, 0, 0, 0, 0, 176,57, 70, 1, 0, 112,4, 0, 31, 95, 30, 3, - 0, 0, 0, 0, 44, 36, 0, 0, 0, 0, 0, 0, 18, 73, 4, 1, 0, 32, 0, 0, 16, 106,8, 0, 0, 96, 3, 0, 90, 82, 44, 1, 0, 0, 0, 0, 4, 36, 10, 0, - 0, 0, 0, 0, 21, 32, 0, 0, 0, 32, 0, 0, 2, 8, 64, 0, 0, 0, 0, 0, 16, 89, 8, 0, 0, 0, 0, 0, 149,92, 4, 2, 0, 0, 0, 0, 64, 32, 4, 0, - 0, 0, 0, 0, 0, 140,0, 0, 0, 0, 0, 0, 17, 33, 16, 0, 0, 0, 0, 0, 144,88, 6, 0, 0, 0, 0, 0, 0, 56, 2, 0, 0, 0, 0, 0, 249,125,66, 3, - 0, 0, 0, 0, 128,20, 2, 1, 0, 0, 0, 0, 65, 56, 6, 1, 0, 0, 0, 0, 52, 40, 6, 0, 0, 8, 0, 0, 0, 48, 34, 0, 0, 0, 0, 0, 226,8, 68, 0, - 0, 0, 0, 0, 206,253,62, 1, 0, 0, 0, 0, 16, 16, 128,0, 0, 0, 0, 0, 4, 4, 2, 0, 0, 0, 0, 0, 16, 13, 0, 0, 0, 0, 0, 0, 24, 1, 4, 0, - 0, 0, 0, 0, 67, 113,4, 0, 0, 0, 0, 0, 148,193,0, 0, 0, 0, 0, 0, 68, 32, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 217,105,22, 1, - 0, 0, 0, 0, 20, 32, 14, 2, 0, 0, 0, 0, 0, 4, 0, 2, 0, 0, 0, 0, 17, 9, 20, 1, 0, 0, 0, 0, 20, 16, 12, 0, 0, 0, 0, 0, 25, 121,22, 0, - 0, 0, 0, 0, 4, 57, 10, 0, 0, 0, 0, 0, 1, 96, 0, 0, 0, 0, 0, 0, 17, 21, 4, 0, 0, 0, 0, 0, 0, 32, 10, 1, 0, 0, 0, 0, 2, 4, 0, 0, - 0, 0, 0, 0, 17, 49, 0, 0, 0, 0, 0, 0, 93, 44, 44, 0, 0, 0, 0, 0, 9, 0, 6, 0, 0, 0, 0, 0, 0, 144,4, 0, 0, 0, 8, 0, 0, 64, 0, 0, - 0, 0, 0, 0, 20, 10, 60, 0, 0, 0, 0, 0, 17, 68, 0, 0, 0, 0, 0, 0, 17, 88, 20, 0, 0, 0, 0, 0, 125,125,60, 3, 0, 0, 0, 0, 72, 32, 10, 1, - 0, 0, 0, 0, 8, 64, 8, 0, 0, 0, 0, 0, 49, 125,94, 0, 0, 0, 0, 0, 21, 8, 0, 0, 0, 0, 0, 0, 2, 38, 110,1, 0, 0, 0, 0, 0, 0, 112,0, - 0, 0, 0, 0, 85, 96, 40, 0, 0, 0, 0, 0, 0, 4, 16, 0, 0, 0, 0, 0, 88, 0, 4, 0, 0, 0, 0, 0, 19, 81, 4, 1, 0, 0, 0, 0, 20, 32, 2, 0, - 0, 0, 0, 0, 84, 32, 132,0, 0, 0, 0, 0, 4, 16, 128,2, 0, 0, 0, 0, 64, 32, 10, 0, 0, 0, 0, 0, 145,64, 8, 0, 0, 0, 0, 0, 16, 65, 4, 2, - 0, 0, 0, 0, 83, 149,4, 2, 0, 0, 0, 0, 17, 65, 20, 1, 0, 0, 0, 0, 12, 0, 6, 1, 0, 32, 0, 0, 64, 80, 4, 0, 0, 0, 0, 0, 255,103,124,3, - 0, 0, 0, 0, 76, 185,110,0, 0, 0, 0, 0, 0, 96, 0, 2, 0, 16, 32, 0, 145,65, 22, 1, 0, 0, 0, 0, 64, 32, 2, 0, 0, 0, 0, 0, 8, 0, 34, 0, - 0, 32, 0, 0, 170,184,14, 1, 0, 96, 4, 0, 0, 0, 4, 0, 0, 32, 4, 0, 0, 0, 12, 0, 0, 0, 0, 0, 80, 0, 2, 0, 0, 0, 0, 0, 145,73, 72, 0, - 0, 0, 0, 0, 1, 64, 32, 0, 0, 0, 0, 0, 48, 104,8, 0, 0, 0, 0, 0, 4, 32, 0, 1, 0, 0, 0, 0, 81, 65, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, - 0, 0, 0, 0, 17, 73, 0, 1, 0, 0, 0, 0, 1, 56, 46, 1, 0, 0, 0, 0, 52, 32, 64, 0, 0, 0, 0, 0, 18, 16, 112,0, 0, 0, 0, 0, 21, 65, 16, 0, - 0, 0, 0, 0, 16, 8, 2, 1, 0, 0, 0, 0, 68, 0, 6, 2, 0, 0, 0, 0, 254,255,14, 3, 0, 0, 0, 0, 16, 89, 4, 1, 0, 0, 0, 0, 128,68, 0, 0, - 0, 0, 0, 0, 0, 73, 0, 1, 0, 0, 0, 0, 17, 41, 4, 1, 0, 0, 0, 0, 151,93, 76, 0, 0, 0, 0, 0, 2, 16, 2, 0, 0, 0, 0, 0, 8, 48, 2, 0, - 0, 0, 0, 0, 147,1, 12, 0, 0, 0, 0, 0, 0, 64, 128,0, 0, 96, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 24, 1, 44, 0, 0, 0, 0, 0, 8, 32, 34, 0, - 0, 0, 0, 0, 2, 80, 0, 0, 0, 0, 1, 0, 16, 1, 0, 0, 0, 0, 0, 0, 25, 81, 0, 0, 0, 0, 0, 0, 145,0, 8, 0, 0, 0, 0, 0, 149,121,4, 1, - 0, 0, 0, 0, 19, 16, 6, 0, 0, 32, 0, 0, 0, 17, 8, 1, 0, 32, 4, 0, 4, 16, 4, 0, 0, 0, 0, 0, 129,4, 0, 0, 0, 0, 0, 0, 128,128,0, 0, - 0, 0, 0, 0, 95, 255,95, 3, 0, 0, 0, 0, 198,32, 140,0, 0, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 81, 107,64, 0, 0, 0, 0, 0, 1, 40, 6, 0, - 0, 0, 0, 0, 16, 4, 8, 0, 0, 0, 0, 0, 153,60, 6, 1, 0, 0, 0, 0, 145,121,20, 0, 0, 0, 0, 0, 5, 96, 5, 0, 0, 96, 0, 0, 16, 76, 0, 0, - 0, 0, 0, 0, 4, 32, 4, 0, 0, 64, 0, 0, 176,80, 28, 0, 0, 0, 0, 0, 1, 80, 2, 0, 0, 0, 0, 0, 170,52, 116,2, 0, 0, 0, 0, 21, 4, 0, 0, - 0, 0, 0, 0, 4, 0, 4, 1, 0, 0, 0, 0, 64, 24, 10, 0, 0, 0, 0, 0, 16, 24, 74, 0, 0, 0, 0, 0, 149,69, 8, 0, 0, 0, 0, 0, 128,105,0, 2, - 0, 0, 0, 0, 36, 178,36, 0, 0, 0, 0, 0, 149,253,77, 0, 0, 0, 0, 0, 4, 36, 6, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 129,65, 0, 0, - 0, 96, 0, 0, 16, 16, 4, 0, 0, 0, 0, 0, 32, 56, 2, 0, 0, 0, 0, 0, 17, 8, 6, 0, 0, 0, 0, 0, 0, 56, 192,0, 0, 160,1, 0, 153,89, 28, 1, - 0, 0, 0, 0, 17, 65, 66, 0, 0, 32, 32, 0, 0, 1, 0, 0, 0, 64, 0, 64, 157,100,126,2, 0, 0, 0, 0, 4, 4, 5, 0, 0, 0, 0, 0, 0, 9, 42, 0, - 0, 0, 0, 0, 17, 112,64, 1, 0, 0, 0, 0, 0, 8, 132,0, 0, 0, 0, 0, 85, 73, 22, 0, 0, 0, 0, 0, 0, 56, 130,0, 0, 0, 0, 0, 126,61, 111,3, - 0, 0, 0, 0, 129,69, 0, 0, 0, 0, 0, 0, 0, 0, 14, 1, 0, 0, 0, 0, 16, 75, 2, 0, 0, 0, 0, 0, 145,1, 16, 0, 0, 0, 0, 0, 1, 48, 12, 0, - 0, 0, 0, 0, 93, 73, 72, 0, 0, 0, 0, 0, 0, 0, 42, 3, 0, 0, 0, 0, 12, 8, 8, 0, 0, 0, 0, 0, 17, 9, 4, 1, 0, 0, 0, 0, 127,46, 15, 0, - 0, 0, 0, 0, 64, 33, 0, 1, 0, 0, 0, 0, 17, 64, 36, 0, 0, 0, 0, 0, 144,28, 29, 0, 0, 0, 0, 0, 148,65, 78, 0, 0, 0, 0, 0, 32, 40, 8, 0, - 0, 0, 0, 0, 16, 40, 9, 0, 0, 0, 0, 0, 16, 20, 0, 0, 0, 0, 0, 0, 16, 42, 2, 1, 0, 0, 0, 0, 17, 96, 4, 0, 0, 0, 0, 0, 221,61, 78, 3, - 0, 0, 0, 0, 8, 40, 6, 1, 0, 0, 0, 0, 0, 17, 4, 1, 0, 128,0, 0, 27, 1, 20, 0, 0, 0, 0, 0, 144,128,8, 0, 0, 0, 0, 0, 20, 89, 204,1, - 0, 0, 0, 0, 8, 8, 6, 0, 0, 32, 1, 0, 191,45, 92, 2, 0, 64, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 32, 6, 0, 0, 0, 0, 0, 17, 0, 12, 0, - 0, 0, 0, 0, 1, 32, 14, 0, 16, 8, 0, 0, 20, 64, 8, 0, 0, 0, 0, 0, 17, 81, 64, 3, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 12, 32, 0, 2, - 0, 32, 0, 0, 0, 0, 38, 0, 0, 64, 0, 0, 64, 0, 32, 0, 0, 48, 2, 0, 93, 105,90, 3, 0, 16, 0, 0, 8, 0, 0, 0, 16, 0, 0, 0, 255,127,255,3, - 0, 0, 0, 0, 144,0, 0, 2, 0, 0, 0, 0, 147,64, 20, 0, 0, 0, 0, 0, 149,5, 8, 1, 0, 0, 0, 0, 10, 8, 78, 1, 0, 0, 0, 0, 16, 25, 8, 0, - 0, 0, 0, 0, 18, 57, 4, 0, 0, 0, 0, 0, 16, 56, 10, 1, 0, 0, 0, 0, 2, 0, 6, 0, 0, 64, 0, 0, 187,249,78, 1, 0, 0, 0, 0, 16, 0, 16, 1, - 0, 0, 0, 0, 16, 32, 2, 1, 0, 0, 0, 0, 68, 32, 4, 0, 0, 32, 0, 0, 4, 0, 68, 0, 0, 0, 0, 0, 192,16, 4, 0, 0, 0, 0, 0, 32, 16, 0, 0, - 0, 0, 0, 0, 89, 0, 20, 0, 0, 0, 0, 0, 4, 160,0, 0, 0, 0, 0, 0, 72, 56, 12, 0, 0, 0, 0, 0, 16, 1, 68, 0, 0, 0, 0, 0, 49, 8, 4, 0, - 0, 32, 0, 0, 29, 9, 76, 1, 0, 0, 0, 0, 144,5, 4, 0, 0, 0, 0, 0, 42, 16, 6, 0, 0, 0, 0, 0, 151,216,84, 0, 0, 0, 0, 0, 253,101,28, 3, - 0, 0, 0, 0, 129,69, 16, 0, 0, 0, 0, 0, 4, 32, 8, 2, 0, 0, 0, 0, 17, 121,78, 1, 0, 0, 0, 0, 0, 104,16, 0, 0, 0, 0, 0, 24, 41, 70, 0, - 0, 32, 0, 0, 16, 32, 4, 0, 0, 32, 0, 0, 0, 56, 66, 0, 0, 240,30, 0, 0, 32, 0, 0, 0, 96, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 113,48, 4, 0, - 0, 0, 0, 0, 52, 68, 8, 0, 0, 0, 0, 0, 48, 105,0, 2, 0, 0, 0, 0, 182,77, 84, 0, 0, 0, 0, 0, 49, 1, 64, 1, 0, 0, 0, 0, 1, 8, 22, 1, - 0, 0, 0, 0, 0, 0, 130,0, 0, 0, 0, 0, 20, 8, 0, 0, 0, 0, 0, 0, 149,129,92, 2, 0, 0, 0, 0, 0, 1, 128,0, 0, 0, 0, 0, 92, 60, 12, 0, - 0, 0, 0, 0, 58, 1, 68, 0, 0, 0, 0, 0, 12, 0, 8, 0, 0, 32, 0, 0, 136,40, 6, 0, 0, 96, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 24, 40, 0, 0, - 0, 0, 0, 0, 26, 24, 12, 0, 0, 0, 0, 0, 17, 73, 0, 2, 0, 0, 0, 0, 17, 40, 0, 0, 0, 32, 0, 0, 16, 9, 0, 0, 0, 0, 0, 0, 255,125,126,3, - 0, 0, 0, 0, 12, 52, 30, 2, 0, 0, 0, 0, 33, 16, 76, 1, 0, 32, 0, 0, 59, 97, 92, 0, 0, 0, 0, 0, 66, 0, 64, 0, 0, 0, 0, 0, 48, 128,68, 0, - 0, 0, 0, 0, 17, 9, 12, 1, 0, 0, 0, 0, 8, 8, 128,0, 0, 0, 0, 0, 148,68, 0, 0, 0, 0, 0, 0, 18, 33, 8, 0, 0, 0, 0, 0, 128,48, 70, 0, - 0, 0, 0, 0, 140,56, 6, 2, 0, 0, 0, 0, 17, 73, 4, 0, 0, 0, 0, 0, 17, 80, 16, 0, 0, 0, 0, 0, 17, 80, 0, 2, 0, 0, 0, 0, 248,40, 44, 2, - 0, 0, 0, 0, 68, 0, 8, 0, 0, 0, 0, 0, 146,28, 80, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 0, 0, 1, 2, 4, 0, 0, 0, 0, 0, 83, 48, 4, 0, - 0, 0, 0, 0, 221,97, 12, 0, 0, 32, 4, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 20, 6, 0, 0, 0, 0, 0, 4, 49, 2, 0, 0, 0, 0, 0, 16, 33, 0, 0, - 0, 32, 0, 0, 33, 104,68, 2, 0, 0, 0, 0, 148,108,12, 0, 0, 0, 0, 0, 129,72, 8, 2, 0, 0, 0, 0, 72, 32, 0, 0, 0, 32, 0, 0, 128,80, 4, 0, - 0, 0, 0, 0, 16, 33, 8, 0, 0, 0, 0, 0, 65, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 150,129,12, 0, 0, 0, 0, 0, 144,97, 0, 0, - 0, 0, 0, 0, 1, 4, 4, 0, 0, 0, 2, 0, 223,122,172,2, 0, 0, 0, 0, 64, 33, 18, 0, 0, 96, 2, 0, 127,254,76, 2, 0, 0, 0, 0, 20, 0, 64, 0, - 0, 0, 0, 0, 144,4, 4, 0, 0, 32, 0, 0, 144,56, 68, 1, 0, 0, 0, 0, 8, 8, 10, 1, 0, 0, 0, 0, 89, 139,68, 0, 0, 0, 0, 0, 65, 32, 68, 0, - 0, 0, 0, 0, 10, 0, 4, 0, 0, 0, 0, 0, 176,49, 64, 0, 0, 32, 0, 0, 168,176,78, 0, 0, 32, 0, 0, 0, 64, 8, 0, 0, 0, 0, 0, 232,40, 22, 0, - 0, 0, 0, 0, 20, 9, 4, 0, 0, 0, 0, 0, 16, 96, 8, 2, 0, 0, 0, 0, 209,57, 20, 0, 0, 0, 0, 0, 17, 65, 8, 0, 0, 32, 0, 0, 178,120,68, 0, - 0, 0, 0, 0, 144,72, 0, 0, 0, 16, 0, 0, 0, 32, 16, 0, 0, 0, 0, 0, 177,24, 4, 0, 0, 0, 0, 0, 93, 45, 12, 0, 0, 0, 0, 0, 81, 9, 0, 2, - 0, 0, 0, 0, 64, 0, 6, 1, 0, 0, 0, 0, 145,25, 4, 0, 0, 0, 0, 0, 4, 32, 16, 0, 0, 0, 0, 0, 144,24, 4, 0, 0, 0, 0, 0, 32, 72, 0, 0, - 0, 0, 0, 0, 22, 76, 12, 0, 0, 0, 0, 0, 16, 9, 0, 1, 0, 0, 0, 0, 0, 40, 64, 0, 0, 32, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 21, 225,12, 2, - 0, 32, 0, 0, 17, 121,4, 0, 0, 0, 0, 0, 144,33, 8, 0, 0, 0, 0, 0, 255,255,222,3, 0, 0, 0, 0, 191,57, 118,1, 0, 0, 0, 0, 128,1, 72, 0, - 0, 0, 0, 0, 149,5, 0, 0, 0, 0, 0, 0, 146,249,124,0, 0, 0, 0, 0, 130,0, 4, 1, 0, 0, 0, 0, 187,117,14, 3, 0, 0, 0, 0, 0, 40, 22, 1, - 0, 0, 0, 0, 80, 32, 4, 0, 0, 0, 0, 0, 68, 36, 2, 0, 0, 0, 0, 0, 0, 17, 4, 0, 0, 0, 0, 0, 32, 24, 0, 0, 0, 0, 0, 0, 73, 40, 2, 0, - 0, 0, 0, 0, 17, 5, 4, 0, 0, 0, 0, 0, 2, 32, 2, 0, 0, 0, 0, 0, 1, 9, 0, 0, 0, 0, 0, 0, 59, 153,68, 0, 0, 0, 0, 0, 125,37, 204,2, - 0, 0, 0, 0, 0, 68, 8, 0, 0, 0, 0, 0, 12, 20, 0, 2, 0, 0, 0, 0, 0, 17, 68, 1, 0, 0, 0, 0, 184,89, 100,0, 0, 32, 0, 0, 0, 32, 6, 0, - 0, 32, 0, 0, 128,5, 32, 0, 0, 0, 0, 0, 176,0, 4, 0, 0, 4, 0, 0, 148,53, 12, 0, 0, 0, 0, 0, 64, 64, 16, 0, 0, 0, 0, 0, 17, 80, 0, 0, - 0, 0, 0, 0, 144,16, 8, 2, 0, 96, 0, 0, 128,40, 12, 0, 0, 0, 0, 0, 200,53, 68, 0, 0, 0, 0, 0, 27, 57, 4, 1, 0, 96, 0, 0, 62, 105,70, 1, - 0, 32, 32, 0, 2, 64, 104,0, 0, 0, 0, 0, 0, 44, 4, 0, 0, 0, 0, 0, 254,63, 156,3, 0, 0, 0, 0, 149,5, 0, 2, 0, 96, 4, 0, 0, 8, 68, 1, - 0, 0, 0, 0, 144,49, 4, 0, 0, 0, 0, 0, 68, 48, 6, 0, 0, 0, 0, 0, 208,16, 0, 0, 0, 0, 0, 0, 209,56, 0, 0, 0, 0, 0, 0, 0, 34, 4, 0, - 0, 0, 0, 0, 51, 25, 68, 0, 0, 0, 0, 0, 4, 8, 16, 0, 0, 0, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 127,119,12, 2, 0, 0, 0, 0, 17, 9, 10, 0, - 0, 0, 0, 0, 5, 9, 10, 1, 0, 0, 0, 0, 1, 16, 10, 0, 0, 32, 0, 0, 10, 0, 76, 0, 0, 0, 0, 0, 4, 68, 104,0, 0, 0, 0, 0, 148,69, 29, 0, - 0, 0, 0, 0, 16, 9, 68, 1, 0, 0, 0, 0, 81, 73, 20, 0, 0, 0, 0, 0, 93, 125,28, 0, 0, 96, 0, 0, 9, 32, 12, 0, 0, 0, 0, 0, 81, 32, 8, 0, - 0, 0, 0, 0, 0, 160,0, 2, 0, 0, 0, 0, 16, 64, 16, 1, 0, 0, 0, 0, 64, 32, 4, 2, 0, 64, 0, 0, 133,52, 0, 0, 0, 0, 0, 0, 255,255,191,3, - 0, 96, 60, 0, 139,16, 4, 0, 0, 32, 0, 0, 66, 0, 4, 0, 0, 0, 0, 0, 149,69, 20, 3, 0, 0, 0, 0, 145,73, 16, 0, 0, 0, 0, 0, 0, 4, 10, 1, - 0, 0, 0, 0, 147,125,76, 0, 0, 0, 0, 0, 0, 56, 18, 0, 0, 48, 0, 0, 179,121,78, 1, 0, 0, 0, 0, 0, 40, 10, 1, 0, 32, 0, 0, 128,0, 12, 0, - 0, 0, 0, 0, 8, 0, 70, 1, 0, 32, 0, 0, 128,68, 8, 0, 0, 0, 0, 0, 17, 4, 0, 1, 0, 0, 1, 0, 217,125,118,3, 0, 0, 0, 0, 0, 132,0, 1, - 0, 0, 0, 0, 145,73, 4, 1, 0, 32, 0, 0, 128,0, 4, 0, 0, 240,43, 0, 14, 8, 12, 1, 0, 0, 0, 0, 0, 34, 6, 0, 0, 0, 0, 0, 196,56, 14, 0, - 0, 0, 0, 0, 80, 8, 0, 0, 0, 0, 0, 0, 16, 104,0, 0, 0, 0, 0, 0, 73, 65, 42, 0, 0, 0, 0, 0, 68, 1, 4, 0, 0, 0, 0, 0, 33, 68, 8, 0, - 0, 0, 0, 0, 17, 69, 20, 1, 0, 32, 0, 0, 0, 8, 0, 1, 0, 32, 8, 0, 16, 0, 4, 0, 0, 0, 0, 0, 8, 0, 10, 1, 0, 96, 1, 0, 2, 0, 4, 0, - 0, 64, 4, 0, 0, 16, 0, 0, 0, 0, 0, 0, 211,121,12, 1, 0, 0, 0, 0, 66, 32, 10, 1, 0, 32, 0, 0, 16, 16, 4, 1, 0, 0, 0, 0, 2, 0, 4, 1, - 0, 0, 0, 0, 17, 91, 2, 0, 0, 0, 0, 0, 20, 44, 12, 0, 0, 0, 0, 0, 16, 1, 20, 0, 0, 0, 0, 0, 129,97, 16, 0, 0, 0, 0, 0, 145,69, 2, 0, - 0, 0, 0, 0, 127,127,76, 0, 0, 0, 0, 0, 196,32, 74, 0, 0, 0, 0, 0, 4, 52, 4, 0, 0, 0, 0, 0, 144,9, 0, 1, 0, 0, 0, 0, 253,241,86, 1, - 0, 224,30, 0, 64, 0, 4, 0, 0, 0, 0, 0, 0, 1, 76, 0, 0, 32, 0, 0, 0, 129,12, 0, 0, 0, 0, 0, 16, 96, 44, 0, 0, 96, 0, 0, 144,0, 0, 0, - 0, 32, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 4, 0, 100,0, 0, 0, 0, 0, 17, 16, 2, 0, 0, 0, 0, 0, 243,144,4, 0, 0, 0, 0, 0, 1, 8, 2, 1, - 0, 0, 0, 0, 17, 5, 20, 1, 0, 0, 0, 0, 95, 37, 28, 3, 0, 0, 0, 0, 144,68, 0, 0, 0, 0, 0, 0, 17, 9, 14, 1, 0, 0, 0, 0, 66, 96, 4, 0, - 0, 0, 0, 0, 3, 8, 78, 0, 0, 0, 0, 0, 149,73, 0, 1, 0, 96, 0, 0, 0, 16, 4, 0, 0, 0, 0, 0, 17, 67, 6, 3, 0, 0, 0, 0, 0, 40, 8, 1, - 0, 0, 0, 0, 8, 49, 4, 0, 0, 0, 0, 0, 255,255,127,3, 0, 0, 0, 0, 0, 36, 28, 0, 0, 0, 0, 0, 17, 65, 6, 1, 0, 0, 0, 0, 144,5, 0, 2, - 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 0, 0, 81, 81, 68, 2, 0, 0, 0, 0, 20, 32, 12, 0, 0, 0, 0, 0, 1, 40, 12, 0, 0, 0, 0, 0, 4, 0, 132,0, - 0, 0, 0, 0, 219,121,30, 1, 0, 0, 0, 0, 16, 104,14, 1, 0, 0, 0, 0, 0, 20, 12, 0, 0, 0, 0, 0, 1, 112,4, 1, 0, 0, 0, 0, 64, 48, 0, 0, - 0, 0, 0, 0, 85, 32, 6, 0, 0, 0, 0, 0, 153,89, 4, 0, 0, 0, 0, 0, 16, 8, 14, 1, 0, 0, 0, 0, 17, 193,12, 1, 0, 0, 0, 0, 64, 160,0, 2, - 0, 0, 0, 0, 0, 1, 76, 1, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 0, 145,73, 92, 0, 0, 0, 0, 0, 2, 176,22, 0, 0, 0, 0, 0, 8, 9, 14, 1, - 0, 0, 0, 0, 16, 1, 104,0, 0, 0, 0, 0, 49, 65, 20, 1, 0, 0, 0, 0, 64, 8, 6, 0, 0, 0, 0, 0, 92, 40, 12, 0, 0, 0, 0, 0, 0, 8, 84, 0, - 0, 0, 0, 0, 21, 73, 8, 0, 0, 0, 0, 0, 16, 65, 4, 1, 0, 0, 0, 0, 148,121,12, 0, 0, 0, 0, 0, 0, 8, 16, 1, 0, 0, 0, 0, 159,93, 93, 3, - 0, 0, 0, 0, 12, 48, 6, 1, 0, 0, 0, 0, 51, 125,98, 1, 0, 0, 0, 0, 152,8, 6, 1, 0, 0, 0, 0, 24, 32, 0, 0, 0, 0, 0, 0, 8, 4, 6, 0, - 0, 0, 0, 0, 80, 4, 0, 0, 0, 0, 0, 0, 18, 144,64, 0, 0, 0, 0, 0, 21, 93, 8, 1, 0, 0, 0, 0, 17, 73, 4, 1, 0, 240,52, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 149,124,30, 3, 0, 0, 0, 0, 14, 41, 16, 1, 0, 32, 0, 0, 16, 5, 0, 1, 0, 0, 0, 0, 1, 104,18, 0, 0, 0, 0, 0, 35, 0, 0, 0, - 0, 32, 0, 0, 179,253,14, 2, 0, 0, 0, 0, 0, 65, 4, 0, 0, 32, 0, 0, 54, 57, 68, 1, 0, 0, 0, 0, 16, 12, 0, 0, 0, 0, 0, 0, 3, 8, 8, 0, - 0, 0, 0, 0, 21, 65, 20, 0, 0, 0, 0, 0, 147,65, 16, 2, 0, 0, 0, 0, 53, 85, 68, 3, 0, 0, 0, 0, 8, 72, 6, 0, 0, 0, 0, 0, 255,253,94, 2, - 0, 0, 0, 0, 2, 58, 6, 0, 0, 0, 0, 0, 17, 1, 20, 0, 0, 0, 0, 0, 89, 64, 24, 0, 0, 0, 0, 0, 89, 106,16, 0, 0, 0, 0, 0, 16, 0, 28, 0, - 0, 0, 0, 0, 4, 16, 4, 0, 144,252,13, 0, 255,255,255,3, 128,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 1, 32, 0, 0, 0, 0, 0, 9, 128,0, 0, - 0, 16, 0, 0, 0, 8, 2, 0, 0, 0, 0, 0, 8, 0, 1, 0, 0, 64, 0, 0, 255,255,255,3, 0, 0, 0, 0, 0, 56, 8, 0, 0, 0, 1, 0, 27, 73, 22, 0, - 0, 0, 0, 0, 72, 56, 14, 0, 0, 0, 0, 0, 20, 0, 2, 0, 0, 0, 0, 0, 6, 8, 2, 2, 0, 0, 0, 0, 1, 32, 8, 0, 0, 0, 0, 0, 10, 40, 0, 1, - 0, 32, 0, 0, 26, 0, 4, 0, 0, 32, 0, 0, 72, 16, 102,0, 0, 0, 0, 0, 0, 96, 78, 0, 0, 0, 0, 0, 64, 2, 0, 0, 0, 0, 0, 0, 0, 34, 2, 0, - 0, 0, 0, 0, 1, 104,0, 0, 0, 0, 0, 0, 149,69, 8, 1, 0, 0, 0, 0, 4, 204,8, 0, 0, 0, 0, 0, 16, 40, 18, 0, 0, 0, 0, 0, 2, 64, 1, 0, - 0, 8, 0, 0, 187,89, 82, 1, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 16, 73, 0, 1, 0, 0, 0, 0, 84, 0, 4, 0, 0, 0, 0, 0, 0, 56, 10, 0, - 0, 0, 0, 0, 133,0, 0, 2, 0, 0, 0, 0, 84, 8, 0, 2, 0, 0, 0, 0, 96, 0, 10, 1, 0, 0, 0, 0, 12, 40, 14, 2, 0, 0, 0, 0, 0, 168,16, 0, - 0, 0, 0, 0, 53, 72, 0, 0, 0, 0, 0, 0, 64, 0, 6, 0, 0, 0, 0, 0, 16, 33, 2, 1, 0, 0, 0, 0, 0, 4, 8, 1, 0, 0, 0, 0, 81, 41, 16, 0, - 0, 0, 0, 0, 40, 0, 6, 1, 0, 0, 0, 0, 0, 68, 2, 0, 0, 0, 0, 0, 5, 120,190,0, 0, 0, 0, 0, 32, 0, 0, 2, 16, 0, 0, 0, 80, 33, 4, 0, - 0, 0, 0, 0, 25, 96, 0, 0, 0, 0, 0, 0, 128,72, 0, 0, 0, 0, 0, 0, 17, 69, 16, 0, 0, 0, 0, 0, 255,253,122,3, 0, 0, 0, 0, 170,53, 106,1, - 0, 0, 0, 0, 1, 1, 2, 0, 0, 0, 0, 0, 19, 65, 16, 0, 0, 0, 0, 0, 64, 96, 14, 0, 0, 0, 0, 0, 33, 64, 24, 0, 0, 0, 0, 0, 17, 64, 66, 1, - 0, 0, 0, 0, 4, 1, 2, 0, 0, 0, 0, 0, 9, 65, 68, 0, 0, 0, 0, 0, 75, 48, 142,1, 0, 0, 0, 0, 126,178,140,2, 0, 0, 0, 0, 17, 0, 18, 0, - 0, 4, 0, 0, 33, 64, 0, 0, 0, 0, 0, 0, 145,0, 4, 0, 0, 16, 32, 0, 19, 113,20, 1, 0, 0, 0, 0, 202,113,78, 0, 0, 0, 0, 0, 0, 81, 0, 0, - 0, 0, 0, 0, 72, 98, 6, 3, 0, 0, 0, 0, 0, 64, 4, 1, 0, 0, 0, 0, 212,112,132,0, 0, 0, 0, 0, 65, 0, 4, 0, 0, 0, 0, 0, 0, 128,12, 0, - 0, 0, 0, 0, 32, 32, 84, 0, 0, 0, 0, 0, 16, 105,4, 0, 0, 0, 0, 0, 68, 224,94, 0, 0, 0, 0, 0, 20, 16, 0, 0, 0, 0, 0, 0, 145,64, 2, 0, - 0, 0, 0, 0, 66, 32, 0, 0, 0, 0, 0, 0, 0, 40, 14, 1, 0, 32, 4, 0, 64, 65, 0, 0, 0, 0, 0, 0, 0, 128,128,0, 16, 0, 0, 0, 63, 249,22, 0, - 0, 0, 0, 0, 84, 46, 6, 0, 0, 0, 0, 0, 89, 65, 0, 0, 0, 32, 4, 0, 0, 32, 4, 2, 0, 0, 0, 0, 0, 72, 64, 0, 0, 0, 0, 0, 13, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 22, 0, 0, 32, 0, 0, 0, 122,2, 1, 0, 32, 0, 0, 50, 73, 12, 0, 0, 32, 0, 0, 0, 48, 76, 0, 0, 32, 0, 0, 0, 96, 16, 0, - 0, 112,44, 0, 0, 0, 4, 0, 0, 0, 0, 0, 28, 104,6, 0, 0, 0, 0, 0, 1, 73, 0, 0, 0, 0, 0, 0, 80, 32, 18, 0, 0, 16, 0, 0, 251,81, 28, 1, - 0, 0, 0, 0, 64, 33, 22, 0, 0, 0, 0, 0, 13, 104,6, 0, 0, 0, 0, 0, 0, 104,4, 0, 0, 0, 0, 0, 2, 40, 38, 1, 16, 0, 0, 0, 255,253,124,3, - 0, 0, 0, 0, 11, 172,110,0, 0, 32, 32, 0, 0, 1, 4, 1, 128,0, 0, 0, 20, 0, 4, 0, 0, 0, 0, 0, 17, 64, 20, 0, 0, 0, 0, 0, 145,9, 18, 0, - 0, 0, 4, 0, 0, 64, 4, 0, 0, 0, 0, 0, 0, 104,0, 0, 0, 4, 0, 0, 17, 73, 18, 1, 0, 0, 0, 0, 29, 8, 4, 0, 0, 32, 0, 0, 2, 24, 70, 0, - 0, 0, 0, 0, 0, 104,2, 2, 0, 96, 4, 0, 55, 16, 4, 0, 0, 0, 0, 0, 24, 140,46, 3, 0, 32, 0, 0, 36, 0, 8, 0, 0, 0, 0, 0, 0, 0, 2, 2, - 0, 0, 0, 0, 0, 24, 0, 1, 0, 0, 0, 0, 42, 224,4, 2, 0, 0, 0, 0, 26, 32, 42, 0, 0, 0, 0, 0, 34, 32, 4, 2, 0, 0, 0, 0, 4, 40, 8, 0, - 0, 32, 0, 0, 27, 1, 4, 0, 0, 0, 0, 0, 80, 168,38, 1, 0, 0, 0, 0, 0, 1, 6, 0, 0, 32, 0, 0, 80, 1, 6, 0, 0, 0, 0, 0, 49, 73, 126,1, - 0, 0, 0, 0, 14, 44, 42, 0, 0, 0, 0, 0, 24, 24, 2, 1, 0, 0, 0, 0, 4, 44, 0, 0, 0, 0, 0, 0, 113,0, 0, 0, 0, 0, 0, 0, 0, 160,6, 0, - 0, 32, 8, 0, 0, 8, 0, 0, 0, 0, 0, 0, 17, 0, 20, 0, 0, 0, 0, 0, 32, 8, 4, 0, 0, 0, 0, 0, 4, 136,8, 0, 16, 0, 0, 0, 29, 201,94, 1, - 0, 64, 0, 0, 14, 40, 14, 0, 0, 0, 0, 0, 10, 64, 0, 0, 0, 0, 0, 0, 0, 72, 4, 0, 0, 0, 0, 0, 4, 64, 12, 0, 0, 0, 0, 0, 68, 40, 12, 2, - 0, 32, 2, 0, 16, 1, 4, 0, 0, 0, 0, 0, 17, 16, 8, 0, 0, 0, 0, 0, 22, 32, 30, 2, 0, 0, 0, 0, 17, 73, 20, 1, 0, 0, 2, 0, 5, 80, 36, 0, - 0, 0, 0, 0, 129,9, 24, 0, 0, 0, 0, 0, 12, 0, 0, 2, 16, 0, 0, 0, 1, 65, 16, 0, 0, 96, 8, 0, 20, 5, 4, 0, 0, 0, 0, 0, 5, 8, 10, 2, - 0, 32, 0, 0, 255,255,126,3, 0, 0, 0, 0, 238,191,108,1, 0, 0, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 5, 64, 4, 0, 0, 0, 0, 0, 19, 64, 0, 0, - 0, 0, 0, 0, 72, 64, 0, 2, 0, 0, 0, 0, 0, 72, 8, 0, 0, 0, 0, 0, 4, 26, 18, 0, 0, 0, 0, 0, 128,32, 128,0, 0, 0, 0, 0, 25, 33, 4, 1, - 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 48, 4, 0, 0, 0, 0, 0, 147,121,84, 1, 0, 0, 0, 0, 0, 48, 6, 2, 0, 0, 0, 0, 8, 43, 66, 0, - 0, 0, 0, 0, 113,120,4, 0, 0, 0, 0, 0, 64, 152,40, 0, 0, 0, 0, 0, 0, 32, 36, 2, 0, 32, 0, 0, 123,40, 206,1, 0, 0, 0, 0, 0, 73, 16, 0, - 0, 0, 0, 0, 127,108,44, 0, 0, 0, 0, 0, 18, 64, 4, 0, 0, 0, 0, 0, 81, 65, 8, 0, 0, 0, 0, 0, 3, 16, 12, 0, 0, 0, 0, 0, 19, 73, 28, 1, - 0, 32, 2, 0, 4, 32, 68, 0, 0, 0, 0, 0, 18, 96, 76, 1, 0, 0, 0, 0, 80, 65, 0, 0, 0, 0, 0, 0, 16, 24, 8, 0, 0, 32, 0, 0, 5, 48, 92, 2, - 0, 0, 0, 0, 18, 72, 12, 0, 0, 32, 0, 0, 16, 104,0, 0, 0, 0, 0, 0, 1, 40, 130,0, 0, 112,0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 8, 40, 16, 0, - 0, 0, 0, 0, 17, 73, 70, 1, 0, 0, 0, 0, 198,136,42, 0, 0, 0, 0, 0, 65, 9, 46, 1, 0, 0, 0, 0, 117,104,40, 0, 0, 0, 0, 0, 128,0, 60, 0, - 0, 0, 0, 0, 10, 56, 124,3, 0, 32, 0, 0, 53, 9, 20, 1, 0, 32, 0, 0, 81, 1, 0, 0, 0, 32, 0, 0, 16, 32, 0, 0, 0, 0, 0, 0, 8, 40, 10, 0, - 0, 0, 0, 0, 206,104,94, 2, 0, 0, 0, 0, 4, 64, 4, 2, 0, 0, 0, 0, 37, 111,10, 1, 0, 0, 0, 0, 144,1, 8, 0, 0, 0, 0, 0, 93, 108,44, 2, - 0, 0, 0, 0, 4, 56, 92, 2, 0, 0, 0, 0, 148,100,72, 0, 0, 0, 0, 0, 145,121,86, 1, 0, 0, 0, 0, 64, 32, 0, 1, 0, 0, 0, 0, 88, 40, 6, 2, - 0, 32, 16, 0, 16, 0, 4, 0, 0, 0, 0, 0, 17, 64, 16, 1, 0, 96, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 64, 96, 16, 0, 0, 0, 0, 0, 5, 8, 12, 0, - 0, 0, 0, 0, 128,40, 0, 0, 0, 0, 0, 0, 8, 8, 14, 1, 0, 0, 0, 0, 1, 44, 0, 0, 0, 0, 0, 0, 255,253,93, 1, 0, 0, 0, 0, 78, 56, 54, 2, - 0, 0, 0, 0, 16, 1, 2, 2, 0, 0, 0, 0, 0, 40, 4, 2, 0, 0, 0, 0, 10, 25, 70, 1, 0, 0, 0, 0, 8, 72, 8, 0, 0, 96, 0, 0, 10, 0, 4, 0, - 0, 32, 0, 0, 59, 81, 64, 0, 0, 0, 0, 0, 8, 40, 78, 0, 0, 0, 0, 0, 25, 120,44, 0, 0, 96, 32, 0, 0, 0, 4, 0, 0, 0, 0, 0, 17, 89, 40, 1, - 0, 0, 0, 0, 72, 32, 62, 0, 0, 0, 0, 0, 9, 65, 16, 0, 0, 0, 0, 0, 72, 56, 30, 1, 0, 0, 0, 0, 2, 24, 4, 0, 0, 0, 0, 0, 25, 104,28, 0, - 0, 0, 0, 0, 8, 160,0, 0, 0, 0, 0, 0, 17, 105,6, 0, 0, 0, 0, 0, 64, 40, 64, 0, 0, 0, 0, 0, 16, 42, 6, 0, 0, 0, 0, 0, 129,104,16, 0, - 0, 0, 0, 0, 1, 65, 20, 0, 0, 0, 0, 0, 80, 104,0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 32, 0, 0, 98, 52, 46, 0, 0, 0, 0, 0, 0, 10, 4, 1, - 0, 0, 0, 0, 64, 40, 36, 0, 0, 0, 0, 0, 1, 16, 4, 0, 0, 96, 0, 0, 191,125,126,0, 0, 0, 0, 0, 6, 184,79, 0, 0, 0, 0, 0, 0, 72, 16, 0, - 0, 0, 0, 0, 41, 201,16, 1, 0, 0, 0, 0, 25, 65, 0, 2, 0, 64, 0, 0, 16, 145,0, 1, 0, 0, 0, 0, 77, 40, 6, 1, 0, 0, 0, 0, 21, 0, 4, 2, - 0, 0, 0, 0, 144,129,68, 0, 0, 0, 0, 0, 21, 73, 2, 1, 0, 0, 0, 0, 8, 136,10, 1, 0, 0, 0, 0, 0, 49, 68, 1, 0, 0, 0, 0, 8, 8, 16, 0, - 0, 0, 0, 0, 64, 104,0, 0, 0, 0, 0, 0, 145,64, 0, 0, 0, 0, 0, 0, 84, 41, 0, 2, 0, 0, 0, 0, 152,20, 20, 0, 0, 0, 0, 0, 17, 73, 6, 1, - 0, 0, 0, 0, 111,8, 172,0, 0, 0, 0, 0, 17, 9, 2, 1, 0, 0, 0, 0, 16, 88, 10, 0, 0, 0, 0, 0, 56, 13, 0, 0, 0, 0, 0, 0, 16, 0, 66, 0, - 0, 0, 0, 0, 19, 9, 8, 0, 0, 0, 0, 0, 8, 0, 68, 1, 0, 0, 0, 0, 144,1, 0, 1, 0, 32, 0, 0, 17, 0, 4, 0, 0, 0, 0, 0, 17, 97, 6, 0, - 0, 0, 0, 0, 68, 41, 6, 2, 0, 0, 0, 0, 192,0, 16, 0, 0, 0, 0, 0, 9, 56, 14, 3, 0, 0, 0, 0, 77, 40, 8, 0, 0, 0, 0, 0, 17, 1, 8, 1, - 0, 0, 0, 0, 24, 104,8, 0, 0, 0, 0, 0, 21, 120,92, 0, 0, 0, 0, 0, 1, 32, 14, 1, 0, 0, 0, 0, 17, 65, 0, 2, 0, 64, 0, 0, 215,44, 54, 0, - 0, 128,0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 2, 8, 0, 0, 32, 36, 0, 16, 96, 0, 0, 0, 0, 0, 0, 223,32, 10, 0, - 0, 0, 0, 0, 12, 128,0, 0, 128,8, 1, 0, 119,242,28, 2, 0, 128,0, 0, 2, 0, 130,0, 0, 0, 0, 0, 34, 6, 2, 0, 0, 0, 0, 0, 127,251,190,3, - 0, 0, 0, 0, 0, 32, 22, 0, 0, 0, 0, 0, 40, 8, 6, 0, 0, 0, 0, 0, 149,69, 0, 0, 0, 32, 0, 0, 17, 9, 0, 1, 0, 32, 0, 0, 0, 0, 36, 0, - 0, 0, 0, 0, 19, 91, 28, 1, 0, 0, 0, 0, 10, 32, 6, 1, 0, 0, 0, 0, 16, 1, 6, 0, 0, 0, 0, 0, 1, 0, 8, 2, 0, 0, 0, 0, 7, 36, 20, 0, - 0, 0, 0, 0, 19, 209,20, 0, 0, 0, 0, 0, 16, 96, 4, 0, 0, 0, 0, 0, 4, 136,0, 0, 0, 64, 0, 0, 1, 1, 4, 0, 0, 32, 20, 0, 32, 0, 4, 0, - 0, 0, 0, 0, 93, 65, 12, 0, 0, 0, 0, 0, 0, 16, 8, 2, 0, 0, 0, 0, 0, 68, 16, 0, 0, 0, 0, 0, 21, 97, 22, 0, 0, 0, 0, 0, 0, 32, 50, 0, - 0, 0, 0, 0, 48, 137,36, 0, 0, 0, 0, 0, 1, 0, 12, 2, 0, 0, 0, 0, 8, 152,36, 0, 0, 0, 0, 0, 36, 160,4, 0, 0, 0, 0, 0, 0, 8, 36, 0, - 0, 0, 0, 0, 145,129,12, 0, 0, 0, 0, 0, 0, 160,12, 0, 0, 0, 32, 0, 63, 113,63, 2, 0, 0, 0, 0, 0, 112,38, 0, 0, 0, 0, 0, 79, 112,44, 2, - 0, 0, 0, 0, 0, 96, 28, 0, 0, 0, 0, 0, 5, 65, 4, 0, 0, 0, 0, 0, 1, 8, 8, 0, 0, 0, 0, 0, 0, 32, 10, 2, 0, 0, 0, 0, 1, 4, 8, 1, - 0, 0, 0, 0, 21, 133,12, 0, 0, 0, 0, 0, 1, 225,0, 0, 0, 0, 0, 0, 17, 1, 28, 0, 0, 0, 0, 0, 205,45, 42, 1, 0, 0, 0, 0, 48, 0, 8, 0, - 0, 0, 0, 0, 52, 10, 0, 0, 0, 0, 0, 0, 160,16, 8, 2, 16, 160,2, 0, 215,93, 122,1, 0, 0, 0, 0, 254,255,126,3, 0, 0, 0, 0, 19, 72, 2, 0, - 0, 0, 0, 0, 136,32, 16, 0, 0, 0, 0, 0, 145,68, 0, 0, 0, 0, 0, 0, 2, 8, 2, 0, 0, 32, 0, 0, 154,1, 68, 0, 0, 0, 0, 0, 0, 4, 2, 2, - 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 0, 16, 0, 2, 1, 0, 0, 0, 0, 1, 96, 2, 0, 0, 0, 0, 0, 8, 60, 142,0, 0, 0, 0, 0, 16, 17, 4, 2, - 0, 0, 0, 0, 16, 153,68, 0, 0, 0, 0, 0, 1, 52, 66, 0, 0, 0, 0, 0, 2, 0, 36, 0, 0, 0, 0, 0, 61, 93, 16, 0, 0, 0, 0, 0, 2, 4, 8, 0, - 0, 0, 0, 0, 0, 160,24, 0, 0, 0, 0, 0, 101,0, 8, 0, 0, 0, 0, 0, 18, 8, 0, 1, 0, 0, 0, 0, 19, 65, 0, 0, 0, 0, 0, 0, 0, 32, 80, 0, - 0, 0, 0, 0, 0, 132,4, 0, 0, 0, 0, 0, 59, 233,20, 0, 0, 0, 0, 0, 17, 72, 2, 0, 0, 0, 0, 0, 16, 25, 4, 1, 0, 0, 0, 0, 0, 49, 18, 0, - 0, 32, 0, 0, 17, 121,4, 1, 0, 32, 0, 0, 16, 33, 4, 0, 0, 0, 0, 0, 93, 105,28, 1, 0, 0, 0, 0, 8, 36, 0, 0, 0, 0, 0, 0, 144,64, 0, 1, - 0, 32, 0, 0, 8, 8, 6, 1, 0, 0, 0, 0, 128,0, 32, 0, 0, 0, 0, 0, 17, 233,22, 1, 0, 0, 0, 0, 64, 180,4, 0, 0, 0, 0, 0, 0, 8, 0, 3, - 0, 32, 2, 0, 0, 8, 0, 0, 16, 0, 0, 0, 149,65, 68, 2, 0, 36, 0, 0, 9, 217,22, 0, 0, 32, 0, 0, 16, 9, 4, 0, 0, 0, 0, 0, 145,73, 6, 0, - 0, 0, 0, 0, 8, 8, 18, 0, 0, 0, 0, 0, 20, 40, 0, 0, 0, 0, 0, 0, 2, 0, 12, 3, 0, 0, 0, 0, 27, 253,28, 0, 0, 0, 0, 0, 0, 44, 2, 0, - 0, 0, 0, 0, 17, 73, 16, 1, 0, 0, 0, 0, 0, 32, 3, 0, 0, 0, 1, 0, 127,249,62, 1, 0, 0, 0, 0, 12, 32, 130,0, 0, 0, 0, 0, 32, 96, 12, 2, - 0, 0, 0, 0, 17, 65, 28, 1, 0, 32, 0, 0, 18, 48, 46, 1, 0, 240,41, 0, 16, 64, 76, 0, 0, 240,63, 0, 10, 16, 6, 0, 0, 32, 0, 0, 0, 32, 12, 0, - 0, 0, 0, 0, 16, 73, 64, 0, 0, 32, 0, 0, 144,1, 4, 0, 0, 0, 0, 0, 16, 117,12, 0, 0, 32, 0, 0, 8, 32, 6, 1, 0, 0, 0, 0, 181,89, 94, 0, - 0, 0, 0, 0, 66, 32, 130,0, 0, 0, 0, 0, 8, 40, 2, 0, 0, 0, 0, 0, 2, 11, 12, 0, 0, 0, 0, 0, 189,56, 172,0, 0, 0, 0, 0, 0, 32, 6, 2, - 0, 0, 0, 0, 17, 32, 6, 0, 0, 0, 0, 0, 1, 4, 8, 0, 0, 0, 0, 0, 255,253,127,3, 0, 0, 0, 0, 8, 181,14, 0, 0, 0, 0, 0, 145,65, 84, 0, - 0, 0, 0, 0, 8, 16, 2, 0, 0, 0, 0, 0, 1, 64, 18, 1, 0, 0, 0, 0, 133,68, 0, 0, 0, 32, 4, 0, 18, 217,20, 0, 0, 0, 16, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 6, 188,46, 2, 0, 0, 0, 0, 18, 0, 4, 1, 0, 32, 0, 0, 48, 9, 4, 1, 0, 96, 0, 0, 14, 16, 6, 1, 0, 0, 0, 0, 0, 64, 18, 0, - 0, 0, 0, 0, 41, 0, 4, 0, 0, 0, 0, 0, 0, 12, 2, 0, 0, 0, 0, 0, 49, 25, 12, 1, 0, 240,31, 0, 32, 0, 0, 0, 0, 0, 0, 0, 16, 97, 20, 0, - 0, 0, 0, 0, 81, 97, 0, 0, 0, 0, 0, 0, 2, 33, 18, 0, 0, 0, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 0, 128,72, 0, 0, 0, 0, 0, 0, 168,0, 0, - 0, 0, 0, 0, 23, 253,122,1, 0, 0, 0, 0, 0, 48, 68, 0, 0, 0, 0, 0, 18, 168,0, 0, 0, 0, 0, 0, 32, 4, 0, 0, 0, 0, 0, 0, 53, 8, 12, 0, - 0, 0, 0, 0, 196,0, 32, 0, 0, 0, 0, 0, 34, 16, 100,0, 0, 32, 0, 0, 128,136,0, 0, 0, 32, 0, 0, 16, 8, 0, 0, 0, 0, 0, 0, 147,57, 76, 0, - 0, 0, 0, 0, 17, 17, 16, 0, 0, 32, 0, 0, 146,89, 4, 1, 0, 0, 0, 0, 17, 32, 4, 1, 0, 224,56, 0, 32, 16, 12, 0, 0, 0, 0, 0, 145,32, 74, 0, - 0, 0, 0, 0, 17, 1, 34, 1, 0, 0, 0, 0, 0, 8, 14, 2, 0, 240,7, 0, 0, 16, 12, 3, 0, 0, 0, 0, 18, 33, 4, 1, 0, 0, 0, 0, 2, 48, 8, 0, - 0, 0, 0, 0, 1, 0, 10, 0, 0, 0, 0, 0, 0, 48, 26, 0, 0, 0, 0, 0, 0, 112,0, 0, 0, 0, 0, 0, 255,252,63, 3, 0, 0, 0, 0, 8, 244,38, 1, - 0, 0, 0, 0, 80, 0, 8, 0, 0, 0, 0, 0, 133,76, 16, 0, 0, 32, 0, 0, 64, 40, 4, 0, 0, 240,42, 0, 1, 8, 0, 0, 0, 32, 0, 0, 17, 137,4, 1, - 0, 0, 0, 0, 136,16, 4, 0, 0, 112,5, 0, 16, 129,68, 0, 0, 32, 0, 0, 0, 161,22, 0, 0, 0, 0, 0, 160,52, 62, 0, 0, 96, 0, 0, 40, 8, 12, 1, - 0, 0, 0, 0, 64, 105,64, 0, 0, 0, 0, 0, 17, 4, 4, 0, 0, 0, 0, 0, 29, 205,44, 0, 0, 0, 0, 0, 150,9, 6, 0, 0, 0, 0, 0, 16, 32, 4, 1, - 0, 32, 0, 0, 1, 36, 4, 0, 0, 0, 0, 0, 20, 32, 68, 0, 0, 0, 0, 0, 17, 161,0, 0, 0, 0, 0, 0, 1, 0, 4, 1, 0, 0, 0, 0, 221,237,76, 2, - 0, 32, 0, 0, 12, 16, 28, 0, 0, 0, 0, 0, 0, 8, 64, 0, 0, 0, 0, 0, 33, 64, 0, 1, 0, 32, 0, 0, 0, 96, 4, 0, 0, 0, 0, 0, 8, 56, 28, 0, - 0, 0, 0, 0, 68, 64, 0, 0, 0, 0, 0, 0, 148,217,6, 0, 0, 0, 0, 0, 8, 32, 66, 0, 0, 32, 0, 0, 32, 0, 4, 0, 0, 0, 0, 0, 13, 197,0, 0, - 0, 0, 0, 0, 100,40, 4, 0, 0, 0, 0, 0, 4, 32, 1, 0, 0, 0, 0, 0, 149,249,80, 2, 0, 0, 0, 0, 0, 24, 128,0, 0, 0, 0, 0, 5, 65, 74, 0, - 0, 0, 0, 0, 64, 16, 2, 0, 0, 0, 0, 0, 0, 80, 2, 0, 0, 0, 0, 0, 36, 128,0, 0, 0, 0, 0, 0, 95, 255,127,1, 0, 0, 0, 0, 132,76, 10, 0, - 0, 0, 0, 0, 16, 68, 16, 2, 0, 0, 0, 0, 6, 32, 6, 0, 0, 0, 0, 0, 2, 16, 4, 0, 0, 0, 0, 0, 17, 89, 16, 0, 0, 0, 0, 0, 17, 133,20, 0, - 0, 0, 0, 0, 74, 64, 0, 0, 0, 0, 0, 0, 16, 129,14, 0, 0, 0, 0, 0, 25, 105,16, 2, 0, 0, 0, 0, 1, 64, 20, 0, 0, 0, 0, 0, 0, 64, 4, 2, - 0, 0, 0, 0, 144,1, 16, 2, 0, 0, 0, 0, 92, 41, 8, 0, 0, 0, 0, 0, 153,52, 0, 0, 0, 0, 0, 0, 17, 65, 16, 3, 0, 240,62, 0, 207,191,206,1, - 0, 240,32, 0, 0, 0, 0, 0, 0, 240,7, 0, 0, 0, 0, 0, 0, 32, 0, 0, 85, 121,20, 1, 0, 32, 0, 0, 10, 41, 0, 0, 0, 0, 0, 0, 16, 40, 6, 0, - 0, 0, 0, 0, 27, 1, 4, 0, 0, 0, 0, 0, 20, 64, 0, 0, 0, 32, 0, 0, 17, 96, 4, 0, 0, 32, 0, 0, 17, 65, 4, 0, 0, 32, 0, 0, 40, 168,20, 0, - 0, 0, 0, 0, 12, 32, 0, 0, 0, 0, 0, 0, 4, 0, 24, 0, 0, 0, 0, 0, 8, 128,4, 0, 0, 32, 0, 0, 1, 72, 0, 0, 0, 0, 0, 0, 1, 72, 8, 0, - 0, 0, 0, 0, 223,253,63, 1, 0, 0, 0, 0, 3, 1, 16, 0, 0, 0, 0, 0, 1, 0, 20, 1, 0, 96, 0, 0, 24, 73, 4, 1, 0, 0, 0, 0, 16, 8, 0, 3, - 0, 0, 0, 0, 21, 64, 2, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 3, 152,4, 0, 0, 0, 0, 0, 68, 45, 0, 0, 0, 0, 0, 0, 1, 133,0, 0, - 0, 0, 0, 0, 5, 40, 16, 0, 0, 32, 0, 0, 48, 17, 104,1, 0, 0, 0, 0, 255,248,254,2, 0, 32, 0, 0, 38, 124,38, 0, 0, 0, 0, 0, 36, 65, 0, 0, - 0, 0, 0, 0, 9, 8, 2, 0, 0, 0, 0, 0, 23, 65, 18, 0, 0, 0, 0, 0, 149,65, 4, 0, 0, 0, 0, 0, 0, 72, 0, 1, 0, 0, 0, 0, 4, 32, 68, 0, - 0, 0, 0, 0, 17, 4, 2, 0, 0, 4, 0, 0, 4, 42, 6, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 1, 137,38, 0, 0, 0, 0, 0, 4, 9, 0, 2, - 0, 0, 0, 0, 49, 9, 32, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 19, 85, 0, 0, 0, 0, 0, 0, 93, 101,9, 2, 0, 0, 0, 0, 128,65, 0, 1, - 0, 0, 0, 0, 17, 1, 2, 1, 0, 96, 4, 0, 0, 8, 4, 0, 0, 0, 0, 0, 4, 152,2, 0, 0, 0, 0, 0, 0, 0, 140,0, 0, 0, 0, 0, 36, 168,24, 0, - 0, 0, 0, 0, 132,196,18, 0, 0, 0, 0, 0, 21, 65, 23, 0, 0, 0, 0, 0, 4, 64, 16, 0, 0, 0, 0, 0, 17, 72, 16, 0, 0, 0, 0, 0, 0, 25, 4, 0, - 0, 0, 0, 0, 16, 64, 6, 0, 0, 0, 0, 0, 36, 160,36, 0, 0, 0, 0, 0, 2, 40, 4, 0, 0, 0, 0, 0, 81, 104,0, 0, 0, 0, 0, 0, 128,1, 16, 0, - 0, 0, 0, 0, 21, 236,12, 0, 0, 32, 4, 0, 0, 4, 0, 0, 0, 0, 0, 0, 16, 1, 18, 0, 0, 0, 0, 0, 19, 65, 42, 1, 0, 0, 0, 0, 10, 0, 10, 0, - 0, 0, 0, 0, 86, 32, 0, 2, 0, 32, 0, 0, 2, 8, 76, 0, 0, 0, 0, 0, 46, 24, 4, 0, 0, 0, 0, 0, 21, 1, 32, 0, 0, 0, 0, 0, 20, 8, 8, 0, - 0, 32, 32, 0, 17, 64, 4, 0, 0, 0, 0, 0, 16, 9, 68, 0, 0, 0, 0, 0, 172,12, 130,1, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 4, 0, 32, 2, 0, 0, - 0, 0, 0, 0, 17, 77, 88, 1, 0, 0, 0, 0, 255,189,254,1, 0, 0, 0, 0, 208,64, 16, 0, 0, 0, 0, 0, 2, 48, 2, 0, 0, 0, 0, 0, 24, 16, 32, 0, - 0, 0, 0, 0, 3, 208,4, 0, 0, 0, 0, 0, 76, 37, 14, 0, 0, 0, 0, 0, 130,128,12, 0, 0, 0, 0, 0, 27, 101,6, 1, 0, 0, 0, 0, 0, 48, 12, 1, - 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 46, 96, 12, 0, 0, 0, 0, 0, 129,0, 0, 1, 0, 32, 0, 0, 16, 5, 4, 0, 0, 0, 0, 0, 10, 64, 40, 0, - 0, 0, 0, 0, 146,193,12, 0, 0, 0, 0, 0, 17, 89, 2, 1, 0, 0, 0, 0, 52, 0, 5, 0, 0, 0, 0, 0, 144,64, 12, 0, 0, 0, 0, 0, 76, 32, 4, 0, - 0, 0, 0, 0, 16, 65, 28, 0, 0, 0, 0, 0, 0, 40, 68, 0, 0, 0, 0, 0, 0, 8, 10, 1, 0, 0, 0, 0, 20, 34, 0, 0, 0, 0, 0, 0, 30, 144,76, 0, - 0, 0, 0, 0, 119,249,110,0, 0, 0, 0, 0, 0, 56, 46, 0, 0, 32, 0, 0, 16, 9, 28, 0, 0, 32, 0, 0, 49, 125,100,1, 0, 0, 0, 0, 8, 40, 6, 0, - 0, 0, 0, 0, 32, 4, 46, 0, 0, 0, 0, 0, 4, 0, 12, 2, 0, 0, 0, 0, 16, 97, 0, 0, 0, 32, 0, 0, 12, 176,10, 0, 0, 0, 0, 0, 116,21, 0, 1, - 0, 0, 0, 0, 8, 40, 14, 0, 0, 0, 0, 0, 55, 242,45, 2, 0, 8, 0, 0, 16, 0, 4, 0, 0, 0, 0, 0, 40, 0, 8, 0, 0, 32, 0, 0, 144,64, 12, 1, - 0, 0, 0, 0, 4, 0, 136,0, 0, 0, 8, 0, 16, 65, 4, 0, 0, 0, 0, 0, 85, 5, 8, 0, 0, 0, 0, 0, 17, 17, 4, 1, 0, 0, 0, 0, 2, 128,4, 0, - 0, 0, 0, 0, 144,73, 10, 0, 0, 0, 0, 0, 127,253,127,3, 0, 32, 0, 0, 16, 17, 76, 0, 0, 0, 0, 0, 32, 1, 4, 0, 0, 0, 0, 0, 192,0, 4, 0, - 0, 0, 0, 0, 53, 17, 8, 0, 0, 0, 0, 0, 1, 0, 4, 2, 0, 2, 0, 0, 8, 40, 30, 1, 0, 0, 0, 0, 128,1, 28, 0, 0, 0, 0, 0, 73, 0, 12, 0, - 0, 32, 36, 0, 16, 1, 4, 1, 0, 0, 0, 0, 128,17, 0, 0, 0, 0, 0, 0, 25, 32, 4, 0, 0, 32, 0, 0, 50, 1, 4, 0, 0, 0, 0, 0, 118,54, 174,0, - 0, 0, 0, 0, 150,152,4, 0, 0, 0, 0, 0, 80, 5, 0, 1, 0, 0, 0, 0, 148,0, 8, 0, 0, 0, 0, 0, 11, 48, 10, 0, 0, 0, 0, 0, 109,73, 16, 1, - 0, 0, 1, 0, 178,51, 26, 0, 0, 0, 0, 0, 132,36, 0, 1, 0, 128,0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 32, 2, 8, 0, 0, 0, 0, 0, 2, 0, 1, 0, - 0, 0, 0, 0, 192,4, 12, 0, 0, 68, 1, 0, 255,255,255,3, 0, 0, 0, 0, 204,44, 158,0, 0, 32, 0, 0, 18, 21, 64, 1, 0, 0, 0, 0, 50, 1, 44, 0, - 0, 0, 0, 0, 81, 9, 4, 0, 0, 0, 0, 0, 18, 41, 12, 0, 0, 0, 0, 0, 155,73, 82, 1, 0, 0, 0, 0, 0, 45, 2, 0, 0, 0, 0, 0, 16, 73, 4, 0, - 0, 0, 0, 0, 8, 128,6, 1, 0, 0, 0, 0, 0, 8, 22, 0, 0, 96, 43, 0, 0, 2, 4, 1, 0, 0, 0, 0, 149,68, 26, 0, 0, 0, 0, 0, 4, 33, 0, 0, - 0, 96, 4, 0, 119,185,14, 1, 0, 0, 0, 0, 8, 16, 8, 1, 0, 0, 0, 0, 144,17, 0, 0, 0, 32, 0, 0, 9, 248,14, 2, 0, 0, 0, 0, 57, 121,2, 1, - 0, 128,0, 0, 14, 185,198,1, 0, 0, 0, 0, 52, 56, 4, 0, 0, 0, 0, 64, 0, 0, 4, 0, 0, 48, 0, 0, 10, 16, 0, 0, 0, 0, 0, 0, 40, 40, 186,0, - 0, 0, 0, 0, 128,9, 0, 0, 0, 0, 0, 0, 49, 65, 2, 0, 0, 0, 0, 0, 16, 25, 4, 0, 0, 0, 0, 0, 16, 40, 2, 1, 0, 96, 0, 0, 128,0, 4, 0, - 0, 0, 0, 0, 219,41, 4, 0, 0, 0, 0, 0, 17, 105,2, 0, 0, 0, 0, 0, 67, 32, 4, 0, 0, 0, 0, 0, 6, 8, 0, 0, 0, 0, 0, 0, 16, 80, 2, 0, - 0, 0, 0, 0, 33, 56, 10, 0, 0, 0, 0, 0, 21, 1, 4, 0, 0, 32, 0, 0, 0, 25, 6, 1, 0, 4, 0, 0, 127,253,125,1, 0, 0, 0, 0, 110,249,110,0, - 0, 0, 0, 0, 88, 0, 8, 0, 0, 0, 0, 0, 4, 48, 0, 0, 0, 0, 0, 0, 54, 233,70, 0, 0, 0, 0, 0, 0, 32, 42, 0, 0, 32, 0, 0, 214,120,14, 1, - 0, 0, 0, 0, 129,72, 8, 0, 0, 0, 0, 0, 1, 9, 2, 0, 0, 0, 0, 0, 87, 48, 12, 0, 0, 32, 0, 0, 73, 0, 4, 0, 0, 0, 0, 0, 94, 176,10, 2, - 0, 0, 0, 0, 26, 1, 4, 0, 0, 0, 0, 0, 93, 40, 10, 1, 0, 0, 0, 0, 2, 96, 32, 0, 0, 0, 0, 0, 92, 48, 36, 0, 0, 0, 0, 0, 1, 68, 0, 0, - 0, 0, 0, 0, 81, 1, 68, 0, 0, 32, 0, 0, 0, 64, 96, 0, 0, 0, 0, 0, 4, 177,35, 2, 0, 0, 0, 0, 66, 184,22, 0, 0, 0, 0, 0, 3, 0, 0, 1, - 0, 0, 0, 0, 25, 97, 4, 1, 0, 32, 0, 0, 49, 9, 4, 0, 0, 0, 0, 0, 49, 9, 4, 0, 0, 0, 0, 0, 4, 192,8, 0, 0, 0, 0, 1, 0, 0, 0, 0, - 0, 32, 1, 0, 144,80, 6, 0, 0, 0, 0, 0, 6, 49, 4, 0, 0, 0, 0, 0, 18, 32, 0, 0, 0, 0, 0, 0, 9, 32, 0, 0, 16, 64, 0, 0, 191,249,30, 1, - 0, 0, 0, 0, 4, 40, 14, 0, 0, 0, 0, 0, 17, 65, 28, 0, 0, 32, 0, 0, 1, 1, 12, 0, 0, 0, 0, 0, 81, 1, 0, 0, 0, 64, 0, 0, 95, 105,30, 0, - 0, 0, 0, 0, 36, 1, 4, 0, 0, 0, 0, 0, 12, 44, 141,0, 0, 0, 0, 0, 64, 64, 12, 0, 0, 0, 0, 0, 128,69, 4, 0, 0, 96, 0, 0, 17, 81, 4, 0, - 0, 0, 0, 0, 24, 0, 18, 0, 0, 0, 0, 0, 8, 48, 6, 0, 0, 0, 0, 0, 36, 0, 0, 2, 0, 0, 0, 0, 17, 16, 0, 0, 0, 0, 0, 0, 16, 32, 12, 0, - 0, 0, 0, 0, 16, 16, 12, 0, 0, 0, 0, 0, 17, 17, 0, 0, 0, 0, 0, 0, 32, 64, 8, 0, 0, 0, 0, 0, 17, 136,68, 0, 0, 0, 0, 0, 0, 8, 18, 0, - 0, 0, 0, 0, 4, 96, 13, 0, 0, 0, 0, 0, 24, 8, 130,0, 0, 0, 0, 0, 145,73, 30, 0, 0, 0, 0, 0, 76, 96, 31, 0, 0, 0, 0, 0, 17, 105,4, 0, - 0, 0, 0, 0, 1, 16, 136,0, 0, 0, 0, 0, 21, 48, 0, 0, 0, 0, 0, 0, 16, 1, 24, 0, 0, 0, 0, 0, 2, 64, 32, 0, 0, 0, 0, 0, 127,127,127,3, - 0, 0, 0, 0, 70, 45, 94, 0, 0, 0, 0, 0, 145,73, 18, 0, 0, 0, 0, 0, 4, 32, 40, 0, 0, 0, 0, 0, 9, 161,14, 0, 0, 0, 0, 0, 4, 0, 40, 0, - 0, 0, 0, 0, 81, 81, 4, 0, 0, 0, 0, 0, 4, 24, 18, 0, 0, 0, 0, 0, 17, 65, 18, 1, 0, 0, 0, 0, 0, 56, 6, 0, 0, 0, 0, 0, 52, 48, 8, 0, - 0, 0, 0, 0, 1, 32, 0, 1, 0, 0, 0, 0, 36, 1, 0, 0, 0, 0, 0, 0, 136,26, 70, 1, 0, 0, 0, 0, 2, 9, 0, 0, 0, 0, 0, 0, 12, 0, 14, 0, - 0, 0, 0, 0, 16, 16, 6, 0, 0, 0, 0, 0, 72, 32, 14, 0, 0, 0, 0, 0, 4, 0, 18, 0, 0, 0, 0, 0, 25, 76, 2, 0, 0, 0, 0, 0, 64, 0, 36, 0, - 0, 0, 0, 0, 16, 17, 64, 0, 0, 0, 0, 0, 108,32, 4, 0, 0, 0, 0, 0, 16, 9, 66, 0, 0, 0, 0, 0, 8, 8, 2, 1, 0, 4, 0, 0, 17, 73, 0, 1, - 0, 0, 0, 0, 132,8, 18, 0, 0, 0, 0, 0, 29, 24, 142,1, 0, 0, 0, 0, 4, 96, 32, 0, 0, 32, 0, 0, 1, 8, 12, 1, 0, 0, 0, 0, 52, 160,32, 0, - 0, 0, 0, 0, 0, 41, 10, 0, 0, 0, 0, 0, 4, 40, 50, 0, 0, 0, 0, 0, 8, 33, 8, 0, 0, 32, 0, 0, 0, 65, 8, 1, 0, 0, 0, 0, 24, 0, 64, 1, - 0, 0, 0, 0, 21, 201,24, 0, 0, 0, 0, 0, 4, 35, 11, 0, 0, 0, 0, 0, 17, 65, 32, 0, 0, 0, 0, 0, 17, 145,0, 0, 0, 0, 0, 0, 76, 17, 130,0, - 0, 0, 0, 0, 144,48, 134,0, 0, 0, 0, 0, 0, 33, 2, 0, 0, 0, 0, 0, 80, 65, 16, 0, 0, 0, 0, 0, 32, 129,22, 0, 0, 0, 0, 0, 14, 137,46, 0, - 0, 0, 0, 0, 16, 65, 20, 0, 0, 0, 0, 0, 2, 32, 40, 0, 0, 96, 0, 0, 16, 8, 4, 0, 0, 0, 0, 0, 4, 32, 130,1, 0, 0, 0, 0, 0, 65, 20, 0, - 0, 0, 0, 0, 64, 0, 12, 1, 0, 0, 0, 0, 4, 12, 0, 1, 0, 0, 0, 0, 92, 253,46, 0, 0, 0, 0, 0, 146,17, 92, 1, 0, 96, 2, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 16, 72, 8, 0, 0, 98, 36, 0, 255,125,68, 0, 0, 0, 0, 0, 8, 0, 6, 1, 0, 0, 0, 0, 24, 96, 0, 0, 0, 0, 0, 0, 61, 8, 14, 0, - 0, 0, 0, 0, 17, 128,68, 0, 0, 96, 0, 0, 1, 17, 70, 0, 0, 0, 0, 0, 153,233,30, 1, 0, 0, 0, 0, 8, 184,6, 0, 0, 0, 0, 0, 17, 104,0, 0, - 0, 32, 0, 0, 166,176,4, 1, 16, 0, 0, 0, 16, 0, 8, 0, 0, 0, 0, 0, 4, 9, 66, 0, 0, 0, 0, 0, 127,253,126,3, 0, 0, 0, 0, 140,60, 8, 3, - 0, 0, 0, 0, 0, 41, 8, 0, 0, 0, 0, 0, 128,65, 16, 0, 0, 0, 0, 0, 17, 105,94, 1, 0, 0, 0, 0, 64, 32, 14, 1, 0, 0, 0, 0, 8, 41, 70, 0, - 0, 0, 0, 0, 17, 8, 8, 0, 0, 0, 0, 0, 2, 32, 48, 2, 0, 64, 0, 0, 17, 41, 12, 1, 0, 0, 0, 0, 93, 224,12, 2, 0, 0, 0, 0, 81, 96, 8, 0, - 0, 0, 0, 0, 16, 17, 22, 1, 0, 0, 0, 0, 16, 64, 76, 1, 0, 0, 0, 0, 187,113,84, 1, 0, 0, 0, 0, 9, 11, 14, 1, 0, 0, 0, 0, 0, 9, 20, 1, - 0, 0, 0, 0, 18, 1, 4, 0, 0, 0, 0, 0, 144,4, 0, 0, 0, 0, 0, 0, 0, 56, 8, 2, 0, 32, 0, 0, 24, 8, 46, 0, 0, 4, 0, 0, 16, 65, 22, 0, - 0, 0, 0, 0, 81, 65, 20, 1, 0, 0, 0, 0, 8, 104,10, 0, 0, 0, 0, 0, 77, 105,14, 3, 0, 0, 0, 0, 223,96, 36, 0, 0, 0, 0, 0, 81, 32, 0, 0, - 0, 0, 0, 0, 10, 32, 68, 0, 0, 0, 0, 0, 64, 128,0, 0, 0, 0, 0, 0, 149,65, 0, 0, 0, 0, 0, 0, 17, 105,70, 0, 0, 0, 0, 0, 64, 0, 134,2, - 0, 0, 0, 0, 4, 34, 4, 0, 0, 0, 0, 0, 0, 50, 4, 0, 0, 0, 0, 0, 16, 8, 10, 0, 0, 0, 0, 0, 24, 8, 0, 0, 0, 0, 0, 0, 223,189,76, 1, - 0, 0, 0, 0, 84, 112,8, 0, 0, 32, 0, 0, 72, 168,4, 0, 0, 0, 0, 0, 21, 105,20, 0, 0, 0, 0, 0, 66, 41, 6, 0, 0, 0, 0, 0, 16, 0, 8, 2, - 0, 0, 0, 0, 8, 41, 2, 0, 0, 0, 0, 0, 145,121,30, 1, 0, 0, 0, 0, 1, 40, 6, 1, 0, 0, 0, 0, 19, 89, 2, 1, 0, 0, 0, 0, 0, 32, 70, 0, - 0, 32, 0, 0, 80, 0, 76, 0, 0, 0, 0, 0, 126,169,46, 2, 0, 0, 0, 0, 16, 9, 6, 0, 0, 0, 0, 0, 27, 73, 12, 0, 16, 0, 0, 0, 1, 32, 0, 0, - 0, 0, 0, 0, 1, 0, 32, 0, 0, 0, 0, 0, 4, 1, 12, 0, 0, 0, 0, 0, 0, 88, 68, 0, 0, 0, 0, 0, 16, 89, 4, 0, 0, 16, 0, 0, 25, 73, 6, 1, - 0, 0, 0, 0, 24, 32, 6, 0, 0, 32, 0, 0, 55, 209,78, 0, 0, 32, 0, 0, 2, 16, 68, 0, 0, 0, 0, 0, 16, 72, 4, 0, 16, 0, 0, 0, 8, 0, 14, 0, - 0, 0, 0, 0, 23, 105,46, 1, 0, 0, 0, 0, 144,0, 0, 1, 0, 0, 0, 0, 9, 0, 70, 1, 0, 32, 0, 0, 145,105,70, 1, 0, 0, 0, 0, 9, 112,6, 0, - 0, 0, 0, 0, 145,1, 8, 1, 0, 0, 0, 0, 21, 65, 30, 1, 0, 0, 0, 0, 89, 1, 28, 0, 0, 0, 0, 0, 16, 40, 8, 0, 0, 0, 0, 0, 219,249,6, 0, - 0, 96, 0, 0, 0, 0, 20, 0, 0, 16, 0, 0, 16, 65, 2, 0, 0, 0, 0, 0, 24, 40, 14, 0, 0, 0, 0, 0, 17, 72, 84, 0, 0, 0, 0, 0, 8, 32, 8, 1, - 0, 0, 0, 0, 21, 109,8, 0, 0, 0, 0, 0, 19, 65, 16, 3, 0, 8, 0, 0, 71, 1, 30, 0, 0, 64, 0, 0, 0, 32, 16, 0, 0, 64, 0, 0, 177,115,56, 1, - 0, 0, 0, 0, 111,189,254,3, 0, 0, 0, 0, 71, 9, 12, 0, 0, 0, 0, 0, 21, 68, 2, 0, 0, 32, 0, 0, 152,169,4, 1, 0, 32, 0, 0, 0, 2, 4, 0, - 0, 0, 0, 0, 0, 8, 96, 0, 0, 0, 0, 0, 24, 73, 0, 1, 0, 0, 0, 0, 209,73, 20, 0, 0, 0, 0, 0, 66, 108,0, 0, 0, 32, 0, 0, 145,81, 84, 0, - 0, 0, 0, 0, 18, 144,0, 0, 0, 0, 0, 0, 0, 9, 16, 0, 0, 0, 0, 0, 63, 125,76, 0, 0, 0, 0, 0, 20, 1, 4, 1, 0, 0, 0, 0, 17, 192,4, 0, - 0, 0, 0, 0, 148,4, 4, 0, 0, 32, 0, 0, 24, 1, 0, 0, 0, 0, 0, 0, 96, 32, 4, 0, 0, 0, 0, 0, 8, 33, 6, 1, 0, 0, 0, 0, 168,56, 4, 0, - 0, 0, 0, 0, 36, 96, 12, 0, 0, 0, 0, 0, 16, 1, 0, 3, 0, 96, 17, 0, 174,18, 0, 2, 0, 0, 0, 0, 223,249,127,0, 0, 0, 0, 0, 68, 52, 46, 0, - 0, 32, 0, 0, 16, 129,4, 1, 0, 0, 0, 0, 16, 80, 0, 1, 0, 0, 0, 0, 144,65, 16, 0, 0, 32, 0, 0, 0, 8, 4, 0, 0, 0, 0, 0, 148,0, 0, 1, - 0, 0, 0, 0, 0, 40, 16, 0, 0, 0, 0, 0, 21, 65, 4, 0, 0, 0, 0, 0, 204,172,6, 0, 0, 32, 0, 0, 2, 16, 4, 0, 0, 0, 0, 0, 81, 73, 0, 0, - 0, 0, 0, 0, 16, 0, 68, 0, 0, 0, 0, 0, 16, 128,28, 0, 0, 0, 0, 0, 20, 192,76, 0, 0, 0, 0, 0, 8, 0, 8, 2, 0, 0, 0, 0, 16, 81, 64, 1, - 0, 0, 0, 0, 17, 65, 100,0, 0, 0, 0, 0, 20, 16, 4, 0, 0, 0, 1, 0, 0, 160,0, 0, 0, 0, 0, 0, 95, 252,45, 0, 0, 0, 0, 0, 3, 8, 4, 0, - 0, 0, 0, 0, 144,5, 0, 0, 0, 0, 0, 0, 17, 24, 0, 0, 0, 32, 0, 0, 16, 1, 12, 0, 0, 0, 0, 0, 88, 8, 0, 0, 0, 0, 0, 0, 104,0, 6, 0, - 0, 0, 0, 0, 208,8, 0, 0, 0, 0, 0, 0, 16, 145,4, 0, 0, 0, 0, 0, 84, 68, 0, 0, 0, 0, 0, 0, 53, 217,92, 0, 0, 0, 0, 0, 21, 89, 0, 1, - 0, 0, 0, 0, 34, 128,32, 0, 0, 0, 0, 0, 20, 65, 8, 2, 0, 0, 0, 0, 48, 8, 0, 0, 0, 0, 0, 0, 1, 69, 0, 0, 0, 0, 0, 0, 245,253,255,3, - 0, 0, 0, 0, 0, 36, 12, 0, 0, 0, 0, 0, 148,69, 16, 0, 0, 0, 0, 0, 17, 0, 64, 0, 0, 0, 0, 0, 32, 64, 24, 0, 0, 0, 0, 0, 129,33, 0, 0, - 0, 0, 0, 0, 51, 137,80, 0, 0, 0, 0, 0, 25, 0, 2, 1, 0, 0, 0, 0, 149,71, 85, 1, 0, 0, 0, 0, 2, 32, 4, 0, 0, 0, 0, 0, 0, 52, 0, 0, - 0, 0, 0, 0, 154,125,76, 0, 0, 32, 0, 0, 247,121,74, 0, 0, 0, 0, 0, 149,64, 72, 2, 0, 0, 0, 0, 68, 160,12, 0, 0, 0, 0, 0, 148,64, 0, 0, - 0, 0, 0, 0, 58, 41, 12, 0, 0, 32, 0, 0, 16, 65, 36, 0, 0, 0, 0, 0, 0, 96, 8, 0, 0, 0, 0, 0, 124,185,140,3, 0, 0, 0, 0, 35, 0, 4, 0, - 0, 0, 0, 0, 16, 0, 128,0, 0, 0, 0, 0, 24, 64, 16, 0, 0, 0, 0, 0, 4, 4, 4, 2, 0, 32, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 18, 152,66, 0, - 0, 0, 0, 0, 8, 8, 8, 1, 0, 0, 0, 0, 145,65, 8, 0, 0, 0, 0, 0, 148,1, 4, 0, 0, 0, 0, 0, 8, 32, 0, 2, 0, 0, 0, 0, 27, 193,12, 0, - 0, 0, 0, 0, 64, 160,0, 0, 0, 0, 0, 0, 64, 8, 4, 0, 0, 0, 0, 0, 0, 9, 12, 0, 0, 112,8, 0, 0, 8, 4, 0, 0, 0, 0, 0, 53, 85, 24, 1, - 0, 0, 0, 0, 2, 4, 6, 0, 0, 0, 0, 0, 156,0, 50, 0, 0, 0, 0, 0, 8, 8, 24, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 34, 0, 0, 1, - 0, 0, 0, 0, 255,255,174,3, 0, 0, 0, 0, 8, 32, 30, 0, 0, 0, 0, 0, 51, 65, 22, 0, 0, 0, 0, 0, 21, 40, 12, 0, 0, 0, 0, 0, 0, 64, 12, 0, - 0, 32, 0, 0, 32, 0, 64, 0, 0, 0, 0, 0, 133,69, 48, 0, 0, 0, 0, 0, 32, 24, 10, 2, 0, 0, 0, 0, 25, 51, 64, 0, 0, 0, 0, 0, 10, 40, 46, 2, - 0, 0, 0, 0, 0, 224,32, 0, 0, 0, 0, 0, 17, 25, 4, 1, 0, 0, 0, 0, 1, 0, 6, 2, 0, 0, 0, 0, 151,253,108,0, 0, 0, 0, 0, 8, 32, 10, 1, - 0, 0, 0, 0, 96, 160,44, 0, 0, 0, 0, 0, 8, 144,8, 0, 0, 0, 0, 0, 16, 128,0, 0, 0, 0, 0, 0, 4, 0, 36, 0, 0, 96, 5, 0, 179,249,29, 0, - 0, 0, 0, 0, 17, 73, 2, 1, 0, 0, 0, 0, 64, 16, 4, 0, 0, 0, 0, 0, 129,8, 24, 0, 0, 0, 0, 0, 217,41, 136,1, 0, 0, 0, 0, 36, 32, 0, 0, - 0, 0, 0, 0, 100,32, 0, 0, 0, 32, 4, 0, 160,8, 4, 0, 0, 0, 0, 0, 4, 48, 2, 2, 0, 64, 0, 0, 23, 193,6, 0, 0, 0, 0, 0, 63, 249,110,3, - 0, 0, 0, 0, 6, 16, 8, 0, 0, 0, 0, 0, 9, 40, 12, 1, 0, 0, 0, 0, 21, 112,56, 0, 0, 0, 0, 0, 24, 0, 70, 1, 0, 0, 0, 0, 192,32, 0, 0, - 0, 0, 0, 0, 4, 32, 20, 2, 0, 0, 0, 0, 10, 0, 4, 1, 0, 0, 0, 0, 149,145,92, 0, 0, 0, 0, 0, 17, 49, 64, 1, 0, 0, 0, 0, 183,105,78, 0, - 0, 0, 0, 0, 0, 33, 64, 0, 0, 0, 0, 0, 65, 32, 6, 0, 0, 0, 0, 0, 18, 1, 2, 0, 0, 0, 0, 0, 32, 128,0, 0, 0, 0, 0, 0, 32, 40, 16, 0, - 0, 0, 0, 0, 164,1, 0, 0, 0, 0, 0, 0, 145,9, 4, 1, 0, 0, 0, 0, 5, 17, 0, 2, 0, 32, 0, 0, 18, 0, 8, 3, 0, 0, 0, 0, 128,33, 0, 0, - 0, 0, 0, 0, 129,81, 0, 0, 0, 32, 0, 0, 32, 0, 0, 2, 0, 0, 0, 0, 119,190,78, 2, 0, 32, 0, 0, 14, 241,12, 0, 0, 0, 0, 0, 129,8, 0, 0, - 0, 32, 0, 0, 12, 0, 68, 0, 0, 0, 0, 0, 4, 32, 4, 2, 0, 0, 0, 0, 197,160,10, 0, 0, 0, 0, 0, 16, 0, 1, 0, 0, 0, 0, 0, 16, 69, 0, 0, - 0, 0, 0, 0, 9, 65, 72, 0, 0, 128,0, 0, 144,0, 2, 0, 0, 0, 0, 0, 17, 33, 20, 0, 0, 0, 0, 0, 4, 156,140,0, 0, 0, 0, 0, 0, 69, 0, 0, - 0, 0, 0, 0, 17, 72, 80, 1, 0, 0, 0, 0, 4, 130,2, 0, 0, 0, 0, 0, 0, 73, 4, 0, 0, 0, 0, 0, 0, 37, 8, 0, 0, 0, 0, 0, 17, 69, 0, 1, - 0, 0, 0, 0, 4, 140,6, 0, 0, 0, 0, 0, 0, 36, 68, 0, 16, 244,47, 0, 255,255,126,3, 0, 0, 0, 0, 145,193,20, 1, 0, 0, 0, 0, 236,121,54, 2, - 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 3, 193,0, 0, 0, 0, 0, 0, 72, 34, 8, 0, 0, 0, 0, 0, 68, 16, 8, 0, 0, 0, 0, 0, 128,64, 0, 1, - 0, 0, 0, 0, 144,41, 2, 1, 0, 0, 0, 0, 140,153,100,0, 0, 64, 0, 0, 8, 9, 0, 0, 0, 0, 0, 0, 27, 105,18, 0, 0, 0, 0, 0, 149,197,19, 3, - 16, 96, 0, 0, 25, 73, 30, 1, 16, 224,4, 0, 0, 80, 4, 1, 0, 0, 0, 0, 200,50, 66, 0, 0, 0, 0, 0, 32, 64, 8, 1, 0, 0, 0, 0, 16, 65, 2, 1, - 0, 0, 0, 0, 219,121,82, 0, 0, 0, 0, 0, 21, 121,0, 0, 0, 0, 0, 0, 210,85, 5, 0, 0, 0, 0, 0, 0, 48, 2, 1, 0, 0, 0, 0, 220,59, 47, 2, - 0, 0, 0, 0, 129,104,2, 0, 0, 0, 0, 0, 1, 72, 0, 1, 0, 0, 0, 0, 144,9, 16, 1, 0, 224,0, 0, 8, 16, 4, 0, 0, 16, 0, 0, 17, 65, 20, 0, - 0, 112,32, 0, 128,0, 4, 0, 0, 0, 0, 0, 247,221,30, 3, 0, 0, 0, 0, 8, 25, 3, 0, 0, 0, 0, 0, 4, 0, 2, 1, 0, 144,16, 0, 84, 102,22, 1, - 0, 0, 0, 0, 11, 104,40, 0, 0, 0, 0, 0, 17, 17, 16, 1, 0, 0, 0, 0, 64, 17, 38, 0, 0, 248,16, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 32, 38, 1, - 0, 0, 0, 0, 83, 241,6, 0, 0, 0, 0, 0, 64, 40, 46, 0, 0, 0, 0, 0, 4, 68, 24, 0, 0, 0, 0, 0, 0, 104,70, 0, 0, 0, 0, 0, 21, 72, 6, 0, - 0, 32, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 8, 48, 0, 0, 0, 0, 0, 0, 89, 1, 0, 1, 0, 0, 0, 0, 12, 32, 26, 0, 0, 0, 0, 0, 176,1, 0, 0, - 0, 0, 0, 0, 24, 32, 2, 0, 16, 160,0, 0, 255,127,60, 3, 0, 0, 0, 0, 144,32, 4, 0, 0, 0, 0, 0, 145,65, 0, 3, 0, 40, 0, 0, 169,8, 6, 1, - 0, 0, 0, 0, 49, 65, 18, 1, 0, 0, 0, 0, 132,12, 14, 0, 0, 32, 0, 0, 32, 64, 4, 0, 0, 0, 0, 0, 21, 95, 12, 0, 0, 240,47, 0, 17, 75, 4, 1, - 0, 0, 0, 0, 16, 68, 4, 0, 0, 0, 16, 0, 1, 76, 0, 0, 0, 0, 1, 0, 16, 112,68, 0, 0, 0, 0, 0, 6, 56, 10, 0, 0, 112,0, 0, 74, 16, 4, 0, - 0, 0, 0, 0, 32, 32, 70, 0, 0, 0, 0, 0, 18, 69, 32, 0, 0, 0, 0, 0, 145,65, 16, 2, 0, 0, 0, 0, 129,193,34, 2, 0, 0, 0, 0, 127,255,126,1, - 0, 0, 0, 0, 3, 20, 5, 0, 0, 0, 0, 0, 145,64, 2, 1, 0, 0, 0, 0, 64, 32, 6, 0, 0, 0, 0, 0, 8, 40, 4, 1, 0, 0, 0, 0, 128,32, 8, 0, - 0, 0, 0, 0, 21, 96, 28, 0, 0, 32, 4, 0, 181,127,70, 0, 0, 0, 0, 0, 16, 65, 24, 0, 0, 0, 0, 0, 16, 32, 0, 1, 0, 0, 0, 0, 25, 73, 4, 0, - 0, 0, 0, 0, 4, 32, 20, 0, 0, 0, 0, 0, 196,0, 4, 0, 0, 0, 0, 0, 69, 32, 4, 0, 0, 0, 0, 0, 4, 32, 80, 0, 0, 0, 0, 0, 148,65, 8, 0, - 0, 0, 0, 0, 176,17, 12, 1, 0, 32, 0, 0, 1, 16, 32, 0, 0, 0, 0, 0, 215,85, 12, 0, 0, 0, 0, 0, 19, 37, 72, 0, 0, 96, 0, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 149,101,94, 3, 0, 0, 0, 0, 70, 24, 4, 0, 0, 0, 0, 0, 122,185,14, 2, 0, 0, 0, 0, 24, 0, 10, 0, 0, 0, 0, 0, 0, 0, 12, 1, - 0, 0, 0, 0, 144,0, 2, 0, 0, 32, 0, 0, 25, 97, 26, 1, 0, 0, 0, 0, 0, 104,18, 2, 0, 112,47, 0, 4, 56, 134,1, 0, 0, 0, 0, 1, 128,12, 0, - 0, 0, 0, 0, 93, 104,14, 0, 0, 240,47, 0, 223,223,78, 0, 0, 96, 6, 0, 0, 0, 0, 0, 0, 32, 0, 0, 16, 80, 0, 0, 0, 0, 0, 0, 21, 64, 0, 0, - 0, 32, 0, 0, 16, 64, 36, 0, 0, 0, 0, 0, 91, 109,20, 0, 0, 32, 4, 0, 64, 0, 4, 0, 0, 8, 0, 0, 159,60, 78, 0, 0, 0, 0, 0, 0, 108,0, 0, - 0, 0, 0, 0, 17, 1, 4, 2, 0, 0, 0, 0, 1, 59, 2, 1, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 50, 96, 0, 0, - 0, 128,0, 0, 8, 200,24, 0, 0, 0, 2, 0, 0, 0, 16, 0, 0, 0, 0, 0, 8, 4, 48, 0, 0, 0, 0, 0, 72, 64, 2, 0, 0, 32, 8, 0, 255,255,255,3, - 0, 0, 0, 0, 236,60, 63, 0, 0, 0, 0, 0, 16, 64, 8, 1, 0, 32, 0, 0, 186,152,70, 3, 0, 0, 0, 0, 16, 192,0, 0, 0, 0, 0, 0, 18, 17, 12, 1, - 0, 32, 0, 0, 217,96, 4, 0, 0, 0, 0, 0, 30, 121,14, 1, 0, 0, 0, 0, 128,72, 4, 0, 0, 96, 4, 0, 22, 56, 70, 0, 0, 0, 0, 0, 19, 105,30, 1, - 0, 0, 0, 0, 20, 12, 30, 0, 0, 0, 0, 0, 1, 12, 0, 0, 0, 0, 0, 0, 74, 5, 10, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 17, 56, 14, 1, - 0, 0, 0, 0, 65, 32, 2, 0, 0, 0, 0, 0, 21, 8, 8, 0, 0, 0, 0, 0, 17, 41, 86, 0, 0, 32, 0, 0, 208,0, 0, 1, 0, 0, 0, 0, 5, 0, 28, 0, - 0, 0, 0, 0, 132,9, 0, 1, 0, 0, 0, 0, 32, 64, 4, 0, 0, 0, 0, 0, 192,32, 12, 0, 0, 4, 0, 0, 149,77, 18, 0, 0, 0, 0, 0, 56, 185,14, 1, - 0, 0, 0, 0, 18, 128,0, 0, 0, 0, 0, 0, 24, 32, 8, 0, 0, 0, 0, 0, 0, 1, 18, 0, 0, 0, 0, 0, 10, 88, 34, 0, 0, 0, 0, 0, 13, 185,4, 0, - 0, 96, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 5, 32, 8, 2, 0, 0, 0, 0, 4, 64, 32, 0, 0, 0, 0, 0, 0, 49, 34, 0, 0, 0, 0, 0, 14, 248,20, 0, - 0, 0, 0, 0, 145,17, 4, 0, 0, 0, 0, 0, 17, 5, 0, 0, 0, 0, 0, 0, 140,120,30, 1, 0, 0, 0, 0, 0, 208,0, 0, 0, 0, 0, 0, 32, 96, 32, 0, - 0, 0, 0, 0, 8, 128,130,0, 0, 0, 0, 0, 4, 8, 12, 0, 0, 0, 0, 0, 147,113,18, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 5, 4, 2, 0, - 0, 0, 0, 0, 20, 96, 0, 0, 0, 32, 0, 0, 75, 190,110,2, 0, 32, 0, 0, 31, 137,78, 0, 0, 0, 0, 0, 0, 4, 32, 0, 0, 0, 0, 0, 184,145,0, 0, - 0, 0, 0, 0, 16, 0, 12, 2, 0, 0, 1, 0, 53, 75, 26, 1, 0, 0, 0, 0, 6, 24, 18, 3, 0, 0, 0, 0, 21, 104,2, 0, 0, 0, 0, 0, 14, 0, 4, 0, - 0, 0, 0, 0, 95, 104,2, 0, 0, 0, 0, 0, 16, 96, 22, 0, 0, 0, 0, 0, 88, 16, 2, 0, 0, 0, 0, 0, 0, 33, 24, 1, 0, 0, 0, 0, 68, 4, 0, 0, - 0, 0, 0, 0, 53, 121,18, 0, 0, 0, 0, 0, 88, 32, 22, 0, 0, 0, 0, 0, 17, 104,4, 1, 0, 0, 0, 0, 177,32, 0, 0, 0, 0, 0, 0, 9, 64, 18, 0, - 0, 0, 0, 0, 8, 0, 32, 0, 0, 0, 0, 0, 0, 104,2, 0, 0, 0, 0, 0, 45, 32, 108,2, 0, 0, 0, 0, 33, 64, 4, 0, 0, 0, 0, 0, 0, 33, 0, 2, - 0, 0, 0, 0, 81, 248,2, 1, 0, 0, 0, 0, 17, 32, 38, 1, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 32, 16, 0, 1, 0, 16, 0, 0, 254,124,46, 0, - 0, 0, 0, 0, 129,32, 0, 0, 0, 0, 0, 0, 148,16, 12, 0, 0, 0, 0, 0, 20, 1, 6, 3, 0, 0, 0, 0, 84, 32, 34, 2, 0, 0, 0, 0, 128,97, 4, 0, - 0, 0, 0, 0, 21, 77, 18, 0, 0, 0, 0, 0, 0, 40, 0, 1, 0, 0, 0, 0, 255,253,126,2, 0, 0, 0, 0, 246,249,126,1, 0, 0, 0, 0, 16, 64, 18, 1, - 0, 0, 0, 0, 17, 72, 18, 0, 0, 0, 0, 0, 0, 0, 16, 3, 0, 0, 0, 0, 93, 64, 16, 1, 0, 0, 0, 0, 17, 200,16, 0, 0, 0, 0, 0, 81, 81, 0, 0, - 0, 0, 0, 0, 131,68, 0, 0, 0, 0, 0, 0, 72, 32, 10, 0, 0, 0, 0, 0, 9, 0, 0, 1, 0, 0, 0, 0, 213,252,62, 1, 0, 0, 0, 0, 1, 33, 0, 0, - 0, 0, 0, 0, 71, 120,62, 2, 0, 0, 0, 0, 48, 0, 4, 0, 0, 0, 0, 0, 24, 64, 1, 0, 0, 0, 0, 0, 129,73, 12, 0, 0, 0, 0, 0, 17, 1, 4, 1, - 16, 32, 2, 0, 19, 65, 84, 1, 0, 0, 0, 0, 68, 178,38, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 32, 32, 6, 1, 0, 0, 0, 0, 66, 32, 36, 0, - 0, 0, 0, 0, 113,33, 22, 3, 0, 0, 0, 0, 83, 17, 4, 0, 0, 0, 0, 0, 1, 32, 4, 1, 0, 0, 0, 0, 129,1, 6, 0, 0, 0, 0, 0, 0, 41, 2, 0, - 0, 224,63, 0, 36, 64, 12, 0, 0, 0, 0, 0, 76, 41, 132,2, 0, 0, 0, 0, 5, 65, 0, 0, 0, 0, 0, 0, 28, 0, 4, 0, 0, 0, 0, 0, 23, 255,22, 1, - 0, 0, 0, 0, 64, 45, 30, 1, 0, 0, 0, 0, 21, 5, 14, 3, 0, 0, 0, 0, 16, 65, 6, 1, 0, 0, 0, 0, 89, 104,14, 3, 0, 0, 0, 0, 85, 65, 4, 1, - 0, 0, 0, 0, 5, 64, 20, 0, 0, 0, 0, 0, 93, 44, 30, 0, 0, 0, 0, 0, 132,4, 0, 0, 0, 0, 0, 0, 20, 2, 0, 0, 0, 0, 0, 0, 86, 185,30, 1, - 0, 0, 0, 0, 20, 0, 5, 2, 0, 96, 4, 0, 27, 65, 12, 1, 0, 0, 0, 0, 4, 68, 0, 0, 0, 0, 0, 0, 16, 0, 8, 1, 0, 0, 0, 0, 0, 9, 14, 2, - 0, 48, 0, 0, 255,255,124,3, 0, 0, 0, 0, 48, 136,26, 2, 0, 0, 0, 0, 0, 65, 16, 1, 0, 0, 0, 0, 81, 52, 30, 0, 0, 0, 0, 0, 85, 124,14, 2, - 0, 0, 0, 0, 12, 0, 6, 0, 0, 96, 0, 0, 149,68, 12, 2, 0, 128,57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128,32, 10, 1, 0, 96, 0, 0, 16, 64, 8, 0, - 0, 0, 0, 0, 98, 113,28, 1, 0, 0, 0, 0, 48, 93, 0, 0, 0, 0, 0, 0, 17, 89, 22, 1, 0, 0, 0, 0, 4, 32, 12, 0, 0, 0, 0, 0, 14, 46, 2, 0, - 0, 0, 0, 0, 145,233,30, 0, 0, 0, 0, 0, 12, 73, 22, 2, 0, 0, 0, 0, 17, 17, 20, 0, 0, 0, 0, 0, 12, 32, 74, 1, 0, 0, 0, 0, 20, 160,2, 0, - 0, 0, 0, 0, 0, 168,78, 1, 0, 0, 0, 0, 28, 0, 4, 3, 0, 0, 0, 0, 16, 32, 32, 2, 0, 0, 0, 0, 32, 0, 12, 0, 0, 0, 0, 0, 160,0, 16, 0, - 0, 0, 0, 0, 80, 32, 8, 1, 0, 0, 0, 0, 255,253,254,1, 0, 0, 0, 0, 0, 185,36, 2, 0, 0, 0, 0, 16, 25, 0, 0, 0, 0, 0, 0, 196,60, 50, 2, - 0, 0, 0, 0, 10, 0, 12, 2, 0, 0, 0, 0, 93, 96, 44, 2, 0, 0, 0, 0, 8, 40, 8, 0, 0, 0, 0, 0, 86, 117,52, 1, 0, 0, 0, 0, 19, 1, 4, 0, - 0, 0, 0, 0, 92, 32, 4, 0, 0, 0, 0, 0, 2, 9, 4, 1, 0, 0, 0, 0, 255,255,63, 0, 0, 0, 0, 0, 8, 61, 26, 0, 0, 0, 0, 0, 0, 9, 32, 0, - 0, 0, 0, 0, 12, 64, 8, 0, 0, 0, 0, 0, 68, 48, 2, 0, 0, 0, 0, 0, 16, 1, 42, 0, 0, 0, 0, 0, 32, 96, 0, 0, 0, 0, 0, 0, 17, 249,0, 0, - 0, 0, 0, 0, 0, 1, 82, 3, 0, 0, 0, 0, 77, 24, 6, 1, 0, 0, 0, 0, 16, 0, 48, 0, 0, 0, 0, 0, 0, 195,12, 0, 0, 0, 0, 0, 0, 56, 26, 0, - 0, 0, 0, 0, 6, 144,8, 0, 0, 0, 0, 0, 0, 1, 10, 0, 0, 0, 0, 0, 6, 32, 4, 0, 0, 0, 0, 0, 4, 48, 8, 0, 0, 0, 0, 0, 149,91, 90, 2, - 0, 0, 0, 0, 20, 17, 2, 0, 0, 0, 0, 0, 72, 25, 6, 0, 0, 0, 0, 0, 16, 76, 2, 0, 0, 0, 0, 0, 0, 48, 146,0, 0, 0, 0, 0, 4, 16, 8, 0, - 0, 0, 0, 0, 16, 89, 2, 1, 0, 0, 0, 0, 22, 145,142,0, 0, 0, 0, 0, 89, 73, 2, 0, 0, 0, 0, 0, 0, 45, 22, 2, 0, 0, 0, 0, 4, 12, 16, 0, - 0, 0, 0, 0, 17, 0, 12, 1, 0, 0, 0, 0, 65, 64, 0, 1, 0, 0, 0, 0, 64, 8, 128,0, 0, 0, 0, 0, 1, 42, 2, 1, 0, 0, 0, 0, 2, 65, 0, 0, - 0, 0, 0, 0, 24, 160,28, 1, 0, 0, 0, 0, 21, 108,44, 2, 0, 32, 4, 0, 26, 25, 4, 0, 0, 32, 0, 0, 20, 96, 4, 0, 0, 64, 0, 0, 20, 105,30, 1, - 0, 0, 0, 0, 1, 8, 48, 0, 0, 32, 0, 0, 17, 129,4, 0, 0, 0, 0, 0, 155,65, 20, 1, 0, 0, 0, 0, 17, 40, 14, 1, 0, 0, 0, 0, 16, 0, 6, 1, - 0, 0, 0, 0, 20, 40, 14, 0, 0, 0, 0, 0, 72, 32, 8, 0, 0, 0, 0, 0, 16, 32, 16, 0, 0, 0, 0, 0, 177,64, 4, 2, 0, 0, 0, 0, 205,45, 32, 1, - 0, 0, 0, 0, 2, 16, 0, 2, 0, 0, 0, 0, 2, 16, 8, 0, 0, 0, 0, 0, 128,0, 128,1, 0, 0, 0, 0, 0, 0, 3, 2, 0, 0, 0, 0, 0, 18, 8, 0, - 0, 0, 0, 0, 21, 67, 26, 1, 0, 0, 0, 0, 130,60, 66, 0, 0, 0, 0, 0, 1, 16, 64, 0, 0, 0, 0, 0, 0, 136,32, 0, 0, 0, 0, 0, 32, 104,12, 0, - 0, 0, 0, 0, 255,255,254,3, 0, 0, 0, 0, 94, 252,46, 2, 0, 0, 0, 0, 128,64, 2, 0, 0, 0, 0, 0, 144,96, 2, 0, 0, 240,61, 0, 10, 0, 4, 0, - 0, 0, 0, 0, 81, 101,0, 0, 0, 0, 0, 0, 27, 73, 6, 0, 0, 0, 0, 0, 145,77, 24, 0, 0, 0, 0, 0, 0, 176,6, 0, 0, 0, 0, 0, 12, 24, 6, 1, - 0, 0, 0, 0, 21, 96, 0, 0, 0, 32, 4, 0, 177,89, 84, 1, 0, 0, 0, 0, 0, 40, 6, 1, 0, 32, 0, 0, 128,65, 0, 0, 0, 0, 0, 0, 0, 64, 24, 0, - 0, 0, 0, 0, 93, 107,70, 1, 16, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 238,188,94, 2, 0, 0, 0, 0, 16, 16, 2, 0, 0, 0, 0, 0, 208,0, 4, 0, - 0, 0, 0, 0, 12, 69, 4, 0, 0, 0, 0, 0, 149,153,14, 2, 0, 0, 0, 0, 0, 24, 10, 0, 0, 0, 0, 0, 10, 72, 0, 0, 0, 0, 0, 0, 16, 9, 18, 0, - 0, 0, 0, 0, 16, 96, 2, 1, 0, 0, 0, 0, 219,57, 70, 0, 0, 0, 0, 0, 16, 48, 0, 0, 0, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 0, 13, 216,58, 0, - 0, 0, 0, 0, 0, 1, 50, 0, 0, 96, 0, 0, 0, 137,0, 0, 0, 0, 0, 0, 0, 48, 14, 0, 0, 0, 0, 0, 95, 125,92, 0, 0, 0, 0, 0, 0, 168,26, 0, - 0, 0, 0, 0, 16, 120,12, 1, 0, 0, 0, 0, 70, 152,4, 0, 0, 0, 0, 0, 17, 81, 68, 1, 0, 0, 0, 0, 130,16, 38, 0, 0, 0, 0, 0, 128,32, 6, 1, - 0, 0, 0, 0, 81, 96, 4, 0, 0, 0, 0, 0, 128,0, 4, 2, 0, 0, 0, 0, 4, 8, 8, 2, 0, 0, 0, 0, 19, 221,84, 0, 0, 224,10, 0, 66, 169,30, 2, - 0, 192,32, 0, 0, 0, 0, 0, 0, 128,34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 1, 8, 2, 0, 0, 0, 0, 1, 100,0, 0, 0, 0, 0, 0, 133,1, 4, 0, - 0, 0, 0, 0, 74, 96, 14, 2, 0, 0, 0, 0, 1, 1, 4, 1, 0, 0, 0, 0, 0, 97, 16, 0, 0, 0, 0, 0, 17, 66, 4, 0, 0, 0, 1, 0, 12, 160,146,0, - 0, 0, 33, 0, 9, 0, 0, 0, 0, 0, 0, 0, 48, 8, 4, 0, 0, 0, 0, 0, 221,117,92, 0, 0, 0, 0, 0, 128,178,14, 0, 0, 0, 0, 0, 152,0, 6, 0, - 0, 0, 0, 0, 187,89, 84, 1, 0, 0, 0, 0, 24, 8, 6, 0, 0, 0, 0, 0, 16, 8, 32, 0, 0, 0, 0, 0, 4, 32, 28, 2, 0, 32, 0, 0, 46, 8, 38, 0, - 0, 0, 0, 0, 4, 32, 0, 2, 0, 0, 0, 0, 92, 184,158,0, 0, 0, 0, 0, 16, 33, 0, 1, 0, 0, 0, 0, 28, 128,0, 0, 0, 0, 0, 0, 145,201,14, 0, - 0, 0, 0, 0, 17, 168,2, 0, 0, 0, 0, 0, 8, 17, 0, 0, 0, 0, 0, 0, 221,77, 26, 0, 0, 0, 0, 0, 4, 36, 64, 0, 0, 128,0, 0, 16, 105,164,0, - 0, 8, 0, 0, 1, 1, 4, 1, 0, 0, 1, 0, 130,1, 0, 1, 0, 32, 0, 0, 78, 16, 0, 0, 0, 0, 0, 0, 255,255,31, 0, 0, 0, 0, 0, 106,184,38, 0, - 0, 0, 0, 0, 0, 16, 18, 0, 0, 0, 0, 0, 209,89, 86, 0, 0, 32, 0, 0, 64, 57, 62, 0, 0, 0, 0, 0, 24, 128,8, 0, 0, 0, 0, 0, 1, 48, 15, 0, - 0, 0, 0, 0, 100,0, 0, 0, 0, 0, 0, 0, 17, 113,64, 0, 0, 0, 0, 0, 9, 0, 38, 0, 0, 0, 0, 0, 224,0, 8, 0, 0, 0, 0, 0, 12, 0, 0, 1, - 0, 0, 0, 0, 0, 40, 4, 1, 0, 32, 0, 0, 0, 8, 64, 0, 0, 0, 0, 0, 2, 32, 74, 0, 0, 0, 0, 0, 74, 1, 0, 0, 0, 0, 0, 0, 16, 129,4, 0, - 0, 0, 0, 0, 64, 128,4, 0, 0, 0, 0, 0, 17, 193,24, 0, 0, 0, 0, 0, 12, 48, 2, 0, 0, 0, 0, 0, 8, 176,0, 0, 0, 0, 0, 0, 17, 73, 26, 0, - 0, 0, 0, 0, 40, 40, 4, 0, 0, 0, 0, 0, 32, 56, 0, 0, 0, 0, 0, 0, 6, 0, 8, 0, 0, 0, 0, 0, 133,84, 28, 2, 0, 0, 0, 0, 19, 81, 18, 1, - 0, 0, 0, 0, 17, 73, 176,1, 0, 32, 0, 0, 72, 0, 12, 0, 0, 0, 0, 0, 8, 32, 14, 2, 0, 0, 0, 0, 85, 65, 0, 1, 0, 96, 2, 0, 0, 8, 6, 1, - 0, 0, 0, 0, 1, 67, 0, 0, 0, 0, 0, 0, 18, 64, 32, 0, 0, 32, 0, 0, 8, 8, 0, 0, 0, 64, 0, 0, 0, 8, 2, 0, 0, 8, 0, 0, 253,77, 28, 0, - 0, 0, 0, 0, 0, 2, 128,0, 0, 0, 0, 0, 2, 16, 10, 2, 0, 0, 1, 0, 129,0, 0, 0, 0, 0, 0, 0, 0, 2, 32, 0, 0, 0, 0, 0, 0, 2, 146,0, - 0, 0, 0, 0, 33, 34, 0, 0, 0, 0, 0, 0, 12, 0, 34, 0, 0, 0, 0, 0, 2, 48, 0, 0, 0, 0, 4, 0, 167,65, 52, 1, 0, 0, 0, 0, 16, 3, 0, 1, - 0, 0, 0, 0, 17, 65, 36, 0, 0, 0, 0, 0, 255,255,255,3, 0, 0, 0, 0, 2, 36, 0, 0, 0, 0, 0, 0, 19, 93, 6, 1, 0, 0, 0, 0, 16, 1, 6, 1, - 0, 0, 0, 0, 0, 12, 6, 1, 0, 32, 0, 64, 144,69, 28, 0, 0, 0, 0, 0, 145,9, 94, 1, 0, 32, 0, 0, 17, 67, 68, 0, 0, 0, 0, 0, 89, 65, 70, 1, - 0, 32, 0, 0, 10, 32, 38, 0, 0, 0, 0, 0, 202,152,14, 0, 0, 0, 0, 0, 160,45, 6, 0, 0, 96, 0, 0, 255,248,78, 0, 0, 0, 0, 0, 80, 65, 0, 1, - 0, 32, 0, 0, 128,0, 8, 0, 0, 0, 0, 0, 21, 112,6, 0, 0, 0, 0, 0, 88, 40, 14, 0, 0, 0, 0, 0, 144,69, 24, 0, 0, 0, 0, 0, 255,251,44, 0, - 0, 0, 0, 0, 5, 50, 6, 2, 0, 0, 0, 0, 4, 96, 40, 0, 0, 0, 0, 0, 177,65, 4, 1, 0, 32, 0, 0, 138,0, 4, 0, 0, 0, 0, 0, 8, 32, 2, 1, - 0, 0, 0, 0, 16, 32, 36, 0, 0, 96, 38, 0, 0, 0, 4, 0, 0, 0, 0, 0, 147,245,16, 2, 0, 0, 8, 0, 64, 33, 4, 0, 0, 0, 0, 0, 16, 4, 2, 0, - 0, 0, 4, 0, 10, 37, 6, 0, 0, 0, 0, 0, 5, 96, 8, 0, 0, 0, 0, 0, 81, 65, 21, 1, 0, 0, 0, 0, 69, 68, 5, 0, 0, 32, 0, 0, 1, 69, 16, 0, - 0, 32, 0, 0, 16, 0, 68, 0, 16, 32, 0, 0, 223,127,60, 3, 0, 0, 0, 0, 206,8, 122,1, 0, 32, 0, 0, 8, 64, 4, 0, 0, 0, 0, 0, 192,41, 14, 3, - 0, 0, 0, 0, 1, 72, 4, 0, 0, 0, 0, 0, 245,72, 4, 0, 0, 0, 0, 0, 84, 168,44, 2, 0, 0, 0, 0, 29, 1, 0, 1, 0, 32, 0, 0, 0, 40, 12, 0, - 0, 0, 0, 0, 224,0, 110,0, 0, 0, 0, 0, 0, 64, 48, 0, 0, 0, 0, 0, 8, 68, 0, 0, 0, 0, 1, 0, 253,68, 8, 0, 0, 0, 0, 0, 234,188,14, 2, - 0, 0, 0, 0, 1, 9, 0, 1, 0, 0, 0, 0, 26, 60, 68, 0, 0, 0, 0, 0, 49, 201,4, 0, 0, 0, 0, 0, 136,16, 4, 1, 0, 0, 0, 0, 125,255,110,1, - 0, 0, 0, 0, 24, 57, 8, 2, 0, 0, 0, 0, 17, 48, 10, 1, 0, 0, 0, 0, 93, 96, 12, 0, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 0, 0, 35, 65, 20, 1, - 0, 0, 0, 0, 179,65, 4, 0, 0, 0, 0, 0, 96, 48, 92, 0, 0, 0, 0, 0, 17, 40, 12, 0, 0, 0, 0, 0, 133,81, 0, 0, 0, 0, 0, 0, 149,5, 78, 0, - 0, 0, 0, 0, 149,97, 12, 3, 0, 0, 0, 0, 16, 0, 64, 1, 0, 0, 0, 0, 95, 61, 174,1, 0, 0, 0, 0, 136,18, 12, 0, 0, 0, 0, 0, 48, 9, 4, 0, - 0, 32, 0, 0, 193,9, 0, 0, 0, 0, 0, 0, 19, 48, 8, 0, 0, 0, 0, 0, 128,0, 8, 1, 0, 0, 0, 0, 4, 40, 14, 1, 0, 0, 0, 0, 217,47, 14, 0, - 0, 32, 0, 0, 243,137,94, 1, 0, 0, 0, 0, 0, 1, 40, 0, 0, 0, 0, 0, 19, 65, 8, 1, 0, 4, 16, 0, 89, 203,116,3, 0, 0, 0, 0, 255,189,252,3, - 0, 0, 0, 0, 33, 0, 8, 0, 0, 16, 0, 0, 209,105,30, 0, 0, 0, 0, 0, 0, 112,44, 0, 0, 240,63, 0, 51, 24, 4, 2, 0, 48, 6, 0, 0, 0, 0, 0, - 0, 240,56, 0, 0, 0, 0, 0, 0, 240,2, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 129,36, 0, 0, 0, 0, 0, 20, 68, 16, 0, - 0, 96, 0, 0, 32, 32, 4, 0, 0, 0, 0, 0, 80, 4, 2, 0, 0, 0, 0, 0, 72, 128,0, 0, 0, 0, 0, 0, 154,97, 4, 1, 0, 0, 0, 0, 223,191,252,1, - 0, 0, 0, 0, 48, 41, 4, 0, 0, 96, 0, 0, 87, 73, 76, 1, 0, 0, 0, 0, 16, 80, 4, 0, 0, 0, 0, 0, 26, 8, 12, 0, 0, 0, 0, 0, 4, 96, 8, 0, - 0, 0, 0, 0, 158,32, 4, 0, 0, 0, 0, 0, 17, 25, 0, 1, 0, 32, 0, 0, 16, 49, 6, 0, 16, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 114,184,36, 2, - 0, 0, 0, 0, 8, 0, 38, 0, 0, 0, 0, 0, 18, 0, 12, 0, 0, 0, 0, 0, 17, 36, 4, 0, 0, 0, 0, 0, 17, 9, 68, 1, 0, 0, 0, 0, 0, 129,4, 0, - 0, 0, 0, 0, 140,4, 4, 0, 0, 8, 0, 0, 0, 40, 78, 0, 0, 32, 16, 0, 0, 8, 4, 0, 0, 0, 16, 0, 214,253,126,3, 0, 0, 0, 0, 194,64, 16, 0, - 0, 0, 0, 0, 81, 5, 0, 0, 0, 0, 0, 0, 2, 32, 12, 1, 0, 0, 0, 0, 10, 205,4, 2, 0, 0, 0, 0, 16, 69, 12, 0, 0, 0, 0, 0, 66, 1, 4, 0, - 0, 0, 0, 0, 222,189,62, 2, 0, 0, 0, 0, 144,16, 0, 0, 0, 0, 0, 0, 97, 1, 4, 0, 0, 0, 4, 0, 215,56, 68, 0, 0, 32, 0, 0, 16, 0, 12, 0, - 0, 0, 0, 0, 4, 1, 28, 0, 0, 0, 0, 0, 59, 57, 68, 0, 0, 0, 8, 0, 137,216,8, 0, 0, 0, 0, 0, 148,44, 130,1, 0, 0, 0, 0, 16, 2, 0, 1, - 0, 0, 0, 0, 255,253,239,3, 0, 0, 0, 0, 9, 9, 4, 0, 0, 0, 0, 0, 151,105,22, 3, 0, 0, 0, 0, 4, 41, 6, 1, 0, 0, 0, 0, 5, 10, 6, 1, - 0, 0, 0, 0, 21, 104,28, 0, 0, 0, 0, 0, 0, 33, 118,0, 0, 0, 0, 0, 4, 0, 96, 0, 0, 0, 0, 0, 4, 1, 1, 0, 0, 0, 0, 0, 149,76, 10, 0, - 0, 32, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 97, 4, 1, 0, 0, 0, 0, 0, 49, 10, 0, 0, 0, 0, 0, 0, 32, 96, 0, 0, 32, 0, 0, 146,153,76, 1, - 0, 32, 0, 0, 0, 64, 64, 0, 0, 0, 0, 0, 16, 1, 28, 0, 0, 0, 0, 0, 89, 57, 20, 3, 0, 96, 4, 0, 4, 60, 6, 0, 0, 0, 0, 0, 5, 36, 0, 0, - 0, 0, 0, 0, 6, 57, 78, 1, 0, 0, 0, 0, 25, 68, 68, 0, 0, 0, 0, 0, 0, 68, 6, 0, 0, 0, 0, 0, 49, 97, 26, 0, 0, 0, 0, 0, 19, 121,16, 1, - 0, 0, 0, 0, 16, 12, 10, 1, 0, 0, 0, 0, 201,81, 82, 0, 0, 0, 0, 0, 0, 49, 6, 0, 0, 0, 0, 0, 64, 44, 12, 0, 0, 0, 0, 0, 145,9, 0, 0, - 0, 0, 0, 0, 64, 36, 6, 0, 0, 176,0, 0, 10, 56, 14, 1, 0, 128,0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 31, 93, 80, 1, - 0, 0, 0, 0, 4, 36, 10, 1, 0, 0, 0, 0, 16, 20, 0, 1, 0, 0, 0, 0, 9, 32, 6, 0, 0, 0, 0, 0, 59, 221,0, 0, 0, 0, 0, 0, 64, 33, 6, 1, - 0, 0, 0, 0, 51, 72, 4, 0, 0, 0, 0, 0, 16, 5, 0, 1, 0, 0, 0, 0, 144,9, 12, 1, 0, 0, 4, 0, 255,253,126,3, 0, 0, 0, 0, 192,22, 96, 1, - 0, 64, 0, 0, 72, 16, 4, 0, 0, 0, 0, 0, 16, 96, 0, 1, 0, 0, 0, 0, 65, 0, 32, 1, 0, 0, 0, 0, 0, 8, 5, 0, 0, 0, 0, 0, 192,16, 96, 0, - 0, 0, 0, 0, 66, 8, 0, 0, 0, 0, 0, 0, 64, 32, 32, 0, 0, 0, 0, 0, 0, 81, 32, 0, 0, 0, 0, 0, 181,81, 72, 0, 0, 0, 0, 0, 16, 72, 2, 2, - 0, 0, 0, 0, 8, 176,4, 0, 0, 0, 0, 0, 17, 201,18, 0, 0, 32, 0, 0, 64, 0, 14, 1, 0, 0, 0, 0, 4, 0, 134,0, 0, 0, 0, 0, 255,253,94, 1, - 0, 0, 0, 0, 14, 61, 12, 2, 0, 0, 0, 0, 16, 168,142,0, 0, 0, 0, 0, 85, 96, 4, 0, 0, 0, 0, 0, 8, 8, 0, 1, 0, 0, 0, 0, 4, 168,20, 0, - 0, 0, 0, 0, 4, 72, 8, 0, 0, 0, 0, 0, 149,69, 28, 2, 0, 0, 0, 0, 2, 36, 8, 0, 0, 0, 0, 0, 0, 44, 8, 0, 0, 0, 0, 0, 18, 81, 0, 1, - 0, 96, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 148,5, 14, 1, 0, 32, 0, 0, 16, 81, 0, 1, 0, 0, 0, 0, 9, 65, 0, 0, 0, 0, 0, 0, 25, 89, 0, 1, - 0, 0, 0, 0, 32, 4, 32, 0, 0, 0, 0, 0, 64, 32, 34, 0, 0, 0, 0, 0, 1, 36, 0, 0, 0, 0, 0, 0, 127,61, 14, 0, 0, 0, 0, 0, 144,4, 16, 0, - 0, 0, 0, 0, 8, 33, 142,0, 0, 96, 0, 0, 8, 0, 4, 0, 0, 0, 0, 0, 17, 68, 128,0, 0, 0, 0, 0, 53, 205,10, 0, 0, 0, 0, 0, 17, 73, 208,0, - 0, 0, 0, 0, 25, 32, 16, 0, 0, 0, 0, 0, 8, 12, 0, 0, 0, 0, 0, 0, 72, 4, 66, 0, 0, 0, 0, 0, 2, 4, 2, 0, 0, 0, 0, 0, 0, 97, 0, 0, - 16, 228,38, 0, 255,255,255,3, 0, 0, 0, 0, 224,88, 0, 0, 0, 0, 0, 0, 0, 128,0, 2, 0, 0, 2, 0, 126,188,62, 3, 0, 0, 0, 0, 88, 1, 4, 1, - 0, 224,46, 0, 16, 112,12, 0, 0, 112,2, 0, 0, 64, 8, 0, 0, 0, 0, 0, 25, 9, 0, 1, 0, 0, 0, 0, 249,185,110,1, 0, 0, 0, 0, 136,32, 0, 0, - 0, 0, 0, 0, 216,73, 4, 1, 0, 128,0, 0, 144,1, 4, 0, 0, 0, 0, 0, 128,9, 4, 0, 0, 32, 0, 0, 51, 24, 69, 1, 0, 0, 0, 0, 153,77, 8, 1, - 0, 0, 0, 0, 8, 24, 4, 1, 0, 8, 0, 0, 210,217,102,0, 0, 0, 0, 0, 10, 40, 64, 0, 0, 32, 0, 0, 16, 16, 0, 0, 0, 32, 0, 0, 64, 130,2, 0, - 0, 0, 0, 0, 149,209,4, 0, 0, 96, 4, 0, 17, 32, 2, 0, 0, 0, 0, 0, 27, 105,6, 1, 0, 0, 0, 0, 12, 32, 18, 1, 0, 0, 0, 0, 17, 1, 68, 1, - 0, 0, 0, 0, 0, 41, 6, 1, 0, 0, 0, 0, 146,8, 78, 0, 0, 0, 0, 0, 128,192,8, 0, 0, 0, 0, 0, 1, 40, 4, 0, 0, 0, 0, 0, 149,125,92, 2, - 0, 0, 0, 0, 64, 56, 32, 0, 0, 0, 0, 0, 72, 32, 0, 2, 0, 0, 1, 0, 20, 9, 4, 0, 0, 0, 0, 0, 179,89, 6, 0, 0, 0, 0, 0, 8, 56, 12, 0, - 0, 0, 0, 0, 2, 72, 0, 0, 0, 96, 32, 0, 8, 0, 4, 0, 0, 0, 0, 0, 34, 56, 78, 2, 0, 0, 0, 0, 16, 65, 16, 1, 0, 0, 0, 0, 29, 0, 5, 0, - 0, 0, 0, 0, 24, 176,2, 0, 0, 36, 0, 0, 223,121,126,3, 0, 224,4, 0, 2, 0, 4, 0, 0, 0, 0, 0, 0, 60, 134,1, 0, 0, 0, 0, 18, 25, 68, 0, - 0, 0, 0, 0, 160,0, 12, 0, 0, 0, 0, 0, 151,25, 64, 1, 0, 0, 0, 0, 172,24, 78, 0, 0, 0, 0, 0, 119,36, 14, 2, 0, 0, 0, 0, 0, 5, 8, 0, - 0, 0, 0, 0, 67, 64, 0, 0, 0, 0, 0, 0, 65, 16, 16, 0, 0, 0, 0, 0, 12, 32, 4, 0, 0, 4, 0, 0, 17, 64, 8, 0, 0, 0, 0, 0, 5, 8, 8, 0, - 0, 96, 0, 0, 20, 65, 4, 0, 0, 32, 0, 0, 0, 64, 36, 0, 0, 0, 0, 0, 28, 236,78, 1, 0, 0, 0, 0, 1, 12, 4, 0, 0, 0, 0, 0, 0, 69, 4, 0, - 0, 0, 0, 0, 51, 9, 26, 1, 0, 0, 0, 0, 17, 105,18, 1, 0, 0, 0, 0, 4, 48, 2, 0, 0, 0, 0, 0, 84, 32, 0, 0, 0, 0, 0, 0, 243,121,114,1, - 0, 0, 0, 0, 147,249,6, 0, 0, 0, 0, 0, 10, 48, 10, 0, 0, 0, 0, 0, 8, 8, 8, 2, 0, 0, 0, 0, 4, 57, 46, 0, 0, 32, 0, 0, 0, 68, 0, 0, - 0, 0, 0, 0, 64, 16, 12, 0, 0, 0, 0, 0, 144,121,30, 0, 0, 0, 0, 0, 72, 48, 0, 0, 0, 0, 0, 0, 16, 21, 0, 1, 0, 0, 0, 0, 208,29, 0, 0, - 0, 0, 0, 0, 34, 0, 0, 2, 0, 0, 0, 0, 254,62, 46, 0, 0, 0, 0, 0, 146,121,4, 0, 0, 0, 0, 0, 18, 16, 0, 0, 0, 0, 0, 0, 3, 24, 0, 0, - 0, 0, 0, 0, 145,96, 8, 0, 0, 0, 0, 0, 32, 0, 36, 0, 0, 0, 16, 0, 178,1, 4, 1, 0, 0, 0, 0, 16, 120,0, 0, 0, 0, 0, 0, 27, 0, 8, 0, - 0, 0, 0, 0, 17, 48, 2, 0, 0, 0, 0, 0, 253,64, 76, 0, 0, 0, 0, 0, 1, 129,8, 0, 0, 0, 0, 0, 20, 9, 0, 0, 0, 0, 0, 0, 151,121,12, 0, - 0, 0, 0, 0, 131,16, 12, 2, 0, 0, 0, 0, 145,32, 0, 2, 0, 0, 0, 0, 219,61, 76, 0, 0, 128,2, 0, 255,255,127,3, 0, 0, 0, 0, 206,177,76, 3, - 0, 0, 0, 0, 128,0, 22, 2, 0, 0, 0, 0, 0, 13, 12, 0, 0, 0, 0, 0, 111,244,118,1, 0, 0, 0, 0, 0, 48, 4, 2, 0, 0, 0, 0, 16, 65, 6, 0, - 0, 32, 0, 0, 29, 184,76, 0, 0, 0, 0, 0, 27, 69, 0, 0, 0, 0, 0, 0, 16, 81, 15, 0, 0, 0, 0, 0, 8, 2, 6, 0, 0, 0, 0, 0, 253,114,140,3, - 0, 0, 0, 0, 81, 64, 8, 0, 0, 0, 0, 0, 145,65, 12, 2, 0, 32, 0, 0, 2, 40, 34, 0, 0, 32, 0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 149,65, 12, 0, - 0, 0, 0, 0, 29, 113,70, 3, 0, 0, 0, 0, 234,48, 14, 1, 0, 32, 0, 0, 11, 64, 68, 0, 0, 0, 0, 0, 10, 20, 12, 1, 0, 0, 0, 0, 16, 0, 18, 1, - 0, 0, 0, 0, 53, 224,12, 0, 0, 0, 0, 0, 146,0, 76, 0, 0, 0, 0, 0, 16, 64, 64, 0, 0, 0, 0, 0, 6, 0, 16, 0, 0, 0, 0, 0, 2, 80, 72, 0, - 0, 0, 0, 0, 147,65, 69, 0, 0, 0, 0, 0, 172,161,19, 1, 0, 0, 0, 0, 147,245,72, 1, 0, 0, 0, 0, 16, 8, 4, 1, 0, 0, 0, 0, 1, 32, 98, 1, - 0, 0, 0, 0, 17, 96, 2, 0, 0, 0, 0, 0, 144,65, 2, 2, 0, 0, 0, 0, 13, 16, 4, 0, 0, 0, 0, 0, 0, 32, 6, 1, 0, 0, 0, 0, 1, 0, 28, 0, - 0, 32, 44, 0, 128,128,4, 0, 0, 0, 0, 0, 145,65, 0, 1, 0, 0, 0, 0, 19, 65, 0, 1, 0, 0, 0, 0, 255,221,30, 3, 0, 0, 0, 0, 12, 185,6, 1, - 0, 0, 0, 0, 5, 64, 16, 0, 0, 128,0, 0, 17, 73, 30, 0, 0, 0, 0, 0, 69, 4, 2, 0, 0, 0, 0, 0, 8, 8, 2, 2, 0, 0, 0, 0, 64, 9, 12, 1, - 0, 0, 0, 0, 0, 16, 10, 0, 0, 0, 0, 0, 8, 8, 20, 0, 0, 0, 0, 0, 64, 40, 4, 0, 0, 0, 0, 0, 5, 40, 14, 0, 0, 0, 0, 0, 24, 1, 0, 1, - 0, 0, 0, 0, 65, 9, 28, 1, 0, 0, 0, 0, 68, 44, 14, 0, 0, 96, 0, 0, 3, 0, 4, 0, 0, 112,0, 0, 0, 42, 18, 0, 0, 0, 0, 0, 8, 9, 12, 0, - 0, 0, 0, 0, 20, 0, 12, 0, 0, 0, 0, 0, 64, 36, 10, 0, 0, 0, 0, 0, 177,73, 14, 0, 0, 0, 0, 0, 0, 8, 66, 0, 0, 0, 0, 0, 128,8, 64, 0, - 0, 0, 0, 0, 0, 12, 4, 0, 0, 0, 0, 0, 6, 48, 0, 0, 0, 0, 0, 0, 145,77, 18, 1, 0, 0, 0, 0, 0, 152,22, 0, 0, 0, 0, 0, 16, 17, 2, 0, - 0, 0, 0, 0, 8, 16, 18, 0, 0, 0, 0, 0, 0, 64, 16, 1, 0, 0, 0, 0, 81, 201,22, 3, 0, 0, 0, 0, 13, 16, 2, 0, 0, 32, 0, 0, 2, 8, 4, 0, - 0, 0, 0, 0, 5, 32, 40, 0, 0, 0, 0, 0, 76, 176,78, 0, 0, 0, 0, 0, 160,128,4, 0, 0, 0, 0, 0, 9, 57, 6, 0, 0, 0, 0, 0, 17, 0, 0, 3, - 0, 0, 0, 0, 9, 16, 6, 0, 0, 0, 0, 0, 187,57, 87, 0, 0, 0, 0, 0, 72, 0, 2, 0, 0, 0, 0, 0, 2, 56, 14, 0, 0, 0, 0, 0, 130,28, 4, 0, - 0, 0, 0, 0, 0, 80, 8, 0, 0, 224,0, 0, 24, 0, 4, 0, 0, 0, 0, 0, 162,20, 78, 1, 0, 32, 0, 0, 0, 16, 64, 0, 0, 0, 0, 0, 77, 0, 196,0, - 0, 96, 0, 0, 0, 0, 8, 0, 0, 32, 0, 0, 17, 17, 4, 0, 0, 0, 0, 0, 64, 8, 36, 0, 0, 0, 0, 0, 4, 4, 8, 0, 0, 0, 0, 0, 68, 56, 30, 0, - 0, 0, 0, 0, 1, 65, 2, 0, 0, 0, 0, 0, 68, 8, 1, 0, 0, 32, 0, 0, 0, 0, 12, 2, 0, 0, 0, 0, 148,89, 88, 2, 0, 0, 0, 0, 0, 56, 0, 1, - 0, 0, 0, 0, 145,73, 70, 2, 0, 0, 0, 0, 2, 33, 0, 0, 0, 96, 0, 0, 22, 185,12, 0, 0, 0, 0, 0, 8, 161,2, 0, 0, 0, 0, 0, 17, 164,4, 0, - 0, 0, 0, 0, 17, 64, 6, 0, 0, 0, 0, 0, 100,101,44, 0, 0, 0, 0, 0, 149,201,124,0, 0, 0, 0, 0, 0, 16, 26, 0, 0, 0, 0, 0, 0, 16, 36, 0, - 0, 0, 0, 0, 108,184,14, 2, 0, 0, 0, 0, 4, 64, 8, 0, 0, 0, 0, 0, 4, 40, 129,0, 0, 0, 0, 0, 128,8, 12, 0, 0, 0, 0, 0, 0, 32, 12, 2, - 0, 0, 0, 0, 8, 0, 20, 0, 0, 0, 0, 0, 137,168,44, 0, 0, 0, 0, 0, 16, 144,4, 0, 0, 0, 0, 0, 255,253,254,3, 0, 0, 0, 0, 76, 36, 14, 2, - 0, 0, 0, 0, 16, 81, 24, 0, 0, 0, 0, 0, 49, 121,0, 0, 0, 0, 0, 0, 15, 37, 108,2, 0, 0, 0, 0, 128,0, 2, 2, 0, 0, 0, 0, 33, 64, 16, 0, - 0, 0, 0, 0, 92, 100,173,0, 0, 32, 36, 0, 149,4, 4, 0, 0, 0, 0, 0, 17, 1, 64, 0, 0, 0, 0, 0, 2, 32, 66, 0, 0, 128,0, 0, 17, 65, 4, 2, - 0, 0, 0, 0, 200,57, 12, 0, 0, 0, 0, 0, 0, 32, 8, 2, 0, 0, 0, 0, 8, 0, 74, 0, 0, 0, 0, 0, 149,132,8, 0, 0, 0, 0, 0, 16, 24, 0, 2, - 0, 0, 0, 0, 0, 36, 8, 0, 0, 0, 0, 0, 192,1, 20, 0, 0, 64, 0, 0, 255,253,79, 2, 0, 0, 0, 0, 0, 40, 82, 0, 0, 0, 0, 0, 40, 186,10, 0, - 0, 32, 0, 0, 24, 16, 4, 0, 0, 0, 0, 0, 84, 128,6, 0, 0, 0, 0, 0, 19, 17, 2, 0, 0, 0, 0, 0, 18, 40, 42, 0, 0, 0, 0, 0, 8, 64, 2, 0, - 0, 0, 0, 0, 4, 129,8, 2, 0, 0, 0, 0, 2, 16, 32, 0, 0, 0, 0, 0, 19, 92, 0, 0, 0, 0, 0, 0, 0, 144,2, 0, 0, 0, 0, 0, 25, 65, 18, 0, - 0, 0, 0, 0, 16, 40, 66, 0, 0, 0, 0, 0, 0, 129,8, 0, 0, 0, 0, 0, 17, 105,2, 1, 0, 0, 0, 0, 76, 41, 2, 0, 0, 0, 0, 0, 4, 42, 2, 1, - 0, 0, 0, 0, 0, 96, 10, 0, 0, 196,0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 97, 22, 0, 0, 4, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 2, 56, 50, 0, - 0, 0, 0, 0, 145,125,0, 0, 0, 0, 0, 0, 32, 17, 2, 1, 0, 0, 0, 0, 0, 168,135,0, 0, 0, 0, 0, 84, 32, 128,0, 0, 0, 0, 0, 149,73, 82, 1, - 0, 0, 0, 0, 14, 57, 14, 0, 0, 0, 0, 0, 114,168,38, 1, 0, 0, 0, 0, 195,72, 4, 0, 0, 0, 0, 0, 4, 164,2, 1, 0, 8, 0, 0, 181,109,62, 3, - 0, 0, 0, 0, 0, 40, 72, 0, 0, 4, 0, 0, 144,1, 4, 0, 0, 0, 0, 0, 17, 113,2, 1, 0, 32, 0, 0, 16, 64, 0, 0, 0, 0, 0, 0, 16, 33, 12, 0, - 0, 0, 0, 0, 144,112,5, 0, 16, 0, 0, 0, 2, 41, 64, 0, 0, 0, 0, 0, 127,188,238,0, 0, 0, 0, 0, 0, 36, 130,0, 0, 0, 0, 0, 21, 64, 16, 0, - 0, 0, 0, 0, 145,1, 8, 0, 0, 224,3, 0, 19, 65, 8, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 238,184,44, 2, 0, 8, 0, 0, 17, 0, 0, 0, - 0, 0, 0, 0, 20, 192,8, 0, 0, 32, 0, 0, 16, 68, 8, 0, 0, 0, 0, 0, 145,64, 6, 0, 0, 0, 8, 0, 211,75, 2, 0, 0, 0, 0, 0, 140,168,14, 0, - 0, 32, 0, 0, 92, 69, 4, 0, 0, 0, 0, 0, 4, 96, 4, 2, 0, 0, 0, 0, 0, 68, 40, 0, 0, 0, 0, 0, 48, 137,12, 0, 0, 0, 0, 0, 32, 9, 20, 0, - 16, 0, 0, 0, 223,57, 79, 1, 0, 0, 0, 0, 128,64, 12, 2, 0, 32, 0, 0, 10, 80, 72, 0, 0, 0, 0, 0, 1, 3, 0, 1, 0, 0, 0, 0, 29, 40, 12, 0, - 0, 32, 4, 0, 8, 72, 4, 0, 0, 0, 0, 0, 4, 44, 2, 1, 0, 0, 0, 0, 1, 0, 48, 0, 0, 0, 0, 0, 19, 65, 73, 1, 0, 128,0, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 183,249,153,0, 0, 0, 0, 0, 68, 56, 6, 0, 0, 0, 0, 0, 16, 136,6, 0, 0, 0, 0, 0, 68, 24, 14, 0, 0, 0, 0, 0, 80, 8, 12, 0, - 0, 0, 0, 0, 76, 160,14, 0, 0, 0, 0, 0, 12, 40, 2, 0, 0, 0, 0, 0, 8, 1, 6, 0, 0, 96, 0, 0, 16, 73, 64, 0, 0, 0, 0, 0, 8, 0, 28, 0, - 0, 160,0, 0, 76, 250,44, 0, 0, 0, 0, 0, 10, 144,0, 0, 0, 0, 0, 0, 87, 184,30, 0, 0, 0, 0, 0, 110,137,70, 0, 0, 0, 0, 0, 0, 193,8, 0, - 0, 0, 0, 0, 25, 153,2, 2, 0, 0, 0, 0, 4, 12, 3, 0, 64, 244,54, 0, 255,255,255,3, 0, 192,0, 0, 22, 0, 0, 0, 0, 64, 3, 0, 32, 0, 0, 0, - 0, 16, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 255,191,255,3, 0, 0, 0, 0, 51, 73, 18, 1, 0, 0, 0, 0, 17, 96, 20, 0, 0, 0, 0, 0, 0, 9, 0, 2, - 0, 0, 0, 0, 4, 4, 1, 2, 0, 0, 0, 0, 149,5, 28, 0, 0, 64, 0, 0, 42, 120,14, 1, 0, 0, 0, 0, 18, 65, 20, 0, 0, 0, 0, 0, 25, 105,6, 0, - 0, 0, 0, 0, 8, 41, 6, 0, 0, 0, 0, 0, 132,32, 14, 0, 0, 0, 0, 0, 1, 33, 0, 1, 0, 0, 0, 0, 81, 105,20, 0, 0, 0, 0, 0, 1, 8, 5, 0, - 0, 0, 0, 0, 27, 43, 6, 1, 0, 0, 0, 0, 138,4, 72, 0, 0, 0, 0, 0, 93, 104,174,2, 0, 0, 0, 0, 24, 73, 28, 0, 0, 0, 0, 0, 247,185,126,1, - 0, 0, 0, 0, 5, 64, 8, 0, 0, 96, 0, 0, 32, 8, 4, 1, 0, 0, 0, 0, 8, 160,6, 0, 0, 0, 0, 0, 223,93, 124,2, 0, 0, 0, 0, 164,33, 6, 0, - 0, 16, 0, 0, 0, 32, 2, 0, 0, 240,15, 0, 16, 1, 6, 0, 0, 0, 0, 0, 40, 64, 0, 0, 0, 0, 0, 0, 0, 32, 14, 1, 0, 0, 0, 0, 130,0, 12, 0, - 0, 8, 32, 0, 27, 65, 20, 0, 0, 0, 0, 0, 68, 0, 192,0, 0, 32, 0, 0, 65, 0, 4, 0, 0, 0, 0, 0, 22, 32, 4, 0, 0, 0, 0, 0, 0, 160,80, 0, - 0, 224,0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 128,8, 8, 0, 0, 0, 0, 0, 16, 65, 20, 2, 0, 0, 0, 0, 19, 65, 16, 1, 0, 0, 0, 0, 69, 40, 12, 0, - 0, 48, 2, 0, 64, 0, 0, 0, 0, 0, 0, 0, 127,111,28, 2, 0, 0, 0, 0, 5, 4, 0, 0, 0, 0, 0, 0, 128,9, 0, 1, 0, 0, 0, 0, 16, 81, 20, 0, - 0, 0, 0, 0, 17, 65, 2, 2, 0, 32, 0, 0, 66, 1, 20, 2, 0, 0, 0, 0, 0, 17, 8, 1, 0, 32, 24, 0, 0, 8, 0, 0, 0, 0, 8, 0, 255,127,127,3, - 0, 0, 0, 0, 206,91, 64, 2, 0, 0, 0, 0, 152,40, 78, 0, 0, 0, 0, 0, 27, 48, 4, 0, 0, 0, 0, 0, 209,64, 0, 0, 0, 0, 0, 0, 147,9, 100,1, - 0, 0, 0, 0, 147,0, 84, 0, 0, 0, 0, 0, 0, 8, 6, 1, 0, 0, 0, 0, 192,46, 18, 0, 0, 0, 0, 0, 4, 73, 8, 0, 0, 0, 0, 0, 176,17, 6, 0, - 0, 0, 0, 0, 151,77, 28, 1, 0, 0, 0, 0, 5, 96, 4, 0, 0, 0, 0, 0, 18, 41, 0, 0, 0, 32, 0, 0, 62, 249,4, 0, 0, 0, 0, 0, 255,223,94, 2, - 0, 0, 0, 0, 128,8, 4, 0, 0, 16, 0, 0, 1, 65, 0, 0, 0, 0, 0, 0, 168,0, 4, 0, 0, 0, 0, 0, 17, 65, 2, 1, 0, 32, 0, 0, 144,9, 4, 0, - 0, 0, 0, 0, 196,16, 0, 0, 0, 0, 0, 0, 94, 168,175,0, 0, 0, 0, 0, 16, 73, 16, 0, 0, 0, 0, 0, 140,13, 12, 0, 0, 0, 0, 0, 5, 1, 8, 0, - 0, 0, 0, 0, 20, 36, 12, 0, 0, 0, 0, 0, 0, 81, 16, 0, 0, 0, 0, 0, 0, 8, 2, 2, 0, 192,31, 0, 0, 0, 4, 0, 0, 0, 0, 0, 22, 44, 38, 2, - 0, 0, 0, 0, 21, 44, 6, 0, 0, 0, 0, 0, 71, 160,0, 0, 0, 0, 2, 0, 0, 8, 0, 0, 0, 0, 0, 0, 161,51, 22, 0, 16, 224,0, 0, 255,127,127,3, - 0, 0, 0, 0, 96, 56, 62, 2, 0, 0, 0, 0, 176,121,4, 1, 0, 0, 0, 0, 128,0, 20, 0, 0, 32, 0, 0, 16, 65, 68, 1, 0, 68, 0, 0, 2, 72, 18, 0, - 0, 0, 0, 0, 145,4, 24, 0, 0, 0, 0, 0, 25, 73, 22, 0, 0, 0, 0, 0, 0, 12, 0, 1, 0, 0, 0, 0, 0, 8, 194,2, 0, 0, 0, 0, 81, 77, 0, 0, - 0, 0, 0, 0, 21, 69, 0, 0, 0, 0, 0, 0, 138,60, 14, 2, 0, 0, 0, 0, 18, 17, 68, 0, 0, 0, 0, 0, 81, 17, 4, 1, 0, 0, 0, 0, 81, 72, 16, 0, - 0, 0, 0, 0, 86, 62, 14, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 90, 16, 12, 0, 0, 0, 0, 0, 144,32, 0, 1, 0, 0, 0, 0, 95, 221,60, 2, - 0, 0, 0, 0, 147,180,12, 0, 0, 0, 0, 0, 6, 236,148,2, 0, 0, 0, 0, 25, 64, 8, 0, 0, 96, 0, 0, 4, 0, 132,0, 0, 0, 0, 0, 145,113,4, 0, - 0, 0, 0, 0, 128,0, 14, 0, 0, 0, 0, 0, 8, 48, 2, 2, 0, 0, 0, 0, 144,69, 8, 0, 0, 0, 0, 0, 144,112,20, 3, 0, 0, 0, 0, 17, 81, 18, 0, - 0, 0, 0, 0, 94, 125,78, 0, 0, 0, 0, 0, 16, 9, 10, 0, 0, 0, 0, 0, 4, 9, 6, 0, 0, 0, 0, 0, 16, 8, 140,0, 0, 0, 0, 0, 5, 20, 132,0, - 0, 0, 0, 0, 0, 24, 70, 1, 0, 0, 0, 0, 64, 48, 64, 0, 0, 0, 0, 0, 96, 16, 0, 0, 0, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 95, 127,62, 0, - 0, 0, 0, 0, 4, 56, 2, 0, 0, 0, 0, 0, 8, 1, 2, 0, 0, 0, 0, 0, 10, 41, 10, 0, 0, 0, 0, 0, 68, 0, 8, 2, 0, 0, 0, 0, 16, 0, 32, 2, - 0, 0, 0, 0, 155,65, 76, 1, 0, 0, 0, 0, 8, 104,8, 0, 0, 0, 0, 0, 4, 32, 144,2, 0, 0, 0, 0, 68, 105,10, 2, 0, 224,3, 0, 32, 96, 4, 0, - 0, 0, 0, 0, 17, 64, 8, 0, 0, 0, 0, 0, 26, 41, 10, 1, 0, 0, 0, 0, 86, 120,12, 0, 0, 0, 0, 0, 20, 56, 48, 0, 0, 0, 0, 0, 100,16, 4, 0, - 0, 0, 0, 0, 2, 17, 0, 0, 0, 0, 0, 0, 64, 12, 8, 0, 0, 0, 0, 0, 148,156,28, 0, 0, 0, 0, 0, 149,33, 30, 2, 0, 16, 4, 0, 16, 1, 0, 0, - 0, 0, 0, 0, 128,88, 4, 0, 0, 0, 0, 0, 28, 8, 14, 0, 0, 0, 0, 0, 2, 0, 68, 0, 0, 0, 0, 0, 144,40, 0, 2, 0, 16, 0, 0, 112,0, 36, 0, - 0, 0, 0, 0, 136,34, 8, 0, 0, 0, 0, 0, 6, 41, 114,0, 0, 32, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 255,254,255,2, 0, 0, 0, 0, 4, 40, 12, 0, - 0, 0, 0, 0, 129,12, 0, 0, 0, 0, 0, 0, 19, 64, 26, 0, 0, 0, 0, 0, 2, 48, 20, 0, 0, 0, 0, 0, 149,68, 24, 0, 0, 0, 0, 0, 27, 8, 12, 0, - 0, 0, 0, 0, 0, 40, 14, 0, 0, 0, 0, 0, 0, 64, 40, 0, 0, 0, 44, 0, 1, 0, 4, 0, 0, 0, 0, 0, 89, 72, 20, 0, 0, 0, 0, 0, 110,40, 14, 0, - 0, 32, 0, 0, 144,17, 76, 0, 0, 0, 0, 0, 85, 80, 6, 1, 0, 0, 0, 0, 17, 97, 8, 0, 0, 0, 0, 0, 213,89, 60, 0, 0, 0, 0, 0, 0, 64, 12, 1, - 0, 32, 0, 0, 20, 65, 4, 0, 0, 0, 16, 0, 136,8, 4, 0, 0, 0, 0, 0, 211,221,12, 3, 0, 0, 0, 0, 0, 52, 14, 0, 0, 0, 0, 0, 71, 240,16, 0, - 0, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 0, 16, 193,4, 0, 0, 0, 0, 0, 145,209,4, 1, 0, 0, 0, 0, 8, 0, 14, 1, 0, 0, 0, 0, 16, 224,0, 0, - 0, 0, 0, 0, 144,1, 4, 0, 0, 0, 0, 0, 49, 81, 68, 0, 0, 0, 0, 0, 32, 48, 12, 0, 0, 0, 0, 0, 144,64, 2, 0, 0, 0, 0, 0, 127,109,94, 2, - 0, 0, 0, 0, 64, 56, 16, 2, 0, 32, 1, 0, 56, 9, 4, 0, 0, 0, 0, 0, 17, 24, 16, 1, 0, 0, 0, 0, 145,89, 20, 0, 0, 32, 0, 0, 106,120,14, 1, - 0, 32, 0, 0, 146,177,12, 0, 0, 0, 0, 0, 69, 32, 12, 2, 0, 0, 0, 0, 18, 8, 4, 0, 0, 0, 0, 0, 1, 0, 6, 1, 0, 0, 0, 0, 17, 89, 4, 0, - 0, 0, 0, 0, 104,56, 2, 1, 0, 0, 0, 0, 84, 40, 4, 0, 0, 0, 0, 0, 22, 0, 8, 0, 0, 0, 0, 0, 4, 32, 14, 0, 0, 0, 0, 0, 25, 221,28, 0, - 0, 32, 44, 0, 239,185,76, 0, 0, 0, 0, 0, 1, 73, 18, 0, 0, 0, 0, 0, 0, 8, 20, 0, 0, 0, 0, 0, 1, 16, 128,1, 0, 0, 0, 0, 17, 41, 84, 0, - 0, 34, 0, 0, 195,72, 12, 0, 0, 0, 0, 0, 213,13, 12, 0, 0, 0, 0, 0, 147,24, 0, 0, 0, 32, 32, 0, 246,253,12, 1, 0, 0, 0, 0, 4, 1, 16, 0, - 0, 0, 0, 0, 0, 32, 64, 1, 0, 0, 0, 0, 9, 8, 6, 1, 0, 32, 0, 0, 0, 17, 4, 1, 0, 0, 0, 0, 48, 9, 20, 0, 0, 0, 0, 0, 213,100,14, 2, - 0, 0, 0, 0, 17, 67, 4, 1, 0, 0, 0, 0, 209,190,70, 1, 0, 0, 2, 0, 37, 5, 6, 0, 0, 0, 0, 0, 18, 1, 0, 2, 0, 32, 0, 0, 24, 96, 0, 1, - 0, 0, 16, 0, 66, 80, 10, 0, 0, 0, 0, 0, 8, 1, 2, 1, 0, 32, 0, 0, 32, 2, 0, 0, 0, 0, 0, 0, 155,65, 56, 1, 0, 4, 0, 0, 207,181,255,1, - 0, 0, 0, 0, 132,68, 0, 0, 0, 0, 0, 0, 82, 153,6, 0, 0, 0, 0, 0, 64, 24, 2, 0, 0, 0, 0, 0, 16, 33, 4, 1, 0, 0, 0, 0, 19, 17, 20, 0, - 0, 32, 0, 0, 2, 96, 14, 0, 0, 0, 0, 0, 89, 37, 4, 0, 0, 0, 0, 0, 0, 130,4, 0, 0, 224,2, 0, 122,185,0, 1, 0, 0, 0, 0, 179,105,94, 0, - 0, 0, 0, 0, 74, 48, 8, 0, 0, 0, 0, 0, 223,53, 254,0, 0, 0, 0, 0, 66, 4, 4, 0, 0, 0, 0, 0, 68, 53, 14, 0, 0, 0, 0, 0, 0, 1, 68, 0, - 0, 0, 0, 0, 145,48, 0, 0, 0, 0, 0, 0, 25, 97, 12, 0, 0, 0, 0, 0, 132,32, 4, 0, 0, 0, 0, 0, 18, 48, 0, 1, 0, 0, 0, 0, 149,0, 8, 0, - 0, 0, 0, 0, 17, 1, 20, 1, 0, 0, 0, 0, 86, 176,14, 0, 0, 0, 0, 0, 17, 33, 6, 0, 0, 32, 0, 0, 0, 8, 4, 1, 0, 0, 0, 0, 76, 36, 12, 0, - 0, 0, 0, 0, 18, 1, 16, 0, 0, 32, 0, 0, 0, 72, 6, 0, 0, 0, 0, 0, 48, 208,4, 1, 0, 0, 0, 0, 221,240,94, 1, 0, 0, 0, 0, 8, 4, 2, 2, - 0, 0, 0, 0, 80, 137,68, 0, 0, 0, 0, 0, 128,128,4, 0, 0, 0, 0, 0, 21, 69, 18, 1, 0, 0, 0, 0, 1, 36, 12, 3, 0, 0, 0, 0, 28, 0, 12, 2, - 0, 0, 0, 0, 11, 96, 4, 0, 0, 32, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 129,65, 12, 0, 0, 96, 0, 0, 16, 1, 4, 1, 0, 0, 0, 0, 255,117,174,0, - 0, 0, 0, 0, 68, 40, 8, 0, 0, 0, 0, 0, 16, 1, 8, 1, 0, 0, 0, 0, 247,113,106,2, 0, 32, 48, 0, 0, 0, 0, 0, 0, 32, 0, 0, 1, 8, 2, 0, - 0, 0, 0, 0, 223,253,254,3, 0, 0, 0, 0, 129,5, 16, 0, 0, 0, 0, 0, 89, 96, 0, 0, 0, 0, 0, 0, 12, 8, 14, 0, 0, 0, 0, 0, 209,72, 28, 0, - 0, 0, 0, 0, 0, 16, 5, 0, 0, 0, 0, 0, 19, 8, 132,0, 0, 0, 0, 0, 217,29, 76, 2, 0, 0, 0, 0, 85, 96, 0, 0, 0, 0, 0, 0, 16, 57, 76, 0, - 0, 0, 0, 0, 17, 81, 0, 1, 0, 0, 0, 0, 21, 32, 4, 0, 0, 0, 0, 0, 0, 12, 16, 0, 0, 0, 0, 0, 16, 17, 20, 0, 0, 0, 0, 0, 92, 97, 60, 2, - 0, 0, 0, 0, 17, 104,22, 1, 0, 0, 0, 0, 0, 32, 72, 2, 0, 0, 0, 0, 145,33, 20, 0, 0, 0, 0, 0, 0, 8, 8, 2, 0, 0, 0, 0, 6, 40, 6, 1, - 0, 32, 0, 0, 62, 12, 14, 0, 0, 0, 0, 0, 145,129,4, 0, 0, 0, 0, 0, 179,187,68, 1, 0, 96, 14, 0, 16, 1, 4, 0, 0, 0, 0, 0, 4, 9, 8, 1, - 0, 0, 0, 0, 127,253,95, 3, 0, 0, 0, 0, 72, 60, 0, 1, 0, 0, 0, 0, 145,5, 16, 0, 0, 32, 0, 0, 40, 136,4, 0, 0, 240,35, 0, 240,81, 12, 1, - 0, 224,0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 247,191,238,0, 0, 0, 0, 0, 145,21, 8, 0, 0, 0, 0, 0, 1, 33, 4, 0, 0, 32, 32, 0, 17, 17, 38, 0, - 0, 96, 0, 0, 0, 0, 0, 1, 0, 32, 0, 0, 32, 17, 12, 0, 0, 0, 0, 0, 16, 96, 32, 0, 0, 0, 0, 0, 17, 105,20, 0, 0, 0, 0, 0, 32, 32, 32, 0, - 0, 0, 0, 0, 147,73, 84, 0, 0, 0, 0, 0, 8, 9, 0, 0, 0, 0, 0, 0, 8, 40, 2, 1, 0, 32, 0, 64, 16, 1, 14, 0, 0, 0, 0, 0, 3, 8, 6, 1, - 0, 0, 0, 0, 215,88, 28, 1, 0, 0, 0, 0, 16, 8, 8, 1, 0, 0, 0, 0, 209,53, 22, 1, 0, 0, 0, 0, 1, 160,4, 0, 0, 0, 0, 0, 4, 16, 66, 0, - 0, 0, 0, 0, 48, 32, 12, 0, 0, 96, 0, 0, 0, 64, 8, 0, 0, 0, 0, 0, 206,60, 12, 0, 0, 0, 0, 0, 32, 0, 4, 2, 0, 32, 0, 0, 16, 1, 36, 0, - 0, 0, 0, 0, 146,65, 0, 2, 0, 0, 0, 0, 197,40, 143,1, 0, 0, 0, 0, 94, 5, 4, 0, 0, 0, 0, 0, 17, 9, 6, 0, 0, 66, 0, 0, 37, 165,142,0, - 0, 0, 0, 0, 0, 64, 9, 0, 0, 0, 0, 0, 144,0, 2, 1, 0, 0, 0, 0, 21, 0, 6, 3, 0, 0, 0, 0, 18, 12, 0, 0, 0, 32, 0, 0, 254,16, 206,1, - 0, 0, 0, 0, 0, 8, 48, 0, 0, 128,0, 0, 61, 97, 148,1, 0, 0, 0, 0, 222,189,254,3, 0, 0, 0, 0, 5, 5, 8, 0, 0, 0, 0, 0, 16, 4, 0, 1, - 0, 0, 0, 0, 65, 113,2, 0, 0, 0, 0, 0, 8, 104,6, 2, 0, 0, 0, 0, 16, 137,0, 0, 0, 40, 0, 0, 8, 0, 70, 0, 0, 0, 0, 0, 92, 167,77, 2, - 0, 0, 0, 0, 145,69, 20, 1, 0, 32, 32, 0, 0, 32, 4, 1, 0, 32, 0, 0, 21, 4, 0, 0, 0, 0, 0, 0, 0, 96, 12, 0, 0, 96, 0, 0, 4, 0, 1, 2, - 0, 32, 0, 0, 16, 185,18, 0, 0, 96, 6, 0, 177,105,20, 3, 0, 0, 0, 0, 162,0, 14, 0, 0, 0, 0, 0, 0, 128,96, 0, 0, 0, 0, 0, 1, 1, 16, 3, - 0, 0, 0, 0, 0, 104,12, 0, 0, 0, 0, 0, 148,1, 20, 0, 0, 0, 0, 0, 16, 1, 26, 2, 0, 0, 0, 0, 88, 40, 12, 0, 0, 0, 0, 0, 16, 1, 0, 2, - 0, 0, 0, 0, 16, 8, 10, 1, 0, 0, 0, 64, 223,127,127,3, 0, 32, 0, 0, 27, 81, 4, 1, 0, 112,36, 0, 25, 73, 2, 1, 0, 0, 0, 0, 25, 65, 2, 1, - 0, 0, 0, 0, 16, 40, 10, 0, 0, 0, 0, 0, 1, 69, 8, 0, 0, 0, 0, 0, 18, 64, 0, 0, 0, 160,33, 0, 190,255,126,2, 0, 0, 0, 0, 16, 65, 20, 1, - 0, 0, 0, 0, 17, 88, 0, 0, 0, 240,59, 0, 0, 0, 4, 0, 0, 0, 0, 0, 17, 64, 4, 1, 0, 0, 0, 0, 21, 128,24, 0, 0, 0, 0, 0, 1, 64, 16, 1, - 0, 0, 0, 0, 81, 65, 16, 0, 0, 0, 0, 0, 250,62, 14, 0, 0, 0, 0, 0, 145,21, 0, 0, 0, 0, 8, 0, 17, 81, 0, 0, 0, 0, 0, 0, 92, 101,12, 2, - 0, 32, 0, 0, 32, 17, 72, 1, 0, 0, 0, 0, 148,32, 9, 0, 0, 32, 0, 0, 16, 120,64, 0, 0, 0, 0, 0, 2, 9, 76, 2, 0, 0, 0, 0, 63, 18, 10, 0, - 0, 0, 0, 0, 223,255,188,2, 0, 0, 0, 0, 129,4, 8, 0, 0, 0, 0, 0, 89, 88, 8, 0, 0, 0, 0, 0, 138,56, 14, 2, 0, 0, 0, 0, 147,28, 14, 0, - 0, 0, 0, 0, 16, 105,12, 2, 0, 0, 0, 0, 193,65, 0, 0, 0, 0, 0, 0, 150,69, 8, 0, 0, 0, 0, 0, 132,65, 12, 2, 0, 32, 0, 0, 80, 153,0, 3, - 16, 0, 0, 0, 223,121,92, 3, 0, 0, 0, 0, 138,24, 4, 0, 0, 32, 0, 0, 96, 56, 4, 0, 0, 0, 0, 0, 2, 88, 64, 0, 0, 0, 0, 0, 8, 104,4, 0, - 0, 0, 0, 0, 155,80, 32, 0, 0, 0, 0, 0, 28, 5, 12, 0, 0, 64, 0, 0, 19, 89, 70, 2, 0, 0, 0, 0, 4, 1, 12, 1, 0, 32, 0, 0, 18, 65, 4, 1, - 0, 0, 0, 0, 212,57, 28, 0, 0, 32, 0, 0, 38, 9, 36, 1, 0, 0, 0, 0, 1, 132,0, 0, 0, 0, 0, 0, 132,65, 8, 0, 0, 0, 0, 0, 27, 89, 6, 0, - 0, 0, 0, 0, 8, 9, 16, 0, 0, 12, 0, 0, 0, 8, 12, 0, 0, 0, 0, 0, 255,254,143,2, 0, 0, 0, 0, 8, 128,1, 0, 0, 32, 4, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 133,21, 0, 0, 16, 48, 44, 64, 241,121,92, 1, 0, 0, 0, 0, 24, 16, 2, 0, 0, 96, 4, 0, 128,32, 0, 0, 0, 96, 0, 0, 1, 128,0, 0, - 1, 112,28, 0, 67, 0, 2, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 192,56, 6, 0, 0, 0, 0, 0, 2, 16, 12, 3, 0, 0, 0, 0, 209,73, 16, 0, - 0, 0, 0, 0, 48, 17, 0, 0, 0, 0, 0, 0, 161,117,76, 0, 0, 0, 0, 0, 8, 113,6, 1, 0, 0, 0, 0, 255,220,108,0, 0, 0, 0, 0, 128,65, 2, 0, - 0, 0, 0, 0, 179,49, 70, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0, 64, 100,0, 0, 0, 32, 1, 0, 255,101,12, 0, 0, 0, 0, 0, 32, 37, 2, 0, - 0, 0, 0, 0, 128,5, 8, 0, 0, 0, 0, 0, 145,1, 4, 1, 0, 32, 0, 0, 84, 16, 4, 0, 0, 0, 0, 0, 119,125,30, 3, 0, 0, 0, 0, 17, 9, 16, 1, - 0, 0, 0, 0, 128,1, 2, 0, 0, 0, 0, 0, 0, 32, 88, 0, 0, 0, 0, 0, 129,65, 64, 0, 0, 0, 0, 0, 8, 4, 64, 0, 0, 0, 0, 0, 2, 4, 8, 1, - 0, 0, 0, 0, 149,97, 12, 0, 0, 0, 0, 0, 32, 108,0, 0, 0, 0, 0, 0, 18, 33, 0, 1, 0, 0, 0, 0, 151,65, 30, 1, 0, 0, 0, 0, 2, 1, 0, 1, - 0, 0, 0, 0, 52, 0, 8, 0, 0, 4, 0, 0, 57, 109,24, 1, 0, 0, 0, 0, 52, 32, 2, 1, 0, 0, 0, 0, 152,32, 0, 0, 0, 4, 0, 0, 0, 2, 12, 0, - 0, 32, 32, 0, 0, 0, 2, 0, 0, 0, 0, 0, 34, 2, 0, 0, 0, 32, 0, 0, 2, 2, 0, 0, 16, 188,34, 0, 255,255,255,3, 0, 0, 0, 0, 136,36, 0, 0, - 0, 16, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 168,6, 0, 0, 0, 0, 0, 147,73, 2, 1, 0, 0, 0, 0, 17, 12, 2, 1, 0, 96, 0, 0, 17, 9, 4, 0, - 0, 0, 0, 0, 149,5, 16, 1, 0, 0, 0, 0, 123,73, 84, 3, 0, 0, 0, 0, 0, 24, 16, 0, 0, 0, 0, 0, 26, 64, 0, 0, 0, 0, 0, 0, 11, 13, 14, 0, - 0, 0, 0, 0, 145,4, 0, 2, 0, 0, 0, 0, 16, 101,0, 0, 0, 0, 0, 0, 209,105,6, 0, 0, 0, 0, 0, 1, 56, 2, 0, 0, 0, 0, 0, 91, 58, 30, 0, - 0, 0, 0, 0, 16, 9, 20, 0, 0, 0, 0, 0, 48, 65, 4, 0, 0, 0, 0, 0, 145,64, 4, 0, 0, 0, 0, 0, 128,128,10, 0, 0, 0, 0, 0, 251,223,124,1, - 0, 0, 0, 0, 206,176,190,3, 0, 0, 0, 0, 64, 65, 8, 0, 0, 0, 0, 0, 8, 33, 0, 3, 0, 0, 0, 0, 128,4, 4, 0, 0, 0, 0, 0, 5, 104,14, 1, - 0, 0, 0, 0, 53, 252,16, 2, 0, 0, 0, 0, 9, 69, 4, 0, 0, 0, 0, 0, 19, 81, 84, 1, 0, 0, 0, 0, 212,48, 94, 0, 0, 0, 0, 0, 88, 1, 0, 0, - 0, 0, 0, 0, 192,112,14, 1, 0, 0, 0, 0, 129,72, 0, 0, 0, 0, 0, 0, 245,244,52, 0, 0, 0, 0, 0, 133,64, 0, 0, 0, 0, 0, 0, 65, 0, 16, 0, - 0, 0, 0, 0, 74, 160,68, 0, 0, 0, 0, 0, 4, 128,4, 2, 0, 0, 0, 0, 32, 33, 70, 0, 0, 0, 0, 0, 0, 64, 72, 0, 0, 0, 0, 0, 128,4, 8, 2, - 0, 0, 0, 0, 83, 217,22, 0, 0, 0, 0, 0, 68, 8, 6, 1, 0, 0, 0, 0, 145,73, 2, 1, 0, 0, 0, 0, 17, 40, 8, 0, 0, 0, 0, 0, 14, 220,78, 2, - 0, 32, 0, 0, 65, 64, 4, 0, 0, 32, 0, 0, 128,128,14, 0, 0, 32, 0, 0, 64, 0, 4, 0, 0, 0, 0, 0, 0, 32, 72, 0, 0, 0, 0, 0, 125,107,28, 3, - 0, 0, 0, 0, 8, 128,68, 0, 0, 0, 0, 0, 145,65, 2, 1, 0, 0, 0, 0, 16, 32, 2, 2, 0, 0, 0, 0, 1, 34, 0, 0, 0, 0, 0, 0, 0, 16, 6, 1, - 0, 0, 0, 0, 19, 105,94, 1, 0, 0, 0, 0, 8, 24, 14, 0, 0, 0, 0, 0, 82, 48, 6, 0, 0, 0, 0, 0, 16, 32, 24, 0, 0, 0, 0, 0, 18, 4, 24, 0, - 0, 0, 0, 0, 144,32, 58, 2, 0, 0, 0, 0, 230,57, 44, 1, 0, 0, 0, 0, 68, 0, 2, 0, 0, 0, 0, 0, 16, 65, 0, 3, 0, 0, 0, 0, 9, 8, 12, 0, - 0, 0, 0, 0, 17, 105,16, 1, 0, 0, 0, 0, 5, 56, 6, 0, 0, 32, 0, 0, 145,1, 4, 0, 0, 0, 0, 0, 1, 40, 12, 1, 0, 0, 0, 0, 32, 65, 16, 0, - 0, 0, 0, 0, 119,100,44, 0, 0, 0, 0, 0, 0, 65, 8, 1, 0, 0, 0, 0, 153,65, 12, 0, 0, 0, 0, 0, 1, 0, 14, 1, 0, 0, 0, 0, 32, 32, 80, 0, - 0, 0, 0, 0, 194,48, 74, 0, 0, 0, 0, 0, 129,40, 8, 0, 0, 0, 0, 0, 92, 96, 12, 0, 0, 0, 0, 0, 8, 32, 92, 0, 0, 0, 0, 0, 144,71, 8, 0, - 0, 0, 0, 0, 144,121,2, 2, 0, 0, 0, 0, 151,253,77, 0, 0, 0, 0, 0, 0, 33, 8, 1, 0, 0, 0, 0, 48, 64, 0, 0, 0, 0, 0, 0, 17, 121,0, 1, - 0, 0, 0, 0, 16, 161,0, 0, 0, 0, 0, 0, 149,73, 94, 2, 0, 0, 0, 0, 188,12, 70, 0, 0, 32, 0, 0, 128,16, 0, 1, 0, 240,46, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 16, 19, 2, 0, 0, 0, 0, 0, 208,0, 0, 0, 0, 96, 0, 0, 33, 16, 4, 0, 0, 0, 0, 0, 2, 68, 0, 0, 0, 0, 0, 0, 17, 65, 20, 0, - 0, 0, 0, 0, 255,60, 110,2, 0, 0, 0, 0, 144,9, 16, 0, 0, 0, 0, 0, 24, 77, 12, 2, 0, 0, 0, 0, 145,33, 6, 0, 0, 0, 0, 0, 80, 40, 4, 0, - 0, 0, 0, 0, 73, 104,10, 0, 0, 0, 0, 0, 25, 13, 10, 0, 0, 0, 0, 0, 251,120,12, 0, 0, 0, 0, 0, 25, 225,0, 2, 0, 0, 0, 0, 0, 41, 64, 0, - 0, 32, 0, 0, 229,207,18, 1, 0, 0, 0, 0, 129,16, 36, 0, 0, 0, 0, 0, 5, 192,24, 1, 16, 16, 0, 0, 255,253,126,3, 0, 0, 0, 0, 68, 40, 30, 0, - 0, 0, 0, 0, 147,105,68, 1, 0, 0, 0, 0, 147,64, 2, 0, 0, 0, 0, 0, 24, 113,2, 1, 0, 0, 0, 0, 8, 60, 47, 2, 0, 16, 0, 0, 2, 0, 4, 1, - 0, 0, 0, 0, 8, 4, 12, 1, 0, 0, 0, 0, 52, 64, 2, 0, 0, 0, 0, 0, 16, 88, 2, 0, 0, 0, 0, 0, 146,1, 0, 0, 0, 0, 0, 0, 16, 93, 0, 1, - 0, 0, 0, 0, 94, 60, 14, 0, 0, 0, 0, 0, 144,9, 12, 2, 0, 0, 0, 0, 192,32, 0, 2, 0, 0, 0, 0, 251,121,62, 2, 0, 0, 0, 0, 16, 81, 2, 0, - 0, 0, 0, 0, 19, 25, 4, 0, 0, 20, 0, 0, 95, 111,30, 2, 0, 0, 0, 0, 17, 8, 18, 0, 0, 0, 0, 0, 1, 96, 46, 1, 0, 96, 0, 0, 49, 89, 4, 0, - 0, 0, 0, 0, 145,8, 0, 0, 0, 0, 0, 0, 21, 33, 28, 0, 0, 0, 0, 0, 21, 16, 60, 0, 0, 0, 0, 0, 209,105,6, 2, 0, 0, 0, 0, 1, 40, 20, 0, - 0, 0, 0, 0, 236,153,14, 0, 0, 128,0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 145,73, 0, 1, 0, 240,36, 0, 1, 40, 44, 0, 0, 0, 0, 0, 17, 96, 20, 1, - 0, 96, 0, 0, 8, 32, 0, 0, 0, 0, 0, 0, 4, 128,8, 1, 0, 0, 0, 0, 129,161,0, 0, 0, 0, 0, 0, 68, 45, 14, 0, 0, 32, 0, 0, 16, 65, 12, 0, - 0, 0, 0, 0, 129,4, 0, 2, 0, 0, 0, 0, 12, 48, 12, 0, 0, 0, 0, 0, 69, 32, 12, 0, 0, 0, 0, 0, 17, 201,20, 1, 0, 32, 0, 0, 17, 97, 28, 1, - 0, 0, 0, 0, 5, 0, 20, 2, 0, 0, 0, 0, 68, 57, 84, 0, 0, 32, 0, 0, 0, 96, 12, 0, 0, 32, 0, 0, 2, 16, 0, 0, 0, 0, 0, 0, 134,64, 8, 0, - 0, 0, 0, 0, 16, 84, 64, 0, 0, 0, 0, 0, 144,109,22, 3, 0, 0, 0, 0, 36, 64, 0, 0, 0, 0, 0, 0, 149,181,28, 0, 0, 0, 0, 0, 0, 5, 64, 0, - 0, 0, 0, 0, 48, 104,0, 0, 0, 0, 0, 0, 0, 136,8, 0, 16, 0, 0, 0, 191,249,30, 2, 0, 0, 0, 0, 52, 10, 64, 0, 0, 0, 0, 0, 12, 81, 16, 0, - 0, 0, 0, 0, 8, 50, 2, 0, 0, 0, 0, 0, 220,101,162,1, 0, 0, 4, 0, 176,2, 0, 0, 0, 32, 0, 0, 0, 1, 34, 0, 0, 0, 0, 0, 32, 38, 10, 0, - 0, 0, 0, 0, 12, 141,32, 1, 0, 0, 0, 0, 2, 0, 1, 2, 0, 0, 0, 0, 2, 24, 0, 2, 0, 112,8, 0, 64, 16, 130,0, 0, 0, 0, 0, 179,67, 26, 2, - 0, 0, 0, 0, 56, 121,14, 2, 0, 0, 0, 0, 25, 1, 8, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 1, 33, 32, 0, 0, 0, 0, 0, 140,138,2, 1, - 0, 32, 0, 0, 74, 0, 2, 0, 0, 0, 0, 0, 128,2, 0, 0, 0, 0, 0, 0, 19, 108,10, 2, 0, 0, 0, 0, 17, 20, 0, 0, 0, 0, 0, 0, 7, 72, 6, 0, - 0, 0, 0, 0, 205,36, 58, 0, 0, 32, 0, 0, 65, 32, 3, 2, 0, 0, 0, 0, 162,0, 0, 0, 0, 0, 0, 0, 0, 8, 30, 0, 0, 0, 0, 0, 144,32, 8, 0, - 0, 32, 0, 0, 58, 88, 70, 1, 0, 0, 0, 0, 8, 140,0, 0, 0, 0, 0, 0, 255,250,190,2, 0, 0, 0, 0, 68, 249,7, 0, 0, 0, 0, 0, 133,65, 0, 0, - 0, 0, 0, 0, 2, 184,0, 0, 0, 0, 0, 0, 3, 145,0, 0, 0, 0, 0, 0, 125,105,24, 0, 0, 0, 0, 0, 0, 4, 40, 0, 0, 0, 0, 0, 8, 0, 18, 0, - 0, 0, 0, 0, 19, 104,6, 0, 0, 0, 0, 0, 1, 4, 0, 2, 0, 0, 0, 0, 93, 40, 64, 0, 0, 0, 0, 0, 238,40, 14, 0, 0, 0, 0, 0, 145,61, 16, 0, - 0, 0, 0, 0, 18, 9, 4, 1, 0, 0, 0, 0, 0, 60, 2, 0, 0, 0, 0, 0, 160,0, 24, 0, 0, 0, 0, 0, 255,253,46, 3, 0, 96, 0, 0, 16, 65, 4, 0, - 0, 0, 0, 0, 17, 97, 2, 0, 0, 0, 0, 0, 9, 48, 2, 0, 0, 0, 0, 0, 149,81, 20, 1, 0, 0, 0, 0, 4, 56, 14, 1, 0, 0, 0, 0, 215,124,12, 0, - 0, 0, 0, 0, 0, 192,4, 0, 0, 0, 0, 0, 68, 112,8, 0, 0, 0, 0, 0, 19, 184,4, 0, 0, 0, 0, 0, 89, 101,28, 3, 0, 0, 0, 0, 2, 64, 46, 0, - 0, 0, 0, 0, 209,9, 18, 0, 0, 112,36, 0, 2, 1, 0, 1, 0, 0, 0, 0, 4, 8, 0, 2, 0, 0, 0, 0, 22, 4, 0, 0, 0, 0, 0, 0, 53, 57, 42, 0, - 0, 0, 0, 0, 72, 33, 0, 0, 0, 0, 0, 0, 16, 128,20, 0, 0, 0, 0, 0, 123,89, 46, 0, 0, 0, 0, 0, 40, 40, 22, 1, 0, 0, 0, 0, 0, 10, 4, 0, - 0, 32, 8, 0, 32, 1, 4, 3, 0, 96, 5, 0, 4, 0, 4, 0, 0, 0, 0, 0, 8, 41, 24, 0, 0, 0, 0, 0, 9, 0, 128,0, 0, 0, 0, 0, 132,8, 8, 0, - 0, 0, 0, 0, 150,89, 14, 0, 0, 0, 0, 0, 149,8, 8, 2, 0, 0, 0, 0, 144,73, 0, 0, 0, 0, 0, 0, 108,56, 6, 0, 0, 0, 0, 0, 1, 49, 78, 0, - 0, 0, 0, 0, 1, 17, 0, 3, 0, 96, 4, 0, 28, 0, 4, 0, 0, 0, 0, 0, 1, 81, 0, 1, 0, 0, 0, 0, 217,221,34, 1, 0, 0, 0, 0, 2, 2, 2, 3, - 0, 0, 0, 0, 0, 36, 34, 0, 0, 0, 0, 0, 0, 2, 136,0, 0, 0, 0, 0, 27, 65, 20, 1, 0, 0, 0, 0, 223,176,254,3, 0, 0, 0, 0, 186,105,84, 1, - 0, 0, 0, 0, 1, 96, 20, 0, 0, 0, 0, 0, 12, 0, 44, 2, 0, 0, 0, 0, 16, 64, 20, 0, 0, 0, 0, 0, 246,225,76, 0, 0, 32, 0, 0, 182,115,68, 1, - 0, 0, 0, 0, 0, 8, 14, 1, 0, 0, 0, 0, 128,0, 8, 2, 0, 0, 0, 0, 30, 32, 4, 0, 0, 0, 0, 0, 4, 16, 16, 0, 0, 0, 0, 0, 10, 32, 70, 0, - 0, 0, 0, 0, 95, 49, 68, 0, 0, 0, 0, 0, 0, 48, 44, 0, 0, 0, 0, 0, 6, 16, 12, 2, 0, 0, 0, 0, 127,113,110,0, 0, 32, 8, 0, 1, 65, 64, 1, - 0, 0, 0, 0, 31, 240,92, 0, 0, 0, 0, 0, 24, 1, 64, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 24, 4, 12, 0, 0, 0, 0, 0, 145,0, 12, 0, - 0, 0, 0, 0, 127,241,126,1, 0, 32, 0, 0, 0, 9, 0, 0, 0, 32, 0, 0, 0, 16, 12, 0, 0, 96, 33, 0, 16, 32, 0, 0, 0, 0, 0, 0, 49, 64, 16, 0, - 0, 0, 0, 0, 17, 96, 0, 1, 0, 0, 0, 0, 48, 0, 8, 2, 0, 0, 0, 0, 17, 5, 68, 1, 0, 0, 0, 0, 94, 113,12, 0, 0, 0, 0, 0, 1, 32, 20, 0, - 0, 0, 0, 0, 4, 176,0, 0, 0, 0, 0, 0, 64, 136,4, 0, 0, 0, 0, 0, 23, 65, 24, 0, 0, 0, 0, 0, 0, 2, 8, 2, 0, 0, 2, 0, 19, 65, 22, 0, - 0, 0, 0, 0, 82, 0, 94, 0, 0, 0, 0, 0, 64, 1, 2, 0, 0, 0, 0, 0, 4, 16, 6, 2, 0, 8, 0, 0, 0, 0, 12, 0, 0, 96, 1, 0, 255,255,126,3, - 0, 0, 32, 0, 2, 1, 0, 0, 16, 0, 0, 0, 136,40, 74, 0, 0, 0, 0, 0, 2, 141,12, 0, 0, 0, 0, 0, 146,24, 4, 0, 0, 0, 0, 0, 19, 9, 22, 1, - 0, 0, 0, 0, 84, 40, 0, 0, 0, 0, 0, 0, 36, 8, 0, 0, 0, 32, 4, 0, 187,253,86, 3, 0, 0, 0, 0, 8, 24, 98, 0, 0, 0, 0, 0, 96, 0, 0, 0, - 0, 0, 0, 0, 16, 72, 0, 1, 0, 0, 0, 0, 49, 12, 14, 0, 0, 0, 0, 0, 0, 32, 36, 0, 0, 0, 0, 0, 0, 0, 68, 1, 0, 0, 0, 0, 104,8, 74, 1, - 0, 0, 0, 0, 209,216,64, 0, 0, 0, 0, 0, 143,189,78, 0, 0, 0, 0, 0, 24, 5, 0, 0, 0, 0, 0, 0, 72, 45, 12, 0, 0, 0, 0, 0, 128,2, 12, 2, - 0, 0, 0, 0, 49, 81, 14, 0, 0, 0, 0, 0, 16, 49, 2, 0, 0, 0, 0, 0, 209,73, 18, 0, 0, 0, 0, 0, 17, 104,2, 0, 0, 0, 0, 0, 37, 36, 14, 0, - 0, 0, 0, 0, 20, 83, 16, 0, 0, 0, 0, 0, 127,205,28, 2, 0, 0, 0, 0, 6, 36, 6, 1, 0, 32, 0, 0, 179,117,94, 3, 0, 0, 0, 0, 8, 148,0, 0, - 0, 32, 0, 0, 18, 16, 6, 0, 0, 0, 0, 0, 17, 1, 18, 0, 0, 0, 0, 0, 194,16, 0, 0, 0, 0, 0, 0, 16, 40, 0, 2, 0, 0, 0, 0, 6, 81, 72, 0, - 0, 0, 0, 0, 7, 48, 12, 1, 0, 48, 46, 0, 86, 241,32, 0, 0, 96, 16, 0, 0, 0, 0, 0, 0, 112,4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 93, 100,44, 0, - 0, 0, 0, 0, 8, 32, 12, 0, 0, 0, 0, 0, 145,113,80, 1, 0, 0, 0, 0, 66, 128,0, 0, 0, 0, 0, 0, 2, 50, 36, 0, 0, 0, 0, 0, 19, 209,16, 2, - 0, 0, 0, 0, 0, 8, 14, 3, 0, 0, 0, 0, 95, 97, 44, 3, 0, 0, 0, 0, 8, 8, 32, 2, 0, 0, 0, 0, 32, 0, 6, 3, 0, 0, 0, 0, 126,252,12, 0, - 0, 96, 1, 0, 255,255,110,1, 0, 0, 0, 0, 0, 48, 16, 1, 0, 0, 0, 0, 4, 12, 2, 0, 0, 0, 0, 0, 16, 0, 98, 0, 0, 0, 0, 0, 16, 0, 80, 0, - 0, 0, 0, 0, 16, 193,8, 0, 0, 0, 0, 0, 18, 1, 16, 1, 128,96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 17, 4, 0, 0, 0, 0, 0, 18, 9, 4, 0, - 0, 96, 2, 0, 10, 48, 4, 1, 0, 0, 0, 0, 145,225,16, 0, 0, 0, 0, 0, 223,125,30, 3, 0, 0, 0, 0, 4, 60, 0, 2, 0, 0, 0, 0, 17, 105,0, 1, - 0, 0, 0, 0, 28, 40, 12, 1, 0, 0, 0, 0, 103,0, 0, 0, 0, 0, 0, 0, 68, 40, 20, 2, 0, 32, 32, 0, 0, 0, 4, 2, 0, 0, 0, 0, 129,1, 0, 1, - 0, 0, 0, 0, 17, 67, 8, 1, 0, 0, 0, 0, 16, 12, 16, 0, 0, 0, 0, 0, 189,189,108,2, 0, 0, 0, 0, 17, 89, 0, 0, 0, 0, 0, 0, 68, 16, 2, 0, - 0, 0, 0, 0, 1, 76, 0, 1, 0, 0, 0, 0, 149,89, 78, 3, 0, 0, 0, 0, 3, 32, 2, 0, 0, 0, 0, 0, 64, 20, 8, 0, 0, 0, 0, 0, 128,1, 64, 0, - 0, 0, 0, 0, 185,77, 86, 0, 0, 0, 0, 0, 79, 173,46, 2, 0, 0, 0, 0, 81, 1, 2, 1, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 9, 88, 0, 0, - 0, 0, 0, 0, 136,0, 2, 1, 16, 0, 0, 0, 17, 65, 8, 0, 0, 0, 0, 0, 17, 81, 4, 0, 0, 0, 0, 0, 25, 41, 2, 0, 0, 0, 0, 0, 29, 32, 0, 0, - 0, 0, 0, 0, 1, 80, 0, 0, 0, 0, 0, 0, 4, 0, 22, 0, 0, 16, 16, 0, 219,65, 18, 3, 0, 0, 0, 0, 255,187,124,3, 0, 0, 0, 0, 147,105,4, 0, - 0, 0, 0, 0, 21, 1, 0, 3, 0, 96, 8, 0, 40, 8, 4, 1, 0, 0, 0, 0, 57, 105,84, 1, 0, 0, 0, 0, 12, 40, 6, 0, 0, 0, 0, 0, 17, 40, 20, 0, - 0, 0, 0, 0, 38, 48, 12, 0, 0, 0, 0, 0, 49, 1, 8, 0, 0, 0, 0, 0, 0, 0, 136,0, 0, 0, 0, 0, 81, 64, 4, 0, 0, 0, 0, 0, 17, 120,0, 0, - 0, 0, 0, 0, 68, 44, 4, 0, 0, 0, 0, 0, 80, 32, 4, 1, 0, 0, 0, 0, 151,217,4, 2, 0, 0, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 251,251,63, 2, - 0, 0, 0, 0, 136,1, 10, 0, 0, 32, 0, 0, 63, 247,60, 1, 0, 0, 0, 0, 16, 8, 22, 0, 0, 0, 0, 0, 32, 96, 4, 0, 0, 32, 0, 0, 0, 17, 4, 0, - 0, 0, 0, 0, 16, 8, 8, 2, 0, 32, 0, 0, 145,73, 36, 2, 0, 0, 0, 0, 144,128,0, 0, 0, 0, 0, 0, 33, 0, 38, 0, 0, 0, 0, 0, 4, 32, 152,0, - 0, 0, 0, 0, 144,144,12, 0, 0, 32, 0, 0, 145,89, 6, 1, 0, 0, 0, 0, 17, 1, 24, 2, 0, 0, 0, 0, 40, 0, 6, 0, 0, 0, 0, 0, 33, 96, 12, 0, - 0, 0, 0, 0, 82, 24, 4, 0, 0, 32, 0, 0, 8, 40, 14, 1, 0, 0, 0, 0, 0, 9, 4, 1, 0, 0, 0, 0, 1, 64, 8, 3, 0, 0, 0, 0, 62, 41, 68, 0, - 0, 0, 4, 0, 127,185,124,1, 0, 0, 0, 0, 0, 56, 62, 0, 0, 0, 0, 0, 10, 0, 2, 0, 0, 32, 0, 0, 216,120,68, 2, 0, 0, 0, 0, 132,65, 0, 2, - 0, 0, 0, 0, 15, 188,46, 0, 0, 224,63, 0, 255,249,126,1, 0, 224,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 32, 16, 1, 0, 0, 0, 0, 64, 32, 38, 1, - 0, 0, 0, 0, 0, 24, 64, 0, 0, 0, 0, 0, 24, 32, 4, 0, 0, 0, 0, 0, 49, 0, 2, 1, 0, 0, 0, 0, 35, 136,8, 0, 0, 0, 0, 0, 8, 8, 32, 1, - 0, 0, 0, 0, 48, 0, 2, 0, 0, 32, 8, 0, 81, 64, 84, 0, 0, 0, 0, 0, 106,40, 68, 2, 0, 0, 0, 0, 121,109,100,2, 0, 0, 0, 0, 132,12, 4, 0, - 0, 0, 0, 0, 149,96, 12, 2, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 18, 8, 8, 0, 0, 0, 0, 0, 170,121,76, 0, 0, 0, 0, 0, 126,250,173,2, - 0, 0, 0, 0, 24, 9, 4, 0, 0, 0, 0, 0, 102,144,46, 0, 0, 0, 0, 0, 146,17, 12, 0, 0, 0, 0, 0, 48, 65, 8, 0, 0, 0, 0, 0, 16, 40, 12, 1, - 0, 0, 0, 0, 65, 105,4, 0, 0, 0, 0, 0, 8, 0, 12, 1, 0, 0, 0, 0, 17, 92, 70, 0, 0, 0, 0, 0, 4, 8, 18, 0, 0, 0, 0, 0, 130,8, 8, 0, - 0, 0, 0, 0, 95, 53, 44, 0, 0, 32, 0, 0, 148,9, 4, 0, 0, 0, 0, 0, 1, 8, 64, 0, 0, 0, 0, 0, 151,88, 76, 0, 0, 0, 0, 0, 0, 48, 20, 0, - 0, 0, 0, 0, 0, 80, 12, 2, 0, 0, 0, 0, 255,251,124,3, 0, 0, 0, 0, 17, 16, 4, 1, 0, 0, 0, 0, 16, 33, 4, 2, 0, 0, 0, 0, 130,160,12, 0, - 0, 0, 0, 0, 0, 88, 4, 0, 0, 0, 0, 0, 0, 8, 68, 0, 0, 0, 0, 0, 17, 89, 0, 1, 0, 0, 0, 0, 27, 77, 37, 0, 0, 0, 0, 0, 8, 16, 44, 0, - 0, 0, 0, 0, 150,30, 36, 2, 0, 0, 0, 0, 155,125,64, 0, 0, 0, 0, 0, 146,65, 8, 2, 0, 0, 0, 0, 5, 168,12, 0, 0, 0, 0, 0, 146,41, 68, 0, - 0, 0, 0, 0, 0, 20, 64, 0, 0, 0, 0, 0, 24, 65, 4, 0, 0, 0, 0, 0, 28, 41, 12, 0, 0, 0, 0, 0, 254,185,108,2, 0, 0, 0, 0, 19, 16, 4, 1, - 0, 0, 0, 0, 81, 0, 8, 2, 0, 0, 0, 0, 2, 40, 12, 0, 0, 0, 0, 0, 146,1, 64, 0, 0, 0, 0, 0, 96, 0, 4, 0, 0, 0, 0, 0, 19, 176,0, 0, - 0, 0, 0, 0, 123,73, 76, 0, 0, 0, 0, 0, 144,88, 8, 1, 0, 32, 0, 0, 128,17, 4, 2, 0, 0, 0, 0, 17, 192,0, 0, 0, 0, 0, 0, 144,5, 12, 0, - 0, 0, 0, 0, 106,184,4, 0, 0, 0, 0, 0, 66, 8, 4, 0, 0, 0, 0, 0, 212,128,136,0, 0, 0, 2, 0, 160,229,136,1, 128,0, 0, 0, 0, 16, 0, 0, - 0, 0, 0, 0, 255,251,94, 3, 0, 0, 0, 0, 76, 187,46, 1, 0, 0, 0, 0, 64, 8, 2, 0, 0, 0, 0, 0, 77, 65, 8, 3, 0, 0, 0, 0, 6, 2, 0, 0, - 0, 0, 0, 0, 8, 0, 128,2, 0, 0, 0, 0, 25, 33, 2, 0, 0, 0, 0, 0, 8, 1, 4, 0, 0, 0, 0, 0, 145,1, 6, 0, 0, 0, 0, 0, 1, 224,0, 0, - 0, 0, 0, 0, 0, 48, 5, 0, 0, 0, 0, 0, 19, 9, 4, 0, 0, 0, 0, 0, 4, 20, 64, 0, 0, 0, 0, 0, 81, 17, 2, 0, 0, 0, 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 14, 57, 46, 0, 0, 0, 0, 0, 56, 136,0, 0, 0, 0, 0, 0, 21, 33, 14, 0, 0, 32, 0, 0, 16, 1, 68, 0, 0, 0, 0, 0, 80, 9, 0, 0, - 0, 0, 0, 0, 255,122,14, 3, 0, 0, 0, 0, 2, 104,0, 0, 0, 32, 0, 0, 10, 40, 78, 0, 0, 32, 16, 0, 0, 32, 12, 0, 0, 0, 0, 0, 65, 32, 0, 0, - 0, 0, 0, 0, 186,25, 12, 0, 0, 0, 0, 0, 176,0, 68, 0, 0, 0, 0, 0, 0, 65, 2, 1, 0, 0, 0, 0, 2, 48, 10, 0, 0, 0, 0, 0, 0, 0, 26, 0, - 0, 0, 0, 0, 89, 40, 8, 1, 0, 0, 0, 0, 1, 0, 36, 1, 0, 0, 0, 0, 22, 5, 8, 0, 0, 0, 0, 0, 145,1, 10, 1, 0, 56, 4, 0, 152,17, 6, 0, - 0, 0, 0, 0, 1, 2, 2, 0, 0, 0, 0, 0, 63, 253,20, 3, 0, 0, 0, 0, 66, 32, 10, 0, 0, 0, 0, 0, 4, 36, 4, 2, 0, 0, 0, 0, 196,0, 8, 0, - 0, 0, 0, 0, 22, 100,168,0, 0, 0, 0, 0, 4, 0, 2, 2, 0, 0, 0, 0, 128,0, 40, 0, 0, 0, 0, 0, 11, 145,4, 2, 0, 0, 0, 0, 144,0, 10, 0, - 0, 0, 0, 0, 123,189,28, 3, 0, 0, 0, 0, 17, 72, 2, 1, 0, 16, 0, 0, 0, 0, 64, 0, 0, 48, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 144,89, 8, 0, - 0, 0, 0, 0, 144,64, 18, 0, 0, 0, 0, 0, 89, 255,126,0, 0, 0, 0, 0, 66, 24, 0, 0, 0, 0, 0, 0, 1, 66, 64, 1, 0, 0, 0, 0, 9, 96, 8, 0, - 0, 0, 0, 0, 16, 0, 10, 1, 0, 0, 0, 0, 8, 62, 36, 0, 0, 32, 0, 0, 149,28, 12, 2, 0, 0, 0, 0, 17, 1, 80, 1, 0, 0, 0, 0, 16, 36, 0, 0, - 0, 0, 0, 0, 212,95, 14, 2, 0, 0, 0, 0, 17, 80, 2, 0, 0, 0, 0, 0, 0, 0, 132,2, 0, 0, 0, 0, 132,0, 0, 1, 0, 0, 0, 0, 0, 17, 6, 1, - 16, 32, 0, 0, 19, 120,60, 0, 16, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 17, 81, 0, 3, 0, 0, 0, 0, 19, 67, 0, 1, 0, 0, 0, 0, 8, 41, 10, 0, - 0, 128,0, 0, 81, 248,22, 0, 0, 0, 0, 0, 66, 2, 4, 0, 0, 0, 0, 0, 130,0, 4, 0, 16, 244,43, 0, 255,255,254,3, 0, 64, 0, 0, 4, 16, 0, 0, - 0, 16, 0, 0, 4, 8, 0, 0, 0, 64, 0, 0, 8, 32, 0, 0, 0, 16, 0, 0, 0, 64, 4, 0, 0, 64, 0, 0, 0, 128,4, 0, 0, 0, 16, 0, 255,191,255,3, - 0, 0, 0, 0, 231,172,14, 2, 0, 0, 0, 0, 21, 0, 12, 0, 0, 0, 0, 0, 19, 73, 22, 1, 0, 0, 0, 0, 85, 40, 2, 0, 0, 0, 0, 0, 24, 28, 4, 0, - 0, 0, 0, 0, 102,40, 12, 0, 0, 0, 0, 0, 144,69, 0, 2, 0, 0, 0, 0, 0, 0, 10, 3, 0, 0, 0, 0, 64, 112,0, 0, 0, 0, 0, 0, 51, 57, 68, 1, - 0, 0, 0, 0, 8, 40, 10, 1, 0, 32, 0, 0, 8, 64, 4, 2, 0, 0, 0, 0, 253,107,102,1, 0, 0, 0, 0, 8, 24, 70, 0, 0, 0, 0, 0, 8, 48, 64, 0, - 0, 0, 0, 0, 4, 32, 192,0, 0, 0, 0, 0, 32, 40, 6, 0, 0, 0, 0, 0, 9, 0, 8, 0, 0, 0, 0, 0, 16, 1, 2, 1, 16, 0, 0, 0, 0, 64, 0, 0, - 0, 0, 0, 0, 238,48, 22, 0, 0, 0, 0, 0, 64, 128,2, 0, 0, 0, 0, 0, 48, 41, 8, 0, 0, 0, 0, 0, 16, 56, 2, 2, 0, 0, 0, 0, 243,121,86, 1, - 0, 0, 0, 0, 8, 52, 2, 0, 0, 0, 0, 0, 26, 56, 6, 1, 0, 0, 0, 0, 146,0, 4, 1, 0, 0, 0, 0, 17, 96, 12, 0, 0, 0, 0, 0, 0, 224,4, 0, - 0, 0, 0, 0, 1, 56, 4, 0, 0, 0, 0, 0, 104,188,14, 1, 0, 0, 0, 0, 25, 8, 4, 0, 0, 0, 0, 0, 126,168,6, 1, 0, 0, 0, 0, 16, 64, 2, 1, - 0, 0, 0, 0, 128,1, 0, 2, 0, 0, 0, 0, 25, 35, 0, 0, 0, 0, 0, 0, 17, 77, 18, 0, 0, 0, 0, 0, 0, 120,8, 0, 0, 0, 0, 0, 17, 40, 6, 1, - 0, 64, 32, 0, 127,253,124,1, 0, 0, 0, 0, 15, 30, 12, 0, 0, 0, 0, 0, 72, 0, 12, 0, 0, 0, 0, 0, 133,164,36, 1, 0, 0, 0, 0, 155,216,74, 0, - 0, 0, 0, 0, 46, 124,8, 0, 0, 0, 0, 0, 119,81, 85, 1, 0, 0, 0, 0, 140,48, 84, 0, 0, 0, 0, 0, 20, 56, 14, 1, 0, 0, 0, 0, 222,112,68, 0, - 0, 32, 0, 0, 12, 64, 66, 0, 0, 32, 0, 0, 64, 32, 14, 0, 0, 0, 0, 0, 145,1, 2, 0, 0, 0, 0, 0, 17, 4, 8, 0, 0, 0, 0, 0, 0, 24, 8, 1, - 0, 0, 0, 0, 123,249,94, 2, 0, 0, 0, 0, 76, 61, 6, 0, 0, 0, 0, 0, 17, 72, 18, 1, 0, 0, 0, 0, 24, 9, 14, 0, 0, 0, 0, 0, 12, 52, 10, 0, - 0, 112,36, 0, 176,25, 12, 0, 0, 32, 0, 0, 4, 24, 8, 0, 0, 0, 0, 0, 25, 73, 12, 0, 0, 0, 0, 0, 129,65, 24, 0, 0, 0, 0, 0, 255,127,126,3, - 0, 0, 0, 0, 228,44, 112,0, 0, 64, 0, 0, 247,223,110,3, 0, 0, 0, 0, 4, 40, 64, 0, 0, 0, 0, 0, 32, 32, 48, 0, 0, 0, 0, 0, 149,64, 72, 0, - 0, 0, 0, 0, 74, 60, 6, 1, 0, 32, 0, 0, 17, 113,28, 2, 0, 0, 0, 0, 98, 48, 4, 0, 0, 32, 0, 0, 16, 73, 4, 1, 0, 32, 0, 0, 224,48, 68, 1, - 0, 0, 0, 0, 64, 60, 6, 1, 0, 0, 0, 0, 98, 32, 8, 0, 0, 0, 0, 0, 133,9, 32, 0, 0, 0, 0, 0, 183,89, 78, 0, 0, 0, 0, 0, 145,80, 20, 2, - 0, 0, 0, 0, 0, 20, 4, 0, 0, 0, 0, 0, 209,204,28, 0, 0, 0, 0, 0, 68, 1, 8, 0, 0, 0, 0, 0, 24, 33, 4, 0, 0, 96, 62, 0, 238,122,12, 1, - 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 127,255,126,3, 0, 0, 0, 0, 74, 190,70, 0, 0, 0, 0, 0, 145,65, 16, 1, 0, 0, 0, 0, 0, 8, 26, 0, - 0, 0, 0, 0, 24, 97, 12, 0, 0, 0, 0, 0, 145,72, 18, 0, 0, 32, 5, 0, 223,253,94, 1, 0, 0, 0, 0, 68, 52, 68, 0, 0, 16, 0, 0, 1, 64, 0, 0, - 0, 0, 0, 0, 4, 0, 50, 0, 0, 0, 0, 0, 82, 56, 6, 1, 0, 0, 0, 0, 80, 48, 4, 0, 0, 0, 0, 0, 42, 56, 70, 0, 0, 0, 0, 0, 144,1, 18, 0, - 0, 0, 0, 0, 0, 33, 14, 0, 0, 0, 0, 0, 8, 0, 96, 0, 0, 0, 0, 0, 203,240,14, 0, 0, 0, 0, 0, 21, 105,2, 0, 0, 0, 0, 0, 20, 16, 5, 1, - 0, 112,53, 0, 8, 16, 4, 0, 0, 0, 0, 0, 36, 0, 74, 0, 0, 0, 0, 0, 49, 73, 4, 0, 0, 0, 0, 0, 8, 1, 0, 1, 0, 0, 0, 0, 21, 64, 148,2, - 0, 0, 0, 0, 68, 32, 2, 0, 0, 0, 0, 0, 0, 72, 20, 0, 0, 0, 0, 0, 32, 32, 8, 0, 0, 0, 0, 0, 136,40, 4, 0, 0, 0, 0, 0, 89, 120,12, 0, - 0, 32, 0, 0, 2, 64, 44, 0, 0, 0, 0, 0, 72, 168,80, 0, 0, 96, 2, 0, 138,144,4, 0, 0, 0, 0, 0, 148,1, 8, 1, 0, 0, 0, 0, 51, 56, 0, 0, - 0, 0, 0, 0, 241,255,127,3, 0, 0, 0, 0, 3, 40, 2, 0, 0, 0, 0, 0, 2, 161,4, 1, 0, 0, 0, 0, 0, 8, 12, 1, 0, 0, 0, 0, 180,64, 40, 0, - 0, 0, 0, 0, 20, 96, 16, 0, 0, 0, 0, 0, 176,72, 0, 0, 0, 0, 0, 0, 128,52, 8, 0, 0, 32, 0, 0, 16, 17, 4, 0, 16, 32, 0, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 20, 40, 4, 0, 0, 0, 0, 0, 255,189,76, 1, 0, 0, 0, 0, 64, 60, 2, 0, 0, 0, 0, 0, 136,64, 8, 0, 0, 0, 0, 0, 39, 0, 0, 0, - 0, 0, 0, 0, 19, 81, 8, 0, 0, 0, 0, 0, 0, 8, 74, 0, 0, 0, 0, 0, 0, 16, 10, 1, 0, 0, 0, 0, 130,28, 40, 0, 0, 0, 0, 0, 96, 128,0, 0, - 0, 0, 0, 0, 85, 32, 0, 0, 0, 0, 0, 0, 181,93, 30, 2, 0, 0, 0, 0, 8, 28, 64, 1, 0, 0, 0, 0, 22, 9, 0, 0, 0, 0, 0, 0, 8, 8, 14, 0, - 0, 0, 0, 0, 42, 24, 6, 1, 0, 0, 0, 0, 21, 64, 64, 0, 0, 0, 0, 0, 5, 0, 128,0, 0, 0, 0, 0, 128,0, 24, 0, 0, 0, 0, 0, 17, 89, 18, 0, - 0, 0, 0, 0, 2, 32, 64, 0, 0, 0, 0, 0, 127,188,142,2, 0, 0, 0, 0, 145,8, 2, 0, 0, 0, 0, 0, 19, 5, 12, 0, 0, 0, 0, 0, 157,60, 78, 0, - 0, 0, 0, 0, 17, 105,42, 0, 0, 0, 0, 0, 32, 124,6, 1, 0, 0, 0, 0, 0, 69, 0, 1, 16, 0, 0, 0, 144,0, 4, 0, 0, 0, 0, 0, 164,29, 12, 0, - 0, 0, 0, 0, 20, 40, 6, 0, 0, 0, 0, 0, 51, 125,46, 0, 16, 0, 0, 128,0, 1, 0, 0, 0, 32, 2, 0, 65, 0, 0, 0, 0, 32, 0, 0, 88, 25, 68, 0, - 0, 0, 0, 0, 66, 0, 4, 0, 0, 32, 0, 0, 130,24, 64, 0, 0, 16, 0, 0, 2, 0, 8, 0, 0, 0, 0, 0, 255,120,78, 3, 0, 0, 0, 0, 2, 84, 12, 0, - 0, 0, 0, 0, 17, 96, 24, 0, 0, 0, 0, 0, 49, 89, 2, 3, 0, 32, 2, 0, 210,41, 74, 0, 0, 0, 0, 0, 192,0, 72, 1, 0, 0, 0, 0, 133,64, 128,0, - 0, 0, 8, 0, 34, 48, 8, 0, 16, 8, 0, 0, 255,255,255,3, 0, 0, 0, 0, 8, 136,4, 0, 0, 0, 4, 0, 238,185,46, 0, 0, 32, 0, 0, 255,153,79, 1, - 0, 0, 0, 0, 148,128,8, 0, 0, 0, 0, 0, 1, 40, 0, 1, 0, 0, 0, 0, 25, 9, 12, 1, 0, 0, 0, 0, 36, 1, 0, 1, 0, 0, 0, 0, 24, 105,14, 0, - 0, 32, 0, 0, 179,9, 76, 3, 0, 32, 0, 0, 0, 1, 8, 0, 0, 0, 8, 0, 144,73, 68, 0, 0, 32, 0, 0, 52, 24, 6, 0, 0, 96, 45, 0, 0, 9, 12, 0, - 0, 32, 0, 0, 16, 8, 4, 0, 0, 32, 0, 0, 8, 16, 68, 0, 0, 0, 0, 0, 27, 33, 6, 0, 0, 0, 0, 0, 133,124,24, 0, 0, 0, 0, 0, 51, 24, 4, 0, - 0, 0, 0, 0, 32, 0, 128,0, 0, 0, 0, 0, 90, 123,111,1, 0, 0, 0, 0, 80, 17, 0, 0, 0, 0, 0, 0, 134,128,6, 0, 0, 0, 0, 0, 4, 36, 128,0, - 0, 0, 0, 0, 250,184,14, 1, 0, 0, 0, 0, 25, 44, 4, 1, 0, 0, 0, 0, 48, 40, 8, 0, 0, 0, 0, 0, 16, 41, 2, 0, 0, 0, 0, 0, 1, 112,0, 0, - 0, 0, 0, 0, 89, 56, 86, 1, 0, 0, 0, 0, 8, 56, 2, 0, 0, 0, 0, 0, 16, 105,2, 0, 0, 0, 0, 0, 255,188,14, 2, 0, 0, 0, 0, 114,93, 10, 1, - 0, 0, 0, 0, 70, 56, 2, 0, 0, 32, 0, 0, 144,32, 4, 0, 0, 0, 0, 0, 2, 20, 0, 0, 0, 0, 0, 0, 18, 81, 0, 0, 0, 0, 0, 0, 27, 8, 6, 0, - 0, 0, 0, 0, 91, 77, 14, 3, 0, 0, 0, 0, 4, 52, 6, 1, 0, 0, 0, 0, 84, 32, 12, 0, 0, 0, 2, 0, 16, 25, 0, 0, 0, 0, 0, 0, 24, 72, 4, 0, - 0, 0, 0, 0, 152,61, 12, 0, 0, 0, 0, 0, 0, 41, 2, 1, 0, 0, 0, 0, 194,125,4, 2, 0, 32, 0, 0, 1, 56, 4, 0, 0, 0, 0, 0, 127,221,125,3, - 0, 0, 0, 0, 16, 16, 10, 0, 0, 0, 0, 0, 80, 1, 2, 0, 0, 0, 0, 0, 85, 224,144,0, 0, 0, 0, 0, 4, 128,4, 0, 16, 0, 4, 0, 247,113,86, 1, - 0, 0, 0, 0, 4, 96, 68, 0, 0, 224,46, 0, 129,84, 92, 1, 0, 192,0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 2, 129,8, 0, 0, 0, 0, 0, 151,77, 20, 1, - 0, 0, 0, 0, 0, 17, 64, 0, 0, 32, 0, 0, 188,25, 4, 0, 0, 0, 0, 0, 20, 73, 8, 0, 0, 0, 0, 0, 16, 64, 4, 2, 0, 0, 0, 0, 5, 1, 0, 0, - 0, 0, 0, 0, 19, 221,22, 0, 0, 0, 0, 0, 0, 152,0, 0, 0, 0, 0, 0, 0, 104,14, 1, 0, 0, 1, 0, 4, 160,4, 0, 0, 0, 0, 0, 0, 128,2, 1, - 0, 0, 0, 0, 8, 44, 14, 0, 0, 0, 0, 0, 72, 168,2, 0, 0, 0, 0, 0, 176,8, 12, 0, 0, 0, 0, 0, 1, 8, 72, 0, 0, 128,0, 0, 255,63, 78, 2, - 0, 0, 0, 0, 64, 97, 18, 0, 0, 0, 0, 0, 16, 72, 6, 1, 0, 0, 0, 0, 20, 4, 128,0, 0, 0, 0, 0, 203,1, 6, 1, 0, 0, 0, 0, 80, 9, 4, 0, - 0, 0, 0, 0, 112,96, 0, 0, 0, 0, 0, 0, 18, 0, 8, 0, 0, 0, 0, 0, 70, 180,4, 1, 0, 0, 0, 0, 116,32, 4, 0, 0, 0, 0, 0, 84, 4, 9, 0, - 0, 0, 0, 0, 128,68, 16, 0, 0, 32, 18, 0, 0, 4, 4, 0, 0, 0, 0, 0, 209,65, 6, 3, 0, 0, 0, 0, 167,173,72, 0, 0, 0, 0, 0, 4, 44, 30, 0, - 0, 0, 0, 0, 68, 8, 2, 0, 0, 0, 0, 0, 84, 32, 36, 0, 0, 0, 0, 0, 144,16, 16, 0, 0, 0, 0, 0, 17, 81, 12, 0, 16, 0, 0, 0, 43, 53, 78, 0, - 0, 0, 0, 0, 34, 112,8, 0, 0, 32, 0, 0, 12, 96, 20, 0, 0, 0, 0, 0, 0, 40, 12, 3, 0, 0, 0, 0, 25, 65, 8, 1, 0, 0, 4, 0, 24, 57, 28, 0, - 0, 0, 0, 0, 19, 121,20, 1, 0, 0, 0, 0, 77, 112,8, 0, 0, 0, 0, 0, 182,84, 8, 0, 0, 0, 0, 0, 51, 53, 0, 0, 0, 0, 0, 0, 177,73, 68, 2, - 0, 0, 0, 0, 18, 72, 0, 0, 0, 0, 0, 0, 50, 73, 0, 0, 0, 0, 0, 0, 55, 205,12, 1, 0, 0, 0, 0, 2, 25, 14, 0, 0, 0, 0, 0, 180,26, 30, 2, - 0, 0, 0, 0, 76, 128,12, 2, 0, 0, 0, 0, 16, 9, 66, 1, 0, 0, 0, 0, 215,176,110,0, 0, 0, 0, 0, 28, 41, 0, 0, 0, 0, 0, 0, 20, 97, 2, 0, - 0, 0, 0, 0, 81, 45, 68, 0, 0, 0, 0, 0, 104,48, 32, 0, 0, 0, 0, 0, 59, 63, 108,1, 0, 0, 0, 0, 17, 64, 26, 0, 0, 0, 0, 0, 68, 168,34, 1, - 0, 0, 0, 0, 0, 8, 72, 0, 0, 0, 0, 0, 26, 57, 4, 0, 0, 0, 0, 0, 148,5, 0, 0, 0, 0, 0, 0, 17, 89, 12, 0, 0, 0, 0, 0, 4, 36, 130,0, - 0, 0, 0, 0, 25, 1, 34, 1, 0, 0, 0, 0, 0, 12, 8, 1, 0, 0, 0, 0, 1, 68, 4, 1, 0, 0, 0, 0, 43, 185,14, 0, 0, 0, 0, 0, 203,57, 20, 1, - 0, 0, 0, 0, 243,186,110,0, 0, 0, 0, 0, 96, 32, 0, 0, 0, 0, 0, 0, 132,144,0, 0, 0, 0, 0, 0, 17, 65, 6, 0, 0, 0, 0, 0, 6, 0, 0, 2, - 0, 0, 0, 0, 0, 4, 128,0, 0, 0, 0, 0, 127,221,60, 3, 0, 0, 0, 0, 16, 97, 18, 1, 0, 0, 0, 0, 19, 49, 2, 0, 0, 0, 0, 0, 66, 32, 6, 0, - 0, 0, 0, 0, 32, 48, 2, 0, 0, 0, 0, 0, 247,113,76, 1, 0, 0, 0, 0, 2, 33, 2, 0, 0, 0, 0, 0, 67, 56, 6, 1, 0, 0, 0, 0, 16, 16, 20, 1, - 0, 0, 0, 0, 90, 81, 8, 0, 0, 0, 0, 0, 85, 65, 8, 0, 0, 0, 0, 0, 18, 96, 20, 3, 0, 8, 0, 0, 19, 17, 20, 0, 0, 0, 0, 0, 2, 42, 6, 0, - 0, 0, 0, 0, 0, 16, 70, 0, 0, 0, 0, 0, 221,125,14, 2, 0, 0, 0, 0, 128,18, 24, 0, 0, 0, 0, 0, 20, 24, 0, 0, 0, 0, 0, 0, 19, 29, 87, 0, - 0, 0, 0, 0, 66, 24, 6, 1, 0, 0, 0, 0, 144,9, 4, 0, 0, 0, 0, 0, 0, 6, 12, 0, 0, 0, 0, 0, 156,72, 0, 0, 0, 0, 0, 0, 64, 24, 0, 0, - 0, 2, 0, 0, 129,196,68, 0, 0, 32, 0, 0, 12, 136,4, 0, 0, 0, 0, 0, 25, 253,60, 3, 0, 0, 0, 0, 64, 125,12, 1, 0, 0, 0, 0, 137,52, 12, 1, - 0, 0, 0, 0, 134,1, 24, 0, 0, 0, 0, 0, 178,17, 0, 1, 0, 0, 0, 0, 145,0, 0, 2, 0, 8, 0, 0, 157,156,14, 0, 0, 0, 0, 0, 0, 4, 70, 0, - 0, 0, 0, 0, 68, 169,2, 0, 0, 0, 0, 0, 21, 64, 1, 0, 0, 0, 0, 0, 181,88, 12, 2, 0, 0, 0, 0, 148,21, 0, 0, 0, 0, 0, 0, 4, 16, 6, 0, - 0, 0, 0, 0, 16, 57, 4, 0, 0, 0, 0, 0, 18, 5, 0, 0, 0, 0, 16, 0, 21, 200,32, 0, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0, 0, 8, 0, 36, 0, - 0, 0, 0, 0, 5, 240,6, 0, 0, 0, 0, 0, 1, 104,0, 1, 0, 0, 0, 0, 72, 36, 130,0, 0, 0, 0, 0, 18, 9, 16, 1, 0, 0, 0, 0, 24, 0, 4, 1, - 0, 0, 0, 0, 219,109,4, 1, 0, 0, 0, 0, 80, 16, 8, 0, 0, 0, 0, 0, 179,48, 4, 0, 0, 0, 0, 0, 0, 48, 10, 1, 0, 224,45, 0, 1, 0, 0, 0, - 0, 240,33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 100,22, 0, 0, 0, 0, 0, 0, 164,0, 0, 0, 0, 0, 0, 0, 12, 6, 0, 0, 0, 0, 0, 24, 21, 4, 0, - 0, 0, 0, 0, 236,188,46, 1, 0, 0, 0, 0, 48, 8, 8, 0, 0, 0, 0, 0, 0, 8, 12, 2, 0, 0, 0, 0, 65, 41, 10, 0, 0, 0, 0, 0, 179,59, 12, 0, - 0, 0, 0, 0, 145,249,4, 0, 0, 0, 0, 0, 24, 40, 2, 0, 0, 0, 0, 0, 251,72, 94, 1, 0, 32, 0, 0, 4, 0, 4, 0, 0, 0, 0, 0, 145,121,4, 0, - 0, 0, 0, 0, 2, 8, 4, 2, 0, 0, 0, 0, 0, 40, 60, 0, 0, 0, 0, 0, 17, 5, 16, 0, 0, 0, 0, 0, 0, 34, 12, 1, 0, 0, 0, 0, 127,255,127,3, - 0, 32, 0, 0, 138,36, 70, 0, 0, 0, 0, 0, 5, 33, 2, 0, 0, 0, 0, 0, 144,68, 2, 0, 16, 0, 0, 0, 119,113,62, 1, 0, 0, 0, 0, 34, 56, 4, 0, - 0, 0, 0, 0, 12, 49, 14, 1, 0, 0, 0, 0, 187,112,4, 2, 0, 0, 0, 0, 19, 113,64, 1, 0, 32, 0, 0, 78, 48, 66, 0, 0, 0, 0, 0, 0, 48, 14, 1, - 0, 0, 0, 0, 3, 64, 0, 0, 0, 0, 0, 0, 1, 17, 20, 0, 0, 0, 0, 0, 58, 48, 68, 0, 0, 0, 0, 0, 144,0, 76, 0, 0, 0, 0, 0, 2, 176,66, 0, - 0, 96, 0, 0, 42, 64, 68, 1, 0, 0, 0, 0, 123,72, 69, 0, 0, 0, 0, 0, 236,48, 72, 0, 0, 0, 0, 0, 149,81, 72, 0, 0, 0, 0, 0, 211,84, 6, 2, - 0, 0, 0, 0, 22, 24, 0, 0, 0, 0, 0, 0, 164,80, 70, 0, 0, 0, 0, 0, 146,49, 64, 0, 0, 0, 0, 0, 23, 89, 22, 3, 0, 32, 8, 0, 110,248,78, 1, - 0, 0, 0, 0, 2, 144,68, 0, 0, 96, 4, 0, 24, 67, 28, 0, 0, 0, 0, 0, 4, 137,8, 0, 0, 8, 0, 0, 16, 1, 4, 0, 0, 0, 0, 0, 21, 40, 0, 0, - 0, 0, 0, 0, 84, 184,12, 2, 0, 0, 0, 0, 1, 65, 20, 1, 16, 0, 0, 0, 223,117,62, 3, 0, 0, 0, 0, 128,52, 4, 0, 0, 112,33, 0, 5, 16, 36, 0, - 0, 0, 0, 0, 3, 1, 2, 0, 0, 0, 0, 0, 0, 0, 160,0, 0, 0, 0, 0, 109,0, 6, 1, 0, 96, 4, 0, 30, 144,68, 0, 0, 0, 0, 0, 49, 69, 64, 2, - 0, 0, 0, 0, 128,12, 18, 0, 0, 0, 0, 0, 32, 32, 20, 0, 0, 0, 0, 0, 126,252,46, 1, 0, 0, 0, 0, 16, 73, 68, 0, 0, 0, 0, 0, 49, 1, 84, 1, - 0, 0, 0, 0, 16, 73, 12, 0, 0, 0, 0, 0, 20, 81, 4, 0, 0, 0, 0, 0, 113,157,76, 0, 0, 0, 0, 0, 41, 8, 76, 0, 0, 32, 0, 0, 0, 64, 32, 0, - 0, 0, 0, 0, 17, 25, 20, 1, 0, 0, 0, 0, 32, 69, 0, 0, 0, 0, 0, 0, 95, 125,126,1, 0, 0, 0, 0, 6, 44, 8, 0, 0, 0, 0, 0, 81, 0, 0, 1, - 0, 0, 0, 0, 81, 117,24, 2, 0, 0, 0, 0, 145,8, 0, 1, 0, 0, 0, 0, 31, 73, 20, 1, 0, 0, 0, 0, 12, 36, 0, 0, 0, 0, 0, 0, 17, 9, 18, 1, - 0, 0, 0, 0, 5, 0, 2, 0, 0, 0, 0, 0, 40, 8, 14, 1, 0, 0, 0, 0, 85, 36, 4, 0, 0, 0, 0, 0, 146,0, 8, 0, 0, 96, 4, 0, 75, 80, 4, 0, - 0, 0, 0, 0, 8, 0, 100,0, 0, 0, 0, 0, 106,0, 4, 0, 0, 0, 0, 0, 183,25, 8, 0, 0, 32, 0, 0, 162,184,6, 1, 0, 0, 0, 0, 145,81, 16, 0, - 0, 0, 0, 0, 181,253,28, 0, 0, 0, 0, 0, 141,53, 6, 1, 0, 0, 0, 0, 49, 8, 0, 0, 0, 96, 1, 0, 255,249,78, 2, 0, 0, 0, 0, 8, 1, 136,1, - 0, 32, 4, 0, 0, 9, 4, 0, 0, 0, 0, 0, 145,128,8, 0, 0, 0, 0, 0, 17, 89, 20, 1, 0, 0, 0, 0, 126,189,14, 3, 0, 0, 0, 0, 76, 0, 4, 0, - 0, 32, 0, 0, 24, 65, 4, 0, 0, 0, 0, 0, 65, 9, 4, 0, 0, 0, 0, 0, 153,61, 8, 0, 0, 96, 0, 0, 207,188,70, 1, 0, 0, 0, 0, 148,20, 4, 2, - 0, 0, 0, 0, 153,105,4, 0, 0, 0, 0, 0, 0, 168,2, 1, 0, 0, 0, 0, 60, 17, 4, 0, 16, 0, 0, 0, 155,125,14, 3, 0, 0, 0, 0, 8, 24, 38, 0, - 0, 0, 0, 0, 0, 40, 46, 1, 0, 0, 0, 0, 128,1, 76, 0, 0, 0, 0, 0, 17, 121,12, 0, 0, 32, 0, 0, 16, 28, 36, 0, 0, 128,0, 0, 63, 97, 48, 1, - 0, 0, 0, 0, 10, 160,0, 0, 0, 0, 0, 0, 6, 0, 44, 0, 0, 0, 0, 0, 10, 48, 40, 0, 0, 0, 0, 0, 138,129,16, 0, 0, 0, 0, 0, 17, 32, 16, 0, - 0, 96, 0, 0, 4, 24, 88, 1, 0, 0, 2, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 57, 70, 0, 0, 0, 0, 0, 68, 0, 24, 0, 0, 0, 0, 0, 8, 128,0, 0, - 0, 0, 0, 0, 23, 45, 6, 0, 0, 0, 0, 0, 17, 8, 20, 1, 0, 0, 0, 0, 49, 41, 4, 0, 0, 0, 0, 0, 89, 124,6, 1, 0, 0, 0, 0, 238,56, 110,3, - 0, 0, 0, 0, 20, 81, 12, 0, 0, 0, 0, 0, 33, 48, 12, 0, 0, 0, 0, 0, 17, 113,12, 1, 0, 0, 0, 0, 209,73, 22, 0, 0, 0, 0, 0, 145,9, 0, 1, - 0, 0, 0, 0, 17, 11, 4, 0, 0, 0, 0, 0, 129,48, 24, 0, 0, 0, 0, 0, 17, 8, 14, 2, 0, 0, 0, 0, 0, 1, 10, 2, 0, 0, 0, 0, 31, 93, 60, 2, - 0, 0, 0, 0, 68, 32, 8, 0, 0, 0, 0, 0, 144,25, 8, 0, 0, 0, 0, 0, 66, 80, 5, 2, 0, 0, 0, 0, 59, 209,60, 0, 0, 0, 0, 0, 4, 41, 4, 1, - 0, 0, 0, 0, 17, 109,4, 0, 0, 0, 0, 0, 16, 81, 16, 0, 0, 32, 32, 0, 128,0, 8, 0, 0, 0, 0, 0, 147,1, 14, 0, 0, 0, 32, 0, 221,44, 12, 3, - 0, 0, 0, 0, 8, 4, 2, 1, 0, 0, 0, 0, 17, 72, 66, 0, 0, 0, 0, 0, 0, 8, 66, 1, 0, 0, 0, 0, 19, 201,26, 0, 0, 16, 1, 0, 16, 73, 6, 2, - 0, 112,38, 0, 8, 1, 4, 0, 0, 32, 0, 0, 8, 0, 8, 0, 0, 0, 0, 0, 2, 17, 32, 0, 0, 0, 0, 0, 48, 148,2, 1, 0, 0, 0, 0, 59, 121,78, 0, - 0, 0, 0, 0, 19, 65, 4, 0, 0, 0, 0, 0, 10, 0, 6, 1, 0, 0, 0, 0, 85, 32, 0, 1, 0, 0, 0, 0, 113,25, 28, 2, 0, 0, 0, 0, 183,124,29, 2, - 0, 0, 0, 0, 0, 37, 2, 1, 0, 0, 0, 0, 2, 49, 10, 1, 0, 0, 0, 0, 0, 9, 2, 1, 0, 0, 0, 0, 149,56, 28, 3, 0, 0, 0, 0, 20, 5, 0, 0, - 0, 0, 0, 0, 160,24, 8, 0, 0, 0, 0, 0, 85, 40, 12, 0, 0, 0, 0, 0, 0, 0, 16, 2, 0, 32, 8, 0, 9, 1, 0, 0, 0, 0, 0, 0, 95, 252,94, 2, - 0, 0, 0, 0, 132,56, 8, 0, 0, 0, 0, 0, 16, 0, 2, 2, 0, 0, 0, 0, 0, 48, 24, 2, 0, 0, 0, 0, 126,136,140,0, 0, 0, 0, 0, 1, 96, 10, 0, - 0, 0, 0, 0, 25, 9, 8, 0, 0, 0, 0, 0, 24, 0, 20, 0, 0, 0, 0, 0, 145,224,4, 0, 0, 32, 0, 0, 79, 217,44, 0, 0, 0, 0, 0, 76, 136,140,0, - 0, 0, 0, 0, 21, 4, 16, 0, 0, 0, 0, 0, 16, 93, 9, 0, 0, 0, 0, 0, 64, 36, 0, 0, 16, 36, 20, 0, 255,255,255,3, 0, 0, 0, 0, 8, 25, 36, 0, - 16, 0, 0, 0, 1, 0, 0, 0, 16, 0, 0, 0, 0, 9, 0, 0, 0, 8, 0, 0, 16, 0, 2, 0, 0, 0, 0, 0, 125,185,110,0, 0, 0, 0, 0, 6, 160,32, 0, - 0, 0, 0, 0, 231,133,12, 0, 0, 32, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 5, 32, 24, 0, 0, 0, 0, 0, 5, 96, 16, 0, 0, 0, 4, 0, 91, 121,150,0, - 0, 0, 0, 0, 0, 8, 130,1, 0, 0, 0, 0, 64, 65, 34, 0, 0, 0, 0, 0, 8, 8, 4, 2, 0, 48, 0, 0, 0, 2, 8, 0, 0, 0, 0, 0, 0, 132,6, 0, - 0, 0, 2, 0, 151,93, 30, 3, 0, 0, 0, 0, 132,112,2, 0, 0, 0, 0, 0, 174,184,77, 0, 0, 112,5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 72, 0, - 0, 0, 0, 0, 194,38, 2, 0, 0, 0, 0, 0, 16, 32, 128,1, 0, 0, 0, 0, 0, 0, 38, 1, 16, 0, 0, 0, 57, 253,30, 1, 0, 0, 0, 0, 128,40, 2, 0, - 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 0, 33, 120,20, 0, 0, 0, 0, 0, 4, 144,12, 0, 0, 32, 0, 0, 1, 1, 4, 0, - 0, 0, 0, 0, 1, 17, 4, 0, 0, 0, 0, 0, 28, 33, 28, 3, 0, 0, 0, 0, 115,197,62, 0, 0, 0, 0, 0, 144,8, 8, 1, 0, 0, 0, 0, 215,121,90, 0, - 0, 0, 0, 0, 128,0, 6, 0, 0, 0, 0, 0, 25, 104,6, 0, 64, 4, 0, 0, 233,33, 12, 3, 0, 4, 0, 0, 1, 1, 4, 0, 0, 0, 0, 0, 17, 0, 14, 0, - 0, 0, 0, 0, 0, 16, 64, 2, 0, 0, 0, 0, 145,125,16, 2, 0, 0, 0, 0, 139,48, 2, 0, 0, 64, 0, 0, 255,93, 60, 1, 0, 0, 0, 0, 68, 57, 70, 1, - 0, 0, 0, 0, 17, 32, 150,0, 0, 0, 0, 0, 117,38, 16, 0, 0, 0, 4, 0, 0, 129,4, 1, 0, 0, 0, 0, 145,12, 0, 0, 0, 4, 0, 0, 17, 113,84, 1, - 0, 0, 0, 0, 85, 32, 8, 0, 0, 0, 0, 0, 0, 16, 4, 2, 0, 0, 0, 0, 4, 33, 34, 0, 0, 0, 4, 0, 239,159,28, 1, 1, 96, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 0, 1, 145,28, 0, 0, 64, 0, 0, 255,219,30, 2, 0, 0, 0, 0, 76, 187,138,0, 0, 32, 0, 0, 8, 32, 6, 0, 0, 32, 0, 0, 24, 0, 4, 0, - 0, 0, 0, 0, 32, 24, 10, 0, 0, 0, 0, 0, 72, 160,12, 0, 0, 0, 0, 0, 9, 56, 2, 0, 0, 0, 0, 0, 10, 8, 34, 0, 0, 0, 0, 0, 204,8, 12, 0, - 0, 0, 0, 0, 145,73, 22, 0, 0, 0, 0, 0, 4, 9, 14, 0, 0, 0, 0, 0, 13, 40, 10, 0, 0, 0, 0, 0, 37, 17, 44, 0, 0, 0, 0, 0, 1, 72, 16, 0, - 0, 0, 0, 0, 0, 8, 62, 0, 0, 8, 0, 0, 17, 1, 4, 0, 0, 0, 0, 0, 68, 0, 4, 2, 0, 0, 0, 0, 2, 144,32, 0, 0, 0, 0, 0, 238,172,30, 1, - 0, 0, 0, 0, 24, 33, 0, 0, 0, 0, 0, 0, 8, 0, 40, 0, 0, 0, 0, 0, 9, 0, 146,0, 0, 4, 0, 0, 145,73, 18, 0, 0, 0, 0, 0, 4, 168,6, 0, - 0, 0, 0, 0, 8, 224,14, 0, 0, 0, 0, 0, 192,48, 2, 0, 0, 0, 0, 0, 68, 0, 44, 0, 0, 0, 0, 0, 16, 193,0, 0, 0, 0, 0, 0, 2, 56, 2, 0, - 0, 0, 0, 0, 54, 184,142,0, 0, 0, 0, 0, 117,64, 54, 0, 0, 32, 0, 0, 64, 48, 4, 0, 0, 32, 0, 0, 17, 64, 4, 0, 0, 32, 8, 0, 0, 136,0, 0, - 0, 0, 0, 0, 17, 0, 24, 0, 0, 0, 0, 0, 4, 128,8, 0, 0, 0, 0, 0, 6, 120,34, 0, 0, 0, 0, 0, 14, 8, 6, 0, 0, 0, 0, 0, 122,136,175,2, - 0, 0, 0, 0, 133,192,8, 0, 0, 0, 0, 0, 4, 56, 10, 0, 0, 0, 0, 0, 5, 0, 6, 0, 0, 0, 0, 0, 16, 33, 14, 0, 0, 0, 0, 0, 88, 40, 130,0, - 0, 0, 0, 0, 16, 1, 16, 1, 0, 0, 0, 0, 70, 16, 78, 0, 0, 0, 0, 0, 4, 64, 6, 0, 0, 0, 0, 0, 147,88, 118,0, 0, 0, 0, 0, 66, 56, 6, 0, - 0, 0, 0, 0, 2, 0, 76, 0, 0, 0, 0, 0, 160,49, 12, 0, 0, 0, 0, 0, 0, 16, 20, 0, 0, 0, 0, 0, 80, 48, 13, 0, 0, 0, 0, 0, 17, 75, 68, 0, - 0, 0, 0, 0, 16, 0, 96, 0, 0, 0, 0, 0, 17, 69, 20, 0, 0, 0, 0, 0, 32, 4, 4, 0, 0, 0, 0, 0, 37, 164,86, 0, 0, 0, 0, 0, 149,205,24, 0, - 0, 0, 0, 0, 21, 184,10, 0, 0, 0, 0, 0, 72, 160,4, 0, 0, 0, 0, 0, 33, 0, 4, 0, 0, 0, 0, 0, 96, 24, 0, 0, 0, 0, 0, 0, 17, 0, 48, 0, - 0, 0, 0, 0, 66, 40, 14, 0, 0, 0, 0, 0, 25, 17, 20, 0, 0, 0, 0, 0, 34, 8, 2, 0, 16, 0, 0, 0, 177,67, 50, 0, 0, 0, 0, 0, 68, 52, 0, 0, - 0, 0, 0, 0, 96, 40, 6, 0, 0, 32, 0, 0, 2, 8, 8, 0, 0, 32, 0, 0, 0, 9, 4, 0, 0, 0, 0, 0, 32, 0, 40, 0, 0, 32, 0, 0, 127,251,126,2, - 0, 0, 0, 0, 68, 16, 0, 0, 0, 0, 0, 0, 0, 120,20, 0, 0, 0, 0, 0, 128,4, 16, 0, 0, 0, 0, 0, 1, 16, 8, 0, 0, 0, 0, 0, 28, 0, 24, 0, - 0, 0, 0, 0, 72, 8, 0, 0, 0, 0, 0, 0, 20, 128,8, 0, 0, 0, 0, 0, 0, 65, 66, 0, 0, 0, 0, 0, 160,16, 0, 0, 0, 0, 0, 0, 0, 41, 128,0, - 0, 0, 0, 0, 6, 240,52, 0, 0, 0, 0, 0, 16, 64, 10, 0, 0, 0, 0, 0, 8, 33, 52, 0, 0, 0, 0, 0, 0, 165,32, 1, 0, 0, 0, 0, 17, 129,4, 0, - 0, 0, 0, 0, 4, 32, 28, 0, 0, 32, 0, 0, 16, 81, 4, 0, 0, 0, 0, 0, 68, 96, 12, 0, 0, 0, 0, 0, 4, 13, 0, 0, 0, 0, 0, 0, 29, 184,126,2, - 0, 0, 0, 0, 5, 0, 4, 2, 0, 0, 0, 0, 149,200,44, 0, 0, 0, 2, 0, 140,16, 4, 0, 0, 0, 0, 0, 17, 65, 64, 0, 0, 0, 5, 0, 0, 0, 8, 0, - 0, 0, 0, 0, 3, 0, 16, 2, 0, 0, 0, 0, 119,125,126,3, 0, 0, 0, 0, 180,167,13, 0, 0, 0, 0, 0, 8, 40, 12, 1, 0, 0, 0, 0, 95, 112,4, 2, - 0, 32, 16, 0, 3, 28, 0, 0, 0, 0, 1, 0, 4, 32, 1, 0, 0, 0, 0, 0, 254,153,78, 1, 0, 0, 0, 0, 8, 0, 72, 0, 0, 0, 0, 0, 108,136,36, 0, - 0, 192,0, 64, 255,253,30, 0, 0, 0, 0, 0, 127,125,22, 2, 0, 32, 0, 0, 1, 8, 0, 0, 0, 0, 0, 0, 3, 0, 16, 0, 0, 0, 0, 0, 129,64, 4, 0, - 0, 0, 0, 0, 19, 32, 0, 0, 0, 0, 0, 0, 18, 56, 26, 0, 0, 0, 0, 0, 194,0, 0, 0, 0, 0, 0, 0, 17, 81, 73, 0, 0, 0, 0, 0, 0, 20, 3, 0, - 0, 0, 0, 0, 202,5, 0, 2, 0, 0, 0, 0, 9, 248,12, 0, 0, 0, 0, 0, 0, 48, 6, 1, 0, 0, 0, 0, 0, 1, 78, 1, 16, 0, 0, 0, 16, 1, 0, 1, - 0, 8, 0, 0, 54, 184,12, 0, 0, 0, 0, 0, 128,64, 74, 0, 0, 0, 0, 0, 49, 56, 16, 1, 0, 0, 1, 0, 8, 0, 6, 0, 0, 0, 0, 0, 129,65, 34, 0, - 16, 0, 0, 0, 189,101,126,2, 0, 0, 0, 0, 68, 56, 4, 0, 0, 0, 1, 0, 17, 80, 24, 1, 0, 96, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 2, 1, 2, 0, - 0, 0, 0, 0, 6, 156,2, 0, 0, 96, 0, 0, 149,103,4, 0, 0, 0, 0, 0, 1, 97, 0, 0, 0, 0, 0, 0, 5, 40, 14, 1, 0, 0, 0, 0, 0, 117,12, 0, - 0, 0, 0, 0, 16, 97, 12, 1, 0, 0, 0, 0, 9, 64, 4, 0, 0, 0, 0, 0, 145,112,53, 2, 0, 0, 0, 0, 67, 4, 11, 0, 16, 180,0, 0, 223,255,255,3, - 0, 0, 0, 0, 30, 134,2, 0, 0, 80, 32, 0, 0, 0, 0, 0, 16, 16, 0, 0, 255,191,255,3, 0, 0, 0, 0, 32, 164,2, 0, 0, 0, 0, 0, 19, 73, 6, 0, - 0, 0, 0, 0, 0, 3, 64, 0, 0, 0, 0, 0, 149,93, 17, 0, 0, 112,34, 0, 185,217,7, 1, 0, 96, 0, 0, 16, 0, 4, 0, 0, 112,4, 0, 4, 0, 64, 0, - 0, 0, 0, 0, 32, 40, 100,0, 0, 96, 39, 0, 0, 1, 36, 0, 0, 0, 0, 0, 6, 176,200,0, 0, 96, 4, 0, 18, 65, 20, 1, 0, 0, 0, 0, 0, 24, 12, 2, - 0, 0, 0, 0, 145,73, 64, 2, 0, 32, 0, 0, 8, 34, 0, 0, 0, 0, 0, 0, 68, 36, 4, 0, 0, 0, 0, 0, 17, 32, 2, 1, 0, 0, 0, 0, 217,121,22, 0, - 0, 0, 0, 0, 56, 0, 64, 0, 0, 0, 0, 0, 1, 1, 0, 2, 0, 32, 0, 0, 0, 0, 132,0, 0, 0, 0, 0, 11, 104,2, 0, 0, 0, 0, 0, 136,184,6, 1, - 0, 0, 0, 0, 146,9, 4, 0, 0, 0, 0, 0, 1, 9, 12, 0, 0, 112,38, 0, 8, 16, 6, 1, 0, 0, 0, 0, 2, 0, 96, 0, 0, 0, 0, 0, 20, 65, 0, 0, - 0, 0, 0, 0, 83, 229,0, 0, 0, 32, 0, 0, 1, 1, 16, 0, 0, 0, 0, 0, 0, 176,32, 0, 0, 32, 0, 0, 91, 115,92, 2, 0, 0, 0, 0, 1, 9, 6, 0, - 0, 32, 0, 0, 0, 129,0, 0, 0, 0, 0, 0, 16, 8, 6, 1, 0, 240,63, 0, 223,222,78, 1, 0, 0, 0, 0, 17, 44, 6, 0, 0, 96, 0, 0, 2, 8, 4, 0, - 0, 36, 0, 0, 223,101,126,3, 0, 0, 0, 0, 20, 4, 12, 1, 0, 0, 0, 0, 1, 129,0, 0, 0, 0, 0, 0, 0, 65, 0, 2, 0, 0, 0, 0, 21, 45, 76, 3, - 0, 0, 0, 0, 16, 4, 0, 2, 0, 0, 0, 0, 21, 36, 14, 0, 0, 0, 0, 0, 148,0, 4, 2, 0, 0, 0, 0, 1, 64, 0, 2, 0, 0, 0, 0, 32, 0, 100,0, - 0, 0, 0, 0, 16, 36, 4, 0, 0, 0, 0, 0, 36, 0, 116,0, 0, 0, 0, 0, 21, 213,4, 2, 0, 104,0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 0, 1, 192,68, 0, 0, 0, 0, 0, 223,125,55, 2, 0, 0, 0, 0, 12, 56, 12, 0, 0, 0, 0, 0, 12, 16, 4, 0, 0, 0, 0, 0, 132,12, 4, 2, - 0, 0, 0, 0, 9, 8, 8, 0, 0, 0, 1, 0, 20, 253,76, 0, 0, 0, 0, 0, 4, 100,0, 0, 0, 240,6, 0, 207,190,206,0, 0, 192,2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 129,65, 14, 0, 0, 0, 0, 0, 142,48, 6, 0, 0, 0, 0, 0, 24, 129,8, 0, 0, 0, 0, 0, 64, 0, 5, 2, 0, 0, 0, 0, 10, 48, 22, 0, - 0, 0, 0, 0, 24, 0, 12, 0, 0, 128,0, 0, 136,32, 0, 0, 0, 0, 0, 0, 1, 0, 132,0, 0, 32, 0, 0, 159,126,78, 2, 0, 0, 0, 0, 2, 168,102,0, - 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 2, 0, 128,0, 0, 0, 0, 0, 16, 17, 64, 2, 0, 0, 0, 0, 1, 1, 16, 1, 0, 32, 0, 0, 18, 17, 8, 3, - 0, 16, 0, 0, 17, 73, 2, 0, 0, 16, 0, 0, 0, 160,0, 1, 0, 0, 0, 0, 255,254,126,2, 0, 0, 0, 0, 8, 40, 34, 0, 0, 0, 0, 0, 119,187,13, 0, - 0, 0, 0, 0, 128,8, 0, 1, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 0, 0, 128,20, 0, 0, 0, 32, 0, 0, 27, 9, 66, 2, 0, 48, 32, 0, 8, 52, 0, 0, - 0, 0, 0, 0, 2, 128,46, 2, 0, 0, 32, 0, 20, 49, 4, 0, 0, 96, 0, 0, 150,65, 86, 1, 0, 0, 0, 0, 24, 1, 4, 1, 0, 0, 0, 0, 0, 1, 36, 0, - 0, 0, 0, 0, 89, 77, 76, 0, 0, 32, 0, 0, 34, 16, 0, 0, 0, 0, 0, 0, 17, 209,0, 0, 0, 0, 0, 0, 0, 32, 2, 2, 0, 32, 0, 0, 93, 117,15, 2, - 0, 0, 0, 0, 16, 8, 40, 0, 0, 0, 0, 0, 36, 96, 4, 0, 0, 32, 0, 0, 17, 5, 2, 1, 0, 32, 0, 0, 128,34, 0, 0, 0, 0, 0, 0, 32, 8, 14, 1, - 0, 0, 0, 0, 112,32, 4, 0, 0, 96, 4, 0, 38, 4, 4, 1, 0, 0, 0, 0, 20, 64, 38, 0, 0, 0, 0, 0, 32, 168,16, 0, 0, 0, 0, 0, 66, 2, 0, 0, - 0, 0, 0, 0, 128,132,4, 0, 0, 0, 0, 0, 91, 125,62, 2, 0, 0, 0, 0, 2, 24, 16, 0, 0, 0, 0, 0, 12, 12, 0, 0, 0, 0, 0, 0, 16, 56, 64, 0, - 0, 96, 4, 0, 66, 8, 4, 0, 0, 0, 0, 0, 20, 149,92, 0, 0, 32, 0, 0, 16, 186,0, 0, 0, 240,28, 0, 0, 16, 4, 0, 0, 0, 0, 0, 4, 129,4, 0, - 0, 240,9, 0, 101,1, 4, 0, 0, 0, 0, 0, 179,153,12, 0, 0, 0, 0, 0, 8, 32, 128,0, 0, 0, 0, 0, 18, 5, 6, 0, 0, 32, 0, 0, 16, 8, 6, 0, - 0, 0, 0, 0, 2, 4, 64, 0, 0, 128,0, 0, 0, 66, 8, 0, 0, 0, 0, 0, 128,0, 128,0, 0, 0, 0, 0, 17, 97, 18, 0, 0, 0, 0, 0, 2, 96, 16, 0, - 0, 0, 0, 0, 68, 4, 0, 1, 0, 0, 0, 0, 0, 40, 132,0, 0, 0, 0, 0, 2, 0, 130,0, 0, 0, 0, 0, 81, 16, 4, 0, 0, 0, 0, 0, 17, 13, 8, 0, - 0, 32, 0, 0, 27, 23, 4, 0, 0, 96, 4, 0, 2, 64, 4, 1, 0, 0, 0, 0, 17, 17, 0, 1, 0, 96, 38, 0, 78, 130,4, 2, 0, 0, 0, 0, 217,166,206,2, - 0, 0, 0, 0, 0, 40, 92, 2, 0, 0, 0, 0, 65, 67, 4, 0, 0, 0, 32, 0, 1, 66, 32, 0, 0, 32, 0, 0, 8, 6, 0, 0, 0, 32, 0, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 18, 56, 8, 2, 0, 0, 0, 0, 0, 0, 144,0, 0, 0, 0, 0, 4, 0, 146,1, 0, 0, 0, 0, 147,0, 0, 0, 0, 0, 0, 0, 129,64, 4, 2, - 0, 0, 32, 0, 255,255,254,3, 0, 0, 0, 0, 14, 100,5, 0, 0, 128,0, 0, 18, 9, 4, 0, 0, 0, 0, 0, 144,65, 66, 1, 0, 32, 32, 0, 143,56, 14, 1, - 0, 0, 0, 0, 2, 64, 0, 1, 0, 0, 0, 0, 17, 144,0, 0, 0, 96, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 81, 1, 4, 0, 0, 32, 0, 0, 17, 32, 4, 0, - 0, 240,47, 0, 95, 247,76, 1, 0, 224,2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 4, 0, 0, 0, 0, 0, 0, 1, 97, 0, 1, 0, 32, 38, 0, 10, 0, 0, 0, - 0, 0, 0, 0, 146,81, 14, 0, 0, 96, 1, 0, 0, 0, 36, 0, 0, 0, 0, 0, 16, 1, 44, 0, 0, 32, 0, 0, 2, 8, 0, 0, 0, 96, 12, 0, 0, 17, 6, 0, - 0, 0, 0, 0, 81, 73, 12, 1, 0, 0, 0, 0, 20, 32, 36, 0, 0, 0, 0, 0, 223,101,29, 2, 0, 96, 0, 0, 2, 65, 44, 1, 0, 32, 2, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 32, 168,6, 0, 0, 64, 0, 0, 217,49, 6, 1, 0, 112,45, 0, 17, 1, 4, 0, 0, 0, 0, 0, 149,137,93, 0, 0, 32, 32, 0, 48, 200,8, 1, - 0, 96, 0, 0, 1, 129,20, 0, 0, 32, 0, 0, 0, 25, 16, 1, 0, 0, 0, 0, 21, 136,0, 0, 0, 0, 0, 0, 3, 64, 8, 0, 0, 0, 0, 0, 2, 40, 6, 0, - 0, 32, 0, 0, 53, 96, 6, 0, 0, 64, 0, 0, 0, 0, 16, 0, 0, 36, 0, 0, 4, 64, 2, 0, 0, 0, 0, 0, 6, 80, 24, 0, 0, 0, 0, 0, 0, 4, 80, 0, - 0, 0, 0, 0, 255,255,191,2, 0, 0, 0, 0, 21, 147,0, 0, 0, 0, 0, 0, 18, 1, 8, 0, 0, 0, 0, 0, 19, 1, 2, 1, 0, 0, 0, 0, 89, 69, 4, 1, - 0, 0, 0, 0, 136,40, 10, 0, 0, 0, 0, 0, 32, 9, 0, 0, 0, 0, 0, 0, 209,104,20, 0, 0, 0, 0, 0, 1, 105,0, 0, 0, 96, 2, 0, 10, 16, 6, 1, - 0, 0, 0, 0, 2, 0, 8, 1, 0, 0, 0, 0, 16, 5, 16, 0, 0, 0, 0, 0, 21, 73, 20, 1, 0, 0, 0, 0, 16, 176,4, 0, 0, 0, 0, 0, 21, 66, 28, 1, - 0, 32, 4, 0, 0, 32, 6, 0, 0, 32, 0, 0, 17, 96, 16, 0, 0, 96, 1, 0, 3, 32, 12, 0, 0, 32, 0, 0, 0, 0, 4, 2, 0, 232,0, 0, 17, 0, 0, 0, - 0, 176,8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 200,0, 0, 0, 64, 0, 0, 16, 19, 20, 1, 0, 0, 0, 0, 125,71, 12, 0, 0, 0, 0, 0, 1, 68, 24, 0, - 0, 232,0, 0, 19, 2, 4, 0, 0, 64, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 182,25, 65, 0, 0, 0, 0, 0, 21, 240,24, 0, 0, 120,16, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 48, 81, 4, 1, 0, 0, 0, 0, 8, 64, 10, 0, 0, 0, 0, 0, 93, 117,6, 1, 0, 0, 0, 0, 8, 34, 4, 1, 0, 0, 0, 0, 0, 4, 64, 2, - 0, 0, 0, 0, 92, 38, 4, 0, 0, 16, 0, 0, 12, 128,8, 0, 0, 0, 0, 0, 128,5, 28, 0, 0, 0, 1, 0, 57, 89, 16, 1, 0, 0, 0, 0, 32, 16, 16, 1, - 0, 0, 0, 0, 37, 32, 4, 0, 0, 240,32, 0, 83, 65, 0, 0, 0, 0, 0, 0, 0, 72, 36, 0, 16, 100,32, 0, 255,255,127,3, 0, 64, 0, 0, 32, 8, 0, 0, - 0, 32, 0, 0, 255,255,127,3, 0, 0, 0, 0, 2, 37, 94, 2, 0, 0, 0, 0, 151,73, 18, 3, 0, 0, 0, 0, 14, 44, 10, 0, 0, 0, 0, 0, 64, 40, 2, 0, - 0, 0, 0, 0, 2, 64, 16, 0, 0, 0, 0, 0, 8, 12, 12, 0, 0, 0, 0, 0, 144,141,32, 3, 0, 0, 0, 0, 0, 84, 0, 1, 0, 0, 0, 0, 153,105,18, 1, - 0, 0, 0, 0, 0, 149,2, 0, 0, 0, 0, 0, 0, 52, 6, 0, 0, 0, 0, 0, 137,248,78, 0, 0, 0, 0, 0, 0, 145,0, 0, 0, 0, 0, 0, 48, 5, 10, 0, - 0, 0, 0, 0, 81, 73, 16, 1, 0, 0, 0, 0, 0, 48, 66, 1, 0, 0, 0, 0, 17, 105,18, 0, 0, 0, 0, 0, 144,104,66, 0, 0, 0, 0, 0, 107,238,78, 2, - 0, 0, 0, 0, 81, 64, 0, 2, 0, 0, 0, 0, 9, 77, 0, 0, 0, 0, 0, 0, 153,69, 24, 0, 0, 96, 0, 0, 140,48, 110,0, 0, 0, 0, 0, 255,221,60, 1, - 0, 0, 0, 0, 160,60, 94, 0, 0, 0, 0, 0, 144,109,46, 1, 0, 0, 0, 0, 72, 0, 64, 0, 0, 0, 0, 0, 9, 6, 0, 0, 0, 0, 0, 0, 237,60, 132,0, - 0, 0, 0, 0, 65, 69, 4, 0, 0, 0, 0, 0, 148,128,8, 2, 0, 0, 0, 0, 3, 17, 64, 0, 0, 0, 0, 0, 179,81, 20, 0, 0, 0, 0, 0, 128,56, 6, 0, - 0, 32, 0, 0, 129,32, 38, 1, 0, 0, 0, 0, 16, 96, 12, 0, 0, 0, 0, 0, 19, 0, 16, 1, 0, 0, 0, 0, 144,0, 32, 2, 0, 0, 0, 0, 32, 32, 2, 0, - 0, 0, 0, 0, 65, 160,8, 2, 0, 0, 0, 0, 23, 253,22, 0, 0, 0, 0, 0, 8, 45, 30, 2, 0, 0, 0, 0, 153,56, 2, 0, 0, 0, 0, 0, 16, 124,2, 1, - 0, 32, 0, 0, 17, 12, 0, 0, 0, 0, 0, 0, 24, 0, 0, 2, 0, 0, 0, 0, 177,112,20, 0, 0, 0, 0, 0, 93, 247,92, 3, 0, 0, 0, 0, 219,61, 78, 2, - 0, 0, 0, 0, 17, 65, 26, 1, 0, 0, 0, 0, 132,0, 2, 0, 0, 0, 0, 0, 137,220,46, 0, 0, 0, 0, 0, 1, 72, 130,0, 0, 0, 0, 0, 17, 160,4, 0, - 0, 0, 0, 0, 8, 160,22, 0, 0, 0, 0, 0, 41, 96, 4, 3, 0, 0, 0, 0, 145,97, 2, 2, 0, 0, 0, 0, 128,168,6, 0, 0, 0, 0, 0, 49, 237,22, 0, - 0, 0, 0, 0, 136,48, 16, 0, 0, 0, 0, 0, 8, 65, 64, 0, 0, 0, 0, 0, 145,8, 4, 0, 0, 32, 0, 0, 223,255,126,3, 0, 0, 0, 0, 110,255,28, 1, - 0, 0, 0, 0, 17, 65, 16, 2, 0, 0, 0, 0, 16, 104,8, 1, 0, 96, 0, 0, 9, 1, 68, 0, 0, 0, 0, 0, 82, 52, 4, 3, 0, 32, 0, 0, 17, 4, 4, 0, - 0, 0, 0, 0, 209,81, 4, 1, 0, 0, 0, 0, 5, 1, 0, 1, 0, 0, 0, 0, 16, 68, 14, 0, 0, 32, 0, 0, 0, 168,4, 2, 0, 0, 0, 0, 0, 12, 12, 0, - 0, 0, 0, 0, 32, 128,32, 0, 0, 32, 0, 0, 17, 1, 0, 1, 0, 0, 0, 0, 49, 65, 4, 0, 0, 0, 0, 0, 128,33, 8, 0, 0, 0, 0, 0, 149,89, 20, 1, - 0, 0, 0, 0, 157,245,28, 2, 0, 0, 0, 0, 134,41, 10, 1, 0, 0, 0, 0, 16, 56, 2, 1, 0, 0, 0, 0, 65, 49, 18, 1, 0, 0, 0, 0, 32, 16, 64, 0, - 0, 0, 0, 0, 21, 52, 0, 0, 0, 0, 0, 0, 17, 121,16, 0, 0, 32, 0, 0, 2, 48, 0, 1, 0, 0, 0, 0, 2, 24, 2, 0, 0, 0, 0, 0, 24, 48, 12, 0, - 0, 0, 0, 0, 17, 121,18, 0, 0, 0, 0, 0, 66, 56, 2, 0, 0, 0, 0, 0, 0, 1, 24, 1, 0, 32, 0, 0, 149,127,94, 3, 0, 0, 0, 0, 6, 56, 6, 0, - 0, 32, 4, 0, 0, 0, 2, 0, 0, 96, 0, 0, 154,0, 68, 0, 0, 0, 0, 0, 129,96, 70, 0, 0, 0, 0, 0, 7, 1, 16, 0, 0, 0, 0, 0, 136,0, 2, 0, - 0, 0, 0, 0, 9, 32, 16, 0, 0, 0, 0, 0, 19, 48, 0, 0, 0, 0, 0, 0, 63, 253,14, 2, 0, 0, 0, 0, 160,16, 16, 0, 0, 0, 0, 0, 128,128,16, 0, - 0, 0, 0, 0, 17, 77, 16, 1, 0, 0, 0, 0, 8, 42, 0, 0, 0, 0, 0, 0, 21, 1, 20, 0, 0, 0, 0, 0, 207,61, 14, 0, 0, 0, 0, 0, 53, 72, 78, 0, - 0, 0, 0, 0, 0, 52, 12, 0, 0, 0, 0, 0, 155,81, 16, 0, 0, 0, 0, 0, 2, 52, 2, 0, 0, 0, 0, 0, 0, 66, 8, 0, 0, 0, 0, 0, 20, 16, 2, 0, - 0, 0, 0, 0, 128,116,0, 1, 0, 0, 0, 0, 13, 165,4, 1, 0, 0, 0, 0, 31, 51, 54, 0, 0, 32, 2, 0, 0, 4, 0, 0, 0, 32, 0, 0, 255,255,254,3, - 0, 0, 0, 0, 236,56, 110,1, 0, 0, 0, 0, 64, 8, 0, 1, 0, 0, 0, 0, 2, 41, 4, 0, 0, 0, 0, 0, 144,73, 12, 1, 0, 0, 0, 0, 19, 73, 0, 0, - 0, 0, 0, 0, 129,5, 4, 0, 0, 0, 0, 0, 9, 9, 2, 2, 0, 0, 0, 0, 238,184,110,2, 0, 0, 0, 0, 19, 1, 20, 1, 0, 0, 0, 0, 17, 72, 20, 1, - 0, 0, 0, 0, 20, 0, 2, 1, 0, 0, 0, 0, 149,64, 4, 0, 0, 0, 0, 0, 33, 8, 0, 0, 0, 0, 0, 0, 80, 8, 4, 0, 0, 0, 0, 0, 16, 120,6, 0, - 0, 0, 0, 0, 238,255,14, 2, 0, 0, 0, 0, 145,72, 8, 0, 0, 0, 0, 0, 145,12, 92, 0, 0, 0, 0, 0, 145,0, 12, 2, 0, 32, 0, 0, 3, 8, 4, 0, - 0, 0, 0, 0, 17, 5, 20, 0, 0, 0, 0, 0, 29, 253,44, 2, 0, 0, 0, 0, 138,16, 0, 0, 0, 0, 0, 64, 0, 1, 4, 0, 0, 0, 0, 0, 128,132,0, 0, - 0, 0, 0, 0, 17, 113,20, 1, 0, 0, 0, 0, 0, 48, 66, 0, 0, 0, 0, 0, 146,48, 10, 1, 0, 0, 0, 0, 64, 48, 80, 0, 0, 112,6, 0, 19, 18, 68, 0, - 0, 0, 0, 0, 16, 96, 8, 3, 0, 0, 0, 0, 51, 249,4, 0, 0, 0, 0, 0, 16, 8, 16, 0, 0, 0, 0, 0, 177,237,12, 0, 0, 32, 0, 0, 121,255,78, 3, - 0, 0, 0, 0, 73, 33, 2, 0, 0, 0, 0, 0, 17, 73, 2, 2, 0, 0, 0, 0, 4, 0, 128,1, 0, 0, 0, 0, 43, 13, 8, 1, 0, 0, 0, 0, 5, 28, 6, 0, - 0, 0, 0, 0, 89, 65, 64, 1, 0, 0, 0, 0, 8, 48, 18, 0, 0, 0, 0, 0, 15, 24, 78, 1, 0, 0, 0, 0, 2, 32, 22, 1, 0, 32, 0, 0, 17, 97, 84, 0, - 0, 32, 0, 0, 0, 32, 8, 0, 0, 0, 0, 0, 202,52, 112,0, 0, 0, 0, 0, 129,172,8, 0, 0, 0, 0, 0, 119,253,110,3, 0, 0, 0, 0, 16, 64, 4, 1, - 0, 0, 0, 0, 32, 0, 34, 0, 0, 0, 0, 0, 4, 60, 4, 0, 0, 0, 0, 0, 144,16, 36, 0, 0, 0, 0, 0, 17, 65, 12, 0, 0, 0, 0, 0, 1, 1, 32, 1, - 0, 0, 0, 0, 148,76, 12, 0, 0, 0, 0, 0, 3, 32, 0, 0, 0, 0, 0, 0, 144,1, 0, 2, 0, 0, 0, 0, 147,45, 76, 2, 0, 0, 0, 0, 0, 12, 2, 1, - 0, 0, 0, 0, 17, 105,0, 0, 0, 0, 0, 0, 149,105,26, 2, 0, 0, 0, 0, 16, 57, 0, 0, 0, 32, 0, 0, 17, 73, 96, 0, 0, 96, 44, 0, 206,60, 6, 0, - 0, 0, 0, 0, 17, 137,0, 0, 0, 0, 0, 0, 158,249,76, 0, 0, 0, 0, 0, 205,96, 34, 1, 0, 8, 2, 0, 2, 16, 32, 0, 0, 0, 0, 0, 17, 89, 114,3, - 0, 0, 0, 0, 78, 127,94, 3, 0, 0, 0, 0, 25, 5, 5, 0, 0, 0, 0, 0, 40, 8, 4, 0, 0, 0, 0, 0, 17, 81, 36, 0, 0, 0, 0, 0, 217,225,29, 0, - 0, 0, 0, 0, 17, 5, 8, 0, 0, 0, 0, 0, 5, 1, 26, 0, 0, 0, 0, 0, 8, 57, 2, 1, 0, 0, 0, 0, 24, 56, 42, 0, 0, 0, 0, 0, 1, 10, 0, 0, - 0, 0, 0, 0, 10, 127,62, 1, 0, 0, 0, 0, 42, 56, 22, 2, 0, 0, 0, 0, 128,48, 2, 0, 0, 0, 0, 0, 19, 72, 0, 0, 0, 0, 0, 0, 16, 8, 16, 1, - 0, 0, 0, 0, 51, 89, 4, 1, 16, 0, 0, 0, 9, 112,70, 2, 16, 0, 0, 0, 64, 0, 8, 0, 0, 0, 0, 0, 238,172,126,0, 0, 0, 0, 0, 23, 25, 8, 1, - 0, 0, 0, 0, 19, 73, 8, 2, 0, 0, 0, 0, 5, 100,6, 2, 0, 0, 0, 0, 144,72, 12, 2, 0, 0, 0, 0, 209,0, 0, 0, 0, 0, 0, 0, 127,253,110,2, - 0, 0, 0, 0, 128,64, 18, 0, 0, 0, 0, 0, 0, 96, 64, 0, 0, 0, 0, 0, 5, 48, 0, 0, 0, 32, 4, 0, 83, 211,6, 3, 0, 32, 0, 0, 130,24, 6, 1, - 0, 0, 0, 0, 27, 56, 10, 0, 0, 112,45, 0, 2, 16, 4, 0, 0, 0, 0, 0, 119,104,24, 0, 0, 0, 0, 0, 18, 0, 76, 0, 0, 0, 0, 0, 0, 33, 18, 0, - 0, 0, 0, 0, 66, 16, 76, 0, 0, 32, 0, 0, 0, 64, 8, 1, 0, 0, 0, 0, 16, 65, 4, 3, 0, 32, 0, 0, 23, 217,22, 2, 0, 32, 1, 0, 16, 8, 0, 1, - 0, 0, 0, 0, 221,125,46, 3, 0, 0, 0, 0, 130,34, 14, 0, 0, 0, 0, 0, 8, 33, 2, 0, 16, 0, 0, 0, 19, 41, 14, 0, 0, 0, 0, 0, 192,20, 4, 0, - 0, 0, 0, 0, 4, 16, 14, 0, 0, 32, 36, 0, 189,220,94, 0, 0, 32, 0, 0, 166,217,236,0, 0, 0, 0, 0, 0, 49, 2, 0, 0, 0, 0, 0, 3, 16, 10, 1, - 0, 0, 0, 0, 22, 96, 4, 0, 0, 0, 0, 0, 145,93, 8, 0, 0, 0, 0, 0, 17, 97, 4, 3, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 0, 0, 180,140,4, 0, - 0, 0, 0, 0, 71, 253,126,1, 0, 0, 0, 0, 4, 44, 8, 0, 0, 0, 0, 0, 211,112,0, 0, 0, 0, 0, 0, 3, 40, 12, 0, 0, 0, 0, 0, 150,185,84, 0, - 0, 0, 0, 0, 66, 32, 2, 1, 0, 0, 0, 0, 16, 0, 40, 0, 0, 0, 0, 0, 132,64, 8, 0, 0, 0, 0, 0, 18, 52, 8, 0, 0, 0, 0, 0, 9, 105,4, 0, - 0, 0, 0, 0, 149,125,30, 2, 0, 0, 0, 0, 20, 33, 0, 0, 0, 32, 0, 0, 49, 61, 12, 1, 0, 0, 0, 0, 6, 48, 6, 0, 0, 0, 0, 0, 4, 52, 8, 0, - 0, 0, 0, 0, 149,37, 12, 2, 0, 0, 0, 0, 66, 52, 0, 0, 0, 0, 0, 0, 16, 16, 68, 0, 0, 0, 0, 0, 5, 80, 16, 0, 0, 0, 0, 0, 145,105,6, 1, - 0, 0, 0, 0, 16, 32, 64, 0, 0, 96, 8, 0, 132,4, 4, 0, 0, 0, 0, 0, 18, 16, 2, 0, 0, 8, 0, 0, 81, 69, 2, 0, 0, 0, 0, 0, 3, 16, 4, 0, - 0, 0, 4, 0, 8, 4, 0, 0, 0, 0, 0, 2, 17, 67, 16, 1, 0, 0, 0, 0, 255,183,126,1, 0, 0, 0, 0, 6, 128,0, 0, 0, 32, 0, 0, 16, 33, 0, 0, - 0, 0, 0, 0, 247,241,46, 3, 0, 0, 0, 0, 34, 52, 4, 0, 0, 0, 0, 0, 58, 48, 4, 0, 0, 0, 0, 0, 186,148,76, 0, 0, 0, 0, 0, 5, 80, 0, 0, - 0, 32, 0, 0, 17, 149,0, 0, 0, 0, 0, 0, 9, 68, 0, 0, 0, 0, 0, 0, 37, 128,8, 0, 0, 0, 0, 0, 85, 176,12, 2, 0, 0, 0, 0, 17, 16, 4, 0, - 0, 0, 0, 0, 2, 48, 106,0, 0, 0, 0, 0, 21, 68, 8, 0, 0, 0, 0, 0, 92, 37, 12, 0, 0, 0, 0, 0, 40, 4, 12, 0, 0, 0, 0, 0, 147,120,4, 0, - 0, 0, 0, 0, 32, 128,4, 0, 0, 0, 0, 0, 158,245,62, 0, 0, 0, 0, 0, 36, 132,2, 0, 0, 0, 0, 0, 32, 129,0, 0, 0, 0, 0, 0, 16, 101,12, 0, - 0, 0, 0, 0, 94, 53, 172,2, 0, 0, 0, 0, 0, 48, 36, 0, 0, 0, 0, 0, 144,0, 8, 2, 0, 72, 16, 0, 121,33, 0, 0, 0, 0, 0, 0, 19, 69, 56, 1, - 0, 0, 0, 0, 119,140,58, 2, 0, 0, 0, 0, 18, 10, 0, 0, 0, 0, 0, 0, 148,133,4, 0, 0, 0, 0, 0, 50, 0, 4, 0, 0, 0, 0, 0, 159,137,94, 2, - 0, 0, 0, 0, 44, 8, 4, 0, 0, 0, 0, 0, 116,232,44, 2, 0, 0, 0, 0, 16, 20, 6, 0, 0, 0, 0, 0, 32, 128,38, 0, 0, 32, 40, 0, 144,88, 4, 0, - 0, 32, 0, 0, 2, 0, 8, 0, 0, 0, 0, 0, 176,128,0, 0, 0, 0, 0, 0, 16, 136,4, 0, 0, 0, 0, 0, 62, 204,222,1, 0, 0, 0, 0, 25, 65, 4, 0, - 0, 0, 0, 0, 14, 136,2, 0, 0, 0, 0, 0, 32, 132,0, 0, 0, 0, 0, 0, 16, 16, 4, 1, 0, 0, 0, 0, 32, 197,0, 0, 0, 0, 0, 0, 16, 129,2, 0, - 0, 0, 0, 0, 144,64, 76, 0, 0, 0, 0, 0, 17, 41, 4, 0, 0, 0, 0, 0, 28, 136,12, 0, 0, 0, 0, 0, 16, 64, 48, 0, 0, 0, 0, 0, 144,0, 12, 2, - 0, 0, 0, 0, 19, 73, 22, 3, 0, 0, 0, 0, 4, 36, 6, 1, 0, 80, 0, 0, 2, 40, 2, 0, 0, 0, 0, 0, 145,69, 20, 2, 0, 0, 0, 0, 18, 2, 0, 0, - 0, 0, 0, 0, 145,29, 0, 0, 0, 0, 0, 0, 76, 61, 32, 0, 0, 0, 0, 0, 198,185,78, 0, 0, 0, 0, 0, 18, 8, 4, 2, 0, 0, 0, 0, 16, 49, 0, 0, - 0, 0, 0, 0, 34, 16, 8, 0, 0, 0, 0, 0, 32, 164,4, 0, 0, 0, 0, 0, 2, 160,68, 0, 0, 0, 0, 0, 0, 2, 12, 2, 0, 0, 0, 0, 33, 89, 18, 0, - 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 81, 121,22, 0, 0, 0, 0, 0, 0, 44, 10, 0, 0, 0, 0, 0, 146,17, 4, 0, 0, 0, 0, 0, 4, 44, 46, 2, - 0, 0, 0, 0, 145,69, 20, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 12, 144,14, 0, 0, 0, 0, 0, 159,253,92, 1, 0, 0, 0, 0, 196,36, 78, 0, - 0, 0, 0, 0, 128,38, 4, 0, 0, 0, 0, 0, 7, 36, 4, 0, 0, 0, 0, 0, 145,80, 0, 0, 0, 0, 0, 0, 17, 81, 2, 1, 0, 0, 0, 0, 110,180,38, 2, - 0, 0, 0, 0, 144,0, 4, 2, 0, 0, 0, 0, 19, 249,20, 0, 0, 0, 0, 0, 8, 44, 10, 0, 0, 0, 0, 0, 127,119,78, 3, 0, 0, 0, 0, 0, 52, 10, 0, - 0, 0, 0, 0, 36, 36, 40, 0, 0, 0, 0, 0, 84, 38, 12, 0, 0, 0, 0, 0, 16, 160,100,0, 0, 0, 0, 0, 1, 44, 4, 0, 0, 0, 0, 0, 70, 173,14, 1, - 0, 0, 0, 0, 129,21, 0, 0, 0, 0, 0, 0, 84, 1, 12, 2, 0, 0, 0, 0, 53, 141,6, 0, 0, 32, 0, 0, 4, 40, 12, 1, 0, 0, 0, 0, 4, 44, 10, 0, - 0, 0, 0, 0, 255,245,126,3, 0, 0, 0, 0, 6, 173,8, 0, 0, 0, 0, 0, 144,0, 16, 2, 0, 0, 0, 0, 1, 32, 76, 1, 0, 0, 0, 0, 242,177,6, 0, - 0, 0, 0, 0, 4, 56, 32, 0, 0, 0, 0, 0, 145,24, 8, 0, 0, 0, 0, 0, 208,36, 18, 2, 0, 0, 0, 0, 151,93, 28, 3, 0, 0, 0, 0, 4, 44, 2, 0, - 0, 0, 0, 0, 17, 5, 0, 1, 0, 0, 0, 0, 22, 100,10, 0, 0, 0, 0, 0, 32, 0, 102,0, 0, 0, 0, 0, 17, 81, 20, 0, 0, 0, 0, 0, 17, 69, 18, 1, - 0, 0, 0, 0, 4, 4, 52, 0, 0, 32, 0, 0, 149,105,30, 3, 0, 0, 0, 0, 0, 164,98, 0, 0, 0, 0, 0, 107,44, 14, 1, 0, 0, 0, 0, 2, 8, 32, 0, - 0, 0, 0, 0, 4, 77, 12, 0, 0, 0, 0, 0, 1, 37, 8, 1, 0, 0, 0, 0, 4, 8, 10, 0, 0, 0, 0, 0, 1, 105,8, 0, 0, 0, 0, 0, 28, 77, 4, 0, - 0, 0, 0, 0, 128,0, 0, 3, 0, 0, 0, 0, 4, 0, 68, 0, 0, 0, 0, 0, 145,89, 16, 1, 0, 0, 0, 0, 0, 36, 10, 0, 0, 0, 0, 0, 21, 100,4, 0, - 0, 0, 0, 0, 4, 17, 128,1, 0, 0, 32, 0, 17, 101,22, 3, 0, 0, 0, 0, 255,191,124,3, 0, 0, 0, 0, 66, 144,8, 0, 0, 0, 0, 0, 144,0, 24, 0, - 0, 0, 0, 0, 20, 97, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 19, 177,0, 0, 0, 0, 0, 0, 85, 67, 76, 2, 0, 0, 0, 0, 17, 109,4, 2, - 0, 0, 0, 0, 8, 0, 64, 1, 0, 0, 0, 0, 0, 32, 40, 0, 0, 0, 0, 0, 4, 68, 8, 2, 0, 0, 0, 0, 36, 0, 68, 0, 0, 0, 0, 0, 144,20, 4, 2, - 0, 0, 0, 0, 247,191,124,1, 0, 0, 0, 0, 64, 16, 8, 0, 0, 0, 0, 0, 72, 48, 12, 0, 0, 0, 0, 0, 150,24, 4, 0, 0, 0, 0, 0, 16, 152,4, 0, - 0, 0, 0, 0, 24, 37, 8, 2, 0, 0, 0, 0, 193,5, 4, 1, 0, 0, 0, 0, 4, 8, 4, 2, 0, 0, 0, 0, 64, 8, 12, 2, 0, 0, 0, 0, 18, 33, 0, 0, - 0, 0, 0, 0, 94, 252,44, 3, 0, 0, 0, 0, 160,4, 0, 0, 0, 0, 0, 0, 66, 36, 14, 0, 0, 0, 0, 0, 80, 68, 4, 0, 0, 32, 0, 0, 144,148,12, 0, - 0, 0, 0, 0, 17, 49, 16, 0, 0, 32, 0, 0, 72, 48, 0, 0, 0, 0, 0, 0, 17, 75, 0, 1, 0, 0, 0, 0, 16, 44, 0, 0, 0, 32, 0, 0, 17, 32, 0, 0, - 0, 32, 0, 0, 17, 4, 0, 0, 0, 0, 0, 0, 32, 168,0, 0, 0, 0, 0, 0, 16, 1, 8, 2, 0, 0, 0, 0, 246,253,125,1, 0, 0, 0, 0, 194,60, 12, 2, - 0, 0, 0, 0, 144,16, 4, 0, 0, 0, 0, 0, 5, 9, 0, 0, 0, 0, 0, 0, 16, 148,2, 0, 0, 0, 0, 0, 27, 69, 4, 0, 0, 0, 0, 0, 32, 193,0, 0, - 0, 0, 0, 0, 132,32, 12, 0, 0, 0, 0, 0, 64, 128,12, 0, 0, 0, 0, 0, 92, 159,12, 3, 0, 0, 0, 0, 66, 24, 10, 0, 0, 0, 0, 0, 2, 0, 4, 2, - 0, 0, 0, 0, 146,25, 102,0, 0, 0, 0, 0, 1, 133,4, 0, 0, 0, 0, 0, 148,68, 12, 2, 0, 0, 0, 0, 0, 48, 32, 0, 0, 0, 0, 0, 72, 168,44, 2, - 0, 0, 0, 0, 128,9, 8, 0, 0, 0, 0, 0, 4, 16, 68, 0, 0, 0, 0, 0, 0, 52, 68, 2, 0, 32, 0, 0, 145,1, 94, 3, 0, 0, 0, 0, 132,58, 58, 1, - 0, 0, 0, 0, 18, 2, 128,0, 0, 0, 1, 0, 0, 0, 128,0, 0, 0, 0, 0, 255,255,78, 3, 0, 0, 0, 0, 0, 61, 10, 0, 0, 0, 0, 0, 64, 64, 8, 0, - 0, 0, 0, 0, 17, 73, 22, 0, 0, 0, 0, 0, 21, 44, 12, 0, 0, 0, 0, 0, 17, 4, 0, 2, 0, 0, 0, 0, 145,5, 16, 2, 0, 0, 0, 0, 17, 25, 8, 0, - 0, 0, 0, 0, 17, 72, 18, 2, 0, 0, 0, 0, 0, 10, 2, 0, 0, 0, 0, 0, 0, 105,0, 0, 0, 0, 0, 0, 134,181,14, 0, 0, 0, 0, 0, 0, 32, 4, 3, - 0, 0, 0, 0, 49, 32, 6, 0, 0, 0, 0, 0, 25, 40, 14, 0, 0, 0, 0, 0, 16, 12, 4, 0, 0, 0, 0, 0, 4, 136,8, 2, 0, 0, 0, 0, 0, 12, 72, 0, - 0, 0, 0, 0, 17, 73, 20, 0, 0, 0, 0, 0, 128,1, 18, 0, 0, 0, 0, 0, 151,223,76, 2, 0, 0, 0, 0, 68, 4, 4, 0, 0, 0, 0, 0, 129,0, 0, 2, - 0, 0, 0, 0, 1, 17, 16, 1, 0, 0, 0, 0, 51, 153,3, 0, 0, 0, 0, 0, 0, 120,6, 0, 0, 32, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 129,9, 0, 0, - 0, 0, 0, 0, 93, 93, 76, 2, 0, 0, 0, 0, 17, 9, 26, 0, 0, 0, 0, 0, 68, 112,4, 1, 0, 0, 0, 0, 148,16, 8, 0, 0, 0, 0, 0, 145,24, 32, 0, - 0, 0, 0, 0, 0, 156,0, 0, 0, 0, 0, 0, 53, 133,6, 0, 0, 0, 0, 0, 127,237,94, 3, 0, 0, 0, 0, 0, 1, 4, 3, 0, 0, 0, 0, 0, 12, 8, 0, - 0, 0, 0, 0, 213,8, 12, 0, 0, 0, 0, 0, 136,4, 68, 0, 0, 0, 0, 0, 133,4, 8, 0, 0, 0, 0, 0, 149,65, 24, 3, 0, 0, 0, 0, 0, 164,44, 0, - 0, 0, 0, 0, 0, 65, 64, 1, 0, 0, 0, 0, 149,37, 28, 2, 0, 0, 0, 0, 1, 45, 0, 0, 0, 0, 0, 0, 149,41, 28, 3, 0, 0, 0, 0, 17, 40, 0, 1, - 0, 0, 0, 0, 136,33, 0, 0, 0, 0, 0, 0, 3, 132,0, 0, 0, 0, 0, 0, 17, 49, 0, 1, 0, 0, 0, 0, 16, 152,10, 0, 0, 0, 0, 0, 4, 183,14, 2, - 0, 0, 0, 0, 25, 44, 8, 0, 0, 0, 0, 0, 16, 4, 16, 0, 0, 0, 0, 0, 211,255,30, 2, 0, 32, 0, 0, 16, 0, 6, 0, 0, 0, 0, 0, 4, 36, 8, 0, - 0, 0, 0, 0, 0, 5, 20, 0, 16, 252,18, 0, 255,255,252,3, 0, 0, 0, 0, 6, 49, 55, 0, 0, 0, 0, 0, 69, 40, 189,0, 0, 0, 0, 0, 16, 128,18, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 36, 12, 0, 0, 0, 0, 0, 27, 77, 30, 1, 0, 0, 0, 0, 10, 48, 26, 1, 0, 0, 0, 0, 66, 64, 2, 0, - 0, 0, 0, 0, 1, 88, 2, 0, 0, 0, 0, 0, 80, 49, 54, 1, 0, 0, 0, 0, 25, 33, 4, 0, 0, 0, 0, 0, 8, 36, 8, 0, 0, 0, 0, 0, 20, 0, 1, 0, - 0, 0, 0, 0, 128,4, 1, 0, 0, 0, 0, 0, 0, 48, 0, 3, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 145,93, 31, 3, 0, 0, 0, 0, 0, 33, 60, 3, - 0, 0, 0, 0, 40, 4, 70, 1, 0, 0, 0, 0, 25, 0, 8, 0, 0, 0, 0, 0, 0, 161,10, 0, 0, 0, 0, 0, 17, 121,4, 0, 0, 0, 0, 0, 68, 48, 54, 1, - 0, 0, 0, 0, 27, 121,92, 1, 0, 64, 0, 0, 66, 36, 68, 1, 0, 0, 0, 0, 11, 40, 70, 0, 0, 0, 0, 0, 64, 32, 16, 0, 0, 32, 0, 0, 106,24, 12, 0, - 0, 0, 0, 0, 192,24, 46, 0, 0, 0, 0, 0, 49, 77, 18, 0, 0, 0, 0, 0, 4, 32, 62, 1, 0, 0, 0, 0, 0, 16, 34, 0, 0, 0, 0, 0, 17, 32, 10, 0, - 0, 0, 0, 0, 16, 104,22, 1, 0, 0, 0, 0, 92, 0, 10, 0, 0, 0, 0, 0, 0, 48, 8, 2, 0, 0, 0, 0, 81, 121,86, 0, 0, 0, 0, 0, 12, 48, 14, 2, - 0, 0, 0, 0, 65, 0, 8, 0, 0, 0, 0, 0, 98, 16, 5, 0, 0, 0, 0, 0, 0, 33, 36, 0, 0, 0, 0, 0, 0, 96, 72, 0, 0, 0, 0, 0, 17, 113,26, 0, - 0, 0, 0, 0, 0, 130,10, 0, 0, 0, 0, 0, 0, 48, 18, 0, 0, 0, 0, 0, 78, 236,14, 2, 0, 0, 0, 0, 208,64, 12, 0, 0, 0, 0, 0, 8, 16, 4, 1, - 0, 0, 0, 0, 17, 192,16, 2, 0, 0, 0, 0, 0, 41, 4, 1, 0, 0, 0, 0, 145,113,4, 1, 0, 0, 0, 0, 178,57, 110,1, 0, 0, 0, 0, 136,0, 0, 1, - 0, 0, 0, 0, 17, 32, 12, 0, 0, 0, 0, 0, 32, 0, 72, 0, 0, 0, 0, 0, 17, 77, 16, 0, 0, 32, 0, 0, 0, 44, 8, 0, 0, 0, 0, 0, 6, 112,8, 0, - 0, 0, 0, 0, 129,128,0, 0, 0, 0, 0, 0, 59, 213,20, 1, 0, 0, 0, 0, 77, 33, 142,3, 0, 0, 0, 0, 69, 33, 8, 0, 0, 0, 0, 0, 4, 4, 15, 0, - 0, 0, 0, 0, 29, 77, 30, 0, 0, 0, 0, 0, 5, 0, 14, 1, 0, 32, 0, 0, 128,65, 52, 1, 0, 32, 0, 0, 0, 0, 18, 1, 0, 32, 0, 0, 16, 0, 4, 3, - 0, 0, 0, 0, 21, 33, 6, 0, 0, 0, 0, 0, 20, 0, 10, 0, 0, 0, 0, 0, 0, 97, 30, 0, 0, 0, 0, 0, 8, 1, 12, 0, 0, 0, 0, 0, 81, 0, 8, 0, - 0, 0, 0, 0, 145,221,30, 0, 0, 0, 0, 0, 253,245,61, 3, 0, 0, 0, 0, 192,65, 30, 0, 0, 0, 0, 0, 145,73, 12, 2, 0, 32, 0, 0, 0, 72, 14, 1, - 0, 0, 0, 0, 243,93, 127,1, 0, 0, 0, 0, 4, 36, 48, 2, 0, 0, 0, 0, 40, 32, 38, 1, 0, 0, 0, 0, 0, 80, 4, 0, 0, 0, 0, 0, 0, 44, 98, 0, - 0, 0, 0, 0, 0, 32, 44, 1, 0, 0, 0, 0, 151,28, 8, 0, 0, 0, 0, 0, 201,40, 108,1, 0, 0, 0, 0, 251,253,94, 0, 0, 0, 32, 0, 160,40, 34, 0, - 0, 0, 0, 0, 186,0, 0, 0, 0, 0, 0, 0, 153,0, 8, 0, 0, 0, 0, 0, 81, 32, 24, 0, 0, 0, 0, 0, 49, 0, 4, 1, 0, 0, 0, 0, 0, 48, 0, 1, - 0, 0, 0, 0, 0, 1, 22, 0, 0, 0, 0, 0, 59, 69, 0, 0, 0, 0, 0, 0, 209,65, 10, 2, 0, 0, 0, 0, 96, 32, 16, 0, 0, 0, 0, 0, 32, 8, 2, 0, - 0, 0, 0, 0, 73, 33, 14, 2, 0, 0, 0, 0, 153,201,94, 0, 0, 0, 0, 0, 72, 40, 10, 0, 0, 0, 0, 0, 16, 44, 10, 1, 0, 0, 0, 0, 25, 40, 12, 0, - 0, 0, 1, 0, 4, 9, 2, 0, 0, 0, 0, 0, 223,245,126,3, 0, 0, 0, 0, 86, 49, 108,0, 0, 0, 0, 0, 17, 97, 0, 1, 0, 0, 0, 0, 89, 52, 68, 3, - 0, 0, 0, 0, 13, 112,172,2, 0, 0, 0, 0, 20, 33, 93, 0, 0, 0, 0, 0, 132,4, 1, 0, 0, 0, 0, 0, 2, 41, 0, 0, 0, 0, 0, 0, 22, 16, 52, 0, - 0, 0, 0, 0, 0, 0, 69, 0, 0, 160,0, 0, 66, 0, 68, 0, 0, 0, 0, 0, 149,205,124,3, 0, 0, 0, 0, 64, 41, 12, 0, 0, 0, 0, 0, 4, 40, 10, 0, - 0, 32, 0, 0, 8, 34, 4, 0, 0, 0, 0, 0, 19, 93, 80, 0, 0, 0, 0, 0, 0, 32, 80, 1, 0, 0, 0, 0, 0, 100,8, 0, 0, 0, 0, 0, 17, 77, 80, 0, - 0, 0, 0, 0, 0, 41, 14, 0, 0, 4, 0, 0, 20, 89, 30, 0, 0, 0, 0, 0, 4, 32, 32, 0, 0, 0, 0, 0, 213,101,62, 3, 0, 0, 0, 0, 0, 53, 7, 0, - 0, 0, 0, 0, 20, 40, 134,0, 0, 0, 0, 0, 28, 1, 8, 0, 0, 0, 0, 0, 1, 1, 4, 2, 0, 0, 0, 0, 0, 9, 20, 0, 0, 0, 0, 0, 101,116,28, 0, - 0, 0, 0, 0, 0, 32, 22, 1, 0, 0, 0, 0, 17, 33, 18, 1, 0, 0, 0, 0, 68, 48, 0, 0, 0, 0, 0, 0, 126,189,238,2, 0, 0, 0, 0, 145,0, 4, 1, - 0, 0, 0, 0, 10, 32, 8, 0, 0, 0, 0, 0, 10, 16, 0, 0, 0, 0, 0, 0, 19, 121,14, 0, 0, 0, 0, 0, 29, 1, 8, 0, 0, 96, 0, 0, 6, 40, 4, 0, - 0, 0, 0, 0, 17, 40, 8, 1, 0, 32, 0, 0, 29, 65, 12, 2, 0, 0, 0, 0, 9, 1, 16, 0, 0, 0, 0, 0, 29, 120,12, 0, 0, 0, 0, 0, 1, 64, 4, 2, - 0, 0, 0, 0, 145,113,26, 2, 0, 0, 0, 0, 81, 65, 2, 3, 0, 0, 0, 0, 76, 40, 12, 0, 0, 0, 0, 0, 12, 1, 72, 0, 0, 0, 0, 0, 21, 40, 14, 3, - 0, 0, 0, 0, 24, 1, 8, 0, 0, 0, 0, 0, 89, 32, 10, 1, 0, 0, 0, 0, 80, 96, 4, 0, 0, 0, 0, 0, 4, 41, 2, 1, 0, 0, 0, 0, 89, 33, 0, 0, - 0, 0, 0, 0, 191,57, 110,1, 0, 0, 0, 0, 17, 32, 0, 1, 0, 0, 0, 0, 14, 17, 12, 0, 0, 0, 0, 0, 17, 17, 12, 0, 0, 0, 0, 0, 189,249,60, 0, - 0, 0, 0, 0, 32, 0, 48, 0, 0, 64, 0, 0, 21, 73, 16, 3, 0, 0, 0, 0, 28, 65, 30, 2, 64, 0, 0, 0, 165,160,44, 1, 0, 0, 0, 0, 48, 2, 0, 0, - 0, 0, 2, 0, 1, 0, 4, 0, 0, 0, 0, 0, 238,253,46, 2, 0, 0, 0, 0, 50, 89, 36, 1, 0, 0, 0, 0, 0, 2, 16, 0, 0, 0, 0, 0, 20, 16, 0, 1, - 0, 0, 0, 0, 25, 97, 4, 2, 0, 0, 0, 0, 176,1, 12, 0, 0, 0, 0, 0, 8, 50, 0, 1, 0, 0, 0, 0, 145,69, 24, 1, 0, 0, 0, 0, 136,0, 6, 0, - 0, 32, 32, 0, 162,16, 68, 1, 0, 0, 0, 0, 8, 56, 6, 0, 0, 0, 0, 0, 80, 1, 68, 0, 0, 0, 0, 0, 128,32, 18, 0, 0, 0, 0, 0, 64, 65, 2, 0, - 0, 0, 0, 0, 16, 40, 114,0, 0, 0, 0, 0, 128,0, 1, 0, 0, 0, 0, 0, 149,77, 26, 3, 0, 0, 0, 0, 17, 57, 16, 0, 0, 0, 0, 0, 2, 17, 0, 1, - 0, 0, 0, 0, 4, 48, 19, 0, 0, 0, 0, 0, 22, 32, 14, 2, 0, 32, 0, 0, 191,188,126,2, 0, 0, 0, 0, 19, 80, 32, 0, 0, 0, 0, 0, 53, 76, 26, 0, - 0, 0, 0, 0, 2, 8, 96, 0, 0, 0, 0, 0, 16, 0, 50, 0, 0, 0, 1, 0, 144,81, 70, 1, 0, 0, 0, 0, 213,121,86, 2, 0, 0, 0, 0, 5, 40, 30, 2, - 0, 96, 0, 0, 17, 0, 6, 0, 0, 0, 0, 0, 19, 64, 12, 0, 0, 0, 0, 0, 32, 24, 22, 0, 0, 0, 0, 0, 0, 32, 76, 0, 0, 32, 0, 0, 144,0, 0, 0, - 0, 0, 0, 0, 19, 115,10, 0, 0, 0, 0, 0, 19, 4, 0, 0, 0, 0, 0, 0, 48, 21, 0, 0, 0, 0, 0, 0, 255,190,174,0, 0, 0, 0, 0, 49, 112,4, 1, - 0, 0, 0, 0, 145,1, 0, 1, 0, 32, 0, 0, 1, 8, 8, 0, 0, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 211,65, 68, 0, 0, 0, 0, 0, 144,64, 0, 2, - 0, 0, 0, 0, 149,41, 28, 1, 0, 0, 0, 0, 149,48, 10, 2, 0, 0, 0, 0, 17, 16, 16, 0, 0, 0, 0, 0, 19, 69, 72, 0, 0, 0, 0, 0, 23, 253,16, 0, - 0, 0, 0, 0, 0, 33, 6, 1, 0, 0, 0, 0, 20, 68, 2, 0, 0, 0, 0, 0, 5, 40, 2, 0, 0, 0, 0, 0, 20, 32, 6, 0, 0, 0, 0, 0, 0, 97, 4, 1, - 0, 32, 0, 0, 153,9, 12, 1, 0, 64, 0, 0, 255,109,28, 3, 0, 96, 0, 0, 128,128,66, 0, 0, 0, 0, 0, 16, 73, 14, 0, 0, 0, 0, 0, 17, 8, 24, 1, - 0, 0, 0, 0, 16, 0, 68, 1, 0, 0, 0, 0, 208,96, 156,0, 0, 0, 1, 0, 4, 33, 178,0, 0, 0, 0, 0, 25, 0, 24, 0, 0, 32, 0, 0, 42, 184,14, 0, - 0, 32, 0, 0, 215,193,8, 0, 0, 0, 0, 0, 1, 8, 12, 0, 0, 0, 0, 0, 0, 65, 32, 0, 0, 0, 0, 0, 21, 237,30, 0, 0, 0, 0, 0, 64, 36, 2, 0, - 0, 0, 0, 0, 0, 0, 10, 2, 0, 0, 0, 0, 17, 13, 0, 0, 0, 0, 0, 0, 21, 241,218,0, 0, 64, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 4, 33, 80, 1, - 0, 0, 0, 0, 151,253,28, 3, 0, 0, 0, 0, 17, 121,0, 0, 0, 0, 0, 0, 16, 160,2, 1, 16, 0, 0, 0, 159,93, 14, 2, 0, 32, 0, 0, 64, 65, 4, 0, - 0, 240,47, 0, 0, 96, 0, 0, 0, 64, 0, 0, 32, 0, 16, 0, 0, 0, 0, 0, 108,193,4, 0, 0, 0, 0, 0, 17, 17, 22, 1, 0, 0, 0, 0, 146,157,4, 0, - 0, 0, 0, 0, 215,180,46, 3, 0, 0, 0, 0, 144,32, 64, 1, 0, 0, 0, 0, 8, 40, 14, 1, 0, 0, 0, 0, 72, 1, 12, 0, 0, 0, 0, 0, 32, 0, 68, 0, - 0, 0, 0, 0, 20, 41, 15, 1, 0, 32, 1, 0, 144,73, 4, 0, 0, 0, 0, 0, 216,0, 12, 0, 0, 0, 0, 0, 64, 64, 9, 0, 0, 0, 0, 0, 21, 32, 12, 0, - 0, 0, 0, 0, 21, 65, 14, 3, 0, 0, 0, 0, 12, 32, 0, 1, 0, 0, 0, 0, 29, 17, 10, 1, 0, 32, 0, 0, 146,64, 40, 0, 0, 0, 0, 0, 17, 17, 152,0, - 0, 0, 0, 0, 20, 36, 4, 0, 0, 160,0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 155,56, 62, 0, 0, 0, 0, 0, 136,129,0, 1, 0, 64, 0, 0, 2, 164,0, 0, - 0, 0, 0, 0, 51, 64, 16, 0, 16, 0, 0, 0, 255,255,127,3, 0, 0, 0, 0, 2, 245,71, 0, 0, 0, 0, 0, 81, 96, 0, 0, 0, 0, 0, 0, 19, 85, 30, 1, - 0, 0, 0, 0, 24, 0, 10, 1, 0, 0, 0, 0, 25, 81, 8, 0, 0, 96, 40, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 64, 44, 0, 0, 0, 0, 0, 149,69, 16, 0, - 0, 0, 0, 0, 0, 40, 58, 0, 0, 0, 0, 0, 49, 76, 12, 0, 0, 0, 0, 0, 34, 0, 68, 0, 0, 32, 4, 0, 176,185,12, 0, 0, 0, 0, 0, 8, 16, 10, 1, - 0, 0, 0, 0, 91, 77, 12, 2, 0, 0, 0, 0, 238,180,126,2, 0, 0, 0, 0, 149,93, 6, 0, 0, 0, 0, 0, 18, 4, 8, 1, 0, 0, 0, 0, 216,4, 4, 0, - 0, 0, 0, 0, 0, 24, 4, 2, 0, 0, 0, 0, 20, 28, 44, 0, 0, 0, 0, 0, 0, 64, 16, 2, 0, 0, 0, 0, 49, 72, 12, 0, 0, 0, 0, 0, 230,9, 14, 0, - 0, 0, 0, 0, 1, 192,24, 0, 0, 0, 0, 0, 18, 65, 4, 0, 0, 0, 0, 0, 209,121,16, 0, 0, 0, 0, 0, 16, 48, 12, 0, 0, 96, 0, 0, 182,57, 68, 1, - 0, 32, 0, 0, 145,128,0, 0, 0, 32, 0, 0, 9, 57, 76, 0, 0, 0, 0, 0, 31, 95, 74, 1, 0, 0, 0, 0, 17, 128,24, 1, 0, 0, 0, 0, 10, 32, 0, 0, - 0, 0, 0, 0, 17, 193,0, 1, 0, 0, 0, 0, 146,4, 6, 1, 0, 0, 0, 0, 87, 128,4, 0, 0, 0, 0, 0, 10, 0, 1, 0, 0, 0, 0, 0, 23, 253,8, 0, - 0, 0, 0, 0, 66, 160,54, 0, 0, 0, 0, 0, 17, 65, 22, 0, 0, 0, 0, 0, 128,8, 70, 1, 0, 0, 0, 0, 64, 40, 20, 0, 0, 0, 0, 0, 26, 65, 4, 0, - 0, 0, 0, 0, 255,127,253,2, 0, 0, 0, 0, 132,52, 2, 0, 0, 0, 0, 0, 243,121,71, 3, 0, 32, 0, 0, 135,24, 20, 0, 0, 0, 0, 0, 16, 72, 16, 0, - 0, 0, 0, 0, 34, 144,64, 0, 0, 0, 0, 0, 128,24, 12, 0, 0, 0, 0, 0, 17, 12, 8, 1, 0, 0, 0, 0, 203,52, 94, 0, 0, 0, 0, 0, 243,237,18, 0, - 0, 0, 0, 0, 40, 88, 2, 1, 0, 0, 0, 0, 32, 40, 2, 0, 0, 0, 0, 0, 145,77, 4, 0, 0, 0, 0, 0, 0, 160,112,0, 0, 0, 0, 0, 5, 56, 10, 1, - 0, 0, 0, 0, 29, 109,12, 0, 0, 0, 0, 0, 144,96, 4, 2, 0, 0, 0, 0, 0, 32, 26, 0, 0, 32, 0, 0, 146,4, 12, 0, 0, 32, 0, 0, 72, 0, 0, 0, - 0, 0, 0, 0, 177,245,12, 0, 0, 0, 0, 0, 0, 144,36, 0, 0, 0, 0, 0, 145,81, 4, 1, 0, 0, 0, 0, 148,69, 8, 2, 0, 0, 0, 0, 0, 36, 96, 0, - 0, 0, 0, 0, 32, 0, 24, 0, 0, 0, 0, 0, 151,221,28, 3, 0, 48, 4, 0, 3, 56, 0, 0, 0, 0, 0, 0, 20, 0, 24, 0, 0, 0, 0, 0, 0, 160,64, 0, - 0, 0, 0, 0, 151,125,126,2, 0, 0, 0, 0, 33, 16, 0, 0, 0, 0, 0, 0, 134,96, 134,0, 0, 0, 0, 0, 5, 0, 16, 0, 0, 0, 0, 0, 49, 89, 6, 1, - 0, 32, 0, 0, 250,210,78, 0, 0, 0, 0, 0, 8, 4, 8, 2, 0, 0, 0, 0, 17, 105,38, 1, 0, 0, 0, 0, 60, 106,70, 2, 0, 0, 0, 0, 160,32, 0, 0, - 0, 0, 0, 0, 17, 177,84, 1, 0, 0, 0, 0, 73, 96, 16, 0, 0, 0, 16, 0, 19, 65, 0, 2, 0, 64, 0, 0, 2, 116,34, 0, 0, 32, 0, 0, 1, 69, 4, 0, - 0, 0, 0, 0, 134,4, 146,0, 0, 4, 0, 0, 23, 73, 80, 1, 0, 0, 0, 0, 121,64, 40, 0, 0, 0, 0, 0, 1, 0, 66, 0, 0, 0, 0, 0, 2, 1, 66, 1, - 0, 0, 0, 0, 10, 193,6, 1, 0, 0, 0, 0, 33, 128,0, 0, 0, 0, 0, 0, 44, 49, 42, 0, 0, 0, 0, 0, 128,16, 4, 0, 0, 0, 0, 0, 27, 105,22, 2, - 0, 0, 0, 0, 4, 40, 28, 0, 0, 0, 0, 0, 8, 40, 6, 2, 0, 0, 0, 0, 153,69, 20, 1, 0, 0, 0, 0, 145,105,14, 0, 0, 0, 0, 0, 155,251,86, 1, - 0, 0, 0, 0, 8, 48, 10, 1, 0, 0, 0, 0, 2, 16, 6, 1, 0, 0, 0, 0, 128,24, 0, 0, 0, 0, 0, 0, 217,65, 82, 2, 0, 0, 0, 0, 0, 33, 66, 0, - 0, 0, 0, 0, 8, 128,6, 0, 0, 0, 0, 0, 230,160,126,2, 0, 0, 0, 0, 1, 0, 72, 2, 0, 0, 0, 0, 97, 89, 79, 0, 0, 0, 0, 0, 144,81, 20, 1, - 0, 0, 0, 0, 215,75, 86, 0, 0, 96, 2, 0, 0, 64, 4, 0, 0, 0, 0, 0, 21, 32, 28, 0, 0, 0, 0, 0, 32, 40, 20, 0, 0, 32, 0, 0, 25, 112,78, 0, - 0, 0, 0, 0, 13, 44, 14, 0, 0, 0, 0, 0, 145,213,16, 0, 0, 0, 0, 0, 16, 2, 8, 0, 0, 32, 2, 0, 1, 253,72, 2, 0, 0, 0, 0, 16, 160,4, 0, - 0, 0, 0, 0, 0, 152,128,0, 0, 0, 0, 0, 83, 209,16, 2, 0, 0, 0, 0, 68, 32, 134,1, 0, 0, 0, 0, 0, 65, 4, 1, 0, 0, 0, 0, 8, 40, 0, 2, - 0, 0, 0, 0, 9, 64, 8, 0, 0, 0, 0, 0, 93, 105,12, 2, 0, 0, 0, 0, 1, 97, 2, 0, 0, 112,32, 0, 24, 64, 0, 0, 0, 0, 0, 0, 0, 8, 70, 1, - 0, 0, 0, 0, 191,255,126,1, 0, 0, 0, 0, 6, 36, 0, 0, 0, 0, 0, 0, 1, 0, 72, 0, 0, 0, 0, 0, 8, 32, 38, 0, 0, 0, 0, 0, 48, 224,12, 0, - 0, 0, 0, 0, 65, 0, 0, 1, 0, 0, 0, 0, 136,0, 72, 0, 0, 0, 0, 0, 8, 1, 64, 0, 0, 0, 0, 0, 118,253,14, 0, 0, 0, 0, 0, 3, 0, 8, 0, - 0, 0, 0, 0, 10, 8, 8, 0, 0, 0, 0, 0, 80, 1, 4, 1, 0, 0, 0, 0, 144,1, 4, 1, 0, 0, 0, 0, 17, 201,22, 2, 0, 0, 0, 0, 0, 0, 30, 2, - 0, 0, 0, 0, 12, 64, 0, 0, 0, 0, 0, 0, 0, 16, 6, 3, 0, 0, 0, 0, 95, 117,31, 3, 0, 0, 0, 0, 128,41, 4, 0, 0, 0, 0, 0, 89, 56, 12, 1, - 0, 0, 0, 0, 21, 0, 12, 2, 0, 0, 0, 0, 1, 64, 8, 2, 0, 0, 0, 0, 21, 124,12, 0, 0, 0, 0, 0, 93, 64, 0, 0, 0, 0, 0, 0, 183,101,12, 2, - 0, 0, 0, 0, 12, 32, 34, 0, 0, 0, 0, 0, 20, 36, 14, 1, 0, 96, 0, 0, 0, 4, 4, 0, 0, 0, 1, 0, 18, 72, 70, 0, 0, 0, 0, 0, 147,1, 30, 2, - 0, 0, 0, 0, 129,192,0, 0, 0, 32, 0, 0, 95, 173,239,0, 0, 0, 0, 0, 16, 121,4, 1, 0, 0, 0, 0, 19, 56, 10, 0, 0, 32, 0, 0, 19, 1, 36, 0, - 0, 0, 0, 0, 25, 97, 0, 1, 0, 0, 0, 0, 117,65, 36, 0, 0, 0, 0, 0, 67, 40, 12, 0, 0, 240,63, 0, 255,251,30, 3, 0, 240,3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 16, 16, 16, 1, 0, 0, 0, 0, 133,64, 2, 0, 0, 0, 0, 0, 4, 0, 34, 0, 0, 96, 4, 0, 75, 113,6, 0, 0, 32, 0, 0, 17, 209,28, 1, - 0, 0, 0, 0, 64, 72, 4, 0, 0, 0, 0, 0, 159,61, 14, 1, 0, 0, 0, 0, 0, 44, 6, 0, 0, 0, 0, 0, 20, 17, 4, 1, 0, 0, 0, 0, 24, 16, 0, 0, - 0, 0, 0, 0, 31, 96, 4, 0, 0, 0, 0, 0, 17, 97, 0, 2, 0, 64, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 9, 1, 92, 0, 0, 4, 0, 0, 140,12, 8, 1, - 0, 4, 0, 0, 0, 2, 0, 0, 0, 32, 0, 0, 64, 0, 8, 0, 0, 32, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 68, 168,22, 0, 0, 0, 0, 0, 73, 32, 4, 0, - 0, 0, 0, 0, 1, 0, 134,0, 0, 0, 0, 0, 19, 93, 18, 1, 0, 0, 0, 0, 132,0, 98, 0, 0, 0, 0, 0, 0, 16, 68, 0, 0, 0, 0, 0, 149,69, 18, 3, - 0, 32, 0, 0, 161,0, 4, 0, 0, 0, 0, 0, 1, 36, 2, 1, 0, 0, 0, 0, 61, 108,28, 0, 0, 0, 0, 0, 145,113,6, 1, 0, 0, 0, 0, 24, 32, 10, 1, - 0, 224,63, 0, 14, 80, 4, 1, 0, 32, 0, 0, 12, 8, 0, 0, 0, 0, 0, 0, 1, 4, 0, 1, 0, 0, 0, 0, 217,93, 120,1, 0, 0, 0, 0, 4, 52, 66, 0, - 0, 0, 0, 0, 20, 32, 32, 0, 0, 0, 0, 0, 64, 8, 32, 0, 0, 0, 0, 0, 130,8, 0, 0, 0, 0, 0, 0, 206,172,46, 0, 0, 0, 0, 0, 3, 4, 2, 0, - 0, 0, 0, 0, 130,64, 0, 0, 0, 0, 0, 0, 16, 5, 8, 0, 0, 0, 0, 0, 4, 16, 2, 0, 0, 0, 0, 0, 136,20, 8, 0, 0, 0, 1, 0, 160,0, 68, 0, - 0, 0, 0, 0, 217,97, 4, 0, 0, 0, 0, 0, 68, 36, 12, 2, 0, 32, 0, 0, 49, 65, 0, 0, 0, 0, 0, 0, 0, 130,0, 0, 0, 0, 0, 0, 4, 32, 44, 0, - 0, 32, 0, 0, 128,5, 0, 2, 0, 32, 0, 0, 128,32, 70, 0, 0, 0, 0, 0, 17, 73, 80, 0, 0, 0, 0, 0, 32, 32, 64, 0, 0, 0, 0, 0, 19, 153,20, 0, - 0, 32, 0, 0, 0, 19, 8, 1, 0, 0, 0, 0, 17, 32, 128,0, 0, 0, 0, 0, 16, 132,20, 1, 0, 0, 0, 0, 125,37, 12, 2, 0, 0, 0, 0, 18, 1, 10, 0, - 0, 0, 0, 0, 211,17, 39, 1, 0, 0, 0, 0, 16, 72, 16, 1, 0, 0, 0, 0, 82, 56, 2, 0, 0, 0, 0, 0, 3, 48, 42, 0, 0, 0, 0, 0, 177,0, 70, 0, - 0, 0, 0, 0, 0, 50, 8, 1, 0, 0, 0, 0, 49, 197,24, 0, 0, 0, 0, 0, 85, 13, 42, 3, 0, 0, 0, 0, 25, 32, 0, 0, 0, 0, 0, 0, 151,69, 12, 0, - 0, 0, 0, 0, 50, 1, 6, 1, 0, 0, 0, 0, 245,86, 78, 3, 0, 0, 0, 0, 16, 80, 6, 0, 0, 64, 0, 0, 50, 129,4, 0, 0, 0, 4, 0, 48, 0, 0, 0, - 0, 64, 0, 0, 16, 80, 24, 0, 0, 0, 0, 0, 10, 83, 0, 0, 0, 0, 0, 0, 72, 1, 0, 0, 0, 0, 0, 0, 127,125,62, 0, 0, 0, 0, 0, 0, 136,20, 0, - 0, 0, 0, 0, 19, 0, 2, 0, 0, 0, 0, 0, 25, 97, 0, 0, 0, 32, 0, 0, 0, 32, 2, 0, 0, 0, 0, 0, 17, 193,0, 0, 0, 0, 0, 0, 93, 108,220,1, - 0, 0, 0, 0, 136,16, 16, 0, 0, 32, 0, 0, 19, 3, 0, 0, 0, 0, 0, 0, 145,97, 12, 0, 0, 0, 0, 0, 1, 48, 4, 0, 0, 0, 0, 0, 221,9, 8, 0, - 80, 188,14, 64, 223,255,254,3, 0, 0, 0, 0, 131,28, 4, 0, 0, 0, 0, 0, 59, 131,12, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 128,0, 0, 0, - 0, 96, 32, 0, 68, 16, 4, 0, 16, 32, 0, 0, 255,255,255,3, 0, 64, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 204,40, 14, 2, 0, 0, 0, 0, 0, 1, 136,0, - 0, 0, 0, 0, 21, 5, 12, 0, 0, 32, 0, 0, 255,253,127,3, 0, 0, 0, 0, 174,232,119,1, 0, 0, 0, 0, 16, 25, 16, 0, 0, 0, 0, 0, 25, 0, 16, 0, - 0, 0, 0, 0, 129,73, 16, 0, 0, 0, 0, 0, 2, 8, 18, 0, 0, 0, 0, 0, 64, 32, 80, 0, 0, 0, 0, 0, 9, 100,70, 1, 0, 0, 0, 0, 0, 65, 18, 1, - 0, 32, 0, 0, 17, 109,24, 1, 0, 0, 0, 0, 12, 61, 2, 0, 0, 0, 0, 0, 9, 40, 4, 0, 0, 32, 0, 0, 72, 0, 6, 0, 0, 0, 0, 0, 0, 56, 96, 0, - 0, 0, 0, 0, 17, 96, 36, 0, 0, 0, 0, 0, 64, 4, 6, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 32, 0, 0, 25, 105,68, 1, 0, 0, 0, 0, 28, 40, 6, 1, - 0, 0, 0, 0, 73, 40, 12, 0, 0, 0, 0, 0, 68, 33, 18, 1, 0, 0, 0, 0, 66, 17, 16, 0, 0, 0, 0, 0, 1, 1, 32, 0, 0, 0, 0, 0, 86, 176,68, 0, - 0, 0, 0, 0, 223,125,94, 3, 0, 0, 0, 0, 96, 56, 66, 1, 0, 0, 0, 0, 17, 81, 18, 1, 0, 0, 0, 0, 16, 32, 132,0, 0, 0, 0, 0, 68, 0, 192,1, - 0, 0, 0, 0, 1, 59, 70, 0, 0, 0, 0, 0, 81, 40, 12, 0, 0, 240,33, 0, 0, 0, 32, 0, 0, 0, 0, 0, 100,44, 130,0, 0, 0, 0, 0, 72, 8, 0, 2, - 0, 0, 0, 0, 74, 40, 110,2, 0, 0, 0, 0, 137,225,0, 0, 0, 0, 0, 0, 49, 33, 18, 0, 0, 0, 0, 0, 219,249,86, 1, 0, 0, 0, 0, 136,40, 74, 2, - 0, 0, 0, 0, 137,0, 0, 0, 0, 0, 0, 0, 136,73, 4, 1, 0, 0, 0, 0, 24, 40, 46, 0, 0, 0, 0, 0, 24, 96, 8, 0, 0, 112,32, 0, 0, 16, 0, 0, - 0, 0, 0, 0, 28, 44, 28, 0, 0, 224,12, 0, 129,85, 4, 0, 0, 0, 0, 0, 2, 0, 32, 1, 0, 0, 0, 0, 0, 40, 40, 0, 0, 0, 0, 0, 0, 65, 14, 0, - 0, 0, 0, 0, 49, 32, 8, 0, 0, 0, 0, 0, 98, 112,86, 0, 0, 0, 0, 0, 0, 41, 0, 1, 0, 0, 0, 0, 57, 127,82, 0, 0, 0, 0, 0, 42, 190,174,1, - 0, 0, 0, 0, 17, 77, 0, 0, 0, 0, 0, 0, 25, 96, 8, 1, 0, 0, 0, 0, 65, 1, 6, 0, 0, 0, 0, 0, 0, 33, 22, 0, 0, 0, 0, 0, 9, 56, 0, 0, - 0, 0, 0, 0, 16, 85, 16, 0, 0, 0, 0, 0, 80, 120,64, 0, 0, 0, 0, 0, 125,124,142,3, 0, 32, 4, 0, 128,0, 4, 0, 0, 32, 0, 0, 151,89, 14, 0, - 0, 0, 0, 0, 113,89, 108,2, 0, 32, 0, 0, 0, 8, 14, 1, 0, 0, 0, 0, 1, 128,8, 0, 0, 4, 0, 0, 29, 93, 16, 0, 0, 0, 0, 0, 25, 0, 78, 0, - 0, 0, 0, 0, 21, 64, 20, 0, 0, 0, 0, 0, 28, 36, 0, 0, 0, 32, 0, 0, 93, 9, 12, 0, 0, 0, 0, 0, 149,77, 30, 0, 0, 0, 0, 0, 130,45, 46, 1, - 0, 0, 0, 0, 10, 253,30, 1, 0, 0, 0, 0, 9, 33, 0, 0, 0, 0, 0, 0, 32, 32, 108,0, 0, 96, 2, 0, 1, 1, 0, 1, 0, 0, 0, 0, 238,181,110,1, - 0, 32, 0, 0, 0, 33, 4, 0, 0, 0, 0, 0, 89, 4, 0, 0, 0, 32, 0, 0, 0, 0, 128,0, 0, 8, 0, 0, 228,100,110,1, 0, 0, 0, 0, 33, 4, 4, 0, - 0, 0, 0, 0, 0, 5, 0, 2, 0, 0, 0, 0, 87, 36, 12, 2, 0, 0, 0, 0, 152,69, 0, 0, 0, 32, 0, 0, 1, 65, 0, 0, 0, 0, 0, 0, 93, 69, 4, 0, - 0, 0, 0, 0, 0, 1, 100,0, 0, 0, 0, 0, 145,4, 4, 2, 0, 0, 0, 0, 85, 36, 26, 1, 0, 0, 0, 0, 21, 36, 4, 0, 0, 0, 0, 0, 4, 48, 66, 3, - 0, 0, 0, 0, 83, 65, 5, 0, 0, 0, 0, 0, 36, 104,58, 1, 0, 0, 0, 0, 129,1, 2, 0, 0, 0, 0, 0, 147,65, 6, 2, 0, 0, 0, 0, 8, 0, 6, 2, - 0, 0, 0, 0, 20, 4, 12, 0, 0, 0, 0, 0, 19, 89, 26, 0, 0, 96, 8, 0, 14, 184,14, 0, 0, 176,3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 4, 8, 1, - 0, 32, 0, 0, 8, 56, 2, 0, 0, 0, 0, 0, 68, 96, 8, 0, 0, 0, 1, 0, 4, 32, 18, 0, 0, 0, 0, 0, 8, 44, 4, 0, 16, 34, 0, 0, 255,255,255,3, - 0, 0, 0, 0, 202,124,126,0, 0, 0, 0, 0, 5, 0, 13, 0, 0, 0, 0, 0, 17, 89, 26, 1, 0, 0, 0, 0, 128,184,26, 0, 0, 0, 0, 0, 0, 68, 4, 0, - 0, 0, 0, 0, 0, 8, 38, 2, 0, 0, 0, 0, 3, 9, 4, 0, 0, 0, 0, 0, 87, 96, 2, 0, 0, 0, 0, 0, 64, 168,0, 2, 0, 0, 0, 0, 4, 2, 2, 0, - 0, 0, 0, 0, 69, 24, 30, 1, 0, 0, 0, 0, 145,73, 18, 1, 0, 32, 0, 0, 0, 104,12, 0, 0, 0, 0, 0, 21, 96, 4, 0, 0, 0, 0, 0, 32, 144,2, 0, - 0, 32, 0, 0, 16, 104,4, 0, 0, 0, 0, 0, 17, 64, 80, 0, 0, 0, 0, 0, 117,252,62, 0, 0, 0, 0, 0, 4, 4, 10, 0, 0, 0, 0, 0, 132,0, 20, 0, - 0, 0, 0, 0, 133,0, 8, 0, 0, 0, 0, 0, 2, 0, 80, 0, 0, 0, 0, 0, 64, 32, 24, 0, 0, 0, 0, 0, 149,105,4, 1, 0, 0, 0, 0, 10, 8, 7, 1, - 0, 0, 0, 0, 20, 96, 140,0, 0, 0, 0, 0, 149,127,86, 2, 0, 0, 0, 0, 179,221,24, 0, 0, 0, 0, 0, 129,8, 2, 0, 0, 0, 0, 0, 16, 68, 2, 0, - 0, 0, 0, 0, 145,73, 22, 3, 0, 0, 0, 0, 68, 8, 18, 1, 0, 0, 0, 0, 37, 108,4, 0, 0, 0, 8, 0, 8, 0, 4, 0, 0, 0, 0, 0, 49, 53, 14, 0, - 0, 32, 0, 0, 17, 9, 0, 0, 0, 0, 0, 0, 16, 76, 0, 0, 0, 0, 0, 0, 130,41, 2, 2, 0, 0, 0, 0, 145,140,22, 0, 0, 0, 0, 0, 0, 25, 0, 0, - 0, 0, 0, 0, 0, 8, 76, 0, 0, 0, 0, 0, 141,0, 8, 0, 0, 0, 0, 0, 254,63, 60, 2, 0, 0, 0, 0, 129,32, 2, 0, 0, 0, 0, 0, 217,65, 40, 2, - 0, 0, 0, 0, 16, 64, 0, 2, 0, 0, 0, 0, 132,1, 0, 0, 0, 0, 0, 0, 1, 65, 64, 0, 0, 0, 0, 0, 136,0, 4, 1, 0, 0, 0, 0, 145,69, 22, 3, - 0, 0, 0, 0, 1, 40, 8, 1, 0, 32, 0, 0, 17, 73, 0, 1, 0, 232,0, 0, 19, 17, 16, 0, 0, 176,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 96, 8, 2, - 0, 0, 0, 0, 17, 104,20, 0, 0, 32, 0, 0, 16, 5, 0, 0, 0, 32, 0, 0, 64, 184,28, 0, 0, 0, 0, 0, 29, 60, 46, 2, 0, 0, 0, 0, 68, 64, 8, 0, - 0, 0, 0, 0, 0, 49, 30, 0, 0, 32, 0, 0, 145,0, 12, 0, 0, 32, 0, 0, 0, 40, 14, 0, 0, 0, 0, 0, 17, 0, 24, 1, 0, 32, 0, 0, 0, 8, 14, 0, - 0, 0, 0, 0, 215,255,60, 1, 0, 224,4, 0, 148,58, 4, 0, 0, 0, 0, 0, 145,77, 2, 0, 0, 96, 0, 0, 128,40, 14, 0, 0, 0, 0, 0, 1, 4, 16, 0, - 0, 0, 0, 0, 217,69, 20, 0, 0, 32, 0, 0, 4, 0, 14, 0, 0, 96, 0, 0, 1, 8, 14, 2, 0, 32, 0, 0, 4, 32, 4, 0, 0, 32, 6, 0, 0, 40, 12, 0, - 0, 0, 0, 0, 149,68, 12, 0, 0, 0, 0, 0, 1, 33, 12, 2, 0, 240,12, 0, 209,221,126,1, 0, 0, 0, 0, 0, 36, 2, 2, 0, 0, 0, 0, 88, 40, 110,1, - 0, 32, 0, 0, 17, 129,12, 0, 0, 0, 0, 0, 16, 32, 12, 2, 0, 0, 0, 0, 32, 0, 116,0, 0, 0, 0, 0, 2, 80, 8, 0, 0, 0, 0, 0, 0, 176,4, 0, - 0, 32, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 16, 32, 10, 1, 0, 32, 0, 0, 80, 0, 4, 0, 0, 128,0, 0, 0, 40, 14, 0, 0, 0, 0, 0, 132,105,60, 2, - 0, 0, 0, 0, 41, 0, 8, 0, 0, 0, 2, 0, 16, 0, 4, 0, 0, 0, 0, 0, 10, 32, 4, 0, 0, 0, 0, 0, 16, 32, 14, 2, 0, 0, 0, 0, 2, 164,2, 2, - 0, 0, 0, 0, 24, 104,10, 0, 0, 0, 0, 0, 64, 32, 73, 0, 0, 0, 0, 0, 159,77, 24, 2, 0, 0, 0, 0, 4, 40, 192,0, 0, 0, 0, 0, 80, 13, 8, 0, - 0, 0, 0, 0, 51, 24, 0, 1, 0, 0, 0, 0, 4, 28, 0, 0, 0, 0, 0, 0, 68, 44, 0, 0, 0, 0, 0, 0, 145,105,28, 3, 0, 0, 0, 0, 85, 58, 22, 0, - 0, 114,12, 0, 221,69, 20, 3, 0, 0, 0, 0, 1, 12, 140,2, 0, 32, 0, 0, 16, 0, 5, 2, 0, 0, 0, 0, 0, 32, 86, 0, 0, 32, 0, 0, 0, 48, 6, 0, - 0, 0, 0, 0, 24, 64, 4, 0, 0, 0, 0, 0, 100,56, 12, 1, 0, 0, 0, 0, 133,7, 4, 1, 0, 0, 0, 0, 25, 1, 2, 0, 0, 32, 4, 0, 147,222,38, 0, - 0, 0, 0, 0, 64, 168,0, 0, 16, 0, 0, 0, 223,79, 63, 3, 0, 0, 0, 0, 141,125,14, 1, 0, 0, 0, 0, 17, 21, 0, 0, 0, 0, 0, 0, 32, 44, 2, 1, - 0, 0, 1, 0, 147,229,16, 0, 0, 96, 0, 0, 6, 28, 64, 0, 0, 0, 0, 0, 8, 36, 2, 0, 0, 0, 0, 0, 149,40, 0, 0, 0, 0, 0, 0, 69, 65, 8, 0, - 0, 0, 0, 0, 0, 32, 100,0, 0, 0, 0, 0, 4, 112,58, 0, 0, 68, 0, 0, 17, 89, 16, 1, 0, 0, 0, 0, 76, 160,71, 1, 0, 0, 0, 0, 24, 65, 8, 0, - 0, 0, 0, 0, 24, 41, 30, 1, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 53, 56, 32, 0, 0, 240,47, 0, 55, 221,76, 1, 0, 32, 0, 0, 128,64, 0, 0, - 0, 0, 0, 0, 70, 185,0, 0, 0, 0, 0, 0, 12, 168,2, 1, 0, 0, 0, 0, 149,125,62, 3, 0, 0, 0, 0, 207,189,110,1, 0, 0, 0, 0, 17, 0, 16, 2, - 0, 0, 0, 0, 26, 153,16, 0, 0, 0, 0, 0, 24, 123,22, 1, 0, 0, 0, 0, 0, 57, 86, 1, 0, 0, 0, 0, 85, 42, 4, 0, 0, 0, 0, 0, 0, 2, 4, 1, - 0, 0, 0, 0, 5, 24, 132,0, 0, 240,44, 0, 0, 0, 128,0, 0, 0, 0, 0, 16, 68, 16, 1, 0, 0, 0, 0, 154,117,22, 3, 0, 112,0, 0, 145,93, 22, 1, - 0, 0, 0, 0, 8, 109,86, 1, 0, 0, 0, 0, 145,32, 4, 0, 0, 32, 0, 0, 16, 1, 68, 1, 0, 240,63, 0, 8, 2, 4, 0, 0, 0, 0, 0, 17, 2, 4, 0, - 0, 0, 0, 0, 21, 120,132,0, 0, 0, 0, 0, 4, 96, 132,0, 0, 0, 0, 0, 4, 12, 14, 0, 0, 0, 0, 0, 0, 4, 68, 0, 0, 0, 0, 0, 126,189,46, 2, - 0, 0, 0, 0, 25, 9, 108,0, 0, 0, 0, 0, 89, 0, 4, 0, 0, 0, 0, 0, 4, 1, 4, 0, 0, 0, 0, 0, 16, 128,14, 1, 0, 0, 0, 0, 20, 32, 8, 2, - 0, 0, 0, 0, 146,65, 12, 0, 0, 0, 0, 0, 144,97, 8, 2, 0, 0, 0, 0, 17, 73, 6, 0, 0, 0, 0, 0, 128,4, 6, 1, 0, 240,14, 0, 191,209,204,0, - 0, 0, 0, 0, 8, 40, 0, 1, 0, 0, 0, 0, 16, 56, 4, 0, 0, 32, 0, 0, 17, 69, 20, 0, 0, 0, 0, 0, 1, 40, 4, 2, 0, 0, 0, 0, 1, 1, 144,0, - 16, 8, 0, 0, 191,249,126,2, 0, 0, 0, 0, 64, 44, 2, 0, 0, 0, 0, 0, 9, 32, 30, 0, 0, 0, 0, 0, 0, 44, 26, 0, 0, 0, 0, 0, 69, 0, 4, 0, - 0, 64, 0, 0, 144,64, 32, 0, 0, 0, 0, 0, 153,65, 18, 3, 0, 0, 0, 0, 160,32, 10, 0, 0, 160,4, 0, 0, 16, 2, 0, 0, 0, 0, 0, 0, 136,6, 1, - 0, 0, 0, 0, 17, 100,1, 0, 0, 0, 0, 0, 0, 32, 98, 0, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 20, 80, 2, 0, 0, 0, 0, 0, 36, 32, 66, 0, - 0, 0, 0, 0, 0, 73, 10, 0, 0, 8, 0, 0, 27, 101,88, 0, 0, 0, 4, 0, 255,255,127,2, 0, 0, 0, 0, 42, 56, 62, 0, 0, 0, 0, 0, 145,217,32, 0, - 0, 0, 0, 0, 16, 0, 164,0, 0, 0, 0, 0, 25, 33, 16, 0, 0, 0, 0, 0, 235,57, 94, 1, 0, 0, 0, 0, 144,0, 16, 0, 0, 0, 0, 0, 17, 217,32, 0, - 0, 0, 0, 0, 19, 145,0, 1, 0, 0, 0, 0, 28, 40, 12, 0, 0, 0, 0, 0, 88, 40, 46, 1, 0, 0, 0, 0, 145,33, 8, 1, 0, 0, 0, 0, 32, 57, 62, 1, - 0, 0, 0, 0, 25, 33, 8, 1, 0, 0, 0, 0, 17, 120,38, 0, 0, 0, 0, 0, 9, 97, 8, 0, 0, 0, 0, 0, 24, 0, 22, 1, 0, 0, 0, 0, 65, 249,126,1, - 0, 0, 0, 0, 80, 152,0, 0, 0, 0, 0, 0, 3, 17, 4, 0, 0, 0, 0, 0, 5, 101,32, 0, 0, 0, 0, 0, 192,0, 24, 0, 0, 0, 0, 0, 24, 53, 42, 1, - 0, 0, 0, 0, 30, 37, 106,1, 0, 0, 0, 0, 25, 9, 0, 0, 0, 0, 0, 0, 130,32, 6, 1, 0, 0, 0, 0, 19, 57, 14, 0, 0, 0, 0, 0, 192,32, 2, 0, - 0, 0, 0, 0, 196,48, 18, 0, 0, 0, 0, 0, 24, 9, 10, 0, 0, 0, 0, 0, 8, 41, 34, 1, 0, 0, 0, 0, 1, 0, 98, 0, 0, 0, 0, 0, 1, 8, 32, 0, - 0, 0, 0, 0, 16, 40, 82, 0, 0, 0, 0, 0, 1, 41, 114,0, 0, 0, 0, 0, 168,152,98, 1, 0, 0, 0, 0, 25, 33, 10, 0, 0, 0, 0, 0, 8, 40, 26, 0, - 0, 0, 0, 0, 145,73, 82, 0, 0, 0, 0, 0, 160,40, 122,0, 0, 0, 0, 0, 16, 1, 42, 1, 0, 0, 0, 0, 145,64, 72, 0, 0, 0, 0, 0, 128,32, 32, 0, - 0, 0, 0, 0, 2, 40, 34, 0, 0, 0, 0, 0, 2, 8, 40, 0, 0, 0, 0, 0, 8, 16, 92, 0, 0, 0, 0, 0, 132,33, 78, 0, 0, 0, 0, 0, 176,104,114,0, - 0, 0, 0, 0, 40, 161,72, 1, 0, 0, 0, 0, 17, 96, 8, 0, 0, 0, 0, 0, 81, 0, 96, 0, 0, 0, 0, 0, 65, 32, 10, 0, 0, 0, 0, 0, 116,33, 2, 1, - 0, 0, 0, 0, 16, 12, 8, 0, 0, 0, 0, 0, 48, 40, 110,0, 0, 0, 0, 0, 128,8, 106,0, 0, 0, 0, 0, 25, 32, 42, 0, 0, 0, 0, 0, 192,57, 20, 1, - 0, 0, 0, 0, 21, 121,110,1, 0, 0, 0, 0, 192,56, 36, 0, 0, 0, 0, 0, 8, 41, 14, 2, 0, 0, 0, 0, 17, 65, 0, 3, 0, 0, 0, 0, 26, 56, 46, 0, - 0, 0, 0, 0, 1, 96, 84, 1, 0, 0, 0, 0, 116,49, 122,1, 0, 0, 0, 0, 17, 121,6, 0, 0, 0, 0, 0, 148,0, 2, 0, 0, 0, 0, 0, 132,37, 14, 0, - 0, 0, 0, 0, 8, 128,10, 0, 0, 0, 0, 0, 2, 57, 26, 1, 0, 0, 0, 0, 49, 25, 110,0, 0, 0, 0, 0, 116,32, 12, 0, 0, 0, 0, 0, 192,8, 10, 0, - 0, 0, 0, 0, 0, 48, 64, 1, 0, 0, 0, 0, 0, 33, 26, 0, 0, 0, 0, 0, 72, 1, 2, 1, 0, 0, 0, 0, 72, 40, 14, 0, 0, 0, 0, 0, 16, 32, 42, 1, - 0, 0, 0, 0, 25, 32, 0, 1, 0, 0, 0, 0, 64, 8, 8, 0, 0, 0, 0, 0, 2, 0, 2, 1, 0, 0, 0, 0, 128,192,72, 0, 0, 0, 0, 0, 64, 0, 34, 0, - 0, 0, 0, 0, 8, 9, 10, 1, 0, 64, 0, 0, 64, 113,128,0, 0, 0, 0, 0, 65, 96, 4, 0, 16, 96, 0, 0, 255,255,254,3, 0, 0, 0, 0, 206,44, 30, 2, - 0, 0, 0, 0, 16, 64, 36, 0, 0, 0, 0, 0, 6, 8, 4, 0, 0, 0, 0, 0, 145,0, 2, 0, 0, 0, 0, 0, 24, 97, 76, 1, 0, 0, 0, 0, 144,72, 16, 0, - 0, 0, 0, 0, 130,152,68, 1, 0, 0, 0, 0, 133,69, 16, 3, 0, 0, 4, 0, 17, 9, 12, 0, 0, 0, 0, 0, 191,121,126,0, 0, 0, 0, 0, 0, 45, 70, 0, - 0, 0, 0, 0, 5, 25, 38, 2, 0, 0, 0, 0, 23, 120,56, 0, 0, 32, 0, 0, 22, 40, 76, 0, 0, 8, 0, 0, 0, 64, 4, 0, 0, 32, 0, 0, 129,69, 20, 0, - 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 4, 40, 16, 0, 0, 0, 0, 0, 17, 0, 0, 2, 0, 0, 0, 0, 36, 0, 102,2, 0, 0, 0, 0, 0, 40, 6, 2, - 0, 0, 0, 0, 220,60, 30, 0, 0, 0, 0, 0, 9, 68, 20, 0, 0, 0, 0, 0, 144,4, 8, 0, 0, 0, 0, 0, 16, 81, 4, 2, 0, 0, 0, 0, 209,105,22, 0, - 0, 0, 0, 0, 174,184,78, 0, 0, 0, 0, 0, 8, 144,4, 0, 0, 96, 8, 0, 16, 0, 12, 0, 0, 0, 0, 0, 9, 40, 32, 0, 0, 0, 0, 0, 130,0, 64, 0, - 0, 0, 0, 0, 27, 121,14, 0, 0, 0, 0, 0, 152,17, 0, 0, 0, 0, 0, 0, 220,110,142,0, 0, 0, 0, 0, 154,5, 12, 2, 0, 0, 0, 0, 20, 41, 12, 0, - 0, 32, 0, 0, 255,125,63, 3, 0, 0, 0, 0, 136,61, 30, 1, 0, 0, 0, 0, 92, 65, 4, 1, 0, 0, 0, 0, 21, 100,6, 1, 0, 0, 0, 0, 29, 44, 28, 0, - 0, 0, 0, 0, 89, 64, 0, 0, 0, 224,12, 0, 0, 32, 4, 0, 0, 0, 0, 0, 83, 65, 4, 1, 0, 0, 0, 0, 72, 32, 6, 0, 0, 0, 0, 0, 4, 52, 10, 1, - 0, 0, 0, 0, 52, 32, 12, 0, 0, 32, 0, 0, 0, 48, 78, 1, 0, 0, 0, 0, 13, 48, 12, 1, 0, 0, 0, 0, 53, 64, 0, 0, 0, 32, 0, 0, 16, 1, 4, 1, - 0, 0, 0, 0, 144,64, 8, 0, 0, 0, 0, 0, 24, 65, 68, 2, 0, 0, 0, 0, 65, 32, 4, 0, 0, 32, 4, 0, 1, 0, 4, 0, 0, 0, 0, 0, 18, 248,4, 1, - 0, 0, 0, 0, 0, 41, 6, 0, 16, 0, 0, 0, 221,111,156,2, 0, 0, 0, 0, 196,165,6, 0, 0, 0, 0, 0, 144,13, 0, 1, 0, 0, 0, 0, 144,73, 6, 1, - 0, 0, 0, 0, 23, 232,36, 2, 0, 0, 0, 0, 4, 40, 12, 2, 0, 0, 0, 0, 57, 56, 28, 2, 0, 0, 0, 0, 145,9, 68, 0, 0, 0, 0, 0, 49, 40, 12, 0, - 0, 0, 0, 0, 208,32, 0, 0, 0, 0, 0, 0, 0, 184,26, 0, 0, 0, 0, 0, 149,65, 88, 0, 0, 0, 0, 0, 209,101,16, 2, 0, 0, 0, 0, 156,0, 4, 0, - 0, 0, 0, 0, 32, 40, 64, 0, 0, 0, 0, 0, 128,168,12, 3, 0, 0, 0, 0, 145,69, 16, 1, 0, 0, 0, 0, 49, 12, 0, 0, 0, 0, 0, 0, 15, 104,108,0, - 0, 0, 0, 0, 16, 73, 92, 0, 0, 32, 0, 0, 17, 65, 0, 1, 0, 0, 0, 0, 1, 32, 12, 0, 0, 112,44, 0, 64, 65, 0, 0, 0, 0, 0, 0, 24, 56, 96, 0, - 0, 0, 0, 0, 18, 65, 0, 1, 0, 0, 0, 0, 245,120,72, 0, 0, 0, 0, 0, 149,81, 0, 0, 0, 0, 0, 0, 11, 32, 2, 1, 0, 0, 0, 0, 145,65, 0, 2, - 0, 0, 0, 0, 3, 9, 0, 0, 0, 0, 0, 0, 157,253,31, 2, 0, 0, 0, 0, 0, 16, 1, 0, 0, 0, 0, 0, 81, 1, 16, 1, 0, 0, 0, 0, 8, 8, 68, 0, - 0, 0, 0, 0, 13, 104,8, 0, 0, 0, 0, 0, 137,168,14, 2, 0, 0, 0, 0, 17, 121,2, 1, 0, 32, 0, 0, 21, 32, 0, 0, 0, 0, 0, 0, 8, 32, 4, 1, - 0, 64, 0, 0, 245,73, 30, 2, 0, 0, 0, 0, 142,185,142,1, 0, 32, 4, 0, 196,25, 84, 0, 0, 0, 0, 0, 24, 104,34, 0, 0, 0, 0, 0, 17, 65, 48, 1, - 0, 0, 0, 0, 8, 0, 140,0, 0, 32, 8, 0, 16, 81, 4, 0, 0, 0, 0, 0, 17, 128,8, 0, 0, 0, 0, 0, 21, 40, 36, 0, 0, 0, 0, 0, 128,64, 140,1, - 0, 96, 0, 0, 10, 189,6, 0, 0, 32, 20, 0, 0, 4, 0, 0, 0, 0, 0, 0, 80, 45, 0, 0, 0, 0, 0, 0, 13, 40, 6, 0, 0, 0, 0, 0, 19, 0, 12, 0, - 0, 32, 0, 0, 1, 64, 20, 0, 0, 0, 0, 0, 25, 40, 6, 0, 0, 0, 0, 0, 130,89, 4, 0, 0, 0, 0, 0, 17, 65, 1, 3, 0, 72, 0, 0, 0, 80, 16, 0, - 0, 8, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 80, 4, 2, 0, 0, 0, 0, 129,112,12, 2, 0, 0, 0, 0, 8, 64, 64, 0, 0, 0, 0, 0, 149,92, 30, 0, - 0, 0, 0, 0, 144,8, 6, 0, 0, 0, 0, 0, 16, 41, 50, 0, 0, 240,63, 0, 31, 155,12, 0, 0, 32, 0, 0, 21, 69, 4, 0, 0, 0, 0, 0, 4, 36, 4, 0, - 0, 32, 0, 0, 49, 89, 4, 0, 0, 32, 0, 0, 16, 65, 0, 0, 0, 0, 0, 0, 80, 108,10, 0, 0, 0, 8, 0, 17, 73, 20, 1, 0, 112,12, 0, 0, 16, 4, 0, - 0, 0, 0, 0, 2, 0, 6, 1, 0, 32, 0, 0, 247,252,78, 0, 0, 0, 0, 0, 128,72, 2, 0, 0, 0, 0, 0, 8, 48, 4, 0, 0, 0, 0, 0, 29, 64, 8, 1, - 0, 0, 0, 0, 255,237,126,1, 0, 10, 0, 0, 34, 20, 76, 0, 0, 0, 0, 0, 18, 0, 64, 0, 0, 0, 0, 0, 144,65, 24, 0, 0, 0, 0, 0, 144,66, 0, 0, - 0, 0, 0, 0, 141,44, 14, 0, 0, 0, 0, 0, 0, 36, 0, 1, 0, 0, 0, 0, 20, 100,4, 0, 0, 0, 0, 0, 25, 96, 4, 2, 0, 0, 0, 0, 148,32, 4, 2, - 0, 0, 0, 0, 32, 0, 20, 0, 0, 0, 0, 0, 201,40, 22, 0, 16, 0, 0, 0, 1, 33, 0, 1, 0, 0, 0, 0, 17, 89, 2, 0, 0, 0, 0, 0, 16, 11, 10, 0, - 0, 0, 0, 0, 21, 5, 0, 1, 0, 0, 0, 0, 5, 68, 0, 0, 0, 0, 0, 0, 0, 4, 34, 0, 0, 0, 0, 0, 145,77, 50, 0, 0, 16, 0, 0, 24, 48, 68, 1, - 0, 240,45, 0, 152,10, 6, 3, 0, 240,48, 0, 0, 0, 0, 0, 0, 96, 0, 0, 66, 0, 4, 0, 0, 0, 0, 0, 0, 8, 108,1, 0, 0, 0, 0, 255,253,95, 2, - 0, 0, 0, 0, 72, 52, 6, 2, 0, 32, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 17, 88, 18, 0, 0, 0, 0, 0, 157,172,78, 1, 0, 32, 0, 0, 8, 4, 8, 0, - 0, 0, 0, 0, 0, 1, 24, 0, 0, 0, 0, 0, 23, 104,28, 0, 0, 0, 0, 0, 16, 8, 4, 2, 0, 0, 0, 0, 27, 81, 100,1, 0, 0, 0, 0, 243,113,110,1, - 0, 0, 0, 0, 64, 49, 18, 1, 0, 0, 0, 0, 9, 32, 14, 1, 0, 240,0, 0, 10, 8, 14, 0, 0, 0, 0, 0, 85, 244,6, 0, 0, 32, 0, 0, 17, 0, 12, 0, - 0, 0, 0, 0, 0, 32, 74, 1, 0, 0, 0, 0, 1, 192,8, 0, 0, 32, 0, 0, 0, 32, 46, 0, 0, 0, 0, 0, 20, 8, 0, 2, 0, 0, 0, 0, 16, 96, 0, 2, - 0, 0, 0, 0, 19, 113,20, 0, 0, 0, 0, 0, 0, 20, 2, 0, 0, 0, 32, 0, 4, 32, 4, 0, 0, 0, 0, 0, 255,103,190,3, 0, 0, 0, 0, 135,62, 14, 1, - 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 0, 0, 144,4, 0, 1, 0, 0, 0, 0, 8, 16, 2, 1, 0, 0, 0, 0, 121,73, 68, 1, 0, 96, 4, 0, 173,73, 78, 1, - 0, 0, 0, 0, 128,0, 18, 0, 0, 0, 0, 0, 4, 64, 2, 0, 0, 0, 0, 0, 9, 65, 44, 1, 0, 0, 0, 0, 144,73, 22, 2, 0, 32, 0, 0, 255,112,180,0, - 0, 0, 0, 0, 128,76, 16, 0, 0, 0, 0, 0, 148,4, 12, 0, 0, 0, 0, 0, 145,73, 4, 0, 0, 0, 0, 0, 129,24, 78, 1, 0, 0, 0, 0, 52, 32, 140,0, - 0, 96, 0, 0, 33, 0, 2, 0, 0, 0, 0, 0, 69, 40, 30, 2, 0, 0, 0, 0, 4, 1, 20, 0, 0, 0, 0, 0, 128,68, 8, 0, 0, 0, 0, 0, 17, 69, 22, 3, - 0, 0, 0, 0, 24, 32, 2, 1, 0, 0, 0, 0, 84, 1, 12, 0, 0, 0, 0, 0, 12, 40, 12, 0, 0, 0, 0, 0, 23, 255,126,2, 0, 0, 0, 0, 110,123,38, 0, - 0, 0, 0, 0, 8, 9, 4, 1, 0, 0, 0, 0, 21, 48, 4, 0, 0, 0, 0, 0, 8, 252,76, 0, 0, 0, 0, 0, 17, 109,0, 0, 0, 0, 0, 0, 16, 48, 32, 0, - 0, 0, 0, 0, 21, 9, 0, 1, 0, 0, 32, 0, 0, 0, 4, 0, 0, 0, 0, 0, 17, 125,18, 0, 0, 32, 0, 0, 0, 160,66, 0, 0, 0, 0, 0, 25, 100,0, 0, - 0, 32, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 1, 136,0, 0, 0, 4, 0, 0, 145,205,24, 1, 0, 0, 0, 0, 16, 104,4, 0, 0, 96, 0, 0, 8, 64, 4, 0, - 0, 0, 0, 0, 17, 73, 22, 1, 0, 64, 0, 0, 0, 17, 0, 1, 0, 96, 0, 0, 12, 0, 4, 0, 0, 0, 0, 0, 181,117,14, 2, 0, 32, 0, 0, 17, 9, 16, 0, - 0, 0, 0, 0, 21, 1, 18, 0, 0, 0, 0, 0, 68, 0, 12, 0, 0, 0, 0, 0, 0, 144,32, 0, 0, 0, 0, 0, 13, 64, 16, 0, 0, 0, 0, 0, 26, 69, 2, 0, - 0, 0, 0, 0, 21, 89, 4, 1, 0, 0, 0, 0, 16, 33, 32, 0, 0, 0, 0, 0, 25, 81, 28, 0, 0, 0, 0, 0, 1, 64, 48, 0, 0, 0, 0, 0, 192,116,14, 2, - 0, 0, 0, 0, 17, 97, 82, 2, 0, 0, 0, 0, 128,36, 8, 0, 0, 96, 0, 0, 130,64, 16, 0, 0, 0, 0, 0, 1, 67, 32, 0, 0, 96, 0, 0, 133,212,128,0, - 0, 0, 4, 0, 0, 48, 0, 0, 0, 0, 0, 0, 146,8, 0, 0, 16, 0, 2, 0, 255,255,255,3, 0, 0, 0, 0, 74, 45, 8, 1, 0, 0, 0, 0, 18, 73, 20, 1, - 0, 32, 0, 0, 17, 1, 0, 0, 0, 0, 0, 0, 1, 64, 12, 2, 0, 0, 0, 0, 149,4, 8, 2, 0, 0, 0, 0, 217,73, 22, 3, 0, 0, 0, 0, 40, 40, 0, 0, - 0, 32, 0, 0, 16, 73, 4, 0, 0, 0, 0, 0, 1, 96, 12, 0, 0, 0, 0, 0, 17, 17, 8, 0, 0, 0, 0, 0, 17, 72, 0, 1, 16, 0, 0, 0, 100,32, 5, 0, - 0, 0, 0, 0, 142,56, 62, 0, 0, 0, 0, 0, 2, 20, 4, 0, 0, 0, 4, 0, 48, 73, 0, 0, 0, 0, 0, 0, 209,73, 82, 0, 0, 0, 0, 0, 8, 48, 32, 0, - 0, 0, 0, 0, 25, 121,22, 1, 0, 0, 0, 0, 6, 185,114,0, 0, 0, 0, 0, 65, 8, 2, 0, 0, 0, 0, 0, 4, 32, 24, 0, 0, 0, 0, 0, 19, 25, 0, 0, - 0, 0, 0, 0, 16, 60, 14, 0, 0, 0, 0, 0, 1, 65, 0, 2, 0, 0, 4, 0, 0, 18, 0, 0, 0, 0, 0, 0, 131,201,6, 0, 0, 0, 0, 0, 125,237,28, 3, - 0, 0, 0, 0, 4, 33, 38, 0, 0, 0, 0, 0, 132,52, 14, 1, 0, 0, 0, 0, 16, 4, 72, 0, 0, 0, 0, 0, 81, 65, 4, 0, 0, 0, 0, 0, 8, 52, 30, 1, - 0, 96, 0, 0, 14, 16, 4, 0, 0, 0, 0, 0, 12, 36, 8, 0, 0, 0, 0, 0, 1, 68, 8, 0, 0, 0, 0, 0, 16, 69, 2, 2, 16, 32, 1, 0, 31, 209,4, 0, - 0, 32, 0, 0, 0, 32, 0, 1, 0, 0, 0, 0, 253,119,62, 2, 0, 0, 0, 0, 220,24, 30, 0, 0, 0, 0, 0, 28, 64, 3, 0, 0, 0, 0, 0, 145,13, 26, 0, - 0, 0, 0, 0, 16, 64, 32, 0, 0, 0, 0, 0, 17, 73, 14, 1, 0, 0, 0, 0, 8, 9, 0, 1, 0, 0, 0, 0, 0, 106,4, 0, 0, 0, 0, 0, 0, 36, 50, 2, - 0, 0, 0, 0, 73, 8, 12, 1, 0, 32, 0, 0, 1, 1, 8, 0, 0, 240,63, 0, 130,144,4, 1, 0, 32, 0, 0, 17, 69, 18, 0, 0, 0, 0, 0, 1, 72, 6, 0, - 0, 32, 0, 0, 0, 120,2, 0, 0, 0, 0, 0, 85, 100,13, 2, 0, 128,0, 0, 177,89, 12, 0, 0, 240,47, 0, 2, 16, 4, 0, 0, 0, 0, 0, 221,249,142,2, - 0, 0, 0, 0, 129,72, 16, 1, 0, 0, 0, 0, 128,64, 2, 1, 0, 0, 0, 0, 16, 1, 96, 1, 0, 0, 0, 0, 17, 85, 10, 0, 0, 0, 0, 0, 80, 32, 2, 1, - 0, 0, 0, 0, 80, 0, 32, 0, 0, 96, 40, 0, 0, 0, 4, 0, 0, 0, 0, 0, 247,243,62, 3, 0, 0, 0, 0, 70, 41, 53, 3, 0, 0, 0, 0, 66, 0, 56, 0, - 0, 0, 0, 0, 25, 64, 24, 1, 0, 96, 0, 0, 0, 0, 2, 0, 0, 32, 0, 0, 119,187,54, 3, 0, 0, 0, 0, 9, 129,5, 0, 0, 0, 0, 0, 84, 10, 4, 0, - 0, 0, 0, 0, 64, 96, 26, 1, 0, 0, 0, 0, 0, 0, 2, 3, 0, 32, 0, 0, 94, 252,14, 0, 0, 0, 1, 0, 17, 65, 0, 0, 0, 32, 4, 0, 90, 153,86, 0, - 0, 0, 0, 0, 245,153,12, 0, 0, 32, 0, 0, 169,8, 6, 0, 0, 0, 0, 0, 19, 17, 0, 0, 0, 96, 12, 0, 128,146,6, 1, 0, 0, 0, 0, 144,1, 6, 3, - 0, 0, 0, 0, 17, 129,12, 0, 0, 32, 1, 0, 0, 16, 4, 0, 0, 0, 0, 64, 127,253,127,1, 0, 0, 0, 0, 94, 45, 110,3, 0, 0, 0, 0, 88, 64, 40, 0, - 0, 0, 0, 0, 129,64, 24, 0, 0, 0, 0, 0, 136,0, 16, 0, 0, 0, 0, 0, 132,40, 0, 0, 16, 0, 0, 0, 191,123,14, 1, 0, 0, 0, 0, 5, 64, 8, 2, - 0, 0, 0, 0, 150,1, 0, 0, 0, 0, 0, 0, 8, 33, 4, 0, 0, 112,0, 0, 57, 64, 12, 0, 0, 0, 0, 0, 23, 124,76, 1, 0, 0, 0, 0, 80, 65, 32, 0, - 0, 0, 0, 0, 148,68, 4, 0, 0, 0, 0, 0, 14, 40, 76, 2, 0, 0, 0, 0, 80, 65, 12, 0, 0, 0, 0, 0, 8, 16, 88, 0, 0, 0, 0, 0, 1, 40, 2, 1, - 0, 32, 0, 0, 144,64, 46, 0, 0, 0, 0, 0, 146,65, 4, 0, 0, 0, 0, 0, 209,89, 20, 1, 0, 0, 0, 0, 0, 13, 4, 0, 0, 0, 0, 0, 0, 56, 2, 2, - 0, 0, 0, 0, 52, 48, 4, 0, 0, 0, 0, 0, 255,221,29, 2, 0, 0, 0, 0, 0, 5, 4, 0, 0, 0, 0, 0, 17, 0, 18, 1, 0, 0, 0, 0, 129,65, 2, 0, - 0, 0, 0, 0, 32, 32, 100,0, 0, 0, 0, 0, 2, 56, 6, 1, 0, 0, 0, 0, 1, 64, 96, 0, 0, 0, 0, 0, 0, 128,100,0, 0, 0, 16, 0, 19, 89, 0, 1, - 0, 0, 0, 0, 17, 73, 66, 1, 0, 0, 0, 0, 40, 0, 2, 0, 0, 0, 0, 0, 153,73, 28, 3, 0, 0, 0, 0, 70, 24, 2, 1, 0, 0, 0, 0, 19, 0, 6, 0, - 0, 96, 0, 0, 162,9, 68, 0, 0, 0, 0, 0, 33, 72, 32, 0, 0, 64, 0, 0, 68, 60, 194,0, 0, 0, 0, 0, 150,81, 70, 0, 0, 0, 0, 0, 13, 40, 110,2, - 0, 0, 0, 0, 153,65, 8, 0, 0, 0, 0, 0, 76, 5, 12, 0, 0, 0, 0, 0, 55, 3, 4, 0, 0, 0, 0, 0, 16, 64, 12, 0, 0, 0, 0, 0, 17, 33, 0, 1, - 0, 0, 0, 0, 21, 9, 12, 1, 0, 96, 0, 0, 0, 152,46, 1, 0, 0, 0, 0, 48, 129,68, 1, 0, 0, 0, 0, 9, 80, 6, 0, 0, 0, 0, 0, 16, 48, 20, 0, - 0, 32, 0, 0, 66, 16, 12, 0, 0, 0, 0, 0, 91, 41, 10, 0, 0, 0, 0, 0, 144,105,0, 0, 0, 0, 0, 0, 25, 104,4, 0, 0, 0, 0, 0, 89, 105,0, 2, - 0, 128,16, 0, 145,72, 22, 0, 0, 4, 0, 0, 231,255,124,0, 0, 0, 0, 0, 68, 128,80, 2, 0, 0, 0, 0, 4, 0, 72, 2, 0, 4, 0, 0, 1, 148,0, 0, - 0, 4, 4, 0, 76, 225,58, 0, 0, 128,0, 0, 0, 1, 4, 0, 0, 0, 8, 0, 200,96, 102,1, 16, 0, 0, 0, 255,255,126,3, 0, 0, 0, 0, 8, 48, 66, 1, - 0, 0, 0, 0, 148,68, 20, 2, 0, 0, 0, 0, 16, 9, 2, 0, 0, 0, 0, 0, 255,145,38, 0, 0, 0, 0, 0, 25, 73, 0, 1, 0, 0, 0, 0, 197,40, 14, 0, - 0, 0, 0, 0, 4, 4, 0, 2, 0, 0, 0, 0, 37, 0, 8, 0, 0, 0, 0, 0, 241,41, 86, 0, 0, 0, 0, 0, 1, 40, 14, 0, 0, 0, 0, 0, 0, 18, 2, 0, - 0, 0, 0, 0, 154,0, 4, 0, 0, 0, 0, 0, 153,5, 24, 0, 0, 0, 0, 0, 255,109,107,2, 0, 0, 0, 0, 24, 32, 10, 0, 0, 0, 0, 0, 11, 33, 4, 0, - 0, 0, 0, 0, 68, 100,4, 0, 0, 0, 0, 0, 1, 0, 130,0, 0, 0, 0, 0, 62, 188,46, 0, 0, 0, 0, 0, 145,64, 20, 0, 0, 0, 0, 0, 1, 72, 18, 0, - 0, 0, 0, 0, 4, 0, 8, 1, 0, 0, 0, 0, 129,0, 18, 0, 0, 0, 0, 0, 43, 144,12, 0, 0, 0, 0, 0, 253,109,30, 3, 0, 0, 0, 0, 32, 0, 2, 2, - 0, 0, 0, 0, 144,5, 2, 1, 0, 0, 0, 0, 17, 117,64, 1, 0, 0, 0, 0, 145,65, 92, 3, 0, 0, 0, 0, 128,32, 0, 1, 0, 0, 0, 0, 4, 0, 10, 3, - 0, 0, 0, 0, 20, 96, 46, 2, 0, 0, 0, 0, 16, 40, 0, 1, 0, 0, 0, 0, 144,3, 0, 2, 0, 0, 0, 0, 125,253,94, 2, 0, 0, 0, 0, 12, 125,110,1, - 0, 0, 0, 0, 32, 1, 2, 0, 0, 0, 0, 0, 28, 40, 0, 0, 0, 32, 0, 0, 16, 0, 2, 1, 0, 48, 0, 0, 8, 0, 4, 0, 0, 0, 0, 0, 129,65, 0, 1, - 0, 0, 0, 0, 64, 0, 16, 2, 0, 0, 0, 0, 213,109,93, 2, 0, 0, 0, 0, 64, 8, 40, 0, 0, 0, 0, 0, 24, 88, 60, 0, 0, 0, 0, 0, 17, 5, 26, 1, - 0, 0, 0, 0, 85, 44, 9, 0, 0, 104,2, 0, 131,125,4, 0, 0, 0, 0, 0, 17, 65, 26, 0, 0, 0, 0, 0, 16, 0, 14, 0, 0, 0, 0, 0, 64, 132,0, 0, - 16, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 145,88, 0, 0, 0, 0, 0, 0, 2, 24, 68, 0, 16, 0, 0, 0, 25, 97, 0, 1, 0, 0, 0, 0, 36, 161,2, 0, - 0, 240,63, 0, 64, 0, 4, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149,105,28, 3, 0, 0, 0, 0, 66, 32, 74, 0, 0, 0, 0, 0, 17, 9, 16, 0, - 0, 64, 0, 0, 17, 72, 0, 1, 0, 0, 0, 0, 2, 64, 6, 0, 0, 0, 0, 0, 36, 4, 0, 0, 0, 0, 0, 0, 1, 160,0, 0, 0, 8, 0, 0, 0, 128,8, 0, - 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 128,37, 0, 1, 0, 192,0, 64, 255,255,222,0, 0, 0, 0, 0, 6, 136,2, 0, 0, 0, 0, 0, 0, 88, 6, 0, - 0, 0, 0, 0, 0, 48, 16, 0, 0, 0, 0, 0, 128,73, 0, 0, 0, 0, 0, 0, 8, 132,2, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 145,32, 24, 1, - 0, 0, 0, 0, 29, 121,26, 0, 0, 0, 0, 0, 21, 0, 4, 0, 0, 0, 0, 0, 145,201,9, 2, 0, 0, 0, 0, 2, 48, 64, 0, 0, 0, 0, 0, 36, 4, 1, 0, - 0, 0, 0, 0, 128,1, 26, 1, 0, 0, 0, 0, 2, 65, 4, 0, 16, 116,56, 0, 255,255,255,3, 0, 0, 0, 0, 24, 32, 12, 1, 0, 0, 0, 0, 0, 67, 0, 0, - 0, 0, 0, 0, 12, 6, 96, 1, 0, 0, 0, 0, 134,56, 6, 0, 0, 0, 0, 0, 151,73, 18, 2, 0, 0, 0, 0, 0, 100,18, 2, 0, 0, 0, 0, 149,109,2, 1, - 0, 0, 0, 0, 3, 80, 10, 0, 128,0, 0, 0, 153,235,22, 1, 0, 0, 0, 0, 81, 42, 2, 2, 0, 0, 0, 0, 17, 56, 2, 1, 128,0, 0, 0, 128,0, 0, 0, - 0, 0, 0, 0, 244,0, 36, 0, 0, 0, 0, 0, 49, 0, 8, 2, 0, 0, 0, 0, 81, 201,30, 1, 0, 0, 0, 0, 0, 249,30, 0, 0, 0, 0, 0, 1, 3, 0, 0, - 0, 0, 0, 0, 0, 104,6, 0, 0, 0, 0, 0, 1, 17, 2, 0, 0, 0, 0, 0, 153,25, 26, 1, 0, 0, 0, 0, 43, 188,46, 0, 0, 0, 0, 0, 9, 96, 4, 0, - 0, 0, 0, 0, 25, 19, 2, 0, 0, 0, 0, 0, 145,77, 28, 0, 0, 0, 0, 0, 201,115,12, 1, 0, 0, 0, 0, 4, 73, 0, 0, 0, 0, 0, 0, 95, 73, 8, 0, - 0, 0, 0, 0, 95, 209,30, 1, 0, 0, 0, 0, 128,36, 28, 0, 0, 0, 0, 0, 8, 136,14, 1, 0, 0, 0, 0, 146,32, 4, 0, 0, 0, 0, 0, 125,103,12, 3, - 0, 0, 0, 0, 1, 4, 72, 0, 0, 0, 0, 0, 6, 208,76, 0, 0, 0, 0, 0, 145,65, 80, 2, 0, 0, 0, 0, 0, 52, 8, 1, 0, 0, 0, 0, 145,205,22, 0, - 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 127,125,126,1, 0, 0, 0, 0, 72, 57, 12, 1, 0, 0, 0, 0, 0, 32, 76, 2, 0, 0, 0, 0, 18, 41, 4, 0, - 0, 0, 0, 0, 159,91, 94, 0, 0, 0, 0, 0, 26, 8, 6, 0, 0, 0, 0, 0, 16, 1, 48, 0, 0, 0, 0, 0, 32, 84, 2, 0, 0, 0, 0, 0, 17, 3, 2, 1, - 0, 32, 0, 0, 3, 16, 0, 0, 0, 0, 0, 0, 149,65, 126,1, 0, 32, 0, 0, 132,44, 142,0, 0, 0, 0, 0, 17, 7, 0, 1, 0, 0, 4, 0, 133,0, 0, 0, - 0, 0, 0, 0, 8, 0, 66, 0, 0, 48, 0, 0, 1, 1, 4, 0, 0, 0, 0, 0, 20, 64, 36, 0, 0, 32, 0, 0, 129,0, 68, 0, 0, 0, 0, 0, 17, 9, 12, 0, - 0, 32, 0, 0, 16, 41, 4, 0, 0, 0, 0, 0, 125,28, 46, 1, 0, 96, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4, 8, 1, 0, 0, 0, 0, 0, 0, 186,6, 0, - 0, 0, 0, 0, 24, 10, 6, 0, 0, 0, 0, 0, 89, 40, 4, 0, 0, 0, 0, 0, 2, 0, 8, 2, 0, 0, 0, 0, 41, 32, 70, 0, 0, 0, 0, 0, 2, 8, 0, 2, - 0, 0, 0, 0, 17, 152,4, 1, 0, 0, 0, 0, 85, 1, 2, 2, 0, 0, 0, 0, 0, 80, 6, 0, 0, 0, 0, 0, 133,33, 52, 0, 0, 128,0, 0, 128,0, 0, 0, - 0, 0, 0, 0, 36, 3, 0, 0, 0, 0, 0, 0, 23, 105,6, 0, 0, 34, 8, 0, 0, 128,0, 0, 0, 0, 0, 0, 17, 193,12, 0, 0, 0, 0, 0, 66, 0, 0, 1, - 16, 32, 0, 64, 255,255,254,3, 0, 0, 0, 0, 204,184,62, 0, 0, 0, 0, 0, 22, 41, 4, 1, 0, 0, 0, 0, 128,104,0, 0, 0, 0, 0, 0, 83, 72, 18, 0, - 0, 128,0, 0, 147,68, 10, 0, 0, 0, 0, 0, 17, 13, 12, 0, 0, 0, 0, 0, 0, 176,12, 0, 0, 0, 32, 0, 0, 64, 0, 0, 0, 0, 1, 0, 27, 61, 50, 0, - 0, 0, 0, 0, 190,184,6, 0, 0, 0, 1, 0, 177,41, 6, 1, 0, 0, 0, 0, 0, 144,70, 0, 0, 64, 0, 0, 25, 72, 0, 1, 0, 0, 0, 0, 83, 73, 18, 0, - 0, 0, 0, 0, 19, 24, 2, 0, 0, 0, 0, 0, 239,188,46, 2, 0, 0, 0, 0, 144,9, 68, 0, 0, 0, 0, 0, 128,68, 2, 0, 0, 0, 0, 0, 8, 93, 44, 0, - 0, 16, 0, 0, 16, 64, 0, 0, 0, 0, 0, 0, 19, 65, 58, 2, 0, 0, 0, 0, 4, 0, 14, 2, 0, 0, 0, 0, 81, 33, 0, 0, 0, 32, 0, 0, 76, 184,14, 0, - 0, 0, 0, 0, 147,64, 8, 0, 0, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 0, 127,249,54, 1, 0, 0, 0, 0, 0, 33, 24, 0, 0, 0, 0, 0, 135,61, 44, 0, - 0, 0, 0, 0, 17, 185,0, 0, 0, 0, 0, 0, 231,253,110,2, 0, 0, 0, 0, 4, 8, 72, 1, 0, 0, 0, 0, 16, 8, 64, 0, 0, 0, 0, 0, 254,55, 111,2, - 0, 0, 0, 0, 17, 1, 18, 1, 0, 0, 0, 0, 104,0, 4, 0, 0, 0, 0, 0, 24, 4, 0, 0, 0, 0, 0, 0, 219,185,12, 0, 0, 0, 0, 0, 145,0, 6, 0, - 0, 0, 0, 0, 20, 1, 16, 0, 0, 0, 0, 0, 20, 128,12, 0, 0, 0, 0, 0, 17, 9, 84, 0, 0, 0, 0, 0, 24, 8, 2, 0, 0, 0, 0, 0, 0, 40, 30, 0, - 0, 32, 0, 0, 89, 24, 76, 0, 0, 0, 0, 0, 0, 40, 28, 0, 0, 0, 0, 0, 64, 32, 10, 1, 0, 0, 0, 0, 0, 24, 34, 0, 0, 0, 0, 0, 0, 208,16, 0, - 0, 0, 0, 0, 9, 0, 128,1, 0, 224,4, 0, 0, 0, 64, 0, 0, 8, 0, 0, 239,248,94, 0, 0, 0, 0, 0, 17, 0, 2, 1, 0, 112,0, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 156,0, 0, 0, 0, 0, 145,24, 2, 0, 0, 0, 0, 0, 198,172,33, 1, 0, 4, 0, 0, 0, 16, 26, 2, 0, 8, 0, 0, 149,65, 48, 1, - 0, 0, 0, 0, 16, 177,88, 0, 0, 0, 0, 0, 4, 0, 52, 0, 0, 0, 0, 0, 80, 32, 0, 1, 0, 0, 0, 0, 51, 72, 30, 0, 0, 0, 0, 0, 4, 132,0, 0, - 0, 0, 0, 0, 8, 36, 2, 1, 0, 0, 0, 0, 68, 120,20, 2, 0, 0, 0, 0, 149,109,20, 0, 0, 32, 0, 0, 75, 232,78, 1, 0, 32, 0, 0, 17, 8, 4, 0, - 0, 32, 32, 0, 0, 64, 0, 0, 0, 48, 0, 0, 17, 105,12, 1, 0, 0, 0, 0, 2, 72, 4, 0, 0, 0, 0, 0, 10, 152,28, 0, 0, 32, 0, 0, 17, 1, 20, 1, - 0, 240,4, 0, 0, 8, 12, 0, 0, 0, 0, 0, 129,65, 0, 2, 0, 0, 0, 0, 142,56, 126,2, 0, 0, 0, 0, 17, 8, 16, 1, 0, 0, 0, 0, 18, 0, 2, 2, - 0, 0, 0, 0, 146,20, 4, 0, 0, 0, 0, 0, 21, 1, 8, 0, 0, 0, 0, 0, 193,64, 0, 0, 0, 0, 0, 0, 146,144,4, 0, 0, 0, 0, 0, 160,64, 16, 2, - 0, 0, 0, 0, 32, 72, 8, 0, 0, 0, 0, 0, 217,72, 2, 0, 0, 0, 0, 0, 2, 16, 12, 1, 0, 32, 0, 0, 244,91, 76, 1, 0, 0, 0, 0, 145,77, 20, 0, - 0, 0, 0, 0, 132,1, 4, 1, 0, 96, 0, 0, 65, 128,12, 1, 0, 0, 0, 0, 33, 0, 10, 0, 0, 96, 4, 0, 16, 1, 12, 0, 0, 0, 0, 0, 12, 168,12, 0, - 0, 0, 0, 0, 16, 67, 20, 1, 0, 0, 0, 0, 89, 221,6, 0, 0, 0, 0, 0, 19, 64, 4, 0, 0, 0, 0, 0, 155,81, 30, 2, 0, 0, 0, 0, 4, 32, 128,1, - 0, 0, 0, 0, 253,103,24, 0, 0, 16, 0, 0, 2, 1, 46, 0, 0, 0, 0, 0, 2, 0, 144,0, 0, 96, 32, 0, 0, 16, 4, 0, 0, 0, 0, 0, 0, 16, 12, 1, - 0, 8, 0, 0, 1, 129,4, 0, 0, 0, 0, 0, 16, 73, 20, 1, 0, 0, 0, 0, 17, 80, 36, 0, 0, 0, 0, 0, 211,93, 77, 0, 0, 0, 0, 0, 200,116,8, 1, - 0, 0, 0, 0, 21, 5, 78, 2, 0, 32, 0, 0, 68, 0, 148,0, 0, 0, 0, 0, 9, 44, 6, 0, 0, 0, 0, 0, 129,113,0, 0, 0, 0, 0, 0, 157,229,5, 0, - 0, 0, 32, 0, 16, 0, 8, 0, 0, 0, 0, 0, 1, 64, 50, 0, 0, 0, 0, 0, 44, 0, 2, 0, 0, 0, 2, 0, 17, 48, 4, 0, 0, 4, 0, 0, 255,255,254,3, - 0, 0, 0, 0, 133,21, 2, 0, 0, 0, 0, 0, 18, 73, 18, 0, 0, 0, 0, 0, 0, 16, 78, 0, 16, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108,0, 1, - 0, 0, 0, 0, 25, 105,22, 0, 0, 0, 0, 0, 68, 56, 10, 1, 0, 0, 0, 0, 49, 0, 172,2, 0, 0, 0, 0, 8, 64, 68, 0, 0, 0, 0, 0, 13, 32, 6, 2, - 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 16, 77, 0, 0, 0, 224,30, 0, 25, 32, 132,0, 0, 224,30, 0, 0, 0, 0, 0, 0, 224,6, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 57, 73, 8, 0, 0, 0, 0, 0, 0, 32, 20, 2, 0, 0, 0, 0, 48, 48, 0, 0, 0, 0, 50, 0, 0, 0, 4, 0, 0, 0, 0, 0, 16, 81, 0, 1, - 0, 0, 0, 0, 19, 89, 16, 0, 0, 0, 2, 0, 64, 0, 0, 0, 0, 0, 0, 0, 253,249,62, 2, 0, 32, 0, 0, 0, 16, 140,1, 0, 0, 0, 0, 16, 128,24, 0, - 0, 0, 0, 0, 62, 116,14, 0, 0, 0, 0, 0, 81, 69, 8, 0, 16, 0, 0, 0, 127,125,127,2, 0, 0, 0, 0, 136,40, 8, 0, 0, 2, 0, 0, 219,89, 71, 1, - 0, 0, 0, 0, 4, 32, 5, 0, 0, 0, 0, 0, 0, 3, 8, 0, 0, 0, 0, 0, 25, 177,0, 0, 0, 0, 0, 0, 20, 44, 4, 0, 0, 32, 0, 0, 0, 40, 8, 0, - 0, 32, 0, 0, 20, 9, 4, 0, 0, 32, 0, 0, 10, 32, 12, 0, 0, 0, 0, 0, 19, 77, 0, 0, 0, 0, 0, 0, 28, 32, 132,0, 0, 0, 0, 0, 17, 5, 72, 0, - 0, 0, 0, 0, 0, 48, 72, 0, 0, 40, 0, 0, 119,201,118,0, 0, 0, 0, 0, 0, 72, 18, 0, 0, 0, 0, 0, 243,253,79, 1, 0, 0, 0, 0, 4, 11, 0, 0, - 0, 0, 0, 0, 42, 12, 70, 1, 0, 0, 1, 0, 213,121,94, 1, 0, 0, 0, 0, 194,0, 26, 0, 0, 0, 0, 0, 0, 97, 0, 1, 0, 32, 0, 0, 10, 128,68, 0, - 0, 0, 0, 0, 17, 97, 20, 0, 0, 48, 0, 0, 0, 32, 4, 0, 0, 0, 0, 0, 36, 116,12, 0, 0, 0, 0, 0, 8, 16, 66, 0, 0, 0, 0, 0, 73, 58, 46, 0, - 0, 4, 0, 0, 81, 65, 16, 1, 0, 0, 0, 0, 28, 4, 14, 1, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 36, 8, 0, 0, 0, 0, 0, 13, 4, 14, 0, - 0, 16, 0, 0, 153,73, 70, 3, 0, 0, 0, 0, 12, 4, 0, 1, 0, 0, 0, 0, 29, 64, 0, 0, 0, 0, 0, 0, 0, 65, 16, 2, 0, 0, 0, 0, 4, 0, 6, 1, - 0, 0, 0, 0, 13, 160,80, 1, 0, 0, 2, 0, 160,228,20, 0, 0, 0, 0, 0, 148,12, 0, 0, 0, 0, 0, 0, 0, 168,12, 0, 0, 0, 0, 0, 80, 1, 16, 0, - 0, 0, 0, 0, 18, 32, 12, 0, 0, 0, 0, 0, 4, 0, 46, 0, 0, 0, 0, 0, 0, 137,8, 0, 0, 0, 0, 0, 19, 157,0, 0, 0, 128,0, 0, 16, 33, 4, 0, - 0, 224,62, 0, 16, 65, 4, 0, 0, 0, 0, 0, 213,121,28, 3, 0, 0, 0, 0, 0, 16, 40, 0, 0, 0, 0, 0, 1, 16, 38, 2, 0, 0, 0, 0, 211,59, 30, 0, - 0, 0, 0, 0, 4, 16, 0, 1, 0, 0, 0, 0, 13, 4, 0, 0, 0, 32, 0, 0, 8, 16, 6, 0, 0, 0, 0, 0, 147,64, 6, 2, 0, 0, 0, 0, 151,27, 14, 2, - 0, 0, 0, 0, 129,64, 0, 1, 0, 0, 0, 0, 18, 0, 16, 2, 0, 0, 0, 0, 78, 36, 0, 0, 0, 0, 0, 0, 223,255,31, 1, 0, 0, 0, 0, 132,40, 4, 3, - 0, 0, 0, 0, 25, 0, 76, 0, 16, 100,1, 0, 255,255,255,3, 0, 0, 0, 0, 254,124,15, 0, 0, 0, 0, 0, 17, 64, 66, 0, 0, 0, 0, 0, 128,32, 64, 0, - 0, 0, 0, 0, 132,22, 142,0, 0, 0, 0, 0, 184,25, 110,0, 0, 0, 0, 0, 176,57, 6, 0, 0, 0, 0, 0, 187,107,46, 1, 0, 0, 0, 0, 40, 60, 14, 0, - 0, 0, 0, 0, 13, 41, 6, 1, 0, 0, 0, 0, 251,220,14, 1, 0, 0, 0, 0, 24, 8, 16, 0, 0, 0, 0, 0, 17, 40, 76, 0, 0, 0, 0, 0, 64, 32, 41, 0, - 0, 0, 0, 0, 17, 1, 0, 3, 0, 0, 0, 0, 68, 49, 2, 0, 0, 0, 0, 0, 20, 65, 8, 0, 0, 0, 0, 0, 49, 1, 2, 0, 0, 64, 0, 0, 151,93, 26, 2, - 0, 0, 0, 0, 4, 57, 6, 0, 0, 0, 0, 0, 129,9, 16, 0, 0, 0, 0, 0, 0, 224,0, 0, 0, 0, 0, 0, 8, 128,8, 0, 0, 0, 0, 0, 0, 136,2, 0, - 0, 0, 0, 0, 65, 42, 0, 0, 0, 32, 0, 0, 113,65, 20, 0, 0, 0, 0, 0, 17, 65, 70, 0, 0, 0, 0, 0, 144,25, 0, 0, 0, 68, 0, 0, 17, 64, 16, 0, - 0, 0, 0, 0, 192,40, 32, 0, 0, 232,28, 0, 0, 0, 0, 0, 16, 0, 0, 0, 219,121,94, 1, 0, 0, 0, 0, 0, 53, 64, 1, 0, 0, 0, 0, 51, 75, 68, 0, - 0, 0, 0, 0, 203,124,14, 0, 0, 0, 0, 0, 128,4, 68, 0, 0, 0, 0, 0, 129,48, 94, 0, 0, 0, 0, 0, 172,57, 30, 0, 0, 0, 0, 0, 136,64, 0, 0, - 0, 0, 0, 0, 16, 4, 12, 2, 0, 0, 0, 0, 0, 4, 8, 2, 16, 0, 0, 0, 189,9, 12, 0, 0, 0, 0, 0, 147,105,22, 0, 0, 32, 0, 0, 128,0, 6, 0, - 0, 0, 0, 0, 148,129,8, 0, 0, 0, 0, 0, 219,217,86, 2, 0, 0, 0, 0, 24, 56, 78, 2, 0, 0, 0, 0, 19, 40, 0, 0, 0, 0, 0, 0, 2, 1, 32, 0, - 0, 0, 0, 0, 16, 33, 8, 2, 0, 0, 0, 0, 147,125,78, 1, 0, 0, 0, 0, 64, 41, 46, 1, 0, 0, 0, 0, 145,81, 22, 0, 0, 0, 0, 0, 84, 0, 8, 0, - 0, 0, 0, 0, 17, 33, 8, 0, 0, 0, 16, 0, 20, 40, 14, 0, 0, 0, 0, 0, 52, 16, 36, 1, 0, 0, 0, 0, 17, 193,4, 0, 0, 0, 0, 0, 145,93, 94, 0, - 0, 0, 0, 0, 41, 186,98, 3, 0, 0, 0, 0, 144,44, 6, 1, 0, 0, 0, 0, 152,48, 8, 0, 0, 0, 0, 0, 0, 33, 16, 0, 0, 0, 8, 0, 32, 0, 0, 0, - 0, 0, 0, 0, 138,56, 10, 0, 0, 0, 0, 0, 255,253,127,1, 0, 32, 0, 0, 240,186,126,3, 0, 0, 0, 0, 0, 68, 18, 0, 0, 0, 0, 0, 255,241,14, 0, - 0, 0, 0, 0, 10, 4, 0, 0, 0, 0, 1, 0, 4, 148,0, 0, 0, 0, 1, 0, 237,55, 238,1, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 5, 12, 0, - 0, 0, 0, 0, 16, 103,0, 1, 0, 0, 0, 0, 1, 1, 48, 0, 0, 0, 0, 0, 120,176,36, 0, 0, 0, 0, 0, 4, 48, 4, 0, 0, 0, 0, 0, 5, 2, 0, 0, - 0, 0, 0, 0, 88, 1, 4, 0, 0, 32, 0, 0, 0, 105,14, 0, 0, 112,32, 0, 17, 65, 4, 0, 0, 0, 0, 0, 145,81, 0, 1, 0, 0, 0, 0, 112,8, 36, 0, - 0, 32, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 32, 56, 82, 0, 0, 0, 0, 0, 146,65, 12, 2, 0, 0, 0, 0, 144,80, 2, 2, 0, 0, 0, 0, 34, 128,4, 0, - 0, 0, 0, 0, 1, 176,0, 0, 0, 0, 0, 0, 5, 64, 1, 0, 0, 0, 0, 0, 12, 36, 4, 0, 0, 0, 0, 0, 91, 121,30, 1, 0, 0, 0, 0, 196,44, 2, 0, - 0, 32, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 65, 40, 2, 0, 0, 224,42, 0, 0, 16, 6, 0, 0, 32, 0, 0, 0, 12, 64, 0, 0, 0, 0, 0, 76, 32, 12, 1, - 0, 0, 0, 0, 11, 128,52, 0, 0, 0, 0, 0, 196,32, 10, 1, 0, 8, 0, 0, 127,125,92, 3, 0, 0, 0, 0, 64, 48, 12, 0, 16, 66, 1, 0, 217,249,78, 3, - 0, 128,0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 65, 64, 0, 0, 160,0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 48, 80, 12, 2, 0, 0, 1, 0, 64, 89, 0, 1, - 0, 0, 0, 0, 212,137,24, 0, 0, 0, 0, 0, 172,253,94, 2, 0, 0, 0, 0, 0, 144,16, 0, 0, 0, 0, 0, 128,192,64, 0, 0, 32, 32, 0, 128,64, 0, 0, - 0, 0, 0, 0, 189,201,30, 1, 0, 0, 0, 0, 4, 12, 43, 0, 0, 0, 0, 0, 0, 64, 2, 2, 0, 0, 0, 0, 65, 73, 0, 0, 0, 160,1, 0, 94, 121,124,0, - 0, 0, 0, 0, 70, 32, 12, 0, 0, 0, 0, 0, 21, 96, 24, 0, 0, 0, 0, 0, 4, 141,6, 0, 0, 0, 0, 0, 16, 73, 2, 1, 0, 0, 0, 0, 4, 240,1, 0, - 0, 0, 0, 0, 142,56, 44, 2, 0, 0, 0, 0, 72, 3, 12, 0, 0, 240,61, 0, 2, 16, 38, 0, 0, 0, 0, 0, 145,1, 20, 0, 0, 0, 0, 0, 17, 113,82, 2, - 0, 0, 0, 0, 128,9, 4, 2, 0, 4, 0, 0, 247,127,76, 1, 0, 0, 0, 0, 74, 0, 4, 0, 0, 0, 0, 0, 0, 4, 24, 0, 0, 0, 0, 0, 247,104,140,3, - 0, 224,8, 0, 0, 1, 4, 0, 0, 0, 0, 0, 0, 68, 12, 0, 0, 0, 0, 0, 25, 1, 68, 0, 0, 0, 0, 0, 103,176,54, 2, 0, 0, 0, 0, 4, 1, 0, 2, - 0, 0, 0, 0, 12, 40, 4, 0, 0, 0, 0, 0, 151,65, 8, 2, 0, 0, 0, 0, 209,121,92, 2, 0, 0, 0, 0, 65, 40, 0, 2, 0, 0, 0, 0, 0, 64, 128,2, - 0, 8, 0, 0, 223,253,126,2, 0, 0, 0, 0, 72, 53, 70, 3, 0, 0, 0, 0, 16, 80, 16, 1, 0, 96, 0, 0, 8, 0, 6, 0, 0, 0, 0, 0, 64, 41, 3, 0, - 0, 0, 0, 0, 17, 85, 16, 0, 0, 0, 0, 0, 16, 48, 10, 0, 0, 0, 0, 0, 21, 166,14, 0, 0, 0, 0, 0, 12, 4, 2, 0, 0, 0, 0, 0, 32, 8, 70, 0, - 0, 0, 0, 0, 17, 81, 80, 0, 0, 0, 0, 0, 53, 160,0, 0, 0, 0, 0, 0, 179,73, 70, 0, 0, 0, 0, 0, 10, 0, 12, 0, 0, 0, 0, 0, 11, 144,0, 0, - 0, 0, 0, 0, 234,24, 14, 0, 0, 0, 0, 0, 106,88, 100,0, 0, 0, 0, 0, 4, 56, 0, 0, 0, 0, 0, 0, 145,73, 94, 0, 0, 0, 0, 0, 192,36, 2, 1, - 0, 0, 0, 0, 64, 8, 130,1, 0, 32, 0, 0, 0, 32, 68, 0, 0, 0, 0, 0, 0, 40, 12, 2, 0, 0, 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 17, 89, 22, 0, - 0, 32, 0, 0, 130,0, 4, 1, 0, 0, 0, 0, 64, 52, 4, 0, 0, 0, 16, 0, 95, 59, 46, 3, 0, 192,5, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 96, 8, 0, - 0, 0, 0, 0, 8, 58, 0, 0, 0, 0, 0, 0, 25, 8, 24, 0, 0, 0, 0, 0, 17, 64, 12, 1, 0, 0, 0, 0, 24, 88, 12, 0, 16, 128,0, 0, 255,189,110,2, - 0, 0, 0, 0, 2, 16, 64, 0, 0, 0, 0, 0, 0, 32, 68, 1, 0, 32, 0, 0, 16, 1, 4, 2, 0, 0, 0, 0, 20, 213,8, 0, 0, 128,0, 0, 25, 65, 22, 0, - 0, 0, 0, 0, 16, 8, 12, 0, 0, 0, 0, 0, 21, 0, 0, 1, 0, 0, 0, 0, 0, 65, 18, 0, 0, 0, 0, 0, 16, 0, 132,0, 0, 0, 0, 0, 0, 161,0, 1, - 0, 0, 0, 0, 5, 96, 2, 0, 0, 0, 0, 0, 145,201,24, 0, 0, 0, 0, 0, 144,65, 2, 0, 0, 0, 0, 0, 25, 160,8, 0, 0, 0, 16, 0, 21, 105,84, 1, - 0, 0, 0, 0, 19, 1, 4, 2, 0, 128,0, 0, 55, 121,24, 1, 0, 0, 0, 0, 68, 16, 10, 0, 0, 0, 0, 0, 17, 72, 52, 0, 0, 0, 0, 0, 83, 89, 88, 2, - 0, 0, 0, 0, 16, 45, 66, 0, 0, 0, 0, 0, 48, 17, 0, 1, 0, 0, 4, 0, 0, 16, 0, 0, 0, 244,1, 4, 255,255,255,3, 0, 144,0, 0, 0, 64, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 96, 64, 0, 0, 0, 2, 0, 0, 0, 4, 0, 20, 0, 3, 0, 255,255,255,3, 0, 16, 0, 0, 8, 64, 0, 0, - 0, 0, 0, 0, 0, 169,38, 0, 0, 0, 0, 0, 149,93, 29, 2, 0, 0, 0, 0, 32, 160,4, 0, 0, 0, 0, 0, 8, 60, 78, 1, 0, 0, 0, 0, 17, 73, 24, 1, - 0, 0, 0, 0, 4, 72, 66, 0, 0, 0, 0, 0, 32, 104,28, 0, 0, 0, 0, 0, 145,17, 70, 0, 0, 0, 0, 0, 10, 32, 10, 0, 0, 0, 0, 0, 123,89, 22, 0, - 0, 0, 0, 0, 0, 56, 98, 0, 0, 0, 0, 0, 20, 104,4, 0, 0, 0, 0, 0, 5, 12, 0, 0, 0, 0, 0, 0, 13, 76, 12, 2, 0, 0, 0, 0, 48, 0, 16, 0, - 0, 0, 0, 0, 25, 105,16, 0, 0, 0, 0, 0, 9, 40, 30, 0, 0, 0, 0, 0, 1, 124,20, 0, 0, 0, 0, 0, 76, 44, 190,2, 0, 0, 1, 0, 48, 76, 12, 0, - 0, 32, 0, 0, 18, 65, 68, 0, 0, 0, 0, 0, 20, 1, 68, 0, 0, 0, 0, 0, 245,221,28, 1, 0, 0, 0, 0, 252,53, 94, 3, 0, 0, 0, 0, 64, 40, 0, 2, - 0, 0, 0, 0, 68, 5, 9, 2, 0, 0, 0, 0, 5, 116,46, 1, 0, 0, 0, 0, 4, 1, 1, 2, 0, 0, 0, 0, 86, 40, 0, 2, 0, 0, 0, 0, 32, 120,12, 0, - 0, 0, 0, 0, 72, 68, 4, 0, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 44, 32, 38, 2, 0, 0, 0, 0, 9, 32, 20, 0, 0, 0, 0, 0, 27, 65, 31, 1, - 0, 0, 0, 0, 8, 1, 14, 0, 0, 32, 0, 0, 0, 65, 12, 0, 0, 0, 0, 0, 16, 96, 14, 0, 0, 0, 0, 0, 1, 112,116,0, 0, 0, 0, 0, 64, 64, 0, 1, - 0, 0, 0, 0, 1, 0, 2, 2, 0, 0, 0, 0, 6, 20, 4, 2, 0, 0, 0, 0, 0, 64, 8, 2, 0, 0, 0, 0, 19, 153,16, 0, 0, 0, 0, 0, 145,8, 16, 0, - 0, 0, 0, 0, 253,119,62, 3, 0, 0, 0, 0, 196,20, 46, 1, 0, 32, 0, 0, 0, 32, 128,0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 32, 0, 0, 2, 32, 36, 1, - 0, 0, 0, 0, 78, 140,45, 0, 0, 0, 0, 0, 69, 236,12, 0, 0, 32, 0, 0, 132,76, 20, 0, 0, 0, 0, 0, 0, 6, 16, 0, 0, 0, 0, 0, 10, 40, 0, 0, - 0, 0, 0, 0, 36, 168,70, 2, 0, 0, 0, 0, 145,73, 22, 1, 0, 0, 0, 0, 64, 41, 8, 0, 0, 96, 62, 0, 1, 0, 4, 0, 0, 0, 0, 0, 64, 58, 4, 0, - 0, 0, 0, 0, 149,205,86, 1, 0, 32, 0, 0, 78, 61, 6, 3, 0, 32, 0, 0, 22, 89, 68, 1, 0, 0, 0, 0, 20, 44, 10, 0, 0, 0, 0, 0, 17, 32, 20, 1, - 0, 0, 0, 0, 0, 42, 4, 0, 0, 0, 0, 0, 255,253,63, 2, 0, 0, 0, 0, 238,191,62, 3, 0, 0, 0, 0, 0, 4, 192,0, 0, 0, 0, 0, 17, 1, 128,0, - 0, 0, 0, 0, 0, 16, 12, 2, 0, 0, 0, 0, 17, 193,16, 0, 0, 0, 0, 0, 24, 0, 1, 0, 0, 0, 0, 0, 129,69, 0, 1, 0, 0, 0, 0, 17, 97, 16, 1, - 0, 0, 0, 0, 16, 32, 68, 1, 0, 0, 0, 0, 24, 46, 12, 2, 0, 0, 0, 0, 155,172,44, 2, 0, 32, 8, 0, 144,1, 12, 0, 0, 0, 0, 0, 217,89, 116,0, - 0, 0, 0, 0, 0, 48, 40, 1, 0, 0, 0, 0, 16, 16, 10, 3, 0, 0, 0, 0, 0, 128,82, 0, 0, 0, 0, 0, 14, 104,172,0, 0, 32, 32, 0, 17, 137,0, 0, - 0, 32, 0, 0, 0, 16, 2, 0, 0, 0, 0, 0, 68, 56, 4, 2, 0, 0, 0, 0, 80, 104,4, 0, 0, 0, 0, 0, 145,105,0, 1, 0, 0, 0, 0, 76, 40, 2, 0, - 0, 0, 0, 0, 32, 176,4, 0, 0, 0, 0, 0, 149,121,70, 1, 0, 0, 0, 0, 64, 5, 0, 0, 0, 0, 0, 0, 24, 41, 2, 0, 0, 0, 0, 0, 31, 160,12, 2, - 0, 0, 0, 0, 0, 13, 16, 0, 0, 4, 0, 0, 8, 0, 4, 0, 0, 48, 0, 0, 2, 85, 12, 0, 0, 0, 0, 0, 33, 32, 4, 2, 0, 0, 0, 0, 149,205,109,2, - 0, 0, 0, 0, 68, 40, 6, 0, 0, 0, 0, 0, 21, 0, 2, 0, 0, 0, 0, 0, 5, 8, 0, 2, 0, 0, 0, 0, 0, 68, 16, 1, 0, 0, 0, 0, 17, 77, 8, 0, - 0, 0, 0, 0, 84, 104,2, 0, 0, 240,52, 0, 55, 221,76, 1, 0, 112,16, 0, 0, 0, 64, 0, 0, 208,16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 57, 26, 0, - 0, 0, 0, 0, 40, 32, 0, 0, 0, 0, 0, 0, 32, 96, 40, 0, 0, 0, 0, 0, 0, 32, 118,0, 0, 16, 0, 0, 25, 64, 18, 0, 1, 240,63, 0, 9, 0, 4, 0, - 0, 0, 0, 0, 8, 8, 22, 0, 0, 0, 0, 0, 21, 48, 32, 0, 0, 0, 0, 0, 149,125,94, 3, 0, 0, 0, 0, 72, 238,8, 0, 0, 32, 0, 0, 16, 65, 64, 1, - 0, 0, 0, 0, 16, 44, 14, 0, 0, 32, 0, 0, 49, 65, 84, 0, 0, 0, 0, 0, 64, 152,4, 0, 0, 0, 0, 0, 17, 108,8, 0, 0, 0, 0, 0, 4, 41, 20, 0, - 0, 0, 0, 0, 29, 124,5, 2, 0, 32, 0, 0, 145,5, 0, 0, 0, 32, 0, 0, 16, 40, 4, 0, 0, 32, 0, 0, 4, 0, 2, 0, 0, 0, 0, 0, 16, 0, 136,0, - 0, 0, 0, 0, 20, 36, 0, 0, 0, 0, 0, 0, 76, 140,76, 2, 0, 48, 32, 0, 157,95, 20, 1, 0, 32, 0, 0, 0, 32, 20, 0, 0, 0, 0, 0, 209,68, 16, 0, - 0, 0, 0, 0, 72, 28, 4, 1, 0, 32, 0, 0, 16, 13, 4, 0, 0, 0, 0, 0, 5, 104,4, 0, 0, 0, 0, 0, 12, 0, 36, 0, 0, 0, 0, 0, 17, 41, 12, 0, - 0, 32, 0, 0, 20, 12, 0, 0, 0, 0, 0, 0, 4, 16, 12, 0, 0, 2, 0, 0, 31, 253,78, 0, 0, 0, 0, 0, 2, 56, 0, 0, 0, 0, 0, 0, 160,0, 18, 0, - 0, 2, 0, 0, 17, 65, 0, 0, 0, 0, 0, 0, 137,81, 0, 2, 0, 0, 0, 0, 194,145,4, 0, 0, 64, 0, 0, 33, 129,40, 0, 0, 0, 0, 0, 110,173,46, 1, - 0, 96, 0, 0, 35, 84, 12, 0, 0, 32, 0, 0, 49, 0, 8, 1, 0, 0, 0, 0, 28, 24, 12, 1, 0, 32, 0, 0, 17, 19, 4, 1, 0, 0, 0, 0, 2, 8, 68, 0, - 0, 0, 0, 0, 133,69, 28, 0, 0, 0, 0, 0, 4, 9, 2, 0, 0, 0, 0, 0, 25, 73, 18, 0, 0, 0, 0, 0, 68, 40, 0, 0, 0, 0, 0, 0, 1, 40, 6, 2, - 0, 0, 0, 0, 69, 16, 0, 0, 0, 0, 0, 0, 0, 10, 0, 2, 0, 32, 0, 0, 64, 32, 12, 2, 0, 0, 0, 0, 14, 175,110,0, 0, 0, 0, 0, 3, 9, 4, 3, - 0, 0, 0, 0, 144,64, 4, 2, 0, 0, 0, 0, 81, 104,22, 0, 0, 0, 0, 0, 100,168,138,0, 0, 0, 0, 0, 1, 5, 2, 0, 0, 0, 0, 0, 181,253,56, 3, - 0, 0, 0, 0, 88, 4, 2, 1, 0, 32, 0, 0, 92, 8, 4, 0, 0, 0, 0, 0, 145,81, 16, 1, 0, 0, 0, 0, 69, 0, 74, 1, 0, 0, 0, 0, 0, 160,77, 0, - 0, 0, 0, 0, 19, 16, 0, 0, 0, 0, 0, 0, 255,253,95, 3, 0, 0, 0, 0, 232,40, 14, 2, 0, 0, 0, 0, 16, 65, 40, 0, 0, 0, 0, 0, 64, 42, 130,0, - 0, 0, 0, 0, 64, 136,8, 2, 0, 32, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 68, 40, 142,0, 0, 0, 0, 0, 0, 5, 16, 0, 0, 0, 0, 0, 19, 65, 4, 3, - 0, 0, 0, 0, 10, 8, 74, 1, 0, 0, 0, 0, 84, 56, 132,0, 0, 96, 0, 0, 14, 128,68, 0, 0, 0, 4, 0, 145,69, 8, 0, 0, 0, 0, 0, 20, 96, 36, 0, - 0, 0, 0, 0, 145,73, 10, 2, 0, 0, 0, 0, 70, 48, 138,0, 0, 224,1, 0, 0, 0, 0, 0, 16, 40, 0, 0, 8, 0, 4, 0, 0, 0, 0, 0, 17, 205,12, 1, - 0, 112,8, 0, 28, 82, 4, 0, 0, 96, 0, 0, 4, 80, 4, 0, 16, 0, 0, 0, 253,255,63, 3, 0, 0, 0, 0, 200,44, 18, 2, 0, 0, 0, 0, 144,73, 16, 1, - 0, 0, 0, 0, 0, 169,32, 1, 0, 0, 0, 0, 34, 0, 32, 0, 0, 0, 0, 0, 12, 40, 0, 0, 0, 0, 0, 0, 73, 57, 14, 3, 0, 0, 0, 0, 0, 0, 44, 0, - 0, 32, 0, 0, 16, 73, 0, 0, 0, 0, 0, 0, 213,248,76, 1, 0, 0, 0, 0, 16, 81, 4, 1, 0, 0, 0, 0, 36, 40, 0, 0, 0, 0, 0, 0, 44, 40, 252,2, - 0, 0, 0, 0, 1, 41, 10, 2, 0, 0, 0, 0, 84, 104,12, 0, 0, 0, 0, 0, 8, 32, 76, 0, 0, 32, 0, 0, 0, 16, 36, 0, 0, 0, 0, 0, 149,237,28, 1, - 0, 0, 0, 0, 8, 24, 24, 0, 0, 0, 0, 0, 4, 129,50, 0, 0, 0, 0, 0, 23, 52, 4, 0, 0, 0, 0, 0, 145,33, 4, 0, 0, 32, 0, 0, 82, 8, 4, 0, - 0, 0, 0, 0, 145,1, 84, 0, 0, 0, 0, 0, 3, 1, 6, 0, 0, 0, 0, 0, 65, 48, 36, 2, 0, 0, 0, 0, 149,101,13, 2, 0, 0, 0, 0, 4, 32, 34, 0, - 0, 0, 0, 0, 17, 25, 72, 0, 0, 0, 0, 0, 17, 77, 6, 0, 0, 0, 0, 0, 213,69, 94, 3, 0, 0, 0, 0, 132,41, 66, 0, 0, 32, 0, 0, 16, 44, 30, 1, - 0, 240,14, 0, 223,246,12, 0, 0, 0, 0, 0, 190,65, 4, 0, 0, 0, 0, 0, 80, 200,136,0, 0, 0, 0, 0, 20, 67, 12, 0, 0, 32, 0, 0, 80, 29, 22, 0, - 0, 0, 0, 0, 21, 40, 12, 1, 0, 0, 0, 0, 60, 44, 4, 2, 0, 0, 0, 0, 102,168,116,2, 0, 0, 0, 0, 0, 5, 4, 1, 0, 0, 0, 0, 132,40, 4, 2, - 0, 0, 0, 0, 17, 97, 86, 1, 0, 0, 0, 0, 0, 32, 78, 1, 0, 0, 0, 0, 118,162,76, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 128,40, 10, 3, - 0, 0, 0, 0, 0, 65, 12, 0, 0, 0, 0, 0, 17, 64, 14, 0, 0, 0, 0, 0, 16, 9, 0, 2, 0, 0, 0, 0, 181,109,19, 0, 0, 0, 0, 0, 160,40, 18, 0, - 0, 0, 0, 0, 32, 33, 16, 0, 0, 0, 0, 0, 48, 32, 6, 2, 0, 0, 0, 0, 145,193,16, 1, 0, 0, 0, 0, 64, 1, 16, 0, 0, 0, 0, 0, 80, 16, 0, 0, - 0, 0, 0, 0, 128,0, 30, 0, 0, 0, 0, 0, 0, 0, 192,0, 0, 0, 0, 0, 2, 2, 8, 0, 0, 20, 0, 0, 25, 233,26, 1, 0, 0, 0, 0, 84, 57, 30, 1, - 0, 0, 0, 0, 17, 76, 0, 0, 0, 0, 0, 0, 84, 96, 8, 0, 0, 0, 0, 0, 0, 32, 48, 0, 0, 240,9, 0, 0, 0, 4, 0, 0, 96, 0, 0, 8, 64, 6, 0, - 0, 0, 0, 0, 43, 0, 8, 0, 0, 0, 0, 0, 83, 105,74, 2, 0, 0, 0, 0, 65, 133,8, 0, 0, 0, 0, 0, 64, 97, 4, 0, 0, 0, 0, 0, 107,188,14, 0, - 0, 0, 1, 0, 159,217,4, 1, 0, 0, 0, 0, 10, 32, 40, 0, 0, 0, 0, 0, 10, 192,4, 0, 0, 32, 0, 0, 0, 192,4, 0, 0, 32, 0, 0, 18, 64, 0, 0, - 0, 0, 0, 0, 16, 129,0, 1, 0, 0, 0, 0, 19, 144,4, 0, 0, 32, 0, 0, 16, 129,4, 0, 0, 0, 0, 0, 68, 24, 20, 0, 0, 32, 1, 0, 0, 1, 0, 1, - 0, 0, 0, 0, 22, 116,30, 0, 0, 0, 0, 0, 2, 32, 16, 0, 0, 240,62, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 2, 12, 0, 0, 0, 0, 0, 209,65, 4, 1, - 0, 32, 0, 0, 8, 16, 12, 1, 0, 32, 0, 0, 86, 186,102,0, 0, 0, 0, 0, 144,128,0, 1, 0, 0, 0, 0, 5, 124,2, 0, 0, 0, 0, 0, 40, 8, 12, 0, - 0, 0, 0, 0, 4, 68, 1, 0, 0, 0, 0, 0, 101,96, 60, 2, 0, 0, 0, 0, 16, 1, 1, 0, 0, 32, 0, 0, 32, 16, 4, 0, 0, 0, 0, 0, 20, 4, 8, 0, - 0, 0, 0, 0, 17, 4, 10, 2, 0, 0, 0, 16, 149,101,29, 0, 0, 0, 0, 0, 10, 0, 14, 3, 0, 0, 0, 0, 241,185,86, 1, 0, 0, 0, 0, 16, 129,12, 0, - 0, 0, 0, 0, 0, 40, 24, 2, 0, 0, 0, 0, 64, 32, 18, 0, 0, 0, 0, 0, 77, 64, 2, 0, 0, 32, 0, 0, 253,188,46, 2, 0, 0, 0, 0, 8, 16, 68, 0, - 0, 0, 0, 0, 4, 0, 76, 0, 0, 0, 0, 0, 17, 17, 6, 0, 0, 0, 0, 0, 61, 217,14, 2, 0, 0, 0, 0, 41, 0, 4, 1, 0, 0, 0, 0, 9, 32, 4, 0, - 0, 0, 0, 0, 17, 3, 14, 3, 0, 0, 0, 0, 1, 65, 0, 3, 0, 0, 0, 0, 0, 132,64, 0, 0, 0, 0, 0, 251,248,30, 0, 0, 0, 0, 0, 17, 52, 16, 0, - 0, 0, 0, 0, 0, 16, 38, 1, 0, 0, 0, 0, 87, 77, 28, 2, 0, 0, 0, 0, 0, 164,14, 0, 0, 0, 0, 0, 72, 0, 28, 0, 0, 0, 0, 0, 84, 160,0, 0, - 0, 0, 0, 0, 19, 81, 4, 0, 0, 0, 0, 0, 0, 224,8, 0, 0, 0, 0, 0, 0, 32, 90, 0, 0, 32, 0, 0, 17, 65, 12, 0, 0, 0, 0, 0, 18, 96, 16, 0, - 0, 0, 0, 0, 17, 152,0, 0, 0, 32, 4, 0, 153,27, 4, 0, 0, 32, 4, 0, 64, 0, 0, 0, 0, 0, 0, 0, 255,237,92, 3, 0, 0, 0, 0, 36, 44, 30, 0, - 0, 0, 0, 0, 144,69, 16, 2, 0, 0, 0, 0, 205,105,110,1, 0, 0, 0, 0, 0, 136,16, 0, 0, 0, 0, 0, 81, 137,58, 2, 0, 0, 0, 0, 20, 104,0, 0, - 0, 32, 0, 0, 177,233,28, 1, 0, 96, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 8, 72, 10, 1, 0, 0, 0, 0, 4, 160,128,0, 0, 0, 0, 0, 4, 36, 12, 1, - 0, 0, 0, 0, 17, 72, 20, 0, 0, 0, 0, 0, 8, 1, 18, 0, 0, 0, 0, 0, 4, 56, 30, 0, 0, 0, 0, 0, 16, 0, 130,0, 0, 0, 0, 0, 145,197,4, 0, - 0, 0, 0, 0, 40, 24, 94, 0, 0, 128,0, 0, 64, 0, 4, 0, 0, 0, 0, 0, 21, 125,30, 0, 0, 0, 0, 0, 20, 49, 8, 0, 0, 0, 0, 0, 213,69, 28, 2, - 0, 0, 0, 0, 64, 12, 2, 0, 0, 0, 0, 0, 17, 65, 64, 1, 0, 0, 0, 0, 183,247,30, 3, 0, 0, 0, 0, 0, 5, 32, 0, 0, 0, 0, 0, 1, 12, 6, 0, - 0, 0, 0, 0, 19, 113,68, 0, 0, 0, 0, 0, 50, 9, 8, 1, 0, 0, 0, 0, 36, 1, 2, 0, 0, 0, 0, 0, 25, 1, 16, 2, 0, 96, 0, 0, 131,176,6, 2, - 0, 0, 0, 0, 53, 4, 0, 0, 0, 0, 0, 0, 16, 18, 0, 0, 0, 0, 0, 0, 0, 0, 152,0, 0, 8, 0, 0, 157,83, 18, 3, 0, 0, 0, 0, 205,53, 189,3, - 0, 0, 0, 0, 145,5, 0, 2, 16, 0, 0, 0, 138,52, 6, 0, 0, 0, 0, 0, 16, 0, 36, 0, 0, 0, 0, 0, 80, 17, 16, 0, 0, 0, 0, 0, 52, 8, 44, 1, - 0, 0, 0, 0, 21, 101,28, 0, 16, 0, 0, 0, 0, 0, 14, 0, 0, 32, 0, 0, 1, 0, 132,0, 0, 32, 0, 0, 17, 1, 4, 3, 0, 0, 0, 0, 64, 1, 10, 0, - 0, 0, 0, 0, 20, 20, 12, 0, 0, 0, 0, 0, 16, 1, 64, 0, 0, 0, 0, 0, 12, 4, 1, 0, 0, 32, 0, 0, 1, 129,4, 0, 0, 32, 0, 0, 177,101,8, 3, - 0, 0, 0, 0, 65, 1, 16, 0, 0, 96, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 92, 0, 12, 0, 0, 96, 0, 0, 243,217,78, 0, 0, 32, 0, 0, 2, 0, 4, 2, - 0, 224,4, 0, 0, 0, 4, 0, 0, 104,4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 1, 16, 0, 2, 0, 0, 0, 0, 95, 245,252,1, 0, 0, 0, 0, 0, 72, 38, 0, - 0, 32, 0, 0, 8, 48, 6, 0, 0, 0, 0, 0, 1, 60, 12, 0, 0, 0, 0, 0, 1, 1, 28, 0, 0, 0, 0, 0, 149,37, 4, 2, 0, 0, 0, 0, 132,0, 12, 2, - 0, 0, 0, 0, 85, 124,12, 0, 0, 0, 0, 0, 156,245,124,1, 0, 0, 0, 0, 0, 5, 4, 2, 0, 0, 0, 0, 0, 45, 14, 2, 0, 0, 0, 0, 104,0, 2, 0, - 0, 0, 0, 0, 26, 17, 6, 0, 0, 0, 0, 0, 252,49, 46, 1, 0, 0, 0, 0, 19, 152,4, 0, 0, 0, 0, 0, 72, 4, 0, 0, 0, 8, 0, 0, 144,0, 0, 0, - 0, 0, 0, 0, 16, 25, 68, 0, 0, 64, 0, 0, 24, 0, 12, 0, 0, 0, 2, 0, 80, 129,0, 0, 0, 0, 0, 0, 255,253,255,3, 0, 0, 0, 0, 68, 9, 10, 0, - 0, 0, 0, 0, 149,69, 16, 2, 0, 0, 0, 0, 128,1, 12, 0, 0, 0, 0, 0, 50, 5, 12, 0, 0, 0, 0, 0, 95, 93, 118,1, 0, 0, 0, 0, 2, 8, 70, 0, - 0, 0, 0, 0, 128,156,14, 0, 0, 0, 0, 0, 4, 3, 0, 0, 0, 0, 0, 0, 17, 5, 14, 2, 0, 0, 0, 0, 65, 65, 18, 0, 0, 0, 0, 0, 8, 32, 6, 2, - 0, 0, 0, 0, 1, 106,0, 0, 0, 48, 0, 0, 73, 40, 31, 0, 0, 0, 0, 0, 28, 0, 12, 0, 0, 32, 0, 0, 26, 89, 68, 1, 0, 48, 0, 0, 0, 8, 0, 1, - 0, 112,0, 0, 32, 16, 4, 0, 0, 32, 0, 0, 253,111,60, 3, 0, 0, 0, 0, 12, 36, 14, 0, 0, 0, 0, 0, 12, 0, 4, 1, 0, 0, 0, 0, 128,64, 0, 3, - 0, 0, 0, 0, 28, 52, 78, 1, 0, 32, 0, 0, 77, 116,45, 2, 0, 0, 0, 0, 145,1, 0, 3, 0, 96, 0, 0, 8, 16, 68, 0, 0, 0, 0, 0, 65, 68, 12, 0, - 0, 0, 0, 0, 129,68, 8, 0, 0, 0, 0, 0, 19, 65, 8, 3, 0, 0, 0, 0, 20, 4, 5, 0, 0, 0, 0, 0, 1, 81, 0, 0, 0, 32, 0, 0, 8, 32, 20, 0, - 0, 0, 0, 0, 4, 36, 2, 0, 0, 0, 0, 0, 4, 21, 8, 0, 0, 32, 32, 0, 4, 172,108,0, 0, 0, 0, 0, 81, 68, 8, 0, 0, 0, 0, 0, 223,176,60, 0, - 0, 0, 0, 0, 129,8, 2, 1, 0, 0, 0, 0, 1, 72, 2, 1, 0, 0, 0, 0, 144,0, 14, 0, 0, 0, 0, 0, 51, 209,6, 1, 0, 0, 0, 0, 8, 9, 2, 0, - 0, 0, 0, 0, 4, 1, 8, 2, 0, 128,0, 0, 92, 97, 12, 3, 0, 0, 0, 0, 16, 1, 84, 0, 0, 0, 0, 0, 151,65, 22, 1, 0, 0, 0, 0, 36, 0, 38, 0, - 0, 0, 0, 0, 37, 104,16, 0, 0, 0, 0, 0, 0, 97, 2, 0, 0, 0, 8, 0, 3, 0, 8, 0, 0, 0, 0, 64, 174,174,46, 1, 0, 32, 0, 0, 18, 0, 0, 0, - 0, 0, 4, 0, 146,17, 4, 0, 0, 32, 0, 0, 184,65, 4, 1, 0, 0, 0, 0, 147,56, 8, 0, 0, 40, 0, 0, 149,223,94, 0, 0, 0, 0, 0, 4, 14, 6, 1, - 0, 0, 0, 0, 20, 84, 4, 0, 0, 0, 0, 0, 36, 8, 96, 0, 0, 0, 0, 0, 9, 56, 10, 0, 0, 32, 0, 0, 12, 0, 4, 0, 0, 0, 0, 0, 4, 1, 10, 0, - 0, 0, 0, 0, 127,229,63, 2, 0, 0, 0, 0, 24, 152,4, 0, 0, 0, 0, 0, 20, 128,0, 1, 0, 32, 5, 0, 14, 220,4, 0, 0, 96, 4, 0, 64, 16, 4, 0, - 0, 96, 48, 0, 0, 0, 4, 0, 0, 0, 0, 0, 181,253,118,2, 0, 0, 0, 0, 74, 8, 6, 0, 0, 0, 0, 0, 24, 104,22, 0, 0, 0, 0, 0, 161,0, 36, 0, - 0, 0, 0, 0, 4, 80, 0, 0, 0, 0, 0, 0, 21, 120,4, 0, 0, 0, 0, 0, 34, 12, 6, 0, 0, 0, 0, 0, 64, 96, 4, 0, 0, 0, 0, 0, 149,173,28, 0, - 0, 0, 0, 0, 8, 33, 30, 1, 0, 0, 0, 0, 16, 36, 140,0, 0, 0, 0, 0, 6, 32, 0, 0, 0, 0, 0, 0, 223,249,92, 0, 0, 0, 0, 0, 80, 32, 8, 0, - 0, 0, 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 0, 160,32, 0, 0, 0, 0, 0, 20, 0, 0, 1, 0, 0, 0, 0, 4, 24, 2, 0, 0, 0, 1, 0, 213,201,62, 0, - 0, 0, 0, 0, 6, 176,76, 0, 0, 0, 0, 0, 17, 48, 6, 2, 0, 0, 0, 0, 4, 28, 4, 0, 0, 0, 0, 0, 137,17, 0, 0, 0, 0, 0, 0, 145,77, 4, 1, - 0, 0, 0, 0, 10, 33, 2, 0, 0, 32, 0, 0, 0, 1, 4, 1, 0, 0, 0, 0, 76, 189,142,0, 0, 0, 0, 0, 20, 33, 37, 0, 0, 0, 0, 0, 153,57, 70, 1, - 0, 32, 0, 0, 48, 8, 4, 1, 0, 112,46, 0, 179,217,30, 0, 0, 0, 0, 0, 4, 72, 16, 0, 0, 0, 0, 0, 8, 32, 12, 1, 0, 0, 0, 0, 24, 32, 12, 0, - 0, 0, 0, 0, 17, 97, 4, 2, 0, 16, 0, 0, 0, 192,4, 0, 0, 32, 0, 0, 21, 65, 48, 3, 0, 0, 0, 0, 254,191,252,3, 0, 0, 0, 0, 108,32, 8, 0, - 0, 0, 0, 0, 77, 4, 8, 0, 0, 0, 0, 0, 145,68, 12, 0, 0, 0, 0, 0, 149,77, 12, 0, 0, 0, 0, 0, 6, 40, 1, 0, 0, 0, 0, 0, 132,28, 14, 0, - 0, 0, 0, 0, 18, 9, 0, 0, 0, 0, 0, 0, 0, 16, 22, 0, 0, 0, 0, 0, 8, 168,4, 0, 0, 0, 0, 0, 1, 224,4, 0, 0, 0, 0, 0, 68, 40, 16, 0, - 0, 0, 0, 0, 25, 113,2, 1, 0, 0, 0, 0, 36, 0, 12, 0, 0, 0, 0, 0, 12, 16, 138,0, 0, 0, 0, 0, 17, 16, 6, 0, 0, 0, 0, 0, 16, 113,0, 0, - 0, 32, 32, 0, 0, 0, 4, 0, 0, 0, 0, 0, 21, 65, 0, 1, 0, 0, 0, 0, 8, 0, 138,0, 0, 0, 0, 0, 16, 96, 20, 0, 0, 0, 0, 0, 77, 0, 28, 0, - 0, 0, 0, 0, 1, 192,2, 0, 0, 0, 0, 0, 215,237,29, 1, 16, 0, 0, 0, 18, 121,80, 0, 0, 0, 0, 0, 17, 73, 66, 0, 0, 0, 0, 0, 73, 160,0, 0, - 0, 0, 0, 0, 0, 144,8, 0, 0, 0, 0, 0, 17, 129,0, 0, 0, 0, 0, 0, 17, 73, 10, 3, 0, 0, 0, 0, 16, 32, 130,0, 0, 32, 0, 0, 66, 16, 0, 0, - 0, 0, 0, 0, 95, 126,190,3, 0, 0, 0, 0, 2, 41, 2, 1, 0, 32, 0, 0, 8, 8, 70, 1, 0, 0, 0, 0, 216,17, 16, 0, 0, 32, 0, 0, 9, 16, 4, 0, - 0, 0, 0, 0, 106,16, 94, 0, 0, 0, 0, 0, 144,8, 4, 0, 0, 0, 0, 0, 17, 209,18, 0, 0, 0, 0, 0, 4, 8, 174,0, 0, 32, 0, 0, 9, 1, 46, 0, - 0, 32, 0, 0, 64, 0, 6, 2, 0, 0, 0, 0, 8, 2, 4, 1, 0, 0, 0, 0, 92, 36, 12, 2, 0, 96, 2, 0, 8, 136,44, 0, 0, 0, 0, 0, 17, 81, 20, 3, - 0, 0, 0, 0, 134,84, 12, 0, 0, 0, 0, 0, 133,0, 8, 2, 0, 32, 2, 0, 16, 8, 4, 0, 0, 0, 0, 0, 40, 0, 4, 0, 0, 32, 0, 0, 255,255,255,3, - 16, 0, 0, 0, 17, 73, 20, 1, 0, 0, 0, 0, 72, 0, 6, 0, 0, 0, 0, 0, 145,77, 30, 1, 0, 0, 0, 0, 0, 4, 4, 2, 0, 0, 0, 0, 9, 65, 18, 0, - 0, 0, 0, 0, 20, 1, 8, 0, 0, 4, 0, 0, 49, 65, 16, 0, 0, 0, 0, 0, 145,104,2, 0, 0, 0, 0, 0, 0, 104,32, 0, 0, 0, 0, 0, 16, 193,20, 0, - 0, 32, 0, 0, 0, 160,12, 2, 0, 8, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 88, 69, 24, 0, 0, 32, 0, 0, 0, 16, 56, 0, 0, 0, 0, 0, 145,192,22, 1, - 0, 0, 0, 0, 40, 32, 22, 0, 0, 0, 0, 0, 21, 197,12, 2, 0, 0, 0, 0, 12, 160,0, 0, 0, 0, 0, 0, 145,65, 14, 2, 0, 0, 0, 0, 69, 65, 22, 0, - 0, 0, 0, 0, 4, 96, 28, 2, 0, 0, 0, 0, 24, 8, 12, 0, 0, 0, 0, 0, 176,8, 0, 0, 0, 0, 0, 0, 2, 32, 4, 2, 0, 0, 0, 0, 5, 0, 8, 2, - 0, 0, 0, 0, 84, 64, 4, 0, 0, 0, 0, 0, 4, 12, 70, 0, 0, 0, 0, 0, 124,53, 14, 3, 0, 0, 0, 0, 152,64, 0, 1, 0, 0, 0, 0, 17, 1, 24, 0, - 0, 0, 0, 0, 9, 8, 6, 0, 0, 0, 0, 0, 145,5, 12, 2, 0, 0, 0, 0, 30, 97, 4, 2, 0, 0, 0, 0, 8, 180,64, 0, 0, 232,31, 0, 17, 101,92, 3, - 0, 85, 2, 0, 0, 16, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 21, 2, 0, 0, 0, 0, 0, 0, 145,0, 0, 0, 0, 0, 0, 0, 17, 2, 0, 0, 0, 0, 0, - 0, 64, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 84, 176,14, 0, 0, 0, 0, 0, 4, 200,8, 0, 0, 0, 0, 0, 1, 1, 76, 0, 0, 0, 0, 0, 12, 8, 0, 0, - 0, 16, 0, 0, 16, 97, 0, 0, 0, 32, 8, 0, 75, 152,12, 0, 0, 0, 0, 0, 179,69, 20, 1, 0, 0, 0, 0, 132,4, 6, 0, 0, 0, 0, 0, 255,255,30, 3, - 0, 32, 0, 0, 16, 25, 4, 0, 0, 0, 0, 0, 4, 0, 149,0, 0, 8, 0, 0, 1, 73, 4, 0, 0, 0, 0, 0, 88, 72, 20, 0, 0, 0, 0, 0, 138,40, 14, 1, - 0, 0, 0, 0, 26, 1, 4, 1, 0, 0, 0, 0, 153,25, 68, 0, 0, 0, 0, 0, 245,221,109,0, 0, 0, 0, 0, 0, 48, 84, 0, 0, 0, 0, 0, 0, 65, 10, 0, - 0, 0, 0, 0, 13, 0, 12, 2, 0, 0, 0, 0, 19, 81, 20, 1, 0, 0, 0, 0, 8, 48, 2, 1, 0, 0, 0, 0, 16, 64, 20, 2, 0, 0, 0, 0, 3, 149,0, 0, - 0, 0, 0, 0, 221,103,140,3, 0, 0, 0, 0, 18, 9, 0, 1, 0, 0, 0, 0, 1, 1, 12, 0, 0, 0, 0, 0, 132,0, 12, 0, 0, 0, 0, 0, 17, 1, 6, 1, - 0, 16, 0, 0, 17, 73, 4, 0, 0, 0, 0, 0, 33, 197,20, 0, 0, 160,0, 0, 8, 0, 4, 0, 0, 0, 0, 0, 127,237,126,3, 0, 0, 0, 0, 114,136,6, 0, - 0, 240,12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 9, 80, 0, 0, 0, 0, 0, 149,69, 12, 3, 0, 0, 0, 0, 21, 213,2, 1, 0, 224,47, 0, 118,28, 4, 1, - 16, 0, 0, 0, 149,113,30, 2, 0, 0, 0, 0, 0, 57, 14, 0, 0, 0, 0, 0, 136,2, 0, 0, 0, 0, 0, 0, 0, 40, 128,0, 0, 0, 0, 0, 119,238,94, 0, - 0, 0, 0, 0, 1, 64, 10, 0, 0, 0, 16, 0, 16, 0, 2, 0, 0, 0, 0, 0, 17, 64, 32, 0, 0, 0, 0, 0, 89, 81, 18, 2, 0, 32, 8, 0, 17, 0, 4, 0, - 0, 0, 0, 0, 8, 16, 8, 0, 0, 0, 0, 0, 4, 184,140,0, 0, 0, 0, 0, 144,12, 0, 0, 0, 224,59, 0, 255,241,119,2, 0, 96, 0, 0, 1, 0, 65, 0, - 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 64, 4, 0, 0, 0, 64, 0, 0, 0, 0, 0, 218,187,94, 3, 16, 0, 0, 0, 17, 0, 0, 0, - 0, 0, 0, 0, 18, 1, 70, 0, 0, 224,8, 0, 16, 193,229,2, 0, 64, 0, 0, 0, 0, 64, 0, 0, 0, 1, 0, 0, 0, 65, 0, 0, 32, 0, 0, 20, 0, 0, 0, - 0, 0, 0, 0, 33, 16, 128,0, 0, 0, 0, 0, 0, 0, 68, 2, 0, 0, 0, 0, 99, 108,0, 2, 0, 0, 0, 0, 16, 130,0, 0, 0, 0, 0, 0, 33, 0, 64, 0, - 0, 32, 0, 0, 129,0, 65, 0, 0, 32, 8, 0, 1, 0, 65, 0, 0, 32, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 29, 0, 0, 0, 16, 0, 0, 0, 31, 121,14, 1, - 0, 0, 0, 0, 221,189,46, 1, 0, 224,0, 0, 0, 32, 6, 0, 0, 0, 0, 0, 148,25, 0, 0, 0, 0, 0, 0, 77, 32, 12, 2, 0, 0, 1, 0, 17, 1, 18, 0, - 0, 0, 0, 0, 36, 0, 8, 2, 0, 0, 0, 0, 17, 44, 10, 0, 0, 0, 0, 0, 58, 25, 4, 0, 0, 0, 0, 0, 137,1, 8, 0, 0, 0, 0, 0, 16, 0, 26, 0, - 0, 0, 4, 0, 4, 32, 0, 0, 0, 0, 0, 0, 31, 187,62, 2, 0, 0, 0, 0, 32, 40, 3, 0, 0, 32, 0, 0, 19, 1, 4, 1, 0, 32, 0, 0, 38, 8, 74, 0, - 0, 0, 0, 0, 4, 32, 8, 3, 0, 0, 0, 0, 20, 65, 10, 1, 0, 32, 0, 0, 0, 73, 4, 0, 0, 0, 0, 0, 223,190,175,2, 0, 32, 0, 0, 16, 41, 12, 1, - 0, 32, 0, 0, 16, 28, 24, 0, 0, 0, 0, 0, 17, 89, 8, 0, 0, 0, 0, 0, 31, 109,8, 2, 0, 0, 0, 0, 144,1, 16, 1, 0, 0, 0, 0, 73, 64, 16, 0, - 0, 0, 0, 0, 64, 0, 4, 2, 0, 0, 0, 0, 16, 136,8, 0, 0, 0, 0, 0, 16, 80, 28, 0, 0, 0, 0, 0, 64, 0, 1, 0, 0, 0, 0, 0, 12, 33, 46, 0, - 16, 0, 0, 0, 17, 1, 0, 0, 0, 160,0, 0, 17, 0, 5, 0, 0, 128,0, 0, 16, 0, 1, 0, 0, 32, 0, 0, 16, 0, 1, 0, 0, 160,9, 0, 25, 128,7, 2, - 0, 128,1, 0, 1, 0, 3, 0, 0, 32, 0, 0, 0, 0, 1, 2, 0, 32, 1, 0, 33, 0, 8, 2, 0, 32, 3, 0, 65, 0, 8, 3, 0, 240,63, 0, 1, 0, 16, 3, - 0, 32, 16, 0, 0, 1, 0, 0, 0, 228,9, 0, 191,255,254,3, 0, 0, 0, 0, 177,7, 12, 0, 0, 80, 0, 0, 4, 0, 0, 0, 0, 0, 32, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 106,146,12, 0, 0, 0, 0, 0, 19, 103,22, 1, 0, 0, 0, 0, 200,40, 30, 0, 0, 32, 4, 0, 0, 64, 12, 0, 0, 0, 0, 0, 132,40, 2, 1, - 0, 0, 0, 0, 25, 40, 8, 0, 0, 0, 0, 0, 2, 41, 10, 0, 0, 0, 0, 0, 149,69, 1, 3, 0, 0, 0, 0, 172,16, 78, 1, 0, 96, 0, 0, 0, 0, 132,0, - 0, 0, 0, 0, 17, 25, 0, 0, 0, 48, 12, 0, 16, 8, 4, 0, 0, 0, 0, 0, 7, 104,12, 0, 0, 0, 0, 0, 191,125,124,3, 0, 0, 0, 0, 66, 20, 10, 0, - 0, 0, 0, 0, 6, 126,10, 0, 0, 0, 0, 0, 85, 105,156,0, 0, 0, 32, 0, 0, 8, 4, 0, 0, 0, 0, 0, 145,4, 4, 0, 0, 32, 0, 0, 245,185,12, 0, - 0, 0, 0, 0, 128,64, 12, 0, 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 171,28, 12, 0, 0, 0, 0, 0, 49, 9, 28, 0, 0, 0, 0, 0, 144,41, 0, 0, - 0, 0, 0, 0, 8, 4, 1, 0, 0, 0, 0, 0, 217,121,92, 0, 0, 0, 0, 0, 0, 49, 6, 2, 0, 0, 0, 0, 129,64, 32, 0, 0, 0, 0, 0, 17, 121,82, 0, - 0, 0, 0, 0, 0, 25, 12, 0, 0, 0, 0, 0, 16, 34, 4, 0, 0, 0, 0, 0, 111,252,14, 0, 0, 0, 0, 0, 151,25, 78, 0, 0, 0, 0, 0, 255,113,108,1, - 0, 96, 12, 0, 0, 0, 4, 0, 0, 0, 0, 0, 23, 73, 12, 0, 0, 0, 0, 0, 25, 229,92, 1, 0, 0, 0, 0, 194,170,14, 0, 0, 0, 0, 0, 16, 32, 68, 0, - 0, 0, 0, 0, 51, 204,12, 0, 0, 96, 0, 0, 127,255,30, 3, 0, 0, 0, 0, 204,173,30, 3, 0, 96, 0, 0, 0, 32, 20, 0, 0, 0, 0, 0, 65, 0, 2, 0, - 0, 0, 0, 0, 1, 40, 14, 3, 0, 0, 0, 0, 129,0, 68, 0, 0, 0, 0, 0, 48, 40, 6, 0, 0, 0, 0, 0, 72, 0, 18, 0, 0, 0, 0, 0, 72, 40, 2, 0, - 0, 0, 0, 0, 251,65, 24, 1, 0, 0, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 255,119,124,0, 0, 0, 0, 0, 216,8, 50, 0, 0, 0, 0, 0, 209,77, 78, 3, - 0, 0, 0, 0, 128,8, 0, 2, 0, 0, 0, 0, 32, 136,0, 0, 0, 32, 0, 0, 0, 41, 0, 0, 0, 96, 0, 0, 2, 16, 4, 0, 0, 0, 0, 0, 17, 225,0, 0, - 0, 240,62, 0, 0, 64, 4, 0, 0, 96, 32, 0, 32, 0, 0, 0, 0, 0, 0, 0, 25, 8, 8, 0, 0, 0, 0, 0, 43, 73, 0, 0, 0, 0, 0, 0, 145,205,28, 0, - 0, 0, 0, 0, 4, 184,0, 0, 0, 32, 0, 0, 17, 73, 4, 0, 0, 0, 0, 0, 0, 160,4, 2, 0, 0, 0, 0, 25, 65, 0, 1, 0, 0, 0, 0, 32, 8, 6, 1, - 0, 0, 0, 0, 159,253,28, 0, 0, 0, 0, 0, 129,64, 0, 2, 0, 0, 0, 0, 25, 89, 24, 0, 0, 0, 0, 0, 3, 64, 16, 1, 0, 0, 0, 0, 16, 17, 32, 0, - 0, 96, 4, 0, 32, 16, 12, 0, 0, 0, 0, 0, 191,253,30, 2, 0, 0, 0, 0, 4, 34, 10, 0, 0, 0, 0, 0, 8, 136,6, 0, 0, 0, 0, 0, 123,86, 2, 0, - 0, 0, 0, 0, 96, 96, 28, 0, 0, 0, 0, 0, 40, 0, 0, 1, 0, 0, 0, 0, 64, 144,0, 0, 0, 0, 0, 0, 4, 128,0, 1, 0, 0, 0, 0, 254,184,12, 2, - 0, 160,4, 0, 148,104,68, 0, 0, 32, 0, 0, 6, 0, 64, 0, 0, 0, 0, 0, 20, 100,12, 2, 0, 0, 0, 0, 153,13, 14, 0, 0, 32, 0, 0, 255,120,12, 1, - 0, 0, 0, 0, 64, 56, 4, 0, 0, 0, 0, 0, 89, 65, 32, 2, 0, 0, 0, 0, 0, 36, 32, 0, 0, 0, 0, 0, 0, 36, 1, 0, 0, 64, 0, 0, 196,1, 0, 0, - 0, 4, 0, 0, 37, 24, 8, 0, 0, 0, 0, 0, 0, 1, 32, 1, 0, 0, 0, 0, 98, 32, 1, 0, 0, 0, 0, 0, 110,249,126,3, 0, 0, 0, 0, 128,0, 9, 0, - 0, 8, 0, 0, 25, 115,20, 1, 0, 40, 0, 0, 16, 0, 4, 0, 0, 96, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 145,73, 0, 0, 0, 0, 0, 0, 218,57, 12, 1, - 0, 0, 0, 0, 64, 0, 12, 2, 0, 0, 0, 0, 88, 17, 102,1, 0, 0, 0, 0, 144,97, 4, 0, 0, 0, 0, 0, 0, 17, 136,0, 0, 0, 0, 0, 147,81, 18, 0, - 0, 0, 0, 0, 4, 45, 2, 0, 0, 96, 0, 0, 24, 72, 4, 2, 0, 0, 0, 0, 0, 104,18, 0, 0, 0, 0, 0, 36, 13, 14, 0, 0, 0, 0, 0, 149,109,30, 3, - 0, 0, 0, 0, 0, 168,6, 0, 0, 0, 0, 0, 8, 165,4, 0, 0, 0, 0, 0, 17, 5, 10, 0, 0, 0, 0, 0, 56, 224,10, 0, 0, 0, 0, 0, 66, 185,50, 0, - 0, 0, 0, 0, 2, 144,0, 0, 0, 32, 8, 0, 44, 32, 37, 0, 0, 0, 0, 0, 0, 144,14, 0, 0, 240,39, 0, 255,253,126,0, 0, 0, 0, 0, 17, 65, 66, 1, - 0, 0, 0, 0, 1, 44, 34, 0, 0, 0, 0, 0, 68, 0, 16, 0, 0, 0, 0, 0, 60, 188,38, 1, 0, 0, 0, 0, 2, 1, 0, 2, 0, 0, 0, 0, 16, 0, 38, 0, - 0, 0, 0, 0, 64, 1, 72, 0, 0, 0, 0, 0, 0, 64, 26, 0, 0, 0, 0, 0, 109,36, 6, 0, 0, 0, 0, 0, 132,4, 8, 0, 0, 0, 0, 0, 68, 96, 0, 0, - 0, 0, 0, 0, 1, 33, 144,0, 0, 0, 0, 0, 12, 0, 32, 0, 0, 0, 0, 0, 6, 0, 36, 0, 0, 0, 0, 0, 145,68, 8, 0, 0, 0, 0, 0, 4, 160,132,0, - 0, 0, 0, 0, 238,188,172,0, 0, 0, 0, 0, 144,0, 20, 1, 0, 32, 0, 0, 0, 16, 6, 0, 0, 0, 0, 0, 49, 73, 22, 0, 0, 0, 0, 0, 80, 32, 14, 0, - 0, 0, 0, 0, 81, 105,26, 0, 0, 0, 0, 0, 0, 41, 14, 2, 0, 32, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0, 136,40, 6, 0, 0, 0, 0, 0, 21, 1, 12, 0, - 0, 0, 0, 0, 21, 112,20, 0, 0, 0, 0, 0, 16, 24, 6, 0, 0, 0, 0, 0, 59, 127,22, 1, 0, 0, 0, 0, 66, 36, 6, 0, 0, 0, 0, 0, 18, 0, 3, 0, - 0, 0, 0, 0, 2, 0, 34, 0, 0, 0, 0, 0, 255,124,44, 0, 0, 0, 0, 0, 145,88, 4, 0, 0, 0, 0, 0, 98, 20, 72, 0, 0, 0, 0, 0, 48, 24, 4, 0, - 0, 0, 0, 0, 145,40, 4, 0, 0, 0, 0, 0, 19, 112,20, 0, 0, 0, 0, 0, 255,85, 108,0, 0, 0, 0, 0, 4, 52, 6, 0, 0, 0, 0, 0, 84, 32, 8, 0, - 0, 0, 0, 0, 36, 16, 56, 0, 0, 0, 0, 0, 156,57, 76, 2, 0, 0, 0, 0, 145,24, 12, 2, 0, 0, 0, 0, 147,89, 20, 0, 0, 0, 0, 0, 49, 205,16, 1, - 0, 0, 0, 0, 36, 129,152,1, 0, 0, 0, 0, 97, 32, 32, 0, 0, 0, 0, 0, 245,32, 37, 0, 0, 0, 0, 0, 40, 32, 36, 0, 0, 0, 0, 0, 51, 253,20, 1, - 0, 0, 0, 0, 72, 173,14, 0, 0, 0, 0, 0, 10, 56, 2, 1, 0, 0, 0, 0, 69, 40, 140,0, 0, 0, 0, 0, 8, 32, 62, 0, 0, 0, 0, 0, 127,117,127,3, - 0, 0, 0, 0, 16, 61, 26, 1, 0, 0, 0, 0, 81, 8, 74, 0, 0, 0, 0, 0, 0, 28, 14, 1, 0, 0, 0, 0, 20, 32, 128,0, 0, 0, 0, 0, 2, 25, 118,0, - 0, 0, 0, 0, 150,1, 4, 0, 0, 0, 0, 0, 49, 65, 4, 2, 0, 0, 0, 0, 1, 52, 0, 0, 0, 0, 0, 0, 4, 184,6, 0, 0, 4, 0, 0, 145,221,62, 1, - 0, 0, 0, 0, 4, 1, 46, 1, 0, 0, 0, 0, 5, 40, 10, 0, 0, 0, 0, 0, 9, 16, 4, 0, 0, 0, 0, 0, 32, 144,6, 0, 0, 0, 0, 0, 16, 48, 4, 0, - 0, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 74, 8, 10, 0, 0, 0, 0, 0, 48, 70, 16, 0, 0, 0, 0, 0, 141,9, 0, 0, 0, 0, 0, 0, 149,233,60, 0, - 0, 0, 0, 0, 13, 61, 10, 0, 0, 0, 0, 0, 48, 17, 4, 0, 0, 32, 0, 0, 1, 0, 12, 0, 0, 0, 0, 0, 72, 168,12, 0, 0, 0, 0, 0, 0, 40, 22, 0, - 0, 0, 0, 0, 8, 0, 48, 0, 0, 0, 0, 0, 4, 4, 6, 0, 0, 0, 0, 0, 49, 1, 4, 0, 0, 0, 0, 0, 68, 0, 10, 0, 0, 0, 0, 0, 49, 73, 22, 1, - 0, 0, 0, 0, 96, 32, 40, 0, 0, 0, 0, 0, 18, 152,6, 0, 0, 0, 0, 0, 112,0, 2, 0, 0, 0, 0, 0, 189,109,30, 3, 0, 0, 0, 0, 0, 61, 2, 0, - 0, 0, 0, 0, 0, 172,6, 0, 0, 0, 0, 0, 20, 32, 10, 0, 0, 0, 0, 0, 65, 65, 16, 0, 0, 0, 0, 0, 2, 137,0, 0, 0, 0, 0, 0, 24, 16, 4, 0, - 0, 0, 0, 0, 19, 0, 32, 0, 0, 0, 0, 0, 97, 0, 36, 0, 0, 0, 0, 0, 154,168,44, 0, 0, 0, 0, 0, 144,9, 8, 2, 0, 64, 0, 0, 25, 73, 52, 0, - 0, 0, 0, 0, 0, 28, 10, 1, 0, 0, 0, 0, 1, 41, 14, 0, 0, 0, 0, 0, 65, 0, 24, 0, 0, 0, 0, 0, 19, 81, 12, 0, 0, 0, 0, 0, 16, 8, 46, 0, - 0, 0, 4, 0, 16, 129,4, 0, 0, 0, 1, 0, 0, 1, 4, 0, 0, 0, 0, 0, 4, 13, 2, 0, 0, 0, 0, 0, 0, 64, 56, 0, 0, 0, 0, 0, 41, 64, 194,1, - 0, 0, 4, 0, 18, 116,4, 0, 0, 0, 0, 0, 0, 8, 6, 2, 0, 0, 0, 0, 64, 8, 18, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 4, 0, 196,167,34, 1, - 0, 0, 0, 0, 50, 46, 32, 0, 0, 0, 0, 0, 76, 32, 50, 1, 0, 4, 0, 0, 160,16, 8, 2, 0, 0, 0, 0, 196,0, 0, 0, 0, 0, 0, 0, 32, 18, 0, 0, - 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 34, 0, 136,0, 0, 0, 0, 0, 64, 4, 2, 0, 0, 0, 0, 0, 32, 20, 0, 0, 0, 0, 0, 0, 179,67, 24, 1, - 0, 0, 0, 0, 148,144,8, 0, 0, 0, 0, 0, 27, 113,92, 3, 0, 0, 0, 0, 208,25, 4, 0, 0, 0, 0, 0, 34, 2, 0, 1, 0, 0, 0, 0, 1, 48, 0, 2, - 0, 0, 0, 0, 130,8, 6, 0, 0, 32, 0, 0, 4, 128,4, 0, 0, 0, 0, 0, 0, 5, 2, 0, 0, 0, 0, 0, 25, 48, 14, 0, 0, 0, 0, 0, 25, 65, 18, 1, - 0, 0, 0, 0, 26, 24, 4, 0, 0, 0, 0, 0, 24, 0, 0, 1, 0, 0, 0, 0, 1, 120,12, 0, 0, 0, 0, 0, 255,255,189,3, 0, 0, 0, 0, 9, 42, 28, 2, - 0, 0, 0, 0, 4, 104,22, 0, 0, 0, 0, 0, 0, 1, 6, 1, 0, 0, 0, 0, 9, 64, 0, 1, 0, 0, 0, 0, 32, 32, 12, 2, 0, 0, 0, 0, 181,77, 16, 0, - 0, 0, 0, 0, 1, 64, 24, 0, 0, 0, 16, 0, 0, 48, 0, 0, 0, 32, 0, 0, 55, 121,74, 1, 0, 32, 0, 0, 8, 0, 12, 0, 0, 240,59, 0, 4, 64, 44, 0, - 0, 0, 0, 0, 0, 56, 6, 1, 0, 0, 0, 0, 16, 32, 20, 0, 0, 32, 4, 0, 49, 121,4, 1, 0, 0, 0, 0, 4, 4, 16, 0, 0, 0, 0, 0, 32, 0, 4, 1, - 0, 0, 0, 0, 132,0, 10, 0, 0, 0, 0, 0, 89, 233,0, 0, 0, 0, 0, 0, 1, 248,6, 0, 0, 0, 0, 0, 16, 41, 64, 0, 0, 0, 0, 0, 42, 8, 68, 0, - 0, 0, 0, 0, 238,188,190,0, 0, 0, 0, 0, 16, 25, 0, 1, 0, 0, 0, 0, 8, 0, 12, 2, 0, 0, 0, 0, 80, 45, 12, 2, 0, 0, 0, 0, 136,1, 36, 2, - 0, 0, 0, 0, 49, 12, 10, 0, 0, 0, 0, 0, 16, 73, 6, 0, 0, 0, 0, 0, 219,105,36, 0, 0, 0, 0, 0, 0, 40, 28, 2, 0, 32, 1, 0, 176,121,4, 1, - 0, 0, 0, 0, 2, 40, 26, 0, 0, 0, 0, 0, 192,160,4, 0, 0, 0, 0, 0, 16, 100,0, 0, 0, 0, 0, 0, 17, 13, 0, 1, 0, 0, 0, 0, 51, 223,20, 0, - 0, 0, 0, 0, 125,229,12, 2, 0, 0, 0, 0, 113,72, 12, 0, 0, 0, 0, 0, 146,8, 6, 1, 0, 0, 0, 0, 218,89, 95, 0, 0, 0, 0, 0, 1, 1, 2, 1, - 0, 0, 0, 0, 98, 170,30, 2, 0, 0, 0, 0, 21, 204,12, 0, 0, 0, 0, 0, 24, 104,10, 1, 0, 0, 0, 0, 159,237,13, 0, 0, 0, 0, 0, 8, 32, 70, 0, - 0, 0, 0, 0, 21, 80, 30, 2, 0, 32, 0, 0, 4, 8, 2, 0, 0, 0, 0, 0, 144,77, 0, 0, 0, 0, 0, 0, 17, 109,16, 0, 0, 0, 0, 0, 24, 9, 6, 0, - 0, 0, 0, 0, 11, 0, 0, 0, 0, 32, 0, 0, 171,217,110,0, 0, 0, 0, 0, 17, 68, 96, 2, 0, 0, 0, 0, 140,165,114,1, 0, 0, 0, 0, 8, 4, 0, 1, - 0, 0, 0, 0, 5, 34, 0, 0, 0, 0, 0, 0, 50, 0, 8, 0, 0, 0, 0, 0, 40, 0, 0, 2, 0, 0, 0, 0, 33, 129,2, 0, 0, 0, 0, 0, 1, 8, 32, 2, - 0, 0, 0, 0, 44, 120,14, 0, 0, 0, 0, 0, 159,29, 78, 1, 0, 0, 0, 0, 16, 5, 140,1, 0, 32, 0, 0, 19, 105,30, 1, 0, 0, 0, 0, 4, 37, 14, 1, - 0, 0, 0, 0, 0, 1, 12, 1, 0, 0, 0, 0, 12, 40, 6, 3, 0, 0, 0, 0, 72, 1, 14, 0, 0, 240,63, 0, 17, 65, 6, 0, 0, 0, 0, 0, 28, 40, 14, 0, - 0, 96, 0, 0, 147,0, 4, 2, 0, 0, 0, 0, 24, 0, 12, 3, 0, 32, 0, 0, 144,97, 4, 0, 0, 0, 0, 0, 1, 104,16, 0, 0, 0, 0, 0, 149,77, 7, 0, - 0, 0, 0, 0, 185,77, 16, 0, 0, 64, 0, 0, 0, 16, 10, 0, 0, 0, 0, 0, 36, 40, 6, 2, 16, 104,4, 0, 191,249,102,3, 0, 0, 0, 0, 34, 40, 64, 0, - 0, 0, 0, 0, 40, 40, 10, 1, 0, 112,28, 0, 24, 16, 14, 0, 0, 32, 0, 0, 0, 32, 32, 0, 0, 224,7, 0, 10, 16, 12, 1, 0, 0, 0, 0, 219,117,102,1, - 0, 0, 0, 0, 2, 60, 6, 0, 0, 0, 0, 0, 179,121,70, 2, 0, 0, 0, 0, 2, 1, 8, 0, 0, 0, 0, 0, 71, 120,5, 0, 0, 0, 0, 0, 68, 0, 17, 0, - 0, 0, 0, 0, 0, 0, 20, 2, 0, 0, 0, 0, 16, 1, 4, 2, 0, 0, 0, 0, 238,188,110,0, 0, 0, 0, 0, 1, 24, 2, 0, 0, 0, 0, 0, 20, 45, 4, 0, - 0, 0, 0, 0, 32, 12, 0, 0, 0, 0, 0, 0, 209,97, 22, 0, 0, 0, 0, 0, 17, 40, 4, 0, 0, 0, 0, 0, 32, 8, 68, 0, 0, 0, 0, 0, 25, 121,78, 1, - 0, 0, 0, 0, 49, 81, 0, 0, 0, 0, 0, 0, 72, 4, 12, 0, 0, 0, 0, 0, 57, 201,12, 1, 0, 0, 0, 0, 0, 164,132,1, 0, 0, 0, 0, 179,81, 14, 1, - 0, 0, 0, 0, 40, 33, 6, 1, 0, 32, 0, 0, 70, 0, 4, 0, 0, 0, 0, 0, 4, 0, 112,0, 0, 0, 0, 0, 40, 32, 4, 0, 0, 0, 0, 0, 51, 247,22, 1, - 0, 96, 0, 0, 68, 33, 70, 1, 0, 144,6, 0, 0, 0, 0, 0, 0, 96, 8, 0, 29, 97, 28, 1, 0, 0, 0, 0, 21, 36, 4, 2, 0, 0, 0, 0, 0, 105,6, 1, - 0, 0, 0, 0, 80, 40, 10, 0, 0, 0, 0, 0, 48, 1, 2, 0, 0, 32, 0, 0, 253,103,13, 3, 0, 0, 0, 0, 16, 0, 14, 1, 0, 0, 0, 0, 49, 1, 0, 1, - 0, 0, 0, 0, 40, 180,14, 0, 0, 0, 0, 0, 16, 41, 28, 1, 0, 0, 0, 0, 17, 1, 68, 0, 0, 32, 0, 0, 48, 17, 4, 1, 0, 32, 0, 0, 146,5, 4, 0, - 0, 0, 0, 0, 17, 133,4, 0, 0, 0, 0, 0, 8, 0, 70, 0, 0, 0, 0, 0, 17, 69, 14, 1, 0, 0, 0, 0, 151,125,92, 3, 0, 0, 0, 0, 12, 56, 62, 2, - 0, 0, 0, 0, 18, 1, 32, 1, 0, 0, 0, 0, 0, 0, 18, 2, 0, 0, 0, 0, 129,65, 18, 0, 0, 32, 0, 0, 16, 16, 66, 0, 0, 32, 0, 0, 143,60, 126,1, - 0, 32, 8, 0, 8, 0, 4, 0, 0, 0, 0, 0, 255,76, 79, 2, 0, 0, 0, 0, 21, 104,8, 0, 0, 32, 0, 0, 0, 4, 6, 0, 0, 0, 0, 0, 31, 121,48, 1, - 0, 0, 1, 0, 81, 33, 8, 1, 0, 0, 0, 0, 8, 48, 1, 0, 0, 0, 0, 0, 149,117,30, 2, 0, 0, 0, 0, 0, 32, 170,0, 0, 0, 0, 0, 247,92, 70, 0, - 0, 0, 0, 0, 128,16, 0, 1, 0, 0, 0, 0, 16, 113,64, 1, 0, 0, 0, 0, 254,185,238,3, 0, 0, 0, 0, 17, 41, 14, 0, 0, 0, 0, 0, 144,0, 4, 1, - 0, 0, 0, 0, 8, 4, 12, 0, 0, 0, 0, 0, 148,1, 28, 0, 0, 0, 0, 0, 144,73, 12, 2, 0, 0, 4, 0, 8, 16, 6, 0, 0, 0, 0, 0, 159,121,14, 2, - 0, 0, 0, 0, 19, 1, 0, 1, 0, 32, 0, 0, 95, 14, 12, 0, 0, 32, 0, 0, 16, 9, 12, 0, 0, 0, 0, 0, 81, 113,4, 3, 0, 0, 0, 0, 2, 60, 0, 0, - 0, 64, 0, 0, 185,144,41, 0, 0, 128,4, 0, 210,64, 0, 1, 0, 0, 1, 0, 16, 0, 0, 0, 0, 0, 1, 0, 255,255,254,3, 0, 0, 0, 0, 14, 33, 2, 0, - 0, 0, 0, 0, 19, 105,22, 1, 0, 32, 0, 0, 8, 1, 4, 1, 0, 0, 0, 0, 4, 104,6, 0, 0, 32, 0, 0, 41, 0, 4, 2, 0, 0, 0, 0, 29, 100,4, 0, - 0, 0, 0, 0, 132,5, 0, 0, 0, 0, 0, 0, 24, 25, 20, 1, 0, 0, 0, 0, 219,125,6, 3, 0, 0, 0, 0, 6, 32, 14, 0, 0, 0, 0, 0, 16, 73, 16, 1, - 0, 0, 0, 0, 26, 40, 6, 0, 0, 0, 0, 0, 84, 112,4, 0, 0, 0, 0, 0, 238,8, 12, 2, 0, 0, 0, 0, 68, 1, 12, 0, 0, 0, 0, 0, 53, 65, 16, 0, - 0, 0, 0, 0, 21, 105,18, 0, 0, 0, 0, 0, 64, 65, 4, 0, 0, 0, 0, 0, 211,64, 6, 0, 0, 96, 48, 0, 0, 16, 0, 0, 0, 0, 0, 0, 16, 120,14, 0, - 0, 0, 0, 0, 4, 42, 44, 2, 0, 0, 0, 0, 129,48, 0, 0, 0, 128,0, 0, 17, 105,0, 2, 0, 0, 0, 0, 10, 16, 6, 3, 0, 32, 0, 0, 16, 0, 0, 1, - 0, 0, 0, 0, 51, 249,6, 1, 0, 0, 0, 0, 0, 40, 130,0, 0, 0, 0, 0, 180,72, 20, 0, 0, 0, 0, 0, 52, 64, 0, 0, 0, 0, 1, 0, 125,101,111,3, - 0, 0, 0, 0, 2, 0, 66, 0, 0, 0, 0, 0, 113,88, 5, 0, 0, 0, 0, 0, 164,128,8, 2, 0, 0, 0, 0, 17, 173,10, 0, 0, 0, 0, 0, 1, 65, 16, 1, - 0, 0, 0, 0, 151,173,30, 3, 0, 0, 0, 0, 0, 12, 64, 0, 0, 0, 0, 0, 0, 44, 34, 0, 0, 64, 0, 0, 185,25, 104,0, 0, 32, 0, 0, 17, 121,80, 0, - 0, 0, 0, 0, 0, 12, 14, 1, 0, 96, 8, 0, 0, 64, 36, 0, 0, 0, 0, 0, 33, 32, 0, 0, 0, 0, 12, 0, 0, 0, 4, 0, 0, 0, 0, 0, 10, 49, 0, 0, - 0, 96, 2, 0, 10, 0, 68, 0, 0, 0, 0, 0, 209,29, 12, 2, 0, 0, 0, 0, 6, 32, 2, 0, 0, 0, 0, 0, 17, 25, 36, 0, 0, 0, 0, 0, 145,17, 0, 1, - 0, 0, 0, 0, 18, 8, 12, 2, 0, 0, 0, 0, 2, 65, 0, 3, 0, 0, 0, 0, 223,254,28, 2, 16, 0, 0, 0, 0, 40, 0, 2, 0, 112,0, 0, 1, 32, 12, 0, - 0, 0, 0, 0, 21, 101,16, 0, 0, 0, 0, 0, 4, 34, 0, 0, 0, 0, 0, 0, 144,4, 2, 0, 0, 0, 0, 0, 19, 81, 0, 2, 0, 0, 0, 0, 11, 32, 2, 0, - 0, 0, 0, 0, 24, 100,0, 0, 0, 0, 0, 0, 17, 8, 0, 2, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 32, 0, 145,0, 16, 0, 16, 124,47, 0, 255,255,255,3, - 0, 0, 0, 0, 5, 209,0, 0, 0, 0, 0, 0, 197,202,4, 0, 0, 96, 0, 0, 1, 8, 4, 0, 0, 0, 0, 0, 106,60, 46, 0, 0, 0, 32, 0, 1, 0, 0, 0, - 0, 144,2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204,46, 14, 0, 0, 0, 0, 0, 192,0, 8, 0, 0, 0, 0, 0, 9, 41, 10, 0, 0, 32, 0, 0, 132,1, 4, 0, - 0, 0, 0, 0, 1, 96, 6, 0, 0, 0, 0, 0, 141,68, 14, 2, 0, 0, 0, 0, 64, 48, 34, 1, 0, 0, 0, 0, 25, 9, 12, 0, 0, 0, 0, 0, 0, 16, 46, 2, - 0, 0, 0, 0, 17, 89, 38, 0, 0, 32, 0, 0, 255,121,50, 1, 0, 0, 0, 0, 128,100,10, 0, 0, 0, 0, 0, 10, 0, 70, 0, 0, 0, 0, 0, 80, 32, 3, 0, - 0, 0, 0, 0, 16, 36, 5, 0, 0, 96, 0, 0, 8, 16, 4, 0, 0, 0, 0, 0, 0, 24, 102,0, 0, 0, 0, 0, 116,189,8, 2, 0, 0, 0, 0, 64, 128,4, 2, - 0, 0, 0, 0, 57, 77, 10, 0, 0, 0, 0, 0, 204,12, 94, 0, 0, 0, 0, 0, 81, 89, 18, 0, 0, 0, 0, 0, 0, 57, 6, 1, 0, 0, 0, 0, 138,40, 14, 0, - 0, 0, 0, 0, 21, 33, 0, 0, 0, 0, 0, 0, 17, 123,30, 1, 0, 0, 0, 0, 74, 8, 2, 0, 0, 0, 0, 0, 130,40, 74, 0, 0, 128,20, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 127,188,46, 3, 0, 0, 0, 0, 55, 193,4, 0, 0, 0, 0, 0, 25, 9, 12, 2, 0, 34, 0, 0, 177,9, 4, 1, 0, 0, 0, 0, 8, 67, 0, 0, - 0, 0, 0, 0, 145,69, 30, 1, 0, 0, 0, 0, 80, 29, 14, 0, 0, 0, 0, 0, 148,32, 4, 0, 0, 0, 0, 0, 0, 24, 2, 1, 0, 0, 0, 0, 127,93, 125,3, - 0, 0, 0, 0, 175,61, 46, 3, 0, 0, 0, 0, 145,52, 14, 0, 0, 32, 0, 0, 32, 149,68, 0, 0, 0, 0, 0, 159,56, 164,2, 0, 0, 0, 0, 17, 81, 20, 1, - 0, 0, 0, 0, 140,0, 4, 2, 0, 0, 0, 0, 144,0, 6, 1, 0, 96, 0, 0, 9, 0, 4, 0, 0, 0, 0, 0, 128,241,92, 0, 0, 4, 0, 0, 81, 1, 4, 0, - 0, 0, 0, 0, 83, 16, 8, 0, 0, 0, 2, 0, 19, 249,84, 3, 0, 32, 0, 0, 8, 4, 0, 0, 0, 0, 0, 0, 9, 22, 12, 2, 0, 0, 0, 0, 72, 34, 12, 0, - 0, 0, 0, 0, 0, 16, 14, 1, 0, 0, 0, 0, 83, 24, 64, 0, 0, 96, 0, 0, 255,253,126,1, 0, 0, 0, 0, 153,175,14, 1, 0, 0, 0, 0, 1, 73, 8, 0, - 0, 0, 0, 0, 1, 69, 10, 0, 0, 0, 0, 0, 145,64, 18, 0, 0, 32, 0, 0, 0, 8, 2, 0, 0, 32, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 29, 44, 12, 0, - 0, 0, 0, 0, 29, 1, 10, 2, 0, 96, 12, 0, 14, 2, 4, 1, 0, 0, 0, 0, 193,108,78, 1, 0, 0, 0, 0, 25, 73, 6, 0, 0, 0, 0, 0, 64, 41, 8, 1, - 0, 0, 0, 0, 25, 9, 14, 0, 0, 32, 8, 0, 0, 0, 128,0, 16, 32, 0, 0, 255,255,63, 3, 16, 0, 0, 0, 79, 48, 12, 0, 0, 0, 0, 0, 144,4, 10, 0, - 0, 0, 0, 0, 4, 0, 6, 2, 0, 0, 0, 0, 32, 80, 8, 0, 0, 0, 0, 0, 243,249,127,3, 0, 0, 0, 0, 192,44, 56, 1, 0, 0, 0, 0, 56, 56, 6, 2, - 0, 0, 0, 0, 16, 2, 16, 0, 0, 0, 0, 0, 36, 24, 4, 0, 0, 96, 0, 0, 16, 64, 0, 0, 0, 32, 0, 0, 121,168,4, 0, 0, 0, 0, 0, 18, 52, 118,2, - 0, 0, 0, 0, 64, 12, 0, 0, 0, 224,4, 0, 8, 0, 4, 0, 0, 0, 1, 0, 1, 4, 6, 2, 0, 0, 0, 0, 16, 73, 10, 0, 0, 0, 0, 0, 209,75, 22, 0, - 0, 0, 0, 0, 0, 28, 14, 0, 0, 0, 0, 0, 17, 0, 32, 0, 0, 0, 0, 0, 67, 160,12, 0, 0, 0, 0, 0, 2, 36, 2, 1, 0, 0, 0, 0, 160,0, 96, 0, - 0, 0, 0, 0, 36, 52, 14, 0, 0, 0, 0, 0, 23, 69, 8, 0, 0, 0, 0, 0, 0, 48, 24, 0, 16, 0, 0, 0, 145,89, 94, 1, 0, 96, 0, 0, 117,57, 6, 1, - 0, 0, 0, 0, 73, 97, 0, 0, 0, 0, 0, 0, 83, 104,4, 2, 0, 0, 0, 0, 0, 184,6, 1, 0, 0, 0, 0, 5, 8, 2, 0, 0, 0, 0, 0, 0, 161,18, 0, - 0, 0, 0, 0, 177,237,22, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 32, 0, 0, 239,127,124,3, 0, 96, 12, 0, 143,16, 12, 0, 0, 0, 0, 0, 73, 1, 12, 2, - 0, 0, 0, 0, 0, 64, 96, 0, 0, 0, 0, 0, 0, 177,0, 0, 0, 32, 0, 0, 1, 32, 8, 0, 0, 0, 0, 0, 4, 96, 12, 0, 0, 0, 0, 0, 8, 98, 52, 1, - 0, 32, 0, 0, 149,229,29, 0, 0, 32, 0, 0, 160,124,0, 0, 0, 96, 10, 64, 9, 0, 4, 0, 0, 224,31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 34, 0, - 0, 128,0, 0, 151,241,30, 3, 0, 0, 0, 0, 0, 36, 98, 1, 0, 32, 4, 0, 1, 1, 4, 0, 0, 0, 0, 0, 17, 32, 38, 0, 0, 0, 0, 0, 16, 16, 70, 0, - 0, 0, 0, 0, 32, 8, 72, 0, 0, 0, 0, 0, 32, 0, 2, 1, 0, 96, 2, 0, 17, 65, 0, 0, 0, 0, 0, 0, 64, 50, 0, 0, 0, 0, 0, 0, 127,188,46, 0, - 0, 0, 0, 0, 130,12, 68, 0, 0, 0, 0, 0, 16, 225,12, 0, 0, 64, 0, 0, 9, 1, 0, 0, 0, 0, 0, 0, 8, 8, 10, 3, 0, 0, 0, 0, 21, 69, 32, 0, - 0, 0, 0, 0, 64, 45, 14, 0, 0, 0, 0, 0, 24, 5, 0, 1, 0, 32, 0, 0, 136,56, 6, 0, 0, 0, 0, 0, 4, 1, 4, 1, 0, 0, 0, 0, 77, 120,8, 0, - 0, 0, 0, 0, 81, 67, 0, 0, 0, 0, 0, 0, 4, 33, 18, 1, 0, 0, 0, 0, 223,61, 14, 1, 0, 64, 0, 0, 8, 41, 8, 1, 0, 0, 0, 0, 50, 81, 8, 0, - 0, 0, 0, 0, 55, 125,86, 1, 0, 0, 0, 0, 0, 164,36, 0, 0, 0, 0, 0, 88, 0, 10, 0, 0, 64, 0, 0, 17, 64, 4, 0, 0, 16, 0, 0, 149,73, 158,3, - 0, 0, 0, 0, 254,185,42, 0, 0, 0, 0, 0, 57, 137,0, 3, 0, 0, 0, 0, 17, 144,4, 0, 0, 32, 0, 0, 16, 65, 4, 1, 0, 0, 0, 0, 12, 57, 12, 0, - 0, 0, 0, 0, 1, 1, 18, 0, 0, 0, 0, 0, 17, 128,16, 0, 0, 0, 0, 0, 127,233,46, 1, 0, 0, 0, 0, 49, 65, 0, 0, 0, 0, 0, 0, 144,16, 24, 0, - 0, 0, 0, 0, 34, 0, 4, 2, 0, 0, 0, 0, 17, 125,82, 1, 0, 0, 0, 0, 63, 189,62, 1, 0, 0, 0, 0, 46, 136,2, 0, 0, 0, 0, 0, 44, 32, 10, 0, - 0, 0, 0, 0, 18, 145,4, 0, 0, 0, 0, 0, 94, 36, 8, 2, 0, 0, 0, 0, 58, 185,74, 0, 0, 0, 0, 0, 32, 17, 0, 0, 0, 0, 0, 0, 18, 25, 0, 0, - 0, 0, 0, 0, 58, 184,68, 0, 0, 0, 0, 0, 255,185,254,1, 0, 0, 0, 0, 26, 32, 14, 0, 0, 0, 0, 0, 10, 136,0, 0, 0, 0, 0, 0, 144,17, 4, 0, - 0, 0, 0, 0, 19, 209,0, 0, 0, 0, 0, 0, 124,76, 0, 2, 0, 0, 0, 0, 16, 133,0, 0, 0, 0, 0, 0, 50, 153,14, 2, 0, 0, 0, 0, 16, 56, 34, 0, - 0, 0, 0, 0, 55, 188,38, 2, 0, 0, 0, 0, 32, 160,32, 0, 0, 0, 0, 0, 42, 8, 6, 0, 0, 0, 0, 0, 32, 68, 2, 0, 0, 0, 0, 0, 9, 28, 12, 2, - 0, 0, 0, 0, 80, 4, 8, 0, 0, 0, 0, 0, 17, 157,0, 0, 0, 0, 0, 0, 72, 37, 0, 0, 0, 0, 0, 0, 1, 208,10, 0, 0, 0, 0, 0, 255,176,26, 0, - 0, 0, 0, 0, 212,181,30, 1, 0, 0, 0, 0, 126,48, 4, 0, 0, 0, 0, 0, 72, 4, 4, 2, 0, 0, 0, 0, 16, 33, 68, 0, 0, 0, 0, 0, 20, 176,12, 0, - 0, 0, 0, 0, 32, 144,12, 0, 0, 0, 0, 0, 18, 96, 12, 0, 0, 0, 0, 0, 18, 176,12, 0, 0, 0, 0, 0, 3, 128,0, 0, 0, 0, 0, 0, 136,40, 24, 0, - 0, 0, 0, 0, 16, 5, 8, 2, 0, 0, 0, 0, 20, 9, 2, 0, 0, 0, 0, 0, 0, 17, 8, 2, 0, 0, 0, 0, 92, 72, 8, 0, 0, 0, 0, 0, 82, 8, 8, 0, - 0, 0, 0, 0, 72, 8, 6, 0, 0, 0, 0, 0, 128,20, 12, 2, 0, 0, 0, 0, 164,32, 8, 0, 0, 0, 0, 0, 14, 141,26, 0, 0, 0, 0, 0, 22, 137,8, 0, - 0, 0, 0, 0, 2, 20, 2, 0, 0, 0, 0, 0, 8, 8, 0, 2, 0, 0, 0, 0, 30, 128,8, 0, 0, 0, 0, 0, 0, 20, 8, 2, 0, 0, 0, 0, 2, 196,2, 2, - 0, 0, 0, 0, 52, 0, 2, 0, 0, 0, 0, 0, 18, 0, 2, 0, 0, 0, 0, 0, 254,252,126,0, 0, 0, 0, 0, 46, 184,76, 0, 0, 0, 0, 0, 178,25, 78, 0, - 0, 0, 0, 0, 49, 41, 8, 2, 0, 0, 0, 0, 179,1, 12, 0, 0, 0, 0, 0, 20, 0, 16, 0, 0, 0, 0, 0, 38, 16, 6, 0, 0, 0, 0, 0, 32, 44, 0, 0, - 0, 32, 0, 0, 254,17, 78, 1, 0, 0, 0, 0, 48, 144,0, 0, 0, 0, 0, 0, 24, 32, 6, 2, 0, 0, 0, 0, 0, 8, 104,0, 0, 0, 0, 0, 126,48, 80, 1, - 0, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 47, 49, 16, 1, 0, 0, 0, 0, 50, 48, 0, 0, 0, 0, 0, 0, 22, 48, 32, 0, 0, 0, 0, 0, 34, 0, 34, 0, - 0, 0, 0, 0, 61, 248,8, 1, 0, 0, 0, 0, 8, 160,10, 0, 0, 0, 0, 0, 2, 184,8, 0, 0, 0, 0, 0, 254,185,30, 1, 0, 0, 0, 0, 19, 8, 0, 0, - 0, 0, 0, 0, 0, 184,14, 1, 0, 0, 0, 0, 24, 29, 72, 2, 0, 0, 0, 0, 17, 145,16, 0, 0, 0, 0, 0, 80, 21, 2, 2, 0, 0, 0, 0, 16, 2, 8, 2, - 0, 0, 0, 0, 74, 56, 6, 0, 0, 0, 0, 0, 26, 24, 0, 0, 0, 0, 0, 0, 26, 36, 8, 2, 0, 0, 0, 0, 4, 20, 8, 2, 0, 0, 0, 0, 18, 20, 64, 0, - 0, 0, 0, 0, 18, 12, 68, 0, 0, 0, 0, 0, 90, 177,10, 1, 0, 0, 0, 0, 68, 52, 12, 2, 0, 0, 0, 0, 12, 36, 8, 2, 0, 0, 0, 0, 8, 1, 8, 1, - 0, 0, 0, 0, 20, 176,12, 2, 0, 0, 0, 0, 66, 32, 14, 0, 0, 0, 0, 0, 119,248,62, 0, 0, 0, 0, 0, 6, 40, 46, 0, 128,32, 0, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 230,249,122,2, 0, 0, 0, 0, 25, 105,0, 0, 0, 0, 0, 0, 20, 1, 8, 1, 0, 0, 0, 0, 6, 128,8, 0, 0, 96, 4, 0, 8, 0, 0, 0, - 0, 224,30, 0, 0, 0, 4, 0, 0, 0, 0, 0, 92, 161,4, 2, 0, 32, 0, 0, 14, 8, 6, 0, 0, 96, 12, 0, 0, 32, 0, 0, 0, 0, 0, 0, 132,9, 30, 0, - 0, 224,0, 0, 18, 81, 12, 1, 0, 0, 0, 0, 10, 0, 32, 0, 0, 0, 0, 0, 2, 40, 14, 0, 0, 100,0, 0, 16, 17, 4, 0, 0, 0, 0, 0, 2, 176,72, 0, - 0, 0, 0, 0, 18, 137,4, 1, 0, 32, 0, 0, 16, 1, 0, 1, 0, 0, 0, 0, 17, 32, 64, 0, 0, 0, 0, 0, 16, 129,68, 0, 0, 0, 0, 0, 26, 17, 20, 1, - 0, 0, 0, 0, 7, 144,56, 0, 0, 0, 0, 0, 17, 65, 84, 0, 0, 0, 0, 0, 66, 232,24, 0, 0, 0, 0, 0, 106,176,8, 0, 0, 0, 0, 0, 46, 121,14, 2, - 0, 96, 0, 0, 8, 144,4, 0, 0, 0, 0, 0, 4, 8, 42, 0, 0, 128,0, 0, 146,201,6, 0, 0, 0, 0, 0, 255,255,255,1, 0, 0, 0, 0, 238,190,127,1, - 0, 0, 0, 0, 25, 0, 2, 0, 0, 0, 0, 0, 0, 16, 96, 0, 0, 0, 0, 0, 25, 65, 12, 1, 0, 0, 0, 0, 85, 66, 0, 0, 0, 0, 0, 0, 127,73, 4, 1, - 0, 0, 0, 0, 49, 9, 64, 0, 0, 4, 0, 0, 17, 1, 4, 0, 0, 0, 0, 0, 18, 73, 12, 0, 0, 0, 0, 0, 149,76, 30, 0, 0, 0, 0, 0, 5, 0, 12, 0, - 0, 112,32, 0, 17, 73, 4, 0, 0, 0, 16, 0, 17, 0, 4, 0, 0, 32, 0, 0, 8, 8, 4, 0, 0, 0, 0, 0, 91, 121,90, 1, 0, 0, 0, 0, 0, 60, 10, 0, - 0, 0, 0, 0, 32, 16, 4, 0, 0, 0, 0, 0, 0, 24, 44, 0, 0, 0, 0, 0, 239,189,110,1, 0, 0, 0, 0, 18, 1, 0, 1, 0, 0, 0, 0, 16, 128,16, 0, - 0, 0, 0, 0, 211,120,82, 0, 0, 0, 0, 0, 2, 32, 56, 0, 0, 0, 0, 0, 16, 33, 2, 0, 0, 0, 0, 0, 80, 104,66, 2, 0, 0, 0, 0, 123,190,254,3, - 0, 0, 0, 0, 16, 64, 24, 0, 0, 0, 0, 0, 16, 57, 8, 0, 0, 0, 0, 0, 49, 0, 10, 0, 0, 0, 0, 0, 49, 40, 64, 0, 0, 0, 0, 0, 16, 136,0, 0, - 0, 0, 0, 0, 144,32, 0, 2, 0, 0, 0, 0, 1, 116,0, 0, 0, 0, 0, 0, 145,65, 26, 0, 0, 0, 0, 0, 64, 0, 66, 0, 0, 0, 0, 0, 255,255,126,2, - 0, 0, 0, 0, 128,36, 12, 0, 0, 0, 0, 0, 76, 48, 28, 1, 0, 32, 0, 0, 17, 81, 4, 0, 0, 0, 0, 0, 71, 48, 12, 0, 0, 0, 0, 0, 0, 4, 1, 0, - 0, 0, 0, 0, 19, 113,4, 1, 0, 0, 0, 0, 4, 36, 2, 1, 0, 0, 0, 0, 19, 253,14, 1, 0, 0, 0, 0, 1, 162,6, 0, 0, 0, 0, 0, 16, 65, 8, 2, - 0, 0, 0, 0, 125,96, 14, 0, 0, 4, 0, 0, 253,111,28, 2, 0, 0, 0, 0, 0, 161,40, 1, 0, 0, 0, 0, 68, 20, 14, 1, 0, 0, 0, 0, 146,68, 52, 0, - 0, 0, 0, 0, 36, 72, 4, 0, 0, 0, 0, 0, 0, 4, 10, 0, 0, 0, 0, 0, 145,85, 24, 0, 0, 0, 0, 0, 8, 57, 4, 0, 0, 0, 0, 0, 0, 0, 32, 2, - 0, 0, 0, 0, 145,65, 2, 2, 0, 0, 0, 0, 0, 36, 16, 0, 0, 4, 0, 0, 145,193,60, 0, 0, 0, 0, 0, 128,44, 2, 0, 0, 0, 0, 0, 1, 1, 24, 0, - 0, 0, 0, 0, 13, 36, 0, 0, 0, 4, 0, 0, 17, 65, 20, 0, 0, 0, 0, 0, 6, 0, 56, 0, 0, 32, 0, 0, 255,255,62, 1, 0, 0, 0, 0, 34, 177,12, 0, - 0, 0, 0, 0, 74, 48, 6, 1, 0, 0, 0, 0, 89, 65, 4, 0, 0, 0, 0, 0, 9, 72, 4, 0, 0, 32, 0, 0, 17, 35, 0, 1, 0, 32, 8, 0, 16, 0, 0, 0, - 0, 0, 0, 0, 0, 196,16, 0, 0, 0, 0, 0, 117,100,12, 0, 0, 0, 0, 0, 0, 12, 56, 0, 0, 0, 0, 0, 0, 112,40, 0, 0, 0, 0, 0, 8, 65, 8, 0, - 0, 0, 0, 0, 13, 40, 28, 0, 0, 176,0, 0, 9, 16, 4, 0, 0, 0, 0, 0, 149,221,13, 0, 0, 0, 0, 0, 151,73, 28, 2, 0, 0, 0, 0, 80, 32, 2, 0, - 0, 0, 0, 0, 50, 56, 14, 0, 0, 0, 0, 0, 21, 33, 2, 1, 0, 32, 8, 0, 58, 96, 28, 0, 0, 0, 0, 0, 33, 0, 16, 0, 0, 0, 0, 0, 17, 97, 28, 1, - 0, 0, 0, 0, 84, 40, 4, 1, 0, 96, 13, 0, 123,253,220,1, 0, 0, 4, 0, 0, 8, 0, 0, 0, 0, 0, 0, 16, 0, 128,1, 0, 112,5, 0, 99, 216,78, 0, - 0, 0, 0, 0, 191,28, 4, 1, 0, 32, 1, 0, 81, 65, 68, 0, 0, 0, 0, 0, 21, 16, 26, 0, 0, 0, 1, 0, 155,93, 122,1, 0, 0, 0, 0, 19, 96, 0, 0, - 0, 0, 0, 0, 3, 40, 0, 2, 0, 32, 0, 0, 48, 9, 4, 0, 0, 0, 0, 0, 40, 0, 12, 1, 0, 16, 0, 0, 59, 73, 66, 1, 0, 0, 0, 0, 9, 32, 128,0, - 0, 240,60, 0, 48, 17, 6, 1, 0, 0, 0, 0, 48, 1, 10, 0, 16, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 65, 17, 4, 0, 0, 0, 0, 0, 19, 163,18, 2, - 0, 0, 0, 0, 10, 32, 2, 0, 0, 0, 0, 0, 0, 44, 40, 0, 0, 0, 0, 0, 145,73, 24, 1, 0, 32, 0, 0, 0, 8, 0, 2, 0, 0, 0, 0, 24, 32, 22, 1, - 0, 0, 0, 0, 3, 32, 10, 0, 0, 0, 0, 0, 145,89, 72, 0, 0, 0, 4, 0, 19, 217,22, 0, 0, 0, 0, 0, 0, 172,4, 0, 0, 0, 0, 0, 129,72, 18, 0, - 0, 0, 0, 0, 40, 44, 4, 0, 0, 0, 0, 0, 0, 60, 6, 0, 0, 0, 0, 0, 129,1, 16, 0, 16, 0, 0, 0, 219,109,140,0, 0, 32, 0, 0, 177,0, 0, 0, - 0, 0, 0, 0, 1, 73, 6, 1, 0, 32, 0, 0, 16, 12, 2, 1, 0, 0, 0, 0, 192,64, 6, 0, 0, 0, 0, 0, 5, 4, 9, 0, 0, 0, 0, 0, 17, 25, 4, 0, - 0, 96, 0, 0, 128,0, 0, 0, 0, 0, 0, 0, 17, 201,20, 0, 0, 0, 0, 0, 59, 223,27, 1, 0, 0, 0, 0, 42, 160,2, 0, 0, 0, 0, 0, 156,168,70, 0, - 16, 0, 0, 0, 53, 172,8, 0, 0, 0, 0, 0, 33, 1, 0, 0, 0, 48, 0, 0, 18, 81, 4, 1, 0, 32, 4, 0, 9, 0, 0, 0, 0, 0, 0, 0, 130,0, 8, 0, - 0, 0, 0, 0, 17, 40, 14, 2, 0, 0, 0, 0, 122,44, 0, 0, 0, 32, 0, 0, 13, 32, 8, 0, 0, 0, 0, 0, 215,45, 44, 0, 0, 0, 0, 0, 73, 96, 0, 0, - 0, 32, 1, 0, 25, 32, 12, 0, 0, 0, 0, 0, 16, 44, 4, 0, 0, 0, 0, 0, 3, 1, 0, 2, 16, 0, 0, 0, 191,189,126,1, 0, 0, 0, 0, 168,60, 46, 0, - 0, 0, 0, 0, 152,113,68, 0, 0, 0, 0, 0, 7, 64, 0, 0, 0, 32, 0, 0, 8, 32, 0, 0, 0, 0, 0, 0, 138,173,14, 0, 0, 32, 0, 0, 136,0, 4, 0, - 0, 0, 0, 0, 17, 1, 6, 2, 0, 0, 0, 0, 8, 44, 34, 0, 0, 0, 0, 0, 187,253,45, 1, 0, 96, 0, 0, 64, 0, 32, 0, 0, 32, 0, 0, 241,49, 20, 1, - 0, 0, 0, 0, 17, 129,64, 0, 0, 0, 0, 0, 211,125,8, 3, 0, 0, 0, 0, 145,136,8, 0, 0, 0, 0, 0, 123,253,110,3, 0, 0, 0, 0, 61, 44, 12, 0, - 0, 0, 0, 0, 9, 32, 64, 0, 0, 0, 0, 0, 12, 32, 64, 0, 0, 0, 0, 0, 128,8, 10, 2, 0, 0, 0, 0, 21, 9, 0, 0, 0, 0, 0, 0, 7, 16, 0, 0, - 16, 0, 0, 0, 255,255,62, 3, 0, 0, 0, 0, 19, 9, 16, 0, 0, 0, 0, 0, 136,8, 34, 0, 0, 0, 0, 0, 33, 24, 26, 0, 0, 0, 0, 0, 0, 80, 10, 0, - 0, 0, 0, 0, 66, 32, 8, 0, 0, 0, 0, 0, 25, 205,8, 0, 0, 0, 0, 0, 19, 221,20, 0, 0, 0, 0, 0, 10, 96, 4, 2, 0, 0, 0, 0, 72, 52, 0, 0, - 0, 0, 0, 0, 221,103,12, 3, 0, 0, 0, 0, 66, 40, 80, 0, 0, 0, 0, 0, 24, 64, 6, 1, 0, 0, 0, 0, 8, 0, 30, 0, 0, 0, 0, 0, 18, 216,76, 1, - 0, 0, 0, 0, 25, 77, 40, 0, 0, 0, 0, 0, 128,5, 2, 2, 0, 0, 0, 0, 0, 24, 6, 1, 0, 32, 0, 0, 179,24, 12, 0, 0, 0, 0, 0, 17, 136,0, 1, - 0, 32, 0, 0, 0, 50, 2, 0, 0, 0, 0, 0, 0, 32, 16, 2, 0, 0, 0, 0, 255,254,126,1, 0, 0, 0, 0, 160,9, 8, 0, 0, 32, 2, 0, 16, 9, 68, 0, - 0, 0, 0, 0, 9, 64, 16, 0, 0, 0, 0, 0, 194,56, 4, 0, 0, 0, 0, 0, 49, 32, 0, 0, 16, 0, 0, 0, 25, 72, 8, 0, 0, 0, 0, 0, 89, 36, 24, 0, - 0, 0, 0, 0, 2, 132,8, 0, 0, 0, 0, 0, 24, 81, 4, 0, 0, 0, 0, 0, 146,156,12, 0, 0, 0, 0, 0, 18, 37, 10, 0, 0, 0, 0, 0, 139,8, 76, 1, - 0, 32, 0, 0, 191,57, 78, 1, 0, 0, 0, 0, 81, 68, 76, 0, 0, 0, 0, 0, 64, 184,12, 0, 16, 0, 0, 0, 17, 33, 0, 0, 0, 0, 0, 0, 95, 241,14, 1, - 0, 0, 0, 0, 25, 65, 16, 1, 0, 0, 0, 0, 8, 180,96, 0, 0, 0, 0, 0, 60, 37, 100,1, 0, 0, 0, 0, 88, 60, 32, 0, 0, 0, 0, 0, 60, 200,48, 1, - 0, 0, 0, 0, 66, 48, 8, 0, 0, 0, 0, 0, 255,255,46, 0, 0, 0, 0, 0, 4, 17, 0, 1, 0, 0, 0, 0, 10, 0, 6, 0, 0, 0, 0, 0, 65, 64, 2, 0, - 0, 0, 0, 0, 93, 25, 28, 2, 0, 0, 0, 0, 144,1, 4, 2, 0, 0, 0, 0, 17, 209,68, 0, 0, 0, 0, 0, 128,36, 10, 1, 0, 0, 0, 0, 64, 36, 8, 2, - 0, 0, 0, 0, 16, 129,8, 0, 0, 0, 0, 0, 81, 29, 10, 0, 0, 0, 0, 0, 128,4, 72, 0, 0, 0, 0, 0, 24, 72, 28, 0, 0, 0, 0, 0, 67, 57, 20, 0, - 0, 0, 8, 0, 255,252,255,3, 0, 0, 0, 0, 141,184,22, 0, 0, 0, 0, 0, 83, 73, 18, 1, 0, 0, 0, 0, 133,101,16, 1, 0, 0, 0, 0, 16, 8, 24, 0, - 0, 0, 0, 0, 19, 121,4, 0, 0, 32, 0, 0, 223,121,86, 0, 0, 0, 0, 0, 15, 124,78, 0, 0, 0, 0, 0, 110,190,126,0, 0, 0, 0, 0, 0, 12, 0, 2, - 0, 0, 0, 0, 48, 4, 0, 0, 0, 0, 0, 0, 177,24, 66, 0, 0, 0, 0, 0, 18, 193,4, 0, 0, 0, 0, 0, 17, 129,14, 2, 0, 0, 0, 0, 49, 64, 26, 1, - 0, 64, 0, 0, 245,121,94, 0, 0, 96, 0, 0, 4, 160,2, 0, 0, 0, 0, 0, 17, 193,20, 1, 0, 0, 0, 0, 68, 9, 8, 0, 0, 0, 0, 0, 145,69, 16, 0, - 0, 0, 0, 0, 247,95, 61, 1, 0, 0, 0, 0, 194,48, 12, 0, 0, 0, 0, 0, 0, 96, 38, 0, 0, 0, 0, 0, 130,9, 0, 0, 0, 0, 0, 0, 117,0, 4, 0, - 0, 0, 0, 0, 20, 1, 68, 1, 0, 0, 0, 0, 17, 81, 4, 1, 0, 0, 0, 0, 1, 0, 36, 0, 0, 240,46, 0, 239,57, 76, 1, 0, 0, 0, 0, 191,221,22, 2, - 0, 96, 0, 0, 4, 0, 4, 0, 0, 0, 0, 0, 20, 0, 128,0, 0, 0, 0, 0, 0, 108,6, 0, 0, 0, 0, 0, 21, 104,12, 0, 0, 0, 0, 0, 16, 49, 4, 0, - 0, 0, 0, 0, 16, 36, 6, 0, 0, 32, 0, 0, 29, 97, 12, 1, 0, 0, 0, 0, 17, 76, 12, 0, 0, 32, 0, 0, 0, 128,142,0, 0, 0, 0, 0, 36, 0, 4, 0, - 0, 0, 0, 0, 255,103,31, 1, 0, 0, 0, 0, 64, 41, 10, 0, 0, 0, 0, 0, 145,73, 8, 1, 0, 0, 0, 0, 69, 32, 70, 0, 0, 0, 0, 0, 149,73, 28, 0, - 0, 32, 0, 0, 8, 8, 66, 0, 0, 40, 0, 0, 0, 16, 4, 0, 0, 32, 0, 0, 136,0, 14, 1, 0, 0, 0, 0, 7, 32, 12, 0, 0, 0, 0, 0, 177,73, 4, 0, - 0, 0, 0, 0, 48, 65, 0, 0, 0, 0, 0, 0, 0, 168,10, 0, 0, 64, 0, 0, 6, 52, 18, 0, 0, 0, 0, 0, 144,204,14, 0, 0, 0, 0, 0, 151,255,94, 0, - 0, 0, 0, 0, 68, 6, 32, 0, 0, 0, 0, 0, 88, 36, 12, 0, 0, 0, 0, 0, 69, 32, 20, 0, 0, 0, 0, 0, 132,45, 4, 0, 0, 0, 0, 0, 21, 109,28, 1, - 0, 0, 0, 0, 0, 12, 32, 0, 0, 0, 0, 0, 32, 48, 0, 0, 0, 32, 0, 0, 128,8, 4, 0, 0, 0, 0, 0, 213,77, 94, 2, 0, 0, 0, 0, 8, 129,6, 0, - 0, 0, 0, 0, 64, 174,6, 1, 0, 0, 0, 0, 85, 12, 0, 0, 0, 0, 0, 0, 112,228,140,0, 0, 0, 32, 0, 0, 32, 4, 0, 0, 0, 0, 0, 17, 1, 64, 2, - 0, 0, 0, 0, 9, 24, 6, 0, 0, 0, 0, 0, 74, 8, 5, 0, 0, 64, 16, 0, 17, 107,82, 1, 0, 0, 1, 0, 2, 64, 8, 0, 0, 0, 0, 0, 243,169,42, 3, - 0, 0, 0, 0, 48, 9, 0, 0, 0, 0, 0, 0, 80, 33, 64, 0, 0, 0, 0, 0, 25, 13, 4, 0, 0, 0, 0, 0, 24, 4, 4, 0, 0, 0, 0, 0, 25, 140,28, 2, - 0, 32, 0, 0, 10, 128,6, 0, 0, 0, 0, 0, 249,185,106,0, 0, 0, 0, 0, 0, 56, 12, 0, 0, 0, 0, 0, 24, 24, 8, 0, 0, 0, 0, 0, 58, 185,46, 0, - 0, 0, 0, 0, 3, 65, 20, 0, 0, 0, 0, 0, 72, 80, 6, 0, 0, 0, 0, 0, 56, 72, 8, 0, 0, 0, 0, 0, 49, 209,4, 2, 0, 0, 0, 0, 132,44, 4, 0, - 0, 0, 0, 0, 0, 130,76, 0, 0, 0, 0, 0, 111,253,122,0, 0, 0, 0, 0, 56, 44, 0, 0, 0, 0, 0, 0, 29, 160,20, 2, 0, 0, 0, 0, 35, 168,14, 0, - 0, 32, 0, 0, 190,188,78, 0, 0, 32, 0, 0, 49, 197,18, 1, 0, 0, 0, 0, 110,185,126,1, 0, 0, 0, 0, 1, 64, 4, 1, 0, 0, 0, 0, 144,72, 8, 0, - 0, 128,0, 0, 0, 8, 2, 0, 0, 0, 0, 0, 88, 5, 8, 0, 0, 0, 0, 0, 144,160,4, 0, 0, 0, 0, 0, 16, 69, 12, 1, 0, 0, 0, 0, 146,1, 4, 0, - 0, 0, 0, 0, 17, 69, 4, 0, 0, 32, 0, 0, 138,32, 6, 0, 0, 0, 0, 0, 5, 38, 4, 0, 0, 0, 0, 0, 27, 17, 12, 0, 0, 0, 0, 0, 93, 177,124,2, - 0, 0, 0, 0, 32, 0, 8, 2, 0, 0, 0, 0, 72, 0, 4, 2, 0, 0, 0, 0, 0, 148,40, 0, 0, 0, 0, 0, 16, 73, 68, 1, 0, 0, 0, 0, 16, 128,12, 0, - 0, 0, 0, 0, 124,180,108,2, 0, 32, 2, 0, 16, 64, 6, 1, 0, 0, 0, 0, 17, 22, 4, 1, 0, 0, 0, 0, 10, 0, 2, 1, 0, 0, 0, 0, 80, 4, 4, 0, - 0, 0, 0, 0, 4, 132,68, 0, 0, 0, 0, 0, 95, 240,124,0, 0, 0, 0, 0, 2, 64, 4, 0, 0, 0, 0, 0, 19, 5, 4, 0, 0, 0, 0, 0, 64, 160,8, 0, - 0, 64, 0, 0, 145,36, 12, 0, 0, 0, 0, 0, 68, 128,0, 0, 0, 0, 0, 0, 152,169,6, 0, 0, 0, 0, 0, 74, 181,14, 1, 0, 0, 0, 0, 11, 152,4, 0, - 0, 0, 0, 0, 129,4, 4, 0, 0, 32, 6, 0, 48, 0, 76, 2, 0, 0, 0, 0, 56, 0, 40, 0, 0, 0, 32, 0, 31, 197,30, 1, 0, 0, 0, 0, 12, 41, 78, 1, - 0, 32, 0, 0, 184,145,108,0, 0, 32, 0, 0, 21, 137,12, 1, 0, 0, 0, 0, 95, 10, 14, 0, 0, 0, 0, 0, 72, 8, 10, 0, 0, 0, 0, 0, 4, 12, 12, 0, - 0, 0, 0, 0, 8, 4, 4, 0, 0, 0, 0, 0, 217,40, 14, 0, 0, 0, 0, 0, 73, 0, 8, 0, 0, 96, 1, 0, 8, 0, 6, 1, 0, 0, 0, 0, 145,8, 14, 2, - 0, 96, 0, 0, 178,19, 108,1, 0, 0, 0, 0, 69, 76, 26, 0, 0, 96, 1, 0, 154,233,70, 1, 0, 0, 0, 0, 25, 45, 12, 0, 0, 0, 0, 0, 4, 128,40, 0, - 0, 32, 0, 0, 18, 41, 0, 1, 0, 0, 0, 0, 76, 9, 14, 0, 0, 0, 0, 0, 32, 128,8, 0, 0, 32, 0, 0, 16, 0, 4, 1, 0, 16, 0, 0, 149,209,18, 1, - 0, 0, 0, 0, 124,133,58, 3, 0, 96, 0, 0, 146,144,6, 1, 0, 0, 0, 0, 28, 200,4, 0, 0, 0, 0, 0, 48, 12, 2, 0, 0, 0, 0, 0, 157,139,14, 1, - 0, 0, 0, 0, 8, 0, 2, 2, 0, 0, 0, 0, 82, 17, 0, 0, 0, 0, 0, 0, 60, 132,40, 0, 0, 0, 0, 0, 142,196,123,0, 0, 0, 0, 0, 68, 132,8, 2, - 0, 32, 0, 0, 16, 1, 20, 1, 0, 32, 0, 0, 24, 1, 4, 1, 0, 0, 0, 0, 24, 37, 10, 0, 0, 32, 0, 0, 190,145,68, 1, 0, 0, 0, 0, 102,4, 4, 0, - 0, 0, 0, 0, 0, 180,6, 0, 0, 0, 0, 0, 18, 1, 4, 1, 0, 0, 0, 0, 23, 73, 22, 0, 0, 0, 0, 0, 4, 45, 6, 1, 0, 32, 0, 0, 17, 9, 4, 1, - 0, 0, 0, 0, 18, 40, 0, 0, 0, 0, 0, 0, 16, 100,1, 0, 0, 0, 0, 0, 135,69, 6, 0, 0, 240,63, 0, 0, 64, 0, 0, 0, 0, 0, 0, 16, 17, 8, 0, - 0, 0, 0, 0, 22, 136,0, 0, 0, 0, 0, 0, 17, 0, 68, 0, 0, 0, 0, 0, 153,65, 22, 0, 0, 0, 0, 0, 4, 160,70, 0, 0, 0, 0, 0, 0, 52, 2, 0, - 0, 0, 0, 0, 194,24, 45, 0, 0, 0, 0, 0, 32, 16, 2, 0, 0, 0, 0, 0, 0, 5, 0, 1, 0, 0, 0, 0, 140,44, 20, 0, 0, 0, 0, 0, 49, 13, 26, 0, - 0, 0, 0, 0, 23, 41, 72, 1, 0, 0, 0, 0, 5, 120,2, 0, 0, 0, 0, 0, 38, 8, 14, 0, 0, 0, 0, 0, 0, 101,4, 0, 0, 0, 0, 0, 251,125,126,3, - 0, 0, 0, 0, 76, 165,6, 2, 0, 0, 0, 0, 73, 68, 16, 0, 0, 32, 0, 0, 17, 1, 4, 2, 0, 0, 0, 0, 12, 57, 134,1, 0, 0, 0, 0, 157,56, 44, 2, - 0, 32, 0, 0, 1, 9, 20, 0, 0, 0, 0, 0, 64, 0, 2, 1, 0, 0, 0, 0, 5, 1, 0, 3, 0, 0, 1, 0, 16, 49, 110,1, 0, 0, 0, 0, 0, 1, 4, 2, - 0, 0, 0, 0, 2, 16, 14, 0, 0, 0, 0, 0, 8, 33, 6, 0, 0, 0, 0, 0, 27, 115,38, 0, 16, 0, 0, 0, 138,192,78, 0, 0, 0, 0, 0, 33, 72, 44, 0, - 0, 32, 0, 0, 40, 0, 36, 0, 0, 0, 0, 0, 89, 103,31, 3, 0, 0, 0, 0, 80, 20, 20, 0, 0, 0, 1, 0, 4, 0, 12, 0, 0, 0, 0, 0, 150,76, 68, 3, - 0, 96, 2, 0, 1, 0, 132,0, 0, 32, 0, 0, 50, 36, 10, 0, 0, 0, 0, 0, 104,17, 38, 0, 0, 40, 4, 0, 49, 0, 32, 0, 0, 0, 0, 0, 136,252,14, 1, - 0, 0, 0, 0, 149,204,74, 0, 0, 240,0, 0, 128,0, 0, 0, 0, 0, 0, 0, 223,253,62, 2, 0, 0, 0, 0, 6, 32, 40, 1, 0, 0, 0, 0, 33, 65, 0, 0, - 0, 0, 0, 0, 5, 44, 14, 0, 0, 0, 0, 0, 151,105,12, 0, 0, 0, 0, 0, 145,73, 8, 0, 0, 0, 16, 0, 254,172,47, 2, 0, 8, 0, 0, 53, 27, 12, 0, - 0, 32, 0, 0, 87, 185,76, 0, 0, 0, 0, 0, 128,128,4, 1, 0, 0, 0, 0, 29, 137,68, 0, 0, 0, 0, 0, 42, 0, 4, 0, 0, 32, 0, 0, 127,153,76, 0, - 0, 0, 0, 0, 0, 4, 38, 0, 0, 0, 0, 0, 153,41, 4, 0, 0, 0, 0, 0, 3, 13, 16, 0, 0, 48, 0, 0, 157,207,50, 1, 0, 0, 0, 0, 253,61, 94, 3, - 0, 0, 0, 0, 145,5, 0, 0, 0, 32, 0, 0, 46, 158,206,1, 0, 0, 0, 0, 8, 9, 8, 0, 0, 0, 36, 0, 1, 16, 0, 0, 0, 0, 0, 0, 127,101,12, 0, - 0, 32, 0, 0, 16, 17, 4, 1, 0, 0, 0, 0, 19, 1, 16, 0, 0, 0, 0, 0, 221,13, 14, 0, 0, 0, 0, 0, 16, 153,4, 1, 0, 0, 0, 0, 1, 1, 0, 3, - 0, 0, 0, 0, 0, 17, 12, 0, 0, 0, 0, 0, 145,1, 28, 2, 0, 96, 12, 0, 16, 1, 4, 0, 0, 0, 0, 0, 221,45, 110,3, 0, 0, 0, 0, 76, 4, 6, 0, - 0, 0, 0, 0, 180,81, 4, 0, 0, 0, 0, 0, 150,69, 28, 0, 0, 0, 0, 0, 49, 80, 0, 0, 0, 32, 8, 0, 16, 141,12, 0, 0, 0, 0, 0, 76, 8, 6, 0, - 0, 8, 0, 0, 16, 8, 64, 0, 0, 96, 0, 0, 18, 65, 86, 1, 0, 0, 0, 0, 92, 8, 14, 0, 0, 0, 0, 0, 19, 17, 4, 0, 0, 0, 0, 0, 16, 9, 12, 0, - 0, 0, 0, 0, 75, 93, 2, 0, 0, 0, 0, 0, 0, 32, 64, 2, 0, 0, 0, 0, 68, 0, 128,0, 0, 0, 0, 0, 124,108,110,2, 0, 0, 0, 0, 145,68, 16, 1, - 0, 32, 0, 0, 8, 0, 6, 1, 0, 96, 24, 0, 0, 16, 4, 0, 0, 0, 0, 0, 76, 44, 78, 0, 0, 0, 0, 0, 18, 16, 32, 0, 0, 0, 0, 0, 144,96, 16, 0, - 0, 96, 4, 0, 8, 8, 6, 1, 0, 0, 0, 0, 9, 29, 12, 0, 0, 0, 0, 0, 93, 101,20, 1, 0, 0, 0, 0, 8, 8, 12, 1, 0, 0, 0, 0, 32, 8, 6, 2, - 0, 0, 0, 0, 17, 69, 16, 1, 0, 32, 0, 0, 16, 65, 20, 0, 0, 0, 0, 0, 177,9, 12, 2, 0, 0, 0, 0, 21, 81, 16, 0, 0, 0, 0, 0, 0, 33, 76, 1, - 0, 32, 0, 0, 24, 17, 0, 1, 0, 0, 0, 0, 36, 32, 8, 0, 0, 0, 0, 0, 8, 96, 0, 0, 0, 0, 0, 0, 188,125,30, 0, 0, 0, 0, 0, 0, 144,64, 0, - 0, 0, 0, 0, 193,0, 12, 0, 0, 0, 0, 0, 96, 44, 10, 0, 0, 32, 0, 0, 51, 17, 4, 1, 0, 0, 0, 0, 21, 125,40, 1, 0, 32, 0, 0, 17, 65, 36, 1, - 0, 0, 0, 0, 48, 32, 32, 0, 0, 32, 0, 0, 4, 176,72, 0, 0, 0, 0, 0, 128,105,76, 0, 0, 128,0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 110,53, 89, 1, - 0, 0, 0, 0, 64, 9, 16, 0, 0, 0, 0, 0, 149,33, 64, 0, 0, 0, 0, 0, 64, 48, 8, 0, 0, 0, 0, 0, 64, 4, 8, 2, 0, 56, 32, 0, 187,25, 108,0, - 0, 0, 0, 0, 5, 40, 92, 0, 0, 0, 0, 0, 32, 8, 12, 0, 0, 0, 0, 0, 156,40, 10, 0, 0, 0, 0, 0, 8, 17, 4, 0, 0, 0, 0, 0, 66, 41, 14, 2, - 0, 16, 0, 0, 76, 21, 66, 0, 0, 0, 0, 0, 10, 57, 78, 0, 0, 32, 2, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 64, 4, 0, 2, - 0, 0, 0, 0, 90, 40, 14, 0, 0, 68, 0, 0, 27, 225,4, 1, 0, 0, 0, 0, 8, 16, 64, 0, 0, 0, 0, 0, 83, 16, 0, 1, 0, 0, 0, 0, 8, 44, 98, 0, - 0, 0, 0, 0, 12, 4, 16, 0, 0, 0, 6, 0, 219,168,102,0, 0, 32, 2, 0, 129,1, 6, 0, 0, 52, 0, 0, 255,219,126,1, 0, 0, 0, 0, 255,189,254,3, - 0, 0, 0, 0, 14, 8, 8, 0, 0, 0, 0, 0, 40, 17, 6, 1, 0, 0, 0, 0, 148,5, 0, 1, 0, 0, 0, 0, 144,129,4, 0, 0, 0, 0, 0, 152,41, 8, 1, - 0, 0, 0, 0, 130,24, 8, 0, 0, 0, 0, 0, 138,40, 0, 0, 0, 0, 0, 0, 112,121,4, 0, 0, 0, 0, 0, 12, 16, 6, 0, 0, 0, 0, 0, 16, 120,2, 0, - 0, 0, 0, 0, 146,48, 0, 1, 0, 0, 0, 0, 91, 40, 2, 0, 0, 0, 0, 0, 26, 73, 12, 0, 0, 0, 0, 0, 20, 16, 68, 0, 0, 0, 0, 0, 136,88, 6, 0, - 0, 0, 0, 0, 63, 125,104,3, 0, 0, 0, 0, 23, 81, 68, 0, 0, 0, 0, 0, 59, 241,0, 0, 0, 0, 0, 0, 17, 13, 4, 0, 0, 0, 0, 0, 255,253,92, 2, - 0, 0, 0, 0, 64, 8, 66, 0, 0, 0, 0, 0, 145,73, 0, 2, 0, 0, 0, 0, 51, 205,22, 0, 0, 0, 0, 0, 240,8, 2, 0, 0, 32, 2, 0, 17, 72, 6, 0, - 0, 0, 0, 0, 53, 0, 4, 0, 0, 0, 0, 0, 0, 0, 116,0, 0, 0, 0, 0, 0, 2, 96, 0, 0, 0, 0, 0, 50, 1, 8, 0, 0, 0, 0, 0, 176,136,0, 0, - 0, 0, 0, 0, 40, 0, 14, 1, 0, 224,44, 0, 127,125,110,3, 0, 0, 0, 0, 144,5, 2, 0, 0, 0, 0, 0, 16, 25, 100,0, 0, 0, 0, 0, 64, 0, 68, 0, - 0, 32, 0, 0, 21, 1, 6, 1, 0, 96, 0, 0, 132,4, 12, 0, 0, 40, 0, 0, 17, 41, 30, 2, 0, 32, 0, 0, 149,101,28, 3, 0, 0, 0, 0, 1, 100,20, 0, - 0, 0, 0, 0, 144,105,28, 2, 0, 34, 0, 0, 140,56, 70, 0, 0, 0, 0, 0, 4, 96, 54, 0, 0, 96, 0, 0, 17, 17, 4, 0, 0, 0, 0, 0, 17, 16, 14, 0, - 0, 0, 0, 0, 46, 176,12, 0, 0, 0, 0, 0, 17, 37, 6, 0, 0, 0, 0, 0, 0, 128,20, 0, 0, 0, 0, 0, 16, 97, 14, 0, 0, 0, 0, 0, 128,8, 2, 1, - 0, 0, 0, 0, 255,191,122,3, 0, 0, 0, 0, 76, 60, 18, 0, 0, 0, 0, 0, 160,17, 64, 1, 0, 0, 0, 0, 16, 1, 12, 1, 0, 32, 0, 0, 0, 1, 0, 1, - 0, 32, 0, 0, 50, 129,14, 1, 0, 0, 0, 0, 74, 168,38, 0, 0, 32, 0, 0, 144,16, 68, 1, 0, 0, 0, 0, 147,76, 70, 0, 0, 0, 0, 0, 33, 12, 0, 0, - 0, 0, 0, 0, 16, 40, 4, 1, 0, 0, 0, 0, 81, 112,0, 0, 0, 0, 0, 0, 126,60, 14, 0, 0, 0, 0, 0, 251,93, 70, 0, 0, 0, 0, 0, 64, 0, 18, 0, - 0, 0, 0, 0, 17, 3, 18, 0, 0, 0, 0, 0, 0, 1, 8, 1, 0, 0, 0, 0, 19, 29, 8, 2, 0, 0, 0, 0, 177,209,16, 1, 0, 32, 0, 0, 0, 0, 10, 0, - 0, 0, 0, 0, 223,116,13, 2, 0, 0, 0, 0, 16, 72, 10, 0, 0, 0, 0, 0, 175,253,78, 0, 0, 32, 0, 0, 21, 33, 4, 1, 0, 96, 0, 0, 0, 1, 36, 0, - 0, 0, 0, 0, 86, 253,34, 0, 0, 0, 0, 0, 68, 137,12, 0, 0, 32, 0, 0, 19, 73, 84, 0, 0, 0, 0, 0, 128,12, 12, 2, 0, 0, 0, 0, 31, 0, 2, 0, - 0, 240,4, 0, 192,100,6, 1, 0, 96, 0, 0, 17, 0, 4, 0, 0, 64, 0, 0, 126,190,174,0, 0, 32, 0, 0, 58, 57, 22, 1, 0, 0, 0, 0, 2, 32, 6, 1, - 0, 0, 0, 0, 137,16, 4, 0, 0, 0, 0, 0, 226,40, 2, 0, 0, 0, 0, 0, 16, 41, 4, 1, 0, 0, 0, 0, 81, 24, 68, 0, 0, 0, 0, 0, 80, 169,76, 0, - 0, 0, 0, 0, 147,49, 68, 0, 0, 0, 0, 0, 16, 32, 4, 2, 0, 0, 0, 0, 17, 217,20, 0, 0, 0, 0, 0, 93, 36, 12, 0, 0, 0, 0, 0, 130,16, 14, 0, - 0, 32, 0, 0, 17, 9, 6, 1, 0, 0, 0, 0, 80, 60, 6, 0, 0, 0, 0, 0, 148,0, 8, 2, 0, 0, 0, 0, 6, 16, 0, 0, 0, 0, 0, 0, 255,255,126,1, - 0, 0, 0, 0, 191,249,76, 1, 0, 0, 0, 0, 10, 8, 10, 0, 0, 0, 0, 0, 230,44, 14, 1, 0, 0, 0, 0, 48, 4, 4, 0, 0, 0, 0, 0, 8, 41, 4, 0, - 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 17, 76, 2, 0, 0, 0, 0, 0, 12, 8, 6, 1, 0, 0, 0, 0, 63, 201,12, 2, 0, 0, 0, 0, 3, 144,0, 0, - 0, 0, 0, 0, 80, 1, 16, 1, 0, 224,2, 0, 174,28, 70, 1, 0, 0, 0, 0, 72, 140,14, 0, 0, 0, 0, 0, 241,205,68, 1, 0, 0, 0, 0, 31, 127,10, 3, - 0, 0, 0, 0, 168,4, 6, 1, 0, 96, 8, 0, 19, 65, 76, 1, 0, 0, 0, 0, 32, 65, 4, 2, 0, 0, 0, 0, 2, 8, 44, 0, 0, 0, 0, 0, 128,4, 20, 0, - 0, 0, 0, 0, 148,12, 12, 2, 0, 0, 0, 0, 125,0, 10, 0, 0, 0, 0, 0, 17, 16, 8, 1, 0, 0, 16, 0, 17, 97, 16, 3, 0, 0, 0, 0, 239,189,124,3, - 0, 0, 0, 0, 144,4, 1, 2, 0, 0, 0, 0, 59, 9, 8, 0, 0, 0, 0, 0, 1, 25, 0, 0, 0, 0, 0, 0, 49, 0, 4, 0, 0, 0, 0, 0, 0, 66, 4, 0, - 0, 0, 0, 0, 121,96, 6, 0, 0, 0, 0, 0, 48, 8, 84, 0, 0, 32, 0, 0, 0, 40, 70, 0, 0, 0, 0, 0, 0, 200,4, 0, 0, 0, 0, 0, 18, 48, 0, 0, - 0, 32, 0, 0, 181,209,28, 2, 0, 0, 0, 0, 20, 0, 4, 2, 0, 0, 0, 0, 52, 16, 4, 1, 0, 0, 0, 0, 36, 34, 44, 0, 0, 0, 0, 0, 230,0, 4, 0, - 0, 0, 0, 0, 18, 32, 4, 2, 0, 0, 0, 0, 138,32, 12, 0, 0, 0, 0, 0, 255,191,124,1, 0, 0, 0, 0, 0, 20, 8, 0, 0, 0, 0, 0, 10, 128,8, 0, - 0, 32, 0, 0, 22, 88, 76, 0, 0, 0, 0, 0, 102,0, 12, 0, 0, 0, 0, 0, 16, 48, 0, 2, 0, 0, 0, 0, 20, 25, 0, 0, 0, 0, 0, 0, 64, 4, 16, 0, - 0, 0, 0, 0, 127,180,172,2, 0, 0, 0, 0, 16, 104,16, 0, 0, 0, 0, 0, 96, 4, 8, 0, 0, 160,0, 0, 34, 64, 6, 0, 0, 0, 0, 0, 18, 136,0, 0, - 0, 0, 0, 0, 177,1, 4, 1, 0, 0, 1, 0, 20, 137,12, 0, 0, 0, 0, 0, 20, 16, 8, 2, 0, 0, 0, 0, 254,255,124,3, 0, 0, 0, 0, 18, 24, 4, 0, - 0, 0, 0, 0, 19, 16, 5, 1, 0, 0, 0, 0, 65, 0, 8, 2, 0, 32, 0, 0, 146,152,0, 0, 0, 0, 0, 0, 144,12, 16, 0, 0, 0, 0, 0, 128,16, 0, 2, - 0, 0, 0, 0, 74, 128,12, 0, 0, 0, 0, 0, 26, 16, 0, 0, 0, 0, 0, 0, 94, 177,44, 3, 0, 0, 0, 0, 1, 145,0, 0, 0, 0, 0, 0, 128,0, 12, 3, - 0, 0, 0, 0, 44, 134,4, 0, 0, 0, 0, 0, 191,188,46, 3, 0, 0, 0, 0, 132,4, 0, 2, 0, 0, 0, 0, 0, 24, 10, 1, 0, 32, 4, 0, 26, 57, 76, 3, - 0, 0, 0, 0, 17, 64, 48, 0, 0, 32, 2, 0, 0, 0, 84, 0, 0, 0, 0, 0, 14, 52, 38, 0, 0, 0, 0, 0, 4, 9, 8, 0, 0, 0, 0, 0, 50, 144,0, 0, - 0, 0, 0, 0, 176,193,4, 1, 0, 0, 0, 0, 64, 36, 8, 0, 0, 32, 0, 0, 17, 197,0, 0, 0, 0, 0, 0, 92, 61, 74, 2, 0, 0, 0, 0, 16, 33, 0, 3, - 0, 0, 0, 0, 19, 0, 4, 0, 0, 0, 0, 0, 144,8, 12, 2, 0, 0, 0, 0, 22, 120,134,0, 0, 0, 0, 0, 8, 32, 4, 2, 0, 0, 0, 0, 1, 40, 34, 2, - 0, 0, 0, 0, 255,251,126,3, 0, 0, 0, 0, 8, 168,14, 0, 0, 0, 0, 0, 20, 1, 2, 0, 0, 0, 0, 0, 13, 2, 8, 0, 0, 0, 0, 0, 148,197,24, 1, - 0, 0, 0, 0, 5, 0, 11, 0, 0, 0, 0, 0, 17, 32, 4, 2, 0, 0, 0, 0, 16, 9, 2, 1, 0, 0, 0, 0, 212,4, 10, 0, 0, 96, 8, 0, 48, 65, 0, 0, - 0, 0, 0, 0, 17, 77, 0, 1, 0, 32, 4, 0, 61, 89, 12, 1, 0, 32, 4, 0, 16, 0, 4, 0, 0, 32, 4, 0, 0, 64, 0, 0, 0, 32, 0, 0, 12, 0, 0, 0, - 0, 0, 0, 0, 155,73, 68, 0, 0, 0, 0, 0, 16, 4, 10, 0, 0, 0, 0, 0, 139,40, 30, 3, 0, 0, 0, 0, 32, 3, 0, 1, 0, 0, 0, 0, 217,9, 2, 0, - 0, 0, 0, 0, 130,41, 66, 0, 0, 96, 0, 0, 30, 152,6, 1, 0, 0, 0, 0, 0, 20, 16, 1, 0, 0, 0, 0, 132,44, 14, 2, 0, 0, 0, 0, 21, 73, 12, 0, - 0, 0, 0, 0, 145,69, 18, 0, 0, 0, 0, 0, 2, 64, 26, 0, 0, 0, 0, 0, 53, 205,28, 3, 0, 0, 0, 0, 4, 1, 64, 1, 0, 0, 0, 0, 4, 55, 4, 1, - 0, 0, 0, 0, 16, 180,40, 0, 0, 0, 0, 0, 17, 64, 2, 2, 0, 0, 0, 0, 1, 129,4, 0, 0, 0, 0, 0, 19, 249,14, 1, 0, 0, 0, 0, 14, 32, 14, 1, - 0, 0, 0, 0, 1, 13, 4, 0, 0, 0, 0, 0, 8, 36, 8, 1, 0, 112,44, 0, 165,73, 44, 0, 16, 160,0, 0, 127,125,94, 1, 0, 0, 0, 0, 147,89, 15, 0, - 0, 0, 0, 0, 144,40, 2, 1, 0, 0, 0, 0, 16, 8, 106,0, 0, 0, 0, 0, 80, 8, 8, 0, 0, 96, 8, 0, 10, 0, 36, 0, 0, 0, 0, 0, 1, 64, 2, 2, - 0, 0, 0, 0, 2, 48, 0, 2, 0, 128,0, 0, 17, 233,2, 0, 0, 96, 59, 0, 255,255,252,0, 0, 0, 0, 0, 2, 0, 64, 1, 0, 0, 0, 0, 0, 248,16, 0, - 0, 0, 0, 0, 16, 112,0, 0, 0, 32, 0, 0, 4, 34, 134,0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 20, 192,8, 1, 0, 0, 0, 0, 127,255,122,1, - 0, 0, 0, 0, 134,38, 8, 0, 0, 0, 0, 0, 32, 40, 12, 0, 0, 0, 0, 0, 23, 1, 4, 0, 0, 0, 0, 0, 8, 64, 6, 0, 0, 0, 0, 0, 83, 32, 8, 1, - 0, 0, 0, 0, 1, 168,8, 1, 0, 0, 0, 0, 149,221,29, 3, 0, 32, 4, 0, 3, 33, 4, 1, 0, 0, 0, 0, 16, 20, 64, 0, 0, 0, 0, 0, 180,207,58, 1, - 0, 0, 0, 0, 0, 2, 2, 1, 0, 0, 0, 0, 153,67, 16, 1, 0, 0, 0, 0, 17, 65, 10, 1, 0, 0, 0, 0, 157,33, 26, 0, 0, 0, 0, 0, 72, 34, 4, 0, - 0, 0, 0, 0, 16, 196,4, 0, 0, 0, 0, 0, 12, 1, 2, 0, 0, 0, 0, 0, 1, 77, 0, 2, 0, 0, 1, 0, 0, 0, 4, 2, 0, 0, 0, 0, 238,189,62, 3, - 0, 0, 0, 0, 0, 145,0, 1, 0, 0, 0, 0, 64, 34, 0, 0, 0, 0, 0, 0, 48, 8, 4, 1, 0, 0, 0, 0, 223,37, 76, 2, 0, 0, 0, 0, 18, 64, 8, 0, - 0, 0, 0, 0, 27, 113,26, 1, 0, 0, 0, 0, 128,72, 68, 2, 0, 0, 0, 0, 0, 80, 0, 1, 0, 0, 0, 0, 50, 24, 64, 0, 0, 0, 0, 0, 149,25, 12, 2, - 0, 0, 0, 0, 17, 33, 0, 2, 0, 0, 0, 0, 253,185,14, 3, 0, 0, 0, 0, 8, 32, 10, 2, 0, 0, 0, 0, 48, 145,12, 1, 0, 0, 0, 0, 19, 9, 0, 0, - 0, 0, 0, 0, 24, 184,14, 2, 0, 96, 4, 0, 219,249,92, 1, 0, 0, 0, 0, 84, 8, 8, 0, 0, 0, 0, 0, 28, 68, 12, 0, 0, 0, 0, 0, 0, 41, 12, 0, - 0, 0, 0, 0, 253,184,46, 2, 0, 0, 0, 0, 6, 0, 10, 0, 0, 0, 0, 0, 2, 16, 68, 0, 0, 0, 0, 0, 122,36, 12, 0, 0, 0, 0, 0, 161,0, 2, 1, - 0, 32, 0, 0, 17, 9, 4, 0, 0, 0, 0, 0, 115,81, 0, 0, 0, 0, 0, 0, 99, 232,2, 1, 0, 0, 0, 0, 0, 160,4, 0, 0, 32, 0, 0, 32, 128,4, 0, - 0, 0, 0, 0, 63, 252,62, 2, 0, 0, 0, 0, 1, 76, 0, 0, 0, 0, 0, 0, 145,184,104,0, 0, 32, 0, 0, 128,32, 0, 0, 0, 0, 0, 0, 19, 213,4, 0, - 0, 0, 0, 0, 129,72, 12, 0, 0, 0, 0, 0, 93, 96, 8, 0, 0, 0, 0, 0, 64, 164,128,0, 0, 0, 0, 0, 144,89, 2, 0, 0, 0, 0, 0, 8, 160,96, 0, - 0, 0, 0, 0, 128,96, 16, 0, 0, 0, 0, 0, 17, 81, 22, 0, 0, 0, 4, 0, 1, 16, 12, 1, 0, 168,2, 0, 17, 65, 4, 0, 0, 0, 0, 0, 21, 253,88, 1, - 0, 0, 0, 0, 46, 56, 14, 0, 0, 0, 0, 0, 6, 128,4, 0, 0, 0, 0, 0, 68, 44, 110,0, 0, 0, 0, 0, 4, 156,12, 0, 0, 0, 0, 0, 38, 24, 4, 0, - 0, 0, 0, 0, 12, 176,4, 0, 0, 0, 0, 0, 5, 68, 16, 0, 16, 228,7, 0, 223,255,254,3, 0, 0, 1, 0, 32, 0, 0, 0, 0, 0, 16, 0, 255,255,255,3, - 0, 0, 0, 0, 32, 12, 2, 0, 0, 0, 0, 0, 19, 73, 22, 0, 0, 0, 0, 0, 68, 12, 14, 0, 0, 0, 0, 0, 5, 96, 12, 0, 0, 32, 2, 0, 13, 8, 78, 0, - 0, 0, 0, 0, 1, 104,2, 0, 0, 0, 0, 0, 157,109,28, 1, 0, 0, 0, 0, 2, 36, 2, 0, 0, 0, 0, 0, 2, 176,4, 0, 0, 0, 0, 0, 221,153,8, 1, - 0, 0, 0, 0, 0, 112,20, 0, 0, 0, 0, 0, 68, 6, 8, 0, 0, 0, 0, 0, 49, 77, 30, 0, 0, 0, 0, 0, 211,88, 20, 0, 0, 0, 0, 0, 14, 56, 8, 0, - 0, 0, 0, 0, 0, 8, 42, 0, 0, 0, 0, 0, 20, 129,4, 0, 0, 0, 0, 0, 246,238,78, 3, 0, 0, 0, 0, 210,201,68, 0, 0, 0, 0, 0, 65, 64, 24, 0, - 0, 0, 0, 0, 0, 17, 16, 0, 0, 0, 0, 0, 204,125,30, 1, 0, 0, 16, 0, 173,113,30, 0, 0, 0, 0, 0, 255,221,124,1, 0, 0, 0, 0, 195,56, 46, 1, - 0, 0, 0, 0, 2, 32, 6, 0, 0, 0, 0, 0, 55, 16, 28, 0, 0, 0, 16, 0, 19, 1, 12, 1, 0, 0, 0, 0, 83, 81, 16, 1, 0, 0, 0, 0, 204,160,6, 0, - 0, 0, 0, 0, 19, 221,86, 0, 0, 0, 0, 0, 72, 45, 30, 1, 0, 0, 0, 0, 65, 65, 0, 0, 0, 0, 0, 0, 8, 13, 6, 2, 0, 0, 0, 0, 21, 60, 6, 1, - 0, 0, 0, 0, 255,127,92, 3, 0, 0, 0, 0, 194,37, 0, 0, 0, 0, 0, 0, 19, 66, 18, 1, 0, 0, 1, 0, 68, 46, 5, 1, 0, 0, 0, 0, 17, 105,22, 1, - 0, 0, 0, 0, 1, 17, 8, 0, 0, 0, 0, 0, 1, 16, 8, 1, 0, 0, 0, 0, 65, 84, 12, 0, 0, 0, 0, 0, 25, 81, 132,0, 0, 0, 0, 0, 136,0, 0, 2, - 0, 0, 0, 0, 136,36, 2, 1, 0, 0, 0, 0, 16, 13, 8, 1, 0, 0, 0, 0, 145,201,22, 0, 0, 0, 0, 0, 128,104,12, 0, 0, 0, 0, 0, 1, 98, 2, 0, - 0, 0, 0, 0, 136,33, 2, 0, 16, 0, 0, 0, 219,255,127,3, 0, 0, 0, 0, 138,172,76, 3, 0, 0, 0, 0, 32, 54, 1, 0, 0, 0, 0, 0, 34, 128,96, 0, - 0, 0, 0, 0, 64, 32, 12, 0, 0, 0, 0, 0, 17, 8, 28, 0, 0, 0, 0, 0, 66, 48, 2, 0, 0, 0, 0, 0, 52, 32, 0, 0, 0, 0, 0, 0, 150,29, 12, 0, - 0, 0, 0, 0, 1, 23, 0, 0, 0, 0, 0, 0, 58, 8, 14, 0, 0, 0, 0, 0, 213,123,30, 1, 0, 0, 0, 0, 0, 24, 38, 1, 0, 0, 0, 0, 0, 112,2, 0, - 0, 0, 0, 0, 128,112,8, 1, 16, 0, 0, 0, 87, 168,14, 2, 0, 0, 0, 0, 3, 16, 0, 0, 0, 0, 0, 0, 64, 0, 24, 1, 0, 0, 0, 0, 169,33, 64, 0, - 0, 0, 0, 0, 73, 32, 0, 0, 0, 8, 0, 0, 17, 209,16, 0, 0, 0, 0, 0, 12, 41, 68, 0, 0, 0, 0, 0, 27, 120,12, 1, 0, 112,36, 0, 4, 16, 4, 0, - 0, 32, 0, 0, 25, 16, 0, 2, 0, 0, 0, 0, 17, 17, 0, 3, 0, 0, 0, 0, 201,128,64, 2, 0, 0, 0, 0, 49, 16, 18, 0, 0, 0, 0, 0, 0, 0, 1, 2, - 0, 0, 1, 0, 230,188,15, 0, 0, 0, 0, 0, 16, 81, 8, 0, 16, 0, 0, 0, 16, 8, 0, 0, 0, 128,0, 0, 17, 89, 68, 0, 0, 0, 0, 0, 56, 1, 4, 1, - 0, 0, 0, 0, 24, 137,8, 0, 0, 0, 0, 0, 133,124,28, 0, 0, 32, 0, 0, 29, 49, 12, 0, 0, 0, 32, 0, 16, 65, 0, 0, 0, 0, 0, 0, 4, 68, 5, 0, - 0, 32, 0, 0, 4, 8, 0, 0, 0, 0, 0, 0, 59, 1, 130,0, 0, 96, 0, 0, 2, 0, 4, 0, 0, 16, 0, 0, 204,190,46, 0, 0, 32, 0, 0, 99, 9, 4, 1, - 0, 32, 0, 0, 16, 8, 0, 1, 0, 0, 0, 0, 48, 11, 0, 0, 0, 0, 0, 0, 145,32, 24, 0, 0, 16, 0, 0, 17, 32, 22, 0, 0, 0, 0, 0, 68, 24, 156,0, - 0, 0, 0, 0, 17, 45, 24, 0, 0, 0, 0, 0, 125,125,28, 0, 0, 0, 0, 0, 108,244,172,0, 0, 0, 0, 0, 129,72, 2, 0, 16, 0, 0, 0, 17, 81, 28, 1, - 0, 0, 0, 0, 32, 0, 6, 2, 0, 0, 0, 0, 20, 96, 4, 0, 0, 0, 0, 0, 19, 245,16, 0, 0, 32, 0, 0, 64, 32, 4, 0, 0, 48, 0, 0, 81, 201,28, 0, - 0, 32, 0, 0, 1, 0, 16, 0, 0, 32, 0, 0, 0, 16, 14, 0, 0, 0, 0, 0, 255,249,30, 2, 0, 0, 0, 0, 70, 56, 6, 0, 0, 0, 0, 0, 0, 64, 18, 1, - 0, 0, 0, 0, 10, 48, 14, 1, 0, 0, 0, 0, 67, 68, 80, 0, 0, 4, 0, 0, 17, 65, 0, 1, 0, 112,0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 36, 32, 2, 0, - 0, 0, 0, 0, 145,9, 4, 0, 0, 0, 0, 0, 172,0, 8, 0, 0, 0, 0, 0, 181,137,16, 0, 0, 0, 0, 0, 223,255,126,2, 0, 0, 0, 0, 138,49, 48, 2, - 0, 0, 0, 0, 35, 188,4, 2, 0, 0, 0, 0, 4, 32, 4, 1, 0, 32, 0, 0, 52, 169,4, 2, 0, 0, 0, 0, 2, 40, 14, 3, 0, 32, 0, 0, 51, 72, 12, 0, - 0, 0, 0, 0, 133,124,14, 0, 0, 240,32, 0, 27, 209,20, 1, 0, 0, 0, 0, 2, 48, 40, 0, 0, 32, 0, 0, 16, 16, 4, 0, 0, 0, 0, 0, 38, 52, 12, 0, - 0, 32, 0, 0, 0, 40, 4, 0, 0, 0, 0, 0, 145,73, 30, 2, 0, 0, 0, 0, 204,152,18, 0, 0, 0, 0, 0, 2, 0, 6, 2, 0, 0, 0, 0, 17, 84, 4, 0, - 0, 0, 0, 0, 21, 17, 8, 0, 0, 0, 0, 0, 12, 32, 6, 0, 0, 96, 6, 0, 2, 0, 4, 0, 0, 8, 0, 0, 18, 65, 22, 0, 0, 0, 0, 0, 3, 69, 64, 0, - 0, 16, 0, 0, 29, 97, 250,1, 0, 0, 0, 0, 94, 253,254,1, 0, 0, 0, 0, 17, 0, 134,0, 0, 0, 0, 0, 24, 65, 0, 1, 0, 0, 0, 0, 16, 4, 20, 0, - 0, 0, 0, 0, 147,25, 0, 0, 0, 0, 0, 0, 19, 144,0, 0, 0, 0, 0, 0, 209,199,12, 0, 0, 0, 0, 0, 112,9, 20, 1, 0, 0, 0, 0, 1, 160,6, 0, - 16, 0, 0, 0, 213,64, 12, 0, 0, 0, 0, 0, 8, 8, 36, 0, 0, 0, 0, 0, 0, 28, 26, 0, 0, 0, 0, 0, 4, 32, 30, 0, 0, 0, 0, 0, 49, 64, 18, 0, - 0, 0, 0, 0, 8, 56, 4, 0, 0, 0, 0, 0, 0, 72, 10, 0, 0, 0, 0, 0, 129,97, 2, 0, 0, 0, 16, 0, 16, 0, 0, 0, 0, 0, 0, 0, 8, 40, 64, 0, - 0, 0, 0, 0, 17, 89, 64, 0, 0, 96, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 14, 168,14, 0, 0, 0, 0, 0, 2, 64, 2, 0, 0, 0, 0, 0, 0, 144,40, 0, - 16, 0, 0, 0, 43, 81, 92, 0, 0, 0, 0, 0, 8, 8, 38, 0, 0, 0, 0, 0, 17, 96, 32, 0, 0, 0, 0, 0, 24, 176,6, 0, 0, 0, 0, 0, 4, 160,16, 0, - 0, 0, 0, 0, 145,177,28, 2, 0, 0, 0, 0, 2, 17, 16, 0, 16, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 64, 48, 4, 0, 0, 0, 0, 0, 161,1, 2, 0, - 0, 0, 0, 0, 8, 8, 34, 0, 0, 0, 0, 0, 223,124,174,0, 0, 0, 0, 0, 42, 188,62, 0, 0, 0, 0, 0, 82, 16, 0, 0, 0, 0, 0, 0, 1, 16, 6, 1, - 0, 0, 0, 0, 65, 28, 0, 0, 0, 0, 0, 0, 80, 44, 4, 0, 16, 32, 0, 0, 0, 1, 36, 1, 0, 32, 0, 0, 18, 129,4, 0, 0, 0, 0, 0, 8, 0, 28, 1, - 16, 0, 0, 0, 0, 65, 12, 0, 0, 0, 0, 0, 27, 121,30, 0, 0, 0, 0, 0, 18, 0, 16, 1, 0, 0, 0, 0, 19, 217,20, 0, 0, 240,8, 0, 24, 67, 44, 0, - 0, 0, 0, 0, 82, 32, 0, 0, 0, 0, 34, 0, 59, 253,44, 0, 0, 0, 0, 0, 12, 32, 128,2, 0, 0, 0, 0, 219,72, 77, 1, 0, 0, 0, 0, 98, 56, 0, 0, - 0, 0, 0, 0, 65, 0, 36, 0, 0, 0, 0, 0, 20, 185,84, 0, 0, 0, 0, 0, 17, 72, 68, 0, 0, 162,0, 0, 56, 128,12, 0, 0, 0, 0, 0, 36, 136,36, 0, - 0, 0, 0, 0, 87, 240,92, 0, 0, 0, 0, 0, 88, 0, 12, 0, 0, 0, 0, 0, 0, 192,64, 0, 0, 0, 0, 0, 27, 33, 4, 0, 0, 0, 0, 0, 0, 48, 204,0, - 0, 0, 0, 0, 93, 120,14, 1, 0, 0, 1, 0, 64, 8, 4, 0, 0, 0, 0, 0, 16, 161,4, 0, 0, 0, 0, 0, 90, 4, 0, 0, 0, 240,46, 0, 30, 65, 4, 0, - 0, 0, 0, 0, 67, 57, 14, 1, 0, 0, 0, 0, 10, 64, 8, 0, 0, 0, 0, 0, 4, 129,2, 0, 0, 0, 0, 0, 99, 56, 6, 0, 0, 0, 0, 0, 255,255,238,2, - 0, 0, 0, 0, 64, 112,2, 0, 0, 0, 0, 0, 193,98, 0, 0, 0, 0, 0, 0, 18, 73, 80, 0, 0, 0, 0, 0, 19, 33, 0, 1, 0, 0, 0, 0, 16, 41, 12, 0, - 0, 0, 0, 0, 27, 17, 66, 1, 0, 0, 0, 0, 234,188,30, 0, 0, 0, 0, 0, 88, 4, 8, 0, 0, 0, 0, 0, 85, 48, 6, 0, 0, 0, 0, 0, 64, 2, 0, 2, - 0, 0, 0, 0, 33, 72, 8, 0, 0, 0, 0, 0, 17, 33, 8, 1, 0, 0, 0, 0, 209,40, 18, 0, 0, 240,62, 0, 54, 153,78, 0, 0, 240,44, 0, 0, 0, 4, 0, - 0, 32, 0, 0, 17, 40, 6, 1, 0, 0, 0, 0, 129,5, 42, 0, 0, 0, 0, 0, 123,121,28, 2, 0, 0, 0, 0, 8, 17, 10, 1, 0, 32, 0, 0, 31, 221,30, 0, - 0, 32, 0, 0, 144,0, 14, 0, 0, 0, 0, 0, 17, 72, 22, 0, 0, 32, 0, 0, 16, 25, 68, 0, 0, 96, 0, 0, 47, 236,206,3, 0, 0, 0, 0, 132,136,8, 0, - 0, 0, 0, 0, 8, 36, 12, 0, 0, 0, 0, 0, 144,33, 4, 0, 0, 0, 0, 0, 160,40, 142,0, 0, 0, 0, 0, 255,253,30, 1, 0, 32, 0, 0, 0, 18, 4, 0, - 0, 0, 0, 0, 1, 73, 6, 0, 0, 0, 0, 0, 81, 8, 68, 0, 0, 32, 0, 0, 18, 1, 0, 0, 0, 0, 0, 0, 11, 8, 6, 1, 0, 0, 0, 0, 16, 88, 8, 0, - 0, 0, 0, 0, 0, 205,30, 0, 0, 0, 0, 0, 16, 25, 20, 1, 0, 0, 0, 0, 12, 40, 10, 1, 0, 0, 0, 0, 16, 160,0, 0, 0, 0, 0, 0, 21, 197,30, 1, - 0, 0, 0, 0, 10, 49, 4, 0, 0, 0, 0, 0, 4, 176,32, 0, 0, 0, 0, 0, 159,81, 20, 2, 0, 0, 0, 0, 17, 12, 0, 0, 0, 0, 0, 0, 181,89, 30, 2, - 0, 96, 0, 0, 17, 1, 4, 0, 0, 0, 0, 0, 5, 4, 16, 0, 0, 0, 0, 0, 136,1, 6, 0, 0, 32, 0, 0, 1, 32, 64, 0, 0, 0, 0, 0, 1, 97, 0, 2, - 0, 0, 1, 0, 35, 64, 8, 0, 0, 32, 0, 0, 19, 9, 16, 0, 0, 0, 0, 0, 0, 24, 136,0, 0, 128,0, 0, 1, 98, 0, 0, 0, 64, 0, 0, 32, 17, 36, 0, - 0, 0, 0, 0, 68, 32, 6, 0, 0, 0, 0, 0, 0, 16, 8, 1, 0, 32, 0, 0, 0, 64, 4, 2, 0, 0, 0, 0, 64, 40, 6, 2, 0, 96, 0, 0, 8, 0, 8, 0, - 0, 0, 0, 0, 149,68, 1, 2, 0, 0, 0, 0, 153,81, 8, 1, 0, 32, 0, 0, 0, 9, 0, 1, 0, 0, 0, 0, 40, 187,102,0, 0, 0, 0, 0, 65, 2, 0, 0, - 0, 0, 0, 0, 48, 132,0, 0, 0, 0, 0, 0, 33, 65, 24, 0, 0, 0, 0, 0, 81, 104,20, 0, 0, 0, 0, 0, 8, 40, 40, 0, 16, 0, 0, 0, 17, 77, 16, 1, - 0, 0, 0, 0, 191,125,60, 2, 0, 0, 0, 0, 40, 32, 6, 0, 0, 0, 0, 0, 0, 116,32, 0, 0, 0, 0, 0, 19, 49, 68, 1, 0, 0, 0, 0, 40, 16, 14, 1, - 0, 96, 0, 0, 55, 223,92, 1, 0, 0, 0, 0, 128,41, 14, 2, 0, 32, 0, 0, 145,69, 20, 2, 0, 0, 0, 0, 0, 12, 40, 0, 0, 0, 0, 0, 129,0, 2, 2, - 0, 0, 0, 0, 128,45, 6, 1, 0, 0, 0, 0, 28, 12, 12, 0, 0, 96, 2, 0, 94, 12, 12, 1, 0, 0, 0, 0, 208,148,2, 1, 0, 0, 0, 0, 148,197,0, 0, - 0, 0, 0, 0, 95, 111,14, 3, 0, 0, 0, 0, 0, 41, 68, 0, 0, 0, 0, 0, 8, 12, 14, 1, 0, 0, 0, 0, 17, 2, 54, 2, 0, 0, 0, 0, 85, 96, 12, 0, - 0, 96, 53, 64, 129,0, 0, 0, 0, 0, 0, 0, 254,252,78, 2, 0, 0, 4, 0, 51, 85, 12, 0, 0, 32, 0, 0, 144,65, 0, 0, 0, 0, 0, 0, 19, 0, 20, 0, - 0, 0, 0, 0, 21, 128,12, 0, 0, 0, 0, 0, 19, 153,0, 0, 0, 2, 0, 0, 253,253,12, 0, 0, 0, 0, 0, 4, 40, 0, 2, 0, 0, 0, 0, 0, 12, 14, 2, - 0, 0, 0, 0, 64, 41, 6, 0, 0, 0, 0, 0, 25, 9, 4, 0, 0, 0, 0, 0, 149,193,0, 1, 0, 0, 0, 0, 127,245,63, 1, 0, 0, 0, 0, 17, 67, 16, 0, - 0, 0, 0, 0, 16, 9, 64, 0, 0, 0, 0, 0, 1, 40, 4, 3, 0, 0, 0, 0, 83, 33, 40, 1, 0, 0, 0, 0, 81, 65, 17, 0, 0, 0, 0, 0, 0, 65, 6, 0, - 0, 0, 0, 0, 4, 53, 4, 0, 0, 0, 0, 0, 8, 41, 0, 0, 0, 0, 0, 0, 78, 106,4, 3, 0, 0, 32, 0, 0, 64, 4, 0, 0, 0, 0, 0, 28, 106,4, 0, - 0, 0, 0, 0, 144,65, 8, 0, 0, 16, 0, 0, 16, 65, 22, 0, 0, 0, 0, 0, 80, 64, 2, 0, 0, 0, 16, 0, 149,65, 12, 0, 0, 0, 0, 0, 3, 68, 2, 1, - 0, 0, 0, 0, 145,113,12, 2, 0, 0, 32, 0, 0, 32, 14, 0, 0, 0, 0, 0, 207,186,46, 0, 0, 0, 0, 0, 27, 153,12, 1, 0, 0, 0, 0, 80, 33, 8, 0, - 0, 0, 0, 0, 1, 80, 4, 0, 0, 0, 0, 0, 19, 113,44, 0, 0, 0, 0, 0, 17, 17, 2, 0, 0, 0, 0, 0, 23, 169,14, 0, 0, 0, 0, 0, 148,9, 4, 2, - 0, 0, 0, 0, 181,217,33, 0, 16, 0, 0, 0, 0, 8, 0, 0, 0, 96, 0, 0, 51, 97, 22, 3, 0, 0, 0, 0, 254,255,254,1, 0, 0, 0, 0, 17, 64, 16, 2, - 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 0, 144,5, 8, 3, 0, 32, 0, 0, 25, 0, 70, 1, 0, 32, 0, 0, 19, 9, 68, 0, 0, 0, 0, 0, 8, 80, 6, 0, - 0, 0, 0, 0, 33, 1, 8, 0, 0, 0, 0, 0, 146,73, 68, 0, 0, 32, 0, 0, 145,89, 20, 0, 0, 32, 0, 0, 16, 128,0, 0, 0, 0, 0, 0, 22, 216,70, 0, - 0, 0, 0, 0, 87, 53, 29, 2, 0, 32, 0, 0, 255,255,116,1, 0, 0, 0, 0, 4, 24, 136,0, 0, 0, 0, 0, 16, 65, 68, 0, 0, 0, 0, 0, 4, 48, 144,0, - 0, 0, 0, 0, 153,128,4, 0, 0, 0, 0, 0, 128,132,12, 0, 0, 32, 0, 0, 20, 17, 0, 1, 0, 0, 0, 0, 82, 48, 140,0, 0, 0, 0, 0, 128,48, 64, 2, - 0, 0, 0, 0, 17, 101,0, 0, 0, 0, 0, 0, 64, 41, 0, 0, 0, 32, 0, 0, 20, 73, 4, 0, 0, 0, 0, 0, 8, 8, 132,0, 0, 0, 0, 0, 21, 40, 100,0, - 0, 0, 0, 0, 255,255,252,3, 0, 0, 0, 0, 12, 52, 14, 0, 0, 0, 0, 0, 1, 17, 68, 0, 0, 0, 0, 0, 18, 105,16, 0, 0, 0, 0, 0, 16, 65, 64, 0, - 0, 32, 0, 0, 228,56, 12, 0, 0, 0, 0, 0, 48, 64, 26, 2, 0, 0, 0, 0, 14, 32, 4, 0, 0, 0, 2, 0, 18, 4, 4, 0, 0, 0, 0, 0, 19, 217,0, 0, - 0, 0, 0, 0, 143,101,8, 0, 0, 32, 0, 0, 129,81, 0, 2, 0, 0, 0, 0, 1, 5, 8, 0, 0, 0, 0, 0, 133,200,44, 0, 0, 0, 0, 0, 144,65, 8, 1, - 0, 0, 0, 0, 64, 40, 12, 2, 0, 0, 2, 0, 127,252,191,2, 0, 0, 0, 0, 147,73, 16, 0, 0, 0, 0, 0, 145,69, 0, 1, 0, 32, 0, 0, 16, 9, 4, 1, - 0, 0, 0, 0, 4, 24, 0, 0, 0, 0, 0, 0, 76, 32, 22, 0, 0, 0, 0, 0, 48, 73, 0, 0, 0, 0, 0, 0, 80, 73, 16, 0, 0, 96, 0, 0, 48, 1, 4, 0, - 0, 0, 0, 0, 3, 73, 8, 0, 0, 0, 8, 0, 19, 177,4, 0, 0, 0, 0, 0, 221,5, 8, 0, 0, 0, 0, 0, 8, 0, 24, 0, 0, 160,8, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 8, 56, 132,0, 0, 0, 0, 0, 145,201,28, 0, 0, 0, 0, 0, 168,16, 140,0, 0, 0, 0, 0, 8, 9, 4, 0, 0, 0, 0, 0, 140,76, 8, 0, - 0, 0, 0, 0, 20, 73, 12, 2, 0, 0, 0, 0, 1, 32, 28, 0, 0, 0, 0, 0, 254,255,252,1, 0, 0, 0, 0, 133,1, 0, 0, 0, 0, 0, 0, 176,0, 0, 0, - 0, 0, 0, 0, 24, 73, 4, 0, 0, 0, 0, 0, 9, 12, 4, 0, 0, 0, 0, 0, 132,36, 0, 0, 0, 32, 0, 0, 144,65, 4, 0, 0, 0, 0, 0, 19, 136,4, 0, - 0, 0, 0, 0, 93, 33, 12, 2, 0, 0, 0, 0, 20, 129,12, 0, 0, 0, 0, 0, 128,80, 12, 2, 0, 0, 0, 0, 66, 160,12, 0, 0, 96, 0, 0, 40, 16, 4, 0, - 0, 32, 0, 0, 2, 48, 12, 0, 0, 0, 0, 0, 255,255,174,0, 0, 96, 0, 0, 17, 25, 4, 0, 0, 0, 0, 0, 80, 97, 0, 1, 0, 0, 0, 0, 195,56, 142,0, - 0, 0, 0, 0, 1, 72, 20, 1, 0, 0, 0, 0, 16, 192,4, 0, 0, 0, 0, 0, 92, 36, 0, 2, 0, 0, 0, 0, 148,13, 12, 0, 0, 32, 0, 0, 16, 49, 68, 1, - 0, 0, 0, 0, 16, 73, 8, 0, 0, 0, 0, 0, 83, 241,12, 0, 0, 0, 0, 0, 149,213,112,0, 0, 0, 0, 0, 0, 109,54, 0, 0, 0, 0, 0, 1, 176,6, 0, - 0, 0, 0, 0, 222,39, 14, 3, 0, 0, 0, 0, 8, 0, 16, 1, 0, 0, 0, 0, 72, 16, 0, 0, 0, 32, 0, 0, 255,255,191,3, 0, 0, 0, 0, 128,57, 14, 2, - 0, 0, 0, 0, 83, 81, 54, 0, 0, 0, 0, 0, 0, 24, 20, 0, 0, 0, 0, 0, 68, 80, 44, 0, 0, 0, 0, 0, 149,68, 20, 2, 0, 0, 0, 0, 33, 96, 8, 0, - 0, 0, 0, 0, 211,16, 68, 0, 0, 0, 0, 0, 21, 141,20, 0, 0, 0, 0, 0, 128,16, 2, 0, 0, 0, 0, 0, 19, 253,16, 0, 0, 0, 0, 0, 219,101,4, 0, - 0, 0, 0, 0, 25, 0, 20, 0, 0, 0, 0, 0, 130,56, 2, 0, 0, 0, 0, 0, 17, 201,0, 1, 0, 0, 0, 0, 127,255,63, 3, 0, 0, 0, 0, 0, 48, 8, 1, - 0, 0, 0, 0, 0, 32, 38, 0, 0, 96, 36, 0, 108,178,12, 2, 0, 32, 0, 0, 17, 89, 20, 0, 0, 32, 2, 0, 0, 0, 4, 0, 0, 2, 0, 0, 159,253,29, 0, - 0, 0, 0, 0, 66, 0, 2, 0, 0, 0, 0, 0, 24, 8, 6, 1, 0, 0, 0, 0, 32, 0, 112,0, 0, 0, 0, 0, 4, 52, 64, 0, 0, 0, 0, 0, 88, 8, 4, 0, - 0, 96, 0, 0, 8, 32, 4, 0, 0, 0, 0, 0, 133,13, 12, 1, 0, 0, 0, 0, 129,72, 16, 0, 0, 0, 0, 0, 145,69, 92, 0, 0, 0, 0, 0, 146,128,8, 0, - 0, 4, 4, 0, 16, 112,130,0, 0, 0, 0, 0, 8, 33, 14, 0, 0, 0, 0, 0, 153,40, 10, 0, 0, 0, 0, 0, 8, 36, 8, 2, 0, 0, 0, 0, 24, 9, 0, 1, - 0, 0, 0, 0, 32, 8, 32, 0, 0, 96, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 124,40, 142,2, 0, 0, 0, 0, 87, 165,12, 2, 0, 96, 0, 0, 0, 0, 12, 0, - 0, 2, 0, 0, 236,216,14, 0, 0, 0, 0, 0, 95, 253,62, 0, 0, 0, 0, 0, 24, 80, 64, 0, 0, 96, 0, 0, 14, 2, 4, 0, 0, 0, 0, 0, 25, 65, 64, 0, - 0, 0, 1, 0, 44, 0, 68, 0, 0, 0, 0, 0, 36, 32, 4, 0, 0, 0, 0, 0, 21, 65, 82, 0, 0, 0, 0, 0, 9, 69, 4, 2, 0, 0, 0, 0, 17, 128,32, 0, - 16, 68, 1, 0, 255,255,254,3, 0, 0, 0, 0, 1, 36, 4, 0, 0, 4, 0, 0, 5, 0, 4, 0, 0, 0, 0, 0, 17, 32, 32, 0, 0, 0, 5, 0, 17, 105,50, 0, - 0, 0, 0, 0, 0, 8, 13, 0, 0, 0, 0, 0, 133,77, 4, 0, 0, 0, 0, 0, 8, 16, 0, 1, 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 27, 89, 16, 0, - 0, 0, 0, 0, 4, 41, 0, 1, 0, 0, 16, 0, 174,188,6, 0, 0, 0, 0, 0, 236,196,0, 1, 0, 0, 0, 0, 34, 2, 128,0, 0, 0, 0, 0, 209,72, 18, 0, - 0, 0, 0, 0, 0, 41, 2, 2, 0, 0, 0, 0, 187,90, 90, 1, 0, 0, 0, 0, 8, 0, 32, 1, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 208,120,28, 0, - 0, 0, 0, 0, 129,166,16, 1, 0, 128,0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 48, 97, 27, 0, 0, 0, 0, 0, 5, 128,0, 1, 0, 0, 0, 0, 63, 123,126,1, - 0, 0, 0, 0, 3, 49, 8, 0, 0, 0, 0, 0, 15, 0, 12, 0, 0, 0, 0, 0, 129,36, 0, 0, 0, 0, 0, 0, 17, 80, 22, 0, 0, 32, 0, 0, 4, 24, 44, 0, - 0, 0, 0, 0, 179,189,76, 0, 0, 0, 0, 0, 64, 40, 14, 1, 0, 0, 0, 0, 29, 1, 2, 0, 0, 0, 0, 0, 137,0, 4, 2, 0, 0, 0, 0, 129,1, 9, 0, - 0, 0, 1, 0, 255,255,127,3, 0, 0, 0, 0, 110,185,126,0, 0, 0, 0, 0, 0, 65, 48, 0, 0, 0, 0, 0, 64, 33, 12, 0, 0, 0, 1, 0, 17, 73, 18, 0, - 0, 0, 0, 0, 145,77, 26, 0, 0, 0, 0, 0, 1, 0, 34, 0, 0, 0, 0, 0, 3, 32, 4, 0, 0, 0, 0, 0, 0, 120,50, 0, 0, 0, 0, 0, 32, 144,0, 0, - 0, 0, 0, 0, 44, 32, 45, 0, 0, 0, 0, 0, 0, 140,2, 0, 0, 0, 0, 0, 32, 8, 8, 0, 0, 0, 0, 0, 17, 225,18, 1, 0, 0, 0, 0, 0, 16, 24, 0, - 0, 0, 0, 0, 37, 48, 46, 0, 0, 32, 0, 0, 255,252,126,0, 0, 0, 0, 0, 33, 0, 32, 0, 0, 0, 0, 0, 148,1, 8, 0, 0, 0, 0, 0, 49, 32, 38, 0, - 0, 0, 0, 0, 4, 33, 16, 0, 0, 0, 0, 0, 13, 184,173,0, 0, 0, 0, 0, 44, 0, 8, 0, 0, 0, 0, 0, 21, 201,18, 0, 0, 0, 0, 0, 0, 17, 44, 2, - 0, 0, 0, 0, 145,72, 50, 0, 0, 0, 0, 0, 0, 1, 34, 0, 0, 0, 0, 0, 47, 252,175,0, 0, 0, 0, 0, 17, 68, 2, 1, 0, 0, 0, 0, 164,2, 44, 0, - 0, 32, 0, 0, 16, 1, 44, 0, 0, 0, 0, 0, 0, 1, 14, 0, 0, 0, 0, 0, 17, 65, 48, 0, 0, 0, 0, 0, 4, 52, 12, 0, 0, 0, 0, 0, 5, 0, 32, 0, - 0, 0, 0, 0, 0, 4, 140,0, 0, 0, 0, 0, 8, 8, 32, 0, 0, 0, 0, 0, 20, 0, 66, 0, 0, 0, 0, 0, 46, 128,2, 0, 0, 0, 0, 0, 4, 9, 42, 0, - 0, 0, 0, 0, 0, 136,64, 0, 0, 0, 0, 0, 12, 128,8, 0, 0, 0, 0, 0, 44, 0, 40, 0, 0, 0, 0, 0, 17, 65, 80, 0, 0, 0, 0, 0, 4, 32, 56, 0, - 0, 0, 0, 0, 101,153,45, 0, 0, 0, 0, 0, 12, 8, 4, 0, 0, 0, 0, 0, 16, 192,8, 0, 0, 0, 0, 0, 149,197,88, 1, 0, 0, 0, 0, 32, 33, 40, 0, - 0, 0, 0, 0, 21, 8, 10, 0, 0, 0, 0, 0, 8, 1, 32, 0, 0, 0, 0, 0, 34, 0, 8, 0, 0, 0, 0, 0, 6, 161,6, 0, 0, 0, 0, 0, 0, 184,0, 0, - 0, 0, 0, 0, 130,84, 6, 2, 0, 0, 0, 0, 24, 24, 10, 0, 0, 0, 0, 0, 0, 8, 80, 0, 0, 0, 32, 0, 255,255,94, 1, 0, 0, 0, 0, 4, 144,4, 0, - 0, 0, 0, 0, 149,85, 88, 0, 0, 0, 0, 0, 64, 33, 10, 0, 0, 0, 0, 0, 209,81, 16, 0, 0, 0, 0, 0, 255,253,127,2, 0, 0, 0, 0, 6, 56, 74, 0, - 0, 0, 0, 0, 64, 5, 16, 1, 0, 0, 0, 0, 20, 33, 4, 0, 0, 0, 0, 0, 21, 65, 4, 1, 0, 0, 0, 0, 5, 4, 4, 2, 0, 0, 0, 0, 1, 32, 12, 1, - 0, 0, 0, 0, 31, 100,36, 2, 0, 0, 0, 0, 8, 10, 0, 2, 0, 0, 0, 0, 17, 193,16, 2, 0, 0, 0, 0, 5, 0, 0, 2, 0, 0, 0, 0, 80, 20, 2, 0, - 16, 0, 0, 0, 255,253,94, 0, 0, 32, 0, 0, 111,49, 14, 0, 0, 0, 0, 0, 96, 1, 0, 0, 0, 0, 0, 0, 40, 40, 14, 0, 0, 160,0, 0, 16, 176,4, 1, - 0, 0, 0, 0, 4, 160,4, 0, 0, 0, 0, 0, 178,0, 18, 1, 0, 0, 0, 0, 5, 1, 2, 0, 0, 0, 0, 0, 181,127,46, 3, 0, 0, 0, 0, 136,16, 2, 0, - 0, 0, 0, 0, 4, 160,6, 0, 0, 0, 0, 0, 48, 16, 32, 0, 0, 0, 0, 0, 128,0, 48, 0, 0, 0, 0, 0, 192,16, 28, 0, 0, 0, 0, 0, 9, 16, 16, 0, - 0, 0, 0, 0, 80, 0, 128,0, 0, 0, 0, 0, 136,48, 8, 2, 0, 0, 0, 0, 154,1, 16, 2, 0, 124,2, 0, 255,255,127,1, 0, 64, 0, 0, 253,191,255,3, - 0, 0, 0, 0, 149,9, 24, 0, 0, 32, 0, 0, 0, 4, 16, 0, 0, 0, 0, 0, 129,105,26, 0, 0, 0, 0, 0, 8, 108,6, 0, 0, 0, 0, 0, 72, 161,2, 0, - 0, 0, 0, 0, 129,1, 20, 0, 0, 0, 0, 0, 221,223,62, 0, 0, 0, 0, 0, 8, 37, 6, 2, 0, 0, 0, 0, 0, 144,6, 2, 0, 0, 0, 0, 9, 44, 14, 2, - 0, 0, 0, 0, 20, 64, 12, 2, 0, 0, 0, 0, 17, 100,16, 1, 0, 0, 0, 0, 25, 32, 29, 0, 0, 0, 0, 0, 10, 32, 6, 0, 0, 0, 0, 0, 84, 42, 14, 3, - 0, 32, 0, 0, 32, 0, 68, 0, 0, 0, 0, 0, 17, 48, 4, 0, 0, 0, 0, 0, 0, 33, 30, 0, 0, 8, 0, 0, 8, 0, 4, 0, 0, 0, 0, 0, 1, 192,4, 0, - 0, 0, 0, 0, 14, 188,30, 0, 0, 0, 0, 0, 16, 73, 18, 0, 0, 0, 0, 0, 22, 40, 34, 0, 0, 0, 0, 0, 0, 112,24, 0, 0, 0, 0, 0, 80, 56, 64, 0, - 0, 0, 0, 0, 210,188,118,3, 0, 0, 0, 0, 131,0, 0, 0, 0, 0, 0, 0, 247,191,110,2, 0, 0, 0, 0, 48, 64, 2, 0, 0, 0, 0, 0, 18, 40, 2, 0, - 0, 0, 0, 0, 48, 32, 164,0, 0, 0, 0, 0, 117,140,46, 3, 0, 0, 0, 0, 96, 16, 2, 0, 0, 0, 0, 0, 0, 57, 18, 0, 0, 0, 0, 0, 16, 152,0, 0, - 0, 0, 0, 0, 20, 4, 52, 0, 0, 0, 0, 0, 48, 72, 114,1, 0, 0, 0, 0, 21, 40, 14, 0, 0, 0, 0, 0, 16, 32, 80, 0, 0, 0, 0, 0, 132,16, 12, 0, - 0, 0, 0, 0, 0, 0, 46, 1, 0, 0, 0, 0, 36, 104,54, 1, 0, 0, 0, 0, 5, 77, 24, 1, 0, 0, 0, 0, 148,36, 0, 0, 0, 0, 0, 0, 95, 125,63, 3, - 0, 0, 0, 0, 200,38, 4, 2, 0, 0, 0, 0, 85, 104,4, 0, 0, 0, 0, 0, 215,93, 29, 3, 0, 0, 0, 0, 0, 41, 22, 0, 0, 0, 0, 0, 4, 12, 4, 1, - 0, 0, 0, 0, 16, 101,4, 1, 0, 0, 0, 0, 12, 128,4, 0, 0, 0, 0, 0, 0, 40, 18, 1, 0, 0, 0, 0, 17, 121,2, 0, 0, 0, 0, 0, 67, 0, 0, 0, - 0, 0, 0, 0, 78, 168,140,0, 0, 0, 0, 0, 137,96, 16, 0, 0, 64, 0, 0, 64, 0, 1, 2, 0, 16, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129,37, 2, 0, - 0, 0, 0, 0, 132,32, 0, 1, 0, 0, 0, 0, 34, 4, 8, 2, 0, 0, 0, 0, 223,255,238,3, 0, 0, 0, 0, 12, 8, 14, 2, 0, 0, 0, 0, 148,21, 8, 0, - 0, 0, 0, 0, 241,1, 8, 0, 0, 32, 0, 0, 2, 8, 10, 0, 0, 0, 0, 0, 16, 129,162,0, 0, 0, 0, 0, 72, 44, 8, 0, 0, 0, 0, 0, 148,1, 0, 2, - 0, 0, 0, 0, 157,95, 56, 2, 0, 0, 0, 0, 0, 32, 7, 3, 0, 0, 0, 0, 4, 0, 9, 0, 0, 0, 0, 0, 66, 32, 12, 3, 0, 0, 0, 0, 17, 12, 4, 2, - 0, 0, 0, 0, 12, 0, 188,2, 0, 0, 0, 0, 144,21, 2, 2, 16, 0, 0, 0, 221,109,28, 2, 0, 0, 0, 0, 2, 32, 10, 0, 0, 0, 0, 0, 68, 0, 0, 2, - 0, 0, 0, 0, 85, 16, 46, 3, 0, 0, 0, 0, 33, 32, 2, 0, 0, 0, 0, 0, 23, 32, 12, 2, 0, 0, 0, 0, 145,97, 22, 0, 0, 32, 0, 0, 8, 8, 6, 0, - 0, 0, 0, 0, 80, 0, 12, 0, 0, 0, 0, 0, 68, 160,4, 0, 0, 0, 0, 0, 1, 42, 6, 0, 0, 0, 0, 0, 68, 32, 4, 2, 0, 0, 0, 0, 145,97, 16, 0, - 0, 0, 0, 0, 16, 32, 14, 0, 0, 0, 0, 0, 97, 8, 12, 2, 0, 0, 0, 0, 65, 33, 8, 0, 0, 0, 0, 0, 68, 8, 0, 2, 0, 0, 0, 0, 0, 8, 26, 1, - 0, 0, 0, 0, 22, 32, 0, 0, 0, 0, 0, 0, 17, 73, 24, 0, 0, 0, 0, 0, 68, 1, 72, 0, 0, 0, 0, 0, 16, 1, 18, 2, 0, 0, 0, 0, 2, 0, 132,0, - 0, 0, 0, 0, 84, 0, 0, 2, 0, 32, 0, 0, 196,48, 4, 0, 0, 0, 0, 0, 149,169,28, 2, 0, 0, 0, 0, 49, 49, 6, 0, 0, 0, 0, 0, 149,64, 30, 0, - 0, 32, 0, 0, 8, 24, 6, 0, 0, 64, 0, 0, 156,173,50, 1, 0, 0, 0, 0, 54, 48, 178,0, 0, 0, 0, 0, 32, 1, 0, 3, 0, 0, 0, 0, 2, 16, 12, 0, - 0, 8, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 154,0, 8, 0, 0, 0, 24, 0, 36, 0, 0, 0, 0, 32, 0, 0, 16, 2, 42, 0, 0, 0, 0, 0, 2, 16, 8, 2, - 0, 96, 0, 0, 66, 37, 160,0, 0, 16, 0, 0, 34, 1, 0, 1, 0, 64, 17, 0, 0, 0, 0, 0, 0, 32, 2, 0, 32, 64, 4, 0, 0, 0, 0, 0, 223,255,174,2, - 0, 0, 0, 0, 110,170,30, 0, 0, 0, 0, 0, 9, 96, 16, 0, 0, 0, 0, 0, 146,64, 18, 0, 0, 0, 0, 0, 149,69, 30, 0, 0, 0, 0, 0, 16, 33, 6, 1, - 0, 32, 0, 0, 16, 1, 36, 1, 0, 0, 0, 0, 21, 96, 0, 1, 0, 64, 0, 0, 145,89, 18, 3, 0, 0, 0, 0, 12, 40, 22, 0, 0, 0, 0, 0, 16, 72, 12, 0, - 0, 32, 0, 0, 84, 16, 12, 0, 0, 0, 0, 0, 203,43, 95, 1, 0, 0, 0, 0, 144,24, 0, 0, 0, 0, 0, 0, 80, 32, 12, 0, 0, 0, 0, 0, 17, 172,14, 0, - 0, 0, 0, 0, 132,96, 12, 2, 0, 0, 0, 0, 49, 129,4, 0, 0, 0, 0, 0, 81, 105,16, 1, 0, 0, 0, 0, 6, 129,0, 0, 0, 0, 0, 0, 1, 2, 0, 1, - 0, 0, 0, 0, 157,127,40, 0, 0, 0, 0, 0, 0, 33, 14, 1, 0, 0, 0, 0, 17, 97, 80, 0, 0, 32, 0, 0, 252,249,47, 0, 0, 0, 0, 0, 2, 192,56, 0, - 0, 0, 0, 0, 2, 32, 48, 0, 0, 0, 0, 0, 24, 65, 56, 0, 0, 0, 0, 0, 25, 1, 14, 0, 0, 0, 0, 0, 236,184,46, 0, 0, 0, 0, 0, 53, 32, 0, 0, - 0, 0, 0, 0, 223,111,30, 3, 0, 0, 0, 0, 64, 8, 12, 1, 0, 0, 0, 0, 81, 8, 14, 1, 0, 0, 0, 0, 53, 96, 8, 0, 0, 0, 0, 0, 0, 8, 130,0, - 0, 32, 0, 0, 17, 192,4, 0, 0, 112,44, 0, 64, 16, 4, 0, 0, 0, 0, 0, 93, 69, 26, 2, 0, 0, 0, 0, 64, 56, 0, 1, 0, 0, 0, 0, 21, 64, 12, 0, - 0, 0, 0, 0, 24, 40, 4, 0, 0, 0, 0, 0, 151,101,124,0, 0, 0, 0, 0, 64, 12, 4, 1, 0, 0, 0, 0, 70, 64, 8, 0, 0, 0, 0, 0, 4, 0, 54, 0, - 0, 0, 0, 0, 145,69, 26, 1, 0, 0, 0, 0, 80, 184,14, 0, 0, 0, 0, 0, 0, 36, 12, 1, 0, 0, 0, 0, 0, 1, 8, 2, 0, 0, 0, 0, 3, 76, 6, 2, - 0, 0, 0, 0, 20, 8, 12, 0, 0, 0, 0, 0, 132,40, 134,0, 0, 0, 0, 0, 4, 37, 6, 0, 0, 0, 0, 0, 29, 224,14, 0, 0, 32, 0, 0, 17, 65, 0, 0, - 0, 4, 0, 0, 21, 33, 16, 2, 0, 0, 0, 0, 132,36, 1, 3, 0, 0, 0, 0, 96, 0, 32, 0, 0, 0, 0, 0, 33, 64, 0, 0, 0, 0, 0, 0, 21, 75, 12, 0, - 0, 0, 0, 0, 141,32, 4, 0, 0, 96, 8, 0, 1, 73, 32, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 36, 0, 0, 0, 0, 0, 40, 0, 64, 0, - 0, 0, 0, 0, 222,255,254,3, 0, 0, 0, 0, 21, 69, 20, 0, 0, 0, 0, 0, 9, 69, 0, 0, 0, 0, 0, 0, 72, 12, 8, 0, 0, 0, 0, 0, 0, 12, 8, 2, - 0, 0, 0, 0, 80, 144,4, 2, 0, 0, 0, 0, 76, 168,174,0, 0, 0, 0, 0, 8, 88, 4, 0, 0, 0, 0, 0, 0, 33, 40, 0, 0, 4, 0, 0, 223,253,60, 3, - 0, 0, 0, 0, 144,81, 4, 0, 0, 0, 0, 0, 40, 0, 32, 0, 0, 0, 0, 0, 19, 17, 22, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 4, 0, 0, 4, 0, 8, 0, - 0, 0, 0, 0, 17, 1, 22, 2, 0, 96, 16, 0, 32, 0, 36, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255,36, 78, 0, 0, 0, 0, 0, 1, 196,180,0, - 0, 0, 0, 0, 20, 64, 8, 0, 0, 0, 0, 0, 72, 48, 2, 0, 0, 224,4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128,16, 8, 0, 0, 0, 0, 0, 215,253,92, 0, - 0, 0, 0, 0, 18, 4, 8, 0, 0, 0, 0, 0, 210,149,13, 0, 0, 0, 0, 0, 145,65, 14, 0, 0, 0, 0, 0, 68, 40, 4, 0, 0, 32, 0, 0, 0, 36, 0, 0, - 0, 0, 0, 0, 8, 0, 22, 0, 0, 0, 4, 0, 0, 16, 2, 0, 0, 0, 0, 0, 19, 65, 4, 1, 0, 0, 0, 0, 10, 33, 8, 2, 0, 64, 0, 0, 24, 0, 16, 0, - 0, 0, 0, 0, 17, 34, 0, 0, 0, 4, 0, 0, 17, 3, 0, 1, 0, 0, 0, 0, 64, 0, 40, 0, 0, 0, 0, 0, 144,108,18, 0, 0, 0, 0, 0, 84, 109,10, 1, - 0, 0, 0, 0, 68, 173,40, 0, 0, 32, 0, 0, 64, 130,0, 0, 0, 0, 0, 0, 195,3, 44, 0, 0, 244,25, 64, 255,255,255,3, 0, 0, 0, 0, 21, 0, 66, 0, - 0, 64, 1, 0, 0, 0, 64, 0, 0, 0, 0, 0, 229,40, 4, 0, 0, 0, 0, 0, 7, 9, 0, 0, 0, 0, 0, 0, 149,76, 9, 1, 0, 0, 0, 0, 1, 64, 28, 0, - 0, 0, 0, 0, 185,125,20, 2, 0, 0, 0, 0, 10, 56, 2, 0, 0, 0, 0, 0, 68, 8, 8, 1, 0, 0, 0, 0, 57, 8, 24, 0, 0, 0, 0, 0, 81, 121,30, 1, - 0, 0, 0, 0, 147,5, 0, 0, 0, 0, 0, 0, 155,233,14, 0, 0, 0, 0, 0, 82, 16, 21, 0, 0, 0, 0, 0, 107,60, 46, 0, 0, 0, 0, 0, 16, 21, 70, 0, - 16, 0, 0, 0, 145,21, 70, 2, 0, 0, 0, 0, 2, 16, 4, 1, 0, 0, 0, 0, 162,56, 22, 1, 0, 0, 0, 0, 16, 65, 0, 2, 0, 0, 0, 0, 128,68, 16, 2, - 0, 0, 0, 0, 147,113,38, 0, 0, 32, 0, 0, 4, 32, 66, 0, 0, 0, 0, 0, 32, 224,16, 0, 0, 0, 0, 0, 80, 48, 14, 3, 0, 0, 0, 0, 76, 32, 0, 2, - 0, 0, 0, 0, 25, 121,92, 0, 0, 96, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 115,247,70, 1, 0, 0, 0, 0, 22, 36, 22, 0, 0, 0, 0, 0, 12, 32, 14, 1, - 0, 0, 0, 0, 49, 0, 8, 0, 0, 0, 0, 0, 4, 224,66, 0, 0, 0, 0, 0, 149,65, 72, 0, 0, 0, 0, 0, 144,114,6, 2, 0, 160,0, 0, 0, 16, 4, 0, - 0, 0, 0, 0, 140,64, 0, 0, 0, 0, 0, 0, 131,209,4, 0, 0, 0, 0, 0, 127,109,46, 3, 0, 0, 0, 0, 23, 72, 4, 0, 0, 0, 0, 0, 2, 16, 6, 0, - 0, 0, 0, 0, 20, 9, 8, 0, 0, 0, 0, 0, 19, 205,0, 0, 0, 160,0, 0, 255,253,78, 3, 0, 0, 0, 0, 145,89, 70, 0, 0, 0, 0, 0, 193,33, 4, 2, - 0, 0, 0, 0, 4, 104,4, 0, 0, 0, 0, 0, 4, 0, 66, 0, 0, 0, 0, 0, 19, 77, 28, 0, 0, 0, 0, 0, 23, 69, 12, 0, 0, 0, 0, 0, 44, 12, 6, 1, - 0, 0, 0, 0, 17, 73, 12, 0, 0, 32, 0, 0, 40, 0, 12, 0, 0, 0, 0, 0, 20, 104,128,0, 0, 0, 0, 0, 133,209,8, 2, 0, 0, 0, 0, 0, 16, 80, 0, - 0, 0, 0, 0, 151,81, 4, 1, 0, 4, 0, 0, 157,253,28, 3, 0, 4, 0, 0, 23, 253,26, 1, 0, 0, 0, 0, 0, 148,2, 0, 0, 0, 0, 0, 20, 60, 24, 0, - 0, 0, 0, 0, 42, 8, 70, 0, 0, 0, 0, 0, 1, 20, 0, 0, 0, 0, 0, 0, 181,44, 94, 2, 0, 0, 0, 0, 128,32, 22, 0, 0, 32, 0, 0, 57, 81, 24, 0, - 0, 32, 0, 0, 246,153,108,1, 0, 32, 0, 0, 128,197,8, 0, 0, 48, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 124,164,76, 0, 0, 0, 0, 0, 17, 145,2, 1, - 0, 0, 0, 0, 104,40, 6, 0, 0, 0, 0, 0, 17, 25, 64, 1, 0, 64, 0, 0, 127,248,76, 0, 0, 32, 1, 0, 135,20, 106,0, 16, 0, 0, 0, 255,191,254,1, - 0, 0, 0, 0, 106,172,46, 0, 0, 0, 0, 0, 0, 0, 134,0, 0, 0, 0, 0, 25, 9, 6, 1, 0, 32, 0, 0, 179,25, 100,0, 0, 4, 0, 0, 214,221,30, 2, - 0, 0, 8, 0, 0, 0, 16, 0, 0, 0, 0, 0, 144,16, 64, 0, 0, 0, 0, 0, 88, 121,68, 0, 0, 0, 0, 0, 0, 28, 2, 0, 0, 32, 0, 0, 8, 0, 68, 0, - 0, 0, 0, 0, 222,189,46, 2, 0, 32, 1, 0, 145,81, 4, 1, 0, 0, 0, 0, 16, 1, 20, 1, 0, 0, 0, 0, 208,121,66, 0, 0, 0, 0, 0, 19, 60, 26, 0, - 0, 0, 0, 0, 144,25, 68, 0, 0, 0, 0, 0, 223,188,78, 2, 0, 0, 0, 0, 18, 16, 8, 0, 0, 0, 0, 0, 145,120,0, 0, 0, 0, 0, 0, 243,29, 14, 2, - 0, 0, 0, 0, 250,181,12, 2, 0, 0, 0, 0, 170,0, 4, 0, 0, 0, 0, 0, 82, 25, 0, 0, 0, 0, 0, 0, 144,52, 0, 2, 0, 0, 0, 0, 47, 188,76, 2, - 0, 112,27, 0, 8, 0, 4, 0, 0, 0, 0, 0, 159,121,20, 0, 0, 0, 0, 0, 2, 128,40, 0, 0, 0, 0, 0, 148,81, 4, 3, 0, 0, 0, 0, 131,144,0, 1, - 0, 0, 0, 0, 221,125,30, 2, 0, 0, 0, 0, 144,13, 0, 0, 0, 0, 0, 0, 17, 73, 14, 3, 0, 0, 0, 0, 2, 45, 0, 0, 0, 0, 0, 0, 16, 28, 8, 0, - 0, 0, 0, 0, 148,8, 64, 2, 0, 96, 0, 0, 122,124,94, 1, 0, 0, 0, 0, 4, 0, 138,0, 0, 96, 0, 0, 144,16, 4, 3, 0, 0, 0, 0, 16, 16, 34, 0, - 0, 32, 0, 0, 30, 108,12, 0, 0, 0, 0, 0, 16, 121,0, 0, 0, 0, 0, 0, 128,25, 4, 0, 0, 32, 0, 0, 247,219,102,0, 0, 0, 0, 0, 10, 8, 64, 0, - 0, 0, 0, 0, 138,0, 2, 0, 0, 0, 0, 0, 226,56, 96, 0, 0, 0, 0, 0, 161,64, 0, 0, 0, 0, 0, 0, 157,220,76, 2, 0, 0, 0, 0, 19, 33, 4, 0, - 0, 0, 0, 0, 48, 40, 0, 0, 0, 0, 0, 0, 251,60, 2, 0, 0, 0, 16, 0, 2, 0, 0, 0, 0, 0, 0, 0, 25, 69, 88, 1, 0, 0, 0, 0, 140,189,14, 2, - 16, 0, 0, 0, 9, 0, 0, 1, 0, 0, 0, 0, 17, 9, 8, 0, 0, 0, 0, 0, 32, 0, 42, 1, 0, 0, 0, 0, 48, 0, 6, 0, 16, 0, 0, 0, 29, 105,92, 1, - 0, 0, 0, 0, 12, 24, 38, 1, 16, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 29, 40, 74, 1, 0, 0, 0, 0, 54, 73, 4, 0, 0, 0, 0, 0, 0, 9, 8, 2, - 0, 0, 0, 0, 159,83, 84, 0, 0, 0, 0, 0, 29, 141,8, 0, 16, 0, 0, 0, 20, 0, 0, 0, 16, 0, 0, 0, 35, 65, 48, 0, 0, 0, 0, 0, 128,0, 12, 2, - 0, 0, 0, 0, 110,184,14, 2, 0, 0, 0, 0, 26, 8, 4, 0, 0, 0, 0, 0, 20, 33, 0, 1, 0, 0, 0, 0, 0, 157,12, 0, 0, 0, 0, 0, 16, 193,64, 0, - 0, 0, 0, 0, 146,252,8, 0, 0, 0, 0, 0, 138,0, 6, 0, 0, 0, 0, 0, 247,125,110,0, 0, 32, 0, 0, 239,249,78, 1, 0, 0, 0, 0, 20, 225,8, 0, - 0, 0, 0, 0, 17, 89, 16, 1, 0, 0, 0, 0, 8, 52, 10, 0, 16, 0, 0, 0, 31, 221,6, 0, 0, 0, 0, 0, 129,16, 2, 0, 0, 0, 0, 0, 128,32, 4, 1, - 0, 0, 0, 0, 0, 216,4, 0, 0, 0, 0, 0, 48, 9, 8, 0, 16, 0, 0, 0, 27, 48, 12, 1, 0, 0, 0, 0, 17, 128,4, 0, 16, 0, 0, 0, 16, 64, 0, 0, - 0, 0, 0, 0, 127,255,254,2, 0, 0, 0, 0, 16, 25, 14, 0, 0, 0, 0, 0, 177,29, 84, 0, 0, 0, 0, 0, 8, 56, 14, 1, 0, 0, 0, 0, 219,123,10, 0, - 0, 0, 0, 0, 16, 128,64, 0, 0, 0, 0, 0, 66, 120,70, 0, 0, 0, 0, 0, 207,56, 78, 0, 0, 0, 0, 0, 16, 16, 2, 1, 0, 0, 0, 0, 128,1, 68, 0, - 0, 0, 0, 0, 73, 69, 16, 0, 0, 0, 0, 0, 147,4, 4, 0, 0, 0, 0, 0, 24, 16, 20, 2, 0, 0, 0, 0, 20, 80, 8, 0, 0, 0, 0, 0, 18, 56, 12, 0, - 0, 0, 0, 0, 128,56, 2, 0, 0, 0, 0, 0, 2, 65, 0, 2, 0, 0, 0, 0, 251,57, 78, 0, 0, 0, 0, 0, 144,73, 12, 0, 0, 0, 0, 0, 0, 184,12, 0, - 0, 0, 0, 0, 255,61, 30, 1, 0, 0, 0, 0, 128,65, 16, 2, 0, 32, 0, 0, 183,121,78, 0, 0, 32, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 2, 49, 6, 1, - 0, 0, 0, 0, 6, 48, 6, 1, 0, 4, 0, 0, 247,245,70, 1, 0, 0, 0, 0, 26, 49, 2, 0, 0, 0, 0, 0, 120,48, 14, 1, 0, 0, 0, 0, 147,0, 4, 0, - 0, 32, 0, 0, 119,56, 44, 0, 0, 32, 0, 0, 0, 48, 2, 0, 0, 240,29, 0, 1, 83, 4, 0, 0, 32, 0, 0, 18, 192,40, 0, 0, 0, 0, 0, 152,40, 8, 0, - 0, 0, 0, 0, 14, 32, 80, 0, 0, 48, 0, 0, 2, 0, 4, 0, 0, 32, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 114,67, 6, 2, 0, 0, 0, 0, 16, 73, 22, 0, - 0, 168,0, 0, 255,109,206,2, 0, 16, 0, 0, 179,219,94, 1, 0, 0, 0, 0, 8, 8, 134,0, 0, 0, 0, 0, 0, 48, 96, 0, 0, 96, 32, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 132,192,88, 0, 0, 0, 0, 0, 194,29, 14, 0, 0, 0, 0, 0, 191,121,14, 2, 0, 0, 0, 0, 8, 33, 10, 0, 0, 32, 0, 0, 0, 128,8, 0, - 0, 0, 0, 0, 53, 36, 0, 0, 0, 0, 0, 0, 48, 73, 4, 1, 0, 0, 0, 0, 2, 146,4, 0, 0, 0, 0, 0, 2, 144,6, 1, 0, 0, 0, 0, 66, 48, 74, 1, - 0, 0, 0, 0, 52, 164,0, 0, 0, 0, 0, 0, 180,92, 8, 0, 0, 224,36, 0, 16, 64, 4, 0, 0, 0, 0, 0, 144,74, 2, 2, 0, 112,32, 0, 242,25, 14, 0, - 0, 48, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 193,2, 0, 0, 0, 0, 0, 125,69, 14, 1, 0, 0, 0, 0, 10, 56, 12, 0, 0, 0, 0, 0, 129,2, 0, 2, - 0, 0, 0, 0, 158,253,76, 2, 0, 0, 0, 0, 205,56, 6, 0, 0, 0, 0, 0, 51, 81, 24, 1, 0, 0, 0, 0, 183,125,126,2, 0, 32, 0, 0, 21, 1, 0, 1, - 0, 0, 0, 0, 185,105,6, 1, 0, 0, 0, 0, 16, 48, 2, 1, 0, 0, 0, 0, 210,125,70, 1, 0, 0, 0, 0, 8, 44, 2, 0, 0, 0, 0, 0, 1, 4, 64, 2, - 0, 32, 0, 0, 0, 1, 6, 0, 0, 0, 0, 0, 44, 32, 0, 2, 0, 0, 0, 0, 1, 0, 0, 3, 0, 80, 0, 0, 21, 1, 0, 0, 0, 0, 0, 0, 19, 85, 16, 1, - 0, 0, 0, 0, 5, 8, 0, 0, 0, 0, 0, 0, 251,255,126,3, 0, 0, 0, 0, 2, 1, 20, 0, 0, 0, 0, 0, 17, 65, 4, 2, 0, 0, 0, 0, 160,136,14, 0, - 0, 0, 0, 0, 32, 4, 0, 2, 0, 0, 0, 0, 120,0, 70, 0, 0, 0, 0, 0, 29, 33, 8, 0, 0, 0, 0, 0, 21, 68, 0, 1, 0, 0, 0, 0, 255,253,44, 2, - 0, 240,36, 0, 121,217,6, 0, 0, 0, 0, 0, 40, 16, 68, 0, 0, 0, 0, 0, 24, 12, 8, 0, 0, 0, 0, 0, 144,18, 0, 2, 0, 0, 0, 0, 12, 48, 0, 0, - 0, 32, 0, 0, 128,9, 4, 0, 16, 0, 0, 0, 72, 36, 12, 0, 0, 32, 0, 0, 50, 9, 68, 0, 0, 0, 0, 0, 254,253,76, 2, 0, 32, 0, 0, 255,157,102,1, - 0, 0, 0, 0, 0, 24, 32, 0, 0, 0, 0, 0, 32, 80, 64, 0, 0, 0, 0, 0, 130,81, 8, 1, 0, 0, 0, 0, 16, 0, 72, 0, 0, 0, 0, 0, 191,152,126,1, - 0, 0, 0, 0, 0, 48, 34, 1, 0, 0, 0, 0, 62, 124,14, 0, 0, 0, 0, 0, 16, 137,20, 2, 0, 0, 0, 0, 251,217,20, 0, 0, 0, 0, 0, 130,0, 2, 0, - 0, 32, 0, 0, 16, 16, 12, 0, 0, 0, 0, 0, 128,192,24, 0, 0, 0, 0, 0, 25, 65, 0, 0, 0, 32, 0, 0, 4, 40, 100,0, 0, 0, 0, 0, 145,9, 92, 1, - 0, 128,0, 0, 17, 1, 0, 1, 0, 0, 0, 0, 176,8, 8, 0, 0, 0, 0, 0, 48, 129,4, 0, 0, 0, 0, 0, 128,89, 0, 2, 0, 0, 0, 0, 17, 9, 64, 1, - 0, 0, 0, 0, 128,21, 0, 0, 16, 0, 0, 0, 1, 32, 4, 0, 0, 32, 0, 0, 16, 12, 4, 0, 0, 64, 0, 0, 161,65, 36, 0, 0, 0, 0, 0, 21, 65, 144,3, - 0, 0, 0, 0, 68, 169,140,1, 0, 0, 0, 0, 29, 36, 140,1, 0, 0, 4, 0, 16, 8, 0, 0, 0, 0, 0, 0, 192,8, 0, 0, 0, 0, 0, 0, 16, 80, 32, 0, - 0, 32, 2, 0, 8, 0, 4, 0, 0, 0, 0, 0, 2, 64, 68, 0, 0, 0, 0, 0, 144,1, 12, 0, 0, 40, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 22, 32, 24, 0, - 0, 0, 0, 0, 56, 8, 68, 0, 0, 0, 0, 0, 10, 192,128,0, 0, 32, 0, 0, 20, 0, 1, 2, 0, 0, 0, 0, 5, 209,4, 0, 0, 0, 33, 0, 158,239,142,3, - 0, 0, 0, 0, 96, 1, 4, 0, 0, 0, 0, 0, 72, 32, 4, 0, 0, 0, 0, 0, 72, 24, 28, 2, 0, 0, 0, 0, 133,0, 12, 0, 0, 0, 0, 0, 184,67, 66, 0, - 0, 160,0, 0, 32, 64, 192,0, 0, 32, 8, 0, 0, 0, 64, 0, 0, 0, 0, 0, 95, 124,46, 2, 0, 0, 0, 0, 16, 104,2, 0, 0, 0, 0, 0, 27, 101,8, 1, - 0, 244,11, 0, 183,251,255,3, 0, 64, 0, 0, 0, 0, 128,1, 0, 0, 0, 0, 4, 61, 32, 1, 0, 128,0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 128,104,130,0, - 0, 0, 0, 0, 68, 176,0, 0, 0, 0, 0, 0, 16, 65, 128,0, 0, 0, 0, 0, 129,1, 1, 0, 16, 0, 0, 0, 5, 121,34, 2, 0, 0, 0, 0, 128,112,0, 0, - 0, 0, 0, 0, 66, 0, 0, 3, 0, 0, 0, 0, 0, 144,64, 1, 0, 0, 0, 0, 192,3, 0, 1, 0, 0, 0, 0, 0, 1, 160,0, 0, 0, 0, 0, 17, 136,0, 0, - 0, 0, 0, 0, 20, 8, 2, 0, 0, 64, 0, 0, 0, 0, 1, 2, 0, 160,0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 148,4, 50, 0, 0, 0, 1, 0, 17, 0, 0, 0, - 0, 0, 0, 0, 53, 0, 128,3, 0, 32, 44, 0, 0, 147,228,3, 0, 0, 0, 0, 128,72, 8, 2, 16, 0, 33, 0, 255,255,255,3, 0, 0, 0, 0, 209,20, 20, 0, - 0, 0, 0, 0, 129,4, 2, 0, 0, 0, 0, 0, 133,68, 16, 0, 0, 0, 0, 0, 16, 72, 64, 0, 0, 0, 0, 0, 25, 69, 0, 0, 0, 0, 0, 0, 64, 12, 0, 1, - 0, 0, 0, 0, 49, 0, 24, 0, 0, 0, 0, 0, 9, 105,74, 1, 0, 0, 0, 0, 17, 93, 20, 0, 0, 0, 0, 0, 10, 24, 12, 2, 0, 0, 0, 0, 131,245,20, 0, - 0, 0, 0, 0, 200,116,28, 2, 16, 0, 0, 0, 93, 101,28, 0, 0, 0, 0, 0, 68, 49, 0, 0, 0, 0, 0, 0, 0, 4, 12, 3, 0, 0, 0, 0, 2, 64, 8, 2, - 0, 0, 0, 0, 0, 36, 14, 0, 0, 240,41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 16, 68, 0, 0, 0, 0, 0, 1, 1, 2, 2, 16, 0, 0, 0, 75, 125,66, 2, - 0, 0, 0, 0, 27, 24, 4, 0, 0, 0, 0, 0, 145,53, 28, 0, 0, 0, 0, 0, 136,101,14, 0, 0, 0, 0, 0, 1, 97, 16, 0, 0, 0, 0, 0, 16, 164,4, 0, - 0, 0, 0, 0, 9, 65, 0, 2, 0, 0, 0, 0, 34, 2, 2, 0, 0, 0, 0, 0, 202,52, 14, 0, 0, 32, 0, 0, 130,16, 6, 0, 0, 68, 0, 0, 82, 105,76, 1, - 0, 0, 0, 0, 16, 80, 12, 0, 0, 0, 0, 0, 196,4, 0, 0, 0, 0, 0, 0, 128,40, 4, 0, 0, 0, 0, 0, 155,169,58, 0, 0, 224,26, 0, 164,7, 12, 0, - 0, 0, 0, 0, 76, 97, 12, 2, 0, 0, 0, 0, 128,56, 96, 0, 0, 0, 0, 0, 218,93, 14, 0, 16, 40, 32, 0, 144,149,28, 1, 0, 0, 0, 0, 0, 17, 12, 2, - 0, 0, 0, 0, 221,40, 128,2, 0, 0, 0, 0, 160,0, 8, 2, 0, 32, 0, 0, 0, 0, 32, 1, 0, 4, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 32, 0, 10, 0, - 0, 0, 0, 0, 96, 40, 0, 0, 0, 0, 0, 0, 93, 188,204,2, 0, 0, 0, 0, 137,0, 16, 0, 0, 0, 0, 0, 2, 2, 20, 0, 0, 64, 0, 0, 0, 4, 0, 0, - 0, 0, 0, 0, 223,255,255,3, 0, 0, 0, 0, 0, 4, 36, 0, 0, 0, 0, 0, 128,69, 18, 0, 0, 32, 4, 0, 8, 0, 0, 0, 0, 0, 0, 0, 145,1, 16, 1, - 0, 0, 0, 0, 128,1, 12, 3, 0, 0, 0, 0, 93, 101,12, 0, 0, 0, 0, 0, 8, 84, 0, 3, 0, 0, 0, 0, 16, 8, 20, 2, 0, 0, 0, 0, 128,160,0, 0, - 0, 0, 0, 0, 95, 101,24, 0, 0, 0, 0, 0, 16, 17, 44, 0, 0, 0, 0, 0, 144,4, 28, 0, 0, 32, 0, 0, 153,116,8, 3, 16, 0, 0, 0, 89, 252,126,2, - 0, 0, 0, 0, 145,33, 0, 0, 0, 0, 0, 0, 85, 5, 12, 0, 0, 32, 0, 0, 154,92, 7, 0, 0, 0, 0, 0, 17, 5, 28, 0, 0, 32, 0, 0, 72, 16, 16, 0, - 0, 0, 16, 0, 1, 3, 2, 0, 0, 0, 0, 0, 83, 9, 13, 0, 0, 32, 0, 0, 12, 160,26, 1, 0, 0, 0, 0, 223,255,110,3, 0, 0, 0, 0, 133,4, 0, 0, - 0, 0, 0, 0, 128,32, 8, 2, 0, 0, 0, 0, 93, 45, 24, 0, 16, 0, 0, 0, 17, 129,0, 0, 0, 0, 0, 0, 21, 85, 8, 1, 0, 0, 0, 0, 149,69, 24, 0, - 0, 0, 2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 17, 0, 1, 0, 0, 168,0, 0, 223,255,255,3, 0, 96, 0, 0, 0, 0, 128,2, 0, 0, 4, 0, 0, 0, 0, 2, - 0, 0, 8, 0, 0, 0, 0, 2, 0, 0, 0, 0, 19, 77, 2, 0, 0, 0, 0, 0, 0, 40, 66, 1, 0, 0, 0, 0, 149,4, 0, 2, 0, 0, 0, 0, 17, 16, 10, 0, - 0, 0, 0, 0, 25, 97, 2, 0, 0, 0, 0, 0, 0, 4, 66, 0, 0, 0, 0, 0, 64, 0, 8, 2, 0, 0, 0, 0, 161,1, 0, 0, 0, 0, 0, 0, 145,72, 22, 0, - 0, 0, 0, 0, 12, 48, 10, 0, 0, 0, 0, 0, 14, 32, 14, 0, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 0, 0, 145,69, 18, 1, 0, 0, 0, 0, 89, 93, 88, 0, - 0, 0, 0, 0, 0, 16, 2, 2, 0, 0, 0, 0, 125,111,28, 3, 0, 0, 0, 0, 16, 0, 42, 0, 0, 0, 0, 0, 209,8, 0, 0, 0, 64, 0, 0, 177,193,18, 0, - 0, 32, 0, 0, 0, 8, 32, 0, 1, 32, 0, 0, 0, 0, 193,0, 0, 96, 0, 0, 0, 0, 128,0, 0, 128,0, 0, 0, 0, 65, 0, 0, 0, 1, 0, 0, 0, 64, 0, - 0, 0, 0, 0, 29, 109,27, 3, 0, 0, 0, 0, 192,32, 8, 2, 0, 0, 0, 0, 2, 60, 8, 0, 0, 0, 0, 0, 1, 132,142,0, 0, 0, 0, 0, 1, 68, 16, 0, - 0, 0, 0, 0, 71, 32, 4, 0, 0, 0, 0, 0, 12, 8, 12, 0, 0, 0, 0, 0, 140,0, 4, 0, 0, 0, 0, 0, 25, 33, 0, 0, 0, 0, 0, 0, 80, 36, 0, 0, - 0, 0, 0, 0, 112,0, 128,0, 0, 0, 0, 0, 17, 64, 18, 2, 16, 0, 0, 0, 255,253,191,3, 0, 0, 0, 0, 64, 40, 34, 0, 0, 160,0, 0, 36, 0, 4, 0, - 0, 0, 0, 0, 66, 60, 4, 0, 0, 0, 0, 0, 24, 128,0, 0, 0, 0, 0, 0, 88, 56, 12, 0, 0, 0, 0, 0, 64, 8, 20, 2, 0, 0, 0, 0, 25, 127,8, 0, - 0, 0, 0, 0, 8, 0, 4, 3, 0, 0, 0, 0, 12, 36, 0, 2, 0, 0, 0, 0, 1, 4, 4, 1, 0, 0, 0, 0, 51, 207,16, 0, 0, 0, 0, 0, 91, 101,12, 2, - 0, 64, 0, 0, 128,0, 0, 0, 0, 0, 0, 0, 80, 32, 6, 2, 0, 0, 0, 0, 176,132,0, 0, 0, 0, 0, 0, 199,213,58, 2, 0, 48, 0, 0, 148,17, 12, 0, - 0, 0, 0, 0, 5, 0, 8, 1, 0, 0, 0, 0, 17, 73, 12, 2, 0, 0, 0, 0, 25, 67, 48, 1, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 64, 2, 0, 1, - 0, 64, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 64, 136,32, 0, 0, 0, 0, 0, 192,0, 4, 2, 0, 0, 0, 0, 193,101,0, 2, 0, 0, 0, 0, 255,252,46, 3, - 0, 0, 0, 0, 8, 4, 18, 0, 0, 0, 0, 0, 206,60, 14, 0, 0, 0, 0, 0, 48, 72, 0, 0, 0, 0, 0, 0, 19, 4, 4, 0, 0, 0, 0, 0, 24, 36, 0, 0, - 0, 0, 0, 0, 20, 20, 0, 0, 0, 0, 0, 0, 65, 89, 0, 2, 0, 0, 0, 0, 0, 9, 16, 1, 0, 0, 0, 0, 29, 109,0, 0, 0, 0, 0, 0, 125,101,12, 2, - 0, 0, 0, 0, 81, 72, 0, 0, 0, 32, 0, 0, 45, 140,6, 2, 0, 0, 0, 0, 7, 5, 0, 0, 0, 0, 0, 0, 145,64, 12, 2, 0, 0, 0, 0, 16, 88, 0, 0, - 0, 0, 0, 0, 17, 193,144,0, 0, 0, 0, 0, 255,121,31, 3, 0, 0, 0, 0, 10, 8, 8, 1, 0, 0, 0, 0, 66, 72, 16, 0, 0, 0, 0, 0, 25, 121,24, 0, - 0, 0, 0, 0, 17, 113,0, 0, 0, 0, 0, 0, 18, 64, 16, 0, 0, 0, 0, 0, 89, 5, 8, 0, 0, 0, 0, 0, 16, 188,142,0, 0, 0, 0, 0, 95, 117,10, 2, - 0, 0, 0, 0, 5, 28, 10, 0, 0, 0, 0, 0, 33, 0, 128,0, 0, 0, 0, 0, 17, 3, 128,0, 0, 0, 0, 0, 53, 81, 128,0, 0, 0, 1, 0, 4, 0, 130,0, - 0, 0, 2, 0, 0, 0, 128,0, 0, 0, 0, 0, 17, 5, 2, 0, 0, 0, 0, 0, 1, 36, 0, 2, 0, 0, 0, 0, 132,12, 0, 0, 0, 0, 0, 0, 128,8, 6, 0, - 0, 0, 0, 0, 32, 0, 70, 0, 0, 0, 0, 0, 49, 29, 24, 0, 0, 0, 0, 0, 3, 208,68, 0, 0, 0, 0, 0, 24, 69, 0, 0, 0, 0, 0, 0, 149,117,0, 0, - 0, 0, 0, 0, 50, 64, 0, 0, 0, 0, 4, 0, 17, 65, 8, 0, 0, 0, 0, 0, 196,32, 2, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 0, 0, 0, 114,0, 0, 0, - 0, 0, 0, 0, 85, 40, 0, 0, 0, 0, 0, 0, 34, 32, 0, 0, 0, 32, 16, 0, 69, 0, 0, 0, 0, 160,0, 0, 13, 0, 33, 0, 0, 0, 1, 0, 0, 0, 1, 2, - 0, 32, 1, 0, 35, 0, 33, 0, 0, 160,0, 0, 0, 16, 0, 0, 0, 36, 0, 0, 1, 16, 0, 2, 0, 0, 0, 0, 78, 58, 70, 0, 0, 32, 20, 0, 1, 0, 138,2, - 0, 32, 8, 0, 0, 0, 136,2, 0, 32, 0, 0, 0, 0, 128,2 + 251,244,63, 152,255,255,255,7, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 64, 0, 0, 0, 0, 128,0, + 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 128,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 8, 0, 0, 0, 16, 0, 0, 0, + 0, 0, 0, 0, 0, 128,0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + 16, 128,63, 0, 255,255,127,1, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 128,0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 56, 2, 0, + 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 16, 0, 2, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 8, 0, 8, 0, 0, 0, 0, 0, 17, 0, 8, 0, 0, 0, 0, 0, 17, 73, 18, 0, + 0, 0, 0, 0, 14, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 1, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 1, 0, 16, 0, 0, 0, 0, 0, 129,73, 0, 0, + 0, 0, 0, 0, 16, 16, 0, 0, 0, 0, 0, 0, 17, 64, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 1, 48, 0, 0, 0, 0, 0, 0, 1, 65, 18, 0, + 0, 0, 0, 0, 0, 16, 8, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 16, 0, 4, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 16, 64, 0, 0, + 0, 0, 0, 0, 16, 65, 2, 0, 0, 0, 0, 0, 0, 32, 8, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 8, 72, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, + 0, 0, 0, 0, 17, 65, 16, 0, 0, 0, 0, 0, 0, 128,34, 0, 0, 0, 0, 0, 1, 0, 2, 1, 0, 0, 0, 0, 64, 0, 4, 0, 0, 0, 0, 0, 0, 24, 88, 0, + 0, 0, 0, 0, 1, 64, 16, 0, 0, 0, 0, 0, 16, 1, 0, 0, 0, 0, 0, 0, 17, 73, 0, 0, 0, 0, 0, 0, 8, 32, 4, 0, 0, 0, 0, 0, 32, 0, 8, 0, + 0, 0, 0, 0, 96, 4, 40, 0, 0, 0, 0, 0, 4, 96, 102,0, 0, 0, 0, 0, 1, 65, 16, 0, 0, 0, 0, 0, 64, 36, 4, 0, 0, 0, 0, 0, 8, 0, 14, 0, + 0, 0, 0, 0, 25, 64, 0, 0, 0, 0, 0, 0, 0, 1, 16, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 32, 74, 0, 0, 0, 0, 0, 32, 168,58, 0, + 0, 0, 0, 0, 8, 0, 0, 1, 0, 0, 0, 0, 16, 8, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 16, 72, 18, 0, 0, 0, 0, 0, 1, 64, 0, 0, + 0, 0, 0, 0, 0, 136,68, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 16, 65, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 4, 0, 16, 1, + 0, 0, 0, 0, 149,209,24, 0, 0, 0, 0, 0, 4, 8, 0, 0, 0, 0, 0, 0, 0, 64, 2, 0, 0, 0, 0, 0, 0, 40, 2, 0, 0, 0, 0, 0, 36, 48, 16, 0, + 0, 0, 0, 0, 0, 32, 10, 0, 0, 0, 0, 0, 145,65, 66, 0, 0, 0, 0, 0, 17, 1, 2, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 6, 0, + 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 192,0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 145,65, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, + 0, 0, 0, 0, 0, 8, 4, 0, 0, 0, 0, 0, 17, 65, 0, 1, 0, 0, 0, 0, 0, 32, 2, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 8, 8, 0, 0, + 0, 0, 0, 0, 0, 16, 2, 0, 64, 0, 0, 0, 0, 0, 8, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 0, 1, 0, 0, 1, 0, 133,36, 8, 0, + 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 8, 2, 0, 0, 0, 0, 0, 0, 128,1, 0, 244,63, 0, 12, 200,86, 0, + 0, 4, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 112,63, 0, 0, 0, 4, 0, 0, 240,62, 0, 0, 0, 0, 0, 0, 48, 40, 0, 1, 0, 0, 0, + 0, 112,62, 0, 1, 0, 8, 0, 0, 48, 8, 0, 1, 0, 1, 2, 0, 48, 8, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 8, 64, 0, 0, + 0, 0, 32, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, 0, 0, 176,32, 0, 0, 0, 0, 0, 0, 128,0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, + 0, 80, 8, 0, 2, 2, 0, 0, 0, 16, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 16, 16, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, + 0, 240,49, 0, 0, 0, 8, 0, 0, 224,61, 0, 0, 0, 0, 0, 0, 96, 16, 0, 8, 0, 0, 0, 0, 48, 62, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, + 0, 240,63, 0, 0, 0, 0, 0, 0, 240,35, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, + 0, 0, 40, 0, 0, 0, 0, 0, 0, 160,0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 128,16, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, + 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 0, 0, 0, 0, 80, 16, 0, 0, 0, 0, 0, 0, 144,0, 0, 0, 0, 0, 0, 0, 48, 19, 0, 0, 0, 0, 0, + 0, 224,63, 0, 0, 0, 0, 0, 0, 32, 2, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 160,36, 0, 0, 0, 0, 0, 0, 144,59, 0, 0, 0, 0, 0, + 0, 112,63, 0, 0, 0, 0, 0, 0, 192,63, 0, 0, 0, 0, 0, 0, 208,30, 0, 0, 0, 0, 0, 0, 96, 13, 0, 0, 0, 0, 0, 0, 208,63, 0, 0, 0, 0, 0, + 0, 32, 54, 0, 0, 0, 0, 0, 0, 240,61, 0, 0, 0, 0, 0, 0, 144,13, 0, 0, 0, 0, 0, 0, 160,14, 0, 0, 0, 0, 0, 0, 176,47, 0, 0, 0, 0, 0, + 0, 16, 1, 0, 0, 0, 0, 0, 0, 128,44, 0, 0, 0, 0, 0, 0, 160,63, 0, 0, 0, 0, 0, 0, 128,17, 0, 0, 0, 0, 0, 0, 32, 16, 0, 0, 0, 0, 0, + 0, 208,48, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 64, 0, 0, 1, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, + 0, 240,0, 0, 0, 0, 0, 0, 0, 48, 16, 0, 0, 0, 0, 0, 0, 64, 2, 0, 0, 0, 0, 0, 0, 16, 57, 0, 0, 0, 0, 0, 0, 48, 22, 0, 0, 0, 0, 0, + 0, 128,18, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 8, 0, 0, 32, 24, 0, 0, 128,0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 32, 0, 0, 4, 0, 0, 0, 0, 32, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 32, 0, 2, 0, 255,63, 0, 255,255,255,3, 0, 0, 2, 0, 24, 0, 0, 0, + 0, 32, 0, 0, 0, 4, 4, 0, 0, 240,127,0, 13, 145,12, 0, 0, 240,63, 0, 0, 16, 12, 1, 0, 16, 0, 0, 0, 16, 8, 0, 0, 48, 0, 0, 0, 0, 4, 0, + 0, 240,8, 0, 0, 0, 4, 0, 0, 224,34, 0, 0, 0, 0, 0, 0, 16, 32, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, + 0, 208,33, 0, 0, 32, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 32, 0, 0, 0, 0, 2, 0, 0, 128,0, 0, 0, 0, 8, 0, + 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 1, 0, 0, 0, 0, 16, 16, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 129,0, 0, 0, 0, 0, 0, 0, 0, 12, 0, + 0, 0, 0, 0, 1, 128,0, 0, 0, 240,63, 0, 7, 134,9, 0, 0, 112,23, 0, 0, 16, 12, 0, 0, 240,10, 0, 1, 8, 13, 2, 0, 96, 33, 0, 1, 0, 1, 0, + 0, 96, 0, 0, 1, 0, 1, 2, 0, 96, 0, 0, 1, 0, 65, 2, 0, 32, 16, 0, 1, 0, 1, 0, 0, 32, 0, 0, 1, 0, 0, 0, 0, 128,32, 0, 0, 0, 0, 0, + 0, 128,0, 0, 1, 0, 1, 0, 0, 16, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 64, 16, 0, 0, 224,3, 0, 0, 0, 8, 0, 0, 160,0, 0, 0, 0, 1, 0, + 0, 48, 3, 0, 1, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 128,1, 0, 0, 0, 8, 0, 0, 96, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 8, 0, + 0, 32, 12, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 8, 0, 0, 32, 32, 0, 0, 0, 0, 0, 0, 64, 32, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, + 0, 0, 16, 0, 1, 0, 8, 0, 0, 32, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 16, 0, 0, 0, 240,63, 0, 17, 153,13, 0, 0, 224,7, 0, 8, 16, 8, 0, + 0, 0, 10, 0, 0, 0, 0, 0, 0, 240,3, 0, 16, 0, 4, 0, 0, 160,0, 0, 1, 0, 1, 0, 0, 64, 32, 0, 0, 0, 0, 0, 0, 160,0, 0, 1, 0, 1, 2, + 0, 32, 1, 0, 0, 0, 0, 0, 0, 160,3, 0, 0, 32, 0, 0, 0, 128,1, 0, 0, 0, 0, 0, 0, 242,63, 0, 187,158,239,2, 0, 48, 32, 0, 0, 0, 0, 0, + 0, 176,9, 0, 49, 0, 69, 2, 0, 0, 0, 0, 0, 0, 65, 0, 0, 160,2, 0, 0, 0, 0, 0, 0, 224,0, 0, 0, 0, 0, 0, 0, 192,1, 0, 0, 0, 0, 0, + 0, 16, 8, 0, 0, 0, 0, 0, 0, 192,5, 0, 0, 0, 0, 0, 0, 48, 3, 0, 9, 9, 69, 2, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 1, 0, 65, 0, + 0, 240,63, 0, 1, 4, 3, 2, 0, 64, 1, 0, 0, 0, 0, 0, 0, 128,3, 0, 0, 0, 0, 0, 4, 112,63, 0, 127,63, 239,2, 0, 128,0, 0, 0, 1, 0, 0, + 0, 240,62, 4, 255,255,239,3, 0, 112,56, 0, 11, 30, 127,2, 0, 112,48, 0, 13, 25, 69, 2, 64, 116,48, 0, 127,255,239,3, 0, 16, 32, 0, 9, 216,69, 2, + 0, 0, 0, 0, 1, 0, 64, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 128,2, 0, 0, 8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 8, 0, + 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 40, 0, 1, 0, 1, 2, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 28, 0, 0, 0, 0, 0, + 0, 16, 28, 0, 0, 0, 0, 0, 0, 160,1, 0, 3, 8, 4, 0, 0, 0, 0, 0, 4, 0, 32, 0, 0, 32, 0, 0, 8, 0, 0, 0, 0, 128,0, 0, 2, 64, 0, 0, + 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 16, 16, 0, + 0, 0, 0, 0, 0, 0, 132,0, 0, 160,0, 0, 1, 0, 65, 0, 0, 32, 0, 0, 0, 0, 64, 0, 0, 32, 0, 0, 0, 0, 1, 0, 0, 32, 0, 0, 17, 0, 0, 0, + 0, 160,1, 0, 1, 0, 3, 0, 0, 0, 0, 0, 24, 0, 2, 0, 0, 0, 0, 0, 0, 1, 32, 0, 0, 32, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 16, 0, 64, 0, + 0, 0, 0, 0, 0, 1, 0, 2, 0, 144,18, 0, 4, 0, 8, 0, 0, 128,12, 0, 0, 0, 0, 0, 0, 80, 23, 0, 4, 0, 72, 0, 0, 32, 24, 0, 0, 0, 0, 0, + 0, 16, 0, 0, 0, 0, 8, 0, 0, 64, 2, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 16, 8, 0, 0, 0, 16, 0, 0, 0, 8, 0, 0, 0, 0, 0, 1, 24, 0, 0, + 0, 128,0, 0, 0, 0, 64, 0, 0, 160,0, 0, 17, 0, 0, 0, 0, 240,63, 0, 0, 0, 8, 0, 0, 192,5, 0, 128,2, 12, 0, 0, 192,3, 0, 0, 0, 4, 0, + 0, 32, 4, 0, 0, 0, 0, 0, 0, 128,7, 0, 32, 32, 0, 0, 0, 128,6, 0, 0, 0, 0, 0, 0, 96, 0, 0, 1, 0, 2, 0, 0, 64, 4, 0, 0, 4, 8, 0, + 0, 64, 18, 0, 1, 0, 1, 0, 0, 96, 14, 0, 0, 0, 8, 0, 0, 96, 52, 0, 0, 0, 0, 0, 0, 64, 8, 0, 0, 0, 0, 0, 0, 114,58, 0, 1, 0, 0, 0, + 0, 64, 36, 0, 0, 0, 8, 0, 0, 32, 32, 0, 0, 0, 8, 0, 0, 240,63, 0, 0, 0, 60, 0, 0, 192,14, 0, 0, 0, 8, 0, 0, 32, 7, 0, 0, 0, 4, 0, + 0, 0, 18, 0, 0, 32, 0, 0, 0, 176,0, 0, 0, 0, 2, 0, 0, 16, 0, 0, 0, 0, 4, 0, 0, 16, 1, 0, 0, 0, 8, 0, 0, 192,4, 0, 0, 0, 8, 0, + 0, 128,8, 0, 0, 0, 0, 0, 0, 240,58, 0, 0, 0, 8, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 144,32, 0, 0, 0, 0, 0, 0, 128,2, 0, 0, 0, 0, 0, + 0, 32, 16, 0, 0, 0, 4, 0, 0, 192,2, 0, 0, 0, 8, 0, 0, 240,63, 0, 8, 0, 12, 0, 0, 112,10, 0, 0, 16, 8, 0, 0, 0, 0, 0, 0, 16, 4, 0, + 0, 80, 6, 0, 0, 32, 4, 0, 0, 16, 2, 0, 64, 32, 0, 0, 0, 240,13, 0, 0, 0, 2, 0, 0, 80, 0, 0, 0, 0, 24, 0, 0, 16, 3, 0, 0, 16, 8, 0, + 0, 144,32, 0, 0, 0, 8, 0, 0, 240,61, 0, 0, 0, 8, 0, 0, 16, 8, 0, 0, 0, 4, 0, 0, 112,19, 0, 1, 0, 1, 0, 0, 112,51, 0, 1, 0, 1, 2, + 0, 32, 3, 0, 0, 0, 0, 0, 0, 240,63, 0, 32, 16, 8, 0, 0, 16, 2, 0, 0, 0, 8, 0, 0, 64, 8, 0, 0, 0, 4, 0, 0, 16, 2, 0, 0, 32, 0, 0, + 0, 16, 0, 0, 0, 0, 2, 0, 0, 144,8, 0, 0, 0, 8, 0, 0, 16, 4, 0, 0, 0, 8, 0, 0, 16, 32, 0, 0, 0, 8, 0, 0, 48, 46, 0, 0, 0, 8, 0, + 0, 32, 0, 0, 9, 0, 0, 0, 0, 64, 24, 0, 0, 0, 4, 0, 0, 48, 22, 0, 0, 32, 0, 0, 0, 48, 12, 0, 0, 0, 8, 0, 0, 144,0, 0, 0, 0, 8, 0, + 0, 240,63, 0, 0, 32, 8, 0, 0, 48, 36, 0, 8, 0, 8, 0, 0, 80, 0, 0, 0, 0, 4, 0, 0, 16, 26, 0, 0, 32, 0, 0, 0, 16, 1, 0, 0, 0, 2, 0, + 0, 48, 0, 0, 0, 0, 8, 0, 0, 80, 1, 0, 0, 0, 8, 0, 0, 80, 0, 0, 0, 0, 8, 0, 0, 240,63, 0, 8, 16, 8, 0, 0, 144,4, 0, 0, 0, 12, 0, + 0, 32, 0, 0, 0, 0, 4, 0, 0, 48, 16, 0, 0, 32, 0, 0, 0, 16, 58, 0, 0, 0, 2, 0, 0, 48, 51, 0, 0, 0, 8, 0, 0, 16, 0, 0, 4, 0, 0, 0, + 0, 16, 2, 0, 0, 0, 0, 0, 0, 16, 4, 0, 0, 0, 0, 0, 0, 112,0, 0, 0, 0, 4, 0, 0, 112,0, 0, 0, 0, 0, 0, 0, 16, 12, 0, 0, 0, 0, 0, + 0, 176,0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 0, 112,2, 0, 0, 0, 0, 0, 0, 112,4, 0, 0, 17, 0, 0, 0, 208,0, 0, 0, 0, 0, 0, + 0, 112,32, 0, 4, 0, 0, 0, 0, 240,47, 0, 0, 0, 8, 0, 0, 80, 32, 0, 0, 0, 4, 0, 0, 240,1, 0, 0, 0, 0, 0, 0, 80, 2, 0, 0, 0, 0, 0, + 0, 48, 4, 0, 64, 0, 0, 0, 0, 64, 0, 0, 15, 184,22, 0, 0, 64, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 136,0, 4, 0, 0, 0, 0, 0, 128,0, 64, 0, 0, 0, 0, 0, 64, 0, 12, 0, 0, 0, 0, 0, 19, 73, 18, 0, + 0, 0, 0, 0, 10, 41, 14, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 16, 0, 8, 0, 0, 0, 0, 0, 64, 8, 10, 0, 0, 0, 0, 0, 40, 16, 8, 0, + 0, 0, 0, 0, 1, 65, 0, 0, 0, 0, 0, 0, 4, 32, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 0, + 0, 0, 0, 0, 0, 64, 4, 0, 0, 0, 0, 0, 66, 16, 0, 0, 0, 0, 0, 0, 0, 32, 32, 0, 0, 0, 0, 0, 10, 8, 12, 0, 0, 0, 0, 0, 8, 0, 4, 0, + 0, 0, 0, 0, 149,72, 2, 0, 0, 0, 0, 0, 0, 16, 6, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 8, 38, 0, 0, 0, 0, 0, 38, 80, 66, 0, + 0, 0, 0, 0, 0, 132,0, 0, 0, 0, 0, 0, 17, 1, 0, 1, 0, 0, 0, 0, 4, 0, 0, 2, 0, 0, 0, 0, 25, 65, 2, 0, 0, 0, 0, 0, 8, 44, 96, 0, + 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 64, 0, 2, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 2, 16, 0, 0, 0, 0, 0, 0, 0, 136,0, 0, + 0, 0, 0, 0, 1, 1, 16, 0, 0, 0, 0, 0, 25, 8, 132,0, 0, 0, 0, 0, 49, 73, 18, 0, 0, 0, 0, 0, 0, 64, 0, 1, 0, 0, 0, 0, 17, 1, 0, 0, + 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 81, 65, 18, 0, 0, 0, 0, 0, 2, 32, 8, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 1, 32, 2, 0, + 0, 0, 0, 0, 145,64, 144,0, 0, 0, 0, 0, 0, 144,66, 0, 0, 0, 0, 0, 8, 8, 2, 0, 0, 0, 0, 0, 4, 64, 0, 0, 0, 0, 0, 0, 1, 8, 2, 0, + 0, 0, 0, 0, 4, 48, 26, 0, 0, 0, 0, 0, 0, 32, 4, 0, 0, 0, 0, 0, 4, 33, 2, 0, 0, 0, 32, 0, 17, 66, 16, 0, 0, 0, 0, 0, 4, 20, 4, 0, + 0, 0, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 32, 32, 6, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 128,32, 6, 0, 0, 0, 0, 0, 144,0, 0, 0, + 0, 0, 0, 0, 17, 37, 0, 0, 0, 0, 0, 0, 0, 40, 8, 0, 0, 0, 0, 0, 17, 73, 16, 0, 0, 0, 0, 0, 64, 0, 8, 0, 0, 0, 0, 0, 64, 32, 8, 0, + 0, 0, 0, 0, 17, 81, 16, 0, 0, 0, 0, 0, 72, 32, 46, 0, 0, 0, 0, 0, 64, 33, 0, 0, 0, 0, 0, 0, 0, 1, 8, 0, 0, 0, 0, 0, 0, 24, 2, 0, + 0, 0, 0, 0, 4, 12, 0, 0, 0, 0, 0, 0, 128,4, 0, 0, 0, 0, 0, 0, 0, 104,26, 0, 0, 0, 0, 0, 16, 4, 12, 0, 0, 0, 0, 0, 129,0, 0, 0, + 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 32, 0, 6, 0, 0, 0, 0, 0, 17, 33, 4, 0, 0, 0, 0, 0, 0, 72, 2, 0, 0, 64, 0, 0, 145,73, 22, 0, + 0, 0, 0, 0, 4, 48, 12, 0, 0, 0, 0, 0, 128,1, 0, 0, 0, 0, 0, 0, 1, 160,8, 0, 0, 0, 0, 0, 0, 72, 0, 2, 0, 0, 0, 0, 0, 64, 66, 0, + 0, 224,0, 0, 1, 0, 65, 0, 0, 128,0, 0, 1, 0, 69, 0, 0, 64, 0, 0, 0, 0, 4, 3, 1, 208,0, 4, 0, 0, 196,2, 0, 0, 0, 0, 12, 0, 4, 0, + 0, 64, 0, 0, 16, 0, 0, 0, 0, 64, 0, 0, 0, 0, 2, 0, 0, 96, 8, 0, 0, 0, 16, 0, 0, 0, 0, 0, 6, 33, 0, 0, 0, 0, 0, 0, 8, 32, 0, 0, + 0, 0, 0, 0, 6, 0, 4, 0, 0, 0, 0, 0, 16, 0, 4, 1, 0, 32, 0, 0, 149,249,24, 0, 0, 0, 0, 0, 0, 25, 2, 0, 0, 0, 0, 0, 0, 64, 10, 0, + 0, 0, 0, 0, 4, 0, 130,0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 8, 0, 2, 0, 0, 0, 0, 0, 16, 24, 0, 0, 0, 0, 0, 0, 4, 128,0, 0, + 0, 0, 0, 0, 17, 0, 16, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 16, 136,32, 0, 0, 0, 0, 0, 68, 176,2, 0, 0, 0, 0, 0, 4, 4, 0, 0, + 0, 0, 0, 0, 145,65, 18, 0, 0, 0, 0, 0, 0, 32, 132,0, 0, 0, 0, 0, 16, 64, 16, 0, 0, 0, 0, 0, 96, 16, 8, 0, 0, 0, 0, 0, 80, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 8, 0, 0, 0, 0, 0, 0, 176,20, 0, 0, 0, 0, 0, 17, 65, 0, 0, 0, 0, 0, 0, 8, 16, 0, 0, 0, 0, 0, 0, 8, 4, 0, 0, + 0, 64, 0, 0, 129,65, 64, 0, 0, 0, 0, 0, 16, 0, 65, 0, 0, 0, 0, 0, 0, 40, 0, 2, 0, 0, 0, 0, 0, 32, 12, 0, 0, 64, 0, 0, 1, 0, 138,0, + 0, 0, 0, 0, 17, 0, 0, 1, 0, 64, 0, 0, 0, 0, 128,2, 0, 254,63, 0, 255,189,109,1, 0, 16, 0, 0, 0, 32, 0, 0, 0, 96, 4, 0, 0, 4, 0, 0, + 0, 240,15, 0, 8, 16, 12, 0, 0, 240,55, 0, 0, 16, 12, 0, 0, 48, 0, 0, 0, 2, 4, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, + 0, 64, 0, 0, 0, 16, 0, 0, 0, 112,36, 0, 0, 2, 4, 0, 0, 240,51, 0, 4, 0, 4, 0, 0, 160,6, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 1, + 0, 240,16, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 1, 0, 0, 32, 3, 0, 0, 0, 1, 0, 0, 240,31, 0, 0, 32, 9, 0, 0, 224,13, 0, 0, 0, 0, 0, + 0, 224,17, 0, 0, 0, 0, 0, 0, 128,5, 0, 0, 0, 0, 0, 0, 96, 7, 0, 0, 0, 0, 0, 0, 64, 22, 0, 0, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 0, + 0, 240,27, 0, 8, 2, 70, 0, 0, 80, 19, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 192,0, 0, 0, 0, 0, 0, 0, 64, 4, 0, 0, 0, 0, 0, + 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 4, 0, 0, 0, 240,30, 0, 66, 136,136,0, 0, 32, 5, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 128,0, 0, + 0, 0, 52, 0, 0, 0, 0, 0, 0, 112,48, 0, 0, 0, 0, 0, 0, 32, 4, 0, 0, 0, 16, 0, 0, 240,51, 0, 8, 16, 8, 0, 0, 208,51, 0, 4, 0, 8, 0, + 0, 16, 0, 0, 129,0, 0, 0, 0, 32, 0, 0, 0, 16, 0, 0, 0, 64, 6, 0, 0, 64, 0, 0, 0, 176,57, 0, 0, 0, 0, 0, 0, 112,1, 0, 0, 0, 0, 0, + 0, 48, 13, 0, 16, 0, 8, 0, 0, 192,7, 0, 0, 0, 0, 2, 0, 0, 4, 0, 0, 4, 0, 0, 0, 112,45, 0, 0, 0, 8, 0, 0, 0, 0, 64, 0, 0, 0, 0, + 0, 208,13, 0, 0, 1, 8, 0, 0, 96, 1, 0, 0, 0, 0, 0, 0, 16, 33, 0, 0, 128,8, 0, 0, 224,11, 0, 0, 0, 0, 0, 0, 0, 17, 0, 1, 65, 2, 0, + 0, 0, 0, 0, 128,64, 0, 0, 0, 0, 0, 0, 16, 0, 16, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 16, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 16, 16, 1, + 0, 128,4, 0, 24, 0, 0, 0, 0, 0, 0, 0, 144,0, 64, 0, 0, 0, 0, 0, 0, 1, 64, 0, 0, 128,32, 0, 0, 2, 4, 0, 0, 160,1, 0, 4, 0, 128,2, + 0, 240,63, 0, 127,21, 207,0, 0, 112,30, 0, 8, 16, 12, 0, 0, 176,63, 0, 16, 16, 12, 2, 0, 16, 0, 0, 64, 16, 0, 0, 0, 0, 0, 0, 0, 128,8, 0, + 0, 240,39, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 16, 0, 0, 0, 32, 0, 0, 0, 0, 8, 0, 0, 32, 33, 0, 0, 0, 0, 0, 0, 64, 9, 0, 0, 0, 8, 0, + 0, 240,7, 0, 0, 32, 0, 0, 0, 32, 5, 0, 20, 0, 2, 0, 0, 160,16, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 64, 0, 0, 224,47, 0, 8, 0, 6, 0, + 0, 208,63, 0, 0, 0, 0, 2, 0, 160,1, 0, 0, 0, 0, 0, 0, 128,0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 8, 2, 0, 0, 0, 192,15, 0, 16, 0, 8, 0, + 0, 16, 27, 0, 8, 16, 8, 0, 0, 0, 0, 0, 4, 0, 8, 0, 0, 32, 56, 0, 0, 16, 0, 0, 0, 0, 16, 0, 128,0, 0, 0, 0, 240,55, 0, 24, 0, 8, 0, + 0, 32, 36, 0, 0, 0, 0, 0, 0, 224,56, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 20, 8, 0, 0, 240,32, 0, 72, 0, 8, 0, 0, 64, 0, 0, 0, 128,0, 0, + 0, 32, 8, 0, 0, 0, 0, 0, 0, 64, 16, 0, 0, 0, 8, 0, 0, 0, 0, 0, 128,64, 16, 0, 0, 64, 1, 0, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 32, 0, + 0, 0, 1, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 64, 8, 1, 0, 0, 0, 0, 16, 17, 0, 0, 0, 0, 8, 0, 2, 0, 0, 0, 0, 240,63, 64, 125,191,206,3, + 0, 144,30, 0, 8, 16, 8, 0, 0, 112,8, 0, 0, 16, 12, 0, 0, 128,4, 0, 0, 0, 0, 0, 0, 192,3, 0, 8, 0, 4, 0, 0, 208,63, 0, 0, 32, 1, 0, + 0, 80, 21, 0, 0, 0, 4, 0, 0, 0, 32, 0, 4, 0, 0, 0, 0, 112,0, 0, 0, 0, 2, 0, 0, 48, 0, 0, 0, 0, 2, 0, 0, 224,7, 0, 16, 16, 8, 0, + 0, 64, 0, 0, 0, 32, 0, 0, 0, 240,31, 0, 0, 0, 0, 0, 0, 112,7, 0, 13, 16, 10, 0, 0, 0, 2, 0, 8, 0, 0, 0, 0, 224,61, 0, 1, 0, 2, 0, + 0, 0, 8, 0, 1, 0, 0, 0, 0, 128,9, 0, 9, 0, 8, 0, 0, 16, 59, 0, 8, 0, 8, 0, 0, 176,4, 0, 0, 32, 8, 0, 0, 0, 0, 0, 1, 8, 1, 0, + 0, 0, 0, 0, 32, 64, 0, 0, 0, 208,2, 0, 16, 0, 8, 0, 0, 64, 16, 0, 0, 0, 2, 0, 0, 0, 0, 0, 129,0, 2, 0, 0, 0, 0, 0, 2, 0, 32, 0, + 0, 0, 0, 0, 1, 0, 18, 0, 0, 128,0, 0, 0, 1, 128,0, 0, 0, 0, 0, 16, 96, 16, 0, 0, 64, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, + 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 32, 0, 16, 8, 24, 0, 0, 128,2, 0, 48, 4, 16, 2, 0, 0, 0, 0, 16, 224,16, 0, 0, 0, 0, 0, 1, 0, 128,0, + 0, 0, 0, 0, 144,8, 0, 0, 0, 0, 0, 0, 132,0, 64, 0, 0, 96, 9, 0, 0, 0, 0, 0, 0, 128,0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 244,127,0, 253,40, 95, 0, 0, 176,38, 0, 12, 16, 12, 0, 0, 176,6, 0, 4, 16, 12, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 48, 18, 0, 0, 0, 4, 0, + 0, 112,6, 0, 0, 0, 32, 0, 0, 144,15, 0, 0, 32, 128,0, 0, 64, 9, 0, 0, 0, 0, 0, 0, 96, 1, 0, 0, 0, 2, 0, 0, 224,2, 0, 68, 0, 8, 0, + 0, 64, 3, 0, 0, 0, 0, 0, 0, 32, 4, 0, 1, 0, 0, 0, 0, 0, 6, 0, 16, 0, 0, 0, 0, 224,31, 0, 6, 0, 8, 0, 0, 0, 33, 0, 0, 0, 16, 0, + 0, 240,63, 0, 1, 0, 0, 0, 0, 48, 4, 0, 0, 0, 0, 0, 0, 160,32, 0, 0, 0, 0, 0, 0, 32, 6, 0, 9, 32, 7, 0, 0, 0, 43, 0, 0, 0, 0, 0, + 0, 64, 27, 0, 0, 0, 9, 0, 0, 0, 12, 0, 128,0, 0, 0, 0, 0, 25, 0, 0, 0, 2, 0, 0, 128,52, 0, 4, 32, 8, 0, 0, 0, 0, 0, 16, 128,8, 0, + 0, 0, 5, 0, 192,0, 0, 0, 0, 0, 4, 0, 0, 32, 0, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 240,127,0, 70, 3, 156,1, 0, 144,13, 0, 8, 0, 12, 0, + 0, 48, 0, 0, 0, 16, 8, 0, 0, 0, 22, 0, 0, 0, 4, 0, 0, 96, 10, 0, 0, 32, 32, 0, 0, 128,7, 0, 4, 0, 2, 0, 0, 16, 2, 0, 4, 0, 8, 0, + 0, 32, 3, 0, 0, 144,8, 0, 0, 160,33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 2, 0, 144,46, 0, 20, 16, 12, 0, 0, 64, 10, 0, 0, 0, 0, 0, + 0, 240,63, 0, 128,0, 132,0, 0, 0, 8, 0, 1, 0, 1, 0, 0, 0, 32, 0, 16, 0, 0, 0, 0, 160,19, 0, 4, 16, 44, 0, 0, 64, 13, 0, 4, 0, 12, 0, + 0, 64, 45, 0, 29, 144,12, 0, 0, 0, 8, 0, 128,0, 0, 0, 0, 244,127,0, 242,215,156,0, 0, 0, 0, 0, 0, 16, 128,0, 0, 144,58, 0, 0, 16, 12, 0, + 0, 48, 8, 0, 0, 0, 8, 0, 0, 16, 24, 0, 0, 0, 4, 0, 0, 208,0, 0, 12, 32, 0, 0, 0, 0, 10, 0, 0, 0, 2, 0, 0, 96, 27, 0, 0, 0, 8, 0, + 0, 240,58, 0, 0, 0, 0, 0, 0, 64, 1, 0, 2, 0, 4, 0, 0, 144,3, 0, 0, 16, 8, 0, 0, 16, 18, 0, 8, 0, 0, 0, 0, 0, 6, 0, 16, 0, 8, 0, + 0, 0, 16, 0, 0, 0, 2, 0, 0, 144,63, 0, 0, 0, 12, 0, 0, 240,63, 0, 1, 0, 96, 0, 0, 32, 10, 0, 0, 0, 0, 0, 0, 0, 16, 0, 33, 0, 5, 2, + 0, 0, 47, 0, 96, 32, 42, 0, 0, 96, 8, 0, 0, 0, 0, 0, 0, 176,63, 0, 0, 0, 1, 0, 0, 16, 0, 0, 1, 0, 1, 0, 0, 0, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 8, 2, 0, 0, 0, 0, 0, 0, 128,32, 0, 0, 0, 0, 0, 32, 0, 32, 0, 0, 0, 16, 0, 96, 0, 0, 0, 0, 240,127,0, 10, 139,252,0, + 0, 144,52, 0, 4, 0, 12, 0, 0, 0, 26, 0, 0, 16, 12, 0, 0, 32, 8, 0, 32, 0, 4, 0, 0, 160,5, 0, 0, 32, 0, 0, 0, 32, 12, 0, 0, 0, 2, 1, + 0, 192,17, 0, 2, 0, 8, 0, 0, 112,45, 0, 0, 0, 0, 0, 0, 128,8, 0, 4, 16, 8, 0, 0, 80, 22, 0, 16, 0, 8, 0, 0, 0, 0, 0, 0, 0, 33, 0, + 0, 0, 2, 0, 128,0, 0, 0, 0, 144,58, 0, 0, 20, 8, 0, 0, 32, 62, 0, 0, 0, 0, 0, 0, 112,22, 0, 0, 0, 12, 0, 0, 240,6, 0, 0, 0, 0, 0, + 0, 128,24, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 32, 0, 0, 0, 0, 0, 0, 32, 2, 0, 0, 0, 240,127,0, 130,45, 140,2, 0, 208,28, 0, 8, 0, 12, 0, + 0, 48, 57, 0, 0, 0, 0, 0, 0, 240,56, 0, 0, 0, 4, 0, 0, 32, 32, 0, 0, 0, 10, 0, 0, 128,44, 0, 0, 32, 0, 0, 0, 0, 8, 0, 0, 128,2, 0, + 0, 0, 1, 0, 0, 0, 10, 0, 0, 32, 6, 0, 0, 2, 8, 0, 0, 224,12, 0, 0, 0, 0, 0, 0, 128,16, 0, 32, 0, 8, 0, 0, 224,24, 0, 0, 0, 0, 0, + 0, 32, 18, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 32, 0, 0, 128,22, 0, 32, 0, 8, 0, 0, 96, 44, 0, 4, 0, 140,0, 0, 160,47, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 65, 0, 1, 2, 0, 128,62, 0, 32, 0, 14, 0, 0, 0, 40, 0, 1, 0, 0, 0, 0, 176,63, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, + 0, 0, 0, 0, 36, 52, 10, 0, 0, 0, 0, 0, 2, 8, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 16, 244,63, 0, 255,255,255,3, 0, 0, 0, 0, 0, 1, 2, 0, + 0, 0, 0, 0, 237,21, 44, 0, 0, 224,34, 0, 3, 8, 4, 0, 0, 160,5, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 8, 0, 3, 0, 0, 2, + 0, 240,51, 0, 16, 2, 0, 0, 0, 0, 6, 0, 0, 128,0, 0, 0, 0, 24, 0, 0, 32, 0, 0, 0, 16, 0, 0, 0, 4, 0, 0, 0, 32, 0, 0, 239,60, 118,0, + 0, 96, 32, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 160,14, 0, 203,32, 6, 2, 0, 32, 0, 0, 131,0, 4, 0, 0, 32, 0, 0, 129,0, 2, 0, + 0, 32, 0, 0, 129,0, 4, 0, 0, 32, 0, 0, 129,0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 1, 0, 0, 0, 0, 128,0, 12, 0, 0, 0, 0, 0, 0, 25, 8, 0, + 0, 0, 0, 0, 145,128,0, 0, 0, 0, 0, 0, 27, 1, 28, 0, 0, 0, 0, 0, 217,224,12, 0, 0, 0, 0, 0, 0, 32, 16, 0, 0, 0, 0, 0, 16, 16, 32, 0, + 0, 96, 16, 0, 2, 0, 4, 0, 0, 0, 0, 0, 146,0, 4, 0, 0, 32, 2, 0, 255,255,94, 1, 0, 128,0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 78, 47, 30, 3, + 0, 0, 0, 0, 145,68, 16, 0, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 0, 0, 0, 32, 4, 2, 0, 0, 0, 0, 16, 17, 4, 0, 0, 0, 0, 0, 20, 0, 8, 0, + 0, 0, 0, 0, 132,0, 8, 0, 0, 0, 0, 0, 16, 65, 8, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 17, 65, 22, 1, + 0, 0, 0, 0, 12, 16, 12, 1, 0, 0, 0, 0, 1, 65, 4, 0, 0, 0, 0, 0, 8, 32, 36, 1, 0, 32, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 16, 32, 8, 0, + 0, 0, 0, 0, 0, 0, 24, 0, 0, 224,1, 0, 9, 0, 132,0, 0, 32, 0, 0, 16, 0, 0, 0, 0, 32, 0, 0, 32, 0, 0, 0, 0, 32, 0, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 137,28, 66, 0, 0, 0, 0, 0, 0, 8, 0, 2, 0, 0, 0, 0, 0, 120,16, 0, 0, 0, 0, 0, 4, 8, 6, 0, 0, 0, 0, 0, 16, 65, 4, 0, + 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 129,28, 2, 0, 0, 0, 0, 0, 128,1, 0, 1, 0, 0, 2, 0, 90, 105,14, 1, 0, 0, 0, 0, 17, 57, 4, 0, + 0, 0, 0, 0, 205,40, 14, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 17, 0, 10, 0, 0, 0, 0, 0, 1, 65, 8, 0, 0, 0, 0, 0, 8, 50, 4, 0, + 0, 0, 0, 0, 89, 104,14, 0, 0, 0, 0, 0, 16, 3, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 0, 0, 8, 8, 8, 0, + 0, 0, 0, 0, 0, 65, 16, 0, 0, 0, 0, 0, 146,0, 0, 0, 0, 0, 0, 0, 64, 0, 32, 0, 0, 0, 0, 0, 17, 1, 16, 1, 0, 0, 0, 0, 0, 96, 24, 2, + 0, 0, 0, 0, 0, 64, 32, 0, 0, 0, 0, 0, 0, 16, 14, 0, 0, 0, 0, 0, 0, 64, 8, 0, 0, 0, 0, 0, 0, 0, 10, 1, 0, 0, 0, 0, 73, 88, 54, 1, + 0, 0, 0, 0, 1, 1, 8, 0, 0, 0, 0, 0, 8, 40, 12, 0, 0, 0, 0, 0, 16, 1, 4, 0, 0, 4, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 66, 0, 0, 0, + 0, 0, 0, 0, 132,52, 166,0, 0, 0, 0, 0, 32, 0, 96, 0, 0, 0, 0, 0, 69, 72, 112,1, 0, 0, 0, 0, 9, 72, 0, 0, 0, 0, 0, 0, 65, 56, 0, 0, + 0, 0, 0, 0, 0, 128,4, 2, 0, 0, 0, 0, 149,65, 24, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 32, 0, 0, 16, 1, 0, 0, 0, 0, 0, 0, 0, 136,4, 0, + 0, 0, 0, 0, 0, 64, 36, 0, 0, 0, 0, 0, 2, 128,0, 0, 0, 0, 0, 0, 17, 1, 4, 0, 0, 0, 0, 0, 8, 32, 2, 0, 0, 0, 0, 0, 17, 65, 2, 0, + 0, 0, 0, 0, 16, 9, 4, 0, 16, 0, 0, 0, 219,42, 14, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 0, 0, 16, 1, 16, 0, 0, 0, 0, 0, 8, 0, 6, 0, + 0, 0, 0, 0, 0, 16, 12, 0, 0, 72, 0, 0, 191,125,95, 1, 0, 0, 0, 0, 12, 184,10, 0, 0, 0, 0, 0, 16, 1, 0, 1, 0, 0, 0, 0, 21, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 4, 0, 0, 0, 0, 0, 21, 73, 18, 0, 0, 128,0, 0, 8, 8, 2, 0, 0, 0, 0, 0, 8, 168,12, 0, 0, 0, 0, 0, 16, 0, 20, 0, + 0, 0, 0, 0, 17, 65, 4, 0, 0, 0, 0, 0, 2, 32, 0, 0, 0, 112,48, 0, 16, 97, 0, 0, 0, 80, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 96, 0, 0, + 0, 0, 0, 0, 16, 0, 0, 2, 0, 0, 0, 0, 8, 192,0, 0, 0, 0, 0, 0, 1, 8, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 2, 24, 22, 0, + 0, 0, 0, 0, 1, 144,0, 0, 0, 0, 0, 0, 1, 8, 0, 0, 0, 0, 0, 0, 16, 16, 4, 0, 0, 32, 0, 0, 17, 1, 4, 0, 0, 32, 0, 0, 19, 1, 4, 0, + 0, 0, 0, 0, 17, 1, 16, 0, 0, 0, 0, 0, 0, 24, 70, 0, 0, 0, 0, 0, 2, 0, 16, 0, 0, 0, 0, 0, 17, 1, 8, 0, 0, 96, 0, 0, 154,49, 62, 1, + 0, 0, 0, 0, 0, 33, 0, 0, 0, 32, 0, 0, 18, 96, 34, 0, 0, 0, 0, 0, 128,0, 4, 0, 0, 0, 0, 0, 1, 65, 0, 1, 0, 0, 0, 0, 0, 24, 8, 0, + 0, 0, 0, 0, 21, 0, 8, 0, 0, 0, 0, 0, 17, 81, 10, 3, 0, 0, 0, 0, 16, 32, 2, 0, 0, 0, 0, 0, 27, 36, 22, 0, 0, 0, 0, 0, 16, 56, 0, 0, + 0, 0, 0, 0, 8, 16, 6, 0, 0, 0, 0, 0, 24, 48, 4, 0, 0, 0, 0, 0, 2, 65, 6, 0, 0, 0, 0, 0, 36, 0, 8, 0, 0, 0, 0, 0, 64, 64, 0, 0, + 0, 0, 0, 0, 19, 57, 2, 0, 0, 0, 0, 0, 0, 24, 12, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 16, 32, 4, 0, 0, 0, 0, 0, 0, 32, 4, 1, + 0, 0, 0, 0, 8, 16, 4, 0, 0, 0, 0, 0, 17, 0, 20, 1, 0, 0, 0, 0, 38, 56, 30, 0, 0, 0, 0, 0, 16, 8, 14, 0, 0, 0, 0, 0, 17, 0, 4, 1, + 0, 0, 0, 0, 6, 168,4, 0, 0, 0, 0, 0, 145,65, 22, 0, 0, 0, 0, 0, 0, 96, 52, 0, 0, 40, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 8, 128,0, + 0, 0, 0, 0, 0, 17, 8, 0, 0, 8, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 8, 10, 0, 0, 0, 0, 0, 33, 185,14, 0, 0, 128,0, 0, 1, 0, 0, 0, + 0, 32, 0, 0, 4, 32, 2, 0, 0, 32, 0, 0, 221,255,246,3, 0, 0, 0, 0, 206,189,94, 1, 0, 0, 0, 0, 2, 3, 0, 0, 0, 112,0, 0, 21, 65, 4, 1, + 0, 0, 0, 0, 0, 33, 68, 0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 1, 4, 12, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 32, 0, 0, 16, 68, 12, 0, + 0, 0, 0, 0, 1, 5, 0, 0, 0, 0, 0, 0, 12, 0, 2, 0, 0, 0, 0, 0, 0, 96, 32, 0, 0, 0, 0, 0, 4, 0, 128,0, 0, 0, 0, 0, 17, 201,22, 1, + 0, 0, 0, 0, 0, 17, 2, 0, 0, 0, 0, 0, 8, 96, 6, 0, 0, 0, 0, 0, 28, 32, 12, 0, 0, 0, 0, 0, 0, 4, 8, 0, 0, 0, 0, 0, 24, 0, 4, 0, + 0, 0, 0, 0, 16, 1, 8, 0, 0, 0, 0, 0, 18, 184,39, 1, 0, 0, 0, 0, 211,153,4, 1, 0, 0, 0, 0, 17, 32, 0, 2, 0, 0, 0, 0, 2, 192,8, 0, + 0, 0, 0, 0, 1, 65, 4, 1, 0, 0, 0, 0, 4, 17, 36, 0, 0, 0, 0, 0, 132,16, 4, 0, 0, 32, 0, 0, 16, 2, 0, 0, 0, 0, 8, 0, 95, 232,42, 1, + 0, 96, 36, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 17, 64, 16, 0, 0, 0, 0, 0, 4, 0, 2, 0, + 0, 0, 0, 0, 16, 1, 12, 0, 0, 0, 0, 0, 8, 32, 44, 0, 0, 0, 0, 0, 17, 17, 4, 0, 0, 0, 0, 0, 0, 16, 2, 1, 0, 36, 0, 0, 1, 69, 0, 0, + 0, 0, 0, 0, 0, 32, 142,0, 0, 96, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 2, 8, 8, 0, 0, 32, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 2, 64, 0, 0, + 0, 0, 0, 0, 0, 48, 8, 0, 0, 0, 0, 0, 2, 248,18, 0, 0, 0, 0, 0, 48, 128,0, 0, 0, 0, 0, 0, 17, 33, 0, 0, 0, 0, 0, 0, 16, 81, 4, 0, + 0, 0, 0, 0, 57, 64, 0, 0, 0, 0, 0, 0, 17, 32, 8, 0, 0, 32, 0, 0, 21, 96, 0, 0, 0, 0, 0, 0, 16, 32, 0, 0, 0, 0, 0, 0, 4, 1, 32, 0, + 0, 0, 0, 0, 0, 73, 8, 0, 0, 0, 0, 0, 8, 24, 2, 0, 0, 0, 0, 0, 17, 0, 8, 1, 0, 32, 0, 0, 144,0, 4, 0, 0, 0, 0, 0, 1, 64, 0, 1, + 0, 48, 0, 0, 17, 65, 0, 0, 0, 0, 0, 0, 4, 1, 8, 0, 0, 32, 0, 0, 8, 16, 4, 0, 0, 0, 0, 0, 8, 64, 4, 0, 0, 0, 0, 0, 4, 32, 2, 0, + 0, 0, 0, 0, 0, 8, 6, 0, 0, 0, 0, 0, 2, 0, 12, 0, 0, 0, 0, 0, 4, 8, 4, 0, 0, 0, 0, 0, 0, 1, 4, 1, 0, 0, 0, 0, 4, 4, 64, 0, + 0, 0, 0, 0, 5, 0, 8, 0, 0, 0, 0, 0, 76, 125,14, 3, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 0, 0, 1, 32, 16, 0, 0, 0, 0, 0, 0, 40, 0, 0, + 0, 0, 0, 0, 25, 97, 24, 1, 0, 0, 0, 0, 42, 186,4, 0, 0, 0, 0, 0, 8, 0, 128,0, 0, 0, 0, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 208,8, 0, + 0, 0, 0, 0, 5, 65, 12, 0, 0, 0, 0, 0, 2, 8, 0, 1, 0, 0, 0, 0, 128,97, 0, 0, 0, 0, 0, 0, 2, 0, 70, 0, 0, 0, 0, 0, 255,105,30, 3, + 0, 0, 0, 0, 2, 40, 2, 0, 0, 0, 0, 0, 17, 73, 2, 0, 0, 0, 0, 0, 66, 1, 0, 0, 0, 0, 0, 0, 4, 8, 2, 0, 0, 0, 0, 0, 8, 40, 130,0, + 0, 0, 0, 0, 20, 0, 6, 0, 0, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 0, 1, 96, 18, 0, 0, 0, 0, 0, 21, 65, 0, 0, 0, 0, 0, 0, 28, 4, 1, 0, + 0, 32, 0, 0, 0, 33, 0, 0, 0, 32, 0, 0, 1, 1, 20, 0, 0, 64, 0, 0, 1, 32, 0, 0, 0, 0, 0, 0, 11, 18, 8, 0, 0, 0, 0, 0, 132,0, 0, 0, + 0, 0, 0, 0, 17, 64, 2, 0, 0, 0, 0, 0, 66, 56, 76, 0, 0, 0, 8, 0, 255,233,30, 1, 0, 0, 0, 0, 136,177,110,0, 0, 0, 0, 0, 8, 65, 72, 0, + 0, 0, 0, 0, 145,4, 0, 0, 0, 0, 0, 0, 26, 57, 6, 0, 0, 0, 0, 0, 13, 64, 8, 0, 0, 48, 48, 0, 0, 0, 132,0, 0, 0, 0, 0, 17, 9, 2, 0, + 0, 0, 0, 0, 145,1, 0, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 11, 104,12, 0, 0, 0, 0, 0, 68, 0, 4, 0, 0, 0, 0, 0, 0, 8, 78, 1, + 0, 0, 0, 0, 32, 32, 22, 0, 0, 0, 0, 0, 68, 65, 0, 1, 0, 0, 0, 0, 0, 128,0, 1, 0, 0, 0, 0, 0, 128,4, 0, 0, 0, 0, 0, 144,65, 0, 0, + 0, 0, 0, 0, 2, 16, 66, 0, 0, 0, 0, 0, 24, 8, 4, 0, 0, 0, 0, 0, 9, 17, 4, 0, 0, 0, 0, 0, 86, 192,0, 0, 0, 0, 0, 0, 32, 32, 24, 0, + 0, 0, 0, 0, 25, 121,6, 0, 0, 0, 0, 0, 8, 8, 4, 1, 0, 0, 0, 0, 1, 40, 2, 0, 0, 0, 0, 0, 17, 8, 0, 0, 0, 0, 0, 0, 64, 8, 0, 0, + 0, 0, 0, 0, 129,1, 0, 0, 0, 0, 0, 0, 72, 64, 0, 0, 0, 0, 0, 0, 16, 32, 32, 0, 16, 0, 0, 0, 177,123,126,1, 0, 0, 0, 0, 170,56, 18, 0, + 0, 0, 0, 0, 0, 0, 8, 1, 0, 0, 0, 0, 1, 16, 2, 0, 0, 0, 0, 0, 242,81, 21, 1, 0, 0, 0, 0, 16, 64, 2, 0, 0, 0, 0, 0, 0, 48, 6, 0, + 0, 0, 0, 0, 8, 32, 18, 0, 0, 0, 0, 0, 1, 33, 16, 0, 0, 32, 0, 0, 1, 32, 0, 0, 0, 0, 0, 0, 0, 56, 2, 1, 0, 0, 0, 0, 136,0, 12, 0, + 0, 0, 0, 0, 16, 0, 12, 0, 0, 0, 0, 0, 0, 50, 2, 0, 0, 0, 0, 0, 255,253,126,3, 0, 0, 0, 0, 9, 0, 96, 0, 0, 0, 0, 0, 128,4, 8, 0, + 0, 0, 0, 0, 17, 1, 12, 0, 0, 0, 0, 0, 0, 8, 32, 0, 0, 0, 0, 0, 17, 40, 16, 0, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 0, 0, 17, 81, 0, 0, + 0, 0, 0, 0, 0, 32, 0, 1, 0, 0, 0, 0, 16, 89, 12, 0, 0, 0, 0, 0, 16, 32, 6, 1, 0, 0, 0, 0, 32, 40, 0, 0, 0, 0, 0, 0, 129,0, 72, 0, + 0, 0, 0, 0, 147,73, 4, 0, 16, 0, 0, 0, 81, 73, 28, 0, 0, 0, 0, 0, 4, 8, 64, 0, 0, 0, 0, 0, 1, 192,0, 0, 0, 0, 0, 0, 0, 128,2, 0, + 0, 64, 0, 0, 191,219,108,1, 0, 0, 0, 0, 1, 64, 18, 0, 0, 0, 0, 0, 0, 144,0, 0, 0, 0, 0, 0, 8, 0, 4, 1, 0, 0, 0, 0, 1, 73, 2, 0, + 0, 0, 0, 0, 48, 32, 0, 0, 0, 0, 0, 0, 0, 33, 128,0, 0, 0, 0, 0, 1, 72, 0, 0, 0, 0, 0, 0, 128,193,8, 0, 0, 0, 0, 0, 144,1, 2, 0, + 0, 0, 0, 0, 0, 8, 32, 1, 0, 0, 0, 0, 129,169,0, 0, 0, 0, 0, 0, 1, 1, 64, 0, 0, 0, 0, 0, 21, 68, 0, 0, 0, 0, 0, 0, 149,241,8, 0, + 0, 0, 0, 0, 132,48, 134,1, 0, 0, 0, 0, 0, 36, 4, 0, 0, 32, 1, 0, 147,221,126,0, 0, 0, 0, 0, 232,185,94, 0, 0, 0, 0, 0, 17, 4, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 8, 65, 0, 0, 0, 0, 0, 0, 18, 56, 6, 1, 0, 0, 0, 0, 0, 28, 4, 1, 0, 0, 0, 0, 19, 17, 24, 0, + 0, 0, 0, 0, 146,124,42, 1, 0, 0, 0, 0, 128,16, 0, 0, 0, 0, 0, 0, 3, 64, 4, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 32, 64, 6, 1, + 0, 0, 0, 0, 0, 40, 4, 0, 0, 0, 0, 0, 145,66, 16, 0, 0, 0, 0, 0, 0, 48, 2, 0, 0, 0, 0, 0, 4, 48, 10, 0, 0, 36, 32, 0, 255,255,127,3, + 0, 64, 40, 0, 0, 0, 0, 0, 0, 4, 0, 0, 79, 191,126,1, 0, 0, 0, 0, 0, 56, 4, 0, 0, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 2, 52, 0, 0, + 0, 0, 0, 0, 83, 193,16, 0, 0, 0, 0, 0, 1, 40, 8, 0, 0, 32, 0, 0, 121,101,4, 1, 0, 0, 0, 0, 1, 32, 4, 2, 0, 0, 0, 0, 4, 17, 0, 0, + 0, 0, 0, 0, 28, 64, 0, 0, 0, 0, 0, 0, 8, 4, 8, 0, 0, 0, 0, 0, 1, 64, 8, 0, 0, 0, 0, 0, 1, 32, 0, 0, 0, 0, 0, 0, 21, 65, 18, 1, + 0, 0, 0, 0, 4, 41, 26, 1, 0, 0, 0, 0, 144,64, 0, 0, 0, 0, 0, 0, 80, 65, 4, 1, 0, 0, 0, 0, 17, 32, 2, 0, 0, 0, 0, 0, 8, 0, 0, 2, + 0, 0, 0, 0, 25, 57, 2, 0, 0, 0, 0, 0, 72, 97, 14, 1, 0, 32, 0, 0, 129,67, 52, 1, 0, 0, 0, 0, 85, 96, 6, 2, 0, 0, 0, 0, 16, 32, 0, 2, + 0, 0, 0, 0, 0, 56, 7, 0, 0, 0, 0, 0, 145,65, 20, 0, 0, 0, 0, 0, 0, 233,10, 2, 0, 0, 0, 0, 10, 32, 32, 0, 0, 0, 0, 0, 133,48, 46, 0, + 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 4, 32, 8, 0, 0, 0, 0, 0, 83, 65, 86, 0, 0, 0, 0, 0, 6, 176,38, 3, 0, 0, 0, 0, 135,32, 2, 0, + 0, 0, 0, 0, 113,57, 12, 0, 0, 0, 0, 0, 192,64, 0, 0, 0, 0, 0, 0, 2, 40, 20, 0, 0, 0, 0, 0, 72, 0, 8, 0, 0, 0, 0, 0, 76, 32, 0, 0, + 0, 0, 0, 0, 125,247,255,1, 0, 0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 1, 33, 2, 0, 0, 0, 0, 0, 8, 4, 4, 2, 0, 0, 0, 0, 128,0, 8, 0, + 0, 0, 0, 0, 128,32, 4, 0, 0, 0, 0, 0, 17, 0, 2, 0, 0, 0, 0, 0, 0, 160,0, 0, 0, 0, 0, 0, 0, 33, 0, 1, 0, 0, 0, 0, 21, 5, 24, 0, + 0, 0, 0, 0, 128,129,0, 0, 0, 0, 0, 0, 16, 33, 4, 0, 0, 0, 0, 0, 132,33, 20, 1, 0, 0, 0, 0, 16, 1, 10, 0, 0, 0, 0, 0, 32, 32, 0, 0, + 0, 240,62, 0, 17, 97, 148,3, 0, 112,4, 0, 0, 0, 0, 0, 0, 240,34, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 160,7, 0, 0, 0, 0, 0, + 0, 240,42, 0, 0, 0, 0, 0, 0, 240,22, 0, 0, 0, 0, 0, 0, 240,5, 0, 0, 0, 0, 0, 0, 128,9, 0, 0, 0, 0, 0, 0, 32, 0, 0, 8, 36, 0, 0, + 0, 32, 0, 0, 16, 0, 2, 0, 0, 32, 0, 0, 0, 128,4, 0, 0, 0, 0, 0, 0, 128,36, 0, 0, 0, 0, 0, 9, 64, 20, 0, 0, 0, 0, 0, 0, 32, 20, 0, + 0, 0, 0, 0, 49, 65, 38, 0, 0, 32, 0, 0, 2, 40, 2, 0, 0, 0, 0, 0, 8, 0, 8, 1, 0, 32, 0, 0, 1, 65, 4, 0, 0, 0, 0, 0, 145,65, 16, 0, + 0, 0, 0, 0, 16, 8, 2, 0, 0, 0, 0, 0, 22, 64, 2, 0, 0, 32, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 0, 120,2, 0, 0, 0, 0, 0, 8, 18, 0, 0, + 0, 32, 0, 0, 255,245,175,3, 0, 0, 0, 0, 66, 32, 4, 0, 0, 0, 0, 0, 0, 64, 0, 2, 0, 0, 0, 0, 0, 4, 2, 0, 0, 0, 0, 0, 17, 7, 16, 0, + 0, 32, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 32, 32, 34, 0, 0, 32, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 129,32, 16, 0, 0, 0, 0, 1, 16, 17, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 81, 68, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 80, 36, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 128,65, 0, 0, 0, 0, 0, 0, 145,69, 12, 0, 0, 32, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 19, 81, 0, 1, 0, 0, 1, 0, 255,241,126,1, + 0, 0, 0, 0, 0, 80, 16, 1, 0, 192,48, 0, 0, 0, 0, 0, 0, 32, 32, 0, 138,57, 74, 1, 0, 32, 8, 0, 1, 0, 16, 0, 0, 32, 0, 0, 1, 64, 4, 0, + 0, 0, 0, 0, 16, 72, 2, 0, 0, 0, 0, 0, 82, 56, 166,1, 0, 0, 0, 0, 145,65, 2, 0, 0, 32, 0, 0, 27, 0, 76, 0, 0, 0, 0, 0, 4, 0, 16, 0, + 0, 0, 0, 0, 0, 64, 64, 0, 0, 0, 0, 0, 64, 16, 28, 1, 0, 0, 0, 0, 20, 0, 4, 0, 0, 32, 0, 0, 4, 32, 68, 0, 0, 0, 0, 0, 16, 17, 16, 0, + 0, 0, 0, 0, 0, 17, 0, 1, 0, 0, 0, 0, 81, 112,28, 0, 0, 0, 0, 0, 4, 0, 8, 2, 0, 32, 0, 0, 8, 0, 6, 0, 0, 0, 0, 0, 88, 0, 0, 0, + 0, 0, 0, 0, 144,0, 8, 0, 0, 0, 0, 0, 37, 160,126,1, 0, 0, 0, 0, 133,0, 0, 0, 0, 0, 0, 0, 2, 32, 0, 1, 0, 0, 0, 0, 129,64, 2, 0, + 0, 0, 0, 0, 134,192,56, 0, 0, 0, 0, 0, 8, 16, 38, 0, 0, 0, 0, 0, 6, 41, 4, 0, 0, 0, 0, 0, 81, 65, 5, 1, 0, 0, 0, 0, 72, 34, 46, 2, + 0, 0, 0, 0, 16, 0, 18, 0, 0, 0, 0, 0, 9, 0, 0, 2, 0, 0, 0, 0, 17, 1, 0, 2, 0, 0, 0, 0, 8, 41, 14, 1, 0, 0, 0, 0, 73, 0, 0, 0, + 0, 0, 0, 0, 136,32, 6, 0, 0, 0, 0, 0, 24, 0, 8, 0, 0, 0, 0, 0, 1, 64, 80, 0, 0, 0, 0, 0, 177,245,30, 1, 0, 0, 0, 0, 89, 32, 4, 2, + 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 145,1, 4, 0, 0, 0, 0, 0, 0, 32, 6, 0, 0, 0, 0, 0, 0, 33, 12, 0, 0, 240,46, 0, 10, 112,38, 0, + 0, 0, 0, 0, 4, 2, 4, 0, 0, 0, 0, 0, 9, 0, 4, 0, 0, 0, 0, 0, 68, 1, 0, 0, 0, 0, 0, 0, 139,213,28, 0, 0, 0, 0, 0, 4, 32, 9, 0, + 0, 0, 0, 0, 2, 160,0, 0, 0, 0, 0, 0, 1, 64, 2, 0, 0, 0, 0, 0, 153,85, 118,1, 0, 0, 0, 0, 104,49, 38, 1, 0, 0, 0, 0, 1, 128,4, 0, + 0, 0, 0, 0, 4, 48, 70, 2, 0, 0, 0, 0, 195,4, 0, 0, 0, 0, 0, 0, 21, 49, 4, 0, 0, 0, 0, 0, 8, 8, 4, 0, 0, 0, 0, 0, 0, 16, 16, 0, + 0, 0, 0, 0, 32, 0, 18, 0, 0, 0, 0, 0, 92, 144,8, 2, 0, 0, 0, 0, 66, 241,4, 0, 0, 0, 0, 0, 16, 65, 16, 0, 0, 0, 0, 0, 68, 0, 0, 0, + 0, 0, 0, 0, 132,1, 8, 0, 0, 0, 0, 0, 5, 53, 33, 0, 0, 0, 0, 0, 2, 49, 4, 0, 0, 0, 0, 0, 132,40, 2, 0, 0, 0, 0, 0, 1, 104,6, 3, + 0, 0, 0, 0, 17, 97, 12, 0, 0, 0, 0, 0, 9, 32, 6, 2, 0, 32, 0, 0, 17, 64, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 32, 2, 3, + 0, 0, 0, 0, 28, 96, 12, 0, 0, 0, 0, 0, 145,65, 4, 0, 0, 0, 0, 0, 145,0, 16, 0, 0, 8, 3, 0, 223,251,94, 1, 0, 0, 0, 0, 206,189,62, 3, + 0, 0, 0, 0, 0, 32, 18, 0, 0, 0, 0, 0, 97, 65, 2, 0, 0, 0, 0, 0, 13, 97, 24, 2, 0, 48, 36, 0, 0, 0, 0, 0, 0, 112,16, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 81, 97, 24, 1, 0, 0, 0, 0, 0, 40, 32, 0, 0, 0, 0, 0, 145,0, 0, 0, 0, 0, 0, 0, 0, 9, 4, 0, 0, 0, 0, 0, 64, 32, 0, 0, + 0, 32, 0, 0, 0, 8, 0, 0, 0, 36, 0, 0, 1, 5, 4, 0, 0, 0, 0, 0, 64, 40, 14, 0, 0, 0, 0, 0, 9, 0, 2, 0, 0, 112,4, 0, 72, 8, 14, 0, + 0, 0, 0, 0, 89, 4, 40, 0, 0, 0, 0, 0, 0, 33, 2, 1, 0, 0, 0, 0, 8, 0, 4, 2, 0, 0, 0, 0, 64, 1, 4, 2, 0, 0, 0, 0, 1, 96, 16, 0, + 0, 0, 0, 0, 16, 8, 6, 0, 0, 0, 0, 0, 92, 63, 142,3, 0, 0, 0, 0, 1, 9, 16, 0, 0, 0, 0, 0, 17, 96, 0, 0, 0, 0, 0, 0, 153,1, 10, 0, + 0, 0, 0, 0, 0, 81, 12, 1, 0, 0, 0, 0, 68, 100,8, 0, 0, 96, 8, 0, 0, 32, 4, 0, 0, 32, 0, 0, 1, 65, 20, 0, 0, 0, 0, 0, 160,64, 0, 0, + 0, 0, 0, 0, 6, 0, 1, 0, 0, 0, 0, 0, 144,1, 16, 0, 0, 0, 0, 0, 5, 0, 1, 0, 0, 0, 0, 0, 93, 104,14, 2, 0, 0, 0, 0, 1, 69, 16, 0, + 0, 0, 0, 0, 128,8, 0, 0, 0, 0, 0, 0, 16, 40, 0, 0, 0, 32, 2, 0, 0, 64, 4, 0, 0, 32, 0, 0, 0, 32, 4, 0, 0, 0, 0, 0, 17, 69, 0, 0, + 0, 0, 0, 0, 1, 0, 42, 0, 0, 0, 0, 0, 2, 8, 16, 0, 0, 0, 0, 0, 129,64, 12, 0, 0, 0, 0, 0, 145,0, 0, 1, 0, 0, 0, 0, 8, 65, 4, 0, + 0, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, 29, 44, 30, 1, 0, 0, 0, 0, 80, 0, 14, 0, 0, 0, 0, 0, 21, 209,24, 1, 0, 0, 0, 0, 0, 24, 4, 0, + 0, 0, 0, 0, 16, 48, 8, 0, 0, 0, 0, 0, 145,9, 28, 1, 0, 0, 0, 0, 0, 32, 14, 0, 0, 0, 0, 0, 8, 0, 130,0, 0, 0, 0, 0, 16, 65, 0, 1, + 0, 0, 0, 0, 128,0, 2, 0, 0, 0, 0, 0, 0, 16, 32, 0, 0, 0, 0, 0, 30, 137,8, 0, 0, 0, 0, 0, 18, 0, 18, 0, 0, 0, 0, 0, 0, 9, 2, 0, + 0, 0, 0, 0, 4, 40, 6, 0, 0, 32, 0, 0, 64, 104,132,0, 0, 0, 0, 0, 17, 64, 0, 1, 0, 8, 16, 0, 255,239,255,3, 0, 0, 0, 0, 222,189,94, 1, + 0, 0, 0, 0, 17, 72, 0, 0, 0, 0, 0, 0, 129,68, 2, 0, 0, 0, 0, 0, 1, 65, 2, 1, 0, 0, 0, 0, 0, 24, 6, 0, 0, 0, 0, 0, 0, 96, 2, 0, + 0, 0, 4, 0, 112,73, 4, 1, 0, 0, 0, 0, 0, 65, 20, 1, 0, 0, 0, 0, 0, 0, 12, 2, 0, 0, 0, 0, 3, 65, 0, 0, 0, 0, 0, 0, 9, 1, 12, 1, + 0, 0, 0, 0, 20, 4, 4, 0, 0, 0, 0, 0, 0, 65, 0, 1, 0, 0, 0, 0, 129,0, 8, 0, 0, 0, 0, 0, 64, 0, 0, 2, 0, 0, 0, 0, 1, 66, 16, 1, + 0, 0, 0, 0, 145,69, 10, 1, 0, 0, 0, 0, 16, 72, 0, 0, 0, 0, 0, 0, 0, 32, 34, 0, 0, 0, 0, 0, 20, 8, 6, 0, 0, 40, 0, 0, 145,65, 18, 3, + 0, 0, 0, 0, 0, 56, 34, 1, 0, 0, 0, 0, 3, 8, 6, 0, 0, 0, 0, 0, 147,88, 12, 0, 0, 32, 0, 0, 16, 64, 12, 0, 0, 0, 0, 0, 0, 0, 36, 0, + 0, 16, 0, 0, 17, 38, 4, 0, 0, 0, 0, 0, 65, 64, 0, 0, 0, 0, 0, 0, 128,40, 34, 0, 0, 0, 0, 0, 80, 1, 0, 0, 0, 0, 0, 0, 17, 73, 20, 3, + 0, 0, 0, 0, 28, 32, 4, 0, 0, 32, 0, 0, 81, 227,92, 1, 0, 112,36, 0, 24, 0, 12, 0, 0, 32, 0, 0, 16, 64, 4, 0, 0, 0, 0, 0, 1, 32, 36, 0, + 0, 32, 0, 0, 1, 4, 0, 0, 0, 0, 0, 0, 0, 40, 8, 2, 0, 32, 0, 0, 16, 0, 4, 0, 0, 240,60, 0, 18, 2, 4, 0, 0, 240,8, 0, 0, 0, 0, 0, + 0, 32, 0, 0, 16, 4, 0, 0, 0, 0, 0, 0, 21, 98, 4, 1, 0, 0, 0, 0, 88, 185,4, 0, 0, 0, 0, 0, 0, 8, 4, 2, 0, 0, 0, 0, 16, 2, 2, 0, + 0, 112,12, 0, 2, 80, 0, 0, 0, 0, 1, 0, 4, 56, 94, 3, 0, 0, 0, 0, 152,0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 128,1, 8, 0, + 0, 0, 0, 0, 0, 4, 12, 0, 0, 0, 0, 0, 1, 4, 0, 0, 0, 64, 0, 0, 209,77, 126,0, 0, 0, 0, 0, 0, 8, 34, 0, 0, 240,62, 0, 59, 73, 20, 3, + 0, 240,24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 12, 1, 0, 0, 0, 0, 21, 44, 13, 0, 0, 32, 1, 0, 36, 36, 62, 2, 0, 0, 0, 0, 32, 0, 64, 0, + 0, 32, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 16, 81, 12, 0, 0, 0, 0, 0, 17, 104,4, 0, 0, 0, 0, 0, 64, 168,12, 0, 0, 0, 0, 0, 8, 33, 0, 0, + 0, 0, 0, 0, 11, 48, 14, 1, 0, 0, 0, 0, 5, 32, 0, 0, 0, 0, 0, 0, 0, 128,6, 0, 0, 0, 0, 0, 4, 40, 62, 0, 0, 0, 0, 0, 9, 64, 0, 0, + 0, 0, 0, 0, 20, 8, 4, 0, 0, 0, 0, 0, 17, 96, 16, 1, 0, 0, 0, 0, 31, 252,14, 0, 0, 0, 0, 0, 0, 40, 140,0, 0, 96, 0, 0, 16, 1, 4, 0, + 0, 0, 0, 0, 192,1, 0, 0, 0, 0, 0, 0, 136,0, 0, 0, 0, 0, 0, 0, 145,65, 12, 0, 0, 0, 0, 0, 145,41, 2, 0, 0, 0, 0, 0, 0, 16, 0, 1, + 0, 0, 0, 0, 17, 81, 16, 1, 0, 96, 24, 0, 10, 184,6, 0, 0, 224,32, 0, 0, 0, 0, 0, 0, 64, 63, 0, 0, 0, 0, 0, 0, 80, 25, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 1, 16, 0, 0, 0, 0, 0, 5, 60, 140,0, 0, 0, 0, 0, 16, 9, 0, 0, 0, 0, 0, 0, 16, 8, 4, 0, 0, 0, 0, 0, 150,36, 44, 0, + 0, 0, 0, 0, 148,4, 0, 0, 0, 96, 0, 0, 26, 0, 4, 0, 0, 0, 0, 0, 0, 32, 24, 1, 0, 0, 0, 0, 1, 57, 4, 2, 0, 0, 0, 0, 1, 24, 16, 0, + 0, 0, 0, 0, 24, 253,190,0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 215,201,72, 0, 0, 0, 0, 0, 0, 8, 16, 0, 0, 0, 0, 0, 16, 1, 2, 0, + 0, 0, 0, 0, 1, 0, 8, 1, 0, 32, 0, 0, 151,93, 94, 0, 0, 0, 0, 0, 68, 104,2, 1, 0, 0, 0, 0, 23, 56, 7, 0, 0, 0, 0, 0, 16, 65, 18, 0, + 0, 0, 0, 0, 1, 48, 6, 0, 0, 0, 0, 0, 4, 40, 0, 0, 0, 32, 0, 0, 0, 0, 0, 1, 0, 240,59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 24, 4, 0, + 0, 0, 0, 0, 255,248,111,0, 0, 0, 0, 0, 129,73, 4, 1, 0, 0, 0, 0, 1, 8, 18, 0, 0, 0, 0, 0, 4, 160,129,0, 0, 0, 0, 0, 129,64, 6, 0, + 0, 0, 0, 0, 8, 136,0, 0, 0, 0, 0, 0, 16, 72, 24, 1, 0, 0, 0, 0, 0, 176,0, 0, 0, 0, 0, 0, 129,64, 18, 0, 0, 0, 0, 0, 160,41, 132,0, + 0, 32, 0, 0, 17, 65, 20, 1, 0, 0, 0, 0, 0, 8, 12, 0, 0, 0, 0, 0, 21, 96, 20, 0, 0, 32, 0, 0, 0, 4, 0, 0, 0, 224,0, 0, 0, 34, 28, 0, + 0, 0, 0, 0, 4, 20, 0, 0, 0, 0, 0, 0, 66, 128,14, 0, 0, 0, 0, 0, 131,208,88, 0, 0, 0, 0, 0, 64, 4, 0, 0, 0, 0, 0, 0, 128,5, 0, 0, + 0, 0, 0, 0, 129,65, 16, 0, 0, 0, 0, 0, 4, 9, 0, 0, 0, 0, 0, 0, 11, 61, 30, 1, 0, 0, 16, 0, 32, 0, 0, 0, 0, 32, 32, 0, 4, 0, 4, 0, + 0, 0, 0, 0, 247,237,30, 1, 0, 32, 0, 0, 28, 56, 10, 0, 0, 32, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 16, 97, 8, 0, 0, 0, 0, 0, 4, 56, 134,0, + 0, 0, 0, 0, 9, 1, 4, 0, 0, 0, 0, 0, 64, 1, 8, 0, 0, 0, 0, 0, 21, 8, 4, 0, 0, 0, 0, 0, 92, 172,12, 0, 0, 0, 0, 0, 40, 0, 0, 0, + 0, 0, 0, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 160,8, 0, 0, 32, 16, 0, 8, 32, 0, 0, 0, 224,8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 4, 2, + 0, 0, 0, 0, 128,12, 8, 0, 0, 0, 0, 0, 1, 72, 2, 0, 0, 0, 0, 0, 17, 201,22, 0, 0, 0, 0, 0, 1, 40, 10, 0, 0, 0, 0, 0, 66, 25, 12, 0, + 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 4, 32, 128,0, 0, 0, 0, 0, 1, 0, 12, 0, 0, 0, 0, 0, 5, 32, 16, 0, 0, 0, 0, 0, 128,32, 0, 0, + 0, 224,34, 0, 74, 178,76, 1, 0, 0, 0, 0, 17, 0, 16, 1, 0, 96, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 64, 6, 0, 0, 0, 0, 0, 21, 32, 1, 0, + 0, 0, 0, 0, 132,32, 0, 0, 0, 0, 0, 0, 3, 128,160,0, 0, 0, 0, 0, 8, 40, 4, 0, 0, 0, 0, 0, 17, 65, 16, 1, 0, 0, 0, 0, 68, 8, 0, 0, + 0, 232,45, 0, 16, 9, 4, 0, 0, 96, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145,9, 2, 0, 0, 0, 0, 0, 144,9, 0, 0, 0, 0, 0, 0, 1, 0, 40, 0, + 0, 0, 0, 0, 16, 8, 6, 2, 0, 32, 0, 0, 129,1, 84, 0, 0, 64, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 54, 24, 14, 0, 0, 0, 0, 0, 1, 1, 20, 0, + 0, 0, 0, 0, 8, 80, 2, 0, 0, 0, 0, 0, 32, 40, 10, 0, 0, 128,0, 0, 255,255,255,3, 0, 32, 0, 0, 110,189,127,1, 0, 0, 0, 0, 17, 9, 4, 0, + 0, 0, 0, 0, 29, 0, 4, 3, 0, 0, 0, 0, 1, 40, 0, 0, 0, 0, 0, 0, 0, 33, 8, 0, 0, 0, 0, 0, 0, 100,0, 0, 0, 0, 0, 0, 1, 32, 4, 0, + 0, 0, 0, 0, 0, 36, 64, 0, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 0, 0, 93, 66, 12, 0, 0, 0, 0, 0, 4, 2, 0, 2, 0, 0, 0, 0, 17, 3, 0, 0, + 0, 0, 0, 0, 17, 65, 18, 0, 0, 0, 0, 0, 0, 8, 24, 0, 0, 0, 0, 0, 0, 33, 10, 0, 0, 0, 0, 0, 128,8, 8, 2, 0, 0, 0, 0, 64, 40, 18, 0, + 0, 0, 0, 0, 4, 0, 12, 0, 0, 0, 0, 0, 128,0, 16, 0, 0, 0, 0, 0, 209,73, 28, 0, 0, 0, 0, 0, 8, 32, 26, 0, 0, 0, 0, 0, 1, 128,16, 0, + 0, 0, 0, 0, 89, 64, 16, 0, 0, 0, 0, 0, 81, 120,0, 0, 0, 0, 0, 0, 27, 209,82, 0, 0, 0, 0, 0, 20, 49, 0, 0, 0, 0, 0, 0, 9, 232,14, 1, + 0, 32, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 18, 248,40, 0, 0, 0, 0, 0, 0, 64, 20, 0, 0, 0, 0, 0, 83, 104,0, 2, 0, 0, 0, 0, 64, 65, 0, 0, + 0, 0, 0, 0, 0, 8, 14, 0, 0, 0, 0, 0, 9, 64, 2, 0, 0, 0, 0, 0, 25, 113,118,0, 0, 0, 0, 0, 194,40, 12, 0, 0, 0, 0, 0, 5, 41, 6, 0, + 0, 0, 0, 0, 0, 96, 12, 2, 0, 0, 0, 0, 0, 41, 0, 2, 0, 0, 0, 0, 16, 64, 0, 1, 0, 0, 0, 0, 239,105,45, 3, 0, 0, 2, 0, 0, 8, 4, 0, + 16, 0, 0, 0, 27, 65, 14, 2, 0, 0, 0, 0, 2, 8, 6, 0, 0, 0, 0, 0, 17, 0, 12, 2, 0, 0, 0, 0, 145,65, 18, 1, 0, 0, 0, 0, 2, 40, 0, 0, + 0, 0, 0, 0, 0, 40, 12, 0, 0, 0, 0, 0, 3, 0, 8, 2, 0, 0, 0, 0, 17, 32, 0, 0, 0, 0, 0, 0, 27, 25, 4, 0, 0, 0, 0, 0, 8, 8, 12, 0, + 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 125,124,30, 3, 0, 0, 0, 0, 8, 45, 4, 2, 0, 0, 0, 0, 17, 97, 4, 0, 0, 0, 0, 0, 129,64, 0, 0, + 0, 0, 0, 0, 64, 8, 12, 0, 0, 0, 0, 0, 69, 0, 8, 0, 0, 0, 0, 0, 4, 40, 4, 0, 0, 0, 0, 0, 145,145,24, 0, 0, 0, 0, 0, 6, 168,8, 0, + 0, 0, 0, 0, 1, 80, 0, 2, 0, 0, 0, 0, 145,73, 64, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 17, 65, 8, 1, 0, 0, 0, 0, 25, 33, 12, 1, + 0, 0, 0, 0, 17, 32, 4, 0, 0, 0, 0, 0, 55, 217,70, 1, 0, 0, 0, 0, 77, 56, 44, 0, 0, 0, 0, 0, 144,96, 0, 0, 0, 0, 0, 0, 8, 1, 8, 0, + 0, 0, 0, 0, 24, 40, 6, 0, 0, 0, 0, 0, 72, 1, 8, 0, 0, 0, 0, 0, 89, 42, 12, 0, 0, 0, 0, 0, 88, 1, 8, 0, 0, 0, 0, 0, 4, 41, 18, 0, + 0, 0, 0, 0, 16, 1, 4, 1, 0, 0, 0, 0, 2, 64, 8, 0, 0, 0, 0, 0, 153,97, 92, 2, 0, 0, 0, 0, 0, 72, 16, 2, 0, 0, 0, 0, 16, 64, 8, 0, + 0, 0, 0, 0, 18, 8, 14, 1, 0, 0, 0, 0, 16, 112,12, 0, 0, 0, 0, 0, 0, 40, 90, 0, 0, 32, 0, 0, 0, 65, 0, 1, 0, 0, 0, 0, 2, 128,72, 0, + 0, 0, 0, 0, 4, 120,86, 1, 0, 0, 0, 0, 32, 0, 4, 0, 0, 0, 0, 0, 2, 8, 10, 0, 0, 0, 0, 0, 0, 53, 4, 1, 0, 0, 0, 0, 76, 0, 8, 0, + 0, 0, 0, 0, 73, 104,7, 3, 0, 0, 0, 0, 87, 96, 44, 2, 0, 0, 0, 0, 64, 32, 0, 2, 0, 0, 0, 0, 68, 42, 76, 3, 0, 32, 0, 0, 129,64, 4, 0, + 0, 0, 0, 0, 149,73, 0, 0, 0, 112,40, 0, 32, 0, 4, 0, 0, 0, 0, 0, 12, 65, 0, 1, 0, 0, 0, 0, 8, 16, 32, 0, 0, 32, 0, 0, 183,89, 118,3, + 0, 0, 0, 0, 0, 40, 144,0, 0, 0, 0, 0, 97, 16, 6, 2, 0, 96, 8, 0, 1, 69, 16, 0, 0, 96, 19, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 2, 1, 4, 1, 0, 0, 0, 0, 17, 64, 18, 0, 0, 32, 4, 0, 0, 1, 4, 0, 0, 0, 0, 0, 119,120,20, 0, 0, 0, 0, 0, 144,8, 16, 0, + 0, 32, 0, 0, 16, 1, 6, 0, 0, 0, 0, 0, 32, 105,0, 0, 0, 0, 0, 0, 1, 128,0, 1, 0, 32, 1, 0, 0, 65, 0, 0, 0, 0, 0, 0, 70, 179,4, 0, + 0, 0, 0, 0, 17, 97, 0, 0, 0, 0, 0, 0, 8, 32, 0, 1, 0, 0, 0, 0, 24, 40, 4, 2, 0, 0, 0, 0, 17, 65, 24, 0, 0, 0, 0, 0, 66, 0, 8, 0, + 0, 96, 2, 0, 255,253,95, 1, 0, 32, 0, 0, 248,189,14, 1, 0, 0, 0, 0, 1, 64, 12, 0, 0, 0, 0, 0, 16, 3, 18, 1, 0, 0, 0, 0, 145,73, 2, 0, + 0, 0, 0, 0, 0, 168,2, 0, 0, 0, 0, 0, 12, 0, 12, 2, 0, 0, 0, 0, 4, 65, 0, 0, 0, 0, 0, 0, 19, 81, 0, 0, 0, 0, 0, 0, 0, 56, 14, 0, + 0, 224,1, 0, 61, 11, 1, 2, 0, 96, 0, 0, 1, 0, 0, 0, 0, 48, 5, 0, 97, 10, 35, 2, 0, 32, 0, 0, 128,0, 0, 0, 0, 48, 0, 0, 0, 2, 0, 0, + 0, 32, 128,0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 184,164,0, 0, 0, 0, 0, 68, 34, 0, 0, 0, 0, 0, 0, 129,0, 16, 0, 0, 32, 0, 0, 127,253,90, 1, + 0, 0, 0, 0, 32, 56, 24, 0, 0, 0, 0, 0, 17, 64, 18, 1, 0, 0, 0, 0, 0, 32, 8, 1, 0, 0, 0, 0, 8, 0, 64, 0, 0, 0, 0, 0, 0, 40, 38, 0, + 0, 0, 0, 0, 4, 16, 0, 0, 0, 112,32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 10, 0, 0, 0, 0, 0, 48, 16, 0, 0, 0, 0, 0, 0, 61, 120,6, 0, + 0, 8, 0, 0, 74, 32, 8, 0, 0, 40, 0, 0, 17, 8, 4, 0, 0, 0, 0, 0, 17, 9, 102,0, 0, 0, 0, 0, 72, 32, 66, 1, 0, 0, 0, 0, 16, 0, 12, 1, + 0, 0, 0, 0, 1, 0, 16, 1, 0, 4, 0, 0, 153,9, 2, 0, 0, 0, 0, 0, 4, 0, 14, 0, 0, 0, 0, 0, 68, 40, 2, 0, 0, 0, 0, 0, 193,32, 0, 0, + 0, 0, 0, 0, 81, 0, 4, 0, 0, 128,0, 0, 0, 0, 16, 0, 0, 32, 32, 0, 181,89, 94, 1, 0, 32, 0, 0, 56, 57, 20, 1, 0, 0, 0, 0, 9, 56, 14, 0, + 0, 0, 0, 0, 24, 0, 6, 0, 0, 0, 0, 0, 0, 16, 64, 0, 0, 0, 0, 0, 16, 81, 0, 0, 0, 224,0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 72, 48, 4, 2, + 0, 0, 0, 0, 1, 48, 2, 0, 0, 0, 0, 0, 16, 129,0, 0, 0, 0, 0, 0, 147,89, 82, 0, 0, 0, 0, 0, 36, 41, 10, 0, 0, 0, 0, 0, 1, 97, 4, 0, + 0, 0, 0, 0, 1, 64, 132,0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 64, 40, 0, 0, 0, 0, 0, 0, 0, 40, 18, 0, 0, 0, 0, 0, 0, 17, 32, 0, + 0, 160,0, 0, 80, 12, 4, 3, 0, 0, 0, 0, 8, 32, 16, 0, 0, 32, 0, 0, 14, 184,44, 0, 0, 0, 0, 0, 8, 0, 10, 0, 0, 0, 0, 0, 0, 36, 6, 0, + 0, 0, 1, 64, 157,253,126,3, 0, 0, 0, 0, 132,56, 142,1, 0, 0, 0, 0, 132,65, 0, 0, 0, 0, 0, 0, 33, 168,6, 0, 0, 0, 0, 0, 84, 0, 0, 0, + 0, 0, 0, 0, 17, 88, 0, 1, 0, 0, 0, 0, 2, 56, 4, 1, 0, 0, 0, 0, 1, 41, 2, 1, 0, 0, 0, 0, 17, 1, 6, 0, 0, 0, 0, 0, 128,72, 12, 0, + 0, 0, 4, 0, 16, 0, 0, 0, 0, 0, 0, 0, 49, 8, 32, 1, 0, 0, 0, 0, 18, 1, 0, 0, 0, 0, 0, 0, 17, 3, 16, 0, 0, 0, 0, 0, 12, 0, 5, 0, + 0, 0, 0, 0, 1, 64, 4, 0, 0, 32, 0, 0, 16, 0, 8, 0, 0, 0, 0, 0, 144,0, 8, 1, 0, 0, 0, 0, 17, 64, 4, 0, 0, 0, 0, 0, 20, 188,6, 0, + 0, 0, 0, 0, 2, 1, 4, 0, 0, 0, 0, 0, 0, 1, 20, 1, 0, 0, 0, 0, 1, 192,16, 0, 0, 0, 0, 0, 4, 144,0, 0, 0, 0, 0, 0, 64, 4, 4, 0, + 0, 0, 0, 0, 145,77, 82, 1, 0, 0, 0, 0, 70, 41, 66, 0, 0, 32, 0, 0, 16, 1, 4, 0, 0, 0, 0, 0, 25, 17, 12, 0, 0, 0, 0, 0, 2, 48, 6, 0, + 0, 0, 0, 0, 10, 0, 24, 0, 0, 0, 0, 0, 2, 0, 4, 0, 0, 0, 0, 0, 69, 40, 10, 0, 0, 0, 0, 0, 1, 0, 20, 0, 0, 0, 0, 0, 18, 0, 4, 0, + 0, 0, 0, 0, 10, 0, 8, 0, 0, 0, 0, 0, 2, 128,2, 0, 0, 0, 0, 0, 127,191,238,3, 0, 0, 0, 0, 16, 9, 18, 1, 0, 0, 0, 0, 64, 0, 10, 0, + 0, 0, 0, 0, 4, 0, 0, 1, 0, 0, 0, 0, 4, 0, 10, 0, 0, 0, 0, 0, 144,76, 8, 0, 0, 0, 0, 0, 17, 9, 18, 0, 0, 0, 0, 0, 4, 1, 132,0, + 0, 32, 16, 0, 19, 64, 14, 0, 0, 128,21, 0, 0, 0, 0, 0, 0, 40, 0, 0, 2, 136,44, 0, 0, 0, 16, 0, 0, 0, 4, 0, 0, 0, 0, 0, 16, 65, 12, 0, + 0, 0, 0, 0, 40, 1, 0, 0, 0, 4, 0, 0, 208,25, 20, 0, 0, 0, 0, 0, 16, 0, 10, 0, 0, 232,32, 0, 17, 65, 20, 1, 0, 112,46, 0, 0, 0, 0, 0, + 0, 112,51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 4, 0, 0, 0, 0, 0, 27, 8, 28, 0, 0, 0, 0, 0, 16, 0, 6, 0, 0, 0, 0, 0, 0, 16, 0, 2, + 0, 0, 0, 0, 89, 68, 8, 0, 0, 0, 0, 0, 0, 3, 4, 1, 0, 0, 0, 0, 81, 65, 2, 0, 0, 0, 0, 0, 1, 8, 20, 0, 0, 0, 0, 0, 68, 96, 32, 0, + 0, 0, 0, 0, 132,0, 16, 0, 0, 0, 0, 0, 6, 0, 2, 0, 0, 0, 0, 0, 174,153,12, 0, 0, 0, 0, 0, 0, 0, 18, 1, 0, 32, 0, 0, 81, 65, 2, 0, + 0, 0, 0, 0, 18, 73, 0, 0, 0, 240,32, 0, 16, 64, 8, 0, 0, 0, 0, 0, 145,81, 18, 0, 0, 0, 0, 0, 4, 32, 18, 0, 0, 0, 0, 0, 20, 64, 16, 0, + 0, 0, 0, 0, 1, 32, 12, 2, 0, 0, 0, 0, 128,0, 10, 0, 0, 0, 0, 0, 0, 96, 4, 0, 0, 0, 0, 0, 111,185,38, 0, 0, 0, 0, 0, 145,72, 2, 0, + 0, 0, 0, 0, 0, 64, 2, 1, 0, 0, 0, 0, 64, 4, 8, 0, 0, 0, 0, 0, 4, 96, 4, 0, 0, 0, 0, 0, 2, 0, 10, 0, 0, 0, 0, 0, 129,1, 4, 0, + 0, 0, 0, 0, 0, 192,8, 0, 0, 0, 5, 0, 93, 97, 10, 0, 0, 0, 0, 0, 0, 41, 10, 1, 0, 0, 0, 0, 68, 0, 12, 3, 0, 0, 0, 0, 80, 1, 4, 0, + 0, 4, 0, 0, 15, 57, 142,3, 0, 0, 0, 0, 17, 9, 0, 0, 0, 0, 0, 0, 81, 64, 0, 0, 0, 0, 0, 0, 73, 65, 28, 0, 0, 0, 0, 0, 147,33, 14, 1, + 0, 0, 0, 0, 125,104,46, 2, 0, 0, 0, 0, 4, 32, 10, 0, 0, 0, 0, 0, 68, 41, 64, 0, 0, 0, 0, 0, 9, 16, 0, 0, 0, 0, 8, 0, 17, 65, 0, 0, + 0, 0, 0, 0, 128,48, 0, 0, 0, 0, 32, 0, 251,109,78, 1, 0, 0, 0, 0, 12, 61, 14, 1, 0, 0, 0, 0, 64, 0, 0, 1, 0, 0, 16, 0, 0, 44, 0, 0, + 0, 0, 0, 0, 0, 4, 64, 0, 0, 0, 0, 0, 48, 89, 28, 0, 0, 0, 0, 0, 8, 24, 4, 0, 0, 0, 0, 0, 1, 104,4, 0, 0, 0, 0, 0, 144,80, 0, 0, + 0, 0, 0, 0, 159,125,30, 1, 0, 0, 0, 0, 132,61, 10, 2, 0, 0, 0, 0, 8, 0, 16, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 16, 9, 8, 0, + 0, 0, 0, 0, 17, 81, 68, 0, 0, 0, 0, 0, 34, 0, 64, 0, 0, 0, 0, 0, 8, 104,24, 0, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 0, 0, 138,48, 14, 0, + 0, 0, 0, 0, 8, 128,32, 0, 0, 32, 0, 0, 183,125,94, 2, 0, 0, 0, 0, 136,152,10, 2, 0, 0, 0, 0, 128,0, 0, 1, 0, 16, 0, 0, 16, 0, 0, 0, + 0, 0, 0, 0, 18, 32, 34, 0, 0, 0, 0, 0, 2, 65, 8, 0, 0, 0, 0, 0, 8, 20, 0, 2, 0, 0, 0, 0, 0, 32, 58, 0, 0, 0, 0, 0, 16, 40, 2, 0, + 0, 0, 0, 0, 5, 24, 6, 1, 0, 0, 0, 0, 17, 97, 16, 0, 16, 124,40, 0, 255,255,254,3, 0, 0, 0, 0, 32, 32, 10, 0, 0, 0, 0, 0, 53, 65, 44, 0, + 0, 4, 0, 0, 0, 64, 0, 0, 0, 4, 0, 0, 4, 0, 0, 0, 0, 16, 0, 0, 136,40, 0, 0, 0, 128,0, 0, 16, 0, 0, 0, 0, 64, 0, 0, 1, 0, 8, 0, + 16, 64, 0, 0, 255,255,255,3, 0, 0, 0, 0, 15, 44, 14, 0, 0, 0, 0, 0, 128,0, 0, 2, 0, 0, 0, 0, 23, 107,22, 1, 0, 32, 0, 0, 0, 47, 26, 0, + 0, 96, 4, 0, 4, 56, 30, 1, 0, 0, 0, 0, 21, 108,14, 0, 0, 0, 0, 0, 128,4, 0, 2, 0, 0, 0, 0, 80, 64, 4, 0, 0, 0, 0, 0, 4, 104,0, 0, + 0, 0, 0, 0, 0, 9, 6, 0, 16, 240,4, 0, 239,141,6, 0, 0, 0, 0, 0, 16, 73, 0, 0, 0, 32, 6, 0, 0, 1, 0, 0, 0, 0, 0, 0, 149,85, 28, 3, + 0, 0, 0, 0, 0, 12, 18, 1, 0, 0, 0, 0, 129,64, 16, 0, 0, 0, 0, 0, 149,121,26, 0, 0, 0, 0, 0, 24, 64, 0, 0, 0, 0, 0, 0, 68, 108,0, 0, + 0, 0, 0, 0, 255,217,94, 1, 0, 16, 0, 0, 1, 64, 2, 0, 0, 0, 0, 0, 8, 32, 6, 1, 0, 0, 0, 0, 16, 16, 16, 0, 0, 0, 0, 0, 32, 0, 16, 0, + 0, 0, 0, 0, 20, 137,8, 0, 0, 0, 0, 0, 16, 128,4, 0, 0, 0, 0, 0, 0, 40, 10, 0, 0, 0, 0, 0, 0, 136,6, 0, 0, 32, 0, 0, 255,125,22, 3, + 0, 0, 0, 0, 66, 62, 70, 0, 0, 0, 0, 0, 2, 0, 0, 1, 0, 32, 4, 0, 0, 0, 4, 2, 0, 0, 0, 0, 64, 0, 16, 0, 0, 0, 0, 0, 1, 32, 2, 1, + 0, 0, 0, 0, 1, 64, 64, 0, 0, 0, 0, 0, 16, 9, 16, 0, 0, 32, 0, 0, 16, 65, 4, 0, 0, 0, 0, 0, 17, 56, 0, 0, 0, 0, 0, 0, 32, 2, 16, 0, + 0, 0, 0, 0, 64, 40, 16, 0, 0, 0, 0, 0, 140,44, 14, 2, 0, 0, 0, 0, 68, 25, 16, 0, 0, 0, 0, 0, 16, 4, 4, 0, 0, 0, 0, 0, 32, 1, 8, 0, + 0, 0, 0, 0, 1, 73, 16, 0, 0, 0, 0, 0, 219,249,86, 0, 0, 0, 0, 0, 0, 232,8, 0, 0, 0, 0, 0, 17, 65, 4, 1, 0, 0, 0, 0, 8, 32, 14, 0, + 0, 0, 0, 0, 16, 96, 0, 0, 0, 0, 0, 0, 25, 8, 0, 0, 0, 0, 0, 0, 8, 0, 12, 0, 0, 0, 0, 0, 0, 32, 8, 3, 0, 0, 0, 0, 130,0, 0, 0, + 0, 0, 0, 0, 17, 1, 32, 0, 0, 0, 0, 0, 25, 121,26, 0, 16, 0, 0, 0, 8, 16, 86, 0, 0, 0, 0, 0, 144,0, 4, 0, 0, 0, 0, 0, 1, 21, 20, 0, + 0, 0, 0, 0, 95, 126,142,2, 0, 0, 0, 0, 19, 73, 4, 1, 0, 0, 0, 0, 24, 0, 6, 1, 0, 112,32, 0, 0, 0, 4, 0, 0, 0, 0, 0, 48, 32, 64, 0, + 0, 0, 0, 0, 19, 1, 28, 0, 0, 0, 0, 0, 0, 0, 6, 1, 0, 0, 0, 0, 25, 96, 6, 0, 0, 0, 0, 0, 156,72, 8, 0, 0, 0, 0, 0, 80, 33, 4, 1, + 0, 0, 0, 0, 25, 229,68, 0, 0, 0, 0, 0, 0, 34, 16, 0, 0, 0, 0, 0, 145,77, 22, 0, 0, 0, 0, 0, 0, 40, 2, 1, 0, 0, 0, 0, 8, 56, 70, 1, + 0, 32, 0, 0, 0, 25, 36, 1, 0, 0, 0, 0, 0, 96, 0, 1, 0, 0, 0, 0, 96, 56, 0, 0, 0, 0, 0, 0, 191,125,127,3, 0, 0, 0, 0, 111,127,14, 3, + 0, 0, 0, 0, 76, 64, 0, 0, 0, 0, 0, 0, 144,1, 0, 0, 0, 32, 0, 0, 8, 0, 4, 0, 0, 0, 0, 0, 133,68, 20, 0, 0, 0, 0, 0, 145,69, 0, 0, + 0, 0, 0, 0, 2, 0, 64, 0, 0, 0, 0, 0, 145,113,82, 1, 0, 0, 0, 0, 4, 0, 20, 0, 0, 0, 0, 0, 1, 40, 34, 0, 0, 0, 0, 0, 1, 0, 6, 0, + 0, 0, 0, 0, 4, 48, 6, 0, 0, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 36, 0, 6, 2, 0, 0, 0, 0, 49, 32, 78, 3, 0, 0, 0, 0, 69, 36, 28, 0, + 0, 0, 0, 0, 17, 128,0, 0, 0, 0, 0, 0, 149,65, 16, 0, 0, 32, 0, 0, 83, 209,86, 3, 0, 16, 0, 0, 72, 48, 14, 0, 0, 0, 0, 0, 17, 0, 6, 0, + 0, 0, 0, 0, 8, 38, 78, 3, 0, 0, 0, 0, 65, 0, 12, 0, 0, 0, 0, 0, 48, 96, 4, 0, 0, 64, 0, 0, 69, 0, 8, 0, 0, 0, 0, 0, 68, 96, 88, 0, + 0, 96, 0, 0, 9, 64, 12, 1, 0, 0, 0, 0, 68, 116,90, 1, 0, 0, 0, 0, 0, 4, 0, 1, 0, 0, 0, 0, 17, 73, 8, 0, 0, 0, 0, 0, 145,65, 18, 2, + 0, 0, 0, 0, 0, 0, 6, 2, 0, 0, 0, 0, 20, 20, 4, 0, 0, 0, 0, 0, 51, 176,0, 1, 0, 0, 0, 0, 5, 48, 6, 0, 0, 0, 0, 0, 255,103,125,3, + 0, 0, 0, 0, 197,41, 14, 0, 0, 32, 4, 0, 0, 48, 6, 0, 0, 0, 0, 0, 145,68, 2, 0, 0, 32, 0, 0, 213,217,94, 1, 0, 0, 0, 0, 64, 33, 6, 0, + 0, 0, 0, 0, 1, 32, 0, 2, 0, 0, 0, 0, 8, 25, 2, 0, 0, 0, 0, 0, 12, 32, 8, 0, 0, 48, 0, 0, 0, 64, 6, 0, 0, 0, 0, 0, 4, 40, 2, 0, + 0, 0, 0, 0, 196,4, 14, 3, 0, 0, 0, 0, 151,93, 20, 0, 0, 0, 0, 0, 2, 8, 4, 0, 0, 0, 0, 0, 5, 4, 4, 0, 0, 32, 0, 0, 0, 16, 4, 0, + 0, 0, 0, 0, 147,97, 22, 1, 0, 0, 0, 0, 8, 16, 6, 1, 0, 0, 0, 0, 0, 32, 68, 0, 0, 0, 0, 0, 128,65, 8, 1, 0, 0, 0, 0, 0, 32, 64, 0, + 0, 0, 0, 0, 8, 4, 10, 0, 0, 0, 0, 0, 4, 32, 64, 0, 0, 0, 0, 0, 0, 16, 100,0, 0, 0, 0, 0, 147,20, 8, 0, 0, 0, 0, 0, 0, 44, 0, 0, + 0, 0, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 145,0, 28, 0, 0, 0, 0, 0, 16, 0, 4, 2, 0, 0, 0, 0, 16, 16, 8, 0, 0, 0, 0, 0, 255,127,127,3, + 0, 0, 0, 0, 206,127,76, 1, 0, 0, 0, 0, 3, 65, 0, 1, 0, 0, 0, 0, 129,4, 16, 0, 0, 0, 0, 0, 64, 67, 4, 1, 0, 0, 0, 0, 0, 0, 100,0, + 0, 0, 0, 0, 133,0, 4, 0, 0, 0, 0, 0, 17, 65, 86, 1, 0, 0, 0, 0, 72, 40, 14, 2, 0, 0, 0, 0, 5, 32, 12, 0, 0, 0, 0, 0, 29, 40, 11, 0, + 0, 0, 0, 0, 1, 65, 14, 0, 0, 0, 0, 0, 1, 96, 4, 0, 0, 0, 0, 0, 21, 32, 14, 2, 0, 0, 0, 0, 0, 32, 30, 2, 0, 0, 0, 0, 145,77, 18, 2, + 0, 0, 0, 0, 145,97, 68, 0, 0, 0, 0, 0, 4, 12, 4, 0, 0, 0, 0, 0, 16, 56, 6, 0, 0, 0, 0, 0, 5, 40, 4, 0, 0, 0, 0, 0, 0, 9, 8, 0, + 0, 0, 0, 0, 42, 57, 14, 0, 0, 0, 0, 0, 1, 8, 0, 1, 0, 0, 0, 0, 11, 0, 8, 0, 0, 0, 0, 0, 48, 77, 16, 0, 0, 0, 0, 0, 145,81, 4, 0, + 0, 0, 0, 0, 0, 33, 6, 0, 0, 0, 0, 0, 8, 32, 6, 0, 0, 0, 0, 0, 31, 124,28, 0, 0, 0, 0, 0, 153,89, 20, 0, 0, 0, 0, 0, 24, 48, 14, 0, + 0, 0, 0, 0, 65, 4, 16, 0, 0, 0, 0, 0, 4, 0, 64, 0, 0, 0, 0, 0, 189,65, 92, 1, 0, 0, 0, 0, 6, 4, 30, 0, 0, 0, 0, 0, 66, 8, 46, 1, + 0, 0, 0, 0, 20, 48, 0, 0, 0, 0, 0, 0, 4, 8, 8, 0, 0, 0, 0, 0, 12, 120,5, 0, 0, 32, 0, 0, 17, 33, 4, 1, 0, 0, 0, 0, 5, 0, 4, 0, + 0, 0, 0, 0, 145,65, 20, 1, 0, 0, 0, 0, 70, 44, 12, 2, 0, 0, 0, 0, 0, 76, 16, 0, 0, 0, 0, 0, 68, 0, 1, 0, 0, 8, 0, 0, 28, 41, 14, 0, + 0, 0, 0, 0, 81, 0, 12, 0, 0, 0, 0, 0, 87, 104,12, 0, 0, 0, 0, 0, 1, 32, 6, 0, 0, 0, 0, 0, 4, 113,76, 0, 0, 32, 0, 0, 0, 48, 12, 0, + 0, 0, 0, 0, 149,101,88, 0, 0, 0, 0, 0, 0, 96, 24, 0, 0, 144,0, 0, 215,127,22, 3, 0, 0, 0, 0, 16, 44, 2, 0, 0, 0, 0, 0, 20, 1, 4, 0, + 0, 0, 0, 0, 56, 65, 0, 0, 0, 0, 0, 0, 2, 0, 12, 1, 0, 0, 0, 0, 0, 48, 64, 0, 0, 0, 0, 0, 0, 44, 68, 0, 0, 0, 0, 0, 24, 65, 0, 0, + 0, 0, 0, 0, 132,1, 0, 2, 0, 0, 0, 0, 37, 32, 12, 0, 0, 0, 0, 0, 4, 64, 4, 0, 0, 0, 0, 0, 255,109,95, 1, 0, 0, 0, 0, 145,72, 16, 0, + 0, 0, 0, 0, 138,56, 6, 1, 0, 32, 0, 0, 0, 40, 0, 0, 0, 224,40, 0, 0, 0, 4, 0, 0, 0, 0, 0, 4, 96, 0, 0, 0, 0, 0, 0, 49, 77, 0, 0, + 0, 0, 0, 0, 0, 16, 66, 0, 0, 0, 0, 0, 29, 42, 4, 0, 0, 0, 0, 0, 129,0, 4, 0, 0, 32, 0, 0, 25, 65, 0, 0, 0, 0, 0, 0, 21, 64, 4, 0, + 0, 0, 0, 0, 64, 1, 4, 0, 0, 32, 0, 0, 2, 0, 14, 0, 0, 0, 0, 0, 72, 0, 4, 0, 0, 0, 0, 0, 0, 48, 10, 0, 0, 32, 0, 0, 179,217,84, 0, + 0, 0, 0, 0, 64, 56, 2, 0, 0, 0, 0, 0, 0, 9, 14, 1, 0, 0, 0, 0, 16, 40, 12, 0, 0, 32, 0, 0, 0, 65, 4, 0, 0, 0, 0, 0, 8, 32, 10, 0, + 0, 0, 0, 0, 29, 104,0, 0, 0, 0, 0, 0, 64, 32, 68, 0, 0, 0, 0, 0, 1, 8, 10, 0, 0, 0, 0, 0, 255,125,94, 3, 0, 0, 0, 0, 1, 45, 46, 0, + 0, 0, 0, 0, 1, 24, 6, 1, 0, 0, 0, 0, 208,69, 30, 0, 0, 0, 0, 0, 80, 20, 4, 2, 0, 240,44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145,77, 20, 1, + 0, 0, 0, 0, 64, 56, 0, 0, 0, 0, 0, 0, 24, 41, 2, 1, 0, 0, 0, 0, 162,0, 4, 0, 0, 0, 0, 0, 16, 17, 12, 1, 0, 0, 0, 0, 146,64, 0, 0, + 0, 0, 0, 0, 85, 32, 4, 0, 0, 32, 0, 0, 109,16, 14, 0, 0, 0, 0, 0, 0, 65, 2, 0, 0, 0, 0, 0, 222,60, 142,2, 0, 0, 0, 0, 144,64, 16, 0, + 0, 0, 0, 0, 16, 73, 2, 0, 0, 0, 0, 0, 0, 60, 4, 0, 0, 0, 0, 0, 17, 48, 0, 0, 0, 0, 0, 0, 243,77, 0, 0, 0, 0, 0, 0, 8, 32, 8, 0, + 0, 0, 0, 0, 20, 28, 64, 0, 0, 0, 0, 0, 20, 1, 0, 2, 0, 0, 0, 0, 29, 44, 0, 0, 0, 0, 0, 0, 17, 9, 72, 0, 0, 0, 0, 0, 251,249,126,0, + 0, 0, 0, 0, 8, 56, 14, 0, 0, 0, 0, 0, 0, 8, 30, 2, 0, 0, 0, 0, 0, 41, 4, 0, 0, 0, 0, 0, 32, 32, 4, 0, 0, 0, 0, 0, 0, 32, 24, 0, + 0, 0, 0, 0, 136,17, 64, 0, 0, 0, 0, 0, 17, 97, 16, 3, 0, 0, 0, 0, 17, 9, 0, 2, 0, 160,0, 0, 39, 100,96, 0, 0, 96, 0, 0, 0, 0, 4, 0, + 0, 32, 8, 0, 2, 0, 0, 0, 0, 32, 0, 0, 2, 0, 0, 0, 0, 32, 32, 0, 2, 0, 0, 0, 0, 0, 0, 0, 245,36, 6, 0, 0, 0, 0, 0, 2, 2, 0, 0, + 0, 0, 0, 0, 33, 96, 6, 0, 0, 0, 0, 0, 16, 2, 4, 0, 0, 0, 0, 0, 32, 0, 0, 1, 16, 0, 0, 0, 255,255,255,3, 0, 0, 0, 0, 206,61, 62, 2, + 0, 96, 4, 0, 183,24, 84, 1, 0, 0, 0, 0, 8, 24, 6, 0, 0, 0, 0, 0, 16, 40, 68, 1, 0, 0, 0, 0, 16, 24, 4, 0, 0, 0, 0, 0, 154,65, 12, 0, + 0, 112,36, 0, 63, 53, 20, 1, 0, 0, 0, 0, 17, 8, 16, 0, 0, 0, 0, 0, 17, 80, 4, 0, 0, 0, 0, 0, 64, 32, 64, 0, 0, 224,16, 0, 144,4, 4, 0, + 0, 0, 0, 0, 0, 88, 8, 0, 0, 32, 4, 0, 0, 89, 4, 1, 0, 0, 0, 0, 147,249,30, 3, 0, 0, 0, 0, 48, 32, 8, 0, 0, 0, 0, 0, 0, 16, 4, 1, + 0, 0, 0, 0, 4, 0, 132,2, 0, 0, 0, 0, 0, 9, 0, 1, 0, 0, 0, 0, 238,186,174,0, 0, 0, 0, 0, 145,72, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 16, 1, 0, 32, 4, 0, 130,0, 12, 0, 0, 0, 0, 0, 18, 65, 0, 0, 0, 0, 0, 0, 17, 8, 10, 0, 0, 0, 0, 0, 0, 128,16, 0, + 0, 0, 0, 0, 149,100,122,2, 0, 0, 0, 0, 1, 8, 16, 0, 0, 0, 0, 0, 17, 24, 28, 0, 0, 0, 4, 0, 177,121,92, 1, 0, 0, 0, 0, 0, 56, 14, 1, + 0, 0, 0, 0, 138,0, 0, 0, 0, 32, 0, 0, 8, 24, 12, 0, 0, 0, 0, 0, 16, 48, 16, 0, 0, 0, 0, 0, 127,253,78, 2, 0, 0, 0, 0, 0, 0, 78, 0, + 0, 0, 0, 0, 16, 16, 64, 0, 0, 0, 0, 0, 17, 44, 34, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 20, 65, 4, 2, 0, 0, 0, 0, 4, 44, 18, 1, + 0, 0, 0, 0, 145,193,0, 0, 0, 0, 0, 0, 238,190,46, 2, 0, 0, 0, 0, 128,4, 2, 0, 0, 0, 0, 0, 21, 41, 80, 0, 0, 0, 0, 0, 144,72, 0, 1, + 0, 0, 0, 0, 148,0, 4, 1, 0, 0, 0, 0, 31, 1, 0, 2, 0, 160,5, 0, 86, 56, 12, 1, 0, 0, 0, 0, 132,0, 4, 0, 0, 0, 0, 0, 16, 88, 72, 0, + 0, 0, 0, 0, 128,72, 4, 2, 0, 32, 0, 0, 0, 2, 4, 1, 0, 0, 0, 0, 211,105,22, 0, 0, 0, 0, 0, 0, 32, 72, 1, 0, 0, 0, 0, 1, 48, 10, 0, + 0, 0, 0, 0, 0, 33, 4, 0, 0, 0, 0, 0, 0, 104,10, 0, 0, 0, 0, 0, 144,49, 0, 0, 0, 0, 0, 0, 17, 121,18, 1, 0, 0, 0, 0, 0, 168,34, 0, + 0, 0, 0, 0, 1, 56, 6, 0, 0, 0, 0, 0, 0, 48, 0, 2, 0, 0, 0, 0, 16, 21, 0, 0, 0, 0, 0, 0, 16, 5, 0, 0, 0, 0, 0, 0, 17, 57, 0, 0, + 0, 0, 0, 0, 8, 0, 68, 0, 0, 0, 0, 0, 92, 174,14, 1, 0, 0, 0, 0, 48, 21, 4, 0, 0, 0, 0, 0, 80, 40, 0, 0, 0, 0, 0, 0, 150,32, 68, 0, + 0, 0, 0, 0, 145,8, 2, 2, 0, 0, 0, 0, 85, 3, 0, 0, 0, 0, 0, 0, 145,5, 8, 0, 0, 0, 0, 0, 255,255,126,3, 0, 0, 0, 0, 34, 37, 14, 1, + 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 0, 0, 8, 16, 16, 0, 0, 0, 0, 0, 9, 48, 66, 3, 0, 0, 0, 0, 1, 73, 2, 1, 0, 0, 0, 0, 80, 64, 0, 0, + 0, 0, 0, 0, 5, 0, 17, 0, 0, 0, 0, 0, 8, 32, 32, 0, 0, 0, 0, 0, 29, 40, 44, 2, 0, 0, 0, 0, 40, 0, 52, 0, 0, 0, 0, 0, 25, 0, 4, 0, + 0, 32, 0, 0, 191,81, 126,1, 0, 32, 0, 0, 238,49, 46, 2, 0, 0, 0, 0, 76, 0, 8, 1, 0, 0, 0, 0, 8, 17, 0, 1, 0, 32, 0, 0, 225,48, 110,2, + 0, 0, 0, 0, 93, 224,44, 2, 0, 0, 0, 0, 73, 65, 0, 2, 0, 0, 0, 0, 144,0, 12, 0, 0, 0, 0, 0, 129,8, 8, 0, 0, 0, 0, 0, 4, 48, 77, 0, + 0, 0, 0, 0, 20, 112,4, 2, 0, 32, 0, 0, 3, 0, 0, 0, 0, 0, 1, 0, 37, 49, 122,0, 0, 0, 0, 0, 80, 0, 0, 1, 0, 0, 0, 0, 148,69, 8, 0, + 0, 0, 0, 0, 0, 32, 2, 1, 0, 0, 0, 0, 0, 0, 64, 2, 0, 0, 0, 0, 144,73, 70, 2, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 80, 0, 6, 0, + 0, 0, 0, 0, 8, 40, 0, 0, 0, 0, 0, 0, 19, 65, 18, 0, 0, 32, 0, 0, 255,111,124,3, 0, 0, 0, 0, 110,60, 62, 2, 0, 0, 0, 0, 24, 1, 0, 0, + 0, 0, 0, 0, 144,69, 0, 0, 0, 0, 0, 0, 16, 89, 0, 0, 0, 0, 0, 0, 17, 73, 28, 3, 0, 0, 0, 0, 128,40, 36, 0, 0, 0, 0, 0, 8, 8, 10, 0, + 0, 0, 0, 0, 68, 32, 140,0, 0, 0, 0, 0, 64, 8, 34, 0, 0, 0, 0, 0, 109,46, 60, 2, 0, 0, 0, 0, 4, 4, 136,0, 0, 0, 0, 0, 132,64, 12, 0, + 0, 0, 0, 0, 145,68, 28, 0, 0, 0, 0, 0, 0, 1, 20, 0, 0, 0, 0, 0, 77, 116,13, 0, 0, 0, 0, 0, 85, 0, 8, 0, 0, 0, 0, 0, 148,0, 0, 0, + 0, 0, 0, 0, 17, 64, 0, 2, 0, 0, 0, 0, 96, 0, 2, 0, 0, 0, 0, 0, 32, 0, 46, 1, 0, 0, 0, 0, 84, 96, 4, 0, 0, 0, 0, 0, 48, 0, 12, 0, + 0, 96, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 32, 33, 0, 1, 0, 0, 0, 0, 151,93, 8, 0, 0, 0, 0, 0, 145,73, 70, 3, 0, 0, 0, 0, 28, 0, 0, 0, + 0, 32, 0, 0, 17, 65, 4, 1, 0, 0, 0, 0, 16, 56, 2, 0, 0, 0, 0, 0, 80, 32, 0, 0, 0, 0, 0, 0, 9, 1, 0, 1, 0, 0, 0, 0, 64, 0, 92, 0, + 0, 16, 0, 0, 255,125,127,3, 0, 0, 0, 0, 0, 32, 30, 0, 0, 0, 0, 0, 144,1, 0, 3, 0, 0, 0, 0, 128,32, 2, 0, 0, 0, 0, 0, 64, 0, 128,0, + 0, 0, 0, 0, 105,32, 12, 3, 0, 0, 0, 0, 74, 1, 12, 0, 0, 0, 0, 0, 32, 37, 0, 0, 0, 0, 0, 0, 249,125,23, 0, 0, 0, 0, 0, 9, 48, 46, 1, + 0, 16, 0, 0, 16, 0, 12, 0, 0, 32, 0, 0, 17, 64, 12, 0, 0, 0, 0, 0, 32, 8, 0, 0, 0, 0, 0, 0, 64, 8, 16, 0, 0, 0, 0, 0, 16, 82, 8, 0, + 0, 0, 0, 0, 8, 24, 0, 0, 0, 0, 0, 0, 1, 100,12, 0, 0, 0, 0, 0, 160,0, 0, 0, 0, 0, 0, 0, 147,89, 20, 1, 0, 0, 0, 0, 2, 40, 2, 1, + 0, 0, 0, 0, 128,64, 8, 0, 0, 32, 0, 0, 17, 65, 16, 0, 0, 0, 0, 0, 16, 96, 8, 0, 0, 32, 0, 0, 81, 1, 4, 0, 0, 0, 0, 0, 1, 74, 2, 0, + 0, 0, 0, 0, 155,85, 28, 0, 0, 0, 0, 0, 14, 40, 30, 1, 0, 32, 0, 0, 17, 65, 16, 1, 0, 0, 0, 0, 132,64, 0, 0, 0, 0, 0, 0, 4, 9, 14, 1, + 0, 0, 0, 0, 21, 32, 8, 0, 0, 32, 2, 0, 4, 0, 2, 0, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 0, 0, 0, 32, 28, 0, 0, 0, 0, 0, 16, 68, 8, 0, + 0, 0, 0, 0, 0, 8, 8, 1, 0, 0, 0, 0, 89, 96, 4, 0, 0, 0, 0, 0, 5, 32, 4, 0, 0, 32, 0, 0, 128,16, 32, 0, 0, 0, 0, 0, 149,65, 8, 0, + 0, 0, 0, 0, 64, 16, 64, 0, 0, 0, 0, 0, 149,93, 22, 1, 0, 0, 0, 0, 64, 73, 0, 0, 0, 0, 0, 0, 16, 80, 0, 0, 0, 0, 0, 0, 16, 64, 4, 0, + 0, 0, 0, 0, 64, 40, 42, 2, 0, 0, 0, 0, 9, 1, 24, 0, 0, 0, 0, 0, 4, 0, 4, 2, 0, 0, 0, 0, 2, 24, 0, 0, 0, 0, 0, 0, 149,253,76, 2, + 0, 0, 0, 0, 0, 32, 66, 0, 0, 0, 0, 0, 21, 52, 10, 0, 0, 0, 0, 0, 24, 68, 0, 0, 0, 0, 0, 0, 19, 89, 0, 0, 0, 0, 0, 0, 0, 56, 10, 1, + 0, 0, 0, 0, 20, 32, 130,0, 0, 0, 0, 0, 50, 65, 68, 0, 0, 0, 0, 0, 1, 32, 32, 0, 0, 0, 0, 0, 181,87, 94, 2, 0, 32, 0, 0, 12, 52, 70, 0, + 0, 0, 4, 0, 17, 253,16, 1, 0, 0, 0, 0, 1, 8, 6, 1, 0, 0, 0, 0, 128,48, 0, 1, 0, 0, 0, 0, 20, 65, 0, 1, 0, 0, 0, 0, 149,121,6, 1, + 0, 0, 0, 0, 0, 40, 6, 0, 0, 0, 0, 0, 140,0, 0, 0, 16, 32, 0, 0, 16, 25, 12, 0, 0, 0, 0, 0, 65, 65, 4, 0, 0, 32, 0, 0, 19, 136,0, 0, + 0, 0, 0, 0, 16, 105,0, 0, 0, 0, 0, 0, 20, 60, 14, 1, 0, 0, 0, 0, 128,12, 0, 0, 0, 0, 0, 0, 144,40, 8, 0, 0, 0, 0, 0, 17, 9, 0, 1, + 0, 0, 0, 0, 0, 40, 34, 0, 0, 0, 0, 0, 17, 8, 4, 0, 0, 0, 0, 0, 16, 40, 4, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 68, 8, 8, 0, + 0, 0, 0, 0, 91, 108,14, 0, 0, 0, 0, 0, 1, 32, 10, 0, 0, 0, 0, 0, 25, 33, 0, 2, 0, 0, 0, 0, 1, 24, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, + 0, 0, 32, 0, 19, 67, 18, 0, 0, 0, 0, 0, 74, 63, 126,1, 0, 0, 0, 0, 0, 8, 40, 0, 0, 0, 0, 0, 72, 0, 20, 0, 0, 0, 0, 0, 73, 0, 24, 0, + 0, 0, 0, 0, 129,129,0, 0, 0, 0, 0, 0, 129,5, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 4, 1, 0, 1, 0, 0, 0, 0, 32, 2, 2, 0, + 0, 0, 0, 0, 0, 28, 68, 0, 0, 0, 0, 0, 0, 234,4, 0, 0, 0, 0, 0, 2, 154,12, 0, 0, 0, 0, 0, 255,255,238,3, 0, 0, 0, 0, 96, 124,46, 0, + 0, 0, 0, 0, 21, 69, 0, 1, 0, 0, 0, 0, 68, 36, 0, 0, 0, 0, 0, 0, 19, 73, 0, 1, 0, 0, 0, 0, 16, 9, 4, 1, 0, 0, 0, 0, 17, 8, 2, 0, + 0, 0, 0, 0, 65, 8, 0, 0, 0, 0, 0, 0, 5, 64, 0, 0, 0, 0, 0, 0, 64, 128,8, 0, 0, 0, 0, 0, 4, 4, 1, 0, 0, 0, 0, 0, 149,68, 16, 1, + 0, 0, 0, 0, 0, 164,4, 0, 0, 0, 0, 0, 16, 72, 6, 0, 0, 0, 0, 0, 32, 32, 16, 0, 0, 0, 0, 0, 177,57, 4, 0, 0, 0, 0, 0, 0, 1, 12, 0, + 0, 0, 0, 0, 0, 17, 2, 1, 0, 0, 0, 0, 89, 105,86, 0, 0, 0, 0, 0, 16, 9, 16, 1, 0, 0, 0, 0, 32, 0, 2, 0, 0, 0, 0, 0, 20, 32, 132,0, + 0, 0, 0, 0, 33, 40, 10, 2, 0, 0, 0, 0, 202,60, 110,2, 0, 0, 0, 0, 0, 36, 2, 0, 0, 0, 0, 0, 19, 13, 4, 0, 0, 0, 0, 0, 0, 4, 72, 0, + 0, 0, 0, 0, 36, 0, 2, 0, 0, 0, 0, 0, 4, 36, 0, 0, 0, 0, 0, 0, 49, 37, 32, 0, 0, 0, 0, 0, 22, 125,84, 1, 0, 0, 0, 0, 5, 32, 8, 0, + 0, 0, 0, 0, 148,1, 0, 0, 0, 0, 0, 0, 32, 1, 16, 0, 0, 0, 0, 0, 17, 8, 0, 1, 16, 32, 0, 0, 255,255,94, 0, 0, 0, 0, 0, 0, 25, 20, 0, + 0, 160,0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 17, 73, 18, 1, 0, 0, 0, 0, 10, 40, 4, 0, 0, 0, 0, 0, 3, 97, 4, 1, 0, 32, 1, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 78, 8, 8, 0, 0, 0, 0, 0, 8, 32, 96, 0, 0, 96, 4, 0, 64, 0, 4, 0, 0, 0, 0, 0, 9, 8, 0, 0, 0, 0, 0, 0, 25, 9, 22, 1, + 0, 0, 0, 0, 16, 96, 2, 0, 0, 0, 0, 0, 0, 48, 4, 1, 0, 0, 0, 0, 17, 64, 24, 0, 0, 0, 0, 0, 4, 4, 0, 1, 0, 0, 0, 0, 144,32, 0, 0, + 0, 0, 0, 0, 1, 0, 116,0, 0, 0, 0, 0, 4, 48, 128,0, 0, 0, 0, 0, 0, 96, 16, 0, 0, 0, 0, 0, 0, 8, 4, 1, 0, 0, 0, 0, 147,20, 24, 0, + 0, 0, 0, 0, 16, 65, 18, 1, 0, 0, 0, 0, 24, 32, 128,0, 0, 0, 0, 0, 16, 144,0, 0, 0, 0, 0, 0, 1, 88, 16, 0, 0, 0, 0, 0, 17, 96, 16, 0, + 0, 0, 0, 0, 0, 160,2, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 16, 1, 0, 0, 0, 0, 17, 81, 2, 0, 0, 32, 0, 0, 2, 0, 4, 0, + 0, 0, 0, 0, 95, 77, 12, 1, 0, 0, 0, 0, 66, 40, 12, 3, 0, 0, 0, 0, 17, 64, 2, 1, 0, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 16, 0, 24, 0, + 0, 0, 0, 0, 132,12, 6, 1, 0, 0, 0, 0, 5, 32, 6, 0, 0, 0, 0, 0, 80, 0, 4, 0, 0, 112,32, 0, 211,89, 20, 1, 0, 0, 0, 0, 34, 32, 2, 0, + 0, 0, 0, 0, 93, 32, 14, 1, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 85, 224,8, 0, 0, 32, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 8, 0, 1, + 0, 0, 0, 0, 4, 160,72, 0, 0, 96, 22, 0, 94, 6, 6, 0, 0, 0, 0, 0, 8, 0, 152,0, 0, 0, 0, 0, 2, 68, 8, 0, 0, 0, 0, 0, 0, 80, 0, 2, + 0, 160,0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 249,109,12, 3, 0, 0, 0, 0, 0, 16, 26, 1, 0, 0, 0, 0, 17, 1, 22, 0, 0, 0, 0, 0, 211,88, 4, 0, + 0, 32, 0, 0, 0, 64, 4, 0, 0, 0, 0, 0, 18, 96, 0, 0, 0, 0, 0, 0, 16, 73, 4, 1, 0, 0, 0, 0, 20, 32, 0, 0, 0, 0, 0, 0, 1, 41, 16, 2, + 0, 0, 0, 0, 253,189,78, 0, 0, 0, 0, 0, 16, 0, 32, 0, 0, 0, 0, 0, 12, 0, 12, 0, 0, 0, 0, 0, 128,1, 4, 0, 0, 0, 0, 0, 149,128,8, 1, + 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 0, 0, 17, 200,0, 0, 0, 0, 0, 0, 95, 127,30, 1, 0, 0, 0, 0, 49, 8, 64, 0, 16, 128,0, 0, 158,89, 76, 1, + 0, 0, 0, 0, 16, 8, 0, 1, 0, 0, 0, 0, 32, 40, 4, 0, 0, 0, 0, 0, 154,57, 4, 1, 0, 0, 0, 0, 0, 40, 12, 1, 0, 0, 0, 0, 161,16, 0, 0, + 0, 0, 0, 0, 0, 8, 2, 1, 0, 0, 0, 0, 132,72, 68, 0, 0, 0, 0, 0, 24, 145,70, 0, 0, 224,7, 0, 0, 0, 4, 0, 0, 32, 60, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 215,221,77, 0, 0, 0, 0, 0, 68, 33, 2, 0, 0, 0, 0, 0, 145,64, 16, 0, 0, 0, 0, 0, 128,0, 2, 1, 0, 0, 0, 0, 16, 68, 0, 0, + 0, 0, 0, 0, 20, 32, 8, 0, 0, 0, 0, 0, 4, 8, 134,0, 0, 0, 0, 0, 17, 100,0, 0, 0, 0, 0, 0, 128,8, 2, 0, 0, 0, 0, 0, 32, 130,0, 0, + 0, 32, 0, 0, 0, 128,6, 0, 0, 0, 0, 0, 64, 68, 0, 0, 0, 0, 0, 0, 64, 48, 16, 0, 0, 0, 0, 0, 17, 66, 0, 0, 0, 0, 0, 0, 64, 40, 8, 0, + 0, 8, 0, 0, 151,121,94, 2, 0, 96, 4, 0, 19, 1, 4, 1, 0, 96, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 24, 1, 0, 0, 0, 0, 16, 121,0, 1, + 0, 32, 0, 0, 32, 56, 6, 0, 0, 0, 0, 0, 18, 8, 0, 0, 0, 0, 0, 0, 21, 37, 16, 2, 0, 64, 0, 0, 149,192,0, 0, 0, 0, 0, 0, 0, 76, 0, 0, + 0, 0, 0, 0, 64, 44, 4, 0, 0, 0, 0, 0, 16, 24, 1, 0, 0, 4, 0, 0, 0, 16, 1, 0, 0, 0, 0, 0, 29, 65, 56, 1, 0, 0, 0, 0, 255,61, 190,3, + 0, 0, 0, 0, 128,69, 0, 0, 0, 224,39, 0, 255,251,78, 1, 0, 0, 0, 0, 10, 40, 6, 0, 0, 0, 0, 0, 1, 64, 128,1, 0, 0, 0, 0, 64, 0, 64, 0, + 0, 0, 0, 0, 8, 32, 14, 1, 0, 0, 0, 0, 0, 16, 72, 0, 0, 0, 0, 0, 20, 32, 4, 0, 0, 0, 0, 0, 8, 0, 2, 1, 0, 0, 0, 0, 64, 33, 2, 0, + 0, 0, 0, 0, 0, 160,16, 0, 0, 0, 0, 0, 147,80, 24, 0, 0, 0, 0, 0, 0, 128,64, 0, 0, 0, 0, 0, 25, 1, 8, 1, 0, 96, 2, 0, 8, 48, 6, 2, + 0, 0, 0, 0, 64, 80, 0, 0, 0, 0, 0, 0, 16, 2, 0, 0, 0, 32, 0, 0, 3, 96, 0, 0, 0, 0, 0, 0, 12, 44, 6, 2, 0, 0, 0, 0, 16, 41, 4, 0, + 0, 32, 0, 0, 6, 56, 70, 1, 0, 0, 0, 0, 8, 8, 6, 1, 0, 0, 0, 0, 124,36, 13, 2, 0, 0, 0, 0, 145,196,0, 0, 0, 0, 0, 0, 49, 0, 0, 0, + 0, 0, 0, 0, 49, 65, 0, 1, 0, 32, 0, 0, 17, 89, 20, 1, 0, 0, 0, 0, 20, 4, 0, 0, 0, 0, 0, 0, 80, 33, 0, 0, 0, 0, 0, 0, 148,141,12, 2, + 0, 0, 0, 0, 192,0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 133,32, 8, 2, 0, 0, 0, 0, 16, 41, 0, 0, 0, 0, 0, 0, 20, 16, 100,0, + 0, 32, 1, 0, 8, 6, 6, 0, 0, 0, 0, 0, 221,53, 126,1, 0, 0, 0, 0, 4, 4, 28, 2, 0, 0, 0, 0, 1, 17, 0, 0, 0, 0, 0, 0, 12, 132,8, 0, + 0, 0, 0, 0, 52, 56, 64, 0, 0, 0, 0, 0, 140,52, 0, 0, 0, 0, 0, 0, 144,64, 4, 0, 0, 0, 0, 0, 16, 17, 0, 1, 0, 0, 0, 0, 16, 8, 8, 0, + 0, 0, 0, 0, 220,184,172,2, 0, 0, 0, 0, 0, 4, 6, 0, 0, 0, 0, 0, 16, 132,0, 0, 0, 0, 0, 0, 92, 36, 12, 0, 0, 32, 0, 0, 49, 57, 12, 0, + 0, 32, 0, 0, 17, 1, 4, 1, 0, 0, 0, 0, 128,4, 12, 0, 0, 32, 8, 0, 48, 0, 0, 0, 0, 0, 0, 0, 132,0, 0, 2, 0, 0, 0, 0, 255,117,254,1, + 0, 0, 0, 0, 128,4, 4, 2, 0, 0, 0, 0, 147,25, 4, 1, 0, 0, 0, 0, 10, 16, 4, 0, 0, 0, 0, 0, 50, 4, 0, 0, 0, 0, 0, 0, 64, 64, 4, 0, + 0, 0, 0, 0, 122,20, 5, 0, 0, 0, 0, 0, 72, 1, 4, 0, 0, 32, 0, 0, 1, 8, 6, 0, 0, 0, 0, 0, 8, 144,2, 0, 0, 32, 4, 0, 211,73, 78, 1, + 0, 0, 0, 0, 129,0, 88, 0, 0, 0, 0, 0, 114,1, 5, 0, 0, 0, 0, 0, 52, 0, 4, 0, 0, 0, 0, 0, 64, 33, 4, 0, 0, 0, 0, 0, 178,243,28, 0, + 0, 0, 0, 0, 128,64, 4, 0, 0, 0, 0, 0, 190,49, 30, 0, 0, 240,63, 0, 127,251,78, 1, 0, 240,23, 0, 0, 0, 0, 0, 0, 240,19, 0, 0, 0, 0, 0, + 0, 208,1, 0, 0, 0, 0, 0, 0, 64, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 128,1, 0, 0, 0, 0, 16, 64, 18, 0, 0, 0, 0, 0, 16, 32, 6, 0, + 0, 0, 0, 0, 0, 32, 128,0, 0, 96, 0, 0, 144,20, 12, 1, 0, 0, 0, 0, 0, 65, 8, 0, 0, 0, 0, 0, 147,133,4, 0, 0, 0, 0, 0, 34, 4, 12, 0, + 0, 32, 1, 0, 16, 24, 4, 0, 0, 0, 0, 0, 2, 0, 14, 0, 0, 0, 0, 0, 24, 8, 12, 2, 0, 0, 0, 0, 33, 0, 224,0, 0, 224,10, 0, 0, 148,0, 0, + 0, 144,18, 0, 0, 0, 0, 0, 0, 16, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 16, 4, 0, 0, 0, 0, 0, 204,60, 46, 2, 0, 0, 0, 0, 0, 1, 64, 1, + 0, 0, 0, 0, 8, 16, 12, 0, 0, 0, 0, 0, 16, 25, 70, 0, 0, 0, 0, 0, 48, 1, 4, 0, 0, 0, 0, 0, 176,57, 70, 1, 0, 112,4, 0, 31, 95, 30, 3, + 0, 0, 0, 0, 44, 36, 0, 0, 0, 0, 0, 0, 18, 73, 4, 1, 0, 32, 0, 0, 16, 106,8, 0, 0, 96, 3, 0, 90, 82, 44, 1, 0, 0, 0, 0, 4, 36, 10, 0, + 0, 0, 0, 0, 21, 32, 0, 0, 0, 32, 0, 0, 2, 8, 64, 0, 0, 0, 0, 0, 16, 89, 8, 0, 0, 0, 0, 0, 149,92, 4, 2, 0, 0, 0, 0, 64, 32, 4, 0, + 0, 0, 0, 0, 0, 140,0, 0, 0, 0, 0, 0, 17, 33, 16, 0, 0, 0, 0, 0, 144,88, 6, 0, 0, 0, 0, 0, 0, 56, 2, 0, 0, 0, 0, 0, 249,125,66, 3, + 0, 0, 0, 0, 128,20, 2, 1, 0, 0, 0, 0, 65, 56, 6, 1, 0, 0, 0, 0, 52, 40, 6, 0, 0, 8, 0, 0, 0, 48, 34, 0, 0, 0, 0, 0, 226,8, 68, 0, + 0, 0, 0, 0, 206,253,62, 1, 0, 0, 0, 0, 16, 16, 128,0, 0, 0, 0, 0, 4, 4, 2, 0, 0, 0, 0, 0, 16, 13, 0, 0, 0, 0, 0, 0, 24, 1, 4, 0, + 0, 0, 0, 0, 67, 113,4, 0, 0, 0, 0, 0, 148,193,0, 0, 0, 0, 0, 0, 68, 32, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 217,105,22, 1, + 0, 0, 0, 0, 20, 32, 14, 2, 0, 0, 0, 0, 0, 4, 0, 2, 0, 0, 0, 0, 17, 9, 20, 1, 0, 0, 0, 0, 20, 16, 12, 0, 0, 0, 0, 0, 25, 121,22, 0, + 0, 0, 0, 0, 4, 57, 10, 0, 0, 0, 0, 0, 1, 96, 0, 0, 0, 0, 0, 0, 17, 21, 4, 0, 0, 0, 0, 0, 0, 32, 10, 1, 0, 0, 0, 0, 2, 4, 0, 0, + 0, 0, 0, 0, 17, 49, 0, 0, 0, 0, 0, 0, 93, 44, 44, 0, 0, 0, 0, 0, 9, 0, 6, 0, 0, 0, 0, 0, 0, 144,4, 0, 0, 0, 8, 0, 0, 64, 0, 0, + 0, 0, 0, 0, 20, 10, 60, 0, 0, 0, 0, 0, 17, 68, 0, 0, 0, 0, 0, 0, 17, 88, 20, 0, 0, 0, 0, 0, 125,125,60, 3, 0, 0, 0, 0, 72, 32, 10, 1, + 0, 0, 0, 0, 8, 64, 8, 0, 0, 0, 0, 0, 49, 125,94, 0, 0, 0, 0, 0, 21, 8, 0, 0, 0, 0, 0, 0, 2, 38, 110,1, 0, 0, 0, 0, 0, 0, 112,0, + 0, 0, 0, 0, 85, 96, 40, 0, 0, 0, 0, 0, 0, 4, 16, 0, 0, 0, 0, 0, 88, 0, 4, 0, 0, 0, 0, 0, 19, 81, 4, 1, 0, 0, 0, 0, 20, 32, 2, 0, + 0, 0, 0, 0, 84, 32, 132,0, 0, 0, 0, 0, 4, 16, 128,2, 0, 0, 0, 0, 64, 32, 10, 0, 0, 0, 0, 0, 145,64, 8, 0, 0, 0, 0, 0, 16, 65, 4, 2, + 0, 0, 0, 0, 83, 149,4, 2, 0, 0, 0, 0, 17, 65, 20, 1, 0, 0, 0, 0, 12, 0, 6, 1, 0, 32, 0, 0, 64, 80, 4, 0, 0, 0, 0, 0, 255,103,124,3, + 0, 0, 0, 0, 76, 185,110,0, 0, 0, 0, 0, 0, 96, 0, 2, 0, 16, 32, 0, 145,65, 22, 1, 0, 0, 0, 0, 64, 32, 2, 0, 0, 0, 0, 0, 8, 0, 34, 0, + 0, 32, 0, 0, 170,184,14, 1, 0, 96, 4, 0, 0, 0, 4, 0, 0, 32, 4, 0, 0, 0, 12, 0, 0, 0, 0, 0, 80, 0, 2, 0, 0, 0, 0, 0, 145,73, 72, 0, + 0, 0, 0, 0, 1, 64, 32, 0, 0, 0, 0, 0, 48, 104,8, 0, 0, 0, 0, 0, 4, 32, 0, 1, 0, 0, 0, 0, 81, 65, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, + 0, 0, 0, 0, 17, 73, 0, 1, 0, 0, 0, 0, 1, 56, 46, 1, 0, 0, 0, 0, 52, 32, 64, 0, 0, 0, 0, 0, 18, 16, 112,0, 0, 0, 0, 0, 21, 65, 16, 0, + 0, 0, 0, 0, 16, 8, 2, 1, 0, 0, 0, 0, 68, 0, 6, 2, 0, 0, 0, 0, 254,255,14, 3, 0, 0, 0, 0, 16, 89, 4, 1, 0, 0, 0, 0, 128,68, 0, 0, + 0, 0, 0, 0, 0, 73, 0, 1, 0, 0, 0, 0, 17, 41, 4, 1, 0, 0, 0, 0, 151,93, 76, 0, 0, 0, 0, 0, 2, 16, 2, 0, 0, 0, 0, 0, 8, 48, 2, 0, + 0, 0, 0, 0, 147,1, 12, 0, 0, 0, 0, 0, 0, 64, 128,0, 0, 96, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 24, 1, 44, 0, 0, 0, 0, 0, 8, 32, 34, 0, + 0, 0, 0, 0, 2, 80, 0, 0, 0, 0, 1, 0, 16, 1, 0, 0, 0, 0, 0, 0, 25, 81, 0, 0, 0, 0, 0, 0, 145,0, 8, 0, 0, 0, 0, 0, 149,121,4, 1, + 0, 0, 0, 0, 19, 16, 6, 0, 0, 32, 0, 0, 0, 17, 8, 1, 0, 32, 4, 0, 4, 16, 4, 0, 0, 0, 0, 0, 129,4, 0, 0, 0, 0, 0, 0, 128,128,0, 0, + 0, 0, 0, 0, 95, 255,95, 3, 0, 0, 0, 0, 198,32, 140,0, 0, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 81, 107,64, 0, 0, 0, 0, 0, 1, 40, 6, 0, + 0, 0, 0, 0, 16, 4, 8, 0, 0, 0, 0, 0, 153,60, 6, 1, 0, 0, 0, 0, 145,121,20, 0, 0, 0, 0, 0, 5, 96, 5, 0, 0, 96, 0, 0, 16, 76, 0, 0, + 0, 0, 0, 0, 4, 32, 4, 0, 0, 64, 0, 0, 176,80, 28, 0, 0, 0, 0, 0, 1, 80, 2, 0, 0, 0, 0, 0, 170,52, 116,2, 0, 0, 0, 0, 21, 4, 0, 0, + 0, 0, 0, 0, 4, 0, 4, 1, 0, 0, 0, 0, 64, 24, 10, 0, 0, 0, 0, 0, 16, 24, 74, 0, 0, 0, 0, 0, 149,69, 8, 0, 0, 0, 0, 0, 128,105,0, 2, + 0, 0, 0, 0, 36, 178,36, 0, 0, 0, 0, 0, 149,253,77, 0, 0, 0, 0, 0, 4, 36, 6, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 129,65, 0, 0, + 0, 96, 0, 0, 16, 16, 4, 0, 0, 0, 0, 0, 32, 56, 2, 0, 0, 0, 0, 0, 17, 8, 6, 0, 0, 0, 0, 0, 0, 56, 192,0, 0, 160,1, 0, 153,89, 28, 1, + 0, 0, 0, 0, 17, 65, 66, 0, 0, 32, 32, 0, 0, 1, 0, 0, 0, 64, 0, 64, 157,100,126,2, 0, 0, 0, 0, 4, 4, 5, 0, 0, 0, 0, 0, 0, 9, 42, 0, + 0, 0, 0, 0, 17, 112,64, 1, 0, 0, 0, 0, 0, 8, 132,0, 0, 0, 0, 0, 85, 73, 22, 0, 0, 0, 0, 0, 0, 56, 130,0, 0, 0, 0, 0, 126,61, 111,3, + 0, 0, 0, 0, 129,69, 0, 0, 0, 0, 0, 0, 0, 0, 14, 1, 0, 0, 0, 0, 16, 75, 2, 0, 0, 0, 0, 0, 145,1, 16, 0, 0, 0, 0, 0, 1, 48, 12, 0, + 0, 0, 0, 0, 93, 73, 72, 0, 0, 0, 0, 0, 0, 0, 42, 3, 0, 0, 0, 0, 12, 8, 8, 0, 0, 0, 0, 0, 17, 9, 4, 1, 0, 0, 0, 0, 127,46, 15, 0, + 0, 0, 0, 0, 64, 33, 0, 1, 0, 0, 0, 0, 17, 64, 36, 0, 0, 0, 0, 0, 144,28, 29, 0, 0, 0, 0, 0, 148,65, 78, 0, 0, 0, 0, 0, 32, 40, 8, 0, + 0, 0, 0, 0, 16, 40, 9, 0, 0, 0, 0, 0, 16, 20, 0, 0, 0, 0, 0, 0, 16, 42, 2, 1, 0, 0, 0, 0, 17, 96, 4, 0, 0, 0, 0, 0, 221,61, 78, 3, + 0, 0, 0, 0, 8, 40, 6, 1, 0, 0, 0, 0, 0, 17, 4, 1, 0, 128,0, 0, 27, 1, 20, 0, 0, 0, 0, 0, 144,128,8, 0, 0, 0, 0, 0, 20, 89, 204,1, + 0, 0, 0, 0, 8, 8, 6, 0, 0, 32, 1, 0, 191,45, 92, 2, 0, 64, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 32, 6, 0, 0, 0, 0, 0, 17, 0, 12, 0, + 0, 0, 0, 0, 1, 32, 14, 0, 16, 8, 0, 0, 20, 64, 8, 0, 0, 0, 0, 0, 17, 81, 64, 3, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 12, 32, 0, 2, + 0, 32, 0, 0, 0, 0, 38, 0, 0, 64, 0, 0, 64, 0, 32, 0, 0, 48, 2, 0, 93, 105,90, 3, 0, 16, 0, 0, 8, 0, 0, 0, 16, 0, 0, 0, 255,127,255,3, + 0, 0, 0, 0, 144,0, 0, 2, 0, 0, 0, 0, 147,64, 20, 0, 0, 0, 0, 0, 149,5, 8, 1, 0, 0, 0, 0, 10, 8, 78, 1, 0, 0, 0, 0, 16, 25, 8, 0, + 0, 0, 0, 0, 18, 57, 4, 0, 0, 0, 0, 0, 16, 56, 10, 1, 0, 0, 0, 0, 2, 0, 6, 0, 0, 64, 0, 0, 187,249,78, 1, 0, 0, 0, 0, 16, 0, 16, 1, + 0, 0, 0, 0, 16, 32, 2, 1, 0, 0, 0, 0, 68, 32, 4, 0, 0, 32, 0, 0, 4, 0, 68, 0, 0, 0, 0, 0, 192,16, 4, 0, 0, 0, 0, 0, 32, 16, 0, 0, + 0, 0, 0, 0, 89, 0, 20, 0, 0, 0, 0, 0, 4, 160,0, 0, 0, 0, 0, 0, 72, 56, 12, 0, 0, 0, 0, 0, 16, 1, 68, 0, 0, 0, 0, 0, 49, 8, 4, 0, + 0, 32, 0, 0, 29, 9, 76, 1, 0, 0, 0, 0, 144,5, 4, 0, 0, 0, 0, 0, 42, 16, 6, 0, 0, 0, 0, 0, 151,216,84, 0, 0, 0, 0, 0, 253,101,28, 3, + 0, 0, 0, 0, 129,69, 16, 0, 0, 0, 0, 0, 4, 32, 8, 2, 0, 0, 0, 0, 17, 121,78, 1, 0, 0, 0, 0, 0, 104,16, 0, 0, 0, 0, 0, 24, 41, 70, 0, + 0, 32, 0, 0, 16, 32, 4, 0, 0, 32, 0, 0, 0, 56, 66, 0, 0, 240,30, 0, 0, 32, 0, 0, 0, 96, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 113,48, 4, 0, + 0, 0, 0, 0, 52, 68, 8, 0, 0, 0, 0, 0, 48, 105,0, 2, 0, 0, 0, 0, 182,77, 84, 0, 0, 0, 0, 0, 49, 1, 64, 1, 0, 0, 0, 0, 1, 8, 22, 1, + 0, 0, 0, 0, 0, 0, 130,0, 0, 0, 0, 0, 20, 8, 0, 0, 0, 0, 0, 0, 149,129,92, 2, 0, 0, 0, 0, 0, 1, 128,0, 0, 0, 0, 0, 92, 60, 12, 0, + 0, 0, 0, 0, 58, 1, 68, 0, 0, 0, 0, 0, 12, 0, 8, 0, 0, 32, 0, 0, 136,40, 6, 0, 0, 96, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 24, 40, 0, 0, + 0, 0, 0, 0, 26, 24, 12, 0, 0, 0, 0, 0, 17, 73, 0, 2, 0, 0, 0, 0, 17, 40, 0, 0, 0, 32, 0, 0, 16, 9, 0, 0, 0, 0, 0, 0, 255,125,126,3, + 0, 0, 0, 0, 12, 52, 30, 2, 0, 0, 0, 0, 33, 16, 76, 1, 0, 32, 0, 0, 59, 97, 92, 0, 0, 0, 0, 0, 66, 0, 64, 0, 0, 0, 0, 0, 48, 128,68, 0, + 0, 0, 0, 0, 17, 9, 12, 1, 0, 0, 0, 0, 8, 8, 128,0, 0, 0, 0, 0, 148,68, 0, 0, 0, 0, 0, 0, 18, 33, 8, 0, 0, 0, 0, 0, 128,48, 70, 0, + 0, 0, 0, 0, 140,56, 6, 2, 0, 0, 0, 0, 17, 73, 4, 0, 0, 0, 0, 0, 17, 80, 16, 0, 0, 0, 0, 0, 17, 80, 0, 2, 0, 0, 0, 0, 248,40, 44, 2, + 0, 0, 0, 0, 68, 0, 8, 0, 0, 0, 0, 0, 146,28, 80, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 0, 0, 1, 2, 4, 0, 0, 0, 0, 0, 83, 48, 4, 0, + 0, 0, 0, 0, 221,97, 12, 0, 0, 32, 4, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 20, 6, 0, 0, 0, 0, 0, 4, 49, 2, 0, 0, 0, 0, 0, 16, 33, 0, 0, + 0, 32, 0, 0, 33, 104,68, 2, 0, 0, 0, 0, 148,108,12, 0, 0, 0, 0, 0, 129,72, 8, 2, 0, 0, 0, 0, 72, 32, 0, 0, 0, 32, 0, 0, 128,80, 4, 0, + 0, 0, 0, 0, 16, 33, 8, 0, 0, 0, 0, 0, 65, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 150,129,12, 0, 0, 0, 0, 0, 144,97, 0, 0, + 0, 0, 0, 0, 1, 4, 4, 0, 0, 0, 2, 0, 223,122,172,2, 0, 0, 0, 0, 64, 33, 18, 0, 0, 96, 2, 0, 127,254,76, 2, 0, 0, 0, 0, 20, 0, 64, 0, + 0, 0, 0, 0, 144,4, 4, 0, 0, 32, 0, 0, 144,56, 68, 1, 0, 0, 0, 0, 8, 8, 10, 1, 0, 0, 0, 0, 89, 139,68, 0, 0, 0, 0, 0, 65, 32, 68, 0, + 0, 0, 0, 0, 10, 0, 4, 0, 0, 0, 0, 0, 176,49, 64, 0, 0, 32, 0, 0, 168,176,78, 0, 0, 32, 0, 0, 0, 64, 8, 0, 0, 0, 0, 0, 232,40, 22, 0, + 0, 0, 0, 0, 20, 9, 4, 0, 0, 0, 0, 0, 16, 96, 8, 2, 0, 0, 0, 0, 209,57, 20, 0, 0, 0, 0, 0, 17, 65, 8, 0, 0, 32, 0, 0, 178,120,68, 0, + 0, 0, 0, 0, 144,72, 0, 0, 0, 16, 0, 0, 0, 32, 16, 0, 0, 0, 0, 0, 177,24, 4, 0, 0, 0, 0, 0, 93, 45, 12, 0, 0, 0, 0, 0, 81, 9, 0, 2, + 0, 0, 0, 0, 64, 0, 6, 1, 0, 0, 0, 0, 145,25, 4, 0, 0, 0, 0, 0, 4, 32, 16, 0, 0, 0, 0, 0, 144,24, 4, 0, 0, 0, 0, 0, 32, 72, 0, 0, + 0, 0, 0, 0, 22, 76, 12, 0, 0, 0, 0, 0, 16, 9, 0, 1, 0, 0, 0, 0, 0, 40, 64, 0, 0, 32, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 21, 225,12, 2, + 0, 32, 0, 0, 17, 121,4, 0, 0, 0, 0, 0, 144,33, 8, 0, 0, 0, 0, 0, 255,255,222,3, 0, 0, 0, 0, 191,57, 118,1, 0, 0, 0, 0, 128,1, 72, 0, + 0, 0, 0, 0, 149,5, 0, 0, 0, 0, 0, 0, 146,249,124,0, 0, 0, 0, 0, 130,0, 4, 1, 0, 0, 0, 0, 187,117,14, 3, 0, 0, 0, 0, 0, 40, 22, 1, + 0, 0, 0, 0, 80, 32, 4, 0, 0, 0, 0, 0, 68, 36, 2, 0, 0, 0, 0, 0, 0, 17, 4, 0, 0, 0, 0, 0, 32, 24, 0, 0, 0, 0, 0, 0, 73, 40, 2, 0, + 0, 0, 0, 0, 17, 5, 4, 0, 0, 0, 0, 0, 2, 32, 2, 0, 0, 0, 0, 0, 1, 9, 0, 0, 0, 0, 0, 0, 59, 153,68, 0, 0, 0, 0, 0, 125,37, 204,2, + 0, 0, 0, 0, 0, 68, 8, 0, 0, 0, 0, 0, 12, 20, 0, 2, 0, 0, 0, 0, 0, 17, 68, 1, 0, 0, 0, 0, 184,89, 100,0, 0, 32, 0, 0, 0, 32, 6, 0, + 0, 32, 0, 0, 128,5, 32, 0, 0, 0, 0, 0, 176,0, 4, 0, 0, 4, 0, 0, 148,53, 12, 0, 0, 0, 0, 0, 64, 64, 16, 0, 0, 0, 0, 0, 17, 80, 0, 0, + 0, 0, 0, 0, 144,16, 8, 2, 0, 96, 0, 0, 128,40, 12, 0, 0, 0, 0, 0, 200,53, 68, 0, 0, 0, 0, 0, 27, 57, 4, 1, 0, 96, 0, 0, 62, 105,70, 1, + 0, 32, 32, 0, 2, 64, 104,0, 0, 0, 0, 0, 0, 44, 4, 0, 0, 0, 0, 0, 254,63, 156,3, 0, 0, 0, 0, 149,5, 0, 2, 0, 96, 4, 0, 0, 8, 68, 1, + 0, 0, 0, 0, 144,49, 4, 0, 0, 0, 0, 0, 68, 48, 6, 0, 0, 0, 0, 0, 208,16, 0, 0, 0, 0, 0, 0, 209,56, 0, 0, 0, 0, 0, 0, 0, 34, 4, 0, + 0, 0, 0, 0, 51, 25, 68, 0, 0, 0, 0, 0, 4, 8, 16, 0, 0, 0, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 127,119,12, 2, 0, 0, 0, 0, 17, 9, 10, 0, + 0, 0, 0, 0, 5, 9, 10, 1, 0, 0, 0, 0, 1, 16, 10, 0, 0, 32, 0, 0, 10, 0, 76, 0, 0, 0, 0, 0, 4, 68, 104,0, 0, 0, 0, 0, 148,69, 29, 0, + 0, 0, 0, 0, 16, 9, 68, 1, 0, 0, 0, 0, 81, 73, 20, 0, 0, 0, 0, 0, 93, 125,28, 0, 0, 96, 0, 0, 9, 32, 12, 0, 0, 0, 0, 0, 81, 32, 8, 0, + 0, 0, 0, 0, 0, 160,0, 2, 0, 0, 0, 0, 16, 64, 16, 1, 0, 0, 0, 0, 64, 32, 4, 2, 0, 64, 0, 0, 133,52, 0, 0, 0, 0, 0, 0, 255,255,191,3, + 0, 96, 60, 0, 139,16, 4, 0, 0, 32, 0, 0, 66, 0, 4, 0, 0, 0, 0, 0, 149,69, 20, 3, 0, 0, 0, 0, 145,73, 16, 0, 0, 0, 0, 0, 0, 4, 10, 1, + 0, 0, 0, 0, 147,125,76, 0, 0, 0, 0, 0, 0, 56, 18, 0, 0, 48, 0, 0, 179,121,78, 1, 0, 0, 0, 0, 0, 40, 10, 1, 0, 32, 0, 0, 128,0, 12, 0, + 0, 0, 0, 0, 8, 0, 70, 1, 0, 32, 0, 0, 128,68, 8, 0, 0, 0, 0, 0, 17, 4, 0, 1, 0, 0, 1, 0, 217,125,118,3, 0, 0, 0, 0, 0, 132,0, 1, + 0, 0, 0, 0, 145,73, 4, 1, 0, 32, 0, 0, 128,0, 4, 0, 0, 240,43, 0, 14, 8, 12, 1, 0, 0, 0, 0, 0, 34, 6, 0, 0, 0, 0, 0, 196,56, 14, 0, + 0, 0, 0, 0, 80, 8, 0, 0, 0, 0, 0, 0, 16, 104,0, 0, 0, 0, 0, 0, 73, 65, 42, 0, 0, 0, 0, 0, 68, 1, 4, 0, 0, 0, 0, 0, 33, 68, 8, 0, + 0, 0, 0, 0, 17, 69, 20, 1, 0, 32, 0, 0, 0, 8, 0, 1, 0, 32, 8, 0, 16, 0, 4, 0, 0, 0, 0, 0, 8, 0, 10, 1, 0, 96, 1, 0, 2, 0, 4, 0, + 0, 64, 4, 0, 0, 16, 0, 0, 0, 0, 0, 0, 211,121,12, 1, 0, 0, 0, 0, 66, 32, 10, 1, 0, 32, 0, 0, 16, 16, 4, 1, 0, 0, 0, 0, 2, 0, 4, 1, + 0, 0, 0, 0, 17, 91, 2, 0, 0, 0, 0, 0, 20, 44, 12, 0, 0, 0, 0, 0, 16, 1, 20, 0, 0, 0, 0, 0, 129,97, 16, 0, 0, 0, 0, 0, 145,69, 2, 0, + 0, 0, 0, 0, 127,127,76, 0, 0, 0, 0, 0, 196,32, 74, 0, 0, 0, 0, 0, 4, 52, 4, 0, 0, 0, 0, 0, 144,9, 0, 1, 0, 0, 0, 0, 253,241,86, 1, + 0, 224,30, 0, 64, 0, 4, 0, 0, 0, 0, 0, 0, 1, 76, 0, 0, 32, 0, 0, 0, 129,12, 0, 0, 0, 0, 0, 16, 96, 44, 0, 0, 96, 0, 0, 144,0, 0, 0, + 0, 32, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 4, 0, 100,0, 0, 0, 0, 0, 17, 16, 2, 0, 0, 0, 0, 0, 243,144,4, 0, 0, 0, 0, 0, 1, 8, 2, 1, + 0, 0, 0, 0, 17, 5, 20, 1, 0, 0, 0, 0, 95, 37, 28, 3, 0, 0, 0, 0, 144,68, 0, 0, 0, 0, 0, 0, 17, 9, 14, 1, 0, 0, 0, 0, 66, 96, 4, 0, + 0, 0, 0, 0, 3, 8, 78, 0, 0, 0, 0, 0, 149,73, 0, 1, 0, 96, 0, 0, 0, 16, 4, 0, 0, 0, 0, 0, 17, 67, 6, 3, 0, 0, 0, 0, 0, 40, 8, 1, + 0, 0, 0, 0, 8, 49, 4, 0, 0, 0, 0, 0, 255,255,127,3, 0, 0, 0, 0, 0, 36, 28, 0, 0, 0, 0, 0, 17, 65, 6, 1, 0, 0, 0, 0, 144,5, 0, 2, + 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 0, 0, 81, 81, 68, 2, 0, 0, 0, 0, 20, 32, 12, 0, 0, 0, 0, 0, 1, 40, 12, 0, 0, 0, 0, 0, 4, 0, 132,0, + 0, 0, 0, 0, 219,121,30, 1, 0, 0, 0, 0, 16, 104,14, 1, 0, 0, 0, 0, 0, 20, 12, 0, 0, 0, 0, 0, 1, 112,4, 1, 0, 0, 0, 0, 64, 48, 0, 0, + 0, 0, 0, 0, 85, 32, 6, 0, 0, 0, 0, 0, 153,89, 4, 0, 0, 0, 0, 0, 16, 8, 14, 1, 0, 0, 0, 0, 17, 193,12, 1, 0, 0, 0, 0, 64, 160,0, 2, + 0, 0, 0, 0, 0, 1, 76, 1, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 0, 145,73, 92, 0, 0, 0, 0, 0, 2, 176,22, 0, 0, 0, 0, 0, 8, 9, 14, 1, + 0, 0, 0, 0, 16, 1, 104,0, 0, 0, 0, 0, 49, 65, 20, 1, 0, 0, 0, 0, 64, 8, 6, 0, 0, 0, 0, 0, 92, 40, 12, 0, 0, 0, 0, 0, 0, 8, 84, 0, + 0, 0, 0, 0, 21, 73, 8, 0, 0, 0, 0, 0, 16, 65, 4, 1, 0, 0, 0, 0, 148,121,12, 0, 0, 0, 0, 0, 0, 8, 16, 1, 0, 0, 0, 0, 159,93, 93, 3, + 0, 0, 0, 0, 12, 48, 6, 1, 0, 0, 0, 0, 51, 125,98, 1, 0, 0, 0, 0, 152,8, 6, 1, 0, 0, 0, 0, 24, 32, 0, 0, 0, 0, 0, 0, 8, 4, 6, 0, + 0, 0, 0, 0, 80, 4, 0, 0, 0, 0, 0, 0, 18, 144,64, 0, 0, 0, 0, 0, 21, 93, 8, 1, 0, 0, 0, 0, 17, 73, 4, 1, 0, 240,52, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 149,124,30, 3, 0, 0, 0, 0, 14, 41, 16, 1, 0, 32, 0, 0, 16, 5, 0, 1, 0, 0, 0, 0, 1, 104,18, 0, 0, 0, 0, 0, 35, 0, 0, 0, + 0, 32, 0, 0, 179,253,14, 2, 0, 0, 0, 0, 0, 65, 4, 0, 0, 32, 0, 0, 54, 57, 68, 1, 0, 0, 0, 0, 16, 12, 0, 0, 0, 0, 0, 0, 3, 8, 8, 0, + 0, 0, 0, 0, 21, 65, 20, 0, 0, 0, 0, 0, 147,65, 16, 2, 0, 0, 0, 0, 53, 85, 68, 3, 0, 0, 0, 0, 8, 72, 6, 0, 0, 0, 0, 0, 255,253,94, 2, + 0, 0, 0, 0, 2, 58, 6, 0, 0, 0, 0, 0, 17, 1, 20, 0, 0, 0, 0, 0, 89, 64, 24, 0, 0, 0, 0, 0, 89, 106,16, 0, 0, 0, 0, 0, 16, 0, 28, 0, + 0, 0, 0, 0, 4, 16, 4, 0, 144,252,13, 0, 255,255,255,3, 128,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 1, 32, 0, 0, 0, 0, 0, 9, 128,0, 0, + 0, 16, 0, 0, 0, 8, 2, 0, 0, 0, 0, 0, 8, 0, 1, 0, 0, 64, 0, 0, 255,255,255,3, 0, 0, 0, 0, 0, 56, 8, 0, 0, 0, 1, 0, 27, 73, 22, 0, + 0, 0, 0, 0, 72, 56, 14, 0, 0, 0, 0, 0, 20, 0, 2, 0, 0, 0, 0, 0, 6, 8, 2, 2, 0, 0, 0, 0, 1, 32, 8, 0, 0, 0, 0, 0, 10, 40, 0, 1, + 0, 32, 0, 0, 26, 0, 4, 0, 0, 32, 0, 0, 72, 16, 102,0, 0, 0, 0, 0, 0, 96, 78, 0, 0, 0, 0, 0, 64, 2, 0, 0, 0, 0, 0, 0, 0, 34, 2, 0, + 0, 0, 0, 0, 1, 104,0, 0, 0, 0, 0, 0, 149,69, 8, 1, 0, 0, 0, 0, 4, 204,8, 0, 0, 0, 0, 0, 16, 40, 18, 0, 0, 0, 0, 0, 2, 64, 1, 0, + 0, 8, 0, 0, 187,89, 82, 1, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 16, 73, 0, 1, 0, 0, 0, 0, 84, 0, 4, 0, 0, 0, 0, 0, 0, 56, 10, 0, + 0, 0, 0, 0, 133,0, 0, 2, 0, 0, 0, 0, 84, 8, 0, 2, 0, 0, 0, 0, 96, 0, 10, 1, 0, 0, 0, 0, 12, 40, 14, 2, 0, 0, 0, 0, 0, 168,16, 0, + 0, 0, 0, 0, 53, 72, 0, 0, 0, 0, 0, 0, 64, 0, 6, 0, 0, 0, 0, 0, 16, 33, 2, 1, 0, 0, 0, 0, 0, 4, 8, 1, 0, 0, 0, 0, 81, 41, 16, 0, + 0, 0, 0, 0, 40, 0, 6, 1, 0, 0, 0, 0, 0, 68, 2, 0, 0, 0, 0, 0, 5, 120,190,0, 0, 0, 0, 0, 32, 0, 0, 2, 16, 0, 0, 0, 80, 33, 4, 0, + 0, 0, 0, 0, 25, 96, 0, 0, 0, 0, 0, 0, 128,72, 0, 0, 0, 0, 0, 0, 17, 69, 16, 0, 0, 0, 0, 0, 255,253,122,3, 0, 0, 0, 0, 170,53, 106,1, + 0, 0, 0, 0, 1, 1, 2, 0, 0, 0, 0, 0, 19, 65, 16, 0, 0, 0, 0, 0, 64, 96, 14, 0, 0, 0, 0, 0, 33, 64, 24, 0, 0, 0, 0, 0, 17, 64, 66, 1, + 0, 0, 0, 0, 4, 1, 2, 0, 0, 0, 0, 0, 9, 65, 68, 0, 0, 0, 0, 0, 75, 48, 142,1, 0, 0, 0, 0, 126,178,140,2, 0, 0, 0, 0, 17, 0, 18, 0, + 0, 4, 0, 0, 33, 64, 0, 0, 0, 0, 0, 0, 145,0, 4, 0, 0, 16, 32, 0, 19, 113,20, 1, 0, 0, 0, 0, 202,113,78, 0, 0, 0, 0, 0, 0, 81, 0, 0, + 0, 0, 0, 0, 72, 98, 6, 3, 0, 0, 0, 0, 0, 64, 4, 1, 0, 0, 0, 0, 212,112,132,0, 0, 0, 0, 0, 65, 0, 4, 0, 0, 0, 0, 0, 0, 128,12, 0, + 0, 0, 0, 0, 32, 32, 84, 0, 0, 0, 0, 0, 16, 105,4, 0, 0, 0, 0, 0, 68, 224,94, 0, 0, 0, 0, 0, 20, 16, 0, 0, 0, 0, 0, 0, 145,64, 2, 0, + 0, 0, 0, 0, 66, 32, 0, 0, 0, 0, 0, 0, 0, 40, 14, 1, 0, 32, 4, 0, 64, 65, 0, 0, 0, 0, 0, 0, 0, 128,128,0, 16, 0, 0, 0, 63, 249,22, 0, + 0, 0, 0, 0, 84, 46, 6, 0, 0, 0, 0, 0, 89, 65, 0, 0, 0, 32, 4, 0, 0, 32, 4, 2, 0, 0, 0, 0, 0, 72, 64, 0, 0, 0, 0, 0, 13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 22, 0, 0, 32, 0, 0, 0, 122,2, 1, 0, 32, 0, 0, 50, 73, 12, 0, 0, 32, 0, 0, 0, 48, 76, 0, 0, 32, 0, 0, 0, 96, 16, 0, + 0, 112,44, 0, 0, 0, 4, 0, 0, 0, 0, 0, 28, 104,6, 0, 0, 0, 0, 0, 1, 73, 0, 0, 0, 0, 0, 0, 80, 32, 18, 0, 0, 16, 0, 0, 251,81, 28, 1, + 0, 0, 0, 0, 64, 33, 22, 0, 0, 0, 0, 0, 13, 104,6, 0, 0, 0, 0, 0, 0, 104,4, 0, 0, 0, 0, 0, 2, 40, 38, 1, 16, 0, 0, 0, 255,253,124,3, + 0, 0, 0, 0, 11, 172,110,0, 0, 32, 32, 0, 0, 1, 4, 1, 128,0, 0, 0, 20, 0, 4, 0, 0, 0, 0, 0, 17, 64, 20, 0, 0, 0, 0, 0, 145,9, 18, 0, + 0, 0, 4, 0, 0, 64, 4, 0, 0, 0, 0, 0, 0, 104,0, 0, 0, 4, 0, 0, 17, 73, 18, 1, 0, 0, 0, 0, 29, 8, 4, 0, 0, 32, 0, 0, 2, 24, 70, 0, + 0, 0, 0, 0, 0, 104,2, 2, 0, 96, 4, 0, 55, 16, 4, 0, 0, 0, 0, 0, 24, 140,46, 3, 0, 32, 0, 0, 36, 0, 8, 0, 0, 0, 0, 0, 0, 0, 2, 2, + 0, 0, 0, 0, 0, 24, 0, 1, 0, 0, 0, 0, 42, 224,4, 2, 0, 0, 0, 0, 26, 32, 42, 0, 0, 0, 0, 0, 34, 32, 4, 2, 0, 0, 0, 0, 4, 40, 8, 0, + 0, 32, 0, 0, 27, 1, 4, 0, 0, 0, 0, 0, 80, 168,38, 1, 0, 0, 0, 0, 0, 1, 6, 0, 0, 32, 0, 0, 80, 1, 6, 0, 0, 0, 0, 0, 49, 73, 126,1, + 0, 0, 0, 0, 14, 44, 42, 0, 0, 0, 0, 0, 24, 24, 2, 1, 0, 0, 0, 0, 4, 44, 0, 0, 0, 0, 0, 0, 113,0, 0, 0, 0, 0, 0, 0, 0, 160,6, 0, + 0, 32, 8, 0, 0, 8, 0, 0, 0, 0, 0, 0, 17, 0, 20, 0, 0, 0, 0, 0, 32, 8, 4, 0, 0, 0, 0, 0, 4, 136,8, 0, 16, 0, 0, 0, 29, 201,94, 1, + 0, 64, 0, 0, 14, 40, 14, 0, 0, 0, 0, 0, 10, 64, 0, 0, 0, 0, 0, 0, 0, 72, 4, 0, 0, 0, 0, 0, 4, 64, 12, 0, 0, 0, 0, 0, 68, 40, 12, 2, + 0, 32, 2, 0, 16, 1, 4, 0, 0, 0, 0, 0, 17, 16, 8, 0, 0, 0, 0, 0, 22, 32, 30, 2, 0, 0, 0, 0, 17, 73, 20, 1, 0, 0, 2, 0, 5, 80, 36, 0, + 0, 0, 0, 0, 129,9, 24, 0, 0, 0, 0, 0, 12, 0, 0, 2, 16, 0, 0, 0, 1, 65, 16, 0, 0, 96, 8, 0, 20, 5, 4, 0, 0, 0, 0, 0, 5, 8, 10, 2, + 0, 32, 0, 0, 255,255,126,3, 0, 0, 0, 0, 238,191,108,1, 0, 0, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 5, 64, 4, 0, 0, 0, 0, 0, 19, 64, 0, 0, + 0, 0, 0, 0, 72, 64, 0, 2, 0, 0, 0, 0, 0, 72, 8, 0, 0, 0, 0, 0, 4, 26, 18, 0, 0, 0, 0, 0, 128,32, 128,0, 0, 0, 0, 0, 25, 33, 4, 1, + 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 48, 4, 0, 0, 0, 0, 0, 147,121,84, 1, 0, 0, 0, 0, 0, 48, 6, 2, 0, 0, 0, 0, 8, 43, 66, 0, + 0, 0, 0, 0, 113,120,4, 0, 0, 0, 0, 0, 64, 152,40, 0, 0, 0, 0, 0, 0, 32, 36, 2, 0, 32, 0, 0, 123,40, 206,1, 0, 0, 0, 0, 0, 73, 16, 0, + 0, 0, 0, 0, 127,108,44, 0, 0, 0, 0, 0, 18, 64, 4, 0, 0, 0, 0, 0, 81, 65, 8, 0, 0, 0, 0, 0, 3, 16, 12, 0, 0, 0, 0, 0, 19, 73, 28, 1, + 0, 32, 2, 0, 4, 32, 68, 0, 0, 0, 0, 0, 18, 96, 76, 1, 0, 0, 0, 0, 80, 65, 0, 0, 0, 0, 0, 0, 16, 24, 8, 0, 0, 32, 0, 0, 5, 48, 92, 2, + 0, 0, 0, 0, 18, 72, 12, 0, 0, 32, 0, 0, 16, 104,0, 0, 0, 0, 0, 0, 1, 40, 130,0, 0, 112,0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 8, 40, 16, 0, + 0, 0, 0, 0, 17, 73, 70, 1, 0, 0, 0, 0, 198,136,42, 0, 0, 0, 0, 0, 65, 9, 46, 1, 0, 0, 0, 0, 117,104,40, 0, 0, 0, 0, 0, 128,0, 60, 0, + 0, 0, 0, 0, 10, 56, 124,3, 0, 32, 0, 0, 53, 9, 20, 1, 0, 32, 0, 0, 81, 1, 0, 0, 0, 32, 0, 0, 16, 32, 0, 0, 0, 0, 0, 0, 8, 40, 10, 0, + 0, 0, 0, 0, 206,104,94, 2, 0, 0, 0, 0, 4, 64, 4, 2, 0, 0, 0, 0, 37, 111,10, 1, 0, 0, 0, 0, 144,1, 8, 0, 0, 0, 0, 0, 93, 108,44, 2, + 0, 0, 0, 0, 4, 56, 92, 2, 0, 0, 0, 0, 148,100,72, 0, 0, 0, 0, 0, 145,121,86, 1, 0, 0, 0, 0, 64, 32, 0, 1, 0, 0, 0, 0, 88, 40, 6, 2, + 0, 32, 16, 0, 16, 0, 4, 0, 0, 0, 0, 0, 17, 64, 16, 1, 0, 96, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 64, 96, 16, 0, 0, 0, 0, 0, 5, 8, 12, 0, + 0, 0, 0, 0, 128,40, 0, 0, 0, 0, 0, 0, 8, 8, 14, 1, 0, 0, 0, 0, 1, 44, 0, 0, 0, 0, 0, 0, 255,253,93, 1, 0, 0, 0, 0, 78, 56, 54, 2, + 0, 0, 0, 0, 16, 1, 2, 2, 0, 0, 0, 0, 0, 40, 4, 2, 0, 0, 0, 0, 10, 25, 70, 1, 0, 0, 0, 0, 8, 72, 8, 0, 0, 96, 0, 0, 10, 0, 4, 0, + 0, 32, 0, 0, 59, 81, 64, 0, 0, 0, 0, 0, 8, 40, 78, 0, 0, 0, 0, 0, 25, 120,44, 0, 0, 96, 32, 0, 0, 0, 4, 0, 0, 0, 0, 0, 17, 89, 40, 1, + 0, 0, 0, 0, 72, 32, 62, 0, 0, 0, 0, 0, 9, 65, 16, 0, 0, 0, 0, 0, 72, 56, 30, 1, 0, 0, 0, 0, 2, 24, 4, 0, 0, 0, 0, 0, 25, 104,28, 0, + 0, 0, 0, 0, 8, 160,0, 0, 0, 0, 0, 0, 17, 105,6, 0, 0, 0, 0, 0, 64, 40, 64, 0, 0, 0, 0, 0, 16, 42, 6, 0, 0, 0, 0, 0, 129,104,16, 0, + 0, 0, 0, 0, 1, 65, 20, 0, 0, 0, 0, 0, 80, 104,0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 32, 0, 0, 98, 52, 46, 0, 0, 0, 0, 0, 0, 10, 4, 1, + 0, 0, 0, 0, 64, 40, 36, 0, 0, 0, 0, 0, 1, 16, 4, 0, 0, 96, 0, 0, 191,125,126,0, 0, 0, 0, 0, 6, 184,79, 0, 0, 0, 0, 0, 0, 72, 16, 0, + 0, 0, 0, 0, 41, 201,16, 1, 0, 0, 0, 0, 25, 65, 0, 2, 0, 64, 0, 0, 16, 145,0, 1, 0, 0, 0, 0, 77, 40, 6, 1, 0, 0, 0, 0, 21, 0, 4, 2, + 0, 0, 0, 0, 144,129,68, 0, 0, 0, 0, 0, 21, 73, 2, 1, 0, 0, 0, 0, 8, 136,10, 1, 0, 0, 0, 0, 0, 49, 68, 1, 0, 0, 0, 0, 8, 8, 16, 0, + 0, 0, 0, 0, 64, 104,0, 0, 0, 0, 0, 0, 145,64, 0, 0, 0, 0, 0, 0, 84, 41, 0, 2, 0, 0, 0, 0, 152,20, 20, 0, 0, 0, 0, 0, 17, 73, 6, 1, + 0, 0, 0, 0, 111,8, 172,0, 0, 0, 0, 0, 17, 9, 2, 1, 0, 0, 0, 0, 16, 88, 10, 0, 0, 0, 0, 0, 56, 13, 0, 0, 0, 0, 0, 0, 16, 0, 66, 0, + 0, 0, 0, 0, 19, 9, 8, 0, 0, 0, 0, 0, 8, 0, 68, 1, 0, 0, 0, 0, 144,1, 0, 1, 0, 32, 0, 0, 17, 0, 4, 0, 0, 0, 0, 0, 17, 97, 6, 0, + 0, 0, 0, 0, 68, 41, 6, 2, 0, 0, 0, 0, 192,0, 16, 0, 0, 0, 0, 0, 9, 56, 14, 3, 0, 0, 0, 0, 77, 40, 8, 0, 0, 0, 0, 0, 17, 1, 8, 1, + 0, 0, 0, 0, 24, 104,8, 0, 0, 0, 0, 0, 21, 120,92, 0, 0, 0, 0, 0, 1, 32, 14, 1, 0, 0, 0, 0, 17, 65, 0, 2, 0, 64, 0, 0, 215,44, 54, 0, + 0, 128,0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 2, 8, 0, 0, 32, 36, 0, 16, 96, 0, 0, 0, 0, 0, 0, 223,32, 10, 0, + 0, 0, 0, 0, 12, 128,0, 0, 128,8, 1, 0, 119,242,28, 2, 0, 128,0, 0, 2, 0, 130,0, 0, 0, 0, 0, 34, 6, 2, 0, 0, 0, 0, 0, 127,251,190,3, + 0, 0, 0, 0, 0, 32, 22, 0, 0, 0, 0, 0, 40, 8, 6, 0, 0, 0, 0, 0, 149,69, 0, 0, 0, 32, 0, 0, 17, 9, 0, 1, 0, 32, 0, 0, 0, 0, 36, 0, + 0, 0, 0, 0, 19, 91, 28, 1, 0, 0, 0, 0, 10, 32, 6, 1, 0, 0, 0, 0, 16, 1, 6, 0, 0, 0, 0, 0, 1, 0, 8, 2, 0, 0, 0, 0, 7, 36, 20, 0, + 0, 0, 0, 0, 19, 209,20, 0, 0, 0, 0, 0, 16, 96, 4, 0, 0, 0, 0, 0, 4, 136,0, 0, 0, 64, 0, 0, 1, 1, 4, 0, 0, 32, 20, 0, 32, 0, 4, 0, + 0, 0, 0, 0, 93, 65, 12, 0, 0, 0, 0, 0, 0, 16, 8, 2, 0, 0, 0, 0, 0, 68, 16, 0, 0, 0, 0, 0, 21, 97, 22, 0, 0, 0, 0, 0, 0, 32, 50, 0, + 0, 0, 0, 0, 48, 137,36, 0, 0, 0, 0, 0, 1, 0, 12, 2, 0, 0, 0, 0, 8, 152,36, 0, 0, 0, 0, 0, 36, 160,4, 0, 0, 0, 0, 0, 0, 8, 36, 0, + 0, 0, 0, 0, 145,129,12, 0, 0, 0, 0, 0, 0, 160,12, 0, 0, 0, 32, 0, 63, 113,63, 2, 0, 0, 0, 0, 0, 112,38, 0, 0, 0, 0, 0, 79, 112,44, 2, + 0, 0, 0, 0, 0, 96, 28, 0, 0, 0, 0, 0, 5, 65, 4, 0, 0, 0, 0, 0, 1, 8, 8, 0, 0, 0, 0, 0, 0, 32, 10, 2, 0, 0, 0, 0, 1, 4, 8, 1, + 0, 0, 0, 0, 21, 133,12, 0, 0, 0, 0, 0, 1, 225,0, 0, 0, 0, 0, 0, 17, 1, 28, 0, 0, 0, 0, 0, 205,45, 42, 1, 0, 0, 0, 0, 48, 0, 8, 0, + 0, 0, 0, 0, 52, 10, 0, 0, 0, 0, 0, 0, 160,16, 8, 2, 16, 160,2, 0, 215,93, 122,1, 0, 0, 0, 0, 254,255,126,3, 0, 0, 0, 0, 19, 72, 2, 0, + 0, 0, 0, 0, 136,32, 16, 0, 0, 0, 0, 0, 145,68, 0, 0, 0, 0, 0, 0, 2, 8, 2, 0, 0, 32, 0, 0, 154,1, 68, 0, 0, 0, 0, 0, 0, 4, 2, 2, + 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 0, 16, 0, 2, 1, 0, 0, 0, 0, 1, 96, 2, 0, 0, 0, 0, 0, 8, 60, 142,0, 0, 0, 0, 0, 16, 17, 4, 2, + 0, 0, 0, 0, 16, 153,68, 0, 0, 0, 0, 0, 1, 52, 66, 0, 0, 0, 0, 0, 2, 0, 36, 0, 0, 0, 0, 0, 61, 93, 16, 0, 0, 0, 0, 0, 2, 4, 8, 0, + 0, 0, 0, 0, 0, 160,24, 0, 0, 0, 0, 0, 101,0, 8, 0, 0, 0, 0, 0, 18, 8, 0, 1, 0, 0, 0, 0, 19, 65, 0, 0, 0, 0, 0, 0, 0, 32, 80, 0, + 0, 0, 0, 0, 0, 132,4, 0, 0, 0, 0, 0, 59, 233,20, 0, 0, 0, 0, 0, 17, 72, 2, 0, 0, 0, 0, 0, 16, 25, 4, 1, 0, 0, 0, 0, 0, 49, 18, 0, + 0, 32, 0, 0, 17, 121,4, 1, 0, 32, 0, 0, 16, 33, 4, 0, 0, 0, 0, 0, 93, 105,28, 1, 0, 0, 0, 0, 8, 36, 0, 0, 0, 0, 0, 0, 144,64, 0, 1, + 0, 32, 0, 0, 8, 8, 6, 1, 0, 0, 0, 0, 128,0, 32, 0, 0, 0, 0, 0, 17, 233,22, 1, 0, 0, 0, 0, 64, 180,4, 0, 0, 0, 0, 0, 0, 8, 0, 3, + 0, 32, 2, 0, 0, 8, 0, 0, 16, 0, 0, 0, 149,65, 68, 2, 0, 36, 0, 0, 9, 217,22, 0, 0, 32, 0, 0, 16, 9, 4, 0, 0, 0, 0, 0, 145,73, 6, 0, + 0, 0, 0, 0, 8, 8, 18, 0, 0, 0, 0, 0, 20, 40, 0, 0, 0, 0, 0, 0, 2, 0, 12, 3, 0, 0, 0, 0, 27, 253,28, 0, 0, 0, 0, 0, 0, 44, 2, 0, + 0, 0, 0, 0, 17, 73, 16, 1, 0, 0, 0, 0, 0, 32, 3, 0, 0, 0, 1, 0, 127,249,62, 1, 0, 0, 0, 0, 12, 32, 130,0, 0, 0, 0, 0, 32, 96, 12, 2, + 0, 0, 0, 0, 17, 65, 28, 1, 0, 32, 0, 0, 18, 48, 46, 1, 0, 240,41, 0, 16, 64, 76, 0, 0, 240,63, 0, 10, 16, 6, 0, 0, 32, 0, 0, 0, 32, 12, 0, + 0, 0, 0, 0, 16, 73, 64, 0, 0, 32, 0, 0, 144,1, 4, 0, 0, 0, 0, 0, 16, 117,12, 0, 0, 32, 0, 0, 8, 32, 6, 1, 0, 0, 0, 0, 181,89, 94, 0, + 0, 0, 0, 0, 66, 32, 130,0, 0, 0, 0, 0, 8, 40, 2, 0, 0, 0, 0, 0, 2, 11, 12, 0, 0, 0, 0, 0, 189,56, 172,0, 0, 0, 0, 0, 0, 32, 6, 2, + 0, 0, 0, 0, 17, 32, 6, 0, 0, 0, 0, 0, 1, 4, 8, 0, 0, 0, 0, 0, 255,253,127,3, 0, 0, 0, 0, 8, 181,14, 0, 0, 0, 0, 0, 145,65, 84, 0, + 0, 0, 0, 0, 8, 16, 2, 0, 0, 0, 0, 0, 1, 64, 18, 1, 0, 0, 0, 0, 133,68, 0, 0, 0, 32, 4, 0, 18, 217,20, 0, 0, 0, 16, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 6, 188,46, 2, 0, 0, 0, 0, 18, 0, 4, 1, 0, 32, 0, 0, 48, 9, 4, 1, 0, 96, 0, 0, 14, 16, 6, 1, 0, 0, 0, 0, 0, 64, 18, 0, + 0, 0, 0, 0, 41, 0, 4, 0, 0, 0, 0, 0, 0, 12, 2, 0, 0, 0, 0, 0, 49, 25, 12, 1, 0, 240,31, 0, 32, 0, 0, 0, 0, 0, 0, 0, 16, 97, 20, 0, + 0, 0, 0, 0, 81, 97, 0, 0, 0, 0, 0, 0, 2, 33, 18, 0, 0, 0, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 0, 128,72, 0, 0, 0, 0, 0, 0, 168,0, 0, + 0, 0, 0, 0, 23, 253,122,1, 0, 0, 0, 0, 0, 48, 68, 0, 0, 0, 0, 0, 18, 168,0, 0, 0, 0, 0, 0, 32, 4, 0, 0, 0, 0, 0, 0, 53, 8, 12, 0, + 0, 0, 0, 0, 196,0, 32, 0, 0, 0, 0, 0, 34, 16, 100,0, 0, 32, 0, 0, 128,136,0, 0, 0, 32, 0, 0, 16, 8, 0, 0, 0, 0, 0, 0, 147,57, 76, 0, + 0, 0, 0, 0, 17, 17, 16, 0, 0, 32, 0, 0, 146,89, 4, 1, 0, 0, 0, 0, 17, 32, 4, 1, 0, 224,56, 0, 32, 16, 12, 0, 0, 0, 0, 0, 145,32, 74, 0, + 0, 0, 0, 0, 17, 1, 34, 1, 0, 0, 0, 0, 0, 8, 14, 2, 0, 240,7, 0, 0, 16, 12, 3, 0, 0, 0, 0, 18, 33, 4, 1, 0, 0, 0, 0, 2, 48, 8, 0, + 0, 0, 0, 0, 1, 0, 10, 0, 0, 0, 0, 0, 0, 48, 26, 0, 0, 0, 0, 0, 0, 112,0, 0, 0, 0, 0, 0, 255,252,63, 3, 0, 0, 0, 0, 8, 244,38, 1, + 0, 0, 0, 0, 80, 0, 8, 0, 0, 0, 0, 0, 133,76, 16, 0, 0, 32, 0, 0, 64, 40, 4, 0, 0, 240,42, 0, 1, 8, 0, 0, 0, 32, 0, 0, 17, 137,4, 1, + 0, 0, 0, 0, 136,16, 4, 0, 0, 112,5, 0, 16, 129,68, 0, 0, 32, 0, 0, 0, 161,22, 0, 0, 0, 0, 0, 160,52, 62, 0, 0, 96, 0, 0, 40, 8, 12, 1, + 0, 0, 0, 0, 64, 105,64, 0, 0, 0, 0, 0, 17, 4, 4, 0, 0, 0, 0, 0, 29, 205,44, 0, 0, 0, 0, 0, 150,9, 6, 0, 0, 0, 0, 0, 16, 32, 4, 1, + 0, 32, 0, 0, 1, 36, 4, 0, 0, 0, 0, 0, 20, 32, 68, 0, 0, 0, 0, 0, 17, 161,0, 0, 0, 0, 0, 0, 1, 0, 4, 1, 0, 0, 0, 0, 221,237,76, 2, + 0, 32, 0, 0, 12, 16, 28, 0, 0, 0, 0, 0, 0, 8, 64, 0, 0, 0, 0, 0, 33, 64, 0, 1, 0, 32, 0, 0, 0, 96, 4, 0, 0, 0, 0, 0, 8, 56, 28, 0, + 0, 0, 0, 0, 68, 64, 0, 0, 0, 0, 0, 0, 148,217,6, 0, 0, 0, 0, 0, 8, 32, 66, 0, 0, 32, 0, 0, 32, 0, 4, 0, 0, 0, 0, 0, 13, 197,0, 0, + 0, 0, 0, 0, 100,40, 4, 0, 0, 0, 0, 0, 4, 32, 1, 0, 0, 0, 0, 0, 149,249,80, 2, 0, 0, 0, 0, 0, 24, 128,0, 0, 0, 0, 0, 5, 65, 74, 0, + 0, 0, 0, 0, 64, 16, 2, 0, 0, 0, 0, 0, 0, 80, 2, 0, 0, 0, 0, 0, 36, 128,0, 0, 0, 0, 0, 0, 95, 255,127,1, 0, 0, 0, 0, 132,76, 10, 0, + 0, 0, 0, 0, 16, 68, 16, 2, 0, 0, 0, 0, 6, 32, 6, 0, 0, 0, 0, 0, 2, 16, 4, 0, 0, 0, 0, 0, 17, 89, 16, 0, 0, 0, 0, 0, 17, 133,20, 0, + 0, 0, 0, 0, 74, 64, 0, 0, 0, 0, 0, 0, 16, 129,14, 0, 0, 0, 0, 0, 25, 105,16, 2, 0, 0, 0, 0, 1, 64, 20, 0, 0, 0, 0, 0, 0, 64, 4, 2, + 0, 0, 0, 0, 144,1, 16, 2, 0, 0, 0, 0, 92, 41, 8, 0, 0, 0, 0, 0, 153,52, 0, 0, 0, 0, 0, 0, 17, 65, 16, 3, 0, 240,62, 0, 207,191,206,1, + 0, 240,32, 0, 0, 0, 0, 0, 0, 240,7, 0, 0, 0, 0, 0, 0, 32, 0, 0, 85, 121,20, 1, 0, 32, 0, 0, 10, 41, 0, 0, 0, 0, 0, 0, 16, 40, 6, 0, + 0, 0, 0, 0, 27, 1, 4, 0, 0, 0, 0, 0, 20, 64, 0, 0, 0, 32, 0, 0, 17, 96, 4, 0, 0, 32, 0, 0, 17, 65, 4, 0, 0, 32, 0, 0, 40, 168,20, 0, + 0, 0, 0, 0, 12, 32, 0, 0, 0, 0, 0, 0, 4, 0, 24, 0, 0, 0, 0, 0, 8, 128,4, 0, 0, 32, 0, 0, 1, 72, 0, 0, 0, 0, 0, 0, 1, 72, 8, 0, + 0, 0, 0, 0, 223,253,63, 1, 0, 0, 0, 0, 3, 1, 16, 0, 0, 0, 0, 0, 1, 0, 20, 1, 0, 96, 0, 0, 24, 73, 4, 1, 0, 0, 0, 0, 16, 8, 0, 3, + 0, 0, 0, 0, 21, 64, 2, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 3, 152,4, 0, 0, 0, 0, 0, 68, 45, 0, 0, 0, 0, 0, 0, 1, 133,0, 0, + 0, 0, 0, 0, 5, 40, 16, 0, 0, 32, 0, 0, 48, 17, 104,1, 0, 0, 0, 0, 255,248,254,2, 0, 32, 0, 0, 38, 124,38, 0, 0, 0, 0, 0, 36, 65, 0, 0, + 0, 0, 0, 0, 9, 8, 2, 0, 0, 0, 0, 0, 23, 65, 18, 0, 0, 0, 0, 0, 149,65, 4, 0, 0, 0, 0, 0, 0, 72, 0, 1, 0, 0, 0, 0, 4, 32, 68, 0, + 0, 0, 0, 0, 17, 4, 2, 0, 0, 4, 0, 0, 4, 42, 6, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 1, 137,38, 0, 0, 0, 0, 0, 4, 9, 0, 2, + 0, 0, 0, 0, 49, 9, 32, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 19, 85, 0, 0, 0, 0, 0, 0, 93, 101,9, 2, 0, 0, 0, 0, 128,65, 0, 1, + 0, 0, 0, 0, 17, 1, 2, 1, 0, 96, 4, 0, 0, 8, 4, 0, 0, 0, 0, 0, 4, 152,2, 0, 0, 0, 0, 0, 0, 0, 140,0, 0, 0, 0, 0, 36, 168,24, 0, + 0, 0, 0, 0, 132,196,18, 0, 0, 0, 0, 0, 21, 65, 23, 0, 0, 0, 0, 0, 4, 64, 16, 0, 0, 0, 0, 0, 17, 72, 16, 0, 0, 0, 0, 0, 0, 25, 4, 0, + 0, 0, 0, 0, 16, 64, 6, 0, 0, 0, 0, 0, 36, 160,36, 0, 0, 0, 0, 0, 2, 40, 4, 0, 0, 0, 0, 0, 81, 104,0, 0, 0, 0, 0, 0, 128,1, 16, 0, + 0, 0, 0, 0, 21, 236,12, 0, 0, 32, 4, 0, 0, 4, 0, 0, 0, 0, 0, 0, 16, 1, 18, 0, 0, 0, 0, 0, 19, 65, 42, 1, 0, 0, 0, 0, 10, 0, 10, 0, + 0, 0, 0, 0, 86, 32, 0, 2, 0, 32, 0, 0, 2, 8, 76, 0, 0, 0, 0, 0, 46, 24, 4, 0, 0, 0, 0, 0, 21, 1, 32, 0, 0, 0, 0, 0, 20, 8, 8, 0, + 0, 32, 32, 0, 17, 64, 4, 0, 0, 0, 0, 0, 16, 9, 68, 0, 0, 0, 0, 0, 172,12, 130,1, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 4, 0, 32, 2, 0, 0, + 0, 0, 0, 0, 17, 77, 88, 1, 0, 0, 0, 0, 255,189,254,1, 0, 0, 0, 0, 208,64, 16, 0, 0, 0, 0, 0, 2, 48, 2, 0, 0, 0, 0, 0, 24, 16, 32, 0, + 0, 0, 0, 0, 3, 208,4, 0, 0, 0, 0, 0, 76, 37, 14, 0, 0, 0, 0, 0, 130,128,12, 0, 0, 0, 0, 0, 27, 101,6, 1, 0, 0, 0, 0, 0, 48, 12, 1, + 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 46, 96, 12, 0, 0, 0, 0, 0, 129,0, 0, 1, 0, 32, 0, 0, 16, 5, 4, 0, 0, 0, 0, 0, 10, 64, 40, 0, + 0, 0, 0, 0, 146,193,12, 0, 0, 0, 0, 0, 17, 89, 2, 1, 0, 0, 0, 0, 52, 0, 5, 0, 0, 0, 0, 0, 144,64, 12, 0, 0, 0, 0, 0, 76, 32, 4, 0, + 0, 0, 0, 0, 16, 65, 28, 0, 0, 0, 0, 0, 0, 40, 68, 0, 0, 0, 0, 0, 0, 8, 10, 1, 0, 0, 0, 0, 20, 34, 0, 0, 0, 0, 0, 0, 30, 144,76, 0, + 0, 0, 0, 0, 119,249,110,0, 0, 0, 0, 0, 0, 56, 46, 0, 0, 32, 0, 0, 16, 9, 28, 0, 0, 32, 0, 0, 49, 125,100,1, 0, 0, 0, 0, 8, 40, 6, 0, + 0, 0, 0, 0, 32, 4, 46, 0, 0, 0, 0, 0, 4, 0, 12, 2, 0, 0, 0, 0, 16, 97, 0, 0, 0, 32, 0, 0, 12, 176,10, 0, 0, 0, 0, 0, 116,21, 0, 1, + 0, 0, 0, 0, 8, 40, 14, 0, 0, 0, 0, 0, 55, 242,45, 2, 0, 8, 0, 0, 16, 0, 4, 0, 0, 0, 0, 0, 40, 0, 8, 0, 0, 32, 0, 0, 144,64, 12, 1, + 0, 0, 0, 0, 4, 0, 136,0, 0, 0, 8, 0, 16, 65, 4, 0, 0, 0, 0, 0, 85, 5, 8, 0, 0, 0, 0, 0, 17, 17, 4, 1, 0, 0, 0, 0, 2, 128,4, 0, + 0, 0, 0, 0, 144,73, 10, 0, 0, 0, 0, 0, 127,253,127,3, 0, 32, 0, 0, 16, 17, 76, 0, 0, 0, 0, 0, 32, 1, 4, 0, 0, 0, 0, 0, 192,0, 4, 0, + 0, 0, 0, 0, 53, 17, 8, 0, 0, 0, 0, 0, 1, 0, 4, 2, 0, 2, 0, 0, 8, 40, 30, 1, 0, 0, 0, 0, 128,1, 28, 0, 0, 0, 0, 0, 73, 0, 12, 0, + 0, 32, 36, 0, 16, 1, 4, 1, 0, 0, 0, 0, 128,17, 0, 0, 0, 0, 0, 0, 25, 32, 4, 0, 0, 32, 0, 0, 50, 1, 4, 0, 0, 0, 0, 0, 118,54, 174,0, + 0, 0, 0, 0, 150,152,4, 0, 0, 0, 0, 0, 80, 5, 0, 1, 0, 0, 0, 0, 148,0, 8, 0, 0, 0, 0, 0, 11, 48, 10, 0, 0, 0, 0, 0, 109,73, 16, 1, + 0, 0, 1, 0, 178,51, 26, 0, 0, 0, 0, 0, 132,36, 0, 1, 0, 128,0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 32, 2, 8, 0, 0, 0, 0, 0, 2, 0, 1, 0, + 0, 0, 0, 0, 192,4, 12, 0, 0, 68, 1, 0, 255,255,255,3, 0, 0, 0, 0, 204,44, 158,0, 0, 32, 0, 0, 18, 21, 64, 1, 0, 0, 0, 0, 50, 1, 44, 0, + 0, 0, 0, 0, 81, 9, 4, 0, 0, 0, 0, 0, 18, 41, 12, 0, 0, 0, 0, 0, 155,73, 82, 1, 0, 0, 0, 0, 0, 45, 2, 0, 0, 0, 0, 0, 16, 73, 4, 0, + 0, 0, 0, 0, 8, 128,6, 1, 0, 0, 0, 0, 0, 8, 22, 0, 0, 96, 43, 0, 0, 2, 4, 1, 0, 0, 0, 0, 149,68, 26, 0, 0, 0, 0, 0, 4, 33, 0, 0, + 0, 96, 4, 0, 119,185,14, 1, 0, 0, 0, 0, 8, 16, 8, 1, 0, 0, 0, 0, 144,17, 0, 0, 0, 32, 0, 0, 9, 248,14, 2, 0, 0, 0, 0, 57, 121,2, 1, + 0, 128,0, 0, 14, 185,198,1, 0, 0, 0, 0, 52, 56, 4, 0, 0, 0, 0, 64, 0, 0, 4, 0, 0, 48, 0, 0, 10, 16, 0, 0, 0, 0, 0, 0, 40, 40, 186,0, + 0, 0, 0, 0, 128,9, 0, 0, 0, 0, 0, 0, 49, 65, 2, 0, 0, 0, 0, 0, 16, 25, 4, 0, 0, 0, 0, 0, 16, 40, 2, 1, 0, 96, 0, 0, 128,0, 4, 0, + 0, 0, 0, 0, 219,41, 4, 0, 0, 0, 0, 0, 17, 105,2, 0, 0, 0, 0, 0, 67, 32, 4, 0, 0, 0, 0, 0, 6, 8, 0, 0, 0, 0, 0, 0, 16, 80, 2, 0, + 0, 0, 0, 0, 33, 56, 10, 0, 0, 0, 0, 0, 21, 1, 4, 0, 0, 32, 0, 0, 0, 25, 6, 1, 0, 4, 0, 0, 127,253,125,1, 0, 0, 0, 0, 110,249,110,0, + 0, 0, 0, 0, 88, 0, 8, 0, 0, 0, 0, 0, 4, 48, 0, 0, 0, 0, 0, 0, 54, 233,70, 0, 0, 0, 0, 0, 0, 32, 42, 0, 0, 32, 0, 0, 214,120,14, 1, + 0, 0, 0, 0, 129,72, 8, 0, 0, 0, 0, 0, 1, 9, 2, 0, 0, 0, 0, 0, 87, 48, 12, 0, 0, 32, 0, 0, 73, 0, 4, 0, 0, 0, 0, 0, 94, 176,10, 2, + 0, 0, 0, 0, 26, 1, 4, 0, 0, 0, 0, 0, 93, 40, 10, 1, 0, 0, 0, 0, 2, 96, 32, 0, 0, 0, 0, 0, 92, 48, 36, 0, 0, 0, 0, 0, 1, 68, 0, 0, + 0, 0, 0, 0, 81, 1, 68, 0, 0, 32, 0, 0, 0, 64, 96, 0, 0, 0, 0, 0, 4, 177,35, 2, 0, 0, 0, 0, 66, 184,22, 0, 0, 0, 0, 0, 3, 0, 0, 1, + 0, 0, 0, 0, 25, 97, 4, 1, 0, 32, 0, 0, 49, 9, 4, 0, 0, 0, 0, 0, 49, 9, 4, 0, 0, 0, 0, 0, 4, 192,8, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 32, 1, 0, 144,80, 6, 0, 0, 0, 0, 0, 6, 49, 4, 0, 0, 0, 0, 0, 18, 32, 0, 0, 0, 0, 0, 0, 9, 32, 0, 0, 16, 64, 0, 0, 191,249,30, 1, + 0, 0, 0, 0, 4, 40, 14, 0, 0, 0, 0, 0, 17, 65, 28, 0, 0, 32, 0, 0, 1, 1, 12, 0, 0, 0, 0, 0, 81, 1, 0, 0, 0, 64, 0, 0, 95, 105,30, 0, + 0, 0, 0, 0, 36, 1, 4, 0, 0, 0, 0, 0, 12, 44, 141,0, 0, 0, 0, 0, 64, 64, 12, 0, 0, 0, 0, 0, 128,69, 4, 0, 0, 96, 0, 0, 17, 81, 4, 0, + 0, 0, 0, 0, 24, 0, 18, 0, 0, 0, 0, 0, 8, 48, 6, 0, 0, 0, 0, 0, 36, 0, 0, 2, 0, 0, 0, 0, 17, 16, 0, 0, 0, 0, 0, 0, 16, 32, 12, 0, + 0, 0, 0, 0, 16, 16, 12, 0, 0, 0, 0, 0, 17, 17, 0, 0, 0, 0, 0, 0, 32, 64, 8, 0, 0, 0, 0, 0, 17, 136,68, 0, 0, 0, 0, 0, 0, 8, 18, 0, + 0, 0, 0, 0, 4, 96, 13, 0, 0, 0, 0, 0, 24, 8, 130,0, 0, 0, 0, 0, 145,73, 30, 0, 0, 0, 0, 0, 76, 96, 31, 0, 0, 0, 0, 0, 17, 105,4, 0, + 0, 0, 0, 0, 1, 16, 136,0, 0, 0, 0, 0, 21, 48, 0, 0, 0, 0, 0, 0, 16, 1, 24, 0, 0, 0, 0, 0, 2, 64, 32, 0, 0, 0, 0, 0, 127,127,127,3, + 0, 0, 0, 0, 70, 45, 94, 0, 0, 0, 0, 0, 145,73, 18, 0, 0, 0, 0, 0, 4, 32, 40, 0, 0, 0, 0, 0, 9, 161,14, 0, 0, 0, 0, 0, 4, 0, 40, 0, + 0, 0, 0, 0, 81, 81, 4, 0, 0, 0, 0, 0, 4, 24, 18, 0, 0, 0, 0, 0, 17, 65, 18, 1, 0, 0, 0, 0, 0, 56, 6, 0, 0, 0, 0, 0, 52, 48, 8, 0, + 0, 0, 0, 0, 1, 32, 0, 1, 0, 0, 0, 0, 36, 1, 0, 0, 0, 0, 0, 0, 136,26, 70, 1, 0, 0, 0, 0, 2, 9, 0, 0, 0, 0, 0, 0, 12, 0, 14, 0, + 0, 0, 0, 0, 16, 16, 6, 0, 0, 0, 0, 0, 72, 32, 14, 0, 0, 0, 0, 0, 4, 0, 18, 0, 0, 0, 0, 0, 25, 76, 2, 0, 0, 0, 0, 0, 64, 0, 36, 0, + 0, 0, 0, 0, 16, 17, 64, 0, 0, 0, 0, 0, 108,32, 4, 0, 0, 0, 0, 0, 16, 9, 66, 0, 0, 0, 0, 0, 8, 8, 2, 1, 0, 4, 0, 0, 17, 73, 0, 1, + 0, 0, 0, 0, 132,8, 18, 0, 0, 0, 0, 0, 29, 24, 142,1, 0, 0, 0, 0, 4, 96, 32, 0, 0, 32, 0, 0, 1, 8, 12, 1, 0, 0, 0, 0, 52, 160,32, 0, + 0, 0, 0, 0, 0, 41, 10, 0, 0, 0, 0, 0, 4, 40, 50, 0, 0, 0, 0, 0, 8, 33, 8, 0, 0, 32, 0, 0, 0, 65, 8, 1, 0, 0, 0, 0, 24, 0, 64, 1, + 0, 0, 0, 0, 21, 201,24, 0, 0, 0, 0, 0, 4, 35, 11, 0, 0, 0, 0, 0, 17, 65, 32, 0, 0, 0, 0, 0, 17, 145,0, 0, 0, 0, 0, 0, 76, 17, 130,0, + 0, 0, 0, 0, 144,48, 134,0, 0, 0, 0, 0, 0, 33, 2, 0, 0, 0, 0, 0, 80, 65, 16, 0, 0, 0, 0, 0, 32, 129,22, 0, 0, 0, 0, 0, 14, 137,46, 0, + 0, 0, 0, 0, 16, 65, 20, 0, 0, 0, 0, 0, 2, 32, 40, 0, 0, 96, 0, 0, 16, 8, 4, 0, 0, 0, 0, 0, 4, 32, 130,1, 0, 0, 0, 0, 0, 65, 20, 0, + 0, 0, 0, 0, 64, 0, 12, 1, 0, 0, 0, 0, 4, 12, 0, 1, 0, 0, 0, 0, 92, 253,46, 0, 0, 0, 0, 0, 146,17, 92, 1, 0, 96, 2, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 16, 72, 8, 0, 0, 98, 36, 0, 255,125,68, 0, 0, 0, 0, 0, 8, 0, 6, 1, 0, 0, 0, 0, 24, 96, 0, 0, 0, 0, 0, 0, 61, 8, 14, 0, + 0, 0, 0, 0, 17, 128,68, 0, 0, 96, 0, 0, 1, 17, 70, 0, 0, 0, 0, 0, 153,233,30, 1, 0, 0, 0, 0, 8, 184,6, 0, 0, 0, 0, 0, 17, 104,0, 0, + 0, 32, 0, 0, 166,176,4, 1, 16, 0, 0, 0, 16, 0, 8, 0, 0, 0, 0, 0, 4, 9, 66, 0, 0, 0, 0, 0, 127,253,126,3, 0, 0, 0, 0, 140,60, 8, 3, + 0, 0, 0, 0, 0, 41, 8, 0, 0, 0, 0, 0, 128,65, 16, 0, 0, 0, 0, 0, 17, 105,94, 1, 0, 0, 0, 0, 64, 32, 14, 1, 0, 0, 0, 0, 8, 41, 70, 0, + 0, 0, 0, 0, 17, 8, 8, 0, 0, 0, 0, 0, 2, 32, 48, 2, 0, 64, 0, 0, 17, 41, 12, 1, 0, 0, 0, 0, 93, 224,12, 2, 0, 0, 0, 0, 81, 96, 8, 0, + 0, 0, 0, 0, 16, 17, 22, 1, 0, 0, 0, 0, 16, 64, 76, 1, 0, 0, 0, 0, 187,113,84, 1, 0, 0, 0, 0, 9, 11, 14, 1, 0, 0, 0, 0, 0, 9, 20, 1, + 0, 0, 0, 0, 18, 1, 4, 0, 0, 0, 0, 0, 144,4, 0, 0, 0, 0, 0, 0, 0, 56, 8, 2, 0, 32, 0, 0, 24, 8, 46, 0, 0, 4, 0, 0, 16, 65, 22, 0, + 0, 0, 0, 0, 81, 65, 20, 1, 0, 0, 0, 0, 8, 104,10, 0, 0, 0, 0, 0, 77, 105,14, 3, 0, 0, 0, 0, 223,96, 36, 0, 0, 0, 0, 0, 81, 32, 0, 0, + 0, 0, 0, 0, 10, 32, 68, 0, 0, 0, 0, 0, 64, 128,0, 0, 0, 0, 0, 0, 149,65, 0, 0, 0, 0, 0, 0, 17, 105,70, 0, 0, 0, 0, 0, 64, 0, 134,2, + 0, 0, 0, 0, 4, 34, 4, 0, 0, 0, 0, 0, 0, 50, 4, 0, 0, 0, 0, 0, 16, 8, 10, 0, 0, 0, 0, 0, 24, 8, 0, 0, 0, 0, 0, 0, 223,189,76, 1, + 0, 0, 0, 0, 84, 112,8, 0, 0, 32, 0, 0, 72, 168,4, 0, 0, 0, 0, 0, 21, 105,20, 0, 0, 0, 0, 0, 66, 41, 6, 0, 0, 0, 0, 0, 16, 0, 8, 2, + 0, 0, 0, 0, 8, 41, 2, 0, 0, 0, 0, 0, 145,121,30, 1, 0, 0, 0, 0, 1, 40, 6, 1, 0, 0, 0, 0, 19, 89, 2, 1, 0, 0, 0, 0, 0, 32, 70, 0, + 0, 32, 0, 0, 80, 0, 76, 0, 0, 0, 0, 0, 126,169,46, 2, 0, 0, 0, 0, 16, 9, 6, 0, 0, 0, 0, 0, 27, 73, 12, 0, 16, 0, 0, 0, 1, 32, 0, 0, + 0, 0, 0, 0, 1, 0, 32, 0, 0, 0, 0, 0, 4, 1, 12, 0, 0, 0, 0, 0, 0, 88, 68, 0, 0, 0, 0, 0, 16, 89, 4, 0, 0, 16, 0, 0, 25, 73, 6, 1, + 0, 0, 0, 0, 24, 32, 6, 0, 0, 32, 0, 0, 55, 209,78, 0, 0, 32, 0, 0, 2, 16, 68, 0, 0, 0, 0, 0, 16, 72, 4, 0, 16, 0, 0, 0, 8, 0, 14, 0, + 0, 0, 0, 0, 23, 105,46, 1, 0, 0, 0, 0, 144,0, 0, 1, 0, 0, 0, 0, 9, 0, 70, 1, 0, 32, 0, 0, 145,105,70, 1, 0, 0, 0, 0, 9, 112,6, 0, + 0, 0, 0, 0, 145,1, 8, 1, 0, 0, 0, 0, 21, 65, 30, 1, 0, 0, 0, 0, 89, 1, 28, 0, 0, 0, 0, 0, 16, 40, 8, 0, 0, 0, 0, 0, 219,249,6, 0, + 0, 96, 0, 0, 0, 0, 20, 0, 0, 16, 0, 0, 16, 65, 2, 0, 0, 0, 0, 0, 24, 40, 14, 0, 0, 0, 0, 0, 17, 72, 84, 0, 0, 0, 0, 0, 8, 32, 8, 1, + 0, 0, 0, 0, 21, 109,8, 0, 0, 0, 0, 0, 19, 65, 16, 3, 0, 8, 0, 0, 71, 1, 30, 0, 0, 64, 0, 0, 0, 32, 16, 0, 0, 64, 0, 0, 177,115,56, 1, + 0, 0, 0, 0, 111,189,254,3, 0, 0, 0, 0, 71, 9, 12, 0, 0, 0, 0, 0, 21, 68, 2, 0, 0, 32, 0, 0, 152,169,4, 1, 0, 32, 0, 0, 0, 2, 4, 0, + 0, 0, 0, 0, 0, 8, 96, 0, 0, 0, 0, 0, 24, 73, 0, 1, 0, 0, 0, 0, 209,73, 20, 0, 0, 0, 0, 0, 66, 108,0, 0, 0, 32, 0, 0, 145,81, 84, 0, + 0, 0, 0, 0, 18, 144,0, 0, 0, 0, 0, 0, 0, 9, 16, 0, 0, 0, 0, 0, 63, 125,76, 0, 0, 0, 0, 0, 20, 1, 4, 1, 0, 0, 0, 0, 17, 192,4, 0, + 0, 0, 0, 0, 148,4, 4, 0, 0, 32, 0, 0, 24, 1, 0, 0, 0, 0, 0, 0, 96, 32, 4, 0, 0, 0, 0, 0, 8, 33, 6, 1, 0, 0, 0, 0, 168,56, 4, 0, + 0, 0, 0, 0, 36, 96, 12, 0, 0, 0, 0, 0, 16, 1, 0, 3, 0, 96, 17, 0, 174,18, 0, 2, 0, 0, 0, 0, 223,249,127,0, 0, 0, 0, 0, 68, 52, 46, 0, + 0, 32, 0, 0, 16, 129,4, 1, 0, 0, 0, 0, 16, 80, 0, 1, 0, 0, 0, 0, 144,65, 16, 0, 0, 32, 0, 0, 0, 8, 4, 0, 0, 0, 0, 0, 148,0, 0, 1, + 0, 0, 0, 0, 0, 40, 16, 0, 0, 0, 0, 0, 21, 65, 4, 0, 0, 0, 0, 0, 204,172,6, 0, 0, 32, 0, 0, 2, 16, 4, 0, 0, 0, 0, 0, 81, 73, 0, 0, + 0, 0, 0, 0, 16, 0, 68, 0, 0, 0, 0, 0, 16, 128,28, 0, 0, 0, 0, 0, 20, 192,76, 0, 0, 0, 0, 0, 8, 0, 8, 2, 0, 0, 0, 0, 16, 81, 64, 1, + 0, 0, 0, 0, 17, 65, 100,0, 0, 0, 0, 0, 20, 16, 4, 0, 0, 0, 1, 0, 0, 160,0, 0, 0, 0, 0, 0, 95, 252,45, 0, 0, 0, 0, 0, 3, 8, 4, 0, + 0, 0, 0, 0, 144,5, 0, 0, 0, 0, 0, 0, 17, 24, 0, 0, 0, 32, 0, 0, 16, 1, 12, 0, 0, 0, 0, 0, 88, 8, 0, 0, 0, 0, 0, 0, 104,0, 6, 0, + 0, 0, 0, 0, 208,8, 0, 0, 0, 0, 0, 0, 16, 145,4, 0, 0, 0, 0, 0, 84, 68, 0, 0, 0, 0, 0, 0, 53, 217,92, 0, 0, 0, 0, 0, 21, 89, 0, 1, + 0, 0, 0, 0, 34, 128,32, 0, 0, 0, 0, 0, 20, 65, 8, 2, 0, 0, 0, 0, 48, 8, 0, 0, 0, 0, 0, 0, 1, 69, 0, 0, 0, 0, 0, 0, 245,253,255,3, + 0, 0, 0, 0, 0, 36, 12, 0, 0, 0, 0, 0, 148,69, 16, 0, 0, 0, 0, 0, 17, 0, 64, 0, 0, 0, 0, 0, 32, 64, 24, 0, 0, 0, 0, 0, 129,33, 0, 0, + 0, 0, 0, 0, 51, 137,80, 0, 0, 0, 0, 0, 25, 0, 2, 1, 0, 0, 0, 0, 149,71, 85, 1, 0, 0, 0, 0, 2, 32, 4, 0, 0, 0, 0, 0, 0, 52, 0, 0, + 0, 0, 0, 0, 154,125,76, 0, 0, 32, 0, 0, 247,121,74, 0, 0, 0, 0, 0, 149,64, 72, 2, 0, 0, 0, 0, 68, 160,12, 0, 0, 0, 0, 0, 148,64, 0, 0, + 0, 0, 0, 0, 58, 41, 12, 0, 0, 32, 0, 0, 16, 65, 36, 0, 0, 0, 0, 0, 0, 96, 8, 0, 0, 0, 0, 0, 124,185,140,3, 0, 0, 0, 0, 35, 0, 4, 0, + 0, 0, 0, 0, 16, 0, 128,0, 0, 0, 0, 0, 24, 64, 16, 0, 0, 0, 0, 0, 4, 4, 4, 2, 0, 32, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 18, 152,66, 0, + 0, 0, 0, 0, 8, 8, 8, 1, 0, 0, 0, 0, 145,65, 8, 0, 0, 0, 0, 0, 148,1, 4, 0, 0, 0, 0, 0, 8, 32, 0, 2, 0, 0, 0, 0, 27, 193,12, 0, + 0, 0, 0, 0, 64, 160,0, 0, 0, 0, 0, 0, 64, 8, 4, 0, 0, 0, 0, 0, 0, 9, 12, 0, 0, 112,8, 0, 0, 8, 4, 0, 0, 0, 0, 0, 53, 85, 24, 1, + 0, 0, 0, 0, 2, 4, 6, 0, 0, 0, 0, 0, 156,0, 50, 0, 0, 0, 0, 0, 8, 8, 24, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 34, 0, 0, 1, + 0, 0, 0, 0, 255,255,174,3, 0, 0, 0, 0, 8, 32, 30, 0, 0, 0, 0, 0, 51, 65, 22, 0, 0, 0, 0, 0, 21, 40, 12, 0, 0, 0, 0, 0, 0, 64, 12, 0, + 0, 32, 0, 0, 32, 0, 64, 0, 0, 0, 0, 0, 133,69, 48, 0, 0, 0, 0, 0, 32, 24, 10, 2, 0, 0, 0, 0, 25, 51, 64, 0, 0, 0, 0, 0, 10, 40, 46, 2, + 0, 0, 0, 0, 0, 224,32, 0, 0, 0, 0, 0, 17, 25, 4, 1, 0, 0, 0, 0, 1, 0, 6, 2, 0, 0, 0, 0, 151,253,108,0, 0, 0, 0, 0, 8, 32, 10, 1, + 0, 0, 0, 0, 96, 160,44, 0, 0, 0, 0, 0, 8, 144,8, 0, 0, 0, 0, 0, 16, 128,0, 0, 0, 0, 0, 0, 4, 0, 36, 0, 0, 96, 5, 0, 179,249,29, 0, + 0, 0, 0, 0, 17, 73, 2, 1, 0, 0, 0, 0, 64, 16, 4, 0, 0, 0, 0, 0, 129,8, 24, 0, 0, 0, 0, 0, 217,41, 136,1, 0, 0, 0, 0, 36, 32, 0, 0, + 0, 0, 0, 0, 100,32, 0, 0, 0, 32, 4, 0, 160,8, 4, 0, 0, 0, 0, 0, 4, 48, 2, 2, 0, 64, 0, 0, 23, 193,6, 0, 0, 0, 0, 0, 63, 249,110,3, + 0, 0, 0, 0, 6, 16, 8, 0, 0, 0, 0, 0, 9, 40, 12, 1, 0, 0, 0, 0, 21, 112,56, 0, 0, 0, 0, 0, 24, 0, 70, 1, 0, 0, 0, 0, 192,32, 0, 0, + 0, 0, 0, 0, 4, 32, 20, 2, 0, 0, 0, 0, 10, 0, 4, 1, 0, 0, 0, 0, 149,145,92, 0, 0, 0, 0, 0, 17, 49, 64, 1, 0, 0, 0, 0, 183,105,78, 0, + 0, 0, 0, 0, 0, 33, 64, 0, 0, 0, 0, 0, 65, 32, 6, 0, 0, 0, 0, 0, 18, 1, 2, 0, 0, 0, 0, 0, 32, 128,0, 0, 0, 0, 0, 0, 32, 40, 16, 0, + 0, 0, 0, 0, 164,1, 0, 0, 0, 0, 0, 0, 145,9, 4, 1, 0, 0, 0, 0, 5, 17, 0, 2, 0, 32, 0, 0, 18, 0, 8, 3, 0, 0, 0, 0, 128,33, 0, 0, + 0, 0, 0, 0, 129,81, 0, 0, 0, 32, 0, 0, 32, 0, 0, 2, 0, 0, 0, 0, 119,190,78, 2, 0, 32, 0, 0, 14, 241,12, 0, 0, 0, 0, 0, 129,8, 0, 0, + 0, 32, 0, 0, 12, 0, 68, 0, 0, 0, 0, 0, 4, 32, 4, 2, 0, 0, 0, 0, 197,160,10, 0, 0, 0, 0, 0, 16, 0, 1, 0, 0, 0, 0, 0, 16, 69, 0, 0, + 0, 0, 0, 0, 9, 65, 72, 0, 0, 128,0, 0, 144,0, 2, 0, 0, 0, 0, 0, 17, 33, 20, 0, 0, 0, 0, 0, 4, 156,140,0, 0, 0, 0, 0, 0, 69, 0, 0, + 0, 0, 0, 0, 17, 72, 80, 1, 0, 0, 0, 0, 4, 130,2, 0, 0, 0, 0, 0, 0, 73, 4, 0, 0, 0, 0, 0, 0, 37, 8, 0, 0, 0, 0, 0, 17, 69, 0, 1, + 0, 0, 0, 0, 4, 140,6, 0, 0, 0, 0, 0, 0, 36, 68, 0, 16, 244,47, 0, 255,255,126,3, 0, 0, 0, 0, 145,193,20, 1, 0, 0, 0, 0, 236,121,54, 2, + 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 3, 193,0, 0, 0, 0, 0, 0, 72, 34, 8, 0, 0, 0, 0, 0, 68, 16, 8, 0, 0, 0, 0, 0, 128,64, 0, 1, + 0, 0, 0, 0, 144,41, 2, 1, 0, 0, 0, 0, 140,153,100,0, 0, 64, 0, 0, 8, 9, 0, 0, 0, 0, 0, 0, 27, 105,18, 0, 0, 0, 0, 0, 149,197,19, 3, + 16, 96, 0, 0, 25, 73, 30, 1, 16, 224,4, 0, 0, 80, 4, 1, 0, 0, 0, 0, 200,50, 66, 0, 0, 0, 0, 0, 32, 64, 8, 1, 0, 0, 0, 0, 16, 65, 2, 1, + 0, 0, 0, 0, 219,121,82, 0, 0, 0, 0, 0, 21, 121,0, 0, 0, 0, 0, 0, 210,85, 5, 0, 0, 0, 0, 0, 0, 48, 2, 1, 0, 0, 0, 0, 220,59, 47, 2, + 0, 0, 0, 0, 129,104,2, 0, 0, 0, 0, 0, 1, 72, 0, 1, 0, 0, 0, 0, 144,9, 16, 1, 0, 224,0, 0, 8, 16, 4, 0, 0, 16, 0, 0, 17, 65, 20, 0, + 0, 112,32, 0, 128,0, 4, 0, 0, 0, 0, 0, 247,221,30, 3, 0, 0, 0, 0, 8, 25, 3, 0, 0, 0, 0, 0, 4, 0, 2, 1, 0, 144,16, 0, 84, 102,22, 1, + 0, 0, 0, 0, 11, 104,40, 0, 0, 0, 0, 0, 17, 17, 16, 1, 0, 0, 0, 0, 64, 17, 38, 0, 0, 248,16, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 32, 38, 1, + 0, 0, 0, 0, 83, 241,6, 0, 0, 0, 0, 0, 64, 40, 46, 0, 0, 0, 0, 0, 4, 68, 24, 0, 0, 0, 0, 0, 0, 104,70, 0, 0, 0, 0, 0, 21, 72, 6, 0, + 0, 32, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 8, 48, 0, 0, 0, 0, 0, 0, 89, 1, 0, 1, 0, 0, 0, 0, 12, 32, 26, 0, 0, 0, 0, 0, 176,1, 0, 0, + 0, 0, 0, 0, 24, 32, 2, 0, 16, 160,0, 0, 255,127,60, 3, 0, 0, 0, 0, 144,32, 4, 0, 0, 0, 0, 0, 145,65, 0, 3, 0, 40, 0, 0, 169,8, 6, 1, + 0, 0, 0, 0, 49, 65, 18, 1, 0, 0, 0, 0, 132,12, 14, 0, 0, 32, 0, 0, 32, 64, 4, 0, 0, 0, 0, 0, 21, 95, 12, 0, 0, 240,47, 0, 17, 75, 4, 1, + 0, 0, 0, 0, 16, 68, 4, 0, 0, 0, 16, 0, 1, 76, 0, 0, 0, 0, 1, 0, 16, 112,68, 0, 0, 0, 0, 0, 6, 56, 10, 0, 0, 112,0, 0, 74, 16, 4, 0, + 0, 0, 0, 0, 32, 32, 70, 0, 0, 0, 0, 0, 18, 69, 32, 0, 0, 0, 0, 0, 145,65, 16, 2, 0, 0, 0, 0, 129,193,34, 2, 0, 0, 0, 0, 127,255,126,1, + 0, 0, 0, 0, 3, 20, 5, 0, 0, 0, 0, 0, 145,64, 2, 1, 0, 0, 0, 0, 64, 32, 6, 0, 0, 0, 0, 0, 8, 40, 4, 1, 0, 0, 0, 0, 128,32, 8, 0, + 0, 0, 0, 0, 21, 96, 28, 0, 0, 32, 4, 0, 181,127,70, 0, 0, 0, 0, 0, 16, 65, 24, 0, 0, 0, 0, 0, 16, 32, 0, 1, 0, 0, 0, 0, 25, 73, 4, 0, + 0, 0, 0, 0, 4, 32, 20, 0, 0, 0, 0, 0, 196,0, 4, 0, 0, 0, 0, 0, 69, 32, 4, 0, 0, 0, 0, 0, 4, 32, 80, 0, 0, 0, 0, 0, 148,65, 8, 0, + 0, 0, 0, 0, 176,17, 12, 1, 0, 32, 0, 0, 1, 16, 32, 0, 0, 0, 0, 0, 215,85, 12, 0, 0, 0, 0, 0, 19, 37, 72, 0, 0, 96, 0, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 149,101,94, 3, 0, 0, 0, 0, 70, 24, 4, 0, 0, 0, 0, 0, 122,185,14, 2, 0, 0, 0, 0, 24, 0, 10, 0, 0, 0, 0, 0, 0, 0, 12, 1, + 0, 0, 0, 0, 144,0, 2, 0, 0, 32, 0, 0, 25, 97, 26, 1, 0, 0, 0, 0, 0, 104,18, 2, 0, 112,47, 0, 4, 56, 134,1, 0, 0, 0, 0, 1, 128,12, 0, + 0, 0, 0, 0, 93, 104,14, 0, 0, 240,47, 0, 223,223,78, 0, 0, 96, 6, 0, 0, 0, 0, 0, 0, 32, 0, 0, 16, 80, 0, 0, 0, 0, 0, 0, 21, 64, 0, 0, + 0, 32, 0, 0, 16, 64, 36, 0, 0, 0, 0, 0, 91, 109,20, 0, 0, 32, 4, 0, 64, 0, 4, 0, 0, 8, 0, 0, 159,60, 78, 0, 0, 0, 0, 0, 0, 108,0, 0, + 0, 0, 0, 0, 17, 1, 4, 2, 0, 0, 0, 0, 1, 59, 2, 1, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 50, 96, 0, 0, + 0, 128,0, 0, 8, 200,24, 0, 0, 0, 2, 0, 0, 0, 16, 0, 0, 0, 0, 0, 8, 4, 48, 0, 0, 0, 0, 0, 72, 64, 2, 0, 0, 32, 8, 0, 255,255,255,3, + 0, 0, 0, 0, 236,60, 63, 0, 0, 0, 0, 0, 16, 64, 8, 1, 0, 32, 0, 0, 186,152,70, 3, 0, 0, 0, 0, 16, 192,0, 0, 0, 0, 0, 0, 18, 17, 12, 1, + 0, 32, 0, 0, 217,96, 4, 0, 0, 0, 0, 0, 30, 121,14, 1, 0, 0, 0, 0, 128,72, 4, 0, 0, 96, 4, 0, 22, 56, 70, 0, 0, 0, 0, 0, 19, 105,30, 1, + 0, 0, 0, 0, 20, 12, 30, 0, 0, 0, 0, 0, 1, 12, 0, 0, 0, 0, 0, 0, 74, 5, 10, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 17, 56, 14, 1, + 0, 0, 0, 0, 65, 32, 2, 0, 0, 0, 0, 0, 21, 8, 8, 0, 0, 0, 0, 0, 17, 41, 86, 0, 0, 32, 0, 0, 208,0, 0, 1, 0, 0, 0, 0, 5, 0, 28, 0, + 0, 0, 0, 0, 132,9, 0, 1, 0, 0, 0, 0, 32, 64, 4, 0, 0, 0, 0, 0, 192,32, 12, 0, 0, 4, 0, 0, 149,77, 18, 0, 0, 0, 0, 0, 56, 185,14, 1, + 0, 0, 0, 0, 18, 128,0, 0, 0, 0, 0, 0, 24, 32, 8, 0, 0, 0, 0, 0, 0, 1, 18, 0, 0, 0, 0, 0, 10, 88, 34, 0, 0, 0, 0, 0, 13, 185,4, 0, + 0, 96, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 5, 32, 8, 2, 0, 0, 0, 0, 4, 64, 32, 0, 0, 0, 0, 0, 0, 49, 34, 0, 0, 0, 0, 0, 14, 248,20, 0, + 0, 0, 0, 0, 145,17, 4, 0, 0, 0, 0, 0, 17, 5, 0, 0, 0, 0, 0, 0, 140,120,30, 1, 0, 0, 0, 0, 0, 208,0, 0, 0, 0, 0, 0, 32, 96, 32, 0, + 0, 0, 0, 0, 8, 128,130,0, 0, 0, 0, 0, 4, 8, 12, 0, 0, 0, 0, 0, 147,113,18, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 5, 4, 2, 0, + 0, 0, 0, 0, 20, 96, 0, 0, 0, 32, 0, 0, 75, 190,110,2, 0, 32, 0, 0, 31, 137,78, 0, 0, 0, 0, 0, 0, 4, 32, 0, 0, 0, 0, 0, 184,145,0, 0, + 0, 0, 0, 0, 16, 0, 12, 2, 0, 0, 1, 0, 53, 75, 26, 1, 0, 0, 0, 0, 6, 24, 18, 3, 0, 0, 0, 0, 21, 104,2, 0, 0, 0, 0, 0, 14, 0, 4, 0, + 0, 0, 0, 0, 95, 104,2, 0, 0, 0, 0, 0, 16, 96, 22, 0, 0, 0, 0, 0, 88, 16, 2, 0, 0, 0, 0, 0, 0, 33, 24, 1, 0, 0, 0, 0, 68, 4, 0, 0, + 0, 0, 0, 0, 53, 121,18, 0, 0, 0, 0, 0, 88, 32, 22, 0, 0, 0, 0, 0, 17, 104,4, 1, 0, 0, 0, 0, 177,32, 0, 0, 0, 0, 0, 0, 9, 64, 18, 0, + 0, 0, 0, 0, 8, 0, 32, 0, 0, 0, 0, 0, 0, 104,2, 0, 0, 0, 0, 0, 45, 32, 108,2, 0, 0, 0, 0, 33, 64, 4, 0, 0, 0, 0, 0, 0, 33, 0, 2, + 0, 0, 0, 0, 81, 248,2, 1, 0, 0, 0, 0, 17, 32, 38, 1, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 32, 16, 0, 1, 0, 16, 0, 0, 254,124,46, 0, + 0, 0, 0, 0, 129,32, 0, 0, 0, 0, 0, 0, 148,16, 12, 0, 0, 0, 0, 0, 20, 1, 6, 3, 0, 0, 0, 0, 84, 32, 34, 2, 0, 0, 0, 0, 128,97, 4, 0, + 0, 0, 0, 0, 21, 77, 18, 0, 0, 0, 0, 0, 0, 40, 0, 1, 0, 0, 0, 0, 255,253,126,2, 0, 0, 0, 0, 246,249,126,1, 0, 0, 0, 0, 16, 64, 18, 1, + 0, 0, 0, 0, 17, 72, 18, 0, 0, 0, 0, 0, 0, 0, 16, 3, 0, 0, 0, 0, 93, 64, 16, 1, 0, 0, 0, 0, 17, 200,16, 0, 0, 0, 0, 0, 81, 81, 0, 0, + 0, 0, 0, 0, 131,68, 0, 0, 0, 0, 0, 0, 72, 32, 10, 0, 0, 0, 0, 0, 9, 0, 0, 1, 0, 0, 0, 0, 213,252,62, 1, 0, 0, 0, 0, 1, 33, 0, 0, + 0, 0, 0, 0, 71, 120,62, 2, 0, 0, 0, 0, 48, 0, 4, 0, 0, 0, 0, 0, 24, 64, 1, 0, 0, 0, 0, 0, 129,73, 12, 0, 0, 0, 0, 0, 17, 1, 4, 1, + 16, 32, 2, 0, 19, 65, 84, 1, 0, 0, 0, 0, 68, 178,38, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 32, 32, 6, 1, 0, 0, 0, 0, 66, 32, 36, 0, + 0, 0, 0, 0, 113,33, 22, 3, 0, 0, 0, 0, 83, 17, 4, 0, 0, 0, 0, 0, 1, 32, 4, 1, 0, 0, 0, 0, 129,1, 6, 0, 0, 0, 0, 0, 0, 41, 2, 0, + 0, 224,63, 0, 36, 64, 12, 0, 0, 0, 0, 0, 76, 41, 132,2, 0, 0, 0, 0, 5, 65, 0, 0, 0, 0, 0, 0, 28, 0, 4, 0, 0, 0, 0, 0, 23, 255,22, 1, + 0, 0, 0, 0, 64, 45, 30, 1, 0, 0, 0, 0, 21, 5, 14, 3, 0, 0, 0, 0, 16, 65, 6, 1, 0, 0, 0, 0, 89, 104,14, 3, 0, 0, 0, 0, 85, 65, 4, 1, + 0, 0, 0, 0, 5, 64, 20, 0, 0, 0, 0, 0, 93, 44, 30, 0, 0, 0, 0, 0, 132,4, 0, 0, 0, 0, 0, 0, 20, 2, 0, 0, 0, 0, 0, 0, 86, 185,30, 1, + 0, 0, 0, 0, 20, 0, 5, 2, 0, 96, 4, 0, 27, 65, 12, 1, 0, 0, 0, 0, 4, 68, 0, 0, 0, 0, 0, 0, 16, 0, 8, 1, 0, 0, 0, 0, 0, 9, 14, 2, + 0, 48, 0, 0, 255,255,124,3, 0, 0, 0, 0, 48, 136,26, 2, 0, 0, 0, 0, 0, 65, 16, 1, 0, 0, 0, 0, 81, 52, 30, 0, 0, 0, 0, 0, 85, 124,14, 2, + 0, 0, 0, 0, 12, 0, 6, 0, 0, 96, 0, 0, 149,68, 12, 2, 0, 128,57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128,32, 10, 1, 0, 96, 0, 0, 16, 64, 8, 0, + 0, 0, 0, 0, 98, 113,28, 1, 0, 0, 0, 0, 48, 93, 0, 0, 0, 0, 0, 0, 17, 89, 22, 1, 0, 0, 0, 0, 4, 32, 12, 0, 0, 0, 0, 0, 14, 46, 2, 0, + 0, 0, 0, 0, 145,233,30, 0, 0, 0, 0, 0, 12, 73, 22, 2, 0, 0, 0, 0, 17, 17, 20, 0, 0, 0, 0, 0, 12, 32, 74, 1, 0, 0, 0, 0, 20, 160,2, 0, + 0, 0, 0, 0, 0, 168,78, 1, 0, 0, 0, 0, 28, 0, 4, 3, 0, 0, 0, 0, 16, 32, 32, 2, 0, 0, 0, 0, 32, 0, 12, 0, 0, 0, 0, 0, 160,0, 16, 0, + 0, 0, 0, 0, 80, 32, 8, 1, 0, 0, 0, 0, 255,253,254,1, 0, 0, 0, 0, 0, 185,36, 2, 0, 0, 0, 0, 16, 25, 0, 0, 0, 0, 0, 0, 196,60, 50, 2, + 0, 0, 0, 0, 10, 0, 12, 2, 0, 0, 0, 0, 93, 96, 44, 2, 0, 0, 0, 0, 8, 40, 8, 0, 0, 0, 0, 0, 86, 117,52, 1, 0, 0, 0, 0, 19, 1, 4, 0, + 0, 0, 0, 0, 92, 32, 4, 0, 0, 0, 0, 0, 2, 9, 4, 1, 0, 0, 0, 0, 255,255,63, 0, 0, 0, 0, 0, 8, 61, 26, 0, 0, 0, 0, 0, 0, 9, 32, 0, + 0, 0, 0, 0, 12, 64, 8, 0, 0, 0, 0, 0, 68, 48, 2, 0, 0, 0, 0, 0, 16, 1, 42, 0, 0, 0, 0, 0, 32, 96, 0, 0, 0, 0, 0, 0, 17, 249,0, 0, + 0, 0, 0, 0, 0, 1, 82, 3, 0, 0, 0, 0, 77, 24, 6, 1, 0, 0, 0, 0, 16, 0, 48, 0, 0, 0, 0, 0, 0, 195,12, 0, 0, 0, 0, 0, 0, 56, 26, 0, + 0, 0, 0, 0, 6, 144,8, 0, 0, 0, 0, 0, 0, 1, 10, 0, 0, 0, 0, 0, 6, 32, 4, 0, 0, 0, 0, 0, 4, 48, 8, 0, 0, 0, 0, 0, 149,91, 90, 2, + 0, 0, 0, 0, 20, 17, 2, 0, 0, 0, 0, 0, 72, 25, 6, 0, 0, 0, 0, 0, 16, 76, 2, 0, 0, 0, 0, 0, 0, 48, 146,0, 0, 0, 0, 0, 4, 16, 8, 0, + 0, 0, 0, 0, 16, 89, 2, 1, 0, 0, 0, 0, 22, 145,142,0, 0, 0, 0, 0, 89, 73, 2, 0, 0, 0, 0, 0, 0, 45, 22, 2, 0, 0, 0, 0, 4, 12, 16, 0, + 0, 0, 0, 0, 17, 0, 12, 1, 0, 0, 0, 0, 65, 64, 0, 1, 0, 0, 0, 0, 64, 8, 128,0, 0, 0, 0, 0, 1, 42, 2, 1, 0, 0, 0, 0, 2, 65, 0, 0, + 0, 0, 0, 0, 24, 160,28, 1, 0, 0, 0, 0, 21, 108,44, 2, 0, 32, 4, 0, 26, 25, 4, 0, 0, 32, 0, 0, 20, 96, 4, 0, 0, 64, 0, 0, 20, 105,30, 1, + 0, 0, 0, 0, 1, 8, 48, 0, 0, 32, 0, 0, 17, 129,4, 0, 0, 0, 0, 0, 155,65, 20, 1, 0, 0, 0, 0, 17, 40, 14, 1, 0, 0, 0, 0, 16, 0, 6, 1, + 0, 0, 0, 0, 20, 40, 14, 0, 0, 0, 0, 0, 72, 32, 8, 0, 0, 0, 0, 0, 16, 32, 16, 0, 0, 0, 0, 0, 177,64, 4, 2, 0, 0, 0, 0, 205,45, 32, 1, + 0, 0, 0, 0, 2, 16, 0, 2, 0, 0, 0, 0, 2, 16, 8, 0, 0, 0, 0, 0, 128,0, 128,1, 0, 0, 0, 0, 0, 0, 3, 2, 0, 0, 0, 0, 0, 18, 8, 0, + 0, 0, 0, 0, 21, 67, 26, 1, 0, 0, 0, 0, 130,60, 66, 0, 0, 0, 0, 0, 1, 16, 64, 0, 0, 0, 0, 0, 0, 136,32, 0, 0, 0, 0, 0, 32, 104,12, 0, + 0, 0, 0, 0, 255,255,254,3, 0, 0, 0, 0, 94, 252,46, 2, 0, 0, 0, 0, 128,64, 2, 0, 0, 0, 0, 0, 144,96, 2, 0, 0, 240,61, 0, 10, 0, 4, 0, + 0, 0, 0, 0, 81, 101,0, 0, 0, 0, 0, 0, 27, 73, 6, 0, 0, 0, 0, 0, 145,77, 24, 0, 0, 0, 0, 0, 0, 176,6, 0, 0, 0, 0, 0, 12, 24, 6, 1, + 0, 0, 0, 0, 21, 96, 0, 0, 0, 32, 4, 0, 177,89, 84, 1, 0, 0, 0, 0, 0, 40, 6, 1, 0, 32, 0, 0, 128,65, 0, 0, 0, 0, 0, 0, 0, 64, 24, 0, + 0, 0, 0, 0, 93, 107,70, 1, 16, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 238,188,94, 2, 0, 0, 0, 0, 16, 16, 2, 0, 0, 0, 0, 0, 208,0, 4, 0, + 0, 0, 0, 0, 12, 69, 4, 0, 0, 0, 0, 0, 149,153,14, 2, 0, 0, 0, 0, 0, 24, 10, 0, 0, 0, 0, 0, 10, 72, 0, 0, 0, 0, 0, 0, 16, 9, 18, 0, + 0, 0, 0, 0, 16, 96, 2, 1, 0, 0, 0, 0, 219,57, 70, 0, 0, 0, 0, 0, 16, 48, 0, 0, 0, 0, 0, 0, 0, 96, 6, 0, 0, 0, 0, 0, 13, 216,58, 0, + 0, 0, 0, 0, 0, 1, 50, 0, 0, 96, 0, 0, 0, 137,0, 0, 0, 0, 0, 0, 0, 48, 14, 0, 0, 0, 0, 0, 95, 125,92, 0, 0, 0, 0, 0, 0, 168,26, 0, + 0, 0, 0, 0, 16, 120,12, 1, 0, 0, 0, 0, 70, 152,4, 0, 0, 0, 0, 0, 17, 81, 68, 1, 0, 0, 0, 0, 130,16, 38, 0, 0, 0, 0, 0, 128,32, 6, 1, + 0, 0, 0, 0, 81, 96, 4, 0, 0, 0, 0, 0, 128,0, 4, 2, 0, 0, 0, 0, 4, 8, 8, 2, 0, 0, 0, 0, 19, 221,84, 0, 0, 224,10, 0, 66, 169,30, 2, + 0, 192,32, 0, 0, 0, 0, 0, 0, 128,34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 1, 8, 2, 0, 0, 0, 0, 1, 100,0, 0, 0, 0, 0, 0, 133,1, 4, 0, + 0, 0, 0, 0, 74, 96, 14, 2, 0, 0, 0, 0, 1, 1, 4, 1, 0, 0, 0, 0, 0, 97, 16, 0, 0, 0, 0, 0, 17, 66, 4, 0, 0, 0, 1, 0, 12, 160,146,0, + 0, 0, 33, 0, 9, 0, 0, 0, 0, 0, 0, 0, 48, 8, 4, 0, 0, 0, 0, 0, 221,117,92, 0, 0, 0, 0, 0, 128,178,14, 0, 0, 0, 0, 0, 152,0, 6, 0, + 0, 0, 0, 0, 187,89, 84, 1, 0, 0, 0, 0, 24, 8, 6, 0, 0, 0, 0, 0, 16, 8, 32, 0, 0, 0, 0, 0, 4, 32, 28, 2, 0, 32, 0, 0, 46, 8, 38, 0, + 0, 0, 0, 0, 4, 32, 0, 2, 0, 0, 0, 0, 92, 184,158,0, 0, 0, 0, 0, 16, 33, 0, 1, 0, 0, 0, 0, 28, 128,0, 0, 0, 0, 0, 0, 145,201,14, 0, + 0, 0, 0, 0, 17, 168,2, 0, 0, 0, 0, 0, 8, 17, 0, 0, 0, 0, 0, 0, 221,77, 26, 0, 0, 0, 0, 0, 4, 36, 64, 0, 0, 128,0, 0, 16, 105,164,0, + 0, 8, 0, 0, 1, 1, 4, 1, 0, 0, 1, 0, 130,1, 0, 1, 0, 32, 0, 0, 78, 16, 0, 0, 0, 0, 0, 0, 255,255,31, 0, 0, 0, 0, 0, 106,184,38, 0, + 0, 0, 0, 0, 0, 16, 18, 0, 0, 0, 0, 0, 209,89, 86, 0, 0, 32, 0, 0, 64, 57, 62, 0, 0, 0, 0, 0, 24, 128,8, 0, 0, 0, 0, 0, 1, 48, 15, 0, + 0, 0, 0, 0, 100,0, 0, 0, 0, 0, 0, 0, 17, 113,64, 0, 0, 0, 0, 0, 9, 0, 38, 0, 0, 0, 0, 0, 224,0, 8, 0, 0, 0, 0, 0, 12, 0, 0, 1, + 0, 0, 0, 0, 0, 40, 4, 1, 0, 32, 0, 0, 0, 8, 64, 0, 0, 0, 0, 0, 2, 32, 74, 0, 0, 0, 0, 0, 74, 1, 0, 0, 0, 0, 0, 0, 16, 129,4, 0, + 0, 0, 0, 0, 64, 128,4, 0, 0, 0, 0, 0, 17, 193,24, 0, 0, 0, 0, 0, 12, 48, 2, 0, 0, 0, 0, 0, 8, 176,0, 0, 0, 0, 0, 0, 17, 73, 26, 0, + 0, 0, 0, 0, 40, 40, 4, 0, 0, 0, 0, 0, 32, 56, 0, 0, 0, 0, 0, 0, 6, 0, 8, 0, 0, 0, 0, 0, 133,84, 28, 2, 0, 0, 0, 0, 19, 81, 18, 1, + 0, 0, 0, 0, 17, 73, 176,1, 0, 32, 0, 0, 72, 0, 12, 0, 0, 0, 0, 0, 8, 32, 14, 2, 0, 0, 0, 0, 85, 65, 0, 1, 0, 96, 2, 0, 0, 8, 6, 1, + 0, 0, 0, 0, 1, 67, 0, 0, 0, 0, 0, 0, 18, 64, 32, 0, 0, 32, 0, 0, 8, 8, 0, 0, 0, 64, 0, 0, 0, 8, 2, 0, 0, 8, 0, 0, 253,77, 28, 0, + 0, 0, 0, 0, 0, 2, 128,0, 0, 0, 0, 0, 2, 16, 10, 2, 0, 0, 1, 0, 129,0, 0, 0, 0, 0, 0, 0, 0, 2, 32, 0, 0, 0, 0, 0, 0, 2, 146,0, + 0, 0, 0, 0, 33, 34, 0, 0, 0, 0, 0, 0, 12, 0, 34, 0, 0, 0, 0, 0, 2, 48, 0, 0, 0, 0, 4, 0, 167,65, 52, 1, 0, 0, 0, 0, 16, 3, 0, 1, + 0, 0, 0, 0, 17, 65, 36, 0, 0, 0, 0, 0, 255,255,255,3, 0, 0, 0, 0, 2, 36, 0, 0, 0, 0, 0, 0, 19, 93, 6, 1, 0, 0, 0, 0, 16, 1, 6, 1, + 0, 0, 0, 0, 0, 12, 6, 1, 0, 32, 0, 64, 144,69, 28, 0, 0, 0, 0, 0, 145,9, 94, 1, 0, 32, 0, 0, 17, 67, 68, 0, 0, 0, 0, 0, 89, 65, 70, 1, + 0, 32, 0, 0, 10, 32, 38, 0, 0, 0, 0, 0, 202,152,14, 0, 0, 0, 0, 0, 160,45, 6, 0, 0, 96, 0, 0, 255,248,78, 0, 0, 0, 0, 0, 80, 65, 0, 1, + 0, 32, 0, 0, 128,0, 8, 0, 0, 0, 0, 0, 21, 112,6, 0, 0, 0, 0, 0, 88, 40, 14, 0, 0, 0, 0, 0, 144,69, 24, 0, 0, 0, 0, 0, 255,251,44, 0, + 0, 0, 0, 0, 5, 50, 6, 2, 0, 0, 0, 0, 4, 96, 40, 0, 0, 0, 0, 0, 177,65, 4, 1, 0, 32, 0, 0, 138,0, 4, 0, 0, 0, 0, 0, 8, 32, 2, 1, + 0, 0, 0, 0, 16, 32, 36, 0, 0, 96, 38, 0, 0, 0, 4, 0, 0, 0, 0, 0, 147,245,16, 2, 0, 0, 8, 0, 64, 33, 4, 0, 0, 0, 0, 0, 16, 4, 2, 0, + 0, 0, 4, 0, 10, 37, 6, 0, 0, 0, 0, 0, 5, 96, 8, 0, 0, 0, 0, 0, 81, 65, 21, 1, 0, 0, 0, 0, 69, 68, 5, 0, 0, 32, 0, 0, 1, 69, 16, 0, + 0, 32, 0, 0, 16, 0, 68, 0, 16, 32, 0, 0, 223,127,60, 3, 0, 0, 0, 0, 206,8, 122,1, 0, 32, 0, 0, 8, 64, 4, 0, 0, 0, 0, 0, 192,41, 14, 3, + 0, 0, 0, 0, 1, 72, 4, 0, 0, 0, 0, 0, 245,72, 4, 0, 0, 0, 0, 0, 84, 168,44, 2, 0, 0, 0, 0, 29, 1, 0, 1, 0, 32, 0, 0, 0, 40, 12, 0, + 0, 0, 0, 0, 224,0, 110,0, 0, 0, 0, 0, 0, 64, 48, 0, 0, 0, 0, 0, 8, 68, 0, 0, 0, 0, 1, 0, 253,68, 8, 0, 0, 0, 0, 0, 234,188,14, 2, + 0, 0, 0, 0, 1, 9, 0, 1, 0, 0, 0, 0, 26, 60, 68, 0, 0, 0, 0, 0, 49, 201,4, 0, 0, 0, 0, 0, 136,16, 4, 1, 0, 0, 0, 0, 125,255,110,1, + 0, 0, 0, 0, 24, 57, 8, 2, 0, 0, 0, 0, 17, 48, 10, 1, 0, 0, 0, 0, 93, 96, 12, 0, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 0, 0, 35, 65, 20, 1, + 0, 0, 0, 0, 179,65, 4, 0, 0, 0, 0, 0, 96, 48, 92, 0, 0, 0, 0, 0, 17, 40, 12, 0, 0, 0, 0, 0, 133,81, 0, 0, 0, 0, 0, 0, 149,5, 78, 0, + 0, 0, 0, 0, 149,97, 12, 3, 0, 0, 0, 0, 16, 0, 64, 1, 0, 0, 0, 0, 95, 61, 174,1, 0, 0, 0, 0, 136,18, 12, 0, 0, 0, 0, 0, 48, 9, 4, 0, + 0, 32, 0, 0, 193,9, 0, 0, 0, 0, 0, 0, 19, 48, 8, 0, 0, 0, 0, 0, 128,0, 8, 1, 0, 0, 0, 0, 4, 40, 14, 1, 0, 0, 0, 0, 217,47, 14, 0, + 0, 32, 0, 0, 243,137,94, 1, 0, 0, 0, 0, 0, 1, 40, 0, 0, 0, 0, 0, 19, 65, 8, 1, 0, 4, 16, 0, 89, 203,116,3, 0, 0, 0, 0, 255,189,252,3, + 0, 0, 0, 0, 33, 0, 8, 0, 0, 16, 0, 0, 209,105,30, 0, 0, 0, 0, 0, 0, 112,44, 0, 0, 240,63, 0, 51, 24, 4, 2, 0, 48, 6, 0, 0, 0, 0, 0, + 0, 240,56, 0, 0, 0, 0, 0, 0, 240,2, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 129,36, 0, 0, 0, 0, 0, 20, 68, 16, 0, + 0, 96, 0, 0, 32, 32, 4, 0, 0, 0, 0, 0, 80, 4, 2, 0, 0, 0, 0, 0, 72, 128,0, 0, 0, 0, 0, 0, 154,97, 4, 1, 0, 0, 0, 0, 223,191,252,1, + 0, 0, 0, 0, 48, 41, 4, 0, 0, 96, 0, 0, 87, 73, 76, 1, 0, 0, 0, 0, 16, 80, 4, 0, 0, 0, 0, 0, 26, 8, 12, 0, 0, 0, 0, 0, 4, 96, 8, 0, + 0, 0, 0, 0, 158,32, 4, 0, 0, 0, 0, 0, 17, 25, 0, 1, 0, 32, 0, 0, 16, 49, 6, 0, 16, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 114,184,36, 2, + 0, 0, 0, 0, 8, 0, 38, 0, 0, 0, 0, 0, 18, 0, 12, 0, 0, 0, 0, 0, 17, 36, 4, 0, 0, 0, 0, 0, 17, 9, 68, 1, 0, 0, 0, 0, 0, 129,4, 0, + 0, 0, 0, 0, 140,4, 4, 0, 0, 8, 0, 0, 0, 40, 78, 0, 0, 32, 16, 0, 0, 8, 4, 0, 0, 0, 16, 0, 214,253,126,3, 0, 0, 0, 0, 194,64, 16, 0, + 0, 0, 0, 0, 81, 5, 0, 0, 0, 0, 0, 0, 2, 32, 12, 1, 0, 0, 0, 0, 10, 205,4, 2, 0, 0, 0, 0, 16, 69, 12, 0, 0, 0, 0, 0, 66, 1, 4, 0, + 0, 0, 0, 0, 222,189,62, 2, 0, 0, 0, 0, 144,16, 0, 0, 0, 0, 0, 0, 97, 1, 4, 0, 0, 0, 4, 0, 215,56, 68, 0, 0, 32, 0, 0, 16, 0, 12, 0, + 0, 0, 0, 0, 4, 1, 28, 0, 0, 0, 0, 0, 59, 57, 68, 0, 0, 0, 8, 0, 137,216,8, 0, 0, 0, 0, 0, 148,44, 130,1, 0, 0, 0, 0, 16, 2, 0, 1, + 0, 0, 0, 0, 255,253,239,3, 0, 0, 0, 0, 9, 9, 4, 0, 0, 0, 0, 0, 151,105,22, 3, 0, 0, 0, 0, 4, 41, 6, 1, 0, 0, 0, 0, 5, 10, 6, 1, + 0, 0, 0, 0, 21, 104,28, 0, 0, 0, 0, 0, 0, 33, 118,0, 0, 0, 0, 0, 4, 0, 96, 0, 0, 0, 0, 0, 4, 1, 1, 0, 0, 0, 0, 0, 149,76, 10, 0, + 0, 32, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 97, 4, 1, 0, 0, 0, 0, 0, 49, 10, 0, 0, 0, 0, 0, 0, 32, 96, 0, 0, 32, 0, 0, 146,153,76, 1, + 0, 32, 0, 0, 0, 64, 64, 0, 0, 0, 0, 0, 16, 1, 28, 0, 0, 0, 0, 0, 89, 57, 20, 3, 0, 96, 4, 0, 4, 60, 6, 0, 0, 0, 0, 0, 5, 36, 0, 0, + 0, 0, 0, 0, 6, 57, 78, 1, 0, 0, 0, 0, 25, 68, 68, 0, 0, 0, 0, 0, 0, 68, 6, 0, 0, 0, 0, 0, 49, 97, 26, 0, 0, 0, 0, 0, 19, 121,16, 1, + 0, 0, 0, 0, 16, 12, 10, 1, 0, 0, 0, 0, 201,81, 82, 0, 0, 0, 0, 0, 0, 49, 6, 0, 0, 0, 0, 0, 64, 44, 12, 0, 0, 0, 0, 0, 145,9, 0, 0, + 0, 0, 0, 0, 64, 36, 6, 0, 0, 176,0, 0, 10, 56, 14, 1, 0, 128,0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 31, 93, 80, 1, + 0, 0, 0, 0, 4, 36, 10, 1, 0, 0, 0, 0, 16, 20, 0, 1, 0, 0, 0, 0, 9, 32, 6, 0, 0, 0, 0, 0, 59, 221,0, 0, 0, 0, 0, 0, 64, 33, 6, 1, + 0, 0, 0, 0, 51, 72, 4, 0, 0, 0, 0, 0, 16, 5, 0, 1, 0, 0, 0, 0, 144,9, 12, 1, 0, 0, 4, 0, 255,253,126,3, 0, 0, 0, 0, 192,22, 96, 1, + 0, 64, 0, 0, 72, 16, 4, 0, 0, 0, 0, 0, 16, 96, 0, 1, 0, 0, 0, 0, 65, 0, 32, 1, 0, 0, 0, 0, 0, 8, 5, 0, 0, 0, 0, 0, 192,16, 96, 0, + 0, 0, 0, 0, 66, 8, 0, 0, 0, 0, 0, 0, 64, 32, 32, 0, 0, 0, 0, 0, 0, 81, 32, 0, 0, 0, 0, 0, 181,81, 72, 0, 0, 0, 0, 0, 16, 72, 2, 2, + 0, 0, 0, 0, 8, 176,4, 0, 0, 0, 0, 0, 17, 201,18, 0, 0, 32, 0, 0, 64, 0, 14, 1, 0, 0, 0, 0, 4, 0, 134,0, 0, 0, 0, 0, 255,253,94, 1, + 0, 0, 0, 0, 14, 61, 12, 2, 0, 0, 0, 0, 16, 168,142,0, 0, 0, 0, 0, 85, 96, 4, 0, 0, 0, 0, 0, 8, 8, 0, 1, 0, 0, 0, 0, 4, 168,20, 0, + 0, 0, 0, 0, 4, 72, 8, 0, 0, 0, 0, 0, 149,69, 28, 2, 0, 0, 0, 0, 2, 36, 8, 0, 0, 0, 0, 0, 0, 44, 8, 0, 0, 0, 0, 0, 18, 81, 0, 1, + 0, 96, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 148,5, 14, 1, 0, 32, 0, 0, 16, 81, 0, 1, 0, 0, 0, 0, 9, 65, 0, 0, 0, 0, 0, 0, 25, 89, 0, 1, + 0, 0, 0, 0, 32, 4, 32, 0, 0, 0, 0, 0, 64, 32, 34, 0, 0, 0, 0, 0, 1, 36, 0, 0, 0, 0, 0, 0, 127,61, 14, 0, 0, 0, 0, 0, 144,4, 16, 0, + 0, 0, 0, 0, 8, 33, 142,0, 0, 96, 0, 0, 8, 0, 4, 0, 0, 0, 0, 0, 17, 68, 128,0, 0, 0, 0, 0, 53, 205,10, 0, 0, 0, 0, 0, 17, 73, 208,0, + 0, 0, 0, 0, 25, 32, 16, 0, 0, 0, 0, 0, 8, 12, 0, 0, 0, 0, 0, 0, 72, 4, 66, 0, 0, 0, 0, 0, 2, 4, 2, 0, 0, 0, 0, 0, 0, 97, 0, 0, + 16, 228,38, 0, 255,255,255,3, 0, 0, 0, 0, 224,88, 0, 0, 0, 0, 0, 0, 0, 128,0, 2, 0, 0, 2, 0, 126,188,62, 3, 0, 0, 0, 0, 88, 1, 4, 1, + 0, 224,46, 0, 16, 112,12, 0, 0, 112,2, 0, 0, 64, 8, 0, 0, 0, 0, 0, 25, 9, 0, 1, 0, 0, 0, 0, 249,185,110,1, 0, 0, 0, 0, 136,32, 0, 0, + 0, 0, 0, 0, 216,73, 4, 1, 0, 128,0, 0, 144,1, 4, 0, 0, 0, 0, 0, 128,9, 4, 0, 0, 32, 0, 0, 51, 24, 69, 1, 0, 0, 0, 0, 153,77, 8, 1, + 0, 0, 0, 0, 8, 24, 4, 1, 0, 8, 0, 0, 210,217,102,0, 0, 0, 0, 0, 10, 40, 64, 0, 0, 32, 0, 0, 16, 16, 0, 0, 0, 32, 0, 0, 64, 130,2, 0, + 0, 0, 0, 0, 149,209,4, 0, 0, 96, 4, 0, 17, 32, 2, 0, 0, 0, 0, 0, 27, 105,6, 1, 0, 0, 0, 0, 12, 32, 18, 1, 0, 0, 0, 0, 17, 1, 68, 1, + 0, 0, 0, 0, 0, 41, 6, 1, 0, 0, 0, 0, 146,8, 78, 0, 0, 0, 0, 0, 128,192,8, 0, 0, 0, 0, 0, 1, 40, 4, 0, 0, 0, 0, 0, 149,125,92, 2, + 0, 0, 0, 0, 64, 56, 32, 0, 0, 0, 0, 0, 72, 32, 0, 2, 0, 0, 1, 0, 20, 9, 4, 0, 0, 0, 0, 0, 179,89, 6, 0, 0, 0, 0, 0, 8, 56, 12, 0, + 0, 0, 0, 0, 2, 72, 0, 0, 0, 96, 32, 0, 8, 0, 4, 0, 0, 0, 0, 0, 34, 56, 78, 2, 0, 0, 0, 0, 16, 65, 16, 1, 0, 0, 0, 0, 29, 0, 5, 0, + 0, 0, 0, 0, 24, 176,2, 0, 0, 36, 0, 0, 223,121,126,3, 0, 224,4, 0, 2, 0, 4, 0, 0, 0, 0, 0, 0, 60, 134,1, 0, 0, 0, 0, 18, 25, 68, 0, + 0, 0, 0, 0, 160,0, 12, 0, 0, 0, 0, 0, 151,25, 64, 1, 0, 0, 0, 0, 172,24, 78, 0, 0, 0, 0, 0, 119,36, 14, 2, 0, 0, 0, 0, 0, 5, 8, 0, + 0, 0, 0, 0, 67, 64, 0, 0, 0, 0, 0, 0, 65, 16, 16, 0, 0, 0, 0, 0, 12, 32, 4, 0, 0, 4, 0, 0, 17, 64, 8, 0, 0, 0, 0, 0, 5, 8, 8, 0, + 0, 96, 0, 0, 20, 65, 4, 0, 0, 32, 0, 0, 0, 64, 36, 0, 0, 0, 0, 0, 28, 236,78, 1, 0, 0, 0, 0, 1, 12, 4, 0, 0, 0, 0, 0, 0, 69, 4, 0, + 0, 0, 0, 0, 51, 9, 26, 1, 0, 0, 0, 0, 17, 105,18, 1, 0, 0, 0, 0, 4, 48, 2, 0, 0, 0, 0, 0, 84, 32, 0, 0, 0, 0, 0, 0, 243,121,114,1, + 0, 0, 0, 0, 147,249,6, 0, 0, 0, 0, 0, 10, 48, 10, 0, 0, 0, 0, 0, 8, 8, 8, 2, 0, 0, 0, 0, 4, 57, 46, 0, 0, 32, 0, 0, 0, 68, 0, 0, + 0, 0, 0, 0, 64, 16, 12, 0, 0, 0, 0, 0, 144,121,30, 0, 0, 0, 0, 0, 72, 48, 0, 0, 0, 0, 0, 0, 16, 21, 0, 1, 0, 0, 0, 0, 208,29, 0, 0, + 0, 0, 0, 0, 34, 0, 0, 2, 0, 0, 0, 0, 254,62, 46, 0, 0, 0, 0, 0, 146,121,4, 0, 0, 0, 0, 0, 18, 16, 0, 0, 0, 0, 0, 0, 3, 24, 0, 0, + 0, 0, 0, 0, 145,96, 8, 0, 0, 0, 0, 0, 32, 0, 36, 0, 0, 0, 16, 0, 178,1, 4, 1, 0, 0, 0, 0, 16, 120,0, 0, 0, 0, 0, 0, 27, 0, 8, 0, + 0, 0, 0, 0, 17, 48, 2, 0, 0, 0, 0, 0, 253,64, 76, 0, 0, 0, 0, 0, 1, 129,8, 0, 0, 0, 0, 0, 20, 9, 0, 0, 0, 0, 0, 0, 151,121,12, 0, + 0, 0, 0, 0, 131,16, 12, 2, 0, 0, 0, 0, 145,32, 0, 2, 0, 0, 0, 0, 219,61, 76, 0, 0, 128,2, 0, 255,255,127,3, 0, 0, 0, 0, 206,177,76, 3, + 0, 0, 0, 0, 128,0, 22, 2, 0, 0, 0, 0, 0, 13, 12, 0, 0, 0, 0, 0, 111,244,118,1, 0, 0, 0, 0, 0, 48, 4, 2, 0, 0, 0, 0, 16, 65, 6, 0, + 0, 32, 0, 0, 29, 184,76, 0, 0, 0, 0, 0, 27, 69, 0, 0, 0, 0, 0, 0, 16, 81, 15, 0, 0, 0, 0, 0, 8, 2, 6, 0, 0, 0, 0, 0, 253,114,140,3, + 0, 0, 0, 0, 81, 64, 8, 0, 0, 0, 0, 0, 145,65, 12, 2, 0, 32, 0, 0, 2, 40, 34, 0, 0, 32, 0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 149,65, 12, 0, + 0, 0, 0, 0, 29, 113,70, 3, 0, 0, 0, 0, 234,48, 14, 1, 0, 32, 0, 0, 11, 64, 68, 0, 0, 0, 0, 0, 10, 20, 12, 1, 0, 0, 0, 0, 16, 0, 18, 1, + 0, 0, 0, 0, 53, 224,12, 0, 0, 0, 0, 0, 146,0, 76, 0, 0, 0, 0, 0, 16, 64, 64, 0, 0, 0, 0, 0, 6, 0, 16, 0, 0, 0, 0, 0, 2, 80, 72, 0, + 0, 0, 0, 0, 147,65, 69, 0, 0, 0, 0, 0, 172,161,19, 1, 0, 0, 0, 0, 147,245,72, 1, 0, 0, 0, 0, 16, 8, 4, 1, 0, 0, 0, 0, 1, 32, 98, 1, + 0, 0, 0, 0, 17, 96, 2, 0, 0, 0, 0, 0, 144,65, 2, 2, 0, 0, 0, 0, 13, 16, 4, 0, 0, 0, 0, 0, 0, 32, 6, 1, 0, 0, 0, 0, 1, 0, 28, 0, + 0, 32, 44, 0, 128,128,4, 0, 0, 0, 0, 0, 145,65, 0, 1, 0, 0, 0, 0, 19, 65, 0, 1, 0, 0, 0, 0, 255,221,30, 3, 0, 0, 0, 0, 12, 185,6, 1, + 0, 0, 0, 0, 5, 64, 16, 0, 0, 128,0, 0, 17, 73, 30, 0, 0, 0, 0, 0, 69, 4, 2, 0, 0, 0, 0, 0, 8, 8, 2, 2, 0, 0, 0, 0, 64, 9, 12, 1, + 0, 0, 0, 0, 0, 16, 10, 0, 0, 0, 0, 0, 8, 8, 20, 0, 0, 0, 0, 0, 64, 40, 4, 0, 0, 0, 0, 0, 5, 40, 14, 0, 0, 0, 0, 0, 24, 1, 0, 1, + 0, 0, 0, 0, 65, 9, 28, 1, 0, 0, 0, 0, 68, 44, 14, 0, 0, 96, 0, 0, 3, 0, 4, 0, 0, 112,0, 0, 0, 42, 18, 0, 0, 0, 0, 0, 8, 9, 12, 0, + 0, 0, 0, 0, 20, 0, 12, 0, 0, 0, 0, 0, 64, 36, 10, 0, 0, 0, 0, 0, 177,73, 14, 0, 0, 0, 0, 0, 0, 8, 66, 0, 0, 0, 0, 0, 128,8, 64, 0, + 0, 0, 0, 0, 0, 12, 4, 0, 0, 0, 0, 0, 6, 48, 0, 0, 0, 0, 0, 0, 145,77, 18, 1, 0, 0, 0, 0, 0, 152,22, 0, 0, 0, 0, 0, 16, 17, 2, 0, + 0, 0, 0, 0, 8, 16, 18, 0, 0, 0, 0, 0, 0, 64, 16, 1, 0, 0, 0, 0, 81, 201,22, 3, 0, 0, 0, 0, 13, 16, 2, 0, 0, 32, 0, 0, 2, 8, 4, 0, + 0, 0, 0, 0, 5, 32, 40, 0, 0, 0, 0, 0, 76, 176,78, 0, 0, 0, 0, 0, 160,128,4, 0, 0, 0, 0, 0, 9, 57, 6, 0, 0, 0, 0, 0, 17, 0, 0, 3, + 0, 0, 0, 0, 9, 16, 6, 0, 0, 0, 0, 0, 187,57, 87, 0, 0, 0, 0, 0, 72, 0, 2, 0, 0, 0, 0, 0, 2, 56, 14, 0, 0, 0, 0, 0, 130,28, 4, 0, + 0, 0, 0, 0, 0, 80, 8, 0, 0, 224,0, 0, 24, 0, 4, 0, 0, 0, 0, 0, 162,20, 78, 1, 0, 32, 0, 0, 0, 16, 64, 0, 0, 0, 0, 0, 77, 0, 196,0, + 0, 96, 0, 0, 0, 0, 8, 0, 0, 32, 0, 0, 17, 17, 4, 0, 0, 0, 0, 0, 64, 8, 36, 0, 0, 0, 0, 0, 4, 4, 8, 0, 0, 0, 0, 0, 68, 56, 30, 0, + 0, 0, 0, 0, 1, 65, 2, 0, 0, 0, 0, 0, 68, 8, 1, 0, 0, 32, 0, 0, 0, 0, 12, 2, 0, 0, 0, 0, 148,89, 88, 2, 0, 0, 0, 0, 0, 56, 0, 1, + 0, 0, 0, 0, 145,73, 70, 2, 0, 0, 0, 0, 2, 33, 0, 0, 0, 96, 0, 0, 22, 185,12, 0, 0, 0, 0, 0, 8, 161,2, 0, 0, 0, 0, 0, 17, 164,4, 0, + 0, 0, 0, 0, 17, 64, 6, 0, 0, 0, 0, 0, 100,101,44, 0, 0, 0, 0, 0, 149,201,124,0, 0, 0, 0, 0, 0, 16, 26, 0, 0, 0, 0, 0, 0, 16, 36, 0, + 0, 0, 0, 0, 108,184,14, 2, 0, 0, 0, 0, 4, 64, 8, 0, 0, 0, 0, 0, 4, 40, 129,0, 0, 0, 0, 0, 128,8, 12, 0, 0, 0, 0, 0, 0, 32, 12, 2, + 0, 0, 0, 0, 8, 0, 20, 0, 0, 0, 0, 0, 137,168,44, 0, 0, 0, 0, 0, 16, 144,4, 0, 0, 0, 0, 0, 255,253,254,3, 0, 0, 0, 0, 76, 36, 14, 2, + 0, 0, 0, 0, 16, 81, 24, 0, 0, 0, 0, 0, 49, 121,0, 0, 0, 0, 0, 0, 15, 37, 108,2, 0, 0, 0, 0, 128,0, 2, 2, 0, 0, 0, 0, 33, 64, 16, 0, + 0, 0, 0, 0, 92, 100,173,0, 0, 32, 36, 0, 149,4, 4, 0, 0, 0, 0, 0, 17, 1, 64, 0, 0, 0, 0, 0, 2, 32, 66, 0, 0, 128,0, 0, 17, 65, 4, 2, + 0, 0, 0, 0, 200,57, 12, 0, 0, 0, 0, 0, 0, 32, 8, 2, 0, 0, 0, 0, 8, 0, 74, 0, 0, 0, 0, 0, 149,132,8, 0, 0, 0, 0, 0, 16, 24, 0, 2, + 0, 0, 0, 0, 0, 36, 8, 0, 0, 0, 0, 0, 192,1, 20, 0, 0, 64, 0, 0, 255,253,79, 2, 0, 0, 0, 0, 0, 40, 82, 0, 0, 0, 0, 0, 40, 186,10, 0, + 0, 32, 0, 0, 24, 16, 4, 0, 0, 0, 0, 0, 84, 128,6, 0, 0, 0, 0, 0, 19, 17, 2, 0, 0, 0, 0, 0, 18, 40, 42, 0, 0, 0, 0, 0, 8, 64, 2, 0, + 0, 0, 0, 0, 4, 129,8, 2, 0, 0, 0, 0, 2, 16, 32, 0, 0, 0, 0, 0, 19, 92, 0, 0, 0, 0, 0, 0, 0, 144,2, 0, 0, 0, 0, 0, 25, 65, 18, 0, + 0, 0, 0, 0, 16, 40, 66, 0, 0, 0, 0, 0, 0, 129,8, 0, 0, 0, 0, 0, 17, 105,2, 1, 0, 0, 0, 0, 76, 41, 2, 0, 0, 0, 0, 0, 4, 42, 2, 1, + 0, 0, 0, 0, 0, 96, 10, 0, 0, 196,0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 97, 22, 0, 0, 4, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 2, 56, 50, 0, + 0, 0, 0, 0, 145,125,0, 0, 0, 0, 0, 0, 32, 17, 2, 1, 0, 0, 0, 0, 0, 168,135,0, 0, 0, 0, 0, 84, 32, 128,0, 0, 0, 0, 0, 149,73, 82, 1, + 0, 0, 0, 0, 14, 57, 14, 0, 0, 0, 0, 0, 114,168,38, 1, 0, 0, 0, 0, 195,72, 4, 0, 0, 0, 0, 0, 4, 164,2, 1, 0, 8, 0, 0, 181,109,62, 3, + 0, 0, 0, 0, 0, 40, 72, 0, 0, 4, 0, 0, 144,1, 4, 0, 0, 0, 0, 0, 17, 113,2, 1, 0, 32, 0, 0, 16, 64, 0, 0, 0, 0, 0, 0, 16, 33, 12, 0, + 0, 0, 0, 0, 144,112,5, 0, 16, 0, 0, 0, 2, 41, 64, 0, 0, 0, 0, 0, 127,188,238,0, 0, 0, 0, 0, 0, 36, 130,0, 0, 0, 0, 0, 21, 64, 16, 0, + 0, 0, 0, 0, 145,1, 8, 0, 0, 224,3, 0, 19, 65, 8, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 238,184,44, 2, 0, 8, 0, 0, 17, 0, 0, 0, + 0, 0, 0, 0, 20, 192,8, 0, 0, 32, 0, 0, 16, 68, 8, 0, 0, 0, 0, 0, 145,64, 6, 0, 0, 0, 8, 0, 211,75, 2, 0, 0, 0, 0, 0, 140,168,14, 0, + 0, 32, 0, 0, 92, 69, 4, 0, 0, 0, 0, 0, 4, 96, 4, 2, 0, 0, 0, 0, 0, 68, 40, 0, 0, 0, 0, 0, 48, 137,12, 0, 0, 0, 0, 0, 32, 9, 20, 0, + 16, 0, 0, 0, 223,57, 79, 1, 0, 0, 0, 0, 128,64, 12, 2, 0, 32, 0, 0, 10, 80, 72, 0, 0, 0, 0, 0, 1, 3, 0, 1, 0, 0, 0, 0, 29, 40, 12, 0, + 0, 32, 4, 0, 8, 72, 4, 0, 0, 0, 0, 0, 4, 44, 2, 1, 0, 0, 0, 0, 1, 0, 48, 0, 0, 0, 0, 0, 19, 65, 73, 1, 0, 128,0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 183,249,153,0, 0, 0, 0, 0, 68, 56, 6, 0, 0, 0, 0, 0, 16, 136,6, 0, 0, 0, 0, 0, 68, 24, 14, 0, 0, 0, 0, 0, 80, 8, 12, 0, + 0, 0, 0, 0, 76, 160,14, 0, 0, 0, 0, 0, 12, 40, 2, 0, 0, 0, 0, 0, 8, 1, 6, 0, 0, 96, 0, 0, 16, 73, 64, 0, 0, 0, 0, 0, 8, 0, 28, 0, + 0, 160,0, 0, 76, 250,44, 0, 0, 0, 0, 0, 10, 144,0, 0, 0, 0, 0, 0, 87, 184,30, 0, 0, 0, 0, 0, 110,137,70, 0, 0, 0, 0, 0, 0, 193,8, 0, + 0, 0, 0, 0, 25, 153,2, 2, 0, 0, 0, 0, 4, 12, 3, 0, 64, 244,54, 0, 255,255,255,3, 0, 192,0, 0, 22, 0, 0, 0, 0, 64, 3, 0, 32, 0, 0, 0, + 0, 16, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 255,191,255,3, 0, 0, 0, 0, 51, 73, 18, 1, 0, 0, 0, 0, 17, 96, 20, 0, 0, 0, 0, 0, 0, 9, 0, 2, + 0, 0, 0, 0, 4, 4, 1, 2, 0, 0, 0, 0, 149,5, 28, 0, 0, 64, 0, 0, 42, 120,14, 1, 0, 0, 0, 0, 18, 65, 20, 0, 0, 0, 0, 0, 25, 105,6, 0, + 0, 0, 0, 0, 8, 41, 6, 0, 0, 0, 0, 0, 132,32, 14, 0, 0, 0, 0, 0, 1, 33, 0, 1, 0, 0, 0, 0, 81, 105,20, 0, 0, 0, 0, 0, 1, 8, 5, 0, + 0, 0, 0, 0, 27, 43, 6, 1, 0, 0, 0, 0, 138,4, 72, 0, 0, 0, 0, 0, 93, 104,174,2, 0, 0, 0, 0, 24, 73, 28, 0, 0, 0, 0, 0, 247,185,126,1, + 0, 0, 0, 0, 5, 64, 8, 0, 0, 96, 0, 0, 32, 8, 4, 1, 0, 0, 0, 0, 8, 160,6, 0, 0, 0, 0, 0, 223,93, 124,2, 0, 0, 0, 0, 164,33, 6, 0, + 0, 16, 0, 0, 0, 32, 2, 0, 0, 240,15, 0, 16, 1, 6, 0, 0, 0, 0, 0, 40, 64, 0, 0, 0, 0, 0, 0, 0, 32, 14, 1, 0, 0, 0, 0, 130,0, 12, 0, + 0, 8, 32, 0, 27, 65, 20, 0, 0, 0, 0, 0, 68, 0, 192,0, 0, 32, 0, 0, 65, 0, 4, 0, 0, 0, 0, 0, 22, 32, 4, 0, 0, 0, 0, 0, 0, 160,80, 0, + 0, 224,0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 128,8, 8, 0, 0, 0, 0, 0, 16, 65, 20, 2, 0, 0, 0, 0, 19, 65, 16, 1, 0, 0, 0, 0, 69, 40, 12, 0, + 0, 48, 2, 0, 64, 0, 0, 0, 0, 0, 0, 0, 127,111,28, 2, 0, 0, 0, 0, 5, 4, 0, 0, 0, 0, 0, 0, 128,9, 0, 1, 0, 0, 0, 0, 16, 81, 20, 0, + 0, 0, 0, 0, 17, 65, 2, 2, 0, 32, 0, 0, 66, 1, 20, 2, 0, 0, 0, 0, 0, 17, 8, 1, 0, 32, 24, 0, 0, 8, 0, 0, 0, 0, 8, 0, 255,127,127,3, + 0, 0, 0, 0, 206,91, 64, 2, 0, 0, 0, 0, 152,40, 78, 0, 0, 0, 0, 0, 27, 48, 4, 0, 0, 0, 0, 0, 209,64, 0, 0, 0, 0, 0, 0, 147,9, 100,1, + 0, 0, 0, 0, 147,0, 84, 0, 0, 0, 0, 0, 0, 8, 6, 1, 0, 0, 0, 0, 192,46, 18, 0, 0, 0, 0, 0, 4, 73, 8, 0, 0, 0, 0, 0, 176,17, 6, 0, + 0, 0, 0, 0, 151,77, 28, 1, 0, 0, 0, 0, 5, 96, 4, 0, 0, 0, 0, 0, 18, 41, 0, 0, 0, 32, 0, 0, 62, 249,4, 0, 0, 0, 0, 0, 255,223,94, 2, + 0, 0, 0, 0, 128,8, 4, 0, 0, 16, 0, 0, 1, 65, 0, 0, 0, 0, 0, 0, 168,0, 4, 0, 0, 0, 0, 0, 17, 65, 2, 1, 0, 32, 0, 0, 144,9, 4, 0, + 0, 0, 0, 0, 196,16, 0, 0, 0, 0, 0, 0, 94, 168,175,0, 0, 0, 0, 0, 16, 73, 16, 0, 0, 0, 0, 0, 140,13, 12, 0, 0, 0, 0, 0, 5, 1, 8, 0, + 0, 0, 0, 0, 20, 36, 12, 0, 0, 0, 0, 0, 0, 81, 16, 0, 0, 0, 0, 0, 0, 8, 2, 2, 0, 192,31, 0, 0, 0, 4, 0, 0, 0, 0, 0, 22, 44, 38, 2, + 0, 0, 0, 0, 21, 44, 6, 0, 0, 0, 0, 0, 71, 160,0, 0, 0, 0, 2, 0, 0, 8, 0, 0, 0, 0, 0, 0, 161,51, 22, 0, 16, 224,0, 0, 255,127,127,3, + 0, 0, 0, 0, 96, 56, 62, 2, 0, 0, 0, 0, 176,121,4, 1, 0, 0, 0, 0, 128,0, 20, 0, 0, 32, 0, 0, 16, 65, 68, 1, 0, 68, 0, 0, 2, 72, 18, 0, + 0, 0, 0, 0, 145,4, 24, 0, 0, 0, 0, 0, 25, 73, 22, 0, 0, 0, 0, 0, 0, 12, 0, 1, 0, 0, 0, 0, 0, 8, 194,2, 0, 0, 0, 0, 81, 77, 0, 0, + 0, 0, 0, 0, 21, 69, 0, 0, 0, 0, 0, 0, 138,60, 14, 2, 0, 0, 0, 0, 18, 17, 68, 0, 0, 0, 0, 0, 81, 17, 4, 1, 0, 0, 0, 0, 81, 72, 16, 0, + 0, 0, 0, 0, 86, 62, 14, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 90, 16, 12, 0, 0, 0, 0, 0, 144,32, 0, 1, 0, 0, 0, 0, 95, 221,60, 2, + 0, 0, 0, 0, 147,180,12, 0, 0, 0, 0, 0, 6, 236,148,2, 0, 0, 0, 0, 25, 64, 8, 0, 0, 96, 0, 0, 4, 0, 132,0, 0, 0, 0, 0, 145,113,4, 0, + 0, 0, 0, 0, 128,0, 14, 0, 0, 0, 0, 0, 8, 48, 2, 2, 0, 0, 0, 0, 144,69, 8, 0, 0, 0, 0, 0, 144,112,20, 3, 0, 0, 0, 0, 17, 81, 18, 0, + 0, 0, 0, 0, 94, 125,78, 0, 0, 0, 0, 0, 16, 9, 10, 0, 0, 0, 0, 0, 4, 9, 6, 0, 0, 0, 0, 0, 16, 8, 140,0, 0, 0, 0, 0, 5, 20, 132,0, + 0, 0, 0, 0, 0, 24, 70, 1, 0, 0, 0, 0, 64, 48, 64, 0, 0, 0, 0, 0, 96, 16, 0, 0, 0, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 95, 127,62, 0, + 0, 0, 0, 0, 4, 56, 2, 0, 0, 0, 0, 0, 8, 1, 2, 0, 0, 0, 0, 0, 10, 41, 10, 0, 0, 0, 0, 0, 68, 0, 8, 2, 0, 0, 0, 0, 16, 0, 32, 2, + 0, 0, 0, 0, 155,65, 76, 1, 0, 0, 0, 0, 8, 104,8, 0, 0, 0, 0, 0, 4, 32, 144,2, 0, 0, 0, 0, 68, 105,10, 2, 0, 224,3, 0, 32, 96, 4, 0, + 0, 0, 0, 0, 17, 64, 8, 0, 0, 0, 0, 0, 26, 41, 10, 1, 0, 0, 0, 0, 86, 120,12, 0, 0, 0, 0, 0, 20, 56, 48, 0, 0, 0, 0, 0, 100,16, 4, 0, + 0, 0, 0, 0, 2, 17, 0, 0, 0, 0, 0, 0, 64, 12, 8, 0, 0, 0, 0, 0, 148,156,28, 0, 0, 0, 0, 0, 149,33, 30, 2, 0, 16, 4, 0, 16, 1, 0, 0, + 0, 0, 0, 0, 128,88, 4, 0, 0, 0, 0, 0, 28, 8, 14, 0, 0, 0, 0, 0, 2, 0, 68, 0, 0, 0, 0, 0, 144,40, 0, 2, 0, 16, 0, 0, 112,0, 36, 0, + 0, 0, 0, 0, 136,34, 8, 0, 0, 0, 0, 0, 6, 41, 114,0, 0, 32, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 255,254,255,2, 0, 0, 0, 0, 4, 40, 12, 0, + 0, 0, 0, 0, 129,12, 0, 0, 0, 0, 0, 0, 19, 64, 26, 0, 0, 0, 0, 0, 2, 48, 20, 0, 0, 0, 0, 0, 149,68, 24, 0, 0, 0, 0, 0, 27, 8, 12, 0, + 0, 0, 0, 0, 0, 40, 14, 0, 0, 0, 0, 0, 0, 64, 40, 0, 0, 0, 44, 0, 1, 0, 4, 0, 0, 0, 0, 0, 89, 72, 20, 0, 0, 0, 0, 0, 110,40, 14, 0, + 0, 32, 0, 0, 144,17, 76, 0, 0, 0, 0, 0, 85, 80, 6, 1, 0, 0, 0, 0, 17, 97, 8, 0, 0, 0, 0, 0, 213,89, 60, 0, 0, 0, 0, 0, 0, 64, 12, 1, + 0, 32, 0, 0, 20, 65, 4, 0, 0, 0, 16, 0, 136,8, 4, 0, 0, 0, 0, 0, 211,221,12, 3, 0, 0, 0, 0, 0, 52, 14, 0, 0, 0, 0, 0, 71, 240,16, 0, + 0, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 0, 16, 193,4, 0, 0, 0, 0, 0, 145,209,4, 1, 0, 0, 0, 0, 8, 0, 14, 1, 0, 0, 0, 0, 16, 224,0, 0, + 0, 0, 0, 0, 144,1, 4, 0, 0, 0, 0, 0, 49, 81, 68, 0, 0, 0, 0, 0, 32, 48, 12, 0, 0, 0, 0, 0, 144,64, 2, 0, 0, 0, 0, 0, 127,109,94, 2, + 0, 0, 0, 0, 64, 56, 16, 2, 0, 32, 1, 0, 56, 9, 4, 0, 0, 0, 0, 0, 17, 24, 16, 1, 0, 0, 0, 0, 145,89, 20, 0, 0, 32, 0, 0, 106,120,14, 1, + 0, 32, 0, 0, 146,177,12, 0, 0, 0, 0, 0, 69, 32, 12, 2, 0, 0, 0, 0, 18, 8, 4, 0, 0, 0, 0, 0, 1, 0, 6, 1, 0, 0, 0, 0, 17, 89, 4, 0, + 0, 0, 0, 0, 104,56, 2, 1, 0, 0, 0, 0, 84, 40, 4, 0, 0, 0, 0, 0, 22, 0, 8, 0, 0, 0, 0, 0, 4, 32, 14, 0, 0, 0, 0, 0, 25, 221,28, 0, + 0, 32, 44, 0, 239,185,76, 0, 0, 0, 0, 0, 1, 73, 18, 0, 0, 0, 0, 0, 0, 8, 20, 0, 0, 0, 0, 0, 1, 16, 128,1, 0, 0, 0, 0, 17, 41, 84, 0, + 0, 34, 0, 0, 195,72, 12, 0, 0, 0, 0, 0, 213,13, 12, 0, 0, 0, 0, 0, 147,24, 0, 0, 0, 32, 32, 0, 246,253,12, 1, 0, 0, 0, 0, 4, 1, 16, 0, + 0, 0, 0, 0, 0, 32, 64, 1, 0, 0, 0, 0, 9, 8, 6, 1, 0, 32, 0, 0, 0, 17, 4, 1, 0, 0, 0, 0, 48, 9, 20, 0, 0, 0, 0, 0, 213,100,14, 2, + 0, 0, 0, 0, 17, 67, 4, 1, 0, 0, 0, 0, 209,190,70, 1, 0, 0, 2, 0, 37, 5, 6, 0, 0, 0, 0, 0, 18, 1, 0, 2, 0, 32, 0, 0, 24, 96, 0, 1, + 0, 0, 16, 0, 66, 80, 10, 0, 0, 0, 0, 0, 8, 1, 2, 1, 0, 32, 0, 0, 32, 2, 0, 0, 0, 0, 0, 0, 155,65, 56, 1, 0, 4, 0, 0, 207,181,255,1, + 0, 0, 0, 0, 132,68, 0, 0, 0, 0, 0, 0, 82, 153,6, 0, 0, 0, 0, 0, 64, 24, 2, 0, 0, 0, 0, 0, 16, 33, 4, 1, 0, 0, 0, 0, 19, 17, 20, 0, + 0, 32, 0, 0, 2, 96, 14, 0, 0, 0, 0, 0, 89, 37, 4, 0, 0, 0, 0, 0, 0, 130,4, 0, 0, 224,2, 0, 122,185,0, 1, 0, 0, 0, 0, 179,105,94, 0, + 0, 0, 0, 0, 74, 48, 8, 0, 0, 0, 0, 0, 223,53, 254,0, 0, 0, 0, 0, 66, 4, 4, 0, 0, 0, 0, 0, 68, 53, 14, 0, 0, 0, 0, 0, 0, 1, 68, 0, + 0, 0, 0, 0, 145,48, 0, 0, 0, 0, 0, 0, 25, 97, 12, 0, 0, 0, 0, 0, 132,32, 4, 0, 0, 0, 0, 0, 18, 48, 0, 1, 0, 0, 0, 0, 149,0, 8, 0, + 0, 0, 0, 0, 17, 1, 20, 1, 0, 0, 0, 0, 86, 176,14, 0, 0, 0, 0, 0, 17, 33, 6, 0, 0, 32, 0, 0, 0, 8, 4, 1, 0, 0, 0, 0, 76, 36, 12, 0, + 0, 0, 0, 0, 18, 1, 16, 0, 0, 32, 0, 0, 0, 72, 6, 0, 0, 0, 0, 0, 48, 208,4, 1, 0, 0, 0, 0, 221,240,94, 1, 0, 0, 0, 0, 8, 4, 2, 2, + 0, 0, 0, 0, 80, 137,68, 0, 0, 0, 0, 0, 128,128,4, 0, 0, 0, 0, 0, 21, 69, 18, 1, 0, 0, 0, 0, 1, 36, 12, 3, 0, 0, 0, 0, 28, 0, 12, 2, + 0, 0, 0, 0, 11, 96, 4, 0, 0, 32, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 129,65, 12, 0, 0, 96, 0, 0, 16, 1, 4, 1, 0, 0, 0, 0, 255,117,174,0, + 0, 0, 0, 0, 68, 40, 8, 0, 0, 0, 0, 0, 16, 1, 8, 1, 0, 0, 0, 0, 247,113,106,2, 0, 32, 48, 0, 0, 0, 0, 0, 0, 32, 0, 0, 1, 8, 2, 0, + 0, 0, 0, 0, 223,253,254,3, 0, 0, 0, 0, 129,5, 16, 0, 0, 0, 0, 0, 89, 96, 0, 0, 0, 0, 0, 0, 12, 8, 14, 0, 0, 0, 0, 0, 209,72, 28, 0, + 0, 0, 0, 0, 0, 16, 5, 0, 0, 0, 0, 0, 19, 8, 132,0, 0, 0, 0, 0, 217,29, 76, 2, 0, 0, 0, 0, 85, 96, 0, 0, 0, 0, 0, 0, 16, 57, 76, 0, + 0, 0, 0, 0, 17, 81, 0, 1, 0, 0, 0, 0, 21, 32, 4, 0, 0, 0, 0, 0, 0, 12, 16, 0, 0, 0, 0, 0, 16, 17, 20, 0, 0, 0, 0, 0, 92, 97, 60, 2, + 0, 0, 0, 0, 17, 104,22, 1, 0, 0, 0, 0, 0, 32, 72, 2, 0, 0, 0, 0, 145,33, 20, 0, 0, 0, 0, 0, 0, 8, 8, 2, 0, 0, 0, 0, 6, 40, 6, 1, + 0, 32, 0, 0, 62, 12, 14, 0, 0, 0, 0, 0, 145,129,4, 0, 0, 0, 0, 0, 179,187,68, 1, 0, 96, 14, 0, 16, 1, 4, 0, 0, 0, 0, 0, 4, 9, 8, 1, + 0, 0, 0, 0, 127,253,95, 3, 0, 0, 0, 0, 72, 60, 0, 1, 0, 0, 0, 0, 145,5, 16, 0, 0, 32, 0, 0, 40, 136,4, 0, 0, 240,35, 0, 240,81, 12, 1, + 0, 224,0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 247,191,238,0, 0, 0, 0, 0, 145,21, 8, 0, 0, 0, 0, 0, 1, 33, 4, 0, 0, 32, 32, 0, 17, 17, 38, 0, + 0, 96, 0, 0, 0, 0, 0, 1, 0, 32, 0, 0, 32, 17, 12, 0, 0, 0, 0, 0, 16, 96, 32, 0, 0, 0, 0, 0, 17, 105,20, 0, 0, 0, 0, 0, 32, 32, 32, 0, + 0, 0, 0, 0, 147,73, 84, 0, 0, 0, 0, 0, 8, 9, 0, 0, 0, 0, 0, 0, 8, 40, 2, 1, 0, 32, 0, 64, 16, 1, 14, 0, 0, 0, 0, 0, 3, 8, 6, 1, + 0, 0, 0, 0, 215,88, 28, 1, 0, 0, 0, 0, 16, 8, 8, 1, 0, 0, 0, 0, 209,53, 22, 1, 0, 0, 0, 0, 1, 160,4, 0, 0, 0, 0, 0, 4, 16, 66, 0, + 0, 0, 0, 0, 48, 32, 12, 0, 0, 96, 0, 0, 0, 64, 8, 0, 0, 0, 0, 0, 206,60, 12, 0, 0, 0, 0, 0, 32, 0, 4, 2, 0, 32, 0, 0, 16, 1, 36, 0, + 0, 0, 0, 0, 146,65, 0, 2, 0, 0, 0, 0, 197,40, 143,1, 0, 0, 0, 0, 94, 5, 4, 0, 0, 0, 0, 0, 17, 9, 6, 0, 0, 66, 0, 0, 37, 165,142,0, + 0, 0, 0, 0, 0, 64, 9, 0, 0, 0, 0, 0, 144,0, 2, 1, 0, 0, 0, 0, 21, 0, 6, 3, 0, 0, 0, 0, 18, 12, 0, 0, 0, 32, 0, 0, 254,16, 206,1, + 0, 0, 0, 0, 0, 8, 48, 0, 0, 128,0, 0, 61, 97, 148,1, 0, 0, 0, 0, 222,189,254,3, 0, 0, 0, 0, 5, 5, 8, 0, 0, 0, 0, 0, 16, 4, 0, 1, + 0, 0, 0, 0, 65, 113,2, 0, 0, 0, 0, 0, 8, 104,6, 2, 0, 0, 0, 0, 16, 137,0, 0, 0, 40, 0, 0, 8, 0, 70, 0, 0, 0, 0, 0, 92, 167,77, 2, + 0, 0, 0, 0, 145,69, 20, 1, 0, 32, 32, 0, 0, 32, 4, 1, 0, 32, 0, 0, 21, 4, 0, 0, 0, 0, 0, 0, 0, 96, 12, 0, 0, 96, 0, 0, 4, 0, 1, 2, + 0, 32, 0, 0, 16, 185,18, 0, 0, 96, 6, 0, 177,105,20, 3, 0, 0, 0, 0, 162,0, 14, 0, 0, 0, 0, 0, 0, 128,96, 0, 0, 0, 0, 0, 1, 1, 16, 3, + 0, 0, 0, 0, 0, 104,12, 0, 0, 0, 0, 0, 148,1, 20, 0, 0, 0, 0, 0, 16, 1, 26, 2, 0, 0, 0, 0, 88, 40, 12, 0, 0, 0, 0, 0, 16, 1, 0, 2, + 0, 0, 0, 0, 16, 8, 10, 1, 0, 0, 0, 64, 223,127,127,3, 0, 32, 0, 0, 27, 81, 4, 1, 0, 112,36, 0, 25, 73, 2, 1, 0, 0, 0, 0, 25, 65, 2, 1, + 0, 0, 0, 0, 16, 40, 10, 0, 0, 0, 0, 0, 1, 69, 8, 0, 0, 0, 0, 0, 18, 64, 0, 0, 0, 160,33, 0, 190,255,126,2, 0, 0, 0, 0, 16, 65, 20, 1, + 0, 0, 0, 0, 17, 88, 0, 0, 0, 240,59, 0, 0, 0, 4, 0, 0, 0, 0, 0, 17, 64, 4, 1, 0, 0, 0, 0, 21, 128,24, 0, 0, 0, 0, 0, 1, 64, 16, 1, + 0, 0, 0, 0, 81, 65, 16, 0, 0, 0, 0, 0, 250,62, 14, 0, 0, 0, 0, 0, 145,21, 0, 0, 0, 0, 8, 0, 17, 81, 0, 0, 0, 0, 0, 0, 92, 101,12, 2, + 0, 32, 0, 0, 32, 17, 72, 1, 0, 0, 0, 0, 148,32, 9, 0, 0, 32, 0, 0, 16, 120,64, 0, 0, 0, 0, 0, 2, 9, 76, 2, 0, 0, 0, 0, 63, 18, 10, 0, + 0, 0, 0, 0, 223,255,188,2, 0, 0, 0, 0, 129,4, 8, 0, 0, 0, 0, 0, 89, 88, 8, 0, 0, 0, 0, 0, 138,56, 14, 2, 0, 0, 0, 0, 147,28, 14, 0, + 0, 0, 0, 0, 16, 105,12, 2, 0, 0, 0, 0, 193,65, 0, 0, 0, 0, 0, 0, 150,69, 8, 0, 0, 0, 0, 0, 132,65, 12, 2, 0, 32, 0, 0, 80, 153,0, 3, + 16, 0, 0, 0, 223,121,92, 3, 0, 0, 0, 0, 138,24, 4, 0, 0, 32, 0, 0, 96, 56, 4, 0, 0, 0, 0, 0, 2, 88, 64, 0, 0, 0, 0, 0, 8, 104,4, 0, + 0, 0, 0, 0, 155,80, 32, 0, 0, 0, 0, 0, 28, 5, 12, 0, 0, 64, 0, 0, 19, 89, 70, 2, 0, 0, 0, 0, 4, 1, 12, 1, 0, 32, 0, 0, 18, 65, 4, 1, + 0, 0, 0, 0, 212,57, 28, 0, 0, 32, 0, 0, 38, 9, 36, 1, 0, 0, 0, 0, 1, 132,0, 0, 0, 0, 0, 0, 132,65, 8, 0, 0, 0, 0, 0, 27, 89, 6, 0, + 0, 0, 0, 0, 8, 9, 16, 0, 0, 12, 0, 0, 0, 8, 12, 0, 0, 0, 0, 0, 255,254,143,2, 0, 0, 0, 0, 8, 128,1, 0, 0, 32, 4, 0, 16, 0, 0, 0, + 0, 0, 0, 0, 133,21, 0, 0, 16, 48, 44, 64, 241,121,92, 1, 0, 0, 0, 0, 24, 16, 2, 0, 0, 96, 4, 0, 128,32, 0, 0, 0, 96, 0, 0, 1, 128,0, 0, + 1, 112,28, 0, 67, 0, 2, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 192,56, 6, 0, 0, 0, 0, 0, 2, 16, 12, 3, 0, 0, 0, 0, 209,73, 16, 0, + 0, 0, 0, 0, 48, 17, 0, 0, 0, 0, 0, 0, 161,117,76, 0, 0, 0, 0, 0, 8, 113,6, 1, 0, 0, 0, 0, 255,220,108,0, 0, 0, 0, 0, 128,65, 2, 0, + 0, 0, 0, 0, 179,49, 70, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0, 64, 100,0, 0, 0, 32, 1, 0, 255,101,12, 0, 0, 0, 0, 0, 32, 37, 2, 0, + 0, 0, 0, 0, 128,5, 8, 0, 0, 0, 0, 0, 145,1, 4, 1, 0, 32, 0, 0, 84, 16, 4, 0, 0, 0, 0, 0, 119,125,30, 3, 0, 0, 0, 0, 17, 9, 16, 1, + 0, 0, 0, 0, 128,1, 2, 0, 0, 0, 0, 0, 0, 32, 88, 0, 0, 0, 0, 0, 129,65, 64, 0, 0, 0, 0, 0, 8, 4, 64, 0, 0, 0, 0, 0, 2, 4, 8, 1, + 0, 0, 0, 0, 149,97, 12, 0, 0, 0, 0, 0, 32, 108,0, 0, 0, 0, 0, 0, 18, 33, 0, 1, 0, 0, 0, 0, 151,65, 30, 1, 0, 0, 0, 0, 2, 1, 0, 1, + 0, 0, 0, 0, 52, 0, 8, 0, 0, 4, 0, 0, 57, 109,24, 1, 0, 0, 0, 0, 52, 32, 2, 1, 0, 0, 0, 0, 152,32, 0, 0, 0, 4, 0, 0, 0, 2, 12, 0, + 0, 32, 32, 0, 0, 0, 2, 0, 0, 0, 0, 0, 34, 2, 0, 0, 0, 32, 0, 0, 2, 2, 0, 0, 16, 188,34, 0, 255,255,255,3, 0, 0, 0, 0, 136,36, 0, 0, + 0, 16, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 168,6, 0, 0, 0, 0, 0, 147,73, 2, 1, 0, 0, 0, 0, 17, 12, 2, 1, 0, 96, 0, 0, 17, 9, 4, 0, + 0, 0, 0, 0, 149,5, 16, 1, 0, 0, 0, 0, 123,73, 84, 3, 0, 0, 0, 0, 0, 24, 16, 0, 0, 0, 0, 0, 26, 64, 0, 0, 0, 0, 0, 0, 11, 13, 14, 0, + 0, 0, 0, 0, 145,4, 0, 2, 0, 0, 0, 0, 16, 101,0, 0, 0, 0, 0, 0, 209,105,6, 0, 0, 0, 0, 0, 1, 56, 2, 0, 0, 0, 0, 0, 91, 58, 30, 0, + 0, 0, 0, 0, 16, 9, 20, 0, 0, 0, 0, 0, 48, 65, 4, 0, 0, 0, 0, 0, 145,64, 4, 0, 0, 0, 0, 0, 128,128,10, 0, 0, 0, 0, 0, 251,223,124,1, + 0, 0, 0, 0, 206,176,190,3, 0, 0, 0, 0, 64, 65, 8, 0, 0, 0, 0, 0, 8, 33, 0, 3, 0, 0, 0, 0, 128,4, 4, 0, 0, 0, 0, 0, 5, 104,14, 1, + 0, 0, 0, 0, 53, 252,16, 2, 0, 0, 0, 0, 9, 69, 4, 0, 0, 0, 0, 0, 19, 81, 84, 1, 0, 0, 0, 0, 212,48, 94, 0, 0, 0, 0, 0, 88, 1, 0, 0, + 0, 0, 0, 0, 192,112,14, 1, 0, 0, 0, 0, 129,72, 0, 0, 0, 0, 0, 0, 245,244,52, 0, 0, 0, 0, 0, 133,64, 0, 0, 0, 0, 0, 0, 65, 0, 16, 0, + 0, 0, 0, 0, 74, 160,68, 0, 0, 0, 0, 0, 4, 128,4, 2, 0, 0, 0, 0, 32, 33, 70, 0, 0, 0, 0, 0, 0, 64, 72, 0, 0, 0, 0, 0, 128,4, 8, 2, + 0, 0, 0, 0, 83, 217,22, 0, 0, 0, 0, 0, 68, 8, 6, 1, 0, 0, 0, 0, 145,73, 2, 1, 0, 0, 0, 0, 17, 40, 8, 0, 0, 0, 0, 0, 14, 220,78, 2, + 0, 32, 0, 0, 65, 64, 4, 0, 0, 32, 0, 0, 128,128,14, 0, 0, 32, 0, 0, 64, 0, 4, 0, 0, 0, 0, 0, 0, 32, 72, 0, 0, 0, 0, 0, 125,107,28, 3, + 0, 0, 0, 0, 8, 128,68, 0, 0, 0, 0, 0, 145,65, 2, 1, 0, 0, 0, 0, 16, 32, 2, 2, 0, 0, 0, 0, 1, 34, 0, 0, 0, 0, 0, 0, 0, 16, 6, 1, + 0, 0, 0, 0, 19, 105,94, 1, 0, 0, 0, 0, 8, 24, 14, 0, 0, 0, 0, 0, 82, 48, 6, 0, 0, 0, 0, 0, 16, 32, 24, 0, 0, 0, 0, 0, 18, 4, 24, 0, + 0, 0, 0, 0, 144,32, 58, 2, 0, 0, 0, 0, 230,57, 44, 1, 0, 0, 0, 0, 68, 0, 2, 0, 0, 0, 0, 0, 16, 65, 0, 3, 0, 0, 0, 0, 9, 8, 12, 0, + 0, 0, 0, 0, 17, 105,16, 1, 0, 0, 0, 0, 5, 56, 6, 0, 0, 32, 0, 0, 145,1, 4, 0, 0, 0, 0, 0, 1, 40, 12, 1, 0, 0, 0, 0, 32, 65, 16, 0, + 0, 0, 0, 0, 119,100,44, 0, 0, 0, 0, 0, 0, 65, 8, 1, 0, 0, 0, 0, 153,65, 12, 0, 0, 0, 0, 0, 1, 0, 14, 1, 0, 0, 0, 0, 32, 32, 80, 0, + 0, 0, 0, 0, 194,48, 74, 0, 0, 0, 0, 0, 129,40, 8, 0, 0, 0, 0, 0, 92, 96, 12, 0, 0, 0, 0, 0, 8, 32, 92, 0, 0, 0, 0, 0, 144,71, 8, 0, + 0, 0, 0, 0, 144,121,2, 2, 0, 0, 0, 0, 151,253,77, 0, 0, 0, 0, 0, 0, 33, 8, 1, 0, 0, 0, 0, 48, 64, 0, 0, 0, 0, 0, 0, 17, 121,0, 1, + 0, 0, 0, 0, 16, 161,0, 0, 0, 0, 0, 0, 149,73, 94, 2, 0, 0, 0, 0, 188,12, 70, 0, 0, 32, 0, 0, 128,16, 0, 1, 0, 240,46, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 16, 19, 2, 0, 0, 0, 0, 0, 208,0, 0, 0, 0, 96, 0, 0, 33, 16, 4, 0, 0, 0, 0, 0, 2, 68, 0, 0, 0, 0, 0, 0, 17, 65, 20, 0, + 0, 0, 0, 0, 255,60, 110,2, 0, 0, 0, 0, 144,9, 16, 0, 0, 0, 0, 0, 24, 77, 12, 2, 0, 0, 0, 0, 145,33, 6, 0, 0, 0, 0, 0, 80, 40, 4, 0, + 0, 0, 0, 0, 73, 104,10, 0, 0, 0, 0, 0, 25, 13, 10, 0, 0, 0, 0, 0, 251,120,12, 0, 0, 0, 0, 0, 25, 225,0, 2, 0, 0, 0, 0, 0, 41, 64, 0, + 0, 32, 0, 0, 229,207,18, 1, 0, 0, 0, 0, 129,16, 36, 0, 0, 0, 0, 0, 5, 192,24, 1, 16, 16, 0, 0, 255,253,126,3, 0, 0, 0, 0, 68, 40, 30, 0, + 0, 0, 0, 0, 147,105,68, 1, 0, 0, 0, 0, 147,64, 2, 0, 0, 0, 0, 0, 24, 113,2, 1, 0, 0, 0, 0, 8, 60, 47, 2, 0, 16, 0, 0, 2, 0, 4, 1, + 0, 0, 0, 0, 8, 4, 12, 1, 0, 0, 0, 0, 52, 64, 2, 0, 0, 0, 0, 0, 16, 88, 2, 0, 0, 0, 0, 0, 146,1, 0, 0, 0, 0, 0, 0, 16, 93, 0, 1, + 0, 0, 0, 0, 94, 60, 14, 0, 0, 0, 0, 0, 144,9, 12, 2, 0, 0, 0, 0, 192,32, 0, 2, 0, 0, 0, 0, 251,121,62, 2, 0, 0, 0, 0, 16, 81, 2, 0, + 0, 0, 0, 0, 19, 25, 4, 0, 0, 20, 0, 0, 95, 111,30, 2, 0, 0, 0, 0, 17, 8, 18, 0, 0, 0, 0, 0, 1, 96, 46, 1, 0, 96, 0, 0, 49, 89, 4, 0, + 0, 0, 0, 0, 145,8, 0, 0, 0, 0, 0, 0, 21, 33, 28, 0, 0, 0, 0, 0, 21, 16, 60, 0, 0, 0, 0, 0, 209,105,6, 2, 0, 0, 0, 0, 1, 40, 20, 0, + 0, 0, 0, 0, 236,153,14, 0, 0, 128,0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 145,73, 0, 1, 0, 240,36, 0, 1, 40, 44, 0, 0, 0, 0, 0, 17, 96, 20, 1, + 0, 96, 0, 0, 8, 32, 0, 0, 0, 0, 0, 0, 4, 128,8, 1, 0, 0, 0, 0, 129,161,0, 0, 0, 0, 0, 0, 68, 45, 14, 0, 0, 32, 0, 0, 16, 65, 12, 0, + 0, 0, 0, 0, 129,4, 0, 2, 0, 0, 0, 0, 12, 48, 12, 0, 0, 0, 0, 0, 69, 32, 12, 0, 0, 0, 0, 0, 17, 201,20, 1, 0, 32, 0, 0, 17, 97, 28, 1, + 0, 0, 0, 0, 5, 0, 20, 2, 0, 0, 0, 0, 68, 57, 84, 0, 0, 32, 0, 0, 0, 96, 12, 0, 0, 32, 0, 0, 2, 16, 0, 0, 0, 0, 0, 0, 134,64, 8, 0, + 0, 0, 0, 0, 16, 84, 64, 0, 0, 0, 0, 0, 144,109,22, 3, 0, 0, 0, 0, 36, 64, 0, 0, 0, 0, 0, 0, 149,181,28, 0, 0, 0, 0, 0, 0, 5, 64, 0, + 0, 0, 0, 0, 48, 104,0, 0, 0, 0, 0, 0, 0, 136,8, 0, 16, 0, 0, 0, 191,249,30, 2, 0, 0, 0, 0, 52, 10, 64, 0, 0, 0, 0, 0, 12, 81, 16, 0, + 0, 0, 0, 0, 8, 50, 2, 0, 0, 0, 0, 0, 220,101,162,1, 0, 0, 4, 0, 176,2, 0, 0, 0, 32, 0, 0, 0, 1, 34, 0, 0, 0, 0, 0, 32, 38, 10, 0, + 0, 0, 0, 0, 12, 141,32, 1, 0, 0, 0, 0, 2, 0, 1, 2, 0, 0, 0, 0, 2, 24, 0, 2, 0, 112,8, 0, 64, 16, 130,0, 0, 0, 0, 0, 179,67, 26, 2, + 0, 0, 0, 0, 56, 121,14, 2, 0, 0, 0, 0, 25, 1, 8, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 1, 33, 32, 0, 0, 0, 0, 0, 140,138,2, 1, + 0, 32, 0, 0, 74, 0, 2, 0, 0, 0, 0, 0, 128,2, 0, 0, 0, 0, 0, 0, 19, 108,10, 2, 0, 0, 0, 0, 17, 20, 0, 0, 0, 0, 0, 0, 7, 72, 6, 0, + 0, 0, 0, 0, 205,36, 58, 0, 0, 32, 0, 0, 65, 32, 3, 2, 0, 0, 0, 0, 162,0, 0, 0, 0, 0, 0, 0, 0, 8, 30, 0, 0, 0, 0, 0, 144,32, 8, 0, + 0, 32, 0, 0, 58, 88, 70, 1, 0, 0, 0, 0, 8, 140,0, 0, 0, 0, 0, 0, 255,250,190,2, 0, 0, 0, 0, 68, 249,7, 0, 0, 0, 0, 0, 133,65, 0, 0, + 0, 0, 0, 0, 2, 184,0, 0, 0, 0, 0, 0, 3, 145,0, 0, 0, 0, 0, 0, 125,105,24, 0, 0, 0, 0, 0, 0, 4, 40, 0, 0, 0, 0, 0, 8, 0, 18, 0, + 0, 0, 0, 0, 19, 104,6, 0, 0, 0, 0, 0, 1, 4, 0, 2, 0, 0, 0, 0, 93, 40, 64, 0, 0, 0, 0, 0, 238,40, 14, 0, 0, 0, 0, 0, 145,61, 16, 0, + 0, 0, 0, 0, 18, 9, 4, 1, 0, 0, 0, 0, 0, 60, 2, 0, 0, 0, 0, 0, 160,0, 24, 0, 0, 0, 0, 0, 255,253,46, 3, 0, 96, 0, 0, 16, 65, 4, 0, + 0, 0, 0, 0, 17, 97, 2, 0, 0, 0, 0, 0, 9, 48, 2, 0, 0, 0, 0, 0, 149,81, 20, 1, 0, 0, 0, 0, 4, 56, 14, 1, 0, 0, 0, 0, 215,124,12, 0, + 0, 0, 0, 0, 0, 192,4, 0, 0, 0, 0, 0, 68, 112,8, 0, 0, 0, 0, 0, 19, 184,4, 0, 0, 0, 0, 0, 89, 101,28, 3, 0, 0, 0, 0, 2, 64, 46, 0, + 0, 0, 0, 0, 209,9, 18, 0, 0, 112,36, 0, 2, 1, 0, 1, 0, 0, 0, 0, 4, 8, 0, 2, 0, 0, 0, 0, 22, 4, 0, 0, 0, 0, 0, 0, 53, 57, 42, 0, + 0, 0, 0, 0, 72, 33, 0, 0, 0, 0, 0, 0, 16, 128,20, 0, 0, 0, 0, 0, 123,89, 46, 0, 0, 0, 0, 0, 40, 40, 22, 1, 0, 0, 0, 0, 0, 10, 4, 0, + 0, 32, 8, 0, 32, 1, 4, 3, 0, 96, 5, 0, 4, 0, 4, 0, 0, 0, 0, 0, 8, 41, 24, 0, 0, 0, 0, 0, 9, 0, 128,0, 0, 0, 0, 0, 132,8, 8, 0, + 0, 0, 0, 0, 150,89, 14, 0, 0, 0, 0, 0, 149,8, 8, 2, 0, 0, 0, 0, 144,73, 0, 0, 0, 0, 0, 0, 108,56, 6, 0, 0, 0, 0, 0, 1, 49, 78, 0, + 0, 0, 0, 0, 1, 17, 0, 3, 0, 96, 4, 0, 28, 0, 4, 0, 0, 0, 0, 0, 1, 81, 0, 1, 0, 0, 0, 0, 217,221,34, 1, 0, 0, 0, 0, 2, 2, 2, 3, + 0, 0, 0, 0, 0, 36, 34, 0, 0, 0, 0, 0, 0, 2, 136,0, 0, 0, 0, 0, 27, 65, 20, 1, 0, 0, 0, 0, 223,176,254,3, 0, 0, 0, 0, 186,105,84, 1, + 0, 0, 0, 0, 1, 96, 20, 0, 0, 0, 0, 0, 12, 0, 44, 2, 0, 0, 0, 0, 16, 64, 20, 0, 0, 0, 0, 0, 246,225,76, 0, 0, 32, 0, 0, 182,115,68, 1, + 0, 0, 0, 0, 0, 8, 14, 1, 0, 0, 0, 0, 128,0, 8, 2, 0, 0, 0, 0, 30, 32, 4, 0, 0, 0, 0, 0, 4, 16, 16, 0, 0, 0, 0, 0, 10, 32, 70, 0, + 0, 0, 0, 0, 95, 49, 68, 0, 0, 0, 0, 0, 0, 48, 44, 0, 0, 0, 0, 0, 6, 16, 12, 2, 0, 0, 0, 0, 127,113,110,0, 0, 32, 8, 0, 1, 65, 64, 1, + 0, 0, 0, 0, 31, 240,92, 0, 0, 0, 0, 0, 24, 1, 64, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 24, 4, 12, 0, 0, 0, 0, 0, 145,0, 12, 0, + 0, 0, 0, 0, 127,241,126,1, 0, 32, 0, 0, 0, 9, 0, 0, 0, 32, 0, 0, 0, 16, 12, 0, 0, 96, 33, 0, 16, 32, 0, 0, 0, 0, 0, 0, 49, 64, 16, 0, + 0, 0, 0, 0, 17, 96, 0, 1, 0, 0, 0, 0, 48, 0, 8, 2, 0, 0, 0, 0, 17, 5, 68, 1, 0, 0, 0, 0, 94, 113,12, 0, 0, 0, 0, 0, 1, 32, 20, 0, + 0, 0, 0, 0, 4, 176,0, 0, 0, 0, 0, 0, 64, 136,4, 0, 0, 0, 0, 0, 23, 65, 24, 0, 0, 0, 0, 0, 0, 2, 8, 2, 0, 0, 2, 0, 19, 65, 22, 0, + 0, 0, 0, 0, 82, 0, 94, 0, 0, 0, 0, 0, 64, 1, 2, 0, 0, 0, 0, 0, 4, 16, 6, 2, 0, 8, 0, 0, 0, 0, 12, 0, 0, 96, 1, 0, 255,255,126,3, + 0, 0, 32, 0, 2, 1, 0, 0, 16, 0, 0, 0, 136,40, 74, 0, 0, 0, 0, 0, 2, 141,12, 0, 0, 0, 0, 0, 146,24, 4, 0, 0, 0, 0, 0, 19, 9, 22, 1, + 0, 0, 0, 0, 84, 40, 0, 0, 0, 0, 0, 0, 36, 8, 0, 0, 0, 32, 4, 0, 187,253,86, 3, 0, 0, 0, 0, 8, 24, 98, 0, 0, 0, 0, 0, 96, 0, 0, 0, + 0, 0, 0, 0, 16, 72, 0, 1, 0, 0, 0, 0, 49, 12, 14, 0, 0, 0, 0, 0, 0, 32, 36, 0, 0, 0, 0, 0, 0, 0, 68, 1, 0, 0, 0, 0, 104,8, 74, 1, + 0, 0, 0, 0, 209,216,64, 0, 0, 0, 0, 0, 143,189,78, 0, 0, 0, 0, 0, 24, 5, 0, 0, 0, 0, 0, 0, 72, 45, 12, 0, 0, 0, 0, 0, 128,2, 12, 2, + 0, 0, 0, 0, 49, 81, 14, 0, 0, 0, 0, 0, 16, 49, 2, 0, 0, 0, 0, 0, 209,73, 18, 0, 0, 0, 0, 0, 17, 104,2, 0, 0, 0, 0, 0, 37, 36, 14, 0, + 0, 0, 0, 0, 20, 83, 16, 0, 0, 0, 0, 0, 127,205,28, 2, 0, 0, 0, 0, 6, 36, 6, 1, 0, 32, 0, 0, 179,117,94, 3, 0, 0, 0, 0, 8, 148,0, 0, + 0, 32, 0, 0, 18, 16, 6, 0, 0, 0, 0, 0, 17, 1, 18, 0, 0, 0, 0, 0, 194,16, 0, 0, 0, 0, 0, 0, 16, 40, 0, 2, 0, 0, 0, 0, 6, 81, 72, 0, + 0, 0, 0, 0, 7, 48, 12, 1, 0, 48, 46, 0, 86, 241,32, 0, 0, 96, 16, 0, 0, 0, 0, 0, 0, 112,4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 93, 100,44, 0, + 0, 0, 0, 0, 8, 32, 12, 0, 0, 0, 0, 0, 145,113,80, 1, 0, 0, 0, 0, 66, 128,0, 0, 0, 0, 0, 0, 2, 50, 36, 0, 0, 0, 0, 0, 19, 209,16, 2, + 0, 0, 0, 0, 0, 8, 14, 3, 0, 0, 0, 0, 95, 97, 44, 3, 0, 0, 0, 0, 8, 8, 32, 2, 0, 0, 0, 0, 32, 0, 6, 3, 0, 0, 0, 0, 126,252,12, 0, + 0, 96, 1, 0, 255,255,110,1, 0, 0, 0, 0, 0, 48, 16, 1, 0, 0, 0, 0, 4, 12, 2, 0, 0, 0, 0, 0, 16, 0, 98, 0, 0, 0, 0, 0, 16, 0, 80, 0, + 0, 0, 0, 0, 16, 193,8, 0, 0, 0, 0, 0, 18, 1, 16, 1, 128,96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 17, 4, 0, 0, 0, 0, 0, 18, 9, 4, 0, + 0, 96, 2, 0, 10, 48, 4, 1, 0, 0, 0, 0, 145,225,16, 0, 0, 0, 0, 0, 223,125,30, 3, 0, 0, 0, 0, 4, 60, 0, 2, 0, 0, 0, 0, 17, 105,0, 1, + 0, 0, 0, 0, 28, 40, 12, 1, 0, 0, 0, 0, 103,0, 0, 0, 0, 0, 0, 0, 68, 40, 20, 2, 0, 32, 32, 0, 0, 0, 4, 2, 0, 0, 0, 0, 129,1, 0, 1, + 0, 0, 0, 0, 17, 67, 8, 1, 0, 0, 0, 0, 16, 12, 16, 0, 0, 0, 0, 0, 189,189,108,2, 0, 0, 0, 0, 17, 89, 0, 0, 0, 0, 0, 0, 68, 16, 2, 0, + 0, 0, 0, 0, 1, 76, 0, 1, 0, 0, 0, 0, 149,89, 78, 3, 0, 0, 0, 0, 3, 32, 2, 0, 0, 0, 0, 0, 64, 20, 8, 0, 0, 0, 0, 0, 128,1, 64, 0, + 0, 0, 0, 0, 185,77, 86, 0, 0, 0, 0, 0, 79, 173,46, 2, 0, 0, 0, 0, 81, 1, 2, 1, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 9, 88, 0, 0, + 0, 0, 0, 0, 136,0, 2, 1, 16, 0, 0, 0, 17, 65, 8, 0, 0, 0, 0, 0, 17, 81, 4, 0, 0, 0, 0, 0, 25, 41, 2, 0, 0, 0, 0, 0, 29, 32, 0, 0, + 0, 0, 0, 0, 1, 80, 0, 0, 0, 0, 0, 0, 4, 0, 22, 0, 0, 16, 16, 0, 219,65, 18, 3, 0, 0, 0, 0, 255,187,124,3, 0, 0, 0, 0, 147,105,4, 0, + 0, 0, 0, 0, 21, 1, 0, 3, 0, 96, 8, 0, 40, 8, 4, 1, 0, 0, 0, 0, 57, 105,84, 1, 0, 0, 0, 0, 12, 40, 6, 0, 0, 0, 0, 0, 17, 40, 20, 0, + 0, 0, 0, 0, 38, 48, 12, 0, 0, 0, 0, 0, 49, 1, 8, 0, 0, 0, 0, 0, 0, 0, 136,0, 0, 0, 0, 0, 81, 64, 4, 0, 0, 0, 0, 0, 17, 120,0, 0, + 0, 0, 0, 0, 68, 44, 4, 0, 0, 0, 0, 0, 80, 32, 4, 1, 0, 0, 0, 0, 151,217,4, 2, 0, 0, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 251,251,63, 2, + 0, 0, 0, 0, 136,1, 10, 0, 0, 32, 0, 0, 63, 247,60, 1, 0, 0, 0, 0, 16, 8, 22, 0, 0, 0, 0, 0, 32, 96, 4, 0, 0, 32, 0, 0, 0, 17, 4, 0, + 0, 0, 0, 0, 16, 8, 8, 2, 0, 32, 0, 0, 145,73, 36, 2, 0, 0, 0, 0, 144,128,0, 0, 0, 0, 0, 0, 33, 0, 38, 0, 0, 0, 0, 0, 4, 32, 152,0, + 0, 0, 0, 0, 144,144,12, 0, 0, 32, 0, 0, 145,89, 6, 1, 0, 0, 0, 0, 17, 1, 24, 2, 0, 0, 0, 0, 40, 0, 6, 0, 0, 0, 0, 0, 33, 96, 12, 0, + 0, 0, 0, 0, 82, 24, 4, 0, 0, 32, 0, 0, 8, 40, 14, 1, 0, 0, 0, 0, 0, 9, 4, 1, 0, 0, 0, 0, 1, 64, 8, 3, 0, 0, 0, 0, 62, 41, 68, 0, + 0, 0, 4, 0, 127,185,124,1, 0, 0, 0, 0, 0, 56, 62, 0, 0, 0, 0, 0, 10, 0, 2, 0, 0, 32, 0, 0, 216,120,68, 2, 0, 0, 0, 0, 132,65, 0, 2, + 0, 0, 0, 0, 15, 188,46, 0, 0, 224,63, 0, 255,249,126,1, 0, 224,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 32, 16, 1, 0, 0, 0, 0, 64, 32, 38, 1, + 0, 0, 0, 0, 0, 24, 64, 0, 0, 0, 0, 0, 24, 32, 4, 0, 0, 0, 0, 0, 49, 0, 2, 1, 0, 0, 0, 0, 35, 136,8, 0, 0, 0, 0, 0, 8, 8, 32, 1, + 0, 0, 0, 0, 48, 0, 2, 0, 0, 32, 8, 0, 81, 64, 84, 0, 0, 0, 0, 0, 106,40, 68, 2, 0, 0, 0, 0, 121,109,100,2, 0, 0, 0, 0, 132,12, 4, 0, + 0, 0, 0, 0, 149,96, 12, 2, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 18, 8, 8, 0, 0, 0, 0, 0, 170,121,76, 0, 0, 0, 0, 0, 126,250,173,2, + 0, 0, 0, 0, 24, 9, 4, 0, 0, 0, 0, 0, 102,144,46, 0, 0, 0, 0, 0, 146,17, 12, 0, 0, 0, 0, 0, 48, 65, 8, 0, 0, 0, 0, 0, 16, 40, 12, 1, + 0, 0, 0, 0, 65, 105,4, 0, 0, 0, 0, 0, 8, 0, 12, 1, 0, 0, 0, 0, 17, 92, 70, 0, 0, 0, 0, 0, 4, 8, 18, 0, 0, 0, 0, 0, 130,8, 8, 0, + 0, 0, 0, 0, 95, 53, 44, 0, 0, 32, 0, 0, 148,9, 4, 0, 0, 0, 0, 0, 1, 8, 64, 0, 0, 0, 0, 0, 151,88, 76, 0, 0, 0, 0, 0, 0, 48, 20, 0, + 0, 0, 0, 0, 0, 80, 12, 2, 0, 0, 0, 0, 255,251,124,3, 0, 0, 0, 0, 17, 16, 4, 1, 0, 0, 0, 0, 16, 33, 4, 2, 0, 0, 0, 0, 130,160,12, 0, + 0, 0, 0, 0, 0, 88, 4, 0, 0, 0, 0, 0, 0, 8, 68, 0, 0, 0, 0, 0, 17, 89, 0, 1, 0, 0, 0, 0, 27, 77, 37, 0, 0, 0, 0, 0, 8, 16, 44, 0, + 0, 0, 0, 0, 150,30, 36, 2, 0, 0, 0, 0, 155,125,64, 0, 0, 0, 0, 0, 146,65, 8, 2, 0, 0, 0, 0, 5, 168,12, 0, 0, 0, 0, 0, 146,41, 68, 0, + 0, 0, 0, 0, 0, 20, 64, 0, 0, 0, 0, 0, 24, 65, 4, 0, 0, 0, 0, 0, 28, 41, 12, 0, 0, 0, 0, 0, 254,185,108,2, 0, 0, 0, 0, 19, 16, 4, 1, + 0, 0, 0, 0, 81, 0, 8, 2, 0, 0, 0, 0, 2, 40, 12, 0, 0, 0, 0, 0, 146,1, 64, 0, 0, 0, 0, 0, 96, 0, 4, 0, 0, 0, 0, 0, 19, 176,0, 0, + 0, 0, 0, 0, 123,73, 76, 0, 0, 0, 0, 0, 144,88, 8, 1, 0, 32, 0, 0, 128,17, 4, 2, 0, 0, 0, 0, 17, 192,0, 0, 0, 0, 0, 0, 144,5, 12, 0, + 0, 0, 0, 0, 106,184,4, 0, 0, 0, 0, 0, 66, 8, 4, 0, 0, 0, 0, 0, 212,128,136,0, 0, 0, 2, 0, 160,229,136,1, 128,0, 0, 0, 0, 16, 0, 0, + 0, 0, 0, 0, 255,251,94, 3, 0, 0, 0, 0, 76, 187,46, 1, 0, 0, 0, 0, 64, 8, 2, 0, 0, 0, 0, 0, 77, 65, 8, 3, 0, 0, 0, 0, 6, 2, 0, 0, + 0, 0, 0, 0, 8, 0, 128,2, 0, 0, 0, 0, 25, 33, 2, 0, 0, 0, 0, 0, 8, 1, 4, 0, 0, 0, 0, 0, 145,1, 6, 0, 0, 0, 0, 0, 1, 224,0, 0, + 0, 0, 0, 0, 0, 48, 5, 0, 0, 0, 0, 0, 19, 9, 4, 0, 0, 0, 0, 0, 4, 20, 64, 0, 0, 0, 0, 0, 81, 17, 2, 0, 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 14, 57, 46, 0, 0, 0, 0, 0, 56, 136,0, 0, 0, 0, 0, 0, 21, 33, 14, 0, 0, 32, 0, 0, 16, 1, 68, 0, 0, 0, 0, 0, 80, 9, 0, 0, + 0, 0, 0, 0, 255,122,14, 3, 0, 0, 0, 0, 2, 104,0, 0, 0, 32, 0, 0, 10, 40, 78, 0, 0, 32, 16, 0, 0, 32, 12, 0, 0, 0, 0, 0, 65, 32, 0, 0, + 0, 0, 0, 0, 186,25, 12, 0, 0, 0, 0, 0, 176,0, 68, 0, 0, 0, 0, 0, 0, 65, 2, 1, 0, 0, 0, 0, 2, 48, 10, 0, 0, 0, 0, 0, 0, 0, 26, 0, + 0, 0, 0, 0, 89, 40, 8, 1, 0, 0, 0, 0, 1, 0, 36, 1, 0, 0, 0, 0, 22, 5, 8, 0, 0, 0, 0, 0, 145,1, 10, 1, 0, 56, 4, 0, 152,17, 6, 0, + 0, 0, 0, 0, 1, 2, 2, 0, 0, 0, 0, 0, 63, 253,20, 3, 0, 0, 0, 0, 66, 32, 10, 0, 0, 0, 0, 0, 4, 36, 4, 2, 0, 0, 0, 0, 196,0, 8, 0, + 0, 0, 0, 0, 22, 100,168,0, 0, 0, 0, 0, 4, 0, 2, 2, 0, 0, 0, 0, 128,0, 40, 0, 0, 0, 0, 0, 11, 145,4, 2, 0, 0, 0, 0, 144,0, 10, 0, + 0, 0, 0, 0, 123,189,28, 3, 0, 0, 0, 0, 17, 72, 2, 1, 0, 16, 0, 0, 0, 0, 64, 0, 0, 48, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 144,89, 8, 0, + 0, 0, 0, 0, 144,64, 18, 0, 0, 0, 0, 0, 89, 255,126,0, 0, 0, 0, 0, 66, 24, 0, 0, 0, 0, 0, 0, 1, 66, 64, 1, 0, 0, 0, 0, 9, 96, 8, 0, + 0, 0, 0, 0, 16, 0, 10, 1, 0, 0, 0, 0, 8, 62, 36, 0, 0, 32, 0, 0, 149,28, 12, 2, 0, 0, 0, 0, 17, 1, 80, 1, 0, 0, 0, 0, 16, 36, 0, 0, + 0, 0, 0, 0, 212,95, 14, 2, 0, 0, 0, 0, 17, 80, 2, 0, 0, 0, 0, 0, 0, 0, 132,2, 0, 0, 0, 0, 132,0, 0, 1, 0, 0, 0, 0, 0, 17, 6, 1, + 16, 32, 0, 0, 19, 120,60, 0, 16, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 17, 81, 0, 3, 0, 0, 0, 0, 19, 67, 0, 1, 0, 0, 0, 0, 8, 41, 10, 0, + 0, 128,0, 0, 81, 248,22, 0, 0, 0, 0, 0, 66, 2, 4, 0, 0, 0, 0, 0, 130,0, 4, 0, 16, 244,43, 0, 255,255,254,3, 0, 64, 0, 0, 4, 16, 0, 0, + 0, 16, 0, 0, 4, 8, 0, 0, 0, 64, 0, 0, 8, 32, 0, 0, 0, 16, 0, 0, 0, 64, 4, 0, 0, 64, 0, 0, 0, 128,4, 0, 0, 0, 16, 0, 255,191,255,3, + 0, 0, 0, 0, 231,172,14, 2, 0, 0, 0, 0, 21, 0, 12, 0, 0, 0, 0, 0, 19, 73, 22, 1, 0, 0, 0, 0, 85, 40, 2, 0, 0, 0, 0, 0, 24, 28, 4, 0, + 0, 0, 0, 0, 102,40, 12, 0, 0, 0, 0, 0, 144,69, 0, 2, 0, 0, 0, 0, 0, 0, 10, 3, 0, 0, 0, 0, 64, 112,0, 0, 0, 0, 0, 0, 51, 57, 68, 1, + 0, 0, 0, 0, 8, 40, 10, 1, 0, 32, 0, 0, 8, 64, 4, 2, 0, 0, 0, 0, 253,107,102,1, 0, 0, 0, 0, 8, 24, 70, 0, 0, 0, 0, 0, 8, 48, 64, 0, + 0, 0, 0, 0, 4, 32, 192,0, 0, 0, 0, 0, 32, 40, 6, 0, 0, 0, 0, 0, 9, 0, 8, 0, 0, 0, 0, 0, 16, 1, 2, 1, 16, 0, 0, 0, 0, 64, 0, 0, + 0, 0, 0, 0, 238,48, 22, 0, 0, 0, 0, 0, 64, 128,2, 0, 0, 0, 0, 0, 48, 41, 8, 0, 0, 0, 0, 0, 16, 56, 2, 2, 0, 0, 0, 0, 243,121,86, 1, + 0, 0, 0, 0, 8, 52, 2, 0, 0, 0, 0, 0, 26, 56, 6, 1, 0, 0, 0, 0, 146,0, 4, 1, 0, 0, 0, 0, 17, 96, 12, 0, 0, 0, 0, 0, 0, 224,4, 0, + 0, 0, 0, 0, 1, 56, 4, 0, 0, 0, 0, 0, 104,188,14, 1, 0, 0, 0, 0, 25, 8, 4, 0, 0, 0, 0, 0, 126,168,6, 1, 0, 0, 0, 0, 16, 64, 2, 1, + 0, 0, 0, 0, 128,1, 0, 2, 0, 0, 0, 0, 25, 35, 0, 0, 0, 0, 0, 0, 17, 77, 18, 0, 0, 0, 0, 0, 0, 120,8, 0, 0, 0, 0, 0, 17, 40, 6, 1, + 0, 64, 32, 0, 127,253,124,1, 0, 0, 0, 0, 15, 30, 12, 0, 0, 0, 0, 0, 72, 0, 12, 0, 0, 0, 0, 0, 133,164,36, 1, 0, 0, 0, 0, 155,216,74, 0, + 0, 0, 0, 0, 46, 124,8, 0, 0, 0, 0, 0, 119,81, 85, 1, 0, 0, 0, 0, 140,48, 84, 0, 0, 0, 0, 0, 20, 56, 14, 1, 0, 0, 0, 0, 222,112,68, 0, + 0, 32, 0, 0, 12, 64, 66, 0, 0, 32, 0, 0, 64, 32, 14, 0, 0, 0, 0, 0, 145,1, 2, 0, 0, 0, 0, 0, 17, 4, 8, 0, 0, 0, 0, 0, 0, 24, 8, 1, + 0, 0, 0, 0, 123,249,94, 2, 0, 0, 0, 0, 76, 61, 6, 0, 0, 0, 0, 0, 17, 72, 18, 1, 0, 0, 0, 0, 24, 9, 14, 0, 0, 0, 0, 0, 12, 52, 10, 0, + 0, 112,36, 0, 176,25, 12, 0, 0, 32, 0, 0, 4, 24, 8, 0, 0, 0, 0, 0, 25, 73, 12, 0, 0, 0, 0, 0, 129,65, 24, 0, 0, 0, 0, 0, 255,127,126,3, + 0, 0, 0, 0, 228,44, 112,0, 0, 64, 0, 0, 247,223,110,3, 0, 0, 0, 0, 4, 40, 64, 0, 0, 0, 0, 0, 32, 32, 48, 0, 0, 0, 0, 0, 149,64, 72, 0, + 0, 0, 0, 0, 74, 60, 6, 1, 0, 32, 0, 0, 17, 113,28, 2, 0, 0, 0, 0, 98, 48, 4, 0, 0, 32, 0, 0, 16, 73, 4, 1, 0, 32, 0, 0, 224,48, 68, 1, + 0, 0, 0, 0, 64, 60, 6, 1, 0, 0, 0, 0, 98, 32, 8, 0, 0, 0, 0, 0, 133,9, 32, 0, 0, 0, 0, 0, 183,89, 78, 0, 0, 0, 0, 0, 145,80, 20, 2, + 0, 0, 0, 0, 0, 20, 4, 0, 0, 0, 0, 0, 209,204,28, 0, 0, 0, 0, 0, 68, 1, 8, 0, 0, 0, 0, 0, 24, 33, 4, 0, 0, 96, 62, 0, 238,122,12, 1, + 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 127,255,126,3, 0, 0, 0, 0, 74, 190,70, 0, 0, 0, 0, 0, 145,65, 16, 1, 0, 0, 0, 0, 0, 8, 26, 0, + 0, 0, 0, 0, 24, 97, 12, 0, 0, 0, 0, 0, 145,72, 18, 0, 0, 32, 5, 0, 223,253,94, 1, 0, 0, 0, 0, 68, 52, 68, 0, 0, 16, 0, 0, 1, 64, 0, 0, + 0, 0, 0, 0, 4, 0, 50, 0, 0, 0, 0, 0, 82, 56, 6, 1, 0, 0, 0, 0, 80, 48, 4, 0, 0, 0, 0, 0, 42, 56, 70, 0, 0, 0, 0, 0, 144,1, 18, 0, + 0, 0, 0, 0, 0, 33, 14, 0, 0, 0, 0, 0, 8, 0, 96, 0, 0, 0, 0, 0, 203,240,14, 0, 0, 0, 0, 0, 21, 105,2, 0, 0, 0, 0, 0, 20, 16, 5, 1, + 0, 112,53, 0, 8, 16, 4, 0, 0, 0, 0, 0, 36, 0, 74, 0, 0, 0, 0, 0, 49, 73, 4, 0, 0, 0, 0, 0, 8, 1, 0, 1, 0, 0, 0, 0, 21, 64, 148,2, + 0, 0, 0, 0, 68, 32, 2, 0, 0, 0, 0, 0, 0, 72, 20, 0, 0, 0, 0, 0, 32, 32, 8, 0, 0, 0, 0, 0, 136,40, 4, 0, 0, 0, 0, 0, 89, 120,12, 0, + 0, 32, 0, 0, 2, 64, 44, 0, 0, 0, 0, 0, 72, 168,80, 0, 0, 96, 2, 0, 138,144,4, 0, 0, 0, 0, 0, 148,1, 8, 1, 0, 0, 0, 0, 51, 56, 0, 0, + 0, 0, 0, 0, 241,255,127,3, 0, 0, 0, 0, 3, 40, 2, 0, 0, 0, 0, 0, 2, 161,4, 1, 0, 0, 0, 0, 0, 8, 12, 1, 0, 0, 0, 0, 180,64, 40, 0, + 0, 0, 0, 0, 20, 96, 16, 0, 0, 0, 0, 0, 176,72, 0, 0, 0, 0, 0, 0, 128,52, 8, 0, 0, 32, 0, 0, 16, 17, 4, 0, 16, 32, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 20, 40, 4, 0, 0, 0, 0, 0, 255,189,76, 1, 0, 0, 0, 0, 64, 60, 2, 0, 0, 0, 0, 0, 136,64, 8, 0, 0, 0, 0, 0, 39, 0, 0, 0, + 0, 0, 0, 0, 19, 81, 8, 0, 0, 0, 0, 0, 0, 8, 74, 0, 0, 0, 0, 0, 0, 16, 10, 1, 0, 0, 0, 0, 130,28, 40, 0, 0, 0, 0, 0, 96, 128,0, 0, + 0, 0, 0, 0, 85, 32, 0, 0, 0, 0, 0, 0, 181,93, 30, 2, 0, 0, 0, 0, 8, 28, 64, 1, 0, 0, 0, 0, 22, 9, 0, 0, 0, 0, 0, 0, 8, 8, 14, 0, + 0, 0, 0, 0, 42, 24, 6, 1, 0, 0, 0, 0, 21, 64, 64, 0, 0, 0, 0, 0, 5, 0, 128,0, 0, 0, 0, 0, 128,0, 24, 0, 0, 0, 0, 0, 17, 89, 18, 0, + 0, 0, 0, 0, 2, 32, 64, 0, 0, 0, 0, 0, 127,188,142,2, 0, 0, 0, 0, 145,8, 2, 0, 0, 0, 0, 0, 19, 5, 12, 0, 0, 0, 0, 0, 157,60, 78, 0, + 0, 0, 0, 0, 17, 105,42, 0, 0, 0, 0, 0, 32, 124,6, 1, 0, 0, 0, 0, 0, 69, 0, 1, 16, 0, 0, 0, 144,0, 4, 0, 0, 0, 0, 0, 164,29, 12, 0, + 0, 0, 0, 0, 20, 40, 6, 0, 0, 0, 0, 0, 51, 125,46, 0, 16, 0, 0, 128,0, 1, 0, 0, 0, 32, 2, 0, 65, 0, 0, 0, 0, 32, 0, 0, 88, 25, 68, 0, + 0, 0, 0, 0, 66, 0, 4, 0, 0, 32, 0, 0, 130,24, 64, 0, 0, 16, 0, 0, 2, 0, 8, 0, 0, 0, 0, 0, 255,120,78, 3, 0, 0, 0, 0, 2, 84, 12, 0, + 0, 0, 0, 0, 17, 96, 24, 0, 0, 0, 0, 0, 49, 89, 2, 3, 0, 32, 2, 0, 210,41, 74, 0, 0, 0, 0, 0, 192,0, 72, 1, 0, 0, 0, 0, 133,64, 128,0, + 0, 0, 8, 0, 34, 48, 8, 0, 16, 8, 0, 0, 255,255,255,3, 0, 0, 0, 0, 8, 136,4, 0, 0, 0, 4, 0, 238,185,46, 0, 0, 32, 0, 0, 255,153,79, 1, + 0, 0, 0, 0, 148,128,8, 0, 0, 0, 0, 0, 1, 40, 0, 1, 0, 0, 0, 0, 25, 9, 12, 1, 0, 0, 0, 0, 36, 1, 0, 1, 0, 0, 0, 0, 24, 105,14, 0, + 0, 32, 0, 0, 179,9, 76, 3, 0, 32, 0, 0, 0, 1, 8, 0, 0, 0, 8, 0, 144,73, 68, 0, 0, 32, 0, 0, 52, 24, 6, 0, 0, 96, 45, 0, 0, 9, 12, 0, + 0, 32, 0, 0, 16, 8, 4, 0, 0, 32, 0, 0, 8, 16, 68, 0, 0, 0, 0, 0, 27, 33, 6, 0, 0, 0, 0, 0, 133,124,24, 0, 0, 0, 0, 0, 51, 24, 4, 0, + 0, 0, 0, 0, 32, 0, 128,0, 0, 0, 0, 0, 90, 123,111,1, 0, 0, 0, 0, 80, 17, 0, 0, 0, 0, 0, 0, 134,128,6, 0, 0, 0, 0, 0, 4, 36, 128,0, + 0, 0, 0, 0, 250,184,14, 1, 0, 0, 0, 0, 25, 44, 4, 1, 0, 0, 0, 0, 48, 40, 8, 0, 0, 0, 0, 0, 16, 41, 2, 0, 0, 0, 0, 0, 1, 112,0, 0, + 0, 0, 0, 0, 89, 56, 86, 1, 0, 0, 0, 0, 8, 56, 2, 0, 0, 0, 0, 0, 16, 105,2, 0, 0, 0, 0, 0, 255,188,14, 2, 0, 0, 0, 0, 114,93, 10, 1, + 0, 0, 0, 0, 70, 56, 2, 0, 0, 32, 0, 0, 144,32, 4, 0, 0, 0, 0, 0, 2, 20, 0, 0, 0, 0, 0, 0, 18, 81, 0, 0, 0, 0, 0, 0, 27, 8, 6, 0, + 0, 0, 0, 0, 91, 77, 14, 3, 0, 0, 0, 0, 4, 52, 6, 1, 0, 0, 0, 0, 84, 32, 12, 0, 0, 0, 2, 0, 16, 25, 0, 0, 0, 0, 0, 0, 24, 72, 4, 0, + 0, 0, 0, 0, 152,61, 12, 0, 0, 0, 0, 0, 0, 41, 2, 1, 0, 0, 0, 0, 194,125,4, 2, 0, 32, 0, 0, 1, 56, 4, 0, 0, 0, 0, 0, 127,221,125,3, + 0, 0, 0, 0, 16, 16, 10, 0, 0, 0, 0, 0, 80, 1, 2, 0, 0, 0, 0, 0, 85, 224,144,0, 0, 0, 0, 0, 4, 128,4, 0, 16, 0, 4, 0, 247,113,86, 1, + 0, 0, 0, 0, 4, 96, 68, 0, 0, 224,46, 0, 129,84, 92, 1, 0, 192,0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 2, 129,8, 0, 0, 0, 0, 0, 151,77, 20, 1, + 0, 0, 0, 0, 0, 17, 64, 0, 0, 32, 0, 0, 188,25, 4, 0, 0, 0, 0, 0, 20, 73, 8, 0, 0, 0, 0, 0, 16, 64, 4, 2, 0, 0, 0, 0, 5, 1, 0, 0, + 0, 0, 0, 0, 19, 221,22, 0, 0, 0, 0, 0, 0, 152,0, 0, 0, 0, 0, 0, 0, 104,14, 1, 0, 0, 1, 0, 4, 160,4, 0, 0, 0, 0, 0, 0, 128,2, 1, + 0, 0, 0, 0, 8, 44, 14, 0, 0, 0, 0, 0, 72, 168,2, 0, 0, 0, 0, 0, 176,8, 12, 0, 0, 0, 0, 0, 1, 8, 72, 0, 0, 128,0, 0, 255,63, 78, 2, + 0, 0, 0, 0, 64, 97, 18, 0, 0, 0, 0, 0, 16, 72, 6, 1, 0, 0, 0, 0, 20, 4, 128,0, 0, 0, 0, 0, 203,1, 6, 1, 0, 0, 0, 0, 80, 9, 4, 0, + 0, 0, 0, 0, 112,96, 0, 0, 0, 0, 0, 0, 18, 0, 8, 0, 0, 0, 0, 0, 70, 180,4, 1, 0, 0, 0, 0, 116,32, 4, 0, 0, 0, 0, 0, 84, 4, 9, 0, + 0, 0, 0, 0, 128,68, 16, 0, 0, 32, 18, 0, 0, 4, 4, 0, 0, 0, 0, 0, 209,65, 6, 3, 0, 0, 0, 0, 167,173,72, 0, 0, 0, 0, 0, 4, 44, 30, 0, + 0, 0, 0, 0, 68, 8, 2, 0, 0, 0, 0, 0, 84, 32, 36, 0, 0, 0, 0, 0, 144,16, 16, 0, 0, 0, 0, 0, 17, 81, 12, 0, 16, 0, 0, 0, 43, 53, 78, 0, + 0, 0, 0, 0, 34, 112,8, 0, 0, 32, 0, 0, 12, 96, 20, 0, 0, 0, 0, 0, 0, 40, 12, 3, 0, 0, 0, 0, 25, 65, 8, 1, 0, 0, 4, 0, 24, 57, 28, 0, + 0, 0, 0, 0, 19, 121,20, 1, 0, 0, 0, 0, 77, 112,8, 0, 0, 0, 0, 0, 182,84, 8, 0, 0, 0, 0, 0, 51, 53, 0, 0, 0, 0, 0, 0, 177,73, 68, 2, + 0, 0, 0, 0, 18, 72, 0, 0, 0, 0, 0, 0, 50, 73, 0, 0, 0, 0, 0, 0, 55, 205,12, 1, 0, 0, 0, 0, 2, 25, 14, 0, 0, 0, 0, 0, 180,26, 30, 2, + 0, 0, 0, 0, 76, 128,12, 2, 0, 0, 0, 0, 16, 9, 66, 1, 0, 0, 0, 0, 215,176,110,0, 0, 0, 0, 0, 28, 41, 0, 0, 0, 0, 0, 0, 20, 97, 2, 0, + 0, 0, 0, 0, 81, 45, 68, 0, 0, 0, 0, 0, 104,48, 32, 0, 0, 0, 0, 0, 59, 63, 108,1, 0, 0, 0, 0, 17, 64, 26, 0, 0, 0, 0, 0, 68, 168,34, 1, + 0, 0, 0, 0, 0, 8, 72, 0, 0, 0, 0, 0, 26, 57, 4, 0, 0, 0, 0, 0, 148,5, 0, 0, 0, 0, 0, 0, 17, 89, 12, 0, 0, 0, 0, 0, 4, 36, 130,0, + 0, 0, 0, 0, 25, 1, 34, 1, 0, 0, 0, 0, 0, 12, 8, 1, 0, 0, 0, 0, 1, 68, 4, 1, 0, 0, 0, 0, 43, 185,14, 0, 0, 0, 0, 0, 203,57, 20, 1, + 0, 0, 0, 0, 243,186,110,0, 0, 0, 0, 0, 96, 32, 0, 0, 0, 0, 0, 0, 132,144,0, 0, 0, 0, 0, 0, 17, 65, 6, 0, 0, 0, 0, 0, 6, 0, 0, 2, + 0, 0, 0, 0, 0, 4, 128,0, 0, 0, 0, 0, 127,221,60, 3, 0, 0, 0, 0, 16, 97, 18, 1, 0, 0, 0, 0, 19, 49, 2, 0, 0, 0, 0, 0, 66, 32, 6, 0, + 0, 0, 0, 0, 32, 48, 2, 0, 0, 0, 0, 0, 247,113,76, 1, 0, 0, 0, 0, 2, 33, 2, 0, 0, 0, 0, 0, 67, 56, 6, 1, 0, 0, 0, 0, 16, 16, 20, 1, + 0, 0, 0, 0, 90, 81, 8, 0, 0, 0, 0, 0, 85, 65, 8, 0, 0, 0, 0, 0, 18, 96, 20, 3, 0, 8, 0, 0, 19, 17, 20, 0, 0, 0, 0, 0, 2, 42, 6, 0, + 0, 0, 0, 0, 0, 16, 70, 0, 0, 0, 0, 0, 221,125,14, 2, 0, 0, 0, 0, 128,18, 24, 0, 0, 0, 0, 0, 20, 24, 0, 0, 0, 0, 0, 0, 19, 29, 87, 0, + 0, 0, 0, 0, 66, 24, 6, 1, 0, 0, 0, 0, 144,9, 4, 0, 0, 0, 0, 0, 0, 6, 12, 0, 0, 0, 0, 0, 156,72, 0, 0, 0, 0, 0, 0, 64, 24, 0, 0, + 0, 2, 0, 0, 129,196,68, 0, 0, 32, 0, 0, 12, 136,4, 0, 0, 0, 0, 0, 25, 253,60, 3, 0, 0, 0, 0, 64, 125,12, 1, 0, 0, 0, 0, 137,52, 12, 1, + 0, 0, 0, 0, 134,1, 24, 0, 0, 0, 0, 0, 178,17, 0, 1, 0, 0, 0, 0, 145,0, 0, 2, 0, 8, 0, 0, 157,156,14, 0, 0, 0, 0, 0, 0, 4, 70, 0, + 0, 0, 0, 0, 68, 169,2, 0, 0, 0, 0, 0, 21, 64, 1, 0, 0, 0, 0, 0, 181,88, 12, 2, 0, 0, 0, 0, 148,21, 0, 0, 0, 0, 0, 0, 4, 16, 6, 0, + 0, 0, 0, 0, 16, 57, 4, 0, 0, 0, 0, 0, 18, 5, 0, 0, 0, 0, 16, 0, 21, 200,32, 0, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0, 0, 8, 0, 36, 0, + 0, 0, 0, 0, 5, 240,6, 0, 0, 0, 0, 0, 1, 104,0, 1, 0, 0, 0, 0, 72, 36, 130,0, 0, 0, 0, 0, 18, 9, 16, 1, 0, 0, 0, 0, 24, 0, 4, 1, + 0, 0, 0, 0, 219,109,4, 1, 0, 0, 0, 0, 80, 16, 8, 0, 0, 0, 0, 0, 179,48, 4, 0, 0, 0, 0, 0, 0, 48, 10, 1, 0, 224,45, 0, 1, 0, 0, 0, + 0, 240,33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 100,22, 0, 0, 0, 0, 0, 0, 164,0, 0, 0, 0, 0, 0, 0, 12, 6, 0, 0, 0, 0, 0, 24, 21, 4, 0, + 0, 0, 0, 0, 236,188,46, 1, 0, 0, 0, 0, 48, 8, 8, 0, 0, 0, 0, 0, 0, 8, 12, 2, 0, 0, 0, 0, 65, 41, 10, 0, 0, 0, 0, 0, 179,59, 12, 0, + 0, 0, 0, 0, 145,249,4, 0, 0, 0, 0, 0, 24, 40, 2, 0, 0, 0, 0, 0, 251,72, 94, 1, 0, 32, 0, 0, 4, 0, 4, 0, 0, 0, 0, 0, 145,121,4, 0, + 0, 0, 0, 0, 2, 8, 4, 2, 0, 0, 0, 0, 0, 40, 60, 0, 0, 0, 0, 0, 17, 5, 16, 0, 0, 0, 0, 0, 0, 34, 12, 1, 0, 0, 0, 0, 127,255,127,3, + 0, 32, 0, 0, 138,36, 70, 0, 0, 0, 0, 0, 5, 33, 2, 0, 0, 0, 0, 0, 144,68, 2, 0, 16, 0, 0, 0, 119,113,62, 1, 0, 0, 0, 0, 34, 56, 4, 0, + 0, 0, 0, 0, 12, 49, 14, 1, 0, 0, 0, 0, 187,112,4, 2, 0, 0, 0, 0, 19, 113,64, 1, 0, 32, 0, 0, 78, 48, 66, 0, 0, 0, 0, 0, 0, 48, 14, 1, + 0, 0, 0, 0, 3, 64, 0, 0, 0, 0, 0, 0, 1, 17, 20, 0, 0, 0, 0, 0, 58, 48, 68, 0, 0, 0, 0, 0, 144,0, 76, 0, 0, 0, 0, 0, 2, 176,66, 0, + 0, 96, 0, 0, 42, 64, 68, 1, 0, 0, 0, 0, 123,72, 69, 0, 0, 0, 0, 0, 236,48, 72, 0, 0, 0, 0, 0, 149,81, 72, 0, 0, 0, 0, 0, 211,84, 6, 2, + 0, 0, 0, 0, 22, 24, 0, 0, 0, 0, 0, 0, 164,80, 70, 0, 0, 0, 0, 0, 146,49, 64, 0, 0, 0, 0, 0, 23, 89, 22, 3, 0, 32, 8, 0, 110,248,78, 1, + 0, 0, 0, 0, 2, 144,68, 0, 0, 96, 4, 0, 24, 67, 28, 0, 0, 0, 0, 0, 4, 137,8, 0, 0, 8, 0, 0, 16, 1, 4, 0, 0, 0, 0, 0, 21, 40, 0, 0, + 0, 0, 0, 0, 84, 184,12, 2, 0, 0, 0, 0, 1, 65, 20, 1, 16, 0, 0, 0, 223,117,62, 3, 0, 0, 0, 0, 128,52, 4, 0, 0, 112,33, 0, 5, 16, 36, 0, + 0, 0, 0, 0, 3, 1, 2, 0, 0, 0, 0, 0, 0, 0, 160,0, 0, 0, 0, 0, 109,0, 6, 1, 0, 96, 4, 0, 30, 144,68, 0, 0, 0, 0, 0, 49, 69, 64, 2, + 0, 0, 0, 0, 128,12, 18, 0, 0, 0, 0, 0, 32, 32, 20, 0, 0, 0, 0, 0, 126,252,46, 1, 0, 0, 0, 0, 16, 73, 68, 0, 0, 0, 0, 0, 49, 1, 84, 1, + 0, 0, 0, 0, 16, 73, 12, 0, 0, 0, 0, 0, 20, 81, 4, 0, 0, 0, 0, 0, 113,157,76, 0, 0, 0, 0, 0, 41, 8, 76, 0, 0, 32, 0, 0, 0, 64, 32, 0, + 0, 0, 0, 0, 17, 25, 20, 1, 0, 0, 0, 0, 32, 69, 0, 0, 0, 0, 0, 0, 95, 125,126,1, 0, 0, 0, 0, 6, 44, 8, 0, 0, 0, 0, 0, 81, 0, 0, 1, + 0, 0, 0, 0, 81, 117,24, 2, 0, 0, 0, 0, 145,8, 0, 1, 0, 0, 0, 0, 31, 73, 20, 1, 0, 0, 0, 0, 12, 36, 0, 0, 0, 0, 0, 0, 17, 9, 18, 1, + 0, 0, 0, 0, 5, 0, 2, 0, 0, 0, 0, 0, 40, 8, 14, 1, 0, 0, 0, 0, 85, 36, 4, 0, 0, 0, 0, 0, 146,0, 8, 0, 0, 96, 4, 0, 75, 80, 4, 0, + 0, 0, 0, 0, 8, 0, 100,0, 0, 0, 0, 0, 106,0, 4, 0, 0, 0, 0, 0, 183,25, 8, 0, 0, 32, 0, 0, 162,184,6, 1, 0, 0, 0, 0, 145,81, 16, 0, + 0, 0, 0, 0, 181,253,28, 0, 0, 0, 0, 0, 141,53, 6, 1, 0, 0, 0, 0, 49, 8, 0, 0, 0, 96, 1, 0, 255,249,78, 2, 0, 0, 0, 0, 8, 1, 136,1, + 0, 32, 4, 0, 0, 9, 4, 0, 0, 0, 0, 0, 145,128,8, 0, 0, 0, 0, 0, 17, 89, 20, 1, 0, 0, 0, 0, 126,189,14, 3, 0, 0, 0, 0, 76, 0, 4, 0, + 0, 32, 0, 0, 24, 65, 4, 0, 0, 0, 0, 0, 65, 9, 4, 0, 0, 0, 0, 0, 153,61, 8, 0, 0, 96, 0, 0, 207,188,70, 1, 0, 0, 0, 0, 148,20, 4, 2, + 0, 0, 0, 0, 153,105,4, 0, 0, 0, 0, 0, 0, 168,2, 1, 0, 0, 0, 0, 60, 17, 4, 0, 16, 0, 0, 0, 155,125,14, 3, 0, 0, 0, 0, 8, 24, 38, 0, + 0, 0, 0, 0, 0, 40, 46, 1, 0, 0, 0, 0, 128,1, 76, 0, 0, 0, 0, 0, 17, 121,12, 0, 0, 32, 0, 0, 16, 28, 36, 0, 0, 128,0, 0, 63, 97, 48, 1, + 0, 0, 0, 0, 10, 160,0, 0, 0, 0, 0, 0, 6, 0, 44, 0, 0, 0, 0, 0, 10, 48, 40, 0, 0, 0, 0, 0, 138,129,16, 0, 0, 0, 0, 0, 17, 32, 16, 0, + 0, 96, 0, 0, 4, 24, 88, 1, 0, 0, 2, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 57, 70, 0, 0, 0, 0, 0, 68, 0, 24, 0, 0, 0, 0, 0, 8, 128,0, 0, + 0, 0, 0, 0, 23, 45, 6, 0, 0, 0, 0, 0, 17, 8, 20, 1, 0, 0, 0, 0, 49, 41, 4, 0, 0, 0, 0, 0, 89, 124,6, 1, 0, 0, 0, 0, 238,56, 110,3, + 0, 0, 0, 0, 20, 81, 12, 0, 0, 0, 0, 0, 33, 48, 12, 0, 0, 0, 0, 0, 17, 113,12, 1, 0, 0, 0, 0, 209,73, 22, 0, 0, 0, 0, 0, 145,9, 0, 1, + 0, 0, 0, 0, 17, 11, 4, 0, 0, 0, 0, 0, 129,48, 24, 0, 0, 0, 0, 0, 17, 8, 14, 2, 0, 0, 0, 0, 0, 1, 10, 2, 0, 0, 0, 0, 31, 93, 60, 2, + 0, 0, 0, 0, 68, 32, 8, 0, 0, 0, 0, 0, 144,25, 8, 0, 0, 0, 0, 0, 66, 80, 5, 2, 0, 0, 0, 0, 59, 209,60, 0, 0, 0, 0, 0, 4, 41, 4, 1, + 0, 0, 0, 0, 17, 109,4, 0, 0, 0, 0, 0, 16, 81, 16, 0, 0, 32, 32, 0, 128,0, 8, 0, 0, 0, 0, 0, 147,1, 14, 0, 0, 0, 32, 0, 221,44, 12, 3, + 0, 0, 0, 0, 8, 4, 2, 1, 0, 0, 0, 0, 17, 72, 66, 0, 0, 0, 0, 0, 0, 8, 66, 1, 0, 0, 0, 0, 19, 201,26, 0, 0, 16, 1, 0, 16, 73, 6, 2, + 0, 112,38, 0, 8, 1, 4, 0, 0, 32, 0, 0, 8, 0, 8, 0, 0, 0, 0, 0, 2, 17, 32, 0, 0, 0, 0, 0, 48, 148,2, 1, 0, 0, 0, 0, 59, 121,78, 0, + 0, 0, 0, 0, 19, 65, 4, 0, 0, 0, 0, 0, 10, 0, 6, 1, 0, 0, 0, 0, 85, 32, 0, 1, 0, 0, 0, 0, 113,25, 28, 2, 0, 0, 0, 0, 183,124,29, 2, + 0, 0, 0, 0, 0, 37, 2, 1, 0, 0, 0, 0, 2, 49, 10, 1, 0, 0, 0, 0, 0, 9, 2, 1, 0, 0, 0, 0, 149,56, 28, 3, 0, 0, 0, 0, 20, 5, 0, 0, + 0, 0, 0, 0, 160,24, 8, 0, 0, 0, 0, 0, 85, 40, 12, 0, 0, 0, 0, 0, 0, 0, 16, 2, 0, 32, 8, 0, 9, 1, 0, 0, 0, 0, 0, 0, 95, 252,94, 2, + 0, 0, 0, 0, 132,56, 8, 0, 0, 0, 0, 0, 16, 0, 2, 2, 0, 0, 0, 0, 0, 48, 24, 2, 0, 0, 0, 0, 126,136,140,0, 0, 0, 0, 0, 1, 96, 10, 0, + 0, 0, 0, 0, 25, 9, 8, 0, 0, 0, 0, 0, 24, 0, 20, 0, 0, 0, 0, 0, 145,224,4, 0, 0, 32, 0, 0, 79, 217,44, 0, 0, 0, 0, 0, 76, 136,140,0, + 0, 0, 0, 0, 21, 4, 16, 0, 0, 0, 0, 0, 16, 93, 9, 0, 0, 0, 0, 0, 64, 36, 0, 0, 16, 36, 20, 0, 255,255,255,3, 0, 0, 0, 0, 8, 25, 36, 0, + 16, 0, 0, 0, 1, 0, 0, 0, 16, 0, 0, 0, 0, 9, 0, 0, 0, 8, 0, 0, 16, 0, 2, 0, 0, 0, 0, 0, 125,185,110,0, 0, 0, 0, 0, 6, 160,32, 0, + 0, 0, 0, 0, 231,133,12, 0, 0, 32, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 5, 32, 24, 0, 0, 0, 0, 0, 5, 96, 16, 0, 0, 0, 4, 0, 91, 121,150,0, + 0, 0, 0, 0, 0, 8, 130,1, 0, 0, 0, 0, 64, 65, 34, 0, 0, 0, 0, 0, 8, 8, 4, 2, 0, 48, 0, 0, 0, 2, 8, 0, 0, 0, 0, 0, 0, 132,6, 0, + 0, 0, 2, 0, 151,93, 30, 3, 0, 0, 0, 0, 132,112,2, 0, 0, 0, 0, 0, 174,184,77, 0, 0, 112,5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 72, 0, + 0, 0, 0, 0, 194,38, 2, 0, 0, 0, 0, 0, 16, 32, 128,1, 0, 0, 0, 0, 0, 0, 38, 1, 16, 0, 0, 0, 57, 253,30, 1, 0, 0, 0, 0, 128,40, 2, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 0, 33, 120,20, 0, 0, 0, 0, 0, 4, 144,12, 0, 0, 32, 0, 0, 1, 1, 4, 0, + 0, 0, 0, 0, 1, 17, 4, 0, 0, 0, 0, 0, 28, 33, 28, 3, 0, 0, 0, 0, 115,197,62, 0, 0, 0, 0, 0, 144,8, 8, 1, 0, 0, 0, 0, 215,121,90, 0, + 0, 0, 0, 0, 128,0, 6, 0, 0, 0, 0, 0, 25, 104,6, 0, 64, 4, 0, 0, 233,33, 12, 3, 0, 4, 0, 0, 1, 1, 4, 0, 0, 0, 0, 0, 17, 0, 14, 0, + 0, 0, 0, 0, 0, 16, 64, 2, 0, 0, 0, 0, 145,125,16, 2, 0, 0, 0, 0, 139,48, 2, 0, 0, 64, 0, 0, 255,93, 60, 1, 0, 0, 0, 0, 68, 57, 70, 1, + 0, 0, 0, 0, 17, 32, 150,0, 0, 0, 0, 0, 117,38, 16, 0, 0, 0, 4, 0, 0, 129,4, 1, 0, 0, 0, 0, 145,12, 0, 0, 0, 4, 0, 0, 17, 113,84, 1, + 0, 0, 0, 0, 85, 32, 8, 0, 0, 0, 0, 0, 0, 16, 4, 2, 0, 0, 0, 0, 4, 33, 34, 0, 0, 0, 4, 0, 239,159,28, 1, 1, 96, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 1, 145,28, 0, 0, 64, 0, 0, 255,219,30, 2, 0, 0, 0, 0, 76, 187,138,0, 0, 32, 0, 0, 8, 32, 6, 0, 0, 32, 0, 0, 24, 0, 4, 0, + 0, 0, 0, 0, 32, 24, 10, 0, 0, 0, 0, 0, 72, 160,12, 0, 0, 0, 0, 0, 9, 56, 2, 0, 0, 0, 0, 0, 10, 8, 34, 0, 0, 0, 0, 0, 204,8, 12, 0, + 0, 0, 0, 0, 145,73, 22, 0, 0, 0, 0, 0, 4, 9, 14, 0, 0, 0, 0, 0, 13, 40, 10, 0, 0, 0, 0, 0, 37, 17, 44, 0, 0, 0, 0, 0, 1, 72, 16, 0, + 0, 0, 0, 0, 0, 8, 62, 0, 0, 8, 0, 0, 17, 1, 4, 0, 0, 0, 0, 0, 68, 0, 4, 2, 0, 0, 0, 0, 2, 144,32, 0, 0, 0, 0, 0, 238,172,30, 1, + 0, 0, 0, 0, 24, 33, 0, 0, 0, 0, 0, 0, 8, 0, 40, 0, 0, 0, 0, 0, 9, 0, 146,0, 0, 4, 0, 0, 145,73, 18, 0, 0, 0, 0, 0, 4, 168,6, 0, + 0, 0, 0, 0, 8, 224,14, 0, 0, 0, 0, 0, 192,48, 2, 0, 0, 0, 0, 0, 68, 0, 44, 0, 0, 0, 0, 0, 16, 193,0, 0, 0, 0, 0, 0, 2, 56, 2, 0, + 0, 0, 0, 0, 54, 184,142,0, 0, 0, 0, 0, 117,64, 54, 0, 0, 32, 0, 0, 64, 48, 4, 0, 0, 32, 0, 0, 17, 64, 4, 0, 0, 32, 8, 0, 0, 136,0, 0, + 0, 0, 0, 0, 17, 0, 24, 0, 0, 0, 0, 0, 4, 128,8, 0, 0, 0, 0, 0, 6, 120,34, 0, 0, 0, 0, 0, 14, 8, 6, 0, 0, 0, 0, 0, 122,136,175,2, + 0, 0, 0, 0, 133,192,8, 0, 0, 0, 0, 0, 4, 56, 10, 0, 0, 0, 0, 0, 5, 0, 6, 0, 0, 0, 0, 0, 16, 33, 14, 0, 0, 0, 0, 0, 88, 40, 130,0, + 0, 0, 0, 0, 16, 1, 16, 1, 0, 0, 0, 0, 70, 16, 78, 0, 0, 0, 0, 0, 4, 64, 6, 0, 0, 0, 0, 0, 147,88, 118,0, 0, 0, 0, 0, 66, 56, 6, 0, + 0, 0, 0, 0, 2, 0, 76, 0, 0, 0, 0, 0, 160,49, 12, 0, 0, 0, 0, 0, 0, 16, 20, 0, 0, 0, 0, 0, 80, 48, 13, 0, 0, 0, 0, 0, 17, 75, 68, 0, + 0, 0, 0, 0, 16, 0, 96, 0, 0, 0, 0, 0, 17, 69, 20, 0, 0, 0, 0, 0, 32, 4, 4, 0, 0, 0, 0, 0, 37, 164,86, 0, 0, 0, 0, 0, 149,205,24, 0, + 0, 0, 0, 0, 21, 184,10, 0, 0, 0, 0, 0, 72, 160,4, 0, 0, 0, 0, 0, 33, 0, 4, 0, 0, 0, 0, 0, 96, 24, 0, 0, 0, 0, 0, 0, 17, 0, 48, 0, + 0, 0, 0, 0, 66, 40, 14, 0, 0, 0, 0, 0, 25, 17, 20, 0, 0, 0, 0, 0, 34, 8, 2, 0, 16, 0, 0, 0, 177,67, 50, 0, 0, 0, 0, 0, 68, 52, 0, 0, + 0, 0, 0, 0, 96, 40, 6, 0, 0, 32, 0, 0, 2, 8, 8, 0, 0, 32, 0, 0, 0, 9, 4, 0, 0, 0, 0, 0, 32, 0, 40, 0, 0, 32, 0, 0, 127,251,126,2, + 0, 0, 0, 0, 68, 16, 0, 0, 0, 0, 0, 0, 0, 120,20, 0, 0, 0, 0, 0, 128,4, 16, 0, 0, 0, 0, 0, 1, 16, 8, 0, 0, 0, 0, 0, 28, 0, 24, 0, + 0, 0, 0, 0, 72, 8, 0, 0, 0, 0, 0, 0, 20, 128,8, 0, 0, 0, 0, 0, 0, 65, 66, 0, 0, 0, 0, 0, 160,16, 0, 0, 0, 0, 0, 0, 0, 41, 128,0, + 0, 0, 0, 0, 6, 240,52, 0, 0, 0, 0, 0, 16, 64, 10, 0, 0, 0, 0, 0, 8, 33, 52, 0, 0, 0, 0, 0, 0, 165,32, 1, 0, 0, 0, 0, 17, 129,4, 0, + 0, 0, 0, 0, 4, 32, 28, 0, 0, 32, 0, 0, 16, 81, 4, 0, 0, 0, 0, 0, 68, 96, 12, 0, 0, 0, 0, 0, 4, 13, 0, 0, 0, 0, 0, 0, 29, 184,126,2, + 0, 0, 0, 0, 5, 0, 4, 2, 0, 0, 0, 0, 149,200,44, 0, 0, 0, 2, 0, 140,16, 4, 0, 0, 0, 0, 0, 17, 65, 64, 0, 0, 0, 5, 0, 0, 0, 8, 0, + 0, 0, 0, 0, 3, 0, 16, 2, 0, 0, 0, 0, 119,125,126,3, 0, 0, 0, 0, 180,167,13, 0, 0, 0, 0, 0, 8, 40, 12, 1, 0, 0, 0, 0, 95, 112,4, 2, + 0, 32, 16, 0, 3, 28, 0, 0, 0, 0, 1, 0, 4, 32, 1, 0, 0, 0, 0, 0, 254,153,78, 1, 0, 0, 0, 0, 8, 0, 72, 0, 0, 0, 0, 0, 108,136,36, 0, + 0, 192,0, 64, 255,253,30, 0, 0, 0, 0, 0, 127,125,22, 2, 0, 32, 0, 0, 1, 8, 0, 0, 0, 0, 0, 0, 3, 0, 16, 0, 0, 0, 0, 0, 129,64, 4, 0, + 0, 0, 0, 0, 19, 32, 0, 0, 0, 0, 0, 0, 18, 56, 26, 0, 0, 0, 0, 0, 194,0, 0, 0, 0, 0, 0, 0, 17, 81, 73, 0, 0, 0, 0, 0, 0, 20, 3, 0, + 0, 0, 0, 0, 202,5, 0, 2, 0, 0, 0, 0, 9, 248,12, 0, 0, 0, 0, 0, 0, 48, 6, 1, 0, 0, 0, 0, 0, 1, 78, 1, 16, 0, 0, 0, 16, 1, 0, 1, + 0, 8, 0, 0, 54, 184,12, 0, 0, 0, 0, 0, 128,64, 74, 0, 0, 0, 0, 0, 49, 56, 16, 1, 0, 0, 1, 0, 8, 0, 6, 0, 0, 0, 0, 0, 129,65, 34, 0, + 16, 0, 0, 0, 189,101,126,2, 0, 0, 0, 0, 68, 56, 4, 0, 0, 0, 1, 0, 17, 80, 24, 1, 0, 96, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 2, 1, 2, 0, + 0, 0, 0, 0, 6, 156,2, 0, 0, 96, 0, 0, 149,103,4, 0, 0, 0, 0, 0, 1, 97, 0, 0, 0, 0, 0, 0, 5, 40, 14, 1, 0, 0, 0, 0, 0, 117,12, 0, + 0, 0, 0, 0, 16, 97, 12, 1, 0, 0, 0, 0, 9, 64, 4, 0, 0, 0, 0, 0, 145,112,53, 2, 0, 0, 0, 0, 67, 4, 11, 0, 16, 180,0, 0, 223,255,255,3, + 0, 0, 0, 0, 30, 134,2, 0, 0, 80, 32, 0, 0, 0, 0, 0, 16, 16, 0, 0, 255,191,255,3, 0, 0, 0, 0, 32, 164,2, 0, 0, 0, 0, 0, 19, 73, 6, 0, + 0, 0, 0, 0, 0, 3, 64, 0, 0, 0, 0, 0, 149,93, 17, 0, 0, 112,34, 0, 185,217,7, 1, 0, 96, 0, 0, 16, 0, 4, 0, 0, 112,4, 0, 4, 0, 64, 0, + 0, 0, 0, 0, 32, 40, 100,0, 0, 96, 39, 0, 0, 1, 36, 0, 0, 0, 0, 0, 6, 176,200,0, 0, 96, 4, 0, 18, 65, 20, 1, 0, 0, 0, 0, 0, 24, 12, 2, + 0, 0, 0, 0, 145,73, 64, 2, 0, 32, 0, 0, 8, 34, 0, 0, 0, 0, 0, 0, 68, 36, 4, 0, 0, 0, 0, 0, 17, 32, 2, 1, 0, 0, 0, 0, 217,121,22, 0, + 0, 0, 0, 0, 56, 0, 64, 0, 0, 0, 0, 0, 1, 1, 0, 2, 0, 32, 0, 0, 0, 0, 132,0, 0, 0, 0, 0, 11, 104,2, 0, 0, 0, 0, 0, 136,184,6, 1, + 0, 0, 0, 0, 146,9, 4, 0, 0, 0, 0, 0, 1, 9, 12, 0, 0, 112,38, 0, 8, 16, 6, 1, 0, 0, 0, 0, 2, 0, 96, 0, 0, 0, 0, 0, 20, 65, 0, 0, + 0, 0, 0, 0, 83, 229,0, 0, 0, 32, 0, 0, 1, 1, 16, 0, 0, 0, 0, 0, 0, 176,32, 0, 0, 32, 0, 0, 91, 115,92, 2, 0, 0, 0, 0, 1, 9, 6, 0, + 0, 32, 0, 0, 0, 129,0, 0, 0, 0, 0, 0, 16, 8, 6, 1, 0, 240,63, 0, 223,222,78, 1, 0, 0, 0, 0, 17, 44, 6, 0, 0, 96, 0, 0, 2, 8, 4, 0, + 0, 36, 0, 0, 223,101,126,3, 0, 0, 0, 0, 20, 4, 12, 1, 0, 0, 0, 0, 1, 129,0, 0, 0, 0, 0, 0, 0, 65, 0, 2, 0, 0, 0, 0, 21, 45, 76, 3, + 0, 0, 0, 0, 16, 4, 0, 2, 0, 0, 0, 0, 21, 36, 14, 0, 0, 0, 0, 0, 148,0, 4, 2, 0, 0, 0, 0, 1, 64, 0, 2, 0, 0, 0, 0, 32, 0, 100,0, + 0, 0, 0, 0, 16, 36, 4, 0, 0, 0, 0, 0, 36, 0, 116,0, 0, 0, 0, 0, 21, 213,4, 2, 0, 104,0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 1, 192,68, 0, 0, 0, 0, 0, 223,125,55, 2, 0, 0, 0, 0, 12, 56, 12, 0, 0, 0, 0, 0, 12, 16, 4, 0, 0, 0, 0, 0, 132,12, 4, 2, + 0, 0, 0, 0, 9, 8, 8, 0, 0, 0, 1, 0, 20, 253,76, 0, 0, 0, 0, 0, 4, 100,0, 0, 0, 240,6, 0, 207,190,206,0, 0, 192,2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 129,65, 14, 0, 0, 0, 0, 0, 142,48, 6, 0, 0, 0, 0, 0, 24, 129,8, 0, 0, 0, 0, 0, 64, 0, 5, 2, 0, 0, 0, 0, 10, 48, 22, 0, + 0, 0, 0, 0, 24, 0, 12, 0, 0, 128,0, 0, 136,32, 0, 0, 0, 0, 0, 0, 1, 0, 132,0, 0, 32, 0, 0, 159,126,78, 2, 0, 0, 0, 0, 2, 168,102,0, + 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 2, 0, 128,0, 0, 0, 0, 0, 16, 17, 64, 2, 0, 0, 0, 0, 1, 1, 16, 1, 0, 32, 0, 0, 18, 17, 8, 3, + 0, 16, 0, 0, 17, 73, 2, 0, 0, 16, 0, 0, 0, 160,0, 1, 0, 0, 0, 0, 255,254,126,2, 0, 0, 0, 0, 8, 40, 34, 0, 0, 0, 0, 0, 119,187,13, 0, + 0, 0, 0, 0, 128,8, 0, 1, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 0, 0, 128,20, 0, 0, 0, 32, 0, 0, 27, 9, 66, 2, 0, 48, 32, 0, 8, 52, 0, 0, + 0, 0, 0, 0, 2, 128,46, 2, 0, 0, 32, 0, 20, 49, 4, 0, 0, 96, 0, 0, 150,65, 86, 1, 0, 0, 0, 0, 24, 1, 4, 1, 0, 0, 0, 0, 0, 1, 36, 0, + 0, 0, 0, 0, 89, 77, 76, 0, 0, 32, 0, 0, 34, 16, 0, 0, 0, 0, 0, 0, 17, 209,0, 0, 0, 0, 0, 0, 0, 32, 2, 2, 0, 32, 0, 0, 93, 117,15, 2, + 0, 0, 0, 0, 16, 8, 40, 0, 0, 0, 0, 0, 36, 96, 4, 0, 0, 32, 0, 0, 17, 5, 2, 1, 0, 32, 0, 0, 128,34, 0, 0, 0, 0, 0, 0, 32, 8, 14, 1, + 0, 0, 0, 0, 112,32, 4, 0, 0, 96, 4, 0, 38, 4, 4, 1, 0, 0, 0, 0, 20, 64, 38, 0, 0, 0, 0, 0, 32, 168,16, 0, 0, 0, 0, 0, 66, 2, 0, 0, + 0, 0, 0, 0, 128,132,4, 0, 0, 0, 0, 0, 91, 125,62, 2, 0, 0, 0, 0, 2, 24, 16, 0, 0, 0, 0, 0, 12, 12, 0, 0, 0, 0, 0, 0, 16, 56, 64, 0, + 0, 96, 4, 0, 66, 8, 4, 0, 0, 0, 0, 0, 20, 149,92, 0, 0, 32, 0, 0, 16, 186,0, 0, 0, 240,28, 0, 0, 16, 4, 0, 0, 0, 0, 0, 4, 129,4, 0, + 0, 240,9, 0, 101,1, 4, 0, 0, 0, 0, 0, 179,153,12, 0, 0, 0, 0, 0, 8, 32, 128,0, 0, 0, 0, 0, 18, 5, 6, 0, 0, 32, 0, 0, 16, 8, 6, 0, + 0, 0, 0, 0, 2, 4, 64, 0, 0, 128,0, 0, 0, 66, 8, 0, 0, 0, 0, 0, 128,0, 128,0, 0, 0, 0, 0, 17, 97, 18, 0, 0, 0, 0, 0, 2, 96, 16, 0, + 0, 0, 0, 0, 68, 4, 0, 1, 0, 0, 0, 0, 0, 40, 132,0, 0, 0, 0, 0, 2, 0, 130,0, 0, 0, 0, 0, 81, 16, 4, 0, 0, 0, 0, 0, 17, 13, 8, 0, + 0, 32, 0, 0, 27, 23, 4, 0, 0, 96, 4, 0, 2, 64, 4, 1, 0, 0, 0, 0, 17, 17, 0, 1, 0, 96, 38, 0, 78, 130,4, 2, 0, 0, 0, 0, 217,166,206,2, + 0, 0, 0, 0, 0, 40, 92, 2, 0, 0, 0, 0, 65, 67, 4, 0, 0, 0, 32, 0, 1, 66, 32, 0, 0, 32, 0, 0, 8, 6, 0, 0, 0, 32, 0, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 18, 56, 8, 2, 0, 0, 0, 0, 0, 0, 144,0, 0, 0, 0, 0, 4, 0, 146,1, 0, 0, 0, 0, 147,0, 0, 0, 0, 0, 0, 0, 129,64, 4, 2, + 0, 0, 32, 0, 255,255,254,3, 0, 0, 0, 0, 14, 100,5, 0, 0, 128,0, 0, 18, 9, 4, 0, 0, 0, 0, 0, 144,65, 66, 1, 0, 32, 32, 0, 143,56, 14, 1, + 0, 0, 0, 0, 2, 64, 0, 1, 0, 0, 0, 0, 17, 144,0, 0, 0, 96, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 81, 1, 4, 0, 0, 32, 0, 0, 17, 32, 4, 0, + 0, 240,47, 0, 95, 247,76, 1, 0, 224,2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 4, 0, 0, 0, 0, 0, 0, 1, 97, 0, 1, 0, 32, 38, 0, 10, 0, 0, 0, + 0, 0, 0, 0, 146,81, 14, 0, 0, 96, 1, 0, 0, 0, 36, 0, 0, 0, 0, 0, 16, 1, 44, 0, 0, 32, 0, 0, 2, 8, 0, 0, 0, 96, 12, 0, 0, 17, 6, 0, + 0, 0, 0, 0, 81, 73, 12, 1, 0, 0, 0, 0, 20, 32, 36, 0, 0, 0, 0, 0, 223,101,29, 2, 0, 96, 0, 0, 2, 65, 44, 1, 0, 32, 2, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 32, 168,6, 0, 0, 64, 0, 0, 217,49, 6, 1, 0, 112,45, 0, 17, 1, 4, 0, 0, 0, 0, 0, 149,137,93, 0, 0, 32, 32, 0, 48, 200,8, 1, + 0, 96, 0, 0, 1, 129,20, 0, 0, 32, 0, 0, 0, 25, 16, 1, 0, 0, 0, 0, 21, 136,0, 0, 0, 0, 0, 0, 3, 64, 8, 0, 0, 0, 0, 0, 2, 40, 6, 0, + 0, 32, 0, 0, 53, 96, 6, 0, 0, 64, 0, 0, 0, 0, 16, 0, 0, 36, 0, 0, 4, 64, 2, 0, 0, 0, 0, 0, 6, 80, 24, 0, 0, 0, 0, 0, 0, 4, 80, 0, + 0, 0, 0, 0, 255,255,191,2, 0, 0, 0, 0, 21, 147,0, 0, 0, 0, 0, 0, 18, 1, 8, 0, 0, 0, 0, 0, 19, 1, 2, 1, 0, 0, 0, 0, 89, 69, 4, 1, + 0, 0, 0, 0, 136,40, 10, 0, 0, 0, 0, 0, 32, 9, 0, 0, 0, 0, 0, 0, 209,104,20, 0, 0, 0, 0, 0, 1, 105,0, 0, 0, 96, 2, 0, 10, 16, 6, 1, + 0, 0, 0, 0, 2, 0, 8, 1, 0, 0, 0, 0, 16, 5, 16, 0, 0, 0, 0, 0, 21, 73, 20, 1, 0, 0, 0, 0, 16, 176,4, 0, 0, 0, 0, 0, 21, 66, 28, 1, + 0, 32, 4, 0, 0, 32, 6, 0, 0, 32, 0, 0, 17, 96, 16, 0, 0, 96, 1, 0, 3, 32, 12, 0, 0, 32, 0, 0, 0, 0, 4, 2, 0, 232,0, 0, 17, 0, 0, 0, + 0, 176,8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 200,0, 0, 0, 64, 0, 0, 16, 19, 20, 1, 0, 0, 0, 0, 125,71, 12, 0, 0, 0, 0, 0, 1, 68, 24, 0, + 0, 232,0, 0, 19, 2, 4, 0, 0, 64, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 182,25, 65, 0, 0, 0, 0, 0, 21, 240,24, 0, 0, 120,16, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 48, 81, 4, 1, 0, 0, 0, 0, 8, 64, 10, 0, 0, 0, 0, 0, 93, 117,6, 1, 0, 0, 0, 0, 8, 34, 4, 1, 0, 0, 0, 0, 0, 4, 64, 2, + 0, 0, 0, 0, 92, 38, 4, 0, 0, 16, 0, 0, 12, 128,8, 0, 0, 0, 0, 0, 128,5, 28, 0, 0, 0, 1, 0, 57, 89, 16, 1, 0, 0, 0, 0, 32, 16, 16, 1, + 0, 0, 0, 0, 37, 32, 4, 0, 0, 240,32, 0, 83, 65, 0, 0, 0, 0, 0, 0, 0, 72, 36, 0, 16, 100,32, 0, 255,255,127,3, 0, 64, 0, 0, 32, 8, 0, 0, + 0, 32, 0, 0, 255,255,127,3, 0, 0, 0, 0, 2, 37, 94, 2, 0, 0, 0, 0, 151,73, 18, 3, 0, 0, 0, 0, 14, 44, 10, 0, 0, 0, 0, 0, 64, 40, 2, 0, + 0, 0, 0, 0, 2, 64, 16, 0, 0, 0, 0, 0, 8, 12, 12, 0, 0, 0, 0, 0, 144,141,32, 3, 0, 0, 0, 0, 0, 84, 0, 1, 0, 0, 0, 0, 153,105,18, 1, + 0, 0, 0, 0, 0, 149,2, 0, 0, 0, 0, 0, 0, 52, 6, 0, 0, 0, 0, 0, 137,248,78, 0, 0, 0, 0, 0, 0, 145,0, 0, 0, 0, 0, 0, 48, 5, 10, 0, + 0, 0, 0, 0, 81, 73, 16, 1, 0, 0, 0, 0, 0, 48, 66, 1, 0, 0, 0, 0, 17, 105,18, 0, 0, 0, 0, 0, 144,104,66, 0, 0, 0, 0, 0, 107,238,78, 2, + 0, 0, 0, 0, 81, 64, 0, 2, 0, 0, 0, 0, 9, 77, 0, 0, 0, 0, 0, 0, 153,69, 24, 0, 0, 96, 0, 0, 140,48, 110,0, 0, 0, 0, 0, 255,221,60, 1, + 0, 0, 0, 0, 160,60, 94, 0, 0, 0, 0, 0, 144,109,46, 1, 0, 0, 0, 0, 72, 0, 64, 0, 0, 0, 0, 0, 9, 6, 0, 0, 0, 0, 0, 0, 237,60, 132,0, + 0, 0, 0, 0, 65, 69, 4, 0, 0, 0, 0, 0, 148,128,8, 2, 0, 0, 0, 0, 3, 17, 64, 0, 0, 0, 0, 0, 179,81, 20, 0, 0, 0, 0, 0, 128,56, 6, 0, + 0, 32, 0, 0, 129,32, 38, 1, 0, 0, 0, 0, 16, 96, 12, 0, 0, 0, 0, 0, 19, 0, 16, 1, 0, 0, 0, 0, 144,0, 32, 2, 0, 0, 0, 0, 32, 32, 2, 0, + 0, 0, 0, 0, 65, 160,8, 2, 0, 0, 0, 0, 23, 253,22, 0, 0, 0, 0, 0, 8, 45, 30, 2, 0, 0, 0, 0, 153,56, 2, 0, 0, 0, 0, 0, 16, 124,2, 1, + 0, 32, 0, 0, 17, 12, 0, 0, 0, 0, 0, 0, 24, 0, 0, 2, 0, 0, 0, 0, 177,112,20, 0, 0, 0, 0, 0, 93, 247,92, 3, 0, 0, 0, 0, 219,61, 78, 2, + 0, 0, 0, 0, 17, 65, 26, 1, 0, 0, 0, 0, 132,0, 2, 0, 0, 0, 0, 0, 137,220,46, 0, 0, 0, 0, 0, 1, 72, 130,0, 0, 0, 0, 0, 17, 160,4, 0, + 0, 0, 0, 0, 8, 160,22, 0, 0, 0, 0, 0, 41, 96, 4, 3, 0, 0, 0, 0, 145,97, 2, 2, 0, 0, 0, 0, 128,168,6, 0, 0, 0, 0, 0, 49, 237,22, 0, + 0, 0, 0, 0, 136,48, 16, 0, 0, 0, 0, 0, 8, 65, 64, 0, 0, 0, 0, 0, 145,8, 4, 0, 0, 32, 0, 0, 223,255,126,3, 0, 0, 0, 0, 110,255,28, 1, + 0, 0, 0, 0, 17, 65, 16, 2, 0, 0, 0, 0, 16, 104,8, 1, 0, 96, 0, 0, 9, 1, 68, 0, 0, 0, 0, 0, 82, 52, 4, 3, 0, 32, 0, 0, 17, 4, 4, 0, + 0, 0, 0, 0, 209,81, 4, 1, 0, 0, 0, 0, 5, 1, 0, 1, 0, 0, 0, 0, 16, 68, 14, 0, 0, 32, 0, 0, 0, 168,4, 2, 0, 0, 0, 0, 0, 12, 12, 0, + 0, 0, 0, 0, 32, 128,32, 0, 0, 32, 0, 0, 17, 1, 0, 1, 0, 0, 0, 0, 49, 65, 4, 0, 0, 0, 0, 0, 128,33, 8, 0, 0, 0, 0, 0, 149,89, 20, 1, + 0, 0, 0, 0, 157,245,28, 2, 0, 0, 0, 0, 134,41, 10, 1, 0, 0, 0, 0, 16, 56, 2, 1, 0, 0, 0, 0, 65, 49, 18, 1, 0, 0, 0, 0, 32, 16, 64, 0, + 0, 0, 0, 0, 21, 52, 0, 0, 0, 0, 0, 0, 17, 121,16, 0, 0, 32, 0, 0, 2, 48, 0, 1, 0, 0, 0, 0, 2, 24, 2, 0, 0, 0, 0, 0, 24, 48, 12, 0, + 0, 0, 0, 0, 17, 121,18, 0, 0, 0, 0, 0, 66, 56, 2, 0, 0, 0, 0, 0, 0, 1, 24, 1, 0, 32, 0, 0, 149,127,94, 3, 0, 0, 0, 0, 6, 56, 6, 0, + 0, 32, 4, 0, 0, 0, 2, 0, 0, 96, 0, 0, 154,0, 68, 0, 0, 0, 0, 0, 129,96, 70, 0, 0, 0, 0, 0, 7, 1, 16, 0, 0, 0, 0, 0, 136,0, 2, 0, + 0, 0, 0, 0, 9, 32, 16, 0, 0, 0, 0, 0, 19, 48, 0, 0, 0, 0, 0, 0, 63, 253,14, 2, 0, 0, 0, 0, 160,16, 16, 0, 0, 0, 0, 0, 128,128,16, 0, + 0, 0, 0, 0, 17, 77, 16, 1, 0, 0, 0, 0, 8, 42, 0, 0, 0, 0, 0, 0, 21, 1, 20, 0, 0, 0, 0, 0, 207,61, 14, 0, 0, 0, 0, 0, 53, 72, 78, 0, + 0, 0, 0, 0, 0, 52, 12, 0, 0, 0, 0, 0, 155,81, 16, 0, 0, 0, 0, 0, 2, 52, 2, 0, 0, 0, 0, 0, 0, 66, 8, 0, 0, 0, 0, 0, 20, 16, 2, 0, + 0, 0, 0, 0, 128,116,0, 1, 0, 0, 0, 0, 13, 165,4, 1, 0, 0, 0, 0, 31, 51, 54, 0, 0, 32, 2, 0, 0, 4, 0, 0, 0, 32, 0, 0, 255,255,254,3, + 0, 0, 0, 0, 236,56, 110,1, 0, 0, 0, 0, 64, 8, 0, 1, 0, 0, 0, 0, 2, 41, 4, 0, 0, 0, 0, 0, 144,73, 12, 1, 0, 0, 0, 0, 19, 73, 0, 0, + 0, 0, 0, 0, 129,5, 4, 0, 0, 0, 0, 0, 9, 9, 2, 2, 0, 0, 0, 0, 238,184,110,2, 0, 0, 0, 0, 19, 1, 20, 1, 0, 0, 0, 0, 17, 72, 20, 1, + 0, 0, 0, 0, 20, 0, 2, 1, 0, 0, 0, 0, 149,64, 4, 0, 0, 0, 0, 0, 33, 8, 0, 0, 0, 0, 0, 0, 80, 8, 4, 0, 0, 0, 0, 0, 16, 120,6, 0, + 0, 0, 0, 0, 238,255,14, 2, 0, 0, 0, 0, 145,72, 8, 0, 0, 0, 0, 0, 145,12, 92, 0, 0, 0, 0, 0, 145,0, 12, 2, 0, 32, 0, 0, 3, 8, 4, 0, + 0, 0, 0, 0, 17, 5, 20, 0, 0, 0, 0, 0, 29, 253,44, 2, 0, 0, 0, 0, 138,16, 0, 0, 0, 0, 0, 64, 0, 1, 4, 0, 0, 0, 0, 0, 128,132,0, 0, + 0, 0, 0, 0, 17, 113,20, 1, 0, 0, 0, 0, 0, 48, 66, 0, 0, 0, 0, 0, 146,48, 10, 1, 0, 0, 0, 0, 64, 48, 80, 0, 0, 112,6, 0, 19, 18, 68, 0, + 0, 0, 0, 0, 16, 96, 8, 3, 0, 0, 0, 0, 51, 249,4, 0, 0, 0, 0, 0, 16, 8, 16, 0, 0, 0, 0, 0, 177,237,12, 0, 0, 32, 0, 0, 121,255,78, 3, + 0, 0, 0, 0, 73, 33, 2, 0, 0, 0, 0, 0, 17, 73, 2, 2, 0, 0, 0, 0, 4, 0, 128,1, 0, 0, 0, 0, 43, 13, 8, 1, 0, 0, 0, 0, 5, 28, 6, 0, + 0, 0, 0, 0, 89, 65, 64, 1, 0, 0, 0, 0, 8, 48, 18, 0, 0, 0, 0, 0, 15, 24, 78, 1, 0, 0, 0, 0, 2, 32, 22, 1, 0, 32, 0, 0, 17, 97, 84, 0, + 0, 32, 0, 0, 0, 32, 8, 0, 0, 0, 0, 0, 202,52, 112,0, 0, 0, 0, 0, 129,172,8, 0, 0, 0, 0, 0, 119,253,110,3, 0, 0, 0, 0, 16, 64, 4, 1, + 0, 0, 0, 0, 32, 0, 34, 0, 0, 0, 0, 0, 4, 60, 4, 0, 0, 0, 0, 0, 144,16, 36, 0, 0, 0, 0, 0, 17, 65, 12, 0, 0, 0, 0, 0, 1, 1, 32, 1, + 0, 0, 0, 0, 148,76, 12, 0, 0, 0, 0, 0, 3, 32, 0, 0, 0, 0, 0, 0, 144,1, 0, 2, 0, 0, 0, 0, 147,45, 76, 2, 0, 0, 0, 0, 0, 12, 2, 1, + 0, 0, 0, 0, 17, 105,0, 0, 0, 0, 0, 0, 149,105,26, 2, 0, 0, 0, 0, 16, 57, 0, 0, 0, 32, 0, 0, 17, 73, 96, 0, 0, 96, 44, 0, 206,60, 6, 0, + 0, 0, 0, 0, 17, 137,0, 0, 0, 0, 0, 0, 158,249,76, 0, 0, 0, 0, 0, 205,96, 34, 1, 0, 8, 2, 0, 2, 16, 32, 0, 0, 0, 0, 0, 17, 89, 114,3, + 0, 0, 0, 0, 78, 127,94, 3, 0, 0, 0, 0, 25, 5, 5, 0, 0, 0, 0, 0, 40, 8, 4, 0, 0, 0, 0, 0, 17, 81, 36, 0, 0, 0, 0, 0, 217,225,29, 0, + 0, 0, 0, 0, 17, 5, 8, 0, 0, 0, 0, 0, 5, 1, 26, 0, 0, 0, 0, 0, 8, 57, 2, 1, 0, 0, 0, 0, 24, 56, 42, 0, 0, 0, 0, 0, 1, 10, 0, 0, + 0, 0, 0, 0, 10, 127,62, 1, 0, 0, 0, 0, 42, 56, 22, 2, 0, 0, 0, 0, 128,48, 2, 0, 0, 0, 0, 0, 19, 72, 0, 0, 0, 0, 0, 0, 16, 8, 16, 1, + 0, 0, 0, 0, 51, 89, 4, 1, 16, 0, 0, 0, 9, 112,70, 2, 16, 0, 0, 0, 64, 0, 8, 0, 0, 0, 0, 0, 238,172,126,0, 0, 0, 0, 0, 23, 25, 8, 1, + 0, 0, 0, 0, 19, 73, 8, 2, 0, 0, 0, 0, 5, 100,6, 2, 0, 0, 0, 0, 144,72, 12, 2, 0, 0, 0, 0, 209,0, 0, 0, 0, 0, 0, 0, 127,253,110,2, + 0, 0, 0, 0, 128,64, 18, 0, 0, 0, 0, 0, 0, 96, 64, 0, 0, 0, 0, 0, 5, 48, 0, 0, 0, 32, 4, 0, 83, 211,6, 3, 0, 32, 0, 0, 130,24, 6, 1, + 0, 0, 0, 0, 27, 56, 10, 0, 0, 112,45, 0, 2, 16, 4, 0, 0, 0, 0, 0, 119,104,24, 0, 0, 0, 0, 0, 18, 0, 76, 0, 0, 0, 0, 0, 0, 33, 18, 0, + 0, 0, 0, 0, 66, 16, 76, 0, 0, 32, 0, 0, 0, 64, 8, 1, 0, 0, 0, 0, 16, 65, 4, 3, 0, 32, 0, 0, 23, 217,22, 2, 0, 32, 1, 0, 16, 8, 0, 1, + 0, 0, 0, 0, 221,125,46, 3, 0, 0, 0, 0, 130,34, 14, 0, 0, 0, 0, 0, 8, 33, 2, 0, 16, 0, 0, 0, 19, 41, 14, 0, 0, 0, 0, 0, 192,20, 4, 0, + 0, 0, 0, 0, 4, 16, 14, 0, 0, 32, 36, 0, 189,220,94, 0, 0, 32, 0, 0, 166,217,236,0, 0, 0, 0, 0, 0, 49, 2, 0, 0, 0, 0, 0, 3, 16, 10, 1, + 0, 0, 0, 0, 22, 96, 4, 0, 0, 0, 0, 0, 145,93, 8, 0, 0, 0, 0, 0, 17, 97, 4, 3, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 0, 0, 180,140,4, 0, + 0, 0, 0, 0, 71, 253,126,1, 0, 0, 0, 0, 4, 44, 8, 0, 0, 0, 0, 0, 211,112,0, 0, 0, 0, 0, 0, 3, 40, 12, 0, 0, 0, 0, 0, 150,185,84, 0, + 0, 0, 0, 0, 66, 32, 2, 1, 0, 0, 0, 0, 16, 0, 40, 0, 0, 0, 0, 0, 132,64, 8, 0, 0, 0, 0, 0, 18, 52, 8, 0, 0, 0, 0, 0, 9, 105,4, 0, + 0, 0, 0, 0, 149,125,30, 2, 0, 0, 0, 0, 20, 33, 0, 0, 0, 32, 0, 0, 49, 61, 12, 1, 0, 0, 0, 0, 6, 48, 6, 0, 0, 0, 0, 0, 4, 52, 8, 0, + 0, 0, 0, 0, 149,37, 12, 2, 0, 0, 0, 0, 66, 52, 0, 0, 0, 0, 0, 0, 16, 16, 68, 0, 0, 0, 0, 0, 5, 80, 16, 0, 0, 0, 0, 0, 145,105,6, 1, + 0, 0, 0, 0, 16, 32, 64, 0, 0, 96, 8, 0, 132,4, 4, 0, 0, 0, 0, 0, 18, 16, 2, 0, 0, 8, 0, 0, 81, 69, 2, 0, 0, 0, 0, 0, 3, 16, 4, 0, + 0, 0, 4, 0, 8, 4, 0, 0, 0, 0, 0, 2, 17, 67, 16, 1, 0, 0, 0, 0, 255,183,126,1, 0, 0, 0, 0, 6, 128,0, 0, 0, 32, 0, 0, 16, 33, 0, 0, + 0, 0, 0, 0, 247,241,46, 3, 0, 0, 0, 0, 34, 52, 4, 0, 0, 0, 0, 0, 58, 48, 4, 0, 0, 0, 0, 0, 186,148,76, 0, 0, 0, 0, 0, 5, 80, 0, 0, + 0, 32, 0, 0, 17, 149,0, 0, 0, 0, 0, 0, 9, 68, 0, 0, 0, 0, 0, 0, 37, 128,8, 0, 0, 0, 0, 0, 85, 176,12, 2, 0, 0, 0, 0, 17, 16, 4, 0, + 0, 0, 0, 0, 2, 48, 106,0, 0, 0, 0, 0, 21, 68, 8, 0, 0, 0, 0, 0, 92, 37, 12, 0, 0, 0, 0, 0, 40, 4, 12, 0, 0, 0, 0, 0, 147,120,4, 0, + 0, 0, 0, 0, 32, 128,4, 0, 0, 0, 0, 0, 158,245,62, 0, 0, 0, 0, 0, 36, 132,2, 0, 0, 0, 0, 0, 32, 129,0, 0, 0, 0, 0, 0, 16, 101,12, 0, + 0, 0, 0, 0, 94, 53, 172,2, 0, 0, 0, 0, 0, 48, 36, 0, 0, 0, 0, 0, 144,0, 8, 2, 0, 72, 16, 0, 121,33, 0, 0, 0, 0, 0, 0, 19, 69, 56, 1, + 0, 0, 0, 0, 119,140,58, 2, 0, 0, 0, 0, 18, 10, 0, 0, 0, 0, 0, 0, 148,133,4, 0, 0, 0, 0, 0, 50, 0, 4, 0, 0, 0, 0, 0, 159,137,94, 2, + 0, 0, 0, 0, 44, 8, 4, 0, 0, 0, 0, 0, 116,232,44, 2, 0, 0, 0, 0, 16, 20, 6, 0, 0, 0, 0, 0, 32, 128,38, 0, 0, 32, 40, 0, 144,88, 4, 0, + 0, 32, 0, 0, 2, 0, 8, 0, 0, 0, 0, 0, 176,128,0, 0, 0, 0, 0, 0, 16, 136,4, 0, 0, 0, 0, 0, 62, 204,222,1, 0, 0, 0, 0, 25, 65, 4, 0, + 0, 0, 0, 0, 14, 136,2, 0, 0, 0, 0, 0, 32, 132,0, 0, 0, 0, 0, 0, 16, 16, 4, 1, 0, 0, 0, 0, 32, 197,0, 0, 0, 0, 0, 0, 16, 129,2, 0, + 0, 0, 0, 0, 144,64, 76, 0, 0, 0, 0, 0, 17, 41, 4, 0, 0, 0, 0, 0, 28, 136,12, 0, 0, 0, 0, 0, 16, 64, 48, 0, 0, 0, 0, 0, 144,0, 12, 2, + 0, 0, 0, 0, 19, 73, 22, 3, 0, 0, 0, 0, 4, 36, 6, 1, 0, 80, 0, 0, 2, 40, 2, 0, 0, 0, 0, 0, 145,69, 20, 2, 0, 0, 0, 0, 18, 2, 0, 0, + 0, 0, 0, 0, 145,29, 0, 0, 0, 0, 0, 0, 76, 61, 32, 0, 0, 0, 0, 0, 198,185,78, 0, 0, 0, 0, 0, 18, 8, 4, 2, 0, 0, 0, 0, 16, 49, 0, 0, + 0, 0, 0, 0, 34, 16, 8, 0, 0, 0, 0, 0, 32, 164,4, 0, 0, 0, 0, 0, 2, 160,68, 0, 0, 0, 0, 0, 0, 2, 12, 2, 0, 0, 0, 0, 33, 89, 18, 0, + 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 81, 121,22, 0, 0, 0, 0, 0, 0, 44, 10, 0, 0, 0, 0, 0, 146,17, 4, 0, 0, 0, 0, 0, 4, 44, 46, 2, + 0, 0, 0, 0, 145,69, 20, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 12, 144,14, 0, 0, 0, 0, 0, 159,253,92, 1, 0, 0, 0, 0, 196,36, 78, 0, + 0, 0, 0, 0, 128,38, 4, 0, 0, 0, 0, 0, 7, 36, 4, 0, 0, 0, 0, 0, 145,80, 0, 0, 0, 0, 0, 0, 17, 81, 2, 1, 0, 0, 0, 0, 110,180,38, 2, + 0, 0, 0, 0, 144,0, 4, 2, 0, 0, 0, 0, 19, 249,20, 0, 0, 0, 0, 0, 8, 44, 10, 0, 0, 0, 0, 0, 127,119,78, 3, 0, 0, 0, 0, 0, 52, 10, 0, + 0, 0, 0, 0, 36, 36, 40, 0, 0, 0, 0, 0, 84, 38, 12, 0, 0, 0, 0, 0, 16, 160,100,0, 0, 0, 0, 0, 1, 44, 4, 0, 0, 0, 0, 0, 70, 173,14, 1, + 0, 0, 0, 0, 129,21, 0, 0, 0, 0, 0, 0, 84, 1, 12, 2, 0, 0, 0, 0, 53, 141,6, 0, 0, 32, 0, 0, 4, 40, 12, 1, 0, 0, 0, 0, 4, 44, 10, 0, + 0, 0, 0, 0, 255,245,126,3, 0, 0, 0, 0, 6, 173,8, 0, 0, 0, 0, 0, 144,0, 16, 2, 0, 0, 0, 0, 1, 32, 76, 1, 0, 0, 0, 0, 242,177,6, 0, + 0, 0, 0, 0, 4, 56, 32, 0, 0, 0, 0, 0, 145,24, 8, 0, 0, 0, 0, 0, 208,36, 18, 2, 0, 0, 0, 0, 151,93, 28, 3, 0, 0, 0, 0, 4, 44, 2, 0, + 0, 0, 0, 0, 17, 5, 0, 1, 0, 0, 0, 0, 22, 100,10, 0, 0, 0, 0, 0, 32, 0, 102,0, 0, 0, 0, 0, 17, 81, 20, 0, 0, 0, 0, 0, 17, 69, 18, 1, + 0, 0, 0, 0, 4, 4, 52, 0, 0, 32, 0, 0, 149,105,30, 3, 0, 0, 0, 0, 0, 164,98, 0, 0, 0, 0, 0, 107,44, 14, 1, 0, 0, 0, 0, 2, 8, 32, 0, + 0, 0, 0, 0, 4, 77, 12, 0, 0, 0, 0, 0, 1, 37, 8, 1, 0, 0, 0, 0, 4, 8, 10, 0, 0, 0, 0, 0, 1, 105,8, 0, 0, 0, 0, 0, 28, 77, 4, 0, + 0, 0, 0, 0, 128,0, 0, 3, 0, 0, 0, 0, 4, 0, 68, 0, 0, 0, 0, 0, 145,89, 16, 1, 0, 0, 0, 0, 0, 36, 10, 0, 0, 0, 0, 0, 21, 100,4, 0, + 0, 0, 0, 0, 4, 17, 128,1, 0, 0, 32, 0, 17, 101,22, 3, 0, 0, 0, 0, 255,191,124,3, 0, 0, 0, 0, 66, 144,8, 0, 0, 0, 0, 0, 144,0, 24, 0, + 0, 0, 0, 0, 20, 97, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 19, 177,0, 0, 0, 0, 0, 0, 85, 67, 76, 2, 0, 0, 0, 0, 17, 109,4, 2, + 0, 0, 0, 0, 8, 0, 64, 1, 0, 0, 0, 0, 0, 32, 40, 0, 0, 0, 0, 0, 4, 68, 8, 2, 0, 0, 0, 0, 36, 0, 68, 0, 0, 0, 0, 0, 144,20, 4, 2, + 0, 0, 0, 0, 247,191,124,1, 0, 0, 0, 0, 64, 16, 8, 0, 0, 0, 0, 0, 72, 48, 12, 0, 0, 0, 0, 0, 150,24, 4, 0, 0, 0, 0, 0, 16, 152,4, 0, + 0, 0, 0, 0, 24, 37, 8, 2, 0, 0, 0, 0, 193,5, 4, 1, 0, 0, 0, 0, 4, 8, 4, 2, 0, 0, 0, 0, 64, 8, 12, 2, 0, 0, 0, 0, 18, 33, 0, 0, + 0, 0, 0, 0, 94, 252,44, 3, 0, 0, 0, 0, 160,4, 0, 0, 0, 0, 0, 0, 66, 36, 14, 0, 0, 0, 0, 0, 80, 68, 4, 0, 0, 32, 0, 0, 144,148,12, 0, + 0, 0, 0, 0, 17, 49, 16, 0, 0, 32, 0, 0, 72, 48, 0, 0, 0, 0, 0, 0, 17, 75, 0, 1, 0, 0, 0, 0, 16, 44, 0, 0, 0, 32, 0, 0, 17, 32, 0, 0, + 0, 32, 0, 0, 17, 4, 0, 0, 0, 0, 0, 0, 32, 168,0, 0, 0, 0, 0, 0, 16, 1, 8, 2, 0, 0, 0, 0, 246,253,125,1, 0, 0, 0, 0, 194,60, 12, 2, + 0, 0, 0, 0, 144,16, 4, 0, 0, 0, 0, 0, 5, 9, 0, 0, 0, 0, 0, 0, 16, 148,2, 0, 0, 0, 0, 0, 27, 69, 4, 0, 0, 0, 0, 0, 32, 193,0, 0, + 0, 0, 0, 0, 132,32, 12, 0, 0, 0, 0, 0, 64, 128,12, 0, 0, 0, 0, 0, 92, 159,12, 3, 0, 0, 0, 0, 66, 24, 10, 0, 0, 0, 0, 0, 2, 0, 4, 2, + 0, 0, 0, 0, 146,25, 102,0, 0, 0, 0, 0, 1, 133,4, 0, 0, 0, 0, 0, 148,68, 12, 2, 0, 0, 0, 0, 0, 48, 32, 0, 0, 0, 0, 0, 72, 168,44, 2, + 0, 0, 0, 0, 128,9, 8, 0, 0, 0, 0, 0, 4, 16, 68, 0, 0, 0, 0, 0, 0, 52, 68, 2, 0, 32, 0, 0, 145,1, 94, 3, 0, 0, 0, 0, 132,58, 58, 1, + 0, 0, 0, 0, 18, 2, 128,0, 0, 0, 1, 0, 0, 0, 128,0, 0, 0, 0, 0, 255,255,78, 3, 0, 0, 0, 0, 0, 61, 10, 0, 0, 0, 0, 0, 64, 64, 8, 0, + 0, 0, 0, 0, 17, 73, 22, 0, 0, 0, 0, 0, 21, 44, 12, 0, 0, 0, 0, 0, 17, 4, 0, 2, 0, 0, 0, 0, 145,5, 16, 2, 0, 0, 0, 0, 17, 25, 8, 0, + 0, 0, 0, 0, 17, 72, 18, 2, 0, 0, 0, 0, 0, 10, 2, 0, 0, 0, 0, 0, 0, 105,0, 0, 0, 0, 0, 0, 134,181,14, 0, 0, 0, 0, 0, 0, 32, 4, 3, + 0, 0, 0, 0, 49, 32, 6, 0, 0, 0, 0, 0, 25, 40, 14, 0, 0, 0, 0, 0, 16, 12, 4, 0, 0, 0, 0, 0, 4, 136,8, 2, 0, 0, 0, 0, 0, 12, 72, 0, + 0, 0, 0, 0, 17, 73, 20, 0, 0, 0, 0, 0, 128,1, 18, 0, 0, 0, 0, 0, 151,223,76, 2, 0, 0, 0, 0, 68, 4, 4, 0, 0, 0, 0, 0, 129,0, 0, 2, + 0, 0, 0, 0, 1, 17, 16, 1, 0, 0, 0, 0, 51, 153,3, 0, 0, 0, 0, 0, 0, 120,6, 0, 0, 32, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 129,9, 0, 0, + 0, 0, 0, 0, 93, 93, 76, 2, 0, 0, 0, 0, 17, 9, 26, 0, 0, 0, 0, 0, 68, 112,4, 1, 0, 0, 0, 0, 148,16, 8, 0, 0, 0, 0, 0, 145,24, 32, 0, + 0, 0, 0, 0, 0, 156,0, 0, 0, 0, 0, 0, 53, 133,6, 0, 0, 0, 0, 0, 127,237,94, 3, 0, 0, 0, 0, 0, 1, 4, 3, 0, 0, 0, 0, 0, 12, 8, 0, + 0, 0, 0, 0, 213,8, 12, 0, 0, 0, 0, 0, 136,4, 68, 0, 0, 0, 0, 0, 133,4, 8, 0, 0, 0, 0, 0, 149,65, 24, 3, 0, 0, 0, 0, 0, 164,44, 0, + 0, 0, 0, 0, 0, 65, 64, 1, 0, 0, 0, 0, 149,37, 28, 2, 0, 0, 0, 0, 1, 45, 0, 0, 0, 0, 0, 0, 149,41, 28, 3, 0, 0, 0, 0, 17, 40, 0, 1, + 0, 0, 0, 0, 136,33, 0, 0, 0, 0, 0, 0, 3, 132,0, 0, 0, 0, 0, 0, 17, 49, 0, 1, 0, 0, 0, 0, 16, 152,10, 0, 0, 0, 0, 0, 4, 183,14, 2, + 0, 0, 0, 0, 25, 44, 8, 0, 0, 0, 0, 0, 16, 4, 16, 0, 0, 0, 0, 0, 211,255,30, 2, 0, 32, 0, 0, 16, 0, 6, 0, 0, 0, 0, 0, 4, 36, 8, 0, + 0, 0, 0, 0, 0, 5, 20, 0, 16, 252,18, 0, 255,255,252,3, 0, 0, 0, 0, 6, 49, 55, 0, 0, 0, 0, 0, 69, 40, 189,0, 0, 0, 0, 0, 16, 128,18, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 36, 12, 0, 0, 0, 0, 0, 27, 77, 30, 1, 0, 0, 0, 0, 10, 48, 26, 1, 0, 0, 0, 0, 66, 64, 2, 0, + 0, 0, 0, 0, 1, 88, 2, 0, 0, 0, 0, 0, 80, 49, 54, 1, 0, 0, 0, 0, 25, 33, 4, 0, 0, 0, 0, 0, 8, 36, 8, 0, 0, 0, 0, 0, 20, 0, 1, 0, + 0, 0, 0, 0, 128,4, 1, 0, 0, 0, 0, 0, 0, 48, 0, 3, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 145,93, 31, 3, 0, 0, 0, 0, 0, 33, 60, 3, + 0, 0, 0, 0, 40, 4, 70, 1, 0, 0, 0, 0, 25, 0, 8, 0, 0, 0, 0, 0, 0, 161,10, 0, 0, 0, 0, 0, 17, 121,4, 0, 0, 0, 0, 0, 68, 48, 54, 1, + 0, 0, 0, 0, 27, 121,92, 1, 0, 64, 0, 0, 66, 36, 68, 1, 0, 0, 0, 0, 11, 40, 70, 0, 0, 0, 0, 0, 64, 32, 16, 0, 0, 32, 0, 0, 106,24, 12, 0, + 0, 0, 0, 0, 192,24, 46, 0, 0, 0, 0, 0, 49, 77, 18, 0, 0, 0, 0, 0, 4, 32, 62, 1, 0, 0, 0, 0, 0, 16, 34, 0, 0, 0, 0, 0, 17, 32, 10, 0, + 0, 0, 0, 0, 16, 104,22, 1, 0, 0, 0, 0, 92, 0, 10, 0, 0, 0, 0, 0, 0, 48, 8, 2, 0, 0, 0, 0, 81, 121,86, 0, 0, 0, 0, 0, 12, 48, 14, 2, + 0, 0, 0, 0, 65, 0, 8, 0, 0, 0, 0, 0, 98, 16, 5, 0, 0, 0, 0, 0, 0, 33, 36, 0, 0, 0, 0, 0, 0, 96, 72, 0, 0, 0, 0, 0, 17, 113,26, 0, + 0, 0, 0, 0, 0, 130,10, 0, 0, 0, 0, 0, 0, 48, 18, 0, 0, 0, 0, 0, 78, 236,14, 2, 0, 0, 0, 0, 208,64, 12, 0, 0, 0, 0, 0, 8, 16, 4, 1, + 0, 0, 0, 0, 17, 192,16, 2, 0, 0, 0, 0, 0, 41, 4, 1, 0, 0, 0, 0, 145,113,4, 1, 0, 0, 0, 0, 178,57, 110,1, 0, 0, 0, 0, 136,0, 0, 1, + 0, 0, 0, 0, 17, 32, 12, 0, 0, 0, 0, 0, 32, 0, 72, 0, 0, 0, 0, 0, 17, 77, 16, 0, 0, 32, 0, 0, 0, 44, 8, 0, 0, 0, 0, 0, 6, 112,8, 0, + 0, 0, 0, 0, 129,128,0, 0, 0, 0, 0, 0, 59, 213,20, 1, 0, 0, 0, 0, 77, 33, 142,3, 0, 0, 0, 0, 69, 33, 8, 0, 0, 0, 0, 0, 4, 4, 15, 0, + 0, 0, 0, 0, 29, 77, 30, 0, 0, 0, 0, 0, 5, 0, 14, 1, 0, 32, 0, 0, 128,65, 52, 1, 0, 32, 0, 0, 0, 0, 18, 1, 0, 32, 0, 0, 16, 0, 4, 3, + 0, 0, 0, 0, 21, 33, 6, 0, 0, 0, 0, 0, 20, 0, 10, 0, 0, 0, 0, 0, 0, 97, 30, 0, 0, 0, 0, 0, 8, 1, 12, 0, 0, 0, 0, 0, 81, 0, 8, 0, + 0, 0, 0, 0, 145,221,30, 0, 0, 0, 0, 0, 253,245,61, 3, 0, 0, 0, 0, 192,65, 30, 0, 0, 0, 0, 0, 145,73, 12, 2, 0, 32, 0, 0, 0, 72, 14, 1, + 0, 0, 0, 0, 243,93, 127,1, 0, 0, 0, 0, 4, 36, 48, 2, 0, 0, 0, 0, 40, 32, 38, 1, 0, 0, 0, 0, 0, 80, 4, 0, 0, 0, 0, 0, 0, 44, 98, 0, + 0, 0, 0, 0, 0, 32, 44, 1, 0, 0, 0, 0, 151,28, 8, 0, 0, 0, 0, 0, 201,40, 108,1, 0, 0, 0, 0, 251,253,94, 0, 0, 0, 32, 0, 160,40, 34, 0, + 0, 0, 0, 0, 186,0, 0, 0, 0, 0, 0, 0, 153,0, 8, 0, 0, 0, 0, 0, 81, 32, 24, 0, 0, 0, 0, 0, 49, 0, 4, 1, 0, 0, 0, 0, 0, 48, 0, 1, + 0, 0, 0, 0, 0, 1, 22, 0, 0, 0, 0, 0, 59, 69, 0, 0, 0, 0, 0, 0, 209,65, 10, 2, 0, 0, 0, 0, 96, 32, 16, 0, 0, 0, 0, 0, 32, 8, 2, 0, + 0, 0, 0, 0, 73, 33, 14, 2, 0, 0, 0, 0, 153,201,94, 0, 0, 0, 0, 0, 72, 40, 10, 0, 0, 0, 0, 0, 16, 44, 10, 1, 0, 0, 0, 0, 25, 40, 12, 0, + 0, 0, 1, 0, 4, 9, 2, 0, 0, 0, 0, 0, 223,245,126,3, 0, 0, 0, 0, 86, 49, 108,0, 0, 0, 0, 0, 17, 97, 0, 1, 0, 0, 0, 0, 89, 52, 68, 3, + 0, 0, 0, 0, 13, 112,172,2, 0, 0, 0, 0, 20, 33, 93, 0, 0, 0, 0, 0, 132,4, 1, 0, 0, 0, 0, 0, 2, 41, 0, 0, 0, 0, 0, 0, 22, 16, 52, 0, + 0, 0, 0, 0, 0, 0, 69, 0, 0, 160,0, 0, 66, 0, 68, 0, 0, 0, 0, 0, 149,205,124,3, 0, 0, 0, 0, 64, 41, 12, 0, 0, 0, 0, 0, 4, 40, 10, 0, + 0, 32, 0, 0, 8, 34, 4, 0, 0, 0, 0, 0, 19, 93, 80, 0, 0, 0, 0, 0, 0, 32, 80, 1, 0, 0, 0, 0, 0, 100,8, 0, 0, 0, 0, 0, 17, 77, 80, 0, + 0, 0, 0, 0, 0, 41, 14, 0, 0, 4, 0, 0, 20, 89, 30, 0, 0, 0, 0, 0, 4, 32, 32, 0, 0, 0, 0, 0, 213,101,62, 3, 0, 0, 0, 0, 0, 53, 7, 0, + 0, 0, 0, 0, 20, 40, 134,0, 0, 0, 0, 0, 28, 1, 8, 0, 0, 0, 0, 0, 1, 1, 4, 2, 0, 0, 0, 0, 0, 9, 20, 0, 0, 0, 0, 0, 101,116,28, 0, + 0, 0, 0, 0, 0, 32, 22, 1, 0, 0, 0, 0, 17, 33, 18, 1, 0, 0, 0, 0, 68, 48, 0, 0, 0, 0, 0, 0, 126,189,238,2, 0, 0, 0, 0, 145,0, 4, 1, + 0, 0, 0, 0, 10, 32, 8, 0, 0, 0, 0, 0, 10, 16, 0, 0, 0, 0, 0, 0, 19, 121,14, 0, 0, 0, 0, 0, 29, 1, 8, 0, 0, 96, 0, 0, 6, 40, 4, 0, + 0, 0, 0, 0, 17, 40, 8, 1, 0, 32, 0, 0, 29, 65, 12, 2, 0, 0, 0, 0, 9, 1, 16, 0, 0, 0, 0, 0, 29, 120,12, 0, 0, 0, 0, 0, 1, 64, 4, 2, + 0, 0, 0, 0, 145,113,26, 2, 0, 0, 0, 0, 81, 65, 2, 3, 0, 0, 0, 0, 76, 40, 12, 0, 0, 0, 0, 0, 12, 1, 72, 0, 0, 0, 0, 0, 21, 40, 14, 3, + 0, 0, 0, 0, 24, 1, 8, 0, 0, 0, 0, 0, 89, 32, 10, 1, 0, 0, 0, 0, 80, 96, 4, 0, 0, 0, 0, 0, 4, 41, 2, 1, 0, 0, 0, 0, 89, 33, 0, 0, + 0, 0, 0, 0, 191,57, 110,1, 0, 0, 0, 0, 17, 32, 0, 1, 0, 0, 0, 0, 14, 17, 12, 0, 0, 0, 0, 0, 17, 17, 12, 0, 0, 0, 0, 0, 189,249,60, 0, + 0, 0, 0, 0, 32, 0, 48, 0, 0, 64, 0, 0, 21, 73, 16, 3, 0, 0, 0, 0, 28, 65, 30, 2, 64, 0, 0, 0, 165,160,44, 1, 0, 0, 0, 0, 48, 2, 0, 0, + 0, 0, 2, 0, 1, 0, 4, 0, 0, 0, 0, 0, 238,253,46, 2, 0, 0, 0, 0, 50, 89, 36, 1, 0, 0, 0, 0, 0, 2, 16, 0, 0, 0, 0, 0, 20, 16, 0, 1, + 0, 0, 0, 0, 25, 97, 4, 2, 0, 0, 0, 0, 176,1, 12, 0, 0, 0, 0, 0, 8, 50, 0, 1, 0, 0, 0, 0, 145,69, 24, 1, 0, 0, 0, 0, 136,0, 6, 0, + 0, 32, 32, 0, 162,16, 68, 1, 0, 0, 0, 0, 8, 56, 6, 0, 0, 0, 0, 0, 80, 1, 68, 0, 0, 0, 0, 0, 128,32, 18, 0, 0, 0, 0, 0, 64, 65, 2, 0, + 0, 0, 0, 0, 16, 40, 114,0, 0, 0, 0, 0, 128,0, 1, 0, 0, 0, 0, 0, 149,77, 26, 3, 0, 0, 0, 0, 17, 57, 16, 0, 0, 0, 0, 0, 2, 17, 0, 1, + 0, 0, 0, 0, 4, 48, 19, 0, 0, 0, 0, 0, 22, 32, 14, 2, 0, 32, 0, 0, 191,188,126,2, 0, 0, 0, 0, 19, 80, 32, 0, 0, 0, 0, 0, 53, 76, 26, 0, + 0, 0, 0, 0, 2, 8, 96, 0, 0, 0, 0, 0, 16, 0, 50, 0, 0, 0, 1, 0, 144,81, 70, 1, 0, 0, 0, 0, 213,121,86, 2, 0, 0, 0, 0, 5, 40, 30, 2, + 0, 96, 0, 0, 17, 0, 6, 0, 0, 0, 0, 0, 19, 64, 12, 0, 0, 0, 0, 0, 32, 24, 22, 0, 0, 0, 0, 0, 0, 32, 76, 0, 0, 32, 0, 0, 144,0, 0, 0, + 0, 0, 0, 0, 19, 115,10, 0, 0, 0, 0, 0, 19, 4, 0, 0, 0, 0, 0, 0, 48, 21, 0, 0, 0, 0, 0, 0, 255,190,174,0, 0, 0, 0, 0, 49, 112,4, 1, + 0, 0, 0, 0, 145,1, 0, 1, 0, 32, 0, 0, 1, 8, 8, 0, 0, 0, 0, 0, 18, 4, 0, 0, 0, 0, 0, 0, 211,65, 68, 0, 0, 0, 0, 0, 144,64, 0, 2, + 0, 0, 0, 0, 149,41, 28, 1, 0, 0, 0, 0, 149,48, 10, 2, 0, 0, 0, 0, 17, 16, 16, 0, 0, 0, 0, 0, 19, 69, 72, 0, 0, 0, 0, 0, 23, 253,16, 0, + 0, 0, 0, 0, 0, 33, 6, 1, 0, 0, 0, 0, 20, 68, 2, 0, 0, 0, 0, 0, 5, 40, 2, 0, 0, 0, 0, 0, 20, 32, 6, 0, 0, 0, 0, 0, 0, 97, 4, 1, + 0, 32, 0, 0, 153,9, 12, 1, 0, 64, 0, 0, 255,109,28, 3, 0, 96, 0, 0, 128,128,66, 0, 0, 0, 0, 0, 16, 73, 14, 0, 0, 0, 0, 0, 17, 8, 24, 1, + 0, 0, 0, 0, 16, 0, 68, 1, 0, 0, 0, 0, 208,96, 156,0, 0, 0, 1, 0, 4, 33, 178,0, 0, 0, 0, 0, 25, 0, 24, 0, 0, 32, 0, 0, 42, 184,14, 0, + 0, 32, 0, 0, 215,193,8, 0, 0, 0, 0, 0, 1, 8, 12, 0, 0, 0, 0, 0, 0, 65, 32, 0, 0, 0, 0, 0, 21, 237,30, 0, 0, 0, 0, 0, 64, 36, 2, 0, + 0, 0, 0, 0, 0, 0, 10, 2, 0, 0, 0, 0, 17, 13, 0, 0, 0, 0, 0, 0, 21, 241,218,0, 0, 64, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 4, 33, 80, 1, + 0, 0, 0, 0, 151,253,28, 3, 0, 0, 0, 0, 17, 121,0, 0, 0, 0, 0, 0, 16, 160,2, 1, 16, 0, 0, 0, 159,93, 14, 2, 0, 32, 0, 0, 64, 65, 4, 0, + 0, 240,47, 0, 0, 96, 0, 0, 0, 64, 0, 0, 32, 0, 16, 0, 0, 0, 0, 0, 108,193,4, 0, 0, 0, 0, 0, 17, 17, 22, 1, 0, 0, 0, 0, 146,157,4, 0, + 0, 0, 0, 0, 215,180,46, 3, 0, 0, 0, 0, 144,32, 64, 1, 0, 0, 0, 0, 8, 40, 14, 1, 0, 0, 0, 0, 72, 1, 12, 0, 0, 0, 0, 0, 32, 0, 68, 0, + 0, 0, 0, 0, 20, 41, 15, 1, 0, 32, 1, 0, 144,73, 4, 0, 0, 0, 0, 0, 216,0, 12, 0, 0, 0, 0, 0, 64, 64, 9, 0, 0, 0, 0, 0, 21, 32, 12, 0, + 0, 0, 0, 0, 21, 65, 14, 3, 0, 0, 0, 0, 12, 32, 0, 1, 0, 0, 0, 0, 29, 17, 10, 1, 0, 32, 0, 0, 146,64, 40, 0, 0, 0, 0, 0, 17, 17, 152,0, + 0, 0, 0, 0, 20, 36, 4, 0, 0, 160,0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 155,56, 62, 0, 0, 0, 0, 0, 136,129,0, 1, 0, 64, 0, 0, 2, 164,0, 0, + 0, 0, 0, 0, 51, 64, 16, 0, 16, 0, 0, 0, 255,255,127,3, 0, 0, 0, 0, 2, 245,71, 0, 0, 0, 0, 0, 81, 96, 0, 0, 0, 0, 0, 0, 19, 85, 30, 1, + 0, 0, 0, 0, 24, 0, 10, 1, 0, 0, 0, 0, 25, 81, 8, 0, 0, 96, 40, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 64, 44, 0, 0, 0, 0, 0, 149,69, 16, 0, + 0, 0, 0, 0, 0, 40, 58, 0, 0, 0, 0, 0, 49, 76, 12, 0, 0, 0, 0, 0, 34, 0, 68, 0, 0, 32, 4, 0, 176,185,12, 0, 0, 0, 0, 0, 8, 16, 10, 1, + 0, 0, 0, 0, 91, 77, 12, 2, 0, 0, 0, 0, 238,180,126,2, 0, 0, 0, 0, 149,93, 6, 0, 0, 0, 0, 0, 18, 4, 8, 1, 0, 0, 0, 0, 216,4, 4, 0, + 0, 0, 0, 0, 0, 24, 4, 2, 0, 0, 0, 0, 20, 28, 44, 0, 0, 0, 0, 0, 0, 64, 16, 2, 0, 0, 0, 0, 49, 72, 12, 0, 0, 0, 0, 0, 230,9, 14, 0, + 0, 0, 0, 0, 1, 192,24, 0, 0, 0, 0, 0, 18, 65, 4, 0, 0, 0, 0, 0, 209,121,16, 0, 0, 0, 0, 0, 16, 48, 12, 0, 0, 96, 0, 0, 182,57, 68, 1, + 0, 32, 0, 0, 145,128,0, 0, 0, 32, 0, 0, 9, 57, 76, 0, 0, 0, 0, 0, 31, 95, 74, 1, 0, 0, 0, 0, 17, 128,24, 1, 0, 0, 0, 0, 10, 32, 0, 0, + 0, 0, 0, 0, 17, 193,0, 1, 0, 0, 0, 0, 146,4, 6, 1, 0, 0, 0, 0, 87, 128,4, 0, 0, 0, 0, 0, 10, 0, 1, 0, 0, 0, 0, 0, 23, 253,8, 0, + 0, 0, 0, 0, 66, 160,54, 0, 0, 0, 0, 0, 17, 65, 22, 0, 0, 0, 0, 0, 128,8, 70, 1, 0, 0, 0, 0, 64, 40, 20, 0, 0, 0, 0, 0, 26, 65, 4, 0, + 0, 0, 0, 0, 255,127,253,2, 0, 0, 0, 0, 132,52, 2, 0, 0, 0, 0, 0, 243,121,71, 3, 0, 32, 0, 0, 135,24, 20, 0, 0, 0, 0, 0, 16, 72, 16, 0, + 0, 0, 0, 0, 34, 144,64, 0, 0, 0, 0, 0, 128,24, 12, 0, 0, 0, 0, 0, 17, 12, 8, 1, 0, 0, 0, 0, 203,52, 94, 0, 0, 0, 0, 0, 243,237,18, 0, + 0, 0, 0, 0, 40, 88, 2, 1, 0, 0, 0, 0, 32, 40, 2, 0, 0, 0, 0, 0, 145,77, 4, 0, 0, 0, 0, 0, 0, 160,112,0, 0, 0, 0, 0, 5, 56, 10, 1, + 0, 0, 0, 0, 29, 109,12, 0, 0, 0, 0, 0, 144,96, 4, 2, 0, 0, 0, 0, 0, 32, 26, 0, 0, 32, 0, 0, 146,4, 12, 0, 0, 32, 0, 0, 72, 0, 0, 0, + 0, 0, 0, 0, 177,245,12, 0, 0, 0, 0, 0, 0, 144,36, 0, 0, 0, 0, 0, 145,81, 4, 1, 0, 0, 0, 0, 148,69, 8, 2, 0, 0, 0, 0, 0, 36, 96, 0, + 0, 0, 0, 0, 32, 0, 24, 0, 0, 0, 0, 0, 151,221,28, 3, 0, 48, 4, 0, 3, 56, 0, 0, 0, 0, 0, 0, 20, 0, 24, 0, 0, 0, 0, 0, 0, 160,64, 0, + 0, 0, 0, 0, 151,125,126,2, 0, 0, 0, 0, 33, 16, 0, 0, 0, 0, 0, 0, 134,96, 134,0, 0, 0, 0, 0, 5, 0, 16, 0, 0, 0, 0, 0, 49, 89, 6, 1, + 0, 32, 0, 0, 250,210,78, 0, 0, 0, 0, 0, 8, 4, 8, 2, 0, 0, 0, 0, 17, 105,38, 1, 0, 0, 0, 0, 60, 106,70, 2, 0, 0, 0, 0, 160,32, 0, 0, + 0, 0, 0, 0, 17, 177,84, 1, 0, 0, 0, 0, 73, 96, 16, 0, 0, 0, 16, 0, 19, 65, 0, 2, 0, 64, 0, 0, 2, 116,34, 0, 0, 32, 0, 0, 1, 69, 4, 0, + 0, 0, 0, 0, 134,4, 146,0, 0, 4, 0, 0, 23, 73, 80, 1, 0, 0, 0, 0, 121,64, 40, 0, 0, 0, 0, 0, 1, 0, 66, 0, 0, 0, 0, 0, 2, 1, 66, 1, + 0, 0, 0, 0, 10, 193,6, 1, 0, 0, 0, 0, 33, 128,0, 0, 0, 0, 0, 0, 44, 49, 42, 0, 0, 0, 0, 0, 128,16, 4, 0, 0, 0, 0, 0, 27, 105,22, 2, + 0, 0, 0, 0, 4, 40, 28, 0, 0, 0, 0, 0, 8, 40, 6, 2, 0, 0, 0, 0, 153,69, 20, 1, 0, 0, 0, 0, 145,105,14, 0, 0, 0, 0, 0, 155,251,86, 1, + 0, 0, 0, 0, 8, 48, 10, 1, 0, 0, 0, 0, 2, 16, 6, 1, 0, 0, 0, 0, 128,24, 0, 0, 0, 0, 0, 0, 217,65, 82, 2, 0, 0, 0, 0, 0, 33, 66, 0, + 0, 0, 0, 0, 8, 128,6, 0, 0, 0, 0, 0, 230,160,126,2, 0, 0, 0, 0, 1, 0, 72, 2, 0, 0, 0, 0, 97, 89, 79, 0, 0, 0, 0, 0, 144,81, 20, 1, + 0, 0, 0, 0, 215,75, 86, 0, 0, 96, 2, 0, 0, 64, 4, 0, 0, 0, 0, 0, 21, 32, 28, 0, 0, 0, 0, 0, 32, 40, 20, 0, 0, 32, 0, 0, 25, 112,78, 0, + 0, 0, 0, 0, 13, 44, 14, 0, 0, 0, 0, 0, 145,213,16, 0, 0, 0, 0, 0, 16, 2, 8, 0, 0, 32, 2, 0, 1, 253,72, 2, 0, 0, 0, 0, 16, 160,4, 0, + 0, 0, 0, 0, 0, 152,128,0, 0, 0, 0, 0, 83, 209,16, 2, 0, 0, 0, 0, 68, 32, 134,1, 0, 0, 0, 0, 0, 65, 4, 1, 0, 0, 0, 0, 8, 40, 0, 2, + 0, 0, 0, 0, 9, 64, 8, 0, 0, 0, 0, 0, 93, 105,12, 2, 0, 0, 0, 0, 1, 97, 2, 0, 0, 112,32, 0, 24, 64, 0, 0, 0, 0, 0, 0, 0, 8, 70, 1, + 0, 0, 0, 0, 191,255,126,1, 0, 0, 0, 0, 6, 36, 0, 0, 0, 0, 0, 0, 1, 0, 72, 0, 0, 0, 0, 0, 8, 32, 38, 0, 0, 0, 0, 0, 48, 224,12, 0, + 0, 0, 0, 0, 65, 0, 0, 1, 0, 0, 0, 0, 136,0, 72, 0, 0, 0, 0, 0, 8, 1, 64, 0, 0, 0, 0, 0, 118,253,14, 0, 0, 0, 0, 0, 3, 0, 8, 0, + 0, 0, 0, 0, 10, 8, 8, 0, 0, 0, 0, 0, 80, 1, 4, 1, 0, 0, 0, 0, 144,1, 4, 1, 0, 0, 0, 0, 17, 201,22, 2, 0, 0, 0, 0, 0, 0, 30, 2, + 0, 0, 0, 0, 12, 64, 0, 0, 0, 0, 0, 0, 0, 16, 6, 3, 0, 0, 0, 0, 95, 117,31, 3, 0, 0, 0, 0, 128,41, 4, 0, 0, 0, 0, 0, 89, 56, 12, 1, + 0, 0, 0, 0, 21, 0, 12, 2, 0, 0, 0, 0, 1, 64, 8, 2, 0, 0, 0, 0, 21, 124,12, 0, 0, 0, 0, 0, 93, 64, 0, 0, 0, 0, 0, 0, 183,101,12, 2, + 0, 0, 0, 0, 12, 32, 34, 0, 0, 0, 0, 0, 20, 36, 14, 1, 0, 96, 0, 0, 0, 4, 4, 0, 0, 0, 1, 0, 18, 72, 70, 0, 0, 0, 0, 0, 147,1, 30, 2, + 0, 0, 0, 0, 129,192,0, 0, 0, 32, 0, 0, 95, 173,239,0, 0, 0, 0, 0, 16, 121,4, 1, 0, 0, 0, 0, 19, 56, 10, 0, 0, 32, 0, 0, 19, 1, 36, 0, + 0, 0, 0, 0, 25, 97, 0, 1, 0, 0, 0, 0, 117,65, 36, 0, 0, 0, 0, 0, 67, 40, 12, 0, 0, 240,63, 0, 255,251,30, 3, 0, 240,3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 16, 16, 16, 1, 0, 0, 0, 0, 133,64, 2, 0, 0, 0, 0, 0, 4, 0, 34, 0, 0, 96, 4, 0, 75, 113,6, 0, 0, 32, 0, 0, 17, 209,28, 1, + 0, 0, 0, 0, 64, 72, 4, 0, 0, 0, 0, 0, 159,61, 14, 1, 0, 0, 0, 0, 0, 44, 6, 0, 0, 0, 0, 0, 20, 17, 4, 1, 0, 0, 0, 0, 24, 16, 0, 0, + 0, 0, 0, 0, 31, 96, 4, 0, 0, 0, 0, 0, 17, 97, 0, 2, 0, 64, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 9, 1, 92, 0, 0, 4, 0, 0, 140,12, 8, 1, + 0, 4, 0, 0, 0, 2, 0, 0, 0, 32, 0, 0, 64, 0, 8, 0, 0, 32, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 68, 168,22, 0, 0, 0, 0, 0, 73, 32, 4, 0, + 0, 0, 0, 0, 1, 0, 134,0, 0, 0, 0, 0, 19, 93, 18, 1, 0, 0, 0, 0, 132,0, 98, 0, 0, 0, 0, 0, 0, 16, 68, 0, 0, 0, 0, 0, 149,69, 18, 3, + 0, 32, 0, 0, 161,0, 4, 0, 0, 0, 0, 0, 1, 36, 2, 1, 0, 0, 0, 0, 61, 108,28, 0, 0, 0, 0, 0, 145,113,6, 1, 0, 0, 0, 0, 24, 32, 10, 1, + 0, 224,63, 0, 14, 80, 4, 1, 0, 32, 0, 0, 12, 8, 0, 0, 0, 0, 0, 0, 1, 4, 0, 1, 0, 0, 0, 0, 217,93, 120,1, 0, 0, 0, 0, 4, 52, 66, 0, + 0, 0, 0, 0, 20, 32, 32, 0, 0, 0, 0, 0, 64, 8, 32, 0, 0, 0, 0, 0, 130,8, 0, 0, 0, 0, 0, 0, 206,172,46, 0, 0, 0, 0, 0, 3, 4, 2, 0, + 0, 0, 0, 0, 130,64, 0, 0, 0, 0, 0, 0, 16, 5, 8, 0, 0, 0, 0, 0, 4, 16, 2, 0, 0, 0, 0, 0, 136,20, 8, 0, 0, 0, 1, 0, 160,0, 68, 0, + 0, 0, 0, 0, 217,97, 4, 0, 0, 0, 0, 0, 68, 36, 12, 2, 0, 32, 0, 0, 49, 65, 0, 0, 0, 0, 0, 0, 0, 130,0, 0, 0, 0, 0, 0, 4, 32, 44, 0, + 0, 32, 0, 0, 128,5, 0, 2, 0, 32, 0, 0, 128,32, 70, 0, 0, 0, 0, 0, 17, 73, 80, 0, 0, 0, 0, 0, 32, 32, 64, 0, 0, 0, 0, 0, 19, 153,20, 0, + 0, 32, 0, 0, 0, 19, 8, 1, 0, 0, 0, 0, 17, 32, 128,0, 0, 0, 0, 0, 16, 132,20, 1, 0, 0, 0, 0, 125,37, 12, 2, 0, 0, 0, 0, 18, 1, 10, 0, + 0, 0, 0, 0, 211,17, 39, 1, 0, 0, 0, 0, 16, 72, 16, 1, 0, 0, 0, 0, 82, 56, 2, 0, 0, 0, 0, 0, 3, 48, 42, 0, 0, 0, 0, 0, 177,0, 70, 0, + 0, 0, 0, 0, 0, 50, 8, 1, 0, 0, 0, 0, 49, 197,24, 0, 0, 0, 0, 0, 85, 13, 42, 3, 0, 0, 0, 0, 25, 32, 0, 0, 0, 0, 0, 0, 151,69, 12, 0, + 0, 0, 0, 0, 50, 1, 6, 1, 0, 0, 0, 0, 245,86, 78, 3, 0, 0, 0, 0, 16, 80, 6, 0, 0, 64, 0, 0, 50, 129,4, 0, 0, 0, 4, 0, 48, 0, 0, 0, + 0, 64, 0, 0, 16, 80, 24, 0, 0, 0, 0, 0, 10, 83, 0, 0, 0, 0, 0, 0, 72, 1, 0, 0, 0, 0, 0, 0, 127,125,62, 0, 0, 0, 0, 0, 0, 136,20, 0, + 0, 0, 0, 0, 19, 0, 2, 0, 0, 0, 0, 0, 25, 97, 0, 0, 0, 32, 0, 0, 0, 32, 2, 0, 0, 0, 0, 0, 17, 193,0, 0, 0, 0, 0, 0, 93, 108,220,1, + 0, 0, 0, 0, 136,16, 16, 0, 0, 32, 0, 0, 19, 3, 0, 0, 0, 0, 0, 0, 145,97, 12, 0, 0, 0, 0, 0, 1, 48, 4, 0, 0, 0, 0, 0, 221,9, 8, 0, + 80, 188,14, 64, 223,255,254,3, 0, 0, 0, 0, 131,28, 4, 0, 0, 0, 0, 0, 59, 131,12, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 128,0, 0, 0, + 0, 96, 32, 0, 68, 16, 4, 0, 16, 32, 0, 0, 255,255,255,3, 0, 64, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 204,40, 14, 2, 0, 0, 0, 0, 0, 1, 136,0, + 0, 0, 0, 0, 21, 5, 12, 0, 0, 32, 0, 0, 255,253,127,3, 0, 0, 0, 0, 174,232,119,1, 0, 0, 0, 0, 16, 25, 16, 0, 0, 0, 0, 0, 25, 0, 16, 0, + 0, 0, 0, 0, 129,73, 16, 0, 0, 0, 0, 0, 2, 8, 18, 0, 0, 0, 0, 0, 64, 32, 80, 0, 0, 0, 0, 0, 9, 100,70, 1, 0, 0, 0, 0, 0, 65, 18, 1, + 0, 32, 0, 0, 17, 109,24, 1, 0, 0, 0, 0, 12, 61, 2, 0, 0, 0, 0, 0, 9, 40, 4, 0, 0, 32, 0, 0, 72, 0, 6, 0, 0, 0, 0, 0, 0, 56, 96, 0, + 0, 0, 0, 0, 17, 96, 36, 0, 0, 0, 0, 0, 64, 4, 6, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 32, 0, 0, 25, 105,68, 1, 0, 0, 0, 0, 28, 40, 6, 1, + 0, 0, 0, 0, 73, 40, 12, 0, 0, 0, 0, 0, 68, 33, 18, 1, 0, 0, 0, 0, 66, 17, 16, 0, 0, 0, 0, 0, 1, 1, 32, 0, 0, 0, 0, 0, 86, 176,68, 0, + 0, 0, 0, 0, 223,125,94, 3, 0, 0, 0, 0, 96, 56, 66, 1, 0, 0, 0, 0, 17, 81, 18, 1, 0, 0, 0, 0, 16, 32, 132,0, 0, 0, 0, 0, 68, 0, 192,1, + 0, 0, 0, 0, 1, 59, 70, 0, 0, 0, 0, 0, 81, 40, 12, 0, 0, 240,33, 0, 0, 0, 32, 0, 0, 0, 0, 0, 100,44, 130,0, 0, 0, 0, 0, 72, 8, 0, 2, + 0, 0, 0, 0, 74, 40, 110,2, 0, 0, 0, 0, 137,225,0, 0, 0, 0, 0, 0, 49, 33, 18, 0, 0, 0, 0, 0, 219,249,86, 1, 0, 0, 0, 0, 136,40, 74, 2, + 0, 0, 0, 0, 137,0, 0, 0, 0, 0, 0, 0, 136,73, 4, 1, 0, 0, 0, 0, 24, 40, 46, 0, 0, 0, 0, 0, 24, 96, 8, 0, 0, 112,32, 0, 0, 16, 0, 0, + 0, 0, 0, 0, 28, 44, 28, 0, 0, 224,12, 0, 129,85, 4, 0, 0, 0, 0, 0, 2, 0, 32, 1, 0, 0, 0, 0, 0, 40, 40, 0, 0, 0, 0, 0, 0, 65, 14, 0, + 0, 0, 0, 0, 49, 32, 8, 0, 0, 0, 0, 0, 98, 112,86, 0, 0, 0, 0, 0, 0, 41, 0, 1, 0, 0, 0, 0, 57, 127,82, 0, 0, 0, 0, 0, 42, 190,174,1, + 0, 0, 0, 0, 17, 77, 0, 0, 0, 0, 0, 0, 25, 96, 8, 1, 0, 0, 0, 0, 65, 1, 6, 0, 0, 0, 0, 0, 0, 33, 22, 0, 0, 0, 0, 0, 9, 56, 0, 0, + 0, 0, 0, 0, 16, 85, 16, 0, 0, 0, 0, 0, 80, 120,64, 0, 0, 0, 0, 0, 125,124,142,3, 0, 32, 4, 0, 128,0, 4, 0, 0, 32, 0, 0, 151,89, 14, 0, + 0, 0, 0, 0, 113,89, 108,2, 0, 32, 0, 0, 0, 8, 14, 1, 0, 0, 0, 0, 1, 128,8, 0, 0, 4, 0, 0, 29, 93, 16, 0, 0, 0, 0, 0, 25, 0, 78, 0, + 0, 0, 0, 0, 21, 64, 20, 0, 0, 0, 0, 0, 28, 36, 0, 0, 0, 32, 0, 0, 93, 9, 12, 0, 0, 0, 0, 0, 149,77, 30, 0, 0, 0, 0, 0, 130,45, 46, 1, + 0, 0, 0, 0, 10, 253,30, 1, 0, 0, 0, 0, 9, 33, 0, 0, 0, 0, 0, 0, 32, 32, 108,0, 0, 96, 2, 0, 1, 1, 0, 1, 0, 0, 0, 0, 238,181,110,1, + 0, 32, 0, 0, 0, 33, 4, 0, 0, 0, 0, 0, 89, 4, 0, 0, 0, 32, 0, 0, 0, 0, 128,0, 0, 8, 0, 0, 228,100,110,1, 0, 0, 0, 0, 33, 4, 4, 0, + 0, 0, 0, 0, 0, 5, 0, 2, 0, 0, 0, 0, 87, 36, 12, 2, 0, 0, 0, 0, 152,69, 0, 0, 0, 32, 0, 0, 1, 65, 0, 0, 0, 0, 0, 0, 93, 69, 4, 0, + 0, 0, 0, 0, 0, 1, 100,0, 0, 0, 0, 0, 145,4, 4, 2, 0, 0, 0, 0, 85, 36, 26, 1, 0, 0, 0, 0, 21, 36, 4, 0, 0, 0, 0, 0, 4, 48, 66, 3, + 0, 0, 0, 0, 83, 65, 5, 0, 0, 0, 0, 0, 36, 104,58, 1, 0, 0, 0, 0, 129,1, 2, 0, 0, 0, 0, 0, 147,65, 6, 2, 0, 0, 0, 0, 8, 0, 6, 2, + 0, 0, 0, 0, 20, 4, 12, 0, 0, 0, 0, 0, 19, 89, 26, 0, 0, 96, 8, 0, 14, 184,14, 0, 0, 176,3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 4, 8, 1, + 0, 32, 0, 0, 8, 56, 2, 0, 0, 0, 0, 0, 68, 96, 8, 0, 0, 0, 1, 0, 4, 32, 18, 0, 0, 0, 0, 0, 8, 44, 4, 0, 16, 34, 0, 0, 255,255,255,3, + 0, 0, 0, 0, 202,124,126,0, 0, 0, 0, 0, 5, 0, 13, 0, 0, 0, 0, 0, 17, 89, 26, 1, 0, 0, 0, 0, 128,184,26, 0, 0, 0, 0, 0, 0, 68, 4, 0, + 0, 0, 0, 0, 0, 8, 38, 2, 0, 0, 0, 0, 3, 9, 4, 0, 0, 0, 0, 0, 87, 96, 2, 0, 0, 0, 0, 0, 64, 168,0, 2, 0, 0, 0, 0, 4, 2, 2, 0, + 0, 0, 0, 0, 69, 24, 30, 1, 0, 0, 0, 0, 145,73, 18, 1, 0, 32, 0, 0, 0, 104,12, 0, 0, 0, 0, 0, 21, 96, 4, 0, 0, 0, 0, 0, 32, 144,2, 0, + 0, 32, 0, 0, 16, 104,4, 0, 0, 0, 0, 0, 17, 64, 80, 0, 0, 0, 0, 0, 117,252,62, 0, 0, 0, 0, 0, 4, 4, 10, 0, 0, 0, 0, 0, 132,0, 20, 0, + 0, 0, 0, 0, 133,0, 8, 0, 0, 0, 0, 0, 2, 0, 80, 0, 0, 0, 0, 0, 64, 32, 24, 0, 0, 0, 0, 0, 149,105,4, 1, 0, 0, 0, 0, 10, 8, 7, 1, + 0, 0, 0, 0, 20, 96, 140,0, 0, 0, 0, 0, 149,127,86, 2, 0, 0, 0, 0, 179,221,24, 0, 0, 0, 0, 0, 129,8, 2, 0, 0, 0, 0, 0, 16, 68, 2, 0, + 0, 0, 0, 0, 145,73, 22, 3, 0, 0, 0, 0, 68, 8, 18, 1, 0, 0, 0, 0, 37, 108,4, 0, 0, 0, 8, 0, 8, 0, 4, 0, 0, 0, 0, 0, 49, 53, 14, 0, + 0, 32, 0, 0, 17, 9, 0, 0, 0, 0, 0, 0, 16, 76, 0, 0, 0, 0, 0, 0, 130,41, 2, 2, 0, 0, 0, 0, 145,140,22, 0, 0, 0, 0, 0, 0, 25, 0, 0, + 0, 0, 0, 0, 0, 8, 76, 0, 0, 0, 0, 0, 141,0, 8, 0, 0, 0, 0, 0, 254,63, 60, 2, 0, 0, 0, 0, 129,32, 2, 0, 0, 0, 0, 0, 217,65, 40, 2, + 0, 0, 0, 0, 16, 64, 0, 2, 0, 0, 0, 0, 132,1, 0, 0, 0, 0, 0, 0, 1, 65, 64, 0, 0, 0, 0, 0, 136,0, 4, 1, 0, 0, 0, 0, 145,69, 22, 3, + 0, 0, 0, 0, 1, 40, 8, 1, 0, 32, 0, 0, 17, 73, 0, 1, 0, 232,0, 0, 19, 17, 16, 0, 0, 176,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 96, 8, 2, + 0, 0, 0, 0, 17, 104,20, 0, 0, 32, 0, 0, 16, 5, 0, 0, 0, 32, 0, 0, 64, 184,28, 0, 0, 0, 0, 0, 29, 60, 46, 2, 0, 0, 0, 0, 68, 64, 8, 0, + 0, 0, 0, 0, 0, 49, 30, 0, 0, 32, 0, 0, 145,0, 12, 0, 0, 32, 0, 0, 0, 40, 14, 0, 0, 0, 0, 0, 17, 0, 24, 1, 0, 32, 0, 0, 0, 8, 14, 0, + 0, 0, 0, 0, 215,255,60, 1, 0, 224,4, 0, 148,58, 4, 0, 0, 0, 0, 0, 145,77, 2, 0, 0, 96, 0, 0, 128,40, 14, 0, 0, 0, 0, 0, 1, 4, 16, 0, + 0, 0, 0, 0, 217,69, 20, 0, 0, 32, 0, 0, 4, 0, 14, 0, 0, 96, 0, 0, 1, 8, 14, 2, 0, 32, 0, 0, 4, 32, 4, 0, 0, 32, 6, 0, 0, 40, 12, 0, + 0, 0, 0, 0, 149,68, 12, 0, 0, 0, 0, 0, 1, 33, 12, 2, 0, 240,12, 0, 209,221,126,1, 0, 0, 0, 0, 0, 36, 2, 2, 0, 0, 0, 0, 88, 40, 110,1, + 0, 32, 0, 0, 17, 129,12, 0, 0, 0, 0, 0, 16, 32, 12, 2, 0, 0, 0, 0, 32, 0, 116,0, 0, 0, 0, 0, 2, 80, 8, 0, 0, 0, 0, 0, 0, 176,4, 0, + 0, 32, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 16, 32, 10, 1, 0, 32, 0, 0, 80, 0, 4, 0, 0, 128,0, 0, 0, 40, 14, 0, 0, 0, 0, 0, 132,105,60, 2, + 0, 0, 0, 0, 41, 0, 8, 0, 0, 0, 2, 0, 16, 0, 4, 0, 0, 0, 0, 0, 10, 32, 4, 0, 0, 0, 0, 0, 16, 32, 14, 2, 0, 0, 0, 0, 2, 164,2, 2, + 0, 0, 0, 0, 24, 104,10, 0, 0, 0, 0, 0, 64, 32, 73, 0, 0, 0, 0, 0, 159,77, 24, 2, 0, 0, 0, 0, 4, 40, 192,0, 0, 0, 0, 0, 80, 13, 8, 0, + 0, 0, 0, 0, 51, 24, 0, 1, 0, 0, 0, 0, 4, 28, 0, 0, 0, 0, 0, 0, 68, 44, 0, 0, 0, 0, 0, 0, 145,105,28, 3, 0, 0, 0, 0, 85, 58, 22, 0, + 0, 114,12, 0, 221,69, 20, 3, 0, 0, 0, 0, 1, 12, 140,2, 0, 32, 0, 0, 16, 0, 5, 2, 0, 0, 0, 0, 0, 32, 86, 0, 0, 32, 0, 0, 0, 48, 6, 0, + 0, 0, 0, 0, 24, 64, 4, 0, 0, 0, 0, 0, 100,56, 12, 1, 0, 0, 0, 0, 133,7, 4, 1, 0, 0, 0, 0, 25, 1, 2, 0, 0, 32, 4, 0, 147,222,38, 0, + 0, 0, 0, 0, 64, 168,0, 0, 16, 0, 0, 0, 223,79, 63, 3, 0, 0, 0, 0, 141,125,14, 1, 0, 0, 0, 0, 17, 21, 0, 0, 0, 0, 0, 0, 32, 44, 2, 1, + 0, 0, 1, 0, 147,229,16, 0, 0, 96, 0, 0, 6, 28, 64, 0, 0, 0, 0, 0, 8, 36, 2, 0, 0, 0, 0, 0, 149,40, 0, 0, 0, 0, 0, 0, 69, 65, 8, 0, + 0, 0, 0, 0, 0, 32, 100,0, 0, 0, 0, 0, 4, 112,58, 0, 0, 68, 0, 0, 17, 89, 16, 1, 0, 0, 0, 0, 76, 160,71, 1, 0, 0, 0, 0, 24, 65, 8, 0, + 0, 0, 0, 0, 24, 41, 30, 1, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 53, 56, 32, 0, 0, 240,47, 0, 55, 221,76, 1, 0, 32, 0, 0, 128,64, 0, 0, + 0, 0, 0, 0, 70, 185,0, 0, 0, 0, 0, 0, 12, 168,2, 1, 0, 0, 0, 0, 149,125,62, 3, 0, 0, 0, 0, 207,189,110,1, 0, 0, 0, 0, 17, 0, 16, 2, + 0, 0, 0, 0, 26, 153,16, 0, 0, 0, 0, 0, 24, 123,22, 1, 0, 0, 0, 0, 0, 57, 86, 1, 0, 0, 0, 0, 85, 42, 4, 0, 0, 0, 0, 0, 0, 2, 4, 1, + 0, 0, 0, 0, 5, 24, 132,0, 0, 240,44, 0, 0, 0, 128,0, 0, 0, 0, 0, 16, 68, 16, 1, 0, 0, 0, 0, 154,117,22, 3, 0, 112,0, 0, 145,93, 22, 1, + 0, 0, 0, 0, 8, 109,86, 1, 0, 0, 0, 0, 145,32, 4, 0, 0, 32, 0, 0, 16, 1, 68, 1, 0, 240,63, 0, 8, 2, 4, 0, 0, 0, 0, 0, 17, 2, 4, 0, + 0, 0, 0, 0, 21, 120,132,0, 0, 0, 0, 0, 4, 96, 132,0, 0, 0, 0, 0, 4, 12, 14, 0, 0, 0, 0, 0, 0, 4, 68, 0, 0, 0, 0, 0, 126,189,46, 2, + 0, 0, 0, 0, 25, 9, 108,0, 0, 0, 0, 0, 89, 0, 4, 0, 0, 0, 0, 0, 4, 1, 4, 0, 0, 0, 0, 0, 16, 128,14, 1, 0, 0, 0, 0, 20, 32, 8, 2, + 0, 0, 0, 0, 146,65, 12, 0, 0, 0, 0, 0, 144,97, 8, 2, 0, 0, 0, 0, 17, 73, 6, 0, 0, 0, 0, 0, 128,4, 6, 1, 0, 240,14, 0, 191,209,204,0, + 0, 0, 0, 0, 8, 40, 0, 1, 0, 0, 0, 0, 16, 56, 4, 0, 0, 32, 0, 0, 17, 69, 20, 0, 0, 0, 0, 0, 1, 40, 4, 2, 0, 0, 0, 0, 1, 1, 144,0, + 16, 8, 0, 0, 191,249,126,2, 0, 0, 0, 0, 64, 44, 2, 0, 0, 0, 0, 0, 9, 32, 30, 0, 0, 0, 0, 0, 0, 44, 26, 0, 0, 0, 0, 0, 69, 0, 4, 0, + 0, 64, 0, 0, 144,64, 32, 0, 0, 0, 0, 0, 153,65, 18, 3, 0, 0, 0, 0, 160,32, 10, 0, 0, 160,4, 0, 0, 16, 2, 0, 0, 0, 0, 0, 0, 136,6, 1, + 0, 0, 0, 0, 17, 100,1, 0, 0, 0, 0, 0, 0, 32, 98, 0, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 20, 80, 2, 0, 0, 0, 0, 0, 36, 32, 66, 0, + 0, 0, 0, 0, 0, 73, 10, 0, 0, 8, 0, 0, 27, 101,88, 0, 0, 0, 4, 0, 255,255,127,2, 0, 0, 0, 0, 42, 56, 62, 0, 0, 0, 0, 0, 145,217,32, 0, + 0, 0, 0, 0, 16, 0, 164,0, 0, 0, 0, 0, 25, 33, 16, 0, 0, 0, 0, 0, 235,57, 94, 1, 0, 0, 0, 0, 144,0, 16, 0, 0, 0, 0, 0, 17, 217,32, 0, + 0, 0, 0, 0, 19, 145,0, 1, 0, 0, 0, 0, 28, 40, 12, 0, 0, 0, 0, 0, 88, 40, 46, 1, 0, 0, 0, 0, 145,33, 8, 1, 0, 0, 0, 0, 32, 57, 62, 1, + 0, 0, 0, 0, 25, 33, 8, 1, 0, 0, 0, 0, 17, 120,38, 0, 0, 0, 0, 0, 9, 97, 8, 0, 0, 0, 0, 0, 24, 0, 22, 1, 0, 0, 0, 0, 65, 249,126,1, + 0, 0, 0, 0, 80, 152,0, 0, 0, 0, 0, 0, 3, 17, 4, 0, 0, 0, 0, 0, 5, 101,32, 0, 0, 0, 0, 0, 192,0, 24, 0, 0, 0, 0, 0, 24, 53, 42, 1, + 0, 0, 0, 0, 30, 37, 106,1, 0, 0, 0, 0, 25, 9, 0, 0, 0, 0, 0, 0, 130,32, 6, 1, 0, 0, 0, 0, 19, 57, 14, 0, 0, 0, 0, 0, 192,32, 2, 0, + 0, 0, 0, 0, 196,48, 18, 0, 0, 0, 0, 0, 24, 9, 10, 0, 0, 0, 0, 0, 8, 41, 34, 1, 0, 0, 0, 0, 1, 0, 98, 0, 0, 0, 0, 0, 1, 8, 32, 0, + 0, 0, 0, 0, 16, 40, 82, 0, 0, 0, 0, 0, 1, 41, 114,0, 0, 0, 0, 0, 168,152,98, 1, 0, 0, 0, 0, 25, 33, 10, 0, 0, 0, 0, 0, 8, 40, 26, 0, + 0, 0, 0, 0, 145,73, 82, 0, 0, 0, 0, 0, 160,40, 122,0, 0, 0, 0, 0, 16, 1, 42, 1, 0, 0, 0, 0, 145,64, 72, 0, 0, 0, 0, 0, 128,32, 32, 0, + 0, 0, 0, 0, 2, 40, 34, 0, 0, 0, 0, 0, 2, 8, 40, 0, 0, 0, 0, 0, 8, 16, 92, 0, 0, 0, 0, 0, 132,33, 78, 0, 0, 0, 0, 0, 176,104,114,0, + 0, 0, 0, 0, 40, 161,72, 1, 0, 0, 0, 0, 17, 96, 8, 0, 0, 0, 0, 0, 81, 0, 96, 0, 0, 0, 0, 0, 65, 32, 10, 0, 0, 0, 0, 0, 116,33, 2, 1, + 0, 0, 0, 0, 16, 12, 8, 0, 0, 0, 0, 0, 48, 40, 110,0, 0, 0, 0, 0, 128,8, 106,0, 0, 0, 0, 0, 25, 32, 42, 0, 0, 0, 0, 0, 192,57, 20, 1, + 0, 0, 0, 0, 21, 121,110,1, 0, 0, 0, 0, 192,56, 36, 0, 0, 0, 0, 0, 8, 41, 14, 2, 0, 0, 0, 0, 17, 65, 0, 3, 0, 0, 0, 0, 26, 56, 46, 0, + 0, 0, 0, 0, 1, 96, 84, 1, 0, 0, 0, 0, 116,49, 122,1, 0, 0, 0, 0, 17, 121,6, 0, 0, 0, 0, 0, 148,0, 2, 0, 0, 0, 0, 0, 132,37, 14, 0, + 0, 0, 0, 0, 8, 128,10, 0, 0, 0, 0, 0, 2, 57, 26, 1, 0, 0, 0, 0, 49, 25, 110,0, 0, 0, 0, 0, 116,32, 12, 0, 0, 0, 0, 0, 192,8, 10, 0, + 0, 0, 0, 0, 0, 48, 64, 1, 0, 0, 0, 0, 0, 33, 26, 0, 0, 0, 0, 0, 72, 1, 2, 1, 0, 0, 0, 0, 72, 40, 14, 0, 0, 0, 0, 0, 16, 32, 42, 1, + 0, 0, 0, 0, 25, 32, 0, 1, 0, 0, 0, 0, 64, 8, 8, 0, 0, 0, 0, 0, 2, 0, 2, 1, 0, 0, 0, 0, 128,192,72, 0, 0, 0, 0, 0, 64, 0, 34, 0, + 0, 0, 0, 0, 8, 9, 10, 1, 0, 64, 0, 0, 64, 113,128,0, 0, 0, 0, 0, 65, 96, 4, 0, 16, 96, 0, 0, 255,255,254,3, 0, 0, 0, 0, 206,44, 30, 2, + 0, 0, 0, 0, 16, 64, 36, 0, 0, 0, 0, 0, 6, 8, 4, 0, 0, 0, 0, 0, 145,0, 2, 0, 0, 0, 0, 0, 24, 97, 76, 1, 0, 0, 0, 0, 144,72, 16, 0, + 0, 0, 0, 0, 130,152,68, 1, 0, 0, 0, 0, 133,69, 16, 3, 0, 0, 4, 0, 17, 9, 12, 0, 0, 0, 0, 0, 191,121,126,0, 0, 0, 0, 0, 0, 45, 70, 0, + 0, 0, 0, 0, 5, 25, 38, 2, 0, 0, 0, 0, 23, 120,56, 0, 0, 32, 0, 0, 22, 40, 76, 0, 0, 8, 0, 0, 0, 64, 4, 0, 0, 32, 0, 0, 129,69, 20, 0, + 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 4, 40, 16, 0, 0, 0, 0, 0, 17, 0, 0, 2, 0, 0, 0, 0, 36, 0, 102,2, 0, 0, 0, 0, 0, 40, 6, 2, + 0, 0, 0, 0, 220,60, 30, 0, 0, 0, 0, 0, 9, 68, 20, 0, 0, 0, 0, 0, 144,4, 8, 0, 0, 0, 0, 0, 16, 81, 4, 2, 0, 0, 0, 0, 209,105,22, 0, + 0, 0, 0, 0, 174,184,78, 0, 0, 0, 0, 0, 8, 144,4, 0, 0, 96, 8, 0, 16, 0, 12, 0, 0, 0, 0, 0, 9, 40, 32, 0, 0, 0, 0, 0, 130,0, 64, 0, + 0, 0, 0, 0, 27, 121,14, 0, 0, 0, 0, 0, 152,17, 0, 0, 0, 0, 0, 0, 220,110,142,0, 0, 0, 0, 0, 154,5, 12, 2, 0, 0, 0, 0, 20, 41, 12, 0, + 0, 32, 0, 0, 255,125,63, 3, 0, 0, 0, 0, 136,61, 30, 1, 0, 0, 0, 0, 92, 65, 4, 1, 0, 0, 0, 0, 21, 100,6, 1, 0, 0, 0, 0, 29, 44, 28, 0, + 0, 0, 0, 0, 89, 64, 0, 0, 0, 224,12, 0, 0, 32, 4, 0, 0, 0, 0, 0, 83, 65, 4, 1, 0, 0, 0, 0, 72, 32, 6, 0, 0, 0, 0, 0, 4, 52, 10, 1, + 0, 0, 0, 0, 52, 32, 12, 0, 0, 32, 0, 0, 0, 48, 78, 1, 0, 0, 0, 0, 13, 48, 12, 1, 0, 0, 0, 0, 53, 64, 0, 0, 0, 32, 0, 0, 16, 1, 4, 1, + 0, 0, 0, 0, 144,64, 8, 0, 0, 0, 0, 0, 24, 65, 68, 2, 0, 0, 0, 0, 65, 32, 4, 0, 0, 32, 4, 0, 1, 0, 4, 0, 0, 0, 0, 0, 18, 248,4, 1, + 0, 0, 0, 0, 0, 41, 6, 0, 16, 0, 0, 0, 221,111,156,2, 0, 0, 0, 0, 196,165,6, 0, 0, 0, 0, 0, 144,13, 0, 1, 0, 0, 0, 0, 144,73, 6, 1, + 0, 0, 0, 0, 23, 232,36, 2, 0, 0, 0, 0, 4, 40, 12, 2, 0, 0, 0, 0, 57, 56, 28, 2, 0, 0, 0, 0, 145,9, 68, 0, 0, 0, 0, 0, 49, 40, 12, 0, + 0, 0, 0, 0, 208,32, 0, 0, 0, 0, 0, 0, 0, 184,26, 0, 0, 0, 0, 0, 149,65, 88, 0, 0, 0, 0, 0, 209,101,16, 2, 0, 0, 0, 0, 156,0, 4, 0, + 0, 0, 0, 0, 32, 40, 64, 0, 0, 0, 0, 0, 128,168,12, 3, 0, 0, 0, 0, 145,69, 16, 1, 0, 0, 0, 0, 49, 12, 0, 0, 0, 0, 0, 0, 15, 104,108,0, + 0, 0, 0, 0, 16, 73, 92, 0, 0, 32, 0, 0, 17, 65, 0, 1, 0, 0, 0, 0, 1, 32, 12, 0, 0, 112,44, 0, 64, 65, 0, 0, 0, 0, 0, 0, 24, 56, 96, 0, + 0, 0, 0, 0, 18, 65, 0, 1, 0, 0, 0, 0, 245,120,72, 0, 0, 0, 0, 0, 149,81, 0, 0, 0, 0, 0, 0, 11, 32, 2, 1, 0, 0, 0, 0, 145,65, 0, 2, + 0, 0, 0, 0, 3, 9, 0, 0, 0, 0, 0, 0, 157,253,31, 2, 0, 0, 0, 0, 0, 16, 1, 0, 0, 0, 0, 0, 81, 1, 16, 1, 0, 0, 0, 0, 8, 8, 68, 0, + 0, 0, 0, 0, 13, 104,8, 0, 0, 0, 0, 0, 137,168,14, 2, 0, 0, 0, 0, 17, 121,2, 1, 0, 32, 0, 0, 21, 32, 0, 0, 0, 0, 0, 0, 8, 32, 4, 1, + 0, 64, 0, 0, 245,73, 30, 2, 0, 0, 0, 0, 142,185,142,1, 0, 32, 4, 0, 196,25, 84, 0, 0, 0, 0, 0, 24, 104,34, 0, 0, 0, 0, 0, 17, 65, 48, 1, + 0, 0, 0, 0, 8, 0, 140,0, 0, 32, 8, 0, 16, 81, 4, 0, 0, 0, 0, 0, 17, 128,8, 0, 0, 0, 0, 0, 21, 40, 36, 0, 0, 0, 0, 0, 128,64, 140,1, + 0, 96, 0, 0, 10, 189,6, 0, 0, 32, 20, 0, 0, 4, 0, 0, 0, 0, 0, 0, 80, 45, 0, 0, 0, 0, 0, 0, 13, 40, 6, 0, 0, 0, 0, 0, 19, 0, 12, 0, + 0, 32, 0, 0, 1, 64, 20, 0, 0, 0, 0, 0, 25, 40, 6, 0, 0, 0, 0, 0, 130,89, 4, 0, 0, 0, 0, 0, 17, 65, 1, 3, 0, 72, 0, 0, 0, 80, 16, 0, + 0, 8, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 80, 4, 2, 0, 0, 0, 0, 129,112,12, 2, 0, 0, 0, 0, 8, 64, 64, 0, 0, 0, 0, 0, 149,92, 30, 0, + 0, 0, 0, 0, 144,8, 6, 0, 0, 0, 0, 0, 16, 41, 50, 0, 0, 240,63, 0, 31, 155,12, 0, 0, 32, 0, 0, 21, 69, 4, 0, 0, 0, 0, 0, 4, 36, 4, 0, + 0, 32, 0, 0, 49, 89, 4, 0, 0, 32, 0, 0, 16, 65, 0, 0, 0, 0, 0, 0, 80, 108,10, 0, 0, 0, 8, 0, 17, 73, 20, 1, 0, 112,12, 0, 0, 16, 4, 0, + 0, 0, 0, 0, 2, 0, 6, 1, 0, 32, 0, 0, 247,252,78, 0, 0, 0, 0, 0, 128,72, 2, 0, 0, 0, 0, 0, 8, 48, 4, 0, 0, 0, 0, 0, 29, 64, 8, 1, + 0, 0, 0, 0, 255,237,126,1, 0, 10, 0, 0, 34, 20, 76, 0, 0, 0, 0, 0, 18, 0, 64, 0, 0, 0, 0, 0, 144,65, 24, 0, 0, 0, 0, 0, 144,66, 0, 0, + 0, 0, 0, 0, 141,44, 14, 0, 0, 0, 0, 0, 0, 36, 0, 1, 0, 0, 0, 0, 20, 100,4, 0, 0, 0, 0, 0, 25, 96, 4, 2, 0, 0, 0, 0, 148,32, 4, 2, + 0, 0, 0, 0, 32, 0, 20, 0, 0, 0, 0, 0, 201,40, 22, 0, 16, 0, 0, 0, 1, 33, 0, 1, 0, 0, 0, 0, 17, 89, 2, 0, 0, 0, 0, 0, 16, 11, 10, 0, + 0, 0, 0, 0, 21, 5, 0, 1, 0, 0, 0, 0, 5, 68, 0, 0, 0, 0, 0, 0, 0, 4, 34, 0, 0, 0, 0, 0, 145,77, 50, 0, 0, 16, 0, 0, 24, 48, 68, 1, + 0, 240,45, 0, 152,10, 6, 3, 0, 240,48, 0, 0, 0, 0, 0, 0, 96, 0, 0, 66, 0, 4, 0, 0, 0, 0, 0, 0, 8, 108,1, 0, 0, 0, 0, 255,253,95, 2, + 0, 0, 0, 0, 72, 52, 6, 2, 0, 32, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 17, 88, 18, 0, 0, 0, 0, 0, 157,172,78, 1, 0, 32, 0, 0, 8, 4, 8, 0, + 0, 0, 0, 0, 0, 1, 24, 0, 0, 0, 0, 0, 23, 104,28, 0, 0, 0, 0, 0, 16, 8, 4, 2, 0, 0, 0, 0, 27, 81, 100,1, 0, 0, 0, 0, 243,113,110,1, + 0, 0, 0, 0, 64, 49, 18, 1, 0, 0, 0, 0, 9, 32, 14, 1, 0, 240,0, 0, 10, 8, 14, 0, 0, 0, 0, 0, 85, 244,6, 0, 0, 32, 0, 0, 17, 0, 12, 0, + 0, 0, 0, 0, 0, 32, 74, 1, 0, 0, 0, 0, 1, 192,8, 0, 0, 32, 0, 0, 0, 32, 46, 0, 0, 0, 0, 0, 20, 8, 0, 2, 0, 0, 0, 0, 16, 96, 0, 2, + 0, 0, 0, 0, 19, 113,20, 0, 0, 0, 0, 0, 0, 20, 2, 0, 0, 0, 32, 0, 4, 32, 4, 0, 0, 0, 0, 0, 255,103,190,3, 0, 0, 0, 0, 135,62, 14, 1, + 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 0, 0, 144,4, 0, 1, 0, 0, 0, 0, 8, 16, 2, 1, 0, 0, 0, 0, 121,73, 68, 1, 0, 96, 4, 0, 173,73, 78, 1, + 0, 0, 0, 0, 128,0, 18, 0, 0, 0, 0, 0, 4, 64, 2, 0, 0, 0, 0, 0, 9, 65, 44, 1, 0, 0, 0, 0, 144,73, 22, 2, 0, 32, 0, 0, 255,112,180,0, + 0, 0, 0, 0, 128,76, 16, 0, 0, 0, 0, 0, 148,4, 12, 0, 0, 0, 0, 0, 145,73, 4, 0, 0, 0, 0, 0, 129,24, 78, 1, 0, 0, 0, 0, 52, 32, 140,0, + 0, 96, 0, 0, 33, 0, 2, 0, 0, 0, 0, 0, 69, 40, 30, 2, 0, 0, 0, 0, 4, 1, 20, 0, 0, 0, 0, 0, 128,68, 8, 0, 0, 0, 0, 0, 17, 69, 22, 3, + 0, 0, 0, 0, 24, 32, 2, 1, 0, 0, 0, 0, 84, 1, 12, 0, 0, 0, 0, 0, 12, 40, 12, 0, 0, 0, 0, 0, 23, 255,126,2, 0, 0, 0, 0, 110,123,38, 0, + 0, 0, 0, 0, 8, 9, 4, 1, 0, 0, 0, 0, 21, 48, 4, 0, 0, 0, 0, 0, 8, 252,76, 0, 0, 0, 0, 0, 17, 109,0, 0, 0, 0, 0, 0, 16, 48, 32, 0, + 0, 0, 0, 0, 21, 9, 0, 1, 0, 0, 32, 0, 0, 0, 4, 0, 0, 0, 0, 0, 17, 125,18, 0, 0, 32, 0, 0, 0, 160,66, 0, 0, 0, 0, 0, 25, 100,0, 0, + 0, 32, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 1, 136,0, 0, 0, 4, 0, 0, 145,205,24, 1, 0, 0, 0, 0, 16, 104,4, 0, 0, 96, 0, 0, 8, 64, 4, 0, + 0, 0, 0, 0, 17, 73, 22, 1, 0, 64, 0, 0, 0, 17, 0, 1, 0, 96, 0, 0, 12, 0, 4, 0, 0, 0, 0, 0, 181,117,14, 2, 0, 32, 0, 0, 17, 9, 16, 0, + 0, 0, 0, 0, 21, 1, 18, 0, 0, 0, 0, 0, 68, 0, 12, 0, 0, 0, 0, 0, 0, 144,32, 0, 0, 0, 0, 0, 13, 64, 16, 0, 0, 0, 0, 0, 26, 69, 2, 0, + 0, 0, 0, 0, 21, 89, 4, 1, 0, 0, 0, 0, 16, 33, 32, 0, 0, 0, 0, 0, 25, 81, 28, 0, 0, 0, 0, 0, 1, 64, 48, 0, 0, 0, 0, 0, 192,116,14, 2, + 0, 0, 0, 0, 17, 97, 82, 2, 0, 0, 0, 0, 128,36, 8, 0, 0, 96, 0, 0, 130,64, 16, 0, 0, 0, 0, 0, 1, 67, 32, 0, 0, 96, 0, 0, 133,212,128,0, + 0, 0, 4, 0, 0, 48, 0, 0, 0, 0, 0, 0, 146,8, 0, 0, 16, 0, 2, 0, 255,255,255,3, 0, 0, 0, 0, 74, 45, 8, 1, 0, 0, 0, 0, 18, 73, 20, 1, + 0, 32, 0, 0, 17, 1, 0, 0, 0, 0, 0, 0, 1, 64, 12, 2, 0, 0, 0, 0, 149,4, 8, 2, 0, 0, 0, 0, 217,73, 22, 3, 0, 0, 0, 0, 40, 40, 0, 0, + 0, 32, 0, 0, 16, 73, 4, 0, 0, 0, 0, 0, 1, 96, 12, 0, 0, 0, 0, 0, 17, 17, 8, 0, 0, 0, 0, 0, 17, 72, 0, 1, 16, 0, 0, 0, 100,32, 5, 0, + 0, 0, 0, 0, 142,56, 62, 0, 0, 0, 0, 0, 2, 20, 4, 0, 0, 0, 4, 0, 48, 73, 0, 0, 0, 0, 0, 0, 209,73, 82, 0, 0, 0, 0, 0, 8, 48, 32, 0, + 0, 0, 0, 0, 25, 121,22, 1, 0, 0, 0, 0, 6, 185,114,0, 0, 0, 0, 0, 65, 8, 2, 0, 0, 0, 0, 0, 4, 32, 24, 0, 0, 0, 0, 0, 19, 25, 0, 0, + 0, 0, 0, 0, 16, 60, 14, 0, 0, 0, 0, 0, 1, 65, 0, 2, 0, 0, 4, 0, 0, 18, 0, 0, 0, 0, 0, 0, 131,201,6, 0, 0, 0, 0, 0, 125,237,28, 3, + 0, 0, 0, 0, 4, 33, 38, 0, 0, 0, 0, 0, 132,52, 14, 1, 0, 0, 0, 0, 16, 4, 72, 0, 0, 0, 0, 0, 81, 65, 4, 0, 0, 0, 0, 0, 8, 52, 30, 1, + 0, 96, 0, 0, 14, 16, 4, 0, 0, 0, 0, 0, 12, 36, 8, 0, 0, 0, 0, 0, 1, 68, 8, 0, 0, 0, 0, 0, 16, 69, 2, 2, 16, 32, 1, 0, 31, 209,4, 0, + 0, 32, 0, 0, 0, 32, 0, 1, 0, 0, 0, 0, 253,119,62, 2, 0, 0, 0, 0, 220,24, 30, 0, 0, 0, 0, 0, 28, 64, 3, 0, 0, 0, 0, 0, 145,13, 26, 0, + 0, 0, 0, 0, 16, 64, 32, 0, 0, 0, 0, 0, 17, 73, 14, 1, 0, 0, 0, 0, 8, 9, 0, 1, 0, 0, 0, 0, 0, 106,4, 0, 0, 0, 0, 0, 0, 36, 50, 2, + 0, 0, 0, 0, 73, 8, 12, 1, 0, 32, 0, 0, 1, 1, 8, 0, 0, 240,63, 0, 130,144,4, 1, 0, 32, 0, 0, 17, 69, 18, 0, 0, 0, 0, 0, 1, 72, 6, 0, + 0, 32, 0, 0, 0, 120,2, 0, 0, 0, 0, 0, 85, 100,13, 2, 0, 128,0, 0, 177,89, 12, 0, 0, 240,47, 0, 2, 16, 4, 0, 0, 0, 0, 0, 221,249,142,2, + 0, 0, 0, 0, 129,72, 16, 1, 0, 0, 0, 0, 128,64, 2, 1, 0, 0, 0, 0, 16, 1, 96, 1, 0, 0, 0, 0, 17, 85, 10, 0, 0, 0, 0, 0, 80, 32, 2, 1, + 0, 0, 0, 0, 80, 0, 32, 0, 0, 96, 40, 0, 0, 0, 4, 0, 0, 0, 0, 0, 247,243,62, 3, 0, 0, 0, 0, 70, 41, 53, 3, 0, 0, 0, 0, 66, 0, 56, 0, + 0, 0, 0, 0, 25, 64, 24, 1, 0, 96, 0, 0, 0, 0, 2, 0, 0, 32, 0, 0, 119,187,54, 3, 0, 0, 0, 0, 9, 129,5, 0, 0, 0, 0, 0, 84, 10, 4, 0, + 0, 0, 0, 0, 64, 96, 26, 1, 0, 0, 0, 0, 0, 0, 2, 3, 0, 32, 0, 0, 94, 252,14, 0, 0, 0, 1, 0, 17, 65, 0, 0, 0, 32, 4, 0, 90, 153,86, 0, + 0, 0, 0, 0, 245,153,12, 0, 0, 32, 0, 0, 169,8, 6, 0, 0, 0, 0, 0, 19, 17, 0, 0, 0, 96, 12, 0, 128,146,6, 1, 0, 0, 0, 0, 144,1, 6, 3, + 0, 0, 0, 0, 17, 129,12, 0, 0, 32, 1, 0, 0, 16, 4, 0, 0, 0, 0, 64, 127,253,127,1, 0, 0, 0, 0, 94, 45, 110,3, 0, 0, 0, 0, 88, 64, 40, 0, + 0, 0, 0, 0, 129,64, 24, 0, 0, 0, 0, 0, 136,0, 16, 0, 0, 0, 0, 0, 132,40, 0, 0, 16, 0, 0, 0, 191,123,14, 1, 0, 0, 0, 0, 5, 64, 8, 2, + 0, 0, 0, 0, 150,1, 0, 0, 0, 0, 0, 0, 8, 33, 4, 0, 0, 112,0, 0, 57, 64, 12, 0, 0, 0, 0, 0, 23, 124,76, 1, 0, 0, 0, 0, 80, 65, 32, 0, + 0, 0, 0, 0, 148,68, 4, 0, 0, 0, 0, 0, 14, 40, 76, 2, 0, 0, 0, 0, 80, 65, 12, 0, 0, 0, 0, 0, 8, 16, 88, 0, 0, 0, 0, 0, 1, 40, 2, 1, + 0, 32, 0, 0, 144,64, 46, 0, 0, 0, 0, 0, 146,65, 4, 0, 0, 0, 0, 0, 209,89, 20, 1, 0, 0, 0, 0, 0, 13, 4, 0, 0, 0, 0, 0, 0, 56, 2, 2, + 0, 0, 0, 0, 52, 48, 4, 0, 0, 0, 0, 0, 255,221,29, 2, 0, 0, 0, 0, 0, 5, 4, 0, 0, 0, 0, 0, 17, 0, 18, 1, 0, 0, 0, 0, 129,65, 2, 0, + 0, 0, 0, 0, 32, 32, 100,0, 0, 0, 0, 0, 2, 56, 6, 1, 0, 0, 0, 0, 1, 64, 96, 0, 0, 0, 0, 0, 0, 128,100,0, 0, 0, 16, 0, 19, 89, 0, 1, + 0, 0, 0, 0, 17, 73, 66, 1, 0, 0, 0, 0, 40, 0, 2, 0, 0, 0, 0, 0, 153,73, 28, 3, 0, 0, 0, 0, 70, 24, 2, 1, 0, 0, 0, 0, 19, 0, 6, 0, + 0, 96, 0, 0, 162,9, 68, 0, 0, 0, 0, 0, 33, 72, 32, 0, 0, 64, 0, 0, 68, 60, 194,0, 0, 0, 0, 0, 150,81, 70, 0, 0, 0, 0, 0, 13, 40, 110,2, + 0, 0, 0, 0, 153,65, 8, 0, 0, 0, 0, 0, 76, 5, 12, 0, 0, 0, 0, 0, 55, 3, 4, 0, 0, 0, 0, 0, 16, 64, 12, 0, 0, 0, 0, 0, 17, 33, 0, 1, + 0, 0, 0, 0, 21, 9, 12, 1, 0, 96, 0, 0, 0, 152,46, 1, 0, 0, 0, 0, 48, 129,68, 1, 0, 0, 0, 0, 9, 80, 6, 0, 0, 0, 0, 0, 16, 48, 20, 0, + 0, 32, 0, 0, 66, 16, 12, 0, 0, 0, 0, 0, 91, 41, 10, 0, 0, 0, 0, 0, 144,105,0, 0, 0, 0, 0, 0, 25, 104,4, 0, 0, 0, 0, 0, 89, 105,0, 2, + 0, 128,16, 0, 145,72, 22, 0, 0, 4, 0, 0, 231,255,124,0, 0, 0, 0, 0, 68, 128,80, 2, 0, 0, 0, 0, 4, 0, 72, 2, 0, 4, 0, 0, 1, 148,0, 0, + 0, 4, 4, 0, 76, 225,58, 0, 0, 128,0, 0, 0, 1, 4, 0, 0, 0, 8, 0, 200,96, 102,1, 16, 0, 0, 0, 255,255,126,3, 0, 0, 0, 0, 8, 48, 66, 1, + 0, 0, 0, 0, 148,68, 20, 2, 0, 0, 0, 0, 16, 9, 2, 0, 0, 0, 0, 0, 255,145,38, 0, 0, 0, 0, 0, 25, 73, 0, 1, 0, 0, 0, 0, 197,40, 14, 0, + 0, 0, 0, 0, 4, 4, 0, 2, 0, 0, 0, 0, 37, 0, 8, 0, 0, 0, 0, 0, 241,41, 86, 0, 0, 0, 0, 0, 1, 40, 14, 0, 0, 0, 0, 0, 0, 18, 2, 0, + 0, 0, 0, 0, 154,0, 4, 0, 0, 0, 0, 0, 153,5, 24, 0, 0, 0, 0, 0, 255,109,107,2, 0, 0, 0, 0, 24, 32, 10, 0, 0, 0, 0, 0, 11, 33, 4, 0, + 0, 0, 0, 0, 68, 100,4, 0, 0, 0, 0, 0, 1, 0, 130,0, 0, 0, 0, 0, 62, 188,46, 0, 0, 0, 0, 0, 145,64, 20, 0, 0, 0, 0, 0, 1, 72, 18, 0, + 0, 0, 0, 0, 4, 0, 8, 1, 0, 0, 0, 0, 129,0, 18, 0, 0, 0, 0, 0, 43, 144,12, 0, 0, 0, 0, 0, 253,109,30, 3, 0, 0, 0, 0, 32, 0, 2, 2, + 0, 0, 0, 0, 144,5, 2, 1, 0, 0, 0, 0, 17, 117,64, 1, 0, 0, 0, 0, 145,65, 92, 3, 0, 0, 0, 0, 128,32, 0, 1, 0, 0, 0, 0, 4, 0, 10, 3, + 0, 0, 0, 0, 20, 96, 46, 2, 0, 0, 0, 0, 16, 40, 0, 1, 0, 0, 0, 0, 144,3, 0, 2, 0, 0, 0, 0, 125,253,94, 2, 0, 0, 0, 0, 12, 125,110,1, + 0, 0, 0, 0, 32, 1, 2, 0, 0, 0, 0, 0, 28, 40, 0, 0, 0, 32, 0, 0, 16, 0, 2, 1, 0, 48, 0, 0, 8, 0, 4, 0, 0, 0, 0, 0, 129,65, 0, 1, + 0, 0, 0, 0, 64, 0, 16, 2, 0, 0, 0, 0, 213,109,93, 2, 0, 0, 0, 0, 64, 8, 40, 0, 0, 0, 0, 0, 24, 88, 60, 0, 0, 0, 0, 0, 17, 5, 26, 1, + 0, 0, 0, 0, 85, 44, 9, 0, 0, 104,2, 0, 131,125,4, 0, 0, 0, 0, 0, 17, 65, 26, 0, 0, 0, 0, 0, 16, 0, 14, 0, 0, 0, 0, 0, 64, 132,0, 0, + 16, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 145,88, 0, 0, 0, 0, 0, 0, 2, 24, 68, 0, 16, 0, 0, 0, 25, 97, 0, 1, 0, 0, 0, 0, 36, 161,2, 0, + 0, 240,63, 0, 64, 0, 4, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149,105,28, 3, 0, 0, 0, 0, 66, 32, 74, 0, 0, 0, 0, 0, 17, 9, 16, 0, + 0, 64, 0, 0, 17, 72, 0, 1, 0, 0, 0, 0, 2, 64, 6, 0, 0, 0, 0, 0, 36, 4, 0, 0, 0, 0, 0, 0, 1, 160,0, 0, 0, 8, 0, 0, 0, 128,8, 0, + 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 128,37, 0, 1, 0, 192,0, 64, 255,255,222,0, 0, 0, 0, 0, 6, 136,2, 0, 0, 0, 0, 0, 0, 88, 6, 0, + 0, 0, 0, 0, 0, 48, 16, 0, 0, 0, 0, 0, 128,73, 0, 0, 0, 0, 0, 0, 8, 132,2, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 145,32, 24, 1, + 0, 0, 0, 0, 29, 121,26, 0, 0, 0, 0, 0, 21, 0, 4, 0, 0, 0, 0, 0, 145,201,9, 2, 0, 0, 0, 0, 2, 48, 64, 0, 0, 0, 0, 0, 36, 4, 1, 0, + 0, 0, 0, 0, 128,1, 26, 1, 0, 0, 0, 0, 2, 65, 4, 0, 16, 116,56, 0, 255,255,255,3, 0, 0, 0, 0, 24, 32, 12, 1, 0, 0, 0, 0, 0, 67, 0, 0, + 0, 0, 0, 0, 12, 6, 96, 1, 0, 0, 0, 0, 134,56, 6, 0, 0, 0, 0, 0, 151,73, 18, 2, 0, 0, 0, 0, 0, 100,18, 2, 0, 0, 0, 0, 149,109,2, 1, + 0, 0, 0, 0, 3, 80, 10, 0, 128,0, 0, 0, 153,235,22, 1, 0, 0, 0, 0, 81, 42, 2, 2, 0, 0, 0, 0, 17, 56, 2, 1, 128,0, 0, 0, 128,0, 0, 0, + 0, 0, 0, 0, 244,0, 36, 0, 0, 0, 0, 0, 49, 0, 8, 2, 0, 0, 0, 0, 81, 201,30, 1, 0, 0, 0, 0, 0, 249,30, 0, 0, 0, 0, 0, 1, 3, 0, 0, + 0, 0, 0, 0, 0, 104,6, 0, 0, 0, 0, 0, 1, 17, 2, 0, 0, 0, 0, 0, 153,25, 26, 1, 0, 0, 0, 0, 43, 188,46, 0, 0, 0, 0, 0, 9, 96, 4, 0, + 0, 0, 0, 0, 25, 19, 2, 0, 0, 0, 0, 0, 145,77, 28, 0, 0, 0, 0, 0, 201,115,12, 1, 0, 0, 0, 0, 4, 73, 0, 0, 0, 0, 0, 0, 95, 73, 8, 0, + 0, 0, 0, 0, 95, 209,30, 1, 0, 0, 0, 0, 128,36, 28, 0, 0, 0, 0, 0, 8, 136,14, 1, 0, 0, 0, 0, 146,32, 4, 0, 0, 0, 0, 0, 125,103,12, 3, + 0, 0, 0, 0, 1, 4, 72, 0, 0, 0, 0, 0, 6, 208,76, 0, 0, 0, 0, 0, 145,65, 80, 2, 0, 0, 0, 0, 0, 52, 8, 1, 0, 0, 0, 0, 145,205,22, 0, + 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 127,125,126,1, 0, 0, 0, 0, 72, 57, 12, 1, 0, 0, 0, 0, 0, 32, 76, 2, 0, 0, 0, 0, 18, 41, 4, 0, + 0, 0, 0, 0, 159,91, 94, 0, 0, 0, 0, 0, 26, 8, 6, 0, 0, 0, 0, 0, 16, 1, 48, 0, 0, 0, 0, 0, 32, 84, 2, 0, 0, 0, 0, 0, 17, 3, 2, 1, + 0, 32, 0, 0, 3, 16, 0, 0, 0, 0, 0, 0, 149,65, 126,1, 0, 32, 0, 0, 132,44, 142,0, 0, 0, 0, 0, 17, 7, 0, 1, 0, 0, 4, 0, 133,0, 0, 0, + 0, 0, 0, 0, 8, 0, 66, 0, 0, 48, 0, 0, 1, 1, 4, 0, 0, 0, 0, 0, 20, 64, 36, 0, 0, 32, 0, 0, 129,0, 68, 0, 0, 0, 0, 0, 17, 9, 12, 0, + 0, 32, 0, 0, 16, 41, 4, 0, 0, 0, 0, 0, 125,28, 46, 1, 0, 96, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4, 8, 1, 0, 0, 0, 0, 0, 0, 186,6, 0, + 0, 0, 0, 0, 24, 10, 6, 0, 0, 0, 0, 0, 89, 40, 4, 0, 0, 0, 0, 0, 2, 0, 8, 2, 0, 0, 0, 0, 41, 32, 70, 0, 0, 0, 0, 0, 2, 8, 0, 2, + 0, 0, 0, 0, 17, 152,4, 1, 0, 0, 0, 0, 85, 1, 2, 2, 0, 0, 0, 0, 0, 80, 6, 0, 0, 0, 0, 0, 133,33, 52, 0, 0, 128,0, 0, 128,0, 0, 0, + 0, 0, 0, 0, 36, 3, 0, 0, 0, 0, 0, 0, 23, 105,6, 0, 0, 34, 8, 0, 0, 128,0, 0, 0, 0, 0, 0, 17, 193,12, 0, 0, 0, 0, 0, 66, 0, 0, 1, + 16, 32, 0, 64, 255,255,254,3, 0, 0, 0, 0, 204,184,62, 0, 0, 0, 0, 0, 22, 41, 4, 1, 0, 0, 0, 0, 128,104,0, 0, 0, 0, 0, 0, 83, 72, 18, 0, + 0, 128,0, 0, 147,68, 10, 0, 0, 0, 0, 0, 17, 13, 12, 0, 0, 0, 0, 0, 0, 176,12, 0, 0, 0, 32, 0, 0, 64, 0, 0, 0, 0, 1, 0, 27, 61, 50, 0, + 0, 0, 0, 0, 190,184,6, 0, 0, 0, 1, 0, 177,41, 6, 1, 0, 0, 0, 0, 0, 144,70, 0, 0, 64, 0, 0, 25, 72, 0, 1, 0, 0, 0, 0, 83, 73, 18, 0, + 0, 0, 0, 0, 19, 24, 2, 0, 0, 0, 0, 0, 239,188,46, 2, 0, 0, 0, 0, 144,9, 68, 0, 0, 0, 0, 0, 128,68, 2, 0, 0, 0, 0, 0, 8, 93, 44, 0, + 0, 16, 0, 0, 16, 64, 0, 0, 0, 0, 0, 0, 19, 65, 58, 2, 0, 0, 0, 0, 4, 0, 14, 2, 0, 0, 0, 0, 81, 33, 0, 0, 0, 32, 0, 0, 76, 184,14, 0, + 0, 0, 0, 0, 147,64, 8, 0, 0, 0, 0, 0, 0, 48, 12, 0, 0, 0, 0, 0, 127,249,54, 1, 0, 0, 0, 0, 0, 33, 24, 0, 0, 0, 0, 0, 135,61, 44, 0, + 0, 0, 0, 0, 17, 185,0, 0, 0, 0, 0, 0, 231,253,110,2, 0, 0, 0, 0, 4, 8, 72, 1, 0, 0, 0, 0, 16, 8, 64, 0, 0, 0, 0, 0, 254,55, 111,2, + 0, 0, 0, 0, 17, 1, 18, 1, 0, 0, 0, 0, 104,0, 4, 0, 0, 0, 0, 0, 24, 4, 0, 0, 0, 0, 0, 0, 219,185,12, 0, 0, 0, 0, 0, 145,0, 6, 0, + 0, 0, 0, 0, 20, 1, 16, 0, 0, 0, 0, 0, 20, 128,12, 0, 0, 0, 0, 0, 17, 9, 84, 0, 0, 0, 0, 0, 24, 8, 2, 0, 0, 0, 0, 0, 0, 40, 30, 0, + 0, 32, 0, 0, 89, 24, 76, 0, 0, 0, 0, 0, 0, 40, 28, 0, 0, 0, 0, 0, 64, 32, 10, 1, 0, 0, 0, 0, 0, 24, 34, 0, 0, 0, 0, 0, 0, 208,16, 0, + 0, 0, 0, 0, 9, 0, 128,1, 0, 224,4, 0, 0, 0, 64, 0, 0, 8, 0, 0, 239,248,94, 0, 0, 0, 0, 0, 17, 0, 2, 1, 0, 112,0, 0, 16, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 156,0, 0, 0, 0, 0, 145,24, 2, 0, 0, 0, 0, 0, 198,172,33, 1, 0, 4, 0, 0, 0, 16, 26, 2, 0, 8, 0, 0, 149,65, 48, 1, + 0, 0, 0, 0, 16, 177,88, 0, 0, 0, 0, 0, 4, 0, 52, 0, 0, 0, 0, 0, 80, 32, 0, 1, 0, 0, 0, 0, 51, 72, 30, 0, 0, 0, 0, 0, 4, 132,0, 0, + 0, 0, 0, 0, 8, 36, 2, 1, 0, 0, 0, 0, 68, 120,20, 2, 0, 0, 0, 0, 149,109,20, 0, 0, 32, 0, 0, 75, 232,78, 1, 0, 32, 0, 0, 17, 8, 4, 0, + 0, 32, 32, 0, 0, 64, 0, 0, 0, 48, 0, 0, 17, 105,12, 1, 0, 0, 0, 0, 2, 72, 4, 0, 0, 0, 0, 0, 10, 152,28, 0, 0, 32, 0, 0, 17, 1, 20, 1, + 0, 240,4, 0, 0, 8, 12, 0, 0, 0, 0, 0, 129,65, 0, 2, 0, 0, 0, 0, 142,56, 126,2, 0, 0, 0, 0, 17, 8, 16, 1, 0, 0, 0, 0, 18, 0, 2, 2, + 0, 0, 0, 0, 146,20, 4, 0, 0, 0, 0, 0, 21, 1, 8, 0, 0, 0, 0, 0, 193,64, 0, 0, 0, 0, 0, 0, 146,144,4, 0, 0, 0, 0, 0, 160,64, 16, 2, + 0, 0, 0, 0, 32, 72, 8, 0, 0, 0, 0, 0, 217,72, 2, 0, 0, 0, 0, 0, 2, 16, 12, 1, 0, 32, 0, 0, 244,91, 76, 1, 0, 0, 0, 0, 145,77, 20, 0, + 0, 0, 0, 0, 132,1, 4, 1, 0, 96, 0, 0, 65, 128,12, 1, 0, 0, 0, 0, 33, 0, 10, 0, 0, 96, 4, 0, 16, 1, 12, 0, 0, 0, 0, 0, 12, 168,12, 0, + 0, 0, 0, 0, 16, 67, 20, 1, 0, 0, 0, 0, 89, 221,6, 0, 0, 0, 0, 0, 19, 64, 4, 0, 0, 0, 0, 0, 155,81, 30, 2, 0, 0, 0, 0, 4, 32, 128,1, + 0, 0, 0, 0, 253,103,24, 0, 0, 16, 0, 0, 2, 1, 46, 0, 0, 0, 0, 0, 2, 0, 144,0, 0, 96, 32, 0, 0, 16, 4, 0, 0, 0, 0, 0, 0, 16, 12, 1, + 0, 8, 0, 0, 1, 129,4, 0, 0, 0, 0, 0, 16, 73, 20, 1, 0, 0, 0, 0, 17, 80, 36, 0, 0, 0, 0, 0, 211,93, 77, 0, 0, 0, 0, 0, 200,116,8, 1, + 0, 0, 0, 0, 21, 5, 78, 2, 0, 32, 0, 0, 68, 0, 148,0, 0, 0, 0, 0, 9, 44, 6, 0, 0, 0, 0, 0, 129,113,0, 0, 0, 0, 0, 0, 157,229,5, 0, + 0, 0, 32, 0, 16, 0, 8, 0, 0, 0, 0, 0, 1, 64, 50, 0, 0, 0, 0, 0, 44, 0, 2, 0, 0, 0, 2, 0, 17, 48, 4, 0, 0, 4, 0, 0, 255,255,254,3, + 0, 0, 0, 0, 133,21, 2, 0, 0, 0, 0, 0, 18, 73, 18, 0, 0, 0, 0, 0, 0, 16, 78, 0, 16, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108,0, 1, + 0, 0, 0, 0, 25, 105,22, 0, 0, 0, 0, 0, 68, 56, 10, 1, 0, 0, 0, 0, 49, 0, 172,2, 0, 0, 0, 0, 8, 64, 68, 0, 0, 0, 0, 0, 13, 32, 6, 2, + 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 16, 77, 0, 0, 0, 224,30, 0, 25, 32, 132,0, 0, 224,30, 0, 0, 0, 0, 0, 0, 224,6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 57, 73, 8, 0, 0, 0, 0, 0, 0, 32, 20, 2, 0, 0, 0, 0, 48, 48, 0, 0, 0, 0, 50, 0, 0, 0, 4, 0, 0, 0, 0, 0, 16, 81, 0, 1, + 0, 0, 0, 0, 19, 89, 16, 0, 0, 0, 2, 0, 64, 0, 0, 0, 0, 0, 0, 0, 253,249,62, 2, 0, 32, 0, 0, 0, 16, 140,1, 0, 0, 0, 0, 16, 128,24, 0, + 0, 0, 0, 0, 62, 116,14, 0, 0, 0, 0, 0, 81, 69, 8, 0, 16, 0, 0, 0, 127,125,127,2, 0, 0, 0, 0, 136,40, 8, 0, 0, 2, 0, 0, 219,89, 71, 1, + 0, 0, 0, 0, 4, 32, 5, 0, 0, 0, 0, 0, 0, 3, 8, 0, 0, 0, 0, 0, 25, 177,0, 0, 0, 0, 0, 0, 20, 44, 4, 0, 0, 32, 0, 0, 0, 40, 8, 0, + 0, 32, 0, 0, 20, 9, 4, 0, 0, 32, 0, 0, 10, 32, 12, 0, 0, 0, 0, 0, 19, 77, 0, 0, 0, 0, 0, 0, 28, 32, 132,0, 0, 0, 0, 0, 17, 5, 72, 0, + 0, 0, 0, 0, 0, 48, 72, 0, 0, 40, 0, 0, 119,201,118,0, 0, 0, 0, 0, 0, 72, 18, 0, 0, 0, 0, 0, 243,253,79, 1, 0, 0, 0, 0, 4, 11, 0, 0, + 0, 0, 0, 0, 42, 12, 70, 1, 0, 0, 1, 0, 213,121,94, 1, 0, 0, 0, 0, 194,0, 26, 0, 0, 0, 0, 0, 0, 97, 0, 1, 0, 32, 0, 0, 10, 128,68, 0, + 0, 0, 0, 0, 17, 97, 20, 0, 0, 48, 0, 0, 0, 32, 4, 0, 0, 0, 0, 0, 36, 116,12, 0, 0, 0, 0, 0, 8, 16, 66, 0, 0, 0, 0, 0, 73, 58, 46, 0, + 0, 4, 0, 0, 81, 65, 16, 1, 0, 0, 0, 0, 28, 4, 14, 1, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 36, 8, 0, 0, 0, 0, 0, 13, 4, 14, 0, + 0, 16, 0, 0, 153,73, 70, 3, 0, 0, 0, 0, 12, 4, 0, 1, 0, 0, 0, 0, 29, 64, 0, 0, 0, 0, 0, 0, 0, 65, 16, 2, 0, 0, 0, 0, 4, 0, 6, 1, + 0, 0, 0, 0, 13, 160,80, 1, 0, 0, 2, 0, 160,228,20, 0, 0, 0, 0, 0, 148,12, 0, 0, 0, 0, 0, 0, 0, 168,12, 0, 0, 0, 0, 0, 80, 1, 16, 0, + 0, 0, 0, 0, 18, 32, 12, 0, 0, 0, 0, 0, 4, 0, 46, 0, 0, 0, 0, 0, 0, 137,8, 0, 0, 0, 0, 0, 19, 157,0, 0, 0, 128,0, 0, 16, 33, 4, 0, + 0, 224,62, 0, 16, 65, 4, 0, 0, 0, 0, 0, 213,121,28, 3, 0, 0, 0, 0, 0, 16, 40, 0, 0, 0, 0, 0, 1, 16, 38, 2, 0, 0, 0, 0, 211,59, 30, 0, + 0, 0, 0, 0, 4, 16, 0, 1, 0, 0, 0, 0, 13, 4, 0, 0, 0, 32, 0, 0, 8, 16, 6, 0, 0, 0, 0, 0, 147,64, 6, 2, 0, 0, 0, 0, 151,27, 14, 2, + 0, 0, 0, 0, 129,64, 0, 1, 0, 0, 0, 0, 18, 0, 16, 2, 0, 0, 0, 0, 78, 36, 0, 0, 0, 0, 0, 0, 223,255,31, 1, 0, 0, 0, 0, 132,40, 4, 3, + 0, 0, 0, 0, 25, 0, 76, 0, 16, 100,1, 0, 255,255,255,3, 0, 0, 0, 0, 254,124,15, 0, 0, 0, 0, 0, 17, 64, 66, 0, 0, 0, 0, 0, 128,32, 64, 0, + 0, 0, 0, 0, 132,22, 142,0, 0, 0, 0, 0, 184,25, 110,0, 0, 0, 0, 0, 176,57, 6, 0, 0, 0, 0, 0, 187,107,46, 1, 0, 0, 0, 0, 40, 60, 14, 0, + 0, 0, 0, 0, 13, 41, 6, 1, 0, 0, 0, 0, 251,220,14, 1, 0, 0, 0, 0, 24, 8, 16, 0, 0, 0, 0, 0, 17, 40, 76, 0, 0, 0, 0, 0, 64, 32, 41, 0, + 0, 0, 0, 0, 17, 1, 0, 3, 0, 0, 0, 0, 68, 49, 2, 0, 0, 0, 0, 0, 20, 65, 8, 0, 0, 0, 0, 0, 49, 1, 2, 0, 0, 64, 0, 0, 151,93, 26, 2, + 0, 0, 0, 0, 4, 57, 6, 0, 0, 0, 0, 0, 129,9, 16, 0, 0, 0, 0, 0, 0, 224,0, 0, 0, 0, 0, 0, 8, 128,8, 0, 0, 0, 0, 0, 0, 136,2, 0, + 0, 0, 0, 0, 65, 42, 0, 0, 0, 32, 0, 0, 113,65, 20, 0, 0, 0, 0, 0, 17, 65, 70, 0, 0, 0, 0, 0, 144,25, 0, 0, 0, 68, 0, 0, 17, 64, 16, 0, + 0, 0, 0, 0, 192,40, 32, 0, 0, 232,28, 0, 0, 0, 0, 0, 16, 0, 0, 0, 219,121,94, 1, 0, 0, 0, 0, 0, 53, 64, 1, 0, 0, 0, 0, 51, 75, 68, 0, + 0, 0, 0, 0, 203,124,14, 0, 0, 0, 0, 0, 128,4, 68, 0, 0, 0, 0, 0, 129,48, 94, 0, 0, 0, 0, 0, 172,57, 30, 0, 0, 0, 0, 0, 136,64, 0, 0, + 0, 0, 0, 0, 16, 4, 12, 2, 0, 0, 0, 0, 0, 4, 8, 2, 16, 0, 0, 0, 189,9, 12, 0, 0, 0, 0, 0, 147,105,22, 0, 0, 32, 0, 0, 128,0, 6, 0, + 0, 0, 0, 0, 148,129,8, 0, 0, 0, 0, 0, 219,217,86, 2, 0, 0, 0, 0, 24, 56, 78, 2, 0, 0, 0, 0, 19, 40, 0, 0, 0, 0, 0, 0, 2, 1, 32, 0, + 0, 0, 0, 0, 16, 33, 8, 2, 0, 0, 0, 0, 147,125,78, 1, 0, 0, 0, 0, 64, 41, 46, 1, 0, 0, 0, 0, 145,81, 22, 0, 0, 0, 0, 0, 84, 0, 8, 0, + 0, 0, 0, 0, 17, 33, 8, 0, 0, 0, 16, 0, 20, 40, 14, 0, 0, 0, 0, 0, 52, 16, 36, 1, 0, 0, 0, 0, 17, 193,4, 0, 0, 0, 0, 0, 145,93, 94, 0, + 0, 0, 0, 0, 41, 186,98, 3, 0, 0, 0, 0, 144,44, 6, 1, 0, 0, 0, 0, 152,48, 8, 0, 0, 0, 0, 0, 0, 33, 16, 0, 0, 0, 8, 0, 32, 0, 0, 0, + 0, 0, 0, 0, 138,56, 10, 0, 0, 0, 0, 0, 255,253,127,1, 0, 32, 0, 0, 240,186,126,3, 0, 0, 0, 0, 0, 68, 18, 0, 0, 0, 0, 0, 255,241,14, 0, + 0, 0, 0, 0, 10, 4, 0, 0, 0, 0, 1, 0, 4, 148,0, 0, 0, 0, 1, 0, 237,55, 238,1, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 5, 12, 0, + 0, 0, 0, 0, 16, 103,0, 1, 0, 0, 0, 0, 1, 1, 48, 0, 0, 0, 0, 0, 120,176,36, 0, 0, 0, 0, 0, 4, 48, 4, 0, 0, 0, 0, 0, 5, 2, 0, 0, + 0, 0, 0, 0, 88, 1, 4, 0, 0, 32, 0, 0, 0, 105,14, 0, 0, 112,32, 0, 17, 65, 4, 0, 0, 0, 0, 0, 145,81, 0, 1, 0, 0, 0, 0, 112,8, 36, 0, + 0, 32, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 32, 56, 82, 0, 0, 0, 0, 0, 146,65, 12, 2, 0, 0, 0, 0, 144,80, 2, 2, 0, 0, 0, 0, 34, 128,4, 0, + 0, 0, 0, 0, 1, 176,0, 0, 0, 0, 0, 0, 5, 64, 1, 0, 0, 0, 0, 0, 12, 36, 4, 0, 0, 0, 0, 0, 91, 121,30, 1, 0, 0, 0, 0, 196,44, 2, 0, + 0, 32, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 65, 40, 2, 0, 0, 224,42, 0, 0, 16, 6, 0, 0, 32, 0, 0, 0, 12, 64, 0, 0, 0, 0, 0, 76, 32, 12, 1, + 0, 0, 0, 0, 11, 128,52, 0, 0, 0, 0, 0, 196,32, 10, 1, 0, 8, 0, 0, 127,125,92, 3, 0, 0, 0, 0, 64, 48, 12, 0, 16, 66, 1, 0, 217,249,78, 3, + 0, 128,0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 65, 64, 0, 0, 160,0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 48, 80, 12, 2, 0, 0, 1, 0, 64, 89, 0, 1, + 0, 0, 0, 0, 212,137,24, 0, 0, 0, 0, 0, 172,253,94, 2, 0, 0, 0, 0, 0, 144,16, 0, 0, 0, 0, 0, 128,192,64, 0, 0, 32, 32, 0, 128,64, 0, 0, + 0, 0, 0, 0, 189,201,30, 1, 0, 0, 0, 0, 4, 12, 43, 0, 0, 0, 0, 0, 0, 64, 2, 2, 0, 0, 0, 0, 65, 73, 0, 0, 0, 160,1, 0, 94, 121,124,0, + 0, 0, 0, 0, 70, 32, 12, 0, 0, 0, 0, 0, 21, 96, 24, 0, 0, 0, 0, 0, 4, 141,6, 0, 0, 0, 0, 0, 16, 73, 2, 1, 0, 0, 0, 0, 4, 240,1, 0, + 0, 0, 0, 0, 142,56, 44, 2, 0, 0, 0, 0, 72, 3, 12, 0, 0, 240,61, 0, 2, 16, 38, 0, 0, 0, 0, 0, 145,1, 20, 0, 0, 0, 0, 0, 17, 113,82, 2, + 0, 0, 0, 0, 128,9, 4, 2, 0, 4, 0, 0, 247,127,76, 1, 0, 0, 0, 0, 74, 0, 4, 0, 0, 0, 0, 0, 0, 4, 24, 0, 0, 0, 0, 0, 247,104,140,3, + 0, 224,8, 0, 0, 1, 4, 0, 0, 0, 0, 0, 0, 68, 12, 0, 0, 0, 0, 0, 25, 1, 68, 0, 0, 0, 0, 0, 103,176,54, 2, 0, 0, 0, 0, 4, 1, 0, 2, + 0, 0, 0, 0, 12, 40, 4, 0, 0, 0, 0, 0, 151,65, 8, 2, 0, 0, 0, 0, 209,121,92, 2, 0, 0, 0, 0, 65, 40, 0, 2, 0, 0, 0, 0, 0, 64, 128,2, + 0, 8, 0, 0, 223,253,126,2, 0, 0, 0, 0, 72, 53, 70, 3, 0, 0, 0, 0, 16, 80, 16, 1, 0, 96, 0, 0, 8, 0, 6, 0, 0, 0, 0, 0, 64, 41, 3, 0, + 0, 0, 0, 0, 17, 85, 16, 0, 0, 0, 0, 0, 16, 48, 10, 0, 0, 0, 0, 0, 21, 166,14, 0, 0, 0, 0, 0, 12, 4, 2, 0, 0, 0, 0, 0, 32, 8, 70, 0, + 0, 0, 0, 0, 17, 81, 80, 0, 0, 0, 0, 0, 53, 160,0, 0, 0, 0, 0, 0, 179,73, 70, 0, 0, 0, 0, 0, 10, 0, 12, 0, 0, 0, 0, 0, 11, 144,0, 0, + 0, 0, 0, 0, 234,24, 14, 0, 0, 0, 0, 0, 106,88, 100,0, 0, 0, 0, 0, 4, 56, 0, 0, 0, 0, 0, 0, 145,73, 94, 0, 0, 0, 0, 0, 192,36, 2, 1, + 0, 0, 0, 0, 64, 8, 130,1, 0, 32, 0, 0, 0, 32, 68, 0, 0, 0, 0, 0, 0, 40, 12, 2, 0, 0, 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 17, 89, 22, 0, + 0, 32, 0, 0, 130,0, 4, 1, 0, 0, 0, 0, 64, 52, 4, 0, 0, 0, 16, 0, 95, 59, 46, 3, 0, 192,5, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 96, 8, 0, + 0, 0, 0, 0, 8, 58, 0, 0, 0, 0, 0, 0, 25, 8, 24, 0, 0, 0, 0, 0, 17, 64, 12, 1, 0, 0, 0, 0, 24, 88, 12, 0, 16, 128,0, 0, 255,189,110,2, + 0, 0, 0, 0, 2, 16, 64, 0, 0, 0, 0, 0, 0, 32, 68, 1, 0, 32, 0, 0, 16, 1, 4, 2, 0, 0, 0, 0, 20, 213,8, 0, 0, 128,0, 0, 25, 65, 22, 0, + 0, 0, 0, 0, 16, 8, 12, 0, 0, 0, 0, 0, 21, 0, 0, 1, 0, 0, 0, 0, 0, 65, 18, 0, 0, 0, 0, 0, 16, 0, 132,0, 0, 0, 0, 0, 0, 161,0, 1, + 0, 0, 0, 0, 5, 96, 2, 0, 0, 0, 0, 0, 145,201,24, 0, 0, 0, 0, 0, 144,65, 2, 0, 0, 0, 0, 0, 25, 160,8, 0, 0, 0, 16, 0, 21, 105,84, 1, + 0, 0, 0, 0, 19, 1, 4, 2, 0, 128,0, 0, 55, 121,24, 1, 0, 0, 0, 0, 68, 16, 10, 0, 0, 0, 0, 0, 17, 72, 52, 0, 0, 0, 0, 0, 83, 89, 88, 2, + 0, 0, 0, 0, 16, 45, 66, 0, 0, 0, 0, 0, 48, 17, 0, 1, 0, 0, 4, 0, 0, 16, 0, 0, 0, 244,1, 4, 255,255,255,3, 0, 144,0, 0, 0, 64, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 96, 64, 0, 0, 0, 2, 0, 0, 0, 4, 0, 20, 0, 3, 0, 255,255,255,3, 0, 16, 0, 0, 8, 64, 0, 0, + 0, 0, 0, 0, 0, 169,38, 0, 0, 0, 0, 0, 149,93, 29, 2, 0, 0, 0, 0, 32, 160,4, 0, 0, 0, 0, 0, 8, 60, 78, 1, 0, 0, 0, 0, 17, 73, 24, 1, + 0, 0, 0, 0, 4, 72, 66, 0, 0, 0, 0, 0, 32, 104,28, 0, 0, 0, 0, 0, 145,17, 70, 0, 0, 0, 0, 0, 10, 32, 10, 0, 0, 0, 0, 0, 123,89, 22, 0, + 0, 0, 0, 0, 0, 56, 98, 0, 0, 0, 0, 0, 20, 104,4, 0, 0, 0, 0, 0, 5, 12, 0, 0, 0, 0, 0, 0, 13, 76, 12, 2, 0, 0, 0, 0, 48, 0, 16, 0, + 0, 0, 0, 0, 25, 105,16, 0, 0, 0, 0, 0, 9, 40, 30, 0, 0, 0, 0, 0, 1, 124,20, 0, 0, 0, 0, 0, 76, 44, 190,2, 0, 0, 1, 0, 48, 76, 12, 0, + 0, 32, 0, 0, 18, 65, 68, 0, 0, 0, 0, 0, 20, 1, 68, 0, 0, 0, 0, 0, 245,221,28, 1, 0, 0, 0, 0, 252,53, 94, 3, 0, 0, 0, 0, 64, 40, 0, 2, + 0, 0, 0, 0, 68, 5, 9, 2, 0, 0, 0, 0, 5, 116,46, 1, 0, 0, 0, 0, 4, 1, 1, 2, 0, 0, 0, 0, 86, 40, 0, 2, 0, 0, 0, 0, 32, 120,12, 0, + 0, 0, 0, 0, 72, 68, 4, 0, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 44, 32, 38, 2, 0, 0, 0, 0, 9, 32, 20, 0, 0, 0, 0, 0, 27, 65, 31, 1, + 0, 0, 0, 0, 8, 1, 14, 0, 0, 32, 0, 0, 0, 65, 12, 0, 0, 0, 0, 0, 16, 96, 14, 0, 0, 0, 0, 0, 1, 112,116,0, 0, 0, 0, 0, 64, 64, 0, 1, + 0, 0, 0, 0, 1, 0, 2, 2, 0, 0, 0, 0, 6, 20, 4, 2, 0, 0, 0, 0, 0, 64, 8, 2, 0, 0, 0, 0, 19, 153,16, 0, 0, 0, 0, 0, 145,8, 16, 0, + 0, 0, 0, 0, 253,119,62, 3, 0, 0, 0, 0, 196,20, 46, 1, 0, 32, 0, 0, 0, 32, 128,0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 32, 0, 0, 2, 32, 36, 1, + 0, 0, 0, 0, 78, 140,45, 0, 0, 0, 0, 0, 69, 236,12, 0, 0, 32, 0, 0, 132,76, 20, 0, 0, 0, 0, 0, 0, 6, 16, 0, 0, 0, 0, 0, 10, 40, 0, 0, + 0, 0, 0, 0, 36, 168,70, 2, 0, 0, 0, 0, 145,73, 22, 1, 0, 0, 0, 0, 64, 41, 8, 0, 0, 96, 62, 0, 1, 0, 4, 0, 0, 0, 0, 0, 64, 58, 4, 0, + 0, 0, 0, 0, 149,205,86, 1, 0, 32, 0, 0, 78, 61, 6, 3, 0, 32, 0, 0, 22, 89, 68, 1, 0, 0, 0, 0, 20, 44, 10, 0, 0, 0, 0, 0, 17, 32, 20, 1, + 0, 0, 0, 0, 0, 42, 4, 0, 0, 0, 0, 0, 255,253,63, 2, 0, 0, 0, 0, 238,191,62, 3, 0, 0, 0, 0, 0, 4, 192,0, 0, 0, 0, 0, 17, 1, 128,0, + 0, 0, 0, 0, 0, 16, 12, 2, 0, 0, 0, 0, 17, 193,16, 0, 0, 0, 0, 0, 24, 0, 1, 0, 0, 0, 0, 0, 129,69, 0, 1, 0, 0, 0, 0, 17, 97, 16, 1, + 0, 0, 0, 0, 16, 32, 68, 1, 0, 0, 0, 0, 24, 46, 12, 2, 0, 0, 0, 0, 155,172,44, 2, 0, 32, 8, 0, 144,1, 12, 0, 0, 0, 0, 0, 217,89, 116,0, + 0, 0, 0, 0, 0, 48, 40, 1, 0, 0, 0, 0, 16, 16, 10, 3, 0, 0, 0, 0, 0, 128,82, 0, 0, 0, 0, 0, 14, 104,172,0, 0, 32, 32, 0, 17, 137,0, 0, + 0, 32, 0, 0, 0, 16, 2, 0, 0, 0, 0, 0, 68, 56, 4, 2, 0, 0, 0, 0, 80, 104,4, 0, 0, 0, 0, 0, 145,105,0, 1, 0, 0, 0, 0, 76, 40, 2, 0, + 0, 0, 0, 0, 32, 176,4, 0, 0, 0, 0, 0, 149,121,70, 1, 0, 0, 0, 0, 64, 5, 0, 0, 0, 0, 0, 0, 24, 41, 2, 0, 0, 0, 0, 0, 31, 160,12, 2, + 0, 0, 0, 0, 0, 13, 16, 0, 0, 4, 0, 0, 8, 0, 4, 0, 0, 48, 0, 0, 2, 85, 12, 0, 0, 0, 0, 0, 33, 32, 4, 2, 0, 0, 0, 0, 149,205,109,2, + 0, 0, 0, 0, 68, 40, 6, 0, 0, 0, 0, 0, 21, 0, 2, 0, 0, 0, 0, 0, 5, 8, 0, 2, 0, 0, 0, 0, 0, 68, 16, 1, 0, 0, 0, 0, 17, 77, 8, 0, + 0, 0, 0, 0, 84, 104,2, 0, 0, 240,52, 0, 55, 221,76, 1, 0, 112,16, 0, 0, 0, 64, 0, 0, 208,16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 57, 26, 0, + 0, 0, 0, 0, 40, 32, 0, 0, 0, 0, 0, 0, 32, 96, 40, 0, 0, 0, 0, 0, 0, 32, 118,0, 0, 16, 0, 0, 25, 64, 18, 0, 1, 240,63, 0, 9, 0, 4, 0, + 0, 0, 0, 0, 8, 8, 22, 0, 0, 0, 0, 0, 21, 48, 32, 0, 0, 0, 0, 0, 149,125,94, 3, 0, 0, 0, 0, 72, 238,8, 0, 0, 32, 0, 0, 16, 65, 64, 1, + 0, 0, 0, 0, 16, 44, 14, 0, 0, 32, 0, 0, 49, 65, 84, 0, 0, 0, 0, 0, 64, 152,4, 0, 0, 0, 0, 0, 17, 108,8, 0, 0, 0, 0, 0, 4, 41, 20, 0, + 0, 0, 0, 0, 29, 124,5, 2, 0, 32, 0, 0, 145,5, 0, 0, 0, 32, 0, 0, 16, 40, 4, 0, 0, 32, 0, 0, 4, 0, 2, 0, 0, 0, 0, 0, 16, 0, 136,0, + 0, 0, 0, 0, 20, 36, 0, 0, 0, 0, 0, 0, 76, 140,76, 2, 0, 48, 32, 0, 157,95, 20, 1, 0, 32, 0, 0, 0, 32, 20, 0, 0, 0, 0, 0, 209,68, 16, 0, + 0, 0, 0, 0, 72, 28, 4, 1, 0, 32, 0, 0, 16, 13, 4, 0, 0, 0, 0, 0, 5, 104,4, 0, 0, 0, 0, 0, 12, 0, 36, 0, 0, 0, 0, 0, 17, 41, 12, 0, + 0, 32, 0, 0, 20, 12, 0, 0, 0, 0, 0, 0, 4, 16, 12, 0, 0, 2, 0, 0, 31, 253,78, 0, 0, 0, 0, 0, 2, 56, 0, 0, 0, 0, 0, 0, 160,0, 18, 0, + 0, 2, 0, 0, 17, 65, 0, 0, 0, 0, 0, 0, 137,81, 0, 2, 0, 0, 0, 0, 194,145,4, 0, 0, 64, 0, 0, 33, 129,40, 0, 0, 0, 0, 0, 110,173,46, 1, + 0, 96, 0, 0, 35, 84, 12, 0, 0, 32, 0, 0, 49, 0, 8, 1, 0, 0, 0, 0, 28, 24, 12, 1, 0, 32, 0, 0, 17, 19, 4, 1, 0, 0, 0, 0, 2, 8, 68, 0, + 0, 0, 0, 0, 133,69, 28, 0, 0, 0, 0, 0, 4, 9, 2, 0, 0, 0, 0, 0, 25, 73, 18, 0, 0, 0, 0, 0, 68, 40, 0, 0, 0, 0, 0, 0, 1, 40, 6, 2, + 0, 0, 0, 0, 69, 16, 0, 0, 0, 0, 0, 0, 0, 10, 0, 2, 0, 32, 0, 0, 64, 32, 12, 2, 0, 0, 0, 0, 14, 175,110,0, 0, 0, 0, 0, 3, 9, 4, 3, + 0, 0, 0, 0, 144,64, 4, 2, 0, 0, 0, 0, 81, 104,22, 0, 0, 0, 0, 0, 100,168,138,0, 0, 0, 0, 0, 1, 5, 2, 0, 0, 0, 0, 0, 181,253,56, 3, + 0, 0, 0, 0, 88, 4, 2, 1, 0, 32, 0, 0, 92, 8, 4, 0, 0, 0, 0, 0, 145,81, 16, 1, 0, 0, 0, 0, 69, 0, 74, 1, 0, 0, 0, 0, 0, 160,77, 0, + 0, 0, 0, 0, 19, 16, 0, 0, 0, 0, 0, 0, 255,253,95, 3, 0, 0, 0, 0, 232,40, 14, 2, 0, 0, 0, 0, 16, 65, 40, 0, 0, 0, 0, 0, 64, 42, 130,0, + 0, 0, 0, 0, 64, 136,8, 2, 0, 32, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 68, 40, 142,0, 0, 0, 0, 0, 0, 5, 16, 0, 0, 0, 0, 0, 19, 65, 4, 3, + 0, 0, 0, 0, 10, 8, 74, 1, 0, 0, 0, 0, 84, 56, 132,0, 0, 96, 0, 0, 14, 128,68, 0, 0, 0, 4, 0, 145,69, 8, 0, 0, 0, 0, 0, 20, 96, 36, 0, + 0, 0, 0, 0, 145,73, 10, 2, 0, 0, 0, 0, 70, 48, 138,0, 0, 224,1, 0, 0, 0, 0, 0, 16, 40, 0, 0, 8, 0, 4, 0, 0, 0, 0, 0, 17, 205,12, 1, + 0, 112,8, 0, 28, 82, 4, 0, 0, 96, 0, 0, 4, 80, 4, 0, 16, 0, 0, 0, 253,255,63, 3, 0, 0, 0, 0, 200,44, 18, 2, 0, 0, 0, 0, 144,73, 16, 1, + 0, 0, 0, 0, 0, 169,32, 1, 0, 0, 0, 0, 34, 0, 32, 0, 0, 0, 0, 0, 12, 40, 0, 0, 0, 0, 0, 0, 73, 57, 14, 3, 0, 0, 0, 0, 0, 0, 44, 0, + 0, 32, 0, 0, 16, 73, 0, 0, 0, 0, 0, 0, 213,248,76, 1, 0, 0, 0, 0, 16, 81, 4, 1, 0, 0, 0, 0, 36, 40, 0, 0, 0, 0, 0, 0, 44, 40, 252,2, + 0, 0, 0, 0, 1, 41, 10, 2, 0, 0, 0, 0, 84, 104,12, 0, 0, 0, 0, 0, 8, 32, 76, 0, 0, 32, 0, 0, 0, 16, 36, 0, 0, 0, 0, 0, 149,237,28, 1, + 0, 0, 0, 0, 8, 24, 24, 0, 0, 0, 0, 0, 4, 129,50, 0, 0, 0, 0, 0, 23, 52, 4, 0, 0, 0, 0, 0, 145,33, 4, 0, 0, 32, 0, 0, 82, 8, 4, 0, + 0, 0, 0, 0, 145,1, 84, 0, 0, 0, 0, 0, 3, 1, 6, 0, 0, 0, 0, 0, 65, 48, 36, 2, 0, 0, 0, 0, 149,101,13, 2, 0, 0, 0, 0, 4, 32, 34, 0, + 0, 0, 0, 0, 17, 25, 72, 0, 0, 0, 0, 0, 17, 77, 6, 0, 0, 0, 0, 0, 213,69, 94, 3, 0, 0, 0, 0, 132,41, 66, 0, 0, 32, 0, 0, 16, 44, 30, 1, + 0, 240,14, 0, 223,246,12, 0, 0, 0, 0, 0, 190,65, 4, 0, 0, 0, 0, 0, 80, 200,136,0, 0, 0, 0, 0, 20, 67, 12, 0, 0, 32, 0, 0, 80, 29, 22, 0, + 0, 0, 0, 0, 21, 40, 12, 1, 0, 0, 0, 0, 60, 44, 4, 2, 0, 0, 0, 0, 102,168,116,2, 0, 0, 0, 0, 0, 5, 4, 1, 0, 0, 0, 0, 132,40, 4, 2, + 0, 0, 0, 0, 17, 97, 86, 1, 0, 0, 0, 0, 0, 32, 78, 1, 0, 0, 0, 0, 118,162,76, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 128,40, 10, 3, + 0, 0, 0, 0, 0, 65, 12, 0, 0, 0, 0, 0, 17, 64, 14, 0, 0, 0, 0, 0, 16, 9, 0, 2, 0, 0, 0, 0, 181,109,19, 0, 0, 0, 0, 0, 160,40, 18, 0, + 0, 0, 0, 0, 32, 33, 16, 0, 0, 0, 0, 0, 48, 32, 6, 2, 0, 0, 0, 0, 145,193,16, 1, 0, 0, 0, 0, 64, 1, 16, 0, 0, 0, 0, 0, 80, 16, 0, 0, + 0, 0, 0, 0, 128,0, 30, 0, 0, 0, 0, 0, 0, 0, 192,0, 0, 0, 0, 0, 2, 2, 8, 0, 0, 20, 0, 0, 25, 233,26, 1, 0, 0, 0, 0, 84, 57, 30, 1, + 0, 0, 0, 0, 17, 76, 0, 0, 0, 0, 0, 0, 84, 96, 8, 0, 0, 0, 0, 0, 0, 32, 48, 0, 0, 240,9, 0, 0, 0, 4, 0, 0, 96, 0, 0, 8, 64, 6, 0, + 0, 0, 0, 0, 43, 0, 8, 0, 0, 0, 0, 0, 83, 105,74, 2, 0, 0, 0, 0, 65, 133,8, 0, 0, 0, 0, 0, 64, 97, 4, 0, 0, 0, 0, 0, 107,188,14, 0, + 0, 0, 1, 0, 159,217,4, 1, 0, 0, 0, 0, 10, 32, 40, 0, 0, 0, 0, 0, 10, 192,4, 0, 0, 32, 0, 0, 0, 192,4, 0, 0, 32, 0, 0, 18, 64, 0, 0, + 0, 0, 0, 0, 16, 129,0, 1, 0, 0, 0, 0, 19, 144,4, 0, 0, 32, 0, 0, 16, 129,4, 0, 0, 0, 0, 0, 68, 24, 20, 0, 0, 32, 1, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 22, 116,30, 0, 0, 0, 0, 0, 2, 32, 16, 0, 0, 240,62, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 2, 12, 0, 0, 0, 0, 0, 209,65, 4, 1, + 0, 32, 0, 0, 8, 16, 12, 1, 0, 32, 0, 0, 86, 186,102,0, 0, 0, 0, 0, 144,128,0, 1, 0, 0, 0, 0, 5, 124,2, 0, 0, 0, 0, 0, 40, 8, 12, 0, + 0, 0, 0, 0, 4, 68, 1, 0, 0, 0, 0, 0, 101,96, 60, 2, 0, 0, 0, 0, 16, 1, 1, 0, 0, 32, 0, 0, 32, 16, 4, 0, 0, 0, 0, 0, 20, 4, 8, 0, + 0, 0, 0, 0, 17, 4, 10, 2, 0, 0, 0, 16, 149,101,29, 0, 0, 0, 0, 0, 10, 0, 14, 3, 0, 0, 0, 0, 241,185,86, 1, 0, 0, 0, 0, 16, 129,12, 0, + 0, 0, 0, 0, 0, 40, 24, 2, 0, 0, 0, 0, 64, 32, 18, 0, 0, 0, 0, 0, 77, 64, 2, 0, 0, 32, 0, 0, 253,188,46, 2, 0, 0, 0, 0, 8, 16, 68, 0, + 0, 0, 0, 0, 4, 0, 76, 0, 0, 0, 0, 0, 17, 17, 6, 0, 0, 0, 0, 0, 61, 217,14, 2, 0, 0, 0, 0, 41, 0, 4, 1, 0, 0, 0, 0, 9, 32, 4, 0, + 0, 0, 0, 0, 17, 3, 14, 3, 0, 0, 0, 0, 1, 65, 0, 3, 0, 0, 0, 0, 0, 132,64, 0, 0, 0, 0, 0, 251,248,30, 0, 0, 0, 0, 0, 17, 52, 16, 0, + 0, 0, 0, 0, 0, 16, 38, 1, 0, 0, 0, 0, 87, 77, 28, 2, 0, 0, 0, 0, 0, 164,14, 0, 0, 0, 0, 0, 72, 0, 28, 0, 0, 0, 0, 0, 84, 160,0, 0, + 0, 0, 0, 0, 19, 81, 4, 0, 0, 0, 0, 0, 0, 224,8, 0, 0, 0, 0, 0, 0, 32, 90, 0, 0, 32, 0, 0, 17, 65, 12, 0, 0, 0, 0, 0, 18, 96, 16, 0, + 0, 0, 0, 0, 17, 152,0, 0, 0, 32, 4, 0, 153,27, 4, 0, 0, 32, 4, 0, 64, 0, 0, 0, 0, 0, 0, 0, 255,237,92, 3, 0, 0, 0, 0, 36, 44, 30, 0, + 0, 0, 0, 0, 144,69, 16, 2, 0, 0, 0, 0, 205,105,110,1, 0, 0, 0, 0, 0, 136,16, 0, 0, 0, 0, 0, 81, 137,58, 2, 0, 0, 0, 0, 20, 104,0, 0, + 0, 32, 0, 0, 177,233,28, 1, 0, 96, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 8, 72, 10, 1, 0, 0, 0, 0, 4, 160,128,0, 0, 0, 0, 0, 4, 36, 12, 1, + 0, 0, 0, 0, 17, 72, 20, 0, 0, 0, 0, 0, 8, 1, 18, 0, 0, 0, 0, 0, 4, 56, 30, 0, 0, 0, 0, 0, 16, 0, 130,0, 0, 0, 0, 0, 145,197,4, 0, + 0, 0, 0, 0, 40, 24, 94, 0, 0, 128,0, 0, 64, 0, 4, 0, 0, 0, 0, 0, 21, 125,30, 0, 0, 0, 0, 0, 20, 49, 8, 0, 0, 0, 0, 0, 213,69, 28, 2, + 0, 0, 0, 0, 64, 12, 2, 0, 0, 0, 0, 0, 17, 65, 64, 1, 0, 0, 0, 0, 183,247,30, 3, 0, 0, 0, 0, 0, 5, 32, 0, 0, 0, 0, 0, 1, 12, 6, 0, + 0, 0, 0, 0, 19, 113,68, 0, 0, 0, 0, 0, 50, 9, 8, 1, 0, 0, 0, 0, 36, 1, 2, 0, 0, 0, 0, 0, 25, 1, 16, 2, 0, 96, 0, 0, 131,176,6, 2, + 0, 0, 0, 0, 53, 4, 0, 0, 0, 0, 0, 0, 16, 18, 0, 0, 0, 0, 0, 0, 0, 0, 152,0, 0, 8, 0, 0, 157,83, 18, 3, 0, 0, 0, 0, 205,53, 189,3, + 0, 0, 0, 0, 145,5, 0, 2, 16, 0, 0, 0, 138,52, 6, 0, 0, 0, 0, 0, 16, 0, 36, 0, 0, 0, 0, 0, 80, 17, 16, 0, 0, 0, 0, 0, 52, 8, 44, 1, + 0, 0, 0, 0, 21, 101,28, 0, 16, 0, 0, 0, 0, 0, 14, 0, 0, 32, 0, 0, 1, 0, 132,0, 0, 32, 0, 0, 17, 1, 4, 3, 0, 0, 0, 0, 64, 1, 10, 0, + 0, 0, 0, 0, 20, 20, 12, 0, 0, 0, 0, 0, 16, 1, 64, 0, 0, 0, 0, 0, 12, 4, 1, 0, 0, 32, 0, 0, 1, 129,4, 0, 0, 32, 0, 0, 177,101,8, 3, + 0, 0, 0, 0, 65, 1, 16, 0, 0, 96, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 92, 0, 12, 0, 0, 96, 0, 0, 243,217,78, 0, 0, 32, 0, 0, 2, 0, 4, 2, + 0, 224,4, 0, 0, 0, 4, 0, 0, 104,4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 1, 16, 0, 2, 0, 0, 0, 0, 95, 245,252,1, 0, 0, 0, 0, 0, 72, 38, 0, + 0, 32, 0, 0, 8, 48, 6, 0, 0, 0, 0, 0, 1, 60, 12, 0, 0, 0, 0, 0, 1, 1, 28, 0, 0, 0, 0, 0, 149,37, 4, 2, 0, 0, 0, 0, 132,0, 12, 2, + 0, 0, 0, 0, 85, 124,12, 0, 0, 0, 0, 0, 156,245,124,1, 0, 0, 0, 0, 0, 5, 4, 2, 0, 0, 0, 0, 0, 45, 14, 2, 0, 0, 0, 0, 104,0, 2, 0, + 0, 0, 0, 0, 26, 17, 6, 0, 0, 0, 0, 0, 252,49, 46, 1, 0, 0, 0, 0, 19, 152,4, 0, 0, 0, 0, 0, 72, 4, 0, 0, 0, 8, 0, 0, 144,0, 0, 0, + 0, 0, 0, 0, 16, 25, 68, 0, 0, 64, 0, 0, 24, 0, 12, 0, 0, 0, 2, 0, 80, 129,0, 0, 0, 0, 0, 0, 255,253,255,3, 0, 0, 0, 0, 68, 9, 10, 0, + 0, 0, 0, 0, 149,69, 16, 2, 0, 0, 0, 0, 128,1, 12, 0, 0, 0, 0, 0, 50, 5, 12, 0, 0, 0, 0, 0, 95, 93, 118,1, 0, 0, 0, 0, 2, 8, 70, 0, + 0, 0, 0, 0, 128,156,14, 0, 0, 0, 0, 0, 4, 3, 0, 0, 0, 0, 0, 0, 17, 5, 14, 2, 0, 0, 0, 0, 65, 65, 18, 0, 0, 0, 0, 0, 8, 32, 6, 2, + 0, 0, 0, 0, 1, 106,0, 0, 0, 48, 0, 0, 73, 40, 31, 0, 0, 0, 0, 0, 28, 0, 12, 0, 0, 32, 0, 0, 26, 89, 68, 1, 0, 48, 0, 0, 0, 8, 0, 1, + 0, 112,0, 0, 32, 16, 4, 0, 0, 32, 0, 0, 253,111,60, 3, 0, 0, 0, 0, 12, 36, 14, 0, 0, 0, 0, 0, 12, 0, 4, 1, 0, 0, 0, 0, 128,64, 0, 3, + 0, 0, 0, 0, 28, 52, 78, 1, 0, 32, 0, 0, 77, 116,45, 2, 0, 0, 0, 0, 145,1, 0, 3, 0, 96, 0, 0, 8, 16, 68, 0, 0, 0, 0, 0, 65, 68, 12, 0, + 0, 0, 0, 0, 129,68, 8, 0, 0, 0, 0, 0, 19, 65, 8, 3, 0, 0, 0, 0, 20, 4, 5, 0, 0, 0, 0, 0, 1, 81, 0, 0, 0, 32, 0, 0, 8, 32, 20, 0, + 0, 0, 0, 0, 4, 36, 2, 0, 0, 0, 0, 0, 4, 21, 8, 0, 0, 32, 32, 0, 4, 172,108,0, 0, 0, 0, 0, 81, 68, 8, 0, 0, 0, 0, 0, 223,176,60, 0, + 0, 0, 0, 0, 129,8, 2, 1, 0, 0, 0, 0, 1, 72, 2, 1, 0, 0, 0, 0, 144,0, 14, 0, 0, 0, 0, 0, 51, 209,6, 1, 0, 0, 0, 0, 8, 9, 2, 0, + 0, 0, 0, 0, 4, 1, 8, 2, 0, 128,0, 0, 92, 97, 12, 3, 0, 0, 0, 0, 16, 1, 84, 0, 0, 0, 0, 0, 151,65, 22, 1, 0, 0, 0, 0, 36, 0, 38, 0, + 0, 0, 0, 0, 37, 104,16, 0, 0, 0, 0, 0, 0, 97, 2, 0, 0, 0, 8, 0, 3, 0, 8, 0, 0, 0, 0, 64, 174,174,46, 1, 0, 32, 0, 0, 18, 0, 0, 0, + 0, 0, 4, 0, 146,17, 4, 0, 0, 32, 0, 0, 184,65, 4, 1, 0, 0, 0, 0, 147,56, 8, 0, 0, 40, 0, 0, 149,223,94, 0, 0, 0, 0, 0, 4, 14, 6, 1, + 0, 0, 0, 0, 20, 84, 4, 0, 0, 0, 0, 0, 36, 8, 96, 0, 0, 0, 0, 0, 9, 56, 10, 0, 0, 32, 0, 0, 12, 0, 4, 0, 0, 0, 0, 0, 4, 1, 10, 0, + 0, 0, 0, 0, 127,229,63, 2, 0, 0, 0, 0, 24, 152,4, 0, 0, 0, 0, 0, 20, 128,0, 1, 0, 32, 5, 0, 14, 220,4, 0, 0, 96, 4, 0, 64, 16, 4, 0, + 0, 96, 48, 0, 0, 0, 4, 0, 0, 0, 0, 0, 181,253,118,2, 0, 0, 0, 0, 74, 8, 6, 0, 0, 0, 0, 0, 24, 104,22, 0, 0, 0, 0, 0, 161,0, 36, 0, + 0, 0, 0, 0, 4, 80, 0, 0, 0, 0, 0, 0, 21, 120,4, 0, 0, 0, 0, 0, 34, 12, 6, 0, 0, 0, 0, 0, 64, 96, 4, 0, 0, 0, 0, 0, 149,173,28, 0, + 0, 0, 0, 0, 8, 33, 30, 1, 0, 0, 0, 0, 16, 36, 140,0, 0, 0, 0, 0, 6, 32, 0, 0, 0, 0, 0, 0, 223,249,92, 0, 0, 0, 0, 0, 80, 32, 8, 0, + 0, 0, 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 0, 160,32, 0, 0, 0, 0, 0, 20, 0, 0, 1, 0, 0, 0, 0, 4, 24, 2, 0, 0, 0, 1, 0, 213,201,62, 0, + 0, 0, 0, 0, 6, 176,76, 0, 0, 0, 0, 0, 17, 48, 6, 2, 0, 0, 0, 0, 4, 28, 4, 0, 0, 0, 0, 0, 137,17, 0, 0, 0, 0, 0, 0, 145,77, 4, 1, + 0, 0, 0, 0, 10, 33, 2, 0, 0, 32, 0, 0, 0, 1, 4, 1, 0, 0, 0, 0, 76, 189,142,0, 0, 0, 0, 0, 20, 33, 37, 0, 0, 0, 0, 0, 153,57, 70, 1, + 0, 32, 0, 0, 48, 8, 4, 1, 0, 112,46, 0, 179,217,30, 0, 0, 0, 0, 0, 4, 72, 16, 0, 0, 0, 0, 0, 8, 32, 12, 1, 0, 0, 0, 0, 24, 32, 12, 0, + 0, 0, 0, 0, 17, 97, 4, 2, 0, 16, 0, 0, 0, 192,4, 0, 0, 32, 0, 0, 21, 65, 48, 3, 0, 0, 0, 0, 254,191,252,3, 0, 0, 0, 0, 108,32, 8, 0, + 0, 0, 0, 0, 77, 4, 8, 0, 0, 0, 0, 0, 145,68, 12, 0, 0, 0, 0, 0, 149,77, 12, 0, 0, 0, 0, 0, 6, 40, 1, 0, 0, 0, 0, 0, 132,28, 14, 0, + 0, 0, 0, 0, 18, 9, 0, 0, 0, 0, 0, 0, 0, 16, 22, 0, 0, 0, 0, 0, 8, 168,4, 0, 0, 0, 0, 0, 1, 224,4, 0, 0, 0, 0, 0, 68, 40, 16, 0, + 0, 0, 0, 0, 25, 113,2, 1, 0, 0, 0, 0, 36, 0, 12, 0, 0, 0, 0, 0, 12, 16, 138,0, 0, 0, 0, 0, 17, 16, 6, 0, 0, 0, 0, 0, 16, 113,0, 0, + 0, 32, 32, 0, 0, 0, 4, 0, 0, 0, 0, 0, 21, 65, 0, 1, 0, 0, 0, 0, 8, 0, 138,0, 0, 0, 0, 0, 16, 96, 20, 0, 0, 0, 0, 0, 77, 0, 28, 0, + 0, 0, 0, 0, 1, 192,2, 0, 0, 0, 0, 0, 215,237,29, 1, 16, 0, 0, 0, 18, 121,80, 0, 0, 0, 0, 0, 17, 73, 66, 0, 0, 0, 0, 0, 73, 160,0, 0, + 0, 0, 0, 0, 0, 144,8, 0, 0, 0, 0, 0, 17, 129,0, 0, 0, 0, 0, 0, 17, 73, 10, 3, 0, 0, 0, 0, 16, 32, 130,0, 0, 32, 0, 0, 66, 16, 0, 0, + 0, 0, 0, 0, 95, 126,190,3, 0, 0, 0, 0, 2, 41, 2, 1, 0, 32, 0, 0, 8, 8, 70, 1, 0, 0, 0, 0, 216,17, 16, 0, 0, 32, 0, 0, 9, 16, 4, 0, + 0, 0, 0, 0, 106,16, 94, 0, 0, 0, 0, 0, 144,8, 4, 0, 0, 0, 0, 0, 17, 209,18, 0, 0, 0, 0, 0, 4, 8, 174,0, 0, 32, 0, 0, 9, 1, 46, 0, + 0, 32, 0, 0, 64, 0, 6, 2, 0, 0, 0, 0, 8, 2, 4, 1, 0, 0, 0, 0, 92, 36, 12, 2, 0, 96, 2, 0, 8, 136,44, 0, 0, 0, 0, 0, 17, 81, 20, 3, + 0, 0, 0, 0, 134,84, 12, 0, 0, 0, 0, 0, 133,0, 8, 2, 0, 32, 2, 0, 16, 8, 4, 0, 0, 0, 0, 0, 40, 0, 4, 0, 0, 32, 0, 0, 255,255,255,3, + 16, 0, 0, 0, 17, 73, 20, 1, 0, 0, 0, 0, 72, 0, 6, 0, 0, 0, 0, 0, 145,77, 30, 1, 0, 0, 0, 0, 0, 4, 4, 2, 0, 0, 0, 0, 9, 65, 18, 0, + 0, 0, 0, 0, 20, 1, 8, 0, 0, 4, 0, 0, 49, 65, 16, 0, 0, 0, 0, 0, 145,104,2, 0, 0, 0, 0, 0, 0, 104,32, 0, 0, 0, 0, 0, 16, 193,20, 0, + 0, 32, 0, 0, 0, 160,12, 2, 0, 8, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 88, 69, 24, 0, 0, 32, 0, 0, 0, 16, 56, 0, 0, 0, 0, 0, 145,192,22, 1, + 0, 0, 0, 0, 40, 32, 22, 0, 0, 0, 0, 0, 21, 197,12, 2, 0, 0, 0, 0, 12, 160,0, 0, 0, 0, 0, 0, 145,65, 14, 2, 0, 0, 0, 0, 69, 65, 22, 0, + 0, 0, 0, 0, 4, 96, 28, 2, 0, 0, 0, 0, 24, 8, 12, 0, 0, 0, 0, 0, 176,8, 0, 0, 0, 0, 0, 0, 2, 32, 4, 2, 0, 0, 0, 0, 5, 0, 8, 2, + 0, 0, 0, 0, 84, 64, 4, 0, 0, 0, 0, 0, 4, 12, 70, 0, 0, 0, 0, 0, 124,53, 14, 3, 0, 0, 0, 0, 152,64, 0, 1, 0, 0, 0, 0, 17, 1, 24, 0, + 0, 0, 0, 0, 9, 8, 6, 0, 0, 0, 0, 0, 145,5, 12, 2, 0, 0, 0, 0, 30, 97, 4, 2, 0, 0, 0, 0, 8, 180,64, 0, 0, 232,31, 0, 17, 101,92, 3, + 0, 85, 2, 0, 0, 16, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 21, 2, 0, 0, 0, 0, 0, 0, 145,0, 0, 0, 0, 0, 0, 0, 17, 2, 0, 0, 0, 0, 0, + 0, 64, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 84, 176,14, 0, 0, 0, 0, 0, 4, 200,8, 0, 0, 0, 0, 0, 1, 1, 76, 0, 0, 0, 0, 0, 12, 8, 0, 0, + 0, 16, 0, 0, 16, 97, 0, 0, 0, 32, 8, 0, 75, 152,12, 0, 0, 0, 0, 0, 179,69, 20, 1, 0, 0, 0, 0, 132,4, 6, 0, 0, 0, 0, 0, 255,255,30, 3, + 0, 32, 0, 0, 16, 25, 4, 0, 0, 0, 0, 0, 4, 0, 149,0, 0, 8, 0, 0, 1, 73, 4, 0, 0, 0, 0, 0, 88, 72, 20, 0, 0, 0, 0, 0, 138,40, 14, 1, + 0, 0, 0, 0, 26, 1, 4, 1, 0, 0, 0, 0, 153,25, 68, 0, 0, 0, 0, 0, 245,221,109,0, 0, 0, 0, 0, 0, 48, 84, 0, 0, 0, 0, 0, 0, 65, 10, 0, + 0, 0, 0, 0, 13, 0, 12, 2, 0, 0, 0, 0, 19, 81, 20, 1, 0, 0, 0, 0, 8, 48, 2, 1, 0, 0, 0, 0, 16, 64, 20, 2, 0, 0, 0, 0, 3, 149,0, 0, + 0, 0, 0, 0, 221,103,140,3, 0, 0, 0, 0, 18, 9, 0, 1, 0, 0, 0, 0, 1, 1, 12, 0, 0, 0, 0, 0, 132,0, 12, 0, 0, 0, 0, 0, 17, 1, 6, 1, + 0, 16, 0, 0, 17, 73, 4, 0, 0, 0, 0, 0, 33, 197,20, 0, 0, 160,0, 0, 8, 0, 4, 0, 0, 0, 0, 0, 127,237,126,3, 0, 0, 0, 0, 114,136,6, 0, + 0, 240,12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 9, 80, 0, 0, 0, 0, 0, 149,69, 12, 3, 0, 0, 0, 0, 21, 213,2, 1, 0, 224,47, 0, 118,28, 4, 1, + 16, 0, 0, 0, 149,113,30, 2, 0, 0, 0, 0, 0, 57, 14, 0, 0, 0, 0, 0, 136,2, 0, 0, 0, 0, 0, 0, 0, 40, 128,0, 0, 0, 0, 0, 119,238,94, 0, + 0, 0, 0, 0, 1, 64, 10, 0, 0, 0, 16, 0, 16, 0, 2, 0, 0, 0, 0, 0, 17, 64, 32, 0, 0, 0, 0, 0, 89, 81, 18, 2, 0, 32, 8, 0, 17, 0, 4, 0, + 0, 0, 0, 0, 8, 16, 8, 0, 0, 0, 0, 0, 4, 184,140,0, 0, 0, 0, 0, 144,12, 0, 0, 0, 224,59, 0, 255,241,119,2, 0, 96, 0, 0, 1, 0, 65, 0, + 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 64, 4, 0, 0, 0, 64, 0, 0, 0, 0, 0, 218,187,94, 3, 16, 0, 0, 0, 17, 0, 0, 0, + 0, 0, 0, 0, 18, 1, 70, 0, 0, 224,8, 0, 16, 193,229,2, 0, 64, 0, 0, 0, 0, 64, 0, 0, 0, 1, 0, 0, 0, 65, 0, 0, 32, 0, 0, 20, 0, 0, 0, + 0, 0, 0, 0, 33, 16, 128,0, 0, 0, 0, 0, 0, 0, 68, 2, 0, 0, 0, 0, 99, 108,0, 2, 0, 0, 0, 0, 16, 130,0, 0, 0, 0, 0, 0, 33, 0, 64, 0, + 0, 32, 0, 0, 129,0, 65, 0, 0, 32, 8, 0, 1, 0, 65, 0, 0, 32, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 29, 0, 0, 0, 16, 0, 0, 0, 31, 121,14, 1, + 0, 0, 0, 0, 221,189,46, 1, 0, 224,0, 0, 0, 32, 6, 0, 0, 0, 0, 0, 148,25, 0, 0, 0, 0, 0, 0, 77, 32, 12, 2, 0, 0, 1, 0, 17, 1, 18, 0, + 0, 0, 0, 0, 36, 0, 8, 2, 0, 0, 0, 0, 17, 44, 10, 0, 0, 0, 0, 0, 58, 25, 4, 0, 0, 0, 0, 0, 137,1, 8, 0, 0, 0, 0, 0, 16, 0, 26, 0, + 0, 0, 4, 0, 4, 32, 0, 0, 0, 0, 0, 0, 31, 187,62, 2, 0, 0, 0, 0, 32, 40, 3, 0, 0, 32, 0, 0, 19, 1, 4, 1, 0, 32, 0, 0, 38, 8, 74, 0, + 0, 0, 0, 0, 4, 32, 8, 3, 0, 0, 0, 0, 20, 65, 10, 1, 0, 32, 0, 0, 0, 73, 4, 0, 0, 0, 0, 0, 223,190,175,2, 0, 32, 0, 0, 16, 41, 12, 1, + 0, 32, 0, 0, 16, 28, 24, 0, 0, 0, 0, 0, 17, 89, 8, 0, 0, 0, 0, 0, 31, 109,8, 2, 0, 0, 0, 0, 144,1, 16, 1, 0, 0, 0, 0, 73, 64, 16, 0, + 0, 0, 0, 0, 64, 0, 4, 2, 0, 0, 0, 0, 16, 136,8, 0, 0, 0, 0, 0, 16, 80, 28, 0, 0, 0, 0, 0, 64, 0, 1, 0, 0, 0, 0, 0, 12, 33, 46, 0, + 16, 0, 0, 0, 17, 1, 0, 0, 0, 160,0, 0, 17, 0, 5, 0, 0, 128,0, 0, 16, 0, 1, 0, 0, 32, 0, 0, 16, 0, 1, 0, 0, 160,9, 0, 25, 128,7, 2, + 0, 128,1, 0, 1, 0, 3, 0, 0, 32, 0, 0, 0, 0, 1, 2, 0, 32, 1, 0, 33, 0, 8, 2, 0, 32, 3, 0, 65, 0, 8, 3, 0, 240,63, 0, 1, 0, 16, 3, + 0, 32, 16, 0, 0, 1, 0, 0, 0, 228,9, 0, 191,255,254,3, 0, 0, 0, 0, 177,7, 12, 0, 0, 80, 0, 0, 4, 0, 0, 0, 0, 0, 32, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 106,146,12, 0, 0, 0, 0, 0, 19, 103,22, 1, 0, 0, 0, 0, 200,40, 30, 0, 0, 32, 4, 0, 0, 64, 12, 0, 0, 0, 0, 0, 132,40, 2, 1, + 0, 0, 0, 0, 25, 40, 8, 0, 0, 0, 0, 0, 2, 41, 10, 0, 0, 0, 0, 0, 149,69, 1, 3, 0, 0, 0, 0, 172,16, 78, 1, 0, 96, 0, 0, 0, 0, 132,0, + 0, 0, 0, 0, 17, 25, 0, 0, 0, 48, 12, 0, 16, 8, 4, 0, 0, 0, 0, 0, 7, 104,12, 0, 0, 0, 0, 0, 191,125,124,3, 0, 0, 0, 0, 66, 20, 10, 0, + 0, 0, 0, 0, 6, 126,10, 0, 0, 0, 0, 0, 85, 105,156,0, 0, 0, 32, 0, 0, 8, 4, 0, 0, 0, 0, 0, 145,4, 4, 0, 0, 32, 0, 0, 245,185,12, 0, + 0, 0, 0, 0, 128,64, 12, 0, 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 171,28, 12, 0, 0, 0, 0, 0, 49, 9, 28, 0, 0, 0, 0, 0, 144,41, 0, 0, + 0, 0, 0, 0, 8, 4, 1, 0, 0, 0, 0, 0, 217,121,92, 0, 0, 0, 0, 0, 0, 49, 6, 2, 0, 0, 0, 0, 129,64, 32, 0, 0, 0, 0, 0, 17, 121,82, 0, + 0, 0, 0, 0, 0, 25, 12, 0, 0, 0, 0, 0, 16, 34, 4, 0, 0, 0, 0, 0, 111,252,14, 0, 0, 0, 0, 0, 151,25, 78, 0, 0, 0, 0, 0, 255,113,108,1, + 0, 96, 12, 0, 0, 0, 4, 0, 0, 0, 0, 0, 23, 73, 12, 0, 0, 0, 0, 0, 25, 229,92, 1, 0, 0, 0, 0, 194,170,14, 0, 0, 0, 0, 0, 16, 32, 68, 0, + 0, 0, 0, 0, 51, 204,12, 0, 0, 96, 0, 0, 127,255,30, 3, 0, 0, 0, 0, 204,173,30, 3, 0, 96, 0, 0, 0, 32, 20, 0, 0, 0, 0, 0, 65, 0, 2, 0, + 0, 0, 0, 0, 1, 40, 14, 3, 0, 0, 0, 0, 129,0, 68, 0, 0, 0, 0, 0, 48, 40, 6, 0, 0, 0, 0, 0, 72, 0, 18, 0, 0, 0, 0, 0, 72, 40, 2, 0, + 0, 0, 0, 0, 251,65, 24, 1, 0, 0, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 255,119,124,0, 0, 0, 0, 0, 216,8, 50, 0, 0, 0, 0, 0, 209,77, 78, 3, + 0, 0, 0, 0, 128,8, 0, 2, 0, 0, 0, 0, 32, 136,0, 0, 0, 32, 0, 0, 0, 41, 0, 0, 0, 96, 0, 0, 2, 16, 4, 0, 0, 0, 0, 0, 17, 225,0, 0, + 0, 240,62, 0, 0, 64, 4, 0, 0, 96, 32, 0, 32, 0, 0, 0, 0, 0, 0, 0, 25, 8, 8, 0, 0, 0, 0, 0, 43, 73, 0, 0, 0, 0, 0, 0, 145,205,28, 0, + 0, 0, 0, 0, 4, 184,0, 0, 0, 32, 0, 0, 17, 73, 4, 0, 0, 0, 0, 0, 0, 160,4, 2, 0, 0, 0, 0, 25, 65, 0, 1, 0, 0, 0, 0, 32, 8, 6, 1, + 0, 0, 0, 0, 159,253,28, 0, 0, 0, 0, 0, 129,64, 0, 2, 0, 0, 0, 0, 25, 89, 24, 0, 0, 0, 0, 0, 3, 64, 16, 1, 0, 0, 0, 0, 16, 17, 32, 0, + 0, 96, 4, 0, 32, 16, 12, 0, 0, 0, 0, 0, 191,253,30, 2, 0, 0, 0, 0, 4, 34, 10, 0, 0, 0, 0, 0, 8, 136,6, 0, 0, 0, 0, 0, 123,86, 2, 0, + 0, 0, 0, 0, 96, 96, 28, 0, 0, 0, 0, 0, 40, 0, 0, 1, 0, 0, 0, 0, 64, 144,0, 0, 0, 0, 0, 0, 4, 128,0, 1, 0, 0, 0, 0, 254,184,12, 2, + 0, 160,4, 0, 148,104,68, 0, 0, 32, 0, 0, 6, 0, 64, 0, 0, 0, 0, 0, 20, 100,12, 2, 0, 0, 0, 0, 153,13, 14, 0, 0, 32, 0, 0, 255,120,12, 1, + 0, 0, 0, 0, 64, 56, 4, 0, 0, 0, 0, 0, 89, 65, 32, 2, 0, 0, 0, 0, 0, 36, 32, 0, 0, 0, 0, 0, 0, 36, 1, 0, 0, 64, 0, 0, 196,1, 0, 0, + 0, 4, 0, 0, 37, 24, 8, 0, 0, 0, 0, 0, 0, 1, 32, 1, 0, 0, 0, 0, 98, 32, 1, 0, 0, 0, 0, 0, 110,249,126,3, 0, 0, 0, 0, 128,0, 9, 0, + 0, 8, 0, 0, 25, 115,20, 1, 0, 40, 0, 0, 16, 0, 4, 0, 0, 96, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 145,73, 0, 0, 0, 0, 0, 0, 218,57, 12, 1, + 0, 0, 0, 0, 64, 0, 12, 2, 0, 0, 0, 0, 88, 17, 102,1, 0, 0, 0, 0, 144,97, 4, 0, 0, 0, 0, 0, 0, 17, 136,0, 0, 0, 0, 0, 147,81, 18, 0, + 0, 0, 0, 0, 4, 45, 2, 0, 0, 96, 0, 0, 24, 72, 4, 2, 0, 0, 0, 0, 0, 104,18, 0, 0, 0, 0, 0, 36, 13, 14, 0, 0, 0, 0, 0, 149,109,30, 3, + 0, 0, 0, 0, 0, 168,6, 0, 0, 0, 0, 0, 8, 165,4, 0, 0, 0, 0, 0, 17, 5, 10, 0, 0, 0, 0, 0, 56, 224,10, 0, 0, 0, 0, 0, 66, 185,50, 0, + 0, 0, 0, 0, 2, 144,0, 0, 0, 32, 8, 0, 44, 32, 37, 0, 0, 0, 0, 0, 0, 144,14, 0, 0, 240,39, 0, 255,253,126,0, 0, 0, 0, 0, 17, 65, 66, 1, + 0, 0, 0, 0, 1, 44, 34, 0, 0, 0, 0, 0, 68, 0, 16, 0, 0, 0, 0, 0, 60, 188,38, 1, 0, 0, 0, 0, 2, 1, 0, 2, 0, 0, 0, 0, 16, 0, 38, 0, + 0, 0, 0, 0, 64, 1, 72, 0, 0, 0, 0, 0, 0, 64, 26, 0, 0, 0, 0, 0, 109,36, 6, 0, 0, 0, 0, 0, 132,4, 8, 0, 0, 0, 0, 0, 68, 96, 0, 0, + 0, 0, 0, 0, 1, 33, 144,0, 0, 0, 0, 0, 12, 0, 32, 0, 0, 0, 0, 0, 6, 0, 36, 0, 0, 0, 0, 0, 145,68, 8, 0, 0, 0, 0, 0, 4, 160,132,0, + 0, 0, 0, 0, 238,188,172,0, 0, 0, 0, 0, 144,0, 20, 1, 0, 32, 0, 0, 0, 16, 6, 0, 0, 0, 0, 0, 49, 73, 22, 0, 0, 0, 0, 0, 80, 32, 14, 0, + 0, 0, 0, 0, 81, 105,26, 0, 0, 0, 0, 0, 0, 41, 14, 2, 0, 32, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0, 136,40, 6, 0, 0, 0, 0, 0, 21, 1, 12, 0, + 0, 0, 0, 0, 21, 112,20, 0, 0, 0, 0, 0, 16, 24, 6, 0, 0, 0, 0, 0, 59, 127,22, 1, 0, 0, 0, 0, 66, 36, 6, 0, 0, 0, 0, 0, 18, 0, 3, 0, + 0, 0, 0, 0, 2, 0, 34, 0, 0, 0, 0, 0, 255,124,44, 0, 0, 0, 0, 0, 145,88, 4, 0, 0, 0, 0, 0, 98, 20, 72, 0, 0, 0, 0, 0, 48, 24, 4, 0, + 0, 0, 0, 0, 145,40, 4, 0, 0, 0, 0, 0, 19, 112,20, 0, 0, 0, 0, 0, 255,85, 108,0, 0, 0, 0, 0, 4, 52, 6, 0, 0, 0, 0, 0, 84, 32, 8, 0, + 0, 0, 0, 0, 36, 16, 56, 0, 0, 0, 0, 0, 156,57, 76, 2, 0, 0, 0, 0, 145,24, 12, 2, 0, 0, 0, 0, 147,89, 20, 0, 0, 0, 0, 0, 49, 205,16, 1, + 0, 0, 0, 0, 36, 129,152,1, 0, 0, 0, 0, 97, 32, 32, 0, 0, 0, 0, 0, 245,32, 37, 0, 0, 0, 0, 0, 40, 32, 36, 0, 0, 0, 0, 0, 51, 253,20, 1, + 0, 0, 0, 0, 72, 173,14, 0, 0, 0, 0, 0, 10, 56, 2, 1, 0, 0, 0, 0, 69, 40, 140,0, 0, 0, 0, 0, 8, 32, 62, 0, 0, 0, 0, 0, 127,117,127,3, + 0, 0, 0, 0, 16, 61, 26, 1, 0, 0, 0, 0, 81, 8, 74, 0, 0, 0, 0, 0, 0, 28, 14, 1, 0, 0, 0, 0, 20, 32, 128,0, 0, 0, 0, 0, 2, 25, 118,0, + 0, 0, 0, 0, 150,1, 4, 0, 0, 0, 0, 0, 49, 65, 4, 2, 0, 0, 0, 0, 1, 52, 0, 0, 0, 0, 0, 0, 4, 184,6, 0, 0, 4, 0, 0, 145,221,62, 1, + 0, 0, 0, 0, 4, 1, 46, 1, 0, 0, 0, 0, 5, 40, 10, 0, 0, 0, 0, 0, 9, 16, 4, 0, 0, 0, 0, 0, 32, 144,6, 0, 0, 0, 0, 0, 16, 48, 4, 0, + 0, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 74, 8, 10, 0, 0, 0, 0, 0, 48, 70, 16, 0, 0, 0, 0, 0, 141,9, 0, 0, 0, 0, 0, 0, 149,233,60, 0, + 0, 0, 0, 0, 13, 61, 10, 0, 0, 0, 0, 0, 48, 17, 4, 0, 0, 32, 0, 0, 1, 0, 12, 0, 0, 0, 0, 0, 72, 168,12, 0, 0, 0, 0, 0, 0, 40, 22, 0, + 0, 0, 0, 0, 8, 0, 48, 0, 0, 0, 0, 0, 4, 4, 6, 0, 0, 0, 0, 0, 49, 1, 4, 0, 0, 0, 0, 0, 68, 0, 10, 0, 0, 0, 0, 0, 49, 73, 22, 1, + 0, 0, 0, 0, 96, 32, 40, 0, 0, 0, 0, 0, 18, 152,6, 0, 0, 0, 0, 0, 112,0, 2, 0, 0, 0, 0, 0, 189,109,30, 3, 0, 0, 0, 0, 0, 61, 2, 0, + 0, 0, 0, 0, 0, 172,6, 0, 0, 0, 0, 0, 20, 32, 10, 0, 0, 0, 0, 0, 65, 65, 16, 0, 0, 0, 0, 0, 2, 137,0, 0, 0, 0, 0, 0, 24, 16, 4, 0, + 0, 0, 0, 0, 19, 0, 32, 0, 0, 0, 0, 0, 97, 0, 36, 0, 0, 0, 0, 0, 154,168,44, 0, 0, 0, 0, 0, 144,9, 8, 2, 0, 64, 0, 0, 25, 73, 52, 0, + 0, 0, 0, 0, 0, 28, 10, 1, 0, 0, 0, 0, 1, 41, 14, 0, 0, 0, 0, 0, 65, 0, 24, 0, 0, 0, 0, 0, 19, 81, 12, 0, 0, 0, 0, 0, 16, 8, 46, 0, + 0, 0, 4, 0, 16, 129,4, 0, 0, 0, 1, 0, 0, 1, 4, 0, 0, 0, 0, 0, 4, 13, 2, 0, 0, 0, 0, 0, 0, 64, 56, 0, 0, 0, 0, 0, 41, 64, 194,1, + 0, 0, 4, 0, 18, 116,4, 0, 0, 0, 0, 0, 0, 8, 6, 2, 0, 0, 0, 0, 64, 8, 18, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 4, 0, 196,167,34, 1, + 0, 0, 0, 0, 50, 46, 32, 0, 0, 0, 0, 0, 76, 32, 50, 1, 0, 4, 0, 0, 160,16, 8, 2, 0, 0, 0, 0, 196,0, 0, 0, 0, 0, 0, 0, 32, 18, 0, 0, + 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 34, 0, 136,0, 0, 0, 0, 0, 64, 4, 2, 0, 0, 0, 0, 0, 32, 20, 0, 0, 0, 0, 0, 0, 179,67, 24, 1, + 0, 0, 0, 0, 148,144,8, 0, 0, 0, 0, 0, 27, 113,92, 3, 0, 0, 0, 0, 208,25, 4, 0, 0, 0, 0, 0, 34, 2, 0, 1, 0, 0, 0, 0, 1, 48, 0, 2, + 0, 0, 0, 0, 130,8, 6, 0, 0, 32, 0, 0, 4, 128,4, 0, 0, 0, 0, 0, 0, 5, 2, 0, 0, 0, 0, 0, 25, 48, 14, 0, 0, 0, 0, 0, 25, 65, 18, 1, + 0, 0, 0, 0, 26, 24, 4, 0, 0, 0, 0, 0, 24, 0, 0, 1, 0, 0, 0, 0, 1, 120,12, 0, 0, 0, 0, 0, 255,255,189,3, 0, 0, 0, 0, 9, 42, 28, 2, + 0, 0, 0, 0, 4, 104,22, 0, 0, 0, 0, 0, 0, 1, 6, 1, 0, 0, 0, 0, 9, 64, 0, 1, 0, 0, 0, 0, 32, 32, 12, 2, 0, 0, 0, 0, 181,77, 16, 0, + 0, 0, 0, 0, 1, 64, 24, 0, 0, 0, 16, 0, 0, 48, 0, 0, 0, 32, 0, 0, 55, 121,74, 1, 0, 32, 0, 0, 8, 0, 12, 0, 0, 240,59, 0, 4, 64, 44, 0, + 0, 0, 0, 0, 0, 56, 6, 1, 0, 0, 0, 0, 16, 32, 20, 0, 0, 32, 4, 0, 49, 121,4, 1, 0, 0, 0, 0, 4, 4, 16, 0, 0, 0, 0, 0, 32, 0, 4, 1, + 0, 0, 0, 0, 132,0, 10, 0, 0, 0, 0, 0, 89, 233,0, 0, 0, 0, 0, 0, 1, 248,6, 0, 0, 0, 0, 0, 16, 41, 64, 0, 0, 0, 0, 0, 42, 8, 68, 0, + 0, 0, 0, 0, 238,188,190,0, 0, 0, 0, 0, 16, 25, 0, 1, 0, 0, 0, 0, 8, 0, 12, 2, 0, 0, 0, 0, 80, 45, 12, 2, 0, 0, 0, 0, 136,1, 36, 2, + 0, 0, 0, 0, 49, 12, 10, 0, 0, 0, 0, 0, 16, 73, 6, 0, 0, 0, 0, 0, 219,105,36, 0, 0, 0, 0, 0, 0, 40, 28, 2, 0, 32, 1, 0, 176,121,4, 1, + 0, 0, 0, 0, 2, 40, 26, 0, 0, 0, 0, 0, 192,160,4, 0, 0, 0, 0, 0, 16, 100,0, 0, 0, 0, 0, 0, 17, 13, 0, 1, 0, 0, 0, 0, 51, 223,20, 0, + 0, 0, 0, 0, 125,229,12, 2, 0, 0, 0, 0, 113,72, 12, 0, 0, 0, 0, 0, 146,8, 6, 1, 0, 0, 0, 0, 218,89, 95, 0, 0, 0, 0, 0, 1, 1, 2, 1, + 0, 0, 0, 0, 98, 170,30, 2, 0, 0, 0, 0, 21, 204,12, 0, 0, 0, 0, 0, 24, 104,10, 1, 0, 0, 0, 0, 159,237,13, 0, 0, 0, 0, 0, 8, 32, 70, 0, + 0, 0, 0, 0, 21, 80, 30, 2, 0, 32, 0, 0, 4, 8, 2, 0, 0, 0, 0, 0, 144,77, 0, 0, 0, 0, 0, 0, 17, 109,16, 0, 0, 0, 0, 0, 24, 9, 6, 0, + 0, 0, 0, 0, 11, 0, 0, 0, 0, 32, 0, 0, 171,217,110,0, 0, 0, 0, 0, 17, 68, 96, 2, 0, 0, 0, 0, 140,165,114,1, 0, 0, 0, 0, 8, 4, 0, 1, + 0, 0, 0, 0, 5, 34, 0, 0, 0, 0, 0, 0, 50, 0, 8, 0, 0, 0, 0, 0, 40, 0, 0, 2, 0, 0, 0, 0, 33, 129,2, 0, 0, 0, 0, 0, 1, 8, 32, 2, + 0, 0, 0, 0, 44, 120,14, 0, 0, 0, 0, 0, 159,29, 78, 1, 0, 0, 0, 0, 16, 5, 140,1, 0, 32, 0, 0, 19, 105,30, 1, 0, 0, 0, 0, 4, 37, 14, 1, + 0, 0, 0, 0, 0, 1, 12, 1, 0, 0, 0, 0, 12, 40, 6, 3, 0, 0, 0, 0, 72, 1, 14, 0, 0, 240,63, 0, 17, 65, 6, 0, 0, 0, 0, 0, 28, 40, 14, 0, + 0, 96, 0, 0, 147,0, 4, 2, 0, 0, 0, 0, 24, 0, 12, 3, 0, 32, 0, 0, 144,97, 4, 0, 0, 0, 0, 0, 1, 104,16, 0, 0, 0, 0, 0, 149,77, 7, 0, + 0, 0, 0, 0, 185,77, 16, 0, 0, 64, 0, 0, 0, 16, 10, 0, 0, 0, 0, 0, 36, 40, 6, 2, 16, 104,4, 0, 191,249,102,3, 0, 0, 0, 0, 34, 40, 64, 0, + 0, 0, 0, 0, 40, 40, 10, 1, 0, 112,28, 0, 24, 16, 14, 0, 0, 32, 0, 0, 0, 32, 32, 0, 0, 224,7, 0, 10, 16, 12, 1, 0, 0, 0, 0, 219,117,102,1, + 0, 0, 0, 0, 2, 60, 6, 0, 0, 0, 0, 0, 179,121,70, 2, 0, 0, 0, 0, 2, 1, 8, 0, 0, 0, 0, 0, 71, 120,5, 0, 0, 0, 0, 0, 68, 0, 17, 0, + 0, 0, 0, 0, 0, 0, 20, 2, 0, 0, 0, 0, 16, 1, 4, 2, 0, 0, 0, 0, 238,188,110,0, 0, 0, 0, 0, 1, 24, 2, 0, 0, 0, 0, 0, 20, 45, 4, 0, + 0, 0, 0, 0, 32, 12, 0, 0, 0, 0, 0, 0, 209,97, 22, 0, 0, 0, 0, 0, 17, 40, 4, 0, 0, 0, 0, 0, 32, 8, 68, 0, 0, 0, 0, 0, 25, 121,78, 1, + 0, 0, 0, 0, 49, 81, 0, 0, 0, 0, 0, 0, 72, 4, 12, 0, 0, 0, 0, 0, 57, 201,12, 1, 0, 0, 0, 0, 0, 164,132,1, 0, 0, 0, 0, 179,81, 14, 1, + 0, 0, 0, 0, 40, 33, 6, 1, 0, 32, 0, 0, 70, 0, 4, 0, 0, 0, 0, 0, 4, 0, 112,0, 0, 0, 0, 0, 40, 32, 4, 0, 0, 0, 0, 0, 51, 247,22, 1, + 0, 96, 0, 0, 68, 33, 70, 1, 0, 144,6, 0, 0, 0, 0, 0, 0, 96, 8, 0, 29, 97, 28, 1, 0, 0, 0, 0, 21, 36, 4, 2, 0, 0, 0, 0, 0, 105,6, 1, + 0, 0, 0, 0, 80, 40, 10, 0, 0, 0, 0, 0, 48, 1, 2, 0, 0, 32, 0, 0, 253,103,13, 3, 0, 0, 0, 0, 16, 0, 14, 1, 0, 0, 0, 0, 49, 1, 0, 1, + 0, 0, 0, 0, 40, 180,14, 0, 0, 0, 0, 0, 16, 41, 28, 1, 0, 0, 0, 0, 17, 1, 68, 0, 0, 32, 0, 0, 48, 17, 4, 1, 0, 32, 0, 0, 146,5, 4, 0, + 0, 0, 0, 0, 17, 133,4, 0, 0, 0, 0, 0, 8, 0, 70, 0, 0, 0, 0, 0, 17, 69, 14, 1, 0, 0, 0, 0, 151,125,92, 3, 0, 0, 0, 0, 12, 56, 62, 2, + 0, 0, 0, 0, 18, 1, 32, 1, 0, 0, 0, 0, 0, 0, 18, 2, 0, 0, 0, 0, 129,65, 18, 0, 0, 32, 0, 0, 16, 16, 66, 0, 0, 32, 0, 0, 143,60, 126,1, + 0, 32, 8, 0, 8, 0, 4, 0, 0, 0, 0, 0, 255,76, 79, 2, 0, 0, 0, 0, 21, 104,8, 0, 0, 32, 0, 0, 0, 4, 6, 0, 0, 0, 0, 0, 31, 121,48, 1, + 0, 0, 1, 0, 81, 33, 8, 1, 0, 0, 0, 0, 8, 48, 1, 0, 0, 0, 0, 0, 149,117,30, 2, 0, 0, 0, 0, 0, 32, 170,0, 0, 0, 0, 0, 247,92, 70, 0, + 0, 0, 0, 0, 128,16, 0, 1, 0, 0, 0, 0, 16, 113,64, 1, 0, 0, 0, 0, 254,185,238,3, 0, 0, 0, 0, 17, 41, 14, 0, 0, 0, 0, 0, 144,0, 4, 1, + 0, 0, 0, 0, 8, 4, 12, 0, 0, 0, 0, 0, 148,1, 28, 0, 0, 0, 0, 0, 144,73, 12, 2, 0, 0, 4, 0, 8, 16, 6, 0, 0, 0, 0, 0, 159,121,14, 2, + 0, 0, 0, 0, 19, 1, 0, 1, 0, 32, 0, 0, 95, 14, 12, 0, 0, 32, 0, 0, 16, 9, 12, 0, 0, 0, 0, 0, 81, 113,4, 3, 0, 0, 0, 0, 2, 60, 0, 0, + 0, 64, 0, 0, 185,144,41, 0, 0, 128,4, 0, 210,64, 0, 1, 0, 0, 1, 0, 16, 0, 0, 0, 0, 0, 1, 0, 255,255,254,3, 0, 0, 0, 0, 14, 33, 2, 0, + 0, 0, 0, 0, 19, 105,22, 1, 0, 32, 0, 0, 8, 1, 4, 1, 0, 0, 0, 0, 4, 104,6, 0, 0, 32, 0, 0, 41, 0, 4, 2, 0, 0, 0, 0, 29, 100,4, 0, + 0, 0, 0, 0, 132,5, 0, 0, 0, 0, 0, 0, 24, 25, 20, 1, 0, 0, 0, 0, 219,125,6, 3, 0, 0, 0, 0, 6, 32, 14, 0, 0, 0, 0, 0, 16, 73, 16, 1, + 0, 0, 0, 0, 26, 40, 6, 0, 0, 0, 0, 0, 84, 112,4, 0, 0, 0, 0, 0, 238,8, 12, 2, 0, 0, 0, 0, 68, 1, 12, 0, 0, 0, 0, 0, 53, 65, 16, 0, + 0, 0, 0, 0, 21, 105,18, 0, 0, 0, 0, 0, 64, 65, 4, 0, 0, 0, 0, 0, 211,64, 6, 0, 0, 96, 48, 0, 0, 16, 0, 0, 0, 0, 0, 0, 16, 120,14, 0, + 0, 0, 0, 0, 4, 42, 44, 2, 0, 0, 0, 0, 129,48, 0, 0, 0, 128,0, 0, 17, 105,0, 2, 0, 0, 0, 0, 10, 16, 6, 3, 0, 32, 0, 0, 16, 0, 0, 1, + 0, 0, 0, 0, 51, 249,6, 1, 0, 0, 0, 0, 0, 40, 130,0, 0, 0, 0, 0, 180,72, 20, 0, 0, 0, 0, 0, 52, 64, 0, 0, 0, 0, 1, 0, 125,101,111,3, + 0, 0, 0, 0, 2, 0, 66, 0, 0, 0, 0, 0, 113,88, 5, 0, 0, 0, 0, 0, 164,128,8, 2, 0, 0, 0, 0, 17, 173,10, 0, 0, 0, 0, 0, 1, 65, 16, 1, + 0, 0, 0, 0, 151,173,30, 3, 0, 0, 0, 0, 0, 12, 64, 0, 0, 0, 0, 0, 0, 44, 34, 0, 0, 64, 0, 0, 185,25, 104,0, 0, 32, 0, 0, 17, 121,80, 0, + 0, 0, 0, 0, 0, 12, 14, 1, 0, 96, 8, 0, 0, 64, 36, 0, 0, 0, 0, 0, 33, 32, 0, 0, 0, 0, 12, 0, 0, 0, 4, 0, 0, 0, 0, 0, 10, 49, 0, 0, + 0, 96, 2, 0, 10, 0, 68, 0, 0, 0, 0, 0, 209,29, 12, 2, 0, 0, 0, 0, 6, 32, 2, 0, 0, 0, 0, 0, 17, 25, 36, 0, 0, 0, 0, 0, 145,17, 0, 1, + 0, 0, 0, 0, 18, 8, 12, 2, 0, 0, 0, 0, 2, 65, 0, 3, 0, 0, 0, 0, 223,254,28, 2, 16, 0, 0, 0, 0, 40, 0, 2, 0, 112,0, 0, 1, 32, 12, 0, + 0, 0, 0, 0, 21, 101,16, 0, 0, 0, 0, 0, 4, 34, 0, 0, 0, 0, 0, 0, 144,4, 2, 0, 0, 0, 0, 0, 19, 81, 0, 2, 0, 0, 0, 0, 11, 32, 2, 0, + 0, 0, 0, 0, 24, 100,0, 0, 0, 0, 0, 0, 17, 8, 0, 2, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 32, 0, 145,0, 16, 0, 16, 124,47, 0, 255,255,255,3, + 0, 0, 0, 0, 5, 209,0, 0, 0, 0, 0, 0, 197,202,4, 0, 0, 96, 0, 0, 1, 8, 4, 0, 0, 0, 0, 0, 106,60, 46, 0, 0, 0, 32, 0, 1, 0, 0, 0, + 0, 144,2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204,46, 14, 0, 0, 0, 0, 0, 192,0, 8, 0, 0, 0, 0, 0, 9, 41, 10, 0, 0, 32, 0, 0, 132,1, 4, 0, + 0, 0, 0, 0, 1, 96, 6, 0, 0, 0, 0, 0, 141,68, 14, 2, 0, 0, 0, 0, 64, 48, 34, 1, 0, 0, 0, 0, 25, 9, 12, 0, 0, 0, 0, 0, 0, 16, 46, 2, + 0, 0, 0, 0, 17, 89, 38, 0, 0, 32, 0, 0, 255,121,50, 1, 0, 0, 0, 0, 128,100,10, 0, 0, 0, 0, 0, 10, 0, 70, 0, 0, 0, 0, 0, 80, 32, 3, 0, + 0, 0, 0, 0, 16, 36, 5, 0, 0, 96, 0, 0, 8, 16, 4, 0, 0, 0, 0, 0, 0, 24, 102,0, 0, 0, 0, 0, 116,189,8, 2, 0, 0, 0, 0, 64, 128,4, 2, + 0, 0, 0, 0, 57, 77, 10, 0, 0, 0, 0, 0, 204,12, 94, 0, 0, 0, 0, 0, 81, 89, 18, 0, 0, 0, 0, 0, 0, 57, 6, 1, 0, 0, 0, 0, 138,40, 14, 0, + 0, 0, 0, 0, 21, 33, 0, 0, 0, 0, 0, 0, 17, 123,30, 1, 0, 0, 0, 0, 74, 8, 2, 0, 0, 0, 0, 0, 130,40, 74, 0, 0, 128,20, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 127,188,46, 3, 0, 0, 0, 0, 55, 193,4, 0, 0, 0, 0, 0, 25, 9, 12, 2, 0, 34, 0, 0, 177,9, 4, 1, 0, 0, 0, 0, 8, 67, 0, 0, + 0, 0, 0, 0, 145,69, 30, 1, 0, 0, 0, 0, 80, 29, 14, 0, 0, 0, 0, 0, 148,32, 4, 0, 0, 0, 0, 0, 0, 24, 2, 1, 0, 0, 0, 0, 127,93, 125,3, + 0, 0, 0, 0, 175,61, 46, 3, 0, 0, 0, 0, 145,52, 14, 0, 0, 32, 0, 0, 32, 149,68, 0, 0, 0, 0, 0, 159,56, 164,2, 0, 0, 0, 0, 17, 81, 20, 1, + 0, 0, 0, 0, 140,0, 4, 2, 0, 0, 0, 0, 144,0, 6, 1, 0, 96, 0, 0, 9, 0, 4, 0, 0, 0, 0, 0, 128,241,92, 0, 0, 4, 0, 0, 81, 1, 4, 0, + 0, 0, 0, 0, 83, 16, 8, 0, 0, 0, 2, 0, 19, 249,84, 3, 0, 32, 0, 0, 8, 4, 0, 0, 0, 0, 0, 0, 9, 22, 12, 2, 0, 0, 0, 0, 72, 34, 12, 0, + 0, 0, 0, 0, 0, 16, 14, 1, 0, 0, 0, 0, 83, 24, 64, 0, 0, 96, 0, 0, 255,253,126,1, 0, 0, 0, 0, 153,175,14, 1, 0, 0, 0, 0, 1, 73, 8, 0, + 0, 0, 0, 0, 1, 69, 10, 0, 0, 0, 0, 0, 145,64, 18, 0, 0, 32, 0, 0, 0, 8, 2, 0, 0, 32, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 29, 44, 12, 0, + 0, 0, 0, 0, 29, 1, 10, 2, 0, 96, 12, 0, 14, 2, 4, 1, 0, 0, 0, 0, 193,108,78, 1, 0, 0, 0, 0, 25, 73, 6, 0, 0, 0, 0, 0, 64, 41, 8, 1, + 0, 0, 0, 0, 25, 9, 14, 0, 0, 32, 8, 0, 0, 0, 128,0, 16, 32, 0, 0, 255,255,63, 3, 16, 0, 0, 0, 79, 48, 12, 0, 0, 0, 0, 0, 144,4, 10, 0, + 0, 0, 0, 0, 4, 0, 6, 2, 0, 0, 0, 0, 32, 80, 8, 0, 0, 0, 0, 0, 243,249,127,3, 0, 0, 0, 0, 192,44, 56, 1, 0, 0, 0, 0, 56, 56, 6, 2, + 0, 0, 0, 0, 16, 2, 16, 0, 0, 0, 0, 0, 36, 24, 4, 0, 0, 96, 0, 0, 16, 64, 0, 0, 0, 32, 0, 0, 121,168,4, 0, 0, 0, 0, 0, 18, 52, 118,2, + 0, 0, 0, 0, 64, 12, 0, 0, 0, 224,4, 0, 8, 0, 4, 0, 0, 0, 1, 0, 1, 4, 6, 2, 0, 0, 0, 0, 16, 73, 10, 0, 0, 0, 0, 0, 209,75, 22, 0, + 0, 0, 0, 0, 0, 28, 14, 0, 0, 0, 0, 0, 17, 0, 32, 0, 0, 0, 0, 0, 67, 160,12, 0, 0, 0, 0, 0, 2, 36, 2, 1, 0, 0, 0, 0, 160,0, 96, 0, + 0, 0, 0, 0, 36, 52, 14, 0, 0, 0, 0, 0, 23, 69, 8, 0, 0, 0, 0, 0, 0, 48, 24, 0, 16, 0, 0, 0, 145,89, 94, 1, 0, 96, 0, 0, 117,57, 6, 1, + 0, 0, 0, 0, 73, 97, 0, 0, 0, 0, 0, 0, 83, 104,4, 2, 0, 0, 0, 0, 0, 184,6, 1, 0, 0, 0, 0, 5, 8, 2, 0, 0, 0, 0, 0, 0, 161,18, 0, + 0, 0, 0, 0, 177,237,22, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 32, 0, 0, 239,127,124,3, 0, 96, 12, 0, 143,16, 12, 0, 0, 0, 0, 0, 73, 1, 12, 2, + 0, 0, 0, 0, 0, 64, 96, 0, 0, 0, 0, 0, 0, 177,0, 0, 0, 32, 0, 0, 1, 32, 8, 0, 0, 0, 0, 0, 4, 96, 12, 0, 0, 0, 0, 0, 8, 98, 52, 1, + 0, 32, 0, 0, 149,229,29, 0, 0, 32, 0, 0, 160,124,0, 0, 0, 96, 10, 64, 9, 0, 4, 0, 0, 224,31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 34, 0, + 0, 128,0, 0, 151,241,30, 3, 0, 0, 0, 0, 0, 36, 98, 1, 0, 32, 4, 0, 1, 1, 4, 0, 0, 0, 0, 0, 17, 32, 38, 0, 0, 0, 0, 0, 16, 16, 70, 0, + 0, 0, 0, 0, 32, 8, 72, 0, 0, 0, 0, 0, 32, 0, 2, 1, 0, 96, 2, 0, 17, 65, 0, 0, 0, 0, 0, 0, 64, 50, 0, 0, 0, 0, 0, 0, 127,188,46, 0, + 0, 0, 0, 0, 130,12, 68, 0, 0, 0, 0, 0, 16, 225,12, 0, 0, 64, 0, 0, 9, 1, 0, 0, 0, 0, 0, 0, 8, 8, 10, 3, 0, 0, 0, 0, 21, 69, 32, 0, + 0, 0, 0, 0, 64, 45, 14, 0, 0, 0, 0, 0, 24, 5, 0, 1, 0, 32, 0, 0, 136,56, 6, 0, 0, 0, 0, 0, 4, 1, 4, 1, 0, 0, 0, 0, 77, 120,8, 0, + 0, 0, 0, 0, 81, 67, 0, 0, 0, 0, 0, 0, 4, 33, 18, 1, 0, 0, 0, 0, 223,61, 14, 1, 0, 64, 0, 0, 8, 41, 8, 1, 0, 0, 0, 0, 50, 81, 8, 0, + 0, 0, 0, 0, 55, 125,86, 1, 0, 0, 0, 0, 0, 164,36, 0, 0, 0, 0, 0, 88, 0, 10, 0, 0, 64, 0, 0, 17, 64, 4, 0, 0, 16, 0, 0, 149,73, 158,3, + 0, 0, 0, 0, 254,185,42, 0, 0, 0, 0, 0, 57, 137,0, 3, 0, 0, 0, 0, 17, 144,4, 0, 0, 32, 0, 0, 16, 65, 4, 1, 0, 0, 0, 0, 12, 57, 12, 0, + 0, 0, 0, 0, 1, 1, 18, 0, 0, 0, 0, 0, 17, 128,16, 0, 0, 0, 0, 0, 127,233,46, 1, 0, 0, 0, 0, 49, 65, 0, 0, 0, 0, 0, 0, 144,16, 24, 0, + 0, 0, 0, 0, 34, 0, 4, 2, 0, 0, 0, 0, 17, 125,82, 1, 0, 0, 0, 0, 63, 189,62, 1, 0, 0, 0, 0, 46, 136,2, 0, 0, 0, 0, 0, 44, 32, 10, 0, + 0, 0, 0, 0, 18, 145,4, 0, 0, 0, 0, 0, 94, 36, 8, 2, 0, 0, 0, 0, 58, 185,74, 0, 0, 0, 0, 0, 32, 17, 0, 0, 0, 0, 0, 0, 18, 25, 0, 0, + 0, 0, 0, 0, 58, 184,68, 0, 0, 0, 0, 0, 255,185,254,1, 0, 0, 0, 0, 26, 32, 14, 0, 0, 0, 0, 0, 10, 136,0, 0, 0, 0, 0, 0, 144,17, 4, 0, + 0, 0, 0, 0, 19, 209,0, 0, 0, 0, 0, 0, 124,76, 0, 2, 0, 0, 0, 0, 16, 133,0, 0, 0, 0, 0, 0, 50, 153,14, 2, 0, 0, 0, 0, 16, 56, 34, 0, + 0, 0, 0, 0, 55, 188,38, 2, 0, 0, 0, 0, 32, 160,32, 0, 0, 0, 0, 0, 42, 8, 6, 0, 0, 0, 0, 0, 32, 68, 2, 0, 0, 0, 0, 0, 9, 28, 12, 2, + 0, 0, 0, 0, 80, 4, 8, 0, 0, 0, 0, 0, 17, 157,0, 0, 0, 0, 0, 0, 72, 37, 0, 0, 0, 0, 0, 0, 1, 208,10, 0, 0, 0, 0, 0, 255,176,26, 0, + 0, 0, 0, 0, 212,181,30, 1, 0, 0, 0, 0, 126,48, 4, 0, 0, 0, 0, 0, 72, 4, 4, 2, 0, 0, 0, 0, 16, 33, 68, 0, 0, 0, 0, 0, 20, 176,12, 0, + 0, 0, 0, 0, 32, 144,12, 0, 0, 0, 0, 0, 18, 96, 12, 0, 0, 0, 0, 0, 18, 176,12, 0, 0, 0, 0, 0, 3, 128,0, 0, 0, 0, 0, 0, 136,40, 24, 0, + 0, 0, 0, 0, 16, 5, 8, 2, 0, 0, 0, 0, 20, 9, 2, 0, 0, 0, 0, 0, 0, 17, 8, 2, 0, 0, 0, 0, 92, 72, 8, 0, 0, 0, 0, 0, 82, 8, 8, 0, + 0, 0, 0, 0, 72, 8, 6, 0, 0, 0, 0, 0, 128,20, 12, 2, 0, 0, 0, 0, 164,32, 8, 0, 0, 0, 0, 0, 14, 141,26, 0, 0, 0, 0, 0, 22, 137,8, 0, + 0, 0, 0, 0, 2, 20, 2, 0, 0, 0, 0, 0, 8, 8, 0, 2, 0, 0, 0, 0, 30, 128,8, 0, 0, 0, 0, 0, 0, 20, 8, 2, 0, 0, 0, 0, 2, 196,2, 2, + 0, 0, 0, 0, 52, 0, 2, 0, 0, 0, 0, 0, 18, 0, 2, 0, 0, 0, 0, 0, 254,252,126,0, 0, 0, 0, 0, 46, 184,76, 0, 0, 0, 0, 0, 178,25, 78, 0, + 0, 0, 0, 0, 49, 41, 8, 2, 0, 0, 0, 0, 179,1, 12, 0, 0, 0, 0, 0, 20, 0, 16, 0, 0, 0, 0, 0, 38, 16, 6, 0, 0, 0, 0, 0, 32, 44, 0, 0, + 0, 32, 0, 0, 254,17, 78, 1, 0, 0, 0, 0, 48, 144,0, 0, 0, 0, 0, 0, 24, 32, 6, 2, 0, 0, 0, 0, 0, 8, 104,0, 0, 0, 0, 0, 126,48, 80, 1, + 0, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 47, 49, 16, 1, 0, 0, 0, 0, 50, 48, 0, 0, 0, 0, 0, 0, 22, 48, 32, 0, 0, 0, 0, 0, 34, 0, 34, 0, + 0, 0, 0, 0, 61, 248,8, 1, 0, 0, 0, 0, 8, 160,10, 0, 0, 0, 0, 0, 2, 184,8, 0, 0, 0, 0, 0, 254,185,30, 1, 0, 0, 0, 0, 19, 8, 0, 0, + 0, 0, 0, 0, 0, 184,14, 1, 0, 0, 0, 0, 24, 29, 72, 2, 0, 0, 0, 0, 17, 145,16, 0, 0, 0, 0, 0, 80, 21, 2, 2, 0, 0, 0, 0, 16, 2, 8, 2, + 0, 0, 0, 0, 74, 56, 6, 0, 0, 0, 0, 0, 26, 24, 0, 0, 0, 0, 0, 0, 26, 36, 8, 2, 0, 0, 0, 0, 4, 20, 8, 2, 0, 0, 0, 0, 18, 20, 64, 0, + 0, 0, 0, 0, 18, 12, 68, 0, 0, 0, 0, 0, 90, 177,10, 1, 0, 0, 0, 0, 68, 52, 12, 2, 0, 0, 0, 0, 12, 36, 8, 2, 0, 0, 0, 0, 8, 1, 8, 1, + 0, 0, 0, 0, 20, 176,12, 2, 0, 0, 0, 0, 66, 32, 14, 0, 0, 0, 0, 0, 119,248,62, 0, 0, 0, 0, 0, 6, 40, 46, 0, 128,32, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 230,249,122,2, 0, 0, 0, 0, 25, 105,0, 0, 0, 0, 0, 0, 20, 1, 8, 1, 0, 0, 0, 0, 6, 128,8, 0, 0, 96, 4, 0, 8, 0, 0, 0, + 0, 224,30, 0, 0, 0, 4, 0, 0, 0, 0, 0, 92, 161,4, 2, 0, 32, 0, 0, 14, 8, 6, 0, 0, 96, 12, 0, 0, 32, 0, 0, 0, 0, 0, 0, 132,9, 30, 0, + 0, 224,0, 0, 18, 81, 12, 1, 0, 0, 0, 0, 10, 0, 32, 0, 0, 0, 0, 0, 2, 40, 14, 0, 0, 100,0, 0, 16, 17, 4, 0, 0, 0, 0, 0, 2, 176,72, 0, + 0, 0, 0, 0, 18, 137,4, 1, 0, 32, 0, 0, 16, 1, 0, 1, 0, 0, 0, 0, 17, 32, 64, 0, 0, 0, 0, 0, 16, 129,68, 0, 0, 0, 0, 0, 26, 17, 20, 1, + 0, 0, 0, 0, 7, 144,56, 0, 0, 0, 0, 0, 17, 65, 84, 0, 0, 0, 0, 0, 66, 232,24, 0, 0, 0, 0, 0, 106,176,8, 0, 0, 0, 0, 0, 46, 121,14, 2, + 0, 96, 0, 0, 8, 144,4, 0, 0, 0, 0, 0, 4, 8, 42, 0, 0, 128,0, 0, 146,201,6, 0, 0, 0, 0, 0, 255,255,255,1, 0, 0, 0, 0, 238,190,127,1, + 0, 0, 0, 0, 25, 0, 2, 0, 0, 0, 0, 0, 0, 16, 96, 0, 0, 0, 0, 0, 25, 65, 12, 1, 0, 0, 0, 0, 85, 66, 0, 0, 0, 0, 0, 0, 127,73, 4, 1, + 0, 0, 0, 0, 49, 9, 64, 0, 0, 4, 0, 0, 17, 1, 4, 0, 0, 0, 0, 0, 18, 73, 12, 0, 0, 0, 0, 0, 149,76, 30, 0, 0, 0, 0, 0, 5, 0, 12, 0, + 0, 112,32, 0, 17, 73, 4, 0, 0, 0, 16, 0, 17, 0, 4, 0, 0, 32, 0, 0, 8, 8, 4, 0, 0, 0, 0, 0, 91, 121,90, 1, 0, 0, 0, 0, 0, 60, 10, 0, + 0, 0, 0, 0, 32, 16, 4, 0, 0, 0, 0, 0, 0, 24, 44, 0, 0, 0, 0, 0, 239,189,110,1, 0, 0, 0, 0, 18, 1, 0, 1, 0, 0, 0, 0, 16, 128,16, 0, + 0, 0, 0, 0, 211,120,82, 0, 0, 0, 0, 0, 2, 32, 56, 0, 0, 0, 0, 0, 16, 33, 2, 0, 0, 0, 0, 0, 80, 104,66, 2, 0, 0, 0, 0, 123,190,254,3, + 0, 0, 0, 0, 16, 64, 24, 0, 0, 0, 0, 0, 16, 57, 8, 0, 0, 0, 0, 0, 49, 0, 10, 0, 0, 0, 0, 0, 49, 40, 64, 0, 0, 0, 0, 0, 16, 136,0, 0, + 0, 0, 0, 0, 144,32, 0, 2, 0, 0, 0, 0, 1, 116,0, 0, 0, 0, 0, 0, 145,65, 26, 0, 0, 0, 0, 0, 64, 0, 66, 0, 0, 0, 0, 0, 255,255,126,2, + 0, 0, 0, 0, 128,36, 12, 0, 0, 0, 0, 0, 76, 48, 28, 1, 0, 32, 0, 0, 17, 81, 4, 0, 0, 0, 0, 0, 71, 48, 12, 0, 0, 0, 0, 0, 0, 4, 1, 0, + 0, 0, 0, 0, 19, 113,4, 1, 0, 0, 0, 0, 4, 36, 2, 1, 0, 0, 0, 0, 19, 253,14, 1, 0, 0, 0, 0, 1, 162,6, 0, 0, 0, 0, 0, 16, 65, 8, 2, + 0, 0, 0, 0, 125,96, 14, 0, 0, 4, 0, 0, 253,111,28, 2, 0, 0, 0, 0, 0, 161,40, 1, 0, 0, 0, 0, 68, 20, 14, 1, 0, 0, 0, 0, 146,68, 52, 0, + 0, 0, 0, 0, 36, 72, 4, 0, 0, 0, 0, 0, 0, 4, 10, 0, 0, 0, 0, 0, 145,85, 24, 0, 0, 0, 0, 0, 8, 57, 4, 0, 0, 0, 0, 0, 0, 0, 32, 2, + 0, 0, 0, 0, 145,65, 2, 2, 0, 0, 0, 0, 0, 36, 16, 0, 0, 4, 0, 0, 145,193,60, 0, 0, 0, 0, 0, 128,44, 2, 0, 0, 0, 0, 0, 1, 1, 24, 0, + 0, 0, 0, 0, 13, 36, 0, 0, 0, 4, 0, 0, 17, 65, 20, 0, 0, 0, 0, 0, 6, 0, 56, 0, 0, 32, 0, 0, 255,255,62, 1, 0, 0, 0, 0, 34, 177,12, 0, + 0, 0, 0, 0, 74, 48, 6, 1, 0, 0, 0, 0, 89, 65, 4, 0, 0, 0, 0, 0, 9, 72, 4, 0, 0, 32, 0, 0, 17, 35, 0, 1, 0, 32, 8, 0, 16, 0, 0, 0, + 0, 0, 0, 0, 0, 196,16, 0, 0, 0, 0, 0, 117,100,12, 0, 0, 0, 0, 0, 0, 12, 56, 0, 0, 0, 0, 0, 0, 112,40, 0, 0, 0, 0, 0, 8, 65, 8, 0, + 0, 0, 0, 0, 13, 40, 28, 0, 0, 176,0, 0, 9, 16, 4, 0, 0, 0, 0, 0, 149,221,13, 0, 0, 0, 0, 0, 151,73, 28, 2, 0, 0, 0, 0, 80, 32, 2, 0, + 0, 0, 0, 0, 50, 56, 14, 0, 0, 0, 0, 0, 21, 33, 2, 1, 0, 32, 8, 0, 58, 96, 28, 0, 0, 0, 0, 0, 33, 0, 16, 0, 0, 0, 0, 0, 17, 97, 28, 1, + 0, 0, 0, 0, 84, 40, 4, 1, 0, 96, 13, 0, 123,253,220,1, 0, 0, 4, 0, 0, 8, 0, 0, 0, 0, 0, 0, 16, 0, 128,1, 0, 112,5, 0, 99, 216,78, 0, + 0, 0, 0, 0, 191,28, 4, 1, 0, 32, 1, 0, 81, 65, 68, 0, 0, 0, 0, 0, 21, 16, 26, 0, 0, 0, 1, 0, 155,93, 122,1, 0, 0, 0, 0, 19, 96, 0, 0, + 0, 0, 0, 0, 3, 40, 0, 2, 0, 32, 0, 0, 48, 9, 4, 0, 0, 0, 0, 0, 40, 0, 12, 1, 0, 16, 0, 0, 59, 73, 66, 1, 0, 0, 0, 0, 9, 32, 128,0, + 0, 240,60, 0, 48, 17, 6, 1, 0, 0, 0, 0, 48, 1, 10, 0, 16, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 65, 17, 4, 0, 0, 0, 0, 0, 19, 163,18, 2, + 0, 0, 0, 0, 10, 32, 2, 0, 0, 0, 0, 0, 0, 44, 40, 0, 0, 0, 0, 0, 145,73, 24, 1, 0, 32, 0, 0, 0, 8, 0, 2, 0, 0, 0, 0, 24, 32, 22, 1, + 0, 0, 0, 0, 3, 32, 10, 0, 0, 0, 0, 0, 145,89, 72, 0, 0, 0, 4, 0, 19, 217,22, 0, 0, 0, 0, 0, 0, 172,4, 0, 0, 0, 0, 0, 129,72, 18, 0, + 0, 0, 0, 0, 40, 44, 4, 0, 0, 0, 0, 0, 0, 60, 6, 0, 0, 0, 0, 0, 129,1, 16, 0, 16, 0, 0, 0, 219,109,140,0, 0, 32, 0, 0, 177,0, 0, 0, + 0, 0, 0, 0, 1, 73, 6, 1, 0, 32, 0, 0, 16, 12, 2, 1, 0, 0, 0, 0, 192,64, 6, 0, 0, 0, 0, 0, 5, 4, 9, 0, 0, 0, 0, 0, 17, 25, 4, 0, + 0, 96, 0, 0, 128,0, 0, 0, 0, 0, 0, 0, 17, 201,20, 0, 0, 0, 0, 0, 59, 223,27, 1, 0, 0, 0, 0, 42, 160,2, 0, 0, 0, 0, 0, 156,168,70, 0, + 16, 0, 0, 0, 53, 172,8, 0, 0, 0, 0, 0, 33, 1, 0, 0, 0, 48, 0, 0, 18, 81, 4, 1, 0, 32, 4, 0, 9, 0, 0, 0, 0, 0, 0, 0, 130,0, 8, 0, + 0, 0, 0, 0, 17, 40, 14, 2, 0, 0, 0, 0, 122,44, 0, 0, 0, 32, 0, 0, 13, 32, 8, 0, 0, 0, 0, 0, 215,45, 44, 0, 0, 0, 0, 0, 73, 96, 0, 0, + 0, 32, 1, 0, 25, 32, 12, 0, 0, 0, 0, 0, 16, 44, 4, 0, 0, 0, 0, 0, 3, 1, 0, 2, 16, 0, 0, 0, 191,189,126,1, 0, 0, 0, 0, 168,60, 46, 0, + 0, 0, 0, 0, 152,113,68, 0, 0, 0, 0, 0, 7, 64, 0, 0, 0, 32, 0, 0, 8, 32, 0, 0, 0, 0, 0, 0, 138,173,14, 0, 0, 32, 0, 0, 136,0, 4, 0, + 0, 0, 0, 0, 17, 1, 6, 2, 0, 0, 0, 0, 8, 44, 34, 0, 0, 0, 0, 0, 187,253,45, 1, 0, 96, 0, 0, 64, 0, 32, 0, 0, 32, 0, 0, 241,49, 20, 1, + 0, 0, 0, 0, 17, 129,64, 0, 0, 0, 0, 0, 211,125,8, 3, 0, 0, 0, 0, 145,136,8, 0, 0, 0, 0, 0, 123,253,110,3, 0, 0, 0, 0, 61, 44, 12, 0, + 0, 0, 0, 0, 9, 32, 64, 0, 0, 0, 0, 0, 12, 32, 64, 0, 0, 0, 0, 0, 128,8, 10, 2, 0, 0, 0, 0, 21, 9, 0, 0, 0, 0, 0, 0, 7, 16, 0, 0, + 16, 0, 0, 0, 255,255,62, 3, 0, 0, 0, 0, 19, 9, 16, 0, 0, 0, 0, 0, 136,8, 34, 0, 0, 0, 0, 0, 33, 24, 26, 0, 0, 0, 0, 0, 0, 80, 10, 0, + 0, 0, 0, 0, 66, 32, 8, 0, 0, 0, 0, 0, 25, 205,8, 0, 0, 0, 0, 0, 19, 221,20, 0, 0, 0, 0, 0, 10, 96, 4, 2, 0, 0, 0, 0, 72, 52, 0, 0, + 0, 0, 0, 0, 221,103,12, 3, 0, 0, 0, 0, 66, 40, 80, 0, 0, 0, 0, 0, 24, 64, 6, 1, 0, 0, 0, 0, 8, 0, 30, 0, 0, 0, 0, 0, 18, 216,76, 1, + 0, 0, 0, 0, 25, 77, 40, 0, 0, 0, 0, 0, 128,5, 2, 2, 0, 0, 0, 0, 0, 24, 6, 1, 0, 32, 0, 0, 179,24, 12, 0, 0, 0, 0, 0, 17, 136,0, 1, + 0, 32, 0, 0, 0, 50, 2, 0, 0, 0, 0, 0, 0, 32, 16, 2, 0, 0, 0, 0, 255,254,126,1, 0, 0, 0, 0, 160,9, 8, 0, 0, 32, 2, 0, 16, 9, 68, 0, + 0, 0, 0, 0, 9, 64, 16, 0, 0, 0, 0, 0, 194,56, 4, 0, 0, 0, 0, 0, 49, 32, 0, 0, 16, 0, 0, 0, 25, 72, 8, 0, 0, 0, 0, 0, 89, 36, 24, 0, + 0, 0, 0, 0, 2, 132,8, 0, 0, 0, 0, 0, 24, 81, 4, 0, 0, 0, 0, 0, 146,156,12, 0, 0, 0, 0, 0, 18, 37, 10, 0, 0, 0, 0, 0, 139,8, 76, 1, + 0, 32, 0, 0, 191,57, 78, 1, 0, 0, 0, 0, 81, 68, 76, 0, 0, 0, 0, 0, 64, 184,12, 0, 16, 0, 0, 0, 17, 33, 0, 0, 0, 0, 0, 0, 95, 241,14, 1, + 0, 0, 0, 0, 25, 65, 16, 1, 0, 0, 0, 0, 8, 180,96, 0, 0, 0, 0, 0, 60, 37, 100,1, 0, 0, 0, 0, 88, 60, 32, 0, 0, 0, 0, 0, 60, 200,48, 1, + 0, 0, 0, 0, 66, 48, 8, 0, 0, 0, 0, 0, 255,255,46, 0, 0, 0, 0, 0, 4, 17, 0, 1, 0, 0, 0, 0, 10, 0, 6, 0, 0, 0, 0, 0, 65, 64, 2, 0, + 0, 0, 0, 0, 93, 25, 28, 2, 0, 0, 0, 0, 144,1, 4, 2, 0, 0, 0, 0, 17, 209,68, 0, 0, 0, 0, 0, 128,36, 10, 1, 0, 0, 0, 0, 64, 36, 8, 2, + 0, 0, 0, 0, 16, 129,8, 0, 0, 0, 0, 0, 81, 29, 10, 0, 0, 0, 0, 0, 128,4, 72, 0, 0, 0, 0, 0, 24, 72, 28, 0, 0, 0, 0, 0, 67, 57, 20, 0, + 0, 0, 8, 0, 255,252,255,3, 0, 0, 0, 0, 141,184,22, 0, 0, 0, 0, 0, 83, 73, 18, 1, 0, 0, 0, 0, 133,101,16, 1, 0, 0, 0, 0, 16, 8, 24, 0, + 0, 0, 0, 0, 19, 121,4, 0, 0, 32, 0, 0, 223,121,86, 0, 0, 0, 0, 0, 15, 124,78, 0, 0, 0, 0, 0, 110,190,126,0, 0, 0, 0, 0, 0, 12, 0, 2, + 0, 0, 0, 0, 48, 4, 0, 0, 0, 0, 0, 0, 177,24, 66, 0, 0, 0, 0, 0, 18, 193,4, 0, 0, 0, 0, 0, 17, 129,14, 2, 0, 0, 0, 0, 49, 64, 26, 1, + 0, 64, 0, 0, 245,121,94, 0, 0, 96, 0, 0, 4, 160,2, 0, 0, 0, 0, 0, 17, 193,20, 1, 0, 0, 0, 0, 68, 9, 8, 0, 0, 0, 0, 0, 145,69, 16, 0, + 0, 0, 0, 0, 247,95, 61, 1, 0, 0, 0, 0, 194,48, 12, 0, 0, 0, 0, 0, 0, 96, 38, 0, 0, 0, 0, 0, 130,9, 0, 0, 0, 0, 0, 0, 117,0, 4, 0, + 0, 0, 0, 0, 20, 1, 68, 1, 0, 0, 0, 0, 17, 81, 4, 1, 0, 0, 0, 0, 1, 0, 36, 0, 0, 240,46, 0, 239,57, 76, 1, 0, 0, 0, 0, 191,221,22, 2, + 0, 96, 0, 0, 4, 0, 4, 0, 0, 0, 0, 0, 20, 0, 128,0, 0, 0, 0, 0, 0, 108,6, 0, 0, 0, 0, 0, 21, 104,12, 0, 0, 0, 0, 0, 16, 49, 4, 0, + 0, 0, 0, 0, 16, 36, 6, 0, 0, 32, 0, 0, 29, 97, 12, 1, 0, 0, 0, 0, 17, 76, 12, 0, 0, 32, 0, 0, 0, 128,142,0, 0, 0, 0, 0, 36, 0, 4, 0, + 0, 0, 0, 0, 255,103,31, 1, 0, 0, 0, 0, 64, 41, 10, 0, 0, 0, 0, 0, 145,73, 8, 1, 0, 0, 0, 0, 69, 32, 70, 0, 0, 0, 0, 0, 149,73, 28, 0, + 0, 32, 0, 0, 8, 8, 66, 0, 0, 40, 0, 0, 0, 16, 4, 0, 0, 32, 0, 0, 136,0, 14, 1, 0, 0, 0, 0, 7, 32, 12, 0, 0, 0, 0, 0, 177,73, 4, 0, + 0, 0, 0, 0, 48, 65, 0, 0, 0, 0, 0, 0, 0, 168,10, 0, 0, 64, 0, 0, 6, 52, 18, 0, 0, 0, 0, 0, 144,204,14, 0, 0, 0, 0, 0, 151,255,94, 0, + 0, 0, 0, 0, 68, 6, 32, 0, 0, 0, 0, 0, 88, 36, 12, 0, 0, 0, 0, 0, 69, 32, 20, 0, 0, 0, 0, 0, 132,45, 4, 0, 0, 0, 0, 0, 21, 109,28, 1, + 0, 0, 0, 0, 0, 12, 32, 0, 0, 0, 0, 0, 32, 48, 0, 0, 0, 32, 0, 0, 128,8, 4, 0, 0, 0, 0, 0, 213,77, 94, 2, 0, 0, 0, 0, 8, 129,6, 0, + 0, 0, 0, 0, 64, 174,6, 1, 0, 0, 0, 0, 85, 12, 0, 0, 0, 0, 0, 0, 112,228,140,0, 0, 0, 32, 0, 0, 32, 4, 0, 0, 0, 0, 0, 17, 1, 64, 2, + 0, 0, 0, 0, 9, 24, 6, 0, 0, 0, 0, 0, 74, 8, 5, 0, 0, 64, 16, 0, 17, 107,82, 1, 0, 0, 1, 0, 2, 64, 8, 0, 0, 0, 0, 0, 243,169,42, 3, + 0, 0, 0, 0, 48, 9, 0, 0, 0, 0, 0, 0, 80, 33, 64, 0, 0, 0, 0, 0, 25, 13, 4, 0, 0, 0, 0, 0, 24, 4, 4, 0, 0, 0, 0, 0, 25, 140,28, 2, + 0, 32, 0, 0, 10, 128,6, 0, 0, 0, 0, 0, 249,185,106,0, 0, 0, 0, 0, 0, 56, 12, 0, 0, 0, 0, 0, 24, 24, 8, 0, 0, 0, 0, 0, 58, 185,46, 0, + 0, 0, 0, 0, 3, 65, 20, 0, 0, 0, 0, 0, 72, 80, 6, 0, 0, 0, 0, 0, 56, 72, 8, 0, 0, 0, 0, 0, 49, 209,4, 2, 0, 0, 0, 0, 132,44, 4, 0, + 0, 0, 0, 0, 0, 130,76, 0, 0, 0, 0, 0, 111,253,122,0, 0, 0, 0, 0, 56, 44, 0, 0, 0, 0, 0, 0, 29, 160,20, 2, 0, 0, 0, 0, 35, 168,14, 0, + 0, 32, 0, 0, 190,188,78, 0, 0, 32, 0, 0, 49, 197,18, 1, 0, 0, 0, 0, 110,185,126,1, 0, 0, 0, 0, 1, 64, 4, 1, 0, 0, 0, 0, 144,72, 8, 0, + 0, 128,0, 0, 0, 8, 2, 0, 0, 0, 0, 0, 88, 5, 8, 0, 0, 0, 0, 0, 144,160,4, 0, 0, 0, 0, 0, 16, 69, 12, 1, 0, 0, 0, 0, 146,1, 4, 0, + 0, 0, 0, 0, 17, 69, 4, 0, 0, 32, 0, 0, 138,32, 6, 0, 0, 0, 0, 0, 5, 38, 4, 0, 0, 0, 0, 0, 27, 17, 12, 0, 0, 0, 0, 0, 93, 177,124,2, + 0, 0, 0, 0, 32, 0, 8, 2, 0, 0, 0, 0, 72, 0, 4, 2, 0, 0, 0, 0, 0, 148,40, 0, 0, 0, 0, 0, 16, 73, 68, 1, 0, 0, 0, 0, 16, 128,12, 0, + 0, 0, 0, 0, 124,180,108,2, 0, 32, 2, 0, 16, 64, 6, 1, 0, 0, 0, 0, 17, 22, 4, 1, 0, 0, 0, 0, 10, 0, 2, 1, 0, 0, 0, 0, 80, 4, 4, 0, + 0, 0, 0, 0, 4, 132,68, 0, 0, 0, 0, 0, 95, 240,124,0, 0, 0, 0, 0, 2, 64, 4, 0, 0, 0, 0, 0, 19, 5, 4, 0, 0, 0, 0, 0, 64, 160,8, 0, + 0, 64, 0, 0, 145,36, 12, 0, 0, 0, 0, 0, 68, 128,0, 0, 0, 0, 0, 0, 152,169,6, 0, 0, 0, 0, 0, 74, 181,14, 1, 0, 0, 0, 0, 11, 152,4, 0, + 0, 0, 0, 0, 129,4, 4, 0, 0, 32, 6, 0, 48, 0, 76, 2, 0, 0, 0, 0, 56, 0, 40, 0, 0, 0, 32, 0, 31, 197,30, 1, 0, 0, 0, 0, 12, 41, 78, 1, + 0, 32, 0, 0, 184,145,108,0, 0, 32, 0, 0, 21, 137,12, 1, 0, 0, 0, 0, 95, 10, 14, 0, 0, 0, 0, 0, 72, 8, 10, 0, 0, 0, 0, 0, 4, 12, 12, 0, + 0, 0, 0, 0, 8, 4, 4, 0, 0, 0, 0, 0, 217,40, 14, 0, 0, 0, 0, 0, 73, 0, 8, 0, 0, 96, 1, 0, 8, 0, 6, 1, 0, 0, 0, 0, 145,8, 14, 2, + 0, 96, 0, 0, 178,19, 108,1, 0, 0, 0, 0, 69, 76, 26, 0, 0, 96, 1, 0, 154,233,70, 1, 0, 0, 0, 0, 25, 45, 12, 0, 0, 0, 0, 0, 4, 128,40, 0, + 0, 32, 0, 0, 18, 41, 0, 1, 0, 0, 0, 0, 76, 9, 14, 0, 0, 0, 0, 0, 32, 128,8, 0, 0, 32, 0, 0, 16, 0, 4, 1, 0, 16, 0, 0, 149,209,18, 1, + 0, 0, 0, 0, 124,133,58, 3, 0, 96, 0, 0, 146,144,6, 1, 0, 0, 0, 0, 28, 200,4, 0, 0, 0, 0, 0, 48, 12, 2, 0, 0, 0, 0, 0, 157,139,14, 1, + 0, 0, 0, 0, 8, 0, 2, 2, 0, 0, 0, 0, 82, 17, 0, 0, 0, 0, 0, 0, 60, 132,40, 0, 0, 0, 0, 0, 142,196,123,0, 0, 0, 0, 0, 68, 132,8, 2, + 0, 32, 0, 0, 16, 1, 20, 1, 0, 32, 0, 0, 24, 1, 4, 1, 0, 0, 0, 0, 24, 37, 10, 0, 0, 32, 0, 0, 190,145,68, 1, 0, 0, 0, 0, 102,4, 4, 0, + 0, 0, 0, 0, 0, 180,6, 0, 0, 0, 0, 0, 18, 1, 4, 1, 0, 0, 0, 0, 23, 73, 22, 0, 0, 0, 0, 0, 4, 45, 6, 1, 0, 32, 0, 0, 17, 9, 4, 1, + 0, 0, 0, 0, 18, 40, 0, 0, 0, 0, 0, 0, 16, 100,1, 0, 0, 0, 0, 0, 135,69, 6, 0, 0, 240,63, 0, 0, 64, 0, 0, 0, 0, 0, 0, 16, 17, 8, 0, + 0, 0, 0, 0, 22, 136,0, 0, 0, 0, 0, 0, 17, 0, 68, 0, 0, 0, 0, 0, 153,65, 22, 0, 0, 0, 0, 0, 4, 160,70, 0, 0, 0, 0, 0, 0, 52, 2, 0, + 0, 0, 0, 0, 194,24, 45, 0, 0, 0, 0, 0, 32, 16, 2, 0, 0, 0, 0, 0, 0, 5, 0, 1, 0, 0, 0, 0, 140,44, 20, 0, 0, 0, 0, 0, 49, 13, 26, 0, + 0, 0, 0, 0, 23, 41, 72, 1, 0, 0, 0, 0, 5, 120,2, 0, 0, 0, 0, 0, 38, 8, 14, 0, 0, 0, 0, 0, 0, 101,4, 0, 0, 0, 0, 0, 251,125,126,3, + 0, 0, 0, 0, 76, 165,6, 2, 0, 0, 0, 0, 73, 68, 16, 0, 0, 32, 0, 0, 17, 1, 4, 2, 0, 0, 0, 0, 12, 57, 134,1, 0, 0, 0, 0, 157,56, 44, 2, + 0, 32, 0, 0, 1, 9, 20, 0, 0, 0, 0, 0, 64, 0, 2, 1, 0, 0, 0, 0, 5, 1, 0, 3, 0, 0, 1, 0, 16, 49, 110,1, 0, 0, 0, 0, 0, 1, 4, 2, + 0, 0, 0, 0, 2, 16, 14, 0, 0, 0, 0, 0, 8, 33, 6, 0, 0, 0, 0, 0, 27, 115,38, 0, 16, 0, 0, 0, 138,192,78, 0, 0, 0, 0, 0, 33, 72, 44, 0, + 0, 32, 0, 0, 40, 0, 36, 0, 0, 0, 0, 0, 89, 103,31, 3, 0, 0, 0, 0, 80, 20, 20, 0, 0, 0, 1, 0, 4, 0, 12, 0, 0, 0, 0, 0, 150,76, 68, 3, + 0, 96, 2, 0, 1, 0, 132,0, 0, 32, 0, 0, 50, 36, 10, 0, 0, 0, 0, 0, 104,17, 38, 0, 0, 40, 4, 0, 49, 0, 32, 0, 0, 0, 0, 0, 136,252,14, 1, + 0, 0, 0, 0, 149,204,74, 0, 0, 240,0, 0, 128,0, 0, 0, 0, 0, 0, 0, 223,253,62, 2, 0, 0, 0, 0, 6, 32, 40, 1, 0, 0, 0, 0, 33, 65, 0, 0, + 0, 0, 0, 0, 5, 44, 14, 0, 0, 0, 0, 0, 151,105,12, 0, 0, 0, 0, 0, 145,73, 8, 0, 0, 0, 16, 0, 254,172,47, 2, 0, 8, 0, 0, 53, 27, 12, 0, + 0, 32, 0, 0, 87, 185,76, 0, 0, 0, 0, 0, 128,128,4, 1, 0, 0, 0, 0, 29, 137,68, 0, 0, 0, 0, 0, 42, 0, 4, 0, 0, 32, 0, 0, 127,153,76, 0, + 0, 0, 0, 0, 0, 4, 38, 0, 0, 0, 0, 0, 153,41, 4, 0, 0, 0, 0, 0, 3, 13, 16, 0, 0, 48, 0, 0, 157,207,50, 1, 0, 0, 0, 0, 253,61, 94, 3, + 0, 0, 0, 0, 145,5, 0, 0, 0, 32, 0, 0, 46, 158,206,1, 0, 0, 0, 0, 8, 9, 8, 0, 0, 0, 36, 0, 1, 16, 0, 0, 0, 0, 0, 0, 127,101,12, 0, + 0, 32, 0, 0, 16, 17, 4, 1, 0, 0, 0, 0, 19, 1, 16, 0, 0, 0, 0, 0, 221,13, 14, 0, 0, 0, 0, 0, 16, 153,4, 1, 0, 0, 0, 0, 1, 1, 0, 3, + 0, 0, 0, 0, 0, 17, 12, 0, 0, 0, 0, 0, 145,1, 28, 2, 0, 96, 12, 0, 16, 1, 4, 0, 0, 0, 0, 0, 221,45, 110,3, 0, 0, 0, 0, 76, 4, 6, 0, + 0, 0, 0, 0, 180,81, 4, 0, 0, 0, 0, 0, 150,69, 28, 0, 0, 0, 0, 0, 49, 80, 0, 0, 0, 32, 8, 0, 16, 141,12, 0, 0, 0, 0, 0, 76, 8, 6, 0, + 0, 8, 0, 0, 16, 8, 64, 0, 0, 96, 0, 0, 18, 65, 86, 1, 0, 0, 0, 0, 92, 8, 14, 0, 0, 0, 0, 0, 19, 17, 4, 0, 0, 0, 0, 0, 16, 9, 12, 0, + 0, 0, 0, 0, 75, 93, 2, 0, 0, 0, 0, 0, 0, 32, 64, 2, 0, 0, 0, 0, 68, 0, 128,0, 0, 0, 0, 0, 124,108,110,2, 0, 0, 0, 0, 145,68, 16, 1, + 0, 32, 0, 0, 8, 0, 6, 1, 0, 96, 24, 0, 0, 16, 4, 0, 0, 0, 0, 0, 76, 44, 78, 0, 0, 0, 0, 0, 18, 16, 32, 0, 0, 0, 0, 0, 144,96, 16, 0, + 0, 96, 4, 0, 8, 8, 6, 1, 0, 0, 0, 0, 9, 29, 12, 0, 0, 0, 0, 0, 93, 101,20, 1, 0, 0, 0, 0, 8, 8, 12, 1, 0, 0, 0, 0, 32, 8, 6, 2, + 0, 0, 0, 0, 17, 69, 16, 1, 0, 32, 0, 0, 16, 65, 20, 0, 0, 0, 0, 0, 177,9, 12, 2, 0, 0, 0, 0, 21, 81, 16, 0, 0, 0, 0, 0, 0, 33, 76, 1, + 0, 32, 0, 0, 24, 17, 0, 1, 0, 0, 0, 0, 36, 32, 8, 0, 0, 0, 0, 0, 8, 96, 0, 0, 0, 0, 0, 0, 188,125,30, 0, 0, 0, 0, 0, 0, 144,64, 0, + 0, 0, 0, 0, 193,0, 12, 0, 0, 0, 0, 0, 96, 44, 10, 0, 0, 32, 0, 0, 51, 17, 4, 1, 0, 0, 0, 0, 21, 125,40, 1, 0, 32, 0, 0, 17, 65, 36, 1, + 0, 0, 0, 0, 48, 32, 32, 0, 0, 32, 0, 0, 4, 176,72, 0, 0, 0, 0, 0, 128,105,76, 0, 0, 128,0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 110,53, 89, 1, + 0, 0, 0, 0, 64, 9, 16, 0, 0, 0, 0, 0, 149,33, 64, 0, 0, 0, 0, 0, 64, 48, 8, 0, 0, 0, 0, 0, 64, 4, 8, 2, 0, 56, 32, 0, 187,25, 108,0, + 0, 0, 0, 0, 5, 40, 92, 0, 0, 0, 0, 0, 32, 8, 12, 0, 0, 0, 0, 0, 156,40, 10, 0, 0, 0, 0, 0, 8, 17, 4, 0, 0, 0, 0, 0, 66, 41, 14, 2, + 0, 16, 0, 0, 76, 21, 66, 0, 0, 0, 0, 0, 10, 57, 78, 0, 0, 32, 2, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 64, 4, 0, 2, + 0, 0, 0, 0, 90, 40, 14, 0, 0, 68, 0, 0, 27, 225,4, 1, 0, 0, 0, 0, 8, 16, 64, 0, 0, 0, 0, 0, 83, 16, 0, 1, 0, 0, 0, 0, 8, 44, 98, 0, + 0, 0, 0, 0, 12, 4, 16, 0, 0, 0, 6, 0, 219,168,102,0, 0, 32, 2, 0, 129,1, 6, 0, 0, 52, 0, 0, 255,219,126,1, 0, 0, 0, 0, 255,189,254,3, + 0, 0, 0, 0, 14, 8, 8, 0, 0, 0, 0, 0, 40, 17, 6, 1, 0, 0, 0, 0, 148,5, 0, 1, 0, 0, 0, 0, 144,129,4, 0, 0, 0, 0, 0, 152,41, 8, 1, + 0, 0, 0, 0, 130,24, 8, 0, 0, 0, 0, 0, 138,40, 0, 0, 0, 0, 0, 0, 112,121,4, 0, 0, 0, 0, 0, 12, 16, 6, 0, 0, 0, 0, 0, 16, 120,2, 0, + 0, 0, 0, 0, 146,48, 0, 1, 0, 0, 0, 0, 91, 40, 2, 0, 0, 0, 0, 0, 26, 73, 12, 0, 0, 0, 0, 0, 20, 16, 68, 0, 0, 0, 0, 0, 136,88, 6, 0, + 0, 0, 0, 0, 63, 125,104,3, 0, 0, 0, 0, 23, 81, 68, 0, 0, 0, 0, 0, 59, 241,0, 0, 0, 0, 0, 0, 17, 13, 4, 0, 0, 0, 0, 0, 255,253,92, 2, + 0, 0, 0, 0, 64, 8, 66, 0, 0, 0, 0, 0, 145,73, 0, 2, 0, 0, 0, 0, 51, 205,22, 0, 0, 0, 0, 0, 240,8, 2, 0, 0, 32, 2, 0, 17, 72, 6, 0, + 0, 0, 0, 0, 53, 0, 4, 0, 0, 0, 0, 0, 0, 0, 116,0, 0, 0, 0, 0, 0, 2, 96, 0, 0, 0, 0, 0, 50, 1, 8, 0, 0, 0, 0, 0, 176,136,0, 0, + 0, 0, 0, 0, 40, 0, 14, 1, 0, 224,44, 0, 127,125,110,3, 0, 0, 0, 0, 144,5, 2, 0, 0, 0, 0, 0, 16, 25, 100,0, 0, 0, 0, 0, 64, 0, 68, 0, + 0, 32, 0, 0, 21, 1, 6, 1, 0, 96, 0, 0, 132,4, 12, 0, 0, 40, 0, 0, 17, 41, 30, 2, 0, 32, 0, 0, 149,101,28, 3, 0, 0, 0, 0, 1, 100,20, 0, + 0, 0, 0, 0, 144,105,28, 2, 0, 34, 0, 0, 140,56, 70, 0, 0, 0, 0, 0, 4, 96, 54, 0, 0, 96, 0, 0, 17, 17, 4, 0, 0, 0, 0, 0, 17, 16, 14, 0, + 0, 0, 0, 0, 46, 176,12, 0, 0, 0, 0, 0, 17, 37, 6, 0, 0, 0, 0, 0, 0, 128,20, 0, 0, 0, 0, 0, 16, 97, 14, 0, 0, 0, 0, 0, 128,8, 2, 1, + 0, 0, 0, 0, 255,191,122,3, 0, 0, 0, 0, 76, 60, 18, 0, 0, 0, 0, 0, 160,17, 64, 1, 0, 0, 0, 0, 16, 1, 12, 1, 0, 32, 0, 0, 0, 1, 0, 1, + 0, 32, 0, 0, 50, 129,14, 1, 0, 0, 0, 0, 74, 168,38, 0, 0, 32, 0, 0, 144,16, 68, 1, 0, 0, 0, 0, 147,76, 70, 0, 0, 0, 0, 0, 33, 12, 0, 0, + 0, 0, 0, 0, 16, 40, 4, 1, 0, 0, 0, 0, 81, 112,0, 0, 0, 0, 0, 0, 126,60, 14, 0, 0, 0, 0, 0, 251,93, 70, 0, 0, 0, 0, 0, 64, 0, 18, 0, + 0, 0, 0, 0, 17, 3, 18, 0, 0, 0, 0, 0, 0, 1, 8, 1, 0, 0, 0, 0, 19, 29, 8, 2, 0, 0, 0, 0, 177,209,16, 1, 0, 32, 0, 0, 0, 0, 10, 0, + 0, 0, 0, 0, 223,116,13, 2, 0, 0, 0, 0, 16, 72, 10, 0, 0, 0, 0, 0, 175,253,78, 0, 0, 32, 0, 0, 21, 33, 4, 1, 0, 96, 0, 0, 0, 1, 36, 0, + 0, 0, 0, 0, 86, 253,34, 0, 0, 0, 0, 0, 68, 137,12, 0, 0, 32, 0, 0, 19, 73, 84, 0, 0, 0, 0, 0, 128,12, 12, 2, 0, 0, 0, 0, 31, 0, 2, 0, + 0, 240,4, 0, 192,100,6, 1, 0, 96, 0, 0, 17, 0, 4, 0, 0, 64, 0, 0, 126,190,174,0, 0, 32, 0, 0, 58, 57, 22, 1, 0, 0, 0, 0, 2, 32, 6, 1, + 0, 0, 0, 0, 137,16, 4, 0, 0, 0, 0, 0, 226,40, 2, 0, 0, 0, 0, 0, 16, 41, 4, 1, 0, 0, 0, 0, 81, 24, 68, 0, 0, 0, 0, 0, 80, 169,76, 0, + 0, 0, 0, 0, 147,49, 68, 0, 0, 0, 0, 0, 16, 32, 4, 2, 0, 0, 0, 0, 17, 217,20, 0, 0, 0, 0, 0, 93, 36, 12, 0, 0, 0, 0, 0, 130,16, 14, 0, + 0, 32, 0, 0, 17, 9, 6, 1, 0, 0, 0, 0, 80, 60, 6, 0, 0, 0, 0, 0, 148,0, 8, 2, 0, 0, 0, 0, 6, 16, 0, 0, 0, 0, 0, 0, 255,255,126,1, + 0, 0, 0, 0, 191,249,76, 1, 0, 0, 0, 0, 10, 8, 10, 0, 0, 0, 0, 0, 230,44, 14, 1, 0, 0, 0, 0, 48, 4, 4, 0, 0, 0, 0, 0, 8, 41, 4, 0, + 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 17, 76, 2, 0, 0, 0, 0, 0, 12, 8, 6, 1, 0, 0, 0, 0, 63, 201,12, 2, 0, 0, 0, 0, 3, 144,0, 0, + 0, 0, 0, 0, 80, 1, 16, 1, 0, 224,2, 0, 174,28, 70, 1, 0, 0, 0, 0, 72, 140,14, 0, 0, 0, 0, 0, 241,205,68, 1, 0, 0, 0, 0, 31, 127,10, 3, + 0, 0, 0, 0, 168,4, 6, 1, 0, 96, 8, 0, 19, 65, 76, 1, 0, 0, 0, 0, 32, 65, 4, 2, 0, 0, 0, 0, 2, 8, 44, 0, 0, 0, 0, 0, 128,4, 20, 0, + 0, 0, 0, 0, 148,12, 12, 2, 0, 0, 0, 0, 125,0, 10, 0, 0, 0, 0, 0, 17, 16, 8, 1, 0, 0, 16, 0, 17, 97, 16, 3, 0, 0, 0, 0, 239,189,124,3, + 0, 0, 0, 0, 144,4, 1, 2, 0, 0, 0, 0, 59, 9, 8, 0, 0, 0, 0, 0, 1, 25, 0, 0, 0, 0, 0, 0, 49, 0, 4, 0, 0, 0, 0, 0, 0, 66, 4, 0, + 0, 0, 0, 0, 121,96, 6, 0, 0, 0, 0, 0, 48, 8, 84, 0, 0, 32, 0, 0, 0, 40, 70, 0, 0, 0, 0, 0, 0, 200,4, 0, 0, 0, 0, 0, 18, 48, 0, 0, + 0, 32, 0, 0, 181,209,28, 2, 0, 0, 0, 0, 20, 0, 4, 2, 0, 0, 0, 0, 52, 16, 4, 1, 0, 0, 0, 0, 36, 34, 44, 0, 0, 0, 0, 0, 230,0, 4, 0, + 0, 0, 0, 0, 18, 32, 4, 2, 0, 0, 0, 0, 138,32, 12, 0, 0, 0, 0, 0, 255,191,124,1, 0, 0, 0, 0, 0, 20, 8, 0, 0, 0, 0, 0, 10, 128,8, 0, + 0, 32, 0, 0, 22, 88, 76, 0, 0, 0, 0, 0, 102,0, 12, 0, 0, 0, 0, 0, 16, 48, 0, 2, 0, 0, 0, 0, 20, 25, 0, 0, 0, 0, 0, 0, 64, 4, 16, 0, + 0, 0, 0, 0, 127,180,172,2, 0, 0, 0, 0, 16, 104,16, 0, 0, 0, 0, 0, 96, 4, 8, 0, 0, 160,0, 0, 34, 64, 6, 0, 0, 0, 0, 0, 18, 136,0, 0, + 0, 0, 0, 0, 177,1, 4, 1, 0, 0, 1, 0, 20, 137,12, 0, 0, 0, 0, 0, 20, 16, 8, 2, 0, 0, 0, 0, 254,255,124,3, 0, 0, 0, 0, 18, 24, 4, 0, + 0, 0, 0, 0, 19, 16, 5, 1, 0, 0, 0, 0, 65, 0, 8, 2, 0, 32, 0, 0, 146,152,0, 0, 0, 0, 0, 0, 144,12, 16, 0, 0, 0, 0, 0, 128,16, 0, 2, + 0, 0, 0, 0, 74, 128,12, 0, 0, 0, 0, 0, 26, 16, 0, 0, 0, 0, 0, 0, 94, 177,44, 3, 0, 0, 0, 0, 1, 145,0, 0, 0, 0, 0, 0, 128,0, 12, 3, + 0, 0, 0, 0, 44, 134,4, 0, 0, 0, 0, 0, 191,188,46, 3, 0, 0, 0, 0, 132,4, 0, 2, 0, 0, 0, 0, 0, 24, 10, 1, 0, 32, 4, 0, 26, 57, 76, 3, + 0, 0, 0, 0, 17, 64, 48, 0, 0, 32, 2, 0, 0, 0, 84, 0, 0, 0, 0, 0, 14, 52, 38, 0, 0, 0, 0, 0, 4, 9, 8, 0, 0, 0, 0, 0, 50, 144,0, 0, + 0, 0, 0, 0, 176,193,4, 1, 0, 0, 0, 0, 64, 36, 8, 0, 0, 32, 0, 0, 17, 197,0, 0, 0, 0, 0, 0, 92, 61, 74, 2, 0, 0, 0, 0, 16, 33, 0, 3, + 0, 0, 0, 0, 19, 0, 4, 0, 0, 0, 0, 0, 144,8, 12, 2, 0, 0, 0, 0, 22, 120,134,0, 0, 0, 0, 0, 8, 32, 4, 2, 0, 0, 0, 0, 1, 40, 34, 2, + 0, 0, 0, 0, 255,251,126,3, 0, 0, 0, 0, 8, 168,14, 0, 0, 0, 0, 0, 20, 1, 2, 0, 0, 0, 0, 0, 13, 2, 8, 0, 0, 0, 0, 0, 148,197,24, 1, + 0, 0, 0, 0, 5, 0, 11, 0, 0, 0, 0, 0, 17, 32, 4, 2, 0, 0, 0, 0, 16, 9, 2, 1, 0, 0, 0, 0, 212,4, 10, 0, 0, 96, 8, 0, 48, 65, 0, 0, + 0, 0, 0, 0, 17, 77, 0, 1, 0, 32, 4, 0, 61, 89, 12, 1, 0, 32, 4, 0, 16, 0, 4, 0, 0, 32, 4, 0, 0, 64, 0, 0, 0, 32, 0, 0, 12, 0, 0, 0, + 0, 0, 0, 0, 155,73, 68, 0, 0, 0, 0, 0, 16, 4, 10, 0, 0, 0, 0, 0, 139,40, 30, 3, 0, 0, 0, 0, 32, 3, 0, 1, 0, 0, 0, 0, 217,9, 2, 0, + 0, 0, 0, 0, 130,41, 66, 0, 0, 96, 0, 0, 30, 152,6, 1, 0, 0, 0, 0, 0, 20, 16, 1, 0, 0, 0, 0, 132,44, 14, 2, 0, 0, 0, 0, 21, 73, 12, 0, + 0, 0, 0, 0, 145,69, 18, 0, 0, 0, 0, 0, 2, 64, 26, 0, 0, 0, 0, 0, 53, 205,28, 3, 0, 0, 0, 0, 4, 1, 64, 1, 0, 0, 0, 0, 4, 55, 4, 1, + 0, 0, 0, 0, 16, 180,40, 0, 0, 0, 0, 0, 17, 64, 2, 2, 0, 0, 0, 0, 1, 129,4, 0, 0, 0, 0, 0, 19, 249,14, 1, 0, 0, 0, 0, 14, 32, 14, 1, + 0, 0, 0, 0, 1, 13, 4, 0, 0, 0, 0, 0, 8, 36, 8, 1, 0, 112,44, 0, 165,73, 44, 0, 16, 160,0, 0, 127,125,94, 1, 0, 0, 0, 0, 147,89, 15, 0, + 0, 0, 0, 0, 144,40, 2, 1, 0, 0, 0, 0, 16, 8, 106,0, 0, 0, 0, 0, 80, 8, 8, 0, 0, 96, 8, 0, 10, 0, 36, 0, 0, 0, 0, 0, 1, 64, 2, 2, + 0, 0, 0, 0, 2, 48, 0, 2, 0, 128,0, 0, 17, 233,2, 0, 0, 96, 59, 0, 255,255,252,0, 0, 0, 0, 0, 2, 0, 64, 1, 0, 0, 0, 0, 0, 248,16, 0, + 0, 0, 0, 0, 16, 112,0, 0, 0, 32, 0, 0, 4, 34, 134,0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 20, 192,8, 1, 0, 0, 0, 0, 127,255,122,1, + 0, 0, 0, 0, 134,38, 8, 0, 0, 0, 0, 0, 32, 40, 12, 0, 0, 0, 0, 0, 23, 1, 4, 0, 0, 0, 0, 0, 8, 64, 6, 0, 0, 0, 0, 0, 83, 32, 8, 1, + 0, 0, 0, 0, 1, 168,8, 1, 0, 0, 0, 0, 149,221,29, 3, 0, 32, 4, 0, 3, 33, 4, 1, 0, 0, 0, 0, 16, 20, 64, 0, 0, 0, 0, 0, 180,207,58, 1, + 0, 0, 0, 0, 0, 2, 2, 1, 0, 0, 0, 0, 153,67, 16, 1, 0, 0, 0, 0, 17, 65, 10, 1, 0, 0, 0, 0, 157,33, 26, 0, 0, 0, 0, 0, 72, 34, 4, 0, + 0, 0, 0, 0, 16, 196,4, 0, 0, 0, 0, 0, 12, 1, 2, 0, 0, 0, 0, 0, 1, 77, 0, 2, 0, 0, 1, 0, 0, 0, 4, 2, 0, 0, 0, 0, 238,189,62, 3, + 0, 0, 0, 0, 0, 145,0, 1, 0, 0, 0, 0, 64, 34, 0, 0, 0, 0, 0, 0, 48, 8, 4, 1, 0, 0, 0, 0, 223,37, 76, 2, 0, 0, 0, 0, 18, 64, 8, 0, + 0, 0, 0, 0, 27, 113,26, 1, 0, 0, 0, 0, 128,72, 68, 2, 0, 0, 0, 0, 0, 80, 0, 1, 0, 0, 0, 0, 50, 24, 64, 0, 0, 0, 0, 0, 149,25, 12, 2, + 0, 0, 0, 0, 17, 33, 0, 2, 0, 0, 0, 0, 253,185,14, 3, 0, 0, 0, 0, 8, 32, 10, 2, 0, 0, 0, 0, 48, 145,12, 1, 0, 0, 0, 0, 19, 9, 0, 0, + 0, 0, 0, 0, 24, 184,14, 2, 0, 96, 4, 0, 219,249,92, 1, 0, 0, 0, 0, 84, 8, 8, 0, 0, 0, 0, 0, 28, 68, 12, 0, 0, 0, 0, 0, 0, 41, 12, 0, + 0, 0, 0, 0, 253,184,46, 2, 0, 0, 0, 0, 6, 0, 10, 0, 0, 0, 0, 0, 2, 16, 68, 0, 0, 0, 0, 0, 122,36, 12, 0, 0, 0, 0, 0, 161,0, 2, 1, + 0, 32, 0, 0, 17, 9, 4, 0, 0, 0, 0, 0, 115,81, 0, 0, 0, 0, 0, 0, 99, 232,2, 1, 0, 0, 0, 0, 0, 160,4, 0, 0, 32, 0, 0, 32, 128,4, 0, + 0, 0, 0, 0, 63, 252,62, 2, 0, 0, 0, 0, 1, 76, 0, 0, 0, 0, 0, 0, 145,184,104,0, 0, 32, 0, 0, 128,32, 0, 0, 0, 0, 0, 0, 19, 213,4, 0, + 0, 0, 0, 0, 129,72, 12, 0, 0, 0, 0, 0, 93, 96, 8, 0, 0, 0, 0, 0, 64, 164,128,0, 0, 0, 0, 0, 144,89, 2, 0, 0, 0, 0, 0, 8, 160,96, 0, + 0, 0, 0, 0, 128,96, 16, 0, 0, 0, 0, 0, 17, 81, 22, 0, 0, 0, 4, 0, 1, 16, 12, 1, 0, 168,2, 0, 17, 65, 4, 0, 0, 0, 0, 0, 21, 253,88, 1, + 0, 0, 0, 0, 46, 56, 14, 0, 0, 0, 0, 0, 6, 128,4, 0, 0, 0, 0, 0, 68, 44, 110,0, 0, 0, 0, 0, 4, 156,12, 0, 0, 0, 0, 0, 38, 24, 4, 0, + 0, 0, 0, 0, 12, 176,4, 0, 0, 0, 0, 0, 5, 68, 16, 0, 16, 228,7, 0, 223,255,254,3, 0, 0, 1, 0, 32, 0, 0, 0, 0, 0, 16, 0, 255,255,255,3, + 0, 0, 0, 0, 32, 12, 2, 0, 0, 0, 0, 0, 19, 73, 22, 0, 0, 0, 0, 0, 68, 12, 14, 0, 0, 0, 0, 0, 5, 96, 12, 0, 0, 32, 2, 0, 13, 8, 78, 0, + 0, 0, 0, 0, 1, 104,2, 0, 0, 0, 0, 0, 157,109,28, 1, 0, 0, 0, 0, 2, 36, 2, 0, 0, 0, 0, 0, 2, 176,4, 0, 0, 0, 0, 0, 221,153,8, 1, + 0, 0, 0, 0, 0, 112,20, 0, 0, 0, 0, 0, 68, 6, 8, 0, 0, 0, 0, 0, 49, 77, 30, 0, 0, 0, 0, 0, 211,88, 20, 0, 0, 0, 0, 0, 14, 56, 8, 0, + 0, 0, 0, 0, 0, 8, 42, 0, 0, 0, 0, 0, 20, 129,4, 0, 0, 0, 0, 0, 246,238,78, 3, 0, 0, 0, 0, 210,201,68, 0, 0, 0, 0, 0, 65, 64, 24, 0, + 0, 0, 0, 0, 0, 17, 16, 0, 0, 0, 0, 0, 204,125,30, 1, 0, 0, 16, 0, 173,113,30, 0, 0, 0, 0, 0, 255,221,124,1, 0, 0, 0, 0, 195,56, 46, 1, + 0, 0, 0, 0, 2, 32, 6, 0, 0, 0, 0, 0, 55, 16, 28, 0, 0, 0, 16, 0, 19, 1, 12, 1, 0, 0, 0, 0, 83, 81, 16, 1, 0, 0, 0, 0, 204,160,6, 0, + 0, 0, 0, 0, 19, 221,86, 0, 0, 0, 0, 0, 72, 45, 30, 1, 0, 0, 0, 0, 65, 65, 0, 0, 0, 0, 0, 0, 8, 13, 6, 2, 0, 0, 0, 0, 21, 60, 6, 1, + 0, 0, 0, 0, 255,127,92, 3, 0, 0, 0, 0, 194,37, 0, 0, 0, 0, 0, 0, 19, 66, 18, 1, 0, 0, 1, 0, 68, 46, 5, 1, 0, 0, 0, 0, 17, 105,22, 1, + 0, 0, 0, 0, 1, 17, 8, 0, 0, 0, 0, 0, 1, 16, 8, 1, 0, 0, 0, 0, 65, 84, 12, 0, 0, 0, 0, 0, 25, 81, 132,0, 0, 0, 0, 0, 136,0, 0, 2, + 0, 0, 0, 0, 136,36, 2, 1, 0, 0, 0, 0, 16, 13, 8, 1, 0, 0, 0, 0, 145,201,22, 0, 0, 0, 0, 0, 128,104,12, 0, 0, 0, 0, 0, 1, 98, 2, 0, + 0, 0, 0, 0, 136,33, 2, 0, 16, 0, 0, 0, 219,255,127,3, 0, 0, 0, 0, 138,172,76, 3, 0, 0, 0, 0, 32, 54, 1, 0, 0, 0, 0, 0, 34, 128,96, 0, + 0, 0, 0, 0, 64, 32, 12, 0, 0, 0, 0, 0, 17, 8, 28, 0, 0, 0, 0, 0, 66, 48, 2, 0, 0, 0, 0, 0, 52, 32, 0, 0, 0, 0, 0, 0, 150,29, 12, 0, + 0, 0, 0, 0, 1, 23, 0, 0, 0, 0, 0, 0, 58, 8, 14, 0, 0, 0, 0, 0, 213,123,30, 1, 0, 0, 0, 0, 0, 24, 38, 1, 0, 0, 0, 0, 0, 112,2, 0, + 0, 0, 0, 0, 128,112,8, 1, 16, 0, 0, 0, 87, 168,14, 2, 0, 0, 0, 0, 3, 16, 0, 0, 0, 0, 0, 0, 64, 0, 24, 1, 0, 0, 0, 0, 169,33, 64, 0, + 0, 0, 0, 0, 73, 32, 0, 0, 0, 8, 0, 0, 17, 209,16, 0, 0, 0, 0, 0, 12, 41, 68, 0, 0, 0, 0, 0, 27, 120,12, 1, 0, 112,36, 0, 4, 16, 4, 0, + 0, 32, 0, 0, 25, 16, 0, 2, 0, 0, 0, 0, 17, 17, 0, 3, 0, 0, 0, 0, 201,128,64, 2, 0, 0, 0, 0, 49, 16, 18, 0, 0, 0, 0, 0, 0, 0, 1, 2, + 0, 0, 1, 0, 230,188,15, 0, 0, 0, 0, 0, 16, 81, 8, 0, 16, 0, 0, 0, 16, 8, 0, 0, 0, 128,0, 0, 17, 89, 68, 0, 0, 0, 0, 0, 56, 1, 4, 1, + 0, 0, 0, 0, 24, 137,8, 0, 0, 0, 0, 0, 133,124,28, 0, 0, 32, 0, 0, 29, 49, 12, 0, 0, 0, 32, 0, 16, 65, 0, 0, 0, 0, 0, 0, 4, 68, 5, 0, + 0, 32, 0, 0, 4, 8, 0, 0, 0, 0, 0, 0, 59, 1, 130,0, 0, 96, 0, 0, 2, 0, 4, 0, 0, 16, 0, 0, 204,190,46, 0, 0, 32, 0, 0, 99, 9, 4, 1, + 0, 32, 0, 0, 16, 8, 0, 1, 0, 0, 0, 0, 48, 11, 0, 0, 0, 0, 0, 0, 145,32, 24, 0, 0, 16, 0, 0, 17, 32, 22, 0, 0, 0, 0, 0, 68, 24, 156,0, + 0, 0, 0, 0, 17, 45, 24, 0, 0, 0, 0, 0, 125,125,28, 0, 0, 0, 0, 0, 108,244,172,0, 0, 0, 0, 0, 129,72, 2, 0, 16, 0, 0, 0, 17, 81, 28, 1, + 0, 0, 0, 0, 32, 0, 6, 2, 0, 0, 0, 0, 20, 96, 4, 0, 0, 0, 0, 0, 19, 245,16, 0, 0, 32, 0, 0, 64, 32, 4, 0, 0, 48, 0, 0, 81, 201,28, 0, + 0, 32, 0, 0, 1, 0, 16, 0, 0, 32, 0, 0, 0, 16, 14, 0, 0, 0, 0, 0, 255,249,30, 2, 0, 0, 0, 0, 70, 56, 6, 0, 0, 0, 0, 0, 0, 64, 18, 1, + 0, 0, 0, 0, 10, 48, 14, 1, 0, 0, 0, 0, 67, 68, 80, 0, 0, 4, 0, 0, 17, 65, 0, 1, 0, 112,0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 36, 32, 2, 0, + 0, 0, 0, 0, 145,9, 4, 0, 0, 0, 0, 0, 172,0, 8, 0, 0, 0, 0, 0, 181,137,16, 0, 0, 0, 0, 0, 223,255,126,2, 0, 0, 0, 0, 138,49, 48, 2, + 0, 0, 0, 0, 35, 188,4, 2, 0, 0, 0, 0, 4, 32, 4, 1, 0, 32, 0, 0, 52, 169,4, 2, 0, 0, 0, 0, 2, 40, 14, 3, 0, 32, 0, 0, 51, 72, 12, 0, + 0, 0, 0, 0, 133,124,14, 0, 0, 240,32, 0, 27, 209,20, 1, 0, 0, 0, 0, 2, 48, 40, 0, 0, 32, 0, 0, 16, 16, 4, 0, 0, 0, 0, 0, 38, 52, 12, 0, + 0, 32, 0, 0, 0, 40, 4, 0, 0, 0, 0, 0, 145,73, 30, 2, 0, 0, 0, 0, 204,152,18, 0, 0, 0, 0, 0, 2, 0, 6, 2, 0, 0, 0, 0, 17, 84, 4, 0, + 0, 0, 0, 0, 21, 17, 8, 0, 0, 0, 0, 0, 12, 32, 6, 0, 0, 96, 6, 0, 2, 0, 4, 0, 0, 8, 0, 0, 18, 65, 22, 0, 0, 0, 0, 0, 3, 69, 64, 0, + 0, 16, 0, 0, 29, 97, 250,1, 0, 0, 0, 0, 94, 253,254,1, 0, 0, 0, 0, 17, 0, 134,0, 0, 0, 0, 0, 24, 65, 0, 1, 0, 0, 0, 0, 16, 4, 20, 0, + 0, 0, 0, 0, 147,25, 0, 0, 0, 0, 0, 0, 19, 144,0, 0, 0, 0, 0, 0, 209,199,12, 0, 0, 0, 0, 0, 112,9, 20, 1, 0, 0, 0, 0, 1, 160,6, 0, + 16, 0, 0, 0, 213,64, 12, 0, 0, 0, 0, 0, 8, 8, 36, 0, 0, 0, 0, 0, 0, 28, 26, 0, 0, 0, 0, 0, 4, 32, 30, 0, 0, 0, 0, 0, 49, 64, 18, 0, + 0, 0, 0, 0, 8, 56, 4, 0, 0, 0, 0, 0, 0, 72, 10, 0, 0, 0, 0, 0, 129,97, 2, 0, 0, 0, 16, 0, 16, 0, 0, 0, 0, 0, 0, 0, 8, 40, 64, 0, + 0, 0, 0, 0, 17, 89, 64, 0, 0, 96, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 14, 168,14, 0, 0, 0, 0, 0, 2, 64, 2, 0, 0, 0, 0, 0, 0, 144,40, 0, + 16, 0, 0, 0, 43, 81, 92, 0, 0, 0, 0, 0, 8, 8, 38, 0, 0, 0, 0, 0, 17, 96, 32, 0, 0, 0, 0, 0, 24, 176,6, 0, 0, 0, 0, 0, 4, 160,16, 0, + 0, 0, 0, 0, 145,177,28, 2, 0, 0, 0, 0, 2, 17, 16, 0, 16, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 64, 48, 4, 0, 0, 0, 0, 0, 161,1, 2, 0, + 0, 0, 0, 0, 8, 8, 34, 0, 0, 0, 0, 0, 223,124,174,0, 0, 0, 0, 0, 42, 188,62, 0, 0, 0, 0, 0, 82, 16, 0, 0, 0, 0, 0, 0, 1, 16, 6, 1, + 0, 0, 0, 0, 65, 28, 0, 0, 0, 0, 0, 0, 80, 44, 4, 0, 16, 32, 0, 0, 0, 1, 36, 1, 0, 32, 0, 0, 18, 129,4, 0, 0, 0, 0, 0, 8, 0, 28, 1, + 16, 0, 0, 0, 0, 65, 12, 0, 0, 0, 0, 0, 27, 121,30, 0, 0, 0, 0, 0, 18, 0, 16, 1, 0, 0, 0, 0, 19, 217,20, 0, 0, 240,8, 0, 24, 67, 44, 0, + 0, 0, 0, 0, 82, 32, 0, 0, 0, 0, 34, 0, 59, 253,44, 0, 0, 0, 0, 0, 12, 32, 128,2, 0, 0, 0, 0, 219,72, 77, 1, 0, 0, 0, 0, 98, 56, 0, 0, + 0, 0, 0, 0, 65, 0, 36, 0, 0, 0, 0, 0, 20, 185,84, 0, 0, 0, 0, 0, 17, 72, 68, 0, 0, 162,0, 0, 56, 128,12, 0, 0, 0, 0, 0, 36, 136,36, 0, + 0, 0, 0, 0, 87, 240,92, 0, 0, 0, 0, 0, 88, 0, 12, 0, 0, 0, 0, 0, 0, 192,64, 0, 0, 0, 0, 0, 27, 33, 4, 0, 0, 0, 0, 0, 0, 48, 204,0, + 0, 0, 0, 0, 93, 120,14, 1, 0, 0, 1, 0, 64, 8, 4, 0, 0, 0, 0, 0, 16, 161,4, 0, 0, 0, 0, 0, 90, 4, 0, 0, 0, 240,46, 0, 30, 65, 4, 0, + 0, 0, 0, 0, 67, 57, 14, 1, 0, 0, 0, 0, 10, 64, 8, 0, 0, 0, 0, 0, 4, 129,2, 0, 0, 0, 0, 0, 99, 56, 6, 0, 0, 0, 0, 0, 255,255,238,2, + 0, 0, 0, 0, 64, 112,2, 0, 0, 0, 0, 0, 193,98, 0, 0, 0, 0, 0, 0, 18, 73, 80, 0, 0, 0, 0, 0, 19, 33, 0, 1, 0, 0, 0, 0, 16, 41, 12, 0, + 0, 0, 0, 0, 27, 17, 66, 1, 0, 0, 0, 0, 234,188,30, 0, 0, 0, 0, 0, 88, 4, 8, 0, 0, 0, 0, 0, 85, 48, 6, 0, 0, 0, 0, 0, 64, 2, 0, 2, + 0, 0, 0, 0, 33, 72, 8, 0, 0, 0, 0, 0, 17, 33, 8, 1, 0, 0, 0, 0, 209,40, 18, 0, 0, 240,62, 0, 54, 153,78, 0, 0, 240,44, 0, 0, 0, 4, 0, + 0, 32, 0, 0, 17, 40, 6, 1, 0, 0, 0, 0, 129,5, 42, 0, 0, 0, 0, 0, 123,121,28, 2, 0, 0, 0, 0, 8, 17, 10, 1, 0, 32, 0, 0, 31, 221,30, 0, + 0, 32, 0, 0, 144,0, 14, 0, 0, 0, 0, 0, 17, 72, 22, 0, 0, 32, 0, 0, 16, 25, 68, 0, 0, 96, 0, 0, 47, 236,206,3, 0, 0, 0, 0, 132,136,8, 0, + 0, 0, 0, 0, 8, 36, 12, 0, 0, 0, 0, 0, 144,33, 4, 0, 0, 0, 0, 0, 160,40, 142,0, 0, 0, 0, 0, 255,253,30, 1, 0, 32, 0, 0, 0, 18, 4, 0, + 0, 0, 0, 0, 1, 73, 6, 0, 0, 0, 0, 0, 81, 8, 68, 0, 0, 32, 0, 0, 18, 1, 0, 0, 0, 0, 0, 0, 11, 8, 6, 1, 0, 0, 0, 0, 16, 88, 8, 0, + 0, 0, 0, 0, 0, 205,30, 0, 0, 0, 0, 0, 16, 25, 20, 1, 0, 0, 0, 0, 12, 40, 10, 1, 0, 0, 0, 0, 16, 160,0, 0, 0, 0, 0, 0, 21, 197,30, 1, + 0, 0, 0, 0, 10, 49, 4, 0, 0, 0, 0, 0, 4, 176,32, 0, 0, 0, 0, 0, 159,81, 20, 2, 0, 0, 0, 0, 17, 12, 0, 0, 0, 0, 0, 0, 181,89, 30, 2, + 0, 96, 0, 0, 17, 1, 4, 0, 0, 0, 0, 0, 5, 4, 16, 0, 0, 0, 0, 0, 136,1, 6, 0, 0, 32, 0, 0, 1, 32, 64, 0, 0, 0, 0, 0, 1, 97, 0, 2, + 0, 0, 1, 0, 35, 64, 8, 0, 0, 32, 0, 0, 19, 9, 16, 0, 0, 0, 0, 0, 0, 24, 136,0, 0, 128,0, 0, 1, 98, 0, 0, 0, 64, 0, 0, 32, 17, 36, 0, + 0, 0, 0, 0, 68, 32, 6, 0, 0, 0, 0, 0, 0, 16, 8, 1, 0, 32, 0, 0, 0, 64, 4, 2, 0, 0, 0, 0, 64, 40, 6, 2, 0, 96, 0, 0, 8, 0, 8, 0, + 0, 0, 0, 0, 149,68, 1, 2, 0, 0, 0, 0, 153,81, 8, 1, 0, 32, 0, 0, 0, 9, 0, 1, 0, 0, 0, 0, 40, 187,102,0, 0, 0, 0, 0, 65, 2, 0, 0, + 0, 0, 0, 0, 48, 132,0, 0, 0, 0, 0, 0, 33, 65, 24, 0, 0, 0, 0, 0, 81, 104,20, 0, 0, 0, 0, 0, 8, 40, 40, 0, 16, 0, 0, 0, 17, 77, 16, 1, + 0, 0, 0, 0, 191,125,60, 2, 0, 0, 0, 0, 40, 32, 6, 0, 0, 0, 0, 0, 0, 116,32, 0, 0, 0, 0, 0, 19, 49, 68, 1, 0, 0, 0, 0, 40, 16, 14, 1, + 0, 96, 0, 0, 55, 223,92, 1, 0, 0, 0, 0, 128,41, 14, 2, 0, 32, 0, 0, 145,69, 20, 2, 0, 0, 0, 0, 0, 12, 40, 0, 0, 0, 0, 0, 129,0, 2, 2, + 0, 0, 0, 0, 128,45, 6, 1, 0, 0, 0, 0, 28, 12, 12, 0, 0, 96, 2, 0, 94, 12, 12, 1, 0, 0, 0, 0, 208,148,2, 1, 0, 0, 0, 0, 148,197,0, 0, + 0, 0, 0, 0, 95, 111,14, 3, 0, 0, 0, 0, 0, 41, 68, 0, 0, 0, 0, 0, 8, 12, 14, 1, 0, 0, 0, 0, 17, 2, 54, 2, 0, 0, 0, 0, 85, 96, 12, 0, + 0, 96, 53, 64, 129,0, 0, 0, 0, 0, 0, 0, 254,252,78, 2, 0, 0, 4, 0, 51, 85, 12, 0, 0, 32, 0, 0, 144,65, 0, 0, 0, 0, 0, 0, 19, 0, 20, 0, + 0, 0, 0, 0, 21, 128,12, 0, 0, 0, 0, 0, 19, 153,0, 0, 0, 2, 0, 0, 253,253,12, 0, 0, 0, 0, 0, 4, 40, 0, 2, 0, 0, 0, 0, 0, 12, 14, 2, + 0, 0, 0, 0, 64, 41, 6, 0, 0, 0, 0, 0, 25, 9, 4, 0, 0, 0, 0, 0, 149,193,0, 1, 0, 0, 0, 0, 127,245,63, 1, 0, 0, 0, 0, 17, 67, 16, 0, + 0, 0, 0, 0, 16, 9, 64, 0, 0, 0, 0, 0, 1, 40, 4, 3, 0, 0, 0, 0, 83, 33, 40, 1, 0, 0, 0, 0, 81, 65, 17, 0, 0, 0, 0, 0, 0, 65, 6, 0, + 0, 0, 0, 0, 4, 53, 4, 0, 0, 0, 0, 0, 8, 41, 0, 0, 0, 0, 0, 0, 78, 106,4, 3, 0, 0, 32, 0, 0, 64, 4, 0, 0, 0, 0, 0, 28, 106,4, 0, + 0, 0, 0, 0, 144,65, 8, 0, 0, 16, 0, 0, 16, 65, 22, 0, 0, 0, 0, 0, 80, 64, 2, 0, 0, 0, 16, 0, 149,65, 12, 0, 0, 0, 0, 0, 3, 68, 2, 1, + 0, 0, 0, 0, 145,113,12, 2, 0, 0, 32, 0, 0, 32, 14, 0, 0, 0, 0, 0, 207,186,46, 0, 0, 0, 0, 0, 27, 153,12, 1, 0, 0, 0, 0, 80, 33, 8, 0, + 0, 0, 0, 0, 1, 80, 4, 0, 0, 0, 0, 0, 19, 113,44, 0, 0, 0, 0, 0, 17, 17, 2, 0, 0, 0, 0, 0, 23, 169,14, 0, 0, 0, 0, 0, 148,9, 4, 2, + 0, 0, 0, 0, 181,217,33, 0, 16, 0, 0, 0, 0, 8, 0, 0, 0, 96, 0, 0, 51, 97, 22, 3, 0, 0, 0, 0, 254,255,254,1, 0, 0, 0, 0, 17, 64, 16, 2, + 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 0, 144,5, 8, 3, 0, 32, 0, 0, 25, 0, 70, 1, 0, 32, 0, 0, 19, 9, 68, 0, 0, 0, 0, 0, 8, 80, 6, 0, + 0, 0, 0, 0, 33, 1, 8, 0, 0, 0, 0, 0, 146,73, 68, 0, 0, 32, 0, 0, 145,89, 20, 0, 0, 32, 0, 0, 16, 128,0, 0, 0, 0, 0, 0, 22, 216,70, 0, + 0, 0, 0, 0, 87, 53, 29, 2, 0, 32, 0, 0, 255,255,116,1, 0, 0, 0, 0, 4, 24, 136,0, 0, 0, 0, 0, 16, 65, 68, 0, 0, 0, 0, 0, 4, 48, 144,0, + 0, 0, 0, 0, 153,128,4, 0, 0, 0, 0, 0, 128,132,12, 0, 0, 32, 0, 0, 20, 17, 0, 1, 0, 0, 0, 0, 82, 48, 140,0, 0, 0, 0, 0, 128,48, 64, 2, + 0, 0, 0, 0, 17, 101,0, 0, 0, 0, 0, 0, 64, 41, 0, 0, 0, 32, 0, 0, 20, 73, 4, 0, 0, 0, 0, 0, 8, 8, 132,0, 0, 0, 0, 0, 21, 40, 100,0, + 0, 0, 0, 0, 255,255,252,3, 0, 0, 0, 0, 12, 52, 14, 0, 0, 0, 0, 0, 1, 17, 68, 0, 0, 0, 0, 0, 18, 105,16, 0, 0, 0, 0, 0, 16, 65, 64, 0, + 0, 32, 0, 0, 228,56, 12, 0, 0, 0, 0, 0, 48, 64, 26, 2, 0, 0, 0, 0, 14, 32, 4, 0, 0, 0, 2, 0, 18, 4, 4, 0, 0, 0, 0, 0, 19, 217,0, 0, + 0, 0, 0, 0, 143,101,8, 0, 0, 32, 0, 0, 129,81, 0, 2, 0, 0, 0, 0, 1, 5, 8, 0, 0, 0, 0, 0, 133,200,44, 0, 0, 0, 0, 0, 144,65, 8, 1, + 0, 0, 0, 0, 64, 40, 12, 2, 0, 0, 2, 0, 127,252,191,2, 0, 0, 0, 0, 147,73, 16, 0, 0, 0, 0, 0, 145,69, 0, 1, 0, 32, 0, 0, 16, 9, 4, 1, + 0, 0, 0, 0, 4, 24, 0, 0, 0, 0, 0, 0, 76, 32, 22, 0, 0, 0, 0, 0, 48, 73, 0, 0, 0, 0, 0, 0, 80, 73, 16, 0, 0, 96, 0, 0, 48, 1, 4, 0, + 0, 0, 0, 0, 3, 73, 8, 0, 0, 0, 8, 0, 19, 177,4, 0, 0, 0, 0, 0, 221,5, 8, 0, 0, 0, 0, 0, 8, 0, 24, 0, 0, 160,8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8, 56, 132,0, 0, 0, 0, 0, 145,201,28, 0, 0, 0, 0, 0, 168,16, 140,0, 0, 0, 0, 0, 8, 9, 4, 0, 0, 0, 0, 0, 140,76, 8, 0, + 0, 0, 0, 0, 20, 73, 12, 2, 0, 0, 0, 0, 1, 32, 28, 0, 0, 0, 0, 0, 254,255,252,1, 0, 0, 0, 0, 133,1, 0, 0, 0, 0, 0, 0, 176,0, 0, 0, + 0, 0, 0, 0, 24, 73, 4, 0, 0, 0, 0, 0, 9, 12, 4, 0, 0, 0, 0, 0, 132,36, 0, 0, 0, 32, 0, 0, 144,65, 4, 0, 0, 0, 0, 0, 19, 136,4, 0, + 0, 0, 0, 0, 93, 33, 12, 2, 0, 0, 0, 0, 20, 129,12, 0, 0, 0, 0, 0, 128,80, 12, 2, 0, 0, 0, 0, 66, 160,12, 0, 0, 96, 0, 0, 40, 16, 4, 0, + 0, 32, 0, 0, 2, 48, 12, 0, 0, 0, 0, 0, 255,255,174,0, 0, 96, 0, 0, 17, 25, 4, 0, 0, 0, 0, 0, 80, 97, 0, 1, 0, 0, 0, 0, 195,56, 142,0, + 0, 0, 0, 0, 1, 72, 20, 1, 0, 0, 0, 0, 16, 192,4, 0, 0, 0, 0, 0, 92, 36, 0, 2, 0, 0, 0, 0, 148,13, 12, 0, 0, 32, 0, 0, 16, 49, 68, 1, + 0, 0, 0, 0, 16, 73, 8, 0, 0, 0, 0, 0, 83, 241,12, 0, 0, 0, 0, 0, 149,213,112,0, 0, 0, 0, 0, 0, 109,54, 0, 0, 0, 0, 0, 1, 176,6, 0, + 0, 0, 0, 0, 222,39, 14, 3, 0, 0, 0, 0, 8, 0, 16, 1, 0, 0, 0, 0, 72, 16, 0, 0, 0, 32, 0, 0, 255,255,191,3, 0, 0, 0, 0, 128,57, 14, 2, + 0, 0, 0, 0, 83, 81, 54, 0, 0, 0, 0, 0, 0, 24, 20, 0, 0, 0, 0, 0, 68, 80, 44, 0, 0, 0, 0, 0, 149,68, 20, 2, 0, 0, 0, 0, 33, 96, 8, 0, + 0, 0, 0, 0, 211,16, 68, 0, 0, 0, 0, 0, 21, 141,20, 0, 0, 0, 0, 0, 128,16, 2, 0, 0, 0, 0, 0, 19, 253,16, 0, 0, 0, 0, 0, 219,101,4, 0, + 0, 0, 0, 0, 25, 0, 20, 0, 0, 0, 0, 0, 130,56, 2, 0, 0, 0, 0, 0, 17, 201,0, 1, 0, 0, 0, 0, 127,255,63, 3, 0, 0, 0, 0, 0, 48, 8, 1, + 0, 0, 0, 0, 0, 32, 38, 0, 0, 96, 36, 0, 108,178,12, 2, 0, 32, 0, 0, 17, 89, 20, 0, 0, 32, 2, 0, 0, 0, 4, 0, 0, 2, 0, 0, 159,253,29, 0, + 0, 0, 0, 0, 66, 0, 2, 0, 0, 0, 0, 0, 24, 8, 6, 1, 0, 0, 0, 0, 32, 0, 112,0, 0, 0, 0, 0, 4, 52, 64, 0, 0, 0, 0, 0, 88, 8, 4, 0, + 0, 96, 0, 0, 8, 32, 4, 0, 0, 0, 0, 0, 133,13, 12, 1, 0, 0, 0, 0, 129,72, 16, 0, 0, 0, 0, 0, 145,69, 92, 0, 0, 0, 0, 0, 146,128,8, 0, + 0, 4, 4, 0, 16, 112,130,0, 0, 0, 0, 0, 8, 33, 14, 0, 0, 0, 0, 0, 153,40, 10, 0, 0, 0, 0, 0, 8, 36, 8, 2, 0, 0, 0, 0, 24, 9, 0, 1, + 0, 0, 0, 0, 32, 8, 32, 0, 0, 96, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 124,40, 142,2, 0, 0, 0, 0, 87, 165,12, 2, 0, 96, 0, 0, 0, 0, 12, 0, + 0, 2, 0, 0, 236,216,14, 0, 0, 0, 0, 0, 95, 253,62, 0, 0, 0, 0, 0, 24, 80, 64, 0, 0, 96, 0, 0, 14, 2, 4, 0, 0, 0, 0, 0, 25, 65, 64, 0, + 0, 0, 1, 0, 44, 0, 68, 0, 0, 0, 0, 0, 36, 32, 4, 0, 0, 0, 0, 0, 21, 65, 82, 0, 0, 0, 0, 0, 9, 69, 4, 2, 0, 0, 0, 0, 17, 128,32, 0, + 16, 68, 1, 0, 255,255,254,3, 0, 0, 0, 0, 1, 36, 4, 0, 0, 4, 0, 0, 5, 0, 4, 0, 0, 0, 0, 0, 17, 32, 32, 0, 0, 0, 5, 0, 17, 105,50, 0, + 0, 0, 0, 0, 0, 8, 13, 0, 0, 0, 0, 0, 133,77, 4, 0, 0, 0, 0, 0, 8, 16, 0, 1, 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 27, 89, 16, 0, + 0, 0, 0, 0, 4, 41, 0, 1, 0, 0, 16, 0, 174,188,6, 0, 0, 0, 0, 0, 236,196,0, 1, 0, 0, 0, 0, 34, 2, 128,0, 0, 0, 0, 0, 209,72, 18, 0, + 0, 0, 0, 0, 0, 41, 2, 2, 0, 0, 0, 0, 187,90, 90, 1, 0, 0, 0, 0, 8, 0, 32, 1, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 208,120,28, 0, + 0, 0, 0, 0, 129,166,16, 1, 0, 128,0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 48, 97, 27, 0, 0, 0, 0, 0, 5, 128,0, 1, 0, 0, 0, 0, 63, 123,126,1, + 0, 0, 0, 0, 3, 49, 8, 0, 0, 0, 0, 0, 15, 0, 12, 0, 0, 0, 0, 0, 129,36, 0, 0, 0, 0, 0, 0, 17, 80, 22, 0, 0, 32, 0, 0, 4, 24, 44, 0, + 0, 0, 0, 0, 179,189,76, 0, 0, 0, 0, 0, 64, 40, 14, 1, 0, 0, 0, 0, 29, 1, 2, 0, 0, 0, 0, 0, 137,0, 4, 2, 0, 0, 0, 0, 129,1, 9, 0, + 0, 0, 1, 0, 255,255,127,3, 0, 0, 0, 0, 110,185,126,0, 0, 0, 0, 0, 0, 65, 48, 0, 0, 0, 0, 0, 64, 33, 12, 0, 0, 0, 1, 0, 17, 73, 18, 0, + 0, 0, 0, 0, 145,77, 26, 0, 0, 0, 0, 0, 1, 0, 34, 0, 0, 0, 0, 0, 3, 32, 4, 0, 0, 0, 0, 0, 0, 120,50, 0, 0, 0, 0, 0, 32, 144,0, 0, + 0, 0, 0, 0, 44, 32, 45, 0, 0, 0, 0, 0, 0, 140,2, 0, 0, 0, 0, 0, 32, 8, 8, 0, 0, 0, 0, 0, 17, 225,18, 1, 0, 0, 0, 0, 0, 16, 24, 0, + 0, 0, 0, 0, 37, 48, 46, 0, 0, 32, 0, 0, 255,252,126,0, 0, 0, 0, 0, 33, 0, 32, 0, 0, 0, 0, 0, 148,1, 8, 0, 0, 0, 0, 0, 49, 32, 38, 0, + 0, 0, 0, 0, 4, 33, 16, 0, 0, 0, 0, 0, 13, 184,173,0, 0, 0, 0, 0, 44, 0, 8, 0, 0, 0, 0, 0, 21, 201,18, 0, 0, 0, 0, 0, 0, 17, 44, 2, + 0, 0, 0, 0, 145,72, 50, 0, 0, 0, 0, 0, 0, 1, 34, 0, 0, 0, 0, 0, 47, 252,175,0, 0, 0, 0, 0, 17, 68, 2, 1, 0, 0, 0, 0, 164,2, 44, 0, + 0, 32, 0, 0, 16, 1, 44, 0, 0, 0, 0, 0, 0, 1, 14, 0, 0, 0, 0, 0, 17, 65, 48, 0, 0, 0, 0, 0, 4, 52, 12, 0, 0, 0, 0, 0, 5, 0, 32, 0, + 0, 0, 0, 0, 0, 4, 140,0, 0, 0, 0, 0, 8, 8, 32, 0, 0, 0, 0, 0, 20, 0, 66, 0, 0, 0, 0, 0, 46, 128,2, 0, 0, 0, 0, 0, 4, 9, 42, 0, + 0, 0, 0, 0, 0, 136,64, 0, 0, 0, 0, 0, 12, 128,8, 0, 0, 0, 0, 0, 44, 0, 40, 0, 0, 0, 0, 0, 17, 65, 80, 0, 0, 0, 0, 0, 4, 32, 56, 0, + 0, 0, 0, 0, 101,153,45, 0, 0, 0, 0, 0, 12, 8, 4, 0, 0, 0, 0, 0, 16, 192,8, 0, 0, 0, 0, 0, 149,197,88, 1, 0, 0, 0, 0, 32, 33, 40, 0, + 0, 0, 0, 0, 21, 8, 10, 0, 0, 0, 0, 0, 8, 1, 32, 0, 0, 0, 0, 0, 34, 0, 8, 0, 0, 0, 0, 0, 6, 161,6, 0, 0, 0, 0, 0, 0, 184,0, 0, + 0, 0, 0, 0, 130,84, 6, 2, 0, 0, 0, 0, 24, 24, 10, 0, 0, 0, 0, 0, 0, 8, 80, 0, 0, 0, 32, 0, 255,255,94, 1, 0, 0, 0, 0, 4, 144,4, 0, + 0, 0, 0, 0, 149,85, 88, 0, 0, 0, 0, 0, 64, 33, 10, 0, 0, 0, 0, 0, 209,81, 16, 0, 0, 0, 0, 0, 255,253,127,2, 0, 0, 0, 0, 6, 56, 74, 0, + 0, 0, 0, 0, 64, 5, 16, 1, 0, 0, 0, 0, 20, 33, 4, 0, 0, 0, 0, 0, 21, 65, 4, 1, 0, 0, 0, 0, 5, 4, 4, 2, 0, 0, 0, 0, 1, 32, 12, 1, + 0, 0, 0, 0, 31, 100,36, 2, 0, 0, 0, 0, 8, 10, 0, 2, 0, 0, 0, 0, 17, 193,16, 2, 0, 0, 0, 0, 5, 0, 0, 2, 0, 0, 0, 0, 80, 20, 2, 0, + 16, 0, 0, 0, 255,253,94, 0, 0, 32, 0, 0, 111,49, 14, 0, 0, 0, 0, 0, 96, 1, 0, 0, 0, 0, 0, 0, 40, 40, 14, 0, 0, 160,0, 0, 16, 176,4, 1, + 0, 0, 0, 0, 4, 160,4, 0, 0, 0, 0, 0, 178,0, 18, 1, 0, 0, 0, 0, 5, 1, 2, 0, 0, 0, 0, 0, 181,127,46, 3, 0, 0, 0, 0, 136,16, 2, 0, + 0, 0, 0, 0, 4, 160,6, 0, 0, 0, 0, 0, 48, 16, 32, 0, 0, 0, 0, 0, 128,0, 48, 0, 0, 0, 0, 0, 192,16, 28, 0, 0, 0, 0, 0, 9, 16, 16, 0, + 0, 0, 0, 0, 80, 0, 128,0, 0, 0, 0, 0, 136,48, 8, 2, 0, 0, 0, 0, 154,1, 16, 2, 0, 124,2, 0, 255,255,127,1, 0, 64, 0, 0, 253,191,255,3, + 0, 0, 0, 0, 149,9, 24, 0, 0, 32, 0, 0, 0, 4, 16, 0, 0, 0, 0, 0, 129,105,26, 0, 0, 0, 0, 0, 8, 108,6, 0, 0, 0, 0, 0, 72, 161,2, 0, + 0, 0, 0, 0, 129,1, 20, 0, 0, 0, 0, 0, 221,223,62, 0, 0, 0, 0, 0, 8, 37, 6, 2, 0, 0, 0, 0, 0, 144,6, 2, 0, 0, 0, 0, 9, 44, 14, 2, + 0, 0, 0, 0, 20, 64, 12, 2, 0, 0, 0, 0, 17, 100,16, 1, 0, 0, 0, 0, 25, 32, 29, 0, 0, 0, 0, 0, 10, 32, 6, 0, 0, 0, 0, 0, 84, 42, 14, 3, + 0, 32, 0, 0, 32, 0, 68, 0, 0, 0, 0, 0, 17, 48, 4, 0, 0, 0, 0, 0, 0, 33, 30, 0, 0, 8, 0, 0, 8, 0, 4, 0, 0, 0, 0, 0, 1, 192,4, 0, + 0, 0, 0, 0, 14, 188,30, 0, 0, 0, 0, 0, 16, 73, 18, 0, 0, 0, 0, 0, 22, 40, 34, 0, 0, 0, 0, 0, 0, 112,24, 0, 0, 0, 0, 0, 80, 56, 64, 0, + 0, 0, 0, 0, 210,188,118,3, 0, 0, 0, 0, 131,0, 0, 0, 0, 0, 0, 0, 247,191,110,2, 0, 0, 0, 0, 48, 64, 2, 0, 0, 0, 0, 0, 18, 40, 2, 0, + 0, 0, 0, 0, 48, 32, 164,0, 0, 0, 0, 0, 117,140,46, 3, 0, 0, 0, 0, 96, 16, 2, 0, 0, 0, 0, 0, 0, 57, 18, 0, 0, 0, 0, 0, 16, 152,0, 0, + 0, 0, 0, 0, 20, 4, 52, 0, 0, 0, 0, 0, 48, 72, 114,1, 0, 0, 0, 0, 21, 40, 14, 0, 0, 0, 0, 0, 16, 32, 80, 0, 0, 0, 0, 0, 132,16, 12, 0, + 0, 0, 0, 0, 0, 0, 46, 1, 0, 0, 0, 0, 36, 104,54, 1, 0, 0, 0, 0, 5, 77, 24, 1, 0, 0, 0, 0, 148,36, 0, 0, 0, 0, 0, 0, 95, 125,63, 3, + 0, 0, 0, 0, 200,38, 4, 2, 0, 0, 0, 0, 85, 104,4, 0, 0, 0, 0, 0, 215,93, 29, 3, 0, 0, 0, 0, 0, 41, 22, 0, 0, 0, 0, 0, 4, 12, 4, 1, + 0, 0, 0, 0, 16, 101,4, 1, 0, 0, 0, 0, 12, 128,4, 0, 0, 0, 0, 0, 0, 40, 18, 1, 0, 0, 0, 0, 17, 121,2, 0, 0, 0, 0, 0, 67, 0, 0, 0, + 0, 0, 0, 0, 78, 168,140,0, 0, 0, 0, 0, 137,96, 16, 0, 0, 64, 0, 0, 64, 0, 1, 2, 0, 16, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129,37, 2, 0, + 0, 0, 0, 0, 132,32, 0, 1, 0, 0, 0, 0, 34, 4, 8, 2, 0, 0, 0, 0, 223,255,238,3, 0, 0, 0, 0, 12, 8, 14, 2, 0, 0, 0, 0, 148,21, 8, 0, + 0, 0, 0, 0, 241,1, 8, 0, 0, 32, 0, 0, 2, 8, 10, 0, 0, 0, 0, 0, 16, 129,162,0, 0, 0, 0, 0, 72, 44, 8, 0, 0, 0, 0, 0, 148,1, 0, 2, + 0, 0, 0, 0, 157,95, 56, 2, 0, 0, 0, 0, 0, 32, 7, 3, 0, 0, 0, 0, 4, 0, 9, 0, 0, 0, 0, 0, 66, 32, 12, 3, 0, 0, 0, 0, 17, 12, 4, 2, + 0, 0, 0, 0, 12, 0, 188,2, 0, 0, 0, 0, 144,21, 2, 2, 16, 0, 0, 0, 221,109,28, 2, 0, 0, 0, 0, 2, 32, 10, 0, 0, 0, 0, 0, 68, 0, 0, 2, + 0, 0, 0, 0, 85, 16, 46, 3, 0, 0, 0, 0, 33, 32, 2, 0, 0, 0, 0, 0, 23, 32, 12, 2, 0, 0, 0, 0, 145,97, 22, 0, 0, 32, 0, 0, 8, 8, 6, 0, + 0, 0, 0, 0, 80, 0, 12, 0, 0, 0, 0, 0, 68, 160,4, 0, 0, 0, 0, 0, 1, 42, 6, 0, 0, 0, 0, 0, 68, 32, 4, 2, 0, 0, 0, 0, 145,97, 16, 0, + 0, 0, 0, 0, 16, 32, 14, 0, 0, 0, 0, 0, 97, 8, 12, 2, 0, 0, 0, 0, 65, 33, 8, 0, 0, 0, 0, 0, 68, 8, 0, 2, 0, 0, 0, 0, 0, 8, 26, 1, + 0, 0, 0, 0, 22, 32, 0, 0, 0, 0, 0, 0, 17, 73, 24, 0, 0, 0, 0, 0, 68, 1, 72, 0, 0, 0, 0, 0, 16, 1, 18, 2, 0, 0, 0, 0, 2, 0, 132,0, + 0, 0, 0, 0, 84, 0, 0, 2, 0, 32, 0, 0, 196,48, 4, 0, 0, 0, 0, 0, 149,169,28, 2, 0, 0, 0, 0, 49, 49, 6, 0, 0, 0, 0, 0, 149,64, 30, 0, + 0, 32, 0, 0, 8, 24, 6, 0, 0, 64, 0, 0, 156,173,50, 1, 0, 0, 0, 0, 54, 48, 178,0, 0, 0, 0, 0, 32, 1, 0, 3, 0, 0, 0, 0, 2, 16, 12, 0, + 0, 8, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 154,0, 8, 0, 0, 0, 24, 0, 36, 0, 0, 0, 0, 32, 0, 0, 16, 2, 42, 0, 0, 0, 0, 0, 2, 16, 8, 2, + 0, 96, 0, 0, 66, 37, 160,0, 0, 16, 0, 0, 34, 1, 0, 1, 0, 64, 17, 0, 0, 0, 0, 0, 0, 32, 2, 0, 32, 64, 4, 0, 0, 0, 0, 0, 223,255,174,2, + 0, 0, 0, 0, 110,170,30, 0, 0, 0, 0, 0, 9, 96, 16, 0, 0, 0, 0, 0, 146,64, 18, 0, 0, 0, 0, 0, 149,69, 30, 0, 0, 0, 0, 0, 16, 33, 6, 1, + 0, 32, 0, 0, 16, 1, 36, 1, 0, 0, 0, 0, 21, 96, 0, 1, 0, 64, 0, 0, 145,89, 18, 3, 0, 0, 0, 0, 12, 40, 22, 0, 0, 0, 0, 0, 16, 72, 12, 0, + 0, 32, 0, 0, 84, 16, 12, 0, 0, 0, 0, 0, 203,43, 95, 1, 0, 0, 0, 0, 144,24, 0, 0, 0, 0, 0, 0, 80, 32, 12, 0, 0, 0, 0, 0, 17, 172,14, 0, + 0, 0, 0, 0, 132,96, 12, 2, 0, 0, 0, 0, 49, 129,4, 0, 0, 0, 0, 0, 81, 105,16, 1, 0, 0, 0, 0, 6, 129,0, 0, 0, 0, 0, 0, 1, 2, 0, 1, + 0, 0, 0, 0, 157,127,40, 0, 0, 0, 0, 0, 0, 33, 14, 1, 0, 0, 0, 0, 17, 97, 80, 0, 0, 32, 0, 0, 252,249,47, 0, 0, 0, 0, 0, 2, 192,56, 0, + 0, 0, 0, 0, 2, 32, 48, 0, 0, 0, 0, 0, 24, 65, 56, 0, 0, 0, 0, 0, 25, 1, 14, 0, 0, 0, 0, 0, 236,184,46, 0, 0, 0, 0, 0, 53, 32, 0, 0, + 0, 0, 0, 0, 223,111,30, 3, 0, 0, 0, 0, 64, 8, 12, 1, 0, 0, 0, 0, 81, 8, 14, 1, 0, 0, 0, 0, 53, 96, 8, 0, 0, 0, 0, 0, 0, 8, 130,0, + 0, 32, 0, 0, 17, 192,4, 0, 0, 112,44, 0, 64, 16, 4, 0, 0, 0, 0, 0, 93, 69, 26, 2, 0, 0, 0, 0, 64, 56, 0, 1, 0, 0, 0, 0, 21, 64, 12, 0, + 0, 0, 0, 0, 24, 40, 4, 0, 0, 0, 0, 0, 151,101,124,0, 0, 0, 0, 0, 64, 12, 4, 1, 0, 0, 0, 0, 70, 64, 8, 0, 0, 0, 0, 0, 4, 0, 54, 0, + 0, 0, 0, 0, 145,69, 26, 1, 0, 0, 0, 0, 80, 184,14, 0, 0, 0, 0, 0, 0, 36, 12, 1, 0, 0, 0, 0, 0, 1, 8, 2, 0, 0, 0, 0, 3, 76, 6, 2, + 0, 0, 0, 0, 20, 8, 12, 0, 0, 0, 0, 0, 132,40, 134,0, 0, 0, 0, 0, 4, 37, 6, 0, 0, 0, 0, 0, 29, 224,14, 0, 0, 32, 0, 0, 17, 65, 0, 0, + 0, 4, 0, 0, 21, 33, 16, 2, 0, 0, 0, 0, 132,36, 1, 3, 0, 0, 0, 0, 96, 0, 32, 0, 0, 0, 0, 0, 33, 64, 0, 0, 0, 0, 0, 0, 21, 75, 12, 0, + 0, 0, 0, 0, 141,32, 4, 0, 0, 96, 8, 0, 1, 73, 32, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 36, 0, 0, 0, 0, 0, 40, 0, 64, 0, + 0, 0, 0, 0, 222,255,254,3, 0, 0, 0, 0, 21, 69, 20, 0, 0, 0, 0, 0, 9, 69, 0, 0, 0, 0, 0, 0, 72, 12, 8, 0, 0, 0, 0, 0, 0, 12, 8, 2, + 0, 0, 0, 0, 80, 144,4, 2, 0, 0, 0, 0, 76, 168,174,0, 0, 0, 0, 0, 8, 88, 4, 0, 0, 0, 0, 0, 0, 33, 40, 0, 0, 4, 0, 0, 223,253,60, 3, + 0, 0, 0, 0, 144,81, 4, 0, 0, 0, 0, 0, 40, 0, 32, 0, 0, 0, 0, 0, 19, 17, 22, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 4, 0, 0, 4, 0, 8, 0, + 0, 0, 0, 0, 17, 1, 22, 2, 0, 96, 16, 0, 32, 0, 36, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255,36, 78, 0, 0, 0, 0, 0, 1, 196,180,0, + 0, 0, 0, 0, 20, 64, 8, 0, 0, 0, 0, 0, 72, 48, 2, 0, 0, 224,4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128,16, 8, 0, 0, 0, 0, 0, 215,253,92, 0, + 0, 0, 0, 0, 18, 4, 8, 0, 0, 0, 0, 0, 210,149,13, 0, 0, 0, 0, 0, 145,65, 14, 0, 0, 0, 0, 0, 68, 40, 4, 0, 0, 32, 0, 0, 0, 36, 0, 0, + 0, 0, 0, 0, 8, 0, 22, 0, 0, 0, 4, 0, 0, 16, 2, 0, 0, 0, 0, 0, 19, 65, 4, 1, 0, 0, 0, 0, 10, 33, 8, 2, 0, 64, 0, 0, 24, 0, 16, 0, + 0, 0, 0, 0, 17, 34, 0, 0, 0, 4, 0, 0, 17, 3, 0, 1, 0, 0, 0, 0, 64, 0, 40, 0, 0, 0, 0, 0, 144,108,18, 0, 0, 0, 0, 0, 84, 109,10, 1, + 0, 0, 0, 0, 68, 173,40, 0, 0, 32, 0, 0, 64, 130,0, 0, 0, 0, 0, 0, 195,3, 44, 0, 0, 244,25, 64, 255,255,255,3, 0, 0, 0, 0, 21, 0, 66, 0, + 0, 64, 1, 0, 0, 0, 64, 0, 0, 0, 0, 0, 229,40, 4, 0, 0, 0, 0, 0, 7, 9, 0, 0, 0, 0, 0, 0, 149,76, 9, 1, 0, 0, 0, 0, 1, 64, 28, 0, + 0, 0, 0, 0, 185,125,20, 2, 0, 0, 0, 0, 10, 56, 2, 0, 0, 0, 0, 0, 68, 8, 8, 1, 0, 0, 0, 0, 57, 8, 24, 0, 0, 0, 0, 0, 81, 121,30, 1, + 0, 0, 0, 0, 147,5, 0, 0, 0, 0, 0, 0, 155,233,14, 0, 0, 0, 0, 0, 82, 16, 21, 0, 0, 0, 0, 0, 107,60, 46, 0, 0, 0, 0, 0, 16, 21, 70, 0, + 16, 0, 0, 0, 145,21, 70, 2, 0, 0, 0, 0, 2, 16, 4, 1, 0, 0, 0, 0, 162,56, 22, 1, 0, 0, 0, 0, 16, 65, 0, 2, 0, 0, 0, 0, 128,68, 16, 2, + 0, 0, 0, 0, 147,113,38, 0, 0, 32, 0, 0, 4, 32, 66, 0, 0, 0, 0, 0, 32, 224,16, 0, 0, 0, 0, 0, 80, 48, 14, 3, 0, 0, 0, 0, 76, 32, 0, 2, + 0, 0, 0, 0, 25, 121,92, 0, 0, 96, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 115,247,70, 1, 0, 0, 0, 0, 22, 36, 22, 0, 0, 0, 0, 0, 12, 32, 14, 1, + 0, 0, 0, 0, 49, 0, 8, 0, 0, 0, 0, 0, 4, 224,66, 0, 0, 0, 0, 0, 149,65, 72, 0, 0, 0, 0, 0, 144,114,6, 2, 0, 160,0, 0, 0, 16, 4, 0, + 0, 0, 0, 0, 140,64, 0, 0, 0, 0, 0, 0, 131,209,4, 0, 0, 0, 0, 0, 127,109,46, 3, 0, 0, 0, 0, 23, 72, 4, 0, 0, 0, 0, 0, 2, 16, 6, 0, + 0, 0, 0, 0, 20, 9, 8, 0, 0, 0, 0, 0, 19, 205,0, 0, 0, 160,0, 0, 255,253,78, 3, 0, 0, 0, 0, 145,89, 70, 0, 0, 0, 0, 0, 193,33, 4, 2, + 0, 0, 0, 0, 4, 104,4, 0, 0, 0, 0, 0, 4, 0, 66, 0, 0, 0, 0, 0, 19, 77, 28, 0, 0, 0, 0, 0, 23, 69, 12, 0, 0, 0, 0, 0, 44, 12, 6, 1, + 0, 0, 0, 0, 17, 73, 12, 0, 0, 32, 0, 0, 40, 0, 12, 0, 0, 0, 0, 0, 20, 104,128,0, 0, 0, 0, 0, 133,209,8, 2, 0, 0, 0, 0, 0, 16, 80, 0, + 0, 0, 0, 0, 151,81, 4, 1, 0, 4, 0, 0, 157,253,28, 3, 0, 4, 0, 0, 23, 253,26, 1, 0, 0, 0, 0, 0, 148,2, 0, 0, 0, 0, 0, 20, 60, 24, 0, + 0, 0, 0, 0, 42, 8, 70, 0, 0, 0, 0, 0, 1, 20, 0, 0, 0, 0, 0, 0, 181,44, 94, 2, 0, 0, 0, 0, 128,32, 22, 0, 0, 32, 0, 0, 57, 81, 24, 0, + 0, 32, 0, 0, 246,153,108,1, 0, 32, 0, 0, 128,197,8, 0, 0, 48, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 124,164,76, 0, 0, 0, 0, 0, 17, 145,2, 1, + 0, 0, 0, 0, 104,40, 6, 0, 0, 0, 0, 0, 17, 25, 64, 1, 0, 64, 0, 0, 127,248,76, 0, 0, 32, 1, 0, 135,20, 106,0, 16, 0, 0, 0, 255,191,254,1, + 0, 0, 0, 0, 106,172,46, 0, 0, 0, 0, 0, 0, 0, 134,0, 0, 0, 0, 0, 25, 9, 6, 1, 0, 32, 0, 0, 179,25, 100,0, 0, 4, 0, 0, 214,221,30, 2, + 0, 0, 8, 0, 0, 0, 16, 0, 0, 0, 0, 0, 144,16, 64, 0, 0, 0, 0, 0, 88, 121,68, 0, 0, 0, 0, 0, 0, 28, 2, 0, 0, 32, 0, 0, 8, 0, 68, 0, + 0, 0, 0, 0, 222,189,46, 2, 0, 32, 1, 0, 145,81, 4, 1, 0, 0, 0, 0, 16, 1, 20, 1, 0, 0, 0, 0, 208,121,66, 0, 0, 0, 0, 0, 19, 60, 26, 0, + 0, 0, 0, 0, 144,25, 68, 0, 0, 0, 0, 0, 223,188,78, 2, 0, 0, 0, 0, 18, 16, 8, 0, 0, 0, 0, 0, 145,120,0, 0, 0, 0, 0, 0, 243,29, 14, 2, + 0, 0, 0, 0, 250,181,12, 2, 0, 0, 0, 0, 170,0, 4, 0, 0, 0, 0, 0, 82, 25, 0, 0, 0, 0, 0, 0, 144,52, 0, 2, 0, 0, 0, 0, 47, 188,76, 2, + 0, 112,27, 0, 8, 0, 4, 0, 0, 0, 0, 0, 159,121,20, 0, 0, 0, 0, 0, 2, 128,40, 0, 0, 0, 0, 0, 148,81, 4, 3, 0, 0, 0, 0, 131,144,0, 1, + 0, 0, 0, 0, 221,125,30, 2, 0, 0, 0, 0, 144,13, 0, 0, 0, 0, 0, 0, 17, 73, 14, 3, 0, 0, 0, 0, 2, 45, 0, 0, 0, 0, 0, 0, 16, 28, 8, 0, + 0, 0, 0, 0, 148,8, 64, 2, 0, 96, 0, 0, 122,124,94, 1, 0, 0, 0, 0, 4, 0, 138,0, 0, 96, 0, 0, 144,16, 4, 3, 0, 0, 0, 0, 16, 16, 34, 0, + 0, 32, 0, 0, 30, 108,12, 0, 0, 0, 0, 0, 16, 121,0, 0, 0, 0, 0, 0, 128,25, 4, 0, 0, 32, 0, 0, 247,219,102,0, 0, 0, 0, 0, 10, 8, 64, 0, + 0, 0, 0, 0, 138,0, 2, 0, 0, 0, 0, 0, 226,56, 96, 0, 0, 0, 0, 0, 161,64, 0, 0, 0, 0, 0, 0, 157,220,76, 2, 0, 0, 0, 0, 19, 33, 4, 0, + 0, 0, 0, 0, 48, 40, 0, 0, 0, 0, 0, 0, 251,60, 2, 0, 0, 0, 16, 0, 2, 0, 0, 0, 0, 0, 0, 0, 25, 69, 88, 1, 0, 0, 0, 0, 140,189,14, 2, + 16, 0, 0, 0, 9, 0, 0, 1, 0, 0, 0, 0, 17, 9, 8, 0, 0, 0, 0, 0, 32, 0, 42, 1, 0, 0, 0, 0, 48, 0, 6, 0, 16, 0, 0, 0, 29, 105,92, 1, + 0, 0, 0, 0, 12, 24, 38, 1, 16, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 29, 40, 74, 1, 0, 0, 0, 0, 54, 73, 4, 0, 0, 0, 0, 0, 0, 9, 8, 2, + 0, 0, 0, 0, 159,83, 84, 0, 0, 0, 0, 0, 29, 141,8, 0, 16, 0, 0, 0, 20, 0, 0, 0, 16, 0, 0, 0, 35, 65, 48, 0, 0, 0, 0, 0, 128,0, 12, 2, + 0, 0, 0, 0, 110,184,14, 2, 0, 0, 0, 0, 26, 8, 4, 0, 0, 0, 0, 0, 20, 33, 0, 1, 0, 0, 0, 0, 0, 157,12, 0, 0, 0, 0, 0, 16, 193,64, 0, + 0, 0, 0, 0, 146,252,8, 0, 0, 0, 0, 0, 138,0, 6, 0, 0, 0, 0, 0, 247,125,110,0, 0, 32, 0, 0, 239,249,78, 1, 0, 0, 0, 0, 20, 225,8, 0, + 0, 0, 0, 0, 17, 89, 16, 1, 0, 0, 0, 0, 8, 52, 10, 0, 16, 0, 0, 0, 31, 221,6, 0, 0, 0, 0, 0, 129,16, 2, 0, 0, 0, 0, 0, 128,32, 4, 1, + 0, 0, 0, 0, 0, 216,4, 0, 0, 0, 0, 0, 48, 9, 8, 0, 16, 0, 0, 0, 27, 48, 12, 1, 0, 0, 0, 0, 17, 128,4, 0, 16, 0, 0, 0, 16, 64, 0, 0, + 0, 0, 0, 0, 127,255,254,2, 0, 0, 0, 0, 16, 25, 14, 0, 0, 0, 0, 0, 177,29, 84, 0, 0, 0, 0, 0, 8, 56, 14, 1, 0, 0, 0, 0, 219,123,10, 0, + 0, 0, 0, 0, 16, 128,64, 0, 0, 0, 0, 0, 66, 120,70, 0, 0, 0, 0, 0, 207,56, 78, 0, 0, 0, 0, 0, 16, 16, 2, 1, 0, 0, 0, 0, 128,1, 68, 0, + 0, 0, 0, 0, 73, 69, 16, 0, 0, 0, 0, 0, 147,4, 4, 0, 0, 0, 0, 0, 24, 16, 20, 2, 0, 0, 0, 0, 20, 80, 8, 0, 0, 0, 0, 0, 18, 56, 12, 0, + 0, 0, 0, 0, 128,56, 2, 0, 0, 0, 0, 0, 2, 65, 0, 2, 0, 0, 0, 0, 251,57, 78, 0, 0, 0, 0, 0, 144,73, 12, 0, 0, 0, 0, 0, 0, 184,12, 0, + 0, 0, 0, 0, 255,61, 30, 1, 0, 0, 0, 0, 128,65, 16, 2, 0, 32, 0, 0, 183,121,78, 0, 0, 32, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 2, 49, 6, 1, + 0, 0, 0, 0, 6, 48, 6, 1, 0, 4, 0, 0, 247,245,70, 1, 0, 0, 0, 0, 26, 49, 2, 0, 0, 0, 0, 0, 120,48, 14, 1, 0, 0, 0, 0, 147,0, 4, 0, + 0, 32, 0, 0, 119,56, 44, 0, 0, 32, 0, 0, 0, 48, 2, 0, 0, 240,29, 0, 1, 83, 4, 0, 0, 32, 0, 0, 18, 192,40, 0, 0, 0, 0, 0, 152,40, 8, 0, + 0, 0, 0, 0, 14, 32, 80, 0, 0, 48, 0, 0, 2, 0, 4, 0, 0, 32, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 114,67, 6, 2, 0, 0, 0, 0, 16, 73, 22, 0, + 0, 168,0, 0, 255,109,206,2, 0, 16, 0, 0, 179,219,94, 1, 0, 0, 0, 0, 8, 8, 134,0, 0, 0, 0, 0, 0, 48, 96, 0, 0, 96, 32, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 132,192,88, 0, 0, 0, 0, 0, 194,29, 14, 0, 0, 0, 0, 0, 191,121,14, 2, 0, 0, 0, 0, 8, 33, 10, 0, 0, 32, 0, 0, 0, 128,8, 0, + 0, 0, 0, 0, 53, 36, 0, 0, 0, 0, 0, 0, 48, 73, 4, 1, 0, 0, 0, 0, 2, 146,4, 0, 0, 0, 0, 0, 2, 144,6, 1, 0, 0, 0, 0, 66, 48, 74, 1, + 0, 0, 0, 0, 52, 164,0, 0, 0, 0, 0, 0, 180,92, 8, 0, 0, 224,36, 0, 16, 64, 4, 0, 0, 0, 0, 0, 144,74, 2, 2, 0, 112,32, 0, 242,25, 14, 0, + 0, 48, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 193,2, 0, 0, 0, 0, 0, 125,69, 14, 1, 0, 0, 0, 0, 10, 56, 12, 0, 0, 0, 0, 0, 129,2, 0, 2, + 0, 0, 0, 0, 158,253,76, 2, 0, 0, 0, 0, 205,56, 6, 0, 0, 0, 0, 0, 51, 81, 24, 1, 0, 0, 0, 0, 183,125,126,2, 0, 32, 0, 0, 21, 1, 0, 1, + 0, 0, 0, 0, 185,105,6, 1, 0, 0, 0, 0, 16, 48, 2, 1, 0, 0, 0, 0, 210,125,70, 1, 0, 0, 0, 0, 8, 44, 2, 0, 0, 0, 0, 0, 1, 4, 64, 2, + 0, 32, 0, 0, 0, 1, 6, 0, 0, 0, 0, 0, 44, 32, 0, 2, 0, 0, 0, 0, 1, 0, 0, 3, 0, 80, 0, 0, 21, 1, 0, 0, 0, 0, 0, 0, 19, 85, 16, 1, + 0, 0, 0, 0, 5, 8, 0, 0, 0, 0, 0, 0, 251,255,126,3, 0, 0, 0, 0, 2, 1, 20, 0, 0, 0, 0, 0, 17, 65, 4, 2, 0, 0, 0, 0, 160,136,14, 0, + 0, 0, 0, 0, 32, 4, 0, 2, 0, 0, 0, 0, 120,0, 70, 0, 0, 0, 0, 0, 29, 33, 8, 0, 0, 0, 0, 0, 21, 68, 0, 1, 0, 0, 0, 0, 255,253,44, 2, + 0, 240,36, 0, 121,217,6, 0, 0, 0, 0, 0, 40, 16, 68, 0, 0, 0, 0, 0, 24, 12, 8, 0, 0, 0, 0, 0, 144,18, 0, 2, 0, 0, 0, 0, 12, 48, 0, 0, + 0, 32, 0, 0, 128,9, 4, 0, 16, 0, 0, 0, 72, 36, 12, 0, 0, 32, 0, 0, 50, 9, 68, 0, 0, 0, 0, 0, 254,253,76, 2, 0, 32, 0, 0, 255,157,102,1, + 0, 0, 0, 0, 0, 24, 32, 0, 0, 0, 0, 0, 32, 80, 64, 0, 0, 0, 0, 0, 130,81, 8, 1, 0, 0, 0, 0, 16, 0, 72, 0, 0, 0, 0, 0, 191,152,126,1, + 0, 0, 0, 0, 0, 48, 34, 1, 0, 0, 0, 0, 62, 124,14, 0, 0, 0, 0, 0, 16, 137,20, 2, 0, 0, 0, 0, 251,217,20, 0, 0, 0, 0, 0, 130,0, 2, 0, + 0, 32, 0, 0, 16, 16, 12, 0, 0, 0, 0, 0, 128,192,24, 0, 0, 0, 0, 0, 25, 65, 0, 0, 0, 32, 0, 0, 4, 40, 100,0, 0, 0, 0, 0, 145,9, 92, 1, + 0, 128,0, 0, 17, 1, 0, 1, 0, 0, 0, 0, 176,8, 8, 0, 0, 0, 0, 0, 48, 129,4, 0, 0, 0, 0, 0, 128,89, 0, 2, 0, 0, 0, 0, 17, 9, 64, 1, + 0, 0, 0, 0, 128,21, 0, 0, 16, 0, 0, 0, 1, 32, 4, 0, 0, 32, 0, 0, 16, 12, 4, 0, 0, 64, 0, 0, 161,65, 36, 0, 0, 0, 0, 0, 21, 65, 144,3, + 0, 0, 0, 0, 68, 169,140,1, 0, 0, 0, 0, 29, 36, 140,1, 0, 0, 4, 0, 16, 8, 0, 0, 0, 0, 0, 0, 192,8, 0, 0, 0, 0, 0, 0, 16, 80, 32, 0, + 0, 32, 2, 0, 8, 0, 4, 0, 0, 0, 0, 0, 2, 64, 68, 0, 0, 0, 0, 0, 144,1, 12, 0, 0, 40, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 22, 32, 24, 0, + 0, 0, 0, 0, 56, 8, 68, 0, 0, 0, 0, 0, 10, 192,128,0, 0, 32, 0, 0, 20, 0, 1, 2, 0, 0, 0, 0, 5, 209,4, 0, 0, 0, 33, 0, 158,239,142,3, + 0, 0, 0, 0, 96, 1, 4, 0, 0, 0, 0, 0, 72, 32, 4, 0, 0, 0, 0, 0, 72, 24, 28, 2, 0, 0, 0, 0, 133,0, 12, 0, 0, 0, 0, 0, 184,67, 66, 0, + 0, 160,0, 0, 32, 64, 192,0, 0, 32, 8, 0, 0, 0, 64, 0, 0, 0, 0, 0, 95, 124,46, 2, 0, 0, 0, 0, 16, 104,2, 0, 0, 0, 0, 0, 27, 101,8, 1, + 0, 244,11, 0, 183,251,255,3, 0, 64, 0, 0, 0, 0, 128,1, 0, 0, 0, 0, 4, 61, 32, 1, 0, 128,0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 128,104,130,0, + 0, 0, 0, 0, 68, 176,0, 0, 0, 0, 0, 0, 16, 65, 128,0, 0, 0, 0, 0, 129,1, 1, 0, 16, 0, 0, 0, 5, 121,34, 2, 0, 0, 0, 0, 128,112,0, 0, + 0, 0, 0, 0, 66, 0, 0, 3, 0, 0, 0, 0, 0, 144,64, 1, 0, 0, 0, 0, 192,3, 0, 1, 0, 0, 0, 0, 0, 1, 160,0, 0, 0, 0, 0, 17, 136,0, 0, + 0, 0, 0, 0, 20, 8, 2, 0, 0, 64, 0, 0, 0, 0, 1, 2, 0, 160,0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 148,4, 50, 0, 0, 0, 1, 0, 17, 0, 0, 0, + 0, 0, 0, 0, 53, 0, 128,3, 0, 32, 44, 0, 0, 147,228,3, 0, 0, 0, 0, 128,72, 8, 2, 16, 0, 33, 0, 255,255,255,3, 0, 0, 0, 0, 209,20, 20, 0, + 0, 0, 0, 0, 129,4, 2, 0, 0, 0, 0, 0, 133,68, 16, 0, 0, 0, 0, 0, 16, 72, 64, 0, 0, 0, 0, 0, 25, 69, 0, 0, 0, 0, 0, 0, 64, 12, 0, 1, + 0, 0, 0, 0, 49, 0, 24, 0, 0, 0, 0, 0, 9, 105,74, 1, 0, 0, 0, 0, 17, 93, 20, 0, 0, 0, 0, 0, 10, 24, 12, 2, 0, 0, 0, 0, 131,245,20, 0, + 0, 0, 0, 0, 200,116,28, 2, 16, 0, 0, 0, 93, 101,28, 0, 0, 0, 0, 0, 68, 49, 0, 0, 0, 0, 0, 0, 0, 4, 12, 3, 0, 0, 0, 0, 2, 64, 8, 2, + 0, 0, 0, 0, 0, 36, 14, 0, 0, 240,41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 16, 68, 0, 0, 0, 0, 0, 1, 1, 2, 2, 16, 0, 0, 0, 75, 125,66, 2, + 0, 0, 0, 0, 27, 24, 4, 0, 0, 0, 0, 0, 145,53, 28, 0, 0, 0, 0, 0, 136,101,14, 0, 0, 0, 0, 0, 1, 97, 16, 0, 0, 0, 0, 0, 16, 164,4, 0, + 0, 0, 0, 0, 9, 65, 0, 2, 0, 0, 0, 0, 34, 2, 2, 0, 0, 0, 0, 0, 202,52, 14, 0, 0, 32, 0, 0, 130,16, 6, 0, 0, 68, 0, 0, 82, 105,76, 1, + 0, 0, 0, 0, 16, 80, 12, 0, 0, 0, 0, 0, 196,4, 0, 0, 0, 0, 0, 0, 128,40, 4, 0, 0, 0, 0, 0, 155,169,58, 0, 0, 224,26, 0, 164,7, 12, 0, + 0, 0, 0, 0, 76, 97, 12, 2, 0, 0, 0, 0, 128,56, 96, 0, 0, 0, 0, 0, 218,93, 14, 0, 16, 40, 32, 0, 144,149,28, 1, 0, 0, 0, 0, 0, 17, 12, 2, + 0, 0, 0, 0, 221,40, 128,2, 0, 0, 0, 0, 160,0, 8, 2, 0, 32, 0, 0, 0, 0, 32, 1, 0, 4, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 32, 0, 10, 0, + 0, 0, 0, 0, 96, 40, 0, 0, 0, 0, 0, 0, 93, 188,204,2, 0, 0, 0, 0, 137,0, 16, 0, 0, 0, 0, 0, 2, 2, 20, 0, 0, 64, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 223,255,255,3, 0, 0, 0, 0, 0, 4, 36, 0, 0, 0, 0, 0, 128,69, 18, 0, 0, 32, 4, 0, 8, 0, 0, 0, 0, 0, 0, 0, 145,1, 16, 1, + 0, 0, 0, 0, 128,1, 12, 3, 0, 0, 0, 0, 93, 101,12, 0, 0, 0, 0, 0, 8, 84, 0, 3, 0, 0, 0, 0, 16, 8, 20, 2, 0, 0, 0, 0, 128,160,0, 0, + 0, 0, 0, 0, 95, 101,24, 0, 0, 0, 0, 0, 16, 17, 44, 0, 0, 0, 0, 0, 144,4, 28, 0, 0, 32, 0, 0, 153,116,8, 3, 16, 0, 0, 0, 89, 252,126,2, + 0, 0, 0, 0, 145,33, 0, 0, 0, 0, 0, 0, 85, 5, 12, 0, 0, 32, 0, 0, 154,92, 7, 0, 0, 0, 0, 0, 17, 5, 28, 0, 0, 32, 0, 0, 72, 16, 16, 0, + 0, 0, 16, 0, 1, 3, 2, 0, 0, 0, 0, 0, 83, 9, 13, 0, 0, 32, 0, 0, 12, 160,26, 1, 0, 0, 0, 0, 223,255,110,3, 0, 0, 0, 0, 133,4, 0, 0, + 0, 0, 0, 0, 128,32, 8, 2, 0, 0, 0, 0, 93, 45, 24, 0, 16, 0, 0, 0, 17, 129,0, 0, 0, 0, 0, 0, 21, 85, 8, 1, 0, 0, 0, 0, 149,69, 24, 0, + 0, 0, 2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 17, 0, 1, 0, 0, 168,0, 0, 223,255,255,3, 0, 96, 0, 0, 0, 0, 128,2, 0, 0, 4, 0, 0, 0, 0, 2, + 0, 0, 8, 0, 0, 0, 0, 2, 0, 0, 0, 0, 19, 77, 2, 0, 0, 0, 0, 0, 0, 40, 66, 1, 0, 0, 0, 0, 149,4, 0, 2, 0, 0, 0, 0, 17, 16, 10, 0, + 0, 0, 0, 0, 25, 97, 2, 0, 0, 0, 0, 0, 0, 4, 66, 0, 0, 0, 0, 0, 64, 0, 8, 2, 0, 0, 0, 0, 161,1, 0, 0, 0, 0, 0, 0, 145,72, 22, 0, + 0, 0, 0, 0, 12, 48, 10, 0, 0, 0, 0, 0, 14, 32, 14, 0, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 0, 0, 145,69, 18, 1, 0, 0, 0, 0, 89, 93, 88, 0, + 0, 0, 0, 0, 0, 16, 2, 2, 0, 0, 0, 0, 125,111,28, 3, 0, 0, 0, 0, 16, 0, 42, 0, 0, 0, 0, 0, 209,8, 0, 0, 0, 64, 0, 0, 177,193,18, 0, + 0, 32, 0, 0, 0, 8, 32, 0, 1, 32, 0, 0, 0, 0, 193,0, 0, 96, 0, 0, 0, 0, 128,0, 0, 128,0, 0, 0, 0, 65, 0, 0, 0, 1, 0, 0, 0, 64, 0, + 0, 0, 0, 0, 29, 109,27, 3, 0, 0, 0, 0, 192,32, 8, 2, 0, 0, 0, 0, 2, 60, 8, 0, 0, 0, 0, 0, 1, 132,142,0, 0, 0, 0, 0, 1, 68, 16, 0, + 0, 0, 0, 0, 71, 32, 4, 0, 0, 0, 0, 0, 12, 8, 12, 0, 0, 0, 0, 0, 140,0, 4, 0, 0, 0, 0, 0, 25, 33, 0, 0, 0, 0, 0, 0, 80, 36, 0, 0, + 0, 0, 0, 0, 112,0, 128,0, 0, 0, 0, 0, 17, 64, 18, 2, 16, 0, 0, 0, 255,253,191,3, 0, 0, 0, 0, 64, 40, 34, 0, 0, 160,0, 0, 36, 0, 4, 0, + 0, 0, 0, 0, 66, 60, 4, 0, 0, 0, 0, 0, 24, 128,0, 0, 0, 0, 0, 0, 88, 56, 12, 0, 0, 0, 0, 0, 64, 8, 20, 2, 0, 0, 0, 0, 25, 127,8, 0, + 0, 0, 0, 0, 8, 0, 4, 3, 0, 0, 0, 0, 12, 36, 0, 2, 0, 0, 0, 0, 1, 4, 4, 1, 0, 0, 0, 0, 51, 207,16, 0, 0, 0, 0, 0, 91, 101,12, 2, + 0, 64, 0, 0, 128,0, 0, 0, 0, 0, 0, 0, 80, 32, 6, 2, 0, 0, 0, 0, 176,132,0, 0, 0, 0, 0, 0, 199,213,58, 2, 0, 48, 0, 0, 148,17, 12, 0, + 0, 0, 0, 0, 5, 0, 8, 1, 0, 0, 0, 0, 17, 73, 12, 2, 0, 0, 0, 0, 25, 67, 48, 1, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 64, 2, 0, 1, + 0, 64, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 64, 136,32, 0, 0, 0, 0, 0, 192,0, 4, 2, 0, 0, 0, 0, 193,101,0, 2, 0, 0, 0, 0, 255,252,46, 3, + 0, 0, 0, 0, 8, 4, 18, 0, 0, 0, 0, 0, 206,60, 14, 0, 0, 0, 0, 0, 48, 72, 0, 0, 0, 0, 0, 0, 19, 4, 4, 0, 0, 0, 0, 0, 24, 36, 0, 0, + 0, 0, 0, 0, 20, 20, 0, 0, 0, 0, 0, 0, 65, 89, 0, 2, 0, 0, 0, 0, 0, 9, 16, 1, 0, 0, 0, 0, 29, 109,0, 0, 0, 0, 0, 0, 125,101,12, 2, + 0, 0, 0, 0, 81, 72, 0, 0, 0, 32, 0, 0, 45, 140,6, 2, 0, 0, 0, 0, 7, 5, 0, 0, 0, 0, 0, 0, 145,64, 12, 2, 0, 0, 0, 0, 16, 88, 0, 0, + 0, 0, 0, 0, 17, 193,144,0, 0, 0, 0, 0, 255,121,31, 3, 0, 0, 0, 0, 10, 8, 8, 1, 0, 0, 0, 0, 66, 72, 16, 0, 0, 0, 0, 0, 25, 121,24, 0, + 0, 0, 0, 0, 17, 113,0, 0, 0, 0, 0, 0, 18, 64, 16, 0, 0, 0, 0, 0, 89, 5, 8, 0, 0, 0, 0, 0, 16, 188,142,0, 0, 0, 0, 0, 95, 117,10, 2, + 0, 0, 0, 0, 5, 28, 10, 0, 0, 0, 0, 0, 33, 0, 128,0, 0, 0, 0, 0, 17, 3, 128,0, 0, 0, 0, 0, 53, 81, 128,0, 0, 0, 1, 0, 4, 0, 130,0, + 0, 0, 2, 0, 0, 0, 128,0, 0, 0, 0, 0, 17, 5, 2, 0, 0, 0, 0, 0, 1, 36, 0, 2, 0, 0, 0, 0, 132,12, 0, 0, 0, 0, 0, 0, 128,8, 6, 0, + 0, 0, 0, 0, 32, 0, 70, 0, 0, 0, 0, 0, 49, 29, 24, 0, 0, 0, 0, 0, 3, 208,68, 0, 0, 0, 0, 0, 24, 69, 0, 0, 0, 0, 0, 0, 149,117,0, 0, + 0, 0, 0, 0, 50, 64, 0, 0, 0, 0, 4, 0, 17, 65, 8, 0, 0, 0, 0, 0, 196,32, 2, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 0, 0, 0, 114,0, 0, 0, + 0, 0, 0, 0, 85, 40, 0, 0, 0, 0, 0, 0, 34, 32, 0, 0, 0, 32, 16, 0, 69, 0, 0, 0, 0, 160,0, 0, 13, 0, 33, 0, 0, 0, 1, 0, 0, 0, 1, 2, + 0, 32, 1, 0, 35, 0, 33, 0, 0, 160,0, 0, 0, 16, 0, 0, 0, 36, 0, 0, 1, 16, 0, 2, 0, 0, 0, 0, 78, 58, 70, 0, 0, 32, 20, 0, 1, 0, 138,2, + 0, 32, 8, 0, 0, 0, 136,2, 0, 32, 0, 0, 0, 0, 128,2 }; +#define CHARSET_SIZE 49 #define NumLargeCounts 310 static const unsigned char EndCountLge[310] = { - 0, 1, 7, 2, 1, 1, 1, 1, 41, 2, 2, 2, 1, 6, 1, 2, 5, 1, 1, 5, 2, 1, 1, 57, 12, 1, 1, 3, 1, 9, 1, 1, 1, 1, 5, 1, 4, 1, 9, 1, 8, - 2, 1, 1, 1, 1, 6, 1, 57, 13, 1, 1, 1, 3, 1, 1, 2, 9, 3, 1, 1, 1, 3, 1, 16, 1, 2, 4, 2, 1, 4, 1, 1, 2, 40, 5, 1, 13, 1, 1, 1, 7, - 2, 5, 2, 3, 21, 1, 2, 1, 2, 1, 1, 1, 2, 28, 5, 3, 1, 3, 2, 4, 2, 4, 1, 1, 2, 33, 6, 1, 1, 4, 3, 1, 5, 6, 2, 1, 1, 1, 3, 35, 10, - 1, 2, 7, 1, 1, 3, 7, 1, 3, 1, 15, 1, 7, 1, 1, 1, 1, 12, 4, 2, 2, 2, 28, 6, 1, 3, 4, 1, 1, 1, 4, 2, 2, 33, 9, 1, 6, 5, 1, 6, 3, - 57, 20, 1, 1, 1, 2, 4, 1, 1, 5, 1, 7, 1, 1, 7, 1, 1, 1, 1, 9, 2, 1, 4, 18, 4, 4, 3, 4, 1, 1, 14, 1, 1, 2, 1, 1, 1, 1, 1, 45, 10, - 1, 1, 2, 1, 1, 7, 1, 2, 1, 2, 4, 2, 1, 6, 1, 7, 2, 1, 2, 2, 3, 2, 36, 7, 12, 1, 1, 1, 1, 3, 7, 1, 3, 80, 10, 1, 2, 8, 5, 7, 8, - 2, 1, 1, 1, 5, 1, 2, 1, 1, 4, 4, 1, 1, 12, 3, 2, 1, 1, 2, 1, 6, 1, 1, 2, 1, 34, 5, 4, 4, 1, 3, 5, 6, 2, 1, 1, 2, 8, 4, 15, 5, + 0, 1, 7, 2, 1, 1, 1, 1, 41, 2, 2, 2, 1, 6, 1, 2, 5, 1, 1, 5, 2, 1, 1, 57, 12, 1, 1, 3, 1, 9, 1, 1, 1, 1, 5, 1, 4, 1, 9, 1, 8, + 2, 1, 1, 1, 1, 6, 1, 57, 13, 1, 1, 1, 3, 1, 1, 2, 9, 3, 1, 1, 1, 3, 1, 16, 1, 2, 4, 2, 1, 4, 1, 1, 2, 40, 5, 1, 13, 1, 1, 1, 7, + 2, 5, 2, 3, 21, 1, 2, 1, 2, 1, 1, 1, 2, 28, 5, 3, 1, 3, 2, 4, 2, 4, 1, 1, 2, 33, 6, 1, 1, 4, 3, 1, 5, 6, 2, 1, 1, 1, 3, 35, 10, + 1, 2, 7, 1, 1, 3, 7, 1, 3, 1, 15, 1, 7, 1, 1, 1, 1, 12, 4, 2, 2, 2, 28, 6, 1, 3, 4, 1, 1, 1, 4, 2, 2, 33, 9, 1, 6, 5, 1, 6, 3, + 57, 20, 1, 1, 1, 2, 4, 1, 1, 5, 1, 7, 1, 1, 7, 1, 1, 1, 1, 9, 2, 1, 4, 18, 4, 4, 3, 4, 1, 1, 14, 1, 1, 2, 1, 1, 1, 1, 1, 45, 10, + 1, 1, 2, 1, 1, 7, 1, 2, 1, 2, 4, 2, 1, 6, 1, 7, 2, 1, 2, 2, 3, 2, 36, 7, 12, 1, 1, 1, 1, 3, 7, 1, 3, 80, 10, 1, 2, 8, 5, 7, 8, + 2, 1, 1, 1, 5, 1, 2, 1, 1, 4, 4, 1, 1, 12, 3, 2, 1, 1, 2, 1, 6, 1, 1, 2, 1, 34, 5, 4, 4, 1, 3, 5, 6, 2, 1, 1, 2, 8, 4, 15, 5, 2, 3, 1, 4, 1, 22, 5, 1, 4, 2, 1, 5, 1, 1, 2, 5, 1, 1, 1, 6, 1, 1, 1 }; static const unsigned char EndCountSml[84251] = @@ -22815,2057 +22811,2057 @@ static const unsigned char EndCountSml[84251] = 206,114,149,107,255,53, 7, 89, 23, 49, 1, 34, 28, 80, 38, 108,174,58, 178,21, 245,74, 224,239,55, 155,37, 10, 9, 184,35, 118,106,247,100,15, 46, 191,42, 21, 222, 109,146,170,219,11, 194,159,62, 215,132,24, 166,118,168,27, 46, 131,83, 226,210,235,70, 44, 197,240,63, 130,26, 33, 201,30, 27, 231,255,221,9, 53, 253,30, 70, 177, 97, 127,202,207,49, 30, 185,147,218,61, 206,23, 55, 108,8, 181,16, 240,255,126,62, 230,100,176,141,182,123,52, 75, 9, 18, 236,176,162,82, 140,17, 14, 161,93, 218, - 105,163,212,44, 123,121,242,113,93, 14, 24, 170,28, 214,107,34, 34, 132,66, 96, 132,28, 169,132,42, 192,62, 3, 132,45, 150,159,110,78, 194,174,198,217,57, 33, 32, - 4, 61, 140,19, 145,157,194,138,186,158,174,158,10, 47, 217,13, 101,104,36, 77, 127,187,80, 158,118,103,40, 17, 15, 59, 174,5, 97, 63, 23, 6, 52, 12, 6, 149,77, - 40, 51, 81, 57, 14, 121,52, 47, 50, 15, 147,145,95, 183,123,87, 69, 55, 206,181,212,87, 185,81, 176,54, 69, 8, 52, 247,125,73, 40, 137,112,121,26, 67, 36, 114,95, - 185,173,128,75, 104,174,32, 100,62, 245,221,9, 22, 203,95, 131,22, 209,161,0, 122,51, 28, 14, 58, 245,214,215,111,114,87, 51, 156,65, 36, 113,146,34, 15, 240,80, - 84, 49, 46, 33, 241,132,128,47, 101,62, 28, 126,139,77, 235,27, 142,4, 55, 135,240,54, 14, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 221,1, 1, 1, 1, 1, 14, 2, 1, 1, 1, 1, 4, 2, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 1, 3, 1, 12, - 4, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 5, 1, 2, 2, 2, - 1, 3, 1, 1, 1, 11, 2, 1, 1, 1, 3, 2, 2, 3, 2, 2, 1, 1, 1, 10, 2, 1, 1, 1, 1, 4, 2, 2, 3, 1, 2, 15, 3, 1, 3, 3, 2, 1, 1, 5, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 1, 19, 3, 2, 6, 1, 2, 7, 10, 4, 1, 4, 1, 1, 10, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, - 5, 2, 13, 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, 3, 2, 1, 1, 1, 1, 1, 10, 2, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 7, 3, 1, 3, 20, - 1, 1, 1, 1, 3, 2, 1, 3, 1, 1, 1, 5, 1, 1, 3, 3, 1, 1, 1, 16, 1, 1, 7, 3, 2, 1, 2, 2, 2, 1, 1, 2, 1, 1, 2, 2, 16, 3, 2, 6, 2, - 1, 3, 2, 2, 1, 5, 2, 3, 3, 1, 1, 4, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 11, 1, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 3, 2, 1, 1, 2, 2, - 2, 2, 2, 2, 1, 1, 1, 62, 36, 24, 20, 11, 5, 3, 2, 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 5, 1, 2, 1, 2, 1, - 1, 10, 5, 4, 1, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 1, 1, 1, 81, 58, 40, 34, 33, 2, 10, 11, 7, 4, 4, 6, 5, 5, 3, 3, 2, 2, 1, 1, 1, - 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 2, 2, 2, 1, 4, 3, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, - 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 9, 9, 2, 2, 2, 2, 1, 1, 1, 1, 6, 3, 3, 3, 2, 2, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 150,133,12, 12, 12, 2, 15, 14, 14, 4, 9, 16, 16, 16, 7, 9, 18, 18, 18, 8, 17, 17, 17, 7, 14, 14, 14, 5, 9, 14, 14, 14, 5, 9, 14, 14, 14, 5, - 13, 13, 13, 5, 8, 13, 12, 12, 12, 4, 8, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 6, 5, 2, 2, 2, 2, 1, 1, 1, 1, 1, 10, 5, 2, 2, 2, - 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 5, 5, 4, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 8, 4, 4, 2, 2, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, - 9, 5, 4, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11, 5, 2, 2, 2, 2, 2, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 11, 5, 1, 1, 2, - 2, 1, 1, 2, 2, 6, 1, 3, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 3, - 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 3, 1, 100,34, 7, 4, 2, 5, 1, 3, 2, 1, 2, - 2, 3, 1, 1, 3, 2, 1, 1, 1, 17, 8, 4, 1, 1, 1, 3, 2, 1, 3, 1, 21, 11, 10, 8, 5, 4, 3, 2, 6, 6, 6, 5, 5, 3, 2, 1, 2, 2, 1, 1, 1, - 2, 4, 3, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 134,12, 1, 1, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 51, 2, 2, 2, 24, 18, 13, 6, 3, 1, - 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 2, 13, 3, 2, 2, 2, 9, 9, 6, 5, 4, 1, 1, 1, 1, 1, 3, 2, 1, 1, 1, 1, 32, 19, 2, 2, 1, 15, 14, 6, 5, - 3, 2, 1, 1, 8, 2, 2, 2, 5, 5, 4, 3, 2, 2, 1, 8, 5, 3, 3, 2, 2, 2, 4, 3, 3, 2, 3, 2, 4, 2, 1, 1, 1, 5, 1, 1, 1, 3, 2, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 2, 1, 10, 1, 1, 2, 2, 2, 2, 1, 25, 2, 1, 1, 2, 1, 1, 12, 8, 5, 2, 2, 1, 1, 1, 5, 3, 3, 2, 2, 1, 1, 1, 1, - 1, 10, 2, 1, 1, 5, 4, 3, 2, 2, 2, 2, 1, 1, 3, 25, 25, 24, 4, 3, 2, 3, 2, 5, 3, 2, 11, 3, 5, 2, 2, 3, 3, 31, 27, 26, 3, 2, 4, 3, 2, - 1, 3, 6, 3, 2, 1, 2, 2, 4, 4, 3, 2, 3, 6, 4, 4, 3, 2, 1, 5, 4, 2, 3, 3, 2, 7, 5, 5, 185,4, 3, 1, 4, 2, 2, 114,2, 1, 1, 88, 2, - 1, 71, 20, 3, 1, 1, 5, 3, 2, 2, 5, 2, 6, 2, 8, 4, 3, 2, 4, 2, 2, 3, 2, 1, 1, 1, 3, 4, 7, 9, 5, 4, 3, 2, 3, 2, 6, 3, 2, 1, 4, - 2, 3, 9, 4, 3, 2, 3, 2, 2, 12, 3, 2, 6, 5, 4, 3, 3, 1, 4, 3, 2, 2, 2, 2, 1, 2, 2, 8, 3, 3, 2, 1, 1, 9, 7, 6, 5, 2, 2, 2, 2, - 1, 1, 2, 1, 12, 3, 2, 3, 2, 2, 4, 2, 23, 11, 10, 5, 4, 3, 2, 8, 6, 5, 3, 6, 4, 4, 2, 3, 5, 2, 2, 14, 5, 3, 1, 4, 2, 3, 1, 1, 1, - 2, 4, 3, 3, 2, 2, 2, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 1, 4, 2, 1, 1, 27, 3, 3, 2, 20, 2, 1, 16, 2, 2, 4, 4, 3, 2, 4, - 3, 3, 2, 1, 3, 1, 2, 2, 3, 2, 3, 2, 13, 1, 3, 2, 2, 5, 3, 3, 2, 2, 2, 2, 14, 1, 3, 3, 2, 2, 1, 1, 1, 4, 2, 1, 3, 2, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 11, 1, 1, 1, 1, 10, 2, 2, 3, 3, 2, 2, 1, 3, 3, 2, 2, 3, 1, 1, 1, 2, 100,9, 2, - 2, 2, 2, 9, 4, 3, 2, 1, 13, 8, 3, 3, 2, 2, 3, 2, 1, 2, 2, 1, 1, 1, 1, 5, 2, 1, 1, 1, 1, 1, 1, 13, 10, 9, 9, 4, 3, 1, 1, 1, 35, - 1, 1, 1, 1, 1, 30, 2, 2, 2, 2, 2, 2, 22, 3, 1, 5, 2, 5, 4, 3, 1, 2, 2, 8, 1, 1, 3, 1, 1, 2, 3, 4, 1, 2, 2, 81, 9, 3, 1, 1, 1, - 2, 7, 1, 1, 1, 3, 2, 2, 1, 5, 3, 2, 2, 1, 5, 2, 1, 1, 3, 5, 1, 1, 2, 2, 31, 6, 6, 6, 5, 3, 3, 3, 2, 2, 12, 6, 6, 3, 6, 6, 4, - 2, 2, 2, 5, 3, 1, 5, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 103,10, 2, 3, 2, 2, 1, 7, 2, 2, 2, 1, 1, 1, 5, 2, 2, 2, 1, 1, 1, 8, 1, 1, - 1, 5, 2, 2, 1, 1, 1, 5, 1, 1, 1, 2, 4, 1, 4, 1, 1, 1, 50, 3, 10, 10, 10, 2, 1, 2, 3, 3, 20, 19, 18, 2, 4, 3, 2, 2, 6, 5, 3, 3, 2, - 2, 1, 1, 1, 1, 33, 4, 3, 3, 2, 4, 4, 2, 3, 3, 1, 1, 1, 43, 10, 4, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 7, 1, 1, 1, 2, 2, 3, - 1, 5, 1, 1, 1, 1, 3, 4, 2, 38, 7, 2, 4, 2, 5, 1, 1, 1, 1, 3, 1, 3, 1, 1, 3, 1, 1, 4, 3, 1, 1, 1, 1, 1, 1, 148,5, 4, 2, 1, 10, - 3, 3, 3, 5, 5, 5, 4, 4, 3, 7, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, 9, 3, 1, 23, 3, 3, 1, 2, 1, 1, 2, 1, 3, 2, - 3, 2, 2, 2, 48, 5, 2, 2, 2, 2, 1, 1, 5, 3, 1, 4, 2, 3, 6, 2, 1, 1, 7, 2, 1, 1, 1, 1, 1, 1, 4, 3, 5, 3, 6, 2, 32, 5, 2, 2, 1, - 3, 1, 1, 3, 1, 1, 6, 2, 1, 1, 1, 5, 2, 2, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 43, 12, 4, 4, 4, - 3, 3, 2, 2, 4, 4, 4, 3, 2, 4, 4, 4, 3, 3, 2, 2, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 1, 1, 3, 1, 1, 2, 2, 2, 1, 1, 6, 3, 1, 2, - 2, 3, 3, 3, 2, 1, 1, 5, 2, 2, 2, 2, 1, 1, 2, 1, 3, 1, 1, 1, 1, 50, 11, 2, 1, 2, 1, 1, 1, 2, 1, 3, 3, 3, 3, 2, 4, 3, 2, 14, 8, - 3, 1, 2, 2, 1, 3, 3, 1, 1, 2, 1, 4, 2, 1, 4, 3, 1, 1, 4, 2, 1, 1, 6, 1, 1, 2, 2, 1, 1, 1, 1, 1, 34, 6, 1, 3, 1, 1, 2, 2, 2, - 2, 2, 1, 1, 10, 3, 2, 2, 4, 1, 1, 1, 2, 2, 2, 1, 1, 1, 9, 1, 1, 1, 1, 2, 1, 1, 1, 2, 2, 5, 2, 1, 1, 1, 1, 1, 1, 1, 22, 8, 1, - 1, 2, 1, 2, 2, 2, 2, 2, 4, 2, 1, 1, 3, 1, 1, 2, 1, 3, 1, 1, 1, 8, 2, 2, 2, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 24, - 2, 1, 2, 1, 1, 1, 2, 2, 2, 3, 2, 2, 3, 2, 1, 1, 3, 1, 2, 5, 1, 2, 1, 2, 4, 4, 4, 17, 3, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 3, - 3, 3, 3, 3, 1, 1, 2, 2, 2, 3, 1, 1, 1, 1, 23, 7, 4, 2, 1, 1, 3, 1, 1, 2, 2, 2, 2, 7, 1, 2, 1, 2, 2, 1, 2, 2, 2, 2, 2, 5, 1, - 2, 2, 2, 2, 1, 1, 1, 24, 1, 1, 1, 1, 6, 3, 3, 1, 1, 1, 5, 1, 1, 1, 1, 2, 1, 1, 3, 3, 3, 3, 7, 3, 3, 1, 2, 1, 1, 2, 1, 7, 1, - 1, 3, 1, 1, 1, 1, 13, 1, 1, 1, 1, 2, 1, 1, 1, 3, 1, 5, 4, 4, 1, 1, 38, 12, 3, 1, 1, 1, 2, 3, 1, 2, 1, 1, 1, 4, 1, 1, 1, 2, 1, - 6, 3, 2, 2, 2, 1, 1, 12, 5, 2, 2, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 30, 1, 1, - 9, 1, 1, 1, 2, 2, 4, 4, 1, 1, 2, 2, 1, 1, 5, 2, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 2, 2, 1, 1, 1, 1, 3, 1, - 1, 1, 57, 1, 1, 1, 12, 1, 3, 3, 3, 2, 2, 1, 6, 6, 5, 4, 4, 3, 2, 2, 2, 2, 2, 2, 2, 31, 5, 5, 5, 4, 4, 3, 2, 2, 2, 1, 2, 2, 2, - 22, 1, 1, 1, 1, 6, 6, 5, 4, 3, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 8, 1, 5, 4, 3, 2, 2, 2, 2, 1, 1, 1, 1, 10, 2, 2, 2, 8, 7, 7, - 6, 2, 1, 17, 7, 1, 1, 3, 2, 2, 1, 2, 1, 1, 1, 6, 4, 4, 1, 1, 1, 2, 49, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 3, 3, 1, 1, 5, 1, 1, 1, - 3, 2, 4, 2, 1, 1, 3, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 5, 2, 2, 9, 3, 3, 4, 1, 1, 1, 9, 3, 1, 2, 1, 2, 2, 2, 1, 19, 1, 3, 1, 4, - 2, 1, 1, 1, 6, 1, 1, 1, 3, 1, 1, 2, 1, 2, 2, 5, 1, 1, 1, 1, 1, 1, 1, 6, 2, 1, 1, 1, 2, 1, 1, 14, 4, 1, 1, 1, 1, 1, 1, 2, 2, - 2, 1, 1, 1, 6, 2, 1, 1, 1, 3, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 4, 2, 1, 1, 1, 1, 1, 9, 4, 3, 3, 3, 2, 2, 2, - 2, 2, 2, 3, 3, 3, 3, 2, 1, 4, 44, 26, 7, 4, 1, 1, 1, 1, 1, 1, 2, 3, 2, 2, 1, 2, 2, 1, 1, 1, 3, 3, 3, 2, 7, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 32, 7, 3, 3, 3, 1, 1, 6, 2, 4, 1, 1, 1, 1, 6, 1, 1, 1, 1, 2, 2, 2, 1, 1, 4, 1, 1, - 1, 1, 1, 3, 3, 3, 3, 2, 2, 1, 1, 1, 2, 1, 1, 50, 8, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 15, 8, 1, 4, 2, 1, 9, 6, 2, 2, 1, - 2, 1, 5, 5, 2, 2, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 29, 6, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 4, 1, 1, 3, 2, 3, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 36, 4, 2, 1, 1, - 2, 2, 1, 1, 1, 1, 1, 1, 1, 15, 12, 4, 2, 1, 4, 2, 2, 2, 2, 1, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 46, 12, 3, 1, 1, 1, 2, 1, - 1, 5, 1, 3, 1, 2, 1, 1, 1, 1, 4, 1, 18, 10, 2, 2, 3, 2, 1, 1, 1, 14, 7, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, - 1, 1, 1, 1, 9, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11, 4, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 6, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 3, 2, 2, 2, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, - 1, 1, 1, 1, 3, 1, 1, 1, 5, 1, 1, 4, 4, 3, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 4, 1, 1, 1, 2, 1, 1, 4, 2, 2, 2, - 1, 1, 2, 1, 1, 1, 1, 10, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 6, 6, 1, 1, 1, 1, 1, 1, 1, 227,34, 21, 4, 2, 2, 2, 2, 1, 2, 1, 1, - 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 24, 2, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 7, 6, 6, 6, 5, 3, 3, 1, 1, 4, 1, 24, 14, 3, - 2, 2, 7, 3, 3, 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, 4, 2, 2, 2, 2, 2, 1, 1, 1, 36, 1, 2, 2, 17, 3, 3, 2, 4, 2, 2, 2, 2, 2, 2, 3, 3, - 2, 3, 3, 2, 2, 4, 1, 3, 1, 1, 1, 1, 2, 1, 1, 1, 12, 2, 1, 1, 1, 1, 1, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 14, 2, 5, 1, 1, 2, 1, - 1, 33, 2, 1, 1, 4, 1, 1, 1, 3, 1, 1, 1, 2, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 15, 3, 3, 3, 2, 6, 3, 3, 3, 3, 2, 5, 2, 1, 1, 1, 1, - 11, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 3, 1, 1, 2, 1, 4, 1, 1, 1, - 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 3, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 217,21, 9, 2, 1, 2, 1, 3, 3, 2, 1, 1, 8, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 20, 9, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 7, 2, 1, 1, 1, 1, 1, 3, 3, 28, 2, 3, 2, 2, 2, 2, 12, 3, 2, 2, 2, 2, 4, 4, 3, 2, 1, 1, 1, 2, 2, 2, 30, 2, 1, 1, 1, 1, 2, 2, 1, - 1, 1, 2, 1, 1, 1, 16, 3, 3, 3, 2, 2, 2, 2, 2, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 8, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 1, 1, 1, 8, 8, 8, 8, 7, 7, 6, 5, 2, 1, 1, 1, 1, 1, 11, 1, 1, 1, 1, 1, 1, 1, 2, - 3, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 2, 2, 4, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 3, - 2, 1, 1, 1, 2, 1, 1, 1, 1, 5, 1, 1, 1, 1, 8, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 6, 2, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, - 1, 3, 1, 1, 1, 6, 2, 2, 1, 1, 3, 2, 1, 1, 1, 1, 177,1, 1, 1, 1, 1, 25, 12, 4, 2, 3, 3, 3, 14, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 9, 7, 1, 2, 2, 2, 1, 1, 1, 10, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 5, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 16, 3, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 6, 4, 4, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, 54, 2, 1, 1, 1, 3, 2, 1, 1, 1, 6, 4, 3, 3, 1, 1, 1, 1, 30, 3, 4, 3, 2, 11, 10, - 2, 1, 3, 3, 2, 2, 5, 5, 2, 3, 3, 1, 1, 1, 1, 1, 13, 1, 1, 1, 1, 1, 3, 1, 1, 1, 4, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 8, 1, 1, - 1, 1, 1, 1, 1, 2, 1, 1, 1, 3, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 7, 1, 1, 2, 2, 2, 2, 2, 2, 1, - 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 138,12, 5, 1, 1, 1, 1, 1, 1, 1, 5, 2, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 2, 1, 1, 1, 12, 1, 7, 4, 4, 4, 1, 1, 1, 1, 1, 41, 1, 1, 1, 1, 4, 2, - 1, 24, 4, 2, 3, 5, 4, 4, 3, 3, 1, 1, 3, 3, 2, 2, 1, 1, 2, 2, 2, 2, 2, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 8, 2, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 1, 1, 1, 5, 5, 3, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 208,2, 2, 2, 1, 1, 15, 5, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2, - 1, 1, 4, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 4, 2, 1, 33, 21, 2, 1, 1, 1, 7, 4, 4, 3, 6, 6, 5, 3, 3, 2, 2, 2, 1, 1, 1, 1, - 1, 1, 1, 2, 1, 1, 1, 1, 4, 1, 2, 1, 1, 1, 15, 1, 6, 4, 4, 3, 2, 1, 1, 1, 4, 1, 1, 1, 6, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, - 43, 1, 1, 1, 1, 2, 2, 3, 1, 2, 2, 2, 28, 2, 2, 2, 2, 2, 2, 11, 10, 1, 1, 1, 8, 7, 2, 2, 2, 1, 1, 1, 3, 1, 1, 1, 1, 45, 1, 2, 3, - 1, 1, 5, 4, 3, 2, 28, 2, 2, 8, 8, 7, 6, 5, 4, 3, 6, 4, 4, 4, 3, 2, 2, 2, 3, 1, 1, 1, 1, 1, 1, 4, 3, 3, 3, 3, 1, 1, 1, 4, 3, - 3, 2, 2, 2, 2, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, - 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 2, 2, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 124,16, 6, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 2, 1, 1, - 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 16, 10, 2, 1, 2, 2, 1, 1, 2, 1, 1, 1, 1, 7, 1, 1, 1, 1, 3, 3, 3, 3, 1, 1, 1, - 10, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 20, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, - 2, 8, 3, 1, 2, 2, 1, 1, 1, 18, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 150,19, 8, 2, 2, 2, 1, 1, 3, 2, 1, 1, 1, 1, 12, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 6, - 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 5, 3, 3, 3, 3, 1, 3, 1, 1, 12, 8, 4, 3, 1, 1, 1, 18, 15, 6, 3, 3, 2, 2, 6, 5, 4, 3, 3, 1, 6, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 1, 1, 1, 1, 1, 19, 2, 2, 7, 3, 3, 3, 4, 4, 3, 6, 5, 5, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 28, 1, - 1, 2, 1, 2, 2, 2, 1, 5, 5, 3, 3, 2, 12, 2, 2, 2, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 2, 14, - 1, 1, 1, 1, 2, 2, 2, 1, 1, 43, 4, 3, 3, 3, 1, 18, 1, 17, 13, 10, 8, 4, 3, 2, 1, 2, 2, 1, 1, 1, 3, 3, 3, 3, 2, 2, 7, 1, 6, 5, 4, - 3, 2, 1, 1, 1, 1, 5, 5, 5, 5, 4, 3, 2, 2, 3, 2, 2, 2, 13, 2, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, - 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 139,10, 2, 2, 2, 7, 7, 5, 4, 3, 53, 7, 6, 5, 2, 27, 3, 2, 17, - 11, 7, 4, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 3, 1, 2, 2, 2, 1, 2, 4, 2, 2, 2, 1, 3, 4, 1, 4, 1, 2, 10, 2, 1, 1, 1, - 2, 1, 1, 6, 2, 2, 4, 2, 1, 2, 23, 2, 3, 1, 2, 1, 2, 9, 9, 2, 1, 1, 8, 2, 4, 2, 2, 1, 1, 1, 1, 2, 2, 5, 5, 4, 1, 1, 1, 52, 2, - 8, 1, 5, 1, 3, 3, 3, 6, 5, 5, 5, 4, 4, 1, 1, 1, 8, 3, 2, 2, 1, 2, 50, 16, 2, 1, 1, 7, 3, 2, 1, 1, 11, 1, 3, 1, 1, 4, 1, 5, 2, - 1, 7, 6, 2, 3, 5, 3, 3, 3, 3, 3, 2, 2, 1, 1, 1, 4, 31, 10, 9, 7, 4, 3, 2, 1, 1, 14, 6, 5, 7, 3, 2, 4, 58, 4, 4, 2, 10, 10, 2, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 3, 3, 3, 12, 2, 5, 3, 3, 2, 2, 2, 2, 1, 1, 26, 9, 9, 2, 3, 14, 2, 1, 1, 5, 5, 2, 3, 1, 1, 1, - 1, 1, 2, 65, 4, 1, 2, 16, 4, 3, 4, 4, 2, 1, 1, 1, 23, 1, 5, 2, 1, 3, 3, 3, 2, 3, 2, 2, 2, 1, 2, 1, 1, 1, 1, 3, 2, 2, 2, 1, 3, - 3, 2, 1, 1, 1, 1, 6, 1, 2, 2, 2, 12, 7, 1, 1, 1, 1, 1, 1, 2, 3, 3, 3, 3, 2, 1, 33, 6, 2, 5, 5, 3, 7, 2, 2, 2, 4, 2, 3, 1, 3, - 1, 1, 7, 2, 1, 2, 1, 3, 3, 3, 2, 17, 6, 2, 2, 7, 2, 2, 1, 1, 1, 1, 7, 3, 4, 4, 4, 4, 4, 46, 1, 1, 10, 1, 1, 8, 4, 4, 4, 4, 4, - 4, 3, 3, 3, 3, 3, 3, 2, 9, 4, 4, 4, 4, 5, 3, 1, 1, 1, 1, 13, 2, 1, 1, 1, 4, 4, 1, 1, 3, 3, 3, 1, 1, 1, 2, 1, 1, 1, 1, 63, 32, - 3, 2, 2, 2, 1, 1, 1, 6, 6, 6, 2, 3, 1, 1, 1, 13, 8, 5, 3, 2, 1, 4, 4, 1, 1, 10, 2, 7, 3, 3, 2, 7, 1, 7, 2, 2, 1, 4, 4, 2, 62, - 3, 2, 2, 3, 2, 2, 1, 1, 6, 6, 4, 2, 2, 1, 4, 2, 2, 1, 24, 13, 10, 10, 4, 1, 4, 2, 3, 9, 8, 4, 15, 3, 3, 3, 2, 2, 1, 1, 8, 7, 7, - 7, 5, 5, 5, 3, 2, 1, 1, 1, 36, 1, 2, 2, 2, 3, 3, 2, 7, 6, 4, 4, 2, 8, 5, 2, 1, 1, 5, 2, 1, 1, 6, 5, 4, 2, 2, 1, 1, 1, 25, 2, - 2, 16, 12, 12, 10, 7, 3, 2, 4, 4, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 175,6, 1, 1, 1, 2, 2, 58, 3, 12, 11, 11, 9, 8, 3, 2, 2, 2, 7, 7, - 4, 9, 9, 3, 2, 1, 1, 25, 24, 6, 3, 2, 5, 3, 3, 2, 2, 2, 9, 6, 6, 6, 6, 3, 3, 2, 2, 2, 1, 1, 1, 5, 3, 2, 2, 1, 2, 2, 2, 2, 55, - 3, 3, 24, 2, 6, 6, 6, 6, 6, 16, 7, 7, 5, 9, 9, 6, 6, 11, 10, 5, 2, 3, 3, 1, 2, 2, 14, 13, 12, 6, 3, 1, 1, 1, 1, 1, 1, 14, 8, 6, 6, - 6, 2, 1, 1, 4, 26, 1, 1, 1, 9, 8, 8, 8, 5, 3, 2, 2, 10, 3, 3, 1, 1, 1, 1, 3, 1, 1, 49, 5, 2, 1, 2, 3, 1, 1, 1, 1, 9, 1, 3, 1, - 13, 3, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 1, 1, 1, 6, 6, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 3, 2, 1, 49, 7, 4, 3, - 1, 1, 1, 12, 1, 1, 1, 1, 2, 1, 1, 1, 17, 9, 9, 7, 3, 3, 3, 5, 3, 1, 1, 1, 3, 2, 2, 1, 2, 14, 9, 2, 3, 1, 1, 1, 1, 1, 1, 1, 2, - 31, 9, 8, 2, 2, 2, 4, 2, 5, 3, 8, 8, 8, 8, 8, 8, 8, 5, 1, 1, 6, 2, 5, 2, 2, 2, 2, 22, 2, 1, 2, 2, 1, 1, 1, 6, 2, 2, 4, 4, 4, - 4, 4, 2, 19, 19, 6, 4, 4, 4, 2, 2, 1, 1, 13, 3, 3, 3, 3, 4, 2, 3, 2, 28, 5, 4, 2, 2, 2, 1, 16, 5, 5, 4, 2, 1, 1, 1, 1, 1, 1, 1, - 4, 1, 2, 2, 2, 3, 2, 2, 2, 56, 29, 4, 2, 6, 6, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 17, 3, 6, 4, 4, 3, 1, 1, 1, 1, 1, 3, 2, 13, 12, - 4, 2, 3, 2, 5, 21, 2, 2, 3, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 5, 5, 1, 1, 3, 1, 1, 3, 2, 1, 1, 1, 1, 84, 2, 2, 5, 2, - 2, 2, 40, 4, 3, 7, 1, 3, 3, 3, 2, 4, 5, 3, 1, 9, 2, 2, 1, 1, 4, 16, 16, 4, 4, 4, 3, 2, 3, 2, 53, 5, 8, 1, 4, 21, 7, 6, 2, 2, 2, - 3, 1, 1, 1, 6, 6, 4, 2, 2, 1, 6, 6, 6, 6, 3, 6, 5, 3, 64, 2, 1, 29, 4, 2, 2, 1, 5, 1, 3, 3, 2, 2, 5, 1, 1, 1, 12, 3, 1, 5, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 7, 3, 3, 3, 3, 1, 1, 2, 5, 3, 3, 3, 2, 17, 3, 12, 7, 6, 3, 1, 32, 1, 1, 1, 2, 8, 8, 7, 3, 2, 2, - 2, 1, 1, 1, 1, 1, 1, 4, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 1, 33, 3, 2, 2, 2, 4, 3, 3, 3, 3, 8, 5, 5, 3, 3, 3, 18, 6, 5, 5, 5, - 5, 2, 2, 8, 8, 2, 6, 1, 5, 3, 2, 10, 2, 5, 2, 54, 2, 45, 20, 4, 1, 1, 1, 1, 13, 13, 13, 4, 9, 9, 8, 5, 14, 8, 2, 2, 4, 4, 4, 4, 6, - 4, 2, 4, 4, 4, 3, 3, 5, 3, 2, 43, 11, 3, 3, 3, 3, 3, 5, 5, 2, 1, 1, 4, 2, 10, 10, 4, 13, 2, 7, 35, 3, 7, 7, 5, 5, 3, 1, 1, 22, 16, - 11, 3, 2, 2, 2, 3, 3, 3, 7, 2, 2, 2, 1, 1, 14, 1, 11, 8, 4, 4, 2, 1, 1, 1, 72, 1, 1, 1, 14, 13, 7, 6, 5, 5, 5, 4, 33, 13, 13, 4, 1, - 8, 8, 5, 19, 3, 6, 3, 10, 8, 8, 15, 12, 6, 4, 4, 8, 6, 6, 3, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 101,1, 1, 2, 5, 2, 2, 3, 2, 2, 4, - 3, 3, 2, 3, 2, 4, 2, 47, 3, 4, 3, 32, 4, 2, 5, 2, 2, 3, 3, 3, 3, 3, 3, 2, 1, 1, 1, 2, 2, 1, 5, 5, 5, 5, 5, 4, 2, 2, 2, 9, 2, - 2, 3, 3, 1, 1, 1, 1, 1, 1, 11, 4, 4, 1, 1, 2, 2, 1, 1, 1, 3, 3, 3, 12, 8, 8, 6, 2, 1, 2, 2, 1, 1, 3, 3, 3, 3, 3, 2, 167,6, 1, - 3, 2, 1, 1, 1, 1, 65, 5, 1, 3, 3, 15, 10, 10, 6, 4, 4, 2, 3, 2, 22, 2, 2, 2, 6, 4, 3, 7, 7, 9, 6, 6, 5, 2, 2, 8, 7, 6, 2, 1, 1, - 6, 2, 2, 3, 3, 3, 4, 4, 4, 4, 2, 2, 1, 1, 1, 5, 2, 2, 2, 2, 2, 2, 5, 3, 1, 1, 8, 2, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 31, - 2, 19, 11, 10, 2, 6, 5, 5, 1, 8, 1, 1, 1, 2, 1, 1, 1, 5, 2, 3, 2, 26, 21, 1, 1, 1, 1, 20, 1, 1, 2, 2, 3, 3, 2, 4, 3, 2, 1, 4, 2, - 2, 2, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 2, 1, 3, 3, 6, 3, 2, 2, 2, 2, 1, 7, 2, 2, 1, 3, 2, 8, 4, 2, 1, 3, - 1, 1, 1, 1, 1, 1, 1, 3, 1, 29, 2, 15, 3, 2, 7, 4, 2, 2, 1, 1, 31, 2, 1, 3, 3, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 20, 4, 4, 4, 4, 14, - 6, 6, 4, 3, 3, 1, 4, 3, 22, 5, 3, 4, 1, 1, 8, 7, 7, 1, 4, 19, 9, 2, 3, 1, 1, 1, 1, 5, 4, 3, 3, 3, 26, 10, 1, 4, 2, 1, 1, 1, 5, - 3, 1, 1, 1, 7, 7, 5, 4, 1, 2, 1, 45, 5, 16, 2, 8, 2, 2, 2, 2, 4, 4, 17, 1, 1, 1, 1, 9, 2, 7, 7, 7, 7, 7, 4, 4, 2, 1, 1, 1, 3, - 2, 7, 1, 1, 1, 1, 1, 3, 2, 2, 1, 1, 1, 1, 52, 8, 3, 2, 1, 1, 1, 1, 1, 4, 3, 17, 10, 3, 2, 4, 4, 2, 1, 2, 3, 3, 1, 2, 10, 8, 2, - 1, 1, 1, 1, 5, 4, 3, 1, 1, 120,17, 3, 5, 3, 3, 6, 2, 3, 3, 1, 1, 1, 9, 7, 6, 5, 4, 2, 2, 2, 2, 24, 3, 1, 1, 6, 1, 2, 1, 1, 2, - 1, 1, 2, 2, 1, 1, 1, 19, 12, 8, 4, 1, 1, 1, 1, 2, 5, 4, 4, 3, 8, 12, 2, 8, 8, 3, 2, 2, 2, 2, 1, 1, 2, 2, 1, 1, 4, 1, 2, 234,4, - 1, 4, 2, 1, 13, 4, 3, 5, 2, 1, 5, 2, 2, 13, 2, 3, 4, 3, 3, 3, 19, 6, 3, 5, 15, 5, 2, 2, 2, 16, 4, 1, 1, 2, 2, 2, 4, 2, 1, 1, 1, - 1, 1, 100,2, 10, 4, 3, 3, 3, 2, 1, 6, 3, 1, 2, 6, 4, 2, 2, 1, 1, 1, 2, 5, 2, 10, 2, 2, 4, 2, 2, 2, 2, 4, 3, 3, 2, 2, 2, 9, 7, - 2, 4, 4, 5, 3, 1, 7, 3, 3, 3, 15, 4, 2, 2, 6, 5, 4, 5, 2, 7, 4, 3, 2, 2, 2, 13, 4, 1, 1, 1, 1, 1, 10, 2, 2, 2, 3, 2, 2, 1, 3, - 1, 29, 13, 2, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 3, 2, 2, 2, 2, 2, 2, 2, 3, 1, 1, 139,3, 3, 1, 29, 4, 4, 4, 4, 1, 1, 2, 2, 4, 3, 5, - 4, 1, 1, 1, 1, 1, 4, 3, 3, 17, 1, 2, 8, 3, 9, 3, 1, 1, 1, 1, 1, 33, 1, 1, 1, 1, 3, 1, 1, 2, 3, 2, 7, 3, 1, 6, 1, 1, 1, 1, 1, - 2, 3, 3, 2, 1, 5, 3, 2, 1, 1, 1, 3, 2, 2, 2, 4, 6, 2, 2, 1, 11, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 3, 2, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 1, 2, 2, 1, 1, 108,8, 8, 4, 2, 2, 3, 3, 2, 2, 7, 1, 2, 2, 2, 2, 1, + 105,163,212,44, 123,121,242,113,93, 14, 24, 170,28, 214,107,34, 34, 132,66, 96, 132,28, 169,132,42, 192,62, 3, 132,45, 150,159,110,78, 194,174,198,217,57, 33, 32, + 4, 61, 140,19, 145,157,194,138,186,158,174,158,10, 47, 217,13, 101,104,36, 77, 127,187,80, 158,118,103,40, 17, 15, 59, 174,5, 97, 63, 23, 6, 52, 12, 6, 149,77, + 40, 51, 81, 57, 14, 121,52, 47, 50, 15, 147,145,95, 183,123,87, 69, 55, 206,181,212,87, 185,81, 176,54, 69, 8, 52, 247,125,73, 40, 137,112,121,26, 67, 36, 114,95, + 185,173,128,75, 104,174,32, 100,62, 245,221,9, 22, 203,95, 131,22, 209,161,0, 122,51, 28, 14, 58, 245,214,215,111,114,87, 51, 156,65, 36, 113,146,34, 15, 240,80, + 84, 49, 46, 33, 241,132,128,47, 101,62, 28, 126,139,77, 235,27, 142,4, 55, 135,240,54, 14, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 221,1, 1, 1, 1, 1, 14, 2, 1, 1, 1, 1, 4, 2, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 1, 3, 1, 12, + 4, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 5, 1, 2, 2, 2, + 1, 3, 1, 1, 1, 11, 2, 1, 1, 1, 3, 2, 2, 3, 2, 2, 1, 1, 1, 10, 2, 1, 1, 1, 1, 4, 2, 2, 3, 1, 2, 15, 3, 1, 3, 3, 2, 1, 1, 5, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 1, 19, 3, 2, 6, 1, 2, 7, 10, 4, 1, 4, 1, 1, 10, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 5, 2, 13, 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, 3, 2, 1, 1, 1, 1, 1, 10, 2, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 7, 3, 1, 3, 20, + 1, 1, 1, 1, 3, 2, 1, 3, 1, 1, 1, 5, 1, 1, 3, 3, 1, 1, 1, 16, 1, 1, 7, 3, 2, 1, 2, 2, 2, 1, 1, 2, 1, 1, 2, 2, 16, 3, 2, 6, 2, + 1, 3, 2, 2, 1, 5, 2, 3, 3, 1, 1, 4, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 11, 1, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 3, 2, 1, 1, 2, 2, + 2, 2, 2, 2, 1, 1, 1, 62, 36, 24, 20, 11, 5, 3, 2, 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 5, 1, 2, 1, 2, 1, + 1, 10, 5, 4, 1, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 1, 1, 1, 81, 58, 40, 34, 33, 2, 10, 11, 7, 4, 4, 6, 5, 5, 3, 3, 2, 2, 1, 1, 1, + 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 2, 2, 2, 1, 4, 3, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, + 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 9, 9, 2, 2, 2, 2, 1, 1, 1, 1, 6, 3, 3, 3, 2, 2, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 150,133,12, 12, 12, 2, 15, 14, 14, 4, 9, 16, 16, 16, 7, 9, 18, 18, 18, 8, 17, 17, 17, 7, 14, 14, 14, 5, 9, 14, 14, 14, 5, 9, 14, 14, 14, 5, + 13, 13, 13, 5, 8, 13, 12, 12, 12, 4, 8, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 6, 5, 2, 2, 2, 2, 1, 1, 1, 1, 1, 10, 5, 2, 2, 2, + 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 5, 5, 4, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 8, 4, 4, 2, 2, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 9, 5, 4, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11, 5, 2, 2, 2, 2, 2, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 11, 5, 1, 1, 2, + 2, 1, 1, 2, 2, 6, 1, 3, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 3, + 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 3, 1, 100,34, 7, 4, 2, 5, 1, 3, 2, 1, 2, + 2, 3, 1, 1, 3, 2, 1, 1, 1, 17, 8, 4, 1, 1, 1, 3, 2, 1, 3, 1, 21, 11, 10, 8, 5, 4, 3, 2, 6, 6, 6, 5, 5, 3, 2, 1, 2, 2, 1, 1, 1, + 2, 4, 3, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 134,12, 1, 1, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 51, 2, 2, 2, 24, 18, 13, 6, 3, 1, + 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 2, 13, 3, 2, 2, 2, 9, 9, 6, 5, 4, 1, 1, 1, 1, 1, 3, 2, 1, 1, 1, 1, 32, 19, 2, 2, 1, 15, 14, 6, 5, + 3, 2, 1, 1, 8, 2, 2, 2, 5, 5, 4, 3, 2, 2, 1, 8, 5, 3, 3, 2, 2, 2, 4, 3, 3, 2, 3, 2, 4, 2, 1, 1, 1, 5, 1, 1, 1, 3, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 2, 1, 10, 1, 1, 2, 2, 2, 2, 1, 25, 2, 1, 1, 2, 1, 1, 12, 8, 5, 2, 2, 1, 1, 1, 5, 3, 3, 2, 2, 1, 1, 1, 1, + 1, 10, 2, 1, 1, 5, 4, 3, 2, 2, 2, 2, 1, 1, 3, 25, 25, 24, 4, 3, 2, 3, 2, 5, 3, 2, 11, 3, 5, 2, 2, 3, 3, 31, 27, 26, 3, 2, 4, 3, 2, + 1, 3, 6, 3, 2, 1, 2, 2, 4, 4, 3, 2, 3, 6, 4, 4, 3, 2, 1, 5, 4, 2, 3, 3, 2, 7, 5, 5, 185,4, 3, 1, 4, 2, 2, 114,2, 1, 1, 88, 2, + 1, 71, 20, 3, 1, 1, 5, 3, 2, 2, 5, 2, 6, 2, 8, 4, 3, 2, 4, 2, 2, 3, 2, 1, 1, 1, 3, 4, 7, 9, 5, 4, 3, 2, 3, 2, 6, 3, 2, 1, 4, + 2, 3, 9, 4, 3, 2, 3, 2, 2, 12, 3, 2, 6, 5, 4, 3, 3, 1, 4, 3, 2, 2, 2, 2, 1, 2, 2, 8, 3, 3, 2, 1, 1, 9, 7, 6, 5, 2, 2, 2, 2, + 1, 1, 2, 1, 12, 3, 2, 3, 2, 2, 4, 2, 23, 11, 10, 5, 4, 3, 2, 8, 6, 5, 3, 6, 4, 4, 2, 3, 5, 2, 2, 14, 5, 3, 1, 4, 2, 3, 1, 1, 1, + 2, 4, 3, 3, 2, 2, 2, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 1, 4, 2, 1, 1, 27, 3, 3, 2, 20, 2, 1, 16, 2, 2, 4, 4, 3, 2, 4, + 3, 3, 2, 1, 3, 1, 2, 2, 3, 2, 3, 2, 13, 1, 3, 2, 2, 5, 3, 3, 2, 2, 2, 2, 14, 1, 3, 3, 2, 2, 1, 1, 1, 4, 2, 1, 3, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 11, 1, 1, 1, 1, 10, 2, 2, 3, 3, 2, 2, 1, 3, 3, 2, 2, 3, 1, 1, 1, 2, 100,9, 2, + 2, 2, 2, 9, 4, 3, 2, 1, 13, 8, 3, 3, 2, 2, 3, 2, 1, 2, 2, 1, 1, 1, 1, 5, 2, 1, 1, 1, 1, 1, 1, 13, 10, 9, 9, 4, 3, 1, 1, 1, 35, + 1, 1, 1, 1, 1, 30, 2, 2, 2, 2, 2, 2, 22, 3, 1, 5, 2, 5, 4, 3, 1, 2, 2, 8, 1, 1, 3, 1, 1, 2, 3, 4, 1, 2, 2, 81, 9, 3, 1, 1, 1, + 2, 7, 1, 1, 1, 3, 2, 2, 1, 5, 3, 2, 2, 1, 5, 2, 1, 1, 3, 5, 1, 1, 2, 2, 31, 6, 6, 6, 5, 3, 3, 3, 2, 2, 12, 6, 6, 3, 6, 6, 4, + 2, 2, 2, 5, 3, 1, 5, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 103,10, 2, 3, 2, 2, 1, 7, 2, 2, 2, 1, 1, 1, 5, 2, 2, 2, 1, 1, 1, 8, 1, 1, + 1, 5, 2, 2, 1, 1, 1, 5, 1, 1, 1, 2, 4, 1, 4, 1, 1, 1, 50, 3, 10, 10, 10, 2, 1, 2, 3, 3, 20, 19, 18, 2, 4, 3, 2, 2, 6, 5, 3, 3, 2, + 2, 1, 1, 1, 1, 33, 4, 3, 3, 2, 4, 4, 2, 3, 3, 1, 1, 1, 43, 10, 4, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 7, 1, 1, 1, 2, 2, 3, + 1, 5, 1, 1, 1, 1, 3, 4, 2, 38, 7, 2, 4, 2, 5, 1, 1, 1, 1, 3, 1, 3, 1, 1, 3, 1, 1, 4, 3, 1, 1, 1, 1, 1, 1, 148,5, 4, 2, 1, 10, + 3, 3, 3, 5, 5, 5, 4, 4, 3, 7, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, 9, 3, 1, 23, 3, 3, 1, 2, 1, 1, 2, 1, 3, 2, + 3, 2, 2, 2, 48, 5, 2, 2, 2, 2, 1, 1, 5, 3, 1, 4, 2, 3, 6, 2, 1, 1, 7, 2, 1, 1, 1, 1, 1, 1, 4, 3, 5, 3, 6, 2, 32, 5, 2, 2, 1, + 3, 1, 1, 3, 1, 1, 6, 2, 1, 1, 1, 5, 2, 2, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 43, 12, 4, 4, 4, + 3, 3, 2, 2, 4, 4, 4, 3, 2, 4, 4, 4, 3, 3, 2, 2, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 1, 1, 3, 1, 1, 2, 2, 2, 1, 1, 6, 3, 1, 2, + 2, 3, 3, 3, 2, 1, 1, 5, 2, 2, 2, 2, 1, 1, 2, 1, 3, 1, 1, 1, 1, 50, 11, 2, 1, 2, 1, 1, 1, 2, 1, 3, 3, 3, 3, 2, 4, 3, 2, 14, 8, + 3, 1, 2, 2, 1, 3, 3, 1, 1, 2, 1, 4, 2, 1, 4, 3, 1, 1, 4, 2, 1, 1, 6, 1, 1, 2, 2, 1, 1, 1, 1, 1, 34, 6, 1, 3, 1, 1, 2, 2, 2, + 2, 2, 1, 1, 10, 3, 2, 2, 4, 1, 1, 1, 2, 2, 2, 1, 1, 1, 9, 1, 1, 1, 1, 2, 1, 1, 1, 2, 2, 5, 2, 1, 1, 1, 1, 1, 1, 1, 22, 8, 1, + 1, 2, 1, 2, 2, 2, 2, 2, 4, 2, 1, 1, 3, 1, 1, 2, 1, 3, 1, 1, 1, 8, 2, 2, 2, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 24, + 2, 1, 2, 1, 1, 1, 2, 2, 2, 3, 2, 2, 3, 2, 1, 1, 3, 1, 2, 5, 1, 2, 1, 2, 4, 4, 4, 17, 3, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 3, + 3, 3, 3, 3, 1, 1, 2, 2, 2, 3, 1, 1, 1, 1, 23, 7, 4, 2, 1, 1, 3, 1, 1, 2, 2, 2, 2, 7, 1, 2, 1, 2, 2, 1, 2, 2, 2, 2, 2, 5, 1, + 2, 2, 2, 2, 1, 1, 1, 24, 1, 1, 1, 1, 6, 3, 3, 1, 1, 1, 5, 1, 1, 1, 1, 2, 1, 1, 3, 3, 3, 3, 7, 3, 3, 1, 2, 1, 1, 2, 1, 7, 1, + 1, 3, 1, 1, 1, 1, 13, 1, 1, 1, 1, 2, 1, 1, 1, 3, 1, 5, 4, 4, 1, 1, 38, 12, 3, 1, 1, 1, 2, 3, 1, 2, 1, 1, 1, 4, 1, 1, 1, 2, 1, + 6, 3, 2, 2, 2, 1, 1, 12, 5, 2, 2, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 30, 1, 1, + 9, 1, 1, 1, 2, 2, 4, 4, 1, 1, 2, 2, 1, 1, 5, 2, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 2, 2, 1, 1, 1, 1, 3, 1, + 1, 1, 57, 1, 1, 1, 12, 1, 3, 3, 3, 2, 2, 1, 6, 6, 5, 4, 4, 3, 2, 2, 2, 2, 2, 2, 2, 31, 5, 5, 5, 4, 4, 3, 2, 2, 2, 1, 2, 2, 2, + 22, 1, 1, 1, 1, 6, 6, 5, 4, 3, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 8, 1, 5, 4, 3, 2, 2, 2, 2, 1, 1, 1, 1, 10, 2, 2, 2, 8, 7, 7, + 6, 2, 1, 17, 7, 1, 1, 3, 2, 2, 1, 2, 1, 1, 1, 6, 4, 4, 1, 1, 1, 2, 49, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 3, 3, 1, 1, 5, 1, 1, 1, + 3, 2, 4, 2, 1, 1, 3, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 5, 2, 2, 9, 3, 3, 4, 1, 1, 1, 9, 3, 1, 2, 1, 2, 2, 2, 1, 19, 1, 3, 1, 4, + 2, 1, 1, 1, 6, 1, 1, 1, 3, 1, 1, 2, 1, 2, 2, 5, 1, 1, 1, 1, 1, 1, 1, 6, 2, 1, 1, 1, 2, 1, 1, 14, 4, 1, 1, 1, 1, 1, 1, 2, 2, + 2, 1, 1, 1, 6, 2, 1, 1, 1, 3, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 4, 2, 1, 1, 1, 1, 1, 9, 4, 3, 3, 3, 2, 2, 2, + 2, 2, 2, 3, 3, 3, 3, 2, 1, 4, 44, 26, 7, 4, 1, 1, 1, 1, 1, 1, 2, 3, 2, 2, 1, 2, 2, 1, 1, 1, 3, 3, 3, 2, 7, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 32, 7, 3, 3, 3, 1, 1, 6, 2, 4, 1, 1, 1, 1, 6, 1, 1, 1, 1, 2, 2, 2, 1, 1, 4, 1, 1, + 1, 1, 1, 3, 3, 3, 3, 2, 2, 1, 1, 1, 2, 1, 1, 50, 8, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 15, 8, 1, 4, 2, 1, 9, 6, 2, 2, 1, + 2, 1, 5, 5, 2, 2, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 29, 6, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 4, 1, 1, 3, 2, 3, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 36, 4, 2, 1, 1, + 2, 2, 1, 1, 1, 1, 1, 1, 1, 15, 12, 4, 2, 1, 4, 2, 2, 2, 2, 1, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 46, 12, 3, 1, 1, 1, 2, 1, + 1, 5, 1, 3, 1, 2, 1, 1, 1, 1, 4, 1, 18, 10, 2, 2, 3, 2, 1, 1, 1, 14, 7, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 9, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11, 4, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 6, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 3, 2, 2, 2, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 1, 1, 3, 1, 1, 1, 5, 1, 1, 4, 4, 3, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 4, 1, 1, 1, 2, 1, 1, 4, 2, 2, 2, + 1, 1, 2, 1, 1, 1, 1, 10, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 6, 6, 1, 1, 1, 1, 1, 1, 1, 227,34, 21, 4, 2, 2, 2, 2, 1, 2, 1, 1, + 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 24, 2, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 7, 6, 6, 6, 5, 3, 3, 1, 1, 4, 1, 24, 14, 3, + 2, 2, 7, 3, 3, 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, 4, 2, 2, 2, 2, 2, 1, 1, 1, 36, 1, 2, 2, 17, 3, 3, 2, 4, 2, 2, 2, 2, 2, 2, 3, 3, + 2, 3, 3, 2, 2, 4, 1, 3, 1, 1, 1, 1, 2, 1, 1, 1, 12, 2, 1, 1, 1, 1, 1, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 14, 2, 5, 1, 1, 2, 1, + 1, 33, 2, 1, 1, 4, 1, 1, 1, 3, 1, 1, 1, 2, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 15, 3, 3, 3, 2, 6, 3, 3, 3, 3, 2, 5, 2, 1, 1, 1, 1, + 11, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 3, 1, 1, 2, 1, 4, 1, 1, 1, + 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 217,21, 9, 2, 1, 2, 1, 3, 3, 2, 1, 1, 8, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 20, 9, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 7, 2, 1, 1, 1, 1, 1, 3, 3, 28, 2, 3, 2, 2, 2, 2, 12, 3, 2, 2, 2, 2, 4, 4, 3, 2, 1, 1, 1, 2, 2, 2, 30, 2, 1, 1, 1, 1, 2, 2, 1, + 1, 1, 2, 1, 1, 1, 16, 3, 3, 3, 2, 2, 2, 2, 2, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 8, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 1, 1, 1, 8, 8, 8, 8, 7, 7, 6, 5, 2, 1, 1, 1, 1, 1, 11, 1, 1, 1, 1, 1, 1, 1, 2, + 3, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 2, 2, 4, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 3, + 2, 1, 1, 1, 2, 1, 1, 1, 1, 5, 1, 1, 1, 1, 8, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 6, 2, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, + 1, 3, 1, 1, 1, 6, 2, 2, 1, 1, 3, 2, 1, 1, 1, 1, 177,1, 1, 1, 1, 1, 25, 12, 4, 2, 3, 3, 3, 14, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 9, 7, 1, 2, 2, 2, 1, 1, 1, 10, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 5, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 16, 3, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 6, 4, 4, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, 54, 2, 1, 1, 1, 3, 2, 1, 1, 1, 6, 4, 3, 3, 1, 1, 1, 1, 30, 3, 4, 3, 2, 11, 10, + 2, 1, 3, 3, 2, 2, 5, 5, 2, 3, 3, 1, 1, 1, 1, 1, 13, 1, 1, 1, 1, 1, 3, 1, 1, 1, 4, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 8, 1, 1, + 1, 1, 1, 1, 1, 2, 1, 1, 1, 3, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 7, 1, 1, 2, 2, 2, 2, 2, 2, 1, + 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 138,12, 5, 1, 1, 1, 1, 1, 1, 1, 5, 2, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 2, 1, 1, 1, 12, 1, 7, 4, 4, 4, 1, 1, 1, 1, 1, 41, 1, 1, 1, 1, 4, 2, + 1, 24, 4, 2, 3, 5, 4, 4, 3, 3, 1, 1, 3, 3, 2, 2, 1, 1, 2, 2, 2, 2, 2, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 8, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18, 1, 1, 1, 5, 5, 3, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 208,2, 2, 2, 1, 1, 15, 5, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2, + 1, 1, 4, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 4, 2, 1, 33, 21, 2, 1, 1, 1, 7, 4, 4, 3, 6, 6, 5, 3, 3, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 1, 2, 1, 1, 1, 1, 4, 1, 2, 1, 1, 1, 15, 1, 6, 4, 4, 3, 2, 1, 1, 1, 4, 1, 1, 1, 6, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, + 43, 1, 1, 1, 1, 2, 2, 3, 1, 2, 2, 2, 28, 2, 2, 2, 2, 2, 2, 11, 10, 1, 1, 1, 8, 7, 2, 2, 2, 1, 1, 1, 3, 1, 1, 1, 1, 45, 1, 2, 3, + 1, 1, 5, 4, 3, 2, 28, 2, 2, 8, 8, 7, 6, 5, 4, 3, 6, 4, 4, 4, 3, 2, 2, 2, 3, 1, 1, 1, 1, 1, 1, 4, 3, 3, 3, 3, 1, 1, 1, 4, 3, + 3, 2, 2, 2, 2, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 2, 2, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 124,16, 6, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 2, 1, 1, + 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 16, 10, 2, 1, 2, 2, 1, 1, 2, 1, 1, 1, 1, 7, 1, 1, 1, 1, 3, 3, 3, 3, 1, 1, 1, + 10, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 20, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 2, 8, 3, 1, 2, 2, 1, 1, 1, 18, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 150,19, 8, 2, 2, 2, 1, 1, 3, 2, 1, 1, 1, 1, 12, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 6, + 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 5, 3, 3, 3, 3, 1, 3, 1, 1, 12, 8, 4, 3, 1, 1, 1, 18, 15, 6, 3, 3, 2, 2, 6, 5, 4, 3, 3, 1, 6, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 1, 1, 1, 1, 1, 19, 2, 2, 7, 3, 3, 3, 4, 4, 3, 6, 5, 5, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 28, 1, + 1, 2, 1, 2, 2, 2, 1, 5, 5, 3, 3, 2, 12, 2, 2, 2, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 2, 14, + 1, 1, 1, 1, 2, 2, 2, 1, 1, 43, 4, 3, 3, 3, 1, 18, 1, 17, 13, 10, 8, 4, 3, 2, 1, 2, 2, 1, 1, 1, 3, 3, 3, 3, 2, 2, 7, 1, 6, 5, 4, + 3, 2, 1, 1, 1, 1, 5, 5, 5, 5, 4, 3, 2, 2, 3, 2, 2, 2, 13, 2, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, + 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 139,10, 2, 2, 2, 7, 7, 5, 4, 3, 53, 7, 6, 5, 2, 27, 3, 2, 17, + 11, 7, 4, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 3, 1, 2, 2, 2, 1, 2, 4, 2, 2, 2, 1, 3, 4, 1, 4, 1, 2, 10, 2, 1, 1, 1, + 2, 1, 1, 6, 2, 2, 4, 2, 1, 2, 23, 2, 3, 1, 2, 1, 2, 9, 9, 2, 1, 1, 8, 2, 4, 2, 2, 1, 1, 1, 1, 2, 2, 5, 5, 4, 1, 1, 1, 52, 2, + 8, 1, 5, 1, 3, 3, 3, 6, 5, 5, 5, 4, 4, 1, 1, 1, 8, 3, 2, 2, 1, 2, 50, 16, 2, 1, 1, 7, 3, 2, 1, 1, 11, 1, 3, 1, 1, 4, 1, 5, 2, + 1, 7, 6, 2, 3, 5, 3, 3, 3, 3, 3, 2, 2, 1, 1, 1, 4, 31, 10, 9, 7, 4, 3, 2, 1, 1, 14, 6, 5, 7, 3, 2, 4, 58, 4, 4, 2, 10, 10, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 3, 3, 3, 12, 2, 5, 3, 3, 2, 2, 2, 2, 1, 1, 26, 9, 9, 2, 3, 14, 2, 1, 1, 5, 5, 2, 3, 1, 1, 1, + 1, 1, 2, 65, 4, 1, 2, 16, 4, 3, 4, 4, 2, 1, 1, 1, 23, 1, 5, 2, 1, 3, 3, 3, 2, 3, 2, 2, 2, 1, 2, 1, 1, 1, 1, 3, 2, 2, 2, 1, 3, + 3, 2, 1, 1, 1, 1, 6, 1, 2, 2, 2, 12, 7, 1, 1, 1, 1, 1, 1, 2, 3, 3, 3, 3, 2, 1, 33, 6, 2, 5, 5, 3, 7, 2, 2, 2, 4, 2, 3, 1, 3, + 1, 1, 7, 2, 1, 2, 1, 3, 3, 3, 2, 17, 6, 2, 2, 7, 2, 2, 1, 1, 1, 1, 7, 3, 4, 4, 4, 4, 4, 46, 1, 1, 10, 1, 1, 8, 4, 4, 4, 4, 4, + 4, 3, 3, 3, 3, 3, 3, 2, 9, 4, 4, 4, 4, 5, 3, 1, 1, 1, 1, 13, 2, 1, 1, 1, 4, 4, 1, 1, 3, 3, 3, 1, 1, 1, 2, 1, 1, 1, 1, 63, 32, + 3, 2, 2, 2, 1, 1, 1, 6, 6, 6, 2, 3, 1, 1, 1, 13, 8, 5, 3, 2, 1, 4, 4, 1, 1, 10, 2, 7, 3, 3, 2, 7, 1, 7, 2, 2, 1, 4, 4, 2, 62, + 3, 2, 2, 3, 2, 2, 1, 1, 6, 6, 4, 2, 2, 1, 4, 2, 2, 1, 24, 13, 10, 10, 4, 1, 4, 2, 3, 9, 8, 4, 15, 3, 3, 3, 2, 2, 1, 1, 8, 7, 7, + 7, 5, 5, 5, 3, 2, 1, 1, 1, 36, 1, 2, 2, 2, 3, 3, 2, 7, 6, 4, 4, 2, 8, 5, 2, 1, 1, 5, 2, 1, 1, 6, 5, 4, 2, 2, 1, 1, 1, 25, 2, + 2, 16, 12, 12, 10, 7, 3, 2, 4, 4, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 175,6, 1, 1, 1, 2, 2, 58, 3, 12, 11, 11, 9, 8, 3, 2, 2, 2, 7, 7, + 4, 9, 9, 3, 2, 1, 1, 25, 24, 6, 3, 2, 5, 3, 3, 2, 2, 2, 9, 6, 6, 6, 6, 3, 3, 2, 2, 2, 1, 1, 1, 5, 3, 2, 2, 1, 2, 2, 2, 2, 55, + 3, 3, 24, 2, 6, 6, 6, 6, 6, 16, 7, 7, 5, 9, 9, 6, 6, 11, 10, 5, 2, 3, 3, 1, 2, 2, 14, 13, 12, 6, 3, 1, 1, 1, 1, 1, 1, 14, 8, 6, 6, + 6, 2, 1, 1, 4, 26, 1, 1, 1, 9, 8, 8, 8, 5, 3, 2, 2, 10, 3, 3, 1, 1, 1, 1, 3, 1, 1, 49, 5, 2, 1, 2, 3, 1, 1, 1, 1, 9, 1, 3, 1, + 13, 3, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 1, 1, 1, 6, 6, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 3, 2, 1, 49, 7, 4, 3, + 1, 1, 1, 12, 1, 1, 1, 1, 2, 1, 1, 1, 17, 9, 9, 7, 3, 3, 3, 5, 3, 1, 1, 1, 3, 2, 2, 1, 2, 14, 9, 2, 3, 1, 1, 1, 1, 1, 1, 1, 2, + 31, 9, 8, 2, 2, 2, 4, 2, 5, 3, 8, 8, 8, 8, 8, 8, 8, 5, 1, 1, 6, 2, 5, 2, 2, 2, 2, 22, 2, 1, 2, 2, 1, 1, 1, 6, 2, 2, 4, 4, 4, + 4, 4, 2, 19, 19, 6, 4, 4, 4, 2, 2, 1, 1, 13, 3, 3, 3, 3, 4, 2, 3, 2, 28, 5, 4, 2, 2, 2, 1, 16, 5, 5, 4, 2, 1, 1, 1, 1, 1, 1, 1, + 4, 1, 2, 2, 2, 3, 2, 2, 2, 56, 29, 4, 2, 6, 6, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 17, 3, 6, 4, 4, 3, 1, 1, 1, 1, 1, 3, 2, 13, 12, + 4, 2, 3, 2, 5, 21, 2, 2, 3, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 5, 5, 1, 1, 3, 1, 1, 3, 2, 1, 1, 1, 1, 84, 2, 2, 5, 2, + 2, 2, 40, 4, 3, 7, 1, 3, 3, 3, 2, 4, 5, 3, 1, 9, 2, 2, 1, 1, 4, 16, 16, 4, 4, 4, 3, 2, 3, 2, 53, 5, 8, 1, 4, 21, 7, 6, 2, 2, 2, + 3, 1, 1, 1, 6, 6, 4, 2, 2, 1, 6, 6, 6, 6, 3, 6, 5, 3, 64, 2, 1, 29, 4, 2, 2, 1, 5, 1, 3, 3, 2, 2, 5, 1, 1, 1, 12, 3, 1, 5, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 7, 3, 3, 3, 3, 1, 1, 2, 5, 3, 3, 3, 2, 17, 3, 12, 7, 6, 3, 1, 32, 1, 1, 1, 2, 8, 8, 7, 3, 2, 2, + 2, 1, 1, 1, 1, 1, 1, 4, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 1, 33, 3, 2, 2, 2, 4, 3, 3, 3, 3, 8, 5, 5, 3, 3, 3, 18, 6, 5, 5, 5, + 5, 2, 2, 8, 8, 2, 6, 1, 5, 3, 2, 10, 2, 5, 2, 54, 2, 45, 20, 4, 1, 1, 1, 1, 13, 13, 13, 4, 9, 9, 8, 5, 14, 8, 2, 2, 4, 4, 4, 4, 6, + 4, 2, 4, 4, 4, 3, 3, 5, 3, 2, 43, 11, 3, 3, 3, 3, 3, 5, 5, 2, 1, 1, 4, 2, 10, 10, 4, 13, 2, 7, 35, 3, 7, 7, 5, 5, 3, 1, 1, 22, 16, + 11, 3, 2, 2, 2, 3, 3, 3, 7, 2, 2, 2, 1, 1, 14, 1, 11, 8, 4, 4, 2, 1, 1, 1, 72, 1, 1, 1, 14, 13, 7, 6, 5, 5, 5, 4, 33, 13, 13, 4, 1, + 8, 8, 5, 19, 3, 6, 3, 10, 8, 8, 15, 12, 6, 4, 4, 8, 6, 6, 3, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 101,1, 1, 2, 5, 2, 2, 3, 2, 2, 4, + 3, 3, 2, 3, 2, 4, 2, 47, 3, 4, 3, 32, 4, 2, 5, 2, 2, 3, 3, 3, 3, 3, 3, 2, 1, 1, 1, 2, 2, 1, 5, 5, 5, 5, 5, 4, 2, 2, 2, 9, 2, + 2, 3, 3, 1, 1, 1, 1, 1, 1, 11, 4, 4, 1, 1, 2, 2, 1, 1, 1, 3, 3, 3, 12, 8, 8, 6, 2, 1, 2, 2, 1, 1, 3, 3, 3, 3, 3, 2, 167,6, 1, + 3, 2, 1, 1, 1, 1, 65, 5, 1, 3, 3, 15, 10, 10, 6, 4, 4, 2, 3, 2, 22, 2, 2, 2, 6, 4, 3, 7, 7, 9, 6, 6, 5, 2, 2, 8, 7, 6, 2, 1, 1, + 6, 2, 2, 3, 3, 3, 4, 4, 4, 4, 2, 2, 1, 1, 1, 5, 2, 2, 2, 2, 2, 2, 5, 3, 1, 1, 8, 2, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 31, + 2, 19, 11, 10, 2, 6, 5, 5, 1, 8, 1, 1, 1, 2, 1, 1, 1, 5, 2, 3, 2, 26, 21, 1, 1, 1, 1, 20, 1, 1, 2, 2, 3, 3, 2, 4, 3, 2, 1, 4, 2, + 2, 2, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37, 2, 1, 3, 3, 6, 3, 2, 2, 2, 2, 1, 7, 2, 2, 1, 3, 2, 8, 4, 2, 1, 3, + 1, 1, 1, 1, 1, 1, 1, 3, 1, 29, 2, 15, 3, 2, 7, 4, 2, 2, 1, 1, 31, 2, 1, 3, 3, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 20, 4, 4, 4, 4, 14, + 6, 6, 4, 3, 3, 1, 4, 3, 22, 5, 3, 4, 1, 1, 8, 7, 7, 1, 4, 19, 9, 2, 3, 1, 1, 1, 1, 5, 4, 3, 3, 3, 26, 10, 1, 4, 2, 1, 1, 1, 5, + 3, 1, 1, 1, 7, 7, 5, 4, 1, 2, 1, 45, 5, 16, 2, 8, 2, 2, 2, 2, 4, 4, 17, 1, 1, 1, 1, 9, 2, 7, 7, 7, 7, 7, 4, 4, 2, 1, 1, 1, 3, + 2, 7, 1, 1, 1, 1, 1, 3, 2, 2, 1, 1, 1, 1, 52, 8, 3, 2, 1, 1, 1, 1, 1, 4, 3, 17, 10, 3, 2, 4, 4, 2, 1, 2, 3, 3, 1, 2, 10, 8, 2, + 1, 1, 1, 1, 5, 4, 3, 1, 1, 120,17, 3, 5, 3, 3, 6, 2, 3, 3, 1, 1, 1, 9, 7, 6, 5, 4, 2, 2, 2, 2, 24, 3, 1, 1, 6, 1, 2, 1, 1, 2, + 1, 1, 2, 2, 1, 1, 1, 19, 12, 8, 4, 1, 1, 1, 1, 2, 5, 4, 4, 3, 8, 12, 2, 8, 8, 3, 2, 2, 2, 2, 1, 1, 2, 2, 1, 1, 4, 1, 2, 234,4, + 1, 4, 2, 1, 13, 4, 3, 5, 2, 1, 5, 2, 2, 13, 2, 3, 4, 3, 3, 3, 19, 6, 3, 5, 15, 5, 2, 2, 2, 16, 4, 1, 1, 2, 2, 2, 4, 2, 1, 1, 1, + 1, 1, 100,2, 10, 4, 3, 3, 3, 2, 1, 6, 3, 1, 2, 6, 4, 2, 2, 1, 1, 1, 2, 5, 2, 10, 2, 2, 4, 2, 2, 2, 2, 4, 3, 3, 2, 2, 2, 9, 7, + 2, 4, 4, 5, 3, 1, 7, 3, 3, 3, 15, 4, 2, 2, 6, 5, 4, 5, 2, 7, 4, 3, 2, 2, 2, 13, 4, 1, 1, 1, 1, 1, 10, 2, 2, 2, 3, 2, 2, 1, 3, + 1, 29, 13, 2, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 3, 2, 2, 2, 2, 2, 2, 2, 3, 1, 1, 139,3, 3, 1, 29, 4, 4, 4, 4, 1, 1, 2, 2, 4, 3, 5, + 4, 1, 1, 1, 1, 1, 4, 3, 3, 17, 1, 2, 8, 3, 9, 3, 1, 1, 1, 1, 1, 33, 1, 1, 1, 1, 3, 1, 1, 2, 3, 2, 7, 3, 1, 6, 1, 1, 1, 1, 1, + 2, 3, 3, 2, 1, 5, 3, 2, 1, 1, 1, 3, 2, 2, 2, 4, 6, 2, 2, 1, 11, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 3, 2, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 1, 2, 2, 1, 1, 108,8, 8, 4, 2, 2, 3, 3, 2, 2, 7, 1, 2, 2, 2, 2, 1, 1, 1, 19, 2, 2, 3, 2, 5, 2, 4, 1, 1, 20, 1, 5, 2, 2, 1, 1, 13, 2, 4, 6, 3, 8, 1, 4, 4, 2, 5, 2, 2, 1, 1, 1, 1, 3, 4, 3, 2, 122, - 31, 3, 1, 1, 1, 1, 11, 2, 4, 7, 2, 2, 2, 5, 4, 4, 46, 1, 1, 2, 37, 2, 2, 1, 2, 23, 2, 3, 4, 3, 3, 4, 17, 1, 1, 1, 7, 2, 2, 1, 1, - 2, 6, 5, 2, 10, 2, 2, 4, 3, 2, 2, 10, 3, 2, 2, 2, 2, 2, 54, 15, 2, 5, 4, 3, 1, 3, 4, 4, 4, 4, 3, 7, 1, 1, 1, 22, 2, 6, 6, 6, 4, - 1, 1, 3, 1, 4, 2, 68, 13, 2, 1, 1, 1, 1, 28, 3, 2, 1, 2, 2, 17, 1, 1, 4, 3, 4, 4, 3, 2, 7, 1, 1, 1, 1, 2, 1, 1, 1, 10, 4, 2, 5, - 2, 238,2, 4, 5, 2, 5, 1, 2, 9, 7, 7, 7, 7, 20, 17, 9, 8, 8, 5, 3, 2, 6, 2, 3, 2, 8, 7, 6, 3, 3, 13, 5, 3, 1, 2, 1, 3, 8, 6, 25, - 4, 2, 12, 8, 8, 8, 7, 3, 2, 3, 4, 3, 3, 3, 4, 1, 2, 2, 113,5, 30, 4, 3, 20, 5, 7, 7, 10, 3, 2, 4, 4, 4, 28, 2, 23, 21, 5, 4, 1, 1, - 14, 4, 5, 1, 3, 3, 10, 3, 3, 1, 1, 1, 1, 2, 2, 2, 2, 1, 2, 1, 1, 1, 41, 11, 3, 2, 3, 3, 2, 4, 3, 5, 4, 7, 6, 5, 10, 10, 8, 2, 38, - 5, 2, 15, 5, 5, 5, 2, 2, 1, 1, 6, 4, 1, 1, 5, 3, 2, 10, 2, 2, 2, 2, 4, 3, 3, 3, 3, 2, 1, 1, 1, 6, 4, 1, 2, 1, 1, 1, 1, 136,10, - 3, 4, 6, 2, 1, 17, 4, 2, 6, 3, 1, 12, 7, 16, 2, 3, 1, 9, 3, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 7, 3, 3, 3, 3, 19, 13, 6, 3, 3, 6, 6, - 4, 2, 3, 2, 3, 2, 2, 1, 1, 4, 4, 16, 3, 1, 1, 4, 3, 2, 3, 2, 4, 4, 2, 1, 1, 27, 12, 5, 3, 2, 2, 5, 2, 1, 4, 3, 1, 1, 1, 1, 5, - 3, 2, 2, 9, 6, 34, 2, 2, 6, 2, 1, 1, 5, 6, 3, 2, 2, 1, 2, 8, 2, 1, 3, 3, 2, 2, 2, 3, 1, 1, 86, 26, 4, 4, 3, 2, 4, 3, 3, 4, 3, - 2, 7, 3, 2, 2, 1, 1, 4, 3, 2, 18, 4, 2, 4, 3, 12, 6, 3, 1, 1, 4, 1, 6, 2, 8, 2, 10, 4, 1, 3, 1, 1, 32, 4, 4, 5, 4, 3, 3, 3, 7, - 4, 6, 2, 2, 9, 1, 1, 1, 3, 2, 2, 2, 2, 2, 37, 9, 2, 2, 2, 1, 4, 8, 4, 4, 4, 17, 2, 2, 2, 1, 2, 2, 2, 6, 4, 2, 1, 1, 1, 1, 7, - 2, 2, 14, 3, 2, 2, 3, 2, 9, 71, 27, 2, 3, 1, 1, 1, 7, 3, 3, 2, 5, 3, 16, 4, 1, 4, 2, 1, 2, 5, 1, 4, 2, 2, 14, 2, 2, 2, 5, 3, 3, - 5, 2, 2, 2, 2, 2, 2, 5, 2, 42, 2, 1, 3, 1, 4, 14, 4, 1, 1, 2, 2, 5, 2, 3, 2, 62, 3, 2, 9, 5, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 40, 33, 2, 4, 1, 1, 1, 1, 1, 9, 8, 8, 5, 3, 1, 1, 3, 2, 2, 1, 1, 2, 3, 3, 3, 3, 9, 6, 4, 4, 1, 3, 1, 9, 3, 1, 4, 2, - 2, 32, 4, 1, 4, 1, 2, 1, 3, 2, 3, 3, 3, 2, 5, 2, 5, 3, 140,23, 2, 1, 1, 1, 3, 5, 3, 3, 5, 2, 2, 2, 2, 1, 45, 8, 3, 1, 1, 1, 1, - 1, 1, 30, 3, 2, 3, 2, 16, 15, 1, 1, 1, 1, 14, 4, 7, 4, 14, 4, 2, 2, 2, 5, 2, 1, 1, 15, 3, 3, 3, 1, 1, 3, 3, 3, 5, 3, 2, 18, 3, 3, - 3, 3, 1, 4, 2, 2, 3, 2, 7, 2, 2, 1, 2, 2, 2, 2, 5, 1, 1, 2, 2, 1, 1, 22, 2, 2, 3, 2, 2, 2, 11, 1, 3, 3, 1, 1, 1, 1, 4, 1, 54, - 20, 4, 12, 2, 4, 2, 18, 2, 2, 10, 3, 2, 13, 5, 2, 2, 2, 12, 9, 3, 17, 2, 9, 6, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 132,2, 3, - 12, 4, 3, 3, 1, 1, 1, 5, 2, 16, 2, 2, 6, 6, 6, 5, 5, 25, 12, 10, 6, 2, 1, 25, 7, 4, 4, 1, 1, 2, 2, 6, 4, 4, 2, 2, 2, 2, 2, 2, 2, - 1, 1, 1, 8, 13, 6, 1, 1, 5, 5, 2, 1, 2, 2, 1, 1, 17, 4, 4, 3, 3, 8, 8, 82, 10, 4, 4, 4, 4, 4, 4, 2, 19, 1, 17, 2, 3, 15, 1, 1, 1, - 1, 4, 4, 2, 4, 3, 3, 2, 2, 3, 3, 6, 2, 17, 3, 13, 8, 6, 2, 1, 12, 1, 4, 4, 3, 3, 4, 4, 2, 1, 1, 3, 93, 4, 2, 3, 1, 1, 1, 13, 2, - 8, 4, 1, 18, 7, 1, 1, 1, 1, 4, 35, 27, 19, 14, 9, 3, 2, 2, 3, 2, 1, 3, 1, 5, 2, 2, 2, 4, 1, 3, 1, 2, 4, 2, 2, 2, 2, 2, 2, 1, 78, - 2, 8, 3, 2, 11, 3, 3, 2, 1, 4, 9, 5, 4, 2, 12, 2, 5, 1, 1, 8, 4, 10, 4, 3, 9, 3, 2, 2, 2, 1, 3, 2, 25, 5, 3, 2, 2, 6, 1, 3, 3, - 3, 10, 9, 5, 2, 9, 3, 3, 2, 4, 4, 1, 1, 1, 1, 2, 59, 3, 4, 2, 2, 7, 2, 26, 2, 5, 4, 2, 5, 4, 1, 2, 2, 8, 4, 3, 1, 51, 7, 3, 5, - 3, 15, 2, 2, 2, 2, 9, 3, 3, 2, 2, 3, 2, 2, 2, 3, 2, 1, 1, 1, 12, 2, 9, 7, 5, 4, 2, 1, 1, 7, 6, 4, 4, 11, 2, 6, 3, 24, 2, 2, 2, - 2, 3, 2, 11, 7, 2, 4, 3, 3, 2, 3, 1, 16, 2, 4, 2, 7, 3, 2, 15, 1, 5, 2, 2, 2, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 169,7, 2, 2, 2, 3, 2, 10, 1, 1, 1, 3, 3, 3, 3, 3, 3, 4, 1, 1, 6, 1, 1, 1, 2, 2, 7, 1, 1, 4, 4, 4, 4, 3, 3, 6, 3, 3, 3, 2, 2, - 3, 6, 1, 3, 3, 41, 1, 1, 3, 3, 3, 3, 2, 9, 9, 2, 20, 8, 4, 2, 6, 6, 7, 2, 2, 2, 2, 13, 3, 4, 2, 4, 4, 2, 2, 2, 13, 8, 8, 5, 4, - 2, 21, 2, 1, 17, 14, 3, 11, 9, 2, 2, 1, 17, 1, 14, 8, 4, 2, 1, 1, 6, 5, 3, 2, 1, 1, 2, 2, 48, 5, 2, 10, 5, 2, 5, 5, 3, 15, 2, 12, 9, - 4, 8, 4, 4, 1, 1, 3, 2, 3, 237,15, 8, 5, 4, 3, 2, 2, 2, 1, 1, 31, 23, 2, 1, 1, 3, 10, 4, 3, 4, 2, 2, 2, 10, 3, 12, 2, 4, 3, 145,13, - 2, 5, 3, 2, 2, 84, 18, 4, 6, 2, 6, 5, 5, 1, 4, 28, 7, 4, 2, 1, 8, 4, 14, 3, 2, 2, 2, 2, 21, 4, 3, 1, 1, 1, 1, 4, 3, 3, 4, 3, 1, - 3, 1, 1, 1, 5, 3, 1, 1, 1, 1, 4, 4, 4, 2, 1, 4, 2, 13, 2, 1, 1, 2, 1, 35, 5, 3, 3, 3, 4, 2, 10, 1, 1, 1, 7, 6, 6, 3, 3, 2, 2, - 2, 3, 1, 3, 3, 2, 2, 5, 5, 2, 2, 214,6, 1, 2, 108,95, 2, 9, 6, 3, 4, 3, 3, 2, 6, 4, 2, 2, 21, 4, 5, 2, 5, 2, 16, 2, 2, 3, 2, 9, - 2, 3, 23, 4, 4, 2, 11, 3, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2, 1, 1, 1, 36, 5, 14, 2, 1, 1, 2, 2, 11, 7, 3, 4, 5, 11, 1, 1, 4, 1, 1, 1, - 1, 6, 4, 3, 3, 13, 4, 2, 3, 2, 6, 2, 2, 1, 1, 10, 1, 1, 1, 2, 3, 2, 2, 1, 74, 2, 2, 34, 24, 9, 2, 1, 3, 1, 1, 1, 2, 1, 10, 2, 2, - 4, 3, 3, 2, 1, 1, 4, 1, 5, 2, 1, 3, 2, 2, 11, 3, 1, 1, 1, 1, 2, 2, 2, 2, 2, 7, 18, 7, 4, 2, 2, 2, 4, 18, 3, 2, 2, 1, 1, 5, 2, - 4, 3, 3, 1, 1, 163,61, 19, 3, 13, 7, 5, 5, 3, 8, 6, 4, 2, 7, 2, 2, 6, 5, 3, 3, 3, 2, 1, 4, 2, 2, 30, 1, 7, 5, 2, 2, 2, 2, 2, 4, - 4, 4, 7, 28, 4, 1, 1, 1, 1, 8, 5, 5, 2, 2, 2, 2, 2, 1, 1, 23, 4, 2, 8, 8, 7, 2, 17, 4, 4, 1, 5, 2, 1, 1, 2, 2, 37, 3, 3, 3, 3, - 2, 4, 3, 3, 10, 2, 7, 7, 3, 3, 1, 1, 3, 2, 2, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 45, 6, 3, 3, 2, 2, 3, 2, 1, 8, 6, 3, 4, 2, 4, - 1, 1, 1, 1, 3, 5, 3, 1, 5, 5, 5, 23, 7, 7, 7, 7, 2, 5, 3, 2, 2, 2, 2, 2, 5, 2, 2, 2, 1, 1, 27, 2, 1, 1, 3, 2, 1, 1, 3, 2, 1, + 31, 3, 1, 1, 1, 1, 11, 2, 4, 7, 2, 2, 2, 5, 4, 4, 46, 1, 1, 2, 37, 2, 2, 1, 2, 23, 2, 3, 4, 3, 3, 4, 17, 1, 1, 1, 7, 2, 2, 1, 1, + 2, 6, 5, 2, 10, 2, 2, 4, 3, 2, 2, 10, 3, 2, 2, 2, 2, 2, 54, 15, 2, 5, 4, 3, 1, 3, 4, 4, 4, 4, 3, 7, 1, 1, 1, 22, 2, 6, 6, 6, 4, + 1, 1, 3, 1, 4, 2, 68, 13, 2, 1, 1, 1, 1, 28, 3, 2, 1, 2, 2, 17, 1, 1, 4, 3, 4, 4, 3, 2, 7, 1, 1, 1, 1, 2, 1, 1, 1, 10, 4, 2, 5, + 2, 238,2, 4, 5, 2, 5, 1, 2, 9, 7, 7, 7, 7, 20, 17, 9, 8, 8, 5, 3, 2, 6, 2, 3, 2, 8, 7, 6, 3, 3, 13, 5, 3, 1, 2, 1, 3, 8, 6, 25, + 4, 2, 12, 8, 8, 8, 7, 3, 2, 3, 4, 3, 3, 3, 4, 1, 2, 2, 113,5, 30, 4, 3, 20, 5, 7, 7, 10, 3, 2, 4, 4, 4, 28, 2, 23, 21, 5, 4, 1, 1, + 14, 4, 5, 1, 3, 3, 10, 3, 3, 1, 1, 1, 1, 2, 2, 2, 2, 1, 2, 1, 1, 1, 41, 11, 3, 2, 3, 3, 2, 4, 3, 5, 4, 7, 6, 5, 10, 10, 8, 2, 38, + 5, 2, 15, 5, 5, 5, 2, 2, 1, 1, 6, 4, 1, 1, 5, 3, 2, 10, 2, 2, 2, 2, 4, 3, 3, 3, 3, 2, 1, 1, 1, 6, 4, 1, 2, 1, 1, 1, 1, 136,10, + 3, 4, 6, 2, 1, 17, 4, 2, 6, 3, 1, 12, 7, 16, 2, 3, 1, 9, 3, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 7, 3, 3, 3, 3, 19, 13, 6, 3, 3, 6, 6, + 4, 2, 3, 2, 3, 2, 2, 1, 1, 4, 4, 16, 3, 1, 1, 4, 3, 2, 3, 2, 4, 4, 2, 1, 1, 27, 12, 5, 3, 2, 2, 5, 2, 1, 4, 3, 1, 1, 1, 1, 5, + 3, 2, 2, 9, 6, 34, 2, 2, 6, 2, 1, 1, 5, 6, 3, 2, 2, 1, 2, 8, 2, 1, 3, 3, 2, 2, 2, 3, 1, 1, 86, 26, 4, 4, 3, 2, 4, 3, 3, 4, 3, + 2, 7, 3, 2, 2, 1, 1, 4, 3, 2, 18, 4, 2, 4, 3, 12, 6, 3, 1, 1, 4, 1, 6, 2, 8, 2, 10, 4, 1, 3, 1, 1, 32, 4, 4, 5, 4, 3, 3, 3, 7, + 4, 6, 2, 2, 9, 1, 1, 1, 3, 2, 2, 2, 2, 2, 37, 9, 2, 2, 2, 1, 4, 8, 4, 4, 4, 17, 2, 2, 2, 1, 2, 2, 2, 6, 4, 2, 1, 1, 1, 1, 7, + 2, 2, 14, 3, 2, 2, 3, 2, 9, 71, 27, 2, 3, 1, 1, 1, 7, 3, 3, 2, 5, 3, 16, 4, 1, 4, 2, 1, 2, 5, 1, 4, 2, 2, 14, 2, 2, 2, 5, 3, 3, + 5, 2, 2, 2, 2, 2, 2, 5, 2, 42, 2, 1, 3, 1, 4, 14, 4, 1, 1, 2, 2, 5, 2, 3, 2, 62, 3, 2, 9, 5, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 40, 33, 2, 4, 1, 1, 1, 1, 1, 9, 8, 8, 5, 3, 1, 1, 3, 2, 2, 1, 1, 2, 3, 3, 3, 3, 9, 6, 4, 4, 1, 3, 1, 9, 3, 1, 4, 2, + 2, 32, 4, 1, 4, 1, 2, 1, 3, 2, 3, 3, 3, 2, 5, 2, 5, 3, 140,23, 2, 1, 1, 1, 3, 5, 3, 3, 5, 2, 2, 2, 2, 1, 45, 8, 3, 1, 1, 1, 1, + 1, 1, 30, 3, 2, 3, 2, 16, 15, 1, 1, 1, 1, 14, 4, 7, 4, 14, 4, 2, 2, 2, 5, 2, 1, 1, 15, 3, 3, 3, 1, 1, 3, 3, 3, 5, 3, 2, 18, 3, 3, + 3, 3, 1, 4, 2, 2, 3, 2, 7, 2, 2, 1, 2, 2, 2, 2, 5, 1, 1, 2, 2, 1, 1, 22, 2, 2, 3, 2, 2, 2, 11, 1, 3, 3, 1, 1, 1, 1, 4, 1, 54, + 20, 4, 12, 2, 4, 2, 18, 2, 2, 10, 3, 2, 13, 5, 2, 2, 2, 12, 9, 3, 17, 2, 9, 6, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 132,2, 3, + 12, 4, 3, 3, 1, 1, 1, 5, 2, 16, 2, 2, 6, 6, 6, 5, 5, 25, 12, 10, 6, 2, 1, 25, 7, 4, 4, 1, 1, 2, 2, 6, 4, 4, 2, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 8, 13, 6, 1, 1, 5, 5, 2, 1, 2, 2, 1, 1, 17, 4, 4, 3, 3, 8, 8, 82, 10, 4, 4, 4, 4, 4, 4, 2, 19, 1, 17, 2, 3, 15, 1, 1, 1, + 1, 4, 4, 2, 4, 3, 3, 2, 2, 3, 3, 6, 2, 17, 3, 13, 8, 6, 2, 1, 12, 1, 4, 4, 3, 3, 4, 4, 2, 1, 1, 3, 93, 4, 2, 3, 1, 1, 1, 13, 2, + 8, 4, 1, 18, 7, 1, 1, 1, 1, 4, 35, 27, 19, 14, 9, 3, 2, 2, 3, 2, 1, 3, 1, 5, 2, 2, 2, 4, 1, 3, 1, 2, 4, 2, 2, 2, 2, 2, 2, 1, 78, + 2, 8, 3, 2, 11, 3, 3, 2, 1, 4, 9, 5, 4, 2, 12, 2, 5, 1, 1, 8, 4, 10, 4, 3, 9, 3, 2, 2, 2, 1, 3, 2, 25, 5, 3, 2, 2, 6, 1, 3, 3, + 3, 10, 9, 5, 2, 9, 3, 3, 2, 4, 4, 1, 1, 1, 1, 2, 59, 3, 4, 2, 2, 7, 2, 26, 2, 5, 4, 2, 5, 4, 1, 2, 2, 8, 4, 3, 1, 51, 7, 3, 5, + 3, 15, 2, 2, 2, 2, 9, 3, 3, 2, 2, 3, 2, 2, 2, 3, 2, 1, 1, 1, 12, 2, 9, 7, 5, 4, 2, 1, 1, 7, 6, 4, 4, 11, 2, 6, 3, 24, 2, 2, 2, + 2, 3, 2, 11, 7, 2, 4, 3, 3, 2, 3, 1, 16, 2, 4, 2, 7, 3, 2, 15, 1, 5, 2, 2, 2, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 169,7, 2, 2, 2, 3, 2, 10, 1, 1, 1, 3, 3, 3, 3, 3, 3, 4, 1, 1, 6, 1, 1, 1, 2, 2, 7, 1, 1, 4, 4, 4, 4, 3, 3, 6, 3, 3, 3, 2, 2, + 3, 6, 1, 3, 3, 41, 1, 1, 3, 3, 3, 3, 2, 9, 9, 2, 20, 8, 4, 2, 6, 6, 7, 2, 2, 2, 2, 13, 3, 4, 2, 4, 4, 2, 2, 2, 13, 8, 8, 5, 4, + 2, 21, 2, 1, 17, 14, 3, 11, 9, 2, 2, 1, 17, 1, 14, 8, 4, 2, 1, 1, 6, 5, 3, 2, 1, 1, 2, 2, 48, 5, 2, 10, 5, 2, 5, 5, 3, 15, 2, 12, 9, + 4, 8, 4, 4, 1, 1, 3, 2, 3, 237,15, 8, 5, 4, 3, 2, 2, 2, 1, 1, 31, 23, 2, 1, 1, 3, 10, 4, 3, 4, 2, 2, 2, 10, 3, 12, 2, 4, 3, 145,13, + 2, 5, 3, 2, 2, 84, 18, 4, 6, 2, 6, 5, 5, 1, 4, 28, 7, 4, 2, 1, 8, 4, 14, 3, 2, 2, 2, 2, 21, 4, 3, 1, 1, 1, 1, 4, 3, 3, 4, 3, 1, + 3, 1, 1, 1, 5, 3, 1, 1, 1, 1, 4, 4, 4, 2, 1, 4, 2, 13, 2, 1, 1, 2, 1, 35, 5, 3, 3, 3, 4, 2, 10, 1, 1, 1, 7, 6, 6, 3, 3, 2, 2, + 2, 3, 1, 3, 3, 2, 2, 5, 5, 2, 2, 214,6, 1, 2, 108,95, 2, 9, 6, 3, 4, 3, 3, 2, 6, 4, 2, 2, 21, 4, 5, 2, 5, 2, 16, 2, 2, 3, 2, 9, + 2, 3, 23, 4, 4, 2, 11, 3, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2, 1, 1, 1, 36, 5, 14, 2, 1, 1, 2, 2, 11, 7, 3, 4, 5, 11, 1, 1, 4, 1, 1, 1, + 1, 6, 4, 3, 3, 13, 4, 2, 3, 2, 6, 2, 2, 1, 1, 10, 1, 1, 1, 2, 3, 2, 2, 1, 74, 2, 2, 34, 24, 9, 2, 1, 3, 1, 1, 1, 2, 1, 10, 2, 2, + 4, 3, 3, 2, 1, 1, 4, 1, 5, 2, 1, 3, 2, 2, 11, 3, 1, 1, 1, 1, 2, 2, 2, 2, 2, 7, 18, 7, 4, 2, 2, 2, 4, 18, 3, 2, 2, 1, 1, 5, 2, + 4, 3, 3, 1, 1, 163,61, 19, 3, 13, 7, 5, 5, 3, 8, 6, 4, 2, 7, 2, 2, 6, 5, 3, 3, 3, 2, 1, 4, 2, 2, 30, 1, 7, 5, 2, 2, 2, 2, 2, 4, + 4, 4, 7, 28, 4, 1, 1, 1, 1, 8, 5, 5, 2, 2, 2, 2, 2, 1, 1, 23, 4, 2, 8, 8, 7, 2, 17, 4, 4, 1, 5, 2, 1, 1, 2, 2, 37, 3, 3, 3, 3, + 2, 4, 3, 3, 10, 2, 7, 7, 3, 3, 1, 1, 3, 2, 2, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 45, 6, 3, 3, 2, 2, 3, 2, 1, 8, 6, 3, 4, 2, 4, + 1, 1, 1, 1, 3, 5, 3, 1, 5, 5, 5, 23, 7, 7, 7, 7, 2, 5, 3, 2, 2, 2, 2, 2, 5, 2, 2, 2, 1, 1, 27, 2, 1, 1, 3, 2, 1, 1, 3, 2, 1, 1, 7, 4, 4, 1, 5, 2, 2, 2, 1, 41, 9, 4, 2, 2, 17, 1, 1, 1, 3, 3, 3, 2, 13, 11, 12, 2, 10, 9, 8, 1, 1, 4, 4, 1, 1, 2, 2, 2, 2, 122, - 1, 1, 1, 1, 6, 1, 1, 1, 1, 2, 2, 24, 2, 3, 1, 1, 1, 1, 6, 6, 6, 6, 4, 1, 2, 1, 1, 1, 1, 1, 1, 6, 2, 2, 2, 1, 1, 1, 2, 2, 2, - 2, 1, 1, 3, 2, 2, 2, 2, 1, 4, 1, 1, 1, 1, 1, 1, 9, 3, 3, 3, 2, 6, 5, 2, 4, 2, 1, 1, 1, 1, 1, 5, 1, 1, 3, 9, 3, 3, 2, 2, 1, - 2, 2, 13, 4, 1, 1, 1, 2, 4, 1, 2, 2, 2, 11, 11, 6, 4, 3, 3, 1, 1, 1, 1, 1, 1, 10, 4, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 6, 2, 2, 1, 1, 4, 2, 2, 2, 2, 1, 1, 1, 4, 4, 69, 1, 1, 1, 3, 3, 5, 3, 53, 4, 2, 11, 5, 5, 4, 4, 26, 3, 3, 6, 9, 2, 4, 3, 4, - 3, 6, 3, 3, 1, 1, 1, 1, 2, 5, 4, 6, 3, 3, 3, 14, 2, 1, 1, 3, 4, 4, 2, 2, 2, 3, 2, 2, 5, 5, 3, 1, 22, 4, 3, 2, 2, 2, 2, 2, 2, - 1, 6, 3, 2, 2, 2, 1, 1, 3, 1, 13, 6, 3, 2, 2, 2, 2, 1, 21, 2, 5, 2, 2, 1, 2, 3, 1, 1, 1, 1, 29, 7, 4, 4, 2, 3, 3, 2, 2, 1, 1, - 8, 1, 4, 5, 2, 2, 1, 19, 5, 1, 1, 2, 6, 1, 1, 3, 3, 3, 2, 2, 11, 1, 2, 3, 2, 2, 3, 3, 3, 3, 1, 10, 4, 2, 2, 3, 7, 2, 3, 3, 1, - 2, 75, 7, 4, 4, 4, 4, 2, 2, 2, 1, 5, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 36, 4, 1, 1, 1, 1, 1, 2, 14, 2, 2, 2, 12, 5, - 1, 4, 3, 18, 15, 12, 6, 2, 5, 1, 2, 2, 12, 11, 4, 4, 4, 1, 1, 4, 4, 4, 3, 206,16, 6, 3, 3, 3, 2, 7, 2, 2, 3, 50, 14, 6, 4, 16, 1, 2, - 7, 5, 3, 2, 11, 9, 2, 2, 1, 1, 4, 2, 2, 2, 2, 3, 1, 1, 6, 6, 3, 6, 3, 62, 4, 4, 41, 5, 5, 2, 3, 3, 3, 2, 2, 7, 1, 4, 2, 2, 13, - 6, 6, 1, 13, 8, 8, 8, 3, 2, 1, 1, 1, 2, 2, 2, 2, 2, 1, 55, 6, 6, 6, 4, 18, 8, 8, 8, 6, 3, 5, 5, 5, 5, 5, 5, 5, 5, 3, 2, 1, 30, - 5, 5, 5, 8, 8, 8, 8, 8, 5, 7, 9, 8, 8, 8, 7, 41, 2, 3, 31, 2, 1, 28, 1, 10, 7, 3, 9, 3, 1, 1, 7, 2, 1, 1, 3, 9, 2, 2, 3, 1, 1, - 1, 2, 1, 53, 3, 2, 2, 2, 3, 2, 2, 2, 42, 21, 1, 1, 1, 3, 3, 8, 8, 4, 3, 3, 5, 2, 16, 8, 3, 2, 2, 2, 2, 2, 2, 1, 1, 1, 116,19, 1, - 3, 1, 12, 1, 11, 6, 4, 5, 1, 1, 3, 1, 3, 1, 2, 15, 3, 8, 5, 2, 4, 2, 7, 4, 3, 12, 2, 4, 3, 2, 15, 1, 2, 2, 3, 2, 2, 2, 4, 3, 2, - 3, 6, 3, 2, 4, 43, 4, 6, 2, 2, 14, 11, 10, 9, 3, 2, 4, 12, 2, 2, 5, 4, 2, 1, 5, 2, 2, 1, 157,19, 8, 5, 1, 7, 2, 2, 8, 1, 1, 100,17, - 8, 6, 5, 5, 5, 4, 2, 1, 1, 1, 3, 3, 1, 2, 2, 2, 4, 3, 3, 5, 3, 3, 3, 3, 3, 9, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 1, 20, 1, 4, - 1, 1, 1, 4, 4, 4, 4, 37, 4, 2, 3, 1, 1, 1, 1, 1, 2, 4, 1, 1, 1, 3, 3, 1, 3, 2, 2, 2, 10, 8, 8, 7, 4, 4, 2, 2, 8, 3, 3, 1, 1, - 1, 1, 1, 1, 3, 2, 2, 11, 3, 1, 5, 1, 2, 5, 3, 1, 1, 1, 1, 1, 1, 4, 52, 9, 1, 16, 5, 6, 8, 3, 2, 2, 4, 1, 1, 3, 2, 3, 2, 69, 4, - 2, 4, 1, 2, 2, 2, 1, 4, 3, 2, 2, 32, 6, 1, 2, 11, 5, 3, 2, 2, 2, 3, 1, 1, 2, 3, 2, 3, 3, 4, 2, 2, 2, 3, 74, 4, 2, 23, 20, 17, 1, - 12, 9, 3, 1, 3, 3, 8, 4, 2, 3, 25, 2, 2, 7, 3, 3, 5, 2, 5, 5, 4, 4, 5, 3, 2, 2, 1, 1, 4, 2, 1, 101,17, 2, 9, 5, 1, 1, 3, 9, 3, - 2, 3, 3, 2, 4, 3, 5, 4, 30, 3, 2, 1, 1, 1, 18, 2, 1, 3, 1, 13, 1, 4, 4, 4, 1, 1, 1, 1, 1, 4, 2, 3, 2, 2, 2, 2, 2, 2, 2, 1, 8, - 1, 1, 4, 9, 2, 4, 4, 22, 8, 3, 1, 1, 3, 3, 1, 2, 2, 1, 1, 1, 1, 3, 3, 3, 2, 1, 30, 3, 2, 13, 4, 8, 5, 3, 3, 127,36, 1, 6, 3, 3, - 3, 3, 7, 4, 4, 9, 4, 2, 2, 5, 1, 2, 7, 3, 4, 1, 2, 1, 23, 2, 1, 1, 3, 14, 2, 2, 2, 7, 1, 1, 1, 23, 2, 3, 3, 2, 2, 9, 4, 3, 1, - 3, 2, 16, 6, 5, 4, 9, 1, 1, 1, 6, 2, 3, 3, 3, 4, 2, 2, 71, 9, 2, 4, 2, 3, 1, 13, 4, 5, 3, 3, 10, 2, 2, 14, 6, 5, 7, 1, 3, 2, 5, - 2, 2, 44, 4, 3, 9, 8, 4, 1, 1, 1, 13, 1, 5, 2, 2, 3, 1, 1, 1, 1, 5, 2, 1, 8, 5, 1, 10, 4, 2, 2, 2, 7, 7, 5, 2, 2, 1, 106,24, 3, - 1, 13, 2, 3, 21, 2, 2, 2, 2, 2, 2, 5, 5, 2, 3, 1, 2, 2, 2, 2, 29, 5, 2, 2, 3, 8, 4, 2, 1, 2, 26, 2, 2, 2, 3, 2, 2, 2, 2, 2, 1, - 9, 3, 3, 4, 41, 2, 2, 3, 3, 2, 2, 26, 23, 14, 11, 3, 3, 5, 3, 3, 2, 1, 2, 2, 3, 3, 153,2, 1, 6, 2, 2, 1, 1, 1, 1, 1, 41, 2, 21, 7, - 5, 5, 2, 2, 2, 1, 5, 3, 10, 3, 2, 4, 2, 1, 1, 1, 1, 4, 3, 1, 15, 4, 3, 2, 1, 1, 1, 7, 5, 52, 15, 3, 3, 3, 8, 8, 8, 7, 5, 3, 3, - 5, 4, 4, 4, 2, 3, 1, 1, 1, 1, 1, 14, 3, 3, 9, 3, 3, 2, 6, 1, 2, 4, 8, 6, 2, 2, 2, 3, 17, 1, 2, 7, 3, 2, 2, 2, 2, 3, 2, 23, 6, - 2, 4, 11, 3, 2, 1, 1, 1, 7, 4, 11, 3, 2, 1, 5, 5, 1, 1, 1, 1, 1, 32, 3, 3, 2, 2, 3, 5, 2, 2, 8, 3, 1, 1, 57, 5, 2, 22, 15, 7, 2, - 1, 4, 3, 3, 13, 2, 1, 1, 1, 1, 6, 4, 3, 2, 2, 2, 1, 3, 1, 1, 9, 3, 1, 1, 1, 1, 4, 4, 76, 7, 7, 6, 9, 8, 7, 45, 6, 2, 1, 1, 4, - 4, 3, 1, 18, 5, 12, 4, 3, 6, 4, 4, 4, 3, 2, 2, 1, 2, 2, 2, 1, 1, 3, 3, 3, 3, 3, 18, 3, 5, 1, 1, 2, 2, 1, 1, 4, 2, 2, 111,8, 1, - 1, 1, 1, 1, 2, 11, 3, 1, 1, 4, 4, 2, 2, 2, 2, 8, 2, 1, 1, 3, 2, 1, 6, 3, 6, 6, 4, 4, 4, 3, 26, 2, 16, 12, 6, 3, 4, 3, 5, 2, 2, - 6, 3, 4, 4, 7, 3, 5, 4, 1, 1, 1, 1, 5, 2, 2, 31, 14, 1, 1, 1, 7, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 22, 4, 7, 5, 1, 10, 3, 4, 3, - 2, 10, 4, 3, 3, 3, 4, 1, 2, 2, 1, 1, 1, 48, 9, 5, 2, 2, 3, 2, 12, 6, 2, 1, 3, 2, 2, 2, 2, 16, 2, 14, 6, 4, 3, 5, 5, 4, 2, 2, 2, - 2, 176,30, 2, 2, 3, 3, 2, 10, 8, 7, 7, 4, 3, 43, 3, 14, 14, 14, 6, 2, 4, 2, 4, 9, 8, 5, 9, 8, 5, 4, 4, 4, 10, 2, 7, 7, 6, 28, 1, 1, - 1, 1, 7, 7, 2, 4, 4, 3, 2, 2, 2, 2, 10, 8, 4, 3, 3, 3, 6, 4, 1, 1, 14, 12, 11, 11, 9, 5, 1, 2, 4, 17, 7, 8, 3, 3, 114,11, 1, 1, 1, - 4, 15, 14, 2, 7, 3, 2, 2, 2, 4, 1, 1, 1, 1, 2, 20, 2, 11, 5, 5, 5, 2, 2, 2, 3, 2, 4, 2, 3, 3, 53, 12, 1, 1, 1, 1, 1, 1, 5, 1, 33, - 2, 1, 1, 1, 1, 1, 2, 2, 7, 6, 6, 2, 10, 4, 4, 4, 2, 2, 5, 5, 3, 3, 3, 3, 3, 3, 1, 4, 2, 2, 6, 2, 3, 2, 11, 2, 7, 4, 4, 4, 4, - 3, 3, 3, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 1, 1, 1, 4, 2, 3, 2, 2, 1, 1, 2, 2, 3, 2, 12, 9, 2, 1, 1, 2, 3, 1, 1, 1, - 12, 2, 4, 51, 13, 2, 2, 2, 5, 3, 3, 3, 2, 2, 22, 4, 10, 4, 2, 2, 5, 1, 1, 10, 7, 7, 5, 5, 3, 3, 4, 9, 1, 3, 2, 8, 2, 28, 19, 15, 15, - 3, 9, 4, 2, 4, 6, 2, 2, 1, 1, 11, 6, 5, 4, 4, 4, 4, 19, 6, 1, 3, 4, 2, 20, 3, 4, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 3, 1, 3, - 2, 4, 3, 118,32, 14, 7, 7, 3, 9, 9, 1, 1, 37, 3, 2, 2, 4, 20, 10, 4, 4, 4, 4, 4, 4, 4, 3, 2, 1, 14, 2, 4, 2, 1, 1, 5, 5, 2, 2, 2, - 3, 2, 20, 10, 10, 10, 6, 10, 8, 8, 8, 2, 2, 5, 2, 3, 1, 2, 19, 7, 5, 2, 3, 2, 5, 1, 3, 3, 18, 3, 1, 1, 1, 1, 1, 5, 3, 2, 2, 2, 7, - 6, 6, 6, 3, 64, 5, 2, 2, 5, 1, 1, 44, 5, 3, 4, 3, 3, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 15, 5, 4, 6, 6, 3, 7, 3, 2, 4, 3, - 1, 1, 3, 1, 1, 1, 1, 68, 6, 1, 3, 7, 2, 1, 3, 3, 1, 5, 5, 5, 5, 3, 2, 2, 2, 1, 41, 40, 39, 1, 1, 1, 1, 1, 8, 8, 4, 7, 6, 2, 2, - 2, 5, 1, 3, 15, 2, 4, 2, 3, 10, 4, 3, 3, 3, 2, 13, 1, 6, 1, 2, 1, 37, 7, 3, 2, 12, 2, 8, 7, 9, 3, 1, 2, 1, 1, 1, 7, 1, 5, 3, 1, - 1, 67, 3, 1, 1, 1, 1, 1, 1, 1, 1, 4, 3, 2, 2, 2, 2, 2, 3, 48, 10, 8, 1, 15, 13, 2, 18, 12, 11, 2, 6, 1, 1, 1, 1, 1, 1, 3, 1, 133,1, - 8, 1, 3, 33, 1, 9, 7, 7, 7, 7, 5, 22, 22, 18, 4, 6, 4, 2, 2, 2, 6, 4, 77, 1, 1, 1, 1, 1, 1, 9, 3, 3, 3, 3, 3, 3, 3, 10, 3, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 5, 3, 3, 3, 2, 2, 2, 2, 1, 1, 22, 15, 12, 7, 7, 3, 3, 3, 3, 3, 3, 3, 8, 6, 6, - 2, 7, 2, 2, 1, 2, 1, 4, 1, 2, 4, 5, 3, 3, 2, 1, 1, 2, 2, 1, 7, 1, 5, 3, 3, 4, 2, 3, 1, 203,1, 1, 1, 1, 1, 41, 5, 4, 11, 4, 3, - 3, 6, 1, 1, 1, 1, 1, 14, 2, 2, 6, 1, 5, 1, 4, 4, 2, 1, 1, 79, 12, 4, 4, 6, 4, 2, 1, 21, 6, 5, 4, 4, 2, 30, 5, 2, 4, 2, 3, 1, 6, - 3, 3, 1, 1, 2, 2, 39, 8, 2, 3, 3, 1, 1, 2, 5, 4, 2, 2, 2, 5, 3, 2, 21, 6, 4, 1, 7, 7, 3, 4, 1, 1, 10, 3, 2, 2, 1, 1, 1, 3, 3, - 2, 1, 1, 80, 1, 1, 34, 4, 5, 7, 7, 5, 2, 2, 8, 6, 2, 2, 1, 1, 1, 8, 5, 5, 5, 4, 2, 2, 5, 2, 3, 3, 3, 1, 3, 6, 1, 1, 1, 1, 1, - 1, 2, 2, 2, 2, 1, 2, 6, 4, 38, 10, 6, 2, 10, 2, 4, 3, 5, 4, 1, 1, 4, 1, 89, 20, 2, 1, 1, 3, 5, 2, 2, 2, 1, 3, 1, 1, 1, 4, 1, 1, - 6, 3, 2, 2, 2, 13, 5, 4, 2, 1, 2, 4, 3, 2, 6, 1, 4, 3, 2, 9, 1, 1, 1, 1, 2, 2, 2, 1, 1, 8, 5, 2, 1, 1, 3, 3, 120,2, 2, 2, 24, - 3, 6, 3, 2, 3, 1, 1, 1, 5, 1, 3, 2, 3, 2, 1, 1, 1, 1, 1, 20, 16, 4, 4, 3, 3, 3, 8, 7, 3, 2, 1, 1, 2, 10, 1, 5, 3, 3, 3, 1, 1, - 2, 1, 1, 3, 2, 1, 1, 8, 4, 1, 3, 2, 5, 5, 5, 5, 3, 2, 9, 6, 5, 1, 1, 1, 10, 3, 2, 1, 1, 1, 1, 13, 6, 4, 1, 1, 1, 3, 3, 4, 1, - 1, 1, 16, 2, 4, 2, 1, 1, 3, 2, 8, 3, 1, 1, 1, 1, 1, 2, 1, 1, 5, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 2, 2, 1, 1, - 17, 3, 1, 1, 2, 3, 3, 145,15, 3, 2, 1, 2, 1, 13, 2, 4, 4, 2, 21, 3, 2, 2, 2, 2, 2, 3, 24, 5, 2, 2, 7, 3, 2, 1, 1, 1, 2, 6, 2, 3, - 5, 50, 8, 4, 3, 3, 1, 2, 5, 4, 4, 1, 8, 8, 7, 6, 4, 4, 188,9, 4, 2, 12, 6, 2, 2, 2, 2, 2, 2, 3, 2, 38, 7, 2, 8, 5, 3, 3, 1, 3, - 2, 2, 4, 2, 3, 2, 2, 4, 7, 2, 2, 2, 2, 93, 6, 4, 3, 3, 3, 2, 2, 2, 2, 7, 1, 4, 2, 9, 3, 1, 7, 6, 3, 1, 2, 2, 2, 6, 2, 3, 7, - 3, 2, 2, 2, 6, 5, 5, 5, 1, 16, 1, 1, 9, 3, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 4, 7, 5, 3, 3, 2, 9, 2, 4, 11, 8, 8, 8, 5, 3, 3, 3, - 2, 2, 2, 4, 1, 1, 120,3, 19, 2, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 3, 2, 1, 3, 9, 9, 7, 11, 5, 3, 10, 4, 1, 1, 2, 1, 2, 2, 17, 12, 7, - 3, 2, 2, 8, 1, 1, 1, 1, 1, 2, 5, 2, 7, 2, 2, 4, 2, 3, 1, 1, 1, 2, 7, 1, 4, 2, 1, 3, 1, 4, 1, 1, 25, 1, 2, 3, 9, 2, 3, 13, 9, - 3, 88, 6, 1, 1, 1, 4, 2, 1, 1, 2, 6, 21, 8, 1, 1, 1, 7, 3, 2, 2, 9, 4, 4, 2, 3, 2, 2, 2, 8, 3, 1, 5, 3, 6, 5, 4, 2, 4, 2, 5, - 2, 50, 17, 3, 1, 2, 2, 6, 1, 1, 1, 3, 2, 4, 4, 3, 4, 9, 3, 1, 1, 3, 107,2, 2, 2, 2, 4, 3, 3, 1, 41, 4, 14, 9, 6, 2, 8, 1, 1, 3, - 3, 5, 11, 1, 4, 1, 1, 1, 2, 10, 1, 1, 1, 9, 8, 4, 16, 4, 3, 1, 1, 1, 2, 1, 1, 1, 63, 7, 3, 1, 1, 19, 2, 9, 2, 6, 2, 4, 3, 4, 6, - 4, 2, 5, 6, 1, 1, 48, 2, 2, 2, 3, 1, 1, 2, 5, 1, 2, 2, 2, 2, 1, 1, 11, 7, 4, 1, 9, 1, 1, 1, 1, 2, 9, 4, 2, 17, 1, 3, 2, 2, 3, - 7, 3, 60, 9, 2, 2, 5, 4, 4, 3, 15, 3, 2, 2, 1, 7, 2, 2, 2, 8, 4, 2, 7, 2, 7, 3, 5, 3, 18, 4, 1, 1, 1, 3, 2, 3, 2, 2, 1, 1, 4, - 2, 3, 2, 20, 3, 2, 3, 1, 1, 1, 4, 4, 2, 2, 12, 4, 1, 121,21, 6, 2, 4, 2, 3, 31, 6, 2, 7, 3, 3, 6, 5, 4, 4, 3, 4, 2, 16, 3, 8, 2, - 1, 1, 1, 1, 1, 3, 16, 6, 6, 2, 3, 5, 2, 2, 1, 3, 2, 10, 6, 4, 2, 10, 2, 1, 3, 22, 4, 3, 3, 1, 4, 1, 1, 2, 2, 11, 4, 2, 30, 5, 2, - 4, 3, 9, 2, 2, 3, 2, 1, 1, 4, 2, 10, 4, 4, 4, 4, 3, 3, 1, 1, 3, 2, 7, 5, 2, 2, 47, 4, 30, 11, 1, 4, 2, 5, 3, 1, 4, 5, 4, 2, 3, - 2, 3, 2, 4, 2, 1, 1, 31, 3, 3, 14, 9, 4, 2, 2, 9, 3, 1, 71, 14, 3, 4, 2, 1, 1, 9, 2, 2, 2, 3, 15, 1, 3, 8, 3, 3, 5, 4, 1, 1, 3, - 2, 2, 3, 5, 2, 2, 1, 3, 1, 1, 1, 1, 1, 11, 2, 2, 4, 2, 32, 5, 1, 1, 1, 1, 2, 4, 3, 2, 7, 4, 3, 3, 3, 2, 1, 1, 2, 3, 2, 12, 7, - 5, 6, 4, 39, 3, 8, 2, 4, 7, 3, 3, 4, 4, 4, 8, 2, 2, 21, 4, 1, 8, 5, 3, 4, 2, 2, 6, 2, 4, 4, 4, 10, 3, 19, 5, 3, 1, 3, 4, 2, 2, + 1, 1, 1, 1, 6, 1, 1, 1, 1, 2, 2, 24, 2, 3, 1, 1, 1, 1, 6, 6, 6, 6, 4, 1, 2, 1, 1, 1, 1, 1, 1, 6, 2, 2, 2, 1, 1, 1, 2, 2, 2, + 2, 1, 1, 3, 2, 2, 2, 2, 1, 4, 1, 1, 1, 1, 1, 1, 9, 3, 3, 3, 2, 6, 5, 2, 4, 2, 1, 1, 1, 1, 1, 5, 1, 1, 3, 9, 3, 3, 2, 2, 1, + 2, 2, 13, 4, 1, 1, 1, 2, 4, 1, 2, 2, 2, 11, 11, 6, 4, 3, 3, 1, 1, 1, 1, 1, 1, 10, 4, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 6, 2, 2, 1, 1, 4, 2, 2, 2, 2, 1, 1, 1, 4, 4, 69, 1, 1, 1, 3, 3, 5, 3, 53, 4, 2, 11, 5, 5, 4, 4, 26, 3, 3, 6, 9, 2, 4, 3, 4, + 3, 6, 3, 3, 1, 1, 1, 1, 2, 5, 4, 6, 3, 3, 3, 14, 2, 1, 1, 3, 4, 4, 2, 2, 2, 3, 2, 2, 5, 5, 3, 1, 22, 4, 3, 2, 2, 2, 2, 2, 2, + 1, 6, 3, 2, 2, 2, 1, 1, 3, 1, 13, 6, 3, 2, 2, 2, 2, 1, 21, 2, 5, 2, 2, 1, 2, 3, 1, 1, 1, 1, 29, 7, 4, 4, 2, 3, 3, 2, 2, 1, 1, + 8, 1, 4, 5, 2, 2, 1, 19, 5, 1, 1, 2, 6, 1, 1, 3, 3, 3, 2, 2, 11, 1, 2, 3, 2, 2, 3, 3, 3, 3, 1, 10, 4, 2, 2, 3, 7, 2, 3, 3, 1, + 2, 75, 7, 4, 4, 4, 4, 2, 2, 2, 1, 5, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 36, 4, 1, 1, 1, 1, 1, 2, 14, 2, 2, 2, 12, 5, + 1, 4, 3, 18, 15, 12, 6, 2, 5, 1, 2, 2, 12, 11, 4, 4, 4, 1, 1, 4, 4, 4, 3, 206,16, 6, 3, 3, 3, 2, 7, 2, 2, 3, 50, 14, 6, 4, 16, 1, 2, + 7, 5, 3, 2, 11, 9, 2, 2, 1, 1, 4, 2, 2, 2, 2, 3, 1, 1, 6, 6, 3, 6, 3, 62, 4, 4, 41, 5, 5, 2, 3, 3, 3, 2, 2, 7, 1, 4, 2, 2, 13, + 6, 6, 1, 13, 8, 8, 8, 3, 2, 1, 1, 1, 2, 2, 2, 2, 2, 1, 55, 6, 6, 6, 4, 18, 8, 8, 8, 6, 3, 5, 5, 5, 5, 5, 5, 5, 5, 3, 2, 1, 30, + 5, 5, 5, 8, 8, 8, 8, 8, 5, 7, 9, 8, 8, 8, 7, 41, 2, 3, 31, 2, 1, 28, 1, 10, 7, 3, 9, 3, 1, 1, 7, 2, 1, 1, 3, 9, 2, 2, 3, 1, 1, + 1, 2, 1, 53, 3, 2, 2, 2, 3, 2, 2, 2, 42, 21, 1, 1, 1, 3, 3, 8, 8, 4, 3, 3, 5, 2, 16, 8, 3, 2, 2, 2, 2, 2, 2, 1, 1, 1, 116,19, 1, + 3, 1, 12, 1, 11, 6, 4, 5, 1, 1, 3, 1, 3, 1, 2, 15, 3, 8, 5, 2, 4, 2, 7, 4, 3, 12, 2, 4, 3, 2, 15, 1, 2, 2, 3, 2, 2, 2, 4, 3, 2, + 3, 6, 3, 2, 4, 43, 4, 6, 2, 2, 14, 11, 10, 9, 3, 2, 4, 12, 2, 2, 5, 4, 2, 1, 5, 2, 2, 1, 157,19, 8, 5, 1, 7, 2, 2, 8, 1, 1, 100,17, + 8, 6, 5, 5, 5, 4, 2, 1, 1, 1, 3, 3, 1, 2, 2, 2, 4, 3, 3, 5, 3, 3, 3, 3, 3, 9, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 1, 20, 1, 4, + 1, 1, 1, 4, 4, 4, 4, 37, 4, 2, 3, 1, 1, 1, 1, 1, 2, 4, 1, 1, 1, 3, 3, 1, 3, 2, 2, 2, 10, 8, 8, 7, 4, 4, 2, 2, 8, 3, 3, 1, 1, + 1, 1, 1, 1, 3, 2, 2, 11, 3, 1, 5, 1, 2, 5, 3, 1, 1, 1, 1, 1, 1, 4, 52, 9, 1, 16, 5, 6, 8, 3, 2, 2, 4, 1, 1, 3, 2, 3, 2, 69, 4, + 2, 4, 1, 2, 2, 2, 1, 4, 3, 2, 2, 32, 6, 1, 2, 11, 5, 3, 2, 2, 2, 3, 1, 1, 2, 3, 2, 3, 3, 4, 2, 2, 2, 3, 74, 4, 2, 23, 20, 17, 1, + 12, 9, 3, 1, 3, 3, 8, 4, 2, 3, 25, 2, 2, 7, 3, 3, 5, 2, 5, 5, 4, 4, 5, 3, 2, 2, 1, 1, 4, 2, 1, 101,17, 2, 9, 5, 1, 1, 3, 9, 3, + 2, 3, 3, 2, 4, 3, 5, 4, 30, 3, 2, 1, 1, 1, 18, 2, 1, 3, 1, 13, 1, 4, 4, 4, 1, 1, 1, 1, 1, 4, 2, 3, 2, 2, 2, 2, 2, 2, 2, 1, 8, + 1, 1, 4, 9, 2, 4, 4, 22, 8, 3, 1, 1, 3, 3, 1, 2, 2, 1, 1, 1, 1, 3, 3, 3, 2, 1, 30, 3, 2, 13, 4, 8, 5, 3, 3, 127,36, 1, 6, 3, 3, + 3, 3, 7, 4, 4, 9, 4, 2, 2, 5, 1, 2, 7, 3, 4, 1, 2, 1, 23, 2, 1, 1, 3, 14, 2, 2, 2, 7, 1, 1, 1, 23, 2, 3, 3, 2, 2, 9, 4, 3, 1, + 3, 2, 16, 6, 5, 4, 9, 1, 1, 1, 6, 2, 3, 3, 3, 4, 2, 2, 71, 9, 2, 4, 2, 3, 1, 13, 4, 5, 3, 3, 10, 2, 2, 14, 6, 5, 7, 1, 3, 2, 5, + 2, 2, 44, 4, 3, 9, 8, 4, 1, 1, 1, 13, 1, 5, 2, 2, 3, 1, 1, 1, 1, 5, 2, 1, 8, 5, 1, 10, 4, 2, 2, 2, 7, 7, 5, 2, 2, 1, 106,24, 3, + 1, 13, 2, 3, 21, 2, 2, 2, 2, 2, 2, 5, 5, 2, 3, 1, 2, 2, 2, 2, 29, 5, 2, 2, 3, 8, 4, 2, 1, 2, 26, 2, 2, 2, 3, 2, 2, 2, 2, 2, 1, + 9, 3, 3, 4, 41, 2, 2, 3, 3, 2, 2, 26, 23, 14, 11, 3, 3, 5, 3, 3, 2, 1, 2, 2, 3, 3, 153,2, 1, 6, 2, 2, 1, 1, 1, 1, 1, 41, 2, 21, 7, + 5, 5, 2, 2, 2, 1, 5, 3, 10, 3, 2, 4, 2, 1, 1, 1, 1, 4, 3, 1, 15, 4, 3, 2, 1, 1, 1, 7, 5, 52, 15, 3, 3, 3, 8, 8, 8, 7, 5, 3, 3, + 5, 4, 4, 4, 2, 3, 1, 1, 1, 1, 1, 14, 3, 3, 9, 3, 3, 2, 6, 1, 2, 4, 8, 6, 2, 2, 2, 3, 17, 1, 2, 7, 3, 2, 2, 2, 2, 3, 2, 23, 6, + 2, 4, 11, 3, 2, 1, 1, 1, 7, 4, 11, 3, 2, 1, 5, 5, 1, 1, 1, 1, 1, 32, 3, 3, 2, 2, 3, 5, 2, 2, 8, 3, 1, 1, 57, 5, 2, 22, 15, 7, 2, + 1, 4, 3, 3, 13, 2, 1, 1, 1, 1, 6, 4, 3, 2, 2, 2, 1, 3, 1, 1, 9, 3, 1, 1, 1, 1, 4, 4, 76, 7, 7, 6, 9, 8, 7, 45, 6, 2, 1, 1, 4, + 4, 3, 1, 18, 5, 12, 4, 3, 6, 4, 4, 4, 3, 2, 2, 1, 2, 2, 2, 1, 1, 3, 3, 3, 3, 3, 18, 3, 5, 1, 1, 2, 2, 1, 1, 4, 2, 2, 111,8, 1, + 1, 1, 1, 1, 2, 11, 3, 1, 1, 4, 4, 2, 2, 2, 2, 8, 2, 1, 1, 3, 2, 1, 6, 3, 6, 6, 4, 4, 4, 3, 26, 2, 16, 12, 6, 3, 4, 3, 5, 2, 2, + 6, 3, 4, 4, 7, 3, 5, 4, 1, 1, 1, 1, 5, 2, 2, 31, 14, 1, 1, 1, 7, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 22, 4, 7, 5, 1, 10, 3, 4, 3, + 2, 10, 4, 3, 3, 3, 4, 1, 2, 2, 1, 1, 1, 48, 9, 5, 2, 2, 3, 2, 12, 6, 2, 1, 3, 2, 2, 2, 2, 16, 2, 14, 6, 4, 3, 5, 5, 4, 2, 2, 2, + 2, 176,30, 2, 2, 3, 3, 2, 10, 8, 7, 7, 4, 3, 43, 3, 14, 14, 14, 6, 2, 4, 2, 4, 9, 8, 5, 9, 8, 5, 4, 4, 4, 10, 2, 7, 7, 6, 28, 1, 1, + 1, 1, 7, 7, 2, 4, 4, 3, 2, 2, 2, 2, 10, 8, 4, 3, 3, 3, 6, 4, 1, 1, 14, 12, 11, 11, 9, 5, 1, 2, 4, 17, 7, 8, 3, 3, 114,11, 1, 1, 1, + 4, 15, 14, 2, 7, 3, 2, 2, 2, 4, 1, 1, 1, 1, 2, 20, 2, 11, 5, 5, 5, 2, 2, 2, 3, 2, 4, 2, 3, 3, 53, 12, 1, 1, 1, 1, 1, 1, 5, 1, 33, + 2, 1, 1, 1, 1, 1, 2, 2, 7, 6, 6, 2, 10, 4, 4, 4, 2, 2, 5, 5, 3, 3, 3, 3, 3, 3, 1, 4, 2, 2, 6, 2, 3, 2, 11, 2, 7, 4, 4, 4, 4, + 3, 3, 3, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19, 1, 1, 1, 4, 2, 3, 2, 2, 1, 1, 2, 2, 3, 2, 12, 9, 2, 1, 1, 2, 3, 1, 1, 1, + 12, 2, 4, 51, 13, 2, 2, 2, 5, 3, 3, 3, 2, 2, 22, 4, 10, 4, 2, 2, 5, 1, 1, 10, 7, 7, 5, 5, 3, 3, 4, 9, 1, 3, 2, 8, 2, 28, 19, 15, 15, + 3, 9, 4, 2, 4, 6, 2, 2, 1, 1, 11, 6, 5, 4, 4, 4, 4, 19, 6, 1, 3, 4, 2, 20, 3, 4, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 3, 1, 3, + 2, 4, 3, 118,32, 14, 7, 7, 3, 9, 9, 1, 1, 37, 3, 2, 2, 4, 20, 10, 4, 4, 4, 4, 4, 4, 4, 3, 2, 1, 14, 2, 4, 2, 1, 1, 5, 5, 2, 2, 2, + 3, 2, 20, 10, 10, 10, 6, 10, 8, 8, 8, 2, 2, 5, 2, 3, 1, 2, 19, 7, 5, 2, 3, 2, 5, 1, 3, 3, 18, 3, 1, 1, 1, 1, 1, 5, 3, 2, 2, 2, 7, + 6, 6, 6, 3, 64, 5, 2, 2, 5, 1, 1, 44, 5, 3, 4, 3, 3, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 15, 5, 4, 6, 6, 3, 7, 3, 2, 4, 3, + 1, 1, 3, 1, 1, 1, 1, 68, 6, 1, 3, 7, 2, 1, 3, 3, 1, 5, 5, 5, 5, 3, 2, 2, 2, 1, 41, 40, 39, 1, 1, 1, 1, 1, 8, 8, 4, 7, 6, 2, 2, + 2, 5, 1, 3, 15, 2, 4, 2, 3, 10, 4, 3, 3, 3, 2, 13, 1, 6, 1, 2, 1, 37, 7, 3, 2, 12, 2, 8, 7, 9, 3, 1, 2, 1, 1, 1, 7, 1, 5, 3, 1, + 1, 67, 3, 1, 1, 1, 1, 1, 1, 1, 1, 4, 3, 2, 2, 2, 2, 2, 3, 48, 10, 8, 1, 15, 13, 2, 18, 12, 11, 2, 6, 1, 1, 1, 1, 1, 1, 3, 1, 133,1, + 8, 1, 3, 33, 1, 9, 7, 7, 7, 7, 5, 22, 22, 18, 4, 6, 4, 2, 2, 2, 6, 4, 77, 1, 1, 1, 1, 1, 1, 9, 3, 3, 3, 3, 3, 3, 3, 10, 3, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 5, 3, 3, 3, 2, 2, 2, 2, 1, 1, 22, 15, 12, 7, 7, 3, 3, 3, 3, 3, 3, 3, 8, 6, 6, + 2, 7, 2, 2, 1, 2, 1, 4, 1, 2, 4, 5, 3, 3, 2, 1, 1, 2, 2, 1, 7, 1, 5, 3, 3, 4, 2, 3, 1, 203,1, 1, 1, 1, 1, 41, 5, 4, 11, 4, 3, + 3, 6, 1, 1, 1, 1, 1, 14, 2, 2, 6, 1, 5, 1, 4, 4, 2, 1, 1, 79, 12, 4, 4, 6, 4, 2, 1, 21, 6, 5, 4, 4, 2, 30, 5, 2, 4, 2, 3, 1, 6, + 3, 3, 1, 1, 2, 2, 39, 8, 2, 3, 3, 1, 1, 2, 5, 4, 2, 2, 2, 5, 3, 2, 21, 6, 4, 1, 7, 7, 3, 4, 1, 1, 10, 3, 2, 2, 1, 1, 1, 3, 3, + 2, 1, 1, 80, 1, 1, 34, 4, 5, 7, 7, 5, 2, 2, 8, 6, 2, 2, 1, 1, 1, 8, 5, 5, 5, 4, 2, 2, 5, 2, 3, 3, 3, 1, 3, 6, 1, 1, 1, 1, 1, + 1, 2, 2, 2, 2, 1, 2, 6, 4, 38, 10, 6, 2, 10, 2, 4, 3, 5, 4, 1, 1, 4, 1, 89, 20, 2, 1, 1, 3, 5, 2, 2, 2, 1, 3, 1, 1, 1, 4, 1, 1, + 6, 3, 2, 2, 2, 13, 5, 4, 2, 1, 2, 4, 3, 2, 6, 1, 4, 3, 2, 9, 1, 1, 1, 1, 2, 2, 2, 1, 1, 8, 5, 2, 1, 1, 3, 3, 120,2, 2, 2, 24, + 3, 6, 3, 2, 3, 1, 1, 1, 5, 1, 3, 2, 3, 2, 1, 1, 1, 1, 1, 20, 16, 4, 4, 3, 3, 3, 8, 7, 3, 2, 1, 1, 2, 10, 1, 5, 3, 3, 3, 1, 1, + 2, 1, 1, 3, 2, 1, 1, 8, 4, 1, 3, 2, 5, 5, 5, 5, 3, 2, 9, 6, 5, 1, 1, 1, 10, 3, 2, 1, 1, 1, 1, 13, 6, 4, 1, 1, 1, 3, 3, 4, 1, + 1, 1, 16, 2, 4, 2, 1, 1, 3, 2, 8, 3, 1, 1, 1, 1, 1, 2, 1, 1, 5, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 2, 2, 1, 1, + 17, 3, 1, 1, 2, 3, 3, 145,15, 3, 2, 1, 2, 1, 13, 2, 4, 4, 2, 21, 3, 2, 2, 2, 2, 2, 3, 24, 5, 2, 2, 7, 3, 2, 1, 1, 1, 2, 6, 2, 3, + 5, 50, 8, 4, 3, 3, 1, 2, 5, 4, 4, 1, 8, 8, 7, 6, 4, 4, 188,9, 4, 2, 12, 6, 2, 2, 2, 2, 2, 2, 3, 2, 38, 7, 2, 8, 5, 3, 3, 1, 3, + 2, 2, 4, 2, 3, 2, 2, 4, 7, 2, 2, 2, 2, 93, 6, 4, 3, 3, 3, 2, 2, 2, 2, 7, 1, 4, 2, 9, 3, 1, 7, 6, 3, 1, 2, 2, 2, 6, 2, 3, 7, + 3, 2, 2, 2, 6, 5, 5, 5, 1, 16, 1, 1, 9, 3, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 4, 7, 5, 3, 3, 2, 9, 2, 4, 11, 8, 8, 8, 5, 3, 3, 3, + 2, 2, 2, 4, 1, 1, 120,3, 19, 2, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 3, 2, 1, 3, 9, 9, 7, 11, 5, 3, 10, 4, 1, 1, 2, 1, 2, 2, 17, 12, 7, + 3, 2, 2, 8, 1, 1, 1, 1, 1, 2, 5, 2, 7, 2, 2, 4, 2, 3, 1, 1, 1, 2, 7, 1, 4, 2, 1, 3, 1, 4, 1, 1, 25, 1, 2, 3, 9, 2, 3, 13, 9, + 3, 88, 6, 1, 1, 1, 4, 2, 1, 1, 2, 6, 21, 8, 1, 1, 1, 7, 3, 2, 2, 9, 4, 4, 2, 3, 2, 2, 2, 8, 3, 1, 5, 3, 6, 5, 4, 2, 4, 2, 5, + 2, 50, 17, 3, 1, 2, 2, 6, 1, 1, 1, 3, 2, 4, 4, 3, 4, 9, 3, 1, 1, 3, 107,2, 2, 2, 2, 4, 3, 3, 1, 41, 4, 14, 9, 6, 2, 8, 1, 1, 3, + 3, 5, 11, 1, 4, 1, 1, 1, 2, 10, 1, 1, 1, 9, 8, 4, 16, 4, 3, 1, 1, 1, 2, 1, 1, 1, 63, 7, 3, 1, 1, 19, 2, 9, 2, 6, 2, 4, 3, 4, 6, + 4, 2, 5, 6, 1, 1, 48, 2, 2, 2, 3, 1, 1, 2, 5, 1, 2, 2, 2, 2, 1, 1, 11, 7, 4, 1, 9, 1, 1, 1, 1, 2, 9, 4, 2, 17, 1, 3, 2, 2, 3, + 7, 3, 60, 9, 2, 2, 5, 4, 4, 3, 15, 3, 2, 2, 1, 7, 2, 2, 2, 8, 4, 2, 7, 2, 7, 3, 5, 3, 18, 4, 1, 1, 1, 3, 2, 3, 2, 2, 1, 1, 4, + 2, 3, 2, 20, 3, 2, 3, 1, 1, 1, 4, 4, 2, 2, 12, 4, 1, 121,21, 6, 2, 4, 2, 3, 31, 6, 2, 7, 3, 3, 6, 5, 4, 4, 3, 4, 2, 16, 3, 8, 2, + 1, 1, 1, 1, 1, 3, 16, 6, 6, 2, 3, 5, 2, 2, 1, 3, 2, 10, 6, 4, 2, 10, 2, 1, 3, 22, 4, 3, 3, 1, 4, 1, 1, 2, 2, 11, 4, 2, 30, 5, 2, + 4, 3, 9, 2, 2, 3, 2, 1, 1, 4, 2, 10, 4, 4, 4, 4, 3, 3, 1, 1, 3, 2, 7, 5, 2, 2, 47, 4, 30, 11, 1, 4, 2, 5, 3, 1, 4, 5, 4, 2, 3, + 2, 3, 2, 4, 2, 1, 1, 31, 3, 3, 14, 9, 4, 2, 2, 9, 3, 1, 71, 14, 3, 4, 2, 1, 1, 9, 2, 2, 2, 3, 15, 1, 3, 8, 3, 3, 5, 4, 1, 1, 3, + 2, 2, 3, 5, 2, 2, 1, 3, 1, 1, 1, 1, 1, 11, 2, 2, 4, 2, 32, 5, 1, 1, 1, 1, 2, 4, 3, 2, 7, 4, 3, 3, 3, 2, 1, 1, 2, 3, 2, 12, 7, + 5, 6, 4, 39, 3, 8, 2, 4, 7, 3, 3, 4, 4, 4, 8, 2, 2, 21, 4, 1, 8, 5, 3, 4, 2, 2, 6, 2, 4, 4, 4, 10, 3, 19, 5, 3, 1, 3, 4, 2, 2, 2, 3, 3, 6, 2, 2, 21, 2, 1, 1, 1, 15, 15, 11, 6, 7, 1, 1, 4, 3, 64, 9, 5, 2, 5, 2, 5, 2, 2, 5, 1, 15, 3, 3, 6, 3, 2, 5, 5, 2, 104, - 34, 3, 2, 3, 1, 19, 2, 9, 4, 3, 31, 4, 4, 12, 5, 2, 5, 15, 5, 1, 2, 2, 11, 3, 4, 2, 5, 31, 8, 6, 4, 5, 2, 5, 2, 2, 4, 31, 5, 7, 6, - 5, 4, 27, 4, 2, 3, 2, 2, 3, 6, 1, 2, 3, 11, 2, 1, 2, 22, 8, 7, 3, 1, 1, 2, 2, 1, 1, 3, 1, 35, 3, 1, 3, 2, 8, 5, 3, 4, 3, 5, 2, - 1, 1, 1, 32, 3, 2, 10, 2, 1, 1, 2, 4, 5, 3, 2, 13, 4, 4, 3, 10, 4, 2, 4, 1, 2, 60, 13, 3, 1, 1, 19, 3, 6, 5, 2, 5, 2, 7, 4, 2, 2, - 2, 2, 2, 28, 2, 2, 2, 2, 17, 7, 5, 3, 2, 2, 2, 122,25, 8, 3, 3, 1, 5, 1, 35, 1, 1, 1, 1, 1, 2, 6, 6, 8, 39, 2, 7, 9, 3, 3, 3, 2, - 6, 2, 4, 5, 3, 12, 3, 7, 26, 3, 3, 2, 1, 2, 2, 2, 4, 3, 2, 2, 127,4, 2, 20, 5, 6, 5, 5, 20, 8, 5, 2, 9, 9, 1, 4, 3, 2, 2, 5, 3, - 2, 14, 9, 3, 3, 4, 2, 3, 2, 31, 15, 2, 9, 5, 4, 3, 9, 3, 3, 4, 7, 2, 3, 11, 3, 1, 2, 3, 6, 1, 1, 2, 1, 1, 1, 5, 13, 6, 3, 2, 9, - 4, 38, 15, 15, 13, 11, 8, 3, 4, 5, 3, 2, 2, 2, 2, 21, 5, 3, 2, 4, 2, 2, 1, 1, 1, 3, 35, 4, 17, 8, 3, 3, 7, 3, 1, 21, 14, 2, 2, 2, 11, - 5, 5, 4, 4, 4, 3, 3, 3, 2, 6, 4, 4, 55, 2, 8, 1, 11, 5, 1, 2, 2, 10, 4, 2, 1, 1, 1, 1, 1, 1, 3, 4, 4, 5, 2, 41, 9, 7, 5, 5, 18, - 3, 2, 4, 5, 2, 6, 2, 1, 212,18, 2, 2, 2, 3, 3, 2, 2, 9, 2, 7, 6, 4, 2, 11, 4, 2, 22, 4, 2, 2, 2, 5, 4, 2, 1, 12, 6, 4, 4, 2, 20, - 18, 17, 2, 5, 6, 2, 1, 1, 1, 4, 83, 8, 3, 3, 3, 1, 27, 5, 15, 3, 6, 1, 17, 1, 1, 3, 8, 7, 3, 21, 20, 1, 2, 2, 2, 2, 4, 2, 2, 2, 2, - 2, 2, 2, 2, 4, 2, 4, 4, 99, 3, 3, 8, 4, 1, 11, 3, 2, 2, 2, 2, 2, 1, 1, 7, 7, 1, 1, 2, 1, 1, 1, 1, 1, 11, 7, 2, 2, 3, 2, 3, 28, - 3, 4, 1, 1, 10, 10, 10, 3, 5, 3, 2, 2, 1, 1, 1, 1, 1, 3, 1, 1, 4, 7, 6, 2, 11, 6, 5, 3, 14, 2, 2, 2, 2, 9, 1, 3, 87, 11, 3, 2, 14, - 8, 2, 2, 2, 3, 2, 3, 1, 1, 3, 1, 1, 13, 5, 4, 3, 5, 10, 6, 3, 3, 2, 7, 2, 4, 3, 31, 8, 1, 5, 2, 5, 3, 2, 1, 2, 7, 2, 2, 26, 2, - 2, 2, 2, 5, 5, 5, 7, 5, 4, 3, 1, 1, 2, 2, 11, 1, 1, 1, 1, 1, 2, 1, 10, 5, 5, 3, 3, 2, 29, 25, 2, 2, 1, 7, 1, 2, 4, 3, 10, 2, 3, - 1, 6, 4, 3, 6, 8, 1, 10, 4, 2, 1, 2, 17, 2, 1, 1, 1, 2, 4, 2, 2, 53, 6, 1, 2, 1, 6, 3, 12, 4, 3, 2, 10, 2, 18, 13, 3, 42, 4, 7, 2, - 2, 7, 7, 4, 3, 5, 5, 3, 68, 2, 8, 4, 2, 2, 1, 12, 3, 3, 2, 4, 5, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 5, 2, 2, 2, 6, 3, 2, 1, 2, 4, - 1, 1, 2, 2, 2, 2, 3, 1, 1, 1, 12, 8, 7, 4, 2, 14, 10, 9, 1, 1, 1, 4, 3, 3, 16, 7, 2, 3, 4, 100,3, 5, 3, 5, 2, 3, 2, 16, 5, 5, 1, - 1, 1, 60, 20, 3, 2, 4, 2, 2, 7, 2, 4, 4, 4, 5, 1, 5, 3, 3, 2, 5, 3, 4, 3, 2, 2, 4, 86, 6, 2, 1, 13, 4, 3, 3, 6, 9, 2, 2, 2, 2, - 4, 1, 1, 1, 2, 1, 1, 10, 7, 7, 10, 2, 3, 7, 2, 4, 8, 1, 1, 3, 127,5, 2, 16, 12, 2, 3, 7, 7, 1, 1, 4, 3, 7, 4, 3, 8, 1, 1, 1, 1, - 4, 6, 1, 6, 29, 3, 2, 2, 2, 3, 5, 1, 4, 1, 1, 7, 12, 3, 2, 5, 5, 1, 2, 2, 13, 2, 2, 1, 1, 3, 3, 2, 5, 4, 4, 47, 6, 7, 3, 2, 2, - 7, 1, 8, 8, 5, 2, 6, 1, 5, 72, 19, 3, 11, 8, 7, 4, 3, 10, 2, 5, 3, 3, 1, 1, 1, 1, 6, 2, 7, 5, 3, 3, 14, 5, 5, 2, 2, 59, 3, 1, 1, - 1, 1, 2, 2, 4, 3, 1, 1, 1, 1, 5, 2, 3, 2, 2, 9, 1, 6, 5, 2, 11, 2, 2, 2, 9, 10, 5, 3, 1, 11, 3, 3, 1, 24, 2, 6, 3, 6, 3, 2, 8, - 1, 1, 5, 2, 2, 1, 4, 10, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 12, 2, 4, 1, 3, 18, 6, 4, 6, 1, 4, 4, 2, 1, 1, 42, 3, 2, 2, 13, 7, - 8, 3, 2, 2, 2, 3, 2, 2, 2, 4, 9, 2, 145,34, 3, 3, 1, 7, 3, 5, 2, 3, 2, 1, 1, 1, 28, 4, 1, 2, 2, 2, 1, 2, 4, 3, 5, 2, 2, 2, 2, - 3, 3, 2, 3, 3, 30, 2, 2, 12, 6, 2, 2, 1, 1, 1, 5, 1, 3, 16, 2, 3, 2, 1, 4, 2, 8, 1, 2, 2, 5, 1, 1, 2, 2, 8, 3, 2, 5, 4, 2, 2, - 30, 11, 8, 4, 1, 1, 2, 3, 3, 5, 13, 2, 3, 3, 2, 18, 1, 1, 8, 6, 5, 9, 3, 4, 4, 1, 5, 1, 2, 23, 10, 3, 2, 2, 5, 2, 2, 26, 1, 3, 3, - 3, 2, 2, 3, 2, 2, 4, 2, 16, 10, 3, 3, 3, 3, 1, 1, 1, 2, 1, 1, 2, 40, 6, 8, 10, 2, 3, 4, 2, 2, 62, 2, 15, 3, 2, 10, 7, 6, 3, 2, 17, - 2, 2, 2, 15, 7, 4, 3, 3, 6, 2, 2, 3, 6, 3, 4, 2, 5, 3, 20, 7, 6, 3, 2, 1, 1, 2, 2, 4, 2, 31, 1, 1, 3, 1, 1, 8, 2, 2, 1, 3, 6, - 12, 6, 6, 5, 6, 4, 2, 1, 41, 3, 15, 3, 7, 15, 2, 7, 5, 2, 4, 7, 3, 18, 2, 1, 3, 3, 1, 31, 1, 1, 6, 2, 3, 2, 1, 1, 5, 4, 4, 3, 2, - 3, 3, 2, 2, 2, 6, 4, 3, 4, 3, 20, 5, 5, 5, 2, 2, 2, 2, 2, 1, 1, 1, 1, 5, 1, 1, 1, 2, 2, 8, 7, 6, 3, 3, 17, 6, 5, 3, 2, 5, 10, - 1, 7, 6, 3, 2, 11, 2, 1, 5, 1, 1, 1, 2, 11, 3, 2, 2, 39, 3, 2, 17, 2, 3, 4, 2, 3, 3, 5, 1, 6, 2, 1, 1, 1, 1, 76, 10, 4, 4, 2, 2, - 2, 26, 3, 7, 2, 7, 3, 4, 3, 2, 3, 2, 5, 4, 1, 1, 2, 2, 9, 4, 2, 2, 5, 3, 11, 4, 3, 31, 1, 1, 7, 2, 4, 2, 1, 5, 3, 3, 2, 6, 3, - 3, 1, 1, 30, 4, 3, 18, 13, 2, 5, 2, 2, 1, 1, 14, 5, 1, 1, 1, 1, 1, 5, 5, 103,40, 4, 3, 2, 4, 2, 2, 2, 16, 15, 6, 3, 2, 4, 1, 2, 3, - 14, 2, 3, 5, 4, 17, 3, 6, 4, 2, 1, 1, 1, 8, 3, 7, 1, 1, 3, 3, 31, 7, 5, 12, 4, 5, 2, 5, 14, 3, 1, 1, 2, 2, 3, 1, 1, 2, 78, 7, 3, - 3, 2, 2, 10, 7, 4, 15, 6, 3, 3, 1, 2, 2, 8, 4, 2, 19, 8, 2, 3, 4, 5, 4, 3, 3, 3, 3, 3, 2, 4, 2, 4, 2, 2, 3, 2, 4, 100,8, 3, 3, - 3, 2, 10, 2, 1, 7, 2, 4, 2, 8, 4, 4, 3, 4, 3, 1, 1, 2, 3, 1, 1, 1, 1, 1, 23, 3, 3, 2, 8, 2, 1, 5, 25, 2, 4, 1, 1, 7, 4, 2, 2, - 5, 4, 3, 3, 1, 1, 152,15, 5, 5, 2, 2, 2, 1, 2, 7, 2, 1, 2, 32, 9, 6, 7, 4, 4, 3, 2, 5, 11, 8, 7, 2, 2, 11, 3, 3, 3, 50, 17, 1, 3, - 11, 2, 2, 1, 13, 8, 2, 9, 2, 2, 2, 3, 2, 8, 27, 4, 2, 2, 2, 3, 1, 1, 2, 1, 3, 9, 3, 3, 1, 37, 4, 1, 20, 6, 1, 12, 6, 10, 5, 2, 3, - 10, 7, 3, 3, 3, 3, 2, 2, 5, 2, 2, 2, 1, 31, 3, 1, 3, 8, 5, 2, 2, 3, 4, 3, 15, 4, 1, 1, 2, 6, 3, 3, 2, 1, 1, 1, 1, 4, 1, 2, 1, - 1, 1, 117,1, 1, 77, 3, 2, 2, 1, 12, 8, 6, 6, 4, 3, 1, 1, 1, 3, 3, 5, 4, 3, 4, 4, 2, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 7, 3, 3, 3, - 16, 10, 9, 2, 1, 1, 1, 3, 1, 1, 2, 6, 3, 3, 8, 5, 3, 2, 2, 2, 2, 6, 4, 6, 2, 3, 3, 8, 2, 2, 2, 3, 1, 8, 3, 2, 1, 2, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 11, 1, 1, 1, 1, 2, 2, 4, 53, 3, 5, 4, 13, 3, 2, 2, 2, 1, 1, 1, 1, 3, 2, 2, 15, 10, 3, 1, 4, 4, 3, 2, - 8, 3, 2, 2, 37, 6, 5, 5, 18, 14, 11, 5, 5, 5, 5, 5, 3, 5, 2, 3, 3, 55, 3, 1, 1, 1, 7, 2, 2, 2, 2, 10, 4, 27, 11, 3, 1, 1, 5, 2, 1, - 5, 5, 3, 2, 2, 2, 1, 1, 4, 4, 4, 2, 37, 14, 3, 6, 1, 3, 3, 1, 1, 9, 2, 1, 1, 2, 1, 2, 1, 94, 4, 4, 7, 5, 1, 1, 1, 3, 1, 2, 1, - 2, 3, 22, 3, 7, 3, 2, 3, 4, 15, 4, 1, 3, 3, 2, 28, 3, 1, 1, 1, 5, 3, 3, 2, 5, 1, 1, 2, 2, 6, 1, 2, 1, 1, 1, 1, 1, 2, 2, 8, 5, - 2, 2, 2, 1, 12, 5, 52, 8, 4, 4, 5, 3, 4, 18, 4, 6, 4, 3, 8, 6, 3, 3, 26, 9, 4, 2, 2, 5, 4, 9, 6, 5, 2, 10, 2, 2, 2, 4, 3, 33, 4, - 1, 1, 6, 3, 7, 4, 3, 3, 2, 6, 8, 4, 3, 9, 3, 4, 1, 2, 1, 9, 2, 5, 14, 10, 4, 2, 3, 7, 2, 3, 10, 3, 3, 11, 2, 2, 5, 4, 4, 2, 6, - 2, 2, 14, 3, 3, 2, 2, 2, 3, 2, 20, 4, 9, 4, 3, 5, 3, 4, 8, 4, 3, 2, 8, 3, 12, 3, 4, 2, 3, 16, 8, 4, 3, 3, 188,12, 2, 2, 11, 5, 2, - 3, 2, 2, 7, 4, 3, 2, 1, 1, 1, 9, 2, 3, 1, 10, 5, 3, 3, 3, 1, 1, 5, 2, 114,3, 3, 7, 3, 1, 1, 1, 5, 1, 4, 19, 1, 1, 4, 2, 2, 6, - 32, 4, 4, 11, 10, 2, 5, 3, 6, 4, 2, 10, 3, 3, 21, 4, 3, 2, 7, 2, 4, 3, 15, 3, 4, 4, 1, 1, 1, 3, 1, 1, 91, 7, 12, 4, 3, 3, 7, 21, 2, - 1, 2, 2, 5, 5, 1, 1, 10, 2, 2, 8, 3, 4, 3, 2, 2, 3, 8, 1, 2, 1, 1, 104,2, 1, 1, 1, 1, 1, 1, 5, 4, 4, 4, 3, 2, 5, 2, 2, 2, 2, - 2, 2, 1, 1, 1, 1, 1, 1, 3, 2, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 2, 2, 14, 6, 3, 2, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 2, 2, 2, 1, - 1, 1, 1, 1, 1, 1, 12, 9, 9, 7, 2, 2, 2, 2, 2, 2, 16, 5, 2, 1, 1, 1, 1, 9, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 4, 2, - 2, 6, 3, 1, 1, 1, 1, 1, 1, 2, 3, 2, 1, 1, 11, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2, 2, 1, 1, 9, 3, 2, 2, 1, 1, 1, 3, 1, - 12, 4, 3, 3, 3, 2, 2, 2, 1, 2, 2, 152,4, 1, 12, 9, 2, 3, 3, 1, 1, 1, 39, 2, 2, 3, 7, 4, 2, 2, 3, 7, 3, 4, 2, 2, 2, 6, 1, 1, 1, - 1, 3, 5, 3, 3, 2, 26, 10, 6, 3, 4, 2, 2, 1, 3, 2, 1, 2, 3, 2, 2, 2, 6, 3, 4, 4, 1, 1, 1, 34, 27, 19, 19, 18, 4, 6, 2, 111,6, 1, 1, - 2, 2, 19, 6, 3, 1, 5, 4, 3, 10, 3, 3, 3, 3, 3, 18, 2, 3, 1, 10, 7, 2, 4, 1, 1, 1, 5, 2, 2, 2, 6, 2, 3, 3, 7, 4, 4, 3, 1, 1, 1, - 1, 2, 2, 16, 2, 7, 5, 3, 8, 4, 2, 81, 2, 18, 16, 5, 2, 10, 6, 5, 1, 2, 6, 25, 15, 2, 11, 3, 2, 3, 3, 1, 3, 2, 4, 3, 1, 1, 11, 3, 4, - 3, 2, 2, 1, 1, 3, 17, 3, 3, 3, 1, 2, 6, 3, 3, 29, 1, 1, 1, 1, 2, 8, 4, 2, 2, 1, 4, 4, 1, 15, 14, 2, 5, 5, 3, 2, 1, 5, 3, 1, 1, - 9, 4, 3, 2, 3, 2, 179,5, 171,5, 3, 3, 7, 20, 1, 7, 3, 3, 4, 4, 3, 2, 6, 2, 2, 2, 11, 2, 3, 8, 2, 1, 2, 12, 5, 3, 3, 3, 3, 6, 2, - 9, 2, 3, 3, 18, 8, 5, 5, 3, 6, 3, 2, 4, 3, 2, 3, 3, 22, 6, 4, 2, 2, 3, 3, 3, 2, 2, 6, 3, 3, 5, 2, 2, 2, 9, 2, 2, 2, 3, 21, 14, - 2, 3, 2, 2, 3, 4, 2, 1, 1, 1, 9, 3, 2, 15, 4, 2, 1, 1, 1, 1, 1, 1, 3, 22, 17, 3, 2, 1, 2, 8, 6, 70, 17, 4, 7, 4, 11, 4, 4, 27, 12, - 7, 5, 3, 2, 3, 2, 3, 1, 1, 2, 2, 3, 2, 5, 42, 2, 6, 3, 1, 2, 7, 4, 3, 4, 2, 2, 2, 2, 2, 2, 1, 1, 12, 5, 4, 4, 2, 2, 2, 2, 3, - 17, 2, 2, 2, 3, 3, 3, 2, 7, 3, 10, 3, 1, 1, 1, 2, 1, 1, 1, 6, 19, 10, 5, 3, 3, 1, 1, 101,13, 5, 5, 3, 6, 4, 4, 1, 2, 12, 2, 5, 2, - 10, 3, 3, 1, 1, 1, 1, 3, 15, 6, 3, 2, 2, 4, 2, 2, 1, 1, 1, 1, 1, 16, 1, 13, 5, 4, 4, 4, 2, 3, 1, 3, 4, 4, 89, 5, 4, 3, 1, 1, 3, - 5, 3, 1, 1, 5, 36, 16, 2, 2, 2, 3, 2, 2, 3, 2, 2, 10, 3, 2, 12, 7, 2, 3, 3, 10, 3, 3, 6, 2, 2, 2, 3, 4, 3, 3, 3, 216,3, 29, 3, 23, - 6, 3, 3, 3, 4, 4, 1, 1, 9, 5, 1, 1, 8, 1, 1, 14, 1, 3, 2, 2, 2, 19, 16, 7, 6, 61, 39, 3, 3, 3, 2, 2, 6, 2, 2, 13, 2, 5, 2, 2, 2, - 3, 3, 1, 1, 1, 2, 2, 2, 18, 4, 4, 3, 5, 2, 2, 2, 10, 1, 1, 1, 1, 7, 5, 5, 10, 4, 4, 4, 6, 28, 2, 7, 6, 5, 4, 4, 1, 3, 3, 1, 1, - 1, 1, 1, 1, 1, 201,4, 2, 2, 3, 2, 2, 2, 130,3, 12, 10, 5, 3, 3, 2, 2, 1, 16, 7, 3, 3, 4, 3, 8, 3, 3, 1, 2, 5, 4, 4, 3, 4, 3, 3, - 2, 4, 2, 2, 2, 3, 2, 4, 2, 16, 1, 1, 4, 4, 3, 4, 3, 1, 5, 4, 2, 19, 11, 9, 2, 2, 2, 3, 1, 2, 1, 1, 16, 6, 5, 3, 7, 10, 3, 4, 4, - 3, 2, 11, 4, 34, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 29, 14, 4, 8, 2, 7, 3, 2, 2, 2, 2, 1, 1, 4, 1, 1, 1, 59, 3, 1, 2, 3, 19, 15, 3, 3, - 3, 4, 3, 6, 5, 18, 3, 2, 1, 3, 120,6, 3, 2, 6, 44, 12, 3, 2, 22, 4, 3, 2, 2, 4, 4, 4, 3, 2, 9, 3, 5, 1, 3, 3, 3, 2, 9, 2, 1, 5, - 4, 10, 3, 3, 2, 1, 56, 4, 1, 1, 16, 5, 2, 1, 5, 5, 3, 11, 5, 2, 1, 2, 16, 6, 2, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 1, 90, 6, 7, 2, - 2, 17, 2, 8, 3, 2, 4, 1, 2, 2, 2, 5, 4, 2, 2, 2, 2, 13, 3, 1, 3, 3, 3, 2, 6, 1, 1, 1, 4, 2, 3, 14, 4, 4, 4, 4, 2, 1, 3, 2, 1, - 1, 92, 4, 4, 4, 3, 17, 5, 5, 5, 5, 5, 5, 3, 4, 3, 5, 7, 3, 2, 13, 4, 2, 12, 6, 3, 1, 1, 5, 3, 4, 87, 15, 2, 5, 3, 2, 1, 12, 9, 8, - 4, 4, 12, 3, 2, 2, 2, 16, 2, 5, 3, 2, 2, 4, 1, 2, 4, 5, 8, 4, 67, 11, 5, 5, 5, 2, 14, 2, 3, 6, 11, 8, 3, 1, 5, 1, 8, 3, 2, 2, 2, - 49, 14, 9, 6, 3, 3, 6, 3, 17, 1, 1, 1, 7, 3, 3, 3, 1, 2, 1, 4, 9, 6, 5, 1, 17, 5, 1, 2, 180,12, 2, 5, 27, 7, 2, 3, 1, 2, 4, 23, 3, - 4, 5, 4, 4, 2, 3, 30, 3, 8, 3, 1, 2, 3, 10, 3, 6, 5, 4, 34, 6, 6, 1, 10, 7, 1, 2, 9, 5, 5, 2, 14, 7, 4, 4, 4, 4, 3, 11, 4, 2, 2, - 2, 4, 2, 2, 2, 53, 5, 34, 13, 7, 7, 2, 2, 8, 7, 4, 3, 2, 4, 2, 1, 1, 1, 1, 2, 3, 1, 1, 3, 2, 246,34, 3, 3, 2, 2, 4, 2, 2, 2, 1, - 3, 5, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 3, 29, 3, 3, 1, 6, 2, 1, 4, 1, 1, 1, 2, 3, 3, 2, 2, 2, 36, 2, 2, 3, 2, 2, 3, 2, 5, 5, - 7, 2, 4, 4, 20, 4, 1, 1, 2, 2, 5, 1, 1, 3, 1, 4, 2, 1, 24, 2, 6, 4, 3, 7, 4, 6, 6, 3, 5, 34, 3, 3, 14, 1, 4, 10, 3, 2, 1, 10, 3, - 13, 3, 4, 1, 1, 2, 7, 4, 2, 2, 6, 3, 1, 1, 2, 2, 2, 3, 3, 230,26, 4, 5, 4, 7, 6, 4, 4, 5, 19, 2, 8, 4, 4, 3, 2, 49, 3, 2, 2, 2, - 2, 6, 2, 5, 2, 2, 2, 3, 9, 7, 1, 10, 4, 2, 2, 2, 2, 2, 20, 3, 2, 10, 8, 2, 2, 14, 2, 5, 5, 4, 7, 13, 7, 4, 45, 2, 5, 7, 4, 7, 7, - 6, 4, 8, 2, 2, 2, 2, 7, 2, 5, 4, 4, 6, 1, 1, 1, 1, 1, 1, 1, 4, 2, 2, 13, 3, 3, 10, 9, 2, 5, 4, 1, 1, 1, 34, 19, 3, 4, 1, 1, 8, - 2, 3, 3, 2, 2, 25, 3, 3, 1, 1, 4, 2, 2, 6, 4, 2, 28, 11, 3, 3, 2, 2, 2, 18, 3, 10, 3, 4, 8, 2, 1, 1, 1, 2, 6, 4, 5, 2, 18, 1, 6, - 1, 2, 2, 2, 1, 29, 1, 1, 5, 3, 1, 1, 2, 3, 3, 1, 1, 1, 3, 3, 3, 2, 2, 5, 4, 1, 1, 33, 4, 10, 2, 4, 4, 2, 13, 8, 16, 2, 3, 1, 3, - 3, 7, 2, 1, 9, 1, 5, 3, 3, 135,8, 3, 1, 2, 18, 3, 2, 5, 3, 8, 6, 10, 5, 3, 2, 3, 6, 5, 5, 10, 3, 2, 4, 4, 4, 36, 4, 3, 8, 2, 1, - 1, 2, 4, 2, 5, 3, 21, 5, 3, 3, 9, 6, 3, 111,1, 1, 1, 1, 10, 1, 9, 8, 3, 3, 3, 3, 8, 1, 4, 2, 16, 7, 5, 2, 4, 2, 4, 3, 50, 5, 6, - 1, 1, 1, 1, 1, 9, 2, 2, 2, 4, 9, 8, 3, 15, 2, 7, 4, 2, 2, 2, 2, 1, 1, 1, 2, 2, 214,2, 2, 2, 14, 10, 2, 5, 2, 1, 1, 1, 1, 11, 1, - 1, 2, 2, 1, 2, 4, 2, 2, 2, 14, 1, 1, 1, 10, 2, 3, 1, 1, 3, 2, 2, 1, 35, 3, 7, 4, 11, 3, 2, 3, 2, 2, 1, 2, 2, 4, 1, 1, 1, 4, 1, - 1, 1, 1, 1, 1, 22, 8, 9, 1, 4, 1, 1, 1, 1, 2, 3, 3, 57, 2, 6, 4, 3, 1, 9, 4, 2, 2, 2, 15, 5, 2, 2, 2, 6, 3, 2, 1, 2, 8, 1, 3, - 2, 2, 2, 3, 1, 1, 10, 2, 2, 22, 1, 1, 4, 1, 2, 1, 1, 6, 3, 2, 1, 4, 2, 3, 3, 2, 17, 4, 2, 7, 6, 91, 4, 2, 10, 3, 2, 18, 3, 9, 2, - 4, 4, 3, 3, 4, 24, 2, 9, 6, 5, 3, 4, 2, 4, 4, 5, 1, 2, 25, 7, 4, 1, 1, 4, 3, 3, 78, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 3, 4, - 6, 4, 8, 3, 2, 2, 9, 2, 2, 2, 2, 2, 4, 7, 4, 11, 3, 1, 1, 3, 2, 5, 1, 2, 29, 4, 7, 5, 5, 5, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 1, 1, 1, 1, 3, 3, 3, 1, 5, 3, 11, 3, 2, 52, 3, 2, 2, 2, 10, 7, 2, 1, 25, 14, 1, 1, 4, 3, 2, 2, 2, 52, 4, 4, 2, 6, 3, 6, 3, 5, - 4, 2, 3, 2, 1, 2, 2, 6, 1, 1, 1, 5, 1, 1, 1, 3, 19, 6, 3, 3, 6, 21, 2, 14, 7, 1, 4, 1, 1, 40, 5, 5, 23, 2, 1, 4, 2, 4, 3, 2, 2, - 4, 4, 3, 2, 1, 1, 12, 7, 4, 2, 32, 5, 2, 6, 2, 3, 3, 2, 5, 4, 2, 2, 165,7, 2, 20, 6, 10, 4, 2, 2, 1, 1, 67, 6, 15, 2, 6, 4, 7, 2, - 5, 2, 2, 18, 2, 11, 4, 2, 5, 5, 3, 2, 8, 1, 5, 3, 2, 12, 4, 3, 17, 5, 4, 4, 5, 10, 2, 2, 52, 3, 4, 7, 4, 9, 6, 2, 2, 3, 3, 18, 8, - 2, 5, 2, 2, 24, 2, 2, 2, 2, 1, 1, 9, 2, 2, 2, 32, 6, 5, 1, 2, 2, 2, 13, 2, 2, 1, 4, 2, 2, 2, 2, 2, 1, 1, 1, 28, 5, 16, 2, 2, 2, - 3, 5, 6, 10, 6, 3, 12, 2, 3, 34, 7, 2, 3, 14, 8, 3, 3, 6, 3, 2, 4, 82, 10, 1, 1, 2, 1, 2, 1, 30, 3, 4, 2, 2, 2, 5, 4, 3, 2, 2, 2, - 2, 2, 2, 2, 5, 2, 8, 7, 1, 1, 2, 1, 1, 14, 14, 2, 1, 3, 1, 1, 4, 3, 2, 2, 2, 23, 10, 2, 2, 3, 10, 4, 2, 1, 2, 2, 16, 2, 8, 1, 2, - 27, 3, 9, 2, 6, 11, 2, 1, 4, 2, 8, 2, 2, 1, 40, 6, 5, 4, 2, 3, 3, 19, 3, 3, 7, 6, 3, 1, 1, 2, 1, 1, 2, 1, 1, 4, 13, 4, 3, 1, 1, - 1, 2, 63, 2, 2, 15, 6, 5, 3, 2, 4, 2, 1, 1, 2, 2, 13, 4, 6, 2, 1, 1, 2, 3, 16, 3, 2, 2, 2, 2, 28, 2, 2, 4, 7, 3, 2, 2, 2, 7, 3, - 23, 3, 5, 1, 4, 3, 1, 8, 1, 1, 1, 8, 3, 2, 13, 4, 2, 7, 2, 20, 1, 1, 6, 5, 3, 4, 1, 12, 3, 4, 3, 2, 1, 1, 1, 1, 37, 29, 4, 4, 1, - 6, 4, 2, 29, 1, 24, 7, 3, 5, 56, 2, 14, 1, 6, 3, 2, 1, 1, 1, 4, 2, 30, 22, 2, 2, 2, 6, 1, 1, 3, 2, 32, 9, 2, 6, 7, 54, 14, 7, 3, 1, - 1, 7, 4, 3, 6, 3, 19, 15, 4, 1, 1, 4, 2, 4, 2, 2, 3, 19, 3, 14, 5, 4, 4, 4, 14, 2, 5, 2, 58, 5, 3, 1, 1, 1, 8, 2, 5, 14, 3, 4, 4, - 11, 2, 2, 3, 3, 5, 40, 7, 3, 4, 3, 7, 3, 5, 3, 10, 6, 3, 57, 10, 8, 6, 6, 3, 2, 2, 6, 5, 4, 4, 2, 2, 26, 8, 6, 3, 3, 3, 2, 3, 3, - 7, 5, 3, 2, 1, 1, 48, 45, 3, 6, 5, 5, 6, 2, 2, 2, 2, 1, 1, 1, 2, 2, 8, 3, 1, 4, 2, 4, 2, 47, 3, 2, 7, 3, 2, 32, 9, 3, 2, 4, 4, - 1, 1, 44, 12, 5, 1, 1, 3, 7, 2, 1, 1, 4, 2, 2, 3, 13, 2, 3, 2, 1, 1, 5, 3, 1, 1, 10, 3, 3, 5, 2, 1, 1, 1, 16, 11, 3, 1, 1, 1, 6, - 2, 2, 4, 21, 2, 3, 2, 2, 4, 3, 3, 3, 2, 1, 2, 43, 13, 4, 2, 2, 7, 4, 3, 2, 5, 3, 2, 3, 6, 57, 6, 38, 5, 3, 2, 4, 3, 7, 11, 5, 2, - 1, 1, 1, 1, 2, 10, 3, 2, 3, 2, 29, 4, 2, 4, 8, 2, 3, 21, 2, 1, 1, 1, 16, 14, 10, 2, 22, 5, 5, 2, 2, 3, 3, 3, 5, 2, 62, 2, 2, 2, 5, - 42, 2, 5, 7, 6, 10, 2, 5, 4, 5, 1, 2, 4, 10, 4, 2, 2, 2, 3, 2, 30, 2, 1, 11, 3, 2, 4, 10, 5, 3, 2, 21, 4, 3, 6, 3, 3, 5, 2, 3, 3, - 14, 6, 4, 2, 12, 5, 3, 6, 5, 5, 31, 2, 1, 9, 4, 3, 3, 2, 8, 5, 79, 2, 1, 1, 9, 3, 19, 5, 4, 2, 7, 6, 3, 4, 7, 2, 6, 4, 1, 9, 9, - 1, 2, 2, 3, 33, 6, 3, 9, 1, 1, 1, 2, 1, 6, 5, 4, 1, 15, 4, 4, 2, 2, 3, 2, 4, 3, 2, 45, 13, 11, 3, 4, 10, 3, 2, 1, 1, 4, 1, 1, 2, - 14, 8, 2, 4, 3, 2, 4, 3, 2, 1, 1, 1, 1, 7, 1, 1, 1, 1, 4, 1, 2, 58, 5, 38, 19, 6, 3, 11, 8, 2, 3, 4, 2, 4, 166,5, 2, 3, 2, 2, 16, - 4, 3, 1, 1, 2, 6, 2, 2, 1, 1, 1, 1, 4, 50, 14, 2, 8, 3, 2, 2, 7, 2, 4, 2, 4, 2, 4, 3, 2, 2, 2, 77, 3, 3, 2, 14, 2, 5, 4, 1, 10, - 5, 3, 3, 4, 3, 3, 2, 2, 11, 7, 5, 2, 2, 5, 2, 1, 2, 6, 1, 5, 2, 2, 3, 2, 1, 1, 3, 5, 2, 105,4, 43, 3, 4, 7, 4, 4, 2, 2, 20, 4, - 5, 1, 9, 7, 5, 2, 2, 8, 4, 5, 4, 3, 4, 3, 2, 3, 2, 1, 1, 4, 2, 2, 6, 3, 1, 2, 2, 54, 7, 6, 4, 3, 6, 3, 2, 6, 14, 4, 2, 1, 1, - 1, 1, 7, 1, 1, 5, 2, 5, 2, 48, 42, 10, 7, 6, 10, 4, 3, 2, 6, 9, 4, 3, 51, 9, 2, 2, 3, 16, 8, 6, 4, 5, 2, 2, 6, 2, 2, 1, 2, 14, 1, - 3, 1, 1, 1, 3, 25, 4, 2, 10, 8, 4, 2, 1, 2, 2, 13, 3, 5, 3, 1, 1, 1, 2, 1, 1, 1, 1, 17, 3, 3, 3, 3, 2, 6, 3, 3, 2, 161,10, 2, 1, - 6, 2, 1, 1, 2, 2, 2, 2, 13, 7, 6, 8, 3, 1, 1, 8, 2, 90, 5, 3, 17, 1, 16, 11, 4, 15, 5, 7, 1, 5, 4, 4, 4, 4, 2, 2, 13, 5, 2, 2, 2, - 2, 1, 5, 3, 2, 3, 2, 9, 4, 4, 3, 2, 2, 2, 4, 2, 4, 6, 2, 4, 1, 41, 2, 12, 4, 5, 4, 3, 2, 1, 2, 2, 2, 2, 12, 3, 3, 126,8, 5, 31, - 6, 10, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 5, 4, 2, 1, 1, 1, 2, 18, 6, 2, 1, 4, 4, 15, 3, 15, 4, 7, 4, 2, 1, 16, 4, 2, 7, 3, - 2, 18, 11, 6, 1, 1, 1, 3, 1, 1, 5, 3, 1, 1, 1, 2, 2, 10, 2, 3, 2, 14, 6, 2, 2, 2, 18, 11, 2, 4, 2, 2, 2, 2, 3, 2, 29, 11, 4, 2, 2, - 7, 3, 16, 8, 8, 5, 5, 5, 3, 3, 68, 6, 2, 2, 20, 3, 5, 4, 1, 9, 4, 3, 5, 8, 2, 2, 2, 1, 1, 5, 4, 3, 6, 5, 1, 1, 3, 1, 13, 3, 1, - 40, 3, 10, 9, 6, 2, 2, 2, 2, 6, 4, 2, 6, 3, 2, 1, 27, 5, 2, 9, 3, 7, 5, 4, 9, 4, 3, 2, 44, 8, 13, 8, 4, 3, 2, 2, 6, 2, 1, 5, 5, - 47, 5, 8, 3, 3, 15, 1, 3, 4, 11, 3, 4, 4, 21, 5, 2, 3, 2, 2, 6, 21, 2, 2, 1, 1, 2, 3, 2, 3, 5, 3, 3, 4, 2, 4, 2, 3, 199,7, 3, 1, - 1, 7, 3, 12, 3, 2, 7, 1, 10, 3, 47, 3, 9, 3, 3, 5, 2, 6, 4, 2, 3, 1, 4, 3, 5, 2, 1, 1, 24, 3, 5, 13, 11, 11, 10, 2, 2, 3, 2, 1, 9, - 4, 2, 2, 3, 2, 2, 28, 3, 9, 2, 5, 3, 1, 3, 37, 7, 2, 16, 14, 7, 2, 3, 3, 4, 2, 150,10, 3, 11, 11, 6, 5, 10, 3, 3, 5, 2, 6, 3, 2, 3, - 1, 3, 86, 5, 3, 32, 28, 5, 3, 7, 2, 1, 5, 3, 2, 2, 1, 2, 5, 3, 3, 4, 2, 3, 3, 2, 3, 9, 6, 10, 4, 3, 3, 5, 2, 1, 1, 5, 2, 1, 16, - 4, 4, 1, 1, 1, 38, 3, 3, 26, 5, 1, 8, 3, 5, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 118,10, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 2, - 3, 1, 2, 1, 1, 1, 8, 2, 1, 1, 3, 2, 8, 3, 11, 1, 1, 5, 7, 4, 4, 2, 2, 21, 4, 3, 1, 1, 1, 1, 5, 4, 8, 5, 2, 2, 3, 1, 10, 5, 2, - 2, 3, 4, 4, 4, 3, 3, 3, 3, 3, 1, 3, 2, 1, 5, 3, 3, 2, 1, 5, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 2, 2, 1, 2, 2, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 110,1, 1, 29, 8, 7, 5, 10, 3, 3, 3, 2, 4, 6, 3, 3, 3, 1, 13, - 1, 4, 4, 3, 3, 17, 3, 2, 3, 9, 4, 3, 12, 10, 1, 1, 10, 2, 3, 2, 1, 17, 6, 1, 5, 3, 5, 2, 2, 44, 7, 2, 1, 8, 3, 2, 5, 3, 2, 2, 14, - 5, 6, 4, 1, 1, 4, 1, 1, 4, 69, 1, 7, 1, 4, 2, 12, 3, 5, 15, 3, 1, 1, 1, 7, 1, 1, 1, 6, 2, 2, 2, 4, 6, 5, 1, 3, 1, 1, 6, 4, 4, - 2, 25, 4, 3, 3, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 9, 7, 6, 2, 28, 5, 3, 2, 2, 4, 2, 2, 15, 2, 2, 2, 2, 9, 2, 2, - 1, 1, 3, 1, 1, 1, 19, 2, 6, 1, 1, 1, 4, 2, 3, 2, 1, 22, 6, 4, 3, 1, 4, 2, 2, 5, 2, 3, 2, 46, 2, 2, 6, 5, 2, 2, 8, 1, 2, 9, 6, - 4, 5, 14, 4, 1, 1, 1, 6, 7, 3, 2, 37, 9, 3, 5, 2, 1, 13, 4, 4, 5, 1, 1, 1, 1, 3, 1, 2, 2, 1, 3, 3, 31, 9, 3, 2, 1, 6, 12, 10, 2, - 23, 4, 3, 2, 14, 12, 4, 2, 24, 4, 4, 4, 6, 5, 3, 3, 2, 2, 3, 67, 11, 6, 4, 2, 5, 3, 3, 16, 12, 12, 12, 11, 5, 3, 4, 1, 2, 3, 2, 2, 1, - 9, 4, 2, 4, 3, 1, 1, 4, 3, 3, 96, 21, 1, 3, 3, 4, 18, 4, 4, 34, 3, 2, 7, 4, 4, 4, 4, 1, 5, 4, 2, 2, 2, 2, 2, 1, 1, 1, 6, 4, 8, - 1, 4, 2, 3, 10, 4, 1, 1, 5, 2, 1, 1, 1, 17, 2, 1, 1, 2, 1, 1, 5, 5, 2, 2, 2, 1, 1, 1, 1, 3, 1, 2, 10, 4, 1, 1, 1, 1, 2, 2, 2, - 5, 3, 31, 7, 3, 11, 2, 5, 12, 10, 3, 2, 2, 6, 4, 34, 2, 2, 3, 1, 20, 3, 1, 3, 2, 2, 8, 2, 2, 34, 2, 7, 5, 5, 3, 4, 11, 6, 3, 3, 2, - 3, 1, 3, 2, 51, 18, 3, 3, 4, 1, 1, 1, 1, 1, 25, 8, 14, 8, 3, 3, 2, 1, 1, 25, 13, 9, 3, 5, 12, 6, 4, 2, 1, 1, 8, 2, 2, 2, 2, 2, 2, - 92, 1, 25, 4, 4, 8, 6, 2, 9, 3, 8, 7, 7, 5, 16, 2, 2, 3, 2, 3, 3, 1, 2, 11, 4, 3, 3, 11, 1, 1, 3, 2, 1, 4, 3, 5, 4, 7, 2, 4, 2, - 2, 3, 55, 3, 3, 15, 7, 5, 3, 3, 2, 8, 4, 3, 1, 1, 14, 8, 2, 3, 2, 3, 2, 28, 16, 11, 7, 4, 2, 2, 4, 5, 3, 69, 1, 4, 2, 8, 6, 4, 20, - 12, 7, 4, 1, 13, 11, 2, 2, 6, 14, 3, 29, 6, 7, 3, 3, 3, 3, 3, 8, 4, 1, 2, 2, 19, 5, 4, 2, 2, 58, 14, 3, 3, 2, 3, 2, 2, 11, 4, 4, 12, - 6, 5, 5, 3, 1, 1, 2, 2, 16, 11, 3, 3, 1, 1, 33, 6, 16, 2, 8, 4, 4, 2, 8, 2, 80, 18, 4, 3, 1, 1, 2, 1, 1, 3, 3, 12, 4, 11, 3, 2, 2, - 2, 5, 2, 20, 11, 4, 6, 7, 6, 3, 1, 8, 3, 7, 6, 6, 2, 3, 2, 2, 5, 1, 2, 253,29, 4, 2, 2, 2, 1, 8, 6, 6, 2, 4, 1, 3, 3, 1, 34, 2, - 10, 7, 3, 5, 1, 1, 1, 4, 2, 5, 1, 41, 2, 4, 3, 1, 3, 2, 2, 28, 21, 16, 11, 7, 4, 3, 3, 2, 8, 5, 2, 21, 1, 1, 1, 6, 3, 2, 4, 1, 1, - 3, 2, 2, 32, 6, 2, 2, 12, 9, 7, 2, 3, 4, 4, 3, 3, 25, 4, 1, 19, 9, 2, 2, 3, 1, 1, 1, 3, 15, 1, 1, 2, 5, 2, 3, 3, 29, 10, 10, 9, 11, - 7, 4, 4, 13, 3, 3, 1, 1, 2, 71, 12, 3, 2, 5, 4, 2, 2, 10, 5, 3, 3, 3, 2, 9, 1, 5, 4, 4, 1, 3, 1, 5, 2, 2, 1, 13, 7, 1, 4, 2, 6, - 4, 52, 7, 2, 5, 4, 27, 2, 2, 18, 6, 1, 4, 3, 6, 6, 4, 1, 1, 1, 1, 1, 6, 1, 5, 5, 5, 19, 6, 3, 3, 2, 9, 7, 7, 5, 5, 5, 2, 84, 7, - 2, 2, 16, 4, 5, 2, 2, 33, 3, 3, 3, 2, 13, 8, 7, 9, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 6, 4, 36, 1, 3, 3, 3, - 3, 8, 3, 3, 3, 4, 3, 1, 6, 2, 58, 4, 6, 7, 4, 4, 4, 4, 3, 5, 3, 2, 4, 4, 12, 2, 2, 6, 1, 1, 3, 2, 88, 10, 13, 2, 21, 7, 3, 6, 4, - 21, 8, 4, 11, 3, 2, 3, 2, 6, 50, 8, 3, 2, 2, 22, 12, 6, 4, 5, 12, 6, 3, 2, 2, 7, 59, 16, 2, 3, 4, 3, 13, 2, 2, 19, 2, 9, 3, 6, 6, 2, - 5, 1, 61, 35, 4, 14, 13, 4, 4, 4, 4, 1, 1, 3, 7, 4, 4, 3, 1, 1, 36, 6, 19, 2, 2, 9, 7, 2, 5, 6, 4, 1, 1, 3, 2, 2, 2, 119,26, 2, 6, - 3, 27, 7, 4, 5, 39, 5, 5, 4, 3, 2, 1, 1, 1, 8, 4, 3, 3, 3, 1, 3, 2, 18, 3, 2, 4, 2, 2, 5, 2, 2, 2, 3, 18, 2, 2, 3, 1, 1, 1, 6, - 2, 3, 3, 79, 6, 3, 2, 18, 3, 8, 3, 11, 3, 3, 2, 4, 2, 6, 3, 3, 3, 3, 9, 5, 4, 14, 4, 7, 7, 4, 3, 4, 3, 3, 2, 8, 2, 19, 5, 3, 9, - 5, 5, 6, 46, 4, 3, 3, 3, 2, 6, 2, 2, 2, 8, 3, 2, 3, 2, 5, 2, 8, 4, 1, 1, 3, 2, 4, 2, 14, 7, 6, 5, 3, 1, 1, 31, 4, 2, 2, 6, 4, - 3, 2, 9, 31, 2, 1, 1, 8, 6, 6, 3, 2, 25, 2, 5, 4, 3, 3, 6, 6, 3, 3, 5, 2, 19, 6, 5, 11, 10, 4, 86, 27, 5, 6, 3, 6, 3, 3, 22, 1, 8, - 2, 4, 4, 25, 3, 3, 4, 6, 3, 3, 2, 5, 3, 1, 1, 135,18, 4, 4, 9, 2, 4, 42, 30, 23, 12, 8, 4, 3, 2, 1, 4, 2, 4, 25, 4, 3, 3, 15, 11, 2, - 4, 4, 16, 15, 2, 1, 2, 2, 1, 1, 9, 3, 2, 4, 22, 5, 4, 4, 3, 8, 1, 1, 1, 3, 2, 1, 1, 2, 11, 7, 5, 1, 3, 79, 1, 1, 6, 2, 2, 2, 2, - 2, 2, 41, 9, 7, 1, 5, 5, 10, 8, 11, 6, 4, 3, 3, 1, 10, 1, 3, 3, 2, 4, 3, 3, 4, 4, 4, 4, 4, 4, 2, 2, 2, 3, 16, 16, 3, 3, 3, 3, 2, - 3, 44, 5, 5, 2, 1, 1, 1, 1, 1, 13, 13, 13, 12, 3, 5, 4, 3, 14, 3, 3, 3, 1, 1, 6, 4, 3, 3, 2, 47, 9, 7, 3, 20, 4, 4, 4, 10, 3, 3, 3, - 3, 1, 9, 3, 5, 5, 4, 2, 10, 1, 2, 4, 5, 2, 4, 3, 3, 11, 2, 3, 9, 1, 1, 5, 9, 1, 2, 1, 24, 6, 1, 3, 2, 1, 5, 4, 5, 4, 3, 3, 3, - 2, 73, 1, 8, 4, 3, 2, 10, 3, 2, 2, 8, 8, 10, 3, 1, 1, 2, 16, 6, 3, 6, 15, 2, 2, 4, 2, 8, 7, 5, 87, 38, 2, 2, 24, 3, 3, 2, 5, 5, 5, - 7, 3, 2, 3, 3, 5, 3, 2, 1, 1, 1, 27, 3, 6, 2, 7, 3, 16, 2, 4, 5, 2, 2, 10, 1, 2, 4, 4, 3, 2, 25, 3, 1, 7, 3, 2, 2, 15, 4, 3, 3, - 5, 2, 1, 1, 4, 3, 35, 1, 1, 1, 2, 1, 4, 2, 2, 1, 2, 1, 3, 2, 1, 2, 2, 2, 1, 1, 13, 5, 5, 5, 3, 4, 2, 2, 2, 1, 1, 1, 1, 17, 6, - 4, 3, 2, 1, 1, 2, 2, 1, 2, 30, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 8, 8, 4, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 16, 2, 1, 4, 9, 6, 1, 1, - 5, 1, 3, 27, 2, 5, 4, 3, 2, 4, 2, 11, 11, 5, 2, 20, 7, 4, 6, 3, 1, 1, 3, 3, 4, 4, 3, 1, 6, 1, 2, 2, 2, 2, 1, 1, 1, 6, 3, 3, 1, - 113,6, 36, 18, 14, 10, 8, 3, 3, 11, 11, 7, 14, 2, 2, 2, 2, 4, 29, 1, 6, 3, 1, 3, 3, 3, 7, 5, 3, 5, 15, 11, 1, 8, 2, 3, 11, 8, 3, 107,3, - 1, 1, 1, 3, 1, 1, 1, 1, 10, 5, 5, 4, 85, 9, 2, 5, 5, 15, 5, 2, 2, 2, 2, 10, 2, 9, 5, 5, 4, 2, 4, 2, 38, 16, 14, 10, 4, 8, 2, 1, 1, - 10, 4, 4, 4, 2, 1, 3, 6, 5, 3, 2, 4, 1, 20, 2, 2, 12, 9, 8, 7, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 156,17, 7, 1, 6, 4, 1, 5, 3, 6, 3, - 3, 27, 8, 2, 2, 2, 5, 3, 1, 3, 3, 1, 1, 1, 5, 5, 5, 4, 1, 1, 1, 1, 6, 1, 1, 3, 1, 13, 3, 2, 3, 5, 4, 1, 18, 4, 3, 5, 3, 4, 23, - 6, 5, 5, 12, 11, 9, 5, 5, 5, 2, 2, 5, 3, 18, 4, 3, 3, 8, 4, 2, 3, 34, 9, 7, 3, 1, 10, 6, 5, 4, 7, 10, 3, 3, 3, 1, 1, 4, 2, 1, 1, - 1, 3, 2, 4, 2, 1, 23, 2, 1, 1, 1, 1, 1, 1, 5, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 2, 5, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 16, 4, 3, 2, 5, 2, 16, 3, 1, 8, 3, 1, 3, 21, 3, 2, 6, 1, 1, 3, 2, 3, 12, - 3, 6, 3, 10, 3, 4, 2, 4, 3, 2, 1, 41, 2, 2, 2, 10, 3, 3, 15, 3, 2, 4, 3, 3, 2, 2, 2, 2, 4, 3, 14, 1, 1, 1, 1, 8, 7, 3, 2, 2, 1, - 2, 2, 2, 2, 63, 5, 1, 1, 5, 2, 2, 1, 1, 1, 3, 5, 3, 6, 2, 2, 7, 16, 2, 9, 9, 7, 2, 2, 2, 5, 5, 2, 78, 25, 13, 13, 6, 3, 7, 4, 2, - 4, 3, 3, 2, 1, 1, 1, 1, 1, 2, 1, 5, 31, 7, 1, 10, 9, 8, 2, 3, 139,4, 18, 13, 6, 5, 4, 4, 3, 2, 30, 3, 3, 11, 8, 1, 1, 1, 1, 2, 2, - 2, 1, 1, 1, 1, 1, 1, 1, 1, 8, 5, 30, 16, 1, 3, 2, 2, 2, 15, 11, 9, 2, 1, 2, 22, 3, 7, 3, 3, 1, 1, 4, 1, 1, 2, 10, 5, 1, 59, 4, 3, - 3, 1, 1, 1, 12, 5, 5, 5, 9, 3, 3, 3, 4, 2, 3, 16, 4, 6, 4, 2, 1, 1, 1, 210,26, 17, 17, 17, 16, 14, 8, 4, 2, 2, 5, 5, 5, 4, 4, 2, 2, - 4, 2, 2, 7, 3, 3, 2, 2, 1, 1, 12, 8, 1, 1, 21, 3, 3, 7, 3, 7, 71, 4, 30, 1, 2, 15, 3, 2, 2, 21, 18, 3, 8, 8, 7, 5, 2, 12, 2, 4, 4, - 7, 2, 4, 3, 1, 1, 6, 2, 2, 17, 8, 7, 3, 4, 2, 2, 2, 1, 4, 3, 2, 1, 43, 10, 4, 4, 9, 1, 1, 4, 2, 12, 3, 3, 6, 52, 2, 1, 11, 6, 6, - 1, 1, 1, 1, 4, 2, 3, 21, 2, 1, 1, 1, 1, 1, 13, 8, 2, 2, 2, 1, 32, 1, 6, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 7, 2, 4, 4, 20, 7, - 3, 3, 5, 2, 5, 3, 2, 2, 5, 1, 29, 6, 3, 14, 4, 7, 1, 1, 1, 2, 2, 1, 34, 4, 27, 7, 4, 4, 3, 2, 4, 62, 2, 6, 15, 3, 5, 5, 5, 19, 15, - 4, 2, 2, 7, 4, 3, 4, 5, 1, 1, 1, 4, 2, 2, 3, 3, 38, 5, 3, 3, 1, 1, 5, 3, 17, 14, 12, 2, 1, 1, 1, 1, 1, 21, 10, 3, 4, 4, 6, 3, 1, - 2, 2, 2, 2, 2, 1, 28, 9, 2, 3, 2, 6, 2, 2, 4, 1, 2, 2, 2, 4, 1, 1, 2, 6, 3, 2, 4, 4, 4, 91, 6, 2, 1, 1, 1, 9, 2, 3, 1, 10, 3, - 1, 2, 19, 3, 5, 1, 7, 1, 1, 5, 5, 15, 2, 6, 6, 4, 6, 6, 4, 2, 2, 5, 4, 63, 2, 1, 2, 6, 5, 4, 15, 3, 3, 24, 2, 2, 16, 13, 3, 3, 10, - 1, 2, 2, 1, 3, 42, 5, 3, 9, 3, 3, 2, 7, 2, 4, 17, 2, 3, 13, 3, 3, 3, 3, 7, 3, 3, 3, 1, 1, 1, 1, 20, 6, 3, 1, 1, 1, 1, 1, 1, 3, - 2, 1, 1, 6, 3, 35, 3, 8, 3, 3, 4, 1, 15, 3, 4, 3, 4, 2, 1, 2, 1, 1, 4, 74, 20, 12, 11, 4, 4, 2, 9, 2, 3, 28, 6, 2, 1, 1, 1, 1, 1, - 15, 13, 1, 1, 1, 1, 10, 1, 1, 4, 1, 1, 1, 2, 29, 16, 5, 5, 5, 4, 3, 2, 6, 1, 1, 6, 3, 3, 3, 6, 71, 5, 4, 3, 22, 2, 1, 4, 3, 2, 7, - 7, 10, 4, 4, 17, 3, 7, 1, 3, 2, 23, 5, 8, 3, 3, 2, 5, 2, 2, 58, 11, 2, 3, 3, 3, 2, 1, 1, 1, 1, 2, 6, 2, 7, 3, 1, 1, 3, 7, 3, 6, - 2, 2, 2, 2, 2, 12, 3, 34, 1, 2, 4, 2, 15, 10, 2, 4, 5, 5, 5, 5, 4, 25, 8, 1, 1, 1, 1, 2, 5, 2, 1, 6, 4, 3, 3, 3, 3, 3, 26, 2, 5, - 2, 1, 4, 3, 3, 27, 2, 4, 4, 3, 1, 1, 12, 3, 1, 1, 1, 2, 4, 2, 2, 3, 10, 7, 4, 3, 2, 2, 1, 3, 2, 23, 2, 1, 2, 2, 18, 5, 13, 6, 3, - 6, 1, 1, 2, 2, 3, 1, 2, 1, 1, 7, 3, 3, 2, 3, 3, 3, 1, 194,4, 2, 18, 3, 7, 5, 5, 5, 5, 1, 1, 1, 1, 11, 1, 1, 2, 4, 1, 1, 3, 3, - 9, 5, 2, 2, 1, 1, 17, 3, 5, 1, 1, 4, 3, 3, 1, 1, 1, 1, 12, 4, 8, 2, 2, 1, 3, 10, 2, 2, 6, 3, 17, 2, 8, 3, 1, 3, 32, 4, 12, 8, 8, - 8, 8, 8, 8, 3, 4, 2, 2, 1, 7, 1, 1, 2, 15, 2, 2, 1, 2, 3, 1, 1, 1, 1, 13, 3, 3, 2, 2, 2, 236,2, 2, 2, 2, 2, 4, 2, 173,171,8, 8, - 2, 4, 3, 2, 4, 3, 7, 2, 105,9, 2, 2, 2, 2, 1, 1, 19, 10, 3, 29, 18, 16, 6, 5, 1, 1, 6, 4, 9, 9, 5, 26, 1, 1, 1, 7, 5, 4, 3, 1, 2, - 2, 11, 8, 7, 5, 3, 1, 46, 20, 9, 7, 4, 2, 2, 2, 2, 2, 3, 6, 2, 1, 1, 1, 1, 1, 1, 1, 3, 3, 24, 14, 11, 9, 1, 4, 4, 4, 3, 2, 2, 1, - 6, 6, 2, 1, 1, 1, 1, 1, 1, 3, 3, 3, 2, 1, 137,4, 11, 6, 20, 15, 3, 5, 2, 2, 6, 3, 6, 1, 9, 4, 1, 1, 1, 1, 1, 13, 3, 1, 1, 12, 1, - 3, 1, 1, 7, 2, 1, 1, 1, 25, 3, 14, 14, 3, 2, 2, 4, 2, 1, 1, 5, 1, 2, 2, 2, 1, 1, 1, 2, 1, 1, 1, 4, 3, 1, 37, 1, 1, 2, 2, 1, 1, - 2, 3, 3, 2, 13, 7, 1, 6, 4, 3, 2, 8, 3, 1, 1, 1, 3, 1, 1, 1, 12, 1, 1, 1, 1, 3, 3, 3, 42, 8, 4, 13, 3, 3, 5, 2, 4, 5, 3, 8, 5, - 4, 3, 3, 1, 1, 1, 2, 5, 1, 1, 31, 1, 1, 4, 3, 5, 1, 1, 1, 9, 2, 1, 10, 2, 1, 5, 2, 4, 8, 7, 6, 3, 3, 2, 24, 2, 2, 3, 11, 5, 3, - 2, 1, 6, 20, 3, 2, 2, 4, 3, 5, 2, 1, 3, 73, 4, 8, 2, 3, 3, 3, 3, 2, 2, 17, 5, 4, 7, 19, 1, 12, 12, 3, 2, 2, 7, 1, 5, 5, 5, 5, 5, - 5, 3, 2, 2, 2, 2, 2, 3, 4, 4, 2, 3, 5, 4, 3, 1, 6, 2, 10, 2, 16, 3, 3, 3, 1, 1, 4, 4, 2, 1, 4, 3, 79, 4, 51, 4, 2, 5, 4, 38, 6, - 6, 11, 10, 19, 2, 2, 3, 2, 2, 2, 2, 3, 3, 3, 3, 1, 6, 2, 2, 4, 3, 3, 4, 4, 4, 4, 6, 1, 8, 3, 3, 4, 2, 1, 31, 2, 1, 5, 5, 2, 4, - 4, 3, 1, 1, 4, 3, 8, 4, 4, 1, 1, 1, 50, 7, 1, 11, 1, 1, 4, 4, 4, 13, 3, 4, 5, 4, 4, 3, 9, 2, 2, 2, 9, 2, 1, 35, 2, 30, 8, 16, 11, - 4, 4, 5, 3, 1, 1, 2, 17, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 5, 1, 1, 4, 2, 2, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2, 2, 6, 1, 1, - 1, 3, 2, 1, 2, 2, 1, 2, 5, 3, 5, 3, 1, 1, 1, 1, 1, 1, 9, 2, 2, 1, 3, 2, 2, 6, 2, 17, 1, 6, 9, 3, 2, 1, 16, 3, 6, 2, 2, 2, 22, - 5, 2, 2, 2, 2, 2, 3, 1, 1, 2, 1, 1, 2, 11, 2, 1, 1, 59, 11, 3, 4, 24, 2, 6, 4, 6, 4, 4, 3, 1, 1, 1, 1, 13, 2, 2, 6, 50, 35, 4, 22, - 8, 9, 7, 5, 2, 7, 3, 3, 2, 33, 1, 1, 14, 4, 9, 1, 16, 6, 3, 2, 2, 2, 2, 2, 2, 13, 8, 3, 5, 2, 6, 30, 12, 5, 3, 3, 2, 2, 2, 3, 3, - 3, 4, 3, 170,54, 18, 4, 6, 22, 2, 2, 8, 6, 3, 3, 7, 1, 1, 1, 1, 2, 3, 31, 2, 14, 14, 4, 6, 3, 8, 4, 2, 4, 3, 10, 6, 1, 5, 5, 2, 10, - 1, 2, 2, 2, 21, 1, 1, 5, 5, 2, 7, 3, 3, 14, 12, 2, 4, 3, 2, 121,2, 11, 4, 7, 5, 4, 4, 1, 1, 1, 13, 9, 3, 1, 20, 9, 5, 2, 9, 38, 5, - 5, 4, 10, 3, 1, 2, 2, 2, 1, 6, 6, 7, 2, 1, 1, 2, 2, 2, 2, 5, 3, 12, 9, 3, 3, 3, 9, 1, 1, 2, 2, 2, 2, 159,5, 2, 13, 12, 2, 3, 2, - 4, 3, 1, 7, 3, 3, 3, 3, 15, 2, 2, 1, 1, 1, 3, 3, 2, 4, 4, 2, 25, 13, 1, 1, 4, 2, 1, 15, 9, 5, 2, 22, 9, 4, 4, 4, 3, 4, 9, 8, 4, - 1, 15, 4, 7, 1, 69, 15, 1, 1, 1, 4, 3, 6, 2, 8, 4, 11, 2, 4, 5, 4, 12, 6, 4, 4, 14, 5, 4, 3, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 2, - 1, 1, 1, 2, 1, 1, 1, 35, 1, 1, 3, 1, 6, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 2, 2, 1, 1, 3, 2, 1, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, - 1, 9, 4, 4, 3, 2, 2, 1, 1, 1, 80, 13, 13, 2, 2, 4, 3, 1, 1, 1, 1, 16, 1, 1, 1, 1, 5, 4, 4, 2, 3, 3, 6, 4, 4, 11, 10, 1, 14, 4, 3, - 2, 1, 1, 3, 3, 3, 5, 66, 7, 2, 17, 3, 9, 9, 3, 7, 4, 4, 3, 3, 6, 1, 14, 12, 2, 123,6, 3, 3, 1, 1, 5, 2, 23, 2, 2, 2, 2, 6, 2, 2, - 6, 4, 1, 2, 5, 58, 5, 1, 1, 2, 1, 12, 7, 3, 3, 2, 1, 1, 1, 5, 13, 3, 4, 3, 5, 4, 4, 2, 25, 4, 2, 2, 3, 2, 3, 2, 2, 2, 86, 7, 28, - 2, 2, 1, 2, 2, 3, 3, 1, 1, 1, 6, 3, 2, 2, 31, 20, 19, 18, 4, 1, 1, 2, 2, 2, 1, 9, 4, 28, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 3, - 1, 6, 5, 1, 1, 1, 1, 5, 4, 4, 4, 2, 1, 1, 1, 38, 27, 18, 8, 3, 6, 2, 3, 3, 2, 2, 3, 2, 2, 1, 35, 2, 5, 3, 5, 1, 1, 2, 2, 2, 11, - 3, 7, 5, 4, 1, 2, 34, 6, 2, 2, 2, 12, 3, 3, 3, 3, 3, 3, 3, 8, 3, 3, 30, 2, 5, 2, 2, 1, 15, 9, 9, 9, 8, 5, 3, 2, 1, 1, 1, 14, 10, - 3, 43, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 5, 2, 1, 1, 1, 7, 3, 1, 2, 2, 3, 7, 4, 2, 1, 2, 1, 11, 2, 5, 8, 5, 2, 2, 2, 1, 23, 3, - 2, 4, 3, 2, 40, 3, 2, 2, 2, 2, 4, 2, 4, 3, 3, 3, 2, 2, 3, 6, 4, 4, 1, 5, 2, 1, 1, 20, 8, 2, 2, 162,38, 11, 11, 11, 11, 11, 6, 3, 5, - 5, 2, 6, 5, 3, 2, 2, 2, 54, 3, 22, 22, 2, 13, 7, 4, 12, 5, 1, 1, 1, 1, 1, 1, 7, 5, 6, 4, 41, 3, 5, 5, 1, 18, 2, 7, 2, 5, 6, 17, 3, - 5, 5, 4, 3, 3, 6, 3, 8, 4, 2, 3, 91, 2, 2, 1, 16, 12, 7, 37, 4, 21, 7, 5, 5, 5, 5, 4, 1, 1, 3, 16, 4, 2, 2, 5, 3, 6, 2, 4, 7, 7, - 7, 3, 1, 2, 2, 2, 13, 2, 9, 9, 9, 9, 2, 2, 3, 3, 2, 1, 1, 1, 15, 1, 3, 2, 3, 28, 1, 22, 13, 4, 5, 3, 2, 2, 6, 5, 2, 2, 2, 3, 15, - 8, 2, 4, 37, 9, 8, 1, 1, 1, 6, 11, 10, 5, 5, 3, 3, 2, 1, 5, 5, 5, 2, 2, 2, 2, 2, 37, 3, 3, 7, 6, 3, 3, 6, 2, 2, 6, 1, 1, 1, 9, - 8, 8, 8, 1, 1, 31, 8, 3, 3, 3, 3, 2, 8, 6, 1, 4, 2, 163,22, 19, 19, 8, 49, 7, 7, 7, 7, 7, 26, 5, 9, 5, 4, 2, 2, 1, 10, 6, 4, 13, 10, - 9, 9, 9, 6, 3, 1, 31, 14, 11, 4, 4, 7, 7, 7, 12, 7, 4, 21, 9, 4, 10, 3, 1, 1, 1, 39, 30, 5, 23, 12, 11, 9, 4, 4, 9, 3, 3, 2, 10, 5, 2, - 2, 242,57, 10, 9, 2, 4, 4, 9, 6, 3, 3, 5, 15, 6, 3, 3, 2, 3, 6, 5, 2, 2, 2, 4, 2, 34, 4, 9, 8, 8, 8, 2, 17, 9, 6, 4, 8, 7, 5, 10, - 8, 1, 53, 11, 9, 9, 21, 7, 7, 7, 7, 3, 2, 5, 3, 18, 8, 5, 5, 5, 1, 1, 26, 3, 18, 8, 7, 4, 3, 29, 21, 7, 7, 7, 4, 4, 2, 12, 11, 6, 4, - 4, 4, 2, 1, 1, 2, 1, 27, 5, 5, 3, 2, 2, 2, 1, 20, 8, 2, 4, 4, 11, 7, 3, 5, 3, 3, 3, 3, 2, 7, 6, 4, 1, 1, 1, 20, 2, 2, 2, 1, 1, - 2, 1, 132,8, 2, 3, 3, 61, 6, 6, 9, 6, 8, 8, 8, 7, 7, 13, 11, 7, 7, 7, 5, 15, 11, 1, 1, 1, 1, 3, 5, 4, 4, 4, 4, 2, 9, 3, 4, 2, 2, - 10, 3, 2, 4, 4, 3, 2, 10, 8, 4, 17, 2, 2, 2, 7, 7, 3, 3, 3, 3, 3, 3, 14, 9, 6, 5, 4, 3, 86, 3, 22, 3, 6, 9, 9, 3, 3, 2, 2, 2, 2, - 20, 12, 9, 9, 8, 17, 3, 3, 4, 2, 2, 4, 3, 1, 1, 8, 3, 2, 15, 12, 11, 4, 19, 4, 3, 2, 2, 2, 120,3, 29, 4, 4, 4, 4, 4, 8, 7, 7, 7, 2, - 8, 3, 3, 8, 8, 41, 15, 3, 3, 11, 8, 5, 3, 3, 8, 7, 7, 4, 3, 7, 7, 3, 3, 5, 5, 9, 3, 4, 18, 14, 12, 5, 3, 3, 10, 2, 2, 2, 2, 7, 7, - 7, 3, 10, 3, 3, 7, 4, 48, 8, 4, 3, 2, 3, 3, 4, 3, 3, 3, 3, 2, 29, 7, 7, 6, 6, 6, 6, 2, 19, 9, 9, 8, 6, 5, 5, 3, 9, 7, 2, 2, 12, - 2, 3, 3, 2, 2, 2, 1, 24, 4, 4, 4, 4, 4, 2, 2, 2, 18, 7, 7, 7, 6, 6, 5, 3, 12, 4, 3, 2, 2, 10, 3, 2, 4, 1, 84, 7, 2, 2, 45, 2, 17, + 34, 3, 2, 3, 1, 19, 2, 9, 4, 3, 31, 4, 4, 12, 5, 2, 5, 15, 5, 1, 2, 2, 11, 3, 4, 2, 5, 31, 8, 6, 4, 5, 2, 5, 2, 2, 4, 31, 5, 7, 6, + 5, 4, 27, 4, 2, 3, 2, 2, 3, 6, 1, 2, 3, 11, 2, 1, 2, 22, 8, 7, 3, 1, 1, 2, 2, 1, 1, 3, 1, 35, 3, 1, 3, 2, 8, 5, 3, 4, 3, 5, 2, + 1, 1, 1, 32, 3, 2, 10, 2, 1, 1, 2, 4, 5, 3, 2, 13, 4, 4, 3, 10, 4, 2, 4, 1, 2, 60, 13, 3, 1, 1, 19, 3, 6, 5, 2, 5, 2, 7, 4, 2, 2, + 2, 2, 2, 28, 2, 2, 2, 2, 17, 7, 5, 3, 2, 2, 2, 122,25, 8, 3, 3, 1, 5, 1, 35, 1, 1, 1, 1, 1, 2, 6, 6, 8, 39, 2, 7, 9, 3, 3, 3, 2, + 6, 2, 4, 5, 3, 12, 3, 7, 26, 3, 3, 2, 1, 2, 2, 2, 4, 3, 2, 2, 127,4, 2, 20, 5, 6, 5, 5, 20, 8, 5, 2, 9, 9, 1, 4, 3, 2, 2, 5, 3, + 2, 14, 9, 3, 3, 4, 2, 3, 2, 31, 15, 2, 9, 5, 4, 3, 9, 3, 3, 4, 7, 2, 3, 11, 3, 1, 2, 3, 6, 1, 1, 2, 1, 1, 1, 5, 13, 6, 3, 2, 9, + 4, 38, 15, 15, 13, 11, 8, 3, 4, 5, 3, 2, 2, 2, 2, 21, 5, 3, 2, 4, 2, 2, 1, 1, 1, 3, 35, 4, 17, 8, 3, 3, 7, 3, 1, 21, 14, 2, 2, 2, 11, + 5, 5, 4, 4, 4, 3, 3, 3, 2, 6, 4, 4, 55, 2, 8, 1, 11, 5, 1, 2, 2, 10, 4, 2, 1, 1, 1, 1, 1, 1, 3, 4, 4, 5, 2, 41, 9, 7, 5, 5, 18, + 3, 2, 4, 5, 2, 6, 2, 1, 212,18, 2, 2, 2, 3, 3, 2, 2, 9, 2, 7, 6, 4, 2, 11, 4, 2, 22, 4, 2, 2, 2, 5, 4, 2, 1, 12, 6, 4, 4, 2, 20, + 18, 17, 2, 5, 6, 2, 1, 1, 1, 4, 83, 8, 3, 3, 3, 1, 27, 5, 15, 3, 6, 1, 17, 1, 1, 3, 8, 7, 3, 21, 20, 1, 2, 2, 2, 2, 4, 2, 2, 2, 2, + 2, 2, 2, 2, 4, 2, 4, 4, 99, 3, 3, 8, 4, 1, 11, 3, 2, 2, 2, 2, 2, 1, 1, 7, 7, 1, 1, 2, 1, 1, 1, 1, 1, 11, 7, 2, 2, 3, 2, 3, 28, + 3, 4, 1, 1, 10, 10, 10, 3, 5, 3, 2, 2, 1, 1, 1, 1, 1, 3, 1, 1, 4, 7, 6, 2, 11, 6, 5, 3, 14, 2, 2, 2, 2, 9, 1, 3, 87, 11, 3, 2, 14, + 8, 2, 2, 2, 3, 2, 3, 1, 1, 3, 1, 1, 13, 5, 4, 3, 5, 10, 6, 3, 3, 2, 7, 2, 4, 3, 31, 8, 1, 5, 2, 5, 3, 2, 1, 2, 7, 2, 2, 26, 2, + 2, 2, 2, 5, 5, 5, 7, 5, 4, 3, 1, 1, 2, 2, 11, 1, 1, 1, 1, 1, 2, 1, 10, 5, 5, 3, 3, 2, 29, 25, 2, 2, 1, 7, 1, 2, 4, 3, 10, 2, 3, + 1, 6, 4, 3, 6, 8, 1, 10, 4, 2, 1, 2, 17, 2, 1, 1, 1, 2, 4, 2, 2, 53, 6, 1, 2, 1, 6, 3, 12, 4, 3, 2, 10, 2, 18, 13, 3, 42, 4, 7, 2, + 2, 7, 7, 4, 3, 5, 5, 3, 68, 2, 8, 4, 2, 2, 1, 12, 3, 3, 2, 4, 5, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 5, 2, 2, 2, 6, 3, 2, 1, 2, 4, + 1, 1, 2, 2, 2, 2, 3, 1, 1, 1, 12, 8, 7, 4, 2, 14, 10, 9, 1, 1, 1, 4, 3, 3, 16, 7, 2, 3, 4, 100,3, 5, 3, 5, 2, 3, 2, 16, 5, 5, 1, + 1, 1, 60, 20, 3, 2, 4, 2, 2, 7, 2, 4, 4, 4, 5, 1, 5, 3, 3, 2, 5, 3, 4, 3, 2, 2, 4, 86, 6, 2, 1, 13, 4, 3, 3, 6, 9, 2, 2, 2, 2, + 4, 1, 1, 1, 2, 1, 1, 10, 7, 7, 10, 2, 3, 7, 2, 4, 8, 1, 1, 3, 127,5, 2, 16, 12, 2, 3, 7, 7, 1, 1, 4, 3, 7, 4, 3, 8, 1, 1, 1, 1, + 4, 6, 1, 6, 29, 3, 2, 2, 2, 3, 5, 1, 4, 1, 1, 7, 12, 3, 2, 5, 5, 1, 2, 2, 13, 2, 2, 1, 1, 3, 3, 2, 5, 4, 4, 47, 6, 7, 3, 2, 2, + 7, 1, 8, 8, 5, 2, 6, 1, 5, 72, 19, 3, 11, 8, 7, 4, 3, 10, 2, 5, 3, 3, 1, 1, 1, 1, 6, 2, 7, 5, 3, 3, 14, 5, 5, 2, 2, 59, 3, 1, 1, + 1, 1, 2, 2, 4, 3, 1, 1, 1, 1, 5, 2, 3, 2, 2, 9, 1, 6, 5, 2, 11, 2, 2, 2, 9, 10, 5, 3, 1, 11, 3, 3, 1, 24, 2, 6, 3, 6, 3, 2, 8, + 1, 1, 5, 2, 2, 1, 4, 10, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 12, 2, 4, 1, 3, 18, 6, 4, 6, 1, 4, 4, 2, 1, 1, 42, 3, 2, 2, 13, 7, + 8, 3, 2, 2, 2, 3, 2, 2, 2, 4, 9, 2, 145,34, 3, 3, 1, 7, 3, 5, 2, 3, 2, 1, 1, 1, 28, 4, 1, 2, 2, 2, 1, 2, 4, 3, 5, 2, 2, 2, 2, + 3, 3, 2, 3, 3, 30, 2, 2, 12, 6, 2, 2, 1, 1, 1, 5, 1, 3, 16, 2, 3, 2, 1, 4, 2, 8, 1, 2, 2, 5, 1, 1, 2, 2, 8, 3, 2, 5, 4, 2, 2, + 30, 11, 8, 4, 1, 1, 2, 3, 3, 5, 13, 2, 3, 3, 2, 18, 1, 1, 8, 6, 5, 9, 3, 4, 4, 1, 5, 1, 2, 23, 10, 3, 2, 2, 5, 2, 2, 26, 1, 3, 3, + 3, 2, 2, 3, 2, 2, 4, 2, 16, 10, 3, 3, 3, 3, 1, 1, 1, 2, 1, 1, 2, 40, 6, 8, 10, 2, 3, 4, 2, 2, 62, 2, 15, 3, 2, 10, 7, 6, 3, 2, 17, + 2, 2, 2, 15, 7, 4, 3, 3, 6, 2, 2, 3, 6, 3, 4, 2, 5, 3, 20, 7, 6, 3, 2, 1, 1, 2, 2, 4, 2, 31, 1, 1, 3, 1, 1, 8, 2, 2, 1, 3, 6, + 12, 6, 6, 5, 6, 4, 2, 1, 41, 3, 15, 3, 7, 15, 2, 7, 5, 2, 4, 7, 3, 18, 2, 1, 3, 3, 1, 31, 1, 1, 6, 2, 3, 2, 1, 1, 5, 4, 4, 3, 2, + 3, 3, 2, 2, 2, 6, 4, 3, 4, 3, 20, 5, 5, 5, 2, 2, 2, 2, 2, 1, 1, 1, 1, 5, 1, 1, 1, 2, 2, 8, 7, 6, 3, 3, 17, 6, 5, 3, 2, 5, 10, + 1, 7, 6, 3, 2, 11, 2, 1, 5, 1, 1, 1, 2, 11, 3, 2, 2, 39, 3, 2, 17, 2, 3, 4, 2, 3, 3, 5, 1, 6, 2, 1, 1, 1, 1, 76, 10, 4, 4, 2, 2, + 2, 26, 3, 7, 2, 7, 3, 4, 3, 2, 3, 2, 5, 4, 1, 1, 2, 2, 9, 4, 2, 2, 5, 3, 11, 4, 3, 31, 1, 1, 7, 2, 4, 2, 1, 5, 3, 3, 2, 6, 3, + 3, 1, 1, 30, 4, 3, 18, 13, 2, 5, 2, 2, 1, 1, 14, 5, 1, 1, 1, 1, 1, 5, 5, 103,40, 4, 3, 2, 4, 2, 2, 2, 16, 15, 6, 3, 2, 4, 1, 2, 3, + 14, 2, 3, 5, 4, 17, 3, 6, 4, 2, 1, 1, 1, 8, 3, 7, 1, 1, 3, 3, 31, 7, 5, 12, 4, 5, 2, 5, 14, 3, 1, 1, 2, 2, 3, 1, 1, 2, 78, 7, 3, + 3, 2, 2, 10, 7, 4, 15, 6, 3, 3, 1, 2, 2, 8, 4, 2, 19, 8, 2, 3, 4, 5, 4, 3, 3, 3, 3, 3, 2, 4, 2, 4, 2, 2, 3, 2, 4, 100,8, 3, 3, + 3, 2, 10, 2, 1, 7, 2, 4, 2, 8, 4, 4, 3, 4, 3, 1, 1, 2, 3, 1, 1, 1, 1, 1, 23, 3, 3, 2, 8, 2, 1, 5, 25, 2, 4, 1, 1, 7, 4, 2, 2, + 5, 4, 3, 3, 1, 1, 152,15, 5, 5, 2, 2, 2, 1, 2, 7, 2, 1, 2, 32, 9, 6, 7, 4, 4, 3, 2, 5, 11, 8, 7, 2, 2, 11, 3, 3, 3, 50, 17, 1, 3, + 11, 2, 2, 1, 13, 8, 2, 9, 2, 2, 2, 3, 2, 8, 27, 4, 2, 2, 2, 3, 1, 1, 2, 1, 3, 9, 3, 3, 1, 37, 4, 1, 20, 6, 1, 12, 6, 10, 5, 2, 3, + 10, 7, 3, 3, 3, 3, 2, 2, 5, 2, 2, 2, 1, 31, 3, 1, 3, 8, 5, 2, 2, 3, 4, 3, 15, 4, 1, 1, 2, 6, 3, 3, 2, 1, 1, 1, 1, 4, 1, 2, 1, + 1, 1, 117,1, 1, 77, 3, 2, 2, 1, 12, 8, 6, 6, 4, 3, 1, 1, 1, 3, 3, 5, 4, 3, 4, 4, 2, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 7, 3, 3, 3, + 16, 10, 9, 2, 1, 1, 1, 3, 1, 1, 2, 6, 3, 3, 8, 5, 3, 2, 2, 2, 2, 6, 4, 6, 2, 3, 3, 8, 2, 2, 2, 3, 1, 8, 3, 2, 1, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 11, 1, 1, 1, 1, 2, 2, 4, 53, 3, 5, 4, 13, 3, 2, 2, 2, 1, 1, 1, 1, 3, 2, 2, 15, 10, 3, 1, 4, 4, 3, 2, + 8, 3, 2, 2, 37, 6, 5, 5, 18, 14, 11, 5, 5, 5, 5, 5, 3, 5, 2, 3, 3, 55, 3, 1, 1, 1, 7, 2, 2, 2, 2, 10, 4, 27, 11, 3, 1, 1, 5, 2, 1, + 5, 5, 3, 2, 2, 2, 1, 1, 4, 4, 4, 2, 37, 14, 3, 6, 1, 3, 3, 1, 1, 9, 2, 1, 1, 2, 1, 2, 1, 94, 4, 4, 7, 5, 1, 1, 1, 3, 1, 2, 1, + 2, 3, 22, 3, 7, 3, 2, 3, 4, 15, 4, 1, 3, 3, 2, 28, 3, 1, 1, 1, 5, 3, 3, 2, 5, 1, 1, 2, 2, 6, 1, 2, 1, 1, 1, 1, 1, 2, 2, 8, 5, + 2, 2, 2, 1, 12, 5, 52, 8, 4, 4, 5, 3, 4, 18, 4, 6, 4, 3, 8, 6, 3, 3, 26, 9, 4, 2, 2, 5, 4, 9, 6, 5, 2, 10, 2, 2, 2, 4, 3, 33, 4, + 1, 1, 6, 3, 7, 4, 3, 3, 2, 6, 8, 4, 3, 9, 3, 4, 1, 2, 1, 9, 2, 5, 14, 10, 4, 2, 3, 7, 2, 3, 10, 3, 3, 11, 2, 2, 5, 4, 4, 2, 6, + 2, 2, 14, 3, 3, 2, 2, 2, 3, 2, 20, 4, 9, 4, 3, 5, 3, 4, 8, 4, 3, 2, 8, 3, 12, 3, 4, 2, 3, 16, 8, 4, 3, 3, 188,12, 2, 2, 11, 5, 2, + 3, 2, 2, 7, 4, 3, 2, 1, 1, 1, 9, 2, 3, 1, 10, 5, 3, 3, 3, 1, 1, 5, 2, 114,3, 3, 7, 3, 1, 1, 1, 5, 1, 4, 19, 1, 1, 4, 2, 2, 6, + 32, 4, 4, 11, 10, 2, 5, 3, 6, 4, 2, 10, 3, 3, 21, 4, 3, 2, 7, 2, 4, 3, 15, 3, 4, 4, 1, 1, 1, 3, 1, 1, 91, 7, 12, 4, 3, 3, 7, 21, 2, + 1, 2, 2, 5, 5, 1, 1, 10, 2, 2, 8, 3, 4, 3, 2, 2, 3, 8, 1, 2, 1, 1, 104,2, 1, 1, 1, 1, 1, 1, 5, 4, 4, 4, 3, 2, 5, 2, 2, 2, 2, + 2, 2, 1, 1, 1, 1, 1, 1, 3, 2, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 2, 2, 14, 6, 3, 2, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 2, 2, 2, 1, + 1, 1, 1, 1, 1, 1, 12, 9, 9, 7, 2, 2, 2, 2, 2, 2, 16, 5, 2, 1, 1, 1, 1, 9, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 4, 2, + 2, 6, 3, 1, 1, 1, 1, 1, 1, 2, 3, 2, 1, 1, 11, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2, 2, 1, 1, 9, 3, 2, 2, 1, 1, 1, 3, 1, + 12, 4, 3, 3, 3, 2, 2, 2, 1, 2, 2, 152,4, 1, 12, 9, 2, 3, 3, 1, 1, 1, 39, 2, 2, 3, 7, 4, 2, 2, 3, 7, 3, 4, 2, 2, 2, 6, 1, 1, 1, + 1, 3, 5, 3, 3, 2, 26, 10, 6, 3, 4, 2, 2, 1, 3, 2, 1, 2, 3, 2, 2, 2, 6, 3, 4, 4, 1, 1, 1, 34, 27, 19, 19, 18, 4, 6, 2, 111,6, 1, 1, + 2, 2, 19, 6, 3, 1, 5, 4, 3, 10, 3, 3, 3, 3, 3, 18, 2, 3, 1, 10, 7, 2, 4, 1, 1, 1, 5, 2, 2, 2, 6, 2, 3, 3, 7, 4, 4, 3, 1, 1, 1, + 1, 2, 2, 16, 2, 7, 5, 3, 8, 4, 2, 81, 2, 18, 16, 5, 2, 10, 6, 5, 1, 2, 6, 25, 15, 2, 11, 3, 2, 3, 3, 1, 3, 2, 4, 3, 1, 1, 11, 3, 4, + 3, 2, 2, 1, 1, 3, 17, 3, 3, 3, 1, 2, 6, 3, 3, 29, 1, 1, 1, 1, 2, 8, 4, 2, 2, 1, 4, 4, 1, 15, 14, 2, 5, 5, 3, 2, 1, 5, 3, 1, 1, + 9, 4, 3, 2, 3, 2, 179,5, 171,5, 3, 3, 7, 20, 1, 7, 3, 3, 4, 4, 3, 2, 6, 2, 2, 2, 11, 2, 3, 8, 2, 1, 2, 12, 5, 3, 3, 3, 3, 6, 2, + 9, 2, 3, 3, 18, 8, 5, 5, 3, 6, 3, 2, 4, 3, 2, 3, 3, 22, 6, 4, 2, 2, 3, 3, 3, 2, 2, 6, 3, 3, 5, 2, 2, 2, 9, 2, 2, 2, 3, 21, 14, + 2, 3, 2, 2, 3, 4, 2, 1, 1, 1, 9, 3, 2, 15, 4, 2, 1, 1, 1, 1, 1, 1, 3, 22, 17, 3, 2, 1, 2, 8, 6, 70, 17, 4, 7, 4, 11, 4, 4, 27, 12, + 7, 5, 3, 2, 3, 2, 3, 1, 1, 2, 2, 3, 2, 5, 42, 2, 6, 3, 1, 2, 7, 4, 3, 4, 2, 2, 2, 2, 2, 2, 1, 1, 12, 5, 4, 4, 2, 2, 2, 2, 3, + 17, 2, 2, 2, 3, 3, 3, 2, 7, 3, 10, 3, 1, 1, 1, 2, 1, 1, 1, 6, 19, 10, 5, 3, 3, 1, 1, 101,13, 5, 5, 3, 6, 4, 4, 1, 2, 12, 2, 5, 2, + 10, 3, 3, 1, 1, 1, 1, 3, 15, 6, 3, 2, 2, 4, 2, 2, 1, 1, 1, 1, 1, 16, 1, 13, 5, 4, 4, 4, 2, 3, 1, 3, 4, 4, 89, 5, 4, 3, 1, 1, 3, + 5, 3, 1, 1, 5, 36, 16, 2, 2, 2, 3, 2, 2, 3, 2, 2, 10, 3, 2, 12, 7, 2, 3, 3, 10, 3, 3, 6, 2, 2, 2, 3, 4, 3, 3, 3, 216,3, 29, 3, 23, + 6, 3, 3, 3, 4, 4, 1, 1, 9, 5, 1, 1, 8, 1, 1, 14, 1, 3, 2, 2, 2, 19, 16, 7, 6, 61, 39, 3, 3, 3, 2, 2, 6, 2, 2, 13, 2, 5, 2, 2, 2, + 3, 3, 1, 1, 1, 2, 2, 2, 18, 4, 4, 3, 5, 2, 2, 2, 10, 1, 1, 1, 1, 7, 5, 5, 10, 4, 4, 4, 6, 28, 2, 7, 6, 5, 4, 4, 1, 3, 3, 1, 1, + 1, 1, 1, 1, 1, 201,4, 2, 2, 3, 2, 2, 2, 130,3, 12, 10, 5, 3, 3, 2, 2, 1, 16, 7, 3, 3, 4, 3, 8, 3, 3, 1, 2, 5, 4, 4, 3, 4, 3, 3, + 2, 4, 2, 2, 2, 3, 2, 4, 2, 16, 1, 1, 4, 4, 3, 4, 3, 1, 5, 4, 2, 19, 11, 9, 2, 2, 2, 3, 1, 2, 1, 1, 16, 6, 5, 3, 7, 10, 3, 4, 4, + 3, 2, 11, 4, 34, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 29, 14, 4, 8, 2, 7, 3, 2, 2, 2, 2, 1, 1, 4, 1, 1, 1, 59, 3, 1, 2, 3, 19, 15, 3, 3, + 3, 4, 3, 6, 5, 18, 3, 2, 1, 3, 120,6, 3, 2, 6, 44, 12, 3, 2, 22, 4, 3, 2, 2, 4, 4, 4, 3, 2, 9, 3, 5, 1, 3, 3, 3, 2, 9, 2, 1, 5, + 4, 10, 3, 3, 2, 1, 56, 4, 1, 1, 16, 5, 2, 1, 5, 5, 3, 11, 5, 2, 1, 2, 16, 6, 2, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 1, 90, 6, 7, 2, + 2, 17, 2, 8, 3, 2, 4, 1, 2, 2, 2, 5, 4, 2, 2, 2, 2, 13, 3, 1, 3, 3, 3, 2, 6, 1, 1, 1, 4, 2, 3, 14, 4, 4, 4, 4, 2, 1, 3, 2, 1, + 1, 92, 4, 4, 4, 3, 17, 5, 5, 5, 5, 5, 5, 3, 4, 3, 5, 7, 3, 2, 13, 4, 2, 12, 6, 3, 1, 1, 5, 3, 4, 87, 15, 2, 5, 3, 2, 1, 12, 9, 8, + 4, 4, 12, 3, 2, 2, 2, 16, 2, 5, 3, 2, 2, 4, 1, 2, 4, 5, 8, 4, 67, 11, 5, 5, 5, 2, 14, 2, 3, 6, 11, 8, 3, 1, 5, 1, 8, 3, 2, 2, 2, + 49, 14, 9, 6, 3, 3, 6, 3, 17, 1, 1, 1, 7, 3, 3, 3, 1, 2, 1, 4, 9, 6, 5, 1, 17, 5, 1, 2, 180,12, 2, 5, 27, 7, 2, 3, 1, 2, 4, 23, 3, + 4, 5, 4, 4, 2, 3, 30, 3, 8, 3, 1, 2, 3, 10, 3, 6, 5, 4, 34, 6, 6, 1, 10, 7, 1, 2, 9, 5, 5, 2, 14, 7, 4, 4, 4, 4, 3, 11, 4, 2, 2, + 2, 4, 2, 2, 2, 53, 5, 34, 13, 7, 7, 2, 2, 8, 7, 4, 3, 2, 4, 2, 1, 1, 1, 1, 2, 3, 1, 1, 3, 2, 246,34, 3, 3, 2, 2, 4, 2, 2, 2, 1, + 3, 5, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 3, 29, 3, 3, 1, 6, 2, 1, 4, 1, 1, 1, 2, 3, 3, 2, 2, 2, 36, 2, 2, 3, 2, 2, 3, 2, 5, 5, + 7, 2, 4, 4, 20, 4, 1, 1, 2, 2, 5, 1, 1, 3, 1, 4, 2, 1, 24, 2, 6, 4, 3, 7, 4, 6, 6, 3, 5, 34, 3, 3, 14, 1, 4, 10, 3, 2, 1, 10, 3, + 13, 3, 4, 1, 1, 2, 7, 4, 2, 2, 6, 3, 1, 1, 2, 2, 2, 3, 3, 230,26, 4, 5, 4, 7, 6, 4, 4, 5, 19, 2, 8, 4, 4, 3, 2, 49, 3, 2, 2, 2, + 2, 6, 2, 5, 2, 2, 2, 3, 9, 7, 1, 10, 4, 2, 2, 2, 2, 2, 20, 3, 2, 10, 8, 2, 2, 14, 2, 5, 5, 4, 7, 13, 7, 4, 45, 2, 5, 7, 4, 7, 7, + 6, 4, 8, 2, 2, 2, 2, 7, 2, 5, 4, 4, 6, 1, 1, 1, 1, 1, 1, 1, 4, 2, 2, 13, 3, 3, 10, 9, 2, 5, 4, 1, 1, 1, 34, 19, 3, 4, 1, 1, 8, + 2, 3, 3, 2, 2, 25, 3, 3, 1, 1, 4, 2, 2, 6, 4, 2, 28, 11, 3, 3, 2, 2, 2, 18, 3, 10, 3, 4, 8, 2, 1, 1, 1, 2, 6, 4, 5, 2, 18, 1, 6, + 1, 2, 2, 2, 1, 29, 1, 1, 5, 3, 1, 1, 2, 3, 3, 1, 1, 1, 3, 3, 3, 2, 2, 5, 4, 1, 1, 33, 4, 10, 2, 4, 4, 2, 13, 8, 16, 2, 3, 1, 3, + 3, 7, 2, 1, 9, 1, 5, 3, 3, 135,8, 3, 1, 2, 18, 3, 2, 5, 3, 8, 6, 10, 5, 3, 2, 3, 6, 5, 5, 10, 3, 2, 4, 4, 4, 36, 4, 3, 8, 2, 1, + 1, 2, 4, 2, 5, 3, 21, 5, 3, 3, 9, 6, 3, 111,1, 1, 1, 1, 10, 1, 9, 8, 3, 3, 3, 3, 8, 1, 4, 2, 16, 7, 5, 2, 4, 2, 4, 3, 50, 5, 6, + 1, 1, 1, 1, 1, 9, 2, 2, 2, 4, 9, 8, 3, 15, 2, 7, 4, 2, 2, 2, 2, 1, 1, 1, 2, 2, 214,2, 2, 2, 14, 10, 2, 5, 2, 1, 1, 1, 1, 11, 1, + 1, 2, 2, 1, 2, 4, 2, 2, 2, 14, 1, 1, 1, 10, 2, 3, 1, 1, 3, 2, 2, 1, 35, 3, 7, 4, 11, 3, 2, 3, 2, 2, 1, 2, 2, 4, 1, 1, 1, 4, 1, + 1, 1, 1, 1, 1, 22, 8, 9, 1, 4, 1, 1, 1, 1, 2, 3, 3, 57, 2, 6, 4, 3, 1, 9, 4, 2, 2, 2, 15, 5, 2, 2, 2, 6, 3, 2, 1, 2, 8, 1, 3, + 2, 2, 2, 3, 1, 1, 10, 2, 2, 22, 1, 1, 4, 1, 2, 1, 1, 6, 3, 2, 1, 4, 2, 3, 3, 2, 17, 4, 2, 7, 6, 91, 4, 2, 10, 3, 2, 18, 3, 9, 2, + 4, 4, 3, 3, 4, 24, 2, 9, 6, 5, 3, 4, 2, 4, 4, 5, 1, 2, 25, 7, 4, 1, 1, 4, 3, 3, 78, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 3, 4, + 6, 4, 8, 3, 2, 2, 9, 2, 2, 2, 2, 2, 4, 7, 4, 11, 3, 1, 1, 3, 2, 5, 1, 2, 29, 4, 7, 5, 5, 5, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 1, 1, 1, 1, 3, 3, 3, 1, 5, 3, 11, 3, 2, 52, 3, 2, 2, 2, 10, 7, 2, 1, 25, 14, 1, 1, 4, 3, 2, 2, 2, 52, 4, 4, 2, 6, 3, 6, 3, 5, + 4, 2, 3, 2, 1, 2, 2, 6, 1, 1, 1, 5, 1, 1, 1, 3, 19, 6, 3, 3, 6, 21, 2, 14, 7, 1, 4, 1, 1, 40, 5, 5, 23, 2, 1, 4, 2, 4, 3, 2, 2, + 4, 4, 3, 2, 1, 1, 12, 7, 4, 2, 32, 5, 2, 6, 2, 3, 3, 2, 5, 4, 2, 2, 165,7, 2, 20, 6, 10, 4, 2, 2, 1, 1, 67, 6, 15, 2, 6, 4, 7, 2, + 5, 2, 2, 18, 2, 11, 4, 2, 5, 5, 3, 2, 8, 1, 5, 3, 2, 12, 4, 3, 17, 5, 4, 4, 5, 10, 2, 2, 52, 3, 4, 7, 4, 9, 6, 2, 2, 3, 3, 18, 8, + 2, 5, 2, 2, 24, 2, 2, 2, 2, 1, 1, 9, 2, 2, 2, 32, 6, 5, 1, 2, 2, 2, 13, 2, 2, 1, 4, 2, 2, 2, 2, 2, 1, 1, 1, 28, 5, 16, 2, 2, 2, + 3, 5, 6, 10, 6, 3, 12, 2, 3, 34, 7, 2, 3, 14, 8, 3, 3, 6, 3, 2, 4, 82, 10, 1, 1, 2, 1, 2, 1, 30, 3, 4, 2, 2, 2, 5, 4, 3, 2, 2, 2, + 2, 2, 2, 2, 5, 2, 8, 7, 1, 1, 2, 1, 1, 14, 14, 2, 1, 3, 1, 1, 4, 3, 2, 2, 2, 23, 10, 2, 2, 3, 10, 4, 2, 1, 2, 2, 16, 2, 8, 1, 2, + 27, 3, 9, 2, 6, 11, 2, 1, 4, 2, 8, 2, 2, 1, 40, 6, 5, 4, 2, 3, 3, 19, 3, 3, 7, 6, 3, 1, 1, 2, 1, 1, 2, 1, 1, 4, 13, 4, 3, 1, 1, + 1, 2, 63, 2, 2, 15, 6, 5, 3, 2, 4, 2, 1, 1, 2, 2, 13, 4, 6, 2, 1, 1, 2, 3, 16, 3, 2, 2, 2, 2, 28, 2, 2, 4, 7, 3, 2, 2, 2, 7, 3, + 23, 3, 5, 1, 4, 3, 1, 8, 1, 1, 1, 8, 3, 2, 13, 4, 2, 7, 2, 20, 1, 1, 6, 5, 3, 4, 1, 12, 3, 4, 3, 2, 1, 1, 1, 1, 37, 29, 4, 4, 1, + 6, 4, 2, 29, 1, 24, 7, 3, 5, 56, 2, 14, 1, 6, 3, 2, 1, 1, 1, 4, 2, 30, 22, 2, 2, 2, 6, 1, 1, 3, 2, 32, 9, 2, 6, 7, 54, 14, 7, 3, 1, + 1, 7, 4, 3, 6, 3, 19, 15, 4, 1, 1, 4, 2, 4, 2, 2, 3, 19, 3, 14, 5, 4, 4, 4, 14, 2, 5, 2, 58, 5, 3, 1, 1, 1, 8, 2, 5, 14, 3, 4, 4, + 11, 2, 2, 3, 3, 5, 40, 7, 3, 4, 3, 7, 3, 5, 3, 10, 6, 3, 57, 10, 8, 6, 6, 3, 2, 2, 6, 5, 4, 4, 2, 2, 26, 8, 6, 3, 3, 3, 2, 3, 3, + 7, 5, 3, 2, 1, 1, 48, 45, 3, 6, 5, 5, 6, 2, 2, 2, 2, 1, 1, 1, 2, 2, 8, 3, 1, 4, 2, 4, 2, 47, 3, 2, 7, 3, 2, 32, 9, 3, 2, 4, 4, + 1, 1, 44, 12, 5, 1, 1, 3, 7, 2, 1, 1, 4, 2, 2, 3, 13, 2, 3, 2, 1, 1, 5, 3, 1, 1, 10, 3, 3, 5, 2, 1, 1, 1, 16, 11, 3, 1, 1, 1, 6, + 2, 2, 4, 21, 2, 3, 2, 2, 4, 3, 3, 3, 2, 1, 2, 43, 13, 4, 2, 2, 7, 4, 3, 2, 5, 3, 2, 3, 6, 57, 6, 38, 5, 3, 2, 4, 3, 7, 11, 5, 2, + 1, 1, 1, 1, 2, 10, 3, 2, 3, 2, 29, 4, 2, 4, 8, 2, 3, 21, 2, 1, 1, 1, 16, 14, 10, 2, 22, 5, 5, 2, 2, 3, 3, 3, 5, 2, 62, 2, 2, 2, 5, + 42, 2, 5, 7, 6, 10, 2, 5, 4, 5, 1, 2, 4, 10, 4, 2, 2, 2, 3, 2, 30, 2, 1, 11, 3, 2, 4, 10, 5, 3, 2, 21, 4, 3, 6, 3, 3, 5, 2, 3, 3, + 14, 6, 4, 2, 12, 5, 3, 6, 5, 5, 31, 2, 1, 9, 4, 3, 3, 2, 8, 5, 79, 2, 1, 1, 9, 3, 19, 5, 4, 2, 7, 6, 3, 4, 7, 2, 6, 4, 1, 9, 9, + 1, 2, 2, 3, 33, 6, 3, 9, 1, 1, 1, 2, 1, 6, 5, 4, 1, 15, 4, 4, 2, 2, 3, 2, 4, 3, 2, 45, 13, 11, 3, 4, 10, 3, 2, 1, 1, 4, 1, 1, 2, + 14, 8, 2, 4, 3, 2, 4, 3, 2, 1, 1, 1, 1, 7, 1, 1, 1, 1, 4, 1, 2, 58, 5, 38, 19, 6, 3, 11, 8, 2, 3, 4, 2, 4, 166,5, 2, 3, 2, 2, 16, + 4, 3, 1, 1, 2, 6, 2, 2, 1, 1, 1, 1, 4, 50, 14, 2, 8, 3, 2, 2, 7, 2, 4, 2, 4, 2, 4, 3, 2, 2, 2, 77, 3, 3, 2, 14, 2, 5, 4, 1, 10, + 5, 3, 3, 4, 3, 3, 2, 2, 11, 7, 5, 2, 2, 5, 2, 1, 2, 6, 1, 5, 2, 2, 3, 2, 1, 1, 3, 5, 2, 105,4, 43, 3, 4, 7, 4, 4, 2, 2, 20, 4, + 5, 1, 9, 7, 5, 2, 2, 8, 4, 5, 4, 3, 4, 3, 2, 3, 2, 1, 1, 4, 2, 2, 6, 3, 1, 2, 2, 54, 7, 6, 4, 3, 6, 3, 2, 6, 14, 4, 2, 1, 1, + 1, 1, 7, 1, 1, 5, 2, 5, 2, 48, 42, 10, 7, 6, 10, 4, 3, 2, 6, 9, 4, 3, 51, 9, 2, 2, 3, 16, 8, 6, 4, 5, 2, 2, 6, 2, 2, 1, 2, 14, 1, + 3, 1, 1, 1, 3, 25, 4, 2, 10, 8, 4, 2, 1, 2, 2, 13, 3, 5, 3, 1, 1, 1, 2, 1, 1, 1, 1, 17, 3, 3, 3, 3, 2, 6, 3, 3, 2, 161,10, 2, 1, + 6, 2, 1, 1, 2, 2, 2, 2, 13, 7, 6, 8, 3, 1, 1, 8, 2, 90, 5, 3, 17, 1, 16, 11, 4, 15, 5, 7, 1, 5, 4, 4, 4, 4, 2, 2, 13, 5, 2, 2, 2, + 2, 1, 5, 3, 2, 3, 2, 9, 4, 4, 3, 2, 2, 2, 4, 2, 4, 6, 2, 4, 1, 41, 2, 12, 4, 5, 4, 3, 2, 1, 2, 2, 2, 2, 12, 3, 3, 126,8, 5, 31, + 6, 10, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 5, 4, 2, 1, 1, 1, 2, 18, 6, 2, 1, 4, 4, 15, 3, 15, 4, 7, 4, 2, 1, 16, 4, 2, 7, 3, + 2, 18, 11, 6, 1, 1, 1, 3, 1, 1, 5, 3, 1, 1, 1, 2, 2, 10, 2, 3, 2, 14, 6, 2, 2, 2, 18, 11, 2, 4, 2, 2, 2, 2, 3, 2, 29, 11, 4, 2, 2, + 7, 3, 16, 8, 8, 5, 5, 5, 3, 3, 68, 6, 2, 2, 20, 3, 5, 4, 1, 9, 4, 3, 5, 8, 2, 2, 2, 1, 1, 5, 4, 3, 6, 5, 1, 1, 3, 1, 13, 3, 1, + 40, 3, 10, 9, 6, 2, 2, 2, 2, 6, 4, 2, 6, 3, 2, 1, 27, 5, 2, 9, 3, 7, 5, 4, 9, 4, 3, 2, 44, 8, 13, 8, 4, 3, 2, 2, 6, 2, 1, 5, 5, + 47, 5, 8, 3, 3, 15, 1, 3, 4, 11, 3, 4, 4, 21, 5, 2, 3, 2, 2, 6, 21, 2, 2, 1, 1, 2, 3, 2, 3, 5, 3, 3, 4, 2, 4, 2, 3, 199,7, 3, 1, + 1, 7, 3, 12, 3, 2, 7, 1, 10, 3, 47, 3, 9, 3, 3, 5, 2, 6, 4, 2, 3, 1, 4, 3, 5, 2, 1, 1, 24, 3, 5, 13, 11, 11, 10, 2, 2, 3, 2, 1, 9, + 4, 2, 2, 3, 2, 2, 28, 3, 9, 2, 5, 3, 1, 3, 37, 7, 2, 16, 14, 7, 2, 3, 3, 4, 2, 150,10, 3, 11, 11, 6, 5, 10, 3, 3, 5, 2, 6, 3, 2, 3, + 1, 3, 86, 5, 3, 32, 28, 5, 3, 7, 2, 1, 5, 3, 2, 2, 1, 2, 5, 3, 3, 4, 2, 3, 3, 2, 3, 9, 6, 10, 4, 3, 3, 5, 2, 1, 1, 5, 2, 1, 16, + 4, 4, 1, 1, 1, 38, 3, 3, 26, 5, 1, 8, 3, 5, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 118,10, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 2, + 3, 1, 2, 1, 1, 1, 8, 2, 1, 1, 3, 2, 8, 3, 11, 1, 1, 5, 7, 4, 4, 2, 2, 21, 4, 3, 1, 1, 1, 1, 5, 4, 8, 5, 2, 2, 3, 1, 10, 5, 2, + 2, 3, 4, 4, 4, 3, 3, 3, 3, 3, 1, 3, 2, 1, 5, 3, 3, 2, 1, 5, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 2, 2, 1, 2, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 110,1, 1, 29, 8, 7, 5, 10, 3, 3, 3, 2, 4, 6, 3, 3, 3, 1, 13, + 1, 4, 4, 3, 3, 17, 3, 2, 3, 9, 4, 3, 12, 10, 1, 1, 10, 2, 3, 2, 1, 17, 6, 1, 5, 3, 5, 2, 2, 44, 7, 2, 1, 8, 3, 2, 5, 3, 2, 2, 14, + 5, 6, 4, 1, 1, 4, 1, 1, 4, 69, 1, 7, 1, 4, 2, 12, 3, 5, 15, 3, 1, 1, 1, 7, 1, 1, 1, 6, 2, 2, 2, 4, 6, 5, 1, 3, 1, 1, 6, 4, 4, + 2, 25, 4, 3, 3, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 9, 7, 6, 2, 28, 5, 3, 2, 2, 4, 2, 2, 15, 2, 2, 2, 2, 9, 2, 2, + 1, 1, 3, 1, 1, 1, 19, 2, 6, 1, 1, 1, 4, 2, 3, 2, 1, 22, 6, 4, 3, 1, 4, 2, 2, 5, 2, 3, 2, 46, 2, 2, 6, 5, 2, 2, 8, 1, 2, 9, 6, + 4, 5, 14, 4, 1, 1, 1, 6, 7, 3, 2, 37, 9, 3, 5, 2, 1, 13, 4, 4, 5, 1, 1, 1, 1, 3, 1, 2, 2, 1, 3, 3, 31, 9, 3, 2, 1, 6, 12, 10, 2, + 23, 4, 3, 2, 14, 12, 4, 2, 24, 4, 4, 4, 6, 5, 3, 3, 2, 2, 3, 67, 11, 6, 4, 2, 5, 3, 3, 16, 12, 12, 12, 11, 5, 3, 4, 1, 2, 3, 2, 2, 1, + 9, 4, 2, 4, 3, 1, 1, 4, 3, 3, 96, 21, 1, 3, 3, 4, 18, 4, 4, 34, 3, 2, 7, 4, 4, 4, 4, 1, 5, 4, 2, 2, 2, 2, 2, 1, 1, 1, 6, 4, 8, + 1, 4, 2, 3, 10, 4, 1, 1, 5, 2, 1, 1, 1, 17, 2, 1, 1, 2, 1, 1, 5, 5, 2, 2, 2, 1, 1, 1, 1, 3, 1, 2, 10, 4, 1, 1, 1, 1, 2, 2, 2, + 5, 3, 31, 7, 3, 11, 2, 5, 12, 10, 3, 2, 2, 6, 4, 34, 2, 2, 3, 1, 20, 3, 1, 3, 2, 2, 8, 2, 2, 34, 2, 7, 5, 5, 3, 4, 11, 6, 3, 3, 2, + 3, 1, 3, 2, 51, 18, 3, 3, 4, 1, 1, 1, 1, 1, 25, 8, 14, 8, 3, 3, 2, 1, 1, 25, 13, 9, 3, 5, 12, 6, 4, 2, 1, 1, 8, 2, 2, 2, 2, 2, 2, + 92, 1, 25, 4, 4, 8, 6, 2, 9, 3, 8, 7, 7, 5, 16, 2, 2, 3, 2, 3, 3, 1, 2, 11, 4, 3, 3, 11, 1, 1, 3, 2, 1, 4, 3, 5, 4, 7, 2, 4, 2, + 2, 3, 55, 3, 3, 15, 7, 5, 3, 3, 2, 8, 4, 3, 1, 1, 14, 8, 2, 3, 2, 3, 2, 28, 16, 11, 7, 4, 2, 2, 4, 5, 3, 69, 1, 4, 2, 8, 6, 4, 20, + 12, 7, 4, 1, 13, 11, 2, 2, 6, 14, 3, 29, 6, 7, 3, 3, 3, 3, 3, 8, 4, 1, 2, 2, 19, 5, 4, 2, 2, 58, 14, 3, 3, 2, 3, 2, 2, 11, 4, 4, 12, + 6, 5, 5, 3, 1, 1, 2, 2, 16, 11, 3, 3, 1, 1, 33, 6, 16, 2, 8, 4, 4, 2, 8, 2, 80, 18, 4, 3, 1, 1, 2, 1, 1, 3, 3, 12, 4, 11, 3, 2, 2, + 2, 5, 2, 20, 11, 4, 6, 7, 6, 3, 1, 8, 3, 7, 6, 6, 2, 3, 2, 2, 5, 1, 2, 253,29, 4, 2, 2, 2, 1, 8, 6, 6, 2, 4, 1, 3, 3, 1, 34, 2, + 10, 7, 3, 5, 1, 1, 1, 4, 2, 5, 1, 41, 2, 4, 3, 1, 3, 2, 2, 28, 21, 16, 11, 7, 4, 3, 3, 2, 8, 5, 2, 21, 1, 1, 1, 6, 3, 2, 4, 1, 1, + 3, 2, 2, 32, 6, 2, 2, 12, 9, 7, 2, 3, 4, 4, 3, 3, 25, 4, 1, 19, 9, 2, 2, 3, 1, 1, 1, 3, 15, 1, 1, 2, 5, 2, 3, 3, 29, 10, 10, 9, 11, + 7, 4, 4, 13, 3, 3, 1, 1, 2, 71, 12, 3, 2, 5, 4, 2, 2, 10, 5, 3, 3, 3, 2, 9, 1, 5, 4, 4, 1, 3, 1, 5, 2, 2, 1, 13, 7, 1, 4, 2, 6, + 4, 52, 7, 2, 5, 4, 27, 2, 2, 18, 6, 1, 4, 3, 6, 6, 4, 1, 1, 1, 1, 1, 6, 1, 5, 5, 5, 19, 6, 3, 3, 2, 9, 7, 7, 5, 5, 5, 2, 84, 7, + 2, 2, 16, 4, 5, 2, 2, 33, 3, 3, 3, 2, 13, 8, 7, 9, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 6, 4, 36, 1, 3, 3, 3, + 3, 8, 3, 3, 3, 4, 3, 1, 6, 2, 58, 4, 6, 7, 4, 4, 4, 4, 3, 5, 3, 2, 4, 4, 12, 2, 2, 6, 1, 1, 3, 2, 88, 10, 13, 2, 21, 7, 3, 6, 4, + 21, 8, 4, 11, 3, 2, 3, 2, 6, 50, 8, 3, 2, 2, 22, 12, 6, 4, 5, 12, 6, 3, 2, 2, 7, 59, 16, 2, 3, 4, 3, 13, 2, 2, 19, 2, 9, 3, 6, 6, 2, + 5, 1, 61, 35, 4, 14, 13, 4, 4, 4, 4, 1, 1, 3, 7, 4, 4, 3, 1, 1, 36, 6, 19, 2, 2, 9, 7, 2, 5, 6, 4, 1, 1, 3, 2, 2, 2, 119,26, 2, 6, + 3, 27, 7, 4, 5, 39, 5, 5, 4, 3, 2, 1, 1, 1, 8, 4, 3, 3, 3, 1, 3, 2, 18, 3, 2, 4, 2, 2, 5, 2, 2, 2, 3, 18, 2, 2, 3, 1, 1, 1, 6, + 2, 3, 3, 79, 6, 3, 2, 18, 3, 8, 3, 11, 3, 3, 2, 4, 2, 6, 3, 3, 3, 3, 9, 5, 4, 14, 4, 7, 7, 4, 3, 4, 3, 3, 2, 8, 2, 19, 5, 3, 9, + 5, 5, 6, 46, 4, 3, 3, 3, 2, 6, 2, 2, 2, 8, 3, 2, 3, 2, 5, 2, 8, 4, 1, 1, 3, 2, 4, 2, 14, 7, 6, 5, 3, 1, 1, 31, 4, 2, 2, 6, 4, + 3, 2, 9, 31, 2, 1, 1, 8, 6, 6, 3, 2, 25, 2, 5, 4, 3, 3, 6, 6, 3, 3, 5, 2, 19, 6, 5, 11, 10, 4, 86, 27, 5, 6, 3, 6, 3, 3, 22, 1, 8, + 2, 4, 4, 25, 3, 3, 4, 6, 3, 3, 2, 5, 3, 1, 1, 135,18, 4, 4, 9, 2, 4, 42, 30, 23, 12, 8, 4, 3, 2, 1, 4, 2, 4, 25, 4, 3, 3, 15, 11, 2, + 4, 4, 16, 15, 2, 1, 2, 2, 1, 1, 9, 3, 2, 4, 22, 5, 4, 4, 3, 8, 1, 1, 1, 3, 2, 1, 1, 2, 11, 7, 5, 1, 3, 79, 1, 1, 6, 2, 2, 2, 2, + 2, 2, 41, 9, 7, 1, 5, 5, 10, 8, 11, 6, 4, 3, 3, 1, 10, 1, 3, 3, 2, 4, 3, 3, 4, 4, 4, 4, 4, 4, 2, 2, 2, 3, 16, 16, 3, 3, 3, 3, 2, + 3, 44, 5, 5, 2, 1, 1, 1, 1, 1, 13, 13, 13, 12, 3, 5, 4, 3, 14, 3, 3, 3, 1, 1, 6, 4, 3, 3, 2, 47, 9, 7, 3, 20, 4, 4, 4, 10, 3, 3, 3, + 3, 1, 9, 3, 5, 5, 4, 2, 10, 1, 2, 4, 5, 2, 4, 3, 3, 11, 2, 3, 9, 1, 1, 5, 9, 1, 2, 1, 24, 6, 1, 3, 2, 1, 5, 4, 5, 4, 3, 3, 3, + 2, 73, 1, 8, 4, 3, 2, 10, 3, 2, 2, 8, 8, 10, 3, 1, 1, 2, 16, 6, 3, 6, 15, 2, 2, 4, 2, 8, 7, 5, 87, 38, 2, 2, 24, 3, 3, 2, 5, 5, 5, + 7, 3, 2, 3, 3, 5, 3, 2, 1, 1, 1, 27, 3, 6, 2, 7, 3, 16, 2, 4, 5, 2, 2, 10, 1, 2, 4, 4, 3, 2, 25, 3, 1, 7, 3, 2, 2, 15, 4, 3, 3, + 5, 2, 1, 1, 4, 3, 35, 1, 1, 1, 2, 1, 4, 2, 2, 1, 2, 1, 3, 2, 1, 2, 2, 2, 1, 1, 13, 5, 5, 5, 3, 4, 2, 2, 2, 1, 1, 1, 1, 17, 6, + 4, 3, 2, 1, 1, 2, 2, 1, 2, 30, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 8, 8, 4, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 16, 2, 1, 4, 9, 6, 1, 1, + 5, 1, 3, 27, 2, 5, 4, 3, 2, 4, 2, 11, 11, 5, 2, 20, 7, 4, 6, 3, 1, 1, 3, 3, 4, 4, 3, 1, 6, 1, 2, 2, 2, 2, 1, 1, 1, 6, 3, 3, 1, + 113,6, 36, 18, 14, 10, 8, 3, 3, 11, 11, 7, 14, 2, 2, 2, 2, 4, 29, 1, 6, 3, 1, 3, 3, 3, 7, 5, 3, 5, 15, 11, 1, 8, 2, 3, 11, 8, 3, 107,3, + 1, 1, 1, 3, 1, 1, 1, 1, 10, 5, 5, 4, 85, 9, 2, 5, 5, 15, 5, 2, 2, 2, 2, 10, 2, 9, 5, 5, 4, 2, 4, 2, 38, 16, 14, 10, 4, 8, 2, 1, 1, + 10, 4, 4, 4, 2, 1, 3, 6, 5, 3, 2, 4, 1, 20, 2, 2, 12, 9, 8, 7, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 156,17, 7, 1, 6, 4, 1, 5, 3, 6, 3, + 3, 27, 8, 2, 2, 2, 5, 3, 1, 3, 3, 1, 1, 1, 5, 5, 5, 4, 1, 1, 1, 1, 6, 1, 1, 3, 1, 13, 3, 2, 3, 5, 4, 1, 18, 4, 3, 5, 3, 4, 23, + 6, 5, 5, 12, 11, 9, 5, 5, 5, 2, 2, 5, 3, 18, 4, 3, 3, 8, 4, 2, 3, 34, 9, 7, 3, 1, 10, 6, 5, 4, 7, 10, 3, 3, 3, 1, 1, 4, 2, 1, 1, + 1, 3, 2, 4, 2, 1, 23, 2, 1, 1, 1, 1, 1, 1, 5, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 2, 5, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 16, 4, 3, 2, 5, 2, 16, 3, 1, 8, 3, 1, 3, 21, 3, 2, 6, 1, 1, 3, 2, 3, 12, + 3, 6, 3, 10, 3, 4, 2, 4, 3, 2, 1, 41, 2, 2, 2, 10, 3, 3, 15, 3, 2, 4, 3, 3, 2, 2, 2, 2, 4, 3, 14, 1, 1, 1, 1, 8, 7, 3, 2, 2, 1, + 2, 2, 2, 2, 63, 5, 1, 1, 5, 2, 2, 1, 1, 1, 3, 5, 3, 6, 2, 2, 7, 16, 2, 9, 9, 7, 2, 2, 2, 5, 5, 2, 78, 25, 13, 13, 6, 3, 7, 4, 2, + 4, 3, 3, 2, 1, 1, 1, 1, 1, 2, 1, 5, 31, 7, 1, 10, 9, 8, 2, 3, 139,4, 18, 13, 6, 5, 4, 4, 3, 2, 30, 3, 3, 11, 8, 1, 1, 1, 1, 2, 2, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 8, 5, 30, 16, 1, 3, 2, 2, 2, 15, 11, 9, 2, 1, 2, 22, 3, 7, 3, 3, 1, 1, 4, 1, 1, 2, 10, 5, 1, 59, 4, 3, + 3, 1, 1, 1, 12, 5, 5, 5, 9, 3, 3, 3, 4, 2, 3, 16, 4, 6, 4, 2, 1, 1, 1, 210,26, 17, 17, 17, 16, 14, 8, 4, 2, 2, 5, 5, 5, 4, 4, 2, 2, + 4, 2, 2, 7, 3, 3, 2, 2, 1, 1, 12, 8, 1, 1, 21, 3, 3, 7, 3, 7, 71, 4, 30, 1, 2, 15, 3, 2, 2, 21, 18, 3, 8, 8, 7, 5, 2, 12, 2, 4, 4, + 7, 2, 4, 3, 1, 1, 6, 2, 2, 17, 8, 7, 3, 4, 2, 2, 2, 1, 4, 3, 2, 1, 43, 10, 4, 4, 9, 1, 1, 4, 2, 12, 3, 3, 6, 52, 2, 1, 11, 6, 6, + 1, 1, 1, 1, 4, 2, 3, 21, 2, 1, 1, 1, 1, 1, 13, 8, 2, 2, 2, 1, 32, 1, 6, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 7, 2, 4, 4, 20, 7, + 3, 3, 5, 2, 5, 3, 2, 2, 5, 1, 29, 6, 3, 14, 4, 7, 1, 1, 1, 2, 2, 1, 34, 4, 27, 7, 4, 4, 3, 2, 4, 62, 2, 6, 15, 3, 5, 5, 5, 19, 15, + 4, 2, 2, 7, 4, 3, 4, 5, 1, 1, 1, 4, 2, 2, 3, 3, 38, 5, 3, 3, 1, 1, 5, 3, 17, 14, 12, 2, 1, 1, 1, 1, 1, 21, 10, 3, 4, 4, 6, 3, 1, + 2, 2, 2, 2, 2, 1, 28, 9, 2, 3, 2, 6, 2, 2, 4, 1, 2, 2, 2, 4, 1, 1, 2, 6, 3, 2, 4, 4, 4, 91, 6, 2, 1, 1, 1, 9, 2, 3, 1, 10, 3, + 1, 2, 19, 3, 5, 1, 7, 1, 1, 5, 5, 15, 2, 6, 6, 4, 6, 6, 4, 2, 2, 5, 4, 63, 2, 1, 2, 6, 5, 4, 15, 3, 3, 24, 2, 2, 16, 13, 3, 3, 10, + 1, 2, 2, 1, 3, 42, 5, 3, 9, 3, 3, 2, 7, 2, 4, 17, 2, 3, 13, 3, 3, 3, 3, 7, 3, 3, 3, 1, 1, 1, 1, 20, 6, 3, 1, 1, 1, 1, 1, 1, 3, + 2, 1, 1, 6, 3, 35, 3, 8, 3, 3, 4, 1, 15, 3, 4, 3, 4, 2, 1, 2, 1, 1, 4, 74, 20, 12, 11, 4, 4, 2, 9, 2, 3, 28, 6, 2, 1, 1, 1, 1, 1, + 15, 13, 1, 1, 1, 1, 10, 1, 1, 4, 1, 1, 1, 2, 29, 16, 5, 5, 5, 4, 3, 2, 6, 1, 1, 6, 3, 3, 3, 6, 71, 5, 4, 3, 22, 2, 1, 4, 3, 2, 7, + 7, 10, 4, 4, 17, 3, 7, 1, 3, 2, 23, 5, 8, 3, 3, 2, 5, 2, 2, 58, 11, 2, 3, 3, 3, 2, 1, 1, 1, 1, 2, 6, 2, 7, 3, 1, 1, 3, 7, 3, 6, + 2, 2, 2, 2, 2, 12, 3, 34, 1, 2, 4, 2, 15, 10, 2, 4, 5, 5, 5, 5, 4, 25, 8, 1, 1, 1, 1, 2, 5, 2, 1, 6, 4, 3, 3, 3, 3, 3, 26, 2, 5, + 2, 1, 4, 3, 3, 27, 2, 4, 4, 3, 1, 1, 12, 3, 1, 1, 1, 2, 4, 2, 2, 3, 10, 7, 4, 3, 2, 2, 1, 3, 2, 23, 2, 1, 2, 2, 18, 5, 13, 6, 3, + 6, 1, 1, 2, 2, 3, 1, 2, 1, 1, 7, 3, 3, 2, 3, 3, 3, 1, 194,4, 2, 18, 3, 7, 5, 5, 5, 5, 1, 1, 1, 1, 11, 1, 1, 2, 4, 1, 1, 3, 3, + 9, 5, 2, 2, 1, 1, 17, 3, 5, 1, 1, 4, 3, 3, 1, 1, 1, 1, 12, 4, 8, 2, 2, 1, 3, 10, 2, 2, 6, 3, 17, 2, 8, 3, 1, 3, 32, 4, 12, 8, 8, + 8, 8, 8, 8, 3, 4, 2, 2, 1, 7, 1, 1, 2, 15, 2, 2, 1, 2, 3, 1, 1, 1, 1, 13, 3, 3, 2, 2, 2, 236,2, 2, 2, 2, 2, 4, 2, 173,171,8, 8, + 2, 4, 3, 2, 4, 3, 7, 2, 105,9, 2, 2, 2, 2, 1, 1, 19, 10, 3, 29, 18, 16, 6, 5, 1, 1, 6, 4, 9, 9, 5, 26, 1, 1, 1, 7, 5, 4, 3, 1, 2, + 2, 11, 8, 7, 5, 3, 1, 46, 20, 9, 7, 4, 2, 2, 2, 2, 2, 3, 6, 2, 1, 1, 1, 1, 1, 1, 1, 3, 3, 24, 14, 11, 9, 1, 4, 4, 4, 3, 2, 2, 1, + 6, 6, 2, 1, 1, 1, 1, 1, 1, 3, 3, 3, 2, 1, 137,4, 11, 6, 20, 15, 3, 5, 2, 2, 6, 3, 6, 1, 9, 4, 1, 1, 1, 1, 1, 13, 3, 1, 1, 12, 1, + 3, 1, 1, 7, 2, 1, 1, 1, 25, 3, 14, 14, 3, 2, 2, 4, 2, 1, 1, 5, 1, 2, 2, 2, 1, 1, 1, 2, 1, 1, 1, 4, 3, 1, 37, 1, 1, 2, 2, 1, 1, + 2, 3, 3, 2, 13, 7, 1, 6, 4, 3, 2, 8, 3, 1, 1, 1, 3, 1, 1, 1, 12, 1, 1, 1, 1, 3, 3, 3, 42, 8, 4, 13, 3, 3, 5, 2, 4, 5, 3, 8, 5, + 4, 3, 3, 1, 1, 1, 2, 5, 1, 1, 31, 1, 1, 4, 3, 5, 1, 1, 1, 9, 2, 1, 10, 2, 1, 5, 2, 4, 8, 7, 6, 3, 3, 2, 24, 2, 2, 3, 11, 5, 3, + 2, 1, 6, 20, 3, 2, 2, 4, 3, 5, 2, 1, 3, 73, 4, 8, 2, 3, 3, 3, 3, 2, 2, 17, 5, 4, 7, 19, 1, 12, 12, 3, 2, 2, 7, 1, 5, 5, 5, 5, 5, + 5, 3, 2, 2, 2, 2, 2, 3, 4, 4, 2, 3, 5, 4, 3, 1, 6, 2, 10, 2, 16, 3, 3, 3, 1, 1, 4, 4, 2, 1, 4, 3, 79, 4, 51, 4, 2, 5, 4, 38, 6, + 6, 11, 10, 19, 2, 2, 3, 2, 2, 2, 2, 3, 3, 3, 3, 1, 6, 2, 2, 4, 3, 3, 4, 4, 4, 4, 6, 1, 8, 3, 3, 4, 2, 1, 31, 2, 1, 5, 5, 2, 4, + 4, 3, 1, 1, 4, 3, 8, 4, 4, 1, 1, 1, 50, 7, 1, 11, 1, 1, 4, 4, 4, 13, 3, 4, 5, 4, 4, 3, 9, 2, 2, 2, 9, 2, 1, 35, 2, 30, 8, 16, 11, + 4, 4, 5, 3, 1, 1, 2, 17, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 5, 1, 1, 4, 2, 2, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2, 2, 6, 1, 1, + 1, 3, 2, 1, 2, 2, 1, 2, 5, 3, 5, 3, 1, 1, 1, 1, 1, 1, 9, 2, 2, 1, 3, 2, 2, 6, 2, 17, 1, 6, 9, 3, 2, 1, 16, 3, 6, 2, 2, 2, 22, + 5, 2, 2, 2, 2, 2, 3, 1, 1, 2, 1, 1, 2, 11, 2, 1, 1, 59, 11, 3, 4, 24, 2, 6, 4, 6, 4, 4, 3, 1, 1, 1, 1, 13, 2, 2, 6, 50, 35, 4, 22, + 8, 9, 7, 5, 2, 7, 3, 3, 2, 33, 1, 1, 14, 4, 9, 1, 16, 6, 3, 2, 2, 2, 2, 2, 2, 13, 8, 3, 5, 2, 6, 30, 12, 5, 3, 3, 2, 2, 2, 3, 3, + 3, 4, 3, 170,54, 18, 4, 6, 22, 2, 2, 8, 6, 3, 3, 7, 1, 1, 1, 1, 2, 3, 31, 2, 14, 14, 4, 6, 3, 8, 4, 2, 4, 3, 10, 6, 1, 5, 5, 2, 10, + 1, 2, 2, 2, 21, 1, 1, 5, 5, 2, 7, 3, 3, 14, 12, 2, 4, 3, 2, 121,2, 11, 4, 7, 5, 4, 4, 1, 1, 1, 13, 9, 3, 1, 20, 9, 5, 2, 9, 38, 5, + 5, 4, 10, 3, 1, 2, 2, 2, 1, 6, 6, 7, 2, 1, 1, 2, 2, 2, 2, 5, 3, 12, 9, 3, 3, 3, 9, 1, 1, 2, 2, 2, 2, 159,5, 2, 13, 12, 2, 3, 2, + 4, 3, 1, 7, 3, 3, 3, 3, 15, 2, 2, 1, 1, 1, 3, 3, 2, 4, 4, 2, 25, 13, 1, 1, 4, 2, 1, 15, 9, 5, 2, 22, 9, 4, 4, 4, 3, 4, 9, 8, 4, + 1, 15, 4, 7, 1, 69, 15, 1, 1, 1, 4, 3, 6, 2, 8, 4, 11, 2, 4, 5, 4, 12, 6, 4, 4, 14, 5, 4, 3, 1, 1, 1, 1, 1, 12, 1, 1, 1, 1, 1, 2, + 1, 1, 1, 2, 1, 1, 1, 35, 1, 1, 3, 1, 6, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 2, 2, 1, 1, 3, 2, 1, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, + 1, 9, 4, 4, 3, 2, 2, 1, 1, 1, 80, 13, 13, 2, 2, 4, 3, 1, 1, 1, 1, 16, 1, 1, 1, 1, 5, 4, 4, 2, 3, 3, 6, 4, 4, 11, 10, 1, 14, 4, 3, + 2, 1, 1, 3, 3, 3, 5, 66, 7, 2, 17, 3, 9, 9, 3, 7, 4, 4, 3, 3, 6, 1, 14, 12, 2, 123,6, 3, 3, 1, 1, 5, 2, 23, 2, 2, 2, 2, 6, 2, 2, + 6, 4, 1, 2, 5, 58, 5, 1, 1, 2, 1, 12, 7, 3, 3, 2, 1, 1, 1, 5, 13, 3, 4, 3, 5, 4, 4, 2, 25, 4, 2, 2, 3, 2, 3, 2, 2, 2, 86, 7, 28, + 2, 2, 1, 2, 2, 3, 3, 1, 1, 1, 6, 3, 2, 2, 31, 20, 19, 18, 4, 1, 1, 2, 2, 2, 1, 9, 4, 28, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 3, + 1, 6, 5, 1, 1, 1, 1, 5, 4, 4, 4, 2, 1, 1, 1, 38, 27, 18, 8, 3, 6, 2, 3, 3, 2, 2, 3, 2, 2, 1, 35, 2, 5, 3, 5, 1, 1, 2, 2, 2, 11, + 3, 7, 5, 4, 1, 2, 34, 6, 2, 2, 2, 12, 3, 3, 3, 3, 3, 3, 3, 8, 3, 3, 30, 2, 5, 2, 2, 1, 15, 9, 9, 9, 8, 5, 3, 2, 1, 1, 1, 14, 10, + 3, 43, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 5, 2, 1, 1, 1, 7, 3, 1, 2, 2, 3, 7, 4, 2, 1, 2, 1, 11, 2, 5, 8, 5, 2, 2, 2, 1, 23, 3, + 2, 4, 3, 2, 40, 3, 2, 2, 2, 2, 4, 2, 4, 3, 3, 3, 2, 2, 3, 6, 4, 4, 1, 5, 2, 1, 1, 20, 8, 2, 2, 162,38, 11, 11, 11, 11, 11, 6, 3, 5, + 5, 2, 6, 5, 3, 2, 2, 2, 54, 3, 22, 22, 2, 13, 7, 4, 12, 5, 1, 1, 1, 1, 1, 1, 7, 5, 6, 4, 41, 3, 5, 5, 1, 18, 2, 7, 2, 5, 6, 17, 3, + 5, 5, 4, 3, 3, 6, 3, 8, 4, 2, 3, 91, 2, 2, 1, 16, 12, 7, 37, 4, 21, 7, 5, 5, 5, 5, 4, 1, 1, 3, 16, 4, 2, 2, 5, 3, 6, 2, 4, 7, 7, + 7, 3, 1, 2, 2, 2, 13, 2, 9, 9, 9, 9, 2, 2, 3, 3, 2, 1, 1, 1, 15, 1, 3, 2, 3, 28, 1, 22, 13, 4, 5, 3, 2, 2, 6, 5, 2, 2, 2, 3, 15, + 8, 2, 4, 37, 9, 8, 1, 1, 1, 6, 11, 10, 5, 5, 3, 3, 2, 1, 5, 5, 5, 2, 2, 2, 2, 2, 37, 3, 3, 7, 6, 3, 3, 6, 2, 2, 6, 1, 1, 1, 9, + 8, 8, 8, 1, 1, 31, 8, 3, 3, 3, 3, 2, 8, 6, 1, 4, 2, 163,22, 19, 19, 8, 49, 7, 7, 7, 7, 7, 26, 5, 9, 5, 4, 2, 2, 1, 10, 6, 4, 13, 10, + 9, 9, 9, 6, 3, 1, 31, 14, 11, 4, 4, 7, 7, 7, 12, 7, 4, 21, 9, 4, 10, 3, 1, 1, 1, 39, 30, 5, 23, 12, 11, 9, 4, 4, 9, 3, 3, 2, 10, 5, 2, + 2, 242,57, 10, 9, 2, 4, 4, 9, 6, 3, 3, 5, 15, 6, 3, 3, 2, 3, 6, 5, 2, 2, 2, 4, 2, 34, 4, 9, 8, 8, 8, 2, 17, 9, 6, 4, 8, 7, 5, 10, + 8, 1, 53, 11, 9, 9, 21, 7, 7, 7, 7, 3, 2, 5, 3, 18, 8, 5, 5, 5, 1, 1, 26, 3, 18, 8, 7, 4, 3, 29, 21, 7, 7, 7, 4, 4, 2, 12, 11, 6, 4, + 4, 4, 2, 1, 1, 2, 1, 27, 5, 5, 3, 2, 2, 2, 1, 20, 8, 2, 4, 4, 11, 7, 3, 5, 3, 3, 3, 3, 2, 7, 6, 4, 1, 1, 1, 20, 2, 2, 2, 1, 1, + 2, 1, 132,8, 2, 3, 3, 61, 6, 6, 9, 6, 8, 8, 8, 7, 7, 13, 11, 7, 7, 7, 5, 15, 11, 1, 1, 1, 1, 3, 5, 4, 4, 4, 4, 2, 9, 3, 4, 2, 2, + 10, 3, 2, 4, 4, 3, 2, 10, 8, 4, 17, 2, 2, 2, 7, 7, 3, 3, 3, 3, 3, 3, 14, 9, 6, 5, 4, 3, 86, 3, 22, 3, 6, 9, 9, 3, 3, 2, 2, 2, 2, + 20, 12, 9, 9, 8, 17, 3, 3, 4, 2, 2, 4, 3, 1, 1, 8, 3, 2, 15, 12, 11, 4, 19, 4, 3, 2, 2, 2, 120,3, 29, 4, 4, 4, 4, 4, 8, 7, 7, 7, 2, + 8, 3, 3, 8, 8, 41, 15, 3, 3, 11, 8, 5, 3, 3, 8, 7, 7, 4, 3, 7, 7, 3, 3, 5, 5, 9, 3, 4, 18, 14, 12, 5, 3, 3, 10, 2, 2, 2, 2, 7, 7, + 7, 3, 10, 3, 3, 7, 4, 48, 8, 4, 3, 2, 3, 3, 4, 3, 3, 3, 3, 2, 29, 7, 7, 6, 6, 6, 6, 2, 19, 9, 9, 8, 6, 5, 5, 3, 9, 7, 2, 2, 12, + 2, 3, 3, 2, 2, 2, 1, 24, 4, 4, 4, 4, 4, 2, 2, 2, 18, 7, 7, 7, 6, 6, 5, 3, 12, 4, 3, 2, 2, 10, 3, 2, 4, 1, 84, 7, 2, 2, 45, 2, 17, 17, 3, 8, 3, 6, 4, 9, 12, 4, 3, 2, 15, 2, 2, 2, 2, 3, 5, 3, 11, 1, 1, 1, 1, 1, 4, 3, 12, 12, 8, 6, 4, 4, 4, 4, 3, 14, 9, 6, 4, 237, - 3, 1, 1, 1, 1, 12, 8, 5, 5, 3, 3, 3, 4, 4, 4, 4, 45, 8, 6, 6, 6, 2, 2, 8, 3, 5, 2, 6, 6, 6, 6, 4, 20, 19, 15, 14, 7, 3, 7, 6, 3, - 23, 10, 9, 9, 5, 5, 3, 3, 8, 8, 4, 3, 27, 17, 2, 9, 2, 4, 4, 4, 6, 6, 4, 13, 2, 2, 2, 11, 2, 2, 9, 5, 3, 3, 76, 26, 3, 23, 4, 15, 10, - 8, 3, 3, 2, 1, 20, 17, 17, 4, 4, 12, 9, 7, 7, 5, 5, 3, 26, 6, 6, 6, 4, 4, 4, 16, 15, 14, 9, 4, 36, 3, 19, 3, 13, 8, 14, 7, 4, 205,24, 5, - 5, 2, 2, 2, 8, 8, 6, 6, 6, 6, 47, 16, 16, 6, 6, 7, 7, 7, 4, 4, 3, 3, 14, 8, 2, 8, 4, 3, 31, 2, 28, 6, 6, 4, 4, 16, 6, 10, 1, 1, 3, - 2, 1, 90, 50, 3, 3, 2, 2, 15, 3, 3, 3, 3, 12, 5, 7, 7, 7, 7, 3, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 4, 2, 7, 5, 4, 1, 1, 3, 3, 10, 6, - 13, 9, 9, 9, 3, 17, 11, 6, 5, 5, 5, 5, 4, 3, 3, 2, 3, 1, 1, 87, 4, 3, 3, 3, 3, 62, 19, 6, 5, 5, 8, 30, 6, 5, 13, 5, 4, 4, 4, 4, 2, - 9, 4, 3, 9, 12, 6, 6, 5, 5, 7, 2, 2, 2, 2, 5, 3, 4, 2, 2, 184,2, 3, 3, 37, 7, 4, 16, 10, 4, 3, 5, 51, 5, 2, 3, 2, 7, 3, 2, 2, 5, - 4, 1, 7, 3, 8, 4, 18, 2, 3, 31, 26, 23, 10, 9, 6, 1, 4, 2, 16, 8, 7, 7, 7, 7, 5, 3, 3, 2, 7, 1, 1, 2, 111,6, 2, 1, 19, 5, 4, 2, 1, - 5, 3, 3, 3, 3, 3, 3, 8, 8, 4, 3, 2, 2, 37, 23, 15, 2, 2, 2, 5, 3, 3, 1, 1, 1, 1, 5, 3, 5, 4, 4, 3, 10, 3, 3, 3, 1, 1, 4, 4, 3, - 22, 3, 7, 3, 2, 3, 24, 9, 5, 3, 6, 2, 5, 2, 54, 8, 14, 3, 3, 10, 3, 3, 3, 11, 5, 3, 1, 17, 1, 1, 4, 2, 4, 3, 29, 4, 2, 12, 5, 5, 3, - 2, 1, 17, 5, 3, 2, 11, 8, 2, 2, 2, 9, 4, 3, 2, 79, 3, 3, 2, 2, 36, 3, 14, 7, 8, 6, 2, 2, 7, 3, 3, 3, 3, 7, 4, 3, 2, 4, 1, 1, 3, - 2, 25, 4, 3, 1, 1, 1, 17, 10, 5, 30, 4, 2, 1, 1, 1, 1, 15, 14, 12, 7, 4, 4, 3, 2, 105,11, 4, 49, 3, 11, 11, 5, 3, 2, 3, 10, 8, 9, 9, 9, - 9, 9, 5, 24, 4, 3, 4, 2, 5, 10, 4, 4, 7, 28, 9, 1, 7, 3, 7, 3, 3, 35, 2, 8, 13, 4, 2, 2, 2, 2, 4, 3, 3, 2, 2, 2, 4, 1, 6, 2, 22, - 3, 10, 7, 5, 7, 2, 3, 3, 6, 2, 2, 2, 3, 139,3, 7, 3, 4, 4, 2, 2, 11, 3, 2, 5, 2, 26, 5, 4, 3, 15, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, - 4, 2, 2, 2, 2, 18, 7, 2, 6, 3, 4, 48, 17, 1, 1, 6, 4, 11, 5, 5, 2, 1, 2, 2, 7, 3, 3, 4, 4, 2, 79, 4, 2, 9, 2, 1, 2, 1, 8, 4, 4, - 3, 3, 3, 3, 3, 3, 4, 2, 2, 4, 2, 34, 6, 4, 4, 8, 2, 4, 4, 9, 7, 3, 1, 1, 1, 1, 6, 5, 3, 3, 2, 1, 1, 1, 15, 6, 5, 8, 2, 2, 26, - 7, 2, 3, 2, 2, 1, 3, 2, 3, 6, 100,14, 2, 11, 11, 3, 3, 2, 11, 11, 11, 73, 3, 47, 42, 6, 3, 3, 3, 3, 2, 2, 2, 2, 2, 3, 1, 2, 2, 2, 2, - 3, 2, 2, 2, 4, 1, 1, 3, 3, 3, 4, 4, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 4, 2, 2, 2, 1, 2, 2, 2, 2, 5, 3, 3, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 2, 1, 2, 2, 2, 2, 2, 2, 4, 9, 7, 3, 22, 6, 3, 12, 8, 79, 4, 3, 3, 6, 3, 2, 2, 5, 2, 2, 11, 8, 40, 3, 10, 1, 1, 3, 3, - 2, 4, 3, 3, 3, 2, 3, 14, 2, 4, 4, 4, 16, 2, 2, 2, 1, 1, 1, 2, 2, 3, 2, 3, 1, 2, 2, 2, 64, 13, 1, 4, 7, 4, 4, 3, 37, 4, 9, 4, 4, - 4, 3, 18, 3, 2, 4, 12, 4, 5, 2, 2, 73, 8, 5, 4, 13, 11, 10, 5, 9, 1, 4, 2, 11, 4, 3, 2, 5, 2, 6, 3, 2, 3, 2, 3, 4, 1, 12, 5, 1, 16, - 2, 1, 1, 1, 4, 17, 3, 2, 1, 6, 2, 14, 2, 2, 1, 1, 3, 3, 1, 1, 1, 1, 1, 2, 12, 1, 4, 28, 1, 1, 21, 2, 5, 4, 2, 3, 11, 3, 4, 13, 2, - 11, 5, 3, 1, 1, 12, 22, 16, 2, 2, 3, 14, 4, 2, 5, 47, 6, 3, 2, 5, 3, 3, 1, 1, 10, 4, 3, 3, 2, 3, 4, 15, 1, 1, 7, 14, 8, 15, 1, 6, 3, - 3, 5, 1, 2, 2, 2, 2, 2, 2, 15, 3, 2, 9, 3, 20, 4, 2, 2, 2, 9, 4, 2, 2, 2, 10, 3, 24, 4, 3, 17, 2, 1, 2, 2, 232,53, 2, 2, 10, 3, 8, - 5, 23, 15, 3, 5, 7, 4, 4, 25, 8, 6, 4, 4, 4, 14, 10, 33, 7, 3, 6, 2, 10, 3, 10, 3, 2, 2, 20, 10, 8, 4, 3, 2, 5, 3, 2, 3, 1, 1, 1, 1, - 5, 8, 3, 2, 2, 2, 2, 34, 7, 6, 6, 4, 2, 4, 8, 9, 3, 10, 3, 4, 8, 2, 2, 4, 9, 4, 3, 2, 3, 1, 1, 1, 213,8, 4, 18, 2, 1, 14, 9, 7, - 2, 4, 5, 4, 2, 3, 24, 5, 14, 13, 9, 9, 6, 8, 3, 2, 2, 2, 12, 8, 75, 5, 2, 5, 3, 3, 2, 1, 1, 12, 3, 9, 1, 1, 1, 30, 5, 3, 5, 10, 4, - 8, 3, 42, 5, 5, 2, 5, 3, 3, 20, 16, 4, 10, 6, 7, 5, 2, 3, 2, 2, 1, 1, 2, 1, 5, 1, 1, 11, 4, 1, 5, 22, 8, 1, 5, 7, 6, 5, 5, 2, 10, - 3, 5, 4, 3, 3, 19, 4, 2, 6, 2, 2, 2, 28, 3, 4, 4, 3, 3, 2, 14, 9, 4, 2, 3, 9, 69, 3, 4, 48, 7, 4, 3, 2, 2, 2, 1, 1, 6, 3, 3, 1, - 4, 2, 2, 3, 4, 2, 6, 3, 12, 3, 19, 5, 5, 3, 2, 4, 6, 1, 2, 40, 2, 10, 1, 3, 2, 2, 2, 5, 10, 2, 2, 1, 4, 2, 3, 3, 3, 144,13, 11, 3, - 6, 4, 3, 7, 3, 10, 7, 2, 14, 2, 1, 1, 9, 7, 4, 35, 11, 8, 5, 2, 4, 8, 4, 2, 7, 9, 6, 6, 2, 3, 1, 3, 25, 6, 5, 7, 1, 1, 6, 3, 2, - 13, 6, 6, 3, 4, 8, 3, 4, 50, 1, 5, 2, 2, 1, 1, 1, 1, 1, 1, 14, 14, 1, 1, 1, 1, 3, 8, 3, 3, 3, 3, 3, 3, 2, 1, 1, 18, 15, 14, 13, 7, - 5, 4, 3, 25, 5, 2, 2, 1, 1, 1, 1, 5, 1, 1, 2, 2, 3, 1, 23, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11, 1, 8, 3, 2, 4, 3, 3, 3, 2, 2, - 2, 4, 1, 1, 1, 1, 1, 1, 2, 14, 5, 5, 4, 1, 1, 1, 1, 1, 1, 46, 9, 2, 2, 7, 4, 6, 14, 3, 4, 5, 2, 36, 3, 1, 1, 9, 2, 2, 5, 4, 1, - 1, 1, 4, 4, 4, 3, 9, 2, 2, 1, 2, 22, 3, 13, 2, 2, 6, 4, 19, 2, 4, 1, 1, 3, 13, 13, 3, 3, 2, 2, 8, 3, 3, 3, 3, 3, 3, 3, 2, 4, 2, - 1, 1, 99, 1, 6, 4, 4, 3, 2, 2, 2, 3, 30, 7, 13, 5, 4, 8, 5, 5, 5, 5, 4, 3, 9, 3, 2, 2, 24, 13, 10, 10, 8, 7, 6, 6, 6, 71, 4, 19, 3, - 9, 8, 4, 3, 1, 1, 2, 6, 5, 3, 2, 10, 2, 2, 7, 5, 2, 2, 2, 2, 2, 1, 9, 1, 3, 2, 3, 3, 43, 4, 4, 3, 1, 1, 4, 2, 4, 1, 13, 11, 2, - 7, 7, 4, 3, 8, 2, 5, 29, 2, 3, 3, 5, 2, 3, 6, 2, 1, 2, 1, 1, 2, 170,16, 3, 1, 10, 4, 11, 3, 3, 3, 5, 9, 3, 22, 9, 3, 5, 5, 2, 19, - 11, 2, 3, 1, 1, 4, 2, 2, 1, 1, 30, 7, 4, 11, 8, 10, 3, 3, 3, 4, 9, 3, 19, 6, 6, 7, 3, 11, 2, 5, 3, 1, 1, 3, 64, 5, 2, 17, 3, 7, 3, - 3, 3, 6, 25, 3, 18, 5, 4, 3, 12, 6, 5, 1, 77, 3, 3, 5, 5, 2, 7, 5, 2, 2, 2, 9, 4, 6, 2, 2, 6, 7, 3, 2, 7, 2, 2, 2, 15, 1, 5, 2, - 2, 3, 2, 3, 1, 9, 4, 12, 1, 1, 3, 2, 2, 3, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 9, 1, 5, 1, 3, 1, 6, 1, 4, 4, 4, 1, 1, 3, 2, - 1, 1, 1, 169,6, 5, 1, 1, 1, 1, 1, 25, 19, 18, 1, 1, 1, 1, 1, 3, 3, 3, 1, 1, 3, 2, 2, 2, 1, 40, 2, 1, 36, 4, 6, 9, 17, 1, 1, 1, 1, - 1, 1, 1, 5, 5, 1, 1, 1, 1, 1, 2, 7, 2, 2, 4, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 3, 3, 7, 4, 2, 1, 14, 5, 5, 3, 3, 16, 2, 2, - 3, 3, 10, 3, 6, 2, 2, 2, 15, 3, 2, 4, 3, 3, 5, 5, 2, 19, 16, 1, 1, 3, 3, 3, 3, 1, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, - 2, 1, 60, 25, 3, 3, 2, 3, 2, 8, 4, 2, 11, 7, 2, 1, 1, 1, 22, 7, 7, 5, 4, 4, 4, 4, 4, 3, 2, 1, 1, 1, 1, 8, 5, 2, 2, 2, 1, 1, 1, - 1, 2, 1, 1, 2, 4, 3, 2, 1, 1, 1, 1, 4, 2, 83, 45, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 3, 2, 2, 4, 2, 7, 2, 1, 2, 1, 5, 1, 1, 1, 13, - 4, 1, 1, 1, 1, 2, 2, 2, 5, 2, 1, 1, 1, 1, 11, 2, 1, 2, 1, 1, 1, 1, 1, 1, 3, 2, 3, 4, 1, 1, 1, 3, 1, 1, 2, 4, 1, 1, 12, 2, 2, - 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 3, 2, 12, 3, 1, 1, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, - 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 25, 3, 5, 1, 4, 1, 1, 4, 3, 3, 1, 30, 2, 6, 2, 4, 3, 1, 4, 3, 2, 1, 43, 1, 1, 4, 22, 2, 3, 13, - 2, 3, 11, 2, 2, 1, 15, 9, 2, 4, 3, 3, 2, 2, 50, 3, 2, 2, 2, 11, 5, 2, 3, 2, 7, 4, 2, 6, 2, 5, 2, 3, 5, 3, 2, 2, 2, 1, 1, 38, 2, - 21, 5, 2, 4, 1, 6, 2, 65, 2, 2, 7, 6, 5, 2, 2, 2, 1, 1, 1, 1, 10, 3, 2, 2, 2, 2, 5, 17, 9, 2, 2, 25, 4, 4, 10, 10, 9, 3, 3, 140,8, - 7, 5, 2, 26, 3, 3, 3, 3, 5, 1, 2, 1, 1, 3, 2, 3, 2, 1, 12, 4, 3, 36, 17, 11, 1, 2, 7, 2, 4, 4, 10, 8, 5, 4, 5, 2, 5, 1, 2, 3, 1, - 2, 3, 6, 5, 2, 1, 1, 3, 117,24, 6, 5, 1, 1, 1, 4, 2, 8, 2, 11, 2, 2, 6, 5, 4, 8, 2, 14, 5, 4, 2, 12, 3, 4, 11, 3, 3, 11, 14, 8, 1, - 1, 3, 2, 4, 3, 6, 4, 4, 2, 7, 2, 2, 25, 2, 16, 1, 1, 1, 1, 1, 1, 1, 2, 1, 18, 4, 3, 5, 15, 3, 3, 4, 18, 11, 3, 7, 63, 40, 39, 3, 4, - 2, 1, 1, 1, 5, 5, 2, 8, 1, 3, 3, 11, 3, 1, 3, 3, 39, 3, 10, 3, 2, 1, 1, 8, 3, 2, 3, 11, 2, 7, 12, 3, 3, 2, 17, 2, 2, 4, 3, 2, 4, - 2, 2, 5, 3, 7, 5, 17, 5, 3, 3, 3, 1, 1, 5, 4, 4, 2, 244,9, 2, 2, 2, 11, 1, 2, 3, 9, 1, 1, 10, 4, 1, 1, 1, 1, 11, 4, 2, 1, 8, 4, - 3, 17, 2, 2, 4, 2, 2, 2, 49, 2, 2, 2, 1, 8, 1, 2, 2, 2, 4, 4, 3, 6, 3, 3, 2, 8, 2, 2, 14, 3, 4, 7, 7, 5, 5, 2, 13, 4, 2, 1, 1, - 7, 2, 24, 4, 6, 7, 4, 7, 20, 3, 7, 2, 2, 2, 3, 3, 6, 2, 1, 6, 5, 3, 8, 6, 4, 2, 5, 2, 58, 4, 4, 4, 3, 25, 5, 1, 1, 5, 4, 4, 3, - 2, 2, 2, 2, 2, 1, 3, 4, 5, 2, 1, 47, 11, 3, 1, 2, 1, 1, 6, 2, 5, 1, 1, 6, 2, 1, 1, 2, 5, 1, 69, 9, 6, 3, 1, 1, 3, 4, 2, 1, 19, - 3, 2, 2, 14, 1, 4, 8, 4, 4, 3, 7, 3, 2, 5, 4, 2, 3, 3, 3, 3, 4, 2, 4, 6, 3, 2, 2, 1, 2, 2, 135,8, 2, 30, 6, 5, 1, 3, 2, 82, 53, - 6, 5, 4, 2, 5, 3, 6, 2, 6, 3, 6, 1, 1, 1, 3, 2, 37, 2, 1, 3, 6, 3, 3, 3, 7, 3, 2, 3, 3, 41, 7, 3, 1, 1, 3, 3, 3, 3, 3, 2, 6, - 3, 3, 5, 3, 3, 3, 3, 11, 5, 4, 22, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 4, 4, 4, 3, 10, 3, 1, 4, 4, 4, 2, 2, 1, 1, 1, 1, 14, 1, 1, 1, - 1, 1, 1, 2, 7, 1, 1, 1, 1, 1, 4, 1, 1, 1, 3, 1, 2, 2, 2, 1, 10, 6, 4, 3, 2, 1, 1, 1, 173,10, 2, 2, 1, 4, 4, 3, 3, 39, 3, 2, 4, - 2, 8, 5, 2, 2, 2, 6, 3, 2, 2, 3, 3, 3, 3, 2, 4, 16, 6, 4, 4, 1, 24, 5, 4, 5, 5, 4, 4, 3, 31, 4, 2, 4, 7, 3, 2, 3, 6, 25, 22, 3, - 2, 1, 2, 4, 3, 4, 2, 2, 158,27, 4, 2, 1, 1, 1, 9, 1, 1, 1, 2, 1, 1, 7, 5, 24, 1, 5, 4, 8, 4, 4, 2, 2, 4, 1, 1, 1, 1, 11, 4, 2, - 2, 2, 2, 7, 5, 2, 20, 3, 3, 6, 3, 29, 6, 4, 2, 7, 4, 6, 5, 5, 21, 3, 3, 4, 10, 4, 4, 4, 2, 254,48, 5, 3, 3, 5, 7, 5, 5, 10, 2, 2, - 2, 2, 2, 2, 2, 1, 3, 2, 4, 36, 2, 6, 2, 3, 6, 6, 5, 4, 10, 6, 4, 4, 4, 6, 6, 6, 11, 6, 2, 1, 2, 2, 30, 8, 5, 2, 6, 5, 4, 4, 4, - 12, 6, 2, 24, 13, 10, 4, 4, 1, 1, 1, 1, 4, 2, 5, 1, 64, 2, 5, 1, 1, 3, 2, 2, 2, 12, 3, 3, 3, 3, 3, 8, 6, 6, 2, 2, 2, 2, 7, 5, 1, - 1, 4, 4, 4, 2, 1, 1, 14, 11, 10, 5, 5, 10, 3, 4, 22, 8, 6, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 4, 3, 3, 3, 45, 2, 8, 3, 2, 2, 2, 13, - 10, 8, 8, 4, 3, 1, 1, 1, 1, 3, 2, 10, 10, 6, 4, 82, 2, 8, 3, 2, 2, 7, 3, 3, 26, 3, 1, 2, 2, 1, 1, 2, 2, 2, 2, 2, 9, 2, 2, 3, 5, - 2, 3, 2, 2, 187,19, 2, 5, 2, 5, 5, 3, 3, 3, 51, 11, 2, 9, 26, 5, 5, 9, 4, 3, 11, 6, 3, 7, 3, 3, 3, 2, 1, 40, 4, 4, 3, 1, 1, 1, 1, + 3, 1, 1, 1, 1, 12, 8, 5, 5, 3, 3, 3, 4, 4, 4, 4, 45, 8, 6, 6, 6, 2, 2, 8, 3, 5, 2, 6, 6, 6, 6, 4, 20, 19, 15, 14, 7, 3, 7, 6, 3, + 23, 10, 9, 9, 5, 5, 3, 3, 8, 8, 4, 3, 27, 17, 2, 9, 2, 4, 4, 4, 6, 6, 4, 13, 2, 2, 2, 11, 2, 2, 9, 5, 3, 3, 76, 26, 3, 23, 4, 15, 10, + 8, 3, 3, 2, 1, 20, 17, 17, 4, 4, 12, 9, 7, 7, 5, 5, 3, 26, 6, 6, 6, 4, 4, 4, 16, 15, 14, 9, 4, 36, 3, 19, 3, 13, 8, 14, 7, 4, 205,24, 5, + 5, 2, 2, 2, 8, 8, 6, 6, 6, 6, 47, 16, 16, 6, 6, 7, 7, 7, 4, 4, 3, 3, 14, 8, 2, 8, 4, 3, 31, 2, 28, 6, 6, 4, 4, 16, 6, 10, 1, 1, 3, + 2, 1, 90, 50, 3, 3, 2, 2, 15, 3, 3, 3, 3, 12, 5, 7, 7, 7, 7, 3, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 4, 2, 7, 5, 4, 1, 1, 3, 3, 10, 6, + 13, 9, 9, 9, 3, 17, 11, 6, 5, 5, 5, 5, 4, 3, 3, 2, 3, 1, 1, 87, 4, 3, 3, 3, 3, 62, 19, 6, 5, 5, 8, 30, 6, 5, 13, 5, 4, 4, 4, 4, 2, + 9, 4, 3, 9, 12, 6, 6, 5, 5, 7, 2, 2, 2, 2, 5, 3, 4, 2, 2, 184,2, 3, 3, 37, 7, 4, 16, 10, 4, 3, 5, 51, 5, 2, 3, 2, 7, 3, 2, 2, 5, + 4, 1, 7, 3, 8, 4, 18, 2, 3, 31, 26, 23, 10, 9, 6, 1, 4, 2, 16, 8, 7, 7, 7, 7, 5, 3, 3, 2, 7, 1, 1, 2, 111,6, 2, 1, 19, 5, 4, 2, 1, + 5, 3, 3, 3, 3, 3, 3, 8, 8, 4, 3, 2, 2, 37, 23, 15, 2, 2, 2, 5, 3, 3, 1, 1, 1, 1, 5, 3, 5, 4, 4, 3, 10, 3, 3, 3, 1, 1, 4, 4, 3, + 22, 3, 7, 3, 2, 3, 24, 9, 5, 3, 6, 2, 5, 2, 54, 8, 14, 3, 3, 10, 3, 3, 3, 11, 5, 3, 1, 17, 1, 1, 4, 2, 4, 3, 29, 4, 2, 12, 5, 5, 3, + 2, 1, 17, 5, 3, 2, 11, 8, 2, 2, 2, 9, 4, 3, 2, 79, 3, 3, 2, 2, 36, 3, 14, 7, 8, 6, 2, 2, 7, 3, 3, 3, 3, 7, 4, 3, 2, 4, 1, 1, 3, + 2, 25, 4, 3, 1, 1, 1, 17, 10, 5, 30, 4, 2, 1, 1, 1, 1, 15, 14, 12, 7, 4, 4, 3, 2, 105,11, 4, 49, 3, 11, 11, 5, 3, 2, 3, 10, 8, 9, 9, 9, + 9, 9, 5, 24, 4, 3, 4, 2, 5, 10, 4, 4, 7, 28, 9, 1, 7, 3, 7, 3, 3, 35, 2, 8, 13, 4, 2, 2, 2, 2, 4, 3, 3, 2, 2, 2, 4, 1, 6, 2, 22, + 3, 10, 7, 5, 7, 2, 3, 3, 6, 2, 2, 2, 3, 139,3, 7, 3, 4, 4, 2, 2, 11, 3, 2, 5, 2, 26, 5, 4, 3, 15, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, + 4, 2, 2, 2, 2, 18, 7, 2, 6, 3, 4, 48, 17, 1, 1, 6, 4, 11, 5, 5, 2, 1, 2, 2, 7, 3, 3, 4, 4, 2, 79, 4, 2, 9, 2, 1, 2, 1, 8, 4, 4, + 3, 3, 3, 3, 3, 3, 4, 2, 2, 4, 2, 34, 6, 4, 4, 8, 2, 4, 4, 9, 7, 3, 1, 1, 1, 1, 6, 5, 3, 3, 2, 1, 1, 1, 15, 6, 5, 8, 2, 2, 26, + 7, 2, 3, 2, 2, 1, 3, 2, 3, 6, 100,14, 2, 11, 11, 3, 3, 2, 11, 11, 11, 73, 3, 47, 42, 6, 3, 3, 3, 3, 2, 2, 2, 2, 2, 3, 1, 2, 2, 2, 2, + 3, 2, 2, 2, 4, 1, 1, 3, 3, 3, 4, 4, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 4, 2, 2, 2, 1, 2, 2, 2, 2, 5, 3, 3, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 1, 2, 2, 2, 2, 2, 2, 4, 9, 7, 3, 22, 6, 3, 12, 8, 79, 4, 3, 3, 6, 3, 2, 2, 5, 2, 2, 11, 8, 40, 3, 10, 1, 1, 3, 3, + 2, 4, 3, 3, 3, 2, 3, 14, 2, 4, 4, 4, 16, 2, 2, 2, 1, 1, 1, 2, 2, 3, 2, 3, 1, 2, 2, 2, 64, 13, 1, 4, 7, 4, 4, 3, 37, 4, 9, 4, 4, + 4, 3, 18, 3, 2, 4, 12, 4, 5, 2, 2, 73, 8, 5, 4, 13, 11, 10, 5, 9, 1, 4, 2, 11, 4, 3, 2, 5, 2, 6, 3, 2, 3, 2, 3, 4, 1, 12, 5, 1, 16, + 2, 1, 1, 1, 4, 17, 3, 2, 1, 6, 2, 14, 2, 2, 1, 1, 3, 3, 1, 1, 1, 1, 1, 2, 12, 1, 4, 28, 1, 1, 21, 2, 5, 4, 2, 3, 11, 3, 4, 13, 2, + 11, 5, 3, 1, 1, 12, 22, 16, 2, 2, 3, 14, 4, 2, 5, 47, 6, 3, 2, 5, 3, 3, 1, 1, 10, 4, 3, 3, 2, 3, 4, 15, 1, 1, 7, 14, 8, 15, 1, 6, 3, + 3, 5, 1, 2, 2, 2, 2, 2, 2, 15, 3, 2, 9, 3, 20, 4, 2, 2, 2, 9, 4, 2, 2, 2, 10, 3, 24, 4, 3, 17, 2, 1, 2, 2, 232,53, 2, 2, 10, 3, 8, + 5, 23, 15, 3, 5, 7, 4, 4, 25, 8, 6, 4, 4, 4, 14, 10, 33, 7, 3, 6, 2, 10, 3, 10, 3, 2, 2, 20, 10, 8, 4, 3, 2, 5, 3, 2, 3, 1, 1, 1, 1, + 5, 8, 3, 2, 2, 2, 2, 34, 7, 6, 6, 4, 2, 4, 8, 9, 3, 10, 3, 4, 8, 2, 2, 4, 9, 4, 3, 2, 3, 1, 1, 1, 213,8, 4, 18, 2, 1, 14, 9, 7, + 2, 4, 5, 4, 2, 3, 24, 5, 14, 13, 9, 9, 6, 8, 3, 2, 2, 2, 12, 8, 75, 5, 2, 5, 3, 3, 2, 1, 1, 12, 3, 9, 1, 1, 1, 30, 5, 3, 5, 10, 4, + 8, 3, 42, 5, 5, 2, 5, 3, 3, 20, 16, 4, 10, 6, 7, 5, 2, 3, 2, 2, 1, 1, 2, 1, 5, 1, 1, 11, 4, 1, 5, 22, 8, 1, 5, 7, 6, 5, 5, 2, 10, + 3, 5, 4, 3, 3, 19, 4, 2, 6, 2, 2, 2, 28, 3, 4, 4, 3, 3, 2, 14, 9, 4, 2, 3, 9, 69, 3, 4, 48, 7, 4, 3, 2, 2, 2, 1, 1, 6, 3, 3, 1, + 4, 2, 2, 3, 4, 2, 6, 3, 12, 3, 19, 5, 5, 3, 2, 4, 6, 1, 2, 40, 2, 10, 1, 3, 2, 2, 2, 5, 10, 2, 2, 1, 4, 2, 3, 3, 3, 144,13, 11, 3, + 6, 4, 3, 7, 3, 10, 7, 2, 14, 2, 1, 1, 9, 7, 4, 35, 11, 8, 5, 2, 4, 8, 4, 2, 7, 9, 6, 6, 2, 3, 1, 3, 25, 6, 5, 7, 1, 1, 6, 3, 2, + 13, 6, 6, 3, 4, 8, 3, 4, 50, 1, 5, 2, 2, 1, 1, 1, 1, 1, 1, 14, 14, 1, 1, 1, 1, 3, 8, 3, 3, 3, 3, 3, 3, 2, 1, 1, 18, 15, 14, 13, 7, + 5, 4, 3, 25, 5, 2, 2, 1, 1, 1, 1, 5, 1, 1, 2, 2, 3, 1, 23, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11, 1, 8, 3, 2, 4, 3, 3, 3, 2, 2, + 2, 4, 1, 1, 1, 1, 1, 1, 2, 14, 5, 5, 4, 1, 1, 1, 1, 1, 1, 46, 9, 2, 2, 7, 4, 6, 14, 3, 4, 5, 2, 36, 3, 1, 1, 9, 2, 2, 5, 4, 1, + 1, 1, 4, 4, 4, 3, 9, 2, 2, 1, 2, 22, 3, 13, 2, 2, 6, 4, 19, 2, 4, 1, 1, 3, 13, 13, 3, 3, 2, 2, 8, 3, 3, 3, 3, 3, 3, 3, 2, 4, 2, + 1, 1, 99, 1, 6, 4, 4, 3, 2, 2, 2, 3, 30, 7, 13, 5, 4, 8, 5, 5, 5, 5, 4, 3, 9, 3, 2, 2, 24, 13, 10, 10, 8, 7, 6, 6, 6, 71, 4, 19, 3, + 9, 8, 4, 3, 1, 1, 2, 6, 5, 3, 2, 10, 2, 2, 7, 5, 2, 2, 2, 2, 2, 1, 9, 1, 3, 2, 3, 3, 43, 4, 4, 3, 1, 1, 4, 2, 4, 1, 13, 11, 2, + 7, 7, 4, 3, 8, 2, 5, 29, 2, 3, 3, 5, 2, 3, 6, 2, 1, 2, 1, 1, 2, 170,16, 3, 1, 10, 4, 11, 3, 3, 3, 5, 9, 3, 22, 9, 3, 5, 5, 2, 19, + 11, 2, 3, 1, 1, 4, 2, 2, 1, 1, 30, 7, 4, 11, 8, 10, 3, 3, 3, 4, 9, 3, 19, 6, 6, 7, 3, 11, 2, 5, 3, 1, 1, 3, 64, 5, 2, 17, 3, 7, 3, + 3, 3, 6, 25, 3, 18, 5, 4, 3, 12, 6, 5, 1, 77, 3, 3, 5, 5, 2, 7, 5, 2, 2, 2, 9, 4, 6, 2, 2, 6, 7, 3, 2, 7, 2, 2, 2, 15, 1, 5, 2, + 2, 3, 2, 3, 1, 9, 4, 12, 1, 1, 3, 2, 2, 3, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 9, 1, 5, 1, 3, 1, 6, 1, 4, 4, 4, 1, 1, 3, 2, + 1, 1, 1, 169,6, 5, 1, 1, 1, 1, 1, 25, 19, 18, 1, 1, 1, 1, 1, 3, 3, 3, 1, 1, 3, 2, 2, 2, 1, 40, 2, 1, 36, 4, 6, 9, 17, 1, 1, 1, 1, + 1, 1, 1, 5, 5, 1, 1, 1, 1, 1, 2, 7, 2, 2, 4, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 7, 3, 3, 3, 7, 4, 2, 1, 14, 5, 5, 3, 3, 16, 2, 2, + 3, 3, 10, 3, 6, 2, 2, 2, 15, 3, 2, 4, 3, 3, 5, 5, 2, 19, 16, 1, 1, 3, 3, 3, 3, 1, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 2, 1, 60, 25, 3, 3, 2, 3, 2, 8, 4, 2, 11, 7, 2, 1, 1, 1, 22, 7, 7, 5, 4, 4, 4, 4, 4, 3, 2, 1, 1, 1, 1, 8, 5, 2, 2, 2, 1, 1, 1, + 1, 2, 1, 1, 2, 4, 3, 2, 1, 1, 1, 1, 4, 2, 83, 45, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 3, 2, 2, 4, 2, 7, 2, 1, 2, 1, 5, 1, 1, 1, 13, + 4, 1, 1, 1, 1, 2, 2, 2, 5, 2, 1, 1, 1, 1, 11, 2, 1, 2, 1, 1, 1, 1, 1, 1, 3, 2, 3, 4, 1, 1, 1, 3, 1, 1, 2, 4, 1, 1, 12, 2, 2, + 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 3, 2, 12, 3, 1, 1, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 25, 3, 5, 1, 4, 1, 1, 4, 3, 3, 1, 30, 2, 6, 2, 4, 3, 1, 4, 3, 2, 1, 43, 1, 1, 4, 22, 2, 3, 13, + 2, 3, 11, 2, 2, 1, 15, 9, 2, 4, 3, 3, 2, 2, 50, 3, 2, 2, 2, 11, 5, 2, 3, 2, 7, 4, 2, 6, 2, 5, 2, 3, 5, 3, 2, 2, 2, 1, 1, 38, 2, + 21, 5, 2, 4, 1, 6, 2, 65, 2, 2, 7, 6, 5, 2, 2, 2, 1, 1, 1, 1, 10, 3, 2, 2, 2, 2, 5, 17, 9, 2, 2, 25, 4, 4, 10, 10, 9, 3, 3, 140,8, + 7, 5, 2, 26, 3, 3, 3, 3, 5, 1, 2, 1, 1, 3, 2, 3, 2, 1, 12, 4, 3, 36, 17, 11, 1, 2, 7, 2, 4, 4, 10, 8, 5, 4, 5, 2, 5, 1, 2, 3, 1, + 2, 3, 6, 5, 2, 1, 1, 3, 117,24, 6, 5, 1, 1, 1, 4, 2, 8, 2, 11, 2, 2, 6, 5, 4, 8, 2, 14, 5, 4, 2, 12, 3, 4, 11, 3, 3, 11, 14, 8, 1, + 1, 3, 2, 4, 3, 6, 4, 4, 2, 7, 2, 2, 25, 2, 16, 1, 1, 1, 1, 1, 1, 1, 2, 1, 18, 4, 3, 5, 15, 3, 3, 4, 18, 11, 3, 7, 63, 40, 39, 3, 4, + 2, 1, 1, 1, 5, 5, 2, 8, 1, 3, 3, 11, 3, 1, 3, 3, 39, 3, 10, 3, 2, 1, 1, 8, 3, 2, 3, 11, 2, 7, 12, 3, 3, 2, 17, 2, 2, 4, 3, 2, 4, + 2, 2, 5, 3, 7, 5, 17, 5, 3, 3, 3, 1, 1, 5, 4, 4, 2, 244,9, 2, 2, 2, 11, 1, 2, 3, 9, 1, 1, 10, 4, 1, 1, 1, 1, 11, 4, 2, 1, 8, 4, + 3, 17, 2, 2, 4, 2, 2, 2, 49, 2, 2, 2, 1, 8, 1, 2, 2, 2, 4, 4, 3, 6, 3, 3, 2, 8, 2, 2, 14, 3, 4, 7, 7, 5, 5, 2, 13, 4, 2, 1, 1, + 7, 2, 24, 4, 6, 7, 4, 7, 20, 3, 7, 2, 2, 2, 3, 3, 6, 2, 1, 6, 5, 3, 8, 6, 4, 2, 5, 2, 58, 4, 4, 4, 3, 25, 5, 1, 1, 5, 4, 4, 3, + 2, 2, 2, 2, 2, 1, 3, 4, 5, 2, 1, 47, 11, 3, 1, 2, 1, 1, 6, 2, 5, 1, 1, 6, 2, 1, 1, 2, 5, 1, 69, 9, 6, 3, 1, 1, 3, 4, 2, 1, 19, + 3, 2, 2, 14, 1, 4, 8, 4, 4, 3, 7, 3, 2, 5, 4, 2, 3, 3, 3, 3, 4, 2, 4, 6, 3, 2, 2, 1, 2, 2, 135,8, 2, 30, 6, 5, 1, 3, 2, 82, 53, + 6, 5, 4, 2, 5, 3, 6, 2, 6, 3, 6, 1, 1, 1, 3, 2, 37, 2, 1, 3, 6, 3, 3, 3, 7, 3, 2, 3, 3, 41, 7, 3, 1, 1, 3, 3, 3, 3, 3, 2, 6, + 3, 3, 5, 3, 3, 3, 3, 11, 5, 4, 22, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 4, 4, 4, 3, 10, 3, 1, 4, 4, 4, 2, 2, 1, 1, 1, 1, 14, 1, 1, 1, + 1, 1, 1, 2, 7, 1, 1, 1, 1, 1, 4, 1, 1, 1, 3, 1, 2, 2, 2, 1, 10, 6, 4, 3, 2, 1, 1, 1, 173,10, 2, 2, 1, 4, 4, 3, 3, 39, 3, 2, 4, + 2, 8, 5, 2, 2, 2, 6, 3, 2, 2, 3, 3, 3, 3, 2, 4, 16, 6, 4, 4, 1, 24, 5, 4, 5, 5, 4, 4, 3, 31, 4, 2, 4, 7, 3, 2, 3, 6, 25, 22, 3, + 2, 1, 2, 4, 3, 4, 2, 2, 158,27, 4, 2, 1, 1, 1, 9, 1, 1, 1, 2, 1, 1, 7, 5, 24, 1, 5, 4, 8, 4, 4, 2, 2, 4, 1, 1, 1, 1, 11, 4, 2, + 2, 2, 2, 7, 5, 2, 20, 3, 3, 6, 3, 29, 6, 4, 2, 7, 4, 6, 5, 5, 21, 3, 3, 4, 10, 4, 4, 4, 2, 254,48, 5, 3, 3, 5, 7, 5, 5, 10, 2, 2, + 2, 2, 2, 2, 2, 1, 3, 2, 4, 36, 2, 6, 2, 3, 6, 6, 5, 4, 10, 6, 4, 4, 4, 6, 6, 6, 11, 6, 2, 1, 2, 2, 30, 8, 5, 2, 6, 5, 4, 4, 4, + 12, 6, 2, 24, 13, 10, 4, 4, 1, 1, 1, 1, 4, 2, 5, 1, 64, 2, 5, 1, 1, 3, 2, 2, 2, 12, 3, 3, 3, 3, 3, 8, 6, 6, 2, 2, 2, 2, 7, 5, 1, + 1, 4, 4, 4, 2, 1, 1, 14, 11, 10, 5, 5, 10, 3, 4, 22, 8, 6, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 4, 3, 3, 3, 45, 2, 8, 3, 2, 2, 2, 13, + 10, 8, 8, 4, 3, 1, 1, 1, 1, 3, 2, 10, 10, 6, 4, 82, 2, 8, 3, 2, 2, 7, 3, 3, 26, 3, 1, 2, 2, 1, 1, 2, 2, 2, 2, 2, 9, 2, 2, 3, 5, + 2, 3, 2, 2, 187,19, 2, 5, 2, 5, 5, 3, 3, 3, 51, 11, 2, 9, 26, 5, 5, 9, 4, 3, 11, 6, 3, 7, 3, 3, 3, 2, 1, 40, 4, 4, 3, 1, 1, 1, 1, 5, 5, 3, 3, 2, 6, 3, 3, 3, 15, 3, 8, 7, 14, 9, 7, 7, 2, 2, 24, 15, 4, 3, 3, 8, 3, 3, 20, 15, 8, 6, 3, 2, 2, 2, 3, 2, 4, 5, 4, 101, - 11, 1, 3, 2, 3, 23, 2, 15, 9, 9, 7, 1, 5, 1, 1, 1, 1, 6, 2, 2, 2, 3, 7, 3, 39, 24, 3, 3, 2, 2, 2, 4, 3, 3, 2, 2, 7, 3, 1, 7, 3, - 4, 2, 37, 10, 1, 2, 4, 1, 1, 1, 3, 5, 3, 1, 3, 2, 4, 4, 4, 3, 3, 1, 1, 1, 58, 4, 2, 3, 5, 3, 1, 1, 5, 2, 2, 6, 2, 1, 1, 2, 3, - 9, 9, 25, 12, 1, 5, 2, 1, 4, 8, 2, 2, 3, 3, 1, 22, 5, 4, 1, 2, 2, 2, 5, 3, 2, 1, 1, 102,1, 8, 1, 2, 2, 2, 2, 4, 2, 1, 1, 8, 2, - 2, 7, 3, 3, 1, 1, 2, 3, 6, 4, 3, 13, 3, 3, 9, 2, 2, 2, 2, 2, 8, 2, 8, 1, 4, 2, 3, 1, 1, 1, 8, 2, 3, 4, 2, 3, 11, 1, 2, 3, 4, - 16, 6, 3, 2, 1, 3, 4, 3, 43, 1, 1, 2, 8, 7, 2, 1, 3, 5, 4, 2, 2, 2, 2, 3, 8, 4, 11, 2, 5, 1, 16, 7, 4, 2, 2, 2, 1, 1, 3, 2, 1, - 4, 2, 2, 76, 11, 11, 10, 8, 8, 3, 11, 6, 4, 4, 5, 5, 5, 5, 6, 4, 11, 6, 3, 3, 3, 4, 3, 9, 8, 8, 8, 2, 52, 1, 2, 23, 3, 1, 1, 1, 3, - 3, 5, 1, 1, 2, 2, 1, 5, 2, 2, 1, 1, 1, 1, 1, 1, 7, 7, 1, 1, 5, 21, 7, 3, 8, 4, 3, 2, 3, 2, 45, 2, 3, 7, 3, 13, 5, 11, 4, 3, 2, - 2, 1, 2, 2, 2, 20, 2, 1, 1, 8, 6, 3, 4, 3, 2, 1, 1, 10, 5, 4, 8, 1, 2, 4, 26, 18, 1, 1, 4, 24, 8, 3, 3, 4, 4, 2, 12, 5, 4, 2, 2, - 1, 60, 2, 1, 1, 4, 2, 6, 30, 4, 7, 6, 3, 3, 5, 2, 6, 4, 11, 3, 2, 3, 1, 3, 3, 52, 4, 4, 1, 1, 4, 6, 1, 5, 2, 15, 1, 5, 3, 14, 13, - 2, 9, 3, 30, 6, 4, 2, 4, 2, 2, 2, 3, 4, 2, 1, 1, 1, 11, 4, 88, 4, 14, 14, 13, 3, 10, 8, 4, 4, 4, 4, 4, 4, 1, 6, 5, 34, 1, 1, 3, 13, - 12, 12, 12, 10, 5, 3, 1, 10, 5, 3, 3, 4, 1, 5, 2, 6, 1, 4, 6, 3, 9, 1, 4, 2, 243,1, 1, 17, 7, 4, 2, 2, 1, 1, 7, 2, 2, 3, 3, 1, 7, - 5, 3, 2, 1, 1, 1, 1, 14, 2, 2, 7, 3, 5, 3, 1, 1, 49, 3, 3, 5, 3, 1, 1, 23, 7, 5, 5, 3, 3, 4, 3, 2, 29, 7, 15, 4, 7, 28, 7, 6, 6, - 6, 6, 2, 5, 4, 2, 2, 1, 15, 5, 3, 25, 4, 4, 8, 4, 4, 1, 4, 3, 2, 3, 3, 3, 2, 6, 6, 3, 14, 2, 2, 1, 2, 1, 2, 4, 2, 2, 2, 182,30, - 2, 13, 12, 1, 3, 3, 3, 3, 3, 1, 4, 3, 25, 3, 3, 3, 14, 13, 4, 6, 5, 3, 1, 1, 1, 1, 1, 2, 14, 3, 2, 3, 15, 10, 3, 7, 37, 4, 1, 2, 2, - 2, 10, 10, 4, 3, 13, 11, 10, 2, 3, 7, 4, 2, 1, 1, 1, 1, 33, 4, 2, 18, 4, 1, 1, 1, 10, 10, 8, 3, 1, 1, 5, 13, 8, 4, 2, 2, 2, 1, 204,19, - 6, 5, 3, 3, 1, 1, 7, 2, 2, 2, 2, 29, 4, 1, 1, 2, 2, 2, 2, 9, 2, 2, 5, 3, 4, 2, 1, 1, 1, 2, 2, 32, 3, 3, 1, 3, 3, 4, 3, 10, 6, - 5, 5, 5, 2, 14, 7, 4, 3, 4, 3, 32, 3, 2, 2, 2, 3, 2, 2, 2, 2, 10, 3, 4, 5, 2, 2, 24, 3, 16, 7, 5, 3, 2, 2, 6, 1, 2, 2, 2, 3, 2, - 3, 30, 4, 2, 3, 12, 8, 4, 1, 1, 4, 1, 1, 3, 3, 2, 39, 2, 11, 11, 8, 3, 3, 1, 1, 1, 1, 14, 6, 4, 3, 3, 1, 2, 9, 9, 5, 5, 4, 3, 2, - 26, 3, 3, 3, 2, 1, 1, 17, 9, 4, 5, 2, 2, 2, 2, 1, 1, 22, 11, 1, 3, 1, 4, 1, 44, 2, 16, 14, 5, 3, 3, 10, 3, 3, 1, 1, 4, 4, 4, 3, 3, - 10, 2, 2, 6, 4, 2, 8, 3, 3, 2, 2, 2, 2, 1, 18, 4, 3, 7, 3, 2, 2, 35, 9, 4, 2, 3, 8, 7, 6, 3, 8, 9, 3, 3, 4, 1, 9, 1, 1, 1, 1, - 7, 1, 3, 1, 1, 1, 11, 4, 4, 46, 6, 5, 5, 5, 5, 5, 3, 3, 2, 2, 18, 14, 2, 16, 8, 7, 7, 7, 7, 2, 3, 1, 1, 1, 149,20, 6, 6, 10, 6, 2, - 53, 12, 12, 6, 3, 32, 6, 5, 16, 14, 14, 6, 4, 3, 4, 5, 4, 8, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 4, 4, 2, 18, 2, 1, 9, 2, 3, 2, 14, 5, 3, - 3, 5, 2, 2, 2, 4, 16, 3, 2, 4, 4, 4, 3, 1, 2, 3, 36, 2, 5, 5, 3, 5, 2, 15, 3, 3, 2, 1, 1, 1, 1, 10, 10, 10, 5, 3, 200,38, 8, 8, 5, - 2, 8, 6, 6, 6, 3, 5, 2, 40, 15, 12, 12, 4, 4, 4, 11, 2, 2, 9, 2, 3, 67, 9, 4, 25, 3, 2, 2, 2, 2, 5, 4, 4, 3, 2, 2, 11, 4, 4, 4, 6, - 2, 47, 1, 6, 8, 2, 4, 13, 5, 6, 6, 3, 51, 15, 3, 3, 1, 1, 1, 1, 1, 2, 6, 2, 14, 4, 1, 1, 1, 1, 4, 4, 3, 3, 2, 3, 9, 8, 5, 4, 2, - 11, 4, 2, 2, 4, 14, 4, 5, 1, 35, 8, 5, 5, 2, 2, 1, 1, 5, 1, 1, 1, 2, 2, 12, 2, 1, 1, 1, 10, 4, 3, 5, 3, 1, 1, 1, 1, 3, 1, 1, 4, - 1, 1, 1, 1, 1, 45, 24, 1, 3, 4, 12, 5, 3, 2, 5, 4, 2, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 7, 2, 3, 3, 1, 148,22, 3, 3, 12, 10, 4, 4, 3, - 6, 1, 2, 3, 3, 3, 3, 4, 3, 1, 15, 1, 1, 8, 8, 8, 3, 3, 3, 19, 8, 6, 6, 5, 5, 27, 7, 1, 1, 6, 4, 1, 1, 1, 3, 3, 1, 1, 1, 16, 16, - 15, 3, 20, 6, 3, 2, 2, 2, 6, 2, 2, 2, 2, 9, 3, 2, 3, 2, 5, 3, 3, 3, 1, 7, 4, 2, 2, 3, 1, 1, 1, 34, 5, 3, 2, 2, 2, 2, 1, 6, 2, - 3, 8, 3, 3, 3, 3, 1, 1, 1, 2, 5, 3, 2, 2, 2, 1, 4, 2, 106,9, 2, 2, 3, 8, 9, 1, 3, 1, 2, 1, 1, 1, 1, 1, 5, 1, 50, 15, 6, 5, 4, - 4, 2, 7, 3, 2, 3, 5, 2, 2, 1, 1, 1, 6, 2, 2, 1, 17, 11, 10, 5, 5, 5, 5, 5, 35, 4, 5, 4, 2, 1, 1, 5, 3, 6, 2, 1, 3, 2, 1, 1, 1, - 117,5, 2, 4, 9, 3, 2, 2, 5, 3, 7, 4, 4, 2, 2, 2, 2, 2, 2, 7, 4, 5, 5, 1, 5, 8, 2, 4, 1, 1, 1, 11, 4, 10, 5, 2, 28, 7, 4, 1, 3, - 2, 1, 6, 2, 1, 55, 2, 4, 38, 23, 2, 2, 1, 1, 1, 1, 1, 18, 15, 14, 11, 9, 9, 5, 4, 3, 2, 2, 6, 6, 4, 2, 1, 4, 3, 3, 3, 99, 4, 2, 11, - 8, 7, 4, 16, 5, 6, 4, 2, 38, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 5, 2, 2, 2, 2, 2, 17, 7, 6, 1, 1, 6, 2, 1, 1, 11, 7, 5, 7, 4, 3, 2, - 2, 2, 2, 2, 4, 2, 8, 6, 1, 114,11, 1, 1, 4, 3, 3, 2, 2, 7, 12, 2, 2, 1, 3, 12, 3, 3, 40, 8, 2, 2, 8, 3, 14, 3, 3, 7, 5, 3, 3, 3, - 2, 2, 3, 3, 8, 2, 144,54, 18, 13, 3, 4, 4, 2, 1, 2, 10, 5, 6, 2, 2, 1, 1, 23, 7, 7, 7, 7, 6, 7, 2, 2, 1, 26, 3, 10, 5, 12, 10, 7, 2, - 3, 8, 3, 14, 2, 5, 2, 2, 1, 1, 1, 1, 1, 6, 2, 3, 2, 2, 127,17, 3, 6, 2, 2, 1, 9, 33, 8, 3, 3, 4, 4, 3, 10, 3, 13, 2, 3, 2, 1, 1, - 10, 7, 2, 4, 1, 1, 14, 1, 1, 1, 1, 1, 1, 1, 3, 3, 2, 2, 5, 2, 1, 1, 1, 2, 1, 1, 46, 4, 1, 1, 4, 2, 1, 3, 13, 3, 3, 3, 4, 4, 2, - 1, 1, 5, 2, 5, 1, 1, 1, 1, 4, 3, 56, 6, 1, 1, 2, 1, 4, 3, 3, 10, 2, 4, 2, 2, 2, 1, 1, 12, 12, 9, 7, 4, 5, 4, 8, 5, 1, 4, 4, 3, - 3, 2, 2, 2, 2, 2, 76, 3, 31, 27, 26, 2, 7, 4, 4, 10, 10, 1, 1, 1, 1, 1, 1, 5, 3, 1, 7, 4, 4, 17, 3, 2, 9, 2, 2, 68, 7, 4, 4, 4, 4, - 4, 4, 4, 3, 3, 1, 1, 7, 7, 7, 7, 6, 3, 3, 3, 1, 1, 1, 1, 4, 18, 18, 6, 6, 7, 7, 7, 7, 5, 5, 7, 5, 1, 9, 5, 3, 3, 3, 3, 2, 2, - 4, 1, 1, 10, 5, 4, 1, 2, 2, 122,7, 3, 6, 5, 5, 9, 4, 4, 10, 10, 9, 6, 6, 2, 8, 2, 2, 6, 6, 51, 2, 1, 3, 3, 16, 1, 1, 4, 10, 2, 8, - 8, 8, 2, 3, 3, 2, 2, 2, 12, 8, 5, 8, 8, 8, 18, 11, 3, 2, 2, 2, 4, 3, 2, 2, 7, 7, 7, 7, 7, 8, 7, 6, 1, 2, 20, 3, 5, 5, 4, 4, 4, - 1, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 6, 1, 3, 3, 3, 3, 13, 4, 3, 3, 3, 1, 1, 9, 5, - 5, 28, 3, 2, 6, 2, 2, 2, 2, 1, 3, 7, 7, 2, 3, 3, 5, 5, 4, 21, 4, 3, 3, 3, 3, 1, 16, 5, 4, 4, 4, 1, 1, 1, 1, 1, 2, 2, 2, 8, 8, - 3, 2, 5, 2, 3, 3, 3, 3, 6, 13, 4, 8, 3, 2, 2, 23, 8, 4, 3, 3, 3, 3, 3, 7, 7, 7, 3, 5, 5, 4, 22, 5, 5, 2, 12, 5, 4, 4, 3, 3, 3, - 3, 3, 3, 3, 74, 16, 9, 5, 4, 1, 1, 6, 6, 6, 20, 3, 10, 9, 3, 7, 7, 2, 2, 2, 13, 11, 6, 5, 2, 2, 2, 12, 11, 3, 2, 2, 6, 6, 2, 2, 2, - 2, 2, 2, 2, 4, 5, 8, 8, 5, 5, 5, 5, 3, 20, 11, 4, 4, 3, 2, 2, 4, 4, 4, 4, 4, 8, 8, 8, 54, 3, 1, 1, 2, 2, 2, 2, 22, 5, 5, 8, 3, - 11, 1, 13, 5, 5, 5, 5, 6, 2, 84, 14, 2, 6, 3, 2, 4, 23, 10, 9, 5, 13, 7, 7, 5, 5, 5, 6, 27, 7, 3, 3, 14, 11, 11, 11, 3, 3, 3, 7, 7, 7, - 4, 1, 44, 5, 5, 2, 1, 1, 1, 4, 5, 2, 2, 16, 2, 1, 2, 4, 3, 3, 4, 4, 3, 110,6, 2, 2, 44, 2, 4, 5, 2, 26, 7, 6, 11, 9, 4, 3, 5, 2, - 6, 5, 2, 45, 8, 7, 19, 8, 2, 1, 1, 13, 8, 4, 4, 8, 2, 5, 5, 2, 2, 2, 12, 6, 4, 4, 4, 1, 1, 1, 11, 3, 6, 3, 38, 2, 1, 2, 6, 2, 2, - 3, 1, 1, 1, 1, 1, 2, 1, 4, 2, 2, 2, 2, 6, 3, 3, 1, 1, 3, 3, 2, 1, 1, 2, 1, 1, 3, 3, 2, 10, 7, 1, 1, 1, 6, 6, 1, 1, 1, 3, 3, - 3, 1, 1, 1, 9, 4, 2, 3, 2, 22, 1, 1, 1, 1, 2, 3, 2, 2, 1, 1, 1, 8, 1, 1, 1, 1, 1, 7, 7, 6, 12, 3, 2, 2, 1, 1, 1, 1, 1, 1, 4, - 2, 2, 2, 2, 1, 1, 2, 6, 65, 11, 4, 3, 9, 4, 9, 3, 3, 3, 4, 21, 4, 4, 3, 4, 2, 3, 2, 2, 2, 68, 1, 3, 4, 2, 2, 25, 9, 3, 18, 12, 11, - 3, 4, 4, 4, 11, 9, 9, 9, 9, 5, 3, 42, 4, 3, 2, 2, 1, 1, 16, 12, 5, 1, 5, 4, 2, 2, 34, 2, 1, 3, 3, 2, 12, 2, 2, 6, 1, 77, 10, 2, 2, - 2, 2, 2, 2, 7, 2, 3, 20, 4, 4, 7, 3, 2, 3, 2, 2, 10, 8, 3, 3, 2, 3, 1, 1, 1, 1, 5, 2, 19, 2, 1, 2, 4, 3, 1, 4, 16, 5, 3, 2, 3, - 2, 2, 14, 3, 2, 1, 1, 114,3, 6, 3, 3, 4, 1, 16, 2, 3, 2, 2, 3, 4, 2, 1, 11, 1, 1, 1, 1, 7, 30, 9, 6, 5, 2, 6, 3, 3, 4, 2, 5, 6, - 2, 4, 11, 11, 9, 8, 132,15, 1, 3, 3, 3, 4, 4, 1, 1, 1, 1, 1, 5, 6, 3, 3, 23, 8, 5, 5, 8, 6, 6, 6, 4, 3, 2, 2, 69, 2, 2, 59, 13, 9, - 3, 3, 10, 4, 22, 10, 3, 3, 5, 2, 4, 3, 2, 2, 6, 2, 1, 209,3, 3, 49, 4, 4, 7, 8, 6, 17, 6, 6, 2, 1, 1, 1, 4, 3, 2, 3, 23, 4, 6, 4, - 13, 1, 3, 2, 13, 5, 10, 6, 1, 1, 4, 5, 3, 2, 32, 8, 2, 2, 2, 2, 1, 1, 14, 8, 5, 4, 2, 16, 1, 5, 4, 16, 1, 3, 2, 1, 1, 1, 72, 3, 10, - 2, 5, 4, 4, 5, 3, 2, 2, 8, 3, 6, 2, 4, 18, 1, 1, 3, 2, 2, 3, 3, 23, 5, 2, 2, 2, 2, 7, 3, 3, 1, 1, 1, 1, 196,13, 2, 8, 3, 3, 4, - 14, 1, 3, 3, 3, 3, 22, 6, 2, 10, 5, 3, 18, 8, 1, 5, 5, 3, 17, 3, 4, 2, 1, 20, 5, 7, 6, 4, 1, 1, 1, 11, 7, 24, 7, 3, 2, 3, 2, 5, 4, - 2, 2, 3, 1, 11, 5, 4, 2, 2, 2, 38, 5, 5, 4, 1, 1, 9, 1, 7, 2, 1, 34, 4, 1, 3, 14, 5, 4, 1, 90, 3, 22, 11, 9, 1, 6, 6, 2, 2, 4, 27, - 4, 15, 3, 2, 5, 4, 4, 2, 3, 3, 4, 6, 4, 3, 3, 2, 16, 2, 11, 2, 1, 1, 1, 3, 1, 105,2, 9, 8, 1, 1, 7, 2, 3, 62, 7, 3, 3, 3, 3, 3, - 8, 6, 5, 6, 1, 3, 3, 3, 1, 2, 9, 4, 3, 2, 7, 1, 2, 3, 6, 2, 9, 2, 1, 1, 2, 2, 1, 1, 1, 10, 2, 2, 1, 12, 6, 3, 1, 242,4, 14, 4, - 6, 3, 13, 10, 4, 94, 3, 6, 2, 68, 59, 5, 9, 6, 3, 5, 3, 3, 3, 3, 2, 6, 2, 4, 3, 3, 4, 2, 11, 10, 14, 7, 2, 2, 18, 14, 11, 10, 4, 3, 5, - 11, 9, 3, 3, 7, 5, 5, 1, 7, 3, 3, 21, 4, 3, 3, 4, 3, 3, 5, 145,44, 9, 2, 2, 33, 3, 6, 2, 2, 3, 2, 3, 3, 3, 2, 2, 2, 3, 6, 4, 4, - 4, 4, 10, 1, 1, 1, 3, 2, 2, 10, 5, 3, 2, 22, 2, 14, 6, 2, 2, 2, 16, 6, 3, 5, 1, 2, 1, 91, 3, 3, 11, 2, 6, 2, 8, 7, 4, 4, 8, 8, 2, - 18, 13, 3, 2, 7, 4, 8, 3, 18, 15, 1, 5, 2, 2, 5, 4, 1, 1, 1, 1, 108,1, 1, 2, 4, 2, 2, 5, 5, 3, 2, 3, 2, 5, 2, 1, 13, 6, 8, 17, 5, - 9, 1, 1, 3, 6, 2, 5, 9, 3, 2, 1, 7, 5, 2, 1, 1, 1, 90, 2, 6, 4, 1, 3, 12, 4, 3, 2, 1, 1, 4, 2, 33, 1, 1, 1, 2, 1, 3, 3, 2, 2, - 11, 6, 3, 3, 6, 9, 8, 4, 5, 2, 2, 20, 3, 2, 2, 2, 3, 1, 1, 2, 2, 2, 11, 1, 1, 1, 1, 1, 1, 2, 1, 15, 1, 1, 5, 1, 1, 3, 2, 2, 1, - 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 15, 10, 1, 1, 4, 2, 73, 9, 2, 8, 3, 2, 10, 3, 12, 2, 4, 2, 9, 2, 8, 4, 3, 3, 3, 84, 14, 7, 4, - 3, 23, 6, 1, 1, 1, 9, 2, 6, 3, 3, 3, 1, 1, 1, 26, 1, 4, 3, 3, 4, 2, 3, 1, 8, 3, 46, 6, 3, 4, 20, 6, 2, 3, 1, 1, 1, 2, 4, 4, 4, - 4, 41, 7, 3, 9, 8, 3, 6, 1, 2, 2, 2, 4, 37, 2, 2, 22, 7, 4, 3, 4, 32, 8, 5, 2, 5, 5, 10, 5, 9, 3, 2, 37, 6, 1, 25, 2, 2, 2, 2, 2, - 4, 2, 1, 1, 3, 2, 44, 9, 5, 3, 1, 1, 4, 3, 12, 7, 2, 2, 75, 11, 2, 1, 15, 5, 3, 2, 1, 2, 2, 2, 6, 2, 2, 2, 2, 2, 3, 2, 2, 2, 11, - 3, 2, 3, 5, 3, 15, 4, 2, 4, 162,12, 2, 1, 4, 2, 2, 1, 13, 6, 5, 3, 2, 11, 2, 4, 2, 2, 7, 2, 3, 2, 1, 10, 3, 2, 1, 5, 3, 4, 22, 10, - 3, 2, 4, 4, 3, 5, 4, 6, 2, 2, 2, 4, 20, 6, 2, 4, 5, 2, 1, 1, 4, 2, 18, 2, 3, 5, 2, 6, 2, 5, 3, 2, 1, 1, 8, 2, 2, 2, 1, 56, 9, - 3, 8, 4, 21, 3, 2, 9, 2, 3, 2, 9, 8, 2, 5, 3, 3, 1, 9, 3, 4, 4, 3, 134,30, 3, 3, 10, 4, 2, 4, 1, 5, 12, 2, 2, 5, 3, 12, 3, 7, 4, - 2, 9, 3, 4, 10, 2, 2, 3, 12, 4, 3, 6, 1, 1, 6, 2, 2, 2, 2, 2, 2, 4, 1, 1, 51, 4, 7, 4, 3, 5, 3, 2, 3, 5, 4, 2, 2, 18, 5, 4, 5, - 3, 2, 36, 10, 10, 3, 3, 5, 3, 4, 1, 2, 1, 7, 11, 4, 3, 6, 3, 3, 4, 2, 2, 3, 9, 2, 3, 3, 3, 46, 14, 2, 1, 1, 8, 5, 1, 13, 11, 10, 5, - 3, 3, 8, 2, 4, 1, 1, 1, 5, 5, 2, 3, 102,7, 2, 6, 3, 10, 2, 9, 4, 3, 2, 1, 1, 9, 6, 6, 4, 2, 22, 15, 10, 7, 3, 1, 4, 4, 2, 2, 4, - 1, 1, 1, 1, 20, 1, 1, 1, 2, 1, 3, 3, 3, 1, 1, 1, 2, 3, 1, 1, 4, 3, 1, 1, 1, 30, 2, 1, 1, 1, 1, 14, 3, 1, 1, 5, 1, 1, 1, 1, 1, - 1, 1, 4, 1, 1, 1, 3, 2, 2, 7, 3, 3, 3, 3, 1, 1, 1, 7, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 4, 9, 4, 1, 1, 1, 36, 4, 27, 26, 10, 7, 8, 1, 3, 3, 92, 2, 3, 1, 2, 23, 7, 2, 2, 4, 3, 4, 3, 2, 1, 1, 18, 8, 4, 4, 4, 3, - 2, 5, 2, 21, 21, 2, 2, 4, 3, 3, 2, 2, 2, 4, 4, 4, 3, 78, 8, 5, 4, 45, 1, 4, 2, 2, 16, 13, 4, 4, 7, 2, 3, 2, 5, 10, 2, 2, 32, 2, 5, - 2, 3, 11, 8, 2, 2, 3, 2, 6, 6, 4, 3, 3, 3, 3, 89, 6, 14, 7, 2, 2, 1, 37, 4, 2, 27, 8, 3, 6, 3, 4, 2, 2, 4, 5, 10, 6, 8, 4, 3, 3, - 2, 184,20, 6, 1, 1, 4, 4, 4, 4, 4, 12, 12, 12, 9, 8, 5, 5, 4, 1, 37, 5, 3, 11, 1, 3, 1, 1, 5, 2, 2, 3, 3, 3, 5, 2, 1, 1, 11, 1, 1, - 1, 1, 1, 1, 1, 3, 2, 2, 2, 2, 2, 46, 2, 14, 1, 9, 1, 1, 3, 4, 10, 3, 2, 3, 3, 14, 2, 2, 2, 2, 2, 10, 10, 9, 6, 1, 39, 1, 1, 7, 1, - 1, 18, 17, 17, 2, 11, 5, 3, 2, 4, 2, 2, 2, 1, 1, 4, 3, 3, 10, 9, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 6, 2, 2, - 2, 2, 2, 2, 2, 2, 242,2, 1, 1, 20, 12, 8, 4, 3, 2, 2, 27, 13, 2, 3, 2, 2, 2, 3, 2, 5, 38, 4, 4, 1, 2, 21, 2, 2, 3, 3, 4, 4, 47, 1, - 1, 3, 4, 5, 5, 4, 7, 2, 2, 4, 18, 9, 9, 4, 1, 9, 2, 3, 22, 3, 5, 4, 3, 7, 7, 3, 6, 6, 5, 3, 5, 2, 5, 6, 4, 7, 2, 2, 21, 4, 4, - 4, 15, 15, 14, 9, 7, 6, 1, 1, 1, 2, 2, 19, 16, 15, 14, 1, 1, 5, 3, 3, 3, 30, 6, 4, 3, 2, 5, 2, 1, 1, 5, 1, 3, 2, 61, 2, 1, 1, 1, 1, - 1, 2, 40, 1, 13, 9, 9, 4, 1, 2, 1, 1, 1, 11, 6, 2, 4, 4, 4, 2, 2, 5, 3, 5, 5, 4, 2, 8, 4, 3, 3, 3, 1, 1, 1, 1, 1, 113,5, 2, 2, - 2, 2, 2, 12, 4, 6, 3, 31, 11, 1, 3, 2, 5, 4, 3, 3, 3, 2, 2, 1, 1, 1, 1, 1, 4, 11, 5, 4, 3, 3, 4, 19, 3, 3, 2, 2, 2, 2, 5, 3, 3, - 2, 1, 1, 6, 5, 4, 2, 1, 1, 1, 7, 7, 7, 3, 3, 3, 3, 50, 2, 5, 1, 1, 2, 2, 10, 6, 5, 20, 6, 4, 2, 2, 1, 3, 3, 4, 2, 2, 2, 207,4, - 35, 29, 12, 4, 5, 1, 3, 3, 4, 3, 6, 2, 2, 11, 5, 2, 3, 3, 4, 30, 9, 8, 1, 1, 1, 2, 4, 2, 17, 15, 3, 3, 2, 7, 3, 1, 16, 2, 2, 2, 2, - 2, 9, 5, 3, 26, 2, 1, 1, 5, 8, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 4, 2, 1, 1, 3, 3, 2, 1, 8, 3, 3, 51, 2, 2, 3, 3, 3, 30, 4, 22, - 7, 2, 4, 5, 4, 3, 3, 2, 1, 3, 1, 2, 3, 2, 1, 2, 2, 1, 1, 6, 2, 2, 14, 2, 2, 2, 2, 10, 9, 9, 1, 35, 5, 3, 3, 3, 3, 3, 2, 2, 2, - 2, 8, 1, 3, 1, 1, 3, 2, 5, 5, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 41, 6, 6, 6, 6, 6, 2, 2, 2, 2, 1, 1, 5, 5, 3, 4, 5, 2, 1, 1, 1, - 4, 3, 3, 3, 3, 2, 1, 3, 23, 7, 1, 2, 1, 1, 8, 1, 1, 6, 3, 2, 5, 2, 24, 8, 6, 2, 1, 4, 3, 7, 3, 4, 1, 152,8, 4, 4, 4, 70, 70, 5, - 5, 57, 11, 7, 3, 42, 1, 1, 1, 7, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 5, 4, 5, 4, 4, 4, 4, 4, 1, 1, 1, - 8, 2, 2, 2, 2, 2, 4, 4, 6, 4, 2, 2, 2, 1, 2, 1, 1, 1, 4, 1, 1, 1, 1, 7, 4, 4, 2, 4, 3, 3, 10, 9, 9, 8, 4, 17, 7, 4, 2, 2, 3, - 3, 3, 5, 5, 5, 5, 4, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 14, 9, 9, 4, 5, 4, 17, 4, 1, 3, 1, 4, 3, 3, 2, 12, 4, 2, 2, 1, 6, 5, 2, - 1, 94, 11, 5, 7, 5, 3, 4, 2, 1, 3, 3, 8, 7, 7, 7, 5, 15, 4, 3, 3, 3, 2, 8, 5, 1, 1, 2, 2, 16, 12, 6, 6, 6, 5, 1, 1, 1, 1, 14, 2, - 2, 4, 4, 124,9, 2, 3, 1, 1, 47, 3, 2, 1, 15, 7, 4, 2, 16, 6, 3, 3, 3, 3, 41, 2, 4, 3, 2, 2, 13, 11, 2, 2, 1, 3, 3, 7, 5, 2, 2, 5, - 1, 4, 2, 8, 2, 2, 4, 2, 1, 3, 22, 4, 1, 1, 1, 7, 4, 2, 3, 4, 2, 26, 2, 4, 5, 3, 6, 3, 2, 8, 4, 3, 40, 6, 1, 1, 3, 9, 2, 1, 2, - 1, 4, 2, 2, 3, 2, 2, 6, 2, 7, 1, 11, 4, 4, 27, 7, 4, 17, 3, 3, 2, 9, 1, 15, 6, 4, 3, 3, 8, 5, 2, 7, 1, 2, 36, 4, 4, 4, 3, 17, 2, - 2, 7, 5, 4, 2, 1, 1, 96, 29, 4, 2, 18, 1, 1, 2, 7, 6, 6, 6, 2, 26, 5, 3, 5, 4, 4, 4, 4, 11, 1, 3, 5, 5, 5, 4, 1, 7, 1, 5, 10, 5, - 3, 2, 1, 2, 1, 1, 18, 6, 1, 3, 3, 2, 2, 2, 6, 5, 3, 4, 3, 43, 9, 5, 2, 28, 3, 9, 8, 5, 4, 6, 4, 3, 2, 2, 59, 11, 2, 8, 18, 7, 7, - 10, 9, 4, 5, 3, 6, 5, 3, 6, 8, 40, 11, 3, 3, 14, 2, 6, 8, 4, 2, 3, 14, 3, 7, 6, 5, 5, 70, 6, 5, 5, 2, 5, 1, 1, 1, 13, 12, 10, 9, 1, - 9, 8, 4, 4, 4, 14, 3, 3, 10, 10, 5, 9, 3, 3, 5, 5, 4, 4, 4, 8, 4, 4, 6, 2, 2, 2, 11, 9, 1, 1, 1, 1, 24, 5, 6, 6, 9, 4, 4, 4, 3, - 3, 3, 3, 3, 1, 1, 1, 2, 90, 15, 2, 3, 3, 5, 5, 5, 2, 4, 1, 2, 2, 2, 2, 1, 8, 7, 7, 7, 10, 4, 2, 5, 5, 8, 24, 7, 6, 2, 4, 9, 4, - 5, 11, 5, 5, 5, 5, 2, 4, 1, 1, 8, 8, 8, 2, 6, 6, 2, 2, 4, 4, 4, 100,6, 5, 27, 12, 8, 8, 4, 8, 3, 6, 4, 3, 37, 4, 1, 2, 2, 2, 1, - 1, 2, 1, 4, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 11, 1, 1, 7, 6, 3, 4, 3, 3, 1, 6, 4, 2, 6, 6, 1, 26, 17, 16, 9, 18, 1, 1, 1, 3, 9, - 9, 8, 7, 1, 120,9, 2, 4, 2, 2, 1, 1, 37, 2, 2, 2, 23, 5, 2, 2, 4, 4, 5, 4, 4, 3, 2, 3, 11, 11, 10, 34, 7, 5, 4, 19, 4, 3, 6, 5, 5, - 10, 7, 6, 3, 3, 3, 2, 9, 9, 1, 11, 5, 5, 4, 1, 1, 10, 10, 8, 6, 3, 2, 23, 7, 6, 14, 5, 5, 5, 5, 2, 2, 5, 2, 1, 1, 1, 18, 3, 5, 5, - 4, 1, 1, 1, 2, 20, 5, 1, 1, 4, 3, 1, 3, 3, 1, 1, 1, 5, 5, 5, 5, 32, 3, 16, 7, 2, 6, 6, 5, 12, 10, 7, 2, 1, 37, 2, 1, 1, 6, 3, 3, - 3, 3, 8, 4, 8, 123,8, 1, 1, 3, 3, 32, 3, 26, 4, 4, 4, 9, 9, 9, 8, 11, 1, 4, 2, 2, 2, 6, 6, 5, 5, 5, 16, 3, 3, 8, 7, 6, 42, 14, 3, - 6, 4, 4, 3, 16, 1, 5, 4, 4, 4, 4, 3, 5, 1, 3, 3, 2, 8, 6, 6, 6, 6, 1, 30, 8, 6, 6, 6, 1, 19, 8, 8, 8, 7, 7, 7, 7, 5, 5, 7, 4, - 2, 3, 7, 1, 4, 4, 14, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 146,7, 1, 1, 1, 1, 1, 2, 2, 1, 2, 2, 1, 5, 3, 15, 8, - 2, 2, 4, 4, 4, 2, 2, 7, 3, 72, 7, 2, 2, 2, 10, 9, 6, 6, 2, 3, 3, 3, 7, 2, 2, 5, 5, 3, 3, 3, 2, 2, 2, 1, 1, 7, 7, 3, 3, 2, 15, - 5, 5, 5, 5, 4, 4, 6, 3, 3, 13, 2, 5, 5, 3, 3, 6, 4, 3, 1, 1, 4, 11, 3, 4, 3, 2, 19, 7, 5, 5, 3, 7, 2, 3, 1, 2, 65, 65, 29, 18, 12, - 5, 11, 4, 4, 1, 1, 1, 3, 3, 2, 2, 32, 1, 1, 5, 2, 2, 2, 3, 2, 7, 5, 8, 7, 6, 6, 6, 28, 1, 4, 4, 12, 4, 2, 1, 2, 12, 5, 2, 1, 1, - 2, 8, 1, 1, 3, 3, 15, 3, 3, 2, 25, 3, 2, 7, 7, 3, 2, 2, 1, 1, 1, 2, 3, 3, 1, 9, 2, 1, 1, 6, 2, 2, 2, 6, 49, 24, 6, 3, 5, 1, 7, - 4, 3, 1, 2, 1, 1, 3, 3, 2, 7, 4, 1, 19, 8, 7, 6, 2, 4, 3, 11, 2, 2, 1, 5, 3, 3, 1, 1, 25, 4, 1, 2, 8, 6, 5, 7, 4, 19, 1, 4, 3, - 5, 5, 4, 3, 2, 23, 8, 4, 3, 1, 1, 4, 2, 6, 2, 12, 2, 1, 3, 9, 3, 3, 2, 1, 1, 1, 10, 2, 7, 7, 5, 3, 2, 1, 9, 7, 7, 2, 2, 2, 1, - 5, 4, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 6, 2, 1, 4, 2, 2, 2, 102,44, 2, 1, 1, 1, 14, 9, 3, 2, 4, 2, 12, 7, 3, 7, 23, 2, 3, 14, - 5, 4, 2, 2, 24, 5, 3, 1, 1, 11, 3, 3, 2, 4, 3, 7, 2, 1, 2, 4, 3, 2, 2, 2, 13, 3, 1, 1, 2, 2, 3, 24, 3, 7, 9, 2, 1, 2, 2, 2, 2, - 2, 2, 5, 2, 2, 15, 4, 5, 4, 3, 2, 4, 4, 6, 1, 3, 2, 2, 2, 2, 2, 77, 13, 1, 4, 3, 24, 2, 2, 6, 3, 2, 10, 5, 5, 1, 1, 14, 9, 5, 3, - 3, 3, 2, 5, 13, 3, 3, 3, 4, 3, 2, 17, 16, 6, 3, 10, 1, 1, 3, 2, 2, 47, 11, 4, 19, 2, 10, 5, 5, 5, 5, 1, 1, 7, 2, 3, 2, 2, 3, 130,27, - 10, 6, 6, 2, 4, 3, 3, 2, 2, 2, 42, 4, 4, 4, 4, 1, 1, 5, 11, 1, 1, 3, 2, 6, 3, 2, 3, 3, 12, 9, 9, 11, 1, 2, 22, 6, 4, 2, 9, 6, 5, - 3, 1, 3, 7, 3, 3, 2, 3, 3, 1, 1, 1, 1, 140,6, 15, 1, 9, 3, 4, 3, 1, 1, 1, 1, 6, 6, 6, 4, 2, 56, 6, 5, 13, 4, 8, 2, 2, 10, 4, 4, - 4, 2, 19, 6, 4, 2, 13, 5, 5, 5, 5, 5, 4, 4, 4, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 8, 1, 2, 8, 1, 1, 2, 2, 5, 3, 2, 4, 2, 2, 14, 4, - 4, 2, 3, 1, 1, 4, 4, 4, 4, 170,5, 8, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 6, 4, 2, 2, 14, 12, 12, 8, 2, 2, 2, 2, 2, 14, 3, 4, 1, 1, - 1, 2, 4, 1, 2, 2, 5, 15, 1, 1, 11, 3, 3, 3, 5, 4, 2, 2, 1, 1, 1, 1, 1, 1, 66, 5, 3, 2, 3, 2, 4, 3, 3, 40, 2, 1, 6, 1, 1, 1, 1, - 1, 1, 1, 2, 1, 1, 2, 11, 6, 1, 1, 1, 7, 1, 1, 1, 2, 1, 3, 1, 15, 1, 1, 5, 4, 4, 7, 3, 2, 2, 9, 2, 1, 2, 2, 2, 1, 1, 1, 2, 1, - 2, 2, 80, 7, 6, 10, 9, 9, 39, 3, 3, 20, 20, 20, 17, 6, 5, 2, 3, 6, 8, 8, 7, 7, 7, 1, 1, 1, 1, 1, 1, 3, 5, 1, 1, 121,15, 3, 4, 25, 6, - 2, 10, 5, 5, 72, 2, 2, 2, 6, 4, 5, 4, 3, 3, 4, 7, 2, 2, 2, 2, 8, 3, 10, 4, 3, 13, 5, 4, 4, 3, 3, 5, 9, 9, 8, 6, 1, 35, 7, 7, 7, - 4, 2, 2, 9, 3, 2, 4, 3, 2, 2, 3, 22, 12, 6, 6, 5, 5, 4, 6, 2, 33, 7, 2, 9, 3, 2, 5, 4, 3, 2, 2, 3, 2, 3, 34, 7, 3, 3, 3, 3, 4, - 5, 5, 5, 2, 14, 9, 9, 6, 2, 2, 3, 3, 3, 3, 3, 3, 110,11, 4, 4, 4, 7, 36, 5, 14, 8, 6, 5, 4, 2, 8, 8, 6, 5, 5, 5, 2, 4, 4, 8, 7, - 7, 7, 6, 1, 17, 13, 5, 6, 19, 7, 4, 12, 8, 8, 3, 5, 3, 3, 3, 3, 3, 3, 8, 6, 5, 2, 2, 2, 2, 2, 8, 1, 1, 5, 4, 46, 17, 15, 15, 8, 4, - 13, 13, 7, 4, 4, 10, 2, 2, 1, 28, 10, 7, 7, 7, 4, 11, 8, 8, 8, 3, 4, 4, 3, 25, 4, 3, 3, 5, 10, 10, 7, 6, 4, 3, 3, 3, 5, 3, 2, 2, 23, - 2, 2, 7, 2, 2, 2, 5, 1, 4, 4, 4, 1, 1, 1, 3, 1, 1, 168,17, 13, 6, 7, 5, 4, 4, 2, 52, 10, 10, 5, 8, 8, 6, 4, 5, 3, 10, 7, 3, 3, 19, - 15, 5, 5, 9, 9, 9, 9, 3, 4, 6, 6, 41, 7, 3, 3, 3, 30, 9, 9, 3, 11, 7, 6, 6, 4, 29, 5, 5, 5, 5, 3, 7, 7, 12, 5, 4, 20, 18, 18, 18, 9, - 6, 6, 2, 2, 2, 3, 1, 2, 2, 2, 2, 114,3, 31, 1, 1, 1, 1, 1, 19, 7, 9, 7, 11, 6, 6, 3, 3, 3, 11, 9, 3, 5, 5, 5, 9, 5, 5, 3, 2, 60, - 42, 2, 11, 1, 1, 2, 2, 2, 2, 2, 3, 1, 1, 1, 1, 1, 2, 1, 3, 3, 3, 3, 3, 3, 4, 2, 4, 3, 3, 3, 2, 2, 2, 1, 1, 5, 4, 4, 4, 4, 1, - 13, 13, 2, 6, 2, 1, 1, 2, 6, 2, 2, 2, 2, 2, 1, 1, 55, 3, 1, 1, 1, 1, 1, 1, 2, 1, 33, 5, 3, 3, 2, 1, 1, 1, 5, 3, 2, 7, 2, 2, 4, - 2, 2, 2, 4, 2, 2, 1, 3, 1, 19, 1, 1, 7, 1, 2, 1, 2, 1, 1, 3, 2, 1, 7, 1, 1, 1, 1, 4, 3, 2, 1, 1, 7, 1, 1, 1, 2, 1, 2, 2, 2, - 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 70, 2, 2, 2, 7, 3, 3, 2, 18, 5, 4, 5, 4, 4, 3, 1, 26, 2, 20, 13, 8, 3, 3, - 4, 3, 78, 22, 1, 2, 4, 2, 2, 2, 4, 2, 1, 1, 1, 1, 1, 1, 18, 3, 10, 9, 9, 4, 3, 2, 2, 20, 4, 4, 4, 10, 8, 4, 6, 5, 4, 23, 2, 9, 3, - 12, 1, 4, 2, 5, 2, 2, 2, 33, 6, 5, 10, 3, 4, 3, 3, 4, 2, 28, 2, 2, 1, 1, 3, 2, 3, 2, 11, 6, 6, 1, 1, 1, 3, 115,1, 1, 2, 3, 14, 2, - 10, 7, 3, 59, 5, 3, 1, 4, 2, 2, 6, 4, 3, 2, 3, 8, 2, 3, 2, 3, 2, 2, 2, 1, 2, 4, 5, 3, 3, 5, 2, 12, 11, 4, 4, 4, 5, 2, 12, 6, 3, - 2, 2, 2, 157,10, 2, 2, 35, 4, 1, 26, 23, 4, 3, 4, 2, 7, 3, 2, 2, 3, 17, 8, 6, 2, 2, 2, 2, 41, 1, 1, 7, 3, 2, 8, 5, 6, 12, 5, 5, 3, - 2, 1, 1, 1, 1, 1, 1, 16, 7, 5, 2, 10, 4, 4, 1, 2, 3, 42, 4, 2, 1, 3, 26, 2, 2, 2, 18, 11, 8, 6, 3, 2, 5, 2, 119,8, 6, 6, 2, 9, 5, - 6, 2, 3, 8, 6, 2, 1, 14, 4, 5, 3, 5, 2, 44, 29, 1, 1, 1, 1, 20, 7, 5, 5, 5, 2, 5, 5, 3, 3, 2, 3, 2, 221,1, 24, 3, 5, 2, 2, 4, 5, - 14, 5, 3, 2, 1, 5, 2, 1, 5, 5, 22, 4, 9, 3, 2, 1, 1, 3, 8, 5, 30, 4, 3, 5, 4, 2, 2, 1, 13, 6, 9, 3, 4, 4, 2, 2, 37, 12, 7, 3, 9, - 3, 4, 1, 3, 2, 8, 3, 1, 11, 3, 1, 3, 80, 18, 17, 5, 2, 1, 1, 1, 2, 1, 10, 7, 6, 6, 10, 2, 4, 2, 28, 2, 8, 2, 4, 2, 2, 96, 12, 8, 3, - 6, 3, 5, 3, 6, 20, 13, 10, 3, 12, 4, 6, 3, 1, 1, 1, 1, 1, 1, 4, 2, 2, 9, 4, 82, 7, 3, 7, 4, 1, 1, 3, 3, 26, 2, 1, 10, 5, 3, 3, 3, - 6, 7, 1, 1, 1, 5, 17, 4, 2, 2, 2, 7, 3, 3, 2, 55, 6, 2, 7, 3, 3, 7, 3, 29, 19, 13, 12, 9, 9, 9, 4, 3, 4, 3, 2, 14, 2, 3, 5, 14, 2, - 1, 5, 2, 2, 16, 5, 2, 2, 7, 5, 3, 3, 2, 1, 1, 9, 1, 2, 2, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 3, 1, 1, 1, 1, - 1, 1, 2, 1, 1, 1, 1, 1, 1, 63, 8, 3, 2, 18, 3, 4, 7, 20, 11, 11, 11, 3, 7, 7, 6, 3, 13, 2, 1, 6, 3, 3, 3, 2, 1, 1, 16, 2, 6, 4, 3, - 3, 1, 1, 63, 3, 6, 5, 3, 34, 28, 16, 2, 9, 4, 4, 1, 5, 5, 2, 2, 12, 11, 3, 2, 2, 47, 2, 13, 3, 3, 12, 5, 3, 2, 2, 1, 11, 3, 2, 2, 1, - 14, 4, 7, 2, 50, 4, 2, 2, 2, 2, 11, 2, 1, 4, 7, 11, 2, 2, 5, 5, 3, 2, 2, 148,3, 2, 2, 2, 3, 21, 3, 2, 2, 3, 4, 3, 1, 1, 1, 2, 2, - 2, 46, 19, 14, 3, 4, 4, 3, 8, 1, 2, 5, 29, 6, 7, 2, 5, 4, 6, 5, 3, 6, 6, 3, 7, 1, 14, 4, 2, 2, 23, 4, 2, 2, 10, 8, 7, 3, 2, 98, 13, - 7, 3, 2, 3, 15, 7, 5, 3, 9, 3, 2, 2, 2, 2, 2, 6, 1, 1, 8, 3, 19, 10, 2, 5, 1, 1, 1, 5, 2, 3, 3, 6, 3, 3, 3, 2, 2, 6, 1, 2, 4, - 2, 2, 2, 1, 1, 8, 1, 3, 3, 1, 13, 9, 5, 4, 4, 3, 3, 15, 8, 5, 2, 2, 2, 2, 17, 3, 5, 2, 2, 5, 4, 1, 1, 3, 4, 2, 1, 1, 20, 3, 2, - 6, 4, 7, 37, 16, 11, 10, 4, 2, 6, 1, 2, 4, 2, 10, 3, 3, 108,36, 1, 2, 7, 3, 16, 2, 10, 4, 20, 1, 5, 5, 27, 6, 3, 6, 3, 3, 12, 2, 2, 2, - 2, 1, 1, 1, 1, 2, 2, 8, 2, 2, 2, 4, 3, 17, 15, 12, 11, 4, 6, 2, 4, 32, 3, 2, 4, 2, 18, 3, 9, 7, 2, 1, 1, 1, 2, 39, 5, 5, 3, 2, 2, - 6, 6, 5, 12, 8, 6, 2, 3, 22, 8, 4, 2, 7, 7, 3, 2, 2, 2, 2, 6, 3, 3, 5, 3, 9, 4, 3, 3, 2, 12, 2, 1, 1, 1, 1, 5, 5, 4, 3, 1, 1, - 2, 1, 1, 9, 1, 1, 1, 3, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 1, 1, 1, 4, 1, 3, 3, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 18, 2, 1, 7, 4, 3, 2, 2, 23, 3, 3, 1, 1, 1, 13, 4, 2, 2, 6, 2, 1, 1, 1, 1, 1, 41, 2, 6, 4, 17, 1, 7, 4, 1, 2, - 1, 10, 10, 8, 8, 3, 3, 2, 29, 2, 6, 1, 12, 7, 4, 2, 2, 2, 2, 63, 3, 1, 2, 3, 4, 2, 2, 1, 4, 16, 15, 4, 4, 2, 5, 16, 3, 3, 2, 8, 3, - 3, 2, 20, 5, 4, 4, 1, 9, 2, 2, 3, 70, 5, 4, 2, 2, 8, 4, 2, 12, 12, 2, 2, 3, 3, 5, 2, 28, 11, 4, 4, 2, 7, 2, 17, 5, 3, 7, 3, 3, 1, - 5, 2, 149,13, 3, 3, 3, 4, 1, 2, 5, 11, 3, 3, 2, 40, 2, 3, 2, 2, 2, 24, 3, 6, 3, 3, 10, 3, 4, 4, 30, 9, 9, 6, 5, 17, 3, 3, 3, 7, 2, - 4, 10, 5, 3, 2, 3, 3, 3, 205,36, 19, 2, 2, 2, 9, 4, 12, 11, 7, 4, 2, 2, 12, 8, 16, 1, 1, 1, 1, 1, 4, 23, 4, 4, 4, 25, 3, 20, 20, 2, 6, - 2, 2, 4, 4, 3, 1, 2, 21, 10, 3, 3, 3, 16, 1, 1, 8, 4, 3, 2, 2, 2, 5, 5, 5, 4, 2, 28, 13, 3, 8, 4, 2, 1, 1, 6, 1, 1, 1, 2, 3, 2, - 2, 2, 33, 3, 26, 3, 1, 2, 11, 5, 3, 10, 3, 2, 2, 1, 1, 1, 1, 1, 3, 1, 1, 2, 1, 123,81, 5, 16, 4, 2, 2, 5, 1, 3, 2, 2, 4, 9, 5, 5, - 5, 3, 4, 1, 3, 4, 5, 3, 10, 8, 2, 4, 2, 2, 9, 5, 3, 3, 2, 2, 11, 3, 2, 1, 1, 1, 1, 15, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, - 2, 109,2, 19, 3, 3, 13, 2, 5, 2, 59, 10, 3, 2, 3, 15, 8, 3, 4, 2, 6, 4, 2, 2, 1, 2, 1, 1, 1, 10, 3, 2, 4, 4, 4, 10, 3, 2, 71, 2, 6, - 6, 3, 1, 1, 1, 2, 4, 3, 16, 6, 4, 3, 32, 3, 7, 5, 5, 3, 2, 2, 3, 2, 1, 3, 1, 1, 1, 2, 1, 1, 2, 2, 2, 4, 3, 2, 1, 1, 3, 3, 2, - 1, 1, 1, 11, 10, 17, 5, 6, 6, 3, 10, 1, 3, 1, 1, 1, 3, 3, 3, 1, 1, 31, 1, 1, 1, 1, 5, 4, 2, 1, 1, 1, 1, 1, 3, 2, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 19, 2, 1, 13, 13, 10, 9, 9, 7, 4, 4, 3, 3, 235,8, 3, 3, 23, 5, 4, 3, 6, 3, 4, 2, 5, 9, 31, 3, 2, 12, 4, 2, 2, - 2, 7, 6, 5, 4, 1, 1, 1, 26, 3, 2, 6, 3, 6, 3, 8, 4, 26, 24, 4, 4, 1, 1, 1, 43, 4, 2, 3, 2, 6, 13, 10, 6, 2, 3, 2, 9, 3, 2, 23, 2, - 1, 6, 12, 6, 5, 1, 1, 2, 1, 135,6, 2, 2, 11, 5, 5, 2, 7, 1, 1, 5, 17, 2, 5, 4, 1, 13, 9, 6, 6, 1, 2, 3, 1, 1, 1, 1, 13, 5, 6, 14, - 2, 3, 2, 2, 11, 7, 8, 4, 4, 9, 9, 2, 2, 2, 1, 1, 3, 2, 2, 2, 14, 6, 2, 1, 1, 90, 11, 10, 3, 8, 3, 3, 6, 5, 5, 2, 26, 6, 5, 11, 5, - 3, 3, 19, 1, 11, 6, 8, 7, 2, 3, 6, 4, 176,9, 8, 9, 7, 3, 3, 5, 3, 1, 4, 3, 24, 13, 3, 3, 2, 2, 3, 3, 9, 3, 2, 7, 65, 5, 26, 15, 5, - 5, 4, 4, 26, 6, 5, 2, 1, 1, 7, 5, 5, 5, 4, 10, 2, 11, 3, 3, 8, 4, 3, 16, 12, 10, 4, 1, 87, 8, 6, 11, 2, 3, 5, 5, 4, 2, 2, 5, 4, 2, - 5, 2, 1, 1, 6, 5, 11, 10, 3, 3, 3, 3, 5, 3, 1, 1, 3, 6, 9, 3, 2, 2, 1, 1, 1, 1, 1, 36, 2, 3, 2, 2, 2, 7, 6, 4, 2, 2, 2, 3, 3, - 3, 2, 1, 3, 4, 1, 1, 3, 1, 1, 1, 1, 9, 4, 2, 19, 6, 8, 8, 3, 13, 3, 5, 3, 14, 2, 1, 1, 3, 4, 3, 2, 2, 2, 29, 2, 6, 4, 2, 7, 3, - 3, 6, 4, 14, 2, 5, 4, 2, 96, 3, 8, 4, 12, 4, 26, 9, 5, 4, 4, 3, 5, 1, 30, 2, 2, 1, 5, 9, 4, 11, 11, 4, 3, 3, 2, 8, 4, 4, 4, 74, 2, - 21, 5, 4, 2, 4, 4, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 4, 3, 31, 11, 3, 3, 3, 1, 8, 4, 2, 14, 7, 3, 1, 87, 7, 4, 2, 2, 2, 13, 1, 1, 7, - 4, 4, 3, 54, 18, 15, 15, 13, 2, 2, 3, 1, 5, 1, 1, 4, 4, 2, 8, 2, 2, 2, 2, 18, 3, 2, 2, 1, 19, 2, 6, 1, 8, 5, 3, 20, 9, 3, 5, 31, 4, - 2, 5, 2, 2, 2, 2, 96, 3, 4, 12, 7, 7, 7, 4, 4, 4, 3, 2, 4, 3, 3, 3, 3, 1, 1, 1, 1, 6, 4, 3, 3, 30, 5, 5, 5, 4, 4, 4, 15, 3, 2, - 3, 5, 5, 4, 1, 4, 1, 9, 2, 5, 5, 5, 39, 2, 19, 12, 2, 2, 2, 2, 4, 8, 5, 4, 6, 4, 2, 4, 2, 14, 7, 2, 4, 162,27, 1, 12, 9, 3, 3, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 3, 9, 2, 6, 3, 3, 111,111,111,99, 12, 19, 2, 8, 2, 6, 3, 2, 2, 12, 9, 6, 5, 36, 4, 4, 5, 3, 3, 7, - 2, 1, 2, 66, 3, 1, 6, 2, 5, 1, 1, 15, 3, 2, 1, 5, 2, 2, 3, 17, 2, 14, 6, 5, 5, 5, 5, 4, 6, 5, 5, 2, 3, 2, 49, 4, 2, 5, 2, 2, 19, - 3, 6, 6, 6, 3, 10, 8, 6, 2, 11, 2, 1, 1, 1, 1, 1, 1, 3, 2, 2, 3, 88, 5, 3, 14, 22, 17, 4, 4, 4, 5, 4, 5, 4, 4, 4, 2, 2, 25, 1, 1, - 1, 1, 1, 1, 1, 2, 2, 4, 6, 5, 8, 14, 10, 35, 4, 3, 1, 1, 4, 4, 2, 4, 2, 4, 3, 2, 2, 3, 1, 1, 5, 2, 2, 2, 1, 1, 1, 1, 1, 4, 2, - 2, 2, 19, 3, 2, 11, 5, 5, 4, 3, 1, 23, 3, 3, 3, 2, 7, 5, 5, 5, 2, 4, 3, 2, 17, 4, 3, 3, 3, 6, 2, 4, 14, 9, 184,85, 4, 19, 14, 9, 3, - 3, 4, 16, 4, 11, 7, 21, 3, 11, 6, 3, 18, 4, 2, 3, 3, 3, 3, 2, 1, 1, 1, 2, 56, 11, 9, 2, 2, 2, 2, 1, 6, 3, 3, 3, 3, 1, 9, 3, 3, 6, - 2, 4, 2, 2, 2, 6, 2, 8, 3, 15, 6, 3, 1, 20, 8, 3, 3, 2, 1, 3, 19, 9, 7, 1, 5, 4, 5, 17, 5, 2, 2, 4, 4, 2, 2, 2, 2, 1, 6, 12, 6, + 11, 1, 3, 2, 3, 23, 2, 15, 9, 9, 7, 1, 5, 1, 1, 1, 1, 6, 2, 2, 2, 3, 7, 3, 39, 24, 3, 3, 2, 2, 2, 4, 3, 3, 2, 2, 7, 3, 1, 7, 3, + 4, 2, 37, 10, 1, 2, 4, 1, 1, 1, 3, 5, 3, 1, 3, 2, 4, 4, 4, 3, 3, 1, 1, 1, 58, 4, 2, 3, 5, 3, 1, 1, 5, 2, 2, 6, 2, 1, 1, 2, 3, + 9, 9, 25, 12, 1, 5, 2, 1, 4, 8, 2, 2, 3, 3, 1, 22, 5, 4, 1, 2, 2, 2, 5, 3, 2, 1, 1, 102,1, 8, 1, 2, 2, 2, 2, 4, 2, 1, 1, 8, 2, + 2, 7, 3, 3, 1, 1, 2, 3, 6, 4, 3, 13, 3, 3, 9, 2, 2, 2, 2, 2, 8, 2, 8, 1, 4, 2, 3, 1, 1, 1, 8, 2, 3, 4, 2, 3, 11, 1, 2, 3, 4, + 16, 6, 3, 2, 1, 3, 4, 3, 43, 1, 1, 2, 8, 7, 2, 1, 3, 5, 4, 2, 2, 2, 2, 3, 8, 4, 11, 2, 5, 1, 16, 7, 4, 2, 2, 2, 1, 1, 3, 2, 1, + 4, 2, 2, 76, 11, 11, 10, 8, 8, 3, 11, 6, 4, 4, 5, 5, 5, 5, 6, 4, 11, 6, 3, 3, 3, 4, 3, 9, 8, 8, 8, 2, 52, 1, 2, 23, 3, 1, 1, 1, 3, + 3, 5, 1, 1, 2, 2, 1, 5, 2, 2, 1, 1, 1, 1, 1, 1, 7, 7, 1, 1, 5, 21, 7, 3, 8, 4, 3, 2, 3, 2, 45, 2, 3, 7, 3, 13, 5, 11, 4, 3, 2, + 2, 1, 2, 2, 2, 20, 2, 1, 1, 8, 6, 3, 4, 3, 2, 1, 1, 10, 5, 4, 8, 1, 2, 4, 26, 18, 1, 1, 4, 24, 8, 3, 3, 4, 4, 2, 12, 5, 4, 2, 2, + 1, 60, 2, 1, 1, 4, 2, 6, 30, 4, 7, 6, 3, 3, 5, 2, 6, 4, 11, 3, 2, 3, 1, 3, 3, 52, 4, 4, 1, 1, 4, 6, 1, 5, 2, 15, 1, 5, 3, 14, 13, + 2, 9, 3, 30, 6, 4, 2, 4, 2, 2, 2, 3, 4, 2, 1, 1, 1, 11, 4, 88, 4, 14, 14, 13, 3, 10, 8, 4, 4, 4, 4, 4, 4, 1, 6, 5, 34, 1, 1, 3, 13, + 12, 12, 12, 10, 5, 3, 1, 10, 5, 3, 3, 4, 1, 5, 2, 6, 1, 4, 6, 3, 9, 1, 4, 2, 243,1, 1, 17, 7, 4, 2, 2, 1, 1, 7, 2, 2, 3, 3, 1, 7, + 5, 3, 2, 1, 1, 1, 1, 14, 2, 2, 7, 3, 5, 3, 1, 1, 49, 3, 3, 5, 3, 1, 1, 23, 7, 5, 5, 3, 3, 4, 3, 2, 29, 7, 15, 4, 7, 28, 7, 6, 6, + 6, 6, 2, 5, 4, 2, 2, 1, 15, 5, 3, 25, 4, 4, 8, 4, 4, 1, 4, 3, 2, 3, 3, 3, 2, 6, 6, 3, 14, 2, 2, 1, 2, 1, 2, 4, 2, 2, 2, 182,30, + 2, 13, 12, 1, 3, 3, 3, 3, 3, 1, 4, 3, 25, 3, 3, 3, 14, 13, 4, 6, 5, 3, 1, 1, 1, 1, 1, 2, 14, 3, 2, 3, 15, 10, 3, 7, 37, 4, 1, 2, 2, + 2, 10, 10, 4, 3, 13, 11, 10, 2, 3, 7, 4, 2, 1, 1, 1, 1, 33, 4, 2, 18, 4, 1, 1, 1, 10, 10, 8, 3, 1, 1, 5, 13, 8, 4, 2, 2, 2, 1, 204,19, + 6, 5, 3, 3, 1, 1, 7, 2, 2, 2, 2, 29, 4, 1, 1, 2, 2, 2, 2, 9, 2, 2, 5, 3, 4, 2, 1, 1, 1, 2, 2, 32, 3, 3, 1, 3, 3, 4, 3, 10, 6, + 5, 5, 5, 2, 14, 7, 4, 3, 4, 3, 32, 3, 2, 2, 2, 3, 2, 2, 2, 2, 10, 3, 4, 5, 2, 2, 24, 3, 16, 7, 5, 3, 2, 2, 6, 1, 2, 2, 2, 3, 2, + 3, 30, 4, 2, 3, 12, 8, 4, 1, 1, 4, 1, 1, 3, 3, 2, 39, 2, 11, 11, 8, 3, 3, 1, 1, 1, 1, 14, 6, 4, 3, 3, 1, 2, 9, 9, 5, 5, 4, 3, 2, + 26, 3, 3, 3, 2, 1, 1, 17, 9, 4, 5, 2, 2, 2, 2, 1, 1, 22, 11, 1, 3, 1, 4, 1, 44, 2, 16, 14, 5, 3, 3, 10, 3, 3, 1, 1, 4, 4, 4, 3, 3, + 10, 2, 2, 6, 4, 2, 8, 3, 3, 2, 2, 2, 2, 1, 18, 4, 3, 7, 3, 2, 2, 35, 9, 4, 2, 3, 8, 7, 6, 3, 8, 9, 3, 3, 4, 1, 9, 1, 1, 1, 1, + 7, 1, 3, 1, 1, 1, 11, 4, 4, 46, 6, 5, 5, 5, 5, 5, 3, 3, 2, 2, 18, 14, 2, 16, 8, 7, 7, 7, 7, 2, 3, 1, 1, 1, 149,20, 6, 6, 10, 6, 2, + 53, 12, 12, 6, 3, 32, 6, 5, 16, 14, 14, 6, 4, 3, 4, 5, 4, 8, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 4, 4, 2, 18, 2, 1, 9, 2, 3, 2, 14, 5, 3, + 3, 5, 2, 2, 2, 4, 16, 3, 2, 4, 4, 4, 3, 1, 2, 3, 36, 2, 5, 5, 3, 5, 2, 15, 3, 3, 2, 1, 1, 1, 1, 10, 10, 10, 5, 3, 200,38, 8, 8, 5, + 2, 8, 6, 6, 6, 3, 5, 2, 40, 15, 12, 12, 4, 4, 4, 11, 2, 2, 9, 2, 3, 67, 9, 4, 25, 3, 2, 2, 2, 2, 5, 4, 4, 3, 2, 2, 11, 4, 4, 4, 6, + 2, 47, 1, 6, 8, 2, 4, 13, 5, 6, 6, 3, 51, 15, 3, 3, 1, 1, 1, 1, 1, 2, 6, 2, 14, 4, 1, 1, 1, 1, 4, 4, 3, 3, 2, 3, 9, 8, 5, 4, 2, + 11, 4, 2, 2, 4, 14, 4, 5, 1, 35, 8, 5, 5, 2, 2, 1, 1, 5, 1, 1, 1, 2, 2, 12, 2, 1, 1, 1, 10, 4, 3, 5, 3, 1, 1, 1, 1, 3, 1, 1, 4, + 1, 1, 1, 1, 1, 45, 24, 1, 3, 4, 12, 5, 3, 2, 5, 4, 2, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 7, 2, 3, 3, 1, 148,22, 3, 3, 12, 10, 4, 4, 3, + 6, 1, 2, 3, 3, 3, 3, 4, 3, 1, 15, 1, 1, 8, 8, 8, 3, 3, 3, 19, 8, 6, 6, 5, 5, 27, 7, 1, 1, 6, 4, 1, 1, 1, 3, 3, 1, 1, 1, 16, 16, + 15, 3, 20, 6, 3, 2, 2, 2, 6, 2, 2, 2, 2, 9, 3, 2, 3, 2, 5, 3, 3, 3, 1, 7, 4, 2, 2, 3, 1, 1, 1, 34, 5, 3, 2, 2, 2, 2, 1, 6, 2, + 3, 8, 3, 3, 3, 3, 1, 1, 1, 2, 5, 3, 2, 2, 2, 1, 4, 2, 106,9, 2, 2, 3, 8, 9, 1, 3, 1, 2, 1, 1, 1, 1, 1, 5, 1, 50, 15, 6, 5, 4, + 4, 2, 7, 3, 2, 3, 5, 2, 2, 1, 1, 1, 6, 2, 2, 1, 17, 11, 10, 5, 5, 5, 5, 5, 35, 4, 5, 4, 2, 1, 1, 5, 3, 6, 2, 1, 3, 2, 1, 1, 1, + 117,5, 2, 4, 9, 3, 2, 2, 5, 3, 7, 4, 4, 2, 2, 2, 2, 2, 2, 7, 4, 5, 5, 1, 5, 8, 2, 4, 1, 1, 1, 11, 4, 10, 5, 2, 28, 7, 4, 1, 3, + 2, 1, 6, 2, 1, 55, 2, 4, 38, 23, 2, 2, 1, 1, 1, 1, 1, 18, 15, 14, 11, 9, 9, 5, 4, 3, 2, 2, 6, 6, 4, 2, 1, 4, 3, 3, 3, 99, 4, 2, 11, + 8, 7, 4, 16, 5, 6, 4, 2, 38, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 5, 2, 2, 2, 2, 2, 17, 7, 6, 1, 1, 6, 2, 1, 1, 11, 7, 5, 7, 4, 3, 2, + 2, 2, 2, 2, 4, 2, 8, 6, 1, 114,11, 1, 1, 4, 3, 3, 2, 2, 7, 12, 2, 2, 1, 3, 12, 3, 3, 40, 8, 2, 2, 8, 3, 14, 3, 3, 7, 5, 3, 3, 3, + 2, 2, 3, 3, 8, 2, 144,54, 18, 13, 3, 4, 4, 2, 1, 2, 10, 5, 6, 2, 2, 1, 1, 23, 7, 7, 7, 7, 6, 7, 2, 2, 1, 26, 3, 10, 5, 12, 10, 7, 2, + 3, 8, 3, 14, 2, 5, 2, 2, 1, 1, 1, 1, 1, 6, 2, 3, 2, 2, 127,17, 3, 6, 2, 2, 1, 9, 33, 8, 3, 3, 4, 4, 3, 10, 3, 13, 2, 3, 2, 1, 1, + 10, 7, 2, 4, 1, 1, 14, 1, 1, 1, 1, 1, 1, 1, 3, 3, 2, 2, 5, 2, 1, 1, 1, 2, 1, 1, 46, 4, 1, 1, 4, 2, 1, 3, 13, 3, 3, 3, 4, 4, 2, + 1, 1, 5, 2, 5, 1, 1, 1, 1, 4, 3, 56, 6, 1, 1, 2, 1, 4, 3, 3, 10, 2, 4, 2, 2, 2, 1, 1, 12, 12, 9, 7, 4, 5, 4, 8, 5, 1, 4, 4, 3, + 3, 2, 2, 2, 2, 2, 76, 3, 31, 27, 26, 2, 7, 4, 4, 10, 10, 1, 1, 1, 1, 1, 1, 5, 3, 1, 7, 4, 4, 17, 3, 2, 9, 2, 2, 68, 7, 4, 4, 4, 4, + 4, 4, 4, 3, 3, 1, 1, 7, 7, 7, 7, 6, 3, 3, 3, 1, 1, 1, 1, 4, 18, 18, 6, 6, 7, 7, 7, 7, 5, 5, 7, 5, 1, 9, 5, 3, 3, 3, 3, 2, 2, + 4, 1, 1, 10, 5, 4, 1, 2, 2, 122,7, 3, 6, 5, 5, 9, 4, 4, 10, 10, 9, 6, 6, 2, 8, 2, 2, 6, 6, 51, 2, 1, 3, 3, 16, 1, 1, 4, 10, 2, 8, + 8, 8, 2, 3, 3, 2, 2, 2, 12, 8, 5, 8, 8, 8, 18, 11, 3, 2, 2, 2, 4, 3, 2, 2, 7, 7, 7, 7, 7, 8, 7, 6, 1, 2, 20, 3, 5, 5, 4, 4, 4, + 1, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 6, 1, 3, 3, 3, 3, 13, 4, 3, 3, 3, 1, 1, 9, 5, + 5, 28, 3, 2, 6, 2, 2, 2, 2, 1, 3, 7, 7, 2, 3, 3, 5, 5, 4, 21, 4, 3, 3, 3, 3, 1, 16, 5, 4, 4, 4, 1, 1, 1, 1, 1, 2, 2, 2, 8, 8, + 3, 2, 5, 2, 3, 3, 3, 3, 6, 13, 4, 8, 3, 2, 2, 23, 8, 4, 3, 3, 3, 3, 3, 7, 7, 7, 3, 5, 5, 4, 22, 5, 5, 2, 12, 5, 4, 4, 3, 3, 3, + 3, 3, 3, 3, 74, 16, 9, 5, 4, 1, 1, 6, 6, 6, 20, 3, 10, 9, 3, 7, 7, 2, 2, 2, 13, 11, 6, 5, 2, 2, 2, 12, 11, 3, 2, 2, 6, 6, 2, 2, 2, + 2, 2, 2, 2, 4, 5, 8, 8, 5, 5, 5, 5, 3, 20, 11, 4, 4, 3, 2, 2, 4, 4, 4, 4, 4, 8, 8, 8, 54, 3, 1, 1, 2, 2, 2, 2, 22, 5, 5, 8, 3, + 11, 1, 13, 5, 5, 5, 5, 6, 2, 84, 14, 2, 6, 3, 2, 4, 23, 10, 9, 5, 13, 7, 7, 5, 5, 5, 6, 27, 7, 3, 3, 14, 11, 11, 11, 3, 3, 3, 7, 7, 7, + 4, 1, 44, 5, 5, 2, 1, 1, 1, 4, 5, 2, 2, 16, 2, 1, 2, 4, 3, 3, 4, 4, 3, 110,6, 2, 2, 44, 2, 4, 5, 2, 26, 7, 6, 11, 9, 4, 3, 5, 2, + 6, 5, 2, 45, 8, 7, 19, 8, 2, 1, 1, 13, 8, 4, 4, 8, 2, 5, 5, 2, 2, 2, 12, 6, 4, 4, 4, 1, 1, 1, 11, 3, 6, 3, 38, 2, 1, 2, 6, 2, 2, + 3, 1, 1, 1, 1, 1, 2, 1, 4, 2, 2, 2, 2, 6, 3, 3, 1, 1, 3, 3, 2, 1, 1, 2, 1, 1, 3, 3, 2, 10, 7, 1, 1, 1, 6, 6, 1, 1, 1, 3, 3, + 3, 1, 1, 1, 9, 4, 2, 3, 2, 22, 1, 1, 1, 1, 2, 3, 2, 2, 1, 1, 1, 8, 1, 1, 1, 1, 1, 7, 7, 6, 12, 3, 2, 2, 1, 1, 1, 1, 1, 1, 4, + 2, 2, 2, 2, 1, 1, 2, 6, 65, 11, 4, 3, 9, 4, 9, 3, 3, 3, 4, 21, 4, 4, 3, 4, 2, 3, 2, 2, 2, 68, 1, 3, 4, 2, 2, 25, 9, 3, 18, 12, 11, + 3, 4, 4, 4, 11, 9, 9, 9, 9, 5, 3, 42, 4, 3, 2, 2, 1, 1, 16, 12, 5, 1, 5, 4, 2, 2, 34, 2, 1, 3, 3, 2, 12, 2, 2, 6, 1, 77, 10, 2, 2, + 2, 2, 2, 2, 7, 2, 3, 20, 4, 4, 7, 3, 2, 3, 2, 2, 10, 8, 3, 3, 2, 3, 1, 1, 1, 1, 5, 2, 19, 2, 1, 2, 4, 3, 1, 4, 16, 5, 3, 2, 3, + 2, 2, 14, 3, 2, 1, 1, 114,3, 6, 3, 3, 4, 1, 16, 2, 3, 2, 2, 3, 4, 2, 1, 11, 1, 1, 1, 1, 7, 30, 9, 6, 5, 2, 6, 3, 3, 4, 2, 5, 6, + 2, 4, 11, 11, 9, 8, 132,15, 1, 3, 3, 3, 4, 4, 1, 1, 1, 1, 1, 5, 6, 3, 3, 23, 8, 5, 5, 8, 6, 6, 6, 4, 3, 2, 2, 69, 2, 2, 59, 13, 9, + 3, 3, 10, 4, 22, 10, 3, 3, 5, 2, 4, 3, 2, 2, 6, 2, 1, 209,3, 3, 49, 4, 4, 7, 8, 6, 17, 6, 6, 2, 1, 1, 1, 4, 3, 2, 3, 23, 4, 6, 4, + 13, 1, 3, 2, 13, 5, 10, 6, 1, 1, 4, 5, 3, 2, 32, 8, 2, 2, 2, 2, 1, 1, 14, 8, 5, 4, 2, 16, 1, 5, 4, 16, 1, 3, 2, 1, 1, 1, 72, 3, 10, + 2, 5, 4, 4, 5, 3, 2, 2, 8, 3, 6, 2, 4, 18, 1, 1, 3, 2, 2, 3, 3, 23, 5, 2, 2, 2, 2, 7, 3, 3, 1, 1, 1, 1, 196,13, 2, 8, 3, 3, 4, + 14, 1, 3, 3, 3, 3, 22, 6, 2, 10, 5, 3, 18, 8, 1, 5, 5, 3, 17, 3, 4, 2, 1, 20, 5, 7, 6, 4, 1, 1, 1, 11, 7, 24, 7, 3, 2, 3, 2, 5, 4, + 2, 2, 3, 1, 11, 5, 4, 2, 2, 2, 38, 5, 5, 4, 1, 1, 9, 1, 7, 2, 1, 34, 4, 1, 3, 14, 5, 4, 1, 90, 3, 22, 11, 9, 1, 6, 6, 2, 2, 4, 27, + 4, 15, 3, 2, 5, 4, 4, 2, 3, 3, 4, 6, 4, 3, 3, 2, 16, 2, 11, 2, 1, 1, 1, 3, 1, 105,2, 9, 8, 1, 1, 7, 2, 3, 62, 7, 3, 3, 3, 3, 3, + 8, 6, 5, 6, 1, 3, 3, 3, 1, 2, 9, 4, 3, 2, 7, 1, 2, 3, 6, 2, 9, 2, 1, 1, 2, 2, 1, 1, 1, 10, 2, 2, 1, 12, 6, 3, 1, 242,4, 14, 4, + 6, 3, 13, 10, 4, 94, 3, 6, 2, 68, 59, 5, 9, 6, 3, 5, 3, 3, 3, 3, 2, 6, 2, 4, 3, 3, 4, 2, 11, 10, 14, 7, 2, 2, 18, 14, 11, 10, 4, 3, 5, + 11, 9, 3, 3, 7, 5, 5, 1, 7, 3, 3, 21, 4, 3, 3, 4, 3, 3, 5, 145,44, 9, 2, 2, 33, 3, 6, 2, 2, 3, 2, 3, 3, 3, 2, 2, 2, 3, 6, 4, 4, + 4, 4, 10, 1, 1, 1, 3, 2, 2, 10, 5, 3, 2, 22, 2, 14, 6, 2, 2, 2, 16, 6, 3, 5, 1, 2, 1, 91, 3, 3, 11, 2, 6, 2, 8, 7, 4, 4, 8, 8, 2, + 18, 13, 3, 2, 7, 4, 8, 3, 18, 15, 1, 5, 2, 2, 5, 4, 1, 1, 1, 1, 108,1, 1, 2, 4, 2, 2, 5, 5, 3, 2, 3, 2, 5, 2, 1, 13, 6, 8, 17, 5, + 9, 1, 1, 3, 6, 2, 5, 9, 3, 2, 1, 7, 5, 2, 1, 1, 1, 90, 2, 6, 4, 1, 3, 12, 4, 3, 2, 1, 1, 4, 2, 33, 1, 1, 1, 2, 1, 3, 3, 2, 2, + 11, 6, 3, 3, 6, 9, 8, 4, 5, 2, 2, 20, 3, 2, 2, 2, 3, 1, 1, 2, 2, 2, 11, 1, 1, 1, 1, 1, 1, 2, 1, 15, 1, 1, 5, 1, 1, 3, 2, 2, 1, + 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 15, 10, 1, 1, 4, 2, 73, 9, 2, 8, 3, 2, 10, 3, 12, 2, 4, 2, 9, 2, 8, 4, 3, 3, 3, 84, 14, 7, 4, + 3, 23, 6, 1, 1, 1, 9, 2, 6, 3, 3, 3, 1, 1, 1, 26, 1, 4, 3, 3, 4, 2, 3, 1, 8, 3, 46, 6, 3, 4, 20, 6, 2, 3, 1, 1, 1, 2, 4, 4, 4, + 4, 41, 7, 3, 9, 8, 3, 6, 1, 2, 2, 2, 4, 37, 2, 2, 22, 7, 4, 3, 4, 32, 8, 5, 2, 5, 5, 10, 5, 9, 3, 2, 37, 6, 1, 25, 2, 2, 2, 2, 2, + 4, 2, 1, 1, 3, 2, 44, 9, 5, 3, 1, 1, 4, 3, 12, 7, 2, 2, 75, 11, 2, 1, 15, 5, 3, 2, 1, 2, 2, 2, 6, 2, 2, 2, 2, 2, 3, 2, 2, 2, 11, + 3, 2, 3, 5, 3, 15, 4, 2, 4, 162,12, 2, 1, 4, 2, 2, 1, 13, 6, 5, 3, 2, 11, 2, 4, 2, 2, 7, 2, 3, 2, 1, 10, 3, 2, 1, 5, 3, 4, 22, 10, + 3, 2, 4, 4, 3, 5, 4, 6, 2, 2, 2, 4, 20, 6, 2, 4, 5, 2, 1, 1, 4, 2, 18, 2, 3, 5, 2, 6, 2, 5, 3, 2, 1, 1, 8, 2, 2, 2, 1, 56, 9, + 3, 8, 4, 21, 3, 2, 9, 2, 3, 2, 9, 8, 2, 5, 3, 3, 1, 9, 3, 4, 4, 3, 134,30, 3, 3, 10, 4, 2, 4, 1, 5, 12, 2, 2, 5, 3, 12, 3, 7, 4, + 2, 9, 3, 4, 10, 2, 2, 3, 12, 4, 3, 6, 1, 1, 6, 2, 2, 2, 2, 2, 2, 4, 1, 1, 51, 4, 7, 4, 3, 5, 3, 2, 3, 5, 4, 2, 2, 18, 5, 4, 5, + 3, 2, 36, 10, 10, 3, 3, 5, 3, 4, 1, 2, 1, 7, 11, 4, 3, 6, 3, 3, 4, 2, 2, 3, 9, 2, 3, 3, 3, 46, 14, 2, 1, 1, 8, 5, 1, 13, 11, 10, 5, + 3, 3, 8, 2, 4, 1, 1, 1, 5, 5, 2, 3, 102,7, 2, 6, 3, 10, 2, 9, 4, 3, 2, 1, 1, 9, 6, 6, 4, 2, 22, 15, 10, 7, 3, 1, 4, 4, 2, 2, 4, + 1, 1, 1, 1, 20, 1, 1, 1, 2, 1, 3, 3, 3, 1, 1, 1, 2, 3, 1, 1, 4, 3, 1, 1, 1, 30, 2, 1, 1, 1, 1, 14, 3, 1, 1, 5, 1, 1, 1, 1, 1, + 1, 1, 4, 1, 1, 1, 3, 2, 2, 7, 3, 3, 3, 3, 1, 1, 1, 7, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 4, 9, 4, 1, 1, 1, 36, 4, 27, 26, 10, 7, 8, 1, 3, 3, 92, 2, 3, 1, 2, 23, 7, 2, 2, 4, 3, 4, 3, 2, 1, 1, 18, 8, 4, 4, 4, 3, + 2, 5, 2, 21, 21, 2, 2, 4, 3, 3, 2, 2, 2, 4, 4, 4, 3, 78, 8, 5, 4, 45, 1, 4, 2, 2, 16, 13, 4, 4, 7, 2, 3, 2, 5, 10, 2, 2, 32, 2, 5, + 2, 3, 11, 8, 2, 2, 3, 2, 6, 6, 4, 3, 3, 3, 3, 89, 6, 14, 7, 2, 2, 1, 37, 4, 2, 27, 8, 3, 6, 3, 4, 2, 2, 4, 5, 10, 6, 8, 4, 3, 3, + 2, 184,20, 6, 1, 1, 4, 4, 4, 4, 4, 12, 12, 12, 9, 8, 5, 5, 4, 1, 37, 5, 3, 11, 1, 3, 1, 1, 5, 2, 2, 3, 3, 3, 5, 2, 1, 1, 11, 1, 1, + 1, 1, 1, 1, 1, 3, 2, 2, 2, 2, 2, 46, 2, 14, 1, 9, 1, 1, 3, 4, 10, 3, 2, 3, 3, 14, 2, 2, 2, 2, 2, 10, 10, 9, 6, 1, 39, 1, 1, 7, 1, + 1, 18, 17, 17, 2, 11, 5, 3, 2, 4, 2, 2, 2, 1, 1, 4, 3, 3, 10, 9, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 6, 2, 2, + 2, 2, 2, 2, 2, 2, 242,2, 1, 1, 20, 12, 8, 4, 3, 2, 2, 27, 13, 2, 3, 2, 2, 2, 3, 2, 5, 38, 4, 4, 1, 2, 21, 2, 2, 3, 3, 4, 4, 47, 1, + 1, 3, 4, 5, 5, 4, 7, 2, 2, 4, 18, 9, 9, 4, 1, 9, 2, 3, 22, 3, 5, 4, 3, 7, 7, 3, 6, 6, 5, 3, 5, 2, 5, 6, 4, 7, 2, 2, 21, 4, 4, + 4, 15, 15, 14, 9, 7, 6, 1, 1, 1, 2, 2, 19, 16, 15, 14, 1, 1, 5, 3, 3, 3, 30, 6, 4, 3, 2, 5, 2, 1, 1, 5, 1, 3, 2, 61, 2, 1, 1, 1, 1, + 1, 2, 40, 1, 13, 9, 9, 4, 1, 2, 1, 1, 1, 11, 6, 2, 4, 4, 4, 2, 2, 5, 3, 5, 5, 4, 2, 8, 4, 3, 3, 3, 1, 1, 1, 1, 1, 113,5, 2, 2, + 2, 2, 2, 12, 4, 6, 3, 31, 11, 1, 3, 2, 5, 4, 3, 3, 3, 2, 2, 1, 1, 1, 1, 1, 4, 11, 5, 4, 3, 3, 4, 19, 3, 3, 2, 2, 2, 2, 5, 3, 3, + 2, 1, 1, 6, 5, 4, 2, 1, 1, 1, 7, 7, 7, 3, 3, 3, 3, 50, 2, 5, 1, 1, 2, 2, 10, 6, 5, 20, 6, 4, 2, 2, 1, 3, 3, 4, 2, 2, 2, 207,4, + 35, 29, 12, 4, 5, 1, 3, 3, 4, 3, 6, 2, 2, 11, 5, 2, 3, 3, 4, 30, 9, 8, 1, 1, 1, 2, 4, 2, 17, 15, 3, 3, 2, 7, 3, 1, 16, 2, 2, 2, 2, + 2, 9, 5, 3, 26, 2, 1, 1, 5, 8, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 4, 2, 1, 1, 3, 3, 2, 1, 8, 3, 3, 51, 2, 2, 3, 3, 3, 30, 4, 22, + 7, 2, 4, 5, 4, 3, 3, 2, 1, 3, 1, 2, 3, 2, 1, 2, 2, 1, 1, 6, 2, 2, 14, 2, 2, 2, 2, 10, 9, 9, 1, 35, 5, 3, 3, 3, 3, 3, 2, 2, 2, + 2, 8, 1, 3, 1, 1, 3, 2, 5, 5, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 41, 6, 6, 6, 6, 6, 2, 2, 2, 2, 1, 1, 5, 5, 3, 4, 5, 2, 1, 1, 1, + 4, 3, 3, 3, 3, 2, 1, 3, 23, 7, 1, 2, 1, 1, 8, 1, 1, 6, 3, 2, 5, 2, 24, 8, 6, 2, 1, 4, 3, 7, 3, 4, 1, 152,8, 4, 4, 4, 70, 70, 5, + 5, 57, 11, 7, 3, 42, 1, 1, 1, 7, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 5, 4, 5, 4, 4, 4, 4, 4, 1, 1, 1, + 8, 2, 2, 2, 2, 2, 4, 4, 6, 4, 2, 2, 2, 1, 2, 1, 1, 1, 4, 1, 1, 1, 1, 7, 4, 4, 2, 4, 3, 3, 10, 9, 9, 8, 4, 17, 7, 4, 2, 2, 3, + 3, 3, 5, 5, 5, 5, 4, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 14, 9, 9, 4, 5, 4, 17, 4, 1, 3, 1, 4, 3, 3, 2, 12, 4, 2, 2, 1, 6, 5, 2, + 1, 94, 11, 5, 7, 5, 3, 4, 2, 1, 3, 3, 8, 7, 7, 7, 5, 15, 4, 3, 3, 3, 2, 8, 5, 1, 1, 2, 2, 16, 12, 6, 6, 6, 5, 1, 1, 1, 1, 14, 2, + 2, 4, 4, 124,9, 2, 3, 1, 1, 47, 3, 2, 1, 15, 7, 4, 2, 16, 6, 3, 3, 3, 3, 41, 2, 4, 3, 2, 2, 13, 11, 2, 2, 1, 3, 3, 7, 5, 2, 2, 5, + 1, 4, 2, 8, 2, 2, 4, 2, 1, 3, 22, 4, 1, 1, 1, 7, 4, 2, 3, 4, 2, 26, 2, 4, 5, 3, 6, 3, 2, 8, 4, 3, 40, 6, 1, 1, 3, 9, 2, 1, 2, + 1, 4, 2, 2, 3, 2, 2, 6, 2, 7, 1, 11, 4, 4, 27, 7, 4, 17, 3, 3, 2, 9, 1, 15, 6, 4, 3, 3, 8, 5, 2, 7, 1, 2, 36, 4, 4, 4, 3, 17, 2, + 2, 7, 5, 4, 2, 1, 1, 96, 29, 4, 2, 18, 1, 1, 2, 7, 6, 6, 6, 2, 26, 5, 3, 5, 4, 4, 4, 4, 11, 1, 3, 5, 5, 5, 4, 1, 7, 1, 5, 10, 5, + 3, 2, 1, 2, 1, 1, 18, 6, 1, 3, 3, 2, 2, 2, 6, 5, 3, 4, 3, 43, 9, 5, 2, 28, 3, 9, 8, 5, 4, 6, 4, 3, 2, 2, 59, 11, 2, 8, 18, 7, 7, + 10, 9, 4, 5, 3, 6, 5, 3, 6, 8, 40, 11, 3, 3, 14, 2, 6, 8, 4, 2, 3, 14, 3, 7, 6, 5, 5, 70, 6, 5, 5, 2, 5, 1, 1, 1, 13, 12, 10, 9, 1, + 9, 8, 4, 4, 4, 14, 3, 3, 10, 10, 5, 9, 3, 3, 5, 5, 4, 4, 4, 8, 4, 4, 6, 2, 2, 2, 11, 9, 1, 1, 1, 1, 24, 5, 6, 6, 9, 4, 4, 4, 3, + 3, 3, 3, 3, 1, 1, 1, 2, 90, 15, 2, 3, 3, 5, 5, 5, 2, 4, 1, 2, 2, 2, 2, 1, 8, 7, 7, 7, 10, 4, 2, 5, 5, 8, 24, 7, 6, 2, 4, 9, 4, + 5, 11, 5, 5, 5, 5, 2, 4, 1, 1, 8, 8, 8, 2, 6, 6, 2, 2, 4, 4, 4, 100,6, 5, 27, 12, 8, 8, 4, 8, 3, 6, 4, 3, 37, 4, 1, 2, 2, 2, 1, + 1, 2, 1, 4, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 11, 1, 1, 7, 6, 3, 4, 3, 3, 1, 6, 4, 2, 6, 6, 1, 26, 17, 16, 9, 18, 1, 1, 1, 3, 9, + 9, 8, 7, 1, 120,9, 2, 4, 2, 2, 1, 1, 37, 2, 2, 2, 23, 5, 2, 2, 4, 4, 5, 4, 4, 3, 2, 3, 11, 11, 10, 34, 7, 5, 4, 19, 4, 3, 6, 5, 5, + 10, 7, 6, 3, 3, 3, 2, 9, 9, 1, 11, 5, 5, 4, 1, 1, 10, 10, 8, 6, 3, 2, 23, 7, 6, 14, 5, 5, 5, 5, 2, 2, 5, 2, 1, 1, 1, 18, 3, 5, 5, + 4, 1, 1, 1, 2, 20, 5, 1, 1, 4, 3, 1, 3, 3, 1, 1, 1, 5, 5, 5, 5, 32, 3, 16, 7, 2, 6, 6, 5, 12, 10, 7, 2, 1, 37, 2, 1, 1, 6, 3, 3, + 3, 3, 8, 4, 8, 123,8, 1, 1, 3, 3, 32, 3, 26, 4, 4, 4, 9, 9, 9, 8, 11, 1, 4, 2, 2, 2, 6, 6, 5, 5, 5, 16, 3, 3, 8, 7, 6, 42, 14, 3, + 6, 4, 4, 3, 16, 1, 5, 4, 4, 4, 4, 3, 5, 1, 3, 3, 2, 8, 6, 6, 6, 6, 1, 30, 8, 6, 6, 6, 1, 19, 8, 8, 8, 7, 7, 7, 7, 5, 5, 7, 4, + 2, 3, 7, 1, 4, 4, 14, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 146,7, 1, 1, 1, 1, 1, 2, 2, 1, 2, 2, 1, 5, 3, 15, 8, + 2, 2, 4, 4, 4, 2, 2, 7, 3, 72, 7, 2, 2, 2, 10, 9, 6, 6, 2, 3, 3, 3, 7, 2, 2, 5, 5, 3, 3, 3, 2, 2, 2, 1, 1, 7, 7, 3, 3, 2, 15, + 5, 5, 5, 5, 4, 4, 6, 3, 3, 13, 2, 5, 5, 3, 3, 6, 4, 3, 1, 1, 4, 11, 3, 4, 3, 2, 19, 7, 5, 5, 3, 7, 2, 3, 1, 2, 65, 65, 29, 18, 12, + 5, 11, 4, 4, 1, 1, 1, 3, 3, 2, 2, 32, 1, 1, 5, 2, 2, 2, 3, 2, 7, 5, 8, 7, 6, 6, 6, 28, 1, 4, 4, 12, 4, 2, 1, 2, 12, 5, 2, 1, 1, + 2, 8, 1, 1, 3, 3, 15, 3, 3, 2, 25, 3, 2, 7, 7, 3, 2, 2, 1, 1, 1, 2, 3, 3, 1, 9, 2, 1, 1, 6, 2, 2, 2, 6, 49, 24, 6, 3, 5, 1, 7, + 4, 3, 1, 2, 1, 1, 3, 3, 2, 7, 4, 1, 19, 8, 7, 6, 2, 4, 3, 11, 2, 2, 1, 5, 3, 3, 1, 1, 25, 4, 1, 2, 8, 6, 5, 7, 4, 19, 1, 4, 3, + 5, 5, 4, 3, 2, 23, 8, 4, 3, 1, 1, 4, 2, 6, 2, 12, 2, 1, 3, 9, 3, 3, 2, 1, 1, 1, 10, 2, 7, 7, 5, 3, 2, 1, 9, 7, 7, 2, 2, 2, 1, + 5, 4, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 6, 2, 1, 4, 2, 2, 2, 102,44, 2, 1, 1, 1, 14, 9, 3, 2, 4, 2, 12, 7, 3, 7, 23, 2, 3, 14, + 5, 4, 2, 2, 24, 5, 3, 1, 1, 11, 3, 3, 2, 4, 3, 7, 2, 1, 2, 4, 3, 2, 2, 2, 13, 3, 1, 1, 2, 2, 3, 24, 3, 7, 9, 2, 1, 2, 2, 2, 2, + 2, 2, 5, 2, 2, 15, 4, 5, 4, 3, 2, 4, 4, 6, 1, 3, 2, 2, 2, 2, 2, 77, 13, 1, 4, 3, 24, 2, 2, 6, 3, 2, 10, 5, 5, 1, 1, 14, 9, 5, 3, + 3, 3, 2, 5, 13, 3, 3, 3, 4, 3, 2, 17, 16, 6, 3, 10, 1, 1, 3, 2, 2, 47, 11, 4, 19, 2, 10, 5, 5, 5, 5, 1, 1, 7, 2, 3, 2, 2, 3, 130,27, + 10, 6, 6, 2, 4, 3, 3, 2, 2, 2, 42, 4, 4, 4, 4, 1, 1, 5, 11, 1, 1, 3, 2, 6, 3, 2, 3, 3, 12, 9, 9, 11, 1, 2, 22, 6, 4, 2, 9, 6, 5, + 3, 1, 3, 7, 3, 3, 2, 3, 3, 1, 1, 1, 1, 140,6, 15, 1, 9, 3, 4, 3, 1, 1, 1, 1, 6, 6, 6, 4, 2, 56, 6, 5, 13, 4, 8, 2, 2, 10, 4, 4, + 4, 2, 19, 6, 4, 2, 13, 5, 5, 5, 5, 5, 4, 4, 4, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 8, 1, 2, 8, 1, 1, 2, 2, 5, 3, 2, 4, 2, 2, 14, 4, + 4, 2, 3, 1, 1, 4, 4, 4, 4, 170,5, 8, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 6, 4, 2, 2, 14, 12, 12, 8, 2, 2, 2, 2, 2, 14, 3, 4, 1, 1, + 1, 2, 4, 1, 2, 2, 5, 15, 1, 1, 11, 3, 3, 3, 5, 4, 2, 2, 1, 1, 1, 1, 1, 1, 66, 5, 3, 2, 3, 2, 4, 3, 3, 40, 2, 1, 6, 1, 1, 1, 1, + 1, 1, 1, 2, 1, 1, 2, 11, 6, 1, 1, 1, 7, 1, 1, 1, 2, 1, 3, 1, 15, 1, 1, 5, 4, 4, 7, 3, 2, 2, 9, 2, 1, 2, 2, 2, 1, 1, 1, 2, 1, + 2, 2, 80, 7, 6, 10, 9, 9, 39, 3, 3, 20, 20, 20, 17, 6, 5, 2, 3, 6, 8, 8, 7, 7, 7, 1, 1, 1, 1, 1, 1, 3, 5, 1, 1, 121,15, 3, 4, 25, 6, + 2, 10, 5, 5, 72, 2, 2, 2, 6, 4, 5, 4, 3, 3, 4, 7, 2, 2, 2, 2, 8, 3, 10, 4, 3, 13, 5, 4, 4, 3, 3, 5, 9, 9, 8, 6, 1, 35, 7, 7, 7, + 4, 2, 2, 9, 3, 2, 4, 3, 2, 2, 3, 22, 12, 6, 6, 5, 5, 4, 6, 2, 33, 7, 2, 9, 3, 2, 5, 4, 3, 2, 2, 3, 2, 3, 34, 7, 3, 3, 3, 3, 4, + 5, 5, 5, 2, 14, 9, 9, 6, 2, 2, 3, 3, 3, 3, 3, 3, 110,11, 4, 4, 4, 7, 36, 5, 14, 8, 6, 5, 4, 2, 8, 8, 6, 5, 5, 5, 2, 4, 4, 8, 7, + 7, 7, 6, 1, 17, 13, 5, 6, 19, 7, 4, 12, 8, 8, 3, 5, 3, 3, 3, 3, 3, 3, 8, 6, 5, 2, 2, 2, 2, 2, 8, 1, 1, 5, 4, 46, 17, 15, 15, 8, 4, + 13, 13, 7, 4, 4, 10, 2, 2, 1, 28, 10, 7, 7, 7, 4, 11, 8, 8, 8, 3, 4, 4, 3, 25, 4, 3, 3, 5, 10, 10, 7, 6, 4, 3, 3, 3, 5, 3, 2, 2, 23, + 2, 2, 7, 2, 2, 2, 5, 1, 4, 4, 4, 1, 1, 1, 3, 1, 1, 168,17, 13, 6, 7, 5, 4, 4, 2, 52, 10, 10, 5, 8, 8, 6, 4, 5, 3, 10, 7, 3, 3, 19, + 15, 5, 5, 9, 9, 9, 9, 3, 4, 6, 6, 41, 7, 3, 3, 3, 30, 9, 9, 3, 11, 7, 6, 6, 4, 29, 5, 5, 5, 5, 3, 7, 7, 12, 5, 4, 20, 18, 18, 18, 9, + 6, 6, 2, 2, 2, 3, 1, 2, 2, 2, 2, 114,3, 31, 1, 1, 1, 1, 1, 19, 7, 9, 7, 11, 6, 6, 3, 3, 3, 11, 9, 3, 5, 5, 5, 9, 5, 5, 3, 2, 60, + 42, 2, 11, 1, 1, 2, 2, 2, 2, 2, 3, 1, 1, 1, 1, 1, 2, 1, 3, 3, 3, 3, 3, 3, 4, 2, 4, 3, 3, 3, 2, 2, 2, 1, 1, 5, 4, 4, 4, 4, 1, + 13, 13, 2, 6, 2, 1, 1, 2, 6, 2, 2, 2, 2, 2, 1, 1, 55, 3, 1, 1, 1, 1, 1, 1, 2, 1, 33, 5, 3, 3, 2, 1, 1, 1, 5, 3, 2, 7, 2, 2, 4, + 2, 2, 2, 4, 2, 2, 1, 3, 1, 19, 1, 1, 7, 1, 2, 1, 2, 1, 1, 3, 2, 1, 7, 1, 1, 1, 1, 4, 3, 2, 1, 1, 7, 1, 1, 1, 2, 1, 2, 2, 2, + 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 70, 2, 2, 2, 7, 3, 3, 2, 18, 5, 4, 5, 4, 4, 3, 1, 26, 2, 20, 13, 8, 3, 3, + 4, 3, 78, 22, 1, 2, 4, 2, 2, 2, 4, 2, 1, 1, 1, 1, 1, 1, 18, 3, 10, 9, 9, 4, 3, 2, 2, 20, 4, 4, 4, 10, 8, 4, 6, 5, 4, 23, 2, 9, 3, + 12, 1, 4, 2, 5, 2, 2, 2, 33, 6, 5, 10, 3, 4, 3, 3, 4, 2, 28, 2, 2, 1, 1, 3, 2, 3, 2, 11, 6, 6, 1, 1, 1, 3, 115,1, 1, 2, 3, 14, 2, + 10, 7, 3, 59, 5, 3, 1, 4, 2, 2, 6, 4, 3, 2, 3, 8, 2, 3, 2, 3, 2, 2, 2, 1, 2, 4, 5, 3, 3, 5, 2, 12, 11, 4, 4, 4, 5, 2, 12, 6, 3, + 2, 2, 2, 157,10, 2, 2, 35, 4, 1, 26, 23, 4, 3, 4, 2, 7, 3, 2, 2, 3, 17, 8, 6, 2, 2, 2, 2, 41, 1, 1, 7, 3, 2, 8, 5, 6, 12, 5, 5, 3, + 2, 1, 1, 1, 1, 1, 1, 16, 7, 5, 2, 10, 4, 4, 1, 2, 3, 42, 4, 2, 1, 3, 26, 2, 2, 2, 18, 11, 8, 6, 3, 2, 5, 2, 119,8, 6, 6, 2, 9, 5, + 6, 2, 3, 8, 6, 2, 1, 14, 4, 5, 3, 5, 2, 44, 29, 1, 1, 1, 1, 20, 7, 5, 5, 5, 2, 5, 5, 3, 3, 2, 3, 2, 221,1, 24, 3, 5, 2, 2, 4, 5, + 14, 5, 3, 2, 1, 5, 2, 1, 5, 5, 22, 4, 9, 3, 2, 1, 1, 3, 8, 5, 30, 4, 3, 5, 4, 2, 2, 1, 13, 6, 9, 3, 4, 4, 2, 2, 37, 12, 7, 3, 9, + 3, 4, 1, 3, 2, 8, 3, 1, 11, 3, 1, 3, 80, 18, 17, 5, 2, 1, 1, 1, 2, 1, 10, 7, 6, 6, 10, 2, 4, 2, 28, 2, 8, 2, 4, 2, 2, 96, 12, 8, 3, + 6, 3, 5, 3, 6, 20, 13, 10, 3, 12, 4, 6, 3, 1, 1, 1, 1, 1, 1, 4, 2, 2, 9, 4, 82, 7, 3, 7, 4, 1, 1, 3, 3, 26, 2, 1, 10, 5, 3, 3, 3, + 6, 7, 1, 1, 1, 5, 17, 4, 2, 2, 2, 7, 3, 3, 2, 55, 6, 2, 7, 3, 3, 7, 3, 29, 19, 13, 12, 9, 9, 9, 4, 3, 4, 3, 2, 14, 2, 3, 5, 14, 2, + 1, 5, 2, 2, 16, 5, 2, 2, 7, 5, 3, 3, 2, 1, 1, 9, 1, 2, 2, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 3, 1, 1, 1, 1, + 1, 1, 2, 1, 1, 1, 1, 1, 1, 63, 8, 3, 2, 18, 3, 4, 7, 20, 11, 11, 11, 3, 7, 7, 6, 3, 13, 2, 1, 6, 3, 3, 3, 2, 1, 1, 16, 2, 6, 4, 3, + 3, 1, 1, 63, 3, 6, 5, 3, 34, 28, 16, 2, 9, 4, 4, 1, 5, 5, 2, 2, 12, 11, 3, 2, 2, 47, 2, 13, 3, 3, 12, 5, 3, 2, 2, 1, 11, 3, 2, 2, 1, + 14, 4, 7, 2, 50, 4, 2, 2, 2, 2, 11, 2, 1, 4, 7, 11, 2, 2, 5, 5, 3, 2, 2, 148,3, 2, 2, 2, 3, 21, 3, 2, 2, 3, 4, 3, 1, 1, 1, 2, 2, + 2, 46, 19, 14, 3, 4, 4, 3, 8, 1, 2, 5, 29, 6, 7, 2, 5, 4, 6, 5, 3, 6, 6, 3, 7, 1, 14, 4, 2, 2, 23, 4, 2, 2, 10, 8, 7, 3, 2, 98, 13, + 7, 3, 2, 3, 15, 7, 5, 3, 9, 3, 2, 2, 2, 2, 2, 6, 1, 1, 8, 3, 19, 10, 2, 5, 1, 1, 1, 5, 2, 3, 3, 6, 3, 3, 3, 2, 2, 6, 1, 2, 4, + 2, 2, 2, 1, 1, 8, 1, 3, 3, 1, 13, 9, 5, 4, 4, 3, 3, 15, 8, 5, 2, 2, 2, 2, 17, 3, 5, 2, 2, 5, 4, 1, 1, 3, 4, 2, 1, 1, 20, 3, 2, + 6, 4, 7, 37, 16, 11, 10, 4, 2, 6, 1, 2, 4, 2, 10, 3, 3, 108,36, 1, 2, 7, 3, 16, 2, 10, 4, 20, 1, 5, 5, 27, 6, 3, 6, 3, 3, 12, 2, 2, 2, + 2, 1, 1, 1, 1, 2, 2, 8, 2, 2, 2, 4, 3, 17, 15, 12, 11, 4, 6, 2, 4, 32, 3, 2, 4, 2, 18, 3, 9, 7, 2, 1, 1, 1, 2, 39, 5, 5, 3, 2, 2, + 6, 6, 5, 12, 8, 6, 2, 3, 22, 8, 4, 2, 7, 7, 3, 2, 2, 2, 2, 6, 3, 3, 5, 3, 9, 4, 3, 3, 2, 12, 2, 1, 1, 1, 1, 5, 5, 4, 3, 1, 1, + 2, 1, 1, 9, 1, 1, 1, 3, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 1, 1, 1, 4, 1, 3, 3, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 18, 2, 1, 7, 4, 3, 2, 2, 23, 3, 3, 1, 1, 1, 13, 4, 2, 2, 6, 2, 1, 1, 1, 1, 1, 41, 2, 6, 4, 17, 1, 7, 4, 1, 2, + 1, 10, 10, 8, 8, 3, 3, 2, 29, 2, 6, 1, 12, 7, 4, 2, 2, 2, 2, 63, 3, 1, 2, 3, 4, 2, 2, 1, 4, 16, 15, 4, 4, 2, 5, 16, 3, 3, 2, 8, 3, + 3, 2, 20, 5, 4, 4, 1, 9, 2, 2, 3, 70, 5, 4, 2, 2, 8, 4, 2, 12, 12, 2, 2, 3, 3, 5, 2, 28, 11, 4, 4, 2, 7, 2, 17, 5, 3, 7, 3, 3, 1, + 5, 2, 149,13, 3, 3, 3, 4, 1, 2, 5, 11, 3, 3, 2, 40, 2, 3, 2, 2, 2, 24, 3, 6, 3, 3, 10, 3, 4, 4, 30, 9, 9, 6, 5, 17, 3, 3, 3, 7, 2, + 4, 10, 5, 3, 2, 3, 3, 3, 205,36, 19, 2, 2, 2, 9, 4, 12, 11, 7, 4, 2, 2, 12, 8, 16, 1, 1, 1, 1, 1, 4, 23, 4, 4, 4, 25, 3, 20, 20, 2, 6, + 2, 2, 4, 4, 3, 1, 2, 21, 10, 3, 3, 3, 16, 1, 1, 8, 4, 3, 2, 2, 2, 5, 5, 5, 4, 2, 28, 13, 3, 8, 4, 2, 1, 1, 6, 1, 1, 1, 2, 3, 2, + 2, 2, 33, 3, 26, 3, 1, 2, 11, 5, 3, 10, 3, 2, 2, 1, 1, 1, 1, 1, 3, 1, 1, 2, 1, 123,81, 5, 16, 4, 2, 2, 5, 1, 3, 2, 2, 4, 9, 5, 5, + 5, 3, 4, 1, 3, 4, 5, 3, 10, 8, 2, 4, 2, 2, 9, 5, 3, 3, 2, 2, 11, 3, 2, 1, 1, 1, 1, 15, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, + 2, 109,2, 19, 3, 3, 13, 2, 5, 2, 59, 10, 3, 2, 3, 15, 8, 3, 4, 2, 6, 4, 2, 2, 1, 2, 1, 1, 1, 10, 3, 2, 4, 4, 4, 10, 3, 2, 71, 2, 6, + 6, 3, 1, 1, 1, 2, 4, 3, 16, 6, 4, 3, 32, 3, 7, 5, 5, 3, 2, 2, 3, 2, 1, 3, 1, 1, 1, 2, 1, 1, 2, 2, 2, 4, 3, 2, 1, 1, 3, 3, 2, + 1, 1, 1, 11, 10, 17, 5, 6, 6, 3, 10, 1, 3, 1, 1, 1, 3, 3, 3, 1, 1, 31, 1, 1, 1, 1, 5, 4, 2, 1, 1, 1, 1, 1, 3, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 19, 2, 1, 13, 13, 10, 9, 9, 7, 4, 4, 3, 3, 235,8, 3, 3, 23, 5, 4, 3, 6, 3, 4, 2, 5, 9, 31, 3, 2, 12, 4, 2, 2, + 2, 7, 6, 5, 4, 1, 1, 1, 26, 3, 2, 6, 3, 6, 3, 8, 4, 26, 24, 4, 4, 1, 1, 1, 43, 4, 2, 3, 2, 6, 13, 10, 6, 2, 3, 2, 9, 3, 2, 23, 2, + 1, 6, 12, 6, 5, 1, 1, 2, 1, 135,6, 2, 2, 11, 5, 5, 2, 7, 1, 1, 5, 17, 2, 5, 4, 1, 13, 9, 6, 6, 1, 2, 3, 1, 1, 1, 1, 13, 5, 6, 14, + 2, 3, 2, 2, 11, 7, 8, 4, 4, 9, 9, 2, 2, 2, 1, 1, 3, 2, 2, 2, 14, 6, 2, 1, 1, 90, 11, 10, 3, 8, 3, 3, 6, 5, 5, 2, 26, 6, 5, 11, 5, + 3, 3, 19, 1, 11, 6, 8, 7, 2, 3, 6, 4, 176,9, 8, 9, 7, 3, 3, 5, 3, 1, 4, 3, 24, 13, 3, 3, 2, 2, 3, 3, 9, 3, 2, 7, 65, 5, 26, 15, 5, + 5, 4, 4, 26, 6, 5, 2, 1, 1, 7, 5, 5, 5, 4, 10, 2, 11, 3, 3, 8, 4, 3, 16, 12, 10, 4, 1, 87, 8, 6, 11, 2, 3, 5, 5, 4, 2, 2, 5, 4, 2, + 5, 2, 1, 1, 6, 5, 11, 10, 3, 3, 3, 3, 5, 3, 1, 1, 3, 6, 9, 3, 2, 2, 1, 1, 1, 1, 1, 36, 2, 3, 2, 2, 2, 7, 6, 4, 2, 2, 2, 3, 3, + 3, 2, 1, 3, 4, 1, 1, 3, 1, 1, 1, 1, 9, 4, 2, 19, 6, 8, 8, 3, 13, 3, 5, 3, 14, 2, 1, 1, 3, 4, 3, 2, 2, 2, 29, 2, 6, 4, 2, 7, 3, + 3, 6, 4, 14, 2, 5, 4, 2, 96, 3, 8, 4, 12, 4, 26, 9, 5, 4, 4, 3, 5, 1, 30, 2, 2, 1, 5, 9, 4, 11, 11, 4, 3, 3, 2, 8, 4, 4, 4, 74, 2, + 21, 5, 4, 2, 4, 4, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 4, 3, 31, 11, 3, 3, 3, 1, 8, 4, 2, 14, 7, 3, 1, 87, 7, 4, 2, 2, 2, 13, 1, 1, 7, + 4, 4, 3, 54, 18, 15, 15, 13, 2, 2, 3, 1, 5, 1, 1, 4, 4, 2, 8, 2, 2, 2, 2, 18, 3, 2, 2, 1, 19, 2, 6, 1, 8, 5, 3, 20, 9, 3, 5, 31, 4, + 2, 5, 2, 2, 2, 2, 96, 3, 4, 12, 7, 7, 7, 4, 4, 4, 3, 2, 4, 3, 3, 3, 3, 1, 1, 1, 1, 6, 4, 3, 3, 30, 5, 5, 5, 4, 4, 4, 15, 3, 2, + 3, 5, 5, 4, 1, 4, 1, 9, 2, 5, 5, 5, 39, 2, 19, 12, 2, 2, 2, 2, 4, 8, 5, 4, 6, 4, 2, 4, 2, 14, 7, 2, 4, 162,27, 1, 12, 9, 3, 3, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 3, 9, 2, 6, 3, 3, 111,111,111,99, 12, 19, 2, 8, 2, 6, 3, 2, 2, 12, 9, 6, 5, 36, 4, 4, 5, 3, 3, 7, + 2, 1, 2, 66, 3, 1, 6, 2, 5, 1, 1, 15, 3, 2, 1, 5, 2, 2, 3, 17, 2, 14, 6, 5, 5, 5, 5, 4, 6, 5, 5, 2, 3, 2, 49, 4, 2, 5, 2, 2, 19, + 3, 6, 6, 6, 3, 10, 8, 6, 2, 11, 2, 1, 1, 1, 1, 1, 1, 3, 2, 2, 3, 88, 5, 3, 14, 22, 17, 4, 4, 4, 5, 4, 5, 4, 4, 4, 2, 2, 25, 1, 1, + 1, 1, 1, 1, 1, 2, 2, 4, 6, 5, 8, 14, 10, 35, 4, 3, 1, 1, 4, 4, 2, 4, 2, 4, 3, 2, 2, 3, 1, 1, 5, 2, 2, 2, 1, 1, 1, 1, 1, 4, 2, + 2, 2, 19, 3, 2, 11, 5, 5, 4, 3, 1, 23, 3, 3, 3, 2, 7, 5, 5, 5, 2, 4, 3, 2, 17, 4, 3, 3, 3, 6, 2, 4, 14, 9, 184,85, 4, 19, 14, 9, 3, + 3, 4, 16, 4, 11, 7, 21, 3, 11, 6, 3, 18, 4, 2, 3, 3, 3, 3, 2, 1, 1, 1, 2, 56, 11, 9, 2, 2, 2, 2, 1, 6, 3, 3, 3, 3, 1, 9, 3, 3, 6, + 2, 4, 2, 2, 2, 6, 2, 8, 3, 15, 6, 3, 1, 20, 8, 3, 3, 2, 1, 3, 19, 9, 7, 1, 5, 4, 5, 17, 5, 2, 2, 4, 4, 2, 2, 2, 2, 1, 6, 12, 6, 4, 2, 2, 2, 1, 1, 1, 1, 1, 23, 18, 1, 1, 4, 3, 3, 8, 3, 5, 4, 76, 12, 25, 2, 19, 18, 11, 6, 4, 5, 3, 7, 3, 2, 13, 1, 11, 7, 4, 3, 133, - 2, 11, 3, 2, 3, 3, 2, 20, 3, 12, 11, 2, 8, 4, 3, 15, 7, 7, 6, 4, 15, 8, 3, 2, 3, 2, 3, 14, 3, 6, 6, 2, 1, 8, 5, 1, 1, 6, 11, 3, 3, - 2, 2, 43, 4, 3, 3, 8, 3, 4, 4, 4, 2, 2, 5, 3, 3, 6, 3, 1, 2, 5, 3, 1, 1, 1, 11, 3, 3, 2, 2, 2, 27, 10, 10, 2, 2, 3, 2, 4, 8, 8, - 8, 8, 5, 6, 3, 3, 28, 8, 5, 15, 6, 11, 2, 12, 10, 7, 6, 3, 2, 2, 2, 15, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 229,5, 3, 16, 3, 2, 9, 17, 6, - 4, 2, 2, 2, 1, 76, 33, 9, 3, 2, 2, 8, 6, 6, 6, 4, 3, 2, 2, 15, 14, 6, 6, 3, 11, 3, 2, 2, 18, 3, 3, 3, 1, 1, 4, 8, 8, 5, 7, 10, 8, - 2, 28, 4, 6, 4, 2, 2, 6, 3, 5, 29, 5, 5, 2, 2, 2, 3, 4, 10, 2, 2, 2, 2, 6, 4, 1, 1, 159,1, 4, 2, 2, 7, 4, 10, 3, 2, 2, 2, 1, 19, - 8, 1, 4, 6, 2, 2, 5, 1, 1, 7, 3, 3, 16, 2, 3, 2, 1, 47, 4, 6, 2, 2, 1, 1, 29, 3, 1, 5, 9, 6, 6, 2, 1, 3, 18, 2, 2, 1, 12, 2, 3, - 3, 3, 3, 3, 3, 2, 49, 3, 2, 3, 3, 4, 14, 13, 2, 2, 5, 10, 2, 2, 2, 6, 6, 1, 19, 3, 1, 6, 4, 1, 1, 1, 1, 1, 1, 1, 5, 3, 7, 5, 5, - 2, 114,4, 3, 2, 104,1, 1, 3, 12, 2, 7, 2, 5, 3, 9, 6, 3, 2, 11, 8, 2, 2, 5, 5, 4, 5, 8, 6, 3, 2, 5, 2, 19, 16, 15, 1, 1, 11, 4, 4, - 30, 7, 1, 1, 5, 5, 11, 1, 4, 4, 3, 3, 2, 3, 3, 4, 1, 1, 1, 1, 1, 1, 26, 6, 2, 4, 5, 1, 4, 3, 5, 3, 10, 9, 2, 2, 1, 1, 1, 3, 19, - 1, 18, 1, 3, 2, 4, 3, 2, 14, 2, 2, 1, 8, 1, 1, 89, 2, 4, 3, 2, 10, 8, 8, 5, 2, 2, 1, 1, 2, 2, 2, 5, 3, 35, 5, 2, 10, 3, 4, 4, 5, - 2, 2, 2, 3, 3, 3, 5, 3, 2, 16, 3, 1, 1, 4, 3, 6, 119,7, 2, 2, 21, 3, 1, 16, 14, 14, 14, 10, 8, 5, 28, 8, 6, 6, 6, 6, 6, 6, 9, 7, 5, - 4, 3, 3, 3, 3, 7, 3, 3, 3, 1, 1, 1, 8, 4, 2, 3, 2, 11, 1, 1, 3, 15, 4, 4, 3, 7, 3, 2, 5, 4, 1, 1, 1, 1, 1, 1, 1, 1, 2, 103,8, - 3, 4, 4, 2, 5, 7, 4, 9, 6, 3, 2, 2, 21, 6, 2, 5, 9, 6, 5, 2, 8, 3, 4, 2, 15, 3, 8, 7, 6, 2, 1, 1, 6, 1, 1, 2, 46, 2, 2, 7, 2, - 2, 6, 3, 3, 13, 4, 2, 4, 4, 9, 3, 2, 31, 3, 2, 3, 13, 12, 5, 1, 9, 6, 2, 4, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 52, 2, 2, 3, 1, 1, - 1, 1, 1, 9, 2, 2, 2, 2, 2, 3, 3, 3, 2, 1, 1, 3, 13, 9, 1, 1, 6, 5, 9, 1, 1, 1, 1, 1, 1, 7, 2, 5, 2, 4, 3, 3, 3, 4, 4, 4, 2, - 2, 4, 1, 3, 4, 2, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 9, 3, 72, 10, 2, 3, 14, 5, 3, 6, 4, 6, 1, 1, 1, 9, 3, 3, 21, 3, 2, 16, - 14, 13, 13, 3, 4, 40, 3, 4, 7, 4, 1, 1, 3, 4, 1, 1, 4, 2, 2, 25, 2, 2, 6, 3, 8, 4, 10, 1, 9, 33, 4, 4, 5, 7, 7, 5, 3, 3, 5, 3, 9, - 2, 50, 3, 2, 8, 2, 15, 5, 3, 2, 3, 2, 2, 3, 3, 10, 2, 2, 2, 9, 5, 4, 2, 56, 5, 4, 8, 3, 6, 7, 2, 9, 4, 3, 3, 3, 2, 6, 3, 8, 3, - 3, 5, 2, 24, 6, 3, 2, 5, 4, 2, 2, 1, 33, 5, 4, 1, 1, 1, 5, 4, 4, 2, 1, 9, 2, 2, 124,29, 5, 6, 4, 4, 2, 3, 2, 1, 1, 1, 29, 6, 4, - 6, 4, 37, 6, 3, 2, 2, 2, 2, 7, 3, 3, 2, 2, 2, 13, 3, 2, 8, 2, 7, 2, 7, 4, 6, 5, 18, 11, 8, 5, 2, 5, 3, 4, 123,8, 2, 35, 4, 1, 7, + 2, 11, 3, 2, 3, 3, 2, 20, 3, 12, 11, 2, 8, 4, 3, 15, 7, 7, 6, 4, 15, 8, 3, 2, 3, 2, 3, 14, 3, 6, 6, 2, 1, 8, 5, 1, 1, 6, 11, 3, 3, + 2, 2, 43, 4, 3, 3, 8, 3, 4, 4, 4, 2, 2, 5, 3, 3, 6, 3, 1, 2, 5, 3, 1, 1, 1, 11, 3, 3, 2, 2, 2, 27, 10, 10, 2, 2, 3, 2, 4, 8, 8, + 8, 8, 5, 6, 3, 3, 28, 8, 5, 15, 6, 11, 2, 12, 10, 7, 6, 3, 2, 2, 2, 15, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 229,5, 3, 16, 3, 2, 9, 17, 6, + 4, 2, 2, 2, 1, 76, 33, 9, 3, 2, 2, 8, 6, 6, 6, 4, 3, 2, 2, 15, 14, 6, 6, 3, 11, 3, 2, 2, 18, 3, 3, 3, 1, 1, 4, 8, 8, 5, 7, 10, 8, + 2, 28, 4, 6, 4, 2, 2, 6, 3, 5, 29, 5, 5, 2, 2, 2, 3, 4, 10, 2, 2, 2, 2, 6, 4, 1, 1, 159,1, 4, 2, 2, 7, 4, 10, 3, 2, 2, 2, 1, 19, + 8, 1, 4, 6, 2, 2, 5, 1, 1, 7, 3, 3, 16, 2, 3, 2, 1, 47, 4, 6, 2, 2, 1, 1, 29, 3, 1, 5, 9, 6, 6, 2, 1, 3, 18, 2, 2, 1, 12, 2, 3, + 3, 3, 3, 3, 3, 2, 49, 3, 2, 3, 3, 4, 14, 13, 2, 2, 5, 10, 2, 2, 2, 6, 6, 1, 19, 3, 1, 6, 4, 1, 1, 1, 1, 1, 1, 1, 5, 3, 7, 5, 5, + 2, 114,4, 3, 2, 104,1, 1, 3, 12, 2, 7, 2, 5, 3, 9, 6, 3, 2, 11, 8, 2, 2, 5, 5, 4, 5, 8, 6, 3, 2, 5, 2, 19, 16, 15, 1, 1, 11, 4, 4, + 30, 7, 1, 1, 5, 5, 11, 1, 4, 4, 3, 3, 2, 3, 3, 4, 1, 1, 1, 1, 1, 1, 26, 6, 2, 4, 5, 1, 4, 3, 5, 3, 10, 9, 2, 2, 1, 1, 1, 3, 19, + 1, 18, 1, 3, 2, 4, 3, 2, 14, 2, 2, 1, 8, 1, 1, 89, 2, 4, 3, 2, 10, 8, 8, 5, 2, 2, 1, 1, 2, 2, 2, 5, 3, 35, 5, 2, 10, 3, 4, 4, 5, + 2, 2, 2, 3, 3, 3, 5, 3, 2, 16, 3, 1, 1, 4, 3, 6, 119,7, 2, 2, 21, 3, 1, 16, 14, 14, 14, 10, 8, 5, 28, 8, 6, 6, 6, 6, 6, 6, 9, 7, 5, + 4, 3, 3, 3, 3, 7, 3, 3, 3, 1, 1, 1, 8, 4, 2, 3, 2, 11, 1, 1, 3, 15, 4, 4, 3, 7, 3, 2, 5, 4, 1, 1, 1, 1, 1, 1, 1, 1, 2, 103,8, + 3, 4, 4, 2, 5, 7, 4, 9, 6, 3, 2, 2, 21, 6, 2, 5, 9, 6, 5, 2, 8, 3, 4, 2, 15, 3, 8, 7, 6, 2, 1, 1, 6, 1, 1, 2, 46, 2, 2, 7, 2, + 2, 6, 3, 3, 13, 4, 2, 4, 4, 9, 3, 2, 31, 3, 2, 3, 13, 12, 5, 1, 9, 6, 2, 4, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 52, 2, 2, 3, 1, 1, + 1, 1, 1, 9, 2, 2, 2, 2, 2, 3, 3, 3, 2, 1, 1, 3, 13, 9, 1, 1, 6, 5, 9, 1, 1, 1, 1, 1, 1, 7, 2, 5, 2, 4, 3, 3, 3, 4, 4, 4, 2, + 2, 4, 1, 3, 4, 2, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 9, 3, 72, 10, 2, 3, 14, 5, 3, 6, 4, 6, 1, 1, 1, 9, 3, 3, 21, 3, 2, 16, + 14, 13, 13, 3, 4, 40, 3, 4, 7, 4, 1, 1, 3, 4, 1, 1, 4, 2, 2, 25, 2, 2, 6, 3, 8, 4, 10, 1, 9, 33, 4, 4, 5, 7, 7, 5, 3, 3, 5, 3, 9, + 2, 50, 3, 2, 8, 2, 15, 5, 3, 2, 3, 2, 2, 3, 3, 10, 2, 2, 2, 9, 5, 4, 2, 56, 5, 4, 8, 3, 6, 7, 2, 9, 4, 3, 3, 3, 2, 6, 3, 8, 3, + 3, 5, 2, 24, 6, 3, 2, 5, 4, 2, 2, 1, 33, 5, 4, 1, 1, 1, 5, 4, 4, 2, 1, 9, 2, 2, 124,29, 5, 6, 4, 4, 2, 3, 2, 1, 1, 1, 29, 6, 4, + 6, 4, 37, 6, 3, 2, 2, 2, 2, 7, 3, 3, 2, 2, 2, 13, 3, 2, 8, 2, 7, 2, 7, 4, 6, 5, 18, 11, 8, 5, 2, 5, 3, 4, 123,8, 2, 35, 4, 1, 7, 3, 7, 7, 4, 4, 2, 47, 3, 2, 1, 5, 2, 2, 3, 9, 2, 1, 1, 9, 3, 1, 6, 1, 1, 1, 1, 1, 1, 3, 3, 4, 12, 4, 3, 5, 4, 2, 1, 1, 1, 171, - 8, 3, 3, 3, 34, 14, 7, 6, 4, 3, 2, 5, 7, 2, 2, 4, 4, 3, 8, 4, 51, 5, 2, 2, 3, 2, 2, 10, 3, 2, 8, 2, 2, 9, 8, 2, 4, 12, 3, 6, 3, - 1, 11, 5, 4, 5, 11, 4, 15, 4, 2, 1, 6, 2, 8, 2, 2, 24, 1, 1, 2, 3, 2, 4, 3, 2, 14, 6, 17, 6, 7, 2, 2, 37, 20, 11, 3, 2, 1, 6, 5, 2, - 2, 2, 12, 4, 11, 7, 3, 2, 15, 6, 5, 2, 2, 2, 2, 4, 28, 6, 5, 3, 3, 2, 2, 4, 14, 7, 3, 13, 3, 2, 26, 2, 11, 5, 11, 3, 4, 51, 9, 13, 7, - 5, 19, 4, 7, 2, 8, 13, 4, 17, 5, 3, 1, 3, 4, 8, 4, 3, 2, 4, 104,2, 2, 2, 10, 3, 6, 5, 2, 5, 2, 9, 2, 4, 3, 3, 3, 2, 14, 7, 7, 3, - 5, 3, 17, 8, 2, 27, 9, 2, 6, 1, 5, 4, 10, 9, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 3, 3, 101,5, 5, 1, 29, 3, 3, 3, 5, 12, 11, 10, 14, - 8, 8, 3, 9, 4, 5, 4, 3, 12, 9, 3, 3, 15, 3, 4, 2, 2, 4, 100,7, 5, 17, 6, 2, 7, 2, 9, 2, 2, 2, 2, 1, 18, 4, 3, 3, 3, 2, 8, 6, 3, - 5, 6, 14, 4, 36, 6, 2, 9, 15, 2, 2, 2, 4, 3, 3, 18, 2, 4, 4, 4, 1, 1, 41, 4, 2, 4, 7, 4, 4, 6, 5, 3, 2, 37, 5, 3, 11, 3, 4, 3, 3, - 7, 2, 2, 2, 2, 2, 2, 2, 2, 7, 25, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 5, 3, 3, 3, 3, 2, 2, 1, 1, 5, 4, 3, - 3, 1, 1, 8, 3, 2, 2, 2, 2, 10, 3, 3, 3, 2, 1, 31, 4, 1, 19, 2, 3, 2, 2, 2, 3, 1, 2, 2, 12, 4, 3, 1, 1, 7, 5, 17, 7, 3, 2, 3, 1, - 37, 5, 1, 3, 2, 6, 6, 5, 1, 1, 1, 1, 4, 10, 1, 6, 3, 2, 3, 2, 2, 30, 2, 8, 17, 4, 5, 3, 41, 4, 2, 3, 3, 1, 17, 5, 2, 2, 4, 2, 60, - 5, 3, 2, 2, 6, 7, 2, 4, 2, 3, 3, 3, 14, 2, 6, 2, 4, 2, 2, 4, 1, 1, 2, 2, 37, 4, 1, 1, 5, 1, 2, 3, 11, 11, 7, 9, 5, 2, 229,1, 4, - 3, 1, 1, 1, 1, 1, 1, 1, 13, 4, 3, 3, 3, 5, 4, 1, 2, 82, 5, 5, 5, 5, 4, 51, 39, 27, 1, 1, 1, 1, 1, 1, 14, 5, 2, 2, 1, 1, 1, 1, 1, - 10, 6, 5, 4, 2, 8, 8, 5, 5, 6, 4, 3, 5, 22, 2, 3, 5, 3, 6, 5, 15, 7, 3, 3, 3, 2, 18, 3, 3, 2, 4, 3, 3, 4, 41, 6, 12, 7, 8, 7, 3, - 2, 3, 2, 8, 3, 3, 3, 115,3, 4, 4, 3, 5, 5, 4, 10, 2, 8, 8, 8, 8, 5, 1, 10, 9, 8, 10, 7, 7, 6, 5, 2, 2, 2, 6, 2, 2, 2, 56, 55, 3, - 2, 23, 3, 3, 24, 11, 2, 6, 3, 6, 1, 1, 1, 1, 2, 1, 1, 7, 2, 2, 246,31, 3, 11, 8, 6, 5, 3, 3, 3, 12, 3, 6, 4, 10, 3, 3, 8, 5, 3, 6, - 5, 4, 10, 2, 12, 4, 3, 2, 2, 40, 23, 20, 9, 2, 1, 1, 3, 2, 6, 5, 5, 1, 1, 1, 5, 3, 16, 7, 3, 3, 2, 19, 4, 3, 10, 5, 4, 1, 1, 1, 21, - 8, 3, 9, 5, 3, 22, 4, 3, 3, 3, 3, 3, 6, 4, 6, 3, 3, 43, 1, 3, 3, 1, 2, 2, 2, 3, 1, 1, 1, 10, 4, 2, 14, 6, 3, 3, 3, 3, 4, 2, 1, - 1, 77, 7, 1, 2, 4, 4, 1, 5, 2, 1, 1, 6, 3, 3, 3, 3, 1, 3, 2, 9, 3, 21, 6, 2, 6, 4, 4, 3, 2, 2, 2, 3, 1, 6, 1, 2, 8, 3, 3, 3, - 2, 5, 2, 2, 6, 2, 2, 63, 3, 2, 1, 1, 3, 3, 9, 1, 1, 1, 5, 1, 1, 1, 35, 11, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, - 20, 1, 19, 15, 6, 1, 1, 1, 1, 1, 2, 3, 3, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 4, 4, 4, 3, 2, 189,43, 1, 1, 1, 1, 1, 1, 1, 2, 11, 4, 6, - 2, 2, 3, 13, 4, 4, 2, 4, 3, 3, 24, 1, 13, 12, 11, 3, 3, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 2, 1, 19, 1, 1, 1, 1, - 1, 3, 2, 2, 2, 2, 6, 3, 2, 2, 3, 1, 2, 2, 2, 2, 2, 2, 2, 2, 15, 2, 4, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 38, 2, 2, 2, 2, - 1, 1, 18, 17, 3, 1, 1, 14, 1, 3, 1, 1, 1, 1, 3, 2, 2, 2, 2, 2, 1, 1, 2, 1, 1, 1, 4, 2, 2, 2, 1, 1, 1, 1, 2, 3, 2, 2, 1, 1, 1, - 4, 4, 3, 3, 2, 1, 1, 35, 4, 3, 22, 18, 3, 1, 3, 4, 3, 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 99, 19, 4, 3, 2, 10, 2, 5, 2, 2, 2, 2, - 15, 7, 3, 3, 1, 1, 2, 4, 2, 2, 46, 1, 1, 4, 3, 1, 2, 1, 1, 1, 3, 2, 1, 3, 2, 2, 16, 4, 1, 1, 5, 1, 1, 5, 2, 4, 2, 7, 3, 2, 2, - 2, 9, 4, 4, 3, 38, 3, 15, 4, 2, 2, 3, 3, 6, 3, 3, 2, 4, 3, 4, 4, 3, 3, 4, 4, 3, 4, 14, 6, 45, 4, 2, 2, 4, 12, 2, 2, 16, 8, 3, 2, - 15, 8, 2, 5, 2, 40, 13, 3, 8, 8, 2, 2, 1, 14, 3, 5, 3, 3, 4, 3, 2, 181,6, 2, 20, 12, 10, 8, 1, 3, 8, 3, 2, 4, 3, 2, 16, 7, 3, 1, 1, - 3, 4, 3, 1, 2, 7, 3, 2, 5, 3, 3, 1, 4, 3, 78, 7, 3, 1, 18, 4, 3, 3, 32, 6, 3, 4, 5, 6, 3, 2, 7, 3, 3, 3, 2, 2, 3, 5, 3, 3, 22, - 3, 2, 3, 7, 3, 3, 2, 2, 2, 3, 74, 3, 4, 1, 1, 1, 7, 24, 15, 12, 2, 2, 11, 1, 2, 4, 2, 5, 2, 7, 2, 4, 1, 3, 41, 3, 3, 2, 1, 1, 2, - 1, 6, 1, 1, 11, 7, 6, 2, 2, 2, 2, 12, 9, 9, 4, 2, 2, 9, 5, 1, 1, 84, 15, 2, 5, 5, 2, 8, 3, 1, 2, 4, 20, 3, 3, 3, 4, 7, 2, 2, 15, - 2, 2, 6, 3, 3, 4, 5, 3, 23, 3, 4, 4, 2, 3, 3, 3, 27, 3, 1, 2, 3, 2, 14, 5, 4, 4, 2, 24, 2, 2, 2, 9, 9, 1, 1, 7, 3, 3, 3, 3, 2, - 1, 22, 3, 14, 2, 2, 3, 3, 1, 20, 12, 12, 4, 4, 1, 5, 36, 1, 1, 1, 1, 6, 3, 2, 2, 3, 1, 2, 3, 3, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, - 7, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 184,4, 11, 8, 4, 36, - 2, 9, 4, 4, 4, 4, 3, 2, 4, 3, 1, 1, 1, 9, 6, 5, 2, 19, 5, 6, 6, 3, 49, 2, 4, 4, 3, 2, 3, 2, 24, 2, 2, 5, 2, 2, 2, 2, 1, 1, 1, - 5, 15, 3, 5, 3, 1, 1, 3, 6, 3, 2, 2, 1, 1, 1, 1, 1, 2, 12, 7, 1, 1, 76, 10, 5, 1, 4, 1, 10, 4, 4, 1, 1, 39, 3, 1, 9, 3, 2, 3, 2, - 3, 2, 1, 1, 9, 2, 2, 1, 1, 1, 2, 2, 3, 2, 47, 5, 4, 8, 5, 2, 6, 4, 6, 2, 1, 1, 1, 1, 1, 7, 3, 5, 2, 112,17, 6, 6, 5, 1, 1, 4, - 3, 13, 13, 3, 2, 1, 1, 1, 5, 3, 2, 2, 3, 1, 4, 19, 14, 3, 5, 3, 2, 3, 13, 9, 7, 1, 1, 3, 2, 2, 2, 2, 2, 2, 2, 6, 2, 11, 2, 1, 1, - 1, 1, 43, 2, 1, 1, 13, 2, 3, 7, 2, 2, 2, 2, 2, 1, 1, 4, 1, 1, 5, 2, 13, 4, 3, 1, 4, 2, 27, 14, 4, 3, 1, 9, 2, 2, 2, 2, 2, 4, 3, - 7, 3, 1, 5, 5, 1, 2, 17, 4, 3, 1, 2, 1, 2, 3, 2, 45, 1, 1, 1, 17, 3, 4, 2, 2, 1, 1, 1, 4, 6, 4, 4, 2, 2, 2, 12, 4, 2, 1, 1, 1, - 1, 4, 4, 1, 1, 1, 4, 2, 41, 2, 18, 5, 3, 2, 2, 1, 4, 3, 3, 3, 3, 3, 3, 9, 3, 49, 7, 5, 5, 2, 11, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 10, 4, 3, 3, 1, 6, 3, 2, 2, 20, 4, 9, 3, 2, 2, 4, 3, 125,10, 2, 2, 11, 4, 5, 15, 8, 6, 3, 6, 4, 10, 2, 7, 3, 3, 1, 1, 1, 14, 8, - 5, 3, 2, 2, 9, 4, 2, 2, 2, 9, 1, 2, 2, 3, 2, 14, 2, 2, 2, 2, 3, 4, 3, 5, 5, 4, 1, 70, 3, 2, 6, 3, 4, 5, 3, 5, 2, 2, 14, 3, 2, - 2, 3, 18, 3, 9, 2, 2, 4, 20, 9, 3, 3, 3, 1, 1, 28, 4, 6, 3, 5, 3, 5, 2, 1, 15, 5, 2, 3, 2, 3, 17, 2, 3, 1, 1, 6, 2, 8, 1, 2, 4, - 250,12, 3, 3, 111,5, 7, 2, 3, 2, 18, 11, 3, 3, 13, 2, 8, 4, 2, 6, 4, 8, 2, 5, 3, 4, 2, 18, 4, 3, 3, 6, 7, 3, 2, 2, 2, 2, 6, 3, 2, - 18, 2, 2, 2, 2, 6, 3, 2, 34, 6, 2, 10, 9, 3, 3, 1, 3, 2, 21, 7, 3, 2, 1, 4, 20, 3, 2, 5, 2, 3, 1, 11, 4, 3, 2, 4, 3, 33, 3, 5, 3, - 10, 2, 4, 3, 4, 2, 2, 96, 9, 4, 1, 1, 1, 7, 2, 2, 3, 2, 17, 6, 4, 2, 2, 7, 6, 2, 2, 2, 1, 4, 3, 2, 1, 11, 5, 4, 2, 2, 5, 22, 12, - 11, 4, 3, 3, 7, 208,6, 5, 127,4, 3, 3, 4, 5, 8, 3, 2, 11, 4, 2, 3, 7, 4, 4, 4, 8, 3, 5, 8, 4, 2, 13, 3, 4, 4, 2, 2, 8, 3, 3, 4, - 3, 3, 3, 8, 2, 3, 9, 2, 3, 3, 6, 3, 2, 8, 11, 9, 7, 10, 3, 2, 2, 3, 13, 7, 4, 2, 17, 11, 2, 2, 18, 7, 2, 5, 3, 1, 1, 1, 1, 4, 2, - 153,12, 2, 4, 7, 2, 2, 2, 2, 2, 31, 13, 3, 2, 3, 8, 1, 1, 5, 18, 2, 1, 4, 6, 12, 4, 14, 1, 6, 5, 5, 4, 4, 3, 2, 7, 3, 15, 3, 4, 4, - 2, 6, 4, 2, 5, 4, 3, 3, 77, 3, 3, 4, 8, 3, 2, 5, 5, 23, 4, 7, 5, 4, 13, 6, 3, 1, 2, 83, 3, 4, 4, 6, 2, 2, 12, 3, 2, 4, 5, 3, 1, - 4, 5, 3, 4, 2, 2, 30, 1, 5, 1, 2, 1, 1, 1, 1, 1, 1, 3, 2, 3, 2, 6, 4, 4, 2, 2, 3, 2, 61, 2, 9, 3, 8, 4, 2, 14, 4, 2, 6, 2, 11, - 2, 4, 5, 1, 1, 2, 2, 1, 2, 33, 21, 19, 16, 2, 6, 6, 6, 5, 4, 1, 1, 3, 25, 3, 7, 4, 4, 11, 4, 2, 4, 2, 4, 1, 1, 1, 1, 2, 4, 3, 1, - 1, 33, 5, 2, 5, 6, 3, 2, 7, 4, 1, 35, 2, 15, 3, 3, 3, 15, 5, 3, 3, 39, 9, 8, 8, 8, 2, 13, 3, 2, 18, 2, 7, 2, 1, 2, 5, 7, 3, 12, 7, - 5, 2, 1, 12, 7, 4, 3, 4, 46, 3, 5, 4, 2, 3, 16, 9, 4, 4, 4, 4, 2, 3, 1, 5, 169,13, 4, 4, 74, 4, 3, 2, 2, 2, 2, 2, 4, 4, 9, 4, 3, - 3, 7, 1, 2, 10, 7, 3, 3, 2, 5, 5, 3, 2, 8, 4, 4, 3, 2, 4, 4, 4, 11, 4, 2, 4, 6, 2, 4, 1, 1, 2, 4, 2, 19, 3, 10, 9, 4, 3, 2, 2, - 4, 3, 31, 8, 1, 13, 3, 8, 9, 40, 2, 4, 26, 4, 3, 3, 5, 3, 1, 2, 24, 6, 10, 3, 3, 2, 11, 3, 1, 56, 4, 29, 2, 2, 9, 3, 7, 2, 3, 16, 12, - 6, 5, 3, 3, 3, 17, 2, 2, 1, 4, 16, 9, 3, 2, 1, 1, 1, 1, 32, 7, 4, 17, 2, 8, 5, 2, 176,4, 1, 1, 5, 147,7, 4, 4, 2, 2, 15, 6, 3, 4, - 3, 2, 2, 5, 4, 9, 4, 4, 2, 9, 4, 2, 3, 5, 18, 5, 4, 7, 3, 3, 3, 4, 2, 2, 11, 2, 2, 3, 4, 14, 8, 4, 2, 4, 3, 34, 4, 3, 4, 15, 13, - 7, 3, 19, 3, 3, 6, 2, 12, 3, 4, 2, 31, 8, 7, 4, 5, 3, 2, 3, 14, 3, 6, 20, 5, 2, 4, 7, 3, 2, 2, 4, 21, 1, 2, 4, 3, 3, 1, 4, 2, 1, - 1, 7, 6, 3, 3, 2, 7, 36, 3, 3, 2, 1, 1, 12, 2, 2, 2, 8, 34, 27, 7, 12, 4, 4, 20, 3, 2, 1, 3, 2, 8, 8, 2, 1, 1, 12, 11, 5, 33, 6, 5, - 6, 2, 2, 2, 2, 7, 3, 37, 16, 7, 4, 3, 2, 4, 3, 14, 8, 1, 37, 4, 4, 4, 4, 8, 5, 4, 2, 11, 3, 4, 4, 14, 13, 2, 7, 5, 9, 4, 11, 6, 4, - 9, 4, 1, 16, 7, 4, 1, 3, 2, 3, 4, 8, 3, 6, 3, 1, 11, 3, 17, 2, 3, 2, 2, 22, 9, 2, 7, 7, 2, 3, 53, 3, 3, 1, 3, 1, 4, 2, 2, 30, 1, - 1, 1, 1, 1, 1, 10, 2, 4, 3, 3, 4, 1, 1, 1, 1, 2, 20, 3, 1, 1, 7, 4, 2, 1, 4, 3, 36, 4, 4, 16, 16, 1, 1, 2, 2, 4, 2, 12, 1, 1, 4, - 8, 7, 4, 20, 4, 2, 6, 1, 4, 132,16, 6, 11, 4, 3, 3, 1, 18, 4, 8, 2, 3, 3, 3, 2, 3, 3, 14, 5, 36, 11, 1, 1, 3, 1, 5, 3, 7, 10, 6, 3, - 2, 9, 2, 2, 10, 2, 2, 1, 1, 1, 1, 10, 6, 2, 2, 2, 2, 4, 2, 16, 2, 2, 2, 2, 1, 1, 1, 1, 1, 3, 6, 6, 3, 26, 1, 1, 6, 2, 3, 1, 1, - 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 3, 2, 2, 2, 2, 7, 7, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 97, 1, 1, 11, 8, 2, 2, 5, 1, 1, 1, 1, - 1, 2, 1, 1, 2, 3, 2, 2, 2, 3, 2, 2, 18, 3, 1, 1, 5, 2, 2, 2, 1, 1, 1, 40, 8, 8, 7, 4, 4, 18, 3, 8, 4, 6, 2, 4, 2, 3, 2, 2, 4, - 3, 3, 3, 7, 4, 14, 3, 2, 5, 5, 3, 2, 2, 2, 10, 5, 5, 2, 3, 20, 2, 4, 1, 2, 4, 4, 4, 3, 3, 3, 3, 3, 2, 96, 2, 5, 3, 9, 1, 3, 10, - 3, 2, 1, 4, 3, 38, 7, 3, 6, 4, 2, 19, 3, 6, 7, 3, 2, 1, 17, 8, 7, 5, 1, 1, 1, 1, 1, 5, 3, 5, 5, 13, 3, 2, 2, 7, 6, 3, 3, 3, 2, - 189,6, 2, 2, 2, 2, 28, 3, 13, 3, 6, 3, 3, 4, 2, 64, 7, 5, 3, 3, 9, 4, 1, 1, 3, 4, 4, 1, 4, 3, 3, 29, 6, 2, 13, 3, 5, 3, 7, 5, 2, - 1, 5, 4, 3, 3, 24, 3, 7, 4, 5, 4, 2, 3, 9, 2, 3, 31, 19, 17, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 1, 2, 2, 3, 4, 2, 1, 1, 3, 7, 3, 3, - 3, 3, 1, 80, 7, 9, 1, 1, 5, 5, 4, 5, 1, 3, 4, 4, 2, 2, 2, 8, 3, 2, 26, 6, 4, 10, 6, 4, 3, 29, 8, 7, 3, 3, 2, 6, 2, 106,3, 4, 17, - 4, 3, 7, 6, 3, 2, 3, 3, 2, 5, 5, 3, 2, 23, 4, 12, 3, 7, 2, 2, 2, 16, 4, 2, 2, 2, 3, 11, 3, 4, 5, 2, 6, 3, 3, 70, 6, 6, 1, 2, 3, - 5, 3, 2, 6, 7, 6, 5, 2, 6, 3, 2, 10, 1, 1, 1, 2, 59, 1, 4, 11, 4, 3, 3, 7, 26, 12, 7, 6, 71, 12, 1, 1, 5, 5, 2, 1, 1, 7, 2, 2, 9, - 7, 6, 4, 4, 3, 2, 2, 5, 2, 2, 19, 9, 7, 2, 4, 1, 1, 5, 1, 1, 30, 2, 1, 6, 3, 3, 5, 21, 1, 2, 5, 4, 3, 2, 6, 2, 1, 1, 41, 11, 3, - 2, 3, 2, 2, 1, 2, 9, 9, 5, 4, 4, 9, 1, 1, 3, 4, 1, 1, 1, 8, 2, 2, 6, 3, 1, 1, 1, 1, 1, 1, 64, 1, 1, 1, 1, 1, 5, 2, 5, 5, 5, - 5, 3, 5, 1, 1, 1, 1, 3, 3, 3, 15, 11, 8, 8, 3, 5, 2, 1, 1, 9, 2, 4, 4, 4, 4, 4, 4, 3, 4, 3, 6, 5, 7, 5, 4, 3, 3, 3, 4, 3, 2, - 2, 2, 2, 4, 2, 3, 1, 1, 1, 1, 1, 3, 1, 1, 5, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 40, - 5, 3, 7, 4, 2, 2, 6, 6, 2, 67, 5, 3, 5, 1, 20, 1, 14, 2, 2, 2, 2, 2, 2, 4, 3, 2, 1, 24, 4, 3, 3, 12, 6, 4, 4, 2, 3, 3, 2, 2, 1, - 1, 1, 63, 10, 4, 4, 1, 3, 2, 2, 46, 2, 4, 20, 3, 5, 2, 6, 3, 5, 4, 4, 2, 3, 1, 68, 8, 1, 16, 5, 3, 3, 5, 8, 1, 1, 1, 7, 2, 3, 7, - 4, 3, 3, 3, 3, 28, 3, 3, 2, 2, 2, 4, 4, 1, 1, 2, 2, 2, 2, 1, 1, 5, 4, 3, 2, 2, 25, 10, 2, 3, 2, 6, 2, 1, 2, 4, 2, 95, 10, 2, 2, - 3, 28, 4, 9, 3, 5, 23, 7, 4, 7, 4, 3, 3, 1, 1, 10, 3, 3, 3, 3, 3, 3, 4, 3, 3, 4, 2, 2, 2, 19, 10, 6, 5, 3, 5, 4, 92, 4, 2, 5, 3, - 14, 7, 3, 4, 2, 15, 3, 2, 5, 2, 3, 29, 2, 4, 3, 3, 3, 2, 7, 5, 6, 3, 8, 2, 4, 14, 4, 3, 3, 4, 33, 8, 8, 3, 3, 5, 3, 2, 4, 254,2, - 2, 15, 2, 2, 12, 6, 6, 3, 2, 2, 3, 2, 5, 4, 11, 4, 4, 14, 2, 1, 2, 1, 19, 2, 3, 3, 2, 2, 3, 2, 3, 2, 15, 2, 2, 2, 1, 1, 1, 3, 89, - 12, 1, 14, 1, 2, 15, 1, 4, 4, 19, 10, 4, 2, 2, 4, 3, 10, 8, 8, 8, 5, 5, 3, 3, 9, 3, 3, 3, 11, 4, 3, 3, 1, 9, 2, 4, 4, 12, 5, 4, 2, - 9, 3, 2, 7, 4, 2, 3, 2, 229,21, 1, 3, 2, 3, 3, 2, 30, 1, 1, 5, 4, 8, 6, 3, 5, 3, 6, 6, 5, 7, 4, 3, 19, 3, 2, 1, 5, 2, 5, 3, 1, - 17, 7, 4, 11, 7, 5, 70, 16, 2, 4, 5, 1, 1, 39, 30, 3, 3, 3, 9, 4, 4, 8, 6, 2, 6, 4, 18, 6, 4, 2, 5, 2, 12, 2, 1, 1, 5, 2, 1, 1, 1, - 1, 3, 16, 3, 2, 2, 6, 2, 7, 105,9, 5, 7, 3, 3, 3, 3, 10, 4, 2, 11, 6, 4, 4, 4, 3, 2, 2, 2, 2, 13, 9, 5, 2, 4, 16, 1, 1, 1, 3, 2, - 6, 5, 4, 4, 2, 2, 2, 2, 3, 2, 16, 3, 3, 1, 3, 23, 4, 3, 4, 2, 3, 2, 16, 2, 4, 20, 6, 2, 5, 7, 49, 19, 2, 7, 13, 8, 2, 4, 3, 9, 2, - 2, 4, 2, 43, 4, 2, 2, 3, 9, 3, 4, 6, 3, 3, 13, 2, 1, 1, 2, 1, 2, 4, 2, 3, 2, 6, 2, 74, 3, 2, 2, 2, 2, 2, 7, 6, 1, 1, 1, 1, 2, + 8, 3, 3, 3, 34, 14, 7, 6, 4, 3, 2, 5, 7, 2, 2, 4, 4, 3, 8, 4, 51, 5, 2, 2, 3, 2, 2, 10, 3, 2, 8, 2, 2, 9, 8, 2, 4, 12, 3, 6, 3, + 1, 11, 5, 4, 5, 11, 4, 15, 4, 2, 1, 6, 2, 8, 2, 2, 24, 1, 1, 2, 3, 2, 4, 3, 2, 14, 6, 17, 6, 7, 2, 2, 37, 20, 11, 3, 2, 1, 6, 5, 2, + 2, 2, 12, 4, 11, 7, 3, 2, 15, 6, 5, 2, 2, 2, 2, 4, 28, 6, 5, 3, 3, 2, 2, 4, 14, 7, 3, 13, 3, 2, 26, 2, 11, 5, 11, 3, 4, 51, 9, 13, 7, + 5, 19, 4, 7, 2, 8, 13, 4, 17, 5, 3, 1, 3, 4, 8, 4, 3, 2, 4, 104,2, 2, 2, 10, 3, 6, 5, 2, 5, 2, 9, 2, 4, 3, 3, 3, 2, 14, 7, 7, 3, + 5, 3, 17, 8, 2, 27, 9, 2, 6, 1, 5, 4, 10, 9, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 3, 3, 101,5, 5, 1, 29, 3, 3, 3, 5, 12, 11, 10, 14, + 8, 8, 3, 9, 4, 5, 4, 3, 12, 9, 3, 3, 15, 3, 4, 2, 2, 4, 100,7, 5, 17, 6, 2, 7, 2, 9, 2, 2, 2, 2, 1, 18, 4, 3, 3, 3, 2, 8, 6, 3, + 5, 6, 14, 4, 36, 6, 2, 9, 15, 2, 2, 2, 4, 3, 3, 18, 2, 4, 4, 4, 1, 1, 41, 4, 2, 4, 7, 4, 4, 6, 5, 3, 2, 37, 5, 3, 11, 3, 4, 3, 3, + 7, 2, 2, 2, 2, 2, 2, 2, 2, 7, 25, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 5, 3, 3, 3, 3, 2, 2, 1, 1, 5, 4, 3, + 3, 1, 1, 8, 3, 2, 2, 2, 2, 10, 3, 3, 3, 2, 1, 31, 4, 1, 19, 2, 3, 2, 2, 2, 3, 1, 2, 2, 12, 4, 3, 1, 1, 7, 5, 17, 7, 3, 2, 3, 1, + 37, 5, 1, 3, 2, 6, 6, 5, 1, 1, 1, 1, 4, 10, 1, 6, 3, 2, 3, 2, 2, 30, 2, 8, 17, 4, 5, 3, 41, 4, 2, 3, 3, 1, 17, 5, 2, 2, 4, 2, 60, + 5, 3, 2, 2, 6, 7, 2, 4, 2, 3, 3, 3, 14, 2, 6, 2, 4, 2, 2, 4, 1, 1, 2, 2, 37, 4, 1, 1, 5, 1, 2, 3, 11, 11, 7, 9, 5, 2, 229,1, 4, + 3, 1, 1, 1, 1, 1, 1, 1, 13, 4, 3, 3, 3, 5, 4, 1, 2, 82, 5, 5, 5, 5, 4, 51, 39, 27, 1, 1, 1, 1, 1, 1, 14, 5, 2, 2, 1, 1, 1, 1, 1, + 10, 6, 5, 4, 2, 8, 8, 5, 5, 6, 4, 3, 5, 22, 2, 3, 5, 3, 6, 5, 15, 7, 3, 3, 3, 2, 18, 3, 3, 2, 4, 3, 3, 4, 41, 6, 12, 7, 8, 7, 3, + 2, 3, 2, 8, 3, 3, 3, 115,3, 4, 4, 3, 5, 5, 4, 10, 2, 8, 8, 8, 8, 5, 1, 10, 9, 8, 10, 7, 7, 6, 5, 2, 2, 2, 6, 2, 2, 2, 56, 55, 3, + 2, 23, 3, 3, 24, 11, 2, 6, 3, 6, 1, 1, 1, 1, 2, 1, 1, 7, 2, 2, 246,31, 3, 11, 8, 6, 5, 3, 3, 3, 12, 3, 6, 4, 10, 3, 3, 8, 5, 3, 6, + 5, 4, 10, 2, 12, 4, 3, 2, 2, 40, 23, 20, 9, 2, 1, 1, 3, 2, 6, 5, 5, 1, 1, 1, 5, 3, 16, 7, 3, 3, 2, 19, 4, 3, 10, 5, 4, 1, 1, 1, 21, + 8, 3, 9, 5, 3, 22, 4, 3, 3, 3, 3, 3, 6, 4, 6, 3, 3, 43, 1, 3, 3, 1, 2, 2, 2, 3, 1, 1, 1, 10, 4, 2, 14, 6, 3, 3, 3, 3, 4, 2, 1, + 1, 77, 7, 1, 2, 4, 4, 1, 5, 2, 1, 1, 6, 3, 3, 3, 3, 1, 3, 2, 9, 3, 21, 6, 2, 6, 4, 4, 3, 2, 2, 2, 3, 1, 6, 1, 2, 8, 3, 3, 3, + 2, 5, 2, 2, 6, 2, 2, 63, 3, 2, 1, 1, 3, 3, 9, 1, 1, 1, 5, 1, 1, 1, 35, 11, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, + 20, 1, 19, 15, 6, 1, 1, 1, 1, 1, 2, 3, 3, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 4, 4, 4, 3, 2, 189,43, 1, 1, 1, 1, 1, 1, 1, 2, 11, 4, 6, + 2, 2, 3, 13, 4, 4, 2, 4, 3, 3, 24, 1, 13, 12, 11, 3, 3, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 2, 1, 19, 1, 1, 1, 1, + 1, 3, 2, 2, 2, 2, 6, 3, 2, 2, 3, 1, 2, 2, 2, 2, 2, 2, 2, 2, 15, 2, 4, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 38, 2, 2, 2, 2, + 1, 1, 18, 17, 3, 1, 1, 14, 1, 3, 1, 1, 1, 1, 3, 2, 2, 2, 2, 2, 1, 1, 2, 1, 1, 1, 4, 2, 2, 2, 1, 1, 1, 1, 2, 3, 2, 2, 1, 1, 1, + 4, 4, 3, 3, 2, 1, 1, 35, 4, 3, 22, 18, 3, 1, 3, 4, 3, 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 99, 19, 4, 3, 2, 10, 2, 5, 2, 2, 2, 2, + 15, 7, 3, 3, 1, 1, 2, 4, 2, 2, 46, 1, 1, 4, 3, 1, 2, 1, 1, 1, 3, 2, 1, 3, 2, 2, 16, 4, 1, 1, 5, 1, 1, 5, 2, 4, 2, 7, 3, 2, 2, + 2, 9, 4, 4, 3, 38, 3, 15, 4, 2, 2, 3, 3, 6, 3, 3, 2, 4, 3, 4, 4, 3, 3, 4, 4, 3, 4, 14, 6, 45, 4, 2, 2, 4, 12, 2, 2, 16, 8, 3, 2, + 15, 8, 2, 5, 2, 40, 13, 3, 8, 8, 2, 2, 1, 14, 3, 5, 3, 3, 4, 3, 2, 181,6, 2, 20, 12, 10, 8, 1, 3, 8, 3, 2, 4, 3, 2, 16, 7, 3, 1, 1, + 3, 4, 3, 1, 2, 7, 3, 2, 5, 3, 3, 1, 4, 3, 78, 7, 3, 1, 18, 4, 3, 3, 32, 6, 3, 4, 5, 6, 3, 2, 7, 3, 3, 3, 2, 2, 3, 5, 3, 3, 22, + 3, 2, 3, 7, 3, 3, 2, 2, 2, 3, 74, 3, 4, 1, 1, 1, 7, 24, 15, 12, 2, 2, 11, 1, 2, 4, 2, 5, 2, 7, 2, 4, 1, 3, 41, 3, 3, 2, 1, 1, 2, + 1, 6, 1, 1, 11, 7, 6, 2, 2, 2, 2, 12, 9, 9, 4, 2, 2, 9, 5, 1, 1, 84, 15, 2, 5, 5, 2, 8, 3, 1, 2, 4, 20, 3, 3, 3, 4, 7, 2, 2, 15, + 2, 2, 6, 3, 3, 4, 5, 3, 23, 3, 4, 4, 2, 3, 3, 3, 27, 3, 1, 2, 3, 2, 14, 5, 4, 4, 2, 24, 2, 2, 2, 9, 9, 1, 1, 7, 3, 3, 3, 3, 2, + 1, 22, 3, 14, 2, 2, 3, 3, 1, 20, 12, 12, 4, 4, 1, 5, 36, 1, 1, 1, 1, 6, 3, 2, 2, 3, 1, 2, 3, 3, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, + 7, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 184,4, 11, 8, 4, 36, + 2, 9, 4, 4, 4, 4, 3, 2, 4, 3, 1, 1, 1, 9, 6, 5, 2, 19, 5, 6, 6, 3, 49, 2, 4, 4, 3, 2, 3, 2, 24, 2, 2, 5, 2, 2, 2, 2, 1, 1, 1, + 5, 15, 3, 5, 3, 1, 1, 3, 6, 3, 2, 2, 1, 1, 1, 1, 1, 2, 12, 7, 1, 1, 76, 10, 5, 1, 4, 1, 10, 4, 4, 1, 1, 39, 3, 1, 9, 3, 2, 3, 2, + 3, 2, 1, 1, 9, 2, 2, 1, 1, 1, 2, 2, 3, 2, 47, 5, 4, 8, 5, 2, 6, 4, 6, 2, 1, 1, 1, 1, 1, 7, 3, 5, 2, 112,17, 6, 6, 5, 1, 1, 4, + 3, 13, 13, 3, 2, 1, 1, 1, 5, 3, 2, 2, 3, 1, 4, 19, 14, 3, 5, 3, 2, 3, 13, 9, 7, 1, 1, 3, 2, 2, 2, 2, 2, 2, 2, 6, 2, 11, 2, 1, 1, + 1, 1, 43, 2, 1, 1, 13, 2, 3, 7, 2, 2, 2, 2, 2, 1, 1, 4, 1, 1, 5, 2, 13, 4, 3, 1, 4, 2, 27, 14, 4, 3, 1, 9, 2, 2, 2, 2, 2, 4, 3, + 7, 3, 1, 5, 5, 1, 2, 17, 4, 3, 1, 2, 1, 2, 3, 2, 45, 1, 1, 1, 17, 3, 4, 2, 2, 1, 1, 1, 4, 6, 4, 4, 2, 2, 2, 12, 4, 2, 1, 1, 1, + 1, 4, 4, 1, 1, 1, 4, 2, 41, 2, 18, 5, 3, 2, 2, 1, 4, 3, 3, 3, 3, 3, 3, 9, 3, 49, 7, 5, 5, 2, 11, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 10, 4, 3, 3, 1, 6, 3, 2, 2, 20, 4, 9, 3, 2, 2, 4, 3, 125,10, 2, 2, 11, 4, 5, 15, 8, 6, 3, 6, 4, 10, 2, 7, 3, 3, 1, 1, 1, 14, 8, + 5, 3, 2, 2, 9, 4, 2, 2, 2, 9, 1, 2, 2, 3, 2, 14, 2, 2, 2, 2, 3, 4, 3, 5, 5, 4, 1, 70, 3, 2, 6, 3, 4, 5, 3, 5, 2, 2, 14, 3, 2, + 2, 3, 18, 3, 9, 2, 2, 4, 20, 9, 3, 3, 3, 1, 1, 28, 4, 6, 3, 5, 3, 5, 2, 1, 15, 5, 2, 3, 2, 3, 17, 2, 3, 1, 1, 6, 2, 8, 1, 2, 4, + 250,12, 3, 3, 111,5, 7, 2, 3, 2, 18, 11, 3, 3, 13, 2, 8, 4, 2, 6, 4, 8, 2, 5, 3, 4, 2, 18, 4, 3, 3, 6, 7, 3, 2, 2, 2, 2, 6, 3, 2, + 18, 2, 2, 2, 2, 6, 3, 2, 34, 6, 2, 10, 9, 3, 3, 1, 3, 2, 21, 7, 3, 2, 1, 4, 20, 3, 2, 5, 2, 3, 1, 11, 4, 3, 2, 4, 3, 33, 3, 5, 3, + 10, 2, 4, 3, 4, 2, 2, 96, 9, 4, 1, 1, 1, 7, 2, 2, 3, 2, 17, 6, 4, 2, 2, 7, 6, 2, 2, 2, 1, 4, 3, 2, 1, 11, 5, 4, 2, 2, 5, 22, 12, + 11, 4, 3, 3, 7, 208,6, 5, 127,4, 3, 3, 4, 5, 8, 3, 2, 11, 4, 2, 3, 7, 4, 4, 4, 8, 3, 5, 8, 4, 2, 13, 3, 4, 4, 2, 2, 8, 3, 3, 4, + 3, 3, 3, 8, 2, 3, 9, 2, 3, 3, 6, 3, 2, 8, 11, 9, 7, 10, 3, 2, 2, 3, 13, 7, 4, 2, 17, 11, 2, 2, 18, 7, 2, 5, 3, 1, 1, 1, 1, 4, 2, + 153,12, 2, 4, 7, 2, 2, 2, 2, 2, 31, 13, 3, 2, 3, 8, 1, 1, 5, 18, 2, 1, 4, 6, 12, 4, 14, 1, 6, 5, 5, 4, 4, 3, 2, 7, 3, 15, 3, 4, 4, + 2, 6, 4, 2, 5, 4, 3, 3, 77, 3, 3, 4, 8, 3, 2, 5, 5, 23, 4, 7, 5, 4, 13, 6, 3, 1, 2, 83, 3, 4, 4, 6, 2, 2, 12, 3, 2, 4, 5, 3, 1, + 4, 5, 3, 4, 2, 2, 30, 1, 5, 1, 2, 1, 1, 1, 1, 1, 1, 3, 2, 3, 2, 6, 4, 4, 2, 2, 3, 2, 61, 2, 9, 3, 8, 4, 2, 14, 4, 2, 6, 2, 11, + 2, 4, 5, 1, 1, 2, 2, 1, 2, 33, 21, 19, 16, 2, 6, 6, 6, 5, 4, 1, 1, 3, 25, 3, 7, 4, 4, 11, 4, 2, 4, 2, 4, 1, 1, 1, 1, 2, 4, 3, 1, + 1, 33, 5, 2, 5, 6, 3, 2, 7, 4, 1, 35, 2, 15, 3, 3, 3, 15, 5, 3, 3, 39, 9, 8, 8, 8, 2, 13, 3, 2, 18, 2, 7, 2, 1, 2, 5, 7, 3, 12, 7, + 5, 2, 1, 12, 7, 4, 3, 4, 46, 3, 5, 4, 2, 3, 16, 9, 4, 4, 4, 4, 2, 3, 1, 5, 169,13, 4, 4, 74, 4, 3, 2, 2, 2, 2, 2, 4, 4, 9, 4, 3, + 3, 7, 1, 2, 10, 7, 3, 3, 2, 5, 5, 3, 2, 8, 4, 4, 3, 2, 4, 4, 4, 11, 4, 2, 4, 6, 2, 4, 1, 1, 2, 4, 2, 19, 3, 10, 9, 4, 3, 2, 2, + 4, 3, 31, 8, 1, 13, 3, 8, 9, 40, 2, 4, 26, 4, 3, 3, 5, 3, 1, 2, 24, 6, 10, 3, 3, 2, 11, 3, 1, 56, 4, 29, 2, 2, 9, 3, 7, 2, 3, 16, 12, + 6, 5, 3, 3, 3, 17, 2, 2, 1, 4, 16, 9, 3, 2, 1, 1, 1, 1, 32, 7, 4, 17, 2, 8, 5, 2, 176,4, 1, 1, 5, 147,7, 4, 4, 2, 2, 15, 6, 3, 4, + 3, 2, 2, 5, 4, 9, 4, 4, 2, 9, 4, 2, 3, 5, 18, 5, 4, 7, 3, 3, 3, 4, 2, 2, 11, 2, 2, 3, 4, 14, 8, 4, 2, 4, 3, 34, 4, 3, 4, 15, 13, + 7, 3, 19, 3, 3, 6, 2, 12, 3, 4, 2, 31, 8, 7, 4, 5, 3, 2, 3, 14, 3, 6, 20, 5, 2, 4, 7, 3, 2, 2, 4, 21, 1, 2, 4, 3, 3, 1, 4, 2, 1, + 1, 7, 6, 3, 3, 2, 7, 36, 3, 3, 2, 1, 1, 12, 2, 2, 2, 8, 34, 27, 7, 12, 4, 4, 20, 3, 2, 1, 3, 2, 8, 8, 2, 1, 1, 12, 11, 5, 33, 6, 5, + 6, 2, 2, 2, 2, 7, 3, 37, 16, 7, 4, 3, 2, 4, 3, 14, 8, 1, 37, 4, 4, 4, 4, 8, 5, 4, 2, 11, 3, 4, 4, 14, 13, 2, 7, 5, 9, 4, 11, 6, 4, + 9, 4, 1, 16, 7, 4, 1, 3, 2, 3, 4, 8, 3, 6, 3, 1, 11, 3, 17, 2, 3, 2, 2, 22, 9, 2, 7, 7, 2, 3, 53, 3, 3, 1, 3, 1, 4, 2, 2, 30, 1, + 1, 1, 1, 1, 1, 10, 2, 4, 3, 3, 4, 1, 1, 1, 1, 2, 20, 3, 1, 1, 7, 4, 2, 1, 4, 3, 36, 4, 4, 16, 16, 1, 1, 2, 2, 4, 2, 12, 1, 1, 4, + 8, 7, 4, 20, 4, 2, 6, 1, 4, 132,16, 6, 11, 4, 3, 3, 1, 18, 4, 8, 2, 3, 3, 3, 2, 3, 3, 14, 5, 36, 11, 1, 1, 3, 1, 5, 3, 7, 10, 6, 3, + 2, 9, 2, 2, 10, 2, 2, 1, 1, 1, 1, 10, 6, 2, 2, 2, 2, 4, 2, 16, 2, 2, 2, 2, 1, 1, 1, 1, 1, 3, 6, 6, 3, 26, 1, 1, 6, 2, 3, 1, 1, + 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 3, 2, 2, 2, 2, 7, 7, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 97, 1, 1, 11, 8, 2, 2, 5, 1, 1, 1, 1, + 1, 2, 1, 1, 2, 3, 2, 2, 2, 3, 2, 2, 18, 3, 1, 1, 5, 2, 2, 2, 1, 1, 1, 40, 8, 8, 7, 4, 4, 18, 3, 8, 4, 6, 2, 4, 2, 3, 2, 2, 4, + 3, 3, 3, 7, 4, 14, 3, 2, 5, 5, 3, 2, 2, 2, 10, 5, 5, 2, 3, 20, 2, 4, 1, 2, 4, 4, 4, 3, 3, 3, 3, 3, 2, 96, 2, 5, 3, 9, 1, 3, 10, + 3, 2, 1, 4, 3, 38, 7, 3, 6, 4, 2, 19, 3, 6, 7, 3, 2, 1, 17, 8, 7, 5, 1, 1, 1, 1, 1, 5, 3, 5, 5, 13, 3, 2, 2, 7, 6, 3, 3, 3, 2, + 189,6, 2, 2, 2, 2, 28, 3, 13, 3, 6, 3, 3, 4, 2, 64, 7, 5, 3, 3, 9, 4, 1, 1, 3, 4, 4, 1, 4, 3, 3, 29, 6, 2, 13, 3, 5, 3, 7, 5, 2, + 1, 5, 4, 3, 3, 24, 3, 7, 4, 5, 4, 2, 3, 9, 2, 3, 31, 19, 17, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 1, 2, 2, 3, 4, 2, 1, 1, 3, 7, 3, 3, + 3, 3, 1, 80, 7, 9, 1, 1, 5, 5, 4, 5, 1, 3, 4, 4, 2, 2, 2, 8, 3, 2, 26, 6, 4, 10, 6, 4, 3, 29, 8, 7, 3, 3, 2, 6, 2, 106,3, 4, 17, + 4, 3, 7, 6, 3, 2, 3, 3, 2, 5, 5, 3, 2, 23, 4, 12, 3, 7, 2, 2, 2, 16, 4, 2, 2, 2, 3, 11, 3, 4, 5, 2, 6, 3, 3, 70, 6, 6, 1, 2, 3, + 5, 3, 2, 6, 7, 6, 5, 2, 6, 3, 2, 10, 1, 1, 1, 2, 59, 1, 4, 11, 4, 3, 3, 7, 26, 12, 7, 6, 71, 12, 1, 1, 5, 5, 2, 1, 1, 7, 2, 2, 9, + 7, 6, 4, 4, 3, 2, 2, 5, 2, 2, 19, 9, 7, 2, 4, 1, 1, 5, 1, 1, 30, 2, 1, 6, 3, 3, 5, 21, 1, 2, 5, 4, 3, 2, 6, 2, 1, 1, 41, 11, 3, + 2, 3, 2, 2, 1, 2, 9, 9, 5, 4, 4, 9, 1, 1, 3, 4, 1, 1, 1, 8, 2, 2, 6, 3, 1, 1, 1, 1, 1, 1, 64, 1, 1, 1, 1, 1, 5, 2, 5, 5, 5, + 5, 3, 5, 1, 1, 1, 1, 3, 3, 3, 15, 11, 8, 8, 3, 5, 2, 1, 1, 9, 2, 4, 4, 4, 4, 4, 4, 3, 4, 3, 6, 5, 7, 5, 4, 3, 3, 3, 4, 3, 2, + 2, 2, 2, 4, 2, 3, 1, 1, 1, 1, 1, 3, 1, 1, 5, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 40, + 5, 3, 7, 4, 2, 2, 6, 6, 2, 67, 5, 3, 5, 1, 20, 1, 14, 2, 2, 2, 2, 2, 2, 4, 3, 2, 1, 24, 4, 3, 3, 12, 6, 4, 4, 2, 3, 3, 2, 2, 1, + 1, 1, 63, 10, 4, 4, 1, 3, 2, 2, 46, 2, 4, 20, 3, 5, 2, 6, 3, 5, 4, 4, 2, 3, 1, 68, 8, 1, 16, 5, 3, 3, 5, 8, 1, 1, 1, 7, 2, 3, 7, + 4, 3, 3, 3, 3, 28, 3, 3, 2, 2, 2, 4, 4, 1, 1, 2, 2, 2, 2, 1, 1, 5, 4, 3, 2, 2, 25, 10, 2, 3, 2, 6, 2, 1, 2, 4, 2, 95, 10, 2, 2, + 3, 28, 4, 9, 3, 5, 23, 7, 4, 7, 4, 3, 3, 1, 1, 10, 3, 3, 3, 3, 3, 3, 4, 3, 3, 4, 2, 2, 2, 19, 10, 6, 5, 3, 5, 4, 92, 4, 2, 5, 3, + 14, 7, 3, 4, 2, 15, 3, 2, 5, 2, 3, 29, 2, 4, 3, 3, 3, 2, 7, 5, 6, 3, 8, 2, 4, 14, 4, 3, 3, 4, 33, 8, 8, 3, 3, 5, 3, 2, 4, 254,2, + 2, 15, 2, 2, 12, 6, 6, 3, 2, 2, 3, 2, 5, 4, 11, 4, 4, 14, 2, 1, 2, 1, 19, 2, 3, 3, 2, 2, 3, 2, 3, 2, 15, 2, 2, 2, 1, 1, 1, 3, 89, + 12, 1, 14, 1, 2, 15, 1, 4, 4, 19, 10, 4, 2, 2, 4, 3, 10, 8, 8, 8, 5, 5, 3, 3, 9, 3, 3, 3, 11, 4, 3, 3, 1, 9, 2, 4, 4, 12, 5, 4, 2, + 9, 3, 2, 7, 4, 2, 3, 2, 229,21, 1, 3, 2, 3, 3, 2, 30, 1, 1, 5, 4, 8, 6, 3, 5, 3, 6, 6, 5, 7, 4, 3, 19, 3, 2, 1, 5, 2, 5, 3, 1, + 17, 7, 4, 11, 7, 5, 70, 16, 2, 4, 5, 1, 1, 39, 30, 3, 3, 3, 9, 4, 4, 8, 6, 2, 6, 4, 18, 6, 4, 2, 5, 2, 12, 2, 1, 1, 5, 2, 1, 1, 1, + 1, 3, 16, 3, 2, 2, 6, 2, 7, 105,9, 5, 7, 3, 3, 3, 3, 10, 4, 2, 11, 6, 4, 4, 4, 3, 2, 2, 2, 2, 13, 9, 5, 2, 4, 16, 1, 1, 1, 3, 2, + 6, 5, 4, 4, 2, 2, 2, 2, 3, 2, 16, 3, 3, 1, 3, 23, 4, 3, 4, 2, 3, 2, 16, 2, 4, 20, 6, 2, 5, 7, 49, 19, 2, 7, 13, 8, 2, 4, 3, 9, 2, + 2, 4, 2, 43, 4, 2, 2, 3, 9, 3, 4, 6, 3, 3, 13, 2, 1, 1, 2, 1, 2, 4, 2, 3, 2, 6, 2, 74, 3, 2, 2, 2, 2, 2, 7, 6, 1, 1, 1, 1, 2, 2, 2, 52, 11, 8, 6, 33, 6, 3, 3, 2, 1, 1, 1, 3, 32, 3, 5, 4, 3, 3, 4, 5, 37, 3, 5, 1, 5, 3, 17, 8, 6, 5, 4, 10, 2, 1, 1, 1, 2, 118, - 8, 4, 2, 9, 7, 4, 2, 22, 7, 3, 3, 3, 5, 2, 3, 17, 2, 8, 3, 3, 2, 2, 4, 4, 4, 3, 4, 6, 2, 2, 10, 3, 2, 3, 4, 14, 1, 1, 3, 2, 18, - 8, 2, 6, 1, 3, 23, 2, 2, 2, 3, 3, 5, 2, 1, 1, 3, 2, 19, 6, 2, 4, 4, 2, 2, 1, 2, 42, 27, 3, 3, 16, 2, 5, 4, 3, 6, 42, 6, 23, 23, 19, - 5, 3, 4, 2, 23, 4, 10, 5, 3, 3, 12, 5, 4, 2, 1, 3, 30, 2, 6, 3, 1, 1, 1, 5, 6, 6, 3, 3, 3, 3, 3, 80, 9, 3, 1, 10, 4, 36, 8, 4, 4, - 4, 12, 5, 3, 10, 14, 2, 3, 2, 19, 12, 3, 2, 2, 2, 2, 99, 9, 1, 3, 4, 3, 4, 8, 4, 2, 15, 2, 9, 3, 2, 4, 3, 4, 4, 4, 5, 1, 14, 5, 1, - 1, 4, 3, 8, 12, 3, 31, 3, 16, 8, 8, 4, 10, 5, 1, 6, 3, 151,7, 2, 6, 3, 2, 2, 4, 1, 1, 18, 6, 2, 2, 7, 2, 2, 22, 4, 6, 3, 6, 2, 4, - 3, 3, 12, 6, 3, 2, 10, 5, 2, 2, 2, 2, 40, 6, 1, 17, 10, 3, 4, 8, 16, 6, 5, 103,7, 19, 19, 11, 4, 13, 2, 2, 2, 12, 3, 3, 2, 3, 4, 3, 4, - 2, 3, 2, 4, 1, 1, 1, 23, 4, 7, 4, 4, 3, 3, 5, 4, 3, 3, 2, 106,8, 1, 1, 1, 1, 1, 1, 3, 2, 4, 16, 2, 4, 7, 3, 3, 11, 2, 6, 8, 7, - 1, 1, 1, 1, 2, 1, 1, 1, 1, 4, 2, 26, 3, 2, 2, 2, 3, 3, 9, 3, 65, 8, 3, 37, 2, 5, 5, 18, 3, 2, 2, 2, 2, 2, 4, 3, 8, 2, 5, 5, 3, - 2, 64, 12, 9, 6, 3, 32, 1, 1, 10, 6, 6, 2, 7, 2, 1, 5, 4, 3, 3, 93, 12, 1, 4, 2, 3, 2, 3, 13, 4, 3, 6, 2, 8, 5, 2, 10, 5, 3, 8, 4, - 3, 2, 8, 2, 4, 6, 3, 1, 51, 10, 8, 2, 21, 17, 2, 2, 3, 9, 7, 2, 2, 6, 2, 1, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 1, 249,1, - 1, 2, 83, 2, 4, 2, 2, 2, 3, 1, 3, 3, 3, 5, 5, 4, 20, 5, 3, 3, 8, 3, 6, 3, 2, 2, 2, 3, 3, 3, 3, 3, 13, 1, 2, 2, 5, 3, 1, 5, 2, - 4, 1, 1, 19, 7, 7, 3, 4, 6, 54, 5, 6, 33, 9, 6, 5, 4, 5, 1, 1, 1, 2, 1, 4, 3, 39, 25, 3, 2, 15, 12, 3, 1, 2, 27, 7, 5, 10, 3, 3, 8, - 2, 32, 4, 1, 1, 1, 4, 13, 1, 1, 1, 7, 4, 7, 2, 2, 2, 46, 4, 28, 5, 2, 8, 2, 4, 4, 3, 2, 7, 58, 7, 2, 2, 2, 5, 2, 15, 12, 2, 2, 3, - 2, 4, 1, 1, 1, 1, 4, 2, 1, 1, 6, 6, 4, 5, 5, 2, 39, 3, 6, 12, 2, 2, 2, 2, 26, 2, 16, 9, 2, 7, 3, 3, 4, 37, 2, 2, 10, 4, 3, 9, 3, - 2, 5, 13, 7, 5, 4, 3, 2, 2, 206,4, 3, 2, 39, 1, 1, 18, 2, 2, 4, 3, 4, 1, 1, 6, 4, 2, 3, 2, 7, 6, 5, 1, 7, 3, 11, 3, 3, 1, 1, 1, - 21, 4, 5, 1, 2, 3, 3, 2, 4, 1, 1, 1, 1, 56, 2, 11, 1, 1, 1, 7, 5, 4, 4, 4, 3, 3, 3, 10, 4, 10, 4, 22, 1, 1, 7, 4, 3, 3, 17, 4, 7, - 1, 1, 1, 2, 2, 5, 2, 2, 2, 4, 2, 6, 1, 1, 1, 1, 1, 1, 9, 5, 2, 9, 6, 14, 6, 3, 2, 2, 4, 3, 16, 4, 9, 25, 2, 8, 2, 5, 1, 1, 4, - 2, 108,2, 6, 6, 2, 1, 3, 13, 7, 4, 2, 3, 3, 9, 4, 5, 37, 6, 4, 2, 2, 3, 3, 2, 2, 4, 2, 3, 2, 1, 6, 2, 2, 2, 2, 5, 4, 39, 2, 10, - 5, 2, 2, 3, 7, 3, 3, 2, 4, 23, 1, 2, 1, 1, 4, 6, 4, 16, 4, 6, 6, 5, 3, 5, 10, 7, 4, 4, 4, 105,12, 6, 4, 3, 1, 1, 7, 5, 9, 2, 15, - 6, 5, 5, 4, 4, 4, 4, 7, 3, 3, 21, 2, 11, 2, 1, 3, 7, 5, 5, 13, 1, 2, 1, 6, 6, 6, 4, 4, 9, 3, 1, 4, 3, 4, 222,9, 2, 8, 5, 40, 14, - 11, 2, 2, 2, 1, 5, 2, 3, 20, 15, 6, 5, 4, 2, 12, 2, 2, 9, 4, 9, 4, 3, 11, 6, 2, 1, 1, 1, 5, 1, 41, 4, 18, 3, 3, 3, 6, 4, 16, 6, 2, - 6, 6, 34, 2, 22, 9, 4, 3, 3, 9, 4, 20, 4, 4, 3, 4, 6, 12, 1, 3, 31, 7, 4, 2, 2, 2, 1, 1, 1, 1, 12, 7, 3, 2, 1, 1, 1, 1, 1, 21, 4, - 4, 2, 2, 2, 7, 6, 2, 34, 6, 8, 6, 13, 3, 4, 4, 4, 2, 2, 1, 8, 4, 4, 1, 1, 13, 29, 1, 5, 4, 2, 2, 2, 3, 5, 1, 2, 8, 6, 3, 3, 2, - 10, 4, 4, 8, 4, 1, 1, 1, 1, 1, 8, 4, 2, 51, 18, 14, 3, 4, 3, 3, 3, 3, 3, 11, 5, 3, 1, 12, 3, 5, 6, 5, 25, 12, 11, 8, 5, 2, 5, 4, 25, - 5, 8, 2, 3, 2, 7, 1, 4, 2, 1, 1, 45, 7, 3, 1, 10, 15, 5, 4, 1, 3, 38, 6, 6, 4, 2, 19, 7, 3, 2, 2, 2, 1, 2, 2, 2, 2, 3, 21, 3, 3, - 3, 1, 1, 1, 1, 1, 5, 2, 5, 3, 3, 14, 3, 4, 2, 2, 2, 2, 2, 2, 66, 4, 3, 1, 8, 7, 7, 3, 3, 2, 6, 3, 3, 3, 3, 5, 5, 3, 26, 15, 9, - 1, 1, 2, 1, 1, 4, 3, 6, 4, 4, 1, 1, 49, 4, 4, 15, 14, 13, 1, 1, 3, 2, 2, 2, 1, 1, 3, 3, 1, 1, 5, 2, 2, 2, 2, 1, 2, 2, 11, 2, 4, - 2, 4, 28, 1, 1, 1, 1, 2, 5, 3, 7, 1, 1, 1, 1, 2, 1, 14, 7, 4, 2, 2, 2, 16, 2, 4, 2, 2, 15, 9, 1, 1, 1, 1, 1, 4, 1, 1, 2, 49, 2, - 13, 3, 4, 2, 2, 5, 2, 1, 3, 2, 4, 4, 3, 1, 2, 3, 4, 1, 16, 6, 2, 1, 1, 1, 2, 1, 2, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 4, - 4, 4, 3, 2, 4, 1, 1, 32, 13, 5, 4, 9, 8, 7, 3, 2, 2, 36, 2, 30, 9, 3, 1, 1, 1, 1, 3, 4, 3, 1, 1, 2, 2, 2, 2, 4, 5, 1, 28, 5, 4, - 12, 2, 5, 4, 2, 3, 38, 3, 2, 1, 2, 19, 7, 5, 5, 5, 2, 2, 2, 6, 4, 4, 4, 4, 3, 1, 2, 2, 92, 4, 2, 3, 13, 3, 3, 7, 7, 3, 3, 3, 59, - 6, 2, 2, 4, 4, 1, 13, 4, 4, 7, 5, 5, 5, 2, 5, 9, 2, 2, 1, 7, 5, 5, 1, 1, 3, 3, 2, 2, 2, 1, 1, 18, 10, 6, 6, 3, 2, 3, 1, 1, 11, - 2, 6, 2, 184,12, 7, 6, 4, 9, 2, 25, 3, 1, 1, 12, 3, 3, 3, 2, 2, 3, 2, 3, 3, 5, 3, 2, 6, 6, 1, 1, 1, 4, 79, 9, 3, 3, 6, 3, 3, 3, - 1, 23, 3, 3, 3, 3, 2, 3, 2, 6, 4, 2, 2, 1, 2, 9, 3, 1, 1, 11, 3, 3, 3, 6, 2, 12, 4, 2, 3, 9, 1, 1, 1, 2, 2, 2, 3, 30, 5, 3, 3, - 10, 3, 1, 2, 8, 6, 6, 2, 1, 132,6, 14, 8, 2, 2, 2, 5, 39, 13, 9, 3, 1, 2, 2, 1, 1, 1, 2, 4, 6, 3, 11, 2, 10, 12, 5, 4, 3, 6, 2, 2, - 1, 1, 3, 3, 3, 6, 13, 5, 4, 3, 4, 48, 4, 4, 3, 2, 2, 32, 2, 2, 2, 9, 3, 2, 2, 3, 12, 4, 2, 2, 2, 3, 3, 3, 1, 1, 1, 5, 72, 12, 4, - 2, 2, 2, 17, 2, 2, 2, 5, 3, 3, 20, 1, 11, 11, 3, 3, 5, 1, 1, 1, 1, 82, 4, 4, 4, 2, 7, 7, 7, 6, 4, 12, 5, 2, 40, 3, 1, 1, 32, 1, 1, - 1, 1, 1, 1, 4, 4, 1, 1, 1, 21, 19, 4, 8, 3, 3, 3, 3, 3, 3, 2, 58, 2, 16, 16, 4, 4, 4, 4, 5, 4, 4, 4, 2, 5, 3, 3, 3, 3, 11, 4, 5, - 6, 1, 1, 1, 4, 5, 2, 24, 1, 2, 2, 4, 3, 2, 3, 2, 1, 3, 3, 1, 2, 2, 8, 7, 3, 4, 2, 3, 1, 1, 1, 1, 13, 8, 3, 1, 4, 3, 2, 1, 13, - 5, 3, 1, 7, 2, 2, 26, 9, 3, 3, 8, 52, 4, 18, 4, 6, 3, 9, 5, 2, 2, 3, 2, 1, 2, 2, 2, 2, 4, 2, 64, 20, 2, 2, 2, 2, 1, 8, 2, 2, 6, - 4, 39, 31, 6, 3, 2, 2, 2, 2, 20, 8, 1, 3, 2, 41, 4, 5, 6, 2, 1, 1, 14, 5, 4, 4, 1, 3, 2, 4, 2, 62, 3, 12, 4, 2, 4, 4, 2, 4, 7, 3, - 5, 3, 8, 2, 2, 6, 54, 2, 31, 3, 8, 2, 3, 5, 3, 2, 2, 2, 2, 5, 1, 1, 1, 3, 2, 5, 2, 5, 5, 2, 2, 1, 1, 55, 10, 5, 2, 8, 2, 3, 1, - 9, 3, 5, 7, 3, 3, 2, 4, 3, 35, 11, 8, 3, 3, 2, 1, 1, 1, 1, 1, 5, 4, 6, 3, 17, 3, 8, 5, 4, 1, 19, 2, 6, 3, 3, 2, 5, 1, 2, 11, 2, - 13, 7, 3, 3, 3, 3, 6, 39, 13, 8, 2, 1, 1, 4, 4, 4, 2, 1, 16, 3, 2, 3, 5, 24, 6, 6, 5, 1, 4, 2, 3, 4, 110,21, 9, 8, 24, 3, 1, 9, 5, - 3, 2, 7, 31, 2, 16, 10, 4, 2, 4, 3, 12, 5, 2, 15, 1, 3, 3, 21, 2, 6, 2, 1, 1, 2, 3, 2, 17, 2, 1, 1, 1, 4, 4, 4, 3, 2, 2, 25, 2, 3, - 2, 3, 10, 5, 2, 2, 32, 4, 2, 2, 2, 5, 2, 2, 2, 3, 7, 2, 2, 2, 2, 15, 3, 2, 2, 3, 18, 1, 4, 3, 3, 2, 2, 3, 163,7, 5, 1, 85, 8, 2, - 3, 2, 1, 2, 2, 3, 2, 5, 2, 2, 4, 3, 2, 10, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 2, 18, 2, 14, 2, 2, 2, 2, 2, 7, 7, 7, 7, 1, 1, 1, 1, - 1, 5, 3, 2, 1, 14, 5, 4, 8, 6, 2, 33, 1, 1, 1, 1, 1, 4, 4, 4, 11, 9, 9, 2, 2, 2, 2, 2, 2, 5, 5, 5, 4, 2, 2, 3, 1, 1, 166,7, 2, - 4, 4, 31, 23, 4, 8, 2, 3, 2, 4, 2, 46, 4, 33, 6, 4, 5, 3, 2, 3, 5, 4, 4, 4, 2, 3, 2, 2, 11, 2, 1, 1, 7, 2, 8, 5, 3, 27, 1, 1, 2, - 17, 5, 2, 4, 5, 6, 5, 3, 1, 1, 3, 95, 4, 3, 8, 1, 1, 4, 1, 1, 6, 2, 1, 3, 16, 2, 7, 7, 4, 3, 15, 3, 1, 2, 1, 1, 4, 2, 8, 3, 13, - 6, 2, 4, 3, 3, 67, 1, 14, 5, 5, 5, 4, 2, 4, 10, 8, 6, 4, 22, 11, 2, 4, 5, 231,10, 3, 7, 3, 8, 3, 17, 1, 6, 6, 6, 3, 5, 12, 3, 3, 1, - 4, 2, 73, 5, 17, 5, 5, 2, 2, 2, 3, 3, 3, 12, 9, 2, 7, 2, 13, 8, 4, 3, 18, 2, 1, 9, 3, 2, 3, 37, 20, 2, 2, 6, 4, 3, 5, 19, 5, 4, 6, - 4, 4, 4, 4, 4, 4, 1, 2, 4, 4, 109,4, 2, 7, 7, 3, 17, 2, 3, 3, 5, 3, 5, 3, 7, 5, 4, 2, 15, 1, 13, 11, 11, 10, 6, 3, 8, 3, 28, 14, 3, - 3, 2, 6, 4, 2, 124,1, 1, 1, 7, 2, 12, 8, 8, 4, 3, 3, 2, 7, 1, 5, 7, 6, 2, 3, 6, 6, 2, 5, 3, 2, 2, 3, 6, 15, 2, 4, 4, 3, 3, 21, - 6, 5, 1, 2, 5, 2, 132,2, 7, 6, 3, 13, 7, 4, 1, 2, 7, 2, 3, 11, 7, 2, 4, 1, 7, 2, 57, 2, 41, 3, 1, 2, 1, 1, 2, 2, 4, 4, 3, 6, 5, - 8, 2, 2, 3, 2, 2, 3, 9, 1, 2, 37, 7, 4, 3, 3, 18, 10, 3, 1, 1, 4, 1, 1, 79, 6, 9, 7, 2, 2, 6, 2, 3, 15, 5, 10, 4, 3, 11, 5, 3, 3, - 2, 2, 3, 5, 2, 6, 24, 4, 2, 1, 5, 4, 2, 1, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 42, 1, 7, 2, 3, 2, 2, 1, 1, 1, 2, 1, 9, 2, - 2, 2, 2, 7, 2, 1, 3, 2, 1, 1, 1, 4, 3, 3, 3, 3, 2, 1, 1, 1, 20, 1, 1, 1, 1, 1, 10, 3, 2, 2, 5, 14, 1, 1, 1, 3, 3, 2, 2, 1, 1, - 20, 2, 2, 2, 8, 2, 2, 1, 1, 3, 2, 41, 4, 11, 4, 3, 2, 9, 6, 4, 2, 4, 3, 3, 3, 2, 2, 21, 20, 7, 7, 3, 2, 4, 3, 2, 40, 6, 8, 2, 1, - 5, 4, 5, 3, 2, 4, 3, 3, 3, 45, 4, 1, 2, 1, 1, 7, 4, 4, 3, 1, 5, 9, 2, 4, 26, 18, 4, 4, 4, 4, 1, 2, 2, 2, 2, 56, 10, 14, 2, 4, 14, - 5, 2, 8, 6, 3, 10, 1, 1, 3, 3, 21, 5, 6, 2, 1, 1, 5, 2, 63, 5, 2, 5, 6, 5, 12, 1, 1, 1, 3, 3, 4, 10, 3, 8, 129,27, 21, 10, 5, 3, 19, - 2, 2, 7, 6, 2, 3, 9, 2, 2, 4, 2, 2, 2, 15, 4, 2, 8, 8, 2, 16, 9, 5, 3, 3, 3, 2, 12, 2, 9, 22, 4, 3, 1, 9, 3, 3, 5, 121,5, 4, 11, - 4, 2, 1, 4, 4, 4, 4, 1, 1, 14, 7, 5, 2, 9, 3, 12, 4, 5, 3, 2, 15, 2, 3, 2, 38, 1, 17, 14, 6, 6, 5, 2, 2, 6, 2, 5, 3, 5, 2, 12, 5, - 4, 1, 83, 7, 4, 18, 4, 3, 7, 6, 19, 3, 10, 3, 3, 3, 6, 16, 4, 1, 94, 8, 3, 4, 3, 3, 3, 3, 11, 2, 3, 5, 2, 1, 1, 19, 6, 5, 8, 1, 1, - 19, 4, 6, 4, 14, 3, 44, 17, 17, 6, 4, 7, 6, 4, 10, 2, 6, 13, 2, 2, 3, 3, 2, 2, 7, 1, 1, 2, 1, 1, 1, 5, 4, 3, 2, 2, 1, 1, 1, 10, 2, - 2, 2, 3, 8, 6, 6, 6, 4, 67, 6, 3, 2, 2, 60, 13, 3, 4, 3, 3, 44, 5, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 7, - 4, 4, 9, 3, 4, 6, 2, 3, 1, 2, 2, 2, 2, 6, 4, 3, 9, 6, 4, 3, 3, 1, 1, 2, 12, 4, 2, 16, 7, 4, 2, 2, 2, 2, 9, 4, 3, 4, 90, 2, 2, - 2, 42, 39, 2, 5, 4, 4, 2, 2, 1, 1, 1, 3, 1, 3, 3, 3, 2, 2, 2, 2, 2, 3, 1, 1, 1, 1, 1, 1, 7, 3, 2, 1, 1, 1, 1, 2, 3, 2, 2, 2, - 2, 2, 2, 5, 9, 9, 1, 6, 5, 30, 6, 2, 1, 1, 1, 4, 4, 3, 2, 2, 2, 2, 2, 1, 1, 1, 1, 15, 3, 3, 12, 2, 2, 2, 2, 9, 6, 5, 2, 2, 1, - 1, 1, 1, 1, 7, 17, 3, 1, 1, 1, 7, 7, 7, 2, 5, 4, 5, 3, 2, 1, 1, 1, 1, 1, 1, 1, 12, 3, 3, 3, 4, 1, 1, 1, 1, 1, 2, 2, 75, 2, 13, - 11, 3, 2, 5, 2, 2, 1, 1, 2, 2, 22, 1, 1, 1, 2, 2, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 4, 4, 4, 17, 2, 11, 3, 2, 3, 2, 1, 6, - 2, 3, 2, 2, 1, 1, 57, 1, 1, 10, 4, 1, 2, 12, 2, 2, 8, 2, 1, 1, 1, 1, 1, 9, 5, 5, 2, 8, 6, 2, 2, 4, 3, 3, 4, 1, 1, 113,11, 1, 1, - 1, 2, 5, 3, 41, 8, 3, 3, 6, 2, 2, 2, 3, 2, 2, 3, 3, 3, 3, 8, 8, 7, 3, 2, 20, 1, 12, 3, 3, 1, 2, 3, 3, 3, 3, 1, 1, 2, 4, 3, 6, - 12, 9, 6, 3, 3, 1, 2, 2, 2, 2, 2, 5, 2, 111,5, 6, 5, 5, 2, 2, 2, 1, 44, 13, 10, 7, 5, 3, 1, 1, 16, 15, 13, 9, 7, 6, 6, 6, 6, 17, 2, - 2, 12, 1, 2, 2, 2, 2, 2, 2, 5, 1, 8, 5, 1, 1, 1, 1, 1, 1, 15, 8, 3, 3, 2, 1, 1, 6, 6, 3, 3, 3, 3, 2, 2, 13, 1, 1, 1, 1, 3, 1, - 2, 30, 1, 1, 1, 1, 5, 1, 1, 4, 7, 6, 5, 4, 4, 2, 1, 1, 1, 2, 1, 1, 68, 2, 2, 4, 1, 1, 1, 2, 2, 1, 6, 5, 1, 28, 11, 5, 3, 2, 2, - 9, 8, 3, 9, 6, 3, 2, 2, 1, 1, 1, 7, 5, 3, 20, 4, 4, 4, 3, 3, 4, 2, 2, 2, 1, 2, 2, 1, 3, 3, 20, 1, 7, 3, 3, 2, 1, 9, 4, 1, 2, - 2, 2, 2, 2, 1, 1, 26, 4, 2, 11, 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, 214,1, 14, 1, 1, 1, 1, 3, 1, 1, 1, 1, 2, 1, 8, 2, 1, 3, 23, 5, 3, - 8, 8, 2, 3, 5, 1, 73, 5, 1, 12, 7, 4, 4, 3, 2, 2, 3, 15, 3, 3, 4, 3, 2, 2, 26, 9, 9, 9, 9, 8, 4, 16, 4, 11, 11, 5, 4, 4, 2, 1, 57, - 2, 51, 51, 2, 2, 1, 2, 2, 3, 3, 3, 2, 9, 3, 4, 2, 2, 10, 10, 9, 5, 1, 10, 1, 1, 8, 7, 4, 2, 43, 2, 22, 7, 13, 13, 5, 5, 3, 1, 4, 2, - 2, 1, 25, 4, 8, 3, 3, 3, 2, 5, 2, 3, 2, 9, 2, 2, 1, 7, 6, 15, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 4, 3, 65, 7, 2, 2, 2, 3, 2, 18, 1, - 1, 1, 4, 4, 4, 3, 7, 9, 6, 3, 16, 5, 5, 5, 4, 8, 5, 5, 5, 3, 15, 14, 3, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 5, 2, 235,34, 6, 6, 6, 8, 5, 8, 7, 4, 3, 3, 3, 3, 3, 3, 58, 3, 3, 2, 2, 8, 3, 2, 2, - 1, 39, 5, 5, 1, 1, 1, 6, 5, 5, 5, 13, 9, 8, 5, 5, 3, 1, 1, 9, 9, 9, 9, 1, 1, 2, 2, 3, 2, 2, 34, 8, 6, 6, 6, 6, 6, 10, 8, 8, 35, - 13, 13, 1, 1, 6, 5, 3, 12, 2, 4, 4, 4, 3, 5, 5, 2, 2, 54, 2, 2, 2, 2, 2, 2, 20, 3, 3, 3, 15, 14, 10, 7, 7, 10, 1, 1, 21, 1, 4, 2, 2, - 15, 9, 8, 13, 5, 5, 3, 3, 3, 4, 2, 54, 5, 3, 2, 14, 6, 2, 2, 2, 4, 4, 4, 7, 7, 6, 7, 4, 4, 1, 2, 2, 2, 1, 1, 1, 1, 4, 1, 3, 3, - 1, 1, 2, 2, 2, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 9, 6, 6, 6, 6, 1, 1, 1, 1, 1, 12, 3, 1, 1, 1, 1, 1, 5, 1, 183,24, 1, 1, 1, 5, 6, - 6, 5, 5, 5, 8, 3, 5, 5, 5, 14, 6, 2, 2, 4, 2, 5, 26, 7, 7, 7, 5, 4, 4, 4, 4, 4, 2, 2, 6, 18, 5, 5, 9, 5, 4, 4, 4, 54, 3, 3, 3, - 3, 17, 1, 1, 1, 1, 12, 4, 3, 3, 3, 2, 4, 4, 4, 4, 2, 2, 1, 1, 1, 18, 2, 1, 1, 1, 2, 2, 8, 1, 1, 1, 1, 5, 1, 4, 1, 1, 2, 1, 1, - 1, 1, 4, 4, 4, 4, 4, 4, 12, 7, 7, 7, 6, 6, 4, 2, 1, 1, 17, 14, 5, 4, 3, 3, 5, 5, 5, 5, 3, 3, 3, 3, 22, 9, 4, 1, 1, 7, 207,6, 3, - 2, 46, 2, 2, 5, 3, 5, 1, 1, 1, 3, 3, 3, 3, 2, 2, 6, 6, 2, 9, 9, 9, 9, 6, 6, 4, 2, 1, 1, 4, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, - 85, 18, 1, 11, 5, 18, 10, 5, 5, 2, 2, 2, 12, 4, 3, 4, 2, 3, 13, 7, 1, 5, 3, 2, 2, 4, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 10, 10, 9, 9, 9, - 8, 5, 19, 1, 1, 4, 2, 2, 2, 2, 2, 1, 5, 4, 4, 3, 3, 1, 1, 4, 3, 1, 1, 1, 44, 1, 1, 1, 1, 18, 11, 7, 15, 14, 14, 13, 9, 8, 6, 3, 51, - 1, 1, 1, 7, 7, 3, 3, 3, 2, 3, 3, 3, 4, 2, 2, 2, 1, 5, 5, 3, 3, 6, 1, 6, 2, 1, 1, 1, 1, 3, 3, 3, 3, 12, 1, 1, 1, 1, 2, 6, 4, - 2, 2, 2, 2, 1, 1, 1, 174,24, 3, 1, 3, 14, 13, 3, 3, 2, 28, 8, 8, 5, 15, 2, 2, 3, 3, 2, 4, 33, 4, 4, 4, 8, 6, 6, 12, 10, 10, 4, 2, 2, - 3, 3, 3, 35, 11, 5, 2, 6, 3, 5, 4, 6, 5, 4, 2, 2, 2, 9, 8, 8, 5, 28, 1, 2, 2, 2, 18, 18, 11, 6, 5, 2, 2, 16, 9, 3, 3, 3, 3, 3, 3, - 3, 2, 2, 5, 5, 5, 4, 10, 4, 4, 4, 87, 7, 4, 2, 2, 2, 23, 2, 1, 1, 2, 7, 4, 4, 3, 3, 10, 7, 3, 2, 7, 1, 1, 1, 1, 3, 23, 12, 1, 2, - 4, 2, 4, 4, 2, 4, 1, 1, 2, 2, 2, 1, 1, 3, 3, 44, 13, 8, 8, 8, 4, 3, 3, 2, 1, 13, 11, 3, 8, 8, 9, 9, 9, 9, 3, 1, 1, 1, 1, 5, 4, - 4, 4, 29, 2, 2, 2, 2, 2, 2, 19, 18, 17, 7, 4, 24, 10, 10, 10, 14, 5, 7, 3, 2, 2, 15, 2, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 11, 5, 3, 5, - 4, 46, 6, 1, 1, 2, 8, 6, 7, 4, 1, 17, 7, 6, 6, 4, 9, 9, 8, 2, 4, 2, 2, 1, 21, 6, 3, 3, 3, 3, 1, 3, 2, 2, 2, 1, 1, 1, 1, 2, 1, - 2, 1, 3, 1, 1, 1, 5, 2, 3, 3, 1, 1, 1, 1, 13, 13, 12, 7, 5, 5, 5, 1, 1, 223,10, 5, 2, 9, 5, 4, 27, 11, 8, 4, 2, 2, 2, 3, 2, 2, 1, - 7, 2, 26, 6, 5, 8, 3, 3, 5, 5, 2, 2, 5, 4, 4, 4, 6, 6, 2, 11, 2, 6, 2, 2, 18, 10, 10, 10, 4, 3, 8, 8, 80, 29, 2, 15, 13, 2, 1, 7, 5, - 2, 2, 28, 5, 5, 5, 14, 14, 14, 8, 7, 7, 5, 5, 20, 20, 10, 10, 10, 10, 10, 10, 7, 6, 3, 36, 3, 2, 2, 2, 2, 1, 1, 4, 4, 3, 3, 3, 3, 14, 9, - 15, 2, 1, 1, 1, 3, 3, 3, 3, 3, 8, 2, 23, 20, 15, 5, 19, 15, 5, 5, 5, 4, 4, 4, 9, 8, 6, 6, 3, 25, 5, 11, 9, 5, 3, 9, 6, 6, 6, 12, 10, - 9, 6, 1, 5, 2, 2, 2, 43, 3, 3, 3, 12, 7, 7, 7, 7, 6, 17, 2, 1, 1, 1, 2, 1, 9, 7, 7, 7, 7, 1, 1, 1, 2, 1, 2, 1, 1, 9, 4, 1, 1, - 1, 3, 1, 1, 1, 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, 8, 7, 6, 3, 17, 6, 5, 10, 10, 5, 4, 3, 3, 3, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, - 1, 4, 3, 3, 20, 4, 4, 3, 3, 1, 2, 7, 6, 2, 2, 24, 3, 3, 3, 2, 9, 6, 6, 5, 9, 2, 3, 3, 1, 1, 1, 35, 21, 6, 3, 12, 11, 11, 11, 11, 10, - 5, 3, 2, 2, 2, 2, 7, 1, 3, 2, 2, 2, 1, 21, 1, 1, 3, 3, 2, 2, 6, 5, 4, 4, 11, 10, 10, 1, 1, 1, 24, 2, 6, 2, 3, 2, 2, 1, 1, 1, 1, - 1, 9, 7, 7, 7, 19, 2, 1, 1, 1, 7, 4, 2, 6, 2, 8, 2, 2, 3, 3, 2, 1, 1, 21, 3, 10, 9, 5, 5, 5, 5, 1, 1, 1, 8, 8, 8, 3, 1, 1, 2, - 2, 4, 4, 3, 2, 2, 12, 9, 5, 4, 9, 3, 3, 3, 3, 3, 62, 22, 1, 1, 1, 4, 1, 4, 1, 3, 2, 4, 3, 3, 2, 1, 1, 1, 3, 2, 2, 12, 2, 17, 7, - 7, 7, 3, 2, 2, 2, 2, 2, 9, 9, 6, 6, 5, 3, 3, 8, 1, 1, 1, 2, 1, 2, 2, 124,24, 10, 9, 9, 5, 5, 5, 57, 13, 13, 5, 5, 20, 2, 1, 6, 9, - 5, 22, 22, 14, 12, 12, 11, 23, 2, 2, 2, 3, 3, 3, 5, 4, 4, 10, 18, 10, 4, 2, 2, 2, 2, 4, 3, 3, 2, 5, 2, 53, 6, 6, 5, 3, 3, 3, 6, 3, 2, - 17, 3, 2, 9, 2, 2, 2, 2, 2, 2, 3, 3, 2, 2, 2, 32, 3, 1, 4, 2, 2, 2, 7, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 9, 1, 2, 2, 3, 5, 1, 2, - 2, 1, 1, 217,23, 1, 2, 6, 1, 2, 2, 15, 4, 4, 4, 4, 2, 3, 2, 2, 38, 3, 2, 1, 4, 1, 1, 1, 1, 7, 5, 4, 2, 13, 10, 4, 3, 3, 2, 1, 2, - 3, 1, 56, 5, 48, 3, 4, 3, 2, 1, 2, 2, 4, 2, 5, 10, 7, 5, 3, 3, 2, 2, 2, 53, 7, 3, 3, 3, 3, 3, 3, 32, 1, 1, 1, 1, 4, 3, 1, 2, 2, - 1, 1, 5, 5, 5, 5, 5, 4, 2, 2, 4, 1, 1, 1, 1, 7, 3, 3, 3, 4, 3, 3, 3, 6, 4, 4, 2, 12, 4, 4, 8, 8, 2, 3, 1, 3, 6, 4, 4, 1, 1, - 1, 1, 1, 1, 1, 1, 51, 8, 7, 9, 9, 7, 6, 3, 2, 2, 5, 4, 4, 4, 7, 2, 8, 2, 4, 4, 23, 2, 1, 1, 1, 1, 4, 8, 4, 3, 2, 5, 1, 7, 3, - 24, 5, 2, 8, 3, 2, 2, 15, 5, 3, 2, 4, 2, 2, 30, 20, 11, 8, 4, 1, 5, 5, 8, 2, 10, 8, 2, 4, 4, 3, 45, 1, 2, 10, 8, 7, 4, 3, 1, 1, 13, - 9, 5, 3, 3, 2, 1, 1, 3, 8, 11, 9, 9, 8, 4, 22, 4, 1, 2, 9, 6, 17, 3, 2, 5, 3, 2, 5, 2, 92, 3, 27, 20, 17, 10, 7, 2, 6, 5, 2, 9, 7, - 6, 6, 6, 3, 3, 3, 3, 3, 13, 1, 1, 1, 5, 4, 4, 5, 4, 2, 1, 4, 3, 15, 2, 6, 5, 3, 2, 2, 2, 2, 67, 30, 26, 3, 2, 3, 2, 1, 8, 6, 22, - 2, 2, 9, 7, 4, 3, 4, 7, 5, 3, 29, 24, 2, 2, 12, 1, 5, 1, 1, 4, 1, 1, 1, 1, 1, 6, 4, 2, 34, 10, 2, 2, 2, 2, 1, 2, 3, 2, 1, 1, 1, - 2, 2, 2, 2, 2, 2, 3, 3, 2, 1, 7, 2, 3, 10, 2, 2, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 38, 7, 3, 11, 5, 5, 2, 2, 3, 3, 3, - 6, 5, 5, 4, 2, 2, 177,5, 2, 4, 5, 4, 3, 97, 7, 4, 2, 10, 6, 5, 4, 3, 2, 2, 11, 4, 4, 4, 4, 2, 2, 2, 2, 10, 7, 3, 3, 2, 9, 2, 3, - 3, 1, 1, 4, 2, 2, 15, 11, 10, 2, 34, 26, 2, 7, 3, 4, 5, 2, 25, 24, 3, 13, 6, 3, 5, 2, 15, 3, 5, 1, 9, 3, 1, 13, 9, 44, 5, 3, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 5, 4, 6, 5, 5, 4, 4, 3, 3, 7, 3, 2, 5, 5, 4, 19, 4, 3, 1, 6, 2, 3, 32, 10, 3, 6, 1, 6, 3, 1, 2, 1, 1, 1, 2, - 45, 3, 21, 1, 2, 8, 4, 3, 2, 9, 8, 3, 1, 25, 10, 5, 2, 2, 2, 4, 4, 1, 1, 1, 122,15, 6, 5, 4, 4, 3, 57, 49, 3, 7, 4, 3, 3, 3, 1, 1, - 21, 9, 2, 1, 1, 9, 1, 4, 3, 2, 177,11, 2, 4, 5, 3, 8, 6, 3, 29, 4, 2, 3, 7, 5, 1, 27, 5, 7, 5, 13, 2, 6, 17, 9, 5, 4, 18, 5, 1, 3, - 6, 3, 1, 17, 3, 3, 11, 6, 6, 4, 1, 1, 1, 1, 1, 4, 3, 13, 7, 6, 3, 2, 2, 2, 11, 11, 6, 3, 95, 5, 2, 10, 6, 5, 14, 2, 3, 2, 2, 2, 5, - 5, 1, 13, 2, 8, 2, 19, 4, 9, 2, 2, 2, 6, 4, 3, 1, 1, 1, 1, 81, 2, 1, 5, 5, 4, 2, 15, 13, 12, 9, 32, 31, 4, 8, 8, 7, 3, 5, 3, 2, 10, - 3, 2, 24, 6, 9, 6, 2, 2, 2, 4, 3, 27, 9, 1, 9, 3, 7, 19, 6, 2, 2, 2, 3, 2, 2, 5, 5, 2, 4, 53, 14, 1, 1, 1, 1, 1, 1, 1, 4, 3, 2, - 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 3, 4, 2, 5, 2, 2, 3, 3, 3, 1, 1, 4, 4, 2, 2, 1, 1, 26, 7, 4, 16, 2, 2, 4, 1, 9, 2, 2, 1, 1, 4, - 1, 1, 1, 1, 1, 3, 51, 4, 3, 3, 44, 3, 3, 2, 2, 2, 3, 1, 1, 7, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 2, 3, 3, 3, 10, 5, 2, 3, 1, 1, 1, - 1, 1, 2, 2, 6, 1, 1, 2, 4, 1, 1, 23, 2, 11, 3, 2, 1, 1, 2, 1, 1, 1, 27, 3, 13, 2, 2, 3, 2, 3, 45, 43, 14, 14, 6, 5, 4, 2, 12, 6, 3, - 1, 2, 9, 2, 2, 3, 2, 3, 36, 2, 4, 4, 2, 2, 19, 3, 6, 2, 7, 2, 2, 2, 13, 3, 3, 4, 100,4, 4, 3, 6, 10, 2, 3, 7, 2, 3, 1, 43, 6, 9, - 13, 5, 4, 4, 11, 4, 8, 5, 2, 11, 1, 4, 4, 4, 4, 4, 3, 9, 5, 3, 101,5, 2, 2, 5, 12, 9, 5, 4, 4, 10, 6, 13, 4, 3, 5, 3, 5, 1, 2, 9, - 4, 2, 20, 3, 5, 2, 9, 3, 2, 2, 2, 2, 90, 2, 2, 3, 3, 2, 1, 2, 1, 4, 3, 3, 35, 2, 10, 17, 12, 10, 2, 8, 4, 29, 1, 24, 4, 3, 3, 4, 3, - 2, 40, 5, 1, 4, 4, 3, 3, 6, 2, 13, 5, 5, 3, 3, 3, 1, 22, 2, 1, 13, 12, 5, 4, 3, 3, 7, 3, 2, 5, 1, 1, 1, 1, 2, 1, 1, 16, 5, 3, 2, - 3, 1, 1, 1, 1, 1, 1, 1, 4, 4, 1, 1, 1, 1, 1, 1, 1, 196,14, 9, 1, 5, 2, 3, 1, 1, 1, 1, 1, 2, 1, 2, 19, 2, 1, 1, 1, 1, 12, 2, 5, - 4, 4, 3, 12, 6, 64, 2, 1, 1, 12, 10, 1, 8, 5, 2, 5, 3, 31, 5, 21, 39, 5, 3, 2, 2, 2, 11, 2, 4, 3, 3, 12, 4, 3, 7, 1, 1, 4, 4, 4, 3, - 2, 2, 3, 4, 3, 12, 7, 4, 3, 2, 2, 1, 12, 1, 1, 1, 1, 2, 1, 1, 5, 1, 1, 1, 1, 1, 6, 2, 2, 2, 2, 2, 1, 6, 1, 1, 2, 1, 3, 1, 1, - 1, 1, 1, 1, 1, 25, 2, 2, 14, 7, 4, 4, 4, 14, 5, 2, 2, 19, 2, 2, 5, 2, 2, 9, 4, 3, 2, 2, 13, 2, 2, 4, 1, 1, 39, 5, 2, 3, 3, 2, 5, - 2, 2, 4, 5, 1, 5, 1, 4, 4, 3, 10, 2, 2, 118,23, 21, 12, 5, 4, 2, 2, 2, 1, 4, 89, 5, 3, 4, 3, 3, 2, 2, 5, 2, 2, 2, 5, 2, 2, 14, 9, - 2, 2, 21, 7, 6, 5, 4, 3, 1, 18, 14, 5, 5, 6, 5, 26, 19, 14, 5, 4, 33, 4, 11, 1, 3, 4, 10, 5, 6, 63, 12, 4, 4, 4, 4, 15, 12, 6, 3, 1, 1, - 3, 1, 9, 6, 11, 4, 1, 1, 3, 3, 61, 1, 38, 27, 24, 4, 5, 7, 6, 2, 1, 3, 2, 2, 2, 92, 1, 2, 37, 6, 5, 17, 16, 2, 1, 1, 1, 1, 26, 17, 16, - 10, 3, 3, 4, 4, 4, 29, 3, 21, 2, 17, 7, 7, 5, 9, 7, 14, 4, 4, 3, 3, 5, 4, 3, 1, 1, 1, 1, 1, 22, 3, 3, 5, 4, 3, 3, 7, 3, 2, 2, 2, - 3, 1, 1, 2, 1, 1, 7, 2, 2, 1, 6, 3, 1, 1, 1, 22, 16, 4, 2, 4, 2, 1, 5, 17, 3, 3, 8, 5, 3, 41, 8, 3, 5, 11, 7, 10, 6, 4, 3, 3, 13, - 4, 4, 2, 2, 21, 2, 2, 2, 11, 3, 3, 3, 3, 2, 1, 8, 4, 16, 12, 10, 3, 2, 6, 4, 1, 6, 3, 70, 7, 44, 16, 10, 15, 5, 4, 4, 1, 2, 12, 1, 1, - 1, 3, 4, 30, 3, 7, 3, 2, 16, 2, 2, 4, 114,2, 1, 7, 3, 24, 1, 1, 7, 2, 8, 2, 19, 1, 5, 1, 5, 29, 3, 2, 2, 13, 11, 1, 1, 1, 3, 3, 2, - 17, 5, 3, 2, 4, 2, 2, 5, 4, 1, 7, 6, 4, 4, 59, 9, 4, 5, 4, 7, 6, 6, 5, 2, 21, 10, 3, 1, 1, 1, 3, 75, 3, 2, 67, 4, 3, 4, 3, 2, 2, - 41, 9, 4, 4, 8, 6, 20, 5, 3, 2, 2, 2, 4, 9, 4, 13, 10, 8, 4, 4, 3, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 5, 1, 2, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 2, 3, 2, 1, 7, 5, 1, 4, 4, 4, 3, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 14, 2, 2, 1, 2, 41, 11, 2, - 1, 2, 6, 6, 4, 3, 3, 5, 2, 4, 5, 2, 2, 31, 2, 11, 4, 2, 3, 1, 1, 2, 2, 4, 2, 7, 3, 3, 3, 34, 6, 8, 2, 7, 3, 2, 2, 2, 23, 3, 4, - 1, 1, 2, 2, 1, 1, 1, 4, 2, 1, 1, 1, 1, 1, 11, 4, 2, 2, 20, 7, 1, 2, 2, 41, 15, 4, 2, 6, 2, 8, 4, 4, 1, 5, 2, 1, 1, 1, 1, 1, 4, - 2, 52, 2, 2, 3, 2, 8, 3, 2, 7, 3, 2, 7, 4, 4, 1, 1, 1, 7, 5, 3, 9, 4, 1, 1, 37, 18, 2, 3, 2, 2, 2, 1, 1, 4, 3, 4, 2, 3, 197,31, - 4, 2, 3, 2, 1, 8, 6, 1, 2, 3, 3, 4, 6, 2, 2, 1, 1, 2, 2, 3, 2, 24, 1, 1, 1, 1, 4, 2, 2, 2, 2, 2, 1, 5, 1, 3, 4, 3, 2, 1, 1, + 8, 4, 2, 9, 7, 4, 2, 22, 7, 3, 3, 3, 5, 2, 3, 17, 2, 8, 3, 3, 2, 2, 4, 4, 4, 3, 4, 6, 2, 2, 10, 3, 2, 3, 4, 14, 1, 1, 3, 2, 18, + 8, 2, 6, 1, 3, 23, 2, 2, 2, 3, 3, 5, 2, 1, 1, 3, 2, 19, 6, 2, 4, 4, 2, 2, 1, 2, 42, 27, 3, 3, 16, 2, 5, 4, 3, 6, 42, 6, 23, 23, 19, + 5, 3, 4, 2, 23, 4, 10, 5, 3, 3, 12, 5, 4, 2, 1, 3, 30, 2, 6, 3, 1, 1, 1, 5, 6, 6, 3, 3, 3, 3, 3, 80, 9, 3, 1, 10, 4, 36, 8, 4, 4, + 4, 12, 5, 3, 10, 14, 2, 3, 2, 19, 12, 3, 2, 2, 2, 2, 99, 9, 1, 3, 4, 3, 4, 8, 4, 2, 15, 2, 9, 3, 2, 4, 3, 4, 4, 4, 5, 1, 14, 5, 1, + 1, 4, 3, 8, 12, 3, 31, 3, 16, 8, 8, 4, 10, 5, 1, 6, 3, 151,7, 2, 6, 3, 2, 2, 4, 1, 1, 18, 6, 2, 2, 7, 2, 2, 22, 4, 6, 3, 6, 2, 4, + 3, 3, 12, 6, 3, 2, 10, 5, 2, 2, 2, 2, 40, 6, 1, 17, 10, 3, 4, 8, 16, 6, 5, 103,7, 19, 19, 11, 4, 13, 2, 2, 2, 12, 3, 3, 2, 3, 4, 3, 4, + 2, 3, 2, 4, 1, 1, 1, 23, 4, 7, 4, 4, 3, 3, 5, 4, 3, 3, 2, 106,8, 1, 1, 1, 1, 1, 1, 3, 2, 4, 16, 2, 4, 7, 3, 3, 11, 2, 6, 8, 7, + 1, 1, 1, 1, 2, 1, 1, 1, 1, 4, 2, 26, 3, 2, 2, 2, 3, 3, 9, 3, 65, 8, 3, 37, 2, 5, 5, 18, 3, 2, 2, 2, 2, 2, 4, 3, 8, 2, 5, 5, 3, + 2, 64, 12, 9, 6, 3, 32, 1, 1, 10, 6, 6, 2, 7, 2, 1, 5, 4, 3, 3, 93, 12, 1, 4, 2, 3, 2, 3, 13, 4, 3, 6, 2, 8, 5, 2, 10, 5, 3, 8, 4, + 3, 2, 8, 2, 4, 6, 3, 1, 51, 10, 8, 2, 21, 17, 2, 2, 3, 9, 7, 2, 2, 6, 2, 1, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 1, 249,1, + 1, 2, 83, 2, 4, 2, 2, 2, 3, 1, 3, 3, 3, 5, 5, 4, 20, 5, 3, 3, 8, 3, 6, 3, 2, 2, 2, 3, 3, 3, 3, 3, 13, 1, 2, 2, 5, 3, 1, 5, 2, + 4, 1, 1, 19, 7, 7, 3, 4, 6, 54, 5, 6, 33, 9, 6, 5, 4, 5, 1, 1, 1, 2, 1, 4, 3, 39, 25, 3, 2, 15, 12, 3, 1, 2, 27, 7, 5, 10, 3, 3, 8, + 2, 32, 4, 1, 1, 1, 4, 13, 1, 1, 1, 7, 4, 7, 2, 2, 2, 46, 4, 28, 5, 2, 8, 2, 4, 4, 3, 2, 7, 58, 7, 2, 2, 2, 5, 2, 15, 12, 2, 2, 3, + 2, 4, 1, 1, 1, 1, 4, 2, 1, 1, 6, 6, 4, 5, 5, 2, 39, 3, 6, 12, 2, 2, 2, 2, 26, 2, 16, 9, 2, 7, 3, 3, 4, 37, 2, 2, 10, 4, 3, 9, 3, + 2, 5, 13, 7, 5, 4, 3, 2, 2, 206,4, 3, 2, 39, 1, 1, 18, 2, 2, 4, 3, 4, 1, 1, 6, 4, 2, 3, 2, 7, 6, 5, 1, 7, 3, 11, 3, 3, 1, 1, 1, + 21, 4, 5, 1, 2, 3, 3, 2, 4, 1, 1, 1, 1, 56, 2, 11, 1, 1, 1, 7, 5, 4, 4, 4, 3, 3, 3, 10, 4, 10, 4, 22, 1, 1, 7, 4, 3, 3, 17, 4, 7, + 1, 1, 1, 2, 2, 5, 2, 2, 2, 4, 2, 6, 1, 1, 1, 1, 1, 1, 9, 5, 2, 9, 6, 14, 6, 3, 2, 2, 4, 3, 16, 4, 9, 25, 2, 8, 2, 5, 1, 1, 4, + 2, 108,2, 6, 6, 2, 1, 3, 13, 7, 4, 2, 3, 3, 9, 4, 5, 37, 6, 4, 2, 2, 3, 3, 2, 2, 4, 2, 3, 2, 1, 6, 2, 2, 2, 2, 5, 4, 39, 2, 10, + 5, 2, 2, 3, 7, 3, 3, 2, 4, 23, 1, 2, 1, 1, 4, 6, 4, 16, 4, 6, 6, 5, 3, 5, 10, 7, 4, 4, 4, 105,12, 6, 4, 3, 1, 1, 7, 5, 9, 2, 15, + 6, 5, 5, 4, 4, 4, 4, 7, 3, 3, 21, 2, 11, 2, 1, 3, 7, 5, 5, 13, 1, 2, 1, 6, 6, 6, 4, 4, 9, 3, 1, 4, 3, 4, 222,9, 2, 8, 5, 40, 14, + 11, 2, 2, 2, 1, 5, 2, 3, 20, 15, 6, 5, 4, 2, 12, 2, 2, 9, 4, 9, 4, 3, 11, 6, 2, 1, 1, 1, 5, 1, 41, 4, 18, 3, 3, 3, 6, 4, 16, 6, 2, + 6, 6, 34, 2, 22, 9, 4, 3, 3, 9, 4, 20, 4, 4, 3, 4, 6, 12, 1, 3, 31, 7, 4, 2, 2, 2, 1, 1, 1, 1, 12, 7, 3, 2, 1, 1, 1, 1, 1, 21, 4, + 4, 2, 2, 2, 7, 6, 2, 34, 6, 8, 6, 13, 3, 4, 4, 4, 2, 2, 1, 8, 4, 4, 1, 1, 13, 29, 1, 5, 4, 2, 2, 2, 3, 5, 1, 2, 8, 6, 3, 3, 2, + 10, 4, 4, 8, 4, 1, 1, 1, 1, 1, 8, 4, 2, 51, 18, 14, 3, 4, 3, 3, 3, 3, 3, 11, 5, 3, 1, 12, 3, 5, 6, 5, 25, 12, 11, 8, 5, 2, 5, 4, 25, + 5, 8, 2, 3, 2, 7, 1, 4, 2, 1, 1, 45, 7, 3, 1, 10, 15, 5, 4, 1, 3, 38, 6, 6, 4, 2, 19, 7, 3, 2, 2, 2, 1, 2, 2, 2, 2, 3, 21, 3, 3, + 3, 1, 1, 1, 1, 1, 5, 2, 5, 3, 3, 14, 3, 4, 2, 2, 2, 2, 2, 2, 66, 4, 3, 1, 8, 7, 7, 3, 3, 2, 6, 3, 3, 3, 3, 5, 5, 3, 26, 15, 9, + 1, 1, 2, 1, 1, 4, 3, 6, 4, 4, 1, 1, 49, 4, 4, 15, 14, 13, 1, 1, 3, 2, 2, 2, 1, 1, 3, 3, 1, 1, 5, 2, 2, 2, 2, 1, 2, 2, 11, 2, 4, + 2, 4, 28, 1, 1, 1, 1, 2, 5, 3, 7, 1, 1, 1, 1, 2, 1, 14, 7, 4, 2, 2, 2, 16, 2, 4, 2, 2, 15, 9, 1, 1, 1, 1, 1, 4, 1, 1, 2, 49, 2, + 13, 3, 4, 2, 2, 5, 2, 1, 3, 2, 4, 4, 3, 1, 2, 3, 4, 1, 16, 6, 2, 1, 1, 1, 2, 1, 2, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 4, + 4, 4, 3, 2, 4, 1, 1, 32, 13, 5, 4, 9, 8, 7, 3, 2, 2, 36, 2, 30, 9, 3, 1, 1, 1, 1, 3, 4, 3, 1, 1, 2, 2, 2, 2, 4, 5, 1, 28, 5, 4, + 12, 2, 5, 4, 2, 3, 38, 3, 2, 1, 2, 19, 7, 5, 5, 5, 2, 2, 2, 6, 4, 4, 4, 4, 3, 1, 2, 2, 92, 4, 2, 3, 13, 3, 3, 7, 7, 3, 3, 3, 59, + 6, 2, 2, 4, 4, 1, 13, 4, 4, 7, 5, 5, 5, 2, 5, 9, 2, 2, 1, 7, 5, 5, 1, 1, 3, 3, 2, 2, 2, 1, 1, 18, 10, 6, 6, 3, 2, 3, 1, 1, 11, + 2, 6, 2, 184,12, 7, 6, 4, 9, 2, 25, 3, 1, 1, 12, 3, 3, 3, 2, 2, 3, 2, 3, 3, 5, 3, 2, 6, 6, 1, 1, 1, 4, 79, 9, 3, 3, 6, 3, 3, 3, + 1, 23, 3, 3, 3, 3, 2, 3, 2, 6, 4, 2, 2, 1, 2, 9, 3, 1, 1, 11, 3, 3, 3, 6, 2, 12, 4, 2, 3, 9, 1, 1, 1, 2, 2, 2, 3, 30, 5, 3, 3, + 10, 3, 1, 2, 8, 6, 6, 2, 1, 132,6, 14, 8, 2, 2, 2, 5, 39, 13, 9, 3, 1, 2, 2, 1, 1, 1, 2, 4, 6, 3, 11, 2, 10, 12, 5, 4, 3, 6, 2, 2, + 1, 1, 3, 3, 3, 6, 13, 5, 4, 3, 4, 48, 4, 4, 3, 2, 2, 32, 2, 2, 2, 9, 3, 2, 2, 3, 12, 4, 2, 2, 2, 3, 3, 3, 1, 1, 1, 5, 72, 12, 4, + 2, 2, 2, 17, 2, 2, 2, 5, 3, 3, 20, 1, 11, 11, 3, 3, 5, 1, 1, 1, 1, 82, 4, 4, 4, 2, 7, 7, 7, 6, 4, 12, 5, 2, 40, 3, 1, 1, 32, 1, 1, + 1, 1, 1, 1, 4, 4, 1, 1, 1, 21, 19, 4, 8, 3, 3, 3, 3, 3, 3, 2, 58, 2, 16, 16, 4, 4, 4, 4, 5, 4, 4, 4, 2, 5, 3, 3, 3, 3, 11, 4, 5, + 6, 1, 1, 1, 4, 5, 2, 24, 1, 2, 2, 4, 3, 2, 3, 2, 1, 3, 3, 1, 2, 2, 8, 7, 3, 4, 2, 3, 1, 1, 1, 1, 13, 8, 3, 1, 4, 3, 2, 1, 13, + 5, 3, 1, 7, 2, 2, 26, 9, 3, 3, 8, 52, 4, 18, 4, 6, 3, 9, 5, 2, 2, 3, 2, 1, 2, 2, 2, 2, 4, 2, 64, 20, 2, 2, 2, 2, 1, 8, 2, 2, 6, + 4, 39, 31, 6, 3, 2, 2, 2, 2, 20, 8, 1, 3, 2, 41, 4, 5, 6, 2, 1, 1, 14, 5, 4, 4, 1, 3, 2, 4, 2, 62, 3, 12, 4, 2, 4, 4, 2, 4, 7, 3, + 5, 3, 8, 2, 2, 6, 54, 2, 31, 3, 8, 2, 3, 5, 3, 2, 2, 2, 2, 5, 1, 1, 1, 3, 2, 5, 2, 5, 5, 2, 2, 1, 1, 55, 10, 5, 2, 8, 2, 3, 1, + 9, 3, 5, 7, 3, 3, 2, 4, 3, 35, 11, 8, 3, 3, 2, 1, 1, 1, 1, 1, 5, 4, 6, 3, 17, 3, 8, 5, 4, 1, 19, 2, 6, 3, 3, 2, 5, 1, 2, 11, 2, + 13, 7, 3, 3, 3, 3, 6, 39, 13, 8, 2, 1, 1, 4, 4, 4, 2, 1, 16, 3, 2, 3, 5, 24, 6, 6, 5, 1, 4, 2, 3, 4, 110,21, 9, 8, 24, 3, 1, 9, 5, + 3, 2, 7, 31, 2, 16, 10, 4, 2, 4, 3, 12, 5, 2, 15, 1, 3, 3, 21, 2, 6, 2, 1, 1, 2, 3, 2, 17, 2, 1, 1, 1, 4, 4, 4, 3, 2, 2, 25, 2, 3, + 2, 3, 10, 5, 2, 2, 32, 4, 2, 2, 2, 5, 2, 2, 2, 3, 7, 2, 2, 2, 2, 15, 3, 2, 2, 3, 18, 1, 4, 3, 3, 2, 2, 3, 163,7, 5, 1, 85, 8, 2, + 3, 2, 1, 2, 2, 3, 2, 5, 2, 2, 4, 3, 2, 10, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 2, 18, 2, 14, 2, 2, 2, 2, 2, 7, 7, 7, 7, 1, 1, 1, 1, + 1, 5, 3, 2, 1, 14, 5, 4, 8, 6, 2, 33, 1, 1, 1, 1, 1, 4, 4, 4, 11, 9, 9, 2, 2, 2, 2, 2, 2, 5, 5, 5, 4, 2, 2, 3, 1, 1, 166,7, 2, + 4, 4, 31, 23, 4, 8, 2, 3, 2, 4, 2, 46, 4, 33, 6, 4, 5, 3, 2, 3, 5, 4, 4, 4, 2, 3, 2, 2, 11, 2, 1, 1, 7, 2, 8, 5, 3, 27, 1, 1, 2, + 17, 5, 2, 4, 5, 6, 5, 3, 1, 1, 3, 95, 4, 3, 8, 1, 1, 4, 1, 1, 6, 2, 1, 3, 16, 2, 7, 7, 4, 3, 15, 3, 1, 2, 1, 1, 4, 2, 8, 3, 13, + 6, 2, 4, 3, 3, 67, 1, 14, 5, 5, 5, 4, 2, 4, 10, 8, 6, 4, 22, 11, 2, 4, 5, 231,10, 3, 7, 3, 8, 3, 17, 1, 6, 6, 6, 3, 5, 12, 3, 3, 1, + 4, 2, 73, 5, 17, 5, 5, 2, 2, 2, 3, 3, 3, 12, 9, 2, 7, 2, 13, 8, 4, 3, 18, 2, 1, 9, 3, 2, 3, 37, 20, 2, 2, 6, 4, 3, 5, 19, 5, 4, 6, + 4, 4, 4, 4, 4, 4, 1, 2, 4, 4, 109,4, 2, 7, 7, 3, 17, 2, 3, 3, 5, 3, 5, 3, 7, 5, 4, 2, 15, 1, 13, 11, 11, 10, 6, 3, 8, 3, 28, 14, 3, + 3, 2, 6, 4, 2, 124,1, 1, 1, 7, 2, 12, 8, 8, 4, 3, 3, 2, 7, 1, 5, 7, 6, 2, 3, 6, 6, 2, 5, 3, 2, 2, 3, 6, 15, 2, 4, 4, 3, 3, 21, + 6, 5, 1, 2, 5, 2, 132,2, 7, 6, 3, 13, 7, 4, 1, 2, 7, 2, 3, 11, 7, 2, 4, 1, 7, 2, 57, 2, 41, 3, 1, 2, 1, 1, 2, 2, 4, 4, 3, 6, 5, + 8, 2, 2, 3, 2, 2, 3, 9, 1, 2, 37, 7, 4, 3, 3, 18, 10, 3, 1, 1, 4, 1, 1, 79, 6, 9, 7, 2, 2, 6, 2, 3, 15, 5, 10, 4, 3, 11, 5, 3, 3, + 2, 2, 3, 5, 2, 6, 24, 4, 2, 1, 5, 4, 2, 1, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 42, 1, 7, 2, 3, 2, 2, 1, 1, 1, 2, 1, 9, 2, + 2, 2, 2, 7, 2, 1, 3, 2, 1, 1, 1, 4, 3, 3, 3, 3, 2, 1, 1, 1, 20, 1, 1, 1, 1, 1, 10, 3, 2, 2, 5, 14, 1, 1, 1, 3, 3, 2, 2, 1, 1, + 20, 2, 2, 2, 8, 2, 2, 1, 1, 3, 2, 41, 4, 11, 4, 3, 2, 9, 6, 4, 2, 4, 3, 3, 3, 2, 2, 21, 20, 7, 7, 3, 2, 4, 3, 2, 40, 6, 8, 2, 1, + 5, 4, 5, 3, 2, 4, 3, 3, 3, 45, 4, 1, 2, 1, 1, 7, 4, 4, 3, 1, 5, 9, 2, 4, 26, 18, 4, 4, 4, 4, 1, 2, 2, 2, 2, 56, 10, 14, 2, 4, 14, + 5, 2, 8, 6, 3, 10, 1, 1, 3, 3, 21, 5, 6, 2, 1, 1, 5, 2, 63, 5, 2, 5, 6, 5, 12, 1, 1, 1, 3, 3, 4, 10, 3, 8, 129,27, 21, 10, 5, 3, 19, + 2, 2, 7, 6, 2, 3, 9, 2, 2, 4, 2, 2, 2, 15, 4, 2, 8, 8, 2, 16, 9, 5, 3, 3, 3, 2, 12, 2, 9, 22, 4, 3, 1, 9, 3, 3, 5, 121,5, 4, 11, + 4, 2, 1, 4, 4, 4, 4, 1, 1, 14, 7, 5, 2, 9, 3, 12, 4, 5, 3, 2, 15, 2, 3, 2, 38, 1, 17, 14, 6, 6, 5, 2, 2, 6, 2, 5, 3, 5, 2, 12, 5, + 4, 1, 83, 7, 4, 18, 4, 3, 7, 6, 19, 3, 10, 3, 3, 3, 6, 16, 4, 1, 94, 8, 3, 4, 3, 3, 3, 3, 11, 2, 3, 5, 2, 1, 1, 19, 6, 5, 8, 1, 1, + 19, 4, 6, 4, 14, 3, 44, 17, 17, 6, 4, 7, 6, 4, 10, 2, 6, 13, 2, 2, 3, 3, 2, 2, 7, 1, 1, 2, 1, 1, 1, 5, 4, 3, 2, 2, 1, 1, 1, 10, 2, + 2, 2, 3, 8, 6, 6, 6, 4, 67, 6, 3, 2, 2, 60, 13, 3, 4, 3, 3, 44, 5, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 7, + 4, 4, 9, 3, 4, 6, 2, 3, 1, 2, 2, 2, 2, 6, 4, 3, 9, 6, 4, 3, 3, 1, 1, 2, 12, 4, 2, 16, 7, 4, 2, 2, 2, 2, 9, 4, 3, 4, 90, 2, 2, + 2, 42, 39, 2, 5, 4, 4, 2, 2, 1, 1, 1, 3, 1, 3, 3, 3, 2, 2, 2, 2, 2, 3, 1, 1, 1, 1, 1, 1, 7, 3, 2, 1, 1, 1, 1, 2, 3, 2, 2, 2, + 2, 2, 2, 5, 9, 9, 1, 6, 5, 30, 6, 2, 1, 1, 1, 4, 4, 3, 2, 2, 2, 2, 2, 1, 1, 1, 1, 15, 3, 3, 12, 2, 2, 2, 2, 9, 6, 5, 2, 2, 1, + 1, 1, 1, 1, 7, 17, 3, 1, 1, 1, 7, 7, 7, 2, 5, 4, 5, 3, 2, 1, 1, 1, 1, 1, 1, 1, 12, 3, 3, 3, 4, 1, 1, 1, 1, 1, 2, 2, 75, 2, 13, + 11, 3, 2, 5, 2, 2, 1, 1, 2, 2, 22, 1, 1, 1, 2, 2, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 4, 4, 4, 17, 2, 11, 3, 2, 3, 2, 1, 6, + 2, 3, 2, 2, 1, 1, 57, 1, 1, 10, 4, 1, 2, 12, 2, 2, 8, 2, 1, 1, 1, 1, 1, 9, 5, 5, 2, 8, 6, 2, 2, 4, 3, 3, 4, 1, 1, 113,11, 1, 1, + 1, 2, 5, 3, 41, 8, 3, 3, 6, 2, 2, 2, 3, 2, 2, 3, 3, 3, 3, 8, 8, 7, 3, 2, 20, 1, 12, 3, 3, 1, 2, 3, 3, 3, 3, 1, 1, 2, 4, 3, 6, + 12, 9, 6, 3, 3, 1, 2, 2, 2, 2, 2, 5, 2, 111,5, 6, 5, 5, 2, 2, 2, 1, 44, 13, 10, 7, 5, 3, 1, 1, 16, 15, 13, 9, 7, 6, 6, 6, 6, 17, 2, + 2, 12, 1, 2, 2, 2, 2, 2, 2, 5, 1, 8, 5, 1, 1, 1, 1, 1, 1, 15, 8, 3, 3, 2, 1, 1, 6, 6, 3, 3, 3, 3, 2, 2, 13, 1, 1, 1, 1, 3, 1, + 2, 30, 1, 1, 1, 1, 5, 1, 1, 4, 7, 6, 5, 4, 4, 2, 1, 1, 1, 2, 1, 1, 68, 2, 2, 4, 1, 1, 1, 2, 2, 1, 6, 5, 1, 28, 11, 5, 3, 2, 2, + 9, 8, 3, 9, 6, 3, 2, 2, 1, 1, 1, 7, 5, 3, 20, 4, 4, 4, 3, 3, 4, 2, 2, 2, 1, 2, 2, 1, 3, 3, 20, 1, 7, 3, 3, 2, 1, 9, 4, 1, 2, + 2, 2, 2, 2, 1, 1, 26, 4, 2, 11, 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, 214,1, 14, 1, 1, 1, 1, 3, 1, 1, 1, 1, 2, 1, 8, 2, 1, 3, 23, 5, 3, + 8, 8, 2, 3, 5, 1, 73, 5, 1, 12, 7, 4, 4, 3, 2, 2, 3, 15, 3, 3, 4, 3, 2, 2, 26, 9, 9, 9, 9, 8, 4, 16, 4, 11, 11, 5, 4, 4, 2, 1, 57, + 2, 51, 51, 2, 2, 1, 2, 2, 3, 3, 3, 2, 9, 3, 4, 2, 2, 10, 10, 9, 5, 1, 10, 1, 1, 8, 7, 4, 2, 43, 2, 22, 7, 13, 13, 5, 5, 3, 1, 4, 2, + 2, 1, 25, 4, 8, 3, 3, 3, 2, 5, 2, 3, 2, 9, 2, 2, 1, 7, 6, 15, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 4, 3, 65, 7, 2, 2, 2, 3, 2, 18, 1, + 1, 1, 4, 4, 4, 3, 7, 9, 6, 3, 16, 5, 5, 5, 4, 8, 5, 5, 5, 3, 15, 14, 3, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 5, 2, 235,34, 6, 6, 6, 8, 5, 8, 7, 4, 3, 3, 3, 3, 3, 3, 58, 3, 3, 2, 2, 8, 3, 2, 2, + 1, 39, 5, 5, 1, 1, 1, 6, 5, 5, 5, 13, 9, 8, 5, 5, 3, 1, 1, 9, 9, 9, 9, 1, 1, 2, 2, 3, 2, 2, 34, 8, 6, 6, 6, 6, 6, 10, 8, 8, 35, + 13, 13, 1, 1, 6, 5, 3, 12, 2, 4, 4, 4, 3, 5, 5, 2, 2, 54, 2, 2, 2, 2, 2, 2, 20, 3, 3, 3, 15, 14, 10, 7, 7, 10, 1, 1, 21, 1, 4, 2, 2, + 15, 9, 8, 13, 5, 5, 3, 3, 3, 4, 2, 54, 5, 3, 2, 14, 6, 2, 2, 2, 4, 4, 4, 7, 7, 6, 7, 4, 4, 1, 2, 2, 2, 1, 1, 1, 1, 4, 1, 3, 3, + 1, 1, 2, 2, 2, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 9, 6, 6, 6, 6, 1, 1, 1, 1, 1, 12, 3, 1, 1, 1, 1, 1, 5, 1, 183,24, 1, 1, 1, 5, 6, + 6, 5, 5, 5, 8, 3, 5, 5, 5, 14, 6, 2, 2, 4, 2, 5, 26, 7, 7, 7, 5, 4, 4, 4, 4, 4, 2, 2, 6, 18, 5, 5, 9, 5, 4, 4, 4, 54, 3, 3, 3, + 3, 17, 1, 1, 1, 1, 12, 4, 3, 3, 3, 2, 4, 4, 4, 4, 2, 2, 1, 1, 1, 18, 2, 1, 1, 1, 2, 2, 8, 1, 1, 1, 1, 5, 1, 4, 1, 1, 2, 1, 1, + 1, 1, 4, 4, 4, 4, 4, 4, 12, 7, 7, 7, 6, 6, 4, 2, 1, 1, 17, 14, 5, 4, 3, 3, 5, 5, 5, 5, 3, 3, 3, 3, 22, 9, 4, 1, 1, 7, 207,6, 3, + 2, 46, 2, 2, 5, 3, 5, 1, 1, 1, 3, 3, 3, 3, 2, 2, 6, 6, 2, 9, 9, 9, 9, 6, 6, 4, 2, 1, 1, 4, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, + 85, 18, 1, 11, 5, 18, 10, 5, 5, 2, 2, 2, 12, 4, 3, 4, 2, 3, 13, 7, 1, 5, 3, 2, 2, 4, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 10, 10, 9, 9, 9, + 8, 5, 19, 1, 1, 4, 2, 2, 2, 2, 2, 1, 5, 4, 4, 3, 3, 1, 1, 4, 3, 1, 1, 1, 44, 1, 1, 1, 1, 18, 11, 7, 15, 14, 14, 13, 9, 8, 6, 3, 51, + 1, 1, 1, 7, 7, 3, 3, 3, 2, 3, 3, 3, 4, 2, 2, 2, 1, 5, 5, 3, 3, 6, 1, 6, 2, 1, 1, 1, 1, 3, 3, 3, 3, 12, 1, 1, 1, 1, 2, 6, 4, + 2, 2, 2, 2, 1, 1, 1, 174,24, 3, 1, 3, 14, 13, 3, 3, 2, 28, 8, 8, 5, 15, 2, 2, 3, 3, 2, 4, 33, 4, 4, 4, 8, 6, 6, 12, 10, 10, 4, 2, 2, + 3, 3, 3, 35, 11, 5, 2, 6, 3, 5, 4, 6, 5, 4, 2, 2, 2, 9, 8, 8, 5, 28, 1, 2, 2, 2, 18, 18, 11, 6, 5, 2, 2, 16, 9, 3, 3, 3, 3, 3, 3, + 3, 2, 2, 5, 5, 5, 4, 10, 4, 4, 4, 87, 7, 4, 2, 2, 2, 23, 2, 1, 1, 2, 7, 4, 4, 3, 3, 10, 7, 3, 2, 7, 1, 1, 1, 1, 3, 23, 12, 1, 2, + 4, 2, 4, 4, 2, 4, 1, 1, 2, 2, 2, 1, 1, 3, 3, 44, 13, 8, 8, 8, 4, 3, 3, 2, 1, 13, 11, 3, 8, 8, 9, 9, 9, 9, 3, 1, 1, 1, 1, 5, 4, + 4, 4, 29, 2, 2, 2, 2, 2, 2, 19, 18, 17, 7, 4, 24, 10, 10, 10, 14, 5, 7, 3, 2, 2, 15, 2, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 11, 5, 3, 5, + 4, 46, 6, 1, 1, 2, 8, 6, 7, 4, 1, 17, 7, 6, 6, 4, 9, 9, 8, 2, 4, 2, 2, 1, 21, 6, 3, 3, 3, 3, 1, 3, 2, 2, 2, 1, 1, 1, 1, 2, 1, + 2, 1, 3, 1, 1, 1, 5, 2, 3, 3, 1, 1, 1, 1, 13, 13, 12, 7, 5, 5, 5, 1, 1, 223,10, 5, 2, 9, 5, 4, 27, 11, 8, 4, 2, 2, 2, 3, 2, 2, 1, + 7, 2, 26, 6, 5, 8, 3, 3, 5, 5, 2, 2, 5, 4, 4, 4, 6, 6, 2, 11, 2, 6, 2, 2, 18, 10, 10, 10, 4, 3, 8, 8, 80, 29, 2, 15, 13, 2, 1, 7, 5, + 2, 2, 28, 5, 5, 5, 14, 14, 14, 8, 7, 7, 5, 5, 20, 20, 10, 10, 10, 10, 10, 10, 7, 6, 3, 36, 3, 2, 2, 2, 2, 1, 1, 4, 4, 3, 3, 3, 3, 14, 9, + 15, 2, 1, 1, 1, 3, 3, 3, 3, 3, 8, 2, 23, 20, 15, 5, 19, 15, 5, 5, 5, 4, 4, 4, 9, 8, 6, 6, 3, 25, 5, 11, 9, 5, 3, 9, 6, 6, 6, 12, 10, + 9, 6, 1, 5, 2, 2, 2, 43, 3, 3, 3, 12, 7, 7, 7, 7, 6, 17, 2, 1, 1, 1, 2, 1, 9, 7, 7, 7, 7, 1, 1, 1, 2, 1, 2, 1, 1, 9, 4, 1, 1, + 1, 3, 1, 1, 1, 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, 8, 7, 6, 3, 17, 6, 5, 10, 10, 5, 4, 3, 3, 3, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, + 1, 4, 3, 3, 20, 4, 4, 3, 3, 1, 2, 7, 6, 2, 2, 24, 3, 3, 3, 2, 9, 6, 6, 5, 9, 2, 3, 3, 1, 1, 1, 35, 21, 6, 3, 12, 11, 11, 11, 11, 10, + 5, 3, 2, 2, 2, 2, 7, 1, 3, 2, 2, 2, 1, 21, 1, 1, 3, 3, 2, 2, 6, 5, 4, 4, 11, 10, 10, 1, 1, 1, 24, 2, 6, 2, 3, 2, 2, 1, 1, 1, 1, + 1, 9, 7, 7, 7, 19, 2, 1, 1, 1, 7, 4, 2, 6, 2, 8, 2, 2, 3, 3, 2, 1, 1, 21, 3, 10, 9, 5, 5, 5, 5, 1, 1, 1, 8, 8, 8, 3, 1, 1, 2, + 2, 4, 4, 3, 2, 2, 12, 9, 5, 4, 9, 3, 3, 3, 3, 3, 62, 22, 1, 1, 1, 4, 1, 4, 1, 3, 2, 4, 3, 3, 2, 1, 1, 1, 3, 2, 2, 12, 2, 17, 7, + 7, 7, 3, 2, 2, 2, 2, 2, 9, 9, 6, 6, 5, 3, 3, 8, 1, 1, 1, 2, 1, 2, 2, 124,24, 10, 9, 9, 5, 5, 5, 57, 13, 13, 5, 5, 20, 2, 1, 6, 9, + 5, 22, 22, 14, 12, 12, 11, 23, 2, 2, 2, 3, 3, 3, 5, 4, 4, 10, 18, 10, 4, 2, 2, 2, 2, 4, 3, 3, 2, 5, 2, 53, 6, 6, 5, 3, 3, 3, 6, 3, 2, + 17, 3, 2, 9, 2, 2, 2, 2, 2, 2, 3, 3, 2, 2, 2, 32, 3, 1, 4, 2, 2, 2, 7, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 9, 1, 2, 2, 3, 5, 1, 2, + 2, 1, 1, 217,23, 1, 2, 6, 1, 2, 2, 15, 4, 4, 4, 4, 2, 3, 2, 2, 38, 3, 2, 1, 4, 1, 1, 1, 1, 7, 5, 4, 2, 13, 10, 4, 3, 3, 2, 1, 2, + 3, 1, 56, 5, 48, 3, 4, 3, 2, 1, 2, 2, 4, 2, 5, 10, 7, 5, 3, 3, 2, 2, 2, 53, 7, 3, 3, 3, 3, 3, 3, 32, 1, 1, 1, 1, 4, 3, 1, 2, 2, + 1, 1, 5, 5, 5, 5, 5, 4, 2, 2, 4, 1, 1, 1, 1, 7, 3, 3, 3, 4, 3, 3, 3, 6, 4, 4, 2, 12, 4, 4, 8, 8, 2, 3, 1, 3, 6, 4, 4, 1, 1, + 1, 1, 1, 1, 1, 1, 51, 8, 7, 9, 9, 7, 6, 3, 2, 2, 5, 4, 4, 4, 7, 2, 8, 2, 4, 4, 23, 2, 1, 1, 1, 1, 4, 8, 4, 3, 2, 5, 1, 7, 3, + 24, 5, 2, 8, 3, 2, 2, 15, 5, 3, 2, 4, 2, 2, 30, 20, 11, 8, 4, 1, 5, 5, 8, 2, 10, 8, 2, 4, 4, 3, 45, 1, 2, 10, 8, 7, 4, 3, 1, 1, 13, + 9, 5, 3, 3, 2, 1, 1, 3, 8, 11, 9, 9, 8, 4, 22, 4, 1, 2, 9, 6, 17, 3, 2, 5, 3, 2, 5, 2, 92, 3, 27, 20, 17, 10, 7, 2, 6, 5, 2, 9, 7, + 6, 6, 6, 3, 3, 3, 3, 3, 13, 1, 1, 1, 5, 4, 4, 5, 4, 2, 1, 4, 3, 15, 2, 6, 5, 3, 2, 2, 2, 2, 67, 30, 26, 3, 2, 3, 2, 1, 8, 6, 22, + 2, 2, 9, 7, 4, 3, 4, 7, 5, 3, 29, 24, 2, 2, 12, 1, 5, 1, 1, 4, 1, 1, 1, 1, 1, 6, 4, 2, 34, 10, 2, 2, 2, 2, 1, 2, 3, 2, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 3, 3, 2, 1, 7, 2, 3, 10, 2, 2, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 38, 7, 3, 11, 5, 5, 2, 2, 3, 3, 3, + 6, 5, 5, 4, 2, 2, 177,5, 2, 4, 5, 4, 3, 97, 7, 4, 2, 10, 6, 5, 4, 3, 2, 2, 11, 4, 4, 4, 4, 2, 2, 2, 2, 10, 7, 3, 3, 2, 9, 2, 3, + 3, 1, 1, 4, 2, 2, 15, 11, 10, 2, 34, 26, 2, 7, 3, 4, 5, 2, 25, 24, 3, 13, 6, 3, 5, 2, 15, 3, 5, 1, 9, 3, 1, 13, 9, 44, 5, 3, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 5, 4, 6, 5, 5, 4, 4, 3, 3, 7, 3, 2, 5, 5, 4, 19, 4, 3, 1, 6, 2, 3, 32, 10, 3, 6, 1, 6, 3, 1, 2, 1, 1, 1, 2, + 45, 3, 21, 1, 2, 8, 4, 3, 2, 9, 8, 3, 1, 25, 10, 5, 2, 2, 2, 4, 4, 1, 1, 1, 122,15, 6, 5, 4, 4, 3, 57, 49, 3, 7, 4, 3, 3, 3, 1, 1, + 21, 9, 2, 1, 1, 9, 1, 4, 3, 2, 177,11, 2, 4, 5, 3, 8, 6, 3, 29, 4, 2, 3, 7, 5, 1, 27, 5, 7, 5, 13, 2, 6, 17, 9, 5, 4, 18, 5, 1, 3, + 6, 3, 1, 17, 3, 3, 11, 6, 6, 4, 1, 1, 1, 1, 1, 4, 3, 13, 7, 6, 3, 2, 2, 2, 11, 11, 6, 3, 95, 5, 2, 10, 6, 5, 14, 2, 3, 2, 2, 2, 5, + 5, 1, 13, 2, 8, 2, 19, 4, 9, 2, 2, 2, 6, 4, 3, 1, 1, 1, 1, 81, 2, 1, 5, 5, 4, 2, 15, 13, 12, 9, 32, 31, 4, 8, 8, 7, 3, 5, 3, 2, 10, + 3, 2, 24, 6, 9, 6, 2, 2, 2, 4, 3, 27, 9, 1, 9, 3, 7, 19, 6, 2, 2, 2, 3, 2, 2, 5, 5, 2, 4, 53, 14, 1, 1, 1, 1, 1, 1, 1, 4, 3, 2, + 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 3, 4, 2, 5, 2, 2, 3, 3, 3, 1, 1, 4, 4, 2, 2, 1, 1, 26, 7, 4, 16, 2, 2, 4, 1, 9, 2, 2, 1, 1, 4, + 1, 1, 1, 1, 1, 3, 51, 4, 3, 3, 44, 3, 3, 2, 2, 2, 3, 1, 1, 7, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 2, 3, 3, 3, 10, 5, 2, 3, 1, 1, 1, + 1, 1, 2, 2, 6, 1, 1, 2, 4, 1, 1, 23, 2, 11, 3, 2, 1, 1, 2, 1, 1, 1, 27, 3, 13, 2, 2, 3, 2, 3, 45, 43, 14, 14, 6, 5, 4, 2, 12, 6, 3, + 1, 2, 9, 2, 2, 3, 2, 3, 36, 2, 4, 4, 2, 2, 19, 3, 6, 2, 7, 2, 2, 2, 13, 3, 3, 4, 100,4, 4, 3, 6, 10, 2, 3, 7, 2, 3, 1, 43, 6, 9, + 13, 5, 4, 4, 11, 4, 8, 5, 2, 11, 1, 4, 4, 4, 4, 4, 3, 9, 5, 3, 101,5, 2, 2, 5, 12, 9, 5, 4, 4, 10, 6, 13, 4, 3, 5, 3, 5, 1, 2, 9, + 4, 2, 20, 3, 5, 2, 9, 3, 2, 2, 2, 2, 90, 2, 2, 3, 3, 2, 1, 2, 1, 4, 3, 3, 35, 2, 10, 17, 12, 10, 2, 8, 4, 29, 1, 24, 4, 3, 3, 4, 3, + 2, 40, 5, 1, 4, 4, 3, 3, 6, 2, 13, 5, 5, 3, 3, 3, 1, 22, 2, 1, 13, 12, 5, 4, 3, 3, 7, 3, 2, 5, 1, 1, 1, 1, 2, 1, 1, 16, 5, 3, 2, + 3, 1, 1, 1, 1, 1, 1, 1, 4, 4, 1, 1, 1, 1, 1, 1, 1, 196,14, 9, 1, 5, 2, 3, 1, 1, 1, 1, 1, 2, 1, 2, 19, 2, 1, 1, 1, 1, 12, 2, 5, + 4, 4, 3, 12, 6, 64, 2, 1, 1, 12, 10, 1, 8, 5, 2, 5, 3, 31, 5, 21, 39, 5, 3, 2, 2, 2, 11, 2, 4, 3, 3, 12, 4, 3, 7, 1, 1, 4, 4, 4, 3, + 2, 2, 3, 4, 3, 12, 7, 4, 3, 2, 2, 1, 12, 1, 1, 1, 1, 2, 1, 1, 5, 1, 1, 1, 1, 1, 6, 2, 2, 2, 2, 2, 1, 6, 1, 1, 2, 1, 3, 1, 1, + 1, 1, 1, 1, 1, 25, 2, 2, 14, 7, 4, 4, 4, 14, 5, 2, 2, 19, 2, 2, 5, 2, 2, 9, 4, 3, 2, 2, 13, 2, 2, 4, 1, 1, 39, 5, 2, 3, 3, 2, 5, + 2, 2, 4, 5, 1, 5, 1, 4, 4, 3, 10, 2, 2, 118,23, 21, 12, 5, 4, 2, 2, 2, 1, 4, 89, 5, 3, 4, 3, 3, 2, 2, 5, 2, 2, 2, 5, 2, 2, 14, 9, + 2, 2, 21, 7, 6, 5, 4, 3, 1, 18, 14, 5, 5, 6, 5, 26, 19, 14, 5, 4, 33, 4, 11, 1, 3, 4, 10, 5, 6, 63, 12, 4, 4, 4, 4, 15, 12, 6, 3, 1, 1, + 3, 1, 9, 6, 11, 4, 1, 1, 3, 3, 61, 1, 38, 27, 24, 4, 5, 7, 6, 2, 1, 3, 2, 2, 2, 92, 1, 2, 37, 6, 5, 17, 16, 2, 1, 1, 1, 1, 26, 17, 16, + 10, 3, 3, 4, 4, 4, 29, 3, 21, 2, 17, 7, 7, 5, 9, 7, 14, 4, 4, 3, 3, 5, 4, 3, 1, 1, 1, 1, 1, 22, 3, 3, 5, 4, 3, 3, 7, 3, 2, 2, 2, + 3, 1, 1, 2, 1, 1, 7, 2, 2, 1, 6, 3, 1, 1, 1, 22, 16, 4, 2, 4, 2, 1, 5, 17, 3, 3, 8, 5, 3, 41, 8, 3, 5, 11, 7, 10, 6, 4, 3, 3, 13, + 4, 4, 2, 2, 21, 2, 2, 2, 11, 3, 3, 3, 3, 2, 1, 8, 4, 16, 12, 10, 3, 2, 6, 4, 1, 6, 3, 70, 7, 44, 16, 10, 15, 5, 4, 4, 1, 2, 12, 1, 1, + 1, 3, 4, 30, 3, 7, 3, 2, 16, 2, 2, 4, 114,2, 1, 7, 3, 24, 1, 1, 7, 2, 8, 2, 19, 1, 5, 1, 5, 29, 3, 2, 2, 13, 11, 1, 1, 1, 3, 3, 2, + 17, 5, 3, 2, 4, 2, 2, 5, 4, 1, 7, 6, 4, 4, 59, 9, 4, 5, 4, 7, 6, 6, 5, 2, 21, 10, 3, 1, 1, 1, 3, 75, 3, 2, 67, 4, 3, 4, 3, 2, 2, + 41, 9, 4, 4, 8, 6, 20, 5, 3, 2, 2, 2, 4, 9, 4, 13, 10, 8, 4, 4, 3, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 5, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 2, 3, 2, 1, 7, 5, 1, 4, 4, 4, 3, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 14, 2, 2, 1, 2, 41, 11, 2, + 1, 2, 6, 6, 4, 3, 3, 5, 2, 4, 5, 2, 2, 31, 2, 11, 4, 2, 3, 1, 1, 2, 2, 4, 2, 7, 3, 3, 3, 34, 6, 8, 2, 7, 3, 2, 2, 2, 23, 3, 4, + 1, 1, 2, 2, 1, 1, 1, 4, 2, 1, 1, 1, 1, 1, 11, 4, 2, 2, 20, 7, 1, 2, 2, 41, 15, 4, 2, 6, 2, 8, 4, 4, 1, 5, 2, 1, 1, 1, 1, 1, 4, + 2, 52, 2, 2, 3, 2, 8, 3, 2, 7, 3, 2, 7, 4, 4, 1, 1, 1, 7, 5, 3, 9, 4, 1, 1, 37, 18, 2, 3, 2, 2, 2, 1, 1, 4, 3, 4, 2, 3, 197,31, + 4, 2, 3, 2, 1, 8, 6, 1, 2, 3, 3, 4, 6, 2, 2, 1, 1, 2, 2, 3, 2, 24, 1, 1, 1, 1, 4, 2, 2, 2, 2, 2, 1, 5, 1, 3, 4, 3, 2, 1, 1, 37, 2, 1, 1, 4, 2, 12, 3, 3, 9, 3, 6, 38, 8, 2, 14, 2, 2, 4, 3, 1, 6, 9, 3, 5, 2, 4, 3, 2, 1, 1, 8, 4, 1, 2, 7, 3, 5, 4, 4, 130, - 24, 5, 3, 4, 2, 3, 6, 2, 1, 1, 24, 1, 1, 2, 2, 2, 4, 1, 1, 1, 5, 8, 2, 29, 4, 4, 4, 4, 7, 9, 2, 3, 3, 3, 10, 6, 4, 1, 2, 19, 4, - 2, 1, 2, 1, 1, 2, 5, 3, 2, 155,29, 2, 4, 2, 2, 3, 3, 4, 4, 2, 2, 1, 2, 1, 17, 4, 4, 17, 2, 1, 2, 2, 2, 2, 10, 4, 10, 2, 2, 2, 1, - 1, 1, 2, 1, 1, 1, 1, 1, 18, 8, 5, 9, 5, 4, 19, 4, 1, 1, 1, 1, 2, 2, 4, 2, 3, 2, 1, 1, 4, 8, 1, 1, 66, 6, 1, 1, 6, 3, 2, 2, 1, - 11, 1, 3, 5, 3, 2, 1, 5, 4, 1, 1, 1, 1, 17, 5, 8, 3, 3, 2, 4, 7, 2, 3, 1, 1, 1, 1, 1, 56, 3, 2, 2, 4, 2, 2, 2, 4, 1, 2, 2, 2, - 5, 2, 4, 2, 9, 3, 1, 1, 1, 1, 2, 3, 1, 3, 2, 4, 7, 3, 1, 1, 4, 5, 10, 2, 2, 2, 2, 2, 1, 23, 3, 7, 9, 4, 25, 7, 8, 3, 34, 5, 1, - 1, 4, 2, 2, 8, 5, 8, 1, 2, 13, 8, 16, 7, 2, 3, 19, 13, 6, 6, 3, 18, 5, 4, 4, 2, 2, 2, 12, 3, 3, 11, 1, 1, 6, 4, 22, 4, 3, 3, 5, 3, - 8, 4, 3, 1, 1, 2, 2, 3, 3, 5, 2, 136,10, 1, 1, 5, 4, 1, 10, 2, 18, 4, 3, 3, 2, 2, 2, 11, 3, 5, 3, 1, 2, 14, 5, 5, 5, 5, 4, 27, 8, - 3, 5, 7, 2, 19, 2, 1, 6, 3, 1, 1, 7, 2, 4, 168,14, 4, 3, 1, 1, 2, 1, 1, 18, 1, 4, 3, 6, 4, 4, 41, 10, 2, 5, 1, 1, 10, 2, 5, 4, 4, - 2, 2, 2, 1, 1, 5, 4, 20, 12, 2, 4, 1, 3, 3, 12, 2, 2, 2, 7, 6, 5, 9, 1, 1, 1, 4, 1, 9, 2, 4, 2, 4, 2, 7, 14, 7, 5, 1, 50, 7, 3, - 3, 2, 3, 2, 5, 5, 1, 4, 1, 5, 3, 2, 5, 1, 1, 23, 9, 2, 4, 4, 5, 28, 22, 2, 3, 2, 2, 3, 2, 1, 2, 40, 11, 6, 1, 14, 6, 1, 4, 3, 3, - 54, 18, 8, 4, 3, 5, 2, 6, 1, 8, 5, 4, 2, 2, 6, 3, 2, 2, 1, 3, 10, 2, 2, 11, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 15, 2, 1, 1, - 1, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 62, 2, 1, 3, 6, 2, 2, 2, 6, 15, 4, 5, 6, 12, 3, 2, 13, 5, 1, 1, 1, - 3, 2, 8, 1, 3, 2, 2, 2, 13, 4, 1, 1, 3, 2, 2, 2, 2, 76, 2, 2, 5, 1, 4, 12, 4, 13, 5, 10, 3, 3, 9, 5, 7, 3, 1, 1, 10, 2, 3, 10, 3, - 65, 3, 2, 2, 8, 2, 7, 13, 3, 15, 9, 1, 10, 1, 1, 2, 4, 2, 1, 1, 113,5, 2, 3, 1, 1, 6, 9, 6, 2, 2, 1, 1, 1, 1, 2, 1, 1, 59, 5, 14, - 4, 10, 8, 15, 1, 13, 4, 6, 58, 5, 6, 5, 2, 8, 6, 5, 3, 1, 29, 2, 2, 3, 1, 1, 5, 5, 170,10, 2, 20, 4, 3, 2, 6, 4, 3, 3, 12, 3, 9, 3, - 2, 60, 7, 33, 2, 3, 5, 6, 4, 3, 5, 8, 6, 7, 12, 3, 3, 3, 3, 3, 13, 3, 2, 2, 2, 4, 4, 8, 5, 2, 15, 1, 1, 1, 1, 1, 3, 3, 2, 2, 1, - 1, 1, 1, 1, 1, 1, 1, 18, 2, 2, 4, 6, 2, 120,7, 2, 2, 2, 1, 8, 3, 9, 6, 3, 9, 1, 1, 3, 2, 2, 7, 1, 3, 7, 3, 2, 1, 16, 2, 8, 1, - 2, 4, 2, 9, 4, 20, 4, 1, 1, 7, 3, 3, 6, 2, 2, 1, 45, 4, 8, 3, 2, 2, 4, 11, 5, 4, 10, 4, 54, 3, 12, 12, 6, 3, 2, 2, 2, 4, 3, 1, 4, - 3, 21, 11, 7, 5, 4, 5, 37, 6, 3, 23, 20, 1, 8, 3, 1, 1, 2, 1, 41, 3, 3, 5, 1, 5, 2, 7, 4, 2, 6, 3, 3, 3, 13, 1, 4, 3, 1, 1, 1, 1, - 1, 1, 1, 5, 1, 1, 1, 202,102,2, 2, 2, 2, 2, 2, 2, 1, 5, 3, 5, 3, 1, 1, 1, 21, 4, 11, 3, 9, 1, 2, 1, 1, 1, 1, 1, 1, 20, 3, 2, 1, - 1, 1, 1, 10, 2, 3, 1, 2, 1, 4, 10, 3, 1, 2, 2, 2, 4, 3, 1, 15, 2, 1, 1, 1, 1, 3, 2, 1, 1, 1, 4, 2, 17, 2, 4, 2, 3, 3, 2, 2, 2, - 3, 3, 2, 2, 2, 2, 2, 2, 39, 3, 2, 1, 1, 1, 1, 1, 3, 1, 4, 2, 1, 1, 3, 2, 6, 2, 2, 2, 2, 5, 3, 2, 6, 3, 1, 1, 1, 2, 2, 2, 1, - 16, 5, 2, 1, 3, 2, 1, 1, 2, 2, 1, 1, 2, 1, 1, 9, 4, 2, 1, 1, 18, 3, 8, 2, 2, 3, 3, 30, 29, 3, 7, 3, 3, 5, 1, 4, 2, 2, 35, 10, 2, - 2, 11, 7, 7, 5, 4, 2, 4, 75, 2, 2, 7, 4, 10, 11, 2, 2, 11, 1, 2, 2, 13, 3, 2, 3, 4, 5, 1, 1, 1, 5, 2, 2, 3, 1, 2, 3, 12, 3, 2, 2, - 189,3, 15, 3, 1, 5, 5, 2, 2, 7, 3, 1, 6, 4, 6, 1, 2, 1, 1, 1, 1, 1, 5, 3, 93, 12, 3, 2, 38, 2, 3, 26, 21, 3, 9, 7, 5, 3, 4, 3, 2, - 2, 9, 5, 2, 4, 14, 3, 4, 4, 2, 2, 4, 1, 1, 7, 2, 75, 36, 4, 18, 16, 11, 5, 9, 3, 2, 4, 16, 8, 4, 2, 4, 3, 12, 2, 12, 6, 2, 2, 2, 2, - 3, 2, 40, 3, 13, 9, 3, 3, 3, 3, 9, 2, 4, 2, 2, 13, 3, 3, 4, 1, 2, 74, 5, 5, 3, 3, 2, 2, 3, 2, 4, 3, 5, 27, 3, 3, 2, 2, 2, 4, 4, + 24, 5, 3, 4, 2, 3, 6, 2, 1, 1, 24, 1, 1, 2, 2, 2, 4, 1, 1, 1, 5, 8, 2, 29, 4, 4, 4, 4, 7, 9, 2, 3, 3, 3, 10, 6, 4, 1, 2, 19, 4, + 2, 1, 2, 1, 1, 2, 5, 3, 2, 155,29, 2, 4, 2, 2, 3, 3, 4, 4, 2, 2, 1, 2, 1, 17, 4, 4, 17, 2, 1, 2, 2, 2, 2, 10, 4, 10, 2, 2, 2, 1, + 1, 1, 2, 1, 1, 1, 1, 1, 18, 8, 5, 9, 5, 4, 19, 4, 1, 1, 1, 1, 2, 2, 4, 2, 3, 2, 1, 1, 4, 8, 1, 1, 66, 6, 1, 1, 6, 3, 2, 2, 1, + 11, 1, 3, 5, 3, 2, 1, 5, 4, 1, 1, 1, 1, 17, 5, 8, 3, 3, 2, 4, 7, 2, 3, 1, 1, 1, 1, 1, 56, 3, 2, 2, 4, 2, 2, 2, 4, 1, 2, 2, 2, + 5, 2, 4, 2, 9, 3, 1, 1, 1, 1, 2, 3, 1, 3, 2, 4, 7, 3, 1, 1, 4, 5, 10, 2, 2, 2, 2, 2, 1, 23, 3, 7, 9, 4, 25, 7, 8, 3, 34, 5, 1, + 1, 4, 2, 2, 8, 5, 8, 1, 2, 13, 8, 16, 7, 2, 3, 19, 13, 6, 6, 3, 18, 5, 4, 4, 2, 2, 2, 12, 3, 3, 11, 1, 1, 6, 4, 22, 4, 3, 3, 5, 3, + 8, 4, 3, 1, 1, 2, 2, 3, 3, 5, 2, 136,10, 1, 1, 5, 4, 1, 10, 2, 18, 4, 3, 3, 2, 2, 2, 11, 3, 5, 3, 1, 2, 14, 5, 5, 5, 5, 4, 27, 8, + 3, 5, 7, 2, 19, 2, 1, 6, 3, 1, 1, 7, 2, 4, 168,14, 4, 3, 1, 1, 2, 1, 1, 18, 1, 4, 3, 6, 4, 4, 41, 10, 2, 5, 1, 1, 10, 2, 5, 4, 4, + 2, 2, 2, 1, 1, 5, 4, 20, 12, 2, 4, 1, 3, 3, 12, 2, 2, 2, 7, 6, 5, 9, 1, 1, 1, 4, 1, 9, 2, 4, 2, 4, 2, 7, 14, 7, 5, 1, 50, 7, 3, + 3, 2, 3, 2, 5, 5, 1, 4, 1, 5, 3, 2, 5, 1, 1, 23, 9, 2, 4, 4, 5, 28, 22, 2, 3, 2, 2, 3, 2, 1, 2, 40, 11, 6, 1, 14, 6, 1, 4, 3, 3, + 54, 18, 8, 4, 3, 5, 2, 6, 1, 8, 5, 4, 2, 2, 6, 3, 2, 2, 1, 3, 10, 2, 2, 11, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 15, 2, 1, 1, + 1, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 62, 2, 1, 3, 6, 2, 2, 2, 6, 15, 4, 5, 6, 12, 3, 2, 13, 5, 1, 1, 1, + 3, 2, 8, 1, 3, 2, 2, 2, 13, 4, 1, 1, 3, 2, 2, 2, 2, 76, 2, 2, 5, 1, 4, 12, 4, 13, 5, 10, 3, 3, 9, 5, 7, 3, 1, 1, 10, 2, 3, 10, 3, + 65, 3, 2, 2, 8, 2, 7, 13, 3, 15, 9, 1, 10, 1, 1, 2, 4, 2, 1, 1, 113,5, 2, 3, 1, 1, 6, 9, 6, 2, 2, 1, 1, 1, 1, 2, 1, 1, 59, 5, 14, + 4, 10, 8, 15, 1, 13, 4, 6, 58, 5, 6, 5, 2, 8, 6, 5, 3, 1, 29, 2, 2, 3, 1, 1, 5, 5, 170,10, 2, 20, 4, 3, 2, 6, 4, 3, 3, 12, 3, 9, 3, + 2, 60, 7, 33, 2, 3, 5, 6, 4, 3, 5, 8, 6, 7, 12, 3, 3, 3, 3, 3, 13, 3, 2, 2, 2, 4, 4, 8, 5, 2, 15, 1, 1, 1, 1, 1, 3, 3, 2, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 18, 2, 2, 4, 6, 2, 120,7, 2, 2, 2, 1, 8, 3, 9, 6, 3, 9, 1, 1, 3, 2, 2, 7, 1, 3, 7, 3, 2, 1, 16, 2, 8, 1, + 2, 4, 2, 9, 4, 20, 4, 1, 1, 7, 3, 3, 6, 2, 2, 1, 45, 4, 8, 3, 2, 2, 4, 11, 5, 4, 10, 4, 54, 3, 12, 12, 6, 3, 2, 2, 2, 4, 3, 1, 4, + 3, 21, 11, 7, 5, 4, 5, 37, 6, 3, 23, 20, 1, 8, 3, 1, 1, 2, 1, 41, 3, 3, 5, 1, 5, 2, 7, 4, 2, 6, 3, 3, 3, 13, 1, 4, 3, 1, 1, 1, 1, + 1, 1, 1, 5, 1, 1, 1, 202,102,2, 2, 2, 2, 2, 2, 2, 1, 5, 3, 5, 3, 1, 1, 1, 21, 4, 11, 3, 9, 1, 2, 1, 1, 1, 1, 1, 1, 20, 3, 2, 1, + 1, 1, 1, 10, 2, 3, 1, 2, 1, 4, 10, 3, 1, 2, 2, 2, 4, 3, 1, 15, 2, 1, 1, 1, 1, 3, 2, 1, 1, 1, 4, 2, 17, 2, 4, 2, 3, 3, 2, 2, 2, + 3, 3, 2, 2, 2, 2, 2, 2, 39, 3, 2, 1, 1, 1, 1, 1, 3, 1, 4, 2, 1, 1, 3, 2, 6, 2, 2, 2, 2, 5, 3, 2, 6, 3, 1, 1, 1, 2, 2, 2, 1, + 16, 5, 2, 1, 3, 2, 1, 1, 2, 2, 1, 1, 2, 1, 1, 9, 4, 2, 1, 1, 18, 3, 8, 2, 2, 3, 3, 30, 29, 3, 7, 3, 3, 5, 1, 4, 2, 2, 35, 10, 2, + 2, 11, 7, 7, 5, 4, 2, 4, 75, 2, 2, 7, 4, 10, 11, 2, 2, 11, 1, 2, 2, 13, 3, 2, 3, 4, 5, 1, 1, 1, 5, 2, 2, 3, 1, 2, 3, 12, 3, 2, 2, + 189,3, 15, 3, 1, 5, 5, 2, 2, 7, 3, 1, 6, 4, 6, 1, 2, 1, 1, 1, 1, 1, 5, 3, 93, 12, 3, 2, 38, 2, 3, 26, 21, 3, 9, 7, 5, 3, 4, 3, 2, + 2, 9, 5, 2, 4, 14, 3, 4, 4, 2, 2, 4, 1, 1, 7, 2, 75, 36, 4, 18, 16, 11, 5, 9, 3, 2, 4, 16, 8, 4, 2, 4, 3, 12, 2, 12, 6, 2, 2, 2, 2, + 3, 2, 40, 3, 13, 9, 3, 3, 3, 3, 9, 2, 4, 2, 2, 13, 3, 3, 4, 1, 2, 74, 5, 5, 3, 3, 2, 2, 3, 2, 4, 3, 5, 27, 3, 3, 2, 2, 2, 4, 4, 3, 2, 2, 1, 4, 16, 2, 5, 3, 3, 7, 2, 1, 1, 1, 3, 26, 7, 7, 8, 2, 1, 2, 2, 24, 5, 2, 4, 2, 3, 15, 2, 4, 6, 3, 5, 25, 2, 14, 5, 135, - 8, 1, 1, 6, 19, 18, 2, 2, 2, 4, 2, 2, 2, 2, 11, 5, 3, 36, 2, 3, 1, 1, 1, 8, 3, 2, 1, 1, 1, 1, 1, 1, 6, 3, 2, 4, 2, 5, 3, 1, 1, - 1, 21, 9, 9, 3, 3, 2, 7, 3, 9, 4, 2, 87, 5, 2, 5, 2, 11, 3, 3, 5, 2, 2, 39, 7, 7, 3, 9, 1, 4, 6, 3, 7, 2, 1, 2, 86, 8, 1, 1, 13, - 12, 9, 5, 5, 2, 1, 2, 7, 40, 11, 5, 1, 1, 1, 4, 4, 4, 3, 11, 2, 6, 1, 1, 2, 1, 1, 1, 9, 3, 3, 4, 3, 5, 2, 2, 9, 2, 1, 1, 1, 1, - 1, 5, 3, 21, 1, 9, 6, 5, 2, 3, 3, 2, 2, 1, 1, 2, 1, 1, 1, 1, 6, 1, 1, 1, 5, 3, 3, 2, 1, 1, 1, 1, 82, 5, 1, 2, 2, 2, 1, 3, 1, - 7, 6, 7, 1, 1, 4, 9, 10, 8, 2, 5, 6, 3, 5, 3, 2, 117,2, 6, 3, 3, 2, 5, 4, 11, 3, 3, 3, 2, 1, 1, 1, 1, 1, 34, 2, 2, 23, 1, 1, 2, - 3, 4, 1, 1, 1, 19, 3, 6, 5, 2, 2, 3, 5, 1, 1, 1, 12, 4, 3, 4, 2, 3, 5, 4, 4, 88, 7, 5, 7, 1, 1, 1, 16, 4, 1, 5, 2, 2, 43, 6, 1, - 23, 2, 2, 10, 3, 2, 2, 2, 4, 2, 2, 1, 5, 2, 2, 4, 3, 5, 2, 2, 3, 1, 1, 1, 53, 3, 1, 1, 2, 2, 5, 3, 1, 6, 2, 4, 3, 7, 3, 2, 2, - 12, 3, 3, 3, 43, 4, 2, 2, 4, 5, 1, 4, 4, 3, 4, 6, 6, 3, 20, 3, 1, 1, 1, 3, 2, 3, 2, 2, 3, 2, 1, 1, 45, 5, 4, 4, 2, 1, 14, 5, 4, - 3, 1, 2, 1, 1, 7, 47, 2, 12, 4, 2, 6, 3, 4, 4, 2, 5, 2, 4, 2, 76, 14, 12, 6, 4, 2, 1, 1, 1, 10, 3, 2, 3, 4, 20, 19, 18, 2, 4, 3, 10, - 7, 4, 4, 7, 5, 3, 2, 99, 10, 5, 17, 14, 3, 8, 3, 2, 8, 5, 7, 1, 4, 2, 12, 4, 3, 20, 3, 4, 8, 5, 3, 3, 2, 26, 5, 5, 5, 5, 7, 4, 1, - 2, 9, 3, 3, 4, 3, 41, 8, 1, 1, 2, 10, 2, 2, 3, 4, 4, 3, 3, 3, 4, 4, 2, 2, 42, 4, 1, 19, 7, 2, 4, 5, 1, 1, 6, 3, 2, 2, 4, 2, 23, - 13, 3, 2, 2, 2, 4, 1, 1, 1, 1, 70, 2, 2, 7, 10, 1, 5, 16, 5, 2, 9, 6, 5, 12, 6, 5, 4, 3, 6, 2, 17, 5, 3, 3, 14, 4, 1, 1, 1, 1, 2, - 44, 7, 2, 3, 1, 1, 1, 2, 13, 2, 4, 2, 1, 1, 1, 1, 7, 4, 2, 1, 11, 3, 1, 1, 6, 3, 27, 7, 2, 3, 9, 2, 3, 118,15, 4, 9, 4, 4, 10, 1, - 4, 1, 11, 2, 3, 9, 2, 2, 15, 3, 3, 1, 5, 1, 1, 4, 20, 2, 1, 3, 3, 3, 2, 2, 1, 1, 3, 1, 2, 4, 1, 4, 49, 14, 7, 3, 2, 4, 6, 6, 2, - 2, 2, 2, 2, 4, 3, 3, 2, 2, 2, 2, 1, 1, 4, 1, 115,9, 2, 3, 3, 2, 10, 2, 4, 3, 3, 8, 2, 2, 2, 8, 3, 2, 20, 4, 4, 4, 1, 3, 4, 2, - 3, 1, 1, 1, 5, 4, 15, 6, 2, 2, 2, 8, 7, 7, 7, 6, 5, 5, 3, 8, 2, 4, 2, 2, 2, 2, 5, 4, 2, 1, 44, 7, 1, 1, 6, 8, 6, 3, 4, 2, 2, - 58, 8, 2, 3, 2, 10, 3, 7, 2, 2, 18, 9, 2, 1, 3, 4, 2, 2, 139,11, 1, 9, 5, 2, 2, 12, 2, 2, 2, 2, 1, 13, 4, 3, 1, 4, 3, 7, 4, 3, 4, - 2, 20, 4, 3, 2, 3, 2, 1, 1, 1, 2, 1, 8, 3, 4, 10, 3, 2, 12, 2, 2, 3, 2, 2, 1, 1, 1, 1, 1, 1, 2, 4, 4, 2, 2, 1, 130,9, 2, 2, 13, - 3, 1, 1, 1, 9, 5, 4, 3, 1, 2, 2, 5, 9, 2, 3, 12, 2, 3, 1, 7, 2, 3, 6, 5, 7, 3, 3, 1, 1, 10, 4, 13, 3, 33, 4, 10, 4, 7, 2, 1, 2, - 5, 2, 2, 76, 8, 4, 3, 11, 2, 3, 9, 3, 4, 2, 1, 1, 5, 8, 2, 2, 1, 1, 16, 4, 1, 1, 2, 2, 2, 2, 4, 2, 35, 1, 1, 1, 2, 2, 3, 3, 10, - 4, 2, 8, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 37, 28, 8, 3, 15, 2, 5, 3, 4, 3, 4, 4, 26, 18, 18, 4, 2, 3, 3, - 2, 4, 3, 1, 1, 43, 8, 3, 6, 2, 2, 1, 1, 10, 3, 10, 7, 3, 4, 5, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 181,5, 6, 2, 2, 1, 5, 5, 1, 3, - 2, 6, 1, 1, 6, 2, 1, 1, 7, 1, 2, 1, 10, 2, 2, 1, 2, 2, 9, 2, 4, 4, 9, 3, 1, 3, 15, 1, 1, 3, 3, 4, 16, 1, 3, 1, 2, 1, 3, 3, 28, - 2, 2, 2, 13, 3, 3, 3, 1, 1, 2, 4, 11, 5, 2, 2, 14, 9, 4, 12, 2, 2, 5, 3, 3, 6, 2, 3, 2, 3, 123,5, 2, 1, 2, 1, 6, 3, 3, 3, 2, 3, - 32, 3, 4, 5, 11, 2, 7, 2, 3, 3, 2, 9, 5, 2, 10, 3, 12, 1, 5, 2, 10, 1, 1, 4, 3, 3, 4, 1, 12, 4, 5, 1, 1, 1, 1, 1, 1, 1, 3, 132,2, - 3, 1, 1, 1, 16, 7, 2, 2, 3, 3, 3, 3, 10, 5, 2, 2, 70, 15, 9, 8, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 44, 6, 3, 2, 7, 3, 17, 7, 7, 5, 6, - 9, 5, 3, 7, 2, 3, 3, 2, 4, 2, 100,3, 17, 4, 3, 4, 6, 4, 2, 7, 9, 3, 19, 5, 3, 2, 6, 3, 1, 1, 6, 4, 5, 3, 80, 7, 4, 4, 2, 2, 7, - 4, 3, 1, 1, 3, 5, 3, 17, 3, 2, 1, 1, 12, 4, 3, 1, 1, 13, 4, 2, 2, 3, 2, 32, 3, 2, 6, 6, 6, 5, 3, 16, 2, 11, 2, 16, 3, 5, 1, 2, 2, - 8, 1, 1, 2, 1, 2, 18, 2, 2, 4, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 17, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 5, 1, 1, 2, 11, 2, 4, - 49, 10, 4, 10, 3, 18, 6, 5, 5, 3, 1, 39, 3, 21, 6, 6, 2, 3, 1, 6, 4, 2, 2, 2, 4, 20, 2, 3, 3, 3, 2, 6, 2, 28, 2, 10, 8, 5, 1, 5, 2, - 2, 9, 2, 2, 3, 1, 30, 2, 1, 1, 2, 8, 2, 1, 3, 10, 6, 7, 2, 8, 7, 25, 6, 2, 3, 2, 5, 2, 2, 2, 6, 3, 2, 55, 7, 3, 4, 2, 4, 4, 1, - 13, 3, 4, 3, 2, 2, 8, 3, 1, 1, 4, 2, 2, 1, 35, 15, 3, 2, 7, 3, 6, 3, 3, 3, 2, 74, 4, 14, 4, 3, 4, 4, 11, 2, 1, 2, 1, 5, 3, 15, 10, - 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 7, 3, 5, 1, 1, 1, 1, 19, 2, 2, 5, 3, 3, 3, 3, 2, 2, 2, 99, 7, 2, 1, 7, 3, 2, - 4, 2, 10, 5, 1, 3, 9, 2, 3, 2, 2, 2, 4, 5, 19, 1, 1, 3, 3, 5, 2, 8, 1, 1, 1, 1, 1, 2, 2, 5, 1, 43, 3, 2, 4, 11, 2, 4, 2, 3, 4, - 2, 1, 2, 4, 2, 2, 5, 3, 3, 3, 2, 32, 3, 6, 6, 2, 3, 6, 1, 4, 5, 5, 6, 1, 2, 2, 2, 20, 2, 3, 7, 2, 5, 5, 2, 2, 3, 14, 7, 1, 1, - 1, 1, 3, 2, 1, 1, 38, 19, 3, 1, 2, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 4, 4, 3, 1, 3, 12, 4, 4, 1, 3, 1, 3, 56, 3, 2, 1, 14, 8, 2, 4, - 3, 2, 1, 1, 4, 2, 2, 5, 2, 2, 6, 3, 3, 3, 2, 3, 5, 3, 1, 1, 3, 5, 1, 1, 1, 45, 14, 1, 2, 3, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 14, - 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 5, 3, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 5, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, - 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 9, 3, 124,22, 9, 3, 3, 5, 4, 21, 11, 5, 3, 3, 9, 4, 2, 36, 1, - 1, 1, 2, 3, 15, 3, 3, 3, 4, 1, 8, 2, 2, 19, 5, 2, 7, 4, 2, 4, 3, 3, 3, 3, 3, 3, 134,11, 3, 2, 15, 7, 28, 6, 2, 7, 4, 3, 3, 1, 1, - 6, 3, 17, 2, 4, 3, 2, 3, 18, 1, 3, 4, 4, 2, 10, 3, 3, 5, 3, 4, 2, 10, 6, 3, 1, 1, 1, 6, 3, 80, 10, 1, 1, 2, 1, 7, 4, 11, 1, 11, 3, - 2, 2, 2, 7, 2, 2, 4, 18, 5, 2, 1, 1, 2, 2, 2, 11, 1, 1, 2, 2, 2, 2, 2, 80, 13, 3, 3, 10, 6, 3, 9, 3, 3, 2, 10, 3, 3, 4, 24, 7, 4, - 3, 9, 2, 3, 2, 2, 3, 2, 9, 7, 1, 3, 3, 2, 1, 2, 83, 20, 1, 4, 5, 3, 4, 2, 12, 9, 3, 4, 3, 15, 2, 1, 1, 1, 3, 3, 14, 7, 4, 2, 4, - 8, 4, 30, 7, 4, 4, 3, 4, 2, 2, 43, 4, 4, 3, 9, 3, 1, 7, 3, 5, 13, 2, 2, 1, 6, 61, 3, 34, 3, 11, 9, 6, 4, 2, 6, 2, 8, 3, 4, 4, 1, - 1, 3, 45, 11, 4, 3, 3, 12, 2, 2, 4, 9, 2, 5, 3, 237,38, 2, 8, 2, 14, 4, 3, 4, 2, 1, 51, 4, 19, 13, 10, 4, 8, 4, 2, 6, 2, 24, 4, 3, 9, - 6, 22, 13, 8, 2, 2, 3, 13, 7, 4, 30, 2, 9, 4, 2, 9, 6, 4, 4, 3, 2, 47, 5, 4, 6, 4, 2, 5, 6, 2, 5, 3, 5, 2, 4, 1, 10, 1, 30, 6, 6, - 5, 13, 2, 4, 140,9, 2, 2, 17, 5, 5, 2, 9, 3, 3, 3, 5, 5, 3, 2, 2, 6, 4, 4, 4, 7, 5, 2, 7, 3, 9, 6, 14, 4, 4, 21, 6, 5, 4, 3, 21, - 4, 1, 5, 5, 3, 3, 2, 3, 2, 15, 3, 6, 2, 2, 103,6, 2, 2, 2, 2, 20, 1, 1, 1, 4, 7, 2, 3, 2, 4, 2, 9, 3, 6, 2, 3, 5, 2, 2, 9, 3, - 2, 3, 5, 2, 6, 4, 7, 3, 1, 2, 12, 5, 4, 3, 11, 4, 3, 10, 5, 2, 18, 4, 6, 4, 8, 2, 4, 4, 3, 17, 3, 5, 2, 30, 4, 8, 5, 4, 3, 3, 5, - 3, 18, 7, 4, 3, 3, 4, 3, 2, 12, 2, 2, 1, 2, 99, 11, 2, 4, 2, 3, 15, 6, 2, 2, 2, 15, 3, 5, 8, 7, 3, 10, 5, 11, 4, 1, 1, 4, 3, 7, 4, - 5, 3, 3, 7, 2, 4, 4, 2, 189,22, 4, 3, 3, 2, 3, 3, 7, 4, 10, 3, 13, 2, 13, 8, 3, 23, 2, 3, 3, 5, 2, 11, 5, 5, 18, 6, 3, 32, 6, 10, 3, - 3, 10, 3, 5, 3, 6, 1, 3, 5, 4, 3, 2, 2, 1, 145,12, 3, 3, 3, 11, 4, 1, 2, 12, 7, 30, 8, 2, 2, 3, 3, 2, 4, 3, 5, 2, 4, 1, 1, 1, 1, - 15, 6, 3, 3, 3, 7, 2, 23, 3, 10, 3, 2, 20, 3, 3, 3, 3, 3, 1, 2, 160,10, 3, 6, 6, 27, 1, 2, 2, 5, 1, 11, 7, 6, 3, 14, 6, 2, 29, 2, 3, - 12, 3, 3, 1, 1, 2, 17, 4, 3, 5, 3, 10, 6, 2, 4, 2, 22, 4, 2, 7, 3, 7, 7, 3, 2, 2, 4, 4, 220,9, 3, 2, 3, 22, 7, 3, 11, 2, 1, 6, 2, - 2, 2, 5, 2, 4, 3, 23, 22, 2, 4, 5, 5, 4, 1, 2, 4, 2, 26, 9, 2, 7, 8, 4, 4, 4, 1, 3, 2, 79, 13, 4, 37, 4, 5, 23, 3, 9, 6, 23, 3, 5, - 5, 10, 4, 22, 2, 8, 3, 2, 1, 1, 1, 5, 2, 2, 2, 1, 1, 3, 103,28, 3, 10, 3, 5, 8, 3, 36, 4, 5, 18, 4, 4, 18, 6, 2, 2, 5, 3, 15, 1, 2, - 8, 2, 3, 76, 8, 3, 3, 7, 5, 3, 4, 4, 6, 4, 5, 4, 9, 2, 2, 10, 6, 5, 3, 3, 7, 3, 10, 2, 3, 2, 46, 3, 3, 7, 3, 3, 3, 7, 3, 3, 4, - 53, 1, 23, 19, 5, 7, 3, 2, 3, 4, 4, 3, 3, 1, 6, 4, 2, 18, 1, 1, 1, 1, 1, 1, 1, 1, 2, 5, 2, 3, 3, 2, 5, 1, 1, 3, 1, 1, 171,7, 6, - 25, 2, 2, 11, 8, 3, 3, 9, 3, 3, 5, 5, 9, 6, 20, 4, 10, 3, 14, 8, 16, 5, 17, 14, 11, 11, 2, 21, 15, 1, 1, 6, 5, 55, 9, 3, 4, 16, 4, 3, 2, - 1, 4, 2, 4, 2, 2, 13, 3, 1, 1, 3, 8, 3, 2, 3, 70, 4, 17, 6, 4, 2, 2, 2, 7, 2, 7, 3, 4, 10, 2, 2, 1, 3, 3, 2, 12, 2, 7, 7, 6, 3, - 53, 2, 3, 13, 1, 6, 2, 5, 5, 3, 2, 4, 4, 3, 3, 3, 2, 4, 4, 4, 2, 67, 3, 3, 3, 9, 5, 3, 3, 5, 3, 5, 8, 5, 4, 4, 1, 3, 53, 2, 9, - 4, 9, 6, 1, 1, 5, 3, 3, 3, 2, 2, 2, 19, 2, 2, 2, 2, 2, 3, 152,38, 16, 11, 5, 4, 3, 2, 8, 18, 11, 11, 4, 3, 3, 15, 2, 5, 4, 2, 36, 10, - 9, 11, 11, 11, 11, 11, 10, 10, 4, 6, 3, 5, 4, 4, 11, 4, 4, 2, 10, 4, 3, 5, 4, 4, 1, 39, 3, 2, 5, 11, 6, 3, 2, 1, 3, 2, 6, 4, 3, 146,2, - 17, 7, 3, 1, 1, 1, 1, 13, 3, 3, 3, 3, 8, 4, 1, 1, 1, 12, 4, 3, 2, 1, 3, 10, 8, 3, 5, 2, 2, 19, 2, 6, 2, 25, 4, 4, 2, 2, 2, 5, 2, - 20, 5, 2, 1, 5, 2, 5, 2, 12, 2, 15, 4, 1, 4, 2, 86, 14, 2, 3, 3, 5, 8, 2, 3, 8, 3, 16, 5, 3, 1, 5, 4, 16, 12, 1, 1, 5, 6, 153,1, 1, - 1, 14, 4, 3, 3, 6, 12, 3, 7, 2, 3, 15, 3, 7, 7, 6, 4, 4, 18, 6, 2, 2, 5, 19, 4, 3, 2, 6, 3, 15, 3, 5, 6, 15, 3, 5, 1, 7, 71, 2, 3, - 2, 46, 10, 1, 8, 8, 2, 1, 10, 3, 3, 10, 4, 4, 2, 9, 5, 5, 5, 4, 4, 4, 3, 3, 45, 5, 7, 4, 6, 3, 2, 1, 1, 1, 1, 2, 9, 2, 6, 4, 2, - 2, 3, 1, 31, 3, 5, 3, 3, 9, 2, 122,4, 10, 2, 5, 5, 4, 7, 4, 1, 3, 8, 6, 8, 5, 4, 7, 3, 3, 2, 1, 8, 4, 2, 5, 2, 2, 27, 10, 5, 4, - 3, 4, 16, 4, 5, 3, 3, 3, 2, 3, 3, 108,2, 4, 4, 4, 5, 2, 2, 10, 5, 7, 3, 22, 21, 16, 15, 2, 5, 2, 2, 3, 10, 30, 14, 12, 7, 3, 35, 1, 1, - 7, 1, 3, 1, 2, 2, 6, 2, 7, 3, 137,23, 3, 2, 12, 4, 3, 3, 60, 2, 2, 13, 1, 1, 12, 2, 3, 21, 5, 5, 1, 1, 3, 4, 40, 3, 2, 6, 10, 2, 3, - 4, 15, 4, 2, 5, 1, 4, 41, 8, 5, 4, 3, 7, 3, 3, 18, 4, 10, 28, 15, 7, 5, 4, 4, 4, 4, 4, 3, 3, 2, 1, 2, 2, 5, 5, 27, 2, 3, 2, 4, 4, - 3, 3, 3, 10, 3, 12, 1, 1, 4, 3, 1, 1, 1, 1, 1, 1, 5, 4, 3, 6, 1, 1, 1, 2, 1, 1, 9, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, - 2, 1, 1, 1, 1, 29, 4, 4, 9, 2, 3, 103,3, 8, 5, 55, 2, 51, 21, 8, 5, 2, 10, 4, 23, 8, 3, 2, 3, 6, 4, 6, 1, 3, 23, 11, 6, 4, 8, 4, 4, - 3, 3, 90, 7, 3, 2, 20, 14, 8, 2, 2, 26, 4, 4, 2, 2, 13, 9, 6, 2, 2, 2, 2, 1, 2, 26, 6, 4, 3, 2, 3, 3, 2, 2, 2, 1, 4, 2, 2, 29, 8, - 4, 2, 3, 2, 4, 3, 1, 98, 31, 12, 3, 5, 2, 2, 4, 2, 2, 2, 3, 3, 3, 7, 2, 4, 2, 2, 7, 2, 5, 12, 2, 1, 6, 2, 3, 7, 4, 3, 3, 5, 3, - 55, 35, 3, 1, 3, 2, 2, 2, 5, 3, 12, 2, 3, 3, 3, 4, 3, 10, 86, 12, 3, 3, 6, 46, 46, 4, 2, 2, 7, 3, 3, 8, 2, 2, 2, 3, 3, 5, 8, 2, 2, - 4, 5, 4, 6, 3, 2, 29, 3, 20, 2, 1, 2, 5, 3, 3, 2, 4, 83, 4, 3, 1, 1, 1, 14, 5, 3, 2, 2, 1, 1, 6, 3, 1, 34, 10, 2, 2, 2, 14, 5, 2, - 2, 4, 1, 4, 3, 4, 2, 1, 4, 80, 12, 2, 2, 15, 3, 3, 4, 2, 2, 12, 2, 4, 10, 2, 8, 3, 1, 11, 4, 3, 3, 11, 2, 2, 2, 3, 2, 11, 4, 17, 2, - 2, 2, 2, 8, 7, 6, 91, 15, 2, 3, 9, 3, 3, 2, 26, 4, 3, 9, 3, 2, 7, 2, 3, 4, 1, 1, 4, 4, 3, 3, 11, 3, 42, 13, 4, 4, 5, 3, 8, 5, 3, - 1, 47, 10, 2, 2, 3, 3, 13, 7, 1, 1, 8, 5, 5, 5, 5, 4, 3, 5, 25, 5, 3, 3, 2, 7, 3, 2, 1, 2, 1, 1, 1, 19, 4, 13, 5, 2, 2, 16, 2, 2, - 2, 2, 3, 1, 8, 1, 1, 3, 6, 21, 17, 4, 3, 2, 4, 76, 5, 2, 6, 5, 1, 4, 2, 6, 3, 1, 1, 19, 5, 3, 1, 3, 18, 4, 2, 2, 4, 2, 7, 4, 2, - 20, 20, 6, 3, 9, 9, 5, 5, 10, 4, 3, 94, 14, 3, 6, 4, 8, 4, 4, 1, 8, 3, 2, 10, 4, 2, 3, 7, 21, 12, 9, 4, 3, 2, 156,7, 4, 4, 4, 23, 14, - 12, 7, 4, 2, 17, 2, 4, 7, 5, 5, 5, 5, 5, 3, 3, 6, 6, 5, 3, 3, 2, 5, 1, 2, 3, 3, 3, 61, 12, 9, 3, 37, 37, 7, 4, 1, 1, 1, 2, 3, 3, - 2, 2, 2, 1, 2, 2, 4, 3, 3, 2, 4, 4, 4, 3, 5, 3, 3, 2, 7, 2, 2, 7, 1, 2, 2, 1, 75, 4, 42, 1, 1, 1, 5, 4, 21, 2, 3, 3, 2, 5, 1, - 4, 4, 3, 2, 1, 5, 2, 15, 8, 6, 4, 2, 2, 2, 35, 1, 1, 1, 19, 2, 2, 10, 7, 2, 3, 2, 7, 13, 1, 1, 1, 1, 2, 2, 1, 1, 6, 4, 1, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 66, 3, 27, 2, 1, 4, 19, 4, 1, 5, 2, 1, 3, 1, 1, 2, 2, 1, 1, 9, 1, 3, 3, 2, 2, 5, 4, 3, 2, 1, 1, 1, 13, - 1, 1, 1, 3, 2, 4, 4, 3, 1, 4, 2, 36, 8, 9, 3, 2, 1, 1, 8, 6, 53, 8, 11, 4, 4, 12, 4, 2, 3, 1, 3, 4, 6, 5, 5, 122,31, 16, 10, 2, 2, - 9, 4, 17, 3, 2, 2, 2, 51, 4, 16, 7, 3, 2, 3, 5, 2, 2, 2, 5, 10, 5, 1, 4, 4, 1, 7, 2, 25, 6, 1, 8, 6, 2, 2, 1, 46, 4, 2, 2, 3, 3, - 2, 2, 5, 4, 3, 4, 8, 4, 2, 8, 5, 3, 37, 2, 5, 1, 3, 3, 2, 2, 14, 2, 3, 76, 14, 8, 5, 1, 5, 13, 6, 4, 5, 4, 23, 5, 5, 3, 3, 7, 2, - 3, 2, 26, 1, 1, 5, 2, 8, 3, 1, 20, 3, 2, 3, 1, 3, 6, 4, 3, 26, 4, 5, 2, 2, 2, 2, 4, 3, 4, 3, 3, 3, 53, 7, 6, 5, 3, 6, 4, 1, 1, - 22, 3, 8, 4, 4, 6, 4, 1, 7, 3, 1, 45, 11, 1, 3, 14, 8, 7, 7, 3, 2, 5, 3, 3, 2, 2, 4, 4, 1, 2, 2, 181,3, 2, 2, 22, 2, 15, 14, 3, 16, - 6, 3, 3, 1, 1, 4, 3, 119,6, 2, 12, 2, 6, 3, 2, 4, 2, 2, 3, 10, 3, 1, 3, 4, 2, 2, 11, 2, 1, 5, 14, 5, 4, 4, 4, 3, 6, 4, 2, 5, 1, - 1, 2, 2, 4, 2, 11, 3, 3, 2, 4, 2, 2, 2, 6, 2, 4, 3, 6, 2, 1, 1, 1, 4, 6, 2, 4, 78, 3, 1, 1, 1, 22, 6, 6, 8, 8, 8, 2, 13, 8, 6, - 3, 37, 8, 3, 11, 4, 5, 2, 2, 1, 1, 1, 1, 1, 4, 3, 2, 1, 2, 3, 137,13, 7, 13, 3, 4, 48, 3, 2, 5, 24, 6, 3, 10, 2, 7, 25, 3, 2, 3, 7, - 11, 5, 3, 5, 77, 9, 3, 2, 4, 1, 2, 14, 6, 1, 1, 5, 8, 4, 4, 4, 11, 3, 1, 13, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 50, 1, 3, 2, 14, 5, 3, - 2, 1, 3, 2, 1, 3, 2, 1, 1, 1, 5, 12, 4, 4, 4, 128,3, 4, 19, 8, 5, 3, 3, 2, 2, 3, 19, 17, 2, 4, 4, 19, 16, 2, 3, 2, 2, 7, 3, 10, 5, - 3, 14, 5, 4, 3, 5, 5, 10, 4, 3, 2, 1, 208,10, 174,3, 11, 11, 5, 6, 2, 3, 3, 2, 1, 1, 2, 8, 8, 3, 3, 3, 3, 2, 6, 6, 3, 2, 2, 19, 3, - 6, 3, 3, 8, 5, 4, 1, 3, 22, 2, 2, 4, 16, 3, 2, 7, 2, 6, 4, 1, 18, 9, 5, 2, 57, 3, 2, 5, 3, 2, 16, 7, 3, 2, 5, 6, 4, 1, 6, 3, 3, - 3, 4, 1, 2, 1, 1, 19, 9, 7, 22, 6, 6, 4, 4, 2, 1, 1, 1, 1, 1, 9, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 18, 1, 1, 1, 4, 4, 1, 2, 2, 1, - 5, 4, 4, 20, 2, 12, 5, 1, 1, 1, 1, 1, 1, 1, 1, 44, 7, 2, 2, 6, 4, 8, 3, 2, 7, 2, 4, 2, 2, 6, 5, 5, 5, 2, 1, 161,15, 3, 2, 8, 8, - 4, 3, 10, 3, 3, 14, 3, 5, 1, 2, 2, 1, 35, 6, 5, 4, 3, 3, 3, 5, 3, 2, 3, 57, 2, 10, 4, 3, 6, 4, 3, 29, 2, 1, 2, 3, 5, 4, 2, 7, 2, - 4, 2, 51, 1, 3, 10, 1, 3, 3, 1, 6, 2, 3, 2, 7, 4, 4, 4, 4, 6, 6, 4, 3, 50, 7, 4, 4, 8, 2, 2, 6, 4, 3, 7, 4, 2, 2, 3, 2, 5, 2, - 2, 6, 1, 3, 3, 3, 13, 7, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 21, 6, 1, 1, 4, 1, 3, 9, 4, 19, 2, 8, 1, 2, 3, 3, 37, 17, 10, 2, 3, - 10, 3, 5, 3, 16, 3, 5, 2, 3, 58, 5, 2, 19, 3, 11, 10, 2, 13, 9, 5, 2, 3, 10, 2, 1, 90, 8, 9, 7, 34, 3, 5, 9, 2, 2, 1, 3, 2, 11, 2, 3, - 13, 3, 3, 4, 2, 3, 7, 1, 1, 1, 2, 30, 3, 1, 4, 2, 10, 5, 2, 4, 3, 3, 27, 3, 5, 4, 2, 36, 5, 4, 1, 2, 5, 3, 2, 2, 10, 2, 54, 6, 12, - 5, 4, 4, 3, 3, 1, 1, 3, 11, 5, 1, 3, 2, 4, 15, 3, 2, 1, 4, 2, 2, 16, 6, 4, 4, 3, 3, 3, 3, 4, 4, 3, 2, 1, 16, 3, 3, 2, 4, 1, 9, - 3, 3, 3, 3, 1, 2, 1, 1, 1, 4, 2, 3, 1, 1, 182,8, 1, 2, 6, 3, 2, 12, 3, 2, 1, 1, 2, 17, 5, 6, 4, 4, 2, 8, 4, 16, 3, 2, 10, 9, 1, - 6, 3, 52, 4, 8, 8, 11, 2, 3, 8, 5, 5, 2, 3, 11, 8, 7, 20, 3, 3, 6, 2, 1, 4, 2, 2, 15, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 2, 3, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 2, 1, 2, 3, 2, 1, 1, 1, 1, 15, 1, 1, 3, 2, 2, 7, 1, 1, 5, 3, 2, 2, - 1, 1, 13, 4, 3, 3, 2, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 3, 2, 2, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 5, 3, 2, 1, 1, 1, - 1, 1, 27, 1, 2, 4, 10, 2, 2, 2, 2, 2, 3, 1, 1, 1, 1, 1, 28, 2, 2, 8, 5, 4, 4, 4, 44, 2, 4, 3, 1, 1, 6, 2, 5, 2, 1, 11, 2, 2, 1, - 3, 5, 2, 2, 33, 12, 4, 6, 3, 8, 7, 4, 2, 3, 1, 2, 6, 2, 1, 2, 2, 20, 3, 1, 1, 2, 1, 12, 7, 4, 3, 3, 3, 3, 2, 2, 22, 1, 1, 8, 7, - 6, 1, 4, 3, 3, 3, 2, 2, 2, 6, 2, 2, 2, 1, 1, 63, 10, 2, 10, 23, 4, 2, 2, 1, 1, 1, 1, 15, 2, 7, 4, 8, 3, 1, 1, 1, 26, 6, 7, 4, 7, - 1, 3, 3, 1, 65, 4, 3, 3, 3, 22, 1, 3, 7, 3, 5, 14, 9, 2, 6, 5, 3, 5, 2, 1, 19, 10, 1, 3, 1, 8, 3, 9, 4, 2, 2, 3, 13, 7, 1, 2, 5, - 3, 8, 2, 4, 1, 3, 2, 3, 3, 2, 2, 28, 3, 21, 2, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 3, 3, 3, 6, 2, 1, 2, 2, 8, 4, 4, 2, 5, 2, 1, - 1, 1, 215,30, 1, 5, 5, 4, 3, 3, 2, 1, 7, 3, 3, 4, 6, 3, 1, 2, 1, 4, 33, 4, 3, 4, 7, 1, 10, 4, 3, 28, 9, 4, 1, 1, 3, 6, 17, 7, 5, - 3, 5, 1, 2, 2, 22, 6, 10, 9, 8, 8, 3, 8, 6, 4, 17, 7, 23, 8, 5, 6, 3, 3, 2, 2, 6, 3, 2, 38, 4, 2, 2, 1, 3, 2, 2, 7, 4, 2, 12, 10, - 7, 1, 1, 1, 18, 8, 4, 3, 5, 33, 3, 12, 1, 4, 3, 3, 2, 4, 5, 3, 2, 4, 4, 4, 2, 9, 7, 5, 4, 2, 18, 2, 5, 2, 2, 25, 17, 10, 2, 5, 1, - 1, 2, 43, 22, 5, 4, 4, 8, 8, 3, 3, 5, 4, 17, 3, 1, 3, 9, 2, 6, 2, 3, 3, 72, 12, 6, 2, 22, 4, 3, 15, 6, 4, 21, 12, 10, 8, 3, 4, 1, 1, - 8, 3, 8, 5, 17, 4, 1, 6, 3, 2, 8, 3, 5, 3, 2, 7, 2, 1, 1, 1, 2, 131,60, 5, 2, 1, 1, 2, 2, 2, 3, 3, 2, 11, 2, 1, 1, 3, 9, 2, 1, - 1, 14, 9, 4, 3, 2, 2, 1, 1, 2, 5, 1, 4, 1, 1, 2, 9, 2, 2, 9, 4, 9, 5, 2, 3, 3, 15, 3, 5, 2, 6, 3, 2, 1, 8, 3, 159,14, 6, 5, 1, - 3, 1, 1, 4, 2, 2, 2, 1, 1, 31, 1, 1, 1, 1, 1, 1, 1, 2, 8, 2, 2, 2, 6, 3, 3, 49, 9, 2, 2, 3, 2, 4, 9, 6, 3, 3, 3, 10, 7, 7, 7, - 2, 2, 2, 1, 7, 3, 7, 19, 4, 6, 5, 1, 1, 2, 1, 1, 8, 2, 1, 3, 66, 4, 1, 2, 2, 4, 3, 19, 8, 2, 6, 4, 9, 3, 2, 3, 1, 1, 18, 17, 2, - 5, 4, 104,22, 8, 3, 2, 2, 29, 2, 2, 1, 3, 4, 2, 3, 1, 4, 2, 4, 1, 1, 10, 8, 2, 2, 9, 2, 13, 2, 6, 5, 3, 6, 92, 7, 2, 1, 1, 10, 2, - 5, 2, 4, 1, 1, 5, 3, 2, 4, 9, 6, 4, 2, 13, 2, 5, 3, 1, 1, 6, 3, 4, 3, 4, 3, 11, 4, 2, 7, 4, 10, 8, 3, 3, 4, 12, 2, 2, 3, 2, 5, - 4, 3, 38, 1, 1, 1, 5, 1, 4, 2, 7, 3, 5, 5, 2, 10, 1, 1, 4, 3, 4, 4, 4, 4, 2, 1, 1, 5, 2, 58, 4, 10, 2, 1, 5, 5, 5, 18, 2, 4, 9, - 3, 10, 4, 2, 3, 60, 16, 2, 7, 16, 3, 13, 2, 2, 1, 5, 11, 2, 13, 2, 2, 3, 3, 3, 1, 1, 1, 1, 1, 18, 3, 6, 1, 1, 1, 6, 26, 3, 4, 4, 3, - 4, 3, 1, 1, 1, 7, 8, 3, 2, 3, 2, 4, 3, 2, 94, 34, 12, 6, 5, 2, 2, 2, 1, 4, 2, 3, 5, 1, 6, 1, 2, 25, 10, 2, 2, 1, 9, 2, 3, 1, 10, - 6, 1, 1, 1, 1, 1, 1, 1, 1, 51, 14, 11, 4, 4, 3, 4, 10, 4, 3, 2, 2, 1, 2, 40, 3, 17, 8, 4, 4, 3, 5, 14, 4, 5, 3, 89, 26, 7, 1, 3, 5, - 4, 4, 6, 18, 9, 3, 5, 3, 14, 3, 3, 3, 9, 4, 3, 7, 2, 3, 4, 5, 22, 1, 1, 4, 3, 6, 6, 6, 7, 6, 5, 4, 66, 17, 5, 2, 7, 3, 9, 3, 2, - 2, 14, 4, 1, 1, 1, 6, 3, 9, 5, 5, 2, 1, 1, 17, 10, 3, 3, 3, 2, 3, 75, 9, 5, 10, 2, 2, 2, 2, 4, 11, 9, 9, 9, 3, 3, 3, 12, 11, 7, 2, - 4, 4, 6, 3, 3, 16, 5, 4, 3, 8, 1, 1, 4, 2, 48, 4, 16, 2, 7, 3, 3, 2, 2, 15, 8, 5, 1, 3, 2, 1, 1, 37, 2, 2, 7, 6, 6, 6, 2, 5, 3, - 5, 1, 8, 3, 40, 4, 1, 2, 7, 2, 3, 6, 1, 1, 2, 6, 1, 2, 2, 51, 7, 3, 13, 6, 4, 10, 2, 4, 4, 5, 3, 33, 8, 6, 7, 7, 7, 7, 6, 1, 2, - 4, 2, 2, 2, 1, 4, 3, 3, 5, 2, 2, 5, 1, 29, 12, 9, 4, 3, 4, 6, 4, 2, 10, 1, 1, 1, 34, 4, 3, 1, 1, 6, 6, 2, 2, 2, 8, 3, 1, 1, 1, - 1, 1, 1, 1, 1, 6, 1, 1, 1, 2, 79, 2, 5, 4, 5, 6, 2, 4, 22, 4, 5, 3, 8, 3, 10, 6, 2, 2, 2, 16, 2, 5, 5, 2, 5, 3, 150,5, 3, 2, 26, - 20, 5, 9, 4, 57, 1, 1, 1, 7, 4, 8, 19, 4, 2, 7, 13, 7, 5, 3, 24, 6, 3, 8, 4, 20, 1, 1, 1, 1, 2, 4, 2, 3, 1, 1, 1, 1, 11, 8, 3, 14, - 4, 7, 2, 29, 2, 2, 1, 7, 3, 4, 3, 3, 86, 27, 20, 11, 10, 7, 11, 5, 2, 2, 17, 12, 7, 6, 4, 3, 2, 10, 3, 2, 9, 5, 4, 2, 4, 3, 8, 4, 3, - 3, 2, 4, 191,29, 2, 4, 10, 5, 3, 1, 1, 11, 2, 2, 17, 1, 5, 3, 1, 7, 4, 3, 10, 2, 2, 48, 11, 3, 2, 18, 4, 3, 6, 17, 3, 6, 14, 2, 14, 3, - 4, 3, 2, 2, 2, 6, 1, 2, 112,5, 1, 29, 14, 2, 2, 2, 1, 13, 5, 7, 3, 13, 6, 8, 7, 5, 2, 40, 5, 5, 5, 5, 4, 13, 8, 6, 5, 23, 7, 1, 2, - 1, 3, 11, 3, 2, 9, 5, 39, 3, 2, 5, 8, 5, 4, 6, 4, 23, 23, 4, 12, 5, 3, 7, 3, 3, 51, 9, 2, 2, 2, 7, 19, 3, 3, 3, 1, 5, 4, 7, 3, 2, - 4, 77, 8, 1, 4, 4, 13, 4, 4, 4, 4, 28, 16, 12, 7, 2, 2, 3, 3, 2, 7, 2, 4, 2, 4, 2, 2, 1, 146,5, 19, 8, 7, 6, 7, 4, 81, 6, 3, 3, 2, - 3, 56, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 2, 1, 14, 7, 4, 6, 3, 2, 1, 2, 1, 11, 6, 4, 2, 3, 11, 5, 27, 3, 2, 14, 3, 2, 17, 7, 7, 3, 6, - 5, 3, 7, 4, 44, 8, 5, 3, 2, 3, 4, 3, 2, 9, 2, 2, 2, 4, 17, 6, 4, 1, 3, 31, 3, 2, 2, 4, 2, 4, 2, 3, 2, 2, 37, 11, 9, 4, 4, 10, 2, - 3, 2, 1, 1, 1, 1, 7, 2, 1, 1, 5, 2, 2, 13, 4, 32, 1, 13, 3, 2, 4, 3, 3, 15, 2, 7, 10, 5, 2, 14, 3, 7, 19, 3, 3, 8, 5, 5, 5, 3, 3, - 82, 27, 5, 1, 1, 1, 1, 6, 2, 2, 1, 1, 7, 20, 2, 6, 2, 22, 2, 4, 2, 7, 4, 3, 4, 112,3, 75, 3, 67, 6, 4, 7, 3, 2, 7, 5, 4, 4, 4, 5, - 16, 3, 3, 3, 11, 1, 2, 2, 2, 1, 6, 6, 5, 5, 11, 1, 32, 1, 2, 2, 2, 1, 2, 3, 1, 4, 6, 3, 19, 18, 3, 3, 5, 2, 47, 5, 4, 2, 2, 2, 21, - 13, 12, 11, 8, 5, 5, 62, 3, 32, 6, 6, 6, 6, 6, 5, 7, 3, 5, 16, 6, 3, 4, 3, 26, 4, 7, 5, 1, 7, 4, 7, 2, 8, 43, 3, 3, 29, 3, 3, 3, 3, - 6, 1, 1, 1, 3, 2, 2, 1, 14, 5, 7, 28, 2, 21, 2, 2, 2, 2, 2, 2, 2, 114,4, 4, 20, 7, 33, 3, 22, 16, 7, 4, 3, 22, 3, 3, 6, 4, 2, 7, 5, - 2, 4, 1, 1, 29, 3, 9, 4, 13, 2, 5, 3, 4, 4, 5, 8, 116,2, 1, 4, 2, 8, 2, 1, 5, 3, 16, 3, 3, 2, 8, 4, 1, 38, 4, 7, 19, 6, 7, 3, 2, - 1, 1, 1, 1, 1, 1, 13, 3, 3, 2, 8, 3, 1, 1, 1, 1, 1, 1, 23, 9, 7, 6, 5, 3, 7, 1, 1, 3, 3, 1, 6, 2, 95, 6, 2, 2, 2, 2, 5, 2, 44, - 3, 3, 34, 2, 18, 7, 5, 3, 5, 3, 2, 1, 2, 3, 3, 5, 5, 5, 6, 121,1, 8, 13, 2, 7, 2, 3, 14, 3, 1, 3, 7, 5, 3, 9, 3, 2, 2, 1, 1, 1, - 1, 1, 1, 3, 3, 10, 5, 2, 17, 3, 1, 8, 3, 2, 2, 4, 7, 4, 2, 1, 5, 3, 1, 1, 3, 92, 11, 2, 5, 4, 12, 12, 2, 2, 3, 3, 9, 9, 2, 3, 8, - 4, 4, 4, 3, 3, 2, 2, 11, 6, 3, 27, 9, 1, 4, 2, 6, 3, 6, 3, 20, 5, 2, 3, 3, 1, 1, 61, 3, 4, 2, 3, 2, 18, 2, 5, 1, 3, 3, 11, 4, 2, - 2, 2, 2, 8, 4, 3, 2, 3, 5, 4, 2, 26, 4, 5, 3, 12, 3, 2, 2, 3, 2, 5, 5, 3, 2, 2, 131,4, 5, 5, 2, 3, 2, 4, 23, 1, 2, 12, 3, 3, 2, - 10, 2, 1, 15, 5, 4, 2, 3, 41, 3, 11, 2, 13, 5, 4, 9, 4, 3, 2, 6, 2, 3, 1, 6, 1, 3, 3, 3, 3, 97, 31, 2, 4, 5, 4, 7, 3, 3, 2, 2, 2, - 31, 5, 5, 3, 3, 11, 2, 4, 2, 10, 3, 6, 4, 12, 2, 5, 12, 3, 5, 1, 93, 2, 3, 15, 11, 2, 3, 11, 4, 20, 6, 2, 2, 9, 4, 3, 3, 3, 3, 6, 2, - 16, 3, 4, 3, 2, 3, 5, 1, 2, 2, 4, 47, 20, 3, 3, 3, 10, 4, 3, 3, 2, 10, 4, 3, 53, 2, 3, 4, 2, 23, 22, 6, 4, 8, 4, 3, 3, 9, 3, 3, 3, - 3, 64, 18, 8, 3, 3, 3, 3, 3, 11, 4, 3, 5, 5, 2, 4, 22, 11, 3, 5, 4, 3, 9, 5, 5, 2, 2, 63, 7, 4, 4, 2, 1, 1, 35, 3, 1, 1, 10, 4, 3, - 2, 3, 3, 1, 1, 4, 1, 5, 2, 2, 5, 3, 4, 12, 1, 2, 4, 2, 3, 33, 21, 4, 8, 7, 4, 4, 9, 4, 4, 4, 1, 197,35, 3, 3, 3, 5, 3, 1, 2, 13, - 7, 2, 2, 5, 4, 4, 3, 2, 12, 3, 4, 2, 1, 8, 3, 2, 3, 2, 27, 4, 2, 9, 5, 3, 1, 2, 9, 2, 5, 3, 2, 29, 9, 2, 3, 2, 2, 15, 2, 2, 6, - 6, 1, 20, 1, 4, 2, 3, 2, 34, 15, 5, 2, 9, 2, 3, 6, 2, 3, 29, 5, 5, 11, 6, 3, 4, 3, 2, 2, 6, 3, 3, 14, 8, 1, 2, 2, 2, 2, 2, 2, 37, - 11, 1, 2, 3, 3, 1, 18, 2, 3, 9, 3, 3, 2, 1, 2, 2, 2, 144,14, 2, 2, 72, 7, 2, 8, 4, 2, 13, 8, 4, 20, 4, 3, 7, 3, 8, 3, 2, 43, 4, 4, - 2, 3, 3, 4, 20, 9, 2, 2, 1, 4, 4, 2, 1, 2, 8, 3, 2, 71, 34, 2, 2, 1, 3, 2, 3, 7, 5, 5, 9, 2, 2, 4, 3, 3, 2, 24, 5, 3, 3, 3, 3, - 2, 5, 3, 5, 2, 75, 25, 4, 11, 4, 3, 2, 2, 9, 3, 4, 2, 18, 4, 2, 9, 9, 3, 4, 4, 6, 2, 4, 4, 17, 5, 4, 10, 4, 3, 72, 18, 4, 33, 6, 8, - 4, 6, 5, 2, 1, 13, 6, 3, 3, 3, 2, 6, 1, 4, 24, 4, 3, 2, 5, 14, 5, 1, 7, 2, 3, 2, 31, 31, 9, 4, 2, 6, 3, 15, 2, 5, 4, 3, 21, 7, 6, - 1, 1, 3, 1, 5, 2, 18, 6, 4, 2, 1, 5, 3, 2, 5, 3, 1, 15, 4, 2, 1, 1, 3, 3, 4, 2, 2, 12, 5, 4, 2, 21, 7, 2, 3, 7, 5, 2, 3, 3, 2, - 15, 8, 2, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 101,6, 5, 16, 9, 7, 2, 2, 2, 6, 7, 25, 5, 3, 7, 6, 6, 2, 3, 8, 3, 15, 1, 7, 7, 11, - 1, 1, 1, 3, 49, 4, 3, 4, 28, 17, 14, 14, 7, 5, 1, 1, 4, 8, 4, 4, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 169,18, 9, 3, 4, 4, 2, 7, 4, - 3, 18, 2, 2, 2, 3, 4, 82, 23, 2, 2, 4, 1, 1, 1, 2, 26, 11, 8, 6, 3, 2, 1, 1, 6, 6, 1, 9, 6, 6, 2, 2, 2, 2, 2, 4, 4, 10, 4, 2, 7, - 8, 2, 5, 5, 51, 4, 3, 2, 5, 2, 5, 4, 7, 5, 10, 4, 4, 1, 3, 3, 88, 53, 4, 4, 3, 2, 2, 4, 3, 2, 1, 7, 3, 3, 4, 1, 1, 7, 4, 8, 5, - 2, 4, 3, 3, 3, 3, 9, 3, 4, 5, 4, 6, 2, 4, 3, 2, 46, 8, 3, 3, 3, 2, 8, 3, 2, 2, 11, 3, 2, 3, 79, 3, 4, 4, 5, 3, 5, 22, 9, 4, 4, - 4, 20, 7, 3, 3, 5, 4, 3, 1, 1, 1, 4, 2, 1, 5, 2, 6, 2, 2, 38, 2, 2, 1, 2, 22, 5, 4, 3, 3, 3, 6, 3, 2, 1, 1, 1, 1, 1, 1, 8, 10, - 9, 6, 3, 3, 1, 1, 8, 20, 8, 5, 3, 4, 3, 2, 40, 3, 4, 3, 7, 15, 10, 8, 5, 2, 52, 7, 12, 4, 14, 14, 2, 5, 4, 32, 2, 2, 15, 9, 1, 1, 1, - 1, 1, 1, 3, 3, 8, 2, 2, 5, 12, 5, 2, 9, 6, 5, 58, 11, 7, 6, 4, 3, 3, 6, 5, 2, 29, 5, 5, 19, 5, 3, 2, 12, 7, 5, 2, 1, 245,19, 5, 2, - 2, 3, 14, 6, 2, 52, 17, 8, 3, 15, 2, 2, 11, 3, 3, 2, 22, 2, 2, 3, 3, 12, 5, 1, 1, 1, 2, 1, 1, 13, 2, 5, 3, 2, 4, 4, 2, 16, 6, 5, 3, - 12, 1, 1, 2, 2, 2, 3, 24, 3, 3, 2, 5, 2, 2, 2, 32, 5, 5, 9, 1, 6, 8, 4, 3, 3, 7, 3, 2, 4, 3, 2, 2, 2, 2, 17, 2, 8, 61, 10, 2, 5, - 4, 3, 3, 14, 6, 5, 3, 3, 8, 6, 6, 2, 2, 4, 10, 3, 1, 11, 10, 4, 6, 4, 12, 4, 3, 11, 1, 1, 8, 2, 2, 42, 4, 9, 6, 2, 2, 3, 6, 3, 2, - 2, 1, 1, 2, 9, 3, 1, 1, 2, 2, 17, 4, 6, 28, 5, 15, 14, 6, 4, 1, 3, 10, 1, 1, 37, 3, 28, 6, 4, 3, 4, 4, 18, 8, 3, 2, 14, 4, 2, 4, 5, - 5, 142,3, 7, 3, 3, 4, 2, 2, 11, 2, 4, 2, 2, 1, 1, 4, 3, 10, 4, 1, 1, 11, 4, 3, 3, 3, 2, 15, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 1, - 1, 1, 1, 1, 1, 2, 2, 1, 1, 52, 10, 17, 5, 4, 4, 7, 3, 2, 2, 2, 15, 4, 6, 2, 15, 5, 3, 2, 3, 1, 1, 239,73, 7, 7, 7, 7, 3, 1, 1, 29, - 2, 11, 4, 4, 4, 4, 4, 3, 3, 3, 8, 2, 2, 6, 6, 6, 6, 4, 4, 1, 1, 8, 8, 5, 5, 6, 5, 5, 3, 4, 1, 1, 2, 3, 2, 1, 1, 26, 3, 1, 12, - 11, 5, 3, 1, 1, 43, 4, 1, 1, 1, 1, 1, 2, 4, 3, 20, 16, 6, 3, 3, 3, 2, 1, 1, 2, 1, 7, 7, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 9, 2, - 2, 2, 7, 1, 36, 6, 6, 1, 1, 1, 1, 26, 2, 11, 10, 9, 7, 5, 5, 5, 3, 1, 6, 2, 18, 7, 4, 3, 4, 11, 3, 3, 17, 4, 2, 5, 4, 3, 2, 1, 1, - 1, 1, 1, 6, 2, 2, 14, 13, 12, 8, 6, 24, 1, 2, 15, 14, 5, 5, 3, 2, 3, 18, 2, 2, 1, 10, 4, 2, 2, 3, 1, 1, 10, 4, 2, 3, 1, 7, 2, 3, 2, - 1, 23, 7, 5, 4, 1, 3, 3, 3, 1, 2, 10, 4, 2, 4, 2, 2, 1, 4, 2, 123,58, 33, 31, 2, 18, 2, 5, 3, 2, 2, 37, 5, 29, 2, 5, 6, 6, 2, 4, 15, - 4, 3, 1, 1, 1, 1, 1, 1, 3, 3, 6, 3, 40, 1, 21, 6, 12, 2, 3, 6, 5, 2, 2, 1, 80, 80, 4, 1, 3, 1, 9, 5, 4, 2, 2, 2, 10, 1, 6, 2, 2, - 2, 2, 2, 2, 2, 1, 3, 1, 1, 1, 2, 2, 3, 2, 2, 1, 1, 1, 3, 2, 5, 1, 1, 1, 5, 1, 1, 1, 2, 2, 2, 2, 7, 3, 1, 3, 3, 2, 2, 2, 3, - 14, 1, 1, 1, 5, 5, 5, 2, 1, 1, 3, 2, 2, 3, 3, 105,2, 2, 2, 33, 3, 5, 4, 23, 22, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 3, 3, 3, 3, 3, - 2, 3, 3, 3, 8, 6, 3, 7, 1, 5, 4, 2, 2, 10, 2, 2, 2, 2, 6, 3, 1, 9, 3, 2, 4, 52, 4, 3, 1, 1, 3, 2, 2, 1, 1, 12, 3, 1, 3, 1, 3, - 15, 2, 4, 1, 3, 10, 3, 2, 2, 4, 2, 50, 2, 2, 3, 10, 10, 3, 3, 7, 5, 3, 3, 6, 4, 11, 11, 8, 8, 5, 3, 35, 23, 5, 4, 2, 2, 12, 2, 4, 3, - 3, 2, 4, 4, 3, 106,10, 51, 10, 8, 3, 5, 4, 7, 5, 4, 4, 7, 3, 5, 12, 5, 4, 3, 2, 10, 7, 26, 2, 2, 13, 5, 2, 3, 14, 2, 2, 5, 3, 15, 6, - 3, 3, 29, 2, 4, 2, 6, 4, 6, 1, 2, 2, 7, 2, 5, 41, 4, 3, 25, 17, 5, 11, 8, 2, 3, 25, 6, 4, 3, 4, 3, 1, 139,13, 4, 6, 2, 38, 3, 11, 3, - 5, 5, 16, 1, 1, 2, 2, 3, 2, 48, 4, 4, 6, 7, 8, 8, 3, 5, 2, 8, 3, 9, 4, 2, 5, 5, 18, 3, 7, 2, 1, 1, 1, 1, 7, 3, 3, 6, 2, 4, 2, - 2, 5, 4, 3, 3, 29, 4, 5, 10, 1, 1, 6, 5, 28, 3, 1, 1, 1, 1, 10, 3, 2, 16, 5, 8, 4, 2, 27, 3, 7, 3, 2, 2, 3, 1, 1, 1, 55, 1, 3, 4, - 2, 2, 2, 3, 2, 5, 3, 3, 19, 9, 8, 3, 5, 3, 1, 2, 17, 4, 2, 4, 3, 2, 4, 2, 2, 79, 6, 5, 5, 5, 3, 3, 11, 2, 5, 23, 8, 5, 8, 3, 3, - 17, 2, 10, 8, 8, 3, 2, 2, 13, 3, 3, 36, 3, 14, 1, 2, 3, 3, 3, 2, 1, 2, 14, 6, 23, 8, 4, 5, 2, 11, 2, 4, 3, 3, 3, 20, 5, 16, 3, 9, 5, - 2, 1, 4, 3, 2, 9, 2, 1, 2, 2, 2, 2, 110,42, 9, 4, 3, 3, 5, 2, 3, 6, 3, 3, 7, 5, 2, 3, 2, 9, 4, 11, 3, 3, 3, 3, 2, 3, 8, 4, 3, - 3, 3, 8, 5, 2, 4, 2, 1, 1, 3, 3, 15, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 4, 4, 4, 4, 4, 3, 31, 9, 3, 3, 3, 4, - 4, 3, 2, 3, 1, 2, 2, 2, 2, 9, 2, 2, 7, 1, 1, 1, 4, 2, 2, 1, 1, 1, 1, 1, 7, 3, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 19, 4, 11, 2, 2, - 1, 8, 5, 4, 2, 2, 2, 2, 1, 30, 12, 3, 3, 2, 2, 3, 3, 3, 2, 2, 20, 6, 2, 2, 2, 2, 2, 2, 3, 6, 2, 2, 2, 4, 4, 4, 4, 4, 2, 2, 11, - 3, 4, 3, 7, 1, 4, 3, 3, 6, 5, 2, 3, 5, 3, 3, 3, 4, 2, 2, 1, 1, 1, 1, 1, 13, 3, 8, 5, 5, 5, 5, 5, 5, 5, 48, 5, 1, 17, 3, 5, 5, - 6, 4, 3, 2, 2, 2, 3, 3, 2, 4, 3, 2, 7, 44, 6, 5, 4, 6, 6, 5, 2, 2, 14, 3, 1, 6, 3, 7, 11, 5, 5, 5, 5, 5, 5, 4, 4, 4, 2, 117,4, - 2, 16, 16, 8, 5, 2, 11, 5, 3, 2, 6, 7, 3, 3, 3, 3, 3, 3, 3, 11, 3, 2, 5, 1, 1, 17, 4, 4, 2, 1, 9, 2, 2, 26, 3, 12, 5, 4, 4, 2, 2, - 4, 2, 2, 3, 3, 10, 2, 3, 2, 2, 19, 6, 29, 23, 3, 2, 2, 2, 5, 3, 2, 2, 2, 2, 3, 2, 1, 1, 1, 27, 6, 3, 3, 2, 1, 5, 2, 6, 3, 9, 1, - 1, 1, 4, 2, 1, 1, 1, 6, 1, 2, 1, 20, 8, 5, 4, 2, 2, 1, 1, 1, 1, 2, 24, 1, 1, 1, 1, 1, 2, 10, 7, 6, 4, 4, 1, 2, 1, 8, 2, 2, 2, - 3, 2, 1, 18, 2, 1, 1, 4, 5, 1, 35, 4, 3, 3, 18, 17, 11, 2, 2, 40, 4, 2, 5, 2, 2, 9, 3, 2, 16, 2, 4, 4, 4, 3, 1, 1, 1, 1, 1, 1, 3, - 1, 1, 119,7, 1, 3, 2, 1, 1, 58, 13, 32, 9, 9, 19, 13, 8, 8, 6, 2, 20, 3, 1, 3, 3, 17, 15, 10, 2, 2, 2, 34, 6, 2, 3, 5, 3, 4, 4, 5, 13, - 1, 8, 3, 30, 7, 2, 2, 4, 2, 3, 2, 3, 2, 2, 4, 63, 27, 3, 2, 10, 7, 4, 3, 4, 5, 7, 3, 2, 2, 8, 4, 30, 3, 14, 7, 4, 4, 3, 2, 2, 11, - 4, 2, 5, 2, 1, 10, 2, 170,12, 4, 2, 20, 3, 6, 2, 3, 4, 23, 3, 10, 6, 3, 23, 17, 6, 4, 5, 3, 2, 48, 15, 2, 8, 2, 3, 7, 6, 4, 11, 4, 13, - 5, 2, 2, 4, 10, 3, 2, 2, 4, 1, 1, 2, 2, 45, 1, 1, 4, 2, 9, 9, 8, 3, 2, 9, 5, 6, 3, 4, 1, 4, 1, 1, 1, 45, 2, 2, 4, 4, 3, 2, 15, - 9, 8, 5, 9, 7, 3, 3, 4, 22, 2, 2, 5, 2, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 39, 10, 5, 10, 2, 4, 7, 3, 49, 2, 1, 3, 2, 2, 7, 33, 7, 2, - 4, 3, 6, 1, 4, 4, 38, 8, 5, 2, 16, 9, 2, 2, 2, 2, 35, 8, 6, 5, 2, 8, 7, 6, 3, 53, 40, 36, 6, 3, 4, 2, 2, 2, 12, 4, 1, 4, 75, 11, 2, - 2, 2, 2, 3, 2, 2, 2, 8, 3, 5, 5, 2, 8, 5, 1, 4, 2, 4, 3, 5, 2, 2, 1, 1, 1, 1, 1, 15, 4, 2, 2, 9, 9, 6, 2, 1, 1, 1, 1, 1, 1, - 1, 11, 2, 5, 5, 1, 10, 7, 2, 34, 3, 6, 2, 3, 5, 12, 8, 7, 3, 200,45, 1, 10, 5, 2, 8, 3, 15, 5, 4, 2, 3, 1, 2, 72, 3, 2, 1, 1, 5, 3, - 2, 4, 1, 3, 2, 2, 8, 5, 4, 2, 3, 3, 3, 3, 1, 1, 15, 2, 7, 3, 11, 1, 1, 1, 2, 3, 2, 2, 2, 4, 1, 1, 6, 6, 5, 4, 3, 4, 14, 2, 6, - 3, 2, 4, 2, 1, 16, 1, 1, 7, 4, 6, 2, 1, 4, 1, 7, 4, 2, 3, 3, 2, 3, 4, 7, 6, 6, 6, 6, 5, 143,8, 6, 7, 2, 1, 3, 6, 4, 8, 2, 2, - 43, 4, 3, 7, 3, 5, 5, 3, 2, 2, 9, 4, 2, 3, 2, 1, 3, 30, 2, 2, 12, 3, 3, 18, 1, 1, 13, 9, 1, 1, 18, 5, 5, 5, 4, 2, 2, 69, 6, 6, 13, - 4, 5, 3, 11, 4, 2, 4, 3, 5, 8, 4, 5, 4, 4, 20, 5, 8, 3, 3, 3, 2, 1, 2, 60, 2, 2, 2, 3, 13, 3, 9, 3, 7, 7, 3, 42, 22, 18, 3, 1, 1, - 4, 12, 9, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 3, 38, 4, 2, 1, 4, 6, 10, 2, 2, 2, 5, 13, 5, 3, 3, 8, 3, 2, 12, 7, 7, 6, 3, 27, 4, 3, 9, - 5, 26, 24, 6, 7, 3, 7, 2, 2, 1, 1, 42, 4, 3, 7, 2, 24, 2, 16, 5, 4, 6, 3, 11, 4, 44, 9, 5, 1, 1, 10, 3, 3, 12, 3, 6, 4, 131,4, 5, 1, - 20, 5, 3, 2, 4, 3, 9, 1, 3, 14, 2, 4, 10, 3, 5, 1, 10, 6, 4, 4, 7, 7, 4, 3, 3, 23, 3, 2, 2, 6, 4, 2, 19, 4, 2, 2, 5, 2, 2, 1, 1, - 2, 158,10, 1, 1, 2, 3, 3, 3, 3, 9, 1, 33, 1, 1, 2, 2, 2, 27, 26, 7, 6, 5, 5, 2, 2, 4, 5, 3, 22, 5, 3, 3, 10, 8, 8, 48, 2, 2, 2, 34, - 5, 9, 3, 6, 6, 5, 3, 5, 3, 3, 3, 3, 21, 7, 3, 3, 4, 2, 2, 4, 2, 118,23, 2, 8, 3, 3, 6, 30, 22, 11, 10, 9, 3, 1, 17, 3, 8, 26, 12, 6, - 2, 4, 2, 2, 14, 10, 3, 2, 29, 3, 9, 15, 9, 1, 2, 24, 7, 4, 4, 2, 1, 8, 3, 19, 7, 4, 3, 29, 8, 2, 2, 2, 5, 3, 1, 1, 1, 7, 4, 5, 3, - 17, 1, 1, 3, 1, 1, 1, 1, 60, 8, 9, 2, 3, 3, 3, 1, 2, 1, 4, 1, 1, 2, 3, 1, 3, 9, 2, 4, 2, 2, 6, 2, 23, 1, 2, 1, 1, 2, 2, 2, 3, - 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 2, 1, 1, 1, 1, 16, 1, 2, 2, 1, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 2, 1, 1, 9, 2, - 1, 2, 1, 2, 2, 42, 5, 5, 1, 1, 13, 5, 3, 2, 3, 17, 9, 3, 2, 4, 3, 3, 41, 3, 2, 2, 2, 11, 2, 1, 1, 1, 1, 5, 5, 2, 3, 7, 3, 3, 1, - 24, 5, 5, 4, 4, 2, 2, 1, 5, 3, 3, 1, 1, 3, 3, 2, 2, 23, 20, 2, 8, 6, 3, 1, 33, 2, 15, 5, 3, 3, 3, 4, 4, 3, 2, 2, 27, 10, 2, 5, 5, - 4, 3, 2, 2, 2, 10, 3, 2, 2, 2, 2, 2, 2, 9, 3, 1, 1, 1, 1, 10, 4, 3, 2, 3, 3, 13, 2, 4, 1, 1, 205,8, 3, 3, 4, 2, 10, 5, 4, 2, 2, - 6, 3, 2, 8, 4, 3, 5, 7, 3, 53, 12, 4, 2, 16, 9, 2, 2, 21, 3, 11, 3, 3, 2, 2, 8, 2, 3, 77, 75, 1, 1, 8, 1, 1, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 1, 1, 4, 2, 1, 2, 2, 6, 3, 2, 2, 2, 4, 3, 2, 2, 2, 2, 1, 30, 4, 21, 2, 1, 9, 8, 4, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 5, - 2, 5, 1, 1, 1, 2, 1, 1, 1, 8, 3, 3, 2, 32, 9, 2, 11, 4, 3, 3, 144,5, 21, 14, 28, 4, 6, 3, 1, 6, 3, 2, 2, 2, 5, 7, 19, 8, 7, 7, 3, - 5, 11, 4, 3, 17, 5, 2, 2, 5, 5, 5, 8, 3, 1, 1, 1, 4, 3, 5, 4, 3, 155,33, 3, 2, 7, 3, 1, 2, 4, 3, 4, 1, 2, 10, 5, 3, 4, 3, 3, 3, - 17, 10, 9, 4, 4, 8, 3, 1, 1, 1, 1, 3, 9, 2, 4, 4, 3, 4, 11, 11, 6, 24, 5, 3, 10, 4, 3, 2, 1, 1, 1, 1, 6, 2, 2, 8, 3, 2, 5, 2, 3, - 220,8, 2, 33, 10, 5, 4, 7, 2, 1, 1, 4, 6, 2, 4, 4, 2, 1, 1, 1, 1, 14, 1, 4, 13, 2, 2, 3, 45, 31, 1, 4, 8, 7, 3, 1, 1, 1, 1, 5, 1, - 1, 3, 3, 22, 10, 6, 2, 1, 3, 3, 3, 2, 3, 2, 1, 21, 10, 6, 1, 1, 5, 1, 45, 29, 3, 18, 17, 4, 3, 5, 3, 3, 2, 2, 77, 19, 2, 3, 3, 3, 1, - 1, 1, 2, 4, 13, 4, 2, 3, 3, 2, 2, 10, 5, 2, 4, 3, 2, 2, 1, 1, 1, 11, 1, 2, 6, 5, 4, 1, 1, 1, 1, 1, 1, 1, 6, 2, 18, 6, 4, 4, 4, - 4, 3, 5, 4, 1, 1, 7, 5, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 226,2, 3, 7, 2, 2, 1, 8, 4, 2, 15, 5, 3, 3, 8, 1, 1, 1, 1, 1, - 1, 6, 11, 3, 2, 4, 3, 2, 3, 9, 2, 1, 3, 2, 1, 1, 1, 1, 1, 1, 1, 10, 1, 5, 1, 1, 3, 2, 2, 17, 4, 3, 2, 7, 6, 1, 1, 1, 1, 3, 13, - 4, 2, 4, 1, 1, 1, 1, 2, 1, 1, 10, 3, 2, 2, 2, 2, 7, 4, 4, 4, 2, 2, 30, 2, 4, 6, 3, 3, 1, 1, 6, 3, 40, 2, 3, 6, 1, 5, 1, 3, 3, - 3, 21, 9, 9, 5, 10, 5, 2, 15, 9, 4, 2, 4, 2, 2, 2, 2, 2, 2, 1, 1, 8, 3, 1, 1, 1, 7, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 10, 33, 6, 3, 2, 1, 3, 6, 8, 1, 2, 38, 3, 2, 3, 12, 2, 1, 1, 2, 1, 6, 5, 5, 4, 3, 3, 2, 3, 1, 1, 49, 4, 15, 2, 4, 3, 2, - 13, 4, 1, 4, 2, 2, 11, 3, 3, 11, 2, 6, 2, 65, 23, 1, 1, 1, 1, 5, 5, 13, 5, 2, 2, 2, 4, 2, 5, 2, 3, 2, 1, 6, 2, 28, 8, 3, 4, 2, 3, - 3, 2, 39, 3, 8, 4, 3, 1, 7, 2, 4, 4, 16, 7, 3, 2, 3, 41, 22, 1, 5, 2, 2, 3, 4, 3, 5, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 25, 3, 3, - 2, 4, 3, 6, 2, 1, 57, 10, 2, 3, 7, 2, 1, 1, 14, 2, 5, 8, 2, 2, 1, 99, 5, 9, 10, 3, 3, 3, 5, 3, 6, 4, 11, 4, 5, 20, 3, 1, 2, 2, 2, - 2, 2, 5, 2, 1, 1, 1, 1, 4, 2, 4, 2, 15, 2, 1, 1, 1, 1, 2, 1, 3, 2, 2, 2, 2, 2, 9, 4, 46, 4, 4, 3, 3, 2, 2, 4, 3, 3, 2, 11, 9, - 6, 10, 3, 1, 1, 3, 5, 1, 1, 1, 3, 2, 116,16, 2, 2, 1, 1, 1, 4, 4, 4, 14, 8, 8, 6, 5, 1, 1, 12, 3, 3, 7, 3, 3, 3, 7, 3, 2, 3, 1, - 5, 2, 24, 12, 1, 1, 11, 9, 1, 11, 8, 7, 4, 3, 104,6, 4, 15, 12, 11, 2, 3, 10, 3, 2, 8, 3, 8, 3, 2, 5, 2, 14, 4, 3, 3, 25, 4, 2, 5, 10, - 6, 4, 3, 3, 3, 2, 155,43, 3, 2, 18, 4, 8, 2, 2, 12, 8, 5, 3, 3, 1, 7, 3, 20, 16, 12, 3, 33, 23, 23, 18, 18, 11, 6, 2, 1, 1, 1, 1, 6, 3, - 4, 1, 1, 6, 4, 6, 27, 26, 17, 15, 9, 7, 5, 1, 2, 48, 1, 1, 1, 11, 1, 8, 7, 5, 9, 2, 2, 8, 5, 4, 1, 7, 7, 4, 2, 75, 28, 4, 15, 4, 3, - 7, 4, 11, 3, 22, 12, 12, 10, 2, 7, 3, 3, 3, 2, 2, 4, 12, 5, 3, 2, 17, 8, 3, 1, 1, 1, 30, 15, 14, 1, 6, 4, 3, 2, 7, 1, 3, 2, 17, 3, 1, - 1, 1, 1, 1, 1, 3, 1, 6, 1, 3, 21, 2, 9, 1, 1, 6, 5, 5, 4, 1, 1, 1, 1, 1, 1, 2, 10, 1, 3, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 52, 3, 13, 5, 3, 2, 2, 2, 2, 3, 3, 3, 3, 12, 2, 1, 1, 4, 6, 2, 23, 2, 6, 2, 1, 2, 2, 2, 3, 3, 5, 1, 1, 1, 1, 1, - 1, 4, 2, 43, 2, 8, 8, 8, 6, 6, 3, 12, 3, 2, 2, 11, 11, 3, 3, 3, 3, 1, 1, 2, 2, 2, 2, 26, 3, 1, 1, 1, 7, 5, 4, 4, 4, 4, 3, 1, 2, - 4, 1, 57, 27, 1, 1, 2, 2, 1, 1, 5, 8, 8, 3, 9, 2, 4, 3, 5, 7, 1, 3, 2, 2, 62, 11, 9, 6, 4, 1, 1, 1, 1, 2, 13, 6, 5, 7, 5, 4, 10, - 9, 21, 3, 4, 3, 7, 6, 12, 2, 1, 1, 2, 3, 74, 13, 5, 3, 3, 4, 15, 3, 1, 12, 11, 11, 6, 5, 5, 2, 10, 4, 12, 3, 2, 4, 2, 6, 2, 2, 2, 4, - 2, 7, 1, 1, 3, 2, 40, 3, 3, 18, 5, 4, 3, 3, 8, 5, 39, 8, 4, 2, 15, 3, 2, 5, 4, 4, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 3, 2, 13, 3, 3, 3, 42, 6, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 5, 3, 2, 2, 4, 3, 12, 2, 6, 6, 4, 2, - 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 3, 2, 2, 29, 4, 1, 3, 2, 8, 3, 3, 2, 5, 2, 2, 8, 2, 1, 6, 6, 43, 3, 2, 5, 5, 2, 3, 2, 8, 4, 56, - 4, 2, 2, 4, 14, 6, 2, 1, 23, 7, 4, 2, 5, 4, 3, 68, 4, 2, 4, 1, 11, 8, 8, 3, 3, 3, 1, 2, 1, 2, 1, 3, 16, 5, 4, 4, 4, 9, 7, 7, 7, - 2, 2, 5, 143,12, 4, 3, 1, 1, 1, 1, 1, 2, 9, 6, 1, 1, 2, 1, 1, 4, 3, 2, 5, 4, 3, 11, 6, 2, 3, 2, 4, 53, 3, 2, 50, 1, 1, 3, 3, 3, - 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 5, 5, 5, 4, 2, 8, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 1, 9, 4, 4, 4, 4, 3, 3, 3, 10, - 4, 4, 4, 4, 3, 3, 3, 3, 3, 9, 2, 2, 3, 2, 19, 17, 10, 9, 7, 2, 5, 3, 2, 3, 2, 51, 8, 3, 25, 17, 2, 2, 1, 1, 1, 5, 1, 1, 13, 6, 3, - 208,5, 26, 3, 7, 6, 2, 4, 3, 5, 5, 10, 3, 2, 7, 7, 3, 1, 1, 9, 4, 2, 2, 2, 2, 4, 2, 9, 5, 4, 4, 2, 2, 3, 2, 2, 14, 4, 2, 4, 2, - 16, 6, 2, 5, 4, 3, 6, 4, 3, 2, 13, 7, 7, 7, 5, 4, 1, 1, 1, 1, 1, 1, 2, 2, 49, 1, 3, 3, 3, 3, 1, 3, 2, 2, 2, 3, 3, 1, 1, 5, 4, - 4, 4, 6, 3, 2, 6, 2, 3, 11, 8, 4, 3, 3, 2, 1, 7, 6, 6, 5, 2, 2, 2, 10, 5, 3, 11, 2, 3, 2, 4, 2, 1, 1, 23, 1, 1, 1, 1, 1, 3, 2, - 1, 1, 1, 3, 2, 2, 1, 2, 1, 1, 7, 37, 1, 10, 1, 1, 1, 2, 1, 2, 1, 3, 2, 5, 11, 4, 5, 24, 5, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, - 1, 1, 1, 1, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 16, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, - 18, 6, 4, 2, 1, 7, 4, 199,10, 6, 4, 4, 3, 25, 2, 2, 2, 1, 2, 2, 4, 2, 3, 2, 26, 5, 3, 16, 15, 5, 4, 61, 5, 4, 3, 2, 1, 1, 1, 1, 14, - 7, 1, 2, 4, 15, 3, 6, 9, 8, 4, 1, 2, 66, 1, 49, 17, 4, 4, 19, 5, 5, 4, 3, 4, 4, 2, 3, 5, 4, 3, 1, 2, 9, 4, 2, 97, 6, 2, 22, 3, 3, - 3, 13, 11, 2, 2, 4, 1, 1, 1, 1, 4, 3, 3, 3, 2, 3, 6, 16, 3, 3, 4, 7, 4, 6, 2, 6, 1, 9, 1, 1, 8, 1, 4, 3, 3, 3, 5, 3, 3, 1, 1, - 1, 2, 2, 5, 1, 1, 2, 81, 7, 5, 4, 11, 4, 6, 53, 2, 1, 47, 5, 2, 2, 2, 3, 1, 3, 3, 4, 2, 4, 3, 2, 6, 6, 5, 5, 2, 2, 7, 1, 5, 4, - 1, 13, 4, 2, 5, 5, 2, 2, 3, 1, 82, 6, 10, 1, 16, 12, 7, 15, 9, 2, 2, 28, 19, 15, 4, 4, 2, 4, 3, 2, 25, 3, 1, 3, 6, 26, 2, 1, 4, 2, 2, - 2, 3, 4, 3, 50, 1, 1, 1, 1, 13, 5, 4, 8, 7, 4, 3, 5, 5, 4, 4, 4, 3, 5, 3, 19, 2, 1, 13, 2, 12, 2, 3, 3, 1, 4, 4, 4, 3, 53, 3, 1, - 1, 18, 14, 2, 3, 2, 3, 1, 11, 5, 3, 1, 1, 2, 4, 2, 1, 1, 1, 3, 51, 3, 3, 5, 1, 3, 17, 4, 4, 9, 1, 1, 1, 1, 3, 1, 1, 5, 2, 2, 2, - 7, 1, 6, 2, 2, 16, 4, 10, 8, 1, 12, 6, 4, 2, 2, 1, 1, 1, 20, 1, 1, 2, 1, 3, 1, 3, 1, 2, 1, 2, 2, 2, 1, 5, 1, 4, 10, 1, 1, 2, 1, - 4, 3, 3, 2, 1, 11, 10, 2, 3, 1, 37, 3, 5, 4, 3, 13, 10, 3, 7, 5, 4, 3, 5, 24, 3, 4, 5, 2, 3, 4, 4, 21, 3, 4, 2, 1, 4, 19, 7, 2, 2, - 3, 3, 10, 2, 2, 2, 20, 4, 4, 4, 5, 4, 6, 1, 1, 3, 2, 17, 3, 2, 6, 4, 49, 44, 43, 4, 4, 2, 11, 3, 3, 9, 2, 3, 3, 2, 2, 1, 1, 1, 5, - 47, 7, 6, 6, 9, 5, 5, 5, 10, 5, 2, 5, 2, 1, 40, 11, 4, 3, 5, 3, 2, 2, 16, 14, 11, 3, 77, 6, 1, 1, 1, 3, 9, 1, 1, 1, 7, 4, 3, 1, 1, - 1, 1, 1, 1, 3, 3, 3, 3, 3, 5, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 3, 1, 1, 3, 1, 2, 3, 1, 1, 1, 2, 2, 2, 2, 1, 6, 3, 2, - 1, 1, 3, 2, 7, 1, 1, 2, 3, 3, 1, 1, 1, 1, 4, 3, 1, 2, 7, 3, 1, 2, 2, 2, 1, 2, 2, 1, 3, 1, 2, 40, 4, 4, 11, 4, 1, 1, 1, 7, 6, - 5, 4, 3, 7, 2, 7, 5, 4, 3, 1, 8, 2, 1, 1, 1, 8, 4, 3, 7, 3, 47, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 9, 4, 3, 1, 3, 6, - 6, 4, 3, 4, 2, 4, 1, 1, 12, 4, 1, 1, 1, 2, 5, 2, 9, 5, 7, 3, 33, 27, 13, 7, 11, 5, 2, 16, 3, 7, 1, 15, 1, 1, 6, 3, 3, 3, 73, 4, 66, - 1, 6, 1, 1, 3, 2, 2, 3, 2, 7, 2, 2, 11, 4, 4, 4, 2, 2, 6, 4, 2, 3, 3, 5, 5, 4, 3, 1, 11, 3, 5, 5, 4, 2, 10, 2, 5, 3, 1, 53, 4, - 2, 2, 12, 2, 2, 1, 2, 2, 2, 2, 1, 2, 1, 2, 1, 1, 3, 12, 2, 2, 8, 3, 116,4, 2, 19, 4, 7, 4, 1, 1, 1, 1, 10, 3, 3, 2, 17, 2, 3, 6, - 6, 5, 1, 1, 2, 2, 22, 7, 5, 2, 2, 2, 10, 2, 1, 4, 4, 4, 3, 2, 13, 5, 4, 4, 3, 3, 2, 2, 1, 1, 2, 2, 28, 2, 1, 1, 3, 1, 4, 8, 5, - 5, 5, 81, 15, 3, 2, 3, 28, 19, 5, 3, 7, 5, 5, 4, 3, 1, 1, 1, 2, 1, 19, 5, 4, 4, 14, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 4, 1, 1, 2, 38, 1, 12, 3, 5, 6, 2, 6, 2, 2, 1, 2, 1, 1, 1, 2, 8, 7, 2, 3, 4, 1, 2, 1, 4, 1, 1, 11, 2, 1, 1, 1, 1, 3, - 2, 17, 1, 4, 1, 1, 2, 2, 2, 2, 2, 2, 4, 4, 2, 2, 2, 2, 2, 1, 1, 1, 2, 8, 1, 1, 1, 1, 5, 7, 4, 35, 3, 3, 2, 8, 2, 3, 3, 21, 19, - 4, 12, 2, 3, 3, 1, 1, 1, 14, 5, 2, 6, 2, 2, 2, 10, 5, 4, 3, 8, 5, 5, 5, 3, 3, 2, 6, 4, 14, 2, 9, 1, 6, 46, 4, 2, 21, 15, 15, 2, 1, - 11, 10, 4, 3, 5, 3, 3, 3, 2, 42, 5, 2, 2, 4, 2, 7, 2, 7, 4, 2, 2, 4, 3, 3, 2, 37, 3, 1, 1, 3, 2, 2, 5, 9, 7, 1, 5, 14, 2, 1, 5, - 2, 2, 41, 3, 5, 2, 7, 7, 5, 5, 5, 4, 6, 8, 2, 2, 1, 1, 3, 2, 2, 1, 2, 2, 2, 5, 1, 10, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 86, 11, 3, - 1, 1, 1, 1, 1, 2, 3, 4, 4, 2, 5, 1, 2, 6, 3, 4, 4, 1, 1, 1, 1, 3, 8, 8, 2, 5, 5, 2, 2, 2, 2, 2, 3, 9, 2, 1, 1, 2, 1, 3, 3, - 3, 3, 1, 1, 1, 69, 5, 2, 2, 2, 8, 3, 1, 1, 4, 4, 3, 11, 2, 5, 3, 2, 1, 1, 1, 4, 2, 2, 4, 9, 6, 1, 2, 2, 1, 1, 4, 3, 2, 2, 1, - 4, 3, 4, 4, 3, 1, 1, 7, 3, 2, 1, 1, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 54, 28, 2, 6, 2, 3, - 7, 4, 3, 2, 1, 5, 3, 13, 3, 2, 2, 18, 2, 2, 2, 6, 3, 2, 1, 2, 1, 1, 1, 74, 3, 3, 3, 3, 4, 51, 3, 2, 3, 1, 1, 1, 1, 1, 7, 2, 2, - 3, 2, 1, 1, 1, 1, 10, 3, 3, 8, 2, 2, 1, 8, 6, 2, 2, 2, 1, 1, 3, 1, 1, 2, 2, 12, 3, 3, 16, 16, 16, 16, 11, 3, 6, 32, 7, 2, 21, 9, 5, - 5, 4, 4, 4, 2, 3, 1, 10, 3, 3, 23, 6, 3, 3, 7, 6, 3, 55, 11, 4, 4, 7, 7, 2, 24, 16, 16, 10, 5, 8, 8, 6, 3, 3, 3, 16, 5, 5, 5, 5, 5, - 6, 6, 6, 6, 7, 5, 5, 2, 4, 3, 3, 3, 171,1, 1, 1, 1, 1, 16, 4, 2, 2, 4, 2, 2, 43, 6, 5, 5, 5, 4, 3, 1, 1, 1, 7, 5, 5, 5, 5, 3, - 3, 3, 2, 23, 4, 4, 12, 6, 4, 7, 4, 3, 24, 18, 18, 1, 3, 4, 3, 2, 2, 2, 2, 1, 20, 4, 1, 1, 4, 4, 1, 1, 3, 1, 3, 1, 10, 5, 2, 1, 3, - 1, 1, 9, 8, 4, 36, 15, 3, 3, 3, 7, 16, 11, 10, 9, 1, 1, 1, 1, 4, 4, 4, 4, 3, 1, 1, 118,7, 15, 1, 1, 1, 4, 31, 1, 2, 3, 6, 3, 4, 3, - 3, 3, 1, 1, 2, 16, 3, 3, 1, 2, 3, 28, 5, 9, 3, 7, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 2, 2, 2, 49, 3, 1, 1, 1, 1, 4, 2, 1, 10, 5, 3, - 1, 1, 1, 3, 2, 7, 3, 2, 2, 2, 2, 1, 2, 4, 1, 3, 10, 1, 1, 8, 4, 3, 2, 4, 2, 2, 101,4, 1, 2, 2, 77, 27, 18, 4, 2, 2, 5, 3, 8, 20, - 17, 7, 10, 7, 4, 5, 3, 2, 14, 4, 3, 3, 3, 2, 4, 3, 2, 3, 4, 3, 2, 69, 16, 5, 2, 2, 3, 2, 1, 2, 2, 5, 3, 8, 1, 4, 10, 7, 3, 2, 2, - 6, 2, 1, 7, 2, 2, 1, 1, 1, 93, 18, 6, 4, 2, 2, 5, 3, 7, 6, 5, 4, 3, 2, 4, 4, 3, 3, 20, 2, 7, 4, 1, 1, 2, 2, 3, 13, 4, 2, 3, 5, - 3, 2, 2, 6, 2, 2, 4, 3, 32, 1, 14, 4, 3, 6, 3, 1, 1, 1, 4, 15, 6, 5, 3, 3, 104,22, 1, 4, 4, 4, 19, 4, 1, 1, 2, 1, 4, 3, 1, 3, 2, - 2, 1, 12, 1, 6, 3, 2, 1, 3, 2, 2, 3, 13, 4, 4, 2, 1, 1, 5, 3, 4, 3, 3, 3, 3, 15, 4, 4, 1, 34, 5, 1, 1, 5, 3, 4, 4, 2, 2, 4, 1, - 1, 1, 1, 1, 46, 3, 3, 9, 5, 2, 3, 2, 2, 2, 2, 3, 2, 8, 2, 2, 2, 2, 2, 64, 5, 3, 7, 5, 4, 3, 1, 1, 3, 2, 2, 1, 1, 5, 5, 2, 2, - 8, 2, 1, 1, 12, 2, 3, 2, 1, 1, 1, 1, 3, 2, 2, 3, 2, 10, 7, 6, 3, 2, 79, 13, 5, 5, 4, 4, 5, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, - 5, 4, 4, 7, 2, 49, 9, 7, 4, 27, 17, 11, 4, 4, 2, 24, 4, 1, 13, 4, 3, 2, 2, 10, 4, 3, 3, 12, 2, 1, 2, 1, 3, 12, 2, 1, 2, 3, 9, 2, 2, - 2, 5, 1, 1, 1, 6, 6, 2, 17, 14, 14, 13, 9, 2, 1, 1, 102,17, 2, 3, 7, 1, 1, 2, 25, 12, 12, 5, 4, 3, 4, 5, 1, 1, 1, 2, 2, 2, 13, 3, 4, - 3, 16, 15, 1, 1, 3, 1, 1, 4, 3, 3, 9, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 3, 2, 1, 1, 170,2, 6, 10, 7, 3, 3, 1, 1, 1, 12, 2, 1, 2, 3, - 4, 2, 48, 2, 1, 1, 1, 1, 2, 2, 3, 6, 3, 2, 3, 1, 1, 4, 7, 5, 5, 1, 2, 4, 15, 4, 2, 3, 2, 4, 2, 16, 1, 11, 2, 1, 1, 1, 3, 3, 9, - 2, 2, 2, 2, 2, 2, 2, 1, 15, 2, 4, 2, 13, 3, 3, 1, 1, 2, 2, 3, 2, 2, 2, 5, 3, 1, 3, 1, 3, 2, 2, 60, 5, 1, 2, 5, 3, 1, 1, 24, 16, - 12, 9, 5, 2, 2, 4, 4, 3, 2, 232,12, 4, 3, 2, 2, 75, 8, 3, 1, 1, 35, 2, 2, 1, 3, 2, 1, 1, 1, 1, 1, 1, 7, 2, 2, 1, 2, 28, 23, 4, 14, - 9, 5, 1, 2, 11, 3, 3, 1, 1, 4, 4, 4, 4, 4, 17, 3, 6, 4, 3, 2, 8, 1, 1, 2, 38, 8, 3, 2, 20, 7, 7, 7, 7, 6, 4, 3, 11, 7, 6, 6, 6, - 6, 6, 4, 3, 48, 2, 3, 36, 21, 14, 7, 7, 3, 4, 3, 3, 3, 8, 3, 2, 3, 5, 1, 1, 4, 2, 1, 1, 1, 60, 2, 5, 32, 25, 22, 2, 2, 8, 6, 6, 3, - 2, 21, 3, 2, 14, 9, 24, 17, 11, 11, 11, 10, 9, 6, 3, 3, 60, 9, 13, 2, 8, 3, 18, 17, 16, 5, 4, 2, 11, 5, 2, 1, 1, 1, 1, 1, 1, 45, 3, 5, 3, - 3, 2, 1, 4, 3, 3, 7, 3, 3, 5, 3, 46, 40, 35, 3, 27, 14, 10, 4, 2, 1, 1, 1, 2, 2, 78, 2, 20, 16, 16, 11, 7, 4, 3, 3, 17, 14, 14, 11, 1, 3, - 2, 3, 14, 4, 8, 5, 3, 2, 4, 2, 1, 24, 6, 5, 5, 6, 2, 10, 14, 3, 3, 3, 4, 29, 9, 6, 6, 6, 6, 3, 3, 3, 9, 4, 5, 5, 5, 2, 1, 1, 1, - 1, 34, 2, 3, 3, 2, 4, 1, 3, 2, 5, 2, 5, 2, 2, 3, 13, 10, 6, 5, 3, 2, 2, 2, 15, 2, 4, 7, 15, 2, 1, 2, 2, 62, 3, 11, 3, 3, 24, 22, 5, - 5, 6, 3, 3, 1, 7, 2, 2, 3, 1, 1, 1, 4, 5, 3, 3, 1, 1, 1, 1, 1, 1, 1, 2, 6, 4, 4, 3, 4, 2, 5, 4, 2, 14, 2, 1, 13, 4, 26, 10, 8, - 3, 2, 1, 1, 10, 10, 10, 8, 8, 2, 2, 2, 2, 10, 4, 2, 2, 17, 3, 4, 6, 17, 4, 3, 4, 3, 9, 2, 18, 5, 5, 5, 4, 3, 2, 2, 1, 12, 5, 4, 2, - 1, 20, 5, 4, 7, 4, 92, 2, 42, 9, 3, 2, 3, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 25, 3, 5, 4, 3, 3, 4, 2, 2, 2, 2, 2, 2, 4, 2, - 4, 3, 29, 6, 3, 3, 2, 16, 1, 1, 1, 3, 2, 2, 1, 3, 2, 2, 6, 7, 3, 3, 2, 2, 110,12, 1, 4, 3, 2, 7, 3, 16, 11, 2, 8, 3, 2, 2, 3, 5, - 7, 1, 1, 1, 1, 1, 4, 2, 4, 47, 6, 1, 1, 2, 16, 2, 8, 6, 2, 2, 3, 12, 4, 3, 3, 2, 4, 3, 9, 9, 9, 3, 1, 1, 1, 1, 1, 5, 3, 1, 8, - 2, 1, 4, 3, 3, 3, 6, 6, 5, 7, 7, 2, 4, 12, 2, 2, 4, 1, 10, 1, 180,1, 4, 1, 10, 2, 2, 4, 2, 2, 11, 3, 1, 5, 4, 4, 8, 6, 4, 4, 6, - 4, 15, 8, 5, 5, 3, 1, 8, 5, 4, 3, 1, 3, 28, 13, 3, 3, 6, 4, 8, 5, 4, 3, 2, 3, 3, 3, 14, 3, 3, 3, 3, 3, 3, 1, 5, 17, 8, 5, 5, 2, - 5, 4, 23, 2, 2, 2, 4, 4, 4, 2, 4, 3, 3, 2, 5, 3, 2, 2, 1, 1, 4, 3, 12, 5, 3, 3, 2, 2, 2, 2, 1, 18, 7, 4, 4, 7, 2, 1, 17, 2, 5, - 4, 15, 3, 2, 2, 8, 5, 2, 2, 2, 1, 2, 2, 2, 20, 8, 5, 2, 5, 4, 8, 2, 2, 5, 3, 1, 7, 2, 5, 4, 1, 3, 22, 8, 4, 9, 9, 3, 3, 2, 1, - 1, 1, 2, 28, 10, 12, 4, 3, 6, 3, 18, 4, 6, 7, 1, 4, 2, 1, 1, 1, 17, 2, 4, 4, 4, 6, 3, 39, 10, 6, 1, 7, 3, 3, 3, 2, 2, 12, 5, 4, 3, - 1, 1, 1, 1, 1, 1, 23, 3, 6, 5, 3, 3, 2, 4, 6, 6, 2, 15, 2, 5, 5, 5, 3, 3, 3, 3, 2, 1, 12, 3, 3, 2, 2, 2, 2, 3, 2, 1, 1, 1, 1, - 1, 1, 4, 3, 50, 1, 1, 1, 1, 4, 2, 2, 1, 1, 13, 7, 3, 2, 2, 16, 2, 6, 3, 2, 3, 51, 4, 4, 1, 1, 1, 4, 3, 2, 5, 4, 1, 1, 1, 4, 3, - 3, 3, 15, 15, 5, 6, 2, 2, 2, 2, 2, 2, 3, 2, 1, 1, 1, 1, 2, 7, 1, 3, 3, 3, 1, 1, 18, 2, 6, 2, 6, 6, 5, 4, 42, 9, 3, 2, 5, 3, 2, - 1, 1, 1, 3, 5, 2, 1, 9, 2, 3, 1, 6, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, - 1, 1, 1, 5, 2, 3, 3, 2, 2, 2, 2, 2, 1, 1, 1, 3, 3, 3, 14, 3, 4, 2, 2, 15, 3, 2, 1, 7, 112,5, 2, 14, 20, 3, 6, 2, 3, 2, 1, 26, 14, - 12, 7, 3, 30, 6, 13, 7, 2, 4, 4, 2, 1, 1, 1, 3, 3, 2, 78, 9, 2, 1, 1, 2, 20, 7, 5, 2, 3, 3, 7, 3, 3, 7, 4, 2, 2, 1, 1, 1, 1, 5, - 3, 7, 2, 2, 2, 7, 2, 14, 3, 2, 1, 4, 2, 5, 3, 53, 12, 8, 4, 1, 1, 1, 1, 17, 4, 3, 3, 11, 10, 6, 4, 5, 2, 2, 14, 4, 4, 66, 5, 7, 3, - 31, 3, 3, 3, 3, 2, 2, 17, 5, 4, 4, 5, 8, 4, 8, 4, 3, 2, 20, 3, 5, 2, 2, 1, 1, 6, 5, 5, 5, 4, 71, 8, 4, 3, 6, 6, 6, 9, 1, 7, 1, - 1, 1, 1, 2, 3, 3, 1, 5, 2, 2, 2, 2, 2, 4, 9, 2, 4, 9, 4, 3, 3, 2, 5, 4, 3, 2, 41, 3, 5, 12, 1, 2, 4, 4, 3, 8, 5, 3, 3, 3, 2, - 2, 3, 1, 1, 22, 1, 1, 7, 2, 2, 2, 7, 3, 47, 21, 1, 1, 6, 6, 5, 1, 1, 1, 8, 2, 10, 4, 4, 50, 8, 3, 18, 10, 2, 10, 2, 2, 2, 2, 4, 2, - 2, 22, 2, 12, 5, 3, 2, 9, 4, 3, 3, 2, 4, 4, 1, 1, 2, 11, 4, 34, 1, 1, 6, 5, 3, 1, 16, 5, 5, 3, 2, 3, 35, 2, 7, 4, 2, 2, 1, 2, 1, - 8, 4, 3, 2, 2, 3, 5, 3, 3, 2, 2, 1, 1, 1, 30, 5, 17, 10, 4, 4, 4, 2, 2, 5, 3, 3, 2, 40, 10, 6, 2, 1, 7, 9, 3, 5, 3, 4, 27, 1, 14, - 7, 4, 1, 1, 2, 2, 20, 5, 2, 1, 4, 2, 2, 2, 2, 1, 4, 2, 2, 1, 25, 2, 14, 2, 1, 1, 1, 3, 14, 3, 2, 4, 2, 12, 4, 1, 3, 14, 1, 4, 4, - 4, 60, 9, 4, 2, 7, 5, 15, 15, 11, 6, 12, 2, 2, 2, 4, 2, 2, 9, 3, 2, 5, 4, 1, 1, 1, 1, 1, 18, 14, 4, 5, 3, 2, 125,43, 2, 3, 2, 2, 1, - 1, 1, 2, 1, 5, 8, 1, 2, 2, 2, 1, 7, 3, 1, 4, 1, 2, 28, 2, 21, 4, 2, 3, 2, 2, 22, 3, 3, 2, 2, 8, 2, 2, 6, 3, 2, 1, 1, 3, 3, 13, - 5, 1, 3, 3, 2, 4, 4, 2, 154,5, 9, 2, 1, 7, 7, 7, 22, 7, 3, 9, 6, 9, 1, 3, 3, 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 7, 6, 6, 2, - 9, 3, 3, 3, 25, 3, 11, 4, 4, 7, 4, 4, 3, 3, 2, 2, 2, 6, 3, 9, 4, 4, 11, 6, 1, 1, 4, 1, 1, 1, 1, 17, 1, 3, 9, 9, 4, 3, 1, 1, 1, - 1, 1, 9, 1, 1, 5, 1, 4, 4, 4, 2, 3, 1, 5, 12, 4, 4, 5, 2, 24, 6, 3, 6, 5, 28, 14, 1, 1, 13, 2, 3, 3, 2, 3, 2, 6, 3, 2, 41, 2, 2, - 20, 5, 2, 6, 3, 2, 39, 11, 7, 3, 4, 6, 2, 2, 3, 29, 6, 1, 8, 9, 6, 6, 6, 5, 5, 3, 6, 18, 6, 3, 9, 3, 3, 8, 2, 2, 2, 4, 2, 33, 1, - 7, 4, 16, 4, 1, 2, 1, 1, 3, 3, 37, 10, 2, 5, 12, 3, 4, 8, 6, 28, 9, 3, 6, 1, 3, 3, 1, 1, 104,4, 10, 3, 10, 2, 1, 1, 5, 3, 2, 50, 23, - 14, 13, 11, 9, 4, 6, 6, 6, 4, 6, 7, 7, 7, 2, 3, 3, 3, 10, 13, 4, 2, 6, 2, 2, 8, 31, 11, 1, 2, 9, 5, 5, 5, 14, 4, 3, 8, 13, 7, 3, 4, - 13, 13, 9, 4, 4, 152,10, 5, 18, 1, 4, 1, 1, 1, 1, 1, 2, 4, 3, 2, 1, 1, 1, 1, 18, 12, 7, 2, 2, 2, 2, 2, 2, 2, 17, 5, 6, 5, 5, 3, 7, - 3, 3, 2, 3, 2, 2, 47, 3, 2, 36, 34, 30, 1, 1, 1, 2, 1, 54, 4, 11, 3, 3, 9, 3, 16, 14, 7, 5, 3, 5, 3, 6, 4, 1, 1, 4, 3, 2, 22, 4, 3, - 3, 2, 1, 5, 4, 19, 18, 9, 2, 30, 4, 3, 10, 8, 11, 7, 3, 3, 2, 34, 5, 4, 1, 1, 1, 4, 3, 3, 15, 7, 7, 7, 6, 1, 18, 5, 4, 4, 4, 3, 5, - 3, 9, 82, 52, 9, 7, 7, 5, 23, 7, 3, 3, 3, 6, 6, 2, 20, 6, 12, 3, 5, 2, 4, 32, 2, 12, 2, 7, 8, 4, 3, 5, 1, 89, 2, 4, 65, 2, 6, 7, 2, - 2, 2, 7, 18, 10, 4, 2, 7, 3, 9, 1, 2, 2, 71, 3, 19, 11, 11, 3, 2, 30, 3, 3, 9, 4, 13, 7, 2, 1, 1, 1, 1, 1, 6, 4, 34, 6, 6, 15, 2, 5, - 1, 4, 3, 7, 1, 1, 1, 4, 61, 1, 1, 1, 1, 1, 1, 1, 8, 2, 3, 3, 2, 8, 4, 3, 3, 6, 6, 2, 8, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 13, 3, - 2, 1, 3, 3, 1, 9, 2, 2, 9, 2, 2, 114,35, 17, 1, 1, 1, 13, 7, 4, 4, 3, 9, 4, 11, 9, 8, 2, 2, 28, 13, 3, 4, 9, 3, 5, 2, 3, 7, 4, 4, - 65, 7, 2, 1, 3, 14, 6, 3, 2, 3, 3, 2, 16, 5, 2, 5, 4, 2, 9, 6, 3, 5, 4, 3, 3, 7, 4, 4, 4, 1, 84, 9, 4, 4, 4, 9, 2, 16, 6, 5, 5, - 3, 3, 3, 3, 15, 4, 4, 4, 4, 5, 3, 3, 3, 3, 4, 3, 3, 3, 23, 4, 2, 4, 12, 2, 5, 58, 4, 8, 2, 2, 8, 1, 1, 8, 9, 7, 4, 3, 3, 3, 7, - 6, 4, 4, 29, 6, 6, 2, 10, 5, 2, 2, 1, 4, 3, 7, 2, 22, 4, 3, 3, 5, 4, 2, 2, 2, 2, 10, 6, 3, 125,9, 3, 1, 1, 5, 3, 10, 3, 2, 2, 2, - 2, 1, 9, 3, 2, 2, 44, 4, 17, 4, 4, 3, 5, 2, 12, 2, 3, 3, 2, 2, 5, 2, 16, 3, 3, 3, 3, 3, 3, 6, 1, 10, 7, 2, 15, 11, 2, 2, 5, 3, 2, - 26, 2, 1, 1, 10, 3, 3, 1, 14, 3, 2, 8, 8, 37, 4, 15, 9, 2, 5, 4, 4, 2, 5, 4, 3, 4, 3, 3, 3, 16, 3, 2, 9, 8, 8, 8, 3, 12, 6, 6, 5, - 6, 3, 2, 2, 2, 28, 4, 2, 2, 2, 2, 5, 3, 3, 9, 3, 5, 5, 5, 4, 3, 3, 59, 5, 2, 12, 5, 19, 2, 6, 3, 7, 3, 3, 12, 3, 4, 1, 1, 2, 2, - 7, 2, 25, 3, 2, 11, 6, 6, 2, 43, 16, 2, 2, 4, 5, 4, 4, 4, 4, 3, 1, 9, 3, 5, 5, 4, 4, 1, 4, 2, 6, 10, 7, 7, 6, 65, 3, 8, 4, 3, 28, - 20, 18, 5, 2, 3, 12, 12, 3, 2, 6, 5, 4, 1, 1, 1, 3, 3, 16, 1, 5, 2, 2, 45, 17, 4, 4, 4, 5, 5, 8, 1, 4, 2, 5, 2, 7, 6, 6, 6, 4, 4, - 10, 4, 1, 35, 3, 7, 5, 5, 5, 3, 2, 1, 4, 3, 4, 1, 1, 3, 3, 35, 11, 10, 10, 5, 15, 15, 10, 4, 7, 5, 5, 1, 5, 2, 2, 2, 66, 2, 6, 3, 5, - 1, 6, 3, 8, 3, 10, 10, 5, 5, 3, 3, 3, 2, 6, 1, 4, 4, 4, 10, 5, 2, 3, 3, 3, 4, 4, 4, 18, 4, 7, 5, 17, 2, 30, 10, 1, 7, 4, 4, 6, 5, - 10, 4, 4, 5, 3, 2, 3, 3, 16, 2, 1, 3, 7, 3, 2, 24, 7, 3, 3, 2, 1, 1, 3, 3, 3, 24, 18, 3, 3, 3, 3, 3, 3, 3, 14, 5, 5, 5, 9, 8, 2, - 2, 58, 3, 14, 3, 21, 3, 2, 2, 6, 11, 5, 3, 5, 95, 5, 1, 3, 3, 16, 6, 3, 1, 3, 3, 3, 3, 20, 3, 8, 7, 4, 1, 1, 1, 29, 27, 16, 9, 6, 6, - 5, 5, 3, 2, 7, 7, 23, 4, 3, 3, 2, 2, 8, 4, 4, 13, 2, 15, 4, 7, 6, 4, 2, 75, 8, 3, 13, 7, 3, 3, 2, 4, 3, 8, 1, 1, 5, 3, 8, 4, 3, - 20, 4, 4, 3, 4, 14, 2, 2, 5, 2, 3, 2, 62, 49, 5, 2, 2, 2, 11, 2, 2, 2, 24, 17, 1, 1, 6, 6, 4, 5, 2, 121,15, 2, 2, 13, 5, 23, 6, 4, 4, - 51, 5, 3, 3, 2, 3, 2, 5, 10, 5, 5, 1, 1, 2, 9, 2, 8, 3, 1, 1, 1, 1, 16, 4, 2, 5, 2, 2, 4, 52, 4, 11, 5, 26, 4, 3, 2, 2, 7, 3, 3, - 3, 3, 4, 5, 4, 3, 3, 2, 11, 8, 2, 2, 5, 2, 7, 2, 2, 11, 8, 2, 4, 82, 15, 2, 3, 3, 2, 4, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 14, 4, 4, - 4, 4, 1, 7, 5, 3, 2, 2, 3, 3, 2, 1, 1, 7, 1, 2, 2, 2, 1, 1, 19, 4, 2, 8, 6, 2, 6, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 3, 2, 2, 5, - 1, 3, 2, 1, 1, 1, 1, 102,3, 2, 4, 1, 1, 9, 4, 1, 1, 1, 1, 1, 1, 2, 1, 1, 23, 3, 15, 3, 3, 2, 1, 3, 3, 1, 1, 9, 8, 38, 5, 5, 3, - 3, 17, 14, 13, 2, 2, 3, 7, 2, 4, 4, 4, 3, 1, 1, 4, 3, 2, 2, 10, 8, 2, 7, 2, 1, 3, 50, 3, 1, 2, 1, 7, 20, 2, 1, 1, 1, 1, 13, 7, 6, - 6, 3, 3, 3, 2, 1, 1, 3, 2, 2, 6, 1, 1, 1, 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 146,1, 113,20, 5, 5, 5, 4, 4, 8, 3, - 3, 5, 5, 5, 5, 5, 4, 4, 4, 4, 2, 7, 3, 2, 2, 4, 3, 3, 3, 3, 3, 3, 23, 17, 9, 5, 2, 23, 2, 17, 11, 4, 4, 3, 19, 1, 1, 10, 9, 9, 9, - 6, 5, 3, 2, 1, 1, 1, 1, 1, 1, 6, 6, 4, 8, 7, 2, 1, 1, 1, 4, 1, 2, 147,4, 3, 21, 4, 15, 15, 11, 6, 3, 3, 1, 1, 1, 1, 1, 1, 31, 12, - 4, 1, 3, 10, 4, 4, 4, 3, 3, 3, 24, 23, 23, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 16, 1, 1, 1, 3, 3, 3, 11, 5, 5, 5, 51, 1, 49, 6, 4, 2, 11, - 9, 9, 8, 8, 2, 2, 2, 2, 2, 2, 1, 1, 1, 4, 2, 2, 1, 1, 1, 1, 3, 3, 1, 2, 2, 9, 1, 3, 3, 3, 2, 2, 2, 2, 4, 1, 1, 1, 13, 8, 5, - 4, 3, 2, 2, 2, 1, 1, 1, 12, 1, 2, 2, 44, 2, 13, 3, 4, 2, 1, 1, 1, 4, 4, 4, 4, 26, 25, 12, 5, 5, 2, 4, 11, 2, 5, 5, 5, 4, 3, 3, 3, - 3, 3, 2, 2, 2, 1, 1, 1, 1, 1, 3, 3, 3, 3, 41, 4, 2, 2, 1, 2, 13, 2, 3, 5, 1, 1, 6, 2, 2, 7, 3, 3, 1, 1, 161,1, 22, 11, 6, 2, 4, - 1, 24, 3, 3, 10, 3, 2, 2, 7, 5, 3, 5, 14, 3, 4, 2, 1, 3, 56, 3, 23, 3, 3, 8, 2, 8, 9, 7, 3, 2, 2, 4, 3, 3, 3, 9, 21, 2, 2, 5, 2, - 2, 2, 10, 8, 5, 2, 2, 9, 2, 135,1, 13, 5, 5, 4, 10, 1, 1, 2, 2, 2, 3, 3, 3, 1, 1, 3, 4, 2, 4, 4, 3, 2, 2, 48, 2, 1, 9, 6, 5, 1, - 3, 2, 1, 3, 2, 10, 3, 4, 6, 2, 1, 1, 1, 1, 1, 3, 31, 4, 4, 1, 1, 1, 1, 1, 4, 14, 3, 1, 5, 1, 3, 2, 2, 2, 3, 49, 3, 11, 4, 5, 5, - 7, 6, 6, 5, 6, 4, 3, 3, 19, 6, 3, 7, 1, 1, 3, 113,18, 3, 3, 6, 2, 4, 4, 9, 3, 2, 2, 6, 5, 4, 4, 9, 3, 2, 6, 3, 3, 3, 36, 12, 5, - 2, 5, 4, 1, 9, 4, 13, 11, 6, 2, 38, 4, 4, 4, 30, 5, 4, 4, 3, 2, 6, 4, 2, 2, 4, 230,14, 1, 1, 1, 1, 3, 2, 25, 12, 2, 3, 2, 3, 2, 2, - 5, 37, 7, 4, 4, 2, 8, 2, 4, 4, 4, 20, 3, 1, 2, 2, 3, 2, 1, 1, 1, 4, 3, 7, 2, 1, 1, 42, 10, 5, 3, 3, 2, 3, 3, 2, 2, 3, 3, 2, 6, - 21, 7, 6, 4, 1, 10, 3, 2, 2, 4, 4, 10, 4, 4, 1, 1, 17, 5, 4, 2, 3, 3, 23, 1, 12, 8, 6, 2, 4, 4, 48, 16, 2, 1, 1, 7, 2, 1, 17, 7, 4, - 4, 4, 5, 5, 4, 55, 19, 3, 4, 8, 5, 2, 5, 2, 2, 3, 11, 1, 5, 3, 66, 5, 11, 1, 1, 6, 2, 4, 4, 4, 11, 2, 20, 3, 3, 3, 2, 2, 2, 12, 5, - 4, 2, 3, 2, 2, 102,5, 1, 1, 5, 4, 15, 4, 2, 10, 6, 4, 2, 2, 5, 3, 3, 1, 1, 1, 1, 1, 1, 3, 2, 2, 5, 2, 2, 1, 1, 5, 1, 2, 31, 4, - 2, 4, 1, 4, 3, 1, 11, 3, 3, 3, 1, 1, 4, 3, 2, 11, 6, 5, 2, 9, 4, 39, 4, 3, 29, 14, 2, 6, 2, 3, 2, 3, 7, 1, 1, 1, 1, 1, 1, 1, 3, - 1, 1, 1, 3, 1, 1, 1, 1, 2, 41, 4, 23, 2, 3, 7, 3, 4, 2, 6, 5, 13, 3, 3, 2, 2, 2, 1, 26, 17, 2, 4, 3, 4, 2, 6, 2, 2, 66, 4, 4, 12, - 2, 7, 3, 4, 6, 2, 5, 2, 25, 9, 2, 7, 2, 4, 3, 4, 4, 4, 35, 2, 8, 3, 1, 1, 3, 1, 2, 5, 17, 5, 5, 10, 7, 64, 4, 17, 4, 4, 3, 4, 4, - 4, 4, 9, 7, 9, 4, 3, 11, 6, 3, 2, 2, 10, 3, 3, 71, 6, 11, 8, 6, 9, 7, 2, 1, 1, 1, 6, 3, 6, 4, 4, 4, 2, 5, 4, 3, 3, 6, 5, 5, 5, - 4, 4, 3, 3, 3, 3, 4, 109,32, 23, 7, 7, 6, 9, 4, 4, 5, 2, 2, 2, 7, 6, 5, 3, 8, 2, 1, 1, 1, 3, 7, 1, 1, 1, 1, 1, 1, 1, 1, 2, 18, - 2, 2, 2, 1, 6, 2, 6, 2, 2, 1, 3, 3, 3, 4, 2, 2, 1, 1, 1, 1, 1, 1, 1, 21, 5, 2, 5, 2, 2, 1, 1, 1, 1, 1, 71, 5, 4, 2, 1, 3, 3, - 3, 5, 7, 2, 17, 10, 6, 6, 2, 3, 9, 85, 4, 4, 7, 29, 6, 6, 4, 4, 4, 2, 12, 6, 3, 7, 6, 6, 1, 5, 1, 9, 2, 6, 4, 3, 2, 10, 5, 6, 1, - 1, 2, 2, 2, 2, 2, 1, 1, 1, 10, 1, 1, 6, 6, 6, 4, 1, 1, 2, 1, 1, 1, 14, 6, 3, 1, 5, 2, 34, 4, 1, 1, 1, 1, 1, 6, 2, 1, 3, 11, 8, - 8, 1, 6, 1, 1, 51, 4, 3, 1, 3, 3, 3, 1, 1, 7, 1, 2, 3, 5, 3, 3, 3, 2, 1, 1, 1, 4, 4, 4, 6, 1, 1, 5, 3, 4, 3, 3, 2, 2, 2, 2, - 39, 3, 3, 6, 3, 1, 4, 4, 2, 6, 2, 14, 5, 4, 3, 2, 2, 14, 1, 6, 1, 1, 9, 5, 1, 1, 68, 2, 2, 24, 1, 1, 4, 3, 3, 17, 2, 5, 5, 16, 7, - 7, 5, 3, 2, 8, 3, 2, 7, 1, 3, 3, 39, 23, 8, 8, 7, 9, 2, 2, 5, 4, 2, 1, 1, 36, 5, 4, 2, 6, 14, 9, 4, 4, 4, 2, 22, 6, 4, 4, 3, 2, - 2, 2, 1, 2, 3, 96, 24, 4, 2, 9, 4, 4, 2, 2, 4, 1, 1, 1, 1, 1, 3, 2, 3, 1, 1, 2, 2, 8, 3, 9, 32, 5, 19, 11, 5, 2, 3, 3, 2, 12, 7, - 2, 2, 1, 1, 63, 11, 3, 4, 6, 18, 3, 11, 8, 6, 4, 3, 9, 8, 5, 4, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 22, 1, 5, 1, 1, 3, 3, 2, 11, 5, 8, - 4, 3, 2, 2, 3, 80, 6, 2, 11, 3, 3, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 11, 4, 4, 2, 2, 2, 12, 7, 7, 4, 4, 4, 4, 6, - 3, 2, 11, 2, 5, 2, 2, 1, 1, 1, 4, 2, 2, 2, 2, 2, 1, 1, 1, 8, 4, 4, 4, 4, 4, 2, 1, 1, 1, 1, 1, 1, 1, 63, 8, 4, 3, 11, 2, 2, 2, - 8, 5, 5, 3, 5, 5, 2, 22, 3, 5, 3, 4, 7, 4, 2, 95, 1, 1, 8, 2, 3, 13, 7, 6, 1, 1, 2, 5, 1, 1, 1, 4, 2, 2, 2, 1, 1, 2, 2, 1, 4, - 1, 46, 1, 1, 1, 1, 6, 1, 1, 1, 21, 5, 8, 6, 6, 3, 7, 1, 1, 3, 2, 1, 5, 3, 100,6, 5, 3, 6, 3, 3, 11, 4, 13, 2, 6, 26, 4, 5, 3, 3, - 14, 3, 2, 3, 1, 126,5, 4, 4, 4, 12, 9, 2, 2, 2, 1, 1, 4, 5, 4, 2, 2, 14, 2, 3, 6, 3, 30, 12, 6, 3, 3, 6, 5, 3, 3, 26, 26, 20, 13, 10, - 5, 4, 2, 219,4, 1, 13, 3, 3, 5, 1, 8, 2, 1, 4, 6, 2, 34, 4, 2, 3, 3, 15, 6, 5, 5, 3, 3, 3, 7, 3, 1, 4, 2, 11, 3, 3, 4, 13, 8, 8, - 7, 1, 1, 3, 2, 105,13, 4, 2, 1, 18, 3, 6, 2, 2, 5, 1, 1, 14, 4, 2, 2, 2, 2, 5, 3, 2, 9, 1, 3, 12, 10, 4, 4, 6, 2, 5, 2, 2, 8, 5, - 3, 3, 2, 2, 177,4, 9, 4, 3, 25, 20, 14, 5, 8, 4, 3, 3, 2, 24, 12, 10, 9, 6, 4, 3, 98, 5, 3, 1, 2, 7, 3, 1, 3, 1, 2, 2, 1, 14, 7, 4, - 3, 3, 5, 3, 2, 2, 1, 4, 4, 4, 7, 1, 7, 7, 2, 2, 12, 5, 3, 2, 1, 1, 1, 1, 4, 3, 3, 1, 6, 2, 1, 2, 2, 6, 1, 5, 1, 5, 2, 1, 1, - 1, 1, 1, 1, 1, 1, 11, 4, 105,12, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 20, 2, 10, 8, 7, 5, 1, 2, 1, 7, 3, 5, 8, 2, 2, 2, 4, 8, - 2, 2, 30, 1, 1, 1, 1, 12, 7, 2, 6, 1, 3, 65, 4, 2, 3, 2, 1, 1, 1, 18, 5, 4, 2, 3, 13, 6, 7, 10, 2, 2, 2, 7, 6, 3, 1, 2, 79, 3, 7, - 7, 7, 50, 4, 45, 6, 4, 3, 5, 3, 2, 7, 4, 4, 3, 2, 6, 6, 2, 1, 1, 3, 11, 7, 3, 1, 13, 2, 2, 4, 2, 7, 1, 4, 3, 3, 2, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 168,8, 6, 4, 2, 2, 2, 18, 15, 15, 9, 4, 2, 9, 5, 10, 1, 1, 2, 2, 2, 4, 4, 4, 3, 8, 4, 4, 4, 4, 6, 9, 5, 4, 3, 2, - 1, 1, 1, 1, 1, 1, 5, 2, 2, 5, 4, 16, 4, 4, 12, 3, 3, 3, 1, 1, 29, 3, 3, 6, 1, 8, 3, 2, 3, 4, 10, 4, 2, 4, 2, 16, 7, 7, 2, 1, 1, - 1, 5, 2, 2, 65, 7, 1, 2, 14, 4, 4, 3, 3, 22, 5, 8, 8, 7, 6, 6, 4, 9, 4, 2, 2, 2, 56, 12, 9, 4, 7, 3, 3, 2, 2, 2, 1, 1, 1, 22, 17, - 5, 4, 12, 1, 4, 4, 4, 4, 1, 10, 9, 8, 8, 8, 5, 1, 16, 2, 1, 1, 1, 8, 3, 5, 5, 1, 1, 31, 6, 2, 1, 1, 17, 5, 5, 11, 4, 4, 5, 1, 2, - 1, 8, 3, 8, 2, 1, 3, 3, 2, 15, 13, 2, 4, 6, 4, 4, 4, 4, 3, 16, 3, 3, 5, 4, 2, 2, 4, 4, 4, 39, 6, 2, 5, 3, 2, 19, 9, 9, 3, 3, 6, - 3, 1, 1, 1, 1, 1, 1, 12, 2, 2, 2, 1, 3, 3, 2, 2, 5, 4, 3, 3, 3, 22, 9, 8, 4, 6, 1, 1, 4, 4, 2, 2, 2, 6, 3, 1, 1, 2, 2, 2, 3, - 2, 152,5, 8, 8, 7, 7, 7, 4, 14, 3, 3, 3, 3, 7, 7, 29, 3, 12, 10, 11, 10, 5, 5, 5, 1, 15, 14, 11, 8, 5, 1, 3, 2, 5, 1, 4, 28, 7, 3, 7, - 7, 4, 24, 3, 8, 3, 2, 4, 3, 2, 3, 10, 8, 3, 3, 1, 1, 41, 18, 13, 4, 2, 3, 11, 3, 6, 3, 3, 6, 4, 34, 8, 14, 9, 9, 9, 3, 5, 3, 6, 5, - 2, 3, 1, 8, 3, 2, 19, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 6, 14, 6, 3, 3, 1, 22, 2, 11, 8, 3, 4, 1, 3, 2, 53, 14, 3, - 2, 2, 16, 3, 3, 3, 5, 3, 3, 9, 1, 1, 1, 4, 4, 74, 39, 21, 9, 6, 17, 16, 9, 6, 3, 2, 2, 18, 5, 5, 3, 23, 4, 3, 15, 9, 7, 6, 25, 6, 3, - 3, 4, 7, 5, 3, 3, 1, 13, 5, 5, 4, 2, 2, 2, 3, 33, 21, 18, 1, 1, 8, 7, 6, 5, 4, 3, 3, 3, 8, 4, 2, 2, 4, 32, 10, 5, 3, 3, 3, 4, 3, - 3, 3, 6, 4, 6, 6, 6, 1, 63, 2, 2, 22, 4, 5, 2, 2, 1, 10, 10, 5, 3, 9, 6, 2, 5, 1, 5, 3, 3, 4, 3, 5, 5, 32, 6, 5, 2, 3, 17, 17, 7, - 4, 2, 1, 1, 1, 1, 8, 6, 3, 56, 5, 4, 22, 20, 18, 9, 8, 8, 5, 5, 2, 6, 4, 17, 2, 9, 2, 2, 2, 4, 37, 5, 3, 2, 2, 2, 2, 2, 25, 13, 13, - 9, 2, 12, 12, 10, 7, 4, 12, 9, 9, 9, 9, 2, 2, 15, 15, 13, 13, 7, 10, 3, 1, 2, 20, 2, 3, 1, 2, 2, 2, 9, 7, 5, 5, 5, 6, 4, 45, 6, 2, 2, - 2, 11, 8, 3, 16, 10, 5, 4, 4, 1, 1, 1, 1, 1, 6, 6, 4, 4, 25, 5, 12, 8, 8, 2, 2, 7, 6, 2, 2, 83, 11, 10, 10, 4, 4, 6, 14, 8, 6, 4, 16, - 13, 3, 8, 3, 24, 8, 8, 8, 8, 8, 5, 11, 6, 5, 5, 7, 7, 5, 5, 2, 2, 2, 71, 2, 6, 2, 13, 8, 8, 8, 2, 2, 2, 2, 3, 2, 5, 18, 17, 8, 8, - 8, 4, 19, 4, 2, 2, 2, 2, 1, 4, 4, 3, 3, 3, 3, 1, 89, 7, 3, 3, 2, 46, 6, 3, 16, 16, 8, 4, 4, 3, 3, 5, 2, 11, 11, 4, 3, 3, 3, 19, 3, - 3, 5, 5, 5, 2, 2, 7, 1, 6, 12, 6, 74, 6, 17, 10, 4, 3, 3, 35, 12, 9, 4, 3, 12, 7, 3, 4, 9, 6, 6, 6, 16, 5, 5, 5, 10, 2, 7, 6, 5, 3, - 2, 63, 3, 2, 14, 9, 7, 4, 2, 2, 6, 2, 3, 3, 12, 7, 1, 13, 2, 4, 1, 3, 2, 12, 1, 2, 1, 18, 1, 1, 1, 9, 1, 1, 3, 2, 2, 1, 1, 1, 2, - 2, 8, 6, 6, 2, 1, 181,17, 3, 2, 5, 3, 4, 13, 2, 5, 1, 11, 5, 6, 6, 2, 3, 8, 5, 4, 15, 1, 13, 13, 13, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, - 1, 1, 2, 2, 2, 2, 2, 1, 10, 3, 3, 2, 2, 3, 1, 3, 1, 6, 2, 1, 1, 1, 63, 61, 61, 5, 4, 3, 8, 4, 4, 2, 2, 2, 44, 7, 6, 6, 6, 6, 3, - 2, 1, 2, 7, 1, 1, 1, 6, 2, 6, 5, 5, 5, 1, 1, 1, 1, 5, 1, 2, 8, 4, 4, 4, 4, 4, 2, 1, 1, 1, 26, 7, 1, 2, 1, 1, 7, 7, 1, 5, 1, - 1, 1, 3, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 39, 4, 3, 2, 2, 29, 29, 20, 1, 1, 1, 1, 5, 10, 6, 23, 7, - 6, 3, 2, 2, 2, 7, 4, 2, 19, 10, 2, 1, 5, 5, 3, 2, 1, 1, 1, 20, 3, 5, 5, 3, 2, 1, 1, 1, 17, 16, 1, 5, 2, 5, 5, 2, 1, 1, 1, 1, 16, - 2, 3, 4, 4, 6, 1, 1, 6, 1, 2, 6, 7, 3, 3, 92, 6, 3, 3, 4, 3, 1, 7, 1, 3, 1, 32, 5, 7, 8, 4, 3, 2, 2, 2, 2, 6, 3, 11, 5, 3, 2, - 6, 3, 3, 3, 27, 3, 2, 2, 4, 3, 3, 15, 2, 3, 6, 5, 82, 5, 19, 9, 4, 10, 8, 4, 5, 3, 12, 1, 8, 8, 2, 2, 4, 4, 10, 2, 2, 1, 1, 1, 14, - 3, 1, 4, 3, 2, 1, 1, 1, 1, 2, 31, 5, 17, 7, 5, 6, 160,10, 5, 3, 3, 9, 3, 6, 6, 8, 11, 3, 1, 1, 8, 3, 21, 7, 4, 4, 3, 5, 4, 4, 6, - 3, 2, 4, 3, 1, 28, 13, 11, 13, 6, 5, 7, 6, 2, 3, 20, 5, 1, 11, 4, 7, 3, 2, 4, 2, 2, 1, 8, 3, 4, 2, 79, 2, 22, 3, 4, 2, 1, 1, 2, 2, - 2, 3, 3, 43, 37, 5, 3, 2, 7, 5, 3, 46, 12, 1, 3, 2, 2, 2, 2, 1, 1, 1, 1, 3, 2, 3, 2, 9, 2, 2, 1, 4, 1, 5, 2, 8, 2, 3, 1, 1, 1, - 3, 1, 1, 1, 1, 1, 1, 1, 95, 5, 2, 2, 2, 2, 5, 1, 1, 1, 4, 2, 1, 4, 3, 1, 10, 4, 3, 3, 2, 1, 2, 36, 11, 9, 7, 7, 2, 4, 3, 3, 3, - 1, 10, 2, 2, 2, 2, 2, 2, 12, 8, 2, 2, 2, 2, 2, 1, 1, 1, 1, 32, 2, 2, 2, 13, 11, 1, 9, 8, 6, 2, 2, 2, 2, 1, 1, 3, 3, 3, 3, 2, 2, - 12, 11, 10, 9, 8, 7, 6, 5, 4, 4, 3, 3, 2, 2, 1, 1, 5, 1, 3, 3, 3, 3, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 115,2, 5, 1, 1, 5, - 3, 2, 7, 4, 9, 2, 2, 3, 7, 6, 6, 6, 4, 3, 2, 2, 3, 62, 10, 9, 7, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 2, 2, 2, 1, 18, 18, 17, 7, - 8, 7, 6, 2, 2, 19, 5, 3, 13, 12, 5, 4, 3, 2, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 17, 5, 4, 1, - 1, 1, 1, 1, 1, 5, 1, 1, 3, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 2, 2, 2, 2, 23, 5, 5, 5, 3, 1, 1, 1, 14, - 3, 7, 4, 3, 2, 2, 2, 2, 2, 2, 2, 1, 1, 6, 1, 1, 2, 1, 2, 2, 2, 2, 1, 1, 217,7, 6, 4, 1, 27, 22, 11, 5, 4, 1, 5, 2, 1, 1, 4, 4, - 2, 5, 3, 3, 11, 5, 4, 10, 9, 23, 1, 14, 8, 6, 5, 3, 38, 6, 1, 24, 2, 2, 2, 15, 8, 6, 4, 2, 2, 2, 51, 4, 4, 4, 12, 7, 7, 3, 30, 2, 17, - 15, 3, 3, 3, 3, 4, 4, 4, 2, 3, 12, 4, 3, 2, 19, 5, 4, 3, 7, 3, 3, 1, 1, 6, 1, 5, 4, 5, 3, 125,5, 1, 1, 8, 5, 4, 2, 2, 1, 1, 29, - 24, 2, 1, 1, 3, 13, 3, 2, 1, 1, 1, 11, 8, 5, 10, 4, 19, 3, 2, 3, 5, 2, 1, 20, 13, 7, 7, 7, 5, 3, 3, 3, 1, 1, 5, 5, 3, 1, 204,3, 1, - 3, 1, 23, 20, 6, 6, 3, 2, 2, 5, 13, 9, 3, 3, 3, 3, 2, 2, 25, 3, 1, 12, 5, 3, 66, 2, 7, 2, 5, 3, 7, 2, 4, 33, 10, 5, 12, 3, 3, 3, 3, + 8, 1, 1, 6, 19, 18, 2, 2, 2, 4, 2, 2, 2, 2, 11, 5, 3, 36, 2, 3, 1, 1, 1, 8, 3, 2, 1, 1, 1, 1, 1, 1, 6, 3, 2, 4, 2, 5, 3, 1, 1, + 1, 21, 9, 9, 3, 3, 2, 7, 3, 9, 4, 2, 87, 5, 2, 5, 2, 11, 3, 3, 5, 2, 2, 39, 7, 7, 3, 9, 1, 4, 6, 3, 7, 2, 1, 2, 86, 8, 1, 1, 13, + 12, 9, 5, 5, 2, 1, 2, 7, 40, 11, 5, 1, 1, 1, 4, 4, 4, 3, 11, 2, 6, 1, 1, 2, 1, 1, 1, 9, 3, 3, 4, 3, 5, 2, 2, 9, 2, 1, 1, 1, 1, + 1, 5, 3, 21, 1, 9, 6, 5, 2, 3, 3, 2, 2, 1, 1, 2, 1, 1, 1, 1, 6, 1, 1, 1, 5, 3, 3, 2, 1, 1, 1, 1, 82, 5, 1, 2, 2, 2, 1, 3, 1, + 7, 6, 7, 1, 1, 4, 9, 10, 8, 2, 5, 6, 3, 5, 3, 2, 117,2, 6, 3, 3, 2, 5, 4, 11, 3, 3, 3, 2, 1, 1, 1, 1, 1, 34, 2, 2, 23, 1, 1, 2, + 3, 4, 1, 1, 1, 19, 3, 6, 5, 2, 2, 3, 5, 1, 1, 1, 12, 4, 3, 4, 2, 3, 5, 4, 4, 88, 7, 5, 7, 1, 1, 1, 16, 4, 1, 5, 2, 2, 43, 6, 1, + 23, 2, 2, 10, 3, 2, 2, 2, 4, 2, 2, 1, 5, 2, 2, 4, 3, 5, 2, 2, 3, 1, 1, 1, 53, 3, 1, 1, 2, 2, 5, 3, 1, 6, 2, 4, 3, 7, 3, 2, 2, + 12, 3, 3, 3, 43, 4, 2, 2, 4, 5, 1, 4, 4, 3, 4, 6, 6, 3, 20, 3, 1, 1, 1, 3, 2, 3, 2, 2, 3, 2, 1, 1, 45, 5, 4, 4, 2, 1, 14, 5, 4, + 3, 1, 2, 1, 1, 7, 47, 2, 12, 4, 2, 6, 3, 4, 4, 2, 5, 2, 4, 2, 76, 14, 12, 6, 4, 2, 1, 1, 1, 10, 3, 2, 3, 4, 20, 19, 18, 2, 4, 3, 10, + 7, 4, 4, 7, 5, 3, 2, 99, 10, 5, 17, 14, 3, 8, 3, 2, 8, 5, 7, 1, 4, 2, 12, 4, 3, 20, 3, 4, 8, 5, 3, 3, 2, 26, 5, 5, 5, 5, 7, 4, 1, + 2, 9, 3, 3, 4, 3, 41, 8, 1, 1, 2, 10, 2, 2, 3, 4, 4, 3, 3, 3, 4, 4, 2, 2, 42, 4, 1, 19, 7, 2, 4, 5, 1, 1, 6, 3, 2, 2, 4, 2, 23, + 13, 3, 2, 2, 2, 4, 1, 1, 1, 1, 70, 2, 2, 7, 10, 1, 5, 16, 5, 2, 9, 6, 5, 12, 6, 5, 4, 3, 6, 2, 17, 5, 3, 3, 14, 4, 1, 1, 1, 1, 2, + 44, 7, 2, 3, 1, 1, 1, 2, 13, 2, 4, 2, 1, 1, 1, 1, 7, 4, 2, 1, 11, 3, 1, 1, 6, 3, 27, 7, 2, 3, 9, 2, 3, 118,15, 4, 9, 4, 4, 10, 1, + 4, 1, 11, 2, 3, 9, 2, 2, 15, 3, 3, 1, 5, 1, 1, 4, 20, 2, 1, 3, 3, 3, 2, 2, 1, 1, 3, 1, 2, 4, 1, 4, 49, 14, 7, 3, 2, 4, 6, 6, 2, + 2, 2, 2, 2, 4, 3, 3, 2, 2, 2, 2, 1, 1, 4, 1, 115,9, 2, 3, 3, 2, 10, 2, 4, 3, 3, 8, 2, 2, 2, 8, 3, 2, 20, 4, 4, 4, 1, 3, 4, 2, + 3, 1, 1, 1, 5, 4, 15, 6, 2, 2, 2, 8, 7, 7, 7, 6, 5, 5, 3, 8, 2, 4, 2, 2, 2, 2, 5, 4, 2, 1, 44, 7, 1, 1, 6, 8, 6, 3, 4, 2, 2, + 58, 8, 2, 3, 2, 10, 3, 7, 2, 2, 18, 9, 2, 1, 3, 4, 2, 2, 139,11, 1, 9, 5, 2, 2, 12, 2, 2, 2, 2, 1, 13, 4, 3, 1, 4, 3, 7, 4, 3, 4, + 2, 20, 4, 3, 2, 3, 2, 1, 1, 1, 2, 1, 8, 3, 4, 10, 3, 2, 12, 2, 2, 3, 2, 2, 1, 1, 1, 1, 1, 1, 2, 4, 4, 2, 2, 1, 130,9, 2, 2, 13, + 3, 1, 1, 1, 9, 5, 4, 3, 1, 2, 2, 5, 9, 2, 3, 12, 2, 3, 1, 7, 2, 3, 6, 5, 7, 3, 3, 1, 1, 10, 4, 13, 3, 33, 4, 10, 4, 7, 2, 1, 2, + 5, 2, 2, 76, 8, 4, 3, 11, 2, 3, 9, 3, 4, 2, 1, 1, 5, 8, 2, 2, 1, 1, 16, 4, 1, 1, 2, 2, 2, 2, 4, 2, 35, 1, 1, 1, 2, 2, 3, 3, 10, + 4, 2, 8, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 37, 28, 8, 3, 15, 2, 5, 3, 4, 3, 4, 4, 26, 18, 18, 4, 2, 3, 3, + 2, 4, 3, 1, 1, 43, 8, 3, 6, 2, 2, 1, 1, 10, 3, 10, 7, 3, 4, 5, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 181,5, 6, 2, 2, 1, 5, 5, 1, 3, + 2, 6, 1, 1, 6, 2, 1, 1, 7, 1, 2, 1, 10, 2, 2, 1, 2, 2, 9, 2, 4, 4, 9, 3, 1, 3, 15, 1, 1, 3, 3, 4, 16, 1, 3, 1, 2, 1, 3, 3, 28, + 2, 2, 2, 13, 3, 3, 3, 1, 1, 2, 4, 11, 5, 2, 2, 14, 9, 4, 12, 2, 2, 5, 3, 3, 6, 2, 3, 2, 3, 123,5, 2, 1, 2, 1, 6, 3, 3, 3, 2, 3, + 32, 3, 4, 5, 11, 2, 7, 2, 3, 3, 2, 9, 5, 2, 10, 3, 12, 1, 5, 2, 10, 1, 1, 4, 3, 3, 4, 1, 12, 4, 5, 1, 1, 1, 1, 1, 1, 1, 3, 132,2, + 3, 1, 1, 1, 16, 7, 2, 2, 3, 3, 3, 3, 10, 5, 2, 2, 70, 15, 9, 8, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 44, 6, 3, 2, 7, 3, 17, 7, 7, 5, 6, + 9, 5, 3, 7, 2, 3, 3, 2, 4, 2, 100,3, 17, 4, 3, 4, 6, 4, 2, 7, 9, 3, 19, 5, 3, 2, 6, 3, 1, 1, 6, 4, 5, 3, 80, 7, 4, 4, 2, 2, 7, + 4, 3, 1, 1, 3, 5, 3, 17, 3, 2, 1, 1, 12, 4, 3, 1, 1, 13, 4, 2, 2, 3, 2, 32, 3, 2, 6, 6, 6, 5, 3, 16, 2, 11, 2, 16, 3, 5, 1, 2, 2, + 8, 1, 1, 2, 1, 2, 18, 2, 2, 4, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 17, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 5, 1, 1, 2, 11, 2, 4, + 49, 10, 4, 10, 3, 18, 6, 5, 5, 3, 1, 39, 3, 21, 6, 6, 2, 3, 1, 6, 4, 2, 2, 2, 4, 20, 2, 3, 3, 3, 2, 6, 2, 28, 2, 10, 8, 5, 1, 5, 2, + 2, 9, 2, 2, 3, 1, 30, 2, 1, 1, 2, 8, 2, 1, 3, 10, 6, 7, 2, 8, 7, 25, 6, 2, 3, 2, 5, 2, 2, 2, 6, 3, 2, 55, 7, 3, 4, 2, 4, 4, 1, + 13, 3, 4, 3, 2, 2, 8, 3, 1, 1, 4, 2, 2, 1, 35, 15, 3, 2, 7, 3, 6, 3, 3, 3, 2, 74, 4, 14, 4, 3, 4, 4, 11, 2, 1, 2, 1, 5, 3, 15, 10, + 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 7, 3, 5, 1, 1, 1, 1, 19, 2, 2, 5, 3, 3, 3, 3, 2, 2, 2, 99, 7, 2, 1, 7, 3, 2, + 4, 2, 10, 5, 1, 3, 9, 2, 3, 2, 2, 2, 4, 5, 19, 1, 1, 3, 3, 5, 2, 8, 1, 1, 1, 1, 1, 2, 2, 5, 1, 43, 3, 2, 4, 11, 2, 4, 2, 3, 4, + 2, 1, 2, 4, 2, 2, 5, 3, 3, 3, 2, 32, 3, 6, 6, 2, 3, 6, 1, 4, 5, 5, 6, 1, 2, 2, 2, 20, 2, 3, 7, 2, 5, 5, 2, 2, 3, 14, 7, 1, 1, + 1, 1, 3, 2, 1, 1, 38, 19, 3, 1, 2, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 4, 4, 3, 1, 3, 12, 4, 4, 1, 3, 1, 3, 56, 3, 2, 1, 14, 8, 2, 4, + 3, 2, 1, 1, 4, 2, 2, 5, 2, 2, 6, 3, 3, 3, 2, 3, 5, 3, 1, 1, 3, 5, 1, 1, 1, 45, 14, 1, 2, 3, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 14, + 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 5, 3, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 5, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, + 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 9, 3, 124,22, 9, 3, 3, 5, 4, 21, 11, 5, 3, 3, 9, 4, 2, 36, 1, + 1, 1, 2, 3, 15, 3, 3, 3, 4, 1, 8, 2, 2, 19, 5, 2, 7, 4, 2, 4, 3, 3, 3, 3, 3, 3, 134,11, 3, 2, 15, 7, 28, 6, 2, 7, 4, 3, 3, 1, 1, + 6, 3, 17, 2, 4, 3, 2, 3, 18, 1, 3, 4, 4, 2, 10, 3, 3, 5, 3, 4, 2, 10, 6, 3, 1, 1, 1, 6, 3, 80, 10, 1, 1, 2, 1, 7, 4, 11, 1, 11, 3, + 2, 2, 2, 7, 2, 2, 4, 18, 5, 2, 1, 1, 2, 2, 2, 11, 1, 1, 2, 2, 2, 2, 2, 80, 13, 3, 3, 10, 6, 3, 9, 3, 3, 2, 10, 3, 3, 4, 24, 7, 4, + 3, 9, 2, 3, 2, 2, 3, 2, 9, 7, 1, 3, 3, 2, 1, 2, 83, 20, 1, 4, 5, 3, 4, 2, 12, 9, 3, 4, 3, 15, 2, 1, 1, 1, 3, 3, 14, 7, 4, 2, 4, + 8, 4, 30, 7, 4, 4, 3, 4, 2, 2, 43, 4, 4, 3, 9, 3, 1, 7, 3, 5, 13, 2, 2, 1, 6, 61, 3, 34, 3, 11, 9, 6, 4, 2, 6, 2, 8, 3, 4, 4, 1, + 1, 3, 45, 11, 4, 3, 3, 12, 2, 2, 4, 9, 2, 5, 3, 237,38, 2, 8, 2, 14, 4, 3, 4, 2, 1, 51, 4, 19, 13, 10, 4, 8, 4, 2, 6, 2, 24, 4, 3, 9, + 6, 22, 13, 8, 2, 2, 3, 13, 7, 4, 30, 2, 9, 4, 2, 9, 6, 4, 4, 3, 2, 47, 5, 4, 6, 4, 2, 5, 6, 2, 5, 3, 5, 2, 4, 1, 10, 1, 30, 6, 6, + 5, 13, 2, 4, 140,9, 2, 2, 17, 5, 5, 2, 9, 3, 3, 3, 5, 5, 3, 2, 2, 6, 4, 4, 4, 7, 5, 2, 7, 3, 9, 6, 14, 4, 4, 21, 6, 5, 4, 3, 21, + 4, 1, 5, 5, 3, 3, 2, 3, 2, 15, 3, 6, 2, 2, 103,6, 2, 2, 2, 2, 20, 1, 1, 1, 4, 7, 2, 3, 2, 4, 2, 9, 3, 6, 2, 3, 5, 2, 2, 9, 3, + 2, 3, 5, 2, 6, 4, 7, 3, 1, 2, 12, 5, 4, 3, 11, 4, 3, 10, 5, 2, 18, 4, 6, 4, 8, 2, 4, 4, 3, 17, 3, 5, 2, 30, 4, 8, 5, 4, 3, 3, 5, + 3, 18, 7, 4, 3, 3, 4, 3, 2, 12, 2, 2, 1, 2, 99, 11, 2, 4, 2, 3, 15, 6, 2, 2, 2, 15, 3, 5, 8, 7, 3, 10, 5, 11, 4, 1, 1, 4, 3, 7, 4, + 5, 3, 3, 7, 2, 4, 4, 2, 189,22, 4, 3, 3, 2, 3, 3, 7, 4, 10, 3, 13, 2, 13, 8, 3, 23, 2, 3, 3, 5, 2, 11, 5, 5, 18, 6, 3, 32, 6, 10, 3, + 3, 10, 3, 5, 3, 6, 1, 3, 5, 4, 3, 2, 2, 1, 145,12, 3, 3, 3, 11, 4, 1, 2, 12, 7, 30, 8, 2, 2, 3, 3, 2, 4, 3, 5, 2, 4, 1, 1, 1, 1, + 15, 6, 3, 3, 3, 7, 2, 23, 3, 10, 3, 2, 20, 3, 3, 3, 3, 3, 1, 2, 160,10, 3, 6, 6, 27, 1, 2, 2, 5, 1, 11, 7, 6, 3, 14, 6, 2, 29, 2, 3, + 12, 3, 3, 1, 1, 2, 17, 4, 3, 5, 3, 10, 6, 2, 4, 2, 22, 4, 2, 7, 3, 7, 7, 3, 2, 2, 4, 4, 220,9, 3, 2, 3, 22, 7, 3, 11, 2, 1, 6, 2, + 2, 2, 5, 2, 4, 3, 23, 22, 2, 4, 5, 5, 4, 1, 2, 4, 2, 26, 9, 2, 7, 8, 4, 4, 4, 1, 3, 2, 79, 13, 4, 37, 4, 5, 23, 3, 9, 6, 23, 3, 5, + 5, 10, 4, 22, 2, 8, 3, 2, 1, 1, 1, 5, 2, 2, 2, 1, 1, 3, 103,28, 3, 10, 3, 5, 8, 3, 36, 4, 5, 18, 4, 4, 18, 6, 2, 2, 5, 3, 15, 1, 2, + 8, 2, 3, 76, 8, 3, 3, 7, 5, 3, 4, 4, 6, 4, 5, 4, 9, 2, 2, 10, 6, 5, 3, 3, 7, 3, 10, 2, 3, 2, 46, 3, 3, 7, 3, 3, 3, 7, 3, 3, 4, + 53, 1, 23, 19, 5, 7, 3, 2, 3, 4, 4, 3, 3, 1, 6, 4, 2, 18, 1, 1, 1, 1, 1, 1, 1, 1, 2, 5, 2, 3, 3, 2, 5, 1, 1, 3, 1, 1, 171,7, 6, + 25, 2, 2, 11, 8, 3, 3, 9, 3, 3, 5, 5, 9, 6, 20, 4, 10, 3, 14, 8, 16, 5, 17, 14, 11, 11, 2, 21, 15, 1, 1, 6, 5, 55, 9, 3, 4, 16, 4, 3, 2, + 1, 4, 2, 4, 2, 2, 13, 3, 1, 1, 3, 8, 3, 2, 3, 70, 4, 17, 6, 4, 2, 2, 2, 7, 2, 7, 3, 4, 10, 2, 2, 1, 3, 3, 2, 12, 2, 7, 7, 6, 3, + 53, 2, 3, 13, 1, 6, 2, 5, 5, 3, 2, 4, 4, 3, 3, 3, 2, 4, 4, 4, 2, 67, 3, 3, 3, 9, 5, 3, 3, 5, 3, 5, 8, 5, 4, 4, 1, 3, 53, 2, 9, + 4, 9, 6, 1, 1, 5, 3, 3, 3, 2, 2, 2, 19, 2, 2, 2, 2, 2, 3, 152,38, 16, 11, 5, 4, 3, 2, 8, 18, 11, 11, 4, 3, 3, 15, 2, 5, 4, 2, 36, 10, + 9, 11, 11, 11, 11, 11, 10, 10, 4, 6, 3, 5, 4, 4, 11, 4, 4, 2, 10, 4, 3, 5, 4, 4, 1, 39, 3, 2, 5, 11, 6, 3, 2, 1, 3, 2, 6, 4, 3, 146,2, + 17, 7, 3, 1, 1, 1, 1, 13, 3, 3, 3, 3, 8, 4, 1, 1, 1, 12, 4, 3, 2, 1, 3, 10, 8, 3, 5, 2, 2, 19, 2, 6, 2, 25, 4, 4, 2, 2, 2, 5, 2, + 20, 5, 2, 1, 5, 2, 5, 2, 12, 2, 15, 4, 1, 4, 2, 86, 14, 2, 3, 3, 5, 8, 2, 3, 8, 3, 16, 5, 3, 1, 5, 4, 16, 12, 1, 1, 5, 6, 153,1, 1, + 1, 14, 4, 3, 3, 6, 12, 3, 7, 2, 3, 15, 3, 7, 7, 6, 4, 4, 18, 6, 2, 2, 5, 19, 4, 3, 2, 6, 3, 15, 3, 5, 6, 15, 3, 5, 1, 7, 71, 2, 3, + 2, 46, 10, 1, 8, 8, 2, 1, 10, 3, 3, 10, 4, 4, 2, 9, 5, 5, 5, 4, 4, 4, 3, 3, 45, 5, 7, 4, 6, 3, 2, 1, 1, 1, 1, 2, 9, 2, 6, 4, 2, + 2, 3, 1, 31, 3, 5, 3, 3, 9, 2, 122,4, 10, 2, 5, 5, 4, 7, 4, 1, 3, 8, 6, 8, 5, 4, 7, 3, 3, 2, 1, 8, 4, 2, 5, 2, 2, 27, 10, 5, 4, + 3, 4, 16, 4, 5, 3, 3, 3, 2, 3, 3, 108,2, 4, 4, 4, 5, 2, 2, 10, 5, 7, 3, 22, 21, 16, 15, 2, 5, 2, 2, 3, 10, 30, 14, 12, 7, 3, 35, 1, 1, + 7, 1, 3, 1, 2, 2, 6, 2, 7, 3, 137,23, 3, 2, 12, 4, 3, 3, 60, 2, 2, 13, 1, 1, 12, 2, 3, 21, 5, 5, 1, 1, 3, 4, 40, 3, 2, 6, 10, 2, 3, + 4, 15, 4, 2, 5, 1, 4, 41, 8, 5, 4, 3, 7, 3, 3, 18, 4, 10, 28, 15, 7, 5, 4, 4, 4, 4, 4, 3, 3, 2, 1, 2, 2, 5, 5, 27, 2, 3, 2, 4, 4, + 3, 3, 3, 10, 3, 12, 1, 1, 4, 3, 1, 1, 1, 1, 1, 1, 5, 4, 3, 6, 1, 1, 1, 2, 1, 1, 9, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, + 2, 1, 1, 1, 1, 29, 4, 4, 9, 2, 3, 103,3, 8, 5, 55, 2, 51, 21, 8, 5, 2, 10, 4, 23, 8, 3, 2, 3, 6, 4, 6, 1, 3, 23, 11, 6, 4, 8, 4, 4, + 3, 3, 90, 7, 3, 2, 20, 14, 8, 2, 2, 26, 4, 4, 2, 2, 13, 9, 6, 2, 2, 2, 2, 1, 2, 26, 6, 4, 3, 2, 3, 3, 2, 2, 2, 1, 4, 2, 2, 29, 8, + 4, 2, 3, 2, 4, 3, 1, 98, 31, 12, 3, 5, 2, 2, 4, 2, 2, 2, 3, 3, 3, 7, 2, 4, 2, 2, 7, 2, 5, 12, 2, 1, 6, 2, 3, 7, 4, 3, 3, 5, 3, + 55, 35, 3, 1, 3, 2, 2, 2, 5, 3, 12, 2, 3, 3, 3, 4, 3, 10, 86, 12, 3, 3, 6, 46, 46, 4, 2, 2, 7, 3, 3, 8, 2, 2, 2, 3, 3, 5, 8, 2, 2, + 4, 5, 4, 6, 3, 2, 29, 3, 20, 2, 1, 2, 5, 3, 3, 2, 4, 83, 4, 3, 1, 1, 1, 14, 5, 3, 2, 2, 1, 1, 6, 3, 1, 34, 10, 2, 2, 2, 14, 5, 2, + 2, 4, 1, 4, 3, 4, 2, 1, 4, 80, 12, 2, 2, 15, 3, 3, 4, 2, 2, 12, 2, 4, 10, 2, 8, 3, 1, 11, 4, 3, 3, 11, 2, 2, 2, 3, 2, 11, 4, 17, 2, + 2, 2, 2, 8, 7, 6, 91, 15, 2, 3, 9, 3, 3, 2, 26, 4, 3, 9, 3, 2, 7, 2, 3, 4, 1, 1, 4, 4, 3, 3, 11, 3, 42, 13, 4, 4, 5, 3, 8, 5, 3, + 1, 47, 10, 2, 2, 3, 3, 13, 7, 1, 1, 8, 5, 5, 5, 5, 4, 3, 5, 25, 5, 3, 3, 2, 7, 3, 2, 1, 2, 1, 1, 1, 19, 4, 13, 5, 2, 2, 16, 2, 2, + 2, 2, 3, 1, 8, 1, 1, 3, 6, 21, 17, 4, 3, 2, 4, 76, 5, 2, 6, 5, 1, 4, 2, 6, 3, 1, 1, 19, 5, 3, 1, 3, 18, 4, 2, 2, 4, 2, 7, 4, 2, + 20, 20, 6, 3, 9, 9, 5, 5, 10, 4, 3, 94, 14, 3, 6, 4, 8, 4, 4, 1, 8, 3, 2, 10, 4, 2, 3, 7, 21, 12, 9, 4, 3, 2, 156,7, 4, 4, 4, 23, 14, + 12, 7, 4, 2, 17, 2, 4, 7, 5, 5, 5, 5, 5, 3, 3, 6, 6, 5, 3, 3, 2, 5, 1, 2, 3, 3, 3, 61, 12, 9, 3, 37, 37, 7, 4, 1, 1, 1, 2, 3, 3, + 2, 2, 2, 1, 2, 2, 4, 3, 3, 2, 4, 4, 4, 3, 5, 3, 3, 2, 7, 2, 2, 7, 1, 2, 2, 1, 75, 4, 42, 1, 1, 1, 5, 4, 21, 2, 3, 3, 2, 5, 1, + 4, 4, 3, 2, 1, 5, 2, 15, 8, 6, 4, 2, 2, 2, 35, 1, 1, 1, 19, 2, 2, 10, 7, 2, 3, 2, 7, 13, 1, 1, 1, 1, 2, 2, 1, 1, 6, 4, 1, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 66, 3, 27, 2, 1, 4, 19, 4, 1, 5, 2, 1, 3, 1, 1, 2, 2, 1, 1, 9, 1, 3, 3, 2, 2, 5, 4, 3, 2, 1, 1, 1, 13, + 1, 1, 1, 3, 2, 4, 4, 3, 1, 4, 2, 36, 8, 9, 3, 2, 1, 1, 8, 6, 53, 8, 11, 4, 4, 12, 4, 2, 3, 1, 3, 4, 6, 5, 5, 122,31, 16, 10, 2, 2, + 9, 4, 17, 3, 2, 2, 2, 51, 4, 16, 7, 3, 2, 3, 5, 2, 2, 2, 5, 10, 5, 1, 4, 4, 1, 7, 2, 25, 6, 1, 8, 6, 2, 2, 1, 46, 4, 2, 2, 3, 3, + 2, 2, 5, 4, 3, 4, 8, 4, 2, 8, 5, 3, 37, 2, 5, 1, 3, 3, 2, 2, 14, 2, 3, 76, 14, 8, 5, 1, 5, 13, 6, 4, 5, 4, 23, 5, 5, 3, 3, 7, 2, + 3, 2, 26, 1, 1, 5, 2, 8, 3, 1, 20, 3, 2, 3, 1, 3, 6, 4, 3, 26, 4, 5, 2, 2, 2, 2, 4, 3, 4, 3, 3, 3, 53, 7, 6, 5, 3, 6, 4, 1, 1, + 22, 3, 8, 4, 4, 6, 4, 1, 7, 3, 1, 45, 11, 1, 3, 14, 8, 7, 7, 3, 2, 5, 3, 3, 2, 2, 4, 4, 1, 2, 2, 181,3, 2, 2, 22, 2, 15, 14, 3, 16, + 6, 3, 3, 1, 1, 4, 3, 119,6, 2, 12, 2, 6, 3, 2, 4, 2, 2, 3, 10, 3, 1, 3, 4, 2, 2, 11, 2, 1, 5, 14, 5, 4, 4, 4, 3, 6, 4, 2, 5, 1, + 1, 2, 2, 4, 2, 11, 3, 3, 2, 4, 2, 2, 2, 6, 2, 4, 3, 6, 2, 1, 1, 1, 4, 6, 2, 4, 78, 3, 1, 1, 1, 22, 6, 6, 8, 8, 8, 2, 13, 8, 6, + 3, 37, 8, 3, 11, 4, 5, 2, 2, 1, 1, 1, 1, 1, 4, 3, 2, 1, 2, 3, 137,13, 7, 13, 3, 4, 48, 3, 2, 5, 24, 6, 3, 10, 2, 7, 25, 3, 2, 3, 7, + 11, 5, 3, 5, 77, 9, 3, 2, 4, 1, 2, 14, 6, 1, 1, 5, 8, 4, 4, 4, 11, 3, 1, 13, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 50, 1, 3, 2, 14, 5, 3, + 2, 1, 3, 2, 1, 3, 2, 1, 1, 1, 5, 12, 4, 4, 4, 128,3, 4, 19, 8, 5, 3, 3, 2, 2, 3, 19, 17, 2, 4, 4, 19, 16, 2, 3, 2, 2, 7, 3, 10, 5, + 3, 14, 5, 4, 3, 5, 5, 10, 4, 3, 2, 1, 208,10, 174,3, 11, 11, 5, 6, 2, 3, 3, 2, 1, 1, 2, 8, 8, 3, 3, 3, 3, 2, 6, 6, 3, 2, 2, 19, 3, + 6, 3, 3, 8, 5, 4, 1, 3, 22, 2, 2, 4, 16, 3, 2, 7, 2, 6, 4, 1, 18, 9, 5, 2, 57, 3, 2, 5, 3, 2, 16, 7, 3, 2, 5, 6, 4, 1, 6, 3, 3, + 3, 4, 1, 2, 1, 1, 19, 9, 7, 22, 6, 6, 4, 4, 2, 1, 1, 1, 1, 1, 9, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 18, 1, 1, 1, 4, 4, 1, 2, 2, 1, + 5, 4, 4, 20, 2, 12, 5, 1, 1, 1, 1, 1, 1, 1, 1, 44, 7, 2, 2, 6, 4, 8, 3, 2, 7, 2, 4, 2, 2, 6, 5, 5, 5, 2, 1, 161,15, 3, 2, 8, 8, + 4, 3, 10, 3, 3, 14, 3, 5, 1, 2, 2, 1, 35, 6, 5, 4, 3, 3, 3, 5, 3, 2, 3, 57, 2, 10, 4, 3, 6, 4, 3, 29, 2, 1, 2, 3, 5, 4, 2, 7, 2, + 4, 2, 51, 1, 3, 10, 1, 3, 3, 1, 6, 2, 3, 2, 7, 4, 4, 4, 4, 6, 6, 4, 3, 50, 7, 4, 4, 8, 2, 2, 6, 4, 3, 7, 4, 2, 2, 3, 2, 5, 2, + 2, 6, 1, 3, 3, 3, 13, 7, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 21, 6, 1, 1, 4, 1, 3, 9, 4, 19, 2, 8, 1, 2, 3, 3, 37, 17, 10, 2, 3, + 10, 3, 5, 3, 16, 3, 5, 2, 3, 58, 5, 2, 19, 3, 11, 10, 2, 13, 9, 5, 2, 3, 10, 2, 1, 90, 8, 9, 7, 34, 3, 5, 9, 2, 2, 1, 3, 2, 11, 2, 3, + 13, 3, 3, 4, 2, 3, 7, 1, 1, 1, 2, 30, 3, 1, 4, 2, 10, 5, 2, 4, 3, 3, 27, 3, 5, 4, 2, 36, 5, 4, 1, 2, 5, 3, 2, 2, 10, 2, 54, 6, 12, + 5, 4, 4, 3, 3, 1, 1, 3, 11, 5, 1, 3, 2, 4, 15, 3, 2, 1, 4, 2, 2, 16, 6, 4, 4, 3, 3, 3, 3, 4, 4, 3, 2, 1, 16, 3, 3, 2, 4, 1, 9, + 3, 3, 3, 3, 1, 2, 1, 1, 1, 4, 2, 3, 1, 1, 182,8, 1, 2, 6, 3, 2, 12, 3, 2, 1, 1, 2, 17, 5, 6, 4, 4, 2, 8, 4, 16, 3, 2, 10, 9, 1, + 6, 3, 52, 4, 8, 8, 11, 2, 3, 8, 5, 5, 2, 3, 11, 8, 7, 20, 3, 3, 6, 2, 1, 4, 2, 2, 15, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 3, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 2, 1, 2, 3, 2, 1, 1, 1, 1, 15, 1, 1, 3, 2, 2, 7, 1, 1, 5, 3, 2, 2, + 1, 1, 13, 4, 3, 3, 2, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 3, 2, 2, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 5, 3, 2, 1, 1, 1, + 1, 1, 27, 1, 2, 4, 10, 2, 2, 2, 2, 2, 3, 1, 1, 1, 1, 1, 28, 2, 2, 8, 5, 4, 4, 4, 44, 2, 4, 3, 1, 1, 6, 2, 5, 2, 1, 11, 2, 2, 1, + 3, 5, 2, 2, 33, 12, 4, 6, 3, 8, 7, 4, 2, 3, 1, 2, 6, 2, 1, 2, 2, 20, 3, 1, 1, 2, 1, 12, 7, 4, 3, 3, 3, 3, 2, 2, 22, 1, 1, 8, 7, + 6, 1, 4, 3, 3, 3, 2, 2, 2, 6, 2, 2, 2, 1, 1, 63, 10, 2, 10, 23, 4, 2, 2, 1, 1, 1, 1, 15, 2, 7, 4, 8, 3, 1, 1, 1, 26, 6, 7, 4, 7, + 1, 3, 3, 1, 65, 4, 3, 3, 3, 22, 1, 3, 7, 3, 5, 14, 9, 2, 6, 5, 3, 5, 2, 1, 19, 10, 1, 3, 1, 8, 3, 9, 4, 2, 2, 3, 13, 7, 1, 2, 5, + 3, 8, 2, 4, 1, 3, 2, 3, 3, 2, 2, 28, 3, 21, 2, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 3, 3, 3, 6, 2, 1, 2, 2, 8, 4, 4, 2, 5, 2, 1, + 1, 1, 215,30, 1, 5, 5, 4, 3, 3, 2, 1, 7, 3, 3, 4, 6, 3, 1, 2, 1, 4, 33, 4, 3, 4, 7, 1, 10, 4, 3, 28, 9, 4, 1, 1, 3, 6, 17, 7, 5, + 3, 5, 1, 2, 2, 22, 6, 10, 9, 8, 8, 3, 8, 6, 4, 17, 7, 23, 8, 5, 6, 3, 3, 2, 2, 6, 3, 2, 38, 4, 2, 2, 1, 3, 2, 2, 7, 4, 2, 12, 10, + 7, 1, 1, 1, 18, 8, 4, 3, 5, 33, 3, 12, 1, 4, 3, 3, 2, 4, 5, 3, 2, 4, 4, 4, 2, 9, 7, 5, 4, 2, 18, 2, 5, 2, 2, 25, 17, 10, 2, 5, 1, + 1, 2, 43, 22, 5, 4, 4, 8, 8, 3, 3, 5, 4, 17, 3, 1, 3, 9, 2, 6, 2, 3, 3, 72, 12, 6, 2, 22, 4, 3, 15, 6, 4, 21, 12, 10, 8, 3, 4, 1, 1, + 8, 3, 8, 5, 17, 4, 1, 6, 3, 2, 8, 3, 5, 3, 2, 7, 2, 1, 1, 1, 2, 131,60, 5, 2, 1, 1, 2, 2, 2, 3, 3, 2, 11, 2, 1, 1, 3, 9, 2, 1, + 1, 14, 9, 4, 3, 2, 2, 1, 1, 2, 5, 1, 4, 1, 1, 2, 9, 2, 2, 9, 4, 9, 5, 2, 3, 3, 15, 3, 5, 2, 6, 3, 2, 1, 8, 3, 159,14, 6, 5, 1, + 3, 1, 1, 4, 2, 2, 2, 1, 1, 31, 1, 1, 1, 1, 1, 1, 1, 2, 8, 2, 2, 2, 6, 3, 3, 49, 9, 2, 2, 3, 2, 4, 9, 6, 3, 3, 3, 10, 7, 7, 7, + 2, 2, 2, 1, 7, 3, 7, 19, 4, 6, 5, 1, 1, 2, 1, 1, 8, 2, 1, 3, 66, 4, 1, 2, 2, 4, 3, 19, 8, 2, 6, 4, 9, 3, 2, 3, 1, 1, 18, 17, 2, + 5, 4, 104,22, 8, 3, 2, 2, 29, 2, 2, 1, 3, 4, 2, 3, 1, 4, 2, 4, 1, 1, 10, 8, 2, 2, 9, 2, 13, 2, 6, 5, 3, 6, 92, 7, 2, 1, 1, 10, 2, + 5, 2, 4, 1, 1, 5, 3, 2, 4, 9, 6, 4, 2, 13, 2, 5, 3, 1, 1, 6, 3, 4, 3, 4, 3, 11, 4, 2, 7, 4, 10, 8, 3, 3, 4, 12, 2, 2, 3, 2, 5, + 4, 3, 38, 1, 1, 1, 5, 1, 4, 2, 7, 3, 5, 5, 2, 10, 1, 1, 4, 3, 4, 4, 4, 4, 2, 1, 1, 5, 2, 58, 4, 10, 2, 1, 5, 5, 5, 18, 2, 4, 9, + 3, 10, 4, 2, 3, 60, 16, 2, 7, 16, 3, 13, 2, 2, 1, 5, 11, 2, 13, 2, 2, 3, 3, 3, 1, 1, 1, 1, 1, 18, 3, 6, 1, 1, 1, 6, 26, 3, 4, 4, 3, + 4, 3, 1, 1, 1, 7, 8, 3, 2, 3, 2, 4, 3, 2, 94, 34, 12, 6, 5, 2, 2, 2, 1, 4, 2, 3, 5, 1, 6, 1, 2, 25, 10, 2, 2, 1, 9, 2, 3, 1, 10, + 6, 1, 1, 1, 1, 1, 1, 1, 1, 51, 14, 11, 4, 4, 3, 4, 10, 4, 3, 2, 2, 1, 2, 40, 3, 17, 8, 4, 4, 3, 5, 14, 4, 5, 3, 89, 26, 7, 1, 3, 5, + 4, 4, 6, 18, 9, 3, 5, 3, 14, 3, 3, 3, 9, 4, 3, 7, 2, 3, 4, 5, 22, 1, 1, 4, 3, 6, 6, 6, 7, 6, 5, 4, 66, 17, 5, 2, 7, 3, 9, 3, 2, + 2, 14, 4, 1, 1, 1, 6, 3, 9, 5, 5, 2, 1, 1, 17, 10, 3, 3, 3, 2, 3, 75, 9, 5, 10, 2, 2, 2, 2, 4, 11, 9, 9, 9, 3, 3, 3, 12, 11, 7, 2, + 4, 4, 6, 3, 3, 16, 5, 4, 3, 8, 1, 1, 4, 2, 48, 4, 16, 2, 7, 3, 3, 2, 2, 15, 8, 5, 1, 3, 2, 1, 1, 37, 2, 2, 7, 6, 6, 6, 2, 5, 3, + 5, 1, 8, 3, 40, 4, 1, 2, 7, 2, 3, 6, 1, 1, 2, 6, 1, 2, 2, 51, 7, 3, 13, 6, 4, 10, 2, 4, 4, 5, 3, 33, 8, 6, 7, 7, 7, 7, 6, 1, 2, + 4, 2, 2, 2, 1, 4, 3, 3, 5, 2, 2, 5, 1, 29, 12, 9, 4, 3, 4, 6, 4, 2, 10, 1, 1, 1, 34, 4, 3, 1, 1, 6, 6, 2, 2, 2, 8, 3, 1, 1, 1, + 1, 1, 1, 1, 1, 6, 1, 1, 1, 2, 79, 2, 5, 4, 5, 6, 2, 4, 22, 4, 5, 3, 8, 3, 10, 6, 2, 2, 2, 16, 2, 5, 5, 2, 5, 3, 150,5, 3, 2, 26, + 20, 5, 9, 4, 57, 1, 1, 1, 7, 4, 8, 19, 4, 2, 7, 13, 7, 5, 3, 24, 6, 3, 8, 4, 20, 1, 1, 1, 1, 2, 4, 2, 3, 1, 1, 1, 1, 11, 8, 3, 14, + 4, 7, 2, 29, 2, 2, 1, 7, 3, 4, 3, 3, 86, 27, 20, 11, 10, 7, 11, 5, 2, 2, 17, 12, 7, 6, 4, 3, 2, 10, 3, 2, 9, 5, 4, 2, 4, 3, 8, 4, 3, + 3, 2, 4, 191,29, 2, 4, 10, 5, 3, 1, 1, 11, 2, 2, 17, 1, 5, 3, 1, 7, 4, 3, 10, 2, 2, 48, 11, 3, 2, 18, 4, 3, 6, 17, 3, 6, 14, 2, 14, 3, + 4, 3, 2, 2, 2, 6, 1, 2, 112,5, 1, 29, 14, 2, 2, 2, 1, 13, 5, 7, 3, 13, 6, 8, 7, 5, 2, 40, 5, 5, 5, 5, 4, 13, 8, 6, 5, 23, 7, 1, 2, + 1, 3, 11, 3, 2, 9, 5, 39, 3, 2, 5, 8, 5, 4, 6, 4, 23, 23, 4, 12, 5, 3, 7, 3, 3, 51, 9, 2, 2, 2, 7, 19, 3, 3, 3, 1, 5, 4, 7, 3, 2, + 4, 77, 8, 1, 4, 4, 13, 4, 4, 4, 4, 28, 16, 12, 7, 2, 2, 3, 3, 2, 7, 2, 4, 2, 4, 2, 2, 1, 146,5, 19, 8, 7, 6, 7, 4, 81, 6, 3, 3, 2, + 3, 56, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 2, 1, 14, 7, 4, 6, 3, 2, 1, 2, 1, 11, 6, 4, 2, 3, 11, 5, 27, 3, 2, 14, 3, 2, 17, 7, 7, 3, 6, + 5, 3, 7, 4, 44, 8, 5, 3, 2, 3, 4, 3, 2, 9, 2, 2, 2, 4, 17, 6, 4, 1, 3, 31, 3, 2, 2, 4, 2, 4, 2, 3, 2, 2, 37, 11, 9, 4, 4, 10, 2, + 3, 2, 1, 1, 1, 1, 7, 2, 1, 1, 5, 2, 2, 13, 4, 32, 1, 13, 3, 2, 4, 3, 3, 15, 2, 7, 10, 5, 2, 14, 3, 7, 19, 3, 3, 8, 5, 5, 5, 3, 3, + 82, 27, 5, 1, 1, 1, 1, 6, 2, 2, 1, 1, 7, 20, 2, 6, 2, 22, 2, 4, 2, 7, 4, 3, 4, 112,3, 75, 3, 67, 6, 4, 7, 3, 2, 7, 5, 4, 4, 4, 5, + 16, 3, 3, 3, 11, 1, 2, 2, 2, 1, 6, 6, 5, 5, 11, 1, 32, 1, 2, 2, 2, 1, 2, 3, 1, 4, 6, 3, 19, 18, 3, 3, 5, 2, 47, 5, 4, 2, 2, 2, 21, + 13, 12, 11, 8, 5, 5, 62, 3, 32, 6, 6, 6, 6, 6, 5, 7, 3, 5, 16, 6, 3, 4, 3, 26, 4, 7, 5, 1, 7, 4, 7, 2, 8, 43, 3, 3, 29, 3, 3, 3, 3, + 6, 1, 1, 1, 3, 2, 2, 1, 14, 5, 7, 28, 2, 21, 2, 2, 2, 2, 2, 2, 2, 114,4, 4, 20, 7, 33, 3, 22, 16, 7, 4, 3, 22, 3, 3, 6, 4, 2, 7, 5, + 2, 4, 1, 1, 29, 3, 9, 4, 13, 2, 5, 3, 4, 4, 5, 8, 116,2, 1, 4, 2, 8, 2, 1, 5, 3, 16, 3, 3, 2, 8, 4, 1, 38, 4, 7, 19, 6, 7, 3, 2, + 1, 1, 1, 1, 1, 1, 13, 3, 3, 2, 8, 3, 1, 1, 1, 1, 1, 1, 23, 9, 7, 6, 5, 3, 7, 1, 1, 3, 3, 1, 6, 2, 95, 6, 2, 2, 2, 2, 5, 2, 44, + 3, 3, 34, 2, 18, 7, 5, 3, 5, 3, 2, 1, 2, 3, 3, 5, 5, 5, 6, 121,1, 8, 13, 2, 7, 2, 3, 14, 3, 1, 3, 7, 5, 3, 9, 3, 2, 2, 1, 1, 1, + 1, 1, 1, 3, 3, 10, 5, 2, 17, 3, 1, 8, 3, 2, 2, 4, 7, 4, 2, 1, 5, 3, 1, 1, 3, 92, 11, 2, 5, 4, 12, 12, 2, 2, 3, 3, 9, 9, 2, 3, 8, + 4, 4, 4, 3, 3, 2, 2, 11, 6, 3, 27, 9, 1, 4, 2, 6, 3, 6, 3, 20, 5, 2, 3, 3, 1, 1, 61, 3, 4, 2, 3, 2, 18, 2, 5, 1, 3, 3, 11, 4, 2, + 2, 2, 2, 8, 4, 3, 2, 3, 5, 4, 2, 26, 4, 5, 3, 12, 3, 2, 2, 3, 2, 5, 5, 3, 2, 2, 131,4, 5, 5, 2, 3, 2, 4, 23, 1, 2, 12, 3, 3, 2, + 10, 2, 1, 15, 5, 4, 2, 3, 41, 3, 11, 2, 13, 5, 4, 9, 4, 3, 2, 6, 2, 3, 1, 6, 1, 3, 3, 3, 3, 97, 31, 2, 4, 5, 4, 7, 3, 3, 2, 2, 2, + 31, 5, 5, 3, 3, 11, 2, 4, 2, 10, 3, 6, 4, 12, 2, 5, 12, 3, 5, 1, 93, 2, 3, 15, 11, 2, 3, 11, 4, 20, 6, 2, 2, 9, 4, 3, 3, 3, 3, 6, 2, + 16, 3, 4, 3, 2, 3, 5, 1, 2, 2, 4, 47, 20, 3, 3, 3, 10, 4, 3, 3, 2, 10, 4, 3, 53, 2, 3, 4, 2, 23, 22, 6, 4, 8, 4, 3, 3, 9, 3, 3, 3, + 3, 64, 18, 8, 3, 3, 3, 3, 3, 11, 4, 3, 5, 5, 2, 4, 22, 11, 3, 5, 4, 3, 9, 5, 5, 2, 2, 63, 7, 4, 4, 2, 1, 1, 35, 3, 1, 1, 10, 4, 3, + 2, 3, 3, 1, 1, 4, 1, 5, 2, 2, 5, 3, 4, 12, 1, 2, 4, 2, 3, 33, 21, 4, 8, 7, 4, 4, 9, 4, 4, 4, 1, 197,35, 3, 3, 3, 5, 3, 1, 2, 13, + 7, 2, 2, 5, 4, 4, 3, 2, 12, 3, 4, 2, 1, 8, 3, 2, 3, 2, 27, 4, 2, 9, 5, 3, 1, 2, 9, 2, 5, 3, 2, 29, 9, 2, 3, 2, 2, 15, 2, 2, 6, + 6, 1, 20, 1, 4, 2, 3, 2, 34, 15, 5, 2, 9, 2, 3, 6, 2, 3, 29, 5, 5, 11, 6, 3, 4, 3, 2, 2, 6, 3, 3, 14, 8, 1, 2, 2, 2, 2, 2, 2, 37, + 11, 1, 2, 3, 3, 1, 18, 2, 3, 9, 3, 3, 2, 1, 2, 2, 2, 144,14, 2, 2, 72, 7, 2, 8, 4, 2, 13, 8, 4, 20, 4, 3, 7, 3, 8, 3, 2, 43, 4, 4, + 2, 3, 3, 4, 20, 9, 2, 2, 1, 4, 4, 2, 1, 2, 8, 3, 2, 71, 34, 2, 2, 1, 3, 2, 3, 7, 5, 5, 9, 2, 2, 4, 3, 3, 2, 24, 5, 3, 3, 3, 3, + 2, 5, 3, 5, 2, 75, 25, 4, 11, 4, 3, 2, 2, 9, 3, 4, 2, 18, 4, 2, 9, 9, 3, 4, 4, 6, 2, 4, 4, 17, 5, 4, 10, 4, 3, 72, 18, 4, 33, 6, 8, + 4, 6, 5, 2, 1, 13, 6, 3, 3, 3, 2, 6, 1, 4, 24, 4, 3, 2, 5, 14, 5, 1, 7, 2, 3, 2, 31, 31, 9, 4, 2, 6, 3, 15, 2, 5, 4, 3, 21, 7, 6, + 1, 1, 3, 1, 5, 2, 18, 6, 4, 2, 1, 5, 3, 2, 5, 3, 1, 15, 4, 2, 1, 1, 3, 3, 4, 2, 2, 12, 5, 4, 2, 21, 7, 2, 3, 7, 5, 2, 3, 3, 2, + 15, 8, 2, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 101,6, 5, 16, 9, 7, 2, 2, 2, 6, 7, 25, 5, 3, 7, 6, 6, 2, 3, 8, 3, 15, 1, 7, 7, 11, + 1, 1, 1, 3, 49, 4, 3, 4, 28, 17, 14, 14, 7, 5, 1, 1, 4, 8, 4, 4, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 169,18, 9, 3, 4, 4, 2, 7, 4, + 3, 18, 2, 2, 2, 3, 4, 82, 23, 2, 2, 4, 1, 1, 1, 2, 26, 11, 8, 6, 3, 2, 1, 1, 6, 6, 1, 9, 6, 6, 2, 2, 2, 2, 2, 4, 4, 10, 4, 2, 7, + 8, 2, 5, 5, 51, 4, 3, 2, 5, 2, 5, 4, 7, 5, 10, 4, 4, 1, 3, 3, 88, 53, 4, 4, 3, 2, 2, 4, 3, 2, 1, 7, 3, 3, 4, 1, 1, 7, 4, 8, 5, + 2, 4, 3, 3, 3, 3, 9, 3, 4, 5, 4, 6, 2, 4, 3, 2, 46, 8, 3, 3, 3, 2, 8, 3, 2, 2, 11, 3, 2, 3, 79, 3, 4, 4, 5, 3, 5, 22, 9, 4, 4, + 4, 20, 7, 3, 3, 5, 4, 3, 1, 1, 1, 4, 2, 1, 5, 2, 6, 2, 2, 38, 2, 2, 1, 2, 22, 5, 4, 3, 3, 3, 6, 3, 2, 1, 1, 1, 1, 1, 1, 8, 10, + 9, 6, 3, 3, 1, 1, 8, 20, 8, 5, 3, 4, 3, 2, 40, 3, 4, 3, 7, 15, 10, 8, 5, 2, 52, 7, 12, 4, 14, 14, 2, 5, 4, 32, 2, 2, 15, 9, 1, 1, 1, + 1, 1, 1, 3, 3, 8, 2, 2, 5, 12, 5, 2, 9, 6, 5, 58, 11, 7, 6, 4, 3, 3, 6, 5, 2, 29, 5, 5, 19, 5, 3, 2, 12, 7, 5, 2, 1, 245,19, 5, 2, + 2, 3, 14, 6, 2, 52, 17, 8, 3, 15, 2, 2, 11, 3, 3, 2, 22, 2, 2, 3, 3, 12, 5, 1, 1, 1, 2, 1, 1, 13, 2, 5, 3, 2, 4, 4, 2, 16, 6, 5, 3, + 12, 1, 1, 2, 2, 2, 3, 24, 3, 3, 2, 5, 2, 2, 2, 32, 5, 5, 9, 1, 6, 8, 4, 3, 3, 7, 3, 2, 4, 3, 2, 2, 2, 2, 17, 2, 8, 61, 10, 2, 5, + 4, 3, 3, 14, 6, 5, 3, 3, 8, 6, 6, 2, 2, 4, 10, 3, 1, 11, 10, 4, 6, 4, 12, 4, 3, 11, 1, 1, 8, 2, 2, 42, 4, 9, 6, 2, 2, 3, 6, 3, 2, + 2, 1, 1, 2, 9, 3, 1, 1, 2, 2, 17, 4, 6, 28, 5, 15, 14, 6, 4, 1, 3, 10, 1, 1, 37, 3, 28, 6, 4, 3, 4, 4, 18, 8, 3, 2, 14, 4, 2, 4, 5, + 5, 142,3, 7, 3, 3, 4, 2, 2, 11, 2, 4, 2, 2, 1, 1, 4, 3, 10, 4, 1, 1, 11, 4, 3, 3, 3, 2, 15, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 1, + 1, 1, 1, 1, 1, 2, 2, 1, 1, 52, 10, 17, 5, 4, 4, 7, 3, 2, 2, 2, 15, 4, 6, 2, 15, 5, 3, 2, 3, 1, 1, 239,73, 7, 7, 7, 7, 3, 1, 1, 29, + 2, 11, 4, 4, 4, 4, 4, 3, 3, 3, 8, 2, 2, 6, 6, 6, 6, 4, 4, 1, 1, 8, 8, 5, 5, 6, 5, 5, 3, 4, 1, 1, 2, 3, 2, 1, 1, 26, 3, 1, 12, + 11, 5, 3, 1, 1, 43, 4, 1, 1, 1, 1, 1, 2, 4, 3, 20, 16, 6, 3, 3, 3, 2, 1, 1, 2, 1, 7, 7, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 9, 2, + 2, 2, 7, 1, 36, 6, 6, 1, 1, 1, 1, 26, 2, 11, 10, 9, 7, 5, 5, 5, 3, 1, 6, 2, 18, 7, 4, 3, 4, 11, 3, 3, 17, 4, 2, 5, 4, 3, 2, 1, 1, + 1, 1, 1, 6, 2, 2, 14, 13, 12, 8, 6, 24, 1, 2, 15, 14, 5, 5, 3, 2, 3, 18, 2, 2, 1, 10, 4, 2, 2, 3, 1, 1, 10, 4, 2, 3, 1, 7, 2, 3, 2, + 1, 23, 7, 5, 4, 1, 3, 3, 3, 1, 2, 10, 4, 2, 4, 2, 2, 1, 4, 2, 123,58, 33, 31, 2, 18, 2, 5, 3, 2, 2, 37, 5, 29, 2, 5, 6, 6, 2, 4, 15, + 4, 3, 1, 1, 1, 1, 1, 1, 3, 3, 6, 3, 40, 1, 21, 6, 12, 2, 3, 6, 5, 2, 2, 1, 80, 80, 4, 1, 3, 1, 9, 5, 4, 2, 2, 2, 10, 1, 6, 2, 2, + 2, 2, 2, 2, 2, 1, 3, 1, 1, 1, 2, 2, 3, 2, 2, 1, 1, 1, 3, 2, 5, 1, 1, 1, 5, 1, 1, 1, 2, 2, 2, 2, 7, 3, 1, 3, 3, 2, 2, 2, 3, + 14, 1, 1, 1, 5, 5, 5, 2, 1, 1, 3, 2, 2, 3, 3, 105,2, 2, 2, 33, 3, 5, 4, 23, 22, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 3, 3, 3, 3, 3, + 2, 3, 3, 3, 8, 6, 3, 7, 1, 5, 4, 2, 2, 10, 2, 2, 2, 2, 6, 3, 1, 9, 3, 2, 4, 52, 4, 3, 1, 1, 3, 2, 2, 1, 1, 12, 3, 1, 3, 1, 3, + 15, 2, 4, 1, 3, 10, 3, 2, 2, 4, 2, 50, 2, 2, 3, 10, 10, 3, 3, 7, 5, 3, 3, 6, 4, 11, 11, 8, 8, 5, 3, 35, 23, 5, 4, 2, 2, 12, 2, 4, 3, + 3, 2, 4, 4, 3, 106,10, 51, 10, 8, 3, 5, 4, 7, 5, 4, 4, 7, 3, 5, 12, 5, 4, 3, 2, 10, 7, 26, 2, 2, 13, 5, 2, 3, 14, 2, 2, 5, 3, 15, 6, + 3, 3, 29, 2, 4, 2, 6, 4, 6, 1, 2, 2, 7, 2, 5, 41, 4, 3, 25, 17, 5, 11, 8, 2, 3, 25, 6, 4, 3, 4, 3, 1, 139,13, 4, 6, 2, 38, 3, 11, 3, + 5, 5, 16, 1, 1, 2, 2, 3, 2, 48, 4, 4, 6, 7, 8, 8, 3, 5, 2, 8, 3, 9, 4, 2, 5, 5, 18, 3, 7, 2, 1, 1, 1, 1, 7, 3, 3, 6, 2, 4, 2, + 2, 5, 4, 3, 3, 29, 4, 5, 10, 1, 1, 6, 5, 28, 3, 1, 1, 1, 1, 10, 3, 2, 16, 5, 8, 4, 2, 27, 3, 7, 3, 2, 2, 3, 1, 1, 1, 55, 1, 3, 4, + 2, 2, 2, 3, 2, 5, 3, 3, 19, 9, 8, 3, 5, 3, 1, 2, 17, 4, 2, 4, 3, 2, 4, 2, 2, 79, 6, 5, 5, 5, 3, 3, 11, 2, 5, 23, 8, 5, 8, 3, 3, + 17, 2, 10, 8, 8, 3, 2, 2, 13, 3, 3, 36, 3, 14, 1, 2, 3, 3, 3, 2, 1, 2, 14, 6, 23, 8, 4, 5, 2, 11, 2, 4, 3, 3, 3, 20, 5, 16, 3, 9, 5, + 2, 1, 4, 3, 2, 9, 2, 1, 2, 2, 2, 2, 110,42, 9, 4, 3, 3, 5, 2, 3, 6, 3, 3, 7, 5, 2, 3, 2, 9, 4, 11, 3, 3, 3, 3, 2, 3, 8, 4, 3, + 3, 3, 8, 5, 2, 4, 2, 1, 1, 3, 3, 15, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 4, 4, 4, 4, 4, 3, 31, 9, 3, 3, 3, 4, + 4, 3, 2, 3, 1, 2, 2, 2, 2, 9, 2, 2, 7, 1, 1, 1, 4, 2, 2, 1, 1, 1, 1, 1, 7, 3, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 19, 4, 11, 2, 2, + 1, 8, 5, 4, 2, 2, 2, 2, 1, 30, 12, 3, 3, 2, 2, 3, 3, 3, 2, 2, 20, 6, 2, 2, 2, 2, 2, 2, 3, 6, 2, 2, 2, 4, 4, 4, 4, 4, 2, 2, 11, + 3, 4, 3, 7, 1, 4, 3, 3, 6, 5, 2, 3, 5, 3, 3, 3, 4, 2, 2, 1, 1, 1, 1, 1, 13, 3, 8, 5, 5, 5, 5, 5, 5, 5, 48, 5, 1, 17, 3, 5, 5, + 6, 4, 3, 2, 2, 2, 3, 3, 2, 4, 3, 2, 7, 44, 6, 5, 4, 6, 6, 5, 2, 2, 14, 3, 1, 6, 3, 7, 11, 5, 5, 5, 5, 5, 5, 4, 4, 4, 2, 117,4, + 2, 16, 16, 8, 5, 2, 11, 5, 3, 2, 6, 7, 3, 3, 3, 3, 3, 3, 3, 11, 3, 2, 5, 1, 1, 17, 4, 4, 2, 1, 9, 2, 2, 26, 3, 12, 5, 4, 4, 2, 2, + 4, 2, 2, 3, 3, 10, 2, 3, 2, 2, 19, 6, 29, 23, 3, 2, 2, 2, 5, 3, 2, 2, 2, 2, 3, 2, 1, 1, 1, 27, 6, 3, 3, 2, 1, 5, 2, 6, 3, 9, 1, + 1, 1, 4, 2, 1, 1, 1, 6, 1, 2, 1, 20, 8, 5, 4, 2, 2, 1, 1, 1, 1, 2, 24, 1, 1, 1, 1, 1, 2, 10, 7, 6, 4, 4, 1, 2, 1, 8, 2, 2, 2, + 3, 2, 1, 18, 2, 1, 1, 4, 5, 1, 35, 4, 3, 3, 18, 17, 11, 2, 2, 40, 4, 2, 5, 2, 2, 9, 3, 2, 16, 2, 4, 4, 4, 3, 1, 1, 1, 1, 1, 1, 3, + 1, 1, 119,7, 1, 3, 2, 1, 1, 58, 13, 32, 9, 9, 19, 13, 8, 8, 6, 2, 20, 3, 1, 3, 3, 17, 15, 10, 2, 2, 2, 34, 6, 2, 3, 5, 3, 4, 4, 5, 13, + 1, 8, 3, 30, 7, 2, 2, 4, 2, 3, 2, 3, 2, 2, 4, 63, 27, 3, 2, 10, 7, 4, 3, 4, 5, 7, 3, 2, 2, 8, 4, 30, 3, 14, 7, 4, 4, 3, 2, 2, 11, + 4, 2, 5, 2, 1, 10, 2, 170,12, 4, 2, 20, 3, 6, 2, 3, 4, 23, 3, 10, 6, 3, 23, 17, 6, 4, 5, 3, 2, 48, 15, 2, 8, 2, 3, 7, 6, 4, 11, 4, 13, + 5, 2, 2, 4, 10, 3, 2, 2, 4, 1, 1, 2, 2, 45, 1, 1, 4, 2, 9, 9, 8, 3, 2, 9, 5, 6, 3, 4, 1, 4, 1, 1, 1, 45, 2, 2, 4, 4, 3, 2, 15, + 9, 8, 5, 9, 7, 3, 3, 4, 22, 2, 2, 5, 2, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 39, 10, 5, 10, 2, 4, 7, 3, 49, 2, 1, 3, 2, 2, 7, 33, 7, 2, + 4, 3, 6, 1, 4, 4, 38, 8, 5, 2, 16, 9, 2, 2, 2, 2, 35, 8, 6, 5, 2, 8, 7, 6, 3, 53, 40, 36, 6, 3, 4, 2, 2, 2, 12, 4, 1, 4, 75, 11, 2, + 2, 2, 2, 3, 2, 2, 2, 8, 3, 5, 5, 2, 8, 5, 1, 4, 2, 4, 3, 5, 2, 2, 1, 1, 1, 1, 1, 15, 4, 2, 2, 9, 9, 6, 2, 1, 1, 1, 1, 1, 1, + 1, 11, 2, 5, 5, 1, 10, 7, 2, 34, 3, 6, 2, 3, 5, 12, 8, 7, 3, 200,45, 1, 10, 5, 2, 8, 3, 15, 5, 4, 2, 3, 1, 2, 72, 3, 2, 1, 1, 5, 3, + 2, 4, 1, 3, 2, 2, 8, 5, 4, 2, 3, 3, 3, 3, 1, 1, 15, 2, 7, 3, 11, 1, 1, 1, 2, 3, 2, 2, 2, 4, 1, 1, 6, 6, 5, 4, 3, 4, 14, 2, 6, + 3, 2, 4, 2, 1, 16, 1, 1, 7, 4, 6, 2, 1, 4, 1, 7, 4, 2, 3, 3, 2, 3, 4, 7, 6, 6, 6, 6, 5, 143,8, 6, 7, 2, 1, 3, 6, 4, 8, 2, 2, + 43, 4, 3, 7, 3, 5, 5, 3, 2, 2, 9, 4, 2, 3, 2, 1, 3, 30, 2, 2, 12, 3, 3, 18, 1, 1, 13, 9, 1, 1, 18, 5, 5, 5, 4, 2, 2, 69, 6, 6, 13, + 4, 5, 3, 11, 4, 2, 4, 3, 5, 8, 4, 5, 4, 4, 20, 5, 8, 3, 3, 3, 2, 1, 2, 60, 2, 2, 2, 3, 13, 3, 9, 3, 7, 7, 3, 42, 22, 18, 3, 1, 1, + 4, 12, 9, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 3, 38, 4, 2, 1, 4, 6, 10, 2, 2, 2, 5, 13, 5, 3, 3, 8, 3, 2, 12, 7, 7, 6, 3, 27, 4, 3, 9, + 5, 26, 24, 6, 7, 3, 7, 2, 2, 1, 1, 42, 4, 3, 7, 2, 24, 2, 16, 5, 4, 6, 3, 11, 4, 44, 9, 5, 1, 1, 10, 3, 3, 12, 3, 6, 4, 131,4, 5, 1, + 20, 5, 3, 2, 4, 3, 9, 1, 3, 14, 2, 4, 10, 3, 5, 1, 10, 6, 4, 4, 7, 7, 4, 3, 3, 23, 3, 2, 2, 6, 4, 2, 19, 4, 2, 2, 5, 2, 2, 1, 1, + 2, 158,10, 1, 1, 2, 3, 3, 3, 3, 9, 1, 33, 1, 1, 2, 2, 2, 27, 26, 7, 6, 5, 5, 2, 2, 4, 5, 3, 22, 5, 3, 3, 10, 8, 8, 48, 2, 2, 2, 34, + 5, 9, 3, 6, 6, 5, 3, 5, 3, 3, 3, 3, 21, 7, 3, 3, 4, 2, 2, 4, 2, 118,23, 2, 8, 3, 3, 6, 30, 22, 11, 10, 9, 3, 1, 17, 3, 8, 26, 12, 6, + 2, 4, 2, 2, 14, 10, 3, 2, 29, 3, 9, 15, 9, 1, 2, 24, 7, 4, 4, 2, 1, 8, 3, 19, 7, 4, 3, 29, 8, 2, 2, 2, 5, 3, 1, 1, 1, 7, 4, 5, 3, + 17, 1, 1, 3, 1, 1, 1, 1, 60, 8, 9, 2, 3, 3, 3, 1, 2, 1, 4, 1, 1, 2, 3, 1, 3, 9, 2, 4, 2, 2, 6, 2, 23, 1, 2, 1, 1, 2, 2, 2, 3, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 2, 1, 1, 1, 1, 16, 1, 2, 2, 1, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 2, 1, 1, 9, 2, + 1, 2, 1, 2, 2, 42, 5, 5, 1, 1, 13, 5, 3, 2, 3, 17, 9, 3, 2, 4, 3, 3, 41, 3, 2, 2, 2, 11, 2, 1, 1, 1, 1, 5, 5, 2, 3, 7, 3, 3, 1, + 24, 5, 5, 4, 4, 2, 2, 1, 5, 3, 3, 1, 1, 3, 3, 2, 2, 23, 20, 2, 8, 6, 3, 1, 33, 2, 15, 5, 3, 3, 3, 4, 4, 3, 2, 2, 27, 10, 2, 5, 5, + 4, 3, 2, 2, 2, 10, 3, 2, 2, 2, 2, 2, 2, 9, 3, 1, 1, 1, 1, 10, 4, 3, 2, 3, 3, 13, 2, 4, 1, 1, 205,8, 3, 3, 4, 2, 10, 5, 4, 2, 2, + 6, 3, 2, 8, 4, 3, 5, 7, 3, 53, 12, 4, 2, 16, 9, 2, 2, 21, 3, 11, 3, 3, 2, 2, 8, 2, 3, 77, 75, 1, 1, 8, 1, 1, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 1, 1, 4, 2, 1, 2, 2, 6, 3, 2, 2, 2, 4, 3, 2, 2, 2, 2, 1, 30, 4, 21, 2, 1, 9, 8, 4, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 5, + 2, 5, 1, 1, 1, 2, 1, 1, 1, 8, 3, 3, 2, 32, 9, 2, 11, 4, 3, 3, 144,5, 21, 14, 28, 4, 6, 3, 1, 6, 3, 2, 2, 2, 5, 7, 19, 8, 7, 7, 3, + 5, 11, 4, 3, 17, 5, 2, 2, 5, 5, 5, 8, 3, 1, 1, 1, 4, 3, 5, 4, 3, 155,33, 3, 2, 7, 3, 1, 2, 4, 3, 4, 1, 2, 10, 5, 3, 4, 3, 3, 3, + 17, 10, 9, 4, 4, 8, 3, 1, 1, 1, 1, 3, 9, 2, 4, 4, 3, 4, 11, 11, 6, 24, 5, 3, 10, 4, 3, 2, 1, 1, 1, 1, 6, 2, 2, 8, 3, 2, 5, 2, 3, + 220,8, 2, 33, 10, 5, 4, 7, 2, 1, 1, 4, 6, 2, 4, 4, 2, 1, 1, 1, 1, 14, 1, 4, 13, 2, 2, 3, 45, 31, 1, 4, 8, 7, 3, 1, 1, 1, 1, 5, 1, + 1, 3, 3, 22, 10, 6, 2, 1, 3, 3, 3, 2, 3, 2, 1, 21, 10, 6, 1, 1, 5, 1, 45, 29, 3, 18, 17, 4, 3, 5, 3, 3, 2, 2, 77, 19, 2, 3, 3, 3, 1, + 1, 1, 2, 4, 13, 4, 2, 3, 3, 2, 2, 10, 5, 2, 4, 3, 2, 2, 1, 1, 1, 11, 1, 2, 6, 5, 4, 1, 1, 1, 1, 1, 1, 1, 6, 2, 18, 6, 4, 4, 4, + 4, 3, 5, 4, 1, 1, 7, 5, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 226,2, 3, 7, 2, 2, 1, 8, 4, 2, 15, 5, 3, 3, 8, 1, 1, 1, 1, 1, + 1, 6, 11, 3, 2, 4, 3, 2, 3, 9, 2, 1, 3, 2, 1, 1, 1, 1, 1, 1, 1, 10, 1, 5, 1, 1, 3, 2, 2, 17, 4, 3, 2, 7, 6, 1, 1, 1, 1, 3, 13, + 4, 2, 4, 1, 1, 1, 1, 2, 1, 1, 10, 3, 2, 2, 2, 2, 7, 4, 4, 4, 2, 2, 30, 2, 4, 6, 3, 3, 1, 1, 6, 3, 40, 2, 3, 6, 1, 5, 1, 3, 3, + 3, 21, 9, 9, 5, 10, 5, 2, 15, 9, 4, 2, 4, 2, 2, 2, 2, 2, 2, 1, 1, 8, 3, 1, 1, 1, 7, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 10, 33, 6, 3, 2, 1, 3, 6, 8, 1, 2, 38, 3, 2, 3, 12, 2, 1, 1, 2, 1, 6, 5, 5, 4, 3, 3, 2, 3, 1, 1, 49, 4, 15, 2, 4, 3, 2, + 13, 4, 1, 4, 2, 2, 11, 3, 3, 11, 2, 6, 2, 65, 23, 1, 1, 1, 1, 5, 5, 13, 5, 2, 2, 2, 4, 2, 5, 2, 3, 2, 1, 6, 2, 28, 8, 3, 4, 2, 3, + 3, 2, 39, 3, 8, 4, 3, 1, 7, 2, 4, 4, 16, 7, 3, 2, 3, 41, 22, 1, 5, 2, 2, 3, 4, 3, 5, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 25, 3, 3, + 2, 4, 3, 6, 2, 1, 57, 10, 2, 3, 7, 2, 1, 1, 14, 2, 5, 8, 2, 2, 1, 99, 5, 9, 10, 3, 3, 3, 5, 3, 6, 4, 11, 4, 5, 20, 3, 1, 2, 2, 2, + 2, 2, 5, 2, 1, 1, 1, 1, 4, 2, 4, 2, 15, 2, 1, 1, 1, 1, 2, 1, 3, 2, 2, 2, 2, 2, 9, 4, 46, 4, 4, 3, 3, 2, 2, 4, 3, 3, 2, 11, 9, + 6, 10, 3, 1, 1, 3, 5, 1, 1, 1, 3, 2, 116,16, 2, 2, 1, 1, 1, 4, 4, 4, 14, 8, 8, 6, 5, 1, 1, 12, 3, 3, 7, 3, 3, 3, 7, 3, 2, 3, 1, + 5, 2, 24, 12, 1, 1, 11, 9, 1, 11, 8, 7, 4, 3, 104,6, 4, 15, 12, 11, 2, 3, 10, 3, 2, 8, 3, 8, 3, 2, 5, 2, 14, 4, 3, 3, 25, 4, 2, 5, 10, + 6, 4, 3, 3, 3, 2, 155,43, 3, 2, 18, 4, 8, 2, 2, 12, 8, 5, 3, 3, 1, 7, 3, 20, 16, 12, 3, 33, 23, 23, 18, 18, 11, 6, 2, 1, 1, 1, 1, 6, 3, + 4, 1, 1, 6, 4, 6, 27, 26, 17, 15, 9, 7, 5, 1, 2, 48, 1, 1, 1, 11, 1, 8, 7, 5, 9, 2, 2, 8, 5, 4, 1, 7, 7, 4, 2, 75, 28, 4, 15, 4, 3, + 7, 4, 11, 3, 22, 12, 12, 10, 2, 7, 3, 3, 3, 2, 2, 4, 12, 5, 3, 2, 17, 8, 3, 1, 1, 1, 30, 15, 14, 1, 6, 4, 3, 2, 7, 1, 3, 2, 17, 3, 1, + 1, 1, 1, 1, 1, 3, 1, 6, 1, 3, 21, 2, 9, 1, 1, 6, 5, 5, 4, 1, 1, 1, 1, 1, 1, 2, 10, 1, 3, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 52, 3, 13, 5, 3, 2, 2, 2, 2, 3, 3, 3, 3, 12, 2, 1, 1, 4, 6, 2, 23, 2, 6, 2, 1, 2, 2, 2, 3, 3, 5, 1, 1, 1, 1, 1, + 1, 4, 2, 43, 2, 8, 8, 8, 6, 6, 3, 12, 3, 2, 2, 11, 11, 3, 3, 3, 3, 1, 1, 2, 2, 2, 2, 26, 3, 1, 1, 1, 7, 5, 4, 4, 4, 4, 3, 1, 2, + 4, 1, 57, 27, 1, 1, 2, 2, 1, 1, 5, 8, 8, 3, 9, 2, 4, 3, 5, 7, 1, 3, 2, 2, 62, 11, 9, 6, 4, 1, 1, 1, 1, 2, 13, 6, 5, 7, 5, 4, 10, + 9, 21, 3, 4, 3, 7, 6, 12, 2, 1, 1, 2, 3, 74, 13, 5, 3, 3, 4, 15, 3, 1, 12, 11, 11, 6, 5, 5, 2, 10, 4, 12, 3, 2, 4, 2, 6, 2, 2, 2, 4, + 2, 7, 1, 1, 3, 2, 40, 3, 3, 18, 5, 4, 3, 3, 8, 5, 39, 8, 4, 2, 15, 3, 2, 5, 4, 4, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 3, 2, 13, 3, 3, 3, 42, 6, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 5, 3, 2, 2, 4, 3, 12, 2, 6, 6, 4, 2, + 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 3, 2, 2, 29, 4, 1, 3, 2, 8, 3, 3, 2, 5, 2, 2, 8, 2, 1, 6, 6, 43, 3, 2, 5, 5, 2, 3, 2, 8, 4, 56, + 4, 2, 2, 4, 14, 6, 2, 1, 23, 7, 4, 2, 5, 4, 3, 68, 4, 2, 4, 1, 11, 8, 8, 3, 3, 3, 1, 2, 1, 2, 1, 3, 16, 5, 4, 4, 4, 9, 7, 7, 7, + 2, 2, 5, 143,12, 4, 3, 1, 1, 1, 1, 1, 2, 9, 6, 1, 1, 2, 1, 1, 4, 3, 2, 5, 4, 3, 11, 6, 2, 3, 2, 4, 53, 3, 2, 50, 1, 1, 3, 3, 3, + 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 5, 5, 5, 4, 2, 8, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 1, 9, 4, 4, 4, 4, 3, 3, 3, 10, + 4, 4, 4, 4, 3, 3, 3, 3, 3, 9, 2, 2, 3, 2, 19, 17, 10, 9, 7, 2, 5, 3, 2, 3, 2, 51, 8, 3, 25, 17, 2, 2, 1, 1, 1, 5, 1, 1, 13, 6, 3, + 208,5, 26, 3, 7, 6, 2, 4, 3, 5, 5, 10, 3, 2, 7, 7, 3, 1, 1, 9, 4, 2, 2, 2, 2, 4, 2, 9, 5, 4, 4, 2, 2, 3, 2, 2, 14, 4, 2, 4, 2, + 16, 6, 2, 5, 4, 3, 6, 4, 3, 2, 13, 7, 7, 7, 5, 4, 1, 1, 1, 1, 1, 1, 2, 2, 49, 1, 3, 3, 3, 3, 1, 3, 2, 2, 2, 3, 3, 1, 1, 5, 4, + 4, 4, 6, 3, 2, 6, 2, 3, 11, 8, 4, 3, 3, 2, 1, 7, 6, 6, 5, 2, 2, 2, 10, 5, 3, 11, 2, 3, 2, 4, 2, 1, 1, 23, 1, 1, 1, 1, 1, 3, 2, + 1, 1, 1, 3, 2, 2, 1, 2, 1, 1, 7, 37, 1, 10, 1, 1, 1, 2, 1, 2, 1, 3, 2, 5, 11, 4, 5, 24, 5, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, + 1, 1, 1, 1, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 16, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 18, 6, 4, 2, 1, 7, 4, 199,10, 6, 4, 4, 3, 25, 2, 2, 2, 1, 2, 2, 4, 2, 3, 2, 26, 5, 3, 16, 15, 5, 4, 61, 5, 4, 3, 2, 1, 1, 1, 1, 14, + 7, 1, 2, 4, 15, 3, 6, 9, 8, 4, 1, 2, 66, 1, 49, 17, 4, 4, 19, 5, 5, 4, 3, 4, 4, 2, 3, 5, 4, 3, 1, 2, 9, 4, 2, 97, 6, 2, 22, 3, 3, + 3, 13, 11, 2, 2, 4, 1, 1, 1, 1, 4, 3, 3, 3, 2, 3, 6, 16, 3, 3, 4, 7, 4, 6, 2, 6, 1, 9, 1, 1, 8, 1, 4, 3, 3, 3, 5, 3, 3, 1, 1, + 1, 2, 2, 5, 1, 1, 2, 81, 7, 5, 4, 11, 4, 6, 53, 2, 1, 47, 5, 2, 2, 2, 3, 1, 3, 3, 4, 2, 4, 3, 2, 6, 6, 5, 5, 2, 2, 7, 1, 5, 4, + 1, 13, 4, 2, 5, 5, 2, 2, 3, 1, 82, 6, 10, 1, 16, 12, 7, 15, 9, 2, 2, 28, 19, 15, 4, 4, 2, 4, 3, 2, 25, 3, 1, 3, 6, 26, 2, 1, 4, 2, 2, + 2, 3, 4, 3, 50, 1, 1, 1, 1, 13, 5, 4, 8, 7, 4, 3, 5, 5, 4, 4, 4, 3, 5, 3, 19, 2, 1, 13, 2, 12, 2, 3, 3, 1, 4, 4, 4, 3, 53, 3, 1, + 1, 18, 14, 2, 3, 2, 3, 1, 11, 5, 3, 1, 1, 2, 4, 2, 1, 1, 1, 3, 51, 3, 3, 5, 1, 3, 17, 4, 4, 9, 1, 1, 1, 1, 3, 1, 1, 5, 2, 2, 2, + 7, 1, 6, 2, 2, 16, 4, 10, 8, 1, 12, 6, 4, 2, 2, 1, 1, 1, 20, 1, 1, 2, 1, 3, 1, 3, 1, 2, 1, 2, 2, 2, 1, 5, 1, 4, 10, 1, 1, 2, 1, + 4, 3, 3, 2, 1, 11, 10, 2, 3, 1, 37, 3, 5, 4, 3, 13, 10, 3, 7, 5, 4, 3, 5, 24, 3, 4, 5, 2, 3, 4, 4, 21, 3, 4, 2, 1, 4, 19, 7, 2, 2, + 3, 3, 10, 2, 2, 2, 20, 4, 4, 4, 5, 4, 6, 1, 1, 3, 2, 17, 3, 2, 6, 4, 49, 44, 43, 4, 4, 2, 11, 3, 3, 9, 2, 3, 3, 2, 2, 1, 1, 1, 5, + 47, 7, 6, 6, 9, 5, 5, 5, 10, 5, 2, 5, 2, 1, 40, 11, 4, 3, 5, 3, 2, 2, 16, 14, 11, 3, 77, 6, 1, 1, 1, 3, 9, 1, 1, 1, 7, 4, 3, 1, 1, + 1, 1, 1, 1, 3, 3, 3, 3, 3, 5, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 3, 1, 1, 3, 1, 2, 3, 1, 1, 1, 2, 2, 2, 2, 1, 6, 3, 2, + 1, 1, 3, 2, 7, 1, 1, 2, 3, 3, 1, 1, 1, 1, 4, 3, 1, 2, 7, 3, 1, 2, 2, 2, 1, 2, 2, 1, 3, 1, 2, 40, 4, 4, 11, 4, 1, 1, 1, 7, 6, + 5, 4, 3, 7, 2, 7, 5, 4, 3, 1, 8, 2, 1, 1, 1, 8, 4, 3, 7, 3, 47, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 9, 4, 3, 1, 3, 6, + 6, 4, 3, 4, 2, 4, 1, 1, 12, 4, 1, 1, 1, 2, 5, 2, 9, 5, 7, 3, 33, 27, 13, 7, 11, 5, 2, 16, 3, 7, 1, 15, 1, 1, 6, 3, 3, 3, 73, 4, 66, + 1, 6, 1, 1, 3, 2, 2, 3, 2, 7, 2, 2, 11, 4, 4, 4, 2, 2, 6, 4, 2, 3, 3, 5, 5, 4, 3, 1, 11, 3, 5, 5, 4, 2, 10, 2, 5, 3, 1, 53, 4, + 2, 2, 12, 2, 2, 1, 2, 2, 2, 2, 1, 2, 1, 2, 1, 1, 3, 12, 2, 2, 8, 3, 116,4, 2, 19, 4, 7, 4, 1, 1, 1, 1, 10, 3, 3, 2, 17, 2, 3, 6, + 6, 5, 1, 1, 2, 2, 22, 7, 5, 2, 2, 2, 10, 2, 1, 4, 4, 4, 3, 2, 13, 5, 4, 4, 3, 3, 2, 2, 1, 1, 2, 2, 28, 2, 1, 1, 3, 1, 4, 8, 5, + 5, 5, 81, 15, 3, 2, 3, 28, 19, 5, 3, 7, 5, 5, 4, 3, 1, 1, 1, 2, 1, 19, 5, 4, 4, 14, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 4, 1, 1, 2, 38, 1, 12, 3, 5, 6, 2, 6, 2, 2, 1, 2, 1, 1, 1, 2, 8, 7, 2, 3, 4, 1, 2, 1, 4, 1, 1, 11, 2, 1, 1, 1, 1, 3, + 2, 17, 1, 4, 1, 1, 2, 2, 2, 2, 2, 2, 4, 4, 2, 2, 2, 2, 2, 1, 1, 1, 2, 8, 1, 1, 1, 1, 5, 7, 4, 35, 3, 3, 2, 8, 2, 3, 3, 21, 19, + 4, 12, 2, 3, 3, 1, 1, 1, 14, 5, 2, 6, 2, 2, 2, 10, 5, 4, 3, 8, 5, 5, 5, 3, 3, 2, 6, 4, 14, 2, 9, 1, 6, 46, 4, 2, 21, 15, 15, 2, 1, + 11, 10, 4, 3, 5, 3, 3, 3, 2, 42, 5, 2, 2, 4, 2, 7, 2, 7, 4, 2, 2, 4, 3, 3, 2, 37, 3, 1, 1, 3, 2, 2, 5, 9, 7, 1, 5, 14, 2, 1, 5, + 2, 2, 41, 3, 5, 2, 7, 7, 5, 5, 5, 4, 6, 8, 2, 2, 1, 1, 3, 2, 2, 1, 2, 2, 2, 5, 1, 10, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 86, 11, 3, + 1, 1, 1, 1, 1, 2, 3, 4, 4, 2, 5, 1, 2, 6, 3, 4, 4, 1, 1, 1, 1, 3, 8, 8, 2, 5, 5, 2, 2, 2, 2, 2, 3, 9, 2, 1, 1, 2, 1, 3, 3, + 3, 3, 1, 1, 1, 69, 5, 2, 2, 2, 8, 3, 1, 1, 4, 4, 3, 11, 2, 5, 3, 2, 1, 1, 1, 4, 2, 2, 4, 9, 6, 1, 2, 2, 1, 1, 4, 3, 2, 2, 1, + 4, 3, 4, 4, 3, 1, 1, 7, 3, 2, 1, 1, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 54, 28, 2, 6, 2, 3, + 7, 4, 3, 2, 1, 5, 3, 13, 3, 2, 2, 18, 2, 2, 2, 6, 3, 2, 1, 2, 1, 1, 1, 74, 3, 3, 3, 3, 4, 51, 3, 2, 3, 1, 1, 1, 1, 1, 7, 2, 2, + 3, 2, 1, 1, 1, 1, 10, 3, 3, 8, 2, 2, 1, 8, 6, 2, 2, 2, 1, 1, 3, 1, 1, 2, 2, 12, 3, 3, 16, 16, 16, 16, 11, 3, 6, 32, 7, 2, 21, 9, 5, + 5, 4, 4, 4, 2, 3, 1, 10, 3, 3, 23, 6, 3, 3, 7, 6, 3, 55, 11, 4, 4, 7, 7, 2, 24, 16, 16, 10, 5, 8, 8, 6, 3, 3, 3, 16, 5, 5, 5, 5, 5, + 6, 6, 6, 6, 7, 5, 5, 2, 4, 3, 3, 3, 171,1, 1, 1, 1, 1, 16, 4, 2, 2, 4, 2, 2, 43, 6, 5, 5, 5, 4, 3, 1, 1, 1, 7, 5, 5, 5, 5, 3, + 3, 3, 2, 23, 4, 4, 12, 6, 4, 7, 4, 3, 24, 18, 18, 1, 3, 4, 3, 2, 2, 2, 2, 1, 20, 4, 1, 1, 4, 4, 1, 1, 3, 1, 3, 1, 10, 5, 2, 1, 3, + 1, 1, 9, 8, 4, 36, 15, 3, 3, 3, 7, 16, 11, 10, 9, 1, 1, 1, 1, 4, 4, 4, 4, 3, 1, 1, 118,7, 15, 1, 1, 1, 4, 31, 1, 2, 3, 6, 3, 4, 3, + 3, 3, 1, 1, 2, 16, 3, 3, 1, 2, 3, 28, 5, 9, 3, 7, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 2, 2, 2, 49, 3, 1, 1, 1, 1, 4, 2, 1, 10, 5, 3, + 1, 1, 1, 3, 2, 7, 3, 2, 2, 2, 2, 1, 2, 4, 1, 3, 10, 1, 1, 8, 4, 3, 2, 4, 2, 2, 101,4, 1, 2, 2, 77, 27, 18, 4, 2, 2, 5, 3, 8, 20, + 17, 7, 10, 7, 4, 5, 3, 2, 14, 4, 3, 3, 3, 2, 4, 3, 2, 3, 4, 3, 2, 69, 16, 5, 2, 2, 3, 2, 1, 2, 2, 5, 3, 8, 1, 4, 10, 7, 3, 2, 2, + 6, 2, 1, 7, 2, 2, 1, 1, 1, 93, 18, 6, 4, 2, 2, 5, 3, 7, 6, 5, 4, 3, 2, 4, 4, 3, 3, 20, 2, 7, 4, 1, 1, 2, 2, 3, 13, 4, 2, 3, 5, + 3, 2, 2, 6, 2, 2, 4, 3, 32, 1, 14, 4, 3, 6, 3, 1, 1, 1, 4, 15, 6, 5, 3, 3, 104,22, 1, 4, 4, 4, 19, 4, 1, 1, 2, 1, 4, 3, 1, 3, 2, + 2, 1, 12, 1, 6, 3, 2, 1, 3, 2, 2, 3, 13, 4, 4, 2, 1, 1, 5, 3, 4, 3, 3, 3, 3, 15, 4, 4, 1, 34, 5, 1, 1, 5, 3, 4, 4, 2, 2, 4, 1, + 1, 1, 1, 1, 46, 3, 3, 9, 5, 2, 3, 2, 2, 2, 2, 3, 2, 8, 2, 2, 2, 2, 2, 64, 5, 3, 7, 5, 4, 3, 1, 1, 3, 2, 2, 1, 1, 5, 5, 2, 2, + 8, 2, 1, 1, 12, 2, 3, 2, 1, 1, 1, 1, 3, 2, 2, 3, 2, 10, 7, 6, 3, 2, 79, 13, 5, 5, 4, 4, 5, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, + 5, 4, 4, 7, 2, 49, 9, 7, 4, 27, 17, 11, 4, 4, 2, 24, 4, 1, 13, 4, 3, 2, 2, 10, 4, 3, 3, 12, 2, 1, 2, 1, 3, 12, 2, 1, 2, 3, 9, 2, 2, + 2, 5, 1, 1, 1, 6, 6, 2, 17, 14, 14, 13, 9, 2, 1, 1, 102,17, 2, 3, 7, 1, 1, 2, 25, 12, 12, 5, 4, 3, 4, 5, 1, 1, 1, 2, 2, 2, 13, 3, 4, + 3, 16, 15, 1, 1, 3, 1, 1, 4, 3, 3, 9, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 3, 2, 1, 1, 170,2, 6, 10, 7, 3, 3, 1, 1, 1, 12, 2, 1, 2, 3, + 4, 2, 48, 2, 1, 1, 1, 1, 2, 2, 3, 6, 3, 2, 3, 1, 1, 4, 7, 5, 5, 1, 2, 4, 15, 4, 2, 3, 2, 4, 2, 16, 1, 11, 2, 1, 1, 1, 3, 3, 9, + 2, 2, 2, 2, 2, 2, 2, 1, 15, 2, 4, 2, 13, 3, 3, 1, 1, 2, 2, 3, 2, 2, 2, 5, 3, 1, 3, 1, 3, 2, 2, 60, 5, 1, 2, 5, 3, 1, 1, 24, 16, + 12, 9, 5, 2, 2, 4, 4, 3, 2, 232,12, 4, 3, 2, 2, 75, 8, 3, 1, 1, 35, 2, 2, 1, 3, 2, 1, 1, 1, 1, 1, 1, 7, 2, 2, 1, 2, 28, 23, 4, 14, + 9, 5, 1, 2, 11, 3, 3, 1, 1, 4, 4, 4, 4, 4, 17, 3, 6, 4, 3, 2, 8, 1, 1, 2, 38, 8, 3, 2, 20, 7, 7, 7, 7, 6, 4, 3, 11, 7, 6, 6, 6, + 6, 6, 4, 3, 48, 2, 3, 36, 21, 14, 7, 7, 3, 4, 3, 3, 3, 8, 3, 2, 3, 5, 1, 1, 4, 2, 1, 1, 1, 60, 2, 5, 32, 25, 22, 2, 2, 8, 6, 6, 3, + 2, 21, 3, 2, 14, 9, 24, 17, 11, 11, 11, 10, 9, 6, 3, 3, 60, 9, 13, 2, 8, 3, 18, 17, 16, 5, 4, 2, 11, 5, 2, 1, 1, 1, 1, 1, 1, 45, 3, 5, 3, + 3, 2, 1, 4, 3, 3, 7, 3, 3, 5, 3, 46, 40, 35, 3, 27, 14, 10, 4, 2, 1, 1, 1, 2, 2, 78, 2, 20, 16, 16, 11, 7, 4, 3, 3, 17, 14, 14, 11, 1, 3, + 2, 3, 14, 4, 8, 5, 3, 2, 4, 2, 1, 24, 6, 5, 5, 6, 2, 10, 14, 3, 3, 3, 4, 29, 9, 6, 6, 6, 6, 3, 3, 3, 9, 4, 5, 5, 5, 2, 1, 1, 1, + 1, 34, 2, 3, 3, 2, 4, 1, 3, 2, 5, 2, 5, 2, 2, 3, 13, 10, 6, 5, 3, 2, 2, 2, 15, 2, 4, 7, 15, 2, 1, 2, 2, 62, 3, 11, 3, 3, 24, 22, 5, + 5, 6, 3, 3, 1, 7, 2, 2, 3, 1, 1, 1, 4, 5, 3, 3, 1, 1, 1, 1, 1, 1, 1, 2, 6, 4, 4, 3, 4, 2, 5, 4, 2, 14, 2, 1, 13, 4, 26, 10, 8, + 3, 2, 1, 1, 10, 10, 10, 8, 8, 2, 2, 2, 2, 10, 4, 2, 2, 17, 3, 4, 6, 17, 4, 3, 4, 3, 9, 2, 18, 5, 5, 5, 4, 3, 2, 2, 1, 12, 5, 4, 2, + 1, 20, 5, 4, 7, 4, 92, 2, 42, 9, 3, 2, 3, 1, 1, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 25, 3, 5, 4, 3, 3, 4, 2, 2, 2, 2, 2, 2, 4, 2, + 4, 3, 29, 6, 3, 3, 2, 16, 1, 1, 1, 3, 2, 2, 1, 3, 2, 2, 6, 7, 3, 3, 2, 2, 110,12, 1, 4, 3, 2, 7, 3, 16, 11, 2, 8, 3, 2, 2, 3, 5, + 7, 1, 1, 1, 1, 1, 4, 2, 4, 47, 6, 1, 1, 2, 16, 2, 8, 6, 2, 2, 3, 12, 4, 3, 3, 2, 4, 3, 9, 9, 9, 3, 1, 1, 1, 1, 1, 5, 3, 1, 8, + 2, 1, 4, 3, 3, 3, 6, 6, 5, 7, 7, 2, 4, 12, 2, 2, 4, 1, 10, 1, 180,1, 4, 1, 10, 2, 2, 4, 2, 2, 11, 3, 1, 5, 4, 4, 8, 6, 4, 4, 6, + 4, 15, 8, 5, 5, 3, 1, 8, 5, 4, 3, 1, 3, 28, 13, 3, 3, 6, 4, 8, 5, 4, 3, 2, 3, 3, 3, 14, 3, 3, 3, 3, 3, 3, 1, 5, 17, 8, 5, 5, 2, + 5, 4, 23, 2, 2, 2, 4, 4, 4, 2, 4, 3, 3, 2, 5, 3, 2, 2, 1, 1, 4, 3, 12, 5, 3, 3, 2, 2, 2, 2, 1, 18, 7, 4, 4, 7, 2, 1, 17, 2, 5, + 4, 15, 3, 2, 2, 8, 5, 2, 2, 2, 1, 2, 2, 2, 20, 8, 5, 2, 5, 4, 8, 2, 2, 5, 3, 1, 7, 2, 5, 4, 1, 3, 22, 8, 4, 9, 9, 3, 3, 2, 1, + 1, 1, 2, 28, 10, 12, 4, 3, 6, 3, 18, 4, 6, 7, 1, 4, 2, 1, 1, 1, 17, 2, 4, 4, 4, 6, 3, 39, 10, 6, 1, 7, 3, 3, 3, 2, 2, 12, 5, 4, 3, + 1, 1, 1, 1, 1, 1, 23, 3, 6, 5, 3, 3, 2, 4, 6, 6, 2, 15, 2, 5, 5, 5, 3, 3, 3, 3, 2, 1, 12, 3, 3, 2, 2, 2, 2, 3, 2, 1, 1, 1, 1, + 1, 1, 4, 3, 50, 1, 1, 1, 1, 4, 2, 2, 1, 1, 13, 7, 3, 2, 2, 16, 2, 6, 3, 2, 3, 51, 4, 4, 1, 1, 1, 4, 3, 2, 5, 4, 1, 1, 1, 4, 3, + 3, 3, 15, 15, 5, 6, 2, 2, 2, 2, 2, 2, 3, 2, 1, 1, 1, 1, 2, 7, 1, 3, 3, 3, 1, 1, 18, 2, 6, 2, 6, 6, 5, 4, 42, 9, 3, 2, 5, 3, 2, + 1, 1, 1, 3, 5, 2, 1, 9, 2, 3, 1, 6, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, + 1, 1, 1, 5, 2, 3, 3, 2, 2, 2, 2, 2, 1, 1, 1, 3, 3, 3, 14, 3, 4, 2, 2, 15, 3, 2, 1, 7, 112,5, 2, 14, 20, 3, 6, 2, 3, 2, 1, 26, 14, + 12, 7, 3, 30, 6, 13, 7, 2, 4, 4, 2, 1, 1, 1, 3, 3, 2, 78, 9, 2, 1, 1, 2, 20, 7, 5, 2, 3, 3, 7, 3, 3, 7, 4, 2, 2, 1, 1, 1, 1, 5, + 3, 7, 2, 2, 2, 7, 2, 14, 3, 2, 1, 4, 2, 5, 3, 53, 12, 8, 4, 1, 1, 1, 1, 17, 4, 3, 3, 11, 10, 6, 4, 5, 2, 2, 14, 4, 4, 66, 5, 7, 3, + 31, 3, 3, 3, 3, 2, 2, 17, 5, 4, 4, 5, 8, 4, 8, 4, 3, 2, 20, 3, 5, 2, 2, 1, 1, 6, 5, 5, 5, 4, 71, 8, 4, 3, 6, 6, 6, 9, 1, 7, 1, + 1, 1, 1, 2, 3, 3, 1, 5, 2, 2, 2, 2, 2, 4, 9, 2, 4, 9, 4, 3, 3, 2, 5, 4, 3, 2, 41, 3, 5, 12, 1, 2, 4, 4, 3, 8, 5, 3, 3, 3, 2, + 2, 3, 1, 1, 22, 1, 1, 7, 2, 2, 2, 7, 3, 47, 21, 1, 1, 6, 6, 5, 1, 1, 1, 8, 2, 10, 4, 4, 50, 8, 3, 18, 10, 2, 10, 2, 2, 2, 2, 4, 2, + 2, 22, 2, 12, 5, 3, 2, 9, 4, 3, 3, 2, 4, 4, 1, 1, 2, 11, 4, 34, 1, 1, 6, 5, 3, 1, 16, 5, 5, 3, 2, 3, 35, 2, 7, 4, 2, 2, 1, 2, 1, + 8, 4, 3, 2, 2, 3, 5, 3, 3, 2, 2, 1, 1, 1, 30, 5, 17, 10, 4, 4, 4, 2, 2, 5, 3, 3, 2, 40, 10, 6, 2, 1, 7, 9, 3, 5, 3, 4, 27, 1, 14, + 7, 4, 1, 1, 2, 2, 20, 5, 2, 1, 4, 2, 2, 2, 2, 1, 4, 2, 2, 1, 25, 2, 14, 2, 1, 1, 1, 3, 14, 3, 2, 4, 2, 12, 4, 1, 3, 14, 1, 4, 4, + 4, 60, 9, 4, 2, 7, 5, 15, 15, 11, 6, 12, 2, 2, 2, 4, 2, 2, 9, 3, 2, 5, 4, 1, 1, 1, 1, 1, 18, 14, 4, 5, 3, 2, 125,43, 2, 3, 2, 2, 1, + 1, 1, 2, 1, 5, 8, 1, 2, 2, 2, 1, 7, 3, 1, 4, 1, 2, 28, 2, 21, 4, 2, 3, 2, 2, 22, 3, 3, 2, 2, 8, 2, 2, 6, 3, 2, 1, 1, 3, 3, 13, + 5, 1, 3, 3, 2, 4, 4, 2, 154,5, 9, 2, 1, 7, 7, 7, 22, 7, 3, 9, 6, 9, 1, 3, 3, 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 7, 6, 6, 2, + 9, 3, 3, 3, 25, 3, 11, 4, 4, 7, 4, 4, 3, 3, 2, 2, 2, 6, 3, 9, 4, 4, 11, 6, 1, 1, 4, 1, 1, 1, 1, 17, 1, 3, 9, 9, 4, 3, 1, 1, 1, + 1, 1, 9, 1, 1, 5, 1, 4, 4, 4, 2, 3, 1, 5, 12, 4, 4, 5, 2, 24, 6, 3, 6, 5, 28, 14, 1, 1, 13, 2, 3, 3, 2, 3, 2, 6, 3, 2, 41, 2, 2, + 20, 5, 2, 6, 3, 2, 39, 11, 7, 3, 4, 6, 2, 2, 3, 29, 6, 1, 8, 9, 6, 6, 6, 5, 5, 3, 6, 18, 6, 3, 9, 3, 3, 8, 2, 2, 2, 4, 2, 33, 1, + 7, 4, 16, 4, 1, 2, 1, 1, 3, 3, 37, 10, 2, 5, 12, 3, 4, 8, 6, 28, 9, 3, 6, 1, 3, 3, 1, 1, 104,4, 10, 3, 10, 2, 1, 1, 5, 3, 2, 50, 23, + 14, 13, 11, 9, 4, 6, 6, 6, 4, 6, 7, 7, 7, 2, 3, 3, 3, 10, 13, 4, 2, 6, 2, 2, 8, 31, 11, 1, 2, 9, 5, 5, 5, 14, 4, 3, 8, 13, 7, 3, 4, + 13, 13, 9, 4, 4, 152,10, 5, 18, 1, 4, 1, 1, 1, 1, 1, 2, 4, 3, 2, 1, 1, 1, 1, 18, 12, 7, 2, 2, 2, 2, 2, 2, 2, 17, 5, 6, 5, 5, 3, 7, + 3, 3, 2, 3, 2, 2, 47, 3, 2, 36, 34, 30, 1, 1, 1, 2, 1, 54, 4, 11, 3, 3, 9, 3, 16, 14, 7, 5, 3, 5, 3, 6, 4, 1, 1, 4, 3, 2, 22, 4, 3, + 3, 2, 1, 5, 4, 19, 18, 9, 2, 30, 4, 3, 10, 8, 11, 7, 3, 3, 2, 34, 5, 4, 1, 1, 1, 4, 3, 3, 15, 7, 7, 7, 6, 1, 18, 5, 4, 4, 4, 3, 5, + 3, 9, 82, 52, 9, 7, 7, 5, 23, 7, 3, 3, 3, 6, 6, 2, 20, 6, 12, 3, 5, 2, 4, 32, 2, 12, 2, 7, 8, 4, 3, 5, 1, 89, 2, 4, 65, 2, 6, 7, 2, + 2, 2, 7, 18, 10, 4, 2, 7, 3, 9, 1, 2, 2, 71, 3, 19, 11, 11, 3, 2, 30, 3, 3, 9, 4, 13, 7, 2, 1, 1, 1, 1, 1, 6, 4, 34, 6, 6, 15, 2, 5, + 1, 4, 3, 7, 1, 1, 1, 4, 61, 1, 1, 1, 1, 1, 1, 1, 8, 2, 3, 3, 2, 8, 4, 3, 3, 6, 6, 2, 8, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 13, 3, + 2, 1, 3, 3, 1, 9, 2, 2, 9, 2, 2, 114,35, 17, 1, 1, 1, 13, 7, 4, 4, 3, 9, 4, 11, 9, 8, 2, 2, 28, 13, 3, 4, 9, 3, 5, 2, 3, 7, 4, 4, + 65, 7, 2, 1, 3, 14, 6, 3, 2, 3, 3, 2, 16, 5, 2, 5, 4, 2, 9, 6, 3, 5, 4, 3, 3, 7, 4, 4, 4, 1, 84, 9, 4, 4, 4, 9, 2, 16, 6, 5, 5, + 3, 3, 3, 3, 15, 4, 4, 4, 4, 5, 3, 3, 3, 3, 4, 3, 3, 3, 23, 4, 2, 4, 12, 2, 5, 58, 4, 8, 2, 2, 8, 1, 1, 8, 9, 7, 4, 3, 3, 3, 7, + 6, 4, 4, 29, 6, 6, 2, 10, 5, 2, 2, 1, 4, 3, 7, 2, 22, 4, 3, 3, 5, 4, 2, 2, 2, 2, 10, 6, 3, 125,9, 3, 1, 1, 5, 3, 10, 3, 2, 2, 2, + 2, 1, 9, 3, 2, 2, 44, 4, 17, 4, 4, 3, 5, 2, 12, 2, 3, 3, 2, 2, 5, 2, 16, 3, 3, 3, 3, 3, 3, 6, 1, 10, 7, 2, 15, 11, 2, 2, 5, 3, 2, + 26, 2, 1, 1, 10, 3, 3, 1, 14, 3, 2, 8, 8, 37, 4, 15, 9, 2, 5, 4, 4, 2, 5, 4, 3, 4, 3, 3, 3, 16, 3, 2, 9, 8, 8, 8, 3, 12, 6, 6, 5, + 6, 3, 2, 2, 2, 28, 4, 2, 2, 2, 2, 5, 3, 3, 9, 3, 5, 5, 5, 4, 3, 3, 59, 5, 2, 12, 5, 19, 2, 6, 3, 7, 3, 3, 12, 3, 4, 1, 1, 2, 2, + 7, 2, 25, 3, 2, 11, 6, 6, 2, 43, 16, 2, 2, 4, 5, 4, 4, 4, 4, 3, 1, 9, 3, 5, 5, 4, 4, 1, 4, 2, 6, 10, 7, 7, 6, 65, 3, 8, 4, 3, 28, + 20, 18, 5, 2, 3, 12, 12, 3, 2, 6, 5, 4, 1, 1, 1, 3, 3, 16, 1, 5, 2, 2, 45, 17, 4, 4, 4, 5, 5, 8, 1, 4, 2, 5, 2, 7, 6, 6, 6, 4, 4, + 10, 4, 1, 35, 3, 7, 5, 5, 5, 3, 2, 1, 4, 3, 4, 1, 1, 3, 3, 35, 11, 10, 10, 5, 15, 15, 10, 4, 7, 5, 5, 1, 5, 2, 2, 2, 66, 2, 6, 3, 5, + 1, 6, 3, 8, 3, 10, 10, 5, 5, 3, 3, 3, 2, 6, 1, 4, 4, 4, 10, 5, 2, 3, 3, 3, 4, 4, 4, 18, 4, 7, 5, 17, 2, 30, 10, 1, 7, 4, 4, 6, 5, + 10, 4, 4, 5, 3, 2, 3, 3, 16, 2, 1, 3, 7, 3, 2, 24, 7, 3, 3, 2, 1, 1, 3, 3, 3, 24, 18, 3, 3, 3, 3, 3, 3, 3, 14, 5, 5, 5, 9, 8, 2, + 2, 58, 3, 14, 3, 21, 3, 2, 2, 6, 11, 5, 3, 5, 95, 5, 1, 3, 3, 16, 6, 3, 1, 3, 3, 3, 3, 20, 3, 8, 7, 4, 1, 1, 1, 29, 27, 16, 9, 6, 6, + 5, 5, 3, 2, 7, 7, 23, 4, 3, 3, 2, 2, 8, 4, 4, 13, 2, 15, 4, 7, 6, 4, 2, 75, 8, 3, 13, 7, 3, 3, 2, 4, 3, 8, 1, 1, 5, 3, 8, 4, 3, + 20, 4, 4, 3, 4, 14, 2, 2, 5, 2, 3, 2, 62, 49, 5, 2, 2, 2, 11, 2, 2, 2, 24, 17, 1, 1, 6, 6, 4, 5, 2, 121,15, 2, 2, 13, 5, 23, 6, 4, 4, + 51, 5, 3, 3, 2, 3, 2, 5, 10, 5, 5, 1, 1, 2, 9, 2, 8, 3, 1, 1, 1, 1, 16, 4, 2, 5, 2, 2, 4, 52, 4, 11, 5, 26, 4, 3, 2, 2, 7, 3, 3, + 3, 3, 4, 5, 4, 3, 3, 2, 11, 8, 2, 2, 5, 2, 7, 2, 2, 11, 8, 2, 4, 82, 15, 2, 3, 3, 2, 4, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 14, 4, 4, + 4, 4, 1, 7, 5, 3, 2, 2, 3, 3, 2, 1, 1, 7, 1, 2, 2, 2, 1, 1, 19, 4, 2, 8, 6, 2, 6, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 3, 2, 2, 5, + 1, 3, 2, 1, 1, 1, 1, 102,3, 2, 4, 1, 1, 9, 4, 1, 1, 1, 1, 1, 1, 2, 1, 1, 23, 3, 15, 3, 3, 2, 1, 3, 3, 1, 1, 9, 8, 38, 5, 5, 3, + 3, 17, 14, 13, 2, 2, 3, 7, 2, 4, 4, 4, 3, 1, 1, 4, 3, 2, 2, 10, 8, 2, 7, 2, 1, 3, 50, 3, 1, 2, 1, 7, 20, 2, 1, 1, 1, 1, 13, 7, 6, + 6, 3, 3, 3, 2, 1, 1, 3, 2, 2, 6, 1, 1, 1, 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 146,1, 113,20, 5, 5, 5, 4, 4, 8, 3, + 3, 5, 5, 5, 5, 5, 4, 4, 4, 4, 2, 7, 3, 2, 2, 4, 3, 3, 3, 3, 3, 3, 23, 17, 9, 5, 2, 23, 2, 17, 11, 4, 4, 3, 19, 1, 1, 10, 9, 9, 9, + 6, 5, 3, 2, 1, 1, 1, 1, 1, 1, 6, 6, 4, 8, 7, 2, 1, 1, 1, 4, 1, 2, 147,4, 3, 21, 4, 15, 15, 11, 6, 3, 3, 1, 1, 1, 1, 1, 1, 31, 12, + 4, 1, 3, 10, 4, 4, 4, 3, 3, 3, 24, 23, 23, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 16, 1, 1, 1, 3, 3, 3, 11, 5, 5, 5, 51, 1, 49, 6, 4, 2, 11, + 9, 9, 8, 8, 2, 2, 2, 2, 2, 2, 1, 1, 1, 4, 2, 2, 1, 1, 1, 1, 3, 3, 1, 2, 2, 9, 1, 3, 3, 3, 2, 2, 2, 2, 4, 1, 1, 1, 13, 8, 5, + 4, 3, 2, 2, 2, 1, 1, 1, 12, 1, 2, 2, 44, 2, 13, 3, 4, 2, 1, 1, 1, 4, 4, 4, 4, 26, 25, 12, 5, 5, 2, 4, 11, 2, 5, 5, 5, 4, 3, 3, 3, + 3, 3, 2, 2, 2, 1, 1, 1, 1, 1, 3, 3, 3, 3, 41, 4, 2, 2, 1, 2, 13, 2, 3, 5, 1, 1, 6, 2, 2, 7, 3, 3, 1, 1, 161,1, 22, 11, 6, 2, 4, + 1, 24, 3, 3, 10, 3, 2, 2, 7, 5, 3, 5, 14, 3, 4, 2, 1, 3, 56, 3, 23, 3, 3, 8, 2, 8, 9, 7, 3, 2, 2, 4, 3, 3, 3, 9, 21, 2, 2, 5, 2, + 2, 2, 10, 8, 5, 2, 2, 9, 2, 135,1, 13, 5, 5, 4, 10, 1, 1, 2, 2, 2, 3, 3, 3, 1, 1, 3, 4, 2, 4, 4, 3, 2, 2, 48, 2, 1, 9, 6, 5, 1, + 3, 2, 1, 3, 2, 10, 3, 4, 6, 2, 1, 1, 1, 1, 1, 3, 31, 4, 4, 1, 1, 1, 1, 1, 4, 14, 3, 1, 5, 1, 3, 2, 2, 2, 3, 49, 3, 11, 4, 5, 5, + 7, 6, 6, 5, 6, 4, 3, 3, 19, 6, 3, 7, 1, 1, 3, 113,18, 3, 3, 6, 2, 4, 4, 9, 3, 2, 2, 6, 5, 4, 4, 9, 3, 2, 6, 3, 3, 3, 36, 12, 5, + 2, 5, 4, 1, 9, 4, 13, 11, 6, 2, 38, 4, 4, 4, 30, 5, 4, 4, 3, 2, 6, 4, 2, 2, 4, 230,14, 1, 1, 1, 1, 3, 2, 25, 12, 2, 3, 2, 3, 2, 2, + 5, 37, 7, 4, 4, 2, 8, 2, 4, 4, 4, 20, 3, 1, 2, 2, 3, 2, 1, 1, 1, 4, 3, 7, 2, 1, 1, 42, 10, 5, 3, 3, 2, 3, 3, 2, 2, 3, 3, 2, 6, + 21, 7, 6, 4, 1, 10, 3, 2, 2, 4, 4, 10, 4, 4, 1, 1, 17, 5, 4, 2, 3, 3, 23, 1, 12, 8, 6, 2, 4, 4, 48, 16, 2, 1, 1, 7, 2, 1, 17, 7, 4, + 4, 4, 5, 5, 4, 55, 19, 3, 4, 8, 5, 2, 5, 2, 2, 3, 11, 1, 5, 3, 66, 5, 11, 1, 1, 6, 2, 4, 4, 4, 11, 2, 20, 3, 3, 3, 2, 2, 2, 12, 5, + 4, 2, 3, 2, 2, 102,5, 1, 1, 5, 4, 15, 4, 2, 10, 6, 4, 2, 2, 5, 3, 3, 1, 1, 1, 1, 1, 1, 3, 2, 2, 5, 2, 2, 1, 1, 5, 1, 2, 31, 4, + 2, 4, 1, 4, 3, 1, 11, 3, 3, 3, 1, 1, 4, 3, 2, 11, 6, 5, 2, 9, 4, 39, 4, 3, 29, 14, 2, 6, 2, 3, 2, 3, 7, 1, 1, 1, 1, 1, 1, 1, 3, + 1, 1, 1, 3, 1, 1, 1, 1, 2, 41, 4, 23, 2, 3, 7, 3, 4, 2, 6, 5, 13, 3, 3, 2, 2, 2, 1, 26, 17, 2, 4, 3, 4, 2, 6, 2, 2, 66, 4, 4, 12, + 2, 7, 3, 4, 6, 2, 5, 2, 25, 9, 2, 7, 2, 4, 3, 4, 4, 4, 35, 2, 8, 3, 1, 1, 3, 1, 2, 5, 17, 5, 5, 10, 7, 64, 4, 17, 4, 4, 3, 4, 4, + 4, 4, 9, 7, 9, 4, 3, 11, 6, 3, 2, 2, 10, 3, 3, 71, 6, 11, 8, 6, 9, 7, 2, 1, 1, 1, 6, 3, 6, 4, 4, 4, 2, 5, 4, 3, 3, 6, 5, 5, 5, + 4, 4, 3, 3, 3, 3, 4, 109,32, 23, 7, 7, 6, 9, 4, 4, 5, 2, 2, 2, 7, 6, 5, 3, 8, 2, 1, 1, 1, 3, 7, 1, 1, 1, 1, 1, 1, 1, 1, 2, 18, + 2, 2, 2, 1, 6, 2, 6, 2, 2, 1, 3, 3, 3, 4, 2, 2, 1, 1, 1, 1, 1, 1, 1, 21, 5, 2, 5, 2, 2, 1, 1, 1, 1, 1, 71, 5, 4, 2, 1, 3, 3, + 3, 5, 7, 2, 17, 10, 6, 6, 2, 3, 9, 85, 4, 4, 7, 29, 6, 6, 4, 4, 4, 2, 12, 6, 3, 7, 6, 6, 1, 5, 1, 9, 2, 6, 4, 3, 2, 10, 5, 6, 1, + 1, 2, 2, 2, 2, 2, 1, 1, 1, 10, 1, 1, 6, 6, 6, 4, 1, 1, 2, 1, 1, 1, 14, 6, 3, 1, 5, 2, 34, 4, 1, 1, 1, 1, 1, 6, 2, 1, 3, 11, 8, + 8, 1, 6, 1, 1, 51, 4, 3, 1, 3, 3, 3, 1, 1, 7, 1, 2, 3, 5, 3, 3, 3, 2, 1, 1, 1, 4, 4, 4, 6, 1, 1, 5, 3, 4, 3, 3, 2, 2, 2, 2, + 39, 3, 3, 6, 3, 1, 4, 4, 2, 6, 2, 14, 5, 4, 3, 2, 2, 14, 1, 6, 1, 1, 9, 5, 1, 1, 68, 2, 2, 24, 1, 1, 4, 3, 3, 17, 2, 5, 5, 16, 7, + 7, 5, 3, 2, 8, 3, 2, 7, 1, 3, 3, 39, 23, 8, 8, 7, 9, 2, 2, 5, 4, 2, 1, 1, 36, 5, 4, 2, 6, 14, 9, 4, 4, 4, 2, 22, 6, 4, 4, 3, 2, + 2, 2, 1, 2, 3, 96, 24, 4, 2, 9, 4, 4, 2, 2, 4, 1, 1, 1, 1, 1, 3, 2, 3, 1, 1, 2, 2, 8, 3, 9, 32, 5, 19, 11, 5, 2, 3, 3, 2, 12, 7, + 2, 2, 1, 1, 63, 11, 3, 4, 6, 18, 3, 11, 8, 6, 4, 3, 9, 8, 5, 4, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 22, 1, 5, 1, 1, 3, 3, 2, 11, 5, 8, + 4, 3, 2, 2, 3, 80, 6, 2, 11, 3, 3, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 11, 4, 4, 2, 2, 2, 12, 7, 7, 4, 4, 4, 4, 6, + 3, 2, 11, 2, 5, 2, 2, 1, 1, 1, 4, 2, 2, 2, 2, 2, 1, 1, 1, 8, 4, 4, 4, 4, 4, 2, 1, 1, 1, 1, 1, 1, 1, 63, 8, 4, 3, 11, 2, 2, 2, + 8, 5, 5, 3, 5, 5, 2, 22, 3, 5, 3, 4, 7, 4, 2, 95, 1, 1, 8, 2, 3, 13, 7, 6, 1, 1, 2, 5, 1, 1, 1, 4, 2, 2, 2, 1, 1, 2, 2, 1, 4, + 1, 46, 1, 1, 1, 1, 6, 1, 1, 1, 21, 5, 8, 6, 6, 3, 7, 1, 1, 3, 2, 1, 5, 3, 100,6, 5, 3, 6, 3, 3, 11, 4, 13, 2, 6, 26, 4, 5, 3, 3, + 14, 3, 2, 3, 1, 126,5, 4, 4, 4, 12, 9, 2, 2, 2, 1, 1, 4, 5, 4, 2, 2, 14, 2, 3, 6, 3, 30, 12, 6, 3, 3, 6, 5, 3, 3, 26, 26, 20, 13, 10, + 5, 4, 2, 219,4, 1, 13, 3, 3, 5, 1, 8, 2, 1, 4, 6, 2, 34, 4, 2, 3, 3, 15, 6, 5, 5, 3, 3, 3, 7, 3, 1, 4, 2, 11, 3, 3, 4, 13, 8, 8, + 7, 1, 1, 3, 2, 105,13, 4, 2, 1, 18, 3, 6, 2, 2, 5, 1, 1, 14, 4, 2, 2, 2, 2, 5, 3, 2, 9, 1, 3, 12, 10, 4, 4, 6, 2, 5, 2, 2, 8, 5, + 3, 3, 2, 2, 177,4, 9, 4, 3, 25, 20, 14, 5, 8, 4, 3, 3, 2, 24, 12, 10, 9, 6, 4, 3, 98, 5, 3, 1, 2, 7, 3, 1, 3, 1, 2, 2, 1, 14, 7, 4, + 3, 3, 5, 3, 2, 2, 1, 4, 4, 4, 7, 1, 7, 7, 2, 2, 12, 5, 3, 2, 1, 1, 1, 1, 4, 3, 3, 1, 6, 2, 1, 2, 2, 6, 1, 5, 1, 5, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 11, 4, 105,12, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 20, 2, 10, 8, 7, 5, 1, 2, 1, 7, 3, 5, 8, 2, 2, 2, 4, 8, + 2, 2, 30, 1, 1, 1, 1, 12, 7, 2, 6, 1, 3, 65, 4, 2, 3, 2, 1, 1, 1, 18, 5, 4, 2, 3, 13, 6, 7, 10, 2, 2, 2, 7, 6, 3, 1, 2, 79, 3, 7, + 7, 7, 50, 4, 45, 6, 4, 3, 5, 3, 2, 7, 4, 4, 3, 2, 6, 6, 2, 1, 1, 3, 11, 7, 3, 1, 13, 2, 2, 4, 2, 7, 1, 4, 3, 3, 2, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 168,8, 6, 4, 2, 2, 2, 18, 15, 15, 9, 4, 2, 9, 5, 10, 1, 1, 2, 2, 2, 4, 4, 4, 3, 8, 4, 4, 4, 4, 6, 9, 5, 4, 3, 2, + 1, 1, 1, 1, 1, 1, 5, 2, 2, 5, 4, 16, 4, 4, 12, 3, 3, 3, 1, 1, 29, 3, 3, 6, 1, 8, 3, 2, 3, 4, 10, 4, 2, 4, 2, 16, 7, 7, 2, 1, 1, + 1, 5, 2, 2, 65, 7, 1, 2, 14, 4, 4, 3, 3, 22, 5, 8, 8, 7, 6, 6, 4, 9, 4, 2, 2, 2, 56, 12, 9, 4, 7, 3, 3, 2, 2, 2, 1, 1, 1, 22, 17, + 5, 4, 12, 1, 4, 4, 4, 4, 1, 10, 9, 8, 8, 8, 5, 1, 16, 2, 1, 1, 1, 8, 3, 5, 5, 1, 1, 31, 6, 2, 1, 1, 17, 5, 5, 11, 4, 4, 5, 1, 2, + 1, 8, 3, 8, 2, 1, 3, 3, 2, 15, 13, 2, 4, 6, 4, 4, 4, 4, 3, 16, 3, 3, 5, 4, 2, 2, 4, 4, 4, 39, 6, 2, 5, 3, 2, 19, 9, 9, 3, 3, 6, + 3, 1, 1, 1, 1, 1, 1, 12, 2, 2, 2, 1, 3, 3, 2, 2, 5, 4, 3, 3, 3, 22, 9, 8, 4, 6, 1, 1, 4, 4, 2, 2, 2, 6, 3, 1, 1, 2, 2, 2, 3, + 2, 152,5, 8, 8, 7, 7, 7, 4, 14, 3, 3, 3, 3, 7, 7, 29, 3, 12, 10, 11, 10, 5, 5, 5, 1, 15, 14, 11, 8, 5, 1, 3, 2, 5, 1, 4, 28, 7, 3, 7, + 7, 4, 24, 3, 8, 3, 2, 4, 3, 2, 3, 10, 8, 3, 3, 1, 1, 41, 18, 13, 4, 2, 3, 11, 3, 6, 3, 3, 6, 4, 34, 8, 14, 9, 9, 9, 3, 5, 3, 6, 5, + 2, 3, 1, 8, 3, 2, 19, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 6, 14, 6, 3, 3, 1, 22, 2, 11, 8, 3, 4, 1, 3, 2, 53, 14, 3, + 2, 2, 16, 3, 3, 3, 5, 3, 3, 9, 1, 1, 1, 4, 4, 74, 39, 21, 9, 6, 17, 16, 9, 6, 3, 2, 2, 18, 5, 5, 3, 23, 4, 3, 15, 9, 7, 6, 25, 6, 3, + 3, 4, 7, 5, 3, 3, 1, 13, 5, 5, 4, 2, 2, 2, 3, 33, 21, 18, 1, 1, 8, 7, 6, 5, 4, 3, 3, 3, 8, 4, 2, 2, 4, 32, 10, 5, 3, 3, 3, 4, 3, + 3, 3, 6, 4, 6, 6, 6, 1, 63, 2, 2, 22, 4, 5, 2, 2, 1, 10, 10, 5, 3, 9, 6, 2, 5, 1, 5, 3, 3, 4, 3, 5, 5, 32, 6, 5, 2, 3, 17, 17, 7, + 4, 2, 1, 1, 1, 1, 8, 6, 3, 56, 5, 4, 22, 20, 18, 9, 8, 8, 5, 5, 2, 6, 4, 17, 2, 9, 2, 2, 2, 4, 37, 5, 3, 2, 2, 2, 2, 2, 25, 13, 13, + 9, 2, 12, 12, 10, 7, 4, 12, 9, 9, 9, 9, 2, 2, 15, 15, 13, 13, 7, 10, 3, 1, 2, 20, 2, 3, 1, 2, 2, 2, 9, 7, 5, 5, 5, 6, 4, 45, 6, 2, 2, + 2, 11, 8, 3, 16, 10, 5, 4, 4, 1, 1, 1, 1, 1, 6, 6, 4, 4, 25, 5, 12, 8, 8, 2, 2, 7, 6, 2, 2, 83, 11, 10, 10, 4, 4, 6, 14, 8, 6, 4, 16, + 13, 3, 8, 3, 24, 8, 8, 8, 8, 8, 5, 11, 6, 5, 5, 7, 7, 5, 5, 2, 2, 2, 71, 2, 6, 2, 13, 8, 8, 8, 2, 2, 2, 2, 3, 2, 5, 18, 17, 8, 8, + 8, 4, 19, 4, 2, 2, 2, 2, 1, 4, 4, 3, 3, 3, 3, 1, 89, 7, 3, 3, 2, 46, 6, 3, 16, 16, 8, 4, 4, 3, 3, 5, 2, 11, 11, 4, 3, 3, 3, 19, 3, + 3, 5, 5, 5, 2, 2, 7, 1, 6, 12, 6, 74, 6, 17, 10, 4, 3, 3, 35, 12, 9, 4, 3, 12, 7, 3, 4, 9, 6, 6, 6, 16, 5, 5, 5, 10, 2, 7, 6, 5, 3, + 2, 63, 3, 2, 14, 9, 7, 4, 2, 2, 6, 2, 3, 3, 12, 7, 1, 13, 2, 4, 1, 3, 2, 12, 1, 2, 1, 18, 1, 1, 1, 9, 1, 1, 3, 2, 2, 1, 1, 1, 2, + 2, 8, 6, 6, 2, 1, 181,17, 3, 2, 5, 3, 4, 13, 2, 5, 1, 11, 5, 6, 6, 2, 3, 8, 5, 4, 15, 1, 13, 13, 13, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 1, 10, 3, 3, 2, 2, 3, 1, 3, 1, 6, 2, 1, 1, 1, 63, 61, 61, 5, 4, 3, 8, 4, 4, 2, 2, 2, 44, 7, 6, 6, 6, 6, 3, + 2, 1, 2, 7, 1, 1, 1, 6, 2, 6, 5, 5, 5, 1, 1, 1, 1, 5, 1, 2, 8, 4, 4, 4, 4, 4, 2, 1, 1, 1, 26, 7, 1, 2, 1, 1, 7, 7, 1, 5, 1, + 1, 1, 3, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 39, 4, 3, 2, 2, 29, 29, 20, 1, 1, 1, 1, 5, 10, 6, 23, 7, + 6, 3, 2, 2, 2, 7, 4, 2, 19, 10, 2, 1, 5, 5, 3, 2, 1, 1, 1, 20, 3, 5, 5, 3, 2, 1, 1, 1, 17, 16, 1, 5, 2, 5, 5, 2, 1, 1, 1, 1, 16, + 2, 3, 4, 4, 6, 1, 1, 6, 1, 2, 6, 7, 3, 3, 92, 6, 3, 3, 4, 3, 1, 7, 1, 3, 1, 32, 5, 7, 8, 4, 3, 2, 2, 2, 2, 6, 3, 11, 5, 3, 2, + 6, 3, 3, 3, 27, 3, 2, 2, 4, 3, 3, 15, 2, 3, 6, 5, 82, 5, 19, 9, 4, 10, 8, 4, 5, 3, 12, 1, 8, 8, 2, 2, 4, 4, 10, 2, 2, 1, 1, 1, 14, + 3, 1, 4, 3, 2, 1, 1, 1, 1, 2, 31, 5, 17, 7, 5, 6, 160,10, 5, 3, 3, 9, 3, 6, 6, 8, 11, 3, 1, 1, 8, 3, 21, 7, 4, 4, 3, 5, 4, 4, 6, + 3, 2, 4, 3, 1, 28, 13, 11, 13, 6, 5, 7, 6, 2, 3, 20, 5, 1, 11, 4, 7, 3, 2, 4, 2, 2, 1, 8, 3, 4, 2, 79, 2, 22, 3, 4, 2, 1, 1, 2, 2, + 2, 3, 3, 43, 37, 5, 3, 2, 7, 5, 3, 46, 12, 1, 3, 2, 2, 2, 2, 1, 1, 1, 1, 3, 2, 3, 2, 9, 2, 2, 1, 4, 1, 5, 2, 8, 2, 3, 1, 1, 1, + 3, 1, 1, 1, 1, 1, 1, 1, 95, 5, 2, 2, 2, 2, 5, 1, 1, 1, 4, 2, 1, 4, 3, 1, 10, 4, 3, 3, 2, 1, 2, 36, 11, 9, 7, 7, 2, 4, 3, 3, 3, + 1, 10, 2, 2, 2, 2, 2, 2, 12, 8, 2, 2, 2, 2, 2, 1, 1, 1, 1, 32, 2, 2, 2, 13, 11, 1, 9, 8, 6, 2, 2, 2, 2, 1, 1, 3, 3, 3, 3, 2, 2, + 12, 11, 10, 9, 8, 7, 6, 5, 4, 4, 3, 3, 2, 2, 1, 1, 5, 1, 3, 3, 3, 3, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 115,2, 5, 1, 1, 5, + 3, 2, 7, 4, 9, 2, 2, 3, 7, 6, 6, 6, 4, 3, 2, 2, 3, 62, 10, 9, 7, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 2, 2, 2, 1, 18, 18, 17, 7, + 8, 7, 6, 2, 2, 19, 5, 3, 13, 12, 5, 4, 3, 2, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 17, 5, 4, 1, + 1, 1, 1, 1, 1, 5, 1, 1, 3, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 2, 2, 2, 2, 23, 5, 5, 5, 3, 1, 1, 1, 14, + 3, 7, 4, 3, 2, 2, 2, 2, 2, 2, 2, 1, 1, 6, 1, 1, 2, 1, 2, 2, 2, 2, 1, 1, 217,7, 6, 4, 1, 27, 22, 11, 5, 4, 1, 5, 2, 1, 1, 4, 4, + 2, 5, 3, 3, 11, 5, 4, 10, 9, 23, 1, 14, 8, 6, 5, 3, 38, 6, 1, 24, 2, 2, 2, 15, 8, 6, 4, 2, 2, 2, 51, 4, 4, 4, 12, 7, 7, 3, 30, 2, 17, + 15, 3, 3, 3, 3, 4, 4, 4, 2, 3, 12, 4, 3, 2, 19, 5, 4, 3, 7, 3, 3, 1, 1, 6, 1, 5, 4, 5, 3, 125,5, 1, 1, 8, 5, 4, 2, 2, 1, 1, 29, + 24, 2, 1, 1, 3, 13, 3, 2, 1, 1, 1, 11, 8, 5, 10, 4, 19, 3, 2, 3, 5, 2, 1, 20, 13, 7, 7, 7, 5, 3, 3, 3, 1, 1, 5, 5, 3, 1, 204,3, 1, + 3, 1, 23, 20, 6, 6, 3, 2, 2, 5, 13, 9, 3, 3, 3, 3, 2, 2, 25, 3, 1, 12, 5, 3, 66, 2, 7, 2, 5, 3, 7, 2, 4, 33, 10, 5, 12, 3, 3, 3, 3, 2, 3, 2, 2, 3, 18, 3, 7, 6, 1, 3, 4, 15, 4, 5, 2, 4, 3, 5, 2, 2, 3, 2, 1, 24, 2, 3, 12, 4, 3, 1, 9, 5, 1, 1, 3, 2, 1, 1, 1, 148, - 5, 5, 3, 10, 10, 9, 8, 2, 130,8, 8, 8, 3, 11, 11, 10, 5, 5, 3, 1, 2, 2, 5, 4, 94, 6, 5, 4, 4, 3, 81, 4, 3, 3, 2, 2, 1, 1, 1, 1, 63, - 5, 12, 6, 5, 5, 4, 5, 3, 3, 2, 13, 9, 7, 6, 5, 2, 4, 3, 1, 1, 1, 2, 2, 2, 2, 2, 11, 2, 2, 2, 5, 4, 1, 3, 3, 2, 2, 2, 2, 1, 1, - 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 13, 3, 81, 13, 2, 20, 4, 13, 3, 8, 16, 5, 5, 15, 3, 6, 2, 2, 2, 7, 2, 4, 105,4, 3, 3, 28, 6, 4, 4, 2, - 2, 2, 4, 6, 3, 23, 5, 11, 9, 2, 2, 2, 2, 2, 17, 5, 2, 2, 17, 7, 5, 2, 3, 1, 4, 4, 4, 3, 5, 177,12, 2, 3, 3, 5, 16, 3, 3, 2, 3, 2, - 77, 19, 4, 4, 11, 5, 13, 8, 7, 30, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 2, 2, 2, 3, 2, 2, 2, 3, 1, 1, 5, 5, 4, 3, 5, 17, 5, 2, 6, - 3, 3, 3, 9, 2, 2, 5, 4, 3, 6, 4, 2, 2, 18, 2, 3, 4, 47, 13, 5, 2, 13, 4, 3, 3, 2, 5, 2, 2, 2, 6, 70, 11, 8, 4, 2, 8, 4, 4, 4, 3, - 3, 5, 4, 5, 6, 3, 5, 4, 2, 8, 5, 35, 8, 5, 5, 7, 4, 3, 146,2, 2, 14, 10, 7, 3, 4, 2, 3, 25, 1, 3, 2, 4, 4, 2, 2, 3, 3, 8, 3, 2, - 54, 10, 9, 6, 3, 4, 6, 4, 4, 3, 4, 4, 4, 3, 4, 20, 4, 4, 3, 4, 46, 19, 2, 2, 2, 2, 2, 1, 2, 1, 1, 1, 2, 2, 1, 1, 1, 3, 3, 3, 7, - 2, 4, 2, 2, 4, 1, 1, 1, 3, 3, 3, 1, 33, 10, 4, 2, 2, 4, 3, 2, 7, 3, 2, 2, 2, 2, 2, 30, 5, 2, 13, 6, 4, 5, 5, 220,2, 40, 3, 3, 2, - 4, 3, 3, 2, 3, 5, 8, 3, 2, 2, 2, 3, 2, 2, 25, 2, 3, 9, 8, 2, 1, 2, 1, 4, 4, 4, 3, 2, 23, 5, 6, 2, 5, 3, 1, 19, 1, 1, 2, 3, 8, - 5, 2, 4, 1, 1, 1, 4, 3, 8, 3, 3, 3, 6, 5, 2, 12, 7, 22, 8, 1, 3, 1, 3, 4, 2, 28, 4, 2, 3, 3, 6, 2, 2, 2, 3, 3, 208,12, 3, 1, 1, - 2, 1, 22, 2, 13, 7, 6, 3, 46, 5, 4, 2, 4, 4, 14, 4, 8, 6, 9, 3, 46, 4, 2, 1, 34, 2, 27, 5, 4, 8, 7, 2, 4, 3, 1, 1, 1, 10, 5, 5, 4, - 4, 8, 3, 2, 16, 3, 6, 6, 4, 2, 2, 4, 85, 8, 7, 1, 2, 6, 3, 3, 1, 1, 1, 15, 9, 3, 3, 8, 21, 4, 1, 1, 7, 3, 2, 4, 3, 3, 3, 2, 2, - 1, 1, 1, 10, 6, 6, 2, 2, 4, 3, 3, 20, 3, 6, 6, 3, 2, 112,3, 5, 13, 5, 1, 1, 6, 26, 3, 5, 2, 5, 4, 3, 2, 5, 4, 3, 2, 2, 5, 4, 4, - 4, 3, 4, 9, 3, 1, 7, 3, 1, 2, 1, 19, 10, 3, 3, 4, 2, 3, 163,8, 2, 1, 3, 7, 4, 1, 10, 1, 4, 2, 29, 4, 3, 2, 1, 2, 5, 3, 3, 3, 35, - 3, 3, 1, 1, 22, 20, 16, 16, 11, 6, 3, 3, 5, 3, 2, 5, 4, 4, 1, 35, 5, 4, 3, 1, 7, 2, 3, 11, 9, 4, 2, 1, 1, 3, 3, 2, 6, 2, 2, 50, 6, - 3, 4, 2, 2, 3, 2, 4, 2, 5, 2, 4, 2, 8, 4, 4, 3, 2, 5, 2, 2, 1, 1, 1, 71, 10, 5, 2, 1, 1, 1, 40, 4, 27, 2, 8, 2, 17, 1, 1, 1, 1, - 1, 7, 3, 32, 5, 2, 1, 4, 3, 2, 4, 10, 4, 4, 1, 68, 6, 1, 1, 1, 6, 4, 2, 4, 6, 3, 3, 2, 10, 7, 4, 10, 4, 6, 6, 34, 4, 1, 1, 2, 7, - 3, 8, 6, 3, 3, 7, 3, 9, 1, 1, 2, 2, 1, 1, 3, 10, 1, 3, 6, 2, 1, 1, 1, 1, 1, 1, 1, 243,2, 2, 28, 7, 3, 3, 18, 10, 4, 4, 5, 33, 1, - 5, 9, 7, 5, 1, 1, 1, 1, 1, 1, 1, 3, 2, 5, 5, 5, 5, 5, 12, 5, 52, 24, 4, 10, 3, 3, 8, 4, 3, 1, 1, 1, 3, 4, 6, 8, 3, 3, 3, 1, 16, - 9, 5, 5, 5, 3, 1, 1, 1, 1, 1, 21, 3, 6, 35, 10, 9, 3, 3, 3, 19, 10, 5, 4, 4, 5, 5, 5, 3, 1, 5, 1, 1, 7, 4, 2, 2, 94, 6, 2, 5, 4, - 1, 34, 8, 5, 19, 8, 5, 4, 5, 13, 4, 3, 5, 5, 9, 5, 4, 4, 4, 4, 20, 4, 4, 1, 3, 19, 6, 1, 1, 4, 6, 1, 3, 3, 3, 36, 11, 9, 6, 5, 9, - 8, 6, 6, 16, 4, 4, 4, 3, 6, 3, 1, 1, 1, 1, 2, 1, 30, 2, 2, 2, 10, 6, 6, 6, 5, 2, 2, 2, 11, 7, 18, 7, 5, 2, 2, 2, 12, 8, 2, 2, 2, - 2, 106,14, 14, 14, 5, 7, 3, 2, 2, 6, 5, 5, 5, 5, 14, 4, 4, 4, 9, 7, 7, 2, 44, 5, 5, 5, 2, 1, 5, 5, 4, 4, 4, 8, 1, 1, 5, 2, 4, 4, - 3, 15, 4, 4, 4, 11, 3, 3, 8, 8, 8, 8, 5, 3, 3, 10, 8, 7, 7, 7, 7, 19, 9, 9, 9, 6, 2, 2, 2, 7, 7, 7, 1, 1, 1, 1, 18, 4, 3, 1, 7, - 6, 4, 24, 1, 6, 5, 5, 12, 4, 3, 1, 1, 1, 1, 4, 5, 5, 8, 2, 9, 20, 5, 2, 2, 3, 5, 10, 5, 3, 2, 32, 2, 7, 1, 13, 4, 3, 2, 44, 3, 3, - 2, 6, 4, 4, 4, 3, 3, 3, 4, 3, 3, 7, 6, 6, 6, 4, 4, 4, 4, 12, 3, 5, 2, 3, 2, 16, 6, 5, 4, 4, 34, 3, 4, 3, 4, 5, 12, 4, 4, 4, 4, - 5, 5, 5, 2, 15, 3, 4, 6, 3, 9, 4, 3, 7, 5, 2, 10, 4, 2, 2, 18, 3, 7, 3, 28, 6, 4, 5, 4, 11, 10, 3, 2, 4, 17, 11, 6, 3, 1, 13, 6, 6, - 4, 74, 3, 5, 7, 2, 5, 7, 3, 5, 3, 3, 2, 12, 4, 3, 5, 11, 5, 4, 4, 4, 4, 4, 7, 3, 3, 2, 2, 2, 2, 140,2, 1, 1, 20, 19, 13, 9, 2, 4, - 4, 20, 12, 8, 19, 1, 16, 11, 11, 5, 19, 2, 2, 15, 14, 4, 3, 2, 2, 23, 10, 6, 6, 7, 7, 7, 6, 6, 6, 6, 6, 4, 2, 30, 4, 4, 6, 4, 5, 5, 5, - 6, 161,25, 7, 6, 3, 1, 22, 15, 7, 7, 10, 8, 3, 50, 3, 2, 1, 1, 1, 1, 1, 1, 8, 8, 6, 4, 9, 5, 12, 11, 9, 9, 3, 15, 13, 9, 6, 3, 2, 8, - 2, 3, 15, 10, 4, 4, 6, 4, 5, 3, 24, 19, 17, 7, 4, 2, 2, 2, 59, 13, 6, 5, 5, 5, 5, 3, 8, 7, 6, 5, 1, 1, 4, 6, 3, 6, 4, 2, 2, 6, 4, - 31, 29, 9, 3, 4, 3, 9, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 12, 3, 3, 2, 10, 4, 2, 15, 3, 2, 6, 2, 4, 3, 2, 8, 17, 4, 2, 4, 4, 4, 4, - 3, 98, 6, 2, 2, 4, 3, 3, 1, 1, 1, 5, 4, 12, 3, 8, 6, 6, 8, 4, 4, 6, 4, 3, 3, 2, 4, 13, 2, 2, 6, 5, 12, 7, 4, 3, 3, 4, 4, 4, 4, - 4, 8, 6, 2, 2, 31, 2, 5, 4, 7, 4, 2, 23, 8, 6, 3, 3, 2, 2, 17, 6, 7, 7, 4, 4, 4, 17, 3, 1, 2, 124,39, 17, 12, 5, 5, 6, 3, 3, 3, 7, - 3, 19, 5, 5, 3, 3, 3, 39, 5, 11, 7, 7, 7, 3, 4, 4, 4, 3, 8, 3, 9, 3, 3, 3, 3, 153,33, 6, 6, 5, 9, 4, 22, 7, 5, 8, 7, 5, 2, 37, 2, - 2, 15, 7, 7, 4, 5, 4, 3, 9, 5, 2, 30, 5, 5, 5, 4, 2, 1, 4, 5, 5, 8, 4, 3, 2, 200,21, 2, 3, 1, 1, 25, 13, 7, 3, 2, 4, 28, 10, 3, 4, - 4, 8, 4, 8, 5, 2, 3, 5, 10, 5, 2, 2, 2, 20, 3, 9, 5, 22, 2, 1, 5, 6, 6, 9, 2, 1, 1, 1, 19, 5, 4, 2, 2, 2, 6, 2, 2, 1, 2, 8, 2, - 24, 3, 3, 3, 2, 4, 4, 13, 9, 9, 9, 9, 5, 2, 2, 238,26, 3, 2, 2, 9, 5, 3, 3, 3, 5, 37, 12, 8, 4, 6, 4, 7, 5, 5, 1, 1, 1, 3, 3, 5, - 4, 4, 4, 2, 3, 35, 13, 7, 6, 6, 5, 13, 10, 10, 3, 3, 2, 23, 2, 2, 8, 8, 10, 5, 5, 3, 3, 3, 7, 4, 54, 19, 18, 10, 10, 10, 6, 8, 15, 2, 3, - 3, 3, 20, 2, 2, 10, 10, 10, 3, 4, 3, 3, 3, 3, 5, 3, 3, 31, 12, 11, 11, 7, 5, 5, 3, 2, 2, 1, 6, 3, 3, 3, 20, 20, 2, 5, 13, 5, 5, 5, 3, - 19, 8, 2, 1, 2, 2, 2, 3, 4, 2, 16, 5, 3, 3, 3, 7, 6, 57, 8, 7, 7, 7, 2, 4, 6, 6, 6, 12, 4, 7, 12, 11, 10, 5, 13, 4, 3, 2, 2, 45, 18, - 13, 10, 5, 3, 3, 13, 13, 3, 3, 5, 3, 2, 30, 9, 4, 4, 9, 9, 6, 5, 6, 5, 5, 5, 44, 15, 10, 10, 3, 7, 4, 4, 17, 17, 8, 5, 9, 6, 1, 6, 3, - 1, 59, 12, 4, 4, 4, 7, 2, 2, 12, 9, 19, 5, 5, 5, 8, 3, 3, 1, 29, 1, 1, 1, 5, 5, 2, 2, 12, 1, 4, 3, 3, 3, 1, 1, 1, 1, 173,32, 12, 4, - 6, 7, 7, 3, 2, 11, 3, 3, 10, 2, 2, 1, 31, 8, 5, 5, 4, 10, 4, 10, 8, 9, 3, 2, 47, 15, 11, 7, 3, 1, 1, 5, 1, 1, 11, 8, 7, 15, 2, 4, 3, - 3, 4, 4, 4, 4, 4, 3, 3, 3, 2, 10, 4, 3, 2, 6, 6, 6, 3, 5, 3, 40, 3, 3, 8, 8, 1, 11, 3, 10, 4, 2, 157,11, 3, 59, 18, 4, 4, 3, 2, 6, - 27, 2, 6, 4, 10, 5, 48, 11, 9, 2, 5, 14, 10, 7, 7, 7, 7, 10, 6, 6, 30, 23, 12, 2, 2, 2, 2, 10, 10, 9, 9, 4, 3, 24, 7, 5, 2, 5, 4, 4, 4, - 5, 4, 4, 13, 2, 4, 4, 34, 6, 1, 3, 1, 1, 1, 18, 8, 4, 6, 3, 2, 15, 5, 4, 2, 4, 3, 74, 3, 2, 2, 2, 7, 2, 2, 2, 2, 2, 2, 1, 2, 21, - 1, 11, 2, 2, 1, 1, 2, 2, 2, 2, 1, 2, 1, 1, 5, 3, 1, 1, 1, 1, 1, 1, 1, 15, 3, 1, 1, 1, 1, 1, 1, 6, 3, 3, 3, 3, 3, 4, 3, 3, 3, - 10, 5, 3, 1, 1, 1, 1, 3, 2, 2, 3, 1, 1, 1, 1, 174,9, 1, 4, 1, 4, 3, 3, 3, 1, 42, 5, 2, 11, 10, 3, 2, 1, 4, 2, 7, 4, 4, 4, 4, 3, - 4, 4, 4, 4, 2, 10, 8, 2, 2, 2, 3, 2, 1, 1, 1, 1, 1, 1, 1, 29, 2, 2, 22, 2, 11, 2, 7, 2, 2, 2, 2, 3, 3, 3, 1, 3, 1, 1, 1, 43, 4, - 21, 3, 8, 4, 2, 2, 2, 2, 2, 4, 3, 8, 4, 3, 3, 1, 1, 1, 10, 3, 3, 20, 7, 4, 5, 5, 16, 3, 4, 47, 9, 2, 9, 2, 1, 3, 10, 3, 4, 4, 8, - 1, 1, 4, 2, 154,11, 7, 7, 15, 5, 4, 8, 4, 4, 4, 4, 68, 23, 21, 17, 3, 3, 1, 1, 15, 3, 4, 4, 5, 6, 3, 3, 3, 44, 3, 19, 5, 4, 4, 5, 3, - 3, 3, 2, 2, 5, 6, 1, 2, 75, 18, 6, 3, 3, 7, 7, 19, 5, 5, 16, 11, 4, 10, 6, 6, 6, 5, 2, 96, 8, 5, 5, 3, 15, 7, 1, 1, 3, 2, 6, 2, 1, - 1, 3, 2, 5, 3, 7, 5, 4, 6, 3, 3, 1, 1, 1, 1, 2, 6, 17, 5, 3, 1, 2, 6, 1, 3, 28, 4, 3, 3, 10, 2, 6, 5, 85, 8, 2, 24, 7, 3, 7, 3, - 26, 23, 3, 2, 2, 3, 2, 2, 4, 3, 10, 4, 6, 3, 2, 6, 1, 1, 1, 1, 6, 2, 2, 2, 1, 11, 3, 1, 17, 6, 2, 6, 3, 29, 3, 3, 2, 3, 2, 2, 4, - 1, 114,7, 3, 2, 9, 3, 3, 3, 13, 5, 3, 12, 2, 4, 50, 1, 2, 11, 3, 4, 2, 2, 3, 8, 6, 4, 3, 3, 2, 4, 2, 3, 8, 5, 1, 1, 1, 1, 1, 25, - 2, 2, 2, 2, 6, 48, 3, 2, 6, 5, 5, 4, 3, 22, 12, 3, 4, 2, 2, 1, 1, 81, 4, 4, 8, 2, 1, 12, 4, 3, 6, 12, 4, 1, 1, 2, 9, 11, 2, 4, 54, - 5, 9, 9, 3, 5, 2, 1, 1, 2, 14, 7, 4, 3, 1, 1, 3, 7, 5, 5, 2, 8, 90, 18, 3, 1, 11, 56, 7, 4, 36, 6, 2, 2, 2, 1, 3, 4, 4, 6, 8, 5, - 2, 2, 2, 2, 2, 21, 11, 3, 4, 40, 4, 3, 3, 3, 3, 2, 6, 6, 2, 3, 2, 3, 2, 2, 1, 3, 1, 1, 1, 1, 1, 5, 2, 2, 2, 4, 2, 2, 1, 1, 1, - 1, 1, 3, 2, 1, 1, 6, 2, 2, 2, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 5, 8, 4, 2, 74, 5, 5, 37, 1, 3, 2, 2, 2, 2, 2, 2, - 7, 3, 4, 7, 1, 4, 1, 9, 4, 170,14, 2, 5, 1, 1, 23, 8, 6, 8, 57, 2, 43, 34, 5, 4, 5, 3, 1, 35, 6, 6, 4, 3, 3, 2, 18, 4, 3, 4, 2, 1, - 10, 7, 2, 12, 10, 2, 8, 6, 6, 167,4, 8, 3, 32, 5, 15, 1, 1, 3, 3, 1, 4, 1, 3, 2, 2, 2, 111,1, 1, 2, 6, 1, 2, 2, 2, 3, 2, 2, 2, 2, - 28, 2, 18, 3, 7, 2, 3, 6, 3, 3, 4, 10, 6, 4, 2, 3, 16, 2, 2, 2, 2, 2, 126,12, 4, 11, 6, 38, 2, 2, 2, 3, 11, 6, 7, 4, 4, 4, 18, 6, 3, - 2, 2, 2, 3, 4, 3, 25, 4, 3, 20, 13, 3, 7, 4, 4, 4, 77, 4, 5, 4, 12, 7, 1, 3, 5, 4, 3, 2, 6, 4, 15, 2, 3, 5, 10, 1, 1, 1, 5, 3, 1, - 7, 3, 3, 1, 53, 9, 2, 4, 13, 8, 6, 5, 2, 5, 5, 2, 2, 2, 5, 1, 1, 6, 5, 1, 1, 1, 48, 4, 2, 5, 2, 2, 11, 3, 3, 1, 11, 4, 4, 3, 2, - 1, 1, 2, 2, 2, 1, 7, 6, 2, 12, 2, 2, 4, 3, 3, 96, 9, 6, 10, 2, 2, 2, 10, 5, 5, 45, 4, 15, 8, 2, 2, 2, 1, 10, 7, 5, 3, 5, 5, 156,91, - 5, 4, 4, 3, 67, 5, 3, 7, 16, 4, 2, 3, 11, 4, 5, 9, 9, 7, 3, 4, 4, 8, 2, 15, 2, 1, 11, 4, 4, 3, 3, 2, 5, 2, 3, 6, 2, 4, 73, 14, 11, - 10, 2, 2, 2, 6, 7, 1, 1, 1, 2, 1, 1, 1, 12, 3, 4, 7, 4, 2, 1, 1, 9, 4, 6, 76, 3, 1, 15, 11, 2, 13, 2, 4, 3, 2, 12, 4, 1, 2, 6, 14, - 4, 16, 7, 3, 3, 2, 3, 3, 3, 15, 3, 2, 2, 1, 1, 43, 2, 14, 7, 4, 3, 8, 5, 3, 5, 4, 2, 14, 2, 8, 127,5, 21, 2, 4, 3, 3, 10, 5, 1, 2, - 12, 3, 8, 4, 4, 54, 15, 3, 4, 4, 2, 3, 3, 3, 3, 5, 3, 2, 3, 4, 1, 1, 2, 2, 3, 3, 4, 2, 2, 2, 1, 7, 5, 4, 8, 3, 24, 3, 3, 1, 6, - 2, 5, 3, 12, 2, 2, 2, 6, 1, 3, 2, 2, 4, 57, 4, 20, 7, 6, 4, 14, 2, 5, 3, 3, 3, 4, 19, 4, 5, 1, 2, 3, 3, 1, 3, 126,18, 4, 3, 4, 11, - 4, 3, 3, 44, 5, 3, 16, 5, 5, 7, 2, 3, 3, 3, 2, 1, 4, 3, 2, 2, 2, 2, 2, 1, 2, 2, 10, 4, 4, 2, 20, 7, 3, 5, 3, 3, 2, 2, 2, 7, 1, - 5, 4, 1, 128,3, 2, 1, 4, 19, 5, 13, 2, 2, 1, 2, 3, 2, 2, 6, 3, 1, 1, 26, 22, 4, 3, 5, 3, 3, 2, 5, 3, 25, 7, 10, 6, 2, 21, 7, 4, 4, - 2, 2, 21, 3, 1, 12, 3, 8, 4, 2, 2, 50, 3, 4, 3, 1, 4, 10, 1, 11, 5, 3, 2, 6, 4, 19, 8, 7, 6, 4, 4, 3, 3, 35, 14, 12, 3, 2, 3, 1, 1, - 2, 5, 2, 27, 6, 3, 7, 3, 2, 3, 3, 6, 1, 1, 4, 4, 3, 2, 15, 2, 1, 1, 2, 2, 2, 10, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 10, 3, 85, 8, 5, - 3, 3, 12, 8, 7, 2, 21, 9, 6, 22, 2, 3, 2, 9, 4, 2, 5, 3, 2, 1, 5, 2, 16, 12, 2, 1, 3, 74, 7, 11, 4, 2, 15, 3, 3, 15, 2, 2, 2, 2, 2, - 5, 2, 6, 5, 6, 3, 39, 3, 5, 4, 5, 4, 7, 3, 7, 3, 42, 5, 2, 25, 2, 7, 5, 2, 3, 4, 4, 36, 8, 7, 5, 15, 5, 5, 2, 17, 7, 2, 1, 18, 1, - 6, 5, 1, 5, 2, 34, 2, 18, 4, 5, 4, 1, 6, 69, 4, 12, 4, 3, 5, 3, 2, 5, 4, 9, 3, 4, 7, 4, 14, 3, 2, 1, 1, 1, 1, 1, 2, 3, 3, 4, 1, - 1, 1, 1, 1, 1, 76, 1, 5, 4, 2, 17, 3, 3, 3, 1, 7, 5, 2, 2, 2, 3, 15, 8, 5, 4, 2, 3, 8, 2, 2, 30, 4, 8, 4, 2, 6, 4, 4, 5, 157,4, - 12, 8, 2, 2, 6, 29, 2, 2, 4, 7, 3, 4, 7, 3, 4, 4, 3, 3, 46, 3, 17, 9, 7, 9, 6, 4, 8, 3, 2, 2, 1, 35, 5, 2, 6, 7, 4, 3, 10, 2, 63, - 7, 2, 4, 2, 2, 25, 3, 11, 5, 4, 4, 4, 4, 4, 3, 3, 2, 3, 10, 2, 4, 2, 2, 2, 2, 6, 7, 1, 3, 3, 1, 1, 1, 3, 1, 1, 1, 1, 3, 2, 1, - 1, 132,16, 11, 15, 5, 3, 2, 4, 1, 16, 2, 9, 3, 7, 4, 2, 2, 3, 2, 10, 2, 2, 12, 5, 1, 1, 4, 5, 6, 11, 5, 7, 6, 2, 4, 7, 3, 3, 9, 1, - 1, 1, 5, 1, 2, 2, 2, 1, 1, 8, 2, 14, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 1, 12, 2, 1, 6, 6, 6, 6, 5, 3, 1, 1, 1, 1, 1, 1, 2, 2, 2, - 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 39, 6, 4, 1, 1, 8, 1, 1, 1, 1, 4, 2, 9, 1, 1, 3, - 4, 107,30, 4, 3, 3, 2, 1, 11, 3, 3, 9, 7, 5, 2, 15, 3, 2, 6, 14, 8, 7, 4, 15, 4, 3, 8, 11, 4, 5, 4, 2, 80, 7, 1, 1, 10, 2, 5, 3, 3, - 1, 1, 21, 7, 1, 2, 5, 3, 12, 3, 2, 1, 1, 23, 8, 6, 6, 5, 4, 10, 6, 6, 6, 2, 2, 2, 2, 78, 8, 1, 16, 4, 7, 7, 1, 6, 4, 14, 7, 5, 11, - 3, 3, 3, 3, 2, 24, 1, 4, 3, 6, 1, 1, 1, 1, 5, 2, 1, 56, 9, 4, 2, 19, 2, 4, 1, 1, 1, 9, 3, 6, 1, 7, 4, 3, 2, 53, 14, 2, 3, 4, 2, - 11, 4, 3, 6, 4, 3, 3, 2, 3, 3, 2, 2, 4, 5, 3, 2, 5, 42, 11, 2, 4, 3, 4, 9, 4, 2, 2, 4, 4, 3, 1, 1, 89, 3, 6, 4, 20, 2, 3, 3, 5, - 5, 2, 27, 16, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 5, 6, 2, 2, 2, 7, 4, 54, 14, 2, 2, 3, 5, 4, 3, 7, 2, 2, 5, - 3, 2, 10, 5, 4, 65, 2, 2, 6, 3, 3, 3, 2, 18, 10, 6, 4, 3, 4, 4, 4, 6, 4, 2, 4, 3, 8, 3, 3, 3, 35, 4, 4, 5, 4, 2, 12, 1, 1, 1, 1, - 2, 7, 3, 2, 38, 3, 2, 2, 4, 2, 4, 9, 5, 3, 3, 3, 2, 31, 7, 6, 5, 2, 7, 19, 3, 8, 7, 27, 5, 11, 3, 3, 12, 3, 41, 4, 2, 5, 6, 4, 2, - 2, 4, 4, 17, 8, 46, 24, 7, 6, 5, 4, 9, 4, 4, 7, 10, 2, 3, 2, 5, 2, 11, 2, 1, 253,4, 1, 43, 3, 2, 13, 3, 6, 4, 11, 4, 3, 21, 5, 1, 6, - 3, 4, 2, 12, 3, 2, 2, 14, 2, 1, 4, 2, 37, 6, 4, 2, 3, 5, 15, 19, 3, 1, 1, 34, 9, 2, 3, 5, 3, 7, 6, 2, 2, 2, 5, 4, 15, 3, 4, 6, 6, - 5, 2, 24, 2, 10, 9, 6, 5, 4, 2, 3, 18, 1, 1, 6, 2, 2, 2, 2, 3, 36, 4, 13, 6, 4, 17, 9, 1, 1, 5, 177,15, 4, 12, 7, 2, 30, 3, 3, 5, 13, - 3, 6, 3, 2, 10, 3, 2, 20, 2, 3, 2, 6, 8, 3, 5, 20, 3, 4, 3, 2, 15, 4, 6, 3, 3, 7, 6, 2, 3, 2, 5, 4, 4, 9, 10, 3, 10, 2, 1, 2, 3, - 3, 2, 38, 8, 5, 3, 1, 1, 5, 4, 1, 6, 4, 4, 4, 3, 2, 1, 15, 7, 3, 3, 2, 17, 8, 5, 3, 16, 4, 5, 5, 1, 1, 3, 4, 3, 2, 1, 9, 3, 1, - 11, 2, 3, 1, 1, 1, 3, 20, 3, 2, 1, 1, 2, 1, 7, 3, 125,5, 5, 4, 36, 5, 4, 2, 2, 2, 2, 11, 4, 2, 12, 5, 5, 4, 4, 26, 3, 1, 1, 1, 1, - 7, 6, 4, 5, 2, 1, 5, 2, 2, 28, 2, 2, 2, 1, 2, 11, 3, 5, 2, 4, 5, 3, 5, 6, 1, 45, 4, 2, 1, 3, 1, 9, 5, 4, 5, 3, 13, 3, 5, 4, 4, - 1, 1, 1, 2, 254,79, 5, 2, 6, 3, 3, 2, 2, 16, 3, 2, 3, 2, 2, 11, 6, 3, 3, 6, 2, 2, 4, 2, 1, 1, 14, 3, 3, 3, 6, 1, 2, 2, 2, 21, 3, - 3, 10, 8, 4, 1, 10, 2, 2, 3, 11, 2, 5, 2, 12, 4, 3, 3, 2, 10, 4, 2, 6, 2, 7, 4, 12, 3, 3, 4, 11, 3, 4, 1, 12, 5, 3, 5, 15, 8, 7, 4, - 4, 6, 3, 102,10, 2, 2, 1, 1, 35, 28, 17, 9, 8, 4, 3, 2, 2, 2, 6, 4, 3, 1, 1, 2, 1, 2, 2, 2, 28, 7, 4, 3, 4, 5, 4, 5, 142,1, 1, 21, - 13, 4, 1, 2, 2, 8, 7, 4, 8, 4, 3, 3, 6, 1, 1, 1, 3, 3, 27, 11, 9, 9, 8, 3, 3, 3, 3, 2, 8, 2, 6, 3, 5, 2, 15, 3, 9, 8, 4, 3, 3, - 21, 19, 13, 6, 4, 8, 5, 1, 1, 1, 1, 1, 3, 98, 3, 10, 7, 7, 2, 7, 7, 4, 14, 4, 9, 1, 1, 1, 1, 1, 4, 3, 15, 2, 1, 6, 4, 10, 4, 4, 2, - 5, 5, 2, 105,32, 8, 6, 1, 7, 4, 7, 3, 2, 20, 1, 1, 7, 5, 1, 31, 3, 3, 10, 5, 5, 17, 2, 3, 3, 43, 13, 3, 2, 1, 3, 5, 4, 1, 2, 3, 20, - 3, 2, 2, 10, 5, 5, 5, 5, 50, 10, 4, 2, 7, 4, 7, 1, 4, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 2, 6, 1, 1, 2, 3, 2, 242,5, 4, 4, 1, 9, 6, - 3, 5, 2, 2, 3, 40, 5, 6, 7, 10, 5, 6, 3, 20, 6, 9, 3, 3, 39, 1, 1, 14, 6, 6, 3, 5, 3, 3, 2, 8, 1, 1, 1, 6, 7, 4, 2, 8, 4, 1, 1, - 1, 80, 4, 2, 1, 6, 2, 4, 3, 6, 10, 3, 2, 8, 4, 8, 3, 3, 5, 2, 12, 4, 3, 5, 4, 2, 12, 2, 6, 5, 5, 11, 6, 5, 4, 2, 1, 27, 2, 4, 10, - 2, 7, 7, 4, 3, 164,10, 2, 10, 5, 2, 10, 7, 3, 2, 8, 4, 9, 4, 1, 12, 2, 2, 9, 4, 3, 9, 4, 3, 4, 8, 3, 2, 15, 2, 2, 2, 7, 4, 26, 4, - 2, 3, 2, 2, 4, 11, 4, 6, 21, 4, 2, 1, 4, 2, 2, 1, 1, 1, 171,3, 7, 4, 6, 8, 7, 6, 3, 1, 1, 1, 25, 7, 3, 1, 9, 6, 3, 17, 14, 6, 3, - 3, 2, 20, 6, 3, 4, 2, 14, 2, 1, 5, 3, 9, 3, 4, 26, 4, 5, 2, 1, 1, 1, 1, 4, 3, 1, 13, 4, 4, 1, 3, 2, 2, 1, 1, 1, 118,8, 2, 4, 2, + 5, 5, 3, 10, 10, 9, 8, 2, 130,8, 8, 8, 3, 11, 11, 10, 5, 5, 3, 1, 2, 2, 5, 4, 94, 6, 5, 4, 4, 3, 81, 4, 3, 3, 2, 2, 1, 1, 1, 1, 63, + 5, 12, 6, 5, 5, 4, 5, 3, 3, 2, 13, 9, 7, 6, 5, 2, 4, 3, 1, 1, 1, 2, 2, 2, 2, 2, 11, 2, 2, 2, 5, 4, 1, 3, 3, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 13, 3, 81, 13, 2, 20, 4, 13, 3, 8, 16, 5, 5, 15, 3, 6, 2, 2, 2, 7, 2, 4, 105,4, 3, 3, 28, 6, 4, 4, 2, + 2, 2, 4, 6, 3, 23, 5, 11, 9, 2, 2, 2, 2, 2, 17, 5, 2, 2, 17, 7, 5, 2, 3, 1, 4, 4, 4, 3, 5, 177,12, 2, 3, 3, 5, 16, 3, 3, 2, 3, 2, + 77, 19, 4, 4, 11, 5, 13, 8, 7, 30, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 2, 2, 2, 3, 2, 2, 2, 3, 1, 1, 5, 5, 4, 3, 5, 17, 5, 2, 6, + 3, 3, 3, 9, 2, 2, 5, 4, 3, 6, 4, 2, 2, 18, 2, 3, 4, 47, 13, 5, 2, 13, 4, 3, 3, 2, 5, 2, 2, 2, 6, 70, 11, 8, 4, 2, 8, 4, 4, 4, 3, + 3, 5, 4, 5, 6, 3, 5, 4, 2, 8, 5, 35, 8, 5, 5, 7, 4, 3, 146,2, 2, 14, 10, 7, 3, 4, 2, 3, 25, 1, 3, 2, 4, 4, 2, 2, 3, 3, 8, 3, 2, + 54, 10, 9, 6, 3, 4, 6, 4, 4, 3, 4, 4, 4, 3, 4, 20, 4, 4, 3, 4, 46, 19, 2, 2, 2, 2, 2, 1, 2, 1, 1, 1, 2, 2, 1, 1, 1, 3, 3, 3, 7, + 2, 4, 2, 2, 4, 1, 1, 1, 3, 3, 3, 1, 33, 10, 4, 2, 2, 4, 3, 2, 7, 3, 2, 2, 2, 2, 2, 30, 5, 2, 13, 6, 4, 5, 5, 220,2, 40, 3, 3, 2, + 4, 3, 3, 2, 3, 5, 8, 3, 2, 2, 2, 3, 2, 2, 25, 2, 3, 9, 8, 2, 1, 2, 1, 4, 4, 4, 3, 2, 23, 5, 6, 2, 5, 3, 1, 19, 1, 1, 2, 3, 8, + 5, 2, 4, 1, 1, 1, 4, 3, 8, 3, 3, 3, 6, 5, 2, 12, 7, 22, 8, 1, 3, 1, 3, 4, 2, 28, 4, 2, 3, 3, 6, 2, 2, 2, 3, 3, 208,12, 3, 1, 1, + 2, 1, 22, 2, 13, 7, 6, 3, 46, 5, 4, 2, 4, 4, 14, 4, 8, 6, 9, 3, 46, 4, 2, 1, 34, 2, 27, 5, 4, 8, 7, 2, 4, 3, 1, 1, 1, 10, 5, 5, 4, + 4, 8, 3, 2, 16, 3, 6, 6, 4, 2, 2, 4, 85, 8, 7, 1, 2, 6, 3, 3, 1, 1, 1, 15, 9, 3, 3, 8, 21, 4, 1, 1, 7, 3, 2, 4, 3, 3, 3, 2, 2, + 1, 1, 1, 10, 6, 6, 2, 2, 4, 3, 3, 20, 3, 6, 6, 3, 2, 112,3, 5, 13, 5, 1, 1, 6, 26, 3, 5, 2, 5, 4, 3, 2, 5, 4, 3, 2, 2, 5, 4, 4, + 4, 3, 4, 9, 3, 1, 7, 3, 1, 2, 1, 19, 10, 3, 3, 4, 2, 3, 163,8, 2, 1, 3, 7, 4, 1, 10, 1, 4, 2, 29, 4, 3, 2, 1, 2, 5, 3, 3, 3, 35, + 3, 3, 1, 1, 22, 20, 16, 16, 11, 6, 3, 3, 5, 3, 2, 5, 4, 4, 1, 35, 5, 4, 3, 1, 7, 2, 3, 11, 9, 4, 2, 1, 1, 3, 3, 2, 6, 2, 2, 50, 6, + 3, 4, 2, 2, 3, 2, 4, 2, 5, 2, 4, 2, 8, 4, 4, 3, 2, 5, 2, 2, 1, 1, 1, 71, 10, 5, 2, 1, 1, 1, 40, 4, 27, 2, 8, 2, 17, 1, 1, 1, 1, + 1, 7, 3, 32, 5, 2, 1, 4, 3, 2, 4, 10, 4, 4, 1, 68, 6, 1, 1, 1, 6, 4, 2, 4, 6, 3, 3, 2, 10, 7, 4, 10, 4, 6, 6, 34, 4, 1, 1, 2, 7, + 3, 8, 6, 3, 3, 7, 3, 9, 1, 1, 2, 2, 1, 1, 3, 10, 1, 3, 6, 2, 1, 1, 1, 1, 1, 1, 1, 243,2, 2, 28, 7, 3, 3, 18, 10, 4, 4, 5, 33, 1, + 5, 9, 7, 5, 1, 1, 1, 1, 1, 1, 1, 3, 2, 5, 5, 5, 5, 5, 12, 5, 52, 24, 4, 10, 3, 3, 8, 4, 3, 1, 1, 1, 3, 4, 6, 8, 3, 3, 3, 1, 16, + 9, 5, 5, 5, 3, 1, 1, 1, 1, 1, 21, 3, 6, 35, 10, 9, 3, 3, 3, 19, 10, 5, 4, 4, 5, 5, 5, 3, 1, 5, 1, 1, 7, 4, 2, 2, 94, 6, 2, 5, 4, + 1, 34, 8, 5, 19, 8, 5, 4, 5, 13, 4, 3, 5, 5, 9, 5, 4, 4, 4, 4, 20, 4, 4, 1, 3, 19, 6, 1, 1, 4, 6, 1, 3, 3, 3, 36, 11, 9, 6, 5, 9, + 8, 6, 6, 16, 4, 4, 4, 3, 6, 3, 1, 1, 1, 1, 2, 1, 30, 2, 2, 2, 10, 6, 6, 6, 5, 2, 2, 2, 11, 7, 18, 7, 5, 2, 2, 2, 12, 8, 2, 2, 2, + 2, 106,14, 14, 14, 5, 7, 3, 2, 2, 6, 5, 5, 5, 5, 14, 4, 4, 4, 9, 7, 7, 2, 44, 5, 5, 5, 2, 1, 5, 5, 4, 4, 4, 8, 1, 1, 5, 2, 4, 4, + 3, 15, 4, 4, 4, 11, 3, 3, 8, 8, 8, 8, 5, 3, 3, 10, 8, 7, 7, 7, 7, 19, 9, 9, 9, 6, 2, 2, 2, 7, 7, 7, 1, 1, 1, 1, 18, 4, 3, 1, 7, + 6, 4, 24, 1, 6, 5, 5, 12, 4, 3, 1, 1, 1, 1, 4, 5, 5, 8, 2, 9, 20, 5, 2, 2, 3, 5, 10, 5, 3, 2, 32, 2, 7, 1, 13, 4, 3, 2, 44, 3, 3, + 2, 6, 4, 4, 4, 3, 3, 3, 4, 3, 3, 7, 6, 6, 6, 4, 4, 4, 4, 12, 3, 5, 2, 3, 2, 16, 6, 5, 4, 4, 34, 3, 4, 3, 4, 5, 12, 4, 4, 4, 4, + 5, 5, 5, 2, 15, 3, 4, 6, 3, 9, 4, 3, 7, 5, 2, 10, 4, 2, 2, 18, 3, 7, 3, 28, 6, 4, 5, 4, 11, 10, 3, 2, 4, 17, 11, 6, 3, 1, 13, 6, 6, + 4, 74, 3, 5, 7, 2, 5, 7, 3, 5, 3, 3, 2, 12, 4, 3, 5, 11, 5, 4, 4, 4, 4, 4, 7, 3, 3, 2, 2, 2, 2, 140,2, 1, 1, 20, 19, 13, 9, 2, 4, + 4, 20, 12, 8, 19, 1, 16, 11, 11, 5, 19, 2, 2, 15, 14, 4, 3, 2, 2, 23, 10, 6, 6, 7, 7, 7, 6, 6, 6, 6, 6, 4, 2, 30, 4, 4, 6, 4, 5, 5, 5, + 6, 161,25, 7, 6, 3, 1, 22, 15, 7, 7, 10, 8, 3, 50, 3, 2, 1, 1, 1, 1, 1, 1, 8, 8, 6, 4, 9, 5, 12, 11, 9, 9, 3, 15, 13, 9, 6, 3, 2, 8, + 2, 3, 15, 10, 4, 4, 6, 4, 5, 3, 24, 19, 17, 7, 4, 2, 2, 2, 59, 13, 6, 5, 5, 5, 5, 3, 8, 7, 6, 5, 1, 1, 4, 6, 3, 6, 4, 2, 2, 6, 4, + 31, 29, 9, 3, 4, 3, 9, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 12, 3, 3, 2, 10, 4, 2, 15, 3, 2, 6, 2, 4, 3, 2, 8, 17, 4, 2, 4, 4, 4, 4, + 3, 98, 6, 2, 2, 4, 3, 3, 1, 1, 1, 5, 4, 12, 3, 8, 6, 6, 8, 4, 4, 6, 4, 3, 3, 2, 4, 13, 2, 2, 6, 5, 12, 7, 4, 3, 3, 4, 4, 4, 4, + 4, 8, 6, 2, 2, 31, 2, 5, 4, 7, 4, 2, 23, 8, 6, 3, 3, 2, 2, 17, 6, 7, 7, 4, 4, 4, 17, 3, 1, 2, 124,39, 17, 12, 5, 5, 6, 3, 3, 3, 7, + 3, 19, 5, 5, 3, 3, 3, 39, 5, 11, 7, 7, 7, 3, 4, 4, 4, 3, 8, 3, 9, 3, 3, 3, 3, 153,33, 6, 6, 5, 9, 4, 22, 7, 5, 8, 7, 5, 2, 37, 2, + 2, 15, 7, 7, 4, 5, 4, 3, 9, 5, 2, 30, 5, 5, 5, 4, 2, 1, 4, 5, 5, 8, 4, 3, 2, 200,21, 2, 3, 1, 1, 25, 13, 7, 3, 2, 4, 28, 10, 3, 4, + 4, 8, 4, 8, 5, 2, 3, 5, 10, 5, 2, 2, 2, 20, 3, 9, 5, 22, 2, 1, 5, 6, 6, 9, 2, 1, 1, 1, 19, 5, 4, 2, 2, 2, 6, 2, 2, 1, 2, 8, 2, + 24, 3, 3, 3, 2, 4, 4, 13, 9, 9, 9, 9, 5, 2, 2, 238,26, 3, 2, 2, 9, 5, 3, 3, 3, 5, 37, 12, 8, 4, 6, 4, 7, 5, 5, 1, 1, 1, 3, 3, 5, + 4, 4, 4, 2, 3, 35, 13, 7, 6, 6, 5, 13, 10, 10, 3, 3, 2, 23, 2, 2, 8, 8, 10, 5, 5, 3, 3, 3, 7, 4, 54, 19, 18, 10, 10, 10, 6, 8, 15, 2, 3, + 3, 3, 20, 2, 2, 10, 10, 10, 3, 4, 3, 3, 3, 3, 5, 3, 3, 31, 12, 11, 11, 7, 5, 5, 3, 2, 2, 1, 6, 3, 3, 3, 20, 20, 2, 5, 13, 5, 5, 5, 3, + 19, 8, 2, 1, 2, 2, 2, 3, 4, 2, 16, 5, 3, 3, 3, 7, 6, 57, 8, 7, 7, 7, 2, 4, 6, 6, 6, 12, 4, 7, 12, 11, 10, 5, 13, 4, 3, 2, 2, 45, 18, + 13, 10, 5, 3, 3, 13, 13, 3, 3, 5, 3, 2, 30, 9, 4, 4, 9, 9, 6, 5, 6, 5, 5, 5, 44, 15, 10, 10, 3, 7, 4, 4, 17, 17, 8, 5, 9, 6, 1, 6, 3, + 1, 59, 12, 4, 4, 4, 7, 2, 2, 12, 9, 19, 5, 5, 5, 8, 3, 3, 1, 29, 1, 1, 1, 5, 5, 2, 2, 12, 1, 4, 3, 3, 3, 1, 1, 1, 1, 173,32, 12, 4, + 6, 7, 7, 3, 2, 11, 3, 3, 10, 2, 2, 1, 31, 8, 5, 5, 4, 10, 4, 10, 8, 9, 3, 2, 47, 15, 11, 7, 3, 1, 1, 5, 1, 1, 11, 8, 7, 15, 2, 4, 3, + 3, 4, 4, 4, 4, 4, 3, 3, 3, 2, 10, 4, 3, 2, 6, 6, 6, 3, 5, 3, 40, 3, 3, 8, 8, 1, 11, 3, 10, 4, 2, 157,11, 3, 59, 18, 4, 4, 3, 2, 6, + 27, 2, 6, 4, 10, 5, 48, 11, 9, 2, 5, 14, 10, 7, 7, 7, 7, 10, 6, 6, 30, 23, 12, 2, 2, 2, 2, 10, 10, 9, 9, 4, 3, 24, 7, 5, 2, 5, 4, 4, 4, + 5, 4, 4, 13, 2, 4, 4, 34, 6, 1, 3, 1, 1, 1, 18, 8, 4, 6, 3, 2, 15, 5, 4, 2, 4, 3, 74, 3, 2, 2, 2, 7, 2, 2, 2, 2, 2, 2, 1, 2, 21, + 1, 11, 2, 2, 1, 1, 2, 2, 2, 2, 1, 2, 1, 1, 5, 3, 1, 1, 1, 1, 1, 1, 1, 15, 3, 1, 1, 1, 1, 1, 1, 6, 3, 3, 3, 3, 3, 4, 3, 3, 3, + 10, 5, 3, 1, 1, 1, 1, 3, 2, 2, 3, 1, 1, 1, 1, 174,9, 1, 4, 1, 4, 3, 3, 3, 1, 42, 5, 2, 11, 10, 3, 2, 1, 4, 2, 7, 4, 4, 4, 4, 3, + 4, 4, 4, 4, 2, 10, 8, 2, 2, 2, 3, 2, 1, 1, 1, 1, 1, 1, 1, 29, 2, 2, 22, 2, 11, 2, 7, 2, 2, 2, 2, 3, 3, 3, 1, 3, 1, 1, 1, 43, 4, + 21, 3, 8, 4, 2, 2, 2, 2, 2, 4, 3, 8, 4, 3, 3, 1, 1, 1, 10, 3, 3, 20, 7, 4, 5, 5, 16, 3, 4, 47, 9, 2, 9, 2, 1, 3, 10, 3, 4, 4, 8, + 1, 1, 4, 2, 154,11, 7, 7, 15, 5, 4, 8, 4, 4, 4, 4, 68, 23, 21, 17, 3, 3, 1, 1, 15, 3, 4, 4, 5, 6, 3, 3, 3, 44, 3, 19, 5, 4, 4, 5, 3, + 3, 3, 2, 2, 5, 6, 1, 2, 75, 18, 6, 3, 3, 7, 7, 19, 5, 5, 16, 11, 4, 10, 6, 6, 6, 5, 2, 96, 8, 5, 5, 3, 15, 7, 1, 1, 3, 2, 6, 2, 1, + 1, 3, 2, 5, 3, 7, 5, 4, 6, 3, 3, 1, 1, 1, 1, 2, 6, 17, 5, 3, 1, 2, 6, 1, 3, 28, 4, 3, 3, 10, 2, 6, 5, 85, 8, 2, 24, 7, 3, 7, 3, + 26, 23, 3, 2, 2, 3, 2, 2, 4, 3, 10, 4, 6, 3, 2, 6, 1, 1, 1, 1, 6, 2, 2, 2, 1, 11, 3, 1, 17, 6, 2, 6, 3, 29, 3, 3, 2, 3, 2, 2, 4, + 1, 114,7, 3, 2, 9, 3, 3, 3, 13, 5, 3, 12, 2, 4, 50, 1, 2, 11, 3, 4, 2, 2, 3, 8, 6, 4, 3, 3, 2, 4, 2, 3, 8, 5, 1, 1, 1, 1, 1, 25, + 2, 2, 2, 2, 6, 48, 3, 2, 6, 5, 5, 4, 3, 22, 12, 3, 4, 2, 2, 1, 1, 81, 4, 4, 8, 2, 1, 12, 4, 3, 6, 12, 4, 1, 1, 2, 9, 11, 2, 4, 54, + 5, 9, 9, 3, 5, 2, 1, 1, 2, 14, 7, 4, 3, 1, 1, 3, 7, 5, 5, 2, 8, 90, 18, 3, 1, 11, 56, 7, 4, 36, 6, 2, 2, 2, 1, 3, 4, 4, 6, 8, 5, + 2, 2, 2, 2, 2, 21, 11, 3, 4, 40, 4, 3, 3, 3, 3, 2, 6, 6, 2, 3, 2, 3, 2, 2, 1, 3, 1, 1, 1, 1, 1, 5, 2, 2, 2, 4, 2, 2, 1, 1, 1, + 1, 1, 3, 2, 1, 1, 6, 2, 2, 2, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 5, 8, 4, 2, 74, 5, 5, 37, 1, 3, 2, 2, 2, 2, 2, 2, + 7, 3, 4, 7, 1, 4, 1, 9, 4, 170,14, 2, 5, 1, 1, 23, 8, 6, 8, 57, 2, 43, 34, 5, 4, 5, 3, 1, 35, 6, 6, 4, 3, 3, 2, 18, 4, 3, 4, 2, 1, + 10, 7, 2, 12, 10, 2, 8, 6, 6, 167,4, 8, 3, 32, 5, 15, 1, 1, 3, 3, 1, 4, 1, 3, 2, 2, 2, 111,1, 1, 2, 6, 1, 2, 2, 2, 3, 2, 2, 2, 2, + 28, 2, 18, 3, 7, 2, 3, 6, 3, 3, 4, 10, 6, 4, 2, 3, 16, 2, 2, 2, 2, 2, 126,12, 4, 11, 6, 38, 2, 2, 2, 3, 11, 6, 7, 4, 4, 4, 18, 6, 3, + 2, 2, 2, 3, 4, 3, 25, 4, 3, 20, 13, 3, 7, 4, 4, 4, 77, 4, 5, 4, 12, 7, 1, 3, 5, 4, 3, 2, 6, 4, 15, 2, 3, 5, 10, 1, 1, 1, 5, 3, 1, + 7, 3, 3, 1, 53, 9, 2, 4, 13, 8, 6, 5, 2, 5, 5, 2, 2, 2, 5, 1, 1, 6, 5, 1, 1, 1, 48, 4, 2, 5, 2, 2, 11, 3, 3, 1, 11, 4, 4, 3, 2, + 1, 1, 2, 2, 2, 1, 7, 6, 2, 12, 2, 2, 4, 3, 3, 96, 9, 6, 10, 2, 2, 2, 10, 5, 5, 45, 4, 15, 8, 2, 2, 2, 1, 10, 7, 5, 3, 5, 5, 156,91, + 5, 4, 4, 3, 67, 5, 3, 7, 16, 4, 2, 3, 11, 4, 5, 9, 9, 7, 3, 4, 4, 8, 2, 15, 2, 1, 11, 4, 4, 3, 3, 2, 5, 2, 3, 6, 2, 4, 73, 14, 11, + 10, 2, 2, 2, 6, 7, 1, 1, 1, 2, 1, 1, 1, 12, 3, 4, 7, 4, 2, 1, 1, 9, 4, 6, 76, 3, 1, 15, 11, 2, 13, 2, 4, 3, 2, 12, 4, 1, 2, 6, 14, + 4, 16, 7, 3, 3, 2, 3, 3, 3, 15, 3, 2, 2, 1, 1, 43, 2, 14, 7, 4, 3, 8, 5, 3, 5, 4, 2, 14, 2, 8, 127,5, 21, 2, 4, 3, 3, 10, 5, 1, 2, + 12, 3, 8, 4, 4, 54, 15, 3, 4, 4, 2, 3, 3, 3, 3, 5, 3, 2, 3, 4, 1, 1, 2, 2, 3, 3, 4, 2, 2, 2, 1, 7, 5, 4, 8, 3, 24, 3, 3, 1, 6, + 2, 5, 3, 12, 2, 2, 2, 6, 1, 3, 2, 2, 4, 57, 4, 20, 7, 6, 4, 14, 2, 5, 3, 3, 3, 4, 19, 4, 5, 1, 2, 3, 3, 1, 3, 126,18, 4, 3, 4, 11, + 4, 3, 3, 44, 5, 3, 16, 5, 5, 7, 2, 3, 3, 3, 2, 1, 4, 3, 2, 2, 2, 2, 2, 1, 2, 2, 10, 4, 4, 2, 20, 7, 3, 5, 3, 3, 2, 2, 2, 7, 1, + 5, 4, 1, 128,3, 2, 1, 4, 19, 5, 13, 2, 2, 1, 2, 3, 2, 2, 6, 3, 1, 1, 26, 22, 4, 3, 5, 3, 3, 2, 5, 3, 25, 7, 10, 6, 2, 21, 7, 4, 4, + 2, 2, 21, 3, 1, 12, 3, 8, 4, 2, 2, 50, 3, 4, 3, 1, 4, 10, 1, 11, 5, 3, 2, 6, 4, 19, 8, 7, 6, 4, 4, 3, 3, 35, 14, 12, 3, 2, 3, 1, 1, + 2, 5, 2, 27, 6, 3, 7, 3, 2, 3, 3, 6, 1, 1, 4, 4, 3, 2, 15, 2, 1, 1, 2, 2, 2, 10, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 10, 3, 85, 8, 5, + 3, 3, 12, 8, 7, 2, 21, 9, 6, 22, 2, 3, 2, 9, 4, 2, 5, 3, 2, 1, 5, 2, 16, 12, 2, 1, 3, 74, 7, 11, 4, 2, 15, 3, 3, 15, 2, 2, 2, 2, 2, + 5, 2, 6, 5, 6, 3, 39, 3, 5, 4, 5, 4, 7, 3, 7, 3, 42, 5, 2, 25, 2, 7, 5, 2, 3, 4, 4, 36, 8, 7, 5, 15, 5, 5, 2, 17, 7, 2, 1, 18, 1, + 6, 5, 1, 5, 2, 34, 2, 18, 4, 5, 4, 1, 6, 69, 4, 12, 4, 3, 5, 3, 2, 5, 4, 9, 3, 4, 7, 4, 14, 3, 2, 1, 1, 1, 1, 1, 2, 3, 3, 4, 1, + 1, 1, 1, 1, 1, 76, 1, 5, 4, 2, 17, 3, 3, 3, 1, 7, 5, 2, 2, 2, 3, 15, 8, 5, 4, 2, 3, 8, 2, 2, 30, 4, 8, 4, 2, 6, 4, 4, 5, 157,4, + 12, 8, 2, 2, 6, 29, 2, 2, 4, 7, 3, 4, 7, 3, 4, 4, 3, 3, 46, 3, 17, 9, 7, 9, 6, 4, 8, 3, 2, 2, 1, 35, 5, 2, 6, 7, 4, 3, 10, 2, 63, + 7, 2, 4, 2, 2, 25, 3, 11, 5, 4, 4, 4, 4, 4, 3, 3, 2, 3, 10, 2, 4, 2, 2, 2, 2, 6, 7, 1, 3, 3, 1, 1, 1, 3, 1, 1, 1, 1, 3, 2, 1, + 1, 132,16, 11, 15, 5, 3, 2, 4, 1, 16, 2, 9, 3, 7, 4, 2, 2, 3, 2, 10, 2, 2, 12, 5, 1, 1, 4, 5, 6, 11, 5, 7, 6, 2, 4, 7, 3, 3, 9, 1, + 1, 1, 5, 1, 2, 2, 2, 1, 1, 8, 2, 14, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 1, 12, 2, 1, 6, 6, 6, 6, 5, 3, 1, 1, 1, 1, 1, 1, 2, 2, 2, + 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 39, 6, 4, 1, 1, 8, 1, 1, 1, 1, 4, 2, 9, 1, 1, 3, + 4, 107,30, 4, 3, 3, 2, 1, 11, 3, 3, 9, 7, 5, 2, 15, 3, 2, 6, 14, 8, 7, 4, 15, 4, 3, 8, 11, 4, 5, 4, 2, 80, 7, 1, 1, 10, 2, 5, 3, 3, + 1, 1, 21, 7, 1, 2, 5, 3, 12, 3, 2, 1, 1, 23, 8, 6, 6, 5, 4, 10, 6, 6, 6, 2, 2, 2, 2, 78, 8, 1, 16, 4, 7, 7, 1, 6, 4, 14, 7, 5, 11, + 3, 3, 3, 3, 2, 24, 1, 4, 3, 6, 1, 1, 1, 1, 5, 2, 1, 56, 9, 4, 2, 19, 2, 4, 1, 1, 1, 9, 3, 6, 1, 7, 4, 3, 2, 53, 14, 2, 3, 4, 2, + 11, 4, 3, 6, 4, 3, 3, 2, 3, 3, 2, 2, 4, 5, 3, 2, 5, 42, 11, 2, 4, 3, 4, 9, 4, 2, 2, 4, 4, 3, 1, 1, 89, 3, 6, 4, 20, 2, 3, 3, 5, + 5, 2, 27, 16, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 5, 6, 2, 2, 2, 7, 4, 54, 14, 2, 2, 3, 5, 4, 3, 7, 2, 2, 5, + 3, 2, 10, 5, 4, 65, 2, 2, 6, 3, 3, 3, 2, 18, 10, 6, 4, 3, 4, 4, 4, 6, 4, 2, 4, 3, 8, 3, 3, 3, 35, 4, 4, 5, 4, 2, 12, 1, 1, 1, 1, + 2, 7, 3, 2, 38, 3, 2, 2, 4, 2, 4, 9, 5, 3, 3, 3, 2, 31, 7, 6, 5, 2, 7, 19, 3, 8, 7, 27, 5, 11, 3, 3, 12, 3, 41, 4, 2, 5, 6, 4, 2, + 2, 4, 4, 17, 8, 46, 24, 7, 6, 5, 4, 9, 4, 4, 7, 10, 2, 3, 2, 5, 2, 11, 2, 1, 253,4, 1, 43, 3, 2, 13, 3, 6, 4, 11, 4, 3, 21, 5, 1, 6, + 3, 4, 2, 12, 3, 2, 2, 14, 2, 1, 4, 2, 37, 6, 4, 2, 3, 5, 15, 19, 3, 1, 1, 34, 9, 2, 3, 5, 3, 7, 6, 2, 2, 2, 5, 4, 15, 3, 4, 6, 6, + 5, 2, 24, 2, 10, 9, 6, 5, 4, 2, 3, 18, 1, 1, 6, 2, 2, 2, 2, 3, 36, 4, 13, 6, 4, 17, 9, 1, 1, 5, 177,15, 4, 12, 7, 2, 30, 3, 3, 5, 13, + 3, 6, 3, 2, 10, 3, 2, 20, 2, 3, 2, 6, 8, 3, 5, 20, 3, 4, 3, 2, 15, 4, 6, 3, 3, 7, 6, 2, 3, 2, 5, 4, 4, 9, 10, 3, 10, 2, 1, 2, 3, + 3, 2, 38, 8, 5, 3, 1, 1, 5, 4, 1, 6, 4, 4, 4, 3, 2, 1, 15, 7, 3, 3, 2, 17, 8, 5, 3, 16, 4, 5, 5, 1, 1, 3, 4, 3, 2, 1, 9, 3, 1, + 11, 2, 3, 1, 1, 1, 3, 20, 3, 2, 1, 1, 2, 1, 7, 3, 125,5, 5, 4, 36, 5, 4, 2, 2, 2, 2, 11, 4, 2, 12, 5, 5, 4, 4, 26, 3, 1, 1, 1, 1, + 7, 6, 4, 5, 2, 1, 5, 2, 2, 28, 2, 2, 2, 1, 2, 11, 3, 5, 2, 4, 5, 3, 5, 6, 1, 45, 4, 2, 1, 3, 1, 9, 5, 4, 5, 3, 13, 3, 5, 4, 4, + 1, 1, 1, 2, 254,79, 5, 2, 6, 3, 3, 2, 2, 16, 3, 2, 3, 2, 2, 11, 6, 3, 3, 6, 2, 2, 4, 2, 1, 1, 14, 3, 3, 3, 6, 1, 2, 2, 2, 21, 3, + 3, 10, 8, 4, 1, 10, 2, 2, 3, 11, 2, 5, 2, 12, 4, 3, 3, 2, 10, 4, 2, 6, 2, 7, 4, 12, 3, 3, 4, 11, 3, 4, 1, 12, 5, 3, 5, 15, 8, 7, 4, + 4, 6, 3, 102,10, 2, 2, 1, 1, 35, 28, 17, 9, 8, 4, 3, 2, 2, 2, 6, 4, 3, 1, 1, 2, 1, 2, 2, 2, 28, 7, 4, 3, 4, 5, 4, 5, 142,1, 1, 21, + 13, 4, 1, 2, 2, 8, 7, 4, 8, 4, 3, 3, 6, 1, 1, 1, 3, 3, 27, 11, 9, 9, 8, 3, 3, 3, 3, 2, 8, 2, 6, 3, 5, 2, 15, 3, 9, 8, 4, 3, 3, + 21, 19, 13, 6, 4, 8, 5, 1, 1, 1, 1, 1, 3, 98, 3, 10, 7, 7, 2, 7, 7, 4, 14, 4, 9, 1, 1, 1, 1, 1, 4, 3, 15, 2, 1, 6, 4, 10, 4, 4, 2, + 5, 5, 2, 105,32, 8, 6, 1, 7, 4, 7, 3, 2, 20, 1, 1, 7, 5, 1, 31, 3, 3, 10, 5, 5, 17, 2, 3, 3, 43, 13, 3, 2, 1, 3, 5, 4, 1, 2, 3, 20, + 3, 2, 2, 10, 5, 5, 5, 5, 50, 10, 4, 2, 7, 4, 7, 1, 4, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 2, 6, 1, 1, 2, 3, 2, 242,5, 4, 4, 1, 9, 6, + 3, 5, 2, 2, 3, 40, 5, 6, 7, 10, 5, 6, 3, 20, 6, 9, 3, 3, 39, 1, 1, 14, 6, 6, 3, 5, 3, 3, 2, 8, 1, 1, 1, 6, 7, 4, 2, 8, 4, 1, 1, + 1, 80, 4, 2, 1, 6, 2, 4, 3, 6, 10, 3, 2, 8, 4, 8, 3, 3, 5, 2, 12, 4, 3, 5, 4, 2, 12, 2, 6, 5, 5, 11, 6, 5, 4, 2, 1, 27, 2, 4, 10, + 2, 7, 7, 4, 3, 164,10, 2, 10, 5, 2, 10, 7, 3, 2, 8, 4, 9, 4, 1, 12, 2, 2, 9, 4, 3, 9, 4, 3, 4, 8, 3, 2, 15, 2, 2, 2, 7, 4, 26, 4, + 2, 3, 2, 2, 4, 11, 4, 6, 21, 4, 2, 1, 4, 2, 2, 1, 1, 1, 171,3, 7, 4, 6, 8, 7, 6, 3, 1, 1, 1, 25, 7, 3, 1, 9, 6, 3, 17, 14, 6, 3, + 3, 2, 20, 6, 3, 4, 2, 14, 2, 1, 5, 3, 9, 3, 4, 26, 4, 5, 2, 1, 1, 1, 1, 4, 3, 1, 13, 4, 4, 1, 3, 2, 2, 1, 1, 1, 118,8, 2, 4, 2, 5, 4, 2, 23, 3, 5, 4, 5, 4, 3, 11, 8, 3, 19, 5, 7, 10, 2, 2, 12, 5, 4, 3, 4, 3, 8, 2, 2, 10, 4, 1, 1, 1, 2, 2, 4, 4, 2, 2, 2, 130, - 28, 3, 1, 2, 2, 3, 4, 3, 3, 2, 2, 3, 48, 4, 2, 2, 13, 1, 2, 5, 5, 4, 8, 3, 2, 2, 24, 7, 5, 2, 1, 6, 4, 1, 2, 3, 20, 2, 5, 4, 10, - 7, 3, 10, 3, 2, 82, 16, 7, 1, 1, 2, 3, 3, 18, 1, 1, 2, 5, 2, 7, 2, 3, 30, 9, 4, 8, 3, 2, 9, 10, 3, 3, 8, 2, 83, 18, 3, 3, 2, 2, 2, - 2, 2, 30, 3, 3, 6, 2, 2, 10, 8, 5, 1, 5, 2, 3, 17, 3, 9, 5, 7, 2, 9, 3, 4, 194,4, 3, 1, 1, 53, 3, 2, 5, 3, 3, 29, 4, 7, 3, 3, 3, - 4, 2, 2, 5, 3, 1, 2, 2, 5, 29, 10, 5, 4, 4, 4, 4, 5, 4, 8, 3, 20, 3, 4, 7, 39, 30, 2, 3, 3, 3, 3, 5, 5, 2, 2, 6, 8, 8, 1, 3, 5, - 3, 1, 1, 1, 92, 23, 5, 3, 4, 3, 23, 2, 6, 1, 1, 4, 2, 1, 6, 3, 10, 4, 2, 27, 3, 10, 5, 2, 3, 1, 1, 1, 7, 2, 2, 135,6, 12, 7, 4, 5, - 21, 4, 2, 5, 5, 2, 3, 2, 31, 4, 2, 12, 5, 3, 3, 16, 8, 4, 3, 2, 2, 5, 4, 3, 2, 10, 2, 5, 4, 12, 4, 5, 2, 3, 3, 145,60, 6, 3, 2, 9, - 2, 12, 2, 2, 3, 27, 13, 9, 3, 1, 11, 5, 3, 1, 57, 3, 4, 20, 1, 3, 7, 2, 3, 2, 11, 4, 10, 3, 2, 3, 2, 22, 1, 1, 1, 1, 7, 2, 8, 5, 2, - 3, 2, 71, 16, 2, 2, 1, 3, 3, 1, 1, 1, 4, 2, 2, 2, 1, 16, 13, 4, 4, 1, 8, 5, 3, 3, 2, 4, 3, 2, 7, 3, 3, 3, 3, 5, 3, 3, 3, 3, 3, - 9, 3, 5, 5, 3, 1, 1, 196,5, 2, 4, 3, 16, 4, 2, 1, 6, 31, 11, 8, 7, 12, 10, 9, 9, 2, 46, 5, 3, 16, 4, 3, 13, 11, 7, 2, 39, 3, 3, 26, 6, - 5, 23, 3, 3, 3, 3, 2, 2, 4, 11, 5, 4, 2, 2, 2, 166,38, 2, 6, 2, 2, 2, 2, 1, 1, 1, 20, 6, 6, 6, 6, 2, 38, 8, 8, 15, 12, 2, 3, 3, 3, - 3, 14, 38, 9, 4, 1, 4, 1, 16, 14, 1, 5, 4, 21, 2, 1, 7, 5, 2, 2, 29, 8, 5, 3, 5, 3, 3, 3, 3, 3, 5, 4, 4, 3, 2, 1, 1, 1, 70, 10, 10, - 8, 4, 3, 2, 23, 12, 2, 3, 3, 10, 9, 4, 2, 6, 8, 2, 5, 4, 3, 2, 2, 1, 1, 1, 6, 4, 4, 2, 1, 12, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 2, 1, 1, 1, 222,29, 3, 8, 3, 3, 1, 6, 3, 6, 4, 3, 3, 8, 2, 4, 3, 2, 9, 16, 7, 5, 10, 4, 5, 2, 3, 19, 4, 4, 3, 16, 4, - 3, 2, 10, 4, 34, 14, 12, 2, 2, 2, 20, 3, 3, 9, 9, 16, 2, 2, 4, 4, 5, 15, 5, 3, 6, 3, 42, 16, 2, 12, 11, 9, 6, 1, 10, 1, 1, 3, 2, 5, 2, - 2, 7, 3, 3, 115,4, 6, 3, 3, 3, 5, 1, 7, 2, 2, 2, 2, 19, 12, 12, 5, 32, 30, 26, 8, 7, 5, 4, 13, 6, 6, 6, 24, 6, 6, 6, 5, 5, 13, 5, 8, - 7, 2, 66, 15, 4, 5, 3, 2, 2, 4, 2, 6, 4, 10, 4, 4, 4, 4, 3, 8, 5, 3, 4, 9, 8, 3, 97, 2, 5, 2, 2, 2, 12, 3, 3, 7, 3, 1, 10, 3, 9, - 2, 13, 4, 1, 1, 1, 1, 4, 1, 6, 2, 1, 1, 4, 5, 3, 9, 3, 3, 2, 60, 9, 4, 3, 1, 1, 7, 2, 4, 5, 5, 5, 5, 8, 2, 13, 10, 5, 5, 5, 11, - 9, 103,10, 6, 5, 18, 8, 3, 1, 1, 5, 3, 7, 10, 3, 3, 3, 3, 3, 7, 3, 6, 4, 9, 5, 3, 3, 7, 7, 5, 16, 2, 4, 1, 1, 3, 3, 165,9, 4, 7, - 2, 2, 6, 2, 3, 2, 35, 17, 17, 7, 5, 2, 3, 4, 4, 3, 12, 4, 3, 1, 18, 5, 5, 3, 4, 4, 5, 25, 6, 7, 4, 5, 3, 5, 3, 2, 1, 4, 2, 11, 4, - 3, 4, 2, 3, 4, 107,15, 7, 6, 1, 12, 7, 39, 2, 1, 6, 2, 2, 2, 4, 3, 3, 3, 3, 3, 4, 4, 4, 4, 11, 9, 7, 4, 1, 1, 2, 6, 5, 4, 2, 8, - 6, 13, 8, 7, 4, 1, 1, 3, 2, 2, 2, 173,13, 7, 5, 4, 1, 14, 2, 4, 3, 3, 3, 2, 1, 1, 1, 1, 1, 16, 4, 3, 3, 3, 2, 1, 1, 1, 1, 4, 2, - 2, 1, 1, 1, 1, 1, 10, 2, 5, 3, 12, 5, 4, 1, 1, 1, 1, 10, 3, 1, 1, 1, 4, 5, 4, 44, 7, 6, 6, 6, 5, 11, 4, 2, 13, 5, 7, 7, 5, 4, 4, - 4, 30, 3, 8, 5, 11, 4, 4, 4, 4, 3, 4, 2, 2, 6, 3, 77, 18, 13, 13, 12, 6, 3, 8, 4, 3, 3, 2, 2, 5, 1, 3, 9, 20, 7, 4, 4, 3, 2, 1, 1, - 1, 1, 5, 3, 2, 1, 8, 8, 2, 2, 2, 1, 22, 22, 15, 9, 3, 3, 3, 4, 2, 254,26, 7, 7, 4, 2, 3, 5, 3, 8, 2, 4, 25, 2, 2, 15, 5, 2, 2, 3, - 6, 29, 18, 6, 7, 34, 11, 9, 6, 3, 2, 3, 7, 2, 1, 1, 1, 1, 1, 2, 1, 1, 5, 4, 2, 3, 5, 2, 1, 9, 1, 1, 4, 2, 2, 11, 8, 7, 6, 23, 15, - 4, 7, 3, 5, 3, 54, 10, 6, 4, 11, 30, 14, 10, 3, 2, 4, 2, 37, 6, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 13, 5, 6, 2, 2, 65, 6, 5, 2, 4, 6, 3, + 28, 3, 1, 2, 2, 3, 4, 3, 3, 2, 2, 3, 48, 4, 2, 2, 13, 1, 2, 5, 5, 4, 8, 3, 2, 2, 24, 7, 5, 2, 1, 6, 4, 1, 2, 3, 20, 2, 5, 4, 10, + 7, 3, 10, 3, 2, 82, 16, 7, 1, 1, 2, 3, 3, 18, 1, 1, 2, 5, 2, 7, 2, 3, 30, 9, 4, 8, 3, 2, 9, 10, 3, 3, 8, 2, 83, 18, 3, 3, 2, 2, 2, + 2, 2, 30, 3, 3, 6, 2, 2, 10, 8, 5, 1, 5, 2, 3, 17, 3, 9, 5, 7, 2, 9, 3, 4, 194,4, 3, 1, 1, 53, 3, 2, 5, 3, 3, 29, 4, 7, 3, 3, 3, + 4, 2, 2, 5, 3, 1, 2, 2, 5, 29, 10, 5, 4, 4, 4, 4, 5, 4, 8, 3, 20, 3, 4, 7, 39, 30, 2, 3, 3, 3, 3, 5, 5, 2, 2, 6, 8, 8, 1, 3, 5, + 3, 1, 1, 1, 92, 23, 5, 3, 4, 3, 23, 2, 6, 1, 1, 4, 2, 1, 6, 3, 10, 4, 2, 27, 3, 10, 5, 2, 3, 1, 1, 1, 7, 2, 2, 135,6, 12, 7, 4, 5, + 21, 4, 2, 5, 5, 2, 3, 2, 31, 4, 2, 12, 5, 3, 3, 16, 8, 4, 3, 2, 2, 5, 4, 3, 2, 10, 2, 5, 4, 12, 4, 5, 2, 3, 3, 145,60, 6, 3, 2, 9, + 2, 12, 2, 2, 3, 27, 13, 9, 3, 1, 11, 5, 3, 1, 57, 3, 4, 20, 1, 3, 7, 2, 3, 2, 11, 4, 10, 3, 2, 3, 2, 22, 1, 1, 1, 1, 7, 2, 8, 5, 2, + 3, 2, 71, 16, 2, 2, 1, 3, 3, 1, 1, 1, 4, 2, 2, 2, 1, 16, 13, 4, 4, 1, 8, 5, 3, 3, 2, 4, 3, 2, 7, 3, 3, 3, 3, 5, 3, 3, 3, 3, 3, + 9, 3, 5, 5, 3, 1, 1, 196,5, 2, 4, 3, 16, 4, 2, 1, 6, 31, 11, 8, 7, 12, 10, 9, 9, 2, 46, 5, 3, 16, 4, 3, 13, 11, 7, 2, 39, 3, 3, 26, 6, + 5, 23, 3, 3, 3, 3, 2, 2, 4, 11, 5, 4, 2, 2, 2, 166,38, 2, 6, 2, 2, 2, 2, 1, 1, 1, 20, 6, 6, 6, 6, 2, 38, 8, 8, 15, 12, 2, 3, 3, 3, + 3, 14, 38, 9, 4, 1, 4, 1, 16, 14, 1, 5, 4, 21, 2, 1, 7, 5, 2, 2, 29, 8, 5, 3, 5, 3, 3, 3, 3, 3, 5, 4, 4, 3, 2, 1, 1, 1, 70, 10, 10, + 8, 4, 3, 2, 23, 12, 2, 3, 3, 10, 9, 4, 2, 6, 8, 2, 5, 4, 3, 2, 2, 1, 1, 1, 6, 4, 4, 2, 1, 12, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 1, 1, 1, 222,29, 3, 8, 3, 3, 1, 6, 3, 6, 4, 3, 3, 8, 2, 4, 3, 2, 9, 16, 7, 5, 10, 4, 5, 2, 3, 19, 4, 4, 3, 16, 4, + 3, 2, 10, 4, 34, 14, 12, 2, 2, 2, 20, 3, 3, 9, 9, 16, 2, 2, 4, 4, 5, 15, 5, 3, 6, 3, 42, 16, 2, 12, 11, 9, 6, 1, 10, 1, 1, 3, 2, 5, 2, + 2, 7, 3, 3, 115,4, 6, 3, 3, 3, 5, 1, 7, 2, 2, 2, 2, 19, 12, 12, 5, 32, 30, 26, 8, 7, 5, 4, 13, 6, 6, 6, 24, 6, 6, 6, 5, 5, 13, 5, 8, + 7, 2, 66, 15, 4, 5, 3, 2, 2, 4, 2, 6, 4, 10, 4, 4, 4, 4, 3, 8, 5, 3, 4, 9, 8, 3, 97, 2, 5, 2, 2, 2, 12, 3, 3, 7, 3, 1, 10, 3, 9, + 2, 13, 4, 1, 1, 1, 1, 4, 1, 6, 2, 1, 1, 4, 5, 3, 9, 3, 3, 2, 60, 9, 4, 3, 1, 1, 7, 2, 4, 5, 5, 5, 5, 8, 2, 13, 10, 5, 5, 5, 11, + 9, 103,10, 6, 5, 18, 8, 3, 1, 1, 5, 3, 7, 10, 3, 3, 3, 3, 3, 7, 3, 6, 4, 9, 5, 3, 3, 7, 7, 5, 16, 2, 4, 1, 1, 3, 3, 165,9, 4, 7, + 2, 2, 6, 2, 3, 2, 35, 17, 17, 7, 5, 2, 3, 4, 4, 3, 12, 4, 3, 1, 18, 5, 5, 3, 4, 4, 5, 25, 6, 7, 4, 5, 3, 5, 3, 2, 1, 4, 2, 11, 4, + 3, 4, 2, 3, 4, 107,15, 7, 6, 1, 12, 7, 39, 2, 1, 6, 2, 2, 2, 4, 3, 3, 3, 3, 3, 4, 4, 4, 4, 11, 9, 7, 4, 1, 1, 2, 6, 5, 4, 2, 8, + 6, 13, 8, 7, 4, 1, 1, 3, 2, 2, 2, 173,13, 7, 5, 4, 1, 14, 2, 4, 3, 3, 3, 2, 1, 1, 1, 1, 1, 16, 4, 3, 3, 3, 2, 1, 1, 1, 1, 4, 2, + 2, 1, 1, 1, 1, 1, 10, 2, 5, 3, 12, 5, 4, 1, 1, 1, 1, 10, 3, 1, 1, 1, 4, 5, 4, 44, 7, 6, 6, 6, 5, 11, 4, 2, 13, 5, 7, 7, 5, 4, 4, + 4, 30, 3, 8, 5, 11, 4, 4, 4, 4, 3, 4, 2, 2, 6, 3, 77, 18, 13, 13, 12, 6, 3, 8, 4, 3, 3, 2, 2, 5, 1, 3, 9, 20, 7, 4, 4, 3, 2, 1, 1, + 1, 1, 5, 3, 2, 1, 8, 8, 2, 2, 2, 1, 22, 22, 15, 9, 3, 3, 3, 4, 2, 254,26, 7, 7, 4, 2, 3, 5, 3, 8, 2, 4, 25, 2, 2, 15, 5, 2, 2, 3, + 6, 29, 18, 6, 7, 34, 11, 9, 6, 3, 2, 3, 7, 2, 1, 1, 1, 1, 1, 2, 1, 1, 5, 4, 2, 3, 5, 2, 1, 9, 1, 1, 4, 2, 2, 11, 8, 7, 6, 23, 15, + 4, 7, 3, 5, 3, 54, 10, 6, 4, 11, 30, 14, 10, 3, 2, 4, 2, 37, 6, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 13, 5, 6, 2, 2, 65, 6, 5, 2, 4, 6, 3, 3, 25, 6, 4, 5, 11, 10, 5, 6, 2, 3, 1, 1, 11, 2, 71, 5, 1, 1, 1, 1, 52, 25, 1, 2, 3, 8, 3, 3, 24, 3, 6, 4, 10, 4, 3, 19, 7, 7, 2, 128, - 5, 4, 2, 3, 2, 1, 1, 2, 2, 2, 3, 8, 4, 3, 3, 2, 2, 6, 4, 4, 4, 2, 1, 12, 5, 3, 6, 5, 5, 5, 9, 4, 3, 40, 8, 2, 2, 3, 3, 2, 27, - 3, 2, 2, 2, 2, 2, 2, 3, 2, 2, 6, 4, 2, 13, 1, 1, 1, 2, 3, 3, 2, 2, 1, 2, 11, 2, 2, 1, 1, 1, 1, 3, 1, 1, 2, 1, 1, 1, 3, 4, 2, - 18, 7, 6, 2, 17, 1, 16, 4, 2, 7, 7, 71, 9, 2, 5, 36, 33, 8, 3, 2, 2, 2, 2, 3, 5, 3, 21, 6, 3, 9, 3, 11, 26, 5, 6, 3, 1, 1, 1, 1, 1, - 1, 6, 2, 9, 1, 2, 39, 4, 14, 6, 5, 5, 4, 4, 8, 2, 3, 3, 2, 32, 4, 2, 2, 2, 4, 10, 6, 5, 1, 1, 1, 5, 2, 65, 12, 6, 3, 9, 3, 10, 4, - 3, 8, 5, 2, 5, 3, 6, 2, 1, 95, 6, 10, 12, 3, 9, 3, 3, 3, 2, 2, 2, 2, 7, 14, 3, 3, 2, 1, 5, 10, 3, 5, 4, 2, 16, 5, 4, 5, 26, 10, 4, - 3, 3, 5, 2, 4, 1, 5, 3, 134,8, 2, 16, 2, 2, 2, 4, 21, 5, 13, 6, 3, 5, 3, 8, 6, 30, 11, 5, 3, 2, 6, 2, 2, 2, 12, 4, 3, 2, 11, 3, 5, - 17, 1, 8, 20, 2, 3, 9, 14, 6, 3, 3, 32, 6, 5, 2, 2, 2, 1, 4, 9, 2, 2, 2, 7, 7, 3, 1, 1, 39, 3, 19, 5, 3, 3, 5, 7, 4, 5, 4, 9, 3, - 38, 2, 4, 4, 7, 1, 1, 3, 5, 2, 7, 12, 10, 7, 4, 20, 6, 4, 1, 6, 4, 2, 2, 8, 2, 3, 2, 2, 86, 2, 11, 6, 2, 2, 6, 3, 3, 2, 3, 2, 29, - 3, 7, 2, 2, 4, 3, 2, 4, 2, 8, 2, 7, 13, 5, 2, 27, 4, 2, 1, 1, 3, 2, 5, 2, 2, 2, 26, 2, 2, 8, 7, 6, 6, 10, 2, 5, 4, 93, 3, 9, 4, - 4, 3, 17, 3, 2, 9, 4, 4, 4, 23, 4, 4, 7, 4, 3, 14, 4, 2, 6, 2, 2, 3, 6, 2, 1, 1, 7, 2, 4, 4, 11, 4, 2, 8, 5, 1, 1, 13, 7, 21, 6, - 4, 4, 8, 9, 6, 3, 4, 3, 5, 2, 2, 1, 1, 10, 3, 2, 25, 2, 11, 7, 6, 6, 37, 10, 2, 3, 3, 5, 3, 8, 3, 1, 2, 76, 9, 3, 8, 3, 3, 10, 11, - 7, 7, 2, 1, 5, 2, 3, 4, 1, 5, 3, 3, 6, 2, 1, 5, 3, 42, 4, 3, 3, 4, 6, 2, 12, 7, 2, 6, 5, 44, 10, 3, 6, 4, 8, 6, 5, 5, 3, 32, 3, - 4, 6, 1, 1, 3, 2, 2, 2, 7, 19, 7, 8, 4, 7, 4, 2, 5, 3, 2, 2, 2, 7, 2, 2, 2, 9, 3, 3, 17, 16, 6, 6, 18, 2, 2, 3, 5, 5, 2, 6, 3, - 8, 1, 3, 3, 2, 14, 4, 3, 3, 7, 4, 20, 4, 3, 19, 2, 13, 3, 22, 2, 2, 4, 4, 4, 1, 8, 71, 11, 2, 52, 3, 5, 2, 10, 4, 3, 3, 6, 3, 2, 6, - 3, 6, 3, 3, 2, 2, 15, 3, 26, 15, 11, 3, 3, 10, 8, 46, 2, 4, 2, 9, 4, 4, 5, 4, 2, 1, 93, 8, 2, 25, 2, 2, 5, 2, 3, 3, 5, 3, 26, 5, 3, - 3, 3, 3, 8, 4, 3, 3, 14, 4, 15, 7, 3, 4, 2, 4, 4, 1, 161,5, 7, 2, 3, 3, 2, 2, 5, 14, 12, 8, 7, 3, 6, 3, 2, 4, 21, 6, 16, 7, 1, 12, - 3, 5, 17, 3, 3, 4, 2, 9, 4, 3, 25, 4, 14, 6, 5, 2, 2, 2, 2, 4, 16, 4, 3, 2, 2, 1, 2, 1, 1, 19, 3, 5, 1, 1, 34, 2, 3, 8, 3, 3, 8, - 5, 1, 2, 3, 3, 53, 3, 9, 4, 2, 1, 1, 1, 1, 1, 7, 6, 5, 4, 26, 2, 1, 10, 5, 2, 4, 2, 2, 2, 97, 2, 1, 21, 3, 6, 5, 3, 3, 5, 4, 4, - 42, 5, 2, 1, 3, 3, 3, 8, 7, 5, 6, 3, 1, 1, 6, 4, 3, 3, 4, 2, 7, 4, 3, 114,13, 12, 6, 4, 4, 2, 5, 3, 6, 4, 17, 7, 5, 17, 7, 2, 1, - 1, 1, 3, 7, 2, 18, 3, 2, 6, 5, 4, 2, 10, 9, 6, 3, 13, 3, 2, 3, 116,4, 4, 5, 2, 10, 7, 2, 1, 4, 2, 2, 7, 13, 9, 2, 3, 51, 16, 8, 5, - 5, 12, 9, 7, 4, 4, 10, 8, 4, 3, 3, 2, 2, 7, 5, 4, 2, 2, 2, 2, 2, 2, 24, 7, 2, 4, 4, 3, 4, 4, 197,10, 10, 8, 8, 3, 2, 21, 14, 8, 5, - 4, 3, 3, 3, 3, 13, 7, 15, 5, 2, 3, 3, 21, 3, 4, 5, 2, 5, 4, 3, 2, 2, 2, 4, 9, 2, 2, 74, 7, 61, 52, 2, 2, 2, 3, 3, 2, 7, 2, 3, 4, - 2, 2, 6, 6, 5, 6, 197,6, 7, 6, 9, 2, 2, 4, 17, 6, 4, 1, 1, 2, 23, 10, 5, 1, 1, 3, 3, 5, 4, 19, 10, 6, 6, 5, 39, 33, 11, 3, 5, 4, 5, - 5, 38, 2, 4, 23, 8, 11, 4, 3, 2, 4, 2, 4, 18, 15, 4, 4, 3, 3, 3, 2, 176,10, 2, 1, 2, 2, 11, 7, 4, 2, 17, 4, 3, 5, 2, 2, 10, 5, 3, 3, - 3, 55, 7, 6, 4, 4, 12, 2, 2, 6, 2, 1, 1, 1, 1, 1, 1, 1, 1, 4, 2, 16, 11, 1, 1, 1, 1, 4, 4, 2, 5, 4, 3, 12, 6, 1, 1, 3, 14, 3, 9, - 5, 8, 3, 1, 1, 3, 6, 3, 1, 5, 4, 1, 13, 4, 2, 3, 2, 28, 7, 5, 1, 8, 2, 1, 1, 1, 1, 73, 7, 2, 13, 6, 12, 3, 3, 3, 3, 3, 4, 2, 5, - 10, 3, 2, 62, 3, 3, 9, 3, 3, 3, 3, 1, 16, 5, 3, 4, 16, 8, 5, 2, 66, 6, 4, 6, 4, 2, 20, 6, 6, 5, 4, 3, 7, 6, 6, 4, 4, 5, 4, 38, 15, - 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 11, 9, 9, 3, 8, 4, 32, 4, 2, 1, 2, 3, 16, 5, 2, 14, 7, 2, 2, 13, 2, 2, 8, 2, 1, 4, 75, 4, 8, 3, 2, - 2, 11, 3, 1, 1, 1, 1, 9, 2, 1, 1, 3, 1, 12, 1, 1, 18, 15, 6, 6, 6, 5, 1, 62, 1, 15, 6, 1, 11, 4, 4, 3, 2, 1, 1, 1, 4, 1, 1, 2, 2, - 2, 5, 4, 4, 3, 7, 7, 7, 1, 1, 1, 1, 1, 7, 4, 120,9, 3, 10, 3, 2, 6, 3, 1, 1, 4, 4, 26, 20, 6, 4, 9, 20, 9, 5, 3, 1, 15, 10, 6, 10, - 5, 5, 5, 5, 3, 5, 3, 2, 3, 2, 60, 3, 2, 4, 4, 8, 2, 3, 3, 13, 2, 3, 3, 3, 2, 2, 2, 4, 6, 1, 3, 3, 3, 17, 2, 3, 5, 3, 3, 2, 2, - 2, 23, 2, 7, 4, 3, 2, 3, 2, 60, 4, 3, 6, 4, 4, 4, 2, 5, 11, 4, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 9, 7, 177,5, 9, 7, 7, 2, 9, - 4, 5, 4, 2, 12, 2, 7, 3, 1, 1, 1, 12, 3, 3, 3, 2, 15, 7, 3, 11, 7, 4, 16, 4, 12, 10, 1, 1, 9, 1, 1, 1, 7, 7, 7, 33, 12, 9, 3, 5, 4, - 6, 2, 21, 10, 8, 71, 7, 4, 3, 2, 10, 3, 4, 3, 28, 17, 3, 3, 3, 3, 3, 3, 4, 4, 5, 3, 3, 2, 3, 4, 2, 2, 109,16, 10, 8, 6, 2, 4, 9, 6, - 5, 17, 3, 5, 3, 2, 2, 17, 10, 3, 2, 3, 5, 19, 4, 4, 4, 10, 2, 8, 4, 110,5, 7, 3, 3, 5, 1, 2, 1, 4, 8, 9, 3, 2, 6, 7, 4, 2, 6, 3, - 13, 2, 3, 4, 17, 6, 4, 7, 6, 2, 3, 17, 5, 3, 65, 2, 9, 7, 3, 10, 2, 4, 9, 4, 8, 15, 3, 3, 7, 1, 72, 9, 9, 30, 2, 25, 4, 4, 3, 2, 2, - 3, 1, 20, 15, 2, 52, 9, 2, 5, 2, 2, 3, 19, 9, 3, 7, 3, 5, 2, 82, 2, 6, 2, 4, 19, 12, 3, 6, 3, 40, 29, 2, 8, 4, 3, 2, 1, 4, 1, 89, 35, - 28, 4, 6, 6, 19, 3, 5, 4, 4, 25, 6, 6, 17, 14, 1, 1, 1, 1, 5, 5, 5, 3, 2, 2, 34, 4, 3, 9, 6, 3, 7, 5, 7, 2, 14, 4, 2, 1, 77, 4, 2, - 3, 5, 3, 4, 18, 17, 2, 2, 19, 1, 10, 8, 8, 1, 1, 2, 2, 49, 13, 8, 5, 3, 8, 11, 9, 3, 4, 2, 43, 5, 5, 5, 4, 11, 10, 13, 8, 6, 3, 7, 3, - 3, 3, 123,6, 3, 5, 2, 1, 1, 27, 2, 7, 13, 6, 2, 1, 1, 1, 14, 3, 3, 3, 59, 15, 7, 6, 6, 6, 6, 2, 8, 3, 3, 5, 9, 4, 2, 3, 3, 7, 3, - 3, 3, 3, 2, 17, 2, 5, 5, 7, 6, 5, 1, 1, 1, 22, 8, 7, 59, 4, 2, 3, 3, 18, 10, 3, 3, 8, 4, 11, 6, 4, 3, 9, 5, 110,34, 33, 32, 2, 12, 8, - 4, 1, 2, 2, 44, 23, 20, 14, 8, 5, 8, 6, 13, 1, 1, 1, 1, 1, 1, 6, 2, 2, 2, 2, 3, 2, 1, 12, 1, 7, 4, 3, 41, 7, 19, 15, 3, 2, 2, 2, 1, - 1, 2, 6, 4, 10, 1, 1, 2, 2, 43, 4, 3, 6, 25, 4, 4, 2, 2, 7, 2, 3, 2, 10, 2, 2, 3, 13, 2, 4, 2, 15, 1, 5, 2, 4, 7, 2, 1, 1, 1, 1, - 1, 1, 3, 2, 24, 3, 17, 13, 7, 3, 234,28, 9, 3, 10, 3, 19, 4, 5, 5, 5, 5, 3, 22, 5, 3, 2, 2, 2, 2, 2, 56, 9, 8, 8, 17, 4, 2, 2, 3, 4, - 1, 1, 4, 6, 8, 4, 18, 5, 4, 3, 3, 5, 1, 29, 7, 4, 3, 3, 1, 4, 3, 2, 1, 3, 14, 4, 2, 9, 15, 3, 11, 4, 2, 1, 1, 1, 1, 1, 85, 13, 6, - 5, 2, 1, 1, 1, 1, 5, 3, 36, 3, 3, 3, 3, 2, 2, 2, 2, 11, 3, 2, 9, 7, 5, 5, 4, 3, 1, 1, 16, 13, 2, 8, 7, 3, 2, 136,6, 20, 8, 7, 3, - 6, 5, 21, 3, 3, 4, 13, 8, 3, 24, 2, 14, 5, 3, 15, 3, 1, 5, 3, 1, 1, 5, 2, 5, 2, 2, 11, 1, 1, 1, 1, 34, 5, 2, 1, 1, 7, 5, 9, 5, 38, - 21, 14, 7, 4, 4, 3, 3, 5, 111,7, 9, 4, 2, 5, 5, 4, 3, 5, 13, 4, 5, 6, 1, 7, 3, 3, 13, 4, 1, 1, 13, 6, 2, 2, 3, 2, 15, 5, 3, 3, 26, - 3, 2, 3, 3, 3, 2, 2, 4, 23, 5, 5, 3, 1, 6, 2, 2, 2, 3, 2, 171,7, 2, 3, 3, 3, 2, 4, 23, 3, 1, 1, 1, 4, 2, 3, 2, 3, 29, 27, 2, 2, - 1, 6, 3, 3, 2, 2, 5, 15, 6, 5, 7, 1, 60, 58, 5, 2, 5, 2, 2, 14, 8, 2, 2, 1, 4, 3, 4, 13, 3, 3, 6, 3, 8, 5, 5, 5, 5, 2, 2, 2, 2, - 17, 9, 6, 4, 4, 4, 5, 4, 3, 24, 5, 3, 8, 2, 9, 3, 1, 3, 38, 30, 3, 2, 2, 3, 5, 2, 3, 2, 2, 17, 7, 3, 5, 9, 2, 2, 6, 4, 4, 6, 4, - 2, 7, 4, 9, 1, 1, 5, 52, 4, 1, 1, 7, 4, 8, 12, 9, 3, 74, 6, 4, 3, 4, 1, 3, 22, 6, 7, 9, 4, 4, 3, 18, 12, 3, 2, 6, 3, 3, 2, 8, 3, - 15, 3, 5, 9, 8, 2, 4, 35, 13, 8, 5, 17, 1, 4, 3, 93, 45, 30, 29, 19, 9, 10, 8, 6, 3, 8, 22, 8, 1, 5, 2, 2, 11, 6, 3, 3, 3, 2, 11, 11, 10, - 36, 6, 5, 1, 1, 1, 1, 1, 23, 2, 3, 3, 2, 16, 3, 3, 3, 2, 17, 1, 1, 12, 3, 3, 1, 1, 1, 1, 1, 26, 6, 6, 5, 8, 3, 1, 29, 6, 3, 2, 3, - 3, 2, 4, 5, 3, 2, 2, 4, 4, 2, 4, 1, 2, 3, 3, 3, 12, 1, 6, 6, 3, 3, 233,19, 6, 5, 2, 17, 16, 12, 4, 24, 4, 7, 3, 3, 1, 4, 6, 2, 2, - 14, 11, 23, 1, 1, 2, 14, 2, 5, 2, 54, 6, 6, 11, 5, 2, 2, 1, 8, 10, 2, 2, 1, 37, 8, 6, 4, 16, 15, 9, 8, 8, 5, 5, 2, 24, 3, 3, 3, 3, 2, - 2, 6, 3, 5, 2, 1, 1, 55, 17, 8, 8, 4, 3, 10, 7, 6, 3, 3, 2, 21, 8, 6, 8, 3, 1, 2, 174,3, 2, 3, 9, 9, 12, 11, 8, 3, 3, 22, 6, 4, 2, - 2, 9, 7, 6, 4, 4, 30, 9, 11, 1, 2, 54, 3, 2, 36, 7, 21, 7, 5, 4, 2, 2, 23, 5, 4, 4, 4, 2, 4, 7, 2, 1, 1, 6, 157,44, 3, 3, 7, 3, 4, - 8, 5, 19, 6, 6, 3, 2, 2, 6, 4, 3, 2, 58, 6, 4, 45, 29, 1, 1, 4, 3, 5, 4, 7, 6, 22, 3, 3, 10, 1, 11, 3, 4, 2, 46, 6, 7, 4, 23, 5, 4, - 3, 4, 5, 3, 3, 3, 17, 3, 5, 99, 1, 1, 1, 1, 1, 96, 43, 4, 8, 4, 2, 4, 2, 8, 1, 1, 5, 7, 3, 19, 10, 5, 7, 32, 3, 2, 2, 2, 3, 11, 5, - 4, 49, 2, 2, 4, 1, 10, 2, 1, 3, 1, 1, 2, 18, 2, 2, 2, 1, 6, 2, 3, 3, 3, 2, 2, 3, 1, 1, 2, 1, 1, 6, 2, 2, 2, 1, 34, 1, 1, 1, 1, - 1, 2, 1, 2, 1, 1, 2, 1, 1, 12, 4, 3, 2, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 8, 4, 3, 40, 3, 4, 4, 16, 15, 13, 7, 11, 9, 29, 5, 9, 2, 2, - 3, 3, 2, 2, 8, 25, 4, 7, 3, 2, 8, 2, 2, 8, 2, 1, 16, 15, 7, 3, 2, 3, 33, 9, 3, 2, 7, 5, 2, 8, 4, 2, 15, 10, 4, 31, 14, 3, 10, 4, 16, - 11, 1, 58, 3, 1, 2, 3, 7, 6, 2, 3, 10, 7, 20, 5, 3, 3, 3, 1, 38, 4, 1, 3, 1, 5, 3, 3, 2, 5, 12, 5, 3, 180,6, 5, 17, 3, 3, 3, 54, 18, - 13, 10, 3, 2, 3, 6, 3, 7, 5, 2, 5, 2, 7, 5, 13, 2, 19, 3, 12, 9, 9, 3, 12, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 4, - 3, 4, 10, 4, 2, 6, 5, 16, 4, 4, 1, 1, 1, 1, 1, 1, 9, 8, 176,2, 3, 8, 5, 13, 6, 3, 3, 3, 3, 4, 8, 3, 2, 2, 11, 6, 2, 6, 12, 4, 12, - 8, 8, 2, 6, 3, 2, 2, 13, 3, 11, 4, 4, 23, 1, 1, 1, 3, 3, 5, 9, 7, 6, 4, 4, 29, 4, 8, 4, 2, 85, 24, 1, 1, 1, 1, 1, 1, 1, 3, 7, 6, - 2, 30, 5, 11, 11, 9, 9, 8, 4, 2, 13, 4, 4, 23, 6, 5, 3, 4, 3, 3, 18, 5, 3, 6, 5, 2, 2, 2, 1, 4, 2, 12, 2, 2, 6, 2, 1, 3, 2, 2, 55, - 9, 2, 2, 2, 4, 12, 4, 4, 17, 3, 1, 2, 7, 4, 16, 4, 10, 5, 3, 3, 1, 1, 66, 4, 20, 8, 3, 2, 2, 2, 2, 17, 4, 3, 2, 9, 4, 3, 1, 8, 2, - 44, 21, 20, 7, 6, 2, 3, 20, 4, 3, 10, 6, 4, 11, 4, 1, 7, 4, 94, 5, 5, 3, 3, 2, 67, 4, 16, 5, 2, 5, 2, 1, 1, 6, 3, 2, 11, 7, 3, 3, 4, - 3, 7, 2, 2, 8, 3, 3, 1, 1, 37, 21, 6, 3, 3, 2, 2, 3, 4, 2, 1, 20, 2, 7, 4, 6, 48, 4, 5, 3, 4, 2, 3, 1, 4, 3, 2, 2, 2, 2, 2, 1, - 4, 3, 1, 1, 8, 3, 4, 86, 12, 10, 4, 1, 2, 2, 2, 2, 2, 2, 32, 14, 13, 3, 9, 8, 2, 3, 3, 3, 2, 3, 11, 6, 3, 5, 2, 3, 68, 3, 1, 1, 19, - 17, 2, 1, 1, 2, 2, 7, 6, 6, 3, 2, 7, 6, 5, 4, 3, 5, 15, 3, 1, 1, 4, 3, 10, 1, 1, 1, 3, 3, 2, 10, 4, 4, 37, 30, 4, 9, 4, 5, 18, 12, - 12, 6, 3, 4, 5, 4, 2, 5, 5, 3, 4, 1, 1, 2, 2, 2, 35, 5, 29, 1, 1, 1, 1, 4, 2, 8, 6, 2, 5, 25, 3, 6, 2, 4, 1, 5, 20, 12, 5, 2, 2, - 3, 16, 6, 5, 3, 4, 2, 37, 4, 1, 1, 2, 20, 5, 3, 2, 5, 2, 26, 3, 5, 11, 10, 8, 47, 2, 2, 10, 2, 2, 1, 2, 14, 4, 9, 3, 3, 19, 2, 7, 3, - 3, 7, 7, 17, 3, 2, 2, 2, 4, 14, 3, 3, 7, 2, 12, 3, 2, 3, 4, 5, 2, 2, 2, 1, 4, 3, 3, 3, 8, 2, 2, 51, 49, 2, 4, 3, 7, 8, 6, 5, 4, - 3, 6, 2, 11, 4, 3, 3, 21, 3, 4, 4, 2, 3, 2, 14, 11, 6, 3, 5, 1, 6, 8, 6, 2, 2, 2, 2, 3, 16, 9, 2, 2, 1, 41, 4, 4, 5, 3, 8, 1, 8, - 3, 3, 4, 15, 6, 3, 3, 3, 1, 2, 57, 45, 9, 4, 4, 5, 2, 2, 3, 3, 3, 3, 6, 5, 4, 6, 2, 20, 3, 3, 3, 5, 2, 27, 14, 3, 7, 3, 85, 3, 2, - 15, 2, 2, 6, 1, 1, 24, 5, 1, 2, 2, 2, 7, 13, 5, 4, 3, 3, 5, 15, 3, 2, 5, 3, 2, 2, 28, 8, 3, 2, 2, 2, 4, 9, 2, 2, 4, 3, 8, 12, 3, - 5, 2, 2, 6, 3, 3, 6, 3, 2, 2, 240,2, 2, 3, 1, 10, 4, 3, 1, 1, 1, 1, 14, 2, 2, 2, 2, 5, 1, 5, 22, 13, 13, 13, 8, 2, 2, 2, 4, 1, 5, - 2, 4, 38, 3, 7, 21, 9, 2, 7, 6, 1, 7, 14, 4, 8, 59, 3, 14, 11, 8, 10, 2, 3, 5, 12, 2, 1, 1, 1, 3, 2, 1, 1, 3, 20, 5, 4, 9, 3, 1, 1, - 2, 13, 5, 3, 9, 3, 4, 2, 2, 131,20, 10, 4, 4, 4, 4, 4, 1, 1, 4, 19, 15, 2, 1, 2, 3, 3, 14, 5, 2, 3, 8, 2, 7, 11, 8, 6, 6, 4, 3, 3, - 2, 2, 2, 8, 7, 10, 7, 7, 5, 4, 3, 110,7, 6, 3, 19, 11, 7, 3, 3, 8, 8, 5, 2, 4, 2, 4, 1, 13, 11, 1, 1, 4, 15, 12, 2, 16, 7, 2, 2, 2, - 2, 5, 119,6, 4, 1, 1, 1, 3, 12, 1, 2, 5, 2, 8, 7, 16, 4, 3, 2, 1, 1, 16, 13, 3, 3, 4, 7, 3, 7, 5, 10, 6, 3, 56, 6, 14, 4, 9, 9, 9, - 4, 4, 2, 7, 6, 1, 7, 2, 2, 9, 2, 9, 2, 6, 1, 4, 4, 2, 3, 1, 1, 1, 1, 4, 4, 22, 13, 4, 1, 2, 4, 3, 2, 3, 18, 2, 14, 7, 50, 2, 2, - 4, 8, 6, 4, 14, 4, 6, 4, 4, 2, 2, 2, 2, 4, 2, 14, 2, 1, 1, 1, 1, 2, 12, 12, 3, 3, 2, 2, 1, 6, 4, 6, 25, 7, 13, 16, 6, 3, 6, 18, 1, - 8, 7, 41, 2, 6, 2, 9, 5, 2, 3, 6, 2, 1, 1, 3, 3, 3, 16, 3, 8, 4, 1, 1, 3, 2, 1, 1, 33, 1, 16, 11, 7, 3, 3, 3, 5, 2, 1, 8, 1, 1, - 13, 3, 1, 2, 1, 3, 1, 1, 1, 5, 3, 2, 29, 7, 2, 1, 2, 2, 1, 2, 2, 2, 5, 5, 11, 3, 2, 2, 2, 6, 2, 4, 3, 3, 3, 3, 3, 20, 1, 7, 2, - 2, 2, 5, 5, 4, 3, 8, 5, 6, 2, 2, 1, 1, 11, 4, 4, 4, 4, 3, 8, 13, 8, 8, 8, 5, 5, 13, 6, 4, 6, 5, 23, 8, 1, 1, 6, 5, 5, 7, 7, 3, - 3, 8, 4, 4, 4, 2, 11, 1, 7, 6, 4, 4, 4, 10, 5, 3, 3, 2, 2, 1, 11, 6, 4, 4, 4, 3, 77, 10, 10, 10, 4, 12, 4, 4, 4, 4, 3, 2, 3, 1, 18, - 14, 4, 9, 2, 5, 2, 2, 2, 23, 11, 9, 6, 6, 5, 8, 8, 8, 4, 3, 3, 2, 27, 4, 3, 1, 6, 5, 4, 10, 5, 5, 5, 7, 5, 5, 2, 2, 5, 5, 5, 3, - 2, 2, 90, 31, 18, 14, 13, 3, 3, 2, 7, 4, 3, 2, 14, 5, 2, 3, 37, 7, 5, 5, 10, 4, 6, 3, 3, 3, 44, 8, 3, 4, 2, 11, 2, 5, 1, 7, 2, 3, 2, - 2, 3, 2, 2, 28, 5, 3, 2, 2, 1, 1, 1, 5, 3, 2, 2, 40, 35, 9, 8, 10, 6, 5, 9, 7, 7, 3, 3, 51, 26, 2, 18, 2, 3, 3, 3, 11, 8, 3, 2, 4, - 2, 8, 3, 2, 1, 31, 1, 4, 16, 2, 2, 29, 5, 2, 7, 1, 1, 2, 4, 3, 3, 5, 3, 3, 84, 6, 2, 2, 2, 2, 3, 10, 1, 1, 1, 10, 3, 8, 1, 3, 14, - 5, 4, 6, 3, 3, 6, 4, 2, 2, 14, 9, 7, 5, 133,11, 3, 1, 6, 11, 10, 4, 7, 2, 3, 74, 15, 13, 9, 48, 45, 3, 2, 3, 5, 3, 5, 5, 3, 6, 3, 4, - 4, 161,2, 10, 2, 4, 4, 2, 2, 52, 17, 2, 6, 4, 4, 12, 6, 3, 4, 3, 3, 3, 3, 7, 4, 4, 4, 9, 3, 5, 5, 4, 24, 7, 2, 14, 2, 3, 3, 5, 2, - 2, 2, 18, 5, 6, 5, 5, 3, 2, 6, 8, 4, 2, 210,209,2, 1, 13, 4, 33, 5, 5, 3, 3, 3, 2, 3, 3, 3, 3, 2, 2, 2, 1, 14, 1, 3, 3, 5, 4, 4, - 4, 4, 3, 2, 11, 3, 4, 2, 13, 3, 3, 3, 2, 2, 7, 4, 3, 2, 9, 5, 2, 3, 3, 2, 1, 2, 13, 1, 6, 6, 6, 6, 6, 5, 4, 4, 4, 25, 17, 1, 6, - 5, 4, 3, 7, 3, 3, 1, 1, 2, 6, 5, 2, 29, 7, 2, 1, 1, 13, 4, 3, 3, 3, 3, 2, 2, 5, 2, 11, 10, 8, 47, 2, 2, 20, 9, 7, 7, 7, 7, 3, 6, - 15, 8, 8, 7, 3, 2, 8, 8, 8, 8, 18, 6, 1, 9, 8, 3, 2, 171,9, 1, 4, 3, 2, 2, 13, 4, 3, 3, 23, 6, 6, 3, 6, 4, 2, 13, 7, 13, 6, 4, 3, - 3, 9, 4, 3, 3, 2, 13, 7, 6, 6, 30, 3, 17, 5, 5, 6, 5, 2, 2, 2, 8, 3, 3, 5, 22, 7, 1, 14, 13, 6, 3, 3, 2, 91, 15, 13, 5, 2, 2, 2, 6, - 7, 3, 5, 2, 1, 4, 19, 15, 11, 6, 5, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 5, 15, 13, 11, 9, 1, 3, 45, 3, 7, 5, 5, 2, 1, 4, 3, 2, 12, 5, 3, - 1, 1, 1, 1, 1, 9, 4, 2, 2, 2, 1, 2, 5, 4, 2, 2, 1, 1, 1, 1, 3, 25, 6, 5, 5, 2, 2, 2, 4, 4, 4, 67, 9, 1, 2, 2, 3, 2, 48, 2, 16, - 3, 2, 2, 1, 7, 3, 1, 1, 1, 1, 6, 2, 16, 3, 1, 2, 4, 3, 3, 3, 1, 1, 1, 4, 3, 2, 1, 1, 185,9, 2, 1, 5, 3, 2, 2, 7, 4, 3, 10, 5, - 1, 1, 8, 6, 5, 5, 14, 5, 2, 2, 1, 6, 40, 4, 2, 2, 8, 2, 7, 7, 41, 4, 2, 21, 3, 2, 2, 12, 2, 4, 2, 1, 1, 5, 2, 1, 1, 1, 2, 2, 20, - 2, 5, 2, 3, 9, 1, 1, 1, 1, 3, 2, 164,34, 12, 4, 2, 4, 4, 4, 17, 5, 4, 12, 7, 4, 2, 72, 6, 2, 49, 2, 2, 2, 6, 4, 4, 4, 4, 7, 5, 2, - 5, 3, 10, 2, 10, 2, 5, 2, 2, 6, 2, 2, 135,3, 3, 6, 4, 6, 2, 10, 1, 3, 4, 2, 2, 2, 1, 1, 1, 6, 6, 2, 6, 2, 7, 6, 13, 7, 3, 34, 8, - 2, 6, 12, 8, 8, 4, 21, 16, 16, 4, 5, 3, 2, 1, 2, 2, 37, 2, 2, 2, 2, 2, 9, 6, 3, 14, 11, 5, 4, 3, 3, 2, 1, 3, 7, 1, 1, 1, 1, 6, 2, - 2, 12, 8, 7, 4, 3, 39, 10, 8, 7, 3, 1, 1, 21, 6, 3, 7, 5, 5, 8, 4, 72, 2, 2, 23, 6, 5, 17, 17, 14, 7, 1, 8, 6, 5, 5, 4, 6, 4, 27, 13, - 13, 12, 2, 9, 6, 5, 5, 4, 1, 3, 3, 3, 100,9, 2, 4, 1, 1, 1, 1, 1, 1, 27, 16, 13, 13, 10, 7, 3, 2, 12, 2, 2, 8, 8, 8, 3, 5, 6, 4, 3, - 2, 1, 1, 3, 17, 5, 6, 6, 6, 3, 2, 2, 25, 4, 3, 3, 21, 16, 11, 10, 4, 2, 8, 5, 22, 2, 3, 9, 4, 4, 3, 1, 25, 1, 1, 2, 19, 17, 16, 1, 5, - 4, 4, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 2, 112,22, 4, 2, 1, 5, 4, 3, 5, 4, 1, 1, 1, 2, 14, 14, 11, 3, 5, 4, 4, 2, 2, 2, 20, 2, 2, 3, - 2, 1, 1, 1, 1, 1, 2, 5, 1, 1, 1, 1, 3, 3, 4, 1, 2, 2, 1, 2, 2, 1, 1, 10, 2, 1, 1, 1, 2, 11, 1, 1, 5, 3, 1, 6, 4, 1, 16, 2, 2, - 9, 3, 3, 1, 2, 3, 3, 2, 2, 2, 2, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 89, 16, 5, 3, 1, 7, 3, 7, - 4, 2, 2, 1, 1, 10, 2, 1, 1, 1, 2, 2, 25, 5, 18, 1, 2, 2, 2, 4, 10, 4, 4, 2, 8, 5, 5, 1, 70, 4, 4, 1, 3, 2, 14, 6, 3, 4, 4, 17, 7, - 1, 2, 8, 8, 6, 5, 28, 3, 5, 6, 1, 2, 2, 1, 1, 1, 3, 3, 9, 2, 4, 3, 3, 19, 3, 6, 3, 2, 1, 39, 11, 3, 2, 1, 1, 6, 3, 2, 9, 7, 4, - 1, 1, 2, 5, 17, 4, 1, 1, 5, 76, 4, 2, 2, 3, 2, 2, 23, 5, 2, 2, 3, 10, 4, 3, 6, 4, 7, 2, 4, 3, 9, 6, 3, 2, 79, 27, 2, 2, 2, 2, 2, - 3, 2, 3, 35, 3, 2, 4, 6, 3, 2, 3, 7, 3, 4, 148,21, 7, 5, 4, 1, 1, 2, 6, 3, 4, 10, 5, 5, 2, 15, 2, 4, 18, 5, 3, 2, 38, 10, 3, 9, 3, - 2, 6, 2, 2, 2, 3, 6, 3, 3, 7, 5, 2, 2, 3, 6, 2, 127,28, 2, 1, 4, 3, 10, 3, 4, 2, 1, 1, 21, 3, 6, 2, 8, 7, 4, 16, 6, 3, 17, 3, 14, - 3, 2, 1, 1, 14, 3, 4, 2, 2, 3, 3, 4, 3, 1, 1, 1, 201,10, 2, 4, 3, 13, 4, 2, 13, 1, 1, 1, 1, 2, 46, 6, 1, 1, 13, 4, 6, 4, 1, 1, 5, - 4, 4, 2, 2, 4, 12, 2, 4, 20, 7, 4, 3, 3, 26, 4, 14, 4, 3, 5, 5, 6, 3, 8, 1, 15, 4, 3, 5, 4, 4, 9, 2, 8, 3, 3, 1, 52, 8, 10, 3, 10, - 15, 7, 2, 2, 193,32, 2, 2, 2, 1, 3, 11, 2, 6, 3, 6, 2, 10, 4, 3, 12, 7, 2, 7, 2, 2, 12, 6, 6, 1, 1, 3, 3, 11, 3, 9, 2, 2, 6, 3, 10, - 2, 6, 1, 4, 6, 4, 4, 4, 20, 9, 4, 3, 2, 4, 9, 19, 10, 3, 3, 3, 2, 4, 3, 4, 64, 5, 4, 13, 5, 8, 4, 4, 14, 2, 3, 15, 10, 1, 75, 10, 6, - 10, 4, 1, 5, 2, 7, 10, 2, 7, 16, 2, 2, 5, 5, 4, 6, 3, 52, 3, 6, 4, 9, 9, 3, 5, 6, 2, 2, 2, 1, 30, 8, 2, 14, 9, 3, 6, 4, 4, 3, 2, - 18, 5, 4, 6, 3, 2, 2, 29, 3, 11, 2, 2, 2, 7, 7, 6, 6, 5, 38, 4, 19, 16, 14, 2, 3, 1, 4, 17, 4, 3, 3, 7, 12, 1, 5, 5, 5, 9, 1, 1, 3, - 2, 1, 9, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 3, 3, 2, 2, 87, 1, 2, 14, 13, 7, 2, 6, 2, 2, 5, 15, 2, 2, 2, 10, 2, 13, 6, 9, 4, 9, 4, 61, - 41, 2, 1, 30, 1, 16, 11, 5, 11, 2, 2, 2, 7, 7, 6, 5, 3, 1, 5, 3, 2, 2, 2, 2, 3, 3, 2, 1, 1, 1, 29, 15, 4, 9, 4, 5, 3, 2, 55, 2, 1, - 5, 20, 5, 5, 2, 4, 4, 9, 7, 2, 2, 2, 1, 12, 5, 1, 2, 1, 1, 1, 14, 3, 1, 1, 5, 1, 1, 24, 7, 7, 3, 2, 1, 1, 1, 3, 1, 5, 3, 2, 1, - 1, 2, 2, 11, 5, 2, 4, 15, 3, 4, 3, 1, 1, 1, 1, 1, 1, 169,5, 2, 2, 4, 102,13, 5, 5, 2, 2, 5, 5, 2, 2, 2, 2, 10, 6, 5, 1, 9, 8, 8, - 6, 5, 4, 3, 10, 6, 3, 3, 2, 1, 1, 4, 3, 2, 2, 1, 22, 5, 5, 5, 6, 6, 5, 6, 6, 6, 3, 1, 1, 9, 6, 6, 5, 1, 1, 4, 12, 1, 1, 1, 9, - 7, 2, 3, 2, 29, 8, 7, 3, 2, 1, 4, 3, 3, 4, 6, 3, 3, 3, 2, 2, 4, 90, 5, 3, 5, 3, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 3, 1, 1, 64, - 21, 3, 13, 8, 3, 4, 4, 13, 5, 7, 9, 6, 5, 3, 2, 2, 2, 2, 6, 3, 163,14, 1, 1, 4, 6, 22, 10, 7, 2, 3, 2, 3, 3, 1, 17, 2, 2, 1, 1, 1, - 1, 1, 5, 2, 9, 4, 2, 1, 2, 4, 3, 28, 8, 4, 3, 3, 13, 7, 11, 1, 1, 1, 1, 7, 3, 13, 4, 13, 4, 3, 2, 6, 4, 8, 3, 2, 1, 1, 1, 1, 19, - 3, 3, 3, 2, 4, 4, 2, 7, 7, 6, 4, 225,13, 1, 2, 3, 2, 7, 6, 1, 1, 1, 22, 2, 1, 9, 3, 7, 3, 2, 6, 2, 2, 2, 2, 31, 4, 23, 19, 14, 4, - 10, 11, 4, 1, 3, 1, 1, 1, 6, 4, 1, 89, 28, 7, 1, 6, 4, 2, 14, 4, 2, 2, 26, 7, 4, 6, 6, 4, 3, 15, 4, 10, 7, 5, 2, 1, 1, 2, 6, 4, 1, - 2, 3, 2, 2, 2, 2, 101,2, 6, 4, 3, 3, 2, 2, 17, 5, 2, 5, 62, 9, 2, 3, 3, 3, 9, 5, 20, 4, 4, 4, 3, 5, 3, 4, 52, 2, 4, 6, 5, 5, 5, - 22, 16, 2, 1, 2, 1, 1, 1, 1, 3, 2, 3, 3, 3, 3, 3, 8, 2, 2, 2, 4, 2, 11, 3, 4, 13, 4, 2, 2, 43, 16, 1, 9, 1, 2, 4, 18, 3, 6, 4, 7, - 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 140,2, 9, 7, 3, 3, 7, 2, 1, 2, 4, 5, 22, 5, 2, 2, 2, 3, 1, 5, 15, 3, 5, 4, 2, 2, 2, 1, 3, 32, 4, - 2, 3, 3, 2, 1, 2, 1, 1, 12, 3, 2, 2, 1, 1, 1, 3, 7, 1, 17, 4, 3, 1, 1, 1, 4, 1, 1, 16, 10, 8, 5, 5, 26, 4, 11, 8, 2, 6, 10, 2, 1, - 1, 1, 1, 2, 3, 15, 4, 4, 3, 6, 7, 2, 2, 12, 2, 2, 4, 3, 4, 2, 15, 4, 5, 2, 6, 6, 12, 1, 1, 3, 2, 2, 23, 13, 5, 4, 3, 2, 1, 6, 2, - 57, 2, 2, 2, 13, 11, 9, 2, 3, 8, 7, 7, 6, 6, 6, 3, 3, 1, 1, 17, 7, 5, 5, 5, 9, 5, 4, 4, 1, 3, 1, 1, 1, 84, 13, 8, 3, 2, 27, 5, 3, - 7, 2, 1, 1, 6, 22, 4, 3, 15, 3, 1, 1, 1, 3, 3, 9, 4, 2, 32, 4, 4, 7, 4, 3, 6, 5, 5, 3, 3, 3, 2, 10, 4, 7, 2, 2, 9, 4, 3, 5, 4, - 157,5, 15, 5, 4, 5, 4, 3, 16, 14, 9, 3, 3, 35, 1, 8, 4, 2, 4, 2, 6, 4, 3, 2, 4, 6, 5, 2, 2, 29, 9, 9, 6, 5, 3, 1, 18, 4, 3, 6, 3, - 3, 3, 4, 2, 2, 1, 1, 1, 1, 1, 13, 3, 3, 3, 3, 3, 1, 1, 2, 190,4, 3, 6, 4, 57, 30, 26, 6, 2, 3, 3, 5, 3, 4, 9, 4, 1, 1, 1, 1, 90, - 8, 2, 2, 2, 5, 3, 5, 3, 34, 9, 2, 2, 3, 3, 3, 5, 3, 2, 11, 9, 9, 9, 2, 2, 8, 5, 4, 2, 2, 14, 7, 7, 6, 3, 4, 4, 4, 1, 133,17, 1, - 40, 13, 6, 7, 15, 2, 1, 1, 1, 1, 2, 3, 2, 8, 5, 1, 1, 1, 1, 1, 15, 6, 46, 4, 4, 3, 1, 1, 1, 4, 4, 2, 1, 1, 1, 1, 10, 4, 2, 2, 4, - 4, 4, 12, 15, 8, 6, 109,2, 1, 8, 2, 4, 17, 8, 3, 1, 5, 3, 35, 29, 29, 28, 6, 5, 2, 2, 32, 2, 4, 4, 4, 3, 5, 3, 2, 7, 3, 1, 8, 7, 2, - 2, 2, 19, 1, 1, 4, 2, 3, 3, 1, 2, 2, 3, 2, 2, 2, 1, 1, 13, 8, 2, 34, 10, 2, 3, 3, 12, 7, 6, 4, 3, 4, 4, 39, 7, 21, 8, 5, 7, 5, 2, - 1, 1, 1, 19, 3, 6, 2, 2, 2, 55, 3, 3, 3, 7, 2, 2, 2, 2, 5, 2, 6, 12, 4, 4, 7, 19, 15, 8, 8, 99, 4, 43, 43, 6, 6, 2, 2, 18, 16, 14, 17, - 15, 7, 5, 3, 12, 4, 5, 2, 1, 8, 4, 3, 2, 12, 3, 2, 62, 2, 3, 5, 2, 3, 28, 3, 1, 9, 7, 3, 3, 2, 2, 2, 2, 159,8, 24, 3, 2, 13, 13, 4, - 3, 3, 3, 4, 1, 2, 2, 45, 2, 7, 4, 3, 4, 9, 2, 3, 3, 3, 11, 4, 3, 1, 1, 24, 8, 6, 6, 25, 3, 3, 4, 3, 3, 8, 6, 2, 2, 6, 4, 117,6, - 2, 10, 4, 3, 8, 2, 7, 2, 16, 6, 2, 7, 13, 8, 7, 3, 3, 3, 13, 9, 2, 6, 13, 3, 2, 2, 2, 6, 2, 2, 1, 42, 26, 14, 1, 1, 1, 1, 1, 4, 5, - 3, 5, 4, 47, 10, 1, 1, 1, 1, 9, 3, 5, 1, 4, 2, 3, 2, 2, 2, 2, 8, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 33, 6, 1, - 5, 2, 4, 5, 2, 1, 4, 71, 15, 13, 6, 4, 3, 4, 4, 11, 7, 3, 4, 5, 10, 3, 2, 5, 6, 2, 4, 3, 7, 3, 5, 3, 2, 1, 1, 11, 5, 5, 3, 1, 1, - 2, 2, 14, 7, 4, 3, 2, 1, 1, 1, 1, 1, 2, 5, 1, 1, 1, 1, 1, 4, 1, 23, 9, 2, 3, 10, 10, 45, 7, 7, 4, 10, 7, 6, 2, 2, 8, 3, 7, 18, 2, - 1, 6, 2, 4, 1, 33, 7, 8, 2, 3, 1, 2, 7, 5, 3, 24, 2, 2, 4, 4, 4, 1, 1, 12, 2, 3, 1, 3, 17, 3, 3, 2, 2, 2, 2, 1, 3, 1, 1, 3, 2, - 8, 4, 2, 13, 6, 4, 3, 32, 8, 4, 5, 3, 6, 2, 1, 1, 1, 5, 2, 4, 3, 90, 5, 2, 2, 3, 18, 2, 10, 9, 6, 4, 2, 29, 13, 3, 3, 3, 5, 3, 3, - 6, 2, 2, 3, 2, 2, 166,42, 2, 2, 3, 25, 5, 4, 4, 4, 6, 4, 15, 1, 3, 2, 3, 2, 4, 6, 3, 3, 13, 2, 2, 1, 1, 1, 12, 3, 2, 3, 8, 3, 3, - 3, 25, 2, 3, 2, 16, 12, 4, 3, 3, 5, 2, 11, 2, 2, 1, 2, 110,7, 3, 5, 11, 1, 2, 18, 7, 2, 2, 14, 6, 3, 11, 3, 7, 4, 3, 8, 1, 5, 13, 2, - 95, 2, 3, 2, 7, 23, 2, 6, 8, 9, 2, 3, 25, 14, 3, 2, 2, 2, 4, 3, 2, 2, 111,1, 1, 1, 1, 1, 1, 1, 8, 3, 3, 2, 3, 7, 2, 3, 9, 5, 2, - 7, 4, 2, 2, 2, 28, 5, 5, 5, 5, 5, 2, 1, 1, 13, 2, 5, 4, 4, 18, 5, 2, 12, 1, 2, 2, 3, 2, 2, 2, 219,7, 10, 4, 9, 8, 3, 4, 1, 1, 9, - 7, 3, 1, 16, 2, 4, 3, 1, 8, 7, 24, 9, 5, 6, 3, 1, 10, 1, 1, 4, 7, 5, 4, 4, 6, 6, 3, 3, 46, 7, 2, 22, 1, 1, 2, 2, 6, 4, 13, 1, 10, - 3, 2, 33, 4, 12, 3, 3, 3, 6, 3, 2, 2, 2, 2, 11, 6, 4, 3, 44, 1, 3, 8, 5, 4, 1, 14, 10, 7, 7, 3, 47, 13, 11, 4, 3, 5, 2, 3, 2, 5, 6, - 1, 1, 11, 5, 4, 3, 100,3, 3, 22, 21, 5, 2, 10, 9, 1, 6, 2, 3, 2, 4, 30, 1, 6, 1, 8, 5, 6, 3, 2, 1, 3, 2, 2, 1, 10, 1, 4, 3, 5, 2, - 8, 1, 69, 5, 3, 1, 1, 13, 4, 6, 6, 5, 32, 5, 3, 17, 3, 1, 3, 6, 3, 10, 6, 4, 1, 1, 1, 1, 1, 27, 3, 2, 2, 3, 9, 5, 3, 4, 2, 1, 1, - 1, 12, 4, 2, 1, 3, 2, 2, 57, 13, 7, 3, 4, 17, 3, 3, 10, 3, 4, 27, 15, 4, 4, 9, 7, 7, 7, 13, 2, 2, 9, 1, 1, 6, 6, 1, 9, 6, 3, 3, 3, - 1, 4, 51, 15, 2, 2, 2, 23, 5, 1, 3, 6, 4, 2, 2, 3, 3, 29, 2, 2, 4, 3, 3, 3, 9, 225,4, 6, 5, 5, 5, 3, 194,12, 5, 5, 4, 1, 1, 2, 1, - 24, 2, 2, 2, 10, 8, 8, 5, 4, 3, 2, 2, 10, 9, 6, 6, 6, 2, 1, 3, 3, 3, 26, 10, 9, 3, 3, 2, 11, 11, 10, 4, 3, 6, 3, 3, 3, 3, 2, 2, 2, - 2, 2, 18, 3, 3, 3, 3, 13, 8, 18, 9, 9, 5, 4, 3, 3, 14, 2, 1, 1, 11, 1, 3, 3, 3, 4, 2, 2, 2, 6, 35, 5, 3, 2, 3, 5, 19, 10, 9, 6, 3, - 2, 2, 1, 1, 2, 1, 1, 1, 1, 1, 6, 5, 3, 3, 2, 2, 2, 22, 5, 2, 4, 3, 9, 3, 1, 1, 15, 9, 2, 2, 4, 2, 25, 1, 1, 3, 8, 7, 5, 5, 7, - 47, 5, 1, 29, 16, 10, 8, 3, 9, 2, 2, 8, 5, 11, 1, 2, 44, 6, 4, 4, 4, 8, 13, 3, 3, 7, 7, 13, 5, 16, 2, 5, 3, 3, 1, 5, 1, 1, 1, 7, 3, - 1, 22, 3, 1, 1, 3, 3, 8, 1, 6, 2, 2, 10, 2, 2, 11, 5, 9, 3, 4, 2, 30, 3, 9, 7, 7, 3, 3, 7, 33, 6, 5, 2, 5, 3, 2, 11, 1, 3, 3, 3, - 5, 2, 1, 28, 4, 2, 2, 6, 6, 6, 6, 5, 10, 2, 2, 1, 3, 28, 4, 6, 2, 11, 4, 6, 3, 4, 2, 2, 2, 2, 2, 2, 30, 7, 9, 6, 4, 4, 3, 2, 5, - 5, 5, 33, 6, 6, 1, 3, 3, 12, 5, 4, 36, 2, 3, 1, 1, 7, 2, 15, 5, 5, 3, 3, 7, 6, 5, 5, 11, 2, 2, 3, 13, 2, 2, 1, 5, 3, 26, 1, 9, 7, - 7, 5, 2, 2, 5, 4, 4, 2, 3, 20, 1, 12, 6, 4, 24, 3, 3, 3, 3, 2, 1, 1, 1, 1, 1, 7, 37, 2, 2, 1, 1, 2, 4, 15, 2, 11, 2, 4, 8, 4, 1, - 8, 48, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 15, 11, 2, 1, 1, 1, 7, 2, 2, 15, 8, 1, 21, 2, 2, 11, 5, 14, 4, 3, 12, 10, 8, 8, 2, 2, 2, - 16, 3, 2, 5, 8, 4, 3, 1, 5, 4, 228,4, 8, 2, 4, 2, 2, 4, 3, 10, 2, 3, 1, 2, 2, 12, 11, 9, 6, 16, 2, 13, 5, 4, 1, 1, 20, 11, 4, 3, 3, - 4, 15, 1, 4, 11, 9, 4, 20, 4, 7, 6, 2, 8, 19, 1, 1, 4, 4, 10, 37, 15, 2, 2, 12, 10, 3, 1, 1, 3, 3, 4, 7, 6, 2, 2, 2, 7, 5, 5, 7, 1, - 1, 2, 1, 1, 1, 182,4, 3, 4, 24, 3, 16, 5, 2, 14, 6, 4, 22, 3, 2, 5, 3, 2, 4, 3, 3, 10, 3, 20, 7, 2, 11, 7, 18, 5, 1, 6, 4, 3, 32, 2, - 7, 4, 17, 4, 5, 4, 2, 2, 7, 6, 5, 29, 1, 4, 2, 2, 3, 1, 3, 6, 2, 1, 1, 1, 3, 2, 3, 1, 1, 98, 19, 4, 8, 2, 1, 2, 11, 10, 3, 2, 2, - 1, 2, 1, 9, 1, 2, 1, 10, 1, 1, 2, 4, 3, 1, 2, 1, 1, 1, 5, 2, 2, 1, 1, 1, 1, 1, 1, 36, 3, 3, 3, 3, 2, 2, 6, 2, 2, 2, 7, 4, 3, - 4, 4, 3, 2, 2, 2, 1, 1, 1, 6, 4, 4, 4, 3, 1, 1, 1, 13, 3, 2, 1, 2, 40, 5, 5, 15, 12, 5, 3, 3, 2, 3, 2, 1, 4, 4, 29, 2, 4, 4, 5, - 12, 8, 4, 2, 1, 10, 4, 13, 5, 4, 4, 18, 8, 2, 5, 17, 7, 3, 3, 2, 2, 6, 1, 3, 7, 2, 1, 3, 7, 1, 1, 1, 1, 41, 5, 2, 2, 9, 3, 16, 3, - 5, 3, 3, 45, 4, 14, 10, 7, 2, 5, 2, 2, 6, 2, 6, 5, 3, 51, 4, 7, 8, 2, 1, 1, 1, 1, 2, 2, 13, 5, 6, 3, 8, 6, 5, 1, 2, 9, 1, 3, 21, - 7, 5, 2, 1, 1, 3, 2, 4, 4, 236,8, 4, 43, 3, 6, 8, 5, 23, 3, 2, 1, 1, 1, 8, 3, 4, 7, 7, 3, 8, 3, 28, 2, 7, 4, 7, 4, 3, 7, 3, 5, - 3, 58, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 11, 2, 9, 2, 6, 3, 2, 6, 3, 3, 4, 3, 5, 5, 2, 2, 1, 17, 6, 8, 2, 2, 2, 2, 3, 12, 7, - 6, 2, 3, 3, 2, 32, 10, 5, 2, 1, 2, 5, 5, 3, 5, 2, 38, 3, 1, 1, 1, 5, 3, 3, 3, 1, 9, 6, 3, 4, 8, 3, 2, 3, 5, 4, 1, 8, 3, 4, 4, - 3, 12, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 169,12, 3, 48, 5, 5, 20, 6, 7, 6, 4, 4, 8, 8, 5, 2, 81, 4, 1, 4, 5, 5, 3, 2, 28, 8, - 1, 5, 1, 3, 14, 2, 11, 5, 12, 6, 6, 2, 24, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 1, 3, 2, 3, 2, 4, 1, 159,3, 2, 4, 2, 7, 4, - 3, 5, 3, 4, 2, 3, 16, 1, 11, 10, 1, 2, 10, 2, 3, 3, 3, 16, 2, 4, 4, 6, 2, 36, 13, 5, 3, 3, 2, 9, 5, 6, 2, 8, 31, 8, 7, 4, 2, 1, 8, - 4, 6, 2, 2, 1, 1, 13, 5, 2, 2, 2, 2, 1, 1, 8, 2, 4, 1, 1, 12, 1, 2, 2, 1, 1, 8, 7, 2, 1, 2, 1, 1, 1, 1, 5, 2, 1, 28, 1, 4, 2, - 3, 2, 10, 7, 7, 6, 5, 2, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 2, 2, 2, 23, 5, 3, 2, 8, 4, 2, 1, 4, 22, 6, 1, 3, 2, 3, 4, 3, - 20, 1, 1, 1, 1, 2, 2, 1, 2, 2, 3, 2, 17, 2, 1, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 4, 1, 1, 26, 9, 1, 3, 3, 1, 1, 3, 8, 2, 45, 2, - 1, 1, 2, 2, 4, 1, 1, 1, 1, 5, 4, 1, 12, 4, 2, 3, 6, 4, 3, 1, 1, 1, 2, 11, 1, 1, 1, 1, 2, 12, 3, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, - 21, 3, 2, 2, 1, 4, 1, 1, 1, 1, 1, 6, 4, 4, 4, 1, 123,9, 1, 1, 3, 2, 7, 5, 5, 14, 1, 5, 2, 3, 14, 3, 3, 2, 3, 1, 5, 8, 6, 8, 2, - 29, 7, 7, 6, 5, 19, 17, 5, 5, 2, 1, 4, 3, 2, 2, 1, 2, 5, 2, 5, 3, 2, 1, 4, 2, 2, 73, 12, 3, 3, 2, 21, 3, 1, 1, 6, 3, 2, 2, 2, 8, - 3, 3, 5, 2, 2, 1, 1, 3, 3, 7, 3, 1, 12, 4, 1, 2, 2, 1, 1, 64, 6, 3, 2, 1, 1, 7, 6, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 4, 1, 1, 1, 1, 1, 4, 3, 1, 1, 3, 2, 5, 2, 2, 8, 4, 1, 1, 1, 1, 1, 4, 1, 1, 1, 3, 1, 2, 3, 2, 5, 4, 2, 5, 5, 2, 2, 1, 2, 2, - 2, 2, 2, 3, 2, 2, 1, 28, 1, 1, 10, 4, 2, 2, 2, 2, 2, 3, 3, 3, 3, 2, 1, 1, 3, 2, 4, 1, 1, 1, 1, 5, 3, 94, 7, 2, 7, 2, 1, 4, 1, - 1, 1, 1, 3, 3, 3, 3, 10, 8, 1, 1, 3, 3, 2, 3, 2, 2, 2, 2, 2, 2, 3, 1, 1, 1, 1, 1, 1, 1, 10, 2, 7, 48, 1, 1, 10, 2, 2, 3, 5, 1, - 2, 2, 1, 1, 23, 1, 2, 2, 2, 2, 1, 1, 1, 8, 4, 4, 4, 1, 3, 2, 2, 5, 4, 4, 3, 3, 1, 1, 1, 3, 1, 2, 4, 1, 1, 3, 2, 2, 3, 4, 2, - 2, 3, 1, 1, 1, 206,3, 1, 173,4, 2, 2, 1, 3, 2, 1, 1, 1, 2, 151,3, 1, 1, 1, 4, 2, 12, 2, 2, 1, 2, 2, 2, 3, 4, 8, 2, 2, 2, 2, 2, - 2, 3, 4, 4, 4, 4, 3, 13, 2, 4, 7, 3, 3, 4, 4, 2, 2, 11, 8, 6, 4, 4, 2, 2, 15, 6, 2, 2, 2, 2, 2, 5, 5, 1, 1, 1, 1, 1, 2, 1, 1, - 1, 1, 1, 27, 4, 3, 1, 1, 3, 16, 10, 7, 6, 3, 1, 1, 2, 13, 9, 8, 5, 4, 2, 1, 1, 18, 3, 4, 1, 1, 4, 5, 5, 5, 6, 2, 2, 3, 4, 4, 2, - 2, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 6, 3, 1, 1, 1, 2, 1, 1, 1, 1, 6, 1, 1, 2, 2, 4, 1, 4, 3, 2, 41, 8, 5, 4, 3, 2, 2, 2, - 2, 2, 3, 3, 3, 3, 3, 5, 2, 1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 3, 3, 2, 2, 2, 2, 2, 1, 3, 3, 3, 8, 8, 2, 4, 2, 2, 2, 1, 48, 14, 5, - 1, 2, 2, 2, 1, 1, 1, 1, 1, 4, 4, 3, 4, 2, 2, 1, 1, 1, 15, 1, 9, 1, 5, 1, 4, 4, 2, 4, 3, 1, 1, 4, 1, 1, 2, 24, 5, 5, 5, 2, 4, - 2, 1, 2, 2, 1, 1, 1, 4, 19, 5, 3, 6, 3, 1, 1, 1, 2, 2, 3, 150,4, 16, 3, 2, 7, 2, 8, 3, 3, 2, 2, 2, 11, 4, 5, 5, 5, 4, 2, 1, 1, - 8, 2, 2, 2, 6, 2, 1, 1, 3, 2, 2, 2, 20, 1, 2, 3, 2, 2, 1, 3, 2, 8, 8, 2, 2, 2, 2, 3, 3, 1, 2, 1, 15, 14, 7, 2, 1, 1, 3, 5, 16, - 7, 4, 5, 35, 2, 31, 31, 30, 9, 8, 5, 3, 16, 12, 7, 4, 4, 4, 4, 11, 1, 8, 7, 7, 31, 3, 2, 7, 6, 9, 1, 1, 3, 10, 5, 21, 9, 2, 1, 2, 4, - 3, 3, 3, 3, 3, 5, 2, 2, 2, 1, 1, 3, 1, 18, 5, 2, 8, 2, 2, 2, 4, 1, 2, 1, 16, 4, 2, 1, 1, 1, 2, 1, 2, 1, 1, 2, 2, 2, 2, 4, 1, - 1, 1, 1, 1, 42, 11, 3, 1, 2, 1, 1, 1, 1, 1, 1, 1, 7, 3, 2, 2, 2, 2, 2, 2, 2, 5, 3, 3, 3, 3, 16, 6, 1, 1, 3, 3, 1, 1, 1, 1, 1, - 1, 9, 2, 2, 2, 3, 1, 2, 2, 1, 6, 6, 4, 3, 3, 3, 3, 52, 9, 2, 4, 34, 8, 2, 3, 2, 2, 4, 4, 3, 3, 3, 2, 5, 2, 1, 1, 3, 1, 1, 6, - 1, 3, 2, 1, 1, 1, 3, 2, 2, 2, 2, 3, 77, 9, 2, 4, 3, 3, 3, 7, 1, 1, 1, 1, 1, 1, 1, 3, 1, 15, 6, 1, 1, 3, 2, 2, 4, 2, 5, 3, 1, - 1, 1, 1, 1, 9, 4, 2, 1, 4, 2, 1, 1, 1, 1, 1, 1, 8, 3, 1, 2, 1, 1, 15, 2, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 1, 4, 3, 2, 2, 2, 1, - 1, 1, 2, 42, 5, 2, 12, 10, 1, 1, 1, 1, 1, 1, 2, 1, 8, 7, 4, 4, 4, 7, 3, 1, 2, 1, 1, 5, 4, 10, 2, 2, 6, 2, 1, 25, 5, 2, 3, 2, 10, - 3, 3, 3, 3, 3, 3, 2, 4, 1, 1, 3, 2, 144,1, 1, 1, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 3, 2, 2, 11, 2, 2, 2, 2, 2, 1, 3, 4, 4, - 12, 3, 2, 6, 5, 2, 2, 12, 6, 4, 2, 4, 1, 1, 3, 16, 10, 8, 3, 1, 1, 1, 4, 3, 3, 2, 12, 2, 5, 4, 24, 3, 3, 2, 8, 7, 14, 2, 3, 2, 2, - 2, 2, 2, 1, 1, 6, 4, 2, 183,18, 2, 7, 2, 2, 31, 22, 18, 10, 6, 3, 4, 2, 13, 5, 4, 3, 10, 7, 29, 4, 2, 3, 7, 6, 4, 3, 3, 3, 2, 5, 3, - 6, 1, 6, 1, 1, 8, 8, 6, 3, 8, 3, 1, 3, 17, 5, 1, 1, 5, 3, 7, 3, 7, 3, 2, 2, 1, 1, 1, 145,27, 2, 3, 3, 6, 25, 3, 12, 3, 1, 1, 1, - 2, 2, 1, 11, 3, 2, 7, 1, 9, 3, 6, 2, 2, 5, 3, 4, 4, 4, 9, 9, 4, 3, 11, 1, 1, 1, 1, 1, 7, 6, 81, 5, 2, 10, 3, 3, 1, 1, 6, 1, 2, - 2, 15, 14, 14, 4, 3, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5, 1, 1, 1, 16, 4, 3, 2, 9, 8, 1, 2, 3, 1, 2, 2, 2, 1, 1, 4, 11, 1, 1, 5, 4, 3, - 2, 6, 3, 3, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 11, 8, 2, 1, 16, 4, 4, 4, 2, 2, 1, 2, 3, 2, 3, 1, 1, 1, 1, 3, 3, 3, 1, 1, 4, 47, - 16, 6, 3, 7, 5, 13, 6, 5, 3, 6, 6, 6, 3, 2, 2, 2, 6, 23, 3, 6, 7, 5, 2, 2, 1, 2, 2, 2, 3, 1, 1, 1, 2, 2, 25, 5, 3, 3, 3, 2, 5, - 4, 5, 32, 3, 9, 4, 2, 2, 6, 1, 1, 2, 1, 1, 9, 5, 3, 3, 3, 2, 2, 7, 1, 1, 1, 1, 1, 1, 2, 2, 7, 3, 242,16, 4, 2, 3, 5, 1, 16, 8, - 3, 2, 2, 3, 3, 3, 4, 2, 69, 1, 1, 1, 35, 8, 6, 3, 15, 11, 9, 6, 2, 22, 15, 5, 2, 4, 2, 2, 25, 4, 4, 10, 4, 2, 2, 6, 2, 56, 13, 1, 1, - 4, 2, 2, 3, 3, 24, 2, 2, 3, 3, 5, 11, 5, 6, 4, 10, 3, 1, 1, 1, 1, 3, 4, 4, 2, 10, 4, 4, 1, 1, 6, 4, 18, 2, 2, 13, 8, 8, 32, 2, 7, - 4, 4, 4, 1, 1, 2, 1, 4, 2, 2, 1, 3, 2, 3, 21, 8, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 5, 1, 1, 3, 2, 2, 19, 2, 2, 4, 3, 2, 7, 2, - 2, 197,17, 1, 10, 4, 1, 144,4, 1, 2, 3, 3, 2, 6, 3, 1, 13, 1, 10, 4, 4, 4, 3, 1, 83, 2, 8, 2, 5, 1, 4, 3, 11, 3, 2, 6, 4, 3, 6, 3, - 6, 2, 2, 2, 4, 1, 3, 1, 8, 3, 3, 2, 3, 2, 1, 5, 3, 2, 12, 6, 2, 2, 3, 1, 4, 3, 2, 12, 2, 7, 2, 6, 3, 2, 3, 10, 3, 7, 4, 6, 3, - 7, 3, 3, 6, 26, 3, 1, 2, 3, 2, 5, 2, 3, 2, 2, 24, 3, 5, 3, 1, 2, 7, 4, 4, 2, 40, 10, 1, 5, 1, 1, 1, 8, 2, 18, 2, 2, 5, 3, 3, 2, - 20, 4, 6, 1, 8, 2, 2, 1, 2, 1, 1, 2, 21, 4, 2, 6, 2, 2, 5, 3, 4, 2, 7, 4, 1, 1, 1, 1, 1, 30, 8, 3, 3, 8, 5, 3, 8, 4, 1, 2, 22, - 2, 2, 6, 3, 2, 5, 2, 2, 7, 2, 2, 1, 1, 1, 1, 3, 3, 3, 6, 2, 2, 39, 13, 6, 4, 2, 1, 5, 5, 3, 2, 1, 2, 2, 3, 1, 2, 10, 5, 5, 4, - 3, 2, 1, 16, 5, 2, 1, 3, 2, 3, 3, 2, 16, 3, 3, 2, 2, 2, 2, 2, 1, 1, 1, 3, 2, 5, 2, 2, 2, 2, 2, 1, 23, 5, 3, 1, 1, 1, 1, 5, 2, - 4, 2, 1, 2, 5, 1, 1, 3, 2, 1, 1, 1, 1, 9, 4, 4, 2, 8, 7, 5, 5, 5, 5, 4, 144,17, 2, 7, 2, 2, 11, 6, 2, 12, 4, 4, 7, 34, 14, 5, 2, - 2, 5, 9, 2, 4, 2, 3, 2, 3, 18, 4, 3, 6, 2, 3, 5, 2, 2, 2, 7, 2, 3, 4, 3, 5, 3, 107,9, 1, 9, 6, 4, 2, 2, 2, 3, 3, 7, 2, 2, 2, - 6, 22, 21, 4, 10, 2, 2, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 19, 7, 5, 6, 3, 14, 4, 3, 3, 1, 1, 1, 3, 2, 2, 17, 1, 2, 1, - 2, 2, 2, 1, 5, 4, 1, 1, 33, 2, 1, 6, 2, 2, 2, 2, 2, 7, 7, 7, 5, 6, 4, 2, 2, 7, 2, 19, 13, 13, 10, 3, 3, 2, 21, 6, 1, 5, 2, 2, 1, - 1, 1, 5, 2, 6, 2, 2, 1, 1, 3, 3, 1, 2, 1, 13, 3, 2, 16, 5, 5, 1, 6, 10, 1, 16, 3, 4, 6, 34, 9, 4, 16, 15, 14, 4, 4, 3, 3, 11, 2, 3, - 2, 2, 2, 1, 1, 21, 1, 1, 1, 1, 7, 3, 2, 4, 6, 1, 3, 2, 2, 95, 17, 5, 4, 4, 4, 6, 1, 8, 13, 7, 4, 10, 3, 3, 2, 13, 4, 3, 2, 8, 3, - 5, 4, 3, 2, 182,8, 3, 3, 15, 6, 3, 4, 3, 34, 9, 5, 8, 6, 4, 4, 6, 4, 11, 5, 4, 4, 2, 9, 5, 11, 6, 3, 2, 5, 2, 57, 8, 1, 4, 19, 4, - 9, 4, 2, 2, 2, 2, 16, 15, 8, 4, 10, 4, 5, 2, 2, 2, 13, 2, 1, 6, 4, 4, 2, 1, 22, 9, 3, 3, 2, 2, 4, 2, 4, 1, 1, 1, 1, 1, 33, 4, 10, - 3, 10, 2, 5, 11, 2, 2, 4, 1, 2, 2, 2, 18, 4, 7, 3, 10, 4, 1, 2, 2, 2, 24, 7, 5, 2, 4, 2, 1, 1, 1, 6, 3, 6, 2, 2, 2, 2, 1, 1, 1, - 1, 1, 1, 1, 14, 6, 5, 4, 16, 2, 1, 5, 2, 6, 5, 1, 1, 3, 25, 5, 8, 6, 5, 17, 13, 3, 7, 1, 1, 15, 3, 5, 3, 28, 8, 5, 6, 1, 3, 4, 2, - 1, 21, 8, 5, 5, 5, 8, 5, 2, 5, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 2, 2, 2, 2, 57, 2, 3, 5, 4, 1, 9, 3, 4, 4, 7, 5, - 22, 4, 7, 3, 1, 1, 1, 32, 8, 7, 3, 3, 11, 9, 3, 5, 4, 3, 4, 3, 2, 1, 1, 1, 97, 1, 1, 3, 1, 26, 8, 1, 4, 2, 1, 1, 2, 2, 1, 4, 2, - 2, 2, 2, 3, 2, 2, 2, 7, 2, 2, 6, 2, 1, 1, 1, 3, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 16, 10, 10, 9, 2, 1, 1, 4, 3, - 3, 4, 1, 2, 1, 19, 4, 4, 12, 1, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 3, 2, 3, 2, 2, 2, 2, 1, 1, 8, 1, 1, 1, 1, 4, 4, 4, 1, 1, 1, 6, - 33, 2, 1, 2, 6, 6, 4, 1, 23, 2, 3, 1, 15, 14, 2, 2, 2, 10, 1, 101,8, 8, 5, 15, 7, 4, 4, 3, 3, 4, 2, 1, 2, 1, 10, 2, 5, 1, 1, 1, 1, - 17, 6, 5, 2, 5, 35, 5, 5, 27, 24, 16, 6, 1, 3, 61, 14, 6, 2, 24, 19, 3, 1, 1, 1, 1, 1, 1, 1, 1, 5, 3, 2, 2, 2, 6, 4, 4, 3, 4, 6, 6, - 2, 71, 2, 7, 12, 4, 3, 4, 10, 3, 2, 10, 2, 2, 15, 5, 3, 2, 2, 43, 2, 3, 5, 2, 2, 9, 7, 4, 4, 2, 10, 3, 5, 2, 7, 5, 4, 3, 2, 5, 9, - 8, 8, 7, 2, 3, 2, 35, 11, 7, 3, 3, 4, 7, 6, 5, 3, 3, 3, 2, 1, 1, 8, 8, 8, 5, 163,14, 3, 4, 5, 3, 1, 1, 5, 2, 2, 2, 121,86, 5, 1, - 1, 1, 5, 8, 1, 1, 1, 1, 6, 5, 13, 6, 2, 2, 5, 4, 14, 4, 1, 3, 3, 2, 1, 1, 12, 1, 1, 3, 4, 3, 2, 1, 1, 21, 1, 1, 1, 1, 1, 1, 1, - 3, 2, 2, 2, 2, 1, 7, 3, 3, 2, 7, 3, 102,11, 5, 4, 1, 18, 13, 9, 5, 3, 1, 11, 8, 6, 2, 11, 8, 3, 1, 5, 3, 5, 2, 2, 2, 1, 1, 4, 13, - 3, 2, 4, 2, 36, 34, 12, 13, 5, 3, 7, 6, 5, 1, 1, 20, 1, 1, 13, 13, 91, 9, 2, 2, 2, 2, 9, 2, 2, 26, 2, 18, 4, 13, 8, 6, 2, 2, 5, 3, 2, - 18, 16, 6, 4, 5, 4, 3, 11, 1, 1, 1, 97, 9, 1, 1, 2, 17, 3, 3, 11, 5, 4, 4, 5, 8, 2, 3, 2, 1, 1, 1, 24, 3, 6, 6, 11, 4, 3, 2, 6, 1, - 1, 1, 4, 4, 11, 11, 11, 8, 1, 1, 2, 2, 2, 2, 88, 30, 2, 16, 8, 3, 14, 5, 4, 3, 2, 8, 2, 2, 7, 3, 7, 2, 14, 3, 3, 5, 4, 3, 3, 49, 12, - 3, 3, 10, 2, 1, 2, 2, 21, 7, 6, 3, 4, 2, 17, 2, 2, 4, 4, 2, 2, 3, 1, 1, 1, 3, 14, 1, 3, 2, 1, 3, 3, 1, 1, 3, 1, 1, 1, 1, 2, 1, - 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 55, 42, 3, 1, 28, 8, 5, 5, 2, 2, 11, 2, 1, 1, 5, 5, 4, 2, 2, 3, 3, 3, 1, 1, 2, 2, 6, 2, 2, - 3, 1, 2, 1, 3, 1, 1, 1, 1, 28, 18, 2, 2, 12, 7, 3, 3, 1, 2, 1, 1, 2, 3, 2, 2, 11, 3, 4, 15, 2, 7, 3, 3, 2, 4, 2, 25, 11, 8, 1, 1, - 2, 5, 5, 36, 8, 7, 4, 2, 4, 3, 5, 5, 5, 5, 7, 3, 2, 2, 151,7, 3, 3, 2, 12, 7, 7, 3, 3, 5, 4, 3, 6, 2, 2, 2, 5, 3, 19, 4, 2, 4, - 4, 1, 1, 1, 2, 21, 9, 2, 4, 2, 5, 3, 9, 5, 2, 7, 2, 4, 12, 5, 2, 16, 4, 8, 8, 6, 6, 5, 1, 2, 11, 10, 4, 4, 55, 4, 1, 3, 2, 1, 1, - 1, 2, 1, 13, 4, 4, 2, 1, 2, 5, 5, 2, 2, 2, 2, 11, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 1, 4, 2, 2, 2, 1, 1, 1, 7, 2, - 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 17, 6, 6, 6, 8, 5, 3, 1, 1, 1, 56, 7, 3, 1, 3, 3, 3, 1, 2, 3, 11, 8, 3, 2, 1, 3, 2, 1, 1, 4, 6, - 3, 3, 2, 4, 3, 2, 22, 3, 2, 3, 3, 4, 16, 2, 2, 1, 10, 11, 8, 4, 2, 2, 8, 4, 2, 1, 1, 18, 12, 12, 11, 4, 3, 3, 1, 3, 1, 1, 1, 1, 1, - 1, 1, 1, 38, 14, 3, 6, 2, 2, 3, 9, 1, 1, 4, 3, 2, 3, 1, 1, 1, 1, 7, 4, 1, 1, 3, 2, 1, 1, 1, 8, 3, 1, 1, 1, 1, 1, 1, 1, 15, 3, - 1, 1, 1, 1, 2, 3, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2, 1, 1, 43, 1, 2, 1, 1, 2, 1, 1, 1, 8, 2, 2, 3, 3, 20, 7, 7, 2, 2, 4, 3, 3, 3, - 3, 2, 1, 4, 1, 1, 1, 1, 3, 3, 2, 2, 4, 1, 1, 1, 1, 1, 1, 13, 3, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 5, 1, 1, 1, - 3, 2, 7, 1, 1, 1, 1, 1, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 15, 3, 3, 7, 3, - 37, 1, 1, 15, 4, 3, 5, 12, 7, 3, 2, 3, 2, 1, 48, 15, 4, 4, 2, 2, 10, 4, 6, 3, 7, 2, 1, 1, 14, 7, 3, 3, 2, 54, 5, 1, 15, 6, 11, 2, 5, - 3, 3, 4, 4, 3, 2, 1, 1, 1, 37, 3, 2, 1, 3, 3, 3, 3, 2, 12, 5, 2, 4, 2, 2, 71, 4, 3, 3, 4, 9, 1, 1, 1, 2, 2, 2, 2, 4, 2, 9, 2, - 3, 27, 5, 1, 1, 6, 6, 2, 32, 5, 1, 1, 18, 2, 2, 2, 3, 1, 4, 2, 4, 4, 10, 5, 11, 4, 4, 46, 12, 1, 5, 3, 7, 12, 2, 6, 16, 3, 2, 2, 2, - 7, 38, 3, 2, 10, 5, 7, 6, 3, 1, 2, 2, 2, 5, 1, 83, 17, 7, 4, 2, 19, 6, 2, 3, 2, 11, 6, 5, 1, 1, 11, 2, 3, 3, 6, 3, 2, 4, 5, 3, 5, - 2, 15, 1, 1, 3, 5, 2, 40, 14, 2, 10, 5, 8, 3, 2, 2, 3, 1, 2, 16, 4, 1, 5, 1, 1, 104,4, 2, 20, 11, 9, 2, 7, 11, 2, 3, 4, 10, 5, 4, 2, - 11, 6, 2, 6, 2, 16, 2, 13, 2, 2, 2, 2, 1, 1, 2, 3, 3, 1, 254,1, 6, 3, 10, 2, 1, 3, 2, 7, 3, 4, 4, 4, 27, 2, 5, 2, 2, 3, 3, 4, 2, - 3, 16, 7, 4, 4, 7, 2, 2, 6, 4, 14, 6, 4, 3, 3, 2, 1, 5, 4, 8, 3, 1, 11, 3, 7, 23, 3, 4, 2, 5, 3, 2, 26, 2, 11, 4, 2, 10, 2, 36, 9, - 8, 6, 9, 7, 1, 16, 4, 3, 7, 1, 1, 1, 16, 2, 5, 3, 17, 2, 4, 2, 2, 2, 3, 1, 126,3, 4, 3, 2, 2, 3, 40, 2, 3, 7, 8, 7, 5, 4, 3, 1, - 4, 10, 3, 8, 3, 3, 4, 3, 4, 20, 8, 2, 4, 4, 14, 9, 1, 2, 2, 3, 151,7, 2, 1, 1, 2, 24, 24, 2, 75, 74, 7, 4, 1, 8, 6, 4, 4, 2, 7, 2, - 3, 3, 5, 3, 9, 4, 5, 2, 2, 2, 11, 3, 2, 3, 2, 5, 2, 2, 3, 5, 5, 7, 5, 5, 15, 6, 2, 4, 2, 18, 2, 2, 4, 3, 2, 2, 2, 2, 1, 1, 30, - 23, 4, 1, 2, 5, 4, 2, 2, 6, 1, 1, 1, 5, 2, 1, 9, 1, 1, 46, 3, 3, 2, 6, 2, 2, 2, 2, 4, 3, 3, 6, 2, 9, 7, 4, 3, 6, 2, 2, 2, 1, - 1, 1, 1, 1, 5, 14, 1, 1, 1, 1, 1, 1, 1, 3, 2, 96, 3, 15, 5, 9, 3, 4, 4, 4, 4, 4, 4, 15, 5, 2, 8, 26, 26, 25, 25, 3, 3, 2, 3, 4, 7, - 53, 8, 6, 4, 3, 3, 3, 2, 2, 3, 2, 4, 4, 3, 3, 3, 12, 3, 3, 2, 2, 2, 2, 2, 4, 1, 1, 1, 1, 1, 1, 10, 3, 2, 1, 1, 1, 7, 3, 1, 44, - 12, 5, 2, 1, 5, 5, 7, 2, 10, 6, 3, 5, 5, 4, 68, 13, 3, 1, 1, 16, 5, 3, 4, 3, 2, 4, 7, 2, 3, 1, 3, 3, 18, 3, 5, 2, 2, 1, 1, 1, 2, - 28, 3, 14, 4, 3, 3, 206,4, 7, 5, 1, 17, 10, 4, 3, 2, 2, 1, 28, 2, 3, 15, 11, 5, 4, 3, 7, 4, 4, 4, 4, 4, 2, 2, 6, 6, 2, 39, 5, 2, 5, - 4, 4, 2, 5, 2, 2, 4, 3, 2, 4, 3, 15, 2, 9, 54, 5, 3, 12, 9, 4, 2, 2, 1, 5, 3, 3, 2, 2, 1, 1, 16, 2, 7, 4, 3, 1, 2, 11, 5, 2, 2, + 5, 4, 2, 3, 2, 1, 1, 2, 2, 2, 3, 8, 4, 3, 3, 2, 2, 6, 4, 4, 4, 2, 1, 12, 5, 3, 6, 5, 5, 5, 9, 4, 3, 40, 8, 2, 2, 3, 3, 2, 27, + 3, 2, 2, 2, 2, 2, 2, 3, 2, 2, 6, 4, 2, 13, 1, 1, 1, 2, 3, 3, 2, 2, 1, 2, 11, 2, 2, 1, 1, 1, 1, 3, 1, 1, 2, 1, 1, 1, 3, 4, 2, + 18, 7, 6, 2, 17, 1, 16, 4, 2, 7, 7, 71, 9, 2, 5, 36, 33, 8, 3, 2, 2, 2, 2, 3, 5, 3, 21, 6, 3, 9, 3, 11, 26, 5, 6, 3, 1, 1, 1, 1, 1, + 1, 6, 2, 9, 1, 2, 39, 4, 14, 6, 5, 5, 4, 4, 8, 2, 3, 3, 2, 32, 4, 2, 2, 2, 4, 10, 6, 5, 1, 1, 1, 5, 2, 65, 12, 6, 3, 9, 3, 10, 4, + 3, 8, 5, 2, 5, 3, 6, 2, 1, 95, 6, 10, 12, 3, 9, 3, 3, 3, 2, 2, 2, 2, 7, 14, 3, 3, 2, 1, 5, 10, 3, 5, 4, 2, 16, 5, 4, 5, 26, 10, 4, + 3, 3, 5, 2, 4, 1, 5, 3, 134,8, 2, 16, 2, 2, 2, 4, 21, 5, 13, 6, 3, 5, 3, 8, 6, 30, 11, 5, 3, 2, 6, 2, 2, 2, 12, 4, 3, 2, 11, 3, 5, + 17, 1, 8, 20, 2, 3, 9, 14, 6, 3, 3, 32, 6, 5, 2, 2, 2, 1, 4, 9, 2, 2, 2, 7, 7, 3, 1, 1, 39, 3, 19, 5, 3, 3, 5, 7, 4, 5, 4, 9, 3, + 38, 2, 4, 4, 7, 1, 1, 3, 5, 2, 7, 12, 10, 7, 4, 20, 6, 4, 1, 6, 4, 2, 2, 8, 2, 3, 2, 2, 86, 2, 11, 6, 2, 2, 6, 3, 3, 2, 3, 2, 29, + 3, 7, 2, 2, 4, 3, 2, 4, 2, 8, 2, 7, 13, 5, 2, 27, 4, 2, 1, 1, 3, 2, 5, 2, 2, 2, 26, 2, 2, 8, 7, 6, 6, 10, 2, 5, 4, 93, 3, 9, 4, + 4, 3, 17, 3, 2, 9, 4, 4, 4, 23, 4, 4, 7, 4, 3, 14, 4, 2, 6, 2, 2, 3, 6, 2, 1, 1, 7, 2, 4, 4, 11, 4, 2, 8, 5, 1, 1, 13, 7, 21, 6, + 4, 4, 8, 9, 6, 3, 4, 3, 5, 2, 2, 1, 1, 10, 3, 2, 25, 2, 11, 7, 6, 6, 37, 10, 2, 3, 3, 5, 3, 8, 3, 1, 2, 76, 9, 3, 8, 3, 3, 10, 11, + 7, 7, 2, 1, 5, 2, 3, 4, 1, 5, 3, 3, 6, 2, 1, 5, 3, 42, 4, 3, 3, 4, 6, 2, 12, 7, 2, 6, 5, 44, 10, 3, 6, 4, 8, 6, 5, 5, 3, 32, 3, + 4, 6, 1, 1, 3, 2, 2, 2, 7, 19, 7, 8, 4, 7, 4, 2, 5, 3, 2, 2, 2, 7, 2, 2, 2, 9, 3, 3, 17, 16, 6, 6, 18, 2, 2, 3, 5, 5, 2, 6, 3, + 8, 1, 3, 3, 2, 14, 4, 3, 3, 7, 4, 20, 4, 3, 19, 2, 13, 3, 22, 2, 2, 4, 4, 4, 1, 8, 71, 11, 2, 52, 3, 5, 2, 10, 4, 3, 3, 6, 3, 2, 6, + 3, 6, 3, 3, 2, 2, 15, 3, 26, 15, 11, 3, 3, 10, 8, 46, 2, 4, 2, 9, 4, 4, 5, 4, 2, 1, 93, 8, 2, 25, 2, 2, 5, 2, 3, 3, 5, 3, 26, 5, 3, + 3, 3, 3, 8, 4, 3, 3, 14, 4, 15, 7, 3, 4, 2, 4, 4, 1, 161,5, 7, 2, 3, 3, 2, 2, 5, 14, 12, 8, 7, 3, 6, 3, 2, 4, 21, 6, 16, 7, 1, 12, + 3, 5, 17, 3, 3, 4, 2, 9, 4, 3, 25, 4, 14, 6, 5, 2, 2, 2, 2, 4, 16, 4, 3, 2, 2, 1, 2, 1, 1, 19, 3, 5, 1, 1, 34, 2, 3, 8, 3, 3, 8, + 5, 1, 2, 3, 3, 53, 3, 9, 4, 2, 1, 1, 1, 1, 1, 7, 6, 5, 4, 26, 2, 1, 10, 5, 2, 4, 2, 2, 2, 97, 2, 1, 21, 3, 6, 5, 3, 3, 5, 4, 4, + 42, 5, 2, 1, 3, 3, 3, 8, 7, 5, 6, 3, 1, 1, 6, 4, 3, 3, 4, 2, 7, 4, 3, 114,13, 12, 6, 4, 4, 2, 5, 3, 6, 4, 17, 7, 5, 17, 7, 2, 1, + 1, 1, 3, 7, 2, 18, 3, 2, 6, 5, 4, 2, 10, 9, 6, 3, 13, 3, 2, 3, 116,4, 4, 5, 2, 10, 7, 2, 1, 4, 2, 2, 7, 13, 9, 2, 3, 51, 16, 8, 5, + 5, 12, 9, 7, 4, 4, 10, 8, 4, 3, 3, 2, 2, 7, 5, 4, 2, 2, 2, 2, 2, 2, 24, 7, 2, 4, 4, 3, 4, 4, 197,10, 10, 8, 8, 3, 2, 21, 14, 8, 5, + 4, 3, 3, 3, 3, 13, 7, 15, 5, 2, 3, 3, 21, 3, 4, 5, 2, 5, 4, 3, 2, 2, 2, 4, 9, 2, 2, 74, 7, 61, 52, 2, 2, 2, 3, 3, 2, 7, 2, 3, 4, + 2, 2, 6, 6, 5, 6, 197,6, 7, 6, 9, 2, 2, 4, 17, 6, 4, 1, 1, 2, 23, 10, 5, 1, 1, 3, 3, 5, 4, 19, 10, 6, 6, 5, 39, 33, 11, 3, 5, 4, 5, + 5, 38, 2, 4, 23, 8, 11, 4, 3, 2, 4, 2, 4, 18, 15, 4, 4, 3, 3, 3, 2, 176,10, 2, 1, 2, 2, 11, 7, 4, 2, 17, 4, 3, 5, 2, 2, 10, 5, 3, 3, + 3, 55, 7, 6, 4, 4, 12, 2, 2, 6, 2, 1, 1, 1, 1, 1, 1, 1, 1, 4, 2, 16, 11, 1, 1, 1, 1, 4, 4, 2, 5, 4, 3, 12, 6, 1, 1, 3, 14, 3, 9, + 5, 8, 3, 1, 1, 3, 6, 3, 1, 5, 4, 1, 13, 4, 2, 3, 2, 28, 7, 5, 1, 8, 2, 1, 1, 1, 1, 73, 7, 2, 13, 6, 12, 3, 3, 3, 3, 3, 4, 2, 5, + 10, 3, 2, 62, 3, 3, 9, 3, 3, 3, 3, 1, 16, 5, 3, 4, 16, 8, 5, 2, 66, 6, 4, 6, 4, 2, 20, 6, 6, 5, 4, 3, 7, 6, 6, 4, 4, 5, 4, 38, 15, + 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 11, 9, 9, 3, 8, 4, 32, 4, 2, 1, 2, 3, 16, 5, 2, 14, 7, 2, 2, 13, 2, 2, 8, 2, 1, 4, 75, 4, 8, 3, 2, + 2, 11, 3, 1, 1, 1, 1, 9, 2, 1, 1, 3, 1, 12, 1, 1, 18, 15, 6, 6, 6, 5, 1, 62, 1, 15, 6, 1, 11, 4, 4, 3, 2, 1, 1, 1, 4, 1, 1, 2, 2, + 2, 5, 4, 4, 3, 7, 7, 7, 1, 1, 1, 1, 1, 7, 4, 120,9, 3, 10, 3, 2, 6, 3, 1, 1, 4, 4, 26, 20, 6, 4, 9, 20, 9, 5, 3, 1, 15, 10, 6, 10, + 5, 5, 5, 5, 3, 5, 3, 2, 3, 2, 60, 3, 2, 4, 4, 8, 2, 3, 3, 13, 2, 3, 3, 3, 2, 2, 2, 4, 6, 1, 3, 3, 3, 17, 2, 3, 5, 3, 3, 2, 2, + 2, 23, 2, 7, 4, 3, 2, 3, 2, 60, 4, 3, 6, 4, 4, 4, 2, 5, 11, 4, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 9, 7, 177,5, 9, 7, 7, 2, 9, + 4, 5, 4, 2, 12, 2, 7, 3, 1, 1, 1, 12, 3, 3, 3, 2, 15, 7, 3, 11, 7, 4, 16, 4, 12, 10, 1, 1, 9, 1, 1, 1, 7, 7, 7, 33, 12, 9, 3, 5, 4, + 6, 2, 21, 10, 8, 71, 7, 4, 3, 2, 10, 3, 4, 3, 28, 17, 3, 3, 3, 3, 3, 3, 4, 4, 5, 3, 3, 2, 3, 4, 2, 2, 109,16, 10, 8, 6, 2, 4, 9, 6, + 5, 17, 3, 5, 3, 2, 2, 17, 10, 3, 2, 3, 5, 19, 4, 4, 4, 10, 2, 8, 4, 110,5, 7, 3, 3, 5, 1, 2, 1, 4, 8, 9, 3, 2, 6, 7, 4, 2, 6, 3, + 13, 2, 3, 4, 17, 6, 4, 7, 6, 2, 3, 17, 5, 3, 65, 2, 9, 7, 3, 10, 2, 4, 9, 4, 8, 15, 3, 3, 7, 1, 72, 9, 9, 30, 2, 25, 4, 4, 3, 2, 2, + 3, 1, 20, 15, 2, 52, 9, 2, 5, 2, 2, 3, 19, 9, 3, 7, 3, 5, 2, 82, 2, 6, 2, 4, 19, 12, 3, 6, 3, 40, 29, 2, 8, 4, 3, 2, 1, 4, 1, 89, 35, + 28, 4, 6, 6, 19, 3, 5, 4, 4, 25, 6, 6, 17, 14, 1, 1, 1, 1, 5, 5, 5, 3, 2, 2, 34, 4, 3, 9, 6, 3, 7, 5, 7, 2, 14, 4, 2, 1, 77, 4, 2, + 3, 5, 3, 4, 18, 17, 2, 2, 19, 1, 10, 8, 8, 1, 1, 2, 2, 49, 13, 8, 5, 3, 8, 11, 9, 3, 4, 2, 43, 5, 5, 5, 4, 11, 10, 13, 8, 6, 3, 7, 3, + 3, 3, 123,6, 3, 5, 2, 1, 1, 27, 2, 7, 13, 6, 2, 1, 1, 1, 14, 3, 3, 3, 59, 15, 7, 6, 6, 6, 6, 2, 8, 3, 3, 5, 9, 4, 2, 3, 3, 7, 3, + 3, 3, 3, 2, 17, 2, 5, 5, 7, 6, 5, 1, 1, 1, 22, 8, 7, 59, 4, 2, 3, 3, 18, 10, 3, 3, 8, 4, 11, 6, 4, 3, 9, 5, 110,34, 33, 32, 2, 12, 8, + 4, 1, 2, 2, 44, 23, 20, 14, 8, 5, 8, 6, 13, 1, 1, 1, 1, 1, 1, 6, 2, 2, 2, 2, 3, 2, 1, 12, 1, 7, 4, 3, 41, 7, 19, 15, 3, 2, 2, 2, 1, + 1, 2, 6, 4, 10, 1, 1, 2, 2, 43, 4, 3, 6, 25, 4, 4, 2, 2, 7, 2, 3, 2, 10, 2, 2, 3, 13, 2, 4, 2, 15, 1, 5, 2, 4, 7, 2, 1, 1, 1, 1, + 1, 1, 3, 2, 24, 3, 17, 13, 7, 3, 234,28, 9, 3, 10, 3, 19, 4, 5, 5, 5, 5, 3, 22, 5, 3, 2, 2, 2, 2, 2, 56, 9, 8, 8, 17, 4, 2, 2, 3, 4, + 1, 1, 4, 6, 8, 4, 18, 5, 4, 3, 3, 5, 1, 29, 7, 4, 3, 3, 1, 4, 3, 2, 1, 3, 14, 4, 2, 9, 15, 3, 11, 4, 2, 1, 1, 1, 1, 1, 85, 13, 6, + 5, 2, 1, 1, 1, 1, 5, 3, 36, 3, 3, 3, 3, 2, 2, 2, 2, 11, 3, 2, 9, 7, 5, 5, 4, 3, 1, 1, 16, 13, 2, 8, 7, 3, 2, 136,6, 20, 8, 7, 3, + 6, 5, 21, 3, 3, 4, 13, 8, 3, 24, 2, 14, 5, 3, 15, 3, 1, 5, 3, 1, 1, 5, 2, 5, 2, 2, 11, 1, 1, 1, 1, 34, 5, 2, 1, 1, 7, 5, 9, 5, 38, + 21, 14, 7, 4, 4, 3, 3, 5, 111,7, 9, 4, 2, 5, 5, 4, 3, 5, 13, 4, 5, 6, 1, 7, 3, 3, 13, 4, 1, 1, 13, 6, 2, 2, 3, 2, 15, 5, 3, 3, 26, + 3, 2, 3, 3, 3, 2, 2, 4, 23, 5, 5, 3, 1, 6, 2, 2, 2, 3, 2, 171,7, 2, 3, 3, 3, 2, 4, 23, 3, 1, 1, 1, 4, 2, 3, 2, 3, 29, 27, 2, 2, + 1, 6, 3, 3, 2, 2, 5, 15, 6, 5, 7, 1, 60, 58, 5, 2, 5, 2, 2, 14, 8, 2, 2, 1, 4, 3, 4, 13, 3, 3, 6, 3, 8, 5, 5, 5, 5, 2, 2, 2, 2, + 17, 9, 6, 4, 4, 4, 5, 4, 3, 24, 5, 3, 8, 2, 9, 3, 1, 3, 38, 30, 3, 2, 2, 3, 5, 2, 3, 2, 2, 17, 7, 3, 5, 9, 2, 2, 6, 4, 4, 6, 4, + 2, 7, 4, 9, 1, 1, 5, 52, 4, 1, 1, 7, 4, 8, 12, 9, 3, 74, 6, 4, 3, 4, 1, 3, 22, 6, 7, 9, 4, 4, 3, 18, 12, 3, 2, 6, 3, 3, 2, 8, 3, + 15, 3, 5, 9, 8, 2, 4, 35, 13, 8, 5, 17, 1, 4, 3, 93, 45, 30, 29, 19, 9, 10, 8, 6, 3, 8, 22, 8, 1, 5, 2, 2, 11, 6, 3, 3, 3, 2, 11, 11, 10, + 36, 6, 5, 1, 1, 1, 1, 1, 23, 2, 3, 3, 2, 16, 3, 3, 3, 2, 17, 1, 1, 12, 3, 3, 1, 1, 1, 1, 1, 26, 6, 6, 5, 8, 3, 1, 29, 6, 3, 2, 3, + 3, 2, 4, 5, 3, 2, 2, 4, 4, 2, 4, 1, 2, 3, 3, 3, 12, 1, 6, 6, 3, 3, 233,19, 6, 5, 2, 17, 16, 12, 4, 24, 4, 7, 3, 3, 1, 4, 6, 2, 2, + 14, 11, 23, 1, 1, 2, 14, 2, 5, 2, 54, 6, 6, 11, 5, 2, 2, 1, 8, 10, 2, 2, 1, 37, 8, 6, 4, 16, 15, 9, 8, 8, 5, 5, 2, 24, 3, 3, 3, 3, 2, + 2, 6, 3, 5, 2, 1, 1, 55, 17, 8, 8, 4, 3, 10, 7, 6, 3, 3, 2, 21, 8, 6, 8, 3, 1, 2, 174,3, 2, 3, 9, 9, 12, 11, 8, 3, 3, 22, 6, 4, 2, + 2, 9, 7, 6, 4, 4, 30, 9, 11, 1, 2, 54, 3, 2, 36, 7, 21, 7, 5, 4, 2, 2, 23, 5, 4, 4, 4, 2, 4, 7, 2, 1, 1, 6, 157,44, 3, 3, 7, 3, 4, + 8, 5, 19, 6, 6, 3, 2, 2, 6, 4, 3, 2, 58, 6, 4, 45, 29, 1, 1, 4, 3, 5, 4, 7, 6, 22, 3, 3, 10, 1, 11, 3, 4, 2, 46, 6, 7, 4, 23, 5, 4, + 3, 4, 5, 3, 3, 3, 17, 3, 5, 99, 1, 1, 1, 1, 1, 96, 43, 4, 8, 4, 2, 4, 2, 8, 1, 1, 5, 7, 3, 19, 10, 5, 7, 32, 3, 2, 2, 2, 3, 11, 5, + 4, 49, 2, 2, 4, 1, 10, 2, 1, 3, 1, 1, 2, 18, 2, 2, 2, 1, 6, 2, 3, 3, 3, 2, 2, 3, 1, 1, 2, 1, 1, 6, 2, 2, 2, 1, 34, 1, 1, 1, 1, + 1, 2, 1, 2, 1, 1, 2, 1, 1, 12, 4, 3, 2, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 8, 4, 3, 40, 3, 4, 4, 16, 15, 13, 7, 11, 9, 29, 5, 9, 2, 2, + 3, 3, 2, 2, 8, 25, 4, 7, 3, 2, 8, 2, 2, 8, 2, 1, 16, 15, 7, 3, 2, 3, 33, 9, 3, 2, 7, 5, 2, 8, 4, 2, 15, 10, 4, 31, 14, 3, 10, 4, 16, + 11, 1, 58, 3, 1, 2, 3, 7, 6, 2, 3, 10, 7, 20, 5, 3, 3, 3, 1, 38, 4, 1, 3, 1, 5, 3, 3, 2, 5, 12, 5, 3, 180,6, 5, 17, 3, 3, 3, 54, 18, + 13, 10, 3, 2, 3, 6, 3, 7, 5, 2, 5, 2, 7, 5, 13, 2, 19, 3, 12, 9, 9, 3, 12, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 4, + 3, 4, 10, 4, 2, 6, 5, 16, 4, 4, 1, 1, 1, 1, 1, 1, 9, 8, 176,2, 3, 8, 5, 13, 6, 3, 3, 3, 3, 4, 8, 3, 2, 2, 11, 6, 2, 6, 12, 4, 12, + 8, 8, 2, 6, 3, 2, 2, 13, 3, 11, 4, 4, 23, 1, 1, 1, 3, 3, 5, 9, 7, 6, 4, 4, 29, 4, 8, 4, 2, 85, 24, 1, 1, 1, 1, 1, 1, 1, 3, 7, 6, + 2, 30, 5, 11, 11, 9, 9, 8, 4, 2, 13, 4, 4, 23, 6, 5, 3, 4, 3, 3, 18, 5, 3, 6, 5, 2, 2, 2, 1, 4, 2, 12, 2, 2, 6, 2, 1, 3, 2, 2, 55, + 9, 2, 2, 2, 4, 12, 4, 4, 17, 3, 1, 2, 7, 4, 16, 4, 10, 5, 3, 3, 1, 1, 66, 4, 20, 8, 3, 2, 2, 2, 2, 17, 4, 3, 2, 9, 4, 3, 1, 8, 2, + 44, 21, 20, 7, 6, 2, 3, 20, 4, 3, 10, 6, 4, 11, 4, 1, 7, 4, 94, 5, 5, 3, 3, 2, 67, 4, 16, 5, 2, 5, 2, 1, 1, 6, 3, 2, 11, 7, 3, 3, 4, + 3, 7, 2, 2, 8, 3, 3, 1, 1, 37, 21, 6, 3, 3, 2, 2, 3, 4, 2, 1, 20, 2, 7, 4, 6, 48, 4, 5, 3, 4, 2, 3, 1, 4, 3, 2, 2, 2, 2, 2, 1, + 4, 3, 1, 1, 8, 3, 4, 86, 12, 10, 4, 1, 2, 2, 2, 2, 2, 2, 32, 14, 13, 3, 9, 8, 2, 3, 3, 3, 2, 3, 11, 6, 3, 5, 2, 3, 68, 3, 1, 1, 19, + 17, 2, 1, 1, 2, 2, 7, 6, 6, 3, 2, 7, 6, 5, 4, 3, 5, 15, 3, 1, 1, 4, 3, 10, 1, 1, 1, 3, 3, 2, 10, 4, 4, 37, 30, 4, 9, 4, 5, 18, 12, + 12, 6, 3, 4, 5, 4, 2, 5, 5, 3, 4, 1, 1, 2, 2, 2, 35, 5, 29, 1, 1, 1, 1, 4, 2, 8, 6, 2, 5, 25, 3, 6, 2, 4, 1, 5, 20, 12, 5, 2, 2, + 3, 16, 6, 5, 3, 4, 2, 37, 4, 1, 1, 2, 20, 5, 3, 2, 5, 2, 26, 3, 5, 11, 10, 8, 47, 2, 2, 10, 2, 2, 1, 2, 14, 4, 9, 3, 3, 19, 2, 7, 3, + 3, 7, 7, 17, 3, 2, 2, 2, 4, 14, 3, 3, 7, 2, 12, 3, 2, 3, 4, 5, 2, 2, 2, 1, 4, 3, 3, 3, 8, 2, 2, 51, 49, 2, 4, 3, 7, 8, 6, 5, 4, + 3, 6, 2, 11, 4, 3, 3, 21, 3, 4, 4, 2, 3, 2, 14, 11, 6, 3, 5, 1, 6, 8, 6, 2, 2, 2, 2, 3, 16, 9, 2, 2, 1, 41, 4, 4, 5, 3, 8, 1, 8, + 3, 3, 4, 15, 6, 3, 3, 3, 1, 2, 57, 45, 9, 4, 4, 5, 2, 2, 3, 3, 3, 3, 6, 5, 4, 6, 2, 20, 3, 3, 3, 5, 2, 27, 14, 3, 7, 3, 85, 3, 2, + 15, 2, 2, 6, 1, 1, 24, 5, 1, 2, 2, 2, 7, 13, 5, 4, 3, 3, 5, 15, 3, 2, 5, 3, 2, 2, 28, 8, 3, 2, 2, 2, 4, 9, 2, 2, 4, 3, 8, 12, 3, + 5, 2, 2, 6, 3, 3, 6, 3, 2, 2, 240,2, 2, 3, 1, 10, 4, 3, 1, 1, 1, 1, 14, 2, 2, 2, 2, 5, 1, 5, 22, 13, 13, 13, 8, 2, 2, 2, 4, 1, 5, + 2, 4, 38, 3, 7, 21, 9, 2, 7, 6, 1, 7, 14, 4, 8, 59, 3, 14, 11, 8, 10, 2, 3, 5, 12, 2, 1, 1, 1, 3, 2, 1, 1, 3, 20, 5, 4, 9, 3, 1, 1, + 2, 13, 5, 3, 9, 3, 4, 2, 2, 131,20, 10, 4, 4, 4, 4, 4, 1, 1, 4, 19, 15, 2, 1, 2, 3, 3, 14, 5, 2, 3, 8, 2, 7, 11, 8, 6, 6, 4, 3, 3, + 2, 2, 2, 8, 7, 10, 7, 7, 5, 4, 3, 110,7, 6, 3, 19, 11, 7, 3, 3, 8, 8, 5, 2, 4, 2, 4, 1, 13, 11, 1, 1, 4, 15, 12, 2, 16, 7, 2, 2, 2, + 2, 5, 119,6, 4, 1, 1, 1, 3, 12, 1, 2, 5, 2, 8, 7, 16, 4, 3, 2, 1, 1, 16, 13, 3, 3, 4, 7, 3, 7, 5, 10, 6, 3, 56, 6, 14, 4, 9, 9, 9, + 4, 4, 2, 7, 6, 1, 7, 2, 2, 9, 2, 9, 2, 6, 1, 4, 4, 2, 3, 1, 1, 1, 1, 4, 4, 22, 13, 4, 1, 2, 4, 3, 2, 3, 18, 2, 14, 7, 50, 2, 2, + 4, 8, 6, 4, 14, 4, 6, 4, 4, 2, 2, 2, 2, 4, 2, 14, 2, 1, 1, 1, 1, 2, 12, 12, 3, 3, 2, 2, 1, 6, 4, 6, 25, 7, 13, 16, 6, 3, 6, 18, 1, + 8, 7, 41, 2, 6, 2, 9, 5, 2, 3, 6, 2, 1, 1, 3, 3, 3, 16, 3, 8, 4, 1, 1, 3, 2, 1, 1, 33, 1, 16, 11, 7, 3, 3, 3, 5, 2, 1, 8, 1, 1, + 13, 3, 1, 2, 1, 3, 1, 1, 1, 5, 3, 2, 29, 7, 2, 1, 2, 2, 1, 2, 2, 2, 5, 5, 11, 3, 2, 2, 2, 6, 2, 4, 3, 3, 3, 3, 3, 20, 1, 7, 2, + 2, 2, 5, 5, 4, 3, 8, 5, 6, 2, 2, 1, 1, 11, 4, 4, 4, 4, 3, 8, 13, 8, 8, 8, 5, 5, 13, 6, 4, 6, 5, 23, 8, 1, 1, 6, 5, 5, 7, 7, 3, + 3, 8, 4, 4, 4, 2, 11, 1, 7, 6, 4, 4, 4, 10, 5, 3, 3, 2, 2, 1, 11, 6, 4, 4, 4, 3, 77, 10, 10, 10, 4, 12, 4, 4, 4, 4, 3, 2, 3, 1, 18, + 14, 4, 9, 2, 5, 2, 2, 2, 23, 11, 9, 6, 6, 5, 8, 8, 8, 4, 3, 3, 2, 27, 4, 3, 1, 6, 5, 4, 10, 5, 5, 5, 7, 5, 5, 2, 2, 5, 5, 5, 3, + 2, 2, 90, 31, 18, 14, 13, 3, 3, 2, 7, 4, 3, 2, 14, 5, 2, 3, 37, 7, 5, 5, 10, 4, 6, 3, 3, 3, 44, 8, 3, 4, 2, 11, 2, 5, 1, 7, 2, 3, 2, + 2, 3, 2, 2, 28, 5, 3, 2, 2, 1, 1, 1, 5, 3, 2, 2, 40, 35, 9, 8, 10, 6, 5, 9, 7, 7, 3, 3, 51, 26, 2, 18, 2, 3, 3, 3, 11, 8, 3, 2, 4, + 2, 8, 3, 2, 1, 31, 1, 4, 16, 2, 2, 29, 5, 2, 7, 1, 1, 2, 4, 3, 3, 5, 3, 3, 84, 6, 2, 2, 2, 2, 3, 10, 1, 1, 1, 10, 3, 8, 1, 3, 14, + 5, 4, 6, 3, 3, 6, 4, 2, 2, 14, 9, 7, 5, 133,11, 3, 1, 6, 11, 10, 4, 7, 2, 3, 74, 15, 13, 9, 48, 45, 3, 2, 3, 5, 3, 5, 5, 3, 6, 3, 4, + 4, 161,2, 10, 2, 4, 4, 2, 2, 52, 17, 2, 6, 4, 4, 12, 6, 3, 4, 3, 3, 3, 3, 7, 4, 4, 4, 9, 3, 5, 5, 4, 24, 7, 2, 14, 2, 3, 3, 5, 2, + 2, 2, 18, 5, 6, 5, 5, 3, 2, 6, 8, 4, 2, 210,209,2, 1, 13, 4, 33, 5, 5, 3, 3, 3, 2, 3, 3, 3, 3, 2, 2, 2, 1, 14, 1, 3, 3, 5, 4, 4, + 4, 4, 3, 2, 11, 3, 4, 2, 13, 3, 3, 3, 2, 2, 7, 4, 3, 2, 9, 5, 2, 3, 3, 2, 1, 2, 13, 1, 6, 6, 6, 6, 6, 5, 4, 4, 4, 25, 17, 1, 6, + 5, 4, 3, 7, 3, 3, 1, 1, 2, 6, 5, 2, 29, 7, 2, 1, 1, 13, 4, 3, 3, 3, 3, 2, 2, 5, 2, 11, 10, 8, 47, 2, 2, 20, 9, 7, 7, 7, 7, 3, 6, + 15, 8, 8, 7, 3, 2, 8, 8, 8, 8, 18, 6, 1, 9, 8, 3, 2, 171,9, 1, 4, 3, 2, 2, 13, 4, 3, 3, 23, 6, 6, 3, 6, 4, 2, 13, 7, 13, 6, 4, 3, + 3, 9, 4, 3, 3, 2, 13, 7, 6, 6, 30, 3, 17, 5, 5, 6, 5, 2, 2, 2, 8, 3, 3, 5, 22, 7, 1, 14, 13, 6, 3, 3, 2, 91, 15, 13, 5, 2, 2, 2, 6, + 7, 3, 5, 2, 1, 4, 19, 15, 11, 6, 5, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 5, 15, 13, 11, 9, 1, 3, 45, 3, 7, 5, 5, 2, 1, 4, 3, 2, 12, 5, 3, + 1, 1, 1, 1, 1, 9, 4, 2, 2, 2, 1, 2, 5, 4, 2, 2, 1, 1, 1, 1, 3, 25, 6, 5, 5, 2, 2, 2, 4, 4, 4, 67, 9, 1, 2, 2, 3, 2, 48, 2, 16, + 3, 2, 2, 1, 7, 3, 1, 1, 1, 1, 6, 2, 16, 3, 1, 2, 4, 3, 3, 3, 1, 1, 1, 4, 3, 2, 1, 1, 185,9, 2, 1, 5, 3, 2, 2, 7, 4, 3, 10, 5, + 1, 1, 8, 6, 5, 5, 14, 5, 2, 2, 1, 6, 40, 4, 2, 2, 8, 2, 7, 7, 41, 4, 2, 21, 3, 2, 2, 12, 2, 4, 2, 1, 1, 5, 2, 1, 1, 1, 2, 2, 20, + 2, 5, 2, 3, 9, 1, 1, 1, 1, 3, 2, 164,34, 12, 4, 2, 4, 4, 4, 17, 5, 4, 12, 7, 4, 2, 72, 6, 2, 49, 2, 2, 2, 6, 4, 4, 4, 4, 7, 5, 2, + 5, 3, 10, 2, 10, 2, 5, 2, 2, 6, 2, 2, 135,3, 3, 6, 4, 6, 2, 10, 1, 3, 4, 2, 2, 2, 1, 1, 1, 6, 6, 2, 6, 2, 7, 6, 13, 7, 3, 34, 8, + 2, 6, 12, 8, 8, 4, 21, 16, 16, 4, 5, 3, 2, 1, 2, 2, 37, 2, 2, 2, 2, 2, 9, 6, 3, 14, 11, 5, 4, 3, 3, 2, 1, 3, 7, 1, 1, 1, 1, 6, 2, + 2, 12, 8, 7, 4, 3, 39, 10, 8, 7, 3, 1, 1, 21, 6, 3, 7, 5, 5, 8, 4, 72, 2, 2, 23, 6, 5, 17, 17, 14, 7, 1, 8, 6, 5, 5, 4, 6, 4, 27, 13, + 13, 12, 2, 9, 6, 5, 5, 4, 1, 3, 3, 3, 100,9, 2, 4, 1, 1, 1, 1, 1, 1, 27, 16, 13, 13, 10, 7, 3, 2, 12, 2, 2, 8, 8, 8, 3, 5, 6, 4, 3, + 2, 1, 1, 3, 17, 5, 6, 6, 6, 3, 2, 2, 25, 4, 3, 3, 21, 16, 11, 10, 4, 2, 8, 5, 22, 2, 3, 9, 4, 4, 3, 1, 25, 1, 1, 2, 19, 17, 16, 1, 5, + 4, 4, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 2, 112,22, 4, 2, 1, 5, 4, 3, 5, 4, 1, 1, 1, 2, 14, 14, 11, 3, 5, 4, 4, 2, 2, 2, 20, 2, 2, 3, + 2, 1, 1, 1, 1, 1, 2, 5, 1, 1, 1, 1, 3, 3, 4, 1, 2, 2, 1, 2, 2, 1, 1, 10, 2, 1, 1, 1, 2, 11, 1, 1, 5, 3, 1, 6, 4, 1, 16, 2, 2, + 9, 3, 3, 1, 2, 3, 3, 2, 2, 2, 2, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 89, 16, 5, 3, 1, 7, 3, 7, + 4, 2, 2, 1, 1, 10, 2, 1, 1, 1, 2, 2, 25, 5, 18, 1, 2, 2, 2, 4, 10, 4, 4, 2, 8, 5, 5, 1, 70, 4, 4, 1, 3, 2, 14, 6, 3, 4, 4, 17, 7, + 1, 2, 8, 8, 6, 5, 28, 3, 5, 6, 1, 2, 2, 1, 1, 1, 3, 3, 9, 2, 4, 3, 3, 19, 3, 6, 3, 2, 1, 39, 11, 3, 2, 1, 1, 6, 3, 2, 9, 7, 4, + 1, 1, 2, 5, 17, 4, 1, 1, 5, 76, 4, 2, 2, 3, 2, 2, 23, 5, 2, 2, 3, 10, 4, 3, 6, 4, 7, 2, 4, 3, 9, 6, 3, 2, 79, 27, 2, 2, 2, 2, 2, + 3, 2, 3, 35, 3, 2, 4, 6, 3, 2, 3, 7, 3, 4, 148,21, 7, 5, 4, 1, 1, 2, 6, 3, 4, 10, 5, 5, 2, 15, 2, 4, 18, 5, 3, 2, 38, 10, 3, 9, 3, + 2, 6, 2, 2, 2, 3, 6, 3, 3, 7, 5, 2, 2, 3, 6, 2, 127,28, 2, 1, 4, 3, 10, 3, 4, 2, 1, 1, 21, 3, 6, 2, 8, 7, 4, 16, 6, 3, 17, 3, 14, + 3, 2, 1, 1, 14, 3, 4, 2, 2, 3, 3, 4, 3, 1, 1, 1, 201,10, 2, 4, 3, 13, 4, 2, 13, 1, 1, 1, 1, 2, 46, 6, 1, 1, 13, 4, 6, 4, 1, 1, 5, + 4, 4, 2, 2, 4, 12, 2, 4, 20, 7, 4, 3, 3, 26, 4, 14, 4, 3, 5, 5, 6, 3, 8, 1, 15, 4, 3, 5, 4, 4, 9, 2, 8, 3, 3, 1, 52, 8, 10, 3, 10, + 15, 7, 2, 2, 193,32, 2, 2, 2, 1, 3, 11, 2, 6, 3, 6, 2, 10, 4, 3, 12, 7, 2, 7, 2, 2, 12, 6, 6, 1, 1, 3, 3, 11, 3, 9, 2, 2, 6, 3, 10, + 2, 6, 1, 4, 6, 4, 4, 4, 20, 9, 4, 3, 2, 4, 9, 19, 10, 3, 3, 3, 2, 4, 3, 4, 64, 5, 4, 13, 5, 8, 4, 4, 14, 2, 3, 15, 10, 1, 75, 10, 6, + 10, 4, 1, 5, 2, 7, 10, 2, 7, 16, 2, 2, 5, 5, 4, 6, 3, 52, 3, 6, 4, 9, 9, 3, 5, 6, 2, 2, 2, 1, 30, 8, 2, 14, 9, 3, 6, 4, 4, 3, 2, + 18, 5, 4, 6, 3, 2, 2, 29, 3, 11, 2, 2, 2, 7, 7, 6, 6, 5, 38, 4, 19, 16, 14, 2, 3, 1, 4, 17, 4, 3, 3, 7, 12, 1, 5, 5, 5, 9, 1, 1, 3, + 2, 1, 9, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 3, 3, 2, 2, 87, 1, 2, 14, 13, 7, 2, 6, 2, 2, 5, 15, 2, 2, 2, 10, 2, 13, 6, 9, 4, 9, 4, 61, + 41, 2, 1, 30, 1, 16, 11, 5, 11, 2, 2, 2, 7, 7, 6, 5, 3, 1, 5, 3, 2, 2, 2, 2, 3, 3, 2, 1, 1, 1, 29, 15, 4, 9, 4, 5, 3, 2, 55, 2, 1, + 5, 20, 5, 5, 2, 4, 4, 9, 7, 2, 2, 2, 1, 12, 5, 1, 2, 1, 1, 1, 14, 3, 1, 1, 5, 1, 1, 24, 7, 7, 3, 2, 1, 1, 1, 3, 1, 5, 3, 2, 1, + 1, 2, 2, 11, 5, 2, 4, 15, 3, 4, 3, 1, 1, 1, 1, 1, 1, 169,5, 2, 2, 4, 102,13, 5, 5, 2, 2, 5, 5, 2, 2, 2, 2, 10, 6, 5, 1, 9, 8, 8, + 6, 5, 4, 3, 10, 6, 3, 3, 2, 1, 1, 4, 3, 2, 2, 1, 22, 5, 5, 5, 6, 6, 5, 6, 6, 6, 3, 1, 1, 9, 6, 6, 5, 1, 1, 4, 12, 1, 1, 1, 9, + 7, 2, 3, 2, 29, 8, 7, 3, 2, 1, 4, 3, 3, 4, 6, 3, 3, 3, 2, 2, 4, 90, 5, 3, 5, 3, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 3, 1, 1, 64, + 21, 3, 13, 8, 3, 4, 4, 13, 5, 7, 9, 6, 5, 3, 2, 2, 2, 2, 6, 3, 163,14, 1, 1, 4, 6, 22, 10, 7, 2, 3, 2, 3, 3, 1, 17, 2, 2, 1, 1, 1, + 1, 1, 5, 2, 9, 4, 2, 1, 2, 4, 3, 28, 8, 4, 3, 3, 13, 7, 11, 1, 1, 1, 1, 7, 3, 13, 4, 13, 4, 3, 2, 6, 4, 8, 3, 2, 1, 1, 1, 1, 19, + 3, 3, 3, 2, 4, 4, 2, 7, 7, 6, 4, 225,13, 1, 2, 3, 2, 7, 6, 1, 1, 1, 22, 2, 1, 9, 3, 7, 3, 2, 6, 2, 2, 2, 2, 31, 4, 23, 19, 14, 4, + 10, 11, 4, 1, 3, 1, 1, 1, 6, 4, 1, 89, 28, 7, 1, 6, 4, 2, 14, 4, 2, 2, 26, 7, 4, 6, 6, 4, 3, 15, 4, 10, 7, 5, 2, 1, 1, 2, 6, 4, 1, + 2, 3, 2, 2, 2, 2, 101,2, 6, 4, 3, 3, 2, 2, 17, 5, 2, 5, 62, 9, 2, 3, 3, 3, 9, 5, 20, 4, 4, 4, 3, 5, 3, 4, 52, 2, 4, 6, 5, 5, 5, + 22, 16, 2, 1, 2, 1, 1, 1, 1, 3, 2, 3, 3, 3, 3, 3, 8, 2, 2, 2, 4, 2, 11, 3, 4, 13, 4, 2, 2, 43, 16, 1, 9, 1, 2, 4, 18, 3, 6, 4, 7, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 140,2, 9, 7, 3, 3, 7, 2, 1, 2, 4, 5, 22, 5, 2, 2, 2, 3, 1, 5, 15, 3, 5, 4, 2, 2, 2, 1, 3, 32, 4, + 2, 3, 3, 2, 1, 2, 1, 1, 12, 3, 2, 2, 1, 1, 1, 3, 7, 1, 17, 4, 3, 1, 1, 1, 4, 1, 1, 16, 10, 8, 5, 5, 26, 4, 11, 8, 2, 6, 10, 2, 1, + 1, 1, 1, 2, 3, 15, 4, 4, 3, 6, 7, 2, 2, 12, 2, 2, 4, 3, 4, 2, 15, 4, 5, 2, 6, 6, 12, 1, 1, 3, 2, 2, 23, 13, 5, 4, 3, 2, 1, 6, 2, + 57, 2, 2, 2, 13, 11, 9, 2, 3, 8, 7, 7, 6, 6, 6, 3, 3, 1, 1, 17, 7, 5, 5, 5, 9, 5, 4, 4, 1, 3, 1, 1, 1, 84, 13, 8, 3, 2, 27, 5, 3, + 7, 2, 1, 1, 6, 22, 4, 3, 15, 3, 1, 1, 1, 3, 3, 9, 4, 2, 32, 4, 4, 7, 4, 3, 6, 5, 5, 3, 3, 3, 2, 10, 4, 7, 2, 2, 9, 4, 3, 5, 4, + 157,5, 15, 5, 4, 5, 4, 3, 16, 14, 9, 3, 3, 35, 1, 8, 4, 2, 4, 2, 6, 4, 3, 2, 4, 6, 5, 2, 2, 29, 9, 9, 6, 5, 3, 1, 18, 4, 3, 6, 3, + 3, 3, 4, 2, 2, 1, 1, 1, 1, 1, 13, 3, 3, 3, 3, 3, 1, 1, 2, 190,4, 3, 6, 4, 57, 30, 26, 6, 2, 3, 3, 5, 3, 4, 9, 4, 1, 1, 1, 1, 90, + 8, 2, 2, 2, 5, 3, 5, 3, 34, 9, 2, 2, 3, 3, 3, 5, 3, 2, 11, 9, 9, 9, 2, 2, 8, 5, 4, 2, 2, 14, 7, 7, 6, 3, 4, 4, 4, 1, 133,17, 1, + 40, 13, 6, 7, 15, 2, 1, 1, 1, 1, 2, 3, 2, 8, 5, 1, 1, 1, 1, 1, 15, 6, 46, 4, 4, 3, 1, 1, 1, 4, 4, 2, 1, 1, 1, 1, 10, 4, 2, 2, 4, + 4, 4, 12, 15, 8, 6, 109,2, 1, 8, 2, 4, 17, 8, 3, 1, 5, 3, 35, 29, 29, 28, 6, 5, 2, 2, 32, 2, 4, 4, 4, 3, 5, 3, 2, 7, 3, 1, 8, 7, 2, + 2, 2, 19, 1, 1, 4, 2, 3, 3, 1, 2, 2, 3, 2, 2, 2, 1, 1, 13, 8, 2, 34, 10, 2, 3, 3, 12, 7, 6, 4, 3, 4, 4, 39, 7, 21, 8, 5, 7, 5, 2, + 1, 1, 1, 19, 3, 6, 2, 2, 2, 55, 3, 3, 3, 7, 2, 2, 2, 2, 5, 2, 6, 12, 4, 4, 7, 19, 15, 8, 8, 99, 4, 43, 43, 6, 6, 2, 2, 18, 16, 14, 17, + 15, 7, 5, 3, 12, 4, 5, 2, 1, 8, 4, 3, 2, 12, 3, 2, 62, 2, 3, 5, 2, 3, 28, 3, 1, 9, 7, 3, 3, 2, 2, 2, 2, 159,8, 24, 3, 2, 13, 13, 4, + 3, 3, 3, 4, 1, 2, 2, 45, 2, 7, 4, 3, 4, 9, 2, 3, 3, 3, 11, 4, 3, 1, 1, 24, 8, 6, 6, 25, 3, 3, 4, 3, 3, 8, 6, 2, 2, 6, 4, 117,6, + 2, 10, 4, 3, 8, 2, 7, 2, 16, 6, 2, 7, 13, 8, 7, 3, 3, 3, 13, 9, 2, 6, 13, 3, 2, 2, 2, 6, 2, 2, 1, 42, 26, 14, 1, 1, 1, 1, 1, 4, 5, + 3, 5, 4, 47, 10, 1, 1, 1, 1, 9, 3, 5, 1, 4, 2, 3, 2, 2, 2, 2, 8, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 33, 6, 1, + 5, 2, 4, 5, 2, 1, 4, 71, 15, 13, 6, 4, 3, 4, 4, 11, 7, 3, 4, 5, 10, 3, 2, 5, 6, 2, 4, 3, 7, 3, 5, 3, 2, 1, 1, 11, 5, 5, 3, 1, 1, + 2, 2, 14, 7, 4, 3, 2, 1, 1, 1, 1, 1, 2, 5, 1, 1, 1, 1, 1, 4, 1, 23, 9, 2, 3, 10, 10, 45, 7, 7, 4, 10, 7, 6, 2, 2, 8, 3, 7, 18, 2, + 1, 6, 2, 4, 1, 33, 7, 8, 2, 3, 1, 2, 7, 5, 3, 24, 2, 2, 4, 4, 4, 1, 1, 12, 2, 3, 1, 3, 17, 3, 3, 2, 2, 2, 2, 1, 3, 1, 1, 3, 2, + 8, 4, 2, 13, 6, 4, 3, 32, 8, 4, 5, 3, 6, 2, 1, 1, 1, 5, 2, 4, 3, 90, 5, 2, 2, 3, 18, 2, 10, 9, 6, 4, 2, 29, 13, 3, 3, 3, 5, 3, 3, + 6, 2, 2, 3, 2, 2, 166,42, 2, 2, 3, 25, 5, 4, 4, 4, 6, 4, 15, 1, 3, 2, 3, 2, 4, 6, 3, 3, 13, 2, 2, 1, 1, 1, 12, 3, 2, 3, 8, 3, 3, + 3, 25, 2, 3, 2, 16, 12, 4, 3, 3, 5, 2, 11, 2, 2, 1, 2, 110,7, 3, 5, 11, 1, 2, 18, 7, 2, 2, 14, 6, 3, 11, 3, 7, 4, 3, 8, 1, 5, 13, 2, + 95, 2, 3, 2, 7, 23, 2, 6, 8, 9, 2, 3, 25, 14, 3, 2, 2, 2, 4, 3, 2, 2, 111,1, 1, 1, 1, 1, 1, 1, 8, 3, 3, 2, 3, 7, 2, 3, 9, 5, 2, + 7, 4, 2, 2, 2, 28, 5, 5, 5, 5, 5, 2, 1, 1, 13, 2, 5, 4, 4, 18, 5, 2, 12, 1, 2, 2, 3, 2, 2, 2, 219,7, 10, 4, 9, 8, 3, 4, 1, 1, 9, + 7, 3, 1, 16, 2, 4, 3, 1, 8, 7, 24, 9, 5, 6, 3, 1, 10, 1, 1, 4, 7, 5, 4, 4, 6, 6, 3, 3, 46, 7, 2, 22, 1, 1, 2, 2, 6, 4, 13, 1, 10, + 3, 2, 33, 4, 12, 3, 3, 3, 6, 3, 2, 2, 2, 2, 11, 6, 4, 3, 44, 1, 3, 8, 5, 4, 1, 14, 10, 7, 7, 3, 47, 13, 11, 4, 3, 5, 2, 3, 2, 5, 6, + 1, 1, 11, 5, 4, 3, 100,3, 3, 22, 21, 5, 2, 10, 9, 1, 6, 2, 3, 2, 4, 30, 1, 6, 1, 8, 5, 6, 3, 2, 1, 3, 2, 2, 1, 10, 1, 4, 3, 5, 2, + 8, 1, 69, 5, 3, 1, 1, 13, 4, 6, 6, 5, 32, 5, 3, 17, 3, 1, 3, 6, 3, 10, 6, 4, 1, 1, 1, 1, 1, 27, 3, 2, 2, 3, 9, 5, 3, 4, 2, 1, 1, + 1, 12, 4, 2, 1, 3, 2, 2, 57, 13, 7, 3, 4, 17, 3, 3, 10, 3, 4, 27, 15, 4, 4, 9, 7, 7, 7, 13, 2, 2, 9, 1, 1, 6, 6, 1, 9, 6, 3, 3, 3, + 1, 4, 51, 15, 2, 2, 2, 23, 5, 1, 3, 6, 4, 2, 2, 3, 3, 29, 2, 2, 4, 3, 3, 3, 9, 225,4, 6, 5, 5, 5, 3, 194,12, 5, 5, 4, 1, 1, 2, 1, + 24, 2, 2, 2, 10, 8, 8, 5, 4, 3, 2, 2, 10, 9, 6, 6, 6, 2, 1, 3, 3, 3, 26, 10, 9, 3, 3, 2, 11, 11, 10, 4, 3, 6, 3, 3, 3, 3, 2, 2, 2, + 2, 2, 18, 3, 3, 3, 3, 13, 8, 18, 9, 9, 5, 4, 3, 3, 14, 2, 1, 1, 11, 1, 3, 3, 3, 4, 2, 2, 2, 6, 35, 5, 3, 2, 3, 5, 19, 10, 9, 6, 3, + 2, 2, 1, 1, 2, 1, 1, 1, 1, 1, 6, 5, 3, 3, 2, 2, 2, 22, 5, 2, 4, 3, 9, 3, 1, 1, 15, 9, 2, 2, 4, 2, 25, 1, 1, 3, 8, 7, 5, 5, 7, + 47, 5, 1, 29, 16, 10, 8, 3, 9, 2, 2, 8, 5, 11, 1, 2, 44, 6, 4, 4, 4, 8, 13, 3, 3, 7, 7, 13, 5, 16, 2, 5, 3, 3, 1, 5, 1, 1, 1, 7, 3, + 1, 22, 3, 1, 1, 3, 3, 8, 1, 6, 2, 2, 10, 2, 2, 11, 5, 9, 3, 4, 2, 30, 3, 9, 7, 7, 3, 3, 7, 33, 6, 5, 2, 5, 3, 2, 11, 1, 3, 3, 3, + 5, 2, 1, 28, 4, 2, 2, 6, 6, 6, 6, 5, 10, 2, 2, 1, 3, 28, 4, 6, 2, 11, 4, 6, 3, 4, 2, 2, 2, 2, 2, 2, 30, 7, 9, 6, 4, 4, 3, 2, 5, + 5, 5, 33, 6, 6, 1, 3, 3, 12, 5, 4, 36, 2, 3, 1, 1, 7, 2, 15, 5, 5, 3, 3, 7, 6, 5, 5, 11, 2, 2, 3, 13, 2, 2, 1, 5, 3, 26, 1, 9, 7, + 7, 5, 2, 2, 5, 4, 4, 2, 3, 20, 1, 12, 6, 4, 24, 3, 3, 3, 3, 2, 1, 1, 1, 1, 1, 7, 37, 2, 2, 1, 1, 2, 4, 15, 2, 11, 2, 4, 8, 4, 1, + 8, 48, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 15, 11, 2, 1, 1, 1, 7, 2, 2, 15, 8, 1, 21, 2, 2, 11, 5, 14, 4, 3, 12, 10, 8, 8, 2, 2, 2, + 16, 3, 2, 5, 8, 4, 3, 1, 5, 4, 228,4, 8, 2, 4, 2, 2, 4, 3, 10, 2, 3, 1, 2, 2, 12, 11, 9, 6, 16, 2, 13, 5, 4, 1, 1, 20, 11, 4, 3, 3, + 4, 15, 1, 4, 11, 9, 4, 20, 4, 7, 6, 2, 8, 19, 1, 1, 4, 4, 10, 37, 15, 2, 2, 12, 10, 3, 1, 1, 3, 3, 4, 7, 6, 2, 2, 2, 7, 5, 5, 7, 1, + 1, 2, 1, 1, 1, 182,4, 3, 4, 24, 3, 16, 5, 2, 14, 6, 4, 22, 3, 2, 5, 3, 2, 4, 3, 3, 10, 3, 20, 7, 2, 11, 7, 18, 5, 1, 6, 4, 3, 32, 2, + 7, 4, 17, 4, 5, 4, 2, 2, 7, 6, 5, 29, 1, 4, 2, 2, 3, 1, 3, 6, 2, 1, 1, 1, 3, 2, 3, 1, 1, 98, 19, 4, 8, 2, 1, 2, 11, 10, 3, 2, 2, + 1, 2, 1, 9, 1, 2, 1, 10, 1, 1, 2, 4, 3, 1, 2, 1, 1, 1, 5, 2, 2, 1, 1, 1, 1, 1, 1, 36, 3, 3, 3, 3, 2, 2, 6, 2, 2, 2, 7, 4, 3, + 4, 4, 3, 2, 2, 2, 1, 1, 1, 6, 4, 4, 4, 3, 1, 1, 1, 13, 3, 2, 1, 2, 40, 5, 5, 15, 12, 5, 3, 3, 2, 3, 2, 1, 4, 4, 29, 2, 4, 4, 5, + 12, 8, 4, 2, 1, 10, 4, 13, 5, 4, 4, 18, 8, 2, 5, 17, 7, 3, 3, 2, 2, 6, 1, 3, 7, 2, 1, 3, 7, 1, 1, 1, 1, 41, 5, 2, 2, 9, 3, 16, 3, + 5, 3, 3, 45, 4, 14, 10, 7, 2, 5, 2, 2, 6, 2, 6, 5, 3, 51, 4, 7, 8, 2, 1, 1, 1, 1, 2, 2, 13, 5, 6, 3, 8, 6, 5, 1, 2, 9, 1, 3, 21, + 7, 5, 2, 1, 1, 3, 2, 4, 4, 236,8, 4, 43, 3, 6, 8, 5, 23, 3, 2, 1, 1, 1, 8, 3, 4, 7, 7, 3, 8, 3, 28, 2, 7, 4, 7, 4, 3, 7, 3, 5, + 3, 58, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 11, 2, 9, 2, 6, 3, 2, 6, 3, 3, 4, 3, 5, 5, 2, 2, 1, 17, 6, 8, 2, 2, 2, 2, 3, 12, 7, + 6, 2, 3, 3, 2, 32, 10, 5, 2, 1, 2, 5, 5, 3, 5, 2, 38, 3, 1, 1, 1, 5, 3, 3, 3, 1, 9, 6, 3, 4, 8, 3, 2, 3, 5, 4, 1, 8, 3, 4, 4, + 3, 12, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 169,12, 3, 48, 5, 5, 20, 6, 7, 6, 4, 4, 8, 8, 5, 2, 81, 4, 1, 4, 5, 5, 3, 2, 28, 8, + 1, 5, 1, 3, 14, 2, 11, 5, 12, 6, 6, 2, 24, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 1, 3, 2, 3, 2, 4, 1, 159,3, 2, 4, 2, 7, 4, + 3, 5, 3, 4, 2, 3, 16, 1, 11, 10, 1, 2, 10, 2, 3, 3, 3, 16, 2, 4, 4, 6, 2, 36, 13, 5, 3, 3, 2, 9, 5, 6, 2, 8, 31, 8, 7, 4, 2, 1, 8, + 4, 6, 2, 2, 1, 1, 13, 5, 2, 2, 2, 2, 1, 1, 8, 2, 4, 1, 1, 12, 1, 2, 2, 1, 1, 8, 7, 2, 1, 2, 1, 1, 1, 1, 5, 2, 1, 28, 1, 4, 2, + 3, 2, 10, 7, 7, 6, 5, 2, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 2, 2, 2, 23, 5, 3, 2, 8, 4, 2, 1, 4, 22, 6, 1, 3, 2, 3, 4, 3, + 20, 1, 1, 1, 1, 2, 2, 1, 2, 2, 3, 2, 17, 2, 1, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 4, 1, 1, 26, 9, 1, 3, 3, 1, 1, 3, 8, 2, 45, 2, + 1, 1, 2, 2, 4, 1, 1, 1, 1, 5, 4, 1, 12, 4, 2, 3, 6, 4, 3, 1, 1, 1, 2, 11, 1, 1, 1, 1, 2, 12, 3, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 21, 3, 2, 2, 1, 4, 1, 1, 1, 1, 1, 6, 4, 4, 4, 1, 123,9, 1, 1, 3, 2, 7, 5, 5, 14, 1, 5, 2, 3, 14, 3, 3, 2, 3, 1, 5, 8, 6, 8, 2, + 29, 7, 7, 6, 5, 19, 17, 5, 5, 2, 1, 4, 3, 2, 2, 1, 2, 5, 2, 5, 3, 2, 1, 4, 2, 2, 73, 12, 3, 3, 2, 21, 3, 1, 1, 6, 3, 2, 2, 2, 8, + 3, 3, 5, 2, 2, 1, 1, 3, 3, 7, 3, 1, 12, 4, 1, 2, 2, 1, 1, 64, 6, 3, 2, 1, 1, 7, 6, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 4, 1, 1, 1, 1, 1, 4, 3, 1, 1, 3, 2, 5, 2, 2, 8, 4, 1, 1, 1, 1, 1, 4, 1, 1, 1, 3, 1, 2, 3, 2, 5, 4, 2, 5, 5, 2, 2, 1, 2, 2, + 2, 2, 2, 3, 2, 2, 1, 28, 1, 1, 10, 4, 2, 2, 2, 2, 2, 3, 3, 3, 3, 2, 1, 1, 3, 2, 4, 1, 1, 1, 1, 5, 3, 94, 7, 2, 7, 2, 1, 4, 1, + 1, 1, 1, 3, 3, 3, 3, 10, 8, 1, 1, 3, 3, 2, 3, 2, 2, 2, 2, 2, 2, 3, 1, 1, 1, 1, 1, 1, 1, 10, 2, 7, 48, 1, 1, 10, 2, 2, 3, 5, 1, + 2, 2, 1, 1, 23, 1, 2, 2, 2, 2, 1, 1, 1, 8, 4, 4, 4, 1, 3, 2, 2, 5, 4, 4, 3, 3, 1, 1, 1, 3, 1, 2, 4, 1, 1, 3, 2, 2, 3, 4, 2, + 2, 3, 1, 1, 1, 206,3, 1, 173,4, 2, 2, 1, 3, 2, 1, 1, 1, 2, 151,3, 1, 1, 1, 4, 2, 12, 2, 2, 1, 2, 2, 2, 3, 4, 8, 2, 2, 2, 2, 2, + 2, 3, 4, 4, 4, 4, 3, 13, 2, 4, 7, 3, 3, 4, 4, 2, 2, 11, 8, 6, 4, 4, 2, 2, 15, 6, 2, 2, 2, 2, 2, 5, 5, 1, 1, 1, 1, 1, 2, 1, 1, + 1, 1, 1, 27, 4, 3, 1, 1, 3, 16, 10, 7, 6, 3, 1, 1, 2, 13, 9, 8, 5, 4, 2, 1, 1, 18, 3, 4, 1, 1, 4, 5, 5, 5, 6, 2, 2, 3, 4, 4, 2, + 2, 1, 1, 1, 12, 1, 1, 1, 1, 1, 1, 1, 1, 6, 3, 1, 1, 1, 2, 1, 1, 1, 1, 6, 1, 1, 2, 2, 4, 1, 4, 3, 2, 41, 8, 5, 4, 3, 2, 2, 2, + 2, 2, 3, 3, 3, 3, 3, 5, 2, 1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 3, 3, 2, 2, 2, 2, 2, 1, 3, 3, 3, 8, 8, 2, 4, 2, 2, 2, 1, 48, 14, 5, + 1, 2, 2, 2, 1, 1, 1, 1, 1, 4, 4, 3, 4, 2, 2, 1, 1, 1, 15, 1, 9, 1, 5, 1, 4, 4, 2, 4, 3, 1, 1, 4, 1, 1, 2, 24, 5, 5, 5, 2, 4, + 2, 1, 2, 2, 1, 1, 1, 4, 19, 5, 3, 6, 3, 1, 1, 1, 2, 2, 3, 150,4, 16, 3, 2, 7, 2, 8, 3, 3, 2, 2, 2, 11, 4, 5, 5, 5, 4, 2, 1, 1, + 8, 2, 2, 2, 6, 2, 1, 1, 3, 2, 2, 2, 20, 1, 2, 3, 2, 2, 1, 3, 2, 8, 8, 2, 2, 2, 2, 3, 3, 1, 2, 1, 15, 14, 7, 2, 1, 1, 3, 5, 16, + 7, 4, 5, 35, 2, 31, 31, 30, 9, 8, 5, 3, 16, 12, 7, 4, 4, 4, 4, 11, 1, 8, 7, 7, 31, 3, 2, 7, 6, 9, 1, 1, 3, 10, 5, 21, 9, 2, 1, 2, 4, + 3, 3, 3, 3, 3, 5, 2, 2, 2, 1, 1, 3, 1, 18, 5, 2, 8, 2, 2, 2, 4, 1, 2, 1, 16, 4, 2, 1, 1, 1, 2, 1, 2, 1, 1, 2, 2, 2, 2, 4, 1, + 1, 1, 1, 1, 42, 11, 3, 1, 2, 1, 1, 1, 1, 1, 1, 1, 7, 3, 2, 2, 2, 2, 2, 2, 2, 5, 3, 3, 3, 3, 16, 6, 1, 1, 3, 3, 1, 1, 1, 1, 1, + 1, 9, 2, 2, 2, 3, 1, 2, 2, 1, 6, 6, 4, 3, 3, 3, 3, 52, 9, 2, 4, 34, 8, 2, 3, 2, 2, 4, 4, 3, 3, 3, 2, 5, 2, 1, 1, 3, 1, 1, 6, + 1, 3, 2, 1, 1, 1, 3, 2, 2, 2, 2, 3, 77, 9, 2, 4, 3, 3, 3, 7, 1, 1, 1, 1, 1, 1, 1, 3, 1, 15, 6, 1, 1, 3, 2, 2, 4, 2, 5, 3, 1, + 1, 1, 1, 1, 9, 4, 2, 1, 4, 2, 1, 1, 1, 1, 1, 1, 8, 3, 1, 2, 1, 1, 15, 2, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 1, 4, 3, 2, 2, 2, 1, + 1, 1, 2, 42, 5, 2, 12, 10, 1, 1, 1, 1, 1, 1, 2, 1, 8, 7, 4, 4, 4, 7, 3, 1, 2, 1, 1, 5, 4, 10, 2, 2, 6, 2, 1, 25, 5, 2, 3, 2, 10, + 3, 3, 3, 3, 3, 3, 2, 4, 1, 1, 3, 2, 144,1, 1, 1, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 3, 2, 2, 11, 2, 2, 2, 2, 2, 1, 3, 4, 4, + 12, 3, 2, 6, 5, 2, 2, 12, 6, 4, 2, 4, 1, 1, 3, 16, 10, 8, 3, 1, 1, 1, 4, 3, 3, 2, 12, 2, 5, 4, 24, 3, 3, 2, 8, 7, 14, 2, 3, 2, 2, + 2, 2, 2, 1, 1, 6, 4, 2, 183,18, 2, 7, 2, 2, 31, 22, 18, 10, 6, 3, 4, 2, 13, 5, 4, 3, 10, 7, 29, 4, 2, 3, 7, 6, 4, 3, 3, 3, 2, 5, 3, + 6, 1, 6, 1, 1, 8, 8, 6, 3, 8, 3, 1, 3, 17, 5, 1, 1, 5, 3, 7, 3, 7, 3, 2, 2, 1, 1, 1, 145,27, 2, 3, 3, 6, 25, 3, 12, 3, 1, 1, 1, + 2, 2, 1, 11, 3, 2, 7, 1, 9, 3, 6, 2, 2, 5, 3, 4, 4, 4, 9, 9, 4, 3, 11, 1, 1, 1, 1, 1, 7, 6, 81, 5, 2, 10, 3, 3, 1, 1, 6, 1, 2, + 2, 15, 14, 14, 4, 3, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5, 1, 1, 1, 16, 4, 3, 2, 9, 8, 1, 2, 3, 1, 2, 2, 2, 1, 1, 4, 11, 1, 1, 5, 4, 3, + 2, 6, 3, 3, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 11, 8, 2, 1, 16, 4, 4, 4, 2, 2, 1, 2, 3, 2, 3, 1, 1, 1, 1, 3, 3, 3, 1, 1, 4, 47, + 16, 6, 3, 7, 5, 13, 6, 5, 3, 6, 6, 6, 3, 2, 2, 2, 6, 23, 3, 6, 7, 5, 2, 2, 1, 2, 2, 2, 3, 1, 1, 1, 2, 2, 25, 5, 3, 3, 3, 2, 5, + 4, 5, 32, 3, 9, 4, 2, 2, 6, 1, 1, 2, 1, 1, 9, 5, 3, 3, 3, 2, 2, 7, 1, 1, 1, 1, 1, 1, 2, 2, 7, 3, 242,16, 4, 2, 3, 5, 1, 16, 8, + 3, 2, 2, 3, 3, 3, 4, 2, 69, 1, 1, 1, 35, 8, 6, 3, 15, 11, 9, 6, 2, 22, 15, 5, 2, 4, 2, 2, 25, 4, 4, 10, 4, 2, 2, 6, 2, 56, 13, 1, 1, + 4, 2, 2, 3, 3, 24, 2, 2, 3, 3, 5, 11, 5, 6, 4, 10, 3, 1, 1, 1, 1, 3, 4, 4, 2, 10, 4, 4, 1, 1, 6, 4, 18, 2, 2, 13, 8, 8, 32, 2, 7, + 4, 4, 4, 1, 1, 2, 1, 4, 2, 2, 1, 3, 2, 3, 21, 8, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 5, 1, 1, 3, 2, 2, 19, 2, 2, 4, 3, 2, 7, 2, + 2, 197,17, 1, 10, 4, 1, 144,4, 1, 2, 3, 3, 2, 6, 3, 1, 13, 1, 10, 4, 4, 4, 3, 1, 83, 2, 8, 2, 5, 1, 4, 3, 11, 3, 2, 6, 4, 3, 6, 3, + 6, 2, 2, 2, 4, 1, 3, 1, 8, 3, 3, 2, 3, 2, 1, 5, 3, 2, 12, 6, 2, 2, 3, 1, 4, 3, 2, 12, 2, 7, 2, 6, 3, 2, 3, 10, 3, 7, 4, 6, 3, + 7, 3, 3, 6, 26, 3, 1, 2, 3, 2, 5, 2, 3, 2, 2, 24, 3, 5, 3, 1, 2, 7, 4, 4, 2, 40, 10, 1, 5, 1, 1, 1, 8, 2, 18, 2, 2, 5, 3, 3, 2, + 20, 4, 6, 1, 8, 2, 2, 1, 2, 1, 1, 2, 21, 4, 2, 6, 2, 2, 5, 3, 4, 2, 7, 4, 1, 1, 1, 1, 1, 30, 8, 3, 3, 8, 5, 3, 8, 4, 1, 2, 22, + 2, 2, 6, 3, 2, 5, 2, 2, 7, 2, 2, 1, 1, 1, 1, 3, 3, 3, 6, 2, 2, 39, 13, 6, 4, 2, 1, 5, 5, 3, 2, 1, 2, 2, 3, 1, 2, 10, 5, 5, 4, + 3, 2, 1, 16, 5, 2, 1, 3, 2, 3, 3, 2, 16, 3, 3, 2, 2, 2, 2, 2, 1, 1, 1, 3, 2, 5, 2, 2, 2, 2, 2, 1, 23, 5, 3, 1, 1, 1, 1, 5, 2, + 4, 2, 1, 2, 5, 1, 1, 3, 2, 1, 1, 1, 1, 9, 4, 4, 2, 8, 7, 5, 5, 5, 5, 4, 144,17, 2, 7, 2, 2, 11, 6, 2, 12, 4, 4, 7, 34, 14, 5, 2, + 2, 5, 9, 2, 4, 2, 3, 2, 3, 18, 4, 3, 6, 2, 3, 5, 2, 2, 2, 7, 2, 3, 4, 3, 5, 3, 107,9, 1, 9, 6, 4, 2, 2, 2, 3, 3, 7, 2, 2, 2, + 6, 22, 21, 4, 10, 2, 2, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 19, 7, 5, 6, 3, 14, 4, 3, 3, 1, 1, 1, 3, 2, 2, 17, 1, 2, 1, + 2, 2, 2, 1, 5, 4, 1, 1, 33, 2, 1, 6, 2, 2, 2, 2, 2, 7, 7, 7, 5, 6, 4, 2, 2, 7, 2, 19, 13, 13, 10, 3, 3, 2, 21, 6, 1, 5, 2, 2, 1, + 1, 1, 5, 2, 6, 2, 2, 1, 1, 3, 3, 1, 2, 1, 13, 3, 2, 16, 5, 5, 1, 6, 10, 1, 16, 3, 4, 6, 34, 9, 4, 16, 15, 14, 4, 4, 3, 3, 11, 2, 3, + 2, 2, 2, 1, 1, 21, 1, 1, 1, 1, 7, 3, 2, 4, 6, 1, 3, 2, 2, 95, 17, 5, 4, 4, 4, 6, 1, 8, 13, 7, 4, 10, 3, 3, 2, 13, 4, 3, 2, 8, 3, + 5, 4, 3, 2, 182,8, 3, 3, 15, 6, 3, 4, 3, 34, 9, 5, 8, 6, 4, 4, 6, 4, 11, 5, 4, 4, 2, 9, 5, 11, 6, 3, 2, 5, 2, 57, 8, 1, 4, 19, 4, + 9, 4, 2, 2, 2, 2, 16, 15, 8, 4, 10, 4, 5, 2, 2, 2, 13, 2, 1, 6, 4, 4, 2, 1, 22, 9, 3, 3, 2, 2, 4, 2, 4, 1, 1, 1, 1, 1, 33, 4, 10, + 3, 10, 2, 5, 11, 2, 2, 4, 1, 2, 2, 2, 18, 4, 7, 3, 10, 4, 1, 2, 2, 2, 24, 7, 5, 2, 4, 2, 1, 1, 1, 6, 3, 6, 2, 2, 2, 2, 1, 1, 1, + 1, 1, 1, 1, 14, 6, 5, 4, 16, 2, 1, 5, 2, 6, 5, 1, 1, 3, 25, 5, 8, 6, 5, 17, 13, 3, 7, 1, 1, 15, 3, 5, 3, 28, 8, 5, 6, 1, 3, 4, 2, + 1, 21, 8, 5, 5, 5, 8, 5, 2, 5, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 2, 2, 2, 2, 57, 2, 3, 5, 4, 1, 9, 3, 4, 4, 7, 5, + 22, 4, 7, 3, 1, 1, 1, 32, 8, 7, 3, 3, 11, 9, 3, 5, 4, 3, 4, 3, 2, 1, 1, 1, 97, 1, 1, 3, 1, 26, 8, 1, 4, 2, 1, 1, 2, 2, 1, 4, 2, + 2, 2, 2, 3, 2, 2, 2, 7, 2, 2, 6, 2, 1, 1, 1, 3, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 16, 10, 10, 9, 2, 1, 1, 4, 3, + 3, 4, 1, 2, 1, 19, 4, 4, 12, 1, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 3, 2, 3, 2, 2, 2, 2, 1, 1, 8, 1, 1, 1, 1, 4, 4, 4, 1, 1, 1, 6, + 33, 2, 1, 2, 6, 6, 4, 1, 23, 2, 3, 1, 15, 14, 2, 2, 2, 10, 1, 101,8, 8, 5, 15, 7, 4, 4, 3, 3, 4, 2, 1, 2, 1, 10, 2, 5, 1, 1, 1, 1, + 17, 6, 5, 2, 5, 35, 5, 5, 27, 24, 16, 6, 1, 3, 61, 14, 6, 2, 24, 19, 3, 1, 1, 1, 1, 1, 1, 1, 1, 5, 3, 2, 2, 2, 6, 4, 4, 3, 4, 6, 6, + 2, 71, 2, 7, 12, 4, 3, 4, 10, 3, 2, 10, 2, 2, 15, 5, 3, 2, 2, 43, 2, 3, 5, 2, 2, 9, 7, 4, 4, 2, 10, 3, 5, 2, 7, 5, 4, 3, 2, 5, 9, + 8, 8, 7, 2, 3, 2, 35, 11, 7, 3, 3, 4, 7, 6, 5, 3, 3, 3, 2, 1, 1, 8, 8, 8, 5, 163,14, 3, 4, 5, 3, 1, 1, 5, 2, 2, 2, 121,86, 5, 1, + 1, 1, 5, 8, 1, 1, 1, 1, 6, 5, 13, 6, 2, 2, 5, 4, 14, 4, 1, 3, 3, 2, 1, 1, 12, 1, 1, 3, 4, 3, 2, 1, 1, 21, 1, 1, 1, 1, 1, 1, 1, + 3, 2, 2, 2, 2, 1, 7, 3, 3, 2, 7, 3, 102,11, 5, 4, 1, 18, 13, 9, 5, 3, 1, 11, 8, 6, 2, 11, 8, 3, 1, 5, 3, 5, 2, 2, 2, 1, 1, 4, 13, + 3, 2, 4, 2, 36, 34, 12, 13, 5, 3, 7, 6, 5, 1, 1, 20, 1, 1, 13, 13, 91, 9, 2, 2, 2, 2, 9, 2, 2, 26, 2, 18, 4, 13, 8, 6, 2, 2, 5, 3, 2, + 18, 16, 6, 4, 5, 4, 3, 11, 1, 1, 1, 97, 9, 1, 1, 2, 17, 3, 3, 11, 5, 4, 4, 5, 8, 2, 3, 2, 1, 1, 1, 24, 3, 6, 6, 11, 4, 3, 2, 6, 1, + 1, 1, 4, 4, 11, 11, 11, 8, 1, 1, 2, 2, 2, 2, 88, 30, 2, 16, 8, 3, 14, 5, 4, 3, 2, 8, 2, 2, 7, 3, 7, 2, 14, 3, 3, 5, 4, 3, 3, 49, 12, + 3, 3, 10, 2, 1, 2, 2, 21, 7, 6, 3, 4, 2, 17, 2, 2, 4, 4, 2, 2, 3, 1, 1, 1, 3, 14, 1, 3, 2, 1, 3, 3, 1, 1, 3, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 55, 42, 3, 1, 28, 8, 5, 5, 2, 2, 11, 2, 1, 1, 5, 5, 4, 2, 2, 3, 3, 3, 1, 1, 2, 2, 6, 2, 2, + 3, 1, 2, 1, 3, 1, 1, 1, 1, 28, 18, 2, 2, 12, 7, 3, 3, 1, 2, 1, 1, 2, 3, 2, 2, 11, 3, 4, 15, 2, 7, 3, 3, 2, 4, 2, 25, 11, 8, 1, 1, + 2, 5, 5, 36, 8, 7, 4, 2, 4, 3, 5, 5, 5, 5, 7, 3, 2, 2, 151,7, 3, 3, 2, 12, 7, 7, 3, 3, 5, 4, 3, 6, 2, 2, 2, 5, 3, 19, 4, 2, 4, + 4, 1, 1, 1, 2, 21, 9, 2, 4, 2, 5, 3, 9, 5, 2, 7, 2, 4, 12, 5, 2, 16, 4, 8, 8, 6, 6, 5, 1, 2, 11, 10, 4, 4, 55, 4, 1, 3, 2, 1, 1, + 1, 2, 1, 13, 4, 4, 2, 1, 2, 5, 5, 2, 2, 2, 2, 11, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 1, 4, 2, 2, 2, 1, 1, 1, 7, 2, + 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 17, 6, 6, 6, 8, 5, 3, 1, 1, 1, 56, 7, 3, 1, 3, 3, 3, 1, 2, 3, 11, 8, 3, 2, 1, 3, 2, 1, 1, 4, 6, + 3, 3, 2, 4, 3, 2, 22, 3, 2, 3, 3, 4, 16, 2, 2, 1, 10, 11, 8, 4, 2, 2, 8, 4, 2, 1, 1, 18, 12, 12, 11, 4, 3, 3, 1, 3, 1, 1, 1, 1, 1, + 1, 1, 1, 38, 14, 3, 6, 2, 2, 3, 9, 1, 1, 4, 3, 2, 3, 1, 1, 1, 1, 7, 4, 1, 1, 3, 2, 1, 1, 1, 8, 3, 1, 1, 1, 1, 1, 1, 1, 15, 3, + 1, 1, 1, 1, 2, 3, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2, 1, 1, 43, 1, 2, 1, 1, 2, 1, 1, 1, 8, 2, 2, 3, 3, 20, 7, 7, 2, 2, 4, 3, 3, 3, + 3, 2, 1, 4, 1, 1, 1, 1, 3, 3, 2, 2, 4, 1, 1, 1, 1, 1, 1, 13, 3, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 5, 1, 1, 1, + 3, 2, 7, 1, 1, 1, 1, 1, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 15, 3, 3, 7, 3, + 37, 1, 1, 15, 4, 3, 5, 12, 7, 3, 2, 3, 2, 1, 48, 15, 4, 4, 2, 2, 10, 4, 6, 3, 7, 2, 1, 1, 14, 7, 3, 3, 2, 54, 5, 1, 15, 6, 11, 2, 5, + 3, 3, 4, 4, 3, 2, 1, 1, 1, 37, 3, 2, 1, 3, 3, 3, 3, 2, 12, 5, 2, 4, 2, 2, 71, 4, 3, 3, 4, 9, 1, 1, 1, 2, 2, 2, 2, 4, 2, 9, 2, + 3, 27, 5, 1, 1, 6, 6, 2, 32, 5, 1, 1, 18, 2, 2, 2, 3, 1, 4, 2, 4, 4, 10, 5, 11, 4, 4, 46, 12, 1, 5, 3, 7, 12, 2, 6, 16, 3, 2, 2, 2, + 7, 38, 3, 2, 10, 5, 7, 6, 3, 1, 2, 2, 2, 5, 1, 83, 17, 7, 4, 2, 19, 6, 2, 3, 2, 11, 6, 5, 1, 1, 11, 2, 3, 3, 6, 3, 2, 4, 5, 3, 5, + 2, 15, 1, 1, 3, 5, 2, 40, 14, 2, 10, 5, 8, 3, 2, 2, 3, 1, 2, 16, 4, 1, 5, 1, 1, 104,4, 2, 20, 11, 9, 2, 7, 11, 2, 3, 4, 10, 5, 4, 2, + 11, 6, 2, 6, 2, 16, 2, 13, 2, 2, 2, 2, 1, 1, 2, 3, 3, 1, 254,1, 6, 3, 10, 2, 1, 3, 2, 7, 3, 4, 4, 4, 27, 2, 5, 2, 2, 3, 3, 4, 2, + 3, 16, 7, 4, 4, 7, 2, 2, 6, 4, 14, 6, 4, 3, 3, 2, 1, 5, 4, 8, 3, 1, 11, 3, 7, 23, 3, 4, 2, 5, 3, 2, 26, 2, 11, 4, 2, 10, 2, 36, 9, + 8, 6, 9, 7, 1, 16, 4, 3, 7, 1, 1, 1, 16, 2, 5, 3, 17, 2, 4, 2, 2, 2, 3, 1, 126,3, 4, 3, 2, 2, 3, 40, 2, 3, 7, 8, 7, 5, 4, 3, 1, + 4, 10, 3, 8, 3, 3, 4, 3, 4, 20, 8, 2, 4, 4, 14, 9, 1, 2, 2, 3, 151,7, 2, 1, 1, 2, 24, 24, 2, 75, 74, 7, 4, 1, 8, 6, 4, 4, 2, 7, 2, + 3, 3, 5, 3, 9, 4, 5, 2, 2, 2, 11, 3, 2, 3, 2, 5, 2, 2, 3, 5, 5, 7, 5, 5, 15, 6, 2, 4, 2, 18, 2, 2, 4, 3, 2, 2, 2, 2, 1, 1, 30, + 23, 4, 1, 2, 5, 4, 2, 2, 6, 1, 1, 1, 5, 2, 1, 9, 1, 1, 46, 3, 3, 2, 6, 2, 2, 2, 2, 4, 3, 3, 6, 2, 9, 7, 4, 3, 6, 2, 2, 2, 1, + 1, 1, 1, 1, 5, 14, 1, 1, 1, 1, 1, 1, 1, 3, 2, 96, 3, 15, 5, 9, 3, 4, 4, 4, 4, 4, 4, 15, 5, 2, 8, 26, 26, 25, 25, 3, 3, 2, 3, 4, 7, + 53, 8, 6, 4, 3, 3, 3, 2, 2, 3, 2, 4, 4, 3, 3, 3, 12, 3, 3, 2, 2, 2, 2, 2, 4, 1, 1, 1, 1, 1, 1, 10, 3, 2, 1, 1, 1, 7, 3, 1, 44, + 12, 5, 2, 1, 5, 5, 7, 2, 10, 6, 3, 5, 5, 4, 68, 13, 3, 1, 1, 16, 5, 3, 4, 3, 2, 4, 7, 2, 3, 1, 3, 3, 18, 3, 5, 2, 2, 1, 1, 1, 2, + 28, 3, 14, 4, 3, 3, 206,4, 7, 5, 1, 17, 10, 4, 3, 2, 2, 1, 28, 2, 3, 15, 11, 5, 4, 3, 7, 4, 4, 4, 4, 4, 2, 2, 6, 6, 2, 39, 5, 2, 5, + 4, 4, 2, 5, 2, 2, 4, 3, 2, 4, 3, 15, 2, 9, 54, 5, 3, 12, 9, 4, 2, 2, 1, 5, 3, 3, 2, 2, 1, 1, 16, 2, 7, 4, 3, 1, 2, 11, 5, 2, 2, 1, 1, 1, 1, 2, 2, 2, 115,4, 19, 4, 15, 15, 13, 11, 4, 5, 2, 40, 2, 4, 2, 7, 3, 2, 8, 7, 7, 3, 6, 2, 9, 2, 5, 14, 4, 10, 2, 1, 3, 103, - 1, 8, 3, 2, 2, 36, 12, 7, 2, 3, 4, 5, 5, 2, 4, 1, 1, 8, 4, 3, 5, 2, 2, 8, 3, 1, 1, 12, 5, 7, 2, 92, 2, 4, 5, 3, 4, 2, 2, 3, 2, - 8, 2, 5, 3, 4, 17, 5, 6, 3, 2, 8, 3, 3, 4, 20, 2, 7, 3, 3, 182,5, 3, 4, 8, 4, 3, 3, 2, 2, 17, 9, 7, 2, 138,4, 13, 4, 5, 4, 7, 6, - 41, 7, 34, 3, 5, 4, 5, 4, 8, 3, 6, 3, 2, 2, 5, 4, 2, 9, 3, 9, 2, 4, 2, 8, 4, 4, 4, 2, 10, 2, 4, 3, 3, 6, 3, 52, 3, 2, 1, 2, 11, - 9, 8, 2, 3, 5, 3, 12, 5, 3, 1, 1, 2, 6, 5, 3, 4, 23, 2, 2, 3, 3, 1, 1, 2, 4, 2, 1, 1, 1, 99, 6, 6, 6, 3, 1, 1, 12, 7, 4, 4, 3, - 2, 11, 5, 1, 49, 9, 5, 3, 2, 1, 1, 1, 1, 2, 2, 5, 4, 4, 2, 2, 5, 2, 8, 5, 5, 1, 1, 1, 1, 1, 1, 1, 2, 96, 14, 11, 3, 33, 27, 2, 2, - 2, 2, 7, 12, 4, 5, 16, 14, 4, 3, 1, 10, 4, 2, 5, 4, 5, 4, 8, 6, 3, 9, 4, 2, 16, 9, 7, 6, 40, 4, 4, 10, 6, 2, 7, 7, 6, 12, 9, 8, 3, - 3, 3, 178,3, 2, 4, 6, 2, 3, 3, 78, 6, 3, 6, 2, 1, 4, 10, 3, 3, 9, 2, 3, 3, 3, 3, 3, 6, 13, 1, 3, 3, 2, 2, 7, 4, 3, 5, 3, 2, 5, - 11, 3, 3, 3, 8, 4, 10, 5, 2, 33, 2, 10, 5, 7, 4, 4, 2, 8, 7, 3, 4, 1, 66, 7, 2, 3, 1, 10, 9, 1, 1, 1, 1, 5, 4, 3, 14, 9, 4, 11, 4, - 4, 1, 1, 1, 1, 3, 2, 21, 2, 4, 4, 2, 2, 2, 10, 3, 5, 4, 8, 4, 3, 2, 2, 62, 4, 4, 10, 3, 44, 21, 2, 5, 3, 6, 2, 7, 4, 3, 2, 1, 59, - 6, 4, 22, 4, 5, 2, 2, 4, 4, 1, 7, 6, 3, 7, 7, 2, 111,8, 5, 9, 4, 2, 17, 11, 1, 7, 2, 7, 18, 3, 1, 5, 2, 2, 2, 2, 11, 5, 14, 7, 2, - 2, 2, 2, 17, 9, 2, 2, 4, 7, 5, 3, 53, 1, 3, 1, 2, 23, 2, 6, 5, 5, 6, 4, 3, 2, 2, 3, 3, 2, 3, 3, 4, 1, 1, 2, 20, 9, 3, 2, 2, 5, - 3, 14, 4, 4, 4, 1, 3, 15, 3, 6, 3, 70, 3, 3, 7, 6, 4, 19, 2, 4, 7, 3, 7, 2, 2, 3, 3, 4, 2, 5, 2, 3, 3, 12, 3, 10, 1, 2, 4, 2, 3, - 15, 10, 9, 9, 3, 3, 27, 11, 4, 7, 5, 4, 5, 170,1, 1, 16, 2, 5, 3, 2, 5, 4, 32, 4, 3, 10, 4, 3, 2, 7, 3, 67, 30, 24, 9, 3, 6, 4, 2, 10, - 8, 4, 2, 10, 3, 3, 2, 13, 3, 2, 5, 2, 7, 17, 4, 4, 6, 10, 2, 6, 17, 2, 2, 1, 5, 3, 27, 11, 3, 3, 3, 6, 3, 1, 4, 7, 2, 14, 2, 9, 7, - 3, 2, 70, 2, 2, 7, 3, 5, 3, 4, 6, 3, 13, 10, 5, 17, 3, 1, 2, 4, 3, 1, 2, 1, 1, 27, 4, 2, 5, 4, 4, 1, 1, 5, 4, 7, 4, 3, 36, 12, 6, - 3, 3, 4, 3, 9, 3, 3, 25, 11, 7, 1, 1, 7, 7, 1, 4, 34, 15, 1, 6, 2, 1, 15, 6, 5, 3, 3, 2, 1, 5, 2, 29, 5, 3, 13, 10, 9, 47, 37, 36, 5, - 3, 2, 2, 3, 1, 2, 2, 4, 2, 3, 2, 2, 2, 4, 3, 14, 6, 3, 2, 2, 1, 34, 1, 1, 13, 3, 3, 3, 3, 2, 7, 109,2, 11, 6, 5, 3, 3, 3, 3, 19, - 4, 2, 2, 2, 2, 3, 3, 19, 4, 3, 3, 3, 4, 3, 10, 3, 4, 2, 2, 3, 1, 16, 1, 1, 1, 8, 2, 2, 2, 2, 2, 2, 3, 7, 4, 3, 2, 135,2, 11, 9, - 39, 7, 7, 6, 6, 14, 10, 3, 3, 2, 3, 3, 3, 4, 3, 5, 5, 2, 3, 51, 16, 3, 6, 4, 4, 2, 1, 1, 1, 3, 2, 4, 3, 7, 3, 4, 4, 2, 2, 3, 3, - 2, 3, 1, 1, 1, 1, 2, 2, 2, 5, 12, 8, 7, 6, 2, 3, 1, 1, 18, 8, 3, 2, 9, 2, 1, 5, 3, 2, 1, 1, 2, 1, 1, 1, 1, 1, 9, 2, 1, 1, 1, - 2, 16, 2, 3, 3, 1, 1, 1, 3, 9, 6, 5, 9, 2, 3, 1, 19, 3, 6, 3, 2, 4, 17, 16, 5, 4, 2, 1, 1, 1, 1, 1, 2, 2, 28, 1, 1, 1, 5, 5, 2, - 3, 5, 2, 2, 12, 5, 2, 2, 2, 6, 162,7, 4, 3, 3, 2, 2, 6, 5, 1, 55, 5, 11, 6, 2, 1, 2, 4, 2, 2, 5, 3, 3, 3, 4, 5, 3, 2, 2, 4, 7, - 3, 3, 25, 5, 7, 3, 2, 1, 3, 2, 1, 1, 3, 6, 2, 2, 3, 9, 2, 2, 2, 1, 1, 8, 3, 11, 9, 5, 1, 30, 11, 7, 2, 10, 5, 2, 8, 2, 2, 4, 2, - 2, 39, 25, 21, 21, 3, 4, 4, 4, 1, 3, 1, 3, 3, 197,114,4, 10, 10, 1, 3, 3, 7, 8, 3, 4, 3, 7, 4, 5, 11, 3, 3, 5, 3, 3, 3, 10, 3, 4, 2, - 11, 2, 2, 2, 7, 4, 4, 6, 4, 3, 4, 3, 43, 2, 2, 7, 4, 2, 2, 6, 2, 1, 1, 1, 1, 1, 5, 2, 1, 1, 4, 2, 2, 2, 1, 5, 3, 6, 173,3, 19, - 3, 4, 6, 1, 1, 5, 48, 3, 2, 3, 4, 3, 9, 7, 6, 3, 3, 9, 19, 15, 4, 3, 17, 2, 3, 2, 12, 1, 4, 4, 24, 6, 11, 10, 10, 5, 19, 13, 4, 3, 4, - 1, 1, 1, 1, 4, 19, 12, 9, 4, 8, 1, 1, 4, 3, 7, 6, 4, 9, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 157,32, 2, 3, 3, 8, 7, 8, 2, 3, 1, 41, 6, - 7, 7, 8, 13, 13, 10, 7, 2, 49, 12, 10, 10, 5, 10, 6, 6, 5, 1, 1, 8, 7, 2, 15, 8, 6, 2, 2, 23, 5, 3, 11, 9, 2, 4, 3, 4, 3, 3, 3, 12, 2, - 1, 3, 5, 12, 2, 3, 2, 2, 2, 1, 1, 1, 83, 1, 1, 5, 3, 3, 3, 3, 2, 1, 10, 1, 1, 1, 1, 2, 3, 3, 3, 3, 1, 1, 2, 7, 6, 2, 9, 6, 5, - 5, 4, 2, 1, 1, 1, 18, 2, 5, 1, 1, 1, 1, 1, 4, 8, 4, 5, 3, 3, 3, 2, 1, 1, 24, 3, 2, 2, 1, 1, 1, 12, 1, 1, 1, 5, 4, 2, 4, 3, 2, + 1, 8, 3, 2, 2, 36, 12, 7, 2, 3, 4, 5, 5, 2, 4, 1, 1, 8, 4, 3, 5, 2, 2, 8, 3, 1, 1, 12, 5, 7, 2, 92, 2, 4, 5, 3, 4, 2, 2, 3, 2, + 8, 2, 5, 3, 4, 17, 5, 6, 3, 2, 8, 3, 3, 4, 20, 2, 7, 3, 3, 182,5, 3, 4, 8, 4, 3, 3, 2, 2, 17, 9, 7, 2, 138,4, 13, 4, 5, 4, 7, 6, + 41, 7, 34, 3, 5, 4, 5, 4, 8, 3, 6, 3, 2, 2, 5, 4, 2, 9, 3, 9, 2, 4, 2, 8, 4, 4, 4, 2, 10, 2, 4, 3, 3, 6, 3, 52, 3, 2, 1, 2, 11, + 9, 8, 2, 3, 5, 3, 12, 5, 3, 1, 1, 2, 6, 5, 3, 4, 23, 2, 2, 3, 3, 1, 1, 2, 4, 2, 1, 1, 1, 99, 6, 6, 6, 3, 1, 1, 12, 7, 4, 4, 3, + 2, 11, 5, 1, 49, 9, 5, 3, 2, 1, 1, 1, 1, 2, 2, 5, 4, 4, 2, 2, 5, 2, 8, 5, 5, 1, 1, 1, 1, 1, 1, 1, 2, 96, 14, 11, 3, 33, 27, 2, 2, + 2, 2, 7, 12, 4, 5, 16, 14, 4, 3, 1, 10, 4, 2, 5, 4, 5, 4, 8, 6, 3, 9, 4, 2, 16, 9, 7, 6, 40, 4, 4, 10, 6, 2, 7, 7, 6, 12, 9, 8, 3, + 3, 3, 178,3, 2, 4, 6, 2, 3, 3, 78, 6, 3, 6, 2, 1, 4, 10, 3, 3, 9, 2, 3, 3, 3, 3, 3, 6, 13, 1, 3, 3, 2, 2, 7, 4, 3, 5, 3, 2, 5, + 11, 3, 3, 3, 8, 4, 10, 5, 2, 33, 2, 10, 5, 7, 4, 4, 2, 8, 7, 3, 4, 1, 66, 7, 2, 3, 1, 10, 9, 1, 1, 1, 1, 5, 4, 3, 14, 9, 4, 11, 4, + 4, 1, 1, 1, 1, 3, 2, 21, 2, 4, 4, 2, 2, 2, 10, 3, 5, 4, 8, 4, 3, 2, 2, 62, 4, 4, 10, 3, 44, 21, 2, 5, 3, 6, 2, 7, 4, 3, 2, 1, 59, + 6, 4, 22, 4, 5, 2, 2, 4, 4, 1, 7, 6, 3, 7, 7, 2, 111,8, 5, 9, 4, 2, 17, 11, 1, 7, 2, 7, 18, 3, 1, 5, 2, 2, 2, 2, 11, 5, 14, 7, 2, + 2, 2, 2, 17, 9, 2, 2, 4, 7, 5, 3, 53, 1, 3, 1, 2, 23, 2, 6, 5, 5, 6, 4, 3, 2, 2, 3, 3, 2, 3, 3, 4, 1, 1, 2, 20, 9, 3, 2, 2, 5, + 3, 14, 4, 4, 4, 1, 3, 15, 3, 6, 3, 70, 3, 3, 7, 6, 4, 19, 2, 4, 7, 3, 7, 2, 2, 3, 3, 4, 2, 5, 2, 3, 3, 12, 3, 10, 1, 2, 4, 2, 3, + 15, 10, 9, 9, 3, 3, 27, 11, 4, 7, 5, 4, 5, 170,1, 1, 16, 2, 5, 3, 2, 5, 4, 32, 4, 3, 10, 4, 3, 2, 7, 3, 67, 30, 24, 9, 3, 6, 4, 2, 10, + 8, 4, 2, 10, 3, 3, 2, 13, 3, 2, 5, 2, 7, 17, 4, 4, 6, 10, 2, 6, 17, 2, 2, 1, 5, 3, 27, 11, 3, 3, 3, 6, 3, 1, 4, 7, 2, 14, 2, 9, 7, + 3, 2, 70, 2, 2, 7, 3, 5, 3, 4, 6, 3, 13, 10, 5, 17, 3, 1, 2, 4, 3, 1, 2, 1, 1, 27, 4, 2, 5, 4, 4, 1, 1, 5, 4, 7, 4, 3, 36, 12, 6, + 3, 3, 4, 3, 9, 3, 3, 25, 11, 7, 1, 1, 7, 7, 1, 4, 34, 15, 1, 6, 2, 1, 15, 6, 5, 3, 3, 2, 1, 5, 2, 29, 5, 3, 13, 10, 9, 47, 37, 36, 5, + 3, 2, 2, 3, 1, 2, 2, 4, 2, 3, 2, 2, 2, 4, 3, 14, 6, 3, 2, 2, 1, 34, 1, 1, 13, 3, 3, 3, 3, 2, 7, 109,2, 11, 6, 5, 3, 3, 3, 3, 19, + 4, 2, 2, 2, 2, 3, 3, 19, 4, 3, 3, 3, 4, 3, 10, 3, 4, 2, 2, 3, 1, 16, 1, 1, 1, 8, 2, 2, 2, 2, 2, 2, 3, 7, 4, 3, 2, 135,2, 11, 9, + 39, 7, 7, 6, 6, 14, 10, 3, 3, 2, 3, 3, 3, 4, 3, 5, 5, 2, 3, 51, 16, 3, 6, 4, 4, 2, 1, 1, 1, 3, 2, 4, 3, 7, 3, 4, 4, 2, 2, 3, 3, + 2, 3, 1, 1, 1, 1, 2, 2, 2, 5, 12, 8, 7, 6, 2, 3, 1, 1, 18, 8, 3, 2, 9, 2, 1, 5, 3, 2, 1, 1, 2, 1, 1, 1, 1, 1, 9, 2, 1, 1, 1, + 2, 16, 2, 3, 3, 1, 1, 1, 3, 9, 6, 5, 9, 2, 3, 1, 19, 3, 6, 3, 2, 4, 17, 16, 5, 4, 2, 1, 1, 1, 1, 1, 2, 2, 28, 1, 1, 1, 5, 5, 2, + 3, 5, 2, 2, 12, 5, 2, 2, 2, 6, 162,7, 4, 3, 3, 2, 2, 6, 5, 1, 55, 5, 11, 6, 2, 1, 2, 4, 2, 2, 5, 3, 3, 3, 4, 5, 3, 2, 2, 4, 7, + 3, 3, 25, 5, 7, 3, 2, 1, 3, 2, 1, 1, 3, 6, 2, 2, 3, 9, 2, 2, 2, 1, 1, 8, 3, 11, 9, 5, 1, 30, 11, 7, 2, 10, 5, 2, 8, 2, 2, 4, 2, + 2, 39, 25, 21, 21, 3, 4, 4, 4, 1, 3, 1, 3, 3, 197,114,4, 10, 10, 1, 3, 3, 7, 8, 3, 4, 3, 7, 4, 5, 11, 3, 3, 5, 3, 3, 3, 10, 3, 4, 2, + 11, 2, 2, 2, 7, 4, 4, 6, 4, 3, 4, 3, 43, 2, 2, 7, 4, 2, 2, 6, 2, 1, 1, 1, 1, 1, 5, 2, 1, 1, 4, 2, 2, 2, 1, 5, 3, 6, 173,3, 19, + 3, 4, 6, 1, 1, 5, 48, 3, 2, 3, 4, 3, 9, 7, 6, 3, 3, 9, 19, 15, 4, 3, 17, 2, 3, 2, 12, 1, 4, 4, 24, 6, 11, 10, 10, 5, 19, 13, 4, 3, 4, + 1, 1, 1, 1, 4, 19, 12, 9, 4, 8, 1, 1, 4, 3, 7, 6, 4, 9, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 157,32, 2, 3, 3, 8, 7, 8, 2, 3, 1, 41, 6, + 7, 7, 8, 13, 13, 10, 7, 2, 49, 12, 10, 10, 5, 10, 6, 6, 5, 1, 1, 8, 7, 2, 15, 8, 6, 2, 2, 23, 5, 3, 11, 9, 2, 4, 3, 4, 3, 3, 3, 12, 2, + 1, 3, 5, 12, 2, 3, 2, 2, 2, 1, 1, 1, 83, 1, 1, 5, 3, 3, 3, 3, 2, 1, 10, 1, 1, 1, 1, 2, 3, 3, 3, 3, 1, 1, 2, 7, 6, 2, 9, 6, 5, + 5, 4, 2, 1, 1, 1, 18, 2, 5, 1, 1, 1, 1, 1, 4, 8, 4, 5, 3, 3, 3, 2, 1, 1, 24, 3, 2, 2, 1, 1, 1, 12, 1, 1, 1, 5, 4, 2, 4, 3, 2, 101,7, 5, 4, 3, 9, 2, 2, 7, 2, 2, 4, 4, 3, 6, 4, 10, 5, 2, 22, 3, 2, 5, 3, 3, 3, 5, 2, 2, 9, 2, 1, 4, 3, 2, 2, 1, 1, 1, 2, 232, - 1, 1, 1, 1, 5, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 24, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, - 2, 2, 10, 2, 5, 3, 6, 2, 2, 5, 4, 4, 2, 6, 3, 2, 1, 21, 1, 1, 12, 2, 9, 4, 3, 3, 5, 2, 1, 6, 3, 2, 3, 2, 41, 16, 6, 2, 7, 2, 1, - 1, 1, 5, 9, 3, 2, 3, 2, 2, 1, 1, 2, 1, 1, 7, 4, 3, 3, 5, 2, 1, 1, 3, 2, 2, 2, 1, 1, 1, 5, 2, 2, 2, 2, 1, 3, 2, 1, 1, 8, 1, - 1, 1, 5, 3, 11, 2, 1, 1, 1, 3, 1, 1, 2, 1, 11, 5, 4, 2, 1, 1, 1, 2, 36, 29, 3, 5, 2, 1, 1, 1, 1, 1, 4, 6, 4, 3, 11, 1, 1, 1, 1, - 5, 3, 2, 2, 1, 1, 3, 4, 2, 2, 2, 10, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 4, 3, 2, 17, 2, - 5, 4, 5, 2, 3, 11, 5, 6, 6, 15, 2, 2, 1, 3, 1, 1, 13, 3, 3, 1, 1, 29, 2, 4, 3, 2, 3, 2, 2, 12, 4, 7, 46, 30, 2, 7, 6, 3, 2, 6, 2, - 4, 2, 1, 1, 1, 3, 1, 1, 1, 2, 95, 9, 4, 3, 5, 6, 5, 5, 6, 28, 16, 13, 9, 6, 5, 4, 11, 2, 1, 4, 8, 1, 1, 1, 1, 7, 2, 1, 1, 3, 4, - 3, 3, 50, 1, 7, 3, 11, 4, 2, 4, 6, 4, 3, 3, 3, 8, 3, 3, 33, 2, 3, 4, 5, 4, 4, 1, 1, 1, 11, 2, 8, 2, 1, 1, 5, 3, 7, 3, 7, 1, 4, - 12, 4, 1, 3, 3, 21, 5, 3, 1, 13, 6, 6, 2, 2, 6, 6, 6, 1, 1, 1, 1, 1, 2, 58, 9, 3, 28, 2, 2, 3, 3, 3, 6, 6, 3, 2, 7, 2, 3, 7, 1, - 3, 3, 3, 1, 3, 2, 2, 2, 2, 2, 2, 49, 3, 3, 2, 31, 22, 20, 2, 2, 2, 2, 5, 4, 4, 3, 19, 4, 2, 3, 3, 10, 4, 5, 27, 4, 2, 3, 5, 2, 35, - 1, 7, 4, 4, 4, 2, 7, 2, 6, 5, 5, 1, 1, 1, 9, 4, 3, 4, 2, 29, 9, 9, 1, 1, 2, 2, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2, 3, 2, - 8, 2, 2, 6, 3, 3, 1, 1, 5, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 4, 2, 2, 37, 2, 4, 5, 2, 2, 2, 7, 5, 2, 4, 3, 2, 4, 3, 2, 2, 9, 1, - 6, 2, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 3, 2, 1, 1, 1, 1, 7, 2, 2, 4, 11, 4, 3, 2, 10, 4, 4, 4, 12, 4, 4, 1, 1, 6, 3, - 3, 3, 2, 15, 4, 7, 11, 6, 5, 11, 5, 3, 3, 31, 4, 8, 2, 6, 4, 4, 1, 31, 3, 15, 3, 3, 36, 3, 27, 27, 2, 3, 5, 4, 3, 2, 2, 2, 3, 99, 5, - 2, 1, 2, 1, 7, 1, 3, 2, 2, 38, 25, 3, 2, 5, 2, 1, 1, 2, 5, 4, 4, 13, 3, 2, 4, 13, 2, 2, 2, 2, 3, 5, 3, 2, 3, 6, 6, 2, 5, 1, 1, - 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 7, 1, 1, 1, 2, 2, 2, 2, 1, 1, 12, 2, 2, 2, 2, 13, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 4, 3, - 2, 1, 1, 1, 1, 1, 139,3, 2, 7, 2, 2, 3, 2, 1, 1, 1, 7, 3, 8, 2, 5, 4, 4, 4, 3, 3, 1, 1, 3, 1, 11, 3, 3, 4, 7, 2, 4, 11, 5, 17, - 4, 2, 7, 20, 2, 2, 2, 6, 3, 3, 13, 1, 3, 5, 4, 2, 10, 4, 4, 4, 1, 1, 2, 1, 1, 3, 1, 1, 1, 6, 1, 1, 1, 4, 4, 3, 2, 1, 5, 2, 2, - 2, 14, 6, 6, 6, 6, 4, 5, 5, 5, 5, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 24, 5, 1, 3, 3, 2, 4, 3, 3, 3, 3, 31, 3, 2, 2, - 5, 4, 2, 17, 9, 9, 4, 4, 3, 4, 18, 3, 5, 3, 4, 3, 2, 7, 4, 23, 8, 1, 4, 4, 4, 3, 30, 8, 6, 2, 6, 2, 6, 4, 2, 18, 2, 4, 4, 2, 3, - 4, 20, 7, 1, 5, 3, 1, 1, 1, 2, 2, 1, 1, 1, 23, 4, 2, 6, 3, 1, 1, 2, 50, 7, 2, 2, 16, 2, 2, 3, 6, 2, 3, 6, 4, 3, 3, 3, 2, 8, 5, - 2, 6, 2, 3, 2, 57, 3, 4, 1, 2, 7, 3, 3, 7, 3, 1, 7, 5, 3, 3, 5, 2, 4, 1, 1, 37, 8, 6, 2, 2, 3, 5, 2, 1, 1, 2, 12, 4, 1, 2, 2, - 21, 1, 11, 8, 3, 4, 3, 2, 2, 2, 2, 5, 5, 5, 2, 2, 2, 3, 3, 3, 61, 10, 2, 3, 1, 2, 3, 7, 9, 4, 2, 2, 2, 2, 2, 9, 2, 1, 4, 2, 3, - 2, 9, 3, 2, 9, 4, 3, 2, 7, 1, 1, 1, 1, 2, 1, 15, 8, 3, 2, 2, 2, 2, 10, 4, 6, 1, 1, 3, 4, 2, 2, 2, 8, 6, 1, 3, 8, 4, 1, 1, 5, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 9, 2, 3, 1, 2, 1, 13, 9, 4, 1, 15, 3, 8, 7, 2, 11, 3, 6, 1, 7, 3, 9, 2, 1, 2, - 2, 5, 4, 3, 12, 3, 1, 3, 1, 4, 28, 5, 3, 3, 5, 7, 1, 1, 4, 53, 6, 2, 2, 4, 10, 5, 4, 3, 2, 1, 1, 1, 3, 16, 3, 4, 3, 2, 21, 5, 3, - 2, 40, 2, 7, 4, 7, 3, 4, 7, 4, 4, 11, 4, 1, 4, 43, 4, 5, 3, 3, 3, 12, 1, 1, 1, 2, 5, 1, 1, 14, 3, 4, 2, 2, 4, 1, 1, 1, 1, 1, 1, - 1, 3, 4, 2, 1, 1, 51, 10, 6, 3, 3, 8, 6, 3, 1, 5, 2, 8, 6, 6, 2, 15, 6, 4, 3, 2, 2, 1, 1, 1, 1, 1, 8, 4, 2, 3, 3, 11, 2, 2, 5, - 2, 6, 3, 3, 58, 8, 3, 11, 6, 3, 8, 3, 3, 7, 4, 2, 8, 6, 2, 2, 14, 1, 7, 1, 20, 10, 3, 3, 26, 6, 5, 3, 3, 3, 12, 11, 10, 2, 1, 1, 41, - 4, 3, 8, 3, 4, 4, 1, 4, 3, 3, 8, 30, 17, 6, 4, 3, 13, 4, 3, 3, 5, 5, 3, 12, 2, 4, 2, 4, 4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 6, 6, 1, - 1, 1, 5, 5, 1, 10, 3, 1, 1, 1, 1, 4, 1, 2, 1, 1, 1, 166,3, 7, 4, 4, 9, 4, 4, 5, 2, 4, 30, 4, 2, 2, 2, 10, 2, 1, 4, 4, 2, 2, 2, - 14, 10, 5, 2, 2, 14, 2, 1, 21, 2, 5, 2, 2, 1, 1, 1, 1, 1, 1, 33, 3, 2, 3, 6, 4, 4, 4, 1, 7, 5, 4, 3, 2, 10, 2, 2, 3, 1, 1, 1, 1, + 1, 1, 1, 1, 5, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 24, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 2, 2, 10, 2, 5, 3, 6, 2, 2, 5, 4, 4, 2, 6, 3, 2, 1, 21, 1, 1, 12, 2, 9, 4, 3, 3, 5, 2, 1, 6, 3, 2, 3, 2, 41, 16, 6, 2, 7, 2, 1, + 1, 1, 5, 9, 3, 2, 3, 2, 2, 1, 1, 2, 1, 1, 7, 4, 3, 3, 5, 2, 1, 1, 3, 2, 2, 2, 1, 1, 1, 5, 2, 2, 2, 2, 1, 3, 2, 1, 1, 8, 1, + 1, 1, 5, 3, 11, 2, 1, 1, 1, 3, 1, 1, 2, 1, 11, 5, 4, 2, 1, 1, 1, 2, 36, 29, 3, 5, 2, 1, 1, 1, 1, 1, 4, 6, 4, 3, 11, 1, 1, 1, 1, + 5, 3, 2, 2, 1, 1, 3, 4, 2, 2, 2, 10, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 4, 3, 2, 17, 2, + 5, 4, 5, 2, 3, 11, 5, 6, 6, 15, 2, 2, 1, 3, 1, 1, 13, 3, 3, 1, 1, 29, 2, 4, 3, 2, 3, 2, 2, 12, 4, 7, 46, 30, 2, 7, 6, 3, 2, 6, 2, + 4, 2, 1, 1, 1, 3, 1, 1, 1, 2, 95, 9, 4, 3, 5, 6, 5, 5, 6, 28, 16, 13, 9, 6, 5, 4, 11, 2, 1, 4, 8, 1, 1, 1, 1, 7, 2, 1, 1, 3, 4, + 3, 3, 50, 1, 7, 3, 11, 4, 2, 4, 6, 4, 3, 3, 3, 8, 3, 3, 33, 2, 3, 4, 5, 4, 4, 1, 1, 1, 11, 2, 8, 2, 1, 1, 5, 3, 7, 3, 7, 1, 4, + 12, 4, 1, 3, 3, 21, 5, 3, 1, 13, 6, 6, 2, 2, 6, 6, 6, 1, 1, 1, 1, 1, 2, 58, 9, 3, 28, 2, 2, 3, 3, 3, 6, 6, 3, 2, 7, 2, 3, 7, 1, + 3, 3, 3, 1, 3, 2, 2, 2, 2, 2, 2, 49, 3, 3, 2, 31, 22, 20, 2, 2, 2, 2, 5, 4, 4, 3, 19, 4, 2, 3, 3, 10, 4, 5, 27, 4, 2, 3, 5, 2, 35, + 1, 7, 4, 4, 4, 2, 7, 2, 6, 5, 5, 1, 1, 1, 9, 4, 3, 4, 2, 29, 9, 9, 1, 1, 2, 2, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2, 3, 2, + 8, 2, 2, 6, 3, 3, 1, 1, 5, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 4, 2, 2, 37, 2, 4, 5, 2, 2, 2, 7, 5, 2, 4, 3, 2, 4, 3, 2, 2, 9, 1, + 6, 2, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 3, 2, 1, 1, 1, 1, 7, 2, 2, 4, 11, 4, 3, 2, 10, 4, 4, 4, 12, 4, 4, 1, 1, 6, 3, + 3, 3, 2, 15, 4, 7, 11, 6, 5, 11, 5, 3, 3, 31, 4, 8, 2, 6, 4, 4, 1, 31, 3, 15, 3, 3, 36, 3, 27, 27, 2, 3, 5, 4, 3, 2, 2, 2, 3, 99, 5, + 2, 1, 2, 1, 7, 1, 3, 2, 2, 38, 25, 3, 2, 5, 2, 1, 1, 2, 5, 4, 4, 13, 3, 2, 4, 13, 2, 2, 2, 2, 3, 5, 3, 2, 3, 6, 6, 2, 5, 1, 1, + 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 7, 1, 1, 1, 2, 2, 2, 2, 1, 1, 12, 2, 2, 2, 2, 13, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 4, 3, + 2, 1, 1, 1, 1, 1, 139,3, 2, 7, 2, 2, 3, 2, 1, 1, 1, 7, 3, 8, 2, 5, 4, 4, 4, 3, 3, 1, 1, 3, 1, 11, 3, 3, 4, 7, 2, 4, 11, 5, 17, + 4, 2, 7, 20, 2, 2, 2, 6, 3, 3, 13, 1, 3, 5, 4, 2, 10, 4, 4, 4, 1, 1, 2, 1, 1, 3, 1, 1, 1, 6, 1, 1, 1, 4, 4, 3, 2, 1, 5, 2, 2, + 2, 14, 6, 6, 6, 6, 4, 5, 5, 5, 5, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 24, 5, 1, 3, 3, 2, 4, 3, 3, 3, 3, 31, 3, 2, 2, + 5, 4, 2, 17, 9, 9, 4, 4, 3, 4, 18, 3, 5, 3, 4, 3, 2, 7, 4, 23, 8, 1, 4, 4, 4, 3, 30, 8, 6, 2, 6, 2, 6, 4, 2, 18, 2, 4, 4, 2, 3, + 4, 20, 7, 1, 5, 3, 1, 1, 1, 2, 2, 1, 1, 1, 23, 4, 2, 6, 3, 1, 1, 2, 50, 7, 2, 2, 16, 2, 2, 3, 6, 2, 3, 6, 4, 3, 3, 3, 2, 8, 5, + 2, 6, 2, 3, 2, 57, 3, 4, 1, 2, 7, 3, 3, 7, 3, 1, 7, 5, 3, 3, 5, 2, 4, 1, 1, 37, 8, 6, 2, 2, 3, 5, 2, 1, 1, 2, 12, 4, 1, 2, 2, + 21, 1, 11, 8, 3, 4, 3, 2, 2, 2, 2, 5, 5, 5, 2, 2, 2, 3, 3, 3, 61, 10, 2, 3, 1, 2, 3, 7, 9, 4, 2, 2, 2, 2, 2, 9, 2, 1, 4, 2, 3, + 2, 9, 3, 2, 9, 4, 3, 2, 7, 1, 1, 1, 1, 2, 1, 15, 8, 3, 2, 2, 2, 2, 10, 4, 6, 1, 1, 3, 4, 2, 2, 2, 8, 6, 1, 3, 8, 4, 1, 1, 5, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 9, 2, 3, 1, 2, 1, 13, 9, 4, 1, 15, 3, 8, 7, 2, 11, 3, 6, 1, 7, 3, 9, 2, 1, 2, + 2, 5, 4, 3, 12, 3, 1, 3, 1, 4, 28, 5, 3, 3, 5, 7, 1, 1, 4, 53, 6, 2, 2, 4, 10, 5, 4, 3, 2, 1, 1, 1, 3, 16, 3, 4, 3, 2, 21, 5, 3, + 2, 40, 2, 7, 4, 7, 3, 4, 7, 4, 4, 11, 4, 1, 4, 43, 4, 5, 3, 3, 3, 12, 1, 1, 1, 2, 5, 1, 1, 14, 3, 4, 2, 2, 4, 1, 1, 1, 1, 1, 1, + 1, 3, 4, 2, 1, 1, 51, 10, 6, 3, 3, 8, 6, 3, 1, 5, 2, 8, 6, 6, 2, 15, 6, 4, 3, 2, 2, 1, 1, 1, 1, 1, 8, 4, 2, 3, 3, 11, 2, 2, 5, + 2, 6, 3, 3, 58, 8, 3, 11, 6, 3, 8, 3, 3, 7, 4, 2, 8, 6, 2, 2, 14, 1, 7, 1, 20, 10, 3, 3, 26, 6, 5, 3, 3, 3, 12, 11, 10, 2, 1, 1, 41, + 4, 3, 8, 3, 4, 4, 1, 4, 3, 3, 8, 30, 17, 6, 4, 3, 13, 4, 3, 3, 5, 5, 3, 12, 2, 4, 2, 4, 4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 6, 6, 1, + 1, 1, 5, 5, 1, 10, 3, 1, 1, 1, 1, 4, 1, 2, 1, 1, 1, 166,3, 7, 4, 4, 9, 4, 4, 5, 2, 4, 30, 4, 2, 2, 2, 10, 2, 1, 4, 4, 2, 2, 2, + 14, 10, 5, 2, 2, 14, 2, 1, 21, 2, 5, 2, 2, 1, 1, 1, 1, 1, 1, 33, 3, 2, 3, 6, 4, 4, 4, 1, 7, 5, 4, 3, 2, 10, 2, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 1, 1, 1, 3, 2, 1, 1, 1, 1, 14, 2, 1, 5, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 140, - 3, 15, 3, 2, 3, 2, 5, 1, 1, 1, 3, 18, 8, 3, 3, 2, 4, 5, 4, 4, 8, 4, 4, 2, 2, 2, 2, 3, 3, 2, 9, 6, 18, 2, 2, 3, 2, 3, 4, 15, 3, - 5, 2, 2, 2, 2, 9, 5, 6, 3, 2, 19, 4, 2, 4, 2, 2, 2, 4, 3, 2, 2, 3, 10, 1, 1, 1, 3, 1, 1, 5, 2, 1, 2, 34, 1, 5, 7, 5, 1, 14, 4, - 4, 4, 2, 2, 2, 3, 3, 6, 6, 2, 1, 1, 1, 1, 53, 2, 2, 2, 2, 2, 2, 2, 47, 7, 7, 6, 5, 5, 5, 3, 3, 2, 2, 2, 30, 1, 22, 4, 1, 17, 11, + 3, 15, 3, 2, 3, 2, 5, 1, 1, 1, 3, 18, 8, 3, 3, 2, 4, 5, 4, 4, 8, 4, 4, 2, 2, 2, 2, 3, 3, 2, 9, 6, 18, 2, 2, 3, 2, 3, 4, 15, 3, + 5, 2, 2, 2, 2, 9, 5, 6, 3, 2, 19, 4, 2, 4, 2, 2, 2, 4, 3, 2, 2, 3, 10, 1, 1, 1, 3, 1, 1, 5, 2, 1, 2, 34, 1, 5, 7, 5, 1, 14, 4, + 4, 4, 2, 2, 2, 3, 3, 6, 6, 2, 1, 1, 1, 1, 53, 2, 2, 2, 2, 2, 2, 2, 47, 7, 7, 6, 5, 5, 5, 3, 3, 2, 2, 2, 30, 1, 22, 4, 1, 17, 11, 5, 4, 3, 2, 2, 1, 1, 1, 1, 22, 2, 4, 2, 2, 4, 2, 2, 1, 1, 3, 20, 1, 1, 1, 1, 1, 2, 2, 2, 2, 12, 2, 2, 6, 4, 3, 2 }; static const char CharSet[60] = "!#$%'(*+,-./0123456789:;=?@[\\]_`abcdefghijklmnopqrstuvwxyz|"; diff --git a/src/zxcvbn/zxcvbn.cpp b/src/zxcvbn/zxcvbn.c similarity index 95% rename from src/zxcvbn/zxcvbn.cpp rename to src/zxcvbn/zxcvbn.c index 52c0bb1f3..2ee61f297 100644 --- a/src/zxcvbn/zxcvbn.cpp +++ b/src/zxcvbn/zxcvbn.c @@ -1,42 +1,41 @@ /********************************************************************************** * C implementation of the zxcvbn password strength estimation method. - * Copyright (c) 2015, Tony Evans - * All rights reserved. + * Copyright (c) 2015-2017 Tony Evans * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: * - * 1. Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of the copyright holder nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * **********************************************************************************/ -#include "zxcvbn.h" +#include <zxcvbn.h> #include <ctype.h> #include <string.h> #include <stdint.h> #include <math.h> #include <float.h> +/* printf */ +#ifdef __cplusplus +#include <cstdio> +#else +#include <stdio.h> +#endif + #ifdef USE_DICT_FILE #if defined(USE_FILE_IO) || !defined(__cplusplus) #include <stdio.h> @@ -46,11 +45,9 @@ #endif /* For pre-compiled headers under windows */ -#ifdef _WIN32 -#ifndef __MINGW32__ +#ifdef _WIN32 #include "stdafx.h" #endif -#endif /* Minimum number of characters in a incrementing/decrementing sequence match */ #define MIN_SEQUENCE_LEN 3 @@ -228,13 +225,12 @@ static void AddMatchRepeats(ZxcMatch_t **Result, ZxcMatch_t *Match, const uint8_ while(MaxLen >= (Len * RepeatCount)) { - if (strncmp(reinterpret_cast<const char *>(Passwd), - reinterpret_cast<const char *>(Rpt), Len) == 0) + if (strncmp((const char *)Passwd, (const char *)Rpt, Len) == 0) { /* Found a repeat */ ZxcMatch_t *p = AllocMatch(); p->Entrpy = Match->Entrpy + log(RepeatCount); - p->Type = static_cast<ZxcTypeMatch_t>(Match->Type + MULTIPLE_MATCH); + p->Type = (ZxcTypeMatch_t)(Match->Type + MULTIPLE_MATCH); p->Length = Len * RepeatCount; p->Begin = Match->Begin; AddResult(Result, p, MaxLen); @@ -494,9 +490,8 @@ typedef struct uint8_t Leeted[sizeof L33TChr]; uint8_t UnLeet[sizeof L33TChr]; uint8_t LeetCnv[sizeof L33TCnv / LEET_NORM_MAP_SIZE + 1]; - /* uint8_t LeetChr[3]; */ uint8_t First; - uint8_t PossChars[49]; + uint8_t PossChars[CHARSET_SIZE]; } DictWork_t; /********************************************************************************** @@ -618,7 +613,7 @@ static void DictionaryEntropy(ZxcMatch_t *m, DictMatchInfo_t *Extra, const uint8 e += d; } /* Add entropy due to word's rank */ - e += log(static_cast<double>(Extra->Rank)); + e += log((double)Extra->Rank); m->Entrpy = e; } @@ -795,7 +790,7 @@ static void UserMatch(ZxcMatch_t **Result, const char *Words[], const uint8_t *P int Caps = 0; int Lowers = 0; int Leets = 0; - const uint8_t *Wrd = reinterpret_cast<const uint8_t *>(Words[Rank]); + const uint8_t *Wrd = (const uint8_t *)(Words[Rank]); const uint8_t *Pwd = Passwd; memset(Extra.Leeted, 0, sizeof Extra.Leeted); memset(Extra.UnLeet, 0, sizeof Extra.UnLeet); @@ -944,19 +939,19 @@ static const uint8_t UK_Shift[] = "!1\"2$4%5&7(9)0*8:;<,>.?/@'AaBbCcDdEeFfGgHhIi static const uint8_t US_Shift[] = "!1\"'#3$4%5&7(9)0*8:;<,>.?/@2AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz^6_-{[|\\}]~`"; -/* Neighour tables */ +/* Neighbour tables */ static const uint8_t UK_Qwerty[48*7] = { /* key, left, up-left, up-right, right, down-right, down-left */ '#', '\'',']', 0, 0, 0, 0, '\'',';', '[', ']', '#', 0, '/', - ',', 'm', 'k', 'l', '.', 0, 0, '-', '0', 0, 0, '-', 'p', 'o', - '.', ',', 'l', ';', '/', 0, 0, '/', '.', ';', '\'', 0, 0, 0, - '0', '9', 0, 0, '-', 'p', 'o', '1', '`', 0, 0, '2', 'q', 0, + ',', 'm', 'k', 'l', '.', 0, 0, '-', '0', 0, 0, '=', '[', 'p', + '.', ',', 'l', ';', '/', 0, 0, '/', '.', ';', '\'', 0, 0, 0, + '0', '9', 0, 0, '-', 'p', 'o', '1', '`', 0, 0, '2', 'q', 0, '2', '1', 0, 0, '3', 'w', 'q', '3', '2', 0, 0, '4', 'e', 'w', '4', '3', 0, 0, '5', 'r', 'e', '5', '4', 0, 0, '6', 't', 'r', '6', '5', 0, 0, '7', 'y', 't', '7', '6', 0, 0, '8', 'u', 'y', '8', '7', 0, 0, '9', 'i', 'u', '9', '8', 0, 0, '0', 'o', 'i', - ';', 'l', 'o', 'p','\'', '/', '.', '=', '-', 0, 0, 0, ']', '[', + ';', 'l', 'p', '[','\'', '/', '.', '=', '-', 0, 0, 0, ']', '[', '[', 'p', '-', '=', ']', '\'',';', '\\', 0, 0, 'a', 'z', 0, 0, ']', '[', '=', 0, 0, '#','\'', '`', 0, 0, 0, '1', 0, 0, 'a', 0, 'q', 'w', 's', 'z','\\', 'b', 'v', 'g', 'h', 'n', 0, 0, @@ -1002,7 +997,7 @@ static const uint8_t US_Qwerty[47*7] = 'x', 'z', 's', 'd', 'c', 0, 0, 'y', 't', '6', '7', 'u', 'h', 'g', 'z', 0, 'a', 's', 'x', 0, 0, }; -static const uint8_t Dvorak[48*7] = +static const uint8_t Dvorak[47*7] = { '\'', 0, '1', '2', ',', 'a', 0, ',','\'', '2', '3', '.', 'o', 'a', '-', 's', '/', '=', 0, 0, 'z', '.', ',', '3', '4', 'p', 'e', 'o', @@ -1160,9 +1155,9 @@ static void SpatialMatch(ZxcMatch_t **Result, const uint8_t *Passwd, int Start, for(CurLen = MaxLen; CurLen >= MIN_SPATIAL_LEN;CurLen = Len - 1) { Len = 0; - memset(&Extra, 0, sizeof Extra); for(k = Keyboards, Indx = 0; Indx < (sizeof Keyboards / sizeof Keyboards[0]); ++Indx, ++k) { + memset(&Extra, 0, sizeof Extra); Len = DoSptlMatch(Passwd, CurLen, k, &Extra); if (Len > 0) { @@ -1170,7 +1165,7 @@ static void SpatialMatch(ZxcMatch_t **Result, const uint8_t *Passwd, int Start, int i, j, s; double Degree, Entropy; ZxcMatch_t *p; - Degree = (k->NumNear-1) - static_cast<double>(k->NumBlank) / static_cast<double>(k->NumKeys); + Degree = (k->NumNear-1) - (double)k->NumBlank / (double)k->NumKeys; s = k->NumKeys; if (k->Shifts) s *= 2; @@ -1213,7 +1208,6 @@ static void SpatialMatch(ZxcMatch_t **Result, const uint8_t *Passwd, int Start, p->Length = Len; AddMatchRepeats(Result, p, Passwd, MaxLen); AddResult(Result, p, MaxLen); - break; } } } @@ -1406,13 +1400,13 @@ static void RepeatMatch(ZxcMatch_t **Result, const uint8_t *Passwd, int Start, i int RepeatCount = 2; while(MaxLen >= (Len * RepeatCount)) { - if (strncmp(reinterpret_cast<const char *>(Passwd), reinterpret_cast<const char *>(Rpt), Len) == 0) + if (strncmp((const char *)Passwd, (const char *)Rpt, Len) == 0) { /* Found a repeat */ int c = Cardinality(Passwd, Len); ZxcMatch_t *p = AllocMatch(); - p->Entrpy = log(static_cast<double>(c)) * Len + log(RepeatCount); - p->Type = static_cast<ZxcTypeMatch_t>(BRUTE_MATCH + MULTIPLE_MATCH); + p->Entrpy = log((double)c) * Len + log(RepeatCount); + p->Type = (ZxcTypeMatch_t)(BRUTE_MATCH + MULTIPLE_MATCH); p->Length = Len * RepeatCount; p->Begin = Start; AddResult(Result, p, MaxLen); @@ -1486,7 +1480,7 @@ static void SequenceMatch(ZxcMatch_t **Result, const uint8_t *Passwd, int Start, Next = Passwd[0] + Dir; if (IsDigits && (Dir > 0) && (Next == ('9' + 1)) && (Passwd[1] == '0')) { - /* Incrementing digits, consider '0' to be same as a 'ten' character */ + /* Incrementing digits, consider '0' to be same as a 'ten' character */ ++Len; ++Passwd; break; @@ -1495,8 +1489,9 @@ static void SequenceMatch(ZxcMatch_t **Result, const uint8_t *Passwd, int Start, { ++Len; ++Passwd; + break; } - else if ((Next > SetHigh) || (Next < SetLow) || (Passwd[1] != Next)) + if ((Next > SetHigh) || (Next < SetLow) || (Passwd[1] != Next)) break; ++Len; ++Passwd; @@ -1528,7 +1523,7 @@ static void SequenceMatch(ZxcMatch_t **Result, const uint8_t *Passwd, int Start, p->Type = SEQUENCE_MATCH; p->Begin = Start; p->Length = i; - p->Entrpy = e + log(static_cast<double>(i)); + p->Entrpy = e + log((double)i); AddMatchRepeats(Result, p, Pwd, MaxLen); AddResult(Result, p, MaxLen); } @@ -1557,7 +1552,7 @@ static void SequenceMatch(ZxcMatch_t **Result, const uint8_t *Passwd, int Start, * * Dijkstra's algorithm finds the combination of these part matches (or paths) * which gives the lowest entropy (or smallest distance) from begining to end - * of the password. + * of the password. */ /* Struct to hold the data of a node (imaginary point between password characters) */ @@ -1579,13 +1574,13 @@ double ZxcvbnMatch(const char *Pwd, const char *UserDict[], ZxcMatch_t **Info) Node_t *Np; double e; int Len = strlen(Pwd); - const uint8_t *Passwd = reinterpret_cast<const uint8_t *>(Pwd); + const uint8_t *Passwd = (const uint8_t *)Pwd; uint8_t *RevPwd; /* Create the paths */ Node_t *Nodes = MallocFn(Node_t, Len+1); memset(Nodes, 0, (Len+1) * sizeof *Nodes); i = Cardinality(Passwd, Len); - e = log(static_cast<double>(i)); + e = log((double)i); /* Do matching for all parts of the password */ for(i = 0; i < Len; ++i) diff --git a/src/zxcvbn/zxcvbn.h b/src/zxcvbn/zxcvbn.h index 796d6b47b..9500c7a95 100644 --- a/src/zxcvbn/zxcvbn.h +++ b/src/zxcvbn/zxcvbn.h @@ -2,34 +2,26 @@ #define ZXCVBN_H_F98183CE2A01_INCLUDED /********************************************************************************** * C implementation of the zxcvbn password strength estimation method. - * Copyright (c) 2015, Tony Evans - * All rights reserved. + * Copyright (c) 2015-2017 Tony Evans * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: * - * 1. Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. * - * 3. Neither the name of the copyright holder nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * **********************************************************************************/ /* If this is defined, the dictiononary data is read from file. When undefined */ diff --git a/tests/gui/TestGui.cpp b/tests/gui/TestGui.cpp index 2e11fcf59..dd201c3de 100644 --- a/tests/gui/TestGui.cpp +++ b/tests/gui/TestGui.cpp @@ -545,15 +545,13 @@ void TestGui::testPasswordEntryEntropy() editNewPassword->setText(""); QTest::keyClicks(editNewPassword, "YQC3kbXbjC652dTDH"); - QCOMPARE(entropyLabel->text(), QString("Entropy: 96.07 bit")); + QCOMPARE(entropyLabel->text(), QString("Entropy: 95.83 bit")); QCOMPARE(strengthLabel->text(), QString("Password Quality: Good")); editNewPassword->setText(""); QTest::keyClicks(editNewPassword, "Bs5ZFfthWzR8DGFEjaCM6bGqhmCT4km"); QCOMPARE(entropyLabel->text(), QString("Entropy: 174.59 bit")); QCOMPARE(strengthLabel->text(), QString("Password Quality: Excellent")); - - // We are done } void TestGui::testDicewareEntryEntropy() From 0b54710734a5ef704cd6a78d894cf953c1dc9814 Mon Sep 17 00:00:00 2001 From: Christian Kieschnick <christian.kieschnick@hicknhack-software.com> Date: Tue, 6 Feb 2018 16:37:06 +0100 Subject: [PATCH 364/402] Introduced missing CustomData on Group and Entry Introduce missing CustomData-attributes of KDBX4 format to allow storing of plugin data for groups and entries - adopt Metadata to use the same storage mechanism Add simple view for CustomData as part of EditWidgetProperties Tracking of CustomData-Modification using SIGNAL-SLOT update-mechanism --- src/CMakeLists.txt | 1 + src/core/CustomData.cpp | 156 ++++++++++++++++++++++++ src/core/CustomData.h | 64 ++++++++++ src/core/Entry.cpp | 15 +++ src/core/Entry.h | 5 + src/core/Group.cpp | 27 +++-- src/core/Group.h | 9 +- src/core/Metadata.cpp | 32 ++--- src/core/Metadata.h | 8 +- src/format/KdbxXmlReader.cpp | 19 ++- src/format/KdbxXmlReader.h | 4 +- src/format/KdbxXmlWriter.cpp | 18 ++- src/format/KdbxXmlWriter.h | 2 +- src/gui/EditWidgetProperties.cpp | 44 ++++++- src/gui/EditWidgetProperties.h | 15 ++- src/gui/EditWidgetProperties.ui | 193 +++++++++++++++++++----------- src/gui/entry/EditEntryWidget.cpp | 3 +- src/gui/group/EditGroupWidget.cpp | 3 + 18 files changed, 500 insertions(+), 118 deletions(-) create mode 100644 src/core/CustomData.cpp create mode 100644 src/core/CustomData.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b2444faa5..f9e562dff 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -42,6 +42,7 @@ set(keepassx_SOURCES core/AutoTypeMatch.cpp core/Config.cpp core/CsvParser.cpp + core/CustomData.cpp core/Database.cpp core/DatabaseIcons.cpp core/Entry.cpp diff --git a/src/core/CustomData.cpp b/src/core/CustomData.cpp new file mode 100644 index 000000000..cb783f3a7 --- /dev/null +++ b/src/core/CustomData.cpp @@ -0,0 +1,156 @@ +/* + * Copyright (C) 2012 Felix Geyer <debfx@fobos.de> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "CustomData.h" + +CustomData::CustomData(QObject* parent) + : QObject(parent) +{ +} + +QList<QString> CustomData::keys() const +{ + return m_data.keys(); +} + +bool CustomData::hasKey(const QString& key) const +{ + return m_data.contains(key); +} + +QString CustomData::value(const QString& key) const +{ + return m_data.value(key); +} + +bool CustomData::contains(const QString& key) const +{ + return m_data.contains(key); +} + +bool CustomData::containsValue(const QString& value) const +{ + return m_data.values().contains(value); +} + +void CustomData::set(const QString& key, const QString& value) +{ + bool emitModified = false; + + bool addAttribute = !m_data.contains(key); + bool changeValue = !addAttribute && (m_data.value(key) != value); + + if (addAttribute ) { + emit aboutToBeAdded(key); + } + + if (addAttribute || changeValue) { + m_data.insert(key, value); + emitModified = true; + } + + if (emitModified) { + emit modified(); + } + + if (addAttribute) { + emit added(key); + } +} + +void CustomData::remove(const QString& key) +{ + emit aboutToBeRemoved(key); + + m_data.remove(key); + + emit removed(key); + emit modified(); +} + +void CustomData::rename(const QString& oldKey, const QString& newKey) +{ + if (!m_data.contains(oldKey)) { + Q_ASSERT(false); + return; + } + + if (m_data.contains(newKey)) { + Q_ASSERT(false); + return; + } + + QString data = value(oldKey); + + emit aboutToRename(oldKey, newKey); + + m_data.remove(oldKey); + m_data.insert(newKey, data); + + emit modified(); + emit renamed(oldKey, newKey); +} + +void CustomData::copyDataFrom(const CustomData* other) +{ + if (*this != *other) { + emit aboutToBeReset(); + + m_data = other->m_data; + + emit reset(); + emit modified(); + } +} + +bool CustomData::operator==(const CustomData& other) const +{ + return (m_data == other.m_data); +} + +bool CustomData::operator!=(const CustomData& other) const +{ + return (m_data != other.m_data); +} + +void CustomData::clear() +{ + emit aboutToBeReset(); + + m_data.clear(); + + emit reset(); + emit modified(); +} + +bool CustomData::isEmpty() const +{ + return m_data.isEmpty(); +} + +int CustomData::dataSize() +{ + int size = 0; + + QHashIterator<QString, QString> i(m_data); + while (i.hasNext()) { + i.next(); + size += i.key().toUtf8().size() + i.value().toUtf8().size(); + } + return size; +} diff --git a/src/core/CustomData.h b/src/core/CustomData.h new file mode 100644 index 000000000..722d9bd28 --- /dev/null +++ b/src/core/CustomData.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2012 Felix Geyer <debfx@fobos.de> + * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef KEEPASSX_CUSTOMDATA_H +#define KEEPASSX_CUSTOMDATA_H + +#include <QMap> +#include <QObject> +#include <QSet> +#include <QStringList> + +class CustomData : public QObject +{ + Q_OBJECT + +public: + explicit CustomData(QObject* parent = nullptr); + QList<QString> keys() const; + bool hasKey(const QString& key) const; + QString value(const QString& key) const; + bool contains(const QString& key) const; + bool containsValue(const QString& value) const; + void set(const QString& key, const QString& value); + void remove(const QString& key); + void rename(const QString& oldKey, const QString& newKey); + void clear(); + bool isEmpty() const; + int dataSize(); + void copyDataFrom(const CustomData* other); + bool operator==(const CustomData& other) const; + bool operator!=(const CustomData& other) const; + + +signals: + void modified(); + void aboutToBeAdded(const QString& key); + void added(const QString& key); + void aboutToBeRemoved(const QString& key); + void removed(const QString& key); + void aboutToRename(const QString& oldKey, const QString& newKey); + void renamed(const QString& oldKey, const QString& newKey); + void aboutToBeReset(); + void reset(); + +private: + QHash<QString, QString> m_data; +}; + +#endif // KEEPASSX_CUSTOMDATA_H diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index 1dfc614e5..721891d19 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -37,6 +37,7 @@ Entry::Entry() : m_attributes(new EntryAttributes(this)) , m_attachments(new EntryAttachments(this)) , m_autoTypeAssociations(new AutoTypeAssociations(this)) + , m_customData(new CustomData(this)) , m_tmpHistoryItem(nullptr) , m_modifiedSinceBegin(false) , m_updateTimeinfo(true) @@ -52,6 +53,7 @@ Entry::Entry() connect(m_attributes, SIGNAL(defaultKeyModified()), SLOT(emitDataChanged())); connect(m_attachments, SIGNAL(modified()), this, SIGNAL(modified())); connect(m_autoTypeAssociations, SIGNAL(modified()), SIGNAL(modified())); + connect(m_customData, SIGNAL(modified()), this, SIGNAL(modified())); connect(this, SIGNAL(modified()), SLOT(updateTimeinfo())); connect(this, SIGNAL(modified()), SLOT(updateModifiedSinceBegin())); @@ -340,6 +342,16 @@ const EntryAttachments* Entry::attachments() const return m_attachments; } +CustomData *Entry::customData() +{ + return m_customData; +} + +const CustomData *Entry::customData() const +{ + return m_customData; +} + bool Entry::hasTotp() const { return m_attributes->hasKey("TOTP Seed") || m_attributes->hasKey("otp"); @@ -606,6 +618,7 @@ void Entry::truncateHistory() size += historyItem->attributes()->attributesSize(); size += historyItem->autoTypeAssociations()->associationsSize(); size += historyItem->attachments()->attachmentsSize(); + size += customData()->dataSize(); const QStringList tags = historyItem->tags().split(delimiter, QString::SkipEmptyParts); for (const QString& tag : tags) { size += tag.toUtf8().size(); @@ -632,6 +645,7 @@ Entry* Entry::clone(CloneFlags flags) const entry->m_uuid = m_uuid; } entry->m_data = m_data; + entry->m_customData->copyDataFrom(m_customData); entry->m_attributes->copyDataFrom(m_attributes); entry->m_attachments->copyDataFrom(m_attachments); @@ -676,6 +690,7 @@ void Entry::copyDataFrom(const Entry* other) { setUpdateTimeinfo(false); m_data = other->m_data; + m_customData->copyDataFrom(other->m_customData); m_attributes->copyDataFrom(other->m_attributes); m_attachments->copyDataFrom(other->m_attachments); m_autoTypeAssociations->copyDataFrom(other->m_autoTypeAssociations); diff --git a/src/core/Entry.h b/src/core/Entry.h index 8579f9533..ba8c4edd8 100644 --- a/src/core/Entry.h +++ b/src/core/Entry.h @@ -28,6 +28,7 @@ #include <QUrl> #include "core/AutoTypeAssociations.h" +#include "core/CustomData.h" #include "core/EntryAttachments.h" #include "core/EntryAttributes.h" #include "core/TimeInfo.h" @@ -107,6 +108,8 @@ public: const EntryAttributes* attributes() const; EntryAttachments* attachments(); const EntryAttachments* attachments() const; + CustomData *customData(); + const CustomData *customData() const; static const int DefaultIconNumber; static const int ResolveMaximumDepth; @@ -232,6 +235,8 @@ private: EntryAttachments* const m_attachments; AutoTypeAssociations* const m_autoTypeAssociations; + CustomData* const m_customData; + QList<Entry*> m_history; Entry* m_tmpHistoryItem; bool m_modifiedSinceBegin; diff --git a/src/core/Group.cpp b/src/core/Group.cpp index 51b24c199..61a955b8d 100644 --- a/src/core/Group.cpp +++ b/src/core/Group.cpp @@ -33,13 +33,17 @@ Entry::CloneFlags Group::DefaultEntryCloneFlags = static_cast<Entry::CloneFlags> Entry::CloneNewUuid | Entry::CloneResetTimeInfo); Group::Group() - : m_updateTimeinfo(true) + : m_customData(new CustomData(this)) + , m_updateTimeinfo(true) { m_data.iconNumber = DefaultIconNumber; m_data.isExpanded = true; m_data.autoTypeEnabled = Inherit; m_data.searchingEnabled = Inherit; m_data.mergeMode = ModeInherit; + + connect(m_customData, SIGNAL(modified()), this, SIGNAL(modified())); + connect(this, SIGNAL(modified()), SLOT(updateTimeinfo())); } Group::~Group() @@ -80,7 +84,6 @@ Group* Group::createRecycleBin() template <class P, class V> inline bool Group::set(P& property, const V& value) { if (property != value) { property = value; - updateTimeinfo(); emit modified(); return true; } else { @@ -251,6 +254,16 @@ bool Group::isExpired() const return m_data.timeInfo.expires() && m_data.timeInfo.expiryTime() < QDateTime::currentDateTimeUtc(); } +CustomData *Group::customData() +{ + return m_customData; +} + +const CustomData *Group::customData() const +{ + return m_customData; +} + void Group::setUuid(const Uuid& uuid) { set(m_uuid, uuid); @@ -275,8 +288,6 @@ void Group::setIcon(int iconNumber) if (m_data.iconNumber != iconNumber || !m_data.customIcon.isNull()) { m_data.iconNumber = iconNumber; m_data.customIcon = Uuid(); - - updateTimeinfo(); emit modified(); emit dataChanged(this); } @@ -289,8 +300,6 @@ void Group::setIcon(const Uuid& uuid) if (m_data.customIcon != uuid) { m_data.customIcon = uuid; m_data.iconNumber = 0; - - updateTimeinfo(); emit modified(); emit dataChanged(this); } @@ -305,8 +314,8 @@ void Group::setExpanded(bool expanded) { if (m_data.isExpanded != expanded) { m_data.isExpanded = expanded; - updateTimeinfo(); if (config()->get("IgnoreGroupExpansion").toBool()) { + updateTimeinfo(); return; } emit modified(); @@ -337,7 +346,6 @@ void Group::setExpires(bool value) { if (m_data.timeInfo.expires() != value) { m_data.timeInfo.setExpires(value); - updateTimeinfo(); emit modified(); } } @@ -346,7 +354,6 @@ void Group::setExpiryTime(const QDateTime& dateTime) { if (m_data.timeInfo.expiryTime() != dateTime) { m_data.timeInfo.setExpiryTime(dateTime); - updateTimeinfo(); emit modified(); } } @@ -768,6 +775,7 @@ Group* Group::clone(Entry::CloneFlags entryFlags, Group::CloneFlags groupFlags) } clonedGroup->m_data = m_data; + clonedGroup->m_customData->copyDataFrom(m_customData); if (groupFlags & Group::CloneIncludeEntries) { const QList<Entry*> entryList = entries(); @@ -799,6 +807,7 @@ Group* Group::clone(Entry::CloneFlags entryFlags, Group::CloneFlags groupFlags) void Group::copyDataFrom(const Group* other) { m_data = other->m_data; + m_customData->copyDataFrom(other->m_customData); m_lastTopVisibleEntry = other->m_lastTopVisibleEntry; } diff --git a/src/core/Group.h b/src/core/Group.h index b1654a236..f49b77211 100644 --- a/src/core/Group.h +++ b/src/core/Group.h @@ -26,6 +26,7 @@ #include "core/Database.h" #include "core/Entry.h" +#include "core/CustomData.h" #include "core/TimeInfo.h" #include "core/Uuid.h" @@ -83,6 +84,8 @@ public: bool resolveAutoTypeEnabled() const; Entry* lastTopVisibleEntry() const; bool isExpired() const; + CustomData *customData(); + const CustomData *customData() const; static const int DefaultIconNumber; static const int RecycleBinIconNumber; @@ -164,6 +167,9 @@ signals: void modified(); +private slots: + void updateTimeinfo(); + private: template <class P, class V> bool set(P& property, const V& value); @@ -177,7 +183,6 @@ private: void recSetDatabase(Database* db); void cleanupParent(); void recCreateDelObjects(); - void updateTimeinfo(); QPointer<Database> m_db; Uuid m_uuid; @@ -186,6 +191,8 @@ private: QList<Group*> m_children; QList<Entry*> m_entries; + CustomData *const m_customData; + QPointer<Group> m_parent; bool m_updateTimeinfo; diff --git a/src/core/Metadata.cpp b/src/core/Metadata.cpp index ab56dab7f..4c41c02a5 100644 --- a/src/core/Metadata.cpp +++ b/src/core/Metadata.cpp @@ -27,6 +27,7 @@ const int Metadata::DefaultHistoryMaxSize = 6 * 1024 * 1024; Metadata::Metadata(QObject* parent) : QObject(parent) + , m_customData(new CustomData(this)) , m_updateDatetime(true) { m_data.generator = "KeePassXC"; @@ -50,6 +51,8 @@ Metadata::Metadata(QObject* parent) m_entryTemplatesGroupChanged = now; m_masterKeyChanged = now; m_settingsChanged = now; + + connect(m_customData, SIGNAL(modified()), this, SIGNAL(modified())); } template <class P, class V> bool Metadata::set(P& property, const V& value) @@ -291,9 +294,14 @@ int Metadata::historyMaxSize() const return m_data.historyMaxSize; } -QHash<QString, QString> Metadata::customFields() const +CustomData *Metadata::customData() { - return m_customFields; + return m_customData; +} + +const CustomData *Metadata::customData() const +{ + return m_customData; } void Metadata::setGenerator(const QString& value) @@ -511,27 +519,13 @@ void Metadata::setHistoryMaxSize(int value) set(m_data.historyMaxSize, value); } -void Metadata::addCustomField(const QString& key, const QString& value) +QDateTime Metadata::settingsChanged() const { - Q_ASSERT(!m_customFields.contains(key)); - - m_customFields.insert(key, value); - emit modified(); -} - -void Metadata::removeCustomField(const QString& key) -{ - Q_ASSERT(m_customFields.contains(key)); - - m_customFields.remove(key); - emit modified(); -} - -QDateTime Metadata::settingsChanged() const { return m_settingsChanged; } -void Metadata::setSettingsChanged(const QDateTime& value) { +void Metadata::setSettingsChanged(const QDateTime& value) +{ Q_ASSERT(value.timeSpec() == Qt::UTC); m_settingsChanged = value; } diff --git a/src/core/Metadata.h b/src/core/Metadata.h index 7791b0387..a6387dfbf 100644 --- a/src/core/Metadata.h +++ b/src/core/Metadata.h @@ -27,6 +27,7 @@ #include <QPointer> #include "core/Uuid.h" +#include "core/CustomData.h" class Database; class Group; @@ -97,7 +98,8 @@ public: int masterKeyChangeForce() const; int historyMaxItems() const; int historyMaxSize() const; - QHash<QString, QString> customFields() const; + CustomData *customData(); + const CustomData *customData() const; static const int DefaultHistoryMaxItems; static const int DefaultHistoryMaxSize; @@ -134,8 +136,6 @@ public: void setMasterKeyChangeForce(int value); void setHistoryMaxItems(int value); void setHistoryMaxSize(int value); - void addCustomField(const QString& key, const QString& value); - void removeCustomField(const QString& key); void setUpdateDatetime(bool value); /* * Copy all attributes from other except: @@ -175,7 +175,7 @@ private: QDateTime m_masterKeyChanged; QDateTime m_settingsChanged; - QHash<QString, QString> m_customFields; + CustomData *const m_customData; bool m_updateDatetime; }; diff --git a/src/format/KdbxXmlReader.cpp b/src/format/KdbxXmlReader.cpp index f30dc64b4..7aed40143 100644 --- a/src/format/KdbxXmlReader.cpp +++ b/src/format/KdbxXmlReader.cpp @@ -295,7 +295,7 @@ void KdbxXmlReader::parseMeta() } else if (m_xml.name() == "Binaries") { parseBinaries(); } else if (m_xml.name() == "CustomData") { - parseCustomData(); + parseCustomData(m_meta->customData()); } else if (m_xml.name() == "SettingsChanged") { m_meta->setSettingsChanged(readDateTime()); } else { @@ -397,20 +397,20 @@ void KdbxXmlReader::parseBinaries() } } -void KdbxXmlReader::parseCustomData() +void KdbxXmlReader::parseCustomData(CustomData *customData) { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "CustomData"); while (!m_xml.hasError() && m_xml.readNextStartElement()) { if (m_xml.name() == "Item") { - parseCustomDataItem(); + parseCustomDataItem(customData); continue; } skipCurrentElement(); } } -void KdbxXmlReader::parseCustomDataItem() +void KdbxXmlReader::parseCustomDataItem(CustomData *customData) { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Item"); @@ -432,7 +432,7 @@ void KdbxXmlReader::parseCustomDataItem() } if (keySet && valueSet) { - m_meta->addCustomField(key, value); + customData->set(key, value); return; } @@ -583,6 +583,10 @@ Group* KdbxXmlReader::parseGroup() } continue; } + if (m_xml.name() == "CustomData") { + parseCustomData(group->customData()); + continue; + } skipCurrentElement(); } @@ -744,7 +748,10 @@ Entry* KdbxXmlReader::parseEntry(bool history) } continue; } - + if (m_xml.name() == "CustomData" ){ + parseCustomData(entry->customData()); + continue; + } skipCurrentElement(); } diff --git a/src/format/KdbxXmlReader.h b/src/format/KdbxXmlReader.h index 7ec592eb4..e94bfd4d3 100644 --- a/src/format/KdbxXmlReader.h +++ b/src/format/KdbxXmlReader.h @@ -66,8 +66,8 @@ protected: virtual void parseCustomIcons(); virtual void parseIcon(); virtual void parseBinaries(); - virtual void parseCustomData(); - virtual void parseCustomDataItem(); + virtual void parseCustomData(CustomData *customData); + virtual void parseCustomDataItem(CustomData *customData); virtual bool parseRoot(); virtual Group* parseGroup(); virtual void parseDeletedObjects(); diff --git a/src/format/KdbxXmlWriter.cpp b/src/format/KdbxXmlWriter.cpp index 4fe202a9f..07953af35 100644 --- a/src/format/KdbxXmlWriter.cpp +++ b/src/format/KdbxXmlWriter.cpp @@ -129,7 +129,7 @@ void KdbxXmlWriter::writeMetadata() if (m_kdbxVersion < KeePass2::FILE_VERSION_4) { writeBinaries(); } - writeCustomData(); + writeCustomData(m_meta->customData()); m_xml.writeEndElement(); } @@ -218,14 +218,13 @@ void KdbxXmlWriter::writeBinaries() m_xml.writeEndElement(); } -void KdbxXmlWriter::writeCustomData() +void KdbxXmlWriter::writeCustomData(const CustomData *customData) { m_xml.writeStartElement("CustomData"); - QHash<QString, QString> customFields = m_meta->customFields(); - const QList<QString> keyList = customFields.keys(); + const QList<QString> keyList = customData->keys(); for (const QString& key : keyList) { - writeCustomDataItem(key, customFields.value(key)); + writeCustomDataItem(key, customData->value(key)); } m_xml.writeEndElement(); @@ -277,6 +276,10 @@ void KdbxXmlWriter::writeGroup(const Group* group) writeUuid("LastTopVisibleEntry", group->lastTopVisibleEntry()); + if (!group->customData()->isEmpty()){ + writeCustomData(group->customData()); + } + const QList<Entry*>& entryList = group->entries(); for (const Entry* entry : entryList) { writeEntry(entry); @@ -401,6 +404,11 @@ void KdbxXmlWriter::writeEntry(const Entry* entry) } writeAutoType(entry); + + if (!entry->customData()->isEmpty()){ + writeCustomData(entry->customData()); + } + // write history only for entries that are not history items if (entry->parent()) { writeEntryHistory(entry); diff --git a/src/format/KdbxXmlWriter.h b/src/format/KdbxXmlWriter.h index 6c1bd1d0b..ef77ffd9e 100644 --- a/src/format/KdbxXmlWriter.h +++ b/src/format/KdbxXmlWriter.h @@ -51,7 +51,7 @@ private: void writeCustomIcons(); void writeIcon(const Uuid& uuid, const QImage& icon); void writeBinaries(); - void writeCustomData(); + void writeCustomData(const CustomData *customData); void writeCustomDataItem(const QString& key, const QString& value); void writeRoot(); void writeGroup(const Group* group); diff --git a/src/gui/EditWidgetProperties.cpp b/src/gui/EditWidgetProperties.cpp index a278d6cb3..d59f17b32 100644 --- a/src/gui/EditWidgetProperties.cpp +++ b/src/gui/EditWidgetProperties.cpp @@ -18,20 +18,27 @@ #include "EditWidgetProperties.h" #include "ui_EditWidgetProperties.h" +#include <QStandardItemModel> + EditWidgetProperties::EditWidgetProperties(QWidget* parent) : QWidget(parent) , m_ui(new Ui::EditWidgetProperties()) + , m_customData(new CustomData(this)) + , m_customDataModel(new QStandardItemModel(this)) { m_ui->setupUi(this); + m_ui->customDataTable->setModel(m_customDataModel); + + this->connect( m_ui->removeCustomDataButton, SIGNAL(clicked()), SLOT(removeSelectedPluginData())); } EditWidgetProperties::~EditWidgetProperties() { } -void EditWidgetProperties::setFields(TimeInfo timeInfo, Uuid uuid) +void EditWidgetProperties::setFields(const TimeInfo &timeInfo, const Uuid &uuid) { - QString timeFormat("d MMM yyyy HH:mm:ss"); + static const QString timeFormat("d MMM yyyy HH:mm:ss"); m_ui->modifiedEdit->setText( timeInfo.lastModificationTime().toLocalTime().toString(timeFormat)); m_ui->createdEdit->setText( @@ -40,3 +47,36 @@ void EditWidgetProperties::setFields(TimeInfo timeInfo, Uuid uuid) timeInfo.lastAccessTime().toLocalTime().toString(timeFormat)); m_ui->uuidEdit->setText(uuid.toHex()); } + +void EditWidgetProperties::setCustomData(const CustomData *customData) +{ + Q_ASSERT(customData != nullptr); + m_customData->copyDataFrom(customData); + + this->updateModel(); +} + +const CustomData *EditWidgetProperties::customData() const +{ + return m_customData; +} + +void EditWidgetProperties::removeSelectedPluginData() +{ + const QItemSelectionModel *pSelectionModel = m_ui->customDataTable->selectionModel(); + if (pSelectionModel){ + for( const QModelIndex& index : pSelectionModel->selectedRows(0) ){ + const QString key = index.data().toString(); + m_customData->remove(key); + } + this->updateModel(); + } +} + +void EditWidgetProperties::updateModel() +{ + m_customDataModel->clear(); + for( const QString& key : m_customData->keys() ){ + m_customDataModel->appendRow(QList<QStandardItem*>() << new QStandardItem( key ) << new QStandardItem( m_customData->value( key ) )); + } +} diff --git a/src/gui/EditWidgetProperties.h b/src/gui/EditWidgetProperties.h index 4a2c05917..dbcfac698 100644 --- a/src/gui/EditWidgetProperties.h +++ b/src/gui/EditWidgetProperties.h @@ -18,8 +18,11 @@ #ifndef KEEPASSX_EDITWIDGETPROPERTIES_H #define KEEPASSX_EDITWIDGETPROPERTIES_H +#include <QStandardItemModel> +#include <QPointer> #include <QWidget> +#include "core/CustomData.h" #include "core/TimeInfo.h" #include "core/Uuid.h" @@ -35,11 +38,21 @@ public: explicit EditWidgetProperties(QWidget* parent = nullptr); ~EditWidgetProperties(); - void setFields(TimeInfo timeInfo, Uuid uuid); + void setFields(const TimeInfo &timeInfo, const Uuid &uuid); + void setCustomData(const CustomData *customData); + + const CustomData *customData() const; + +private slots: + void removeSelectedPluginData(); private: + void updateModel(); + const QScopedPointer<Ui::EditWidgetProperties> m_ui; + QPointer<CustomData> m_customData; + QPointer<QStandardItemModel> m_customDataModel; Q_DISABLE_COPY(EditWidgetProperties) }; diff --git a/src/gui/EditWidgetProperties.ui b/src/gui/EditWidgetProperties.ui index bf49cc925..269134f65 100644 --- a/src/gui/EditWidgetProperties.ui +++ b/src/gui/EditWidgetProperties.ui @@ -10,9 +10,12 @@ <height>328</height> </rect> </property> - <layout class="QFormLayout" name="formLayout"> - <property name="fieldGrowthPolicy"> - <enum>QFormLayout::ExpandingFieldsGrow</enum> + <layout class="QVBoxLayout" name="verticalLayout" stretch="0,0"> + <property name="spacing"> + <number>5</number> + </property> + <property name="leftMargin"> + <number>0</number> </property> <property name="topMargin"> <number>0</number> @@ -23,72 +26,128 @@ <property name="bottomMargin"> <number>0</number> </property> - <item row="1" column="1"> - <widget class="QLineEdit" name="createdEdit"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="readOnly"> - <bool>true</bool> - </property> - </widget> + <item> + <layout class="QFormLayout" name="formLayout_2"> + <item row="1" column="0"> + <widget class="QLabel" name="labelCreated"> + <property name="text"> + <string>Created:</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLineEdit" name="createdEdit"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="labelModfied"> + <property name="text"> + <string>Modified:</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLineEdit" name="modifiedEdit"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="labelAccessed"> + <property name="text"> + <string>Accessed:</string> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QLineEdit" name="accessedEdit"> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="4" column="0"> + <widget class="QLabel" name="labelUuid"> + <property name="text"> + <string>Uuid:</string> + </property> + </widget> + </item> + <item row="4" column="1"> + <widget class="QLineEdit" name="uuidEdit"> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> </item> - <item row="2" column="1"> - <widget class="QLineEdit" name="modifiedEdit"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="readOnly"> - <bool>true</bool> - </property> - </widget> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="label_2"> - <property name="text"> - <string>Created:</string> - </property> - </widget> - </item> - <item row="2" column="0"> - <widget class="QLabel" name="label"> - <property name="text"> - <string>Modified:</string> - </property> - </widget> - </item> - <item row="3" column="0"> - <widget class="QLabel" name="label_3"> - <property name="text"> - <string>Accessed:</string> - </property> - </widget> - </item> - <item row="3" column="1"> - <widget class="QLineEdit" name="accessedEdit"> - <property name="readOnly"> - <bool>true</bool> - </property> - </widget> - </item> - <item row="4" column="0"> - <widget class="QLabel" name="label_4"> - <property name="text"> - <string>Uuid:</string> - </property> - </widget> - </item> - <item row="4" column="1"> - <widget class="QLineEdit" name="uuidEdit"> - <property name="readOnly"> - <bool>true</bool> + <item> + <widget class="QGroupBox" name="groupBox"> + <property name="title"> + <string>Plugin Data</string> </property> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QTableView" name="customDataTable"> + <property name="editTriggers"> + <set>QAbstractItemView::NoEditTriggers</set> + </property> + <property name="selectionBehavior"> + <enum>QAbstractItemView::SelectRows</enum> + </property> + <attribute name="horizontalHeaderVisible"> + <bool>false</bool> + </attribute> + <attribute name="horizontalHeaderStretchLastSection"> + <bool>true</bool> + </attribute> + <attribute name="verticalHeaderVisible"> + <bool>false</bool> + </attribute> + </widget> + </item> + <item> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <widget class="QPushButton" name="removeCustomDataButton"> + <property name="text"> + <string>Remove</string> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + </layout> </widget> </item> </layout> diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index c30557574..ac9681801 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -666,6 +666,7 @@ void EditEntryWidget::setForms(const Entry* entry, bool restore) #endif m_editWidgetProperties->setFields(entry->timeInfo(), entry->uuid()); + m_editWidgetProperties->setCustomData(entry->customData()); if (!m_history && !restore) { m_historyModel->setEntries(entry->historyItems()); @@ -771,7 +772,7 @@ void EditEntryWidget::updateEntryData(Entry* entry) const { entry->attributes()->copyCustomKeysFrom(m_entryAttributes); entry->attachments()->copyDataFrom(m_advancedUi->attachmentsWidget->entryAttachments()); - + entry->customData()->copyDataFrom(m_editWidgetProperties->customData()); entry->setTitle(m_mainUi->titleEdit->text()); entry->setUsername(m_mainUi->usernameEdit->text()); entry->setUrl(m_mainUi->urlEdit->text()); diff --git a/src/gui/group/EditGroupWidget.cpp b/src/gui/group/EditGroupWidget.cpp index da9875fb4..9ffd31a5e 100644 --- a/src/gui/group/EditGroupWidget.cpp +++ b/src/gui/group/EditGroupWidget.cpp @@ -95,6 +95,7 @@ void EditGroupWidget::loadGroup(Group* group, bool create, Database* database) m_editGroupWidgetIcons->load(group->uuid(), database, iconStruct); m_editWidgetProperties->setFields(group->timeInfo(), group->uuid()); + m_editWidgetProperties->setCustomData(group->customData()); setCurrentPage(0); @@ -118,6 +119,8 @@ void EditGroupWidget::apply() m_group->setSearchingEnabled(triStateFromIndex(m_mainUi->searchComboBox->currentIndex())); m_group->setAutoTypeEnabled(triStateFromIndex(m_mainUi->autotypeComboBox->currentIndex())); + m_group->customData()->copyDataFrom(m_editWidgetProperties->customData()); + if (m_mainUi->autoTypeSequenceInherit->isChecked()) { m_group->setDefaultAutoTypeSequence(QString()); } From 114f00e1e82e3f3c26c8a2e12c9ef2e1b1942462 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sun, 18 Feb 2018 20:39:54 +0100 Subject: [PATCH 365/402] Add CustomData regression tests --- tests/TestModified.cpp | 91 ++++++++++++++++++++++++++++-------------- tests/TestModified.h | 1 + 2 files changed, 61 insertions(+), 31 deletions(-) diff --git a/tests/TestModified.cpp b/tests/TestModified.cpp index 6bc447270..393512c04 100644 --- a/tests/TestModified.cpp +++ b/tests/TestModified.cpp @@ -47,26 +47,26 @@ void TestModified::testSignals() db->setKey(compositeKey); QCOMPARE(spyModified.count(), ++spyCount); - Group* g1 = new Group(); - g1->setParent(root); + Group* group1 = new Group(); + group1->setParent(root); QCOMPARE(spyModified.count(), ++spyCount); - Group* g2 = new Group(); - g2->setParent(root); + Group* group2 = new Group(); + group2->setParent(root); QCOMPARE(spyModified.count(), ++spyCount); - g2->setParent(root, 0); + group2->setParent(root, 0); QCOMPARE(spyModified.count(), ++spyCount); Entry* entry1 = new Entry(); - entry1->setGroup(g1); + entry1->setGroup(group1); QCOMPARE(spyModified.count(), ++spyCount); Database* db2 = new Database(); Group* root2 = db2->rootGroup(); QSignalSpy spyModified2(db2, SIGNAL(modifiedImmediate())); - g1->setParent(root2); + group1->setParent(root2); QCOMPARE(spyModified.count(), ++spyCount); QCOMPARE(spyModified2.count(), ++spyCount2); @@ -75,7 +75,7 @@ void TestModified::testSignals() QCOMPARE(spyModified2.count(), ++spyCount2); Entry* entry2 = new Entry(); - entry2->setGroup(g2); + entry2->setGroup(group2); QCOMPARE(spyModified.count(), ++spyCount); QCOMPARE(spyModified2.count(), spyCount2); @@ -87,15 +87,15 @@ void TestModified::testSignals() QCOMPARE(spyModified.count(), spyCount); QCOMPARE(spyModified2.count(), ++spyCount2); - Group* g3 = new Group(); - g3->setParent(root); + Group* group3 = new Group(); + group3->setParent(root); QCOMPARE(spyModified.count(), ++spyCount); - Group* g4 = new Group(); - g4->setParent(g3); + Group* group4 = new Group(); + group4->setParent(group3); QCOMPARE(spyModified.count(), ++spyCount); - delete g4; + delete group4; QCOMPARE(spyModified.count(), ++spyCount); delete entry2; @@ -114,8 +114,8 @@ void TestModified::testGroupSets() Database* db = new Database(); Group* root = db->rootGroup(); - Group* g = new Group(); - g->setParent(root); + Group* group = new Group(); + group->setParent(root); QSignalSpy spyModified(db, SIGNAL(modifiedImmediate())); @@ -145,29 +145,29 @@ void TestModified::testGroupSets() QCOMPARE(spyModified.count(), spyCount); - g->setUuid(Uuid::random()); + group->setUuid(Uuid::random()); QCOMPARE(spyModified.count(), ++spyCount); - g->setUuid(g->uuid()); + group->setUuid(group->uuid()); QCOMPARE(spyModified.count(), spyCount); - g->setName("test"); + group->setName("test"); QCOMPARE(spyModified.count(), ++spyCount); - g->setName(g->name()); + group->setName(group->name()); QCOMPARE(spyModified.count(), spyCount); - g->setNotes("test"); + group->setNotes("test"); QCOMPARE(spyModified.count(), ++spyCount); - g->setNotes(g->notes()); + group->setNotes(group->notes()); QCOMPARE(spyModified.count(), spyCount); - g->setIcon(1); + group->setIcon(1); QCOMPARE(spyModified.count(), ++spyCount); - g->setIcon(g->iconNumber()); + group->setIcon(group->iconNumber()); QCOMPARE(spyModified.count(), spyCount); - g->setIcon(Uuid::random()); + group->setIcon(Uuid::random()); QCOMPARE(spyModified.count(), ++spyCount); - g->setIcon(g->iconUuid()); + group->setIcon(group->iconUuid()); QCOMPARE(spyModified.count(), spyCount); delete db; @@ -179,10 +179,10 @@ void TestModified::testEntrySets() Database* db = new Database(); Group* root = db->rootGroup(); - Group* g = new Group(); - g->setParent(root); + Group* group = new Group(); + group->setParent(root); Entry* entry = new Entry(); - entry->setGroup(g); + entry->setGroup(group); QSignalSpy spyModified(db, SIGNAL(modifiedImmediate())); @@ -298,8 +298,6 @@ void TestModified::testHistoryItems() QScopedPointer<EntryAttributes> attributes(new EntryAttributes()); attributes->copyCustomKeysFrom(entry->attributes()); - Entry* historyEntry; - int historyItemsSize = 0; entry->beginUpdate(); @@ -315,7 +313,7 @@ void TestModified::testHistoryItems() entry->setTitle("b"); entry->endUpdate(); QCOMPARE(entry->historyItems().size(), ++historyItemsSize); - historyEntry = entry->historyItems().at(historyItemsSize - 1); + Entry *historyEntry = entry->historyItems().at(historyItemsSize - 1); QCOMPARE(historyEntry->title(), QString("a")); QCOMPARE(historyEntry->uuid(), entry->uuid()); QCOMPARE(historyEntry->tags(), entry->tags()); @@ -582,3 +580,34 @@ void TestModified::testHistoryMaxSize() QCOMPARE(entry2->autoTypeAssociations()->associationsSize(), 0); QCOMPARE(entry2->historyItems().size(), 0); } + +void TestModified::testCustomData() +{ + int spyCount = 0; + Database* db = new Database(); + Group* root = db->rootGroup(); + + Group* group = new Group(); + group->setParent(root); + Entry* entry = new Entry(); + entry->setGroup(group); + + QSignalSpy spyModified(db, SIGNAL(modifiedImmediate())); + + db->metadata()->customData()->set("Key", "Value"); + QCOMPARE(spyModified.count(), ++spyCount); + db->metadata()->customData()->set("Key", "Value"); + QCOMPARE(spyModified.count(), spyCount); + + entry->customData()->set("Key", "Value"); + QCOMPARE(spyModified.count(), ++spyCount); + entry->customData()->set("Key", "Value"); + QCOMPARE(spyModified.count(), spyCount); + + group->customData()->set("Key", "Value"); + QCOMPARE(spyModified.count(), ++spyCount); + group->customData()->set("Key", "Value"); + QCOMPARE(spyModified.count(), spyCount); + + delete db; +} diff --git a/tests/TestModified.h b/tests/TestModified.h index 51c429871..581562fa5 100644 --- a/tests/TestModified.h +++ b/tests/TestModified.h @@ -31,6 +31,7 @@ private slots: void testEntrySets(); void testHistoryItems(); void testHistoryMaxSize(); + void testCustomData(); }; #endif // KEEPASSX_TESTMODIFIED_H From 5410d78bbbdd5aa2b7382de60e702e05d4bbc6f3 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sun, 18 Feb 2018 21:01:22 +0100 Subject: [PATCH 366/402] Properly save custom header data Ensure adding custom data upgrades to KDBX4 Implement review feedback --- src/core/CustomData.cpp | 48 ++++++++++----------- src/core/CustomData.h | 16 +++---- src/core/Database.cpp | 19 +++++---- src/core/Database.h | 6 +-- src/core/Entry.cpp | 6 +-- src/core/Entry.h | 13 +++--- src/core/Group.cpp | 4 +- src/core/Group.h | 6 +-- src/core/Metadata.cpp | 4 +- src/core/Metadata.h | 6 +-- src/format/Kdbx4Reader.cpp | 13 ++++-- src/format/Kdbx4Writer.cpp | 12 ++++-- src/format/KdbxXmlReader.cpp | 6 +-- src/format/KdbxXmlReader.h | 4 +- src/format/KdbxXmlWriter.cpp | 13 ++++-- src/format/KdbxXmlWriter.h | 2 +- src/format/KeePass2Writer.cpp | 16 ++++++- src/gui/EditWidgetProperties.cpp | 26 ++++++------ src/gui/EditWidgetProperties.h | 6 +-- src/gui/WelcomeWidget.cpp | 2 +- tests/TestKdbx3.cpp | 1 - tests/TestKdbx4.cpp | 40 +++++++++++++----- tests/TestKeePass2Format.cpp | 10 ----- tests/TestKeePass2Format.h | 1 - tests/TestModified.cpp | 71 ++++++++++++++------------------ tests/data/NewDatabase.xml | 12 +----- 26 files changed, 189 insertions(+), 174 deletions(-) diff --git a/src/core/CustomData.cpp b/src/core/CustomData.cpp index cb783f3a7..61ac2980e 100644 --- a/src/core/CustomData.cpp +++ b/src/core/CustomData.cpp @@ -1,6 +1,5 @@ /* - * Copyright (C) 2012 Felix Geyer <debfx@fobos.de> - * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -50,21 +49,15 @@ bool CustomData::containsValue(const QString& value) const void CustomData::set(const QString& key, const QString& value) { - bool emitModified = false; - bool addAttribute = !m_data.contains(key); bool changeValue = !addAttribute && (m_data.value(key) != value); - if (addAttribute ) { + if (addAttribute) { emit aboutToBeAdded(key); - } + } if (addAttribute || changeValue) { m_data.insert(key, value); - emitModified = true; - } - - if (emitModified) { emit modified(); } @@ -85,13 +78,10 @@ void CustomData::remove(const QString& key) void CustomData::rename(const QString& oldKey, const QString& newKey) { - if (!m_data.contains(oldKey)) { - Q_ASSERT(false); - return; - } - - if (m_data.contains(newKey)) { - Q_ASSERT(false); + const bool containsOldKey = m_data.contains(oldKey); + const bool containsNewKey = m_data.contains(newKey); + Q_ASSERT(containsOldKey && !containsNewKey); + if (!containsOldKey || containsNewKey) { return; } @@ -108,16 +98,17 @@ void CustomData::rename(const QString& oldKey, const QString& newKey) void CustomData::copyDataFrom(const CustomData* other) { - if (*this != *other) { - emit aboutToBeReset(); - - m_data = other->m_data; - - emit reset(); - emit modified(); + if (*this == *other) { + return; } -} + emit aboutToBeReset(); + + m_data = other->m_data; + + emit reset(); + emit modified(); +} bool CustomData::operator==(const CustomData& other) const { return (m_data == other.m_data); @@ -143,7 +134,12 @@ bool CustomData::isEmpty() const return m_data.isEmpty(); } -int CustomData::dataSize() +int CustomData::size() const +{ + return m_data.size(); +} + +int CustomData::dataSize() const { int size = 0; diff --git a/src/core/CustomData.h b/src/core/CustomData.h index 722d9bd28..3a6b64bce 100644 --- a/src/core/CustomData.h +++ b/src/core/CustomData.h @@ -1,6 +1,5 @@ /* - * Copyright (C) 2012 Felix Geyer <debfx@fobos.de> - * Copyright (C) 2017 KeePassXC Team <team@keepassxc.org> + * Copyright (C) 2018 KeePassXC Team <team@keepassxc.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,17 +15,17 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef KEEPASSX_CUSTOMDATA_H -#define KEEPASSX_CUSTOMDATA_H +#ifndef KEEPASSXC_CUSTOMDATA_H +#define KEEPASSXC_CUSTOMDATA_H -#include <QMap> +#include <QHash> #include <QObject> #include <QSet> #include <QStringList> class CustomData : public QObject { - Q_OBJECT +Q_OBJECT public: explicit CustomData(QObject* parent = nullptr); @@ -40,7 +39,8 @@ public: void rename(const QString& oldKey, const QString& newKey); void clear(); bool isEmpty() const; - int dataSize(); + int size() const; + int dataSize() const; void copyDataFrom(const CustomData* other); bool operator==(const CustomData& other) const; bool operator!=(const CustomData& other) const; @@ -61,4 +61,4 @@ private: QHash<QString, QString> m_data; }; -#endif // KEEPASSX_CUSTOMDATA_H +#endif // KEEPASSXC_CUSTOMDATA_H diff --git a/src/core/Database.cpp b/src/core/Database.cpp index 70affdc58..a4d663137 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -320,6 +320,17 @@ bool Database::verifyKey(const CompositeKey& key) const return (m_data.key.rawKey() == key.rawKey()); } +QVariantMap Database::publicCustomData() const +{ + return m_data.publicCustomData; +} + +void Database::setPublicCustomData(const QVariantMap& customData) +{ + m_data.publicCustomData = customData; +} + + void Database::createRecycleBin() { Group* recycleBin = Group::createRecycleBin(); @@ -578,14 +589,6 @@ void Database::setKdf(QSharedPointer<Kdf> kdf) m_data.kdf = std::move(kdf); } -void Database::setPublicCustomData(QByteArray data) { - m_data.publicCustomData = data; -} - -QByteArray Database::publicCustomData() const { - return m_data.publicCustomData; -} - bool Database::changeKdf(QSharedPointer<Kdf> kdf) { kdf->randomizeSeed(); diff --git a/src/core/Database.h b/src/core/Database.h index 384ca814e..394e31475 100644 --- a/src/core/Database.h +++ b/src/core/Database.h @@ -59,12 +59,12 @@ public: Uuid cipher; CompressionAlgorithm compressionAlgo; QByteArray transformedMasterKey; - QByteArray publicCustomData; QSharedPointer<Kdf> kdf; CompositeKey key; bool hasKey; QByteArray masterSeed; QByteArray challengeResponseKey; + QVariantMap publicCustomData; }; Database(); @@ -93,7 +93,6 @@ public: Uuid cipher() const; Database::CompressionAlgorithm compressionAlgo() const; QSharedPointer<Kdf> kdf() const; - QByteArray publicCustomData() const; QByteArray transformedMasterKey() const; const CompositeKey& key() const; QByteArray challengeResponseKey() const; @@ -102,11 +101,12 @@ public: void setCipher(const Uuid& cipher); void setCompressionAlgo(Database::CompressionAlgorithm algo); void setKdf(QSharedPointer<Kdf> kdf); - void setPublicCustomData(QByteArray data); bool setKey(const CompositeKey& key, bool updateChangedTime = true, bool updateTransformSalt = false); bool hasKey() const; bool verifyKey(const CompositeKey& key) const; + QVariantMap publicCustomData() const; + void setPublicCustomData(const QVariantMap& customData); void recycleEntry(Entry* entry); void recycleGroup(Group* group); void emptyRecycleBin(); diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index 721891d19..fa45ca5e4 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -342,12 +342,12 @@ const EntryAttachments* Entry::attachments() const return m_attachments; } -CustomData *Entry::customData() +CustomData* Entry::customData() { return m_customData; } -const CustomData *Entry::customData() const +const CustomData* Entry::customData() const { return m_customData; } @@ -618,7 +618,7 @@ void Entry::truncateHistory() size += historyItem->attributes()->attributesSize(); size += historyItem->autoTypeAssociations()->associationsSize(); size += historyItem->attachments()->attachmentsSize(); - size += customData()->dataSize(); + size += historyItem->customData()->dataSize(); const QStringList tags = historyItem->tags().split(delimiter, QString::SkipEmptyParts); for (const QString& tag : tags) { size += tag.toUtf8().size(); diff --git a/src/core/Entry.h b/src/core/Entry.h index ba8c4edd8..6ddf87dea 100644 --- a/src/core/Entry.h +++ b/src/core/Entry.h @@ -108,8 +108,8 @@ public: const EntryAttributes* attributes() const; EntryAttachments* attachments(); const EntryAttachments* attachments() const; - CustomData *customData(); - const CustomData *customData() const; + CustomData* customData(); + const CustomData* customData() const; static const int DefaultIconNumber; static const int ResolveMaximumDepth; @@ -231,11 +231,10 @@ private: Uuid m_uuid; EntryData m_data; - EntryAttributes* const m_attributes; - EntryAttachments* const m_attachments; - AutoTypeAssociations* const m_autoTypeAssociations; - - CustomData* const m_customData; + QPointer<EntryAttributes> m_attributes; + QPointer<EntryAttachments> m_attachments; + QPointer<AutoTypeAssociations> m_autoTypeAssociations; + QPointer<CustomData> m_customData; QList<Entry*> m_history; Entry* m_tmpHistoryItem; diff --git a/src/core/Group.cpp b/src/core/Group.cpp index 61a955b8d..692672652 100644 --- a/src/core/Group.cpp +++ b/src/core/Group.cpp @@ -254,12 +254,12 @@ bool Group::isExpired() const return m_data.timeInfo.expires() && m_data.timeInfo.expiryTime() < QDateTime::currentDateTimeUtc(); } -CustomData *Group::customData() +CustomData* Group::customData() { return m_customData; } -const CustomData *Group::customData() const +const CustomData* Group::customData() const { return m_customData; } diff --git a/src/core/Group.h b/src/core/Group.h index f49b77211..cc923e43b 100644 --- a/src/core/Group.h +++ b/src/core/Group.h @@ -84,8 +84,8 @@ public: bool resolveAutoTypeEnabled() const; Entry* lastTopVisibleEntry() const; bool isExpired() const; - CustomData *customData(); - const CustomData *customData() const; + CustomData* customData(); + const CustomData* customData() const; static const int DefaultIconNumber; static const int RecycleBinIconNumber; @@ -191,7 +191,7 @@ private: QList<Group*> m_children; QList<Entry*> m_entries; - CustomData *const m_customData; + QPointer<CustomData> m_customData; QPointer<Group> m_parent; diff --git a/src/core/Metadata.cpp b/src/core/Metadata.cpp index 4c41c02a5..9da2f30dc 100644 --- a/src/core/Metadata.cpp +++ b/src/core/Metadata.cpp @@ -294,12 +294,12 @@ int Metadata::historyMaxSize() const return m_data.historyMaxSize; } -CustomData *Metadata::customData() +CustomData* Metadata::customData() { return m_customData; } -const CustomData *Metadata::customData() const +const CustomData* Metadata::customData() const { return m_customData; } diff --git a/src/core/Metadata.h b/src/core/Metadata.h index a6387dfbf..a52cb0a78 100644 --- a/src/core/Metadata.h +++ b/src/core/Metadata.h @@ -98,8 +98,8 @@ public: int masterKeyChangeForce() const; int historyMaxItems() const; int historyMaxSize() const; - CustomData *customData(); - const CustomData *customData() const; + CustomData* customData(); + const CustomData* customData() const; static const int DefaultHistoryMaxItems; static const int DefaultHistoryMaxSize; @@ -175,7 +175,7 @@ private: QDateTime m_masterKeyChanged; QDateTime m_settingsChanged; - CustomData *const m_customData; + QPointer<CustomData> m_customData; bool m_updateDatetime; }; diff --git a/src/format/Kdbx4Reader.cpp b/src/format/Kdbx4Reader.cpp index 4a9649a62..2919db785 100644 --- a/src/format/Kdbx4Reader.cpp +++ b/src/format/Kdbx4Reader.cpp @@ -209,9 +209,14 @@ bool Kdbx4Reader::readHeaderField(StoreDataStream& device) break; } - case KeePass2::HeaderFieldID::PublicCustomData: - m_db->setPublicCustomData(fieldData); + case KeePass2::HeaderFieldID::PublicCustomData: { + QBuffer variantBuffer; + variantBuffer.setBuffer(&fieldData); + variantBuffer.open(QBuffer::ReadOnly); + QVariantMap data = readVariantMap(&variantBuffer); + m_db->setPublicCustomData(data); break; + } case KeePass2::HeaderFieldID::ProtectedStreamKey: case KeePass2::HeaderFieldID::TransformRounds: @@ -291,10 +296,10 @@ bool Kdbx4Reader::readInnerHeaderField(QIODevice* device) } /** - * Helper method for reading KDF parameters into variant map. + * Helper method for reading a serialized variant map. * * @param device input device - * @return filled variant map + * @return de-serialized variant map */ QVariantMap Kdbx4Reader::readVariantMap(QIODevice* device) { diff --git a/src/format/Kdbx4Writer.cpp b/src/format/Kdbx4Writer.cpp index 760baa545..bd671d9c7 100644 --- a/src/format/Kdbx4Writer.cpp +++ b/src/format/Kdbx4Writer.cpp @@ -22,6 +22,8 @@ #include "streams/HmacBlockStream.h" #include "core/Database.h" +#include "core/Metadata.h" +#include "core/CustomData.h" #include "crypto/CryptoHash.h" #include "crypto/Random.h" #include "format/KeePass2RandomStream.h" @@ -86,10 +88,14 @@ bool Kdbx4Writer::writeDatabase(QIODevice* device, Database* db) raiseError(tr("Failed to serialize KDF parameters variant map")); return false; } - QByteArray publicCustomData = db->publicCustomData(); + CHECK_RETURN_FALSE(writeHeaderField<quint32>(&header, KeePass2::HeaderFieldID::KdfParameters, kdfParamBytes)); + QVariantMap publicCustomData = db->publicCustomData(); if (!publicCustomData.isEmpty()) { - CHECK_RETURN_FALSE(writeHeaderField<quint32>(&header, KeePass2::HeaderFieldID::PublicCustomData, publicCustomData)); + QByteArray serialized; + serializeVariantMap(publicCustomData, serialized); + CHECK_RETURN_FALSE(writeHeaderField<quint32>( + &header, KeePass2::HeaderFieldID::PublicCustomData, serialized)); } CHECK_RETURN_FALSE(writeHeaderField<quint32>(&header, KeePass2::HeaderFieldID::EndOfHeader, endOfHeader)); @@ -230,7 +236,7 @@ void Kdbx4Writer::writeAttachments(QIODevice* device, Database* db) } /** - * Serialize KDF parameter variant map to byte array. + * Serialize variant map to byte array. * * @param map input variant map * @param outputBytes output byte array diff --git a/src/format/KdbxXmlReader.cpp b/src/format/KdbxXmlReader.cpp index 7aed40143..8f6bd2835 100644 --- a/src/format/KdbxXmlReader.cpp +++ b/src/format/KdbxXmlReader.cpp @@ -397,7 +397,7 @@ void KdbxXmlReader::parseBinaries() } } -void KdbxXmlReader::parseCustomData(CustomData *customData) +void KdbxXmlReader::parseCustomData(CustomData* customData) { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "CustomData"); @@ -410,7 +410,7 @@ void KdbxXmlReader::parseCustomData(CustomData *customData) } } -void KdbxXmlReader::parseCustomDataItem(CustomData *customData) +void KdbxXmlReader::parseCustomDataItem(CustomData* customData) { Q_ASSERT(m_xml.isStartElement() && m_xml.name() == "Item"); @@ -748,7 +748,7 @@ Entry* KdbxXmlReader::parseEntry(bool history) } continue; } - if (m_xml.name() == "CustomData" ){ + if (m_xml.name() == "CustomData") { parseCustomData(entry->customData()); continue; } diff --git a/src/format/KdbxXmlReader.h b/src/format/KdbxXmlReader.h index e94bfd4d3..b080094ba 100644 --- a/src/format/KdbxXmlReader.h +++ b/src/format/KdbxXmlReader.h @@ -66,8 +66,8 @@ protected: virtual void parseCustomIcons(); virtual void parseIcon(); virtual void parseBinaries(); - virtual void parseCustomData(CustomData *customData); - virtual void parseCustomDataItem(CustomData *customData); + virtual void parseCustomData(CustomData* customData); + virtual void parseCustomDataItem(CustomData* customData); virtual bool parseRoot(); virtual Group* parseGroup(); virtual void parseDeletedObjects(); diff --git a/src/format/KdbxXmlWriter.cpp b/src/format/KdbxXmlWriter.cpp index 07953af35..8f405aca0 100644 --- a/src/format/KdbxXmlWriter.cpp +++ b/src/format/KdbxXmlWriter.cpp @@ -129,7 +129,9 @@ void KdbxXmlWriter::writeMetadata() if (m_kdbxVersion < KeePass2::FILE_VERSION_4) { writeBinaries(); } - writeCustomData(m_meta->customData()); + if (m_kdbxVersion >= KeePass2::FILE_VERSION_4) { + writeCustomData(m_meta->customData()); + } m_xml.writeEndElement(); } @@ -218,8 +220,11 @@ void KdbxXmlWriter::writeBinaries() m_xml.writeEndElement(); } -void KdbxXmlWriter::writeCustomData(const CustomData *customData) +void KdbxXmlWriter::writeCustomData(const CustomData* customData) { + if (customData->isEmpty()) { + return; + } m_xml.writeStartElement("CustomData"); const QList<QString> keyList = customData->keys(); @@ -276,7 +281,7 @@ void KdbxXmlWriter::writeGroup(const Group* group) writeUuid("LastTopVisibleEntry", group->lastTopVisibleEntry()); - if (!group->customData()->isEmpty()){ + if (m_kdbxVersion >= KeePass2::FILE_VERSION_4) { writeCustomData(group->customData()); } @@ -405,7 +410,7 @@ void KdbxXmlWriter::writeEntry(const Entry* entry) writeAutoType(entry); - if (!entry->customData()->isEmpty()){ + if (m_kdbxVersion >= KeePass2::FILE_VERSION_4) { writeCustomData(entry->customData()); } diff --git a/src/format/KdbxXmlWriter.h b/src/format/KdbxXmlWriter.h index ef77ffd9e..e2c5b73c8 100644 --- a/src/format/KdbxXmlWriter.h +++ b/src/format/KdbxXmlWriter.h @@ -51,7 +51,7 @@ private: void writeCustomIcons(); void writeIcon(const Uuid& uuid, const QImage& icon); void writeBinaries(); - void writeCustomData(const CustomData *customData); + void writeCustomData(const CustomData* customData); void writeCustomDataItem(const QString& key, const QString& value); void writeRoot(); void writeGroup(const Group* group); diff --git a/src/format/KeePass2Writer.cpp b/src/format/KeePass2Writer.cpp index 7be3178ba..68cf3af99 100644 --- a/src/format/KeePass2Writer.cpp +++ b/src/format/KeePass2Writer.cpp @@ -19,6 +19,8 @@ #include <QFile> #include "core/Database.h" +#include "core/Group.h" +#include "core/Metadata.h" #include "crypto/kdf/AesKdf.h" #include "format/KeePass2Writer.h" #include "format/Kdbx3Writer.h" @@ -48,12 +50,24 @@ bool KeePass2Writer::writeDatabase(const QString& filename, Database* db) * @param db source database * @return true on success */ + bool KeePass2Writer::writeDatabase(QIODevice* device, Database* db) { m_error = false; m_errorStr.clear(); // determine KDBX3 vs KDBX4 - if (db->kdf()->uuid() == KeePass2::KDF_AES_KDBX3 && db->publicCustomData().isEmpty()) { + bool hasCustomData = !db->publicCustomData().isEmpty() || (db->metadata()->customData() && !db->metadata()->customData()->isEmpty()); + if (!hasCustomData) { + for (const auto& entry: db->rootGroup()->entriesRecursive(true)) { + if ((entry->customData() && !entry->customData()->isEmpty()) || + (entry->group() && entry->group()->customData() && !entry->group()->customData()->isEmpty())) { + hasCustomData = true; + break; + } + } + } + + if (db->kdf()->uuid() == KeePass2::KDF_AES_KDBX3 && !hasCustomData) { m_version = KeePass2::FILE_VERSION_3_1; m_writer.reset(new Kdbx3Writer()); } else { diff --git a/src/gui/EditWidgetProperties.cpp b/src/gui/EditWidgetProperties.cpp index d59f17b32..670ec9bee 100644 --- a/src/gui/EditWidgetProperties.cpp +++ b/src/gui/EditWidgetProperties.cpp @@ -18,8 +18,6 @@ #include "EditWidgetProperties.h" #include "ui_EditWidgetProperties.h" -#include <QStandardItemModel> - EditWidgetProperties::EditWidgetProperties(QWidget* parent) : QWidget(parent) , m_ui(new Ui::EditWidgetProperties()) @@ -29,14 +27,14 @@ EditWidgetProperties::EditWidgetProperties(QWidget* parent) m_ui->setupUi(this); m_ui->customDataTable->setModel(m_customDataModel); - this->connect( m_ui->removeCustomDataButton, SIGNAL(clicked()), SLOT(removeSelectedPluginData())); + connect(m_ui->removeCustomDataButton, SIGNAL(clicked()), SLOT(removeSelectedPluginData())); } EditWidgetProperties::~EditWidgetProperties() { } -void EditWidgetProperties::setFields(const TimeInfo &timeInfo, const Uuid &uuid) +void EditWidgetProperties::setFields(const TimeInfo& timeInfo, const Uuid& uuid) { static const QString timeFormat("d MMM yyyy HH:mm:ss"); m_ui->modifiedEdit->setText( @@ -48,35 +46,37 @@ void EditWidgetProperties::setFields(const TimeInfo &timeInfo, const Uuid &uuid) m_ui->uuidEdit->setText(uuid.toHex()); } -void EditWidgetProperties::setCustomData(const CustomData *customData) +void EditWidgetProperties::setCustomData(const CustomData* customData) { - Q_ASSERT(customData != nullptr); + Q_ASSERT(customData); m_customData->copyDataFrom(customData); this->updateModel(); } -const CustomData *EditWidgetProperties::customData() const +const CustomData* EditWidgetProperties::customData() const { return m_customData; } void EditWidgetProperties::removeSelectedPluginData() { - const QItemSelectionModel *pSelectionModel = m_ui->customDataTable->selectionModel(); - if (pSelectionModel){ - for( const QModelIndex& index : pSelectionModel->selectedRows(0) ){ + const QItemSelectionModel* itemSelectionModel = m_ui->customDataTable->selectionModel(); + if (itemSelectionModel) { + for (const QModelIndex& index : itemSelectionModel->selectedRows(0)) { const QString key = index.data().toString(); m_customData->remove(key); } - this->updateModel(); + updateModel(); } } void EditWidgetProperties::updateModel() { m_customDataModel->clear(); - for( const QString& key : m_customData->keys() ){ - m_customDataModel->appendRow(QList<QStandardItem*>() << new QStandardItem( key ) << new QStandardItem( m_customData->value( key ) )); + for (const QString& key : m_customData->keys()) { + m_customDataModel->appendRow(QList<QStandardItem*>() + << new QStandardItem(key) + << new QStandardItem(m_customData->value(key))); } } diff --git a/src/gui/EditWidgetProperties.h b/src/gui/EditWidgetProperties.h index dbcfac698..94f70a12c 100644 --- a/src/gui/EditWidgetProperties.h +++ b/src/gui/EditWidgetProperties.h @@ -38,10 +38,10 @@ public: explicit EditWidgetProperties(QWidget* parent = nullptr); ~EditWidgetProperties(); - void setFields(const TimeInfo &timeInfo, const Uuid &uuid); - void setCustomData(const CustomData *customData); + void setFields(const TimeInfo& timeInfo, const Uuid& uuid); + void setCustomData(const CustomData* customData); - const CustomData *customData() const; + const CustomData* customData() const; private slots: void removeSelectedPluginData(); diff --git a/src/gui/WelcomeWidget.cpp b/src/gui/WelcomeWidget.cpp index 5a2251490..ed9d025a9 100644 --- a/src/gui/WelcomeWidget.cpp +++ b/src/gui/WelcomeWidget.cpp @@ -73,4 +73,4 @@ void WelcomeWidget::refreshLastDatabases() itm->setText(database); m_ui->recentListWidget->addItem(itm); } -} \ No newline at end of file +} diff --git a/tests/TestKdbx3.cpp b/tests/TestKdbx3.cpp index 94ceafb5d..5312bcf01 100644 --- a/tests/TestKdbx3.cpp +++ b/tests/TestKdbx3.cpp @@ -33,7 +33,6 @@ QTEST_GUILESS_MAIN(TestKdbx3) void TestKdbx3::initTestCaseImpl() { - } Database* TestKdbx3::readXml(const QString& path, bool strictMode, bool& hasError, QString& errorString) diff --git a/tests/TestKdbx4.cpp b/tests/TestKdbx4.cpp index 8fb0f219b..7de3702a0 100644 --- a/tests/TestKdbx4.cpp +++ b/tests/TestKdbx4.cpp @@ -131,6 +131,7 @@ void TestKdbx4::testFormat400Upgrade() { QFETCH(Uuid, kdfUuid); QFETCH(Uuid, cipherUuid); + QFETCH(bool, addCustomData); QFETCH(quint32, expectedVersion); QScopedPointer<Database> sourceDb(new Database()); @@ -147,6 +148,12 @@ void TestKdbx4::testFormat400Upgrade() // upgrade to KDBX 4 by changing KDF and Cipher sourceDb->changeKdf(KeePass2::uuidToKdf(kdfUuid)); sourceDb->setCipher(cipherUuid); + + if (addCustomData) { + sourceDb->metadata()->customData()->set("CustomPublicData", "Hey look, I turned myself into a pickle!"); + sourceDb->rootGroup()->customData()->set("CustomGroupData", "I just killed my family! I don't care who they were!"); + } + KeePass2Writer writer; writer.writeDatabase(&buffer, sourceDb.data()); if (writer.hasError()) { @@ -165,26 +172,39 @@ void TestKdbx4::testFormat400Upgrade() QCOMPARE(targetDb->metadata()->name(), sourceDb->metadata()->name()); QCOMPARE(reader.version(), expectedVersion); - QCOMPARE(targetDb->kdf()->uuid(), sourceDb->kdf()->uuid()); QCOMPARE(targetDb->cipher(), cipherUuid); + QCOMPARE(*targetDb->metadata()->customData(), *sourceDb->metadata()->customData()); + QCOMPARE(*targetDb->rootGroup()->customData(), *sourceDb->rootGroup()->customData()); } void TestKdbx4::testFormat400Upgrade_data() { QTest::addColumn<Uuid>("kdfUuid"); QTest::addColumn<Uuid>("cipherUuid"); + QTest::addColumn<bool>("addCustomData"); QTest::addColumn<quint32>("expectedVersion"); auto constexpr kdbx3 = KeePass2::FILE_VERSION_3_1 & KeePass2::FILE_VERSION_CRITICAL_MASK; auto constexpr kdbx4 = KeePass2::FILE_VERSION_4 & KeePass2::FILE_VERSION_CRITICAL_MASK; - QTest::newRow("Argon2 + AES") << KeePass2::KDF_ARGON2 << KeePass2::CIPHER_AES << kdbx4; - QTest::newRow("AES-KDF + AES") << KeePass2::KDF_AES_KDBX4 << KeePass2::CIPHER_AES << kdbx4; - QTest::newRow("AES-KDF (legacy) + AES") << KeePass2::KDF_AES_KDBX3 << KeePass2::CIPHER_AES << kdbx3; - QTest::newRow("Argon2 + ChaCha20") << KeePass2::KDF_ARGON2 << KeePass2::CIPHER_CHACHA20 << kdbx4; - QTest::newRow("AES-KDF + ChaCha20") << KeePass2::KDF_AES_KDBX4 << KeePass2::CIPHER_CHACHA20 << kdbx4; - QTest::newRow("AES-KDF (legacy) + ChaCha20") << KeePass2::KDF_AES_KDBX3 << KeePass2::CIPHER_CHACHA20 << kdbx3; - QTest::newRow("Argon2 + Twofish") << KeePass2::KDF_ARGON2 << KeePass2::CIPHER_TWOFISH << kdbx4; - QTest::newRow("AES-KDF + Twofish") << KeePass2::KDF_AES_KDBX4 << KeePass2::CIPHER_TWOFISH << kdbx4; - QTest::newRow("AES-KDF (legacy) + Twofish") << KeePass2::KDF_AES_KDBX3 << KeePass2::CIPHER_TWOFISH << kdbx3; + QTest::newRow("Argon2 + AES") << KeePass2::KDF_ARGON2 << KeePass2::CIPHER_AES << false << kdbx4; + QTest::newRow("AES-KDF + AES") << KeePass2::KDF_AES_KDBX4 << KeePass2::CIPHER_AES << false << kdbx4; + QTest::newRow("AES-KDF (legacy) + AES") << KeePass2::KDF_AES_KDBX3 << KeePass2::CIPHER_AES << false << kdbx3; + QTest::newRow("Argon2 + AES + CustomData") << KeePass2::KDF_ARGON2 << KeePass2::CIPHER_AES << true << kdbx4; + QTest::newRow("AES-KDF + AES + CustomData") << KeePass2::KDF_AES_KDBX4 << KeePass2::CIPHER_AES << true << kdbx4; + QTest::newRow("AES-KDF (legacy) + AES + CustomData") << KeePass2::KDF_AES_KDBX3 << KeePass2::CIPHER_AES << true << kdbx4; + + QTest::newRow("Argon2 + ChaCha20") << KeePass2::KDF_ARGON2 << KeePass2::CIPHER_CHACHA20 << false << kdbx4; + QTest::newRow("AES-KDF + ChaCha20") << KeePass2::KDF_AES_KDBX4 << KeePass2::CIPHER_CHACHA20 << false << kdbx4; + QTest::newRow("AES-KDF (legacy) + ChaCha20") << KeePass2::KDF_AES_KDBX3 << KeePass2::CIPHER_CHACHA20 << false << kdbx3; + QTest::newRow("Argon2 + ChaCha20 + CustomData") << KeePass2::KDF_ARGON2 << KeePass2::CIPHER_CHACHA20 << true << kdbx4; + QTest::newRow("AES-KDF + ChaCha20 + CustomData") << KeePass2::KDF_AES_KDBX4 << KeePass2::CIPHER_CHACHA20 << true << kdbx4; + QTest::newRow("AES-KDF (legacy) + ChaCha20 + CustomData") << KeePass2::KDF_AES_KDBX3 << KeePass2::CIPHER_CHACHA20 << true << kdbx4; + + QTest::newRow("Argon2 + Twofish") << KeePass2::KDF_ARGON2 << KeePass2::CIPHER_TWOFISH << false << kdbx4; + QTest::newRow("AES-KDF + Twofish") << KeePass2::KDF_AES_KDBX4 << KeePass2::CIPHER_TWOFISH << false << kdbx4; + QTest::newRow("AES-KDF (legacy) + Twofish") << KeePass2::KDF_AES_KDBX3 << KeePass2::CIPHER_TWOFISH << false << kdbx3; + QTest::newRow("Argon2 + Twofish + CustomData") << KeePass2::KDF_ARGON2 << KeePass2::CIPHER_TWOFISH << true << kdbx4; + QTest::newRow("AES-KDF + Twofish + CustomData") << KeePass2::KDF_AES_KDBX4 << KeePass2::CIPHER_TWOFISH << true << kdbx4; + QTest::newRow("AES-KDF (legacy) + Twofish + CustomData") << KeePass2::KDF_AES_KDBX3 << KeePass2::CIPHER_TWOFISH << true << kdbx4; } diff --git a/tests/TestKeePass2Format.cpp b/tests/TestKeePass2Format.cpp index 790f0d802..a493c6173 100644 --- a/tests/TestKeePass2Format.cpp +++ b/tests/TestKeePass2Format.cpp @@ -124,15 +124,6 @@ void TestKeePass2Format::testXmlCustomIcons() } } -void TestKeePass2Format::testXmlCustomData() -{ - QHash<QString, QString> customFields = m_xmlDb->metadata()->customFields(); - - QCOMPARE(customFields.size(), 2); - QCOMPARE(customFields.value("A Sample Test Key"), QString("valu")); - QCOMPARE(customFields.value("custom key"), QString("blub")); -} - void TestKeePass2Format::testXmlGroupRoot() { const Group* group = m_xmlDb->rootGroup(); @@ -155,7 +146,6 @@ void TestKeePass2Format::testXmlGroupRoot() QCOMPARE(group->autoTypeEnabled(), Group::Inherit); QCOMPARE(group->searchingEnabled(), Group::Inherit); QCOMPARE(group->lastTopVisibleEntry()->uuid().toBase64(), QString("+wSUOv6qf0OzW8/ZHAs2sA==")); - QCOMPARE(group->children().size(), 3); QVERIFY(m_xmlDb->metadata()->recycleBin() == m_xmlDb->rootGroup()->children().at(2)); diff --git a/tests/TestKeePass2Format.h b/tests/TestKeePass2Format.h index 2a30d92b2..13426cb9c 100644 --- a/tests/TestKeePass2Format.h +++ b/tests/TestKeePass2Format.h @@ -40,7 +40,6 @@ private slots: */ void testXmlMetadata(); void testXmlCustomIcons(); - void testXmlCustomData(); void testXmlGroupRoot(); void testXmlGroup1(); void testXmlGroup2(); diff --git a/tests/TestModified.cpp b/tests/TestModified.cpp index 393512c04..0bf2c5b3a 100644 --- a/tests/TestModified.cpp +++ b/tests/TestModified.cpp @@ -40,31 +40,31 @@ void TestModified::testSignals() CompositeKey compositeKey; - Database* db = new Database(); - Group* root = db->rootGroup(); - QSignalSpy spyModified(db, SIGNAL(modifiedImmediate())); + QScopedPointer<Database> db(new Database()); + auto* root = db->rootGroup(); + QSignalSpy spyModified(db.data(), SIGNAL(modifiedImmediate())); db->setKey(compositeKey); QCOMPARE(spyModified.count(), ++spyCount); - Group* group1 = new Group(); + auto* group1 = new Group(); group1->setParent(root); QCOMPARE(spyModified.count(), ++spyCount); - Group* group2 = new Group(); + auto* group2 = new Group(); group2->setParent(root); QCOMPARE(spyModified.count(), ++spyCount); group2->setParent(root, 0); QCOMPARE(spyModified.count(), ++spyCount); - Entry* entry1 = new Entry(); + auto* entry1 = new Entry(); entry1->setGroup(group1); QCOMPARE(spyModified.count(), ++spyCount); - Database* db2 = new Database(); - Group* root2 = db2->rootGroup(); - QSignalSpy spyModified2(db2, SIGNAL(modifiedImmediate())); + QScopedPointer<Database> db2(new Database()); + auto* root2 = db2->rootGroup(); + QSignalSpy spyModified2(db2.data(), SIGNAL(modifiedImmediate())); group1->setParent(root2); QCOMPARE(spyModified.count(), ++spyCount); @@ -74,7 +74,7 @@ void TestModified::testSignals() QCOMPARE(spyModified.count(), spyCount); QCOMPARE(spyModified2.count(), ++spyCount2); - Entry* entry2 = new Entry(); + auto* entry2 = new Entry(); entry2->setGroup(group2); QCOMPARE(spyModified.count(), ++spyCount); QCOMPARE(spyModified2.count(), spyCount2); @@ -87,11 +87,11 @@ void TestModified::testSignals() QCOMPARE(spyModified.count(), spyCount); QCOMPARE(spyModified2.count(), ++spyCount2); - Group* group3 = new Group(); + auto* group3 = new Group(); group3->setParent(root); QCOMPARE(spyModified.count(), ++spyCount); - Group* group4 = new Group(); + auto* group4 = new Group(); group4->setParent(group3); QCOMPARE(spyModified.count(), ++spyCount); @@ -103,21 +103,18 @@ void TestModified::testSignals() QCOMPARE(spyModified.count(), spyCount); QCOMPARE(spyModified2.count(), spyCount2); - - delete db; - delete db2; } void TestModified::testGroupSets() { int spyCount = 0; - Database* db = new Database(); - Group* root = db->rootGroup(); + QScopedPointer<Database> db(new Database()); + auto* root = db->rootGroup(); - Group* group = new Group(); + auto* group = new Group(); group->setParent(root); - QSignalSpy spyModified(db, SIGNAL(modifiedImmediate())); + QSignalSpy spyModified(db.data(), SIGNAL(modifiedImmediate())); root->setUuid(Uuid::random()); QCOMPARE(spyModified.count(), ++spyCount); @@ -169,22 +166,20 @@ void TestModified::testGroupSets() QCOMPARE(spyModified.count(), ++spyCount); group->setIcon(group->iconUuid()); QCOMPARE(spyModified.count(), spyCount); - - delete db; } void TestModified::testEntrySets() { int spyCount = 0; - Database* db = new Database(); - Group* root = db->rootGroup(); + QScopedPointer<Database> db(new Database()); + auto* root = db->rootGroup(); - Group* group = new Group(); + auto* group = new Group(); group->setParent(root); - Entry* entry = new Entry(); + auto* entry = new Entry(); entry->setGroup(group); - QSignalSpy spyModified(db, SIGNAL(modifiedImmediate())); + QSignalSpy spyModified(db.data(), SIGNAL(modifiedImmediate())); entry->setUuid(Uuid::random()); QCOMPARE(spyModified.count(), ++spyCount); @@ -284,8 +279,6 @@ void TestModified::testEntrySets() QCOMPARE(spyModified.count(), ++spyCount); entry->attributes()->set("test key2", entry->attributes()->value("test key2"), true); QCOMPARE(spyModified.count(), spyCount); - - delete db; } void TestModified::testHistoryItems() @@ -313,7 +306,7 @@ void TestModified::testHistoryItems() entry->setTitle("b"); entry->endUpdate(); QCOMPARE(entry->historyItems().size(), ++historyItemsSize); - Entry *historyEntry = entry->historyItems().at(historyItemsSize - 1); + auto *historyEntry = entry->historyItems().at(historyItemsSize - 1); QCOMPARE(historyEntry->title(), QString("a")); QCOMPARE(historyEntry->uuid(), entry->uuid()); QCOMPARE(historyEntry->tags(), entry->tags()); @@ -342,12 +335,11 @@ void TestModified::testHistoryItems() QVERIFY(!entry->historyItems().at(historyItemsSize - 1)->attributes()->keys().contains("k")); QScopedPointer<Database> db(new Database()); - Group* root = db->rootGroup(); + auto* root = db->rootGroup(); db->metadata()->setHistoryMaxItems(3); db->metadata()->setHistoryMaxSize(-1); - Entry* historyEntry2; - Entry* entry2 = new Entry(); + auto* entry2 = new Entry(); entry2->setGroup(root); entry2->beginUpdate(); entry2->setTitle("1"); @@ -373,7 +365,7 @@ void TestModified::testHistoryItems() entry2->endUpdate(); QCOMPARE(entry2->historyItems().size(), 1); - historyEntry2 = entry2->historyItems().at(0); + auto* historyEntry2 = entry2->historyItems().at(0); QCOMPARE(historyEntry2->title(), QString("4")); db->metadata()->setHistoryMaxItems(-1); @@ -451,7 +443,6 @@ void TestModified::testHistoryMaxSize() QScopedPointer<Database> db(new Database()); const QString key("test"); - auto entry1 = new Entry(); entry1->setGroup(db->rootGroup()); QCOMPARE(entry1->historyItems().size(), 0); @@ -584,15 +575,15 @@ void TestModified::testHistoryMaxSize() void TestModified::testCustomData() { int spyCount = 0; - Database* db = new Database(); - Group* root = db->rootGroup(); + QScopedPointer<Database> db(new Database()); + auto* root = db->rootGroup(); - Group* group = new Group(); + auto* group = new Group(); group->setParent(root); - Entry* entry = new Entry(); + auto* entry = new Entry(); entry->setGroup(group); - QSignalSpy spyModified(db, SIGNAL(modifiedImmediate())); + QSignalSpy spyModified(db.data(), SIGNAL(modifiedImmediate())); db->metadata()->customData()->set("Key", "Value"); QCOMPARE(spyModified.count(), ++spyCount); @@ -608,6 +599,4 @@ void TestModified::testCustomData() QCOMPARE(spyModified.count(), ++spyCount); group->customData()->set("Key", "Value"); QCOMPARE(spyModified.count(), spyCount); - - delete db; } diff --git a/tests/data/NewDatabase.xml b/tests/data/NewDatabase.xml index d07b83693..a0efd631a 100644 --- a/tests/data/NewDatabase.xml +++ b/tests/data/NewDatabase.xml @@ -39,16 +39,6 @@ <Binary ID="0" Compressed="True">H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/InZ29+7t3//0wcHD/wfGx4SmCgAAAA==</Binary> <Binary ID="1" Compressed="True">H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/IrLJdJafX8yLn377/wCfD1fOCwAAAA==</Binary> </Binaries> - <CustomData> - <Item> - <Key>A Sample Test Key</Key> - <Value>valu</Value> - </Item> - <Item> - <Key>custom key</Key> - <Value>blub</Value> - </Item> - </CustomData> </Meta> <Root> <Group> @@ -479,4 +469,4 @@ </DeletedObject> </DeletedObjects> </Root> -</KeePassFile> \ No newline at end of file +</KeePassFile> From da52da37b309ad96ab2638183053fe118452d1bd Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sun, 18 Feb 2018 19:54:07 +0100 Subject: [PATCH 367/402] Add additional tests for saving and reading KDBX files with custom data --- tests/TestKdbx4.cpp | 90 +++++++++++++++++++++++++++++++++++++++++++++ tests/TestKdbx4.h | 1 + 2 files changed, 91 insertions(+) diff --git a/tests/TestKdbx4.cpp b/tests/TestKdbx4.cpp index 7de3702a0..24a07aa63 100644 --- a/tests/TestKdbx4.cpp +++ b/tests/TestKdbx4.cpp @@ -208,3 +208,93 @@ void TestKdbx4::testFormat400Upgrade_data() QTest::newRow("AES-KDF + Twofish + CustomData") << KeePass2::KDF_AES_KDBX4 << KeePass2::CIPHER_TWOFISH << true << kdbx4; QTest::newRow("AES-KDF (legacy) + Twofish + CustomData") << KeePass2::KDF_AES_KDBX3 << KeePass2::CIPHER_TWOFISH << true << kdbx4; } + +void TestKdbx4::testCustomData() +{ + Database db; + + // test public custom data + QVariantMap publicCustomData; + publicCustomData.insert("CD1", 123); + publicCustomData.insert("CD2", true); + publicCustomData.insert("CD3", "abcäöü"); + publicCustomData.insert("CD4", QByteArray::fromHex("ababa123ff")); + db.setPublicCustomData(publicCustomData); + QCOMPARE(db.publicCustomData(), publicCustomData); + + const QString customDataKey1 = "CD1"; + const QString customDataKey2 = "CD2"; + const QString customData1 = "abcäöü"; + const QString customData2 = "Hello World"; + const int dataSize = customDataKey1.toUtf8().size() + customDataKey1.toUtf8().size() + + customData1.toUtf8().size() + customData2.toUtf8().size(); + + // test custom database data + db.metadata()->customData()->set(customDataKey1, customData1); + db.metadata()->customData()->set(customDataKey2, customData2); + QCOMPARE(db.metadata()->customData()->size(), 2); + QCOMPARE(db.metadata()->customData()->dataSize(), dataSize); + + // test custom root group data + Group* root = db.rootGroup(); + root->customData()->set(customDataKey1, customData1); + root->customData()->set(customDataKey2, customData2); + QCOMPARE(root->customData()->size(), 2); + QCOMPARE(root->customData()->dataSize(), dataSize); + + // test copied custom group data + auto* group = new Group(); + group->setParent(root); + group->setUuid(Uuid::random()); + group->customData()->copyDataFrom(root->customData()); + QCOMPARE(*group->customData(), *root->customData()); + + // test copied custom entry data + auto* entry = new Entry(); + entry->setGroup(group); + entry->setUuid(Uuid::random()); + entry->customData()->copyDataFrom(group->customData()); + QCOMPARE(*entry->customData(), *root->customData()); + + // test custom data deletion + entry->customData()->set("additional item", "foobar"); + QCOMPARE(entry->customData()->size(), 3); + entry->customData()->remove("additional item"); + QCOMPARE(entry->customData()->size(), 2); + QCOMPARE(entry->customData()->dataSize(), dataSize); + + // test custom data on cloned groups + QScopedPointer<Group> clonedGroup(group->clone()); + QCOMPARE(*clonedGroup->customData(), *group->customData()); + + // test custom data on cloned entries + QScopedPointer<Entry> clonedEntry(entry->clone(Entry::CloneNoFlags)); + QCOMPARE(*clonedEntry->customData(), *entry->customData()); + + QBuffer buffer; + buffer.open(QBuffer::ReadWrite); + KeePass2Writer writer; + writer.writeDatabase(&buffer, &db); + + // read buffer back + buffer.seek(0); + KeePass2Reader reader; + QSharedPointer<Database> newDb(reader.readDatabase(&buffer, CompositeKey())); + + // test all custom data are read back successfully from KDBX + QCOMPARE(newDb->publicCustomData(), publicCustomData); + + QCOMPARE(newDb->metadata()->customData()->value(customDataKey1), customData1); + QCOMPARE(newDb->metadata()->customData()->value(customDataKey2), customData2); + + QCOMPARE(newDb->rootGroup()->customData()->value(customDataKey1), customData1); + QCOMPARE(newDb->rootGroup()->customData()->value(customDataKey2), customData2); + + auto* newGroup = newDb->rootGroup()->children()[0]; + QCOMPARE(newGroup->customData()->value(customDataKey1), customData1); + QCOMPARE(newGroup->customData()->value(customDataKey2), customData2); + + auto* newEntry = newDb->rootGroup()->children()[0]->entries()[0]; + QCOMPARE(newEntry->customData()->value(customDataKey1), customData1); + QCOMPARE(newEntry->customData()->value(customDataKey2), customData2); +} diff --git a/tests/TestKdbx4.h b/tests/TestKdbx4.h index 59864b70e..5c398d196 100644 --- a/tests/TestKdbx4.h +++ b/tests/TestKdbx4.h @@ -28,6 +28,7 @@ private slots: void testFormat400(); void testFormat400Upgrade(); void testFormat400Upgrade_data(); + void testCustomData(); protected: void initTestCaseImpl() override; From f15088f496477b8a62a92cdafca7f321a5aaeff0 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Mon, 19 Feb 2018 15:23:22 +0100 Subject: [PATCH 368/402] Ask user before deleting custom plugin data and disable button if no data selected --- src/gui/EditWidgetProperties.cpp | 24 +++++++++++++++++++++++- src/gui/EditWidgetProperties.h | 2 ++ src/gui/EditWidgetProperties.ui | 4 ++-- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/gui/EditWidgetProperties.cpp b/src/gui/EditWidgetProperties.cpp index 670ec9bee..a06928c46 100644 --- a/src/gui/EditWidgetProperties.cpp +++ b/src/gui/EditWidgetProperties.cpp @@ -17,6 +17,7 @@ #include "EditWidgetProperties.h" #include "ui_EditWidgetProperties.h" +#include "MessageBox.h" EditWidgetProperties::EditWidgetProperties(QWidget* parent) : QWidget(parent) @@ -25,8 +26,11 @@ EditWidgetProperties::EditWidgetProperties(QWidget* parent) , m_customDataModel(new QStandardItemModel(this)) { m_ui->setupUi(this); + m_ui->removeCustomDataButton->setEnabled(false); m_ui->customDataTable->setModel(m_customDataModel); + connect(m_ui->customDataTable->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), + SLOT(toggleRemoveButton(QItemSelection))); connect(m_ui->removeCustomDataButton, SIGNAL(clicked()), SLOT(removeSelectedPluginData())); } @@ -51,7 +55,7 @@ void EditWidgetProperties::setCustomData(const CustomData* customData) Q_ASSERT(customData); m_customData->copyDataFrom(customData); - this->updateModel(); + updateModel(); } const CustomData* EditWidgetProperties::customData() const @@ -61,6 +65,14 @@ const CustomData* EditWidgetProperties::customData() const void EditWidgetProperties::removeSelectedPluginData() { + if (QMessageBox::Yes != MessageBox::question(this, + tr("Delete plugin data?"), + tr("Do you really want to delete the selected plugin data?\n" + "This may cause the affected plugins to malfunction."), + QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Cancel)) { + return; + } + const QItemSelectionModel* itemSelectionModel = m_ui->customDataTable->selectionModel(); if (itemSelectionModel) { for (const QModelIndex& index : itemSelectionModel->selectedRows(0)) { @@ -71,12 +83,22 @@ void EditWidgetProperties::removeSelectedPluginData() } } +void EditWidgetProperties::toggleRemoveButton(const QItemSelection& selected) +{ + m_ui->removeCustomDataButton->setEnabled(!selected.isEmpty()); +} + void EditWidgetProperties::updateModel() { m_customDataModel->clear(); + + m_customDataModel->setHorizontalHeaderLabels({tr("Key"), tr("Value")}); + for (const QString& key : m_customData->keys()) { m_customDataModel->appendRow(QList<QStandardItem*>() << new QStandardItem(key) << new QStandardItem(m_customData->value(key))); } + + m_ui->removeCustomDataButton->setEnabled(false); } diff --git a/src/gui/EditWidgetProperties.h b/src/gui/EditWidgetProperties.h index 94f70a12c..a1fd198d7 100644 --- a/src/gui/EditWidgetProperties.h +++ b/src/gui/EditWidgetProperties.h @@ -19,6 +19,7 @@ #define KEEPASSX_EDITWIDGETPROPERTIES_H #include <QStandardItemModel> +#include <QItemSelection> #include <QPointer> #include <QWidget> @@ -45,6 +46,7 @@ public: private slots: void removeSelectedPluginData(); + void toggleRemoveButton(const QItemSelection& selected); private: void updateModel(); diff --git a/src/gui/EditWidgetProperties.ui b/src/gui/EditWidgetProperties.ui index 269134f65..f97562661 100644 --- a/src/gui/EditWidgetProperties.ui +++ b/src/gui/EditWidgetProperties.ui @@ -112,8 +112,8 @@ <property name="selectionBehavior"> <enum>QAbstractItemView::SelectRows</enum> </property> - <attribute name="horizontalHeaderVisible"> - <bool>false</bool> + <attribute name="horizontalHeaderDefaultSectionSize"> + <number>200</number> </attribute> <attribute name="horizontalHeaderStretchLastSection"> <bool>true</bool> From 7c6eddeae7ea5c4109f490acba692d112270420d Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Wed, 21 Feb 2018 17:53:38 +0100 Subject: [PATCH 369/402] Pull translations from transifex --- share/translations/keepassx_ar.ts | 4089 ++++++++++++++++++++++++++ share/translations/keepassx_ca.ts | 342 ++- share/translations/keepassx_cs.ts | 1146 +++++--- share/translations/keepassx_da.ts | 3243 +++++++++++++++----- share/translations/keepassx_de.ts | 338 ++- share/translations/keepassx_el.ts | 318 +- share/translations/keepassx_en.ts | 173 +- share/translations/keepassx_en_US.ts | 342 ++- share/translations/keepassx_es.ts | 532 +++- share/translations/keepassx_eu.ts | 312 +- share/translations/keepassx_fi.ts | 993 ++++--- share/translations/keepassx_fr.ts | 1131 ++++--- share/translations/keepassx_hu.ts | 933 +++--- share/translations/keepassx_id.ts | 981 +++--- share/translations/keepassx_it.ts | 580 +++- share/translations/keepassx_ja.ts | 613 ++-- share/translations/keepassx_ko.ts | 993 ++++--- share/translations/keepassx_lt.ts | 659 +++-- share/translations/keepassx_nl_NL.ts | 1401 +++++---- share/translations/keepassx_pl.ts | 998 ++++--- share/translations/keepassx_pt_BR.ts | 474 ++- share/translations/keepassx_pt_PT.ts | 826 ++++-- share/translations/keepassx_ro.ts | 4069 +++++++++++++++++++++++++ share/translations/keepassx_ru.ts | 676 +++-- share/translations/keepassx_sr.ts | 4078 +++++++++++++++++++++++++ share/translations/keepassx_sv.ts | 3219 +++++++++++++++----- share/translations/keepassx_th.ts | 477 ++- share/translations/keepassx_tr.ts | 326 +- share/translations/keepassx_uk.ts | 1023 ++++--- share/translations/keepassx_zh_CN.ts | 396 ++- share/translations/keepassx_zh_TW.ts | 1013 ++++--- 31 files changed, 29395 insertions(+), 7299 deletions(-) create mode 100644 share/translations/keepassx_ar.ts create mode 100644 share/translations/keepassx_ro.ts create mode 100644 share/translations/keepassx_sr.ts diff --git a/share/translations/keepassx_ar.ts b/share/translations/keepassx_ar.ts new file mode 100644 index 000000000..5da718e47 --- /dev/null +++ b/share/translations/keepassx_ar.ts @@ -0,0 +1,4089 @@ +<?xml version="1.0" ?><!DOCTYPE TS><TS language="ar" version="2.1"> +<context> + <name>AboutDialog</name> + <message> + <source>About KeePassXC</source> + <translation>حول KeePassXC</translation> + </message> + <message> + <source>About</source> + <translation>حول</translation> + </message> + <message> + <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> + <translation>للإبلاغ عن الأخطاء: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> + </message> + <message> + <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>KeePassXC موزع وفقًا لشروط رخصة غنو العمومية (GPL) إصدار 2 أو (حسب خيارك) إصدار 3.</translation> + </message> + <message> + <source>Contributors</source> + <translation>المساهمين</translation> + </message> + <message> + <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">إستكشاف المساهمين عبر GitHub</a></translation> + </message> + <message> + <source>Debug Info</source> + <translation>معلومات تتبع الأخطاء</translation> + </message> + <message> + <source>Include the following information whenever you report a bug:</source> + <translation>قم بتضمين المعلومات التالية عند الإبلاغ عن خطأ:</translation> + </message> + <message> + <source>Copy to clipboard</source> + <translation>نسخ إلى الحافظة</translation> + </message> + <message> + <source>Version %1 +</source> + <translation>الإصدار %1 +</translation> + </message> + <message> + <source>Revision: %1</source> + <translation>مراجعة: %1</translation> + </message> + <message> + <source>Distribution: %1</source> + <translation>مراجعة: %1</translation> + </message> + <message> + <source>Libraries:</source> + <translation>المكتبات:</translation> + </message> + <message> + <source>Operating system: %1 +CPU architecture: %2 +Kernel: %3 %4</source> + <translation>نظام التشغيل: %1 +معمارية المعالج: %2 +النواة: %3 %4</translation> + </message> + <message> + <source>Enabled extensions:</source> + <translation>الإضافات المُفعلة:</translation> + </message> + <message> + <source>Project Maintainers:</source> + <translation>مشرفي المشروع:</translation> + </message> + <message> + <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Build Type: %1 +</source> + <translation>نوع التكوين: %1 +</translation> + </message> +</context> +<context> + <name>AccessControlDialog</name> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>تأكيد وصول KeePassXC ل HTTP</translation> + </message> + <message> + <source>Remember this decision</source> + <translation>تذكر هذا القرار</translation> + </message> + <message> + <source>Allow</source> + <translation>اسمح</translation> + </message> + <message> + <source>Deny</source> + <translation>رفض</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 طلب الدخول إلى كلمات المرور للعنصر التالي (العناصر) التالية. +يرجى تحديد ما إذا كنت تريد السماح بالوصول أم لا.</translation> + </message> +</context> +<context> + <name>AgentSettingsWidget</name> + <message> + <source>Enable SSH Agent (requires restart)</source> + <translation>تفعيل وكيل SSH (يتطلب إعادة التشغيل)</translation> + </message> +</context> +<context> + <name>AutoType</name> + <message> + <source>Couldn't find an entry that matches the window title:</source> + <translation>تعذر العثور على إدخال يطابق عنوان النافذة:</translation> + </message> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>الطباعة التلقائية - KeePassXC</translation> + </message> + <message> + <source>Auto-Type</source> + <translation>الطباعة التلقائية</translation> + </message> + <message> + <source>The Syntax of your Auto-Type statement is incorrect!</source> + <translation>صياغة التعبير للطباعة التلقائية غير صحيح!</translation> + </message> + <message> + <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> + <translation>الوقت المعطى لأمر الطباعة التلقائية طويل للغاية، هل تريد المتابعة؟</translation> + </message> + <message> + <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> + <translation>هذا الأمر للطباعة التلقائية يحتوي على مفاتيح مضغوطة بشكل بطيء للغاية، هل انت متأكد من المتابعة؟</translation> + </message> + <message> + <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> + <translation>هذا الأمر للطباعة التلقائية يحتوي على عبارات مكررة، هل تريد المتابعة؟</translation> + </message> +</context> +<context> + <name>AutoTypeAssociationsModel</name> + <message> + <source>Window</source> + <translation>النافذة</translation> + </message> + <message> + <source>Sequence</source> + <translation>التسلسل</translation> + </message> + <message> + <source>Default sequence</source> + <translation>التسلسل الإفتراضي</translation> + </message> +</context> +<context> + <name>AutoTypeMatchModel</name> + <message> + <source>Group</source> + <translation>المجموعة</translation> + </message> + <message> + <source>Title</source> + <translation>العنوان</translation> + </message> + <message> + <source>Username</source> + <translation>اسم المستخدم</translation> + </message> + <message> + <source>Sequence</source> + <translation>التسلسل</translation> + </message> +</context> +<context> + <name>AutoTypeSelectDialog</name> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>الطباعة التلقائية - KeePassXC</translation> + </message> + <message> + <source>Select entry to Auto-Type:</source> + <translation>حدد مدخل للطباعة التلقائية:</translation> + </message> +</context> +<context> + <name>BrowserAccessControlDialog</name> + <message> + <source>KeePassXC-Browser Confirm Access</source> + <translation>KeePassXC-تأكيد الوصول إلى المتصفح</translation> + </message> + <message> + <source>Remember this decision</source> + <translation>تذكر هذا القرار</translation> + </message> + <message> + <source>Allow</source> + <translation>إسمح</translation> + </message> + <message> + <source>Deny</source> + <translation>رفض</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 طلب الدخول إلى كلمات المرور للعنصر التالي (العناصر) التالية. +يرجى تحديد ما إذا كنت تريد السماح بالوصول أم لا.</translation> + </message> +</context> +<context> + <name>BrowserOptionDialog</name> + <message> + <source>Dialog</source> + <translation>الحوار</translation> + </message> + <message> + <source>This is required for accessing your databases with KeePassXC-Browser</source> + <translation>هذا مطلوب للوصول إلى قواعد بياناتك مع KeePassXC-Browser</translation> + </message> + <message> + <source>Enable KeepassXC browser integration</source> + <translation>تفعيل تكامل KeepassXC مع المتصفح</translation> + </message> + <message> + <source>General</source> + <translation>العام</translation> + </message> + <message> + <source>Enable integration for these browsers:</source> + <translation>تفعيل التكامل لهذه المتصفحات:</translation> + </message> + <message> + <source>&Google Chrome</source> + <translation>&Google Chrome</translation> + </message> + <message> + <source>&Firefox</source> + <translation>&Firefox</translation> + </message> + <message> + <source>&Chromium</source> + <translation>&Chromium</translation> + </message> + <message> + <source>&Vivaldi</source> + <translation>&Vivaldi</translation> + </message> + <message> + <source>Show a &notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>أظهر الإشعار عندما يتم طلب بيانات الإعتماد</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>طلب إلغاء القفل قاعدة البيانات في حال تم الإقفال</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> + <translation>السماح فقط بالمدخلات التي تعود بنفس الصيغة (http://, https://, ...) </translation> + </message> + <message> + <source>&Match URL scheme (e.g., https://...)</source> + <translation>مطابقة صيغة عنوان الانترنت (على سبيل المثال https://... )</translation> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return only best-matching credentials</source> + <translation type="unfinished"/> + </message> + <message> + <source>Sort &matching credentials by title</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>فرز ومطابقة بيانات الإعتماد حسب العنوان</translation> + </message> + <message> + <source>Sort matching credentials by &username</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>فرز ومطابقة بيانات الإعتماد حسب إسم المستخدم</translation> + </message> + <message> + <source>&Disconnect all browsers</source> + <translation>&فصل جميع المتصفحات</translation> + </message> + <message> + <source>Forget all remembered &permissions</source> + <translation>نسيان جميع &التصريحات المحفوظة</translation> + </message> + <message> + <source>Advanced</source> + <translation>متقدم</translation> + </message> + <message> + <source>Never &ask before accessing credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>لا تسأل مطلقًا قبل الوصول إلى بيانات الإعتماد</translation> + </message> + <message> + <source>Never ask before &updating credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>لا تسأل مطلقًا قبل تحديث بيانات الإعتماد</translation> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>قاعدة البيانات المحددة هي التي يجب تتصل مع العميل فقط.</translation> + </message> + <message> + <source>Searc&h in all opened databases for matching credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation type="unfinished"/> + </message> + <message> + <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Update &native messaging manifest files at startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Support a proxy application between KeePassXC and browser extension.</source> + <translation>دعم تطبيق الوكيل بين KeePassXC وإضافات المتصفح.</translation> + </message> + <message> + <source>Use a &proxy application between KeePassXC and browser extension</source> + <translation>استخدام تطبيق &الوكيل بين KeePassXC وإضافات المتصفح</translation> + </message> + <message> + <source>Use a custom proxy location if you installed a proxy manually.</source> + <translation>إستخدام موقع وكيل مخصص في حالة تثبيت خادم وكيل يدويًا.</translation> + </message> + <message> + <source>Use a &custom proxy location</source> + <comment>Meant is the proxy for KeePassXC-Browser</comment> + <translation>إستخدام &موقع وكيل مخصص</translation> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>إستعراض...</translation> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation><b>تحذير:</b> قد تكون الخيارات التالية خطيرة!</translation> + </message> + <message> + <source>Executable Files (*.exe);;All Files (*.*)</source> + <translation>الملفات القابلة للتنفيذ (*.exe);;جميع الملفات (*.*)</translation> + </message> + <message> + <source>Executable Files (*)</source> + <translation>الملفات القابلة للتنفيذ (*)</translation> + </message> + <message> + <source>Select custom proxy location</source> + <translation>حدد موقع خادم الوكيل المخصص</translation> + </message> +</context> +<context> + <name>BrowserService</name> + <message> + <source>KeePassXC: New key association request</source> + <translation type="unfinished"/> + </message> + <message> + <source>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Save and allow access</source> + <translation>حفظ والسماح بالوصول</translation> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: الكتابة على المفتاح الحالي؟</translation> + </message> + <message> + <source>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: تحديث المُدخل</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>هل تريد تحديث المعلومات في %1 - %2؟</translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: قاعدة البيانات أقفلت!</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>قاعدة البيانات هذه قد أقفلت! +يرجى إلغاء قفل قاعدة البيانات المحددة أو اختيار واحدة أخرى تكون مفتوحة.</translation> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: الإعدادات غير متاحة!</translation> + </message> + <message> + <source>The active database does not contain a settings entry.</source> + <translation>لا تحتوي قاعدة البيانات النشطة على إدخال إعدادات.</translation> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: لم يُعثر على أية مفاتيح</translation> + </message> + <message> + <source>No shared encryption keys found in KeePassXC Settings.</source> + <translation>لم يُعثر على مفاتيح التشفير المشتركة في إعدادات KeePassXC.</translation> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: حُذِفت المفاتيح من قاعدة البيانات</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Removing stored permissions…</source> + <translation>إزالة الصلاحيات المخزنة...</translation> + </message> + <message> + <source>Abort</source> + <translation>إجهاض </translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: حُذفت الصلاحيات</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entry(s).</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation type="unfinished"/> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>ChangeMasterKeyWidget</name> + <message> + <source>Password</source> + <translation>كلمه السر</translation> + </message> + <message> + <source>Enter password:</source> + <translation>أدخل كلمة السر:</translation> + </message> + <message> + <source>Repeat password:</source> + <translation>تكرار كلمة السر:</translation> + </message> + <message> + <source>&Key file</source> + <translation>&ملف المفتاح</translation> + </message> + <message> + <source>Browse</source> + <translation>تصّفح</translation> + </message> + <message> + <source>Create</source> + <translation>إنشاء</translation> + </message> + <message> + <source>Cha&llenge Response</source> + <translation type="unfinished"/> + </message> + <message> + <source>Refresh</source> + <translation>تحديث</translation> + </message> + <message> + <source>Key files</source> + <translation>ملفات المفتاح</translation> + </message> + <message> + <source>All files</source> + <translation>كل الملفات</translation> + </message> + <message> + <source>Create Key File...</source> + <translation>إنشاء ملف مفتاح...</translation> + </message> + <message> + <source>Unable to create Key File : </source> + <translation>تعذر إنشاء ملف المفتاح :</translation> + </message> + <message> + <source>Select a key file</source> + <translation>حدد ملف المفتاح</translation> + </message> + <message> + <source>Empty password</source> + <translation>كلمة المرور فارغة</translation> + </message> + <message> + <source>Do you really want to use an empty string as password?</source> + <translation>هل تريد حقًا استخدام مُدخل فارغ ككلمة مرور؟</translation> + </message> + <message> + <source>Different passwords supplied.</source> + <translation>توفير كلمات السر مختلفة.</translation> + </message> + <message> + <source>Failed to set %1 as the Key file: +%2</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy key file format</source> + <translation>تنسيق ملف المفتاح القديم</translation> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Changing master key failed: no YubiKey inserted.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CloneDialog</name> + <message> + <source>Clone Options</source> + <translation>إعدادات الإستنساخ</translation> + </message> + <message> + <source>Append ' - Clone' to title</source> + <translation type="unfinished"/> + </message> + <message> + <source>Replace username and password with references</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy history</source> + <translation>نسخ التاريخ</translation> + </message> +</context> +<context> + <name>CsvImportWidget</name> + <message> + <source>Import CSV fields</source> + <translation>إستيراد مُدخلات CSV</translation> + </message> + <message> + <source>filename</source> + <translation>اسم الملف</translation> + </message> + <message> + <source>size, rows, columns</source> + <translation>الحجم، الصفوف، الأعمدة</translation> + </message> + <message> + <source>Encoding</source> + <translation>ترميز</translation> + </message> + <message> + <source>Codec</source> + <translation>الترميز</translation> + </message> + <message> + <source>Text is qualified by</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fields are separated by</source> + <translation type="unfinished"/> + </message> + <message> + <source>Comments start with</source> + <translation>تبدأ التعليقات عند</translation> + </message> + <message> + <source>First record has field names</source> + <translation type="unfinished"/> + </message> + <message> + <source>Number of headers line to discard</source> + <translation type="unfinished"/> + </message> + <message> + <source>Consider '\' an escape character</source> + <translation type="unfinished"/> + </message> + <message> + <source>Preview</source> + <translation>معاينة</translation> + </message> + <message> + <source>Column layout</source> + <translation>تخطيط العمود</translation> + </message> + <message> + <source>Not present in CSV file</source> + <translation>غير موجود في ملف CSV</translation> + </message> + <message> + <source>Empty fieldname </source> + <translation>إسم الحقل فارغ</translation> + </message> + <message> + <source>column </source> + <translation>العمود </translation> + </message> + <message> + <source>Imported from CSV file</source> + <translation>مُستورد من ملف CSV</translation> + </message> + <message> + <source>Original data: </source> + <translation>البيانات الأصلية:</translation> + </message> + <message> + <source>Error(s) detected in CSV file !</source> + <translation>تم إكتشاف خطأ (أخطاء) في ملف CSV !</translation> + </message> + <message> + <source> more messages skipped]</source> + <translation>المزيد من الرسائل تم تخطيها]</translation> + </message> + <message> + <source>Error</source> + <translation>خطأ</translation> + </message> + <message> + <source>CSV import: writer has errors: +</source> + <translation>إستيراد CSV: الكاتب يحتوي أخطاء: +</translation> + </message> +</context> +<context> + <name>CsvImportWizard</name> + <message> + <source>Error</source> + <translation>خطأ</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>تعذر حساب المفتاح الرئيسي</translation> + </message> +</context> +<context> + <name>CsvParserModel</name> + <message numerus="yes"> + <source>%n byte(s), </source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source>%n row(s), </source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source>%n column(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> +</context> +<context> + <name>DatabaseOpenWidget</name> + <message> + <source>Enter master key</source> + <translation>أدخل المفتاح الرئيسي</translation> + </message> + <message> + <source>Key File:</source> + <translation>ملف المفتاح:</translation> + </message> + <message> + <source>Password:</source> + <translation>كلمه السر:</translation> + </message> + <message> + <source>Browse</source> + <translation>تصّفح</translation> + </message> + <message> + <source>Refresh</source> + <translation>تحديث</translation> + </message> + <message> + <source>Challenge Response:</source> + <translation>استجابة التحدي:</translation> + </message> + <message> + <source>Unable to open the database.</source> + <translation>فتح قاعدة البيانات غير ممكن.</translation> + </message> + <message> + <source>Can't open key file</source> + <translation>لا يمكن فتح ملف المفتاح</translation> + </message> + <message> + <source>Legacy key file format</source> + <translation>تنسيق ملف المفتاح القديم</translation> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't show this warning again</source> + <translation>لا تُظهر هذا التحذير مرة أخرى</translation> + </message> + <message> + <source>All files</source> + <translation>كل الملفات</translation> + </message> + <message> + <source>Key files</source> + <translation>ملفات المفتاح</translation> + </message> + <message> + <source>Select key file</source> + <translation>إختر ملف المفتاح</translation> + </message> +</context> +<context> + <name>DatabaseRepairWidget</name> + <message> + <source>Repair database</source> + <translation>إصلاح قاعدة البيانات</translation> + </message> + <message> + <source>Error</source> + <translation>خطأ</translation> + </message> + <message> + <source>Can't open key file</source> + <translation>لا يمكن فتح ملف المفتاح</translation> + </message> + <message> + <source>Unable to open the database.</source> + <translation>فتح قاعدة البيانات غير ممكن.</translation> + </message> + <message> + <source>Database opened fine. Nothing to do.</source> + <translation>قاعدة البيانات فُتحت بشكل جيد. لا يوجد شيء لفعله.</translation> + </message> + <message> + <source>Success</source> + <translation>نجاح</translation> + </message> + <message> + <source>The database has been successfully repaired +You can now save it.</source> + <translation>تم إصلاح قاعدة البيانات بنجاح +يمكنك الآن حفظها.</translation> + </message> + <message> + <source>Unable to repair the database.</source> + <translation>تعذر إصلاح قاعدة البيانات.</translation> + </message> +</context> +<context> + <name>DatabaseSettingsWidget</name> + <message> + <source>General</source> + <translation>العام</translation> + </message> + <message> + <source>Encryption</source> + <translation>التشفير</translation> + </message> + <message> + <source>Number of rounds too high</source> + <comment>Key transformation rounds</comment> + <translation>عدد الجولات عالي جدًا</translation> + </message> + <message> + <source>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Understood, keep number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cancel</source> + <translation>إلغاء</translation> + </message> + <message> + <source>Number of rounds too low</source> + <comment>Key transformation rounds</comment> + <translation>عدد الجولات منخفض جدًا</translation> + </message> + <message> + <source>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</source> + <translation type="unfinished"/> + </message> + <message> + <source>KDF unchanged</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <source> MiB</source> + <comment>Abbreviation for Mebibytes (KDF settings)</comment> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source> thread(s)</source> + <comment>Threads for parallel execution (KDF settings)</comment> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetEncryption</name> + <message> + <source>Encryption Algorithm:</source> + <translation>خورزامية التشفير:</translation> + </message> + <message> + <source>AES: 256 Bit (default)</source> + <translation>AES: 256 Bit (الإفتراضي)</translation> + </message> + <message> + <source>Twofish: 256 Bit</source> + <translation>Twofish: 256 Bit</translation> + </message> + <message> + <source>Key Derivation Function:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Transform rounds:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Benchmark 1-second delay</source> + <translation type="unfinished"/> + </message> + <message> + <source>Memory Usage:</source> + <translation>إستخدام الذاكرة:</translation> + </message> + <message> + <source>Parallelism:</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetGeneral</name> + <message> + <source>Database Meta Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database name:</source> + <translation>إسم قاعدة البيانات:</translation> + </message> + <message> + <source>Database description:</source> + <translation>وصف قاعدة البيانات:</translation> + </message> + <message> + <source>Default username:</source> + <translation>اسم المستخدم الافتراضي:</translation> + </message> + <message> + <source>History Settings</source> + <translation>إعدادات السجل</translation> + </message> + <message> + <source>Max. history items:</source> + <translation>أقصى عدد للسجلات:</translation> + </message> + <message> + <source>Max. history size:</source> + <translation>أقصى حجم للسجلات:</translation> + </message> + <message> + <source> MiB</source> + <translation> MiB</translation> + </message> + <message> + <source>Use recycle bin</source> + <translation>إستخدام سلة المهملات</translation> + </message> + <message> + <source>Additional Database Settings</source> + <translation>إعدادات قاعدة البيانات الإضافية</translation> + </message> + <message> + <source>Enable &compression (recommended)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseTabWidget</name> + <message> + <source>Root</source> + <comment>Root group</comment> + <translation type="unfinished"/> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>قاعدة بيانات KeePass 2</translation> + </message> + <message> + <source>All files</source> + <translation>كل الملفات</translation> + </message> + <message> + <source>Open database</source> + <translation>فتح قاعدة بيانات</translation> + </message> + <message> + <source>File not found!</source> + <translation>الملف غير موجود!</translation> + </message> + <message> + <source>Unable to open the database.</source> + <translation>فتح قاعدة البيانات غير ممكن.</translation> + </message> + <message> + <source>File opened in read only mode.</source> + <translation>الملف تم فتحه بوضع القراءة فقط.</translation> + </message> + <message> + <source>Open CSV file</source> + <translation>فتح ملف CSV</translation> + </message> + <message> + <source>CSV file</source> + <translation>ملف CSV</translation> + </message> + <message> + <source>All files (*)</source> + <translation>جميع الملفات (*)</translation> + </message> + <message> + <source>Merge database</source> + <translation>دمج قاعدة بيانات</translation> + </message> + <message> + <source>Open KeePass 1 database</source> + <translation>فتح قاعدة بيانات KeePass 1</translation> + </message> + <message> + <source>KeePass 1 database</source> + <translation>قاعدة بيانات KeePass 1</translation> + </message> + <message> + <source>Close?</source> + <translation>إغلاق؟</translation> + </message> + <message> + <source>"%1" is in edit mode. +Discard changes and close anyway?</source> + <translation>"%1" في وضع التحرير. +تجاهل التغييرات وإلاغلاق على أي حال؟</translation> + </message> + <message> + <source>Save changes?</source> + <translation>حفظ التغييرات؟</translation> + </message> + <message> + <source>"%1" was modified. +Save changes?</source> + <translation>"%1" مُعدل. +هل تريد حفظ التغييرات؟</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>فشل كتابة قاعدة البيانات.</translation> + </message> + <message> + <source>Passwords</source> + <translation>كلمه السر</translation> + </message> + <message> + <source>Save database as</source> + <translation>حفظ قاعدة البيانات باسم</translation> + </message> + <message> + <source>Export database to CSV file</source> + <translation>تصدير قاعدة البيانات إلى ملف CSV</translation> + </message> + <message> + <source>Writing the CSV file failed.</source> + <translation>تعذر كتابة ملف CSV.</translation> + </message> + <message> + <source>New database</source> + <translation>قاعدة بيانات جديدة</translation> + </message> + <message> + <source>locked</source> + <translation>مقفل</translation> + </message> + <message> + <source>Lock database</source> + <translation>قفل قاعدة بيانات</translation> + </message> + <message> + <source>Can't lock the database as you are currently editing it. +Please press cancel to finish your changes or discard them.</source> + <translation>لا يمكن إقفال قاعدة البيانات ريثما تقوم بتغييرها. +اضغط على إلغاء لكي تقوم بإنهاء التغييرات أو إلغائها.</translation> + </message> + <message> + <source>This database has been modified. +Do you want to save the database before locking it? +Otherwise your changes are lost.</source> + <translation>قاعدة البيانات هذه قد تم تعديلها. +هل تريد حفظ قاعدة البيانات قبل قفلها؟ +وإلا فإنك ستخسر التغييرات التي قمت بها.</translation> + </message> + <message> + <source>Disable safe saves?</source> + <translation>هل تريد تعطيل الحفظ الآمن؟</translation> + </message> + <message> + <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</source> + <translation>KeePassXC قد فشل في حفظ قاعدة البيانات عدة مرات. هذا غالبا ما يحدث بسبب خدمات مزامنة الملف حيث تقوم بمنع الكتابة على الملف. +أتريد إلغاء خيار الحفظ الامن ثم المحاولة مرة أخرى؟</translation> + </message> +</context> +<context> + <name>DatabaseWidget</name> + <message> + <source>Searching...</source> + <translation>البحث...</translation> + </message> + <message> + <source>Change master key</source> + <translation>تغيير كلمة المرور الرئيسية</translation> + </message> + <message> + <source>Delete entry?</source> + <translation>حذف المدخل؟</translation> + </message> + <message> + <source>Do you really want to delete the entry "%1" for good?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Delete entries?</source> + <translation>حذف المدخلات؟</translation> + </message> + <message> + <source>Do you really want to delete %1 entries for good?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Move entry to recycle bin?</source> + <translation>نقل المُدخل إلى سلة المهملات؟</translation> + </message> + <message> + <source>Do you really want to move entry "%1" to the recycle bin?</source> + <translation>هل تريد حقًا نقل الإدخال "%1" إلى سلة المهملات؟</translation> + </message> + <message> + <source>Move entries to recycle bin?</source> + <translation>نقل المُدخلات إلى سلة المهملات؟</translation> + </message> + <message numerus="yes"> + <source>Do you really want to move %n entry(s) to the recycle bin?</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Execute command?</source> + <translation>تنفيذ الأمر؟</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation type="unfinished"/> + </message> + <message> + <source>Remember my choice</source> + <translation>تذكر إختياري</translation> + </message> + <message> + <source>Delete group?</source> + <translation>حذف المجموعة؟</translation> + </message> + <message> + <source>Do you really want to delete the group "%1" for good?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>تعذر حساب المفتاح الرئيسي</translation> + </message> + <message> + <source>No current database.</source> + <translation>لا يوجد قاعدة بيانات حالية.</translation> + </message> + <message> + <source>No source database, nothing to do.</source> + <translation>لا يوجد قاعدة بيانات مصدرية, لا يوجد شيء لفعله.</translation> + </message> + <message> + <source>Search Results (%1)</source> + <translation>نتائج البحث (%1)</translation> + </message> + <message> + <source>No Results</source> + <translation>لا يوجد نتائج</translation> + </message> + <message> + <source>File has changed</source> + <translation>الملف تغير</translation> + </message> + <message> + <source>The database file has changed. Do you want to load the changes?</source> + <translation>قاعدة البيانات تغيرت. هل تريد تحميل التغييرات؟</translation> + </message> + <message> + <source>Merge Request</source> + <translation>دمج الطلب</translation> + </message> + <message> + <source>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Could not open the new database file while attempting to autoreload this database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Empty recycle bin?</source> + <translation>إفراغ سلة المهملات؟</translation> + </message> + <message> + <source>Are you sure you want to permanently delete everything from your recycle bin?</source> + <translation>هل أنت متأكد من حذف كل شيء من سلة المهملات نهائيًا؟</translation> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DetailsWidget</name> + <message> + <source>Generate TOTP Token</source> + <translation type="unfinished"/> + </message> + <message> + <source>Close</source> + <translation>إغلاق</translation> + </message> + <message> + <source>General</source> + <translation>العام</translation> + </message> + <message> + <source>Password</source> + <translation>كلمه السر</translation> + </message> + <message> + <source>URL</source> + <translation>رابط</translation> + </message> + <message> + <source>Expiration</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username</source> + <translation>اسم المستخدم</translation> + </message> + <message> + <source>Autotype</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searching</source> + <translation>جاري البحث</translation> + </message> + <message> + <source>Attributes</source> + <translation>الخصائص</translation> + </message> + <message> + <source>Attachments</source> + <translation>المرفقات</translation> + </message> + <message> + <source>Notes</source> + <translation>ملاحظات</translation> + </message> + <message> + <source>Window</source> + <translation>النافذة</translation> + </message> + <message> + <source>Sequence</source> + <translation>التسلسل</translation> + </message> + <message> + <source>Search</source> + <translation>بحث</translation> + </message> + <message> + <source>Clear</source> + <translation>مسح</translation> + </message> + <message> + <source>Never</source> + <translation>أبدًا</translation> + </message> + <message> + <source>[PROTECTED]</source> + <translation>[محمي]</translation> + </message> + <message> + <source>Disabled</source> + <translation>مُعطل</translation> + </message> + <message> + <source>Enabled</source> + <translation>مُفعل</translation> + </message> +</context> +<context> + <name>EditEntryWidget</name> + <message> + <source>Entry</source> + <translation>دخول</translation> + </message> + <message> + <source>Advanced</source> + <translation>متقدم</translation> + </message> + <message> + <source>Icon</source> + <translation>رمز</translation> + </message> + <message> + <source>Auto-Type</source> + <translation>الطباعة التلقائية</translation> + </message> + <message> + <source>Properties</source> + <translation>خصائص</translation> + </message> + <message> + <source>History</source> + <translation>التاريخ</translation> + </message> + <message> + <source>SSH Agent</source> + <translation>وكيل SSH</translation> + </message> + <message> + <source>n/a</source> + <translation>n/a</translation> + </message> + <message> + <source>(encrypted)</source> + <translation>(مشفر)</translation> + </message> + <message> + <source>Select private key</source> + <translation>إختر المفتاح السري</translation> + </message> + <message> + <source>File too large to be a private key</source> + <translation>ملف كبير جدًا ليكون مفتاح سري</translation> + </message> + <message> + <source>Failed to open private key</source> + <translation>تعذر فتح المفتاح السري</translation> + </message> + <message> + <source>Entry history</source> + <translation>تاريخ دخول</translation> + </message> + <message> + <source>Add entry</source> + <translation>إضافة مُدخل</translation> + </message> + <message> + <source>Edit entry</source> + <translation>تعديل مُدخل</translation> + </message> + <message> + <source>Different passwords supplied.</source> + <translation>توفير كلمات السر مختلفة.</translation> + </message> + <message> + <source>New attribute</source> + <translation>خاصية جديدة</translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>تأكيد الحذف</translation> + </message> + <message> + <source>Are you sure you want to remove this attribute?</source> + <translation>هل أنت متاكد من إزالة هذه الخاصية؟</translation> + </message> + <message> + <source>[PROTECTED]</source> + <translation>[محمي]</translation> + </message> + <message> + <source>Press reveal to view or edit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Tomorrow</source> + <translation>غدا</translation> + </message> + <message numerus="yes"> + <source>%n week(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source>%n month(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>1 year</source> + <translation>سنة 1</translation> + </message> + <message> + <source>Apply generated password?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to apply the generated password to this entry?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EditEntryWidgetAdvanced</name> + <message> + <source>Additional attributes</source> + <translation>الخصائص الإضافية</translation> + </message> + <message> + <source>Add</source> + <translation>إضافة</translation> + </message> + <message> + <source>Remove</source> + <translation>إزالة</translation> + </message> + <message> + <source>Edit Name</source> + <translation>تعديل الإسم</translation> + </message> + <message> + <source>Protect</source> + <translation>حماية</translation> + </message> + <message> + <source>Reveal</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation>المرفقات</translation> + </message> + <message> + <source>Foreground Color:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Background Color:</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EditEntryWidgetAutoType</name> + <message> + <source>Enable Auto-Type for this entry</source> + <translation>تفعيل الطباعة التلقائية لهذا المدخل</translation> + </message> + <message> + <source>Inherit default Auto-Type sequence from the &group</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Use custom Auto-Type sequence:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Window Associations</source> + <translation type="unfinished"/> + </message> + <message> + <source>+</source> + <translation>+</translation> + </message> + <message> + <source>-</source> + <translation>-</translation> + </message> + <message> + <source>Window title:</source> + <translation>عنوان النافذة:</translation> + </message> + <message> + <source>Use a specific sequence for this association:</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EditEntryWidgetHistory</name> + <message> + <source>Show</source> + <translation>إظهار</translation> + </message> + <message> + <source>Restore</source> + <translation>إستعادة</translation> + </message> + <message> + <source>Delete</source> + <translation>حذف</translation> + </message> + <message> + <source>Delete all</source> + <translation>حذف الكل</translation> + </message> +</context> +<context> + <name>EditEntryWidgetMain</name> + <message> + <source>URL:</source> + <translation>رابط:</translation> + </message> + <message> + <source>Password:</source> + <translation>كلمه السر:</translation> + </message> + <message> + <source>Repeat:</source> + <translation>تكرار:</translation> + </message> + <message> + <source>Title:</source> + <translation>العنوان:</translation> + </message> + <message> + <source>Notes</source> + <translation>ملاحظات</translation> + </message> + <message> + <source>Presets</source> + <translation type="unfinished"/> + </message> + <message> + <source>Toggle the checkbox to reveal the notes section.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username:</source> + <translation>اسم المستخدم:</translation> + </message> + <message> + <source>Expires</source> + <translation>انتهاء</translation> + </message> +</context> +<context> + <name>EditEntryWidgetSSHAgent</name> + <message> + <source>Form</source> + <translation>النموذج</translation> + </message> + <message> + <source>Remove key from agent after</source> + <translation>حذف المفتاح من الوكيل عند</translation> + </message> + <message> + <source> seconds</source> + <translation>ثواني</translation> + </message> + <message> + <source>Fingerprint</source> + <translation>بصمة</translation> + </message> + <message> + <source>Remove key from agent when database is closed/locked</source> + <translation>امسح المفتاح من العميل عندما يتم قفل أو إغلاق قاعدة البيانات.</translation> + </message> + <message> + <source>Public key</source> + <translation>المفتاح العام</translation> + </message> + <message> + <source>Add key to agent when database is opened/unlocked</source> + <translation>أضف مفتاح للعميل عندما يتم فتح قاعدة البيانات أو إلغاء القفل</translation> + </message> + <message> + <source>Comment</source> + <translation>تعليق</translation> + </message> + <message> + <source>Decrypt</source> + <translation>فك تشفير</translation> + </message> + <message> + <source>n/a</source> + <translation>n/a</translation> + </message> + <message> + <source>Copy to clipboard</source> + <translation>نسخ إلى الحافظة</translation> + </message> + <message> + <source>Private key</source> + <translation>المفتاح السري</translation> + </message> + <message> + <source>External file</source> + <translation>ملف خارجي</translation> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>إستعراض...</translation> + </message> + <message> + <source>Attachment</source> + <translation>إرفاق</translation> + </message> + <message> + <source>Add to agent</source> + <translation>إضافة إلى الوكيل</translation> + </message> + <message> + <source>Remove from agent</source> + <translation>حذف من الوكيل</translation> + </message> + <message> + <source>Require user confirmation when this key is used</source> + <translation>يتطلب تأكيد المستخدم عندما يتم إستخدام هذا المفتاح</translation> + </message> +</context> +<context> + <name>EditGroupWidget</name> + <message> + <source>Group</source> + <translation>المجموعة</translation> + </message> + <message> + <source>Icon</source> + <translation>رمز</translation> + </message> + <message> + <source>Properties</source> + <translation>خصائص</translation> + </message> + <message> + <source>Add group</source> + <translation>إضافة مجموعة</translation> + </message> + <message> + <source>Edit group</source> + <translation>تعديل مجموعة</translation> + </message> + <message> + <source>Enable</source> + <translation>تفعيل</translation> + </message> + <message> + <source>Disable</source> + <translation>تعطيل</translation> + </message> + <message> + <source>Inherit from parent group (%1)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EditGroupWidgetMain</name> + <message> + <source>Name</source> + <translation>الاسم</translation> + </message> + <message> + <source>Notes</source> + <translation>ملاحظات</translation> + </message> + <message> + <source>Expires</source> + <translation>انتهاء</translation> + </message> + <message> + <source>Search</source> + <translation>بحث</translation> + </message> + <message> + <source>Auto-Type</source> + <translation>الطباعة التلقائية</translation> + </message> + <message> + <source>&Use default Auto-Type sequence of parent group</source> + <translation type="unfinished"/> + </message> + <message> + <source>Set default Auto-Type se&quence</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EditWidgetIcons</name> + <message> + <source>&Use default icon</source> + <translation>&إستخدم الرمز الإفتراضي</translation> + </message> + <message> + <source>Use custo&m icon</source> + <translation>إستخدم الرمز المخصص</translation> + </message> + <message> + <source>Add custom icon</source> + <translation>إضافة رمز مخصص</translation> + </message> + <message> + <source>Delete custom icon</source> + <translation>حذف الرمز المخصص</translation> + </message> + <message> + <source>Download favicon</source> + <translation>تحميل رمز المفضلة</translation> + </message> + <message> + <source>Unable to fetch favicon.</source> + <translation>تعذر جلب رمز المفضلة.</translation> + </message> + <message> + <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> + <translation type="unfinished"/> + </message> + <message> + <source>Images</source> + <translation>الصور</translation> + </message> + <message> + <source>All files</source> + <translation>كل الملفات</translation> + </message> + <message> + <source>Select Image</source> + <translation>اختر صورة</translation> + </message> + <message> + <source>Can't read icon</source> + <translation>لا يمكن قراءة الرمز</translation> + </message> + <message> + <source>Custom icon already exists</source> + <translation>الرمز المخصص موجود بالفعل</translation> + </message> + <message> + <source>Confirm Delete</source> + <translation>تأكيد الحذف</translation> + </message> + <message> + <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> + <translation>هذا الرمز مستخدم من قبل %1 إدخالات، وسيتم إستبداله بالرمز الإفتراضي. هل أنت متأكد من حذفه؟</translation> + </message> +</context> +<context> + <name>EditWidgetProperties</name> + <message> + <source>Created:</source> + <translation>إنشاء:</translation> + </message> + <message> + <source>Modified:</source> + <translation>تعديل:</translation> + </message> + <message> + <source>Accessed:</source> + <translation>الوصول:</translation> + </message> + <message> + <source>Uuid:</source> + <translation>Uuid:</translation> + </message> + <message> + <source>Plugin Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove</source> + <translation>إزالة</translation> + </message> + <message> + <source>Delete plugin data?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Value</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Entry</name> + <message> + <source> - Clone</source> + <comment>Suffix added to cloned entries</comment> + <translation> - إستنساخ</translation> + </message> +</context> +<context> + <name>EntryAttachmentsModel</name> + <message> + <source>Name</source> + <translation>الاسم</translation> + </message> + <message> + <source>Size</source> + <translation>الحجم</translation> + </message> +</context> +<context> + <name>EntryAttachmentsWidget</name> + <message> + <source>Form</source> + <translation>النموذج</translation> + </message> + <message> + <source>Add</source> + <translation>إضافة</translation> + </message> + <message> + <source>Remove</source> + <translation>إزالة</translation> + </message> + <message> + <source>Open</source> + <translation>افتح</translation> + </message> + <message> + <source>Save</source> + <translation>حفظ</translation> + </message> + <message> + <source>Select files</source> + <translation>اختر الملفات</translation> + </message> + <message numerus="yes"> + <source>Are you sure you want to remove %n attachment(s)?</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>تأكيد الحذف</translation> + </message> + <message> + <source>Save attachments</source> + <translation>حفظ المرفقات</translation> + </message> + <message> + <source>Unable to create directory: +%1</source> + <translation>غير قادر على إنشاء مجلد: +%1</translation> + </message> + <message> + <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> + <translation>هل أنت متاكد من إستبدال الملف الحالي "%1" بالمرفق؟</translation> + </message> + <message> + <source>Confirm overwrite</source> + <translation>تأكيد الإستبدال</translation> + </message> + <message> + <source>Unable to save attachments: +%1</source> + <translation>تعذر حفظ المرفقات: +%1</translation> + </message> + <message> + <source>Unable to open attachment: +%1</source> + <translation>تعذر فتح المرفق: +%1</translation> + </message> + <message> + <source>Unable to open attachments: +%1</source> + <translation>تعذر فتح المرفقات: +%1</translation> + </message> + <message> + <source>Unable to open files: +%1</source> + <translation>تعذر فتح الملفات: +%1</translation> + </message> +</context> +<context> + <name>EntryAttributesModel</name> + <message> + <source>Name</source> + <translation>الاسم</translation> + </message> +</context> +<context> + <name>EntryHistoryModel</name> + <message> + <source>Last modified</source> + <translation>آخر تعديل</translation> + </message> + <message> + <source>Title</source> + <translation>العنوان</translation> + </message> + <message> + <source>Username</source> + <translation>اسم المستخدم</translation> + </message> + <message> + <source>URL</source> + <translation>رابط</translation> + </message> +</context> +<context> + <name>EntryModel</name> + <message> + <source>Ref: </source> + <comment>Reference abbreviation</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Group</source> + <translation>المجموعة</translation> + </message> + <message> + <source>Title</source> + <translation>العنوان</translation> + </message> + <message> + <source>Username</source> + <translation>اسم المستخدم</translation> + </message> + <message> + <source>URL</source> + <translation>رابط</translation> + </message> + <message> + <source>Never</source> + <translation>أبدًا</translation> + </message> + <message> + <source>Password</source> + <translation>كلمه السر</translation> + </message> + <message> + <source>Notes</source> + <translation>ملاحظات</translation> + </message> + <message> + <source>Expires</source> + <translation>انتهاء</translation> + </message> + <message> + <source>Created</source> + <translation>أُنشئت</translation> + </message> + <message> + <source>Modified</source> + <translation type="unfinished"/> + </message> + <message> + <source>Accessed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation>المرفقات</translation> + </message> +</context> +<context> + <name>EntryView</name> + <message> + <source>Customize View</source> + <translation>تخصيص العرض</translation> + </message> + <message> + <source>Hide Usernames</source> + <translation>إخفاء أسماء المستخدم</translation> + </message> + <message> + <source>Hide Passwords</source> + <translation>إخفاء كلمات المرور</translation> + </message> + <message> + <source>Fit to window</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fit to contents</source> + <translation type="unfinished"/> + </message> + <message> + <source>Reset to defaults</source> + <translation>إعادة التعيين إلى الإعدادات الافتراضية</translation> + </message> +</context> +<context> + <name>Group</name> + <message> + <source>Recycle Bin</source> + <translation>سلة المهملات</translation> + </message> +</context> +<context> + <name>HostInstaller</name> + <message> + <source>KeePassXC: Cannot save file!</source> + <translation>KeePassXC: لا يمكن حفظ الملف!</translation> + </message> + <message> + <source>Cannot save the native messaging script file.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>HttpPasswordGeneratorWidget</name> + <message> + <source>Length:</source> + <translation>الطول:</translation> + </message> + <message> + <source>Character Types</source> + <translation>أنواع الرموز</translation> + </message> + <message> + <source>Upper Case Letters</source> + <translation>الحروف الكبيرة</translation> + </message> + <message> + <source>A-Z</source> + <translation>A-Z</translation> + </message> + <message> + <source>Lower Case Letters</source> + <translation>أحرف صغيرة</translation> + </message> + <message> + <source>a-z</source> + <translation>a-z</translation> + </message> + <message> + <source>Numbers</source> + <translation>أرقام</translation> + </message> + <message> + <source>0-9</source> + <translation>0-9</translation> + </message> + <message> + <source>Special Characters</source> + <translation>رموز مخصصة</translation> + </message> + <message> + <source>/*_& ...</source> + <translation>/*_& ...</translation> + </message> + <message> + <source>Exclude look-alike characters</source> + <translation type="unfinished"/> + </message> + <message> + <source>Ensure that the password contains characters from every group</source> + <translation type="unfinished"/> + </message> + <message> + <source>Extended ASCII</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KMessageWidget</name> + <message> + <source>&Close</source> + <translation>&إغلاق</translation> + </message> + <message> + <source>Close message</source> + <translation>إغلاق الرسالة</translation> + </message> +</context> +<context> + <name>Kdbx3Reader</name> + <message> + <source>Unable to calculate master key</source> + <translation>تعذر حساب المفتاح الرئيسي</translation> + </message> + <message> + <source>Unable to issue challenge-response.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>المفتاح أو ملف قاعدة البيانات معطوب.</translation> + </message> +</context> +<context> + <name>Kdbx3Writer</name> + <message> + <source>Unable to issue challenge-response.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>تعذر حساب المفتاح الرئيسي</translation> + </message> +</context> +<context> + <name>Kdbx4Reader</name> + <message> + <source>missing database headers</source> + <translation>رؤوس قاعدة البيانات مفقودة</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>تعذر حساب المفتاح الرئيسي</translation> + </message> + <message> + <source>Invalid header checksum size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Header SHA256 mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header data length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open buffer for KDF parameters in header</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported key derivation function (KDF) or invalid parameters</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy header fields found in KDBX4 file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header binary size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass variant map version.</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name data</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value data</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Bool entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry type</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map field type size</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Kdbx4Writer</name> + <message> + <source>Invalid symmetric cipher algorithm.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid symmetric cipher IV size.</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>تعذر حساب المفتاح الرئيسي</translation> + </message> + <message> + <source>Failed to serialize KDF parameters variant map</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxReader</name> + <message> + <source>Invalid cipher uuid length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid compression flags length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported compression algorithm</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid master seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform rounds size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid start bytes size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid random stream id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner random stream cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>ليس قاعدة بيانات KeePass</translation> + </message> + <message> + <source>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass 2 database version.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxXmlReader</name> + <message> + <source>XML parsing failure: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>No root group</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing icon uuid or data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing custom data key or value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Multiple group elements</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null group uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableAutoType value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableSearching value</source> + <translation type="unfinished"/> + </message> + <message> + <source>No group uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null DeleteObject uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing DeletedObject uuid or time</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null entry uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element in history entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>No entry uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element with different uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decrypt entry string</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate custom attribute found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry string key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate attachment found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry binary key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-type association window or sequence missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid bool value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid date time value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color value</source> + <translation>قيمة اللون غير صحيحة</translation> + </message> + <message> + <source>Invalid color rgb part</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number value</source> + <translation>قيمة الرقم غير صحيحة</translation> + </message> + <message> + <source>Invalid uuid value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decompress binary</source> + <extracomment>Translator meant is a binary data inside an entry</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KeePass1OpenWidget</name> + <message> + <source>Import KeePass1 database</source> + <translation>إستيراد قاعدة بيانات KeePass1</translation> + </message> + <message> + <source>Unable to open the database.</source> + <translation>فتح قاعدة البيانات غير ممكن.</translation> + </message> +</context> +<context> + <name>KeePass1Reader</name> + <message> + <source>Unable to read keyfile.</source> + <translation>يتعذر قراءة ملف المفتاح.</translation> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>ليس قاعدة بيانات KeePass</translation> + </message> + <message> + <source>Unsupported encryption algorithm.</source> + <translation>خورزامية التشفير غير مدعومة.</translation> + </message> + <message> + <source>Unsupported KeePass database version.</source> + <translation>إصدار قاعدة بيانات KeePass غير مدعوم.</translation> + </message> + <message> + <source>Unable to read encryption IV</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of groups</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid content hash size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of transform rounds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to construct group tree</source> + <translation type="unfinished"/> + </message> + <message> + <source>Root</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>تعذر حساب المفتاح الرئيسي</translation> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>المفتاح أو ملف قاعدة البيانات معطوب.</translation> + </message> + <message> + <source>Key transformation failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read group field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group access time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group level field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing group id or level</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing entry field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field size</source> + <translation>إدخال حقل الحجم غير صحيح</translation> + </message> + <message> + <source>Read entry field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry uuid field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field type</source> + <translation>نوع حقل الإدخال غير صحيح</translation> + </message> +</context> +<context> + <name>Main</name> + <message> + <source>Existing single-instance lock file is invalid. Launching new instance.</source> + <translation type="unfinished"/> + </message> + <message> + <source>The lock file could not be created. Single-instance mode disabled.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Another instance of KeePassXC is already running.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fatal error while testing the cryptographic functions.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC - Error</source> + <translation>KeePassXC - خطأ</translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <source>&Database</source> + <translation>&قاعدة البيانات</translation> + </message> + <message> + <source>&Recent databases</source> + <translation>&قواعد البيانات الحديثة</translation> + </message> + <message> + <source>Import</source> + <translation>إستيراد</translation> + </message> + <message> + <source>&Help</source> + <translation>&مساعدة</translation> + </message> + <message> + <source>E&ntries</source> + <translation>المُدخلات</translation> + </message> + <message> + <source>Copy att&ribute to clipboard</source> + <translation>نسخ الخاصية إلى الحافظة</translation> + </message> + <message> + <source>Time-based one-time password</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Groups</source> + <translation>&المجموعات</translation> + </message> + <message> + <source>&Tools</source> + <translation>&الأدوات</translation> + </message> + <message> + <source>&Quit</source> + <translation>&إغلاق</translation> + </message> + <message> + <source>&About</source> + <translation>&حول</translation> + </message> + <message> + <source>&Open database...</source> + <translation>&فتح قاعدة البيانات...</translation> + </message> + <message> + <source>&Save database</source> + <translation>&حفظ قاعدة البيانات</translation> + </message> + <message> + <source>&Close database</source> + <translation>&إغلاق قاعدة البيانات</translation> + </message> + <message> + <source>&New database</source> + <translation>&إنشاء قاعدة بيانات</translation> + </message> + <message> + <source>Merge from KeePassX database</source> + <translation>دمج من قاعدة بيانات KeePassX</translation> + </message> + <message> + <source>&Add new entry</source> + <translation>&إضافة مُدخل جديد</translation> + </message> + <message> + <source>&View/Edit entry</source> + <translation>&مشاهدة/تعديل مدخل</translation> + </message> + <message> + <source>&Delete entry</source> + <translation>&حذف مدخل</translation> + </message> + <message> + <source>&Add new group</source> + <translation>&إضافة مجموعة جديدة</translation> + </message> + <message> + <source>&Edit group</source> + <translation>&تعديل المجموعة</translation> + </message> + <message> + <source>&Delete group</source> + <translation>&حذف المجموعة</translation> + </message> + <message> + <source>Sa&ve database as...</source> + <translation>حفظ قاعدة البيانات بأسم...</translation> + </message> + <message> + <source>Change &master key...</source> + <translation>تغيير &المفتاح الرئيسي...</translation> + </message> + <message> + <source>&Database settings</source> + <translation>&إعدادات قاعدة البيانات</translation> + </message> + <message> + <source>Database settings</source> + <translation>إعدادات قاعدة البيانات</translation> + </message> + <message> + <source>&Clone entry</source> + <translation>&إستنساخ مدخل</translation> + </message> + <message> + <source>&Find</source> + <translation>&بحث</translation> + </message> + <message> + <source>Copy &username</source> + <translation>نسخ &اسم المستخدم</translation> + </message> + <message> + <source>Copy username to clipboard</source> + <translation>نسخ اسم المستخدم إلى الحافظة</translation> + </message> + <message> + <source>Cop&y password</source> + <translation>نسخ كلمة المرور</translation> + </message> + <message> + <source>Copy password to clipboard</source> + <translation>نسخ كلمة المرور إلى الحافظة</translation> + </message> + <message> + <source>&Settings</source> + <translation>&الإعدادات</translation> + </message> + <message> + <source>Password Generator</source> + <translation>مولد كلمة السر</translation> + </message> + <message> + <source>&Perform Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Open URL</source> + <translation>&فتح الرابط</translation> + </message> + <message> + <source>&Lock databases</source> + <translation>&قفل قواعد البيانات</translation> + </message> + <message> + <source>&Title</source> + <translation>&العنوان</translation> + </message> + <message> + <source>Copy title to clipboard</source> + <translation>نسخ العنوان إلى الحافظة</translation> + </message> + <message> + <source>&URL</source> + <translation>&رابط</translation> + </message> + <message> + <source>Copy URL to clipboard</source> + <translation>نسخ الرابط إلى الحافظة</translation> + </message> + <message> + <source>&Notes</source> + <translation>&الملاحظات</translation> + </message> + <message> + <source>Copy notes to clipboard</source> + <translation>نسخ الملاحظات إلى الحافظة</translation> + </message> + <message> + <source>&Export to CSV file...</source> + <translation>&تصدير كملف CSV...</translation> + </message> + <message> + <source>Import KeePass 1 database...</source> + <translation>إستيراد قاعدة بيانات KeePass 1...</translation> + </message> + <message> + <source>Import CSV file...</source> + <translation>إستيراد ملف CSV...</translation> + </message> + <message> + <source>Re&pair database...</source> + <translation>إصلاح قاعدة البيانات...</translation> + </message> + <message> + <source>Show TOTP</source> + <translation type="unfinished"/> + </message> + <message> + <source>Set up TOTP...</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy &TOTP</source> + <translation type="unfinished"/> + </message> + <message> + <source>E&mpty recycle bin</source> + <translation>إفراغ سلة المهملات</translation> + </message> + <message> + <source>Clear history</source> + <translation>مسح السجل</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation type="unfinished"/> + </message> + <message> + <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> + <translation type="unfinished"/> + </message> + <message> + <source>read-only</source> + <translation type="unfinished"/> + </message> + <message> + <source>Settings</source> + <translation>الإعدادات</translation> + </message> + <message> + <source>Toggle window</source> + <translation type="unfinished"/> + </message> + <message> + <source>Quit KeePassXC</source> + <translation>إغلاق KeePassXC</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>قاعدة بيانات KeePass 2</translation> + </message> + <message> + <source>All files</source> + <translation>كل الملفات</translation> + </message> + <message> + <source>Open database</source> + <translation>فتح قاعدة بيانات</translation> + </message> + <message> + <source>Save repaired database</source> + <translation>حفظ قاعدة البيانات المُصَحَّحة</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>فشل كتابة قاعدة البيانات.</translation> + </message> + <message> + <source>Please touch the button on your YubiKey!</source> + <translation type="unfinished"/> + </message> + <message> + <source>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>OpenSSHKey</name> + <message> + <source>Invalid key file, expecting an OpenSSH key</source> + <translation type="unfinished"/> + </message> + <message> + <source>PEM boundary mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>Base64 decoding failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file way too small.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file magic header id invalid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Found zero keys</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to read public key.</source> + <translation>تعذر قراءة المفتاح العام.</translation> + </message> + <message> + <source>Corrupted key file, reading private key failed</source> + <translation>ملف المفتاح معطوب، فشل قراءة المفتاح الخاص.</translation> + </message> + <message> + <source>No private key payload to decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>Trying to run KDF without cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Passphrase is required to decrypt this key</source> + <translation>عبارة المرور مطلوبة لفك تشفير المفتاح</translation> + </message> + <message> + <source>Key derivation failed, key file corrupted?</source> + <translation>فشل إشتقاق المفتاح، ربما ملف المفتاح معطوب؟</translation> + </message> + <message> + <source>Decryption failed, wrong passphrase?</source> + <translation>فشل فك التشفير، ربما عبارة المرور خاطئة؟</translation> + </message> + <message> + <source>Unexpected EOF while reading public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write public key as it is empty</source> + <translation>لا يمكن كتابة المفتاح العام لأنه فارغ</translation> + </message> + <message> + <source>Unexpected EOF when writing public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write private key as it is empty</source> + <translation>لا يمكن كتابة المفتاح الخاص لأنه فارغ</translation> + </message> + <message> + <source>Unexpected EOF when writing private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported key type: %1</source> + <translation>نوع مفتاح غير مدعوم: %1</translation> + </message> + <message> + <source>Unknown cipher: %1</source> + <translation>تشفير غير معروف: %1</translation> + </message> + <message> + <source>Cipher IV is too short for MD5 kdf</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: %1</source> + <translation>نوع مفتاح غير معروف: %1</translation> + </message> +</context> +<context> + <name>OptionDialog</name> + <message> + <source>Dialog</source> + <translation>الحوار</translation> + </message> + <message> + <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable KeePassHTTP server</source> + <translation>تفعيل خادم KeePassHTTP</translation> + </message> + <message> + <source>General</source> + <translation>العام</translation> + </message> + <message> + <source>Sh&ow a notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>عرض إشعار عند طلب بيانات الإعتماد</translation> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return only best matching entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>طلب إلغاء القفل في حال تم الإقفال</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Match URL schemes</source> + <translation type="unfinished"/> + </message> + <message> + <source>Sort matching entries by &username</source> + <translation type="unfinished"/> + </message> + <message> + <source>Sort &matching entries by title</source> + <translation type="unfinished"/> + </message> + <message> + <source>R&emove all shared encryption keys from active database</source> + <translation>إزالة جميع مفاتيح التشفير المشتركة من قاعدة البيانات النشطة</translation> + </message> + <message> + <source>Re&move all stored permissions from entries in active database</source> + <translation>إزالة كافة الصلاحيات المخزنة من المُدخلات في قاعدة البيانات النشطة</translation> + </message> + <message> + <source>Password Generator</source> + <translation>مولد كلمة السر</translation> + </message> + <message> + <source>Advanced</source> + <translation>متقدم</translation> + </message> + <message> + <source>Always allow &access to entries</source> + <translation>السماح دائمًا &بالوصول للمُدخلات</translation> + </message> + <message> + <source>Always allow &updating entries</source> + <translation>السماح دائمًا &بتحديث المُدخلات</translation> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>قاعدة البيانات المحددة هي التي يجب تتصل مع العميل فقط.</translation> + </message> + <message> + <source>Searc&h in all opened databases for matching entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation type="unfinished"/> + </message> + <message> + <source>HTTP Port:</source> + <translation>منفذ HTTP:</translation> + </message> + <message> + <source>Default port: 19455</source> + <translation>المنفذ الافتراضي: 19455</translation> + </message> + <message> + <source>KeePassXC will listen to this port on 127.0.0.1</source> + <translation>KeePassXC سيعمل على هذا المنفذ في 127.0.0.1</translation> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation><b>تحذير:</b> قد تكون الخيارات التالية خطيرة!</translation> + </message> + <message> + <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot bind to privileged ports</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot bind to privileged ports below 1024! +Using default port 19455.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>PasswordGeneratorWidget</name> + <message> + <source>%p%</source> + <translation>%p%</translation> + </message> + <message> + <source>Password:</source> + <translation>كلمه السر:</translation> + </message> + <message> + <source>strength</source> + <comment>Password strength</comment> + <translation>القوة</translation> + </message> + <message> + <source>entropy</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password</source> + <translation>كلمه السر</translation> + </message> + <message> + <source>Character Types</source> + <translation>أنواع الرموز</translation> + </message> + <message> + <source>Upper Case Letters</source> + <translation>الحروف الكبيرة</translation> + </message> + <message> + <source>Lower Case Letters</source> + <translation>أحرف صغيرة</translation> + </message> + <message> + <source>Numbers</source> + <translation>أرقام</translation> + </message> + <message> + <source>Special Characters</source> + <translation>رموز مخصصة</translation> + </message> + <message> + <source>Extended ASCII</source> + <translation type="unfinished"/> + </message> + <message> + <source>Exclude look-alike characters</source> + <translation type="unfinished"/> + </message> + <message> + <source>Pick characters from every group</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Length:</source> + <translation>&الطول:</translation> + </message> + <message> + <source>Passphrase</source> + <translation>عبارة سر</translation> + </message> + <message> + <source>Wordlist:</source> + <translation>قائمة الكلمات:</translation> + </message> + <message> + <source>Word Count:</source> + <translation>عدد الكلمات:</translation> + </message> + <message> + <source>Word Separator:</source> + <translation>فاصل الكلمة:</translation> + </message> + <message> + <source>Generate</source> + <translation>توليد</translation> + </message> + <message> + <source>Copy</source> + <translation>نسخة</translation> + </message> + <message> + <source>Accept</source> + <translation>قبول</translation> + </message> + <message> + <source>Close</source> + <translation>إغلاق</translation> + </message> + <message> + <source>Apply</source> + <translation>تطبيق</translation> + </message> + <message> + <source>Entropy: %1 bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password Quality: %1</source> + <translation>جودة كلمة المرور: %1</translation> + </message> + <message> + <source>Poor</source> + <comment>Password quality</comment> + <translation>ضعيف جدا</translation> + </message> + <message> + <source>Weak</source> + <comment>Password quality</comment> + <translation>ضعيفة</translation> + </message> + <message> + <source>Good</source> + <comment>Password quality</comment> + <translation>جيدة</translation> + </message> + <message> + <source>Excellent</source> + <comment>Password quality</comment> + <translation>ممتازة</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <source>Database not opened</source> + <translation>لم يتم فتح قاعدة البيانات</translation> + </message> + <message> + <source>Database hash not available</source> + <translation type="unfinished"/> + </message> + <message> + <source>Client public key not received</source> + <translation>لم يتم تلقي المفتاح العام للعميل</translation> + </message> + <message> + <source>Cannot decrypt message</source> + <translation>لا يمكن فك تشفير الرسالة</translation> + </message> + <message> + <source>Timeout or cannot connect to KeePassXC</source> + <translation>نفذ الوقت أو لا يمكن الإتصال على KeePassXC</translation> + </message> + <message> + <source>Action cancelled or denied</source> + <translation>أُلغي الإجراء أو رُفض</translation> + </message> + <message> + <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> + <translation>لا يمكن تشفير الرسالة أو لم يتم العثور على المفتاح العام. هل تم تمكين المراسلة الأساسية في KeePassXC؟</translation> + </message> + <message> + <source>KeePassXC association failed, try again</source> + <translation>تعذر إرتباط KeePassXC، حاول مرة أخرى</translation> + </message> + <message> + <source>Key change was not successful</source> + <translation>لم يكن تغيير المفتاح ناجحًا</translation> + </message> + <message> + <source>Encryption key is not recognized</source> + <translation>لم يتم التعرف على مفتاح التشفير</translation> + </message> + <message> + <source>No saved databases found</source> + <translation>لم يتم العثور على قواعد بيانات محفوظة</translation> + </message> + <message> + <source>Incorrect action</source> + <translation>إجراء غير صحيح</translation> + </message> + <message> + <source>Empty message received</source> + <translation>أُستلمت رسالة فارغة</translation> + </message> + <message> + <source>No URL provided</source> + <translation>لم يتم تقديم رابط</translation> + </message> + <message> + <source>No logins found</source> + <translation>لم يتم العثور على عمليات تسجيل دخول</translation> + </message> + <message> + <source>Unknown error</source> + <translation>خطأ مجهول</translation> + </message> + <message> + <source>Add a new entry to a database.</source> + <translation>إضافة مُدخل إلى قاعدة البيانات.</translation> + </message> + <message> + <source>Path of the database.</source> + <translation>مسار قاعدة البيانات.</translation> + </message> + <message> + <source>Key file of the database.</source> + <translation>ملف المفتاح لقاعدة البيانات.</translation> + </message> + <message> + <source>path</source> + <translation>المسار</translation> + </message> + <message> + <source>Username for the entry.</source> + <translation>إسم المستخدم للمُدخل.</translation> + </message> + <message> + <source>username</source> + <translation>إسم المستخدم</translation> + </message> + <message> + <source>URL for the entry.</source> + <translation>الرابط للمُدخل.</translation> + </message> + <message> + <source>URL</source> + <translation>رابط</translation> + </message> + <message> + <source>Prompt for the entry's password.</source> + <translation>المطالبة بكلمة مرور المُدخل.</translation> + </message> + <message> + <source>Generate a password for the entry.</source> + <translation>إنشاء كلمة المرور للمُدخل.</translation> + </message> + <message> + <source>Length for the generated password.</source> + <translation>طول كلمة المرور المُنشئة.</translation> + </message> + <message> + <source>length</source> + <translation>الطول</translation> + </message> + <message> + <source>Path of the entry to add.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy an entry's password to the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to clip.</source> + <comment>clip = copy to clipboard</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout in seconds before clearing the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Edit an entry.</source> + <translation>تعديل مُدخل.</translation> + </message> + <message> + <source>Title for the entry.</source> + <translation>عنوان المُدخل</translation> + </message> + <message> + <source>title</source> + <translation>العنوان</translation> + </message> + <message> + <source>Path of the entry to edit.</source> + <translation>مسار المُدخل للتعديل.</translation> + </message> + <message> + <source>Estimate the entropy of a password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password for which to estimate the entropy.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Perform advanced analysis on the password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Extract and print the content of a database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database to extract.</source> + <translation>مسار قاعدة البيانات للإستخراج.</translation> + </message> + <message> + <source>Insert password to unlock %1: </source> + <translation>ادخل كلمة المرور لإلغاء قفل %1:</translation> + </message> + <message> + <source>Failed to load key file %1 : %2</source> + <translation>تعذر تحميل ملف المفتاح %1 : %2</translation> + </message> + <message> + <source>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation>تحذير: أنت تستخدم تنسيق ملف مفتاح قديم قد يصبح +غير مُعتمد في المستقبل. + +يرجى النظر في إنشاء ملف مفتاح جديد.</translation> + </message> + <message> + <source> + +Available commands: +</source> + <translation> + +الأوامر المتاحة: +</translation> + </message> + <message> + <source>Name of the command to execute.</source> + <translation>اسم الأمر للتنفيذ.</translation> + </message> + <message> + <source>List database entries.</source> + <translation>إدراج مُدخلات قاعدة البيانات.</translation> + </message> + <message> + <source>Path of the group to list. Default is /</source> + <translation type="unfinished"/> + </message> + <message> + <source>Find entries quickly.</source> + <translation>البحث عن المُدخلات بسرعة.</translation> + </message> + <message> + <source>Search term.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Merge two databases.</source> + <translation>دمج قاعدتي بيانات.</translation> + </message> + <message> + <source>Path of the database to merge into.</source> + <translation>مسار قاعدة البيانات المُراد دمجها.</translation> + </message> + <message> + <source>Path of the database to merge from.</source> + <translation>مسار قاعدة البيانات المُراد الدمج منها.</translation> + </message> + <message> + <source>Use the same credentials for both database files.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file of the database to merge from.</source> + <translation>ملف المفتاح لقاعدة البيانات للدمج منه.</translation> + </message> + <message> + <source>Show an entry's information.</source> + <translation>إظهار معلومات الإدخال.</translation> + </message> + <message> + <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> + <translation type="unfinished"/> + </message> + <message> + <source>attribute</source> + <translation>خاصية</translation> + </message> + <message> + <source>Name of the entry to show.</source> + <translation>اسم الإدخال للعرض.</translation> + </message> + <message> + <source>NULL device</source> + <translation type="unfinished"/> + </message> + <message> + <source>error reading from device</source> + <translation type="unfinished"/> + </message> + <message> + <source>file empty ! +</source> + <translation>ملف فارغ ! +</translation> + </message> + <message> + <source>malformed string</source> + <translation type="unfinished"/> + </message> + <message> + <source>missing closing quote</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Twofish: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>ChaCha20: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Argon2 (KDBX 4 – recommended)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 4)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 3.1)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Group</source> + <translation>المجموعة</translation> + </message> + <message> + <source>Title</source> + <translation>العنوان</translation> + </message> + <message> + <source>Username</source> + <translation>اسم المستخدم</translation> + </message> + <message> + <source>Password</source> + <translation>كلمه السر</translation> + </message> + <message> + <source>Notes</source> + <translation>ملاحظات</translation> + </message> + <message> + <source>Last Modified</source> + <translation>آخر تعديل</translation> + </message> + <message> + <source>Created</source> + <translation>أُنشئت</translation> + </message> + <message> + <source>Legacy Browser Integration</source> + <translation type="unfinished"/> + </message> + <message> + <source>Browser Integration</source> + <translation type="unfinished"/> + </message> + <message> + <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source> + <translation type="unfinished"/> + </message> + <message> + <source>Press</source> + <translation type="unfinished"/> + </message> + <message> + <source>Passive</source> + <translation type="unfinished"/> + </message> + <message> + <source>SSH Agent</source> + <translation>وكيل SSH</translation> + </message> + <message> + <source>Generate a new random diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Word count for the diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>count</source> + <translation>العدد</translation> + </message> + <message> + <source>Wordlist for the diceware generator. +[Default: EFF English]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a new random password.</source> + <translation>إنشاء كلمة مرور عشوائية جديدة.</translation> + </message> + <message> + <source>Length of the generated password.</source> + <translation>طول كلمة المرور المُنشئة.</translation> + </message> + <message> + <source>Use lowercase characters in the generated password.</source> + <translation>إستخدام الأحرف الصغيرة في كلمة المرور المُنشئة.</translation> + </message> + <message> + <source>Use uppercase characters in the generated password.</source> + <translation>إستخدام الأحرف الكبيرة في كلمة المرور المُنشئة.</translation> + </message> + <message> + <source>Use numbers in the generated password.</source> + <translation>إستخدام الأرقام في كلمة المرور المُنشئة.</translation> + </message> + <message> + <source>Use special characters in the generated password.</source> + <translation>إستخدام رموز مخصصة في كلمة المرور المُنشئة.</translation> + </message> + <message> + <source>Use extended ASCII in the generated password.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QtIOCompressor</name> + <message> + <source>Internal zlib error when compressing: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Error writing to underlying device: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Error opening underlying device: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Error reading data from underlying device: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Internal zlib error when decompressing: </source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QtIOCompressor::open</name> + <message> + <source>The gzip format not supported in this version of zlib.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Internal zlib error: </source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SearchWidget</name> + <message> + <source>Search...</source> + <translation>البحث...</translation> + </message> + <message> + <source>Search</source> + <translation>بحث</translation> + </message> + <message> + <source>Clear</source> + <translation>مسح</translation> + </message> + <message> + <source>Case Sensitive</source> + <translation type="unfinished"/> + </message> + <message> + <source>Limit search to selected group</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Service</name> + <message> + <source>KeePassXC: New key association request</source> + <translation type="unfinished"/> + </message> + <message> + <source>You have received an association request for the above key. +If you would like to allow it access to your KeePassXC database +give it a unique name to identify and accept it.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: الكتابة على المفتاح الحالي؟</translation> + </message> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: تحديث المُدخل</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>هل تريد تحديث المعلومات في %1 - %2؟</translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: قاعدة البيانات أقفلت!</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>قاعدة البيانات هذه قد أقفلت! +يرجى إلغاء قفل قاعدة البيانات المحددة أو اختيار واحدة أخرى تكون مفتوحة.</translation> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: حُذِفت المفاتيح من قاعدة البيانات</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: لم يُعثر على أية مفاتيح</translation> + </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation>لم يُعثر على مفاتيح التشفير المشتركة في إعدادات KeePassHttp.</translation> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: الإعدادات غير متاحة!</translation> + </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Removing stored permissions...</source> + <translation>إزالة الصلاحيات المخزنة...</translation> + </message> + <message> + <source>Abort</source> + <translation>إجهاض </translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: حُذفت الصلاحيات</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entries.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation type="unfinished"/> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SettingsWidget</name> + <message> + <source>Application Settings</source> + <translation>إعدادات التطبيق</translation> + </message> + <message> + <source>General</source> + <translation>العام</translation> + </message> + <message> + <source>Security</source> + <translation>الأمن</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SettingsWidgetGeneral</name> + <message> + <source>Basic Settings</source> + <translation>الإعدادات الأساسية</translation> + </message> + <message> + <source>Start only a single instance of KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remember last databases</source> + <translation>تذكر قواعد البيانات الأخيرة</translation> + </message> + <message> + <source>Remember last key files and security dongles</source> + <translation type="unfinished"/> + </message> + <message> + <source>Load previous databases on startup</source> + <translation>إستعادة قواعد البيانات السابقة عند بدء التشغيل</translation> + </message> + <message> + <source>Automatically save on exit</source> + <translation>الحفظ تلقائيًا عند الإغلاق</translation> + </message> + <message> + <source>Automatically save after every change</source> + <translation>الحفظ تلقائيًا بعد كل تعديل</translation> + </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation type="unfinished"/> + </message> + <message> + <source>Minimize when copying to clipboard</source> + <translation>تصغير عند النسخ إلى الحافظة</translation> + </message> + <message> + <source>Minimize window at application startup</source> + <translation>تصغير النافذة عند بدء تشغيل التطبيق</translation> + </message> + <message> + <source>Use group icon on entry creation</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide the Details view</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show a system tray icon</source> + <translation>إظهار علامة تبويب</translation> + </message> + <message> + <source>Hide window to system tray when minimized</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide window to system tray instead of app exit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Dark system tray icon</source> + <translation type="unfinished"/> + </message> + <message> + <source>Language</source> + <translation>اللغة</translation> + </message> + <message> + <source>Auto-Type</source> + <translation>الطباعة التلقائية</translation> + </message> + <message> + <source>Use entry title to match windows for global Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use entry URL to match windows for global Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Always ask before performing Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Global Auto-Type shortcut</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-Type delay</source> + <translation>زمن التأخير للطباعة التلقائية</translation> + </message> + <message> + <source> ms</source> + <comment>Milliseconds</comment> + <translation>م.ثانية</translation> + </message> + <message> + <source>Startup</source> + <translation>بدأ التشغيل</translation> + </message> + <message> + <source>File Management</source> + <translation>إدارة الملفات</translation> + </message> + <message> + <source>Safely save database files (may be incompatible with Dropbox, etc)</source> + <translation>حفظ ملفات قواعد البيانات بأمان (قد يكون غير متوافق مع Dropbox، إلخ)</translation> + </message> + <message> + <source>Backup database file before saving</source> + <translation>إحتفظ بنسخة من ملف قاعدة البيانات قبل الحفظ</translation> + </message> + <message> + <source>Entry Management</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>العام</translation> + </message> +</context> +<context> + <name>SettingsWidgetSecurity</name> + <message> + <source>Timeouts</source> + <translation type="unfinished"/> + </message> + <message> + <source>Clear clipboard after</source> + <translation>امسح الذاكرة بعد</translation> + </message> + <message> + <source> sec</source> + <comment>Seconds</comment> + <translation> ثانية</translation> + </message> + <message> + <source>Lock databases after inactivity of</source> + <translation>أغلق قواعد البيانات بعد حالة عدم النشاط ل</translation> + </message> + <message> + <source>Convenience</source> + <translation type="unfinished"/> + </message> + <message> + <source>Lock databases when session is locked or lid is closed</source> + <translation>اقفل قواعد البيانات عندما تنقفل الجلسة أو يتم إغلاق اللابتوب</translation> + </message> + <message> + <source>Lock databases after minimizing the window</source> + <translation>قفل قواعد البيانات عند تصغير النافذة</translation> + </message> + <message> + <source>Don't require password repeat when it is visible</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show passwords in cleartext by default</source> + <translation>إظهار كلمة المرور كنص إفتراضيًا</translation> + </message> + <message> + <source>Hide passwords in the preview panel</source> + <translation>إخفاء كلمات المرور في نافذة المعاينة</translation> + </message> + <message> + <source>Hide entry notes by default</source> + <translation>إخفاء مُدخل الملاحظات إفتراضيًا</translation> + </message> + <message> + <source>Privacy</source> + <translation>الخصوصية</translation> + </message> + <message> + <source>Use Google as fallback for downloading website icons</source> + <translation type="unfinished"/> + </message> + <message> + <source>Re-lock previously locked database after performing Auto-Type</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SetupTotpDialog</name> + <message> + <source>Setup TOTP</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key:</source> + <translation>المفتاح:</translation> + </message> + <message> + <source>Default RFC 6238 token settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Steam token settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use custom settings</source> + <translation>إستخدم أعدادات مخصصة</translation> + </message> + <message> + <source>Note: Change these settings only if you know what you are doing.</source> + <translation>ملاحظة: لاتغير هذه الإعدادات إلا إذا كنت تعلم ماذا تفعل.</translation> + </message> + <message> + <source>Time step:</source> + <translation type="unfinished"/> + </message> + <message> + <source>8 digits</source> + <translation>8 أرقام</translation> + </message> + <message> + <source>6 digits</source> + <translation>6 أرقام</translation> + </message> + <message> + <source>Code size:</source> + <translation>حجم الكود:</translation> + </message> + <message> + <source> sec</source> + <comment>Seconds</comment> + <translation> ثانية</translation> + </message> +</context> +<context> + <name>TotpDialog</name> + <message> + <source>Timed Password</source> + <translation>كلمة مرور موقوته</translation> + </message> + <message> + <source>000000</source> + <translation>000000</translation> + </message> + <message> + <source>Copy</source> + <translation>نسخ</translation> + </message> + <message> + <source>Expires in</source> + <translation>تنتهي في</translation> + </message> + <message> + <source>seconds</source> + <translation>ثواني</translation> + </message> +</context> +<context> + <name>UnlockDatabaseWidget</name> + <message> + <source>Unlock database</source> + <translation>إلغاء قفل قاعدة البيانات</translation> + </message> +</context> +<context> + <name>WelcomeWidget</name> + <message> + <source>Start storing your passwords securely in a KeePassXC database</source> + <translation>إبدأ بتخزين كلمات مرورك بأمان في قاعدة بيانات KeePassXC</translation> + </message> + <message> + <source>Create new database</source> + <translation>إنشاء قاعدة بيانات جديدة</translation> + </message> + <message> + <source>Open existing database</source> + <translation>فتح قاعدة بيانات حالية</translation> + </message> + <message> + <source>Import from KeePass 1</source> + <translation>استيراد من KeePass 1</translation> + </message> + <message> + <source>Import from CSV</source> + <translation>استيراد من CSV</translation> + </message> + <message> + <source>Recent databases</source> + <translation>قواعد البيانات الحديثة</translation> + </message> + <message> + <source>Welcome to KeePassXC %1</source> + <translation>مرحبا بك في KeePassXC %1</translation> + </message> +</context> +<context> + <name>main</name> + <message> + <source>Remove an entry from the database.</source> + <translation>حذف مُدخل من قاعدة البيانات.</translation> + </message> + <message> + <source>Path of the database.</source> + <translation>مسار قاعدة البيانات.</translation> + </message> + <message> + <source>Path of the entry to remove.</source> + <translation>مسار المُدخل للحذف.</translation> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation>KeePassXC - مدير كلمات المرور لعدة أنظمة</translation> + </message> + <message> + <source>filenames of the password databases to open (*.kdbx)</source> + <translation>أسماء ملفات قواعد بيانات كلمات المرور للفتح (*.kdbx)</translation> + </message> + <message> + <source>path to a custom config file</source> + <translation>مسار ملف التكوين المخصص</translation> + </message> + <message> + <source>key file of the database</source> + <translation>ملف المفتاح لقاعدة البيانات</translation> + </message> + <message> + <source>read password of the database from stdin</source> + <translation>قراءة كلمة مرور قاعدة البيانات من stdin</translation> + </message> + <message> + <source>Parent window handle</source> + <translation type="unfinished"/> + </message> +</context> +</TS> \ No newline at end of file diff --git a/share/translations/keepassx_ca.ts b/share/translations/keepassx_ca.ts index f76ace243..077dcaf15 100644 --- a/share/translations/keepassx_ca.ts +++ b/share/translations/keepassx_ca.ts @@ -17,10 +17,6 @@ <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> <translation>KeepassXC es distribueix sota els termes de la Llicència Pública General GNU (GPL) versió 2 o (segons la vostra opció) versió 3.</translation> </message> - <message> - <source>Project Maintainers:</source> - <translation>Mantenidors del projecte:</translation> - </message> <message> <source>Contributors</source> <translation>Contribuïdors</translation> @@ -71,6 +67,19 @@ Nucli: %3 %4</translation> <source>Enabled extensions:</source> <translation>Extensions habilitades:</translation> </message> + <message> + <source>Project Maintainers:</source> + <translation>Mantenidors del projecte:</translation> + </message> + <message> + <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Build Type: %1 +</source> + <translation type="unfinished"/> + </message> </context> <context> <name>AccessControlDialog</name> @@ -150,6 +159,25 @@ Seleccioneu si voleu permetre l'accés.</translation> <translation>Seqüència per omissió</translation> </message> </context> +<context> + <name>AutoTypeMatchModel</name> + <message> + <source>Group</source> + <translation>Grup</translation> + </message> + <message> + <source>Title</source> + <translation>Títol</translation> + </message> + <message> + <source>Username</source> + <translation>Nom d'usuari</translation> + </message> + <message> + <source>Sequence</source> + <translation>Seqüència</translation> + </message> +</context> <context> <name>AutoTypeSelectDialog</name> <message> @@ -210,19 +238,19 @@ Seleccioneu si voleu permetre l'accés.</translation> </message> <message> <source>&Google Chrome</source> - <translation type="unfinished"/> + <translation>&Google Chrome</translation> </message> <message> <source>&Firefox</source> - <translation type="unfinished"/> + <translation>&Firefox</translation> </message> <message> <source>&Chromium</source> - <translation type="unfinished"/> + <translation>&Chromium</translation> </message> <message> <source>&Vivaldi</source> - <translation type="unfinished"/> + <translation>&Vivaldi</translation> </message> <message> <source>Show a &notification when credentials are requested</source> @@ -770,7 +798,7 @@ You can now save it.</source> </message> <message> <source>Encryption</source> - <translation type="unfinished"/> + <translation>Encriptatge</translation> </message> <message> <source>Number of rounds too high</source> @@ -789,7 +817,7 @@ If you keep this number, your database may take hours or days (or even longer) t </message> <message> <source>Cancel</source> - <translation type="unfinished"/> + <translation>Cancel·lar</translation> </message> <message> <source>Number of rounds too low</source> @@ -810,12 +838,22 @@ If you keep this number, your database may be too easy to crack!</source> <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> <translation type="unfinished"/> </message> + <message numerus="yes"> + <source> MiB</source> + <comment>Abbreviation for Mebibytes (KDF settings)</comment> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source> thread(s)</source> + <comment>Threads for parallel execution (KDF settings)</comment> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> </context> <context> <name>DatabaseSettingsWidgetEncryption</name> <message> <source>Encryption Algorithm:</source> - <translation type="unfinished"/> + <translation>Algorisme de d’encriptatge:</translation> </message> <message> <source>AES: 256 Bit (default)</source> @@ -841,18 +879,10 @@ If you keep this number, your database may be too easy to crack!</source> <source>Memory Usage:</source> <translation type="unfinished"/> </message> - <message> - <source> MB</source> - <translation type="unfinished"/> - </message> <message> <source>Parallelism:</source> <translation type="unfinished"/> </message> - <message> - <source> thread</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DatabaseSettingsWidgetGeneral</name> @@ -892,6 +922,14 @@ If you keep this number, your database may be too easy to crack!</source> <source>Use recycle bin</source> <translation>Utilitza la paperera</translation> </message> + <message> + <source>Additional Database Settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable &compression (recommended)</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DatabaseTabWidget</name> @@ -1014,6 +1052,15 @@ Otherwise your changes are lost.</source> Voleu desar la base de dades abans de tancar-la? En cas contrari, es perderan els canvis.</translation> </message> + <message> + <source>Disable safe saves?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DatabaseWidget</name> @@ -1126,6 +1173,10 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>Esteu segur que voleu suprimir permanentment tot el contingut de la paperera?</translation> </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DetailsWidget</name> @@ -1151,7 +1202,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Expiration</source> - <translation type="unfinished"/> + <translation>Venciment</translation> </message> <message> <source>Username</source> @@ -1163,11 +1214,11 @@ Do you want to merge your changes?</source> </message> <message> <source>Searching</source> - <translation type="unfinished"/> + <translation>S'està cercant</translation> </message> <message> <source>Attributes</source> - <translation type="unfinished"/> + <translation>Atributs</translation> </message> <message> <source>Attachments</source> @@ -1203,11 +1254,11 @@ Do you want to merge your changes?</source> </message> <message> <source>Disabled</source> - <translation type="unfinished"/> + <translation>Inhabilitat</translation> </message> <message> <source>Enabled</source> - <translation type="unfinished"/> + <translation>Habilitat</translation> </message> </context> <context> @@ -1238,7 +1289,7 @@ Do you want to merge your changes?</source> </message> <message> <source>SSH Agent</source> - <translation type="unfinished"/> + <translation>Agent SSH</translation> </message> <message> <source>n/a</source> @@ -1246,7 +1297,7 @@ Do you want to merge your changes?</source> </message> <message> <source>(encrypted)</source> - <translation type="unfinished"/> + <translation>(encriptat)</translation> </message> <message> <source>Select private key</source> @@ -1312,6 +1363,18 @@ Do you want to merge your changes?</source> <source>1 year</source> <translation>1 any</translation> </message> + <message> + <source>Apply generated password?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to apply the generated password to this entry?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAdvanced</name> @@ -1343,6 +1406,14 @@ Do you want to merge your changes?</source> <source>Attachments</source> <translation>Fitxers adjunts</translation> </message> + <message> + <source>Foreground Color:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Background Color:</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -1375,12 +1446,8 @@ Do you want to merge your changes?</source> <translation>Títol de la finestra:</translation> </message> <message> - <source>Use default se&quence</source> - <translation>Utilitza la se&qüència per defecte a la compleció automàtica </translation> - </message> - <message> - <source>Set custo&m sequence:</source> - <translation>Estableix una seqüència personalitzada per a la compleció automàtica :</translation> + <source>Use a specific sequence for this association:</source> + <translation type="unfinished"/> </message> </context> <context> @@ -1660,6 +1727,31 @@ Do you want to merge your changes?</source> <source>Uuid:</source> <translation>UUID:</translation> </message> + <message> + <source>Plugin Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove</source> + <translation>Suprimiu</translation> + </message> + <message> + <source>Delete plugin data?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Value</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Entry</name> @@ -1801,6 +1893,65 @@ Do you want to merge your changes?</source> <source>URL</source> <translation>URL</translation> </message> + <message> + <source>Never</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password</source> + <translation>Contrasenya</translation> + </message> + <message> + <source>Notes</source> + <translation>Notes</translation> + </message> + <message> + <source>Expires</source> + <translation>Expira</translation> + </message> + <message> + <source>Created</source> + <translation type="unfinished"/> + </message> + <message> + <source>Modified</source> + <translation type="unfinished"/> + </message> + <message> + <source>Accessed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation>Fitxers adjunts</translation> + </message> +</context> +<context> + <name>EntryView</name> + <message> + <source>Customize View</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide Usernames</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide Passwords</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fit to window</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fit to contents</source> + <translation type="unfinished"/> + </message> + <message> + <source>Reset to defaults</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Group</name> @@ -1870,6 +2021,10 @@ Do you want to merge your changes?</source> <source>Ensure that the password contains characters from every group</source> <translation>Assegurar-se que la contrasenya conté caràcters de cada grup</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>ASCII estès</translation> + </message> </context> <context> <name>KMessageWidget</name> @@ -2681,6 +2836,12 @@ Es tracta d'una migració unidireccional. No obrir la base de dades importa <source>Please touch the button on your YubiKey!</source> <translation>Per favor, toqueu el botó en el seu YubiKey!</translation> </message> + <message> + <source>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OpenSSHKey</name> @@ -2692,10 +2853,6 @@ Es tracta d'una migració unidireccional. No obrir la base de dades importa <source>PEM boundary mismatch</source> <translation type="unfinished"/> </message> - <message> - <source>This is not an OpenSSH key, only modern keys are supported</source> - <translation type="unfinished"/> - </message> <message> <source>Base64 decoding failed</source> <translation type="unfinished"/> @@ -2724,10 +2881,6 @@ Es tracta d'una migració unidireccional. No obrir la base de dades importa <source>No private key payload to decrypt</source> <translation type="unfinished"/> </message> - <message> - <source>Unknown cipher: </source> - <translation type="unfinished"/> - </message> <message> <source>Trying to run KDF without cipher</source> <translation type="unfinished"/> @@ -2740,10 +2893,6 @@ Es tracta d'una migració unidireccional. No obrir la base de dades importa <source>Key derivation failed, key file corrupted?</source> <translation type="unfinished"/> </message> - <message> - <source>Unknown KDF: </source> - <translation type="unfinished"/> - </message> <message> <source>Decryption failed, wrong passphrase?</source> <translation type="unfinished"/> @@ -2752,10 +2901,6 @@ Es tracta d'una migració unidireccional. No obrir la base de dades importa <source>Unexpected EOF while reading public key</source> <translation type="unfinished"/> </message> - <message> - <source>Unknown key type: </source> - <translation type="unfinished"/> - </message> <message> <source>Unexpected EOF while reading private key</source> <translation type="unfinished"/> @@ -2776,6 +2921,26 @@ Es tracta d'una migració unidireccional. No obrir la base de dades importa <source>Unexpected EOF when writing private key</source> <translation type="unfinished"/> </message> + <message> + <source>Unsupported key type: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cipher IV is too short for MD5 kdf</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: %1</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OptionDialog</name> @@ -3364,6 +3529,51 @@ Available commands: </message> <message> <source>SSH Agent</source> + <translation>Agent SSH</translation> + </message> + <message> + <source>Generate a new random diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Word count for the diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>count</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wordlist for the diceware generator. +[Default: EFF English]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a new random password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length of the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use lowercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use uppercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use numbers in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use special characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use extended ASCII in the generated password.</source> <translation type="unfinished"/> </message> </context> @@ -3637,6 +3847,30 @@ Per favor, desbloqueu la base de dades seleccionada o escolliu-ne una altra.</t <comment>Milliseconds</comment> <translation> ms</translation> </message> + <message> + <source>Startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>File Management</source> + <translation type="unfinished"/> + </message> + <message> + <source>Safely save database files (may be incompatible with Dropbox, etc)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Backup database file before saving</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry Management</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>General</translation> + </message> </context> <context> <name>SettingsWidgetSecurity</name> @@ -3693,6 +3927,10 @@ Per favor, desbloqueu la base de dades seleccionada o escolliu-ne una altra.</t <source>Use Google as fallback for downloading website icons</source> <translation>Utilitzeu Google com a alternativa per a descarregar icones de llocs web</translation> </message> + <message> + <source>Re-lock previously locked database after performing Auto-Type</source> + <translation type="unfinished"/> + </message> </context> <context> <name>SetupTotpDialog</name> @@ -3774,10 +4012,6 @@ Per favor, desbloqueu la base de dades seleccionada o escolliu-ne una altra.</t </context> <context> <name>WelcomeWidget</name> - <message> - <source>Welcome to KeePassXC</source> - <translation>Benvingut a KeePassXC</translation> - </message> <message> <source>Start storing your passwords securely in a KeePassXC database</source> <translation>Comenceu a emmagatzemar les vostres contrasenyes de manera segura en una base de dades KeePassXC</translation> @@ -3802,6 +4036,10 @@ Per favor, desbloqueu la base de dades seleccionada o escolliu-ne una altra.</t <source>Recent databases</source> <translation>Bases de dades obertes recentment</translation> </message> + <message> + <source>Welcome to KeePassXC %1</source> + <translation type="unfinished"/> + </message> </context> <context> <name>main</name> diff --git a/share/translations/keepassx_cs.ts b/share/translations/keepassx_cs.ts index 50fb01983..76c1df6a5 100644 --- a/share/translations/keepassx_cs.ts +++ b/share/translations/keepassx_cs.ts @@ -17,10 +17,6 @@ <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> <translation>KeePassXC je šířeno pod GNU obecnou veřejnou licencí (GPL) verze 2 a (případně) 3.</translation> </message> - <message> - <source>Project Maintainers:</source> - <translation>Správci projektu:</translation> - </message> <message> <source>Contributors</source> <translation>Na vývoji se podíleli</translation> @@ -71,12 +67,26 @@ Jádro systému: %3 %4</translation> <source>Enabled extensions:</source> <translation>Zapnutá rozšíření:</translation> </message> + <message> + <source>Project Maintainers:</source> + <translation>Správci projektu:</translation> + </message> + <message> + <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> + <translation>Tým KeePassXC děkuje zvláště vývojáři debfx za vytvoření původního KeePassX.</translation> + </message> + <message> + <source>Build Type: %1 +</source> + <translation>Typ sestavení: %1 +</translation> + </message> </context> <context> <name>AccessControlDialog</name> <message> <source>KeePassXC HTTP Confirm Access</source> - <translation>Potvrzení přístupu KeePassXC HTTP</translation> + <translation>Potvrzení přístupu pro KeePassXC HTTP</translation> </message> <message> <source>Remember this decision</source> @@ -101,7 +111,7 @@ Umožnit přístup?</translation> <name>AgentSettingsWidget</name> <message> <source>Enable SSH Agent (requires restart)</source> - <translation>Povolit SSH agenta (vyžaduje restart)</translation> + <translation>Zapnout SSH agenta (vyžaduje restart)</translation> </message> </context> <context> @@ -120,19 +130,19 @@ Umožnit přístup?</translation> </message> <message> <source>The Syntax of your Auto-Type statement is incorrect!</source> - <translation type="unfinished"/> + <translation>Neplatná syntaxe vyjádření automatického vyplňování!</translation> </message> <message> <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>Tento příkaz automatického vyplňování obsahuje velmi dlouhou prodlevu. Opravdu chcete pokračovat?</translation> </message> <message> <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>Tento příkaz automatického vyplňování obsahuje velmi pomalé stisky kláves. Opravdu chcete pokračovat?</translation> </message> <message> <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>Tento příkaz automatického vyplňování obsahuje argumenty, které se velmi často opakují. Opravdu chcete pokračovat?</translation> </message> </context> <context> @@ -143,11 +153,30 @@ Umožnit přístup?</translation> </message> <message> <source>Sequence</source> - <translation>Pořadí</translation> + <translation>Posloupnost</translation> </message> <message> <source>Default sequence</source> - <translation>Výchozí pořadí</translation> + <translation>Výchozí posloupnost</translation> + </message> +</context> +<context> + <name>AutoTypeMatchModel</name> + <message> + <source>Group</source> + <translation>Skupina</translation> + </message> + <message> + <source>Title</source> + <translation>Titulek</translation> + </message> + <message> + <source>Username</source> + <translation>Uživatelské jméno</translation> + </message> + <message> + <source>Sequence</source> + <translation>Posloupnost</translation> </message> </context> <context> @@ -165,7 +194,7 @@ Umožnit přístup?</translation> <name>BrowserAccessControlDialog</name> <message> <source>KeePassXC-Browser Confirm Access</source> - <translation type="unfinished"/> + <translation>Potvrzení přístupu pro KeePassXC-Browser</translation> </message> <message> <source>Remember this decision</source> @@ -194,11 +223,11 @@ Umožnit přístup?</translation> </message> <message> <source>This is required for accessing your databases with KeePassXC-Browser</source> - <translation type="unfinished"/> + <translation>Toto je potřebné pro přístup do vašich databází pomocí KeePassXC-Browser</translation> </message> <message> <source>Enable KeepassXC browser integration</source> - <translation type="unfinished"/> + <translation>Zapnout propojení webového prohlížeče s KeepassXC</translation> </message> <message> <source>General</source> @@ -206,7 +235,7 @@ Umožnit přístup?</translation> </message> <message> <source>Enable integration for these browsers:</source> - <translation type="unfinished"/> + <translation>Zapnout propojení pro tyto prohlížeče:</translation> </message> <message> <source>&Google Chrome</source> @@ -227,45 +256,45 @@ Umožnit přístup?</translation> <message> <source>Show a &notification when credentials are requested</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Zobrazit oz&námení když jsou vyžádány přihlašovací údaje</translation> </message> <message> <source>Re&quest to unlock the database if it is locked</source> - <translation>Vyžádat odemknutí zamčené databáze</translation> + <translation>&Vyžádat odemknutí zamčené databáze</translation> </message> <message> <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> - <translation type="unfinished"/> + <translation>Je odpovězeno pouze položkami stejného schématu (http://, https://, …).</translation> </message> <message> <source>&Match URL scheme (e.g., https://...)</source> - <translation type="unfinished"/> + <translation>Hledat shodu se sché&maty URL (např. https://…)</translation> </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation>Vrátí pouze nejlepší shody pro konkrétní URL adresu namísto všech položek pro celou doménu.</translation> + <translation>Odpoví pouze nejlepšími shodami pro konkrétní URL adresu namísto všech položek pro celou doménu.</translation> </message> <message> <source>&Return only best-matching credentials</source> - <translation type="unfinished"/> + <translation>&Odpovědět pouze nejlépe odpovídajícími přihlašovacími údaji</translation> </message> <message> <source>Sort &matching credentials by title</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>&Seřadit odpovídající přihlašovací údaje podle titulku</translation> </message> <message> <source>Sort matching credentials by &username</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Seřadit odpovídající přihlašovací údaje podle &uživatelského jména</translation> </message> <message> <source>&Disconnect all browsers</source> - <translation type="unfinished"/> + <translation>O&dpojit veškeré prohlížeče</translation> </message> <message> <source>Forget all remembered &permissions</source> - <translation type="unfinished"/> + <translation>Zapomenout všechna zapamatovaná o&právnění</translation> </message> <message> <source>Advanced</source> @@ -274,54 +303,54 @@ Umožnit přístup?</translation> <message> <source>Never &ask before accessing credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Nikdy se nept&at před přístupem k přihlašovacím údajům</translation> </message> <message> <source>Never ask before &updating credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Nikdy se neptat před akt&ualizací přihlašovacích údajů</translation> </message> <message> <source>Only the selected database has to be connected with a client.</source> - <translation>Pouze označené databáze budou spojeny s klientem.</translation> + <translation>S klientem bude propojena pouze označená databáze.</translation> </message> <message> <source>Searc&h in all opened databases for matching credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>&Hledat odpovídající přihlašovací údaje ve všech otevřených databázích</translation> </message> <message> <source>Automatically creating or updating string fields is not supported.</source> - <translation>Automatická vytváření nebo aktualizace nejsou u textových kolonek podporované!</translation> + <translation>Automatické vytváření nebo aktualizace není u textových kolonek podporované!</translation> </message> <message> <source>&Return advanced string fields which start with "KPH: "</source> - <translation>Odpovědět také kolonkami pok&ročilých textových řetězců které začínají na „KPH:“</translation> + <translation>Odpovědět kolonkami pok&ročilých textových řetězců které začínají na „KPH: “</translation> </message> <message> <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> - <translation type="unfinished"/> + <translation>Při spuštění automaticky aktualizuje popis umístění spustitelného souboru s KeePassXC nebo keepassxc-proxy na skripty posílání zpráv mezi webovým prohlížečem a desktopovou aplikací (native messaging).</translation> </message> <message> <source>Update &native messaging manifest files at startup</source> - <translation type="unfinished"/> + <translation>Při spouštění aktualizovat soubory s manifestem posílání zpráv mezi webovým prohlížečem a desktopovou aplikací (native messaging)</translation> </message> <message> <source>Support a proxy application between KeePassXC and browser extension.</source> - <translation type="unfinished"/> + <translation>Podporovat zprostředkovávající aplikaci mezi KeePassXC a rozšířením pro webový prohlížeč.</translation> </message> <message> <source>Use a &proxy application between KeePassXC and browser extension</source> - <translation type="unfinished"/> + <translation>Použít z&prostředkovávající aplikaci mezi KeePassXC a rozšířením pro prohlížeč</translation> </message> <message> <source>Use a custom proxy location if you installed a proxy manually.</source> - <translation type="unfinished"/> + <translation>Pokud jste zprostředkovávající aplikaci nainstalovali ručně, použijte její uživatelem určené umístění.</translation> </message> <message> <source>Use a &custom proxy location</source> <comment>Meant is the proxy for KeePassXC-Browser</comment> - <translation type="unfinished"/> + <translation>Použít uživatelem určené umístění zprostředkovávají&cí aplikace</translation> </message> <message> <source>Browse...</source> @@ -330,37 +359,40 @@ Umožnit přístup?</translation> </message> <message> <source><b>Warning:</b> The following options can be dangerous!</source> - <translation type="unfinished"/> + <translation><b>Varování:</b> Následující předvolby mohou být nebezpečné!</translation> </message> <message> <source>Executable Files (*.exe);;All Files (*.*)</source> - <translation type="unfinished"/> + <translation>Spustitelné soubor (*.exe);;Všechny soubory (*.*)</translation> </message> <message> <source>Executable Files (*)</source> - <translation type="unfinished"/> + <translation>Spustitelné soubory (*)</translation> </message> <message> <source>Select custom proxy location</source> - <translation type="unfinished"/> + <translation>Vybrat uživatelem určené umístění zprostředkovávající aplikace</translation> </message> </context> <context> <name>BrowserService</name> <message> <source>KeePassXC: New key association request</source> - <translation>KeePassXC: nový požadavek na přiřazení klíče</translation> + <translation>KeePassXC: Nový požadavek na přiřazení klíče</translation> </message> <message> <source>You have received an association request for the above key. If you would like to allow it access to your KeePassXC database, give it a unique name to identify and accept it.</source> - <translation type="unfinished"/> + <translation>Obdrželi jste požadavek na přiřazení výše uvedeného klíče. + +Pokud jím chcete umožnit přístup do KeePassXC databáze, +zadejte pro něj neopakující se název pro identifikaci a potvrďte ho.</translation> </message> <message> <source>Save and allow access</source> - <translation>Uložit a povolit přístup</translation> + <translation>Uložit a umožnit přístup</translation> </message> <message> <source>KeePassXC: Overwrite existing key?</source> @@ -369,7 +401,8 @@ give it a unique name to identify and accept it.</source> <message> <source>A shared encryption key with the name "%1" already exists. Do you want to overwrite it?</source> - <translation type="unfinished"/> + <translation>Sdílený šifrovací klíč nazvaný „%1“ už existuje. +Přejete si ho přepsat?</translation> </message> <message> <source>KeePassXC: Update Entry</source> @@ -395,15 +428,15 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> </message> <message> <source>The active database does not contain a settings entry.</source> - <translation type="unfinished"/> + <translation>Nyní otevřená databáze neobsahuje položku nastavení.</translation> </message> <message> <source>KeePassXC: No keys found</source> - <translation>KeePassXC: Klíče nebyly nalezeny</translation> + <translation>KeePassXC: Nebyly nalezeny žádné klíče</translation> </message> <message> <source>No shared encryption keys found in KeePassXC Settings.</source> - <translation type="unfinished"/> + <translation>V nastavení KeePassXC nebyly nalezeny žádné sdílené šifrovací klíče.</translation> </message> <message> <source>KeePassXC: Removed keys from database</source> @@ -411,11 +444,11 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> </message> <message numerus="yes"> <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Úspěšně odebrán %n šifrovací klíč z nastavení KeePassXC.</numerusform><numerusform>Úspěšně odebrány %n šifrovací klíče z nastavení KeePassXC.</numerusform><numerusform>Úspěšně odebráno %n šifrovacích klíčů z nastavení KeePassXC.</numerusform></translation> </message> <message> <source>Removing stored permissions…</source> - <translation type="unfinished"/> + <translation>Odebírání uložených oprávnění…</translation> </message> <message> <source>Abort</source> @@ -427,11 +460,11 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> </message> <message numerus="yes"> <source>Successfully removed permissions from %n entry(s).</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Úspěšně odebrána oprávnění z %n položky.</numerusform><numerusform>Úspěšně odebrána oprávnění ze %n položek.</numerusform><numerusform>Úspěšně odebrána oprávnění z %n položek.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> - <translation>KeePassXC: Nebyl nalezen záznam s oprávněními!</translation> + <translation>KeePassXC: Nebyl nalezen žádný záznam s oprávněními!</translation> </message> <message> <source>The active database does not contain an entry with permissions.</source> @@ -466,7 +499,7 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> </message> <message> <source>Cha&llenge Response</source> - <translation>Výzva–odpověď</translation> + <translation>&Výzva–odpověď</translation> </message> <message> <source>Refresh</source> @@ -512,14 +545,16 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> </message> <message> <source>Legacy key file format</source> - <translation type="unfinished"/> + <translation>Starší formát souboru s klíčem</translation> </message> <message> <source>You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>Používáte starší formát souboru s klíčem, který v budoucnu nemusí být podporován. + +Zvažte vytvoření nového souboru s klíčem.</translation> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -569,7 +604,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Text is qualified by</source> - <translation>Text je zařazován pomocí</translation> + <translation>Text je určen pomocí</translation> </message> <message> <source>Fields are separated by</source> @@ -585,11 +620,11 @@ Please consider generating a new key file.</source> </message> <message> <source>Number of headers line to discard</source> - <translation>Počet řádek s hlavičkou, kterou zahodit</translation> + <translation>Počet řádků hlavičky, které zahodit</translation> </message> <message> <source>Consider '\' an escape character</source> - <translation>Považovat „\“ za únikový znak</translation> + <translation>Považovat „\“ za význam zbavující (escape) znak</translation> </message> <message> <source>Preview</source> @@ -605,7 +640,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Empty fieldname </source> - <translation>Prázný název kolonky</translation> + <translation>Prázdný název kolonky</translation> </message> <message> <source>column </source> @@ -646,22 +681,22 @@ Please consider generating a new key file.</source> </message> <message> <source>Unable to calculate master key</source> - <translation>Nedaří se spočítat hlavní klíč</translation> + <translation>Nedaří se vypočítat hlavní klíč</translation> </message> </context> <context> <name>CsvParserModel</name> <message numerus="yes"> <source>%n byte(s), </source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n bajt,</numerusform><numerusform>%n bajty,</numerusform><numerusform>%n bajtů,</numerusform></translation> </message> <message numerus="yes"> <source>%n row(s), </source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n řádek,</numerusform><numerusform>%n řádky,</numerusform><numerusform>%n řádků,</numerusform></translation> </message> <message numerus="yes"> <source>%n column(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n sloupec</numerusform><numerusform>%n sloupce</numerusform><numerusform>%n sloupců</numerusform></translation> </message> </context> <context> @@ -700,14 +735,16 @@ Please consider generating a new key file.</source> </message> <message> <source>Legacy key file format</source> - <translation type="unfinished"/> + <translation>Starý formát souboru s klíčem</translation> </message> <message> <source>You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>Používáte starý formát souboru s klíčem, který v budoucnu nemusí být podporován. + +Zvažte vytvoření nového souboru s klíčem.</translation> </message> <message> <source>Don't show this warning again</source> @@ -771,22 +808,24 @@ Nyní je možné ji uložit.</translation> </message> <message> <source>Encryption</source> - <translation type="unfinished"/> + <translation>Šifrování</translation> </message> <message> <source>Number of rounds too high</source> <comment>Key transformation rounds</comment> - <translation type="unfinished"/> + <translation>Počet průchodů je příliš vysoký</translation> </message> <message> <source>You are using a very high number of key transform rounds with Argon2. If you keep this number, your database may take hours or days (or even longer) to open!</source> - <translation type="unfinished"/> + <translation>Používáte velmi vysoký počet průchodů transformace klíče s Argnon2. + +Pokud tento počet ponecháte, otevírání databáze může trvat hodiny až dny (nebo dokonce déle)!</translation> </message> <message> <source>Understood, keep number</source> - <translation type="unfinished"/> + <translation>Rozumím, počet ponechat</translation> </message> <message> <source>Cancel</source> @@ -795,40 +834,52 @@ If you keep this number, your database may take hours or days (or even longer) t <message> <source>Number of rounds too low</source> <comment>Key transformation rounds</comment> - <translation type="unfinished"/> + <translation>Počet průchodů je příliš nízký</translation> </message> <message> <source>You are using a very low number of key transform rounds with AES-KDF. If you keep this number, your database may be too easy to crack!</source> - <translation type="unfinished"/> + <translation>Používáte velmi nízký počet průchodů transformace funkcí pro odvození klíče (KDF) a šifrou AES. + +Pokud tento počet ponecháte, může být velmi snadné prolomit šifrování vaší databáze!</translation> </message> <message> <source>KDF unchanged</source> - <translation>KDF nezměněno</translation> + <translation>Funkce pro odvození klíče (KDF) nezměněna</translation> </message> <message> <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> - <translation type="unfinished"/> + <translation>Nepodařilo se transformovat klíč s novými parametry funkce pro odvození klíče (KDF), ta proto nezměněna.</translation> + </message> + <message numerus="yes"> + <source> MiB</source> + <comment>Abbreviation for Mebibytes (KDF settings)</comment> + <translation><numerusform> MiB</numerusform><numerusform> MiB</numerusform><numerusform> MiB</numerusform></translation> + </message> + <message numerus="yes"> + <source> thread(s)</source> + <comment>Threads for parallel execution (KDF settings)</comment> + <translation><numerusform>vlákno</numerusform><numerusform>vlákna</numerusform><numerusform>vláken</numerusform></translation> </message> </context> <context> <name>DatabaseSettingsWidgetEncryption</name> <message> <source>Encryption Algorithm:</source> - <translation type="unfinished"/> + <translation>Šifrovací algoritmus:</translation> </message> <message> <source>AES: 256 Bit (default)</source> - <translation>AES: 256 Bit (výchozí)</translation> + <translation>AES: 256 bit (výchozí)</translation> </message> <message> <source>Twofish: 256 Bit</source> - <translation>Twofish: 256 Bit</translation> + <translation>Twofish: 256 bit</translation> </message> <message> <source>Key Derivation Function:</source> - <translation type="unfinished"/> + <translation>Funkce pro odvození klíče:</translation> </message> <message> <source>Transform rounds:</source> @@ -836,30 +887,22 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Benchmark 1-second delay</source> - <translation type="unfinished"/> + <translation>Jednosekundová prodleva testu výkonnosti</translation> </message> <message> <source>Memory Usage:</source> - <translation type="unfinished"/> - </message> - <message> - <source> MB</source> - <translation>MB</translation> + <translation>Využití paměti:</translation> </message> <message> <source>Parallelism:</source> - <translation type="unfinished"/> - </message> - <message> - <source> thread</source> - <translation type="unfinished"/> + <translation>Souběžné zpracovávání:</translation> </message> </context> <context> <name>DatabaseSettingsWidgetGeneral</name> <message> <source>Database Meta Data</source> - <translation type="unfinished"/> + <translation>Metadata databáze</translation> </message> <message> <source>Database name:</source> @@ -875,7 +918,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>History Settings</source> - <translation type="unfinished"/> + <translation>Nastavení historie</translation> </message> <message> <source>Max. history items:</source> @@ -893,6 +936,14 @@ If you keep this number, your database may be too easy to crack!</source> <source>Use recycle bin</source> <translation>Namísto mazání přesouvat do Koše</translation> </message> + <message> + <source>Additional Database Settings</source> + <translation>Rozšířená nastavení databáze</translation> + </message> + <message> + <source>Enable &compression (recommended)</source> + <translation>Zapnout &kompresi (doporučeno)</translation> + </message> </context> <context> <name>DatabaseTabWidget</name> @@ -915,7 +966,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>File not found!</source> - <translation>Soubor nebyl nalezen!</translation> + <translation>Soubor nenalezen!</translation> </message> <message> <source>Unable to open the database.</source> @@ -1015,6 +1066,16 @@ Otherwise your changes are lost.</source> Chcete ji před uzamčením uložit? Pokud ne, provedené změny budou ztraceny.</translation> </message> + <message> + <source>Disable safe saves?</source> + <translation>Vypnout bezpečná ukládání?</translation> + </message> + <message> + <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</source> + <translation>I přes několikátý pokus se KeePassXC nepodařilo databázi uložit. To je nejspíš způsobeno službou synchronizace souborů, která drží zámek na ukládaném souboru. +Vypnout bezpečné ukládání a zkusit to znovu?</translation> + </message> </context> <context> <name>DatabaseWidget</name> @@ -1048,7 +1109,7 @@ Pokud ne, provedené změny budou ztraceny.</translation> </message> <message> <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation>Opravdu přesunout záznam "%1" do Koše?</translation> + <translation>Opravdu chcete přesunout záznam „%1“ do Koše?</translation> </message> <message> <source>Move entries to recycle bin?</source> @@ -1056,7 +1117,7 @@ Pokud ne, provedené změny budou ztraceny.</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Opravdu chcete přesunout %n položku do Koše?</numerusform><numerusform>Opravdu chcete přesunout %n položky do Koše?</numerusform><numerusform>Opravdu chcete přesunout %n položek do Koše?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1064,7 +1125,7 @@ Pokud ne, provedené změny budou ztraceny.</translation> </message> <message> <source>Do you really want to execute the following command?<br><br>%1<br></source> - <translation>Opravdu spustit následující příkaz?<br><br>%1<br></translation> + <translation>Opravdu chcete spustit následující příkaz?<br><br>%1<br></translation> </message> <message> <source>Remember my choice</source> @@ -1080,7 +1141,7 @@ Pokud ne, provedené změny budou ztraceny.</translation> </message> <message> <source>Unable to calculate master key</source> - <translation>Nedaří se spočítat hlavní klíč</translation> + <translation>Nedaří se vypočítat hlavní klíč</translation> </message> <message> <source>No current database.</source> @@ -1100,7 +1161,7 @@ Pokud ne, provedené změny budou ztraceny.</translation> </message> <message> <source>File has changed</source> - <translation type="unfinished"/> + <translation>Soubor byl změněn</translation> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -1113,11 +1174,12 @@ Pokud ne, provedené změny budou ztraceny.</translation> <message> <source>The database file has changed and you have unsaved changes. Do you want to merge your changes?</source> - <translation type="unfinished"/> + <translation>Databázový soubor byl změněn a máte neuložené změny. +Přejete si je sloučit?</translation> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> - <translation>Nepodařilo se otevřít nový soubor, obsahující aktuální verzi této databáze.</translation> + <translation>Nepodařilo se otevřít nový databázový soubor při pokusu o automatické znovunačtení této databáze.</translation> </message> <message> <source>Empty recycle bin?</source> @@ -1125,14 +1187,18 @@ Do you want to merge your changes?</source> </message> <message> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> - <translation>Opravdu chcete natrvalo smazat všechno z Koše?</translation> + <translation>Opravdu natrvalo smazat všechno z Koše?</translation> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> </message> </context> <context> <name>DetailsWidget</name> <message> <source>Generate TOTP Token</source> - <translation type="unfinished"/> + <translation>Vytvořit token na času založeného jednorázového hesla (TOTP)</translation> </message> <message> <source>Close</source> @@ -1152,7 +1218,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Expiration</source> - <translation type="unfinished"/> + <translation>Skončení platnosti</translation> </message> <message> <source>Username</source> @@ -1160,15 +1226,15 @@ Do you want to merge your changes?</source> </message> <message> <source>Autotype</source> - <translation type="unfinished"/> + <translation>Automatické vyplnění</translation> </message> <message> <source>Searching</source> - <translation type="unfinished"/> + <translation>Hledání</translation> </message> <message> <source>Attributes</source> - <translation type="unfinished"/> + <translation>Atributy</translation> </message> <message> <source>Attachments</source> @@ -1184,7 +1250,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Sequence</source> - <translation>Pořadí</translation> + <translation>Posloupnost</translation> </message> <message> <source>Search</source> @@ -1200,15 +1266,15 @@ Do you want to merge your changes?</source> </message> <message> <source>[PROTECTED]</source> - <translation type="unfinished"/> + <translation>[CHRÁNĚNO]</translation> </message> <message> <source>Disabled</source> - <translation type="unfinished"/> + <translation>Vypnuto</translation> </message> <message> <source>Enabled</source> - <translation type="unfinished"/> + <translation>Zapnuto</translation> </message> </context> <context> @@ -1239,27 +1305,27 @@ Do you want to merge your changes?</source> </message> <message> <source>SSH Agent</source> - <translation type="unfinished"/> + <translation>SSH agent</translation> </message> <message> <source>n/a</source> - <translation type="unfinished"/> + <translation>neaplikovatelné</translation> </message> <message> <source>(encrypted)</source> - <translation type="unfinished"/> + <translation>(šifrováno)</translation> </message> <message> <source>Select private key</source> - <translation type="unfinished"/> + <translation>Vybrat soukromou část klíče</translation> </message> <message> <source>File too large to be a private key</source> - <translation type="unfinished"/> + <translation>Soubor je na soukromou část klíče příliš velký</translation> </message> <message> <source>Failed to open private key</source> - <translation type="unfinished"/> + <translation>Nepodařilo se otevřít soukromou část klíče</translation> </message> <message> <source>Entry history</source> @@ -1291,11 +1357,11 @@ Do you want to merge your changes?</source> </message> <message> <source>[PROTECTED]</source> - <translation type="unfinished"/> + <translation>[CHRÁNĚNO]</translation> </message> <message> <source>Press reveal to view or edit</source> - <translation type="unfinished"/> + <translation>Pro zobrazení nebo úpravu klikněte na Odkrýt</translation> </message> <message> <source>Tomorrow</source> @@ -1303,16 +1369,28 @@ Do you want to merge your changes?</source> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n týden</numerusform><numerusform>%n týdny</numerusform><numerusform>%n týdnů</numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n měsíc</numerusform><numerusform>%n měsíce</numerusform><numerusform>%n měsíců</numerusform></translation> </message> <message> <source>1 year</source> <translation>1 rok</translation> </message> + <message> + <source>Apply generated password?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to apply the generated password to this entry?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAdvanced</name> @@ -1338,12 +1416,20 @@ Do you want to merge your changes?</source> </message> <message> <source>Reveal</source> - <translation>Odhalit</translation> + <translation>Odkrýt</translation> </message> <message> <source>Attachments</source> <translation>Přílohy</translation> </message> + <message> + <source>Foreground Color:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Background Color:</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -1353,11 +1439,11 @@ Do you want to merge your changes?</source> </message> <message> <source>Inherit default Auto-Type sequence from the &group</source> - <translation>Převzít výchozí pořadí automatického vyplňování od skupiny</translation> + <translation>&Převzít výchozí posloupnost automatického vyplňování od skupiny</translation> </message> <message> <source>&Use custom Auto-Type sequence:</source> - <translation>Po&užít vlastní pořadí automatického vyplňování:</translation> + <translation>Po&užít uživatelem určenou posloupnost automatického vyplňování:</translation> </message> <message> <source>Window Associations</source> @@ -1376,12 +1462,8 @@ Do you want to merge your changes?</source> <translation>Titulek okna:</translation> </message> <message> - <source>Use default se&quence</source> - <translation>Použít výchozí pořadí</translation> - </message> - <message> - <source>Set custo&m sequence:</source> - <translation>Nastavit vlastní pořadí:</translation> + <source>Use a specific sequence for this association:</source> + <translation>Pro toto přiřazení použít konkrétní posloupnost:</translation> </message> </context> <context> @@ -1431,7 +1513,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Toggle the checkbox to reveal the notes section.</source> - <translation type="unfinished"/> + <translation>Od/zaškrtnutím této kolonky odkryjete sekci poznámek.</translation> </message> <message> <source>Username:</source> @@ -1446,43 +1528,43 @@ Do you want to merge your changes?</source> <name>EditEntryWidgetSSHAgent</name> <message> <source>Form</source> - <translation type="unfinished"/> + <translation>Formulář</translation> </message> <message> <source>Remove key from agent after</source> - <translation type="unfinished"/> + <translation>Odebrat klíč z klienta po uplynutí</translation> </message> <message> <source> seconds</source> - <translation type="unfinished"/> + <translation>sekund</translation> </message> <message> <source>Fingerprint</source> - <translation type="unfinished"/> + <translation>Otisk</translation> </message> <message> <source>Remove key from agent when database is closed/locked</source> - <translation type="unfinished"/> + <translation>Odebrat klíč z klienta při zavření/zamčení databáze</translation> </message> <message> <source>Public key</source> - <translation type="unfinished"/> + <translation>Veřejná část klíče</translation> </message> <message> <source>Add key to agent when database is opened/unlocked</source> - <translation type="unfinished"/> + <translation>Přidat klíč do agenta při otevření/odemčení databáze</translation> </message> <message> <source>Comment</source> - <translation type="unfinished"/> + <translation>Komentář</translation> </message> <message> <source>Decrypt</source> - <translation type="unfinished"/> + <translation>Rozšifrovat</translation> </message> <message> <source>n/a</source> - <translation type="unfinished"/> + <translation>neaplikovatelné</translation> </message> <message> <source>Copy to clipboard</source> @@ -1490,11 +1572,11 @@ Do you want to merge your changes?</source> </message> <message> <source>Private key</source> - <translation type="unfinished"/> + <translation>Soukromá část klíče</translation> </message> <message> <source>External file</source> - <translation type="unfinished"/> + <translation>Vnější soubor</translation> </message> <message> <source>Browse...</source> @@ -1507,15 +1589,15 @@ Do you want to merge your changes?</source> </message> <message> <source>Add to agent</source> - <translation type="unfinished"/> + <translation>Přidat do agenta</translation> </message> <message> <source>Remove from agent</source> - <translation type="unfinished"/> + <translation>Odebrat z agenta</translation> </message> <message> <source>Require user confirmation when this key is used</source> - <translation type="unfinished"/> + <translation>Při použití tohoto klíče vyžadovat potvrzení od uživatele</translation> </message> </context> <context> @@ -1550,7 +1632,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Inherit from parent group (%1)</source> - <translation>Převzít od nadřazené skupiny (%1)</translation> + <translation>Převzít z nadřazené skupiny (%1)</translation> </message> </context> <context> @@ -1577,11 +1659,11 @@ Do you want to merge your changes?</source> </message> <message> <source>&Use default Auto-Type sequence of parent group</source> - <translation>Převzít výchozí pořadí a&utomatického vyplňování nadřazené skupiny</translation> + <translation>Převzít výchozí posloupnost a&utomatického vyplňování z nadřazené skupiny</translation> </message> <message> <source>Set default Auto-Type se&quence</source> - <translation>Nastavit výchozí pořadí automatického vyplňování</translation> + <translation>&Nastavit výchozí posloupnost automatického vyplňování</translation> </message> </context> <context> @@ -1592,15 +1674,15 @@ Do you want to merge your changes?</source> </message> <message> <source>Use custo&m icon</source> - <translation>Použít svou vlastní ikonu</translation> + <translation>Použít uživatele&m určenou ikonu</translation> </message> <message> <source>Add custom icon</source> - <translation>Přidat svou vlastní ikonu</translation> + <translation>Přidat uživatelem určenou ikonu</translation> </message> <message> <source>Delete custom icon</source> - <translation>Smazat svou vlastní ikonu</translation> + <translation>Smazat uživatelem určenou ikonu</translation> </message> <message> <source>Download favicon</source> @@ -1632,7 +1714,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Custom icon already exists</source> - <translation>Tato vlastní ikona už existuje</translation> + <translation>Tato uživatelem určená ikona už existuje</translation> </message> <message> <source>Confirm Delete</source> @@ -1659,7 +1741,32 @@ Do you want to merge your changes?</source> </message> <message> <source>Uuid:</source> - <translation>Univerzálně jedinečný identifikátor:</translation> + <translation>Nikde se neopakující se identifikátor:</translation> + </message> + <message> + <source>Plugin Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove</source> + <translation>Odebrat</translation> + </message> + <message> + <source>Delete plugin data?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Value</source> + <translation type="unfinished"/> </message> </context> <context> @@ -1667,7 +1774,7 @@ Do you want to merge your changes?</source> <message> <source> - Clone</source> <comment>Suffix added to cloned entries</comment> - <translation>- Klon</translation> + <translation>- klon</translation> </message> </context> <context> @@ -1685,7 +1792,7 @@ Do you want to merge your changes?</source> <name>EntryAttachmentsWidget</name> <message> <source>Form</source> - <translation type="unfinished"/> + <translation>Formulář</translation> </message> <message> <source>Add</source> @@ -1705,11 +1812,11 @@ Do you want to merge your changes?</source> </message> <message> <source>Select files</source> - <translation type="unfinished"/> + <translation>Vybrat soubory</translation> </message> <message numerus="yes"> <source>Are you sure you want to remove %n attachment(s)?</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Opravdu chcete odebrat %n přílohu?</numerusform><numerusform>Opravdu chcete odebrat %n přílohy?</numerusform><numerusform>Opravdu chcete odebrat %n příloh?</numerusform></translation> </message> <message> <source>Confirm Remove</source> @@ -1717,40 +1824,45 @@ Do you want to merge your changes?</source> </message> <message> <source>Save attachments</source> - <translation type="unfinished"/> + <translation>Uložit přílohy</translation> </message> <message> <source>Unable to create directory: %1</source> - <translation type="unfinished"/> + <translation>Nedaří se vytvořit složku: +%1</translation> </message> <message> <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> - <translation type="unfinished"/> + <translation>Opravdu chcete přílohou přepsat stávající soubor „%1“?</translation> </message> <message> <source>Confirm overwrite</source> - <translation type="unfinished"/> + <translation>Potvrdit přepsání</translation> </message> <message> <source>Unable to save attachments: %1</source> - <translation type="unfinished"/> + <translation>Nedaří se uložit přílohy: +%1</translation> </message> <message> <source>Unable to open attachment: %1</source> - <translation type="unfinished"/> + <translation>Nedaří se otevřít přílohu: +%1</translation> </message> <message> <source>Unable to open attachments: %1</source> - <translation type="unfinished"/> + <translation>Nedaří se otevřít přílohy: +%1</translation> </message> <message> <source>Unable to open files: %1</source> - <translation type="unfinished"/> + <translation>Nedaří se otevřít soubory: +%1</translation> </message> </context> <context> @@ -1802,6 +1914,65 @@ Do you want to merge your changes?</source> <source>URL</source> <translation>URL adresa</translation> </message> + <message> + <source>Never</source> + <translation>Nikdy</translation> + </message> + <message> + <source>Password</source> + <translation>Heslo</translation> + </message> + <message> + <source>Notes</source> + <translation>Poznámky</translation> + </message> + <message> + <source>Expires</source> + <translation>Platnost skončí</translation> + </message> + <message> + <source>Created</source> + <translation>Vytvořeno</translation> + </message> + <message> + <source>Modified</source> + <translation>Okamžik nejnovější úpravy:</translation> + </message> + <message> + <source>Accessed</source> + <translation>Okamžik nejnovějšího přístupu:</translation> + </message> + <message> + <source>Attachments</source> + <translation>Přílohy</translation> + </message> +</context> +<context> + <name>EntryView</name> + <message> + <source>Customize View</source> + <translation>Přizpůsobit pohled</translation> + </message> + <message> + <source>Hide Usernames</source> + <translation>Skrýt uživatelská jména</translation> + </message> + <message> + <source>Hide Passwords</source> + <translation>Skrýt hesl</translation> + </message> + <message> + <source>Fit to window</source> + <translation>Přizpůsobit oknu</translation> + </message> + <message> + <source>Fit to contents</source> + <translation>Přizpůsobit obsahu</translation> + </message> + <message> + <source>Reset to defaults</source> + <translation>Vrátit na výchozí</translation> + </message> </context> <context> <name>Group</name> @@ -1814,11 +1985,11 @@ Do you want to merge your changes?</source> <name>HostInstaller</name> <message> <source>KeePassXC: Cannot save file!</source> - <translation type="unfinished"/> + <translation>KeePassXC: Soubor se nedaří uložit!</translation> </message> <message> <source>Cannot save the native messaging script file.</source> - <translation type="unfinished"/> + <translation>Nedaří se uložit soubor se skriptem pro posílání zpráv mezi webovým prohlížečem a desktopovou aplikací (native messaging).</translation> </message> </context> <context> @@ -1871,6 +2042,10 @@ Do you want to merge your changes?</source> <source>Ensure that the password contains characters from every group</source> <translation>Zajistit aby heslo obsahovalo znaky ze všech zvolených skupin znaků</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>Rozšířené ASCII</translation> + </message> </context> <context> <name>KMessageWidget</name> @@ -1880,14 +2055,14 @@ Do you want to merge your changes?</source> </message> <message> <source>Close message</source> - <translation>Uzavřít správu</translation> + <translation>Zavřít zprávu</translation> </message> </context> <context> <name>Kdbx3Reader</name> <message> <source>Unable to calculate master key</source> - <translation>Nedaří se spočítat hlavní klíč</translation> + <translation>Nedaří se vypočítat hlavní klíč</translation> </message> <message> <source>Unable to issue challenge-response.</source> @@ -1895,7 +2070,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Wrong key or database file is corrupt.</source> - <translation>Byl zadán chybný klíč, nebo je poškozen databázový soubor.</translation> + <translation>Byl zadán nesprávný klíč, nebo je soubor s databází poškozený.</translation> </message> </context> <context> @@ -1906,194 +2081,194 @@ Do you want to merge your changes?</source> </message> <message> <source>Unable to calculate master key</source> - <translation>Nedaří se spočítat hlavní klíč</translation> + <translation>Nedaří se vypočítat hlavní klíč</translation> </message> </context> <context> <name>Kdbx4Reader</name> <message> <source>missing database headers</source> - <translation type="unfinished"/> + <translation>chybí databázové hlavičky</translation> </message> <message> <source>Unable to calculate master key</source> - <translation>Nedaří se spočítat hlavní klíč</translation> + <translation>Nedaří se vypočítat hlavní klíč</translation> </message> <message> <source>Invalid header checksum size</source> - <translation type="unfinished"/> + <translation>Neplatná velikost kontrolního součtu hlavičky</translation> </message> <message> <source>Header SHA256 mismatch</source> - <translation type="unfinished"/> + <translation>Neshoda SHA256 kontrolního součtu hlavičky</translation> </message> <message> <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> - <translation type="unfinished"/> + <translation>Nesprávný klíč nebo je soubor s databází poškozený (neshoda HMAC)</translation> </message> <message> <source>Unknown cipher</source> - <translation type="unfinished"/> + <translation>Neznámá šifra</translation> </message> <message> <source>Invalid header id size</source> - <translation type="unfinished"/> + <translation>Neplatná velikost identifikátoru hlavičky</translation> </message> <message> <source>Invalid header field length</source> - <translation type="unfinished"/> + <translation>Neplatná délka kolonky hlavičky</translation> </message> <message> <source>Invalid header data length</source> - <translation type="unfinished"/> + <translation>Neplatné délka dat hlavičky</translation> </message> <message> <source>Failed to open buffer for KDF parameters in header</source> - <translation type="unfinished"/> + <translation>Nepodařilo se otevřít vyrovnávací paměť pro parametry funkce pro odvození klíče (KDF), uložené v hlavičce</translation> </message> <message> <source>Unsupported key derivation function (KDF) or invalid parameters</source> - <translation type="unfinished"/> + <translation>Nepodporovaná funkce pro odvození klíče (KDF) nebo neplatné parametry</translation> </message> <message> <source>Legacy header fields found in KDBX4 file.</source> - <translation type="unfinished"/> + <translation>V KDBX4 souboru nalezeny kolonky staré hlavičky.</translation> </message> <message> <source>Invalid inner header id size</source> - <translation type="unfinished"/> + <translation>Neplatná velikost identifikátoru vnitřní hlavičky</translation> </message> <message> <source>Invalid inner header field length</source> - <translation type="unfinished"/> + <translation>Neplatná délka kolonky vnitřní hlavičky</translation> </message> <message> <source>Invalid inner header binary size</source> - <translation type="unfinished"/> + <translation>Neplatná velikost binárky vnitřní hlavničky</translation> </message> <message> <source>Unsupported KeePass variant map version.</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Nepodporovaná verze mapy varianty KeePass.</translation> </message> <message> <source>Invalid variant map entry name length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Neplatná délka názvu položky mapy varianty</translation> </message> <message> <source>Invalid variant map entry name data</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Neplatná data názvu položky mapy varianty</translation> </message> <message> <source>Invalid variant map entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Neplatná délka hodnoty položky mapy varianty</translation> </message> <message> <source>Invalid variant map entry value data</source> <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Neplatná data hodnoty položky mapy varianty</translation> </message> <message> <source>Invalid variant map Bool entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Neplatná délka hodnoty položky typu boolean mapy varianty</translation> </message> <message> <source>Invalid variant map Int32 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Neplatná délka 32 bitové celočíselné hodnoty položky varianty</translation> </message> <message> <source>Invalid variant map UInt32 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Neplatná délka 32 bitové kladné celočíselné hodnoty položky varianty</translation> </message> <message> <source>Invalid variant map Int64 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Neplatná délka 64 bitové celočíselné hodnoty položky varianty</translation> </message> <message> <source>Invalid variant map UInt64 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Neplatná délka 64 bitové kladné celočíselné hodnoty položky varianty</translation> </message> <message> <source>Invalid variant map entry type</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Neplatný typ položky mapy varianty</translation> </message> <message> <source>Invalid variant map field type size</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Neplatná velikost typu kolonky mapy varianty</translation> </message> </context> <context> <name>Kdbx4Writer</name> <message> <source>Invalid symmetric cipher algorithm.</source> - <translation type="unfinished"/> + <translation>Neplatný algoritmus symetrické šifry.</translation> </message> <message> <source>Invalid symmetric cipher IV size.</source> <comment>IV = Initialization Vector for symmetric cipher</comment> - <translation type="unfinished"/> + <translation>Neplatná velikost symetrické šifry IV.</translation> </message> <message> <source>Unable to calculate master key</source> - <translation>Nedaří se spočítat hlavní klíč</translation> + <translation>Nedaří se vypočítat hlavní klíč</translation> </message> <message> <source>Failed to serialize KDF parameters variant map</source> <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Nepodařilo se serializovat mapu varianty parametrů funkce pro odvození klíče</translation> </message> </context> <context> <name>KdbxReader</name> <message> <source>Invalid cipher uuid length</source> - <translation type="unfinished"/> + <translation>Neplatná délka neopakujícího se identifikátoru šifry</translation> </message> <message> <source>Unsupported cipher</source> - <translation type="unfinished"/> + <translation>Nepodporovaná šifra</translation> </message> <message> <source>Invalid compression flags length</source> - <translation type="unfinished"/> + <translation>Neplatná délka příznaku komprimace</translation> </message> <message> <source>Unsupported compression algorithm</source> - <translation type="unfinished"/> + <translation>Nepodporovaný kompresní algoritmus</translation> </message> <message> <source>Invalid master seed size</source> - <translation type="unfinished"/> + <translation>Neplatná velikost hlavního náhodného čísla (seed)</translation> </message> <message> <source>Invalid transform seed size</source> - <translation type="unfinished"/> + <translation>Neplatná velikost transformačního náhodného čísla (seed)</translation> </message> <message> <source>Invalid transform rounds size</source> - <translation type="unfinished"/> + <translation>Neplatná velikost transformačních průchodů</translation> </message> <message> <source>Invalid start bytes size</source> - <translation type="unfinished"/> + <translation>Neplatná velikost počátečních bajtů</translation> </message> <message> <source>Invalid random stream id size</source> - <translation type="unfinished"/> + <translation>Neplatná velikost identifikátoru náhodného proudu</translation> </message> <message> <source>Invalid inner random stream cipher</source> - <translation type="unfinished"/> + <translation>Neplatná šifra vnitřního náhodného proudu</translation> </message> <message> <source>Not a KeePass database.</source> @@ -2107,135 +2282,135 @@ This is a one-way migration. You won't be able to open the imported databas <translation>Zvolený soubor je databáze ve starém formátu KeePass 1 (.kdb). Můžete ho importovat pomocí Databáze → Importovat databázi ve formátu KeePass 1…. -Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otevřít ve staré verzi KeePassX 0.4.</translation> +Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otevřít ve staré aplikaci KeePassX verze 0.4.</translation> </message> <message> <source>Unsupported KeePass 2 database version.</source> - <translation type="unfinished"/> + <translation>Nepodporovaná verze databáze KeePass 2.</translation> </message> </context> <context> <name>KdbxXmlReader</name> <message> <source>XML parsing failure: %1</source> - <translation type="unfinished"/> + <translation>Nezdar při zpracovávání XML: %1</translation> </message> <message> <source>No root group</source> - <translation type="unfinished"/> + <translation>Žádná kořenová skupina</translation> </message> <message> <source>Missing icon uuid or data</source> - <translation type="unfinished"/> + <translation>Chybějící neopakující se identifikátor nebo data ikony</translation> </message> <message> <source>Missing custom data key or value</source> - <translation type="unfinished"/> + <translation>Chybějící vlastní datový klíč nebo hodnota</translation> </message> <message> <source>Multiple group elements</source> - <translation type="unfinished"/> + <translation>Prvky vícero skupin</translation> </message> <message> <source>Null group uuid</source> - <translation type="unfinished"/> + <translation>Prázdný neopakující se identifikátor skupiny</translation> </message> <message> <source>Invalid group icon number</source> - <translation type="unfinished"/> + <translation>Neplatné číslo ikony skupiny</translation> </message> <message> <source>Invalid EnableAutoType value</source> - <translation type="unfinished"/> + <translation>Neplatná hodnota zapnutí automatického vyplňování</translation> </message> <message> <source>Invalid EnableSearching value</source> - <translation type="unfinished"/> + <translation>Neplatná hodnota zapnutí vyhledávání</translation> </message> <message> <source>No group uuid found</source> - <translation type="unfinished"/> + <translation>Nenalezen žádný neopakující se identifikátor skupiny</translation> </message> <message> <source>Null DeleteObject uuid</source> - <translation type="unfinished"/> + <translation>Prázdný neopakující se identifikátor objektu ke smazání</translation> </message> <message> <source>Missing DeletedObject uuid or time</source> - <translation type="unfinished"/> + <translation>Chybějící neopakující se identifikátor nebo čas smazaného objektu</translation> </message> <message> <source>Null entry uuid</source> - <translation type="unfinished"/> + <translation>Prázdný neopakující se identifikátor</translation> </message> <message> <source>Invalid entry icon number</source> - <translation type="unfinished"/> + <translation>Neplatné číslo ikony položky</translation> </message> <message> <source>History element in history entry</source> - <translation type="unfinished"/> + <translation>Prvek historie v položce historie</translation> </message> <message> <source>No entry uuid found</source> - <translation type="unfinished"/> + <translation>Nebyl nalezen žádný neopakující se identifikátor položky</translation> </message> <message> <source>History element with different uuid</source> - <translation type="unfinished"/> + <translation>Prvek historie s rozdílným neopakujícím se identifikátorem</translation> </message> <message> <source>Unable to decrypt entry string</source> - <translation type="unfinished"/> + <translation>Nedaří se rozšifrovat řetězec položky</translation> </message> <message> <source>Duplicate custom attribute found</source> - <translation type="unfinished"/> + <translation>Zjištěn duplicitní uživatelem určený atribut</translation> </message> <message> <source>Entry string key or value missing</source> - <translation type="unfinished"/> + <translation>Chybí klíč nebo hodnota řetězce položky</translation> </message> <message> <source>Duplicate attachment found</source> - <translation type="unfinished"/> + <translation>Zjištěna duplicitní příloha</translation> </message> <message> <source>Entry binary key or value missing</source> - <translation type="unfinished"/> + <translation>Chybí binární klíč nebo hodnota položky</translation> </message> <message> <source>Auto-type association window or sequence missing</source> - <translation type="unfinished"/> + <translation>Chybí přiřazení okna nebo posloupnost pro automatické vyplňování</translation> </message> <message> <source>Invalid bool value</source> - <translation type="unfinished"/> + <translation>Neplatná boolean hodnota</translation> </message> <message> <source>Invalid date time value</source> - <translation type="unfinished"/> + <translation>Neplatná hodnota data a času</translation> </message> <message> <source>Invalid color value</source> - <translation type="unfinished"/> + <translation>Neplatná hodnota barvy</translation> </message> <message> <source>Invalid color rgb part</source> - <translation type="unfinished"/> + <translation>Neplatná část rgb vyjádření barvy</translation> </message> <message> <source>Invalid number value</source> - <translation type="unfinished"/> + <translation>Neplatná číselná hodnota</translation> </message> <message> <source>Invalid uuid value</source> - <translation type="unfinished"/> + <translation>Neplatná hodnota neopakujícího se identifikátoru</translation> </message> <message> <source>Unable to decompress binary</source> <extracomment>Translator meant is a binary data inside an entry</extracomment> - <translation type="unfinished"/> + <translation>Nedaří se rozbalit binární soubor</translation> </message> </context> <context> @@ -2265,36 +2440,36 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>Unsupported KeePass database version.</source> - <translation>Nepodporovaná verze databáze KeePass.</translation> + <translation>Nepodporovaná verze KeePass databáze.</translation> </message> <message> <source>Unable to read encryption IV</source> <comment>IV = Initialization Vector for symmetric cipher</comment> - <translation type="unfinished"/> + <translation>Nedaří se číst šifrování IV</translation> </message> <message> <source>Invalid number of groups</source> - <translation type="unfinished"/> + <translation>Neplatný počet skupin</translation> </message> <message> <source>Invalid number of entries</source> - <translation type="unfinished"/> + <translation>Neplatný počet položek</translation> </message> <message> <source>Invalid content hash size</source> - <translation type="unfinished"/> + <translation>Neplatná velikost otisku (hash) obsahu</translation> </message> <message> <source>Invalid transform seed size</source> - <translation type="unfinished"/> + <translation>Neplatná velikost transformačního náhodného čísla (seed)</translation> </message> <message> <source>Invalid number of transform rounds</source> - <translation type="unfinished"/> + <translation>Neplatný počet transformačních průchodů</translation> </message> <message> <source>Unable to construct group tree</source> - <translation type="unfinished"/> + <translation>Nedaří se vytvořit strom skupin</translation> </message> <message> <source>Root</source> @@ -2302,103 +2477,103 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>Unable to calculate master key</source> - <translation>Nedaří se spočítat hlavní klíč</translation> + <translation>Nedaří se vypočítat hlavní klíč</translation> </message> <message> <source>Wrong key or database file is corrupt.</source> - <translation>Byl zadán chybný klíč, nebo je poškozen databázový soubor.</translation> + <translation>Byl zadán nesprávný klíč, nebo je soubor s databází poškozený.</translation> </message> <message> <source>Key transformation failed</source> - <translation type="unfinished"/> + <translation>Transformace klíče se nezdařila</translation> </message> <message> <source>Invalid group field type number</source> - <translation type="unfinished"/> + <translation>Neplatné číslo typu kolonky skupiny</translation> </message> <message> <source>Invalid group field size</source> - <translation type="unfinished"/> + <translation>Neplatná velikost kolonky skupiny</translation> </message> <message> <source>Read group field data doesn't match size</source> - <translation type="unfinished"/> + <translation>Načtená data kolonky skupiny neodpovídají velikosti</translation> </message> <message> <source>Incorrect group id field size</source> - <translation type="unfinished"/> + <translation>Nesprávná velikost kolonky identifikátoru skupiny</translation> </message> <message> <source>Incorrect group creation time field size</source> - <translation type="unfinished"/> + <translation>Nesprávná velikost kolonky času vytvoření skupiny</translation> </message> <message> <source>Incorrect group modification time field size</source> - <translation type="unfinished"/> + <translation>Nesprávná velikost kolonky času úpravy skupiny</translation> </message> <message> <source>Incorrect group access time field size</source> - <translation type="unfinished"/> + <translation>Nesprávná velikost kolonky času přístupu do skupiny</translation> </message> <message> <source>Incorrect group expiry time field size</source> - <translation type="unfinished"/> + <translation>Nesprávná velikost kolonky času skončení platnosti skupiny</translation> </message> <message> <source>Incorrect group icon field size</source> - <translation type="unfinished"/> + <translation>Nesprávná velikost kolonky ikony skupiny</translation> </message> <message> <source>Incorrect group level field size</source> - <translation type="unfinished"/> + <translation>Nesprávná velikost kolonky úrovně skupiny</translation> </message> <message> <source>Invalid group field type</source> - <translation type="unfinished"/> + <translation>Neplatný typ kolonky skupiny</translation> </message> <message> <source>Missing group id or level</source> - <translation type="unfinished"/> + <translation>Chybějící identifikátor nebo úroveň skupiny</translation> </message> <message> <source>Missing entry field type number</source> - <translation type="unfinished"/> + <translation>Chybí číslo typu kolonky položky</translation> </message> <message> <source>Invalid entry field size</source> - <translation type="unfinished"/> + <translation>Neplatná velikost kolonky položky</translation> </message> <message> <source>Read entry field data doesn't match size</source> - <translation type="unfinished"/> + <translation>Načtená data kolonky položky neodpovídají velikosti</translation> </message> <message> <source>Invalid entry uuid field size</source> - <translation type="unfinished"/> + <translation>Neplatná velikost kolonky neopakujícího se identifikátoru položky</translation> </message> <message> <source>Invalid entry group id field size</source> - <translation type="unfinished"/> + <translation>Neplatná velikost kolonky identifikátoru skupiny položky</translation> </message> <message> <source>Invalid entry icon field size</source> - <translation type="unfinished"/> + <translation>Neplatná velikost kolonky ikony položky</translation> </message> <message> <source>Invalid entry creation time field size</source> - <translation type="unfinished"/> + <translation>Neplatná velikost kolonky času vytvoření položky</translation> </message> <message> <source>Invalid entry modification time field size</source> - <translation type="unfinished"/> + <translation>Neplatná velikost kolonky času úpravy položky</translation> </message> <message> <source>Invalid entry expiry time field size</source> - <translation type="unfinished"/> + <translation>Neplatná velikost kolonky času konce platnosti položky</translation> </message> <message> <source>Invalid entry field type</source> - <translation type="unfinished"/> + <translation>Neplatný typ kolonky položky</translation> </message> </context> <context> @@ -2413,7 +2588,7 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>Another instance of KeePassXC is already running.</source> - <translation>Již je spuštěná jiná instance KeePassXC.</translation> + <translation>Už je spuštěná jiná instance KeePassXC.</translation> </message> <message> <source>Fatal error while testing the cryptographic functions.</source> @@ -2440,7 +2615,7 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>&Help</source> - <translation>Nápověda</translation> + <translation>&Nápověda</translation> </message> <message> <source>E&ntries</source> @@ -2452,11 +2627,11 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>Time-based one-time password</source> - <translation type="unfinished"/> + <translation>Na času založené jednorázové heslo</translation> </message> <message> <source>&Groups</source> - <translation>Skupiny</translation> + <translation>S&kupiny</translation> </message> <message> <source>&Tools</source> @@ -2464,7 +2639,7 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>&Quit</source> - <translation>Ukončit</translation> + <translation>&Ukončit</translation> </message> <message> <source>&About</source> @@ -2476,11 +2651,11 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>&Save database</source> - <translation>Uložit databázi</translation> + <translation>&Uložit databázi</translation> </message> <message> <source>&Close database</source> - <translation>Zavřít databázi</translation> + <translation>&Zavřít databázi</translation> </message> <message> <source>&New database</source> @@ -2500,7 +2675,7 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>&Delete entry</source> - <translation>Smazat záznam</translation> + <translation>&Smazat záznam</translation> </message> <message> <source>&Add new group</source> @@ -2508,11 +2683,11 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>&Edit group</source> - <translation>Upravit skupinu</translation> + <translation>&Upravit skupinu</translation> </message> <message> <source>&Delete group</source> - <translation>Smazat skupinu</translation> + <translation>&Smazat skupinu</translation> </message> <message> <source>Sa&ve database as...</source> @@ -2532,11 +2707,11 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>&Clone entry</source> - <translation>Klonovat záznam</translation> + <translation>&Klonovat záznam</translation> </message> <message> <source>&Find</source> - <translation>Najít</translation> + <translation>&Najít</translation> </message> <message> <source>Copy &username</source> @@ -2548,7 +2723,7 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>Cop&y password</source> - <translation>Zkopírovat heslo</translation> + <translation>&Zkopírovat heslo</translation> </message> <message> <source>Copy password to clipboard</source> @@ -2560,7 +2735,7 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>Password Generator</source> - <translation>Generátor hesel</translation> + <translation>Vytváření hesel</translation> </message> <message> <source>&Perform Auto-Type</source> @@ -2572,7 +2747,7 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>&Lock databases</source> - <translation>Uzamknout databáze</translation> + <translation>&Uzamknout databáze</translation> </message> <message> <source>&Title</source> @@ -2580,7 +2755,7 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>Copy title to clipboard</source> - <translation type="unfinished"/> + <translation>Zkopírovat titulek do schránky</translation> </message> <message> <source>&URL</source> @@ -2588,7 +2763,7 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>Copy URL to clipboard</source> - <translation type="unfinished"/> + <translation>Zkopírovat URL adresu do schránky</translation> </message> <message> <source>&Notes</source> @@ -2596,7 +2771,7 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>Copy notes to clipboard</source> - <translation type="unfinished"/> + <translation>Zkopírovat poznámky do schránky</translation> </message> <message> <source>&Export to CSV file...</source> @@ -2616,19 +2791,19 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>Show TOTP</source> - <translation>Zobrazit TOTP</translation> + <translation>Zobrazit na času založené jednorázové heslo (TOTP)</translation> </message> <message> <source>Set up TOTP...</source> - <translation>Nastavit TOTP…</translation> + <translation>Nastavit na času založené jednorázové heslo (TOTP)…</translation> </message> <message> <source>Copy &TOTP</source> - <translation>Zkopírovat &TOTP</translation> + <translation>Zkopírovat na času založené jednorázové heslo (&TOTP)</translation> </message> <message> <source>E&mpty recycle bin</source> - <translation type="unfinished"/> + <translation>&Vysypat koš</translation> </message> <message> <source>Clear history</source> @@ -2640,7 +2815,7 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> - <translation type="unfinished"/> + <translation><p>Zdá se, že pro napojení prohlížeče používáte KeePassHTTP. Tato funkce byla označena za zastaralou a bude v budoucnu odebrána.<br>Přejděte na KeePassXC-Browser! S přechodem pomůže <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migrační příručka</a> (varování %1 ze 3).</p></translation> </message> <message> <source>read-only</source> @@ -2682,100 +2857,112 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev <source>Please touch the button on your YubiKey!</source> <translation>Dotkněte se tlačítka na svém YubiKey zařízení!</translation> </message> + <message> + <source>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</source> + <translation>VAROVÁNÍ: Používáte vývojové sestavení KeePassXC! +Je zde vysoké riziko poškození dat, proto udržujte zálohu svých databází. +Tato verze není určena pro produkční použití.</translation> + </message> </context> <context> <name>OpenSSHKey</name> <message> <source>Invalid key file, expecting an OpenSSH key</source> - <translation type="unfinished"/> + <translation>Neplatný soubor s klíčem, očekáván OpenSSH klíč</translation> </message> <message> <source>PEM boundary mismatch</source> - <translation type="unfinished"/> - </message> - <message> - <source>This is not an OpenSSH key, only modern keys are supported</source> - <translation type="unfinished"/> + <translation>Neshoda v PEM hranici</translation> </message> <message> <source>Base64 decoding failed</source> - <translation type="unfinished"/> + <translation>Dekódování Base64 se nezdařilo</translation> </message> <message> <source>Key file way too small.</source> - <translation type="unfinished"/> + <translation>Soubor s klíčem je příliš malý.</translation> </message> <message> <source>Key file magic header id invalid</source> - <translation type="unfinished"/> + <translation>Neplatný identifikátor magic hlavičky souboru s klíčem</translation> </message> <message> <source>Found zero keys</source> - <translation type="unfinished"/> + <translation>Nenalezeny žádné klíče</translation> </message> <message> <source>Failed to read public key.</source> - <translation type="unfinished"/> + <translation>Nepodařilo se načíst veřejnou část klíče.</translation> </message> <message> <source>Corrupted key file, reading private key failed</source> - <translation type="unfinished"/> + <translation>Poškozený soubor s klíčem, čtení soukromé části klíče se nezdařilo</translation> </message> <message> <source>No private key payload to decrypt</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown cipher: </source> - <translation>Neznámá šifra:</translation> + <translation>Žádná obsažená soukromá část klíče k rozšifrování</translation> </message> <message> <source>Trying to run KDF without cipher</source> - <translation type="unfinished"/> + <translation>Snažíte se spustit funkci odvození klíče bez šifry</translation> </message> <message> <source>Passphrase is required to decrypt this key</source> - <translation type="unfinished"/> + <translation>Pro rozšifrování tohoto klíče je třeba zadat heslovou frázi</translation> </message> <message> <source>Key derivation failed, key file corrupted?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown KDF: </source> - <translation>Neznámé KDF:</translation> + <translation>Odvození klíče se nezdařilo, soubor s klíčem je poškozený?</translation> </message> <message> <source>Decryption failed, wrong passphrase?</source> - <translation type="unfinished"/> + <translation>Rozšifrování se nezdařilo, chybná heslová fráze?</translation> </message> <message> <source>Unexpected EOF while reading public key</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown key type: </source> - <translation type="unfinished"/> + <translation>Neočekávaný konec souboru při čtení veřejné části klíče</translation> </message> <message> <source>Unexpected EOF while reading private key</source> - <translation type="unfinished"/> + <translation>Neočekávaný konec souboru při čtení soukromé části klíče</translation> </message> <message> <source>Can't write public key as it is empty</source> - <translation type="unfinished"/> + <translation>Není možné zapsat veřejnou část klíče, protože je prázdná</translation> </message> <message> <source>Unexpected EOF when writing public key</source> - <translation type="unfinished"/> + <translation>Neočekávaný konec souboru při zápisu veřejné části klíče</translation> </message> <message> <source>Can't write private key as it is empty</source> - <translation type="unfinished"/> + <translation>Není možné zapsat soukromou část klíče, protože je prázdná</translation> </message> <message> <source>Unexpected EOF when writing private key</source> - <translation type="unfinished"/> + <translation>Neočekávaný konec souboru při zápisu soukromé části klíče</translation> + </message> + <message> + <source>Unsupported key type: %1</source> + <translation>Nepodporovaný typ klíče: %1</translation> + </message> + <message> + <source>Unknown cipher: %1</source> + <translation>Neznámá šifra: %1</translation> + </message> + <message> + <source>Cipher IV is too short for MD5 kdf</source> + <translation>Cifra IV je příliš krátká pro MD5 funkci pro odvození klíče</translation> + </message> + <message> + <source>Unknown KDF: %1</source> + <translation>Neznámá funkce pro odvození klíče: %1</translation> + </message> + <message> + <source>Unknown key type: %1</source> + <translation>Neznámý typ klíče: %1</translation> </message> </context> <context> @@ -2803,19 +2990,19 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation>Vrátí pouze nejlepší shody pro konkrétní URL adresu namísto všech položek pro celou doménu.</translation> + <translation>Odpoví pouze nejlepšími shodami pro konkrétní URL adresu namísto všech položek pro celou doménu.</translation> </message> <message> <source>&Return only best matching entries</source> - <translation>V&racet pouze nejlépe odpovídající položky</translation> + <translation>Odpovídat pouze nejlépe se shodujícími položkami</translation> </message> <message> <source>Re&quest to unlock the database if it is locked</source> - <translation>Vyžádat odemknutí zamčené databáze</translation> + <translation>&Vyžádat odemknutí zamčené databáze</translation> </message> <message> <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation>Jsou vráceny pouze položky se stejným schématem (http://, https://, ftp://, …).</translation> + <translation>Je odpovězeno pouze položkami se stejným schématem (http://, https://, ftp://, …).</translation> </message> <message> <source>&Match URL schemes</source> @@ -2839,7 +3026,7 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>Password Generator</source> - <translation>Generátor hesel</translation> + <translation>Vytváření hesel</translation> </message> <message> <source>Advanced</source> @@ -2855,7 +3042,7 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>Only the selected database has to be connected with a client.</source> - <translation>Pouze označené databáze budou spojeny s klientem.</translation> + <translation>Pouze označené databáze je třeba spojit s klientem.</translation> </message> <message> <source>Searc&h in all opened databases for matching entries</source> @@ -2863,11 +3050,11 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>Automatically creating or updating string fields is not supported.</source> - <translation>Automatická vytváření nebo aktualizace nejsou u textových kolonek podporované!</translation> + <translation>Automatické vytváření nebo aktualizace není u textových kolonek podporované!</translation> </message> <message> <source>&Return advanced string fields which start with "KPH: "</source> - <translation>Odpovědět také kolonkami pok&ročilých textových řetězců které začínají na „KPH:“</translation> + <translation>Odpovědět také kolonkami pok&ročilých textových řetězců které začínají na „KPH: “</translation> </message> <message> <source>HTTP Port:</source> @@ -2883,11 +3070,11 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source><b>Warning:</b> The following options can be dangerous!</source> - <translation type="unfinished"/> + <translation><b>Varování:</b> Následující předvolby mohou být nebezpečné!</translation> </message> <message> <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> - <translation type="unfinished"/> + <translation><p>KeePassHTTP byl označen za zastaralý a bude v budoucnu odebrán.<br>Přejděte na KeePassXC-Browser! Pomoc s přechodem naleznete v <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migrační příručce</a>.</p></translation> </message> <message> <source>Cannot bind to privileged ports</source> @@ -2897,7 +3084,7 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev <source>Cannot bind to privileged ports below 1024! Using default port 19455.</source> <translation>Není možné navázat na porty s číslem nižším, než 1024! -Náhradně bude použit port 19455.</translation> +Náhradně bude použit výchozí port 19455.</translation> </message> </context> <context> @@ -3001,98 +3188,98 @@ Náhradně bude použit port 19455.</translation> </message> <message> <source>Password Quality: %1</source> - <translation>Kvalita hesla: %1</translation> + <translation>Odolnost hesla: %1</translation> </message> <message> <source>Poor</source> <comment>Password quality</comment> - <translation>Velmi slabé</translation> + <translation>Velmi slabá</translation> </message> <message> <source>Weak</source> <comment>Password quality</comment> - <translation>Slabé</translation> + <translation>Slabá</translation> </message> <message> <source>Good</source> <comment>Password quality</comment> - <translation>Dobré</translation> + <translation>Dobrá</translation> </message> <message> <source>Excellent</source> <comment>Password quality</comment> - <translation>Výborné</translation> + <translation>Výborná</translation> </message> </context> <context> <name>QObject</name> <message> <source>Database not opened</source> - <translation type="unfinished"/> + <translation>Databáze nebyla otevřena</translation> </message> <message> <source>Database hash not available</source> - <translation type="unfinished"/> + <translation>Otisk (hash) databáze není k dispozici</translation> </message> <message> <source>Client public key not received</source> - <translation type="unfinished"/> + <translation>Neobdržena veřejná část klíče klienta</translation> </message> <message> <source>Cannot decrypt message</source> - <translation type="unfinished"/> + <translation>Zprávu se nedaří rozšifrovat</translation> </message> <message> <source>Timeout or cannot connect to KeePassXC</source> - <translation type="unfinished"/> + <translation>Překročení časového limitu nebo se nedaří spojit s KeePassXC</translation> </message> <message> <source>Action cancelled or denied</source> - <translation type="unfinished"/> + <translation>Akce zrušena nebo odepřena</translation> </message> <message> <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> - <translation type="unfinished"/> + <translation>Zprávu se nedaří zašifrovat nebo nebyla nalezena veřejná část klíče. Je v KeePassXC zapnuté posílání zpráv mezi webovým prohlížečem a desktopovou aplikací (native messaging)?</translation> </message> <message> <source>KeePassXC association failed, try again</source> - <translation type="unfinished"/> + <translation>Přiřazení KeePassXC se nezdařilo, zkuste to znovu</translation> </message> <message> <source>Key change was not successful</source> - <translation type="unfinished"/> + <translation>Výměna klíče nebyla úspěšná</translation> </message> <message> <source>Encryption key is not recognized</source> - <translation type="unfinished"/> + <translation>Šifrovací klíč nebyl rozpoznán</translation> </message> <message> <source>No saved databases found</source> - <translation type="unfinished"/> + <translation>Nebyly nalezeny žádné uložené databáze</translation> </message> <message> <source>Incorrect action</source> - <translation type="unfinished"/> + <translation>Nesprávná akce</translation> </message> <message> <source>Empty message received</source> - <translation type="unfinished"/> + <translation>Obdržena prázdná zpráva</translation> </message> <message> <source>No URL provided</source> - <translation type="unfinished"/> + <translation>Nebyla zadána žádná URL adresa</translation> </message> <message> <source>No logins found</source> - <translation type="unfinished"/> + <translation>Nenalezeny žádné přihlašovací údaje</translation> </message> <message> <source>Unknown error</source> - <translation type="unfinished"/> + <translation>Neznámá chyba</translation> </message> <message> <source>Add a new entry to a database.</source> - <translation type="unfinished"/> + <translation>Přidat do databáze novou položku.</translation> </message> <message> <source>Path of the database.</source> @@ -3100,15 +3287,15 @@ Náhradně bude použit port 19455.</translation> </message> <message> <source>Key file of the database.</source> - <translation type="unfinished"/> + <translation>Soubor s klíčem k databázi.</translation> </message> <message> <source>path</source> - <translation>cesta</translation> + <translation>popis umístění</translation> </message> <message> <source>Username for the entry.</source> - <translation type="unfinished"/> + <translation>Uživatelské jméno pro záznam.</translation> </message> <message> <source>username</source> @@ -3116,7 +3303,7 @@ Náhradně bude použit port 19455.</translation> </message> <message> <source>URL for the entry.</source> - <translation type="unfinished"/> + <translation>URL adresa pro položku.</translation> </message> <message> <source>URL</source> @@ -3124,15 +3311,15 @@ Náhradně bude použit port 19455.</translation> </message> <message> <source>Prompt for the entry's password.</source> - <translation type="unfinished"/> + <translation>Dotázat se na heslo položky.</translation> </message> <message> <source>Generate a password for the entry.</source> - <translation type="unfinished"/> + <translation>Vytvořit heslo pro položku.</translation> </message> <message> <source>Length for the generated password.</source> - <translation type="unfinished"/> + <translation>Délka vytvářeného hesla.</translation> </message> <message> <source>length</source> @@ -3140,48 +3327,48 @@ Náhradně bude použit port 19455.</translation> </message> <message> <source>Path of the entry to add.</source> - <translation type="unfinished"/> + <translation>Popis umístění záznamu, který přidat.</translation> </message> <message> <source>Copy an entry's password to the clipboard.</source> - <translation type="unfinished"/> + <translation>Zkopírovat heslo záznamu do schránky.</translation> </message> <message> <source>Path of the entry to clip.</source> <comment>clip = copy to clipboard</comment> - <translation type="unfinished"/> + <translation>Popis umístění záznamu ke zkopírování do schránky.</translation> </message> <message> <source>Timeout in seconds before clearing the clipboard.</source> - <translation type="unfinished"/> + <translation>Časová prodleva (v sekundách) před vymazáním obsahu schránky.</translation> </message> <message> <source>Edit an entry.</source> - <translation type="unfinished"/> + <translation>Upravit položku.</translation> </message> <message> <source>Title for the entry.</source> - <translation type="unfinished"/> + <translation>Titulek pro položku.</translation> </message> <message> <source>title</source> - <translation type="unfinished"/> + <translation>titulek</translation> </message> <message> <source>Path of the entry to edit.</source> - <translation type="unfinished"/> + <translation>Popis umístění položky kterou upravit.</translation> </message> <message> <source>Estimate the entropy of a password.</source> - <translation type="unfinished"/> + <translation>Odhadnout nahodilost hesla.</translation> </message> <message> <source>Password for which to estimate the entropy.</source> - <translation type="unfinished"/> + <translation>Heslo pro které odhadnout nahodilost.</translation> </message> <message> <source>Perform advanced analysis on the password.</source> - <translation type="unfinished"/> + <translation>Provést pokročilou analýzu hesla.</translation> </message> <message> <source>Extract and print the content of a database.</source> @@ -3189,33 +3376,38 @@ Náhradně bude použit port 19455.</translation> </message> <message> <source>Path of the database to extract.</source> - <translation>Umístění extrahované databáze.</translation> + <translation>Umístění databáze ze které vytáhnout.</translation> </message> <message> <source>Insert password to unlock %1: </source> - <translation type="unfinished"/> + <translation>Zadejte heslo pro odemknutí %1:</translation> </message> <message> <source>Failed to load key file %1 : %2</source> - <translation type="unfinished"/> + <translation>Nepodařilo se načíst soubor s klíčem %1: %2</translation> </message> <message> <source>WARNING: You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>VAROVÁNÍ: Používáte starší formát souboru s klíčem, který v budoucnu nemusí být podporován. + +Zvažte vytvoření nového souboru s klíčem.</translation> </message> <message> <source> Available commands: </source> - <translation type="unfinished"/> + <translation> + +Příkazy k dispozici: +</translation> </message> <message> <source>Name of the command to execute.</source> - <translation>Název příkazu ke spuštění.</translation> + <translation>Název příkazu, který spustit.</translation> </message> <message> <source>List database entries.</source> @@ -3223,15 +3415,15 @@ Available commands: </message> <message> <source>Path of the group to list. Default is /</source> - <translation>Umístění seznamu skupin. Výchozí je /</translation> + <translation>Umístění skupiny, kterou vypsat. Výchozí je /</translation> </message> <message> <source>Find entries quickly.</source> - <translation type="unfinished"/> + <translation>Najděte položky rychle.</translation> </message> <message> <source>Search term.</source> - <translation type="unfinished"/> + <translation>Hledat pojem.</translation> </message> <message> <source>Merge two databases.</source> @@ -3239,27 +3431,27 @@ Available commands: </message> <message> <source>Path of the database to merge into.</source> - <translation>Umístění sloučené databáze.</translation> + <translation>Umístění databáze do které sloučit.</translation> </message> <message> <source>Path of the database to merge from.</source> - <translation>Umístění výchozí databáze.</translation> + <translation>Umístění databáze ze které sloučit.</translation> </message> <message> <source>Use the same credentials for both database files.</source> - <translation type="unfinished"/> + <translation>Použít stejné přihlašovací údaje pro oba databázové soubory.</translation> </message> <message> <source>Key file of the database to merge from.</source> - <translation type="unfinished"/> + <translation>Soubor s klíčem k databázi, ze které sloučit.</translation> </message> <message> <source>Show an entry's information.</source> - <translation type="unfinished"/> + <translation>Zobrazit informace o položce.</translation> </message> <message> <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> - <translation type="unfinished"/> + <translation>Názvy atributů které zobrazit. Tato předvolba může být zadaná vícekrát, pro každý z atributů zvlášť na řádku v daném pořadí. Pokud nejsou zadány žádné atributy, je zobrazen souhrn výchozích atributů.</translation> </message> <message> <source>attribute</source> @@ -3271,7 +3463,7 @@ Available commands: </message> <message> <source>NULL device</source> - <translation>NULL zařízení</translation> + <translation>Prázdné zařízení</translation> </message> <message> <source>error reading from device</source> @@ -3285,7 +3477,7 @@ Available commands: </message> <message> <source>malformed string</source> - <translation>špatně formovaný řetězec</translation> + <translation>chybně formovaný řetězec</translation> </message> <message> <source>missing closing quote</source> @@ -3293,19 +3485,19 @@ Available commands: </message> <message> <source>AES: 256-bit</source> - <translation type="unfinished"/> + <translation>AES: 256-bit</translation> </message> <message> <source>Twofish: 256-bit</source> - <translation type="unfinished"/> + <translation>Twofish: 256-bit</translation> </message> <message> <source>ChaCha20: 256-bit</source> - <translation type="unfinished"/> + <translation>ChaCha20: 256-bit</translation> </message> <message> <source>Argon2 (KDBX 4 – recommended)</source> - <translation type="unfinished"/> + <translation>Argon2 (KDBX 4 – doporučeno)</translation> </message> <message> <source>AES-KDF (KDBX 4)</source> @@ -3337,19 +3529,19 @@ Available commands: </message> <message> <source>Last Modified</source> - <translation type="unfinished"/> + <translation>Okamžik poslední úpravy</translation> </message> <message> <source>Created</source> - <translation type="unfinished"/> + <translation>Vytvořeno</translation> </message> <message> <source>Legacy Browser Integration</source> - <translation type="unfinished"/> + <translation>Starý způsob napojení webového prohlížeče</translation> </message> <message> <source>Browser Integration</source> - <translation>Napojení na webový prohlížeč</translation> + <translation>Napojení webového prohlížeče</translation> </message> <message> <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source> @@ -3365,7 +3557,53 @@ Available commands: </message> <message> <source>SSH Agent</source> - <translation type="unfinished"/> + <translation>SSH agent</translation> + </message> + <message> + <source>Generate a new random diceware passphrase.</source> + <translation>Vytvořit náhodnou diceware heslovou frázi.</translation> + </message> + <message> + <source>Word count for the diceware passphrase.</source> + <translation>Počet slov pro diceware heslovou frázi.</translation> + </message> + <message> + <source>count</source> + <translation>počet</translation> + </message> + <message> + <source>Wordlist for the diceware generator. +[Default: EFF English]</source> + <translation>Slovník pro diceware generátor. +[Výchozí: EFF angličtina]</translation> + </message> + <message> + <source>Generate a new random password.</source> + <translation>Vytvořit nové náhodné heslo.</translation> + </message> + <message> + <source>Length of the generated password.</source> + <translation>Délka vytvářeného hesla.</translation> + </message> + <message> + <source>Use lowercase characters in the generated password.</source> + <translation>Použít ve vytvářeném heslu malá písmena.</translation> + </message> + <message> + <source>Use uppercase characters in the generated password.</source> + <translation>Použít ve vytvářeném heslu velká písmena.</translation> + </message> + <message> + <source>Use numbers in the generated password.</source> + <translation>Použít ve vytvářeném heslu číslice.</translation> + </message> + <message> + <source>Use special characters in the generated password.</source> + <translation>Použít ve vytvářeném heslu speciální znaky.</translation> + </message> + <message> + <source>Use extended ASCII in the generated password.</source> + <translation>Použít ve vytvářeném heslu rozšířené ASCII.</translation> </message> </context> <context> @@ -3395,7 +3633,7 @@ Available commands: <name>QtIOCompressor::open</name> <message> <source>The gzip format not supported in this version of zlib.</source> - <translation>Použitý formát gzip komprese není podporován verzí knihovny zlib, která je právě používána na tomto systému.</translation> + <translation>Formát komprese gzip není podporován verzí knihovny zlib, která je právě používána na tomto systému.</translation> </message> <message> <source>Internal zlib error: </source> @@ -3446,8 +3684,8 @@ neopakující se název pro identifikaci a potvrďte ho.</translation> <message> <source>A shared encryption-key with the name "%1" already exists. Do you want to overwrite it?</source> - <translation>Již existuje sdílený šifrovací klíč s názvem „%1“. -Chcete ho přepsat?</translation> + <translation>Už existuje sdílený šifrovací klíč s názvem „%1“. +Chcete ho chcete přepsat?</translation> </message> <message> <source>KeePassXC: Update Entry</source> @@ -3473,11 +3711,11 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> </message> <message numerus="yes"> <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Úspěšně odebrán %n šifrovací klíč z nastavení KeePassX/Http.</numerusform><numerusform>Úspěšně odebrány %n šifrovací klíče z nastavení KeePassX/Http.</numerusform><numerusform>Úspěšně odebráno %n šifrovacích klíčů z nastavení KeePassX/Http.</numerusform></translation> </message> <message> <source>KeePassXC: No keys found</source> - <translation>KeePassXC: Klíče nebyly nalezeny</translation> + <translation>KeePassXC: Nebyly nalezeny žádné klíče</translation> </message> <message> <source>No shared encryption-keys found in KeePassHttp Settings.</source> @@ -3489,7 +3727,7 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> </message> <message> <source>The active database does not contain an entry of KeePassHttp Settings.</source> - <translation>Právě otevřená databáze neobsahuje žádný záznam nastavení KeePassHttp.</translation> + <translation>Právě otevřená databáze neobsahuje žádný záznam nastavení pro KeePassHttp.</translation> </message> <message> <source>Removing stored permissions...</source> @@ -3505,11 +3743,11 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> </message> <message numerus="yes"> <source>Successfully removed permissions from %n entries.</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Úspěšně odebrána oprávnění z %n položky.</numerusform><numerusform>Úspěšně odebrána oprávnění ze %n položek.</numerusform><numerusform>Úspěšně odebrána oprávnění z %n položek.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> - <translation>KeePassXC: Nebyl nalezen záznam s oprávněními!</translation> + <translation>KeePassXC: Nebyl nalezen žádný záznam s oprávněními!</translation> </message> <message> <source>The active database does not contain an entry with permissions.</source> @@ -3567,7 +3805,7 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> </message> <message> <source>Automatically reload the database when modified externally</source> - <translation>V případě úpravy zvenčí, automaticky opětovně načíst databázi</translation> + <translation>V případě úpravy zvenčí, automaticky znovu načíst databázi</translation> </message> <message> <source>Minimize when copying to clipboard</source> @@ -3579,15 +3817,15 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> </message> <message> <source>Use group icon on entry creation</source> - <translation>Pro vytvářený záznam použít ikonu skupiny, do které spadá</translation> + <translation>Pro vytvářený záznam použít ikonu skupiny, pod kterou je vytvářen</translation> </message> <message> <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> - <translation>Neoznačovat databázi jako upravenou při změnách, nepostihujících údaje (např. rozšíření skupin)</translation> + <translation>Neoznačovat databázi jako upravenou při změnách, nepostihujících údaje (např. rozkliknutí skupin)</translation> </message> <message> <source>Hide the Details view</source> - <translation type="unfinished"/> + <translation>Skrýt podrobný pohled</translation> </message> <message> <source>Show a system tray icon</source> @@ -3603,7 +3841,7 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> </message> <message> <source>Dark system tray icon</source> - <translation type="unfinished"/> + <translation>Tmavá ikona v oznamovací oblasti systémového panelu</translation> </message> <message> <source>Language</source> @@ -3615,11 +3853,11 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> </message> <message> <source>Use entry title to match windows for global Auto-Type</source> - <translation type="unfinished"/> + <translation>Použít titulek položky pro hledání shody s okny pro všeobecné automatické vyplňování</translation> </message> <message> <source>Use entry URL to match windows for global Auto-Type</source> - <translation type="unfinished"/> + <translation>Použít URL adresu položky pro hledání shody s okny pro všeobecné automatické vyplňování</translation> </message> <message> <source>Always ask before performing Auto-Type</source> @@ -3638,6 +3876,30 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> <comment>Milliseconds</comment> <translation> ms</translation> </message> + <message> + <source>Startup</source> + <translation>Spouštění</translation> + </message> + <message> + <source>File Management</source> + <translation>Správa souboru</translation> + </message> + <message> + <source>Safely save database files (may be incompatible with Dropbox, etc)</source> + <translation>Ukládat databázové soubory bezpečně (může být neslučitelné s Dropbox, atd.)</translation> + </message> + <message> + <source>Backup database file before saving</source> + <translation>Před uložením zazálohovat databázový soubor</translation> + </message> + <message> + <source>Entry Management</source> + <translation>Správa záznamu</translation> + </message> + <message> + <source>General</source> + <translation>Obecné</translation> + </message> </context> <context> <name>SettingsWidgetSecurity</name> @@ -3664,7 +3926,7 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> </message> <message> <source>Lock databases when session is locked or lid is closed</source> - <translation>Zamknout databáze když je zamčena relace nebo je zavřeno víko notebooku</translation> + <translation>Zamknout databáze když je zamčeno sezení uživatele v operačním systému nebo je zavřeno víko notebooku</translation> </message> <message> <source>Lock databases after minimizing the window</source> @@ -3680,11 +3942,11 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> </message> <message> <source>Hide passwords in the preview panel</source> - <translation type="unfinished"/> + <translation>Skrýt hesla v náhledovém panelu</translation> </message> <message> <source>Hide entry notes by default</source> - <translation type="unfinished"/> + <translation>Skrývat ve výchozím stavu poznámky k položkám</translation> </message> <message> <source>Privacy</source> @@ -3694,12 +3956,16 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> <source>Use Google as fallback for downloading website icons</source> <translation>Použít Google jako náhradní zdroj pro stahování ikon webů</translation> </message> + <message> + <source>Re-lock previously locked database after performing Auto-Type</source> + <translation>Po provedení automatického vyplnění opět zamknout dříve uzamčenou databázi.</translation> + </message> </context> <context> <name>SetupTotpDialog</name> <message> <source>Setup TOTP</source> - <translation>Nastavit TOTP</translation> + <translation>Nastavit na času založené jednorázové heslo (TOTP)</translation> </message> <message> <source>Key:</source> @@ -3707,11 +3973,11 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> </message> <message> <source>Default RFC 6238 token settings</source> - <translation type="unfinished"/> + <translation>Výchozí nastavení RFC 6238 tokenu</translation> </message> <message> <source>Steam token settings</source> - <translation type="unfinished"/> + <translation>Nastavení proudového tokenu</translation> </message> <message> <source>Use custom settings</source> @@ -3775,10 +4041,6 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> </context> <context> <name>WelcomeWidget</name> - <message> - <source>Welcome to KeePassXC</source> - <translation>Vítejte v KeePassXC</translation> - </message> <message> <source>Start storing your passwords securely in a KeePassXC database</source> <translation>Začněte uchovávat svá hesla bezpečně v KeePassXC databázi</translation> @@ -3803,12 +4065,16 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> <source>Recent databases</source> <translation>Nedávno otevřené databáze</translation> </message> + <message> + <source>Welcome to KeePassXC %1</source> + <translation>Vítejte v KeePassXC %1</translation> + </message> </context> <context> <name>main</name> <message> <source>Remove an entry from the database.</source> - <translation type="unfinished"/> + <translation>Odebrat položku z databáze.</translation> </message> <message> <source>Path of the database.</source> @@ -3816,7 +4082,7 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> </message> <message> <source>Path of the entry to remove.</source> - <translation type="unfinished"/> + <translation>Popis umístění položky k odebrání.</translation> </message> <message> <source>KeePassXC - cross-platform password manager</source> @@ -3828,7 +4094,7 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> </message> <message> <source>path to a custom config file</source> - <translation>umístění vlastního souboru s nastaveními</translation> + <translation>umístění uživatelem určeného souboru s nastaveními</translation> </message> <message> <source>key file of the database</source> @@ -3840,7 +4106,7 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> </message> <message> <source>Parent window handle</source> - <translation type="unfinished"/> + <translation>Obecný identifikátor (handle) nadřazeného okna</translation> </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_da.ts b/share/translations/keepassx_da.ts index 563f6adb3..31c93e6cf 100644 --- a/share/translations/keepassx_da.ts +++ b/share/translations/keepassx_da.ts @@ -9,14 +9,30 @@ <source>About</source> <translation>Om</translation> </message> + <message> + <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> + <translation>Rapportér fejl på: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> + </message> + <message> + <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>KeePassXC distribueres under betingelserne i GNU General Public License (GPL) version 2 eller (efter eget valg) version 3.</translation> + </message> <message> <source>Contributors</source> <translation>Bidragsydere</translation> </message> + <message> + <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Se bidrag på GitHub</a></translation> + </message> <message> <source>Debug Info</source> <translation>Fejlsøgningsinformation</translation> </message> + <message> + <source>Include the following information whenever you report a bug:</source> + <translation>Inkludér følgende information når du indrapporterer en fejl:</translation> + </message> <message> <source>Copy to clipboard</source> <translation>Kopier til udklipsholder</translation> @@ -31,6 +47,10 @@ <source>Revision: %1</source> <translation>Revision: %1</translation> </message> + <message> + <source>Distribution: %1</source> + <translation>Distribution: %1</translation> + </message> <message> <source>Libraries:</source> <translation>Biblioteker:</translation> @@ -47,33 +67,26 @@ Kerne: %3 %4</translation> <source>Enabled extensions:</source> <translation>Aktiverede udvidelser:</translation> </message> - <message> - <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> - <translation>Rapportér fejl på: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> - </message> - <message> - <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassXC distribueres under betingelserne i GNU General Public License (GPL) version 2 eller (efter eget valg) version 3.</translation> - </message> <message> <source>Project Maintainers:</source> <translation>Projektet vedligeholdes af:</translation> </message> <message> - <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Se bidrag på GitHub</a></translation> + <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> + <translation type="unfinished"/> </message> <message> - <source>Include the following information whenever you report a bug:</source> - <translation>Inkludér følgende information når du indrapporterer en fejl:</translation> - </message> - <message> - <source>Distribution: %1</source> + <source>Build Type: %1 +</source> <translation type="unfinished"/> </message> </context> <context> <name>AccessControlDialog</name> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>KeePassXC HTTP Bekræft Adgang</translation> + </message> <message> <source>Remember this decision</source> <translation>Husk dette valg</translation> @@ -92,9 +105,12 @@ Please select whether you want to allow access.</source> <translation>%1 har forespurgt adgang til kodeord tilhørende disse element(er). Vælg venligst hvorvidt du vil tillade denne adgang.</translation> </message> +</context> +<context> + <name>AgentSettingsWidget</name> <message> - <source>KeePassXC HTTP Confirm Access</source> - <translation>KeePassXC HTTP Bekræft Adgang</translation> + <source>Enable SSH Agent (requires restart)</source> + <translation>Slå SSH Agenten til (kræver genstart)</translation> </message> </context> <context> @@ -107,6 +123,26 @@ Vælg venligst hvorvidt du vil tillade denne adgang.</translation> <source>Auto-Type - KeePassXC</source> <translation>Auto-Indsæt - KeePassXC</translation> </message> + <message> + <source>Auto-Type</source> + <translation>Auto-Indsæt</translation> + </message> + <message> + <source>The Syntax of your Auto-Type statement is incorrect!</source> + <translation>Syntaksen af dit Auto-Type udtryk er forkert!</translation> + </message> + <message> + <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> + <translation>Denne Auto-Indsæt sætning indeholder en meget lang pause. Er du sikker på at du vil fortsætte? </translation> + </message> + <message> + <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> + <translation>Denne Auto-Indsæt kommando indeholder meget langsomme tastetryk. Er du sikker på at du vil fortsætte? </translation> + </message> + <message> + <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> + <translation>Denne Auto-Indsæt kommando indeholder argumenter, som er gentaget ofte. Er du sikker på at du vil fortsætte? </translation> + </message> </context> <context> <name>AutoTypeAssociationsModel</name> @@ -123,15 +159,315 @@ Vælg venligst hvorvidt du vil tillade denne adgang.</translation> <translation>Standardsekvens</translation> </message> </context> +<context> + <name>AutoTypeMatchModel</name> + <message> + <source>Group</source> + <translation>Gruppe</translation> + </message> + <message> + <source>Title</source> + <translation>Titel</translation> + </message> + <message> + <source>Username</source> + <translation>Brugernavn</translation> + </message> + <message> + <source>Sequence</source> + <translation>Sekvens</translation> + </message> +</context> <context> <name>AutoTypeSelectDialog</name> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>Auto-Indsæt - KeePassXC</translation> + </message> <message> <source>Select entry to Auto-Type:</source> <translation>Vælg post til Auto-Indsæt:</translation> </message> +</context> +<context> + <name>BrowserAccessControlDialog</name> <message> - <source>Auto-Type - KeePassXC</source> - <translation>Auto-Indsæt - KeePassXC</translation> + <source>KeePassXC-Browser Confirm Access</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remember this decision</source> + <translation>Husk dette valg</translation> + </message> + <message> + <source>Allow</source> + <translation>Tillad</translation> + </message> + <message> + <source>Deny</source> + <translation>Afvis</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 har forespurgt adgang til kodeord tilhørende disse element(er). +Vælg venligst hvorvidt du vil tillade denne adgang.</translation> + </message> +</context> +<context> + <name>BrowserOptionDialog</name> + <message> + <source>Dialog</source> + <translation type="unfinished"/> + </message> + <message> + <source>This is required for accessing your databases with KeePassXC-Browser</source> + <translation>Dette er nødvendigt for at tilgå din database med KeePassXC-Browser</translation> + </message> + <message> + <source>Enable KeepassXC browser integration</source> + <translation>Slå KeepassXC browser integration til</translation> + </message> + <message> + <source>General</source> + <translation>Generelt</translation> + </message> + <message> + <source>Enable integration for these browsers:</source> + <translation>Slå integration til for disse browsere:</translation> + </message> + <message> + <source>&Google Chrome</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Firefox</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Chromium</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Vivaldi</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show a &notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Anmod om at låse databasen op hvis den er låst</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Match URL scheme (e.g., https://...)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>Returner kun det bedste match for en specifik URL i stedet for alle matches for hele domænet.</translation> + </message> + <message> + <source>&Return only best-matching credentials</source> + <translation type="unfinished"/> + </message> + <message> + <source>Sort &matching credentials by title</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Sort matching credentials by &username</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>&Disconnect all browsers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Forget all remembered &permissions</source> + <translation type="unfinished"/> + </message> + <message> + <source>Advanced</source> + <translation>Avanceret</translation> + </message> + <message> + <source>Never &ask before accessing credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Never ask before &updating credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>Kun den valgte database er nødt til at være forbundet med en klient.</translation> + </message> + <message> + <source>Searc&h in all opened databases for matching credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>At automatisk skabe eller opdatere tekst-felter er ikke understøttet.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation type="unfinished"/> + </message> + <message> + <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Update &native messaging manifest files at startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Support a proxy application between KeePassXC and browser extension.</source> + <translation>Understøt en proxy applikation mellem KeePassXC og browser-udvidelse.</translation> + </message> + <message> + <source>Use a &proxy application between KeePassXC and browser extension</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a custom proxy location if you installed a proxy manually.</source> + <translation>Brug en brugerdefineret proxy lokation hvis du har installeret en proxy manuelt.</translation> + </message> + <message> + <source>Use a &custom proxy location</source> + <comment>Meant is the proxy for KeePassXC-Browser</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Gennemse...</translation> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation><b>Advarsel:</b>De følgende instillinger kan være farlige!</translation> + </message> + <message> + <source>Executable Files (*.exe);;All Files (*.*)</source> + <translation>Eksekverbare Filer (*.exe);;Alle Filer (*.*)</translation> + </message> + <message> + <source>Executable Files (*)</source> + <translation>Eksekverbare Filer (*)</translation> + </message> + <message> + <source>Select custom proxy location</source> + <translation>Vælg en brugerdefineret proxy lokation</translation> + </message> +</context> +<context> + <name>BrowserService</name> + <message> + <source>KeePassXC: New key association request</source> + <translation>KeePassXC: Ny nøgleassocieringsanmodelse</translation> + </message> + <message> + <source>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</source> + <translation>Du har modtaget en associeringsanmodelse for the ovenstående nøgle. + +Hvis du gerne vil give den adgang til din KeePassXC database, +så giv den et unikt navn for at kunne identificere den og accepter den.</translation> + </message> + <message> + <source>Save and allow access</source> + <translation>Gem og tillad adgang</translation> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: Overskriv eksisterende nøgle?</translation> + </message> + <message> + <source>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation>En delt krypteringsnøgle med navnet "%1" eksisterer allerede. +Vil du overskrive den?</translation> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Vil du opdatere oplysningerne i %1 - %2?</translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: Database låst!</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation>Den aktive database er låst! +Lås den valgte database op eller vælg en anden som er åbnet.</translation> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: Indstilling er ikke tilgængelig!</translation> + </message> + <message> + <source>The active database does not contain a settings entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: Ingen nøgler fundet</translation> + </message> + <message> + <source>No shared encryption keys found in KeePassXC Settings.</source> + <translation>Ingen delte krypertingsnøgler fundet i KeePassXC Indstillinger.</translation> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: Fjernede nøgler fra database</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> + <translation><numerusform>Succesfuldt fjernet %n kryptering nøgle(r) fra KeePassXC indstillinger.</numerusform><numerusform>Fjernede succesfuldt %n krypteringsnøgle(r) fra KeePassXC indstillinger.</numerusform></translation> + </message> + <message> + <source>Removing stored permissions…</source> + <translation>Fjerner gemte tilladelser...</translation> + </message> + <message> + <source>Abort</source> + <translation>Afbryd</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: Fjernede tilladelser</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entry(s).</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation type="unfinished"/> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation type="unfinished"/> </message> </context> <context> @@ -148,6 +484,10 @@ Vælg venligst hvorvidt du vil tillade denne adgang.</translation> <source>Repeat password:</source> <translation>Gentag kodeord</translation> </message> + <message> + <source>&Key file</source> + <translation>&Key fil</translation> + </message> <message> <source>Browse</source> <translation>Gennemse</translation> @@ -156,6 +496,14 @@ Vælg venligst hvorvidt du vil tillade denne adgang.</translation> <source>Create</source> <translation>Opret</translation> </message> + <message> + <source>Cha&llenge Response</source> + <translation type="unfinished"/> + </message> + <message> + <source>Refresh</source> + <translation>Genopfrisk</translation> + </message> <message> <source>Key files</source> <translation>Nøglefiler</translation> @@ -176,6 +524,10 @@ Vælg venligst hvorvidt du vil tillade denne adgang.</translation> <source>Select a key file</source> <translation>Vælg en nøglefil</translation> </message> + <message> + <source>Empty password</source> + <translation>Tomt kodeord</translation> + </message> <message> <source>Do you really want to use an empty string as password?</source> <translation>Vil du virkelig bruge en tom streng som kodeord?</translation> @@ -191,21 +543,16 @@ Vælg venligst hvorvidt du vil tillade denne adgang.</translation> %2</translation> </message> <message> - <source>&Key file</source> + <source>Legacy key file format</source> <translation type="unfinished"/> </message> <message> - <source>Cha&llenge Response</source> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> <translation type="unfinished"/> </message> - <message> - <source>Refresh</source> - <translation>Genopfrisk</translation> - </message> - <message> - <source>Empty password</source> - <translation>Tomt kodeord</translation> - </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> <translation>Kunne ikke skifte hovednøgle: ingen YubiKey indsat.</translation> @@ -217,6 +564,10 @@ Vælg venligst hvorvidt du vil tillade denne adgang.</translation> <source>Clone Options</source> <translation>Kloningsindstillinger</translation> </message> + <message> + <source>Append ' - Clone' to title</source> + <translation>Tilføj ' - Clone' til titel</translation> + </message> <message> <source>Replace username and password with references</source> <translation>Udskift brugernavn og kodeord med referencer</translation> @@ -225,10 +576,6 @@ Vælg venligst hvorvidt du vil tillade denne adgang.</translation> <source>Copy history</source> <translation>Kopier historik</translation> </message> - <message> - <source>Append ' - Clone' to title</source> - <translation>Tilføj ' - Clone' til titel</translation> - </message> </context> <context> <name>CsvImportWidget</name> @@ -324,10 +671,6 @@ Vælg venligst hvorvidt du vil tillade denne adgang.</translation> </context> <context> <name>CsvImportWizard</name> - <message> - <source>Import CSV file</source> - <translation>Importér CSV-fil</translation> - </message> <message> <source>Error</source> <translation>Fejl</translation> @@ -339,17 +682,17 @@ Vælg venligst hvorvidt du vil tillade denne adgang.</translation> </context> <context> <name>CsvParserModel</name> - <message> - <source> byte, </source> - <translation>byte,</translation> + <message numerus="yes"> + <source>%n byte(s), </source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> - <message> - <source> rows, </source> - <translation>rækker,</translation> + <message numerus="yes"> + <source>%n row(s), </source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> - <message> - <source> columns</source> - <translation>kolonner</translation> + <message numerus="yes"> + <source>%n column(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> </context> <context> @@ -370,6 +713,14 @@ Vælg venligst hvorvidt du vil tillade denne adgang.</translation> <source>Browse</source> <translation>Gennemse</translation> </message> + <message> + <source>Refresh</source> + <translation>Genopfrisk</translation> + </message> + <message> + <source>Challenge Response:</source> + <translation type="unfinished"/> + </message> <message> <source>Unable to open the database.</source> <translation>Kan ikke åbne databasen.</translation> @@ -378,6 +729,21 @@ Vælg venligst hvorvidt du vil tillade denne adgang.</translation> <source>Can't open key file</source> <translation>Kan ikke åbne nøglefil</translation> </message> + <message> + <source>Legacy key file format</source> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't show this warning again</source> + <translation type="unfinished"/> + </message> <message> <source>All files</source> <translation>Alle filer</translation> @@ -390,14 +756,6 @@ Vælg venligst hvorvidt du vil tillade denne adgang.</translation> <source>Select key file</source> <translation>Vælg nøglefil</translation> </message> - <message> - <source>Refresh</source> - <translation>Genopfrisk</translation> - </message> - <message> - <source>Challenge Response:</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DatabaseRepairWidget</name> @@ -413,14 +771,14 @@ Vælg venligst hvorvidt du vil tillade denne adgang.</translation> <source>Can't open key file</source> <translation>Kan ikke åbne nøglefil</translation> </message> - <message> - <source>Database opened fine. Nothing to do.</source> - <translation>Databasen åbnede fint. Intet at gøre.</translation> - </message> <message> <source>Unable to open the database.</source> <translation>Kan ikke åbne databasen.</translation> </message> + <message> + <source>Database opened fine. Nothing to do.</source> + <translation>Databasen åbnede fint. Intet at gøre.</translation> + </message> <message> <source>Success</source> <translation>Succes</translation> @@ -439,40 +797,69 @@ Du kan gemme den nu.</translation> <context> <name>DatabaseSettingsWidget</name> <message> - <source>Database name:</source> - <translation>Databasenavn:</translation> + <source>General</source> + <translation>Generelt</translation> </message> <message> - <source>Database description:</source> - <translation>Beskrivelse af database:</translation> + <source>Encryption</source> + <translation>Kryptering</translation> </message> <message> - <source>Transform rounds:</source> - <translation>Transformationsrunder:</translation> + <source>Number of rounds too high</source> + <comment>Key transformation rounds</comment> + <translation>Antallet af runder er for højt</translation> </message> <message> - <source>Default username:</source> - <translation>Standard brugernavn:</translation> + <source>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</source> + <translation>Du benytter et meget højt antal runder af nøgletransformationer med Argon2. + +Hvis du vil beholde antallet, så kan din database tage timer eller dage (eller endnu længere) at åbne!</translation> </message> <message> + <source>Understood, keep number</source> + <translation>Forstået, beholder nummer</translation> + </message> + <message> + <source>Cancel</source> + <translation>Afbryd</translation> + </message> + <message> + <source>Number of rounds too low</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</source> + <translation type="unfinished"/> + </message> + <message> + <source>KDF unchanged</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> <source> MiB</source> - <translation>MB</translation> + <comment>Abbreviation for Mebibytes (KDF settings)</comment> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> - <message> - <source>Benchmark</source> - <translation>Benchmark</translation> + <message numerus="yes"> + <source> thread(s)</source> + <comment>Threads for parallel execution (KDF settings)</comment> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> +</context> +<context> + <name>DatabaseSettingsWidgetEncryption</name> <message> - <source>Max. history items:</source> - <translation>Maks. posthistorik:</translation> - </message> - <message> - <source>Max. history size:</source> - <translation>Maks. historikstørrelse:</translation> - </message> - <message> - <source>Use recycle bin</source> - <translation>Brug papirkurv</translation> + <source>Encryption Algorithm:</source> + <translation type="unfinished"/> </message> <message> <source>AES: 256 Bit (default)</source> @@ -483,14 +870,78 @@ Du kan gemme den nu.</translation> <translation>Twofish: 256 Bit</translation> </message> <message> - <source>Algorithm:</source> - <translation>Algoritme:</translation> + <source>Key Derivation Function:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Transform rounds:</source> + <translation>Transformationsrunder:</translation> + </message> + <message> + <source>Benchmark 1-second delay</source> + <translation type="unfinished"/> + </message> + <message> + <source>Memory Usage:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Parallelism:</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetGeneral</name> + <message> + <source>Database Meta Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database name:</source> + <translation>Databasenavn:</translation> + </message> + <message> + <source>Database description:</source> + <translation>Beskrivelse af database:</translation> + </message> + <message> + <source>Default username:</source> + <translation>Standard brugernavn:</translation> + </message> + <message> + <source>History Settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Max. history items:</source> + <translation>Maks. posthistorik:</translation> + </message> + <message> + <source>Max. history size:</source> + <translation>Maks. historikstørrelse:</translation> + </message> + <message> + <source> MiB</source> + <translation>MB</translation> + </message> + <message> + <source>Use recycle bin</source> + <translation>Brug papirkurv</translation> + </message> + <message> + <source>Additional Database Settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable &compression (recommended)</source> + <translation type="unfinished"/> </message> </context> <context> <name>DatabaseTabWidget</name> <message> <source>Root</source> + <comment>Root group</comment> <translation>Rod</translation> </message> <message> @@ -509,6 +960,30 @@ Du kan gemme den nu.</translation> <source>File not found!</source> <translation>Filen blev ikke fundet!</translation> </message> + <message> + <source>Unable to open the database.</source> + <translation>Kan ikke åbne databasen.</translation> + </message> + <message> + <source>File opened in read only mode.</source> + <translation>Fil åbnet i skrivebeskyttet tilstand</translation> + </message> + <message> + <source>Open CSV file</source> + <translation>Åbn CSV-fil</translation> + </message> + <message> + <source>CSV file</source> + <translation>CSV-fil</translation> + </message> + <message> + <source>All files (*)</source> + <translation>Alle filer (*)</translation> + </message> + <message> + <source>Merge database</source> + <translation>Flet database</translation> + </message> <message> <source>Open KeePass 1 database</source> <translation>Åben KeePass 1 database</translation> @@ -517,14 +992,16 @@ Du kan gemme den nu.</translation> <source>KeePass 1 database</source> <translation>KeePass 1 database</translation> </message> - <message> - <source>All files (*)</source> - <translation>Alle filer (*)</translation> - </message> <message> <source>Close?</source> <translation>Luk?</translation> </message> + <message> + <source>"%1" is in edit mode. +Discard changes and close anyway?</source> + <translation>"%1" er i redigeringstilstand. +Kassér ændringer og luk alligevel?</translation> + </message> <message> <source>Save changes?</source> <translation>Gem ændringer?</translation> @@ -537,12 +1014,24 @@ Gem disse ændringer?</translation> </message> <message> <source>Writing the database failed.</source> - <translation>Kan ikke skrive til databasen.</translation> + <translation>Skrivning til database fejler.</translation> + </message> + <message> + <source>Passwords</source> + <translation>Kodeord</translation> </message> <message> <source>Save database as</source> <translation>Gem database som</translation> </message> + <message> + <source>Export database to CSV file</source> + <translation>Eksportér databasen til CSV-fil</translation> + </message> + <message> + <source>Writing the CSV file failed.</source> + <translation>Kan ikke skrive til CSV-fil.</translation> + </message> <message> <source>New database</source> <translation>Ny database</translation> @@ -560,12 +1049,6 @@ Gem disse ændringer?</translation> Please press cancel to finish your changes or discard them.</source> <translation>Kan ikke låse databasen, mens du redigerer i den. Tryk på Afbryd for at afslutte dine ændringer eller kassere dem.</translation> - </message> - <message> - <source>This database has never been saved. -You can save the database or stop locking it.</source> - <translation>Denne database er aldrig blevet gemt. -Du kan gemme databasen eller stop låsning.</translation> </message> <message> <source>This database has been modified. @@ -576,68 +1059,21 @@ Vil du gemme databasen før låsning? Ellers mister du dine ændringer.</translation> </message> <message> - <source>"%1" is in edit mode. -Discard changes and close anyway?</source> - <translation>"%1" er i redigeringstilstand. -Kassér ændringer og luk alligevel?</translation> + <source>Disable safe saves?</source> + <translation type="unfinished"/> </message> <message> - <source>Export database to CSV file</source> - <translation>Eksportér databasen til CSV-fil</translation> - </message> - <message> - <source>CSV file</source> - <translation>CSV-fil</translation> - </message> - <message> - <source>Writing the CSV file failed.</source> - <translation>Kan ikke skrive til CSV-fil.</translation> - </message> - <message> - <source>Unable to open the database.</source> - <translation>Kan ikke åbne databasen.</translation> - </message> - <message> - <source>Merge database</source> - <translation>Flet database</translation> - </message> - <message> - <source>The database you are trying to save as is locked by another instance of KeePassXC. -Do you want to save it anyway?</source> - <translation>Databasen som du prøver at gemme er låst af en anden instans af KeePassXC. -Ønsker du alligevel at gemme den?</translation> - </message> - <message> - <source>Passwords</source> - <translation>Kodeord</translation> - </message> - <message> - <source>Database already opened</source> - <translation>Database er allerede åben</translation> - </message> - <message> - <source>The database you are trying to open is locked by another instance of KeePassXC. - -Do you want to open it anyway?</source> - <translation>Databasen som du prøver at gemme er låst af en anden instans af KeePassXC. - -Ønsker du alligevel at åbne den?</translation> - </message> - <message> - <source>Open read-only</source> - <translation>Åbn skrivebeskyttet</translation> - </message> - <message> - <source>File opened in read only mode.</source> - <translation>Fil åbnet i skrivebeskyttet tilstand</translation> - </message> - <message> - <source>Open CSV file</source> - <translation>Åbn CSV-fil</translation> + <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</source> + <translation type="unfinished"/> </message> </context> <context> <name>DatabaseWidget</name> + <message> + <source>Searching...</source> + <translation>Søger...</translation> + </message> <message> <source>Change master key</source> <translation>Skift hovednøgle</translation> @@ -658,13 +1094,33 @@ Do you want to open it anyway?</source> <source>Do you really want to delete %1 entries for good?</source> <translation>Vil du virkelig slette %1 poster permanent?</translation> </message> + <message> + <source>Move entry to recycle bin?</source> + <translation>Flyt post til papirkurven?</translation> + </message> + <message> + <source>Do you really want to move entry "%1" to the recycle bin?</source> + <translation type="unfinished"/> + </message> <message> <source>Move entries to recycle bin?</source> <translation>Flyt poster til skraldespanden?</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>Ønsker du virkelig at flytte %n post over i papirkurven?</numerusform><numerusform>Ønsker du virkelig at flytte %n poster over i papirkurven?</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Execute command?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation type="unfinished"/> + </message> + <message> + <source>Remember my choice</source> + <translation type="unfinished"/> </message> <message> <source>Delete group?</source> @@ -676,19 +1132,7 @@ Do you want to open it anyway?</source> </message> <message> <source>Unable to calculate master key</source> - <translation>Kan ikke beregne hovednøgle</translation> - </message> - <message> - <source>Move entry to recycle bin?</source> - <translation>Flyt post til papirkurven?</translation> - </message> - <message> - <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Searching...</source> - <translation>Søger...</translation> + <translation>Kan ikke beregne hovednøgle</translation> </message> <message> <source>No current database.</source> @@ -707,19 +1151,7 @@ Do you want to open it anyway?</source> <translation type="unfinished"/> </message> <message> - <source>Execute command?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Do you really want to execute the following command?<br><br>%1<br></source> - <translation type="unfinished"/> - </message> - <message> - <source>Remember my choice</source> - <translation type="unfinished"/> - </message> - <message> - <source>Autoreload Request</source> + <source>File has changed</source> <translation type="unfinished"/> </message> <message> @@ -731,7 +1163,8 @@ Do you want to open it anyway?</source> <translation type="unfinished"/> </message> <message> - <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> + <source>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</source> <translation type="unfinished"/> </message> <message> @@ -746,6 +1179,93 @@ Do you want to open it anyway?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation type="unfinished"/> </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DetailsWidget</name> + <message> + <source>Generate TOTP Token</source> + <translation type="unfinished"/> + </message> + <message> + <source>Close</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>Generelt</translation> + </message> + <message> + <source>Password</source> + <translation>Kodeord</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Expiration</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username</source> + <translation>Brugernavn</translation> + </message> + <message> + <source>Autotype</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searching</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attributes</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation>Vedhæftninger</translation> + </message> + <message> + <source>Notes</source> + <translation>Noter</translation> + </message> + <message> + <source>Window</source> + <translation>Vindue</translation> + </message> + <message> + <source>Sequence</source> + <translation>Sekvens</translation> + </message> + <message> + <source>Search</source> + <translation>Søg</translation> + </message> + <message> + <source>Clear</source> + <translation type="unfinished"/> + </message> + <message> + <source>Never</source> + <translation type="unfinished"/> + </message> + <message> + <source>[PROTECTED]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Disabled</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enabled</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidget</name> @@ -773,6 +1293,30 @@ Do you want to open it anyway?</source> <source>History</source> <translation>Historik</translation> </message> + <message> + <source>SSH Agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation>Ikke aktuel</translation> + </message> + <message> + <source>(encrypted)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>File too large to be a private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open private key</source> + <translation type="unfinished"/> + </message> <message> <source>Entry history</source> <translation>Indtastningshistorik</translation> @@ -793,39 +1337,6 @@ Do you want to open it anyway?</source> <source>New attribute</source> <translation>Ny attribut</translation> </message> - <message> - <source>Select file</source> - <translation>Vælg fil</translation> - </message> - <message> - <source>Unable to open file</source> - <translation>Filen kan ikke åbnes</translation> - </message> - <message> - <source>Save attachment</source> - <translation>Gem vedhæftning</translation> - </message> - <message> - <source>Unable to save the attachment: -</source> - <translation>Kan ikke gemme vedhæftningen:</translation> - </message> - <message> - <source>Tomorrow</source> - <translation>I morgen</translation> - </message> - <message numerus="yes"> - <source>%n week(s)</source> - <translation><numerusform>%n uge</numerusform><numerusform>%n uger</numerusform></translation> - </message> - <message numerus="yes"> - <source>%n month(s)</source> - <translation><numerusform>%n måned</numerusform><numerusform>%n måneder</numerusform></translation> - </message> - <message> - <source>1 year</source> - <translation>Et år</translation> - </message> <message> <source>Confirm Remove</source> <translation type="unfinished"/> @@ -835,11 +1346,39 @@ Do you want to open it anyway?</source> <translation type="unfinished"/> </message> <message> - <source>[PROTECTED] Press reveal to view or edit</source> + <source>[PROTECTED]</source> <translation type="unfinished"/> </message> <message> - <source>Are you sure you want to remove this attachment?</source> + <source>Press reveal to view or edit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Tomorrow</source> + <translation>I morgen</translation> + </message> + <message numerus="yes"> + <source>%n week(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source>%n month(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>1 year</source> + <translation>Et år</translation> + </message> + <message> + <source>Apply generated password?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to apply the generated password to this entry?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry updated successfully.</source> <translation type="unfinished"/> </message> </context> @@ -857,18 +1396,6 @@ Do you want to open it anyway?</source> <source>Remove</source> <translation>Fjern</translation> </message> - <message> - <source>Attachments</source> - <translation>Vedhæftninger</translation> - </message> - <message> - <source>Save</source> - <translation>Gem</translation> - </message> - <message> - <source>Open</source> - <translation>Åben</translation> - </message> <message> <source>Edit Name</source> <translation type="unfinished"/> @@ -881,6 +1408,18 @@ Do you want to open it anyway?</source> <source>Reveal</source> <translation type="unfinished"/> </message> + <message> + <source>Attachments</source> + <translation>Vedhæftninger</translation> + </message> + <message> + <source>Foreground Color:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Background Color:</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -888,6 +1427,18 @@ Do you want to open it anyway?</source> <source>Enable Auto-Type for this entry</source> <translation>Aktivér Auto-Indsæt for denne post</translation> </message> + <message> + <source>Inherit default Auto-Type sequence from the &group</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Use custom Auto-Type sequence:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Window Associations</source> + <translation type="unfinished"/> + </message> <message> <source>+</source> <translation>+</translation> @@ -901,23 +1452,7 @@ Do you want to open it anyway?</source> <translation>Vinduestitel:</translation> </message> <message> - <source>Inherit default Auto-Type sequence from the &group</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Use custom Auto-Type sequence:</source> - <translation type="unfinished"/> - </message> - <message> - <source>Use default se&quence</source> - <translation type="unfinished"/> - </message> - <message> - <source>Set custo&m sequence:</source> - <translation type="unfinished"/> - </message> - <message> - <source>Window Associations</source> + <source>Use a specific sequence for this association:</source> <translation type="unfinished"/> </message> </context> @@ -943,12 +1478,8 @@ Do you want to open it anyway?</source> <context> <name>EditEntryWidgetMain</name> <message> - <source>Title:</source> - <translation>Titel:</translation> - </message> - <message> - <source>Username:</source> - <translation>Brugernavn:</translation> + <source>URL:</source> + <translation>URL:</translation> </message> <message> <source>Password:</source> @@ -959,20 +1490,104 @@ Do you want to open it anyway?</source> <translation>Gentag:</translation> </message> <message> - <source>URL:</source> - <translation>URL:</translation> + <source>Title:</source> + <translation>Titel:</translation> </message> <message> - <source>Expires</source> - <translation>Udløber</translation> + <source>Notes</source> + <translation>Noter</translation> </message> <message> <source>Presets</source> <translation>Predefinerede</translation> </message> <message> - <source>Notes:</source> - <translation>Noter:</translation> + <source>Toggle the checkbox to reveal the notes section.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username:</source> + <translation>Brugernavn:</translation> + </message> + <message> + <source>Expires</source> + <translation>Udløber</translation> + </message> +</context> +<context> + <name>EditEntryWidgetSSHAgent</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent after</source> + <translation type="unfinished"/> + </message> + <message> + <source> seconds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fingerprint</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent when database is closed/locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add key to agent when database is opened/unlocked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Comment</source> + <translation>Kommentar</translation> + </message> + <message> + <source>Decrypt</source> + <translation>Dekrypter</translation> + </message> + <message> + <source>n/a</source> + <translation>Ikke aktuel</translation> + </message> + <message> + <source>Copy to clipboard</source> + <translation>Kopier til udklipsholder</translation> + </message> + <message> + <source>Private key</source> + <translation>Privat nøgle</translation> + </message> + <message> + <source>External file</source> + <translation>Ekstern fil</translation> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Gennemse...</translation> + </message> + <message> + <source>Attachment</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add to agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove from agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Require user confirmation when this key is used</source> + <translation type="unfinished"/> </message> </context> <context> @@ -1043,6 +1658,14 @@ Do you want to open it anyway?</source> </context> <context> <name>EditWidgetIcons</name> + <message> + <source>&Use default icon</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use custo&m icon</source> + <translation type="unfinished"/> + </message> <message> <source>Add custom icon</source> <translation>Tilføj brugerbestemt ikon</translation> @@ -1051,6 +1674,18 @@ Do you want to open it anyway?</source> <source>Delete custom icon</source> <translation>Slet brugerbestemt ikon</translation> </message> + <message> + <source>Download favicon</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to fetch favicon.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> + <translation type="unfinished"/> + </message> <message> <source>Images</source> <translation>Billeder</translation> @@ -1063,24 +1698,12 @@ Do you want to open it anyway?</source> <source>Select Image</source> <translation>Vælg Billede</translation> </message> - <message> - <source>Download favicon</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unable to fetch favicon.</source> - <translation type="unfinished"/> - </message> <message> <source>Can't read icon</source> <translation type="unfinished"/> </message> <message> - <source>&Use default icon</source> - <translation type="unfinished"/> - </message> - <message> - <source>Use custo&m icon</source> + <source>Custom icon already exists</source> <translation type="unfinished"/> </message> <message> @@ -1091,14 +1714,6 @@ Do you want to open it anyway?</source> <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> <translation type="unfinished"/> </message> - <message> - <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation type="unfinished"/> - </message> - <message> - <source>Custom icon already exists</source> - <translation type="unfinished"/> - </message> </context> <context> <name>EditWidgetProperties</name> @@ -1118,11 +1733,120 @@ Do you want to open it anyway?</source> <source>Uuid:</source> <translation>Uuid:</translation> </message> + <message> + <source>Plugin Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove</source> + <translation>Fjern</translation> + </message> + <message> + <source>Delete plugin data?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Value</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Entry</name> <message> <source> - Clone</source> + <comment>Suffix added to cloned entries</comment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EntryAttachmentsModel</name> + <message> + <source>Name</source> + <translation>Navn</translation> + </message> + <message> + <source>Size</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EntryAttachmentsWidget</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add</source> + <translation>Tilføj</translation> + </message> + <message> + <source>Remove</source> + <translation>Fjern</translation> + </message> + <message> + <source>Open</source> + <translation>Åben</translation> + </message> + <message> + <source>Save</source> + <translation>Gem</translation> + </message> + <message> + <source>Select files</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <source>Are you sure you want to remove %n attachment(s)?</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Confirm Remove</source> + <translation type="unfinished"/> + </message> + <message> + <source>Save attachments</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to create directory: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Confirm overwrite</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to save attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachment: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open files: +%1</source> <translation type="unfinished"/> </message> </context> @@ -1154,6 +1878,11 @@ Do you want to open it anyway?</source> </context> <context> <name>EntryModel</name> + <message> + <source>Ref: </source> + <comment>Reference abbreviation</comment> + <translation type="unfinished"/> + </message> <message> <source>Group</source> <translation>Gruppe</translation> @@ -1171,10 +1900,64 @@ Do you want to open it anyway?</source> <translation>URL</translation> </message> <message> - <source>Ref: </source> - <comment>Reference abbreviation</comment> + <source>Never</source> <translation type="unfinished"/> </message> + <message> + <source>Password</source> + <translation>Kodeord</translation> + </message> + <message> + <source>Notes</source> + <translation>Noter</translation> + </message> + <message> + <source>Expires</source> + <translation>Udløber</translation> + </message> + <message> + <source>Created</source> + <translation>Oprettet</translation> + </message> + <message> + <source>Modified</source> + <translation>Ændret</translation> + </message> + <message> + <source>Accessed</source> + <translation>Tilgået</translation> + </message> + <message> + <source>Attachments</source> + <translation>Vedhæftninger</translation> + </message> +</context> +<context> + <name>EntryView</name> + <message> + <source>Customize View</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide Usernames</source> + <translation>Skjul brugernavne</translation> + </message> + <message> + <source>Hide Passwords</source> + <translation>Skjul kodeord</translation> + </message> + <message> + <source>Fit to window</source> + <translation>Tilpas til vindue</translation> + </message> + <message> + <source>Fit to contents</source> + <translation>Tilpas til indhold</translation> + </message> + <message> + <source>Reset to defaults</source> + <translation>Nulstil til standard-indstillinger</translation> + </message> </context> <context> <name>Group</name> @@ -1183,6 +1966,17 @@ Do you want to open it anyway?</source> <translation>Skraldespand</translation> </message> </context> +<context> + <name>HostInstaller</name> + <message> + <source>KeePassXC: Cannot save file!</source> + <translation>KeePassXC: Kan ikke gemme fil!</translation> + </message> + <message> + <source>Cannot save the native messaging script file.</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>HttpPasswordGeneratorWidget</name> <message> @@ -1199,7 +1993,7 @@ Do you want to open it anyway?</source> </message> <message> <source>A-Z</source> - <translation type="unfinished"/> + <translation>A-Z</translation> </message> <message> <source>Lower Case Letters</source> @@ -1207,7 +2001,7 @@ Do you want to open it anyway?</source> </message> <message> <source>a-z</source> - <translation type="unfinished"/> + <translation>a-z</translation> </message> <message> <source>Numbers</source> @@ -1215,7 +2009,7 @@ Do you want to open it anyway?</source> </message> <message> <source>0-9</source> - <translation type="unfinished"/> + <translation>0-9</translation> </message> <message> <source>Special Characters</source> @@ -1223,7 +2017,7 @@ Do you want to open it anyway?</source> </message> <message> <source>/*_& ...</source> - <translation type="unfinished"/> + <translation>/*_& ...</translation> </message> <message> <source>Exclude look-alike characters</source> @@ -1233,17 +2027,376 @@ Do you want to open it anyway?</source> <source>Ensure that the password contains characters from every group</source> <translation>Vær sikker på at dit kodeord indeholder tegn fra alle grupper</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>Udvidet ASCII</translation> + </message> </context> <context> <name>KMessageWidget</name> <message> <source>&Close</source> - <translation type="unfinished"/> + <translation>&Luk</translation> </message> <message> <source>Close message</source> + <translation>Luk besked</translation> + </message> +</context> +<context> + <name>Kdbx3Reader</name> + <message> + <source>Unable to calculate master key</source> + <translation>Kan ikke beregne hovednøgle</translation> + </message> + <message> + <source>Unable to issue challenge-response.</source> <translation type="unfinished"/> </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>Forkert nøgle eller databasefil er korrupt.</translation> + </message> +</context> +<context> + <name>Kdbx3Writer</name> + <message> + <source>Unable to issue challenge-response.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Kan ikke beregne hovednøgle</translation> + </message> +</context> +<context> + <name>Kdbx4Reader</name> + <message> + <source>missing database headers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Kan ikke beregne hovednøgle</translation> + </message> + <message> + <source>Invalid header checksum size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Header SHA256 mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> + <translation>Forkert nøgle eller database-filen er korrupt. (HMAC mismatch)</translation> + </message> + <message> + <source>Unknown cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header data length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open buffer for KDF parameters in header</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported key derivation function (KDF) or invalid parameters</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy header fields found in KDBX4 file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header binary size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass variant map version.</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name data</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value data</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Bool entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry type</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map field type size</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Kdbx4Writer</name> + <message> + <source>Invalid symmetric cipher algorithm.</source> + <translation>Invalid symmetrisk ciffer algoritme</translation> + </message> + <message> + <source>Invalid symmetric cipher IV size.</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Kan ikke beregne hovednøgle</translation> + </message> + <message> + <source>Failed to serialize KDF parameters variant map</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxReader</name> + <message> + <source>Invalid cipher uuid length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported cipher</source> + <translation>Ikke understøttet ciffer</translation> + </message> + <message> + <source>Invalid compression flags length</source> + <translation>Invalid længde af komprimeringsflag</translation> + </message> + <message> + <source>Unsupported compression algorithm</source> + <translation>Ikke understøttet komprimeringsalgortime</translation> + </message> + <message> + <source>Invalid master seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform rounds size</source> + <translation>Invalidt antal af transformeringsrunder</translation> + </message> + <message> + <source>Invalid start bytes size</source> + <translation>Invalid størrelse af start bytes</translation> + </message> + <message> + <source>Invalid random stream id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner random stream cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>Dette er ikke en KeePass database.</translation> + </message> + <message> + <source>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> + <translation>Den valgte fil er en gammel KeePass 1 databasefil (.kdb). + +Du kan importere den ved at klikke på Database > 'Importér KeePass 1 database...'. +Dette er en envejs konvertering. Du vil ikke være i stand til at åbne den importerede database med den gamle KeePassX 0.4 version.</translation> + </message> + <message> + <source>Unsupported KeePass 2 database version.</source> + <translation>Ikke understøttet KeePass 2 database version.</translation> + </message> +</context> +<context> + <name>KdbxXmlReader</name> + <message> + <source>XML parsing failure: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>No root group</source> + <translation>Ingen rodgruppe</translation> + </message> + <message> + <source>Missing icon uuid or data</source> + <translation>Mangler icon uuid eller data</translation> + </message> + <message> + <source>Missing custom data key or value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Multiple group elements</source> + <translation>Flere gruppe-elementer</translation> + </message> + <message> + <source>Null group uuid</source> + <translation>Tomt gruppe-uuid</translation> + </message> + <message> + <source>Invalid group icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableAutoType value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableSearching value</source> + <translation>Invalid værdi for Slå-Søgning-Til</translation> + </message> + <message> + <source>No group uuid found</source> + <translation>Intet gruppe-uuid fundet</translation> + </message> + <message> + <source>Null DeleteObject uuid</source> + <translation>Tomt Slet-Objekt uuid</translation> + </message> + <message> + <source>Missing DeletedObject uuid or time</source> + <translation>Mangler Slet-Objekt uuid eller tid</translation> + </message> + <message> + <source>Null entry uuid</source> + <translation>Tomt post-uuid</translation> + </message> + <message> + <source>Invalid entry icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element in history entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>No entry uuid found</source> + <translation>Intet post-uuid fundet</translation> + </message> + <message> + <source>History element with different uuid</source> + <translation>Historiske elementer med forskelligt uuid</translation> + </message> + <message> + <source>Unable to decrypt entry string</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate custom attribute found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry string key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate attachment found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry binary key or value missing</source> + <translation>Binær nøgle eller værdi for post mangler</translation> + </message> + <message> + <source>Auto-type association window or sequence missing</source> + <translation>Auto-Indsæt associerings-vindue eller -sekvens mangler</translation> + </message> + <message> + <source>Invalid bool value</source> + <translation>Invalid boolsk værdi</translation> + </message> + <message> + <source>Invalid date time value</source> + <translation>Invalid dato tid værdi</translation> + </message> + <message> + <source>Invalid color value</source> + <translation>Invalid farveværdi</translation> + </message> + <message> + <source>Invalid color rgb part</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number value</source> + <translation>Invalid tal-værdi</translation> + </message> + <message> + <source>Invalid uuid value</source> + <translation>Invalid uuid værdi</translation> + </message> + <message> + <source>Unable to decompress binary</source> + <extracomment>Translator meant is a binary data inside an entry</extracomment> + <translation>Kan ikke dekomprimere binær data</translation> + </message> </context> <context> <name>KeePass1OpenWidget</name> @@ -1264,7 +2417,7 @@ Do you want to open it anyway?</source> </message> <message> <source>Not a KeePass database.</source> - <translation>Ikke en KeePass database.</translation> + <translation>Dette er ikke en KeePass database.</translation> </message> <message> <source>Unsupported encryption algorithm.</source> @@ -1272,7 +2425,36 @@ Do you want to open it anyway?</source> </message> <message> <source>Unsupported KeePass database version.</source> - <translation>Ikke understøttet KeePass database version</translation> + <translation>KeePass database version ikke understøttet.</translation> + </message> + <message> + <source>Unable to read encryption IV</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of groups</source> + <translation>Invalidt antal grupper</translation> + </message> + <message> + <source>Invalid number of entries</source> + <translation>Invalidt antal poster</translation> + </message> + <message> + <source>Invalid content hash size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of transform rounds</source> + <translation>Invalidt antal transformationsfunder</translation> + </message> + <message> + <source>Unable to construct group tree</source> + <translation>Kan ikke konstruere gruppetræ</translation> </message> <message> <source>Root</source> @@ -1286,56 +2468,103 @@ Do you want to open it anyway?</source> <source>Wrong key or database file is corrupt.</source> <translation>Forkert nøgle eller databasefil er korrupt.</translation> </message> -</context> -<context> - <name>KeePass2Reader</name> <message> - <source>Not a KeePass database.</source> - <translation>Dette er ikke en KeePass database.</translation> + <source>Key transformation failed</source> + <translation>Nøgletransformering fejlede</translation> </message> <message> - <source>Unsupported KeePass database version.</source> - <translation>KeePass database version ikke understøttet.</translation> - </message> - <message> - <source>Wrong key or database file is corrupt.</source> - <translation>Forkert nøgle eller databasefil er korrupt.</translation> - </message> - <message> - <source>Unable to calculate master key</source> - <translation>Kan ikke beregne hovednøgle</translation> - </message> - <message> - <source>Unable to issue challenge-response.</source> + <source>Invalid group field type number</source> <translation type="unfinished"/> </message> <message> - <source>The selected file is an old KeePass 1 database (.kdb). - -You can import it by clicking on Database > 'Import KeePass 1 database...'. -This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> - <translation type="unfinished"/> + <source>Invalid group field size</source> + <translation>Invalid størrelse for gruppefelt</translation> </message> -</context> -<context> - <name>KeePass2Writer</name> <message> - <source>Unable to issue challenge-response.</source> + <source>Read group field data doesn't match size</source> <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>Kan ikke beregne hovednøgle</translation> + <source>Incorrect group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group access time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group level field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing group id or level</source> + <translation>Mangler gruppe id eller niveau</translation> + </message> + <message> + <source>Missing entry field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read entry field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry uuid field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field type</source> + <translation type="unfinished"/> </message> </context> <context> <name>Main</name> <message> - <source>Fatal error while testing the cryptographic functions.</source> - <translation>Fatal fejl ved test af kryptografiske funktioner.</translation> - </message> - <message> - <source>KeePassXC - Error</source> + <source>Existing single-instance lock file is invalid. Launching new instance.</source> <translation type="unfinished"/> </message> <message> @@ -1344,66 +2573,34 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Another instance of KeePassXC is already running.</source> - <translation type="unfinished"/> + <translation>En anden instans af KeePassXC kører allerede.</translation> </message> <message> - <source>Existing single-instance lock file is invalid. Launching new instance.</source> - <translation type="unfinished"/> + <source>Fatal error while testing the cryptographic functions.</source> + <translation>Fatal fejl ved test af kryptografiske funktioner.</translation> + </message> + <message> + <source>KeePassXC - Error</source> + <translation>KeePassXC - Fejl</translation> </message> </context> <context> <name>MainWindow</name> <message> - <source>Open database</source> - <translation>Åben database</translation> - </message> - <message> - <source>Database settings</source> - <translation>Databaseindstillinger</translation> - </message> - <message> - <source>Copy username to clipboard</source> - <translation>Kopiér brugernavn til udklipsholder</translation> - </message> - <message> - <source>Copy password to clipboard</source> - <translation>Kopiér kodeord til udklipsholder</translation> - </message> - <message> - <source>Settings</source> - <translation>Indstillinger</translation> - </message> - <message> - <source>Show toolbar</source> - <translation>Vis værktøjslinie</translation> - </message> - <message> - <source>read-only</source> - <translation>skrivebeskyttet</translation> - </message> - <message> - <source>Toggle window</source> - <translation>Skift vindue</translation> - </message> - <message> - <source>KeePass 2 Database</source> - <translation>KeePass 2 Database</translation> - </message> - <message> - <source>All files</source> - <translation>Alle filer</translation> - </message> - <message> - <source>Save repaired database</source> - <translation>Gem repareret database</translation> - </message> - <message> - <source>Writing the database failed.</source> - <translation>Skrivning til database fejler.</translation> + <source>&Database</source> + <translation>&Database</translation> </message> <message> <source>&Recent databases</source> - <translation type="unfinished"/> + <translation>&Seneste databaser</translation> + </message> + <message> + <source>Import</source> + <translation>Importér</translation> + </message> + <message> + <source>&Help</source> + <translation>%Hjælp</translation> </message> <message> <source>E&ntries</source> @@ -1414,32 +2611,40 @@ This is a one-way migration. You won't be able to open the imported databas <translation type="unfinished"/> </message> <message> - <source>&Groups</source> - <translation type="unfinished"/> + <source>Time-based one-time password</source> + <translation>Tidsbaseret engangskodeord</translation> </message> <message> - <source>&View</source> - <translation type="unfinished"/> + <source>&Groups</source> + <translation>&Grupper</translation> + </message> + <message> + <source>&Tools</source> + <translation>&Værktøj</translation> </message> <message> <source>&Quit</source> - <translation type="unfinished"/> + <translation>&Afslut</translation> </message> <message> <source>&About</source> - <translation type="unfinished"/> + <translation>&O</translation> + </message> + <message> + <source>&Open database...</source> + <translation>&Åben database..</translation> </message> <message> <source>&Save database</source> - <translation type="unfinished"/> + <translation>&Gem database</translation> </message> <message> <source>&Close database</source> - <translation type="unfinished"/> + <translation>&Luk database</translation> </message> <message> <source>&New database</source> - <translation type="unfinished"/> + <translation>&Ny database</translation> </message> <message> <source>Merge from KeePassX database</source> @@ -1447,131 +2652,27 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>&Add new entry</source> - <translation type="unfinished"/> + <translation>&Tilføj ny post</translation> </message> <message> <source>&View/Edit entry</source> - <translation type="unfinished"/> + <translation>&Vis/Rediger post</translation> </message> <message> <source>&Delete entry</source> - <translation type="unfinished"/> + <translation>&Slet post</translation> </message> <message> <source>&Add new group</source> - <translation type="unfinished"/> + <translation>&Tilføj ny gruppe</translation> </message> <message> <source>&Edit group</source> - <translation type="unfinished"/> + <translation>&Rediger gruppe</translation> </message> <message> <source>&Delete group</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Database settings</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Clone entry</source> - <translation type="unfinished"/> - </message> - <message> - <source>Timed one-time password</source> - <translation type="unfinished"/> - </message> - <message> - <source>Copy &TOTP</source> - <translation type="unfinished"/> - </message> - <message> - <source>Show TOTP</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Find</source> - <translation type="unfinished"/> - </message> - <message> - <source>Copy &username</source> - <translation type="unfinished"/> - </message> - <message> - <source>Cop&y password</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Settings</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Perform Auto-Type</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Open URL</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Lock databases</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Title</source> - <translation type="unfinished"/> - </message> - <message> - <source>&URL</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Notes</source> - <translation type="unfinished"/> - </message> - <message> - <source>Password Generator</source> - <translation type="unfinished"/> - </message> - <message> - <source>Clear history</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Database</source> - <translation type="unfinished"/> - </message> - <message> - <source>Import</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Tools</source> - <translation type="unfinished"/> - </message> - <message> - <source>Empty recycle bin</source> - <translation type="unfinished"/> - </message> - <message> - <source>Access error for config file %1</source> - <translation type="unfinished"/> - </message> - <message> - <source>Quit KeePassXC</source> - <translation type="unfinished"/> - </message> - <message> - <source>Please touch the button on your YubiKey!</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Help</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Open database...</source> - <translation type="unfinished"/> + <translation>&Slet gruppe</translation> </message> <message> <source>Sa&ve database as...</source> @@ -1582,25 +2683,272 @@ This is a one-way migration. You won't be able to open the imported databas <translation type="unfinished"/> </message> <message> - <source>&Export to CSV file...</source> + <source>&Database settings</source> + <translation>&Databaseindstillinger</translation> + </message> + <message> + <source>Database settings</source> + <translation>Databaseindstillinger</translation> + </message> + <message> + <source>&Clone entry</source> + <translation>&Klon post</translation> + </message> + <message> + <source>&Find</source> + <translation>&Find</translation> + </message> + <message> + <source>Copy &username</source> + <translation>Kopier &brugernavn</translation> + </message> + <message> + <source>Copy username to clipboard</source> + <translation>Kopiér brugernavn til udklipsholder</translation> + </message> + <message> + <source>Cop&y password</source> <translation type="unfinished"/> </message> + <message> + <source>Copy password to clipboard</source> + <translation>Kopiér kodeord til udklipsholder</translation> + </message> + <message> + <source>&Settings</source> + <translation>&Indstillinger</translation> + </message> + <message> + <source>Password Generator</source> + <translation>Kodeordsgenerator</translation> + </message> + <message> + <source>&Perform Auto-Type</source> + <translation>&Udfør Auto-Indsæt</translation> + </message> + <message> + <source>&Open URL</source> + <translation>&Åben URL</translation> + </message> + <message> + <source>&Lock databases</source> + <translation>%Lås databaser</translation> + </message> + <message> + <source>&Title</source> + <translation>&Titel</translation> + </message> + <message> + <source>Copy title to clipboard</source> + <translation>Kopier titel til udklipsholder</translation> + </message> + <message> + <source>&URL</source> + <translation>&URL</translation> + </message> + <message> + <source>Copy URL to clipboard</source> + <translation>&Kopier URL til udklipsholder</translation> + </message> + <message> + <source>&Notes</source> + <translation>&Noter</translation> + </message> + <message> + <source>Copy notes to clipboard</source> + <translation>Kopier noter til udklipsholder</translation> + </message> + <message> + <source>&Export to CSV file...</source> + <translation>&Eksporter til CSV-fil...</translation> + </message> <message> <source>Import KeePass 1 database...</source> - <translation type="unfinished"/> + <translation>Importér KeePass 1 database...</translation> </message> <message> <source>Import CSV file...</source> - <translation type="unfinished"/> + <translation>Importér CSV-fil...</translation> </message> <message> <source>Re&pair database...</source> <translation type="unfinished"/> </message> + <message> + <source>Show TOTP</source> + <translation>Vis TOTP</translation> + </message> <message> <source>Set up TOTP...</source> <translation type="unfinished"/> </message> + <message> + <source>Copy &TOTP</source> + <translation>Kopiér &TOTP</translation> + </message> + <message> + <source>E&mpty recycle bin</source> + <translation type="unfinished"/> + </message> + <message> + <source>Clear history</source> + <translation>Ryd historik</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation>Adgangsfejl for konfigurationsfil %1</translation> + </message> + <message> + <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> + <translation><p>Det ser ud til at du bruger KeePassHTTP til browser-integration. Denne funktion er forældet og vil blive fjernet i fremtiden.<br>Skift til KeePassXC-Browser i stedet. Besøg vores <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">konverteringsguide</a> for at få hjælp (advarsel %1 af 3). </p></translation> + </message> + <message> + <source>read-only</source> + <translation>skrivebeskyttet</translation> + </message> + <message> + <source>Settings</source> + <translation>Indstillinger</translation> + </message> + <message> + <source>Toggle window</source> + <translation>Skift vindue</translation> + </message> + <message> + <source>Quit KeePassXC</source> + <translation>Luk KeePassXC</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>KeePass 2 Database</translation> + </message> + <message> + <source>All files</source> + <translation>Alle filer</translation> + </message> + <message> + <source>Open database</source> + <translation>Åben database</translation> + </message> + <message> + <source>Save repaired database</source> + <translation>Gem repareret database</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>Skrivning til database fejler.</translation> + </message> + <message> + <source>Please touch the button on your YubiKey!</source> + <translation>Tryk på knappen på din YubiKey!</translation> + </message> + <message> + <source>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</source> + <translation>ADVARSEL: Du bruger en ustabil udgave af KeePassXC! +Der er høj risiko for korruption, sørg for at have en backup af dine databaser. +Denne version er ikke beregnet til at blive brugt i produktion.</translation> + </message> +</context> +<context> + <name>OpenSSHKey</name> + <message> + <source>Invalid key file, expecting an OpenSSH key</source> + <translation>Invalid nøglefil, forventede en OpenSSH nøgle</translation> + </message> + <message> + <source>PEM boundary mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>Base64 decoding failed</source> + <translation>Base64 afkodning fejlede</translation> + </message> + <message> + <source>Key file way too small.</source> + <translation>Nøglefil er alt for lille.</translation> + </message> + <message> + <source>Key file magic header id invalid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Found zero keys</source> + <translation>Fandt ingen nøgler</translation> + </message> + <message> + <source>Failed to read public key.</source> + <translation>Kunne ikke læse offentlig nøgle.</translation> + </message> + <message> + <source>Corrupted key file, reading private key failed</source> + <translation>Korrupt nøglefil, kan ikke læse privat nøgle</translation> + </message> + <message> + <source>No private key payload to decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>Trying to run KDF without cipher</source> + <translation>Prøver at køre KDF uden ciffer</translation> + </message> + <message> + <source>Passphrase is required to decrypt this key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key derivation failed, key file corrupted?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Decryption failed, wrong passphrase?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading public key</source> + <translation>Offentlig nøgle sluttede uventet under læsningen</translation> + </message> + <message> + <source>Unexpected EOF while reading private key</source> + <translation>Privat nøgle sluttede uventet under læsningen</translation> + </message> + <message> + <source>Can't write public key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write private key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported key type: %1</source> + <translation>Ikke-understøttet nøgletype: %1</translation> + </message> + <message> + <source>Unknown cipher: %1</source> + <translation>Ukendt ciffer: %1</translation> + </message> + <message> + <source>Cipher IV is too short for MD5 kdf</source> + <translation>Ciffer IV er for kort til MD5 KDF</translation> + </message> + <message> + <source>Unknown KDF: %1</source> + <translation>Ukendt KDF: %1</translation> + </message> + <message> + <source>Unknown key type: %1</source> + <translation>Ukendt nøgletype: %1</translation> + </message> </context> <context> <name>OptionDialog</name> @@ -1608,22 +2956,63 @@ This is a one-way migration. You won't be able to open the imported databas <source>Dialog</source> <translation type="unfinished"/> </message> + <message> + <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation>Dette er nødvendigt for at tilgå din database med ChromeIPass eller PassIFox</translation> + </message> + <message> + <source>Enable KeePassHTTP server</source> + <translation>Slå KeePassHTP server til</translation> + </message> <message> <source>General</source> <translation>Generelt</translation> </message> <message> <source>Sh&ow a notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> <translation type="unfinished"/> </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>Returner kun det bedste match for en specifik URL i stedet for alle matches for hele domænet.</translation> + </message> + <message> + <source>&Return only best matching entries</source> + <translation>&Returnér kun de bedst matchende poster</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Anmod om at låse databasen op hvis den er låst</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> + <translation>Kun poster med samme skema (http://, https://, ftp://, ...) bliver returneret.</translation> + </message> + <message> + <source>&Match URL schemes</source> + <translation>&Match URL skemaer</translation> + </message> <message> <source>Sort matching entries by &username</source> <translation type="unfinished"/> </message> + <message> + <source>Sort &matching entries by title</source> + <translation type="unfinished"/> + </message> + <message> + <source>R&emove all shared encryption keys from active database</source> + <translation type="unfinished"/> + </message> <message> <source>Re&move all stored permissions from entries in active database</source> <translation type="unfinished"/> </message> + <message> + <source>Password Generator</source> + <translation>Kodeordsgenerator</translation> + </message> <message> <source>Advanced</source> <translation>Avanceret</translation> @@ -1636,10 +3025,22 @@ This is a one-way migration. You won't be able to open the imported databas <source>Always allow &updating entries</source> <translation type="unfinished"/> </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation>Kun den valgte database er nødt til at være forbundet med en klient.</translation> + </message> <message> <source>Searc&h in all opened databases for matching entries</source> <translation type="unfinished"/> </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>At automatisk skabe eller opdatere tekst-felter er ikke understøttet.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation type="unfinished"/> + </message> <message> <source>HTTP Port:</source> <translation type="unfinished"/> @@ -1648,18 +3049,18 @@ This is a one-way migration. You won't be able to open the imported databas <source>Default port: 19455</source> <translation type="unfinished"/> </message> - <message> - <source>Re&quest to unlock the database if it is locked</source> - <translation type="unfinished"/> - </message> - <message> - <source>Sort &matching entries by title</source> - <translation type="unfinished"/> - </message> <message> <source>KeePassXC will listen to this port on 127.0.0.1</source> <translation type="unfinished"/> </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation><b>Advarsel:</b>De følgende instillinger kan være farlige!</translation> + </message> + <message> + <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> + <translation type="unfinished"/> + </message> <message> <source>Cannot bind to privileged ports</source> <translation type="unfinished"/> @@ -1669,62 +3070,30 @@ This is a one-way migration. You won't be able to open the imported databas Using default port 19455.</source> <translation type="unfinished"/> </message> - <message> - <source>R&emove all shared encryption keys from active database</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Return advanced string fields which start with "KPH: "</source> - <translation type="unfinished"/> - </message> - <message> - <source>Automatically creating or updating string fields is not supported.</source> - <translation type="unfinished"/> - </message> - <message> - <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> - <translation type="unfinished"/> - </message> - <message> - <source>Enable KeePassHTTP server</source> - <translation type="unfinished"/> - </message> - <message> - <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Return only best matching entries</source> - <translation type="unfinished"/> - </message> - <message> - <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Match URL schemes</source> - <translation type="unfinished"/> - </message> - <message> - <source>Password Generator</source> - <translation type="unfinished"/> - </message> - <message> - <source>Only the selected database has to be connected with a client.</source> - <translation type="unfinished"/> - </message> - <message> - <source>The following options can be dangerous! -Change them only if you know what you are doing.</source> - <translation type="unfinished"/> - </message> </context> <context> <name>PasswordGeneratorWidget</name> + <message> + <source>%p%</source> + <translation type="unfinished"/> + </message> <message> <source>Password:</source> <translation>Kodeord:</translation> </message> + <message> + <source>strength</source> + <comment>Password strength</comment> + <translation type="unfinished"/> + </message> + <message> + <source>entropy</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password</source> + <translation>Kodeord</translation> + </message> <message> <source>Character Types</source> <translation>Tegntyper</translation> @@ -1745,76 +3114,20 @@ Change them only if you know what you are doing.</source> <source>Special Characters</source> <translation>Specialtegn</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>Udvidet ASCII</translation> + </message> <message> <source>Exclude look-alike characters</source> <translation>Udeluk lool-alike tegn</translation> </message> - <message> - <source>Accept</source> - <translation>Acceptér</translation> - </message> - <message> - <source>%p%</source> - <translation type="unfinished"/> - </message> - <message> - <source>strength</source> - <translation type="unfinished"/> - </message> - <message> - <source>entropy</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Length:</source> - <translation type="unfinished"/> - </message> <message> <source>Pick characters from every group</source> <translation type="unfinished"/> </message> <message> - <source>Generate</source> - <translation type="unfinished"/> - </message> - <message> - <source>Close</source> - <translation type="unfinished"/> - </message> - <message> - <source>Apply</source> - <translation type="unfinished"/> - </message> - <message> - <source>Entropy: %1 bit</source> - <translation type="unfinished"/> - </message> - <message> - <source>Password Quality: %1</source> - <translation type="unfinished"/> - </message> - <message> - <source>Poor</source> - <translation type="unfinished"/> - </message> - <message> - <source>Weak</source> - <translation type="unfinished"/> - </message> - <message> - <source>Good</source> - <translation type="unfinished"/> - </message> - <message> - <source>Excellent</source> - <translation type="unfinished"/> - </message> - <message> - <source>Password</source> - <translation>Kodeord</translation> - </message> - <message> - <source>Extended ASCII</source> + <source>&Length:</source> <translation type="unfinished"/> </message> <message> @@ -1833,13 +3146,300 @@ Change them only if you know what you are doing.</source> <source>Word Separator:</source> <translation type="unfinished"/> </message> + <message> + <source>Generate</source> + <translation type="unfinished"/> + </message> <message> <source>Copy</source> <translation type="unfinished"/> </message> + <message> + <source>Accept</source> + <translation>Acceptér</translation> + </message> + <message> + <source>Close</source> + <translation type="unfinished"/> + </message> + <message> + <source>Apply</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entropy: %1 bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password Quality: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Poor</source> + <comment>Password quality</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Weak</source> + <comment>Password quality</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Good</source> + <comment>Password quality</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Excellent</source> + <comment>Password quality</comment> + <translation type="unfinished"/> + </message> </context> <context> <name>QObject</name> + <message> + <source>Database not opened</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database hash not available</source> + <translation type="unfinished"/> + </message> + <message> + <source>Client public key not received</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot decrypt message</source> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout or cannot connect to KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>Action cancelled or denied</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC association failed, try again</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key change was not successful</source> + <translation type="unfinished"/> + </message> + <message> + <source>Encryption key is not recognized</source> + <translation type="unfinished"/> + </message> + <message> + <source>No saved databases found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect action</source> + <translation type="unfinished"/> + </message> + <message> + <source>Empty message received</source> + <translation type="unfinished"/> + </message> + <message> + <source>No URL provided</source> + <translation type="unfinished"/> + </message> + <message> + <source>No logins found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown error</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add a new entry to a database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file of the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>path</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>username</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Prompt for the entry's password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a password for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length for the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to add.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy an entry's password to the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to clip.</source> + <comment>clip = copy to clipboard</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout in seconds before clearing the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Edit an entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Title for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>title</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to edit.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Estimate the entropy of a password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password for which to estimate the entropy.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Perform advanced analysis on the password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Extract and print the content of a database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database to extract.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Insert password to unlock %1: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to load key file %1 : %2</source> + <translation type="unfinished"/> + </message> + <message> + <source>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source> + +Available commands: +</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the command to execute.</source> + <translation type="unfinished"/> + </message> + <message> + <source>List database entries.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the group to list. Default is /</source> + <translation type="unfinished"/> + </message> + <message> + <source>Find entries quickly.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Search term.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Merge two databases.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database to merge into.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database to merge from.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use the same credentials for both database files.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file of the database to merge from.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show an entry's information.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> + <translation type="unfinished"/> + </message> + <message> + <source>attribute</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the entry to show.</source> + <translation type="unfinished"/> + </message> <message> <source>NULL device</source> <translation type="unfinished"/> @@ -1862,7 +3462,27 @@ Change them only if you know what you are doing.</source> <translation type="unfinished"/> </message> <message> - <source>INTERNAL - unget lower bound exceeded</source> + <source>AES: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Twofish: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>ChaCha20: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Argon2 (KDBX 4 – recommended)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 4)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 3.1)</source> <translation type="unfinished"/> </message> <message> @@ -1881,14 +3501,22 @@ Change them only if you know what you are doing.</source> <source>Password</source> <translation>Kodeord</translation> </message> - <message> - <source>URL</source> - <translation>URL</translation> - </message> <message> <source>Notes</source> <translation>Noter</translation> </message> + <message> + <source>Last Modified</source> + <translation type="unfinished"/> + </message> + <message> + <source>Created</source> + <translation>Oprettet</translation> + </message> + <message> + <source>Legacy Browser Integration</source> + <translation type="unfinished"/> + </message> <message> <source>Browser Integration</source> <translation type="unfinished"/> @@ -1905,6 +3533,55 @@ Change them only if you know what you are doing.</source> <source>Passive</source> <translation type="unfinished"/> </message> + <message> + <source>SSH Agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a new random diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Word count for the diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>count</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wordlist for the diceware generator. +[Default: EFF English]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a new random password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length of the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use lowercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use uppercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use numbers in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use special characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use extended ASCII in the generated password.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>QtIOCompressor</name> @@ -1943,7 +3620,7 @@ Change them only if you know what you are doing.</source> <context> <name>SearchWidget</name> <message> - <source>Case Sensitive</source> + <source>Search...</source> <translation type="unfinished"/> </message> <message> @@ -1955,7 +3632,7 @@ Change them only if you know what you are doing.</source> <translation type="unfinished"/> </message> <message> - <source>Search...</source> + <source>Case Sensitive</source> <translation type="unfinished"/> </message> <message> @@ -1965,28 +3642,63 @@ Change them only if you know what you are doing.</source> </context> <context> <name>Service</name> + <message> + <source>KeePassXC: New key association request</source> + <translation>KeePassXC: Ny nøgleassocieringsanmodelse</translation> + </message> + <message> + <source>You have received an association request for the above key. +If you would like to allow it access to your KeePassXC database +give it a unique name to identify and accept it.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: Overskriv eksisterende nøgle?</translation> + </message> <message> <source>A shared encryption-key with the name "%1" already exists. Do you want to overwrite it?</source> <translation type="unfinished"/> </message> <message> - <source>Do you want to update the information in %1 - %2?</source> + <source>KeePassXC: Update Entry</source> <translation type="unfinished"/> </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Vil du opdatere oplysningerne i %1 - %2?</translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: Database låst!</translation> + </message> <message> <source>The active database is locked! Please unlock the selected database or choose another one which is unlocked.</source> - <translation type="unfinished"/> + <translation>Den aktive database er låst! +Lås den valgte database op eller vælg en anden som er åbnet.</translation> </message> <message> - <source>Successfully removed %1 encryption-%2 from KeePassX/Http Settings.</source> - <translation type="unfinished"/> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: Fjernede nøgler fra database</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: Ingen nøgler fundet</translation> </message> <message> <source>No shared encryption-keys found in KeePassHttp Settings.</source> <translation type="unfinished"/> </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: Indstilling er ikke tilgængelig!</translation> + </message> <message> <source>The active database does not contain an entry of KeePassHttp Settings.</source> <translation type="unfinished"/> @@ -1997,58 +3709,24 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Abort</source> - <translation type="unfinished"/> + <translation>Afbryd</translation> </message> <message> - <source>Successfully removed permissions from %1 %2.</source> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: Fjernede tilladelser</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entries.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> <translation type="unfinished"/> </message> <message> <source>The active database does not contain an entry with permissions.</source> <translation type="unfinished"/> </message> - <message> - <source>KeePassXC: New key association request</source> - <translation type="unfinished"/> - </message> - <message> - <source>You have received an association request for the above key. -If you would like to allow it access to your KeePassXC database -give it a unique name to identify and accept it.</source> - <translation type="unfinished"/> - </message> - <message> - <source>KeePassXC: Overwrite existing key?</source> - <translation type="unfinished"/> - </message> - <message> - <source>KeePassXC: Update Entry</source> - <translation type="unfinished"/> - </message> - <message> - <source>KeePassXC: Database locked!</source> - <translation type="unfinished"/> - </message> - <message> - <source>KeePassXC: Removed keys from database</source> - <translation type="unfinished"/> - </message> - <message> - <source>KeePassXC: No keys found</source> - <translation type="unfinished"/> - </message> - <message> - <source>KeePassXC: Settings not available!</source> - <translation type="unfinished"/> - </message> - <message> - <source>KeePassXC: Removed permissions</source> - <translation type="unfinished"/> - </message> - <message> - <source>KeePassXC: No entry with permissions found!</source> - <translation type="unfinished"/> - </message> </context> <context> <name>SettingsWidget</name> @@ -2066,15 +3744,31 @@ give it a unique name to identify and accept it.</source> </message> <message> <source>Access error for config file %1</source> - <translation type="unfinished"/> + <translation>Adgangsfejl for konfigurationsfil %1</translation> </message> </context> <context> <name>SettingsWidgetGeneral</name> + <message> + <source>Basic Settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Start only a single instance of KeePassXC</source> + <translation type="unfinished"/> + </message> <message> <source>Remember last databases</source> <translation>Husk seneste databaser</translation> </message> + <message> + <source>Remember last key files and security dongles</source> + <translation type="unfinished"/> + </message> + <message> + <source>Load previous databases on startup</source> + <translation type="unfinished"/> + </message> <message> <source>Automatically save on exit</source> <translation>Gem automatisk ved afslutning</translation> @@ -2083,21 +3777,29 @@ give it a unique name to identify and accept it.</source> <source>Automatically save after every change</source> <translation>Gem automatisk ved ændringer</translation> </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation type="unfinished"/> + </message> <message> <source>Minimize when copying to clipboard</source> <translation>Minimér ved kopiering til udklipsholder</translation> </message> + <message> + <source>Minimize window at application startup</source> + <translation type="unfinished"/> + </message> <message> <source>Use group icon on entry creation</source> <translation>Brug gruppeikon ved oprettelse af post</translation> </message> <message> - <source>Global Auto-Type shortcut</source> - <translation>Global Auto-Indsæt genvej</translation> + <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> + <translation type="unfinished"/> </message> <message> - <source>Language</source> - <translation>Sprog</translation> + <source>Hide the Details view</source> + <translation type="unfinished"/> </message> <message> <source>Show a system tray icon</source> @@ -2107,89 +3809,91 @@ give it a unique name to identify and accept it.</source> <source>Hide window to system tray when minimized</source> <translation>Skjul vindue i systembakken når det er minimeret</translation> </message> - <message> - <source>Load previous databases on startup</source> - <translation type="unfinished"/> - </message> - <message> - <source>Automatically reload the database when modified externally</source> - <translation type="unfinished"/> - </message> <message> <source>Hide window to system tray instead of app exit</source> <translation type="unfinished"/> </message> <message> - <source>Minimize window at application startup</source> + <source>Dark system tray icon</source> <translation type="unfinished"/> </message> <message> - <source>Basic Settings</source> - <translation type="unfinished"/> - </message> - <message> - <source>Remember last key files and security dongles</source> - <translation type="unfinished"/> - </message> - <message> - <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> - <translation type="unfinished"/> + <source>Language</source> + <translation>Sprog</translation> </message> <message> <source>Auto-Type</source> <translation>Auto-Indsæt</translation> </message> <message> - <source>Use entry title and URL to match windows for global Auto-Type</source> + <source>Use entry title to match windows for global Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use entry URL to match windows for global Auto-Type</source> <translation type="unfinished"/> </message> <message> <source>Always ask before performing Auto-Type</source> <translation type="unfinished"/> </message> + <message> + <source>Global Auto-Type shortcut</source> + <translation>Global Auto-Indsæt genvej</translation> + </message> <message> <source>Auto-Type delay</source> <translation type="unfinished"/> </message> <message> <source> ms</source> + <comment>Milliseconds</comment> <translation type="unfinished"/> </message> <message> - <source>Start only a single instance of KeePassXC</source> + <source>Startup</source> <translation type="unfinished"/> </message> + <message> + <source>File Management</source> + <translation type="unfinished"/> + </message> + <message> + <source>Safely save database files (may be incompatible with Dropbox, etc)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Backup database file before saving</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry Management</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>Generelt</translation> + </message> </context> <context> <name>SettingsWidgetSecurity</name> + <message> + <source>Timeouts</source> + <translation type="unfinished"/> + </message> <message> <source>Clear clipboard after</source> <translation>Ryd udklipsholder efter</translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation>sek</translation> </message> <message> <source>Lock databases after inactivity of</source> <translation>Lås databaserne efter inaktivitet i</translation> </message> - <message> - <source>Show passwords in cleartext by default</source> - <translation>Vis kodeord i klartekst som standard</translation> - </message> - <message> - <source>Lock databases after minimizing the window</source> - <translation type="unfinished"/> - </message> - <message> - <source>Don't require password repeat when it is visible</source> - <translation type="unfinished"/> - </message> - <message> - <source>Timeouts</source> - <translation type="unfinished"/> - </message> <message> <source>Convenience</source> <translation type="unfinished"/> @@ -2198,6 +3902,26 @@ give it a unique name to identify and accept it.</source> <source>Lock databases when session is locked or lid is closed</source> <translation type="unfinished"/> </message> + <message> + <source>Lock databases after minimizing the window</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't require password repeat when it is visible</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show passwords in cleartext by default</source> + <translation>Vis kodeord i klartekst som standard</translation> + </message> + <message> + <source>Hide passwords in the preview panel</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide entry notes by default</source> + <translation type="unfinished"/> + </message> <message> <source>Privacy</source> <translation type="unfinished"/> @@ -2206,6 +3930,10 @@ give it a unique name to identify and accept it.</source> <source>Use Google as fallback for downloading website icons</source> <translation type="unfinished"/> </message> + <message> + <source>Re-lock previously locked database after performing Auto-Type</source> + <translation type="unfinished"/> + </message> </context> <context> <name>SetupTotpDialog</name> @@ -2217,6 +3945,14 @@ give it a unique name to identify and accept it.</source> <source>Key:</source> <translation type="unfinished"/> </message> + <message> + <source>Default RFC 6238 token settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Steam token settings</source> + <translation type="unfinished"/> + </message> <message> <source>Use custom settings</source> <translation type="unfinished"/> @@ -2243,6 +3979,7 @@ give it a unique name to identify and accept it.</source> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation>sek</translation> </message> </context> @@ -2278,10 +4015,6 @@ give it a unique name to identify and accept it.</source> </context> <context> <name>WelcomeWidget</name> - <message> - <source>Welcome to KeePassXC</source> - <translation type="unfinished"/> - </message> <message> <source>Start storing your passwords securely in a KeePassXC database</source> <translation type="unfinished"/> @@ -2306,9 +4039,33 @@ give it a unique name to identify and accept it.</source> <source>Recent databases</source> <translation>Seneste databaser</translation> </message> + <message> + <source>Welcome to KeePassXC %1</source> + <translation type="unfinished"/> + </message> </context> <context> <name>main</name> + <message> + <source>Remove an entry from the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to remove.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation type="unfinished"/> + </message> + <message> + <source>filenames of the password databases to open (*.kdbx)</source> + <translation type="unfinished"/> + </message> <message> <source>path to a custom config file</source> <translation>sti til brugerdefineret indstillingsfil</translation> @@ -2317,80 +4074,12 @@ give it a unique name to identify and accept it.</source> <source>key file of the database</source> <translation>databasens nøglefil</translation> </message> - <message> - <source>KeePassXC - cross-platform password manager</source> - <translation type="unfinished"/> - </message> <message> <source>read password of the database from stdin</source> <translation type="unfinished"/> </message> <message> - <source>filenames of the password databases to open (*.kdbx)</source> - <translation type="unfinished"/> - </message> - <message> - <source>Copy a password to the clipboard</source> - <translation type="unfinished"/> - </message> - <message> - <source>Path of the database.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Use a GUI prompt unlocking the database.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Name of the entry to clip.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Extract and print the content of a database.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Path of the database to extract.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Name of the command to execute.</source> - <translation type="unfinished"/> - </message> - <message> - <source>List database entries.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Path of the group to list. Default is /</source> - <translation type="unfinished"/> - </message> - <message> - <source>Print the UUIDs of the entries and groups.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Merge two databases.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Path of the database to merge into.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Path of the database to merge from.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Use the same password for both database files.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Show a password.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Name of the entry to show.</source> + <source>Parent window handle</source> <translation type="unfinished"/> </message> </context> diff --git a/share/translations/keepassx_de.ts b/share/translations/keepassx_de.ts index 0351d9e4b..b4f49e6f3 100644 --- a/share/translations/keepassx_de.ts +++ b/share/translations/keepassx_de.ts @@ -17,10 +17,6 @@ <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> <translation>KeePassXC wird unter den Bedingungen der GNU General Public License (GPL) Version 2 oder Version 3 (je nach Ihrer Auswahl) vertrieben.</translation> </message> - <message> - <source>Project Maintainers:</source> - <translation>Projekt-Maintainer:</translation> - </message> <message> <source>Contributors</source> <translation>Mitwirkende</translation> @@ -39,7 +35,7 @@ </message> <message> <source>Copy to clipboard</source> - <translation>In Zwischenablage kopieren</translation> + <translation>In die Zwischenablage kopieren</translation> </message> <message> <source>Version %1 @@ -71,6 +67,20 @@ Kernel: %3 %4</translation> <source>Enabled extensions:</source> <translation>Aktivierte Erweiterungen:</translation> </message> + <message> + <source>Project Maintainers:</source> + <translation>Projekt-Maintainer:</translation> + </message> + <message> + <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> + <translation>Das KeePassXC-Team möchte ganz besonders debfx danken für die Entwicklung des ursprünglichen KeePassX.</translation> + </message> + <message> + <source>Build Type: %1 +</source> + <translation>Build-Typ: %1 +</translation> + </message> </context> <context> <name>AccessControlDialog</name> @@ -150,6 +160,25 @@ Bitte wählen Sie, ob Sie den Zugriff erlauben möchten.</translation> <translation>Standard-Sequenz</translation> </message> </context> +<context> + <name>AutoTypeMatchModel</name> + <message> + <source>Group</source> + <translation>Gruppe</translation> + </message> + <message> + <source>Title</source> + <translation>Titel</translation> + </message> + <message> + <source>Username</source> + <translation>Benutzername</translation> + </message> + <message> + <source>Sequence</source> + <translation>Sequenz</translation> + </message> +</context> <context> <name>AutoTypeSelectDialog</name> <message> @@ -182,7 +211,7 @@ Bitte wählen Sie, ob Sie den Zugriff erlauben möchten.</translation> <message> <source>%1 has requested access to passwords for the following item(s). Please select whether you want to allow access.</source> - <translation>%1 hat Zugriff auf Passwörter für folgende Element(e) angefordert. + <translation>%1 hat Zugriff auf Passwörter für folgende Einträge angefordert. Bitte wählen Sie, ob Sie den Zugriff erlauben möchten.</translation> </message> </context> @@ -257,7 +286,7 @@ Bitte wählen Sie, ob Sie den Zugriff erlauben möchten.</translation> <message> <source>Sort matching credentials by &username</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation>Passende Anmeldedaten nach &Nutzername sortieren</translation> + <translation>Passende Anmeldedaten nach &Benutzernamen sortieren</translation> </message> <message> <source>&Disconnect all browsers</source> @@ -543,7 +572,7 @@ Bitte denken Sie darüber nach, eine neue Schlüsseldatei zu generieren.</transl </message> <message> <source>Replace username and password with references</source> - <translation>Benutzernamen und Passwort mit Referencen ersetzen</translation> + <translation>Benutzernamen und Passwort mit Referenzen ersetzen</translation> </message> <message> <source>Copy history</source> @@ -821,6 +850,16 @@ Wenn Sie diese Anzahl beibehalten, könnte Ihre Datenbank zu einfach zu knacken <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> <translation>Konnte Schlüssel nicht mit den neuen KDF-Parametern transformieren; KDF unverändert.</translation> </message> + <message numerus="yes"> + <source> MiB</source> + <comment>Abbreviation for Mebibytes (KDF settings)</comment> + <translation><numerusform> MiB</numerusform><numerusform> MiB</numerusform></translation> + </message> + <message numerus="yes"> + <source> thread(s)</source> + <comment>Threads for parallel execution (KDF settings)</comment> + <translation><numerusform> Thread</numerusform><numerusform> Threads</numerusform></translation> + </message> </context> <context> <name>DatabaseSettingsWidgetEncryption</name> @@ -852,18 +891,10 @@ Wenn Sie diese Anzahl beibehalten, könnte Ihre Datenbank zu einfach zu knacken <source>Memory Usage:</source> <translation>Speicher-Verbrauch</translation> </message> - <message> - <source> MB</source> - <translation>MB</translation> - </message> <message> <source>Parallelism:</source> <translation>Parallelität:</translation> </message> - <message> - <source> thread</source> - <translation>Thread</translation> - </message> </context> <context> <name>DatabaseSettingsWidgetGeneral</name> @@ -903,6 +934,14 @@ Wenn Sie diese Anzahl beibehalten, könnte Ihre Datenbank zu einfach zu knacken <source>Use recycle bin</source> <translation>Papierkorb verwenden</translation> </message> + <message> + <source>Additional Database Settings</source> + <translation>Erweiterte Datenbankeinstellungen</translation> + </message> + <message> + <source>Enable &compression (recommended)</source> + <translation>&Kompression aktivieren (empfohlen)</translation> + </message> </context> <context> <name>DatabaseTabWidget</name> @@ -1025,6 +1064,16 @@ Otherwise your changes are lost.</source> Soll sie gespeichert werden bevor sie gesperrt wird? Anderenfalls gehen Ihre Änderungen verloren.</translation> </message> + <message> + <source>Disable safe saves?</source> + <translation>Sicheres Speichern deaktivieren?</translation> + </message> + <message> + <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</source> + <translation>KeePassXC konnte die Datenbank nach mehrmaligem Versuch nicht erfolgreich speichern. Dies wird möglicherweise durch Synchronisierungsdienste verursacht, die die Datei geöffnet halten. +Sicheres Speichern deaktivieren und erneut versuchen?</translation> + </message> </context> <context> <name>DatabaseWidget</name> @@ -1138,6 +1187,10 @@ Möchten Sie Ihre Änderungen zusammenführen?</translation> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>Sind Sie sicher, dass Sie den Inhalt des Papierkorbs unwiederbringlich löschen wollen?</translation> </message> + <message> + <source>Entry updated successfully.</source> + <translation>Eintrag erfolgreich aktualisiert.</translation> + </message> </context> <context> <name>DetailsWidget</name> @@ -1324,6 +1377,18 @@ Möchten Sie Ihre Änderungen zusammenführen?</translation> <source>1 year</source> <translation>1 Jahr</translation> </message> + <message> + <source>Apply generated password?</source> + <translation>Erzeugtes Passwort anwenden?</translation> + </message> + <message> + <source>Do you want to apply the generated password to this entry?</source> + <translation>Möchten Sie das das erzeugte Passwort auf den Eintrag anwenden?</translation> + </message> + <message> + <source>Entry updated successfully.</source> + <translation>Eintrag erfolgreich aktualisiert.</translation> + </message> </context> <context> <name>EditEntryWidgetAdvanced</name> @@ -1355,6 +1420,14 @@ Möchten Sie Ihre Änderungen zusammenführen?</translation> <source>Attachments</source> <translation>Anhänge</translation> </message> + <message> + <source>Foreground Color:</source> + <translation>Textfarbe</translation> + </message> + <message> + <source>Background Color:</source> + <translation>Hintergrundfarbe</translation> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -1387,12 +1460,8 @@ Möchten Sie Ihre Änderungen zusammenführen?</translation> <translation>Fenstertitel:</translation> </message> <message> - <source>Use default se&quence</source> - <translation>Standardse&quenz verwenden</translation> - </message> - <message> - <source>Set custo&m sequence:</source> - <translation>B&enutzerdefinierte Sequenz:</translation> + <source>Use a specific sequence for this association:</source> + <translation>Spezielle Auto-Type-Sequenz für dieses Fenster verwenden:</translation> </message> </context> <context> @@ -1672,6 +1741,32 @@ Möchten Sie Ihre Änderungen zusammenführen?</translation> <source>Uuid:</source> <translation>UUID:</translation> </message> + <message> + <source>Plugin Data</source> + <translation>Plugin-Daten</translation> + </message> + <message> + <source>Remove</source> + <translation>Entfernen</translation> + </message> + <message> + <source>Delete plugin data?</source> + <translation>Plugin-Daten löschen?</translation> + </message> + <message> + <source>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</source> + <translation>Möchten Sie die ausgewählten Plugin-Daten wirklich löschen? +Dies kann dazu führen, dass die jeweiligen Plugins nicht mehr richtig funktionieren.</translation> + </message> + <message> + <source>Key</source> + <translation>Schlüssel</translation> + </message> + <message> + <source>Value</source> + <translation>Wert</translation> + </message> </context> <context> <name>Entry</name> @@ -1817,6 +1912,65 @@ Möchten Sie Ihre Änderungen zusammenführen?</translation> <source>URL</source> <translation>URL</translation> </message> + <message> + <source>Never</source> + <translation>Niemals</translation> + </message> + <message> + <source>Password</source> + <translation>Passwort</translation> + </message> + <message> + <source>Notes</source> + <translation>Notizen</translation> + </message> + <message> + <source>Expires</source> + <translation>Verfällt</translation> + </message> + <message> + <source>Created</source> + <translation>Erstellt</translation> + </message> + <message> + <source>Modified</source> + <translation>Geändert</translation> + </message> + <message> + <source>Accessed</source> + <translation>Zuletzt zugegriffen</translation> + </message> + <message> + <source>Attachments</source> + <translation>Anhänge</translation> + </message> +</context> +<context> + <name>EntryView</name> + <message> + <source>Customize View</source> + <translation>Ansicht anpassen</translation> + </message> + <message> + <source>Hide Usernames</source> + <translation>Benutzernamen ausblenden</translation> + </message> + <message> + <source>Hide Passwords</source> + <translation>Passwörter ausblenden</translation> + </message> + <message> + <source>Fit to window</source> + <translation>An Fenster anpassen</translation> + </message> + <message> + <source>Fit to contents</source> + <translation>An Inhalt anpassen</translation> + </message> + <message> + <source>Reset to defaults</source> + <translation>Zurücksetzen</translation> + </message> </context> <context> <name>Group</name> @@ -1886,6 +2040,10 @@ Möchten Sie Ihre Änderungen zusammenführen?</translation> <source>Ensure that the password contains characters from every group</source> <translation>Sicherstellen, dass das Passwort Zeichen aus allen Gruppen enthält.</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>Erweitertes ASCII</translation> + </message> </context> <context> <name>KMessageWidget</name> @@ -2503,7 +2661,7 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann </message> <message> <source>Merge from KeePassX database</source> - <translation>Aus KeePassXC-Datenbank zusammenführen</translation> + <translation>Mit KeePassXC-Datenbank zusammenführen</translation> </message> <message> <source>&Add new entry</source> @@ -2559,7 +2717,7 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann </message> <message> <source>Copy username to clipboard</source> - <translation>Benutzername in die Zwischenablage kopieren</translation> + <translation>Benutzernamen in die Zwischenablage kopieren</translation> </message> <message> <source>Cop&y password</source> @@ -2697,6 +2855,14 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann <source>Please touch the button on your YubiKey!</source> <translation>Bitte drücken Sie den Button Ihres YubiKeys</translation> </message> + <message> + <source>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</source> + <translation>WARNUNG: Sie verwenden eine instabile Version von KeePassXC! +Es besteht ein hohes Risiko für Datenkorruption, pflegen Sie ein Backup Ihrer Datenbank. +Diese Version ist nicht für den Produktiveinsatz gedacht.</translation> + </message> </context> <context> <name>OpenSSHKey</name> @@ -2708,10 +2874,6 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann <source>PEM boundary mismatch</source> <translation>Falsche PEM-Boundarys</translation> </message> - <message> - <source>This is not an OpenSSH key, only modern keys are supported</source> - <translation>Dies ist kein OpenSSH-Schlüssel, nur moderne Schlüssel werden unterstützt</translation> - </message> <message> <source>Base64 decoding failed</source> <translation>Base64-Dekodierung fehlgeschlagen</translation> @@ -2740,10 +2902,6 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann <source>No private key payload to decrypt</source> <translation>Keine Privatschlüssel-Nutzdaten zum Entschlüsseln</translation> </message> - <message> - <source>Unknown cipher: </source> - <translation>Unbekannter Verschlüsselungsalgorithmus:</translation> - </message> <message> <source>Trying to run KDF without cipher</source> <translation>Versuche, KDF ohne Verschlüsselungsalgorithmus anzuwenden</translation> @@ -2756,10 +2914,6 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann <source>Key derivation failed, key file corrupted?</source> <translation>Schlüssel-Ableitung fehlgeschlagen, Schlüsseldatei korrupt?</translation> </message> - <message> - <source>Unknown KDF: </source> - <translation>Unbekannte KDF:</translation> - </message> <message> <source>Decryption failed, wrong passphrase?</source> <translation>Entschlüsselung fehlgeschlagen, falsche Passphrase?</translation> @@ -2768,10 +2922,6 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann <source>Unexpected EOF while reading public key</source> <translation>Unerwartetes EOF beim Lesen des öffentlichen Schlüssels</translation> </message> - <message> - <source>Unknown key type: </source> - <translation>Unbekannte Schlüsseltyp:</translation> - </message> <message> <source>Unexpected EOF while reading private key</source> <translation>Unerwartetes EOF beim Lesen des Privatschlüssels</translation> @@ -2792,6 +2942,26 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann <source>Unexpected EOF when writing private key</source> <translation>Unerwartetes EOF beim Schreiben des Privatschlüssels</translation> </message> + <message> + <source>Unsupported key type: %1</source> + <translation>Nicht unterstützter Schlüssel-Typ: %1</translation> + </message> + <message> + <source>Unknown cipher: %1</source> + <translation>Unbekannter Verschlüsselungsalgorithmus: %1</translation> + </message> + <message> + <source>Cipher IV is too short for MD5 kdf</source> + <translation>Verschlüsselungs-IV ist zur kurz für MD5-KDF</translation> + </message> + <message> + <source>Unknown KDF: %1</source> + <translation>Unbekannte Schlüssel-Ableitungs-Funktion: %1</translation> + </message> + <message> + <source>Unknown key type: %1</source> + <translation>Unbekannter Schlüssel-Typ: %1</translation> + </message> </context> <context> <name>OptionDialog</name> @@ -2838,7 +3008,7 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann </message> <message> <source>Sort matching entries by &username</source> - <translation>Sortiere gefundene Einträge nach &Benutzername</translation> + <translation>Sortiere gefundene Einträge nach &Benutzernamen</translation> </message> <message> <source>Sort &matching entries by title</source> @@ -3123,11 +3293,11 @@ Es wird der Standard-Port 19455 verwendet.</translation> </message> <message> <source>Username for the entry.</source> - <translation>Nutzername für den Eintrag</translation> + <translation>Benutzername für den Eintrag</translation> </message> <message> <source>username</source> - <translation>Nutzername</translation> + <translation>Benutzername</translation> </message> <message> <source>URL for the entry.</source> @@ -3386,6 +3556,52 @@ Verfügbare Kommandos: <source>SSH Agent</source> <translation>SSH-Agent</translation> </message> + <message> + <source>Generate a new random diceware passphrase.</source> + <translation>Neue zufällige Diceware-Passphrase erzeugen.</translation> + </message> + <message> + <source>Word count for the diceware passphrase.</source> + <translation>Wort-Anzahl für die Diceware-Passphrase.</translation> + </message> + <message> + <source>count</source> + <translation>Anzahl</translation> + </message> + <message> + <source>Wordlist for the diceware generator. +[Default: EFF English]</source> + <translation>Wortliste für den Diceware-Generator. +[Standard: EFF Englisch]</translation> + </message> + <message> + <source>Generate a new random password.</source> + <translation>Neues zufälliges Passwort erzeugen.</translation> + </message> + <message> + <source>Length of the generated password.</source> + <translation>Länge des erzeugten Passworts.</translation> + </message> + <message> + <source>Use lowercase characters in the generated password.</source> + <translation>Kleinbuchstaben zur Passwort-Erzeugung verwenden.</translation> + </message> + <message> + <source>Use uppercase characters in the generated password.</source> + <translation>Großbuchstaben zur Passwort-Erzeugung verwenden.</translation> + </message> + <message> + <source>Use numbers in the generated password.</source> + <translation>Zahlen zur Passwort-Erzeugung verwenden.</translation> + </message> + <message> + <source>Use special characters in the generated password.</source> + <translation>Sonderzeichen zur Passwort-Erzeugung verwenden.</translation> + </message> + <message> + <source>Use extended ASCII in the generated password.</source> + <translation>Erweiterte ASCII-Zeichen zur Passwort-Erzeugung verwenden.</translation> + </message> </context> <context> <name>QtIOCompressor</name> @@ -3658,6 +3874,30 @@ Bitte entsperren Sie die ausgewählte Datenbank oder wählen Sie eine andere, di <comment>Milliseconds</comment> <translation>ms</translation> </message> + <message> + <source>Startup</source> + <translation>Programmstart</translation> + </message> + <message> + <source>File Management</source> + <translation>Datei-Management</translation> + </message> + <message> + <source>Safely save database files (may be incompatible with Dropbox, etc)</source> + <translation>Datenbankdatei sicher speichern (ggf. inkompatibel mit Dropbox etc.)</translation> + </message> + <message> + <source>Backup database file before saving</source> + <translation>Vor Speichern Backup der Datenbank erstellen</translation> + </message> + <message> + <source>Entry Management</source> + <translation>Eintrags-Management</translation> + </message> + <message> + <source>General</source> + <translation>Allgemein</translation> + </message> </context> <context> <name>SettingsWidgetSecurity</name> @@ -3714,6 +3954,10 @@ Bitte entsperren Sie die ausgewählte Datenbank oder wählen Sie eine andere, di <source>Use Google as fallback for downloading website icons</source> <translation>Verwende Google als Fallback fürs Herunterladen von Website-Icons</translation> </message> + <message> + <source>Re-lock previously locked database after performing Auto-Type</source> + <translation>Datenbank nach Auto-Type automatisch wieder sperren.</translation> + </message> </context> <context> <name>SetupTotpDialog</name> @@ -3795,10 +4039,6 @@ Bitte entsperren Sie die ausgewählte Datenbank oder wählen Sie eine andere, di </context> <context> <name>WelcomeWidget</name> - <message> - <source>Welcome to KeePassXC</source> - <translation>Willkommen bei KeePassXC</translation> - </message> <message> <source>Start storing your passwords securely in a KeePassXC database</source> <translation>Speichern Sie Ihre Passwörter sicher in einer KeePassXC-Datenbank</translation> @@ -3823,6 +4063,10 @@ Bitte entsperren Sie die ausgewählte Datenbank oder wählen Sie eine andere, di <source>Recent databases</source> <translation>Zuletzt verwendete Datenbanken</translation> </message> + <message> + <source>Welcome to KeePassXC %1</source> + <translation>Willkommen in KeePassXC %1</translation> + </message> </context> <context> <name>main</name> diff --git a/share/translations/keepassx_el.ts b/share/translations/keepassx_el.ts index c6a7f9cf9..13bc946ea 100644 --- a/share/translations/keepassx_el.ts +++ b/share/translations/keepassx_el.ts @@ -17,10 +17,6 @@ <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> <translation>Το KeePassXC διανέμεται υπό τους όρους του GNU General Public License (GPL) έκδοση 2 ή (κατά την επιλογή σας) έκδοση 3.</translation> </message> - <message> - <source>Project Maintainers:</source> - <translation type="unfinished"/> - </message> <message> <source>Contributors</source> <translation>Συνεισφέροντες</translation> @@ -53,7 +49,7 @@ </message> <message> <source>Distribution: %1</source> - <translation type="unfinished"/> + <translation>Διανομή: %1</translation> </message> <message> <source>Libraries:</source> @@ -71,6 +67,19 @@ Kernel: %3 %4</source> <source>Enabled extensions:</source> <translation>Ενεργοποιημένες επεκτάσεις:</translation> </message> + <message> + <source>Project Maintainers:</source> + <translation>Υποστήριξη έργου:</translation> + </message> + <message> + <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Build Type: %1 +</source> + <translation type="unfinished"/> + </message> </context> <context> <name>AccessControlDialog</name> @@ -101,7 +110,7 @@ Please select whether you want to allow access.</source> <name>AgentSettingsWidget</name> <message> <source>Enable SSH Agent (requires restart)</source> - <translation type="unfinished"/> + <translation>Ενεργοποίηση πράκτορα SSH (απαιτεί επανεκκίνηση)</translation> </message> </context> <context> @@ -150,6 +159,25 @@ Please select whether you want to allow access.</source> <translation>Προεπιλεγμένη ακολουθία</translation> </message> </context> +<context> + <name>AutoTypeMatchModel</name> + <message> + <source>Group</source> + <translation>Όμαδα</translation> + </message> + <message> + <source>Title</source> + <translation>Τίτλος</translation> + </message> + <message> + <source>Username</source> + <translation>Όνομα χρήστη</translation> + </message> + <message> + <source>Sequence</source> + <translation>Ακολουθία</translation> + </message> +</context> <context> <name>AutoTypeSelectDialog</name> <message> @@ -807,6 +835,16 @@ If you keep this number, your database may be too easy to crack!</source> <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> <translation type="unfinished"/> </message> + <message numerus="yes"> + <source> MiB</source> + <comment>Abbreviation for Mebibytes (KDF settings)</comment> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source> thread(s)</source> + <comment>Threads for parallel execution (KDF settings)</comment> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> </context> <context> <name>DatabaseSettingsWidgetEncryption</name> @@ -838,18 +876,10 @@ If you keep this number, your database may be too easy to crack!</source> <source>Memory Usage:</source> <translation type="unfinished"/> </message> - <message> - <source> MB</source> - <translation type="unfinished"/> - </message> <message> <source>Parallelism:</source> <translation type="unfinished"/> </message> - <message> - <source> thread</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DatabaseSettingsWidgetGeneral</name> @@ -889,6 +919,14 @@ If you keep this number, your database may be too easy to crack!</source> <source>Use recycle bin</source> <translation>Χρήση κάδου ανακύκλωσης</translation> </message> + <message> + <source>Additional Database Settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable &compression (recommended)</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DatabaseTabWidget</name> @@ -1011,6 +1049,15 @@ Otherwise your changes are lost.</source> Θέλετε να αποθηκεύσετε τις αλλαγές σας πρίν την κλειδώσετε: Αλλιώς οι αλλαγές σας θα χαθούν.</translation> </message> + <message> + <source>Disable safe saves?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DatabaseWidget</name> @@ -1123,6 +1170,10 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>Είστε σίγουροι ότι θέλετε να διαγράψετε μόνιμα τα πάντα από το κάδο ανακύκλωσής σας;</translation> </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DetailsWidget</name> @@ -1235,7 +1286,7 @@ Do you want to merge your changes?</source> </message> <message> <source>SSH Agent</source> - <translation type="unfinished"/> + <translation>πράκτορας SSH</translation> </message> <message> <source>n/a</source> @@ -1309,6 +1360,18 @@ Do you want to merge your changes?</source> <source>1 year</source> <translation>1 χρόνο</translation> </message> + <message> + <source>Apply generated password?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to apply the generated password to this entry?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAdvanced</name> @@ -1340,6 +1403,14 @@ Do you want to merge your changes?</source> <source>Attachments</source> <translation>Συνημμένα</translation> </message> + <message> + <source>Foreground Color:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Background Color:</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -1372,13 +1443,9 @@ Do you want to merge your changes?</source> <translation>Τίτλος Παραθύρου:</translation> </message> <message> - <source>Use default se&quence</source> + <source>Use a specific sequence for this association:</source> <translation type="unfinished"/> </message> - <message> - <source>Set custo&m sequence:</source> - <translation>Χρήση προεπιλε&γμένης ακολουθίας:</translation> - </message> </context> <context> <name>EditEntryWidgetHistory</name> @@ -1657,6 +1724,31 @@ Do you want to merge your changes?</source> <source>Uuid:</source> <translation>UUID:</translation> </message> + <message> + <source>Plugin Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove</source> + <translation>Αφαίρεση</translation> + </message> + <message> + <source>Delete plugin data?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Value</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Entry</name> @@ -1798,6 +1890,65 @@ Do you want to merge your changes?</source> <source>URL</source> <translation>URL</translation> </message> + <message> + <source>Never</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password</source> + <translation>Κωδικός</translation> + </message> + <message> + <source>Notes</source> + <translation>Σημειώσεις</translation> + </message> + <message> + <source>Expires</source> + <translation>Λήγει</translation> + </message> + <message> + <source>Created</source> + <translation type="unfinished"/> + </message> + <message> + <source>Modified</source> + <translation type="unfinished"/> + </message> + <message> + <source>Accessed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation>Συνημμένα</translation> + </message> +</context> +<context> + <name>EntryView</name> + <message> + <source>Customize View</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide Usernames</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide Passwords</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fit to window</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fit to contents</source> + <translation type="unfinished"/> + </message> + <message> + <source>Reset to defaults</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Group</name> @@ -1867,6 +2018,10 @@ Do you want to merge your changes?</source> <source>Ensure that the password contains characters from every group</source> <translation>Βεβαιωθείται οτι ο κωδικός περιέχει χαρακτήρες απο κάθε ομάδα</translation> </message> + <message> + <source>Extended ASCII</source> + <translation type="unfinished"/> + </message> </context> <context> <name>KMessageWidget</name> @@ -2675,6 +2830,12 @@ This is a one-way migration. You won't be able to open the imported databas <source>Please touch the button on your YubiKey!</source> <translation>Παρακαλώ αγγίξτε το κουμπί στο YubiKey σας!</translation> </message> + <message> + <source>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OpenSSHKey</name> @@ -2686,10 +2847,6 @@ This is a one-way migration. You won't be able to open the imported databas <source>PEM boundary mismatch</source> <translation type="unfinished"/> </message> - <message> - <source>This is not an OpenSSH key, only modern keys are supported</source> - <translation type="unfinished"/> - </message> <message> <source>Base64 decoding failed</source> <translation type="unfinished"/> @@ -2718,10 +2875,6 @@ This is a one-way migration. You won't be able to open the imported databas <source>No private key payload to decrypt</source> <translation type="unfinished"/> </message> - <message> - <source>Unknown cipher: </source> - <translation type="unfinished"/> - </message> <message> <source>Trying to run KDF without cipher</source> <translation type="unfinished"/> @@ -2734,10 +2887,6 @@ This is a one-way migration. You won't be able to open the imported databas <source>Key derivation failed, key file corrupted?</source> <translation type="unfinished"/> </message> - <message> - <source>Unknown KDF: </source> - <translation type="unfinished"/> - </message> <message> <source>Decryption failed, wrong passphrase?</source> <translation type="unfinished"/> @@ -2746,10 +2895,6 @@ This is a one-way migration. You won't be able to open the imported databas <source>Unexpected EOF while reading public key</source> <translation type="unfinished"/> </message> - <message> - <source>Unknown key type: </source> - <translation type="unfinished"/> - </message> <message> <source>Unexpected EOF while reading private key</source> <translation type="unfinished"/> @@ -2770,6 +2915,26 @@ This is a one-way migration. You won't be able to open the imported databas <source>Unexpected EOF when writing private key</source> <translation type="unfinished"/> </message> + <message> + <source>Unsupported key type: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cipher IV is too short for MD5 kdf</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: %1</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OptionDialog</name> @@ -3357,6 +3522,51 @@ Available commands: </message> <message> <source>SSH Agent</source> + <translation>πράκτορας SSH</translation> + </message> + <message> + <source>Generate a new random diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Word count for the diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>count</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wordlist for the diceware generator. +[Default: EFF English]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a new random password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length of the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use lowercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use uppercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use numbers in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use special characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use extended ASCII in the generated password.</source> <translation type="unfinished"/> </message> </context> @@ -3626,6 +3836,30 @@ Please unlock the selected database or choose another one which is unlocked.</so <comment>Milliseconds</comment> <translation> ms</translation> </message> + <message> + <source>Startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>File Management</source> + <translation type="unfinished"/> + </message> + <message> + <source>Safely save database files (may be incompatible with Dropbox, etc)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Backup database file before saving</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry Management</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>Γενικά</translation> + </message> </context> <context> <name>SettingsWidgetSecurity</name> @@ -3682,6 +3916,10 @@ Please unlock the selected database or choose another one which is unlocked.</so <source>Use Google as fallback for downloading website icons</source> <translation>Χρήση Google ως εφεδρικό τρόπο κατεβάσματος εικονιδίων ιστοσελίδων</translation> </message> + <message> + <source>Re-lock previously locked database after performing Auto-Type</source> + <translation type="unfinished"/> + </message> </context> <context> <name>SetupTotpDialog</name> @@ -3763,10 +4001,6 @@ Please unlock the selected database or choose another one which is unlocked.</so </context> <context> <name>WelcomeWidget</name> - <message> - <source>Welcome to KeePassXC</source> - <translation>Καλωσορίσατε στο KeePassXC</translation> - </message> <message> <source>Start storing your passwords securely in a KeePassXC database</source> <translation>Ξεκινήστε να αποθηκεύετε τους κωδικούς σας με ασφάλεια σε μία βάση δεδομένων KeePassXC</translation> @@ -3791,6 +4025,10 @@ Please unlock the selected database or choose another one which is unlocked.</so <source>Recent databases</source> <translation>Πρόσφατες βάσεις δεδομένων</translation> </message> + <message> + <source>Welcome to KeePassXC %1</source> + <translation type="unfinished"/> + </message> </context> <context> <name>main</name> diff --git a/share/translations/keepassx_en.ts b/share/translations/keepassx_en.ts index 694c27c9b..df3ca8e6f 100644 --- a/share/translations/keepassx_en.ts +++ b/share/translations/keepassx_en.ts @@ -67,7 +67,15 @@ Kernel: %3 %4</source> <translation type="unfinished"></translation> </message> <message> - <source>Build Type: Snapshot + <source>Project Maintainers:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Build Type: %1 </source> <translation type="unfinished"></translation> </message> @@ -149,6 +157,25 @@ Please select whether you want to allow access.</source> <translation type="unfinished"></translation> </message> </context> +<context> + <name>AutoTypeMatchModel</name> + <message> + <source>Group</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Title</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Username</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Sequence</source> + <translation type="unfinished"></translation> + </message> +</context> <context> <name>AutoTypeSelectDialog</name> <message> @@ -1159,6 +1186,10 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation type="unfinished"></translation> </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>DetailsWidget</name> @@ -1351,6 +1382,18 @@ Do you want to merge your changes?</source> <source>1 year</source> <translation type="unfinished"></translation> </message> + <message> + <source>Apply generated password?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Do you want to apply the generated password to this entry?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>EditEntryWidgetAdvanced</name> @@ -1382,6 +1425,14 @@ Do you want to merge your changes?</source> <source>Attachments</source> <translation type="unfinished"></translation> </message> + <message> + <source>Foreground Color:</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Background Color:</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -1414,11 +1465,7 @@ Do you want to merge your changes?</source> <translation type="unfinished"></translation> </message> <message> - <source>Use default se&quence</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Set custo&m sequence:</source> + <source>Use a specific sequence for this association:</source> <translation type="unfinished"></translation> </message> </context> @@ -1699,6 +1746,31 @@ Do you want to merge your changes?</source> <source>Uuid:</source> <translation type="unfinished"></translation> </message> + <message> + <source>Plugin Data</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Remove</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Delete plugin data?</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Key</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Value</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>Entry</name> @@ -1971,6 +2043,10 @@ Do you want to merge your changes?</source> <source>Ensure that the password contains characters from every group</source> <translation type="unfinished"></translation> </message> + <message> + <source>Extended ASCII</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>KMessageWidget</name> @@ -2796,10 +2872,6 @@ This version is not meant for production use.</source> <source>PEM boundary mismatch</source> <translation type="unfinished"></translation> </message> - <message> - <source>This is not an OpenSSH key, only modern keys are supported</source> - <translation type="unfinished"></translation> - </message> <message> <source>Base64 decoding failed</source> <translation type="unfinished"></translation> @@ -2828,10 +2900,6 @@ This version is not meant for production use.</source> <source>No private key payload to decrypt</source> <translation type="unfinished"></translation> </message> - <message> - <source>Unknown cipher: </source> - <translation type="unfinished"></translation> - </message> <message> <source>Trying to run KDF without cipher</source> <translation type="unfinished"></translation> @@ -2844,10 +2912,6 @@ This version is not meant for production use.</source> <source>Key derivation failed, key file corrupted?</source> <translation type="unfinished"></translation> </message> - <message> - <source>Unknown KDF: </source> - <translation type="unfinished"></translation> - </message> <message> <source>Decryption failed, wrong passphrase?</source> <translation type="unfinished"></translation> @@ -2856,10 +2920,6 @@ This version is not meant for production use.</source> <source>Unexpected EOF while reading public key</source> <translation type="unfinished"></translation> </message> - <message> - <source>Unknown key type: </source> - <translation type="unfinished"></translation> - </message> <message> <source>Unexpected EOF while reading private key</source> <translation type="unfinished"></translation> @@ -2880,6 +2940,26 @@ This version is not meant for production use.</source> <source>Unexpected EOF when writing private key</source> <translation type="unfinished"></translation> </message> + <message> + <source>Unsupported key type: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unknown cipher: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Cipher IV is too short for MD5 kdf</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unknown KDF: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Unknown key type: %1</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>OptionDialog</name> @@ -3468,6 +3548,51 @@ Available commands: <source>SSH Agent</source> <translation type="unfinished"></translation> </message> + <message> + <source>Generate a new random diceware passphrase.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Word count for the diceware passphrase.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>count</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Wordlist for the diceware generator. +[Default: EFF English]</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Generate a new random password.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Length of the generated password.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Use lowercase characters in the generated password.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Use uppercase characters in the generated password.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Use numbers in the generated password.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Use special characters in the generated password.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Use extended ASCII in the generated password.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>QtIOCompressor</name> @@ -3821,6 +3946,10 @@ Please unlock the selected database or choose another one which is unlocked.</so <source>Use Google as fallback for downloading website icons</source> <translation type="unfinished"></translation> </message> + <message> + <source>Re-lock previously locked database after performing Auto-Type</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>SetupTotpDialog</name> diff --git a/share/translations/keepassx_en_US.ts b/share/translations/keepassx_en_US.ts index 518390f5d..739596bee 100644 --- a/share/translations/keepassx_en_US.ts +++ b/share/translations/keepassx_en_US.ts @@ -11,40 +11,36 @@ </message> <message> <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> - <translation>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> + <translation>Báo cáo lỗi tại: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> </message> <message> <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> <translation>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</translation> </message> - <message> - <source>Project Maintainers:</source> - <translation>Project Maintainers:</translation> - </message> <message> <source>Contributors</source> - <translation>Contributors</translation> + <translation>Người đóng góp</translation> </message> <message> <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></translation> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Xem Đóng góp tại GitHub</a></translation> </message> <message> <source>Debug Info</source> - <translation>Debug Info</translation> + <translation>Thông Tin Sửa Lỗi</translation> </message> <message> <source>Include the following information whenever you report a bug:</source> - <translation>Include the following information whenever you report a bug:</translation> + <translation>Bao gồm những thông tin sau khi bạn báo lỗi:</translation> </message> <message> <source>Copy to clipboard</source> - <translation>Copy to clipboard</translation> + <translation>Sao chép vào clipboard</translation> </message> <message> <source>Version %1 </source> - <translation>Version %1 + <translation>Phiên bản %1 </translation> </message> <message> @@ -57,7 +53,7 @@ </message> <message> <source>Libraries:</source> - <translation>Libraries:</translation> + <translation>Thư viện:</translation> </message> <message> <source>Operating system: %1 @@ -69,7 +65,21 @@ Kernel: %3 %4</translation> </message> <message> <source>Enabled extensions:</source> - <translation>Enabled extensions:</translation> + <translation>Phần mở rộng đã bật:</translation> + </message> + <message> + <source>Project Maintainers:</source> + <translation>Project Maintainers:</translation> + </message> + <message> + <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> + <translation>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</translation> + </message> + <message> + <source>Build Type: %1 +</source> + <translation>Build Type: %1 +</translation> </message> </context> <context> @@ -88,7 +98,7 @@ Kernel: %3 %4</translation> </message> <message> <source>Deny</source> - <translation>Deny</translation> + <translation>Từ chối</translation> </message> <message> <source>%1 has requested access to passwords for the following item(s). @@ -150,6 +160,25 @@ Please select whether you want to allow access.</translation> <translation>Default sequence</translation> </message> </context> +<context> + <name>AutoTypeMatchModel</name> + <message> + <source>Group</source> + <translation>Group</translation> + </message> + <message> + <source>Title</source> + <translation>Title</translation> + </message> + <message> + <source>Username</source> + <translation>Username</translation> + </message> + <message> + <source>Sequence</source> + <translation>Sequence</translation> + </message> +</context> <context> <name>AutoTypeSelectDialog</name> <message> @@ -825,6 +854,16 @@ If you keep this number, your database may be too easy to crack!</translation> <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> <translation>Failed to transform key with new KDF parameters; KDF unchanged.</translation> </message> + <message numerus="yes"> + <source> MiB</source> + <comment>Abbreviation for Mebibytes (KDF settings)</comment> + <translation><numerusform> MiB</numerusform><numerusform> MiB</numerusform></translation> + </message> + <message numerus="yes"> + <source> thread(s)</source> + <comment>Threads for parallel execution (KDF settings)</comment> + <translation><numerusform> thread</numerusform><numerusform> threads</numerusform></translation> + </message> </context> <context> <name>DatabaseSettingsWidgetEncryption</name> @@ -856,18 +895,10 @@ If you keep this number, your database may be too easy to crack!</translation> <source>Memory Usage:</source> <translation>Memory Usage:</translation> </message> - <message> - <source> MB</source> - <translation> MB</translation> - </message> <message> <source>Parallelism:</source> <translation>Parallelism:</translation> </message> - <message> - <source> thread</source> - <translation> thread</translation> - </message> </context> <context> <name>DatabaseSettingsWidgetGeneral</name> @@ -907,6 +938,14 @@ If you keep this number, your database may be too easy to crack!</translation> <source>Use recycle bin</source> <translation>Use recycle bin</translation> </message> + <message> + <source>Additional Database Settings</source> + <translation>Additional Database Settings</translation> + </message> + <message> + <source>Enable &compression (recommended)</source> + <translation>Enable &compression (recommended)</translation> + </message> </context> <context> <name>DatabaseTabWidget</name> @@ -1029,6 +1068,16 @@ Otherwise your changes are lost.</source> Do you want to save the database before locking it? Otherwise your changes are lost.</translation> </message> + <message> + <source>Disable safe saves?</source> + <translation>Disable safe saves?</translation> + </message> + <message> + <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</source> + <translation>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</translation> + </message> </context> <context> <name>DatabaseWidget</name> @@ -1142,6 +1191,10 @@ Do you want to merge your changes?</translation> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>Are you sure you want to permanently delete everything from your recycle bin?</translation> </message> + <message> + <source>Entry updated successfully.</source> + <translation>Entry updated successfully.</translation> + </message> </context> <context> <name>DetailsWidget</name> @@ -1328,6 +1381,18 @@ Do you want to merge your changes?</translation> <source>1 year</source> <translation>1 year</translation> </message> + <message> + <source>Apply generated password?</source> + <translation>Apply generated password?</translation> + </message> + <message> + <source>Do you want to apply the generated password to this entry?</source> + <translation>Do you want to apply the generated password to this entry?</translation> + </message> + <message> + <source>Entry updated successfully.</source> + <translation>Entry updated successfully.</translation> + </message> </context> <context> <name>EditEntryWidgetAdvanced</name> @@ -1359,6 +1424,14 @@ Do you want to merge your changes?</translation> <source>Attachments</source> <translation>Attachments</translation> </message> + <message> + <source>Foreground Color:</source> + <translation>Foreground Color:</translation> + </message> + <message> + <source>Background Color:</source> + <translation>Background Color:</translation> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -1391,12 +1464,8 @@ Do you want to merge your changes?</translation> <translation>Window title:</translation> </message> <message> - <source>Use default se&quence</source> - <translation>Use default se&quence</translation> - </message> - <message> - <source>Set custo&m sequence:</source> - <translation>Set custo&m sequence:</translation> + <source>Use a specific sequence for this association:</source> + <translation>Use a specific sequence for this association:</translation> </message> </context> <context> @@ -1676,6 +1745,32 @@ Do you want to merge your changes?</translation> <source>Uuid:</source> <translation>UUID:</translation> </message> + <message> + <source>Plugin Data</source> + <translation>Plugin Data</translation> + </message> + <message> + <source>Remove</source> + <translation>Remove</translation> + </message> + <message> + <source>Delete plugin data?</source> + <translation>Delete plugin data?</translation> + </message> + <message> + <source>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</source> + <translation>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</translation> + </message> + <message> + <source>Key</source> + <translation>Key</translation> + </message> + <message> + <source>Value</source> + <translation>Value</translation> + </message> </context> <context> <name>Entry</name> @@ -1822,6 +1917,65 @@ Do you want to merge your changes?</translation> <source>URL</source> <translation>URL</translation> </message> + <message> + <source>Never</source> + <translation>Never</translation> + </message> + <message> + <source>Password</source> + <translation>Password</translation> + </message> + <message> + <source>Notes</source> + <translation>Notes</translation> + </message> + <message> + <source>Expires</source> + <translation>Expires</translation> + </message> + <message> + <source>Created</source> + <translation>Created</translation> + </message> + <message> + <source>Modified</source> + <translation>Modified</translation> + </message> + <message> + <source>Accessed</source> + <translation>Accessed</translation> + </message> + <message> + <source>Attachments</source> + <translation>Attachments</translation> + </message> +</context> +<context> + <name>EntryView</name> + <message> + <source>Customize View</source> + <translation>Customize View</translation> + </message> + <message> + <source>Hide Usernames</source> + <translation>Hide Usernames</translation> + </message> + <message> + <source>Hide Passwords</source> + <translation>Hide Passwords</translation> + </message> + <message> + <source>Fit to window</source> + <translation>Fit to window</translation> + </message> + <message> + <source>Fit to contents</source> + <translation>Fit to contents</translation> + </message> + <message> + <source>Reset to defaults</source> + <translation>Reset to defaults</translation> + </message> </context> <context> <name>Group</name> @@ -1891,6 +2045,10 @@ Do you want to merge your changes?</translation> <source>Ensure that the password contains characters from every group</source> <translation>Ensure that the password contains characters from every group</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>Extended ASCII</translation> + </message> </context> <context> <name>KMessageWidget</name> @@ -2508,7 +2666,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Merge from KeePassX database</source> - <translation>Merge from KeePassX database</translation> + <translation>Merge from KeePassXC database</translation> </message> <message> <source>&Add new entry</source> @@ -2702,6 +2860,14 @@ This is a one-way migration. You won't be able to open the imported databas <source>Please touch the button on your YubiKey!</source> <translation>Please touch the button on your YubiKey!</translation> </message> + <message> + <source>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</source> + <translation>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</translation> + </message> </context> <context> <name>OpenSSHKey</name> @@ -2713,10 +2879,6 @@ This is a one-way migration. You won't be able to open the imported databas <source>PEM boundary mismatch</source> <translation>PEM boundary mismatch</translation> </message> - <message> - <source>This is not an OpenSSH key, only modern keys are supported</source> - <translation>This is not an OpenSSH key, only modern keys are supported</translation> - </message> <message> <source>Base64 decoding failed</source> <translation>Base64 decoding failed</translation> @@ -2745,10 +2907,6 @@ This is a one-way migration. You won't be able to open the imported databas <source>No private key payload to decrypt</source> <translation>No private key payload to decrypt</translation> </message> - <message> - <source>Unknown cipher: </source> - <translation>Unknown cipher: </translation> - </message> <message> <source>Trying to run KDF without cipher</source> <translation>Trying to run KDF without cipher</translation> @@ -2761,10 +2919,6 @@ This is a one-way migration. You won't be able to open the imported databas <source>Key derivation failed, key file corrupted?</source> <translation>Key derivation failed, key file corrupted?</translation> </message> - <message> - <source>Unknown KDF: </source> - <translation>Unknown KDF: </translation> - </message> <message> <source>Decryption failed, wrong passphrase?</source> <translation>Decryption failed, wrong passphrase?</translation> @@ -2773,10 +2927,6 @@ This is a one-way migration. You won't be able to open the imported databas <source>Unexpected EOF while reading public key</source> <translation>Unexpected EOF while reading public key</translation> </message> - <message> - <source>Unknown key type: </source> - <translation>Unknown key type: </translation> - </message> <message> <source>Unexpected EOF while reading private key</source> <translation>Unexpected EOF while reading private key</translation> @@ -2797,6 +2947,26 @@ This is a one-way migration. You won't be able to open the imported databas <source>Unexpected EOF when writing private key</source> <translation>Unexpected EOF when writing private key</translation> </message> + <message> + <source>Unsupported key type: %1</source> + <translation>Unsupported key type: %1</translation> + </message> + <message> + <source>Unknown cipher: %1</source> + <translation>Unknown cipher: %1</translation> + </message> + <message> + <source>Cipher IV is too short for MD5 kdf</source> + <translation>Cipher IV is too short for MD5 kdf</translation> + </message> + <message> + <source>Unknown KDF: %1</source> + <translation>Unknown KDF: %1</translation> + </message> + <message> + <source>Unknown key type: %1</source> + <translation>Unknown key type: %1</translation> + </message> </context> <context> <name>OptionDialog</name> @@ -3393,6 +3563,52 @@ Available commands: <source>SSH Agent</source> <translation>SSH Agent</translation> </message> + <message> + <source>Generate a new random diceware passphrase.</source> + <translation>Generate a new random diceware passphrase.</translation> + </message> + <message> + <source>Word count for the diceware passphrase.</source> + <translation>Word count for the diceware passphrase.</translation> + </message> + <message> + <source>count</source> + <translation>count</translation> + </message> + <message> + <source>Wordlist for the diceware generator. +[Default: EFF English]</source> + <translation>Wordlist for the diceware generator. +[Default: EFF English]</translation> + </message> + <message> + <source>Generate a new random password.</source> + <translation>Generate a new random password.</translation> + </message> + <message> + <source>Length of the generated password.</source> + <translation>Length of the generated password.</translation> + </message> + <message> + <source>Use lowercase characters in the generated password.</source> + <translation>Use lowercase characters in the generated password.</translation> + </message> + <message> + <source>Use uppercase characters in the generated password.</source> + <translation>Use uppercase characters in the generated password.</translation> + </message> + <message> + <source>Use numbers in the generated password.</source> + <translation>Use numbers in the generated password.</translation> + </message> + <message> + <source>Use special characters in the generated password.</source> + <translation>Use special characters in the generated password.</translation> + </message> + <message> + <source>Use extended ASCII in the generated password.</source> + <translation>Use extended ASCII in the generated password.</translation> + </message> </context> <context> <name>QtIOCompressor</name> @@ -3664,6 +3880,30 @@ Please unlock the selected database or choose another one which is unlocked.</tr <comment>Milliseconds</comment> <translation> ms</translation> </message> + <message> + <source>Startup</source> + <translation>Startup</translation> + </message> + <message> + <source>File Management</source> + <translation>File Management</translation> + </message> + <message> + <source>Safely save database files (may be incompatible with Dropbox, etc)</source> + <translation>Safely save database files (may be incompatible with Dropbox, etc)</translation> + </message> + <message> + <source>Backup database file before saving</source> + <translation>Backup database file before saving</translation> + </message> + <message> + <source>Entry Management</source> + <translation>Entry Management</translation> + </message> + <message> + <source>General</source> + <translation>General</translation> + </message> </context> <context> <name>SettingsWidgetSecurity</name> @@ -3720,6 +3960,10 @@ Please unlock the selected database or choose another one which is unlocked.</tr <source>Use Google as fallback for downloading website icons</source> <translation>Use Google as fallback for downloading website icons</translation> </message> + <message> + <source>Re-lock previously locked database after performing Auto-Type</source> + <translation>Re-lock previously locked database after performing Auto-Type</translation> + </message> </context> <context> <name>SetupTotpDialog</name> @@ -3801,10 +4045,6 @@ Please unlock the selected database or choose another one which is unlocked.</tr </context> <context> <name>WelcomeWidget</name> - <message> - <source>Welcome to KeePassXC</source> - <translation>Welcome to KeePassXC</translation> - </message> <message> <source>Start storing your passwords securely in a KeePassXC database</source> <translation>Start storing your passwords securely in a KeePassXC database</translation> @@ -3829,6 +4069,10 @@ Please unlock the selected database or choose another one which is unlocked.</tr <source>Recent databases</source> <translation>Recent databases</translation> </message> + <message> + <source>Welcome to KeePassXC %1</source> + <translation>Welcome to KeePassXC %1</translation> + </message> </context> <context> <name>main</name> diff --git a/share/translations/keepassx_es.ts b/share/translations/keepassx_es.ts index 1b925e7c0..a94469536 100644 --- a/share/translations/keepassx_es.ts +++ b/share/translations/keepassx_es.ts @@ -17,10 +17,6 @@ <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> <translation>KeePassXC se distribuye bajo la Licencia Pública General de GNU (GPL) versión 2 o versión 3 (si así lo prefiere).</translation> </message> - <message> - <source>Project Maintainers:</source> - <translation>Mantenedores del proyecto:</translation> - </message> <message> <source>Contributors</source> <translation>Contribuidores</translation> @@ -71,6 +67,19 @@ Núcleo: %3 %4</translation> <source>Enabled extensions:</source> <translation>Extensiones habilitadas:</translation> </message> + <message> + <source>Project Maintainers:</source> + <translation>Mantenedores del proyecto:</translation> + </message> + <message> + <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Build Type: %1 +</source> + <translation type="unfinished"/> + </message> </context> <context> <name>AccessControlDialog</name> @@ -150,6 +159,25 @@ Por favor seleccione si desea autorizar su acceso.</translation> <translation>Secuencia por defecto</translation> </message> </context> +<context> + <name>AutoTypeMatchModel</name> + <message> + <source>Group</source> + <translation>Grupo</translation> + </message> + <message> + <source>Title</source> + <translation>Título</translation> + </message> + <message> + <source>Username</source> + <translation>Nombre de usuario:</translation> + </message> + <message> + <source>Sequence</source> + <translation>Secuencia</translation> + </message> +</context> <context> <name>AutoTypeSelectDialog</name> <message> @@ -279,7 +307,7 @@ Por favor seleccione si desea autorizar su acceso.</translation> <message> <source>Never ask before &updating credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>No preguntar y guardar los credenciales</translation> </message> <message> <source>Only the selected database has to be connected with a client.</source> @@ -288,7 +316,7 @@ Por favor seleccione si desea autorizar su acceso.</translation> <message> <source>Searc&h in all opened databases for matching credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Buscar &h en todas las bases de datos abiertas los credenciales correspondientes</translation> </message> <message> <source>Automatically creating or updating string fields is not supported.</source> @@ -300,11 +328,11 @@ Por favor seleccione si desea autorizar su acceso.</translation> </message> <message> <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> - <translation type="unfinished"/> + <translation>Actualizaciones KeePassXC o keepassxc-proxy binario automáticamente para obtener los mensajes nativos en el arranque.</translation> </message> <message> <source>Update &native messaging manifest files at startup</source> - <translation type="unfinished"/> + <translation>Actualizar &native mensajes al inicear</translation> </message> <message> <source>Support a proxy application between KeePassXC and browser extension.</source> @@ -312,11 +340,11 @@ Por favor seleccione si desea autorizar su acceso.</translation> </message> <message> <source>Use a &proxy application between KeePassXC and browser extension</source> - <translation type="unfinished"/> + <translation>Utilizar un &proxy entre KeePassXC y la extensión del navegador</translation> </message> <message> <source>Use a custom proxy location if you installed a proxy manually.</source> - <translation type="unfinished"/> + <translation>Utilizar un proxy instalado manualmente</translation> </message> <message> <source>Use a &custom proxy location</source> @@ -356,7 +384,11 @@ Por favor seleccione si desea autorizar su acceso.</translation> If you would like to allow it access to your KeePassXC database, give it a unique name to identify and accept it.</source> - <translation type="unfinished"/> + <translation>¿Quiere asociar la base de datos al navegador? + +Si quiere autirizar el acceso a la base de datos de KeePassXC +de un nombre único para identificar la autorización +(se guarda como una entrada más)</translation> </message> <message> <source>Save and allow access</source> @@ -369,7 +401,8 @@ give it a unique name to identify and accept it.</source> <message> <source>A shared encryption key with the name "%1" already exists. Do you want to overwrite it?</source> - <translation type="unfinished"/> + <translation>Existe una llave con el nombre "%1". +¿Quiere sobreescribirlo?</translation> </message> <message> <source>KeePassXC: Update Entry</source> @@ -427,7 +460,7 @@ Por favor desbloquee la base de datos seleccionada o elija otra que esté desblo </message> <message numerus="yes"> <source>Successfully removed permissions from %n entry(s).</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Los permisos fueron eliminados exitosamente de %n entradas</numerusform><numerusform>Los permisos fueron eliminados exitosamente de %n entradas</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -512,14 +545,17 @@ Por favor desbloquee la base de datos seleccionada o elija otra que esté desblo </message> <message> <source>Legacy key file format</source> - <translation type="unfinished"/> + <translation>Formato de archivo llave heredado</translation> </message> <message> <source>You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>Está utilizando un formato de archivo llave heredado que puede convertirse + en no soportado en el futuro. + +Considere generar un nuevo archivo llave.</translation> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -585,7 +621,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Number of headers line to discard</source> - <translation>Cantidad de líneas a descartar del encabezado</translation> + <translation>Cantidad de líneas a descartar de la cabecera</translation> </message> <message> <source>Consider '\' an escape character</source> @@ -700,18 +736,21 @@ Please consider generating a new key file.</source> </message> <message> <source>Legacy key file format</source> - <translation type="unfinished"/> + <translation>Formato de archivo llave heredado</translation> </message> <message> <source>You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>Está utilizando un formato de archivo llave heredado que puede convertirse + en no soportado en el futuro. + +Considere generar un nuevo archivo llave.</translation> </message> <message> <source>Don't show this warning again</source> - <translation type="unfinished"/> + <translation>No mostrar nuevamente esta advertencia</translation> </message> <message> <source>All files</source> @@ -776,47 +815,61 @@ Ahora puede guardarla.</translation> <message> <source>Number of rounds too high</source> <comment>Key transformation rounds</comment> - <translation type="unfinished"/> + <translation>Número de rondas demasiado altas</translation> </message> <message> <source>You are using a very high number of key transform rounds with Argon2. If you keep this number, your database may take hours or days (or even longer) to open!</source> - <translation type="unfinished"/> + <translation>Está utilizando una gran cantidad de rondas de transformación de clave con Argon2. + +Si conserva este número, ¡su base de datos puede tardar horas o días (o incluso más) en abrirse!</translation> </message> <message> <source>Understood, keep number</source> - <translation type="unfinished"/> + <translation>Entendido, mantenga el número</translation> </message> <message> <source>Cancel</source> - <translation type="unfinished"/> + <translation>Cancelar</translation> </message> <message> <source>Number of rounds too low</source> <comment>Key transformation rounds</comment> - <translation type="unfinished"/> + <translation>Número de rondas demasiado bajas</translation> </message> <message> <source>You are using a very low number of key transform rounds with AES-KDF. If you keep this number, your database may be too easy to crack!</source> - <translation type="unfinished"/> + <translation>Está utilizando una cantidad muy baja de rondas de transformación de llave con AES-KDF. + +Si conserva este número, ¡su base de datos puede ser muy fácil de descifrar!</translation> </message> <message> <source>KDF unchanged</source> - <translation type="unfinished"/> + <translation>KDF sin cambios</translation> </message> <message> <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> - <translation type="unfinished"/> + <translation>Error al transformar la llave con nuevos parámetros KDF; KDF sin cambios.</translation> + </message> + <message numerus="yes"> + <source> MiB</source> + <comment>Abbreviation for Mebibytes (KDF settings)</comment> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source> thread(s)</source> + <comment>Threads for parallel execution (KDF settings)</comment> + <translation><numerusform>hilo(s)</numerusform><numerusform>hilo(s)</numerusform></translation> </message> </context> <context> <name>DatabaseSettingsWidgetEncryption</name> <message> <source>Encryption Algorithm:</source> - <translation type="unfinished"/> + <translation>Algoritmo de cifrado:</translation> </message> <message> <source>AES: 256 Bit (default)</source> @@ -828,7 +881,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Key Derivation Function:</source> - <translation type="unfinished"/> + <translation>Función de derivación de la llave:</translation> </message> <message> <source>Transform rounds:</source> @@ -840,26 +893,18 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Memory Usage:</source> - <translation type="unfinished"/> - </message> - <message> - <source> MB</source> - <translation type="unfinished"/> + <translation>Memoria utilizada:</translation> </message> <message> <source>Parallelism:</source> - <translation type="unfinished"/> - </message> - <message> - <source> thread</source> - <translation type="unfinished"/> + <translation>Paralelismo:</translation> </message> </context> <context> <name>DatabaseSettingsWidgetGeneral</name> <message> <source>Database Meta Data</source> - <translation type="unfinished"/> + <translation>Metadatos de la Base de Datos</translation> </message> <message> <source>Database name:</source> @@ -875,7 +920,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>History Settings</source> - <translation type="unfinished"/> + <translation>Configuración del Historial</translation> </message> <message> <source>Max. history items:</source> @@ -893,6 +938,14 @@ If you keep this number, your database may be too easy to crack!</source> <source>Use recycle bin</source> <translation>Usar papelera de reciclaje</translation> </message> + <message> + <source>Additional Database Settings</source> + <translation>Configuraciones Adicionales de la Base de Datos</translation> + </message> + <message> + <source>Enable &compression (recommended)</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DatabaseTabWidget</name> @@ -1015,6 +1068,15 @@ Otherwise your changes are lost.</source> ¿Desea guardar la base de datos antes de bloquearla? De lo contrario se perderán los cambios.</translation> </message> + <message> + <source>Disable safe saves?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DatabaseWidget</name> @@ -1100,7 +1162,7 @@ De lo contrario se perderán los cambios.</translation> </message> <message> <source>File has changed</source> - <translation type="unfinished"/> + <translation>El archivo ha cambiado</translation> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -1113,7 +1175,7 @@ De lo contrario se perderán los cambios.</translation> <message> <source>The database file has changed and you have unsaved changes. Do you want to merge your changes?</source> - <translation type="unfinished"/> + <translation>El archivo de la base de datos ha cambiado y usted tiene modificaciones sin guardar. ¿Desea unir sus modificaciones?</translation> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -1127,12 +1189,16 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>¿Está seguro que quiere eliminar permanentemente todo de su papelera de reciclaje?</translation> </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DetailsWidget</name> <message> <source>Generate TOTP Token</source> - <translation type="unfinished"/> + <translation>Generar Token TOTP</translation> </message> <message> <source>Close</source> @@ -1152,7 +1218,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Expiration</source> - <translation type="unfinished"/> + <translation>Vencimiento</translation> </message> <message> <source>Username</source> @@ -1160,15 +1226,15 @@ Do you want to merge your changes?</source> </message> <message> <source>Autotype</source> - <translation type="unfinished"/> + <translation>Autoescritura</translation> </message> <message> <source>Searching</source> - <translation type="unfinished"/> + <translation>Buscando...</translation> </message> <message> <source>Attributes</source> - <translation type="unfinished"/> + <translation>Atributos</translation> </message> <message> <source>Attachments</source> @@ -1196,19 +1262,19 @@ Do you want to merge your changes?</source> </message> <message> <source>Never</source> - <translation type="unfinished"/> + <translation>Nunca</translation> </message> <message> <source>[PROTECTED]</source> - <translation type="unfinished"/> + <translation>[PROTEGIDO]</translation> </message> <message> <source>Disabled</source> - <translation type="unfinished"/> + <translation>Deshabilitado</translation> </message> <message> <source>Enabled</source> - <translation type="unfinished"/> + <translation>Habilitado</translation> </message> </context> <context> @@ -1239,27 +1305,27 @@ Do you want to merge your changes?</source> </message> <message> <source>SSH Agent</source> - <translation type="unfinished"/> + <translation>Agente de SSH</translation> </message> <message> <source>n/a</source> - <translation type="unfinished"/> + <translation>n/a</translation> </message> <message> <source>(encrypted)</source> - <translation type="unfinished"/> + <translation>(encriptado)</translation> </message> <message> <source>Select private key</source> - <translation type="unfinished"/> + <translation>Seleccione la llave privada</translation> </message> <message> <source>File too large to be a private key</source> - <translation type="unfinished"/> + <translation>Archivo demasiado grande para ser una llave privada</translation> </message> <message> <source>Failed to open private key</source> - <translation type="unfinished"/> + <translation>Error al abrir la llave privada</translation> </message> <message> <source>Entry history</source> @@ -1291,11 +1357,11 @@ Do you want to merge your changes?</source> </message> <message> <source>[PROTECTED]</source> - <translation type="unfinished"/> + <translation>[PROTEGIDO]</translation> </message> <message> <source>Press reveal to view or edit</source> - <translation type="unfinished"/> + <translation>Presione revelar para ver o editar</translation> </message> <message> <source>Tomorrow</source> @@ -1313,6 +1379,18 @@ Do you want to merge your changes?</source> <source>1 year</source> <translation>1 año</translation> </message> + <message> + <source>Apply generated password?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to apply the generated password to this entry?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAdvanced</name> @@ -1344,6 +1422,14 @@ Do you want to merge your changes?</source> <source>Attachments</source> <translation>Adjuntos</translation> </message> + <message> + <source>Foreground Color:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Background Color:</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -1376,12 +1462,8 @@ Do you want to merge your changes?</source> <translation>Título de la ventana:</translation> </message> <message> - <source>Use default se&quence</source> - <translation>Usar secuencia por &defecto</translation> - </message> - <message> - <source>Set custo&m sequence:</source> - <translation>Definir secuencia personalizada:</translation> + <source>Use a specific sequence for this association:</source> + <translation type="unfinished"/> </message> </context> <context> @@ -1431,7 +1513,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Toggle the checkbox to reveal the notes section.</source> - <translation type="unfinished"/> + <translation>Cambie la casilla de verificación para mostrar la sección de notas.</translation> </message> <message> <source>Username:</source> @@ -1446,7 +1528,7 @@ Do you want to merge your changes?</source> <name>EditEntryWidgetSSHAgent</name> <message> <source>Form</source> - <translation type="unfinished"/> + <translation>Forma</translation> </message> <message> <source>Remove key from agent after</source> @@ -1454,35 +1536,35 @@ Do you want to merge your changes?</source> </message> <message> <source> seconds</source> - <translation type="unfinished"/> + <translation>segundos</translation> </message> <message> <source>Fingerprint</source> - <translation type="unfinished"/> + <translation>Huella dactilar</translation> </message> <message> <source>Remove key from agent when database is closed/locked</source> - <translation type="unfinished"/> + <translation>Eliminar llave del agente cuando la base de datos está cerrada/bloqueada</translation> </message> <message> <source>Public key</source> - <translation type="unfinished"/> + <translation>Llave Pública</translation> </message> <message> <source>Add key to agent when database is opened/unlocked</source> - <translation type="unfinished"/> + <translation>Agregar llave al agente cuando la base de datos se abre/desbloquea</translation> </message> <message> <source>Comment</source> - <translation type="unfinished"/> + <translation>Comentario</translation> </message> <message> <source>Decrypt</source> - <translation type="unfinished"/> + <translation>Descifrar</translation> </message> <message> <source>n/a</source> - <translation type="unfinished"/> + <translation>n/a</translation> </message> <message> <source>Copy to clipboard</source> @@ -1490,11 +1572,11 @@ Do you want to merge your changes?</source> </message> <message> <source>Private key</source> - <translation type="unfinished"/> + <translation>Llave Privada</translation> </message> <message> <source>External file</source> - <translation type="unfinished"/> + <translation>Archivo externo</translation> </message> <message> <source>Browse...</source> @@ -1503,19 +1585,19 @@ Do you want to merge your changes?</source> </message> <message> <source>Attachment</source> - <translation type="unfinished"/> + <translation>Adjunto</translation> </message> <message> <source>Add to agent</source> - <translation type="unfinished"/> + <translation>Añadir a agente</translation> </message> <message> <source>Remove from agent</source> - <translation type="unfinished"/> + <translation>Eliminar del agente</translation> </message> <message> <source>Require user confirmation when this key is used</source> - <translation type="unfinished"/> + <translation>Requiere confirmación del usuario cuando se usa esta llave</translation> </message> </context> <context> @@ -1661,6 +1743,31 @@ Do you want to merge your changes?</source> <source>Uuid:</source> <translation>Uuid:</translation> </message> + <message> + <source>Plugin Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove</source> + <translation>Eliminar</translation> + </message> + <message> + <source>Delete plugin data?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Value</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Entry</name> @@ -1678,14 +1785,14 @@ Do you want to merge your changes?</source> </message> <message> <source>Size</source> - <translation type="unfinished"/> + <translation>Tamaño</translation> </message> </context> <context> <name>EntryAttachmentsWidget</name> <message> <source>Form</source> - <translation type="unfinished"/> + <translation>Forma</translation> </message> <message> <source>Add</source> @@ -1705,7 +1812,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Select files</source> - <translation type="unfinished"/> + <translation>Seleccionar archivos</translation> </message> <message numerus="yes"> <source>Are you sure you want to remove %n attachment(s)?</source> @@ -1717,20 +1824,21 @@ Do you want to merge your changes?</source> </message> <message> <source>Save attachments</source> - <translation type="unfinished"/> + <translation>Guardar adjuntos</translation> </message> <message> <source>Unable to create directory: %1</source> - <translation type="unfinished"/> + <translation>No se puede crear directorio: +%1</translation> </message> <message> <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> - <translation type="unfinished"/> + <translation>¿Seguro que quieres sobrescribir el archivo existente "%1" con el archivo adjunto?</translation> </message> <message> <source>Confirm overwrite</source> - <translation type="unfinished"/> + <translation>Confirmar sobreescritura</translation> </message> <message> <source>Unable to save attachments: @@ -1802,6 +1910,65 @@ Do you want to merge your changes?</source> <source>URL</source> <translation>URL</translation> </message> + <message> + <source>Never</source> + <translation>Nunca</translation> + </message> + <message> + <source>Password</source> + <translation>Contraseña</translation> + </message> + <message> + <source>Notes</source> + <translation>Notas</translation> + </message> + <message> + <source>Expires</source> + <translation>Expira</translation> + </message> + <message> + <source>Created</source> + <translation type="unfinished"/> + </message> + <message> + <source>Modified</source> + <translation type="unfinished"/> + </message> + <message> + <source>Accessed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation>Adjuntos</translation> + </message> +</context> +<context> + <name>EntryView</name> + <message> + <source>Customize View</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide Usernames</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide Passwords</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fit to window</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fit to contents</source> + <translation type="unfinished"/> + </message> + <message> + <source>Reset to defaults</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Group</name> @@ -1814,11 +1981,11 @@ Do you want to merge your changes?</source> <name>HostInstaller</name> <message> <source>KeePassXC: Cannot save file!</source> - <translation type="unfinished"/> + <translation>KeePassXC: ¡No se puede guardar el archivo!</translation> </message> <message> <source>Cannot save the native messaging script file.</source> - <translation type="unfinished"/> + <translation>No se puede guardar el archivo de script de mensajería nativo.</translation> </message> </context> <context> @@ -1871,6 +2038,10 @@ Do you want to merge your changes?</source> <source>Ensure that the password contains characters from every group</source> <translation>Asegurar que la contraseña contiene caracteres de todos los grupos</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>ASCII Extendido</translation> + </message> </context> <context> <name>KMessageWidget</name> @@ -1941,55 +2112,55 @@ Do you want to merge your changes?</source> </message> <message> <source>Invalid header field length</source> - <translation>Tamaño del campo en la cabecera inválido</translation> + <translation>Longitud del campo en la cabecera inválido</translation> </message> <message> <source>Invalid header data length</source> - <translation>Tamaño del campo de datos en la cabecera incorrecto</translation> + <translation>Longitud del campo de datos en la cabecera incorrecto</translation> </message> <message> <source>Failed to open buffer for KDF parameters in header</source> - <translation type="unfinished"/> + <translation>Error al abrir el búfer para los parámetros KDF en la cabecera</translation> </message> <message> <source>Unsupported key derivation function (KDF) or invalid parameters</source> - <translation type="unfinished"/> + <translation>Función de derivación de llave no soportada (KDF) o parámetros no válidos</translation> </message> <message> <source>Legacy header fields found in KDBX4 file.</source> - <translation type="unfinished"/> + <translation>Los campos heredados de la cabecera se encuentran en el archivo KDBX4.</translation> </message> <message> <source>Invalid inner header id size</source> - <translation type="unfinished"/> + <translation>Tamaño id de la cabecera interna inválido</translation> </message> <message> <source>Invalid inner header field length</source> - <translation type="unfinished"/> + <translation>Longitud del campo en la cabecera interna inválido</translation> </message> <message> <source>Invalid inner header binary size</source> - <translation type="unfinished"/> + <translation>Tamaño binario de la cabecera interna inválido</translation> </message> <message> <source>Unsupported KeePass variant map version.</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Versión de mapa de variante de KeePass no soportada.</translation> </message> <message> <source>Invalid variant map entry name length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Longitud del nombre de la entrada del mapa de variante inválida</translation> </message> <message> <source>Invalid variant map entry name data</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Datos del nombre de la entrada de mapa de variante inválida</translation> </message> <message> <source>Invalid variant map entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Longitud del valor de la entrada del mapa de variante inválida</translation> </message> <message> <source>Invalid variant map entry value data</source> @@ -2294,7 +2465,7 @@ Esta migración es en único sentido. No podrá abrir la base de datos importada </message> <message> <source>Unable to construct group tree</source> - <translation type="unfinished"/> + <translation>Incapaz de crear un grupo</translation> </message> <message> <source>Root</source> @@ -2310,7 +2481,7 @@ Esta migración es en único sentido. No podrá abrir la base de datos importada </message> <message> <source>Key transformation failed</source> - <translation type="unfinished"/> + <translation>Error en la transformación de la llave</translation> </message> <message> <source>Invalid group field type number</source> @@ -2452,7 +2623,7 @@ Esta migración es en único sentido. No podrá abrir la base de datos importada </message> <message> <source>Time-based one-time password</source> - <translation type="unfinished"/> + <translation>Contraseña temporal de un solo uso</translation> </message> <message> <source>&Groups</source> @@ -2580,7 +2751,7 @@ Esta migración es en único sentido. No podrá abrir la base de datos importada </message> <message> <source>Copy title to clipboard</source> - <translation type="unfinished"/> + <translation>Copiar título al portapapeles</translation> </message> <message> <source>&URL</source> @@ -2588,7 +2759,7 @@ Esta migración es en único sentido. No podrá abrir la base de datos importada </message> <message> <source>Copy URL to clipboard</source> - <translation type="unfinished"/> + <translation>Copiar URL al portapapeles</translation> </message> <message> <source>&Notes</source> @@ -2596,7 +2767,7 @@ Esta migración es en único sentido. No podrá abrir la base de datos importada </message> <message> <source>Copy notes to clipboard</source> - <translation type="unfinished"/> + <translation>Copiar notas al portapapeles</translation> </message> <message> <source>&Export to CSV file...</source> @@ -2628,7 +2799,7 @@ Esta migración es en único sentido. No podrá abrir la base de datos importada </message> <message> <source>E&mpty recycle bin</source> - <translation type="unfinished"/> + <translation>Vaciar papelera de reciclaje</translation> </message> <message> <source>Clear history</source> @@ -2682,6 +2853,12 @@ Esta migración es en único sentido. No podrá abrir la base de datos importada <source>Please touch the button on your YubiKey!</source> <translation>Por favor presione el botón en su YubiKey!</translation> </message> + <message> + <source>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OpenSSHKey</name> @@ -2693,10 +2870,6 @@ Esta migración es en único sentido. No podrá abrir la base de datos importada <source>PEM boundary mismatch</source> <translation type="unfinished"/> </message> - <message> - <source>This is not an OpenSSH key, only modern keys are supported</source> - <translation type="unfinished"/> - </message> <message> <source>Base64 decoding failed</source> <translation type="unfinished"/> @@ -2725,26 +2898,18 @@ Esta migración es en único sentido. No podrá abrir la base de datos importada <source>No private key payload to decrypt</source> <translation type="unfinished"/> </message> - <message> - <source>Unknown cipher: </source> - <translation type="unfinished"/> - </message> <message> <source>Trying to run KDF without cipher</source> <translation type="unfinished"/> </message> <message> <source>Passphrase is required to decrypt this key</source> - <translation type="unfinished"/> + <translation>Frase de contraseña necesaria para descrifrar esta clave</translation> </message> <message> <source>Key derivation failed, key file corrupted?</source> <translation type="unfinished"/> </message> - <message> - <source>Unknown KDF: </source> - <translation type="unfinished"/> - </message> <message> <source>Decryption failed, wrong passphrase?</source> <translation type="unfinished"/> @@ -2753,10 +2918,6 @@ Esta migración es en único sentido. No podrá abrir la base de datos importada <source>Unexpected EOF while reading public key</source> <translation type="unfinished"/> </message> - <message> - <source>Unknown key type: </source> - <translation type="unfinished"/> - </message> <message> <source>Unexpected EOF while reading private key</source> <translation type="unfinished"/> @@ -2777,6 +2938,26 @@ Esta migración es en único sentido. No podrá abrir la base de datos importada <source>Unexpected EOF when writing private key</source> <translation type="unfinished"/> </message> + <message> + <source>Unsupported key type: %1</source> + <translation>Tipo de clave no soportada: %1</translation> + </message> + <message> + <source>Unknown cipher: %1</source> + <translation>Cifrado desconocido: %1</translation> + </message> + <message> + <source>Cipher IV is too short for MD5 kdf</source> + <translation>Cifrado IV demasiado corto para MD5 kdf</translation> + </message> + <message> + <source>Unknown KDF: %1</source> + <translation>KDF desconocido: %1</translation> + </message> + <message> + <source>Unknown key type: %1</source> + <translation>Tipo de clave desconocida: %1</translation> + </message> </context> <context> <name>OptionDialog</name> @@ -3088,7 +3269,7 @@ Usando el puerto por defecto 19455</translation> </message> <message> <source>Unknown error</source> - <translation type="unfinished"/> + <translation>Error desconocido</translation> </message> <message> <source>Add a new entry to a database.</source> @@ -3100,11 +3281,11 @@ Usando el puerto por defecto 19455</translation> </message> <message> <source>Key file of the database.</source> - <translation type="unfinished"/> + <translation>Archivo de llave de la base de datos</translation> </message> <message> <source>path</source> - <translation type="unfinished"/> + <translation>ruta</translation> </message> <message> <source>Username for the entry.</source> @@ -3112,7 +3293,7 @@ Usando el puerto por defecto 19455</translation> </message> <message> <source>username</source> - <translation type="unfinished"/> + <translation>nombre de usuario</translation> </message> <message> <source>URL for the entry.</source> @@ -3132,11 +3313,11 @@ Usando el puerto por defecto 19455</translation> </message> <message> <source>Length for the generated password.</source> - <translation type="unfinished"/> + <translation>Tamaño de la contraseña a generar</translation> </message> <message> <source>length</source> - <translation type="unfinished"/> + <translation>Tamaño</translation> </message> <message> <source>Path of the entry to add.</source> @@ -3157,11 +3338,11 @@ Usando el puerto por defecto 19455</translation> </message> <message> <source>Edit an entry.</source> - <translation type="unfinished"/> + <translation>Editar una entrada</translation> </message> <message> <source>Title for the entry.</source> - <translation type="unfinished"/> + <translation>Título para la entrada</translation> </message> <message> <source>title</source> @@ -3365,6 +3546,51 @@ Available commands: </message> <message> <source>SSH Agent</source> + <translation>Agente de SSH</translation> + </message> + <message> + <source>Generate a new random diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Word count for the diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>count</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wordlist for the diceware generator. +[Default: EFF English]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a new random password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length of the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use lowercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use uppercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use numbers in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use special characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use extended ASCII in the generated password.</source> <translation type="unfinished"/> </message> </context> @@ -3638,6 +3864,30 @@ Por favor desbloquee la base de datos seleccionada o elija otra que esté desblo <comment>Milliseconds</comment> <translation>Micro segundo</translation> </message> + <message> + <source>Startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>File Management</source> + <translation type="unfinished"/> + </message> + <message> + <source>Safely save database files (may be incompatible with Dropbox, etc)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Backup database file before saving</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry Management</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>General</translation> + </message> </context> <context> <name>SettingsWidgetSecurity</name> @@ -3694,6 +3944,10 @@ Por favor desbloquee la base de datos seleccionada o elija otra que esté desblo <source>Use Google as fallback for downloading website icons</source> <translation>Usar Google como una alternativa para descargar iconos de sitios web</translation> </message> + <message> + <source>Re-lock previously locked database after performing Auto-Type</source> + <translation type="unfinished"/> + </message> </context> <context> <name>SetupTotpDialog</name> @@ -3775,10 +4029,6 @@ Por favor desbloquee la base de datos seleccionada o elija otra que esté desblo </context> <context> <name>WelcomeWidget</name> - <message> - <source>Welcome to KeePassXC</source> - <translation>Bienvenido(a) a KeePassXC</translation> - </message> <message> <source>Start storing your passwords securely in a KeePassXC database</source> <translation>Empiece a guardar sus contraseñas con seguridad en una base de datos de KeePassXC</translation> @@ -3803,6 +4053,10 @@ Por favor desbloquee la base de datos seleccionada o elija otra que esté desblo <source>Recent databases</source> <translation>Bases de datos recientes</translation> </message> + <message> + <source>Welcome to KeePassXC %1</source> + <translation type="unfinished"/> + </message> </context> <context> <name>main</name> diff --git a/share/translations/keepassx_eu.ts b/share/translations/keepassx_eu.ts index 7d7dbd32d..eae8b65b0 100644 --- a/share/translations/keepassx_eu.ts +++ b/share/translations/keepassx_eu.ts @@ -17,10 +17,6 @@ <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> <translation type="unfinished"/> </message> - <message> - <source>Project Maintainers:</source> - <translation type="unfinished"/> - </message> <message> <source>Contributors</source> <translation>Lankideak</translation> @@ -71,6 +67,19 @@ Kernel: %3 %4</translation> <source>Enabled extensions:</source> <translation>Gaitutako hedapenak:</translation> </message> + <message> + <source>Project Maintainers:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Build Type: %1 +</source> + <translation type="unfinished"/> + </message> </context> <context> <name>AccessControlDialog</name> @@ -149,6 +158,25 @@ Please select whether you want to allow access.</source> <translation>Lehenetsitako sekuentzia</translation> </message> </context> +<context> + <name>AutoTypeMatchModel</name> + <message> + <source>Group</source> + <translation>Taldea</translation> + </message> + <message> + <source>Title</source> + <translation>Izenburua</translation> + </message> + <message> + <source>Username</source> + <translation>Erabiltzaile-izena</translation> + </message> + <message> + <source>Sequence</source> + <translation>Sekuentzia</translation> + </message> +</context> <context> <name>AutoTypeSelectDialog</name> <message> @@ -806,6 +834,16 @@ If you keep this number, your database may be too easy to crack!</source> <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> <translation type="unfinished"/> </message> + <message numerus="yes"> + <source> MiB</source> + <comment>Abbreviation for Mebibytes (KDF settings)</comment> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source> thread(s)</source> + <comment>Threads for parallel execution (KDF settings)</comment> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> </context> <context> <name>DatabaseSettingsWidgetEncryption</name> @@ -837,18 +875,10 @@ If you keep this number, your database may be too easy to crack!</source> <source>Memory Usage:</source> <translation>Memoria erabilera:</translation> </message> - <message> - <source> MB</source> - <translation> MB</translation> - </message> <message> <source>Parallelism:</source> <translation>Paralelismoa:</translation> </message> - <message> - <source> thread</source> - <translation>haria</translation> - </message> </context> <context> <name>DatabaseSettingsWidgetGeneral</name> @@ -888,6 +918,14 @@ If you keep this number, your database may be too easy to crack!</source> <source>Use recycle bin</source> <translation type="unfinished"/> </message> + <message> + <source>Additional Database Settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable &compression (recommended)</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DatabaseTabWidget</name> @@ -1005,6 +1043,15 @@ Do you want to save the database before locking it? Otherwise your changes are lost.</source> <translation type="unfinished"/> </message> + <message> + <source>Disable safe saves?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DatabaseWidget</name> @@ -1117,6 +1164,10 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation type="unfinished"/> </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DetailsWidget</name> @@ -1303,6 +1354,18 @@ Do you want to merge your changes?</source> <source>1 year</source> <translation>urte 1</translation> </message> + <message> + <source>Apply generated password?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to apply the generated password to this entry?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAdvanced</name> @@ -1334,6 +1397,14 @@ Do you want to merge your changes?</source> <source>Attachments</source> <translation type="unfinished"/> </message> + <message> + <source>Foreground Color:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Background Color:</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -1366,11 +1437,7 @@ Do you want to merge your changes?</source> <translation>Leihoaren izenburua:</translation> </message> <message> - <source>Use default se&quence</source> - <translation type="unfinished"/> - </message> - <message> - <source>Set custo&m sequence:</source> + <source>Use a specific sequence for this association:</source> <translation type="unfinished"/> </message> </context> @@ -1651,6 +1718,31 @@ Do you want to merge your changes?</source> <source>Uuid:</source> <translation>Uuid:</translation> </message> + <message> + <source>Plugin Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove</source> + <translation>Kendu</translation> + </message> + <message> + <source>Delete plugin data?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Value</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Entry</name> @@ -1792,6 +1884,65 @@ Do you want to merge your changes?</source> <source>URL</source> <translation>URL</translation> </message> + <message> + <source>Never</source> + <translation>Inoiz</translation> + </message> + <message> + <source>Password</source> + <translation>Pasahitza</translation> + </message> + <message> + <source>Notes</source> + <translation>Oharrak</translation> + </message> + <message> + <source>Expires</source> + <translation>Iraungitzea</translation> + </message> + <message> + <source>Created</source> + <translation type="unfinished"/> + </message> + <message> + <source>Modified</source> + <translation type="unfinished"/> + </message> + <message> + <source>Accessed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EntryView</name> + <message> + <source>Customize View</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide Usernames</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide Passwords</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fit to window</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fit to contents</source> + <translation type="unfinished"/> + </message> + <message> + <source>Reset to defaults</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Group</name> @@ -1861,6 +2012,10 @@ Do you want to merge your changes?</source> <source>Ensure that the password contains characters from every group</source> <translation type="unfinished"/> </message> + <message> + <source>Extended ASCII</source> + <translation type="unfinished"/> + </message> </context> <context> <name>KMessageWidget</name> @@ -2669,6 +2824,12 @@ This is a one-way migration. You won't be able to open the imported databas <source>Please touch the button on your YubiKey!</source> <translation type="unfinished"/> </message> + <message> + <source>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OpenSSHKey</name> @@ -2680,10 +2841,6 @@ This is a one-way migration. You won't be able to open the imported databas <source>PEM boundary mismatch</source> <translation type="unfinished"/> </message> - <message> - <source>This is not an OpenSSH key, only modern keys are supported</source> - <translation type="unfinished"/> - </message> <message> <source>Base64 decoding failed</source> <translation type="unfinished"/> @@ -2712,10 +2869,6 @@ This is a one-way migration. You won't be able to open the imported databas <source>No private key payload to decrypt</source> <translation type="unfinished"/> </message> - <message> - <source>Unknown cipher: </source> - <translation type="unfinished"/> - </message> <message> <source>Trying to run KDF without cipher</source> <translation type="unfinished"/> @@ -2728,10 +2881,6 @@ This is a one-way migration. You won't be able to open the imported databas <source>Key derivation failed, key file corrupted?</source> <translation type="unfinished"/> </message> - <message> - <source>Unknown KDF: </source> - <translation>KDF ezezaguna:</translation> - </message> <message> <source>Decryption failed, wrong passphrase?</source> <translation type="unfinished"/> @@ -2740,10 +2889,6 @@ This is a one-way migration. You won't be able to open the imported databas <source>Unexpected EOF while reading public key</source> <translation type="unfinished"/> </message> - <message> - <source>Unknown key type: </source> - <translation type="unfinished"/> - </message> <message> <source>Unexpected EOF while reading private key</source> <translation type="unfinished"/> @@ -2764,6 +2909,26 @@ This is a one-way migration. You won't be able to open the imported databas <source>Unexpected EOF when writing private key</source> <translation type="unfinished"/> </message> + <message> + <source>Unsupported key type: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cipher IV is too short for MD5 kdf</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: %1</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OptionDialog</name> @@ -3352,6 +3517,51 @@ Available commands: <source>SSH Agent</source> <translation type="unfinished"/> </message> + <message> + <source>Generate a new random diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Word count for the diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>count</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wordlist for the diceware generator. +[Default: EFF English]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a new random password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length of the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use lowercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use uppercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use numbers in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use special characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use extended ASCII in the generated password.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>QtIOCompressor</name> @@ -3619,6 +3829,30 @@ Please unlock the selected database or choose another one which is unlocked.</so <comment>Milliseconds</comment> <translation> ms</translation> </message> + <message> + <source>Startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>File Management</source> + <translation type="unfinished"/> + </message> + <message> + <source>Safely save database files (may be incompatible with Dropbox, etc)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Backup database file before saving</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry Management</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>Orokorra</translation> + </message> </context> <context> <name>SettingsWidgetSecurity</name> @@ -3675,6 +3909,10 @@ Please unlock the selected database or choose another one which is unlocked.</so <source>Use Google as fallback for downloading website icons</source> <translation type="unfinished"/> </message> + <message> + <source>Re-lock previously locked database after performing Auto-Type</source> + <translation type="unfinished"/> + </message> </context> <context> <name>SetupTotpDialog</name> @@ -3756,10 +3994,6 @@ Please unlock the selected database or choose another one which is unlocked.</so </context> <context> <name>WelcomeWidget</name> - <message> - <source>Welcome to KeePassXC</source> - <translation>Ongi etorri KeePassXC-era</translation> - </message> <message> <source>Start storing your passwords securely in a KeePassXC database</source> <translation type="unfinished"/> @@ -3784,6 +4018,10 @@ Please unlock the selected database or choose another one which is unlocked.</so <source>Recent databases</source> <translation type="unfinished"/> </message> + <message> + <source>Welcome to KeePassXC %1</source> + <translation type="unfinished"/> + </message> </context> <context> <name>main</name> diff --git a/share/translations/keepassx_fi.ts b/share/translations/keepassx_fi.ts index cfff0d35a..5a3a13e93 100644 --- a/share/translations/keepassx_fi.ts +++ b/share/translations/keepassx_fi.ts @@ -17,10 +17,6 @@ <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> <translation>KeePassXC:tä jaellaan GPL-lisenssin (GNU General Public License) version 2 tai (valintasi mukaan) version 3 ehtojen mukaisesti.</translation> </message> - <message> - <source>Project Maintainers:</source> - <translation>Projektin ylläpitäjät:</translation> - </message> <message> <source>Contributors</source> <translation>Osallistujat</translation> @@ -65,12 +61,25 @@ CPU architecture: %2 Kernel: %3 %4</source> <translation>Käyttöjärjestelmä: %1 Suoritinarkkitehtuuri: %2 -Kernel: %3 %4</translation> +Ydin: %3 %4</translation> </message> <message> <source>Enabled extensions:</source> <translation>Käytössä olevat laajennukset:</translation> </message> + <message> + <source>Project Maintainers:</source> + <translation>Projektin ylläpitäjät:</translation> + </message> + <message> + <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> + <translation>KeePassXC-tiimi antaa erityiskiitokset KeePassX-ohjelman alkuperäiselle luojalle debfx:lle</translation> + </message> + <message> + <source>Build Type: %1 +</source> + <translation>Julkaisun tyyppi: %1</translation> + </message> </context> <context> <name>AccessControlDialog</name> @@ -108,31 +117,31 @@ Valitse sallitaanko pääsy.</translation> <name>AutoType</name> <message> <source>Couldn't find an entry that matches the window title:</source> - <translation>Ikkunan nimeä vastaavaa merkintää ei löytynyt:</translation> + <translation>Ikkunan nimeä vastaavaa tietuetta ei löytynyt:</translation> </message> <message> <source>Auto-Type - KeePassXC</source> - <translation>Automaattitäydennys - KeePassXC</translation> + <translation>Automaattisyöttö - KeePassXC</translation> </message> <message> <source>Auto-Type</source> - <translation>Automaattitäydennys</translation> + <translation>Automaattisyöttö</translation> </message> <message> <source>The Syntax of your Auto-Type statement is incorrect!</source> - <translation type="unfinished"/> + <translation>Automaattisyötön syntaksi on virheellinen!</translation> </message> <message> <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>Tämän automaattisyötön komento sisältää pitkän viiveen. Oletko varma, että haluat jatkaa?</translation> </message> <message> <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>Tämän automaattisyötön komento sisältää hitaita näppäinpainalluksia. Oletko varma, että haluat jatkaa?</translation> </message> <message> <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>Tämän automaattisyötön komento sisältää parametreja joita toistetaan usein. Oletko varma, että haluat jatkaa?</translation> </message> </context> <context> @@ -150,15 +159,34 @@ Valitse sallitaanko pääsy.</translation> <translation>Oletussekvenssi</translation> </message> </context> +<context> + <name>AutoTypeMatchModel</name> + <message> + <source>Group</source> + <translation>Ryhmä</translation> + </message> + <message> + <source>Title</source> + <translation>Otsikko</translation> + </message> + <message> + <source>Username</source> + <translation>Käyttäjätunnus</translation> + </message> + <message> + <source>Sequence</source> + <translation>Sekvenssi</translation> + </message> +</context> <context> <name>AutoTypeSelectDialog</name> <message> <source>Auto-Type - KeePassXC</source> - <translation>Automaattitäydennys - KeePassXC</translation> + <translation>Automaattisyöttö - KeePassXC</translation> </message> <message> <source>Select entry to Auto-Type:</source> - <translation>Valitse merkintä automaattitäydennystä varten:</translation> + <translation>Valitse tietue automaattisyöttöä varten:</translation> </message> </context> <context> @@ -182,7 +210,7 @@ Valitse sallitaanko pääsy.</translation> <message> <source>%1 has requested access to passwords for the following item(s). Please select whether you want to allow access.</source> - <translation>%1 pyytää pääsyä seuraavien alkioiden salasanoihin. + <translation>%1 pyytää pääsyä seuraavien kohteiden salasanoihin. Ole hyvä ja valitse sallitaanko pääsy.</translation> </message> </context> @@ -194,7 +222,7 @@ Ole hyvä ja valitse sallitaanko pääsy.</translation> </message> <message> <source>This is required for accessing your databases with KeePassXC-Browser</source> - <translation type="unfinished"/> + <translation>Tämä vaaditaan, jotta tietokantoja voidaan käyttää KeePassXC-Browser -selainlaajennuksella</translation> </message> <message> <source>Enable KeepassXC browser integration</source> @@ -227,27 +255,27 @@ Ole hyvä ja valitse sallitaanko pääsy.</translation> <message> <source>Show a &notification when credentials are requested</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation>Näytä &ilmoitus kun tilitietoja pyydetään</translation> + <translation>Näytä &ilmoitus, kun tilitietoja pyydetään</translation> </message> <message> <source>Re&quest to unlock the database if it is locked</source> - <translation>Pyyd&ä tietokannan lukituksen avaamista jos se on lukittu</translation> + <translation>Pyyd&ä tietokannan lukituksen avaamista, jos se on lukittu</translation> </message> <message> <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> - <translation type="unfinished"/> + <translation>Vain tietueet samalla skeemalla (http://, https://, ...) palautetaan.</translation> </message> <message> <source>&Match URL scheme (e.g., https://...)</source> - <translation type="unfinished"/> + <translation>Sovita verkko-osoitteen kaavaan (esim. https://...)</translation> </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation type="unfinished"/> + <translation>Palauta vain parhaat osumat tietystä osoitteesta verkkotunnuksen kaikkien osumien sijasta</translation> </message> <message> <source>&Return only best-matching credentials</source> - <translation>&Paluta vain parhaiten vastaavat tilitiedot</translation> + <translation>&Palauta vain parhaiten vastaavat tilitiedot</translation> </message> <message> <source>Sort &matching credentials by title</source> @@ -292,36 +320,36 @@ Ole hyvä ja valitse sallitaanko pääsy.</translation> </message> <message> <source>Automatically creating or updating string fields is not supported.</source> - <translation type="unfinished"/> + <translation>Automaattinen lisäjonokenttien luonti tai päivittäminen ei ole tuettu</translation> </message> <message> <source>&Return advanced string fields which start with "KPH: "</source> - <translation type="unfinished"/> + <translation>Palauta lisämerkkijonokentät jotka alkavat "KPH: "</translation> </message> <message> <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> - <translation type="unfinished"/> + <translation>Päivittää KeePassXC:n tai välitysohjelman polun automaattisesti native messaging -rajapinnan skripteihin käynnistyksen yhteydessä</translation> </message> <message> <source>Update &native messaging manifest files at startup</source> - <translation type="unfinished"/> + <translation>Päivitä native messaging -rajapinnan skriptit automaattisesti ohjelman käynnistyessä</translation> </message> <message> <source>Support a proxy application between KeePassXC and browser extension.</source> - <translation type="unfinished"/> + <translation>Käytä välitysohjelmaa KeePassXC:n ja selainlaajennuksen välillä</translation> </message> <message> <source>Use a &proxy application between KeePassXC and browser extension</source> - <translation type="unfinished"/> + <translation>Käytä välitysohjelmaa KeePassXC:n ja selainlaajennuksen välillä</translation> </message> <message> <source>Use a custom proxy location if you installed a proxy manually.</source> - <translation type="unfinished"/> + <translation>Käytä mukautettua välitysohjelmaa mikäli olet asentanut sellaisen manuaalisesti</translation> </message> <message> <source>Use a &custom proxy location</source> <comment>Meant is the proxy for KeePassXC-Browser</comment> - <translation type="unfinished"/> + <translation>Valitse mukautettu välitysohjelma</translation> </message> <message> <source>Browse...</source> @@ -338,25 +366,27 @@ Ole hyvä ja valitse sallitaanko pääsy.</translation> </message> <message> <source>Executable Files (*)</source> - <translation type="unfinished"/> + <translation>Suoritettavat tiedostot (*)</translation> </message> <message> <source>Select custom proxy location</source> - <translation type="unfinished"/> + <translation>Valitse mukautettu välitysohjelma</translation> </message> </context> <context> <name>BrowserService</name> <message> <source>KeePassXC: New key association request</source> - <translation type="unfinished"/> + <translation>KeePassXC: Uusi avaimenliittämispyyntö</translation> </message> <message> <source>You have received an association request for the above key. If you would like to allow it access to your KeePassXC database, give it a unique name to identify and accept it.</source> - <translation type="unfinished"/> + <translation>Olet saanut avainlittämispyynnön yllä olevalle avaimelle +Jos haluat antaa sille pääsyoikeuden KeePassXC-tietokantaasi, +anna tunnisteelle nimi ja hyväksy.</translation> </message> <message> <source>Save and allow access</source> @@ -374,15 +404,15 @@ Haluatko korvata sen?</translation> </message> <message> <source>KeePassXC: Update Entry</source> - <translation>KeePassXC: Päivitä merkintä</translation> + <translation>KeePassXC: Päivitä tietue</translation> </message> <message> <source>Do you want to update the information in %1 - %2?</source> - <translation type="unfinished"/> + <translation>Haluatko päivittää tiedot osoitteesta %1 - %2?</translation> </message> <message> <source>KeePassXC: Database locked!</source> - <translation>KeePassXC: tietokanta lukittu!</translation> + <translation>KeePassXC: Tietokanta lukittu!</translation> </message> <message> <source>The active database is locked! @@ -396,7 +426,7 @@ Avaa valittu tietokanta tai valitse toinen avattu tietokanta.</translation> </message> <message> <source>The active database does not contain a settings entry.</source> - <translation type="unfinished"/> + <translation>Aktiivinen tietokanta ei sisällä asetustietuetta</translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -404,7 +434,7 @@ Avaa valittu tietokanta tai valitse toinen avattu tietokanta.</translation> </message> <message> <source>No shared encryption keys found in KeePassXC Settings.</source> - <translation type="unfinished"/> + <translation>Jaettuja salausavaimia ei löytynyt KeePassXC-asetuksista</translation> </message> <message> <source>KeePassXC: Removed keys from database</source> @@ -412,7 +442,7 @@ Avaa valittu tietokanta tai valitse toinen avattu tietokanta.</translation> </message> <message numerus="yes"> <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Poistettiin %n salausavain(ta) KeePassXC-asetuksista.</numerusform><numerusform>Poistettiin %n salausavain(ta) KeePassXC-asetuksista.</numerusform></translation> </message> <message> <source>Removing stored permissions…</source> @@ -428,15 +458,15 @@ Avaa valittu tietokanta tai valitse toinen avattu tietokanta.</translation> </message> <message numerus="yes"> <source>Successfully removed permissions from %n entry(s).</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Poistettiin käyttöoikeudet %1:n tietueen tiedoista.</numerusform><numerusform>Poistettiin käyttöoikeudet %1:n tietueen tiedoista.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> - <translation type="unfinished"/> + <translation>KeePassXC: Tietuetta käyttöoikeuksilla ei löytynyt!</translation> </message> <message> <source>The active database does not contain an entry with permissions.</source> - <translation type="unfinished"/> + <translation>Aktiivinen tietokanta ei sisällä yhtään tietuetta käyttöoikeuksien kanssa.</translation> </message> </context> <context> @@ -455,7 +485,7 @@ Avaa valittu tietokanta tai valitse toinen avattu tietokanta.</translation> </message> <message> <source>&Key file</source> - <translation>Avaintiedosto</translation> + <translation>&Avaintiedosto</translation> </message> <message> <source>Browse</source> @@ -487,7 +517,7 @@ Avaa valittu tietokanta tai valitse toinen avattu tietokanta.</translation> </message> <message> <source>Unable to create Key File : </source> - <translation>Avaintiedoston luonti ei onnistunut:</translation> + <translation>Avaintiedoston luonti ei onnistunut: </translation> </message> <message> <source>Select a key file</source> @@ -520,7 +550,10 @@ Avaa valittu tietokanta tai valitse toinen avattu tietokanta.</translation> unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>Käytät vanhaa avaintiedostomuotoa joka ei ole +välttämättä tuettu tulevaisuudessa. + +Ole hyvä ja harkitse uuden avaintiedoston luomista.</translation> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -531,7 +564,7 @@ Please consider generating a new key file.</source> <name>CloneDialog</name> <message> <source>Clone Options</source> - <translation>Kopiointiasetukset</translation> + <translation>Kloonausasetukset</translation> </message> <message> <source>Append ' - Clone' to title</source> @@ -539,11 +572,11 @@ Please consider generating a new key file.</source> </message> <message> <source>Replace username and password with references</source> - <translation type="unfinished"/> + <translation>Korvaa käyttäjänimi ja salasana viittauksilla</translation> </message> <message> <source>Copy history</source> - <translation>Kopiointi historia</translation> + <translation>Kopiointihistoria</translation> </message> </context> <context> @@ -566,11 +599,11 @@ Please consider generating a new key file.</source> </message> <message> <source>Codec</source> - <translation type="unfinished"/> + <translation>Koodekki</translation> </message> <message> <source>Text is qualified by</source> - <translation type="unfinished"/> + <translation>Teksti on määritelty merkeillä</translation> </message> <message> <source>Fields are separated by</source> @@ -582,11 +615,11 @@ Please consider generating a new key file.</source> </message> <message> <source>First record has field names</source> - <translation type="unfinished"/> + <translation>Ensimmäinen tietue sisältää kenttien nimet</translation> </message> <message> <source>Number of headers line to discard</source> - <translation type="unfinished"/> + <translation>Hylättävissä olevien otsakerivien lukumäärä</translation> </message> <message> <source>Consider '\' an escape character</source> @@ -606,11 +639,11 @@ Please consider generating a new key file.</source> </message> <message> <source>Empty fieldname </source> - <translation>Tyhjä kenttänimi</translation> + <translation>Tyhjä kenttänimi </translation> </message> <message> <source>column </source> - <translation>sarake</translation> + <translation>sarake </translation> </message> <message> <source>Imported from CSV file</source> @@ -618,7 +651,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Original data: </source> - <translation>Alkuperäiset tiedot:</translation> + <translation>Alkuperäiset tiedot: </translation> </message> <message> <source>Error(s) detected in CSV file !</source> @@ -626,7 +659,7 @@ Please consider generating a new key file.</source> </message> <message> <source> more messages skipped]</source> - <translation type="unfinished"/> + <translation> viestiä lisää ohitettu]</translation> </message> <message> <source>Error</source> @@ -635,7 +668,8 @@ Please consider generating a new key file.</source> <message> <source>CSV import: writer has errors: </source> - <translation type="unfinished"/> + <translation>CSV:n tuonti: kirjoittamisessa tapahtui virhe: +</translation> </message> </context> <context> @@ -653,15 +687,15 @@ Please consider generating a new key file.</source> <name>CsvParserModel</name> <message numerus="yes"> <source>%n byte(s), </source> - <translation><numerusform>%n tavu.</numerusform><numerusform>%n tavua.</numerusform></translation> + <translation><numerusform>%n tavu.</numerusform><numerusform>%n tavua, </numerusform></translation> </message> <message numerus="yes"> <source>%n row(s), </source> - <translation><numerusform>%n rivi.</numerusform><numerusform>%n riviä.</numerusform></translation> + <translation><numerusform>%n rivi.</numerusform><numerusform>%n riviä, </numerusform></translation> </message> <message numerus="yes"> <source>%n column(s)</source> - <translation><numerusform>%n sarake.</numerusform><numerusform>%n saraketta.</numerusform></translation> + <translation><numerusform>%n sarake.</numerusform><numerusform>%n saraketta</numerusform></translation> </message> </context> <context> @@ -707,7 +741,10 @@ Please consider generating a new key file.</source> unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>Käytät vanhaa avaintiedostomuotoa joka ei ole +välttämättä tuettu tulevaisuudessa. + +Ole hyvä ja harkitse uuden avaintiedoston luomista.</translation> </message> <message> <source>Don't show this warning again</source> @@ -750,7 +787,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Success</source> - <translation>Onnistui!</translation> + <translation>Onnistui</translation> </message> <message> <source>The database has been successfully repaired @@ -776,13 +813,15 @@ Voit nyt tallentaa sen.</translation> <message> <source>Number of rounds too high</source> <comment>Key transformation rounds</comment> - <translation type="unfinished"/> + <translation>Iteraatioiden lukumäärä on liian suuri</translation> </message> <message> <source>You are using a very high number of key transform rounds with Argon2. If you keep this number, your database may take hours or days (or even longer) to open!</source> - <translation type="unfinished"/> + <translation>Käytät todella suurta lukua iteraatioiden määränä avaimen muunnoksen yhteydessä Argon2:lla. + +Jos pidät tämän arvon, tietokannan avauksessa voi kestää tunteja tai päiviä (tai jopa pidempään)!</translation> </message> <message> <source>Understood, keep number</source> @@ -790,26 +829,38 @@ If you keep this number, your database may take hours or days (or even longer) t </message> <message> <source>Cancel</source> - <translation>Peru</translation> + <translation>Peruuta</translation> </message> <message> <source>Number of rounds too low</source> <comment>Key transformation rounds</comment> - <translation type="unfinished"/> + <translation>Iteraatioiden lukumäärä on liian pieni</translation> </message> <message> <source>You are using a very low number of key transform rounds with AES-KDF. If you keep this number, your database may be too easy to crack!</source> - <translation type="unfinished"/> + <translation>Käytät todella pientä lukua iteraatioiden määränä avaimen muunnoksessa AES-KDF:llä. + +Jos pidät tämän arvon, tietokanta voi olla liian helppo murtaa!</translation> </message> <message> <source>KDF unchanged</source> - <translation type="unfinished"/> + <translation>Avainmuunnosfunktio ei ole muuttunut</translation> </message> <message> <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> - <translation type="unfinished"/> + <translation>Avaimen muunnos uusia KDF-parametreja käyttäen epäonnistui; KDF:ää ei muutettu.</translation> + </message> + <message numerus="yes"> + <source> MiB</source> + <comment>Abbreviation for Mebibytes (KDF settings)</comment> + <translation><numerusform>MiB</numerusform><numerusform> Mt</numerusform></translation> + </message> + <message numerus="yes"> + <source> thread(s)</source> + <comment>Threads for parallel execution (KDF settings)</comment> + <translation><numerusform>säie</numerusform><numerusform> säie(ttä)</numerusform></translation> </message> </context> <context> @@ -828,38 +879,30 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Key Derivation Function:</source> - <translation type="unfinished"/> + <translation>Avainmuunnosfunktio:</translation> </message> <message> <source>Transform rounds:</source> - <translation>Muunnoskierroksia:</translation> + <translation>Muunnositeraatioita:</translation> </message> <message> <source>Benchmark 1-second delay</source> - <translation type="unfinished"/> + <translation>Laske parametrit 1:n sekunnin viiveelle</translation> </message> <message> <source>Memory Usage:</source> <translation>Muistin käyttö:</translation> </message> - <message> - <source> MB</source> - <translation> Mt</translation> - </message> <message> <source>Parallelism:</source> - <translation type="unfinished"/> - </message> - <message> - <source> thread</source> - <translation type="unfinished"/> + <translation>Rinnakkaisuus:</translation> </message> </context> <context> <name>DatabaseSettingsWidgetGeneral</name> <message> <source>Database Meta Data</source> - <translation type="unfinished"/> + <translation>Tietokannan metatiedot</translation> </message> <message> <source>Database name:</source> @@ -879,7 +922,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Max. history items:</source> - <translation>Maks. historia-alkioiden lukumäärä:</translation> + <translation>Maks. historia-kohteiden lukumäärä:</translation> </message> <message> <source>Max. history size:</source> @@ -887,12 +930,20 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source> MiB</source> - <translation>MiB</translation> + <translation> Mt</translation> </message> <message> <source>Use recycle bin</source> <translation>Käytä roskakoria</translation> </message> + <message> + <source>Additional Database Settings</source> + <translation>Tietokannan lisäasetukset</translation> + </message> + <message> + <source>Enable &compression (recommended)</source> + <translation>Ota käyttöön &pakkaus (suositeltava)</translation> + </message> </context> <context> <name>DatabaseTabWidget</name> @@ -966,7 +1017,7 @@ Hylkää muutokset ja sulje?</translation> <message> <source>"%1" was modified. Save changes?</source> - <translation>Kohdetta "%1" muokattiin. + <translation>Tietuetta "%1" muokattiin. Tallennetaanko muutokset?</translation> </message> <message> @@ -995,7 +1046,7 @@ Tallennetaanko muutokset?</translation> </message> <message> <source>locked</source> - <translation>Lukittu</translation> + <translation>lukittu</translation> </message> <message> <source>Lock database</source> @@ -1015,6 +1066,16 @@ Otherwise your changes are lost.</source> Haluatko tallentaa tietokannan ennen sen lukitsemista? Jos et tallenna, muutokset hylätään.</translation> </message> + <message> + <source>Disable safe saves?</source> + <translation>Ota turvallinen tallennus pois käytöstä?</translation> + </message> + <message> + <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</source> + <translation>KeePassXC on epäonnistunut useaan otteeseen tietokannan tallentamisessa. Tämä johtuu luultavasti tiedostojen synkronoinnista, joka pitää tiedostoa lukittuna. +Ota turvallinen tallennus pois käytöstä ja yritä uudelleen?</translation> + </message> </context> <context> <name>DatabaseWidget</name> @@ -1028,23 +1089,23 @@ Jos et tallenna, muutokset hylätään.</translation> </message> <message> <source>Delete entry?</source> - <translation>Poista merkintä?</translation> + <translation>Poista tietue?</translation> </message> <message> <source>Do you really want to delete the entry "%1" for good?</source> - <translation>Haluatko varmasti poistaa merkinnän "%1", lopullisesti?</translation> + <translation>Haluatko varmasti poistaa tietueen "%1", lopullisesti?</translation> </message> <message> <source>Delete entries?</source> - <translation>Poista alkiot?</translation> + <translation>Poista tietueet?</translation> </message> <message> <source>Do you really want to delete %1 entries for good?</source> - <translation>Haluatko varmasti poistaa alkiot %1, lopullisesti?</translation> + <translation>Haluatko varmasti poistaa %1 tietuetta lopullisesti?</translation> </message> <message> <source>Move entry to recycle bin?</source> - <translation>Siirrä merkintä roskakoriin?</translation> + <translation>Siirrä tietue roskakoriin?</translation> </message> <message> <source>Do you really want to move entry "%1" to the recycle bin?</source> @@ -1052,11 +1113,11 @@ Jos et tallenna, muutokset hylätään.</translation> </message> <message> <source>Move entries to recycle bin?</source> - <translation>Siirrä alkiot roskakoriin?</translation> + <translation>Siirrä tietueet roskakoriin?</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Haluatko varmasti siirtää %n tietueen roskakoriin?</numerusform><numerusform>Haluatko varmasti siirtää %n tietuetta roskakoriin?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1100,7 +1161,7 @@ Jos et tallenna, muutokset hylätään.</translation> </message> <message> <source>File has changed</source> - <translation type="unfinished"/> + <translation>Tiedosto on muuttunut</translation> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -1118,7 +1179,7 @@ Haluatko yhdistää muutoksesi?</translation> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> - <translation type="unfinished"/> + <translation>Uutta tietokantaa ei voitu avata, sillä tätä tietokantaa yritetään uudelleenavata samanaikaisesti.</translation> </message> <message> <source>Empty recycle bin?</source> @@ -1128,12 +1189,16 @@ Haluatko yhdistää muutoksesi?</translation> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>Haluatko varmasti tyhjentää kaiken pysyvästi roskakorista?</translation> </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DetailsWidget</name> <message> <source>Generate TOTP Token</source> - <translation type="unfinished"/> + <translation>Luo ajastetun kertakäyttöisen salasanan (TOTP) tunniste</translation> </message> <message> <source>Close</source> @@ -1153,7 +1218,7 @@ Haluatko yhdistää muutoksesi?</translation> </message> <message> <source>Expiration</source> - <translation type="unfinished"/> + <translation>Vanhentumisaika</translation> </message> <message> <source>Username</source> @@ -1161,15 +1226,15 @@ Haluatko yhdistää muutoksesi?</translation> </message> <message> <source>Autotype</source> - <translation type="unfinished"/> + <translation>Automaattisyöttö</translation> </message> <message> <source>Searching</source> - <translation type="unfinished"/> + <translation>Hakeminen</translation> </message> <message> <source>Attributes</source> - <translation type="unfinished"/> + <translation>Attribuutit</translation> </message> <message> <source>Attachments</source> @@ -1216,7 +1281,7 @@ Haluatko yhdistää muutoksesi?</translation> <name>EditEntryWidget</name> <message> <source>Entry</source> - <translation>Merkintä</translation> + <translation>Tietue</translation> </message> <message> <source>Advanced</source> @@ -1228,7 +1293,7 @@ Haluatko yhdistää muutoksesi?</translation> </message> <message> <source>Auto-Type</source> - <translation>Automaattitäydennys</translation> + <translation>Automaattisyöttö</translation> </message> <message> <source>Properties</source> @@ -1244,7 +1309,7 @@ Haluatko yhdistää muutoksesi?</translation> </message> <message> <source>n/a</source> - <translation type="unfinished"/> + <translation>ei saatavilla</translation> </message> <message> <source>(encrypted)</source> @@ -1264,15 +1329,15 @@ Haluatko yhdistää muutoksesi?</translation> </message> <message> <source>Entry history</source> - <translation>Alkioiden historia</translation> + <translation>Tietueiden historia</translation> </message> <message> <source>Add entry</source> - <translation>Lisää alkio</translation> + <translation>Lisää tietue</translation> </message> <message> <source>Edit entry</source> - <translation>Muokkaa alkiota</translation> + <translation>Muokkaa tietuetta</translation> </message> <message> <source>Different passwords supplied.</source> @@ -1296,7 +1361,7 @@ Haluatko yhdistää muutoksesi?</translation> </message> <message> <source>Press reveal to view or edit</source> - <translation type="unfinished"/> + <translation>Paina Paljasta näyttääksesi tai muokataksesi</translation> </message> <message> <source>Tomorrow</source> @@ -1314,6 +1379,18 @@ Haluatko yhdistää muutoksesi?</translation> <source>1 year</source> <translation>1 vuosi</translation> </message> + <message> + <source>Apply generated password?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to apply the generated password to this entry?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAdvanced</name> @@ -1345,24 +1422,32 @@ Haluatko yhdistää muutoksesi?</translation> <source>Attachments</source> <translation>Liitteet</translation> </message> + <message> + <source>Foreground Color:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Background Color:</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> <message> <source>Enable Auto-Type for this entry</source> - <translation>Salli automaattitäydennys tälle merkinnälle</translation> + <translation>Salli automaattisyöttö tälle tietueelle</translation> </message> <message> <source>Inherit default Auto-Type sequence from the &group</source> - <translation>Peri automaattitäydennyksen oletussekvenssi &ryhmältä</translation> + <translation>Peri automaattisyötön oletussekvenssi &ryhmältä</translation> </message> <message> <source>&Use custom Auto-Type sequence:</source> - <translation type="unfinished"/> + <translation>&Käytä mukautettua automaattisyötön sekvenssiä:</translation> </message> <message> <source>Window Associations</source> - <translation type="unfinished"/> + <translation>Ikkunoiden liitokset</translation> </message> <message> <source>+</source> @@ -1377,12 +1462,8 @@ Haluatko yhdistää muutoksesi?</translation> <translation>Ikkunan otsikko:</translation> </message> <message> - <source>Use default se&quence</source> - <translation>Käytä oletuss&ekvenssiä</translation> - </message> - <message> - <source>Set custo&m sequence:</source> - <translation>Aseta mukautettu se&kvenssi:</translation> + <source>Use a specific sequence for this association:</source> + <translation>Käytä tiettyä sekvenssiä tälle liitokselle:</translation> </message> </context> <context> @@ -1428,11 +1509,11 @@ Haluatko yhdistää muutoksesi?</translation> </message> <message> <source>Presets</source> - <translation>Esiasetus</translation> + <translation>Esiasetukset</translation> </message> <message> <source>Toggle the checkbox to reveal the notes section.</source> - <translation type="unfinished"/> + <translation>Ruksi valintaruutu näyttääksesi muistiinpano-osio.</translation> </message> <message> <source>Username:</source> @@ -1447,15 +1528,15 @@ Haluatko yhdistää muutoksesi?</translation> <name>EditEntryWidgetSSHAgent</name> <message> <source>Form</source> - <translation type="unfinished"/> + <translation>Lomake</translation> </message> <message> <source>Remove key from agent after</source> - <translation>Poista avain agentilta viiveellä</translation> + <translation>Poista avain agentista kun on kulunut</translation> </message> <message> <source> seconds</source> - <translation>s</translation> + <translation> sekuntia</translation> </message> <message> <source>Fingerprint</source> @@ -1463,7 +1544,7 @@ Haluatko yhdistää muutoksesi?</translation> </message> <message> <source>Remove key from agent when database is closed/locked</source> - <translation>Poista avain agentista kun tietokanta on suljettu/lukittu</translation> + <translation>Poista avain agentista kun tietokanta suljetaan/lukitaan</translation> </message> <message> <source>Public key</source> @@ -1471,7 +1552,7 @@ Haluatko yhdistää muutoksesi?</translation> </message> <message> <source>Add key to agent when database is opened/unlocked</source> - <translation>Lisää avain agenttiin kun tietokanta on avattu/lukitus avattu</translation> + <translation>Lisää avain agenttiin kun tietokanta avataan/lukitaan</translation> </message> <message> <source>Comment</source> @@ -1479,11 +1560,11 @@ Haluatko yhdistää muutoksesi?</translation> </message> <message> <source>Decrypt</source> - <translation type="unfinished"/> + <translation>Pura salaus</translation> </message> <message> <source>n/a</source> - <translation type="unfinished"/> + <translation>ei saatavilla</translation> </message> <message> <source>Copy to clipboard</source> @@ -1574,15 +1655,15 @@ Haluatko yhdistää muutoksesi?</translation> </message> <message> <source>Auto-Type</source> - <translation>Automaattitäydennys</translation> + <translation>Automaattisyöttö</translation> </message> <message> <source>&Use default Auto-Type sequence of parent group</source> - <translation type="unfinished"/> + <translation>&Peri automaattisyötön sekvenssi emoryhmältä</translation> </message> <message> <source>Set default Auto-Type se&quence</source> - <translation type="unfinished"/> + <translation>Aseta automaattisyötön &oletussekvenssi</translation> </message> </context> <context> @@ -1662,13 +1743,38 @@ Haluatko yhdistää muutoksesi?</translation> <source>Uuid:</source> <translation>UUID:</translation> </message> + <message> + <source>Plugin Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove</source> + <translation>Poista</translation> + </message> + <message> + <source>Delete plugin data?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Value</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Entry</name> <message> <source> - Clone</source> <comment>Suffix added to cloned entries</comment> - <translation>- Klooni</translation> + <translation> - Klooni</translation> </message> </context> <context> @@ -1686,7 +1792,7 @@ Haluatko yhdistää muutoksesi?</translation> <name>EntryAttachmentsWidget</name> <message> <source>Form</source> - <translation type="unfinished"/> + <translation>Lomake</translation> </message> <message> <source>Add</source> @@ -1710,7 +1816,7 @@ Haluatko yhdistää muutoksesi?</translation> </message> <message numerus="yes"> <source>Are you sure you want to remove %n attachment(s)?</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Haluatko varmasti poistaa &n liitettä?</numerusform><numerusform>Haluatko varmasti poistaa &n liitettä?</numerusform></translation> </message> <message> <source>Confirm Remove</source> @@ -1728,7 +1834,7 @@ Haluatko yhdistää muutoksesi?</translation> </message> <message> <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> - <translation type="unfinished"/> + <translation>Haluatko varmasti korvata tiedoston "%1" tällä liitteellä?</translation> </message> <message> <source>Confirm overwrite</source> @@ -1790,7 +1896,7 @@ Haluatko yhdistää muutoksesi?</translation> <message> <source>Ref: </source> <comment>Reference abbreviation</comment> - <translation type="unfinished"/> + <translation>Viittaus: </translation> </message> <message> <source>Group</source> @@ -1808,6 +1914,65 @@ Haluatko yhdistää muutoksesi?</translation> <source>URL</source> <translation>URL</translation> </message> + <message> + <source>Never</source> + <translation>Ei koskaan</translation> + </message> + <message> + <source>Password</source> + <translation>Salasana</translation> + </message> + <message> + <source>Notes</source> + <translation>Muistiinpanot</translation> + </message> + <message> + <source>Expires</source> + <translation>Erääntyy</translation> + </message> + <message> + <source>Created</source> + <translation>Luotu</translation> + </message> + <message> + <source>Modified</source> + <translation>Muokattu</translation> + </message> + <message> + <source>Accessed</source> + <translation>Käytetty</translation> + </message> + <message> + <source>Attachments</source> + <translation>Liitteet</translation> + </message> +</context> +<context> + <name>EntryView</name> + <message> + <source>Customize View</source> + <translation>Muokkaa näkymää</translation> + </message> + <message> + <source>Hide Usernames</source> + <translation>Piilota käyttäjänimet</translation> + </message> + <message> + <source>Hide Passwords</source> + <translation>Piilota salasanat</translation> + </message> + <message> + <source>Fit to window</source> + <translation>Sovita ikkunaan</translation> + </message> + <message> + <source>Fit to contents</source> + <translation>Sovita sisältöön</translation> + </message> + <message> + <source>Reset to defaults</source> + <translation>Palauta oletusasetukset</translation> + </message> </context> <context> <name>Group</name> @@ -1824,7 +1989,7 @@ Haluatko yhdistää muutoksesi?</translation> </message> <message> <source>Cannot save the native messaging script file.</source> - <translation type="unfinished"/> + <translation>Native messaging -skriptiä ei voitu tallentaa.</translation> </message> </context> <context> @@ -1877,6 +2042,10 @@ Haluatko yhdistää muutoksesi?</translation> <source>Ensure that the password contains characters from every group</source> <translation>Varmista, että salasana sisältää merkkejä jokaisesta ryhmästä</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>Laajennettu ASCII</translation> + </message> </context> <context> <name>KMessageWidget</name> @@ -1919,7 +2088,7 @@ Haluatko yhdistää muutoksesi?</translation> <name>Kdbx4Reader</name> <message> <source>missing database headers</source> - <translation type="unfinished"/> + <translation>tietokannan otsaketiedot puuttuvat</translation> </message> <message> <source>Unable to calculate master key</source> @@ -1927,11 +2096,11 @@ Haluatko yhdistää muutoksesi?</translation> </message> <message> <source>Invalid header checksum size</source> - <translation type="unfinished"/> + <translation>Virheellinen otsaketietojen tarkistussumman koko</translation> </message> <message> <source>Header SHA256 mismatch</source> - <translation type="unfinished"/> + <translation>Yhteensopimaton SHA256-otsaketieto</translation> </message> <message> <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> @@ -1939,115 +2108,115 @@ Haluatko yhdistää muutoksesi?</translation> </message> <message> <source>Unknown cipher</source> - <translation type="unfinished"/> + <translation>Tuntematon salaus</translation> </message> <message> <source>Invalid header id size</source> - <translation type="unfinished"/> + <translation>Virheellinen otsaketietojen id:n koko</translation> </message> <message> <source>Invalid header field length</source> - <translation type="unfinished"/> + <translation>Virhellinen otsaketietojen kentän koko</translation> </message> <message> <source>Invalid header data length</source> - <translation type="unfinished"/> + <translation>Virheellinen otsaketietojen sisällön koko</translation> </message> <message> <source>Failed to open buffer for KDF parameters in header</source> - <translation type="unfinished"/> + <translation>Puskurin avaaminen avaimenluontifunktion parametreja varten tiedoston alkuosassa epäonnistui</translation> </message> <message> <source>Unsupported key derivation function (KDF) or invalid parameters</source> - <translation type="unfinished"/> + <translation>Avainmuunnosfunktio (KDF) ei ole tuettu, tai virheelliset parametrit</translation> </message> <message> <source>Legacy header fields found in KDBX4 file.</source> - <translation type="unfinished"/> + <translation>KDBX4-tiedostosta löytyi vanhentuneita otsaketietoja</translation> </message> <message> <source>Invalid inner header id size</source> - <translation type="unfinished"/> + <translation>Virheellinen sisemmän otsaketiedon tunnisteen koko</translation> </message> <message> <source>Invalid inner header field length</source> - <translation type="unfinished"/> + <translation>Virheellinen sisemmän otsaketiedon kentän pituus</translation> </message> <message> <source>Invalid inner header binary size</source> - <translation type="unfinished"/> + <translation>Virheellinen sisemmän otsaketiedon binäärikoko</translation> </message> <message> <source>Unsupported KeePass variant map version.</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>KeePass -variant-kartan versio ei ole tuettu.</translation> </message> <message> <source>Invalid variant map entry name length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Virheellinen variant-kartan tietuenimen pituus</translation> </message> <message> <source>Invalid variant map entry name data</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Virheellinen variant-kartan tietueen nimen sisältö</translation> </message> <message> <source>Invalid variant map entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Virheellinen variant-kartan tietueen arvon pituus</translation> </message> <message> <source>Invalid variant map entry value data</source> <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Virheellinen variant-kartan tietueen arvon sisältä</translation> </message> <message> <source>Invalid variant map Bool entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Virheellinen variant-kartan Bool-arvon pituus</translation> </message> <message> <source>Invalid variant map Int32 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Virheellinen variant-kartan Int32-arvon pituus</translation> </message> <message> <source>Invalid variant map UInt32 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Virheellinen variant-kartan Uint32-arvon pituus</translation> </message> <message> <source>Invalid variant map Int64 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Virheellinen variant-kartan Int64-arvon pituus</translation> </message> <message> <source>Invalid variant map UInt64 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Virheellinen variant-kartan Uint64-arvon pituus</translation> </message> <message> <source>Invalid variant map entry type</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Virheellinen variant-kartan tietueen tyyppi</translation> </message> <message> <source>Invalid variant map field type size</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Virheellinen variant-kartan kenttätyypin koko</translation> </message> </context> <context> <name>Kdbx4Writer</name> <message> <source>Invalid symmetric cipher algorithm.</source> - <translation type="unfinished"/> + <translation>Virheellinen symmetrinen salausalgoritmi.</translation> </message> <message> <source>Invalid symmetric cipher IV size.</source> <comment>IV = Initialization Vector for symmetric cipher</comment> - <translation type="unfinished"/> + <translation>Virheellinen symmetrisen salauksen alustussektorin (IV) koko.</translation> </message> <message> <source>Unable to calculate master key</source> @@ -2056,22 +2225,22 @@ Haluatko yhdistää muutoksesi?</translation> <message> <source>Failed to serialize KDF parameters variant map</source> <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>KDF-parametrien serialisointi variant-karttaan epäonnistui</translation> </message> </context> <context> <name>KdbxReader</name> <message> <source>Invalid cipher uuid length</source> - <translation type="unfinished"/> + <translation>Virheellinen salauksen uuid:n pituus</translation> </message> <message> <source>Unsupported cipher</source> - <translation type="unfinished"/> + <translation>Salausta ei tueta</translation> </message> <message> <source>Invalid compression flags length</source> - <translation type="unfinished"/> + <translation>Virheellinen pakkauslippujen pituus</translation> </message> <message> <source>Unsupported compression algorithm</source> @@ -2079,27 +2248,27 @@ Haluatko yhdistää muutoksesi?</translation> </message> <message> <source>Invalid master seed size</source> - <translation type="unfinished"/> + <translation>Virheellinen pääavainsiemenen koko</translation> </message> <message> <source>Invalid transform seed size</source> - <translation type="unfinished"/> + <translation>Virheellinen avainmuunnossiemenen koko</translation> </message> <message> <source>Invalid transform rounds size</source> - <translation type="unfinished"/> + <translation>Virheellinen avainmuunnoskertoimen koko</translation> </message> <message> <source>Invalid start bytes size</source> - <translation type="unfinished"/> + <translation>Virheellinen avaustavujen koko</translation> </message> <message> <source>Invalid random stream id size</source> - <translation type="unfinished"/> + <translation>Virheellinen satunnaistietovuon tietueen koko</translation> </message> <message> <source>Invalid inner random stream cipher</source> - <translation type="unfinished"/> + <translation>Virheellinen sisäisen satunnaistietovuon salaus</translation> </message> <message> <source>Not a KeePass database.</source> @@ -2110,7 +2279,10 @@ Haluatko yhdistää muutoksesi?</translation> You can import it by clicking on Database > 'Import KeePass 1 database...'. This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> - <translation type="unfinished"/> + <translation>Valittu tiedosto on vanha KeePass 1 -tietokanta (.kdb). + +Voit tuoda sen Tietokanta-valikosta > 'Tuo KeePass 1 -tietokanta' +Tämä muunnos toimii yhdensuuntaisesti. Et välttämättä saa enää tietokantaa auki vanhalla KeePassX 0.4 -versiolla.</translation> </message> <message> <source>Unsupported KeePass 2 database version.</source> @@ -2125,27 +2297,27 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>No root group</source> - <translation type="unfinished"/> + <translation>Ei isäntäryhmää</translation> </message> <message> <source>Missing icon uuid or data</source> - <translation type="unfinished"/> + <translation>Kuvakkeen uuid tai tiedot puuttuvat</translation> </message> <message> <source>Missing custom data key or value</source> - <translation type="unfinished"/> + <translation>Itse valittu sisältöavain tai -arvo puuttuu</translation> </message> <message> <source>Multiple group elements</source> - <translation type="unfinished"/> + <translation>Useita ryhmäelementtejä</translation> </message> <message> <source>Null group uuid</source> - <translation type="unfinished"/> + <translation>Tyhjä ryhmän uuid</translation> </message> <message> <source>Invalid group icon number</source> - <translation type="unfinished"/> + <translation>Virhellinen ryhmän kuvakkeen numeroarvo</translation> </message> <message> <source>Invalid EnableAutoType value</source> @@ -2161,63 +2333,63 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Null DeleteObject uuid</source> - <translation type="unfinished"/> + <translation>Tyhjä uudi-arvo objektia tuhotessa (DeleteObject)</translation> </message> <message> <source>Missing DeletedObject uuid or time</source> - <translation type="unfinished"/> + <translation>Tuhotun objektin (DeletedObject) uuid tai aika puuttuu</translation> </message> <message> <source>Null entry uuid</source> - <translation type="unfinished"/> + <translation>Tyhjä tietueen uuid (null)</translation> </message> <message> <source>Invalid entry icon number</source> - <translation type="unfinished"/> + <translation>Virhellinen ryhmän kuvakkeen numeroarvo</translation> </message> <message> <source>History element in history entry</source> - <translation type="unfinished"/> + <translation>Historiaelementti historiatietueessa</translation> </message> <message> <source>No entry uuid found</source> - <translation type="unfinished"/> + <translation>Tietueen uuid:tä ei löydy</translation> </message> <message> <source>History element with different uuid</source> - <translation type="unfinished"/> + <translation>Historiaelementti eri uuid:llä</translation> </message> <message> <source>Unable to decrypt entry string</source> - <translation type="unfinished"/> + <translation>Tietueen merkkijonon salausta ei voitu purkaa</translation> </message> <message> <source>Duplicate custom attribute found</source> - <translation type="unfinished"/> + <translation>Itse valittu attribuutti on jo olemassa</translation> </message> <message> <source>Entry string key or value missing</source> - <translation type="unfinished"/> + <translation>Tietueen merkkijonoavain tai -arvo puuttuu</translation> </message> <message> <source>Duplicate attachment found</source> - <translation type="unfinished"/> + <translation>Liite on jo olemassa</translation> </message> <message> <source>Entry binary key or value missing</source> - <translation type="unfinished"/> + <translation>Tietueen binääriavain tai -arvo puuttuu</translation> </message> <message> <source>Auto-type association window or sequence missing</source> - <translation type="unfinished"/> + <translation>Automaattisyötön ikkunan liitos tai sekvenssi puuttuu</translation> </message> <message> <source>Invalid bool value</source> - <translation type="unfinished"/> + <translation>Virheellinen boolean-arvo</translation> </message> <message> <source>Invalid date time value</source> - <translation type="unfinished"/> + <translation>Virheellinen päivämääräarvo</translation> </message> <message> <source>Invalid color value</source> @@ -2225,7 +2397,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Invalid color rgb part</source> - <translation type="unfinished"/> + <translation>Virheellinen RGB-väriarvo</translation> </message> <message> <source>Invalid number value</source> @@ -2238,7 +2410,7 @@ This is a one-way migration. You won't be able to open the imported databas <message> <source>Unable to decompress binary</source> <extracomment>Translator meant is a binary data inside an entry</extracomment> - <translation type="unfinished"/> + <translation>Binääriä ei voitu purkaa</translation> </message> </context> <context> @@ -2273,31 +2445,31 @@ This is a one-way migration. You won't be able to open the imported databas <message> <source>Unable to read encryption IV</source> <comment>IV = Initialization Vector for symmetric cipher</comment> - <translation type="unfinished"/> + <translation>Salauksen alustusvektoria ei voitu lukea</translation> </message> <message> <source>Invalid number of groups</source> - <translation type="unfinished"/> + <translation>Virheellinen määrä ryhmiä</translation> </message> <message> <source>Invalid number of entries</source> - <translation type="unfinished"/> + <translation>Virheellinen määrä tietueita</translation> </message> <message> <source>Invalid content hash size</source> - <translation type="unfinished"/> + <translation>Virheellinen sisältötarkisteen koko</translation> </message> <message> <source>Invalid transform seed size</source> - <translation type="unfinished"/> + <translation>Virheellinen avainmuunnossiemenen koko</translation> </message> <message> <source>Invalid number of transform rounds</source> - <translation type="unfinished"/> + <translation>Virheellinen määrä muunnoskertoimia</translation> </message> <message> <source>Unable to construct group tree</source> - <translation type="unfinished"/> + <translation>Ryhmän puuta ei voitu rakentaa</translation> </message> <message> <source>Root</source> @@ -2313,106 +2485,106 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Key transformation failed</source> - <translation type="unfinished"/> + <translation>Avaimen muuttaminen epäonnistui</translation> </message> <message> <source>Invalid group field type number</source> - <translation type="unfinished"/> + <translation>Virheellinen ryhmän kenttätyypin numero</translation> </message> <message> <source>Invalid group field size</source> - <translation type="unfinished"/> + <translation>Virheellinen ryhmän kentän koko</translation> </message> <message> <source>Read group field data doesn't match size</source> - <translation type="unfinished"/> + <translation>Luetun ryhmän kentän sisältö ei vastaa sen kokoa</translation> </message> <message> <source>Incorrect group id field size</source> - <translation type="unfinished"/> + <translation>Virheellinen ryhmän tunnistekentän koko</translation> </message> <message> <source>Incorrect group creation time field size</source> - <translation type="unfinished"/> + <translation>Virheellinen ryhmän luomisajan kentän koko</translation> </message> <message> <source>Incorrect group modification time field size</source> - <translation type="unfinished"/> + <translation>Virheellinen ryhmän muokkausajan kentän koko</translation> </message> <message> <source>Incorrect group access time field size</source> - <translation type="unfinished"/> + <translation>Virheellinen ryhmän hakuajan kentän koko</translation> </message> <message> <source>Incorrect group expiry time field size</source> - <translation type="unfinished"/> + <translation>Virheellinen ryhmän vanhentumisajan kentän koko</translation> </message> <message> <source>Incorrect group icon field size</source> - <translation type="unfinished"/> + <translation>Virheellinen ryhmän ikonikentän koko</translation> </message> <message> <source>Incorrect group level field size</source> - <translation type="unfinished"/> + <translation>Virheellinen ryhmän tasokentän koko</translation> </message> <message> <source>Invalid group field type</source> - <translation type="unfinished"/> + <translation>Virheellinen ryhmän kentän tyyppi</translation> </message> <message> <source>Missing group id or level</source> - <translation type="unfinished"/> + <translation>Ryhmän tunniste tai taso puuttuu</translation> </message> <message> <source>Missing entry field type number</source> - <translation type="unfinished"/> + <translation>Tietueen kentän tyyppinumero puuttuu</translation> </message> <message> <source>Invalid entry field size</source> - <translation type="unfinished"/> + <translation>Virheellinen tietueen kentän koko</translation> </message> <message> <source>Read entry field data doesn't match size</source> - <translation type="unfinished"/> + <translation>Luetun tietueen kentän sisältö ei vastaa sen kokoa</translation> </message> <message> <source>Invalid entry uuid field size</source> - <translation type="unfinished"/> + <translation>Virheellinen tietueen uuid-kentän koko</translation> </message> <message> <source>Invalid entry group id field size</source> - <translation type="unfinished"/> + <translation>Virheellinen tietueen ryhmän tunnistekentän koko</translation> </message> <message> <source>Invalid entry icon field size</source> - <translation type="unfinished"/> + <translation>Virheellinen tietueen ikonikentän koko</translation> </message> <message> <source>Invalid entry creation time field size</source> - <translation type="unfinished"/> + <translation>Virheellinen tietueen luomisajan kentän koko</translation> </message> <message> <source>Invalid entry modification time field size</source> - <translation type="unfinished"/> + <translation>Virhellinen tietueen muokkausajan kentän koko</translation> </message> <message> <source>Invalid entry expiry time field size</source> - <translation type="unfinished"/> + <translation>Virheellinen tietueen vanhentumisajan kentän koko</translation> </message> <message> <source>Invalid entry field type</source> - <translation type="unfinished"/> + <translation>Virheellinen tietueen kentän tyyppi</translation> </message> </context> <context> <name>Main</name> <message> <source>Existing single-instance lock file is invalid. Launching new instance.</source> - <translation type="unfinished"/> + <translation>Olemassa oleva yhden instanssin lukkotiedosto on virheellinen. Avataan uusi instanssi.</translation> </message> <message> <source>The lock file could not be created. Single-instance mode disabled.</source> - <translation type="unfinished"/> + <translation>Lukkotiedosto ei voitu luoda. Yhden instanssin tila otettu pois käytöstä.</translation> </message> <message> <source>Another instance of KeePassXC is already running.</source> @@ -2420,7 +2592,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Fatal error while testing the cryptographic functions.</source> - <translation type="unfinished"/> + <translation>Vakava virhe kryptografisia toimintoa testattaessa.</translation> </message> <message> <source>KeePassXC - Error</source> @@ -2455,7 +2627,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Time-based one-time password</source> - <translation type="unfinished"/> + <translation>Ajastettu kertakäyttöinen salasana</translation> </message> <message> <source>&Groups</source> @@ -2467,11 +2639,11 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>&Quit</source> - <translation>Lopeta</translation> + <translation>&Lopeta</translation> </message> <message> <source>&About</source> - <translation>Tietoja</translation> + <translation>T&ietoja</translation> </message> <message> <source>&Open database...</source> @@ -2479,43 +2651,43 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>&Save database</source> - <translation>Tallenna tietokanta</translation> + <translation>&Tallenna tietokanta</translation> </message> <message> <source>&Close database</source> - <translation>Sulje tietokanta</translation> + <translation>&Sulje tietokanta</translation> </message> <message> <source>&New database</source> - <translation>Uusi tietokanta</translation> + <translation>&Uusi tietokanta</translation> </message> <message> <source>Merge from KeePassX database</source> - <translation>Yhdistä KeePassX-tietokannasta</translation> + <translation>Yhdistä KeePassXC-tietokannasta</translation> </message> <message> <source>&Add new entry</source> - <translation>Lisää merkintä</translation> + <translation>Lisää &tietue</translation> </message> <message> <source>&View/Edit entry</source> - <translation>Näytä/muokkaa merkintää</translation> + <translation>Näytä/&muokkaa tietuetta</translation> </message> <message> <source>&Delete entry</source> - <translation>Poista merkintä</translation> + <translation>&Poista tietue</translation> </message> <message> <source>&Add new group</source> - <translation>Lisää uusi ryhmä</translation> + <translation>Lisää uusi &ryhmä</translation> </message> <message> <source>&Edit group</source> - <translation>Muokkaa ryhmää</translation> + <translation>Muokkaa r&yhmää</translation> </message> <message> <source>&Delete group</source> - <translation>Poista ryhmä</translation> + <translation>Poista ry&hmä</translation> </message> <message> <source>Sa&ve database as...</source> @@ -2527,7 +2699,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>&Database settings</source> - <translation>Tietokannan asetukset</translation> + <translation>Tietokannan &asetukset</translation> </message> <message> <source>Database settings</source> @@ -2535,15 +2707,15 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>&Clone entry</source> - <translation>Kloonaa merkintä</translation> + <translation>&Kloonaa tietue</translation> </message> <message> <source>&Find</source> - <translation>Etsi</translation> + <translation>&Etsi</translation> </message> <message> <source>Copy &username</source> - <translation>Kopioi käyttäjätunnus</translation> + <translation>Kopioi käyttäjä&tunnus</translation> </message> <message> <source>Copy username to clipboard</source> @@ -2551,7 +2723,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Cop&y password</source> - <translation>Kopioi salasana</translation> + <translation>Kopioi &salasana</translation> </message> <message> <source>Copy password to clipboard</source> @@ -2559,7 +2731,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>&Settings</source> - <translation>Asetukset</translation> + <translation>&Asetukset</translation> </message> <message> <source>Password Generator</source> @@ -2567,27 +2739,27 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>&Perform Auto-Type</source> - <translation>Suorita automaattitäydennys</translation> + <translation>Suorita automaattisyöttö</translation> </message> <message> <source>&Open URL</source> - <translation>Avaa URL</translation> + <translation>Avaa &URL</translation> </message> <message> <source>&Lock databases</source> - <translation>Lukitse tietokannat</translation> + <translation>&Lukitse tietokannat</translation> </message> <message> <source>&Title</source> - <translation>Otsikko</translation> + <translation>&Otsikko</translation> </message> <message> <source>Copy title to clipboard</source> - <translation type="unfinished"/> + <translation>Kopioi nimi leikepöydälle</translation> </message> <message> <source>&URL</source> - <translation>URL</translation> + <translation>&URL</translation> </message> <message> <source>Copy URL to clipboard</source> @@ -2595,11 +2767,11 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>&Notes</source> - <translation>Muistiinpanot</translation> + <translation>&Muistiinpanot</translation> </message> <message> <source>Copy notes to clipboard</source> - <translation type="unfinished"/> + <translation>Kopioi muistiinpanot leikepöydälle</translation> </message> <message> <source>&Export to CSV file...</source> @@ -2643,7 +2815,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> - <translation type="unfinished"/> + <translation><p>Vaikuttaa siltä, että käytät KeePassHTTP:tä selaimesi kanssa. Tämä ominaisuus on vanhentunut ja tuki sille poistetaan tulevaisuudessa.<br>Ole hyvä ja vaihda selainlaajennus KeePassXC-Browser:iin! Mikäli tarvitset apua sen käyttöönottoon, vieraile <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">oppaassamme</a>(varoitus %1/3).</p></translation> </message> <message> <source>read-only</source> @@ -2655,7 +2827,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Toggle window</source> - <translation type="unfinished"/> + <translation>Vaihda ikkunaan</translation> </message> <message> <source>Quit KeePassXC</source> @@ -2685,6 +2857,14 @@ This is a one-way migration. You won't be able to open the imported databas <source>Please touch the button on your YubiKey!</source> <translation>Kosketa YubiKeyssa olevaa painiketta!</translation> </message> + <message> + <source>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</source> + <translation>VAROITUS: Käytät epävakaata KeePassXC-julkaisua! +On mahdollista, että tietokantasi korruptoituu. Pidä huolta sen varmuuskopiosta. +Tätä versiota ei ole tarkoitettu päivittäiseen käyttöön.</translation> + </message> </context> <context> <name>OpenSSHKey</name> @@ -2694,15 +2874,11 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>PEM boundary mismatch</source> - <translation type="unfinished"/> - </message> - <message> - <source>This is not an OpenSSH key, only modern keys are supported</source> - <translation type="unfinished"/> + <translation>Yhteensopimaton PEM-raja-arvo</translation> </message> <message> <source>Base64 decoding failed</source> - <translation type="unfinished"/> + <translation>Base64-dekoodaus epäonnistui</translation> </message> <message> <source>Key file way too small.</source> @@ -2710,7 +2886,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Key file magic header id invalid</source> - <translation type="unfinished"/> + <translation>Otsaketietojen taikatunniste on virheellinen</translation> </message> <message> <source>Found zero keys</source> @@ -2726,40 +2902,28 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>No private key payload to decrypt</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown cipher: </source> - <translation type="unfinished"/> + <translation>Salauksen purku epäonnistui: yksityisen avaimen sisältö on tyhjä</translation> </message> <message> <source>Trying to run KDF without cipher</source> - <translation type="unfinished"/> + <translation>Yritetään tehdä avainmuunnosfunktiota ilman salausta</translation> </message> <message> <source>Passphrase is required to decrypt this key</source> - <translation type="unfinished"/> + <translation>Avaimen purkuun vaaditaan salalause</translation> </message> <message> <source>Key derivation failed, key file corrupted?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown KDF: </source> - <translation type="unfinished"/> + <translation>Avaimen muuntaminen epäonnistui. Onko avaintiedosto korruptoitunut?</translation> </message> <message> <source>Decryption failed, wrong passphrase?</source> - <translation type="unfinished"/> + <translation>Salauksen purku epäonnistui, väärä salalause?</translation> </message> <message> <source>Unexpected EOF while reading public key</source> <translation>Odottamaton EOF julkista avainta luettaessa</translation> </message> - <message> - <source>Unknown key type: </source> - <translation>Tuntematon avaintyyppi:</translation> - </message> <message> <source>Unexpected EOF while reading private key</source> <translation>Odottamaton EOF yksityistä avainta luettaessa</translation> @@ -2780,6 +2944,26 @@ This is a one-way migration. You won't be able to open the imported databas <source>Unexpected EOF when writing private key</source> <translation>Odottamaton EOF yksityistä avainta kirjoittaessa</translation> </message> + <message> + <source>Unsupported key type: %1</source> + <translation>Tuntematon avaimen tyyppi: %1</translation> + </message> + <message> + <source>Unknown cipher: %1</source> + <translation>Tuntematon salausalgoritmi: %1</translation> + </message> + <message> + <source>Cipher IV is too short for MD5 kdf</source> + <translation>Salausalgoritmin alustusvektori on liian lyhyt MD5-avainmuunnosfunktiolle</translation> + </message> + <message> + <source>Unknown KDF: %1</source> + <translation>Tuntematon avainmuunnosfunktio: %1</translation> + </message> + <message> + <source>Unknown key type: %1</source> + <translation>Tuntematon avaimen tyyppi: %1</translation> + </message> </context> <context> <name>OptionDialog</name> @@ -2806,7 +2990,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation type="unfinished"/> + <translation>Palauta vain parhaat osumat tietystä osoitteesta verkkotunnuksen kaikkien osumien sijasta</translation> </message> <message> <source>&Return only best matching entries</source> @@ -2822,15 +3006,15 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>&Match URL schemes</source> - <translation type="unfinished"/> + <translation>&Sovita verkko-osoitteen kaavaan</translation> </message> <message> <source>Sort matching entries by &username</source> - <translation type="unfinished"/> + <translation>Järjestä sopivat tietueet &käyttäjätunnuksen mukaan</translation> </message> <message> <source>Sort &matching entries by title</source> - <translation type="unfinished"/> + <translation>Järjestä sopivat tietueet &nimen mukaan</translation> </message> <message> <source>R&emove all shared encryption keys from active database</source> @@ -2838,7 +3022,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Re&move all stored permissions from entries in active database</source> - <translation type="unfinished"/> + <translation>&Poista kaikki jaetut salausavaimet aktiivisesta tietokannasta</translation> </message> <message> <source>Password Generator</source> @@ -2866,11 +3050,11 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Automatically creating or updating string fields is not supported.</source> - <translation type="unfinished"/> + <translation>Automaattinen lisäjonokenttien luonti tai päivittäminen ei ole tuettu</translation> </message> <message> <source>&Return advanced string fields which start with "KPH: "</source> - <translation type="unfinished"/> + <translation>Palauta lisämerkkijonokentät jotka alkavat "KPH: "</translation> </message> <message> <source>HTTP Port:</source> @@ -2907,7 +3091,7 @@ Käytetään oletusporttia 19455.</translation> <name>PasswordGeneratorWidget</name> <message> <source>%p%</source> - <translation type="unfinished"/> + <translation>%p%</translation> </message> <message> <source>Password:</source> @@ -2964,7 +3148,7 @@ Käytetään oletusporttia 19455.</translation> </message> <message> <source>Passphrase</source> - <translation>Tunnuslause</translation> + <translation>Salalause</translation> </message> <message> <source>Wordlist:</source> @@ -3035,11 +3219,11 @@ Käytetään oletusporttia 19455.</translation> </message> <message> <source>Database hash not available</source> - <translation type="unfinished"/> + <translation>Tietokannan tiivistettä (hash) ei saatu</translation> </message> <message> <source>Client public key not received</source> - <translation type="unfinished"/> + <translation>Asiakkaan julkista avainta ei saatu</translation> </message> <message> <source>Cannot decrypt message</source> @@ -3059,7 +3243,7 @@ Käytetään oletusporttia 19455.</translation> </message> <message> <source>KeePassXC association failed, try again</source> - <translation type="unfinished"/> + <translation>Liittäminen KeePassXC:hen epäonnistui, yritä uudelleen</translation> </message> <message> <source>Key change was not successful</source> @@ -3083,11 +3267,11 @@ Käytetään oletusporttia 19455.</translation> </message> <message> <source>No URL provided</source> - <translation type="unfinished"/> + <translation>Sivuston osoitetta ei ole annettu</translation> </message> <message> <source>No logins found</source> - <translation type="unfinished"/> + <translation>Tunnuksia ei löydy</translation> </message> <message> <source>Unknown error</source> @@ -3095,7 +3279,7 @@ Käytetään oletusporttia 19455.</translation> </message> <message> <source>Add a new entry to a database.</source> - <translation type="unfinished"/> + <translation>Lisää uusi tietue tietokantaan.</translation> </message> <message> <source>Path of the database.</source> @@ -3111,7 +3295,7 @@ Käytetään oletusporttia 19455.</translation> </message> <message> <source>Username for the entry.</source> - <translation type="unfinished"/> + <translation>Tietueen käyttäjänimi.</translation> </message> <message> <source>username</source> @@ -3119,7 +3303,7 @@ Käytetään oletusporttia 19455.</translation> </message> <message> <source>URL for the entry.</source> - <translation type="unfinished"/> + <translation>Tietueen osoite.</translation> </message> <message> <source>URL</source> @@ -3127,64 +3311,64 @@ Käytetään oletusporttia 19455.</translation> </message> <message> <source>Prompt for the entry's password.</source> - <translation type="unfinished"/> + <translation>Tietueen salasanan kuvaus.</translation> </message> <message> <source>Generate a password for the entry.</source> - <translation type="unfinished"/> + <translation>Luo tietueelle salasana.</translation> </message> <message> <source>Length for the generated password.</source> - <translation type="unfinished"/> + <translation>Luodun salasanan pituus.</translation> </message> <message> <source>length</source> - <translation type="unfinished"/> + <translation>pituus</translation> </message> <message> <source>Path of the entry to add.</source> - <translation type="unfinished"/> + <translation>Lisättävän tietueen polku.</translation> </message> <message> <source>Copy an entry's password to the clipboard.</source> - <translation type="unfinished"/> + <translation>Kopioi salasana leikepöydälle.</translation> </message> <message> <source>Path of the entry to clip.</source> <comment>clip = copy to clipboard</comment> - <translation type="unfinished"/> + <translation>Kopioitavan tietueen polku.</translation> </message> <message> <source>Timeout in seconds before clearing the clipboard.</source> - <translation type="unfinished"/> + <translation>Viive sekunneissa ennen leikepöydän tyhjentämistä.</translation> </message> <message> <source>Edit an entry.</source> - <translation type="unfinished"/> + <translation>Muokkaa tietuetta.</translation> </message> <message> <source>Title for the entry.</source> - <translation type="unfinished"/> + <translation>Tietueen nimi</translation> </message> <message> <source>title</source> - <translation type="unfinished"/> + <translation>nimi</translation> </message> <message> <source>Path of the entry to edit.</source> - <translation type="unfinished"/> + <translation>Muokattavan tietueen polku.</translation> </message> <message> <source>Estimate the entropy of a password.</source> - <translation type="unfinished"/> + <translation>Salasanan arvioitu entropia.</translation> </message> <message> <source>Password for which to estimate the entropy.</source> - <translation type="unfinished"/> + <translation>Salasana josta entropia arvioidaan.</translation> </message> <message> <source>Perform advanced analysis on the password.</source> - <translation type="unfinished"/> + <translation>Suorita salasanalle edistynyt analyysi.</translation> </message> <message> <source>Extract and print the content of a database.</source> @@ -3196,7 +3380,7 @@ Käytetään oletusporttia 19455.</translation> </message> <message> <source>Insert password to unlock %1: </source> - <translation type="unfinished"/> + <translation>Syötä salasana avataksesi %1:</translation> </message> <message> <source>Failed to load key file %1 : %2</source> @@ -3207,7 +3391,10 @@ Käytetään oletusporttia 19455.</translation> unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>Käytät vanhaa avaintiedostomuotoa joka ei ole +välttämättä tuettu tulevaisuudessa. + +Ole hyvä ja harkitse uuden avaintiedoston luomista.</translation> </message> <message> <source> @@ -3229,15 +3416,15 @@ Käytettävissä olevat komennot: </message> <message> <source>Path of the group to list. Default is /</source> - <translation type="unfinished"/> + <translation>Listattavan ryhmän polku. Oletus on /</translation> </message> <message> <source>Find entries quickly.</source> - <translation type="unfinished"/> + <translation>Etsi tietueita nopeasti.</translation> </message> <message> <source>Search term.</source> - <translation type="unfinished"/> + <translation>Hakutermi.</translation> </message> <message> <source>Merge two databases.</source> @@ -3257,19 +3444,19 @@ Käytettävissä olevat komennot: </message> <message> <source>Key file of the database to merge from.</source> - <translation type="unfinished"/> + <translation>Tietokannan avaintiedosto, josta yhdistetään.</translation> </message> <message> <source>Show an entry's information.</source> - <translation type="unfinished"/> + <translation>Näytä tietueen tiedot.</translation> </message> <message> <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> - <translation type="unfinished"/> + <translation>Näytettävien attribuuttien nimi. Tämän asetuksen voi määrittää useammin kuin kerran, jokaisen attribuutin näkyessä omalla rivillään annetussa järjestyksessä. Jos attribuutteja ei ole määritetty, näytetään yhteenveto oletuksista.</translation> </message> <message> <source>attribute</source> - <translation type="unfinished"/> + <translation>attribuutti</translation> </message> <message> <source>Name of the entry to show.</source> @@ -3277,7 +3464,7 @@ Käytettävissä olevat komennot: </message> <message> <source>NULL device</source> - <translation type="unfinished"/> + <translation>Tyhjä laite (NULL)</translation> </message> <message> <source>error reading from device</source> @@ -3286,16 +3473,16 @@ Käytettävissä olevat komennot: <message> <source>file empty ! </source> - <translation>tiedosto tyhjä ! + <translation>tiedosto on tyhjä ! </translation> </message> <message> <source>malformed string</source> - <translation type="unfinished"/> + <translation>Viallinen merkkijono</translation> </message> <message> <source>missing closing quote</source> - <translation type="unfinished"/> + <translation>lainausmerkki puuttuu lopusta</translation> </message> <message> <source>AES: 256-bit</source> @@ -3351,7 +3538,7 @@ Käytettävissä olevat komennot: </message> <message> <source>Legacy Browser Integration</source> - <translation type="unfinished"/> + <translation>Vanha selainintegraatio</translation> </message> <message> <source>Browser Integration</source> @@ -3373,24 +3560,70 @@ Käytettävissä olevat komennot: <source>SSH Agent</source> <translation>SSH-agentti</translation> </message> + <message> + <source>Generate a new random diceware passphrase.</source> + <translation>Luo uusi satunnainen noppaware-salalause</translation> + </message> + <message> + <source>Word count for the diceware passphrase.</source> + <translation>Sanamäärä noppaware-salalauseelle.</translation> + </message> + <message> + <source>count</source> + <translation>määrä</translation> + </message> + <message> + <source>Wordlist for the diceware generator. +[Default: EFF English]</source> + <translation>Sanalista noppaware-luojalle. +[Oletus: EFF Englanti]</translation> + </message> + <message> + <source>Generate a new random password.</source> + <translation>Luo uusi satunnainen salasana.</translation> + </message> + <message> + <source>Length of the generated password.</source> + <translation>Luodun salasanan pituus.</translation> + </message> + <message> + <source>Use lowercase characters in the generated password.</source> + <translation>Käytä pieniä kirjaimia luodussa salasanassa.</translation> + </message> + <message> + <source>Use uppercase characters in the generated password.</source> + <translation>Käytä isoja kirjaimia luodussa salasanassa.</translation> + </message> + <message> + <source>Use numbers in the generated password.</source> + <translation>Käytä numeroita luodussa salasanassa.</translation> + </message> + <message> + <source>Use special characters in the generated password.</source> + <translation>Käytä erikoismerkkejä luodussa salasanassa.</translation> + </message> + <message> + <source>Use extended ASCII in the generated password.</source> + <translation>Käytä laajennettua ASCII-merkistöä luodussa salasanassa.</translation> + </message> </context> <context> <name>QtIOCompressor</name> <message> <source>Internal zlib error when compressing: </source> - <translation>Sisäinen zlib virhe pakatessa:</translation> + <translation>Sisäinen zlib virhe pakatessa: </translation> </message> <message> <source>Error writing to underlying device: </source> - <translation type="unfinished"/> + <translation>Kirjoitus taustalla olevaan laitteeseen epäonnistui:</translation> </message> <message> <source>Error opening underlying device: </source> - <translation type="unfinished"/> + <translation>Taustalla olevan laitteen avaus epäonnistui:</translation> </message> <message> <source>Error reading data from underlying device: </source> - <translation type="unfinished"/> + <translation>Virhe luettaessa taustalla olevasta laitteesta:</translation> </message> <message> <source>Internal zlib error when decompressing: </source> @@ -3405,7 +3638,7 @@ Käytettävissä olevat komennot: </message> <message> <source>Internal zlib error: </source> - <translation>Sisäinen zlib-virhe:</translation> + <translation>Sisäinen zlib-virhe: </translation> </message> </context> <context> @@ -3435,13 +3668,15 @@ Käytettävissä olevat komennot: <name>Service</name> <message> <source>KeePassXC: New key association request</source> - <translation type="unfinished"/> + <translation>KeePassXC: Uusi avaimenliittämispyyntö</translation> </message> <message> <source>You have received an association request for the above key. If you would like to allow it access to your KeePassXC database give it a unique name to identify and accept it.</source> - <translation type="unfinished"/> + <translation>Olet saanut avainlittämispyynnön yllä olevalle avaimelle +Jos haluat antaa sille pääsyoikeuden KeePassXC-tietokantaasi, +anna tunnisteelle nimi ja hyväksy.</translation> </message> <message> <source>KeePassXC: Overwrite existing key?</source> @@ -3455,11 +3690,11 @@ Haluatko korvata sen?</translation> </message> <message> <source>KeePassXC: Update Entry</source> - <translation>KeePassXC: Päivitä merkintä</translation> + <translation>KeePassXC: Päivitä tietue</translation> </message> <message> <source>Do you want to update the information in %1 - %2?</source> - <translation type="unfinished"/> + <translation>Haluatko päivittää tiedot osoitteesta %1 - %2?</translation> </message> <message> <source>KeePassXC: Database locked!</source> @@ -3477,7 +3712,7 @@ Avaa valittu tietokanta tai valitse toinen avattu tietokanta.</translation> </message> <message numerus="yes"> <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Poistettiin %n salausavain(ta) KeePassX/Http-asetuksista.</numerusform><numerusform>Poistettiin %n salausavain(ta) KeePassX/Http-asetuksista.</numerusform></translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -3493,7 +3728,7 @@ Avaa valittu tietokanta tai valitse toinen avattu tietokanta.</translation> </message> <message> <source>The active database does not contain an entry of KeePassHttp Settings.</source> - <translation type="unfinished"/> + <translation>Aktiivinen tietokanta ei sisällä tietuetta KeePassHttp-asetuksilla.</translation> </message> <message> <source>Removing stored permissions...</source> @@ -3509,15 +3744,15 @@ Avaa valittu tietokanta tai valitse toinen avattu tietokanta.</translation> </message> <message numerus="yes"> <source>Successfully removed permissions from %n entries.</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Poistettiin käyttöoikeudet %1:n tietueen tiedoista.</numerusform><numerusform>Poistettiin käyttöoikeudet %1:n tietueen tiedoista.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> - <translation type="unfinished"/> + <translation>KeePassXC: Tietuetta käyttöoikeuksilla ei löytynyt!</translation> </message> <message> <source>The active database does not contain an entry with permissions.</source> - <translation type="unfinished"/> + <translation>Aktiivinen tietokanta ei sisällä yhtään tietuetta käyttöoikeuksien kanssa.</translation> </message> </context> <context> @@ -3583,15 +3818,15 @@ Avaa valittu tietokanta tai valitse toinen avattu tietokanta.</translation> </message> <message> <source>Use group icon on entry creation</source> - <translation>Käytä ryhmän kuvaketta merkintää luodessa</translation> + <translation>Käytä ryhmän kuvaketta tietuetta luodessa</translation> </message> <message> <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> - <translation type="unfinished"/> + <translation>Älä merkitse tietokantaa muokatuksi mikäli tietueet eivät muutu (esim. ryhmien laajentamisen yhteydessä)</translation> </message> <message> <source>Hide the Details view</source> - <translation type="unfinished"/> + <translation>Piilota tarkemmat tiedot</translation> </message> <message> <source>Show a system tray icon</source> @@ -3615,33 +3850,57 @@ Avaa valittu tietokanta tai valitse toinen avattu tietokanta.</translation> </message> <message> <source>Auto-Type</source> - <translation>Automaattitäydennys</translation> + <translation>Automaattisyöttö</translation> </message> <message> <source>Use entry title to match windows for global Auto-Type</source> - <translation type="unfinished"/> + <translation>Tietue on sopiva, jos sen nimi sisältyy kohdeikkunan otsikkoon yleisessä automaattisyötössä</translation> </message> <message> <source>Use entry URL to match windows for global Auto-Type</source> - <translation type="unfinished"/> + <translation>Tietue on sopiva, jos sen osoite sisältyy kohdeikkunan otsikkoon yleisessä automaattisyötössä</translation> </message> <message> <source>Always ask before performing Auto-Type</source> - <translation>Kysy aina ennen automaattitäydennyksen käyttämistä</translation> + <translation>Kysy aina ennen automaattisyötön käyttämistä</translation> </message> <message> <source>Global Auto-Type shortcut</source> - <translation>Globaalin automaattitäydennyksen pikanäppäin</translation> + <translation>Yleisen automaattisyötön pikanäppäin</translation> </message> <message> <source>Auto-Type delay</source> - <translation>Automaattitäydennyksen viive</translation> + <translation>Automaattisyötön viive</translation> </message> <message> <source> ms</source> <comment>Milliseconds</comment> <translation> ms</translation> </message> + <message> + <source>Startup</source> + <translation>Käynnistys</translation> + </message> + <message> + <source>File Management</source> + <translation>Tiedostohallinta</translation> + </message> + <message> + <source>Safely save database files (may be incompatible with Dropbox, etc)</source> + <translation>Tallenna tietokannat turvallisesti (voi olla epäyhteensopiva Dropboxin tmv. kanssa)</translation> + </message> + <message> + <source>Backup database file before saving</source> + <translation>Ota tietokannasta varmuuskopio ennen tallentamista</translation> + </message> + <message> + <source>Entry Management</source> + <translation>Tietueiden hallinta</translation> + </message> + <message> + <source>General</source> + <translation>Yleistä</translation> + </message> </context> <context> <name>SettingsWidgetSecurity</name> @@ -3656,7 +3915,7 @@ Avaa valittu tietokanta tai valitse toinen avattu tietokanta.</translation> <message> <source> sec</source> <comment>Seconds</comment> - <translation>s.</translation> + <translation> s</translation> </message> <message> <source>Lock databases after inactivity of</source> @@ -3684,11 +3943,11 @@ Avaa valittu tietokanta tai valitse toinen avattu tietokanta.</translation> </message> <message> <source>Hide passwords in the preview panel</source> - <translation type="unfinished"/> + <translation>Piilota salasanat esikatselussa</translation> </message> <message> <source>Hide entry notes by default</source> - <translation type="unfinished"/> + <translation>Piilota tietueiden muistiinpanot</translation> </message> <message> <source>Privacy</source> @@ -3698,6 +3957,10 @@ Avaa valittu tietokanta tai valitse toinen avattu tietokanta.</translation> <source>Use Google as fallback for downloading website icons</source> <translation>Käytä Googlea varajärjestelmänä verkkosivustojen kuvakkeiden latausta varten</translation> </message> + <message> + <source>Re-lock previously locked database after performing Auto-Type</source> + <translation>Uudelleenlukitse aikaisemmin lukittu tietokanta automaattisyötön jälkeen</translation> + </message> </context> <context> <name>SetupTotpDialog</name> @@ -3711,11 +3974,11 @@ Avaa valittu tietokanta tai valitse toinen avattu tietokanta.</translation> </message> <message> <source>Default RFC 6238 token settings</source> - <translation type="unfinished"/> + <translation>Oletusarvoiset RFC 6238:n mukaiset tunnisteasetukset</translation> </message> <message> <source>Steam token settings</source> - <translation type="unfinished"/> + <translation>Steam-tunnisteen asetukset</translation> </message> <message> <source>Use custom settings</source> @@ -3744,7 +4007,7 @@ Avaa valittu tietokanta tai valitse toinen avattu tietokanta.</translation> <message> <source> sec</source> <comment>Seconds</comment> - <translation>s.</translation> + <translation> s</translation> </message> </context> <context> @@ -3779,10 +4042,6 @@ Avaa valittu tietokanta tai valitse toinen avattu tietokanta.</translation> </context> <context> <name>WelcomeWidget</name> - <message> - <source>Welcome to KeePassXC</source> - <translation>Tervetuloa käyttämään KeePassXC:tä</translation> - </message> <message> <source>Start storing your passwords securely in a KeePassXC database</source> <translation>Aloita salasanojesi turvallinen tallentaminen KeePassXC-tietokantaan</translation> @@ -3807,12 +4066,16 @@ Avaa valittu tietokanta tai valitse toinen avattu tietokanta.</translation> <source>Recent databases</source> <translation>Viimeisimmät tietokannat</translation> </message> + <message> + <source>Welcome to KeePassXC %1</source> + <translation>Tervetuloa KeePassXC:n versioon %1</translation> + </message> </context> <context> <name>main</name> <message> <source>Remove an entry from the database.</source> - <translation type="unfinished"/> + <translation>Poista tietue tietokannasta.</translation> </message> <message> <source>Path of the database.</source> @@ -3820,7 +4083,7 @@ Avaa valittu tietokanta tai valitse toinen avattu tietokanta.</translation> </message> <message> <source>Path of the entry to remove.</source> - <translation type="unfinished"/> + <translation>Poistettavan tietueen polku.</translation> </message> <message> <source>KeePassXC - cross-platform password manager</source> @@ -3844,7 +4107,7 @@ Avaa valittu tietokanta tai valitse toinen avattu tietokanta.</translation> </message> <message> <source>Parent window handle</source> - <translation type="unfinished"/> + <translation>Ylemmän ikkunan kahva</translation> </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_fr.ts b/share/translations/keepassx_fr.ts index ece9cd5b0..3655a9e90 100644 --- a/share/translations/keepassx_fr.ts +++ b/share/translations/keepassx_fr.ts @@ -15,11 +15,7 @@ </message> <message> <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassXC est distribué suivant les termes de la GNU Licence Publique Générale (GNU GPL) version 2 ou version 3 de la licence (à votre choix).</translation> - </message> - <message> - <source>Project Maintainers:</source> - <translation>Mainteneurs du projet :</translation> + <translation>KeePassXC est distribué suivant les termes de la Licence Publique Générale GNU (GNU GPL), soit la version 2 de la Licence soit (à votre gré) la version 3.</translation> </message> <message> <source>Contributors</source> @@ -27,7 +23,7 @@ </message> <message> <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Voir Contributions sur GitHub</a></translation> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Voir les contributions sur GitHub</a></translation> </message> <message> <source>Debug Info</source> @@ -35,7 +31,7 @@ </message> <message> <source>Include the following information whenever you report a bug:</source> - <translation>Inclure l'information suivante lorsque vous signaler un bug :</translation> + <translation>Inclure les informations suivantes lorsque vous signaler un bug :</translation> </message> <message> <source>Copy to clipboard</source> @@ -65,18 +61,32 @@ CPU architecture: %2 Kernel: %3 %4</source> <translation>Système d'exploitation : %1 Architecture CPU : %2 -Kernel : %3 %4</translation> +Noyau : %3 %4</translation> </message> <message> <source>Enabled extensions:</source> <translation>Extensions activées :</translation> </message> + <message> + <source>Project Maintainers:</source> + <translation>Mainteneurs du projet :</translation> + </message> + <message> + <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> + <translation>L'équipe de KeePassXC remercie tout particulièrement debfx pour la conception de KeePassX.</translation> + </message> + <message> + <source>Build Type: %1 +</source> + <translation>Genre de la version: %1 +</translation> + </message> </context> <context> <name>AccessControlDialog</name> <message> <source>KeePassXC HTTP Confirm Access</source> - <translation>Accès KeePassXC HTTP confirmé</translation> + <translation>Confirmer l'accès pour KeePassXC HTTP</translation> </message> <message> <source>Remember this decision</source> @@ -93,7 +103,7 @@ Kernel : %3 %4</translation> <message> <source>%1 has requested access to passwords for the following item(s). Please select whether you want to allow access.</source> - <translation>%1 a demandé l’accès aux mots de passe pour l'élément suivant (ou les éléments suivants). + <translation>%1 a demandé l’accès aux mots de passe pour le ou les élément(s) suivant(s). Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> </message> </context> @@ -112,11 +122,11 @@ Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> </message> <message> <source>Auto-Type - KeePassXC</source> - <translation> Remplissage automatique - KeePassXC</translation> + <translation>Saisie automatique - KeePassXC</translation> </message> <message> <source>Auto-Type</source> - <translation>Saisie-Automatique</translation> + <translation>Saisie automatique</translation> </message> <message> <source>The Syntax of your Auto-Type statement is incorrect!</source> @@ -124,15 +134,15 @@ Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> </message> <message> <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> - <translation>Cette commande de saisie automatique contient un délai très long. Êtes-vous sûr ?</translation> + <translation>Cette commande de saisie automatique contient un délai très long. Voulez-vous continuer ?</translation> </message> <message> <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> - <translation>Cette commande de saisie automatique contient des touches très lentes. Êtes-vous sûr?</translation> + <translation>Cette commande de saisie automatique contient des touches très lentes. Voulez-vous continuer?</translation> </message> <message> <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> - <translation>Cette commande de saisie automatique contient des arguments souvent répétés. Êtes-vous sûr ?</translation> + <translation>Cette commande de saisie automatique contient des arguments souvent répétés. Voulez-vous continuer ?</translation> </message> </context> <context> @@ -150,22 +160,41 @@ Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> <translation>Séquence par défaut</translation> </message> </context> +<context> + <name>AutoTypeMatchModel</name> + <message> + <source>Group</source> + <translation>Groupe</translation> + </message> + <message> + <source>Title</source> + <translation>Titre</translation> + </message> + <message> + <source>Username</source> + <translation>Nom d'utilisateur</translation> + </message> + <message> + <source>Sequence</source> + <translation>Séquence</translation> + </message> +</context> <context> <name>AutoTypeSelectDialog</name> <message> <source>Auto-Type - KeePassXC</source> - <translation> Remplissage automatique - KeePassXC</translation> + <translation>Saisie automatique - KeePassXC</translation> </message> <message> <source>Select entry to Auto-Type:</source> - <translation>Choisissez un champ pour Auto-Type :</translation> + <translation>Sélectionner une entrée à saisir automatiquement :</translation> </message> </context> <context> <name>BrowserAccessControlDialog</name> <message> <source>KeePassXC-Browser Confirm Access</source> - <translation>KeePassXC - Navigateur Confirmer l’accès</translation> + <translation>Confirmer l’accès pour KeePassXC-Browser</translation> </message> <message> <source>Remember this decision</source> @@ -182,7 +211,7 @@ Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> <message> <source>%1 has requested access to passwords for the following item(s). Please select whether you want to allow access.</source> - <translation>%1 a demandé l’accès aux mots de passe pour l'élément suivant (ou les éléments suivants). + <translation>%1 a demandé l’accès aux mots de passe pour le ou les élément(s) suivant(s). Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> </message> </context> @@ -194,11 +223,11 @@ Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> </message> <message> <source>This is required for accessing your databases with KeePassXC-Browser</source> - <translation type="unfinished"/> + <translation>Ceci est requis pour accéder à vos bases de données à partir de KeePassXC-Browser</translation> </message> <message> <source>Enable KeepassXC browser integration</source> - <translation>Activer l'intégration KeepassXC au navigateur</translation> + <translation>Activer l'intégration de KeePassXC au sein du navigateur web</translation> </message> <message> <source>General</source> @@ -206,28 +235,28 @@ Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> </message> <message> <source>Enable integration for these browsers:</source> - <translation>Activer l'intégration avec ces navigateurs:</translation> + <translation>Activer l'intégration avec ces navigateurs web :</translation> </message> <message> <source>&Google Chrome</source> - <translation type="unfinished"/> + <translation>&Google Chrome</translation> </message> <message> <source>&Firefox</source> - <translation type="unfinished"/> + <translation>&Firefox</translation> </message> <message> <source>&Chromium</source> - <translation type="unfinished"/> + <translation>&Chromium</translation> </message> <message> <source>&Vivaldi</source> - <translation type="unfinished"/> + <translation>&Vivaldi</translation> </message> <message> <source>Show a &notification when credentials are requested</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Afficher une &notification quand les identifiants sont demandés</translation> </message> <message> <source>Re&quest to unlock the database if it is locked</source> @@ -239,7 +268,7 @@ Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> </message> <message> <source>&Match URL scheme (e.g., https://...)</source> - <translation type="unfinished"/> + <translation>&Correspondance du format de l'URL (exemple https://...)</translation> </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> @@ -247,25 +276,25 @@ Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> </message> <message> <source>&Return only best-matching credentials</source> - <translation type="unfinished"/> + <translation>Retourner uniquement l'identifiant qui correspond le mieux</translation> </message> <message> <source>Sort &matching credentials by title</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Trier les identifiants trouvés par titre</translation> </message> <message> <source>Sort matching credentials by &username</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Trier les identifiants trouvés par &nom d'utilisateur</translation> </message> <message> <source>&Disconnect all browsers</source> - <translation type="unfinished"/> + <translation>&Déconnecter tous les navigateurs web</translation> </message> <message> <source>Forget all remembered &permissions</source> - <translation type="unfinished"/> + <translation>Oublier toutes les autorisations accordées</translation> </message> <message> <source>Advanced</source> @@ -274,12 +303,12 @@ Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> <message> <source>Never &ask before accessing credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Ne jamais &demander avant d'accéder aux identifiants</translation> </message> <message> <source>Never ask before &updating credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Ne jamais &demander avant de mettre à jour les identifiants</translation> </message> <message> <source>Only the selected database has to be connected with a client.</source> @@ -288,61 +317,61 @@ Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> <message> <source>Searc&h in all opened databases for matching credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Cherc&her dans toutes les bases de données ouvertes les identifiants qui correspondent</translation> </message> <message> <source>Automatically creating or updating string fields is not supported.</source> - <translation>La création ou la mise a jour automatique ne sont pas pris en charge pour les champs de chaines de caractères !</translation> + <translation>La création ou la mise a jour automatique ne sont pas pris en charge pour les champs de chaînes de caractères !</translation> </message> <message> <source>&Return advanced string fields which start with "KPH: "</source> - <translation>& Retourne les champs avancés de type chaîne qui commencent par "KPH :"</translation> + <translation>& Retourne les champs avancés de chaîne de caractères qui commencent par "KPH :"</translation> </message> <message> <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> - <translation type="unfinished"/> + <translation>Mises à jour du chemin du fichier binaire de KeePassXC ou de keepassxc-proxy dans les scripts Native Messaging automatiquement au démarrage.</translation> </message> <message> <source>Update &native messaging manifest files at startup</source> - <translation type="unfinished"/> + <translation>Mise à jour des fichiers manifest &Native Messaging au démarrage</translation> </message> <message> <source>Support a proxy application between KeePassXC and browser extension.</source> - <translation type="unfinished"/> + <translation>Supporter une application proxy entre KeePassXC et l'extension pour navigateur web.</translation> </message> <message> <source>Use a &proxy application between KeePassXC and browser extension</source> - <translation type="unfinished"/> + <translation>Utiliser une &application proxy entre KeePassXC et l'extension pour navigateur web</translation> </message> <message> <source>Use a custom proxy location if you installed a proxy manually.</source> - <translation type="unfinished"/> + <translation>Utiliser un proxy personnalisé si vous avez installé un proxy manuellement.</translation> </message> <message> <source>Use a &custom proxy location</source> <comment>Meant is the proxy for KeePassXC-Browser</comment> - <translation type="unfinished"/> + <translation>Utiliser un proxy &personnalisé</translation> </message> <message> <source>Browse...</source> <extracomment>Button for opening file dialog</extracomment> - <translation>Explorer...</translation> + <translation>Parcourir...</translation> </message> <message> <source><b>Warning:</b> The following options can be dangerous!</source> - <translation type="unfinished"/> + <translation><b>Avertissement :</b> Les options suivantes peuvent être dangereuses!</translation> </message> <message> <source>Executable Files (*.exe);;All Files (*.*)</source> - <translation type="unfinished"/> + <translation>Fichiers exécutables (*.exe);;Tous les fichiers (*.*)</translation> </message> <message> <source>Executable Files (*)</source> - <translation type="unfinished"/> + <translation>Fichiers exécutables (*)</translation> </message> <message> <source>Select custom proxy location</source> - <translation>Configurer manuellement un proxy</translation> + <translation>Sélectionner un proxy personnalisé</translation> </message> </context> <context> @@ -356,11 +385,14 @@ Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> If you would like to allow it access to your KeePassXC database, give it a unique name to identify and accept it.</source> - <translation type="unfinished"/> + <translation>Vous avez reçu une demande d'association pour la clé ci-dessus. + +Si vous voulez autoriser cette clé à accéder à votre base de données KeePassXC, +attribuez lui un nom unique pour l'identifier et acceptez la.</translation> </message> <message> <source>Save and allow access</source> - <translation type="unfinished"/> + <translation>Enregistrer et autoriser l'accès</translation> </message> <message> <source>KeePassXC: Overwrite existing key?</source> @@ -369,7 +401,8 @@ give it a unique name to identify and accept it.</source> <message> <source>A shared encryption key with the name "%1" already exists. Do you want to overwrite it?</source> - <translation type="unfinished"/> + <translation>Une clé de chiffrement partagée avec le nom "%1" existe déjà. +Voulez-vous l'écraser ?</translation> </message> <message> <source>KeePassXC: Update Entry</source> @@ -391,11 +424,11 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message> <source>KeePassXC: Settings not available!</source> - <translation>KeePassXC: Paramètre indisponible !</translation> + <translation>KeePassXC : Paramètres indisponibles !</translation> </message> <message> <source>The active database does not contain a settings entry.</source> - <translation type="unfinished"/> + <translation>La base de données actuelle ne contient pas d'entrée paramètre.</translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -403,7 +436,7 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message> <source>No shared encryption keys found in KeePassXC Settings.</source> - <translation type="unfinished"/> + <translation>Aucune clé de chiffrement trouvée dans les paramètres de KeePassXC.</translation> </message> <message> <source>KeePassXC: Removed keys from database</source> @@ -411,7 +444,7 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message numerus="yes"> <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Cette clé de chiffrement a été retirée avec succès des paramètres de KeepassXC.</numerusform><numerusform>%n clés de chiffrement on été retirées avec succès des paramètres de KeePassXC.</numerusform></translation> </message> <message> <source>Removing stored permissions…</source> @@ -427,7 +460,7 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message numerus="yes"> <source>Successfully removed permissions from %n entry(s).</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Les permissions de cette entrée ont été retirées avec succès.</numerusform><numerusform>Les permissions de %n entrées ont été retirées avec succès.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -454,11 +487,11 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message> <source>&Key file</source> - <translation>Fichier-clé</translation> + <translation>Fichier clé</translation> </message> <message> <source>Browse</source> - <translation>Naviguer</translation> + <translation>Parcourir</translation> </message> <message> <source>Create</source> @@ -474,7 +507,7 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message> <source>Key files</source> - <translation>Fichiers-clés</translation> + <translation>Fichiers clés</translation> </message> <message> <source>All files</source> @@ -482,15 +515,15 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message> <source>Create Key File...</source> - <translation>Créer un fichier-clé...</translation> + <translation>Créer un fichier clé...</translation> </message> <message> <source>Unable to create Key File : </source> - <translation>Impossible de créer un fichier-clé :</translation> + <translation>Impossible de créer un fichier clé :</translation> </message> <message> <source>Select a key file</source> - <translation>Choisir un fichier-clé</translation> + <translation>Choisir un fichier clé</translation> </message> <message> <source>Empty password</source> @@ -498,7 +531,7 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message> <source>Do you really want to use an empty string as password?</source> - <translation>Voulez-vous vraiment utiliser une chaîne vide comme mot de passe ?</translation> + <translation>Voulez-vous vraiment utiliser une chaîne de caractères vide comme mot de passe ?</translation> </message> <message> <source>Different passwords supplied.</source> @@ -507,23 +540,26 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui <message> <source>Failed to set %1 as the Key file: %2</source> - <translation>Impossible de définir %1 comme fichier-clé : + <translation>Impossible de définir %1 comme fichier clé : %2</translation> </message> <message> <source>Legacy key file format</source> - <translation type="unfinished"/> + <translation>Format de fichier clé hérité</translation> </message> <message> <source>You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>Vous utilisez un format de fichier clé hérité +qui peut ne plus être pris en charge à l’avenir. + +Veuillez envisager de générer un nouveau fichier clé.</translation> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> - <translation>Échec du changement de clé maître: pas de YubiKey insérée.</translation> + <translation>Échec du changement de clé maître : pas de YubiKey insérée.</translation> </message> </context> <context> @@ -549,7 +585,7 @@ Please consider generating a new key file.</source> <name>CsvImportWidget</name> <message> <source>Import CSV fields</source> - <translation>Importer les champs CSV</translation> + <translation>Importer les champs du CSV</translation> </message> <message> <source>filename</source> @@ -585,7 +621,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Number of headers line to discard</source> - <translation>Nombre de lignes d'en-tête à ignorer</translation> + <translation>Nombre de lignes d'en-têtes à ignorer</translation> </message> <message> <source>Consider '\' an escape character</source> @@ -613,7 +649,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Imported from CSV file</source> - <translation>Importé du fichier CSV</translation> + <translation>Importé depuis un fichier CSV</translation> </message> <message> <source>Original data: </source> @@ -621,7 +657,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Error(s) detected in CSV file !</source> - <translation>Erreur(s) détectées dans le fichier CSV!</translation> + <translation>Erreur(s) détectée(s) dans le fichier CSV!</translation> </message> <message> <source> more messages skipped]</source> @@ -634,7 +670,7 @@ Please consider generating a new key file.</source> <message> <source>CSV import: writer has errors: </source> - <translation>Import CSV: erreurs d'écriture: + <translation>Importation du CSV : erreurs d'écriture: </translation> </message> </context> @@ -653,15 +689,15 @@ Please consider generating a new key file.</source> <name>CsvParserModel</name> <message numerus="yes"> <source>%n byte(s), </source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n octet(s)</numerusform><numerusform>%n octet(s)</numerusform></translation> </message> <message numerus="yes"> <source>%n row(s), </source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n Row (s), </numerusform><numerusform>%n ligne(s), </numerusform></translation> </message> <message numerus="yes"> <source>%n column(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n colonne</numerusform><numerusform>%n colonne(s)</numerusform></translation> </message> </context> <context> @@ -672,7 +708,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Key File:</source> - <translation>Fichier-clé :</translation> + <translation>Fichier clé :</translation> </message> <message> <source>Password:</source> @@ -680,7 +716,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Browse</source> - <translation>Naviguer</translation> + <translation>Parcourir</translation> </message> <message> <source>Refresh</source> @@ -696,22 +732,25 @@ Please consider generating a new key file.</source> </message> <message> <source>Can't open key file</source> - <translation>Impossible d'ouvrir le fichier-clé</translation> + <translation>Impossible d'ouvrir le fichier clé</translation> </message> <message> <source>Legacy key file format</source> - <translation type="unfinished"/> + <translation>Format de fichier clé hérité</translation> </message> <message> <source>You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>Vous utilisez un format de fichier clé hérité +qui peut ne plus être pris en charge à l’avenir. + +Veuillez envisager de générer un nouveau fichier clé.</translation> </message> <message> <source>Don't show this warning again</source> - <translation type="unfinished"/> + <translation>Ne plus afficher cette avertissement</translation> </message> <message> <source>All files</source> @@ -719,11 +758,11 @@ Please consider generating a new key file.</source> </message> <message> <source>Key files</source> - <translation>Fichiers-clés</translation> + <translation>Fichiers clés</translation> </message> <message> <source>Select key file</source> - <translation>Choisissez un fichier-clé</translation> + <translation>Choisissez un fichier clé</translation> </message> </context> <context> @@ -738,7 +777,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Can't open key file</source> - <translation>Impossible d'ouvrir le fichier-clé</translation> + <translation>Impossible d'ouvrir le fichier clé</translation> </message> <message> <source>Unable to open the database.</source> @@ -776,17 +815,19 @@ Vous pouvez maintenant la sauvegarder.</translation> <message> <source>Number of rounds too high</source> <comment>Key transformation rounds</comment> - <translation type="unfinished"/> + <translation>Nombre de tours trop élevé</translation> </message> <message> <source>You are using a very high number of key transform rounds with Argon2. If you keep this number, your database may take hours or days (or even longer) to open!</source> - <translation type="unfinished"/> + <translation>Vous utilisez un très grand nombre de tours de transformation de clé avec Argon2. + +Si vous conservez ce nombre, votre base de données peut prendre des heures voire des jours (ou plus) à s'ouvrir!</translation> </message> <message> <source>Understood, keep number</source> - <translation type="unfinished"/> + <translation>Compris, conserver ce nombre</translation> </message> <message> <source>Cancel</source> @@ -795,32 +836,44 @@ If you keep this number, your database may take hours or days (or even longer) t <message> <source>Number of rounds too low</source> <comment>Key transformation rounds</comment> - <translation type="unfinished"/> + <translation>Nombre de tours trop faible</translation> </message> <message> <source>You are using a very low number of key transform rounds with AES-KDF. If you keep this number, your database may be too easy to crack!</source> - <translation type="unfinished"/> + <translation>Vous utilisez un très faible nombre de tours de transformation de clé avec AES-KDF. + +Si vous conservez ce nombre, la sécurité de votre base de données peut être trop facilement cassée !</translation> </message> <message> <source>KDF unchanged</source> - <translation type="unfinished"/> + <translation>KDF inchangé</translation> </message> <message> <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> - <translation type="unfinished"/> + <translation>Échec de la transformation de la clé avec les nouveaux paramètres KDF; KDF inchangé.</translation> + </message> + <message numerus="yes"> + <source> MiB</source> + <comment>Abbreviation for Mebibytes (KDF settings)</comment> + <translation><numerusform> MiB</numerusform><numerusform> MiB</numerusform></translation> + </message> + <message numerus="yes"> + <source> thread(s)</source> + <comment>Threads for parallel execution (KDF settings)</comment> + <translation><numerusform> fil(s) d'exécution</numerusform><numerusform>fil(s) d'exécution</numerusform></translation> </message> </context> <context> <name>DatabaseSettingsWidgetEncryption</name> <message> <source>Encryption Algorithm:</source> - <translation>Algorithme de chiffrement:</translation> + <translation>Algorithme de chiffrement :</translation> </message> <message> <source>AES: 256 Bit (default)</source> - <translation>AES : 256 Bits (par défaut)</translation> + <translation>AES : 256 bits (par défaut)</translation> </message> <message> <source>Twofish: 256 Bit</source> @@ -828,31 +881,23 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Key Derivation Function:</source> - <translation type="unfinished"/> + <translation>Fonction de dérivation de clé (KDF) :</translation> </message> <message> <source>Transform rounds:</source> - <translation>Passes de transformation :</translation> + <translation>Tours de transformation :</translation> </message> <message> <source>Benchmark 1-second delay</source> - <translation type="unfinished"/> + <translation>Benchmark avec 1 seconde de délai</translation> </message> <message> <source>Memory Usage:</source> - <translation>Utilisation mémoire:</translation> - </message> - <message> - <source> MB</source> - <translation>Mo</translation> + <translation>Utilisation mémoire :</translation> </message> <message> <source>Parallelism:</source> - <translation type="unfinished"/> - </message> - <message> - <source> thread</source> - <translation type="unfinished"/> + <translation>Parallélisme :</translation> </message> </context> <context> @@ -893,6 +938,14 @@ If you keep this number, your database may be too easy to crack!</source> <source>Use recycle bin</source> <translation>Utiliser la corbeille</translation> </message> + <message> + <source>Additional Database Settings</source> + <translation>Paramètres de base de données supplémentaires</translation> + </message> + <message> + <source>Enable &compression (recommended)</source> + <translation>Activers la &compression (recommandé)</translation> + </message> </context> <context> <name>DatabaseTabWidget</name> @@ -903,7 +956,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>KeePass 2 Database</source> - <translation>Base de données Keepass 2</translation> + <translation>Base de données KeePass 2</translation> </message> <message> <source>All files</source> @@ -947,7 +1000,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>KeePass 1 database</source> - <translation>Base de données Keepass 1</translation> + <translation>Base de données KeePass 1</translation> </message> <message> <source>Close?</source> @@ -979,7 +1032,7 @@ Enregistrer les modifications ?</translation> </message> <message> <source>Save database as</source> - <translation>Enregistrer comme nouvelle base de données</translation> + <translation>Enregistrer la base de données sous</translation> </message> <message> <source>Export database to CSV file</source> @@ -1015,6 +1068,16 @@ Otherwise your changes are lost.</source> Voulez-vous l'enregistrer avant de la verrouiller ? Autrement, vos modifications seront perdues.</translation> </message> + <message> + <source>Disable safe saves?</source> + <translation>Désactiver les sauvegardes sécurisées?</translation> + </message> + <message> + <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</source> + <translation>KeePassXC n’a pas réussi à enregistrer la base de données plusieurs fois. Cela est probablement causé par les services de synchronisation de fichiers qui maintiennent un verrou sur le fichier sauvegardé. +Désactiver les sauvegardes sécurisées et essayer à nouveau?</translation> + </message> </context> <context> <name>DatabaseWidget</name> @@ -1052,11 +1115,11 @@ Autrement, vos modifications seront perdues.</translation> </message> <message> <source>Move entries to recycle bin?</source> - <translation>Déplacer les entrées vers la corbeille ?</translation> + <translation>Déplacer les entrées dans la corbeille ?</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Voulez-vous vraiment déplacer %n entrée vers la corbeille ?</numerusform><numerusform>Voulez-vous vraiment déplacer %n entrées dans la corbeille?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1100,7 +1163,7 @@ Autrement, vos modifications seront perdues.</translation> </message> <message> <source>File has changed</source> - <translation type="unfinished"/> + <translation>Le fichier a changé</translation> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -1113,7 +1176,8 @@ Autrement, vos modifications seront perdues.</translation> <message> <source>The database file has changed and you have unsaved changes. Do you want to merge your changes?</source> - <translation type="unfinished"/> + <translation>Le fichier de la base de données a été modifié et les changements que vous avez effectué n'ont pas été enregistrés. +Voulez-vous fusionner vos modifications ?</translation> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -1125,14 +1189,18 @@ Do you want to merge your changes?</source> </message> <message> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> - <translation>Êtes-vous certain de vouloir vider définitivement votre corbeille?</translation> + <translation>Êtes-vous certain de vouloir vider définitivement la corbeille?</translation> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> </message> </context> <context> <name>DetailsWidget</name> <message> <source>Generate TOTP Token</source> - <translation type="unfinished"/> + <translation>Générer un code TOTP</translation> </message> <message> <source>Close</source> @@ -1152,7 +1220,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Expiration</source> - <translation type="unfinished"/> + <translation>Expiration</translation> </message> <message> <source>Username</source> @@ -1160,7 +1228,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Autotype</source> - <translation type="unfinished"/> + <translation>Saisie automatique</translation> </message> <message> <source>Searching</source> @@ -1168,11 +1236,11 @@ Do you want to merge your changes?</source> </message> <message> <source>Attributes</source> - <translation type="unfinished"/> + <translation>Attributs</translation> </message> <message> <source>Attachments</source> - <translation>Affichage</translation> + <translation>Fichiers attachés</translation> </message> <message> <source>Notes</source> @@ -1188,7 +1256,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Search</source> - <translation>Chercher</translation> + <translation>Recherche</translation> </message> <message> <source>Clear</source> @@ -1196,19 +1264,19 @@ Do you want to merge your changes?</source> </message> <message> <source>Never</source> - <translation type="unfinished"/> + <translation>Jamais</translation> </message> <message> <source>[PROTECTED]</source> - <translation type="unfinished"/> + <translation>[PROTÉGER]</translation> </message> <message> <source>Disabled</source> - <translation type="unfinished"/> + <translation>Désactivé</translation> </message> <message> <source>Enabled</source> - <translation type="unfinished"/> + <translation>Activé</translation> </message> </context> <context> @@ -1227,7 +1295,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Auto-Type</source> - <translation>Saisie-Automatique</translation> + <translation>Saisie automatique</translation> </message> <message> <source>Properties</source> @@ -1239,7 +1307,7 @@ Do you want to merge your changes?</source> </message> <message> <source>SSH Agent</source> - <translation>SSH Agent</translation> + <translation>Agent SSH</translation> </message> <message> <source>n/a</source> @@ -1259,7 +1327,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Failed to open private key</source> - <translation type="unfinished"/> + <translation>Échec d'ouverture de la clé privée</translation> </message> <message> <source>Entry history</source> @@ -1283,7 +1351,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Confirm Remove</source> - <translation>Confirmez la suppression</translation> + <translation>Confirmer la suppression</translation> </message> <message> <source>Are you sure you want to remove this attribute?</source> @@ -1291,11 +1359,11 @@ Do you want to merge your changes?</source> </message> <message> <source>[PROTECTED]</source> - <translation type="unfinished"/> + <translation>[PROTÉGÉ]</translation> </message> <message> <source>Press reveal to view or edit</source> - <translation type="unfinished"/> + <translation>Appuyez sur Révéler pour voir ou éditer</translation> </message> <message> <source>Tomorrow</source> @@ -1303,16 +1371,28 @@ Do you want to merge your changes?</source> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n semaine(s)</numerusform><numerusform>%n semaine(s)</numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n mois</numerusform><numerusform>%n mois</numerusform></translation> </message> <message> <source>1 year</source> <translation>1 an</translation> </message> + <message> + <source>Apply generated password?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to apply the generated password to this entry?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAdvanced</name> @@ -1342,22 +1422,30 @@ Do you want to merge your changes?</source> </message> <message> <source>Attachments</source> - <translation>Affichage</translation> + <translation>Fichiers attachés</translation> + </message> + <message> + <source>Foreground Color:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Background Color:</source> + <translation type="unfinished"/> </message> </context> <context> <name>EditEntryWidgetAutoType</name> <message> <source>Enable Auto-Type for this entry</source> - <translation>Activer le remplissage automatique pour cette entrée</translation> + <translation>Activer la saisie automatique pour cette entrée</translation> </message> <message> <source>Inherit default Auto-Type sequence from the &group</source> - <translation>Utiliser la séquence de remplissage automatique par défaut du groupe</translation> + <translation>Utiliser la séquence par défaut de saisie automatique du &groupe</translation> </message> <message> <source>&Use custom Auto-Type sequence:</source> - <translation>Utiliser une séquence de remplissage automatique personnalisée :</translation> + <translation>&Utiliser une séquence personnalisée de saisie automatique :</translation> </message> <message> <source>Window Associations</source> @@ -1376,12 +1464,8 @@ Do you want to merge your changes?</source> <translation>Titre de la fenêtre :</translation> </message> <message> - <source>Use default se&quence</source> - <translation>Utiliser la séquence par défaut</translation> - </message> - <message> - <source>Set custo&m sequence:</source> - <translation>Définir une séquence personnalisée :</translation> + <source>Use a specific sequence for this association:</source> + <translation>Utilisez une séquence spécifique pour cette association :</translation> </message> </context> <context> @@ -1431,7 +1515,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Toggle the checkbox to reveal the notes section.</source> - <translation type="unfinished"/> + <translation>Cochez la case pour afficher la section des notes.</translation> </message> <message> <source>Username:</source> @@ -1450,7 +1534,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Remove key from agent after</source> - <translation type="unfinished"/> + <translation>Retirer la clé de l'agent après</translation> </message> <message> <source> seconds</source> @@ -1458,11 +1542,11 @@ Do you want to merge your changes?</source> </message> <message> <source>Fingerprint</source> - <translation type="unfinished"/> + <translation>Empreinte</translation> </message> <message> <source>Remove key from agent when database is closed/locked</source> - <translation type="unfinished"/> + <translation>Retirer la clé de l’agent lorsque la base de données est fermée/verrouillée</translation> </message> <message> <source>Public key</source> @@ -1470,7 +1554,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Add key to agent when database is opened/unlocked</source> - <translation type="unfinished"/> + <translation>Ajoutez la clé à l’agent lorsque la base de données est ouverte/déverrouillée</translation> </message> <message> <source>Comment</source> @@ -1494,16 +1578,16 @@ Do you want to merge your changes?</source> </message> <message> <source>External file</source> - <translation type="unfinished"/> + <translation>Fichier externe</translation> </message> <message> <source>Browse...</source> <extracomment>Button for opening file dialog</extracomment> - <translation>Explorer...</translation> + <translation>Parcourir...</translation> </message> <message> <source>Attachment</source> - <translation type="unfinished"/> + <translation>Fichier attaché</translation> </message> <message> <source>Add to agent</source> @@ -1515,7 +1599,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Require user confirmation when this key is used</source> - <translation type="unfinished"/> + <translation>Requiert une confirmation de l'utilisateur quand cette clé est utilisée</translation> </message> </context> <context> @@ -1569,19 +1653,19 @@ Do you want to merge your changes?</source> </message> <message> <source>Search</source> - <translation>Chercher</translation> + <translation>Recherche</translation> </message> <message> <source>Auto-Type</source> - <translation>Saisie-Automatique</translation> + <translation>Saisie automatique</translation> </message> <message> <source>&Use default Auto-Type sequence of parent group</source> - <translation>&Utiliser la séquence de Saisie-Automatique du groupe parent</translation> + <translation>&Utiliser la séquence par défaut de saisie automatique du groupe parent</translation> </message> <message> <source>Set default Auto-Type se&quence</source> - <translation>Définir la sé&quence par défaut de la Saisie-Automatique</translation> + <translation>Définir la sé&quence par défaut de la saisie automatique</translation> </message> </context> <context> @@ -1612,7 +1696,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation>Astuce : Vous pouvez activer Google en tant que repli sous Outils>Paramètres>Sécurité</translation> + <translation>Astuce : Vous pouvez activer Google en second recours sous Outils>Paramètres>Sécurité</translation> </message> <message> <source>Images</source> @@ -1661,13 +1745,38 @@ Do you want to merge your changes?</source> <source>Uuid:</source> <translation>Uuid :</translation> </message> + <message> + <source>Plugin Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove</source> + <translation>Supprimer</translation> + </message> + <message> + <source>Delete plugin data?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Value</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Entry</name> <message> <source> - Clone</source> <comment>Suffix added to cloned entries</comment> - <translation> - Cloner</translation> + <translation> - Clone</translation> </message> </context> <context> @@ -1705,52 +1814,57 @@ Do you want to merge your changes?</source> </message> <message> <source>Select files</source> - <translation type="unfinished"/> + <translation>Sélectionner fichier(s)</translation> </message> <message numerus="yes"> <source>Are you sure you want to remove %n attachment(s)?</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Êtes-vous sûr de vouloir supprimer ce fichier attaché?</numerusform><numerusform>Êtes-vous sûr de vouloir supprimer ces %n fichiers attachés?</numerusform></translation> </message> <message> <source>Confirm Remove</source> - <translation>Confirmez la suppression</translation> + <translation>Confirmer la suppression</translation> </message> <message> <source>Save attachments</source> - <translation type="unfinished"/> + <translation>Enregistrer les fichiers attachés</translation> </message> <message> <source>Unable to create directory: %1</source> - <translation type="unfinished"/> + <translation>Impossible de créer le répertoire : +%1</translation> </message> <message> <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> - <translation type="unfinished"/> + <translation>Êtes-vous sûr de vouloir écraser le fichier "%1" par ce fichier attaché?</translation> </message> <message> <source>Confirm overwrite</source> - <translation type="unfinished"/> + <translation>Confirmer l'écrasement</translation> </message> <message> <source>Unable to save attachments: %1</source> - <translation type="unfinished"/> + <translation>Impossible d'enregistrer les fichiers attachés : +%1</translation> </message> <message> <source>Unable to open attachment: %1</source> - <translation type="unfinished"/> + <translation>Impossible d'ouvrir le fichier attaché : +%1</translation> </message> <message> <source>Unable to open attachments: %1</source> - <translation type="unfinished"/> + <translation>Impossible d'ouvrir les fichiers attachés : +%1</translation> </message> <message> <source>Unable to open files: %1</source> - <translation type="unfinished"/> + <translation>Impossible d'ouvrir le fichier : +%1</translation> </message> </context> <context> @@ -1802,6 +1916,65 @@ Do you want to merge your changes?</source> <source>URL</source> <translation>URL</translation> </message> + <message> + <source>Never</source> + <translation>Jamais</translation> + </message> + <message> + <source>Password</source> + <translation>Mot de passe</translation> + </message> + <message> + <source>Notes</source> + <translation>Notes</translation> + </message> + <message> + <source>Expires</source> + <translation>Expiration</translation> + </message> + <message> + <source>Created</source> + <translation>Créée</translation> + </message> + <message> + <source>Modified</source> + <translation>Modifié</translation> + </message> + <message> + <source>Accessed</source> + <translation>Consulté</translation> + </message> + <message> + <source>Attachments</source> + <translation>Fichiers attachés</translation> + </message> +</context> +<context> + <name>EntryView</name> + <message> + <source>Customize View</source> + <translation>Personnaliser l’affichage</translation> + </message> + <message> + <source>Hide Usernames</source> + <translation>Masquer les noms d’utilisateur</translation> + </message> + <message> + <source>Hide Passwords</source> + <translation>Masquer les mots de passe</translation> + </message> + <message> + <source>Fit to window</source> + <translation>Ajuster à la fenêtre</translation> + </message> + <message> + <source>Fit to contents</source> + <translation>Ajuster au contenu</translation> + </message> + <message> + <source>Reset to defaults</source> + <translation>Réinitialiser aux valeurs par défaut</translation> + </message> </context> <context> <name>Group</name> @@ -1814,18 +1987,18 @@ Do you want to merge your changes?</source> <name>HostInstaller</name> <message> <source>KeePassXC: Cannot save file!</source> - <translation type="unfinished"/> + <translation>KeePassXC : Impossible d'enregistrer le fichier!</translation> </message> <message> <source>Cannot save the native messaging script file.</source> - <translation type="unfinished"/> + <translation>Impossible de sauvegarder le fichier du script Native Messaging.</translation> </message> </context> <context> <name>HttpPasswordGeneratorWidget</name> <message> <source>Length:</source> - <translation>Longueur:</translation> + <translation>Longueur :</translation> </message> <message> <source>Character Types</source> @@ -1871,6 +2044,10 @@ Do you want to merge your changes?</source> <source>Ensure that the password contains characters from every group</source> <translation>S'assurer que le mot de passe contienne des caractères de chaque groupe</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>ASCII étendu</translation> + </message> </context> <context> <name>KMessageWidget</name> @@ -1913,7 +2090,7 @@ Do you want to merge your changes?</source> <name>Kdbx4Reader</name> <message> <source>missing database headers</source> - <translation type="unfinished"/> + <translation>En-têtes manquants de la base de donnée</translation> </message> <message> <source>Unable to calculate master key</source> @@ -1921,15 +2098,15 @@ Do you want to merge your changes?</source> </message> <message> <source>Invalid header checksum size</source> - <translation type="unfinished"/> + <translation>Taille de la somme de contrôle de l'en-tête non valide</translation> </message> <message> <source>Header SHA256 mismatch</source> - <translation type="unfinished"/> + <translation>SHA256 de l'en-tête ne correspond pas</translation> </message> <message> <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> - <translation type="unfinished"/> + <translation>Mauvaise clé ou fichier de base de données corrompu. (HMAC ne correspond pas)</translation> </message> <message> <source>Unknown cipher</source> @@ -1937,111 +2114,111 @@ Do you want to merge your changes?</source> </message> <message> <source>Invalid header id size</source> - <translation type="unfinished"/> + <translation>Taille de l'id de l'en-tête non valide</translation> </message> <message> <source>Invalid header field length</source> - <translation type="unfinished"/> + <translation>Longueur du champ de l’en-tête non valide</translation> </message> <message> <source>Invalid header data length</source> - <translation type="unfinished"/> + <translation>Longueur des données de l'en-tête non valide</translation> </message> <message> <source>Failed to open buffer for KDF parameters in header</source> - <translation type="unfinished"/> + <translation>Échec d'ouverture d'une mémoire tampon pour les paramètres KDF dans l'en-tête</translation> </message> <message> <source>Unsupported key derivation function (KDF) or invalid parameters</source> - <translation type="unfinished"/> + <translation>Fonction de dérivation de clé (KDF) non supporté ou paramètres non valides</translation> </message> <message> <source>Legacy header fields found in KDBX4 file.</source> - <translation type="unfinished"/> + <translation>Champs d’en-tête hérités du fichier KDBX4.</translation> </message> <message> <source>Invalid inner header id size</source> - <translation type="unfinished"/> + <translation>Taille de l'id de l'en-tête interne non valide</translation> </message> <message> <source>Invalid inner header field length</source> - <translation type="unfinished"/> + <translation>Longueur du champ de l'en-tête interne non valide</translation> </message> <message> <source>Invalid inner header binary size</source> - <translation type="unfinished"/> + <translation>Taille binaire de l'en-tête interne non valide</translation> </message> <message> <source>Unsupported KeePass variant map version.</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Version de table des variantes non supportée.</translation> </message> <message> <source>Invalid variant map entry name length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Longueur du nom de la table des variantes non valide.</translation> </message> <message> <source>Invalid variant map entry name data</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Contenu du nom de la table des variantes non valide.</translation> </message> <message> <source>Invalid variant map entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Longueur de l'entrée dans la table des variantes non valide.</translation> </message> <message> <source>Invalid variant map entry value data</source> <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Contenu de l'entrée dans la table des variantes non valide.</translation> </message> <message> <source>Invalid variant map Bool entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Longueur de l'entrée de type Booléen dans la table des variantes non valide.</translation> </message> <message> <source>Invalid variant map Int32 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Longueur de l'entrée de type Int32 dans la table des variantes non valide.</translation> </message> <message> <source>Invalid variant map UInt32 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Longueur de l'entrée de type UInt32 dans la table des variantes non valide.</translation> </message> <message> <source>Invalid variant map Int64 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Longueur de l'entrée de type Int64 dans la table des variantes non valide.</translation> </message> <message> <source>Invalid variant map UInt64 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Longueur de l'entrée de type UInt64 dans la table des variantes non valide.</translation> </message> <message> <source>Invalid variant map entry type</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Longueur de l'entrée dans la table des variantes non valide.</translation> </message> <message> <source>Invalid variant map field type size</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Longueur du type de champ dans la table des variantes non valide.</translation> </message> </context> <context> <name>Kdbx4Writer</name> <message> <source>Invalid symmetric cipher algorithm.</source> - <translation type="unfinished"/> + <translation>Algorithme de chiffrement symétrique non valide.</translation> </message> <message> <source>Invalid symmetric cipher IV size.</source> <comment>IV = Initialization Vector for symmetric cipher</comment> - <translation type="unfinished"/> + <translation>Taille du vecteur d'initialisation du chiffrement symétrique non valide.</translation> </message> <message> <source>Unable to calculate master key</source> @@ -2050,50 +2227,50 @@ Do you want to merge your changes?</source> <message> <source>Failed to serialize KDF parameters variant map</source> <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Échec de sérialisation des paramètres KDF de la table de variantes.</translation> </message> </context> <context> <name>KdbxReader</name> <message> <source>Invalid cipher uuid length</source> - <translation type="unfinished"/> + <translation>Longueur de l'uuid du chiffrement non valide</translation> </message> <message> <source>Unsupported cipher</source> - <translation type="unfinished"/> + <translation>Chiffrement non supporté</translation> </message> <message> <source>Invalid compression flags length</source> - <translation type="unfinished"/> + <translation>Longueur des paramètres de compression non valides.</translation> </message> <message> <source>Unsupported compression algorithm</source> - <translation type="unfinished"/> + <translation>Algorithme de compression non pris en charge</translation> </message> <message> <source>Invalid master seed size</source> - <translation type="unfinished"/> + <translation>Taille de la semence primaire non valide.</translation> </message> <message> <source>Invalid transform seed size</source> - <translation type="unfinished"/> + <translation>Taille de la semence germée non valide.</translation> </message> <message> <source>Invalid transform rounds size</source> - <translation type="unfinished"/> + <translation>Taille des tours de transformation non valide</translation> </message> <message> <source>Invalid start bytes size</source> - <translation type="unfinished"/> + <translation>Taille des octets de début non valide</translation> </message> <message> <source>Invalid random stream id size</source> - <translation type="unfinished"/> + <translation>Taille de l'identifiant du flux aléatoire non valide.</translation> </message> <message> <source>Invalid inner random stream cipher</source> - <translation type="unfinished"/> + <translation>Taille du chiffrement du flux intérieur aléatoire non valide.</translation> </message> <message> <source>Not a KeePass database.</source> @@ -2106,143 +2283,143 @@ You can import it by clicking on Database > 'Import KeePass 1 database...'. This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> <translation>Le fichier sélectionné est une ancienne base de données KeePass 1 (.kdb). -Vous pouvez l'importer en cliquant sur Base de données>'Importer une base de données KeePass 1 ...' +Vous pouvez l'importer en cliquant sur Base de données>'Importer une base de données KeePass 1...' Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir la base de données importée avec l'ancienne version de KeePassX 0.4.</translation> </message> <message> <source>Unsupported KeePass 2 database version.</source> - <translation type="unfinished"/> + <translation>Version de la base de données KeePass 2 non pris en charge.</translation> </message> </context> <context> <name>KdbxXmlReader</name> <message> <source>XML parsing failure: %1</source> - <translation type="unfinished"/> + <translation>Erreur d'analyse XML : %1</translation> </message> <message> <source>No root group</source> - <translation type="unfinished"/> + <translation>Aucun groupe racine</translation> </message> <message> <source>Missing icon uuid or data</source> - <translation type="unfinished"/> + <translation>Données ou uuid de l’icône manquant</translation> </message> <message> <source>Missing custom data key or value</source> - <translation type="unfinished"/> + <translation>Valeur ou clé de donnée personnalisée manquante</translation> </message> <message> <source>Multiple group elements</source> - <translation type="unfinished"/> + <translation>Éléments du groupe multiples</translation> </message> <message> <source>Null group uuid</source> - <translation type="unfinished"/> + <translation>Uuid du groupe sans valeur</translation> </message> <message> <source>Invalid group icon number</source> - <translation type="unfinished"/> + <translation>Numéro de l'icône du groupe non valide</translation> </message> <message> <source>Invalid EnableAutoType value</source> - <translation type="unfinished"/> + <translation>Valeur EnableAutoType non valide</translation> </message> <message> <source>Invalid EnableSearching value</source> - <translation type="unfinished"/> + <translation>Valeur de EnableSearching non valide</translation> </message> <message> <source>No group uuid found</source> - <translation type="unfinished"/> + <translation>Aucun uuid de groupe trouvé</translation> </message> <message> <source>Null DeleteObject uuid</source> - <translation type="unfinished"/> + <translation>Uuid de DeleteObject sans valeur</translation> </message> <message> <source>Missing DeletedObject uuid or time</source> - <translation type="unfinished"/> + <translation>Temps ou uuid de DeletedObject manquant</translation> </message> <message> <source>Null entry uuid</source> - <translation type="unfinished"/> + <translation>Uuid de l'entrée sans valeur</translation> </message> <message> <source>Invalid entry icon number</source> - <translation type="unfinished"/> + <translation>Numéro de l'icône de l'entrée non valide</translation> </message> <message> <source>History element in history entry</source> - <translation type="unfinished"/> + <translation>Élément de l’historique de l’entrée de l’historique</translation> </message> <message> <source>No entry uuid found</source> - <translation type="unfinished"/> + <translation>Aucun uuid d'entrée trouvé</translation> </message> <message> <source>History element with different uuid</source> - <translation type="unfinished"/> + <translation>Élément de l’historique avec un uuid différent</translation> </message> <message> <source>Unable to decrypt entry string</source> - <translation type="unfinished"/> + <translation>Impossible de déchiffrer la chaîne de caractères de l'entrée</translation> </message> <message> <source>Duplicate custom attribute found</source> - <translation type="unfinished"/> + <translation>Dupliquer l'attribut personnalisé trouvé</translation> </message> <message> <source>Entry string key or value missing</source> - <translation type="unfinished"/> + <translation>Valeur ou clé de la chaîne de caractères de l'entrée manquante</translation> </message> <message> <source>Duplicate attachment found</source> - <translation type="unfinished"/> + <translation>Dupliquer le fichier attaché trouvé</translation> </message> <message> <source>Entry binary key or value missing</source> - <translation type="unfinished"/> + <translation>Valeur ou clé du binaire de l'entrée manquante</translation> </message> <message> <source>Auto-type association window or sequence missing</source> - <translation type="unfinished"/> + <translation>Fenêtre ou séquence d’association de saisie automatique manquante</translation> </message> <message> <source>Invalid bool value</source> - <translation type="unfinished"/> + <translation>Valeur bool non valide</translation> </message> <message> <source>Invalid date time value</source> - <translation type="unfinished"/> + <translation>Valeur date time non valide</translation> </message> <message> <source>Invalid color value</source> - <translation type="unfinished"/> + <translation>Valeur de couleur non valide</translation> </message> <message> <source>Invalid color rgb part</source> - <translation type="unfinished"/> + <translation>Partie de couleur RVB non valide</translation> </message> <message> <source>Invalid number value</source> - <translation type="unfinished"/> + <translation>Valeur de nombre non valide</translation> </message> <message> <source>Invalid uuid value</source> - <translation type="unfinished"/> + <translation>Valeur uuid non valide</translation> </message> <message> <source>Unable to decompress binary</source> <extracomment>Translator meant is a binary data inside an entry</extracomment> - <translation type="unfinished"/> + <translation>Impossible de décompresser le binaire</translation> </message> </context> <context> <name>KeePass1OpenWidget</name> <message> <source>Import KeePass1 database</source> - <translation>Importer une base de données au format KeePass1</translation> + <translation>Importer une base de données au format KeePass 1</translation> </message> <message> <source>Unable to open the database.</source> @@ -2253,7 +2430,7 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l <name>KeePass1Reader</name> <message> <source>Unable to read keyfile.</source> - <translation>Impossible de lire le fichier-clé.</translation> + <translation>Impossible de lire le fichier clé.</translation> </message> <message> <source>Not a KeePass database.</source> @@ -2270,31 +2447,31 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l <message> <source>Unable to read encryption IV</source> <comment>IV = Initialization Vector for symmetric cipher</comment> - <translation type="unfinished"/> + <translation>Impossible de lire le vecteur d'initialisation du chiffrement</translation> </message> <message> <source>Invalid number of groups</source> - <translation type="unfinished"/> + <translation>Nombre de groupes non valide</translation> </message> <message> <source>Invalid number of entries</source> - <translation type="unfinished"/> + <translation>Nombre d’entrées non valide</translation> </message> <message> <source>Invalid content hash size</source> - <translation type="unfinished"/> + <translation>Taille du hachage du contenu non valide</translation> </message> <message> <source>Invalid transform seed size</source> - <translation type="unfinished"/> + <translation>Taille de la semence germée non valide.</translation> </message> <message> <source>Invalid number of transform rounds</source> - <translation type="unfinished"/> + <translation>Nombre de tours de transformation non valide</translation> </message> <message> <source>Unable to construct group tree</source> - <translation type="unfinished"/> + <translation>Impossible de construire l’arborescence du groupe</translation> </message> <message> <source>Root</source> @@ -2310,95 +2487,95 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>Key transformation failed</source> - <translation type="unfinished"/> + <translation>Échec de la transformation de la clé</translation> </message> <message> <source>Invalid group field type number</source> - <translation type="unfinished"/> + <translation>Numéro du type de champ groupe non valide.</translation> </message> <message> <source>Invalid group field size</source> - <translation type="unfinished"/> + <translation>Taille du champ groupe non valide</translation> </message> <message> <source>Read group field data doesn't match size</source> - <translation type="unfinished"/> + <translation>Les données lues dans le champ groupe ne correspondent pas à la taille</translation> </message> <message> <source>Incorrect group id field size</source> - <translation type="unfinished"/> + <translation>Taille du champ "identifiant du groupe" incorrect</translation> </message> <message> <source>Incorrect group creation time field size</source> - <translation type="unfinished"/> + <translation>Taille du champ "date du la création du groupe" incorrect.</translation> </message> <message> <source>Incorrect group modification time field size</source> - <translation type="unfinished"/> + <translation>Taille du champ heure de modification du groupe non correct</translation> </message> <message> <source>Incorrect group access time field size</source> - <translation type="unfinished"/> + <translation>Taille du champ "date d'accès au groupe" incorrect.</translation> </message> <message> <source>Incorrect group expiry time field size</source> - <translation type="unfinished"/> + <translation>Taille du champ "date d'expiration du groupe" incorrect.</translation> </message> <message> <source>Incorrect group icon field size</source> - <translation type="unfinished"/> + <translation>Taille du champ "icône du groupe" incorrect.</translation> </message> <message> <source>Incorrect group level field size</source> - <translation type="unfinished"/> + <translation>Taille du champ du niveau du groupe incorrecte</translation> </message> <message> <source>Invalid group field type</source> - <translation type="unfinished"/> + <translation>Type du champ groupe incorrect.</translation> </message> <message> <source>Missing group id or level</source> - <translation type="unfinished"/> + <translation>Niveau ou id du groupe manquant</translation> </message> <message> <source>Missing entry field type number</source> - <translation type="unfinished"/> + <translation>Type du numéro du champ d'entrée manquante</translation> </message> <message> <source>Invalid entry field size</source> - <translation type="unfinished"/> + <translation>Taille du champ de l'entrée non valide</translation> </message> <message> <source>Read entry field data doesn't match size</source> - <translation type="unfinished"/> + <translation>Les données d'entrée lues ne correspondent pas à la taille.</translation> </message> <message> <source>Invalid entry uuid field size</source> - <translation type="unfinished"/> + <translation>Taille du champ uuid de l'entrée non valide</translation> </message> <message> <source>Invalid entry group id field size</source> - <translation type="unfinished"/> + <translation>Taille du champ id du groupe de l'entrée non valide</translation> </message> <message> <source>Invalid entry icon field size</source> - <translation type="unfinished"/> + <translation>Taille du champ icône de l'entrée non valide</translation> </message> <message> <source>Invalid entry creation time field size</source> - <translation type="unfinished"/> + <translation>Taille du champ date de création de l'entrée non valide</translation> </message> <message> <source>Invalid entry modification time field size</source> - <translation type="unfinished"/> + <translation>Taille du champ date de modification de l'entrée non valide</translation> </message> <message> <source>Invalid entry expiry time field size</source> - <translation type="unfinished"/> + <translation>Taille invalide du champ d'entrée heure d'expiration</translation> </message> <message> <source>Invalid entry field type</source> - <translation type="unfinished"/> + <translation>Champ d'entrée type est invalide</translation> </message> </context> <context> @@ -2409,7 +2586,7 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>The lock file could not be created. Single-instance mode disabled.</source> - <translation>Le fichier verrou ne peut pas être créé. Le mode instance-unique est désactivé.</translation> + <translation>Le fichier de verrouillage ne peut pas être créé. Le mode d'instance unique est désactivé.</translation> </message> <message> <source>Another instance of KeePassXC is already running.</source> @@ -2432,7 +2609,7 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>&Recent databases</source> - <translation>Bases de données récentes</translation> + <translation>&Bases de données récentes</translation> </message> <message> <source>Import</source> @@ -2440,23 +2617,23 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>&Help</source> - <translation>Aide</translation> + <translation>&Aide</translation> </message> <message> <source>E&ntries</source> - <translation>Entrées</translation> + <translation>E&ntrées</translation> </message> <message> <source>Copy att&ribute to clipboard</source> - <translation>Copier l'attribut dans le presse-papier</translation> + <translation>Copier l'att&ribut dans le presse-papier</translation> </message> <message> <source>Time-based one-time password</source> - <translation type="unfinished"/> + <translation>Mot de passe à usage unique basé sur le temps</translation> </message> <message> <source>&Groups</source> - <translation>Groupes</translation> + <translation>&Groupes</translation> </message> <message> <source>&Tools</source> @@ -2476,11 +2653,11 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>&Save database</source> - <translation>Enregistrer la base de données</translation> + <translation>&Enregistrer la base de données</translation> </message> <message> <source>&Close database</source> - <translation>Fermer la base de données</translation> + <translation>&Fermer la base de données</translation> </message> <message> <source>&New database</source> @@ -2488,19 +2665,19 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>Merge from KeePassX database</source> - <translation>Fusionner depuis la base de données KeePassX</translation> + <translation>Fusionner avec la base de données de KeePassX...</translation> </message> <message> <source>&Add new entry</source> - <translation>Ajouter une nouvelle entrée</translation> + <translation>&Ajouter une nouvelle entrée</translation> </message> <message> <source>&View/Edit entry</source> - <translation>Voir/Editer l'entrée</translation> + <translation>&Voir/Éditer l'entrée</translation> </message> <message> <source>&Delete entry</source> - <translation>Supprimer l'entrée</translation> + <translation>&Supprimer l'entrée</translation> </message> <message> <source>&Add new group</source> @@ -2516,7 +2693,7 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>Sa&ve database as...</source> - <translation>Sau&ver la base de données sous...</translation> + <translation>En&registrer la base de données sous...</translation> </message> <message> <source>Change &master key...</source> @@ -2524,7 +2701,7 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>&Database settings</source> - <translation>Paramètre de la base de &données</translation> + <translation>&Paramètres de la base de données</translation> </message> <message> <source>Database settings</source> @@ -2532,7 +2709,7 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>&Clone entry</source> - <translation>Cloner l'entrée</translation> + <translation>&Cloner l'entrée</translation> </message> <message> <source>&Find</source> @@ -2548,7 +2725,7 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>Cop&y password</source> - <translation>Copier le mot de passe</translation> + <translation>Cop&ier le mot de passe</translation> </message> <message> <source>Copy password to clipboard</source> @@ -2556,7 +2733,7 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>&Settings</source> - <translation>Paramètres</translation> + <translation>&Paramètres</translation> </message> <message> <source>Password Generator</source> @@ -2564,7 +2741,7 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>&Perform Auto-Type</source> - <translation>Exécuter la saisie semi-automatique</translation> + <translation>&Exécuter la saisie automatique</translation> </message> <message> <source>&Open URL</source> @@ -2572,7 +2749,7 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>&Lock databases</source> - <translation>Verrouiller les bases de données</translation> + <translation>&Verrouiller les bases de données</translation> </message> <message> <source>&Title</source> @@ -2580,7 +2757,7 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>Copy title to clipboard</source> - <translation type="unfinished"/> + <translation>Copier le titre dans le presse-papier</translation> </message> <message> <source>&URL</source> @@ -2588,7 +2765,7 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>Copy URL to clipboard</source> - <translation type="unfinished"/> + <translation>Copier l'URL dans le presse-papier</translation> </message> <message> <source>&Notes</source> @@ -2596,7 +2773,7 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>Copy notes to clipboard</source> - <translation type="unfinished"/> + <translation>Copier les notes dans le presse-papier</translation> </message> <message> <source>&Export to CSV file...</source> @@ -2628,7 +2805,7 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>E&mpty recycle bin</source> - <translation type="unfinished"/> + <translation>V&ider la corbeille</translation> </message> <message> <source>Clear history</source> @@ -2640,11 +2817,11 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> - <translation type="unfinished"/> + <translation><p>Il semble que vous utilisez KeePassHTTP pour l'intégration au navigateur web. Cette fonctionnalité est dorénavant déconseillée et elle sera supprimée dans le future.<br>Veuillez passer à KeePassXC-Browser à la place! Si vous avez besoin d'aide pour migrer, consulter notre<a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">guide de migration</a> (avertissement %1 sur 3).</p></translation> </message> <message> <source>read-only</source> - <translation>Lecture seulement</translation> + <translation>Lecture seule</translation> </message> <message> <source>Settings</source> @@ -2656,11 +2833,11 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>Quit KeePassXC</source> - <translation>Quitter KeePass XC</translation> + <translation>Quitter KeePassXC</translation> </message> <message> <source>KeePass 2 Database</source> - <translation>Base de données Keepass 2</translation> + <translation>Base de données KeePass 2</translation> </message> <message> <source>All files</source> @@ -2682,100 +2859,112 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l <source>Please touch the button on your YubiKey!</source> <translation>Veuillez presser le bouton de votre YubiKey!</translation> </message> + <message> + <source>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</source> + <translation>AVERTISSEMENT: Vous utilisez une version instable du KeePassXC! +Il y a un risque élevé de corruption, gardez une sauvegarde de vos bases de données. +Cette version n’est pas destinée à la production.</translation> + </message> </context> <context> <name>OpenSSHKey</name> <message> <source>Invalid key file, expecting an OpenSSH key</source> - <translation type="unfinished"/> + <translation>Fichier clé invalide, une clé OpenSSH est attendue</translation> </message> <message> <source>PEM boundary mismatch</source> - <translation type="unfinished"/> - </message> - <message> - <source>This is not an OpenSSH key, only modern keys are supported</source> - <translation type="unfinished"/> + <translation>Décalage de la limite PEM</translation> </message> <message> <source>Base64 decoding failed</source> - <translation type="unfinished"/> + <translation>Échec du décodage Base64</translation> </message> <message> <source>Key file way too small.</source> - <translation type="unfinished"/> + <translation>Le fichier clé est trop petit.</translation> </message> <message> <source>Key file magic header id invalid</source> - <translation type="unfinished"/> + <translation>L'identifiant magic header du fichier clé est invalide</translation> </message> <message> <source>Found zero keys</source> - <translation type="unfinished"/> + <translation>Zéro clés trouvées</translation> </message> <message> <source>Failed to read public key.</source> - <translation type="unfinished"/> + <translation>Échec de lecture de la clé publique.</translation> </message> <message> <source>Corrupted key file, reading private key failed</source> - <translation type="unfinished"/> + <translation>Fichier clé corrompu, échec de lecture de la clé privée</translation> </message> <message> <source>No private key payload to decrypt</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown cipher: </source> - <translation type="unfinished"/> + <translation>Aucune clé privée à décrypter</translation> </message> <message> <source>Trying to run KDF without cipher</source> - <translation type="unfinished"/> + <translation>Tentative d’exécuter KDF sans chiffrement</translation> </message> <message> <source>Passphrase is required to decrypt this key</source> - <translation type="unfinished"/> + <translation>Cette clé requiert une phrase secrète pour être déchiffrée</translation> </message> <message> <source>Key derivation failed, key file corrupted?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown KDF: </source> - <translation type="unfinished"/> + <translation>Échec de la dérivation de clé, fichier clé corrompu?</translation> </message> <message> <source>Decryption failed, wrong passphrase?</source> - <translation type="unfinished"/> + <translation>Échec du déchiffrement, mauvaise phrase secrète ?</translation> </message> <message> <source>Unexpected EOF while reading public key</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown key type: </source> - <translation type="unfinished"/> + <translation>End-of-file inattendu lors de la lecture de la clé publique</translation> </message> <message> <source>Unexpected EOF while reading private key</source> - <translation type="unfinished"/> + <translation>End-of-file inattendu lors de la lecture de la clé privée</translation> </message> <message> <source>Can't write public key as it is empty</source> - <translation type="unfinished"/> + <translation>Impossible d'écrire une clé publique car elle est vide</translation> </message> <message> <source>Unexpected EOF when writing public key</source> - <translation type="unfinished"/> + <translation>End-of-file inattendu lors de l’écriture de la clé publique</translation> </message> <message> <source>Can't write private key as it is empty</source> - <translation type="unfinished"/> + <translation>Impossible d'écrire une clé privée car elle est vide</translation> </message> <message> <source>Unexpected EOF when writing private key</source> - <translation type="unfinished"/> + <translation>End-of-file inattendu lors de l’écriture de la clé privée</translation> + </message> + <message> + <source>Unsupported key type: %1</source> + <translation>Type de clé non géré: %1</translation> + </message> + <message> + <source>Unknown cipher: %1</source> + <translation>Chiffrement inconnu : %1</translation> + </message> + <message> + <source>Cipher IV is too short for MD5 kdf</source> + <translation>Le vecteur d'initialisation du chiffrage est trop court pour la KDF MD5</translation> + </message> + <message> + <source>Unknown KDF: %1</source> + <translation>KDF inconnu : %1</translation> + </message> + <message> + <source>Unknown key type: %1</source> + <translation>Type de clé inconnu : %1</translation> </message> </context> <context> @@ -2799,7 +2988,7 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l <message> <source>Sh&ow a notification when credentials are requested</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation>Montrer une notification quand les références sont demandées</translation> + <translation>Af&ficher une notification quand les identifiants sont demandés</translation> </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> @@ -2867,7 +3056,7 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>&Return advanced string fields which start with "KPH: "</source> - <translation>& Retourne les champs avancés de type chaîne qui commencent par "KPH :"</translation> + <translation>& Retourne les champs avancés de chaîne de caractères qui commencent par "KPH :"</translation> </message> <message> <source>HTTP Port:</source> @@ -2879,15 +3068,15 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>KeePassXC will listen to this port on 127.0.0.1</source> - <translation>KeepassXC va écouter ce port sur 127.0.0.1</translation> + <translation>KeePassXC va écouter ce port sur 127.0.0.1</translation> </message> <message> <source><b>Warning:</b> The following options can be dangerous!</source> - <translation type="unfinished"/> + <translation><b>Avertissement :</b> Les options suivantes peuvent être dangereuses!</translation> </message> <message> <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> - <translation type="unfinished"/> + <translation><p>KeePassHTTP est dorénavant déconseillé et il sera supprimé dans le futur.<br>Veuillez passer à KeePassXC-Browser à la place! Si vous avez besoin d'aide pour migrer, consulter notre <a href="https://keepassxc.org/docs/keepassxc-browser-migration">guide de migration</a>.</p></translation> </message> <message> <source>Cannot bind to privileged ports</source> @@ -3028,71 +3217,71 @@ Restauration du port 19455 par défaut.</translation> <name>QObject</name> <message> <source>Database not opened</source> - <translation type="unfinished"/> + <translation>La base de données n'est pas ouverte </translation> </message> <message> <source>Database hash not available</source> - <translation type="unfinished"/> + <translation>Hachage de la base de donnée non disponible</translation> </message> <message> <source>Client public key not received</source> - <translation type="unfinished"/> + <translation>Clé publique du client non reçue</translation> </message> <message> <source>Cannot decrypt message</source> - <translation type="unfinished"/> + <translation>Impossible de déchiffrer le message</translation> </message> <message> <source>Timeout or cannot connect to KeePassXC</source> - <translation type="unfinished"/> + <translation>Connexion expirée ou impossible à KeePassXC</translation> </message> <message> <source>Action cancelled or denied</source> - <translation type="unfinished"/> + <translation>Action annulée ou refusée</translation> </message> <message> <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> - <translation type="unfinished"/> + <translation>Chiffrement impossible du message ou clé publique introuvable. Native Messaging est-il activé dans KeePassXC ?</translation> </message> <message> <source>KeePassXC association failed, try again</source> - <translation type="unfinished"/> + <translation>L'association à KeePassXC a échoué, veuillez réessayer</translation> </message> <message> <source>Key change was not successful</source> - <translation type="unfinished"/> + <translation>Le changement de clé n'a pas réussi</translation> </message> <message> <source>Encryption key is not recognized</source> - <translation type="unfinished"/> + <translation>La clé de chiffrement n'est pas reconnue</translation> </message> <message> <source>No saved databases found</source> - <translation type="unfinished"/> + <translation>Aucunes bases de données sauvegardées trouvées</translation> </message> <message> <source>Incorrect action</source> - <translation type="unfinished"/> + <translation>Action incorrecte</translation> </message> <message> <source>Empty message received</source> - <translation type="unfinished"/> + <translation>Message vide reçu</translation> </message> <message> <source>No URL provided</source> - <translation type="unfinished"/> + <translation>Aucune URL définie</translation> </message> <message> <source>No logins found</source> - <translation type="unfinished"/> + <translation>Aucuns identifiants trouvés</translation> </message> <message> <source>Unknown error</source> - <translation type="unfinished"/> + <translation>Erreur inconnue</translation> </message> <message> <source>Add a new entry to a database.</source> - <translation type="unfinished"/> + <translation>Ajouter une nouvelle entrée à la base de données.</translation> </message> <message> <source>Path of the database.</source> @@ -3100,23 +3289,23 @@ Restauration du port 19455 par défaut.</translation> </message> <message> <source>Key file of the database.</source> - <translation type="unfinished"/> + <translation>Fichier clé de la base de données.</translation> </message> <message> <source>path</source> - <translation type="unfinished"/> + <translation>chemin</translation> </message> <message> <source>Username for the entry.</source> - <translation type="unfinished"/> + <translation>Nom d'utilisateur de l'entrée.</translation> </message> <message> <source>username</source> - <translation type="unfinished"/> + <translation>nom d'utilisateur</translation> </message> <message> <source>URL for the entry.</source> - <translation type="unfinished"/> + <translation>URL de l'entrée.</translation> </message> <message> <source>URL</source> @@ -3124,64 +3313,64 @@ Restauration du port 19455 par défaut.</translation> </message> <message> <source>Prompt for the entry's password.</source> - <translation type="unfinished"/> + <translation>Demande du mot de passe de l'entrée.</translation> </message> <message> <source>Generate a password for the entry.</source> - <translation type="unfinished"/> + <translation>Générer un mot de passe pour l'entrée.</translation> </message> <message> <source>Length for the generated password.</source> - <translation type="unfinished"/> + <translation>Longueur du mot de passe généré.</translation> </message> <message> <source>length</source> - <translation type="unfinished"/> + <translation>longueur</translation> </message> <message> <source>Path of the entry to add.</source> - <translation type="unfinished"/> + <translation>Chemin de l'entrée à ajouter.</translation> </message> <message> <source>Copy an entry's password to the clipboard.</source> - <translation type="unfinished"/> + <translation>Copier le mot de passe d'une entrée dans le presse-papier.</translation> </message> <message> <source>Path of the entry to clip.</source> <comment>clip = copy to clipboard</comment> - <translation type="unfinished"/> + <translation>Chemin de l'entrée à épingler.</translation> </message> <message> <source>Timeout in seconds before clearing the clipboard.</source> - <translation type="unfinished"/> + <translation>Expiration en secondes avant l'effacement du presse-papier.</translation> </message> <message> <source>Edit an entry.</source> - <translation type="unfinished"/> + <translation>Modifier une entrée.</translation> </message> <message> <source>Title for the entry.</source> - <translation type="unfinished"/> + <translation>Titre de l'entrée.</translation> </message> <message> <source>title</source> - <translation type="unfinished"/> + <translation>titre</translation> </message> <message> <source>Path of the entry to edit.</source> - <translation type="unfinished"/> + <translation>Chemin de l'entrée à modifier.</translation> </message> <message> <source>Estimate the entropy of a password.</source> - <translation type="unfinished"/> + <translation>Estimer l’entropie d’un mot de passe.</translation> </message> <message> <source>Password for which to estimate the entropy.</source> - <translation type="unfinished"/> + <translation>Mot de passe permettant d’estimer l’entropie.</translation> </message> <message> <source>Perform advanced analysis on the password.</source> - <translation type="unfinished"/> + <translation>Effectuer une analyse approfondie du mot de passe.</translation> </message> <message> <source>Extract and print the content of a database.</source> @@ -3193,25 +3382,31 @@ Restauration du port 19455 par défaut.</translation> </message> <message> <source>Insert password to unlock %1: </source> - <translation type="unfinished"/> + <translation>Insérer le mot de passe pour déverrouiller %1 : </translation> </message> <message> <source>Failed to load key file %1 : %2</source> - <translation type="unfinished"/> + <translation>Échec du chargement du fichier clé %1 : %2</translation> </message> <message> <source>WARNING: You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>AVERTISSEMENT : Vous utilisez un format de fichier clé hérité +qui peut ne plus être pris en charge à l’avenir. + +Veuillez envisager de générer un nouveau fichier clé.</translation> </message> <message> <source> Available commands: </source> - <translation type="unfinished"/> + <translation> + +Commandes disponibles : +</translation> </message> <message> <source>Name of the command to execute.</source> @@ -3227,11 +3422,11 @@ Available commands: </message> <message> <source>Find entries quickly.</source> - <translation type="unfinished"/> + <translation>Trouver rapidement les entrées.</translation> </message> <message> <source>Search term.</source> - <translation type="unfinished"/> + <translation>Terme de recherche.</translation> </message> <message> <source>Merge two databases.</source> @@ -3247,23 +3442,23 @@ Available commands: </message> <message> <source>Use the same credentials for both database files.</source> - <translation type="unfinished"/> + <translation>Utiliser les mêmes identifiants pour les deux bases de données.</translation> </message> <message> <source>Key file of the database to merge from.</source> - <translation type="unfinished"/> + <translation>Fichier clé de la base de données à fusionner.</translation> </message> <message> <source>Show an entry's information.</source> - <translation type="unfinished"/> + <translation>Afficher les informations d’une entrée.</translation> </message> <message> <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> - <translation type="unfinished"/> + <translation>Noms des attributs à afficher. Cette option peut être spécifiée plusieurs fois, avec chaque attribut indiqué par une ligne dans l’ordre indiqué. Si aucun attribut n’est spécifié, un résumé des attributs par défaut est donné.</translation> </message> <message> <source>attribute</source> - <translation type="unfinished"/> + <translation>attribut</translation> </message> <message> <source>Name of the entry to show.</source> @@ -3285,7 +3480,7 @@ Available commands: </message> <message> <source>malformed string</source> - <translation>chaîne malformée</translation> + <translation>chaîne de caractères malformée</translation> </message> <message> <source>missing closing quote</source> @@ -3293,27 +3488,27 @@ Available commands: </message> <message> <source>AES: 256-bit</source> - <translation type="unfinished"/> + <translation>AES : 256 bits</translation> </message> <message> <source>Twofish: 256-bit</source> - <translation type="unfinished"/> + <translation>Twofish : 256 bits</translation> </message> <message> <source>ChaCha20: 256-bit</source> - <translation type="unfinished"/> + <translation>ChaCha20 : 256 bits</translation> </message> <message> <source>Argon2 (KDBX 4 – recommended)</source> - <translation type="unfinished"/> + <translation>Argon2 (KDBX 4 – recommandé)</translation> </message> <message> <source>AES-KDF (KDBX 4)</source> - <translation type="unfinished"/> + <translation>AES-KDF (KDBX 4)</translation> </message> <message> <source>AES-KDF (KDBX 3.1)</source> - <translation type="unfinished"/> + <translation>AES-KDF (KDBX 3.1)</translation> </message> <message> <source>Group</source> @@ -3337,19 +3532,19 @@ Available commands: </message> <message> <source>Last Modified</source> - <translation type="unfinished"/> + <translation>Dernière modification</translation> </message> <message> <source>Created</source> - <translation type="unfinished"/> + <translation>Créée</translation> </message> <message> <source>Legacy Browser Integration</source> - <translation type="unfinished"/> + <translation>Intégration au navigateur web héritée</translation> </message> <message> <source>Browser Integration</source> - <translation>Intégration Navigateur</translation> + <translation>Intégration au navigateur web</translation> </message> <message> <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source> @@ -3365,7 +3560,53 @@ Available commands: </message> <message> <source>SSH Agent</source> - <translation>SSH Agent</translation> + <translation>Agent SSH</translation> + </message> + <message> + <source>Generate a new random diceware passphrase.</source> + <translation>Créé une nouvelle phrase secrète générée par Diceware aléatoire</translation> + </message> + <message> + <source>Word count for the diceware passphrase.</source> + <translation>Comptage des mots pour la phrase secrète générée par Diceware</translation> + </message> + <message> + <source>count</source> + <translation>Compte</translation> + </message> + <message> + <source>Wordlist for the diceware generator. +[Default: EFF English]</source> + <translation>Liste de mots pour le générateur par Diceware. +[par défaut : anglais EFF]</translation> + </message> + <message> + <source>Generate a new random password.</source> + <translation>Générer un nouveau mot de passe aléatoire.</translation> + </message> + <message> + <source>Length of the generated password.</source> + <translation>Longueur du mot de passe généré.</translation> + </message> + <message> + <source>Use lowercase characters in the generated password.</source> + <translation>Utiliser les caractères minuscules dans le mot de passe créé.</translation> + </message> + <message> + <source>Use uppercase characters in the generated password.</source> + <translation>Utiliser les caractères majuscules dans le mot de passe créé.</translation> + </message> + <message> + <source>Use numbers in the generated password.</source> + <translation>Utiliser les nombres dans le mot de passe créé.</translation> + </message> + <message> + <source>Use special characters in the generated password.</source> + <translation>Utiliser les caractères spéciaux dans le mot de passe créé.</translation> + </message> + <message> + <source>Use extended ASCII in the generated password.</source> + <translation>Utiliser les caractères ASCII étendus dans le mot de passe créé.</translation> </message> </context> <context> @@ -3410,7 +3651,7 @@ Available commands: </message> <message> <source>Search</source> - <translation>Chercher</translation> + <translation>Recherche</translation> </message> <message> <source>Clear</source> @@ -3473,7 +3714,7 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message numerus="yes"> <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Cette clé de chiffrement a été retirée avec succès des paramètres de KeePassX/Http.</numerusform><numerusform>%n clés de chiffrement ont été retirées avec succès des paramètres de KeePassX/Http.</numerusform></translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -3485,7 +3726,7 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message> <source>KeePassXC: Settings not available!</source> - <translation>KeePassXC: Paramètre indisponible !</translation> + <translation>KeePassXC : Paramètres indisponibles !</translation> </message> <message> <source>The active database does not contain an entry of KeePassHttp Settings.</source> @@ -3505,7 +3746,7 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message numerus="yes"> <source>Successfully removed permissions from %n entries.</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Les permissions de l'entrée ont été retirées avec succès.</numerusform><numerusform>Les permissions de %n entrées ont été retirées avec succès.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -3587,7 +3828,7 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message> <source>Hide the Details view</source> - <translation type="unfinished"/> + <translation>Masquer la Vue détaillée</translation> </message> <message> <source>Show a system tray icon</source> @@ -3603,7 +3844,7 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message> <source>Dark system tray icon</source> - <translation type="unfinished"/> + <translation>Icône sombre dans la zone de notification</translation> </message> <message> <source>Language</source> @@ -3611,39 +3852,63 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message> <source>Auto-Type</source> - <translation>Saisie-Automatique</translation> + <translation>Saisie automatique</translation> </message> <message> <source>Use entry title to match windows for global Auto-Type</source> - <translation type="unfinished"/> + <translation>Utiliser le titre de l'entrée dans la correspondance des fenêtres pour la saisie automatique globale.</translation> </message> <message> <source>Use entry URL to match windows for global Auto-Type</source> - <translation type="unfinished"/> + <translation>Utiliser l'URL de l'entrée dans la correspondance des fenêtres pour la saisie automatique globale.</translation> </message> <message> <source>Always ask before performing Auto-Type</source> - <translation>Toujours demander avant de procéder à une Saisie-Automatique</translation> + <translation>Toujours demander avant de procéder à une saisie automatique</translation> </message> <message> <source>Global Auto-Type shortcut</source> - <translation>Raccourci de la Saisie-Automatique</translation> + <translation>Raccourci de la saisie automatique</translation> </message> <message> <source>Auto-Type delay</source> - <translation>Délais de Remplissage de la Saisie-Automatique</translation> + <translation>Délais de remplissage de la saisie automatique</translation> </message> <message> <source> ms</source> <comment>Milliseconds</comment> <translation>ms</translation> </message> + <message> + <source>Startup</source> + <translation>Démarrage</translation> + </message> + <message> + <source>File Management</source> + <translation>Gestion des fichiers</translation> + </message> + <message> + <source>Safely save database files (may be incompatible with Dropbox, etc)</source> + <translation>Enregistrer en toute sécurité les fichiers de base de données (peut être incompatible avec Dropbox, etc.)</translation> + </message> + <message> + <source>Backup database file before saving</source> + <translation>Sauvegarder le fichier de base de données avant d’enregistrer</translation> + </message> + <message> + <source>Entry Management</source> + <translation>Gestion des entrées</translation> + </message> + <message> + <source>General</source> + <translation>Général</translation> + </message> </context> <context> <name>SettingsWidgetSecurity</name> <message> <source>Timeouts</source> - <translation>Timeouts</translation> + <translation>Expirations</translation> </message> <message> <source>Clear clipboard after</source> @@ -3664,11 +3929,11 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message> <source>Lock databases when session is locked or lid is closed</source> - <translation>Verrouiller les bases de données quand la session est verrouillée ou le capot fermé</translation> + <translation>Verrouiller les bases de données quand la session est verrouillée ou l'écran rabattu</translation> </message> <message> <source>Lock databases after minimizing the window</source> - <translation>Verrouiller la base de données lorsque la fenêtre est minimisée</translation> + <translation>Verrouiller les bases de données lorsque la fenêtre est minimisée</translation> </message> <message> <source>Don't require password repeat when it is visible</source> @@ -3680,11 +3945,11 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message> <source>Hide passwords in the preview panel</source> - <translation type="unfinished"/> + <translation>Masquer les mots de passe dans le panneau de prévisualisation</translation> </message> <message> <source>Hide entry notes by default</source> - <translation type="unfinished"/> + <translation>Masquer les notes des entrées par défaut</translation> </message> <message> <source>Privacy</source> @@ -3692,7 +3957,11 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message> <source>Use Google as fallback for downloading website icons</source> - <translation>Utilisez Google en secours pour télécharger des icônes de site web</translation> + <translation>Utilisez Google en second recours pour télécharger les icônes des sites internet</translation> + </message> + <message> + <source>Re-lock previously locked database after performing Auto-Type</source> + <translation>Verrouiller à nouveau la base de données précédemment verrouillée après avoir réalisé la saisie automatique</translation> </message> </context> <context> @@ -3707,11 +3976,11 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message> <source>Default RFC 6238 token settings</source> - <translation type="unfinished"/> + <translation>Paramètres de base des codes RFC 6238</translation> </message> <message> <source>Steam token settings</source> - <translation type="unfinished"/> + <translation>Paramètres du code éphémère Steam</translation> </message> <message> <source>Use custom settings</source> @@ -3775,10 +4044,6 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </context> <context> <name>WelcomeWidget</name> - <message> - <source>Welcome to KeePassXC</source> - <translation>Bienvenue dans KeePassXC</translation> - </message> <message> <source>Start storing your passwords securely in a KeePassXC database</source> <translation>Gardez vos mots de passe en sécurité dans une base de données KeePassXC</translation> @@ -3797,18 +4062,22 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message> <source>Import from CSV</source> - <translation>Import depuis CSV</translation> + <translation>Importer depuis un CSV</translation> </message> <message> <source>Recent databases</source> <translation>Bases de données récentes</translation> </message> + <message> + <source>Welcome to KeePassXC %1</source> + <translation>Bienvenue sur KeePassXC %1</translation> + </message> </context> <context> <name>main</name> <message> <source>Remove an entry from the database.</source> - <translation type="unfinished"/> + <translation>Supprimer une entrée de la base de données.</translation> </message> <message> <source>Path of the database.</source> @@ -3816,7 +4085,7 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message> <source>Path of the entry to remove.</source> - <translation type="unfinished"/> + <translation>Chemin de l'entrée à supprimer.</translation> </message> <message> <source>KeePassXC - cross-platform password manager</source> @@ -3832,7 +4101,7 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message> <source>key file of the database</source> - <translation>Fichier-clé de la base de données</translation> + <translation>Fichier clé de la base de données</translation> </message> <message> <source>read password of the database from stdin</source> @@ -3840,7 +4109,7 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message> <source>Parent window handle</source> - <translation type="unfinished"/> + <translation>Poignée de la fenêtre parent</translation> </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_hu.ts b/share/translations/keepassx_hu.ts index 033f77ef2..fe7f8f8e8 100644 --- a/share/translations/keepassx_hu.ts +++ b/share/translations/keepassx_hu.ts @@ -15,11 +15,7 @@ </message> <message> <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>A KeePassXC a GNU General Public License (GPL) 2. vagy (válaszhatóan ) 3. verziója szerint kerül terjesztésre.</translation> - </message> - <message> - <source>Project Maintainers:</source> - <translation>Projektkarbantartók:</translation> + <translation>A KeePassXC a GNU General Public License (GPL) 2-es vagy (válaszhatóan) 3-as verziója szerint kerül terjesztésre.</translation> </message> <message> <source>Contributors</source> @@ -71,6 +67,19 @@ Kernel: %3 %4</translation> <source>Enabled extensions:</source> <translation>Engedélyezett kiterjesztések:</translation> </message> + <message> + <source>Project Maintainers:</source> + <translation>Projektkarbantartók:</translation> + </message> + <message> + <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> + <translation>A KeePassXC fejlesztőcsapata ezúton külön köszönetet mond debfx-nek az eredetei KeePassX létrehozásáért.</translation> + </message> + <message> + <source>Build Type: %1 +</source> + <translation>Build típusa: %1</translation> + </message> </context> <context> <name>AccessControlDialog</name> @@ -101,7 +110,7 @@ Válassza ki, hogy engedélyezi-e a hozzáférést.</translation> <name>AgentSettingsWidget</name> <message> <source>Enable SSH Agent (requires restart)</source> - <translation>SSH-ügynök engedélyezése (újraindítást igényel)</translation> + <translation>SSH ügynök engedélyezése (újraindítást igényel)</translation> </message> </context> <context> @@ -150,6 +159,25 @@ Válassza ki, hogy engedélyezi-e a hozzáférést.</translation> <translation>Alapértelmezett sorrend</translation> </message> </context> +<context> + <name>AutoTypeMatchModel</name> + <message> + <source>Group</source> + <translation>Csoport</translation> + </message> + <message> + <source>Title</source> + <translation>Cím</translation> + </message> + <message> + <source>Username</source> + <translation>Felhasználónév</translation> + </message> + <message> + <source>Sequence</source> + <translation>Sorrend</translation> + </message> +</context> <context> <name>AutoTypeSelectDialog</name> <message> @@ -165,7 +193,7 @@ Válassza ki, hogy engedélyezi-e a hozzáférést.</translation> <name>BrowserAccessControlDialog</name> <message> <source>KeePassXC-Browser Confirm Access</source> - <translation type="unfinished"/> + <translation>KeePassXC-böngésző hozzáférés engedélyezése</translation> </message> <message> <source>Remember this decision</source> @@ -194,7 +222,7 @@ Válassza ki, hogy engedélyezi-e a hozzáférést.</translation> </message> <message> <source>This is required for accessing your databases with KeePassXC-Browser</source> - <translation type="unfinished"/> + <translation>Ez szükséges az adatbázis KeePassXC-böngészőből történő eléréséhez</translation> </message> <message> <source>Enable KeepassXC browser integration</source> @@ -235,11 +263,11 @@ Válassza ki, hogy engedélyezi-e a hozzáférést.</translation> </message> <message> <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> - <translation>Csak az azonos sémájú (http://, https://, ...) bejegyzések visszaadása.</translation> + <translation>Csak az azonos sémájú (http://, https://, …) bejegyzések visszaadása.</translation> </message> <message> <source>&Match URL scheme (e.g., https://...)</source> - <translation>&URL sémákra illeszkedés (pl. https://...)</translation> + <translation>&URL sémákra illeszkedés (pl. https://…)</translation> </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> @@ -300,49 +328,49 @@ Válassza ki, hogy engedélyezi-e a hozzáférést.</translation> </message> <message> <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> - <translation type="unfinished"/> + <translation>Indításkor automatikusan frissíti a KeePassXC vagy a keepassxc-proxy bináris útvonalát a natív üzenetküldő parancsfájlok felé.</translation> </message> <message> <source>Update &native messaging manifest files at startup</source> - <translation type="unfinished"/> + <translation>Natív üzenetküldő manifest-fájlok frissítése indításkor</translation> </message> <message> <source>Support a proxy application between KeePassXC and browser extension.</source> - <translation type="unfinished"/> + <translation>Támogatást biztosít egy proxy-alkalmazásnak a KeePassXC és a böngésző kiterjesztés között.</translation> </message> <message> <source>Use a &proxy application between KeePassXC and browser extension</source> - <translation type="unfinished"/> + <translation>Proxy-alkalmazás alkalmazása a KeePassXC és a böngésző kiterjesztés között</translation> </message> <message> <source>Use a custom proxy location if you installed a proxy manually.</source> - <translation type="unfinished"/> + <translation>Egyedi proxyhelyet kell beállítani manuálisan telepített proxy esetén.</translation> </message> <message> <source>Use a &custom proxy location</source> <comment>Meant is the proxy for KeePassXC-Browser</comment> - <translation type="unfinished"/> + <translation>Egyedi proxyhely alkalmazása</translation> </message> <message> <source>Browse...</source> <extracomment>Button for opening file dialog</extracomment> - <translation type="unfinished"/> + <translation>Tallózás…</translation> </message> <message> <source><b>Warning:</b> The following options can be dangerous!</source> - <translation type="unfinished"/> + <translation><b>Figyelmeztetés:</b> A következő beállítások veszélyesek lehetnek!</translation> </message> <message> <source>Executable Files (*.exe);;All Files (*.*)</source> - <translation type="unfinished"/> + <translation>Végrehajtható fájlok (*.exe);;Minden fájl (*.*)</translation> </message> <message> <source>Executable Files (*)</source> - <translation type="unfinished"/> + <translation>Végrehajtható fájlok (*)</translation> </message> <message> <source>Select custom proxy location</source> - <translation type="unfinished"/> + <translation>Egyedi proxyhely kijelölése</translation> </message> </context> <context> @@ -356,11 +384,13 @@ Válassza ki, hogy engedélyezi-e a hozzáférést.</translation> If you would like to allow it access to your KeePassXC database, give it a unique name to identify and accept it.</source> - <translation type="unfinished"/> + <translation>A fenti kulcsra társítási kérelem érkezett. + +A KeePassXC adatbázishoz való hozzáférés engedélyezéséhez egy egyedi név hozzárendelése és elfogadása szükséges.</translation> </message> <message> <source>Save and allow access</source> - <translation type="unfinished"/> + <translation>Engedélyezési hozzáférés mentése</translation> </message> <message> <source>KeePassXC: Overwrite existing key?</source> @@ -369,7 +399,8 @@ give it a unique name to identify and accept it.</source> <message> <source>A shared encryption key with the name "%1" already exists. Do you want to overwrite it?</source> - <translation type="unfinished"/> + <translation>Létezik már egy megosztott titkosítási kulcs ezzel a névvel: „%1”. +Valóban felülírható?</translation> </message> <message> <source>KeePassXC: Update Entry</source> @@ -395,7 +426,7 @@ Fel kell oldani a kijelölt adatbázist, vagy egy másik nem zároltat kell vál </message> <message> <source>The active database does not contain a settings entry.</source> - <translation type="unfinished"/> + <translation>Az aktív adatbázisban nincs beállítási bejegyzés.</translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -403,7 +434,7 @@ Fel kell oldani a kijelölt adatbázist, vagy egy másik nem zároltat kell vál </message> <message> <source>No shared encryption keys found in KeePassXC Settings.</source> - <translation type="unfinished"/> + <translation>Nem található megosztott titkosítási kulcs a KeePassXC beállításaiban.</translation> </message> <message> <source>KeePassXC: Removed keys from database</source> @@ -411,11 +442,11 @@ Fel kell oldani a kijelölt adatbázist, vagy egy másik nem zároltat kell vál </message> <message numerus="yes"> <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Sikeresen eltávolításra került %n titkosítási kulcs a KeePassXC beállításokból.</numerusform><numerusform>Sikeresen eltávolításra került %n titkosítási kulcs a KeePassXC beállításokból.</numerusform></translation> </message> <message> <source>Removing stored permissions…</source> - <translation type="unfinished"/> + <translation>Tárolt jogosultságok törlése…</translation> </message> <message> <source>Abort</source> @@ -427,7 +458,7 @@ Fel kell oldani a kijelölt adatbázist, vagy egy másik nem zároltat kell vál </message> <message numerus="yes"> <source>Successfully removed permissions from %n entry(s).</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Sikeresen el lett távolítva a jogosultság %n elemről.</numerusform><numerusform>Sikeresen el lett távolítva a jogosultság %n elemről.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -512,14 +543,16 @@ Fel kell oldani a kijelölt adatbázist, vagy egy másik nem zároltat kell vál </message> <message> <source>Legacy key file format</source> - <translation type="unfinished"/> + <translation>Örökölt kulcsfájl formátum</translation> </message> <message> <source>You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>Egy régi, örökölt kulcsfájl formátumot használ, ami a közeljövőben már nem lesz támogatott. + +Megfontolandó egy új kulcsfájl készítése.</translation> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -653,15 +686,15 @@ Please consider generating a new key file.</source> <name>CsvParserModel</name> <message numerus="yes"> <source>%n byte(s), </source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n bájt, </numerusform><numerusform>%n bájt, </numerusform></translation> </message> <message numerus="yes"> <source>%n row(s), </source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n sor, </numerusform><numerusform>%n sor, </numerusform></translation> </message> <message numerus="yes"> <source>%n column(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n oszlop</numerusform><numerusform>%n oszlop</numerusform></translation> </message> </context> <context> @@ -700,18 +733,20 @@ Please consider generating a new key file.</source> </message> <message> <source>Legacy key file format</source> - <translation type="unfinished"/> + <translation>Örökölt kulcsfájl formátum</translation> </message> <message> <source>You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>Egy régi, örökölt kulcsfájl formátumot használ, ami a közeljövőben már nem lesz támogatott. + +Megfontolandó egy új kulcsfájl készítése.</translation> </message> <message> <source>Don't show this warning again</source> - <translation type="unfinished"/> + <translation>Ne jelenjen meg többé a figyelmeztetés</translation> </message> <message> <source>All files</source> @@ -771,52 +806,66 @@ Most már el lehet menteni.</translation> </message> <message> <source>Encryption</source> - <translation type="unfinished"/> + <translation>Titkosítás</translation> </message> <message> <source>Number of rounds too high</source> <comment>Key transformation rounds</comment> - <translation type="unfinished"/> + <translation>Fordulók száma túl magas</translation> </message> <message> <source>You are using a very high number of key transform rounds with Argon2. If you keep this number, your database may take hours or days (or even longer) to open!</source> - <translation type="unfinished"/> + <translation>Nagyon sok kulcsátalakítási forduló lett megadva az Argon2 számára. + +Ezt a számot megtartva az adatbázis megnyitása órákba vagy napokba (vagy még több időbe) telhet!</translation> </message> <message> <source>Understood, keep number</source> - <translation type="unfinished"/> + <translation>Megértettem, maradjon a szám</translation> </message> <message> <source>Cancel</source> - <translation type="unfinished"/> + <translation>Mégse</translation> </message> <message> <source>Number of rounds too low</source> <comment>Key transformation rounds</comment> - <translation type="unfinished"/> + <translation>Fordulók száma túl alacsony</translation> </message> <message> <source>You are using a very low number of key transform rounds with AES-KDF. If you keep this number, your database may be too easy to crack!</source> - <translation type="unfinished"/> + <translation>Nagyon kevés kulcsátalakítási forduló lett megadva az AES-KDF számára. + +Ezt a számot megtartva az adatbázis nagyon könnyen törhető lesz.</translation> </message> <message> <source>KDF unchanged</source> - <translation type="unfinished"/> + <translation>KDF változatlan</translation> </message> <message> <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> - <translation type="unfinished"/> + <translation>A kulcsátalakítás sikertelen az új KDF paraméterrel; KDF változatlan.</translation> + </message> + <message numerus="yes"> + <source> MiB</source> + <comment>Abbreviation for Mebibytes (KDF settings)</comment> + <translation><numerusform> MiB</numerusform><numerusform> MiB</numerusform></translation> + </message> + <message numerus="yes"> + <source> thread(s)</source> + <comment>Threads for parallel execution (KDF settings)</comment> + <translation><numerusform>szál</numerusform><numerusform>szál</numerusform></translation> </message> </context> <context> <name>DatabaseSettingsWidgetEncryption</name> <message> <source>Encryption Algorithm:</source> - <translation type="unfinished"/> + <translation>Titkosítási algoritmus:</translation> </message> <message> <source>AES: 256 Bit (default)</source> @@ -828,38 +877,30 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Key Derivation Function:</source> - <translation type="unfinished"/> + <translation>Kulcsszármaztatási függvény:</translation> </message> <message> <source>Transform rounds:</source> - <translation>Átalakítási körök száma:</translation> + <translation>Átalakítási fordulók száma:</translation> </message> <message> <source>Benchmark 1-second delay</source> - <translation type="unfinished"/> + <translation>Egy másodperces késleltetésű teljesítményvizsgálat</translation> </message> <message> <source>Memory Usage:</source> - <translation type="unfinished"/> - </message> - <message> - <source> MB</source> - <translation type="unfinished"/> + <translation>Memóriahasználat:</translation> </message> <message> <source>Parallelism:</source> - <translation type="unfinished"/> - </message> - <message> - <source> thread</source> - <translation type="unfinished"/> + <translation>Párhozamosság:</translation> </message> </context> <context> <name>DatabaseSettingsWidgetGeneral</name> <message> <source>Database Meta Data</source> - <translation type="unfinished"/> + <translation>Adatbázis metaadat</translation> </message> <message> <source>Database name:</source> @@ -875,7 +916,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>History Settings</source> - <translation type="unfinished"/> + <translation>Előzménybeállítások</translation> </message> <message> <source>Max. history items:</source> @@ -893,6 +934,14 @@ If you keep this number, your database may be too easy to crack!</source> <source>Use recycle bin</source> <translation>Kuka használata</translation> </message> + <message> + <source>Additional Database Settings</source> + <translation>További adatbázis-beállítások</translation> + </message> + <message> + <source>Enable &compression (recommended)</source> + <translation>&Tömörítés engedélyezése (ajánlott)</translation> + </message> </context> <context> <name>DatabaseTabWidget</name> @@ -939,7 +988,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Merge database</source> - <translation>Adatbázis összeolvasztása</translation> + <translation>Adatbázis egyesítése</translation> </message> <message> <source>Open KeePass 1 database</source> @@ -1015,6 +1064,16 @@ Otherwise your changes are lost.</source> Szeretné elmenteni az adatbázist zárolás előtt? Különben a módosítások elvesznek.</translation> </message> + <message> + <source>Disable safe saves?</source> + <translation>Letiltható a biztonságos mentés?</translation> + </message> + <message> + <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</source> + <translation>A KeePassXC többször is hiába próbálta meg elmenteni az adatbázist. Ez jellemzően azért szokott előfordulni, mert egy szinkronizáló szolgáltatás zárolja a mentendő fájl. +Letiltható a biztonságos mentés és úgy megkísérelhető a mentés?</translation> + </message> </context> <context> <name>DatabaseWidget</name> @@ -1056,7 +1115,7 @@ Különben a módosítások elvesznek.</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Valóban a kukába szeretne dobni %n elemet?</numerusform><numerusform>Valóban a kukába szeretne dobni %n elemet?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1100,7 +1159,7 @@ Különben a módosítások elvesznek.</translation> </message> <message> <source>File has changed</source> - <translation type="unfinished"/> + <translation>A fájl módosult</translation> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -1108,12 +1167,13 @@ Különben a módosítások elvesznek.</translation> </message> <message> <source>Merge Request</source> - <translation>Összeolvasztási kérelem</translation> + <translation>Egyesítési kérelem</translation> </message> <message> <source>The database file has changed and you have unsaved changes. Do you want to merge your changes?</source> - <translation type="unfinished"/> + <translation>Az adatbázisfájl módosult és vannak nem mentett változások. +Egyesíti a módosításokat?</translation> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -1127,12 +1187,16 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>Valóban véglegesen töröl mindent a kukából?</translation> </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DetailsWidget</name> <message> <source>Generate TOTP Token</source> - <translation type="unfinished"/> + <translation>TOTP jelsor előállítása</translation> </message> <message> <source>Close</source> @@ -1152,7 +1216,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Expiration</source> - <translation type="unfinished"/> + <translation>Lejárat</translation> </message> <message> <source>Username</source> @@ -1160,15 +1224,15 @@ Do you want to merge your changes?</source> </message> <message> <source>Autotype</source> - <translation type="unfinished"/> + <translation>Automatikus típus</translation> </message> <message> <source>Searching</source> - <translation type="unfinished"/> + <translation>Keresés</translation> </message> <message> <source>Attributes</source> - <translation type="unfinished"/> + <translation>Attribútumok</translation> </message> <message> <source>Attachments</source> @@ -1196,19 +1260,19 @@ Do you want to merge your changes?</source> </message> <message> <source>Never</source> - <translation type="unfinished"/> + <translation>Soha</translation> </message> <message> <source>[PROTECTED]</source> - <translation type="unfinished"/> + <translation>[VÉDETT]</translation> </message> <message> <source>Disabled</source> - <translation type="unfinished"/> + <translation>Tiltott</translation> </message> <message> <source>Enabled</source> - <translation type="unfinished"/> + <translation>Engedélyezett</translation> </message> </context> <context> @@ -1243,23 +1307,23 @@ Do you want to merge your changes?</source> </message> <message> <source>n/a</source> - <translation type="unfinished"/> + <translation>nincs</translation> </message> <message> <source>(encrypted)</source> - <translation type="unfinished"/> + <translation>(titkosított)</translation> </message> <message> <source>Select private key</source> - <translation type="unfinished"/> + <translation>Személyes kulcs kijelölése</translation> </message> <message> <source>File too large to be a private key</source> - <translation type="unfinished"/> + <translation>A fájl túl nagy ahhoz, hogy személyes kulcs legyen</translation> </message> <message> <source>Failed to open private key</source> - <translation type="unfinished"/> + <translation>Személyes kulcs megnyitása meghiúsult</translation> </message> <message> <source>Entry history</source> @@ -1291,11 +1355,11 @@ Do you want to merge your changes?</source> </message> <message> <source>[PROTECTED]</source> - <translation type="unfinished"/> + <translation>[VÉDETT]</translation> </message> <message> <source>Press reveal to view or edit</source> - <translation type="unfinished"/> + <translation>A megjelenítés vagy a szerkesztés a „Felfedés” gombbal érhető el</translation> </message> <message> <source>Tomorrow</source> @@ -1303,16 +1367,28 @@ Do you want to merge your changes?</source> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n hét</numerusform><numerusform>%n hét</numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n hónap</numerusform><numerusform>%n hónap</numerusform></translation> </message> <message> <source>1 year</source> <translation>1 év</translation> </message> + <message> + <source>Apply generated password?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to apply the generated password to this entry?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAdvanced</name> @@ -1344,6 +1420,14 @@ Do you want to merge your changes?</source> <source>Attachments</source> <translation>Mellékletek</translation> </message> + <message> + <source>Foreground Color:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Background Color:</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -1376,12 +1460,8 @@ Do you want to merge your changes?</source> <translation>Ablakcím:</translation> </message> <message> - <source>Use default se&quence</source> - <translation>&Alapértelmezett sorrend használata</translation> - </message> - <message> - <source>Set custo&m sequence:</source> - <translation>&Egyéni sorrend használata:</translation> + <source>Use a specific sequence for this association:</source> + <translation>Adjon meg egy jellemző sorozatot ehhez a társításhoz:</translation> </message> </context> <context> @@ -1431,7 +1511,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Toggle the checkbox to reveal the notes section.</source> - <translation type="unfinished"/> + <translation>Jelölőnégyzet átváltásával felfedhető a jegyzetek szalasz.</translation> </message> <message> <source>Username:</source> @@ -1446,43 +1526,43 @@ Do you want to merge your changes?</source> <name>EditEntryWidgetSSHAgent</name> <message> <source>Form</source> - <translation type="unfinished"/> + <translation>Űrlap</translation> </message> <message> <source>Remove key from agent after</source> - <translation type="unfinished"/> + <translation>Kulcs eltávolítása az ügynöktől utána</translation> </message> <message> <source> seconds</source> - <translation type="unfinished"/> + <translation>másodperc</translation> </message> <message> <source>Fingerprint</source> - <translation type="unfinished"/> + <translation>Ujjlenyomat</translation> </message> <message> <source>Remove key from agent when database is closed/locked</source> - <translation type="unfinished"/> + <translation>Kulcs eltávolítása az ügynöktől, ha az adatbázis be vagy le van zárva</translation> </message> <message> <source>Public key</source> - <translation type="unfinished"/> + <translation>Nyilvános kulcs</translation> </message> <message> <source>Add key to agent when database is opened/unlocked</source> - <translation type="unfinished"/> + <translation>Kulcs hozzáadása az ügynökhöz, ha az adatbázis meg van nyitva vagy fel van oldva</translation> </message> <message> <source>Comment</source> - <translation type="unfinished"/> + <translation>Megjegyzés</translation> </message> <message> <source>Decrypt</source> - <translation type="unfinished"/> + <translation>Visszafejtés</translation> </message> <message> <source>n/a</source> - <translation type="unfinished"/> + <translation>nincs</translation> </message> <message> <source>Copy to clipboard</source> @@ -1490,32 +1570,32 @@ Do you want to merge your changes?</source> </message> <message> <source>Private key</source> - <translation type="unfinished"/> + <translation>Személyes kulcs</translation> </message> <message> <source>External file</source> - <translation type="unfinished"/> + <translation>Külső fájl</translation> </message> <message> <source>Browse...</source> <extracomment>Button for opening file dialog</extracomment> - <translation type="unfinished"/> + <translation>Tallózás…</translation> </message> <message> <source>Attachment</source> - <translation type="unfinished"/> + <translation>Melléklet</translation> </message> <message> <source>Add to agent</source> - <translation type="unfinished"/> + <translation>Hozzáadás az ügynökhöz</translation> </message> <message> <source>Remove from agent</source> - <translation type="unfinished"/> + <translation>Eltávolítás az ügynöktől</translation> </message> <message> <source>Require user confirmation when this key is used</source> - <translation type="unfinished"/> + <translation>Felhasználói megerősítés szükséges a kulcs alkalmazásakor</translation> </message> </context> <context> @@ -1659,7 +1739,32 @@ Do you want to merge your changes?</source> </message> <message> <source>Uuid:</source> - <translation>Uuid:</translation> + <translation>UUID:</translation> + </message> + <message> + <source>Plugin Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove</source> + <translation>Eltávolítás</translation> + </message> + <message> + <source>Delete plugin data?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Value</source> + <translation type="unfinished"/> </message> </context> <context> @@ -1678,14 +1783,14 @@ Do you want to merge your changes?</source> </message> <message> <source>Size</source> - <translation type="unfinished"/> + <translation>Méret</translation> </message> </context> <context> <name>EntryAttachmentsWidget</name> <message> <source>Form</source> - <translation type="unfinished"/> + <translation>Űrlap</translation> </message> <message> <source>Add</source> @@ -1705,11 +1810,11 @@ Do you want to merge your changes?</source> </message> <message> <source>Select files</source> - <translation type="unfinished"/> + <translation>Fájl kijelölése</translation> </message> <message numerus="yes"> <source>Are you sure you want to remove %n attachment(s)?</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Valóban eltávolít %n mellékletet?</numerusform><numerusform>Valóban eltávolít %n mellékletet?</numerusform></translation> </message> <message> <source>Confirm Remove</source> @@ -1717,40 +1822,45 @@ Do you want to merge your changes?</source> </message> <message> <source>Save attachments</source> - <translation type="unfinished"/> + <translation>Mellékletek mentése</translation> </message> <message> <source>Unable to create directory: %1</source> - <translation type="unfinished"/> + <translation>Nem hozható létre a mappa: +%1</translation> </message> <message> <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> - <translation type="unfinished"/> + <translation>Valóban felül kívánja írni a meglévő „%1” fájl a melléklettel?</translation> </message> <message> <source>Confirm overwrite</source> - <translation type="unfinished"/> + <translation>Felülírás megerősítése</translation> </message> <message> <source>Unable to save attachments: %1</source> - <translation type="unfinished"/> + <translation>A melléklet nem menthető: +%1</translation> </message> <message> <source>Unable to open attachment: %1</source> - <translation type="unfinished"/> + <translation>A melléklet nem megnyitható: +%1</translation> </message> <message> <source>Unable to open attachments: %1</source> - <translation type="unfinished"/> + <translation>A mellékletek nem megnyithatóak: +%1</translation> </message> <message> <source>Unable to open files: %1</source> - <translation type="unfinished"/> + <translation>A fájlok nem megnyithatóak: +%1</translation> </message> </context> <context> @@ -1802,6 +1912,65 @@ Do you want to merge your changes?</source> <source>URL</source> <translation>URL</translation> </message> + <message> + <source>Never</source> + <translation>Soha</translation> + </message> + <message> + <source>Password</source> + <translation>Jelszó</translation> + </message> + <message> + <source>Notes</source> + <translation>Jegyzetek</translation> + </message> + <message> + <source>Expires</source> + <translation>Lejárat</translation> + </message> + <message> + <source>Created</source> + <translation>Létrehozva</translation> + </message> + <message> + <source>Modified</source> + <translation>Módosított</translation> + </message> + <message> + <source>Accessed</source> + <translation>Elérve</translation> + </message> + <message> + <source>Attachments</source> + <translation>Mellékletek</translation> + </message> +</context> +<context> + <name>EntryView</name> + <message> + <source>Customize View</source> + <translation>Nézet testre szabása</translation> + </message> + <message> + <source>Hide Usernames</source> + <translation>Felhasználónevek elrejtése</translation> + </message> + <message> + <source>Hide Passwords</source> + <translation>Jelszavak elrejtése</translation> + </message> + <message> + <source>Fit to window</source> + <translation>Igazítás az ablakhoz</translation> + </message> + <message> + <source>Fit to contents</source> + <translation>Igazítás a tartalomhoz</translation> + </message> + <message> + <source>Reset to defaults</source> + <translation>Visszaállítás alapértelmezettre</translation> + </message> </context> <context> <name>Group</name> @@ -1814,11 +1983,11 @@ Do you want to merge your changes?</source> <name>HostInstaller</name> <message> <source>KeePassXC: Cannot save file!</source> - <translation type="unfinished"/> + <translation>KeePassXC: A fájlt nem menthető!</translation> </message> <message> <source>Cannot save the native messaging script file.</source> - <translation type="unfinished"/> + <translation>Nem lehet menteni a natív üzenetküldő parancsfájlt.</translation> </message> </context> <context> @@ -1861,7 +2030,7 @@ Do you want to merge your changes?</source> </message> <message> <source>/*_& ...</source> - <translation>/*_& ...</translation> + <translation>/*_& …</translation> </message> <message> <source>Exclude look-alike characters</source> @@ -1871,6 +2040,10 @@ Do you want to merge your changes?</source> <source>Ensure that the password contains characters from every group</source> <translation>Legyen a jelszóban minden csoportból karakter</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>Bővített ASCII</translation> + </message> </context> <context> <name>KMessageWidget</name> @@ -1913,7 +2086,7 @@ Do you want to merge your changes?</source> <name>Kdbx4Reader</name> <message> <source>missing database headers</source> - <translation type="unfinished"/> + <translation>hiányzó adatbázis fejlécek</translation> </message> <message> <source>Unable to calculate master key</source> @@ -1921,127 +2094,127 @@ Do you want to merge your changes?</source> </message> <message> <source>Invalid header checksum size</source> - <translation type="unfinished"/> + <translation>Érvénytelen fejlécellenőrző összeg</translation> </message> <message> <source>Header SHA256 mismatch</source> - <translation type="unfinished"/> + <translation>Fejléc SHA256 eltérés</translation> </message> <message> <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> - <translation type="unfinished"/> + <translation>Rossz kulcs vagy az adatbázisfájl sérült. (HMAC eltérés)</translation> </message> <message> <source>Unknown cipher</source> - <translation type="unfinished"/> + <translation>Ismeretlen titkosító</translation> </message> <message> <source>Invalid header id size</source> - <translation type="unfinished"/> + <translation>Érvénytelen fejléc-azonosító méret</translation> </message> <message> <source>Invalid header field length</source> - <translation type="unfinished"/> + <translation>Érvénytelen fejlécmezőhossz</translation> </message> <message> <source>Invalid header data length</source> - <translation type="unfinished"/> + <translation>Érvénytelen fejlécadathossz</translation> </message> <message> <source>Failed to open buffer for KDF parameters in header</source> - <translation type="unfinished"/> + <translation>A puffer megnyitása sikertelen a KDF paraméterek számára a fejlécben</translation> </message> <message> <source>Unsupported key derivation function (KDF) or invalid parameters</source> - <translation type="unfinished"/> + <translation>Nem támogatott kulcsszármaztatási függvény (KDF) vagy érvénytelen paraméter</translation> </message> <message> <source>Legacy header fields found in KDBX4 file.</source> - <translation type="unfinished"/> + <translation>Régi, örökölt fejlécmezők találhatók a KDBX4-fájlban.</translation> </message> <message> <source>Invalid inner header id size</source> - <translation type="unfinished"/> + <translation>Érvénytelen belső fejléc-azonosító méret</translation> </message> <message> <source>Invalid inner header field length</source> - <translation type="unfinished"/> + <translation>Érvénytelen belső fejlécmezőhossz</translation> </message> <message> <source>Invalid inner header binary size</source> - <translation type="unfinished"/> + <translation>Érvénytelen belső fejléc bináris méret</translation> </message> <message> <source>Unsupported KeePass variant map version.</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Nem támogatott KeePass változattérkép-verzió.</translation> </message> <message> <source>Invalid variant map entry name length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Érvénytelen változattérkép bejegyzésnévhossz</translation> </message> <message> <source>Invalid variant map entry name data</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Érvénytelen változattérkép bejegyzésnévadat</translation> </message> <message> <source>Invalid variant map entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Érvénytelen változattérkép bejegyzésértékhossz</translation> </message> <message> <source>Invalid variant map entry value data</source> <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Érvénytelen változattérkép bejegyzésértékadat</translation> </message> <message> <source>Invalid variant map Bool entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Érvénytelen Bool változattérkép bejegyzésértékhossz</translation> </message> <message> <source>Invalid variant map Int32 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Érvénytelen Int32 változattérkép bejegyzésértékhossz</translation> </message> <message> <source>Invalid variant map UInt32 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Érvénytelen UInt32 változattérkép bejegyzésértékhossz</translation> </message> <message> <source>Invalid variant map Int64 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Érvénytelen Int64 változattérkép bejegyzésértékhossz</translation> </message> <message> <source>Invalid variant map UInt64 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Érvénytelen UInt64 változattérkép bejegyzésértékhossz</translation> </message> <message> <source>Invalid variant map entry type</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Érvénytelen változattérkép bejegyzéstípus</translation> </message> <message> <source>Invalid variant map field type size</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Érvénytelen változattérkép mezőtípusméret</translation> </message> </context> <context> <name>Kdbx4Writer</name> <message> <source>Invalid symmetric cipher algorithm.</source> - <translation type="unfinished"/> + <translation>Érvénytelen szimmetrikus titkosító algoritmus.</translation> </message> <message> <source>Invalid symmetric cipher IV size.</source> <comment>IV = Initialization Vector for symmetric cipher</comment> - <translation type="unfinished"/> + <translation>Érvénytelen szimmetrikus titkosító IV méret.</translation> </message> <message> <source>Unable to calculate master key</source> @@ -2050,50 +2223,50 @@ Do you want to merge your changes?</source> <message> <source>Failed to serialize KDF parameters variant map</source> <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>A KDF-változattérkép-paraméterek sorbafejtése sikertelen.</translation> </message> </context> <context> <name>KdbxReader</name> <message> <source>Invalid cipher uuid length</source> - <translation type="unfinished"/> + <translation>Érvénytelen titkosító UUID-hossz</translation> </message> <message> <source>Unsupported cipher</source> - <translation type="unfinished"/> + <translation>Nem támogatott titkosító</translation> </message> <message> <source>Invalid compression flags length</source> - <translation type="unfinished"/> + <translation>Érvénytelen tömörítési jelzőhossz</translation> </message> <message> <source>Unsupported compression algorithm</source> - <translation type="unfinished"/> + <translation>Nem támogatott tömörítési algoritmus</translation> </message> <message> <source>Invalid master seed size</source> - <translation type="unfinished"/> + <translation>Érvénytelen mestermagméret</translation> </message> <message> <source>Invalid transform seed size</source> - <translation type="unfinished"/> + <translation>Érvénytelen átalakító magméret</translation> </message> <message> <source>Invalid transform rounds size</source> - <translation type="unfinished"/> + <translation>Érvénytelen átalakítási forduló méret</translation> </message> <message> <source>Invalid start bytes size</source> - <translation type="unfinished"/> + <translation>Érvénytelen kezdő bájtméret</translation> </message> <message> <source>Invalid random stream id size</source> - <translation type="unfinished"/> + <translation>Érvénytelen véletlenszerű adatfolyam-azonosító méret</translation> </message> <message> <source>Invalid inner random stream cipher</source> - <translation type="unfinished"/> + <translation>Érvénytelen belső véletlenszerű adatfolyamtitkosító</translation> </message> <message> <source>Not a KeePass database.</source> @@ -2111,131 +2284,131 @@ Ez egyirányú migráció. Nem lehet majd megnyitni az importált adatbázist a </message> <message> <source>Unsupported KeePass 2 database version.</source> - <translation type="unfinished"/> + <translation>Nem támogatott KeePass 2 adatbázis-verzió.</translation> </message> </context> <context> <name>KdbxXmlReader</name> <message> <source>XML parsing failure: %1</source> - <translation type="unfinished"/> + <translation>XML értelmezési hiba: %1</translation> </message> <message> <source>No root group</source> - <translation type="unfinished"/> + <translation>Nincs gyökércsoport</translation> </message> <message> <source>Missing icon uuid or data</source> - <translation type="unfinished"/> + <translation>Hiányzó ikon UUID vagy adat</translation> </message> <message> <source>Missing custom data key or value</source> - <translation type="unfinished"/> + <translation>Hiányzó egyéni adatkulcs vagy -érték</translation> </message> <message> <source>Multiple group elements</source> - <translation type="unfinished"/> + <translation>Többszörös csoportelemek</translation> </message> <message> <source>Null group uuid</source> - <translation type="unfinished"/> + <translation>Null csoport UUID</translation> </message> <message> <source>Invalid group icon number</source> - <translation type="unfinished"/> + <translation>Érvénytelen csoportikonszám</translation> </message> <message> <source>Invalid EnableAutoType value</source> - <translation type="unfinished"/> + <translation>Érvénytelen EnableAutoType érték</translation> </message> <message> <source>Invalid EnableSearching value</source> - <translation type="unfinished"/> + <translation>Érvénytelen EnableSearching érték</translation> </message> <message> <source>No group uuid found</source> - <translation type="unfinished"/> + <translation>Nem található a csoport UUID</translation> </message> <message> <source>Null DeleteObject uuid</source> - <translation type="unfinished"/> + <translation>Null DeleteObject UUID</translation> </message> <message> <source>Missing DeletedObject uuid or time</source> - <translation type="unfinished"/> + <translation>Hiányzó DeletedObject UUID vagy idő</translation> </message> <message> <source>Null entry uuid</source> - <translation type="unfinished"/> + <translation>Null bejegyzés UUID</translation> </message> <message> <source>Invalid entry icon number</source> - <translation type="unfinished"/> + <translation>Érvénytelen bejegyzésikonszám</translation> </message> <message> <source>History element in history entry</source> - <translation type="unfinished"/> + <translation>Előzményelem az előzménybejegyzésben</translation> </message> <message> <source>No entry uuid found</source> - <translation type="unfinished"/> + <translation>Nem található bejegyzés UUID</translation> </message> <message> <source>History element with different uuid</source> - <translation type="unfinished"/> + <translation>Előzményelem különböző UUID-vel</translation> </message> <message> <source>Unable to decrypt entry string</source> - <translation type="unfinished"/> + <translation>Bejegyzés karakterlánca nem visszafejthető</translation> </message> <message> <source>Duplicate custom attribute found</source> - <translation type="unfinished"/> + <translation>Kétszeres egyéni attribútum található</translation> </message> <message> <source>Entry string key or value missing</source> - <translation type="unfinished"/> + <translation>Hiányzik a bejegyzés karakterlánckulcsa vagy -értéke </translation> </message> <message> <source>Duplicate attachment found</source> - <translation type="unfinished"/> + <translation>Kétszeres melléklet található</translation> </message> <message> <source>Entry binary key or value missing</source> - <translation type="unfinished"/> + <translation>Hiányzik a bejegyzés bináris kulcsa vagy értéke </translation> </message> <message> <source>Auto-type association window or sequence missing</source> - <translation type="unfinished"/> + <translation>Hiányzik az automatikus beírás ablaktársítása vagy sorozata</translation> </message> <message> <source>Invalid bool value</source> - <translation type="unfinished"/> + <translation>Érvénytelen logikai érték</translation> </message> <message> <source>Invalid date time value</source> - <translation type="unfinished"/> + <translation>Érvénytelen dátum/idő érték</translation> </message> <message> <source>Invalid color value</source> - <translation type="unfinished"/> + <translation>Érvénytelen színérték</translation> </message> <message> <source>Invalid color rgb part</source> - <translation type="unfinished"/> + <translation>Érvénytelen RGB-színrész</translation> </message> <message> <source>Invalid number value</source> - <translation type="unfinished"/> + <translation>Érvénytelen számérték</translation> </message> <message> <source>Invalid uuid value</source> - <translation type="unfinished"/> + <translation>Érvénytelen UUID-érték</translation> </message> <message> <source>Unable to decompress binary</source> <extracomment>Translator meant is a binary data inside an entry</extracomment> - <translation type="unfinished"/> + <translation>A bináris nem kibontható</translation> </message> </context> <context> @@ -2270,31 +2443,31 @@ Ez egyirányú migráció. Nem lehet majd megnyitni az importált adatbázist a <message> <source>Unable to read encryption IV</source> <comment>IV = Initialization Vector for symmetric cipher</comment> - <translation type="unfinished"/> + <translation>Nem olvasható a IV titkosítás</translation> </message> <message> <source>Invalid number of groups</source> - <translation type="unfinished"/> + <translation>Érvénytelen csoportszám</translation> </message> <message> <source>Invalid number of entries</source> - <translation type="unfinished"/> + <translation>Érvénytelen bejegyzésszám</translation> </message> <message> <source>Invalid content hash size</source> - <translation type="unfinished"/> + <translation>Érvénytelen tartalomhasító-méret</translation> </message> <message> <source>Invalid transform seed size</source> - <translation type="unfinished"/> + <translation>Érvénytelen átalakító magméret</translation> </message> <message> <source>Invalid number of transform rounds</source> - <translation type="unfinished"/> + <translation>Érvénytelen átalakítási fordulószám</translation> </message> <message> <source>Unable to construct group tree</source> - <translation type="unfinished"/> + <translation>Nem lehet létrehozni a csoportfát</translation> </message> <message> <source>Root</source> @@ -2310,95 +2483,95 @@ Ez egyirányú migráció. Nem lehet majd megnyitni az importált adatbázist a </message> <message> <source>Key transformation failed</source> - <translation type="unfinished"/> + <translation>Kulcsátalakítás sikertelen</translation> </message> <message> <source>Invalid group field type number</source> - <translation type="unfinished"/> + <translation>Érvénytelen csoportmezőtípus-szám</translation> </message> <message> <source>Invalid group field size</source> - <translation type="unfinished"/> + <translation>Érvénytelen csoportmezőméret</translation> </message> <message> <source>Read group field data doesn't match size</source> - <translation type="unfinished"/> + <translation>A csoportmezőadatok olvasása nem egyezik meg a mérettel</translation> </message> <message> <source>Incorrect group id field size</source> - <translation type="unfinished"/> + <translation>Helytelen csoportazonosítómező-méret</translation> </message> <message> <source>Incorrect group creation time field size</source> - <translation type="unfinished"/> + <translation>Helytelen csoportlétrehozási időmező-méret</translation> </message> <message> <source>Incorrect group modification time field size</source> - <translation type="unfinished"/> + <translation>Helytelen csoportmódosítási időmező-méret</translation> </message> <message> <source>Incorrect group access time field size</source> - <translation type="unfinished"/> + <translation>Helytelen csoporthozzáférési időmező-méret</translation> </message> <message> <source>Incorrect group expiry time field size</source> - <translation type="unfinished"/> + <translation>Helytelen csoportlejárati időmező-méret</translation> </message> <message> <source>Incorrect group icon field size</source> - <translation type="unfinished"/> + <translation>Helytelen csoportikonmező-méret</translation> </message> <message> <source>Incorrect group level field size</source> - <translation type="unfinished"/> + <translation>Helytelen csoportszintmező-méret</translation> </message> <message> <source>Invalid group field type</source> - <translation type="unfinished"/> + <translation>Érvénytelen csoportmezőtípus</translation> </message> <message> <source>Missing group id or level</source> - <translation type="unfinished"/> + <translation>Helytelen csoportazonosító vagy -szint</translation> </message> <message> <source>Missing entry field type number</source> - <translation type="unfinished"/> + <translation>Hiányzó bejegyzésmezőtípus-szám</translation> </message> <message> <source>Invalid entry field size</source> - <translation type="unfinished"/> + <translation>Érvénytelen bejegyzésmező-méret</translation> </message> <message> <source>Read entry field data doesn't match size</source> - <translation type="unfinished"/> + <translation>A bejegyzésmezőadatok olvasása nem egyezik meg a mérettel</translation> </message> <message> <source>Invalid entry uuid field size</source> - <translation type="unfinished"/> + <translation>Érvénytelen bejegyzés UUID-mező-méret</translation> </message> <message> <source>Invalid entry group id field size</source> - <translation type="unfinished"/> + <translation>Érvénytelen bejegyzéscsoportazonosítómező-méret</translation> </message> <message> <source>Invalid entry icon field size</source> - <translation type="unfinished"/> + <translation>Érvénytelen bejegyzésikonmező-méret</translation> </message> <message> <source>Invalid entry creation time field size</source> - <translation type="unfinished"/> + <translation>Érvénytelen bejegyzéslétrehozási időmező-méret</translation> </message> <message> <source>Invalid entry modification time field size</source> - <translation type="unfinished"/> + <translation>Érvénytelen bejegyzésmódosítási időmező-méret</translation> </message> <message> <source>Invalid entry expiry time field size</source> - <translation type="unfinished"/> + <translation>Érvénytelen bejegyzéslejárati időmező-méret</translation> </message> <message> <source>Invalid entry field type</source> - <translation type="unfinished"/> + <translation>Érvénytelen bejegyzésmező-típus</translation> </message> </context> <context> @@ -2452,7 +2625,7 @@ Ez egyirányú migráció. Nem lehet majd megnyitni az importált adatbázist a </message> <message> <source>Time-based one-time password</source> - <translation type="unfinished"/> + <translation>Időalapú, egyszer használatos jelszó</translation> </message> <message> <source>&Groups</source> @@ -2488,7 +2661,7 @@ Ez egyirányú migráció. Nem lehet majd megnyitni az importált adatbázist a </message> <message> <source>Merge from KeePassX database</source> - <translation>Összeolvasztás KeePassX adatbázisból</translation> + <translation>Egyesítés KeePassX adatbázisból</translation> </message> <message> <source>&Add new entry</source> @@ -2580,7 +2753,7 @@ Ez egyirányú migráció. Nem lehet majd megnyitni az importált adatbázist a </message> <message> <source>Copy title to clipboard</source> - <translation type="unfinished"/> + <translation>Cím másolása a vágólapra</translation> </message> <message> <source>&URL</source> @@ -2588,7 +2761,7 @@ Ez egyirányú migráció. Nem lehet majd megnyitni az importált adatbázist a </message> <message> <source>Copy URL to clipboard</source> - <translation type="unfinished"/> + <translation>URL másolása a vágólapra</translation> </message> <message> <source>&Notes</source> @@ -2596,7 +2769,7 @@ Ez egyirányú migráció. Nem lehet majd megnyitni az importált adatbázist a </message> <message> <source>Copy notes to clipboard</source> - <translation type="unfinished"/> + <translation>Jegyzetek másolása a vágólapra</translation> </message> <message> <source>&Export to CSV file...</source> @@ -2628,7 +2801,7 @@ Ez egyirányú migráció. Nem lehet majd megnyitni az importált adatbázist a </message> <message> <source>E&mpty recycle bin</source> - <translation type="unfinished"/> + <translation>&Kuka ürítése</translation> </message> <message> <source>Clear history</source> @@ -2640,7 +2813,7 @@ Ez egyirányú migráció. Nem lehet majd megnyitni az importált adatbázist a </message> <message> <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> - <translation type="unfinished"/> + <translation><p>Úgy tűnik, hogy a böngészőintegrációt a KeePassHTTP látja el. A támogatása hamarosan lejár és a jövőben eltávolításra kerül. <br>Javasolt váltani a KeePassXC-Browser kiegészítőre! A költözéshez hasznos lehet a <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">költözési útmutató</a> (%1 figyelmeztetés a 3-ból).</p></translation> </message> <message> <source>read-only</source> @@ -2682,100 +2855,111 @@ Ez egyirányú migráció. Nem lehet majd megnyitni az importált adatbázist a <source>Please touch the button on your YubiKey!</source> <translation>Meg kell érinteni a gombot a YubiKeyen!</translation> </message> + <message> + <source>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</source> + <translation>FIGYELEM: Egy instabil KeePassXC verziót használ! Mivel magas kockázata van az adatsérülésnek, feltétlenül érdemes biztonsági mentés készíteni az adatbázisról. +Ez a verzió nem felhasználóknak készült.</translation> + </message> </context> <context> <name>OpenSSHKey</name> <message> <source>Invalid key file, expecting an OpenSSH key</source> - <translation type="unfinished"/> + <translation>Érvénytelen kulcsfájl, egy OpenSSh kulcs az elvált</translation> </message> <message> <source>PEM boundary mismatch</source> - <translation type="unfinished"/> - </message> - <message> - <source>This is not an OpenSSH key, only modern keys are supported</source> - <translation type="unfinished"/> + <translation>PEM-perem eltérés</translation> </message> <message> <source>Base64 decoding failed</source> - <translation type="unfinished"/> + <translation>Base64-dekódolás sikertelen</translation> </message> <message> <source>Key file way too small.</source> - <translation type="unfinished"/> + <translation>A kulcsfájl útja túl kicsi.</translation> </message> <message> <source>Key file magic header id invalid</source> - <translation type="unfinished"/> + <translation>Érvénytelen a kulcsfájl mágikus fejlécazonosítója</translation> </message> <message> <source>Found zero keys</source> - <translation type="unfinished"/> + <translation>Egyetlen kulcs sem található</translation> </message> <message> <source>Failed to read public key.</source> - <translation type="unfinished"/> + <translation>Nyilvános kulcs olvasása sikertelen.</translation> </message> <message> <source>Corrupted key file, reading private key failed</source> - <translation type="unfinished"/> + <translation>Sérült kulcsfájl, személyes kulcs olvasása sikertelen</translation> </message> <message> <source>No private key payload to decrypt</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown cipher: </source> - <translation type="unfinished"/> + <translation>Nincs dekódolható adat a személyes kulcsból</translation> </message> <message> <source>Trying to run KDF without cipher</source> - <translation type="unfinished"/> + <translation>KDF futtatási kísérlet titkosító nélkül</translation> </message> <message> <source>Passphrase is required to decrypt this key</source> - <translation type="unfinished"/> + <translation>Jelszó szükséges a kulcsfájl visszafejtéséhez</translation> </message> <message> <source>Key derivation failed, key file corrupted?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown KDF: </source> - <translation type="unfinished"/> + <translation>A kulcsszármaztatási sikertelen, megsérült a kulcsfájl?</translation> </message> <message> <source>Decryption failed, wrong passphrase?</source> - <translation type="unfinished"/> + <translation>Visszafejtés sikertelen, rossz a jelszó?</translation> </message> <message> <source>Unexpected EOF while reading public key</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown key type: </source> - <translation type="unfinished"/> + <translation>Nem várt EOF a nyilvános kulcs olvasása közben</translation> </message> <message> <source>Unexpected EOF while reading private key</source> - <translation type="unfinished"/> + <translation>Nem várt EOF a személyes kulcs olvasása közben</translation> </message> <message> <source>Can't write public key as it is empty</source> - <translation type="unfinished"/> + <translation>Nem lehet írni a nyilvános kulcsot, mivel üres</translation> </message> <message> <source>Unexpected EOF when writing public key</source> - <translation type="unfinished"/> + <translation>Nem várt EOF a nyilvános kulcs írásakor</translation> </message> <message> <source>Can't write private key as it is empty</source> - <translation type="unfinished"/> + <translation>Nem lehet írni a személyes kulcs, mivel üres</translation> </message> <message> <source>Unexpected EOF when writing private key</source> - <translation type="unfinished"/> + <translation>Nem várt EOF a személyes kulcs írásakor</translation> + </message> + <message> + <source>Unsupported key type: %1</source> + <translation>Nem támogatott kulcstípus: %1</translation> + </message> + <message> + <source>Unknown cipher: %1</source> + <translation>Ismeretlen titkosító: %1</translation> + </message> + <message> + <source>Cipher IV is too short for MD5 kdf</source> + <translation>A IV titkosító túl rövid a MD5 KDF számára</translation> + </message> + <message> + <source>Unknown KDF: %1</source> + <translation>Ismeretlen KDF: %1</translation> + </message> + <message> + <source>Unknown key type: %1</source> + <translation>Ismeretlen kulcstípus: %1</translation> </message> </context> <context> @@ -2883,11 +3067,11 @@ Ez egyirányú migráció. Nem lehet majd megnyitni az importált adatbázist a </message> <message> <source><b>Warning:</b> The following options can be dangerous!</source> - <translation type="unfinished"/> + <translation><b>Figyelmeztetés:</b> A következő beállítások veszélyesek lehetnek!</translation> </message> <message> <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> - <translation type="unfinished"/> + <translation><p>A KeePassHTTP támogatása hamarosan lejár és a jövőben eltávolításra kerül. <br>Javasolt váltani a KeePassXC-Browser kiegészítőre! A költözéshez hasznos lehet a <a href="https://keepassxc.org/docs/keepassxc-browser-migration">költözési útmutató.</a></translation> </message> <message> <source>Cannot bind to privileged ports</source> @@ -2961,7 +3145,7 @@ Az alapértelmezett 19455 port lesz használva.</translation> </message> <message> <source>Passphrase</source> - <translation>Jelmondat</translation> + <translation>Jelszó</translation> </message> <message> <source>Wordlist:</source> @@ -3028,71 +3212,71 @@ Az alapértelmezett 19455 port lesz használva.</translation> <name>QObject</name> <message> <source>Database not opened</source> - <translation type="unfinished"/> + <translation>Az adatbázis nem lett megnyitva</translation> </message> <message> <source>Database hash not available</source> - <translation type="unfinished"/> + <translation>Az adatbázishasító nem elérhető</translation> </message> <message> <source>Client public key not received</source> - <translation type="unfinished"/> + <translation>A kliens nyilvános kulcsa nem érkezett meg</translation> </message> <message> <source>Cannot decrypt message</source> - <translation type="unfinished"/> + <translation>Nem lehet visszafejteni az üzenetet</translation> </message> <message> <source>Timeout or cannot connect to KeePassXC</source> - <translation type="unfinished"/> + <translation>Időtúllépés vagy nem lehet csatlakozni a KeePassXC-hez</translation> </message> <message> <source>Action cancelled or denied</source> - <translation type="unfinished"/> + <translation>A műveletet megszakították vagy visszautasították</translation> </message> <message> <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> - <translation type="unfinished"/> + <translation>Nem lehet titkosítani az üzenetet vagy a nyilvános kulcs nem található. A natív üzenetküldés engedélyezve van a KeePassXC-ben?</translation> </message> <message> <source>KeePassXC association failed, try again</source> - <translation type="unfinished"/> + <translation>A KeePassXC társítása sikertelen, próbálja újra</translation> </message> <message> <source>Key change was not successful</source> - <translation type="unfinished"/> + <translation>A kulcsmódosítás nem volt sikeres</translation> </message> <message> <source>Encryption key is not recognized</source> - <translation type="unfinished"/> + <translation>A titkosítási kulcs nem lett felismerve</translation> </message> <message> <source>No saved databases found</source> - <translation type="unfinished"/> + <translation>Nincs található mentett adatbázis</translation> </message> <message> <source>Incorrect action</source> - <translation type="unfinished"/> + <translation>Helytelen művelet</translation> </message> <message> <source>Empty message received</source> - <translation type="unfinished"/> + <translation>Üres üzenet érkezett</translation> </message> <message> <source>No URL provided</source> - <translation type="unfinished"/> + <translation>Nincs URL biztosítva</translation> </message> <message> <source>No logins found</source> - <translation type="unfinished"/> + <translation>Belépések nem találhatók</translation> </message> <message> <source>Unknown error</source> - <translation type="unfinished"/> + <translation>Ismeretlen hiba</translation> </message> <message> <source>Add a new entry to a database.</source> - <translation type="unfinished"/> + <translation>Új bejegyzés hozzáadása egy adatbázishoz.</translation> </message> <message> <source>Path of the database.</source> @@ -3100,23 +3284,23 @@ Az alapértelmezett 19455 port lesz használva.</translation> </message> <message> <source>Key file of the database.</source> - <translation type="unfinished"/> + <translation>Adatbázis kulcsfájlja.</translation> </message> <message> <source>path</source> - <translation type="unfinished"/> + <translation>útvonal</translation> </message> <message> <source>Username for the entry.</source> - <translation type="unfinished"/> + <translation>Bejegyzés felhasználóneve.</translation> </message> <message> <source>username</source> - <translation type="unfinished"/> + <translation>felhasználónév</translation> </message> <message> <source>URL for the entry.</source> - <translation type="unfinished"/> + <translation>Bejegyzés URL-je.</translation> </message> <message> <source>URL</source> @@ -3124,64 +3308,64 @@ Az alapértelmezett 19455 port lesz használva.</translation> </message> <message> <source>Prompt for the entry's password.</source> - <translation type="unfinished"/> + <translation>Bejegyzés jelszavának bekérése.</translation> </message> <message> <source>Generate a password for the entry.</source> - <translation type="unfinished"/> + <translation>Jelszó előállítása a bejegyzés számára.</translation> </message> <message> <source>Length for the generated password.</source> - <translation type="unfinished"/> + <translation>Előállított jelszó hossza.</translation> </message> <message> <source>length</source> - <translation type="unfinished"/> + <translation>hosszúság</translation> </message> <message> <source>Path of the entry to add.</source> - <translation type="unfinished"/> + <translation>Hozzáadandó bejegyzés útvonala.</translation> </message> <message> <source>Copy an entry's password to the clipboard.</source> - <translation type="unfinished"/> + <translation>Egy bejegyzés jelszavának vágólapra való másolása.</translation> </message> <message> <source>Path of the entry to clip.</source> <comment>clip = copy to clipboard</comment> - <translation type="unfinished"/> + <translation>Levágandó bejegyzés útvonala.</translation> </message> <message> <source>Timeout in seconds before clearing the clipboard.</source> - <translation type="unfinished"/> + <translation>Késleltetés a vágólap törlése előtt (másodpercben).</translation> </message> <message> <source>Edit an entry.</source> - <translation type="unfinished"/> + <translation>Bejegyzés szerkesztése.</translation> </message> <message> <source>Title for the entry.</source> - <translation type="unfinished"/> + <translation>Bejegyzés címe.</translation> </message> <message> <source>title</source> - <translation type="unfinished"/> + <translation>cím</translation> </message> <message> <source>Path of the entry to edit.</source> - <translation type="unfinished"/> + <translation>Szerkesztendő bejegyzés útvonala.</translation> </message> <message> <source>Estimate the entropy of a password.</source> - <translation type="unfinished"/> + <translation>Jelszó entrópiájának becslése.</translation> </message> <message> <source>Password for which to estimate the entropy.</source> - <translation type="unfinished"/> + <translation>A jelszó, amelynek az entrópiája becslésre vár.</translation> </message> <message> <source>Perform advanced analysis on the password.</source> - <translation type="unfinished"/> + <translation>A jelszó speciális elemzése.</translation> </message> <message> <source>Extract and print the content of a database.</source> @@ -3193,25 +3377,30 @@ Az alapértelmezett 19455 port lesz használva.</translation> </message> <message> <source>Insert password to unlock %1: </source> - <translation type="unfinished"/> + <translation>Jelszó beszúrása a feloldásához: %1</translation> </message> <message> <source>Failed to load key file %1 : %2</source> - <translation type="unfinished"/> + <translation>%1 kulcsfájl betöltése sikertelen: %2</translation> </message> <message> <source>WARNING: You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>FIGYELEM: Egy régi, örökölt kulcsfájl formátumot használ, ami a közeljövőben már nem lesz támogatott. + +Megfontolandó egy új kulcsfájl készítése.</translation> </message> <message> <source> Available commands: </source> - <translation type="unfinished"/> + <translation> + +Elérhető parancsok: +</translation> </message> <message> <source>Name of the command to execute.</source> @@ -3227,39 +3416,39 @@ Available commands: </message> <message> <source>Find entries quickly.</source> - <translation type="unfinished"/> + <translation>Bejegyzések gyors keresése.</translation> </message> <message> <source>Search term.</source> - <translation type="unfinished"/> + <translation>Kifejezés keresése.</translation> </message> <message> <source>Merge two databases.</source> - <translation>Két adatbázis összeolvasztása.</translation> + <translation>Két adatbázis egyesítése.</translation> </message> <message> <source>Path of the database to merge into.</source> - <translation>Az összeolvasztás céladatbázisának útvonala.</translation> + <translation>Az egyesítés céladatbázisának útvonala.</translation> </message> <message> <source>Path of the database to merge from.</source> - <translation>Az összeolvasztás forrásadatbázisának útvonala.</translation> + <translation>Az egyesítés forrásadatbázisának útvonala.</translation> </message> <message> <source>Use the same credentials for both database files.</source> - <translation type="unfinished"/> + <translation>Ugyanazon hitelesítési adatok alkalmazása mindkét adatbázisfájlhoz.</translation> </message> <message> <source>Key file of the database to merge from.</source> - <translation type="unfinished"/> + <translation>Az egyesítés forrásadatbázisának kulcsfájlja.</translation> </message> <message> <source>Show an entry's information.</source> - <translation type="unfinished"/> + <translation>Bejegyzés információinak megjelenítése.</translation> </message> <message> <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> - <translation type="unfinished"/> + <translation>Megjelenítendő attribútumnevek. Ez a beállítás többször is megadható, minden megjelenő attribútummal soronként a megadott sorrendben. Ha nincs meghatározva attribútum, akkor az alapértelmezett attribútumok összefoglalója lesz megadva.</translation> </message> <message> <source>attribute</source> @@ -3367,6 +3556,52 @@ Available commands: <source>SSH Agent</source> <translation>SSH ügynök</translation> </message> + <message> + <source>Generate a new random diceware passphrase.</source> + <translation>Véletlenszerű új diceware jelszó előállítása.</translation> + </message> + <message> + <source>Word count for the diceware passphrase.</source> + <translation>Szavak számra a diceware jelszó számára.</translation> + </message> + <message> + <source>count</source> + <translation>szám</translation> + </message> + <message> + <source>Wordlist for the diceware generator. +[Default: EFF English]</source> + <translation>Szólista a diceware előállító számára. +[Alapértelmezett: EFF angol]</translation> + </message> + <message> + <source>Generate a new random password.</source> + <translation>Véletlenszerű új jelmondat előállítása.</translation> + </message> + <message> + <source>Length of the generated password.</source> + <translation>Előállított jelszó hossza.</translation> + </message> + <message> + <source>Use lowercase characters in the generated password.</source> + <translation>Kisbetűk alkalmazása az előállított jelszóban.</translation> + </message> + <message> + <source>Use uppercase characters in the generated password.</source> + <translation>Nagybetűk alkalmazása az előállított jelszóban.</translation> + </message> + <message> + <source>Use numbers in the generated password.</source> + <translation>Számok alkalmazása az előállított jelszóban.</translation> + </message> + <message> + <source>Use special characters in the generated password.</source> + <translation>Speciális karakterek alkalmazása az előállított jelszóban.</translation> + </message> + <message> + <source>Use extended ASCII in the generated password.</source> + <translation>Kiterjesztett ASCII karakterek alkalmazása az előállított jelszóban.</translation> + </message> </context> <context> <name>QtIOCompressor</name> @@ -3586,7 +3821,7 @@ Fel kell oldani a kijelölt adatbázist, vagy egy másik nem zároltat kell vál </message> <message> <source>Hide the Details view</source> - <translation type="unfinished"/> + <translation>Részletek nézet elrejtése</translation> </message> <message> <source>Show a system tray icon</source> @@ -3602,7 +3837,7 @@ Fel kell oldani a kijelölt adatbázist, vagy egy másik nem zároltat kell vál </message> <message> <source>Dark system tray icon</source> - <translation type="unfinished"/> + <translation>Sötét rendszertálca-ikon</translation> </message> <message> <source>Language</source> @@ -3614,11 +3849,11 @@ Fel kell oldani a kijelölt adatbázist, vagy egy másik nem zároltat kell vál </message> <message> <source>Use entry title to match windows for global Auto-Type</source> - <translation type="unfinished"/> + <translation>Bejegyzések címének alkalmazása az ablakok illesztésénél a globális automatikus beírás számára. </translation> </message> <message> <source>Use entry URL to match windows for global Auto-Type</source> - <translation type="unfinished"/> + <translation>Bejegyzések URL-jének alkalmazása az ablakok illesztésénél a globális automatikus beírás számára. </translation> </message> <message> <source>Always ask before performing Auto-Type</source> @@ -3637,6 +3872,30 @@ Fel kell oldani a kijelölt adatbázist, vagy egy másik nem zároltat kell vál <comment>Milliseconds</comment> <translation>ms</translation> </message> + <message> + <source>Startup</source> + <translation>Indítás</translation> + </message> + <message> + <source>File Management</source> + <translation>Fájlkezelés</translation> + </message> + <message> + <source>Safely save database files (may be incompatible with Dropbox, etc)</source> + <translation>Adatbázisok biztonságos mentése (lehet, hogy inkompatibilis a Dropbox-szal és hasonlókkal)</translation> + </message> + <message> + <source>Backup database file before saving</source> + <translation>Készüljön biztonsági mentés az adatbázisról mentés előtt</translation> + </message> + <message> + <source>Entry Management</source> + <translation>Bejegyzéskezelés</translation> + </message> + <message> + <source>General</source> + <translation>Általános</translation> + </message> </context> <context> <name>SettingsWidgetSecurity</name> @@ -3679,11 +3938,11 @@ Fel kell oldani a kijelölt adatbázist, vagy egy másik nem zároltat kell vál </message> <message> <source>Hide passwords in the preview panel</source> - <translation type="unfinished"/> + <translation>Jelszavak elrejtése az előnézet panelen</translation> </message> <message> <source>Hide entry notes by default</source> - <translation type="unfinished"/> + <translation>Bejegyzések jegyzeteinek elrejtése alapértelmezetten</translation> </message> <message> <source>Privacy</source> @@ -3693,6 +3952,10 @@ Fel kell oldani a kijelölt adatbázist, vagy egy másik nem zároltat kell vál <source>Use Google as fallback for downloading website icons</source> <translation>A Google használata tartalékként, a webhelyikonok letöltésére</translation> </message> + <message> + <source>Re-lock previously locked database after performing Auto-Type</source> + <translation>Az előzőleg zárolt adatbázis újbóli zárolása automatikus beírást követően</translation> + </message> </context> <context> <name>SetupTotpDialog</name> @@ -3706,11 +3969,11 @@ Fel kell oldani a kijelölt adatbázist, vagy egy másik nem zároltat kell vál </message> <message> <source>Default RFC 6238 token settings</source> - <translation type="unfinished"/> + <translation>Alapértelmezett RFC 6238-jelsor beállítás</translation> </message> <message> <source>Steam token settings</source> - <translation type="unfinished"/> + <translation>Adatfolyam jelsorbeállítás</translation> </message> <message> <source>Use custom settings</source> @@ -3774,10 +4037,6 @@ Fel kell oldani a kijelölt adatbázist, vagy egy másik nem zároltat kell vál </context> <context> <name>WelcomeWidget</name> - <message> - <source>Welcome to KeePassXC</source> - <translation>Üdvözöljük a KeePassXC-ben</translation> - </message> <message> <source>Start storing your passwords securely in a KeePassXC database</source> <translation>Máris elkezdhető a jelszavak titkosított tárolása a KeePassXC adatbázisban</translation> @@ -3802,12 +4061,16 @@ Fel kell oldani a kijelölt adatbázist, vagy egy másik nem zároltat kell vál <source>Recent databases</source> <translation>Friss adatbázisok</translation> </message> + <message> + <source>Welcome to KeePassXC %1</source> + <translation>Üdvözöljük a KeePassXC %1 verzióban!</translation> + </message> </context> <context> <name>main</name> <message> <source>Remove an entry from the database.</source> - <translation type="unfinished"/> + <translation>Egy bejegyzés eltávolítása az adatbázisból.</translation> </message> <message> <source>Path of the database.</source> @@ -3815,7 +4078,7 @@ Fel kell oldani a kijelölt adatbázist, vagy egy másik nem zároltat kell vál </message> <message> <source>Path of the entry to remove.</source> - <translation type="unfinished"/> + <translation>Az eltávolítandó bejegyzés útvonala.</translation> </message> <message> <source>KeePassXC - cross-platform password manager</source> @@ -3839,7 +4102,7 @@ Fel kell oldani a kijelölt adatbázist, vagy egy másik nem zároltat kell vál </message> <message> <source>Parent window handle</source> - <translation type="unfinished"/> + <translation>Szülőablak kezelése</translation> </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_id.ts b/share/translations/keepassx_id.ts index c31659692..dcd4a5b96 100644 --- a/share/translations/keepassx_id.ts +++ b/share/translations/keepassx_id.ts @@ -17,17 +17,13 @@ <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> <translation>KeePassXC didistribusikan di bawah GNU General Public License (GPL) versi 2 atau (terserah pilihan Anda) versi 3.</translation> </message> - <message> - <source>Project Maintainers:</source> - <translation>Pengelola Proyek:</translation> - </message> <message> <source>Contributors</source> <translation>Kontributor</translation> </message> <message> <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Lihat Semua Kontribusi pada GitHub</a></translation> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Lihat Semua Kontribusi di GitHub</a></translation> </message> <message> <source>Debug Info</source> @@ -71,6 +67,19 @@ Kernel: %3 %4</translation> <source>Enabled extensions:</source> <translation>Ekstensi aktif:</translation> </message> + <message> + <source>Project Maintainers:</source> + <translation>Pengelola Proyek:</translation> + </message> + <message> + <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Build Type: %1 +</source> + <translation type="unfinished"/> + </message> </context> <context> <name>AccessControlDialog</name> @@ -101,7 +110,7 @@ Silakan pilih apakah Anda ingin mengizinkannya.</translation> <name>AgentSettingsWidget</name> <message> <source>Enable SSH Agent (requires restart)</source> - <translation type="unfinished"/> + <translation>Aktifkan SSH Agent (butuh memulai ulang)</translation> </message> </context> <context> @@ -120,19 +129,19 @@ Silakan pilih apakah Anda ingin mengizinkannya.</translation> </message> <message> <source>The Syntax of your Auto-Type statement is incorrect!</source> - <translation type="unfinished"/> + <translation>Sintaksis perintah Ketik-Otomatis Anda salah!</translation> </message> <message> <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>Perintah Ketik-Otomatis ini berisi tundaan yang sangat lama. Apakah Anda benar-benar ingin melanjutkan?</translation> </message> <message> <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>Perintah Ktik-Otomatis ini berisi tindakan tekan tombol berdurasi sangat lambat. Apakah Anda benar-benar ingin melanjutkan?</translation> </message> <message> <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>Perintah Ketik-Otomatis ini berisi argumen yang diulang berkali-kali. Apakah Anda benar-benar ingin melanjutkan?</translation> </message> </context> <context> @@ -150,6 +159,25 @@ Silakan pilih apakah Anda ingin mengizinkannya.</translation> <translation>Urutan baku</translation> </message> </context> +<context> + <name>AutoTypeMatchModel</name> + <message> + <source>Group</source> + <translation>Grup</translation> + </message> + <message> + <source>Title</source> + <translation>Judul</translation> + </message> + <message> + <source>Username</source> + <translation>Nama pengguna</translation> + </message> + <message> + <source>Sequence</source> + <translation>Urutan</translation> + </message> +</context> <context> <name>AutoTypeSelectDialog</name> <message> @@ -165,7 +193,7 @@ Silakan pilih apakah Anda ingin mengizinkannya.</translation> <name>BrowserAccessControlDialog</name> <message> <source>KeePassXC-Browser Confirm Access</source> - <translation type="unfinished"/> + <translation>Konfirmasi Akses KeePassXC-Browser</translation> </message> <message> <source>Remember this decision</source> @@ -194,11 +222,11 @@ Silakan pilih apakah Anda ingin mengizinkannya.</translation> </message> <message> <source>This is required for accessing your databases with KeePassXC-Browser</source> - <translation type="unfinished"/> + <translation>Ini dibutuhkan untuk mengakses basis data Anda menggunakan KeePassXC-Browser</translation> </message> <message> <source>Enable KeepassXC browser integration</source> - <translation type="unfinished"/> + <translation>Aktifkan integrasi peramban KeePassXC</translation> </message> <message> <source>General</source> @@ -206,28 +234,28 @@ Silakan pilih apakah Anda ingin mengizinkannya.</translation> </message> <message> <source>Enable integration for these browsers:</source> - <translation type="unfinished"/> + <translation>Aktifkan integrasi untuk peramban ini:</translation> </message> <message> <source>&Google Chrome</source> - <translation type="unfinished"/> + <translation>&Google Chrome</translation> </message> <message> <source>&Firefox</source> - <translation type="unfinished"/> + <translation>&Firefox</translation> </message> <message> <source>&Chromium</source> - <translation type="unfinished"/> + <translation>&Chromium</translation> </message> <message> <source>&Vivaldi</source> - <translation type="unfinished"/> + <translation>&Vivaldi</translation> </message> <message> <source>Show a &notification when credentials are requested</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Tampilkan &notifikasi saat permintaan kredensial</translation> </message> <message> <source>Re&quest to unlock the database if it is locked</source> @@ -235,37 +263,37 @@ Silakan pilih apakah Anda ingin mengizinkannya.</translation> </message> <message> <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> - <translation type="unfinished"/> + <translation>Hanya entri dengan skema yang sama (http://, https://, ...).</translation> </message> <message> <source>&Match URL scheme (e.g., https://...)</source> - <translation type="unfinished"/> + <translation>&Cocok skema URL (mis., https://...)</translation> </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation type="unfinished"/> + <translation>Hanya tampilkan kecocokan terbaik untuk URL tertentu bukan semua entri untuk keseluruhan domain.</translation> </message> <message> <source>&Return only best-matching credentials</source> - <translation type="unfinished"/> + <translation>Hanya &tampilkan kredensial dengan kecocokan terbaik</translation> </message> <message> <source>Sort &matching credentials by title</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Urutkan kredensial yang &cocok berdasarkan judul</translation> </message> <message> <source>Sort matching credentials by &username</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Urutkan kredensial yang cocok berdasarkan &nama pengguna</translation> </message> <message> <source>&Disconnect all browsers</source> - <translation type="unfinished"/> + <translation>&Putuskan koneksi semua peramban</translation> </message> <message> <source>Forget all remembered &permissions</source> - <translation type="unfinished"/> + <translation>&Lupakan semua perizinan yang diingat</translation> </message> <message> <source>Advanced</source> @@ -274,21 +302,21 @@ Silakan pilih apakah Anda ingin mengizinkannya.</translation> <message> <source>Never &ask before accessing credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Jangan pernah ber&tanya sebelum mengakses kredensial</translation> </message> <message> <source>Never ask before &updating credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Jangan pernah bertanya sebelum memper&barui kredensial</translation> </message> <message> <source>Only the selected database has to be connected with a client.</source> - <translation type="unfinished"/> + <translation>Hanya basis data terpilih yang harus terkoneksi dengan klien.</translation> </message> <message> <source>Searc&h in all opened databases for matching credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Cari kredensial yang cocok di semua basis data yang terbuka</translation> </message> <message> <source>Automatically creating or updating string fields is not supported.</source> @@ -296,53 +324,53 @@ Silakan pilih apakah Anda ingin mengizinkannya.</translation> </message> <message> <source>&Return advanced string fields which start with "KPH: "</source> - <translation type="unfinished"/> + <translation>&Tampilkan ruas lema tingkat lanjut yang dimulai dengan "KPH: "</translation> </message> <message> <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> - <translation type="unfinished"/> + <translation>Otomatis perbarui jalur binari KeePassXC atau keepassxc-proxy ke skrip perpesanan native saat memulai.</translation> </message> <message> <source>Update &native messaging manifest files at startup</source> - <translation type="unfinished"/> + <translation>Perbarui berkas manifest perpesanan &native saat memulai</translation> </message> <message> <source>Support a proxy application between KeePassXC and browser extension.</source> - <translation type="unfinished"/> + <translation>Dukung aplikasi proksi antara KeePassXC dan ekstensi peramban.</translation> </message> <message> <source>Use a &proxy application between KeePassXC and browser extension</source> - <translation type="unfinished"/> + <translation>Gunakan aplikasi &proksi antara KeePassXC dan ekstensi peramban</translation> </message> <message> <source>Use a custom proxy location if you installed a proxy manually.</source> - <translation type="unfinished"/> + <translation>Gunakan lokasi proksi khusus jika Anda memasangnya secara manual.</translation> </message> <message> <source>Use a &custom proxy location</source> <comment>Meant is the proxy for KeePassXC-Browser</comment> - <translation type="unfinished"/> + <translation>Gunakan lokasi proksi &khusus</translation> </message> <message> <source>Browse...</source> <extracomment>Button for opening file dialog</extracomment> - <translation type="unfinished"/> + <translation>Telusuri...</translation> </message> <message> <source><b>Warning:</b> The following options can be dangerous!</source> - <translation type="unfinished"/> + <translation><b>Peringatan:</b> Opsi berikut bisa berbahaya!</translation> </message> <message> <source>Executable Files (*.exe);;All Files (*.*)</source> - <translation type="unfinished"/> + <translation>Berkas Executable (*.exe);;Semua Berkas (*.*)</translation> </message> <message> <source>Executable Files (*)</source> - <translation type="unfinished"/> + <translation>Berkas Executable (*)</translation> </message> <message> <source>Select custom proxy location</source> - <translation type="unfinished"/> + <translation>Pilih lokasi proksi khusus</translation> </message> </context> <context> @@ -356,11 +384,14 @@ Silakan pilih apakah Anda ingin mengizinkannya.</translation> If you would like to allow it access to your KeePassXC database, give it a unique name to identify and accept it.</source> - <translation type="unfinished"/> + <translation>Anda menerima permintaan asosiasi untuk kunci di atas. + +Jika Anda ingin mengizinkannya mengakses basis data KeePassXC Anda, +berikan nama yang unik untuk identifikasi dan terimalah.</translation> </message> <message> <source>Save and allow access</source> - <translation type="unfinished"/> + <translation>Simpan dan izinkan akses</translation> </message> <message> <source>KeePassXC: Overwrite existing key?</source> @@ -369,7 +400,8 @@ give it a unique name to identify and accept it.</source> <message> <source>A shared encryption key with the name "%1" already exists. Do you want to overwrite it?</source> - <translation type="unfinished"/> + <translation>Kunci enkripsi bersama dengan nama "%1" sudah ada. +Apakah Anda ingin menimpanya ulang?</translation> </message> <message> <source>KeePassXC: Update Entry</source> @@ -395,7 +427,7 @@ Silakan buka kunci atau pilih yang lainnya yang tidak terkunci.</translation> </message> <message> <source>The active database does not contain a settings entry.</source> - <translation type="unfinished"/> + <translation>Basis data yang aktif tidak berisi entri pengaturan.</translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -403,7 +435,7 @@ Silakan buka kunci atau pilih yang lainnya yang tidak terkunci.</translation> </message> <message> <source>No shared encryption keys found in KeePassXC Settings.</source> - <translation type="unfinished"/> + <translation>Tidak ditemukan kunci enkripsi bersama di dalam pengaturan KeePassXC.</translation> </message> <message> <source>KeePassXC: Removed keys from database</source> @@ -411,11 +443,11 @@ Silakan buka kunci atau pilih yang lainnya yang tidak terkunci.</translation> </message> <message numerus="yes"> <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>Berhasil membuang %n kunci enkripsi dari pengaturan KeePassXC.</numerusform></translation> </message> <message> <source>Removing stored permissions…</source> - <translation type="unfinished"/> + <translation>Membuang perizinan yang disimpan...</translation> </message> <message> <source>Abort</source> @@ -427,7 +459,7 @@ Silakan buka kunci atau pilih yang lainnya yang tidak terkunci.</translation> </message> <message numerus="yes"> <source>Successfully removed permissions from %n entry(s).</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>Berhasil membuang perizinan dari %n entri.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -512,14 +544,17 @@ Silakan buka kunci atau pilih yang lainnya yang tidak terkunci.</translation> </message> <message> <source>Legacy key file format</source> - <translation type="unfinished"/> + <translation>Format berkas kunci legacy</translation> </message> <message> <source>You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>Anda menggunakan format berkas kunci legacy yang +tidak akan lagi didukung di masa depan. + +Harap pertimbangkan membuat berkas kunci baru.</translation> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -553,11 +588,11 @@ Please consider generating a new key file.</source> </message> <message> <source>filename</source> - <translation>filename</translation> + <translation>nama berkas</translation> </message> <message> <source>size, rows, columns</source> - <translation>size, rows, columns</translation> + <translation>ukuran, baris, kolom</translation> </message> <message> <source>Encoding</source> @@ -569,7 +604,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Text is qualified by</source> - <translation type="unfinished"/> + <translation>Teks dikualifikasikan oleh</translation> </message> <message> <source>Fields are separated by</source> @@ -581,7 +616,7 @@ Please consider generating a new key file.</source> </message> <message> <source>First record has field names</source> - <translation type="unfinished"/> + <translation>Rekam pertama memiliki nama ruas</translation> </message> <message> <source>Number of headers line to discard</source> @@ -589,7 +624,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Consider '\' an escape character</source> - <translation type="unfinished"/> + <translation>Anggap '\' sebagai karakter escape</translation> </message> <message> <source>Preview</source> @@ -605,7 +640,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Empty fieldname </source> - <translation type="unfinished"/> + <translation>Nama ruas kosong</translation> </message> <message> <source>column </source> @@ -625,7 +660,7 @@ Please consider generating a new key file.</source> </message> <message> <source> more messages skipped]</source> - <translation type="unfinished"/> + <translation> pesan dilewati]</translation> </message> <message> <source>Error</source> @@ -634,7 +669,8 @@ Please consider generating a new key file.</source> <message> <source>CSV import: writer has errors: </source> - <translation type="unfinished"/> + <translation>Impor CSV: galat penulis: +</translation> </message> </context> <context> @@ -652,15 +688,15 @@ Please consider generating a new key file.</source> <name>CsvParserModel</name> <message numerus="yes"> <source>%n byte(s), </source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>%n byte, </numerusform></translation> </message> <message numerus="yes"> <source>%n row(s), </source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>%n baris, </numerusform></translation> </message> <message numerus="yes"> <source>%n column(s)</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>%n kolom</numerusform></translation> </message> </context> <context> @@ -699,18 +735,21 @@ Please consider generating a new key file.</source> </message> <message> <source>Legacy key file format</source> - <translation type="unfinished"/> + <translation>Format berkas kunci legacy</translation> </message> <message> <source>You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>Anda menggunakan format berkas kunci legacy yang +tidak akan lagi didukung di masa depan. + +Harap pertimbangkan membuat berkas kunci baru.</translation> </message> <message> <source>Don't show this warning again</source> - <translation type="unfinished"/> + <translation>Jangan tampilkan peringatan ini lagi</translation> </message> <message> <source>All files</source> @@ -770,7 +809,7 @@ Anda bisa menyimpannya sekarang.</translation> </message> <message> <source>Encryption</source> - <translation type="unfinished"/> + <translation>Enkripsi</translation> </message> <message> <source>Number of rounds too high</source> @@ -785,11 +824,11 @@ If you keep this number, your database may take hours or days (or even longer) t </message> <message> <source>Understood, keep number</source> - <translation type="unfinished"/> + <translation>Mengerti, tetap simpan</translation> </message> <message> <source>Cancel</source> - <translation type="unfinished"/> + <translation>Batal</translation> </message> <message> <source>Number of rounds too low</source> @@ -804,18 +843,28 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>KDF unchanged</source> - <translation type="unfinished"/> + <translation>KDF tidak berubah</translation> </message> <message> <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> - <translation type="unfinished"/> + <translation>Gagal mentransformasi kunci menggunakan parameter KDF baru; KDF tidak berubah.</translation> + </message> + <message numerus="yes"> + <source> MiB</source> + <comment>Abbreviation for Mebibytes (KDF settings)</comment> + <translation><numerusform> MiB</numerusform></translation> + </message> + <message numerus="yes"> + <source> thread(s)</source> + <comment>Threads for parallel execution (KDF settings)</comment> + <translation type="unfinished"><numerusform></numerusform></translation> </message> </context> <context> <name>DatabaseSettingsWidgetEncryption</name> <message> <source>Encryption Algorithm:</source> - <translation type="unfinished"/> + <translation>Algoritma Enkripsi:</translation> </message> <message> <source>AES: 256 Bit (default)</source> @@ -827,7 +876,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Key Derivation Function:</source> - <translation type="unfinished"/> + <translation>Fungsi Derivasi Kunci:</translation> </message> <message> <source>Transform rounds:</source> @@ -835,30 +884,22 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Benchmark 1-second delay</source> - <translation type="unfinished"/> + <translation>Tunda benchmark 1-detik</translation> </message> <message> <source>Memory Usage:</source> - <translation type="unfinished"/> - </message> - <message> - <source> MB</source> - <translation type="unfinished"/> + <translation>Penggunaan Memori:</translation> </message> <message> <source>Parallelism:</source> - <translation type="unfinished"/> - </message> - <message> - <source> thread</source> - <translation type="unfinished"/> + <translation>Paralelisme:</translation> </message> </context> <context> <name>DatabaseSettingsWidgetGeneral</name> <message> <source>Database Meta Data</source> - <translation type="unfinished"/> + <translation>Data Meta Basis Data</translation> </message> <message> <source>Database name:</source> @@ -874,7 +915,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>History Settings</source> - <translation type="unfinished"/> + <translation>Pengaturan Riwayat</translation> </message> <message> <source>Max. history items:</source> @@ -892,6 +933,14 @@ If you keep this number, your database may be too easy to crack!</source> <source>Use recycle bin</source> <translation>Gunakan keranjang sampah</translation> </message> + <message> + <source>Additional Database Settings</source> + <translation>Pengaturan Basis Data Tambahan</translation> + </message> + <message> + <source>Enable &compression (recommended)</source> + <translation>Aktifkan &kompresi (direkomendasikan)</translation> + </message> </context> <context> <name>DatabaseTabWidget</name> @@ -1014,6 +1063,16 @@ Otherwise your changes are lost.</source> Apakah Anda ingin menyimpan basis data sebelum menguncinya? Kalau tidak, ubahan Anda akan hilang.</translation> </message> + <message> + <source>Disable safe saves?</source> + <translation>Nonaktifkan penyimpanan aman?</translation> + </message> + <message> + <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</source> + <translation>KeePassXC telah beberapa kali gagal menyimpan basis data. Hal ini mungkin disebabkan oleh layanan sinkronisasi berkas yang menghalangi berkas yang akan disimpan. +Nonaktifkan penyimpanan aman dan coba lagi?</translation> + </message> </context> <context> <name>DatabaseWidget</name> @@ -1055,7 +1114,7 @@ Kalau tidak, ubahan Anda akan hilang.</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>Apakah Anda benar-benar ingin memindahkan %n entri ke keranjang sampah?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1099,7 +1158,7 @@ Kalau tidak, ubahan Anda akan hilang.</translation> </message> <message> <source>File has changed</source> - <translation type="unfinished"/> + <translation>Berkas telah berubah</translation> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -1112,7 +1171,8 @@ Kalau tidak, ubahan Anda akan hilang.</translation> <message> <source>The database file has changed and you have unsaved changes. Do you want to merge your changes?</source> - <translation type="unfinished"/> + <translation>Berkas basis data telah berubah dan Anda memiliki ubahan yang belum disimpan. +Apakah Anda ingin menggabungkan ubahan Anda?</translation> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -1126,12 +1186,16 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>Apakah Anda yakin ingin menghapus semuanya secara permanen dari keranjang sampah?</translation> </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DetailsWidget</name> <message> <source>Generate TOTP Token</source> - <translation type="unfinished"/> + <translation>Buat Token TOTP</translation> </message> <message> <source>Close</source> @@ -1151,7 +1215,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Expiration</source> - <translation type="unfinished"/> + <translation>Kedaluwarsa</translation> </message> <message> <source>Username</source> @@ -1159,15 +1223,15 @@ Do you want to merge your changes?</source> </message> <message> <source>Autotype</source> - <translation type="unfinished"/> + <translation>KetikOtomatis</translation> </message> <message> <source>Searching</source> - <translation type="unfinished"/> + <translation>Pencarian</translation> </message> <message> <source>Attributes</source> - <translation type="unfinished"/> + <translation>Atribut</translation> </message> <message> <source>Attachments</source> @@ -1195,19 +1259,19 @@ Do you want to merge your changes?</source> </message> <message> <source>Never</source> - <translation type="unfinished"/> + <translation>Tidak Pernah</translation> </message> <message> <source>[PROTECTED]</source> - <translation type="unfinished"/> + <translation>[DILINDUNGI]</translation> </message> <message> <source>Disabled</source> - <translation type="unfinished"/> + <translation>Dinonaktifkan</translation> </message> <message> <source>Enabled</source> - <translation type="unfinished"/> + <translation>Diaktifkan</translation> </message> </context> <context> @@ -1238,27 +1302,27 @@ Do you want to merge your changes?</source> </message> <message> <source>SSH Agent</source> - <translation type="unfinished"/> + <translation>SSH Agent</translation> </message> <message> <source>n/a</source> - <translation type="unfinished"/> + <translation>t/a</translation> </message> <message> <source>(encrypted)</source> - <translation type="unfinished"/> + <translation>(terenkripsi)</translation> </message> <message> <source>Select private key</source> - <translation type="unfinished"/> + <translation>Pilih kunci privat</translation> </message> <message> <source>File too large to be a private key</source> - <translation type="unfinished"/> + <translation>Berkas terlalu besar untuk jadi kunci privat</translation> </message> <message> <source>Failed to open private key</source> - <translation type="unfinished"/> + <translation>Gagal membuka kunci privat</translation> </message> <message> <source>Entry history</source> @@ -1290,11 +1354,11 @@ Do you want to merge your changes?</source> </message> <message> <source>[PROTECTED]</source> - <translation type="unfinished"/> + <translation>[DILINDUNGI]</translation> </message> <message> <source>Press reveal to view or edit</source> - <translation type="unfinished"/> + <translation>Tekan ungkap untuk melihat atau menyunting</translation> </message> <message> <source>Tomorrow</source> @@ -1302,16 +1366,28 @@ Do you want to merge your changes?</source> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>%n minggu</numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>%n bulan</numerusform></translation> </message> <message> <source>1 year</source> <translation>1 tahun</translation> </message> + <message> + <source>Apply generated password?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to apply the generated password to this entry?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAdvanced</name> @@ -1343,6 +1419,14 @@ Do you want to merge your changes?</source> <source>Attachments</source> <translation>Lampiran</translation> </message> + <message> + <source>Foreground Color:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Background Color:</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -1375,12 +1459,8 @@ Do you want to merge your changes?</source> <translation>Judul jendela:</translation> </message> <message> - <source>Use default se&quence</source> - <translation>Gunakan uru&tan bawaan</translation> - </message> - <message> - <source>Set custo&m sequence:</source> - <translation>Tetapkan urutan &khusus:</translation> + <source>Use a specific sequence for this association:</source> + <translation type="unfinished"/> </message> </context> <context> @@ -1430,7 +1510,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Toggle the checkbox to reveal the notes section.</source> - <translation type="unfinished"/> + <translation>Pilih kotak centang untuk mengungkap bagian catatan.</translation> </message> <message> <source>Username:</source> @@ -1449,39 +1529,39 @@ Do you want to merge your changes?</source> </message> <message> <source>Remove key from agent after</source> - <translation type="unfinished"/> + <translation>Buang kunci dari agent setelah</translation> </message> <message> <source> seconds</source> - <translation type="unfinished"/> + <translation>detik</translation> </message> <message> <source>Fingerprint</source> - <translation type="unfinished"/> + <translation>Tanda tangan</translation> </message> <message> <source>Remove key from agent when database is closed/locked</source> - <translation type="unfinished"/> + <translation>Buang kunci dari agent saat basis data ditutup/dikunci</translation> </message> <message> <source>Public key</source> - <translation type="unfinished"/> + <translation>Kunci publik</translation> </message> <message> <source>Add key to agent when database is opened/unlocked</source> - <translation type="unfinished"/> + <translation>Tambahkan kunci ke agent saat basis data dibuka/tak terkunci</translation> </message> <message> <source>Comment</source> - <translation type="unfinished"/> + <translation>Komentar</translation> </message> <message> <source>Decrypt</source> - <translation type="unfinished"/> + <translation>Dekripsi</translation> </message> <message> <source>n/a</source> - <translation type="unfinished"/> + <translation>t/a</translation> </message> <message> <source>Copy to clipboard</source> @@ -1489,32 +1569,32 @@ Do you want to merge your changes?</source> </message> <message> <source>Private key</source> - <translation type="unfinished"/> + <translation>Kunci privat</translation> </message> <message> <source>External file</source> - <translation type="unfinished"/> + <translation>Berkas eksternal</translation> </message> <message> <source>Browse...</source> <extracomment>Button for opening file dialog</extracomment> - <translation type="unfinished"/> + <translation>Telusuri...</translation> </message> <message> <source>Attachment</source> - <translation type="unfinished"/> + <translation>Lampiran</translation> </message> <message> <source>Add to agent</source> - <translation type="unfinished"/> + <translation>Tambahkan ke agent</translation> </message> <message> <source>Remove from agent</source> - <translation type="unfinished"/> + <translation>Buang dari agent</translation> </message> <message> <source>Require user confirmation when this key is used</source> - <translation type="unfinished"/> + <translation>Membutuhkan konfirmasi pengguna saat kunci ini digunakan</translation> </message> </context> <context> @@ -1631,7 +1711,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Custom icon already exists</source> - <translation type="unfinished"/> + <translation>Ikon khusus sudah ada</translation> </message> <message> <source>Confirm Delete</source> @@ -1660,6 +1740,31 @@ Do you want to merge your changes?</source> <source>Uuid:</source> <translation>Uuid:</translation> </message> + <message> + <source>Plugin Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove</source> + <translation>Buang</translation> + </message> + <message> + <source>Delete plugin data?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Value</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Entry</name> @@ -1677,7 +1782,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Size</source> - <translation type="unfinished"/> + <translation>Ukuran</translation> </message> </context> <context> @@ -1704,11 +1809,11 @@ Do you want to merge your changes?</source> </message> <message> <source>Select files</source> - <translation type="unfinished"/> + <translation>Pilih berkas</translation> </message> <message numerus="yes"> <source>Are you sure you want to remove %n attachment(s)?</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>Apakah Anda yakin ingin membuang %n lampiran?</numerusform></translation> </message> <message> <source>Confirm Remove</source> @@ -1716,40 +1821,45 @@ Do you want to merge your changes?</source> </message> <message> <source>Save attachments</source> - <translation type="unfinished"/> + <translation>Simpan lampiran</translation> </message> <message> <source>Unable to create directory: %1</source> - <translation type="unfinished"/> + <translation>Tidak bisa membuat direktori: +%1</translation> </message> <message> <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> - <translation type="unfinished"/> + <translation>Apakah Anda yakin ingin menimpa ulang berkas "%1" yang ada dengan berkas lampiran?</translation> </message> <message> <source>Confirm overwrite</source> - <translation type="unfinished"/> + <translation>Konfirmasi menimpa ulang</translation> </message> <message> <source>Unable to save attachments: %1</source> - <translation type="unfinished"/> + <translation>Tidak bisa menyimpan lampiran: +%1</translation> </message> <message> <source>Unable to open attachment: %1</source> - <translation type="unfinished"/> + <translation>Tidak bisa membuka lampiran: +%1</translation> </message> <message> <source>Unable to open attachments: %1</source> - <translation type="unfinished"/> + <translation>Tidak bisa membuka lampiran: +%1</translation> </message> <message> <source>Unable to open files: %1</source> - <translation type="unfinished"/> + <translation>Tidak bisa membuka berkas: +%1</translation> </message> </context> <context> @@ -1801,6 +1911,65 @@ Do you want to merge your changes?</source> <source>URL</source> <translation>URL</translation> </message> + <message> + <source>Never</source> + <translation>Tidak Pernah</translation> + </message> + <message> + <source>Password</source> + <translation>Sandi</translation> + </message> + <message> + <source>Notes</source> + <translation>Catatan</translation> + </message> + <message> + <source>Expires</source> + <translation>Kedaluwarsa</translation> + </message> + <message> + <source>Created</source> + <translation>Dibuat</translation> + </message> + <message> + <source>Modified</source> + <translation>Diubah</translation> + </message> + <message> + <source>Accessed</source> + <translation>Diakses</translation> + </message> + <message> + <source>Attachments</source> + <translation>Lampiran</translation> + </message> +</context> +<context> + <name>EntryView</name> + <message> + <source>Customize View</source> + <translation>Ubahsuai Tampilan</translation> + </message> + <message> + <source>Hide Usernames</source> + <translation>Sembunyikan Nama Pengguna</translation> + </message> + <message> + <source>Hide Passwords</source> + <translation>Sembunyikan Sandi</translation> + </message> + <message> + <source>Fit to window</source> + <translation>Paskan ke jendela</translation> + </message> + <message> + <source>Fit to contents</source> + <translation>Paskan ke konten</translation> + </message> + <message> + <source>Reset to defaults</source> + <translation>Kembalikan ke setelan bawaan</translation> + </message> </context> <context> <name>Group</name> @@ -1813,11 +1982,11 @@ Do you want to merge your changes?</source> <name>HostInstaller</name> <message> <source>KeePassXC: Cannot save file!</source> - <translation type="unfinished"/> + <translation>KeePassXC: Tidak bisa menyimpan berkas!</translation> </message> <message> <source>Cannot save the native messaging script file.</source> - <translation type="unfinished"/> + <translation>Tidak bisa menyimpan berkas perpesanan native.</translation> </message> </context> <context> @@ -1870,6 +2039,10 @@ Do you want to merge your changes?</source> <source>Ensure that the password contains characters from every group</source> <translation>Pastikan sandi berisi karakter dari setiap grup</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>ASCII Lanjutan</translation> + </message> </context> <context> <name>KMessageWidget</name> @@ -1912,7 +2085,7 @@ Do you want to merge your changes?</source> <name>Kdbx4Reader</name> <message> <source>missing database headers</source> - <translation type="unfinished"/> + <translation>kehilangan tajuk basis data</translation> </message> <message> <source>Unable to calculate master key</source> @@ -1920,43 +2093,43 @@ Do you want to merge your changes?</source> </message> <message> <source>Invalid header checksum size</source> - <translation type="unfinished"/> + <translation>Ukuran checksum tajuk tidak valid</translation> </message> <message> <source>Header SHA256 mismatch</source> - <translation type="unfinished"/> + <translation>Tajuk SHA256 tidak cocok</translation> </message> <message> <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> - <translation type="unfinished"/> + <translation>Kunci salah atau berkas basis data rusak. (HMAC tidak cocok)</translation> </message> <message> <source>Unknown cipher</source> - <translation type="unfinished"/> + <translation>Cipher tidak dikenal</translation> </message> <message> <source>Invalid header id size</source> - <translation type="unfinished"/> + <translation>Ukuran id tajuk tidak valid</translation> </message> <message> <source>Invalid header field length</source> - <translation type="unfinished"/> + <translation>Panjang ruas tajuk tidak valid</translation> </message> <message> <source>Invalid header data length</source> - <translation type="unfinished"/> + <translation>Panjang data tajuk tidak valid</translation> </message> <message> <source>Failed to open buffer for KDF parameters in header</source> - <translation type="unfinished"/> + <translation>Gagal membuka buffer untuk parameter KDF di dalam tajuk</translation> </message> <message> <source>Unsupported key derivation function (KDF) or invalid parameters</source> - <translation type="unfinished"/> + <translation>Fungsi derivasi kunci tidak didukung (KDF) atau parameter tidak valid</translation> </message> <message> <source>Legacy header fields found in KDBX4 file.</source> - <translation type="unfinished"/> + <translation>Ditemukan ruas tajuk legacy di dalam berkas KDBX4.</translation> </message> <message> <source>Invalid inner header id size</source> @@ -1973,74 +2146,74 @@ Do you want to merge your changes?</source> <message> <source>Unsupported KeePass variant map version.</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Versi map variasi KeePass tidak didukung.</translation> </message> <message> <source>Invalid variant map entry name length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Panjang nama entri map variasi tidak valid</translation> </message> <message> <source>Invalid variant map entry name data</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Data nama entri map variasi tidak valid</translation> </message> <message> <source>Invalid variant map entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Panjang nilai entri map variasi tidak valid</translation> </message> <message> <source>Invalid variant map entry value data</source> <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Data nilai entri map variasi tidak valid</translation> </message> <message> <source>Invalid variant map Bool entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Panjang nilai entri Bool map variasi tidak valid</translation> </message> <message> <source>Invalid variant map Int32 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Panjang nilai entri Int32 map variasi tidak valid</translation> </message> <message> <source>Invalid variant map UInt32 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Panjang nilai entri UInt32 map variasi tidak valid</translation> </message> <message> <source>Invalid variant map Int64 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Panjang nilai entri Int64 map variasi tidak valid</translation> </message> <message> <source>Invalid variant map UInt64 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Panjang nilai entri UInt64 map variasi tidak valid</translation> </message> <message> <source>Invalid variant map entry type</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Tipe entri map variasi tidak valid</translation> </message> <message> <source>Invalid variant map field type size</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Ukuran tipe entri map variasi tidak valid</translation> </message> </context> <context> <name>Kdbx4Writer</name> <message> <source>Invalid symmetric cipher algorithm.</source> - <translation type="unfinished"/> + <translation>Algoritma cipher simetrik tidak valid.</translation> </message> <message> <source>Invalid symmetric cipher IV size.</source> <comment>IV = Initialization Vector for symmetric cipher</comment> - <translation type="unfinished"/> + <translation>Ukuran cipher IV simetrik tidak valid.</translation> </message> <message> <source>Unable to calculate master key</source> @@ -2049,18 +2222,18 @@ Do you want to merge your changes?</source> <message> <source>Failed to serialize KDF parameters variant map</source> <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Gagal menserialisasi map variasi parameter KDF</translation> </message> </context> <context> <name>KdbxReader</name> <message> <source>Invalid cipher uuid length</source> - <translation type="unfinished"/> + <translation>Panjang uuid cipher tidak valid</translation> </message> <message> <source>Unsupported cipher</source> - <translation type="unfinished"/> + <translation>Cipher tidak didukung</translation> </message> <message> <source>Invalid compression flags length</source> @@ -2068,7 +2241,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Unsupported compression algorithm</source> - <translation type="unfinished"/> + <translation>Algoritma kompresi tidak didukung</translation> </message> <message> <source>Invalid master seed size</source> @@ -2084,11 +2257,11 @@ Do you want to merge your changes?</source> </message> <message> <source>Invalid start bytes size</source> - <translation type="unfinished"/> + <translation>Ukuran byte awal tidak valid</translation> </message> <message> <source>Invalid random stream id size</source> - <translation type="unfinished"/> + <translation>Ukuran id stream acak tidak valid</translation> </message> <message> <source>Invalid inner random stream cipher</source> @@ -2110,131 +2283,131 @@ Ini adalah migrasi satu arah. Anda tidak akan bisa membuka basis data yang diimp </message> <message> <source>Unsupported KeePass 2 database version.</source> - <translation type="unfinished"/> + <translation>Versi basis data KeePass 2 tidak didukung.</translation> </message> </context> <context> <name>KdbxXmlReader</name> <message> <source>XML parsing failure: %1</source> - <translation type="unfinished"/> + <translation>Gagal mengurai XML: %1</translation> </message> <message> <source>No root group</source> - <translation type="unfinished"/> + <translation>Tidak ada grup root</translation> </message> <message> <source>Missing icon uuid or data</source> - <translation type="unfinished"/> + <translation>Kehilangan data atau uuid ikon</translation> </message> <message> <source>Missing custom data key or value</source> - <translation type="unfinished"/> + <translation>Kehilangan nilai atau kunci data khusus</translation> </message> <message> <source>Multiple group elements</source> - <translation type="unfinished"/> + <translation>Beberapa elemen grup</translation> </message> <message> <source>Null group uuid</source> - <translation type="unfinished"/> + <translation>Uuid grup null</translation> </message> <message> <source>Invalid group icon number</source> - <translation type="unfinished"/> + <translation>Nomor ikon grup tidak valid</translation> </message> <message> <source>Invalid EnableAutoType value</source> - <translation type="unfinished"/> + <translation>Nilai EnableAutoType tidak valid</translation> </message> <message> <source>Invalid EnableSearching value</source> - <translation type="unfinished"/> + <translation>Nilai EnableSearching tidak valid</translation> </message> <message> <source>No group uuid found</source> - <translation type="unfinished"/> + <translation>Tidak ditemukan uuid grup</translation> </message> <message> <source>Null DeleteObject uuid</source> - <translation type="unfinished"/> + <translation>Uuid DeleteObject null</translation> </message> <message> <source>Missing DeletedObject uuid or time</source> - <translation type="unfinished"/> + <translation>Kehilangan waktu atau uuid DeletedObject</translation> </message> <message> <source>Null entry uuid</source> - <translation type="unfinished"/> + <translation>Uuid entri null</translation> </message> <message> <source>Invalid entry icon number</source> - <translation type="unfinished"/> + <translation>Nomor ikon entri tidak valid</translation> </message> <message> <source>History element in history entry</source> - <translation type="unfinished"/> + <translation>Elemen riwayat di dalam entri riwayat</translation> </message> <message> <source>No entry uuid found</source> - <translation type="unfinished"/> + <translation>Tidak ditemukan uuid entri</translation> </message> <message> <source>History element with different uuid</source> - <translation type="unfinished"/> + <translation>Elemen riwayat dengan uuid yang berbeda</translation> </message> <message> <source>Unable to decrypt entry string</source> - <translation type="unfinished"/> + <translation>Tidak bisa mendekripsi lema entri</translation> </message> <message> <source>Duplicate custom attribute found</source> - <translation type="unfinished"/> + <translation>Ditemukan atribut khusus ganda</translation> </message> <message> <source>Entry string key or value missing</source> - <translation type="unfinished"/> + <translation>Kehilangan nilai atau kunci lema entri</translation> </message> <message> <source>Duplicate attachment found</source> - <translation type="unfinished"/> + <translation>Ditemukan lampiran ganda</translation> </message> <message> <source>Entry binary key or value missing</source> - <translation type="unfinished"/> + <translation>Kehilangan nilai atau kunci binari entri</translation> </message> <message> <source>Auto-type association window or sequence missing</source> - <translation type="unfinished"/> + <translation>Kehilangan asosiasi jendela atau urutan ketik-otomatis</translation> </message> <message> <source>Invalid bool value</source> - <translation type="unfinished"/> + <translation>Nilai bool tidak valid</translation> </message> <message> <source>Invalid date time value</source> - <translation type="unfinished"/> + <translation>Waktu tanggal tidak valid</translation> </message> <message> <source>Invalid color value</source> - <translation type="unfinished"/> + <translation>Warna tidak valid</translation> </message> <message> <source>Invalid color rgb part</source> - <translation type="unfinished"/> + <translation>Warna rgb tidak valid</translation> </message> <message> <source>Invalid number value</source> - <translation type="unfinished"/> + <translation>Angka tidak valid</translation> </message> <message> <source>Invalid uuid value</source> - <translation type="unfinished"/> + <translation>Uuid tidak valid</translation> </message> <message> <source>Unable to decompress binary</source> <extracomment>Translator meant is a binary data inside an entry</extracomment> - <translation type="unfinished"/> + <translation>Tidak bisa mengurai kompresi binari</translation> </message> </context> <context> @@ -2269,19 +2442,19 @@ Ini adalah migrasi satu arah. Anda tidak akan bisa membuka basis data yang diimp <message> <source>Unable to read encryption IV</source> <comment>IV = Initialization Vector for symmetric cipher</comment> - <translation type="unfinished"/> + <translation>Tidak bisa membaca enkripsi IV</translation> </message> <message> <source>Invalid number of groups</source> - <translation type="unfinished"/> + <translation>Jumlah grup tidak valid</translation> </message> <message> <source>Invalid number of entries</source> - <translation type="unfinished"/> + <translation>Jumlah entri tidak valid</translation> </message> <message> <source>Invalid content hash size</source> - <translation type="unfinished"/> + <translation>Ukuran hash konten tidak valid</translation> </message> <message> <source>Invalid transform seed size</source> @@ -2309,95 +2482,95 @@ Ini adalah migrasi satu arah. Anda tidak akan bisa membuka basis data yang diimp </message> <message> <source>Key transformation failed</source> - <translation type="unfinished"/> + <translation>Transformasi kunci gagal</translation> </message> <message> <source>Invalid group field type number</source> - <translation type="unfinished"/> + <translation>Angka tipe ruas grup tidak valid</translation> </message> <message> <source>Invalid group field size</source> - <translation type="unfinished"/> + <translation>Ukuran ruas grup tidak valid</translation> </message> <message> <source>Read group field data doesn't match size</source> - <translation type="unfinished"/> + <translation>Data ruas grup baca tidak cocok dengan ukurannya</translation> </message> <message> <source>Incorrect group id field size</source> - <translation type="unfinished"/> + <translation>Ukuran ruas id grup salah</translation> </message> <message> <source>Incorrect group creation time field size</source> - <translation type="unfinished"/> + <translation>Ukuran ruas waktu pembuatan grup salah</translation> </message> <message> <source>Incorrect group modification time field size</source> - <translation type="unfinished"/> + <translation>Ukuran ruas waktu perubahan grup salah</translation> </message> <message> <source>Incorrect group access time field size</source> - <translation type="unfinished"/> + <translation>Ukuran ruas waktu akses grup salah</translation> </message> <message> <source>Incorrect group expiry time field size</source> - <translation type="unfinished"/> + <translation>Ukuran ruas waktu kedaluwarsa grup salah</translation> </message> <message> <source>Incorrect group icon field size</source> - <translation type="unfinished"/> + <translation>Ukuran ruas ikon grup salah</translation> </message> <message> <source>Incorrect group level field size</source> - <translation type="unfinished"/> + <translation>Ukuran ruas level grup salah</translation> </message> <message> <source>Invalid group field type</source> - <translation type="unfinished"/> + <translation>Tipe ruas grup tidak valid</translation> </message> <message> <source>Missing group id or level</source> - <translation type="unfinished"/> + <translation>Kehilangan level atau id grup</translation> </message> <message> <source>Missing entry field type number</source> - <translation type="unfinished"/> + <translation>Kehilangan nomor tipe ruas entri</translation> </message> <message> <source>Invalid entry field size</source> - <translation type="unfinished"/> + <translation>Ukuran ruas entri tidak valid</translation> </message> <message> <source>Read entry field data doesn't match size</source> - <translation type="unfinished"/> + <translation>Data ruas entri baca tidak cocok dengan ukurannya</translation> </message> <message> <source>Invalid entry uuid field size</source> - <translation type="unfinished"/> + <translation>Ukuran ruas uuid entri tidak valid</translation> </message> <message> <source>Invalid entry group id field size</source> - <translation type="unfinished"/> + <translation>Ukuran ruas id grup entri tidak valid</translation> </message> <message> <source>Invalid entry icon field size</source> - <translation type="unfinished"/> + <translation>Ukuran ruas ikon entri tidak valid</translation> </message> <message> <source>Invalid entry creation time field size</source> - <translation type="unfinished"/> + <translation>Ukuran ruas waktu pembuatan entri tidak valid</translation> </message> <message> <source>Invalid entry modification time field size</source> - <translation type="unfinished"/> + <translation>Ukuran ruas waktu perubahan entri tidak valid</translation> </message> <message> <source>Invalid entry expiry time field size</source> - <translation type="unfinished"/> + <translation>Ukuran ruas waktu kedaluwarsa entri tidak valid</translation> </message> <message> <source>Invalid entry field type</source> - <translation type="unfinished"/> + <translation>Tipe ruas entri tidak valid</translation> </message> </context> <context> @@ -2451,7 +2624,7 @@ Ini adalah migrasi satu arah. Anda tidak akan bisa membuka basis data yang diimp </message> <message> <source>Time-based one-time password</source> - <translation type="unfinished"/> + <translation>Sandi sekali berdasar waktu</translation> </message> <message> <source>&Groups</source> @@ -2579,7 +2752,7 @@ Ini adalah migrasi satu arah. Anda tidak akan bisa membuka basis data yang diimp </message> <message> <source>Copy title to clipboard</source> - <translation type="unfinished"/> + <translation>Salin judul ke papan klip</translation> </message> <message> <source>&URL</source> @@ -2587,7 +2760,7 @@ Ini adalah migrasi satu arah. Anda tidak akan bisa membuka basis data yang diimp </message> <message> <source>Copy URL to clipboard</source> - <translation type="unfinished"/> + <translation>Salin URL ke papan klip</translation> </message> <message> <source>&Notes</source> @@ -2595,7 +2768,7 @@ Ini adalah migrasi satu arah. Anda tidak akan bisa membuka basis data yang diimp </message> <message> <source>Copy notes to clipboard</source> - <translation type="unfinished"/> + <translation>Salin catatan ke papan klip</translation> </message> <message> <source>&Export to CSV file...</source> @@ -2627,7 +2800,7 @@ Ini adalah migrasi satu arah. Anda tidak akan bisa membuka basis data yang diimp </message> <message> <source>E&mpty recycle bin</source> - <translation type="unfinished"/> + <translation>Kosongkan keranjang sa&mpah</translation> </message> <message> <source>Clear history</source> @@ -2639,7 +2812,7 @@ Ini adalah migrasi satu arah. Anda tidak akan bisa membuka basis data yang diimp </message> <message> <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> - <translation type="unfinished"/> + <translation><p>Sepertinya Anda menggunakan KeePassHTTP untuk integrasi peramban. Fitur ini tidak berlaku lagi dan akan dibuang di masa depan.<br>Silakan beralih ke KeePassXC-Browser! Untuk bantuan migrasi, kunjungi <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">panduan migrasi</a> kami (peringatan %1 of 3).</p></translation> </message> <message> <source>read-only</source> @@ -2681,28 +2854,32 @@ Ini adalah migrasi satu arah. Anda tidak akan bisa membuka basis data yang diimp <source>Please touch the button on your YubiKey!</source> <translation>Silakan sentuh tombol pada YubiKey Anda!</translation> </message> + <message> + <source>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</source> + <translation>PERINGATAN! Anda menggunakan versi tidak stabil dari KeePassXC! +Tinggi kemungkinan terjadi kerusakan, harap kelola salinan basis data anda dengan baik. +Versi ini tidak dimaksudkan untuk penggunaan sehari-hari.</translation> + </message> </context> <context> <name>OpenSSHKey</name> <message> <source>Invalid key file, expecting an OpenSSH key</source> - <translation type="unfinished"/> + <translation>Berkas kunci tidak valid, mengharapkan kunci OpenSSH</translation> </message> <message> <source>PEM boundary mismatch</source> - <translation type="unfinished"/> - </message> - <message> - <source>This is not an OpenSSH key, only modern keys are supported</source> - <translation type="unfinished"/> + <translation>PEM boundary tidak cocok.</translation> </message> <message> <source>Base64 decoding failed</source> - <translation type="unfinished"/> + <translation>Dekode base64 gagal</translation> </message> <message> <source>Key file way too small.</source> - <translation type="unfinished"/> + <translation>Berkas kunci terlalu kecil.</translation> </message> <message> <source>Key file magic header id invalid</source> @@ -2710,71 +2887,79 @@ Ini adalah migrasi satu arah. Anda tidak akan bisa membuka basis data yang diimp </message> <message> <source>Found zero keys</source> - <translation type="unfinished"/> + <translation>Tidak ada key yang ditemukan</translation> </message> <message> <source>Failed to read public key.</source> - <translation type="unfinished"/> + <translation>Gagal membaca kunci publik.</translation> </message> <message> <source>Corrupted key file, reading private key failed</source> - <translation type="unfinished"/> + <translation>Berkas kunci rusak, gagal membaca kunci privat</translation> </message> <message> <source>No private key payload to decrypt</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown cipher: </source> - <translation type="unfinished"/> + <translation>Tidak ada isi dari private key untuk didekripsi</translation> </message> <message> <source>Trying to run KDF without cipher</source> - <translation type="unfinished"/> + <translation>Mencoba menjalankan KDF tanpa cipher</translation> </message> <message> <source>Passphrase is required to decrypt this key</source> - <translation type="unfinished"/> + <translation>Membutuhkan frasa sandi untuk mendekripsi kunci ini</translation> </message> <message> <source>Key derivation failed, key file corrupted?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown KDF: </source> - <translation type="unfinished"/> + <translation>Derivasi kunci gagal, berkas kunci rusak?</translation> </message> <message> <source>Decryption failed, wrong passphrase?</source> - <translation type="unfinished"/> + <translation>Dekripsi gagal, frasa sandi salah?</translation> </message> <message> <source>Unexpected EOF while reading public key</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown key type: </source> - <translation type="unfinished"/> + <translation>EOF yang tidak terduga saat membaca kunci publik</translation> </message> <message> <source>Unexpected EOF while reading private key</source> - <translation type="unfinished"/> + <translation>EOF yang tidak terduga saat membaca kunci privat</translation> </message> <message> <source>Can't write public key as it is empty</source> - <translation type="unfinished"/> + <translation>Tidak bisa membuat public key karena tidak ada isinya</translation> </message> <message> <source>Unexpected EOF when writing public key</source> - <translation type="unfinished"/> + <translation>EOF yang tidak terduga saat menulis kunci publik</translation> </message> <message> <source>Can't write private key as it is empty</source> - <translation type="unfinished"/> + <translation>Tidak bisa membuat private key karena tidak ada isinya</translation> </message> <message> <source>Unexpected EOF when writing private key</source> - <translation type="unfinished"/> + <translation>EOF yang tidak terduga saat menulis kunci privat</translation> + </message> + <message> + <source>Unsupported key type: %1</source> + <translation>Jenis key tidak didukung: %1</translation> + </message> + <message> + <source>Unknown cipher: %1</source> + <translation>Cipher tidak diketahui: %1</translation> + </message> + <message> + <source>Cipher IV is too short for MD5 kdf</source> + <translation>Cipher IV terlalu pendek untuk MD5 kdf</translation> + </message> + <message> + <source>Unknown KDF: %1</source> + <translation>KDF tidak diketahui: %1</translation> + </message> + <message> + <source>Unknown key type: %1</source> + <translation>Jenis key tidak diketahui: %1</translation> </message> </context> <context> @@ -2802,11 +2987,11 @@ Ini adalah migrasi satu arah. Anda tidak akan bisa membuka basis data yang diimp </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation type="unfinished"/> + <translation>Hanya tampilkan kecocokan terbaik untuk URL tertentu bukan semua entri untuk keseluruhan domain.</translation> </message> <message> <source>&Return only best matching entries</source> - <translation type="unfinished"/> + <translation>Hanya &tampilkan entri dengan kecocokan terbaik</translation> </message> <message> <source>Re&quest to unlock the database if it is locked</source> @@ -2814,7 +2999,7 @@ Ini adalah migrasi satu arah. Anda tidak akan bisa membuka basis data yang diimp </message> <message> <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation type="unfinished"/> + <translation>Hanya entri dengan skema yang sama (http://, https://, ftp://, ...) yang ditampilkan.</translation> </message> <message> <source>&Match URL schemes</source> @@ -2854,7 +3039,7 @@ Ini adalah migrasi satu arah. Anda tidak akan bisa membuka basis data yang diimp </message> <message> <source>Only the selected database has to be connected with a client.</source> - <translation type="unfinished"/> + <translation>Hanya basis data terpilih yang harus terkoneksi dengan klien.</translation> </message> <message> <source>Searc&h in all opened databases for matching entries</source> @@ -2866,7 +3051,7 @@ Ini adalah migrasi satu arah. Anda tidak akan bisa membuka basis data yang diimp </message> <message> <source>&Return advanced string fields which start with "KPH: "</source> - <translation type="unfinished"/> + <translation>&Tampilkan ruas lema tingkat lanjut yang dimulai dengan "KPH: "</translation> </message> <message> <source>HTTP Port:</source> @@ -2882,11 +3067,11 @@ Ini adalah migrasi satu arah. Anda tidak akan bisa membuka basis data yang diimp </message> <message> <source><b>Warning:</b> The following options can be dangerous!</source> - <translation type="unfinished"/> + <translation><b>Peringatan:</b> Opsi berikut bisa berbahaya!</translation> </message> <message> <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> - <translation type="unfinished"/> + <translation><p>KeePassHTTP sudah tidak berlaku lagi dan akan dibuang di masa depan.<br>Silakan beralih ke KeePassXC-Browser! Untuk bantuan migrasi, kunjungi <a href="https://keepassxc.org/docs/keepassxc-browser-migration">panduan migrasi</a>kami.</p></translation> </message> <message> <source>Cannot bind to privileged ports</source> @@ -2895,7 +3080,8 @@ Ini adalah migrasi satu arah. Anda tidak akan bisa membuka basis data yang diimp <message> <source>Cannot bind to privileged ports below 1024! Using default port 19455.</source> - <translation type="unfinished"/> + <translation>Tidak bisa mengkoneksi ke port dibawah 1024! +Menggunakan port bawaan 19455.</translation> </message> </context> <context> @@ -3026,11 +3212,11 @@ Using default port 19455.</source> <name>QObject</name> <message> <source>Database not opened</source> - <translation type="unfinished"/> + <translation>Basis data tidak terbuka</translation> </message> <message> <source>Database hash not available</source> - <translation type="unfinished"/> + <translation>Hash basis data tidak tersedia</translation> </message> <message> <source>Client public key not received</source> @@ -3038,59 +3224,59 @@ Using default port 19455.</source> </message> <message> <source>Cannot decrypt message</source> - <translation type="unfinished"/> + <translation>Tidak bisa mendekripsi pesan</translation> </message> <message> <source>Timeout or cannot connect to KeePassXC</source> - <translation type="unfinished"/> + <translation>Terputus atau tidak bisa menyambung ke KeePassXC</translation> </message> <message> <source>Action cancelled or denied</source> - <translation type="unfinished"/> + <translation>Tindakan dibatalkan atau ditolak</translation> </message> <message> <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> - <translation type="unfinished"/> + <translation>Tidak bisa mengenkripsi pesan atau kunci publik tidak ditemukan. Apakah Perpesanan Native diaktifkan di dalam KeePassXC?</translation> </message> <message> <source>KeePassXC association failed, try again</source> - <translation type="unfinished"/> + <translation>Asosiasi KeePassXC gagal, coba lagi</translation> </message> <message> <source>Key change was not successful</source> - <translation type="unfinished"/> + <translation>Perubahan kunci tidak berhasil</translation> </message> <message> <source>Encryption key is not recognized</source> - <translation type="unfinished"/> + <translation>Kunci enkripsi tidak dikenali</translation> </message> <message> <source>No saved databases found</source> - <translation type="unfinished"/> + <translation>Tidak ditemukan basis data tersimpan</translation> </message> <message> <source>Incorrect action</source> - <translation type="unfinished"/> + <translation>Tindakan salah</translation> </message> <message> <source>Empty message received</source> - <translation type="unfinished"/> + <translation>Pesan kosong diterima</translation> </message> <message> <source>No URL provided</source> - <translation type="unfinished"/> + <translation>URL tidak ada</translation> </message> <message> <source>No logins found</source> - <translation type="unfinished"/> + <translation>Tidak ditemukan log masuk</translation> </message> <message> <source>Unknown error</source> - <translation type="unfinished"/> + <translation>Galat tidak diketahui</translation> </message> <message> <source>Add a new entry to a database.</source> - <translation type="unfinished"/> + <translation>Tambahkan entri baru ke basis data.</translation> </message> <message> <source>Path of the database.</source> @@ -3098,23 +3284,23 @@ Using default port 19455.</source> </message> <message> <source>Key file of the database.</source> - <translation type="unfinished"/> + <translation>Berkas kunci dari basis data.</translation> </message> <message> <source>path</source> - <translation type="unfinished"/> + <translation>jalur</translation> </message> <message> <source>Username for the entry.</source> - <translation type="unfinished"/> + <translation>Nama pengguna untuk entri.</translation> </message> <message> <source>username</source> - <translation type="unfinished"/> + <translation>nama pengguna</translation> </message> <message> <source>URL for the entry.</source> - <translation type="unfinished"/> + <translation>URL untuk entri.</translation> </message> <message> <source>URL</source> @@ -3122,64 +3308,64 @@ Using default port 19455.</source> </message> <message> <source>Prompt for the entry's password.</source> - <translation type="unfinished"/> + <translation>Ingatkan sandi entri.</translation> </message> <message> <source>Generate a password for the entry.</source> - <translation type="unfinished"/> + <translation>Buat sandi entri.</translation> </message> <message> <source>Length for the generated password.</source> - <translation type="unfinished"/> + <translation>Panjang sandi yang akan dibuat.</translation> </message> <message> <source>length</source> - <translation type="unfinished"/> + <translation>panjang</translation> </message> <message> <source>Path of the entry to add.</source> - <translation type="unfinished"/> + <translation>Jalur entri yang akan ditambahkan.</translation> </message> <message> <source>Copy an entry's password to the clipboard.</source> - <translation type="unfinished"/> + <translation>Salin sandi entri ke papan klip.</translation> </message> <message> <source>Path of the entry to clip.</source> <comment>clip = copy to clipboard</comment> - <translation type="unfinished"/> + <translation>Jalur entri yang akan di salin.</translation> </message> <message> <source>Timeout in seconds before clearing the clipboard.</source> - <translation type="unfinished"/> + <translation>Waktu kedaluwarsa dalam detik sebelum mengosongkan papan klip.</translation> </message> <message> <source>Edit an entry.</source> - <translation type="unfinished"/> + <translation>Sunting sebuah entri.</translation> </message> <message> <source>Title for the entry.</source> - <translation type="unfinished"/> + <translation>Judul entri.</translation> </message> <message> <source>title</source> - <translation type="unfinished"/> + <translation>judul</translation> </message> <message> <source>Path of the entry to edit.</source> - <translation type="unfinished"/> + <translation>Jalur entri yang akan disunting.</translation> </message> <message> <source>Estimate the entropy of a password.</source> - <translation type="unfinished"/> + <translation>Estimasi entropi sandi.</translation> </message> <message> <source>Password for which to estimate the entropy.</source> - <translation type="unfinished"/> + <translation>Sandi untuk diestimasi entropinya.</translation> </message> <message> <source>Perform advanced analysis on the password.</source> - <translation type="unfinished"/> + <translation>Jalankan analisis tingkat lanjut pada sandi.</translation> </message> <message> <source>Extract and print the content of a database.</source> @@ -3191,25 +3377,31 @@ Using default port 19455.</source> </message> <message> <source>Insert password to unlock %1: </source> - <translation type="unfinished"/> + <translation>Masukkan sandi untuk membuka %1: </translation> </message> <message> <source>Failed to load key file %1 : %2</source> - <translation type="unfinished"/> + <translation>Gagal memuat berkas kunci %1 : %2</translation> </message> <message> <source>WARNING: You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>PERINGATAN: Anda menggunakan format berkas kunci legacy +yang mungkin tidak akan lagi didukung di masa depan. + +Harap pertimbangkan membuat berkas kunci baru.</translation> </message> <message> <source> Available commands: </source> - <translation type="unfinished"/> + <translation> + +Perintah yang tersedia: +</translation> </message> <message> <source>Name of the command to execute.</source> @@ -3225,11 +3417,11 @@ Available commands: </message> <message> <source>Find entries quickly.</source> - <translation type="unfinished"/> + <translation>Temukan entri dengan cepat.</translation> </message> <message> <source>Search term.</source> - <translation type="unfinished"/> + <translation>Lema pencarian.</translation> </message> <message> <source>Merge two databases.</source> @@ -3245,23 +3437,23 @@ Available commands: </message> <message> <source>Use the same credentials for both database files.</source> - <translation type="unfinished"/> + <translation>Gunakan kredensial yang sama untuk kedua berkas basis data.</translation> </message> <message> <source>Key file of the database to merge from.</source> - <translation type="unfinished"/> + <translation>Berkas kunci dari basis data yang akan digabungkan.</translation> </message> <message> <source>Show an entry's information.</source> - <translation type="unfinished"/> + <translation>Tampilkan informasi entri.</translation> </message> <message> <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> - <translation type="unfinished"/> + <translation>Nama atribut yang akan ditampilkan. Opsi ini bisa digunakan lebih dari sekali, dengan masing-masing atribut ditampilkan satu per baris sesuai dengan urutannya. Jika tidak ada atribut, ringkasan atribut bawaan akan ditampilkan.</translation> </message> <message> <source>attribute</source> - <translation type="unfinished"/> + <translation>atribut</translation> </message> <message> <source>Name of the entry to show.</source> @@ -3291,27 +3483,27 @@ Available commands: </message> <message> <source>AES: 256-bit</source> - <translation type="unfinished"/> + <translation>AES: 256-bit</translation> </message> <message> <source>Twofish: 256-bit</source> - <translation type="unfinished"/> + <translation>Twofish: 256-bit</translation> </message> <message> <source>ChaCha20: 256-bit</source> - <translation type="unfinished"/> + <translation>ChaCha20: 256-bit</translation> </message> <message> <source>Argon2 (KDBX 4 – recommended)</source> - <translation type="unfinished"/> + <translation>Argon2 (KDBX 4 – direkomendasikan)</translation> </message> <message> <source>AES-KDF (KDBX 4)</source> - <translation type="unfinished"/> + <translation>AES-KDF (KDBX 4)</translation> </message> <message> <source>AES-KDF (KDBX 3.1)</source> - <translation type="unfinished"/> + <translation>AES-KDF (KDBX 3.1)</translation> </message> <message> <source>Group</source> @@ -3335,15 +3527,15 @@ Available commands: </message> <message> <source>Last Modified</source> - <translation type="unfinished"/> + <translation>Terakhir Diubah</translation> </message> <message> <source>Created</source> - <translation type="unfinished"/> + <translation>Dibuat</translation> </message> <message> <source>Legacy Browser Integration</source> - <translation type="unfinished"/> + <translation>Integrasi Peramban Legacy</translation> </message> <message> <source>Browser Integration</source> @@ -3355,7 +3547,7 @@ Available commands: </message> <message> <source>Press</source> - <translation type="unfinished"/> + <translation>Tekan</translation> </message> <message> <source>Passive</source> @@ -3363,6 +3555,51 @@ Available commands: </message> <message> <source>SSH Agent</source> + <translation>SSH Agent</translation> + </message> + <message> + <source>Generate a new random diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Word count for the diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>count</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wordlist for the diceware generator. +[Default: EFF English]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a new random password.</source> + <translation>Buat kata sandi baru secara acak.</translation> + </message> + <message> + <source>Length of the generated password.</source> + <translation>Panjang kata sandi yang dibuat.</translation> + </message> + <message> + <source>Use lowercase characters in the generated password.</source> + <translation>Gunakan huruf kecil di kata sandi yang dibuat</translation> + </message> + <message> + <source>Use uppercase characters in the generated password.</source> + <translation>Gunakan huruf besar di kata sandi yang dibuat.</translation> + </message> + <message> + <source>Use numbers in the generated password.</source> + <translation>Gunakan angka di kata sandi yang dibuat.</translation> + </message> + <message> + <source>Use special characters in the generated password.</source> + <translation>Gunakan spesial karakter di kata sandi yang dibuat.</translation> + </message> + <message> + <source>Use extended ASCII in the generated password.</source> <translation type="unfinished"/> </message> </context> @@ -3471,7 +3708,7 @@ Silakan buka kunci atau pilih yang lainnya yang tidak terkunci.</translation> </message> <message numerus="yes"> <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>Berhasil membuang %n kunci enkripsi dari Pengaturan KeePassX/Http</numerusform></translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -3503,7 +3740,7 @@ Silakan buka kunci atau pilih yang lainnya yang tidak terkunci.</translation> </message> <message numerus="yes"> <source>Successfully removed permissions from %n entries.</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>Berhasil membuang perizinan dari %n entri.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -3585,7 +3822,7 @@ Silakan buka kunci atau pilih yang lainnya yang tidak terkunci.</translation> </message> <message> <source>Hide the Details view</source> - <translation type="unfinished"/> + <translation>Sembunyikan tampilan Detail</translation> </message> <message> <source>Show a system tray icon</source> @@ -3601,7 +3838,7 @@ Silakan buka kunci atau pilih yang lainnya yang tidak terkunci.</translation> </message> <message> <source>Dark system tray icon</source> - <translation type="unfinished"/> + <translation>Ikon baki sistem gelap</translation> </message> <message> <source>Language</source> @@ -3613,11 +3850,11 @@ Silakan buka kunci atau pilih yang lainnya yang tidak terkunci.</translation> </message> <message> <source>Use entry title to match windows for global Auto-Type</source> - <translation type="unfinished"/> + <translation>Gunakan judul entri untuk mencocokkan jendela untuk Ketik-Otomatis global</translation> </message> <message> <source>Use entry URL to match windows for global Auto-Type</source> - <translation type="unfinished"/> + <translation>Gunakan URL entri untuk mencocokkan jendela untuk Ketik-Otomatis global</translation> </message> <message> <source>Always ask before performing Auto-Type</source> @@ -3636,12 +3873,36 @@ Silakan buka kunci atau pilih yang lainnya yang tidak terkunci.</translation> <comment>Milliseconds</comment> <translation>md</translation> </message> + <message> + <source>Startup</source> + <translation>Memulai</translation> + </message> + <message> + <source>File Management</source> + <translation>Manajemen Berkas</translation> + </message> + <message> + <source>Safely save database files (may be incompatible with Dropbox, etc)</source> + <translation>Secara aman menyimpan berkas basis data (mungkin tidak kompatibel dengan Dropbox, dll)</translation> + </message> + <message> + <source>Backup database file before saving</source> + <translation>Cadangkan basis data sebelum disimpan</translation> + </message> + <message> + <source>Entry Management</source> + <translation>Manajemen Entri</translation> + </message> + <message> + <source>General</source> + <translation>Umum</translation> + </message> </context> <context> <name>SettingsWidgetSecurity</name> <message> <source>Timeouts</source> - <translation type="unfinished"/> + <translation>Waktu Kedaluwarsa</translation> </message> <message> <source>Clear clipboard after</source> @@ -3658,7 +3919,7 @@ Silakan buka kunci atau pilih yang lainnya yang tidak terkunci.</translation> </message> <message> <source>Convenience</source> - <translation type="unfinished"/> + <translation>Kenyamanan</translation> </message> <message> <source>Lock databases when session is locked or lid is closed</source> @@ -3678,11 +3939,11 @@ Silakan buka kunci atau pilih yang lainnya yang tidak terkunci.</translation> </message> <message> <source>Hide passwords in the preview panel</source> - <translation type="unfinished"/> + <translation>Sembunyikan sandi di dalam panel pratinjau</translation> </message> <message> <source>Hide entry notes by default</source> - <translation type="unfinished"/> + <translation>Sembunyikan catatan secara bawaan</translation> </message> <message> <source>Privacy</source> @@ -3692,6 +3953,10 @@ Silakan buka kunci atau pilih yang lainnya yang tidak terkunci.</translation> <source>Use Google as fallback for downloading website icons</source> <translation>Gunakan Google sebagai cadangan untuk mengunduh ikon situs web</translation> </message> + <message> + <source>Re-lock previously locked database after performing Auto-Type</source> + <translation type="unfinished"/> + </message> </context> <context> <name>SetupTotpDialog</name> @@ -3705,11 +3970,11 @@ Silakan buka kunci atau pilih yang lainnya yang tidak terkunci.</translation> </message> <message> <source>Default RFC 6238 token settings</source> - <translation type="unfinished"/> + <translation>Pengaturan bawaan token RFC 6238</translation> </message> <message> <source>Steam token settings</source> - <translation type="unfinished"/> + <translation>Pengaturan token steam</translation> </message> <message> <source>Use custom settings</source> @@ -3773,10 +4038,6 @@ Silakan buka kunci atau pilih yang lainnya yang tidak terkunci.</translation> </context> <context> <name>WelcomeWidget</name> - <message> - <source>Welcome to KeePassXC</source> - <translation>Selamat datang di KeePassXC</translation> - </message> <message> <source>Start storing your passwords securely in a KeePassXC database</source> <translation>Mulai menyimpan sandi Anda dengan aman di dalam basis data KeePassXC</translation> @@ -3801,12 +4062,16 @@ Silakan buka kunci atau pilih yang lainnya yang tidak terkunci.</translation> <source>Recent databases</source> <translation>Basis data baru-baru ini</translation> </message> + <message> + <source>Welcome to KeePassXC %1</source> + <translation>Selamat datang di KeePassXC %1</translation> + </message> </context> <context> <name>main</name> <message> <source>Remove an entry from the database.</source> - <translation type="unfinished"/> + <translation>Buang sebuah entri dari basis data.</translation> </message> <message> <source>Path of the database.</source> @@ -3814,7 +4079,7 @@ Silakan buka kunci atau pilih yang lainnya yang tidak terkunci.</translation> </message> <message> <source>Path of the entry to remove.</source> - <translation type="unfinished"/> + <translation>Jalur entri untuk dibuang.</translation> </message> <message> <source>KeePassXC - cross-platform password manager</source> diff --git a/share/translations/keepassx_it.ts b/share/translations/keepassx_it.ts index 280d12b19..76365f2b3 100644 --- a/share/translations/keepassx_it.ts +++ b/share/translations/keepassx_it.ts @@ -3,7 +3,7 @@ <name>AboutDialog</name> <message> <source>About KeePassXC</source> - <translation>Info su KeePassXC</translation> + <translation>Informazioni su KeePassXC</translation> </message> <message> <source>About</source> @@ -17,10 +17,6 @@ <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> <translation>KeePassXC è distribuito sotto i termini della licenza GNU General Public License (GPL) versione 2 o (come opzione) versione 3.</translation> </message> - <message> - <source>Project Maintainers:</source> - <translation>Responsabili del progetto:</translation> - </message> <message> <source>Contributors</source> <translation>Collaboratori</translation> @@ -31,7 +27,7 @@ </message> <message> <source>Debug Info</source> - <translation>Informazioni debug</translation> + <translation>Informazioni di debug</translation> </message> <message> <source>Include the following information whenever you report a bug:</source> @@ -71,16 +67,30 @@ Kernel: %3 %4</translation> <source>Enabled extensions:</source> <translation>Estensioni abilitate:</translation> </message> + <message> + <source>Project Maintainers:</source> + <translation>Responsabili del progetto:</translation> + </message> + <message> + <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> + <translation>Uno speciale ringraziamento dal team di KeePassXC va a debfx per la creazione del KeePassX originale.</translation> + </message> + <message> + <source>Build Type: %1 +</source> + <translation>Tipo di compilazione: %1 +</translation> + </message> </context> <context> <name>AccessControlDialog</name> <message> <source>KeePassXC HTTP Confirm Access</source> - <translation>KeePassXC HTTP conferma accesso</translation> + <translation>Conferma l'accesso per KeePassXC HTTP</translation> </message> <message> <source>Remember this decision</source> - <translation>Ricorda questa decisione</translation> + <translation>Ricorda questa scelta</translation> </message> <message> <source>Allow</source> @@ -150,6 +160,25 @@ Seleziona se vuoi consentire l'accesso.</translation> <translation>Sequenza predefinita</translation> </message> </context> +<context> + <name>AutoTypeMatchModel</name> + <message> + <source>Group</source> + <translation>Gruppo</translation> + </message> + <message> + <source>Title</source> + <translation>Titolo</translation> + </message> + <message> + <source>Username</source> + <translation>Nome utente</translation> + </message> + <message> + <source>Sequence</source> + <translation>Sequenza</translation> + </message> +</context> <context> <name>AutoTypeSelectDialog</name> <message> @@ -239,7 +268,7 @@ Seleziona se vuoi consentire l'accesso.</translation> </message> <message> <source>&Match URL scheme (e.g., https://...)</source> - <translation type="unfinished"/> + <translation>&Schema di corrispondenza URL (ad esempio, https://...)</translation> </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> @@ -247,17 +276,17 @@ Seleziona se vuoi consentire l'accesso.</translation> </message> <message> <source>&Return only best-matching credentials</source> - <translation type="unfinished"/> + <translation>&Restituisci solo le credenziali che corrispondono maggiormente</translation> </message> <message> <source>Sort &matching credentials by title</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Ordina le credenziali &corrispondenti per titolo</translation> </message> <message> <source>Sort matching credentials by &username</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Ordina le credenziali corrispondenti per nome &utente</translation> </message> <message> <source>&Disconnect all browsers</source> @@ -265,7 +294,7 @@ Seleziona se vuoi consentire l'accesso.</translation> </message> <message> <source>Forget all remembered &permissions</source> - <translation type="unfinished"/> + <translation>Ignora i &permessi precedentemente salvati</translation> </message> <message> <source>Advanced</source> @@ -274,12 +303,12 @@ Seleziona se vuoi consentire l'accesso.</translation> <message> <source>Never &ask before accessing credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Non &chiedere conferma prima di accedere alle credenziali</translation> </message> <message> <source>Never ask before &updating credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Non &chiedere conferma prima di &aggiornare le credenziali</translation> </message> <message> <source>Only the selected database has to be connected with a client.</source> @@ -288,7 +317,7 @@ Seleziona se vuoi consentire l'accesso.</translation> <message> <source>Searc&h in all opened databases for matching credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Cerca le credenziali corrispondenti in tutti i database aperti</translation> </message> <message> <source>Automatically creating or updating string fields is not supported.</source> @@ -300,23 +329,23 @@ Seleziona se vuoi consentire l'accesso.</translation> </message> <message> <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> - <translation type="unfinished"/> + <translation>Aggiorna automaticamente all'avvio il percorso dei binari di KeePassXC o keepassxc-proxy per gli script di messaggistica nativa</translation> </message> <message> <source>Update &native messaging manifest files at startup</source> - <translation type="unfinished"/> + <translation>Aggiorna all'avvio i file di manifest della messaggeria &nativa</translation> </message> <message> <source>Support a proxy application between KeePassXC and browser extension.</source> - <translation type="unfinished"/> + <translation>Supporta un'applicazione proxy tra KeePassXC e l'estensione del browser</translation> </message> <message> <source>Use a &proxy application between KeePassXC and browser extension</source> - <translation type="unfinished"/> + <translation>Utilizza un'applicazione &proxy tra KeePassXC e l'estensione del browser</translation> </message> <message> <source>Use a custom proxy location if you installed a proxy manually.</source> - <translation type="unfinished"/> + <translation>Usa un indirizzo proxy personalizzato se hai installato manualmente un proxy</translation> </message> <message> <source>Use a &custom proxy location</source> @@ -356,7 +385,10 @@ Seleziona se vuoi consentire l'accesso.</translation> If you would like to allow it access to your KeePassXC database, give it a unique name to identify and accept it.</source> - <translation type="unfinished"/> + <translation>Hai ricevuto una richiesta di associazione per la chiave sopra. + +Se vuoi concederle l'autorizzazione per accedere al tuo database di KeePassXC, +assegnale un nome univoco e accetta la richiesta.</translation> </message> <message> <source>Save and allow access</source> @@ -369,7 +401,7 @@ give it a unique name to identify and accept it.</source> <message> <source>A shared encryption key with the name "%1" already exists. Do you want to overwrite it?</source> - <translation type="unfinished"/> + <translation>Esiste già una chiave crittografica condivisa con il nome "%1"- Vuoi sovrascriverla?</translation> </message> <message> <source>KeePassXC: Update Entry</source> @@ -519,7 +551,10 @@ Sblocca il database selezionato o scegline un altro che sia sbloccato.</translat unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>Per il file della chiave, stai utilizzando un formato obsoleto +che potrebbe non essere più supportato in futuro. + +Considera l'opzione di generarne uno nuovo</translation> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -707,7 +742,10 @@ Please consider generating a new key file.</source> unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>Per il file della chiave, stai utilizzando un formato obsoleto +che potrebbe non essere più supportato in futuro. + +Considera l'opzione di generarne uno nuovo</translation> </message> <message> <source>Don't show this warning again</source> @@ -782,7 +820,9 @@ Adesso puoi salvarlo.</translation> <source>You are using a very high number of key transform rounds with Argon2. If you keep this number, your database may take hours or days (or even longer) to open!</source> - <translation type="unfinished"/> + <translation>Stai utilizzando un numero molto elevato di fasi di trasformazione della chiave con Argon 2 + +Se continui con questo numero, il tuo database si potrebbe aprire in ore o giorni (o anche più a lungo)</translation> </message> <message> <source>Understood, keep number</source> @@ -801,7 +841,9 @@ If you keep this number, your database may take hours or days (or even longer) t <source>You are using a very low number of key transform rounds with AES-KDF. If you keep this number, your database may be too easy to crack!</source> - <translation type="unfinished"/> + <translation>Stai utilizzando un numero molto basso di fasi di trasformazione della chiave con AES-KDF + +Se continui con questo numero, il tuo database potrebbe essere decifrato molto facilmente</translation> </message> <message> <source>KDF unchanged</source> @@ -809,7 +851,17 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> - <translation type="unfinished"/> + <translation>La trasformazione della chiave con i nuovi parametri KDF e' fallita; KDF immutato</translation> + </message> + <message numerus="yes"> + <source> MiB</source> + <comment>Abbreviation for Mebibytes (KDF settings)</comment> + <translation><numerusform> MiB</numerusform><numerusform> MiB</numerusform></translation> + </message> + <message numerus="yes"> + <source> thread(s)</source> + <comment>Threads for parallel execution (KDF settings)</comment> + <translation><numerusform>thread</numerusform><numerusform>thread</numerusform></translation> </message> </context> <context> @@ -842,18 +894,10 @@ If you keep this number, your database may be too easy to crack!</source> <source>Memory Usage:</source> <translation>Uso della memoria:</translation> </message> - <message> - <source> MB</source> - <translation> MB</translation> - </message> <message> <source>Parallelism:</source> <translation>Parallelismo:</translation> </message> - <message> - <source> thread</source> - <translation>thread</translation> - </message> </context> <context> <name>DatabaseSettingsWidgetGeneral</name> @@ -893,6 +937,14 @@ If you keep this number, your database may be too easy to crack!</source> <source>Use recycle bin</source> <translation>Usa il cestino</translation> </message> + <message> + <source>Additional Database Settings</source> + <translation>Ulteriori impostazioni del database</translation> + </message> + <message> + <source>Enable &compression (recommended)</source> + <translation>Abilita &compressione (consigliata)</translation> + </message> </context> <context> <name>DatabaseTabWidget</name> @@ -1015,6 +1067,16 @@ Otherwise your changes are lost.</source> Vuoi salvare il database prima di bloccarlo? Altrimenti le modifiche verranno perse.</translation> </message> + <message> + <source>Disable safe saves?</source> + <translation>Disabilita i salvataggi sicuri?</translation> + </message> + <message> + <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</source> + <translation>Nonostante ripetuti tentativi, KeePassXC non è riuscito a salvare il database. Probabilmente la causa risiede in un file di lock bloccato da qualche servizio di sincronizzazione file. +Disabilitare i salvataggi sicuri e riprovare?</translation> + </message> </context> <context> <name>DatabaseWidget</name> @@ -1113,7 +1175,8 @@ Altrimenti le modifiche verranno perse.</translation> <message> <source>The database file has changed and you have unsaved changes. Do you want to merge your changes?</source> - <translation type="unfinished"/> + <translation>Il file del database e' stato cambiato e ci sono cambiamenti non salvati +Vuoi fondere i cambiamenti?</translation> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -1127,6 +1190,10 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>Sei sicuro di voler eliminare definitivamente tutto dal cestino?</translation> </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DetailsWidget</name> @@ -1313,6 +1380,18 @@ Do you want to merge your changes?</source> <source>1 year</source> <translation>Un anno</translation> </message> + <message> + <source>Apply generated password?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to apply the generated password to this entry?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAdvanced</name> @@ -1344,6 +1423,14 @@ Do you want to merge your changes?</source> <source>Attachments</source> <translation>Allegati</translation> </message> + <message> + <source>Foreground Color:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Background Color:</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -1376,12 +1463,8 @@ Do you want to merge your changes?</source> <translation>Titolo finestra:</translation> </message> <message> - <source>Use default se&quence</source> - <translation>Usa se&quenza predefinita</translation> - </message> - <message> - <source>Set custo&m sequence:</source> - <translation>Imposta sequenza &personalizzata:</translation> + <source>Use a specific sequence for this association:</source> + <translation>Usa una sequenza specifica per questa associazione:</translation> </message> </context> <context> @@ -1661,6 +1744,31 @@ Do you want to merge your changes?</source> <source>Uuid:</source> <translation>UUID:</translation> </message> + <message> + <source>Plugin Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove</source> + <translation>Rimuovi</translation> + </message> + <message> + <source>Delete plugin data?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Value</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Entry</name> @@ -1807,6 +1915,65 @@ Do you want to merge your changes?</source> <source>URL</source> <translation>URL</translation> </message> + <message> + <source>Never</source> + <translation>Mai</translation> + </message> + <message> + <source>Password</source> + <translation>Password</translation> + </message> + <message> + <source>Notes</source> + <translation>Note</translation> + </message> + <message> + <source>Expires</source> + <translation>Scade</translation> + </message> + <message> + <source>Created</source> + <translation>Creazione</translation> + </message> + <message> + <source>Modified</source> + <translation>Modifica</translation> + </message> + <message> + <source>Accessed</source> + <translation>Accesso</translation> + </message> + <message> + <source>Attachments</source> + <translation>Allegati</translation> + </message> +</context> +<context> + <name>EntryView</name> + <message> + <source>Customize View</source> + <translation>Personalizza vista</translation> + </message> + <message> + <source>Hide Usernames</source> + <translation>Nascondi nome utente</translation> + </message> + <message> + <source>Hide Passwords</source> + <translation>Nascondi password</translation> + </message> + <message> + <source>Fit to window</source> + <translation>Adatta alla finestra</translation> + </message> + <message> + <source>Fit to contents</source> + <translation>Adatta ai contenuti</translation> + </message> + <message> + <source>Reset to defaults</source> + <translation>Ripristina valori predefiniti</translation> + </message> </context> <context> <name>Group</name> @@ -1876,6 +2043,10 @@ Do you want to merge your changes?</source> <source>Ensure that the password contains characters from every group</source> <translation>Verifica che la password contenga caratteri di ogni gruppo</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>ASCII esteso</translation> + </message> </context> <context> <name>KMessageWidget</name> @@ -1934,7 +2105,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> - <translation type="unfinished"/> + <translation>Chiave errata o file del database corrotto (HMAC non corrisponde)</translation> </message> <message> <source>Unknown cipher</source> @@ -1954,15 +2125,15 @@ Do you want to merge your changes?</source> </message> <message> <source>Failed to open buffer for KDF parameters in header</source> - <translation type="unfinished"/> + <translation>Fallimento dell'apertura del buffer per i parametri KDF nell'header</translation> </message> <message> <source>Unsupported key derivation function (KDF) or invalid parameters</source> - <translation type="unfinished"/> + <translation>Funzione di derivazione della chiave (KDF) non supportata o parametri non validi</translation> </message> <message> <source>Legacy header fields found in KDBX4 file.</source> - <translation type="unfinished"/> + <translation>Sono stati trovati dei campi obsloleti nell'header del file KDBX4</translation> </message> <message> <source>Invalid inner header id size</source> @@ -1984,69 +2155,69 @@ Do you want to merge your changes?</source> <message> <source>Invalid variant map entry name length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Il nome della voce per la mappa di variazione ha una lunghezza non valida </translation> </message> <message> <source>Invalid variant map entry name data</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Il nome della voce per la mappa di variazione presenta dati non validi</translation> </message> <message> <source>Invalid variant map entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Il valore della voce per la mappa di variazione ha una lunghezza non valida </translation> </message> <message> <source>Invalid variant map entry value data</source> <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Il valore della voce per la mappa di variazione presenta dati non validi</translation> </message> <message> <source>Invalid variant map Bool entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Il valore della voce Bool per la mappa di variazione ha una lunghezza non valida</translation> </message> <message> <source>Invalid variant map Int32 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Il valore della voce Int32 per la mappa di variazione ha una lunghezza non valida</translation> </message> <message> <source>Invalid variant map UInt32 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Il valore della voce UInt32 per la mappa di variazione ha una lunghezza non valida</translation> </message> <message> <source>Invalid variant map Int64 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Il valore della voce Int64 per la mappa di variazione ha una lunghezza non valida</translation> </message> <message> <source>Invalid variant map UInt64 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Il valore della voce UInt64 per la mappa di variazione ha una lunghezza non valida</translation> </message> <message> <source>Invalid variant map entry type</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Il tipo della voce per la mappa di variazione non è valido</translation> </message> <message> <source>Invalid variant map field type size</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Dimensione non valida per il tipo di campo della mappa di variazione </translation> </message> </context> <context> <name>Kdbx4Writer</name> <message> <source>Invalid symmetric cipher algorithm.</source> - <translation type="unfinished"/> + <translation>Algoritmo di cifratura simmetrica non valido.</translation> </message> <message> <source>Invalid symmetric cipher IV size.</source> <comment>IV = Initialization Vector for symmetric cipher</comment> - <translation type="unfinished"/> + <translation>Dimensione non valida del vettore di inizializzazione dell'algoritmo di cifratura simmetrica.</translation> </message> <message> <source>Unable to calculate master key</source> @@ -2055,14 +2226,14 @@ Do you want to merge your changes?</source> <message> <source>Failed to serialize KDF parameters variant map</source> <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Fallita serializzazione della mappa di variazione dei parametri per la funzione di derivazione della chiave di cifratura (KDF)</translation> </message> </context> <context> <name>KdbxReader</name> <message> <source>Invalid cipher uuid length</source> - <translation type="unfinished"/> + <translation>Lunghezza non valida dell'UUID del cifrario</translation> </message> <message> <source>Unsupported cipher</source> @@ -2082,23 +2253,23 @@ Do you want to merge your changes?</source> </message> <message> <source>Invalid transform seed size</source> - <translation type="unfinished"/> + <translation>Dimensione non valida del seme di trasformazione</translation> </message> <message> <source>Invalid transform rounds size</source> - <translation type="unfinished"/> + <translation>Dimensione non valida del numero di ripetizioni per la trasformazione</translation> </message> <message> <source>Invalid start bytes size</source> - <translation type="unfinished"/> + <translation>Dimensione non valida del byte di inizio</translation> </message> <message> <source>Invalid random stream id size</source> - <translation type="unfinished"/> + <translation>Dimensione non valida dell'ID per il flusso di dati casuale</translation> </message> <message> <source>Invalid inner random stream cipher</source> - <translation type="unfinished"/> + <translation>Cifrario non valido per il flusso interno di dati casuale</translation> </message> <message> <source>Not a KeePass database.</source> @@ -2116,7 +2287,7 @@ Si tratta di una migrazione unidirezionale. Non sarà possibile aprire il databa </message> <message> <source>Unsupported KeePass 2 database version.</source> - <translation type="unfinished"/> + <translation>Versione di database KeePass 2 non supportata.</translation> </message> </context> <context> @@ -2131,63 +2302,63 @@ Si tratta di una migrazione unidirezionale. Non sarà possibile aprire il databa </message> <message> <source>Missing icon uuid or data</source> - <translation type="unfinished"/> + <translation>UUID mancante per l'icona o dati</translation> </message> <message> <source>Missing custom data key or value</source> - <translation type="unfinished"/> + <translation>Chiave individuale o valore mancante</translation> </message> <message> <source>Multiple group elements</source> - <translation type="unfinished"/> + <translation>Elementi appartenenti a gruppi diversi</translation> </message> <message> <source>Null group uuid</source> - <translation type="unfinished"/> + <translation>UUID di gruppo nullo</translation> </message> <message> <source>Invalid group icon number</source> - <translation type="unfinished"/> + <translation>Numero di gruppo di icone non valido</translation> </message> <message> <source>Invalid EnableAutoType value</source> - <translation type="unfinished"/> + <translation>Valore di EnableAutoType non valido</translation> </message> <message> <source>Invalid EnableSearching value</source> - <translation type="unfinished"/> + <translation>Valore EnableSearching non valido</translation> </message> <message> <source>No group uuid found</source> - <translation type="unfinished"/> + <translation>UUID di gruppo non trovato</translation> </message> <message> <source>Null DeleteObject uuid</source> - <translation type="unfinished"/> + <translation>DeleteObject: UUID nullo</translation> </message> <message> <source>Missing DeletedObject uuid or time</source> - <translation type="unfinished"/> + <translation>DeleteObject: UUID o marca temporale mancante</translation> </message> <message> <source>Null entry uuid</source> - <translation type="unfinished"/> + <translation>UUID nulla per la voce</translation> </message> <message> <source>Invalid entry icon number</source> - <translation type="unfinished"/> + <translation>Numero non valido per l'icona della voce</translation> </message> <message> <source>History element in history entry</source> - <translation type="unfinished"/> + <translation>Elemento della cronistoria nella voce della cronistoria</translation> </message> <message> <source>No entry uuid found</source> - <translation type="unfinished"/> + <translation>Nessun UUID trovato per la voce</translation> </message> <message> <source>History element with different uuid</source> - <translation type="unfinished"/> + <translation>Elemento della cronistoria con diverso UUID</translation> </message> <message> <source>Unable to decrypt entry string</source> @@ -2199,7 +2370,7 @@ Si tratta di una migrazione unidirezionale. Non sarà possibile aprire il databa </message> <message> <source>Entry string key or value missing</source> - <translation type="unfinished"/> + <translation>Chiave alfanumerica o valore mancante per la voce</translation> </message> <message> <source>Duplicate attachment found</source> @@ -2207,11 +2378,11 @@ Si tratta di una migrazione unidirezionale. Non sarà possibile aprire il databa </message> <message> <source>Entry binary key or value missing</source> - <translation type="unfinished"/> + <translation>Chiave binaria o valore mancante per la voce</translation> </message> <message> <source>Auto-type association window or sequence missing</source> - <translation type="unfinished"/> + <translation>Finestra associata al completamento automatico o sequenza mancante</translation> </message> <message> <source>Invalid bool value</source> @@ -2227,7 +2398,7 @@ Si tratta di una migrazione unidirezionale. Non sarà possibile aprire il databa </message> <message> <source>Invalid color rgb part</source> - <translation type="unfinished"/> + <translation>Colore RGB non valido</translation> </message> <message> <source>Invalid number value</source> @@ -2235,7 +2406,7 @@ Si tratta di una migrazione unidirezionale. Non sarà possibile aprire il databa </message> <message> <source>Invalid uuid value</source> - <translation type="unfinished"/> + <translation>Valore non valido per UUID</translation> </message> <message> <source>Unable to decompress binary</source> @@ -2275,7 +2446,7 @@ Si tratta di una migrazione unidirezionale. Non sarà possibile aprire il databa <message> <source>Unable to read encryption IV</source> <comment>IV = Initialization Vector for symmetric cipher</comment> - <translation type="unfinished"/> + <translation>Impossibile leggere il vettore di inizializzazione per la cifratura</translation> </message> <message> <source>Invalid number of groups</source> @@ -2287,15 +2458,15 @@ Si tratta di una migrazione unidirezionale. Non sarà possibile aprire il databa </message> <message> <source>Invalid content hash size</source> - <translation type="unfinished"/> + <translation>DImensione dell'hash non valida per questo contenuto</translation> </message> <message> <source>Invalid transform seed size</source> - <translation type="unfinished"/> + <translation>Dimensione non valida del seme di trasformazione</translation> </message> <message> <source>Invalid number of transform rounds</source> - <translation type="unfinished"/> + <translation>Numero di cicli di trasformazione non valido</translation> </message> <message> <source>Unable to construct group tree</source> @@ -2319,7 +2490,7 @@ Si tratta di una migrazione unidirezionale. Non sarà possibile aprire il databa </message> <message> <source>Invalid group field type number</source> - <translation type="unfinished"/> + <translation>Numero del tipo di gruppo non valido</translation> </message> <message> <source>Invalid group field size</source> @@ -2327,47 +2498,47 @@ Si tratta di una migrazione unidirezionale. Non sarà possibile aprire il databa </message> <message> <source>Read group field data doesn't match size</source> - <translation type="unfinished"/> + <translation>I dati letti non coincidono con la dimensione del gruppo</translation> </message> <message> <source>Incorrect group id field size</source> - <translation type="unfinished"/> + <translation>Dimensione dell'ID di gruppo non corretta</translation> </message> <message> <source>Incorrect group creation time field size</source> - <translation type="unfinished"/> + <translation>Dimensione della data di creazione del gruppo non corretta</translation> </message> <message> <source>Incorrect group modification time field size</source> - <translation type="unfinished"/> + <translation>Dimensione della data di modifica del gruppo non corretta</translation> </message> <message> <source>Incorrect group access time field size</source> - <translation type="unfinished"/> + <translation>Dimensione della data di accesso del gruppo non corretta</translation> </message> <message> <source>Incorrect group expiry time field size</source> - <translation type="unfinished"/> + <translation>Dimensione della data di scadenza del gruppo non corretta</translation> </message> <message> <source>Incorrect group icon field size</source> - <translation type="unfinished"/> + <translation>Dimensione dell'icona del gruppo non corretta</translation> </message> <message> <source>Incorrect group level field size</source> - <translation type="unfinished"/> + <translation>Dimensione del livello del gruppo non corretta</translation> </message> <message> <source>Invalid group field type</source> - <translation type="unfinished"/> + <translation>Tipo di gruppo non corretto</translation> </message> <message> <source>Missing group id or level</source> - <translation type="unfinished"/> + <translation>ID di gruppo o livello mancante</translation> </message> <message> <source>Missing entry field type number</source> - <translation type="unfinished"/> + <translation>Numero mancante per il tipo della voce corrente</translation> </message> <message> <source>Invalid entry field size</source> @@ -2375,35 +2546,35 @@ Si tratta di una migrazione unidirezionale. Non sarà possibile aprire il databa </message> <message> <source>Read entry field data doesn't match size</source> - <translation type="unfinished"/> + <translation>I dati letti per la voce corrente non coincidono con la dimensione</translation> </message> <message> <source>Invalid entry uuid field size</source> - <translation type="unfinished"/> + <translation>Dimensione dell'UUID della voce corrente non valida</translation> </message> <message> <source>Invalid entry group id field size</source> - <translation type="unfinished"/> + <translation>Dimensione dell'ID di gruppo della voce corrente non valida</translation> </message> <message> <source>Invalid entry icon field size</source> - <translation type="unfinished"/> + <translation>Dimensione dell'icona della voce corrente non valida</translation> </message> <message> <source>Invalid entry creation time field size</source> - <translation type="unfinished"/> + <translation>Dimensione della data di creazione della voce corrente non valida</translation> </message> <message> <source>Invalid entry modification time field size</source> - <translation type="unfinished"/> + <translation>Dimensione della data di modifica della voce corrente non valida</translation> </message> <message> <source>Invalid entry expiry time field size</source> - <translation type="unfinished"/> + <translation>Dimensione della data di scadenza della voce corrente non valida</translation> </message> <message> <source>Invalid entry field type</source> - <translation type="unfinished"/> + <translation>Tipo di dato non valido </translation> </message> </context> <context> @@ -2457,7 +2628,7 @@ Si tratta di una migrazione unidirezionale. Non sarà possibile aprire il databa </message> <message> <source>Time-based one-time password</source> - <translation type="unfinished"/> + <translation>Password monouso a tempo</translation> </message> <message> <source>&Groups</source> @@ -2645,7 +2816,7 @@ Si tratta di una migrazione unidirezionale. Non sarà possibile aprire il databa </message> <message> <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> - <translation type="unfinished"/> + <translation><p>Sembra che per l'integrazione con il browser tu stia utilizzando KeePassHTTP. Questa funzionalità è dichiarata obsoleta e verrà rimossa in un prossimo futuro.<br>Si consiglia di utilizzare KeePassXC-Browser piuttosto! Se hai bisogno di aiuto per effettuare la migrazione, visita la nostra <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">guida alla migrazione</a> (avviso %1 di 3).</p></translation> </message> <message> <source>read-only</source> @@ -2687,6 +2858,14 @@ Si tratta di una migrazione unidirezionale. Non sarà possibile aprire il databa <source>Please touch the button on your YubiKey!</source> <translation>Premi il pulsante della YubiKey!</translation> </message> + <message> + <source>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</source> + <translation>ATTENZIONE: stai utilizzando una versione non stabile di KeePassXC! +Vi è il rischio concreto di danneggiamenti ai database utilizzati, si consiglia di predisporre per una loro copia di sicurezza. +Questa versione non è pensata per essere utilizzata in ambito di produzione.</translation> + </message> </context> <context> <name>OpenSSHKey</name> @@ -2696,11 +2875,7 @@ Si tratta di una migrazione unidirezionale. Non sarà possibile aprire il databa </message> <message> <source>PEM boundary mismatch</source> - <translation type="unfinished"/> - </message> - <message> - <source>This is not an OpenSSH key, only modern keys are supported</source> - <translation>Questa non è una chiave OpenSSH, sono supportate solo chiavi moderne</translation> + <translation>Mancata corrispondenza del marigne PEM</translation> </message> <message> <source>Base64 decoding failed</source> @@ -2712,7 +2887,7 @@ Si tratta di una migrazione unidirezionale. Non sarà possibile aprire il databa </message> <message> <source>Key file magic header id invalid</source> - <translation type="unfinished"/> + <translation>Id dell'intestazione magica del file chiave non valido</translation> </message> <message> <source>Found zero keys</source> @@ -2728,43 +2903,31 @@ Si tratta di una migrazione unidirezionale. Non sarà possibile aprire il databa </message> <message> <source>No private key payload to decrypt</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown cipher: </source> - <translation>Cifrario sconosciuto:</translation> + <translation>Nessuna chiave privata da decifrare nel contenuto</translation> </message> <message> <source>Trying to run KDF without cipher</source> - <translation type="unfinished"/> + <translation>Sto cercando di eseguire KDF senza cifratura</translation> </message> <message> <source>Passphrase is required to decrypt this key</source> - <translation type="unfinished"/> + <translation>La decifrazione di questa chiave richiede una frase segreta</translation> </message> <message> <source>Key derivation failed, key file corrupted?</source> <translation>Derivazione della chiave non riuscita, file della chiave rovinato?</translation> </message> - <message> - <source>Unknown KDF: </source> - <translation>KDF sconosciuto: </translation> - </message> <message> <source>Decryption failed, wrong passphrase?</source> - <translation>Decifrazione non riuscita, passpharse non corretta?</translation> + <translation>Decifrazione non riuscita, frase segreta non corretta?</translation> </message> <message> <source>Unexpected EOF while reading public key</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown key type: </source> - <translation>Tipo di chiave sconosciuto:</translation> + <translation>EOF imprevisto durante la lettura della chiave pubblica</translation> </message> <message> <source>Unexpected EOF while reading private key</source> - <translation type="unfinished"/> + <translation>EOF imprevisto durante la lettura della chiave privata</translation> </message> <message> <source>Can't write public key as it is empty</source> @@ -2772,7 +2935,7 @@ Si tratta di una migrazione unidirezionale. Non sarà possibile aprire il databa </message> <message> <source>Unexpected EOF when writing public key</source> - <translation type="unfinished"/> + <translation>EOF imprevisto durante la scrittura di chiave pubblica</translation> </message> <message> <source>Can't write private key as it is empty</source> @@ -2780,7 +2943,27 @@ Si tratta di una migrazione unidirezionale. Non sarà possibile aprire il databa </message> <message> <source>Unexpected EOF when writing private key</source> - <translation type="unfinished"/> + <translation>EOF imprevisto durante la scrittura di una chiave privata</translation> + </message> + <message> + <source>Unsupported key type: %1</source> + <translation>Tipo di chiave non supportato: %1</translation> + </message> + <message> + <source>Unknown cipher: %1</source> + <translation>Tipo di cifrario non supportato: %1</translation> + </message> + <message> + <source>Cipher IV is too short for MD5 kdf</source> + <translation>Il vettore di inizializzazione del cifrario è troppo corto per la derivazione della chiave crittografica tramite MD5</translation> + </message> + <message> + <source>Unknown KDF: %1</source> + <translation>KDF sconosciuto: %1</translation> + </message> + <message> + <source>Unknown key type: %1</source> + <translation>Tipo di chiave sconosciuta: %1</translation> </message> </context> <context> @@ -2892,7 +3075,7 @@ Si tratta di una migrazione unidirezionale. Non sarà possibile aprire il databa </message> <message> <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> - <translation type="unfinished"/> + <translation><p>KeePassHTTP è dichiarato obsoleto e verrà rimosso in un prossimo futuro.<br>Si consiglia di utilizzare KeePassXC-Browser piuttosto! Se hai bisogno di aiuto per effettuare la migrazione, visita la nostra <a href="https://keepassxc.org/docs/keepassxc-browser-migration">guida alla migrazione</a>.</p></translation> </message> <message> <source>Cannot bind to privileged ports</source> @@ -2966,7 +3149,7 @@ Viene usata la porta predefinita 19455.</translation> </message> <message> <source>Passphrase</source> - <translation>Frase accesso</translation> + <translation>Frase segreta</translation> </message> <message> <source>Wordlist:</source> @@ -3037,11 +3220,11 @@ Viene usata la porta predefinita 19455.</translation> </message> <message> <source>Database hash not available</source> - <translation type="unfinished"/> + <translation>Hash del database non disponibile</translation> </message> <message> <source>Client public key not received</source> - <translation type="unfinished"/> + <translation>Chiave pubblica del client non ricevuta</translation> </message> <message> <source>Cannot decrypt message</source> @@ -3049,7 +3232,7 @@ Viene usata la porta predefinita 19455.</translation> </message> <message> <source>Timeout or cannot connect to KeePassXC</source> - <translation type="unfinished"/> + <translation>Tempo scaduto o impossibile collegarsi a KeePassXC</translation> </message> <message> <source>Action cancelled or denied</source> @@ -3057,15 +3240,15 @@ Viene usata la porta predefinita 19455.</translation> </message> <message> <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> - <translation type="unfinished"/> + <translation>Impossibile cifrare il messaggio o chiave pubblica non trovata. La messaggistica nativa è abilitata in KeePassXC?</translation> </message> <message> <source>KeePassXC association failed, try again</source> - <translation type="unfinished"/> + <translation>Associazione KeePassXC fallita, riprova</translation> </message> <message> <source>Key change was not successful</source> - <translation type="unfinished"/> + <translation>Il cambiamento chiave non ha avuto successo</translation> </message> <message> <source>Encryption key is not recognized</source> @@ -3154,7 +3337,7 @@ Viene usata la porta predefinita 19455.</translation> <message> <source>Path of the entry to clip.</source> <comment>clip = copy to clipboard</comment> - <translation type="unfinished"/> + <translation>Percorso della voce da tagliare.</translation> </message> <message> <source>Timeout in seconds before clearing the clipboard.</source> @@ -3209,7 +3392,10 @@ Viene usata la porta predefinita 19455.</translation> unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>ATTENZIONE: state utilizzando un formato di file della chiave obsoleto che potrebbe diventare +non supportato in futuro. + +Per favore valutate la possibilita' di generare un nuovo file della chiave</translation> </message> <message> <source> @@ -3267,7 +3453,7 @@ Comandi disponibili: </message> <message> <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> - <translation type="unfinished"/> + <translation>Numero di attributi da mostrare. Questa opzione può essere specificata più di una volta, con ogni attributo mostrato in una riga separata nell'ordine dato. Se nessun attributo è specificato verrà dato un riassunto degli attributi predefiniti.</translation> </message> <message> <source>attribute</source> @@ -3353,7 +3539,7 @@ Comandi disponibili: </message> <message> <source>Legacy Browser Integration</source> - <translation type="unfinished"/> + <translation>Integrazione del browser legacy</translation> </message> <message> <source>Browser Integration</source> @@ -3375,6 +3561,52 @@ Comandi disponibili: <source>SSH Agent</source> <translation>Agente SSH</translation> </message> + <message> + <source>Generate a new random diceware passphrase.</source> + <translation>Genera una nuova passphrase casuale simulando un lancio di dadi.</translation> + </message> + <message> + <source>Word count for the diceware passphrase.</source> + <translation>Numero di parole per la passphrase con lancio dei dadi</translation> + </message> + <message> + <source>count</source> + <translation>conteggio</translation> + </message> + <message> + <source>Wordlist for the diceware generator. +[Default: EFF English]</source> + <translation>Lista di parole per il generatore con lancio di dadi. +[Predefinito: inglese EFF]</translation> + </message> + <message> + <source>Generate a new random password.</source> + <translation>Genera una nuova password casuale.</translation> + </message> + <message> + <source>Length of the generated password.</source> + <translation>Lunghezza della password generata.</translation> + </message> + <message> + <source>Use lowercase characters in the generated password.</source> + <translation>Includi lettere minuscole nella password generata.</translation> + </message> + <message> + <source>Use uppercase characters in the generated password.</source> + <translation>Includi lettere maiuscole nella password generata.</translation> + </message> + <message> + <source>Use numbers in the generated password.</source> + <translation>Includi numeri nella password generata.</translation> + </message> + <message> + <source>Use special characters in the generated password.</source> + <translation>Includi caratteri speciali nella password generata.</translation> + </message> + <message> + <source>Use extended ASCII in the generated password.</source> + <translation>Includi caratteri ASCII estesi nella password generata.</translation> + </message> </context> <context> <name>QtIOCompressor</name> @@ -3481,7 +3713,7 @@ Sblocca il database selezionato o scegline un altro che sia sbloccato.</translat </message> <message numerus="yes"> <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Rimossa con successo %n chiave di cifratura dalle impostazioni di KeePassX/Http.</numerusform><numerusform>Rimosse con successo %n chiavi di cifratura dalle impostazioni di KeePassX/Http.</numerusform></translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -3646,6 +3878,30 @@ Sblocca il database selezionato o scegline un altro che sia sbloccato.</translat <comment>Milliseconds</comment> <translation> ms</translation> </message> + <message> + <source>Startup</source> + <translation>Avvio</translation> + </message> + <message> + <source>File Management</source> + <translation>Gestione dei file</translation> + </message> + <message> + <source>Safely save database files (may be incompatible with Dropbox, etc)</source> + <translation>Salvataggio sicuro dei file di database (potrebbe essere incompatibile con Dropbox, ecc)</translation> + </message> + <message> + <source>Backup database file before saving</source> + <translation>Effettua una copia di sicurezza del database prima di salvarlo</translation> + </message> + <message> + <source>Entry Management</source> + <translation>Gestione dell'elemento</translation> + </message> + <message> + <source>General</source> + <translation>Generale</translation> + </message> </context> <context> <name>SettingsWidgetSecurity</name> @@ -3702,6 +3958,10 @@ Sblocca il database selezionato o scegline un altro che sia sbloccato.</translat <source>Use Google as fallback for downloading website icons</source> <translation>Usa Google come alternativa per scaricare le icone dal sito web</translation> </message> + <message> + <source>Re-lock previously locked database after performing Auto-Type</source> + <translation>Blocca nuovamente un database precedentemente bloccato dopo aver completato l'Auto-Type</translation> + </message> </context> <context> <name>SetupTotpDialog</name> @@ -3715,11 +3975,11 @@ Sblocca il database selezionato o scegline un altro che sia sbloccato.</translat </message> <message> <source>Default RFC 6238 token settings</source> - <translation type="unfinished"/> + <translation>Impostazioni predefinite per il token RFC 6238</translation> </message> <message> <source>Steam token settings</source> - <translation type="unfinished"/> + <translation>Impostazioni del token di vapore</translation> </message> <message> <source>Use custom settings</source> @@ -3783,10 +4043,6 @@ Sblocca il database selezionato o scegline un altro che sia sbloccato.</translat </context> <context> <name>WelcomeWidget</name> - <message> - <source>Welcome to KeePassXC</source> - <translation>Benvenuto in KeePassXC</translation> - </message> <message> <source>Start storing your passwords securely in a KeePassXC database</source> <translation>Inizia ad archiviare le tue password in modo sicuro in un database di KeePassXC</translation> @@ -3811,6 +4067,10 @@ Sblocca il database selezionato o scegline un altro che sia sbloccato.</translat <source>Recent databases</source> <translation>Database recenti</translation> </message> + <message> + <source>Welcome to KeePassXC %1</source> + <translation>Benvenuto in KeePassXC %1</translation> + </message> </context> <context> <name>main</name> @@ -3848,7 +4108,7 @@ Sblocca il database selezionato o scegline un altro che sia sbloccato.</translat </message> <message> <source>Parent window handle</source> - <translation type="unfinished"/> + <translation>Riferimento alla finestra padre</translation> </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_ja.ts b/share/translations/keepassx_ja.ts index c2bf7e52c..1a7afdd9a 100644 --- a/share/translations/keepassx_ja.ts +++ b/share/translations/keepassx_ja.ts @@ -15,11 +15,7 @@ </message> <message> <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassXC は GNU General Public License (GPL) version 2 または version 3 (どちらかを選択)の条件で配布されます。</translation> - </message> - <message> - <source>Project Maintainers:</source> - <translation>プロジェクトメンテナ:</translation> + <translation>KeePassXC は GNU General Public License (GPL) version 2 または version 3 (どちらかを選択) の条件で配布されます。</translation> </message> <message> <source>Contributors</source> @@ -71,6 +67,20 @@ CPU アーキテクチャ: %2 <source>Enabled extensions:</source> <translation>有効化された拡張機能:</translation> </message> + <message> + <source>Project Maintainers:</source> + <translation>プロジェクトメンテナ:</translation> + </message> + <message> + <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> + <translation>KeePassXC チームはオリジナルの KeePassX を作成した debfx に心から感謝します。</translation> + </message> + <message> + <source>Build Type: %1 +</source> + <translation>ビルド形式: %1 +</translation> + </message> </context> <context> <name>AccessControlDialog</name> @@ -132,7 +142,7 @@ Please select whether you want to allow access.</source> </message> <message> <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>この自動入力コマンドは何度も繰り返されている引数が含まれています。本当に続行しますか?</translation> </message> </context> <context> @@ -150,6 +160,25 @@ Please select whether you want to allow access.</source> <translation>デフォルトのシーケンス</translation> </message> </context> +<context> + <name>AutoTypeMatchModel</name> + <message> + <source>Group</source> + <translation>グループ</translation> + </message> + <message> + <source>Title</source> + <translation>タイトル</translation> + </message> + <message> + <source>Username</source> + <translation>ユーザー名</translation> + </message> + <message> + <source>Sequence</source> + <translation>シーケンス</translation> + </message> +</context> <context> <name>AutoTypeSelectDialog</name> <message> @@ -279,7 +308,7 @@ Please select whether you want to allow access.</source> <message> <source>Never ask before &updating credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation>クレデンシャルをアップデートする前に確認しない(&U)</translation> + <translation>クレデンシャルを更新する前に確認しない(&U)</translation> </message> <message> <source>Only the selected database has to be connected with a client.</source> @@ -300,11 +329,11 @@ Please select whether you want to allow access.</source> </message> <message> <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> - <translation>起動時に、KeePassXC または keepassxc-proxy のバイナリーパスを自動的に Native messaging スクリプトに更新します。</translation> + <translation>起動時に、KeePassXC または keepassxc-proxy のバイナリーパスを自動的に Native messaging スクリプトに更新します。</translation> </message> <message> <source>Update &native messaging manifest files at startup</source> - <translation>起動時に Native messaging のマニフェストファイルを更新する(&N)</translation> + <translation>起動時に Native messaging のマニフェストファイルを更新する(&N)</translation> </message> <message> <source>Support a proxy application between KeePassXC and browser extension.</source> @@ -316,7 +345,7 @@ Please select whether you want to allow access.</source> </message> <message> <source>Use a custom proxy location if you installed a proxy manually.</source> - <translation type="unfinished"/> + <translation>手動でプロキシをインストールした場合は、カスタムプロキシを使用します。</translation> </message> <message> <source>Use a &custom proxy location</source> @@ -431,7 +460,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message numerus="yes"> <source>Successfully removed permissions from %n entry(s).</source> - <translation><numerusform>%n 個のエントリーから無事にアクセス許可が削除されました。</numerusform></translation> + <translation><numerusform>%n 個のエントリーからアクセス許可が無事に削除されました。</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -490,7 +519,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Unable to create Key File : </source> - <translation>キーファイルを作成できませんでした:</translation> + <translation>キーファイルを作成できません: </translation> </message> <message> <source>Select a key file</source> @@ -624,7 +653,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Original data: </source> - <translation>元データ:</translation> + <translation>元データ: </translation> </message> <message> <source>Error(s) detected in CSV file !</source> @@ -699,7 +728,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Unable to open the database.</source> - <translation>データベースを開けませんでした。</translation> + <translation>データベースを開けません。</translation> </message> <message> <source>Can't open key file</source> @@ -752,7 +781,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Unable to open the database.</source> - <translation>データベースを開けませんでした。</translation> + <translation>データベースを開けません。</translation> </message> <message> <source>Database opened fine. Nothing to do.</source> @@ -770,7 +799,7 @@ You can now save it.</source> </message> <message> <source>Unable to repair the database.</source> - <translation>データベースを修復できませんでした。</translation> + <translation>データベースを修復できません。</translation> </message> </context> <context> @@ -825,6 +854,16 @@ If you keep this number, your database may be too easy to crack!</source> <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> <translation>新しい KDF のパラメーターでのキー変換に失敗しました。KDF は変更されません。</translation> </message> + <message numerus="yes"> + <source> MiB</source> + <comment>Abbreviation for Mebibytes (KDF settings)</comment> + <translation><numerusform> MiB</numerusform></translation> + </message> + <message numerus="yes"> + <source> thread(s)</source> + <comment>Threads for parallel execution (KDF settings)</comment> + <translation><numerusform> スレッド</numerusform></translation> + </message> </context> <context> <name>DatabaseSettingsWidgetEncryption</name> @@ -850,24 +889,16 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Benchmark 1-second delay</source> - <translation type="unfinished"/> + <translation>ベンチマーク 1秒遅延</translation> </message> <message> <source>Memory Usage:</source> <translation>メモリ使用量:</translation> </message> - <message> - <source> MB</source> - <translation> MB</translation> - </message> <message> <source>Parallelism:</source> <translation>並列処理:</translation> </message> - <message> - <source> thread</source> - <translation> スレッド</translation> - </message> </context> <context> <name>DatabaseSettingsWidgetGeneral</name> @@ -907,6 +938,14 @@ If you keep this number, your database may be too easy to crack!</source> <source>Use recycle bin</source> <translation>ゴミ箱を使用する</translation> </message> + <message> + <source>Additional Database Settings</source> + <translation>追加のデータベース設定</translation> + </message> + <message> + <source>Enable &compression (recommended)</source> + <translation>圧縮を有効にする (推奨)(&C)</translation> + </message> </context> <context> <name>DatabaseTabWidget</name> @@ -933,7 +972,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Unable to open the database.</source> - <translation>データベースを開けませんでした。</translation> + <translation>データベースを開けません。</translation> </message> <message> <source>File opened in read only mode.</source> @@ -980,7 +1019,7 @@ Discard changes and close anyway?</source> <message> <source>"%1" was modified. Save changes?</source> - <translation>"%1" は編集されています。 + <translation>"%1" は更新されています。 変更を保存しますか?</translation> </message> <message> @@ -1005,7 +1044,7 @@ Save changes?</source> </message> <message> <source>New database</source> - <translation>新規データベース</translation> + <translation>新しいデータベース</translation> </message> <message> <source>locked</source> @@ -1029,6 +1068,16 @@ Otherwise your changes are lost.</source> ロックを行う前にデータベースを保存しますか? 保存しない場合には変更点は失われます。</translation> </message> + <message> + <source>Disable safe saves?</source> + <translation>安全な保存を無効にしますか?</translation> + </message> + <message> + <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</source> + <translation>KeePassXC はデータベースの多段階保存に失敗しました。これは恐らく、保存するファイルをロックしているファイル同期サービスが原因だと思われます。 +安全な保存を無効にして再試行しますか?</translation> + </message> </context> <context> <name>DatabaseWidget</name> @@ -1142,6 +1191,10 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>ゴミ箱にある全項目を永久に削除してもよろしいですか?</translation> </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DetailsWidget</name> @@ -1179,7 +1232,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Searching</source> - <translation>検索</translation> + <translation>検索中</translation> </message> <message> <source>Attributes</source> @@ -1258,7 +1311,7 @@ Do you want to merge your changes?</source> </message> <message> <source>n/a</source> - <translation type="unfinished"/> + <translation>N/A</translation> </message> <message> <source>(encrypted)</source> @@ -1328,6 +1381,18 @@ Do you want to merge your changes?</source> <source>1 year</source> <translation>1年</translation> </message> + <message> + <source>Apply generated password?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to apply the generated password to this entry?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAdvanced</name> @@ -1359,6 +1424,14 @@ Do you want to merge your changes?</source> <source>Attachments</source> <translation>添付ファイル</translation> </message> + <message> + <source>Foreground Color:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Background Color:</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -1391,12 +1464,8 @@ Do you want to merge your changes?</source> <translation>ウィンドウタイトル:</translation> </message> <message> - <source>Use default se&quence</source> - <translation>デフォルトのシーケンスを使用する(&Q)</translation> - </message> - <message> - <source>Set custo&m sequence:</source> - <translation>カスタムしたシーケンスを設定する(&M):</translation> + <source>Use a specific sequence for this association:</source> + <translation>このアソシエーションに特定のシーケンスを使用する:</translation> </message> </context> <context> @@ -1446,7 +1515,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Toggle the checkbox to reveal the notes section.</source> - <translation>チェックボックスを切り替えるとメモを表示します。</translation> + <translation>チェックボックスにチェックを入れるとメモが表示されます。</translation> </message> <message> <source>Username:</source> @@ -1461,7 +1530,7 @@ Do you want to merge your changes?</source> <name>EditEntryWidgetSSHAgent</name> <message> <source>Form</source> - <translation type="unfinished"/> + <translation>フォーム</translation> </message> <message> <source>Remove key from agent after</source> @@ -1497,7 +1566,7 @@ Do you want to merge your changes?</source> </message> <message> <source>n/a</source> - <translation type="unfinished"/> + <translation>N/A</translation> </message> <message> <source>Copy to clipboard</source> @@ -1676,6 +1745,31 @@ Do you want to merge your changes?</source> <source>Uuid:</source> <translation>UUID:</translation> </message> + <message> + <source>Plugin Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove</source> + <translation>削除</translation> + </message> + <message> + <source>Delete plugin data?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Value</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Entry</name> @@ -1700,7 +1794,7 @@ Do you want to merge your changes?</source> <name>EntryAttachmentsWidget</name> <message> <source>Form</source> - <translation type="unfinished"/> + <translation>フォーム</translation> </message> <message> <source>Add</source> @@ -1724,7 +1818,7 @@ Do you want to merge your changes?</source> </message> <message numerus="yes"> <source>Are you sure you want to remove %n attachment(s)?</source> - <translation><numerusform>%n 個の添付を削除してもよろしいですか?</numerusform></translation> + <translation><numerusform>%n 個の添付ファイルを削除してもよろしいですか?</numerusform></translation> </message> <message> <source>Confirm Remove</source> @@ -1732,12 +1826,12 @@ Do you want to merge your changes?</source> </message> <message> <source>Save attachments</source> - <translation>添付を保存</translation> + <translation>添付ファイルを保存</translation> </message> <message> <source>Unable to create directory: %1</source> - <translation>ディレクトリを作成できませんでした: + <translation>ディレクトリを作成できません: %1</translation> </message> <message> @@ -1751,25 +1845,25 @@ Do you want to merge your changes?</source> <message> <source>Unable to save attachments: %1</source> - <translation>添付を保存できませんでした: + <translation>添付ファイルを保存できません: %1</translation> </message> <message> <source>Unable to open attachment: %1</source> - <translation>添付を開けませんでした: + <translation>添付ファイルを開けません: %1</translation> </message> <message> <source>Unable to open attachments: %1</source> - <translation>添付を開けませんでした: + <translation>添付ファイルを開けません: %1</translation> </message> <message> <source>Unable to open files: %1</source> - <translation>ファイルを開けませんでした: + <translation>ファイルを開けません: %1</translation> </message> </context> @@ -1804,7 +1898,7 @@ Do you want to merge your changes?</source> <message> <source>Ref: </source> <comment>Reference abbreviation</comment> - <translation>参照:</translation> + <translation>参照: </translation> </message> <message> <source>Group</source> @@ -1822,6 +1916,65 @@ Do you want to merge your changes?</source> <source>URL</source> <translation>URL</translation> </message> + <message> + <source>Never</source> + <translation>なし</translation> + </message> + <message> + <source>Password</source> + <translation>パスワード</translation> + </message> + <message> + <source>Notes</source> + <translation>メモ</translation> + </message> + <message> + <source>Expires</source> + <translation>期限</translation> + </message> + <message> + <source>Created</source> + <translation>作成日時</translation> + </message> + <message> + <source>Modified</source> + <translation>編集日時</translation> + </message> + <message> + <source>Accessed</source> + <translation>アクセス日時</translation> + </message> + <message> + <source>Attachments</source> + <translation>添付ファイル</translation> + </message> +</context> +<context> + <name>EntryView</name> + <message> + <source>Customize View</source> + <translation>表示のカスタマイズ</translation> + </message> + <message> + <source>Hide Usernames</source> + <translation>ユーザー名を隠す</translation> + </message> + <message> + <source>Hide Passwords</source> + <translation>パスワードを隠す</translation> + </message> + <message> + <source>Fit to window</source> + <translation>ウィンドウに合わせる</translation> + </message> + <message> + <source>Fit to contents</source> + <translation>内容に合わせる</translation> + </message> + <message> + <source>Reset to defaults</source> + <translation>デフォルトにリセット</translation> + </message> </context> <context> <name>Group</name> @@ -1891,6 +2044,10 @@ Do you want to merge your changes?</source> <source>Ensure that the password contains characters from every group</source> <translation>使用する文字種の文字が必ず含まれるようにする</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>拡張 ASCII</translation> + </message> </context> <context> <name>KMessageWidget</name> @@ -1941,7 +2098,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Invalid header checksum size</source> - <translation>ヘッダーのチェックサムのサイズが不正です</translation> + <translation>ヘッダーのチェックサムサイズが不正です</translation> </message> <message> <source>Header SHA256 mismatch</source> @@ -2162,7 +2319,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Invalid group icon number</source> - <translation>グループアイコン番号が不正です</translation> + <translation>グループのアイコン番号が不正です</translation> </message> <message> <source>Invalid EnableAutoType value</source> @@ -2174,7 +2331,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>No group uuid found</source> - <translation>グループの UUID がありません</translation> + <translation>グループの UUID が見つかりません</translation> </message> <message> <source>Null DeleteObject uuid</source> @@ -2190,11 +2347,11 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Invalid entry icon number</source> - <translation>エントリーアイコン番号が不正です</translation> + <translation>エントリーのアイコン番号が不正です</translation> </message> <message> <source>History element in history entry</source> - <translation type="unfinished"/> + <translation>履歴エントリー内に履歴要素が存在します</translation> </message> <message> <source>No entry uuid found</source> @@ -2202,31 +2359,31 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>History element with different uuid</source> - <translation type="unfinished"/> + <translation>履歴要素の UUID が異なります</translation> </message> <message> <source>Unable to decrypt entry string</source> - <translation type="unfinished"/> + <translation>エントリーの文字列を復号できません</translation> </message> <message> <source>Duplicate custom attribute found</source> - <translation type="unfinished"/> + <translation>重複したカスタム属性が見つかりました</translation> </message> <message> <source>Entry string key or value missing</source> - <translation type="unfinished"/> + <translation>エントリーの文字列 Key または Value がありません</translation> </message> <message> <source>Duplicate attachment found</source> - <translation type="unfinished"/> + <translation>重複した添付ファイルが見つかりました</translation> </message> <message> <source>Entry binary key or value missing</source> - <translation type="unfinished"/> + <translation>エントリーのバイナリー Key または Value がありません</translation> </message> <message> <source>Auto-type association window or sequence missing</source> - <translation type="unfinished"/> + <translation>自動入力の関連付けウィンドウまたは自動入力シーケンスがありません</translation> </message> <message> <source>Invalid bool value</source> @@ -2255,7 +2412,7 @@ This is a one-way migration. You won't be able to open the imported databas <message> <source>Unable to decompress binary</source> <extracomment>Translator meant is a binary data inside an entry</extracomment> - <translation type="unfinished"/> + <translation>バイナリーを展開できません</translation> </message> </context> <context> @@ -2266,14 +2423,14 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Unable to open the database.</source> - <translation>データベースを開けませんでした。</translation> + <translation>データベースを開けません。</translation> </message> </context> <context> <name>KeePass1Reader</name> <message> <source>Unable to read keyfile.</source> - <translation>キーファイルを読み込めませんでした。</translation> + <translation>キーファイルを読み込めません。</translation> </message> <message> <source>Not a KeePass database.</source> @@ -2290,7 +2447,7 @@ This is a one-way migration. You won't be able to open the imported databas <message> <source>Unable to read encryption IV</source> <comment>IV = Initialization Vector for symmetric cipher</comment> - <translation type="unfinished"/> + <translation>Encryption IV (暗号化初期化ベクトル) を読み取れません</translation> </message> <message> <source>Invalid number of groups</source> @@ -2302,7 +2459,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Invalid content hash size</source> - <translation>コンテンツハッシュサイズが無効です</translation> + <translation>コンテンツハッシュサイズが不正です</translation> </message> <message> <source>Invalid transform seed size</source> @@ -2314,7 +2471,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Unable to construct group tree</source> - <translation type="unfinished"/> + <translation>グループツリーを構成できません</translation> </message> <message> <source>Root</source> @@ -2330,91 +2487,91 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Key transformation failed</source> - <translation type="unfinished"/> + <translation>キー変換に失敗しました</translation> </message> <message> <source>Invalid group field type number</source> - <translation>グループフィールドタイプの数が不正です</translation> + <translation>グループのフィールドタイプ数が不正です</translation> </message> <message> <source>Invalid group field size</source> - <translation>グループフィールドのサイズが不正です</translation> + <translation>グループのフィールドサイズが不正です</translation> </message> <message> <source>Read group field data doesn't match size</source> - <translation type="unfinished"/> + <translation>読み込んだグループのフィールドデータはサイズが一致しません</translation> </message> <message> <source>Incorrect group id field size</source> - <translation type="unfinished"/> + <translation>グループの ID フィールドサイズが正しくありません</translation> </message> <message> <source>Incorrect group creation time field size</source> - <translation type="unfinished"/> + <translation>グループの作成日時フィールドサイズが正しくありません</translation> </message> <message> <source>Incorrect group modification time field size</source> - <translation type="unfinished"/> + <translation>グループの編集日時フィールドサイズが正しくありません</translation> </message> <message> <source>Incorrect group access time field size</source> - <translation type="unfinished"/> + <translation>グループのアクセス日時フィールドサイズが正しくありません</translation> </message> <message> <source>Incorrect group expiry time field size</source> - <translation type="unfinished"/> + <translation>グループの有効期限フィールドサイズが正しくありません</translation> </message> <message> <source>Incorrect group icon field size</source> - <translation type="unfinished"/> + <translation>グループのアイコンフィールドサイズが正しくありません</translation> </message> <message> <source>Incorrect group level field size</source> - <translation type="unfinished"/> + <translation>グループのレベルフィールドサイズが正しくありません</translation> </message> <message> <source>Invalid group field type</source> - <translation>グループフィールドのタイプが不正です</translation> + <translation>グループのフィールドタイプが不正です</translation> </message> <message> <source>Missing group id or level</source> - <translation type="unfinished"/> + <translation>グループの ID またはレベルがありません</translation> </message> <message> <source>Missing entry field type number</source> - <translation type="unfinished"/> + <translation>エントリーのフィールドタイプ番号がありません</translation> </message> <message> <source>Invalid entry field size</source> - <translation>エントリーフィールドのサイズが不正です</translation> + <translation>エントリーのフィールドサイズが不正です</translation> </message> <message> <source>Read entry field data doesn't match size</source> - <translation type="unfinished"/> + <translation>読み込んだエントリーのフィールドデータはサイズが一致しません</translation> </message> <message> <source>Invalid entry uuid field size</source> - <translation>エントリーの UUID フィールドのサイズが不正です</translation> + <translation>エントリーの UUID フィールドサイズが不正です</translation> </message> <message> <source>Invalid entry group id field size</source> - <translation>エントリーのグループ ID フィールドのサイズが不正です</translation> + <translation>エントリーのグループ ID フィールドサイズが不正です</translation> </message> <message> <source>Invalid entry icon field size</source> - <translation>エントリーのアイコンフィールドのサイズが不正です</translation> + <translation>エントリーのアイコンフィールドサイズが不正です</translation> </message> <message> <source>Invalid entry creation time field size</source> - <translation>エントリーの作成日時フィールドのサイズが不正です</translation> + <translation>エントリーの作成日時フィールドサイズが不正です</translation> </message> <message> <source>Invalid entry modification time field size</source> - <translation>エントリーの編集日時フィールドのサイズが不正です</translation> + <translation>エントリーの編集日時フィールドサイズが不正です</translation> </message> <message> <source>Invalid entry expiry time field size</source> - <translation>エントリーの有効期限フィールドのサイズが不正です</translation> + <translation>エントリーの期限日時フィールドサイズが不正です</translation> </message> <message> <source>Invalid entry field type</source> @@ -2472,7 +2629,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Time-based one-time password</source> - <translation type="unfinished"/> + <translation>タイムベースワンタイムパスワード</translation> </message> <message> <source>&Groups</source> @@ -2660,7 +2817,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> - <translation type="unfinished"/> + <translation><p>ブラウザ統合に KeePassHTTP を使用しています。この機能は将来的に廃止され、削除されます。<br>代わりに KeePassXC-Browser を使用してください。移行に関するヘルプは <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> を参照してください (%1 / 3 回目の警告)。</p></translation> </message> <message> <source>read-only</source> @@ -2702,6 +2859,14 @@ This is a one-way migration. You won't be able to open the imported databas <source>Please touch the button on your YubiKey!</source> <translation>YubiKey のボタンにタッチしてください</translation> </message> + <message> + <source>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</source> + <translation>警告: KeePassXC の開発版を使用しています。 +データベース破損の危険性が高いため、バックアップを維持します。 +このバージョンは正式版ではありません。</translation> + </message> </context> <context> <name>OpenSSHKey</name> @@ -2711,19 +2876,15 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>PEM boundary mismatch</source> - <translation type="unfinished"/> - </message> - <message> - <source>This is not an OpenSSH key, only modern keys are supported</source> - <translation type="unfinished"/> + <translation>PEM のバウンダリーが不一致です</translation> </message> <message> <source>Base64 decoding failed</source> - <translation type="unfinished"/> + <translation>Base64 のデコードに失敗しました</translation> </message> <message> <source>Key file way too small.</source> - <translation type="unfinished"/> + <translation>キーファイルが小さすぎます。</translation> </message> <message> <source>Key file magic header id invalid</source> @@ -2731,71 +2892,79 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Found zero keys</source> - <translation type="unfinished"/> + <translation>キーが 0 です</translation> </message> <message> <source>Failed to read public key.</source> - <translation type="unfinished"/> + <translation>公開鍵の読み取りに失敗しました。</translation> </message> <message> <source>Corrupted key file, reading private key failed</source> - <translation type="unfinished"/> + <translation>キーファイルが破損しているため私有鍵の読み取りに失敗しました</translation> </message> <message> <source>No private key payload to decrypt</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown cipher: </source> - <translation type="unfinished"/> + <translation>復号する私有鍵のペイロードがありません</translation> </message> <message> <source>Trying to run KDF without cipher</source> - <translation type="unfinished"/> + <translation>暗号なしで KDF を実行しようとしています</translation> </message> <message> <source>Passphrase is required to decrypt this key</source> - <translation type="unfinished"/> + <translation>この鍵を復号するパスフレーズが必要です</translation> </message> <message> <source>Key derivation failed, key file corrupted?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown KDF: </source> - <translation type="unfinished"/> + <translation>鍵の導出に失敗しました。キーファイルが壊れていませんか?</translation> </message> <message> <source>Decryption failed, wrong passphrase?</source> - <translation type="unfinished"/> + <translation>復号化に失敗しました。パスフレーズが間違っていませんか?</translation> </message> <message> <source>Unexpected EOF while reading public key</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown key type: </source> - <translation type="unfinished"/> + <translation>公開鍵の読み取り中に予期しない EOF がありました</translation> </message> <message> <source>Unexpected EOF while reading private key</source> - <translation type="unfinished"/> + <translation>私有鍵の読み取り中に予期しない EOF がありました</translation> </message> <message> <source>Can't write public key as it is empty</source> - <translation type="unfinished"/> + <translation>公開鍵が空のため書き込めません</translation> </message> <message> <source>Unexpected EOF when writing public key</source> - <translation type="unfinished"/> + <translation>公開鍵の書き込み中に予期しない EOF がありました</translation> </message> <message> <source>Can't write private key as it is empty</source> - <translation type="unfinished"/> + <translation>私有鍵が空のため書き込めません</translation> </message> <message> <source>Unexpected EOF when writing private key</source> - <translation type="unfinished"/> + <translation>私有鍵の書き込み中に予期しない EOF がありました</translation> + </message> + <message> + <source>Unsupported key type: %1</source> + <translation>サポートしていない鍵の種類です: %1</translation> + </message> + <message> + <source>Unknown cipher: %1</source> + <translation>不明な暗号です: %1</translation> + </message> + <message> + <source>Cipher IV is too short for MD5 kdf</source> + <translation>暗号初期化ベクトルが MD5 KDF に対して短すぎます</translation> + </message> + <message> + <source>Unknown KDF: %1</source> + <translation>不明な KDF です: %1</translation> + </message> + <message> + <source>Unknown key type: %1</source> + <translation>不明な鍵の種類です: %1</translation> </message> </context> <context> @@ -2907,7 +3076,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> - <translation type="unfinished"/> + <translation><p>KeePassHTTP は将来的に廃止され、削除されます。<br>代わりに KeePassXC-Browser を使用してください。移行に関するヘルプは <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> を参照してください。</p></translation> </message> <message> <source>Cannot bind to privileged ports</source> @@ -3048,71 +3217,71 @@ Using default port 19455.</source> <name>QObject</name> <message> <source>Database not opened</source> - <translation type="unfinished"/> + <translation>データベースが開かれていません</translation> </message> <message> <source>Database hash not available</source> - <translation type="unfinished"/> + <translation>データベースハッシュが利用できません</translation> </message> <message> <source>Client public key not received</source> - <translation type="unfinished"/> + <translation>クライアントの公開鍵を受信しませんでした</translation> </message> <message> <source>Cannot decrypt message</source> - <translation type="unfinished"/> + <translation>メッセージを復号できません</translation> </message> <message> <source>Timeout or cannot connect to KeePassXC</source> - <translation type="unfinished"/> + <translation>KeePassXC に接続できないかタイムアウトしました</translation> </message> <message> <source>Action cancelled or denied</source> - <translation type="unfinished"/> + <translation>アクションがキャンセルまたは拒否されました</translation> </message> <message> <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> - <translation type="unfinished"/> + <translation>メッセージを暗号化できないか、公開鍵が見つかりません。Native Messaging は KeePassXC で有効化されていますか?</translation> </message> <message> <source>KeePassXC association failed, try again</source> - <translation type="unfinished"/> + <translation>KeePassXC のアソシエーションに失敗しました。再試行してください。</translation> </message> <message> <source>Key change was not successful</source> - <translation type="unfinished"/> + <translation>キーの変更は成功しませんでした</translation> </message> <message> <source>Encryption key is not recognized</source> - <translation type="unfinished"/> + <translation>暗号化キーが認識されません</translation> </message> <message> <source>No saved databases found</source> - <translation type="unfinished"/> + <translation>保存されたデータベースが見つかりません</translation> </message> <message> <source>Incorrect action</source> - <translation type="unfinished"/> + <translation>不正確なアクションです</translation> </message> <message> <source>Empty message received</source> - <translation type="unfinished"/> + <translation>空のメッセージを受信しました</translation> </message> <message> <source>No URL provided</source> - <translation type="unfinished"/> + <translation>URL がありません</translation> </message> <message> <source>No logins found</source> - <translation type="unfinished"/> + <translation>ログインしません</translation> </message> <message> <source>Unknown error</source> - <translation type="unfinished"/> + <translation>不明なエラーです</translation> </message> <message> <source>Add a new entry to a database.</source> - <translation type="unfinished"/> + <translation>データベースに新しいエントリーを追加する。</translation> </message> <message> <source>Path of the database.</source> @@ -3120,7 +3289,7 @@ Using default port 19455.</source> </message> <message> <source>Key file of the database.</source> - <translation type="unfinished"/> + <translation>データベースのキーファイル。</translation> </message> <message> <source>path</source> @@ -3164,12 +3333,12 @@ Using default port 19455.</source> </message> <message> <source>Copy an entry's password to the clipboard.</source> - <translation type="unfinished"/> + <translation>クリップボードにエントリーのパスワードをコピーする。</translation> </message> <message> <source>Path of the entry to clip.</source> <comment>clip = copy to clipboard</comment> - <translation>クリップするエントリーのパス。</translation> + <translation>クリップボードにコピーするエントリーのパス。</translation> </message> <message> <source>Timeout in seconds before clearing the clipboard.</source> @@ -3177,7 +3346,7 @@ Using default port 19455.</source> </message> <message> <source>Edit an entry.</source> - <translation type="unfinished"/> + <translation>エントリーを編集する。</translation> </message> <message> <source>Title for the entry.</source> @@ -3189,19 +3358,19 @@ Using default port 19455.</source> </message> <message> <source>Path of the entry to edit.</source> - <translation type="unfinished"/> + <translation>編集するエントリーのパス。</translation> </message> <message> <source>Estimate the entropy of a password.</source> - <translation type="unfinished"/> + <translation>パスワードのエントロピーの推定。</translation> </message> <message> <source>Password for which to estimate the entropy.</source> - <translation type="unfinished"/> + <translation>エントロピーを推定するパスワード。</translation> </message> <message> <source>Perform advanced analysis on the password.</source> - <translation type="unfinished"/> + <translation>パスワードの詳細な分析を実行する。</translation> </message> <message> <source>Extract and print the content of a database.</source> @@ -3213,11 +3382,11 @@ Using default port 19455.</source> </message> <message> <source>Insert password to unlock %1: </source> - <translation type="unfinished"/> + <translation>%1 のロックを解除するパスワードを入力してください: </translation> </message> <message> <source>Failed to load key file %1 : %2</source> - <translation type="unfinished"/> + <translation>キーファイル %1 の読み込みに失敗しました: %2</translation> </message> <message> <source>WARNING: You are using a legacy key file format which may become @@ -3234,7 +3403,10 @@ Please consider generating a new key file.</source> Available commands: </source> - <translation type="unfinished"/> + <translation> + +利用可能なコマンド: +</translation> </message> <message> <source>Name of the command to execute.</source> @@ -3250,11 +3422,11 @@ Available commands: </message> <message> <source>Find entries quickly.</source> - <translation type="unfinished"/> + <translation>素早くエントリーを見つけ出す。</translation> </message> <message> <source>Search term.</source> - <translation type="unfinished"/> + <translation>検索語。</translation> </message> <message> <source>Merge two databases.</source> @@ -3278,15 +3450,15 @@ Available commands: </message> <message> <source>Show an entry's information.</source> - <translation type="unfinished"/> + <translation>エントリーの情報を表示する。</translation> </message> <message> <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> - <translation type="unfinished"/> + <translation>表示する属性の名前。このオプションはいくつでも指定することができ、各属性は指定した順に1行に1つずつ表示されます。属性の指定がない場合は、デフォルトの属性の概要が表示されます。</translation> </message> <message> <source>attribute</source> - <translation type="unfinished"/> + <translation>属性</translation> </message> <message> <source>Name of the entry to show.</source> @@ -3303,7 +3475,8 @@ Available commands: <message> <source>file empty ! </source> - <translation>空ファイルです</translation> + <translation>空ファイルです +</translation> </message> <message> <source>malformed string</source> @@ -3315,27 +3488,27 @@ Available commands: </message> <message> <source>AES: 256-bit</source> - <translation type="unfinished"/> + <translation>AES: 256 ビット</translation> </message> <message> <source>Twofish: 256-bit</source> - <translation type="unfinished"/> + <translation>Twofish: 256 ビット</translation> </message> <message> <source>ChaCha20: 256-bit</source> - <translation type="unfinished"/> + <translation>ChaCha20: 256 ビット</translation> </message> <message> <source>Argon2 (KDBX 4 – recommended)</source> - <translation type="unfinished"/> + <translation>Argon2 (KDBX 4 – 推奨)</translation> </message> <message> <source>AES-KDF (KDBX 4)</source> - <translation type="unfinished"/> + <translation>AES-KDF (KDBX 4)</translation> </message> <message> <source>AES-KDF (KDBX 3.1)</source> - <translation type="unfinished"/> + <translation>AES-KDF (KDBX 3.1)</translation> </message> <message> <source>Group</source> @@ -3367,7 +3540,7 @@ Available commands: </message> <message> <source>Legacy Browser Integration</source> - <translation type="unfinished"/> + <translation>レガシーなブラウザ統合</translation> </message> <message> <source>Browser Integration</source> @@ -3389,6 +3562,52 @@ Available commands: <source>SSH Agent</source> <translation>SSH エージェント</translation> </message> + <message> + <source>Generate a new random diceware passphrase.</source> + <translation>新しいランダムなダイスウェアパスフレーズを生成する。</translation> + </message> + <message> + <source>Word count for the diceware passphrase.</source> + <translation>ダイスウェアパスフレーズの単語数。</translation> + </message> + <message> + <source>count</source> + <translation>カウント</translation> + </message> + <message> + <source>Wordlist for the diceware generator. +[Default: EFF English]</source> + <translation>ダイスウェアジェネレーターの単語リスト。 +[デフォルト: EFF English]</translation> + </message> + <message> + <source>Generate a new random password.</source> + <translation>新しいランダムなパスワードを生成する。</translation> + </message> + <message> + <source>Length of the generated password.</source> + <translation>生成されるパスワードの長さ。</translation> + </message> + <message> + <source>Use lowercase characters in the generated password.</source> + <translation>小文字を使用したパスワードを生成する。</translation> + </message> + <message> + <source>Use uppercase characters in the generated password.</source> + <translation>大文字を使用したパスワードを生成する。</translation> + </message> + <message> + <source>Use numbers in the generated password.</source> + <translation>数字を使用したパスワードを生成する。</translation> + </message> + <message> + <source>Use special characters in the generated password.</source> + <translation>特殊な文字を使用したパスワードを生成する。</translation> + </message> + <message> + <source>Use extended ASCII in the generated password.</source> + <translation>拡張 ASCII を使用したパスワードを生成する。</translation> + </message> </context> <context> <name>QtIOCompressor</name> @@ -3398,15 +3617,15 @@ Available commands: </message> <message> <source>Error writing to underlying device: </source> - <translation>基本デバイスへの書き込み時にエラーが発生しました:</translation> + <translation>基本デバイスへの書き込み時にエラーが発生しました: </translation> </message> <message> <source>Error opening underlying device: </source> - <translation>基本デバイスを開く時にエラーが発生しました:</translation> + <translation>基本デバイスを開く際にエラーが発生しました: </translation> </message> <message> <source>Error reading data from underlying device: </source> - <translation>基本デバイスから読み込み時にエラーが発生しました:</translation> + <translation>基本デバイスから読み込み時にエラーが発生しました: </translation> </message> <message> <source>Internal zlib error when decompressing: </source> @@ -3421,7 +3640,7 @@ Available commands: </message> <message> <source>Internal zlib error: </source> - <translation>内部の zlib エラー:</translation> + <translation>内部 zlib エラー: </translation> </message> </context> <context> @@ -3527,7 +3746,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message numerus="yes"> <source>Successfully removed permissions from %n entries.</source> - <translation><numerusform>%n 個のエントリーから無事にアクセス許可が削除されました。</numerusform></translation> + <translation><numerusform>%n 個のエントリーからアクセス許可が無事に削除されました。</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -3605,11 +3824,11 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> - <translation>データ以外の変更(例えばグループの展開)に対して、データベースを修正済みとしてマークしないようにする</translation> + <translation>データ以外の変更 (例えばグループの展開) に対して、データベースを修正済みとしてマークしないようにする</translation> </message> <message> <source>Hide the Details view</source> - <translation>詳細を非表示にする</translation> + <translation>詳細ビューを非表示にする</translation> </message> <message> <source>Show a system tray icon</source> @@ -3637,7 +3856,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Use entry title to match windows for global Auto-Type</source> - <translation>グローバル自動入力の際に、エントリーのタイトルとウィンドウのマッチングを行う</translation> + <translation>グローバル自動入力のウィンドウの照合にエントリーのタイトルを使用する</translation> </message> <message> <source>Use entry URL to match windows for global Auto-Type</source> @@ -3660,6 +3879,30 @@ Please unlock the selected database or choose another one which is unlocked.</so <comment>Milliseconds</comment> <translation>ミリ秒</translation> </message> + <message> + <source>Startup</source> + <translation>起動</translation> + </message> + <message> + <source>File Management</source> + <translation>ファイル管理</translation> + </message> + <message> + <source>Safely save database files (may be incompatible with Dropbox, etc)</source> + <translation>安全にデータベースファイルを保存する (Dropbox などのサービスでは動作しない可能性があります)</translation> + </message> + <message> + <source>Backup database file before saving</source> + <translation>保存する前にデータベースファイルをバックアップする</translation> + </message> + <message> + <source>Entry Management</source> + <translation>エントリー管理</translation> + </message> + <message> + <source>General</source> + <translation>一般</translation> + </message> </context> <context> <name>SettingsWidgetSecurity</name> @@ -3702,11 +3945,11 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Hide passwords in the preview panel</source> - <translation>プレビューパネルではパスワードを非表示にする</translation> + <translation>プレビューパネルのパスワードを非表示にする</translation> </message> <message> <source>Hide entry notes by default</source> - <translation>エントリーのメモはデフォルトで非表示にする</translation> + <translation>エントリーのメモをデフォルトで非表示にする</translation> </message> <message> <source>Privacy</source> @@ -3716,6 +3959,10 @@ Please unlock the selected database or choose another one which is unlocked.</so <source>Use Google as fallback for downloading website icons</source> <translation>ウェブサイトのアイコンをダウンロードするためのフォールバックとして Google を使用する</translation> </message> + <message> + <source>Re-lock previously locked database after performing Auto-Type</source> + <translation>自動入力実行後に以前ロックされたデータベースを再ロックする</translation> + </message> </context> <context> <name>SetupTotpDialog</name> @@ -3729,11 +3976,11 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Default RFC 6238 token settings</source> - <translation type="unfinished"/> + <translation>デフォルトの RFC 6238 トークン設定</translation> </message> <message> <source>Steam token settings</source> - <translation type="unfinished"/> + <translation>Steam トークン設定</translation> </message> <message> <source>Use custom settings</source> @@ -3797,10 +4044,6 @@ Please unlock the selected database or choose another one which is unlocked.</so </context> <context> <name>WelcomeWidget</name> - <message> - <source>Welcome to KeePassXC</source> - <translation>KeePassXC へようこそ</translation> - </message> <message> <source>Start storing your passwords securely in a KeePassXC database</source> <translation>KeePassXC データベースに安全にパスワードを保管する</translation> @@ -3825,12 +4068,16 @@ Please unlock the selected database or choose another one which is unlocked.</so <source>Recent databases</source> <translation>最近使用したデータベース</translation> </message> + <message> + <source>Welcome to KeePassXC %1</source> + <translation>KeePassXC %1 へようこそ</translation> + </message> </context> <context> <name>main</name> <message> <source>Remove an entry from the database.</source> - <translation type="unfinished"/> + <translation>データベースからエントリーを削除する。</translation> </message> <message> <source>Path of the database.</source> @@ -3862,7 +4109,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Parent window handle</source> - <translation type="unfinished"/> + <translation>親ウィンドウハンドル</translation> </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_ko.ts b/share/translations/keepassx_ko.ts index bcfb1a27e..91be825e7 100644 --- a/share/translations/keepassx_ko.ts +++ b/share/translations/keepassx_ko.ts @@ -11,16 +11,12 @@ </message> <message> <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> - <translation> <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a> 사이트에 버그를 보고해 주십시오</translation> + <translation><a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a> 사이트에 버그를 보고해 주십시오</translation> </message> <message> <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> <translation>KeePassXC는 GNU 일반 공중 라이선스(GPL) 버전 2 및 (선택적으로) 버전 3으로 배포됩니다.</translation> </message> - <message> - <source>Project Maintainers:</source> - <translation>프로젝트 관리자:</translation> - </message> <message> <source>Contributors</source> <translation>기여자</translation> @@ -71,6 +67,19 @@ CPU 아키텍처: %2 <source>Enabled extensions:</source> <translation>활성화된 확장 기능:</translation> </message> + <message> + <source>Project Maintainers:</source> + <translation>프로젝트 관리자:</translation> + </message> + <message> + <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Build Type: %1 +</source> + <translation type="unfinished"/> + </message> </context> <context> <name>AccessControlDialog</name> @@ -101,7 +110,7 @@ Please select whether you want to allow access.</source> <name>AgentSettingsWidget</name> <message> <source>Enable SSH Agent (requires restart)</source> - <translation type="unfinished"/> + <translation>SSH 에이전트 사용(다시 시작 필요)</translation> </message> </context> <context> @@ -120,19 +129,19 @@ Please select whether you want to allow access.</source> </message> <message> <source>The Syntax of your Auto-Type statement is incorrect!</source> - <translation type="unfinished"/> + <translation>자동 입력 구문 문법이 잘못되었습니다!</translation> </message> <message> <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>자동 입력 명령에 긴 지연 시간이 포함되어 있습니다. 계속 진행하시겠습니까?</translation> </message> <message> <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>자동 입력 명령에 느린 키 입력이 포함되어 있습니다. 계속 진행하시겠습니까?</translation> </message> <message> <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>자동 입력 명령에 많이 반복되는 인자가 포함되어 있습니다. 계속 진행하시겠습니까?</translation> </message> </context> <context> @@ -150,6 +159,25 @@ Please select whether you want to allow access.</source> <translation>기본 시퀀스</translation> </message> </context> +<context> + <name>AutoTypeMatchModel</name> + <message> + <source>Group</source> + <translation>그룹</translation> + </message> + <message> + <source>Title</source> + <translation>제목</translation> + </message> + <message> + <source>Username</source> + <translation>사용자 이름</translation> + </message> + <message> + <source>Sequence</source> + <translation>시퀀스</translation> + </message> +</context> <context> <name>AutoTypeSelectDialog</name> <message> @@ -165,7 +193,7 @@ Please select whether you want to allow access.</source> <name>BrowserAccessControlDialog</name> <message> <source>KeePassXC-Browser Confirm Access</source> - <translation type="unfinished"/> + <translation>KeePassXC-브라우저 접근 확인</translation> </message> <message> <source>Remember this decision</source> @@ -194,11 +222,11 @@ Please select whether you want to allow access.</source> </message> <message> <source>This is required for accessing your databases with KeePassXC-Browser</source> - <translation type="unfinished"/> + <translation>KeePassXC-브라우저에서 데이터베이스에 접근하려면 필요합니다</translation> </message> <message> <source>Enable KeepassXC browser integration</source> - <translation type="unfinished"/> + <translation>KeePassXC 브라우저 통합 사용</translation> </message> <message> <source>General</source> @@ -206,28 +234,28 @@ Please select whether you want to allow access.</source> </message> <message> <source>Enable integration for these browsers:</source> - <translation type="unfinished"/> + <translation>다음 브라우저에 통합:</translation> </message> <message> <source>&Google Chrome</source> - <translation type="unfinished"/> + <translation>Google 크롬(&G)</translation> </message> <message> <source>&Firefox</source> - <translation type="unfinished"/> + <translation>Firefox(&F)</translation> </message> <message> <source>&Chromium</source> - <translation type="unfinished"/> + <translation>Chromium(&C)</translation> </message> <message> <source>&Vivaldi</source> - <translation type="unfinished"/> + <translation>Vivaldi(&V)</translation> </message> <message> <source>Show a &notification when credentials are requested</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>인증 정보가 필요할 때 알림 표시(&N)</translation> </message> <message> <source>Re&quest to unlock the database if it is locked</source> @@ -235,11 +263,11 @@ Please select whether you want to allow access.</source> </message> <message> <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> - <translation type="unfinished"/> + <translation>같은 스키마(http://, https://, ftp://)를 사용하는 항목만 반환합니다.</translation> </message> <message> <source>&Match URL scheme (e.g., https://...)</source> - <translation type="unfinished"/> + <translation>URL 스키마 일치(예: https://...)(&M)</translation> </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> @@ -247,25 +275,25 @@ Please select whether you want to allow access.</source> </message> <message> <source>&Return only best-matching credentials</source> - <translation type="unfinished"/> + <translation>가장 잘 일치하는 항목만 반환(&R)</translation> </message> <message> <source>Sort &matching credentials by title</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>제목 순으로 일치하는 항목 정렬(&M)</translation> </message> <message> <source>Sort matching credentials by &username</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>사용자 이름 순으로 일치하는 항목 정렬(&U)</translation> </message> <message> <source>&Disconnect all browsers</source> - <translation type="unfinished"/> + <translation>모든 브라우저 연결 해제(&D)</translation> </message> <message> <source>Forget all remembered &permissions</source> - <translation type="unfinished"/> + <translation>모든 기억한 권한 잊기(&P)</translation> </message> <message> <source>Advanced</source> @@ -274,12 +302,12 @@ Please select whether you want to allow access.</source> <message> <source>Never &ask before accessing credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>저장된 암호에 접근하기 전에 묻지 않기(&A)</translation> </message> <message> <source>Never ask before &updating credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>저장된 암호를 업데이트하기 전에 묻지 않기(&U)</translation> </message> <message> <source>Only the selected database has to be connected with a client.</source> @@ -288,7 +316,7 @@ Please select whether you want to allow access.</source> <message> <source>Searc&h in all opened databases for matching credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>모든 열린 데이터베이스에서 저장된 암호 검색(&H)</translation> </message> <message> <source>Automatically creating or updating string fields is not supported.</source> @@ -300,49 +328,49 @@ Please select whether you want to allow access.</source> </message> <message> <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> - <translation type="unfinished"/> + <translation>네이티브 메시징 스크립트에서 사용하는 KeePassXC 및 keepassxc-proxy 실행 파일 경로를 시작할 때 자동으로 업데이트합니다.</translation> </message> <message> <source>Update &native messaging manifest files at startup</source> - <translation type="unfinished"/> + <translation>시작할 때 네이티브 메시징 선언 파일 업데이트(&N)</translation> </message> <message> <source>Support a proxy application between KeePassXC and browser extension.</source> - <translation type="unfinished"/> + <translation>KeePassXC와 브라우저 확장 간 프록시 프로그램을 지원합니다.</translation> </message> <message> <source>Use a &proxy application between KeePassXC and browser extension</source> - <translation type="unfinished"/> + <translation>KeePassXC와 브라우저 확장 간 프록시 프로그램 사용(&P)</translation> </message> <message> <source>Use a custom proxy location if you installed a proxy manually.</source> - <translation type="unfinished"/> + <translation>프록시를 직접 설치했으면 사용자 정의 프록시 위치를 지정하십시오.</translation> </message> <message> <source>Use a &custom proxy location</source> <comment>Meant is the proxy for KeePassXC-Browser</comment> - <translation type="unfinished"/> + <translation>사용자 정의 프록시 위치 사용(&C)</translation> </message> <message> <source>Browse...</source> <extracomment>Button for opening file dialog</extracomment> - <translation type="unfinished"/> + <translation>찾아보기...</translation> </message> <message> <source><b>Warning:</b> The following options can be dangerous!</source> - <translation type="unfinished"/> + <translation><b>경고:</b> 다음 옵션은 신중하게 사용하십시오!</translation> </message> <message> <source>Executable Files (*.exe);;All Files (*.*)</source> - <translation type="unfinished"/> + <translation>실행 파일 (*.exe);;모든 파일(*.*)</translation> </message> <message> <source>Executable Files (*)</source> - <translation type="unfinished"/> + <translation>실행 파일 (*)</translation> </message> <message> <source>Select custom proxy location</source> - <translation type="unfinished"/> + <translation>사용자 정의 프록시 위치 지정</translation> </message> </context> <context> @@ -356,11 +384,14 @@ Please select whether you want to allow access.</source> If you would like to allow it access to your KeePassXC database, give it a unique name to identify and accept it.</source> - <translation type="unfinished"/> + <translation>위에 있는 키의 연결 요청을 받았습니다. + +해당 키에서 KeePassXC 데이터베이스 접근을 허용하려면 +식별할 수 있는 이름을 부여한 후 수락하십시오.</translation> </message> <message> <source>Save and allow access</source> - <translation type="unfinished"/> + <translation>저장하고 접근 허용</translation> </message> <message> <source>KeePassXC: Overwrite existing key?</source> @@ -369,7 +400,8 @@ give it a unique name to identify and accept it.</source> <message> <source>A shared encryption key with the name "%1" already exists. Do you want to overwrite it?</source> - <translation type="unfinished"/> + <translation>이름이 "%1"인 공유 암호화 키가 이미 있습니다. +덮어쓰시겠습니까?</translation> </message> <message> <source>KeePassXC: Update Entry</source> @@ -395,7 +427,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>The active database does not contain a settings entry.</source> - <translation type="unfinished"/> + <translation>활성 데이터베이스에 설정 항목이 없습니다.</translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -403,7 +435,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>No shared encryption keys found in KeePassXC Settings.</source> - <translation type="unfinished"/> + <translation>KeePassXC 설정에서 공유 암호화 키를 찾을 수 없습니다.</translation> </message> <message> <source>KeePassXC: Removed keys from database</source> @@ -411,11 +443,11 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message numerus="yes"> <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>KeePassXC 설정에서 암호화 키 %n개를 삭제했습니다.</numerusform></translation> </message> <message> <source>Removing stored permissions…</source> - <translation type="unfinished"/> + <translation>저장된 권한 삭제 중...</translation> </message> <message> <source>Abort</source> @@ -427,7 +459,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message numerus="yes"> <source>Successfully removed permissions from %n entry(s).</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>항목 %n개에 저장된 권한을 삭제했습니다.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -511,14 +543,17 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Legacy key file format</source> - <translation type="unfinished"/> + <translation>레거시 키 파일 형식</translation> </message> <message> <source>You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>차후 버전에서 지원이 중단될 예정인 레거시 키 파일 +형식을 사용하고 있습니다. + +새 키 파일을 생성하는 것을 추천합니다.</translation> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -616,7 +651,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Original data: </source> - <translation>원본 데이터:</translation> + <translation>원본 데이터: </translation> </message> <message> <source>Error(s) detected in CSV file !</source> @@ -652,15 +687,15 @@ Please consider generating a new key file.</source> <name>CsvParserModel</name> <message numerus="yes"> <source>%n byte(s), </source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>%n 바이트, </numerusform></translation> </message> <message numerus="yes"> <source>%n row(s), </source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>%n줄, </numerusform></translation> </message> <message numerus="yes"> <source>%n column(s)</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>%n칸</numerusform></translation> </message> </context> <context> @@ -699,18 +734,21 @@ Please consider generating a new key file.</source> </message> <message> <source>Legacy key file format</source> - <translation type="unfinished"/> + <translation>레거시 키 파일 형식</translation> </message> <message> <source>You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>차후 버전에서 지원이 중단될 예정인 레거시 키 파일 +형식을 사용하고 있습니다. + +새 키 파일을 생성하는 것을 추천합니다.</translation> </message> <message> <source>Don't show this warning again</source> - <translation type="unfinished"/> + <translation>더 이상 이 경고 표시하지 않기</translation> </message> <message> <source>All files</source> @@ -770,52 +808,66 @@ You can now save it.</source> </message> <message> <source>Encryption</source> - <translation type="unfinished"/> + <translation>암호화</translation> </message> <message> <source>Number of rounds too high</source> <comment>Key transformation rounds</comment> - <translation type="unfinished"/> + <translation>라운드 수가 너무 높음</translation> </message> <message> <source>You are using a very high number of key transform rounds with Argon2. If you keep this number, your database may take hours or days (or even longer) to open!</source> - <translation type="unfinished"/> + <translation>Argon2 키 변형 라운드 수가 너무 높습니다. + +해당 수치를 사용하면 데이터베이스를 열 때 수 시간이나 수 일 이상 소요될 수 있습니다!</translation> </message> <message> <source>Understood, keep number</source> - <translation type="unfinished"/> + <translation>이해함, 숫자 유지</translation> </message> <message> <source>Cancel</source> - <translation type="unfinished"/> + <translation>취소</translation> </message> <message> <source>Number of rounds too low</source> <comment>Key transformation rounds</comment> - <translation type="unfinished"/> + <translation>라운드 수가 너무 낮음</translation> </message> <message> <source>You are using a very low number of key transform rounds with AES-KDF. If you keep this number, your database may be too easy to crack!</source> - <translation type="unfinished"/> + <translation>AES-KDF 키 변형 라운드 수가 너무 낮습니다. + +해당 수치를 계속 사용하면 데이터베이스의 보안을 쉽게 해제할 수 있습니다!</translation> </message> <message> <source>KDF unchanged</source> - <translation type="unfinished"/> + <translation>키 유도 함수 변경되지 않음</translation> </message> <message> <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> - <translation type="unfinished"/> + <translation>새로운 키 유도 함수 인자로 키를 변경할 수 없어서 키 유도 함수를 변경하지 않았습니다.</translation> + </message> + <message numerus="yes"> + <source> MiB</source> + <comment>Abbreviation for Mebibytes (KDF settings)</comment> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source> thread(s)</source> + <comment>Threads for parallel execution (KDF settings)</comment> + <translation type="unfinished"><numerusform></numerusform></translation> </message> </context> <context> <name>DatabaseSettingsWidgetEncryption</name> <message> <source>Encryption Algorithm:</source> - <translation type="unfinished"/> + <translation>암호화 알고리즘:</translation> </message> <message> <source>AES: 256 Bit (default)</source> @@ -827,7 +879,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Key Derivation Function:</source> - <translation type="unfinished"/> + <translation>키 유도 함수:</translation> </message> <message> <source>Transform rounds:</source> @@ -835,30 +887,22 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Benchmark 1-second delay</source> - <translation type="unfinished"/> + <translation>1초 지연 벤치마크</translation> </message> <message> <source>Memory Usage:</source> - <translation type="unfinished"/> - </message> - <message> - <source> MB</source> - <translation type="unfinished"/> + <translation>메모리 사용량:</translation> </message> <message> <source>Parallelism:</source> - <translation type="unfinished"/> - </message> - <message> - <source> thread</source> - <translation type="unfinished"/> + <translation>스레드 수:</translation> </message> </context> <context> <name>DatabaseSettingsWidgetGeneral</name> <message> <source>Database Meta Data</source> - <translation type="unfinished"/> + <translation>데이터베이스 메타데이터</translation> </message> <message> <source>Database name:</source> @@ -874,7 +918,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>History Settings</source> - <translation type="unfinished"/> + <translation>과거 기록 설정</translation> </message> <message> <source>Max. history items:</source> @@ -892,6 +936,14 @@ If you keep this number, your database may be too easy to crack!</source> <source>Use recycle bin</source> <translation>휴지통 사용</translation> </message> + <message> + <source>Additional Database Settings</source> + <translation>추가 데이터베이스 설정</translation> + </message> + <message> + <source>Enable &compression (recommended)</source> + <translation>압축 사용(추천)(&C)</translation> + </message> </context> <context> <name>DatabaseTabWidget</name> @@ -1013,6 +1065,16 @@ Otherwise your changes are lost.</source> 잠그기 전에 데이터베이스를 저장하시겠습니까? 저장하지 않은 변경 사항은 손실됩니다.</translation> </message> + <message> + <source>Disable safe saves?</source> + <translation>안전 저장을 비활성화 하시겠습니까?</translation> + </message> + <message> + <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</source> + <translation>KeePassXC에서 데이터베이스를 여러 번 저장하려고 시도했으나 실패했습니다. 파일 동기화 서비스에서 데이터베이스 파일을 잠근 것 같습니다. +안전 저장을 비활성화 한 다음 다시 시도하시겠습니까?</translation> + </message> </context> <context> <name>DatabaseWidget</name> @@ -1054,7 +1116,7 @@ Otherwise your changes are lost.</source> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>항목 %n개를 휴지통으로 이동하시겠습니까?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1098,7 +1160,7 @@ Otherwise your changes are lost.</source> </message> <message> <source>File has changed</source> - <translation type="unfinished"/> + <translation>파일 변경됨</translation> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -1111,7 +1173,8 @@ Otherwise your changes are lost.</source> <message> <source>The database file has changed and you have unsaved changes. Do you want to merge your changes?</source> - <translation type="unfinished"/> + <translation>데이터베이스 파일이 변경되었고 저장하지 않은 변경 사항이 있습니다. +변경 사항을 합치겠습니까?</translation> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -1125,12 +1188,16 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>휴지통에 있는 항목을 영원히 삭제하시겠습니까?</translation> </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DetailsWidget</name> <message> <source>Generate TOTP Token</source> - <translation type="unfinished"/> + <translation>TOTP 토큰 생성</translation> </message> <message> <source>Close</source> @@ -1150,7 +1217,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Expiration</source> - <translation type="unfinished"/> + <translation>만료</translation> </message> <message> <source>Username</source> @@ -1158,15 +1225,15 @@ Do you want to merge your changes?</source> </message> <message> <source>Autotype</source> - <translation type="unfinished"/> + <translation>자동 입력</translation> </message> <message> <source>Searching</source> - <translation type="unfinished"/> + <translation>찾기</translation> </message> <message> <source>Attributes</source> - <translation type="unfinished"/> + <translation>속성</translation> </message> <message> <source>Attachments</source> @@ -1194,19 +1261,19 @@ Do you want to merge your changes?</source> </message> <message> <source>Never</source> - <translation type="unfinished"/> + <translation>하지 않음</translation> </message> <message> <source>[PROTECTED]</source> - <translation type="unfinished"/> + <translation>[보호됨]</translation> </message> <message> <source>Disabled</source> - <translation type="unfinished"/> + <translation>사용 안함</translation> </message> <message> <source>Enabled</source> - <translation type="unfinished"/> + <translation>사용함</translation> </message> </context> <context> @@ -1237,27 +1304,27 @@ Do you want to merge your changes?</source> </message> <message> <source>SSH Agent</source> - <translation type="unfinished"/> + <translation>SSH 에이전트</translation> </message> <message> <source>n/a</source> - <translation type="unfinished"/> + <translation>없음</translation> </message> <message> <source>(encrypted)</source> - <translation type="unfinished"/> + <translation>(암호화됨)</translation> </message> <message> <source>Select private key</source> - <translation type="unfinished"/> + <translation>비밀 키 선택</translation> </message> <message> <source>File too large to be a private key</source> - <translation type="unfinished"/> + <translation>비밀 키로 사용하기에 파일이 너무 큼</translation> </message> <message> <source>Failed to open private key</source> - <translation type="unfinished"/> + <translation>비밀 키를 열 수 없음</translation> </message> <message> <source>Entry history</source> @@ -1289,11 +1356,11 @@ Do you want to merge your changes?</source> </message> <message> <source>[PROTECTED]</source> - <translation type="unfinished"/> + <translation>[보호됨]</translation> </message> <message> <source>Press reveal to view or edit</source> - <translation type="unfinished"/> + <translation>보거나 편집하려면 누르십시오</translation> </message> <message> <source>Tomorrow</source> @@ -1301,16 +1368,28 @@ Do you want to merge your changes?</source> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>%n주</numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>%n개월</numerusform></translation> </message> <message> <source>1 year</source> <translation>1년</translation> </message> + <message> + <source>Apply generated password?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to apply the generated password to this entry?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAdvanced</name> @@ -1342,6 +1421,14 @@ Do you want to merge your changes?</source> <source>Attachments</source> <translation>첨부</translation> </message> + <message> + <source>Foreground Color:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Background Color:</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -1374,12 +1461,8 @@ Do you want to merge your changes?</source> <translation>창 제목:</translation> </message> <message> - <source>Use default se&quence</source> - <translation>기본 시퀀스 사용(&Q)</translation> - </message> - <message> - <source>Set custo&m sequence:</source> - <translation>사용자 정의 시퀀스 설정(&M):</translation> + <source>Use a specific sequence for this association:</source> + <translation type="unfinished"/> </message> </context> <context> @@ -1429,7 +1512,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Toggle the checkbox to reveal the notes section.</source> - <translation type="unfinished"/> + <translation>메모 부분을 표시하려면 체크 상자를 전환하십시오.</translation> </message> <message> <source>Username:</source> @@ -1444,43 +1527,43 @@ Do you want to merge your changes?</source> <name>EditEntryWidgetSSHAgent</name> <message> <source>Form</source> - <translation type="unfinished"/> + <translation>폼</translation> </message> <message> <source>Remove key from agent after</source> - <translation type="unfinished"/> + <translation>다음 시간 이후에 에이전트에서 키 삭제</translation> </message> <message> <source> seconds</source> - <translation type="unfinished"/> + <translation>초</translation> </message> <message> <source>Fingerprint</source> - <translation type="unfinished"/> + <translation>지문</translation> </message> <message> <source>Remove key from agent when database is closed/locked</source> - <translation type="unfinished"/> + <translation>데이터베이스를 잠그거나 닫을 때 에이전트에서 키 삭제</translation> </message> <message> <source>Public key</source> - <translation type="unfinished"/> + <translation>공개 키</translation> </message> <message> <source>Add key to agent when database is opened/unlocked</source> - <translation type="unfinished"/> + <translation>데이터베이스를 열거나 잠금 해제할 때 에이전트에 키 추가</translation> </message> <message> <source>Comment</source> - <translation type="unfinished"/> + <translation>주석</translation> </message> <message> <source>Decrypt</source> - <translation type="unfinished"/> + <translation>복호화</translation> </message> <message> <source>n/a</source> - <translation type="unfinished"/> + <translation>없음</translation> </message> <message> <source>Copy to clipboard</source> @@ -1488,32 +1571,32 @@ Do you want to merge your changes?</source> </message> <message> <source>Private key</source> - <translation type="unfinished"/> + <translation>비밀 키</translation> </message> <message> <source>External file</source> - <translation type="unfinished"/> + <translation>외부 파일</translation> </message> <message> <source>Browse...</source> <extracomment>Button for opening file dialog</extracomment> - <translation type="unfinished"/> + <translation>찾아보기...</translation> </message> <message> <source>Attachment</source> - <translation type="unfinished"/> + <translation>첨부</translation> </message> <message> <source>Add to agent</source> - <translation type="unfinished"/> + <translation>에이전트에 추가</translation> </message> <message> <source>Remove from agent</source> - <translation type="unfinished"/> + <translation>에이전트에서 삭제</translation> </message> <message> <source>Require user confirmation when this key is used</source> - <translation type="unfinished"/> + <translation>이 키를 사용할 때 사용자에게 묻기</translation> </message> </context> <context> @@ -1659,6 +1742,31 @@ Do you want to merge your changes?</source> <source>Uuid:</source> <translation>UUID:</translation> </message> + <message> + <source>Plugin Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove</source> + <translation>삭제</translation> + </message> + <message> + <source>Delete plugin data?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Value</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Entry</name> @@ -1676,14 +1784,14 @@ Do you want to merge your changes?</source> </message> <message> <source>Size</source> - <translation type="unfinished"/> + <translation>크기</translation> </message> </context> <context> <name>EntryAttachmentsWidget</name> <message> <source>Form</source> - <translation type="unfinished"/> + <translation>폼</translation> </message> <message> <source>Add</source> @@ -1703,11 +1811,11 @@ Do you want to merge your changes?</source> </message> <message> <source>Select files</source> - <translation type="unfinished"/> + <translation>파일 선택</translation> </message> <message numerus="yes"> <source>Are you sure you want to remove %n attachment(s)?</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>첨부 항목 %n개를 삭제하시겠습니까?</numerusform></translation> </message> <message> <source>Confirm Remove</source> @@ -1715,40 +1823,45 @@ Do you want to merge your changes?</source> </message> <message> <source>Save attachments</source> - <translation type="unfinished"/> + <translation>첨부 항목 저장</translation> </message> <message> <source>Unable to create directory: %1</source> - <translation type="unfinished"/> + <translation>디렉터리를 만들 수 없음: +%1</translation> </message> <message> <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> - <translation type="unfinished"/> + <translation>기존 파일 "%1"의 내용을 첨부 항목으로 덮어 쓰시겠습니까?</translation> </message> <message> <source>Confirm overwrite</source> - <translation type="unfinished"/> + <translation>덮어쓰기 확인</translation> </message> <message> <source>Unable to save attachments: %1</source> - <translation type="unfinished"/> + <translation>첨부 항목을 저장할 수 없음: +%1</translation> </message> <message> <source>Unable to open attachment: %1</source> - <translation type="unfinished"/> + <translation>첨부 항목을 열 수 없음: +%1</translation> </message> <message> <source>Unable to open attachments: %1</source> - <translation type="unfinished"/> + <translation>첨부 항목을 열 수 없음: +%1</translation> </message> <message> <source>Unable to open files: %1</source> - <translation type="unfinished"/> + <translation>파일을 열 수 없음: +%1</translation> </message> </context> <context> @@ -1800,6 +1913,65 @@ Do you want to merge your changes?</source> <source>URL</source> <translation>URL</translation> </message> + <message> + <source>Never</source> + <translation>하지 않음</translation> + </message> + <message> + <source>Password</source> + <translation>암호</translation> + </message> + <message> + <source>Notes</source> + <translation>메모</translation> + </message> + <message> + <source>Expires</source> + <translation>만료 기간</translation> + </message> + <message> + <source>Created</source> + <translation>생성</translation> + </message> + <message> + <source>Modified</source> + <translation>수정됨</translation> + </message> + <message> + <source>Accessed</source> + <translation>접근함</translation> + </message> + <message> + <source>Attachments</source> + <translation>첨부</translation> + </message> +</context> +<context> + <name>EntryView</name> + <message> + <source>Customize View</source> + <translation>보기 사용자 정의</translation> + </message> + <message> + <source>Hide Usernames</source> + <translation>사용자 이름 숨기기</translation> + </message> + <message> + <source>Hide Passwords</source> + <translation>암호 숨기기</translation> + </message> + <message> + <source>Fit to window</source> + <translation>창에 맞춤</translation> + </message> + <message> + <source>Fit to contents</source> + <translation>내용에 맞춤</translation> + </message> + <message> + <source>Reset to defaults</source> + <translation>기본값으로 복원</translation> + </message> </context> <context> <name>Group</name> @@ -1812,11 +1984,11 @@ Do you want to merge your changes?</source> <name>HostInstaller</name> <message> <source>KeePassXC: Cannot save file!</source> - <translation type="unfinished"/> + <translation>KeePassXC: 파일을 저장할 수 없음!</translation> </message> <message> <source>Cannot save the native messaging script file.</source> - <translation type="unfinished"/> + <translation>네이티브 메시징 스크립트 파일을 저장할 수 없습니다.</translation> </message> </context> <context> @@ -1869,6 +2041,10 @@ Do you want to merge your changes?</source> <source>Ensure that the password contains characters from every group</source> <translation>모든 그룹에서 최소 1글자 이상 포함</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>확장 ASCII</translation> + </message> </context> <context> <name>KMessageWidget</name> @@ -1911,7 +2087,7 @@ Do you want to merge your changes?</source> <name>Kdbx4Reader</name> <message> <source>missing database headers</source> - <translation type="unfinished"/> + <translation>데이터베이스 헤더 없음</translation> </message> <message> <source>Unable to calculate master key</source> @@ -1919,127 +2095,127 @@ Do you want to merge your changes?</source> </message> <message> <source>Invalid header checksum size</source> - <translation type="unfinished"/> + <translation>잘못된 헤더 체크섬 크기</translation> </message> <message> <source>Header SHA256 mismatch</source> - <translation type="unfinished"/> + <translation>헤더 SHA256이 일치하지 않음</translation> </message> <message> <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> - <translation type="unfinished"/> + <translation>키가 잘못되었거나 데이터베이스가 손상되었습니다.(HMAC이 일치하지 않음)</translation> </message> <message> <source>Unknown cipher</source> - <translation type="unfinished"/> + <translation>알 수 없는 암호화</translation> </message> <message> <source>Invalid header id size</source> - <translation type="unfinished"/> + <translation>잘못된 헤더 ID 크기</translation> </message> <message> <source>Invalid header field length</source> - <translation type="unfinished"/> + <translation>잘못된 헤더 필드 길이</translation> </message> <message> <source>Invalid header data length</source> - <translation type="unfinished"/> + <translation>잘못된 헤더 데이터 길이</translation> </message> <message> <source>Failed to open buffer for KDF parameters in header</source> - <translation type="unfinished"/> + <translation>헤더에 있는 키 유도 함수 인자에 필요한 버퍼를 열 수 없음</translation> </message> <message> <source>Unsupported key derivation function (KDF) or invalid parameters</source> - <translation type="unfinished"/> + <translation>지원하지 않는 키 유도 함수(KDF) 및 잘못된 인자</translation> </message> <message> <source>Legacy header fields found in KDBX4 file.</source> - <translation type="unfinished"/> + <translation>KDBX4 파일에 레거시 헤더 필드가 있습니다.</translation> </message> <message> <source>Invalid inner header id size</source> - <translation type="unfinished"/> + <translation>잘못된 내부 헤더 ID 크기</translation> </message> <message> <source>Invalid inner header field length</source> - <translation type="unfinished"/> + <translation>잘못된 내부 헤더 필드 길이</translation> </message> <message> <source>Invalid inner header binary size</source> - <translation type="unfinished"/> + <translation>잘못된 내부 헤더 바이너리 크기</translation> </message> <message> <source>Unsupported KeePass variant map version.</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>지원하지 않는 KeePass 메타데이터 저장소 버전입니다.</translation> </message> <message> <source>Invalid variant map entry name length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>잘못된 메타데이터 저장소 항목 이름 길이</translation> </message> <message> <source>Invalid variant map entry name data</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>잘못된 메타데이터 저장소 이름 데이터</translation> </message> <message> <source>Invalid variant map entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>잘못된 메타데이터 저장소 값 길이</translation> </message> <message> <source>Invalid variant map entry value data</source> <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>잘못된 메타데이터 저장소 값 데이터</translation> </message> <message> <source>Invalid variant map Bool entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>잘못된 메타데이터 저장소 Bool 항목 값 길이</translation> </message> <message> <source>Invalid variant map Int32 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>잘못된 메타데이터 저장소 Int32 항목 값 길이</translation> </message> <message> <source>Invalid variant map UInt32 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>잘못된 메타데이터 저장소 UInt32 항목 값 길이</translation> </message> <message> <source>Invalid variant map Int64 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>잘못된 메타데이터 저장소 Int64 항목 값 길이</translation> </message> <message> <source>Invalid variant map UInt64 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>잘못된 메타데이터 저장소 UInt64 항목 값 길이</translation> </message> <message> <source>Invalid variant map entry type</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>잘못된 메타데이터 저장소 항목 형식</translation> </message> <message> <source>Invalid variant map field type size</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>잘못된 메타데이터 저장소 필드 형식 크기</translation> </message> </context> <context> <name>Kdbx4Writer</name> <message> <source>Invalid symmetric cipher algorithm.</source> - <translation type="unfinished"/> + <translation>잘못된 대칭 키 암호화 알고리즘입니다.</translation> </message> <message> <source>Invalid symmetric cipher IV size.</source> <comment>IV = Initialization Vector for symmetric cipher</comment> - <translation type="unfinished"/> + <translation>잘못된 대칭 키 암호화 IV 크기입니다.</translation> </message> <message> <source>Unable to calculate master key</source> @@ -2048,50 +2224,50 @@ Do you want to merge your changes?</source> <message> <source>Failed to serialize KDF parameters variant map</source> <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>키 유도 함수 인자 메타데이터 저장소를 직렬화할 수 없음</translation> </message> </context> <context> <name>KdbxReader</name> <message> <source>Invalid cipher uuid length</source> - <translation type="unfinished"/> + <translation>잘못됨 암호화 UUID 길이</translation> </message> <message> <source>Unsupported cipher</source> - <translation type="unfinished"/> + <translation>지원하지 않는 암호화</translation> </message> <message> <source>Invalid compression flags length</source> - <translation type="unfinished"/> + <translation>잘못된 압축 플래그 길이</translation> </message> <message> <source>Unsupported compression algorithm</source> - <translation type="unfinished"/> + <translation>지원하지 않는 압축 알고리즘</translation> </message> <message> <source>Invalid master seed size</source> - <translation type="unfinished"/> + <translation>잘못된 마스터 시드 크기</translation> </message> <message> <source>Invalid transform seed size</source> - <translation type="unfinished"/> + <translation>잘못된 변형 시드 크기</translation> </message> <message> <source>Invalid transform rounds size</source> - <translation type="unfinished"/> + <translation>잘못된 변형 라운드 크기</translation> </message> <message> <source>Invalid start bytes size</source> - <translation type="unfinished"/> + <translation>잘못된 시작 바이트 크기</translation> </message> <message> <source>Invalid random stream id size</source> - <translation type="unfinished"/> + <translation>잘못된 무작위 스트림 ID 크기</translation> </message> <message> <source>Invalid inner random stream cipher</source> - <translation type="unfinished"/> + <translation>잘못된 내부 무작위 스트림 암호화</translation> </message> <message> <source>Not a KeePass database.</source> @@ -2109,131 +2285,131 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Unsupported KeePass 2 database version.</source> - <translation type="unfinished"/> + <translation>지원하지 않는 KeePass 2 데이터베이스 버전입니다.</translation> </message> </context> <context> <name>KdbxXmlReader</name> <message> <source>XML parsing failure: %1</source> - <translation type="unfinished"/> + <translation>XML 처리 실패: %1</translation> </message> <message> <source>No root group</source> - <translation type="unfinished"/> + <translation>루트 그룹 없음</translation> </message> <message> <source>Missing icon uuid or data</source> - <translation type="unfinished"/> + <translation>아이콘 UUID나 데이터 없음</translation> </message> <message> <source>Missing custom data key or value</source> - <translation type="unfinished"/> + <translation>사용자 정의 데이터 키나 값이 없음</translation> </message> <message> <source>Multiple group elements</source> - <translation type="unfinished"/> + <translation>여러 개의 그룹 원소</translation> </message> <message> <source>Null group uuid</source> - <translation type="unfinished"/> + <translation>빈 그룹 UUID</translation> </message> <message> <source>Invalid group icon number</source> - <translation type="unfinished"/> + <translation>잘못된 그룹 아이콘 번호</translation> </message> <message> <source>Invalid EnableAutoType value</source> - <translation type="unfinished"/> + <translation>잘못된 EnableAutoType 값</translation> </message> <message> <source>Invalid EnableSearching value</source> - <translation type="unfinished"/> + <translation>잘못된 EnableSearching 값</translation> </message> <message> <source>No group uuid found</source> - <translation type="unfinished"/> + <translation>그룹 UUID를 찾을 수 없음</translation> </message> <message> <source>Null DeleteObject uuid</source> - <translation type="unfinished"/> + <translation>비어 있는 DeleteObject UUID</translation> </message> <message> <source>Missing DeletedObject uuid or time</source> - <translation type="unfinished"/> + <translation>DeletedObject UUID나 시간이 없음</translation> </message> <message> <source>Null entry uuid</source> - <translation type="unfinished"/> + <translation>빈 항목 UUID</translation> </message> <message> <source>Invalid entry icon number</source> - <translation type="unfinished"/> + <translation>잘못된 항목 아이콘 번호</translation> </message> <message> <source>History element in history entry</source> - <translation type="unfinished"/> + <translation>과거 기록 항목의 과거 기록 원소</translation> </message> <message> <source>No entry uuid found</source> - <translation type="unfinished"/> + <translation>항목 UUID를 찾을 수 없음</translation> </message> <message> <source>History element with different uuid</source> - <translation type="unfinished"/> + <translation>다른 UUID를 사용하는 과거 기록 원소</translation> </message> <message> <source>Unable to decrypt entry string</source> - <translation type="unfinished"/> + <translation>항목 문자열을 복호화할 수 없음</translation> </message> <message> <source>Duplicate custom attribute found</source> - <translation type="unfinished"/> + <translation>중복된 사용자 정의 속성이 있음</translation> </message> <message> <source>Entry string key or value missing</source> - <translation type="unfinished"/> + <translation>항목 문자열 키나 값이 없음</translation> </message> <message> <source>Duplicate attachment found</source> - <translation type="unfinished"/> + <translation>중복된 첨부 항목이 있음</translation> </message> <message> <source>Entry binary key or value missing</source> - <translation type="unfinished"/> + <translation>항목 바이너리 키나 값이 없음</translation> </message> <message> <source>Auto-type association window or sequence missing</source> - <translation type="unfinished"/> + <translation>자동 입력 연결 창이나 시퀀스가 없음</translation> </message> <message> <source>Invalid bool value</source> - <translation type="unfinished"/> + <translation>잘못된 이진값</translation> </message> <message> <source>Invalid date time value</source> - <translation type="unfinished"/> + <translation>잘못된 날짜/시간 값</translation> </message> <message> <source>Invalid color value</source> - <translation type="unfinished"/> + <translation>잘못된 색상 값</translation> </message> <message> <source>Invalid color rgb part</source> - <translation type="unfinished"/> + <translation>잘못된 색상 RGB 부분</translation> </message> <message> <source>Invalid number value</source> - <translation type="unfinished"/> + <translation>잘못된 숫자 값</translation> </message> <message> <source>Invalid uuid value</source> - <translation type="unfinished"/> + <translation>잘못된 UUID 값</translation> </message> <message> <source>Unable to decompress binary</source> <extracomment>Translator meant is a binary data inside an entry</extracomment> - <translation type="unfinished"/> + <translation>바이너리 압축을 해제할 수 없음</translation> </message> </context> <context> @@ -2268,31 +2444,31 @@ This is a one-way migration. You won't be able to open the imported databas <message> <source>Unable to read encryption IV</source> <comment>IV = Initialization Vector for symmetric cipher</comment> - <translation type="unfinished"/> + <translation>암호화 IV를 읽을 수 없음</translation> </message> <message> <source>Invalid number of groups</source> - <translation type="unfinished"/> + <translation>잘못된 그룹 개수</translation> </message> <message> <source>Invalid number of entries</source> - <translation type="unfinished"/> + <translation>잘못된 항목 개수</translation> </message> <message> <source>Invalid content hash size</source> - <translation type="unfinished"/> + <translation>잘못된 내용 해시 크기</translation> </message> <message> <source>Invalid transform seed size</source> - <translation type="unfinished"/> + <translation>잘못된 변형 시드 크기</translation> </message> <message> <source>Invalid number of transform rounds</source> - <translation type="unfinished"/> + <translation>잘못된 변형 라운드 크기</translation> </message> <message> <source>Unable to construct group tree</source> - <translation type="unfinished"/> + <translation>그룹 트리를 만들 수 없음</translation> </message> <message> <source>Root</source> @@ -2308,95 +2484,95 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Key transformation failed</source> - <translation type="unfinished"/> + <translation>키 변형 실패</translation> </message> <message> <source>Invalid group field type number</source> - <translation type="unfinished"/> + <translation>잘못된 그룹 필드 형식 번호</translation> </message> <message> <source>Invalid group field size</source> - <translation type="unfinished"/> + <translation>잘못된 그룹 필드 크기</translation> </message> <message> <source>Read group field data doesn't match size</source> - <translation type="unfinished"/> + <translation>읽은 그룹 필드 데이터와 크기가 일치하지 않음</translation> </message> <message> <source>Incorrect group id field size</source> - <translation type="unfinished"/> + <translation>잘못된 그룹 ID 필드 크기</translation> </message> <message> <source>Incorrect group creation time field size</source> - <translation type="unfinished"/> + <translation>잘못된 그룹 생성 시간 필드 크기</translation> </message> <message> <source>Incorrect group modification time field size</source> - <translation type="unfinished"/> + <translation>잘못된 그룹 수정 시간 필드 크기</translation> </message> <message> <source>Incorrect group access time field size</source> - <translation type="unfinished"/> + <translation>잘못된 그룹 접근 시간 필드 크기</translation> </message> <message> <source>Incorrect group expiry time field size</source> - <translation type="unfinished"/> + <translation>잘못된 그룹 만료 시간 필드 크기</translation> </message> <message> <source>Incorrect group icon field size</source> - <translation type="unfinished"/> + <translation>잘못된 그룹 아이콘 필드 크기</translation> </message> <message> <source>Incorrect group level field size</source> - <translation type="unfinished"/> + <translation>잘못된 그룹 단계 필드 크기</translation> </message> <message> <source>Invalid group field type</source> - <translation type="unfinished"/> + <translation>잘못된 그룹 필드 형싞</translation> </message> <message> <source>Missing group id or level</source> - <translation type="unfinished"/> + <translation>그룹 ID나 단계가 없음</translation> </message> <message> <source>Missing entry field type number</source> - <translation type="unfinished"/> + <translation>그룹 항목 형식 번호가 없음</translation> </message> <message> <source>Invalid entry field size</source> - <translation type="unfinished"/> + <translation>잘못된 항목 필드 크기</translation> </message> <message> <source>Read entry field data doesn't match size</source> - <translation type="unfinished"/> + <translation>읽은 항목 필드 데이터와 크기가 일치하지 않음</translation> </message> <message> <source>Invalid entry uuid field size</source> - <translation type="unfinished"/> + <translation>잘못된 항목 UUID 필드 크기</translation> </message> <message> <source>Invalid entry group id field size</source> - <translation type="unfinished"/> + <translation>잘못된 항목 그룹 ID 필드 크기</translation> </message> <message> <source>Invalid entry icon field size</source> - <translation type="unfinished"/> + <translation>잘못된 항목 아이콘 필드 크기</translation> </message> <message> <source>Invalid entry creation time field size</source> - <translation type="unfinished"/> + <translation>잘못된 항목 생성 시간 필드 크기</translation> </message> <message> <source>Invalid entry modification time field size</source> - <translation type="unfinished"/> + <translation>잘못된 항목 수정 시간 필드 크기</translation> </message> <message> <source>Invalid entry expiry time field size</source> - <translation type="unfinished"/> + <translation>잘못된 항목 만료 시간 필드 크기</translation> </message> <message> <source>Invalid entry field type</source> - <translation type="unfinished"/> + <translation>잘못된 항목 필드 크기</translation> </message> </context> <context> @@ -2450,7 +2626,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Time-based one-time password</source> - <translation type="unfinished"/> + <translation>시간 기반 일회용 암호</translation> </message> <message> <source>&Groups</source> @@ -2578,7 +2754,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Copy title to clipboard</source> - <translation type="unfinished"/> + <translation>클립보드에 제목 복사</translation> </message> <message> <source>&URL</source> @@ -2586,7 +2762,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Copy URL to clipboard</source> - <translation type="unfinished"/> + <translation>클립보드에 URL 복사</translation> </message> <message> <source>&Notes</source> @@ -2594,7 +2770,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Copy notes to clipboard</source> - <translation type="unfinished"/> + <translation>클립보드에 메모 복사</translation> </message> <message> <source>&Export to CSV file...</source> @@ -2626,7 +2802,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>E&mpty recycle bin</source> - <translation type="unfinished"/> + <translation>휴지통 비우기(&M)</translation> </message> <message> <source>Clear history</source> @@ -2638,7 +2814,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> - <translation type="unfinished"/> + <translation><p>KeePassHTTP 브라우저 통합을 사용하고 있는 것 같습니다. 이 기능은 폐기 예고되었고 차후에 삭제될 예정입니다.<br>KeePassXC-브라우저로 교체하십시오! 이전 작업에 도움이 필요하면 <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">이전 가이드</a>를 참고하십시오(경고 %1/3).</p></translation> </message> <message> <source>read-only</source> @@ -2680,99 +2856,111 @@ This is a one-way migration. You won't be able to open the imported databas <source>Please touch the button on your YubiKey!</source> <translation>YubiKey의 단추를 누르십시오!</translation> </message> + <message> + <source>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</source> + <translation>경고: KeePassXC 불안정 빌드를 사용하고 있습니다! +데이터베이스 파일이 잘못될 가능성이 높으므로 항상 데이터베이스를 백업하십시오. +이 버전은 실제 환경에서 사용을 가정하지 않습니다.</translation> + </message> </context> <context> <name>OpenSSHKey</name> <message> <source>Invalid key file, expecting an OpenSSH key</source> - <translation type="unfinished"/> + <translation>잘못된 키 파일, OpenSSH 키가 필요함</translation> </message> <message> <source>PEM boundary mismatch</source> - <translation type="unfinished"/> - </message> - <message> - <source>This is not an OpenSSH key, only modern keys are supported</source> - <translation type="unfinished"/> + <translation>PEM 경계가 일치하지 않음</translation> </message> <message> <source>Base64 decoding failed</source> - <translation type="unfinished"/> + <translation>Base64 디코드 실패</translation> </message> <message> <source>Key file way too small.</source> - <translation type="unfinished"/> + <translation>키 파일이 너무 작습니다.</translation> </message> <message> <source>Key file magic header id invalid</source> - <translation type="unfinished"/> + <translation>키 파일 매직 헤더 ID가 잘못됨</translation> </message> <message> <source>Found zero keys</source> - <translation type="unfinished"/> + <translation>키를 찾을 수 없음</translation> </message> <message> <source>Failed to read public key.</source> - <translation type="unfinished"/> + <translation>공개 키를 읽을 수 없습니다.</translation> </message> <message> <source>Corrupted key file, reading private key failed</source> - <translation type="unfinished"/> + <translation>키 파일이 잘못됨, 비밀 키를 읽을 수 없음</translation> </message> <message> <source>No private key payload to decrypt</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown cipher: </source> - <translation type="unfinished"/> + <translation>암호화 해제할 비밀 키 페이로드가 없음</translation> </message> <message> <source>Trying to run KDF without cipher</source> - <translation type="unfinished"/> + <translation>키 유도 함수를 암호화 없이 실행하려고 함</translation> </message> <message> <source>Passphrase is required to decrypt this key</source> - <translation type="unfinished"/> + <translation>이 키를 복호화하려면 암호가 필요함</translation> </message> <message> <source>Key derivation failed, key file corrupted?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown KDF: </source> - <translation type="unfinished"/> + <translation>키 유도 실패, 키 파일이 유효합니까?</translation> </message> <message> <source>Decryption failed, wrong passphrase?</source> - <translation type="unfinished"/> + <translation>복호화 실패, 암호가 올바릅니까?</translation> </message> <message> <source>Unexpected EOF while reading public key</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown key type: </source> - <translation type="unfinished"/> + <translation>공개 키를 읽는 중 예상하지 못한 곳에서 파일이 끝남</translation> </message> <message> <source>Unexpected EOF while reading private key</source> - <translation type="unfinished"/> + <translation>비밀 키를 읽는 중 예상하지 못한 곳에서 파일이 끝남</translation> </message> <message> <source>Can't write public key as it is empty</source> - <translation type="unfinished"/> + <translation>공개 키가 비어 있어서 기록할 수 없음</translation> </message> <message> <source>Unexpected EOF when writing public key</source> - <translation type="unfinished"/> + <translation>공개 키를 기록하는 중 예상하지 못한 곳에서 파일이 끝남</translation> </message> <message> <source>Can't write private key as it is empty</source> - <translation type="unfinished"/> + <translation>비밀 키가 비어 있어서 기록할 수 없음</translation> </message> <message> <source>Unexpected EOF when writing private key</source> + <translation>비밀 키를 기록하는 중 예상하지 못한 곳에서 파일이 끝남</translation> + </message> + <message> + <source>Unsupported key type: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cipher IV is too short for MD5 kdf</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: %1</source> <translation type="unfinished"/> </message> </context> @@ -2881,11 +3069,11 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source><b>Warning:</b> The following options can be dangerous!</source> - <translation type="unfinished"/> + <translation><b>경고:</b> 다음 옵션은 신중하게 사용하십시오!</translation> </message> <message> <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> - <translation type="unfinished"/> + <translation><p>KeePassHTTP는 폐기 예고되었고 차후에 삭제될 예정입니다.<br>KeePassXC-브라우저로 교체하십시오! 이전 작업에 도움이 필요하면 <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">이전 가이드</a>를 참고하십시오.</p></translation> </message> <message> <source>Cannot bind to privileged ports</source> @@ -3026,71 +3214,71 @@ Using default port 19455.</source> <name>QObject</name> <message> <source>Database not opened</source> - <translation type="unfinished"/> + <translation>데이터베이스를 열지 않았음</translation> </message> <message> <source>Database hash not available</source> - <translation type="unfinished"/> + <translation>데이터베이스 해시를 사용할 수 없음</translation> </message> <message> <source>Client public key not received</source> - <translation type="unfinished"/> + <translation>클라이언트 공개 키를 받지 않았음</translation> </message> <message> <source>Cannot decrypt message</source> - <translation type="unfinished"/> + <translation>메시지를 복호화할 수 없음</translation> </message> <message> <source>Timeout or cannot connect to KeePassXC</source> - <translation type="unfinished"/> + <translation>KeePassXC에 연결할 수 없거나 시간 초과됨</translation> </message> <message> <source>Action cancelled or denied</source> - <translation type="unfinished"/> + <translation>접근이 취소되었거나 거부됨</translation> </message> <message> <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> - <translation type="unfinished"/> + <translation>메시지를 암호화할 수 없거나 비밀 키를 찾을 수 없습니다. KeePassXC 네이티브 메시징이 활성화되어 있습니까?</translation> </message> <message> <source>KeePassXC association failed, try again</source> - <translation type="unfinished"/> + <translation>KeePassXC 연결 실패, 다시 시도하십시오</translation> </message> <message> <source>Key change was not successful</source> - <translation type="unfinished"/> + <translation>키 교환 실패</translation> </message> <message> <source>Encryption key is not recognized</source> - <translation type="unfinished"/> + <translation>암호화 키를 인식할 수 없음</translation> </message> <message> <source>No saved databases found</source> - <translation type="unfinished"/> + <translation>저장된 데이터베이스를 찾을 수 없음</translation> </message> <message> <source>Incorrect action</source> - <translation type="unfinished"/> + <translation>잘못된 동작</translation> </message> <message> <source>Empty message received</source> - <translation type="unfinished"/> + <translation>빈 메시지 받음</translation> </message> <message> <source>No URL provided</source> - <translation type="unfinished"/> + <translation>URL이 지정되지 않음</translation> </message> <message> <source>No logins found</source> - <translation type="unfinished"/> + <translation>로그인을 찾을 수 없음</translation> </message> <message> <source>Unknown error</source> - <translation type="unfinished"/> + <translation>알 수 없는 오류</translation> </message> <message> <source>Add a new entry to a database.</source> - <translation type="unfinished"/> + <translation>데이터베이스에 새 항목을 추가합니다.</translation> </message> <message> <source>Path of the database.</source> @@ -3098,23 +3286,23 @@ Using default port 19455.</source> </message> <message> <source>Key file of the database.</source> - <translation type="unfinished"/> + <translation>데이터베이스의 키 파일입니다.</translation> </message> <message> <source>path</source> - <translation type="unfinished"/> + <translation>경로</translation> </message> <message> <source>Username for the entry.</source> - <translation type="unfinished"/> + <translation>항목의 사용자 이름입니다.</translation> </message> <message> <source>username</source> - <translation type="unfinished"/> + <translation>사용자 이름</translation> </message> <message> <source>URL for the entry.</source> - <translation type="unfinished"/> + <translation>항목의 URL입니다.</translation> </message> <message> <source>URL</source> @@ -3122,64 +3310,64 @@ Using default port 19455.</source> </message> <message> <source>Prompt for the entry's password.</source> - <translation type="unfinished"/> + <translation>항목 암호의 프롬프트입니다.</translation> </message> <message> <source>Generate a password for the entry.</source> - <translation type="unfinished"/> + <translation>항목 암호를 생성합니다.</translation> </message> <message> <source>Length for the generated password.</source> - <translation type="unfinished"/> + <translation>생성된 암호의 길이입니다.</translation> </message> <message> <source>length</source> - <translation type="unfinished"/> + <translation>길이</translation> </message> <message> <source>Path of the entry to add.</source> - <translation type="unfinished"/> + <translation>추가할 항목의 경로입니다.</translation> </message> <message> <source>Copy an entry's password to the clipboard.</source> - <translation type="unfinished"/> + <translation>항목 암호를 클립보드에 복사합니다.</translation> </message> <message> <source>Path of the entry to clip.</source> <comment>clip = copy to clipboard</comment> - <translation type="unfinished"/> + <translation>클립보드에 복사할 항목의 경로입니다.</translation> </message> <message> <source>Timeout in seconds before clearing the clipboard.</source> - <translation type="unfinished"/> + <translation>클립보드를 지우기 전 대기할 초 단위 시간입니다.</translation> </message> <message> <source>Edit an entry.</source> - <translation type="unfinished"/> + <translation>항목을 편집합니다.</translation> </message> <message> <source>Title for the entry.</source> - <translation type="unfinished"/> + <translation>항목의 제목입니다.</translation> </message> <message> <source>title</source> - <translation type="unfinished"/> + <translation>제목</translation> </message> <message> <source>Path of the entry to edit.</source> - <translation type="unfinished"/> + <translation>편집할 항목의 경로입니다.</translation> </message> <message> <source>Estimate the entropy of a password.</source> - <translation type="unfinished"/> + <translation>암호의 예상 엔트로피를 계산합니다.</translation> </message> <message> <source>Password for which to estimate the entropy.</source> - <translation type="unfinished"/> + <translation>엔트로피를 예상할 암호입니다.</translation> </message> <message> <source>Perform advanced analysis on the password.</source> - <translation type="unfinished"/> + <translation>암호에 고급 분석을 시행합니다.</translation> </message> <message> <source>Extract and print the content of a database.</source> @@ -3191,25 +3379,31 @@ Using default port 19455.</source> </message> <message> <source>Insert password to unlock %1: </source> - <translation type="unfinished"/> + <translation>%1의 잠금 해제 암호 입력: </translation> </message> <message> <source>Failed to load key file %1 : %2</source> - <translation type="unfinished"/> + <translation>키 파일 %1을(를) 불러올 수 없음: %2</translation> </message> <message> <source>WARNING: You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>경고: 차후 버전에서 지원이 중단될 예정인 레거시 키 파일 +형식을 사용하고 있습니다. + +새 키 파일을 생성하는 것을 추천합니다.</translation> </message> <message> <source> Available commands: </source> - <translation type="unfinished"/> + <translation> + +사용 가능한 명령: +</translation> </message> <message> <source>Name of the command to execute.</source> @@ -3225,11 +3419,11 @@ Available commands: </message> <message> <source>Find entries quickly.</source> - <translation type="unfinished"/> + <translation>빠르게 항목을 찾습니다.</translation> </message> <message> <source>Search term.</source> - <translation type="unfinished"/> + <translation>항목을 검색합니다.</translation> </message> <message> <source>Merge two databases.</source> @@ -3245,23 +3439,23 @@ Available commands: </message> <message> <source>Use the same credentials for both database files.</source> - <translation type="unfinished"/> + <translation>두 데이터베이스 파일에 같은 인증 정보를 사용합니다.</translation> </message> <message> <source>Key file of the database to merge from.</source> - <translation type="unfinished"/> + <translation>합칠 데이터베이스 파일의 키 파일입니다.</translation> </message> <message> <source>Show an entry's information.</source> - <translation type="unfinished"/> + <translation>항목 정보를 표시합니다.</translation> </message> <message> <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> - <translation type="unfinished"/> + <translation>표시할 속성 이름입니다. 이 옵션은 한 번 이상 사용할 수 있으며, 주어진 순서대로 각각 속성을 한 줄에 하나씩 표시합니다. 속성을 지정하지 않으면 기본 속성의 요약을 표시합니다.</translation> </message> <message> <source>attribute</source> - <translation type="unfinished"/> + <translation>속성</translation> </message> <message> <source>Name of the entry to show.</source> @@ -3291,27 +3485,27 @@ Available commands: </message> <message> <source>AES: 256-bit</source> - <translation type="unfinished"/> + <translation>AES: 256비트</translation> </message> <message> <source>Twofish: 256-bit</source> - <translation type="unfinished"/> + <translation>Twofish: 256비트</translation> </message> <message> <source>ChaCha20: 256-bit</source> - <translation type="unfinished"/> + <translation>ChaCha20: 256비트</translation> </message> <message> <source>Argon2 (KDBX 4 – recommended)</source> - <translation type="unfinished"/> + <translation>Argon2(KDBX 4 – 추천)</translation> </message> <message> <source>AES-KDF (KDBX 4)</source> - <translation type="unfinished"/> + <translation>AES-KDF(KDBX 4)</translation> </message> <message> <source>AES-KDF (KDBX 3.1)</source> - <translation type="unfinished"/> + <translation>AES-KDF(KDBX 3.1)</translation> </message> <message> <source>Group</source> @@ -3335,15 +3529,15 @@ Available commands: </message> <message> <source>Last Modified</source> - <translation type="unfinished"/> + <translation>마지막 수정</translation> </message> <message> <source>Created</source> - <translation type="unfinished"/> + <translation>생성</translation> </message> <message> <source>Legacy Browser Integration</source> - <translation type="unfinished"/> + <translation>레거시 브라우저 통합</translation> </message> <message> <source>Browser Integration</source> @@ -3363,6 +3557,51 @@ Available commands: </message> <message> <source>SSH Agent</source> + <translation>SSH 에이전트</translation> + </message> + <message> + <source>Generate a new random diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Word count for the diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>count</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wordlist for the diceware generator. +[Default: EFF English]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a new random password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length of the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use lowercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use uppercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use numbers in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use special characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use extended ASCII in the generated password.</source> <translation type="unfinished"/> </message> </context> @@ -3370,23 +3609,23 @@ Available commands: <name>QtIOCompressor</name> <message> <source>Internal zlib error when compressing: </source> - <translation>압축 중 내부 zlib 오류 발생:</translation> + <translation>압축 중 내부 zlib 오류 발생: </translation> </message> <message> <source>Error writing to underlying device: </source> - <translation>장치에 기록하는 중 오류 발생:</translation> + <translation>장치에 기록하는 중 오류 발생: </translation> </message> <message> <source>Error opening underlying device: </source> - <translation>장치를 여는 중 오류 발생:</translation> + <translation>장치를 여는 중 오류 발생: </translation> </message> <message> <source>Error reading data from underlying device: </source> - <translation>장치에서 읽는 중 오류 발생:</translation> + <translation>장치에서 읽는 중 오류 발생: </translation> </message> <message> <source>Internal zlib error when decompressing: </source> - <translation>압축 푸는 중 내부 zlib 오류 발생:</translation> + <translation>압축 푸는 중 내부 zlib 오류 발생: </translation> </message> </context> <context> @@ -3471,7 +3710,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message numerus="yes"> <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>KeePassX/HTTP 설정에서 암호화 키 %n개를 삭제했습니다.</numerusform></translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -3503,7 +3742,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message numerus="yes"> <source>Successfully removed permissions from %n entries.</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>항목 %n개에 저장된 권한을 삭제했습니다.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -3585,7 +3824,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Hide the Details view</source> - <translation type="unfinished"/> + <translation>자세히 보기 숨기기</translation> </message> <message> <source>Show a system tray icon</source> @@ -3601,7 +3840,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Dark system tray icon</source> - <translation type="unfinished"/> + <translation>어두운 시스템 트레이 아이콘</translation> </message> <message> <source>Language</source> @@ -3613,11 +3852,11 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Use entry title to match windows for global Auto-Type</source> - <translation type="unfinished"/> + <translation>전역 자동 입력 시 창 제목을 항목 제목에서 검색</translation> </message> <message> <source>Use entry URL to match windows for global Auto-Type</source> - <translation type="unfinished"/> + <translation>전역 자동 입력 시 창 제목을 항목 URL에서 검색</translation> </message> <message> <source>Always ask before performing Auto-Type</source> @@ -3636,6 +3875,30 @@ Please unlock the selected database or choose another one which is unlocked.</so <comment>Milliseconds</comment> <translation>ms</translation> </message> + <message> + <source>Startup</source> + <translation>시작</translation> + </message> + <message> + <source>File Management</source> + <translation>파일 관리</translation> + </message> + <message> + <source>Safely save database files (may be incompatible with Dropbox, etc)</source> + <translation>데이터베이스 파일 안전 저장(Dropbox 등과 호환되지 않을 수 있음)</translation> + </message> + <message> + <source>Backup database file before saving</source> + <translation>저장하기 전에 데이터베이스 파일 백업</translation> + </message> + <message> + <source>Entry Management</source> + <translation>항목 관리</translation> + </message> + <message> + <source>General</source> + <translation>일반</translation> + </message> </context> <context> <name>SettingsWidgetSecurity</name> @@ -3678,11 +3941,11 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Hide passwords in the preview panel</source> - <translation type="unfinished"/> + <translation>미리 보기 패널에서 암호 숨기기</translation> </message> <message> <source>Hide entry notes by default</source> - <translation type="unfinished"/> + <translation>기본값으로 암호 숨기기</translation> </message> <message> <source>Privacy</source> @@ -3692,6 +3955,10 @@ Please unlock the selected database or choose another one which is unlocked.</so <source>Use Google as fallback for downloading website icons</source> <translation>웹 사이트 아이콘의 대체 아이콘으로 Google 사용</translation> </message> + <message> + <source>Re-lock previously locked database after performing Auto-Type</source> + <translation type="unfinished"/> + </message> </context> <context> <name>SetupTotpDialog</name> @@ -3705,11 +3972,11 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Default RFC 6238 token settings</source> - <translation type="unfinished"/> + <translation>기본 RFC 6238 토큰 설정</translation> </message> <message> <source>Steam token settings</source> - <translation type="unfinished"/> + <translation>Steam 토큰 설정</translation> </message> <message> <source>Use custom settings</source> @@ -3757,7 +4024,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Expires in</source> - <translation>만료 시간:</translation> + <translation>만료 시간</translation> </message> <message> <source>seconds</source> @@ -3773,10 +4040,6 @@ Please unlock the selected database or choose another one which is unlocked.</so </context> <context> <name>WelcomeWidget</name> - <message> - <source>Welcome to KeePassXC</source> - <translation>KeePassXC에 오신 것을 환영합니다</translation> - </message> <message> <source>Start storing your passwords securely in a KeePassXC database</source> <translation>KeePassXC 데이터베이스에 암호를 안전하게 저장하십시오</translation> @@ -3801,12 +4064,16 @@ Please unlock the selected database or choose another one which is unlocked.</so <source>Recent databases</source> <translation>최근 데이터베이스</translation> </message> + <message> + <source>Welcome to KeePassXC %1</source> + <translation>KeePassXC %1에 오신 것을 환영합니다</translation> + </message> </context> <context> <name>main</name> <message> <source>Remove an entry from the database.</source> - <translation type="unfinished"/> + <translation>데이터베이스에서 항목을 삭제합니다.</translation> </message> <message> <source>Path of the database.</source> @@ -3814,7 +4081,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Path of the entry to remove.</source> - <translation type="unfinished"/> + <translation>삭제할 항목의 경로입니다.</translation> </message> <message> <source>KeePassXC - cross-platform password manager</source> @@ -3838,7 +4105,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Parent window handle</source> - <translation type="unfinished"/> + <translation>부모 창 핸들</translation> </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_lt.ts b/share/translations/keepassx_lt.ts index 37737035c..6ab9b483d 100644 --- a/share/translations/keepassx_lt.ts +++ b/share/translations/keepassx_lt.ts @@ -17,10 +17,6 @@ <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> <translation>KeePassXC yra platinama GNU Bendrosios Viešosios Licencijos (GPL) versijos 2 arba (jūsų pasirinkimu) versijos 3 sąlygomis.</translation> </message> - <message> - <source>Project Maintainers:</source> - <translation>Projektą prižiūri:</translation> - </message> <message> <source>Contributors</source> <translation>Talkininkai</translation> @@ -71,6 +67,20 @@ Branduolys: %3 %4</translation> <source>Enabled extensions:</source> <translation>Įjungti plėtiniai:</translation> </message> + <message> + <source>Project Maintainers:</source> + <translation>Projektą prižiūri:</translation> + </message> + <message> + <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> + <translation>Ypatinga padėka nuo KeePassXC komandos yra skiriama debfx už pradinės KeePassX programos sukūrimą.</translation> + </message> + <message> + <source>Build Type: %1 +</source> + <translation>Darinio tipas: %1 +</translation> + </message> </context> <context> <name>AccessControlDialog</name> @@ -101,7 +111,7 @@ Pasirinkite, ar norite leisti prieigą.</translation> <name>AgentSettingsWidget</name> <message> <source>Enable SSH Agent (requires restart)</source> - <translation type="unfinished"/> + <translation>Įjungti SSH agentą (reikalauja paleidimo iš naujo)</translation> </message> </context> <context> @@ -150,6 +160,25 @@ Pasirinkite, ar norite leisti prieigą.</translation> <translation>Numatytoji seka</translation> </message> </context> +<context> + <name>AutoTypeMatchModel</name> + <message> + <source>Group</source> + <translation>Grupė</translation> + </message> + <message> + <source>Title</source> + <translation>Antraštė</translation> + </message> + <message> + <source>Username</source> + <translation>Naudotojo vardas</translation> + </message> + <message> + <source>Sequence</source> + <translation>Seka</translation> + </message> +</context> <context> <name>AutoTypeSelectDialog</name> <message> @@ -198,7 +227,7 @@ Pasirinkite, ar norite leisti prieigą.</translation> </message> <message> <source>Enable KeepassXC browser integration</source> - <translation type="unfinished"/> + <translation>Įjungti KeepassXC naršyklės integraciją</translation> </message> <message> <source>General</source> @@ -206,7 +235,7 @@ Pasirinkite, ar norite leisti prieigą.</translation> </message> <message> <source>Enable integration for these browsers:</source> - <translation type="unfinished"/> + <translation>Įjungti integraciją šioms naršyklėms:</translation> </message> <message> <source>&Google Chrome</source> @@ -227,7 +256,7 @@ Pasirinkite, ar norite leisti prieigą.</translation> <message> <source>Show a &notification when credentials are requested</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Rodyti pra&nešimą, kai reikalaujama prisijungimo duomenų</translation> </message> <message> <source>Re&quest to unlock the database if it is locked</source> @@ -235,11 +264,11 @@ Pasirinkite, ar norite leisti prieigą.</translation> </message> <message> <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> - <translation type="unfinished"/> + <translation>Bus grąžinami įrašai tik su ta pačia schema (http://, https://, ...).</translation> </message> <message> <source>&Match URL scheme (e.g., https://...)</source> - <translation type="unfinished"/> + <translation>&Atitikti URL schemą (pvz., https://...)</translation> </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> @@ -247,25 +276,25 @@ Pasirinkite, ar norite leisti prieigą.</translation> </message> <message> <source>&Return only best-matching credentials</source> - <translation type="unfinished"/> + <translation>&Grąžinti tik labiausiai atitinkančius prisijungimo duomenis</translation> </message> <message> <source>Sort &matching credentials by title</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Rikiuoti atitinkančius prisijungimo duomenis pagal &antraštę</translation> </message> <message> <source>Sort matching credentials by &username</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Rikiuoti atitinkančius prisijungimo duomenis pagal na&udotojo vardą</translation> </message> <message> <source>&Disconnect all browsers</source> - <translation type="unfinished"/> + <translation>&Atjungti visas naršykles</translation> </message> <message> <source>Forget all remembered &permissions</source> - <translation type="unfinished"/> + <translation>Užmiršti visus įsimintus &leidimus</translation> </message> <message> <source>Advanced</source> @@ -330,7 +359,7 @@ Pasirinkite, ar norite leisti prieigą.</translation> </message> <message> <source><b>Warning:</b> The following options can be dangerous!</source> - <translation type="unfinished"/> + <translation><b>Įspėjimas:</b> Šie parametrai gali būti pavojingi!</translation> </message> <message> <source>Executable Files (*.exe);;All Files (*.*)</source> @@ -338,7 +367,7 @@ Pasirinkite, ar norite leisti prieigą.</translation> </message> <message> <source>Executable Files (*)</source> - <translation type="unfinished"/> + <translation>Vykdomieji failai (*)</translation> </message> <message> <source>Select custom proxy location</source> @@ -360,7 +389,7 @@ give it a unique name to identify and accept it.</source> </message> <message> <source>Save and allow access</source> - <translation type="unfinished"/> + <translation>Įrašyti ir leisti prieigą</translation> </message> <message> <source>KeePassXC: Overwrite existing key?</source> @@ -369,7 +398,8 @@ give it a unique name to identify and accept it.</source> <message> <source>A shared encryption key with the name "%1" already exists. Do you want to overwrite it?</source> - <translation type="unfinished"/> + <translation>Bendrinamas šifravimo raktas, pavadinimu "%1" jau yra. +Ar norite jį perrašyti?</translation> </message> <message> <source>KeePassXC: Update Entry</source> @@ -395,7 +425,7 @@ Prašome atrakinti pasirinktą duomenų bazę arba pasirinkti kitą, kuri būtų </message> <message> <source>The active database does not contain a settings entry.</source> - <translation type="unfinished"/> + <translation>Aktyvioje duomenų bazėje nėra nustatymų įrašo.</translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -403,7 +433,7 @@ Prašome atrakinti pasirinktą duomenų bazę arba pasirinkti kitą, kuri būtų </message> <message> <source>No shared encryption keys found in KeePassXC Settings.</source> - <translation type="unfinished"/> + <translation>KeePassXC nustatymuose nerasti bendrinami šifravimo raktai.</translation> </message> <message> <source>KeePassXC: Removed keys from database</source> @@ -411,11 +441,11 @@ Prašome atrakinti pasirinktą duomenų bazę arba pasirinkti kitą, kuri būtų </message> <message numerus="yes"> <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n šifravimo raktas sėkmingai pašalintas iš KeePassXC nustatymų.</numerusform><numerusform>%n šifravimo raktai sėkmingai pašalinti iš KeePassXC nustatymų.</numerusform><numerusform>%n šifravimo raktų sėkmingai pašalinta iš KeePassXC nustatymų.</numerusform></translation> </message> <message> <source>Removing stored permissions…</source> - <translation type="unfinished"/> + <translation>Šalinami saugomi leidimai…</translation> </message> <message> <source>Abort</source> @@ -653,15 +683,15 @@ Please consider generating a new key file.</source> <name>CsvParserModel</name> <message numerus="yes"> <source>%n byte(s), </source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n baitas, </numerusform><numerusform>%n baitai, </numerusform><numerusform>%n baitų, </numerusform></translation> </message> <message numerus="yes"> <source>%n row(s), </source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n eilutė, </numerusform><numerusform>%n eilutės, </numerusform><numerusform>%n eilučių, </numerusform></translation> </message> <message numerus="yes"> <source>%n column(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n stulpelis</numerusform><numerusform>%n stulpeliai</numerusform><numerusform>%n stulpelių</numerusform></translation> </message> </context> <context> @@ -811,12 +841,22 @@ If you keep this number, your database may be too easy to crack!</source> <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> <translation type="unfinished"/> </message> + <message numerus="yes"> + <source> MiB</source> + <comment>Abbreviation for Mebibytes (KDF settings)</comment> + <translation><numerusform> MiB</numerusform><numerusform> MiB</numerusform><numerusform> MiB</numerusform></translation> + </message> + <message numerus="yes"> + <source> thread(s)</source> + <comment>Threads for parallel execution (KDF settings)</comment> + <translation><numerusform> gija</numerusform><numerusform> gijos</numerusform><numerusform> gijų</numerusform></translation> + </message> </context> <context> <name>DatabaseSettingsWidgetEncryption</name> <message> <source>Encryption Algorithm:</source> - <translation type="unfinished"/> + <translation>Šifravimo algoritmas:</translation> </message> <message> <source>AES: 256 Bit (default)</source> @@ -828,7 +868,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Key Derivation Function:</source> - <translation type="unfinished"/> + <translation>Rakto išvedimo funkcija:</translation> </message> <message> <source>Transform rounds:</source> @@ -840,26 +880,18 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Memory Usage:</source> - <translation type="unfinished"/> - </message> - <message> - <source> MB</source> - <translation> MB</translation> + <translation>Atminties naudojimas:</translation> </message> <message> <source>Parallelism:</source> <translation type="unfinished"/> </message> - <message> - <source> thread</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DatabaseSettingsWidgetGeneral</name> <message> <source>Database Meta Data</source> - <translation type="unfinished"/> + <translation>Duomenų bazės metaduomenys</translation> </message> <message> <source>Database name:</source> @@ -875,7 +907,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>History Settings</source> - <translation type="unfinished"/> + <translation>Istorijos nustatymai</translation> </message> <message> <source>Max. history items:</source> @@ -893,6 +925,14 @@ If you keep this number, your database may be too easy to crack!</source> <source>Use recycle bin</source> <translation>Naudoti šiukšlinę</translation> </message> + <message> + <source>Additional Database Settings</source> + <translation>Papildomi duomenų bazės nustatymai</translation> + </message> + <message> + <source>Enable &compression (recommended)</source> + <translation>Įjungti &glaudinimą (rekomenduojama)</translation> + </message> </context> <context> <name>DatabaseTabWidget</name> @@ -1015,6 +1055,15 @@ Otherwise your changes are lost.</source> Ar prieš užrakinant, norite įrašyti duomenų bazę? Kitu atveju jūsų pakeitimai bus prarasti.</translation> </message> + <message> + <source>Disable safe saves?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DatabaseWidget</name> @@ -1100,7 +1149,7 @@ Kitu atveju jūsų pakeitimai bus prarasti.</translation> </message> <message> <source>File has changed</source> - <translation type="unfinished"/> + <translation>Failas pasikeitė</translation> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -1113,7 +1162,8 @@ Kitu atveju jūsų pakeitimai bus prarasti.</translation> <message> <source>The database file has changed and you have unsaved changes. Do you want to merge your changes?</source> - <translation type="unfinished"/> + <translation>Duomenų bazės failas pasikeitė ir jūs turite neįrašytų pakeitimų. +Ar norite sulieti savo pakeitimus?</translation> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -1127,12 +1177,16 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>Ar tikrai norite negrįžtamai viską ištrinti iš savo šiukšlinės?</translation> </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DetailsWidget</name> <message> <source>Generate TOTP Token</source> - <translation type="unfinished"/> + <translation>Generuoti NTVS prieigos raktą</translation> </message> <message> <source>Close</source> @@ -1152,7 +1206,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Expiration</source> - <translation type="unfinished"/> + <translation>Galiojimas</translation> </message> <message> <source>Username</source> @@ -1160,15 +1214,15 @@ Do you want to merge your changes?</source> </message> <message> <source>Autotype</source> - <translation type="unfinished"/> + <translation>Automatinis rinkimas</translation> </message> <message> <source>Searching</source> - <translation type="unfinished"/> + <translation>Paieška</translation> </message> <message> <source>Attributes</source> - <translation type="unfinished"/> + <translation>Požymiai</translation> </message> <message> <source>Attachments</source> @@ -1200,7 +1254,7 @@ Do you want to merge your changes?</source> </message> <message> <source>[PROTECTED]</source> - <translation type="unfinished"/> + <translation>[APSAUGOTA]</translation> </message> <message> <source>Disabled</source> @@ -1243,23 +1297,23 @@ Do you want to merge your changes?</source> </message> <message> <source>n/a</source> - <translation type="unfinished"/> + <translation>nėra</translation> </message> <message> <source>(encrypted)</source> - <translation type="unfinished"/> + <translation>(šifruota)</translation> </message> <message> <source>Select private key</source> - <translation type="unfinished"/> + <translation>Pasirinkti privatųjį raktą</translation> </message> <message> <source>File too large to be a private key</source> - <translation type="unfinished"/> + <translation>Failas per didelis, kad būtų privatusis raktas</translation> </message> <message> <source>Failed to open private key</source> - <translation type="unfinished"/> + <translation>Nepavyko atverti privačiojo rakto</translation> </message> <message> <source>Entry history</source> @@ -1291,11 +1345,11 @@ Do you want to merge your changes?</source> </message> <message> <source>[PROTECTED]</source> - <translation type="unfinished"/> + <translation>[APSAUGOTA]</translation> </message> <message> <source>Press reveal to view or edit</source> - <translation type="unfinished"/> + <translation>Norėdami rodyti ar taisyti, paspauskite atskleisti</translation> </message> <message> <source>Tomorrow</source> @@ -1303,16 +1357,28 @@ Do you want to merge your changes?</source> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n savaitė</numerusform><numerusform>%n savaitės</numerusform><numerusform>%n savaičių</numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n mėnesis</numerusform><numerusform>%n mėnesiai</numerusform><numerusform>%n mėnesių</numerusform></translation> </message> <message> <source>1 year</source> <translation>1 metai</translation> </message> + <message> + <source>Apply generated password?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to apply the generated password to this entry?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAdvanced</name> @@ -1344,6 +1410,14 @@ Do you want to merge your changes?</source> <source>Attachments</source> <translation>Priedai</translation> </message> + <message> + <source>Foreground Color:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Background Color:</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -1376,12 +1450,8 @@ Do you want to merge your changes?</source> <translation>Lango antraštė:</translation> </message> <message> - <source>Use default se&quence</source> - <translation>Naudoti numatytąją se&ką</translation> - </message> - <message> - <source>Set custo&m sequence:</source> - <translation>Nustatyti tinkintą s&eką:</translation> + <source>Use a specific sequence for this association:</source> + <translation type="unfinished"/> </message> </context> <context> @@ -1431,7 +1501,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Toggle the checkbox to reveal the notes section.</source> - <translation type="unfinished"/> + <translation>Norėdami atskleisti pastabų sekciją, perjunkite žymimąjį langelį.</translation> </message> <message> <source>Username:</source> @@ -1446,15 +1516,15 @@ Do you want to merge your changes?</source> <name>EditEntryWidgetSSHAgent</name> <message> <source>Form</source> - <translation type="unfinished"/> + <translation>Forma</translation> </message> <message> <source>Remove key from agent after</source> - <translation type="unfinished"/> + <translation>Šalinti raktą iš agento po</translation> </message> <message> <source> seconds</source> - <translation type="unfinished"/> + <translation> sekundžių</translation> </message> <message> <source>Fingerprint</source> @@ -1462,7 +1532,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Remove key from agent when database is closed/locked</source> - <translation type="unfinished"/> + <translation>Užvėrus/užrakinus duomenų bazę, šalinti raktą iš agento</translation> </message> <message> <source>Public key</source> @@ -1470,7 +1540,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Add key to agent when database is opened/unlocked</source> - <translation type="unfinished"/> + <translation>Atvėrus/atrakinus duomenų bazę, pridėti raktą į agentą</translation> </message> <message> <source>Comment</source> @@ -1482,7 +1552,7 @@ Do you want to merge your changes?</source> </message> <message> <source>n/a</source> - <translation type="unfinished"/> + <translation>nėra</translation> </message> <message> <source>Copy to clipboard</source> @@ -1515,7 +1585,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Require user confirmation when this key is used</source> - <translation type="unfinished"/> + <translation>Naudojant šį raktą, reikalauti naudotojo patvirtinimo</translation> </message> </context> <context> @@ -1661,6 +1731,31 @@ Do you want to merge your changes?</source> <source>Uuid:</source> <translation>Uuid:</translation> </message> + <message> + <source>Plugin Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove</source> + <translation>Šalinti</translation> + </message> + <message> + <source>Delete plugin data?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Value</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Entry</name> @@ -1685,7 +1780,7 @@ Do you want to merge your changes?</source> <name>EntryAttachmentsWidget</name> <message> <source>Form</source> - <translation type="unfinished"/> + <translation>Forma</translation> </message> <message> <source>Add</source> @@ -1705,11 +1800,11 @@ Do you want to merge your changes?</source> </message> <message> <source>Select files</source> - <translation type="unfinished"/> + <translation>Pasirinkti failus</translation> </message> <message numerus="yes"> <source>Are you sure you want to remove %n attachment(s)?</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Ar tikrai norite pašalinti %n priedą?</numerusform><numerusform>Ar tikrai norite pašalinti %n priedus?</numerusform><numerusform>Ar tikrai norite pašalinti %n priedų?</numerusform></translation> </message> <message> <source>Confirm Remove</source> @@ -1722,7 +1817,8 @@ Do you want to merge your changes?</source> <message> <source>Unable to create directory: %1</source> - <translation type="unfinished"/> + <translation>Nepavyko sukurti katalogą: +%1</translation> </message> <message> <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> @@ -1730,27 +1826,31 @@ Do you want to merge your changes?</source> </message> <message> <source>Confirm overwrite</source> - <translation type="unfinished"/> + <translation>Patvirtinti perrašymą</translation> </message> <message> <source>Unable to save attachments: %1</source> - <translation type="unfinished"/> + <translation>Nepavyko įrašyti priedus: +%1</translation> </message> <message> <source>Unable to open attachment: %1</source> - <translation type="unfinished"/> + <translation>Nepavyko atverti priedą: +%1</translation> </message> <message> <source>Unable to open attachments: %1</source> - <translation type="unfinished"/> + <translation>Nepavyko atverti priedus: +%1</translation> </message> <message> <source>Unable to open files: %1</source> - <translation type="unfinished"/> + <translation>Nepavyko atverti failus: +%1</translation> </message> </context> <context> @@ -1802,6 +1902,65 @@ Do you want to merge your changes?</source> <source>URL</source> <translation>URL</translation> </message> + <message> + <source>Never</source> + <translation>Niekada</translation> + </message> + <message> + <source>Password</source> + <translation>Slaptažodis</translation> + </message> + <message> + <source>Notes</source> + <translation>Pastabos</translation> + </message> + <message> + <source>Expires</source> + <translation>Baigia galioti</translation> + </message> + <message> + <source>Created</source> + <translation>Sukurta</translation> + </message> + <message> + <source>Modified</source> + <translation>Keista</translation> + </message> + <message> + <source>Accessed</source> + <translation>Prieiga</translation> + </message> + <message> + <source>Attachments</source> + <translation>Priedai</translation> + </message> +</context> +<context> + <name>EntryView</name> + <message> + <source>Customize View</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide Usernames</source> + <translation>Slėpti naudotojo vardus</translation> + </message> + <message> + <source>Hide Passwords</source> + <translation>Slėpti slaptažodžius</translation> + </message> + <message> + <source>Fit to window</source> + <translation>Priderinti prie lango</translation> + </message> + <message> + <source>Fit to contents</source> + <translation>Priderinti prie turinio</translation> + </message> + <message> + <source>Reset to defaults</source> + <translation>Atstatyti į numatytuosius</translation> + </message> </context> <context> <name>Group</name> @@ -1871,6 +2030,10 @@ Do you want to merge your changes?</source> <source>Ensure that the password contains characters from every group</source> <translation>Užtikrinti, kad slaptažodyje būtų simboliai iš kiekvienos grupės</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>Papildomi ASCII</translation> + </message> </context> <context> <name>KMessageWidget</name> @@ -1929,7 +2092,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> - <translation type="unfinished"/> + <translation>Neteisingas raktas arba sugadintas duomenų bazės failas. (HMAC neatitikimas)</translation> </message> <message> <source>Unknown cipher</source> @@ -1937,7 +2100,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Invalid header id size</source> - <translation type="unfinished"/> + <translation>Neteisingas antraštės id dydis</translation> </message> <message> <source>Invalid header field length</source> @@ -1945,7 +2108,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Invalid header data length</source> - <translation type="unfinished"/> + <translation>Neteisingas antraštės duomenų ilgis</translation> </message> <message> <source>Failed to open buffer for KDF parameters in header</source> @@ -1961,7 +2124,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Invalid inner header id size</source> - <translation type="unfinished"/> + <translation>Neteisingas vidinės antraštės id dydis</translation> </message> <message> <source>Invalid inner header field length</source> @@ -2061,7 +2224,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Unsupported cipher</source> - <translation type="unfinished"/> + <translation>Nepalaikomas šifras</translation> </message> <message> <source>Invalid compression flags length</source> @@ -2069,7 +2232,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Unsupported compression algorithm</source> - <translation type="unfinished"/> + <translation>Nepalaikomas glaudinimo algoritmas</translation> </message> <message> <source>Invalid master seed size</source> @@ -2111,14 +2274,14 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų </message> <message> <source>Unsupported KeePass 2 database version.</source> - <translation type="unfinished"/> + <translation>Nepalaikoma KeePass 2 duomenų bazės versija.</translation> </message> </context> <context> <name>KdbxXmlReader</name> <message> <source>XML parsing failure: %1</source> - <translation type="unfinished"/> + <translation>XML nagrinėjimo nesėkmė: %1</translation> </message> <message> <source>No root group</source> @@ -2126,7 +2289,7 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų </message> <message> <source>Missing icon uuid or data</source> - <translation type="unfinished"/> + <translation>Trūksta piktogramos uuid ar duomenų</translation> </message> <message> <source>Missing custom data key or value</source> @@ -2154,7 +2317,7 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų </message> <message> <source>No group uuid found</source> - <translation type="unfinished"/> + <translation>Nerastas grupės uuid</translation> </message> <message> <source>Null DeleteObject uuid</source> @@ -2174,11 +2337,11 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų </message> <message> <source>History element in history entry</source> - <translation type="unfinished"/> + <translation>Istorijos elementas istorijos įraše</translation> </message> <message> <source>No entry uuid found</source> - <translation type="unfinished"/> + <translation>Nerastas įrašo uuid</translation> </message> <message> <source>History element with different uuid</source> @@ -2186,7 +2349,7 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų </message> <message> <source>Unable to decrypt entry string</source> - <translation type="unfinished"/> + <translation>Nepavyko iššifruoti įrašo eilutės</translation> </message> <message> <source>Duplicate custom attribute found</source> @@ -2218,11 +2381,11 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų </message> <message> <source>Invalid color value</source> - <translation type="unfinished"/> + <translation>Neteisinga spalvos reikšmė</translation> </message> <message> <source>Invalid color rgb part</source> - <translation type="unfinished"/> + <translation>Neteisinga spalvos rgb dalis</translation> </message> <message> <source>Invalid number value</source> @@ -2230,7 +2393,7 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų </message> <message> <source>Invalid uuid value</source> - <translation type="unfinished"/> + <translation>Neteisinga uuid reikšmė</translation> </message> <message> <source>Unable to decompress binary</source> @@ -2274,15 +2437,15 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų </message> <message> <source>Invalid number of groups</source> - <translation type="unfinished"/> + <translation>Neteisingas grupių skaičius</translation> </message> <message> <source>Invalid number of entries</source> - <translation type="unfinished"/> + <translation>Neteisingas įrašų skaičius</translation> </message> <message> <source>Invalid content hash size</source> - <translation type="unfinished"/> + <translation>Neteisingas turinio maišos dydis</translation> </message> <message> <source>Invalid transform seed size</source> @@ -2310,7 +2473,7 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų </message> <message> <source>Key transformation failed</source> - <translation type="unfinished"/> + <translation>Rakto transformacija nepavyko</translation> </message> <message> <source>Invalid group field type number</source> @@ -2354,7 +2517,7 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų </message> <message> <source>Invalid group field type</source> - <translation type="unfinished"/> + <translation>Neteisingas grupės lauko tipas</translation> </message> <message> <source>Missing group id or level</source> @@ -2366,7 +2529,7 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų </message> <message> <source>Invalid entry field size</source> - <translation type="unfinished"/> + <translation>Neteisingas įrašo lauko dydis</translation> </message> <message> <source>Read entry field data doesn't match size</source> @@ -2374,7 +2537,7 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų </message> <message> <source>Invalid entry uuid field size</source> - <translation type="unfinished"/> + <translation>Neteisingas įrašo uuid lauko dydis</translation> </message> <message> <source>Invalid entry group id field size</source> @@ -2580,7 +2743,7 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų </message> <message> <source>Copy title to clipboard</source> - <translation type="unfinished"/> + <translation>Kopijuoti pavadinimą į iškarpinę</translation> </message> <message> <source>&URL</source> @@ -2588,7 +2751,7 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų </message> <message> <source>Copy URL to clipboard</source> - <translation type="unfinished"/> + <translation>Kopijuoti URL į iškarpinę</translation> </message> <message> <source>&Notes</source> @@ -2596,7 +2759,7 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų </message> <message> <source>Copy notes to clipboard</source> - <translation type="unfinished"/> + <translation>Kopijuoti pastabas į iškarpinę</translation> </message> <message> <source>&Export to CSV file...</source> @@ -2628,7 +2791,7 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų </message> <message> <source>E&mpty recycle bin</source> - <translation type="unfinished"/> + <translation>Iš&valyti šiukšlinę</translation> </message> <message> <source>Clear history</source> @@ -2682,101 +2845,111 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų <source>Please touch the button on your YubiKey!</source> <translation>Prašome priliesti mygtuką ant savo YubiKey!</translation> </message> + <message> + <source>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OpenSSHKey</name> <message> <source>Invalid key file, expecting an OpenSSH key</source> - <translation type="unfinished"/> + <translation>Neteisingas rakto failas, tikimasi OpenSSH rakto</translation> </message> <message> <source>PEM boundary mismatch</source> - <translation type="unfinished"/> - </message> - <message> - <source>This is not an OpenSSH key, only modern keys are supported</source> - <translation type="unfinished"/> + <translation>PEM ribos neatitikimas</translation> </message> <message> <source>Base64 decoding failed</source> - <translation type="unfinished"/> + <translation>Base64 dekodavimas patyrė nesėkmę</translation> </message> <message> <source>Key file way too small.</source> - <translation type="unfinished"/> + <translation>Rakto failas buvo per mažas.</translation> </message> <message> <source>Key file magic header id invalid</source> - <translation type="unfinished"/> + <translation>Neteisingas rakto failo magiškosios antraštės id</translation> </message> <message> <source>Found zero keys</source> - <translation type="unfinished"/> + <translation>Rasta nulis raktų</translation> </message> <message> <source>Failed to read public key.</source> - <translation type="unfinished"/> + <translation>Nepavyko perskaityti viešojo rakto.</translation> </message> <message> <source>Corrupted key file, reading private key failed</source> - <translation type="unfinished"/> + <translation>Sugadintas rakto failas, privačiojo rakto skaitymas nepavyko</translation> </message> <message> <source>No private key payload to decrypt</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown cipher: </source> - <translation type="unfinished"/> + <translation>Nėra jokios privačiojo rakto naudingosios apkrovos, kurią iššifruoti</translation> </message> <message> <source>Trying to run KDF without cipher</source> - <translation type="unfinished"/> + <translation>Bandoma paleisti KDF be šifro</translation> </message> <message> <source>Passphrase is required to decrypt this key</source> - <translation type="unfinished"/> + <translation>Norint iššifruoti šį raktą, reikalinga slaptafrazė</translation> </message> <message> <source>Key derivation failed, key file corrupted?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown KDF: </source> - <translation type="unfinished"/> + <translation>Rakto išvedimas nepavyko, pažeistas rakto failas?</translation> </message> <message> <source>Decryption failed, wrong passphrase?</source> - <translation type="unfinished"/> + <translation>Iššifravimas nepavyko, neteisinga slaptafrazė?</translation> </message> <message> <source>Unexpected EOF while reading public key</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown key type: </source> - <translation type="unfinished"/> + <translation>Netikėta failo pabaiga, skaitant viešąjį raktą</translation> </message> <message> <source>Unexpected EOF while reading private key</source> - <translation type="unfinished"/> + <translation>Netikėta failo pabaiga, skaitant privatųjį raktą</translation> </message> <message> <source>Can't write public key as it is empty</source> - <translation type="unfinished"/> + <translation>Nepavyksta rašyti viešojo rakto, nes jis tuščias</translation> </message> <message> <source>Unexpected EOF when writing public key</source> - <translation type="unfinished"/> + <translation>Netikėta failo pabaiga, rašant viešąjį raktą</translation> </message> <message> <source>Can't write private key as it is empty</source> - <translation type="unfinished"/> + <translation>Nepavyksta rašyti privačiojo rakto, nes jis tuščias</translation> </message> <message> <source>Unexpected EOF when writing private key</source> + <translation>Netikėta failo pabaiga, rašant privatųjį raktą</translation> + </message> + <message> + <source>Unsupported key type: %1</source> + <translation>Nepalaikomas rakto tipas: %1</translation> + </message> + <message> + <source>Unknown cipher: %1</source> + <translation>Nežinomas šifras: %1</translation> + </message> + <message> + <source>Cipher IV is too short for MD5 kdf</source> <translation type="unfinished"/> </message> + <message> + <source>Unknown KDF: %1</source> + <translation>Nežinomas KDF: %1</translation> + </message> + <message> + <source>Unknown key type: %1</source> + <translation>Nežinomas rakto tipas: %1</translation> + </message> </context> <context> <name>OptionDialog</name> @@ -2883,7 +3056,7 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų </message> <message> <source><b>Warning:</b> The following options can be dangerous!</source> - <translation type="unfinished"/> + <translation><b>Įspėjimas:</b> Šie parametrai gali būti pavojingi!</translation> </message> <message> <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> @@ -3028,11 +3201,11 @@ Naudojamas numatytasis prievadas 19455.</translation> <name>QObject</name> <message> <source>Database not opened</source> - <translation type="unfinished"/> + <translation>Duomenų bazė neatverta</translation> </message> <message> <source>Database hash not available</source> - <translation type="unfinished"/> + <translation>Duomenų bazės maiša yra neprieinama</translation> </message> <message> <source>Client public key not received</source> @@ -3040,15 +3213,15 @@ Naudojamas numatytasis prievadas 19455.</translation> </message> <message> <source>Cannot decrypt message</source> - <translation type="unfinished"/> + <translation>Nepavyksta iššifruoti žinutės</translation> </message> <message> <source>Timeout or cannot connect to KeePassXC</source> - <translation type="unfinished"/> + <translation>Baigėsi laikas ar nepavyksta prisijungti prie KeePassXC</translation> </message> <message> <source>Action cancelled or denied</source> - <translation type="unfinished"/> + <translation>Veiksmo atsisakyta arba jis atmestas</translation> </message> <message> <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> @@ -3064,35 +3237,35 @@ Naudojamas numatytasis prievadas 19455.</translation> </message> <message> <source>Encryption key is not recognized</source> - <translation type="unfinished"/> + <translation>Šifravimo raktas yra neatpažintas</translation> </message> <message> <source>No saved databases found</source> - <translation type="unfinished"/> + <translation>Nerasta įrašytų duomenų bazių</translation> </message> <message> <source>Incorrect action</source> - <translation type="unfinished"/> + <translation>Neteisingas veiksmas</translation> </message> <message> <source>Empty message received</source> - <translation type="unfinished"/> + <translation>Gauta tuščia žinutė</translation> </message> <message> <source>No URL provided</source> - <translation type="unfinished"/> + <translation>Nepateiktas URL</translation> </message> <message> <source>No logins found</source> - <translation type="unfinished"/> + <translation>Nerasta prisijungimų</translation> </message> <message> <source>Unknown error</source> - <translation type="unfinished"/> + <translation>Nežinoma klaida</translation> </message> <message> <source>Add a new entry to a database.</source> - <translation type="unfinished"/> + <translation>Pridėti naują įrašą į duomenų bazę.</translation> </message> <message> <source>Path of the database.</source> @@ -3100,23 +3273,23 @@ Naudojamas numatytasis prievadas 19455.</translation> </message> <message> <source>Key file of the database.</source> - <translation type="unfinished"/> + <translation>Duomenų bazės rakto failas.</translation> </message> <message> <source>path</source> - <translation type="unfinished"/> + <translation>kelias</translation> </message> <message> <source>Username for the entry.</source> - <translation type="unfinished"/> + <translation>Įrašo naudotojo vardas.</translation> </message> <message> <source>username</source> - <translation type="unfinished"/> + <translation>naudotojo vardas</translation> </message> <message> <source>URL for the entry.</source> - <translation type="unfinished"/> + <translation>Įrašo URL.</translation> </message> <message> <source>URL</source> @@ -3124,64 +3297,64 @@ Naudojamas numatytasis prievadas 19455.</translation> </message> <message> <source>Prompt for the entry's password.</source> - <translation type="unfinished"/> + <translation>Klausti įrašo slaptažodžio.</translation> </message> <message> <source>Generate a password for the entry.</source> - <translation type="unfinished"/> + <translation>Generuoti įrašui slaptažodį.</translation> </message> <message> <source>Length for the generated password.</source> - <translation type="unfinished"/> + <translation>Generuoto slaptažodžio ilgis.</translation> </message> <message> <source>length</source> - <translation type="unfinished"/> + <translation>ilgis</translation> </message> <message> <source>Path of the entry to add.</source> - <translation type="unfinished"/> + <translation>Įrašo, kurį pridėti, kelias.</translation> </message> <message> <source>Copy an entry's password to the clipboard.</source> - <translation type="unfinished"/> + <translation>Kopijuoti įrašo slaptažodį į iškarpinę.</translation> </message> <message> <source>Path of the entry to clip.</source> <comment>clip = copy to clipboard</comment> - <translation type="unfinished"/> + <translation>Įrašo, kurį iškirpti, kelias.</translation> </message> <message> <source>Timeout in seconds before clearing the clipboard.</source> - <translation type="unfinished"/> + <translation>Skirtas laikas, sekundėmis, prieš išvalant iškarpinę.</translation> </message> <message> <source>Edit an entry.</source> - <translation type="unfinished"/> + <translation>Taisyti įrašą.</translation> </message> <message> <source>Title for the entry.</source> - <translation type="unfinished"/> + <translation>Įrašo pavadinimas.</translation> </message> <message> <source>title</source> - <translation type="unfinished"/> + <translation>antraštė</translation> </message> <message> <source>Path of the entry to edit.</source> - <translation type="unfinished"/> + <translation>Įrašo, kurį taisyti, kelias.</translation> </message> <message> <source>Estimate the entropy of a password.</source> - <translation type="unfinished"/> + <translation>Apskaičiuoti slaptažodžio entropiją.</translation> </message> <message> <source>Password for which to estimate the entropy.</source> - <translation type="unfinished"/> + <translation>Slaptažodis, kurio entropiją apskaičiuoti</translation> </message> <message> <source>Perform advanced analysis on the password.</source> - <translation type="unfinished"/> + <translation>Atlikti išplėstinę slaptažodžio analizę</translation> </message> <message> <source>Extract and print the content of a database.</source> @@ -3193,11 +3366,11 @@ Naudojamas numatytasis prievadas 19455.</translation> </message> <message> <source>Insert password to unlock %1: </source> - <translation type="unfinished"/> + <translation>Norėdami atrakinti %1, įterpkite slaptažodį: </translation> </message> <message> <source>Failed to load key file %1 : %2</source> - <translation type="unfinished"/> + <translation>Nepavyko įkelti rakto failo %1 : %2</translation> </message> <message> <source>WARNING: You are using a legacy key file format which may become @@ -3211,7 +3384,10 @@ Please consider generating a new key file.</source> Available commands: </source> - <translation type="unfinished"/> + <translation> + +Prieinamos komandos: +</translation> </message> <message> <source>Name of the command to execute.</source> @@ -3227,11 +3403,11 @@ Available commands: </message> <message> <source>Find entries quickly.</source> - <translation type="unfinished"/> + <translation>Greitai rasti įrašus.</translation> </message> <message> <source>Search term.</source> - <translation type="unfinished"/> + <translation>Paieškos žodis.</translation> </message> <message> <source>Merge two databases.</source> @@ -3247,15 +3423,15 @@ Available commands: </message> <message> <source>Use the same credentials for both database files.</source> - <translation type="unfinished"/> + <translation>Abiems duomenų bazių failams naudoti tuos pačius prisijungimo duomenis.</translation> </message> <message> <source>Key file of the database to merge from.</source> - <translation type="unfinished"/> + <translation>Duomenų bazės, iš kurios sulieti, rakto failas.</translation> </message> <message> <source>Show an entry's information.</source> - <translation type="unfinished"/> + <translation>Rodyti įrašo informaciją.</translation> </message> <message> <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> @@ -3263,7 +3439,7 @@ Available commands: </message> <message> <source>attribute</source> - <translation type="unfinished"/> + <translation>požymis</translation> </message> <message> <source>Name of the entry to show.</source> @@ -3293,27 +3469,27 @@ Available commands: </message> <message> <source>AES: 256-bit</source> - <translation type="unfinished"/> + <translation>AES: 256 bitų</translation> </message> <message> <source>Twofish: 256-bit</source> - <translation type="unfinished"/> + <translation>Twofish: 256 bitų</translation> </message> <message> <source>ChaCha20: 256-bit</source> - <translation type="unfinished"/> + <translation>ChaCha20: 256 bitų</translation> </message> <message> <source>Argon2 (KDBX 4 – recommended)</source> - <translation type="unfinished"/> + <translation>Argon2 (KDBX 4 – rekomenduojama)</translation> </message> <message> <source>AES-KDF (KDBX 4)</source> - <translation type="unfinished"/> + <translation>AES-KDF (KDBX 4)</translation> </message> <message> <source>AES-KDF (KDBX 3.1)</source> - <translation type="unfinished"/> + <translation>AES-KDF (KDBX 3.1)</translation> </message> <message> <source>Group</source> @@ -3337,11 +3513,11 @@ Available commands: </message> <message> <source>Last Modified</source> - <translation type="unfinished"/> + <translation>Paskutinis keitimas</translation> </message> <message> <source>Created</source> - <translation type="unfinished"/> + <translation>Sukurta</translation> </message> <message> <source>Legacy Browser Integration</source> @@ -3367,6 +3543,51 @@ Available commands: <source>SSH Agent</source> <translation>SSH agentas</translation> </message> + <message> + <source>Generate a new random diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Word count for the diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>count</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wordlist for the diceware generator. +[Default: EFF English]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a new random password.</source> + <translation>Generuoti naują atsitiktinį slaptažodį.</translation> + </message> + <message> + <source>Length of the generated password.</source> + <translation>Generuoto slaptažodžio ilgis.</translation> + </message> + <message> + <source>Use lowercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use uppercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use numbers in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use special characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use extended ASCII in the generated password.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>QtIOCompressor</name> @@ -3588,7 +3809,7 @@ Prašome atrakinti pasirinktą duomenų bazę arba pasirinkti kitą, kuri būtų </message> <message> <source>Hide the Details view</source> - <translation type="unfinished"/> + <translation>Slėpti išsamų rodinį</translation> </message> <message> <source>Show a system tray icon</source> @@ -3604,7 +3825,7 @@ Prašome atrakinti pasirinktą duomenų bazę arba pasirinkti kitą, kuri būtų </message> <message> <source>Dark system tray icon</source> - <translation type="unfinished"/> + <translation>Tamsi sistemos dėklo piktograma</translation> </message> <message> <source>Language</source> @@ -3616,11 +3837,11 @@ Prašome atrakinti pasirinktą duomenų bazę arba pasirinkti kitą, kuri būtų </message> <message> <source>Use entry title to match windows for global Auto-Type</source> - <translation type="unfinished"/> + <translation>Naudoti įrašo antraštę, norint sutapatinti langus visuotiniam Automatiniam rinkimui</translation> </message> <message> <source>Use entry URL to match windows for global Auto-Type</source> - <translation type="unfinished"/> + <translation>Naudoti įrašo URL, norint sutapatinti langus visuotiniam Automatiniam rinkimui</translation> </message> <message> <source>Always ask before performing Auto-Type</source> @@ -3639,6 +3860,30 @@ Prašome atrakinti pasirinktą duomenų bazę arba pasirinkti kitą, kuri būtų <comment>Milliseconds</comment> <translation> ms</translation> </message> + <message> + <source>Startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>File Management</source> + <translation>Failų tvarkymas</translation> + </message> + <message> + <source>Safely save database files (may be incompatible with Dropbox, etc)</source> + <translation>Saugiai įrašyti duomenų bazės failus (gali būti nesuderinama su Dropbox ir t.t.)</translation> + </message> + <message> + <source>Backup database file before saving</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry Management</source> + <translation>Įrašų tvarkymas</translation> + </message> + <message> + <source>General</source> + <translation>Bendra</translation> + </message> </context> <context> <name>SettingsWidgetSecurity</name> @@ -3681,11 +3926,11 @@ Prašome atrakinti pasirinktą duomenų bazę arba pasirinkti kitą, kuri būtų </message> <message> <source>Hide passwords in the preview panel</source> - <translation type="unfinished"/> + <translation>Slėpti slaptažodžius peržiūros skydelyje</translation> </message> <message> <source>Hide entry notes by default</source> - <translation type="unfinished"/> + <translation>Pagal numatymą, slėpti įrašo pastabas</translation> </message> <message> <source>Privacy</source> @@ -3695,6 +3940,10 @@ Prašome atrakinti pasirinktą duomenų bazę arba pasirinkti kitą, kuri būtų <source>Use Google as fallback for downloading website icons</source> <translation>Naudoti Google kaip surogatą svetainių piktogramų atsiuntimui</translation> </message> + <message> + <source>Re-lock previously locked database after performing Auto-Type</source> + <translation type="unfinished"/> + </message> </context> <context> <name>SetupTotpDialog</name> @@ -3708,11 +3957,11 @@ Prašome atrakinti pasirinktą duomenų bazę arba pasirinkti kitą, kuri būtų </message> <message> <source>Default RFC 6238 token settings</source> - <translation type="unfinished"/> + <translation>Numatytojo RFC 6238 prieigos rakto nustatymai</translation> </message> <message> <source>Steam token settings</source> - <translation type="unfinished"/> + <translation>Steam prieigos rakto nustatymai</translation> </message> <message> <source>Use custom settings</source> @@ -3776,10 +4025,6 @@ Prašome atrakinti pasirinktą duomenų bazę arba pasirinkti kitą, kuri būtų </context> <context> <name>WelcomeWidget</name> - <message> - <source>Welcome to KeePassXC</source> - <translation>Sveiki atvykę į KeePassXC</translation> - </message> <message> <source>Start storing your passwords securely in a KeePassXC database</source> <translation>Pradėkite saugiai laikyti savo slaptažodžius KeePassXC duomenų bazėje</translation> @@ -3804,12 +4049,16 @@ Prašome atrakinti pasirinktą duomenų bazę arba pasirinkti kitą, kuri būtų <source>Recent databases</source> <translation>Paskiausios duomenų bazės</translation> </message> + <message> + <source>Welcome to KeePassXC %1</source> + <translation>Sveiki atvykę į KeePassXC %1</translation> + </message> </context> <context> <name>main</name> <message> <source>Remove an entry from the database.</source> - <translation type="unfinished"/> + <translation>Šalinti įrašą iš duomenų bazės.</translation> </message> <message> <source>Path of the database.</source> @@ -3817,7 +4066,7 @@ Prašome atrakinti pasirinktą duomenų bazę arba pasirinkti kitą, kuri būtų </message> <message> <source>Path of the entry to remove.</source> - <translation type="unfinished"/> + <translation>Įrašo, kurį šalinti, kelias.</translation> </message> <message> <source>KeePassXC - cross-platform password manager</source> diff --git a/share/translations/keepassx_nl_NL.ts b/share/translations/keepassx_nl_NL.ts index 3191bf949..d623a08e3 100644 --- a/share/translations/keepassx_nl_NL.ts +++ b/share/translations/keepassx_nl_NL.ts @@ -11,62 +11,75 @@ </message> <message> <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> - <translation type="unfinished"/> + <translation>Meld bugs op: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;"> https://github.com</a></translation> </message> <message> <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassXC wordt verspreid onder de voorwaarden van de GNU General Public License (GPL) versie 2 of (als u wenst) versie 3.</translation> - </message> - <message> - <source>Project Maintainers:</source> - <translation type="unfinished"/> + <translation>KeePassXC wordt verspreid onder de voorwaarden van de GNU General Public License (GPL) versie 2 of (als je wenst) versie 3.</translation> </message> <message> <source>Contributors</source> - <translation type="unfinished"/> + <translation>Bijdragers</translation> </message> <message> <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation type="unfinished"/> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Toon bijdragingen op GitHub</a></translation> </message> <message> <source>Debug Info</source> - <translation type="unfinished"/> + <translation>Debuggingsinformatie</translation> </message> <message> <source>Include the following information whenever you report a bug:</source> - <translation type="unfinished"/> + <translation>Voeg de volgende informatie bij het bugrapport:</translation> </message> <message> <source>Copy to clipboard</source> - <translation type="unfinished"/> + <translation>Kopieer naar klembord</translation> </message> <message> <source>Version %1 </source> - <translation type="unfinished"/> + <translation>Versie %1 +</translation> </message> <message> <source>Revision: %1</source> - <translation type="unfinished"/> + <translation>Revisie: %1</translation> </message> <message> <source>Distribution: %1</source> - <translation type="unfinished"/> + <translation>Distributie: %1</translation> </message> <message> <source>Libraries:</source> - <translation type="unfinished"/> + <translation>Bibliotheken:</translation> </message> <message> <source>Operating system: %1 CPU architecture: %2 Kernel: %3 %4</source> - <translation type="unfinished"/> + <translation>Besturingssysteem: %1 +CPU-architectuur: %2 +Kernelversie: %3 %4</translation> </message> <message> <source>Enabled extensions:</source> - <translation type="unfinished"/> + <translation>Geactiveerde extensies:</translation> + </message> + <message> + <source>Project Maintainers:</source> + <translation>Projectbeheerders:</translation> + </message> + <message> + <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> + <translation>Een extra dank-u-wel van het KeePassXC-team voor debfx voor het creëren van het oorspronkelijke KeePassX.</translation> + </message> + <message> + <source>Build Type: %1 +</source> + <translation>Bouw Type: %1 +</translation> </message> </context> <context> @@ -90,22 +103,22 @@ Kernel: %3 %4</source> <message> <source>%1 has requested access to passwords for the following item(s). Please select whether you want to allow access.</source> - <translation>%1 vraagt toegang tot uw wachtwoorden voor het/de volgende item(s). -Geef aan of u toegang wilt toestaan of niet.</translation> + <translation>%1 vraagt toegang tot jouw wachtwoorden voor het/de volgende item(s). +Geef aan of je toegang wilt toestaan of niet.</translation> </message> </context> <context> <name>AgentSettingsWidget</name> <message> <source>Enable SSH Agent (requires restart)</source> - <translation type="unfinished"/> + <translation>Activeer SSH Agent (vereist herstart)</translation> </message> </context> <context> <name>AutoType</name> <message> <source>Couldn't find an entry that matches the window title:</source> - <translation>Kon geen element vinden dat overeenkomt met de venstertitel:</translation> + <translation>Kon geen item vinden dat overeenkomt met de vensternaam:</translation> </message> <message> <source>Auto-Type - KeePassXC</source> @@ -117,19 +130,19 @@ Geef aan of u toegang wilt toestaan of niet.</translation> </message> <message> <source>The Syntax of your Auto-Type statement is incorrect!</source> - <translation type="unfinished"/> + <translation>De syntaxis van de Auto-Type opdracht is onjuist!</translation> </message> <message> <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>Deze Auto-typen opdracht bevat een zeer lange vertraging. Wil je echt door gaan?</translation> </message> <message> <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>Deze Auto-typen opdracht bevat zeer traag toetsaanslagen. Wil je echt door gaan?</translation> </message> <message> <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>Deze Auto-Type opdracht bevat argumenten die zeer vaak worden herhaald. Wil je echt door gaan?</translation> </message> </context> <context> @@ -147,6 +160,25 @@ Geef aan of u toegang wilt toestaan of niet.</translation> <translation>Standaardvolgorde</translation> </message> </context> +<context> + <name>AutoTypeMatchModel</name> + <message> + <source>Group</source> + <translation>Groep</translation> + </message> + <message> + <source>Title</source> + <translation>Naam</translation> + </message> + <message> + <source>Username</source> + <translation>Gebruikersnaam</translation> + </message> + <message> + <source>Sequence</source> + <translation>Volgorde</translation> + </message> +</context> <context> <name>AutoTypeSelectDialog</name> <message> @@ -162,7 +194,7 @@ Geef aan of u toegang wilt toestaan of niet.</translation> <name>BrowserAccessControlDialog</name> <message> <source>KeePassXC-Browser Confirm Access</source> - <translation type="unfinished"/> + <translation>KeePassXC-Browser toegang bevestigen</translation> </message> <message> <source>Remember this decision</source> @@ -179,8 +211,8 @@ Geef aan of u toegang wilt toestaan of niet.</translation> <message> <source>%1 has requested access to passwords for the following item(s). Please select whether you want to allow access.</source> - <translation>%1 vraagt toegang tot uw wachtwoorden voor het/de volgende item(s). -Geef aan of u toegang wilt toestaan of niet.</translation> + <translation>%1 vraagt toegang tot jouw wachtwoorden voor het/de volgende item(s). +Geef aan of je toegang wilt toestaan of niet.</translation> </message> </context> <context> @@ -191,11 +223,11 @@ Geef aan of u toegang wilt toestaan of niet.</translation> </message> <message> <source>This is required for accessing your databases with KeePassXC-Browser</source> - <translation type="unfinished"/> + <translation>Dit is vereist voor toegang tot jouw databases met KeePassXC-Browser</translation> </message> <message> <source>Enable KeepassXC browser integration</source> - <translation type="unfinished"/> + <translation>Activeer KeePassXC browser integratie</translation> </message> <message> <source>General</source> @@ -203,28 +235,28 @@ Geef aan of u toegang wilt toestaan of niet.</translation> </message> <message> <source>Enable integration for these browsers:</source> - <translation type="unfinished"/> + <translation>Activeer integratie voor deze browsers:</translation> </message> <message> <source>&Google Chrome</source> - <translation type="unfinished"/> + <translation>&Google Chrome</translation> </message> <message> <source>&Firefox</source> - <translation type="unfinished"/> + <translation>&Firefox</translation> </message> <message> <source>&Chromium</source> - <translation type="unfinished"/> + <translation>&Chromium</translation> </message> <message> <source>&Vivaldi</source> - <translation type="unfinished"/> + <translation>&Vivaldi</translation> </message> <message> <source>Show a &notification when credentials are requested</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Toon een &notificatie wanneer inloggegevens worden gevraagd</translation> </message> <message> <source>Re&quest to unlock the database if it is locked</source> @@ -232,37 +264,37 @@ Geef aan of u toegang wilt toestaan of niet.</translation> </message> <message> <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> - <translation type="unfinished"/> + <translation>Alleen invoer van hetzelfde schema (http://, https://,...) worden gegeven.</translation> </message> <message> <source>&Match URL scheme (e.g., https://...)</source> - <translation type="unfinished"/> + <translation>Vergelijk URL sche&ma's (bijv. https://...)</translation> </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation type="unfinished"/> + <translation>Geeft alleen de beste overeenkomsten weer voor een specifieke URL in plaats van alle invoer voor het hele domein.</translation> </message> <message> <source>&Return only best-matching credentials</source> - <translation type="unfinished"/> + <translation>Geef alleen de best ove&reenkomende inloggegevens</translation> </message> <message> <source>Sort &matching credentials by title</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Sorteer &overeenkomende inloggegevens op naam</translation> </message> <message> <source>Sort matching credentials by &username</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Sorteer overeenkomende inloggegevens op &gebruikersnaam</translation> </message> <message> <source>&Disconnect all browsers</source> - <translation type="unfinished"/> + <translation>&Verbreek verbinding met alle browsers</translation> </message> <message> <source>Forget all remembered &permissions</source> - <translation type="unfinished"/> + <translation>Vergeet alle &permissies</translation> </message> <message> <source>Advanced</source> @@ -271,21 +303,21 @@ Geef aan of u toegang wilt toestaan of niet.</translation> <message> <source>Never &ask before accessing credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Nooit &waarschuwen bij toegang tot logingegevens</translation> </message> <message> <source>Never ask before &updating credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Nooit waarschuwen bij &bijwerken van logingegevens</translation> </message> <message> <source>Only the selected database has to be connected with a client.</source> - <translation type="unfinished"/> + <translation>Alleen de geselecteerde database hoeft met een client verbonden te zijn.</translation> </message> <message> <source>Searc&h in all opened databases for matching credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>&Zoek in alle geopende databases voor overeenkomende logingegevens</translation> </message> <message> <source>Automatically creating or updating string fields is not supported.</source> @@ -293,71 +325,74 @@ Geef aan of u toegang wilt toestaan of niet.</translation> </message> <message> <source>&Return advanced string fields which start with "KPH: "</source> - <translation>&Geef geadvanceerde tekenreeks velden terug die met "KH: " beginnen.</translation> + <translation>Geef geadvanceerde teken&reeks velden die met "KH: " beginnen.</translation> </message> <message> <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> - <translation type="unfinished"/> + <translation>Wijzig bij het opstarten automatisch het zoek pad van KeePassXC of keepassxc-proxy naar de native messaging scripts.</translation> </message> <message> <source>Update &native messaging manifest files at startup</source> - <translation type="unfinished"/> + <translation>Vernieuw &native messaging manifest-bestanden bij het opstarten</translation> </message> <message> <source>Support a proxy application between KeePassXC and browser extension.</source> - <translation type="unfinished"/> + <translation>Ondersteun een proxy programma tussen KeePassXC en browser extensie.</translation> </message> <message> <source>Use a &proxy application between KeePassXC and browser extension</source> - <translation type="unfinished"/> + <translation>Gebruik een &proxy programma tussen KeePassXC en browser extensie</translation> </message> <message> <source>Use a custom proxy location if you installed a proxy manually.</source> - <translation type="unfinished"/> + <translation>Gebruik een aangepaste proxy-locatie als je een proxy handmatig hebt geïnstalleerd.</translation> </message> <message> <source>Use a &custom proxy location</source> <comment>Meant is the proxy for KeePassXC-Browser</comment> - <translation type="unfinished"/> + <translation>Gebruik een &aangepaste proxy locatie</translation> </message> <message> <source>Browse...</source> <extracomment>Button for opening file dialog</extracomment> - <translation type="unfinished"/> + <translation>Bladeren...</translation> </message> <message> <source><b>Warning:</b> The following options can be dangerous!</source> - <translation type="unfinished"/> + <translation><b>Waarschuwing:</b> De volgende opties kunnen gevaarlijk zijn!</translation> </message> <message> <source>Executable Files (*.exe);;All Files (*.*)</source> - <translation type="unfinished"/> + <translation>Uitvoerbare bestanden (*.exe); Alle bestanden (*.*)</translation> </message> <message> <source>Executable Files (*)</source> - <translation type="unfinished"/> + <translation>Uitvoerbare bestanden (*)</translation> </message> <message> <source>Select custom proxy location</source> - <translation type="unfinished"/> + <translation>Selecteer aangepaste proxy locatie</translation> </message> </context> <context> <name>BrowserService</name> <message> <source>KeePassXC: New key association request</source> - <translation>KeePassXC: Nieuw verzoek voor sleutel associatie</translation> + <translation>KeePassXC: Nieuw verzoek voor sleutel koppeling</translation> </message> <message> <source>You have received an association request for the above key. If you would like to allow it access to your KeePassXC database, give it a unique name to identify and accept it.</source> - <translation type="unfinished"/> + <translation>Je hebt een koppeling verzoek ontvangen voor bovenstaande sleutel. + +Als je de sleutel toegang tot jouw KeePassXC database wil geven, +geef het dan een unieke naam ter identificatie, en accepteer het verzoek.</translation> </message> <message> <source>Save and allow access</source> - <translation type="unfinished"/> + <translation>Opslaan en sta toegang toe</translation> </message> <message> <source>KeePassXC: Overwrite existing key?</source> @@ -366,7 +401,8 @@ give it a unique name to identify and accept it.</source> <message> <source>A shared encryption key with the name "%1" already exists. Do you want to overwrite it?</source> - <translation type="unfinished"/> + <translation>Een gedeelde encryptiesleutel met de naam "%1" bestaat al. +Wil je deze overschrjiven?</translation> </message> <message> <source>KeePassXC: Update Entry</source> @@ -392,7 +428,7 @@ Ontgrendel de geselecteerde database of kies een ontgrendelde database.</transla </message> <message> <source>The active database does not contain a settings entry.</source> - <translation type="unfinished"/> + <translation>De actieve database bevat geen instellingen-item.</translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -400,7 +436,7 @@ Ontgrendel de geselecteerde database of kies een ontgrendelde database.</transla </message> <message> <source>No shared encryption keys found in KeePassXC Settings.</source> - <translation type="unfinished"/> + <translation>Geen gedeelde encryptiesleutels gevonden in KeePassXC instellingen.</translation> </message> <message> <source>KeePassXC: Removed keys from database</source> @@ -408,11 +444,11 @@ Ontgrendel de geselecteerde database of kies een ontgrendelde database.</transla </message> <message numerus="yes"> <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Coderingssleutel uit KeePassXC instellingen verwijderd.</numerusform><numerusform>%n coderingssleutels uit KeePassXC instellingen verwijderd.</numerusform></translation> </message> <message> <source>Removing stored permissions…</source> - <translation type="unfinished"/> + <translation>Opgeslagen permissies verwijderen...</translation> </message> <message> <source>Abort</source> @@ -424,7 +460,7 @@ Ontgrendel de geselecteerde database of kies een ontgrendelde database.</transla </message> <message numerus="yes"> <source>Successfully removed permissions from %n entry(s).</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Permissies zijn verwijderd uit %n item(s).</numerusform><numerusform>Permissies zijn verwijderd uit %n item(s).</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -463,11 +499,11 @@ Ontgrendel de geselecteerde database of kies een ontgrendelde database.</transla </message> <message> <source>Cha&llenge Response</source> - <translation type="unfinished"/> + <translation>Test - Antwoord</translation> </message> <message> <source>Refresh</source> - <translation type="unfinished"/> + <translation>Vernieuw</translation> </message> <message> <source>Key files</source> @@ -491,15 +527,15 @@ Ontgrendel de geselecteerde database of kies een ontgrendelde database.</transla </message> <message> <source>Empty password</source> - <translation type="unfinished"/> + <translation>Leeg wachtwoord</translation> </message> <message> <source>Do you really want to use an empty string as password?</source> - <translation>Weet u zeker dat u een leeg veld als wachtwoord wilt gebruiken?</translation> + <translation>Weet je zeker dat je een leeg veld als wachtwoord wil gebruiken?</translation> </message> <message> <source>Different passwords supplied.</source> - <translation>U heeft verschillende wachtwoorden opgegeven.</translation> + <translation>Je hebt verschillende wachtwoorden opgegeven.</translation> </message> <message> <source>Failed to set %1 as the Key file: @@ -509,120 +545,122 @@ Ontgrendel de geselecteerde database of kies een ontgrendelde database.</transla </message> <message> <source>Legacy key file format</source> - <translation type="unfinished"/> + <translation>Verouderd sleutelbestandsformaat</translation> </message> <message> <source>You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>Je gebruikt een verouderd sleutelbestandsformaat welke in de toekomst niet ondersteund zal worden. + +Overweeg aub een nieuw sleutelbestand te genereren.</translation> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> - <translation type="unfinished"/> + <translation>Verandering sleutelbestand mislukt: geen YubiKey gedetecteerd</translation> </message> </context> <context> <name>CloneDialog</name> <message> <source>Clone Options</source> - <translation type="unfinished"/> + <translation>Kloon Opties</translation> </message> <message> <source>Append ' - Clone' to title</source> - <translation type="unfinished"/> + <translation>Toevoegen' - Kloon' aan naam</translation> </message> <message> <source>Replace username and password with references</source> - <translation type="unfinished"/> + <translation>Vervang gebruikersnaam en wachtwoord door referenties</translation> </message> <message> <source>Copy history</source> - <translation type="unfinished"/> + <translation>Kopie historie</translation> </message> </context> <context> <name>CsvImportWidget</name> <message> <source>Import CSV fields</source> - <translation type="unfinished"/> + <translation>Importeer CSV velden</translation> </message> <message> <source>filename</source> - <translation type="unfinished"/> + <translation>bestandsnaam</translation> </message> <message> <source>size, rows, columns</source> - <translation type="unfinished"/> + <translation>grootte, rijen, kolommen</translation> </message> <message> <source>Encoding</source> - <translation type="unfinished"/> + <translation>Koderen</translation> </message> <message> <source>Codec</source> - <translation type="unfinished"/> + <translation>Codec</translation> </message> <message> <source>Text is qualified by</source> - <translation type="unfinished"/> + <translation>Tekst is geschikt bevonden door</translation> </message> <message> <source>Fields are separated by</source> - <translation type="unfinished"/> + <translation>Velden worden gescheiden door</translation> </message> <message> <source>Comments start with</source> - <translation type="unfinished"/> + <translation>Kommentaar start met</translation> </message> <message> <source>First record has field names</source> - <translation type="unfinished"/> + <translation>Eerste record heeft veldnamen</translation> </message> <message> <source>Number of headers line to discard</source> - <translation type="unfinished"/> + <translation>Aantal kopregels te negeren</translation> </message> <message> <source>Consider '\' an escape character</source> - <translation type="unfinished"/> + <translation>Beschouw '\' als excape karacter</translation> </message> <message> <source>Preview</source> - <translation type="unfinished"/> + <translation>voorvertoning</translation> </message> <message> <source>Column layout</source> - <translation type="unfinished"/> + <translation>Kolomsgewijs</translation> </message> <message> <source>Not present in CSV file</source> - <translation type="unfinished"/> + <translation>Niet aanwezig in CSV bestand</translation> </message> <message> <source>Empty fieldname </source> - <translation type="unfinished"/> + <translation>Lege veldnaam</translation> </message> <message> <source>column </source> - <translation type="unfinished"/> + <translation>Kolom</translation> </message> <message> <source>Imported from CSV file</source> - <translation type="unfinished"/> + <translation>Geimporteerd uit CSV bestand</translation> </message> <message> <source>Original data: </source> - <translation type="unfinished"/> + <translation>Orginele gegevens:</translation> </message> <message> <source>Error(s) detected in CSV file !</source> - <translation type="unfinished"/> + <translation>Fout(en) gedetecteerd in CSV bestand!</translation> </message> <message> <source> more messages skipped]</source> - <translation type="unfinished"/> + <translation>meer berichten overgeslagen]</translation> </message> <message> <source>Error</source> @@ -631,7 +669,8 @@ Please consider generating a new key file.</source> <message> <source>CSV import: writer has errors: </source> - <translation type="unfinished"/> + <translation>CSV import: uitvoer bevat fouten: +</translation> </message> </context> <context> @@ -649,15 +688,15 @@ Please consider generating a new key file.</source> <name>CsvParserModel</name> <message numerus="yes"> <source>%n byte(s), </source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n byte(s), </numerusform><numerusform>%n byte(s), </numerusform></translation> </message> <message numerus="yes"> <source>%n row(s), </source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n rij(en), </numerusform><numerusform>%n rij(en), </numerusform></translation> </message> <message numerus="yes"> <source>%n column(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n kolom(men)</numerusform><numerusform>%n kolom(men)</numerusform></translation> </message> </context> <context> @@ -680,11 +719,11 @@ Please consider generating a new key file.</source> </message> <message> <source>Refresh</source> - <translation type="unfinished"/> + <translation>Vernieuw</translation> </message> <message> <source>Challenge Response:</source> - <translation type="unfinished"/> + <translation>Test - Resultaat:</translation> </message> <message> <source>Unable to open the database.</source> @@ -696,18 +735,20 @@ Please consider generating a new key file.</source> </message> <message> <source>Legacy key file format</source> - <translation type="unfinished"/> + <translation>Verouderd sleutelbestandsformaat</translation> </message> <message> <source>You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>Je gebruikt een verouderd sleutelbestandsformaat welke in de toekomst niet ondersteund zal worden. + +Overweeg aub een nieuw sleutelbestand te genereren.</translation> </message> <message> <source>Don't show this warning again</source> - <translation type="unfinished"/> + <translation>Deze waarschuwing niet meer geven</translation> </message> <message> <source>All files</source> @@ -752,7 +793,7 @@ Please consider generating a new key file.</source> <source>The database has been successfully repaired You can now save it.</source> <translation>De database is met succes gerepareerd -U kunt deze nu opslaan.</translation> +Je kunt deze nu opslaan.</translation> </message> <message> <source>Unable to repair the database.</source> @@ -767,64 +808,78 @@ U kunt deze nu opslaan.</translation> </message> <message> <source>Encryption</source> - <translation type="unfinished"/> + <translation>Versleuteling</translation> </message> <message> <source>Number of rounds too high</source> <comment>Key transformation rounds</comment> - <translation type="unfinished"/> + <translation>Aantal rondes te hoog</translation> </message> <message> <source>You are using a very high number of key transform rounds with Argon2. If you keep this number, your database may take hours or days (or even longer) to open!</source> - <translation type="unfinished"/> + <translation>Je gebruikt een zeer groot aantal sleuteltransformatie rondes met Argon2. + +Als je dit aantal aanhoud, kan het uren, dagen –of zelfs meer– duren om de database te openen!</translation> </message> <message> <source>Understood, keep number</source> - <translation type="unfinished"/> + <translation>Begrepen, aantal aanhouden</translation> </message> <message> <source>Cancel</source> - <translation type="unfinished"/> + <translation>Annuleren</translation> </message> <message> <source>Number of rounds too low</source> <comment>Key transformation rounds</comment> - <translation type="unfinished"/> + <translation>Aantal rondes te laag</translation> </message> <message> <source>You are using a very low number of key transform rounds with AES-KDF. If you keep this number, your database may be too easy to crack!</source> - <translation type="unfinished"/> + <translation>Je gebruikt een zeer laag aantal sleuteltransformatie rondes met AES-KDF. + +Als je dit aantal aanhoud is het mogelijk heel gemakkelijk om de database te kraken!</translation> </message> <message> <source>KDF unchanged</source> - <translation type="unfinished"/> + <translation>KDF ongewijzigd</translation> </message> <message> <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> - <translation type="unfinished"/> + <translation>Het transformeren van de sleutel met de nieuwe KDF parameters is mislukt; KDF is ongewijzigd.</translation> + </message> + <message numerus="yes"> + <source> MiB</source> + <comment>Abbreviation for Mebibytes (KDF settings)</comment> + <translation><numerusform> MiB</numerusform><numerusform> MiB</numerusform></translation> + </message> + <message numerus="yes"> + <source> thread(s)</source> + <comment>Threads for parallel execution (KDF settings)</comment> + <translation><numerusform>executie thread</numerusform><numerusform> executie thread(s)</numerusform></translation> </message> </context> <context> <name>DatabaseSettingsWidgetEncryption</name> <message> <source>Encryption Algorithm:</source> - <translation type="unfinished"/> + <translation>Coderingsalgoritme:</translation> </message> <message> <source>AES: 256 Bit (default)</source> - <translation type="unfinished"/> + <translation>AES: 256 bit (standaard)</translation> </message> <message> <source>Twofish: 256 Bit</source> - <translation type="unfinished"/> + <translation>Twofish: 256 bit</translation> </message> <message> <source>Key Derivation Function:</source> - <translation type="unfinished"/> + <translation>Key Derivation Function:</translation> </message> <message> <source>Transform rounds:</source> @@ -832,30 +887,22 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Benchmark 1-second delay</source> - <translation type="unfinished"/> + <translation>Benchmark 1 seconde vertraging</translation> </message> <message> <source>Memory Usage:</source> - <translation type="unfinished"/> - </message> - <message> - <source> MB</source> - <translation type="unfinished"/> + <translation>Geheugengebruik:</translation> </message> <message> <source>Parallelism:</source> - <translation type="unfinished"/> - </message> - <message> - <source> thread</source> - <translation type="unfinished"/> + <translation>Parallellisme:</translation> </message> </context> <context> <name>DatabaseSettingsWidgetGeneral</name> <message> <source>Database Meta Data</source> - <translation type="unfinished"/> + <translation>Database meta gegevens</translation> </message> <message> <source>Database name:</source> @@ -871,7 +918,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>History Settings</source> - <translation type="unfinished"/> + <translation>Geschiedenis Instellingen</translation> </message> <message> <source>Max. history items:</source> @@ -889,6 +936,14 @@ If you keep this number, your database may be too easy to crack!</source> <source>Use recycle bin</source> <translation>Prullenbak gebruiken</translation> </message> + <message> + <source>Additional Database Settings</source> + <translation>Extra database instellingen</translation> + </message> + <message> + <source>Enable &compression (recommended)</source> + <translation>Activeer &compressie (aanbevolen)</translation> + </message> </context> <context> <name>DatabaseTabWidget</name> @@ -919,11 +974,11 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>File opened in read only mode.</source> - <translation type="unfinished"/> + <translation>Bestand geopend in lees-modus.</translation> </message> <message> <source>Open CSV file</source> - <translation type="unfinished"/> + <translation>Open CSV bestand</translation> </message> <message> <source>CSV file</source> @@ -1000,17 +1055,27 @@ Opslaan?</translation> <message> <source>Can't lock the database as you are currently editing it. Please press cancel to finish your changes or discard them.</source> - <translation>Kan de database niet vergrendelen omdat u deze momenteel aan het bewerken bent. -Druk op annuleren om uw wijzigingen aan te passen of gooi de wijzigingen weg.</translation> + <translation>Kan de database niet vergrendelen omdat je deze momenteel aan het bewerken bent. +Druk op annuleren om je wijzigingen aan te passen of gooi de wijzigingen weg.</translation> </message> <message> <source>This database has been modified. Do you want to save the database before locking it? Otherwise your changes are lost.</source> <translation>Deze database is gewijzigd. -Wilt u de database opslaan voordat u deze vergrendelt? +Wil je de database opslaan voordat je deze vergrendelt? Zo nee, dan gaan de wijzigingen verloren.</translation> </message> + <message> + <source>Disable safe saves?</source> + <translation>Veilig opslaan uitschakelen?</translation> + </message> + <message> + <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</source> + <translation>KeePassXC heeft meerdere keren geprobeerd de database op te slaan. Dit wordt waarschijnlijk veroorzaakt door een lock op het op te slaan bestand door een bestanden-sync-service. +Uitschakelen van veilig opslaan en opnieuw proberen?</translation> + </message> </context> <context> <name>DatabaseWidget</name> @@ -1024,11 +1089,11 @@ Zo nee, dan gaan de wijzigingen verloren.</translation> </message> <message> <source>Delete entry?</source> - <translation>Element verwijderen?</translation> + <translation>Item verwijderen?</translation> </message> <message> <source>Do you really want to delete the entry "%1" for good?</source> - <translation>Weet u zeker dat u het element "%1" wilt verwijderen?</translation> + <translation>Weet je zeker dat je het item "%1" wil verwijderen?</translation> </message> <message> <source>Delete entries?</source> @@ -1036,15 +1101,15 @@ Zo nee, dan gaan de wijzigingen verloren.</translation> </message> <message> <source>Do you really want to delete %1 entries for good?</source> - <translation>Weet u zeker dat u %1 elementen wilt wissen?</translation> + <translation>Weet je zeker dat je %1 elementen wil wissen?</translation> </message> <message> <source>Move entry to recycle bin?</source> - <translation>Wilt u het item naar de prullenbak verplaatsen?</translation> + <translation>Wilt je het item naar de prullenbak verplaatsen?</translation> </message> <message> <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation>Weet u zeker dat u item "%1" naar de prullenbak wilt verplaatsen?</translation> + <translation>Weet je zeker dat je item "%1" naar de prullenbak wil verplaatsen?</translation> </message> <message> <source>Move entries to recycle bin?</source> @@ -1052,7 +1117,7 @@ Zo nee, dan gaan de wijzigingen verloren.</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Wil je echt %n item(s) naar de Prullenbak verplaatsen?</numerusform><numerusform>Wil je echt %n item(s) naar de Prullenbak verplaatsen?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1060,7 +1125,7 @@ Zo nee, dan gaan de wijzigingen verloren.</translation> </message> <message> <source>Do you really want to execute the following command?<br><br>%1<br></source> - <translation>Weet u zeker dat u het volgende commando wilt uitvoeren? <br><br>%1<br></translation> + <translation>Weet je zeker dat je het volgende commando wil uitvoeren? <br><br>%1<br></translation> </message> <message> <source>Remember my choice</source> @@ -1072,7 +1137,7 @@ Zo nee, dan gaan de wijzigingen verloren.</translation> </message> <message> <source>Do you really want to delete the group "%1" for good?</source> - <translation>Weet u zeker dat u de groep "%1" wilt verwijderen?</translation> + <translation>Weet je zeker dat je de groep "%1" wil verwijderen?</translation> </message> <message> <source>Unable to calculate master key</source> @@ -1096,11 +1161,11 @@ Zo nee, dan gaan de wijzigingen verloren.</translation> </message> <message> <source>File has changed</source> - <translation type="unfinished"/> + <translation>Bestand is gewijzigd</translation> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> - <translation>Het database-bestand is gewijzigd. Wilt u de wijzigingen laden?</translation> + <translation>Het database-bestand is gewijzigd. Wil je de wijzigingen laden?</translation> </message> <message> <source>Merge Request</source> @@ -1109,7 +1174,8 @@ Zo nee, dan gaan de wijzigingen verloren.</translation> <message> <source>The database file has changed and you have unsaved changes. Do you want to merge your changes?</source> - <translation type="unfinished"/> + <translation>Het databasebestand is veranderd en er zijn niet opgeslagen wijzigingen. +Wil je de wijzigingen samenvoegen?</translation> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -1117,10 +1183,14 @@ Do you want to merge your changes?</source> </message> <message> <source>Empty recycle bin?</source> - <translation type="unfinished"/> + <translation>Prullenbak legen?</translation> </message> <message> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> + <translation>Weet je zeker dat je alles uit de prullenbak definitief wil verwijderen?</translation> + </message> + <message> + <source>Entry updated successfully.</source> <translation type="unfinished"/> </message> </context> @@ -1128,7 +1198,7 @@ Do you want to merge your changes?</source> <name>DetailsWidget</name> <message> <source>Generate TOTP Token</source> - <translation type="unfinished"/> + <translation>TOTP Token genereren</translation> </message> <message> <source>Close</source> @@ -1148,7 +1218,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Expiration</source> - <translation type="unfinished"/> + <translation>Vervaldatum</translation> </message> <message> <source>Username</source> @@ -1156,15 +1226,15 @@ Do you want to merge your changes?</source> </message> <message> <source>Autotype</source> - <translation type="unfinished"/> + <translation>Auto-typen</translation> </message> <message> <source>Searching</source> - <translation type="unfinished"/> + <translation>Zoeken</translation> </message> <message> <source>Attributes</source> - <translation type="unfinished"/> + <translation>Eigenschappen</translation> </message> <message> <source>Attachments</source> @@ -1192,26 +1262,26 @@ Do you want to merge your changes?</source> </message> <message> <source>Never</source> - <translation type="unfinished"/> + <translation>Nooit</translation> </message> <message> <source>[PROTECTED]</source> - <translation type="unfinished"/> + <translation>[BEVEILIGD]</translation> </message> <message> <source>Disabled</source> - <translation type="unfinished"/> + <translation>Uitgeschakeld</translation> </message> <message> <source>Enabled</source> - <translation type="unfinished"/> + <translation>Geactiveerd</translation> </message> </context> <context> <name>EditEntryWidget</name> <message> <source>Entry</source> - <translation>Element</translation> + <translation>Item</translation> </message> <message> <source>Advanced</source> @@ -1235,43 +1305,43 @@ Do you want to merge your changes?</source> </message> <message> <source>SSH Agent</source> - <translation type="unfinished"/> + <translation>SSH Agent</translation> </message> <message> <source>n/a</source> - <translation type="unfinished"/> + <translation>niet van toepassing</translation> </message> <message> <source>(encrypted)</source> - <translation type="unfinished"/> + <translation>(versleuteld)</translation> </message> <message> <source>Select private key</source> - <translation type="unfinished"/> + <translation>Kies persoonlijke sleutel</translation> </message> <message> <source>File too large to be a private key</source> - <translation type="unfinished"/> + <translation>Bestand te groot voor een persoonlijke sleutel</translation> </message> <message> <source>Failed to open private key</source> - <translation type="unfinished"/> + <translation>Niet gelukt het sleutelbestand in openen</translation> </message> <message> <source>Entry history</source> - <translation>Geschiedenis van element</translation> + <translation>Geschiedenis van item</translation> </message> <message> <source>Add entry</source> - <translation>Element toevoegen</translation> + <translation>Item toevoegen</translation> </message> <message> <source>Edit entry</source> - <translation>Element wijzigen</translation> + <translation>Item wijzigen</translation> </message> <message> <source>Different passwords supplied.</source> - <translation>U heeft verschillende wachtwoorden opgegeven.</translation> + <translation>Je hebt verschillende wachtwoorden opgegeven.</translation> </message> <message> <source>New attribute</source> @@ -1279,19 +1349,19 @@ Do you want to merge your changes?</source> </message> <message> <source>Confirm Remove</source> - <translation type="unfinished"/> + <translation>Bevestig verwijderen</translation> </message> <message> <source>Are you sure you want to remove this attribute?</source> - <translation type="unfinished"/> + <translation>Weet je zeker dat je deze eigenschap wil verwijderen?</translation> </message> <message> <source>[PROTECTED]</source> - <translation type="unfinished"/> + <translation>[BEVEILIGD]</translation> </message> <message> <source>Press reveal to view or edit</source> - <translation type="unfinished"/> + <translation>Druk Toon om te bekijken of bewerken</translation> </message> <message> <source>Tomorrow</source> @@ -1299,16 +1369,28 @@ Do you want to merge your changes?</source> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>1 week</numerusform><numerusform>%n weken</numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>1 maand</numerusform><numerusform>%n maanden</numerusform></translation> </message> <message> <source>1 year</source> <translation>1 jaar</translation> </message> + <message> + <source>Apply generated password?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to apply the generated password to this entry?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAdvanced</name> @@ -1326,38 +1408,46 @@ Do you want to merge your changes?</source> </message> <message> <source>Edit Name</source> - <translation type="unfinished"/> + <translation>Verander Naam</translation> </message> <message> <source>Protect</source> - <translation type="unfinished"/> + <translation>Beveilig</translation> </message> <message> <source>Reveal</source> - <translation type="unfinished"/> + <translation>Toon</translation> </message> <message> <source>Attachments</source> <translation>Bijlagen</translation> </message> + <message> + <source>Foreground Color:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Background Color:</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> <message> <source>Enable Auto-Type for this entry</source> - <translation>Auto-typen inschakelen voor dit element</translation> + <translation>Auto-typen activeren voor dit item</translation> </message> <message> <source>Inherit default Auto-Type sequence from the &group</source> - <translation>Erf standaard auto-typevolgorde van de &groep</translation> + <translation>Neem standaard Auto-typen volgorde over van de &groep</translation> </message> <message> <source>&Use custom Auto-Type sequence:</source> - <translation>&Gebruik aangepaste auto-typevolgorde:</translation> + <translation>&Gebruik aangepaste Auto-typen volgorde:</translation> </message> <message> <source>Window Associations</source> - <translation type="unfinished"/> + <translation>Scherm-koppelingen</translation> </message> <message> <source>+</source> @@ -1369,15 +1459,11 @@ Do you want to merge your changes?</source> </message> <message> <source>Window title:</source> - <translation>Venstertitel:</translation> + <translation>Vensternaam:</translation> </message> <message> - <source>Use default se&quence</source> - <translation>Gebruik standaardvolgorde</translation> - </message> - <message> - <source>Set custo&m sequence:</source> - <translation>Stel aangepaste volgorde in:</translation> + <source>Use a specific sequence for this association:</source> + <translation>Gebruik een specifieke volgorde voor deze associatie.</translation> </message> </context> <context> @@ -1415,7 +1501,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Title:</source> - <translation>Titel:</translation> + <translation>Naam:</translation> </message> <message> <source>Notes</source> @@ -1427,7 +1513,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Toggle the checkbox to reveal the notes section.</source> - <translation type="unfinished"/> + <translation>Vink het selectievakje aan om notities te zien.</translation> </message> <message> <source>Username:</source> @@ -1442,76 +1528,76 @@ Do you want to merge your changes?</source> <name>EditEntryWidgetSSHAgent</name> <message> <source>Form</source> - <translation type="unfinished"/> + <translation>Formulier</translation> </message> <message> <source>Remove key from agent after</source> - <translation type="unfinished"/> + <translation>Verwijder sleutel uit agent na</translation> </message> <message> <source> seconds</source> - <translation type="unfinished"/> + <translation>seconden</translation> </message> <message> <source>Fingerprint</source> - <translation type="unfinished"/> + <translation>Vingerafdruk</translation> </message> <message> <source>Remove key from agent when database is closed/locked</source> - <translation type="unfinished"/> + <translation>Verwijder sleutel uit agent wanneer de database wordt gesloten/vergrendeld</translation> </message> <message> <source>Public key</source> - <translation type="unfinished"/> + <translation>Openbare sleutel</translation> </message> <message> <source>Add key to agent when database is opened/unlocked</source> - <translation type="unfinished"/> + <translation>Voeg sleutel toe aan agent wanneer de database wordt geopend/ontgrendeld</translation> </message> <message> <source>Comment</source> - <translation type="unfinished"/> + <translation>Opmerking</translation> </message> <message> <source>Decrypt</source> - <translation type="unfinished"/> + <translation>Decoderen</translation> </message> <message> <source>n/a</source> - <translation type="unfinished"/> + <translation>niet van toepassing</translation> </message> <message> <source>Copy to clipboard</source> - <translation type="unfinished"/> + <translation>Kopieer naar klembord</translation> </message> <message> <source>Private key</source> - <translation type="unfinished"/> + <translation>Persoonlijke sleutel</translation> </message> <message> <source>External file</source> - <translation type="unfinished"/> + <translation>Extern bestand</translation> </message> <message> <source>Browse...</source> <extracomment>Button for opening file dialog</extracomment> - <translation type="unfinished"/> + <translation>Bladeren...</translation> </message> <message> <source>Attachment</source> - <translation type="unfinished"/> + <translation>Bijlage</translation> </message> <message> <source>Add to agent</source> - <translation type="unfinished"/> + <translation>Voeg toe aan agent</translation> </message> <message> <source>Remove from agent</source> - <translation type="unfinished"/> + <translation>Verwijder van agent</translation> </message> <message> <source>Require user confirmation when this key is used</source> - <translation type="unfinished"/> + <translation>Vereis bevestiging van de gebruiker wanneer deze sleutel wordt gebruikt</translation> </message> </context> <context> @@ -1538,7 +1624,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Enable</source> - <translation>Inschakelen</translation> + <translation>Activeren</translation> </message> <message> <source>Disable</source> @@ -1569,15 +1655,15 @@ Do you want to merge your changes?</source> </message> <message> <source>Auto-Type</source> - <translation>Auto-typen - KeePassX</translation> + <translation>Auto-typen</translation> </message> <message> <source>&Use default Auto-Type sequence of parent group</source> - <translation type="unfinished"/> + <translation>&Gebruik de standaard Auto-typen volgorde van de bovenliggende groep</translation> </message> <message> <source>Set default Auto-Type se&quence</source> - <translation type="unfinished"/> + <translation>Stel de standaard Auto-Typen volgord&e in</translation> </message> </context> <context> @@ -1608,7 +1694,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation type="unfinished"/> + <translation>Tip: Je kunt Google gebruiken als alternatief via Tools>Instellingen>Beveiliging</translation> </message> <message> <source>Images</source> @@ -1628,15 +1714,15 @@ Do you want to merge your changes?</source> </message> <message> <source>Custom icon already exists</source> - <translation type="unfinished"/> + <translation>Icoon bestaat al</translation> </message> <message> <source>Confirm Delete</source> - <translation type="unfinished"/> + <translation>Bevestig Verwijder</translation> </message> <message> <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> - <translation type="unfinished"/> + <translation>Dit icoon wordt gebruikt door %1 entries en zal worden vervangen door de standaard icoon. Weet je zeker dat je het wil verwijderen?</translation> </message> </context> <context> @@ -1657,6 +1743,31 @@ Do you want to merge your changes?</source> <source>Uuid:</source> <translation>Uuid:</translation> </message> + <message> + <source>Plugin Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove</source> + <translation>Verwijderen</translation> + </message> + <message> + <source>Delete plugin data?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Value</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Entry</name> @@ -1674,14 +1785,14 @@ Do you want to merge your changes?</source> </message> <message> <source>Size</source> - <translation type="unfinished"/> + <translation>Grootte</translation> </message> </context> <context> <name>EntryAttachmentsWidget</name> <message> <source>Form</source> - <translation type="unfinished"/> + <translation>Formulier</translation> </message> <message> <source>Add</source> @@ -1701,52 +1812,57 @@ Do you want to merge your changes?</source> </message> <message> <source>Select files</source> - <translation type="unfinished"/> + <translation>Kies bestanden</translation> </message> <message numerus="yes"> <source>Are you sure you want to remove %n attachment(s)?</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Weet je zeker dat je de bijlage wilt verwijderen?</numerusform><numerusform>Weet je zeker dat je %n bijlagen wil verwijderen?</numerusform></translation> </message> <message> <source>Confirm Remove</source> - <translation type="unfinished"/> + <translation>Bevestig verwijderen</translation> </message> <message> <source>Save attachments</source> - <translation type="unfinished"/> + <translation>Bijlagen opslaan</translation> </message> <message> <source>Unable to create directory: %1</source> - <translation type="unfinished"/> + <translation>Map maken is niet gelukt: +%1</translation> </message> <message> <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> - <translation type="unfinished"/> + <translation>Weet je zeker dat je het bestaande bestand "%1" wil overschrijven met de bijlage?</translation> </message> <message> <source>Confirm overwrite</source> - <translation type="unfinished"/> + <translation>Overschrijven bevestigen</translation> </message> <message> <source>Unable to save attachments: %1</source> - <translation type="unfinished"/> + <translation>Opslaan van bijlagen is niet gelukt: +%1</translation> </message> <message> <source>Unable to open attachment: %1</source> - <translation type="unfinished"/> + <translation>Openen van bijlage is niet gelukt: +%1</translation> </message> <message> <source>Unable to open attachments: %1</source> - <translation type="unfinished"/> + <translation>Openen van bijlagen is niet gelukt: +%1</translation> </message> <message> <source>Unable to open files: %1</source> - <translation type="unfinished"/> + <translation>Openen van bestanden is niet gelukt: +%1</translation> </message> </context> <context> @@ -1764,7 +1880,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Title</source> - <translation>Titel</translation> + <translation>Naam</translation> </message> <message> <source>Username</source> @@ -1780,7 +1896,7 @@ Do you want to merge your changes?</source> <message> <source>Ref: </source> <comment>Reference abbreviation</comment> - <translation type="unfinished"/> + <translation>Ref:</translation> </message> <message> <source>Group</source> @@ -1788,7 +1904,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Title</source> - <translation>Titel</translation> + <translation>Naam</translation> </message> <message> <source>Username</source> @@ -1798,6 +1914,65 @@ Do you want to merge your changes?</source> <source>URL</source> <translation>URL</translation> </message> + <message> + <source>Never</source> + <translation>Nooit</translation> + </message> + <message> + <source>Password</source> + <translation>Wachtwoord</translation> + </message> + <message> + <source>Notes</source> + <translation>Opmerkingen</translation> + </message> + <message> + <source>Expires</source> + <translation>Verloopt</translation> + </message> + <message> + <source>Created</source> + <translation>Aangemaakt</translation> + </message> + <message> + <source>Modified</source> + <translation>Gewijzigd</translation> + </message> + <message> + <source>Accessed</source> + <translation>Gezien</translation> + </message> + <message> + <source>Attachments</source> + <translation>Bijlagen</translation> + </message> +</context> +<context> + <name>EntryView</name> + <message> + <source>Customize View</source> + <translation>Weergave aanpassen</translation> + </message> + <message> + <source>Hide Usernames</source> + <translation>Gebruikersnamen verbergen</translation> + </message> + <message> + <source>Hide Passwords</source> + <translation>Wachtwoorden verbergen</translation> + </message> + <message> + <source>Fit to window</source> + <translation>Aanpassen aan venster</translation> + </message> + <message> + <source>Fit to contents</source> + <translation>Aanpassen aan inhoud</translation> + </message> + <message> + <source>Reset to defaults</source> + <translation>Terugzetten op standaardwaarden</translation> + </message> </context> <context> <name>Group</name> @@ -1810,11 +1985,11 @@ Do you want to merge your changes?</source> <name>HostInstaller</name> <message> <source>KeePassXC: Cannot save file!</source> - <translation type="unfinished"/> + <translation>KeePassXC: Kan bestand niet opslaan!</translation> </message> <message> <source>Cannot save the native messaging script file.</source> - <translation type="unfinished"/> + <translation>Kan het native messaging scriptbestand niet opslaan.</translation> </message> </context> <context> @@ -1867,16 +2042,20 @@ Do you want to merge your changes?</source> <source>Ensure that the password contains characters from every group</source> <translation>Zorg ervoor dat het wachtwoord tekens uit iedere groep bevat</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>Uitgebreide ASCII</translation> + </message> </context> <context> <name>KMessageWidget</name> <message> <source>&Close</source> - <translation type="unfinished"/> + <translation>&Sluiten</translation> </message> <message> <source>Close message</source> - <translation type="unfinished"/> + <translation>Sluit bericht</translation> </message> </context> <context> @@ -1887,7 +2066,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Unable to issue challenge-response.</source> - <translation type="unfinished"/> + <translation>Challenge-response uitgeven niet mogelijk</translation> </message> <message> <source>Wrong key or database file is corrupt.</source> @@ -1898,7 +2077,7 @@ Do you want to merge your changes?</source> <name>Kdbx3Writer</name> <message> <source>Unable to issue challenge-response.</source> - <translation type="unfinished"/> + <translation>Challenge-response uitgeven niet mogelijk</translation> </message> <message> <source>Unable to calculate master key</source> @@ -1909,7 +2088,7 @@ Do you want to merge your changes?</source> <name>Kdbx4Reader</name> <message> <source>missing database headers</source> - <translation type="unfinished"/> + <translation>ontbrekende database headers</translation> </message> <message> <source>Unable to calculate master key</source> @@ -1917,127 +2096,127 @@ Do you want to merge your changes?</source> </message> <message> <source>Invalid header checksum size</source> - <translation type="unfinished"/> + <translation>Niet geldige grootte van header controlecijfer</translation> </message> <message> <source>Header SHA256 mismatch</source> - <translation type="unfinished"/> + <translation>Header SHA256 mismatch</translation> </message> <message> <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> - <translation type="unfinished"/> + <translation>Verkeerde sleutel of database bestand is beschadigd. (HMAC mismatch)</translation> </message> <message> <source>Unknown cipher</source> - <translation type="unfinished"/> + <translation>Onbekend versleutel algoritme</translation> </message> <message> <source>Invalid header id size</source> - <translation type="unfinished"/> + <translation>Niet geldige grootte van header id</translation> </message> <message> <source>Invalid header field length</source> - <translation type="unfinished"/> + <translation>Niet geldige lengte van header veld</translation> </message> <message> <source>Invalid header data length</source> - <translation type="unfinished"/> + <translation>Niet geldige lengte van header data</translation> </message> <message> <source>Failed to open buffer for KDF parameters in header</source> - <translation type="unfinished"/> + <translation>Fout bij het openen van de buffer voor KDF parameters in header</translation> </message> <message> <source>Unsupported key derivation function (KDF) or invalid parameters</source> - <translation type="unfinished"/> + <translation>Niet-ondersteunde key derivation function (KDF) of ongeldige parameters</translation> </message> <message> <source>Legacy header fields found in KDBX4 file.</source> - <translation type="unfinished"/> + <translation>Verouderde header velden gevonden in KDBX4 bestand.</translation> </message> <message> <source>Invalid inner header id size</source> - <translation type="unfinished"/> + <translation>Niet geldige grootte van inner header id</translation> </message> <message> <source>Invalid inner header field length</source> - <translation type="unfinished"/> + <translation>Niet geldige lengte van inner header veld</translation> </message> <message> <source>Invalid inner header binary size</source> - <translation type="unfinished"/> + <translation>Niet geldige binaire grootte van inner header</translation> </message> <message> <source>Unsupported KeePass variant map version.</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Niet-ondersteunde versie van KeePass variant map.</translation> </message> <message> <source>Invalid variant map entry name length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Niet geldige lengte van de variant map entry</translation> </message> <message> <source>Invalid variant map entry name data</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Niet geldige data in de variant map entry name</translation> </message> <message> <source>Invalid variant map entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Niet geldige lengte van de variant map waarde</translation> </message> <message> <source>Invalid variant map entry value data</source> <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Niet geldige data in de variant map waarde</translation> </message> <message> <source>Invalid variant map Bool entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Niet geldige lengte van een variant map Bool waarde</translation> </message> <message> <source>Invalid variant map Int32 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Niet geldige lengte van een variant map Int32 waarde</translation> </message> <message> <source>Invalid variant map UInt32 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Niet geldige lengte van een variant map UInt32 waarde</translation> </message> <message> <source>Invalid variant map Int64 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Niet geldige lengte van een variant map Int64 waarde</translation> </message> <message> <source>Invalid variant map UInt64 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Niet geldige lengte van een variant map UInt64 waarde</translation> </message> <message> <source>Invalid variant map entry type</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Niet geldige item type in variant map</translation> </message> <message> <source>Invalid variant map field type size</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Niet geldige grootte van variant map veld type</translation> </message> </context> <context> <name>Kdbx4Writer</name> <message> <source>Invalid symmetric cipher algorithm.</source> - <translation type="unfinished"/> + <translation>Niet geldige symmetrisch versleutel algoritme.</translation> </message> <message> <source>Invalid symmetric cipher IV size.</source> <comment>IV = Initialization Vector for symmetric cipher</comment> - <translation type="unfinished"/> + <translation>Niet geldig grootte IV van symmetrisch versleutel algoritme.</translation> </message> <message> <source>Unable to calculate master key</source> @@ -2046,50 +2225,50 @@ Do you want to merge your changes?</source> <message> <source>Failed to serialize KDF parameters variant map</source> <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Fout bij het serialisatie van KDF parameters variant map</translation> </message> </context> <context> <name>KdbxReader</name> <message> <source>Invalid cipher uuid length</source> - <translation type="unfinished"/> + <translation>Niet geldige lengte versleutel uuid</translation> </message> <message> <source>Unsupported cipher</source> - <translation type="unfinished"/> + <translation>Niet ondersteund versleutel algoritme</translation> </message> <message> <source>Invalid compression flags length</source> - <translation type="unfinished"/> + <translation>Niet geldige lengte van compressie opties</translation> </message> <message> <source>Unsupported compression algorithm</source> - <translation type="unfinished"/> + <translation>Niet ondersteund compressie-algoritme</translation> </message> <message> <source>Invalid master seed size</source> - <translation type="unfinished"/> + <translation>Niet geldige grootte van master seed</translation> </message> <message> <source>Invalid transform seed size</source> - <translation type="unfinished"/> + <translation>Niet geldige grootte van transform seed</translation> </message> <message> <source>Invalid transform rounds size</source> - <translation type="unfinished"/> + <translation>Niet geldige aantal transformatie rondes</translation> </message> <message> <source>Invalid start bytes size</source> - <translation type="unfinished"/> + <translation>Niet geldige grootte van start bytes</translation> </message> <message> <source>Invalid random stream id size</source> - <translation type="unfinished"/> + <translation>Niet geldige grootte van random stream id</translation> </message> <message> <source>Invalid inner random stream cipher</source> - <translation type="unfinished"/> + <translation>Niet geldig inner-random-stream versleutel algoritme</translation> </message> <message> <source>Not a KeePass database.</source> @@ -2100,135 +2279,138 @@ Do you want to merge your changes?</source> You can import it by clicking on Database > 'Import KeePass 1 database...'. This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> - <translation type="unfinished"/> + <translation>He gekozen bestand is een oude KeePass 1 database (.kdb) + +Je kunt het importeren door te klikken op Database>'KeePass 1 database importeren'. +Deze actie is niet omkeerbaar. Je kunt de geïmporteerde database niet meer openen met de oude KeePassX 0.4 versie.</translation> </message> <message> <source>Unsupported KeePass 2 database version.</source> - <translation type="unfinished"/> + <translation>Niet-ondersteunde KeePass 2 databaseversie.</translation> </message> </context> <context> <name>KdbxXmlReader</name> <message> <source>XML parsing failure: %1</source> - <translation type="unfinished"/> + <translation>XML parsing fout: %1</translation> </message> <message> <source>No root group</source> - <translation type="unfinished"/> + <translation>Geen hoofdgroep</translation> </message> <message> <source>Missing icon uuid or data</source> - <translation type="unfinished"/> + <translation>Ontbrekend icoon uuid of data</translation> </message> <message> <source>Missing custom data key or value</source> - <translation type="unfinished"/> + <translation>Ontbrekende custom data sleutel of waarde</translation> </message> <message> <source>Multiple group elements</source> - <translation type="unfinished"/> + <translation>Meerdere groepselementen</translation> </message> <message> <source>Null group uuid</source> - <translation type="unfinished"/> + <translation>Null groep uuid</translation> </message> <message> <source>Invalid group icon number</source> - <translation type="unfinished"/> + <translation>Niet geldig groep icon nummer</translation> </message> <message> <source>Invalid EnableAutoType value</source> - <translation type="unfinished"/> + <translation>Niet geldige EnableAutoType waarde</translation> </message> <message> <source>Invalid EnableSearching value</source> - <translation type="unfinished"/> + <translation>Niet geldige EnableSearching waarde</translation> </message> <message> <source>No group uuid found</source> - <translation type="unfinished"/> + <translation>Geen groep uuid gevonden</translation> </message> <message> <source>Null DeleteObject uuid</source> - <translation type="unfinished"/> + <translation>Null DeleteObject uuid</translation> </message> <message> <source>Missing DeletedObject uuid or time</source> - <translation type="unfinished"/> + <translation>Ontbrekende DeletedObject uuid of tijd</translation> </message> <message> <source>Null entry uuid</source> - <translation type="unfinished"/> + <translation>Null item uuid</translation> </message> <message> <source>Invalid entry icon number</source> - <translation type="unfinished"/> + <translation>Niet geldig icoon item nummer</translation> </message> <message> <source>History element in history entry</source> - <translation type="unfinished"/> + <translation>Geschiedenis element in geschiedenis item</translation> </message> <message> <source>No entry uuid found</source> - <translation type="unfinished"/> + <translation>Geen item uuid gevonden</translation> </message> <message> <source>History element with different uuid</source> - <translation type="unfinished"/> + <translation>Geschiedenis element met ander uuid</translation> </message> <message> <source>Unable to decrypt entry string</source> - <translation type="unfinished"/> + <translation>Het is niet gelukt om de tekst te ontcijferen</translation> </message> <message> <source>Duplicate custom attribute found</source> - <translation type="unfinished"/> + <translation>Dubbel aangepaste eigenschap gevonden</translation> </message> <message> <source>Entry string key or value missing</source> - <translation type="unfinished"/> + <translation>Item string sleutel of waarde ontbreekt</translation> </message> <message> <source>Duplicate attachment found</source> - <translation type="unfinished"/> + <translation>Duplicaat bijlage gevonden</translation> </message> <message> <source>Entry binary key or value missing</source> - <translation type="unfinished"/> + <translation>Item binaire sleutel of waarde ontbreekt</translation> </message> <message> <source>Auto-type association window or sequence missing</source> - <translation type="unfinished"/> + <translation>Auto-typen koppeling venster of sequence ontbreekt</translation> </message> <message> <source>Invalid bool value</source> - <translation type="unfinished"/> + <translation>Niet geldige bool waarde</translation> </message> <message> <source>Invalid date time value</source> - <translation type="unfinished"/> + <translation>Niet geldige datum-tijdwaarde</translation> </message> <message> <source>Invalid color value</source> - <translation type="unfinished"/> + <translation>Niet geldige kleurwaarde</translation> </message> <message> <source>Invalid color rgb part</source> - <translation type="unfinished"/> + <translation>Niet geldige kleur in rgb deel</translation> </message> <message> <source>Invalid number value</source> - <translation type="unfinished"/> + <translation>Niet geldig getal</translation> </message> <message> <source>Invalid uuid value</source> - <translation type="unfinished"/> + <translation>Niet geldige uuid-waarde</translation> </message> <message> <source>Unable to decompress binary</source> <extracomment>Translator meant is a binary data inside an entry</extracomment> - <translation type="unfinished"/> + <translation>Het is niet gelukt om de binary uit te pakken</translation> </message> </context> <context> @@ -2263,31 +2445,31 @@ This is a one-way migration. You won't be able to open the imported databas <message> <source>Unable to read encryption IV</source> <comment>IV = Initialization Vector for symmetric cipher</comment> - <translation type="unfinished"/> + <translation>Initialization Vector kon niet gelezen worden</translation> </message> <message> <source>Invalid number of groups</source> - <translation type="unfinished"/> + <translation>Niet geldig aantal groepen</translation> </message> <message> <source>Invalid number of entries</source> - <translation type="unfinished"/> + <translation>Niet geldig aantal items</translation> </message> <message> <source>Invalid content hash size</source> - <translation type="unfinished"/> + <translation>Niet geldige grootte van inhoud-hash</translation> </message> <message> <source>Invalid transform seed size</source> - <translation type="unfinished"/> + <translation>Niet geldige grootte van transform seed</translation> </message> <message> <source>Invalid number of transform rounds</source> - <translation type="unfinished"/> + <translation>Niet geldig aantal transformatie rondes</translation> </message> <message> <source>Unable to construct group tree</source> - <translation type="unfinished"/> + <translation>Opbouwen van de groepsboom is niet gelukt</translation> </message> <message> <source>Root</source> @@ -2303,110 +2485,110 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Key transformation failed</source> - <translation type="unfinished"/> + <translation>Sleutel transformatie is mislukt</translation> </message> <message> <source>Invalid group field type number</source> - <translation type="unfinished"/> + <translation>Niet geldig groep veld typenummer</translation> </message> <message> <source>Invalid group field size</source> - <translation type="unfinished"/> + <translation>Niet geldige grootte van groep veld</translation> </message> <message> <source>Read group field data doesn't match size</source> - <translation type="unfinished"/> + <translation>Groep veld data komt niet overeen met grootte</translation> </message> <message> <source>Incorrect group id field size</source> - <translation type="unfinished"/> + <translation>Onjuiste grootte van id veld</translation> </message> <message> <source>Incorrect group creation time field size</source> - <translation type="unfinished"/> + <translation>Onjuiste grootte van aanmaaktijd veld</translation> </message> <message> <source>Incorrect group modification time field size</source> - <translation type="unfinished"/> + <translation>Onjuiste grootte wijzigingstijd veld</translation> </message> <message> <source>Incorrect group access time field size</source> - <translation type="unfinished"/> + <translation>Onjuiste grootte toegangstijd veld</translation> </message> <message> <source>Incorrect group expiry time field size</source> - <translation type="unfinished"/> + <translation>Onjuiste grootte verloop-tijd veld</translation> </message> <message> <source>Incorrect group icon field size</source> - <translation type="unfinished"/> + <translation>Onjuiste grootte icoon veld</translation> </message> <message> <source>Incorrect group level field size</source> - <translation type="unfinished"/> + <translation>Onjuiste grootte van groepsniveau veld</translation> </message> <message> <source>Invalid group field type</source> - <translation type="unfinished"/> + <translation>Niet geldig groep veldtype</translation> </message> <message> <source>Missing group id or level</source> - <translation type="unfinished"/> + <translation>Ontbrekende groeps-id of niveau</translation> </message> <message> <source>Missing entry field type number</source> - <translation type="unfinished"/> + <translation>Ontbrekend item veld type nummer</translation> </message> <message> <source>Invalid entry field size</source> - <translation type="unfinished"/> + <translation>Niet geldige grootte van item veld</translation> </message> <message> <source>Read entry field data doesn't match size</source> - <translation type="unfinished"/> + <translation>Item veld data komt niet overeen met grootte</translation> </message> <message> <source>Invalid entry uuid field size</source> - <translation type="unfinished"/> + <translation>Niet geldige grootte van uuid veld</translation> </message> <message> <source>Invalid entry group id field size</source> - <translation type="unfinished"/> + <translation>Niet geldige grootte van groep id veld</translation> </message> <message> <source>Invalid entry icon field size</source> - <translation type="unfinished"/> + <translation>Niet geldige grootte van icoon veld</translation> </message> <message> <source>Invalid entry creation time field size</source> - <translation type="unfinished"/> + <translation>Niet geldige grootte van aanmaaktijd veld</translation> </message> <message> <source>Invalid entry modification time field size</source> - <translation type="unfinished"/> + <translation>Niet geldige grootte van wijzigingstijd veld</translation> </message> <message> <source>Invalid entry expiry time field size</source> - <translation type="unfinished"/> + <translation>Niet geldige grootte van verloop-tijd veld</translation> </message> <message> <source>Invalid entry field type</source> - <translation type="unfinished"/> + <translation>Niet geldig item veld type</translation> </message> </context> <context> <name>Main</name> <message> <source>Existing single-instance lock file is invalid. Launching new instance.</source> - <translation type="unfinished"/> + <translation>Het bestaande single-instance lockbestand is niet geldig. Een nieuwe instance wordt gestart.</translation> </message> <message> <source>The lock file could not be created. Single-instance mode disabled.</source> - <translation type="unfinished"/> + <translation>Het lockbestand kon niet worden aangemaakt. Single-instance mode uitgeschakeld.</translation> </message> <message> <source>Another instance of KeePassXC is already running.</source> - <translation type="unfinished"/> + <translation>Een andere instance van KeePassXC is reeds gestart.</translation> </message> <message> <source>Fatal error while testing the cryptographic functions.</source> @@ -2421,7 +2603,7 @@ This is a one-way migration. You won't be able to open the imported databas <name>MainWindow</name> <message> <source>&Database</source> - <translation type="unfinished"/> + <translation>&Database</translation> </message> <message> <source>&Recent databases</source> @@ -2429,11 +2611,11 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Import</source> - <translation type="unfinished"/> + <translation>Importeren</translation> </message> <message> <source>&Help</source> - <translation type="unfinished"/> + <translation>&Hulp</translation> </message> <message> <source>E&ntries</source> @@ -2445,7 +2627,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Time-based one-time password</source> - <translation type="unfinished"/> + <translation>Tijd gebaseerd eenmalig wachtwoord</translation> </message> <message> <source>&Groups</source> @@ -2453,7 +2635,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>&Tools</source> - <translation type="unfinished"/> + <translation>&Tools</translation> </message> <message> <source>&Quit</source> @@ -2465,7 +2647,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>&Open database...</source> - <translation type="unfinished"/> + <translation>&Open de database...</translation> </message> <message> <source>&Save database</source> @@ -2509,19 +2691,19 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Sa&ve database as...</source> - <translation type="unfinished"/> + <translation>Be&waar de database als...</translation> </message> <message> <source>Change &master key...</source> - <translation type="unfinished"/> + <translation>Wijzig het &master wachtwoord...</translation> </message> <message> <source>&Database settings</source> - <translation>&Database-instellingen</translation> + <translation>&Database instellingen</translation> </message> <message> <source>Database settings</source> - <translation>Database-instellingen</translation> + <translation>Database instellingen</translation> </message> <message> <source>&Clone entry</source> @@ -2557,7 +2739,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>&Perform Auto-Type</source> - <translation>&Voer auto-typen uit</translation> + <translation>&Voer Auto-typen uit</translation> </message> <message> <source>&Open URL</source> @@ -2569,11 +2751,11 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>&Title</source> - <translation>&Titel</translation> + <translation>&Naam</translation> </message> <message> <source>Copy title to clipboard</source> - <translation type="unfinished"/> + <translation>Kopieer naam naar klembord</translation> </message> <message> <source>&URL</source> @@ -2581,7 +2763,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Copy URL to clipboard</source> - <translation type="unfinished"/> + <translation>Kopieer URL naar klembord</translation> </message> <message> <source>&Notes</source> @@ -2589,51 +2771,51 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Copy notes to clipboard</source> - <translation type="unfinished"/> + <translation>Kopieer notities naar klembord</translation> </message> <message> <source>&Export to CSV file...</source> - <translation type="unfinished"/> + <translation>&Exporteer naar een CSVbestand...</translation> </message> <message> <source>Import KeePass 1 database...</source> - <translation type="unfinished"/> + <translation>Importeer een KeePass 1 database...</translation> </message> <message> <source>Import CSV file...</source> - <translation type="unfinished"/> + <translation>Importeer een CSV bestand...</translation> </message> <message> <source>Re&pair database...</source> - <translation type="unfinished"/> + <translation>Re&pareer de database...</translation> </message> <message> <source>Show TOTP</source> - <translation type="unfinished"/> + <translation>Laat het TOTP zien</translation> </message> <message> <source>Set up TOTP...</source> - <translation type="unfinished"/> + <translation>Stel TOTP in...</translation> </message> <message> <source>Copy &TOTP</source> - <translation type="unfinished"/> + <translation>Kopieer &TOTP</translation> </message> <message> <source>E&mpty recycle bin</source> - <translation type="unfinished"/> + <translation>Leeg prullenbak</translation> </message> <message> <source>Clear history</source> - <translation type="unfinished"/> + <translation>Wis de geschiedenis</translation> </message> <message> <source>Access error for config file %1</source> - <translation type="unfinished"/> + <translation>Geen toegang tot configuratiebestand %1</translation> </message> <message> <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> - <translation type="unfinished"/> + <translation><p>Het lijkt erop dat je KeePassHTTP voor integratie met de browser gebruikt. Deze functie is verouderd en zal worden verwijderd. <br>Schakel aub over naar KeePassXC-Browser! Voor hulp bij migratie, bezoek onze <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration"> migratiehandleiding</a> (waarschuwing %1 van 3).</p></translation> </message> <message> <source>read-only</source> @@ -2649,7 +2831,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Quit KeePassXC</source> - <translation type="unfinished"/> + <translation>Verlaat KeePassXC</translation> </message> <message> <source>KeePass 2 Database</source> @@ -2673,102 +2855,114 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Please touch the button on your YubiKey!</source> - <translation type="unfinished"/> + <translation>Raak de knop op de YubiKey aan!</translation> + </message> + <message> + <source>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</source> + <translation>WAARSCHUWING: Je gebruikt een niet stabiele versie van KeePassXC! +Er is een hoog risico op corruptie, beheer een back-up van jouw databases. +Deze versie is niet bedoeld voor productie doeleinden.</translation> </message> </context> <context> <name>OpenSSHKey</name> <message> <source>Invalid key file, expecting an OpenSSH key</source> - <translation type="unfinished"/> + <translation>Niet geldig sleutelbestand, er werd een OpenSSH sleutel verwacht</translation> </message> <message> <source>PEM boundary mismatch</source> - <translation type="unfinished"/> - </message> - <message> - <source>This is not an OpenSSH key, only modern keys are supported</source> - <translation type="unfinished"/> + <translation>PEM grens fout</translation> </message> <message> <source>Base64 decoding failed</source> - <translation type="unfinished"/> + <translation>Base64 decoderen mislukt</translation> </message> <message> <source>Key file way too small.</source> - <translation type="unfinished"/> + <translation>Sleutelbestand veel te klein.</translation> </message> <message> <source>Key file magic header id invalid</source> - <translation type="unfinished"/> + <translation>Niet geldig magic header-id in sleutelbestand</translation> </message> <message> <source>Found zero keys</source> - <translation type="unfinished"/> + <translation>Nul sleutels gevonden</translation> </message> <message> <source>Failed to read public key.</source> - <translation type="unfinished"/> + <translation>Lezen publieke sleutel mislukt.</translation> </message> <message> <source>Corrupted key file, reading private key failed</source> - <translation type="unfinished"/> + <translation>Corrupt sleutelbestand, lezen prive-sleutel mislukt</translation> </message> <message> <source>No private key payload to decrypt</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown cipher: </source> - <translation type="unfinished"/> + <translation>Geen inhoud prive-sleutel om te decoderen</translation> </message> <message> <source>Trying to run KDF without cipher</source> - <translation type="unfinished"/> + <translation>Probeer KDF te draaien zonder versleutel algoritme</translation> </message> <message> <source>Passphrase is required to decrypt this key</source> - <translation type="unfinished"/> + <translation>Wachtwoord(-zin) nodig om sleutel te ontcijferen</translation> </message> <message> <source>Key derivation failed, key file corrupted?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown KDF: </source> - <translation type="unfinished"/> + <translation>Extractie sleutel mislukt, sleutelbestand corrupt?</translation> </message> <message> <source>Decryption failed, wrong passphrase?</source> - <translation type="unfinished"/> + <translation>Ontsleutelen mislukt, verkeerd wachtwoord(-zin)?</translation> </message> <message> <source>Unexpected EOF while reading public key</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown key type: </source> - <translation type="unfinished"/> + <translation>Onverwacht bestandseinde publieke sleutel</translation> </message> <message> <source>Unexpected EOF while reading private key</source> - <translation type="unfinished"/> + <translation>Onverwacht bestandseinde privesleutel</translation> </message> <message> <source>Can't write public key as it is empty</source> - <translation type="unfinished"/> + <translation>Kan publieke sleutel niet opslaan: lege sleutel</translation> </message> <message> <source>Unexpected EOF when writing public key</source> - <translation type="unfinished"/> + <translation>Onverwacht bestandseinde bij schrijven publieke sleutel</translation> </message> <message> <source>Can't write private key as it is empty</source> - <translation type="unfinished"/> + <translation>Kan privesleutel niet opslaan: lege sleutel</translation> </message> <message> <source>Unexpected EOF when writing private key</source> - <translation type="unfinished"/> + <translation>Onverwacht bestandseinde bij schrijven privesleutel</translation> + </message> + <message> + <source>Unsupported key type: %1</source> + <translation>Sleutel type %1 is niet ondersteund.</translation> + </message> + <message> + <source>Unknown cipher: %1</source> + <translation>Onbekende cipher: %1</translation> + </message> + <message> + <source>Cipher IV is too short for MD5 kdf</source> + <translation>Codering IV is te kort voor MD5 sleutel te verkrijgen.</translation> + </message> + <message> + <source>Unknown KDF: %1</source> + <translation>Onbekende functie om sleutel te verkrijgen: %1</translation> + </message> + <message> + <source>Unknown key type: %1</source> + <translation>Sleutel type %1 is onbekend.</translation> </message> </context> <context> @@ -2779,11 +2973,11 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> - <translation type="unfinished"/> + <translation>Dit wordt vereist om toegang te krijgen tot jouw databases vanaf ChromeIPass of PassIFox</translation> </message> <message> <source>Enable KeePassHTTP server</source> - <translation type="unfinished"/> + <translation>Schakel de KeePassHTTP server in</translation> </message> <message> <source>General</source> @@ -2796,11 +2990,11 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation type="unfinished"/> + <translation>Geeft alleen de beste overeenkomsten weer voor een specifieke URL in plaats van alle invoer voor het hele domein.</translation> </message> <message> <source>&Return only best matching entries</source> - <translation type="unfinished"/> + <translation>Geef alleen de best ove&reenkomende invoer</translation> </message> <message> <source>Re&quest to unlock the database if it is locked</source> @@ -2808,11 +3002,11 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation type="unfinished"/> + <translation>Alleen invoer van hetzelfde schema (http://, https://, ftp://,...) worden gegeven.</translation> </message> <message> <source>&Match URL schemes</source> - <translation type="unfinished"/> + <translation>&vergelijk URL sche&ma's</translation> </message> <message> <source>Sort matching entries by &username</source> @@ -2820,7 +3014,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Sort &matching entries by title</source> - <translation>Sorteer &overeenkomende items op titel</translation> + <translation>Sorteer &overeenkomende items op naam</translation> </message> <message> <source>R&emove all shared encryption keys from active database</source> @@ -2848,7 +3042,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Only the selected database has to be connected with a client.</source> - <translation type="unfinished"/> + <translation>Alleen de geselecteerde database hoeft met een client verbonden te zijn.</translation> </message> <message> <source>Searc&h in all opened databases for matching entries</source> @@ -2860,7 +3054,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>&Return advanced string fields which start with "KPH: "</source> - <translation>&Geef geadvanceerde tekenreeks velden terug die met "KH: " beginnen.</translation> + <translation>Geef geadvanceerde teken&reeks velden die met "KH: " beginnen.</translation> </message> <message> <source>HTTP Port:</source> @@ -2876,11 +3070,11 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source><b>Warning:</b> The following options can be dangerous!</source> - <translation type="unfinished"/> + <translation><b>Waarschuwing:</b> De volgende opties kunnen gevaarlijk zijn!</translation> </message> <message> <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> - <translation type="unfinished"/> + <translation><p>KeePassHTTP is verouderd en zal worden verwijderd. <br>Schakel aub over naar KeePassXC-Browser! Voor hulp bij migratie, bezoek onze <a href="https://keepassxc.org/docs/keepassxc-browser-migration"> migratiehandleiding</a>.</p></translation> </message> <message> <source>Cannot bind to privileged ports</source> @@ -2938,7 +3132,7 @@ Standaardpoort 19455 wordt gebruikt.</translation> </message> <message> <source>Extended ASCII</source> - <translation type="unfinished"/> + <translation>Uitgebreide ASCII</translation> </message> <message> <source>Exclude look-alike characters</source> @@ -2954,19 +3148,19 @@ Standaardpoort 19455 wordt gebruikt.</translation> </message> <message> <source>Passphrase</source> - <translation type="unfinished"/> + <translation>Wachtwoord</translation> </message> <message> <source>Wordlist:</source> - <translation type="unfinished"/> + <translation>Woordenlijst</translation> </message> <message> <source>Word Count:</source> - <translation type="unfinished"/> + <translation>Getelde woorden:</translation> </message> <message> <source>Word Separator:</source> - <translation type="unfinished"/> + <translation>Woordscheiding:</translation> </message> <message> <source>Generate</source> @@ -2974,7 +3168,7 @@ Standaardpoort 19455 wordt gebruikt.</translation> </message> <message> <source>Copy</source> - <translation type="unfinished"/> + <translation>Kopiëren</translation> </message> <message> <source>Accept</source> @@ -3021,95 +3215,95 @@ Standaardpoort 19455 wordt gebruikt.</translation> <name>QObject</name> <message> <source>Database not opened</source> - <translation type="unfinished"/> + <translation>Database niet geopend</translation> </message> <message> <source>Database hash not available</source> - <translation type="unfinished"/> + <translation>Database controlecijfer is niet beschikbaar</translation> </message> <message> <source>Client public key not received</source> - <translation type="unfinished"/> + <translation>Openbare sleutel van de client niet ontvangen</translation> </message> <message> <source>Cannot decrypt message</source> - <translation type="unfinished"/> + <translation>Kan het bericht niet ontcijferen</translation> </message> <message> <source>Timeout or cannot connect to KeePassXC</source> - <translation type="unfinished"/> + <translation>Timeout of kan geen verbinding maken met KeePassXC</translation> </message> <message> <source>Action cancelled or denied</source> - <translation type="unfinished"/> + <translation>Actie geannuleerd of geweigerd</translation> </message> <message> <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> - <translation type="unfinished"/> + <translation>Kan bericht niet versleutelen of openbare sleutel niet gevonden. Is native messaging geactiveerd in KeePassXC?</translation> </message> <message> <source>KeePassXC association failed, try again</source> - <translation type="unfinished"/> + <translation>KeePassXC koppeling is mislukt, probeer het opnieuw</translation> </message> <message> <source>Key change was not successful</source> - <translation type="unfinished"/> + <translation>Sleuteluitwisseling is mislukt</translation> </message> <message> <source>Encryption key is not recognized</source> - <translation type="unfinished"/> + <translation>De coderingssleutel is niet herkend</translation> </message> <message> <source>No saved databases found</source> - <translation type="unfinished"/> + <translation>Geen opgeslagen databases gevonden</translation> </message> <message> <source>Incorrect action</source> - <translation type="unfinished"/> + <translation>Onjuiste actie</translation> </message> <message> <source>Empty message received</source> - <translation type="unfinished"/> + <translation>Leeg bericht ontvangen</translation> </message> <message> <source>No URL provided</source> - <translation type="unfinished"/> + <translation>Geen URL opgegeven</translation> </message> <message> <source>No logins found</source> - <translation type="unfinished"/> + <translation>Geen aanmeldingen gevonden</translation> </message> <message> <source>Unknown error</source> - <translation type="unfinished"/> + <translation>Onbekende fout</translation> </message> <message> <source>Add a new entry to a database.</source> - <translation type="unfinished"/> + <translation>Voeg een nieuw item toe aan een database.</translation> </message> <message> <source>Path of the database.</source> - <translation type="unfinished"/> + <translation>Pad naar de database.</translation> </message> <message> <source>Key file of the database.</source> - <translation type="unfinished"/> + <translation>Sleutelbestand van de database.</translation> </message> <message> <source>path</source> - <translation type="unfinished"/> + <translation>pad</translation> </message> <message> <source>Username for the entry.</source> - <translation type="unfinished"/> + <translation>Gebruikersnaam voor het item.</translation> </message> <message> <source>username</source> - <translation type="unfinished"/> + <translation>gebruikersnaam</translation> </message> <message> <source>URL for the entry.</source> - <translation type="unfinished"/> + <translation>URL voor het item.</translation> </message> <message> <source>URL</source> @@ -3117,195 +3311,201 @@ Standaardpoort 19455 wordt gebruikt.</translation> </message> <message> <source>Prompt for the entry's password.</source> - <translation type="unfinished"/> + <translation>Vraag voor het item's wachtwoord.</translation> </message> <message> <source>Generate a password for the entry.</source> - <translation type="unfinished"/> + <translation>Genereer een wachtwoord voor het item.</translation> </message> <message> <source>Length for the generated password.</source> - <translation type="unfinished"/> + <translation>Lengte van het gegenereerde wachtwoord.</translation> </message> <message> <source>length</source> - <translation type="unfinished"/> + <translation>lengte</translation> </message> <message> <source>Path of the entry to add.</source> - <translation type="unfinished"/> + <translation>Pad van toe te voegen item.</translation> </message> <message> <source>Copy an entry's password to the clipboard.</source> - <translation type="unfinished"/> + <translation>Kopieer een gebruikerswachtwoord naar het klembord.</translation> </message> <message> <source>Path of the entry to clip.</source> <comment>clip = copy to clipboard</comment> - <translation type="unfinished"/> + <translation>Pad van het vast te zetten item.</translation> </message> <message> <source>Timeout in seconds before clearing the clipboard.</source> - <translation type="unfinished"/> + <translation>Wachttijd (sec) voor het leegmaken klembord.</translation> </message> <message> <source>Edit an entry.</source> - <translation type="unfinished"/> + <translation>Een element bewerken.</translation> </message> <message> <source>Title for the entry.</source> - <translation type="unfinished"/> + <translation>Naam voor deze invoer.</translation> </message> <message> <source>title</source> - <translation type="unfinished"/> + <translation>naam</translation> </message> <message> <source>Path of the entry to edit.</source> - <translation type="unfinished"/> + <translation>Pad van het te wijzigen item.</translation> </message> <message> <source>Estimate the entropy of a password.</source> - <translation type="unfinished"/> + <translation>Schat de entropie van een wachtwoord.</translation> </message> <message> <source>Password for which to estimate the entropy.</source> - <translation type="unfinished"/> + <translation>Wachtwoord waarvoor de entropie geschat moet worden.</translation> </message> <message> <source>Perform advanced analysis on the password.</source> - <translation type="unfinished"/> + <translation>Doe geavanceerde analyse op het wachtwoord.</translation> </message> <message> <source>Extract and print the content of a database.</source> - <translation type="unfinished"/> + <translation>Extraheer en print de inhoud van de database.</translation> </message> <message> <source>Path of the database to extract.</source> - <translation type="unfinished"/> + <translation>Pad naar de te extraheren database.</translation> </message> <message> <source>Insert password to unlock %1: </source> - <translation type="unfinished"/> + <translation>Voor wachtwoord in voor ontsleutelen %1:</translation> </message> <message> <source>Failed to load key file %1 : %2</source> - <translation type="unfinished"/> + <translation>Laden sleutelbestand mislukt %1: %2</translation> </message> <message> <source>WARNING: You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>WAARSCHUWING: Je gebruikt een ouder sleutelbestandsformaat die in de toekomst mogelijk niet ondersteund zal worden. + +Overweeg aub een nieuw sleutelbestand te genereren.</translation> </message> <message> <source> Available commands: </source> - <translation type="unfinished"/> + <translation> + +Beschikbare instructies: +:</translation> </message> <message> <source>Name of the command to execute.</source> - <translation type="unfinished"/> + <translation>Naam van het uit te voeren commando.</translation> </message> <message> <source>List database entries.</source> - <translation type="unfinished"/> + <translation>Lijst van databaseinvoer.</translation> </message> <message> <source>Path of the group to list. Default is /</source> - <translation type="unfinished"/> + <translation>Pad naar de groepslijst. Standaard is /</translation> </message> <message> <source>Find entries quickly.</source> - <translation type="unfinished"/> + <translation>Zoek invoer snel.</translation> </message> <message> <source>Search term.</source> - <translation type="unfinished"/> + <translation>Zoekterm.</translation> </message> <message> <source>Merge two databases.</source> - <translation type="unfinished"/> + <translation>Voeg twee databases samen.</translation> </message> <message> <source>Path of the database to merge into.</source> - <translation type="unfinished"/> + <translation>Pad naar de samen te voegen doeldatabase.</translation> </message> <message> <source>Path of the database to merge from.</source> - <translation type="unfinished"/> + <translation>Pad naar de samen te voegen brondatabase.</translation> </message> <message> <source>Use the same credentials for both database files.</source> - <translation type="unfinished"/> + <translation>Gebruik dezelfde gegevens voor beide gegevensbestanden.</translation> </message> <message> <source>Key file of the database to merge from.</source> - <translation type="unfinished"/> + <translation>Sleutelbestand van gegevensbestand om samen te voegen.</translation> </message> <message> <source>Show an entry's information.</source> - <translation type="unfinished"/> + <translation>Toon de informatie die hoort bij een invoer.</translation> </message> <message> <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> - <translation type="unfinished"/> + <translation>Namen van de te tonen eigenschappen. Deze optie kan meer dan eens worden opgegeven, waarbij elke eigenschap op een regel wordt getoond in de opgegeven volgorde. Als er geen eigenschappen worden opgegeven, wordt een samenvatting van de standaardeigenschappen gegeven.</translation> </message> <message> <source>attribute</source> - <translation type="unfinished"/> + <translation>eigenschap</translation> </message> <message> <source>Name of the entry to show.</source> - <translation type="unfinished"/> + <translation>Naam van het item dat getoond moet worden.</translation> </message> <message> <source>NULL device</source> - <translation type="unfinished"/> + <translation>NULL apparaat</translation> </message> <message> <source>error reading from device</source> - <translation type="unfinished"/> + <translation>fout bij het lezen van apparaat</translation> </message> <message> <source>file empty ! </source> - <translation type="unfinished"/> + <translation>leeg bestand! +</translation> </message> <message> <source>malformed string</source> - <translation type="unfinished"/> + <translation>beschadigde tekst</translation> </message> <message> <source>missing closing quote</source> - <translation type="unfinished"/> + <translation>afsluitende aanhalingsteken ontbreekt</translation> </message> <message> <source>AES: 256-bit</source> - <translation type="unfinished"/> + <translation>AES: 256-bits</translation> </message> <message> <source>Twofish: 256-bit</source> - <translation type="unfinished"/> + <translation>Twofish: 256-bits</translation> </message> <message> <source>ChaCha20: 256-bit</source> - <translation type="unfinished"/> + <translation>ChaCha20: 256-bits</translation> </message> <message> <source>Argon2 (KDBX 4 – recommended)</source> - <translation type="unfinished"/> + <translation>Argon2 (KDBX 4 – aanbevolen)</translation> </message> <message> <source>AES-KDF (KDBX 4)</source> - <translation type="unfinished"/> + <translation>AES-KDF (KDBX 4)</translation> </message> <message> <source>AES-KDF (KDBX 3.1)</source> - <translation type="unfinished"/> + <translation>AES-KDF (KDBX 3.1)</translation> </message> <message> <source>Group</source> @@ -3313,7 +3513,7 @@ Available commands: </message> <message> <source>Title</source> - <translation>Titel</translation> + <translation>Naam</translation> </message> <message> <source>Username</source> @@ -3329,35 +3529,81 @@ Available commands: </message> <message> <source>Last Modified</source> - <translation type="unfinished"/> + <translation>Laatst bewerkt</translation> </message> <message> <source>Created</source> - <translation type="unfinished"/> + <translation>Aangemaakt</translation> </message> <message> <source>Legacy Browser Integration</source> - <translation type="unfinished"/> + <translation>Verouderde browser integratie</translation> </message> <message> <source>Browser Integration</source> - <translation type="unfinished"/> + <translation>Browserintegratie</translation> </message> <message> <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source> - <translation type="unfinished"/> + <translation>YubiKey[%1] Challenge Response - Slot %2 - %3</translation> </message> <message> <source>Press</source> - <translation type="unfinished"/> + <translation>Druk</translation> </message> <message> <source>Passive</source> - <translation type="unfinished"/> + <translation>Passief</translation> </message> <message> <source>SSH Agent</source> - <translation type="unfinished"/> + <translation>SSH Agent</translation> + </message> + <message> + <source>Generate a new random diceware passphrase.</source> + <translation>Genereer een nieuw willekeurig diceware wachtwoord zin</translation> + </message> + <message> + <source>Word count for the diceware passphrase.</source> + <translation>Aantal woorden voor de Diceware wachtzin.</translation> + </message> + <message> + <source>count</source> + <translation>hoeveelheid</translation> + </message> + <message> + <source>Wordlist for the diceware generator. +[Default: EFF English]</source> + <translation>Woordenlijst voor de Diceware generator. +[Standaard: EFF Engels]</translation> + </message> + <message> + <source>Generate a new random password.</source> + <translation>Genereer een willekeurig wachtwoord</translation> + </message> + <message> + <source>Length of the generated password.</source> + <translation>Lengte van het gegenereerde wachtwoord.</translation> + </message> + <message> + <source>Use lowercase characters in the generated password.</source> + <translation>Gebruik kleine letters in het gegenereerde wachtwoord</translation> + </message> + <message> + <source>Use uppercase characters in the generated password.</source> + <translation>Gebruik hoofdletters in het gegenereerde wachtwoord</translation> + </message> + <message> + <source>Use numbers in the generated password.</source> + <translation>Gebruik cijfers in het gegenereerde wachtwoord</translation> + </message> + <message> + <source>Use special characters in the generated password.</source> + <translation>Gebruik speciale karakters in het gegenereerde wachtwoord.</translation> + </message> + <message> + <source>Use extended ASCII in the generated password.</source> + <translation>Gebruik uitgebreide ASCII tekens in het gegenereerde wachtwoord.</translation> </message> </context> <context> @@ -3398,7 +3644,7 @@ Available commands: <name>SearchWidget</name> <message> <source>Search...</source> - <translation type="unfinished"/> + <translation>Zoek...</translation> </message> <message> <source>Search</source> @@ -3414,21 +3660,22 @@ Available commands: </message> <message> <source>Limit search to selected group</source> - <translation type="unfinished"/> + <translation>Beperk het zoeken tot de geselecteerde groep</translation> </message> </context> <context> <name>Service</name> <message> <source>KeePassXC: New key association request</source> - <translation>KeePassXC: Nieuw verzoek voor sleutel associatie</translation> + <translation>KeePassXC: Nieuw verzoek voor sleutel koppeling</translation> </message> <message> <source>You have received an association request for the above key. If you would like to allow it access to your KeePassXC database give it a unique name to identify and accept it.</source> - <translation>Je hebt verzoek voor sleutel associatie ontvangen voor de bovenstaande sleutel. -Geef het een unieke identificerende naam en accepteer de associate wanneer je deze toestaan voor toegang tot je KeePassXC database.</translation> + <translation>Je hebt een koppeling verzoek ontvangen voor bovenstaande sleutel. +Als je de sleutel toegang tot jouw KeePassXC database wil geven, +geef het dan een unieke naam ter identificatie, en accepteer het verzoek.</translation> </message> <message> <source>KeePassXC: Overwrite existing key?</source> @@ -3464,7 +3711,7 @@ Ontgrendel de geselecteerde database of kies een ontgrendelde database.</transla </message> <message numerus="yes"> <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Encryptie-sleutel verwijderd uit KeePassX/Http-instellingen.</numerusform><numerusform>%n encryptie-sleutels verwijderd uit KeePassX/Http-instellingen.</numerusform></translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -3496,7 +3743,7 @@ Ontgrendel de geselecteerde database of kies een ontgrendelde database.</transla </message> <message numerus="yes"> <source>Successfully removed permissions from %n entries.</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Permissies zijn verwijderd uit %n items.</numerusform><numerusform>Permissies zijn verwijderd uit %n items.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -3523,18 +3770,18 @@ Ontgrendel de geselecteerde database of kies een ontgrendelde database.</transla </message> <message> <source>Access error for config file %1</source> - <translation type="unfinished"/> + <translation>Geen toegang tot configuratiebestand %1</translation> </message> </context> <context> <name>SettingsWidgetGeneral</name> <message> <source>Basic Settings</source> - <translation type="unfinished"/> + <translation>Basale instellingen</translation> </message> <message> <source>Start only a single instance of KeePassXC</source> - <translation type="unfinished"/> + <translation>Start slechts een enkele instance van KeePassXC</translation> </message> <message> <source>Remember last databases</source> @@ -3542,7 +3789,7 @@ Ontgrendel de geselecteerde database of kies een ontgrendelde database.</transla </message> <message> <source>Remember last key files and security dongles</source> - <translation type="unfinished"/> + <translation>Onthou de laatste sleutelbestanden en beveiligingsdongles</translation> </message> <message> <source>Load previous databases on startup</source> @@ -3570,15 +3817,15 @@ Ontgrendel de geselecteerde database of kies een ontgrendelde database.</transla </message> <message> <source>Use group icon on entry creation</source> - <translation>Gebruik icoon van de groep voor nieuwe elementen</translation> + <translation>Gebruik icoon van de groep voor nieuwe items</translation> </message> <message> <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> - <translation type="unfinished"/> + <translation>Markeer de database niet als gewijzigd voor non-data wijzigingen (bijv. uitgebreide groepen)</translation> </message> <message> <source>Hide the Details view</source> - <translation type="unfinished"/> + <translation>Detail weergave verbergen</translation> </message> <message> <source>Show a system tray icon</source> @@ -3594,7 +3841,7 @@ Ontgrendel de geselecteerde database of kies een ontgrendelde database.</transla </message> <message> <source>Dark system tray icon</source> - <translation type="unfinished"/> + <translation>Donker systray icoon</translation> </message> <message> <source>Language</source> @@ -3602,39 +3849,63 @@ Ontgrendel de geselecteerde database of kies een ontgrendelde database.</transla </message> <message> <source>Auto-Type</source> - <translation>Auto-typen - KeePassX</translation> + <translation>Auto-typen</translation> </message> <message> <source>Use entry title to match windows for global Auto-Type</source> - <translation type="unfinished"/> + <translation>Laat vensternaam overeenkomen met item naam bij Auto-typen</translation> </message> <message> <source>Use entry URL to match windows for global Auto-Type</source> - <translation type="unfinished"/> + <translation>Laat URL overeenkomen met item URL bij Auto-typen</translation> </message> <message> <source>Always ask before performing Auto-Type</source> - <translation type="unfinished"/> + <translation>Vraag altijd voordat Auto-typen gebruikt wordt</translation> </message> <message> <source>Global Auto-Type shortcut</source> - <translation>Globale sneltoets voor auto-typen</translation> + <translation>Globale sneltoets voor Auto-typen</translation> </message> <message> <source>Auto-Type delay</source> - <translation type="unfinished"/> + <translation>Vertraging bij Auto-typen</translation> </message> <message> <source> ms</source> <comment>Milliseconds</comment> - <translation type="unfinished"/> + <translation>ms</translation> + </message> + <message> + <source>Startup</source> + <translation>Opstarten</translation> + </message> + <message> + <source>File Management</source> + <translation>Bestandsbeheer</translation> + </message> + <message> + <source>Safely save database files (may be incompatible with Dropbox, etc)</source> + <translation>Veilig opslaan van databasebestanden (kan incompatibel zijn met Dropbox en dergelijke)</translation> + </message> + <message> + <source>Backup database file before saving</source> + <translation>Back-up het databasebestand voor het opslaan</translation> + </message> + <message> + <source>Entry Management</source> + <translation>Item beheer</translation> + </message> + <message> + <source>General</source> + <translation>Algemeen</translation> </message> </context> <context> <name>SettingsWidgetSecurity</name> <message> <source>Timeouts</source> - <translation type="unfinished"/> + <translation>Timeouts</translation> </message> <message> <source>Clear clipboard after</source> @@ -3651,11 +3922,11 @@ Ontgrendel de geselecteerde database of kies een ontgrendelde database.</transla </message> <message> <source>Convenience</source> - <translation type="unfinished"/> + <translation>Gemak</translation> </message> <message> <source>Lock databases when session is locked or lid is closed</source> - <translation type="unfinished"/> + <translation>Vergrendel de database wanneer de sessie is vergrendeld of het deksel is gesloten</translation> </message> <message> <source>Lock databases after minimizing the window</source> @@ -3671,62 +3942,66 @@ Ontgrendel de geselecteerde database of kies een ontgrendelde database.</transla </message> <message> <source>Hide passwords in the preview panel</source> - <translation type="unfinished"/> + <translation>Verberg wachtwoorden in informatiepaneel.</translation> </message> <message> <source>Hide entry notes by default</source> - <translation type="unfinished"/> + <translation>Verberg aantekening standaard</translation> </message> <message> <source>Privacy</source> - <translation type="unfinished"/> + <translation>Privacy</translation> </message> <message> <source>Use Google as fallback for downloading website icons</source> - <translation type="unfinished"/> + <translation>Gebruik Google als alternatieve manier voor het downloaden van de websiteiconen</translation> + </message> + <message> + <source>Re-lock previously locked database after performing Auto-Type</source> + <translation>Vergrendel de hiervoor vergrendelde database opnieuw na Auto-Type.</translation> </message> </context> <context> <name>SetupTotpDialog</name> <message> <source>Setup TOTP</source> - <translation type="unfinished"/> + <translation>Stel TOTP in</translation> </message> <message> <source>Key:</source> - <translation type="unfinished"/> + <translation>Wachtwoord:</translation> </message> <message> <source>Default RFC 6238 token settings</source> - <translation type="unfinished"/> + <translation>Standaard RFC 6238 token instellingen</translation> </message> <message> <source>Steam token settings</source> - <translation type="unfinished"/> + <translation>"Steam token" instellingen</translation> </message> <message> <source>Use custom settings</source> - <translation type="unfinished"/> + <translation>Gebruik aangepaste instellingen</translation> </message> <message> <source>Note: Change these settings only if you know what you are doing.</source> - <translation type="unfinished"/> + <translation>Let op: wijzig deze instellingen alleen als je weet wat je doet.</translation> </message> <message> <source>Time step:</source> - <translation type="unfinished"/> + <translation>Tijdsinterval:</translation> </message> <message> <source>8 digits</source> - <translation type="unfinished"/> + <translation>8 digits</translation> </message> <message> <source>6 digits</source> - <translation type="unfinished"/> + <translation>6 digits</translation> </message> <message> <source>Code size:</source> - <translation type="unfinished"/> + <translation>Grootte van de code:</translation> </message> <message> <source> sec</source> @@ -3738,23 +4013,23 @@ Ontgrendel de geselecteerde database of kies een ontgrendelde database.</transla <name>TotpDialog</name> <message> <source>Timed Password</source> - <translation type="unfinished"/> + <translation>Getimed wachtwoord</translation> </message> <message> <source>000000</source> - <translation type="unfinished"/> + <translation>000000</translation> </message> <message> <source>Copy</source> - <translation type="unfinished"/> + <translation>Kopiëren</translation> </message> <message> <source>Expires in</source> - <translation type="unfinished"/> + <translation>Verloopt binnen</translation> </message> <message> <source>seconds</source> - <translation type="unfinished"/> + <translation>seconden</translation> </message> </context> <context> @@ -3766,48 +4041,48 @@ Ontgrendel de geselecteerde database of kies een ontgrendelde database.</transla </context> <context> <name>WelcomeWidget</name> - <message> - <source>Welcome to KeePassXC</source> - <translation type="unfinished"/> - </message> <message> <source>Start storing your passwords securely in a KeePassXC database</source> - <translation type="unfinished"/> + <translation>Begin met het opslaan van jouw wachtwoorden in een KeePassXC database</translation> </message> <message> <source>Create new database</source> - <translation type="unfinished"/> + <translation>Maak nieuwe database</translation> </message> <message> <source>Open existing database</source> - <translation type="unfinished"/> + <translation>Open bestaande database</translation> </message> <message> <source>Import from KeePass 1</source> - <translation type="unfinished"/> + <translation>Importeer Keepass 1-database</translation> </message> <message> <source>Import from CSV</source> - <translation type="unfinished"/> + <translation>Uit CSV-bestand importeren</translation> </message> <message> <source>Recent databases</source> <translation>Recente databases</translation> </message> + <message> + <source>Welcome to KeePassXC %1</source> + <translation>Welkom bij KeePassXC %1</translation> + </message> </context> <context> <name>main</name> <message> <source>Remove an entry from the database.</source> - <translation type="unfinished"/> + <translation>Verwijder een ingang uit het gegevensbestand.</translation> </message> <message> <source>Path of the database.</source> - <translation type="unfinished"/> + <translation>Pad naar de database.</translation> </message> <message> <source>Path of the entry to remove.</source> - <translation type="unfinished"/> + <translation>Pad van het te verwijderen item.</translation> </message> <message> <source>KeePassXC - cross-platform password manager</source> @@ -3831,7 +4106,7 @@ Ontgrendel de geselecteerde database of kies een ontgrendelde database.</transla </message> <message> <source>Parent window handle</source> - <translation type="unfinished"/> + <translation>Parent window handle</translation> </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_pl.ts b/share/translations/keepassx_pl.ts index 9abb6eb88..37919ae4a 100644 --- a/share/translations/keepassx_pl.ts +++ b/share/translations/keepassx_pl.ts @@ -17,10 +17,6 @@ <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> <translation>KeePassXC jest dystrybuowany zgodnie z warunkami licencji GNU General Public License (GPL) w wersji 2 lub (opcjonalnie) w wersji 3.</translation> </message> - <message> - <source>Project Maintainers:</source> - <translation>Opiekunowie projektu:</translation> - </message> <message> <source>Contributors</source> <translation>Współtwórcy</translation> @@ -71,6 +67,20 @@ Jądro: %3 %4</translation> <source>Enabled extensions:</source> <translation>Włączone rozszerzenia:</translation> </message> + <message> + <source>Project Maintainers:</source> + <translation>Opiekunowie projektu:</translation> + </message> + <message> + <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> + <translation>Specjalne podziękowania od zespołu KeePassXC dla debfx za stworzenie oryginalnego KeePassX.</translation> + </message> + <message> + <source>Build Type: %1 +</source> + <translation>Typ kompilacji: %1 +</translation> + </message> </context> <context> <name>AccessControlDialog</name> @@ -108,7 +118,7 @@ Wybierz, czy chcesz zezwolić na dostęp.</translation> <name>AutoType</name> <message> <source>Couldn't find an entry that matches the window title:</source> - <translation>Nie mogę znaleźć wpisu, który by pasował do tytułu okna: </translation> + <translation>Nie mogę znaleźć wpisu, który by pasował do tytułu okna:</translation> </message> <message> <source>Auto-Type - KeePassXC</source> @@ -120,19 +130,19 @@ Wybierz, czy chcesz zezwolić na dostęp.</translation> </message> <message> <source>The Syntax of your Auto-Type statement is incorrect!</source> - <translation type="unfinished"/> + <translation>Składnia instrukcji auto-uzupełniania jest niepoprawna!</translation> </message> <message> <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>Polecenie auto-uzupełniania zawiera bardzo długie opóźnienie. Czy chcesz kontynuować?</translation> </message> <message> <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>Polecenie auto-uzupełniania zawiera bardzo wolne wciśnięcia klawiszy. Czy chcesz kontynuować?</translation> </message> <message> <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>Polecenie auto-uzupełniania zawiera argumenty, które powtarzają się bardzo często. Czy chcesz kontynuować?</translation> </message> </context> <context> @@ -150,6 +160,25 @@ Wybierz, czy chcesz zezwolić na dostęp.</translation> <translation>Domyślna sekwencja</translation> </message> </context> +<context> + <name>AutoTypeMatchModel</name> + <message> + <source>Group</source> + <translation>Grupa</translation> + </message> + <message> + <source>Title</source> + <translation>Tytuł</translation> + </message> + <message> + <source>Username</source> + <translation>Użytkownik</translation> + </message> + <message> + <source>Sequence</source> + <translation>Sekwencja</translation> + </message> +</context> <context> <name>AutoTypeSelectDialog</name> <message> @@ -165,7 +194,7 @@ Wybierz, czy chcesz zezwolić na dostęp.</translation> <name>BrowserAccessControlDialog</name> <message> <source>KeePassXC-Browser Confirm Access</source> - <translation type="unfinished"/> + <translation>Potwierdź dostęp KeePassXC-Browser</translation> </message> <message> <source>Remember this decision</source> @@ -194,11 +223,11 @@ Wybierz, czy chcesz zezwolić na dostęp.</translation> </message> <message> <source>This is required for accessing your databases with KeePassXC-Browser</source> - <translation type="unfinished"/> + <translation>Wymagane jest to w celu uzyskania dostępu do baz danych za pomocą KeePassXC-Browser</translation> </message> <message> <source>Enable KeepassXC browser integration</source> - <translation type="unfinished"/> + <translation>Włącz integrację KeepassXC z przeglądarką</translation> </message> <message> <source>General</source> @@ -206,7 +235,7 @@ Wybierz, czy chcesz zezwolić na dostęp.</translation> </message> <message> <source>Enable integration for these browsers:</source> - <translation type="unfinished"/> + <translation>Włącz integrację z tymi przeglądarkami:</translation> </message> <message> <source>&Google Chrome</source> @@ -227,7 +256,7 @@ Wybierz, czy chcesz zezwolić na dostęp.</translation> <message> <source>Show a &notification when credentials are requested</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>P&okaż powiadomienie, gdy wymagane są poświadczenia</translation> </message> <message> <source>Re&quest to unlock the database if it is locked</source> @@ -235,11 +264,11 @@ Wybierz, czy chcesz zezwolić na dostęp.</translation> </message> <message> <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> - <translation type="unfinished"/> + <translation>Tylko wpisy z tym samym schematem (http://, https://, ...) są zwracane.</translation> </message> <message> <source>&Match URL scheme (e.g., https://...)</source> - <translation type="unfinished"/> + <translation>&Dopasuj schemat adresu URL (np. https://...)</translation> </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> @@ -247,25 +276,25 @@ Wybierz, czy chcesz zezwolić na dostęp.</translation> </message> <message> <source>&Return only best-matching credentials</source> - <translation type="unfinished"/> + <translation>Z&wróć tylko najlepiej pasujące poświadczenia</translation> </message> <message> <source>Sort &matching credentials by title</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Sortuj dopasowane poświadczenia według &tytułu</translation> </message> <message> <source>Sort matching credentials by &username</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Sortuj dopasowane poświadczenia według &użytkownika</translation> </message> <message> <source>&Disconnect all browsers</source> - <translation type="unfinished"/> + <translation>&Odłącz wszystkie przeglądarki</translation> </message> <message> <source>Forget all remembered &permissions</source> - <translation type="unfinished"/> + <translation>Zapomnij wszystkie zapamiętane &uprawnienia</translation> </message> <message> <source>Advanced</source> @@ -274,12 +303,12 @@ Wybierz, czy chcesz zezwolić na dostęp.</translation> <message> <source>Never &ask before accessing credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Nigdy nie &pytaj przed uzyskaniem dostępu do poświadczeń</translation> </message> <message> <source>Never ask before &updating credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Nigdy nie &pytaj przed aktualizacją poświadczeń</translation> </message> <message> <source>Only the selected database has to be connected with a client.</source> @@ -288,7 +317,7 @@ Wybierz, czy chcesz zezwolić na dostęp.</translation> <message> <source>Searc&h in all opened databases for matching credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Szuk&aj we wszystkich otwartych bazach danych dopasowanych poświadczeń</translation> </message> <message> <source>Automatically creating or updating string fields is not supported.</source> @@ -300,28 +329,28 @@ Wybierz, czy chcesz zezwolić na dostęp.</translation> </message> <message> <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> - <translation type="unfinished"/> + <translation>Aktualizuje automatycznie ścieżkę binarną KeePassXC albo keepassxc-proxy do skryptów Native Messaging podczas uruchamiania.</translation> </message> <message> <source>Update &native messaging manifest files at startup</source> - <translation type="unfinished"/> + <translation>Aktualizuj pliki manifestu &Native Messaging podczas uruchamiania</translation> </message> <message> <source>Support a proxy application between KeePassXC and browser extension.</source> - <translation type="unfinished"/> + <translation>Obsługuj aplikację proxy pomiędzy KeePassXC a rozszerzeniem przeglądarki.</translation> </message> <message> <source>Use a &proxy application between KeePassXC and browser extension</source> - <translation type="unfinished"/> + <translation>Używaj aplikacj &proxy pomiędzy KeePassXC a rozszerzeniem przeglądarki</translation> </message> <message> <source>Use a custom proxy location if you installed a proxy manually.</source> - <translation type="unfinished"/> + <translation>Używaj niestandardowej lokalizacji proxy, jeżeli zainstalowałeś proxy ręcznie.</translation> </message> <message> <source>Use a &custom proxy location</source> <comment>Meant is the proxy for KeePassXC-Browser</comment> - <translation type="unfinished"/> + <translation>Używaj &niestandardowej lokalizacji proxy</translation> </message> <message> <source>Browse...</source> @@ -330,19 +359,19 @@ Wybierz, czy chcesz zezwolić na dostęp.</translation> </message> <message> <source><b>Warning:</b> The following options can be dangerous!</source> - <translation type="unfinished"/> + <translation><b>Ostrzeżenie:</b> Poniższe opcje mogą być niebezpieczne!</translation> </message> <message> <source>Executable Files (*.exe);;All Files (*.*)</source> - <translation type="unfinished"/> + <translation>Pliki wykonywalne (*.exe);;Wszystkie pliki (*.*)</translation> </message> <message> <source>Executable Files (*)</source> - <translation type="unfinished"/> + <translation>Pliki wykonywalne (*)</translation> </message> <message> <source>Select custom proxy location</source> - <translation type="unfinished"/> + <translation>Wybierz niestandardową lokalizację proxy</translation> </message> </context> <context> @@ -356,11 +385,14 @@ Wybierz, czy chcesz zezwolić na dostęp.</translation> If you would like to allow it access to your KeePassXC database, give it a unique name to identify and accept it.</source> - <translation type="unfinished"/> + <translation>Otrzymałeś żądanie skojarzenia powyższego klucza. + +Jeżeli chcesz zezwolić na dostęp do twojej bazy danych KeePassXC, +nadaj unikatową nazwę do zidentyfikowania i zaakceptuj.</translation> </message> <message> <source>Save and allow access</source> - <translation type="unfinished"/> + <translation>Zapisz i zezwól na dostęp</translation> </message> <message> <source>KeePassXC: Overwrite existing key?</source> @@ -369,7 +401,8 @@ give it a unique name to identify and accept it.</source> <message> <source>A shared encryption key with the name "%1" already exists. Do you want to overwrite it?</source> - <translation type="unfinished"/> + <translation>Współdzielony klucz szyfrujący o nazwie "%1" już istnieje. +Czy chcesz go nadpisać?</translation> </message> <message> <source>KeePassXC: Update Entry</source> @@ -395,7 +428,7 @@ Proszę odblokować wybraną bazę albo wybrać inną, która jest odblokowana.< </message> <message> <source>The active database does not contain a settings entry.</source> - <translation type="unfinished"/> + <translation>Aktywna baza danych nie zawiera wpisu z ustawieniami.</translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -403,7 +436,7 @@ Proszę odblokować wybraną bazę albo wybrać inną, która jest odblokowana.< </message> <message> <source>No shared encryption keys found in KeePassXC Settings.</source> - <translation type="unfinished"/> + <translation>Nie znaleziono współdzielonych kluczy szyfrujących w ustawieniach KeePassXC.</translation> </message> <message> <source>KeePassXC: Removed keys from database</source> @@ -411,11 +444,11 @@ Proszę odblokować wybraną bazę albo wybrać inną, która jest odblokowana.< </message> <message numerus="yes"> <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Pomyślnie usunięto %n klucz szyfrowania z ustawień KeePassXC.</numerusform><numerusform>Pomyślnie usunięto %n klucze szyfrowania z ustawień KeePassXC.</numerusform><numerusform>Pomyślnie usunięto %n kluczy szyfrowania z ustawień KeePassXC.</numerusform><numerusform>Pomyślnie usunięto %n kluczy szyfrowania z ustawień KeePassXC.</numerusform></translation> </message> <message> <source>Removing stored permissions…</source> - <translation type="unfinished"/> + <translation>Usuwanie przechowywanych uprawnień...</translation> </message> <message> <source>Abort</source> @@ -427,7 +460,7 @@ Proszę odblokować wybraną bazę albo wybrać inną, która jest odblokowana.< </message> <message numerus="yes"> <source>Successfully removed permissions from %n entry(s).</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Pomyślnie usunięto uprawnienia z %n wpisu.</numerusform><numerusform>Pomyślnie usunięto uprawnienia z %n wpisów.</numerusform><numerusform>Pomyślnie usunięto uprawnienia z %n wpisów.</numerusform><numerusform>Pomyślnie usunięto uprawnienia z %n wpisu(ów).</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -486,7 +519,7 @@ Proszę odblokować wybraną bazę albo wybrać inną, która jest odblokowana.< </message> <message> <source>Unable to create Key File : </source> - <translation>Nie można utworzyć pliku klucza :</translation> + <translation>Nie można utworzyć pliku klucza : </translation> </message> <message> <source>Select a key file</source> @@ -512,14 +545,17 @@ Proszę odblokować wybraną bazę albo wybrać inną, która jest odblokowana.< </message> <message> <source>Legacy key file format</source> - <translation type="unfinished"/> + <translation>Przestarzały format pliku klucza</translation> </message> <message> <source>You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>Używasz przestarzałego formatu pliku klucza, który może być +nieobsługiwany w przyszłości. + +Proszę rozważyć wygenerowanie nowego pliku klucza.</translation> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -605,11 +641,11 @@ Please consider generating a new key file.</source> </message> <message> <source>Empty fieldname </source> - <translation>Puste pole tytuł</translation> + <translation>Puste pole tytuł </translation> </message> <message> <source>column </source> - <translation>kolumna</translation> + <translation>kolumna </translation> </message> <message> <source>Imported from CSV file</source> @@ -617,7 +653,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Original data: </source> - <translation>Oryginalne dane:</translation> + <translation>Oryginalne dane: </translation> </message> <message> <source>Error(s) detected in CSV file !</source> @@ -653,15 +689,15 @@ Please consider generating a new key file.</source> <name>CsvParserModel</name> <message numerus="yes"> <source>%n byte(s), </source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n bajt, </numerusform><numerusform>%n bajty, </numerusform><numerusform>%n bajtów, </numerusform><numerusform>%n bajtów, </numerusform></translation> </message> <message numerus="yes"> <source>%n row(s), </source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n rząd, </numerusform><numerusform>%n rzędy, </numerusform><numerusform>%n rzędów, </numerusform><numerusform>%n rzędów, </numerusform></translation> </message> <message numerus="yes"> <source>%n column(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n kolumna</numerusform><numerusform>%n kolumny</numerusform><numerusform>%n kolumn</numerusform><numerusform>%n kolumn</numerusform></translation> </message> </context> <context> @@ -700,18 +736,21 @@ Please consider generating a new key file.</source> </message> <message> <source>Legacy key file format</source> - <translation type="unfinished"/> + <translation>Przestarzały format pliku klucza</translation> </message> <message> <source>You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>Używasz przestarzałego formatu pliku klucza, który może być +nieobsługiwany w przyszłości. + +Proszę rozważyć wygenerowanie nowego pliku klucza.</translation> </message> <message> <source>Don't show this warning again</source> - <translation type="unfinished"/> + <translation>Nie wyświetlaj ponownie tego ostrzeżenia</translation> </message> <message> <source>All files</source> @@ -776,17 +815,19 @@ Możesz teraz ją już zapisać.</translation> <message> <source>Number of rounds too high</source> <comment>Key transformation rounds</comment> - <translation type="unfinished"/> + <translation>Liczba rund zbyt duża</translation> </message> <message> <source>You are using a very high number of key transform rounds with Argon2. If you keep this number, your database may take hours or days (or even longer) to open!</source> - <translation type="unfinished"/> + <translation>Używasz bardzo dużej liczby rund transformacji klucza z Argon2. + +Jeśli zachowasz ten numer, otworzenie twojej bazy danych może zająć kilka godzin lub dni (lub nawet dłużej)!</translation> </message> <message> <source>Understood, keep number</source> - <translation type="unfinished"/> + <translation>Zrozumiano, zachowaj numer</translation> </message> <message> <source>Cancel</source> @@ -795,28 +836,40 @@ If you keep this number, your database may take hours or days (or even longer) t <message> <source>Number of rounds too low</source> <comment>Key transformation rounds</comment> - <translation type="unfinished"/> + <translation>Liczba rund zbyt mała</translation> </message> <message> <source>You are using a very low number of key transform rounds with AES-KDF. If you keep this number, your database may be too easy to crack!</source> - <translation type="unfinished"/> + <translation>Używasz bardzo małej liczby rund transformacji klucza z AES-KDF. + +Jeśli zachowasz ten numer, twoja baza danych może być zbyt łatwa do złamania!</translation> </message> <message> <source>KDF unchanged</source> - <translation type="unfinished"/> + <translation>KDF niezmieniona</translation> </message> <message> <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> - <translation type="unfinished"/> + <translation>Nie udało się transformować klucza za pomocą nowych parametrów KDF; KDF bez zmian.</translation> + </message> + <message numerus="yes"> + <source> MiB</source> + <comment>Abbreviation for Mebibytes (KDF settings)</comment> + <translation><numerusform> MiB</numerusform><numerusform> MiB</numerusform><numerusform> MiB</numerusform><numerusform> MiB</numerusform></translation> + </message> + <message numerus="yes"> + <source> thread(s)</source> + <comment>Threads for parallel execution (KDF settings)</comment> + <translation><numerusform>wątek</numerusform><numerusform>wątki</numerusform><numerusform>wątków</numerusform><numerusform>wątków</numerusform></translation> </message> </context> <context> <name>DatabaseSettingsWidgetEncryption</name> <message> <source>Encryption Algorithm:</source> - <translation type="unfinished"/> + <translation>Algorytm szyfrowania:</translation> </message> <message> <source>AES: 256 Bit (default)</source> @@ -828,7 +881,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Key Derivation Function:</source> - <translation type="unfinished"/> + <translation>Funkcja derywacji klucza:</translation> </message> <message> <source>Transform rounds:</source> @@ -836,30 +889,22 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Benchmark 1-second delay</source> - <translation type="unfinished"/> + <translation>Przetestuj 1-sekundowe opóźnienie</translation> </message> <message> <source>Memory Usage:</source> - <translation type="unfinished"/> - </message> - <message> - <source> MB</source> - <translation> MB</translation> + <translation>Zużycie pamięci:</translation> </message> <message> <source>Parallelism:</source> - <translation type="unfinished"/> - </message> - <message> - <source> thread</source> - <translation type="unfinished"/> + <translation>Paralelizm:</translation> </message> </context> <context> <name>DatabaseSettingsWidgetGeneral</name> <message> <source>Database Meta Data</source> - <translation type="unfinished"/> + <translation>Metadane bazy danych</translation> </message> <message> <source>Database name:</source> @@ -875,7 +920,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>History Settings</source> - <translation type="unfinished"/> + <translation>Ustawienia historii</translation> </message> <message> <source>Max. history items:</source> @@ -887,12 +932,20 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source> MiB</source> - <translation>MiB</translation> + <translation> MiB</translation> </message> <message> <source>Use recycle bin</source> <translation>Użyj kosza</translation> </message> + <message> + <source>Additional Database Settings</source> + <translation>Dodatkowe ustawienia bazy danych</translation> + </message> + <message> + <source>Enable &compression (recommended)</source> + <translation>Włącz &kompresję (zalecane)</translation> + </message> </context> <context> <name>DatabaseTabWidget</name> @@ -1015,6 +1068,16 @@ Otherwise your changes are lost.</source> Czy chcesz zapisać przed zablokowaniem jej? W przeciwnym wypadku zmiany zostaną porzucone.</translation> </message> + <message> + <source>Disable safe saves?</source> + <translation>Wyłączyć bezpieczne zapisywanie?</translation> + </message> + <message> + <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</source> + <translation>KeePassXC nie zdołał wielokrotnie zapisać bazy danych. Jest to prawdopodobnie spowodowane przez usługi synchronizacji plików, które blokują plik zapisu. +Wyłączyć bezpieczne zapisywanie i spróbować ponownie?</translation> + </message> </context> <context> <name>DatabaseWidget</name> @@ -1056,7 +1119,7 @@ W przeciwnym wypadku zmiany zostaną porzucone.</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Czy na pewno chcesz przenieść %n wpis do kosza?</numerusform><numerusform>Czy na pewno chcesz przenieść %n wpisy do kosza?</numerusform><numerusform>Czy na pewno chcesz przenieść %n wpisów do kosza?</numerusform><numerusform>Czy na pewno chcesz przenieść %n wpisów do kosza?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1100,7 +1163,7 @@ W przeciwnym wypadku zmiany zostaną porzucone.</translation> </message> <message> <source>File has changed</source> - <translation type="unfinished"/> + <translation>Plik się zmienił</translation> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -1113,7 +1176,8 @@ W przeciwnym wypadku zmiany zostaną porzucone.</translation> <message> <source>The database file has changed and you have unsaved changes. Do you want to merge your changes?</source> - <translation type="unfinished"/> + <translation>Plik bazy danych został zmieniony, a masz niezapisane zmiany. +Czy chcesz połączyć twoje zmiany?</translation> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -1127,12 +1191,16 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>Czy na pewno chcesz nieodwracalnie usunąć wszystko z twojego kosza?</translation> </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DetailsWidget</name> <message> <source>Generate TOTP Token</source> - <translation type="unfinished"/> + <translation>Wygeneruj token TOTP</translation> </message> <message> <source>Close</source> @@ -1152,7 +1220,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Expiration</source> - <translation type="unfinished"/> + <translation>Wygaśnięcie</translation> </message> <message> <source>Username</source> @@ -1160,15 +1228,15 @@ Do you want to merge your changes?</source> </message> <message> <source>Autotype</source> - <translation type="unfinished"/> + <translation>Autouzupełnianie</translation> </message> <message> <source>Searching</source> - <translation type="unfinished"/> + <translation>Wyszukiwanie</translation> </message> <message> <source>Attributes</source> - <translation type="unfinished"/> + <translation>Atrybuty</translation> </message> <message> <source>Attachments</source> @@ -1196,19 +1264,19 @@ Do you want to merge your changes?</source> </message> <message> <source>Never</source> - <translation type="unfinished"/> + <translation>Nigdy</translation> </message> <message> <source>[PROTECTED]</source> - <translation type="unfinished"/> + <translation>[CHRONIONE]</translation> </message> <message> <source>Disabled</source> - <translation type="unfinished"/> + <translation>Wyłączone</translation> </message> <message> <source>Enabled</source> - <translation type="unfinished"/> + <translation>Włączone</translation> </message> </context> <context> @@ -1243,23 +1311,23 @@ Do you want to merge your changes?</source> </message> <message> <source>n/a</source> - <translation type="unfinished"/> + <translation>nie dotyczy</translation> </message> <message> <source>(encrypted)</source> - <translation type="unfinished"/> + <translation>(zaszyfrowane)</translation> </message> <message> <source>Select private key</source> - <translation type="unfinished"/> + <translation>Wybierz klucz prywatny</translation> </message> <message> <source>File too large to be a private key</source> - <translation type="unfinished"/> + <translation>Plik jest zbyt duży, aby być kluczem prywatnym</translation> </message> <message> <source>Failed to open private key</source> - <translation type="unfinished"/> + <translation>Nie udało się otworzyć klucza prywatnego</translation> </message> <message> <source>Entry history</source> @@ -1291,11 +1359,11 @@ Do you want to merge your changes?</source> </message> <message> <source>[PROTECTED]</source> - <translation type="unfinished"/> + <translation>[CHRONIONE]</translation> </message> <message> <source>Press reveal to view or edit</source> - <translation type="unfinished"/> + <translation>Wciśnij Odsłoń, aby obejrzeć lub edytować</translation> </message> <message> <source>Tomorrow</source> @@ -1303,16 +1371,28 @@ Do you want to merge your changes?</source> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n tydzień</numerusform><numerusform>%n tygodnie</numerusform><numerusform>%n tygodni</numerusform><numerusform>%n tygodni</numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n miesiąc</numerusform><numerusform>%n miesiące</numerusform><numerusform>%n miesięcy</numerusform><numerusform>%n miesięcy</numerusform></translation> </message> <message> <source>1 year</source> <translation>1 rok</translation> </message> + <message> + <source>Apply generated password?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to apply the generated password to this entry?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAdvanced</name> @@ -1344,6 +1424,14 @@ Do you want to merge your changes?</source> <source>Attachments</source> <translation>Załączniki</translation> </message> + <message> + <source>Foreground Color:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Background Color:</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -1376,12 +1464,8 @@ Do you want to merge your changes?</source> <translation>Tytuł okna:</translation> </message> <message> - <source>Use default se&quence</source> - <translation>Korzystaj z dom&yślnej sekwencji</translation> - </message> - <message> - <source>Set custo&m sequence:</source> - <translation>Ustaw niest&andardową sekwencję:</translation> + <source>Use a specific sequence for this association:</source> + <translation>Użyj określonej sekwencji dla tego powiązania:</translation> </message> </context> <context> @@ -1431,7 +1515,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Toggle the checkbox to reveal the notes section.</source> - <translation type="unfinished"/> + <translation>Przełącz pole wyboru, aby wyświetlić sekcję notatek.</translation> </message> <message> <source>Username:</source> @@ -1446,43 +1530,43 @@ Do you want to merge your changes?</source> <name>EditEntryWidgetSSHAgent</name> <message> <source>Form</source> - <translation type="unfinished"/> + <translation>Formularz</translation> </message> <message> <source>Remove key from agent after</source> - <translation type="unfinished"/> + <translation>Usuń klucz z agenta po jego wygaśnięciu</translation> </message> <message> <source> seconds</source> - <translation type="unfinished"/> + <translation> sekundy</translation> </message> <message> <source>Fingerprint</source> - <translation type="unfinished"/> + <translation>Odcisk palca</translation> </message> <message> <source>Remove key from agent when database is closed/locked</source> - <translation type="unfinished"/> + <translation>Usuń klucz z agenta po zamknięciu/zablokowaniu bazy danych</translation> </message> <message> <source>Public key</source> - <translation type="unfinished"/> + <translation>Klucz publiczny</translation> </message> <message> <source>Add key to agent when database is opened/unlocked</source> - <translation type="unfinished"/> + <translation>Dodaj klucz do agenta podczas otwierania/odblokowywania bazy danych</translation> </message> <message> <source>Comment</source> - <translation type="unfinished"/> + <translation>Komentarz</translation> </message> <message> <source>Decrypt</source> - <translation type="unfinished"/> + <translation>Odszyfruj</translation> </message> <message> <source>n/a</source> - <translation type="unfinished"/> + <translation>nie dotyczy</translation> </message> <message> <source>Copy to clipboard</source> @@ -1490,11 +1574,11 @@ Do you want to merge your changes?</source> </message> <message> <source>Private key</source> - <translation type="unfinished"/> + <translation>Klucz prywatny</translation> </message> <message> <source>External file</source> - <translation type="unfinished"/> + <translation>Plik zewnętrzny</translation> </message> <message> <source>Browse...</source> @@ -1503,19 +1587,19 @@ Do you want to merge your changes?</source> </message> <message> <source>Attachment</source> - <translation type="unfinished"/> + <translation>Załącznik</translation> </message> <message> <source>Add to agent</source> - <translation type="unfinished"/> + <translation>Dodaj do agenta</translation> </message> <message> <source>Remove from agent</source> - <translation type="unfinished"/> + <translation>Usuń z agenta</translation> </message> <message> <source>Require user confirmation when this key is used</source> - <translation type="unfinished"/> + <translation>Wymagaj potwierdzenia użytkownika, gdy ten klucz jest używany</translation> </message> </context> <context> @@ -1661,13 +1745,38 @@ Do you want to merge your changes?</source> <source>Uuid:</source> <translation>UUID:</translation> </message> + <message> + <source>Plugin Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove</source> + <translation>Usuń</translation> + </message> + <message> + <source>Delete plugin data?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Value</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Entry</name> <message> <source> - Clone</source> <comment>Suffix added to cloned entries</comment> - <translation>- Klon</translation> + <translation> - Klon</translation> </message> </context> <context> @@ -1678,14 +1787,14 @@ Do you want to merge your changes?</source> </message> <message> <source>Size</source> - <translation type="unfinished"/> + <translation>Rozmiar</translation> </message> </context> <context> <name>EntryAttachmentsWidget</name> <message> <source>Form</source> - <translation type="unfinished"/> + <translation>Formularz</translation> </message> <message> <source>Add</source> @@ -1705,11 +1814,11 @@ Do you want to merge your changes?</source> </message> <message> <source>Select files</source> - <translation type="unfinished"/> + <translation>Wybierz pliki</translation> </message> <message numerus="yes"> <source>Are you sure you want to remove %n attachment(s)?</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Czy na pewno chcesz usunąć %n załącznik?</numerusform><numerusform>Czy na pewno chcesz usunąć %n załączniki?</numerusform><numerusform>Czy na pewno chcesz usunąć %n załączników?</numerusform><numerusform>Czy na pewno chcesz usunąć %n załączników?</numerusform></translation> </message> <message> <source>Confirm Remove</source> @@ -1717,40 +1826,45 @@ Do you want to merge your changes?</source> </message> <message> <source>Save attachments</source> - <translation type="unfinished"/> + <translation>Zapisz załączniki</translation> </message> <message> <source>Unable to create directory: %1</source> - <translation type="unfinished"/> + <translation>Nie można utworzyć katalogu: +%1</translation> </message> <message> <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> - <translation type="unfinished"/> + <translation>Czy na pewno chcesz zastąpić istniejący plik "%1" załącznikiem?</translation> </message> <message> <source>Confirm overwrite</source> - <translation type="unfinished"/> + <translation>Potwierdź zastąpienie</translation> </message> <message> <source>Unable to save attachments: %1</source> - <translation type="unfinished"/> + <translation>Nie można zapisać załączników: +%1</translation> </message> <message> <source>Unable to open attachment: %1</source> - <translation type="unfinished"/> + <translation>Nie można otworzyć załącznika: +%1</translation> </message> <message> <source>Unable to open attachments: %1</source> - <translation type="unfinished"/> + <translation>Nie można otworzyć załączników: +%1</translation> </message> <message> <source>Unable to open files: %1</source> - <translation type="unfinished"/> + <translation>Nie można otworzyć plików: +%1</translation> </message> </context> <context> @@ -1784,7 +1898,7 @@ Do you want to merge your changes?</source> <message> <source>Ref: </source> <comment>Reference abbreviation</comment> - <translation>Odniesienie:</translation> + <translation>Odniesienie: </translation> </message> <message> <source>Group</source> @@ -1802,6 +1916,65 @@ Do you want to merge your changes?</source> <source>URL</source> <translation>URL</translation> </message> + <message> + <source>Never</source> + <translation>Nigdy</translation> + </message> + <message> + <source>Password</source> + <translation>Hasło</translation> + </message> + <message> + <source>Notes</source> + <translation>Notatki</translation> + </message> + <message> + <source>Expires</source> + <translation>Wygasa</translation> + </message> + <message> + <source>Created</source> + <translation>Stworzone</translation> + </message> + <message> + <source>Modified</source> + <translation>Modyfikowane</translation> + </message> + <message> + <source>Accessed</source> + <translation>Ostatnio używane</translation> + </message> + <message> + <source>Attachments</source> + <translation>Załączniki</translation> + </message> +</context> +<context> + <name>EntryView</name> + <message> + <source>Customize View</source> + <translation>Dostosuj widok</translation> + </message> + <message> + <source>Hide Usernames</source> + <translation>Ukryj użytkowników</translation> + </message> + <message> + <source>Hide Passwords</source> + <translation>Ukryj hasła</translation> + </message> + <message> + <source>Fit to window</source> + <translation>Dopasuj do okna</translation> + </message> + <message> + <source>Fit to contents</source> + <translation>Dopasuj do treści</translation> + </message> + <message> + <source>Reset to defaults</source> + <translation>Przywróć domyślne</translation> + </message> </context> <context> <name>Group</name> @@ -1814,11 +1987,11 @@ Do you want to merge your changes?</source> <name>HostInstaller</name> <message> <source>KeePassXC: Cannot save file!</source> - <translation type="unfinished"/> + <translation>KeePassXC: Nie można zapisać pliku!</translation> </message> <message> <source>Cannot save the native messaging script file.</source> - <translation type="unfinished"/> + <translation>Nie można zapisać pliku skryptu Native Messaging.</translation> </message> </context> <context> @@ -1871,6 +2044,10 @@ Do you want to merge your changes?</source> <source>Ensure that the password contains characters from every group</source> <translation>Zapewnij, że hasło będzie zawierało znaki ze wszystkich grup</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>Rozszerzony ASCII</translation> + </message> </context> <context> <name>KMessageWidget</name> @@ -1913,7 +2090,7 @@ Do you want to merge your changes?</source> <name>Kdbx4Reader</name> <message> <source>missing database headers</source> - <translation type="unfinished"/> + <translation>brakuje nagłówków bazy danych</translation> </message> <message> <source>Unable to calculate master key</source> @@ -1921,127 +2098,127 @@ Do you want to merge your changes?</source> </message> <message> <source>Invalid header checksum size</source> - <translation type="unfinished"/> + <translation>Nieprawidłowy rozmiar sumy kontrolnej nagłówka</translation> </message> <message> <source>Header SHA256 mismatch</source> - <translation type="unfinished"/> + <translation>Niepoprawny nagłówek SHA256</translation> </message> <message> <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> - <translation type="unfinished"/> + <translation>Nieprawidłowy klucz lub uszkodzony plik bazy danych (niedopasowanie HMAC)</translation> </message> <message> <source>Unknown cipher</source> - <translation type="unfinished"/> + <translation>Nieznany szyfr</translation> </message> <message> <source>Invalid header id size</source> - <translation type="unfinished"/> + <translation>Nieprawidłowy rozmiar identyfikatora nagłówka</translation> </message> <message> <source>Invalid header field length</source> - <translation type="unfinished"/> + <translation>Nieprawidłowa długość pola nagłówka</translation> </message> <message> <source>Invalid header data length</source> - <translation type="unfinished"/> + <translation>Nieprawidłowa długość danych nagłowka</translation> </message> <message> <source>Failed to open buffer for KDF parameters in header</source> - <translation type="unfinished"/> + <translation>Nie można otworzyć bufora dla parametrów KDF w nagłówku</translation> </message> <message> <source>Unsupported key derivation function (KDF) or invalid parameters</source> - <translation type="unfinished"/> + <translation>Nieobsługiwana funkcja derywacji klucza (KDF) albo nieprawidłowe parametry</translation> </message> <message> <source>Legacy header fields found in KDBX4 file.</source> - <translation type="unfinished"/> + <translation>W pliku KDBX4 znaleziono przestarzałe pola nagłówków.</translation> </message> <message> <source>Invalid inner header id size</source> - <translation type="unfinished"/> + <translation>Nieprawidłowy rozmiar id wewnętrznego nagłówka</translation> </message> <message> <source>Invalid inner header field length</source> - <translation type="unfinished"/> + <translation>Nieprawidłowa długość pola wewnętrznego nagłówka</translation> </message> <message> <source>Invalid inner header binary size</source> - <translation type="unfinished"/> + <translation>Nieprawidłowy rozmiar binarny wewnętrznego nagłówka</translation> </message> <message> <source>Unsupported KeePass variant map version.</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Niewspierana wersja mapy odmian KeePass.</translation> </message> <message> <source>Invalid variant map entry name length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Nieprawidłowa długość nazwy wpisu mapy odmian</translation> </message> <message> <source>Invalid variant map entry name data</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Nieprawidłowe dane nazwy wpisu mapy odmian</translation> </message> <message> <source>Invalid variant map entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Nieprawidłowa długość wartości wpisu mapy odmian</translation> </message> <message> <source>Invalid variant map entry value data</source> <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Nieprawidłowe dane wartości wpisu mapy odmian</translation> </message> <message> <source>Invalid variant map Bool entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Nieprawidłowa długość Bool wpisu mapy odmian</translation> </message> <message> <source>Invalid variant map Int32 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Nieprawidłowa długość Int32 wartości wpisu mapy odmian</translation> </message> <message> <source>Invalid variant map UInt32 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Nieprawidłowa długość UInt32 wartości wpisu mapy odmian</translation> </message> <message> <source>Invalid variant map Int64 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Nieprawidłowa długość Int64 wartości wpisu mapy odmian</translation> </message> <message> <source>Invalid variant map UInt64 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Nieprawidłowa długość UInt64 wartości wpisu mapy odmian</translation> </message> <message> <source>Invalid variant map entry type</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Nieprawidłowe typ wpisu mapy odmian</translation> </message> <message> <source>Invalid variant map field type size</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Nieprawidłowy rozmiar typu pola mapy odmian</translation> </message> </context> <context> <name>Kdbx4Writer</name> <message> <source>Invalid symmetric cipher algorithm.</source> - <translation type="unfinished"/> + <translation>Nieprawidłowy algorytm szyfrowania symetrycznego.</translation> </message> <message> <source>Invalid symmetric cipher IV size.</source> <comment>IV = Initialization Vector for symmetric cipher</comment> - <translation type="unfinished"/> + <translation>Nieprawidłowy rozmiar symetrycznego szyfru IV.</translation> </message> <message> <source>Unable to calculate master key</source> @@ -2050,50 +2227,50 @@ Do you want to merge your changes?</source> <message> <source>Failed to serialize KDF parameters variant map</source> <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Nie udało się serializować mapy odmian parametrów KDF</translation> </message> </context> <context> <name>KdbxReader</name> <message> <source>Invalid cipher uuid length</source> - <translation type="unfinished"/> + <translation>Nieprawidłowa długość szyfru uuid</translation> </message> <message> <source>Unsupported cipher</source> - <translation type="unfinished"/> + <translation>Nieobsługiwany szyfr</translation> </message> <message> <source>Invalid compression flags length</source> - <translation type="unfinished"/> + <translation>Nieprawidłowa długość flag kompresji</translation> </message> <message> <source>Unsupported compression algorithm</source> - <translation type="unfinished"/> + <translation>Niewspierany algorytm kompresji</translation> </message> <message> <source>Invalid master seed size</source> - <translation type="unfinished"/> + <translation>Nieprawidłowy rozmiar głównej liczby losowej</translation> </message> <message> <source>Invalid transform seed size</source> - <translation type="unfinished"/> + <translation>Nieprawidłowy rozmiar seedu transformacji</translation> </message> <message> <source>Invalid transform rounds size</source> - <translation type="unfinished"/> + <translation>Nieprawidłowy rozmiar rund transformacji</translation> </message> <message> <source>Invalid start bytes size</source> - <translation type="unfinished"/> + <translation>Nieprawidłowy rozmiar początkowy bajtu</translation> </message> <message> <source>Invalid random stream id size</source> - <translation type="unfinished"/> + <translation>Nieprawidłowy rozmiar losowy id strumienia</translation> </message> <message> <source>Invalid inner random stream cipher</source> - <translation type="unfinished"/> + <translation>Niepoprawny wewnętrzny szyfr losowy strumienia</translation> </message> <message> <source>Not a KeePass database.</source> @@ -2111,131 +2288,131 @@ Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej baz </message> <message> <source>Unsupported KeePass 2 database version.</source> - <translation type="unfinished"/> + <translation>Nieobsługiwana wersja bazy danych KeePass 2.</translation> </message> </context> <context> <name>KdbxXmlReader</name> <message> <source>XML parsing failure: %1</source> - <translation type="unfinished"/> + <translation>Błąd parsowania XML: %1</translation> </message> <message> <source>No root group</source> - <translation type="unfinished"/> + <translation>Brak głównej grupy</translation> </message> <message> <source>Missing icon uuid or data</source> - <translation type="unfinished"/> + <translation>Brakujące uuid ikony lub danych</translation> </message> <message> <source>Missing custom data key or value</source> - <translation type="unfinished"/> + <translation>Brakujący niestandardowy klucz danych lub wartość</translation> </message> <message> <source>Multiple group elements</source> - <translation type="unfinished"/> + <translation>Elementy wielu grup</translation> </message> <message> <source>Null group uuid</source> - <translation type="unfinished"/> + <translation>Zerowa grupa uuid</translation> </message> <message> <source>Invalid group icon number</source> - <translation type="unfinished"/> + <translation>Nieprawidłowy numer ikony grupy</translation> </message> <message> <source>Invalid EnableAutoType value</source> - <translation type="unfinished"/> + <translation>Nieprawidłowa wartość EnableAutoType</translation> </message> <message> <source>Invalid EnableSearching value</source> - <translation type="unfinished"/> + <translation>Nieprawidłowa wartość EnableSearching</translation> </message> <message> <source>No group uuid found</source> - <translation type="unfinished"/> + <translation>Nie znaleziono grupy uuid</translation> </message> <message> <source>Null DeleteObject uuid</source> - <translation type="unfinished"/> + <translation>Zerowy uuid DeleteObject</translation> </message> <message> <source>Missing DeletedObject uuid or time</source> - <translation type="unfinished"/> + <translation>Brakujące uuid DeletedObject lub czasu</translation> </message> <message> <source>Null entry uuid</source> - <translation type="unfinished"/> + <translation>Zerwoy wpis uuid</translation> </message> <message> <source>Invalid entry icon number</source> - <translation type="unfinished"/> + <translation>Nieprawidłowy numer ikony wejściowej</translation> </message> <message> <source>History element in history entry</source> - <translation type="unfinished"/> + <translation>Element historii we wpisie historii</translation> </message> <message> <source>No entry uuid found</source> - <translation type="unfinished"/> + <translation>Nie znaleziono wpisu uuid</translation> </message> <message> <source>History element with different uuid</source> - <translation type="unfinished"/> + <translation>Element historii z innym uuid</translation> </message> <message> <source>Unable to decrypt entry string</source> - <translation type="unfinished"/> + <translation>Nie można odszyfrować ciągu wejściowego</translation> </message> <message> <source>Duplicate custom attribute found</source> - <translation type="unfinished"/> + <translation>Znaleziono zduplikowany niestandardowy atrybut</translation> </message> <message> <source>Entry string key or value missing</source> - <translation type="unfinished"/> + <translation>Brak klucza lub wartości dla wpisu</translation> </message> <message> <source>Duplicate attachment found</source> - <translation type="unfinished"/> + <translation>Znaleziono zduplikowany załącznik</translation> </message> <message> <source>Entry binary key or value missing</source> - <translation type="unfinished"/> + <translation>Brak wejściowego klucza binarnego lub wartości</translation> </message> <message> <source>Auto-type association window or sequence missing</source> - <translation type="unfinished"/> + <translation>Brak przypisanego okna lub sekwencji auto-uzupełniania</translation> </message> <message> <source>Invalid bool value</source> - <translation type="unfinished"/> + <translation>Nieprawidłowa wartość bool</translation> </message> <message> <source>Invalid date time value</source> - <translation type="unfinished"/> + <translation>Nieprawidłowa wartość czasu daty</translation> </message> <message> <source>Invalid color value</source> - <translation type="unfinished"/> + <translation>Nieprawidłowa wartość koloru</translation> </message> <message> <source>Invalid color rgb part</source> - <translation type="unfinished"/> + <translation>Nieprawidłowa wartość części koloru rgb</translation> </message> <message> <source>Invalid number value</source> - <translation type="unfinished"/> + <translation>Nieprawidłowa wartość liczbowa</translation> </message> <message> <source>Invalid uuid value</source> - <translation type="unfinished"/> + <translation>Nieprawidłowa wartość uuid</translation> </message> <message> <source>Unable to decompress binary</source> <extracomment>Translator meant is a binary data inside an entry</extracomment> - <translation type="unfinished"/> + <translation>Nie można zdekompresować pliku binarnego</translation> </message> </context> <context> @@ -2270,31 +2447,31 @@ Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej baz <message> <source>Unable to read encryption IV</source> <comment>IV = Initialization Vector for symmetric cipher</comment> - <translation type="unfinished"/> + <translation>Nie można odczytać szyfrowania IV</translation> </message> <message> <source>Invalid number of groups</source> - <translation type="unfinished"/> + <translation>Nieprawidłowa liczba grup</translation> </message> <message> <source>Invalid number of entries</source> - <translation type="unfinished"/> + <translation>Nieprawidłowa liczba wpisów</translation> </message> <message> <source>Invalid content hash size</source> - <translation type="unfinished"/> + <translation>Nieprawidłowy rozmiar hashu zawartości</translation> </message> <message> <source>Invalid transform seed size</source> - <translation type="unfinished"/> + <translation>Nieprawidłowy rozmiar seedu transformacji</translation> </message> <message> <source>Invalid number of transform rounds</source> - <translation type="unfinished"/> + <translation>Nieprawidłowa liczba rund transformacji</translation> </message> <message> <source>Unable to construct group tree</source> - <translation type="unfinished"/> + <translation>Nie można skonstruować drzewa grup</translation> </message> <message> <source>Root</source> @@ -2310,95 +2487,95 @@ Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej baz </message> <message> <source>Key transformation failed</source> - <translation type="unfinished"/> + <translation>Nie udało się transformować klucza</translation> </message> <message> <source>Invalid group field type number</source> - <translation type="unfinished"/> + <translation>Nieprawidłowa liczba typu pola grupy</translation> </message> <message> <source>Invalid group field size</source> - <translation type="unfinished"/> + <translation>Nieprawidłowy rozmiar pola grupy</translation> </message> <message> <source>Read group field data doesn't match size</source> - <translation type="unfinished"/> + <translation>Odczytane dane pola grupy nie pasują do rozmiaru</translation> </message> <message> <source>Incorrect group id field size</source> - <translation type="unfinished"/> + <translation>Niepoprawny rozmiar pola dla identyfikatora grupy</translation> </message> <message> <source>Incorrect group creation time field size</source> - <translation type="unfinished"/> + <translation>Niepoprawny rozmiar pola dla czasu utworzenia grupy</translation> </message> <message> <source>Incorrect group modification time field size</source> - <translation type="unfinished"/> + <translation>Niepoprawny rozmiar pola dla czasu modyfikacji grupy</translation> </message> <message> <source>Incorrect group access time field size</source> - <translation type="unfinished"/> + <translation>Niepoprawny rozmiar pola dla czasu dostępu do grupy</translation> </message> <message> <source>Incorrect group expiry time field size</source> - <translation type="unfinished"/> + <translation>Niepoprawny rozmiar pola dla czasu wygaśnięcia grupy</translation> </message> <message> <source>Incorrect group icon field size</source> - <translation type="unfinished"/> + <translation>Niepoprawny rozmiar pola dla ikony grupy</translation> </message> <message> <source>Incorrect group level field size</source> - <translation type="unfinished"/> + <translation>Niepoprawny rozmiar pola dla poziomu grupy</translation> </message> <message> <source>Invalid group field type</source> - <translation type="unfinished"/> + <translation>Nieprawidłowy typ pola grupy</translation> </message> <message> <source>Missing group id or level</source> - <translation type="unfinished"/> + <translation>Brak poziomu lub identyfikatora grupy</translation> </message> <message> <source>Missing entry field type number</source> - <translation type="unfinished"/> + <translation>Brak numeru typu dla pola wpisu</translation> </message> <message> <source>Invalid entry field size</source> - <translation type="unfinished"/> + <translation>Nieprawidłowy rozmiar pola wpisu</translation> </message> <message> <source>Read entry field data doesn't match size</source> - <translation type="unfinished"/> + <translation>Odczytane dane pola wpisu nie pasują do rozmiaru</translation> </message> <message> <source>Invalid entry uuid field size</source> - <translation type="unfinished"/> + <translation>Nieprawidłowy rozmiar pola wpisu uuid</translation> </message> <message> <source>Invalid entry group id field size</source> - <translation type="unfinished"/> + <translation>Nieprawidłowy rozmiar pola dla identyfikatora grupy wpisu</translation> </message> <message> <source>Invalid entry icon field size</source> - <translation type="unfinished"/> + <translation>Nieprawidłowy rozmiar pola dla ikony wpisu</translation> </message> <message> <source>Invalid entry creation time field size</source> - <translation type="unfinished"/> + <translation>Nieprawidłowy rozmiar pola dla czasu utworzenia wpisu</translation> </message> <message> <source>Invalid entry modification time field size</source> - <translation type="unfinished"/> + <translation>Nieprawidłowy rozmiar pola dla czasu modyfikacji wpisu</translation> </message> <message> <source>Invalid entry expiry time field size</source> - <translation type="unfinished"/> + <translation>Nieprawidłowy rozmiar pola dla czasu wygaśnięcia wpisu</translation> </message> <message> <source>Invalid entry field type</source> - <translation type="unfinished"/> + <translation>Nieprawidłowy typ pola wpisu</translation> </message> </context> <context> @@ -2440,7 +2617,7 @@ Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej baz </message> <message> <source>&Help</source> - <translation>Pomoc</translation> + <translation>&Pomoc</translation> </message> <message> <source>E&ntries</source> @@ -2452,7 +2629,7 @@ Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej baz </message> <message> <source>Time-based one-time password</source> - <translation type="unfinished"/> + <translation>Hasło jednorazowe zależne od czasu (TOTP)</translation> </message> <message> <source>&Groups</source> @@ -2580,7 +2757,7 @@ Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej baz </message> <message> <source>Copy title to clipboard</source> - <translation type="unfinished"/> + <translation>Skopiuj tytuł do schowka</translation> </message> <message> <source>&URL</source> @@ -2588,7 +2765,7 @@ Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej baz </message> <message> <source>Copy URL to clipboard</source> - <translation type="unfinished"/> + <translation>Skopiuj adres URL do schowka</translation> </message> <message> <source>&Notes</source> @@ -2596,7 +2773,7 @@ Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej baz </message> <message> <source>Copy notes to clipboard</source> - <translation type="unfinished"/> + <translation>Skopiuj notatki do schowka</translation> </message> <message> <source>&Export to CSV file...</source> @@ -2628,7 +2805,7 @@ Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej baz </message> <message> <source>E&mpty recycle bin</source> - <translation type="unfinished"/> + <translation>Opróżnij k&osz</translation> </message> <message> <source>Clear history</source> @@ -2640,7 +2817,7 @@ Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej baz </message> <message> <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> - <translation type="unfinished"/> + <translation><p>Wygląda na to, że używasz KeePassHTTP do integracji z przeglądarką. Ta funkcja została uznana za przestarzałą i zostanie usunięta w przyszłości.<br>Zamiast tego proszę przejść na KeePassXC-Browser! Aby uzyskać pomoc dotyczącą migracji, odwiedź nasz <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">przewodnik migracji</a> (ostrzeżenie %1 z 3).</p></translation> </message> <message> <source>read-only</source> @@ -2682,100 +2859,112 @@ Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej baz <source>Please touch the button on your YubiKey!</source> <translation>Proszę dotknąć przycisku na twoim YubiKey!</translation> </message> + <message> + <source>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</source> + <translation>OSTRZEŻENIE: Używasz niestabilnej kompilacji KeePassXC! +Istnieje duże ryzyko uszkodzenia, utrzymuj kopie zapasowe baz danych. +Ta wersja nie jest przeznaczona do użytku produkcyjnego.</translation> + </message> </context> <context> <name>OpenSSHKey</name> <message> <source>Invalid key file, expecting an OpenSSH key</source> - <translation type="unfinished"/> + <translation>Nieprawidłowy plik klucza, oczekiwany klucz OpenSSH</translation> </message> <message> <source>PEM boundary mismatch</source> - <translation type="unfinished"/> - </message> - <message> - <source>This is not an OpenSSH key, only modern keys are supported</source> - <translation type="unfinished"/> + <translation>Niedopasowanie w granicy PEM</translation> </message> <message> <source>Base64 decoding failed</source> - <translation type="unfinished"/> + <translation>Dekodowanie Base64 nie powiodło się</translation> </message> <message> <source>Key file way too small.</source> - <translation type="unfinished"/> + <translation>Plik klucza jest zbyt mały.</translation> </message> <message> <source>Key file magic header id invalid</source> - <translation type="unfinished"/> + <translation>Nieprawidłowy identyfikator nagłówka magicznego pliku klucza</translation> </message> <message> <source>Found zero keys</source> - <translation type="unfinished"/> + <translation>Znaleziono zero kluczy</translation> </message> <message> <source>Failed to read public key.</source> - <translation type="unfinished"/> + <translation>Nie udało się odczytać klucza publicznego.</translation> </message> <message> <source>Corrupted key file, reading private key failed</source> - <translation type="unfinished"/> + <translation>Uszkodzony plik klucza, odczytu klucza prywatnego nie powiodło się</translation> </message> <message> <source>No private key payload to decrypt</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown cipher: </source> - <translation type="unfinished"/> + <translation>Brak zawrtości prywatnego klucza do odszyfrowania</translation> </message> <message> <source>Trying to run KDF without cipher</source> - <translation type="unfinished"/> + <translation>Próbuję uruchomić KDF bez szyfru</translation> </message> <message> <source>Passphrase is required to decrypt this key</source> - <translation type="unfinished"/> + <translation>Do odszyfrowania tego klucza wymagane jest hasło</translation> </message> <message> <source>Key derivation failed, key file corrupted?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown KDF: </source> - <translation type="unfinished"/> + <translation>Derywacja klucza nie powiodła się, plik klucza uszkodzony?</translation> </message> <message> <source>Decryption failed, wrong passphrase?</source> - <translation type="unfinished"/> + <translation>Odszyfrowanie nie powiodło się, błędne hasło?</translation> </message> <message> <source>Unexpected EOF while reading public key</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown key type: </source> - <translation type="unfinished"/> + <translation>Nieoczekiwany koniec pliku (EOF) podczas odczytu klucza publicznego</translation> </message> <message> <source>Unexpected EOF while reading private key</source> - <translation type="unfinished"/> + <translation>Nieoczekiwany koniec pliku (EOF) podczas odczytu klucza prywatnego</translation> </message> <message> <source>Can't write public key as it is empty</source> - <translation type="unfinished"/> + <translation>Nie można zapisać klucza publicznego, ponieważ jest pusty</translation> </message> <message> <source>Unexpected EOF when writing public key</source> - <translation type="unfinished"/> + <translation>Nieoczekiwany koniec pliku (EOF) podczas zapisu klucza publicznego</translation> </message> <message> <source>Can't write private key as it is empty</source> - <translation type="unfinished"/> + <translation>Nie można zapisać klucza prywatnego, ponieważ jest pusty</translation> </message> <message> <source>Unexpected EOF when writing private key</source> - <translation type="unfinished"/> + <translation>Nieoczekiwany koniec pliku (EOF) podczas zapisu klucza prywatnego</translation> + </message> + <message> + <source>Unsupported key type: %1</source> + <translation>Nieobsługiwany typ klucza: %1</translation> + </message> + <message> + <source>Unknown cipher: %1</source> + <translation>Nieznany szyfr: %1</translation> + </message> + <message> + <source>Cipher IV is too short for MD5 kdf</source> + <translation>Szyfr IV jest za krótki dla kdf MD5</translation> + </message> + <message> + <source>Unknown KDF: %1</source> + <translation>Nieznana KDF: %1</translation> + </message> + <message> + <source>Unknown key type: %1</source> + <translation>Nieznany typ klucza: %1</translation> </message> </context> <context> @@ -2883,11 +3072,11 @@ Jest to migracja w jedną stronę. Nie będzie można otworzyć importowanej baz </message> <message> <source><b>Warning:</b> The following options can be dangerous!</source> - <translation type="unfinished"/> + <translation><b>Ostrzeżenie:</b> Poniższe opcje mogą być niebezpieczne!</translation> </message> <message> <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> - <translation type="unfinished"/> + <translation><p>KeePassHTTP został porzucony i zostanie usunięty w przyszłości. <br>Proszę zamiast tego przejść na KeePassXC-browser! Aby uzyskać pomoc dotyczącą migracji, odwiedź nasz <a href="https://keepassxc.org/docs/keepassxc-browser-migration"> Przewodnik migracji</a>.</p></translation> </message> <message> <source>Cannot bind to privileged ports</source> @@ -3028,71 +3217,71 @@ Używam domyślnego portu 19455.</translation> <name>QObject</name> <message> <source>Database not opened</source> - <translation type="unfinished"/> + <translation>Baza danych nie została otwarta</translation> </message> <message> <source>Database hash not available</source> - <translation type="unfinished"/> + <translation>Hash bazy danych jest niedostępny</translation> </message> <message> <source>Client public key not received</source> - <translation type="unfinished"/> + <translation>Klucz publiczny klienta nie został odebrany</translation> </message> <message> <source>Cannot decrypt message</source> - <translation type="unfinished"/> + <translation>Nie można odszyfrować wiadomości</translation> </message> <message> <source>Timeout or cannot connect to KeePassXC</source> - <translation type="unfinished"/> + <translation>Przekroczony limit czasu lub nie można podłączyć się do KeePassXC</translation> </message> <message> <source>Action cancelled or denied</source> - <translation type="unfinished"/> + <translation>Działanie anulowane lub odrzucone</translation> </message> <message> <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> - <translation type="unfinished"/> + <translation>Nie można zaszyfrować wiadomości lub nie znaleziono klucza publicznego. Czy Native Messaging jest włączone w KeePassXC?</translation> </message> <message> <source>KeePassXC association failed, try again</source> - <translation type="unfinished"/> + <translation>Skojarzenie KeePassXC nie powiodło się, spróbuj ponownie</translation> </message> <message> <source>Key change was not successful</source> - <translation type="unfinished"/> + <translation>Zmiana klucza nie powiodła się</translation> </message> <message> <source>Encryption key is not recognized</source> - <translation type="unfinished"/> + <translation>Klucz szyfrowania nie jest rozpoznawany</translation> </message> <message> <source>No saved databases found</source> - <translation type="unfinished"/> + <translation>Nie znaleziono zapisanych baz danych</translation> </message> <message> <source>Incorrect action</source> - <translation type="unfinished"/> + <translation>Nieprawidłowe działanie</translation> </message> <message> <source>Empty message received</source> - <translation type="unfinished"/> + <translation>Otrzymano pustą wiadomość</translation> </message> <message> <source>No URL provided</source> - <translation type="unfinished"/> + <translation>Nie podano URL</translation> </message> <message> <source>No logins found</source> - <translation type="unfinished"/> + <translation>Nie znaleziono danych do logowania</translation> </message> <message> <source>Unknown error</source> - <translation type="unfinished"/> + <translation>Nieznany błąd</translation> </message> <message> <source>Add a new entry to a database.</source> - <translation type="unfinished"/> + <translation>Dodaj nowy wpis do bazy danych.</translation> </message> <message> <source>Path of the database.</source> @@ -3100,23 +3289,23 @@ Używam domyślnego portu 19455.</translation> </message> <message> <source>Key file of the database.</source> - <translation type="unfinished"/> + <translation>Plik z kluczem bazy danych.</translation> </message> <message> <source>path</source> - <translation type="unfinished"/> + <translation>ścieżka</translation> </message> <message> <source>Username for the entry.</source> - <translation type="unfinished"/> + <translation>Nazwa użytkownika dla wpisu.</translation> </message> <message> <source>username</source> - <translation type="unfinished"/> + <translation>użytkownik</translation> </message> <message> <source>URL for the entry.</source> - <translation type="unfinished"/> + <translation>Adres URL wpisu.</translation> </message> <message> <source>URL</source> @@ -3124,64 +3313,64 @@ Używam domyślnego portu 19455.</translation> </message> <message> <source>Prompt for the entry's password.</source> - <translation type="unfinished"/> + <translation>Pytaj o hasło do wpisu.</translation> </message> <message> <source>Generate a password for the entry.</source> - <translation type="unfinished"/> + <translation>Wygeneruj hasło dla wpisu.</translation> </message> <message> <source>Length for the generated password.</source> - <translation type="unfinished"/> + <translation>Długość wygenerowanego hasła.</translation> </message> <message> <source>length</source> - <translation type="unfinished"/> + <translation>długość</translation> </message> <message> <source>Path of the entry to add.</source> - <translation type="unfinished"/> + <translation>Ścieżka wpisu do dodania.</translation> </message> <message> <source>Copy an entry's password to the clipboard.</source> - <translation type="unfinished"/> + <translation>Skopiuj hasło wpisu do schowka.</translation> </message> <message> <source>Path of the entry to clip.</source> <comment>clip = copy to clipboard</comment> - <translation type="unfinished"/> + <translation>Ścieżka wpisu do zapamiętania.</translation> </message> <message> <source>Timeout in seconds before clearing the clipboard.</source> - <translation type="unfinished"/> + <translation>Limit czasu w sekundach przed wyczyszczeniem Schowka.</translation> </message> <message> <source>Edit an entry.</source> - <translation type="unfinished"/> + <translation>Edycja wpisu.</translation> </message> <message> <source>Title for the entry.</source> - <translation type="unfinished"/> + <translation>Tytuł dla wpisu.</translation> </message> <message> <source>title</source> - <translation type="unfinished"/> + <translation>tytuł</translation> </message> <message> <source>Path of the entry to edit.</source> - <translation type="unfinished"/> + <translation>Ścieżka wpisu do edycji.</translation> </message> <message> <source>Estimate the entropy of a password.</source> - <translation type="unfinished"/> + <translation>Oszacuj złożoność hasła.</translation> </message> <message> <source>Password for which to estimate the entropy.</source> - <translation type="unfinished"/> + <translation>Hasło dla którego chcesz oszacować złożoność.</translation> </message> <message> <source>Perform advanced analysis on the password.</source> - <translation type="unfinished"/> + <translation>Wykonaj zaawansowaną analizę hasła.</translation> </message> <message> <source>Extract and print the content of a database.</source> @@ -3193,25 +3382,31 @@ Używam domyślnego portu 19455.</translation> </message> <message> <source>Insert password to unlock %1: </source> - <translation type="unfinished"/> + <translation>Wprowadź hasło by odblokować %1: </translation> </message> <message> <source>Failed to load key file %1 : %2</source> - <translation type="unfinished"/> + <translation>Nieudane ładowanie pliku z kluczem %1 : %2</translation> </message> <message> <source>WARNING: You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>OSTRZEŻENIE: Używasz przestarzałego formatu pliku klucza, który może być +nieobsługiwany w przyszłości. + +Proszę rozważyć wygenerowanie nowego pliku klucza.</translation> </message> <message> <source> Available commands: </source> - <translation type="unfinished"/> + <translation> + +Dostępne polecenia: +</translation> </message> <message> <source>Name of the command to execute.</source> @@ -3227,11 +3422,11 @@ Available commands: </message> <message> <source>Find entries quickly.</source> - <translation type="unfinished"/> + <translation>Szybkie wyszukiwanie wpisów.</translation> </message> <message> <source>Search term.</source> - <translation type="unfinished"/> + <translation>Zapytanie wyszukiwania.</translation> </message> <message> <source>Merge two databases.</source> @@ -3247,23 +3442,23 @@ Available commands: </message> <message> <source>Use the same credentials for both database files.</source> - <translation type="unfinished"/> + <translation>Użyj tych samych poświadczeń dla obu plików bazy danych.</translation> </message> <message> <source>Key file of the database to merge from.</source> - <translation type="unfinished"/> + <translation>Plik klucza bazy danych, z której scalić.</translation> </message> <message> <source>Show an entry's information.</source> - <translation type="unfinished"/> + <translation>Pokaż informacje o wpisie.</translation> </message> <message> <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> - <translation type="unfinished"/> + <translation>Nazwy atrybutów do wyświetlenia. Tą opcję można zastosować więcej niż jeden raz, podając każdy atrybut w osobnym wierszu w określonej kolejności. Jeśli atrybuty nie są określone, wyświetla się podsumowanie domyślnych atrybutów.</translation> </message> <message> <source>attribute</source> - <translation type="unfinished"/> + <translation>atrybut</translation> </message> <message> <source>Name of the entry to show.</source> @@ -3293,27 +3488,27 @@ Available commands: </message> <message> <source>AES: 256-bit</source> - <translation type="unfinished"/> + <translation>AES: 256-bitowy</translation> </message> <message> <source>Twofish: 256-bit</source> - <translation type="unfinished"/> + <translation>Twofish: 256-bitowy</translation> </message> <message> <source>ChaCha20: 256-bit</source> - <translation type="unfinished"/> + <translation>ChaCha20: 256-bitowy</translation> </message> <message> <source>Argon2 (KDBX 4 – recommended)</source> - <translation type="unfinished"/> + <translation>Argon2 (KDBX 4 – zalecany)</translation> </message> <message> <source>AES-KDF (KDBX 4)</source> - <translation type="unfinished"/> + <translation>AES-KDF (KDBX 4)</translation> </message> <message> <source>AES-KDF (KDBX 3.1)</source> - <translation type="unfinished"/> + <translation>AES-KDF (KDBX 3.1)</translation> </message> <message> <source>Group</source> @@ -3337,15 +3532,15 @@ Available commands: </message> <message> <source>Last Modified</source> - <translation type="unfinished"/> + <translation>Ostatnia modyfikacja</translation> </message> <message> <source>Created</source> - <translation type="unfinished"/> + <translation>Stworzone</translation> </message> <message> <source>Legacy Browser Integration</source> - <translation type="unfinished"/> + <translation>Integracja ze starą przeglądarką</translation> </message> <message> <source>Browser Integration</source> @@ -3367,39 +3562,85 @@ Available commands: <source>SSH Agent</source> <translation>Agent SSH</translation> </message> + <message> + <source>Generate a new random diceware passphrase.</source> + <translation>Wygeneruj nowe hasło losowe diceware.</translation> + </message> + <message> + <source>Word count for the diceware passphrase.</source> + <translation>Liczba słów dla hasła diceware.</translation> + </message> + <message> + <source>count</source> + <translation>liczba</translation> + </message> + <message> + <source>Wordlist for the diceware generator. +[Default: EFF English]</source> + <translation>Lista słów dla generatora diceware. +[Domyślna: EFF English]</translation> + </message> + <message> + <source>Generate a new random password.</source> + <translation>Wygeneruj nowe hasło losowe.</translation> + </message> + <message> + <source>Length of the generated password.</source> + <translation>Długość wygenerowanego hasła.</translation> + </message> + <message> + <source>Use lowercase characters in the generated password.</source> + <translation>Użyj małych liter w wygenerowanym haśle.</translation> + </message> + <message> + <source>Use uppercase characters in the generated password.</source> + <translation>Użyj dużych liter w wygenerowanym haśle.</translation> + </message> + <message> + <source>Use numbers in the generated password.</source> + <translation>Użyj liczb w wygenerowanym haśle.</translation> + </message> + <message> + <source>Use special characters in the generated password.</source> + <translation>Użyj znaków specjalnych w wygenerowanym haśle.</translation> + </message> + <message> + <source>Use extended ASCII in the generated password.</source> + <translation>Użyj rozszerzone ASCII w wygenerowanym haśle.</translation> + </message> </context> <context> <name>QtIOCompressor</name> <message> <source>Internal zlib error when compressing: </source> - <translation>Błąd wewnętrzny zlib podczas kompresowania:</translation> + <translation>Błąd wewnętrzny zlib podczas kompresowania: </translation> </message> <message> <source>Error writing to underlying device: </source> - <translation>Błąd w zapisie na urządzenie:</translation> + <translation>Błąd w zapisie na urządzenie: </translation> </message> <message> <source>Error opening underlying device: </source> - <translation>Błąd w otwieraniu z urządzenia:</translation> + <translation>Błąd w otwieraniu z urządzenia: </translation> </message> <message> <source>Error reading data from underlying device: </source> - <translation>Błąd w odczycie danych z urządzenia:</translation> + <translation>Błąd w odczycie danych z urządzenia: </translation> </message> <message> <source>Internal zlib error when decompressing: </source> - <translation>Błąd wewnętrzny zlib podczas dekompresowania:</translation> + <translation>Błąd wewnętrzny zlib podczas dekompresowania: </translation> </message> </context> <context> <name>QtIOCompressor::open</name> <message> <source>The gzip format not supported in this version of zlib.</source> - <translation>Format gzip nie wspierany przez tą wersję zlib.</translation> + <translation>Format gzip nie wspierany przez tę wersję zlib.</translation> </message> <message> <source>Internal zlib error: </source> - <translation>Błąd wewnętrzny zlib:</translation> + <translation>Błąd wewnętrzny zlib: </translation> </message> </context> <context> @@ -3473,7 +3714,7 @@ Proszę odblokować wybraną bazę albo wybrać inną, która jest odblokowana.< </message> <message numerus="yes"> <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Pomyślnie usunięto %n klucz szyfrowania z ustawień KeePassX/Http.</numerusform><numerusform>Pomyślnie usunięto %n klucze szyfrowania z ustawień KeePassX/Http.</numerusform><numerusform>Pomyślnie usunięto %n kluczy szyfrowania z ustawień KeePassX/Http.</numerusform><numerusform>Pomyślnie usunięto %n kluczy szyfrowania z ustawień KeePassX/Http.</numerusform></translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -3505,7 +3746,7 @@ Proszę odblokować wybraną bazę albo wybrać inną, która jest odblokowana.< </message> <message numerus="yes"> <source>Successfully removed permissions from %n entries.</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Pomyślnie usunięto uprawnienia z %n wpisu.</numerusform><numerusform>Pomyślnie usunięto uprawnienia z %n wpisów.</numerusform><numerusform>Pomyślnie usunięto uprawnienia z %n wpisów.</numerusform><numerusform>Pomyślnie usunięto uprawnienia z %n wpisów.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -3587,7 +3828,7 @@ Proszę odblokować wybraną bazę albo wybrać inną, która jest odblokowana.< </message> <message> <source>Hide the Details view</source> - <translation type="unfinished"/> + <translation>Ukryj widok Szczegóły</translation> </message> <message> <source>Show a system tray icon</source> @@ -3603,7 +3844,7 @@ Proszę odblokować wybraną bazę albo wybrać inną, która jest odblokowana.< </message> <message> <source>Dark system tray icon</source> - <translation type="unfinished"/> + <translation>Ciemna ikona w zasobniku systemowym</translation> </message> <message> <source>Language</source> @@ -3615,11 +3856,11 @@ Proszę odblokować wybraną bazę albo wybrać inną, która jest odblokowana.< </message> <message> <source>Use entry title to match windows for global Auto-Type</source> - <translation type="unfinished"/> + <translation>Użyj tytułu wpisy, aby dopasować okna dla globalnego auto-uzupełniania</translation> </message> <message> <source>Use entry URL to match windows for global Auto-Type</source> - <translation type="unfinished"/> + <translation>Użyj adresu URL wpisy, aby dopasować okna dla globalnego auto-uzupełniania</translation> </message> <message> <source>Always ask before performing Auto-Type</source> @@ -3638,6 +3879,30 @@ Proszę odblokować wybraną bazę albo wybrać inną, która jest odblokowana.< <comment>Milliseconds</comment> <translation> ms</translation> </message> + <message> + <source>Startup</source> + <translation>Uruchamianie</translation> + </message> + <message> + <source>File Management</source> + <translation>Zarządzanie plikami</translation> + </message> + <message> + <source>Safely save database files (may be incompatible with Dropbox, etc)</source> + <translation>Bezpiecznie zapisuj pliki bazy danych (może być niezgodne z Dropbox itp.)</translation> + </message> + <message> + <source>Backup database file before saving</source> + <translation>Utwórz kopię zapasową pliku bazy danych przed zapisaniem</translation> + </message> + <message> + <source>Entry Management</source> + <translation>Zarządzanie wpisami</translation> + </message> + <message> + <source>General</source> + <translation>Ogólne</translation> + </message> </context> <context> <name>SettingsWidgetSecurity</name> @@ -3652,7 +3917,7 @@ Proszę odblokować wybraną bazę albo wybrać inną, która jest odblokowana.< <message> <source> sec</source> <comment>Seconds</comment> - <translation>s</translation> + <translation> s</translation> </message> <message> <source>Lock databases after inactivity of</source> @@ -3680,11 +3945,11 @@ Proszę odblokować wybraną bazę albo wybrać inną, która jest odblokowana.< </message> <message> <source>Hide passwords in the preview panel</source> - <translation type="unfinished"/> + <translation>Ukryj hasła w panelu podglądu</translation> </message> <message> <source>Hide entry notes by default</source> - <translation type="unfinished"/> + <translation>Domyślnie ukrywaj wpisy notatek</translation> </message> <message> <source>Privacy</source> @@ -3694,6 +3959,11 @@ Proszę odblokować wybraną bazę albo wybrać inną, która jest odblokowana.< <source>Use Google as fallback for downloading website icons</source> <translation>Użyj Google jako zastępstwa dla pobierania ikon witryn internetowych</translation> </message> + <message> + <source>Re-lock previously locked database after performing Auto-Type</source> + <translation>Ponownie zablokuj poprzednio zablokowaną bazę danych po wykonaniu auto-uzupełninia +</translation> + </message> </context> <context> <name>SetupTotpDialog</name> @@ -3707,11 +3977,11 @@ Proszę odblokować wybraną bazę albo wybrać inną, która jest odblokowana.< </message> <message> <source>Default RFC 6238 token settings</source> - <translation type="unfinished"/> + <translation>Domyślne ustawienia tokenu RFC 6238</translation> </message> <message> <source>Steam token settings</source> - <translation type="unfinished"/> + <translation>Ustawienia tokenu Steam</translation> </message> <message> <source>Use custom settings</source> @@ -3740,7 +4010,7 @@ Proszę odblokować wybraną bazę albo wybrać inną, która jest odblokowana.< <message> <source> sec</source> <comment>Seconds</comment> - <translation>s</translation> + <translation> s</translation> </message> </context> <context> @@ -3775,10 +4045,6 @@ Proszę odblokować wybraną bazę albo wybrać inną, która jest odblokowana.< </context> <context> <name>WelcomeWidget</name> - <message> - <source>Welcome to KeePassXC</source> - <translation>Witaj w KeePassXC</translation> - </message> <message> <source>Start storing your passwords securely in a KeePassXC database</source> <translation>Zacznij bezpiecznie przechowywać swoje hasła w bazie danych KeePassXC</translation> @@ -3803,12 +4069,16 @@ Proszę odblokować wybraną bazę albo wybrać inną, która jest odblokowana.< <source>Recent databases</source> <translation>Niedawne bazy danych</translation> </message> + <message> + <source>Welcome to KeePassXC %1</source> + <translation>Witaj w KeePassXC %1</translation> + </message> </context> <context> <name>main</name> <message> <source>Remove an entry from the database.</source> - <translation type="unfinished"/> + <translation>Usuń wpis z bazy danych.</translation> </message> <message> <source>Path of the database.</source> @@ -3816,7 +4086,7 @@ Proszę odblokować wybraną bazę albo wybrać inną, która jest odblokowana.< </message> <message> <source>Path of the entry to remove.</source> - <translation type="unfinished"/> + <translation>Ścieżka wpisu do usunięcia.</translation> </message> <message> <source>KeePassXC - cross-platform password manager</source> @@ -3840,7 +4110,7 @@ Proszę odblokować wybraną bazę albo wybrać inną, która jest odblokowana.< </message> <message> <source>Parent window handle</source> - <translation type="unfinished"/> + <translation>Uchwyt okna nadrzędnego</translation> </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_pt_BR.ts b/share/translations/keepassx_pt_BR.ts index c842ae335..bfe0d1066 100644 --- a/share/translations/keepassx_pt_BR.ts +++ b/share/translations/keepassx_pt_BR.ts @@ -17,10 +17,6 @@ <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> <translation>KeePassXC é distribuído nos termos da Licença Pública Geral (GPL), versão 2 ou (à sua escolha) versão 3, do GNU.</translation> </message> - <message> - <source>Project Maintainers:</source> - <translation>Mantedores do Projeto:</translation> - </message> <message> <source>Contributors</source> <translation>Colaboradores</translation> @@ -53,7 +49,7 @@ </message> <message> <source>Distribution: %1</source> - <translation type="unfinished"/> + <translation>Distribuição: %1</translation> </message> <message> <source>Libraries:</source> @@ -71,6 +67,19 @@ Kernel: %3 %4</translation> <source>Enabled extensions:</source> <translation>Extensões habilitadas:</translation> </message> + <message> + <source>Project Maintainers:</source> + <translation>Mantedores do Projeto:</translation> + </message> + <message> + <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Build Type: %1 +</source> + <translation type="unfinished"/> + </message> </context> <context> <name>AccessControlDialog</name> @@ -150,6 +159,25 @@ Selecione se deseja permitir o acesso.</translation> <translation>Sequência pré-definida</translation> </message> </context> +<context> + <name>AutoTypeMatchModel</name> + <message> + <source>Group</source> + <translation>Grupo</translation> + </message> + <message> + <source>Title</source> + <translation>Título</translation> + </message> + <message> + <source>Username</source> + <translation>Nome de usuário</translation> + </message> + <message> + <source>Sequence</source> + <translation>Sequência</translation> + </message> +</context> <context> <name>AutoTypeSelectDialog</name> <message> @@ -243,7 +271,7 @@ Selecione se deseja permitir o acesso.</translation> </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation type="unfinished"/> + <translation>Retorna apenas os melhores encontrados para um URL específico em vez de todas entradas para o domínio todo.</translation> </message> <message> <source>&Return only best-matching credentials</source> @@ -512,7 +540,7 @@ Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.< </message> <message> <source>Legacy key file format</source> - <translation type="unfinished"/> + <translation>Formato de chave antigo</translation> </message> <message> <source>You are using a legacy key file format which may become @@ -523,7 +551,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> - <translation type="unfinished"/> + <translation>Mudança da senha mestre falhou: YubiKey não inserido.</translation> </message> </context> <context> @@ -569,7 +597,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Text is qualified by</source> - <translation type="unfinished"/> + <translation>Texto é qualificado por</translation> </message> <message> <source>Fields are separated by</source> @@ -589,7 +617,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Consider '\' an escape character</source> - <translation type="unfinished"/> + <translation>Considere '\' como caractere de escape</translation> </message> <message> <source>Preview</source> @@ -613,7 +641,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Imported from CSV file</source> - <translation type="unfinished"/> + <translation>Importado do arquivo CSV</translation> </message> <message> <source>Original data: </source> @@ -621,11 +649,11 @@ Please consider generating a new key file.</source> </message> <message> <source>Error(s) detected in CSV file !</source> - <translation type="unfinished"/> + <translation>Erro(s) detectado(s) no arquivo CSV!</translation> </message> <message> <source> more messages skipped]</source> - <translation type="unfinished"/> + <translation>mais mensagens puladas]</translation> </message> <message> <source>Error</source> @@ -634,7 +662,8 @@ Please consider generating a new key file.</source> <message> <source>CSV import: writer has errors: </source> - <translation type="unfinished"/> + <translation>Importar CSV: escritor tem erros: +</translation> </message> </context> <context> @@ -687,7 +716,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Challenge Response:</source> - <translation type="unfinished"/> + <translation>Resposta do Desafio:</translation> </message> <message> <source>Unable to open the database.</source> @@ -699,7 +728,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Legacy key file format</source> - <translation type="unfinished"/> + <translation>Formato de chave antigo</translation> </message> <message> <source>You are using a legacy key file format which may become @@ -710,7 +739,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Don't show this warning again</source> - <translation type="unfinished"/> + <translation>Não mostrar este alerta novamente</translation> </message> <message> <source>All files</source> @@ -775,7 +804,7 @@ Você pode salvá-lo agora.</translation> <message> <source>Number of rounds too high</source> <comment>Key transformation rounds</comment> - <translation type="unfinished"/> + <translation>Número de voltas muito alto</translation> </message> <message> <source>You are using a very high number of key transform rounds with Argon2. @@ -785,7 +814,7 @@ If you keep this number, your database may take hours or days (or even longer) t </message> <message> <source>Understood, keep number</source> - <translation type="unfinished"/> + <translation>Entendido, manter o número</translation> </message> <message> <source>Cancel</source> @@ -794,7 +823,7 @@ If you keep this number, your database may take hours or days (or even longer) t <message> <source>Number of rounds too low</source> <comment>Key transformation rounds</comment> - <translation type="unfinished"/> + <translation>Número de voltas muito baixo</translation> </message> <message> <source>You are using a very low number of key transform rounds with AES-KDF. @@ -804,18 +833,28 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>KDF unchanged</source> - <translation type="unfinished"/> + <translation>KDF não modificado</translation> </message> <message> <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> <translation type="unfinished"/> </message> + <message numerus="yes"> + <source> MiB</source> + <comment>Abbreviation for Mebibytes (KDF settings)</comment> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source> thread(s)</source> + <comment>Threads for parallel execution (KDF settings)</comment> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> </context> <context> <name>DatabaseSettingsWidgetEncryption</name> <message> <source>Encryption Algorithm:</source> - <translation type="unfinished"/> + <translation>Algoritmo de Encriptação:</translation> </message> <message> <source>AES: 256 Bit (default)</source> @@ -827,7 +866,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Key Derivation Function:</source> - <translation type="unfinished"/> + <translation>Função de Derivação de Chave:</translation> </message> <message> <source>Transform rounds:</source> @@ -835,30 +874,22 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Benchmark 1-second delay</source> - <translation type="unfinished"/> + <translation>Testar atraso de 1 segundo</translation> </message> <message> <source>Memory Usage:</source> <translation>Uso de Memória:</translation> </message> - <message> - <source> MB</source> - <translation>MB</translation> - </message> <message> <source>Parallelism:</source> <translation>Paralelismo:</translation> </message> - <message> - <source> thread</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DatabaseSettingsWidgetGeneral</name> <message> <source>Database Meta Data</source> - <translation type="unfinished"/> + <translation>Metadados do Banco de Dados</translation> </message> <message> <source>Database name:</source> @@ -892,6 +923,14 @@ If you keep this number, your database may be too easy to crack!</source> <source>Use recycle bin</source> <translation>Usar lixeira</translation> </message> + <message> + <source>Additional Database Settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable &compression (recommended)</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DatabaseTabWidget</name> @@ -922,7 +961,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>File opened in read only mode.</source> - <translation type="unfinished"/> + <translation>Arquivo aberto no modo somente leitura.</translation> </message> <message> <source>Open CSV file</source> @@ -1014,6 +1053,15 @@ Otherwise your changes are lost.</source> Você deseja salvar o banco de dados antes de travá-lo? Do contrário, suas alterações serão perdidas.</translation> </message> + <message> + <source>Disable safe saves?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DatabaseWidget</name> @@ -1099,7 +1147,7 @@ Do contrário, suas alterações serão perdidas.</translation> </message> <message> <source>File has changed</source> - <translation type="unfinished"/> + <translation>O arquivo foi modificado</translation> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -1124,6 +1172,10 @@ Do you want to merge your changes?</source> </message> <message> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> + <translation>Você tem certeza que deseja apagar permanentemente tudo que está na lixeira?</translation> + </message> + <message> + <source>Entry updated successfully.</source> <translation type="unfinished"/> </message> </context> @@ -1163,7 +1215,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Searching</source> - <translation type="unfinished"/> + <translation>Busca</translation> </message> <message> <source>Attributes</source> @@ -1302,16 +1354,28 @@ Do you want to merge your changes?</source> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n semana(s)</numerusform><numerusform>%n semana(s)</numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n mese(s)</numerusform><numerusform>%n mese(s)</numerusform></translation> </message> <message> <source>1 year</source> <translation>1 ano</translation> </message> + <message> + <source>Apply generated password?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to apply the generated password to this entry?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAdvanced</name> @@ -1343,6 +1407,14 @@ Do you want to merge your changes?</source> <source>Attachments</source> <translation>Anexos</translation> </message> + <message> + <source>Foreground Color:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Background Color:</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -1375,12 +1447,8 @@ Do you want to merge your changes?</source> <translation>Título da Janela:</translation> </message> <message> - <source>Use default se&quence</source> - <translation>Usar se&quência pré-definida</translation> - </message> - <message> - <source>Set custo&m sequence:</source> - <translation>Definir sequência &personalizada:</translation> + <source>Use a specific sequence for this association:</source> + <translation type="unfinished"/> </message> </context> <context> @@ -1430,7 +1498,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Toggle the checkbox to reveal the notes section.</source> - <translation type="unfinished"/> + <translation>Altere a caixa de checagem para revelar a seção de notas.</translation> </message> <message> <source>Username:</source> @@ -1449,7 +1517,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Remove key from agent after</source> - <translation type="unfinished"/> + <translation>Remover a chave do agente após</translation> </message> <message> <source> seconds</source> @@ -1457,11 +1525,11 @@ Do you want to merge your changes?</source> </message> <message> <source>Fingerprint</source> - <translation type="unfinished"/> + <translation>Fingerprint</translation> </message> <message> <source>Remove key from agent when database is closed/locked</source> - <translation type="unfinished"/> + <translation>Remover chave do agente ao fechar/bloquear o banco de dados</translation> </message> <message> <source>Public key</source> @@ -1469,7 +1537,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Add key to agent when database is opened/unlocked</source> - <translation type="unfinished"/> + <translation>Adicionar chave ao agente quando abrir/desbloquear o banco de dados</translation> </message> <message> <source>Comment</source> @@ -1477,7 +1545,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Decrypt</source> - <translation type="unfinished"/> + <translation>Descriptografar</translation> </message> <message> <source>n/a</source> @@ -1514,7 +1582,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Require user confirmation when this key is used</source> - <translation type="unfinished"/> + <translation>Requer confirmação do usuário quando essa chave é usada</translation> </message> </context> <context> @@ -1576,11 +1644,11 @@ Do you want to merge your changes?</source> </message> <message> <source>&Use default Auto-Type sequence of parent group</source> - <translation type="unfinished"/> + <translation>&Usar a sequência padrão de Auto-Digitar do grupo pai</translation> </message> <message> <source>Set default Auto-Type se&quence</source> - <translation type="unfinished"/> + <translation>Definir sequência padrão de Auto-Digitar</translation> </message> </context> <context> @@ -1611,7 +1679,8 @@ Do you want to merge your changes?</source> </message> <message> <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation type="unfinished"/> + <translation>Dica: Você pode ativar o Google como um recurso em +Ferramentas>Configurações>Segurança</translation> </message> <message> <source>Images</source> @@ -1639,7 +1708,7 @@ Do you want to merge your changes?</source> </message> <message> <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> - <translation type="unfinished"/> + <translation>Este ícone é usado por %1 entradas, e será substituido pelo ícone padrão. Você tem certeza que deseja apaga-lo?</translation> </message> </context> <context> @@ -1660,6 +1729,31 @@ Do you want to merge your changes?</source> <source>Uuid:</source> <translation>Uuid:</translation> </message> + <message> + <source>Plugin Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove</source> + <translation>Remover</translation> + </message> + <message> + <source>Delete plugin data?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Value</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Entry</name> @@ -1729,7 +1823,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Confirm overwrite</source> - <translation type="unfinished"/> + <translation>Confirmar sobrescrever</translation> </message> <message> <source>Unable to save attachments: @@ -1749,7 +1843,8 @@ Do you want to merge your changes?</source> <message> <source>Unable to open files: %1</source> - <translation type="unfinished"/> + <translation>Impossibilitado de abrir arquivos: +%1</translation> </message> </context> <context> @@ -1801,6 +1896,65 @@ Do you want to merge your changes?</source> <source>URL</source> <translation>URL</translation> </message> + <message> + <source>Never</source> + <translation>Nunca</translation> + </message> + <message> + <source>Password</source> + <translation>Senha</translation> + </message> + <message> + <source>Notes</source> + <translation>Notas</translation> + </message> + <message> + <source>Expires</source> + <translation>Expira em</translation> + </message> + <message> + <source>Created</source> + <translation type="unfinished"/> + </message> + <message> + <source>Modified</source> + <translation type="unfinished"/> + </message> + <message> + <source>Accessed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation>Anexos</translation> + </message> +</context> +<context> + <name>EntryView</name> + <message> + <source>Customize View</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide Usernames</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide Passwords</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fit to window</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fit to contents</source> + <translation type="unfinished"/> + </message> + <message> + <source>Reset to defaults</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Group</name> @@ -1870,6 +2024,10 @@ Do you want to merge your changes?</source> <source>Ensure that the password contains characters from every group</source> <translation>Verificar se a senha contém caracteres de todos os grupos</translation> </message> + <message> + <source>Extended ASCII</source> + <translation type="unfinished"/> + </message> </context> <context> <name>KMessageWidget</name> @@ -1890,7 +2048,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Unable to issue challenge-response.</source> - <translation type="unfinished"/> + <translation>Impossibilitado de expedir o desafio-resposta.</translation> </message> <message> <source>Wrong key or database file is corrupt.</source> @@ -1901,7 +2059,7 @@ Do you want to merge your changes?</source> <name>Kdbx3Writer</name> <message> <source>Unable to issue challenge-response.</source> - <translation type="unfinished"/> + <translation>Impossibilitado de expedir o desafio-resposta.</translation> </message> <message> <source>Unable to calculate master key</source> @@ -2103,7 +2261,10 @@ Do you want to merge your changes?</source> You can import it by clicking on Database > 'Import KeePass 1 database...'. This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> - <translation type="unfinished"/> + <translation>O arquivo selecionado é um velho banco de dados do KeePass 1 (.kdb) + +Você pode importá-lo clicando em Banco de Dados > "Importar banco de dados do KeePss 1..." +Isto é uma migração de caminho único. Você não poderá abrir o banco de dados importado com a velha versão KeePassX 0.4.</translation> </message> <message> <source>Unsupported KeePass 2 database version.</source> @@ -2118,11 +2279,11 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>No root group</source> - <translation type="unfinished"/> + <translation>Sem grupo raiz</translation> </message> <message> <source>Missing icon uuid or data</source> - <translation type="unfinished"/> + <translation>Faltando uuid ou dados do ícone</translation> </message> <message> <source>Missing custom data key or value</source> @@ -2401,15 +2562,15 @@ This is a one-way migration. You won't be able to open the imported databas <name>Main</name> <message> <source>Existing single-instance lock file is invalid. Launching new instance.</source> - <translation type="unfinished"/> + <translation>O arquivo cadeado de instância única existente é inválido. Iniciando nova instância.</translation> </message> <message> <source>The lock file could not be created. Single-instance mode disabled.</source> - <translation type="unfinished"/> + <translation>O arquivo cadeado não pode ser criado. Modo de instância única desabilitado.</translation> </message> <message> <source>Another instance of KeePassXC is already running.</source> - <translation type="unfinished"/> + <translation>Outra instância do KeePassXC já está rodando.</translation> </message> <message> <source>Fatal error while testing the cryptographic functions.</source> @@ -2436,7 +2597,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>&Help</source> - <translation type="unfinished"/> + <translation>&Ajuda</translation> </message> <message> <source>E&ntries</source> @@ -2468,7 +2629,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>&Open database...</source> - <translation type="unfinished"/> + <translation>&Abrir banco de dados...</translation> </message> <message> <source>&Save database</source> @@ -2512,11 +2673,11 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Sa&ve database as...</source> - <translation type="unfinished"/> + <translation>Sal&var banco de dados como...</translation> </message> <message> <source>Change &master key...</source> - <translation type="unfinished"/> + <translation>Alterar chave &mestra...</translation> </message> <message> <source>&Database settings</source> @@ -2576,7 +2737,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Copy title to clipboard</source> - <translation type="unfinished"/> + <translation>Copiar título para a área de transferência</translation> </message> <message> <source>&URL</source> @@ -2584,7 +2745,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Copy URL to clipboard</source> - <translation type="unfinished"/> + <translation>Copiar URL para a área de transferência</translation> </message> <message> <source>&Notes</source> @@ -2592,11 +2753,11 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Copy notes to clipboard</source> - <translation type="unfinished"/> + <translation>Copiar notas para a área de transferência</translation> </message> <message> <source>&Export to CSV file...</source> - <translation type="unfinished"/> + <translation>&Exportar para arquivo CSV...</translation> </message> <message> <source>Import KeePass 1 database...</source> @@ -2604,7 +2765,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Import CSV file...</source> - <translation type="unfinished"/> + <translation>Importar arquivo CSV...</translation> </message> <message> <source>Re&pair database...</source> @@ -2632,7 +2793,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Access error for config file %1</source> - <translation type="unfinished"/> + <translation>Erro de acesso para o arquivo de configuração %1</translation> </message> <message> <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> @@ -2676,6 +2837,12 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Please touch the button on your YubiKey!</source> + <translation>Por favor pressione o botão em seu YubiKey!</translation> + </message> + <message> + <source>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</source> <translation type="unfinished"/> </message> </context> @@ -2683,27 +2850,23 @@ This is a one-way migration. You won't be able to open the imported databas <name>OpenSSHKey</name> <message> <source>Invalid key file, expecting an OpenSSH key</source> - <translation type="unfinished"/> + <translation>Arquivo chave inválido, é esperado uma chave OpenSSH</translation> </message> <message> <source>PEM boundary mismatch</source> <translation type="unfinished"/> </message> - <message> - <source>This is not an OpenSSH key, only modern keys are supported</source> - <translation type="unfinished"/> - </message> <message> <source>Base64 decoding failed</source> - <translation type="unfinished"/> + <translation>Decodificação Base64 falhou</translation> </message> <message> <source>Key file way too small.</source> - <translation type="unfinished"/> + <translation>O modo do arquivo chave é muito pequeno.</translation> </message> <message> <source>Key file magic header id invalid</source> - <translation type="unfinished"/> + <translation>O id do cabeçalho mágico do arquivo chave é invalido</translation> </message> <message> <source>Found zero keys</source> @@ -2715,62 +2878,70 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Corrupted key file, reading private key failed</source> - <translation type="unfinished"/> + <translation>Arquivo chave corrompido, leitura da chave privada falhou</translation> </message> <message> <source>No private key payload to decrypt</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown cipher: </source> - <translation>Cifra desconhecida:</translation> + <translation>Chave privada não carregada para decriptar</translation> </message> <message> <source>Trying to run KDF without cipher</source> - <translation type="unfinished"/> + <translation>Tentando rodar KDF sem cifra</translation> </message> <message> <source>Passphrase is required to decrypt this key</source> - <translation type="unfinished"/> + <translation>Senha é necessária para decriptar esta chave</translation> </message> <message> <source>Key derivation failed, key file corrupted?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown KDF: </source> - <translation type="unfinished"/> + <translation>A derivação da chave falhou, o arquivo chave esta corrompido?</translation> </message> <message> <source>Decryption failed, wrong passphrase?</source> - <translation type="unfinished"/> + <translation>Decriptação falhou, senha errada?</translation> </message> <message> <source>Unexpected EOF while reading public key</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown key type: </source> - <translation type="unfinished"/> + <translation>EOF inesperado enquanto lendo a chave pública.</translation> </message> <message> <source>Unexpected EOF while reading private key</source> - <translation type="unfinished"/> + <translation>EOF inesperado enquanto lendo a chave privada.</translation> </message> <message> <source>Can't write public key as it is empty</source> - <translation type="unfinished"/> + <translation>Não é possível escrever a chave pública enquanto estiver vazio.</translation> </message> <message> <source>Unexpected EOF when writing public key</source> - <translation type="unfinished"/> + <translation>EOF inesperado enquanto escrevendo a chave pública.</translation> </message> <message> <source>Can't write private key as it is empty</source> - <translation type="unfinished"/> + <translation>EOF inesperado enquanto escrevendo a chave privada.</translation> </message> <message> <source>Unexpected EOF when writing private key</source> + <translation>EOF inesperado enquanto escrevendp a chave privada.</translation> + </message> + <message> + <source>Unsupported key type: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cipher IV is too short for MD5 kdf</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: %1</source> <translation type="unfinished"/> </message> </context> @@ -2782,7 +2953,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> - <translation type="unfinished"/> + <translation>Isso é necessário para acessar seus bancos de dados com o ChomeIPass ou PassIFox</translation> </message> <message> <source>Enable KeePassHTTP server</source> @@ -2799,11 +2970,11 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation type="unfinished"/> + <translation>Retorna apenas os melhores encontrados para um URL específico em vez de todas entradas para o domínio todo.</translation> </message> <message> <source>&Return only best matching entries</source> - <translation type="unfinished"/> + <translation>&Retorna apenas as melhores entradas encontradas</translation> </message> <message> <source>Re&quest to unlock the database if it is locked</source> @@ -2811,7 +2982,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation type="unfinished"/> + <translation>Apenas entradas com o mesmo esquema (http://, https://, ftp://, ...) são retornadas.</translation> </message> <message> <source>&Match URL schemes</source> @@ -3362,6 +3533,51 @@ Available commands: <source>SSH Agent</source> <translation>Agente SSH</translation> </message> + <message> + <source>Generate a new random diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Word count for the diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>count</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wordlist for the diceware generator. +[Default: EFF English]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a new random password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length of the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use lowercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use uppercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use numbers in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use special characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use extended ASCII in the generated password.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>QtIOCompressor</name> @@ -3527,7 +3743,7 @@ Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.< </message> <message> <source>Access error for config file %1</source> - <translation type="unfinished"/> + <translation>Erro de acesso para o arquivo de configuração %1</translation> </message> </context> <context> @@ -3633,6 +3849,30 @@ Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.< <comment>Milliseconds</comment> <translation>ms</translation> </message> + <message> + <source>Startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>File Management</source> + <translation type="unfinished"/> + </message> + <message> + <source>Safely save database files (may be incompatible with Dropbox, etc)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Backup database file before saving</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry Management</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>Geral</translation> + </message> </context> <context> <name>SettingsWidgetSecurity</name> @@ -3689,6 +3929,10 @@ Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.< <source>Use Google as fallback for downloading website icons</source> <translation type="unfinished"/> </message> + <message> + <source>Re-lock previously locked database after performing Auto-Type</source> + <translation type="unfinished"/> + </message> </context> <context> <name>SetupTotpDialog</name> @@ -3770,10 +4014,6 @@ Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.< </context> <context> <name>WelcomeWidget</name> - <message> - <source>Welcome to KeePassXC</source> - <translation>Bem vindo ao KeePassXC</translation> - </message> <message> <source>Start storing your passwords securely in a KeePassXC database</source> <translation>Começe a guardar suas senhas de maneira segura em um banco de dados do KeePassXC</translation> @@ -3798,6 +4038,10 @@ Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.< <source>Recent databases</source> <translation>Bancos de dados recentes</translation> </message> + <message> + <source>Welcome to KeePassXC %1</source> + <translation type="unfinished"/> + </message> </context> <context> <name>main</name> diff --git a/share/translations/keepassx_pt_PT.ts b/share/translations/keepassx_pt_PT.ts index ed1ddbaaa..d3ecd7b61 100644 --- a/share/translations/keepassx_pt_PT.ts +++ b/share/translations/keepassx_pt_PT.ts @@ -17,10 +17,6 @@ <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> <translation>KeePassXC é distribuído sob os termos da GNU General Public License (GPL) versão 2 ou (em sua opção) versão 3.</translation> </message> - <message> - <source>Project Maintainers:</source> - <translation>Manutenção do projeto:</translation> - </message> <message> <source>Contributors</source> <translation>Colaboradores</translation> @@ -71,6 +67,19 @@ Kernel: %3 %4</translation> <source>Enabled extensions:</source> <translation>Extensões ativas:</translation> </message> + <message> + <source>Project Maintainers:</source> + <translation>Manutenção do projeto:</translation> + </message> + <message> + <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Build Type: %1 +</source> + <translation type="unfinished"/> + </message> </context> <context> <name>AccessControlDialog</name> @@ -101,7 +110,7 @@ Selecione se deseja permitir o acesso.</translation> <name>AgentSettingsWidget</name> <message> <source>Enable SSH Agent (requires restart)</source> - <translation type="unfinished"/> + <translation>Ativar agente SSH (tem que reiniciar)</translation> </message> </context> <context> @@ -120,19 +129,19 @@ Selecione se deseja permitir o acesso.</translation> </message> <message> <source>The Syntax of your Auto-Type statement is incorrect!</source> - <translation type="unfinished"/> + <translation>A sintaxe da instrução de escrita automática está errada!</translation> </message> <message> <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>O comando de escrita automática tem um atraso muito grande. Deseja mesmo continuar?</translation> </message> <message> <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>O comando de escrita automática tem uma pressão de teclas muito lento. Deseja mesmo continuar?</translation> </message> <message> <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>O comando de escrita automática contém argumentos que se repetem muitas vezes. Deseja mesmo continuar?</translation> </message> </context> <context> @@ -150,6 +159,25 @@ Selecione se deseja permitir o acesso.</translation> <translation>Sequência padrão</translation> </message> </context> +<context> + <name>AutoTypeMatchModel</name> + <message> + <source>Group</source> + <translation>Grupo</translation> + </message> + <message> + <source>Title</source> + <translation>Título</translation> + </message> + <message> + <source>Username</source> + <translation>Nome de utilizador</translation> + </message> + <message> + <source>Sequence</source> + <translation>Sequência</translation> + </message> +</context> <context> <name>AutoTypeSelectDialog</name> <message> @@ -165,7 +193,7 @@ Selecione se deseja permitir o acesso.</translation> <name>BrowserAccessControlDialog</name> <message> <source>KeePassXC-Browser Confirm Access</source> - <translation type="unfinished"/> + <translation>KeePassXC Navegador - Confirmar acesso</translation> </message> <message> <source>Remember this decision</source> @@ -194,11 +222,11 @@ Selecione se deseja permitir o acesso.</translation> </message> <message> <source>This is required for accessing your databases with KeePassXC-Browser</source> - <translation type="unfinished"/> + <translation>Isto é necessário para aceder às suas bases de dados com KeePassXC-Browser</translation> </message> <message> <source>Enable KeepassXC browser integration</source> - <translation type="unfinished"/> + <translation>Ativar integração com o navegador</translation> </message> <message> <source>General</source> @@ -206,7 +234,7 @@ Selecione se deseja permitir o acesso.</translation> </message> <message> <source>Enable integration for these browsers:</source> - <translation type="unfinished"/> + <translation>Ativar integração para estes navegadores:</translation> </message> <message> <source>&Google Chrome</source> @@ -227,7 +255,7 @@ Selecione se deseja permitir o acesso.</translation> <message> <source>Show a &notification when credentials are requested</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Mostrar &notificação se as credenciais forem solicitadas</translation> </message> <message> <source>Re&quest to unlock the database if it is locked</source> @@ -235,11 +263,11 @@ Selecione se deseja permitir o acesso.</translation> </message> <message> <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> - <translation type="unfinished"/> + <translation>Apenas serão devolvidas as entradas com o mesmo esquema (http://, https://, ...).</translation> </message> <message> <source>&Match URL scheme (e.g., https://...)</source> - <translation type="unfinished"/> + <translation>Corresponder com os esque&mas do URL (https://...)</translation> </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> @@ -247,25 +275,25 @@ Selecione se deseja permitir o acesso.</translation> </message> <message> <source>&Return only best-matching credentials</source> - <translation type="unfinished"/> + <translation>Devolve&r apenas as credenciais mais parecidas</translation> </message> <message> <source>Sort &matching credentials by title</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Ordenar &entradas por título</translation> </message> <message> <source>Sort matching credentials by &username</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Ordenar credenciais coincidentes por nome de &utilizador</translation> </message> <message> <source>&Disconnect all browsers</source> - <translation type="unfinished"/> + <translation>&Desconectar de todos os navegadores</translation> </message> <message> <source>Forget all remembered &permissions</source> - <translation type="unfinished"/> + <translation>Esquecer todas as &permissões memorizadas</translation> </message> <message> <source>Advanced</source> @@ -274,12 +302,12 @@ Selecione se deseja permitir o acesso.</translation> <message> <source>Never &ask before accessing credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Nunc&a perguntar antes de aceder às credenciais</translation> </message> <message> <source>Never ask before &updating credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Nun&ca perguntar antes de atualizar as credenciais</translation> </message> <message> <source>Only the selected database has to be connected with a client.</source> @@ -288,7 +316,7 @@ Selecione se deseja permitir o acesso.</translation> <message> <source>Searc&h in all opened databases for matching credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Procurar em todas as base de dados abertas por credenciais semel&hantes</translation> </message> <message> <source>Automatically creating or updating string fields is not supported.</source> @@ -296,32 +324,32 @@ Selecione se deseja permitir o acesso.</translation> </message> <message> <source>&Return advanced string fields which start with "KPH: "</source> - <translation>Most&rar campos avançados que começam com "KPH: "</translation> + <translation>Most&rar campos avançados que começem com "KPH: "</translation> </message> <message> <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> - <translation type="unfinished"/> + <translation>Atualiza automaticamente o caminho do KeePassXC ou do caminho do binário keepassxc-proxy para os 'sripts' nativos de mensagens ao iniciar.</translation> </message> <message> <source>Update &native messaging manifest files at startup</source> - <translation type="unfinished"/> + <translation>Atualizar ficheiros de mensagens &nativas ao iniciar</translation> </message> <message> <source>Support a proxy application between KeePassXC and browser extension.</source> - <translation type="unfinished"/> + <translation>Suporte à utilização de uma aplicação proxy entre o KeePassXC a a extensão do navegador.</translation> </message> <message> <source>Use a &proxy application between KeePassXC and browser extension</source> - <translation type="unfinished"/> + <translation>Utilizar uma aplicação de &proxy entre o KeePassXC e a extensão do navegador</translation> </message> <message> <source>Use a custom proxy location if you installed a proxy manually.</source> - <translation type="unfinished"/> + <translation>Utilize um proxy personalizado caso o tenha instalado manualmente.</translation> </message> <message> <source>Use a &custom proxy location</source> <comment>Meant is the proxy for KeePassXC-Browser</comment> - <translation type="unfinished"/> + <translation>Utilizar pro&xy personalizado</translation> </message> <message> <source>Browse...</source> @@ -330,7 +358,7 @@ Selecione se deseja permitir o acesso.</translation> </message> <message> <source><b>Warning:</b> The following options can be dangerous!</source> - <translation type="unfinished"/> + <translation><b>AVISO</b>: as opções seguintes podem ser perigosas!</translation> </message> <message> <source>Executable Files (*.exe);;All Files (*.*)</source> @@ -338,11 +366,11 @@ Selecione se deseja permitir o acesso.</translation> </message> <message> <source>Executable Files (*)</source> - <translation type="unfinished"/> + <translation>Ficheiros executáveis (*)</translation> </message> <message> <source>Select custom proxy location</source> - <translation type="unfinished"/> + <translation>Selecionar localização do proxy personalizado</translation> </message> </context> <context> @@ -356,7 +384,10 @@ Selecione se deseja permitir o acesso.</translation> If you would like to allow it access to your KeePassXC database, give it a unique name to identify and accept it.</source> - <translation type="unfinished"/> + <translation>Recebeu um pedido de associação para a chave acima indicada. + +Se quiser permitir o acesso à sua base de dados do KeePassXC, +digite um nome identificável e aceite o pedido.</translation> </message> <message> <source>Save and allow access</source> @@ -369,7 +400,8 @@ give it a unique name to identify and accept it.</source> <message> <source>A shared encryption key with the name "%1" already exists. Do you want to overwrite it?</source> - <translation type="unfinished"/> + <translation>Já existe uma chave de cifra partilhada com o nome "%1". +Deseja substituir a chave existente?</translation> </message> <message> <source>KeePassXC: Update Entry</source> @@ -395,7 +427,7 @@ Desbloqueie a base de dados selecionada ou escolha outra que esteja desbloqueada </message> <message> <source>The active database does not contain a settings entry.</source> - <translation type="unfinished"/> + <translation>A base de dados ativa não contém uma entrada de definições.</translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -403,19 +435,19 @@ Desbloqueie a base de dados selecionada ou escolha outra que esteja desbloqueada </message> <message> <source>No shared encryption keys found in KeePassXC Settings.</source> - <translation type="unfinished"/> + <translation>Não foram encontradas chaves de cifra partilhadas nas definições do KeePassXC.</translation> </message> <message> <source>KeePassXC: Removed keys from database</source> - <translation>KeePassXC: Remover chaves da base de dados</translation> + <translation>KeePassXC: Chaves removidas da base de dados</translation> </message> <message numerus="yes"> <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Removidas com sucesso %n chave de cifra das definições do KeePassXC.</numerusform><numerusform>Removidas com sucesso %n chaves de cifra das definições do KeePassXC.</numerusform></translation> </message> <message> <source>Removing stored permissions…</source> - <translation type="unfinished"/> + <translation>A remover permissões guardadas...</translation> </message> <message> <source>Abort</source> @@ -427,7 +459,7 @@ Desbloqueie a base de dados selecionada ou escolha outra que esteja desbloqueada </message> <message numerus="yes"> <source>Successfully removed permissions from %n entry(s).</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Removidas com sucesso as permissões de %n entrada.</numerusform><numerusform>Removidas com sucesso as permissões de %n entradas.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -486,7 +518,7 @@ Desbloqueie a base de dados selecionada ou escolha outra que esteja desbloqueada </message> <message> <source>Unable to create Key File : </source> - <translation>Incapaz de criar o ficheiro-chave:</translation> + <translation>Não foi possível criar o ficheiro-chave:</translation> </message> <message> <source>Select a key file</source> @@ -512,14 +544,17 @@ Desbloqueie a base de dados selecionada ou escolha outra que esteja desbloqueada </message> <message> <source>Legacy key file format</source> - <translation type="unfinished"/> + <translation>Formato legado de ficheiro-chave</translation> </message> <message> <source>You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>Está a utilizar um formato legado que pode, no futuro, deixar +de ser suportado. + +Deve considerar a geração de uma novo ficheiro-chave.</translation> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -597,7 +632,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Column layout</source> - <translation>Disposição das colunas</translation> + <translation>Disposição de colunas</translation> </message> <message> <source>Not present in CSV file</source> @@ -646,7 +681,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Unable to calculate master key</source> - <translation>Impossível de calcular a chave-mestre</translation> + <translation>Não foi possível calcular a chave-mestre</translation> </message> </context> <context> @@ -661,7 +696,7 @@ Please consider generating a new key file.</source> </message> <message numerus="yes"> <source>%n column(s)</source> - <translation><numerusform>%n coluna</numerusform><numerusform>%n colunas</numerusform></translation> + <translation><numerusform>%n coluna,</numerusform><numerusform>%n colunas,</numerusform></translation> </message> </context> <context> @@ -692,7 +727,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Unable to open the database.</source> - <translation>Incapaz de abrir a base de dados.</translation> + <translation>Não foi possível abrir a base de dados.</translation> </message> <message> <source>Can't open key file</source> @@ -700,18 +735,21 @@ Please consider generating a new key file.</source> </message> <message> <source>Legacy key file format</source> - <translation type="unfinished"/> + <translation>Formato legado de ficheiro-chave</translation> </message> <message> <source>You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>Está a utilizar um formato legado que pode, no futuro, deixar +de ser suportado. + +Deve considerar a geração de uma novo ficheiro-chave.</translation> </message> <message> <source>Don't show this warning again</source> - <translation type="unfinished"/> + <translation>Não mostrar novamente</translation> </message> <message> <source>All files</source> @@ -742,7 +780,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Unable to open the database.</source> - <translation>Incapaz de abrir a base de dados.</translation> + <translation>Não foi possível abrir a base de dados.</translation> </message> <message> <source>Database opened fine. Nothing to do.</source> @@ -760,7 +798,7 @@ Agora já a pode guardar.</translation> </message> <message> <source>Unable to repair the database.</source> - <translation>Incapaz de reparar a base de dados.</translation> + <translation>Não foi possível reparar a base de dados.</translation> </message> </context> <context> @@ -776,17 +814,19 @@ Agora já a pode guardar.</translation> <message> <source>Number of rounds too high</source> <comment>Key transformation rounds</comment> - <translation type="unfinished"/> + <translation>Número de ciclos muito alto</translation> </message> <message> <source>You are using a very high number of key transform rounds with Argon2. If you keep this number, your database may take hours or days (or even longer) to open!</source> - <translation type="unfinished"/> + <translation>Está a utilizar um número muito alto para a transformação de chaves com Argon2. + +Se mantiver este número, a sua base de dados pode levar muitas horas/dias (ou ainda mais) para ser aberta!</translation> </message> <message> <source>Understood, keep number</source> - <translation type="unfinished"/> + <translation>Percebi, manter número</translation> </message> <message> <source>Cancel</source> @@ -795,21 +835,33 @@ If you keep this number, your database may take hours or days (or even longer) t <message> <source>Number of rounds too low</source> <comment>Key transformation rounds</comment> - <translation type="unfinished"/> + <translation>Número de ciclos muito baixo</translation> </message> <message> <source>You are using a very low number of key transform rounds with AES-KDF. If you keep this number, your database may be too easy to crack!</source> - <translation type="unfinished"/> + <translation>Está a utilizar um número muito baixo para a transformação de chaves com Argon2. + +Se mantiver este número, a sua base de dados pode ser desbloqueada muito facilmente!</translation> </message> <message> <source>KDF unchanged</source> - <translation type="unfinished"/> + <translation>KDF inalterado</translation> </message> <message> <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> - <translation type="unfinished"/> + <translation>Falha ao transformar a chave com os novos parâmetros KDF; KDF inalterado.</translation> + </message> + <message numerus="yes"> + <source> MiB</source> + <comment>Abbreviation for Mebibytes (KDF settings)</comment> + <translation><numerusform> MiB</numerusform><numerusform> MiB</numerusform></translation> + </message> + <message numerus="yes"> + <source> thread(s)</source> + <comment>Threads for parallel execution (KDF settings)</comment> + <translation><numerusform>processo</numerusform><numerusform>processos</numerusform></translation> </message> </context> <context> @@ -828,7 +880,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Key Derivation Function:</source> - <translation type="unfinished"/> + <translation>Função derivação de chave:</translation> </message> <message> <source>Transform rounds:</source> @@ -842,24 +894,16 @@ If you keep this number, your database may be too easy to crack!</source> <source>Memory Usage:</source> <translation>Utilização de memória:</translation> </message> - <message> - <source> MB</source> - <translation> MB</translation> - </message> <message> <source>Parallelism:</source> <translation>Paralelismo:</translation> </message> - <message> - <source> thread</source> - <translation>processo</translation> - </message> </context> <context> <name>DatabaseSettingsWidgetGeneral</name> <message> <source>Database Meta Data</source> - <translation type="unfinished"/> + <translation>Meta-dados da base de dados</translation> </message> <message> <source>Database name:</source> @@ -875,7 +919,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>History Settings</source> - <translation type="unfinished"/> + <translation>Definições do histórico</translation> </message> <message> <source>Max. history items:</source> @@ -893,6 +937,14 @@ If you keep this number, your database may be too easy to crack!</source> <source>Use recycle bin</source> <translation>Utilizar reciclagem</translation> </message> + <message> + <source>Additional Database Settings</source> + <translation>Definições extra da base de dados</translation> + </message> + <message> + <source>Enable &compression (recommended)</source> + <translation>Ativar compr&essão (recomendado)</translation> + </message> </context> <context> <name>DatabaseTabWidget</name> @@ -919,7 +971,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Unable to open the database.</source> - <translation>Incapaz de abrir a base de dados.</translation> + <translation>Não foi possível abrir a base de dados.</translation> </message> <message> <source>File opened in read only mode.</source> @@ -1015,6 +1067,16 @@ Otherwise your changes are lost.</source> Deseja guardar a base de dados antes de a bloquear ? Se não o fizer, perderá as suas alterações.</translation> </message> + <message> + <source>Disable safe saves?</source> + <translation>Desativar salvaguardas?</translation> + </message> + <message> + <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</source> + <translation>O KeePassXC não conseguiu guardar a base de dados múltiplas vezes. Muito provavelmente, os serviços de sincronização não permitira a gravação. +Desativar salvaguardas e tentar novamente?</translation> + </message> </context> <context> <name>DatabaseWidget</name> @@ -1056,7 +1118,7 @@ Se não o fizer, perderá as suas alterações.</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Deseja mesmo mover %n entrada para a reciclagem?</numerusform><numerusform>Deseja mesmo mover %n entradas para a reciclagem?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1080,7 +1142,7 @@ Se não o fizer, perderá as suas alterações.</translation> </message> <message> <source>Unable to calculate master key</source> - <translation>Impossível de calcular a chave-mestre</translation> + <translation>Não foi possível calcular a chave-mestre</translation> </message> <message> <source>No current database.</source> @@ -1100,7 +1162,7 @@ Se não o fizer, perderá as suas alterações.</translation> </message> <message> <source>File has changed</source> - <translation type="unfinished"/> + <translation>Ficheiro alterado</translation> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -1113,7 +1175,8 @@ Se não o fizer, perderá as suas alterações.</translation> <message> <source>The database file has changed and you have unsaved changes. Do you want to merge your changes?</source> - <translation type="unfinished"/> + <translation>A base de dados foi alterada e tem alterações não gravadas. +Deseja juntar as suas alterações?</translation> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -1127,12 +1190,16 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>Tem a certeza de que deseja apagar permanentemente os itens da reciclagem?</translation> </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DetailsWidget</name> <message> <source>Generate TOTP Token</source> - <translation type="unfinished"/> + <translation>A gerar token TOTP</translation> </message> <message> <source>Close</source> @@ -1164,7 +1231,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Searching</source> - <translation type="unfinished"/> + <translation>A procurar</translation> </message> <message> <source>Attributes</source> @@ -1200,15 +1267,15 @@ Do you want to merge your changes?</source> </message> <message> <source>[PROTECTED]</source> - <translation type="unfinished"/> + <translation>[PROTEGIDA]</translation> </message> <message> <source>Disabled</source> - <translation type="unfinished"/> + <translation>Desativada</translation> </message> <message> <source>Enabled</source> - <translation type="unfinished"/> + <translation>Ativada</translation> </message> </context> <context> @@ -1239,7 +1306,7 @@ Do you want to merge your changes?</source> </message> <message> <source>SSH Agent</source> - <translation type="unfinished"/> + <translation>Agente SSH</translation> </message> <message> <source>n/a</source> @@ -1247,19 +1314,19 @@ Do you want to merge your changes?</source> </message> <message> <source>(encrypted)</source> - <translation type="unfinished"/> + <translation>(cifrada)</translation> </message> <message> <source>Select private key</source> - <translation type="unfinished"/> + <translation>Selecionar chave privada</translation> </message> <message> <source>File too large to be a private key</source> - <translation type="unfinished"/> + <translation>Ficheiro muito grande para ser uma chave privada</translation> </message> <message> <source>Failed to open private key</source> - <translation type="unfinished"/> + <translation>Falha ao abrir a chave privada</translation> </message> <message> <source>Entry history</source> @@ -1291,11 +1358,11 @@ Do you want to merge your changes?</source> </message> <message> <source>[PROTECTED]</source> - <translation type="unfinished"/> + <translation>[PROTEGIDA]</translation> </message> <message> <source>Press reveal to view or edit</source> - <translation type="unfinished"/> + <translation>Prima Mostrar para ver ou editar</translation> </message> <message> <source>Tomorrow</source> @@ -1303,16 +1370,28 @@ Do you want to merge your changes?</source> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n semana</numerusform><numerusform>%n semanas</numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n mês</numerusform><numerusform>%n meses</numerusform></translation> </message> <message> <source>1 year</source> <translation>1 ano</translation> </message> + <message> + <source>Apply generated password?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to apply the generated password to this entry?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAdvanced</name> @@ -1338,12 +1417,20 @@ Do you want to merge your changes?</source> </message> <message> <source>Reveal</source> - <translation>Revelar</translation> + <translation>Mostrar</translation> </message> <message> <source>Attachments</source> <translation>Anexos</translation> </message> + <message> + <source>Foreground Color:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Background Color:</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -1376,12 +1463,8 @@ Do you want to merge your changes?</source> <translation>Título da janela:</translation> </message> <message> - <source>Use default se&quence</source> - <translation>Utilizar se&quência padrão</translation> - </message> - <message> - <source>Set custo&m sequence:</source> - <translation>Definir sequê&ncia personalizada:</translation> + <source>Use a specific sequence for this association:</source> + <translation>Utilizar sequência específica para esta associação:</translation> </message> </context> <context> @@ -1431,7 +1514,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Toggle the checkbox to reveal the notes section.</source> - <translation type="unfinished"/> + <translation>Alternar caixa de seleção para mostrar a secção de notas.</translation> </message> <message> <source>Username:</source> @@ -1450,7 +1533,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Remove key from agent after</source> - <translation type="unfinished"/> + <translation>Remover chave do agente depois de</translation> </message> <message> <source> seconds</source> @@ -1462,7 +1545,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Remove key from agent when database is closed/locked</source> - <translation type="unfinished"/> + <translation>Remover chave do agente ao fechar/bloquear a base de dados</translation> </message> <message> <source>Public key</source> @@ -1470,7 +1553,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Add key to agent when database is opened/unlocked</source> - <translation type="unfinished"/> + <translation>Adicionar chave ao agente ao abrir/desbloquear a base de dados</translation> </message> <message> <source>Comment</source> @@ -1478,7 +1561,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Decrypt</source> - <translation type="unfinished"/> + <translation>Decifrar</translation> </message> <message> <source>n/a</source> @@ -1515,7 +1598,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Require user confirmation when this key is used</source> - <translation type="unfinished"/> + <translation>Solicitar confirmação para utilizar esta chave</translation> </message> </context> <context> @@ -1608,7 +1691,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Unable to fetch favicon.</source> - <translation>Incapaz de obter o 'favicon'.</translation> + <translation>Não foi possível obter o 'favicon'.</translation> </message> <message> <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> @@ -1661,6 +1744,31 @@ Do you want to merge your changes?</source> <source>Uuid:</source> <translation>Uuid:</translation> </message> + <message> + <source>Plugin Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove</source> + <translation>Remover</translation> + </message> + <message> + <source>Delete plugin data?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Value</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Entry</name> @@ -1709,7 +1817,7 @@ Do you want to merge your changes?</source> </message> <message numerus="yes"> <source>Are you sure you want to remove %n attachment(s)?</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Tem a certeza de que deseja remover %n anexo?</numerusform><numerusform>Tem a certeza de que deseja remover %n anexos?</numerusform></translation> </message> <message> <source>Confirm Remove</source> @@ -1722,35 +1830,40 @@ Do you want to merge your changes?</source> <message> <source>Unable to create directory: %1</source> - <translation type="unfinished"/> + <translation>Não foi possível criar o diretório: +%1</translation> </message> <message> <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> - <translation type="unfinished"/> + <translation>Tem a certeza de que deseja substituir o ficheiro "%1" pelo anexo?</translation> </message> <message> <source>Confirm overwrite</source> - <translation type="unfinished"/> + <translation>Confirmação de substituição</translation> </message> <message> <source>Unable to save attachments: %1</source> - <translation type="unfinished"/> + <translation>Não foi possível guardar os anexos: +%1</translation> </message> <message> <source>Unable to open attachment: %1</source> - <translation type="unfinished"/> + <translation>Não foi possível abrir o anexo: +%1</translation> </message> <message> <source>Unable to open attachments: %1</source> - <translation type="unfinished"/> + <translation>Não foi possível abrir os anexos: +%1</translation> </message> <message> <source>Unable to open files: %1</source> - <translation type="unfinished"/> + <translation>Não foi possível abrir os ficheiros: +%1</translation> </message> </context> <context> @@ -1802,6 +1915,65 @@ Do you want to merge your changes?</source> <source>URL</source> <translation>URL</translation> </message> + <message> + <source>Never</source> + <translation>Nunca</translation> + </message> + <message> + <source>Password</source> + <translation>Palavra-passe</translation> + </message> + <message> + <source>Notes</source> + <translation>Notas</translation> + </message> + <message> + <source>Expires</source> + <translation>Expira</translation> + </message> + <message> + <source>Created</source> + <translation>Criada</translation> + </message> + <message> + <source>Modified</source> + <translation>Modificada</translation> + </message> + <message> + <source>Accessed</source> + <translation>Acedida</translation> + </message> + <message> + <source>Attachments</source> + <translation>Anexos</translation> + </message> +</context> +<context> + <name>EntryView</name> + <message> + <source>Customize View</source> + <translation>Vista personalizada</translation> + </message> + <message> + <source>Hide Usernames</source> + <translation>Ocultar nome de utilizador</translation> + </message> + <message> + <source>Hide Passwords</source> + <translation>Ocultar palavras-passe</translation> + </message> + <message> + <source>Fit to window</source> + <translation>Ajustar à janela</translation> + </message> + <message> + <source>Fit to contents</source> + <translation>Ajustar ao conteúdo</translation> + </message> + <message> + <source>Reset to defaults</source> + <translation>Repor predefinições</translation> + </message> </context> <context> <name>Group</name> @@ -1814,11 +1986,11 @@ Do you want to merge your changes?</source> <name>HostInstaller</name> <message> <source>KeePassXC: Cannot save file!</source> - <translation type="unfinished"/> + <translation>KeePassXC: Ficheiro não guardado!</translation> </message> <message> <source>Cannot save the native messaging script file.</source> - <translation type="unfinished"/> + <translation>Não foi possível guardar o ficheiro de mensagens nativas.</translation> </message> </context> <context> @@ -1871,6 +2043,10 @@ Do you want to merge your changes?</source> <source>Ensure that the password contains characters from every group</source> <translation>Certificar de que a palavra-passe contém caracteres de todos os grupos</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>ASCII expandido</translation> + </message> </context> <context> <name>KMessageWidget</name> @@ -1887,11 +2063,11 @@ Do you want to merge your changes?</source> <name>Kdbx3Reader</name> <message> <source>Unable to calculate master key</source> - <translation>Impossível de calcular a chave-mestre</translation> + <translation>Não foi possível calcular a chave-mestre</translation> </message> <message> <source>Unable to issue challenge-response.</source> - <translation>Incapaz de emitir a pergunta de segurança.</translation> + <translation>Não foi possível emitir a pergunta de segurança.</translation> </message> <message> <source>Wrong key or database file is corrupt.</source> @@ -1902,38 +2078,38 @@ Do you want to merge your changes?</source> <name>Kdbx3Writer</name> <message> <source>Unable to issue challenge-response.</source> - <translation>Incapaz de emitir a pergunta de segurança.</translation> + <translation>Não foi possível emitir a pergunta de segurança.</translation> </message> <message> <source>Unable to calculate master key</source> - <translation>Impossível de calcular a chave-mestre</translation> + <translation>Não foi possível calcular a chave-mestre</translation> </message> </context> <context> <name>Kdbx4Reader</name> <message> <source>missing database headers</source> - <translation type="unfinished"/> + <translation>cabeçalhos em falta</translation> </message> <message> <source>Unable to calculate master key</source> - <translation>Impossível de calcular a chave-mestre</translation> + <translation>Não foi possível calcular a chave-mestre</translation> </message> <message> <source>Invalid header checksum size</source> - <translation type="unfinished"/> + <translation>Tamanho inválido para o 'checksum' do cabeçalho</translation> </message> <message> <source>Header SHA256 mismatch</source> - <translation type="unfinished"/> + <translation>Disparidade no cabeçalho SHA256</translation> </message> <message> <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> - <translation type="unfinished"/> + <translation>Chave errada ou base de dados danificada (disparidade HMAC)</translation> </message> <message> <source>Unknown cipher</source> - <translation type="unfinished"/> + <translation>Cifra desconhecida</translation> </message> <message> <source>Invalid header id size</source> @@ -1953,11 +2129,11 @@ Do you want to merge your changes?</source> </message> <message> <source>Unsupported key derivation function (KDF) or invalid parameters</source> - <translation type="unfinished"/> + <translation>Função de derivação de chave (KDF) não suportada ou parâmetros inválidos</translation> </message> <message> <source>Legacy header fields found in KDBX4 file.</source> - <translation type="unfinished"/> + <translation>Encontrados campos legados no ficheiro KDBX4.</translation> </message> <message> <source>Invalid inner header id size</source> @@ -2045,7 +2221,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Unable to calculate master key</source> - <translation>Impossível de calcular a chave-mestre</translation> + <translation>Não foi possível calcular a chave-mestre</translation> </message> <message> <source>Failed to serialize KDF parameters variant map</source> @@ -2061,7 +2237,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Unsupported cipher</source> - <translation type="unfinished"/> + <translation>Cifra não suportada</translation> </message> <message> <source>Invalid compression flags length</source> @@ -2069,7 +2245,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Unsupported compression algorithm</source> - <translation type="unfinished"/> + <translation>Algoritmo de compressão não suportado</translation> </message> <message> <source>Invalid master seed size</source> @@ -2081,7 +2257,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Invalid transform rounds size</source> - <translation type="unfinished"/> + <translation>Tamanho inválido para os ciclos de transformação </translation> </message> <message> <source>Invalid start bytes size</source> @@ -2111,30 +2287,30 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados </message> <message> <source>Unsupported KeePass 2 database version.</source> - <translation type="unfinished"/> + <translation>Versão da base de dados KeePass2 não suportada.</translation> </message> </context> <context> <name>KdbxXmlReader</name> <message> <source>XML parsing failure: %1</source> - <translation type="unfinished"/> + <translation>Falha no processamento XML: %1</translation> </message> <message> <source>No root group</source> - <translation type="unfinished"/> + <translation>Sem grupo root</translation> </message> <message> <source>Missing icon uuid or data</source> - <translation type="unfinished"/> + <translation>Dados ou uuid do ícone em falta</translation> </message> <message> <source>Missing custom data key or value</source> - <translation type="unfinished"/> + <translation>Valor ou chave de dados personalizados em falta</translation> </message> <message> <source>Multiple group elements</source> - <translation type="unfinished"/> + <translation>Múltiplos elementos de grupo</translation> </message> <message> <source>Null group uuid</source> @@ -2146,11 +2322,11 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados </message> <message> <source>Invalid EnableAutoType value</source> - <translation type="unfinished"/> + <translation>Valor inválido para EnableAutoType</translation> </message> <message> <source>Invalid EnableSearching value</source> - <translation type="unfinished"/> + <translation>Valor inválido para EnableSearching</translation> </message> <message> <source>No group uuid found</source> @@ -2174,7 +2350,7 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados </message> <message> <source>History element in history entry</source> - <translation type="unfinished"/> + <translation>Elemento de histórico na entrada do histórico</translation> </message> <message> <source>No entry uuid found</source> @@ -2182,27 +2358,27 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados </message> <message> <source>History element with different uuid</source> - <translation type="unfinished"/> + <translation>Elemento do histórico com uuid diferente</translation> </message> <message> <source>Unable to decrypt entry string</source> - <translation type="unfinished"/> + <translation>Não foi possível decifrar a cadeia vazia</translation> </message> <message> <source>Duplicate custom attribute found</source> - <translation type="unfinished"/> + <translation>Encontrado atributo personalizado em duplicado</translation> </message> <message> <source>Entry string key or value missing</source> - <translation type="unfinished"/> + <translation>Chave 'string' ou valor em falta</translation> </message> <message> <source>Duplicate attachment found</source> - <translation type="unfinished"/> + <translation>Encontrado anexo em duplicado</translation> </message> <message> <source>Entry binary key or value missing</source> - <translation type="unfinished"/> + <translation>Chave binária ou valor em falta</translation> </message> <message> <source>Auto-type association window or sequence missing</source> @@ -2210,32 +2386,32 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados </message> <message> <source>Invalid bool value</source> - <translation type="unfinished"/> + <translation>Valor booleano inválido</translation> </message> <message> <source>Invalid date time value</source> - <translation type="unfinished"/> + <translation>Valor de data/hora inválido</translation> </message> <message> <source>Invalid color value</source> - <translation type="unfinished"/> + <translation>Valor de cor inválido</translation> </message> <message> <source>Invalid color rgb part</source> - <translation type="unfinished"/> + <translation>Parte da cor RGB inválida</translation> </message> <message> <source>Invalid number value</source> - <translation type="unfinished"/> + <translation>Valor numérico inválido</translation> </message> <message> <source>Invalid uuid value</source> - <translation type="unfinished"/> + <translation>Valor uuid inválido</translation> </message> <message> <source>Unable to decompress binary</source> <extracomment>Translator meant is a binary data inside an entry</extracomment> - <translation type="unfinished"/> + <translation>Não foi possível descomprimir o binário</translation> </message> </context> <context> @@ -2246,14 +2422,14 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados </message> <message> <source>Unable to open the database.</source> - <translation>Incapaz de abrir a base de dados.</translation> + <translation>Não foi possível abrir a base de dados.</translation> </message> </context> <context> <name>KeePass1Reader</name> <message> <source>Unable to read keyfile.</source> - <translation>Incapaz de ler o ficheiro-chave.</translation> + <translation>Não foi possível ler o ficheiro-chave.</translation> </message> <message> <source>Not a KeePass database.</source> @@ -2270,19 +2446,19 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados <message> <source>Unable to read encryption IV</source> <comment>IV = Initialization Vector for symmetric cipher</comment> - <translation type="unfinished"/> + <translation>Não foi possível ler a cifra IV</translation> </message> <message> <source>Invalid number of groups</source> - <translation type="unfinished"/> + <translation>Número inválido de grupos</translation> </message> <message> <source>Invalid number of entries</source> - <translation type="unfinished"/> + <translation>Número inválido de entradas</translation> </message> <message> <source>Invalid content hash size</source> - <translation type="unfinished"/> + <translation>Tamanho inválido para a 'hash' do conteúdo</translation> </message> <message> <source>Invalid transform seed size</source> @@ -2290,11 +2466,11 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados </message> <message> <source>Invalid number of transform rounds</source> - <translation type="unfinished"/> + <translation>Número inválido para os ciclos de transformação</translation> </message> <message> <source>Unable to construct group tree</source> - <translation type="unfinished"/> + <translation>Não foi possível criar a árvore de grupo</translation> </message> <message> <source>Root</source> @@ -2302,7 +2478,7 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados </message> <message> <source>Unable to calculate master key</source> - <translation>Impossível de calcular a chave-mestre</translation> + <translation>Não foi possível calcular a chave-mestre</translation> </message> <message> <source>Wrong key or database file is corrupt.</source> @@ -2310,7 +2486,7 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados </message> <message> <source>Key transformation failed</source> - <translation type="unfinished"/> + <translation>Falha ao transformar a chave</translation> </message> <message> <source>Invalid group field type number</source> @@ -2354,11 +2530,11 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados </message> <message> <source>Invalid group field type</source> - <translation type="unfinished"/> + <translation>Tipo inválido para o campo de grupo</translation> </message> <message> <source>Missing group id or level</source> - <translation type="unfinished"/> + <translation>ID ou nível de grupo em falta</translation> </message> <message> <source>Missing entry field type number</source> @@ -2366,7 +2542,7 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados </message> <message> <source>Invalid entry field size</source> - <translation type="unfinished"/> + <translation>Tamanho inválido para o campo da entrada</translation> </message> <message> <source>Read entry field data doesn't match size</source> @@ -2398,7 +2574,7 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados </message> <message> <source>Invalid entry field type</source> - <translation type="unfinished"/> + <translation>Tipo inválido para o campo da entrada</translation> </message> </context> <context> @@ -2452,7 +2628,7 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados </message> <message> <source>Time-based one-time password</source> - <translation type="unfinished"/> + <translation>Palavra-passe única baseada em tempo</translation> </message> <message> <source>&Groups</source> @@ -2640,7 +2816,7 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados </message> <message> <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> - <translation type="unfinished"/> + <translation><p>Parece que está a utilizar KeepassHTTP para integração com o navegador. Esta funcionalidade foi descontinuada e será removida brevemente.<br>Considere a utilização de KeePassXC-Browser! Para obter ajuda na migração, aceda ao nosso <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">guia de migração</a> (aviso %1 de 3).</p></translation> </message> <message> <source>read-only</source> @@ -2682,101 +2858,113 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados <source>Please touch the button on your YubiKey!</source> <translation>Toque no botão da sua YubiKey!</translation> </message> + <message> + <source>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</source> + <translation>AVISO: está a utilizar uma versão instável do KeepassXC! +Existe um risco bastante grande e deve efetuar um backup da base de dados. +Esta versão não deve ser utilizada para uma utilização regular.</translation> + </message> </context> <context> <name>OpenSSHKey</name> <message> <source>Invalid key file, expecting an OpenSSH key</source> - <translation type="unfinished"/> + <translation>Chave inválida, esperada chave OpenSSH</translation> </message> <message> <source>PEM boundary mismatch</source> - <translation type="unfinished"/> - </message> - <message> - <source>This is not an OpenSSH key, only modern keys are supported</source> - <translation type="unfinished"/> + <translation>Disparidade nos limites PEM</translation> </message> <message> <source>Base64 decoding failed</source> - <translation type="unfinished"/> + <translation>Falha na descodificação Base64</translation> </message> <message> <source>Key file way too small.</source> - <translation type="unfinished"/> + <translation>Ficheiro-chave muito pequeno</translation> </message> <message> <source>Key file magic header id invalid</source> - <translation type="unfinished"/> + <translation>ID do cabeçalho mágico do ficheiro-chave inválida</translation> </message> <message> <source>Found zero keys</source> - <translation type="unfinished"/> + <translation>Encontradas zero chaves</translation> </message> <message> <source>Failed to read public key.</source> - <translation type="unfinished"/> + <translation>Falha ao ler a chave pública.</translation> </message> <message> <source>Corrupted key file, reading private key failed</source> - <translation type="unfinished"/> + <translation>Ficheiro danificado, erro ao ler a chave privada</translation> </message> <message> <source>No private key payload to decrypt</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown cipher: </source> - <translation type="unfinished"/> + <translation>Não existe chave privada para decifrar</translation> </message> <message> <source>Trying to run KDF without cipher</source> - <translation type="unfinished"/> + <translation>A tentar executar KDF sem cifra</translation> </message> <message> <source>Passphrase is required to decrypt this key</source> - <translation type="unfinished"/> + <translation>Requer frase-chave para decifrar esta chave</translation> </message> <message> <source>Key derivation failed, key file corrupted?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown KDF: </source> - <translation type="unfinished"/> + <translation>Falha na derivação da chave, ficheiro chave danificado?</translation> </message> <message> <source>Decryption failed, wrong passphrase?</source> - <translation type="unfinished"/> + <translation>Falha ao decifrar, frase-chave errada?</translation> </message> <message> <source>Unexpected EOF while reading public key</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown key type: </source> - <translation type="unfinished"/> + <translation>EOF inesperado ao ler a chave pública</translation> </message> <message> <source>Unexpected EOF while reading private key</source> - <translation type="unfinished"/> + <translation>EOF inesperado ao ler a chave privada</translation> </message> <message> <source>Can't write public key as it is empty</source> - <translation type="unfinished"/> + <translation>Incapaz de escrever a chave pública porque está vazia</translation> </message> <message> <source>Unexpected EOF when writing public key</source> - <translation type="unfinished"/> + <translation>EOF inesperado ao escrever a chave pública</translation> </message> <message> <source>Can't write private key as it is empty</source> - <translation type="unfinished"/> + <translation>Incapaz de escrever a chave privada porque está vazia</translation> </message> <message> <source>Unexpected EOF when writing private key</source> + <translation>EOF inesperado ao escrever a chave privada</translation> + </message> + <message> + <source>Unsupported key type: %1</source> + <translation>Tipo de chave não suportado: %1</translation> + </message> + <message> + <source>Unknown cipher: %1</source> + <translation>Cifra desconhecida: %1</translation> + </message> + <message> + <source>Cipher IV is too short for MD5 kdf</source> <translation type="unfinished"/> </message> + <message> + <source>Unknown KDF: %1</source> + <translation>KDF desconhecido: %1</translation> + </message> + <message> + <source>Unknown key type: %1</source> + <translation>Tipo de chave desconhecido: %1</translation> + </message> </context> <context> <name>OptionDialog</name> @@ -2883,11 +3071,11 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados </message> <message> <source><b>Warning:</b> The following options can be dangerous!</source> - <translation type="unfinished"/> + <translation><b>Atenção</b>: as opções seguintes podem ser perigosas!</translation> </message> <message> <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> - <translation type="unfinished"/> + <translation><p>A funcionalidade KeePassHTTP foi descontinuada e será removida brevemente.<br>Considere a utilização de KeePassXC-Browser! Para obter ajuda na migração, aceda ao nosso <a href="https://keepassxc.org/docs/keepassxc-browser-migration">guia de migração</a>.</p></translation> </message> <message> <source>Cannot bind to privileged ports</source> @@ -3028,71 +3216,71 @@ Será utilizada a porta 19455 (padrão).</translation> <name>QObject</name> <message> <source>Database not opened</source> - <translation type="unfinished"/> + <translation>Base de dados não aberta</translation> </message> <message> <source>Database hash not available</source> - <translation type="unfinished"/> + <translation>'Hash' da base de dados não disponível</translation> </message> <message> <source>Client public key not received</source> - <translation type="unfinished"/> + <translation>Chave pública do cliente não recebida</translation> </message> <message> <source>Cannot decrypt message</source> - <translation type="unfinished"/> + <translation>Não foi possível decifrar a mensagem</translation> </message> <message> <source>Timeout or cannot connect to KeePassXC</source> - <translation type="unfinished"/> + <translation>Tempo limite atingido ou não foi possível comunicar com o KeePassXC</translation> </message> <message> <source>Action cancelled or denied</source> - <translation type="unfinished"/> + <translation>Ação cancelada ou recusada</translation> </message> <message> <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> - <translation type="unfinished"/> + <translation>Mensagem não decifrada ou chave pública não encontrada, Ativou as mensagens nativas no KeePassXC?</translation> </message> <message> <source>KeePassXC association failed, try again</source> - <translation type="unfinished"/> + <translation>Falha ao associar o KeePassXC. Tente novamente.</translation> </message> <message> <source>Key change was not successful</source> - <translation type="unfinished"/> + <translation>Alteração de chave não efetuada</translation> </message> <message> <source>Encryption key is not recognized</source> - <translation type="unfinished"/> + <translation>Chave de cifra não reconhecida</translation> </message> <message> <source>No saved databases found</source> - <translation type="unfinished"/> + <translation>Não existem bases de dados guardadas</translation> </message> <message> <source>Incorrect action</source> - <translation type="unfinished"/> + <translation>Ação incorreta</translation> </message> <message> <source>Empty message received</source> - <translation type="unfinished"/> + <translation>Recebida mensagem vazia</translation> </message> <message> <source>No URL provided</source> - <translation type="unfinished"/> + <translation>URL não disponibilizado</translation> </message> <message> <source>No logins found</source> - <translation type="unfinished"/> + <translation>Não existem credenciais</translation> </message> <message> <source>Unknown error</source> - <translation type="unfinished"/> + <translation>Erro desconhecido</translation> </message> <message> <source>Add a new entry to a database.</source> - <translation type="unfinished"/> + <translation>Adicionar entrada à base de dados.</translation> </message> <message> <source>Path of the database.</source> @@ -3100,23 +3288,23 @@ Será utilizada a porta 19455 (padrão).</translation> </message> <message> <source>Key file of the database.</source> - <translation type="unfinished"/> + <translation>Ficheiro-chave da base de dados.</translation> </message> <message> <source>path</source> - <translation type="unfinished"/> + <translation>caminho</translation> </message> <message> <source>Username for the entry.</source> - <translation type="unfinished"/> + <translation>Nome de utilizador para a entrada.</translation> </message> <message> <source>username</source> - <translation type="unfinished"/> + <translation>nome de utilizador</translation> </message> <message> <source>URL for the entry.</source> - <translation type="unfinished"/> + <translation>URL para a entrada.</translation> </message> <message> <source>URL</source> @@ -3124,64 +3312,64 @@ Será utilizada a porta 19455 (padrão).</translation> </message> <message> <source>Prompt for the entry's password.</source> - <translation type="unfinished"/> + <translation>Pedir palavra-passe para a entrada.</translation> </message> <message> <source>Generate a password for the entry.</source> - <translation type="unfinished"/> + <translation>Gerar palavra-passe para a entrada.</translation> </message> <message> <source>Length for the generated password.</source> - <translation type="unfinished"/> + <translation>Tamanho da palavra-passe gerada.</translation> </message> <message> <source>length</source> - <translation type="unfinished"/> + <translation>tamanho</translation> </message> <message> <source>Path of the entry to add.</source> - <translation type="unfinished"/> + <translation>Caminho da entrada a adicionar.</translation> </message> <message> <source>Copy an entry's password to the clipboard.</source> - <translation type="unfinished"/> + <translation>Copiar palavra-passe da entrada para a área de transferência.</translation> </message> <message> <source>Path of the entry to clip.</source> <comment>clip = copy to clipboard</comment> - <translation type="unfinished"/> + <translation>Caminho da entrada a copiar.</translation> </message> <message> <source>Timeout in seconds before clearing the clipboard.</source> - <translation type="unfinished"/> + <translation>Tempo limite, em segundos, antes de limpar a área de transferência.</translation> </message> <message> <source>Edit an entry.</source> - <translation type="unfinished"/> + <translation>Editar entrada.</translation> </message> <message> <source>Title for the entry.</source> - <translation type="unfinished"/> + <translation>Título para a entrada.</translation> </message> <message> <source>title</source> - <translation type="unfinished"/> + <translation>título</translation> </message> <message> <source>Path of the entry to edit.</source> - <translation type="unfinished"/> + <translation>Caminho da entrada a editar.</translation> </message> <message> <source>Estimate the entropy of a password.</source> - <translation type="unfinished"/> + <translation>Estimar entropia da palavra-passe.</translation> </message> <message> <source>Password for which to estimate the entropy.</source> - <translation type="unfinished"/> + <translation>Palavra-passe para a qual será estimada a entropia.</translation> </message> <message> <source>Perform advanced analysis on the password.</source> - <translation type="unfinished"/> + <translation>Executar análise avançada da palavra-passe.</translation> </message> <message> <source>Extract and print the content of a database.</source> @@ -3193,25 +3381,31 @@ Será utilizada a porta 19455 (padrão).</translation> </message> <message> <source>Insert password to unlock %1: </source> - <translation type="unfinished"/> + <translation>Digite a palavra-passe para desbloquear %1.</translation> </message> <message> <source>Failed to load key file %1 : %2</source> - <translation type="unfinished"/> + <translation>Falha ao carregar o ficheiro-chave %1: %2</translation> </message> <message> <source>WARNING: You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>AVISO: está a utilizar um formato legado que pode, no futuro, deixar +de ser suportado. + +Deve considerar a geração de uma novo ficheiro-chave.</translation> </message> <message> <source> Available commands: </source> - <translation type="unfinished"/> + <translation> + +Comandos disponíveis: +</translation> </message> <message> <source>Name of the command to execute.</source> @@ -3227,11 +3421,11 @@ Available commands: </message> <message> <source>Find entries quickly.</source> - <translation type="unfinished"/> + <translation>Localizar entradas rapidamente.</translation> </message> <message> <source>Search term.</source> - <translation type="unfinished"/> + <translation>Termo de pesquisa</translation> </message> <message> <source>Merge two databases.</source> @@ -3247,23 +3441,23 @@ Available commands: </message> <message> <source>Use the same credentials for both database files.</source> - <translation type="unfinished"/> + <translation>Utilizar as mesmas credenciais para ambos os ficheiros.</translation> </message> <message> <source>Key file of the database to merge from.</source> - <translation type="unfinished"/> + <translation>Ficheiro-chave da base de dados para a combinação.</translation> </message> <message> <source>Show an entry's information.</source> - <translation type="unfinished"/> + <translation>Mostrar informações de uma entrada.</translation> </message> <message> <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> - <translation type="unfinished"/> + <translation>Nome dos atributos a mostrar. Esta opção pode ser especificada mais do que uma vez, sendo que os atributos são mostrados um por linha, na ordem indicada. Se não especificar atributos, será dado um resumo dos atributos padrão.</translation> </message> <message> <source>attribute</source> - <translation type="unfinished"/> + <translation>atributo</translation> </message> <message> <source>Name of the entry to show.</source> @@ -3293,27 +3487,27 @@ Available commands: </message> <message> <source>AES: 256-bit</source> - <translation type="unfinished"/> + <translation>AES: 256-bit</translation> </message> <message> <source>Twofish: 256-bit</source> - <translation type="unfinished"/> + <translation>Twofish: 256-bit</translation> </message> <message> <source>ChaCha20: 256-bit</source> - <translation type="unfinished"/> + <translation>ChaCha20: 256-bit</translation> </message> <message> <source>Argon2 (KDBX 4 – recommended)</source> - <translation type="unfinished"/> + <translation>Argon2 (KDBX 4 – recomendado)</translation> </message> <message> <source>AES-KDF (KDBX 4)</source> - <translation type="unfinished"/> + <translation>AES-KDF (KDBX 4)</translation> </message> <message> <source>AES-KDF (KDBX 3.1)</source> - <translation type="unfinished"/> + <translation>AES-KDF (KDBX 3.1)</translation> </message> <message> <source>Group</source> @@ -3337,15 +3531,15 @@ Available commands: </message> <message> <source>Last Modified</source> - <translation type="unfinished"/> + <translation>Última modificação</translation> </message> <message> <source>Created</source> - <translation type="unfinished"/> + <translation>Criada</translation> </message> <message> <source>Legacy Browser Integration</source> - <translation type="unfinished"/> + <translation>Integração com navegador (legada)</translation> </message> <message> <source>Browser Integration</source> @@ -3365,7 +3559,53 @@ Available commands: </message> <message> <source>SSH Agent</source> - <translation type="unfinished"/> + <translation>Agente SSH</translation> + </message> + <message> + <source>Generate a new random diceware passphrase.</source> + <translation>Gerar uma nova palavra-passe baseada em dados (diceware).</translation> + </message> + <message> + <source>Word count for the diceware passphrase.</source> + <translation>Número de palavras para a palavra-passe.</translation> + </message> + <message> + <source>count</source> + <translation>número</translation> + </message> + <message> + <source>Wordlist for the diceware generator. +[Default: EFF English]</source> + <translation>Lista de palavras para o gerador. +[Padrão: EFF inglês]</translation> + </message> + <message> + <source>Generate a new random password.</source> + <translation>Gerar nova palavra-passe aleatória.</translation> + </message> + <message> + <source>Length of the generated password.</source> + <translation>Tamanho da palavra-passe gerada.</translation> + </message> + <message> + <source>Use lowercase characters in the generated password.</source> + <translation>Utilizar letras minúsculas para a palavra-passe gerada.</translation> + </message> + <message> + <source>Use uppercase characters in the generated password.</source> + <translation>Utilizar letras maiúsculas para a palavra-passe gerada.</translation> + </message> + <message> + <source>Use numbers in the generated password.</source> + <translation>Utilizar números para a palavra-passe gerada.</translation> + </message> + <message> + <source>Use special characters in the generated password.</source> + <translation>Utilizar caracteres especiais para a palavra-passe gerada.</translation> + </message> + <message> + <source>Use extended ASCII in the generated password.</source> + <translation>Utilizar ASCII estendido para a palavra-passe gerada.</translation> </message> </context> <context> @@ -3469,11 +3709,11 @@ Desbloqueie a base de dados selecionada ou escolha outra que esteja desbloqueada </message> <message> <source>KeePassXC: Removed keys from database</source> - <translation>KeePassXC: Remover chaves da base de dados</translation> + <translation>KeePassXC: Chaves removidas da base de dados</translation> </message> <message numerus="yes"> <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Removidas com sucesso % chave de cifra das definições KeePassX/Http.</numerusform><numerusform>Removidas com sucesso % chaves de cifra das definições KeePassX/Http.</numerusform></translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -3505,7 +3745,7 @@ Desbloqueie a base de dados selecionada ou escolha outra que esteja desbloqueada </message> <message numerus="yes"> <source>Successfully removed permissions from %n entries.</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Removidas com sucesso as permissões de %n entrada.</numerusform><numerusform>Removidas com sucesso as permissões de %n entradas.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -3587,7 +3827,7 @@ Desbloqueie a base de dados selecionada ou escolha outra que esteja desbloqueada </message> <message> <source>Hide the Details view</source> - <translation type="unfinished"/> + <translation>Ocultar vista de detalhes</translation> </message> <message> <source>Show a system tray icon</source> @@ -3603,7 +3843,7 @@ Desbloqueie a base de dados selecionada ou escolha outra que esteja desbloqueada </message> <message> <source>Dark system tray icon</source> - <translation type="unfinished"/> + <translation>Ícone escuro na bandeja</translation> </message> <message> <source>Language</source> @@ -3638,6 +3878,30 @@ Desbloqueie a base de dados selecionada ou escolha outra que esteja desbloqueada <comment>Milliseconds</comment> <translation> ms</translation> </message> + <message> + <source>Startup</source> + <translation>Arranque</translation> + </message> + <message> + <source>File Management</source> + <translation>Gestão de ficheiros</translation> + </message> + <message> + <source>Safely save database files (may be incompatible with Dropbox, etc)</source> + <translation>Guardar bases de dados em segurança (pode ser incompatível com DropBox e outros serviços)</translation> + </message> + <message> + <source>Backup database file before saving</source> + <translation>Criar backup da base de dados antes de guardar</translation> + </message> + <message> + <source>Entry Management</source> + <translation>Gestão de entradas</translation> + </message> + <message> + <source>General</source> + <translation>Geral</translation> + </message> </context> <context> <name>SettingsWidgetSecurity</name> @@ -3680,11 +3944,11 @@ Desbloqueie a base de dados selecionada ou escolha outra que esteja desbloqueada </message> <message> <source>Hide passwords in the preview panel</source> - <translation type="unfinished"/> + <translation>Ocultar palavras-passe no painel de pré-visualização</translation> </message> <message> <source>Hide entry notes by default</source> - <translation type="unfinished"/> + <translation>Por definição, ocultar notas da entrada</translation> </message> <message> <source>Privacy</source> @@ -3694,6 +3958,10 @@ Desbloqueie a base de dados selecionada ou escolha outra que esteja desbloqueada <source>Use Google as fallback for downloading website icons</source> <translation>Utilizar o Google como recurso para descarregar os ícones dos sites</translation> </message> + <message> + <source>Re-lock previously locked database after performing Auto-Type</source> + <translation>Bloquear novamente a base de dados depois de usar a escrita automática</translation> + </message> </context> <context> <name>SetupTotpDialog</name> @@ -3707,11 +3975,11 @@ Desbloqueie a base de dados selecionada ou escolha outra que esteja desbloqueada </message> <message> <source>Default RFC 6238 token settings</source> - <translation type="unfinished"/> + <translation>Definições padrão do token RFC 6238</translation> </message> <message> <source>Steam token settings</source> - <translation type="unfinished"/> + <translation>Definições do token do fluxo</translation> </message> <message> <source>Use custom settings</source> @@ -3775,10 +4043,6 @@ Desbloqueie a base de dados selecionada ou escolha outra que esteja desbloqueada </context> <context> <name>WelcomeWidget</name> - <message> - <source>Welcome to KeePassXC</source> - <translation>Bem-vindo ao KeePassXC</translation> - </message> <message> <source>Start storing your passwords securely in a KeePassXC database</source> <translation>Armazene as suas palavras-passe em segurança com o KeePassXC</translation> @@ -3803,12 +4067,16 @@ Desbloqueie a base de dados selecionada ou escolha outra que esteja desbloqueada <source>Recent databases</source> <translation>Bases de dados recentes</translation> </message> + <message> + <source>Welcome to KeePassXC %1</source> + <translation>Bem-vindo ao KeePassXC %1</translation> + </message> </context> <context> <name>main</name> <message> <source>Remove an entry from the database.</source> - <translation type="unfinished"/> + <translation>Remover uma entrada da base de dados.</translation> </message> <message> <source>Path of the database.</source> @@ -3816,7 +4084,7 @@ Desbloqueie a base de dados selecionada ou escolha outra que esteja desbloqueada </message> <message> <source>Path of the entry to remove.</source> - <translation type="unfinished"/> + <translation>Caminho da entrada a remover.</translation> </message> <message> <source>KeePassXC - cross-platform password manager</source> @@ -3840,7 +4108,7 @@ Desbloqueie a base de dados selecionada ou escolha outra que esteja desbloqueada </message> <message> <source>Parent window handle</source> - <translation type="unfinished"/> + <translation>Gestão da janela parental</translation> </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_ro.ts b/share/translations/keepassx_ro.ts new file mode 100644 index 000000000..540ecba74 --- /dev/null +++ b/share/translations/keepassx_ro.ts @@ -0,0 +1,4069 @@ +<?xml version="1.0" ?><!DOCTYPE TS><TS language="ro" version="2.1"> +<context> + <name>AboutDialog</name> + <message> + <source>About KeePassXC</source> + <translation>Despre KeePassXC</translation> + </message> + <message> + <source>About</source> + <translation>Despre</translation> + </message> + <message> + <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> + <translation>Raportați erorile la: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> + </message> + <message> + <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Contributors</source> + <translation>Contribuitori</translation> + </message> + <message> + <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Vezi contibuțiile pe GitHub</a></translation> + </message> + <message> + <source>Debug Info</source> + <translation>Informații depanare</translation> + </message> + <message> + <source>Include the following information whenever you report a bug:</source> + <translation>Includeți următoarea informație când raportați o eroare:</translation> + </message> + <message> + <source>Copy to clipboard</source> + <translation>Copiază în clipboard</translation> + </message> + <message> + <source>Version %1 +</source> + <translation>Versiunea %1 +</translation> + </message> + <message> + <source>Revision: %1</source> + <translation>Revizie: %1</translation> + </message> + <message> + <source>Distribution: %1</source> + <translation>Distribuție: %1</translation> + </message> + <message> + <source>Libraries:</source> + <translation>Librării:</translation> + </message> + <message> + <source>Operating system: %1 +CPU architecture: %2 +Kernel: %3 %4</source> + <translation>Sistem de operare: %1 +Arhitectura procesor (CPU): %2 +Nucleu (Kernel): %3 %4</translation> + </message> + <message> + <source>Enabled extensions:</source> + <translation>Extensii activate:</translation> + </message> + <message> + <source>Project Maintainers:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Build Type: %1 +</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>AccessControlDialog</name> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remember this decision</source> + <translation>Ține minte această decizie</translation> + </message> + <message> + <source>Allow</source> + <translation>Permite</translation> + </message> + <message> + <source>Deny</source> + <translation>Interzice</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>AgentSettingsWidget</name> + <message> + <source>Enable SSH Agent (requires restart)</source> + <translation>Activează Agentul SSH (necesită repornire)</translation> + </message> +</context> +<context> + <name>AutoType</name> + <message> + <source>Couldn't find an entry that matches the window title:</source> + <translation>Nu a putut fi gasită o intrare care să coincidă cu titlul ferestrei:</translation> + </message> + <message> + <source>Auto-Type - KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>The Syntax of your Auto-Type statement is incorrect!</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>AutoTypeAssociationsModel</name> + <message> + <source>Window</source> + <translation>Fereastră</translation> + </message> + <message> + <source>Sequence</source> + <translation>Secvență</translation> + </message> + <message> + <source>Default sequence</source> + <translation>Secvență implicită</translation> + </message> +</context> +<context> + <name>AutoTypeMatchModel</name> + <message> + <source>Group</source> + <translation>Grup</translation> + </message> + <message> + <source>Title</source> + <translation>Titlu</translation> + </message> + <message> + <source>Username</source> + <translation>Nume utilizator</translation> + </message> + <message> + <source>Sequence</source> + <translation>Secvență</translation> + </message> +</context> +<context> + <name>AutoTypeSelectDialog</name> + <message> + <source>Auto-Type - KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select entry to Auto-Type:</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>BrowserAccessControlDialog</name> + <message> + <source>KeePassXC-Browser Confirm Access</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remember this decision</source> + <translation>Ține minte această decizie</translation> + </message> + <message> + <source>Allow</source> + <translation>Permite</translation> + </message> + <message> + <source>Deny</source> + <translation>Interzice</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>BrowserOptionDialog</name> + <message> + <source>Dialog</source> + <translation>Dialog</translation> + </message> + <message> + <source>This is required for accessing your databases with KeePassXC-Browser</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable KeepassXC browser integration</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>General</translation> + </message> + <message> + <source>Enable integration for these browsers:</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Google Chrome</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Firefox</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Chromium</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Vivaldi</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show a &notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Match URL scheme (e.g., https://...)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return only best-matching credentials</source> + <translation type="unfinished"/> + </message> + <message> + <source>Sort &matching credentials by title</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Sort matching credentials by &username</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>&Disconnect all browsers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Forget all remembered &permissions</source> + <translation type="unfinished"/> + </message> + <message> + <source>Advanced</source> + <translation>Avansat</translation> + </message> + <message> + <source>Never &ask before accessing credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Never ask before &updating credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searc&h in all opened databases for matching credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation type="unfinished"/> + </message> + <message> + <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Update &native messaging manifest files at startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Support a proxy application between KeePassXC and browser extension.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &proxy application between KeePassXC and browser extension</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a custom proxy location if you installed a proxy manually.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &custom proxy location</source> + <comment>Meant is the proxy for KeePassXC-Browser</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Răsfoiește...</translation> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*.exe);;All Files (*.*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select custom proxy location</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>BrowserService</name> + <message> + <source>KeePassXC: New key association request</source> + <translation type="unfinished"/> + </message> + <message> + <source>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Save and allow access</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation type="unfinished"/> + </message> + <message> + <source>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation type="unfinished"/> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation type="unfinished"/> + </message> + <message> + <source>The active database does not contain a settings entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation type="unfinished"/> + </message> + <message> + <source>No shared encryption keys found in KeePassXC Settings.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Removing stored permissions…</source> + <translation type="unfinished"/> + </message> + <message> + <source>Abort</source> + <translation>Anulează</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entry(s).</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation type="unfinished"/> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>ChangeMasterKeyWidget</name> + <message> + <source>Password</source> + <translation>Parolă</translation> + </message> + <message> + <source>Enter password:</source> + <translation>Introdu parola:</translation> + </message> + <message> + <source>Repeat password:</source> + <translation>Repetă parola:</translation> + </message> + <message> + <source>&Key file</source> + <translation type="unfinished"/> + </message> + <message> + <source>Browse</source> + <translation>Răsfoiește</translation> + </message> + <message> + <source>Create</source> + <translation>Creează</translation> + </message> + <message> + <source>Cha&llenge Response</source> + <translation type="unfinished"/> + </message> + <message> + <source>Refresh</source> + <translation>Actualizează</translation> + </message> + <message> + <source>Key files</source> + <translation>Fișiere cheie</translation> + </message> + <message> + <source>All files</source> + <translation>Toate fișierele</translation> + </message> + <message> + <source>Create Key File...</source> + <translation>Creare fișier cheie...</translation> + </message> + <message> + <source>Unable to create Key File : </source> + <translation type="unfinished"/> + </message> + <message> + <source>Select a key file</source> + <translation>Selectați un fișier cheie</translation> + </message> + <message> + <source>Empty password</source> + <translation>Parolă vidă</translation> + </message> + <message> + <source>Do you really want to use an empty string as password?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Different passwords supplied.</source> + <translation>Au fost introduse parole diferite.</translation> + </message> + <message> + <source>Failed to set %1 as the Key file: +%2</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy key file format</source> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Changing master key failed: no YubiKey inserted.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CloneDialog</name> + <message> + <source>Clone Options</source> + <translation type="unfinished"/> + </message> + <message> + <source>Append ' - Clone' to title</source> + <translation type="unfinished"/> + </message> + <message> + <source>Replace username and password with references</source> + <translation>Înlocuiește numele utilizator și parola cu referințe</translation> + </message> + <message> + <source>Copy history</source> + <translation>Copiază istoric</translation> + </message> +</context> +<context> + <name>CsvImportWidget</name> + <message> + <source>Import CSV fields</source> + <translation>Importă câmpuri CSV</translation> + </message> + <message> + <source>filename</source> + <translation type="unfinished"/> + </message> + <message> + <source>size, rows, columns</source> + <translation>dimensiune, rânduri, coloane</translation> + </message> + <message> + <source>Encoding</source> + <translation>Codificare</translation> + </message> + <message> + <source>Codec</source> + <translation type="unfinished"/> + </message> + <message> + <source>Text is qualified by</source> + <translation>Textul este calificat de</translation> + </message> + <message> + <source>Fields are separated by</source> + <translation>Câmpurile sunt separate de</translation> + </message> + <message> + <source>Comments start with</source> + <translation>Comentariile încep cu</translation> + </message> + <message> + <source>First record has field names</source> + <translation>Prima înregistrare conține denumirile de câmpuri</translation> + </message> + <message> + <source>Number of headers line to discard</source> + <translation>Număr de linii antet de eliminat</translation> + </message> + <message> + <source>Consider '\' an escape character</source> + <translation type="unfinished"/> + </message> + <message> + <source>Preview</source> + <translation>Previzualizare</translation> + </message> + <message> + <source>Column layout</source> + <translation>Aranjare coloane</translation> + </message> + <message> + <source>Not present in CSV file</source> + <translation type="unfinished"/> + </message> + <message> + <source>Empty fieldname </source> + <translation>Denumire câmp vidă</translation> + </message> + <message> + <source>column </source> + <translation>coloană</translation> + </message> + <message> + <source>Imported from CSV file</source> + <translation type="unfinished"/> + </message> + <message> + <source>Original data: </source> + <translation>Datele originale: </translation> + </message> + <message> + <source>Error(s) detected in CSV file !</source> + <translation type="unfinished"/> + </message> + <message> + <source> more messages skipped]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Error</source> + <translation>Eroare</translation> + </message> + <message> + <source>CSV import: writer has errors: +</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>CsvImportWizard</name> + <message> + <source>Error</source> + <translation>Eroare</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Nu a putut fi calculată cheia principală</translation> + </message> +</context> +<context> + <name>CsvParserModel</name> + <message numerus="yes"> + <source>%n byte(s), </source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source>%n row(s), </source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source>%n column(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> +</context> +<context> + <name>DatabaseOpenWidget</name> + <message> + <source>Enter master key</source> + <translation>Introduceți cheia principală</translation> + </message> + <message> + <source>Key File:</source> + <translation>Fișier cheie:</translation> + </message> + <message> + <source>Password:</source> + <translation>Parola:</translation> + </message> + <message> + <source>Browse</source> + <translation>Răsfoiește</translation> + </message> + <message> + <source>Refresh</source> + <translation>Actualizează</translation> + </message> + <message> + <source>Challenge Response:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open the database.</source> + <translation>Nu pot deschide baza de date.</translation> + </message> + <message> + <source>Can't open key file</source> + <translation>Fișierul cheie nu a putut fi deschis</translation> + </message> + <message> + <source>Legacy key file format</source> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't show this warning again</source> + <translation type="unfinished"/> + </message> + <message> + <source>All files</source> + <translation>Toate fișierele</translation> + </message> + <message> + <source>Key files</source> + <translation>Fișiere cheie</translation> + </message> + <message> + <source>Select key file</source> + <translation>Selectați fișier cheie</translation> + </message> +</context> +<context> + <name>DatabaseRepairWidget</name> + <message> + <source>Repair database</source> + <translation>Repară baza de date</translation> + </message> + <message> + <source>Error</source> + <translation>Eroare</translation> + </message> + <message> + <source>Can't open key file</source> + <translation>Fișierul cheie nu a putut fi deschis</translation> + </message> + <message> + <source>Unable to open the database.</source> + <translation>Nu pot deschide baza de date.</translation> + </message> + <message> + <source>Database opened fine. Nothing to do.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Success</source> + <translation>Succes</translation> + </message> + <message> + <source>The database has been successfully repaired +You can now save it.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to repair the database.</source> + <translation>Baza de date nu poate fi reparată.</translation> + </message> +</context> +<context> + <name>DatabaseSettingsWidget</name> + <message> + <source>General</source> + <translation>General</translation> + </message> + <message> + <source>Encryption</source> + <translation type="unfinished"/> + </message> + <message> + <source>Number of rounds too high</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Understood, keep number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cancel</source> + <translation type="unfinished"/> + </message> + <message> + <source>Number of rounds too low</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</source> + <translation type="unfinished"/> + </message> + <message> + <source>KDF unchanged</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <source> MiB</source> + <comment>Abbreviation for Mebibytes (KDF settings)</comment> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source> thread(s)</source> + <comment>Threads for parallel execution (KDF settings)</comment> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetEncryption</name> + <message> + <source>Encryption Algorithm:</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES: 256 Bit (default)</source> + <translation>AES: 256 Bit (implicit)</translation> + </message> + <message> + <source>Twofish: 256 Bit</source> + <translation>Twofish: 256 Bit</translation> + </message> + <message> + <source>Key Derivation Function:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Transform rounds:</source> + <translation>Runde de transformare:</translation> + </message> + <message> + <source>Benchmark 1-second delay</source> + <translation type="unfinished"/> + </message> + <message> + <source>Memory Usage:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Parallelism:</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetGeneral</name> + <message> + <source>Database Meta Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database name:</source> + <translation>Nume bază de date:</translation> + </message> + <message> + <source>Database description:</source> + <translation>Descriere bază de date:</translation> + </message> + <message> + <source>Default username:</source> + <translation>Nume utilizator implicit:</translation> + </message> + <message> + <source>History Settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Max. history items:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Max. history size:</source> + <translation type="unfinished"/> + </message> + <message> + <source> MiB</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use recycle bin</source> + <translation>Utilizare coș de gunoi</translation> + </message> + <message> + <source>Additional Database Settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable &compression (recommended)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseTabWidget</name> + <message> + <source>Root</source> + <comment>Root group</comment> + <translation>Rădăcină</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>Bază de date KeePass 2</translation> + </message> + <message> + <source>All files</source> + <translation>Toate fișierele</translation> + </message> + <message> + <source>Open database</source> + <translation>Deschide baza de date</translation> + </message> + <message> + <source>File not found!</source> + <translation> Fișierul nu a fost găsit</translation> + </message> + <message> + <source>Unable to open the database.</source> + <translation>Nu pot deschide baza de date.</translation> + </message> + <message> + <source>File opened in read only mode.</source> + <translation>Fișier deschis doar pentru citire.</translation> + </message> + <message> + <source>Open CSV file</source> + <translation>Deschide fișier CSV</translation> + </message> + <message> + <source>CSV file</source> + <translation>Fișier CSV</translation> + </message> + <message> + <source>All files (*)</source> + <translation>Toate fișierele (*)</translation> + </message> + <message> + <source>Merge database</source> + <translation>Îmbină baza de date</translation> + </message> + <message> + <source>Open KeePass 1 database</source> + <translation>Deschide bază de date KeePass 1</translation> + </message> + <message> + <source>KeePass 1 database</source> + <translation>Bază de date KeePass 1</translation> + </message> + <message> + <source>Close?</source> + <translation>Închidere?</translation> + </message> + <message> + <source>"%1" is in edit mode. +Discard changes and close anyway?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Save changes?</source> + <translation>Salvare modificări?</translation> + </message> + <message> + <source>"%1" was modified. +Save changes?</source> + <translation>"%1" a fost modificat. +Salvați modificările?</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Passwords</source> + <translation>Parole</translation> + </message> + <message> + <source>Save database as</source> + <translation>Salvează bază de date ca</translation> + </message> + <message> + <source>Export database to CSV file</source> + <translation>Exportă baza de date în fișier CSV</translation> + </message> + <message> + <source>Writing the CSV file failed.</source> + <translation>Scrierea în fișierul CSV a eșuat.</translation> + </message> + <message> + <source>New database</source> + <translation>Bază de date nouă</translation> + </message> + <message> + <source>locked</source> + <translation>blocat</translation> + </message> + <message> + <source>Lock database</source> + <translation>Blocare bază de date</translation> + </message> + <message> + <source>Can't lock the database as you are currently editing it. +Please press cancel to finish your changes or discard them.</source> + <translation type="unfinished"/> + </message> + <message> + <source>This database has been modified. +Do you want to save the database before locking it? +Otherwise your changes are lost.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Disable safe saves?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseWidget</name> + <message> + <source>Searching...</source> + <translation>Căutare...</translation> + </message> + <message> + <source>Change master key</source> + <translation>Modifică cheia principală</translation> + </message> + <message> + <source>Delete entry?</source> + <translation>Stergeți intrarea?</translation> + </message> + <message> + <source>Do you really want to delete the entry "%1" for good?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Delete entries?</source> + <translation>Ștergeți intrările?</translation> + </message> + <message> + <source>Do you really want to delete %1 entries for good?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Move entry to recycle bin?</source> + <translation>Mutați intrarea în coșul de gunoi?</translation> + </message> + <message> + <source>Do you really want to move entry "%1" to the recycle bin?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Move entries to recycle bin?</source> + <translation>Mutați intrările în coșul de gunoi?</translation> + </message> + <message numerus="yes"> + <source>Do you really want to move %n entry(s) to the recycle bin?</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Execute command?</source> + <translation>Executați comanda?</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation type="unfinished"/> + </message> + <message> + <source>Remember my choice</source> + <translation>Ține minte alegerea mea</translation> + </message> + <message> + <source>Delete group?</source> + <translation>Ștergeți grupul?</translation> + </message> + <message> + <source>Do you really want to delete the group "%1" for good?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Nu a putut fi calculată cheia principală</translation> + </message> + <message> + <source>No current database.</source> + <translation>Nu există o baza de date curentă.</translation> + </message> + <message> + <source>No source database, nothing to do.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Search Results (%1)</source> + <translation>Rezultatele căutării (%1)</translation> + </message> + <message> + <source>No Results</source> + <translation>Nu sunt rezultate</translation> + </message> + <message> + <source>File has changed</source> + <translation type="unfinished"/> + </message> + <message> + <source>The database file has changed. Do you want to load the changes?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Merge Request</source> + <translation>Cerere îmbinare</translation> + </message> + <message> + <source>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Could not open the new database file while attempting to autoreload this database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Empty recycle bin?</source> + <translation>Goliți coșul de gunoi?</translation> + </message> + <message> + <source>Are you sure you want to permanently delete everything from your recycle bin?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DetailsWidget</name> + <message> + <source>Generate TOTP Token</source> + <translation>Genereaza token TOTP</translation> + </message> + <message> + <source>Close</source> + <translation>Închide</translation> + </message> + <message> + <source>General</source> + <translation>General</translation> + </message> + <message> + <source>Password</source> + <translation>Parolă</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Expiration</source> + <translation>Expirare</translation> + </message> + <message> + <source>Username</source> + <translation>Nume utilizator</translation> + </message> + <message> + <source>Autotype</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searching</source> + <translation>Căutare</translation> + </message> + <message> + <source>Attributes</source> + <translation>Atribute</translation> + </message> + <message> + <source>Attachments</source> + <translation>Atașamente</translation> + </message> + <message> + <source>Notes</source> + <translation>Notițe</translation> + </message> + <message> + <source>Window</source> + <translation>Fereastră</translation> + </message> + <message> + <source>Sequence</source> + <translation>Secvență</translation> + </message> + <message> + <source>Search</source> + <translation>Caută</translation> + </message> + <message> + <source>Clear</source> + <translation>Golește</translation> + </message> + <message> + <source>Never</source> + <translation>Niciodată</translation> + </message> + <message> + <source>[PROTECTED]</source> + <translation>[PROTEJAT]</translation> + </message> + <message> + <source>Disabled</source> + <translation>Dezactivat</translation> + </message> + <message> + <source>Enabled</source> + <translation>Activat</translation> + </message> +</context> +<context> + <name>EditEntryWidget</name> + <message> + <source>Entry</source> + <translation>Intrare</translation> + </message> + <message> + <source>Advanced</source> + <translation>Avansat</translation> + </message> + <message> + <source>Icon</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Properties</source> + <translation>Proprietăți</translation> + </message> + <message> + <source>History</source> + <translation>Istoric</translation> + </message> + <message> + <source>SSH Agent</source> + <translation>Agent SSH</translation> + </message> + <message> + <source>n/a</source> + <translation>nu se aplică</translation> + </message> + <message> + <source>(encrypted)</source> + <translation>(criptat)</translation> + </message> + <message> + <source>Select private key</source> + <translation>Selectați cheia privată</translation> + </message> + <message> + <source>File too large to be a private key</source> + <translation>Fișier prea mare pentru a fi cheie privată</translation> + </message> + <message> + <source>Failed to open private key</source> + <translation>Deschiderea cheii private a eșuat</translation> + </message> + <message> + <source>Entry history</source> + <translation>Istoric intrare</translation> + </message> + <message> + <source>Add entry</source> + <translation>Adaugă intrare</translation> + </message> + <message> + <source>Edit entry</source> + <translation>Editează intrare</translation> + </message> + <message> + <source>Different passwords supplied.</source> + <translation>Au fost introduse parole diferite.</translation> + </message> + <message> + <source>New attribute</source> + <translation>Atribut nou</translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>Confirmați înlăturarea</translation> + </message> + <message> + <source>Are you sure you want to remove this attribute?</source> + <translation>Sunteți sigur că doriți să eliminați acest atribut?</translation> + </message> + <message> + <source>[PROTECTED]</source> + <translation>[PROTEJAT]</translation> + </message> + <message> + <source>Press reveal to view or edit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Tomorrow</source> + <translation>Mâine</translation> + </message> + <message numerus="yes"> + <source>%n week(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source>%n month(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>1 year</source> + <translation>1 an</translation> + </message> + <message> + <source>Apply generated password?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to apply the generated password to this entry?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EditEntryWidgetAdvanced</name> + <message> + <source>Additional attributes</source> + <translation>Atribute adiționale</translation> + </message> + <message> + <source>Add</source> + <translation>Adaugă</translation> + </message> + <message> + <source>Remove</source> + <translation> Înlătură</translation> + </message> + <message> + <source>Edit Name</source> + <translation>Editează nume</translation> + </message> + <message> + <source>Protect</source> + <translation>Protejează</translation> + </message> + <message> + <source>Reveal</source> + <translation>Dezvăluie</translation> + </message> + <message> + <source>Attachments</source> + <translation>Atașamente</translation> + </message> + <message> + <source>Foreground Color:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Background Color:</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EditEntryWidgetAutoType</name> + <message> + <source>Enable Auto-Type for this entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>Inherit default Auto-Type sequence from the &group</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Use custom Auto-Type sequence:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Window Associations</source> + <translation type="unfinished"/> + </message> + <message> + <source>+</source> + <translation>+</translation> + </message> + <message> + <source>-</source> + <translation>-</translation> + </message> + <message> + <source>Window title:</source> + <translation>Titlu fereastră:</translation> + </message> + <message> + <source>Use a specific sequence for this association:</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EditEntryWidgetHistory</name> + <message> + <source>Show</source> + <translation> Arată</translation> + </message> + <message> + <source>Restore</source> + <translation>Restaurează</translation> + </message> + <message> + <source>Delete</source> + <translation>Șterge</translation> + </message> + <message> + <source>Delete all</source> + <translation>Șterge toate</translation> + </message> +</context> +<context> + <name>EditEntryWidgetMain</name> + <message> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <source>Password:</source> + <translation>Parola:</translation> + </message> + <message> + <source>Repeat:</source> + <translation>Repetă:</translation> + </message> + <message> + <source>Title:</source> + <translation>Titlu:</translation> + </message> + <message> + <source>Notes</source> + <translation>Notițe</translation> + </message> + <message> + <source>Presets</source> + <translation>Presetări</translation> + </message> + <message> + <source>Toggle the checkbox to reveal the notes section.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username:</source> + <translation>Nume utilizator:</translation> + </message> + <message> + <source>Expires</source> + <translation>Expiră</translation> + </message> +</context> +<context> + <name>EditEntryWidgetSSHAgent</name> + <message> + <source>Form</source> + <translation>De la</translation> + </message> + <message> + <source>Remove key from agent after</source> + <translation type="unfinished"/> + </message> + <message> + <source> seconds</source> + <translation>secunde</translation> + </message> + <message> + <source>Fingerprint</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent when database is closed/locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Public key</source> + <translation>Cheie publică</translation> + </message> + <message> + <source>Add key to agent when database is opened/unlocked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Comment</source> + <translation>Comentariu</translation> + </message> + <message> + <source>Decrypt</source> + <translation>Decriptează</translation> + </message> + <message> + <source>n/a</source> + <translation>nu se aplică</translation> + </message> + <message> + <source>Copy to clipboard</source> + <translation>Copiază în clipboard</translation> + </message> + <message> + <source>Private key</source> + <translation>Cheie privată</translation> + </message> + <message> + <source>External file</source> + <translation>Fișier extern</translation> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Răsfoiește...</translation> + </message> + <message> + <source>Attachment</source> + <translation>Atașament</translation> + </message> + <message> + <source>Add to agent</source> + <translation>Adaugă în agent</translation> + </message> + <message> + <source>Remove from agent</source> + <translation>Elimină din agent</translation> + </message> + <message> + <source>Require user confirmation when this key is used</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EditGroupWidget</name> + <message> + <source>Group</source> + <translation>Grup</translation> + </message> + <message> + <source>Icon</source> + <translation type="unfinished"/> + </message> + <message> + <source>Properties</source> + <translation>Proprietăți</translation> + </message> + <message> + <source>Add group</source> + <translation>Adaugă grup</translation> + </message> + <message> + <source>Edit group</source> + <translation>Editează grup</translation> + </message> + <message> + <source>Enable</source> + <translation>Activează</translation> + </message> + <message> + <source>Disable</source> + <translation>Dezactivează</translation> + </message> + <message> + <source>Inherit from parent group (%1)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EditGroupWidgetMain</name> + <message> + <source>Name</source> + <translation>Nume</translation> + </message> + <message> + <source>Notes</source> + <translation>Notițe</translation> + </message> + <message> + <source>Expires</source> + <translation>Expiră</translation> + </message> + <message> + <source>Search</source> + <translation>Caută</translation> + </message> + <message> + <source>Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Use default Auto-Type sequence of parent group</source> + <translation type="unfinished"/> + </message> + <message> + <source>Set default Auto-Type se&quence</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EditWidgetIcons</name> + <message> + <source>&Use default icon</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use custo&m icon</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add custom icon</source> + <translation type="unfinished"/> + </message> + <message> + <source>Delete custom icon</source> + <translation type="unfinished"/> + </message> + <message> + <source>Download favicon</source> + <translation>Descarcă favicon</translation> + </message> + <message> + <source>Unable to fetch favicon.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> + <translation type="unfinished"/> + </message> + <message> + <source>Images</source> + <translation>Imagini</translation> + </message> + <message> + <source>All files</source> + <translation>Toate fișierele</translation> + </message> + <message> + <source>Select Image</source> + <translation>Selectați imagine</translation> + </message> + <message> + <source>Can't read icon</source> + <translation type="unfinished"/> + </message> + <message> + <source>Custom icon already exists</source> + <translation type="unfinished"/> + </message> + <message> + <source>Confirm Delete</source> + <translation>Confirmați ștergerea</translation> + </message> + <message> + <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EditWidgetProperties</name> + <message> + <source>Created:</source> + <translation>Creat:</translation> + </message> + <message> + <source>Modified:</source> + <translation>Modificat:</translation> + </message> + <message> + <source>Accessed:</source> + <translation>Accesat:</translation> + </message> + <message> + <source>Uuid:</source> + <translation>Uuid:</translation> + </message> + <message> + <source>Plugin Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove</source> + <translation> Înlătură</translation> + </message> + <message> + <source>Delete plugin data?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Value</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Entry</name> + <message> + <source> - Clone</source> + <comment>Suffix added to cloned entries</comment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EntryAttachmentsModel</name> + <message> + <source>Name</source> + <translation>Nume</translation> + </message> + <message> + <source>Size</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EntryAttachmentsWidget</name> + <message> + <source>Form</source> + <translation>De la</translation> + </message> + <message> + <source>Add</source> + <translation>Adaugă</translation> + </message> + <message> + <source>Remove</source> + <translation> Înlătură</translation> + </message> + <message> + <source>Open</source> + <translation>Deschide</translation> + </message> + <message> + <source>Save</source> + <translation>Salvează</translation> + </message> + <message> + <source>Select files</source> + <translation>Selectați fișierele</translation> + </message> + <message numerus="yes"> + <source>Are you sure you want to remove %n attachment(s)?</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>Confirmați înlăturarea</translation> + </message> + <message> + <source>Save attachments</source> + <translation>Salvați atașamentele</translation> + </message> + <message> + <source>Unable to create directory: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Confirm overwrite</source> + <translation>Confirmați suprascrierea</translation> + </message> + <message> + <source>Unable to save attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachment: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open files: +%1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EntryAttributesModel</name> + <message> + <source>Name</source> + <translation>Nume</translation> + </message> +</context> +<context> + <name>EntryHistoryModel</name> + <message> + <source>Last modified</source> + <translation>Ultima modificare</translation> + </message> + <message> + <source>Title</source> + <translation>Titlu</translation> + </message> + <message> + <source>Username</source> + <translation>Nume utilizator</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> +</context> +<context> + <name>EntryModel</name> + <message> + <source>Ref: </source> + <comment>Reference abbreviation</comment> + <translation>Ref: </translation> + </message> + <message> + <source>Group</source> + <translation>Grup</translation> + </message> + <message> + <source>Title</source> + <translation>Titlu</translation> + </message> + <message> + <source>Username</source> + <translation>Nume utilizator</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Never</source> + <translation>Niciodată</translation> + </message> + <message> + <source>Password</source> + <translation>Parolă</translation> + </message> + <message> + <source>Notes</source> + <translation>Notițe</translation> + </message> + <message> + <source>Expires</source> + <translation>Expiră</translation> + </message> + <message> + <source>Created</source> + <translation type="unfinished"/> + </message> + <message> + <source>Modified</source> + <translation type="unfinished"/> + </message> + <message> + <source>Accessed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation>Atașamente</translation> + </message> +</context> +<context> + <name>EntryView</name> + <message> + <source>Customize View</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide Usernames</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide Passwords</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fit to window</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fit to contents</source> + <translation type="unfinished"/> + </message> + <message> + <source>Reset to defaults</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Group</name> + <message> + <source>Recycle Bin</source> + <translation>Coș de gunoi</translation> + </message> +</context> +<context> + <name>HostInstaller</name> + <message> + <source>KeePassXC: Cannot save file!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot save the native messaging script file.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>HttpPasswordGeneratorWidget</name> + <message> + <source>Length:</source> + <translation>Lungime:</translation> + </message> + <message> + <source>Character Types</source> + <translation>Tipuri de caractere</translation> + </message> + <message> + <source>Upper Case Letters</source> + <translation>Litere mari</translation> + </message> + <message> + <source>A-Z</source> + <translation>A-Z</translation> + </message> + <message> + <source>Lower Case Letters</source> + <translation>Litere mici</translation> + </message> + <message> + <source>a-z</source> + <translation>a-z</translation> + </message> + <message> + <source>Numbers</source> + <translation>Numere</translation> + </message> + <message> + <source>0-9</source> + <translation>0-9</translation> + </message> + <message> + <source>Special Characters</source> + <translation>Caractere speciale</translation> + </message> + <message> + <source>/*_& ...</source> + <translation>/*_& ...</translation> + </message> + <message> + <source>Exclude look-alike characters</source> + <translation>Exclude caractere asemănătoare</translation> + </message> + <message> + <source>Ensure that the password contains characters from every group</source> + <translation type="unfinished"/> + </message> + <message> + <source>Extended ASCII</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KMessageWidget</name> + <message> + <source>&Close</source> + <translation type="unfinished"/> + </message> + <message> + <source>Close message</source> + <translation>Închide mesaj</translation> + </message> +</context> +<context> + <name>Kdbx3Reader</name> + <message> + <source>Unable to calculate master key</source> + <translation>Nu a putut fi calculată cheia principală</translation> + </message> + <message> + <source>Unable to issue challenge-response.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>Cheie greșită sau fișier bază de date corupt.</translation> + </message> +</context> +<context> + <name>Kdbx3Writer</name> + <message> + <source>Unable to issue challenge-response.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Nu a putut fi calculată cheia principală</translation> + </message> +</context> +<context> + <name>Kdbx4Reader</name> + <message> + <source>missing database headers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Nu a putut fi calculată cheia principală</translation> + </message> + <message> + <source>Invalid header checksum size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Header SHA256 mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header data length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open buffer for KDF parameters in header</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported key derivation function (KDF) or invalid parameters</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy header fields found in KDBX4 file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header binary size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass variant map version.</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name data</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value data</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Bool entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry type</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map field type size</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Kdbx4Writer</name> + <message> + <source>Invalid symmetric cipher algorithm.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid symmetric cipher IV size.</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Nu a putut fi calculată cheia principală</translation> + </message> + <message> + <source>Failed to serialize KDF parameters variant map</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxReader</name> + <message> + <source>Invalid cipher uuid length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid compression flags length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported compression algorithm</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid master seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform rounds size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid start bytes size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid random stream id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner random stream cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>Nu este o bază de date KeePass.</translation> + </message> + <message> + <source>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass 2 database version.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxXmlReader</name> + <message> + <source>XML parsing failure: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>No root group</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing icon uuid or data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing custom data key or value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Multiple group elements</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null group uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableAutoType value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableSearching value</source> + <translation type="unfinished"/> + </message> + <message> + <source>No group uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null DeleteObject uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing DeletedObject uuid or time</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null entry uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element in history entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>No entry uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element with different uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decrypt entry string</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate custom attribute found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry string key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate attachment found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry binary key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-type association window or sequence missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid bool value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid date time value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color rgb part</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid uuid value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decompress binary</source> + <extracomment>Translator meant is a binary data inside an entry</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KeePass1OpenWidget</name> + <message> + <source>Import KeePass1 database</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open the database.</source> + <translation>Nu pot deschide baza de date.</translation> + </message> +</context> +<context> + <name>KeePass1Reader</name> + <message> + <source>Unable to read keyfile.</source> + <translation>Fișierul cheie nu poate fi citit.</translation> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>Nu este o bază de date KeePass.</translation> + </message> + <message> + <source>Unsupported encryption algorithm.</source> + <translation>Algoritm criptare nesuportat.</translation> + </message> + <message> + <source>Unsupported KeePass database version.</source> + <translation>Versiune bază de date KeePass nesuportată.</translation> + </message> + <message> + <source>Unable to read encryption IV</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of groups</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid content hash size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of transform rounds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to construct group tree</source> + <translation type="unfinished"/> + </message> + <message> + <source>Root</source> + <translation>Rădăcină</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Nu a putut fi calculată cheia principală</translation> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>Cheie greșită sau fișier bază de date corupt.</translation> + </message> + <message> + <source>Key transformation failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read group field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group access time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group level field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing group id or level</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing entry field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read entry field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry uuid field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field type</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Main</name> + <message> + <source>Existing single-instance lock file is invalid. Launching new instance.</source> + <translation type="unfinished"/> + </message> + <message> + <source>The lock file could not be created. Single-instance mode disabled.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Another instance of KeePassXC is already running.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fatal error while testing the cryptographic functions.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC - Error</source> + <translation>KeePassXC - Eroare</translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <source>&Database</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Recent databases</source> + <translation type="unfinished"/> + </message> + <message> + <source>Import</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Help</source> + <translation type="unfinished"/> + </message> + <message> + <source>E&ntries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy att&ribute to clipboard</source> + <translation type="unfinished"/> + </message> + <message> + <source>Time-based one-time password</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Groups</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Tools</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Quit</source> + <translation type="unfinished"/> + </message> + <message> + <source>&About</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Open database...</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Save database</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Close database</source> + <translation type="unfinished"/> + </message> + <message> + <source>&New database</source> + <translation type="unfinished"/> + </message> + <message> + <source>Merge from KeePassX database</source> + <translation>Îmbină dintr-o bază de date KeePass</translation> + </message> + <message> + <source>&Add new entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>&View/Edit entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Delete entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Add new group</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Edit group</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Delete group</source> + <translation type="unfinished"/> + </message> + <message> + <source>Sa&ve database as...</source> + <translation type="unfinished"/> + </message> + <message> + <source>Change &master key...</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Database settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database settings</source> + <translation>Setări bază de date</translation> + </message> + <message> + <source>&Clone entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Find</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy &username</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy username to clipboard</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cop&y password</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy password to clipboard</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Settings</source> + <translation>&Setări</translation> + </message> + <message> + <source>Password Generator</source> + <translation>Generator de parole</translation> + </message> + <message> + <source>&Perform Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Open URL</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Lock databases</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Title</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy title to clipboard</source> + <translation type="unfinished"/> + </message> + <message> + <source>&URL</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy URL to clipboard</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Notes</source> + <translation>&Notițe</translation> + </message> + <message> + <source>Copy notes to clipboard</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Export to CSV file...</source> + <translation type="unfinished"/> + </message> + <message> + <source>Import KeePass 1 database...</source> + <translation>Importă bază de date KeePass 1...</translation> + </message> + <message> + <source>Import CSV file...</source> + <translation>Importă fișier CSV...</translation> + </message> + <message> + <source>Re&pair database...</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show TOTP</source> + <translation type="unfinished"/> + </message> + <message> + <source>Set up TOTP...</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy &TOTP</source> + <translation type="unfinished"/> + </message> + <message> + <source>E&mpty recycle bin</source> + <translation type="unfinished"/> + </message> + <message> + <source>Clear history</source> + <translation>Golește istoric</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation type="unfinished"/> + </message> + <message> + <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> + <translation type="unfinished"/> + </message> + <message> + <source>read-only</source> + <translation type="unfinished"/> + </message> + <message> + <source>Settings</source> + <translation>Setări</translation> + </message> + <message> + <source>Toggle window</source> + <translation type="unfinished"/> + </message> + <message> + <source>Quit KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>Bază de date KeePass 2</translation> + </message> + <message> + <source>All files</source> + <translation>Toate fișierele</translation> + </message> + <message> + <source>Open database</source> + <translation>Deschide baza de date</translation> + </message> + <message> + <source>Save repaired database</source> + <translation>Salvează bază de date reparată</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Please touch the button on your YubiKey!</source> + <translation type="unfinished"/> + </message> + <message> + <source>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>OpenSSHKey</name> + <message> + <source>Invalid key file, expecting an OpenSSH key</source> + <translation type="unfinished"/> + </message> + <message> + <source>PEM boundary mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>Base64 decoding failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file way too small.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file magic header id invalid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Found zero keys</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to read public key.</source> + <translation>Citirea cheii publice a eșuat.</translation> + </message> + <message> + <source>Corrupted key file, reading private key failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>No private key payload to decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>Trying to run KDF without cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Passphrase is required to decrypt this key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key derivation failed, key file corrupted?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Decryption failed, wrong passphrase?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write public key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write private key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported key type: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cipher IV is too short for MD5 kdf</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>OptionDialog</name> + <message> + <source>Dialog</source> + <translation>Dialog</translation> + </message> + <message> + <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable KeePassHTTP server</source> + <translation>Actvați serverul KeePassHTTP</translation> + </message> + <message> + <source>General</source> + <translation>General</translation> + </message> + <message> + <source>Sh&ow a notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return only best matching entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Match URL schemes</source> + <translation type="unfinished"/> + </message> + <message> + <source>Sort matching entries by &username</source> + <translation type="unfinished"/> + </message> + <message> + <source>Sort &matching entries by title</source> + <translation type="unfinished"/> + </message> + <message> + <source>R&emove all shared encryption keys from active database</source> + <translation type="unfinished"/> + </message> + <message> + <source>Re&move all stored permissions from entries in active database</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password Generator</source> + <translation>Generator de parole</translation> + </message> + <message> + <source>Advanced</source> + <translation>Avansat</translation> + </message> + <message> + <source>Always allow &access to entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Always allow &updating entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searc&h in all opened databases for matching entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation type="unfinished"/> + </message> + <message> + <source>HTTP Port:</source> + <translation>Port HTTP:</translation> + </message> + <message> + <source>Default port: 19455</source> + <translation>Port implicit: 19455</translation> + </message> + <message> + <source>KeePassXC will listen to this port on 127.0.0.1</source> + <translation type="unfinished"/> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot bind to privileged ports</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot bind to privileged ports below 1024! +Using default port 19455.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>PasswordGeneratorWidget</name> + <message> + <source>%p%</source> + <translation>%p%</translation> + </message> + <message> + <source>Password:</source> + <translation>Parola:</translation> + </message> + <message> + <source>strength</source> + <comment>Password strength</comment> + <translation>putere</translation> + </message> + <message> + <source>entropy</source> + <translation>entropie</translation> + </message> + <message> + <source>Password</source> + <translation>Parolă</translation> + </message> + <message> + <source>Character Types</source> + <translation>Tipuri de caractere</translation> + </message> + <message> + <source>Upper Case Letters</source> + <translation>Litere mari</translation> + </message> + <message> + <source>Lower Case Letters</source> + <translation>Litere mici</translation> + </message> + <message> + <source>Numbers</source> + <translation>Numere</translation> + </message> + <message> + <source>Special Characters</source> + <translation>Caractere speciale</translation> + </message> + <message> + <source>Extended ASCII</source> + <translation type="unfinished"/> + </message> + <message> + <source>Exclude look-alike characters</source> + <translation>Exclude caractere asemănătoare</translation> + </message> + <message> + <source>Pick characters from every group</source> + <translation>Alegeți caractere din fiecare grup</translation> + </message> + <message> + <source>&Length:</source> + <translation>&Lungime:</translation> + </message> + <message> + <source>Passphrase</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wordlist:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Word Count:</source> + <translation>Număr cuvinte:</translation> + </message> + <message> + <source>Word Separator:</source> + <translation>Separator cuvinte:</translation> + </message> + <message> + <source>Generate</source> + <translation>Generează</translation> + </message> + <message> + <source>Copy</source> + <translation>Copiază</translation> + </message> + <message> + <source>Accept</source> + <translation>Acceptă</translation> + </message> + <message> + <source>Close</source> + <translation>Închide</translation> + </message> + <message> + <source>Apply</source> + <translation>Aplică</translation> + </message> + <message> + <source>Entropy: %1 bit</source> + <translation>Entropie: %1 bit</translation> + </message> + <message> + <source>Password Quality: %1</source> + <translation>Calitate parolă: %1</translation> + </message> + <message> + <source>Poor</source> + <comment>Password quality</comment> + <translation>Inacceptabil</translation> + </message> + <message> + <source>Weak</source> + <comment>Password quality</comment> + <translation>Slab</translation> + </message> + <message> + <source>Good</source> + <comment>Password quality</comment> + <translation>Bun</translation> + </message> + <message> + <source>Excellent</source> + <comment>Password quality</comment> + <translation>Excelent</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <source>Database not opened</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database hash not available</source> + <translation type="unfinished"/> + </message> + <message> + <source>Client public key not received</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot decrypt message</source> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout or cannot connect to KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>Action cancelled or denied</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC association failed, try again</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key change was not successful</source> + <translation type="unfinished"/> + </message> + <message> + <source>Encryption key is not recognized</source> + <translation type="unfinished"/> + </message> + <message> + <source>No saved databases found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect action</source> + <translation type="unfinished"/> + </message> + <message> + <source>Empty message received</source> + <translation type="unfinished"/> + </message> + <message> + <source>No URL provided</source> + <translation type="unfinished"/> + </message> + <message> + <source>No logins found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown error</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add a new entry to a database.</source> + <translation>Adaugă o intrare nouă în baza de date.</translation> + </message> + <message> + <source>Path of the database.</source> + <translation>Calea către baza de date</translation> + </message> + <message> + <source>Key file of the database.</source> + <translation>Fișier cheie al bazei de date.</translation> + </message> + <message> + <source>path</source> + <translation>cale</translation> + </message> + <message> + <source>Username for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>username</source> + <translation>nume utilizator</translation> + </message> + <message> + <source>URL for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Prompt for the entry's password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a password for the entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length for the generated password.</source> + <translation>Lungimea parolei generate.</translation> + </message> + <message> + <source>length</source> + <translation>lungime</translation> + </message> + <message> + <source>Path of the entry to add.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy an entry's password to the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to clip.</source> + <comment>clip = copy to clipboard</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout in seconds before clearing the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Edit an entry.</source> + <translation>Editați o intrare.</translation> + </message> + <message> + <source>Title for the entry.</source> + <translation>Titlu pentru intrare.</translation> + </message> + <message> + <source>title</source> + <translation>titlu</translation> + </message> + <message> + <source>Path of the entry to edit.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Estimate the entropy of a password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password for which to estimate the entropy.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Perform advanced analysis on the password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Extract and print the content of a database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database to extract.</source> + <translation>Calea bazei de date pentru extragere.</translation> + </message> + <message> + <source>Insert password to unlock %1: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to load key file %1 : %2</source> + <translation type="unfinished"/> + </message> + <message> + <source>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source> + +Available commands: +</source> + <translation> + +Comenzi disponibile: +</translation> + </message> + <message> + <source>Name of the command to execute.</source> + <translation>Numele comenzii de executat.</translation> + </message> + <message> + <source>List database entries.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the group to list. Default is /</source> + <translation type="unfinished"/> + </message> + <message> + <source>Find entries quickly.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Search term.</source> + <translation>Termen de căutare.</translation> + </message> + <message> + <source>Merge two databases.</source> + <translation>Îmbina doua baze de date</translation> + </message> + <message> + <source>Path of the database to merge into.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database to merge from.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use the same credentials for both database files.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file of the database to merge from.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show an entry's information.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> + <translation type="unfinished"/> + </message> + <message> + <source>attribute</source> + <translation>atribut</translation> + </message> + <message> + <source>Name of the entry to show.</source> + <translation type="unfinished"/> + </message> + <message> + <source>NULL device</source> + <translation type="unfinished"/> + </message> + <message> + <source>error reading from device</source> + <translation type="unfinished"/> + </message> + <message> + <source>file empty ! +</source> + <translation>fișier vid! +</translation> + </message> + <message> + <source>malformed string</source> + <translation type="unfinished"/> + </message> + <message> + <source>missing closing quote</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Twofish: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>ChaCha20: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Argon2 (KDBX 4 – recommended)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 4)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 3.1)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Group</source> + <translation>Grup</translation> + </message> + <message> + <source>Title</source> + <translation>Titlu</translation> + </message> + <message> + <source>Username</source> + <translation>Nume utilizator</translation> + </message> + <message> + <source>Password</source> + <translation>Parolă</translation> + </message> + <message> + <source>Notes</source> + <translation>Notițe</translation> + </message> + <message> + <source>Last Modified</source> + <translation type="unfinished"/> + </message> + <message> + <source>Created</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy Browser Integration</source> + <translation type="unfinished"/> + </message> + <message> + <source>Browser Integration</source> + <translation>Integrare cu browserul</translation> + </message> + <message> + <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source> + <translation type="unfinished"/> + </message> + <message> + <source>Press</source> + <translation>Apasă</translation> + </message> + <message> + <source>Passive</source> + <translation>Pasiv</translation> + </message> + <message> + <source>SSH Agent</source> + <translation>Agent SSH</translation> + </message> + <message> + <source>Generate a new random diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Word count for the diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>count</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wordlist for the diceware generator. +[Default: EFF English]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a new random password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length of the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use lowercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use uppercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use numbers in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use special characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use extended ASCII in the generated password.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QtIOCompressor</name> + <message> + <source>Internal zlib error when compressing: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Error writing to underlying device: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Error opening underlying device: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Error reading data from underlying device: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Internal zlib error when decompressing: </source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QtIOCompressor::open</name> + <message> + <source>The gzip format not supported in this version of zlib.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Internal zlib error: </source> + <translation>Eroare internă zlib:</translation> + </message> +</context> +<context> + <name>SearchWidget</name> + <message> + <source>Search...</source> + <translation>Caută...</translation> + </message> + <message> + <source>Search</source> + <translation>Caută</translation> + </message> + <message> + <source>Clear</source> + <translation>Golește</translation> + </message> + <message> + <source>Case Sensitive</source> + <translation type="unfinished"/> + </message> + <message> + <source>Limit search to selected group</source> + <translation>Limitați căutarea la grupul selectat</translation> + </message> +</context> +<context> + <name>Service</name> + <message> + <source>KeePassXC: New key association request</source> + <translation type="unfinished"/> + </message> + <message> + <source>You have received an association request for the above key. +If you would like to allow it access to your KeePassXC database +give it a unique name to identify and accept it.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation type="unfinished"/> + </message> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation type="unfinished"/> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation type="unfinished"/> + </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation type="unfinished"/> + </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Removing stored permissions...</source> + <translation type="unfinished"/> + </message> + <message> + <source>Abort</source> + <translation>Anulează</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entries.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation type="unfinished"/> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SettingsWidget</name> + <message> + <source>Application Settings</source> + <translation>Setări aplicație</translation> + </message> + <message> + <source>General</source> + <translation>General</translation> + </message> + <message> + <source>Security</source> + <translation>Securitate</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SettingsWidgetGeneral</name> + <message> + <source>Basic Settings</source> + <translation>Setări de bază</translation> + </message> + <message> + <source>Start only a single instance of KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remember last databases</source> + <translation>Memorează ultimele baze de date</translation> + </message> + <message> + <source>Remember last key files and security dongles</source> + <translation type="unfinished"/> + </message> + <message> + <source>Load previous databases on startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically save on exit</source> + <translation>Salvare automată la ieșire</translation> + </message> + <message> + <source>Automatically save after every change</source> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation type="unfinished"/> + </message> + <message> + <source>Minimize when copying to clipboard</source> + <translation type="unfinished"/> + </message> + <message> + <source>Minimize window at application startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use group icon on entry creation</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide the Details view</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show a system tray icon</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide window to system tray when minimized</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide window to system tray instead of app exit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Dark system tray icon</source> + <translation type="unfinished"/> + </message> + <message> + <source>Language</source> + <translation>Limbă</translation> + </message> + <message> + <source>Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use entry title to match windows for global Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use entry URL to match windows for global Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Always ask before performing Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Global Auto-Type shortcut</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-Type delay</source> + <translation type="unfinished"/> + </message> + <message> + <source> ms</source> + <comment>Milliseconds</comment> + <translation> ms</translation> + </message> + <message> + <source>Startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>File Management</source> + <translation type="unfinished"/> + </message> + <message> + <source>Safely save database files (may be incompatible with Dropbox, etc)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Backup database file before saving</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry Management</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>General</translation> + </message> +</context> +<context> + <name>SettingsWidgetSecurity</name> + <message> + <source>Timeouts</source> + <translation type="unfinished"/> + </message> + <message> + <source>Clear clipboard after</source> + <translation>Golește clipboard după</translation> + </message> + <message> + <source> sec</source> + <comment>Seconds</comment> + <translation> sec</translation> + </message> + <message> + <source>Lock databases after inactivity of</source> + <translation type="unfinished"/> + </message> + <message> + <source>Convenience</source> + <translation>Comoditate</translation> + </message> + <message> + <source>Lock databases when session is locked or lid is closed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Lock databases after minimizing the window</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't require password repeat when it is visible</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show passwords in cleartext by default</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide passwords in the preview panel</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide entry notes by default</source> + <translation type="unfinished"/> + </message> + <message> + <source>Privacy</source> + <translation>Confidențialitate</translation> + </message> + <message> + <source>Use Google as fallback for downloading website icons</source> + <translation type="unfinished"/> + </message> + <message> + <source>Re-lock previously locked database after performing Auto-Type</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SetupTotpDialog</name> + <message> + <source>Setup TOTP</source> + <translation>Configurați TOTP</translation> + </message> + <message> + <source>Key:</source> + <translation>Cheie:</translation> + </message> + <message> + <source>Default RFC 6238 token settings</source> + <translation>Setări implicite token RFC 6238</translation> + </message> + <message> + <source>Steam token settings</source> + <translation>Setări token Steam</translation> + </message> + <message> + <source>Use custom settings</source> + <translation>Utilizați setările personalizate</translation> + </message> + <message> + <source>Note: Change these settings only if you know what you are doing.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Time step:</source> + <translation type="unfinished"/> + </message> + <message> + <source>8 digits</source> + <translation>8 cifre</translation> + </message> + <message> + <source>6 digits</source> + <translation>6 cifre</translation> + </message> + <message> + <source>Code size:</source> + <translation>Dimensiune cod:</translation> + </message> + <message> + <source> sec</source> + <comment>Seconds</comment> + <translation> sec</translation> + </message> +</context> +<context> + <name>TotpDialog</name> + <message> + <source>Timed Password</source> + <translation>Parolă temporizată</translation> + </message> + <message> + <source>000000</source> + <translation>000000</translation> + </message> + <message> + <source>Copy</source> + <translation>Copiază</translation> + </message> + <message> + <source>Expires in</source> + <translation>Expiră în</translation> + </message> + <message> + <source>seconds</source> + <translation>secunde</translation> + </message> +</context> +<context> + <name>UnlockDatabaseWidget</name> + <message> + <source>Unlock database</source> + <translation>Deblocare bază de date</translation> + </message> +</context> +<context> + <name>WelcomeWidget</name> + <message> + <source>Start storing your passwords securely in a KeePassXC database</source> + <translation type="unfinished"/> + </message> + <message> + <source>Create new database</source> + <translation>Creează o bază de date nouă</translation> + </message> + <message> + <source>Open existing database</source> + <translation>Deschide bază de date existentă</translation> + </message> + <message> + <source>Import from KeePass 1</source> + <translation>Importă din KeePass 1</translation> + </message> + <message> + <source>Import from CSV</source> + <translation>Importă din CSV</translation> + </message> + <message> + <source>Recent databases</source> + <translation>Baze de date recente</translation> + </message> + <message> + <source>Welcome to KeePassXC %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>main</name> + <message> + <source>Remove an entry from the database.</source> + <translation>Eliminați o intrare din baza de date.</translation> + </message> + <message> + <source>Path of the database.</source> + <translation>Calea către baza de date</translation> + </message> + <message> + <source>Path of the entry to remove.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation type="unfinished"/> + </message> + <message> + <source>filenames of the password databases to open (*.kdbx)</source> + <translation type="unfinished"/> + </message> + <message> + <source>path to a custom config file</source> + <translation type="unfinished"/> + </message> + <message> + <source>key file of the database</source> + <translation type="unfinished"/> + </message> + <message> + <source>read password of the database from stdin</source> + <translation type="unfinished"/> + </message> + <message> + <source>Parent window handle</source> + <translation type="unfinished"/> + </message> +</context> +</TS> \ No newline at end of file diff --git a/share/translations/keepassx_ru.ts b/share/translations/keepassx_ru.ts index 6fbe2c430..42ee1daaf 100644 --- a/share/translations/keepassx_ru.ts +++ b/share/translations/keepassx_ru.ts @@ -15,15 +15,11 @@ </message> <message> <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassXC распространяется на условиях Стандартной общественной лицензии GNU (GPL) версии 2 или (на ваше усмотрение) версии 3.</translation> - </message> - <message> - <source>Project Maintainers:</source> - <translation>Проект сопровождают:</translation> + <translation>KeePassXC распространяется на условиях универсальной общественной лицензии GNU (GPL) версии 2 или 3 (на ваше усмотрение).</translation> </message> <message> <source>Contributors</source> - <translation>Участники</translation> + <translation>Авторы</translation> </message> <message> <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> @@ -35,7 +31,7 @@ </message> <message> <source>Include the following information whenever you report a bug:</source> - <translation>Включите следующую информацию, когда сообщаете об ошибке:</translation> + <translation>Добавьте в сообщение об ошибке следующую информацию:</translation> </message> <message> <source>Copy to clipboard</source> @@ -71,6 +67,20 @@ Kernel: %3 %4</source> <source>Enabled extensions:</source> <translation>Включенные расширения:</translation> </message> + <message> + <source>Project Maintainers:</source> + <translation>Проект сопровождают:</translation> + </message> + <message> + <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> + <translation>Команда KeePassXC выражает особую благодарность debfx за создание оригинального KeePassX.</translation> + </message> + <message> + <source>Build Type: %1 +</source> + <translation>Тип сборки: %1 +</translation> + </message> </context> <context> <name>AccessControlDialog</name> @@ -93,7 +103,7 @@ Kernel: %3 %4</source> <message> <source>%1 has requested access to passwords for the following item(s). Please select whether you want to allow access.</source> - <translation>%1 запросил доступ к паролям для следующего элемента(ов). + <translation>%1 запросил доступ к паролям для следующего элемента(-ов). Разрешить доступ?</translation> </message> </context> @@ -101,7 +111,7 @@ Please select whether you want to allow access.</source> <name>AgentSettingsWidget</name> <message> <source>Enable SSH Agent (requires restart)</source> - <translation>Включить агент SSH (требуется перезапуск)</translation> + <translation>Включить SSH агент (необходим перезапуск)</translation> </message> </context> <context> @@ -120,11 +130,11 @@ Please select whether you want to allow access.</source> </message> <message> <source>The Syntax of your Auto-Type statement is incorrect!</source> - <translation>Неверная инструкции автоввода!</translation> + <translation>Неверная инструкция автоввода!</translation> </message> <message> <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> - <translation>Слишком большая задержка в инструкции автоввода. Вы действительно хотите продолжить?</translation> + <translation>Слишком большая задержка в инструкции автоввода. Действительно продолжить?</translation> </message> <message> <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> @@ -150,6 +160,25 @@ Please select whether you want to allow access.</source> <translation>Стандартная последовательность</translation> </message> </context> +<context> + <name>AutoTypeMatchModel</name> + <message> + <source>Group</source> + <translation>Группа</translation> + </message> + <message> + <source>Title</source> + <translation>Имя записи</translation> + </message> + <message> + <source>Username</source> + <translation>Имя пользователя</translation> + </message> + <message> + <source>Sequence</source> + <translation>Последовательность</translation> + </message> +</context> <context> <name>AutoTypeSelectDialog</name> <message> @@ -194,7 +223,7 @@ Please select whether you want to allow access.</source> </message> <message> <source>This is required for accessing your databases with KeePassXC-Browser</source> - <translation>Это требуется для доступа к вашей базы данных с KeePassXC-Browser</translation> + <translation>Это требуется для доступа к вашим базам данных при использовании KeePassXC-Browser</translation> </message> <message> <source>Enable KeepassXC browser integration</source> @@ -235,15 +264,15 @@ Please select whether you want to allow access.</source> </message> <message> <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> - <translation>Возвращаются только записи с той же схемой (http://, https://,...).</translation> + <translation>Возвращать записи только при соответствии протокола (http://, https://,...).</translation> </message> <message> <source>&Match URL scheme (e.g., https://...)</source> - <translation>&Совпадение схем URL-адресов (например: https://...)</translation> + <translation>&Проверять совпадение схем для URL-адресов (например: https://...)</translation> </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation>Возвращает только лучшие совпадения для определенного URL-адреса вместо всех записей для всего домена.</translation> + <translation>Возвращать при поиске по URL только лучшие совпадения, а не все записи для домена.</translation> </message> <message> <source>&Return only best-matching credentials</source> @@ -269,7 +298,7 @@ Please select whether you want to allow access.</source> </message> <message> <source>Advanced</source> - <translation>Продвинутые</translation> + <translation>Дополнительные</translation> </message> <message> <source>Never &ask before accessing credentials</source> @@ -288,7 +317,7 @@ Please select whether you want to allow access.</source> <message> <source>Searc&h in all opened databases for matching credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>&Поиск во всех открытых базах данных для сопоставления учетных данных</translation> </message> <message> <source>Automatically creating or updating string fields is not supported.</source> @@ -296,15 +325,15 @@ Please select whether you want to allow access.</source> </message> <message> <source>&Return advanced string fields which start with "KPH: "</source> - <translation>Возвращать продвинутые стро&ковые поля, начинающиеся с «KPH: »</translation> + <translation>Возвращать дополнительные стро&ковые поля, начинающиеся с "KPH: "</translation> </message> <message> <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> - <translation type="unfinished"/> + <translation>Автоматически обновлять пути к сценариям механизма native messaging при запуске KeePassXC или keepassxc-proxy.</translation> </message> <message> <source>Update &native messaging manifest files at startup</source> - <translation type="unfinished"/> + <translation>Обновлять при запуске файлы манифеста механизма &native messaging</translation> </message> <message> <source>Support a proxy application between KeePassXC and browser extension.</source> @@ -381,7 +410,7 @@ Do you want to overwrite it?</source> </message> <message> <source>Do you want to update the information in %1 - %2?</source> - <translation>Обновить информацию в %1 - %2?</translation> + <translation>Обновить информацию в %1 — %2?</translation> </message> <message> <source>KeePassXC: Database locked!</source> @@ -395,7 +424,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>KeePassXC: Settings not available!</source> - <translation>KeePassXC: Настройки недоступны!</translation> + <translation>KeePassXC: Параметры недоступны!</translation> </message> <message> <source>The active database does not contain a settings entry.</source> @@ -458,7 +487,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>&Key file</source> - <translation>Файл-&ключ</translation> + <translation>&Ключевой файл</translation> </message> <message> <source>Browse</source> @@ -470,7 +499,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Cha&llenge Response</source> - <translation>Запрос ответа</translation> + <translation>&Вызов-ответ</translation> </message> <message> <source>Refresh</source> @@ -478,7 +507,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Key files</source> - <translation>Файлы-ключи</translation> + <translation>Файлы ключей</translation> </message> <message> <source>All files</source> @@ -486,15 +515,15 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Create Key File...</source> - <translation>Создать ключ-файл...</translation> + <translation>Создать ключевой файл...</translation> </message> <message> <source>Unable to create Key File : </source> - <translation>Невозможно создать ключ-файл:</translation> + <translation>Невозможно создать ключевой файл:</translation> </message> <message> <source>Select a key file</source> - <translation>Выбрать ключ-файл</translation> + <translation>Выберите ключевой файл</translation> </message> <message> <source>Empty password</source> @@ -502,7 +531,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Do you really want to use an empty string as password?</source> - <translation>Использовать в качестве пароля пустую строку?</translation> + <translation>Вы действительно хотите использовать в качестве пароля пустую строку?</translation> </message> <message> <source>Different passwords supplied.</source> @@ -511,25 +540,25 @@ Please unlock the selected database or choose another one which is unlocked.</so <message> <source>Failed to set %1 as the Key file: %2</source> - <translation>Не удалось установить %1 как ключ-файл: + <translation>Не удалось установить %1 ключевым файлом: %2</translation> </message> <message> <source>Legacy key file format</source> - <translation>Формат файла устаревшего ключа</translation> + <translation>Устаревший формат ключевого файла</translation> </message> <message> <source>You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation>Вы используете устаревший формат файл ключа, поддержка которого может быть прекращена в будущем. + <translation>Вы используете устаревший формат ключевого файла, поддержка которого может быть прекращена в будущем. -Рассмотрите возможность создания нового файла ключа.</translation> +Рассмотрите возможность создания нового ключевого файла.</translation> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> - <translation>Не удалось сменить мастер-ключ: ни один YubiKey не вставлен.</translation> + <translation>Не удалось сменить мастер-ключ: YubiKey не подключен.</translation> </message> </context> <context> @@ -559,11 +588,11 @@ Please consider generating a new key file.</source> </message> <message> <source>filename</source> - <translation>Имя файла</translation> + <translation>имя файла</translation> </message> <message> <source>size, rows, columns</source> - <translation>Размер, строки, столбцы</translation> + <translation>размер, строк, столбцов </translation> </message> <message> <source>Encoding</source> @@ -571,7 +600,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Codec</source> - <translation>Кодек</translation> + <translation>Кодировка</translation> </message> <message> <source>Text is qualified by</source> @@ -579,31 +608,31 @@ Please consider generating a new key file.</source> </message> <message> <source>Fields are separated by</source> - <translation>Параметры разделены</translation> + <translation>Разделитель полей</translation> </message> <message> <source>Comments start with</source> - <translation>Комментарии начинаются с</translation> + <translation>Символ начала комментария</translation> </message> <message> <source>First record has field names</source> - <translation>Первая запись полей</translation> + <translation>Первая запись содержит имена полей</translation> </message> <message> <source>Number of headers line to discard</source> - <translation>Количество строк заголовков для удаления</translation> + <translation>Пропустить строк в начале</translation> </message> <message> <source>Consider '\' an escape character</source> - <translation>Рассматривать маскирующим символом «\»</translation> + <translation>Символ «\» является экранирующим</translation> </message> <message> <source>Preview</source> - <translation>Предпросмотр</translation> + <translation>Предварительный просмотр</translation> </message> <message> <source>Column layout</source> - <translation>Расположение столбцов</translation> + <translation>Назначение столбцов</translation> </message> <message> <source>Not present in CSV file</source> @@ -615,7 +644,7 @@ Please consider generating a new key file.</source> </message> <message> <source>column </source> - <translation>Столбец </translation> + <translation>столбец </translation> </message> <message> <source>Imported from CSV file</source> @@ -678,7 +707,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Key File:</source> - <translation>Ключ-файл:</translation> + <translation>Ключевой файл:</translation> </message> <message> <source>Password:</source> @@ -686,7 +715,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Browse</source> - <translation>Обзор</translation> + <translation>Обзор файлов</translation> </message> <message> <source>Refresh</source> @@ -694,7 +723,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Challenge Response:</source> - <translation>Запрос ответа:</translation> + <translation>Вызов-ответ:</translation> </message> <message> <source>Unable to open the database.</source> @@ -702,20 +731,20 @@ Please consider generating a new key file.</source> </message> <message> <source>Can't open key file</source> - <translation>Не могу открыть ключ-файл</translation> + <translation>Не удается открыть ключевой файл</translation> </message> <message> <source>Legacy key file format</source> - <translation>Формат файла устаревшего ключа</translation> + <translation>Устаревший формат ключевого файла</translation> </message> <message> <source>You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation>Вы используете устаревший формат файл ключа, поддержка которого может быть прекращена в будущем. + <translation>Вы используете устаревший формат ключевого файла, поддержка которого может быть прекращена в будущем. -Рассмотрите возможность создания нового файла ключа.</translation> +Рассмотрите возможность создания нового ключевого файла.</translation> </message> <message> <source>Don't show this warning again</source> @@ -727,11 +756,11 @@ Please consider generating a new key file.</source> </message> <message> <source>Key files</source> - <translation>Файлы-ключи</translation> + <translation>Ключевые файлы</translation> </message> <message> <source>Select key file</source> - <translation>Выберите ключ-файл</translation> + <translation>Выберите ключевой файл</translation> </message> </context> <context> @@ -746,7 +775,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Can't open key file</source> - <translation>Не могу открыть ключ-файл</translation> + <translation>Не удается открыть ключевой файл</translation> </message> <message> <source>Unable to open the database.</source> @@ -754,7 +783,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Database opened fine. Nothing to do.</source> - <translation>База данных открылось прекрасно. Больше нечего делать.</translation> + <translation>База данных успешна открыта. Больше нечего делать.</translation> </message> <message> <source>Success</source> @@ -790,13 +819,13 @@ You can now save it.</source> <source>You are using a very high number of key transform rounds with Argon2. If you keep this number, your database may take hours or days (or even longer) to open!</source> - <translation>Вы используете очень большое количество раундов преобразования ключа с Argon2. + <translation>Используется слишком большое количество раундов преобразования ключа Argon2. -Если вы сохранить это значение, открытие базы данных может занять часы или дни (или даже больше)!</translation> +При сохранении этого значение открытие базы данных может занять часы или дни (или даже больше)!</translation> </message> <message> <source>Understood, keep number</source> - <translation>Понятно, сохраните номер</translation> + <translation>Понятно, сохранить значение</translation> </message> <message> <source>Cancel</source> @@ -811,9 +840,9 @@ If you keep this number, your database may take hours or days (or even longer) t <source>You are using a very low number of key transform rounds with AES-KDF. If you keep this number, your database may be too easy to crack!</source> - <translation>Вы используете очень мало раундов ключевых преобразований с AES-KDF. + <translation>Вы используете слишком мало раундов преобразования ключа AES-KDF. -Если вы сохраните это значение, база данных может быть взломана слишком легко!</translation> +При сохранении этого значения, база данных может быть взломана слишком легко!</translation> </message> <message> <source>KDF unchanged</source> @@ -823,6 +852,16 @@ If you keep this number, your database may be too easy to crack!</source> <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> <translation>Ошибка преобразования ФФК с новыми параметрами; ФФК не изменена.</translation> </message> + <message numerus="yes"> + <source> MiB</source> + <comment>Abbreviation for Mebibytes (KDF settings)</comment> + <translation><numerusform>МиБ</numerusform><numerusform>МиБ</numerusform><numerusform>МиБ</numerusform><numerusform>МиБ</numerusform></translation> + </message> + <message numerus="yes"> + <source> thread(s)</source> + <comment>Threads for parallel execution (KDF settings)</comment> + <translation><numerusform>поток</numerusform><numerusform>потока</numerusform><numerusform>потоков</numerusform><numerusform>потоков</numerusform></translation> + </message> </context> <context> <name>DatabaseSettingsWidgetEncryption</name> @@ -844,7 +883,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Transform rounds:</source> - <translation>Раундов преобразований:</translation> + <translation>Количество раундов преобразования:</translation> </message> <message> <source>Benchmark 1-second delay</source> @@ -854,18 +893,10 @@ If you keep this number, your database may be too easy to crack!</source> <source>Memory Usage:</source> <translation>Использование памяти:</translation> </message> - <message> - <source> MB</source> - <translation> МБ</translation> - </message> <message> <source>Parallelism:</source> <translation>Параллелизм:</translation> </message> - <message> - <source> thread</source> - <translation> поток</translation> - </message> </context> <context> <name>DatabaseSettingsWidgetGeneral</name> @@ -891,7 +922,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Max. history items:</source> - <translation>Максимум записей истории:</translation> + <translation>Макс. количество записей истории:</translation> </message> <message> <source>Max. history size:</source> @@ -899,12 +930,20 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source> MiB</source> - <translation>МиБ</translation> + <translation> МиБ</translation> </message> <message> <source>Use recycle bin</source> <translation>Использовать корзину</translation> </message> + <message> + <source>Additional Database Settings</source> + <translation>Дополнительные параметры базы данных</translation> + </message> + <message> + <source>Enable &compression (recommended)</source> + <translation>Включить &сжатие (рекомендуется)</translation> + </message> </context> <context> <name>DatabaseTabWidget</name> @@ -1017,7 +1056,7 @@ Save changes?</source> <source>Can't lock the database as you are currently editing it. Please press cancel to finish your changes or discard them.</source> <translation>Невозможно заблокировать базу данных, так как вы в настоящее время редактируете её. -Нажмите Отмена, чтобы завершить изменения или отклонить их.</translation> +Нажмите Отмена, чтобы завершить изменения или отменить их.</translation> </message> <message> <source>This database has been modified. @@ -1027,6 +1066,16 @@ Otherwise your changes are lost.</source> Сохранить её перед тем, как заблокировать? В противном случае все изменения будут потеряны.</translation> </message> + <message> + <source>Disable safe saves?</source> + <translation>Отключить безопасное сохранение?</translation> + </message> + <message> + <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</source> + <translation>KeePassXC не удалось сохранить базу данных несколько раз. Это могло быть вызвано службами синхронизации файлов, выполняющими блокировку сохранения файла. +Отключить безопасное сохранение и повторить попытку?</translation> + </message> </context> <context> <name>DatabaseWidget</name> @@ -1140,6 +1189,10 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>Удалить все из корзины?</translation> </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DetailsWidget</name> @@ -1213,7 +1266,7 @@ Do you want to merge your changes?</source> </message> <message> <source>[PROTECTED]</source> - <translation>[Защищённый]</translation> + <translation>[ЗАЩИЩЕННЫЙ]</translation> </message> <message> <source>Disabled</source> @@ -1232,7 +1285,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Advanced</source> - <translation>Продвинутые</translation> + <translation>Дополнительные</translation> </message> <message> <source>Icon</source> @@ -1260,19 +1313,19 @@ Do you want to merge your changes?</source> </message> <message> <source>(encrypted)</source> - <translation> (зашифровано)</translation> + <translation>(зашифровано)</translation> </message> <message> <source>Select private key</source> - <translation>Выберите личный ключ</translation> + <translation>Выберите закрытый ключ</translation> </message> <message> <source>File too large to be a private key</source> - <translation>Файл слишком большой, чтобы быть личным ключом</translation> + <translation>Слишком большой файл закрытого ключа</translation> </message> <message> <source>Failed to open private key</source> - <translation>Не удалось открыть личный ключ</translation> + <translation>Не удалось открыть закрытый ключ</translation> </message> <message> <source>Entry history</source> @@ -1284,7 +1337,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Edit entry</source> - <translation>Править запись</translation> + <translation>Редактировать запись</translation> </message> <message> <source>Different passwords supplied.</source> @@ -1326,6 +1379,18 @@ Do you want to merge your changes?</source> <source>1 year</source> <translation>1 год</translation> </message> + <message> + <source>Apply generated password?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to apply the generated password to this entry?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAdvanced</name> @@ -1357,6 +1422,14 @@ Do you want to merge your changes?</source> <source>Attachments</source> <translation>Вложения</translation> </message> + <message> + <source>Foreground Color:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Background Color:</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -1370,7 +1443,7 @@ Do you want to merge your changes?</source> </message> <message> <source>&Use custom Auto-Type sequence:</source> - <translation>Использовать сво&ю последовательность автоввода:</translation> + <translation>&Использовать свою последовательность автоввода:</translation> </message> <message> <source>Window Associations</source> @@ -1389,12 +1462,8 @@ Do you want to merge your changes?</source> <translation>Заголовок окна:</translation> </message> <message> - <source>Use default se&quence</source> - <translation>Использовать стан&дартную последовательность</translation> - </message> - <message> - <source>Set custo&m sequence:</source> - <translation>Установить сво&ю последовательность:</translation> + <source>Use a specific sequence for this association:</source> + <translation>Использовать специальную последовательность для этой ассоциации:</translation> </message> </context> <context> @@ -1463,7 +1532,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Remove key from agent after</source> - <translation>Убрать ключ из агента после</translation> + <translation>Убрать ключ из агента через</translation> </message> <message> <source> seconds</source> @@ -1503,7 +1572,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Private key</source> - <translation>Личный ключ</translation> + <translation>Закрытый ключ</translation> </message> <message> <source>External file</source> @@ -1563,7 +1632,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Inherit from parent group (%1)</source> - <translation>Наследовать у родительской группы (%1)</translation> + <translation>Наследовать от родительской группы (%1)</translation> </message> </context> <context> @@ -1594,7 +1663,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Set default Auto-Type se&quence</source> - <translation>Установить по умолчанию последовательность автоввода</translation> + <translation>Установить последовательность автоввода по умолчанию</translation> </message> </context> <context> @@ -1625,7 +1694,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation>Подсказка: в качестве резервного варианта для получения значков сайтов возможно использовать Google. Включите этот параметр в меню «Инструменты» -> «Настройки» -> «Безопасность»</translation> + <translation>Подсказка: в качестве резервного варианта для получения значков сайтов возможно использовать Google. Включите этот параметр в меню «Инструменты» -> «Параметры» -> «Безопасность»</translation> </message> <message> <source>Images</source> @@ -1674,6 +1743,31 @@ Do you want to merge your changes?</source> <source>Uuid:</source> <translation>UUID:</translation> </message> + <message> + <source>Plugin Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove</source> + <translation>Удалить</translation> + </message> + <message> + <source>Delete plugin data?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Value</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Entry</name> @@ -1819,6 +1913,65 @@ Do you want to merge your changes?</source> <source>URL</source> <translation>URL-адрес</translation> </message> + <message> + <source>Never</source> + <translation>Никогда</translation> + </message> + <message> + <source>Password</source> + <translation>Пароль</translation> + </message> + <message> + <source>Notes</source> + <translation>Примечания</translation> + </message> + <message> + <source>Expires</source> + <translation>Истекает</translation> + </message> + <message> + <source>Created</source> + <translation>Создан</translation> + </message> + <message> + <source>Modified</source> + <translation>Изменение</translation> + </message> + <message> + <source>Accessed</source> + <translation>Доступ</translation> + </message> + <message> + <source>Attachments</source> + <translation>Вложения</translation> + </message> +</context> +<context> + <name>EntryView</name> + <message> + <source>Customize View</source> + <translation>Настройка вида</translation> + </message> + <message> + <source>Hide Usernames</source> + <translation>Скрыть имена пользователей</translation> + </message> + <message> + <source>Hide Passwords</source> + <translation>Скрыть пароли</translation> + </message> + <message> + <source>Fit to window</source> + <translation>По размеру окна</translation> + </message> + <message> + <source>Fit to contents</source> + <translation>По размеру содержимого</translation> + </message> + <message> + <source>Reset to defaults</source> + <translation>Восстановить значения по умолчанию</translation> + </message> </context> <context> <name>Group</name> @@ -1882,11 +2035,15 @@ Do you want to merge your changes?</source> </message> <message> <source>Exclude look-alike characters</source> - <translation>Исключить визуально схожие символы</translation> + <translation>Не использовать визуально схожие символы</translation> </message> <message> <source>Ensure that the password contains characters from every group</source> - <translation>Убедиться, что пароль содержит символы из каждой группы</translation> + <translation>Формировать пароль с применением символов из каждой группы</translation> + </message> + <message> + <source>Extended ASCII</source> + <translation>Расширенный ASCII</translation> </message> </context> <context> @@ -1908,7 +2065,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Unable to issue challenge-response.</source> - <translation>Не удалось выполнить запрос ответа.</translation> + <translation>Не удалось выполнить вызов-ответ.</translation> </message> <message> <source>Wrong key or database file is corrupt.</source> @@ -1919,7 +2076,7 @@ Do you want to merge your changes?</source> <name>Kdbx3Writer</name> <message> <source>Unable to issue challenge-response.</source> - <translation>Не удалось выполнить запрос ответа.</translation> + <translation>Не удалось выполнить вызов-ответ.</translation> </message> <message> <source>Unable to calculate master key</source> @@ -1938,7 +2095,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Invalid header checksum size</source> - <translation>Неправильный размер контрольной суммы заголовка</translation> + <translation>Недопустимый размер контрольной суммы заголовка</translation> </message> <message> <source>Header SHA256 mismatch</source> @@ -1954,15 +2111,15 @@ Do you want to merge your changes?</source> </message> <message> <source>Invalid header id size</source> - <translation type="unfinished"/> + <translation>Недопустимый размер идентификатора заголовка</translation> </message> <message> <source>Invalid header field length</source> - <translation type="unfinished"/> + <translation>Недопустимая длина поля заголовка</translation> </message> <message> <source>Invalid header data length</source> - <translation>Неправильная длинна заголовка</translation> + <translation>Недопустимая длина данных заголовка</translation> </message> <message> <source>Failed to open buffer for KDF parameters in header</source> @@ -1982,11 +2139,11 @@ Do you want to merge your changes?</source> </message> <message> <source>Invalid inner header field length</source> - <translation type="unfinished"/> + <translation>Недопустимая длина поля внутреннего заголовка</translation> </message> <message> <source>Invalid inner header binary size</source> - <translation type="unfinished"/> + <translation>Недопустимый двоичный размер внутреннего заголовка</translation> </message> <message> <source>Unsupported KeePass variant map version.</source> @@ -1996,69 +2153,69 @@ Do you want to merge your changes?</source> <message> <source>Invalid variant map entry name length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Недопустимая длина имени структуры метаданных</translation> </message> <message> <source>Invalid variant map entry name data</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Недопустимое имя для структуры метаданных</translation> </message> <message> <source>Invalid variant map entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Недопустимое значение длины записи в структуре метаданных</translation> </message> <message> <source>Invalid variant map entry value data</source> <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Недопустимые значения структуры метаданных</translation> </message> <message> <source>Invalid variant map Bool entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Недопустимая длина логического значения в структуре метаданных</translation> </message> <message> <source>Invalid variant map Int32 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Недопустимая длина Int32 значения в структуре метаданных</translation> </message> <message> <source>Invalid variant map UInt32 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Недопустимая длина UInt32 значения в структуре метаданных</translation> </message> <message> <source>Invalid variant map Int64 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Недопустимая длина Int64 значения в структуре метаданных</translation> </message> <message> <source>Invalid variant map UInt64 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Недопустимая длина UInt64 значения в структуре метаданных</translation> </message> <message> <source>Invalid variant map entry type</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Недопустимый тип записи в структуре метаданных</translation> </message> <message> <source>Invalid variant map field type size</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Недопустимый размер поля поля в структуре метаданных</translation> </message> </context> <context> <name>Kdbx4Writer</name> <message> <source>Invalid symmetric cipher algorithm.</source> - <translation type="unfinished"/> + <translation>Недопустимый симметричный алгоритм шифрования.</translation> </message> <message> <source>Invalid symmetric cipher IV size.</source> <comment>IV = Initialization Vector for symmetric cipher</comment> - <translation type="unfinished"/> + <translation>Недопустимый размер симметричного шифра IV.</translation> </message> <message> <source>Unable to calculate master key</source> @@ -2067,7 +2224,7 @@ Do you want to merge your changes?</source> <message> <source>Failed to serialize KDF parameters variant map</source> <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Ошибка сериализации ФФК параметров структуры матаданных</translation> </message> </context> <context> @@ -2090,15 +2247,15 @@ Do you want to merge your changes?</source> </message> <message> <source>Invalid master seed size</source> - <translation type="unfinished"/> + <translation>Недопустимый размер основного seed</translation> </message> <message> <source>Invalid transform seed size</source> - <translation type="unfinished"/> + <translation>Недопустимый размер seed для трансформирования</translation> </message> <message> <source>Invalid transform rounds size</source> - <translation type="unfinished"/> + <translation>Недопустимый размер раунда преобразования</translation> </message> <message> <source>Invalid start bytes size</source> @@ -2110,7 +2267,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Invalid inner random stream cipher</source> - <translation type="unfinished"/> + <translation>Недопустимый шифр случайного внутреннего потока</translation> </message> <message> <source>Not a KeePass database.</source> @@ -2128,7 +2285,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Unsupported KeePass 2 database version.</source> - <translation type="unfinished"/> + <translation>Неподдерживаемая версия базы данных KeePass 2.</translation> </message> </context> <context> @@ -2159,7 +2316,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Invalid group icon number</source> - <translation type="unfinished"/> + <translation>Недопустимый номер значка группы.</translation> </message> <message> <source>Invalid EnableAutoType value</source> @@ -2167,7 +2324,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Invalid EnableSearching value</source> - <translation type="unfinished"/> + <translation>Недопустимое значение EnableSearching</translation> </message> <message> <source>No group uuid found</source> @@ -2179,7 +2336,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Missing DeletedObject uuid or time</source> - <translation type="unfinished"/> + <translation>Нет uuid или времени для DeletedObject </translation> </message> <message> <source>Null entry uuid</source> @@ -2187,7 +2344,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Invalid entry icon number</source> - <translation type="unfinished"/> + <translation>Недопустимый номер значка записи</translation> </message> <message> <source>History element in history entry</source> @@ -2211,15 +2368,15 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Entry string key or value missing</source> - <translation type="unfinished"/> + <translation>Отсутствует ключ или значение записи</translation> </message> <message> <source>Duplicate attachment found</source> - <translation type="unfinished"/> + <translation>Найден дубликат во вложениях</translation> </message> <message> <source>Entry binary key or value missing</source> - <translation type="unfinished"/> + <translation>Отсутствует двоичный ключ или значение записи</translation> </message> <message> <source>Auto-type association window or sequence missing</source> @@ -2243,7 +2400,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Invalid number value</source> - <translation type="unfinished"/> + <translation>Недопустимое числовое значение</translation> </message> <message> <source>Invalid uuid value</source> @@ -2295,23 +2452,23 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Invalid number of entries</source> - <translation type="unfinished"/> + <translation>Недопустимое количество записей</translation> </message> <message> <source>Invalid content hash size</source> - <translation type="unfinished"/> + <translation>Недопустимый размер хэша содержимого</translation> </message> <message> <source>Invalid transform seed size</source> - <translation type="unfinished"/> + <translation>Недопустимый размер seed для трансформирования</translation> </message> <message> <source>Invalid number of transform rounds</source> - <translation type="unfinished"/> + <translation>Недопустимое количество раундов преобразования</translation> </message> <message> <source>Unable to construct group tree</source> - <translation type="unfinished"/> + <translation>Не удалось создать дерево групп</translation> </message> <message> <source>Root</source> @@ -2331,11 +2488,11 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Invalid group field type number</source> - <translation type="unfinished"/> + <translation>Недопустимый тип поля группы</translation> </message> <message> <source>Invalid group field size</source> - <translation type="unfinished"/> + <translation>Недопустимый размер поля группы</translation> </message> <message> <source>Read group field data doesn't match size</source> @@ -2343,35 +2500,35 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Incorrect group id field size</source> - <translation type="unfinished"/> + <translation>Неверный размер поля идентификатора группы</translation> </message> <message> <source>Incorrect group creation time field size</source> - <translation type="unfinished"/> + <translation>Неверный размер поля времени создания группы</translation> </message> <message> <source>Incorrect group modification time field size</source> - <translation type="unfinished"/> + <translation>Неверный размер поля времени изменения группы</translation> </message> <message> <source>Incorrect group access time field size</source> - <translation type="unfinished"/> + <translation>Неверный размер поля времени доступа к группе</translation> </message> <message> <source>Incorrect group expiry time field size</source> - <translation type="unfinished"/> + <translation>Неверное значение поля времени истечения срока действия группы</translation> </message> <message> <source>Incorrect group icon field size</source> - <translation type="unfinished"/> + <translation>Неверный размер поля значка группы</translation> </message> <message> <source>Incorrect group level field size</source> - <translation type="unfinished"/> + <translation>Неверный размер поля уровня группы</translation> </message> <message> <source>Invalid group field type</source> - <translation type="unfinished"/> + <translation>Недопустимый тип поля группы</translation> </message> <message> <source>Missing group id or level</source> @@ -2387,35 +2544,35 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Read entry field data doesn't match size</source> - <translation type="unfinished"/> + <translation>Поля данных записи не соответствуют размеру</translation> </message> <message> <source>Invalid entry uuid field size</source> - <translation type="unfinished"/> + <translation>Недопустимый размер поля uuid записи</translation> </message> <message> <source>Invalid entry group id field size</source> - <translation type="unfinished"/> + <translation>Недопустимый размер поля идентификатора записи группы</translation> </message> <message> <source>Invalid entry icon field size</source> - <translation type="unfinished"/> + <translation>Недопустимый размер поля значка записи</translation> </message> <message> <source>Invalid entry creation time field size</source> - <translation type="unfinished"/> + <translation>Недопустимный размер поля времени создания записи</translation> </message> <message> <source>Invalid entry modification time field size</source> - <translation type="unfinished"/> + <translation>Недопустимый размер поля изменения даты ввода</translation> </message> <message> <source>Invalid entry expiry time field size</source> - <translation type="unfinished"/> + <translation>Недопустимый размер поля времени для срока действия</translation> </message> <message> <source>Invalid entry field type</source> - <translation type="unfinished"/> + <translation>Недопустимый тип поля записи</translation> </message> </context> <context> @@ -2541,7 +2698,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>&Database settings</source> - <translation>Настройки базы данных</translation> + <translation>Параметры базы данных</translation> </message> <message> <source>Database settings</source> @@ -2573,7 +2730,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>&Settings</source> - <translation>&Настройки</translation> + <translation>&Параметры</translation> </message> <message> <source>Password Generator</source> @@ -2645,7 +2802,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>E&mpty recycle bin</source> - <translation type="unfinished"/> + <translation>&Пустая корзина</translation> </message> <message> <source>Clear history</source> @@ -2665,7 +2822,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Settings</source> - <translation>Настройки</translation> + <translation>Параметры</translation> </message> <message> <source>Toggle window</source> @@ -2699,6 +2856,14 @@ This is a one-way migration. You won't be able to open the imported databas <source>Please touch the button on your YubiKey!</source> <translation>Нажмите кнопку на YubiKey!</translation> </message> + <message> + <source>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</source> + <translation>Предупреждение: Вы используете нестабильную сборку KeePassXC! +Существует высокий риск повреждения базы данных, сделайте резервную копию базы данных. +Эта версия не предназначен для повседневного использования.</translation> + </message> </context> <context> <name>OpenSSHKey</name> @@ -2708,43 +2873,35 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>PEM boundary mismatch</source> - <translation type="unfinished"/> - </message> - <message> - <source>This is not an OpenSSH key, only modern keys are supported</source> - <translation>Это не ключ OpenSSH, поддерживаются только современные ключи</translation> + <translation>Несоответствие границ PEM</translation> </message> <message> <source>Base64 decoding failed</source> - <translation type="unfinished"/> + <translation>Не удалось декодировать Base64</translation> </message> <message> <source>Key file way too small.</source> - <translation type="unfinished"/> + <translation>Ключевой файл слишком мал.</translation> </message> <message> <source>Key file magic header id invalid</source> - <translation type="unfinished"/> + <translation>Недопустимый идентификатор заголовка файла ключа</translation> </message> <message> <source>Found zero keys</source> - <translation type="unfinished"/> + <translation>Найдены пустые ключи</translation> </message> <message> <source>Failed to read public key.</source> - <translation type="unfinished"/> + <translation>Не удалось прочесть открытый ключ.</translation> </message> <message> <source>Corrupted key file, reading private key failed</source> - <translation>Поврежденный файл ключа, чтение личного ключа не удалось</translation> + <translation>Поврежденный файл ключа, чтение закрытого ключа не удалось</translation> </message> <message> <source>No private key payload to decrypt</source> - <translation>В личном ключе нет сведений для дешифрования</translation> - </message> - <message> - <source>Unknown cipher: </source> - <translation>Неизвестный шифр: </translation> + <translation>В закрытом ключе нет сведений для дешифрования</translation> </message> <message> <source>Trying to run KDF without cipher</source> @@ -2758,10 +2915,6 @@ This is a one-way migration. You won't be able to open the imported databas <source>Key derivation failed, key file corrupted?</source> <translation>Формирования ключа не удалось, ключевой файл поврежден?</translation> </message> - <message> - <source>Unknown KDF: </source> - <translation>Неизвестные ФФК: </translation> - </message> <message> <source>Decryption failed, wrong passphrase?</source> <translation>Расшифровка не удалась, неправильный пароль?</translation> @@ -2770,29 +2923,45 @@ This is a one-way migration. You won't be able to open the imported databas <source>Unexpected EOF while reading public key</source> <translation>Неожиданное EOF при чтении открытого ключа</translation> </message> - <message> - <source>Unknown key type: </source> - <translation>Неизвестный тип ключа: </translation> - </message> <message> <source>Unexpected EOF while reading private key</source> - <translation>Неожиданный EOF при чтении личного ключа</translation> + <translation>Неожиданный EOF при чтении закрытого ключа</translation> </message> <message> <source>Can't write public key as it is empty</source> - <translation>Не удается записать публичный ключ, так как он пуст</translation> + <translation>Не удается записать открытый ключ, так как он пуст</translation> </message> <message> <source>Unexpected EOF when writing public key</source> - <translation type="unfinished"/> + <translation>Неожиданный EOF при записе открытого ключа</translation> </message> <message> <source>Can't write private key as it is empty</source> - <translation>Нельзя записать личный ключ, поскольку он пустой</translation> + <translation>Нельзя записать закрытый ключ, поскольку он пустой</translation> </message> <message> <source>Unexpected EOF when writing private key</source> - <translation>Неожиданный EOF при записи личного ключа</translation> + <translation>Неожиданный EOF при записи закрытого ключа</translation> + </message> + <message> + <source>Unsupported key type: %1</source> + <translation>Неизвестный тип ключа: %1</translation> + </message> + <message> + <source>Unknown cipher: %1</source> + <translation>Неизвестный шифр: %1</translation> + </message> + <message> + <source>Cipher IV is too short for MD5 kdf</source> + <translation>Слишком короткий Cipher IV для MD5 ФФК</translation> + </message> + <message> + <source>Unknown KDF: %1</source> + <translation>Неизвестная ФФК: %1</translation> + </message> + <message> + <source>Unknown key type: %1</source> + <translation>Неизвестный тип ключа: %1</translation> </message> </context> <context> @@ -2860,7 +3029,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Advanced</source> - <translation>Продвинутые</translation> + <translation>Дополнительно</translation> </message> <message> <source>Always allow &access to entries</source> @@ -2884,7 +3053,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>&Return advanced string fields which start with "KPH: "</source> - <translation>Возвращать продвинутые стро&ковые поля, начинающиеся с «KPH: »</translation> + <translation>Возвращать дополнительные стро&ковые поля, начинающиеся с «KPH: »</translation> </message> <message> <source>HTTP Port:</source> @@ -2966,7 +3135,7 @@ Using default port 19455.</source> </message> <message> <source>Exclude look-alike characters</source> - <translation>Исключить визуально схожие символы</translation> + <translation>Не использовать визуально схожие символы</translation> </message> <message> <source>Pick characters from every group</source> @@ -3109,7 +3278,7 @@ Using default port 19455.</source> </message> <message> <source>Add a new entry to a database.</source> - <translation type="unfinished"/> + <translation>Добавить новую запись в базу данных.</translation> </message> <message> <source>Path of the database.</source> @@ -3117,7 +3286,7 @@ Using default port 19455.</source> </message> <message> <source>Key file of the database.</source> - <translation type="unfinished"/> + <translation>Ключ-файл базы данных.</translation> </message> <message> <source>path</source> @@ -3125,7 +3294,7 @@ Using default port 19455.</source> </message> <message> <source>Username for the entry.</source> - <translation type="unfinished"/> + <translation>Имя пользователя для записи.</translation> </message> <message> <source>username</source> @@ -3141,15 +3310,15 @@ Using default port 19455.</source> </message> <message> <source>Prompt for the entry's password.</source> - <translation type="unfinished"/> + <translation>Введите пароль записи.</translation> </message> <message> <source>Generate a password for the entry.</source> - <translation type="unfinished"/> + <translation>Сгенерировать пароль для записи.</translation> </message> <message> <source>Length for the generated password.</source> - <translation type="unfinished"/> + <translation>Длина сгенерированного пароля.</translation> </message> <message> <source>length</source> @@ -3157,7 +3326,7 @@ Using default port 19455.</source> </message> <message> <source>Path of the entry to add.</source> - <translation type="unfinished"/> + <translation>Путь к записе для добавления.</translation> </message> <message> <source>Copy an entry's password to the clipboard.</source> @@ -3186,19 +3355,19 @@ Using default port 19455.</source> </message> <message> <source>Path of the entry to edit.</source> - <translation type="unfinished"/> + <translation>Путь к записе для редактирования.</translation> </message> <message> <source>Estimate the entropy of a password.</source> - <translation type="unfinished"/> + <translation>Оценка энтропии пароля.</translation> </message> <message> <source>Password for which to estimate the entropy.</source> - <translation type="unfinished"/> + <translation>Пароль для оценки энтропии.</translation> </message> <message> <source>Perform advanced analysis on the password.</source> - <translation type="unfinished"/> + <translation>Выполнить расширенный анализ пароля.</translation> </message> <message> <source>Extract and print the content of a database.</source> @@ -3210,18 +3379,21 @@ Using default port 19455.</source> </message> <message> <source>Insert password to unlock %1: </source> - <translation type="unfinished"/> + <translation>Введите пароль для разблокировки %1: </translation> </message> <message> <source>Failed to load key file %1 : %2</source> - <translation type="unfinished"/> + <translation>Не удалось загрузить ключ-файл %1: %2</translation> </message> <message> <source>WARNING: You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>ПРЕДУПРЕЖДЕНИЕ: Вы используете устаревший формат файл ключа, поддержка которого +может быть прекращена в будущем. + +Рассмотрите возможность создания нового файла ключа.</translation> </message> <message> <source> @@ -3279,7 +3451,7 @@ Available commands: </message> <message> <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> - <translation type="unfinished"/> + <translation>Имена атрибутов для отображения. Эта опция может быть указана более одного раза, причем каждый атрибут будет показан по одному в строке в заданном порядке. Если атрибуты не указаны, дается сводка атрибутов по умолчанию.</translation> </message> <message> <source>attribute</source> @@ -3309,7 +3481,7 @@ Available commands: </message> <message> <source>missing closing quote</source> - <translation>Отсутствует закрывающая цитата</translation> + <translation>Отсутствует закрывающая кавычка</translation> </message> <message> <source>AES: 256-bit</source> @@ -3373,7 +3545,7 @@ Available commands: </message> <message> <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source> - <translation>YubiKey[%1] Запрос ответа - слот %2 - %3</translation> + <translation>YubiKey[%1] Вызов-ответ - слот %2 - %3</translation> </message> <message> <source>Press</source> @@ -3387,6 +3559,52 @@ Available commands: <source>SSH Agent</source> <translation>SSH Агент</translation> </message> + <message> + <source>Generate a new random diceware passphrase.</source> + <translation>Сгенерировать новую парольную фразу.</translation> + </message> + <message> + <source>Word count for the diceware passphrase.</source> + <translation>Количество слов для парольной фразы.</translation> + </message> + <message> + <source>count</source> + <translation>количество</translation> + </message> + <message> + <source>Wordlist for the diceware generator. +[Default: EFF English]</source> + <translation>Список слов для генератора парольной фразы. +[По умолчанию: Английский EFF]</translation> + </message> + <message> + <source>Generate a new random password.</source> + <translation>Сгенерировать новый случайный пароль.</translation> + </message> + <message> + <source>Length of the generated password.</source> + <translation>Длина сгенерированного пароля.</translation> + </message> + <message> + <source>Use lowercase characters in the generated password.</source> + <translation>Использовать символы в нижнем регистре в генерируемом пароле.</translation> + </message> + <message> + <source>Use uppercase characters in the generated password.</source> + <translation>Использовать заглавные буквы в генерируемом пароле.</translation> + </message> + <message> + <source>Use numbers in the generated password.</source> + <translation>Использовать цифры в генерируемом пароле.</translation> + </message> + <message> + <source>Use special characters in the generated password.</source> + <translation>Использовать специальные символы в генерируемом пароле.</translation> + </message> + <message> + <source>Use extended ASCII in the generated password.</source> + <translation>Использовать расширенный ASCII в генерируемом пароле.</translation> + </message> </context> <context> <name>QtIOCompressor</name> @@ -3501,11 +3719,11 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>No shared encryption-keys found in KeePassHttp Settings.</source> - <translation>Не найдено общих ключей шифрования в настройках KeePassHttp.</translation> + <translation>Совместно используемые ключи шифрования не заданы в параметрах KeePassHttp.</translation> </message> <message> <source>KeePassXC: Settings not available!</source> - <translation>KeePassXC: Настройки недоступны!</translation> + <translation>KeePassXC: Параметры недоступны!</translation> </message> <message> <source>The active database does not contain an entry of KeePassHttp Settings.</source> @@ -3658,6 +3876,30 @@ Please unlock the selected database or choose another one which is unlocked.</so <comment>Milliseconds</comment> <translation> мс</translation> </message> + <message> + <source>Startup</source> + <translation>Запуск</translation> + </message> + <message> + <source>File Management</source> + <translation>Управление файлами</translation> + </message> + <message> + <source>Safely save database files (may be incompatible with Dropbox, etc)</source> + <translation>Безопасное сохранение файлов базы данных (может быть несовместимо с Dropbox и другими)</translation> + </message> + <message> + <source>Backup database file before saving</source> + <translation>Создавать резервную копию базы данных перед сохранением</translation> + </message> + <message> + <source>Entry Management</source> + <translation>Управление записями</translation> + </message> + <message> + <source>General</source> + <translation>Общие</translation> + </message> </context> <context> <name>SettingsWidgetSecurity</name> @@ -3684,7 +3926,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Lock databases when session is locked or lid is closed</source> - <translation>Блокировать базу данных при закрытии сеанса или закрытии крышки</translation> + <translation>Блокировать базу данных при блокировке сеанса или закрытии крышки ноутбука</translation> </message> <message> <source>Lock databases after minimizing the window</source> @@ -3714,6 +3956,10 @@ Please unlock the selected database or choose another one which is unlocked.</so <source>Use Google as fallback for downloading website icons</source> <translation>Использовать Google в качестве резервного варианта для получения значков веб-сайтов</translation> </message> + <message> + <source>Re-lock previously locked database after performing Auto-Type</source> + <translation>Заблокировать базу данных после автоввода</translation> + </message> </context> <context> <name>SetupTotpDialog</name> @@ -3727,15 +3973,15 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Default RFC 6238 token settings</source> - <translation>Стандартные настройки токена RFC 6238</translation> + <translation>Стандартные параметры токена RFC 6238</translation> </message> <message> <source>Steam token settings</source> - <translation>Настройки Steam токена</translation> + <translation>Параметры токена Steam</translation> </message> <message> <source>Use custom settings</source> - <translation>Использовать пользовательские настройки</translation> + <translation>Использовать пользовательские параметры</translation> </message> <message> <source>Note: Change these settings only if you know what you are doing.</source> @@ -3795,10 +4041,6 @@ Please unlock the selected database or choose another one which is unlocked.</so </context> <context> <name>WelcomeWidget</name> - <message> - <source>Welcome to KeePassXC</source> - <translation>Добро пожаловать в KeePassXC</translation> - </message> <message> <source>Start storing your passwords securely in a KeePassXC database</source> <translation>Начать безопасное хранение ваших паролей в базе данных KeePassXC</translation> @@ -3823,6 +4065,10 @@ Please unlock the selected database or choose another one which is unlocked.</so <source>Recent databases</source> <translation>Недавние базы данных</translation> </message> + <message> + <source>Welcome to KeePassXC %1</source> + <translation>Добро пожаловать в KeePassXC %1</translation> + </message> </context> <context> <name>main</name> diff --git a/share/translations/keepassx_sr.ts b/share/translations/keepassx_sr.ts new file mode 100644 index 000000000..96adb74f7 --- /dev/null +++ b/share/translations/keepassx_sr.ts @@ -0,0 +1,4078 @@ +<?xml version="1.0" ?><!DOCTYPE TS><TS language="sr" version="2.1"> +<context> + <name>AboutDialog</name> + <message> + <source>About KeePassXC</source> + <translation>O KeePassXC</translation> + </message> + <message> + <source>About</source> + <translation>O aplikaciji</translation> + </message> + <message> + <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> + <translation>Пријавите грешке на: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> + </message> + <message> + <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>KeePassXC се дистрибуира под условима ГНУ Опште Јавне Лиценце (GPL) верзије 2 (или уколико одаберете) верзије 3.</translation> + </message> + <message> + <source>Contributors</source> + <translation>Сарадници</translation> + </message> + <message> + <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Погледајте доприносе на GitHub</a></translation> + </message> + <message> + <source>Debug Info</source> + <translation>Информације за отклањање грешака</translation> + </message> + <message> + <source>Include the following information whenever you report a bug:</source> + <translation>Укључите следеће информације приликом пријављивања грешке:</translation> + </message> + <message> + <source>Copy to clipboard</source> + <translation>Копирај</translation> + </message> + <message> + <source>Version %1 +</source> + <translation>Верзија %1</translation> + </message> + <message> + <source>Revision: %1</source> + <translation>Ревизија %1</translation> + </message> + <message> + <source>Distribution: %1</source> + <translation>Дистрибуција: %1</translation> + </message> + <message> + <source>Libraries:</source> + <translation>Библиотеке:</translation> + </message> + <message> + <source>Operating system: %1 +CPU architecture: %2 +Kernel: %3 %4</source> + <translation>Оперативни систем: %1 +Архитектура процесора: %2 +Језгро: %3 %4</translation> + </message> + <message> + <source>Enabled extensions:</source> + <translation>Укључена проширења:</translation> + </message> + <message> + <source>Project Maintainers:</source> + <translation>Вође пројекта:</translation> + </message> + <message> + <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Build Type: %1 +</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>AccessControlDialog</name> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>KeePassXC HTTP Потврдите Приступ</translation> + </message> + <message> + <source>Remember this decision</source> + <translation>Запамти ову одлуку</translation> + </message> + <message> + <source>Allow</source> + <translation>Допусти</translation> + </message> + <message> + <source>Deny</source> + <translation>Одбаци</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 тражи приступ лозинкама за следеће ставке. +Молим вас одаберите да ли желите да одобрите приступ.</translation> + </message> +</context> +<context> + <name>AgentSettingsWidget</name> + <message> + <source>Enable SSH Agent (requires restart)</source> + <translation>Омогући SSH агента (захтева поновно покретање апликације)</translation> + </message> +</context> +<context> + <name>AutoType</name> + <message> + <source>Couldn't find an entry that matches the window title:</source> + <translation>Ставка која одговара наведеном наслову прозора није пронађена:</translation> + </message> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>Autoматско-Куцање - KeePassXC</translation> + </message> + <message> + <source>Auto-Type</source> + <translation>Аутоматско-куцање</translation> + </message> + <message> + <source>The Syntax of your Auto-Type statement is incorrect!</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> + <message> + <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>AutoTypeAssociationsModel</name> + <message> + <source>Window</source> + <translation>Прозор</translation> + </message> + <message> + <source>Sequence</source> + <translation>Секвенца</translation> + </message> + <message> + <source>Default sequence</source> + <translation>Подразумевани редослед</translation> + </message> +</context> +<context> + <name>AutoTypeMatchModel</name> + <message> + <source>Group</source> + <translation>Група</translation> + </message> + <message> + <source>Title</source> + <translation>Наслов</translation> + </message> + <message> + <source>Username</source> + <translation>Корисничко име</translation> + </message> + <message> + <source>Sequence</source> + <translation>Редослед</translation> + </message> +</context> +<context> + <name>AutoTypeSelectDialog</name> + <message> + <source>Auto-Type - KeePassXC</source> + <translation>Autoматско-Куцање - KeePassXC</translation> + </message> + <message> + <source>Select entry to Auto-Type:</source> + <translation>Одаберите ставку за Аутоматско-Куцање</translation> + </message> +</context> +<context> + <name>BrowserAccessControlDialog</name> + <message> + <source>KeePassXC-Browser Confirm Access</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remember this decision</source> + <translation>Запамти ову одлуку</translation> + </message> + <message> + <source>Allow</source> + <translation>Допусти</translation> + </message> + <message> + <source>Deny</source> + <translation>Одбаци</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 тражи приступ лозинкама за следеће ставке. +Молим вас одаберите да ли желите да одобрите приступ.</translation> + </message> +</context> +<context> + <name>BrowserOptionDialog</name> + <message> + <source>Dialog</source> + <translation>Дијалог</translation> + </message> + <message> + <source>This is required for accessing your databases with KeePassXC-Browser</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable KeepassXC browser integration</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>Опште</translation> + </message> + <message> + <source>Enable integration for these browsers:</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Google Chrome</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Firefox</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Chromium</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Vivaldi</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show a &notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Match URL scheme (e.g., https://...)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return only best-matching credentials</source> + <translation type="unfinished"/> + </message> + <message> + <source>Sort &matching credentials by title</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Sort matching credentials by &username</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>&Disconnect all browsers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Forget all remembered &permissions</source> + <translation type="unfinished"/> + </message> + <message> + <source>Advanced</source> + <translation>Напредно</translation> + </message> + <message> + <source>Never &ask before accessing credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Never ask before &updating credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searc&h in all opened databases for matching credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation type="unfinished"/> + </message> + <message> + <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Update &native messaging manifest files at startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Support a proxy application between KeePassXC and browser extension.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &proxy application between KeePassXC and browser extension</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a custom proxy location if you installed a proxy manually.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &custom proxy location</source> + <comment>Meant is the proxy for KeePassXC-Browser</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Разгледај...</translation> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*.exe);;All Files (*.*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select custom proxy location</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>BrowserService</name> + <message> + <source>KeePassXC: New key association request</source> + <translation type="unfinished"/> + </message> + <message> + <source>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Save and allow access</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation type="unfinished"/> + </message> + <message> + <source>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation type="unfinished"/> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation type="unfinished"/> + </message> + <message> + <source>The active database does not contain a settings entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation type="unfinished"/> + </message> + <message> + <source>No shared encryption keys found in KeePassXC Settings.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Removing stored permissions…</source> + <translation type="unfinished"/> + </message> + <message> + <source>Abort</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entry(s).</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation type="unfinished"/> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>ChangeMasterKeyWidget</name> + <message> + <source>Password</source> + <translation>Лозинка</translation> + </message> + <message> + <source>Enter password:</source> + <translation>Унесите лозинку:</translation> + </message> + <message> + <source>Repeat password:</source> + <translation>Поновите лозинку:</translation> + </message> + <message> + <source>&Key file</source> + <translation>&Кључ-Датотека</translation> + </message> + <message> + <source>Browse</source> + <translation>Разгледај</translation> + </message> + <message> + <source>Create</source> + <translation>Креирај</translation> + </message> + <message> + <source>Cha&llenge Response</source> + <translation>Изазов Одговор</translation> + </message> + <message> + <source>Refresh</source> + <translation>Освежи</translation> + </message> + <message> + <source>Key files</source> + <translation>Датотеке са кључем</translation> + </message> + <message> + <source>All files</source> + <translation>Све датотеке</translation> + </message> + <message> + <source>Create Key File...</source> + <translation>Креирај датотеку са кључем...</translation> + </message> + <message> + <source>Unable to create Key File : </source> + <translation>Није могуће креирати Датотеку са Кључем:</translation> + </message> + <message> + <source>Select a key file</source> + <translation>Одаберите датотеку са кључем</translation> + </message> + <message> + <source>Empty password</source> + <translation>Празна лозинка</translation> + </message> + <message> + <source>Do you really want to use an empty string as password?</source> + <translation>Да ли сте сигурни да желите да лозинка буде празна?</translation> + </message> + <message> + <source>Different passwords supplied.</source> + <translation>Унете су две различите лозинке.</translation> + </message> + <message> + <source>Failed to set %1 as the Key file: +%2</source> + <translation>Неуспешно постављање %1 као Датотеке са Кључем: +%2</translation> + </message> + <message> + <source>Legacy key file format</source> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Changing master key failed: no YubiKey inserted.</source> + <translation>Неуспешна промена главног кључа: YubiKey није унет.</translation> + </message> +</context> +<context> + <name>CloneDialog</name> + <message> + <source>Clone Options</source> + <translation>Клонирај Опције</translation> + </message> + <message> + <source>Append ' - Clone' to title</source> + <translation>Додај наслову суфикс ' - дупликат' </translation> + </message> + <message> + <source>Replace username and password with references</source> + <translation>Замените корисничко име и лозинку са референцама</translation> + </message> + <message> + <source>Copy history</source> + <translation>Копирај историју</translation> + </message> +</context> +<context> + <name>CsvImportWidget</name> + <message> + <source>Import CSV fields</source> + <translation>Увези CSV поља</translation> + </message> + <message> + <source>filename</source> + <translation>датотека</translation> + </message> + <message> + <source>size, rows, columns</source> + <translation>величина, редови, колоне</translation> + </message> + <message> + <source>Encoding</source> + <translation>Кодирање</translation> + </message> + <message> + <source>Codec</source> + <translation>Кодек</translation> + </message> + <message> + <source>Text is qualified by</source> + <translation>Текст је означен са</translation> + </message> + <message> + <source>Fields are separated by</source> + <translation>Поља су одвојена са</translation> + </message> + <message> + <source>Comments start with</source> + <translation>Коментари почињу са</translation> + </message> + <message> + <source>First record has field names</source> + <translation>Први ред садржи имена колона</translation> + </message> + <message> + <source>Number of headers line to discard</source> + <translation>Прескочи колико првих линија</translation> + </message> + <message> + <source>Consider '\' an escape character</source> + <translation>Третирај '\' као командни знак</translation> + </message> + <message> + <source>Preview</source> + <translation>Приказ</translation> + </message> + <message> + <source>Column layout</source> + <translation>Распоред по колонама</translation> + </message> + <message> + <source>Not present in CSV file</source> + <translation>Није присутан у CSV датотеци</translation> + </message> + <message> + <source>Empty fieldname </source> + <translation>Празно име поља</translation> + </message> + <message> + <source>column </source> + <translation>колона</translation> + </message> + <message> + <source>Imported from CSV file</source> + <translation>Увезено из CSV датотеке</translation> + </message> + <message> + <source>Original data: </source> + <translation>Изворни подаци:</translation> + </message> + <message> + <source>Error(s) detected in CSV file !</source> + <translation>Грешка(грешке) у CSV датотеци !</translation> + </message> + <message> + <source> more messages skipped]</source> + <translation>порука прескочено]</translation> + </message> + <message> + <source>Error</source> + <translation>Грешка</translation> + </message> + <message> + <source>CSV import: writer has errors: +</source> + <translation>CSV увоз: грешке приликом уписа: +</translation> + </message> +</context> +<context> + <name>CsvImportWizard</name> + <message> + <source>Error</source> + <translation>Грешка</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Није могуће израчунати главни кључ</translation> + </message> +</context> +<context> + <name>CsvParserModel</name> + <message numerus="yes"> + <source>%n byte(s), </source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source>%n row(s), </source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source>%n column(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> +</context> +<context> + <name>DatabaseOpenWidget</name> + <message> + <source>Enter master key</source> + <translation>Унесите главни кључ</translation> + </message> + <message> + <source>Key File:</source> + <translation>Кључ-Датотека:</translation> + </message> + <message> + <source>Password:</source> + <translation>Лозинка:</translation> + </message> + <message> + <source>Browse</source> + <translation>Разгледај</translation> + </message> + <message> + <source>Refresh</source> + <translation>Освежи</translation> + </message> + <message> + <source>Challenge Response:</source> + <translation>Изазов Одговор:</translation> + </message> + <message> + <source>Unable to open the database.</source> + <translation>Није могуће отворити базу података.</translation> + </message> + <message> + <source>Can't open key file</source> + <translation>Није могуће отворити кључ-датотеку</translation> + </message> + <message> + <source>Legacy key file format</source> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't show this warning again</source> + <translation type="unfinished"/> + </message> + <message> + <source>All files</source> + <translation>Све датотеке</translation> + </message> + <message> + <source>Key files</source> + <translation>Датотеке са кључем</translation> + </message> + <message> + <source>Select key file</source> + <translation>Одаберите кључ-датотеку</translation> + </message> +</context> +<context> + <name>DatabaseRepairWidget</name> + <message> + <source>Repair database</source> + <translation>Оправи базу података</translation> + </message> + <message> + <source>Error</source> + <translation>Грешка</translation> + </message> + <message> + <source>Can't open key file</source> + <translation>Није могуће отворити кључ-датотеку</translation> + </message> + <message> + <source>Unable to open the database.</source> + <translation>Није могуће отворити базу података.</translation> + </message> + <message> + <source>Database opened fine. Nothing to do.</source> + <translation>База података успешно отворена. Нема шта да се уради.</translation> + </message> + <message> + <source>Success</source> + <translation>Успешно</translation> + </message> + <message> + <source>The database has been successfully repaired +You can now save it.</source> + <translation>База података је успешно оправљена +Сада је можете сачувати.</translation> + </message> + <message> + <source>Unable to repair the database.</source> + <translation>Није могуће оправити базу података.</translation> + </message> +</context> +<context> + <name>DatabaseSettingsWidget</name> + <message> + <source>General</source> + <translation>Опште</translation> + </message> + <message> + <source>Encryption</source> + <translation type="unfinished"/> + </message> + <message> + <source>Number of rounds too high</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Understood, keep number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cancel</source> + <translation type="unfinished"/> + </message> + <message> + <source>Number of rounds too low</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</source> + <translation type="unfinished"/> + </message> + <message> + <source>KDF unchanged</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <source> MiB</source> + <comment>Abbreviation for Mebibytes (KDF settings)</comment> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source> thread(s)</source> + <comment>Threads for parallel execution (KDF settings)</comment> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetEncryption</name> + <message> + <source>Encryption Algorithm:</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES: 256 Bit (default)</source> + <translation>AES: 256 Bit (подразумевано)</translation> + </message> + <message> + <source>Twofish: 256 Bit</source> + <translation>Twofish: 256 Bit</translation> + </message> + <message> + <source>Key Derivation Function:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Transform rounds:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Benchmark 1-second delay</source> + <translation type="unfinished"/> + </message> + <message> + <source>Memory Usage:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Parallelism:</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetGeneral</name> + <message> + <source>Database Meta Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database name:</source> + <translation>Име базе података:</translation> + </message> + <message> + <source>Database description:</source> + <translation>Опис базе података:</translation> + </message> + <message> + <source>Default username:</source> + <translation>Подразумевано корисничко име:</translation> + </message> + <message> + <source>History Settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Max. history items:</source> + <translation>Максималан број ставки из историје:</translation> + </message> + <message> + <source>Max. history size:</source> + <translation>Максималан број ставки у историји:</translation> + </message> + <message> + <source> MiB</source> + <translation> MiB</translation> + </message> + <message> + <source>Use recycle bin</source> + <translation>Користи корпу за отпатке</translation> + </message> + <message> + <source>Additional Database Settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable &compression (recommended)</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseTabWidget</name> + <message> + <source>Root</source> + <comment>Root group</comment> + <translation>Корен</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>KeePass 2 База података</translation> + </message> + <message> + <source>All files</source> + <translation>Све датотеке</translation> + </message> + <message> + <source>Open database</source> + <translation>Отвори базу података</translation> + </message> + <message> + <source>File not found!</source> + <translation>Датотека није пронађена!</translation> + </message> + <message> + <source>Unable to open the database.</source> + <translation>Није могуће отворити базу података.</translation> + </message> + <message> + <source>File opened in read only mode.</source> + <translation>Датотека је отворена у моду само за читање.</translation> + </message> + <message> + <source>Open CSV file</source> + <translation>Отвори CSV датотеку</translation> + </message> + <message> + <source>CSV file</source> + <translation>CSV датотека</translation> + </message> + <message> + <source>All files (*)</source> + <translation>Све датотеке (*)</translation> + </message> + <message> + <source>Merge database</source> + <translation>Удружи базу података</translation> + </message> + <message> + <source>Open KeePass 1 database</source> + <translation>Отвори KeePass 1  базу података</translation> + </message> + <message> + <source>KeePass 1 database</source> + <translation>KeePass 1 база података</translation> + </message> + <message> + <source>Close?</source> + <translation>Затвори?</translation> + </message> + <message> + <source>"%1" is in edit mode. +Discard changes and close anyway?</source> + <translation>"%1" у моду за измене. +Одбаци све измене и свеједно затвори?</translation> + </message> + <message> + <source>Save changes?</source> + <translation>Сними измене?</translation> + </message> + <message> + <source>"%1" was modified. +Save changes?</source> + <translation>"%1" је измењен. +Сачувај измене?</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>Уписивање у базу података није успело.</translation> + </message> + <message> + <source>Passwords</source> + <translation>Лозинке</translation> + </message> + <message> + <source>Save database as</source> + <translation>Сними базу података као</translation> + </message> + <message> + <source>Export database to CSV file</source> + <translation>Извези базу података у CSV датотеку</translation> + </message> + <message> + <source>Writing the CSV file failed.</source> + <translation>Уписивање у CSV датотеку није успело.</translation> + </message> + <message> + <source>New database</source> + <translation>Нова база података</translation> + </message> + <message> + <source>locked</source> + <translation>закључано</translation> + </message> + <message> + <source>Lock database</source> + <translation>Закључај базу података</translation> + </message> + <message> + <source>Can't lock the database as you are currently editing it. +Please press cancel to finish your changes or discard them.</source> + <translation>Није могуће закључати базу података јер је тренутно ажурирате. +Молим вас сачувајте измене или их одбаците.</translation> + </message> + <message> + <source>This database has been modified. +Do you want to save the database before locking it? +Otherwise your changes are lost.</source> + <translation>Ова база података је измењена. +Да ли желите да је сачувате пре закључавања? +У супротном све измене ће бити изгубљене.</translation> + </message> + <message> + <source>Disable safe saves?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseWidget</name> + <message> + <source>Searching...</source> + <translation>Претрага је у току...</translation> + </message> + <message> + <source>Change master key</source> + <translation>Промени главни кључ</translation> + </message> + <message> + <source>Delete entry?</source> + <translation>Обриши ставку?</translation> + </message> + <message> + <source>Do you really want to delete the entry "%1" for good?</source> + <translation>Да ли сте сигурни да желите да обришете ставку "%1"?</translation> + </message> + <message> + <source>Delete entries?</source> + <translation>Обриши ставке?</translation> + </message> + <message> + <source>Do you really want to delete %1 entries for good?</source> + <translation>Да ли сте сигурни да желите да обришете %1 ставке?</translation> + </message> + <message> + <source>Move entry to recycle bin?</source> + <translation>Премести ставку у корпу за отпатке?</translation> + </message> + <message> + <source>Do you really want to move entry "%1" to the recycle bin?</source> + <translation>Да ли сте сигурни да желите да преместите ставку "%1" у корпу за отпатке?</translation> + </message> + <message> + <source>Move entries to recycle bin?</source> + <translation>Премести ставке у корпу за отпатке?</translation> + </message> + <message numerus="yes"> + <source>Do you really want to move %n entry(s) to the recycle bin?</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Execute command?</source> + <translation>Изврши команду?</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation>Да ли сте сигурни да желите да извршите следећу команду? <br><br>%1<br></translation> + </message> + <message> + <source>Remember my choice</source> + <translation>Запамти мој избор</translation> + </message> + <message> + <source>Delete group?</source> + <translation>Обриши групу?</translation> + </message> + <message> + <source>Do you really want to delete the group "%1" for good?</source> + <translation>Да ли сте сигурни да желите да обришете групу "%1"?</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Није могуће израчунати главни кључ</translation> + </message> + <message> + <source>No current database.</source> + <translation>Нема тренутне базе података.</translation> + </message> + <message> + <source>No source database, nothing to do.</source> + <translation>Нема изворне базе података, нема шта да се уради.</translation> + </message> + <message> + <source>Search Results (%1)</source> + <translation>Резултати претраге (%1)</translation> + </message> + <message> + <source>No Results</source> + <translation>Нема резултата</translation> + </message> + <message> + <source>File has changed</source> + <translation type="unfinished"/> + </message> + <message> + <source>The database file has changed. Do you want to load the changes?</source> + <translation>Датотека базе података је измењена. Да ли желите да учитате измене?</translation> + </message> + <message> + <source>Merge Request</source> + <translation>Споји захтев</translation> + </message> + <message> + <source>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Could not open the new database file while attempting to autoreload this database.</source> + <translation>Није могуће отворити нову датотеку базе података током аутоматског учитавања тренутне базе.</translation> + </message> + <message> + <source>Empty recycle bin?</source> + <translation>Испразни корпу за отпатке</translation> + </message> + <message> + <source>Are you sure you want to permanently delete everything from your recycle bin?</source> + <translation>Да ли сте сигурни да желите да желите да трајно обришете све ставке из корпе за отпатке?</translation> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DetailsWidget</name> + <message> + <source>Generate TOTP Token</source> + <translation>Генериши TOTP токен</translation> + </message> + <message> + <source>Close</source> + <translation>Затвори</translation> + </message> + <message> + <source>General</source> + <translation>Опште</translation> + </message> + <message> + <source>Password</source> + <translation>Лозинка</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Expiration</source> + <translation>Датум истека</translation> + </message> + <message> + <source>Username</source> + <translation>Корисничко име</translation> + </message> + <message> + <source>Autotype</source> + <translation>Аутоматско куцање</translation> + </message> + <message> + <source>Searching</source> + <translation>Претрага је у току...</translation> + </message> + <message> + <source>Attributes</source> + <translation>Атрибути</translation> + </message> + <message> + <source>Attachments</source> + <translation>Прилози</translation> + </message> + <message> + <source>Notes</source> + <translation>Белешке</translation> + </message> + <message> + <source>Window</source> + <translation>Прозор</translation> + </message> + <message> + <source>Sequence</source> + <translation>Секвенца</translation> + </message> + <message> + <source>Search</source> + <translation>Претрага</translation> + </message> + <message> + <source>Clear</source> + <translation>Очисти</translation> + </message> + <message> + <source>Never</source> + <translation>Никада</translation> + </message> + <message> + <source>[PROTECTED]</source> + <translation>[ЗАШТИЋЕНО]</translation> + </message> + <message> + <source>Disabled</source> + <translation>Онемогућено</translation> + </message> + <message> + <source>Enabled</source> + <translation>Омогућено</translation> + </message> +</context> +<context> + <name>EditEntryWidget</name> + <message> + <source>Entry</source> + <translation>Унос</translation> + </message> + <message> + <source>Advanced</source> + <translation>Напредно</translation> + </message> + <message> + <source>Icon</source> + <translation>Икона</translation> + </message> + <message> + <source>Auto-Type</source> + <translation>Аутоматско-куцање</translation> + </message> + <message> + <source>Properties</source> + <translation>Особине</translation> + </message> + <message> + <source>History</source> + <translation>Историја</translation> + </message> + <message> + <source>SSH Agent</source> + <translation>SSH Агент</translation> + </message> + <message> + <source>n/a</source> + <translation>/</translation> + </message> + <message> + <source>(encrypted)</source> + <translation>(енкриптовано)</translation> + </message> + <message> + <source>Select private key</source> + <translation>Одаберите приватни кључ</translation> + </message> + <message> + <source>File too large to be a private key</source> + <translation>Датотека је превелика да би била приватни кључ</translation> + </message> + <message> + <source>Failed to open private key</source> + <translation>Неуспешно отварање приватног кључа</translation> + </message> + <message> + <source>Entry history</source> + <translation>Историја уноса</translation> + </message> + <message> + <source>Add entry</source> + <translation>Додај унос</translation> + </message> + <message> + <source>Edit entry</source> + <translation>Измени унос</translation> + </message> + <message> + <source>Different passwords supplied.</source> + <translation>Унете су две различите лозинке.</translation> + </message> + <message> + <source>New attribute</source> + <translation>Нови атрибут</translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>Потврди уклањање</translation> + </message> + <message> + <source>Are you sure you want to remove this attribute?</source> + <translation>Да ли сте сигурни да желите да уклоните атрибут?</translation> + </message> + <message> + <source>[PROTECTED]</source> + <translation>[ЗАШТИЋЕНО]</translation> + </message> + <message> + <source>Press reveal to view or edit</source> + <translation>Молимо вас да откријете да бисте видели или изменили </translation> + </message> + <message> + <source>Tomorrow</source> + <translation>Сутра</translation> + </message> + <message numerus="yes"> + <source>%n week(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source>%n month(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>1 year</source> + <translation>1 година</translation> + </message> + <message> + <source>Apply generated password?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to apply the generated password to this entry?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EditEntryWidgetAdvanced</name> + <message> + <source>Additional attributes</source> + <translation>Додатни атрибути</translation> + </message> + <message> + <source>Add</source> + <translation>Додај</translation> + </message> + <message> + <source>Remove</source> + <translation>Уклони</translation> + </message> + <message> + <source>Edit Name</source> + <translation>Измени име</translation> + </message> + <message> + <source>Protect</source> + <translation>Заштити</translation> + </message> + <message> + <source>Reveal</source> + <translation>Откриј</translation> + </message> + <message> + <source>Attachments</source> + <translation>Прилози</translation> + </message> + <message> + <source>Foreground Color:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Background Color:</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EditEntryWidgetAutoType</name> + <message> + <source>Enable Auto-Type for this entry</source> + <translation>Омогући Аутоматско-Куцање за овај унос</translation> + </message> + <message> + <source>Inherit default Auto-Type sequence from the &group</source> + <translation>Наследи подразумевану секвенцу за Аутоматско-Куцање од &group</translation> + </message> + <message> + <source>&Use custom Auto-Type sequence:</source> + <translation>&Користи посебну секвенцу за Аутоматско-Куцање:</translation> + </message> + <message> + <source>Window Associations</source> + <translation>Везе са прозорима</translation> + </message> + <message> + <source>+</source> + <translation>+</translation> + </message> + <message> + <source>-</source> + <translation>-</translation> + </message> + <message> + <source>Window title:</source> + <translation>Наслов прозора:</translation> + </message> + <message> + <source>Use a specific sequence for this association:</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EditEntryWidgetHistory</name> + <message> + <source>Show</source> + <translation>Прикажи</translation> + </message> + <message> + <source>Restore</source> + <translation>Обнови</translation> + </message> + <message> + <source>Delete</source> + <translation>Обриши</translation> + </message> + <message> + <source>Delete all</source> + <translation>Обриши све</translation> + </message> +</context> +<context> + <name>EditEntryWidgetMain</name> + <message> + <source>URL:</source> + <translation>URL:</translation> + </message> + <message> + <source>Password:</source> + <translation>Лозинка:</translation> + </message> + <message> + <source>Repeat:</source> + <translation>Понови:</translation> + </message> + <message> + <source>Title:</source> + <translation>Наслов:</translation> + </message> + <message> + <source>Notes</source> + <translation>Белешке</translation> + </message> + <message> + <source>Presets</source> + <translation>Предефинисани</translation> + </message> + <message> + <source>Toggle the checkbox to reveal the notes section.</source> + <translation>Штиклирај поље жа потврду да бисте приказали секцију за белешке.</translation> + </message> + <message> + <source>Username:</source> + <translation>Корисничко име:</translation> + </message> + <message> + <source>Expires</source> + <translation>Истиче</translation> + </message> +</context> +<context> + <name>EditEntryWidgetSSHAgent</name> + <message> + <source>Form</source> + <translation>Форма</translation> + </message> + <message> + <source>Remove key from agent after</source> + <translation>Уклони кључ са агента након акције</translation> + </message> + <message> + <source> seconds</source> + <translation>секунди</translation> + </message> + <message> + <source>Fingerprint</source> + <translation>Отисак прста</translation> + </message> + <message> + <source>Remove key from agent when database is closed/locked</source> + <translation>Уклони кључ са агента када је база података затворена/закључана</translation> + </message> + <message> + <source>Public key</source> + <translation>Јавни кључ</translation> + </message> + <message> + <source>Add key to agent when database is opened/unlocked</source> + <translation>Додај кључ агенту када је база података отворена/откључана</translation> + </message> + <message> + <source>Comment</source> + <translation>Коментар</translation> + </message> + <message> + <source>Decrypt</source> + <translation>Декриптуј</translation> + </message> + <message> + <source>n/a</source> + <translation>/</translation> + </message> + <message> + <source>Copy to clipboard</source> + <translation>Копирај</translation> + </message> + <message> + <source>Private key</source> + <translation>Приватни кључ</translation> + </message> + <message> + <source>External file</source> + <translation>Спољашња датотека</translation> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Разгледај...</translation> + </message> + <message> + <source>Attachment</source> + <translation>Прилог</translation> + </message> + <message> + <source>Add to agent</source> + <translation>Додај агенту</translation> + </message> + <message> + <source>Remove from agent</source> + <translation>Уклони са агента</translation> + </message> + <message> + <source>Require user confirmation when this key is used</source> + <translation>Захтевај потврду приликом коришћења овог кључа</translation> + </message> +</context> +<context> + <name>EditGroupWidget</name> + <message> + <source>Group</source> + <translation>Група</translation> + </message> + <message> + <source>Icon</source> + <translation>Икона</translation> + </message> + <message> + <source>Properties</source> + <translation>Особине</translation> + </message> + <message> + <source>Add group</source> + <translation>Додај групу</translation> + </message> + <message> + <source>Edit group</source> + <translation>Измени групу</translation> + </message> + <message> + <source>Enable</source> + <translation>Омогући</translation> + </message> + <message> + <source>Disable</source> + <translation>Онемогући</translation> + </message> + <message> + <source>Inherit from parent group (%1)</source> + <translation>Наследи од родитељске групе (%1)</translation> + </message> +</context> +<context> + <name>EditGroupWidgetMain</name> + <message> + <source>Name</source> + <translation>Име</translation> + </message> + <message> + <source>Notes</source> + <translation>Белешке</translation> + </message> + <message> + <source>Expires</source> + <translation>Истиче</translation> + </message> + <message> + <source>Search</source> + <translation>Претрага</translation> + </message> + <message> + <source>Auto-Type</source> + <translation>Аутоматско-куцање</translation> + </message> + <message> + <source>&Use default Auto-Type sequence of parent group</source> + <translation>Користи подразумевану секвенцу за Аутоматско-Куцање од родитељске групе</translation> + </message> + <message> + <source>Set default Auto-Type se&quence</source> + <translation>Унеси подразумевану секвенцу за Аутоматско-Куцање</translation> + </message> +</context> +<context> + <name>EditWidgetIcons</name> + <message> + <source>&Use default icon</source> + <translation>Користи подражумевану иконицу</translation> + </message> + <message> + <source>Use custo&m icon</source> + <translation>Користи посебну иконицу</translation> + </message> + <message> + <source>Add custom icon</source> + <translation>Додај посебну икону</translation> + </message> + <message> + <source>Delete custom icon</source> + <translation>Обриши посебну икону</translation> + </message> + <message> + <source>Download favicon</source> + <translation>Преузми икону са сајта</translation> + </message> + <message> + <source>Unable to fetch favicon.</source> + <translation>Неуспело добављање иконе са сајта.</translation> + </message> + <message> + <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> + <translation>Савет: Можете омогућити Гугл као резерву под Алатке>Подешавања>Сигурност</translation> + </message> + <message> + <source>Images</source> + <translation>Слике</translation> + </message> + <message> + <source>All files</source> + <translation>Све датотеке</translation> + </message> + <message> + <source>Select Image</source> + <translation>Одабери слику</translation> + </message> + <message> + <source>Can't read icon</source> + <translation>Није могуће учитати иконицу</translation> + </message> + <message> + <source>Custom icon already exists</source> + <translation>Посебна иконица већ постоји</translation> + </message> + <message> + <source>Confirm Delete</source> + <translation>Потврди брисање</translation> + </message> + <message> + <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> + <translation>Ову иконицу користи %1 уноса, и биће замењена подразумеваном иконицом. Да ли сте сигурни да желите да је обришете?</translation> + </message> +</context> +<context> + <name>EditWidgetProperties</name> + <message> + <source>Created:</source> + <translation>Креирано:</translation> + </message> + <message> + <source>Modified:</source> + <translation>Измењено:</translation> + </message> + <message> + <source>Accessed:</source> + <translation>Приступљено:</translation> + </message> + <message> + <source>Uuid:</source> + <translation>Uuid:</translation> + </message> + <message> + <source>Plugin Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove</source> + <translation>Уклони</translation> + </message> + <message> + <source>Delete plugin data?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Value</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Entry</name> + <message> + <source> - Clone</source> + <comment>Suffix added to cloned entries</comment> + <translation>- Дупликат</translation> + </message> +</context> +<context> + <name>EntryAttachmentsModel</name> + <message> + <source>Name</source> + <translation>Име</translation> + </message> + <message> + <source>Size</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EntryAttachmentsWidget</name> + <message> + <source>Form</source> + <translation>Форма</translation> + </message> + <message> + <source>Add</source> + <translation>Додај</translation> + </message> + <message> + <source>Remove</source> + <translation>Уклони</translation> + </message> + <message> + <source>Open</source> + <translation>Отвори</translation> + </message> + <message> + <source>Save</source> + <translation>Сними</translation> + </message> + <message> + <source>Select files</source> + <translation>Одаберите датотеке</translation> + </message> + <message numerus="yes"> + <source>Are you sure you want to remove %n attachment(s)?</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>Потврди уклањање</translation> + </message> + <message> + <source>Save attachments</source> + <translation>Сними прилоге</translation> + </message> + <message> + <source>Unable to create directory: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Confirm overwrite</source> + <translation>Потврди пребрисање</translation> + </message> + <message> + <source>Unable to save attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachment: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open files: +%1</source> + <translation>Није могуће отворити датотеке: +%1</translation> + </message> +</context> +<context> + <name>EntryAttributesModel</name> + <message> + <source>Name</source> + <translation>Име</translation> + </message> +</context> +<context> + <name>EntryHistoryModel</name> + <message> + <source>Last modified</source> + <translation>Последњи пут измењено</translation> + </message> + <message> + <source>Title</source> + <translation>Наслов</translation> + </message> + <message> + <source>Username</source> + <translation>Корисничко име</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> +</context> +<context> + <name>EntryModel</name> + <message> + <source>Ref: </source> + <comment>Reference abbreviation</comment> + <translation>Референца:</translation> + </message> + <message> + <source>Group</source> + <translation>Група</translation> + </message> + <message> + <source>Title</source> + <translation>Наслов</translation> + </message> + <message> + <source>Username</source> + <translation>Корисничко име</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Never</source> + <translation>Никада</translation> + </message> + <message> + <source>Password</source> + <translation>Лозинка</translation> + </message> + <message> + <source>Notes</source> + <translation>Белешке</translation> + </message> + <message> + <source>Expires</source> + <translation>Истиче</translation> + </message> + <message> + <source>Created</source> + <translation type="unfinished"/> + </message> + <message> + <source>Modified</source> + <translation type="unfinished"/> + </message> + <message> + <source>Accessed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation>Прилози</translation> + </message> +</context> +<context> + <name>EntryView</name> + <message> + <source>Customize View</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide Usernames</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide Passwords</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fit to window</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fit to contents</source> + <translation type="unfinished"/> + </message> + <message> + <source>Reset to defaults</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Group</name> + <message> + <source>Recycle Bin</source> + <translation>Корпа за отпатке</translation> + </message> +</context> +<context> + <name>HostInstaller</name> + <message> + <source>KeePassXC: Cannot save file!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot save the native messaging script file.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>HttpPasswordGeneratorWidget</name> + <message> + <source>Length:</source> + <translation>Дужина:</translation> + </message> + <message> + <source>Character Types</source> + <translation>Типови карактера</translation> + </message> + <message> + <source>Upper Case Letters</source> + <translation>Велика слова</translation> + </message> + <message> + <source>A-Z</source> + <translation>A-Z</translation> + </message> + <message> + <source>Lower Case Letters</source> + <translation>Мала слова</translation> + </message> + <message> + <source>a-z</source> + <translation>a-z</translation> + </message> + <message> + <source>Numbers</source> + <translation>Бројеви</translation> + </message> + <message> + <source>0-9</source> + <translation>0-9</translation> + </message> + <message> + <source>Special Characters</source> + <translation>Посебни карактери</translation> + </message> + <message> + <source>/*_& ...</source> + <translation>/*_& ...</translation> + </message> + <message> + <source>Exclude look-alike characters</source> + <translation>Изостави сличне карактере</translation> + </message> + <message> + <source>Ensure that the password contains characters from every group</source> + <translation>Обезбеди да лозинка садржи карактере из сваке групе</translation> + </message> + <message> + <source>Extended ASCII</source> + <translation>Проширени ASCII</translation> + </message> +</context> +<context> + <name>KMessageWidget</name> + <message> + <source>&Close</source> + <translation>Затвори</translation> + </message> + <message> + <source>Close message</source> + <translation>Затвори поруку</translation> + </message> +</context> +<context> + <name>Kdbx3Reader</name> + <message> + <source>Unable to calculate master key</source> + <translation>Није могуће израчунати главни кључ</translation> + </message> + <message> + <source>Unable to issue challenge-response.</source> + <translation>Издавање изазов-одговора није успело.</translation> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>Неисправан кључ или неисправна база података.</translation> + </message> +</context> +<context> + <name>Kdbx3Writer</name> + <message> + <source>Unable to issue challenge-response.</source> + <translation>Издавање изазов-одговора није успело.</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Није могуће израчунати главни кључ</translation> + </message> +</context> +<context> + <name>Kdbx4Reader</name> + <message> + <source>missing database headers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Није могуће израчунати главни кључ</translation> + </message> + <message> + <source>Invalid header checksum size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Header SHA256 mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header data length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open buffer for KDF parameters in header</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported key derivation function (KDF) or invalid parameters</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy header fields found in KDBX4 file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header binary size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass variant map version.</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name data</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value data</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Bool entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry type</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map field type size</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Kdbx4Writer</name> + <message> + <source>Invalid symmetric cipher algorithm.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid symmetric cipher IV size.</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Није могуће израчунати главни кључ</translation> + </message> + <message> + <source>Failed to serialize KDF parameters variant map</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxReader</name> + <message> + <source>Invalid cipher uuid length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid compression flags length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported compression algorithm</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid master seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform rounds size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid start bytes size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid random stream id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner random stream cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>Није KeePass база података</translation> + </message> + <message> + <source>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass 2 database version.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxXmlReader</name> + <message> + <source>XML parsing failure: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>No root group</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing icon uuid or data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing custom data key or value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Multiple group elements</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null group uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableAutoType value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableSearching value</source> + <translation type="unfinished"/> + </message> + <message> + <source>No group uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null DeleteObject uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing DeletedObject uuid or time</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null entry uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element in history entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>No entry uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element with different uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decrypt entry string</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate custom attribute found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry string key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate attachment found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry binary key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-type association window or sequence missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid bool value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid date time value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color rgb part</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid uuid value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decompress binary</source> + <extracomment>Translator meant is a binary data inside an entry</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KeePass1OpenWidget</name> + <message> + <source>Import KeePass1 database</source> + <translation>Увези KeePass1 базу података</translation> + </message> + <message> + <source>Unable to open the database.</source> + <translation>Није могуће отворити базу података.</translation> + </message> +</context> +<context> + <name>KeePass1Reader</name> + <message> + <source>Unable to read keyfile.</source> + <translation>Није могуће прочитати Кључ-Датотеку:</translation> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>Није KeePass база података</translation> + </message> + <message> + <source>Unsupported encryption algorithm.</source> + <translation>Енкрипциони алгоритам није подржан.</translation> + </message> + <message> + <source>Unsupported KeePass database version.</source> + <translation>Верзија KeePass базе података није подржана.</translation> + </message> + <message> + <source>Unable to read encryption IV</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of groups</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid content hash size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of transform rounds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to construct group tree</source> + <translation type="unfinished"/> + </message> + <message> + <source>Root</source> + <translation>Корен</translation> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Није могуће израчунати главни кључ</translation> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>Неисправан кључ или неисправна база података.</translation> + </message> + <message> + <source>Key transformation failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read group field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group access time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group level field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing group id or level</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing entry field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read entry field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry uuid field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field type</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Main</name> + <message> + <source>Existing single-instance lock file is invalid. Launching new instance.</source> + <translation type="unfinished"/> + </message> + <message> + <source>The lock file could not be created. Single-instance mode disabled.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Another instance of KeePassXC is already running.</source> + <translation>Друга инстанца KeePassXC апликације је већ активна.</translation> + </message> + <message> + <source>Fatal error while testing the cryptographic functions.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC - Error</source> + <translation>KeePassXC - Грешка</translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <source>&Database</source> + <translation>База података</translation> + </message> + <message> + <source>&Recent databases</source> + <translation>Скорашње базе података</translation> + </message> + <message> + <source>Import</source> + <translation>Увези</translation> + </message> + <message> + <source>&Help</source> + <translation>Помоћ</translation> + </message> + <message> + <source>E&ntries</source> + <translation>Уноси</translation> + </message> + <message> + <source>Copy att&ribute to clipboard</source> + <translation>Копирај атрибут</translation> + </message> + <message> + <source>Time-based one-time password</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Groups</source> + <translation>Групе</translation> + </message> + <message> + <source>&Tools</source> + <translation>Алатке</translation> + </message> + <message> + <source>&Quit</source> + <translation>Напусти</translation> + </message> + <message> + <source>&About</source> + <translation>О апликацији</translation> + </message> + <message> + <source>&Open database...</source> + <translation>&Отвори базу података...</translation> + </message> + <message> + <source>&Save database</source> + <translation>Сними базу података</translation> + </message> + <message> + <source>&Close database</source> + <translation>Затвори базу података</translation> + </message> + <message> + <source>&New database</source> + <translation>Нова база података</translation> + </message> + <message> + <source>Merge from KeePassX database</source> + <translation>Удружи податке из KeePassX базе података</translation> + </message> + <message> + <source>&Add new entry</source> + <translation>Додај нови унос</translation> + </message> + <message> + <source>&View/Edit entry</source> + <translation>Прикажи/Измени унос</translation> + </message> + <message> + <source>&Delete entry</source> + <translation>Обриши унос</translation> + </message> + <message> + <source>&Add new group</source> + <translation>Додај нову групу</translation> + </message> + <message> + <source>&Edit group</source> + <translation>Измени групу</translation> + </message> + <message> + <source>&Delete group</source> + <translation>Обриши групу</translation> + </message> + <message> + <source>Sa&ve database as...</source> + <translation>Сачувај базу података као...</translation> + </message> + <message> + <source>Change &master key...</source> + <translation>Промени главни кључ</translation> + </message> + <message> + <source>&Database settings</source> + <translation>Подешавања базе података</translation> + </message> + <message> + <source>Database settings</source> + <translation>Подешавања базе података</translation> + </message> + <message> + <source>&Clone entry</source> + <translation>Направи дупликат уноса</translation> + </message> + <message> + <source>&Find</source> + <translation>Пронађи</translation> + </message> + <message> + <source>Copy &username</source> + <translation>Копирај корисничко име</translation> + </message> + <message> + <source>Copy username to clipboard</source> + <translation>Копирај корисничко име</translation> + </message> + <message> + <source>Cop&y password</source> + <translation>Копирај лозинку</translation> + </message> + <message> + <source>Copy password to clipboard</source> + <translation>Копирај лозинку</translation> + </message> + <message> + <source>&Settings</source> + <translation>Подешавања</translation> + </message> + <message> + <source>Password Generator</source> + <translation>Генератор Лозинки</translation> + </message> + <message> + <source>&Perform Auto-Type</source> + <translation>Изврши Аутоматско-куцање</translation> + </message> + <message> + <source>&Open URL</source> + <translation>Отвори URL</translation> + </message> + <message> + <source>&Lock databases</source> + <translation>Закључај базу података</translation> + </message> + <message> + <source>&Title</source> + <translation>Наслов</translation> + </message> + <message> + <source>Copy title to clipboard</source> + <translation>Копирај назив</translation> + </message> + <message> + <source>&URL</source> + <translation>&URL</translation> + </message> + <message> + <source>Copy URL to clipboard</source> + <translation>Копирај URL</translation> + </message> + <message> + <source>&Notes</source> + <translation>Белешке</translation> + </message> + <message> + <source>Copy notes to clipboard</source> + <translation>Копирај белешке</translation> + </message> + <message> + <source>&Export to CSV file...</source> + <translation>Извези у CSV датотеку</translation> + </message> + <message> + <source>Import KeePass 1 database...</source> + <translation>Увези KeePass 1 базу података</translation> + </message> + <message> + <source>Import CSV file...</source> + <translation>Увези CSV датотеку...</translation> + </message> + <message> + <source>Re&pair database...</source> + <translation>Оправи базу података...</translation> + </message> + <message> + <source>Show TOTP</source> + <translation>Прикажи TOTP</translation> + </message> + <message> + <source>Set up TOTP...</source> + <translation>Подеси TOTP...</translation> + </message> + <message> + <source>Copy &TOTP</source> + <translation>Копирај &TOTP</translation> + </message> + <message> + <source>E&mpty recycle bin</source> + <translation>Испразни корпу за отпатке</translation> + </message> + <message> + <source>Clear history</source> + <translation>Очисти историју</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation>Грешка приликом приступа конфигурационој датотеци %1</translation> + </message> + <message> + <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> + <translation type="unfinished"/> + </message> + <message> + <source>read-only</source> + <translation>само-читање</translation> + </message> + <message> + <source>Settings</source> + <translation>Подешавања</translation> + </message> + <message> + <source>Toggle window</source> + <translation type="unfinished"/> + </message> + <message> + <source>Quit KeePassXC</source> + <translation>Напусти KeePassXC</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>KeePass 2 База података</translation> + </message> + <message> + <source>All files</source> + <translation>Све датотеке</translation> + </message> + <message> + <source>Open database</source> + <translation>Отвори базу података</translation> + </message> + <message> + <source>Save repaired database</source> + <translation>Сними исправљену базу података</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>Уписивање у базу података није успело.</translation> + </message> + <message> + <source>Please touch the button on your YubiKey!</source> + <translation type="unfinished"/> + </message> + <message> + <source>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>OpenSSHKey</name> + <message> + <source>Invalid key file, expecting an OpenSSH key</source> + <translation>Неисправна датотека са кључем, очекује се OpenSSH кључ</translation> + </message> + <message> + <source>PEM boundary mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>Base64 decoding failed</source> + <translation>Декодирање Base64 није успело</translation> + </message> + <message> + <source>Key file way too small.</source> + <translation>Кључ-датотека је превише мала.</translation> + </message> + <message> + <source>Key file magic header id invalid</source> + <translation>Идентификатор магичног заглавља Кључ-датотеке није валидан </translation> + </message> + <message> + <source>Found zero keys</source> + <translation>Није пронађен ниједан кључ</translation> + </message> + <message> + <source>Failed to read public key.</source> + <translation>Није могуће прочитати јавни кључ.</translation> + </message> + <message> + <source>Corrupted key file, reading private key failed</source> + <translation>Кључ-датотека је корумпирана, није успело ишчитавање приватног кључа</translation> + </message> + <message> + <source>No private key payload to decrypt</source> + <translation>Нема приватног кључа за декриптовање</translation> + </message> + <message> + <source>Trying to run KDF without cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Passphrase is required to decrypt this key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key derivation failed, key file corrupted?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Decryption failed, wrong passphrase?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write public key as it is empty</source> + <translation>Није могуће записати јавни кључ јер је празан</translation> + </message> + <message> + <source>Unexpected EOF when writing public key</source> + <translation>Неочекиван крај датотеке приликом уписивања јавног кључа</translation> + </message> + <message> + <source>Can't write private key as it is empty</source> + <translation>Није могуће записати приватни кључ јер је празан</translation> + </message> + <message> + <source>Unexpected EOF when writing private key</source> + <translation>Неочекиван крај датотеке приликом уписивања приватног кључа</translation> + </message> + <message> + <source>Unsupported key type: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cipher IV is too short for MD5 kdf</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>OptionDialog</name> + <message> + <source>Dialog</source> + <translation>Дијалог</translation> + </message> + <message> + <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable KeePassHTTP server</source> + <translation>Омогући KeePassHTTP сервер</translation> + </message> + <message> + <source>General</source> + <translation>Опште</translation> + </message> + <message> + <source>Sh&ow a notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return only best matching entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Match URL schemes</source> + <translation type="unfinished"/> + </message> + <message> + <source>Sort matching entries by &username</source> + <translation>Сортирај пронађене уносе по корисничком имену</translation> + </message> + <message> + <source>Sort &matching entries by title</source> + <translation>Сортирај пронађене уносе по наслову</translation> + </message> + <message> + <source>R&emove all shared encryption keys from active database</source> + <translation type="unfinished"/> + </message> + <message> + <source>Re&move all stored permissions from entries in active database</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password Generator</source> + <translation>Генератор Лозинки</translation> + </message> + <message> + <source>Advanced</source> + <translation>Напредно</translation> + </message> + <message> + <source>Always allow &access to entries</source> + <translation>Увек дозволи приступ уносима</translation> + </message> + <message> + <source>Always allow &updating entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searc&h in all opened databases for matching entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation type="unfinished"/> + </message> + <message> + <source>HTTP Port:</source> + <translation>HTTP Порт:</translation> + </message> + <message> + <source>Default port: 19455</source> + <translation>Подразумевани порт: 19455</translation> + </message> + <message> + <source>KeePassXC will listen to this port on 127.0.0.1</source> + <translation type="unfinished"/> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot bind to privileged ports</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot bind to privileged ports below 1024! +Using default port 19455.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>PasswordGeneratorWidget</name> + <message> + <source>%p%</source> + <translation>%p%</translation> + </message> + <message> + <source>Password:</source> + <translation>Лозинка:</translation> + </message> + <message> + <source>strength</source> + <comment>Password strength</comment> + <translation>јачина</translation> + </message> + <message> + <source>entropy</source> + <translation>ентропија</translation> + </message> + <message> + <source>Password</source> + <translation>Лозинка</translation> + </message> + <message> + <source>Character Types</source> + <translation>Типови карактера</translation> + </message> + <message> + <source>Upper Case Letters</source> + <translation>Велика слова</translation> + </message> + <message> + <source>Lower Case Letters</source> + <translation>Мала слова</translation> + </message> + <message> + <source>Numbers</source> + <translation>Бројеви</translation> + </message> + <message> + <source>Special Characters</source> + <translation>Посебни карактери</translation> + </message> + <message> + <source>Extended ASCII</source> + <translation>Проширени ASCII</translation> + </message> + <message> + <source>Exclude look-alike characters</source> + <translation>Изостави сличне карактере</translation> + </message> + <message> + <source>Pick characters from every group</source> + <translation>Обезбеди да лозинка садржи карактере из сваке групе</translation> + </message> + <message> + <source>&Length:</source> + <translation>Дужина:</translation> + </message> + <message> + <source>Passphrase</source> + <translation>Фразална Лозинка</translation> + </message> + <message> + <source>Wordlist:</source> + <translation>Листа речи:</translation> + </message> + <message> + <source>Word Count:</source> + <translation>Број Фраза:</translation> + </message> + <message> + <source>Word Separator:</source> + <translation>Разделник Фраза:</translation> + </message> + <message> + <source>Generate</source> + <translation>Генериши</translation> + </message> + <message> + <source>Copy</source> + <translation>Кпирај</translation> + </message> + <message> + <source>Accept</source> + <translation>Прихвати</translation> + </message> + <message> + <source>Close</source> + <translation>Затвори</translation> + </message> + <message> + <source>Apply</source> + <translation>Примени</translation> + </message> + <message> + <source>Entropy: %1 bit</source> + <translation>Ентропија: %1 бит</translation> + </message> + <message> + <source>Password Quality: %1</source> + <translation>Квалитет Лозинке: %1</translation> + </message> + <message> + <source>Poor</source> + <comment>Password quality</comment> + <translation>Слаб</translation> + </message> + <message> + <source>Weak</source> + <comment>Password quality</comment> + <translation>Слаб</translation> + </message> + <message> + <source>Good</source> + <comment>Password quality</comment> + <translation>Добар</translation> + </message> + <message> + <source>Excellent</source> + <comment>Password quality</comment> + <translation>Одличан</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <source>Database not opened</source> + <translation type="unfinished"/> + </message> + <message> + <source>Database hash not available</source> + <translation type="unfinished"/> + </message> + <message> + <source>Client public key not received</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot decrypt message</source> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout or cannot connect to KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>Action cancelled or denied</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC association failed, try again</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key change was not successful</source> + <translation type="unfinished"/> + </message> + <message> + <source>Encryption key is not recognized</source> + <translation type="unfinished"/> + </message> + <message> + <source>No saved databases found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect action</source> + <translation type="unfinished"/> + </message> + <message> + <source>Empty message received</source> + <translation type="unfinished"/> + </message> + <message> + <source>No URL provided</source> + <translation type="unfinished"/> + </message> + <message> + <source>No logins found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown error</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add a new entry to a database.</source> + <translation>Додај нови унос у базу података.</translation> + </message> + <message> + <source>Path of the database.</source> + <translation>Путања до базе података.</translation> + </message> + <message> + <source>Key file of the database.</source> + <translation>Кључ-Датотека базе података.</translation> + </message> + <message> + <source>path</source> + <translation>путања</translation> + </message> + <message> + <source>Username for the entry.</source> + <translation>Корисничко име за овај унос.</translation> + </message> + <message> + <source>username</source> + <translation>корисничко име</translation> + </message> + <message> + <source>URL for the entry.</source> + <translation>URL за овај унос.</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Prompt for the entry's password.</source> + <translation>Питај за лозинку уноса.</translation> + </message> + <message> + <source>Generate a password for the entry.</source> + <translation>Генериши лозинку за овај унос.</translation> + </message> + <message> + <source>Length for the generated password.</source> + <translation>Дужина генерисане лозинке.</translation> + </message> + <message> + <source>length</source> + <translation>дужина</translation> + </message> + <message> + <source>Path of the entry to add.</source> + <translation>Путања уноса који треба да се дода.</translation> + </message> + <message> + <source>Copy an entry's password to the clipboard.</source> + <translation>Копирај лозинку</translation> + </message> + <message> + <source>Path of the entry to clip.</source> + <comment>clip = copy to clipboard</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout in seconds before clearing the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Edit an entry.</source> + <translation>Измени унос.</translation> + </message> + <message> + <source>Title for the entry.</source> + <translation>Наслов уноса.</translation> + </message> + <message> + <source>title</source> + <translation>наслов</translation> + </message> + <message> + <source>Path of the entry to edit.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Estimate the entropy of a password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password for which to estimate the entropy.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Perform advanced analysis on the password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Extract and print the content of a database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database to extract.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Insert password to unlock %1: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to load key file %1 : %2</source> + <translation type="unfinished"/> + </message> + <message> + <source>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source> + +Available commands: +</source> + <translation> + +Доступне команде: +</translation> + </message> + <message> + <source>Name of the command to execute.</source> + <translation type="unfinished"/> + </message> + <message> + <source>List database entries.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the group to list. Default is /</source> + <translation type="unfinished"/> + </message> + <message> + <source>Find entries quickly.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Search term.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Merge two databases.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database to merge into.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database to merge from.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use the same credentials for both database files.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file of the database to merge from.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show an entry's information.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> + <translation type="unfinished"/> + </message> + <message> + <source>attribute</source> + <translation type="unfinished"/> + </message> + <message> + <source>Name of the entry to show.</source> + <translation type="unfinished"/> + </message> + <message> + <source>NULL device</source> + <translation>NULL уређај</translation> + </message> + <message> + <source>error reading from device</source> + <translation>грешка приликом читања са уређаја</translation> + </message> + <message> + <source>file empty ! +</source> + <translation>датотека је празна! +</translation> + </message> + <message> + <source>malformed string</source> + <translation>неисправна ниска</translation> + </message> + <message> + <source>missing closing quote</source> + <translation>недостаје завршни наводник</translation> + </message> + <message> + <source>AES: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Twofish: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>ChaCha20: 256-bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Argon2 (KDBX 4 – recommended)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 4)</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES-KDF (KDBX 3.1)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Group</source> + <translation>Група</translation> + </message> + <message> + <source>Title</source> + <translation>Наслов</translation> + </message> + <message> + <source>Username</source> + <translation>Корисничко име</translation> + </message> + <message> + <source>Password</source> + <translation>Лозинка</translation> + </message> + <message> + <source>Notes</source> + <translation>Белешке</translation> + </message> + <message> + <source>Last Modified</source> + <translation type="unfinished"/> + </message> + <message> + <source>Created</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy Browser Integration</source> + <translation type="unfinished"/> + </message> + <message> + <source>Browser Integration</source> + <translation>Интеграција са прегледачем</translation> + </message> + <message> + <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source> + <translation type="unfinished"/> + </message> + <message> + <source>Press</source> + <translation>Притисни</translation> + </message> + <message> + <source>Passive</source> + <translation>Пасивно</translation> + </message> + <message> + <source>SSH Agent</source> + <translation>SSH Агент</translation> + </message> + <message> + <source>Generate a new random diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Word count for the diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>count</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wordlist for the diceware generator. +[Default: EFF English]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a new random password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length of the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use lowercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use uppercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use numbers in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use special characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use extended ASCII in the generated password.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QtIOCompressor</name> + <message> + <source>Internal zlib error when compressing: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Error writing to underlying device: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Error opening underlying device: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Error reading data from underlying device: </source> + <translation type="unfinished"/> + </message> + <message> + <source>Internal zlib error when decompressing: </source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>QtIOCompressor::open</name> + <message> + <source>The gzip format not supported in this version of zlib.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Internal zlib error: </source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SearchWidget</name> + <message> + <source>Search...</source> + <translation type="unfinished"/> + </message> + <message> + <source>Search</source> + <translation>Претрага</translation> + </message> + <message> + <source>Clear</source> + <translation>Очисти</translation> + </message> + <message> + <source>Case Sensitive</source> + <translation type="unfinished"/> + </message> + <message> + <source>Limit search to selected group</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Service</name> + <message> + <source>KeePassXC: New key association request</source> + <translation type="unfinished"/> + </message> + <message> + <source>You have received an association request for the above key. +If you would like to allow it access to your KeePassXC database +give it a unique name to identify and accept it.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation type="unfinished"/> + </message> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation type="unfinished"/> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation type="unfinished"/> + </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation type="unfinished"/> + </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Removing stored permissions...</source> + <translation type="unfinished"/> + </message> + <message> + <source>Abort</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entries.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation type="unfinished"/> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SettingsWidget</name> + <message> + <source>Application Settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>Опште</translation> + </message> + <message> + <source>Security</source> + <translation type="unfinished"/> + </message> + <message> + <source>Access error for config file %1</source> + <translation>Грешка приликом приступа конфигурационој датотеци %1</translation> + </message> +</context> +<context> + <name>SettingsWidgetGeneral</name> + <message> + <source>Basic Settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Start only a single instance of KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remember last databases</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remember last key files and security dongles</source> + <translation type="unfinished"/> + </message> + <message> + <source>Load previous databases on startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically save on exit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically save after every change</source> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation type="unfinished"/> + </message> + <message> + <source>Minimize when copying to clipboard</source> + <translation type="unfinished"/> + </message> + <message> + <source>Minimize window at application startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use group icon on entry creation</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide the Details view</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show a system tray icon</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide window to system tray when minimized</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide window to system tray instead of app exit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Dark system tray icon</source> + <translation type="unfinished"/> + </message> + <message> + <source>Language</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-Type</source> + <translation>Аутоматско-куцање</translation> + </message> + <message> + <source>Use entry title to match windows for global Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use entry URL to match windows for global Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Always ask before performing Auto-Type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Global Auto-Type shortcut</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-Type delay</source> + <translation type="unfinished"/> + </message> + <message> + <source> ms</source> + <comment>Milliseconds</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>File Management</source> + <translation type="unfinished"/> + </message> + <message> + <source>Safely save database files (may be incompatible with Dropbox, etc)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Backup database file before saving</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry Management</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>Опште</translation> + </message> +</context> +<context> + <name>SettingsWidgetSecurity</name> + <message> + <source>Timeouts</source> + <translation type="unfinished"/> + </message> + <message> + <source>Clear clipboard after</source> + <translation type="unfinished"/> + </message> + <message> + <source> sec</source> + <comment>Seconds</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Lock databases after inactivity of</source> + <translation type="unfinished"/> + </message> + <message> + <source>Convenience</source> + <translation type="unfinished"/> + </message> + <message> + <source>Lock databases when session is locked or lid is closed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Lock databases after minimizing the window</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't require password repeat when it is visible</source> + <translation type="unfinished"/> + </message> + <message> + <source>Show passwords in cleartext by default</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide passwords in the preview panel</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide entry notes by default</source> + <translation type="unfinished"/> + </message> + <message> + <source>Privacy</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use Google as fallback for downloading website icons</source> + <translation type="unfinished"/> + </message> + <message> + <source>Re-lock previously locked database after performing Auto-Type</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>SetupTotpDialog</name> + <message> + <source>Setup TOTP</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Default RFC 6238 token settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Steam token settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use custom settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Note: Change these settings only if you know what you are doing.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Time step:</source> + <translation type="unfinished"/> + </message> + <message> + <source>8 digits</source> + <translation type="unfinished"/> + </message> + <message> + <source>6 digits</source> + <translation type="unfinished"/> + </message> + <message> + <source>Code size:</source> + <translation type="unfinished"/> + </message> + <message> + <source> sec</source> + <comment>Seconds</comment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>TotpDialog</name> + <message> + <source>Timed Password</source> + <translation type="unfinished"/> + </message> + <message> + <source>000000</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy</source> + <translation>Кпирај</translation> + </message> + <message> + <source>Expires in</source> + <translation type="unfinished"/> + </message> + <message> + <source>seconds</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>UnlockDatabaseWidget</name> + <message> + <source>Unlock database</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>WelcomeWidget</name> + <message> + <source>Start storing your passwords securely in a KeePassXC database</source> + <translation type="unfinished"/> + </message> + <message> + <source>Create new database</source> + <translation type="unfinished"/> + </message> + <message> + <source>Open existing database</source> + <translation type="unfinished"/> + </message> + <message> + <source>Import from KeePass 1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Import from CSV</source> + <translation type="unfinished"/> + </message> + <message> + <source>Recent databases</source> + <translation type="unfinished"/> + </message> + <message> + <source>Welcome to KeePassXC %1</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>main</name> + <message> + <source>Remove an entry from the database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database.</source> + <translation>Путања до базе података.</translation> + </message> + <message> + <source>Path of the entry to remove.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation type="unfinished"/> + </message> + <message> + <source>filenames of the password databases to open (*.kdbx)</source> + <translation type="unfinished"/> + </message> + <message> + <source>path to a custom config file</source> + <translation type="unfinished"/> + </message> + <message> + <source>key file of the database</source> + <translation type="unfinished"/> + </message> + <message> + <source>read password of the database from stdin</source> + <translation type="unfinished"/> + </message> + <message> + <source>Parent window handle</source> + <translation type="unfinished"/> + </message> +</context> +</TS> \ No newline at end of file diff --git a/share/translations/keepassx_sv.ts b/share/translations/keepassx_sv.ts index a9e8a85d7..e580bde0a 100644 --- a/share/translations/keepassx_sv.ts +++ b/share/translations/keepassx_sv.ts @@ -9,17 +9,33 @@ <source>About</source> <translation>Om</translation> </message> + <message> + <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> + <translation>Anmäl fel på: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> + </message> + <message> + <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> + <translation>KeePassXC distribueras enligt villkoren i GNU General Public License (GPL) version 2 eller (om du vill) version 3.</translation> + </message> <message> <source>Contributors</source> - <translation type="unfinished"/> + <translation>Bidragsgivare</translation> + </message> + <message> + <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Se alla bidrag på GitHub</a></translation> </message> <message> <source>Debug Info</source> - <translation type="unfinished"/> + <translation>Felsökningsinformation</translation> + </message> + <message> + <source>Include the following information whenever you report a bug:</source> + <translation>Inkludera följande information när du rapporterar ett fel:</translation> </message> <message> <source>Copy to clipboard</source> - <translation type="unfinished"/> + <translation>Kopiera till urklipp</translation> </message> <message> <source>Version %1 @@ -29,52 +45,51 @@ </message> <message> <source>Revision: %1</source> - <translation type="unfinished"/> + <translation>Ändring: %1</translation> + </message> + <message> + <source>Distribution: %1</source> + <translation>Utdelning: %1</translation> </message> <message> <source>Libraries:</source> - <translation type="unfinished"/> + <translation>Arkiv:</translation> </message> <message> <source>Operating system: %1 CPU architecture: %2 Kernel: %3 %4</source> - <translation type="unfinished"/> + <translation>Operativsystem: %1 +Processorarkitektur: %2 +Kärna: %3 %4</translation> </message> <message> <source>Enabled extensions:</source> - <translation type="unfinished"/> - </message> - <message> - <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> - <translation type="unfinished"/> - </message> - <message> - <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassXC distribueras enligt villkoren i GNU General Public License (GPL) version 2 eller (om du vill) version 3.</translation> + <translation>Aktiverade tillägg:</translation> </message> <message> <source>Project Maintainers:</source> + <translation>Projekt Ansvariga:</translation> + </message> + <message> + <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> <translation type="unfinished"/> </message> <message> - <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation type="unfinished"/> - </message> - <message> - <source>Include the following information whenever you report a bug:</source> - <translation type="unfinished"/> - </message> - <message> - <source>Distribution: %1</source> + <source>Build Type: %1 +</source> <translation type="unfinished"/> </message> </context> <context> <name>AccessControlDialog</name> + <message> + <source>KeePassXC HTTP Confirm Access</source> + <translation>KeePassXC HTTP Bekräfta åtkomst</translation> + </message> <message> <source>Remember this decision</source> - <translation type="unfinished"/> + <translation>Kom ihåg det här valet</translation> </message> <message> <source>Allow</source> @@ -87,11 +102,15 @@ Kernel: %3 %4</source> <message> <source>%1 has requested access to passwords for the following item(s). Please select whether you want to allow access.</source> - <translation type="unfinished"/> + <translation>%1 har begärt åtkomst till lösenorden för följande objekt. +Vill du tillåta det?</translation> </message> +</context> +<context> + <name>AgentSettingsWidget</name> <message> - <source>KeePassXC HTTP Confirm Access</source> - <translation type="unfinished"/> + <source>Enable SSH Agent (requires restart)</source> + <translation>Aktivera SSH-agenten (kräver omstart)</translation> </message> </context> <context> @@ -102,7 +121,27 @@ Please select whether you want to allow access.</source> </message> <message> <source>Auto-Type - KeePassXC</source> - <translation type="unfinished"/> + <translation>Autoskriv – KeePassXC</translation> + </message> + <message> + <source>Auto-Type</source> + <translation>Autoskriv</translation> + </message> + <message> + <source>The Syntax of your Auto-Type statement is incorrect!</source> + <translation>Din autoskrivsats innehåller ett syntaxfel!</translation> + </message> + <message> + <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> + <translation>Det här autoskrivkommandot innehåller en lång fördröjning. Vill du verkligen fortsätta?</translation> + </message> + <message> + <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> + <translation>Det här autoskrivkommandot innehåller mycket långsamma tangenttryckningar. Vill du verkligen fortsätta?</translation> + </message> + <message> + <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> + <translation>Det här autoskrivkommandot innehåller parametrar som upprepas många gånger. Vill du verkligen fortsätta?</translation> </message> </context> <context> @@ -117,19 +156,314 @@ Please select whether you want to allow access.</source> </message> <message> <source>Default sequence</source> - <translation>Standard sekvens</translation> + <translation>Standardsekvens</translation> + </message> +</context> +<context> + <name>AutoTypeMatchModel</name> + <message> + <source>Group</source> + <translation>Grupp</translation> + </message> + <message> + <source>Title</source> + <translation>Titel</translation> + </message> + <message> + <source>Username</source> + <translation>Användarnamn</translation> + </message> + <message> + <source>Sequence</source> + <translation>Sekvens</translation> </message> </context> <context> <name>AutoTypeSelectDialog</name> <message> - <source>Select entry to Auto-Type:</source> - <translation>Välj post att auto-skriva</translation> + <source>Auto-Type - KeePassXC</source> + <translation>Autoskriv – KeePassXC</translation> </message> <message> - <source>Auto-Type - KeePassXC</source> + <source>Select entry to Auto-Type:</source> + <translation>Välj post att autoskriva:</translation> + </message> +</context> +<context> + <name>BrowserAccessControlDialog</name> + <message> + <source>KeePassXC-Browser Confirm Access</source> + <translation>Bekräfta åtkomst för KeePassXC-Browser</translation> + </message> + <message> + <source>Remember this decision</source> + <translation>Kom ihåg det här valet</translation> + </message> + <message> + <source>Allow</source> + <translation>Tillåt</translation> + </message> + <message> + <source>Deny</source> + <translation>Neka</translation> + </message> + <message> + <source>%1 has requested access to passwords for the following item(s). +Please select whether you want to allow access.</source> + <translation>%1 har begärt åtkomst till lösenorden för följande objekt. +Vill du tillåta det?</translation> + </message> +</context> +<context> + <name>BrowserOptionDialog</name> + <message> + <source>Dialog</source> + <translation>Dialogruta</translation> + </message> + <message> + <source>This is required for accessing your databases with KeePassXC-Browser</source> + <translation>Det här krävs för KeePassXC-Browser ska kunna komma åt dina databaser</translation> + </message> + <message> + <source>Enable KeepassXC browser integration</source> + <translation>Aktivera KeepassXC:s webbläsarintegration</translation> + </message> + <message> + <source>General</source> + <translation>Allmänt</translation> + </message> + <message> + <source>Enable integration for these browsers:</source> + <translation>Aktivera integration i dessa webbläsare:</translation> + </message> + <message> + <source>&Google Chrome</source> + <translation>&Google Chrome</translation> + </message> + <message> + <source>&Firefox</source> + <translation>&Firefox</translation> + </message> + <message> + <source>&Chromium</source> + <translation>&Chromium</translation> + </message> + <message> + <source>&Vivaldi</source> + <translation>&Vivaldi</translation> + </message> + <message> + <source>Show a &notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation>Visa ett &meddelande när behörighetsuppgifter begärs</translation> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Be&gär att låsa upp databasen om den är låst</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> + <translation>Bara poster med samma protokoll (http://, https:// etc.) returneras.</translation> + </message> + <message> + <source>&Match URL scheme (e.g., https://...)</source> + <translation>&Matcha adressens protokoll (t.ex. https://)</translation> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>Returnerar bara de lämpligaste posterna för en viss webbadress istället för alla poster som rör den domänen.</translation> + </message> + <message> + <source>&Return only best-matching credentials</source> + <translation>&Returnera bara de lämpligaste</translation> + </message> + <message> + <source>Sort &matching credentials by title</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> <translation type="unfinished"/> </message> + <message> + <source>Sort matching credentials by &username</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>&Disconnect all browsers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Forget all remembered &permissions</source> + <translation type="unfinished"/> + </message> + <message> + <source>Advanced</source> + <translation>Avancerat</translation> + </message> + <message> + <source>Never &ask before accessing credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Never ask before &updating credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searc&h in all opened databases for matching credentials</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>Automatiskt skapande eller uppdaterande av strängfält stöds inte.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> + <translation type="unfinished"/> + </message> + <message> + <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Update &native messaging manifest files at startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>Support a proxy application between KeePassXC and browser extension.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &proxy application between KeePassXC and browser extension</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a custom proxy location if you installed a proxy manually.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use a &custom proxy location</source> + <comment>Meant is the proxy for KeePassXC-Browser</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Utforska...</translation> + </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*.exe);;All Files (*.*)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Executable Files (*)</source> + <translation>Exekverbara filer (*)</translation> + </message> + <message> + <source>Select custom proxy location</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>BrowserService</name> + <message> + <source>KeePassXC: New key association request</source> + <translation type="unfinished"/> + </message> + <message> + <source>You have received an association request for the above key. + +If you would like to allow it access to your KeePassXC database, +give it a unique name to identify and accept it.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Save and allow access</source> + <translation>Spara och tillåt åtkomst</translation> + </message> + <message> + <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: Skriv över befintlig nyckel?</translation> + </message> + <message> + <source>A shared encryption key with the name "%1" already exists. +Do you want to overwrite it?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Update Entry</source> + <translation>KeePassXC: Uppdatera post</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Vill du uppdatera informationen i %1 - %2?</translation> + </message> + <message> + <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: Databasen är låst!</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: Inställningar är inte tillgängliga!</translation> + </message> + <message> + <source>The active database does not contain a settings entry.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: No keys found</source> + <translation>KeePassXC: Inga nycklar hittade</translation> + </message> + <message> + <source>No shared encryption keys found in KeePassXC Settings.</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC: Removed keys from database</source> + <translation>KeePassXC: Nycklar borttagna från databasen</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Removing stored permissions…</source> + <translation type="unfinished"/> + </message> + <message> + <source>Abort</source> + <translation>Avbryt</translation> + </message> + <message> + <source>KeePassXC: Removed permissions</source> + <translation>KeePassXC: Tog bort behörigheter</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entry(s).</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>KeePassXC: No entry with permissions found!</source> + <translation type="unfinished"/> + </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>Den aktiva databasen innehåller inte en post med behörigheter.</translation> + </message> </context> <context> <name>ChangeMasterKeyWidget</name> @@ -145,6 +479,10 @@ Please select whether you want to allow access.</source> <source>Repeat password:</source> <translation>Repetera lösenord:</translation> </message> + <message> + <source>&Key file</source> + <translation type="unfinished"/> + </message> <message> <source>Browse</source> <translation>Bläddra</translation> @@ -153,6 +491,14 @@ Please select whether you want to allow access.</source> <source>Create</source> <translation>Skapa</translation> </message> + <message> + <source>Cha&llenge Response</source> + <translation type="unfinished"/> + </message> + <message> + <source>Refresh</source> + <translation>Uppdatera</translation> + </message> <message> <source>Key files</source> <translation>Nyckel-filer</translation> @@ -173,6 +519,10 @@ Please select whether you want to allow access.</source> <source>Select a key file</source> <translation>Välj nyckel-fil</translation> </message> + <message> + <source>Empty password</source> + <translation>Tomt lösenord</translation> + </message> <message> <source>Do you really want to use an empty string as password?</source> <translation>Vill du verkligen vill använda en tom sträng som lösenord?</translation> @@ -188,21 +538,16 @@ Please select whether you want to allow access.</source> %2</translation> </message> <message> - <source>&Key file</source> + <source>Legacy key file format</source> <translation type="unfinished"/> </message> <message> - <source>Cha&llenge Response</source> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> <translation type="unfinished"/> </message> - <message> - <source>Refresh</source> - <translation>Uppdatera</translation> - </message> - <message> - <source>Empty password</source> - <translation>Tomt lösenord</translation> - </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> <translation type="unfinished"/> @@ -212,26 +557,26 @@ Please select whether you want to allow access.</source> <name>CloneDialog</name> <message> <source>Clone Options</source> - <translation type="unfinished"/> - </message> - <message> - <source>Replace username and password with references</source> - <translation type="unfinished"/> - </message> - <message> - <source>Copy history</source> - <translation type="unfinished"/> + <translation>Klonings alternativ</translation> </message> <message> <source>Append ' - Clone' to title</source> <translation type="unfinished"/> </message> + <message> + <source>Replace username and password with references</source> + <translation>Ersätt användarnamn och lösenord med referenser</translation> + </message> + <message> + <source>Copy history</source> + <translation>Kopiera historik</translation> + </message> </context> <context> <name>CsvImportWidget</name> <message> <source>Import CSV fields</source> - <translation type="unfinished"/> + <translation>Importera CSV fält</translation> </message> <message> <source>filename</source> @@ -239,15 +584,15 @@ Please select whether you want to allow access.</source> </message> <message> <source>size, rows, columns</source> - <translation type="unfinished"/> + <translation>storlek, rader, kolumner</translation> </message> <message> <source>Encoding</source> - <translation type="unfinished"/> + <translation>Kodning</translation> </message> <message> <source>Codec</source> - <translation type="unfinished"/> + <translation>Codec</translation> </message> <message> <source>Text is qualified by</source> @@ -255,7 +600,7 @@ Please select whether you want to allow access.</source> </message> <message> <source>Fields are separated by</source> - <translation type="unfinished"/> + <translation>Fält är separerade med</translation> </message> <message> <source>Comments start with</source> @@ -263,11 +608,11 @@ Please select whether you want to allow access.</source> </message> <message> <source>First record has field names</source> - <translation type="unfinished"/> + <translation>Första data har fältnamn</translation> </message> <message> <source>Number of headers line to discard</source> - <translation type="unfinished"/> + <translation>Antal av rubrik rader att kasta bort</translation> </message> <message> <source>Consider '\' an escape character</source> @@ -279,11 +624,11 @@ Please select whether you want to allow access.</source> </message> <message> <source>Column layout</source> - <translation type="unfinished"/> + <translation>Kolumn layout</translation> </message> <message> <source>Not present in CSV file</source> - <translation type="unfinished"/> + <translation>Finns inte i CSV filen</translation> </message> <message> <source>Empty fieldname </source> @@ -295,19 +640,19 @@ Please select whether you want to allow access.</source> </message> <message> <source>Imported from CSV file</source> - <translation type="unfinished"/> + <translation>Importerat från CSV fil</translation> </message> <message> <source>Original data: </source> - <translation type="unfinished"/> + <translation>Ursprungsdata:</translation> </message> <message> <source>Error(s) detected in CSV file !</source> - <translation type="unfinished"/> + <translation>Ett eller flera fel upptäckta i CSV fil!</translation> </message> <message> <source> more messages skipped]</source> - <translation type="unfinished"/> + <translation>Fler meddelande hoppades över</translation> </message> <message> <source>Error</source> @@ -316,15 +661,11 @@ Please select whether you want to allow access.</source> <message> <source>CSV import: writer has errors: </source> - <translation type="unfinished"/> + <translation>CSV importering: skrivare har fel:</translation> </message> </context> <context> <name>CsvImportWizard</name> - <message> - <source>Import CSV file</source> - <translation type="unfinished"/> - </message> <message> <source>Error</source> <translation>Fel</translation> @@ -336,17 +677,17 @@ Please select whether you want to allow access.</source> </context> <context> <name>CsvParserModel</name> - <message> - <source> byte, </source> - <translation type="unfinished"/> + <message numerus="yes"> + <source>%n byte(s), </source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> - <message> - <source> rows, </source> - <translation> rader, </translation> + <message numerus="yes"> + <source>%n row(s), </source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> - <message> - <source> columns</source> - <translation> kolumner</translation> + <message numerus="yes"> + <source>%n column(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> </context> <context> @@ -367,13 +708,36 @@ Please select whether you want to allow access.</source> <source>Browse</source> <translation>Bläddra</translation> </message> + <message> + <source>Refresh</source> + <translation>Uppdatera</translation> + </message> + <message> + <source>Challenge Response:</source> + <translation>Utmanings respons</translation> + </message> <message> <source>Unable to open the database.</source> <translation>Kunde inte öppna databas.</translation> </message> <message> <source>Can't open key file</source> - <translation>Kan inte öppna nyckel-fil</translation> + <translation>Kan inte öppna nyckelfilen</translation> + </message> + <message> + <source>Legacy key file format</source> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Don't show this warning again</source> + <translation type="unfinished"/> </message> <message> <source>All files</source> @@ -387,14 +751,6 @@ Please select whether you want to allow access.</source> <source>Select key file</source> <translation>Välj nyckel-fil</translation> </message> - <message> - <source>Refresh</source> - <translation>Uppdatera</translation> - </message> - <message> - <source>Challenge Response:</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DatabaseRepairWidget</name> @@ -411,12 +767,12 @@ Please select whether you want to allow access.</source> <translation>Kan inte öppna nyckelfilen</translation> </message> <message> - <source>Database opened fine. Nothing to do.</source> - <translation>Databas öppnades fint. Inget att göra.</translation> + <source>Unable to open the database.</source> + <translation>Kunde inte öppna databas.</translation> </message> <message> - <source>Unable to open the database.</source> - <translation>Misslyckades att öppna databasen.</translation> + <source>Database opened fine. Nothing to do.</source> + <translation>Databas öppnades fint. Inget att göra.</translation> </message> <message> <source>Success</source> @@ -435,6 +791,104 @@ Du kan nu spara den.</translation> </context> <context> <name>DatabaseSettingsWidget</name> + <message> + <source>General</source> + <translation>Allmän</translation> + </message> + <message> + <source>Encryption</source> + <translation type="unfinished"/> + </message> + <message> + <source>Number of rounds too high</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a very high number of key transform rounds with Argon2. + +If you keep this number, your database may take hours or days (or even longer) to open!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Understood, keep number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cancel</source> + <translation>Avbryt</translation> + </message> + <message> + <source>Number of rounds too low</source> + <comment>Key transformation rounds</comment> + <translation type="unfinished"/> + </message> + <message> + <source>You are using a very low number of key transform rounds with AES-KDF. + +If you keep this number, your database may be too easy to crack!</source> + <translation type="unfinished"/> + </message> + <message> + <source>KDF unchanged</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <source> MiB</source> + <comment>Abbreviation for Mebibytes (KDF settings)</comment> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source> thread(s)</source> + <comment>Threads for parallel execution (KDF settings)</comment> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetEncryption</name> + <message> + <source>Encryption Algorithm:</source> + <translation type="unfinished"/> + </message> + <message> + <source>AES: 256 Bit (default)</source> + <translation>AES: 256 Bit (standard)</translation> + </message> + <message> + <source>Twofish: 256 Bit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key Derivation Function:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Transform rounds:</source> + <translation>Transformerings varv:</translation> + </message> + <message> + <source>Benchmark 1-second delay</source> + <translation type="unfinished"/> + </message> + <message> + <source>Memory Usage:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Parallelism:</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DatabaseSettingsWidgetGeneral</name> + <message> + <source>Database Meta Data</source> + <translation type="unfinished"/> + </message> <message> <source>Database name:</source> <translation>Databasnamn:</translation> @@ -443,21 +897,13 @@ Du kan nu spara den.</translation> <source>Database description:</source> <translation>Databasbeskrivning:</translation> </message> - <message> - <source>Transform rounds:</source> - <translation>Transformerings varv:</translation> - </message> <message> <source>Default username:</source> <translation>Standard användarnamn:</translation> </message> <message> - <source> MiB</source> - <translation>MiB</translation> - </message> - <message> - <source>Benchmark</source> - <translation>Benchmark</translation> + <source>History Settings</source> + <translation type="unfinished"/> </message> <message> <source>Max. history items:</source> @@ -467,20 +913,20 @@ Du kan nu spara den.</translation> <source>Max. history size:</source> <translation>Maximal historik storlek:</translation> </message> + <message> + <source> MiB</source> + <translation>MiB</translation> + </message> <message> <source>Use recycle bin</source> + <translation>Använd soptunnan</translation> + </message> + <message> + <source>Additional Database Settings</source> <translation type="unfinished"/> </message> <message> - <source>AES: 256 Bit (default)</source> - <translation type="unfinished"/> - </message> - <message> - <source>Twofish: 256 Bit</source> - <translation type="unfinished"/> - </message> - <message> - <source>Algorithm:</source> + <source>Enable &compression (recommended)</source> <translation type="unfinished"/> </message> </context> @@ -488,11 +934,12 @@ Du kan nu spara den.</translation> <name>DatabaseTabWidget</name> <message> <source>Root</source> + <comment>Root group</comment> <translation>Root</translation> </message> <message> <source>KeePass 2 Database</source> - <translation>KeePass 2 Databas</translation> + <translation>KeePass 2 databas</translation> </message> <message> <source>All files</source> @@ -506,6 +953,30 @@ Du kan nu spara den.</translation> <source>File not found!</source> <translation>Filen kunde inte hittas!</translation> </message> + <message> + <source>Unable to open the database.</source> + <translation>Kunde inte öppna databas.</translation> + </message> + <message> + <source>File opened in read only mode.</source> + <translation>Fil öppnad i läs-enbart läge.</translation> + </message> + <message> + <source>Open CSV file</source> + <translation>Öppna CSV fil</translation> + </message> + <message> + <source>CSV file</source> + <translation>CSV-fil</translation> + </message> + <message> + <source>All files (*)</source> + <translation>Alla filer (*)</translation> + </message> + <message> + <source>Merge database</source> + <translation>Slå samman databas</translation> + </message> <message> <source>Open KeePass 1 database</source> <translation>Öppna KeePass 1 databas</translation> @@ -514,14 +985,16 @@ Du kan nu spara den.</translation> <source>KeePass 1 database</source> <translation>KeePass 1 databas</translation> </message> - <message> - <source>All files (*)</source> - <translation>Alla filer (*)</translation> - </message> <message> <source>Close?</source> <translation>Stäng?</translation> </message> + <message> + <source>"%1" is in edit mode. +Discard changes and close anyway?</source> + <translation>"%1" är i redigeringsläge. +Kasta ändringarna och stäng ändå?</translation> + </message> <message> <source>Save changes?</source> <translation>Spara ändringar?</translation> @@ -534,12 +1007,24 @@ Spara ändringarna?</translation> </message> <message> <source>Writing the database failed.</source> - <translation>Kunde inte skriva till databasen.</translation> + <translation>Misslyckades med att skriva till databasen.</translation> + </message> + <message> + <source>Passwords</source> + <translation>Lösenord</translation> </message> <message> <source>Save database as</source> <translation>Spara databas som</translation> </message> + <message> + <source>Export database to CSV file</source> + <translation>Exportera databasen till en CSV-fil</translation> + </message> + <message> + <source>Writing the CSV file failed.</source> + <translation>Kunde inte skriva till CSV-filen</translation> + </message> <message> <source>New database</source> <translation>Ny databas</translation> @@ -557,12 +1042,6 @@ Spara ändringarna?</translation> Please press cancel to finish your changes or discard them.</source> <translation>Kan inte låsa databasen eftersom du håller på att redigera den. Tryck avbryt för att ansluta dina ändringar alternativt kasta dem.</translation> - </message> - <message> - <source>This database has never been saved. -You can save the database or stop locking it.</source> - <translation>Databasen has aldrig sparats. -Spara databasen eller sluta lås den.</translation> </message> <message> <source>This database has been modified. @@ -573,65 +1052,21 @@ Vill du spara databasen innen du låser den? I annat fall försvinner ändringarna.</translation> </message> <message> - <source>"%1" is in edit mode. -Discard changes and close anyway?</source> - <translation>"%1" är i redigeringsläge. -Kasta ändringarna och stäng ändå?</translation> - </message> - <message> - <source>Export database to CSV file</source> - <translation>Exportera databasen till en CSV-fil</translation> - </message> - <message> - <source>CSV file</source> - <translation>CSV-fil</translation> - </message> - <message> - <source>Writing the CSV file failed.</source> - <translation>Kunde inte skriva till CSV-filen</translation> - </message> - <message> - <source>Unable to open the database.</source> - <translation>Kunde inte öppna databas.</translation> - </message> - <message> - <source>Merge database</source> + <source>Disable safe saves?</source> <translation type="unfinished"/> </message> <message> - <source>The database you are trying to save as is locked by another instance of KeePassXC. -Do you want to save it anyway?</source> + <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</source> <translation type="unfinished"/> </message> - <message> - <source>Passwords</source> - <translation>Lösenord</translation> - </message> - <message> - <source>Database already opened</source> - <translation type="unfinished"/> - </message> - <message> - <source>The database you are trying to open is locked by another instance of KeePassXC. - -Do you want to open it anyway?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Open read-only</source> - <translation type="unfinished"/> - </message> - <message> - <source>File opened in read only mode.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Open CSV file</source> - <translation>Öppna CSV fil</translation> - </message> </context> <context> <name>DatabaseWidget</name> + <message> + <source>Searching...</source> + <translation>Söker...</translation> + </message> <message> <source>Change master key</source> <translation>Ändra huvud lösenord</translation> @@ -652,13 +1087,33 @@ Do you want to open it anyway?</source> <source>Do you really want to delete %1 entries for good?</source> <translation>Vill du verkligen ta bort %1 poser för gott?</translation> </message> + <message> + <source>Move entry to recycle bin?</source> + <translation>Flytta post till soptunnan?</translation> + </message> + <message> + <source>Do you really want to move entry "%1" to the recycle bin?</source> + <translation>Vill du verkligen flytta %n poster till papperskorgen?</translation> + </message> <message> <source>Move entries to recycle bin?</source> <translation>Lägg poster i papperskorgen?</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>Vill du verkligen flytta %n post till papperskorgen?</numerusform><numerusform>Vill du verkligen flytta %n poster till papperskorgen?</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Execute command?</source> + <translation>Utför kommando?</translation> + </message> + <message> + <source>Do you really want to execute the following command?<br><br>%1<br></source> + <translation type="unfinished"/> + </message> + <message> + <source>Remember my choice</source> + <translation type="unfinished"/> </message> <message> <source>Delete group?</source> @@ -672,25 +1127,13 @@ Do you want to open it anyway?</source> <source>Unable to calculate master key</source> <translation>Kunde inte räkna nu master-nyckeln</translation> </message> - <message> - <source>Move entry to recycle bin?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Searching...</source> - <translation>Söker...</translation> - </message> <message> <source>No current database.</source> - <translation type="unfinished"/> + <translation>Ingen nuvarande databas.</translation> </message> <message> <source>No source database, nothing to do.</source> - <translation type="unfinished"/> + <translation>Ingen ursprungs databas, inget att göra.</translation> </message> <message> <source>Search Results (%1)</source> @@ -701,31 +1144,20 @@ Do you want to open it anyway?</source> <translation>Inget resultat</translation> </message> <message> - <source>Execute command?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Do you really want to execute the following command?<br><br>%1<br></source> - <translation type="unfinished"/> - </message> - <message> - <source>Remember my choice</source> - <translation type="unfinished"/> - </message> - <message> - <source>Autoreload Request</source> + <source>File has changed</source> <translation type="unfinished"/> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> - <translation type="unfinished"/> + <translation>Databasfilen har ändrats. Vill du ladda in ändringarna?</translation> </message> <message> <source>Merge Request</source> - <translation type="unfinished"/> + <translation>Slå samman begäran</translation> </message> <message> - <source>The database file has changed and you have unsaved changes.Do you want to merge your changes?</source> + <source>The database file has changed and you have unsaved changes. +Do you want to merge your changes?</source> <translation type="unfinished"/> </message> <message> @@ -740,6 +1172,93 @@ Do you want to open it anyway?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation type="unfinished"/> </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>DetailsWidget</name> + <message> + <source>Generate TOTP Token</source> + <translation type="unfinished"/> + </message> + <message> + <source>Close</source> + <translation>Stäng</translation> + </message> + <message> + <source>General</source> + <translation>Allmän</translation> + </message> + <message> + <source>Password</source> + <translation>Lösenord</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Expiration</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username</source> + <translation>Användarnamn</translation> + </message> + <message> + <source>Autotype</source> + <translation type="unfinished"/> + </message> + <message> + <source>Searching</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attributes</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation>Bilagor</translation> + </message> + <message> + <source>Notes</source> + <translation>Anteckningar</translation> + </message> + <message> + <source>Window</source> + <translation>Fönster</translation> + </message> + <message> + <source>Sequence</source> + <translation>Sekvens</translation> + </message> + <message> + <source>Search</source> + <translation>Sök</translation> + </message> + <message> + <source>Clear</source> + <translation>Rensa</translation> + </message> + <message> + <source>Never</source> + <translation>Aldrig</translation> + </message> + <message> + <source>[PROTECTED]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Disabled</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enabled</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidget</name> @@ -767,6 +1286,30 @@ Do you want to open it anyway?</source> <source>History</source> <translation>Historik</translation> </message> + <message> + <source>SSH Agent</source> + <translation>SSH Agent</translation> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>(encrypted)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Select private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>File too large to be a private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open private key</source> + <translation type="unfinished"/> + </message> <message> <source>Entry history</source> <translation>Posthistork</translation> @@ -787,40 +1330,6 @@ Do you want to open it anyway?</source> <source>New attribute</source> <translation>Nytt attribut</translation> </message> - <message> - <source>Select file</source> - <translation>Välj fil</translation> - </message> - <message> - <source>Unable to open file</source> - <translation>Kunde inte öppna filen.</translation> - </message> - <message> - <source>Save attachment</source> - <translation>Spara bifogad fil</translation> - </message> - <message> - <source>Unable to save the attachment: -</source> - <translation>Kunde inte spara bifogad fil: -</translation> - </message> - <message> - <source>Tomorrow</source> - <translation>Imorgon</translation> - </message> - <message numerus="yes"> - <source>%n week(s)</source> - <translation><numerusform>%n vecka</numerusform><numerusform>%n veckor</numerusform></translation> - </message> - <message numerus="yes"> - <source>%n month(s)</source> - <translation><numerusform>%n månad</numerusform><numerusform>%n månader</numerusform></translation> - </message> - <message> - <source>1 year</source> - <translation>1 år</translation> - </message> <message> <source>Confirm Remove</source> <translation>Bekräfta borttagning</translation> @@ -830,11 +1339,39 @@ Do you want to open it anyway?</source> <translation type="unfinished"/> </message> <message> - <source>[PROTECTED] Press reveal to view or edit</source> + <source>[PROTECTED]</source> <translation type="unfinished"/> </message> <message> - <source>Are you sure you want to remove this attachment?</source> + <source>Press reveal to view or edit</source> + <translation type="unfinished"/> + </message> + <message> + <source>Tomorrow</source> + <translation>Imorgon</translation> + </message> + <message numerus="yes"> + <source>%n week(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source>%n month(s)</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>1 year</source> + <translation>1 år</translation> + </message> + <message> + <source>Apply generated password?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to apply the generated password to this entry?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry updated successfully.</source> <translation type="unfinished"/> </message> </context> @@ -852,18 +1389,6 @@ Do you want to open it anyway?</source> <source>Remove</source> <translation>Ta bort</translation> </message> - <message> - <source>Attachments</source> - <translation>Bilagor</translation> - </message> - <message> - <source>Save</source> - <translation>Spara</translation> - </message> - <message> - <source>Open</source> - <translation>Öppna</translation> - </message> <message> <source>Edit Name</source> <translation type="unfinished"/> @@ -876,6 +1401,18 @@ Do you want to open it anyway?</source> <source>Reveal</source> <translation type="unfinished"/> </message> + <message> + <source>Attachments</source> + <translation>Bilagor</translation> + </message> + <message> + <source>Foreground Color:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Background Color:</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -883,6 +1420,18 @@ Do you want to open it anyway?</source> <source>Enable Auto-Type for this entry</source> <translation>Slå på auto-skriv för denna post</translation> </message> + <message> + <source>Inherit default Auto-Type sequence from the &group</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Use custom Auto-Type sequence:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Window Associations</source> + <translation type="unfinished"/> + </message> <message> <source>+</source> <translation>+</translation> @@ -896,23 +1445,7 @@ Do you want to open it anyway?</source> <translation>Fönster titel:</translation> </message> <message> - <source>Inherit default Auto-Type sequence from the &group</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Use custom Auto-Type sequence:</source> - <translation type="unfinished"/> - </message> - <message> - <source>Use default se&quence</source> - <translation type="unfinished"/> - </message> - <message> - <source>Set custo&m sequence:</source> - <translation type="unfinished"/> - </message> - <message> - <source>Window Associations</source> + <source>Use a specific sequence for this association:</source> <translation type="unfinished"/> </message> </context> @@ -938,12 +1471,8 @@ Do you want to open it anyway?</source> <context> <name>EditEntryWidgetMain</name> <message> - <source>Title:</source> - <translation>Titel:</translation> - </message> - <message> - <source>Username:</source> - <translation>Användarnamn:</translation> + <source>URL:</source> + <translation>URL:</translation> </message> <message> <source>Password:</source> @@ -954,20 +1483,104 @@ Do you want to open it anyway?</source> <translation>Repetera:</translation> </message> <message> - <source>URL:</source> - <translation>URL:</translation> + <source>Title:</source> + <translation>Titel:</translation> </message> <message> - <source>Expires</source> - <translation>Går ut</translation> + <source>Notes</source> + <translation>Anteckningar</translation> </message> <message> <source>Presets</source> <translation>Förinställningar</translation> </message> <message> - <source>Notes:</source> - <translation>Anteckningar:</translation> + <source>Toggle the checkbox to reveal the notes section.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Username:</source> + <translation>Användarnamn:</translation> + </message> + <message> + <source>Expires</source> + <translation>Går ut</translation> + </message> +</context> +<context> + <name>EditEntryWidgetSSHAgent</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent after</source> + <translation type="unfinished"/> + </message> + <message> + <source> seconds</source> + <translation>sekunder</translation> + </message> + <message> + <source>Fingerprint</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove key from agent when database is closed/locked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add key to agent when database is opened/unlocked</source> + <translation type="unfinished"/> + </message> + <message> + <source>Comment</source> + <translation type="unfinished"/> + </message> + <message> + <source>Decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>n/a</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy to clipboard</source> + <translation>Kopiera till urklipp</translation> + </message> + <message> + <source>Private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>External file</source> + <translation type="unfinished"/> + </message> + <message> + <source>Browse...</source> + <extracomment>Button for opening file dialog</extracomment> + <translation>Utforska...</translation> + </message> + <message> + <source>Attachment</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add to agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove from agent</source> + <translation type="unfinished"/> + </message> + <message> + <source>Require user confirmation when this key is used</source> + <translation type="unfinished"/> </message> </context> <context> @@ -1038,6 +1651,14 @@ Do you want to open it anyway?</source> </context> <context> <name>EditWidgetIcons</name> + <message> + <source>&Use default icon</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use custo&m icon</source> + <translation type="unfinished"/> + </message> <message> <source>Add custom icon</source> <translation>Lägg till egen ikon</translation> @@ -1046,6 +1667,18 @@ Do you want to open it anyway?</source> <source>Delete custom icon</source> <translation>Ta bort egen ikon</translation> </message> + <message> + <source>Download favicon</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to fetch favicon.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> + <translation type="unfinished"/> + </message> <message> <source>Images</source> <translation>Bilder</translation> @@ -1058,24 +1691,12 @@ Do you want to open it anyway?</source> <source>Select Image</source> <translation>Välj bild</translation> </message> - <message> - <source>Download favicon</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unable to fetch favicon.</source> - <translation type="unfinished"/> - </message> <message> <source>Can't read icon</source> <translation type="unfinished"/> </message> <message> - <source>&Use default icon</source> - <translation type="unfinished"/> - </message> - <message> - <source>Use custo&m icon</source> + <source>Custom icon already exists</source> <translation type="unfinished"/> </message> <message> @@ -1086,14 +1707,6 @@ Do you want to open it anyway?</source> <source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source> <translation type="unfinished"/> </message> - <message> - <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation type="unfinished"/> - </message> - <message> - <source>Custom icon already exists</source> - <translation type="unfinished"/> - </message> </context> <context> <name>EditWidgetProperties</name> @@ -1113,11 +1726,120 @@ Do you want to open it anyway?</source> <source>Uuid:</source> <translation>UUID:</translation> </message> + <message> + <source>Plugin Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove</source> + <translation>Ta bort</translation> + </message> + <message> + <source>Delete plugin data?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Value</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Entry</name> <message> <source> - Clone</source> + <comment>Suffix added to cloned entries</comment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EntryAttachmentsModel</name> + <message> + <source>Name</source> + <translation>Namn</translation> + </message> + <message> + <source>Size</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>EntryAttachmentsWidget</name> + <message> + <source>Form</source> + <translation type="unfinished"/> + </message> + <message> + <source>Add</source> + <translation>Lägg till</translation> + </message> + <message> + <source>Remove</source> + <translation>Ta bort</translation> + </message> + <message> + <source>Open</source> + <translation>Öppna</translation> + </message> + <message> + <source>Save</source> + <translation>Spara</translation> + </message> + <message> + <source>Select files</source> + <translation type="unfinished"/> + </message> + <message numerus="yes"> + <source>Are you sure you want to remove %n attachment(s)?</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message> + <source>Confirm Remove</source> + <translation>Bekräfta borttagning</translation> + </message> + <message> + <source>Save attachments</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to create directory: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Confirm overwrite</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to save attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachment: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open attachments: +%1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to open files: +%1</source> <translation type="unfinished"/> </message> </context> @@ -1149,6 +1871,11 @@ Do you want to open it anyway?</source> </context> <context> <name>EntryModel</name> + <message> + <source>Ref: </source> + <comment>Reference abbreviation</comment> + <translation type="unfinished"/> + </message> <message> <source>Group</source> <translation>Grupp</translation> @@ -1166,8 +1893,62 @@ Do you want to open it anyway?</source> <translation>URL</translation> </message> <message> - <source>Ref: </source> - <comment>Reference abbreviation</comment> + <source>Never</source> + <translation>Aldrig</translation> + </message> + <message> + <source>Password</source> + <translation>Lösenord</translation> + </message> + <message> + <source>Notes</source> + <translation>Anteckningar</translation> + </message> + <message> + <source>Expires</source> + <translation>Går ut</translation> + </message> + <message> + <source>Created</source> + <translation>Skapad</translation> + </message> + <message> + <source>Modified</source> + <translation type="unfinished"/> + </message> + <message> + <source>Accessed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation>Bilagor</translation> + </message> +</context> +<context> + <name>EntryView</name> + <message> + <source>Customize View</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide Usernames</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide Passwords</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fit to window</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fit to contents</source> + <translation type="unfinished"/> + </message> + <message> + <source>Reset to defaults</source> <translation type="unfinished"/> </message> </context> @@ -1178,6 +1959,17 @@ Do you want to open it anyway?</source> <translation>Papperskorg</translation> </message> </context> +<context> + <name>HostInstaller</name> + <message> + <source>KeePassXC: Cannot save file!</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot save the native messaging script file.</source> + <translation type="unfinished"/> + </message> +</context> <context> <name>HttpPasswordGeneratorWidget</name> <message> @@ -1228,6 +2020,10 @@ Do you want to open it anyway?</source> <source>Ensure that the password contains characters from every group</source> <translation>Säkerställ att lösenordet innehåller tecken från varje grupp</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>Utökad ASCII</translation> + </message> </context> <context> <name>KMessageWidget</name> @@ -1240,6 +2036,358 @@ Do you want to open it anyway?</source> <translation type="unfinished"/> </message> </context> +<context> + <name>Kdbx3Reader</name> + <message> + <source>Unable to calculate master key</source> + <translation>Kunde inte räkna nu master-nyckeln</translation> + </message> + <message> + <source>Unable to issue challenge-response.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt.</source> + <translation>Fel lösenord eller korrupt databas-fil</translation> + </message> +</context> +<context> + <name>Kdbx3Writer</name> + <message> + <source>Unable to issue challenge-response.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Kunde inte räkna nu master-nyckeln</translation> + </message> +</context> +<context> + <name>Kdbx4Reader</name> + <message> + <source>missing database headers</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Kunde inte räkna nu master-nyckeln</translation> + </message> + <message> + <source>Invalid header checksum size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Header SHA256 mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid header data length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to open buffer for KDF parameters in header</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported key derivation function (KDF) or invalid parameters</source> + <translation type="unfinished"/> + </message> + <message> + <source>Legacy header fields found in KDBX4 file.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header field length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner header binary size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass variant map version.</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry name data</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry value data</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Bool entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt32 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map Int64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map UInt64 entry value length</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map entry type</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid variant map field type size</source> + <extracomment>Translation: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>Kdbx4Writer</name> + <message> + <source>Invalid symmetric cipher algorithm.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid symmetric cipher IV size.</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to calculate master key</source> + <translation>Kunde inte räkna nu master-nyckeln</translation> + </message> + <message> + <source>Failed to serialize KDF parameters variant map</source> + <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxReader</name> + <message> + <source>Invalid cipher uuid length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid compression flags length</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported compression algorithm</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid master seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform rounds size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid start bytes size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid random stream id size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid inner random stream cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Not a KeePass database.</source> + <translation>Inte en KeePass databas.</translation> + </message> + <message> + <source>The selected file is an old KeePass 1 database (.kdb). + +You can import it by clicking on Database > 'Import KeePass 1 database...'. +This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported KeePass 2 database version.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>KdbxXmlReader</name> + <message> + <source>XML parsing failure: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>No root group</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing icon uuid or data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing custom data key or value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Multiple group elements</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null group uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableAutoType value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid EnableSearching value</source> + <translation type="unfinished"/> + </message> + <message> + <source>No group uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null DeleteObject uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing DeletedObject uuid or time</source> + <translation type="unfinished"/> + </message> + <message> + <source>Null entry uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon number</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element in history entry</source> + <translation type="unfinished"/> + </message> + <message> + <source>No entry uuid found</source> + <translation type="unfinished"/> + </message> + <message> + <source>History element with different uuid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decrypt entry string</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate custom attribute found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry string key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Duplicate attachment found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry binary key or value missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Auto-type association window or sequence missing</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid bool value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid date time value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid color rgb part</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid uuid value</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to decompress binary</source> + <extracomment>Translator meant is a binary data inside an entry</extracomment> + <translation type="unfinished"/> + </message> +</context> <context> <name>KeePass1OpenWidget</name> <message> @@ -1259,7 +2407,7 @@ Do you want to open it anyway?</source> </message> <message> <source>Not a KeePass database.</source> - <translation>Inte en KeePass databas</translation> + <translation>Inte en KeePass databas.</translation> </message> <message> <source>Unsupported encryption algorithm.</source> @@ -1269,6 +2417,35 @@ Do you want to open it anyway?</source> <source>Unsupported KeePass database version.</source> <translation>KeePass databas versionen stöds ej.</translation> </message> + <message> + <source>Unable to read encryption IV</source> + <comment>IV = Initialization Vector for symmetric cipher</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of groups</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid content hash size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid transform seed size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid number of transform rounds</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unable to construct group tree</source> + <translation type="unfinished"/> + </message> <message> <source>Root</source> <translation>Root</translation> @@ -1281,56 +2458,103 @@ Do you want to open it anyway?</source> <source>Wrong key or database file is corrupt.</source> <translation>Fel lösenord eller korrupt databas-fil</translation> </message> -</context> -<context> - <name>KeePass2Reader</name> <message> - <source>Not a KeePass database.</source> - <translation>Inte en KeePass databas.</translation> - </message> - <message> - <source>Unsupported KeePass database version.</source> - <translation>KeePass databas versionen stöds ej.</translation> - </message> - <message> - <source>Wrong key or database file is corrupt.</source> - <translation>Fel lösenord eller korrupt databas-fil</translation> - </message> - <message> - <source>Unable to calculate master key</source> - <translation>Kunde inte räkna nu master-nyckeln</translation> - </message> - <message> - <source>Unable to issue challenge-response.</source> + <source>Key transformation failed</source> <translation type="unfinished"/> </message> <message> - <source>The selected file is an old KeePass 1 database (.kdb). - -You can import it by clicking on Database > 'Import KeePass 1 database...'. -This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source> - <translation type="unfinished"/> - </message> -</context> -<context> - <name>KeePass2Writer</name> - <message> - <source>Unable to issue challenge-response.</source> + <source>Invalid group field type number</source> <translation type="unfinished"/> </message> <message> - <source>Unable to calculate master key</source> - <translation>Kunde inte räkna nu master-nyckeln</translation> + <source>Invalid group field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read group field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group access time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect group level field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid group field type</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing group id or level</source> + <translation type="unfinished"/> + </message> + <message> + <source>Missing entry field type number</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Read entry field data doesn't match size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry uuid field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry group id field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry icon field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry creation time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry modification time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry expiry time field size</source> + <translation type="unfinished"/> + </message> + <message> + <source>Invalid entry field type</source> + <translation type="unfinished"/> </message> </context> <context> <name>Main</name> <message> - <source>Fatal error while testing the cryptographic functions.</source> - <translation>Allvarligt fel vid testning av kryptografiska funktioner.</translation> - </message> - <message> - <source>KeePassXC - Error</source> + <source>Existing single-instance lock file is invalid. Launching new instance.</source> <translation type="unfinished"/> </message> <message> @@ -1339,67 +2563,35 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Another instance of KeePassXC is already running.</source> - <translation type="unfinished"/> + <translation>En annan instans av KeePassXC körs redan.</translation> </message> <message> - <source>Existing single-instance lock file is invalid. Launching new instance.</source> + <source>Fatal error while testing the cryptographic functions.</source> + <translation>Allvarligt fel vid testning av kryptografiska funktioner.</translation> + </message> + <message> + <source>KeePassXC - Error</source> <translation type="unfinished"/> </message> </context> <context> <name>MainWindow</name> <message> - <source>Open database</source> - <translation>Öppna databas</translation> - </message> - <message> - <source>Database settings</source> - <translation>Databasinställningar</translation> - </message> - <message> - <source>Copy username to clipboard</source> - <translation>Kopiera användarnamn</translation> - </message> - <message> - <source>Copy password to clipboard</source> - <translation>Kopiera lösenord</translation> - </message> - <message> - <source>Settings</source> - <translation>Inställningar</translation> - </message> - <message> - <source>Show toolbar</source> - <translation>Visa verktygsfält</translation> - </message> - <message> - <source>read-only</source> - <translation>läs bara</translation> - </message> - <message> - <source>Toggle window</source> - <translation>Visa/dölj fönster</translation> - </message> - <message> - <source>KeePass 2 Database</source> - <translation>KeePass 2 databas</translation> - </message> - <message> - <source>All files</source> - <translation>Alla filer</translation> - </message> - <message> - <source>Save repaired database</source> - <translation>Spara lagad databas</translation> - </message> - <message> - <source>Writing the database failed.</source> - <translation>Misslyckades med att skriva till databasen.</translation> + <source>&Database</source> + <translation type="unfinished"/> </message> <message> <source>&Recent databases</source> <translation type="unfinished"/> </message> + <message> + <source>Import</source> + <translation>Importera</translation> + </message> + <message> + <source>&Help</source> + <translation type="unfinished"/> + </message> <message> <source>E&ntries</source> <translation type="unfinished"/> @@ -1408,12 +2600,16 @@ This is a one-way migration. You won't be able to open the imported databas <source>Copy att&ribute to clipboard</source> <translation type="unfinished"/> </message> + <message> + <source>Time-based one-time password</source> + <translation type="unfinished"/> + </message> <message> <source>&Groups</source> <translation type="unfinished"/> </message> <message> - <source>&View</source> + <source>&Tools</source> <translation type="unfinished"/> </message> <message> @@ -1424,6 +2620,10 @@ This is a one-way migration. You won't be able to open the imported databas <source>&About</source> <translation type="unfinished"/> </message> + <message> + <source>&Open database...</source> + <translation type="unfinished"/> + </message> <message> <source>&Save database</source> <translation type="unfinished"/> @@ -1438,7 +2638,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Merge from KeePassX database</source> - <translation type="unfinished"/> + <translation>Sammanfoga med KeePassX databas</translation> </message> <message> <source>&Add new entry</source> @@ -1464,26 +2664,26 @@ This is a one-way migration. You won't be able to open the imported databas <source>&Delete group</source> <translation type="unfinished"/> </message> + <message> + <source>Sa&ve database as...</source> + <translation type="unfinished"/> + </message> + <message> + <source>Change &master key...</source> + <translation type="unfinished"/> + </message> <message> <source>&Database settings</source> <translation type="unfinished"/> </message> + <message> + <source>Database settings</source> + <translation>Databasinställningar</translation> + </message> <message> <source>&Clone entry</source> <translation type="unfinished"/> </message> - <message> - <source>Timed one-time password</source> - <translation type="unfinished"/> - </message> - <message> - <source>Copy &TOTP</source> - <translation type="unfinished"/> - </message> - <message> - <source>Show TOTP</source> - <translation type="unfinished"/> - </message> <message> <source>&Find</source> <translation type="unfinished"/> @@ -1492,14 +2692,26 @@ This is a one-way migration. You won't be able to open the imported databas <source>Copy &username</source> <translation type="unfinished"/> </message> + <message> + <source>Copy username to clipboard</source> + <translation>Kopiera användarnamn</translation> + </message> <message> <source>Cop&y password</source> <translation type="unfinished"/> </message> + <message> + <source>Copy password to clipboard</source> + <translation>Kopiera lösenord</translation> + </message> <message> <source>&Settings</source> <translation type="unfinished"/> </message> + <message> + <source>Password Generator</source> + <translation>Lösenordsgenerator</translation> + </message> <message> <source>&Perform Auto-Type</source> <translation type="unfinished"/> @@ -1516,65 +2728,25 @@ This is a one-way migration. You won't be able to open the imported databas <source>&Title</source> <translation type="unfinished"/> </message> + <message> + <source>Copy title to clipboard</source> + <translation>Kopiera titeln till Urklipp</translation> + </message> <message> <source>&URL</source> <translation type="unfinished"/> </message> + <message> + <source>Copy URL to clipboard</source> + <translation>Kopiera URL till Urklipp</translation> + </message> <message> <source>&Notes</source> <translation type="unfinished"/> </message> <message> - <source>Password Generator</source> - <translation type="unfinished"/> - </message> - <message> - <source>Clear history</source> - <translation>Töm historiken</translation> - </message> - <message> - <source>&Database</source> - <translation type="unfinished"/> - </message> - <message> - <source>Import</source> - <translation>Importera</translation> - </message> - <message> - <source>&Tools</source> - <translation type="unfinished"/> - </message> - <message> - <source>Empty recycle bin</source> - <translation type="unfinished"/> - </message> - <message> - <source>Access error for config file %1</source> - <translation type="unfinished"/> - </message> - <message> - <source>Quit KeePassXC</source> - <translation type="unfinished"/> - </message> - <message> - <source>Please touch the button on your YubiKey!</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Help</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Open database...</source> - <translation type="unfinished"/> - </message> - <message> - <source>Sa&ve database as...</source> - <translation type="unfinished"/> - </message> - <message> - <source>Change &master key...</source> - <translation type="unfinished"/> + <source>Copy notes to clipboard</source> + <translation>Kopiera anteckningar till Urklipp</translation> </message> <message> <source>&Export to CSV file...</source> @@ -1592,8 +2764,177 @@ This is a one-way migration. You won't be able to open the imported databas <source>Re&pair database...</source> <translation type="unfinished"/> </message> + <message> + <source>Show TOTP</source> + <translation>Visa TOTP</translation> + </message> <message> <source>Set up TOTP...</source> + <translation>Konfigurera TOTP...</translation> + </message> + <message> + <source>Copy &TOTP</source> + <translation>Kopiera &TOTP</translation> + </message> + <message> + <source>E&mpty recycle bin</source> + <translation type="unfinished"/> + </message> + <message> + <source>Clear history</source> + <translation>Töm historiken</translation> + </message> + <message> + <source>Access error for config file %1</source> + <translation>Åtkomstfel för konfigurationsfil %1</translation> + </message> + <message> + <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> + <translation type="unfinished"/> + </message> + <message> + <source>read-only</source> + <translation>läs bara</translation> + </message> + <message> + <source>Settings</source> + <translation>Inställningar</translation> + </message> + <message> + <source>Toggle window</source> + <translation>Visa/dölj fönster</translation> + </message> + <message> + <source>Quit KeePassXC</source> + <translation>Avsluta KeePassXC</translation> + </message> + <message> + <source>KeePass 2 Database</source> + <translation>KeePass 2 databas</translation> + </message> + <message> + <source>All files</source> + <translation>Alla filer</translation> + </message> + <message> + <source>Open database</source> + <translation>Öppna databas</translation> + </message> + <message> + <source>Save repaired database</source> + <translation>Spara lagad databas</translation> + </message> + <message> + <source>Writing the database failed.</source> + <translation>Misslyckades med att skriva till databasen.</translation> + </message> + <message> + <source>Please touch the button on your YubiKey!</source> + <translation type="unfinished"/> + </message> + <message> + <source>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</source> + <translation type="unfinished"/> + </message> +</context> +<context> + <name>OpenSSHKey</name> + <message> + <source>Invalid key file, expecting an OpenSSH key</source> + <translation type="unfinished"/> + </message> + <message> + <source>PEM boundary mismatch</source> + <translation type="unfinished"/> + </message> + <message> + <source>Base64 decoding failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file way too small.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key file magic header id invalid</source> + <translation type="unfinished"/> + </message> + <message> + <source>Found zero keys</source> + <translation type="unfinished"/> + </message> + <message> + <source>Failed to read public key.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Corrupted key file, reading private key failed</source> + <translation type="unfinished"/> + </message> + <message> + <source>No private key payload to decrypt</source> + <translation type="unfinished"/> + </message> + <message> + <source>Trying to run KDF without cipher</source> + <translation type="unfinished"/> + </message> + <message> + <source>Passphrase is required to decrypt this key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key derivation failed, key file corrupted?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Decryption failed, wrong passphrase?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF while reading private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write public key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing public key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Can't write private key as it is empty</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unexpected EOF when writing private key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unsupported key type: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cipher IV is too short for MD5 kdf</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: %1</source> <translation type="unfinished"/> </message> </context> @@ -1601,24 +2942,65 @@ This is a one-way migration. You won't be able to open the imported databas <name>OptionDialog</name> <message> <source>Dialog</source> + <translation>Dialogruta</translation> + </message> + <message> + <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> <translation type="unfinished"/> </message> + <message> + <source>Enable KeePassHTTP server</source> + <translation>Aktivera KeePassHTTP server</translation> + </message> <message> <source>General</source> <translation>Allmän</translation> </message> <message> <source>Sh&ow a notification when credentials are requested</source> + <extracomment>Credentials mean login data requested via browser extension</extracomment> + <translation type="unfinished"/> + </message> + <message> + <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> + <translation>Returnerar bara de lämpligaste posterna för en viss webbadress istället för alla poster som rör den domänen.</translation> + </message> + <message> + <source>&Return only best matching entries</source> + <translation type="unfinished"/> + </message> + <message> + <source>Re&quest to unlock the database if it is locked</source> + <translation>Begär att låsa upp databasen om den är låst</translation> + </message> + <message> + <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> + <translation type="unfinished"/> + </message> + <message> + <source>&Match URL schemes</source> <translation type="unfinished"/> </message> <message> <source>Sort matching entries by &username</source> <translation type="unfinished"/> </message> + <message> + <source>Sort &matching entries by title</source> + <translation type="unfinished"/> + </message> + <message> + <source>R&emove all shared encryption keys from active database</source> + <translation type="unfinished"/> + </message> <message> <source>Re&move all stored permissions from entries in active database</source> <translation type="unfinished"/> </message> + <message> + <source>Password Generator</source> + <translation>Lösenordsgenerator</translation> + </message> <message> <source>Advanced</source> <translation>Avancerat</translation> @@ -1631,30 +3013,42 @@ This is a one-way migration. You won't be able to open the imported databas <source>Always allow &updating entries</source> <translation type="unfinished"/> </message> + <message> + <source>Only the selected database has to be connected with a client.</source> + <translation type="unfinished"/> + </message> <message> <source>Searc&h in all opened databases for matching entries</source> <translation type="unfinished"/> </message> <message> - <source>HTTP Port:</source> + <source>Automatically creating or updating string fields is not supported.</source> + <translation>Automatiskt skapande eller uppdaterande av strängfält stöds inte.</translation> + </message> + <message> + <source>&Return advanced string fields which start with "KPH: "</source> <translation type="unfinished"/> </message> + <message> + <source>HTTP Port:</source> + <translation>HTTP Port:</translation> + </message> <message> <source>Default port: 19455</source> - <translation type="unfinished"/> - </message> - <message> - <source>Re&quest to unlock the database if it is locked</source> - <translation type="unfinished"/> - </message> - <message> - <source>Sort &matching entries by title</source> - <translation type="unfinished"/> + <translation>Standard port: 19455</translation> </message> <message> <source>KeePassXC will listen to this port on 127.0.0.1</source> <translation type="unfinished"/> </message> + <message> + <source><b>Warning:</b> The following options can be dangerous!</source> + <translation type="unfinished"/> + </message> + <message> + <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> + <translation type="unfinished"/> + </message> <message> <source>Cannot bind to privileged ports</source> <translation type="unfinished"/> @@ -1664,62 +3058,30 @@ This is a one-way migration. You won't be able to open the imported databas Using default port 19455.</source> <translation type="unfinished"/> </message> - <message> - <source>R&emove all shared encryption keys from active database</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Return advanced string fields which start with "KPH: "</source> - <translation type="unfinished"/> - </message> - <message> - <source>Automatically creating or updating string fields is not supported.</source> - <translation type="unfinished"/> - </message> - <message> - <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> - <translation type="unfinished"/> - </message> - <message> - <source>Enable KeePassHTTP server</source> - <translation type="unfinished"/> - </message> - <message> - <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Return only best matching entries</source> - <translation type="unfinished"/> - </message> - <message> - <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Match URL schemes</source> - <translation type="unfinished"/> - </message> - <message> - <source>Password Generator</source> - <translation type="unfinished"/> - </message> - <message> - <source>Only the selected database has to be connected with a client.</source> - <translation type="unfinished"/> - </message> - <message> - <source>The following options can be dangerous! -Change them only if you know what you are doing.</source> - <translation type="unfinished"/> - </message> </context> <context> <name>PasswordGeneratorWidget</name> + <message> + <source>%p%</source> + <translation>%p%</translation> + </message> <message> <source>Password:</source> <translation>Lösenord:</translation> </message> + <message> + <source>strength</source> + <comment>Password strength</comment> + <translation>styrka</translation> + </message> + <message> + <source>entropy</source> + <translation>entropi</translation> + </message> + <message> + <source>Password</source> + <translation>Lösenord</translation> + </message> <message> <source>Character Types</source> <translation>Teckentyper</translation> @@ -1740,37 +3102,49 @@ Change them only if you know what you are doing.</source> <source>Special Characters</source> <translation>Specialtecken</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>Utökad ASCII</translation> + </message> <message> <source>Exclude look-alike characters</source> <translation>Uteslut liknande tecken</translation> </message> - <message> - <source>Accept</source> - <translation>Acceptera</translation> - </message> - <message> - <source>%p%</source> - <translation type="unfinished"/> - </message> - <message> - <source>strength</source> - <translation type="unfinished"/> - </message> - <message> - <source>entropy</source> - <translation type="unfinished"/> - </message> - <message> - <source>&Length:</source> - <translation type="unfinished"/> - </message> <message> <source>Pick characters from every group</source> <translation type="unfinished"/> </message> + <message> + <source>&Length:</source> + <translation>&Längd:</translation> + </message> + <message> + <source>Passphrase</source> + <translation>Lösenfras</translation> + </message> + <message> + <source>Wordlist:</source> + <translation>Ordlista:</translation> + </message> + <message> + <source>Word Count:</source> + <translation>Antal ord:</translation> + </message> + <message> + <source>Word Separator:</source> + <translation>Ord separerare:</translation> + </message> <message> <source>Generate</source> - <translation type="unfinished"/> + <translation>Generera</translation> + </message> + <message> + <source>Copy</source> + <translation>Kopiera</translation> + </message> + <message> + <source>Accept</source> + <translation>Acceptera</translation> </message> <message> <source>Close</source> @@ -1778,7 +3152,7 @@ Change them only if you know what you are doing.</source> </message> <message> <source>Apply</source> - <translation type="unfinished"/> + <translation>Utför</translation> </message> <message> <source>Entropy: %1 bit</source> @@ -1786,79 +3160,322 @@ Change them only if you know what you are doing.</source> </message> <message> <source>Password Quality: %1</source> - <translation type="unfinished"/> + <translation>Lösenord kvalitet: %1</translation> </message> <message> <source>Poor</source> - <translation type="unfinished"/> + <comment>Password quality</comment> + <translation>Dålig</translation> </message> <message> <source>Weak</source> - <translation type="unfinished"/> + <comment>Password quality</comment> + <translation>Svag</translation> </message> <message> <source>Good</source> - <translation type="unfinished"/> + <comment>Password quality</comment> + <translation>Bra</translation> </message> <message> <source>Excellent</source> - <translation type="unfinished"/> - </message> - <message> - <source>Password</source> - <translation>Lösenord</translation> - </message> - <message> - <source>Extended ASCII</source> - <translation type="unfinished"/> - </message> - <message> - <source>Passphrase</source> - <translation type="unfinished"/> - </message> - <message> - <source>Wordlist:</source> - <translation type="unfinished"/> - </message> - <message> - <source>Word Count:</source> - <translation type="unfinished"/> - </message> - <message> - <source>Word Separator:</source> - <translation type="unfinished"/> - </message> - <message> - <source>Copy</source> - <translation>Kopiera</translation> + <comment>Password quality</comment> + <translation>Utmärkt</translation> </message> </context> <context> <name>QObject</name> + <message> + <source>Database not opened</source> + <translation>Databasen är inte öppen</translation> + </message> + <message> + <source>Database hash not available</source> + <translation type="unfinished"/> + </message> + <message> + <source>Client public key not received</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot decrypt message</source> + <translation>Kan inte avkoda meddelande</translation> + </message> + <message> + <source>Timeout or cannot connect to KeePassXC</source> + <translation type="unfinished"/> + </message> + <message> + <source>Action cancelled or denied</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC association failed, try again</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key change was not successful</source> + <translation>Nyckelbytet misslyckades</translation> + </message> + <message> + <source>Encryption key is not recognized</source> + <translation type="unfinished"/> + </message> + <message> + <source>No saved databases found</source> + <translation type="unfinished"/> + </message> + <message> + <source>Incorrect action</source> + <translation>Felaktig åtgärd</translation> + </message> + <message> + <source>Empty message received</source> + <translation>Tomt meddelande mottaget</translation> + </message> + <message> + <source>No URL provided</source> + <translation>Ingen URL angiven</translation> + </message> + <message> + <source>No logins found</source> + <translation>Hittade inga inloggningar</translation> + </message> + <message> + <source>Unknown error</source> + <translation>Okänt fel</translation> + </message> + <message> + <source>Add a new entry to a database.</source> + <translation>Lägga till en ny post i en databas.</translation> + </message> + <message> + <source>Path of the database.</source> + <translation>Sökväg till databasen</translation> + </message> + <message> + <source>Key file of the database.</source> + <translation>Nyckelfilen för databasen.</translation> + </message> + <message> + <source>path</source> + <translation>sökväg</translation> + </message> + <message> + <source>Username for the entry.</source> + <translation>Användarnamn för posten.</translation> + </message> + <message> + <source>username</source> + <translation>användarnamn</translation> + </message> + <message> + <source>URL for the entry.</source> + <translation>URL för posten.</translation> + </message> + <message> + <source>URL</source> + <translation>URL</translation> + </message> + <message> + <source>Prompt for the entry's password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a password for the entry.</source> + <translation>Generera ett lösenord för posten.</translation> + </message> + <message> + <source>Length for the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>length</source> + <translation>längd</translation> + </message> + <message> + <source>Path of the entry to add.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Copy an entry's password to the clipboard.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the entry to clip.</source> + <comment>clip = copy to clipboard</comment> + <translation type="unfinished"/> + </message> + <message> + <source>Timeout in seconds before clearing the clipboard.</source> + <translation>Timeout i sekunder innan Urklipp rensas.</translation> + </message> + <message> + <source>Edit an entry.</source> + <translation>Redigera en post.</translation> + </message> + <message> + <source>Title for the entry.</source> + <translation>Titel för posten.</translation> + </message> + <message> + <source>title</source> + <translation>titel</translation> + </message> + <message> + <source>Path of the entry to edit.</source> + <translation>Sökvägen till posten att redigera.</translation> + </message> + <message> + <source>Estimate the entropy of a password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password for which to estimate the entropy.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Perform advanced analysis on the password.</source> + <translation>Utföra avancerad analys av lösenordet.</translation> + </message> + <message> + <source>Extract and print the content of a database.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Path of the database to extract.</source> + <translation>Sökvägen till databasen som skall extraheras.</translation> + </message> + <message> + <source>Insert password to unlock %1: </source> + <translation>Ange lösenordet för att låsa upp %1: </translation> + </message> + <message> + <source>Failed to load key file %1 : %2</source> + <translation>Misslyckades med att ladda nyckelfilen %1: %2</translation> + </message> + <message> + <source>WARNING: You are using a legacy key file format which may become +unsupported in the future. + +Please consider generating a new key file.</source> + <translation type="unfinished"/> + </message> + <message> + <source> + +Available commands: +</source> + <translation> + +Tillgängliga kommandon: +</translation> + </message> + <message> + <source>Name of the command to execute.</source> + <translation>Namnet på kommandot som ska köras.</translation> + </message> + <message> + <source>List database entries.</source> + <translation>Lista databasposter.</translation> + </message> + <message> + <source>Path of the group to list. Default is /</source> + <translation>Sökvägen till gruppen att lista. Standard är /</translation> + </message> + <message> + <source>Find entries quickly.</source> + <translation>Hitta poster snabbt.</translation> + </message> + <message> + <source>Search term.</source> + <translation>Sökord.</translation> + </message> + <message> + <source>Merge two databases.</source> + <translation>Sammanfoga två databaser.</translation> + </message> + <message> + <source>Path of the database to merge into.</source> + <translation>Sökvägen till databasen för att sammanfoga till.</translation> + </message> + <message> + <source>Path of the database to merge from.</source> + <translation>Sökvägen till databasen för att sammanfoga från.</translation> + </message> + <message> + <source>Use the same credentials for both database files.</source> + <translation>Använda samma autentiseringsuppgifter för båda databasfilerna.</translation> + </message> + <message> + <source>Key file of the database to merge from.</source> + <translation>Nyckelfilen för databasen att sammanfoga från.</translation> + </message> + <message> + <source>Show an entry's information.</source> + <translation>Visa en posts information.</translation> + </message> + <message> + <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> + <translation type="unfinished"/> + </message> + <message> + <source>attribute</source> + <translation>attribut</translation> + </message> + <message> + <source>Name of the entry to show.</source> + <translation>Namnet på posten som skall visas.</translation> + </message> <message> <source>NULL device</source> <translation type="unfinished"/> </message> <message> <source>error reading from device</source> - <translation type="unfinished"/> + <translation>fel vid läsning från enhet</translation> </message> <message> <source>file empty ! </source> - <translation type="unfinished"/> + <translation>filen är tom! +</translation> </message> <message> <source>malformed string</source> - <translation type="unfinished"/> + <translation>felaktigt uppbyggd textsträng</translation> </message> <message> <source>missing closing quote</source> - <translation type="unfinished"/> + <translation>saknar avslutande citattecken</translation> </message> <message> - <source>INTERNAL - unget lower bound exceeded</source> - <translation type="unfinished"/> + <source>AES: 256-bit</source> + <translation>AES: 256-bitar</translation> + </message> + <message> + <source>Twofish: 256-bit</source> + <translation>Twofish: 256-bitar</translation> + </message> + <message> + <source>ChaCha20: 256-bit</source> + <translation>ChaCha20: 256-bitar</translation> + </message> + <message> + <source>Argon2 (KDBX 4 – recommended)</source> + <translation>Argon2 (KDBX 4 – rekommenderad)</translation> + </message> + <message> + <source>AES-KDF (KDBX 4)</source> + <translation>AES-KDF (KDBX 4)</translation> + </message> + <message> + <source>AES-KDF (KDBX 3.1)</source> + <translation>AES-KDF (KDBX 3.1)</translation> </message> <message> <source>Group</source> @@ -1876,28 +3493,85 @@ Change them only if you know what you are doing.</source> <source>Password</source> <translation>Lösenord</translation> </message> - <message> - <source>URL</source> - <translation>URL</translation> - </message> <message> <source>Notes</source> <translation>Anteckningar</translation> </message> <message> - <source>Browser Integration</source> + <source>Last Modified</source> + <translation>Senast ändrad</translation> + </message> + <message> + <source>Created</source> + <translation>Skapad</translation> + </message> + <message> + <source>Legacy Browser Integration</source> <translation type="unfinished"/> </message> + <message> + <source>Browser Integration</source> + <translation>Webbläsarintegration</translation> + </message> <message> <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source> <translation type="unfinished"/> </message> <message> <source>Press</source> - <translation type="unfinished"/> + <translation>Tryck</translation> </message> <message> <source>Passive</source> + <translation>Passiv</translation> + </message> + <message> + <source>SSH Agent</source> + <translation>SSH Agent</translation> + </message> + <message> + <source>Generate a new random diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Word count for the diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>count</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wordlist for the diceware generator. +[Default: EFF English]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a new random password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length of the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use lowercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use uppercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use numbers in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use special characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use extended ASCII in the generated password.</source> <translation type="unfinished"/> </message> </context> @@ -1938,8 +3612,8 @@ Change them only if you know what you are doing.</source> <context> <name>SearchWidget</name> <message> - <source>Case Sensitive</source> - <translation type="unfinished"/> + <source>Search...</source> + <translation>Sök...</translation> </message> <message> <source>Search</source> @@ -1950,58 +3624,16 @@ Change them only if you know what you are doing.</source> <translation>Rensa</translation> </message> <message> - <source>Search...</source> - <translation type="unfinished"/> + <source>Case Sensitive</source> + <translation>Skiftlägeskänslig</translation> </message> <message> <source>Limit search to selected group</source> - <translation type="unfinished"/> + <translation>Begränsa sökningen till vald grupp</translation> </message> </context> <context> <name>Service</name> - <message> - <source>A shared encryption-key with the name "%1" already exists. -Do you want to overwrite it?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Do you want to update the information in %1 - %2?</source> - <translation type="unfinished"/> - </message> - <message> - <source>The active database is locked! -Please unlock the selected database or choose another one which is unlocked.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Successfully removed %1 encryption-%2 from KeePassX/Http Settings.</source> - <translation type="unfinished"/> - </message> - <message> - <source>No shared encryption-keys found in KeePassHttp Settings.</source> - <translation type="unfinished"/> - </message> - <message> - <source>The active database does not contain an entry of KeePassHttp Settings.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Removing stored permissions...</source> - <translation type="unfinished"/> - </message> - <message> - <source>Abort</source> - <translation>Avbryt</translation> - </message> - <message> - <source>Successfully removed permissions from %1 %2.</source> - <translation type="unfinished"/> - </message> - <message> - <source>The active database does not contain an entry with permissions.</source> - <translation type="unfinished"/> - </message> <message> <source>KeePassXC: New key association request</source> <translation type="unfinished"/> @@ -2014,36 +3646,78 @@ give it a unique name to identify and accept it.</source> </message> <message> <source>KeePassXC: Overwrite existing key?</source> + <translation>KeePassXC: Skriv över befintlig nyckel?</translation> + </message> + <message> + <source>A shared encryption-key with the name "%1" already exists. +Do you want to overwrite it?</source> <translation type="unfinished"/> </message> <message> <source>KeePassXC: Update Entry</source> - <translation type="unfinished"/> + <translation>KeePassXC: Uppdatera post</translation> + </message> + <message> + <source>Do you want to update the information in %1 - %2?</source> + <translation>Vill du uppdatera informationen i %1 - %2?</translation> </message> <message> <source>KeePassXC: Database locked!</source> + <translation>KeePassXC: Databasen är låst!</translation> + </message> + <message> + <source>The active database is locked! +Please unlock the selected database or choose another one which is unlocked.</source> <translation type="unfinished"/> </message> <message> <source>KeePassXC: Removed keys from database</source> - <translation type="unfinished"/> + <translation>KeePassXC: Nycklar borttagna från databasen</translation> + </message> + <message numerus="yes"> + <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> <message> <source>KeePassXC: No keys found</source> + <translation>KeePassXC: Hittade inga nycklar</translation> + </message> + <message> + <source>No shared encryption-keys found in KeePassHttp Settings.</source> <translation type="unfinished"/> </message> <message> <source>KeePassXC: Settings not available!</source> + <translation>KeePassXC: Inställningar är inte tillgängliga!</translation> + </message> + <message> + <source>The active database does not contain an entry of KeePassHttp Settings.</source> <translation type="unfinished"/> </message> + <message> + <source>Removing stored permissions...</source> + <translation>Tar bort lagrade behörigheter...</translation> + </message> + <message> + <source>Abort</source> + <translation>Avbryt</translation> + </message> <message> <source>KeePassXC: Removed permissions</source> - <translation type="unfinished"/> + <translation>KeePassXC: Tog bort behörigheter</translation> + </message> + <message numerus="yes"> + <source>Successfully removed permissions from %n entries.</source> + <translation><numerusform>Framgångsrikt bort behörigheter från %n poster.</numerusform><numerusform>Lyckades ta bort behörigheter från %n poster.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> <translation type="unfinished"/> </message> + <message> + <source>The active database does not contain an entry with permissions.</source> + <translation>Den aktiva databasen innehåller inte en post med behörigheter.</translation> + </message> </context> <context> <name>SettingsWidget</name> @@ -2061,15 +3735,31 @@ give it a unique name to identify and accept it.</source> </message> <message> <source>Access error for config file %1</source> - <translation type="unfinished"/> + <translation>Åtkomstfel för konfigurationsfil %1</translation> </message> </context> <context> <name>SettingsWidgetGeneral</name> + <message> + <source>Basic Settings</source> + <translation>Grund inställningar</translation> + </message> + <message> + <source>Start only a single instance of KeePassXC</source> + <translation>Tillåt endast en samtidig instans av KeePassXC</translation> + </message> <message> <source>Remember last databases</source> <translation>Komihåg senaste databasen</translation> </message> + <message> + <source>Remember last key files and security dongles</source> + <translation type="unfinished"/> + </message> + <message> + <source>Load previous databases on startup</source> + <translation>Ladda tidigare databaser vid uppstart</translation> + </message> <message> <source>Automatically save on exit</source> <translation>Spara automatiskt när applikationen anslutas</translation> @@ -2078,21 +3768,29 @@ give it a unique name to identify and accept it.</source> <source>Automatically save after every change</source> <translation>Spara automatiskt efter varje ändring</translation> </message> + <message> + <source>Automatically reload the database when modified externally</source> + <translation>Ladda om databasen automatiskt när den ändras externt</translation> + </message> <message> <source>Minimize when copying to clipboard</source> <translation>Minimera vid kopiering</translation> </message> + <message> + <source>Minimize window at application startup</source> + <translation>Minimera fönstret vid start av programmet</translation> + </message> <message> <source>Use group icon on entry creation</source> <translation>Använd gruppens ikon för nya poster</translation> </message> <message> - <source>Global Auto-Type shortcut</source> - <translation>Globalt auto-skriv kortkommando</translation> + <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> + <translation>Markera inte databasen som ändrad vi icke-data förändringar (t.ex. öppna grupper)</translation> </message> <message> - <source>Language</source> - <translation>Språk</translation> + <source>Hide the Details view</source> + <translation>Dölj detaljvyn</translation> </message> <message> <source>Show a system tray icon</source> @@ -2102,103 +3800,129 @@ give it a unique name to identify and accept it.</source> <source>Hide window to system tray when minimized</source> <translation>Vid minimering, minimera fönstret till systemfältet</translation> </message> - <message> - <source>Load previous databases on startup</source> - <translation type="unfinished"/> - </message> - <message> - <source>Automatically reload the database when modified externally</source> - <translation type="unfinished"/> - </message> <message> <source>Hide window to system tray instead of app exit</source> - <translation type="unfinished"/> + <translation>Vid stängning, minimera fönstret till systemfältet istället</translation> </message> <message> - <source>Minimize window at application startup</source> - <translation type="unfinished"/> + <source>Dark system tray icon</source> + <translation>Mörk ikon för systemfältet</translation> </message> <message> - <source>Basic Settings</source> - <translation type="unfinished"/> - </message> - <message> - <source>Remember last key files and security dongles</source> - <translation type="unfinished"/> - </message> - <message> - <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> - <translation type="unfinished"/> + <source>Language</source> + <translation>Språk</translation> </message> <message> <source>Auto-Type</source> <translation>Auto-skriv</translation> </message> <message> - <source>Use entry title and URL to match windows for global Auto-Type</source> - <translation type="unfinished"/> + <source>Use entry title to match windows for global Auto-Type</source> + <translation>Använd postens titel för att matcha fönster för global auto-skriv</translation> + </message> + <message> + <source>Use entry URL to match windows for global Auto-Type</source> + <translation>Använd postens URL för att matcha fönster för global auto-skriv</translation> </message> <message> <source>Always ask before performing Auto-Type</source> - <translation type="unfinished"/> + <translation>Fråga alltid innan auto-skriv utförs</translation> + </message> + <message> + <source>Global Auto-Type shortcut</source> + <translation>Globalt auto-skriv kortkommando</translation> </message> <message> <source>Auto-Type delay</source> - <translation type="unfinished"/> + <translation>Auto-skriv fördröjning</translation> </message> <message> <source> ms</source> + <comment>Milliseconds</comment> + <translation>ms.</translation> + </message> + <message> + <source>Startup</source> + <translation>Uppstart</translation> + </message> + <message> + <source>File Management</source> + <translation>Filhantering</translation> + </message> + <message> + <source>Safely save database files (may be incompatible with Dropbox, etc)</source> <translation type="unfinished"/> </message> <message> - <source>Start only a single instance of KeePassXC</source> + <source>Backup database file before saving</source> + <translation>Gör databasbackup innan sparning</translation> + </message> + <message> + <source>Entry Management</source> <translation type="unfinished"/> </message> + <message> + <source>General</source> + <translation>Allmän</translation> + </message> </context> <context> <name>SettingsWidgetSecurity</name> + <message> + <source>Timeouts</source> + <translation>Tidsgränser</translation> + </message> <message> <source>Clear clipboard after</source> <translation>Rensa urklipp efter</translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation>sek</translation> </message> <message> <source>Lock databases after inactivity of</source> <translation>Lås databaser efter inaktivitet i</translation> </message> + <message> + <source>Convenience</source> + <translation>Bekvämlighet</translation> + </message> + <message> + <source>Lock databases when session is locked or lid is closed</source> + <translation>Lås databaserna när sessionen låses eller locket stängs</translation> + </message> + <message> + <source>Lock databases after minimizing the window</source> + <translation>Lås databaserna när fönstret minimeras</translation> + </message> + <message> + <source>Don't require password repeat when it is visible</source> + <translation>Behöver inte upprepa lösenord när det är synligt</translation> + </message> <message> <source>Show passwords in cleartext by default</source> <translation>Visa lösenord i klartext som standard</translation> </message> <message> - <source>Lock databases after minimizing the window</source> - <translation type="unfinished"/> + <source>Hide passwords in the preview panel</source> + <translation>Dölj lösenord i förhandsgranskningsrutan</translation> </message> <message> - <source>Don't require password repeat when it is visible</source> - <translation type="unfinished"/> - </message> - <message> - <source>Timeouts</source> - <translation type="unfinished"/> - </message> - <message> - <source>Convenience</source> - <translation type="unfinished"/> - </message> - <message> - <source>Lock databases when session is locked or lid is closed</source> - <translation type="unfinished"/> + <source>Hide entry notes by default</source> + <translation>Dölj posters anteckningar som standard</translation> </message> <message> <source>Privacy</source> - <translation type="unfinished"/> + <translation>Integritet</translation> </message> <message> <source>Use Google as fallback for downloading website icons</source> + <translation>Använd Google som reserv för att ladda ner webbplatsikoner</translation> + </message> + <message> + <source>Re-lock previously locked database after performing Auto-Type</source> <translation type="unfinished"/> </message> </context> @@ -2206,38 +3930,47 @@ give it a unique name to identify and accept it.</source> <name>SetupTotpDialog</name> <message> <source>Setup TOTP</source> - <translation type="unfinished"/> + <translation>Konfigurera TOTP</translation> </message> <message> <source>Key:</source> + <translation>Nyckel:</translation> + </message> + <message> + <source>Default RFC 6238 token settings</source> + <translation>Standard RFC 6238 token inställningar</translation> + </message> + <message> + <source>Steam token settings</source> <translation type="unfinished"/> </message> <message> <source>Use custom settings</source> - <translation type="unfinished"/> + <translation>Använd anpassade inställningar</translation> </message> <message> <source>Note: Change these settings only if you know what you are doing.</source> - <translation type="unfinished"/> + <translation>Obs: Ändra bara dessa inställningar om du vet vad du gör.</translation> </message> <message> <source>Time step:</source> - <translation type="unfinished"/> + <translation>Tidsteg:</translation> </message> <message> <source>8 digits</source> - <translation type="unfinished"/> + <translation>8 siffror</translation> </message> <message> <source>6 digits</source> - <translation type="unfinished"/> + <translation>6 siffror</translation> </message> <message> <source>Code size:</source> - <translation type="unfinished"/> + <translation>Kodstorlek:</translation> </message> <message> <source> sec</source> + <comment>Seconds</comment> <translation>sek</translation> </message> </context> @@ -2245,11 +3978,11 @@ give it a unique name to identify and accept it.</source> <name>TotpDialog</name> <message> <source>Timed Password</source> - <translation type="unfinished"/> + <translation>Tidsinställt Lösenord</translation> </message> <message> <source>000000</source> - <translation type="unfinished"/> + <translation>000000</translation> </message> <message> <source>Copy</source> @@ -2257,11 +3990,11 @@ give it a unique name to identify and accept it.</source> </message> <message> <source>Expires in</source> - <translation type="unfinished"/> + <translation>Går ut om</translation> </message> <message> <source>seconds</source> - <translation type="unfinished"/> + <translation>sekunder</translation> </message> </context> <context> @@ -2273,13 +4006,9 @@ give it a unique name to identify and accept it.</source> </context> <context> <name>WelcomeWidget</name> - <message> - <source>Welcome to KeePassXC</source> - <translation type="unfinished"/> - </message> <message> <source>Start storing your passwords securely in a KeePassXC database</source> - <translation type="unfinished"/> + <translation>Påbörja att spara dina lösenord säkert i en KeePassXC databas</translation> </message> <message> <source>Create new database</source> @@ -2291,7 +4020,7 @@ give it a unique name to identify and accept it.</source> </message> <message> <source>Import from KeePass 1</source> - <translation type="unfinished"/> + <translation>Importera från KeePass 1</translation> </message> <message> <source>Import from CSV</source> @@ -2301,9 +4030,33 @@ give it a unique name to identify and accept it.</source> <source>Recent databases</source> <translation>Senast använda databaser</translation> </message> + <message> + <source>Welcome to KeePassXC %1</source> + <translation>Välkommen till KeePassXC %1</translation> + </message> </context> <context> <name>main</name> + <message> + <source>Remove an entry from the database.</source> + <translation>Ta bort en post från databasen</translation> + </message> + <message> + <source>Path of the database.</source> + <translation>Sökväg till databasen</translation> + </message> + <message> + <source>Path of the entry to remove.</source> + <translation>Sökväg till posten som tas bort</translation> + </message> + <message> + <source>KeePassXC - cross-platform password manager</source> + <translation>KeePassXC - plattformsoberoende lösenordshanterare</translation> + </message> + <message> + <source>filenames of the password databases to open (*.kdbx)</source> + <translation>namnen på lösenordsdatabaserna som öppnas (*.kdbx)</translation> + </message> <message> <source>path to a custom config file</source> <translation>Sökväg till egen konfigurations-fil</translation> @@ -2312,80 +4065,12 @@ give it a unique name to identify and accept it.</source> <source>key file of the database</source> <translation>nyckel-fil för databas</translation> </message> - <message> - <source>KeePassXC - cross-platform password manager</source> - <translation type="unfinished"/> - </message> <message> <source>read password of the database from stdin</source> - <translation type="unfinished"/> + <translation>mottag databaslösenord från stdin</translation> </message> <message> - <source>filenames of the password databases to open (*.kdbx)</source> - <translation type="unfinished"/> - </message> - <message> - <source>Copy a password to the clipboard</source> - <translation type="unfinished"/> - </message> - <message> - <source>Path of the database.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Use a GUI prompt unlocking the database.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Name of the entry to clip.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Extract and print the content of a database.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Path of the database to extract.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Name of the command to execute.</source> - <translation type="unfinished"/> - </message> - <message> - <source>List database entries.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Path of the group to list. Default is /</source> - <translation type="unfinished"/> - </message> - <message> - <source>Print the UUIDs of the entries and groups.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Merge two databases.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Path of the database to merge into.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Path of the database to merge from.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Use the same password for both database files.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Show a password.</source> - <translation type="unfinished"/> - </message> - <message> - <source>Name of the entry to show.</source> + <source>Parent window handle</source> <translation type="unfinished"/> </message> </context> diff --git a/share/translations/keepassx_th.ts b/share/translations/keepassx_th.ts index 9e4df6055..84a7676d8 100644 --- a/share/translations/keepassx_th.ts +++ b/share/translations/keepassx_th.ts @@ -18,10 +18,6 @@ <translation>KeePassXC เผยแพร่ภายใต้เงื่อนไขของสัญญาอนุญาตสาธารณะทั่วไปของกนู (GNU GPL) รุ่น 2 หรือรุ่น 3 (คุณสามารถเลือกได้)</translation> </message> - <message> - <source>Project Maintainers:</source> - <translation>ผู้บำรุงรักษาโครงการ:</translation> - </message> <message> <source>Contributors</source> <translation>ผู้ร่วมสมทบ</translation> @@ -72,6 +68,19 @@ Kernel: %3 %4</source> <source>Enabled extensions:</source> <translation>ส่วนขยายที่เปิดใช้:</translation> </message> + <message> + <source>Project Maintainers:</source> + <translation>ผู้บำรุงรักษาโครงการ:</translation> + </message> + <message> + <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Build Type: %1 +</source> + <translation type="unfinished"/> + </message> </context> <context> <name>AccessControlDialog</name> @@ -150,6 +159,25 @@ Please select whether you want to allow access.</source> <translation>ลำดับมาตรฐาน</translation> </message> </context> +<context> + <name>AutoTypeMatchModel</name> + <message> + <source>Group</source> + <translation>กลุ่ม</translation> + </message> + <message> + <source>Title</source> + <translation>หัวเรื่อง</translation> + </message> + <message> + <source>Username</source> + <translation>ชื่อผู้ใช้</translation> + </message> + <message> + <source>Sequence</source> + <translation>ลำดับ</translation> + </message> +</context> <context> <name>AutoTypeSelectDialog</name> <message> @@ -197,7 +225,7 @@ Please select whether you want to allow access.</source> </message> <message> <source>Enable KeepassXC browser integration</source> - <translation type="unfinished"/> + <translation>เปิดใช้การผสาน KeepassXC กับเบราว์เซอร์</translation> </message> <message> <source>General</source> @@ -205,23 +233,23 @@ Please select whether you want to allow access.</source> </message> <message> <source>Enable integration for these browsers:</source> - <translation type="unfinished"/> + <translation>เปิดใช้การผสานกับเบราว์เซอร์เหล่านี้:</translation> </message> <message> <source>&Google Chrome</source> - <translation type="unfinished"/> + <translation>&Google Chrome</translation> </message> <message> <source>&Firefox</source> - <translation type="unfinished"/> + <translation>&Firefox</translation> </message> <message> <source>&Chromium</source> - <translation type="unfinished"/> + <translation>&Chromium</translation> </message> <message> <source>&Vivaldi</source> - <translation type="unfinished"/> + <translation>&Vivaldi</translation> </message> <message> <source>Show a &notification when credentials are requested</source> @@ -260,11 +288,11 @@ Please select whether you want to allow access.</source> </message> <message> <source>&Disconnect all browsers</source> - <translation type="unfinished"/> + <translation>หยุดการเชื่อมต่อกับทุกเบราว์เซอร์ (&D)</translation> </message> <message> <source>Forget all remembered &permissions</source> - <translation type="unfinished"/> + <translation>ลืมการอนุญาตที่เคยจำไว้ทั้งหมด (&P)</translation> </message> <message> <source>Advanced</source> @@ -325,7 +353,7 @@ Please select whether you want to allow access.</source> <message> <source>Browse...</source> <extracomment>Button for opening file dialog</extracomment> - <translation type="unfinished"/> + <translation>ดู...</translation> </message> <message> <source><b>Warning:</b> The following options can be dangerous!</source> @@ -535,7 +563,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Replace username and password with references</source> - <translation type="unfinished"/> + <translation>แทนที่ชื่อผู้ใช้และรหัสผ่านด้วยการอ้างอิง</translation> </message> <message> <source>Copy history</source> @@ -650,15 +678,15 @@ Please consider generating a new key file.</source> <name>CsvParserModel</name> <message numerus="yes"> <source>%n byte(s), </source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>%n ไบต์, </numerusform></translation> </message> <message numerus="yes"> <source>%n row(s), </source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>%n แถว, </numerusform></translation> </message> <message numerus="yes"> <source>%n column(s)</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>%n คอลัมน์</numerusform></translation> </message> </context> <context> @@ -708,7 +736,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Don't show this warning again</source> - <translation type="unfinished"/> + <translation>ไม่ต้องแสดงคำเตือนนี้อีก</translation> </message> <message> <source>All files</source> @@ -768,7 +796,7 @@ You can now save it.</source> </message> <message> <source>Encryption</source> - <translation type="unfinished"/> + <translation>การเข้ารหัสลับ</translation> </message> <message> <source>Number of rounds too high</source> @@ -787,7 +815,7 @@ If you keep this number, your database may take hours or days (or even longer) t </message> <message> <source>Cancel</source> - <translation type="unfinished"/> + <translation>ยกเลิก</translation> </message> <message> <source>Number of rounds too low</source> @@ -808,12 +836,22 @@ If you keep this number, your database may be too easy to crack!</source> <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> <translation type="unfinished"/> </message> + <message numerus="yes"> + <source> MiB</source> + <comment>Abbreviation for Mebibytes (KDF settings)</comment> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source> thread(s)</source> + <comment>Threads for parallel execution (KDF settings)</comment> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> </context> <context> <name>DatabaseSettingsWidgetEncryption</name> <message> <source>Encryption Algorithm:</source> - <translation type="unfinished"/> + <translation>อัลกอริทึมเข้ารหัสลับ:</translation> </message> <message> <source>AES: 256 Bit (default)</source> @@ -839,24 +877,16 @@ If you keep this number, your database may be too easy to crack!</source> <source>Memory Usage:</source> <translation type="unfinished"/> </message> - <message> - <source> MB</source> - <translation type="unfinished"/> - </message> <message> <source>Parallelism:</source> <translation type="unfinished"/> </message> - <message> - <source> thread</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DatabaseSettingsWidgetGeneral</name> <message> <source>Database Meta Data</source> - <translation type="unfinished"/> + <translation>เมทาดาทาฐานข้อมูล</translation> </message> <message> <source>Database name:</source> @@ -872,7 +902,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>History Settings</source> - <translation type="unfinished"/> + <translation>การตั้งค่าประวัติ</translation> </message> <message> <source>Max. history items:</source> @@ -890,6 +920,14 @@ If you keep this number, your database may be too easy to crack!</source> <source>Use recycle bin</source> <translation>ใช้ถังขยะรีไซเคิล</translation> </message> + <message> + <source>Additional Database Settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable &compression (recommended)</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DatabaseTabWidget</name> @@ -953,7 +991,8 @@ If you keep this number, your database may be too easy to crack!</source> <message> <source>"%1" is in edit mode. Discard changes and close anyway?</source> - <translation type="unfinished"/> + <translation>"%1" อยู่ในระหว่าการแก้ไข +ละทิ้งการเปลี่ยนแปลงทั้งหมดและปิดอยู่ดี?</translation> </message> <message> <source>Save changes?</source> @@ -1008,6 +1047,15 @@ Do you want to save the database before locking it? Otherwise your changes are lost.</source> <translation type="unfinished"/> </message> + <message> + <source>Disable safe saves?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DatabaseWidget</name> @@ -1069,7 +1117,7 @@ Otherwise your changes are lost.</source> </message> <message> <source>Do you really want to delete the group "%1" for good?</source> - <translation type="unfinished"/> + <translation>คุณต้องการจะลบกลุ่ม "%1" ไปตลอดกาลจริงหรือ?</translation> </message> <message> <source>Unable to calculate master key</source> @@ -1120,12 +1168,16 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation type="unfinished"/> </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DetailsWidget</name> <message> <source>Generate TOTP Token</source> - <translation type="unfinished"/> + <translation>สร้างโทเคน TOTP</translation> </message> <message> <source>Close</source> @@ -1145,7 +1197,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Expiration</source> - <translation type="unfinished"/> + <translation>หมดอายุ</translation> </message> <message> <source>Username</source> @@ -1157,11 +1209,11 @@ Do you want to merge your changes?</source> </message> <message> <source>Searching</source> - <translation type="unfinished"/> + <translation>กำลังค้นหา</translation> </message> <message> <source>Attributes</source> - <translation type="unfinished"/> + <translation>คุณสมบัติ</translation> </message> <message> <source>Attachments</source> @@ -1189,19 +1241,19 @@ Do you want to merge your changes?</source> </message> <message> <source>Never</source> - <translation type="unfinished"/> + <translation>ไม่เลย</translation> </message> <message> <source>[PROTECTED]</source> - <translation type="unfinished"/> + <translation>[ถูกป้องกันอยู่]</translation> </message> <message> <source>Disabled</source> - <translation type="unfinished"/> + <translation>ปิดใช้</translation> </message> <message> <source>Enabled</source> - <translation type="unfinished"/> + <translation>เปิดใช้</translation> </message> </context> <context> @@ -1236,23 +1288,23 @@ Do you want to merge your changes?</source> </message> <message> <source>n/a</source> - <translation type="unfinished"/> + <translation>ไม่มีข้อมูล</translation> </message> <message> <source>(encrypted)</source> - <translation type="unfinished"/> + <translation>(เข้ารหัสลับอยู่)</translation> </message> <message> <source>Select private key</source> - <translation type="unfinished"/> + <translation>เลือกกุญแจส่วนตัว</translation> </message> <message> <source>File too large to be a private key</source> - <translation type="unfinished"/> + <translation>แฟ้มใหญ่เกินกว่าจะเป็นกุญแจส่วนตัว</translation> </message> <message> <source>Failed to open private key</source> - <translation type="unfinished"/> + <translation>ผิดพลาดระหว่างการเปิดกุญแจส่วนตัว</translation> </message> <message> <source>Entry history</source> @@ -1272,7 +1324,7 @@ Do you want to merge your changes?</source> </message> <message> <source>New attribute</source> - <translation type="unfinished"/> + <translation>คุณสมบัติใหม่</translation> </message> <message> <source>Confirm Remove</source> @@ -1284,7 +1336,7 @@ Do you want to merge your changes?</source> </message> <message> <source>[PROTECTED]</source> - <translation type="unfinished"/> + <translation>[ถูกป้องกันอยู่]</translation> </message> <message> <source>Press reveal to view or edit</source> @@ -1296,22 +1348,34 @@ Do you want to merge your changes?</source> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>%n สัปดาห์</numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>%n เดือน</numerusform></translation> </message> <message> <source>1 year</source> <translation>1 ปี</translation> </message> + <message> + <source>Apply generated password?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to apply the generated password to this entry?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAdvanced</name> <message> <source>Additional attributes</source> - <translation type="unfinished"/> + <translation>คุณสมบัติเพิ่มเติม</translation> </message> <message> <source>Add</source> @@ -1337,6 +1401,14 @@ Do you want to merge your changes?</source> <source>Attachments</source> <translation>แฟ้มแนบ</translation> </message> + <message> + <source>Foreground Color:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Background Color:</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -1369,11 +1441,7 @@ Do you want to merge your changes?</source> <translation>หัวเรื่องของหน้าต่าง:</translation> </message> <message> - <source>Use default se&quence</source> - <translation type="unfinished"/> - </message> - <message> - <source>Set custo&m sequence:</source> + <source>Use a specific sequence for this association:</source> <translation type="unfinished"/> </message> </context> @@ -1447,7 +1515,7 @@ Do you want to merge your changes?</source> </message> <message> <source> seconds</source> - <translation type="unfinished"/> + <translation>วินาที</translation> </message> <message> <source>Fingerprint</source> @@ -1459,7 +1527,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Public key</source> - <translation type="unfinished"/> + <translation>กุญแจสาธารณะ</translation> </message> <message> <source>Add key to agent when database is opened/unlocked</source> @@ -1467,15 +1535,15 @@ Do you want to merge your changes?</source> </message> <message> <source>Comment</source> - <translation type="unfinished"/> + <translation>ความเห็น</translation> </message> <message> <source>Decrypt</source> - <translation type="unfinished"/> + <translation>ถอดรหัสลับ</translation> </message> <message> <source>n/a</source> - <translation type="unfinished"/> + <translation>ไม่มีข้อมูล</translation> </message> <message> <source>Copy to clipboard</source> @@ -1483,20 +1551,20 @@ Do you want to merge your changes?</source> </message> <message> <source>Private key</source> - <translation type="unfinished"/> + <translation>กุญแจส่วนตัว</translation> </message> <message> <source>External file</source> - <translation type="unfinished"/> + <translation>แฟ้มภายนอก</translation> </message> <message> <source>Browse...</source> <extracomment>Button for opening file dialog</extracomment> - <translation type="unfinished"/> + <translation>ดู...</translation> </message> <message> <source>Attachment</source> - <translation type="unfinished"/> + <translation>แฟ้มแนบ</translation> </message> <message> <source>Add to agent</source> @@ -1654,6 +1722,31 @@ Do you want to merge your changes?</source> <source>Uuid:</source> <translation>Uuid:</translation> </message> + <message> + <source>Plugin Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove</source> + <translation>นำออก</translation> + </message> + <message> + <source>Delete plugin data?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Value</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Entry</name> @@ -1671,7 +1764,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Size</source> - <translation type="unfinished"/> + <translation>ขนาด</translation> </message> </context> <context> @@ -1698,7 +1791,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Select files</source> - <translation type="unfinished"/> + <translation>เลือกแฟ้ม</translation> </message> <message numerus="yes"> <source>Are you sure you want to remove %n attachment(s)?</source> @@ -1710,7 +1803,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Save attachments</source> - <translation type="unfinished"/> + <translation>บันทึกแฟ้มแนบ</translation> </message> <message> <source>Unable to create directory: @@ -1723,27 +1816,31 @@ Do you want to merge your changes?</source> </message> <message> <source>Confirm overwrite</source> - <translation type="unfinished"/> + <translation>ยืนยันการเขียนทับ</translation> </message> <message> <source>Unable to save attachments: %1</source> - <translation type="unfinished"/> + <translation>ไม่สามารถบันทึกแฟ้มแนบ: +%1</translation> </message> <message> <source>Unable to open attachment: %1</source> - <translation type="unfinished"/> + <translation>ไม่สามารถเปิดแฟ้มแนบ: +%1</translation> </message> <message> <source>Unable to open attachments: %1</source> - <translation type="unfinished"/> + <translation>ไม่สามารถเปิดแฟ้มแนบ: +%1</translation> </message> <message> <source>Unable to open files: %1</source> - <translation type="unfinished"/> + <translation>ไม่สามารถเปิดแฟ้ม: +%1</translation> </message> </context> <context> @@ -1795,6 +1892,65 @@ Do you want to merge your changes?</source> <source>URL</source> <translation>URL</translation> </message> + <message> + <source>Never</source> + <translation>ไม่เลย</translation> + </message> + <message> + <source>Password</source> + <translation>รหัสผ่าน</translation> + </message> + <message> + <source>Notes</source> + <translation>บันทึก</translation> + </message> + <message> + <source>Expires</source> + <translation>หมดอายุ</translation> + </message> + <message> + <source>Created</source> + <translation>สร้าง</translation> + </message> + <message> + <source>Modified</source> + <translation type="unfinished"/> + </message> + <message> + <source>Accessed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation>แฟ้มแนบ</translation> + </message> +</context> +<context> + <name>EntryView</name> + <message> + <source>Customize View</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide Usernames</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide Passwords</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fit to window</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fit to contents</source> + <translation type="unfinished"/> + </message> + <message> + <source>Reset to defaults</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Group</name> @@ -1807,7 +1963,7 @@ Do you want to merge your changes?</source> <name>HostInstaller</name> <message> <source>KeePassXC: Cannot save file!</source> - <translation type="unfinished"/> + <translation>KeePassXC: ไม่สามารถบันทึกแฟ้ม!</translation> </message> <message> <source>Cannot save the native messaging script file.</source> @@ -1864,6 +2020,10 @@ Do you want to merge your changes?</source> <source>Ensure that the password contains characters from every group</source> <translation>ทำให้แน่ใจว่ารหัสผ่านมีอักขระจากทุกกลุ่ม</translation> </message> + <message> + <source>Extended ASCII</source> + <translation type="unfinished"/> + </message> </context> <context> <name>KMessageWidget</name> @@ -2618,7 +2778,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>E&mpty recycle bin</source> - <translation type="unfinished"/> + <translation>เทถังรีไซเคิลทิ้ง (&M)</translation> </message> <message> <source>Clear history</source> @@ -2672,6 +2832,12 @@ This is a one-way migration. You won't be able to open the imported databas <source>Please touch the button on your YubiKey!</source> <translation>กรุณาแตะปุ่มบน YubiKey ของคุณ!</translation> </message> + <message> + <source>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OpenSSHKey</name> @@ -2683,10 +2849,6 @@ This is a one-way migration. You won't be able to open the imported databas <source>PEM boundary mismatch</source> <translation type="unfinished"/> </message> - <message> - <source>This is not an OpenSSH key, only modern keys are supported</source> - <translation type="unfinished"/> - </message> <message> <source>Base64 decoding failed</source> <translation type="unfinished"/> @@ -2715,10 +2877,6 @@ This is a one-way migration. You won't be able to open the imported databas <source>No private key payload to decrypt</source> <translation type="unfinished"/> </message> - <message> - <source>Unknown cipher: </source> - <translation type="unfinished"/> - </message> <message> <source>Trying to run KDF without cipher</source> <translation type="unfinished"/> @@ -2731,10 +2889,6 @@ This is a one-way migration. You won't be able to open the imported databas <source>Key derivation failed, key file corrupted?</source> <translation type="unfinished"/> </message> - <message> - <source>Unknown KDF: </source> - <translation type="unfinished"/> - </message> <message> <source>Decryption failed, wrong passphrase?</source> <translation type="unfinished"/> @@ -2743,10 +2897,6 @@ This is a one-way migration. You won't be able to open the imported databas <source>Unexpected EOF while reading public key</source> <translation type="unfinished"/> </message> - <message> - <source>Unknown key type: </source> - <translation type="unfinished"/> - </message> <message> <source>Unexpected EOF while reading private key</source> <translation type="unfinished"/> @@ -2767,6 +2917,26 @@ This is a one-way migration. You won't be able to open the imported databas <source>Unexpected EOF when writing private key</source> <translation type="unfinished"/> </message> + <message> + <source>Unsupported key type: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cipher IV is too short for MD5 kdf</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: %1</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OptionDialog</name> @@ -3049,19 +3219,19 @@ Using default port 19455.</source> </message> <message> <source>Key change was not successful</source> - <translation type="unfinished"/> + <translation>การเปลี่ยนกุญแจไม่สำเร็จ</translation> </message> <message> <source>Encryption key is not recognized</source> - <translation type="unfinished"/> + <translation>ไม่รู้จักกุญแจเข้ารหัสลับ</translation> </message> <message> <source>No saved databases found</source> - <translation type="unfinished"/> + <translation>ไม่มีฐานข้อมูลที่ถูกบันทึกอยู่</translation> </message> <message> <source>Incorrect action</source> - <translation type="unfinished"/> + <translation>การกระทำที่ไม่ถูกต้อง</translation> </message> <message> <source>Empty message received</source> @@ -3069,7 +3239,7 @@ Using default port 19455.</source> </message> <message> <source>No URL provided</source> - <translation type="unfinished"/> + <translation>ไม่มี URL ให้มา</translation> </message> <message> <source>No logins found</source> @@ -3077,7 +3247,7 @@ Using default port 19455.</source> </message> <message> <source>Unknown error</source> - <translation type="unfinished"/> + <translation>ความผิดพลาดที่ไม่รู้จัก</translation> </message> <message> <source>Add a new entry to a database.</source> @@ -3089,7 +3259,7 @@ Using default port 19455.</source> </message> <message> <source>Key file of the database.</source> - <translation type="unfinished"/> + <translation>แฟ้มกุญแจของฐานข้อมูล</translation> </message> <message> <source>path</source> @@ -3101,7 +3271,7 @@ Using default port 19455.</source> </message> <message> <source>username</source> - <translation type="unfinished"/> + <translation>ชื่อผู้ใช้</translation> </message> <message> <source>URL for the entry.</source> @@ -3125,7 +3295,7 @@ Using default port 19455.</source> </message> <message> <source>length</source> - <translation type="unfinished"/> + <translation>ความยาว</translation> </message> <message> <source>Path of the entry to add.</source> @@ -3154,7 +3324,7 @@ Using default port 19455.</source> </message> <message> <source>title</source> - <translation type="unfinished"/> + <translation>หัวเรื่อง</translation> </message> <message> <source>Path of the entry to edit.</source> @@ -3220,7 +3390,7 @@ Available commands: </message> <message> <source>Search term.</source> - <translation type="unfinished"/> + <translation>คำค้น</translation> </message> <message> <source>Merge two databases.</source> @@ -3282,27 +3452,27 @@ Available commands: </message> <message> <source>AES: 256-bit</source> - <translation type="unfinished"/> + <translation>AES: 256 บิต</translation> </message> <message> <source>Twofish: 256-bit</source> - <translation type="unfinished"/> + <translation>Twofish: 256 บิต</translation> </message> <message> <source>ChaCha20: 256-bit</source> - <translation type="unfinished"/> + <translation>ChaCha20: 256 บิต</translation> </message> <message> <source>Argon2 (KDBX 4 – recommended)</source> - <translation type="unfinished"/> + <translation>Argon2 (KDBX 4 – แนะนำ)</translation> </message> <message> <source>AES-KDF (KDBX 4)</source> - <translation type="unfinished"/> + <translation>AES-KDF (KDBX 4)</translation> </message> <message> <source>AES-KDF (KDBX 3.1)</source> - <translation type="unfinished"/> + <translation>AES-KDF (KDBX 3.1)</translation> </message> <message> <source>Group</source> @@ -3326,11 +3496,11 @@ Available commands: </message> <message> <source>Last Modified</source> - <translation type="unfinished"/> + <translation>แก้ไขล่าสุด</translation> </message> <message> <source>Created</source> - <translation type="unfinished"/> + <translation>สร้าง</translation> </message> <message> <source>Legacy Browser Integration</source> @@ -3356,6 +3526,51 @@ Available commands: <source>SSH Agent</source> <translation type="unfinished"/> </message> + <message> + <source>Generate a new random diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Word count for the diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>count</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wordlist for the diceware generator. +[Default: EFF English]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a new random password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length of the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use lowercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use uppercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use numbers in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use special characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use extended ASCII in the generated password.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>QtIOCompressor</name> @@ -3388,7 +3603,7 @@ Available commands: </message> <message> <source>Internal zlib error: </source> - <translation type="unfinished"/> + <translation>ความผิดพลาดภายในของ zlib: </translation> </message> </context> <context> @@ -3411,7 +3626,7 @@ Available commands: </message> <message> <source>Limit search to selected group</source> - <translation type="unfinished"/> + <translation>จำกัดการค้นไว้เฉพาะในกลุ่มที่เลือก</translation> </message> </context> <context> @@ -3572,7 +3787,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Hide the Details view</source> - <translation type="unfinished"/> + <translation>ซ่อนมุมมองละเอียด</translation> </message> <message> <source>Show a system tray icon</source> @@ -3623,6 +3838,30 @@ Please unlock the selected database or choose another one which is unlocked.</so <comment>Milliseconds</comment> <translation>มิลลิวิ</translation> </message> + <message> + <source>Startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>File Management</source> + <translation type="unfinished"/> + </message> + <message> + <source>Safely save database files (may be incompatible with Dropbox, etc)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Backup database file before saving</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry Management</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>ทั่วไป</translation> + </message> </context> <context> <name>SettingsWidgetSecurity</name> @@ -3679,6 +3918,10 @@ Please unlock the selected database or choose another one which is unlocked.</so <source>Use Google as fallback for downloading website icons</source> <translation>ใช้กูเกิลเป็นวิธีสำรองเพื่อดาวน์โหลดไอคอนเว็บไซต์</translation> </message> + <message> + <source>Re-lock previously locked database after performing Auto-Type</source> + <translation type="unfinished"/> + </message> </context> <context> <name>SetupTotpDialog</name> @@ -3760,10 +4003,6 @@ Please unlock the selected database or choose another one which is unlocked.</so </context> <context> <name>WelcomeWidget</name> - <message> - <source>Welcome to KeePassXC</source> - <translation>ยินดีต้อนรับสู่ KeePassXC</translation> - </message> <message> <source>Start storing your passwords securely in a KeePassXC database</source> <translation type="unfinished"/> @@ -3788,6 +4027,10 @@ Please unlock the selected database or choose another one which is unlocked.</so <source>Recent databases</source> <translation>ฐานข้อมูลที่เพิ่งใช้</translation> </message> + <message> + <source>Welcome to KeePassXC %1</source> + <translation type="unfinished"/> + </message> </context> <context> <name>main</name> diff --git a/share/translations/keepassx_tr.ts b/share/translations/keepassx_tr.ts index 7dc4d409f..d8d8febc9 100644 --- a/share/translations/keepassx_tr.ts +++ b/share/translations/keepassx_tr.ts @@ -17,10 +17,6 @@ <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> <translation>KeePassXC GNU Genel Kamu Lisansı (GPL) sürüm 2 veya (isteğinize göre) sürüm 3 şartları altında dağıtılmıştır.</translation> </message> - <message> - <source>Project Maintainers:</source> - <translation>Tasarı Bakımcıları:</translation> - </message> <message> <source>Contributors</source> <translation>Katkıcılar</translation> @@ -71,6 +67,19 @@ MİB mimarisi: %2 <source>Enabled extensions:</source> <translation>Etkin eklentiler:</translation> </message> + <message> + <source>Project Maintainers:</source> + <translation>Tasarı Bakımcıları:</translation> + </message> + <message> + <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Build Type: %1 +</source> + <translation type="unfinished"/> + </message> </context> <context> <name>AccessControlDialog</name> @@ -150,6 +159,25 @@ Lütfen erişime izin vermek istediklerinizi seçin.</translation> <translation>Varsayılan sıra</translation> </message> </context> +<context> + <name>AutoTypeMatchModel</name> + <message> + <source>Group</source> + <translation>Küme</translation> + </message> + <message> + <source>Title</source> + <translation>Başlık</translation> + </message> + <message> + <source>Username</source> + <translation>Kullanıcı adı</translation> + </message> + <message> + <source>Sequence</source> + <translation>Sıra</translation> + </message> +</context> <context> <name>AutoTypeSelectDialog</name> <message> @@ -811,6 +839,16 @@ If you keep this number, your database may be too easy to crack!</source> <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> <translation type="unfinished"/> </message> + <message numerus="yes"> + <source> MiB</source> + <comment>Abbreviation for Mebibytes (KDF settings)</comment> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source> thread(s)</source> + <comment>Threads for parallel execution (KDF settings)</comment> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + </message> </context> <context> <name>DatabaseSettingsWidgetEncryption</name> @@ -842,18 +880,10 @@ If you keep this number, your database may be too easy to crack!</source> <source>Memory Usage:</source> <translation type="unfinished"/> </message> - <message> - <source> MB</source> - <translation type="unfinished"/> - </message> <message> <source>Parallelism:</source> <translation type="unfinished"/> </message> - <message> - <source> thread</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DatabaseSettingsWidgetGeneral</name> @@ -893,6 +923,14 @@ If you keep this number, your database may be too easy to crack!</source> <source>Use recycle bin</source> <translation>Geri dönüşüm kutusunu kullan</translation> </message> + <message> + <source>Additional Database Settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable &compression (recommended)</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DatabaseTabWidget</name> @@ -1015,6 +1053,15 @@ Otherwise your changes are lost.</source> Kilitlemeden önce veri tabanını kaydetmek ister misiniz? Aksi halde değişiklikleriniz kaybolacak.</translation> </message> + <message> + <source>Disable safe saves?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DatabaseWidget</name> @@ -1127,6 +1174,10 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>Geri dönüşüm kutunuzdaki her şeyi kalıcı olarak silmek istediğinize emin misiniz?</translation> </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DetailsWidget</name> @@ -1313,6 +1364,18 @@ Do you want to merge your changes?</source> <source>1 year</source> <translation>1 yıl</translation> </message> + <message> + <source>Apply generated password?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to apply the generated password to this entry?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAdvanced</name> @@ -1344,6 +1407,14 @@ Do you want to merge your changes?</source> <source>Attachments</source> <translation>Ekler</translation> </message> + <message> + <source>Foreground Color:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Background Color:</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -1376,12 +1447,8 @@ Do you want to merge your changes?</source> <translation>Pencere başlığı:</translation> </message> <message> - <source>Use default se&quence</source> - <translation>Öntanımlı &dizilişi kullan</translation> - </message> - <message> - <source>Set custo&m sequence:</source> - <translation>Öze&l diziliş belirle:</translation> + <source>Use a specific sequence for this association:</source> + <translation type="unfinished"/> </message> </context> <context> @@ -1661,6 +1728,31 @@ Do you want to merge your changes?</source> <source>Uuid:</source> <translation>Uuid:</translation> </message> + <message> + <source>Plugin Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove</source> + <translation>Kaldır</translation> + </message> + <message> + <source>Delete plugin data?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Value</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Entry</name> @@ -1802,6 +1894,65 @@ Do you want to merge your changes?</source> <source>URL</source> <translation>URL</translation> </message> + <message> + <source>Never</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password</source> + <translation>Parola</translation> + </message> + <message> + <source>Notes</source> + <translation>Notlar</translation> + </message> + <message> + <source>Expires</source> + <translation>Biter</translation> + </message> + <message> + <source>Created</source> + <translation type="unfinished"/> + </message> + <message> + <source>Modified</source> + <translation type="unfinished"/> + </message> + <message> + <source>Accessed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation>Ekler</translation> + </message> +</context> +<context> + <name>EntryView</name> + <message> + <source>Customize View</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide Usernames</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide Passwords</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fit to window</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fit to contents</source> + <translation type="unfinished"/> + </message> + <message> + <source>Reset to defaults</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Group</name> @@ -1871,6 +2022,10 @@ Do you want to merge your changes?</source> <source>Ensure that the password contains characters from every group</source> <translation>Parolanın her kümeden karakter içerdiğine emin ol</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>Genişletilmiş ASCII</translation> + </message> </context> <context> <name>KMessageWidget</name> @@ -2682,6 +2837,12 @@ Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veri tabanını eski Ke <source>Please touch the button on your YubiKey!</source> <translation>Lütfen YubiKey'inizdeki düğmeye dokunun!</translation> </message> + <message> + <source>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OpenSSHKey</name> @@ -2693,10 +2854,6 @@ Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veri tabanını eski Ke <source>PEM boundary mismatch</source> <translation type="unfinished"/> </message> - <message> - <source>This is not an OpenSSH key, only modern keys are supported</source> - <translation type="unfinished"/> - </message> <message> <source>Base64 decoding failed</source> <translation type="unfinished"/> @@ -2725,10 +2882,6 @@ Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veri tabanını eski Ke <source>No private key payload to decrypt</source> <translation type="unfinished"/> </message> - <message> - <source>Unknown cipher: </source> - <translation type="unfinished"/> - </message> <message> <source>Trying to run KDF without cipher</source> <translation type="unfinished"/> @@ -2741,10 +2894,6 @@ Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veri tabanını eski Ke <source>Key derivation failed, key file corrupted?</source> <translation type="unfinished"/> </message> - <message> - <source>Unknown KDF: </source> - <translation type="unfinished"/> - </message> <message> <source>Decryption failed, wrong passphrase?</source> <translation type="unfinished"/> @@ -2753,10 +2902,6 @@ Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veri tabanını eski Ke <source>Unexpected EOF while reading public key</source> <translation type="unfinished"/> </message> - <message> - <source>Unknown key type: </source> - <translation type="unfinished"/> - </message> <message> <source>Unexpected EOF while reading private key</source> <translation type="unfinished"/> @@ -2777,6 +2922,26 @@ Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veri tabanını eski Ke <source>Unexpected EOF when writing private key</source> <translation type="unfinished"/> </message> + <message> + <source>Unsupported key type: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cipher IV is too short for MD5 kdf</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: %1</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OptionDialog</name> @@ -3293,27 +3458,27 @@ Available commands: </message> <message> <source>AES: 256-bit</source> - <translation type="unfinished"/> + <translation>AES: 256-bit</translation> </message> <message> <source>Twofish: 256-bit</source> - <translation type="unfinished"/> + <translation>Twofish: 256-bit</translation> </message> <message> <source>ChaCha20: 256-bit</source> - <translation type="unfinished"/> + <translation>ChaCha20: 256-bit</translation> </message> <message> <source>Argon2 (KDBX 4 – recommended)</source> - <translation type="unfinished"/> + <translation>Argon2 (KDBX 4 – önerilen)</translation> </message> <message> <source>AES-KDF (KDBX 4)</source> - <translation type="unfinished"/> + <translation>AES-KDF (KDBX 4)</translation> </message> <message> <source>AES-KDF (KDBX 3.1)</source> - <translation type="unfinished"/> + <translation>AES-KDF (KDBX 3.1)</translation> </message> <message> <source>Group</source> @@ -3367,6 +3532,51 @@ Available commands: <source>SSH Agent</source> <translation type="unfinished"/> </message> + <message> + <source>Generate a new random diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Word count for the diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>count</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wordlist for the diceware generator. +[Default: EFF English]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a new random password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length of the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use lowercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use uppercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use numbers in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use special characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use extended ASCII in the generated password.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>QtIOCompressor</name> @@ -3638,6 +3848,30 @@ Lütfen seçilen veri tabanının kilidini kaldırın veya kilitli olmayan birin <comment>Milliseconds</comment> <translation>ms</translation> </message> + <message> + <source>Startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>File Management</source> + <translation type="unfinished"/> + </message> + <message> + <source>Safely save database files (may be incompatible with Dropbox, etc)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Backup database file before saving</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry Management</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>Genel</translation> + </message> </context> <context> <name>SettingsWidgetSecurity</name> @@ -3694,6 +3928,10 @@ Lütfen seçilen veri tabanının kilidini kaldırın veya kilitli olmayan birin <source>Use Google as fallback for downloading website icons</source> <translation>Web site simgelerini indirmek için Google'ı yedek olarak kullan</translation> </message> + <message> + <source>Re-lock previously locked database after performing Auto-Type</source> + <translation type="unfinished"/> + </message> </context> <context> <name>SetupTotpDialog</name> @@ -3775,10 +4013,6 @@ Lütfen seçilen veri tabanının kilidini kaldırın veya kilitli olmayan birin </context> <context> <name>WelcomeWidget</name> - <message> - <source>Welcome to KeePassXC</source> - <translation>KeePassXC'ye hoş geldiniz</translation> - </message> <message> <source>Start storing your passwords securely in a KeePassXC database</source> <translation>Parolalarınızı KeePassXC veri tabanında güvenle depolamaya başlayın</translation> @@ -3803,6 +4037,10 @@ Lütfen seçilen veri tabanının kilidini kaldırın veya kilitli olmayan birin <source>Recent databases</source> <translation>Son veri tabanları</translation> </message> + <message> + <source>Welcome to KeePassXC %1</source> + <translation type="unfinished"/> + </message> </context> <context> <name>main</name> diff --git a/share/translations/keepassx_uk.ts b/share/translations/keepassx_uk.ts index e0d9266f4..fa8b49d09 100644 --- a/share/translations/keepassx_uk.ts +++ b/share/translations/keepassx_uk.ts @@ -17,10 +17,6 @@ <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> <translation>KeePassXC розповсюджується на умовах Загальної публічної ліцензії GNU (GPL) версії 2 або (на ваш вибір) версії 3.</translation> </message> - <message> - <source>Project Maintainers:</source> - <translation>Супровідники проекту: </translation> - </message> <message> <source>Contributors</source> <translation>Спільнота</translation> @@ -39,7 +35,7 @@ </message> <message> <source>Copy to clipboard</source> - <translation>Скопіювати у буфер обміну</translation> + <translation>Скопіювати в кишеню</translation> </message> <message> <source>Version %1 @@ -53,7 +49,7 @@ </message> <message> <source>Distribution: %1</source> - <translation type="unfinished"/> + <translation>Розподіл: %1</translation> </message> <message> <source>Libraries:</source> @@ -71,6 +67,19 @@ Kernel: %3 %4</source> <source>Enabled extensions:</source> <translation>Увімкнені розширення:</translation> </message> + <message> + <source>Project Maintainers:</source> + <translation>Супровідники проекту: </translation> + </message> + <message> + <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Build Type: %1 +</source> + <translation type="unfinished"/> + </message> </context> <context> <name>AccessControlDialog</name> @@ -101,7 +110,7 @@ Please select whether you want to allow access.</source> <name>AgentSettingsWidget</name> <message> <source>Enable SSH Agent (requires restart)</source> - <translation type="unfinished"/> + <translation>Увімкнути посередника SSH (вимагає перезапуск)</translation> </message> </context> <context> @@ -120,19 +129,19 @@ Please select whether you want to allow access.</source> </message> <message> <source>The Syntax of your Auto-Type statement is incorrect!</source> - <translation type="unfinished"/> + <translation>Синтаксис виразу Автозаповнення неправильний!</translation> </message> <message> <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>Ця команда Автозаповнення містить надзвичайно довгу затримку. Ви впевнені, що хочете продовжити?</translation> </message> <message> <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>Ця команда Автозаповнення містить надзвичайно довгі утримання клавіш. Ви впевнені, що хочете продовжити?</translation> </message> <message> <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>Ця команда Автозаповнення містить надзвичайно часто повторювані параметри. Ви впевнені, що хочете продовжити?</translation> </message> </context> <context> @@ -150,6 +159,25 @@ Please select whether you want to allow access.</source> <translation>Типова послідовність</translation> </message> </context> +<context> + <name>AutoTypeMatchModel</name> + <message> + <source>Group</source> + <translation>Група</translation> + </message> + <message> + <source>Title</source> + <translation>Заголовок</translation> + </message> + <message> + <source>Username</source> + <translation>Ім’я користувача</translation> + </message> + <message> + <source>Sequence</source> + <translation>Послідовність</translation> + </message> +</context> <context> <name>AutoTypeSelectDialog</name> <message> @@ -165,7 +193,7 @@ Please select whether you want to allow access.</source> <name>BrowserAccessControlDialog</name> <message> <source>KeePassXC-Browser Confirm Access</source> - <translation type="unfinished"/> + <translation>Підтвердження доступу для переглядача KeePassXC</translation> </message> <message> <source>Remember this decision</source> @@ -194,11 +222,11 @@ Please select whether you want to allow access.</source> </message> <message> <source>This is required for accessing your databases with KeePassXC-Browser</source> - <translation type="unfinished"/> + <translation>Це необхідно для надання переглядачу KeePassXC доступу до Ваших сховищ</translation> </message> <message> <source>Enable KeepassXC browser integration</source> - <translation type="unfinished"/> + <translation>Сполучити KeePassXC з переглядачем</translation> </message> <message> <source>General</source> @@ -206,28 +234,28 @@ Please select whether you want to allow access.</source> </message> <message> <source>Enable integration for these browsers:</source> - <translation type="unfinished"/> + <translation>Сполучити з такими переглядачами:</translation> </message> <message> <source>&Google Chrome</source> - <translation type="unfinished"/> + <translation>&Google Chrome</translation> </message> <message> <source>&Firefox</source> - <translation type="unfinished"/> + <translation>&Firefox</translation> </message> <message> <source>&Chromium</source> - <translation type="unfinished"/> + <translation>&Chromium</translation> </message> <message> <source>&Vivaldi</source> - <translation type="unfinished"/> + <translation>&Vivaldi</translation> </message> <message> <source>Show a &notification when credentials are requested</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Показувати повідомлення, коли надходить запит на реєстраційні дані</translation> </message> <message> <source>Re&quest to unlock the database if it is locked</source> @@ -235,11 +263,11 @@ Please select whether you want to allow access.</source> </message> <message> <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> - <translation type="unfinished"/> + <translation>Показані тільки записи з такою самою схемою (http://, https://, ftp://, …).</translation> </message> <message> <source>&Match URL scheme (e.g., https://...)</source> - <translation type="unfinished"/> + <translation>Узгодити зі схемами URL (напр. https:// …)</translation> </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> @@ -247,25 +275,25 @@ Please select whether you want to allow access.</source> </message> <message> <source>&Return only best-matching credentials</source> - <translation type="unfinished"/> + <translation>Показувати лише найкращі збіги реєстраційних даних</translation> </message> <message> <source>Sort &matching credentials by title</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Сортувати збіжні реєстраційні дані за заголовком</translation> </message> <message> <source>Sort matching credentials by &username</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Сортувати збіжні реєстраційні дані за іменем користувача</translation> </message> <message> <source>&Disconnect all browsers</source> - <translation type="unfinished"/> + <translation>Від'єднати від всіх переглядачів</translation> </message> <message> <source>Forget all remembered &permissions</source> - <translation type="unfinished"/> + <translation>Забути всі збережені дозволи</translation> </message> <message> <source>Advanced</source> @@ -274,12 +302,12 @@ Please select whether you want to allow access.</source> <message> <source>Never &ask before accessing credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Ніколи не запитувати перед читанням реєстраційних даних</translation> </message> <message> <source>Never ask before &updating credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Ніколи не запитувати перед оновленням реєстраційних даних</translation> </message> <message> <source>Only the selected database has to be connected with a client.</source> @@ -288,7 +316,7 @@ Please select whether you want to allow access.</source> <message> <source>Searc&h in all opened databases for matching credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Шукати збіги з реєстраційними даними у всіх відкритих сховищах</translation> </message> <message> <source>Automatically creating or updating string fields is not supported.</source> @@ -300,49 +328,49 @@ Please select whether you want to allow access.</source> </message> <message> <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> - <translation type="unfinished"/> + <translation>Автоматично оновлює шлях до сценаріїв власного обміну повідомленнями для KeePassXC або двійкового посередника KeePassXC під час запуску.</translation> </message> <message> <source>Update &native messaging manifest files at startup</source> - <translation type="unfinished"/> + <translation>Оновлювати файли оголошень для власного обміну повідомленнями під час запуску</translation> </message> <message> <source>Support a proxy application between KeePassXC and browser extension.</source> - <translation type="unfinished"/> + <translation>Підтримувати посередницькі застосунки між KeePassXC та додатками переглядача.</translation> </message> <message> <source>Use a &proxy application between KeePassXC and browser extension</source> - <translation type="unfinished"/> + <translation>Використовувати посередницький застосунок між KeePassXC та додатком переглядача</translation> </message> <message> <source>Use a custom proxy location if you installed a proxy manually.</source> - <translation type="unfinished"/> + <translation>Використовувати власне розташування посередника, якщо Ви встановили посередника вручну.</translation> </message> <message> <source>Use a &custom proxy location</source> <comment>Meant is the proxy for KeePassXC-Browser</comment> - <translation type="unfinished"/> + <translation>Використовувати власне розташування посередника</translation> </message> <message> <source>Browse...</source> <extracomment>Button for opening file dialog</extracomment> - <translation type="unfinished"/> + <translation>Переглянути...</translation> </message> <message> <source><b>Warning:</b> The following options can be dangerous!</source> - <translation type="unfinished"/> + <translation><b>Попередження:</b> ці параметри можуть бути небезпечними!</translation> </message> <message> <source>Executable Files (*.exe);;All Files (*.*)</source> - <translation type="unfinished"/> + <translation>Виконавчі файли (*.exe);;Всі файли (*.*)</translation> </message> <message> <source>Executable Files (*)</source> - <translation type="unfinished"/> + <translation>Виконавчі файли (*)</translation> </message> <message> <source>Select custom proxy location</source> - <translation type="unfinished"/> + <translation>Вибрати власне розташування посередника</translation> </message> </context> <context> @@ -356,11 +384,14 @@ Please select whether you want to allow access.</source> If you would like to allow it access to your KeePassXC database, give it a unique name to identify and accept it.</source> - <translation type="unfinished"/> + <translation>Ви одержали запит на прив'язку вказаного ключа. + +Якщо Ви бажаєте надати доступ до Вашого сховища KeePassXC, +вкажіть унікальну назву та підтвердьте прив'язку.</translation> </message> <message> <source>Save and allow access</source> - <translation type="unfinished"/> + <translation>Зберегти і дозволити доступ</translation> </message> <message> <source>KeePassXC: Overwrite existing key?</source> @@ -369,7 +400,8 @@ give it a unique name to identify and accept it.</source> <message> <source>A shared encryption key with the name "%1" already exists. Do you want to overwrite it?</source> - <translation type="unfinished"/> + <translation>Спільний ключ шифрування з назвою «%1» вже існує. +Перезаписати його?</translation> </message> <message> <source>KeePassXC: Update Entry</source> @@ -395,7 +427,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>The active database does not contain a settings entry.</source> - <translation type="unfinished"/> + <translation>Поточне сховище не містить запису налаштувань.</translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -403,7 +435,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>No shared encryption keys found in KeePassXC Settings.</source> - <translation type="unfinished"/> + <translation>Не знайдено спільних ключів шифрування у налаштуваннях KeePassXC.</translation> </message> <message> <source>KeePassXC: Removed keys from database</source> @@ -411,11 +443,11 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message numerus="yes"> <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Успішно видалив %n шифрувальний ключ з налаштувань KeePassXC.</numerusform><numerusform>Успішно видалив %n шифрувальних ключі з налаштувань KeePassXC.</numerusform><numerusform>Успішно видалив %n шифрувальних ключів з налаштувань KeePassXC.</numerusform></translation> </message> <message> <source>Removing stored permissions…</source> - <translation type="unfinished"/> + <translation>Видалення збережених привілеїв...</translation> </message> <message> <source>Abort</source> @@ -427,7 +459,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message numerus="yes"> <source>Successfully removed permissions from %n entry(s).</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Успішно видалив привілеї для %n запису.</numerusform><numerusform>Успішно видалив привілеї для %n записів.</numerusform><numerusform>Успішно видалив привілеї для %n записів.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -435,7 +467,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>The active database does not contain an entry with permissions.</source> - <translation>Поточне сховище не містить записів з привілеями…</translation> + <translation>Поточне сховище не містить записів з привілеями.</translation> </message> </context> <context> @@ -512,14 +544,17 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Legacy key file format</source> - <translation type="unfinished"/> + <translation>Застарілий формат файла-ключа</translation> </message> <message> <source>You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>Ви використовуєте застарілий формат файла-ключа, підтримку якого +може бути скасовано у майбутньому. + +Бажано створити новий файл-ключ.</translation> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -653,15 +688,15 @@ Please consider generating a new key file.</source> <name>CsvParserModel</name> <message numerus="yes"> <source>%n byte(s), </source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n байт, </numerusform><numerusform>%n байти, </numerusform><numerusform>%n байтів, </numerusform></translation> </message> <message numerus="yes"> <source>%n row(s), </source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n рядок, </numerusform><numerusform>%n рядка, </numerusform><numerusform>%n рядків, </numerusform></translation> </message> <message numerus="yes"> <source>%n column(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n колонка</numerusform><numerusform>%n колонки</numerusform><numerusform>%n колонок</numerusform></translation> </message> </context> <context> @@ -700,18 +735,21 @@ Please consider generating a new key file.</source> </message> <message> <source>Legacy key file format</source> - <translation type="unfinished"/> + <translation>Застарілий формат файла-ключа</translation> </message> <message> <source>You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>Ви використовуєте застарілий формат файла-ключа, підтримку якого +може бути скасовано у майбутньому. + +Бажано створити новий файл-ключ.</translation> </message> <message> <source>Don't show this warning again</source> - <translation type="unfinished"/> + <translation>Більше не показувати це попередження</translation> </message> <message> <source>All files</source> @@ -771,52 +809,66 @@ You can now save it.</source> </message> <message> <source>Encryption</source> - <translation type="unfinished"/> + <translation>Шифрування</translation> </message> <message> <source>Number of rounds too high</source> <comment>Key transformation rounds</comment> - <translation type="unfinished"/> + <translation>Кількість циклів занадто висока</translation> </message> <message> <source>You are using a very high number of key transform rounds with Argon2. If you keep this number, your database may take hours or days (or even longer) to open!</source> - <translation type="unfinished"/> + <translation>Ви використовуєте занадто багато циклів перетворення для ключа у форматі Argon2. + +Якщо Ви залишите таку кількість циклів, відкриття Вашого сховища може тривати кілька годин або днів (чи навіть довше)!</translation> </message> <message> <source>Understood, keep number</source> - <translation type="unfinished"/> + <translation>Зрозуміло, зберігайте число</translation> </message> <message> <source>Cancel</source> - <translation type="unfinished"/> + <translation>Скасувати</translation> </message> <message> <source>Number of rounds too low</source> <comment>Key transformation rounds</comment> - <translation type="unfinished"/> + <translation>Кількість циклів занадто низька</translation> </message> <message> <source>You are using a very low number of key transform rounds with AES-KDF. If you keep this number, your database may be too easy to crack!</source> - <translation type="unfinished"/> + <translation>Ви використовуєте занадто мало циклів перетворення для ключа у форматі AES-KDF. + +Якщо Ви залишите таку кількість циклів, Ваше сховище буде легко зламати.</translation> </message> <message> <source>KDF unchanged</source> - <translation type="unfinished"/> + <translation>ФОК не змінено</translation> </message> <message> <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> - <translation type="unfinished"/> + <translation>Спроба перетворити ключ згідно з новими налаштуваннями ФОК зазнала невдачі; ФОК залишилась без змін</translation> + </message> + <message numerus="yes"> + <source> MiB</source> + <comment>Abbreviation for Mebibytes (KDF settings)</comment> + <translation><numerusform>МіБ</numerusform><numerusform>МіБ</numerusform><numerusform>МіБ</numerusform></translation> + </message> + <message numerus="yes"> + <source> thread(s)</source> + <comment>Threads for parallel execution (KDF settings)</comment> + <translation><numerusform>потік</numerusform><numerusform>потоки</numerusform><numerusform>потоків</numerusform></translation> </message> </context> <context> <name>DatabaseSettingsWidgetEncryption</name> <message> <source>Encryption Algorithm:</source> - <translation type="unfinished"/> + <translation>Алгоритм шифрування:</translation> </message> <message> <source>AES: 256 Bit (default)</source> @@ -828,38 +880,30 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Key Derivation Function:</source> - <translation type="unfinished"/> + <translation>Функція обчислення ключа:</translation> </message> <message> <source>Transform rounds:</source> - <translation>Раундів перетворень:</translation> + <translation>Циклів перетворення:</translation> </message> <message> <source>Benchmark 1-second delay</source> - <translation type="unfinished"/> + <translation>Оцінити секундну затримку еталонним тестом</translation> </message> <message> <source>Memory Usage:</source> - <translation type="unfinished"/> - </message> - <message> - <source> MB</source> - <translation type="unfinished"/> + <translation>Використана пам'ять:</translation> </message> <message> <source>Parallelism:</source> - <translation type="unfinished"/> - </message> - <message> - <source> thread</source> - <translation type="unfinished"/> + <translation>Паралельність:</translation> </message> </context> <context> <name>DatabaseSettingsWidgetGeneral</name> <message> <source>Database Meta Data</source> - <translation type="unfinished"/> + <translation>Метадані сховища</translation> </message> <message> <source>Database name:</source> @@ -875,7 +919,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>History Settings</source> - <translation type="unfinished"/> + <translation>Налаштування журналу</translation> </message> <message> <source>Max. history items:</source> @@ -893,6 +937,14 @@ If you keep this number, your database may be too easy to crack!</source> <source>Use recycle bin</source> <translation>Використовувати смітник</translation> </message> + <message> + <source>Additional Database Settings</source> + <translation>Додаткові налаштування сховища</translation> + </message> + <message> + <source>Enable &compression (recommended)</source> + <translation>Увімкнути стиснення (рекомендовано)</translation> + </message> </context> <context> <name>DatabaseTabWidget</name> @@ -1015,6 +1067,16 @@ Otherwise your changes are lost.</source> Ви хочете зберегти його перед блокуванням? Інакше внесені зміни буде втрачено.</translation> </message> + <message> + <source>Disable safe saves?</source> + <translation>Вимкнути безпечне збереження?</translation> + </message> + <message> + <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</source> + <translation>KeePassXC не зміг зберегти сховище кілька разів поспіль. Швидше за все це сталося тому, що служба узгодження файлів блокує файл для запису. +Вимкнути безпечне збереження і спробувати знов?</translation> + </message> </context> <context> <name>DatabaseWidget</name> @@ -1056,7 +1118,7 @@ Otherwise your changes are lost.</source> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Ви дійсно хочете перемістити %n запис у кошик?</numerusform><numerusform>Ви дійсно хочете перемістити %n записи у кошик?</numerusform><numerusform>Ви дійсно хочете перемістити %n записів у кошик?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1100,7 +1162,7 @@ Otherwise your changes are lost.</source> </message> <message> <source>File has changed</source> - <translation type="unfinished"/> + <translation>Файл був змінений</translation> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -1113,7 +1175,8 @@ Otherwise your changes are lost.</source> <message> <source>The database file has changed and you have unsaved changes. Do you want to merge your changes?</source> - <translation type="unfinished"/> + <translation>Файл сховища було змінено, а Ви маєте незбережені зміни. +Об‘єднати ці зміни?</translation> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -1127,12 +1190,16 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>Ви дійсно бажаєте остаточно видалити все зі смітника?</translation> </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DetailsWidget</name> <message> <source>Generate TOTP Token</source> - <translation type="unfinished"/> + <translation>Створити позначку ТОГ</translation> </message> <message> <source>Close</source> @@ -1152,7 +1219,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Expiration</source> - <translation type="unfinished"/> + <translation>Термін чинності</translation> </message> <message> <source>Username</source> @@ -1160,15 +1227,15 @@ Do you want to merge your changes?</source> </message> <message> <source>Autotype</source> - <translation type="unfinished"/> + <translation>Автозаповнення</translation> </message> <message> <source>Searching</source> - <translation type="unfinished"/> + <translation>Шукаю</translation> </message> <message> <source>Attributes</source> - <translation type="unfinished"/> + <translation>Атрибути</translation> </message> <message> <source>Attachments</source> @@ -1196,19 +1263,19 @@ Do you want to merge your changes?</source> </message> <message> <source>Never</source> - <translation type="unfinished"/> + <translation>Ніколи</translation> </message> <message> <source>[PROTECTED]</source> - <translation type="unfinished"/> + <translation>[ЗАХИЩЕНО]</translation> </message> <message> <source>Disabled</source> - <translation type="unfinished"/> + <translation>Вимкнено</translation> </message> <message> <source>Enabled</source> - <translation type="unfinished"/> + <translation>Увімкнено</translation> </message> </context> <context> @@ -1239,27 +1306,27 @@ Do you want to merge your changes?</source> </message> <message> <source>SSH Agent</source> - <translation type="unfinished"/> + <translation>Посередник SSH</translation> </message> <message> <source>n/a</source> - <translation type="unfinished"/> + <translation>n/a</translation> </message> <message> <source>(encrypted)</source> - <translation type="unfinished"/> + <translation>(зашифровано)</translation> </message> <message> <source>Select private key</source> - <translation type="unfinished"/> + <translation>Вибрати таємний ключ</translation> </message> <message> <source>File too large to be a private key</source> - <translation type="unfinished"/> + <translation>Файл занадто великий для таємного ключа</translation> </message> <message> <source>Failed to open private key</source> - <translation type="unfinished"/> + <translation>Відкриття таємного ключа зазнало невдачі</translation> </message> <message> <source>Entry history</source> @@ -1291,11 +1358,11 @@ Do you want to merge your changes?</source> </message> <message> <source>[PROTECTED]</source> - <translation type="unfinished"/> + <translation>[ЗАХИЩЕНО]</translation> </message> <message> <source>Press reveal to view or edit</source> - <translation type="unfinished"/> + <translation>Натисніть «показати» для перегляду або зміни</translation> </message> <message> <source>Tomorrow</source> @@ -1303,16 +1370,28 @@ Do you want to merge your changes?</source> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n тиждень</numerusform><numerusform>%n тижня</numerusform><numerusform>%n тижнів</numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n місяць</numerusform><numerusform>%n місяця</numerusform><numerusform>%n місяців</numerusform></translation> </message> <message> <source>1 year</source> <translation>1 рік</translation> </message> + <message> + <source>Apply generated password?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to apply the generated password to this entry?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAdvanced</name> @@ -1344,6 +1423,14 @@ Do you want to merge your changes?</source> <source>Attachments</source> <translation>Вкладення</translation> </message> + <message> + <source>Foreground Color:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Background Color:</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -1376,12 +1463,8 @@ Do you want to merge your changes?</source> <translation>Заголовок вікна:</translation> </message> <message> - <source>Use default se&quence</source> - <translation>Використати типову послідовність</translation> - </message> - <message> - <source>Set custo&m sequence:</source> - <translation>Установити власну послідовність:</translation> + <source>Use a specific sequence for this association:</source> + <translation type="unfinished"/> </message> </context> <context> @@ -1431,7 +1514,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Toggle the checkbox to reveal the notes section.</source> - <translation type="unfinished"/> + <translation>Натисніть перемикач, щоб показати розділ нотаток</translation> </message> <message> <source>Username:</source> @@ -1446,76 +1529,76 @@ Do you want to merge your changes?</source> <name>EditEntryWidgetSSHAgent</name> <message> <source>Form</source> - <translation type="unfinished"/> + <translation>Форма</translation> </message> <message> <source>Remove key from agent after</source> - <translation type="unfinished"/> + <translation>Видаляти ключ з в'язки посередника після</translation> </message> <message> <source> seconds</source> - <translation type="unfinished"/> + <translation>секунд</translation> </message> <message> <source>Fingerprint</source> - <translation type="unfinished"/> + <translation>Відбиток</translation> </message> <message> <source>Remove key from agent when database is closed/locked</source> - <translation type="unfinished"/> + <translation>Видаляти ключ з в'язки посередника під час блокування або закриття сховища</translation> </message> <message> <source>Public key</source> - <translation type="unfinished"/> + <translation>Відкритий ключ</translation> </message> <message> <source>Add key to agent when database is opened/unlocked</source> - <translation type="unfinished"/> + <translation>Надавати ключ посередникові під час відкриття або розблокування сховища</translation> </message> <message> <source>Comment</source> - <translation type="unfinished"/> + <translation>Коментар</translation> </message> <message> <source>Decrypt</source> - <translation type="unfinished"/> + <translation>Розшифрувати</translation> </message> <message> <source>n/a</source> - <translation type="unfinished"/> + <translation>n/a</translation> </message> <message> <source>Copy to clipboard</source> - <translation>Скопіювати у буфер обміну</translation> + <translation>Скопіювати в кишеню</translation> </message> <message> <source>Private key</source> - <translation type="unfinished"/> + <translation>Таємний ключ</translation> </message> <message> <source>External file</source> - <translation type="unfinished"/> + <translation>Зовнішній файл</translation> </message> <message> <source>Browse...</source> <extracomment>Button for opening file dialog</extracomment> - <translation type="unfinished"/> + <translation>Переглянути...</translation> </message> <message> <source>Attachment</source> - <translation type="unfinished"/> + <translation>Вкладення</translation> </message> <message> <source>Add to agent</source> - <translation type="unfinished"/> + <translation>Додати до в'язки посередника</translation> </message> <message> <source>Remove from agent</source> - <translation type="unfinished"/> + <translation>Видалити з в'язкі посередника</translation> </message> <message> <source>Require user confirmation when this key is used</source> - <translation type="unfinished"/> + <translation>Запрошувати підтвердження для використання цього ключа</translation> </message> </context> <context> @@ -1624,7 +1707,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Select Image</source> - <translation>Вибір зображення</translation> + <translation>Вибрати зображення</translation> </message> <message> <source>Can't read icon</source> @@ -1632,7 +1715,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Custom icon already exists</source> - <translation type="unfinished"/> + <translation>Свій значок вже існує</translation> </message> <message> <source>Confirm Delete</source> @@ -1661,6 +1744,31 @@ Do you want to merge your changes?</source> <source>Uuid:</source> <translation>Uuid:</translation> </message> + <message> + <source>Plugin Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove</source> + <translation>Видалити</translation> + </message> + <message> + <source>Delete plugin data?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Value</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Entry</name> @@ -1678,14 +1786,14 @@ Do you want to merge your changes?</source> </message> <message> <source>Size</source> - <translation type="unfinished"/> + <translation>Розмір</translation> </message> </context> <context> <name>EntryAttachmentsWidget</name> <message> <source>Form</source> - <translation type="unfinished"/> + <translation>Форма</translation> </message> <message> <source>Add</source> @@ -1705,11 +1813,11 @@ Do you want to merge your changes?</source> </message> <message> <source>Select files</source> - <translation type="unfinished"/> + <translation>Вибрати файли</translation> </message> <message numerus="yes"> <source>Are you sure you want to remove %n attachment(s)?</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Ви дійсно бажаєте видалити %n вкладення?</numerusform><numerusform>Ви дійсно бажаєте видалити %n вкладення?</numerusform><numerusform>Ви дійсно бажаєте видалити %n вкладень?</numerusform></translation> </message> <message> <source>Confirm Remove</source> @@ -1717,40 +1825,45 @@ Do you want to merge your changes?</source> </message> <message> <source>Save attachments</source> - <translation type="unfinished"/> + <translation>Зберегти вкладення</translation> </message> <message> <source>Unable to create directory: %1</source> - <translation type="unfinished"/> + <translation>Неможливо створити директорію: +%1</translation> </message> <message> <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> - <translation type="unfinished"/> + <translation>Ви дійсно бажаєте перезаписати наявний файл «%1» цим вкладенням?</translation> </message> <message> <source>Confirm overwrite</source> - <translation type="unfinished"/> + <translation>Схваліть перезапис</translation> </message> <message> <source>Unable to save attachments: %1</source> - <translation type="unfinished"/> + <translation>Неможливо зберегти вкладення: +%1</translation> </message> <message> <source>Unable to open attachment: %1</source> - <translation type="unfinished"/> + <translation>Неможливо відкрити вкладення: +%1</translation> </message> <message> <source>Unable to open attachments: %1</source> - <translation type="unfinished"/> + <translation>Неможливо відкрити вкладення: +%1</translation> </message> <message> <source>Unable to open files: %1</source> - <translation type="unfinished"/> + <translation>Неможливо відкрити файли: +%1</translation> </message> </context> <context> @@ -1802,6 +1915,65 @@ Do you want to merge your changes?</source> <source>URL</source> <translation>URL</translation> </message> + <message> + <source>Never</source> + <translation>Ніколи</translation> + </message> + <message> + <source>Password</source> + <translation>Гасло</translation> + </message> + <message> + <source>Notes</source> + <translation>Примітки</translation> + </message> + <message> + <source>Expires</source> + <translation>Закінчується</translation> + </message> + <message> + <source>Created</source> + <translation>Створено</translation> + </message> + <message> + <source>Modified</source> + <translation>Змінено</translation> + </message> + <message> + <source>Accessed</source> + <translation>Доступ</translation> + </message> + <message> + <source>Attachments</source> + <translation>Вкладення</translation> + </message> +</context> +<context> + <name>EntryView</name> + <message> + <source>Customize View</source> + <translation>Налаштувати перегляд</translation> + </message> + <message> + <source>Hide Usernames</source> + <translation>Ховати імена користувача</translation> + </message> + <message> + <source>Hide Passwords</source> + <translation>Ховати гасла</translation> + </message> + <message> + <source>Fit to window</source> + <translation>Припасувати до вікна</translation> + </message> + <message> + <source>Fit to contents</source> + <translation>Припасувати до вмісту</translation> + </message> + <message> + <source>Reset to defaults</source> + <translation>Повернути до типових налаштувань</translation> + </message> </context> <context> <name>Group</name> @@ -1814,11 +1986,11 @@ Do you want to merge your changes?</source> <name>HostInstaller</name> <message> <source>KeePassXC: Cannot save file!</source> - <translation type="unfinished"/> + <translation>KeePassXC: неможливо зберегти файл!</translation> </message> <message> <source>Cannot save the native messaging script file.</source> - <translation type="unfinished"/> + <translation>Неможливо зберегти файл сценарію для власного обміну повідомленнями.</translation> </message> </context> <context> @@ -1871,6 +2043,10 @@ Do you want to merge your changes?</source> <source>Ensure that the password contains characters from every group</source> <translation>Забезпечити використання символів усіх видів у гаслі</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>Розширені ASCII</translation> + </message> </context> <context> <name>KMessageWidget</name> @@ -1913,7 +2089,7 @@ Do you want to merge your changes?</source> <name>Kdbx4Reader</name> <message> <source>missing database headers</source> - <translation type="unfinished"/> + <translation>відсутні заголовки сховища</translation> </message> <message> <source>Unable to calculate master key</source> @@ -1921,127 +2097,127 @@ Do you want to merge your changes?</source> </message> <message> <source>Invalid header checksum size</source> - <translation type="unfinished"/> + <translation>Хибний розмір контрольної суми заголовка</translation> </message> <message> <source>Header SHA256 mismatch</source> - <translation type="unfinished"/> + <translation>Невідповідність заголовку SHA256</translation> </message> <message> <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> - <translation type="unfinished"/> + <translation>Хибний ключ або пошкоджене сховище. (невідповідність HMAC)</translation> </message> <message> <source>Unknown cipher</source> - <translation type="unfinished"/> + <translation>Невідомий шифр</translation> </message> <message> <source>Invalid header id size</source> - <translation type="unfinished"/> + <translation>Хибний розмір ідентифікатора заголовка</translation> </message> <message> <source>Invalid header field length</source> - <translation type="unfinished"/> + <translation>Хибна довжина поля заголовка</translation> </message> <message> <source>Invalid header data length</source> - <translation type="unfinished"/> + <translation>Хибна довжина даних заголовка</translation> </message> <message> <source>Failed to open buffer for KDF parameters in header</source> - <translation type="unfinished"/> + <translation>Не вдалося відкрити буфер для параметрів ФОК у заголовку</translation> </message> <message> <source>Unsupported key derivation function (KDF) or invalid parameters</source> - <translation type="unfinished"/> + <translation>Непідтримувана функція обчислення ключа (ФОК) або хибні параметри</translation> </message> <message> <source>Legacy header fields found in KDBX4 file.</source> - <translation type="unfinished"/> + <translation>Знайдені застарілі поля заголовка у файлі KDBX4.</translation> </message> <message> <source>Invalid inner header id size</source> - <translation type="unfinished"/> + <translation>Хибний розмір ідентифікатора внутрішнього заголовка</translation> </message> <message> <source>Invalid inner header field length</source> - <translation type="unfinished"/> + <translation>Хибна довжина поля внутрішнього заголовка</translation> </message> <message> <source>Invalid inner header binary size</source> - <translation type="unfinished"/> + <translation>Хибний розмір двійкового внутрішнього заголовка</translation> </message> <message> <source>Unsupported KeePass variant map version.</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Непідтримувана версія структури метаданих KeePass.</translation> </message> <message> <source>Invalid variant map entry name length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Хибна довжина назви запису в структурі метаданих</translation> </message> <message> <source>Invalid variant map entry name data</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Хибна назва запису в структурі метаданих</translation> </message> <message> <source>Invalid variant map entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Хибна довжина запису в структурі метаданих</translation> </message> <message> <source>Invalid variant map entry value data</source> <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Хибний запису в структурі метаданих</translation> </message> <message> <source>Invalid variant map Bool entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Хибна довжина логічного запису в структурі метаданих</translation> </message> <message> <source>Invalid variant map Int32 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Хибна довжина Int32 запису в структурі метаданих</translation> </message> <message> <source>Invalid variant map UInt32 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Хибна довжина UInt32 запису в структурі метаданих</translation> </message> <message> <source>Invalid variant map Int64 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Хибна довжина Int64 запису в структурі метаданих</translation> </message> <message> <source>Invalid variant map UInt64 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Хибна довжина UInt64 запису в структурі метаданих</translation> </message> <message> <source>Invalid variant map entry type</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Хибний тип запису в структурі метаданих</translation> </message> <message> <source>Invalid variant map field type size</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Хибний розмір типу поля в структурі метаданих</translation> </message> </context> <context> <name>Kdbx4Writer</name> <message> <source>Invalid symmetric cipher algorithm.</source> - <translation type="unfinished"/> + <translation>Хибний алгоритм симетричного шифру.</translation> </message> <message> <source>Invalid symmetric cipher IV size.</source> <comment>IV = Initialization Vector for symmetric cipher</comment> - <translation type="unfinished"/> + <translation>Хибний розмір IV симетричного шифру.</translation> </message> <message> <source>Unable to calculate master key</source> @@ -2050,50 +2226,50 @@ Do you want to merge your changes?</source> <message> <source>Failed to serialize KDF parameters variant map</source> <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Переведення у послідовний формат структури параметрів ФОК зазнало невдачі</translation> </message> </context> <context> <name>KdbxReader</name> <message> <source>Invalid cipher uuid length</source> - <translation type="unfinished"/> + <translation>Хибна довжина uuid шифру</translation> </message> <message> <source>Unsupported cipher</source> - <translation type="unfinished"/> + <translation>Непідтримуваний шифр</translation> </message> <message> <source>Invalid compression flags length</source> - <translation type="unfinished"/> + <translation>Хибна довжина прапорців стиснення</translation> </message> <message> <source>Unsupported compression algorithm</source> - <translation type="unfinished"/> + <translation>Непідтримуваний алгоритм стиснення</translation> </message> <message> <source>Invalid master seed size</source> - <translation type="unfinished"/> + <translation>Хибний розмір головного початкового числа</translation> </message> <message> <source>Invalid transform seed size</source> - <translation type="unfinished"/> + <translation>Хибний розмір початкового числа перетворення</translation> </message> <message> <source>Invalid transform rounds size</source> - <translation type="unfinished"/> + <translation>Хибний розмір циклу перетворення</translation> </message> <message> <source>Invalid start bytes size</source> - <translation type="unfinished"/> + <translation>Хибний розмір початкових байтів</translation> </message> <message> <source>Invalid random stream id size</source> - <translation type="unfinished"/> + <translation>Хибний розмір ідентифікатора випадкового потоку</translation> </message> <message> <source>Invalid inner random stream cipher</source> - <translation type="unfinished"/> + <translation>Хибний шифр внутрішнього випадкового потоку</translation> </message> <message> <source>Not a KeePass database.</source> @@ -2111,131 +2287,131 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Unsupported KeePass 2 database version.</source> - <translation type="unfinished"/> + <translation>Непідтримувана версія сховища KeePass 2.</translation> </message> </context> <context> <name>KdbxXmlReader</name> <message> <source>XML parsing failure: %1</source> - <translation type="unfinished"/> + <translation>Помилка синтаксичного аналізу XML: %1</translation> </message> <message> <source>No root group</source> - <translation type="unfinished"/> + <translation>Коренева група відсутня</translation> </message> <message> <source>Missing icon uuid or data</source> - <translation type="unfinished"/> + <translation>Бракує uuid або даних значка</translation> </message> <message> <source>Missing custom data key or value</source> - <translation type="unfinished"/> + <translation>Бракує ключа або значення для власних даних</translation> </message> <message> <source>Multiple group elements</source> - <translation type="unfinished"/> + <translation>Декілька елементів групи</translation> </message> <message> <source>Null group uuid</source> - <translation type="unfinished"/> + <translation>Порожній uuid групи</translation> </message> <message> <source>Invalid group icon number</source> - <translation type="unfinished"/> + <translation>Хибний номер значка групи</translation> </message> <message> <source>Invalid EnableAutoType value</source> - <translation type="unfinished"/> + <translation>Хибне значення параметру ввімкнення автозаповнення</translation> </message> <message> <source>Invalid EnableSearching value</source> - <translation type="unfinished"/> + <translation>Хибне значення параметру ввімкнення пошуку</translation> </message> <message> <source>No group uuid found</source> - <translation type="unfinished"/> + <translation>Uuid групи не знайдено</translation> </message> <message> <source>Null DeleteObject uuid</source> - <translation type="unfinished"/> + <translation>Порожній DeleteObject uuid</translation> </message> <message> <source>Missing DeletedObject uuid or time</source> - <translation type="unfinished"/> + <translation>Бракує часу або uuid для DeleteObject</translation> </message> <message> <source>Null entry uuid</source> - <translation type="unfinished"/> + <translation>Порожній uuid запису</translation> </message> <message> <source>Invalid entry icon number</source> - <translation type="unfinished"/> + <translation>Хибний номер значка запису</translation> </message> <message> <source>History element in history entry</source> - <translation type="unfinished"/> + <translation>Журнальний елемент у запису журналу</translation> </message> <message> <source>No entry uuid found</source> - <translation type="unfinished"/> + <translation>Uuid запису не знайдено</translation> </message> <message> <source>History element with different uuid</source> - <translation type="unfinished"/> + <translation>Елемент журналу з відмінним uuid</translation> </message> <message> <source>Unable to decrypt entry string</source> - <translation type="unfinished"/> + <translation>Неможливо розшифрувати текст запису</translation> </message> <message> <source>Duplicate custom attribute found</source> - <translation type="unfinished"/> + <translation>Знайдено дублікат Вашого власного атрибута</translation> </message> <message> <source>Entry string key or value missing</source> - <translation type="unfinished"/> + <translation>Бракує текстового ключа або значення запису</translation> </message> <message> <source>Duplicate attachment found</source> - <translation type="unfinished"/> + <translation>Знайдено дублікат вкладення</translation> </message> <message> <source>Entry binary key or value missing</source> - <translation type="unfinished"/> + <translation>Бракує двійкового ключа або значення запису</translation> </message> <message> <source>Auto-type association window or sequence missing</source> - <translation type="unfinished"/> + <translation>Вікно або послідовність прив'язки автозаповнення відсутнє</translation> </message> <message> <source>Invalid bool value</source> - <translation type="unfinished"/> + <translation>Хибне логічне значення</translation> </message> <message> <source>Invalid date time value</source> - <translation type="unfinished"/> + <translation>Хибне часове значення</translation> </message> <message> <source>Invalid color value</source> - <translation type="unfinished"/> + <translation>Хибне значення кольору</translation> </message> <message> <source>Invalid color rgb part</source> - <translation type="unfinished"/> + <translation>Хибна частина кольору rgb</translation> </message> <message> <source>Invalid number value</source> - <translation type="unfinished"/> + <translation>Хибне цифрове значення</translation> </message> <message> <source>Invalid uuid value</source> - <translation type="unfinished"/> + <translation>Хибне значення uuid</translation> </message> <message> <source>Unable to decompress binary</source> <extracomment>Translator meant is a binary data inside an entry</extracomment> - <translation type="unfinished"/> + <translation>Неможливо розпакувати двійковий код</translation> </message> </context> <context> @@ -2261,40 +2437,40 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Unsupported encryption algorithm.</source> - <translation>Алгоритм шифрування не підтримується.</translation> + <translation>Непідтримуваний алгоритм шифрування.</translation> </message> <message> <source>Unsupported KeePass database version.</source> - <translation>Версія сховища KeePass не підтримується.</translation> + <translation>Непідтримувана версія сховища KeePass.</translation> </message> <message> <source>Unable to read encryption IV</source> <comment>IV = Initialization Vector for symmetric cipher</comment> - <translation type="unfinished"/> + <translation>Неможливо прочитати шифрування IV</translation> </message> <message> <source>Invalid number of groups</source> - <translation type="unfinished"/> + <translation>Хибна кількість груп</translation> </message> <message> <source>Invalid number of entries</source> - <translation type="unfinished"/> + <translation>Хибна кількість записів</translation> </message> <message> <source>Invalid content hash size</source> - <translation type="unfinished"/> + <translation>Хибний розмір контрольної суми вмісту</translation> </message> <message> <source>Invalid transform seed size</source> - <translation type="unfinished"/> + <translation>Хибний розмір початкового числа перетворення</translation> </message> <message> <source>Invalid number of transform rounds</source> - <translation type="unfinished"/> + <translation>Хибна кількість циклів перетворення</translation> </message> <message> <source>Unable to construct group tree</source> - <translation type="unfinished"/> + <translation>Неможливо побудувати дерево групи</translation> </message> <message> <source>Root</source> @@ -2310,102 +2486,102 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Key transformation failed</source> - <translation type="unfinished"/> + <translation>Перетворення ключа зазнало невдачі</translation> </message> <message> <source>Invalid group field type number</source> - <translation type="unfinished"/> + <translation>Хибна кількість типів поля групи</translation> </message> <message> <source>Invalid group field size</source> - <translation type="unfinished"/> + <translation>Хибний розмір поля групи</translation> </message> <message> <source>Read group field data doesn't match size</source> - <translation type="unfinished"/> + <translation>Дані у полі групи читання не відповідають розміру</translation> </message> <message> <source>Incorrect group id field size</source> - <translation type="unfinished"/> + <translation>Хибний розмір поля ідентифікатора групи</translation> </message> <message> <source>Incorrect group creation time field size</source> - <translation type="unfinished"/> + <translation>Хибний розмір поля часу створення групи</translation> </message> <message> <source>Incorrect group modification time field size</source> - <translation type="unfinished"/> + <translation>Значення часу у полі останньої зміни групи має хибний розмір</translation> </message> <message> <source>Incorrect group access time field size</source> - <translation type="unfinished"/> + <translation>Значення часу у полі останнього доступу має хибний розмір</translation> </message> <message> <source>Incorrect group expiry time field size</source> - <translation type="unfinished"/> + <translation>Значення часу у полі закінчення терміну чинності групи має хибний розмір</translation> </message> <message> <source>Incorrect group icon field size</source> - <translation type="unfinished"/> + <translation>Хибний розмір поля значка групи</translation> </message> <message> <source>Incorrect group level field size</source> - <translation type="unfinished"/> + <translation>Хибний розмір поля для рівня групи</translation> </message> <message> <source>Invalid group field type</source> - <translation type="unfinished"/> + <translation>Хибний тип поля групи</translation> </message> <message> <source>Missing group id or level</source> - <translation type="unfinished"/> + <translation>Бракує ідентифікатора або рівня групи</translation> </message> <message> <source>Missing entry field type number</source> - <translation type="unfinished"/> + <translation>Бракує номера типу для поля запису</translation> </message> <message> <source>Invalid entry field size</source> - <translation type="unfinished"/> + <translation>Хибний розмір поля запису</translation> </message> <message> <source>Read entry field data doesn't match size</source> - <translation type="unfinished"/> + <translation>Дані у полі запису читання не відповідають розміру</translation> </message> <message> <source>Invalid entry uuid field size</source> - <translation type="unfinished"/> + <translation>Хибний розмір поля uuid запису</translation> </message> <message> <source>Invalid entry group id field size</source> - <translation type="unfinished"/> + <translation>Хибний розмір поля для ідентифікатора групи запису</translation> </message> <message> <source>Invalid entry icon field size</source> - <translation type="unfinished"/> + <translation>Хибний розмір поля для значка запису</translation> </message> <message> <source>Invalid entry creation time field size</source> - <translation type="unfinished"/> + <translation>Хибний розмір поля для часу створення запису</translation> </message> <message> <source>Invalid entry modification time field size</source> - <translation type="unfinished"/> + <translation>Хибний розмір значення у полі останньої зміни запису</translation> </message> <message> <source>Invalid entry expiry time field size</source> - <translation type="unfinished"/> + <translation>Поле закінчення терміну чинності запису має хибний розмір</translation> </message> <message> <source>Invalid entry field type</source> - <translation type="unfinished"/> + <translation>Хибний тип поля запису</translation> </message> </context> <context> <name>Main</name> <message> <source>Existing single-instance lock file is invalid. Launching new instance.</source> - <translation type="unfinished"/> + <translation>Наявний блокувальний файл режиму одного примірника є хибним. Запускаю новий примірник.</translation> </message> <message> <source>The lock file could not be created. Single-instance mode disabled.</source> @@ -2448,11 +2624,11 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Copy att&ribute to clipboard</source> - <translation>Копіювати атрибут до буферу обміну</translation> + <translation>Скопіювати атрибут у кишеню</translation> </message> <message> <source>Time-based one-time password</source> - <translation type="unfinished"/> + <translation>Тимчасове одноразове гасло</translation> </message> <message> <source>&Groups</source> @@ -2528,7 +2704,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Database settings</source> - <translation>Параметри сховища</translation> + <translation>Налаштування сховища</translation> </message> <message> <source>&Clone entry</source> @@ -2544,7 +2720,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Copy username to clipboard</source> - <translation>Копіювати ім’я користувача в буфер обміну</translation> + <translation>Скопіювати ім’я користувача в кишеню</translation> </message> <message> <source>Cop&y password</source> @@ -2552,7 +2728,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Copy password to clipboard</source> - <translation>Копіювати гасло в буфер обміну</translation> + <translation>Скопіювати гасло в кишеню</translation> </message> <message> <source>&Settings</source> @@ -2580,7 +2756,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Copy title to clipboard</source> - <translation type="unfinished"/> + <translation>Скопіювати заголовок у кишеню</translation> </message> <message> <source>&URL</source> @@ -2588,7 +2764,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Copy URL to clipboard</source> - <translation type="unfinished"/> + <translation>Скопіювати URL у кишеню</translation> </message> <message> <source>&Notes</source> @@ -2596,7 +2772,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Copy notes to clipboard</source> - <translation type="unfinished"/> + <translation>Скопіювати нотатки у кишеню</translation> </message> <message> <source>&Export to CSV file...</source> @@ -2628,7 +2804,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>E&mpty recycle bin</source> - <translation type="unfinished"/> + <translation>Спорожнити смітник</translation> </message> <message> <source>Clear history</source> @@ -2640,7 +2816,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> - <translation type="unfinished"/> + <translation><p>Схоже, що Ви використовуєте KeePassHTTP для сполучення з переглядачем. Цей засіб застарів і буде незабаром видалений. <br>Натомість, перейдіть, будь ласка, до використання переглядача KeePassXC! Інформацію щодо переходу Ви можете знайти у нашому <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">посібнику</a> (попередження %1 of 3).</p></translation> </message> <message> <source>read-only</source> @@ -2682,99 +2858,111 @@ This is a one-way migration. You won't be able to open the imported databas <source>Please touch the button on your YubiKey!</source> <translation>Натисніть, будь ласка, кнопку на вашому YubiKey!</translation> </message> + <message> + <source>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</source> + <translation>Попередження: Ви використовуєте нестійку збірку KeePassXC! +Зберігайте резервну копію Ваших сховищ через підвищений ризик пошкодження даних. +Ця версія не призначена для повсякденного користування.</translation> + </message> </context> <context> <name>OpenSSHKey</name> <message> <source>Invalid key file, expecting an OpenSSH key</source> - <translation type="unfinished"/> + <translation>Хибний файл ключа. Ключ має бути у форматі OpenSSH.</translation> </message> <message> <source>PEM boundary mismatch</source> - <translation type="unfinished"/> - </message> - <message> - <source>This is not an OpenSSH key, only modern keys are supported</source> - <translation type="unfinished"/> + <translation>Невідповідність межам PEM</translation> </message> <message> <source>Base64 decoding failed</source> - <translation type="unfinished"/> + <translation>Розшифрування Base64 зазнало невдачі</translation> </message> <message> <source>Key file way too small.</source> - <translation type="unfinished"/> + <translation>Файл ключа занадто маленький.</translation> </message> <message> <source>Key file magic header id invalid</source> - <translation type="unfinished"/> + <translation>Хибний логічний код файлу ключа</translation> </message> <message> <source>Found zero keys</source> - <translation type="unfinished"/> + <translation>Не знайдено жодного ключа</translation> </message> <message> <source>Failed to read public key.</source> - <translation type="unfinished"/> + <translation>Зчитування відкритого ключа зазнало невдачі.</translation> </message> <message> <source>Corrupted key file, reading private key failed</source> - <translation type="unfinished"/> + <translation>Файл ключа пошкоджений, зчитування таємного ключа зазнало невдачі</translation> </message> <message> <source>No private key payload to decrypt</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown cipher: </source> - <translation type="unfinished"/> + <translation>Корисної навантаги таємного ключа не знайдено</translation> </message> <message> <source>Trying to run KDF without cipher</source> - <translation type="unfinished"/> + <translation>Пробуємо запустити ФОК без шифрування</translation> </message> <message> <source>Passphrase is required to decrypt this key</source> - <translation type="unfinished"/> + <translation>Для розшифрування цього ключа потрібен вираз гасла</translation> </message> <message> <source>Key derivation failed, key file corrupted?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown KDF: </source> - <translation type="unfinished"/> + <translation>Обчислення ключа зазнало невдачі. Можливо, файл ключа пошкоджений?</translation> </message> <message> <source>Decryption failed, wrong passphrase?</source> - <translation type="unfinished"/> + <translation>Розшифрування зазнало невдачі, можливо, через хибний вираз гасла</translation> </message> <message> <source>Unexpected EOF while reading public key</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown key type: </source> - <translation type="unfinished"/> + <translation>Несподіваний кінець файлу під час зчитування відкритого ключа</translation> </message> <message> <source>Unexpected EOF while reading private key</source> - <translation type="unfinished"/> + <translation>Несподіваний кінець файлу під час зчитування таємного ключа</translation> </message> <message> <source>Can't write public key as it is empty</source> - <translation type="unfinished"/> + <translation>Неможливо записати відкритий ключ, оскільки він пустий</translation> </message> <message> <source>Unexpected EOF when writing public key</source> - <translation type="unfinished"/> + <translation>Несподіваний кінець файлу під час запису відкритого ключа</translation> </message> <message> <source>Can't write private key as it is empty</source> - <translation type="unfinished"/> + <translation>Неможливо записати таємний ключ, оскільки він пустий</translation> </message> <message> <source>Unexpected EOF when writing private key</source> + <translation>Несподіваний кінець файлу під час запису таємного ключа</translation> + </message> + <message> + <source>Unsupported key type: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cipher IV is too short for MD5 kdf</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: %1</source> <translation type="unfinished"/> </message> </context> @@ -2883,11 +3071,11 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source><b>Warning:</b> The following options can be dangerous!</source> - <translation type="unfinished"/> + <translation><b>Попередження:</b> ці параметри можуть бути небезпечними!</translation> </message> <message> <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> - <translation type="unfinished"/> + <translation><p>KeePassHTTP застарів і може бути видалений у майбутньому.<br>Натомість, перейдіть, будь ласка, до використання переглядача KeePassXC! Інформацію щодо переходу Ви можете знайти у нашому <a href="https://keepassxc.org/docs/keepassxc-browser-migration">посібнику</a>.</p></translation> </message> <message> <source>Cannot bind to privileged ports</source> @@ -3028,71 +3216,71 @@ Using default port 19455.</source> <name>QObject</name> <message> <source>Database not opened</source> - <translation type="unfinished"/> + <translation>Сховище не відкрите</translation> </message> <message> <source>Database hash not available</source> - <translation type="unfinished"/> + <translation>Контрольна сума сховища недоступна</translation> </message> <message> <source>Client public key not received</source> - <translation type="unfinished"/> + <translation>Відкритий ключ користувача не одержано</translation> </message> <message> <source>Cannot decrypt message</source> - <translation type="unfinished"/> + <translation>Неможливо розшифрувати повідомлення</translation> </message> <message> <source>Timeout or cannot connect to KeePassXC</source> - <translation type="unfinished"/> + <translation>Перевищено час очікування або неможливо під'єднатися до KeePassXC</translation> </message> <message> <source>Action cancelled or denied</source> - <translation type="unfinished"/> + <translation>Дію скасовано або заборонено</translation> </message> <message> <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> - <translation type="unfinished"/> + <translation>Неможливо зашифрувати повідомлення або знайти відкритий ключ. Переконайтеся, що власний обмін повідомленнями у KeePassXC ввімкнено.</translation> </message> <message> <source>KeePassXC association failed, try again</source> - <translation type="unfinished"/> + <translation>Прив'язка KeePassXC зазнала невдачі, спробуйте ще раз</translation> </message> <message> <source>Key change was not successful</source> - <translation type="unfinished"/> + <translation>Зміна ключа зазнала невдачі</translation> </message> <message> <source>Encryption key is not recognized</source> - <translation type="unfinished"/> + <translation>Шифрувальний ключ не розпізнано</translation> </message> <message> <source>No saved databases found</source> - <translation type="unfinished"/> + <translation>Збережених сховищ не знайдено</translation> </message> <message> <source>Incorrect action</source> - <translation type="unfinished"/> + <translation>Хибна дія</translation> </message> <message> <source>Empty message received</source> - <translation type="unfinished"/> + <translation>Одержано порожнє повідомлення</translation> </message> <message> <source>No URL provided</source> - <translation type="unfinished"/> + <translation>URL не надано</translation> </message> <message> <source>No logins found</source> - <translation type="unfinished"/> + <translation>Імен користувача не знайдено</translation> </message> <message> <source>Unknown error</source> - <translation type="unfinished"/> + <translation>Невідома помилка</translation> </message> <message> <source>Add a new entry to a database.</source> - <translation type="unfinished"/> + <translation>Додати новий запис до сховища.</translation> </message> <message> <source>Path of the database.</source> @@ -3100,23 +3288,23 @@ Using default port 19455.</source> </message> <message> <source>Key file of the database.</source> - <translation type="unfinished"/> + <translation>Файл ключа для сховища.</translation> </message> <message> <source>path</source> - <translation type="unfinished"/> + <translation>шлях</translation> </message> <message> <source>Username for the entry.</source> - <translation type="unfinished"/> + <translation>Ім'я користувача для запису.</translation> </message> <message> <source>username</source> - <translation type="unfinished"/> + <translation>ім'я користувача</translation> </message> <message> <source>URL for the entry.</source> - <translation type="unfinished"/> + <translation>URL для запису.</translation> </message> <message> <source>URL</source> @@ -3124,64 +3312,64 @@ Using default port 19455.</source> </message> <message> <source>Prompt for the entry's password.</source> - <translation type="unfinished"/> + <translation>Запросити гасло для запису.</translation> </message> <message> <source>Generate a password for the entry.</source> - <translation type="unfinished"/> + <translation>Створити гасло для запису.</translation> </message> <message> <source>Length for the generated password.</source> - <translation type="unfinished"/> + <translation>Довжина створюваного гасла.</translation> </message> <message> <source>length</source> - <translation type="unfinished"/> + <translation>довжина</translation> </message> <message> <source>Path of the entry to add.</source> - <translation type="unfinished"/> + <translation>Шлях до запису, що треба додати.</translation> </message> <message> <source>Copy an entry's password to the clipboard.</source> - <translation type="unfinished"/> + <translation>Скопіювати гасло запису в кишеню.</translation> </message> <message> <source>Path of the entry to clip.</source> <comment>clip = copy to clipboard</comment> - <translation type="unfinished"/> + <translation>Шлях до запису, що треба скопіювати.</translation> </message> <message> <source>Timeout in seconds before clearing the clipboard.</source> - <translation type="unfinished"/> + <translation>Час очікування у секундах перед очищенням кишені.</translation> </message> <message> <source>Edit an entry.</source> - <translation type="unfinished"/> + <translation>Змінити запис</translation> </message> <message> <source>Title for the entry.</source> - <translation type="unfinished"/> + <translation>Заголовок запису.</translation> </message> <message> <source>title</source> - <translation type="unfinished"/> + <translation>Заголовок</translation> </message> <message> <source>Path of the entry to edit.</source> - <translation type="unfinished"/> + <translation>Шлях до запису, що підлягає зміні.</translation> </message> <message> <source>Estimate the entropy of a password.</source> - <translation type="unfinished"/> + <translation>Підрахувати ентропію гасла.</translation> </message> <message> <source>Password for which to estimate the entropy.</source> - <translation type="unfinished"/> + <translation>Гасло, для якого треба підрахувати ентропію.</translation> </message> <message> <source>Perform advanced analysis on the password.</source> - <translation type="unfinished"/> + <translation>Виконати поглиблений аналіз гасла.</translation> </message> <message> <source>Extract and print the content of a database.</source> @@ -3193,25 +3381,31 @@ Using default port 19455.</source> </message> <message> <source>Insert password to unlock %1: </source> - <translation type="unfinished"/> + <translation>Вставте гасло для відкриття %1:</translation> </message> <message> <source>Failed to load key file %1 : %2</source> - <translation type="unfinished"/> + <translation>Не вдалося завантажити файл ключа %1 : %2</translation> </message> <message> <source>WARNING: You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>Попередження: Ви використовуєте застарілий формат ключа, підтримка якого + може незабаром закінчитись. + + Бажано створити новий файл-ключ.</translation> </message> <message> <source> Available commands: </source> - <translation type="unfinished"/> + <translation> + +Доступні команди: +</translation> </message> <message> <source>Name of the command to execute.</source> @@ -3227,11 +3421,11 @@ Available commands: </message> <message> <source>Find entries quickly.</source> - <translation type="unfinished"/> + <translation>Знаходити записи швидко.</translation> </message> <message> <source>Search term.</source> - <translation type="unfinished"/> + <translation>Слово для пошуку.</translation> </message> <message> <source>Merge two databases.</source> @@ -3247,23 +3441,23 @@ Available commands: </message> <message> <source>Use the same credentials for both database files.</source> - <translation type="unfinished"/> + <translation>Використовувати ті ж самі реєстраційні дані для обох сховищ.</translation> </message> <message> <source>Key file of the database to merge from.</source> - <translation type="unfinished"/> + <translation>Файл ключа для сховища, з якого треба взяти дані для об'єднання.</translation> </message> <message> <source>Show an entry's information.</source> - <translation type="unfinished"/> + <translation>Показати дані запису.</translation> </message> <message> <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> - <translation type="unfinished"/> + <translation>Назви атрибутів для показу. Цей параметр можна вказати кілька разів, тим часом у кожному рядку може бути тільки один примірник у заданому порядку. Якщо атрибути не вказані, буде показано типові атрибути.</translation> </message> <message> <source>attribute</source> - <translation type="unfinished"/> + <translation>атрибут</translation> </message> <message> <source>Name of the entry to show.</source> @@ -3293,27 +3487,27 @@ Available commands: </message> <message> <source>AES: 256-bit</source> - <translation type="unfinished"/> + <translation>AES: 256-біт</translation> </message> <message> <source>Twofish: 256-bit</source> - <translation type="unfinished"/> + <translation>Twofish: 256-біт</translation> </message> <message> <source>ChaCha20: 256-bit</source> - <translation type="unfinished"/> + <translation>ChaCha20: 256-біт</translation> </message> <message> <source>Argon2 (KDBX 4 – recommended)</source> - <translation type="unfinished"/> + <translation>Argon2 (KDBX 4 – рекомендовано)</translation> </message> <message> <source>AES-KDF (KDBX 4)</source> - <translation type="unfinished"/> + <translation>AES-KDF (KDBX 4)</translation> </message> <message> <source>AES-KDF (KDBX 3.1)</source> - <translation type="unfinished"/> + <translation>AES-KDF (KDBX 3.1)</translation> </message> <message> <source>Group</source> @@ -3337,15 +3531,15 @@ Available commands: </message> <message> <source>Last Modified</source> - <translation type="unfinished"/> + <translation>Остання зміна</translation> </message> <message> <source>Created</source> - <translation type="unfinished"/> + <translation>Створено</translation> </message> <message> <source>Legacy Browser Integration</source> - <translation type="unfinished"/> + <translation>Застарілий тип підключення до переглядача</translation> </message> <message> <source>Browser Integration</source> @@ -3365,6 +3559,51 @@ Available commands: </message> <message> <source>SSH Agent</source> + <translation>Посередник SSH</translation> + </message> + <message> + <source>Generate a new random diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Word count for the diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>count</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wordlist for the diceware generator. +[Default: EFF English]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a new random password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length of the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use lowercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use uppercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use numbers in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use special characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use extended ASCII in the generated password.</source> <translation type="unfinished"/> </message> </context> @@ -3372,7 +3611,7 @@ Available commands: <name>QtIOCompressor</name> <message> <source>Internal zlib error when compressing: </source> - <translation>Внутрішня помилка zlib при стисненні:</translation> + <translation>Внутрішня помилка zlib під час стиснення:</translation> </message> <message> <source>Error writing to underlying device: </source> @@ -3388,7 +3627,7 @@ Available commands: </message> <message> <source>Internal zlib error when decompressing: </source> - <translation>Внутрішня помилка zlib при розпакуванні:</translation> + <translation>Внутрішня помилка zlib під час розпакування:</translation> </message> </context> <context> @@ -3436,8 +3675,8 @@ Available commands: If you would like to allow it access to your KeePassXC database give it a unique name to identify and accept it.</source> <translation>Ви одержали запит на прив'язку вказаного ключа. -Якщо Ви бажаєте надати доступ до Вашого сховища KeePassXC -надайте унікальну назву та підтвердьте його. </translation> +Якщо Ви бажаєте надати доступ до Вашого сховища KeePassXC, +вкажіть унікальну назву та підтвердьте прив'язку.</translation> </message> <message> <source>KeePassXC: Overwrite existing key?</source> @@ -3473,7 +3712,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message numerus="yes"> <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Успішно видалив %n шифрувальний ключ з HTTP налаштувань KeePassX.</numerusform><numerusform>Успішно видалив %n шифрувальних ключа з HTTP налаштувань KeePassX.</numerusform><numerusform>Успішно видалив %n шифрувальних ключів з HTTP налаштувань KeePassX.</numerusform></translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -3505,7 +3744,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message numerus="yes"> <source>Successfully removed permissions from %n entries.</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Успішно видалив привілеї для %n запису.</numerusform><numerusform>Успішно видалив привілеї для %n записів.</numerusform><numerusform>Успішно видалив привілеї для %n записів.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -3520,7 +3759,7 @@ Please unlock the selected database or choose another one which is unlocked.</so <name>SettingsWidget</name> <message> <source>Application Settings</source> - <translation>Параметри застосунку</translation> + <translation>Налаштування застосунку</translation> </message> <message> <source>General</source> @@ -3571,7 +3810,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Minimize when copying to clipboard</source> - <translation>Згортати при копіюванні до буфера обміну</translation> + <translation>Згортати після копіювання до буфера обміну</translation> </message> <message> <source>Minimize window at application startup</source> @@ -3587,15 +3826,15 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Hide the Details view</source> - <translation type="unfinished"/> + <translation>Сховати докладний перегляд</translation> </message> <message> <source>Show a system tray icon</source> - <translation>Показувати значок в треї</translation> + <translation>Показувати значок у лотку</translation> </message> <message> <source>Hide window to system tray when minimized</source> - <translation>При згортанні ховати вікно в область системних повідомлень</translation> + <translation>Під час згортання ховати вікно у системний лоток</translation> </message> <message> <source>Hide window to system tray instead of app exit</source> @@ -3603,7 +3842,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Dark system tray icon</source> - <translation type="unfinished"/> + <translation>Темний значок у системному лотку</translation> </message> <message> <source>Language</source> @@ -3615,11 +3854,11 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Use entry title to match windows for global Auto-Type</source> - <translation type="unfinished"/> + <translation>Використовувати заголовок запису для знаходження відповідного вікна у глобальному автозаповненні</translation> </message> <message> <source>Use entry URL to match windows for global Auto-Type</source> - <translation type="unfinished"/> + <translation>Використовувати URL запису для знаходження відповідного вікна у глобальному автозаповненні</translation> </message> <message> <source>Always ask before performing Auto-Type</source> @@ -3638,12 +3877,36 @@ Please unlock the selected database or choose another one which is unlocked.</so <comment>Milliseconds</comment> <translation>мс</translation> </message> + <message> + <source>Startup</source> + <translation>Запуск</translation> + </message> + <message> + <source>File Management</source> + <translation>Керування файлами</translation> + </message> + <message> + <source>Safely save database files (may be incompatible with Dropbox, etc)</source> + <translation> Безпечно зберігати файли сховища (може бути несумісним з Dropbox та ін.)</translation> + </message> + <message> + <source>Backup database file before saving</source> + <translation>Створювати резервну копію сховища перед збереженням</translation> + </message> + <message> + <source>Entry Management</source> + <translation>Керування записами</translation> + </message> + <message> + <source>General</source> + <translation>Загальні</translation> + </message> </context> <context> <name>SettingsWidgetSecurity</name> <message> <source>Timeouts</source> - <translation>Час очикування</translation> + <translation>Час очікування</translation> </message> <message> <source>Clear clipboard after</source> @@ -3680,11 +3943,11 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Hide passwords in the preview panel</source> - <translation type="unfinished"/> + <translation>Ховати гасла у панелі перегляду</translation> </message> <message> <source>Hide entry notes by default</source> - <translation type="unfinished"/> + <translation>Типово ховати нотатки до запису</translation> </message> <message> <source>Privacy</source> @@ -3694,6 +3957,10 @@ Please unlock the selected database or choose another one which is unlocked.</so <source>Use Google as fallback for downloading website icons</source> <translation>Використовувати Google як запасний варіант для завантаження значків сторінок</translation> </message> + <message> + <source>Re-lock previously locked database after performing Auto-Type</source> + <translation type="unfinished"/> + </message> </context> <context> <name>SetupTotpDialog</name> @@ -3707,11 +3974,11 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Default RFC 6238 token settings</source> - <translation type="unfinished"/> + <translation>Типові налаштування позначки RFC 6238</translation> </message> <message> <source>Steam token settings</source> - <translation type="unfinished"/> + <translation>Налаштування позначки потока</translation> </message> <message> <source>Use custom settings</source> @@ -3775,10 +4042,6 @@ Please unlock the selected database or choose another one which is unlocked.</so </context> <context> <name>WelcomeWidget</name> - <message> - <source>Welcome to KeePassXC</source> - <translation>Ласкаво просимо до KeePassXC</translation> - </message> <message> <source>Start storing your passwords securely in a KeePassXC database</source> <translation>Почніть надійно і безпечно зберігати ваші гасла у сховищі KeePassXC</translation> @@ -3803,12 +4066,16 @@ Please unlock the selected database or choose another one which is unlocked.</so <source>Recent databases</source> <translation>Недавні сховища</translation> </message> + <message> + <source>Welcome to KeePassXC %1</source> + <translation>Ласкаво просимо до KeePassXC %1</translation> + </message> </context> <context> <name>main</name> <message> <source>Remove an entry from the database.</source> - <translation type="unfinished"/> + <translation>Видалити запис зі сховища.</translation> </message> <message> <source>Path of the database.</source> @@ -3816,7 +4083,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Path of the entry to remove.</source> - <translation type="unfinished"/> + <translation>Шлях до запису, який треба видалити.</translation> </message> <message> <source>KeePassXC - cross-platform password manager</source> @@ -3840,7 +4107,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Parent window handle</source> - <translation type="unfinished"/> + <translation>Логічний номер батьківського вікна</translation> </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_zh_CN.ts b/share/translations/keepassx_zh_CN.ts index 1cc8b409b..9298211e6 100644 --- a/share/translations/keepassx_zh_CN.ts +++ b/share/translations/keepassx_zh_CN.ts @@ -17,10 +17,6 @@ <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> <translation>KeePassXC 使用第 2 版 GNU 通用公共授权协议(GPL)分发,你也可以根据需要选用第 3 版。</translation> </message> - <message> - <source>Project Maintainers:</source> - <translation>项目维护者:</translation> - </message> <message> <source>Contributors</source> <translation>贡献者</translation> @@ -71,6 +67,19 @@ CPU 架构:%2 <source>Enabled extensions:</source> <translation>已启用的扩展:</translation> </message> + <message> + <source>Project Maintainers:</source> + <translation>项目维护者:</translation> + </message> + <message> + <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Build Type: %1 +</source> + <translation type="unfinished"/> + </message> </context> <context> <name>AccessControlDialog</name> @@ -101,7 +110,7 @@ Please select whether you want to allow access.</source> <name>AgentSettingsWidget</name> <message> <source>Enable SSH Agent (requires restart)</source> - <translation type="unfinished"/> + <translation>启用 SSH 代理(需要重启)</translation> </message> </context> <context> @@ -120,19 +129,19 @@ Please select whether you want to allow access.</source> </message> <message> <source>The Syntax of your Auto-Type statement is incorrect!</source> - <translation type="unfinished"/> + <translation>自动输入的语法不正确!</translation> </message> <message> <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>此自动输入命令包含很长的延迟。你真的要继续吗?</translation> </message> <message> <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>此自动输入命令包含非常慢的按键操作。你真的要继续吗?</translation> </message> <message> <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>此自动输入命令包含频繁重复的参数。你真的要继续吗?</translation> </message> </context> <context> @@ -150,6 +159,25 @@ Please select whether you want to allow access.</source> <translation>默认顺序</translation> </message> </context> +<context> + <name>AutoTypeMatchModel</name> + <message> + <source>Group</source> + <translation>群组</translation> + </message> + <message> + <source>Title</source> + <translation>标题</translation> + </message> + <message> + <source>Username</source> + <translation>用户名</translation> + </message> + <message> + <source>Sequence</source> + <translation>顺序</translation> + </message> +</context> <context> <name>AutoTypeSelectDialog</name> <message> @@ -165,7 +193,7 @@ Please select whether you want to allow access.</source> <name>BrowserAccessControlDialog</name> <message> <source>KeePassXC-Browser Confirm Access</source> - <translation type="unfinished"/> + <translation>KeePassXC-Browser 浏览器扩展功能访问确认</translation> </message> <message> <source>Remember this decision</source> @@ -194,11 +222,11 @@ Please select whether you want to allow access.</source> </message> <message> <source>This is required for accessing your databases with KeePassXC-Browser</source> - <translation type="unfinished"/> + <translation>需要使用 KeePassXC-Browser 浏览器扩展功能访问你的数据库。</translation> </message> <message> <source>Enable KeepassXC browser integration</source> - <translation type="unfinished"/> + <translation>启用 KeepassXC 浏览器集成</translation> </message> <message> <source>General</source> @@ -206,7 +234,7 @@ Please select whether you want to allow access.</source> </message> <message> <source>Enable integration for these browsers:</source> - <translation type="unfinished"/> + <translation>为这些浏览器开启集成:</translation> </message> <message> <source>&Google Chrome</source> @@ -235,11 +263,11 @@ Please select whether you want to allow access.</source> </message> <message> <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> - <translation type="unfinished"/> + <translation>只返回具有相同形式的条目。 ( http://, https://,... ) </translation> </message> <message> <source>&Match URL scheme (e.g., https://...)</source> - <translation type="unfinished"/> + <translation>匹配 URL 形式 (例如:https://……)(&M)</translation> </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> @@ -326,19 +354,19 @@ Please select whether you want to allow access.</source> <message> <source>Browse...</source> <extracomment>Button for opening file dialog</extracomment> - <translation type="unfinished"/> + <translation>浏览...</translation> </message> <message> <source><b>Warning:</b> The following options can be dangerous!</source> - <translation type="unfinished"/> + <translation><b>警告:</b> 以下选项可能有危险!</translation> </message> <message> <source>Executable Files (*.exe);;All Files (*.*)</source> - <translation type="unfinished"/> + <translation>可执行文件(*.exe);;所有文件(*.*)</translation> </message> <message> <source>Executable Files (*)</source> - <translation type="unfinished"/> + <translation>可执行文件(*)</translation> </message> <message> <source>Select custom proxy location</source> @@ -771,7 +799,7 @@ You can now save it.</source> </message> <message> <source>Encryption</source> - <translation type="unfinished"/> + <translation>加密</translation> </message> <message> <source>Number of rounds too high</source> @@ -790,7 +818,7 @@ If you keep this number, your database may take hours or days (or even longer) t </message> <message> <source>Cancel</source> - <translation type="unfinished"/> + <translation>取消</translation> </message> <message> <source>Number of rounds too low</source> @@ -811,12 +839,22 @@ If you keep this number, your database may be too easy to crack!</source> <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> <translation type="unfinished"/> </message> + <message numerus="yes"> + <source> MiB</source> + <comment>Abbreviation for Mebibytes (KDF settings)</comment> + <translation><numerusform> MiB</numerusform></translation> + </message> + <message numerus="yes"> + <source> thread(s)</source> + <comment>Threads for parallel execution (KDF settings)</comment> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> </context> <context> <name>DatabaseSettingsWidgetEncryption</name> <message> <source>Encryption Algorithm:</source> - <translation type="unfinished"/> + <translation>加密算法:</translation> </message> <message> <source>AES: 256 Bit (default)</source> @@ -840,26 +878,18 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Memory Usage:</source> - <translation type="unfinished"/> - </message> - <message> - <source> MB</source> - <translation>MB</translation> + <translation>内存占用:</translation> </message> <message> <source>Parallelism:</source> <translation type="unfinished"/> </message> - <message> - <source> thread</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DatabaseSettingsWidgetGeneral</name> <message> <source>Database Meta Data</source> - <translation type="unfinished"/> + <translation>数据库元数据</translation> </message> <message> <source>Database name:</source> @@ -875,7 +905,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>History Settings</source> - <translation type="unfinished"/> + <translation>历史设置</translation> </message> <message> <source>Max. history items:</source> @@ -893,6 +923,14 @@ If you keep this number, your database may be too easy to crack!</source> <source>Use recycle bin</source> <translation>启用回收站</translation> </message> + <message> + <source>Additional Database Settings</source> + <translation type="unfinished"/> + </message> + <message> + <source>Enable &compression (recommended)</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DatabaseTabWidget</name> @@ -1015,6 +1053,15 @@ Otherwise your changes are lost.</source> 你想在锁定它之前保存修改吗? 否则修改将会丢失。</translation> </message> + <message> + <source>Disable safe saves?</source> + <translation type="unfinished"/> + </message> + <message> + <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DatabaseWidget</name> @@ -1127,6 +1174,10 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>你确定要永久删除回收站中的所有内容?</translation> </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DetailsWidget</name> @@ -1160,11 +1211,11 @@ Do you want to merge your changes?</source> </message> <message> <source>Autotype</source> - <translation type="unfinished"/> + <translation>自动填充</translation> </message> <message> <source>Searching</source> - <translation type="unfinished"/> + <translation>搜索</translation> </message> <message> <source>Attributes</source> @@ -1204,11 +1255,11 @@ Do you want to merge your changes?</source> </message> <message> <source>Disabled</source> - <translation type="unfinished"/> + <translation>禁用</translation> </message> <message> <source>Enabled</source> - <translation type="unfinished"/> + <translation>启用</translation> </message> </context> <context> @@ -1239,7 +1290,7 @@ Do you want to merge your changes?</source> </message> <message> <source>SSH Agent</source> - <translation type="unfinished"/> + <translation>SSH 代理</translation> </message> <message> <source>n/a</source> @@ -1313,6 +1364,18 @@ Do you want to merge your changes?</source> <source>1 year</source> <translation>1 年</translation> </message> + <message> + <source>Apply generated password?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to apply the generated password to this entry?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAdvanced</name> @@ -1344,6 +1407,14 @@ Do you want to merge your changes?</source> <source>Attachments</source> <translation>附件</translation> </message> + <message> + <source>Foreground Color:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Background Color:</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -1376,12 +1447,8 @@ Do you want to merge your changes?</source> <translation>窗口标题:</translation> </message> <message> - <source>Use default se&quence</source> - <translation>使用默认顺序(Q)</translation> - </message> - <message> - <source>Set custo&m sequence:</source> - <translation>设置自定义顺序(M)</translation> + <source>Use a specific sequence for this association:</source> + <translation type="unfinished"/> </message> </context> <context> @@ -1458,7 +1525,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Fingerprint</source> - <translation type="unfinished"/> + <translation>指纹</translation> </message> <message> <source>Remove key from agent when database is closed/locked</source> @@ -1499,7 +1566,7 @@ Do you want to merge your changes?</source> <message> <source>Browse...</source> <extracomment>Button for opening file dialog</extracomment> - <translation type="unfinished"/> + <translation>浏览...</translation> </message> <message> <source>Attachment</source> @@ -1661,6 +1728,31 @@ Do you want to merge your changes?</source> <source>Uuid:</source> <translation>UUID:</translation> </message> + <message> + <source>Plugin Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove</source> + <translation>移除</translation> + </message> + <message> + <source>Delete plugin data?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Value</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Entry</name> @@ -1802,6 +1894,65 @@ Do you want to merge your changes?</source> <source>URL</source> <translation>网址</translation> </message> + <message> + <source>Never</source> + <translation type="unfinished"/> + </message> + <message> + <source>Password</source> + <translation>密码</translation> + </message> + <message> + <source>Notes</source> + <translation>备注</translation> + </message> + <message> + <source>Expires</source> + <translation>过期</translation> + </message> + <message> + <source>Created</source> + <translation type="unfinished"/> + </message> + <message> + <source>Modified</source> + <translation type="unfinished"/> + </message> + <message> + <source>Accessed</source> + <translation type="unfinished"/> + </message> + <message> + <source>Attachments</source> + <translation>附件</translation> + </message> +</context> +<context> + <name>EntryView</name> + <message> + <source>Customize View</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide Usernames</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide Passwords</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fit to window</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fit to contents</source> + <translation type="unfinished"/> + </message> + <message> + <source>Reset to defaults</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Group</name> @@ -1871,6 +2022,10 @@ Do you want to merge your changes?</source> <source>Ensure that the password contains characters from every group</source> <translation>确保密码包含每一种字符</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>扩展 ASCII</translation> + </message> </context> <context> <name>KMessageWidget</name> @@ -2145,7 +2300,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Invalid EnableAutoType value</source> - <translation type="unfinished"/> + <translation>EnableAutoType 值无效</translation> </message> <message> <source>Invalid EnableSearching value</source> @@ -2579,7 +2734,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Copy title to clipboard</source> - <translation type="unfinished"/> + <translation>复制标题到剪贴板</translation> </message> <message> <source>&URL</source> @@ -2587,7 +2742,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Copy URL to clipboard</source> - <translation type="unfinished"/> + <translation>复制 URL 到剪贴板</translation> </message> <message> <source>&Notes</source> @@ -2595,7 +2750,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Copy notes to clipboard</source> - <translation type="unfinished"/> + <translation>复制备注到剪贴板</translation> </message> <message> <source>&Export to CSV file...</source> @@ -2639,7 +2794,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> - <translation type="unfinished"/> + <translation><p>您可能正在使用 KeePassHTTP 来连接浏览器插件。该功能目前已被弃用,并且在未来将会被移除。<br>请切换到 KeePassXC-Browser! 如果在迁移中您需要帮助,请访问<a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">迁移指南</a> (警告 %1/3)。</p></translation> </message> <message> <source>read-only</source> @@ -2681,6 +2836,12 @@ This is a one-way migration. You won't be able to open the imported databas <source>Please touch the button on your YubiKey!</source> <translation>请触摸你 YubiKey 上的按键!</translation> </message> + <message> + <source>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OpenSSHKey</name> @@ -2692,10 +2853,6 @@ This is a one-way migration. You won't be able to open the imported databas <source>PEM boundary mismatch</source> <translation type="unfinished"/> </message> - <message> - <source>This is not an OpenSSH key, only modern keys are supported</source> - <translation type="unfinished"/> - </message> <message> <source>Base64 decoding failed</source> <translation type="unfinished"/> @@ -2724,10 +2881,6 @@ This is a one-way migration. You won't be able to open the imported databas <source>No private key payload to decrypt</source> <translation type="unfinished"/> </message> - <message> - <source>Unknown cipher: </source> - <translation type="unfinished"/> - </message> <message> <source>Trying to run KDF without cipher</source> <translation type="unfinished"/> @@ -2740,10 +2893,6 @@ This is a one-way migration. You won't be able to open the imported databas <source>Key derivation failed, key file corrupted?</source> <translation type="unfinished"/> </message> - <message> - <source>Unknown KDF: </source> - <translation type="unfinished"/> - </message> <message> <source>Decryption failed, wrong passphrase?</source> <translation type="unfinished"/> @@ -2752,10 +2901,6 @@ This is a one-way migration. You won't be able to open the imported databas <source>Unexpected EOF while reading public key</source> <translation type="unfinished"/> </message> - <message> - <source>Unknown key type: </source> - <translation type="unfinished"/> - </message> <message> <source>Unexpected EOF while reading private key</source> <translation type="unfinished"/> @@ -2776,6 +2921,26 @@ This is a one-way migration. You won't be able to open the imported databas <source>Unexpected EOF when writing private key</source> <translation type="unfinished"/> </message> + <message> + <source>Unsupported key type: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cipher IV is too short for MD5 kdf</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: %1</source> + <translation type="unfinished"/> + </message> </context> <context> <name>OptionDialog</name> @@ -2882,11 +3047,11 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source><b>Warning:</b> The following options can be dangerous!</source> - <translation type="unfinished"/> + <translation><b>警告:</b> 以下选项可能有危险!</translation> </message> <message> <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> - <translation type="unfinished"/> + <translation><p>KeePassHTTP 已被弃用,并且在未来将会被移除。<br>请切换到 KeePassXC-Browser!如果在迁移中您需要帮助,请访问<a href="https://keepassxc.org/docs/keepassxc-browser-migration">迁移指南</a>。</p></translation> </message> <message> <source>Cannot bind to privileged ports</source> @@ -3087,7 +3252,7 @@ Using default port 19455.</source> </message> <message> <source>Unknown error</source> - <translation type="unfinished"/> + <translation>未知错误</translation> </message> <message> <source>Add a new entry to a database.</source> @@ -3135,7 +3300,7 @@ Using default port 19455.</source> </message> <message> <source>length</source> - <translation type="unfinished"/> + <translation>长度</translation> </message> <message> <source>Path of the entry to add.</source> @@ -3164,7 +3329,7 @@ Using default port 19455.</source> </message> <message> <source>title</source> - <translation type="unfinished"/> + <translation>标题</translation> </message> <message> <source>Path of the entry to edit.</source> @@ -3292,15 +3457,15 @@ Available commands: </message> <message> <source>AES: 256-bit</source> - <translation type="unfinished"/> + <translation>AES:256位</translation> </message> <message> <source>Twofish: 256-bit</source> - <translation type="unfinished"/> + <translation>Twofish:256位</translation> </message> <message> <source>ChaCha20: 256-bit</source> - <translation type="unfinished"/> + <translation>ChaCha20:256位</translation> </message> <message> <source>Argon2 (KDBX 4 – recommended)</source> @@ -3364,6 +3529,51 @@ Available commands: </message> <message> <source>SSH Agent</source> + <translation>SSH 代理</translation> + </message> + <message> + <source>Generate a new random diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Word count for the diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>count</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wordlist for the diceware generator. +[Default: EFF English]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a new random password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length of the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use lowercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use uppercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use numbers in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use special characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use extended ASCII in the generated password.</source> <translation type="unfinished"/> </message> </context> @@ -3637,6 +3847,30 @@ Please unlock the selected database or choose another one which is unlocked.</so <comment>Milliseconds</comment> <translation>毫秒</translation> </message> + <message> + <source>Startup</source> + <translation type="unfinished"/> + </message> + <message> + <source>File Management</source> + <translation type="unfinished"/> + </message> + <message> + <source>Safely save database files (may be incompatible with Dropbox, etc)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Backup database file before saving</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry Management</source> + <translation type="unfinished"/> + </message> + <message> + <source>General</source> + <translation>常规</translation> + </message> </context> <context> <name>SettingsWidgetSecurity</name> @@ -3693,6 +3927,10 @@ Please unlock the selected database or choose another one which is unlocked.</so <source>Use Google as fallback for downloading website icons</source> <translation>使用 Google 作为下载网站图标时的备选</translation> </message> + <message> + <source>Re-lock previously locked database after performing Auto-Type</source> + <translation type="unfinished"/> + </message> </context> <context> <name>SetupTotpDialog</name> @@ -3774,10 +4012,6 @@ Please unlock the selected database or choose another one which is unlocked.</so </context> <context> <name>WelcomeWidget</name> - <message> - <source>Welcome to KeePassXC</source> - <translation>欢迎使用 KeePassXC</translation> - </message> <message> <source>Start storing your passwords securely in a KeePassXC database</source> <translation>开始将你的密码安全地存储在 KeePassXC 数据库中</translation> @@ -3802,6 +4036,10 @@ Please unlock the selected database or choose another one which is unlocked.</so <source>Recent databases</source> <translation>最近的数据库</translation> </message> + <message> + <source>Welcome to KeePassXC %1</source> + <translation type="unfinished"/> + </message> </context> <context> <name>main</name> diff --git a/share/translations/keepassx_zh_TW.ts b/share/translations/keepassx_zh_TW.ts index d84b9e0d0..397a3e535 100644 --- a/share/translations/keepassx_zh_TW.ts +++ b/share/translations/keepassx_zh_TW.ts @@ -17,10 +17,6 @@ <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> <translation>KeePassXC 遵循 GNU 通用公共許可證 (GPL) 第二版 或(依你的需求)以第三版發行。</translation> </message> - <message> - <source>Project Maintainers:</source> - <translation>專案維護者:</translation> - </message> <message> <source>Contributors</source> <translation>貢獻者</translation> @@ -71,12 +67,25 @@ Kernel: %3 %4</source> <source>Enabled extensions:</source> <translation>已啟用的擴充元件:</translation> </message> + <message> + <source>Project Maintainers:</source> + <translation>專案維護者:</translation> + </message> + <message> + <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Build Type: %1 +</source> + <translation type="unfinished"/> + </message> </context> <context> <name>AccessControlDialog</name> <message> <source>KeePassXC HTTP Confirm Access</source> - <translation>KeePassXC HTTP 確認存取</translation> + <translation>KeePassXC HTTP 存取確認</translation> </message> <message> <source>Remember this decision</source> @@ -101,7 +110,7 @@ Please select whether you want to allow access.</source> <name>AgentSettingsWidget</name> <message> <source>Enable SSH Agent (requires restart)</source> - <translation type="unfinished"/> + <translation>啟用 SSH 代理 (需要重新啟動)</translation> </message> </context> <context> @@ -120,19 +129,19 @@ Please select whether you want to allow access.</source> </message> <message> <source>The Syntax of your Auto-Type statement is incorrect!</source> - <translation type="unfinished"/> + <translation>自動輸入語法不正確!</translation> </message> <message> <source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>此自動輸入命令包含很長的延遲。真的要繼續嗎?</translation> </message> <message> <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>此自動輸入命令包含非常緩慢的按鍵操作。真的要繼續嗎?</translation> </message> <message> <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>此自動輸入命令包含頻繁重複的參數。真的要繼續嗎?</translation> </message> </context> <context> @@ -150,6 +159,25 @@ Please select whether you want to allow access.</source> <translation>預設序列</translation> </message> </context> +<context> + <name>AutoTypeMatchModel</name> + <message> + <source>Group</source> + <translation>群組</translation> + </message> + <message> + <source>Title</source> + <translation>標題</translation> + </message> + <message> + <source>Username</source> + <translation>使用者名稱</translation> + </message> + <message> + <source>Sequence</source> + <translation>序列</translation> + </message> +</context> <context> <name>AutoTypeSelectDialog</name> <message> @@ -165,7 +193,7 @@ Please select whether you want to allow access.</source> <name>BrowserAccessControlDialog</name> <message> <source>KeePassXC-Browser Confirm Access</source> - <translation type="unfinished"/> + <translation>KeePassXC-Browser 瀏覽器擴充功能存取確認</translation> </message> <message> <source>Remember this decision</source> @@ -194,11 +222,11 @@ Please select whether you want to allow access.</source> </message> <message> <source>This is required for accessing your databases with KeePassXC-Browser</source> - <translation type="unfinished"/> + <translation>需要使用 KeePassXC-Browser 瀏覽器擴充功能存取你的資料庫</translation> </message> <message> <source>Enable KeepassXC browser integration</source> - <translation type="unfinished"/> + <translation>啟用 KeepassXC browser 瀏覽器擴充功能整合</translation> </message> <message> <source>General</source> @@ -206,28 +234,28 @@ Please select whether you want to allow access.</source> </message> <message> <source>Enable integration for these browsers:</source> - <translation type="unfinished"/> + <translation>於下列瀏覽器啟用整合功能:</translation> </message> <message> <source>&Google Chrome</source> - <translation type="unfinished"/> + <translation>&Google Chrome</translation> </message> <message> <source>&Firefox</source> - <translation type="unfinished"/> + <translation>&Firefox</translation> </message> <message> <source>&Chromium</source> - <translation type="unfinished"/> + <translation>&Chromium</translation> </message> <message> <source>&Vivaldi</source> - <translation type="unfinished"/> + <translation>&Vivaldi</translation> </message> <message> <source>Show a &notification when credentials are requested</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>要求認證時顯示通知 (&N)</translation> </message> <message> <source>Re&quest to unlock the database if it is locked</source> @@ -235,11 +263,11 @@ Please select whether you want to allow access.</source> </message> <message> <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> - <translation type="unfinished"/> + <translation>只顯示相同協定的項目。(http://, https://, ...)</translation> </message> <message> <source>&Match URL scheme (e.g., https://...)</source> - <translation type="unfinished"/> + <translation>符合網址協定 (例如:https://……) (&M)</translation> </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> @@ -247,25 +275,25 @@ Please select whether you want to allow access.</source> </message> <message> <source>&Return only best-matching credentials</source> - <translation type="unfinished"/> + <translation>只回傳最佳的相符憑證 (&R)</translation> </message> <message> <source>Sort &matching credentials by title</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>依名稱排序符合認證 (&M)</translation> </message> <message> <source>Sort matching credentials by &username</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>依使用者名稱排序符合認證 (&U)</translation> </message> <message> <source>&Disconnect all browsers</source> - <translation type="unfinished"/> + <translation>與所有瀏覽器中斷連線 (&D)</translation> </message> <message> <source>Forget all remembered &permissions</source> - <translation type="unfinished"/> + <translation>取消所有先前記住的權限 (&P)</translation> </message> <message> <source>Advanced</source> @@ -274,12 +302,12 @@ Please select whether you want to allow access.</source> <message> <source>Never &ask before accessing credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>存取認證時不再詢問 (&A)</translation> </message> <message> <source>Never ask before &updating credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>更新認證時不再詢問 (&U)</translation> </message> <message> <source>Only the selected database has to be connected with a client.</source> @@ -288,7 +316,7 @@ Please select whether you want to allow access.</source> <message> <source>Searc&h in all opened databases for matching credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>在所有開啟的資料庫內搜尋相符的認證 (&H)</translation> </message> <message> <source>Automatically creating or updating string fields is not supported.</source> @@ -300,49 +328,49 @@ Please select whether you want to allow access.</source> </message> <message> <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> - <translation type="unfinished"/> + <translation>啟動時自動將 KeePassXC 或 KeePassXC 代理執行檔路徑更新為 native messaging 腳本。</translation> </message> <message> <source>Update &native messaging manifest files at startup</source> - <translation type="unfinished"/> + <translation>啟動時更新 native messaging 的 manifest 檔案 (&N)</translation> </message> <message> <source>Support a proxy application between KeePassXC and browser extension.</source> - <translation type="unfinished"/> + <translation>支援 KeePassXC 和瀏覽器擴充功能之間的代理應用程式。</translation> </message> <message> <source>Use a &proxy application between KeePassXC and browser extension</source> - <translation type="unfinished"/> + <translation>在 KeePassXC 和瀏覽器擴充功能之間使用代理應用程式 (&P)</translation> </message> <message> <source>Use a custom proxy location if you installed a proxy manually.</source> - <translation type="unfinished"/> + <translation>如果自行安裝了代理,請設定自訂代理位置。</translation> </message> <message> <source>Use a &custom proxy location</source> <comment>Meant is the proxy for KeePassXC-Browser</comment> - <translation type="unfinished"/> + <translation>使用自訂代理位置 (&C)</translation> </message> <message> <source>Browse...</source> <extracomment>Button for opening file dialog</extracomment> - <translation type="unfinished"/> + <translation>瀏覽……</translation> </message> <message> <source><b>Warning:</b> The following options can be dangerous!</source> - <translation type="unfinished"/> + <translation><b>警告:</b>下列選項可能極具風險!</translation> </message> <message> <source>Executable Files (*.exe);;All Files (*.*)</source> - <translation type="unfinished"/> + <translation>可執行檔 (* .exe);;所有檔案 (*)</translation> </message> <message> <source>Executable Files (*)</source> - <translation type="unfinished"/> + <translation>可執行檔 (*)</translation> </message> <message> <source>Select custom proxy location</source> - <translation type="unfinished"/> + <translation>選擇自訂代理位置</translation> </message> </context> <context> @@ -356,11 +384,14 @@ Please select whether you want to allow access.</source> If you would like to allow it access to your KeePassXC database, give it a unique name to identify and accept it.</source> - <translation type="unfinished"/> + <translation>你已接收到上述金鑰的關聯請求。 + +如果你允許透過此金鑰存取你的 KeePassXC 資料庫, +請取一個唯一識別名並按下接受。</translation> </message> <message> <source>Save and allow access</source> - <translation type="unfinished"/> + <translation>儲存並允許存取</translation> </message> <message> <source>KeePassXC: Overwrite existing key?</source> @@ -369,7 +400,8 @@ give it a unique name to identify and accept it.</source> <message> <source>A shared encryption key with the name "%1" already exists. Do you want to overwrite it?</source> - <translation type="unfinished"/> + <translation>已存在名為「%1」的共用加密金鑰。 +是否要覆蓋?</translation> </message> <message> <source>KeePassXC: Update Entry</source> @@ -377,7 +409,7 @@ Do you want to overwrite it?</source> </message> <message> <source>Do you want to update the information in %1 - %2?</source> - <translation>更新 %1 到 %2 的資訊?</translation> + <translation>是否要更新 %1 到 %2 的資訊?</translation> </message> <message> <source>KeePassXC: Database locked!</source> @@ -395,7 +427,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>The active database does not contain a settings entry.</source> - <translation type="unfinished"/> + <translation>目前的資料庫中沒有帶有設定的項目。</translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -403,7 +435,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>No shared encryption keys found in KeePassXC Settings.</source> - <translation type="unfinished"/> + <translation>KeePassXC 設定中找不到共享加密金鑰。</translation> </message> <message> <source>KeePassXC: Removed keys from database</source> @@ -411,11 +443,11 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message numerus="yes"> <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>成功從 KeePassXC 移除 %n 個加密金鑰。</numerusform></translation> </message> <message> <source>Removing stored permissions…</source> - <translation type="unfinished"/> + <translation>正在移除所有已儲存的權限……</translation> </message> <message> <source>Abort</source> @@ -427,7 +459,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message numerus="yes"> <source>Successfully removed permissions from %n entry(s).</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>成功從 %n 個項目中移除權限。</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -512,14 +544,16 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Legacy key file format</source> - <translation type="unfinished"/> + <translation>舊式金鑰檔案格式</translation> </message> <message> <source>You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>你正在使用未來將不再支援的舊式金鑰檔案格式。 + +請考慮產生新的金鑰。</translation> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -569,7 +603,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Text is qualified by</source> - <translation type="unfinished"/> + <translation>文字資料標示符號</translation> </message> <message> <source>Fields are separated by</source> @@ -577,15 +611,15 @@ Please consider generating a new key file.</source> </message> <message> <source>Comments start with</source> - <translation type="unfinished"/> + <translation>註解標示符號</translation> </message> <message> <source>First record has field names</source> - <translation type="unfinished"/> + <translation>首行為欄位名稱</translation> </message> <message> <source>Number of headers line to discard</source> - <translation type="unfinished"/> + <translation>要捨棄的標題行數</translation> </message> <message> <source>Consider '\' an escape character</source> @@ -597,7 +631,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Column layout</source> - <translation type="unfinished"/> + <translation>欄位布局</translation> </message> <message> <source>Not present in CSV file</source> @@ -653,15 +687,15 @@ Please consider generating a new key file.</source> <name>CsvParserModel</name> <message numerus="yes"> <source>%n byte(s), </source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>%n 位元組,</numerusform></translation> </message> <message numerus="yes"> <source>%n row(s), </source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>%n 行,</numerusform></translation> </message> <message numerus="yes"> <source>%n column(s)</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>%n 列,</numerusform></translation> </message> </context> <context> @@ -688,7 +722,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Challenge Response:</source> - <translation>挑戰驗證:</translation> + <translation>挑戰回應:</translation> </message> <message> <source>Unable to open the database.</source> @@ -700,18 +734,20 @@ Please consider generating a new key file.</source> </message> <message> <source>Legacy key file format</source> - <translation type="unfinished"/> + <translation>舊式金鑰檔案格式</translation> </message> <message> <source>You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>你正在使用未來將不再支援的舊式金鑰檔案格式。 + +請考慮產生新的金鑰。</translation> </message> <message> <source>Don't show this warning again</source> - <translation type="unfinished"/> + <translation>不再顯示此警告</translation> </message> <message> <source>All files</source> @@ -770,52 +806,66 @@ You can now save it.</source> </message> <message> <source>Encryption</source> - <translation type="unfinished"/> + <translation>加密</translation> </message> <message> <source>Number of rounds too high</source> <comment>Key transformation rounds</comment> - <translation type="unfinished"/> + <translation>回合數太高</translation> </message> <message> <source>You are using a very high number of key transform rounds with Argon2. If you keep this number, your database may take hours or days (or even longer) to open!</source> - <translation type="unfinished"/> + <translation>你正在對 Argon2 使用相當高的金鑰轉換回合數。 + +如果仍執意使用此數量,你的資料庫可能需要花費數小時、數天、或是更久的時間才能打開!</translation> </message> <message> <source>Understood, keep number</source> - <translation type="unfinished"/> + <translation>了解,仍使用此數量</translation> </message> <message> <source>Cancel</source> - <translation type="unfinished"/> + <translation>取消</translation> </message> <message> <source>Number of rounds too low</source> <comment>Key transformation rounds</comment> - <translation type="unfinished"/> + <translation>回合數太低</translation> </message> <message> <source>You are using a very low number of key transform rounds with AES-KDF. If you keep this number, your database may be too easy to crack!</source> - <translation type="unfinished"/> + <translation>你正對 AES-KDF 使用過低的金鑰轉換回合數。 + +如果仍執意使用此數量,你的資料庫可能會變得相當簡單即能破解!</translation> </message> <message> <source>KDF unchanged</source> - <translation type="unfinished"/> + <translation>KDF 不變</translation> </message> <message> <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> - <translation type="unfinished"/> + <translation>無法用新的 KDF 參數轉換金鑰;KDF 不變。</translation> + </message> + <message numerus="yes"> + <source> MiB</source> + <comment>Abbreviation for Mebibytes (KDF settings)</comment> + <translation type="unfinished"><numerusform></numerusform></translation> + </message> + <message numerus="yes"> + <source> thread(s)</source> + <comment>Threads for parallel execution (KDF settings)</comment> + <translation type="unfinished"><numerusform></numerusform></translation> </message> </context> <context> <name>DatabaseSettingsWidgetEncryption</name> <message> <source>Encryption Algorithm:</source> - <translation type="unfinished"/> + <translation>加密演算法:</translation> </message> <message> <source>AES: 256 Bit (default)</source> @@ -827,7 +877,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Key Derivation Function:</source> - <translation type="unfinished"/> + <translation>金鑰衍生函數:</translation> </message> <message> <source>Transform rounds:</source> @@ -835,30 +885,22 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Benchmark 1-second delay</source> - <translation type="unfinished"/> + <translation>效能測試一秒延遲</translation> </message> <message> <source>Memory Usage:</source> - <translation type="unfinished"/> - </message> - <message> - <source> MB</source> - <translation type="unfinished"/> + <translation>記憶體使用量:</translation> </message> <message> <source>Parallelism:</source> - <translation type="unfinished"/> - </message> - <message> - <source> thread</source> - <translation type="unfinished"/> + <translation>平行運算:</translation> </message> </context> <context> <name>DatabaseSettingsWidgetGeneral</name> <message> <source>Database Meta Data</source> - <translation type="unfinished"/> + <translation>資料庫中繼資料</translation> </message> <message> <source>Database name:</source> @@ -874,7 +916,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>History Settings</source> - <translation type="unfinished"/> + <translation>歷史設定</translation> </message> <message> <source>Max. history items:</source> @@ -892,6 +934,14 @@ If you keep this number, your database may be too easy to crack!</source> <source>Use recycle bin</source> <translation>使用回收桶</translation> </message> + <message> + <source>Additional Database Settings</source> + <translation>額外的資料庫設定</translation> + </message> + <message> + <source>Enable &compression (recommended)</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DatabaseTabWidget</name> @@ -990,7 +1040,7 @@ Save changes?</source> </message> <message> <source>New database</source> - <translation>新增資料庫</translation> + <translation>新的資料庫</translation> </message> <message> <source>locked</source> @@ -1014,6 +1064,15 @@ Otherwise your changes are lost.</source> 要在鎖定之前儲存資料庫? 不然則會遺失所有修改。</translation> </message> + <message> + <source>Disable safe saves?</source> + <translation>關閉安全存檔?</translation> + </message> + <message> + <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. +Disable safe saves and try again?</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DatabaseWidget</name> @@ -1055,7 +1114,7 @@ Otherwise your changes are lost.</source> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>真的要將 %n 個項目移到回收桶?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1099,7 +1158,7 @@ Otherwise your changes are lost.</source> </message> <message> <source>File has changed</source> - <translation type="unfinished"/> + <translation>檔案已變更</translation> </message> <message> <source>The database file has changed. Do you want to load the changes?</source> @@ -1112,7 +1171,8 @@ Otherwise your changes are lost.</source> <message> <source>The database file has changed and you have unsaved changes. Do you want to merge your changes?</source> - <translation type="unfinished"/> + <translation>資料庫檔案已變更,且有尚未儲存的變更。 +合併變更?</translation> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -1126,12 +1186,16 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>確定要永久刪除回收桶內的項目?</translation> </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>DetailsWidget</name> <message> <source>Generate TOTP Token</source> - <translation type="unfinished"/> + <translation>產生 TOTP Token</translation> </message> <message> <source>Close</source> @@ -1151,7 +1215,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Expiration</source> - <translation type="unfinished"/> + <translation>過期</translation> </message> <message> <source>Username</source> @@ -1159,15 +1223,15 @@ Do you want to merge your changes?</source> </message> <message> <source>Autotype</source> - <translation type="unfinished"/> + <translation>自動輸入</translation> </message> <message> <source>Searching</source> - <translation type="unfinished"/> + <translation>搜尋中</translation> </message> <message> <source>Attributes</source> - <translation type="unfinished"/> + <translation>屬性</translation> </message> <message> <source>Attachments</source> @@ -1195,19 +1259,19 @@ Do you want to merge your changes?</source> </message> <message> <source>Never</source> - <translation type="unfinished"/> + <translation>從不</translation> </message> <message> <source>[PROTECTED]</source> - <translation type="unfinished"/> + <translation>[被保護]</translation> </message> <message> <source>Disabled</source> - <translation type="unfinished"/> + <translation>停用</translation> </message> <message> <source>Enabled</source> - <translation type="unfinished"/> + <translation>啟用</translation> </message> </context> <context> @@ -1238,27 +1302,27 @@ Do you want to merge your changes?</source> </message> <message> <source>SSH Agent</source> - <translation type="unfinished"/> + <translation>SSH 代理</translation> </message> <message> <source>n/a</source> - <translation type="unfinished"/> + <translation>無</translation> </message> <message> <source>(encrypted)</source> - <translation type="unfinished"/> + <translation>(已加密)</translation> </message> <message> <source>Select private key</source> - <translation type="unfinished"/> + <translation>選擇私密金鑰</translation> </message> <message> <source>File too large to be a private key</source> - <translation type="unfinished"/> + <translation>檔案太大,無法作為私密金鑰</translation> </message> <message> <source>Failed to open private key</source> - <translation type="unfinished"/> + <translation>無法打開私密金鑰</translation> </message> <message> <source>Entry history</source> @@ -1290,11 +1354,11 @@ Do you want to merge your changes?</source> </message> <message> <source>[PROTECTED]</source> - <translation type="unfinished"/> + <translation>[被保護]</translation> </message> <message> <source>Press reveal to view or edit</source> - <translation type="unfinished"/> + <translation>請按「揭示」以檢視或編輯</translation> </message> <message> <source>Tomorrow</source> @@ -1302,22 +1366,34 @@ Do you want to merge your changes?</source> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>%n 個禮拜</numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>%n 個月</numerusform></translation> </message> <message> <source>1 year</source> <translation>1 年</translation> </message> + <message> + <source>Apply generated password?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you want to apply the generated password to this entry?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry updated successfully.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAdvanced</name> <message> <source>Additional attributes</source> - <translation>額外屬性</translation> + <translation>額外的屬性</translation> </message> <message> <source>Add</source> @@ -1343,6 +1419,14 @@ Do you want to merge your changes?</source> <source>Attachments</source> <translation>附件</translation> </message> + <message> + <source>Foreground Color:</source> + <translation type="unfinished"/> + </message> + <message> + <source>Background Color:</source> + <translation type="unfinished"/> + </message> </context> <context> <name>EditEntryWidgetAutoType</name> @@ -1375,12 +1459,8 @@ Do you want to merge your changes?</source> <translation>視窗標題:</translation> </message> <message> - <source>Use default se&quence</source> - <translation>使用預設序列 (&Q)</translation> - </message> - <message> - <source>Set custo&m sequence:</source> - <translation>設定自訂序列 (&M):</translation> + <source>Use a specific sequence for this association:</source> + <translation type="unfinished"/> </message> </context> <context> @@ -1430,7 +1510,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Toggle the checkbox to reveal the notes section.</source> - <translation type="unfinished"/> + <translation>切換核取方塊以揭示備註欄位。</translation> </message> <message> <source>Username:</source> @@ -1445,43 +1525,43 @@ Do you want to merge your changes?</source> <name>EditEntryWidgetSSHAgent</name> <message> <source>Form</source> - <translation type="unfinished"/> + <translation>表單</translation> </message> <message> <source>Remove key from agent after</source> - <translation type="unfinished"/> + <translation>從代理中刪除金鑰於</translation> </message> <message> <source> seconds</source> - <translation type="unfinished"/> + <translation> 秒</translation> </message> <message> <source>Fingerprint</source> - <translation type="unfinished"/> + <translation>指紋</translation> </message> <message> <source>Remove key from agent when database is closed/locked</source> - <translation type="unfinished"/> + <translation>當關閉/鎖定資料庫時從代理中刪除金鑰</translation> </message> <message> <source>Public key</source> - <translation type="unfinished"/> + <translation>公開金鑰</translation> </message> <message> <source>Add key to agent when database is opened/unlocked</source> - <translation type="unfinished"/> + <translation>當打開/解鎖資料庫時向代理新增金鑰</translation> </message> <message> <source>Comment</source> - <translation type="unfinished"/> + <translation>評論</translation> </message> <message> <source>Decrypt</source> - <translation type="unfinished"/> + <translation>解密</translation> </message> <message> <source>n/a</source> - <translation type="unfinished"/> + <translation>無</translation> </message> <message> <source>Copy to clipboard</source> @@ -1489,32 +1569,32 @@ Do you want to merge your changes?</source> </message> <message> <source>Private key</source> - <translation type="unfinished"/> + <translation>私密金鑰</translation> </message> <message> <source>External file</source> - <translation type="unfinished"/> + <translation>外部檔案</translation> </message> <message> <source>Browse...</source> <extracomment>Button for opening file dialog</extracomment> - <translation type="unfinished"/> + <translation>瀏覽……</translation> </message> <message> <source>Attachment</source> - <translation type="unfinished"/> + <translation>附件</translation> </message> <message> <source>Add to agent</source> - <translation type="unfinished"/> + <translation>新增到代理</translation> </message> <message> <source>Remove from agent</source> - <translation type="unfinished"/> + <translation>從代理中刪除</translation> </message> <message> <source>Require user confirmation when this key is used</source> - <translation type="unfinished"/> + <translation>使用此金鑰時需要使用者確認</translation> </message> </context> <context> @@ -1660,6 +1740,31 @@ Do you want to merge your changes?</source> <source>Uuid:</source> <translation>Uuid:</translation> </message> + <message> + <source>Plugin Data</source> + <translation type="unfinished"/> + </message> + <message> + <source>Remove</source> + <translation>移除</translation> + </message> + <message> + <source>Delete plugin data?</source> + <translation type="unfinished"/> + </message> + <message> + <source>Do you really want to delete the selected plugin data? +This may cause the affected plugins to malfunction.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Key</source> + <translation type="unfinished"/> + </message> + <message> + <source>Value</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Entry</name> @@ -1677,14 +1782,14 @@ Do you want to merge your changes?</source> </message> <message> <source>Size</source> - <translation type="unfinished"/> + <translation>大小</translation> </message> </context> <context> <name>EntryAttachmentsWidget</name> <message> <source>Form</source> - <translation type="unfinished"/> + <translation>表單</translation> </message> <message> <source>Add</source> @@ -1704,11 +1809,11 @@ Do you want to merge your changes?</source> </message> <message> <source>Select files</source> - <translation type="unfinished"/> + <translation>選擇檔案</translation> </message> <message numerus="yes"> <source>Are you sure you want to remove %n attachment(s)?</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>確定移除 %n 個附件?</numerusform></translation> </message> <message> <source>Confirm Remove</source> @@ -1716,40 +1821,45 @@ Do you want to merge your changes?</source> </message> <message> <source>Save attachments</source> - <translation type="unfinished"/> + <translation>儲存附件</translation> </message> <message> <source>Unable to create directory: %1</source> - <translation type="unfinished"/> + <translation>無法建立資料夾: +%1</translation> </message> <message> <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> - <translation type="unfinished"/> + <translation>確定要以附件覆蓋現有的檔案 "%1" 嗎?</translation> </message> <message> <source>Confirm overwrite</source> - <translation type="unfinished"/> + <translation>確認覆蓋</translation> </message> <message> <source>Unable to save attachments: %1</source> - <translation type="unfinished"/> + <translation>無法保存附件: +%1</translation> </message> <message> <source>Unable to open attachment: %1</source> - <translation type="unfinished"/> + <translation>無法打開附件: +%1</translation> </message> <message> <source>Unable to open attachments: %1</source> - <translation type="unfinished"/> + <translation>無法打開附件: +%1</translation> </message> <message> <source>Unable to open files: %1</source> - <translation type="unfinished"/> + <translation>無法打開檔案: +%1</translation> </message> </context> <context> @@ -1801,6 +1911,65 @@ Do you want to merge your changes?</source> <source>URL</source> <translation>網址</translation> </message> + <message> + <source>Never</source> + <translation>從不</translation> + </message> + <message> + <source>Password</source> + <translation>密碼</translation> + </message> + <message> + <source>Notes</source> + <translation>附註</translation> + </message> + <message> + <source>Expires</source> + <translation>過期</translation> + </message> + <message> + <source>Created</source> + <translation>已建立</translation> + </message> + <message> + <source>Modified</source> + <translation>已修改</translation> + </message> + <message> + <source>Accessed</source> + <translation>已存取</translation> + </message> + <message> + <source>Attachments</source> + <translation>附件</translation> + </message> +</context> +<context> + <name>EntryView</name> + <message> + <source>Customize View</source> + <translation type="unfinished"/> + </message> + <message> + <source>Hide Usernames</source> + <translation>隱藏使用者名稱</translation> + </message> + <message> + <source>Hide Passwords</source> + <translation>隱藏密碼</translation> + </message> + <message> + <source>Fit to window</source> + <translation type="unfinished"/> + </message> + <message> + <source>Fit to contents</source> + <translation type="unfinished"/> + </message> + <message> + <source>Reset to defaults</source> + <translation>重設為預設</translation> + </message> </context> <context> <name>Group</name> @@ -1813,11 +1982,11 @@ Do you want to merge your changes?</source> <name>HostInstaller</name> <message> <source>KeePassXC: Cannot save file!</source> - <translation type="unfinished"/> + <translation>KeePassXC: 無法保存檔案!</translation> </message> <message> <source>Cannot save the native messaging script file.</source> - <translation type="unfinished"/> + <translation>無法保存 native messaging 指令檔。</translation> </message> </context> <context> @@ -1870,6 +2039,10 @@ Do you want to merge your changes?</source> <source>Ensure that the password contains characters from every group</source> <translation>確保密碼包含每一組字元</translation> </message> + <message> + <source>Extended ASCII</source> + <translation>擴展 ASCII 碼</translation> + </message> </context> <context> <name>KMessageWidget</name> @@ -1890,7 +2063,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Unable to issue challenge-response.</source> - <translation type="unfinished"/> + <translation>無法發出挑戰-回應。</translation> </message> <message> <source>Wrong key or database file is corrupt.</source> @@ -1901,7 +2074,7 @@ Do you want to merge your changes?</source> <name>Kdbx3Writer</name> <message> <source>Unable to issue challenge-response.</source> - <translation type="unfinished"/> + <translation>無法發出挑戰-回應。</translation> </message> <message> <source>Unable to calculate master key</source> @@ -1912,7 +2085,7 @@ Do you want to merge your changes?</source> <name>Kdbx4Reader</name> <message> <source>missing database headers</source> - <translation type="unfinished"/> + <translation>缺少資料庫標頭</translation> </message> <message> <source>Unable to calculate master key</source> @@ -1920,127 +2093,127 @@ Do you want to merge your changes?</source> </message> <message> <source>Invalid header checksum size</source> - <translation type="unfinished"/> + <translation>無效的標頭校驗大小</translation> </message> <message> <source>Header SHA256 mismatch</source> - <translation type="unfinished"/> + <translation>SHA256 標頭不相符</translation> </message> <message> <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> - <translation type="unfinished"/> + <translation>金鑰不正確或是資料庫損壞。(HMAC 不相符)</translation> </message> <message> <source>Unknown cipher</source> - <translation type="unfinished"/> + <translation>未知的加密</translation> </message> <message> <source>Invalid header id size</source> - <translation type="unfinished"/> + <translation>無效的標頭 ID 大小</translation> </message> <message> <source>Invalid header field length</source> - <translation type="unfinished"/> + <translation>無效的標頭欄位長度</translation> </message> <message> <source>Invalid header data length</source> - <translation type="unfinished"/> + <translation>無效的資料長度</translation> </message> <message> <source>Failed to open buffer for KDF parameters in header</source> - <translation type="unfinished"/> + <translation>無法打開標頭中 KDF 參數的緩衝區</translation> </message> <message> <source>Unsupported key derivation function (KDF) or invalid parameters</source> - <translation type="unfinished"/> + <translation>不支援的金鑰衍生函數 (KDF) 或參數無效</translation> </message> <message> <source>Legacy header fields found in KDBX4 file.</source> - <translation type="unfinished"/> + <translation>在 KDBX4 檔中找到的舊式標頭欄位。</translation> </message> <message> <source>Invalid inner header id size</source> - <translation type="unfinished"/> + <translation>無效的內部標頭 ID 大小</translation> </message> <message> <source>Invalid inner header field length</source> - <translation type="unfinished"/> + <translation>無效的內部標頭欄位長度</translation> </message> <message> <source>Invalid inner header binary size</source> - <translation type="unfinished"/> + <translation>無效的內部標頭二進位大小</translation> </message> <message> <source>Unsupported KeePass variant map version.</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>不支援的 KeePass 變體映射版本。</translation> </message> <message> <source>Invalid variant map entry name length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>無效的變體映射項目名稱長度</translation> </message> <message> <source>Invalid variant map entry name data</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>無效的變體映射項目名稱資料</translation> </message> <message> <source>Invalid variant map entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>無效的變體映射項目值長度</translation> </message> <message> <source>Invalid variant map entry value data</source> <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>無效的變數映射項目值資料</translation> </message> <message> <source>Invalid variant map Bool entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>無效的變體映射布林項目值長度</translation> </message> <message> <source>Invalid variant map Int32 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>無效的變體映射 Int32 項目值長度</translation> </message> <message> <source>Invalid variant map UInt32 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>無效的變體映射 UInt32 項目值長度</translation> </message> <message> <source>Invalid variant map Int64 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>無效的變體映射 Int64 項目值長度</translation> </message> <message> <source>Invalid variant map UInt64 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>無效的變體映射 UInt64 項目值長度</translation> </message> <message> <source>Invalid variant map entry type</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>無效的變體映射項目類型</translation> </message> <message> <source>Invalid variant map field type size</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>無效的變體映射欄位類型大小</translation> </message> </context> <context> <name>Kdbx4Writer</name> <message> <source>Invalid symmetric cipher algorithm.</source> - <translation type="unfinished"/> + <translation>無效的對稱密碼演算法。</translation> </message> <message> <source>Invalid symmetric cipher IV size.</source> <comment>IV = Initialization Vector for symmetric cipher</comment> - <translation type="unfinished"/> + <translation>無效的對稱密碼 IV 大小。</translation> </message> <message> <source>Unable to calculate master key</source> @@ -2049,50 +2222,50 @@ Do you want to merge your changes?</source> <message> <source>Failed to serialize KDF parameters variant map</source> <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>無法序列化 KDF 參數變體映射</translation> </message> </context> <context> <name>KdbxReader</name> <message> <source>Invalid cipher uuid length</source> - <translation type="unfinished"/> + <translation>無效的加密法 uuid 長度</translation> </message> <message> <source>Unsupported cipher</source> - <translation type="unfinished"/> + <translation>不支援的加密</translation> </message> <message> <source>Invalid compression flags length</source> - <translation type="unfinished"/> + <translation>不正確壓縮旗幟長度</translation> </message> <message> <source>Unsupported compression algorithm</source> - <translation type="unfinished"/> + <translation>不支援的壓縮演算法</translation> </message> <message> <source>Invalid master seed size</source> - <translation type="unfinished"/> + <translation>無效的主種子大小</translation> </message> <message> <source>Invalid transform seed size</source> - <translation type="unfinished"/> + <translation>無效的轉換種子大小</translation> </message> <message> <source>Invalid transform rounds size</source> - <translation type="unfinished"/> + <translation>無效的轉換回合數</translation> </message> <message> <source>Invalid start bytes size</source> - <translation type="unfinished"/> + <translation>無效的起始位元組大小</translation> </message> <message> <source>Invalid random stream id size</source> - <translation type="unfinished"/> + <translation>無效的隨機資料流 ID 大小</translation> </message> <message> <source>Invalid inner random stream cipher</source> - <translation type="unfinished"/> + <translation>無效的內部隨機資料流密碼</translation> </message> <message> <source>Not a KeePass database.</source> @@ -2110,131 +2283,131 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Unsupported KeePass 2 database version.</source> - <translation type="unfinished"/> + <translation>不支援的 KeePass 2 資料庫版本。</translation> </message> </context> <context> <name>KdbxXmlReader</name> <message> <source>XML parsing failure: %1</source> - <translation type="unfinished"/> + <translation>XML 分析失敗:%1</translation> </message> <message> <source>No root group</source> - <translation type="unfinished"/> + <translation>無根權限群組</translation> </message> <message> <source>Missing icon uuid or data</source> - <translation type="unfinished"/> + <translation>缺少圖示的 uuid 或資料</translation> </message> <message> <source>Missing custom data key or value</source> - <translation type="unfinished"/> + <translation>缺少自訂資料鍵或值</translation> </message> <message> <source>Multiple group elements</source> - <translation type="unfinished"/> + <translation>多重群組元素</translation> </message> <message> <source>Null group uuid</source> - <translation type="unfinished"/> + <translation>空的群組 uuid</translation> </message> <message> <source>Invalid group icon number</source> - <translation type="unfinished"/> + <translation>無效的群組圖示標號</translation> </message> <message> <source>Invalid EnableAutoType value</source> - <translation type="unfinished"/> + <translation>無效的 EnableAutoType 值</translation> </message> <message> <source>Invalid EnableSearching value</source> - <translation type="unfinished"/> + <translation>無效的 EnableSearching 值</translation> </message> <message> <source>No group uuid found</source> - <translation type="unfinished"/> + <translation>找不到群組 uuid</translation> </message> <message> <source>Null DeleteObject uuid</source> - <translation type="unfinished"/> + <translation>空的 DeleteObject uuid</translation> </message> <message> <source>Missing DeletedObject uuid or time</source> - <translation type="unfinished"/> + <translation>缺少 DeletedObject uuid 或時間</translation> </message> <message> <source>Null entry uuid</source> - <translation type="unfinished"/> + <translation>空的項目 uuid</translation> </message> <message> <source>Invalid entry icon number</source> - <translation type="unfinished"/> + <translation>無效的項目圖示編號</translation> </message> <message> <source>History element in history entry</source> - <translation type="unfinished"/> + <translation>歷史記錄項目中的歷史元素</translation> </message> <message> <source>No entry uuid found</source> - <translation type="unfinished"/> + <translation>找不到項目 uuid</translation> </message> <message> <source>History element with different uuid</source> - <translation type="unfinished"/> + <translation>具有不同 uuid 的歷史元素</translation> </message> <message> <source>Unable to decrypt entry string</source> - <translation type="unfinished"/> + <translation>無法解密項目字串</translation> </message> <message> <source>Duplicate custom attribute found</source> - <translation type="unfinished"/> + <translation>找到重複的自訂屬性</translation> </message> <message> <source>Entry string key or value missing</source> - <translation type="unfinished"/> + <translation>缺少項目字串或值</translation> </message> <message> <source>Duplicate attachment found</source> - <translation type="unfinished"/> + <translation>找到重複的附件</translation> </message> <message> <source>Entry binary key or value missing</source> - <translation type="unfinished"/> + <translation>缺少項目二進位金鑰或值</translation> </message> <message> <source>Auto-type association window or sequence missing</source> - <translation type="unfinished"/> + <translation>缺少自動輸入關聯視窗或序列</translation> </message> <message> <source>Invalid bool value</source> - <translation type="unfinished"/> + <translation>無效的布林值</translation> </message> <message> <source>Invalid date time value</source> - <translation type="unfinished"/> + <translation>無效的日期時間值</translation> </message> <message> <source>Invalid color value</source> - <translation type="unfinished"/> + <translation>無效的顏色值</translation> </message> <message> <source>Invalid color rgb part</source> - <translation type="unfinished"/> + <translation>無效的 rgb 顏色部分</translation> </message> <message> <source>Invalid number value</source> - <translation type="unfinished"/> + <translation>無效的數值</translation> </message> <message> <source>Invalid uuid value</source> - <translation type="unfinished"/> + <translation>無效的 uuid 值</translation> </message> <message> <source>Unable to decompress binary</source> <extracomment>Translator meant is a binary data inside an entry</extracomment> - <translation type="unfinished"/> + <translation>無法解壓縮二進位資料</translation> </message> </context> <context> @@ -2269,31 +2442,31 @@ This is a one-way migration. You won't be able to open the imported databas <message> <source>Unable to read encryption IV</source> <comment>IV = Initialization Vector for symmetric cipher</comment> - <translation type="unfinished"/> + <translation>無法讀取加密 IV</translation> </message> <message> <source>Invalid number of groups</source> - <translation type="unfinished"/> + <translation>無效的群組數</translation> </message> <message> <source>Invalid number of entries</source> - <translation type="unfinished"/> + <translation>無效的項目數</translation> </message> <message> <source>Invalid content hash size</source> - <translation type="unfinished"/> + <translation>無效的內容雜湊大小</translation> </message> <message> <source>Invalid transform seed size</source> - <translation type="unfinished"/> + <translation>無效的轉換種子大小</translation> </message> <message> <source>Invalid number of transform rounds</source> - <translation type="unfinished"/> + <translation>無效的轉換回合數</translation> </message> <message> <source>Unable to construct group tree</source> - <translation type="unfinished"/> + <translation>無法構成群組樹</translation> </message> <message> <source>Root</source> @@ -2309,102 +2482,102 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Key transformation failed</source> - <translation type="unfinished"/> + <translation>金鑰轉換失敗</translation> </message> <message> <source>Invalid group field type number</source> - <translation type="unfinished"/> + <translation>無效的群組欄位類型編號</translation> </message> <message> <source>Invalid group field size</source> - <translation type="unfinished"/> + <translation>無效的群組欄位大小</translation> </message> <message> <source>Read group field data doesn't match size</source> - <translation type="unfinished"/> + <translation>讀取群組欄位資料大小不相符</translation> </message> <message> <source>Incorrect group id field size</source> - <translation type="unfinished"/> + <translation>無效的群組 id 欄位大小</translation> </message> <message> <source>Incorrect group creation time field size</source> - <translation type="unfinished"/> + <translation>無效的群組建立時間欄位大小</translation> </message> <message> <source>Incorrect group modification time field size</source> - <translation type="unfinished"/> + <translation>無效的群組修改時間欄位大小</translation> </message> <message> <source>Incorrect group access time field size</source> - <translation type="unfinished"/> + <translation>無效的群組存取時間欄位大小</translation> </message> <message> <source>Incorrect group expiry time field size</source> - <translation type="unfinished"/> + <translation>無效的群組過期時間欄位大小</translation> </message> <message> <source>Incorrect group icon field size</source> - <translation type="unfinished"/> + <translation>無效的群組圖示欄位大小</translation> </message> <message> <source>Incorrect group level field size</source> - <translation type="unfinished"/> + <translation>無效的群組級別欄位大小</translation> </message> <message> <source>Invalid group field type</source> - <translation type="unfinished"/> + <translation>無效的群組欄位類型</translation> </message> <message> <source>Missing group id or level</source> - <translation type="unfinished"/> + <translation>缺少群組 id 或級別</translation> </message> <message> <source>Missing entry field type number</source> - <translation type="unfinished"/> + <translation>缺少項目欄位類型編號</translation> </message> <message> <source>Invalid entry field size</source> - <translation type="unfinished"/> + <translation>無效的項目欄位大小</translation> </message> <message> <source>Read entry field data doesn't match size</source> - <translation type="unfinished"/> + <translation>讀取的項目欄位資料與大小不相符</translation> </message> <message> <source>Invalid entry uuid field size</source> - <translation type="unfinished"/> + <translation>無效的項目 uuid 欄位大小</translation> </message> <message> <source>Invalid entry group id field size</source> - <translation type="unfinished"/> + <translation>無效的項目群組 id 欄位大小</translation> </message> <message> <source>Invalid entry icon field size</source> - <translation type="unfinished"/> + <translation>無效的項目圖示欄位大小</translation> </message> <message> <source>Invalid entry creation time field size</source> - <translation type="unfinished"/> + <translation>無效的項目建立時間欄位大小</translation> </message> <message> <source>Invalid entry modification time field size</source> - <translation type="unfinished"/> + <translation>無效的項目修改時間欄位大小</translation> </message> <message> <source>Invalid entry expiry time field size</source> - <translation type="unfinished"/> + <translation>無效的項目過期時間欄位大小</translation> </message> <message> <source>Invalid entry field type</source> - <translation type="unfinished"/> + <translation>無效的項目欄位類型</translation> </message> </context> <context> <name>Main</name> <message> <source>Existing single-instance lock file is invalid. Launching new instance.</source> - <translation type="unfinished"/> + <translation>現有的單實例鎖定檔無效。正在啟動新實例。</translation> </message> <message> <source>The lock file could not be created. Single-instance mode disabled.</source> @@ -2451,7 +2624,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Time-based one-time password</source> - <translation type="unfinished"/> + <translation>限時單次密碼</translation> </message> <message> <source>&Groups</source> @@ -2579,7 +2752,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Copy title to clipboard</source> - <translation type="unfinished"/> + <translation>將標題複製到剪貼簿</translation> </message> <message> <source>&URL</source> @@ -2587,7 +2760,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Copy URL to clipboard</source> - <translation type="unfinished"/> + <translation>將 URL 複製到剪貼簿</translation> </message> <message> <source>&Notes</source> @@ -2595,7 +2768,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Copy notes to clipboard</source> - <translation type="unfinished"/> + <translation>將備註複製到剪貼簿</translation> </message> <message> <source>&Export to CSV file...</source> @@ -2627,7 +2800,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>E&mpty recycle bin</source> - <translation type="unfinished"/> + <translation>清空回收桶 (&M)</translation> </message> <message> <source>Clear history</source> @@ -2639,7 +2812,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> - <translation type="unfinished"/> + <translation><p>您似乎正在使用 KeePassHTTP 瀏覽器整合功能>此功能已經棄用,未來我們將進行移除。<br>並請改用 KeePassXC-Browser 瀏覽器擴充功能!有關遷移的說明,請造訪我們的 <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">遷移指南</a> (警告 %1/3)</p></translation> </message> <message> <source>read-only</source> @@ -2681,99 +2854,111 @@ This is a one-way migration. You won't be able to open the imported databas <source>Please touch the button on your YubiKey!</source> <translation>請觸摸你 YubiKey 上的按鈕!</translation> </message> + <message> + <source>WARNING: You are using an unstable build of KeePassXC! +There is a high risk of corruption, maintain a backup of your databases. +This version is not meant for production use.</source> + <translation>警告: 你正在使用非穩定版本的 KeePassXC! +具有高風險的破壞可能, 請備份你的資料庫. +這個版本不是給一般使用者使用.</translation> + </message> </context> <context> <name>OpenSSHKey</name> <message> <source>Invalid key file, expecting an OpenSSH key</source> - <translation type="unfinished"/> + <translation>無效的金鑰檔案,預期應是 OpenSSH 金鑰</translation> </message> <message> <source>PEM boundary mismatch</source> - <translation type="unfinished"/> - </message> - <message> - <source>This is not an OpenSSH key, only modern keys are supported</source> - <translation type="unfinished"/> + <translation>PEM 邊界數量不對稱</translation> </message> <message> <source>Base64 decoding failed</source> - <translation type="unfinished"/> + <translation>Base64 解碼失敗</translation> </message> <message> <source>Key file way too small.</source> - <translation type="unfinished"/> + <translation>金鑰檔太小。</translation> </message> <message> <source>Key file magic header id invalid</source> - <translation type="unfinished"/> + <translation>金鑰檔魔術標頭 id 無效</translation> </message> <message> <source>Found zero keys</source> - <translation type="unfinished"/> + <translation>找到零個金鑰</translation> </message> <message> <source>Failed to read public key.</source> - <translation type="unfinished"/> + <translation>無法讀取公開金鑰。</translation> </message> <message> <source>Corrupted key file, reading private key failed</source> - <translation type="unfinished"/> + <translation>金鑰檔損壞,讀取私密金鑰失敗</translation> </message> <message> <source>No private key payload to decrypt</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown cipher: </source> - <translation type="unfinished"/> + <translation>私密金鑰中沒有載體可解密</translation> </message> <message> <source>Trying to run KDF without cipher</source> - <translation type="unfinished"/> + <translation>嘗試運行無加密的 KDF</translation> </message> <message> <source>Passphrase is required to decrypt this key</source> - <translation type="unfinished"/> + <translation>需要密碼短語以解密此金鑰</translation> </message> <message> <source>Key derivation failed, key file corrupted?</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown KDF: </source> - <translation type="unfinished"/> + <translation>金鑰衍生失敗,金鑰檔已損壞?</translation> </message> <message> <source>Decryption failed, wrong passphrase?</source> - <translation type="unfinished"/> + <translation>解密失敗,密碼短語錯誤?</translation> </message> <message> <source>Unexpected EOF while reading public key</source> - <translation type="unfinished"/> - </message> - <message> - <source>Unknown key type: </source> - <translation type="unfinished"/> + <translation>讀取公開金鑰時出現意外的檔案結尾</translation> </message> <message> <source>Unexpected EOF while reading private key</source> - <translation type="unfinished"/> + <translation>讀取私密金鑰時出現意外的檔案結尾</translation> </message> <message> <source>Can't write public key as it is empty</source> - <translation type="unfinished"/> + <translation>無法寫入公開金鑰,因為它是空的</translation> </message> <message> <source>Unexpected EOF when writing public key</source> - <translation type="unfinished"/> + <translation>編寫公開金鑰時出現意外的檔案結尾</translation> </message> <message> <source>Can't write private key as it is empty</source> - <translation type="unfinished"/> + <translation>無法寫入私密金鑰,因為它是空的</translation> </message> <message> <source>Unexpected EOF when writing private key</source> + <translation>編寫私密金鑰時出現意外的檔案結尾</translation> + </message> + <message> + <source>Unsupported key type: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown cipher: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Cipher IV is too short for MD5 kdf</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown KDF: %1</source> + <translation type="unfinished"/> + </message> + <message> + <source>Unknown key type: %1</source> <translation type="unfinished"/> </message> </context> @@ -2798,7 +2983,7 @@ This is a one-way migration. You won't be able to open the imported databas <message> <source>Sh&ow a notification when credentials are requested</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation>要求憑證時顯示通知 (&O)</translation> + <translation>要求認證時顯示通知 (&O)</translation> </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> @@ -2882,11 +3067,11 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source><b>Warning:</b> The following options can be dangerous!</source> - <translation type="unfinished"/> + <translation><b>警告:</b>下列選項可能極具風險!</translation> </message> <message> <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> - <translation type="unfinished"/> + <translation>KeePassHTTP 已經棄用,未來我們將進行移除。<br>並請改用 KeePassXC-Browser 瀏覽器擴充功能!有關遷移的說明,請造訪我們的 <a href="https://keepassxc.org/docs/keepassxc-browser-migration">遷移指南</a>。</p></translation> </message> <message> <source>Cannot bind to privileged ports</source> @@ -3027,71 +3212,71 @@ Using default port 19455.</source> <name>QObject</name> <message> <source>Database not opened</source> - <translation type="unfinished"/> + <translation>資料庫未開啟</translation> </message> <message> <source>Database hash not available</source> - <translation type="unfinished"/> + <translation>資料庫雜湊不可用</translation> </message> <message> <source>Client public key not received</source> - <translation type="unfinished"/> + <translation>未收到用戶端公開金鑰</translation> </message> <message> <source>Cannot decrypt message</source> - <translation type="unfinished"/> + <translation>無法解密訊息</translation> </message> <message> <source>Timeout or cannot connect to KeePassXC</source> - <translation type="unfinished"/> + <translation>逾時或無法連接到 KeePassXC</translation> </message> <message> <source>Action cancelled or denied</source> - <translation type="unfinished"/> + <translation>操作被取消或被拒絕</translation> </message> <message> <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> - <translation type="unfinished"/> + <translation>無法加密訊息或未找到公開金鑰。是否在 KeePassXC 中啟用了 native messaging 功能?</translation> </message> <message> <source>KeePassXC association failed, try again</source> - <translation type="unfinished"/> + <translation>KeePassXC 關聯失敗,請重試</translation> </message> <message> <source>Key change was not successful</source> - <translation type="unfinished"/> + <translation>金鑰更改不成功</translation> </message> <message> <source>Encryption key is not recognized</source> - <translation type="unfinished"/> + <translation>加密金鑰未被識別</translation> </message> <message> <source>No saved databases found</source> - <translation type="unfinished"/> + <translation>找不到已保存的資料庫</translation> </message> <message> <source>Incorrect action</source> - <translation type="unfinished"/> + <translation>錯誤的操作</translation> </message> <message> <source>Empty message received</source> - <translation type="unfinished"/> + <translation>收到空消息</translation> </message> <message> <source>No URL provided</source> - <translation type="unfinished"/> + <translation>未提供 URL</translation> </message> <message> <source>No logins found</source> - <translation type="unfinished"/> + <translation>找不到登入資訊</translation> </message> <message> <source>Unknown error</source> - <translation type="unfinished"/> + <translation>未知的錯誤</translation> </message> <message> <source>Add a new entry to a database.</source> - <translation type="unfinished"/> + <translation>新增項目到資料庫</translation> </message> <message> <source>Path of the database.</source> @@ -3099,23 +3284,23 @@ Using default port 19455.</source> </message> <message> <source>Key file of the database.</source> - <translation type="unfinished"/> + <translation>資料庫的金鑰檔案。</translation> </message> <message> <source>path</source> - <translation type="unfinished"/> + <translation>路徑</translation> </message> <message> <source>Username for the entry.</source> - <translation type="unfinished"/> + <translation>此項目的使用者名稱。</translation> </message> <message> <source>username</source> - <translation type="unfinished"/> + <translation>使用者名稱</translation> </message> <message> <source>URL for the entry.</source> - <translation type="unfinished"/> + <translation>此項目的網址</translation> </message> <message> <source>URL</source> @@ -3123,64 +3308,64 @@ Using default port 19455.</source> </message> <message> <source>Prompt for the entry's password.</source> - <translation type="unfinished"/> + <translation>提示此項目的密碼。</translation> </message> <message> <source>Generate a password for the entry.</source> - <translation type="unfinished"/> + <translation>產生此項目的密碼。</translation> </message> <message> <source>Length for the generated password.</source> - <translation type="unfinished"/> + <translation>欲產生的密碼長度。</translation> </message> <message> <source>length</source> - <translation type="unfinished"/> + <translation>長度</translation> </message> <message> <source>Path of the entry to add.</source> - <translation type="unfinished"/> + <translation>欲新增的項目路徑</translation> </message> <message> <source>Copy an entry's password to the clipboard.</source> - <translation type="unfinished"/> + <translation>將條目的密碼複製到剪貼簿。</translation> </message> <message> <source>Path of the entry to clip.</source> <comment>clip = copy to clipboard</comment> - <translation type="unfinished"/> + <translation>欲剪輯的項目路徑。</translation> </message> <message> <source>Timeout in seconds before clearing the clipboard.</source> - <translation type="unfinished"/> + <translation>清除剪貼簿之前保存多久 (秒)。</translation> </message> <message> <source>Edit an entry.</source> - <translation type="unfinished"/> + <translation>編輯項目。</translation> </message> <message> <source>Title for the entry.</source> - <translation type="unfinished"/> + <translation>項目標題。</translation> </message> <message> <source>title</source> - <translation type="unfinished"/> + <translation>標題</translation> </message> <message> <source>Path of the entry to edit.</source> - <translation type="unfinished"/> + <translation>欲編輯的項目路徑。</translation> </message> <message> <source>Estimate the entropy of a password.</source> - <translation type="unfinished"/> + <translation>估計密碼的 entropy。</translation> </message> <message> <source>Password for which to estimate the entropy.</source> - <translation type="unfinished"/> + <translation>用於估計 entropy 的密碼。</translation> </message> <message> <source>Perform advanced analysis on the password.</source> - <translation type="unfinished"/> + <translation>對密碼執行高級分析。</translation> </message> <message> <source>Extract and print the content of a database.</source> @@ -3192,25 +3377,30 @@ Using default port 19455.</source> </message> <message> <source>Insert password to unlock %1: </source> - <translation type="unfinished"/> + <translation>插入密碼以解除鎖定 %1: </translation> </message> <message> <source>Failed to load key file %1 : %2</source> - <translation type="unfinished"/> + <translation>未能載入金鑰檔 %1:%2</translation> </message> <message> <source>WARNING: You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>警告:你正在使用未來將不再支援的舊式金鑰檔案格式。 + +請考慮產生新的金鑰。</translation> </message> <message> <source> Available commands: </source> - <translation type="unfinished"/> + <translation> + +可用命令: +</translation> </message> <message> <source>Name of the command to execute.</source> @@ -3226,11 +3416,11 @@ Available commands: </message> <message> <source>Find entries quickly.</source> - <translation type="unfinished"/> + <translation>快速尋找項目。</translation> </message> <message> <source>Search term.</source> - <translation type="unfinished"/> + <translation>搜尋字詞。</translation> </message> <message> <source>Merge two databases.</source> @@ -3246,23 +3436,23 @@ Available commands: </message> <message> <source>Use the same credentials for both database files.</source> - <translation type="unfinished"/> + <translation>對兩個資料庫檔案使用相同的認證。</translation> </message> <message> <source>Key file of the database to merge from.</source> - <translation type="unfinished"/> + <translation>用於合併資料庫的金鑰檔案。</translation> </message> <message> <source>Show an entry's information.</source> - <translation type="unfinished"/> + <translation>顯示項目資訊。</translation> </message> <message> <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> - <translation type="unfinished"/> + <translation>欲顯示的屬性名稱。此選項可以多次指定,每個屬性會照順序逐行顯示。如果未指定任何屬性,則會給出預設屬性的摘要。</translation> </message> <message> <source>attribute</source> - <translation type="unfinished"/> + <translation>屬性</translation> </message> <message> <source>Name of the entry to show.</source> @@ -3292,27 +3482,27 @@ Available commands: </message> <message> <source>AES: 256-bit</source> - <translation type="unfinished"/> + <translation>AES: 256 位元</translation> </message> <message> <source>Twofish: 256-bit</source> - <translation type="unfinished"/> + <translation>Twofish: 256 位元</translation> </message> <message> <source>ChaCha20: 256-bit</source> - <translation type="unfinished"/> + <translation>ChaCha20: 256 位元</translation> </message> <message> <source>Argon2 (KDBX 4 – recommended)</source> - <translation type="unfinished"/> + <translation>Argon2 (KDBX 4 – 推薦)</translation> </message> <message> <source>AES-KDF (KDBX 4)</source> - <translation type="unfinished"/> + <translation>AES-KDF (KDBX 4)</translation> </message> <message> <source>AES-KDF (KDBX 3.1)</source> - <translation type="unfinished"/> + <translation>AES-KDF (KDBX 3.1)</translation> </message> <message> <source>Group</source> @@ -3336,15 +3526,15 @@ Available commands: </message> <message> <source>Last Modified</source> - <translation type="unfinished"/> + <translation>最後編輯</translation> </message> <message> <source>Created</source> - <translation type="unfinished"/> + <translation>已建立</translation> </message> <message> <source>Legacy Browser Integration</source> - <translation type="unfinished"/> + <translation>舊式瀏覽器整合</translation> </message> <message> <source>Browser Integration</source> @@ -3352,18 +3542,63 @@ Available commands: </message> <message> <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source> - <translation type="unfinished"/> + <translation>YubiKey[%1] 挑戰回應 - 插槽 %2 - %3</translation> </message> <message> <source>Press</source> - <translation type="unfinished"/> + <translation>按</translation> </message> <message> <source>Passive</source> - <translation type="unfinished"/> + <translation>被動</translation> </message> <message> <source>SSH Agent</source> + <translation>SSH 代理</translation> + </message> + <message> + <source>Generate a new random diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Word count for the diceware passphrase.</source> + <translation type="unfinished"/> + </message> + <message> + <source>count</source> + <translation type="unfinished"/> + </message> + <message> + <source>Wordlist for the diceware generator. +[Default: EFF English]</source> + <translation type="unfinished"/> + </message> + <message> + <source>Generate a new random password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Length of the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use lowercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use uppercase characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use numbers in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use special characters in the generated password.</source> + <translation type="unfinished"/> + </message> + <message> + <source>Use extended ASCII in the generated password.</source> <translation type="unfinished"/> </message> </context> @@ -3472,7 +3707,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message numerus="yes"> <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>成功從 KeePassX/Http Settings 移除 %n 加密金鑰。</numerusform></translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -3504,7 +3739,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message numerus="yes"> <source>Successfully removed permissions from %n entries.</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>成功從 %n 個項目中移除權限。</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -3542,7 +3777,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Start only a single instance of KeePassXC</source> - <translation type="unfinished"/> + <translation>只能啟動單一 KeePassXC 程式</translation> </message> <message> <source>Remember last databases</source> @@ -3550,7 +3785,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Remember last key files and security dongles</source> - <translation>記住最近的金鑰檔案與安全鎖</translation> + <translation>記住最近的金鑰檔案與安全加密狗</translation> </message> <message> <source>Load previous databases on startup</source> @@ -3586,7 +3821,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Hide the Details view</source> - <translation type="unfinished"/> + <translation>隱藏詳細資訊檢視</translation> </message> <message> <source>Show a system tray icon</source> @@ -3602,7 +3837,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Dark system tray icon</source> - <translation type="unfinished"/> + <translation>深色系統列圖示</translation> </message> <message> <source>Language</source> @@ -3614,11 +3849,11 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Use entry title to match windows for global Auto-Type</source> - <translation type="unfinished"/> + <translation>使用項目標題來匹配全域自動輸入的視窗</translation> </message> <message> <source>Use entry URL to match windows for global Auto-Type</source> - <translation type="unfinished"/> + <translation>使用項目 URL 來匹配全域自動輸入的視窗</translation> </message> <message> <source>Always ask before performing Auto-Type</source> @@ -3635,7 +3870,31 @@ Please unlock the selected database or choose another one which is unlocked.</so <message> <source> ms</source> <comment>Milliseconds</comment> - <translation>毫秒</translation> + <translation> 毫秒</translation> + </message> + <message> + <source>Startup</source> + <translation>啟動</translation> + </message> + <message> + <source>File Management</source> + <translation>檔案管理</translation> + </message> + <message> + <source>Safely save database files (may be incompatible with Dropbox, etc)</source> + <translation type="unfinished"/> + </message> + <message> + <source>Backup database file before saving</source> + <translation type="unfinished"/> + </message> + <message> + <source>Entry Management</source> + <translation>項目管理</translation> + </message> + <message> + <source>General</source> + <translation>一般</translation> </message> </context> <context> @@ -3679,11 +3938,11 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Hide passwords in the preview panel</source> - <translation type="unfinished"/> + <translation>在預覽面板中隱藏密碼</translation> </message> <message> <source>Hide entry notes by default</source> - <translation type="unfinished"/> + <translation>預設隱藏項目備註</translation> </message> <message> <source>Privacy</source> @@ -3693,6 +3952,10 @@ Please unlock the selected database or choose another one which is unlocked.</so <source>Use Google as fallback for downloading website icons</source> <translation>使用 Google 搜尋作為下載網站圖示的備案</translation> </message> + <message> + <source>Re-lock previously locked database after performing Auto-Type</source> + <translation type="unfinished"/> + </message> </context> <context> <name>SetupTotpDialog</name> @@ -3706,11 +3969,11 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Default RFC 6238 token settings</source> - <translation type="unfinished"/> + <translation>預設 RFC 6238 token 設定</translation> </message> <message> <source>Steam token settings</source> - <translation type="unfinished"/> + <translation>Steam token 設定</translation> </message> <message> <source>Use custom settings</source> @@ -3774,10 +4037,6 @@ Please unlock the selected database or choose another one which is unlocked.</so </context> <context> <name>WelcomeWidget</name> - <message> - <source>Welcome to KeePassXC</source> - <translation>歡迎來到 KeePassXC</translation> - </message> <message> <source>Start storing your passwords securely in a KeePassXC database</source> <translation>開始安全的保存你的密碼到 KeePassXC 資料庫</translation> @@ -3802,12 +4061,16 @@ Please unlock the selected database or choose another one which is unlocked.</so <source>Recent databases</source> <translation>近期的資料庫</translation> </message> + <message> + <source>Welcome to KeePassXC %1</source> + <translation>歡迎來到 KeePassXC %1</translation> + </message> </context> <context> <name>main</name> <message> <source>Remove an entry from the database.</source> - <translation type="unfinished"/> + <translation>從資料庫中移除項目。</translation> </message> <message> <source>Path of the database.</source> @@ -3815,7 +4078,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Path of the entry to remove.</source> - <translation type="unfinished"/> + <translation>欲移除的項目路徑。</translation> </message> <message> <source>KeePassXC - cross-platform password manager</source> @@ -3839,7 +4102,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Parent window handle</source> - <translation type="unfinished"/> + <translation>父層視窗控制</translation> </message> </context> </TS> \ No newline at end of file From 10bd73cd4a0cc7af9ea36fc53fdf3106fd091f89 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Wed, 21 Feb 2018 19:43:01 +0100 Subject: [PATCH 370/402] Fixed English (US) translation mixed with Vietnamese --- share/translations/keepassx_ar.ts | 6 +++--- share/translations/keepassx_en_US.ts | 20 ++++++++++---------- share/translations/keepassx_nl_NL.ts | 23 ++++++++++++----------- 3 files changed, 25 insertions(+), 24 deletions(-) diff --git a/share/translations/keepassx_ar.ts b/share/translations/keepassx_ar.ts index 5da718e47..75b9f930e 100644 --- a/share/translations/keepassx_ar.ts +++ b/share/translations/keepassx_ar.ts @@ -3518,11 +3518,11 @@ Available commands: </message> <message> <source>Legacy Browser Integration</source> - <translation type="unfinished"/> + <translation>تكامل المتصفح القديم</translation> </message> <message> <source>Browser Integration</source> - <translation type="unfinished"/> + <translation>تكامل المتصفح</translation> </message> <message> <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source> @@ -3534,7 +3534,7 @@ Available commands: </message> <message> <source>Passive</source> - <translation type="unfinished"/> + <translation>سلبي</translation> </message> <message> <source>SSH Agent</source> diff --git a/share/translations/keepassx_en_US.ts b/share/translations/keepassx_en_US.ts index 739596bee..dabdb9c02 100644 --- a/share/translations/keepassx_en_US.ts +++ b/share/translations/keepassx_en_US.ts @@ -11,7 +11,7 @@ </message> <message> <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> - <translation>Báo cáo lỗi tại: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> + <translation>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation> </message> <message> <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> @@ -19,28 +19,28 @@ </message> <message> <source>Contributors</source> - <translation>Người đóng góp</translation> + <translation>Contributors</translation> </message> <message> <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Xem Đóng góp tại GitHub</a></translation> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></translation> </message> <message> <source>Debug Info</source> - <translation>Thông Tin Sửa Lỗi</translation> + <translation>Debug Info</translation> </message> <message> <source>Include the following information whenever you report a bug:</source> - <translation>Bao gồm những thông tin sau khi bạn báo lỗi:</translation> + <translation>Include the following information whenever you report a bug:</translation> </message> <message> <source>Copy to clipboard</source> - <translation>Sao chép vào clipboard</translation> + <translation>Copy to clipboard</translation> </message> <message> <source>Version %1 </source> - <translation>Phiên bản %1 + <translation>Version %1 </translation> </message> <message> @@ -53,7 +53,7 @@ </message> <message> <source>Libraries:</source> - <translation>Thư viện:</translation> + <translation>Libraries:</translation> </message> <message> <source>Operating system: %1 @@ -65,7 +65,7 @@ Kernel: %3 %4</translation> </message> <message> <source>Enabled extensions:</source> - <translation>Phần mở rộng đã bật:</translation> + <translation>Enabled extensions:</translation> </message> <message> <source>Project Maintainers:</source> @@ -98,7 +98,7 @@ Kernel: %3 %4</translation> </message> <message> <source>Deny</source> - <translation>Từ chối</translation> + <translation>Deny</translation> </message> <message> <source>%1 has requested access to passwords for the following item(s). diff --git a/share/translations/keepassx_nl_NL.ts b/share/translations/keepassx_nl_NL.ts index d623a08e3..546f8524c 100644 --- a/share/translations/keepassx_nl_NL.ts +++ b/share/translations/keepassx_nl_NL.ts @@ -1191,7 +1191,7 @@ Wil je de wijzigingen samenvoegen?</translation> </message> <message> <source>Entry updated successfully.</source> - <translation type="unfinished"/> + <translation>Het item is bijgewerkt.</translation> </message> </context> <context> @@ -1381,15 +1381,15 @@ Wil je de wijzigingen samenvoegen?</translation> </message> <message> <source>Apply generated password?</source> - <translation type="unfinished"/> + <translation>Pas gegenereerde wachtwoord toe?</translation> </message> <message> <source>Do you want to apply the generated password to this entry?</source> - <translation type="unfinished"/> + <translation>Wil je het gegenereerde wachtwoord instellen voor dit item?</translation> </message> <message> <source>Entry updated successfully.</source> - <translation type="unfinished"/> + <translation>Het item is bijgewerkt.</translation> </message> </context> <context> @@ -1424,11 +1424,11 @@ Wil je de wijzigingen samenvoegen?</translation> </message> <message> <source>Foreground Color:</source> - <translation type="unfinished"/> + <translation>Kleur voorgrond:</translation> </message> <message> <source>Background Color:</source> - <translation type="unfinished"/> + <translation>Kleur achtergrond:</translation> </message> </context> <context> @@ -1745,7 +1745,7 @@ Wil je de wijzigingen samenvoegen?</translation> </message> <message> <source>Plugin Data</source> - <translation type="unfinished"/> + <translation>Plugingegevens:</translation> </message> <message> <source>Remove</source> @@ -1753,20 +1753,21 @@ Wil je de wijzigingen samenvoegen?</translation> </message> <message> <source>Delete plugin data?</source> - <translation type="unfinished"/> + <translation>Verwijder plugingegevens?</translation> </message> <message> <source>Do you really want to delete the selected plugin data? This may cause the affected plugins to malfunction.</source> - <translation type="unfinished"/> + <translation>Wil je echt de geselecteerde plugingegevens verwijderen? +Hierdoor werken de plugins mogelijk niet meer goed.</translation> </message> <message> <source>Key</source> - <translation type="unfinished"/> + <translation>Sleutel</translation> </message> <message> <source>Value</source> - <translation type="unfinished"/> + <translation>Waarde</translation> </message> </context> <context> From 9f5b5bb4249f254967fd08f04485dae62781c1d6 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Wed, 21 Feb 2018 21:35:17 +0100 Subject: [PATCH 371/402] Fix macOS build --- release-tool | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/release-tool b/release-tool index 08e788e13..6bb3ef826 100755 --- a/release-tool +++ b/release-tool @@ -645,31 +645,32 @@ build() { if [ "" == "$DOCKER_IMAGE" ]; then if [ "$(uname -s)" == "Darwin" ]; then - # Building on OS X - local qt_vers="$(ls /usr/local/Cellar/qt5 2> /dev/null | sort -r | head -n1)" + # Building on macOS + local qt_vers="$(ls /usr/local/Cellar/qt 2> /dev/null | sort -r | head -n1)" if [ "" == "$qt_vers" ]; then - exitError "Couldn't find Qt5! Please make sure it is available in '/usr/local/Cellar/qt5'." + exitError "Couldn't find Qt5! Please make sure it is available in '/usr/local/Cellar/qt'." fi - export MACOSX_DEPLOYMENT_TARGET=10.7 - + + export MACOSX_DEPLOYMENT_TARGET=10.10 + logInfo "Configuring build..." - cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \ - -DCMAKE_OSX_ARCHITECTURES=x86_64 -DWITH_CXX11=OFF \ - -DCMAKE_PREFIX_PATH="/usr/local/Cellar/qt5/${qt_vers}/lib/cmake" \ - -DQT_BINARY_DIR="/usr/local/Cellar/qt5/${qt_vers}/bin" $CMAKE_OPTIONS "$SRC_DIR" - + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \ + -DCMAKE_PREFIX_PATH="/usr/local/Cellar/qt/${qt_vers}/lib/cmake" \ + ${CMAKE_OPTIONS} "$SRC_DIR" + logInfo "Compiling and packaging sources..." - make $MAKE_OPTIONS package + make ${MAKE_OPTIONS} package mv "./${APP_NAME}-${RELEASE_NAME}.dmg" ../ elif [ "$(uname -o)" == "Msys" ]; then - # Building on Windows with Msys + # Building on Windows with Msys2 logInfo "Configuring build..." cmake -DCMAKE_BUILD_TYPE=Release -DWITH_TESTS=Off -G"MSYS Makefiles" \ -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" $CMAKE_OPTIONS "$SRC_DIR" logInfo "Compiling and packaging sources..." - mingw32-make $MAKE_OPTIONS preinstall + mingw32-make ${MAKE_OPTIONS} preinstall # Call cpack directly instead of calling make package. # This is important because we want to build the MSI when making a # release. From ea33caa1a80ca2589aa026e52842f07f4a413702 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Wed, 21 Feb 2018 22:34:31 +0100 Subject: [PATCH 372/402] Update PPA Qt version --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 0a5c464bd..5bcef9ab9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # KeePassXC Linux Release Build Dockerfile -# Copyright (C) 2017 KeePassXC team <https://keepassxc.org/> +# Copyright (C) 2017-2018 KeePassXC team <https://keepassxc.org/> # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -19,7 +19,7 @@ FROM ubuntu:14.04 ENV REBUILD_COUNTER=5 ENV QT5_VERSION=59 -ENV QT5_PPA_VERSION=${QT5_VERSION}2 +ENV QT5_PPA_VERSION=${QT5_VERSION}4 RUN set -x \ && apt-get update -y \ From 69283e83d89058ea9c6ca35bbf97151f2dcb44b2 Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Wed, 21 Feb 2018 21:27:19 -0500 Subject: [PATCH 373/402] Correct zxcvbn build on windows & snap build --- release-tool | 2 +- snapcraft.yaml | 10 +++++----- src/zxcvbn/zxcvbn.c | 2 ++ 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/release-tool b/release-tool index 6bb3ef826..0df84e34d 100755 --- a/release-tool +++ b/release-tool @@ -676,7 +676,7 @@ build() { # release. cpack -G "NSIS;ZIP;${CPACK_GENERATORS}" - mv "./${APP_NAME}-${RELEASE_NAME}-"*.* ../ + mv "./${APP_NAME}-"*.* ../ else mkdir -p "${OUTPUT_DIR}/bin-release" diff --git a/snapcraft.yaml b/snapcraft.yaml index 81d4ae3b3..146754fca 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -1,5 +1,5 @@ name: keepassxc -version: 2.2.4 +version: 2.3.0-beta1 grade: stable summary: Community-driven port of the Windows application “KeePass Password Safe” description: | @@ -16,6 +16,9 @@ apps: cli: command: keepassxc-cli plugs: [gsettings, home, removable-media, raw-usb] + proxy: + command: keepassxc-proxy + plugs: [home] parts: keepassxc: @@ -26,10 +29,7 @@ parts: - -DCMAKE_INSTALL_PREFIX=/usr - -DKEEPASSXC_DIST_TYPE=Snap - -DWITH_TESTS=OFF - - -DWITH_XC_AUTOTYPE=ON - - -DWITH_XC_HTTP=ON - - -DWITH_XC_YUBIKEY=ON - - -DWITH_XC_BROWSER=ON + - -DWITH_XC_ALL=ON build-packages: - g++ - libgcrypt20-dev diff --git a/src/zxcvbn/zxcvbn.c b/src/zxcvbn/zxcvbn.c index 2ee61f297..26237fba8 100644 --- a/src/zxcvbn/zxcvbn.c +++ b/src/zxcvbn/zxcvbn.c @@ -45,9 +45,11 @@ #endif /* For pre-compiled headers under windows */ +#ifndef __MINGW32__ #ifdef _WIN32 #include "stdafx.h" #endif +#endif /* Minimum number of characters in a incrementing/decrementing sequence match */ #define MIN_SEQUENCE_LEN 3 From 3089894d20ab8cc7a502db331bbbfa4882f2289e Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Thu, 22 Feb 2018 21:31:32 +0100 Subject: [PATCH 374/402] Allow KeePassXC version overrides from file in addition to Git tags --- .gitignore | 1 + CMakeLists.txt | 17 ++++++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 61dfb90d9..c96688e9f 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ release*/ *.swp .DS_Store +.version \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 3fb00a023..edfd341a3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -80,19 +80,22 @@ set_property(CACHE KEEPASSXC_BUILD_TYPE PROPERTY STRINGS Snapshot Release PreRel execute_process(COMMAND git tag --points-at HEAD WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE GIT_TAG) -if(GIT_TAG) - string(REGEX REPLACE "\r?\n$" "" GIT_TAG "${GIT_TAG}") +if(NOT GIT_TAG AND EXISTS ${CMAKE_SOURCE_DIR}/.version) + file(READ ${CMAKE_SOURCE_DIR}/.version OVERRIDE_VERSION) +endif() - if(GIT_TAG MATCHES "^[\\.0-9]+-(alpha|beta)[0-9]+$") +string(REGEX REPLACE "(\r?\n)+" "" OVERRIDE_VERSION "${OVERRIDE_VERSION}") +if(OVERRIDE_VERSION) + if(OVERRIDE_VERSION MATCHES "^[\\.0-9]+-(alpha|beta)[0-9]+$") set(KEEPASSXC_BUILD_TYPE PreRelease) - set(KEEPASSXC_VERSION ${GIT_TAG}) - elseif(GIT_TAG MATCHES "^[\\.0-9]+$") + set(KEEPASSXC_VERSION ${OVERRIDE_VERSION}) + elseif(OVERRIDE_VERSION MATCHES "^[\\.0-9]+$") set(KEEPASSXC_BUILD_TYPE Release) - set(KEEPASSXC_VERSION ${GIT_TAG}) + set(KEEPASSXC_VERSION ${OVERRIDE_VERSION}) endif() endif() -if(KEEPASSXC_BUILD_TYPE STREQUAL "PreRelease" AND NOT GIT_TAG) +if(KEEPASSXC_BUILD_TYPE STREQUAL "PreRelease" AND NOT OVERRIDE_VERSION) set(KEEPASSXC_VERSION "${KEEPASSXC_VERSION}-preview") elseif(KEEPASSXC_BUILD_TYPE STREQUAL "Snapshot") set(KEEPASSXC_VERSION "${KEEPASSXC_VERSION}-snapshot") From 32a407824039d30128fa5a2c2483cf552f90a926 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Thu, 22 Feb 2018 21:53:29 +0100 Subject: [PATCH 375/402] Add .version file when generating source tarball --- release-tool | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/release-tool b/release-tool index 0df84e34d..b08caadba 100755 --- a/release-tool +++ b/release-tool @@ -614,9 +614,19 @@ build() { if ${BUILD_SOURCE_TARBALL}; then logInfo "Creating source tarball..." local app_name_lower="$(echo "$APP_NAME" | tr '[:upper:]' '[:lower:]')" - TARBALL_NAME="${app_name_lower}-${RELEASE_NAME}-src.tar.xz" - git archive --format=tar "$TAG_NAME" --prefix="${app_name_lower}-${RELEASE_NAME}/" \ - | xz -6 > "${OUTPUT_DIR}/${TARBALL_NAME}" + local prefix="${app_name_lower}-${RELEASE_NAME}" + local tarball_name="${prefix}-src.tar" + + git archive --format=tar "$TAG_NAME" --prefix="${prefix}/" --output="${OUTPUT_DIR}/${tarball_name}" + + # add .version file to tar + mkdir "${prefix}" + echo -n ${RELEASE_NAME} > "${prefix}/.version" + tar --append --file="${OUTPUT_DIR}/${tarball_name}" "${prefix}/.version" + rm "${prefix}/.version" + rmdir "${prefix}" 2> /dev/null + + xz -6 "${OUTPUT_DIR}/${tarball_name}" fi if [ -e "${OUTPUT_DIR}/build-release" ]; then From daaa3c5b41317b3838cbf7aa64666eb2fcb9335f Mon Sep 17 00:00:00 2001 From: Weslly <weslly@users.noreply.github.com> Date: Fri, 23 Feb 2018 06:43:43 -0300 Subject: [PATCH 376/402] Enable focus outline for global auto-type shortcut on macOS --- src/gui/SettingsWidget.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/SettingsWidget.cpp b/src/gui/SettingsWidget.cpp index 9e4152e25..56b1b2a38 100644 --- a/src/gui/SettingsWidget.cpp +++ b/src/gui/SettingsWidget.cpp @@ -150,6 +150,7 @@ void SettingsWidget::loadSettings() if (m_globalAutoTypeKey > 0 && m_globalAutoTypeModifiers > 0) { m_generalUi->autoTypeShortcutWidget->setShortcut(m_globalAutoTypeKey, m_globalAutoTypeModifiers); } + m_generalUi->autoTypeShortcutWidget->setAttribute(Qt::WA_MacShowFocusRect, true); m_generalUi->autoTypeDelaySpinBox->setValue(config()->get("AutoTypeDelay").toInt()); } From 8dad78194fcd18850cebbf462be6fb0116cc5e00 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sat, 24 Feb 2018 23:20:53 +0100 Subject: [PATCH 377/402] Fix libgcrypt and libgpg-errror paths in AppImage, resolves #1522 --- AppImage-Recipe.sh | 8 ++++++-- release-tool | 16 +++++++++------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/AppImage-Recipe.sh b/AppImage-Recipe.sh index 2187fde1f..342dd0840 100755 --- a/AppImage-Recipe.sh +++ b/AppImage-Recipe.sh @@ -66,14 +66,18 @@ cp "$QXCB_PLUGIN" ".${QT_PLUGIN_PATH}/platforms/" get_apprun copy_deps + +# protect our libgpg-error from being deleted +mv ./opt/gpg-error-127/lib/x86_64-linux-gnu/libgpg-error.so.0 ./protected.so delete_blacklisted +mv ./protected.so ./opt/gpg-error-127/lib/x86_64-linux-gnu/libgpg-error.so.0 get_desktop get_icon cat << EOF > ./usr/bin/keepassxc_env #!/usr/bin/env bash -export LD_LIBRARY_PATH="/opt/libgcrypt20-18/lib/x86_64-linux-gnu:\${LD_LIBRARY_PATH}" -export LD_LIBRARY_PATH="/opt/gpg-error-127/lib/x86_64-linux-gnu:\${LD_LIBRARY_PATH}" +export LD_LIBRARY_PATH="../opt/libgcrypt20-18/lib/x86_64-linux-gnu:\${LD_LIBRARY_PATH}" +export LD_LIBRARY_PATH="../opt/gpg-error-127/lib/x86_64-linux-gnu:\${LD_LIBRARY_PATH}" export LD_LIBRARY_PATH="..$(dirname ${QT_PLUGIN_PATH})/lib:\${LD_LIBRARY_PATH}" export QT_PLUGIN_PATH="..${QT_PLUGIN_PATH}:\${KPXC_QT_PLUGIN_PATH}" diff --git a/release-tool b/release-tool index b08caadba..c0739a0b4 100755 --- a/release-tool +++ b/release-tool @@ -619,17 +619,19 @@ build() { git archive --format=tar "$TAG_NAME" --prefix="${prefix}/" --output="${OUTPUT_DIR}/${tarball_name}" - # add .version file to tar - mkdir "${prefix}" - echo -n ${RELEASE_NAME} > "${prefix}/.version" - tar --append --file="${OUTPUT_DIR}/${tarball_name}" "${prefix}/.version" - rm "${prefix}/.version" - rmdir "${prefix}" 2> /dev/null + if ! ${BUILD_SNAPSHOT}; then + # add .version file to tar + mkdir "${prefix}" + echo -n ${RELEASE_NAME} > "${prefix}/.version" + tar --append --file="${OUTPUT_DIR}/${tarball_name}" "${prefix}/.version" + rm "${prefix}/.version" + rmdir "${prefix}" 2> /dev/null + fi xz -6 "${OUTPUT_DIR}/${tarball_name}" fi - if [ -e "${OUTPUT_DIR}/build-release" ]; then + if ! ${BUILD_SNAPSHOT} && [ -e "${OUTPUT_DIR}/build-release" ]; then logInfo "Cleaning existing build directory..." rm -r "${OUTPUT_DIR}/build-release" 2> /dev/null if [ $? -ne 0 ]; then From 5e2e12977da0da336baf3127bad992b83e8f5f6a Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Sun, 25 Feb 2018 12:58:54 -0500 Subject: [PATCH 378/402] Correct intermittent crash due to stale history items --- src/gui/entry/EditEntryWidget.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index ac9681801..b180c2a01 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -755,6 +755,8 @@ bool EditEntryWidget::commitEntry() } #endif + m_historyModel->setEntries(m_entry->historyItems()); + showMessage(tr("Entry updated successfully."), MessageWidget::Positive); return true; } From 8c4df3706297cfa117ed208abd5d7904f52f432a Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Sun, 25 Feb 2018 13:15:44 -0500 Subject: [PATCH 379/402] Only show entry update message when hitting apply --- src/gui/DatabaseWidget.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index fda7586d7..06b7b87b7 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -795,10 +795,6 @@ void DatabaseWidget::switchToView(bool accepted) m_newParent = nullptr; } - if (accepted) { - showMessage(tr("Entry updated successfully."), MessageWidget::Positive, false, 2000); - } - setCurrentWidget(m_mainWidget); } From fd71b4a22e981961da8d6c3de5faaf514429e733 Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Thu, 22 Feb 2018 23:19:26 -0500 Subject: [PATCH 380/402] Convert from unicode to image based paperclip --- .../application/16x16/actions/paperclip.png | Bin 0 -> 352 bytes .../application/22x22/actions/paperclip.png | Bin 0 -> 421 bytes .../application/32x32/actions/paperclip.png | Bin 0 -> 559 bytes share/icons/svg/paperclip.svgz | Bin 0 -> 1326 bytes src/gui/entry/EntryModel.cpp | 34 ++++++++---------- src/gui/entry/EntryModel.h | 5 ++- src/gui/entry/EntryView.cpp | 4 +++ 7 files changed, 23 insertions(+), 20 deletions(-) create mode 100644 share/icons/application/16x16/actions/paperclip.png create mode 100644 share/icons/application/22x22/actions/paperclip.png create mode 100644 share/icons/application/32x32/actions/paperclip.png create mode 100644 share/icons/svg/paperclip.svgz diff --git a/share/icons/application/16x16/actions/paperclip.png b/share/icons/application/16x16/actions/paperclip.png new file mode 100644 index 0000000000000000000000000000000000000000..cd61805ef0f07bfcd9b726683cec2fa616001d8f GIT binary patch literal 352 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf<Z~8yL>2?- z*&xiwU%2=ykRe&(8c`CQpH@<ySd_|8US6)3nU`IhoLG>mmtT}V`<;yxP|;ma7sn8b z-l>-jy__8d*dDykZ0c2VG+3LEm@DNN_<>=Y+(9Gu4O6Cstt=9>-gttO#a}?$w!us+ zYvb<+g6a3G|D843{QtkPv9))Pw#{SK>#Tl)$$K912=95c!Q~!Lk@$_{wPsd_%GW*P zH*2~hFu(T)bF_r(pA!sq1$t)}o%+b6{`!cc!n#kDJ$u^@8a#3rz0wq?u{B`v<rTSX zrP^1c{;cP+x@guMw>e|=0<rB<u59r)4suPuWVdF+-1k<67X<D+6x&@fecMLyXB897 r-i!3l_$oTt?xu*h%|o|`lJ$%M3zT0i%v`n<=urkwS3j3^P6<r_9`}f+ literal 0 HcmV?d00001 diff --git a/share/icons/application/22x22/actions/paperclip.png b/share/icons/application/22x22/actions/paperclip.png new file mode 100644 index 0000000000000000000000000000000000000000..99d0eb821887741776d42ad382531fdfae4b7a4e GIT binary patch literal 421 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fEX7WqAsj$Z!;#Vf<Z~8yL>2?- zt02r6a&uJ@kRe&(8c`CQpH@<ySd_|8US6)3nU`IhoLG>mmtT}V`<;yx0|TRyr;B5V zMeow9`}J5IMUH<w-(~N3$kj<{k!se$fRAj8zOzO3UjM+LvdBqOk!ztqtKXu_olY)_ z>s%U>zMpb=cW&<P->cK=)1OuQo%1;-blv3JhX&&{r8oXBpXZSy5gu_!(5|rWYDmRQ zvx`R}9>_j6d0MdMk>#Dox*zm528iG3@2`&&t}Q({fz|VYddJ&@rCK{!tER+9i5)Rp z)wG$xMsNR-3*6UZn{TUn1}zUeGUaH~-KNRf{%;E<Hw5)(Yl_}k_vn<ZUh~y=g}O_d zW=kAgP*bxlB&s%_<y)WI#(f9P+6rPTdXxOGM;#YWGw2qUNeZ&Fs^1X9YNH@;CoaMJ zhx5)OzxL^ZmzCl^^wi3T-1nc+FY9yCqE+{2$De8c*~>plS%2XcJZ4%jOM~qVFi06Z MUHx3vIVCg!0JOxa=l}o! literal 0 HcmV?d00001 diff --git a/share/icons/application/32x32/actions/paperclip.png b/share/icons/application/32x32/actions/paperclip.png new file mode 100644 index 0000000000000000000000000000000000000000..cb57d13783baeaf0a42cb9cc096d52aa801f858d GIT binary patch literal 559 zcmV+~0?_@5P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800004b3#c}2nYxW zd<bNS00009a7bBm0003t0003t0T%B9;s5{u8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10jx<xK~z|U?boqu6hRaQ@ZV`v)ToIV5sNe-+9imB0gI$lL>v7R zEG+CT(xpi{3$YN1r4R%a0(K&TU}K|IY$QbxqF@k9AvueE$H}s1Zr0f#;s?ja&3p5{ zZ)V;syDe!rfm^tM0ldXMtR~i}g>(3fcIo#WmzoyehmRrn5ED3sd2C`su{(|7dWb)- zh~0_U?K*{b^_h1zc&Q@xDENGn21bIvRK(VUk2h(c72K{PlEXj>cH=4zG-==rW_rXf zVi`C4DKt>izyqAdP(|!$@WFlx)$M^JI27~Cv7~;fYam-w=4iq{GSkE@Xl<X8Zs7kB z)Dg{k3sSJ-J@D7vf`8LMuOrwlmd!vFvb-DAHLw-jvO`VS5$xozh43iGV(e2Xr!(ib z==Xi#Yw)q)mzc&=9FDOU!6T(PS#U$K#dqWXAl~SHoGj}u=2?tQ=QMB<Kk!X=g?mC| zN_X4GBX0wHa~gpAij}>_a1WF3BWE_ZIK{TV3xRda;WDmZL2>47yi)8=BN)PCMTeI^ xQa7=P{V4^Lo?5?P64w-GzJ(8Xf|b-lKLIK$S)&2gUKIcU002ovPDHLkV1h^c@B{z= literal 0 HcmV?d00001 diff --git a/share/icons/svg/paperclip.svgz b/share/icons/svg/paperclip.svgz new file mode 100644 index 0000000000000000000000000000000000000000..f82480bca157b52e725c1c7e997df2f270d87214 GIT binary patch literal 1326 zcmV+}1=0E+iwFP!000000F74Lj@vd6ea}}A%1et%6fe3Owu81ofdYLf+5~+uP-rEt zt*k5xqP({E>pMg0vfg!z3P^S|*E2JRl-Hjw$A&zs-qgC?c$_kisJ7Hq-R?Ku*Dt>W znMce}v{ljQR&Bgid!M!+*5-Ntfe-@0tyxv&#ybo{w+h4V)HhW3`>-lQ)u^Lt2NQD2 zLvL{}7x%JP#ZW)1QXh}HH8!#}A7455)#L1aKA-7XS|^_8dB{X4L;xOvxwb=b32s9H z<GoP97z@F+c>X`Hm4T^r@NagX6x8TbU#drlQ?yk>`1#A{*%&Zd4b`hOb^Bz>qEk0j zC#9P}aa5)&N@c=HZ{rWD-XDgICv#@s>uTfuR$Nv8H@EMv);KC^b^b|THXb94KoprG z&vi8%mP7z-WeaY+u2)9&&#vIq!>ZCHf&w#O>C2|>D9q-?p%@{q=JJf@f(r6oTuPO( z$|r*HG+<f4lJ9Rr)TPt?5Iok6a`}H=?Y=^Nv-?(^PiFUfufM5sFuNbS&g`C)>I!2n z<<1<6UhV1<II}CduBl6)k#2WVT%_0)CBB&50=8@ScMD&t4%V5{EKPDD`CXsu8=vj^ zsD`2{h626a7AB2Mc?=Ff$<-g9f7!0fa`l()pPVB;Xel1_3APA+Rk;Gv9E)LFAB(+0 zzWo5ZSci)NeTHkNmJ}`ttjUt@?#ZjlV~s)KpF`a=zhZ8Wgf3S-G-_)rOyUR<q#1WO zH3Tv0(JYPP8#F0xx|trhy9&wX96P92>PGh)@8hF=JZE^&eFYmCO^JPOOd3cC$brG5 zT0h|a2i>T?Xt7()M$5hj4&T$C>Pp=+%zH(6bD_IdpjV~O8&AA7p6eD2!FYUlF5ZQY z9@A0fz<h5R-#jRo;nboz=rcC6@rM4S-sXGJ`iKWQi4zgOHI{I+c`Rv`12^9puNEN{ zOs4;W62jqrzi+$#hwWHg>SO()s%242*;C)ctsgXaG2PxzW3RX%bH7__3mzWu&a(FH zda=Qbrc;3A-guWQ>byybBSZzvHlLO1*x}7)KWCEN($-d+96N35!QGyDOc~Fz)E6n6 z6Y0K&wu;fkXSZcBlS~C)v=i(`mrppT$D%Rr6o&85&34@t!@<SkbwWfUXdZJe{ajL( z$|Mq`Btb%@4<8gx0?ujV15Wr3=E?X9|0VF*Vi{=&cnP295zR0TLi`ALLIRP~)K4Uh zND!ys0-^wIN@Gkct(N<NV9vu2k_gH%Kai5f1d|3lNofiqKoJrOxRT()V+cxo%oY)z z(9A}qgfj}-1PX}=V1mSnjD0Kzrp!+uGq|Td&uHQ#8Mz*$FCZp%B}yogB1VqB5~T>G z)DDE^zCh4e!nT@##tJc(U#1qg9Nabl^&u;pI)eeb&Uh-YNdy~X2ABy%WK#+!<2u;9 z3$d&rozS~92wdcZ<G`Z`O2F8x6q6hR5E`@&RRKHB2;g$;#jZOexUzuf?ytnk%{czs z*}yt1LfZ?h8+aiyL>@=BW4mOq#<_i99+B&n(R5b9{&SpGWEHUu%YFVz0Xc;)nd9E5 zkiNZ!Mg`IhNWvU6OGWqzK*jtHYh9RQ-I0tWLMcP`q&e^cqzryLP^1bNIktk-ixbB^ z99v}fhLePM98U}mPP8n?N#X9`B;+_Gj7;n?;R3mm*<I!%63)j(kBXO9cQ>9;nX-3x kBK!zx;Txs<0It60VmS2*KP&E}Kkv8y09<OF7-I_n0Et$Avj6}9 literal 0 HcmV?d00001 diff --git a/src/gui/entry/EntryModel.cpp b/src/gui/entry/EntryModel.cpp index 71828c6ed..ab2a81146 100644 --- a/src/gui/entry/EntryModel.cpp +++ b/src/gui/entry/EntryModel.cpp @@ -22,12 +22,14 @@ #include <QMimeData> #include <QPalette> #include <QDateTime> +#include <QPainter> #include "core/DatabaseIcons.h" #include "core/Entry.h" #include "core/Global.h" #include "core/Group.h" #include "core/Metadata.h" +#include "core/FilePath.h" // String being displayed when hiding content const QString EntryModel::HiddenContentDisplay(QString("\u25cf").repeated(6)); @@ -35,15 +37,17 @@ const QString EntryModel::HiddenContentDisplay(QString("\u25cf").repeated(6)); // Format used to display dates const Qt::DateFormat EntryModel::DateFormat = Qt::DefaultLocaleShortDate; -// Paperclip symbol -const QString EntryModel::PaperClipDisplay("\U0001f4ce"); - EntryModel::EntryModel(QObject* parent) : QAbstractTableModel(parent) , m_group(nullptr) , m_hideUsernames(false) , m_hidePasswords(true) + , m_paperClipPixmap(FilePath::instance()->icon("actions", "paperclip").pixmap(16)) + , m_paperClipPixmapCentered(24, 16) { + m_paperClipPixmapCentered.fill(Qt::transparent); + QPainter painter(&m_paperClipPixmapCentered); + painter.drawPixmap(8, 0, m_paperClipPixmap); } Entry* EntryModel::entryFromIndex(const QModelIndex& index) const @@ -205,9 +209,6 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const case Accessed: result = entry->timeInfo().lastAccessTime().toLocalTime().toString(EntryModel::DateFormat); return result; - case Paperclip: - result = entry->attachments()->keys().isEmpty() ? QString() : EntryModel::PaperClipDisplay; - return result; case Attachments: // Display comma-separated list of attachments QList<QString> attachments = entry->attachments()->keys(); @@ -238,7 +239,7 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const case Paperclip: // Display entries with attachments above those without when // sorting ascendingly (and vice versa when sorting descendingly) - return entry->attachments()->keys().isEmpty() ? 1 : 0; + return entry->attachments()->isEmpty() ? 1 : 0; default: // For all other columns, simply use data provided by Qt::Display- // Role for sorting @@ -257,6 +258,10 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const } else { return entry->iconScaledPixmap(); } + case Paperclip: + if (!entry->attachments()->isEmpty()) { + return m_paperClipPixmapCentered; + } } } else if (role == Qt::FontRole) { QFont font; @@ -279,12 +284,6 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const if (index.column() == Paperclip) { return Qt::AlignCenter; } - } else if (role == Qt::SizeHintRole) { - if (index.column() == Paperclip) { - QFont font; - QFontMetrics fm(font); - return fm.width(PaperClipDisplay) / 2; - } } return QVariant(); @@ -316,15 +315,12 @@ QVariant EntryModel::headerData(int section, Qt::Orientation orientation, int ro return tr("Modified"); case Accessed: return tr("Accessed"); - case Paperclip: - return EntryModel::PaperClipDisplay; case Attachments: return tr("Attachments"); } - } else if (role == Qt::TextAlignmentRole) { - switch (section) { - case Paperclip: - return Qt::AlignCenter; + } else if (role == Qt::DecorationRole) { + if (section == Paperclip) { + return m_paperClipPixmap; } } diff --git a/src/gui/entry/EntryModel.h b/src/gui/entry/EntryModel.h index 7c668a5f6..a2323c642 100644 --- a/src/gui/entry/EntryModel.h +++ b/src/gui/entry/EntryModel.h @@ -19,6 +19,7 @@ #define KEEPASSX_ENTRYMODEL_H #include <QAbstractTableModel> +#include <QPixmap> class Entry; class Group; @@ -95,9 +96,11 @@ private: bool m_hideUsernames; bool m_hidePasswords; + QPixmap m_paperClipPixmap; + QPixmap m_paperClipPixmapCentered; + static const QString HiddenContentDisplay; static const Qt::DateFormat DateFormat; - static const QString PaperClipDisplay; }; #endif // KEEPASSX_ENTRYMODEL_H diff --git a/src/gui/entry/EntryView.cpp b/src/gui/entry/EntryView.cpp index 67169d27f..dbbdd144a 100644 --- a/src/gui/entry/EntryView.cpp +++ b/src/gui/entry/EntryView.cpp @@ -72,6 +72,10 @@ EntryView::EntryView(QWidget* parent) m_columnActions->setExclusive(false); for (int columnIndex = 1; columnIndex < header()->count(); ++columnIndex) { QString caption = m_model->headerData(columnIndex, Qt::Horizontal, Qt::DisplayRole).toString(); + if (columnIndex == EntryModel::Paperclip) { + caption = tr("Attachments (icon)"); + } + QAction* action = m_headerMenu->addAction(caption); action->setCheckable(true); action->setData(columnIndex); From 77e345570d6c0d5e52cddf28d6759d27a805b5e9 Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Sat, 24 Feb 2018 07:44:28 -0500 Subject: [PATCH 381/402] Correct test failures; moved gui calls into gui objects --- src/gui/entry/EntryModel.cpp | 15 ++++++++++----- src/gui/entry/EntryModel.h | 2 ++ src/gui/entry/EntryView.cpp | 3 +++ 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/gui/entry/EntryModel.cpp b/src/gui/entry/EntryModel.cpp index ab2a81146..afd25aa1a 100644 --- a/src/gui/entry/EntryModel.cpp +++ b/src/gui/entry/EntryModel.cpp @@ -29,7 +29,6 @@ #include "core/Global.h" #include "core/Group.h" #include "core/Metadata.h" -#include "core/FilePath.h" // String being displayed when hiding content const QString EntryModel::HiddenContentDisplay(QString("\u25cf").repeated(6)); @@ -42,12 +41,9 @@ EntryModel::EntryModel(QObject* parent) , m_group(nullptr) , m_hideUsernames(false) , m_hidePasswords(true) - , m_paperClipPixmap(FilePath::instance()->icon("actions", "paperclip").pixmap(16)) + , m_paperClipPixmap(16, 16) , m_paperClipPixmapCentered(24, 16) { - m_paperClipPixmapCentered.fill(Qt::transparent); - QPainter painter(&m_paperClipPixmapCentered); - painter.drawPixmap(8, 0, m_paperClipPixmap); } Entry* EntryModel::entryFromIndex(const QModelIndex& index) const @@ -504,3 +500,12 @@ void EntryModel::togglePasswordsHidden(const bool hide) { setPasswordsHidden(hide); } + +void EntryModel::setPaperClipPixmap(const QPixmap& paperclip) +{ + m_paperClipPixmap = paperclip; + + m_paperClipPixmapCentered.fill(Qt::transparent); + QPainter painter2(&m_paperClipPixmapCentered); + painter2.drawPixmap(8, 0, paperclip); +} diff --git a/src/gui/entry/EntryModel.h b/src/gui/entry/EntryModel.h index a2323c642..b436c6a9e 100644 --- a/src/gui/entry/EntryModel.h +++ b/src/gui/entry/EntryModel.h @@ -66,6 +66,8 @@ public: bool isPasswordsHidden() const; void setPasswordsHidden(const bool hide); + void setPaperClipPixmap(const QPixmap& paperclip); + signals: void switchedToListMode(); void switchedToSearchMode(); diff --git a/src/gui/entry/EntryView.cpp b/src/gui/entry/EntryView.cpp index dbbdd144a..f39dd218b 100644 --- a/src/gui/entry/EntryView.cpp +++ b/src/gui/entry/EntryView.cpp @@ -22,6 +22,7 @@ #include <QKeyEvent> #include <QMenu> +#include "core/FilePath.h" #include "gui/SortFilterHideProxyModel.h" EntryView::EntryView(QWidget* parent) @@ -114,6 +115,8 @@ EntryView::EntryView(QWidget* parent) m_sortModel->sort(EntryModel::Title, Qt::AscendingOrder); sortByColumn(EntryModel::Title, Qt::AscendingOrder); m_defaultListViewState = header()->saveState(); + + m_model->setPaperClipPixmap(filePath()->icon("actions", "paperclip").pixmap(16)); } void EntryView::keyPressEvent(QKeyEvent* event) From 686adbe65a56ce0fb57ae95b07cb919d51decb52 Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Wed, 21 Feb 2018 21:25:04 -0500 Subject: [PATCH 382/402] Set paperclip column to be fixed size; correct test failures --- src/gui/entry/EntryModel.cpp | 12 ++--- src/gui/entry/EntryModel.h | 1 - src/gui/entry/EntryView.cpp | 91 +++++++++++++++++++++--------------- src/gui/entry/EntryView.h | 5 +- 4 files changed, 61 insertions(+), 48 deletions(-) diff --git a/src/gui/entry/EntryModel.cpp b/src/gui/entry/EntryModel.cpp index afd25aa1a..6f7ebf6af 100644 --- a/src/gui/entry/EntryModel.cpp +++ b/src/gui/entry/EntryModel.cpp @@ -41,8 +41,6 @@ EntryModel::EntryModel(QObject* parent) , m_group(nullptr) , m_hideUsernames(false) , m_hidePasswords(true) - , m_paperClipPixmap(16, 16) - , m_paperClipPixmapCentered(24, 16) { } @@ -251,13 +249,13 @@ QVariant EntryModel::data(const QModelIndex& index, int role) const case Title: if (entry->isExpired()) { return databaseIcons()->iconPixmap(DatabaseIcons::ExpiredIconIndex); - } else { - return entry->iconScaledPixmap(); } + return entry->iconScaledPixmap(); case Paperclip: if (!entry->attachments()->isEmpty()) { - return m_paperClipPixmapCentered; + return m_paperClipPixmap; } + break; } } else if (role == Qt::FontRole) { QFont font; @@ -504,8 +502,4 @@ void EntryModel::togglePasswordsHidden(const bool hide) void EntryModel::setPaperClipPixmap(const QPixmap& paperclip) { m_paperClipPixmap = paperclip; - - m_paperClipPixmapCentered.fill(Qt::transparent); - QPainter painter2(&m_paperClipPixmapCentered); - painter2.drawPixmap(8, 0, paperclip); } diff --git a/src/gui/entry/EntryModel.h b/src/gui/entry/EntryModel.h index b436c6a9e..4fc765044 100644 --- a/src/gui/entry/EntryModel.h +++ b/src/gui/entry/EntryModel.h @@ -99,7 +99,6 @@ private: bool m_hidePasswords; QPixmap m_paperClipPixmap; - QPixmap m_paperClipPixmapCentered; static const QString HiddenContentDisplay; static const Qt::DateFormat DateFormat; diff --git a/src/gui/entry/EntryView.cpp b/src/gui/entry/EntryView.cpp index f39dd218b..19978a808 100644 --- a/src/gui/entry/EntryView.cpp +++ b/src/gui/entry/EntryView.cpp @@ -90,19 +90,18 @@ EntryView::EntryView(QWidget* parent) m_headerMenu->addSeparator(); m_headerMenu->addAction(tr("Reset to defaults"), this, SLOT(resetViewToDefaults())); + header()->setMinimumSectionSize(24); header()->setDefaultSectionSize(100); - // Stretching of last section interferes with fitting columns to window header()->setStretchLastSection(false); header()->setContextMenuPolicy(Qt::CustomContextMenu); + connect(header(), SIGNAL(customContextMenuRequested(QPoint)), SLOT(showHeaderMenu(QPoint))); connect(header(), SIGNAL(sectionCountChanged(int, int)), SIGNAL(viewStateChanged())); connect(header(), SIGNAL(sectionMoved(int, int, int)), SIGNAL(viewStateChanged())); connect(header(), SIGNAL(sectionResized(int, int, int)), SIGNAL(viewStateChanged())); connect(header(), SIGNAL(sortIndicatorChanged(int, Qt::SortOrder)), SIGNAL(viewStateChanged())); - // TODO: not working as expected, columns will end up being very small, - // most likely due to the widget not being sized properly at this time - //fitColumnsToWindow(); + resetFixedColumns(); // Configure default search view state and save for later use header()->showSection(EntryModel::ParentGroup); @@ -299,9 +298,11 @@ QByteArray EntryView::viewState() const /** * Set view state */ -bool EntryView::setViewState(const QByteArray& state) const +bool EntryView::setViewState(const QByteArray& state) { - return header()->restoreState(state); + bool status = header()->restoreState(state); + resetFixedColumns(); + return status; } /** @@ -374,6 +375,8 @@ void EntryView::toggleColumnVisibility(QAction *action) void EntryView::fitColumnsToWindow() { header()->resizeSections(QHeaderView::Stretch); + resetFixedColumns(); + fillRemainingWidth(true); emit viewStateChanged(); } @@ -385,37 +388,8 @@ void EntryView::fitColumnsToContents() { // Resize columns to fit contents header()->resizeSections(QHeaderView::ResizeToContents); - - // Determine total width of currently visible columns. If there is - // still some space available on the header, equally distribute it to - // visible columns and add remaining fraction to last visible column - int width = 0; - for (int columnIndex = 0; columnIndex < header()->count(); ++columnIndex) { - if (!header()->isSectionHidden(columnIndex)) { - width += header()->sectionSize(columnIndex); - } - } - int visible = header()->count() - header()->hiddenSectionCount(); - int avail = header()->width() - width; - if ((visible <= 0) || (avail <= 0)) { - return; - } - int add = avail / visible; - width = 0; - int last = 0; - for (int columnIndex = 0; columnIndex < header()->count(); ++columnIndex) { - if (!header()->isSectionHidden(columnIndex)) { - header()->resizeSection(columnIndex, header()->sectionSize(columnIndex) + add); - width += header()->sectionSize(columnIndex); - if (header()->visualIndex(columnIndex) > last) { - last = header()->visualIndex(columnIndex); - } - } - } - header()->resizeSection(header()->logicalIndex(last), header()->sectionSize(last) + (header()->width() - width)); - - // Shouldn't be necessary due to use of header()->resizeSection, but - // lets just do it anyway for the sake of completeness + resetFixedColumns(); + fillRemainingWidth(false); emit viewStateChanged(); } @@ -435,3 +409,46 @@ void EntryView::resetViewToDefaults() fitColumnsToWindow(); } + +void EntryView::fillRemainingWidth(bool lastColumnOnly) +{ + // Determine total width of currently visible columns + int width = 0; + int lastColumnIndex = 0; + for (int columnIndex = 0; columnIndex < header()->count(); ++columnIndex) { + if (!header()->isSectionHidden(columnIndex)) { + width += header()->sectionSize(columnIndex); + } + if (header()->visualIndex(columnIndex) > lastColumnIndex) { + lastColumnIndex = header()->visualIndex(columnIndex); + } + } + + int numColumns = header()->count() - header()->hiddenSectionCount(); + int availWidth = header()->width() - width; + if ((numColumns <= 0) || (availWidth <= 0)) { + return; + } + + if (!lastColumnOnly) { + // Equally distribute remaining width to visible columns + int add = availWidth / numColumns; + width = 0; + for (int columnIndex = 0; columnIndex < header()->count(); ++columnIndex) { + if (!header()->isSectionHidden(columnIndex)) { + header()->resizeSection(columnIndex, header()->sectionSize(columnIndex) + add); + width += header()->sectionSize(columnIndex); + } + } + } + + // Add remaining width to last column + header()->resizeSection(header()->logicalIndex(lastColumnIndex), header()->sectionSize(lastColumnIndex) + (header()->width() - width)); +} + +void EntryView::resetFixedColumns() +{ + header()->setSectionResizeMode(EntryModel::Paperclip, QHeaderView::Fixed); + header()->resizeSection(EntryModel::Paperclip, header()->minimumSectionSize()); +} + diff --git a/src/gui/entry/EntryView.h b/src/gui/entry/EntryView.h index 26672a665..a8422c563 100644 --- a/src/gui/entry/EntryView.h +++ b/src/gui/entry/EntryView.h @@ -48,7 +48,7 @@ public: bool isPasswordsHidden() const; void setPasswordsHidden(const bool hide); QByteArray viewState() const; - bool setViewState(const QByteArray& state) const; + bool setViewState(const QByteArray& state); public slots: void setGroup(Group* group); @@ -74,6 +74,9 @@ private slots: void resetViewToDefaults(); private: + void fillRemainingWidth(bool lastColumnOnly); + void resetFixedColumns(); + EntryModel* const m_model; SortFilterHideProxyModel* const m_sortModel; bool m_inSearchMode; From a06a1f84e08f01186f723b64a035ac7985f265b6 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Wed, 21 Feb 2018 23:01:02 +0100 Subject: [PATCH 383/402] Don't hardcode install_name_tool change path, resolves #1518 --- CMakeLists.txt | 2 ++ share/translations/CMakeLists.txt | 4 ++-- src/CMakeLists.txt | 2 +- src/proxy/CMakeLists.txt | 4 ++-- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index edfd341a3..7a1b0245a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -298,6 +298,8 @@ if(Qt5Core_VERSION VERSION_LESS "5.2.0") message(FATAL_ERROR "Qt version 5.2.0 or higher is required") endif() +get_filename_component(Qt5_PREFIX ${Qt5_DIR}/../../.. REALPATH) + set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) diff --git a/share/translations/CMakeLists.txt b/share/translations/CMakeLists.txt index 78ff0bcc4..5ca739695 100644 --- a/share/translations/CMakeLists.txt +++ b/share/translations/CMakeLists.txt @@ -23,12 +23,12 @@ message(STATUS "Including translations...\n") qt5_add_translation(QM_FILES ${TRANSLATION_FILES}) if(MINGW) - file(GLOB QTBASE_TRANSLATIONS ${Qt5_DIR}/../../../share/qt5/translations/qtbase_*.qm) + file(GLOB QTBASE_TRANSLATIONS ${Qt5_PREFIX}/share/qt5/translations/qtbase_*.qm) elseif(APPLE OR KEEPASSXC_DIST_APPIMAGE) file(GLOB QTBASE_TRANSLATIONS /usr/share/qt/translations/qtbase_*.qm /usr/share/qt5/translations/qtbase_*.qm - ${Qt5_DIR}/../../../translations/qtbase_*.qm) + ${Qt5_PREFIX}/translations/qtbase_*.qm) endif() set(QM_FILES ${QM_FILES} ${QTBASE_TRANSLATIONS}) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f9e562dff..10a06e0fc 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -382,7 +382,7 @@ if(MINGW) include(DeployQt4) install_qt4_executable(${PROGNAME}.exe) add_custom_command(TARGET ${PROGNAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${Qt5_DIR}/../../../share/qt5/plugins/platforms/qwindows$<$<CONFIG:Debug>:d>.dll + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${Qt5_PREFIX}/share/qt5/plugins/platforms/qwindows$<$<CONFIG:Debug>:d>.dll $<TARGET_FILE_DIR:${PROGNAME}>) install(FILES $<TARGET_FILE_DIR:${PROGNAME}>/qwindows$<$<CONFIG:Debug>:d>.dll DESTINATION "platforms") endif() diff --git a/src/proxy/CMakeLists.txt b/src/proxy/CMakeLists.txt index 35e02ea26..f19481c06 100755 --- a/src/proxy/CMakeLists.txt +++ b/src/proxy/CMakeLists.txt @@ -42,13 +42,13 @@ if(WITH_XC_BROWSER) add_custom_command(TARGET keepassxc-proxy POST_BUILD - COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change /usr/local/opt/qt/lib/QtCore.framework/Versions/5/QtCore "@executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore" ${PROXY_APP_DIR} + COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change ${Qt5_PREFIX}/lib/QtCore.framework/Versions/5/QtCore "@executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore" ${PROXY_APP_DIR} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/src COMMENT "Changing linking of keepassxc-proxy QtCore") add_custom_command(TARGET keepassxc-proxy POST_BUILD - COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change /usr/local/opt/qt/lib/QtNetwork.framework/Versions/5/QtNetwork "@executable_path/../Frameworks/QtNetwork.framework/Versions/5/QtNetwork" ${PROXY_APP_DIR} + COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change ${Qt5_PREFIX}/lib/QtNetwork.framework/Versions/5/QtNetwork "@executable_path/../Frameworks/QtNetwork.framework/Versions/5/QtNetwork" ${PROXY_APP_DIR} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/src COMMENT "Changing linking of keepassxc-proxy QtNetwork") endif() From ad92b11f127043845de792a5503ba13f35984d62 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sun, 25 Feb 2018 02:00:31 +0100 Subject: [PATCH 384/402] Use edlided label for details widget title and adjust layout spacing --- src/gui/DatabaseWidget.cpp | 8 +- src/gui/DetailsWidget.cpp | 4 +- src/gui/DetailsWidget.ui | 342 ++++++++++++++++++++++--------------- 3 files changed, 211 insertions(+), 143 deletions(-) diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 06b7b87b7..ff9d15fc0 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -76,7 +76,7 @@ DatabaseWidget::DatabaseWidget(Database* db, QWidget* parent) m_messageWidget = new MessageWidget(this); m_messageWidget->setHidden(true); - QVBoxLayout* mainLayout = new QVBoxLayout(); + auto* mainLayout = new QVBoxLayout(); QLayout* layout = new QHBoxLayout(); mainLayout->addWidget(m_messageWidget); mainLayout->addLayout(layout); @@ -119,7 +119,7 @@ DatabaseWidget::DatabaseWidget(Database* db, QWidget* parent) connect(m_detailsView, SIGNAL(errorOccurred(QString)), this, SLOT(showErrorMessage(QString))); - QVBoxLayout* vLayout = new QVBoxLayout(rightHandSideWidget); + auto* vLayout = new QVBoxLayout(rightHandSideWidget); vLayout->setMargin(0); vLayout->addWidget(m_searchingLabel); vLayout->addWidget(m_detailSplitter); @@ -127,8 +127,8 @@ DatabaseWidget::DatabaseWidget(Database* db, QWidget* parent) m_detailSplitter->addWidget(m_entryView); m_detailSplitter->addWidget(m_detailsView); - m_detailSplitter->setStretchFactor(0, 80); - m_detailSplitter->setStretchFactor(1, 20); + m_detailSplitter->setStretchFactor(0, 100); + m_detailSplitter->setStretchFactor(1, 0); m_searchingLabel->setVisible(false); diff --git a/src/gui/DetailsWidget.cpp b/src/gui/DetailsWidget.cpp index 1ac20c9d8..77de24666 100644 --- a/src/gui/DetailsWidget.cpp +++ b/src/gui/DetailsWidget.cpp @@ -134,7 +134,7 @@ void DetailsWidget::updateEntryHeaderLine() { Q_ASSERT(m_currentEntry); const QString title = m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->title()); - m_ui->entryTitleLabel->setText(hierarchy(m_currentEntry->group(), title)); + m_ui->entryTitleLabel->setRawText(hierarchy(m_currentEntry->group(), title)); m_ui->entryIcon->setPixmap(preparePixmap(m_currentEntry->iconPixmap(), 16)); } @@ -250,7 +250,7 @@ void DetailsWidget::updateEntryAutotypeTab() void DetailsWidget::updateGroupHeaderLine() { Q_ASSERT(m_currentGroup); - m_ui->groupTitleLabel->setText(hierarchy(m_currentGroup, {})); + m_ui->groupTitleLabel->setRawText(hierarchy(m_currentGroup, {})); m_ui->groupIcon->setPixmap(preparePixmap(m_currentGroup->iconPixmap(), 32)); } diff --git a/src/gui/DetailsWidget.ui b/src/gui/DetailsWidget.ui index 5446f6510..53787d713 100644 --- a/src/gui/DetailsWidget.ui +++ b/src/gui/DetailsWidget.ui @@ -25,11 +25,26 @@ </property> <widget class="QWidget" name="pageEntry"> <layout class="QVBoxLayout" name="verticalLayout_3"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> <item> - <layout class="QHBoxLayout" name="entryHorizontalLayout" stretch="0,0,0,0,0,0"> + <layout class="QHBoxLayout" name="entryHorizontalLayout" stretch="0,0,0,0,0"> <property name="sizeConstraint"> <enum>QLayout::SetDefaultConstraint</enum> </property> + <property name="leftMargin"> + <number>9</number> + </property> <item> <widget class="QLabel" name="entryIcon"> <property name="sizePolicy"> @@ -44,9 +59,9 @@ </widget> </item> <item> - <widget class="QLabel" name="entryTitleLabel"> + <widget class="ElidedLabel" name="entryTitleLabel"> <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> @@ -61,19 +76,6 @@ </property> </widget> </item> - <item> - <spacer name="entryHorizontalSpacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> <item> <widget class="QWidget" name="entryTotpWidget" native="true"> <layout class="QGridLayout" name="gridLayout_3"> @@ -152,22 +154,75 @@ <layout class="QVBoxLayout" name="verticalLayout_5"> <item> <widget class="QWidget" name="entryGeneralWidget" native="true"> - <layout class="QGridLayout" name="gridLayout" rowstretch="0,0,0,0,1" columnstretch="0,0,1"> - <item row="0" column="0"> - <spacer name="entryLeftHorizontalSpacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> + <layout class="QGridLayout" name="gridLayout" rowstretch="0,0,0,0,0" columnstretch="0,0,0"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item row="1" column="2"> + <widget class="ElidedLabel" name="entryPasswordLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> </property> - <property name="sizeType"> - <enum>QSizePolicy::Fixed</enum> - </property> - <property name="sizeHint" stdset="0"> + <property name="minimumSize"> <size> - <width>20</width> - <height>20</height> + <width>100</width> + <height>0</height> </size> </property> - </spacer> + </widget> + </item> + <item row="2" column="2"> + <widget class="ElidedLabel" name="entryUrlLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>100</width> + <height>0</height> + </size> + </property> + <property name="cursor"> + <cursorShape>PointingHandCursor</cursorShape> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="0" column="2"> + <widget class="QLabel" name="entryUsernameLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>100</width> + <height>0</height> + </size> + </property> + <property name="textInteractionFlags"> + <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set> + </property> + </widget> </item> <item row="0" column="1"> <widget class="QLabel" name="entryUsernameTitleLabel"> @@ -194,21 +249,8 @@ </property> </widget> </item> - <item row="0" column="2"> - <widget class="QLabel" name="entryUsernameLabel"> - <property name="minimumSize"> - <size> - <width>100</width> - <height>0</height> - </size> - </property> - <property name="textInteractionFlags"> - <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QLabel" name="entryPasswordTitleLabel"> + <item row="3" column="1"> + <widget class="QLabel" name="entryExpirationTitleLabel"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> <horstretch>0</horstretch> @@ -222,20 +264,20 @@ </font> </property> <property name="text"> - <string>Password</string> + <string>Expiration</string> </property> <property name="alignment"> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> </property> </widget> </item> - <item row="1" column="2"> - <widget class="ElidedLabel" name="entryPasswordLabel"> - <property name="minimumSize"> - <size> - <width>100</width> - <height>0</height> - </size> + <item row="3" column="2"> + <widget class="QLabel" name="entryExpirationLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> </property> </widget> </item> @@ -261,24 +303,24 @@ </property> </widget> </item> - <item row="2" column="2"> - <widget class="ElidedLabel" name="entryUrlLabel"> - <property name="minimumSize"> + <item row="0" column="0"> + <spacer name="entryLeftHorizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Fixed</enum> + </property> + <property name="sizeHint" stdset="0"> <size> - <width>100</width> - <height>0</height> + <width>20</width> + <height>20</height> </size> </property> - <property name="cursor"> - <cursorShape>PointingHandCursor</cursorShape> - </property> - <property name="text"> - <string/> - </property> - </widget> + </spacer> </item> - <item row="3" column="1"> - <widget class="QLabel" name="entryExpirationTitleLabel"> + <item row="1" column="1"> + <widget class="QLabel" name="entryPasswordTitleLabel"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> <horstretch>0</horstretch> @@ -292,25 +334,22 @@ </font> </property> <property name="text"> - <string>Expiration</string> + <string>Password</string> </property> <property name="alignment"> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> </property> </widget> </item> - <item row="3" column="2"> - <widget class="QLabel" name="entryExpirationLabel"/> - </item> <item row="4" column="2"> - <spacer name="entryBottomVerticalSpacer"> + <spacer name="verticalSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> - <width>20</width> - <height>10</height> + <width>0</width> + <height>0</height> </size> </property> </spacer> @@ -418,11 +457,26 @@ </widget> <widget class="QWidget" name="pageGroup"> <layout class="QVBoxLayout" name="verticalLayout_13"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> <item> - <layout class="QHBoxLayout" name="groupHorizontalLayout" stretch="0,0,0,0"> + <layout class="QHBoxLayout" name="groupHorizontalLayout" stretch="0,0,0"> <property name="sizeConstraint"> <enum>QLayout::SetDefaultConstraint</enum> </property> + <property name="leftMargin"> + <number>9</number> + </property> <item> <widget class="QLabel" name="groupIcon"> <property name="sizePolicy"> @@ -437,9 +491,9 @@ </widget> </item> <item> - <widget class="QLabel" name="groupTitleLabel"> + <widget class="ElidedLabel" name="groupTitleLabel"> <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> @@ -454,19 +508,6 @@ </property> </widget> </item> - <item> - <spacer name="groupHorizontalSpacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> <item> <widget class="QToolButton" name="groupCloseButton"> <property name="toolTip"> @@ -503,22 +544,50 @@ <layout class="QVBoxLayout" name="verticalLayout_8"> <item> <widget class="QWidget" name="groupGeneralWidget" native="true"> - <layout class="QGridLayout" name="gridLayout_2" columnstretch="0,0,1"> - <item row="0" column="0"> - <spacer name="groupLeftHorizontalSpacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> + <layout class="QGridLayout" name="gridLayout_2" columnstretch="0,0,0"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item row="2" column="2"> + <widget class="QLabel" name="groupExpirationLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> </property> - <property name="sizeType"> - <enum>QSizePolicy::Fixed</enum> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLabel" name="groupExpirationTitleLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>20</height> - </size> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> </property> - </spacer> + <property name="text"> + <string>Expiration</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> </item> <item row="0" column="1"> <widget class="QLabel" name="groupAutotypeTitleLabel"> @@ -543,7 +612,40 @@ </widget> </item> <item row="0" column="2"> - <widget class="QLabel" name="groupAutotypeLabel"/> + <widget class="QLabel" name="groupAutotypeLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="1" column="2"> + <widget class="QLabel" name="groupSearchingLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="0" column="0"> + <spacer name="groupLeftHorizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Fixed</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> </item> <item row="1" column="1"> <widget class="QLabel" name="groupSearchingTitleLabel"> @@ -567,45 +669,11 @@ </property> </widget> </item> - <item row="1" column="2"> - <widget class="QLabel" name="groupSearchingLabel"/> - </item> - <item row="2" column="1"> - <widget class="QLabel" name="groupExpirationTitleLabel"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="font"> - <font> - <weight>75</weight> - <bold>true</bold> - </font> - </property> - <property name="text"> - <string>Expiration</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item row="2" column="2"> - <widget class="QLabel" name="groupExpirationLabel"/> - </item> <item row="3" column="2"> - <spacer name="groupBottomVerticalSpacer"> + <spacer name="verticalSpacer_2"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>10</height> - </size> - </property> </spacer> </item> </layout> From 09d3896304b021b57bfb0987221a4650aea4d10d Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sun, 25 Feb 2018 20:02:12 +0100 Subject: [PATCH 385/402] Force Docker rebuild --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 5bcef9ab9..31d8cf6ca 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,7 +16,7 @@ FROM ubuntu:14.04 -ENV REBUILD_COUNTER=5 +ENV REBUILD_COUNTER=6 ENV QT5_VERSION=59 ENV QT5_PPA_VERSION=${QT5_VERSION}4 From 2e9f247e292e1d0ebe088c2532479e721bdf0e9a Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Mon, 26 Feb 2018 00:26:28 +0100 Subject: [PATCH 386/402] Enable proper KeePassXC-Browser interaction for AppImage --- AppImage-Recipe.sh | 5 +++++ src/browser/BrowserOptionDialog.cpp | 6 ++++++ src/browser/HostInstaller.cpp | 11 +++++++++++ 3 files changed, 22 insertions(+) diff --git a/AppImage-Recipe.sh b/AppImage-Recipe.sh index 342dd0840..96e7b4099 100755 --- a/AppImage-Recipe.sh +++ b/AppImage-Recipe.sh @@ -88,6 +88,11 @@ unset XDG_DATA_DIRS if [ "\${1}" == "cli" ]; then shift exec keepassxc-cli "\$@" +elif [ "\${1}" == "proxy" ]; then + shift + exec keepassxc-proxy "\$@" +elif [ -v CHROME_WRAPPER ] || [ -v MOZ_LAUNCHED_CHILD ]; then + exec keepassxc-proxy "\$@" else exec keepassxc "\$@" fi diff --git a/src/browser/BrowserOptionDialog.cpp b/src/browser/BrowserOptionDialog.cpp index f6d634a82..39b514fde 100755 --- a/src/browser/BrowserOptionDialog.cpp +++ b/src/browser/BrowserOptionDialog.cpp @@ -19,6 +19,7 @@ #include "BrowserOptionDialog.h" #include "ui_BrowserOptionDialog.h" +#include "config-keepassx.h" #include "BrowserSettings.h" #include "core/FilePath.h" @@ -45,6 +46,11 @@ BrowserOptionDialog::BrowserOptionDialog(QWidget* parent) : connect(m_ui->useCustomProxy, SIGNAL(toggled(bool)), m_ui->customProxyLocation, SLOT(setEnabled(bool))); connect(m_ui->useCustomProxy, SIGNAL(toggled(bool)), m_ui->customProxyLocationBrowseButton, SLOT(setEnabled(bool))); connect(m_ui->customProxyLocationBrowseButton, SIGNAL(clicked()), this, SLOT(showProxyLocationFileDialog())); + +#ifdef KEEPASSXC_DIST_APPIMAGE + m_ui->supportBrowserProxy->setChecked(true); + m_ui->supportBrowserProxy->setEnabled(false); +#endif } BrowserOptionDialog::~BrowserOptionDialog() diff --git a/src/browser/HostInstaller.cpp b/src/browser/HostInstaller.cpp index 9271da69e..9b27ab1cf 100644 --- a/src/browser/HostInstaller.cpp +++ b/src/browser/HostInstaller.cpp @@ -17,12 +17,14 @@ */ #include "HostInstaller.h" +#include "config-keepassx.h" #include <QDir> #include <QFile> #include <QStandardPaths> #include <QJsonArray> #include <QJsonDocument> #include <QCoreApplication> +#include <QProcessEnvironment> #include <QMessageBox> const QString HostInstaller::HOST_NAME = "org.keepassxc.keepassxc_browser"; @@ -161,6 +163,13 @@ QString HostInstaller::getInstallDir(SupportedBrowsers browser) const QJsonObject HostInstaller::constructFile(SupportedBrowsers browser, const bool& proxy, const QString& location) { QString path; +#ifdef KEEPASSXC_DIST_APPIMAGE + if (proxy && !location.isEmpty()) { + path = location; + } else { + path = QProcessEnvironment::systemEnvironment().value("APPIMAGE"); + } +#else if (proxy) { if (!location.isEmpty()) { path = location; @@ -178,6 +187,8 @@ QJsonObject HostInstaller::constructFile(SupportedBrowsers browser, const bool& path.replace("/","\\"); #endif +#endif // #ifdef KEEPASSXC_DIST_APPIMAGE + QJsonObject script; script["name"] = HostInstaller::HOST_NAME; script["description"] = "KeePassXC integration with native messaging support"; From 0668c2be94e8ea7eda2459f578bea4160eee88b3 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Mon, 26 Feb 2018 01:34:16 +0100 Subject: [PATCH 387/402] Inform user that KeePassXC-Browser is not supported for Snaps at the moment --- src/browser/BrowserOptionDialog.cpp | 17 +++++++++++++---- src/browser/BrowserOptionDialog.ui | 3 +++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/browser/BrowserOptionDialog.cpp b/src/browser/BrowserOptionDialog.cpp index 39b514fde..693e62d26 100755 --- a/src/browser/BrowserOptionDialog.cpp +++ b/src/browser/BrowserOptionDialog.cpp @@ -47,10 +47,7 @@ BrowserOptionDialog::BrowserOptionDialog(QWidget* parent) : connect(m_ui->useCustomProxy, SIGNAL(toggled(bool)), m_ui->customProxyLocationBrowseButton, SLOT(setEnabled(bool))); connect(m_ui->customProxyLocationBrowseButton, SIGNAL(clicked()), this, SLOT(showProxyLocationFileDialog())); -#ifdef KEEPASSXC_DIST_APPIMAGE - m_ui->supportBrowserProxy->setChecked(true); - m_ui->supportBrowserProxy->setEnabled(false); -#endif + m_ui->browserGlobalWarningWidget->setVisible(false); } BrowserOptionDialog::~BrowserOptionDialog() @@ -90,6 +87,18 @@ void BrowserOptionDialog::loadSettings() m_ui->chromiumSupport->setChecked(settings.chromiumSupport()); m_ui->firefoxSupport->setChecked(settings.firefoxSupport()); m_ui->vivaldiSupport->setChecked(settings.vivaldiSupport()); + +#if defined(KEEPASSXC_DIST_APPIMAGE) + m_ui->supportBrowserProxy->setChecked(true); + m_ui->supportBrowserProxy->setEnabled(false); +#elif defined(KEEPASSXC_DIST_SNAP) + m_ui->enableBrowserSupport->setChecked(false); + m_ui->enableBrowserSupport->setEnabled(false); + m_ui->browserGlobalWarningWidget->showMessage( + tr("We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment."), MessageWidget::Warning); + m_ui->browserGlobalWarningWidget->setCloseButtonVisible(false); + m_ui->browserGlobalWarningWidget->setAutoHideTimeout(-1); +#endif } void BrowserOptionDialog::saveSettings() diff --git a/src/browser/BrowserOptionDialog.ui b/src/browser/BrowserOptionDialog.ui index 9bb0250b3..e82379452 100755 --- a/src/browser/BrowserOptionDialog.ui +++ b/src/browser/BrowserOptionDialog.ui @@ -26,6 +26,9 @@ <property name="bottomMargin"> <number>0</number> </property> + <item> + <widget class="MessageWidget" name="browserGlobalWarningWidget" native="true"/> + </item> <item> <widget class="QCheckBox" name="enableBrowserSupport"> <property name="toolTip"> From f1cf697547a5b5d26aee4624e70526647d65eb22 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sun, 25 Feb 2018 20:17:43 +0100 Subject: [PATCH 388/402] Strip newlines from title, username and URL when saving entries, resolves #1502 --- src/gui/entry/EditEntryWidget.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index b180c2a01..3b70e4453 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -772,12 +772,14 @@ void EditEntryWidget::acceptEntry() void EditEntryWidget::updateEntryData(Entry* entry) const { + QRegularExpression newLineRegex("(?:\r?\n|\r)"); + entry->attributes()->copyCustomKeysFrom(m_entryAttributes); entry->attachments()->copyDataFrom(m_advancedUi->attachmentsWidget->entryAttachments()); entry->customData()->copyDataFrom(m_editWidgetProperties->customData()); - entry->setTitle(m_mainUi->titleEdit->text()); - entry->setUsername(m_mainUi->usernameEdit->text()); - entry->setUrl(m_mainUi->urlEdit->text()); + entry->setTitle(m_mainUi->titleEdit->text().replace(newLineRegex, " ")); + entry->setUsername(m_mainUi->usernameEdit->text().replace(newLineRegex, " ")); + entry->setUrl(m_mainUi->urlEdit->text().replace(newLineRegex, " ")); entry->setPassword(m_mainUi->passwordEdit->text()); entry->setExpires(m_mainUi->expireCheck->isChecked()); entry->setExpiryTime(m_mainUi->expireDatePicker->dateTime().toUTC()); From 7fbdcd3fed90527f6f92094166c1a7e40c38c853 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Sun, 25 Feb 2018 20:59:59 +0100 Subject: [PATCH 389/402] Add tests for newline sanitization --- tests/gui/TestGui.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests/gui/TestGui.cpp b/tests/gui/TestGui.cpp index dd201c3de..b2ccd332d 100644 --- a/tests/gui/TestGui.cpp +++ b/tests/gui/TestGui.cpp @@ -364,6 +364,22 @@ void TestGui::testEditEntry() // Confirm modified indicator is showing QTRY_COMPARE(m_tabWidget->tabText(m_tabWidget->currentIndex()), QString("%1*").arg(m_dbFileName)); + + // Test copy & paste newline sanitization + QTest::mouseClick(entryEditWidget, Qt::LeftButton); + QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::EditMode); + titleEdit->setText("multiline\ntitle"); + editEntryWidget->findChild<QLineEdit*>("usernameEdit")->setText("multiline\nusername"); + editEntryWidget->findChild<QLineEdit*>("passwordEdit")->setText("multiline\npassword"); + editEntryWidget->findChild<QLineEdit*>("passwordRepeatEdit")->setText("multiline\npassword"); + editEntryWidget->findChild<QLineEdit*>("urlEdit")->setText("multiline\nurl"); + QTest::mouseClick(editEntryWidgetButtonBox->button(QDialogButtonBox::Ok), Qt::LeftButton); + + QCOMPARE(entry->title(), QString("multiline title")); + QCOMPARE(entry->username(), QString("multiline username")); + // here we keep newlines, so users can't lock themselves out accidentally + QCOMPARE(entry->password(), QString("multiline\npassword")); + QCOMPARE(entry->url(), QString("multiline url")); } void TestGui::testSearchEditEntry() From cc3cc3556569f039436edfc2b51dc46924aaa070 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Tue, 27 Feb 2018 01:23:31 +0100 Subject: [PATCH 390/402] Update library paths in AppImage recipe and Dockerfiles --- AppImage-Recipe.sh | 10 +++++----- Dockerfile | 19 ++++++++++--------- ci/trusty/Dockerfile | 17 +++++++++-------- 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/AppImage-Recipe.sh b/AppImage-Recipe.sh index 96e7b4099..da3830144 100755 --- a/AppImage-Recipe.sh +++ b/AppImage-Recipe.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash # # KeePassXC AppImage Recipe -# Copyright (C) 2017 KeePassXC team <https://keepassxc.org/> +# Copyright (C) 2017-2018 KeePassXC team <https://keepassxc.org/> # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -68,17 +68,17 @@ get_apprun copy_deps # protect our libgpg-error from being deleted -mv ./opt/gpg-error-127/lib/x86_64-linux-gnu/libgpg-error.so.0 ./protected.so +mv ./opt/keepassxc-libs/lib/x86_64-linux-gnu/libgpg-error.so.0 ./protected.so delete_blacklisted -mv ./protected.so ./opt/gpg-error-127/lib/x86_64-linux-gnu/libgpg-error.so.0 +mv ./protected.so ./opt/keepassxc-libs/lib/x86_64-linux-gnu/libgpg-error.so.0 get_desktop get_icon cat << EOF > ./usr/bin/keepassxc_env #!/usr/bin/env bash -export LD_LIBRARY_PATH="../opt/libgcrypt20-18/lib/x86_64-linux-gnu:\${LD_LIBRARY_PATH}" -export LD_LIBRARY_PATH="../opt/gpg-error-127/lib/x86_64-linux-gnu:\${LD_LIBRARY_PATH}" export LD_LIBRARY_PATH="..$(dirname ${QT_PLUGIN_PATH})/lib:\${LD_LIBRARY_PATH}" +export LD_LIBRARY_PATH="../opt/keepassxc-libs/lib/x86_64-linux-gnu:\${LD_LIBRARY_PATH}" + export QT_PLUGIN_PATH="..${QT_PLUGIN_PATH}:\${KPXC_QT_PLUGIN_PATH}" # unset XDG_DATA_DIRS to make tray icon work in Ubuntu Unity diff --git a/Dockerfile b/Dockerfile index 31d8cf6ca..f9ff0cd1e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,7 +16,7 @@ FROM ubuntu:14.04 -ENV REBUILD_COUNTER=6 +ENV REBUILD_COUNTER=8 ENV QT5_VERSION=59 ENV QT5_PPA_VERSION=${QT5_VERSION}4 @@ -42,6 +42,7 @@ RUN set -x \ libgcrypt20-18-dev \ libargon2-0-dev \ libsodium-dev \ + libcurl-no-gcrypt-dev \ qt${QT5_VERSION}base \ qt${QT5_VERSION}tools \ qt${QT5_VERSION}x11extras \ @@ -51,17 +52,17 @@ RUN set -x \ libxtst-dev \ mesa-common-dev \ libyubikey-dev \ - libykpers-1-dev \ - libcurl4-openssl-dev + libykpers-1-dev ENV CMAKE_PREFIX_PATH="/opt/qt${QT5_VERSION}/lib/cmake" -ENV CMAKE_INCLUDE_PATH="/opt/libgcrypt20-18/include:/opt/gpg-error-127/include" -ENV CMAKE_LIBRARY_PATH="/opt/libgcrypt20-18/lib/x86_64-linux-gnu:/opt/gpg-error-127/lib/x86_64-linux-gnu" -ENV LD_LIBRARY_PATH="/opt/qt${QT5_VERSION}/lib:/opt/libgcrypt20-18/lib/x86_64-linux-gnu:/opt/gpg-error-127/lib/x86_64-linux-gnu" +ENV CMAKE_INCLUDE_PATH="/opt/keepassxc-libs/include" +ENV CMAKE_LIBRARY_PATH="/opt/keepassxc-libs/lib/x86_64-linux-gnu" +ENV CPATH="${CMAKE_INCLUDE_PATH}" +ENV LD_LIBRARY_PATH="${CMAKE_LIBRARY_PATH}:/opt/qt${QT5_VERSION}/lib" + RUN set -x \ - && echo "/opt/qt${QT_VERSION}/lib" > /etc/ld.so.conf.d/qt${QT5_VERSION}.conf \ - && echo "/opt/libgcrypt20-18/lib/x86_64-linux-gnu" > /etc/ld.so.conf.d/libgcrypt20-18.conf \ - && echo "/opt/gpg-error-127/lib/x86_64-linux-gnu" > /etc/ld.so.conf.d/libgpg-error-127.conf + && echo "/opt/qt${QT5_VERSION}/lib" > /etc/ld.so.conf.d/qt${QT5_VERSION}.conf \ + && echo "/opt/keepassxc-libs/lib/x86_64-linux-gnu" > /etc/ld.so.conf.d/keepassxc.conf # AppImage dependencies RUN set -x \ diff --git a/ci/trusty/Dockerfile b/ci/trusty/Dockerfile index 5ef9cac23..d10c609a0 100644 --- a/ci/trusty/Dockerfile +++ b/ci/trusty/Dockerfile @@ -18,7 +18,7 @@ FROM ubuntu:14.04 -ENV REBUILD_COUNTER=2 +ENV REBUILD_COUNTER=4 ENV QT5_VERSION=53 ENV QT5_PPA_VERSION=${QT5_VERSION}2 @@ -43,7 +43,7 @@ RUN set -x \ libgcrypt20-18-dev \ libargon2-0-dev \ libsodium-dev \ - libcurl4-openssl-dev \ + libcurl-no-gcrypt-dev \ qt${QT5_VERSION}base \ qt${QT5_VERSION}tools \ qt${QT5_VERSION}x11extras \ @@ -56,13 +56,14 @@ RUN set -x \ xvfb ENV CMAKE_PREFIX_PATH="/opt/qt${QT5_VERSION}/lib/cmake" -ENV CMAKE_INCLUDE_PATH="/opt/libgcrypt20-18/include:/opt/gpg-error-127/include" -ENV CMAKE_LIBRARY_PATH="/opt/libgcrypt20-18/lib/x86_64-linux-gnu:/opt/gpg-error-127/lib/x86_64-linux-gnu" -ENV LD_LIBRARY_PATH="/opt/qt${QT5_VERSION}/lib:/opt/libgcrypt20-18/lib/x86_64-linux-gnu:/opt/gpg-error-127/lib/x86_64-linux-gnu" +ENV CMAKE_INCLUDE_PATH="/opt/keepassxc-libs/include" +ENV CMAKE_LIBRARY_PATH="/opt/keepassxc-libs/lib/x86_64-linux-gnu" +ENV CPATH="${CMAKE_INCLUDE_PATH}" +ENV LD_LIBRARY_PATH="${CMAKE_LIBRARY_PATH}:/opt/qt${QT5_VERSION}/lib" + RUN set -x \ - && echo "/opt/qt${QT_VERSION}/lib" > /etc/ld.so.conf.d/qt${QT5_VERSION}.conf \ - && echo "/opt/libgcrypt20-18/lib/x86_64-linux-gnu" > /etc/ld.so.conf.d/libgcrypt20-18.conf \ - && echo "/opt/gpg-error-127/lib/x86_64-linux-gnu" > /etc/ld.so.conf.d/libgpg-error-127.conf + && echo "/opt/qt${QT5_VERSION}/lib" > /etc/ld.so.conf.d/qt${QT5_VERSION}.conf \ + && echo "/opt/keepassxc-libs/lib/x86_64-linux-gnu" > /etc/ld.so.conf.d/keepassxc.conf RUN set -x \ && apt-get autoremove --purge \ From c1a397e624d0fefc28321e3adf8b7ee26cc1ba0f Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Tue, 27 Feb 2018 02:39:54 +0100 Subject: [PATCH 391/402] Bundle image format and input context plugins with AppImage --- AppImage-Recipe.sh | 4 +++- Dockerfile | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/AppImage-Recipe.sh b/AppImage-Recipe.sh index da3830144..9975f4939 100755 --- a/AppImage-Recipe.sh +++ b/AppImage-Recipe.sh @@ -62,7 +62,9 @@ if [ "$QXCB_PLUGIN" == "" ]; then fi QT_PLUGIN_PATH="$(dirname $(dirname $QXCB_PLUGIN))" mkdir -p ".${QT_PLUGIN_PATH}/platforms" -cp "$QXCB_PLUGIN" ".${QT_PLUGIN_PATH}/platforms/" +cp -a "$QXCB_PLUGIN" ".${QT_PLUGIN_PATH}/platforms/" +cp -a "${QT_PLUGIN_PATH}/platforminputcontexts/" ".${QT_PLUGIN_PATH}/platforminputcontexts/" +cp -a "${QT_PLUGIN_PATH}/imageformats/" ".${QT_PLUGIN_PATH}/imageformats/" get_apprun copy_deps diff --git a/Dockerfile b/Dockerfile index f9ff0cd1e..cee347e69 100644 --- a/Dockerfile +++ b/Dockerfile @@ -47,6 +47,7 @@ RUN set -x \ qt${QT5_VERSION}tools \ qt${QT5_VERSION}x11extras \ qt${QT5_VERSION}translations \ + qt${QT5_VERSION}imageformats \ zlib1g-dev \ libxi-dev \ libxtst-dev \ From 114f87c6b439a815c5e58718e1ed5577b2d759b5 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Tue, 27 Feb 2018 03:52:15 +0100 Subject: [PATCH 392/402] Bundle selected Qt plugins on Windows --- src/CMakeLists.txt | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 10a06e0fc..f5deeb2ee 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -380,9 +380,18 @@ if(MINGW) " COMPONENT Runtime) include(DeployQt4) - install_qt4_executable(${PROGNAME}.exe) - add_custom_command(TARGET ${PROGNAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${Qt5_PREFIX}/share/qt5/plugins/platforms/qwindows$<$<CONFIG:Debug>:d>.dll - $<TARGET_FILE_DIR:${PROGNAME}>) - install(FILES $<TARGET_FILE_DIR:${PROGNAME}>/qwindows$<$<CONFIG:Debug>:d>.dll DESTINATION "platforms") + + # install Qt5 plugins + set(PLUGINS_DIR ${Qt5_PREFIX}/share/qt5/plugins) + install(FILES ${PLUGINS_DIR}/platforms/qwindows$<$<CONFIG:Debug>:d>.dll DESTINATION "platforms") + install(FILES ${PLUGINS_DIR}/platforminputcontexts/qtvirtualkeyboardplugin$<$<CONFIG:Debug>:d>.dll DESTINATION "platforminputcontexts") + install(FILES ${PLUGINS_DIR}/iconengines/qsvgicon$<$<CONFIG:Debug>:d>.dll DESTINATION "iconengines") + install(FILES + ${PLUGINS_DIR}/imageformats/qgif$<$<CONFIG:Debug>:d>.dll + ${PLUGINS_DIR}/imageformats/qicns$<$<CONFIG:Debug>:d>.dll + ${PLUGINS_DIR}/imageformats/qico$<$<CONFIG:Debug>:d>.dll + ${PLUGINS_DIR}/imageformats/qjpeg$<$<CONFIG:Debug>:d>.dll + ${PLUGINS_DIR}/imageformats/qsvg$<$<CONFIG:Debug>:d>.dll + ${PLUGINS_DIR}/imageformats/qwebp$<$<CONFIG:Debug>:d>.dll + DESTINATION "imageformats") endif() From c13c6ade29fbbcd32c9b1746359cc2713833b293 Mon Sep 17 00:00:00 2001 From: Jonathan White <support@dmapps.us> Date: Tue, 27 Feb 2018 00:22:13 -0500 Subject: [PATCH 393/402] Fix regression in Qt packaging on Windows --- src/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f5deeb2ee..fd7527e03 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -380,7 +380,8 @@ if(MINGW) " COMPONENT Runtime) include(DeployQt4) - + install_qt4_executable(${PROGNAME}.exe) + # install Qt5 plugins set(PLUGINS_DIR ${Qt5_PREFIX}/share/qt5/plugins) install(FILES ${PLUGINS_DIR}/platforms/qwindows$<$<CONFIG:Debug>:d>.dll DESTINATION "platforms") From e1558d630085ac448db37044b4ed68f71f4cb96a Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Tue, 27 Feb 2018 15:28:12 +0100 Subject: [PATCH 394/402] Avoid double file extension replacement in backup filename --- src/core/Database.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/core/Database.cpp b/src/core/Database.cpp index a4d663137..94b41cdf0 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -570,10 +570,11 @@ QString Database::writeDatabase(QIODevice* device) * @param filePath Path to the file to backup * @return */ + bool Database::backupDatabase(QString filePath) { QString backupFilePath = filePath; - auto re = QRegularExpression("(?:\\.kdbx)?$", QRegularExpression::CaseInsensitiveOption); + auto re = QRegularExpression("\\.kdbx$|(?<!\\.kdbx)$", QRegularExpression::CaseInsensitiveOption); backupFilePath.replace(re, ".old.kdbx"); QFile::remove(backupFilePath); return QFile::copy(filePath, backupFilePath); From e231774b054af0990ef9498f4c5d9a982881e02b Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Mon, 26 Feb 2018 10:21:35 +0100 Subject: [PATCH 395/402] Don't hardcode HINTS to macdeployqt --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7a1b0245a..7410b4e04 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -306,7 +306,7 @@ set(CMAKE_AUTORCC ON) if(APPLE) set(CMAKE_MACOSX_RPATH TRUE) - find_program(MACDEPLOYQT_EXE macdeployqt HINTS /usr/local/opt/qt5/bin ENV PATH) + find_program(MACDEPLOYQT_EXE macdeployqt HINTS ${Qt5_PREFIX}/bin ENV PATH) if(NOT MACDEPLOYQT_EXE) message(FATAL_ERROR "macdeployqt is required to build in macOS") else() From 6531f94f8635d25735852d678e707e60eb375c3b Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Tue, 27 Feb 2018 19:33:55 +0100 Subject: [PATCH 396/402] Try to change both the REALPATH and the symlink location --- src/proxy/CMakeLists.txt | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/proxy/CMakeLists.txt b/src/proxy/CMakeLists.txt index f19481c06..f4c197e39 100755 --- a/src/proxy/CMakeLists.txt +++ b/src/proxy/CMakeLists.txt @@ -42,14 +42,17 @@ if(WITH_XC_BROWSER) add_custom_command(TARGET keepassxc-proxy POST_BUILD - COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change ${Qt5_PREFIX}/lib/QtCore.framework/Versions/5/QtCore "@executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore" ${PROXY_APP_DIR} + COMMAND ${CMAKE_INSTALL_NAME_TOOL} + -change ${Qt5_PREFIX}/lib/QtCore.framework/Versions/5/QtCore + "@executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore" + -change /usr/local/opt/qt/lib/QtCore.framework/Versions/5/QtCore + "@executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore" + -change ${Qt5_PREFIX}/lib/QtNetwork.framework/Versions/5/QtNetwork + "@executable_path/../Frameworks/QtNetwork.framework/Versions/5/QtNetwork" + -change /usr/local/opt/qt/lib/QtNetwork.framework/Versions/5/QtNetwork + "@executable_path/../Frameworks/QtNetwork.framework/Versions/5/QtNetwork" + ${PROXY_APP_DIR} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/src - COMMENT "Changing linking of keepassxc-proxy QtCore") - - add_custom_command(TARGET keepassxc-proxy - POST_BUILD - COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change ${Qt5_PREFIX}/lib/QtNetwork.framework/Versions/5/QtNetwork "@executable_path/../Frameworks/QtNetwork.framework/Versions/5/QtNetwork" ${PROXY_APP_DIR} - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/src - COMMENT "Changing linking of keepassxc-proxy QtNetwork") + COMMENT "Changing linking of keepassxc-proxy") endif() endif() From 395afe59eb816679b4d486a6b7fcd1c6b186febb Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Tue, 27 Feb 2018 19:38:40 +0100 Subject: [PATCH 397/402] Update release-tool to use generic /usr/local/opt/qt path on macOS --- release-tool | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/release-tool b/release-tool index c0739a0b4..74f205900 100755 --- a/release-tool +++ b/release-tool @@ -658,17 +658,12 @@ build() { if [ "" == "$DOCKER_IMAGE" ]; then if [ "$(uname -s)" == "Darwin" ]; then # Building on macOS - local qt_vers="$(ls /usr/local/Cellar/qt 2> /dev/null | sort -r | head -n1)" - if [ "" == "$qt_vers" ]; then - exitError "Couldn't find Qt5! Please make sure it is available in '/usr/local/Cellar/qt'." - fi - export MACOSX_DEPLOYMENT_TARGET=10.10 logInfo "Configuring build..." cmake -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \ - -DCMAKE_PREFIX_PATH="/usr/local/Cellar/qt/${qt_vers}/lib/cmake" \ + -DCMAKE_PREFIX_PATH="/usr/local/opt/qt/lib/cmake" \ ${CMAKE_OPTIONS} "$SRC_DIR" logInfo "Compiling and packaging sources..." From 4c8d426f23b35c8865bc81f8fcd9d21e3869879c Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Tue, 27 Feb 2018 20:06:33 +0100 Subject: [PATCH 398/402] Use copy instead of rename for unsafe saving on Linux Resolves #1511 See https://bugreports.qt.io/browse/QTBUG-64008 --- src/core/Database.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/core/Database.cpp b/src/core/Database.cpp index 94b41cdf0..00cb76f48 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -537,11 +537,19 @@ QString Database::saveToFile(QString filePath, bool atomic, bool backup) // Delete the original db and move the temp file in place QFile::remove(filePath); +#ifdef Q_OS_LINUX + // workaround to make this workaround work, see: https://bugreports.qt.io/browse/QTBUG-64008 + if (tempFile.copy(filePath)) { + // successfully saved database file + return {}; + } +#else if (tempFile.rename(filePath)) { // successfully saved database file tempFile.setAutoRemove(false); return {}; } +#endif } error = tempFile.errorString(); } From 59f17ab8f3a62fb9f214a88967f62f4ea924f2b4 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Tue, 27 Feb 2018 14:00:52 +0100 Subject: [PATCH 399/402] Fix missing Qt platform styles and CA bundles in Windows release deployment --- src/CMakeLists.txt | 9 ++++++++- src/gui/EditWidgetIcons.cpp | 7 +++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fd7527e03..8c3245a28 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -384,7 +384,11 @@ if(MINGW) # install Qt5 plugins set(PLUGINS_DIR ${Qt5_PREFIX}/share/qt5/plugins) - install(FILES ${PLUGINS_DIR}/platforms/qwindows$<$<CONFIG:Debug>:d>.dll DESTINATION "platforms") + install(FILES + ${PLUGINS_DIR}/platforms/qwindows$<$<CONFIG:Debug>:d>.dll + ${PLUGINS_DIR}/platforms/qdirect2d$<$<CONFIG:Debug>:d>.dll + DESTINATION "platforms") + install(FILES ${PLUGINS_DIR}/styles/qwindowsvistastyle$<$<CONFIG:Debug>:d>.dll DESTINATION "styles") install(FILES ${PLUGINS_DIR}/platforminputcontexts/qtvirtualkeyboardplugin$<$<CONFIG:Debug>:d>.dll DESTINATION "platforminputcontexts") install(FILES ${PLUGINS_DIR}/iconengines/qsvgicon$<$<CONFIG:Debug>:d>.dll DESTINATION "iconengines") install(FILES @@ -395,4 +399,7 @@ if(MINGW) ${PLUGINS_DIR}/imageformats/qsvg$<$<CONFIG:Debug>:d>.dll ${PLUGINS_DIR}/imageformats/qwebp$<$<CONFIG:Debug>:d>.dll DESTINATION "imageformats") + + # install CA cert chains + install(FILES ${Qt5_PREFIX}/ssl/certs/ca-bundle.crt DESTINATION "ssl/certs") endif() diff --git a/src/gui/EditWidgetIcons.cpp b/src/gui/EditWidgetIcons.cpp index 9a73c293c..1c33150b5 100644 --- a/src/gui/EditWidgetIcons.cpp +++ b/src/gui/EditWidgetIcons.cpp @@ -202,6 +202,13 @@ QImage EditWidgetIcons::fetchFavicon(const QUrl& url) curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1L); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &imagedata); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &writeCurlResponse); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L); +#ifdef Q_OS_WIN + const QDir appDir = QFileInfo(QCoreApplication::applicationFilePath()).absoluteDir(); + if (appDir.exists("ssl\\certs")) { + curl_easy_setopt(curl, CURLOPT_CAINFO, (appDir.absolutePath() + "\\ssl\\certs\\ca-bundle.crt").toLatin1().data()); + } +#endif // Perform the request in another thread CURLcode result = AsyncTask::runAndWaitForFuture([curl]() { From 3cde0d988edc4e013c2bf4edf9761223a5723f4c Mon Sep 17 00:00:00 2001 From: varjolintu <sami.vanttinen@protonmail.com> Date: Sat, 24 Feb 2018 09:59:49 +0200 Subject: [PATCH 400/402] Kills keepassxc-proxy and KeePassXC during install or uninstall under Windows --- share/windows/wix-template.xml | 16 ++++++++++++++++ src/CMakeLists.txt | 5 +++++ 2 files changed, 21 insertions(+) diff --git a/share/windows/wix-template.xml b/share/windows/wix-template.xml index 1e47029ef..44cab1641 100644 --- a/share/windows/wix-template.xml +++ b/share/windows/wix-template.xml @@ -3,6 +3,7 @@ <?include "cpack_variables.wxi"?> <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" + xmlns:util="http://schemas.microsoft.com/wix/UtilExtension" RequiredVersion="3.6.3303.0"> <Product Id="$(var.CPACK_WIX_PRODUCT_GUID)" @@ -47,5 +48,20 @@ <DirectoryRef Id="TARGETDIR"> <Directory Id="ProgramMenuFolder" /> </DirectoryRef> + + <Property Id="WixSilentExecCmdLine" Value='"Taskkill" /IM KeePassXC.exe'/> + <CustomAction Id="KillKeePassXCInstall" BinaryKey="WixCA" DllEntry="WixSilentExec" Execute="immediate" Return="ignore"/> + <CustomAction Id="KillKeePassXCUninstall" BinaryKey="WixCA" DllEntry="WixSilentExec" Execute="immediate" Return="ignore"/> + + <Property Id="WixQuietExecCmdLine" Value='"Taskkill" /IM keepassxc-proxy.exe /F'/> + <CustomAction Id="KillProxyInstall" BinaryKey="WixCA" DllEntry="WixQuietExec" Execute="immediate" Return="ignore"/> + <CustomAction Id="KillProxyUninstall" BinaryKey="WixCA" DllEntry="WixQuietExec" Execute="immediate" Return="ignore"/> + + <InstallExecuteSequence> + <Custom Action="KillKeePassXCInstall" After="InstallInitialize"/> + <Custom Action="KillProxyInstall" After="InstallInitialize"/> + <Custom Action="KillKeePassXCUninstall" Before="InstallValidate">Installed</Custom> + <Custom Action="KillProxyUninstall" Before="InstallValidate">Installed</Custom> + </InstallExecuteSequence> </Product> </Wix> diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8c3245a28..69526967c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -362,6 +362,10 @@ if(MINGW) set(CPACK_NSIS_MUI_UNWELCOMEFINISHPAGE_BITMAP "${CPACK_NSIS_MUI_WELCOMEFINISHPAGE_BITMAP}") set(CPACK_NSIS_CREATE_ICONS_EXTRA "CreateShortCut '$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\${PROGNAME}.lnk' '$INSTDIR\\\\${PROGNAME}.exe'") set(CPACK_NSIS_DELETE_ICONS_EXTRA "Delete '$SMPROGRAMS\\\\$START_MENU\\\\${PROGNAME}.lnk'") + set(CPACK_NSIS_EXTRA_PREINSTALL_COMMANDS "ExecWait 'Taskkill /IM KeePassXC.exe'") + set(CPACK_NSIS_EXTRA_PREINSTALL_COMMANDS "${CPACK_NSIS_EXTRA_PREINSTALL_COMMANDS}\nExecWait 'Taskkill /IM keepassxc-proxy.exe /F'") + set(CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS "ExecWait 'Taskkill /IM KeePassXC.exe'") + set(CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS "${CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS}\nExecWait 'Taskkill /IM keepassxc-proxy.exe /F'") set(CPACK_NSIS_URL_INFO_ABOUT "https://keepassxc.org") set(CPACK_NSIS_DISPLAY_NAME ${PROGNAME}) set(CPACK_NSIS_PACKAGE_NAME "${PROGNAME} v${KEEPASSXC_VERSION}") @@ -373,6 +377,7 @@ if(MINGW) set(CPACK_WIX_TEMPLATE "${CMAKE_SOURCE_DIR}/share/windows/wix-template.xml") set(CPACK_WIX_PATCH_FILE "${CMAKE_SOURCE_DIR}/share/windows/wix-patch.xml") set(CPACK_WIX_PROPERTY_ARPURLINFOABOUT "https://keepassxc.org") + set(CPACK_WIX_EXTENSIONS "WixUtilExtension.dll") include(CPack) install(CODE " From d8866c64d2a5b1f5b0c6767d5e7c4e4b6bc92253 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Tue, 27 Feb 2018 22:36:40 +0100 Subject: [PATCH 401/402] Update CHANGELOG for 2.3.0 --- CHANGELOG | 52 ++++++++++++++++++ .../linux/org.keepassxc.KeePassXC.appdata.xml | 54 +++++++++++++++++++ snapcraft.yaml | 2 +- 3 files changed, 107 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 24e935548..038943890 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,55 @@ +2.3.0 (2018-02-27) +========================= + +- Add support for KDBX 4.0, Argon2 and ChaCha20 [#148, #1179, #1230, #1494] +- Add SSH Agent feature [#1098, #1450, #1463] +- Add preview panel with details of the selected entry [#879, #1338] +- Add more and configurable columns to entry table and allow copying of values by double click [#1305] +- Add KeePassXC-Browser API as a replacement for KeePassHTTP [#608] +- Deprecate KeePassHTTP [#1392] +- Add support for Steam one-time passwords [#1206] +- Add support for multiple Auto-Type sequences for a single entry [#1390] +- Adjust YubiKey HMAC-SHA1 challenge-response key generation for KDBX 4.0 [#1060] +- Replace qHttp with cURL for website icon downloads [#1460] +- Remove lock file [#1231] +- Add option to create backup file before saving [#1385] +- Ask to save a generated password before closing the entry password generator [#1499] +- Resolve placeholders recursively [#1078] +- Add Auto-Type button to the toolbar [#1056] +- Improve window focus handling for Auto-Type dialogs [#1204, #1490] +- Auto-Type dialog and password generator can now be exited with ESC [#1252, #1412] +- Add optional dark tray icon [#1154] +- Add new "Unsafe saving" option to work around saving problems with file sync services [#1385] +- Add IBus support to AppImage and additional image formats to Windows builds [#1534, #1537] +- Add diceware password generator to CLI [#1406] +- Add --key-file option to CLI [#816, #824] +- Add DBus interface for opening and closing KeePassXC databases [#283] +- Add KDBX compression options to database settings [#1419] +- Discourage use of old fixed-length key files in favor of arbitrary files [#1326, #1327] +- Correct reference resolution in entry fields [#1486] +- Fix window state and recent databases not being remembered on exit [#1453] +- Correct history item generation when configuring TOTP for an entry [#1446] +- Correct multiple TOTP bugs [#1414] +- Automatic saving after every change is now a default [#279] +- Allow creation of new entries during search [#1398] +- Correct menu issues on macOS [#1335] +- Allow compilation on OpenBSD [#1328] +- Improve entry attachments view [#1139, #1298] +- Fix auto lock for Gnome and Xfce [#910, #1249] +- Don't remember key files in file dialogs when the setting is disabled [#1188] +- Improve database merging and conflict resolution [#807, #1165] +- Fix macOS pasteboard issues [#1202] +- Improve startup times on some platforms [#1205] +- Hide the notes field by default [#1124] +- Toggle main window by clicking tray icon with the middle mouse button [#992] +- Fix custom icons not copied over when databases are merged [#1008] +- Allow use of DEL key to delete entries [#914] +- Correct intermittent crash due to stale history items [#1527] +- Sanitize newline characters in title, username and URL fields [#1502] +- Reopen previously opened databases in correct order [#774] +- Use system's zxcvbn library if available [#701] +- Implement various i18n improvements [#690, #875, #1436] + 2.2.4 (2017-12-13) ========================= diff --git a/share/linux/org.keepassxc.KeePassXC.appdata.xml b/share/linux/org.keepassxc.KeePassXC.appdata.xml index e15d24f03..39dfa7d3a 100644 --- a/share/linux/org.keepassxc.KeePassXC.appdata.xml +++ b/share/linux/org.keepassxc.KeePassXC.appdata.xml @@ -50,6 +50,60 @@ </screenshots> <releases> + <release version="2.3.0" date="2018-02-27"> + <description> + <ul> + <li>Add support for KDBX 4.0, Argon2 and ChaCha20 [#148, #1179, #1230, #1494]</li> + <li>Add SSH Agent feature [#1098, #1450, #1463]</li> + <li>Add preview panel with details of the selected entry [#879, #1338]</li> + <li>Add more and configurable columns to entry table and allow copying of values by double click [#1305]</li> + <li>Add KeePassXC-Browser API as a replacement for KeePassHTTP [#608]</li> + <li>Deprecate KeePassHTTP [#1392]</li> + <li>Add support for Steam one-time passwords [#1206]</li> + <li>Add support for multiple Auto-Type sequences for a single entry [#1390]</li> + <li>Adjust YubiKey HMAC-SHA1 challenge-response key generation for KDBX 4.0 [#1060]</li> + <li>Replace qHttp with cURL for website icon downloads [#1460]</li> + <li>Remove lock file [#1231]</li> + <li>Add option to create backup file before saving [#1385]</li> + <li>Ask to save a generated password before closing the entry password generator [#1499]</li> + <li>Resolve placeholders recursively [#1078]</li> + <li>Add Auto-Type button to the toolbar [#1056]</li> + <li>Improve window focus handling for Auto-Type dialogs [#1204, #1490]</li> + <li>Auto-Type dialog and password generator can now be exited with ESC [#1252, #1412]</li> + <li>Add optional dark tray icon [#1154]</li> + <li>Add new "Unsafe saving" option to work around saving problems with file sync services [#1385]</li> + <li>Add IBus support to AppImage and additional image formats to Windows builds [#1534, #1537]</li> + <li>Add diceware password generator to CLI [#1406]</li> + <li>Add --key-file option to CLI [#816, #824]</li> + <li>Add DBus interface for opening and closing KeePassXC databases [#283]</li> + <li>Add KDBX compression options to database settings [#1419]</li> + <li>Discourage use of old fixed-length key files in favor of arbitrary files [#1326, #1327]</li> + <li>Correct reference resolution in entry fields [#1486]</li> + <li>Fix window state and recent databases not being remembered on exit [#1453]</li> + <li>Correct history item generation when configuring TOTP for an entry [#1446]</li> + <li>Correct multiple TOTP bugs [#1414]</li> + <li>Automatic saving after every change is now a default [#279]</li> + <li>Allow creation of new entries during search [#1398]</li> + <li>Correct menu issues on macOS [#1335]</li> + <li>Allow compilation on OpenBSD [#1328]</li> + <li>Improve entry attachments view [#1139, #1298]</li> + <li>Fix auto lock for Gnome and Xfce [#910, #1249]</li> + <li>Don't remember key files in file dialogs when the setting is disabled [#1188]</li> + <li>Improve database merging and conflict resolution [#807, #1165]</li> + <li>Fix macOS pasteboard issues [#1202]</li> + <li>Improve startup times on some platforms [#1205]</li> + <li>Hide the notes field by default [#1124]</li> + <li>Toggle main window by clicking tray icon with the middle mouse button [#992]</li> + <li>Fix custom icons not copied over when databases are merged [#1008]</li> + <li>Allow use of DEL key to delete entries [#914]</li> + <li>Correct intermittent crash due to stale history items [#1527]</li> + <li>Sanitize newline characters in title, username and URL fields [#1502]</li> + <li>Reopen previously opened databases in correct order [#774]</li> + <li>Use system's zxcvbn library if available [#701]</li> + <li>Implement various i18n improvements [#690, #875, #1436]</li> + </ul> + </description> + </release> <release version="2.2.4" date="2017-12-13"> <description> <ul> diff --git a/snapcraft.yaml b/snapcraft.yaml index 146754fca..f4b906619 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -1,5 +1,5 @@ name: keepassxc -version: 2.3.0-beta1 +version: 2.3.0 grade: stable summary: Community-driven port of the Windows application “KeePass Password Safe” description: | From 1db064425a22d997a2b6740c73a7b0cb1310fe07 Mon Sep 17 00:00:00 2001 From: Janek Bevendorff <janek@jbev.net> Date: Tue, 27 Feb 2018 22:37:59 +0100 Subject: [PATCH 402/402] Update translations --- share/translations/keepassx_ar.ts | 156 +++---- share/translations/keepassx_ca.ts | 24 +- share/translations/keepassx_cs.ts | 205 +++++---- share/translations/keepassx_da.ts | 262 ++++++----- share/translations/keepassx_de.ts | 72 +-- share/translations/keepassx_el.ts | 32 +- share/translations/keepassx_en.ts | 12 +- share/translations/keepassx_en_US.ts | 24 +- share/translations/keepassx_es.ts | 76 ++-- share/translations/keepassx_fi.ts | 215 ++++----- share/translations/keepassx_fr.ts | 262 +++++------ share/translations/keepassx_hu.ts | 47 +- share/translations/keepassx_id.ts | 42 +- share/translations/keepassx_it.ts | 79 ++-- share/translations/keepassx_ja.ts | 85 ++-- share/translations/keepassx_ko.ts | 38 +- share/translations/keepassx_lt.ts | 60 +-- share/translations/keepassx_nl_NL.ts | 164 +++---- share/translations/keepassx_pl.ts | 87 ++-- share/translations/keepassx_pt_BR.ts | 657 ++++++++++++++------------- share/translations/keepassx_pt_PT.ts | 102 +++-- share/translations/keepassx_ro.ts | 48 +- share/translations/keepassx_ru.ts | 205 +++++---- share/translations/keepassx_sr.ts | 71 +-- share/translations/keepassx_sv.ts | 76 ++-- share/translations/keepassx_th.ts | 38 +- share/translations/keepassx_tr.ts | 22 +- share/translations/keepassx_uk.ts | 84 ++-- share/translations/keepassx_zh_CN.ts | 26 +- share/translations/keepassx_zh_TW.ts | 32 +- 30 files changed, 1734 insertions(+), 1569 deletions(-) diff --git a/share/translations/keepassx_ar.ts b/share/translations/keepassx_ar.ts index 75b9f930e..c2bbcd163 100644 --- a/share/translations/keepassx_ar.ts +++ b/share/translations/keepassx_ar.ts @@ -7,7 +7,7 @@ </message> <message> <source>About</source> - <translation>حول</translation> + <translation>عن</translation> </message> <message> <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> @@ -122,7 +122,7 @@ Please select whether you want to allow access.</source> </message> <message> <source>Auto-Type - KeePassXC</source> - <translation>الطباعة التلقائية - KeePassXC</translation> + <translation>المكمل التلقائي - KeePassXC</translation> </message> <message> <source>Auto-Type</source> @@ -183,11 +183,11 @@ Please select whether you want to allow access.</source> <name>AutoTypeSelectDialog</name> <message> <source>Auto-Type - KeePassXC</source> - <translation>الطباعة التلقائية - KeePassXC</translation> + <translation>المكمل التلقائي - KeePassXC</translation> </message> <message> <source>Select entry to Auto-Type:</source> - <translation>حدد مدخل للطباعة التلقائية:</translation> + <translation>حدد مدخل للمكمل التلقائي:</translation> </message> </context> <context> @@ -373,6 +373,10 @@ Please select whether you want to allow access.</source> <source>Select custom proxy location</source> <translation>حدد موقع خادم الوكيل المخصص</translation> </message> + <message> + <source>We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</source> + <translation>نحن متأسفون, ولكن KeePassXC-Browser غير مدعوم لإصدارات Snap في الوقت الراهن.</translation> + </message> </context> <context> <name>BrowserService</name> @@ -475,7 +479,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Enter password:</source> - <translation>أدخل كلمة السر:</translation> + <translation>أدخل كلمة المرور:</translation> </message> <message> <source>Repeat password:</source> @@ -527,7 +531,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Do you really want to use an empty string as password?</source> - <translation>هل تريد حقًا استخدام مُدخل فارغ ككلمة مرور؟</translation> + <translation>هل تريد حقًا استخدام كلمات فارغة ككلمة مرور؟</translation> </message> <message> <source>Different passwords supplied.</source> @@ -613,7 +617,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Number of headers line to discard</source> - <translation type="unfinished"/> + <translation>عدد رؤوس الأسطر لتجاهلها</translation> </message> <message> <source>Consider '\' an escape character</source> @@ -633,7 +637,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Empty fieldname </source> - <translation>إسم الحقل فارغ</translation> + <translation type="unfinished"/> </message> <message> <source>column </source> @@ -1092,7 +1096,7 @@ Disable safe saves and try again?</source> </message> <message> <source>Move entry to recycle bin?</source> - <translation>نقل المُدخل إلى سلة المهملات؟</translation> + <translation>نقل المدخل إلى سلة المحذوفات؟</translation> </message> <message> <source>Do you really want to move entry "%1" to the recycle bin?</source> @@ -1100,7 +1104,7 @@ Disable safe saves and try again?</source> </message> <message> <source>Move entries to recycle bin?</source> - <translation>نقل المُدخلات إلى سلة المهملات؟</translation> + <translation>نقل المدخلات إلى سلة المحذوفات؟</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> @@ -1132,7 +1136,7 @@ Disable safe saves and try again?</source> </message> <message> <source>No current database.</source> - <translation>لا يوجد قاعدة بيانات حالية.</translation> + <translation>لا يوجد قاعدة بيانات حالية </translation> </message> <message> <source>No source database, nothing to do.</source> @@ -1175,10 +1179,6 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>هل أنت متأكد من حذف كل شيء من سلة المهملات نهائيًا؟</translation> </message> - <message> - <source>Entry updated successfully.</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DetailsWidget</name> @@ -1279,7 +1279,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Auto-Type</source> - <translation>الطباعة التلقائية</translation> + <translation>المكمل التلقائي</translation> </message> <message> <source>Properties</source> @@ -1503,7 +1503,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Username:</source> - <translation>اسم المستخدم:</translation> + <translation>اسم المستخدم</translation> </message> <message> <source>Expires</source> @@ -1614,7 +1614,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Disable</source> - <translation>تعطيل</translation> + <translation>قم ب تعطيل</translation> </message> <message> <source>Inherit from parent group (%1)</source> @@ -1641,7 +1641,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Auto-Type</source> - <translation>الطباعة التلقائية</translation> + <translation>المكمل التلقائي</translation> </message> <message> <source>&Use default Auto-Type sequence of parent group</source> @@ -1959,6 +1959,10 @@ This may cause the affected plugins to malfunction.</source> <source>Reset to defaults</source> <translation>إعادة التعيين إلى الإعدادات الافتراضية</translation> </message> + <message> + <source>Attachments (icon)</source> + <translation>المرفقات (رمز)</translation> + </message> </context> <context> <name>Group</name> @@ -2185,24 +2189,24 @@ This may cause the affected plugins to malfunction.</source> <message> <source>Invalid variant map entry type</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>نوع إدخال الخريطة المتنوعة غير صحيح</translation> </message> <message> <source>Invalid variant map field type size</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>حقل حجم النوع للخريطة المتنوعة غير صحيح</translation> </message> </context> <context> <name>Kdbx4Writer</name> <message> <source>Invalid symmetric cipher algorithm.</source> - <translation type="unfinished"/> + <translation>خورزامية تشفير بالمفتاح المتناظر غير صحيحة</translation> </message> <message> <source>Invalid symmetric cipher IV size.</source> <comment>IV = Initialization Vector for symmetric cipher</comment> - <translation type="unfinished"/> + <translation>خطأ في الحجم الرابع بخورزامية تشفير بالمفتاح المتناظر </translation> </message> <message> <source>Unable to calculate master key</source> @@ -2218,7 +2222,7 @@ This may cause the affected plugins to malfunction.</source> <name>KdbxReader</name> <message> <source>Invalid cipher uuid length</source> - <translation type="unfinished"/> + <translation>طول تشفير uuid غير صحيح</translation> </message> <message> <source>Unsupported cipher</source> @@ -2226,35 +2230,35 @@ This may cause the affected plugins to malfunction.</source> </message> <message> <source>Invalid compression flags length</source> - <translation type="unfinished"/> + <translation>طول علامات الضغط غير صحيح</translation> </message> <message> <source>Unsupported compression algorithm</source> - <translation type="unfinished"/> + <translation>خورزامية الضغط غير مدعومة</translation> </message> <message> <source>Invalid master seed size</source> - <translation type="unfinished"/> + <translation>حجم seed الرئيسي غير صحيح</translation> </message> <message> <source>Invalid transform seed size</source> - <translation type="unfinished"/> + <translation>حجم seed للتحول غير صحيح</translation> </message> <message> <source>Invalid transform rounds size</source> - <translation type="unfinished"/> + <translation>حجم جولات التحول غير صحيح</translation> </message> <message> <source>Invalid start bytes size</source> - <translation type="unfinished"/> + <translation>حجم بتات البداية غير صحيح</translation> </message> <message> <source>Invalid random stream id size</source> - <translation type="unfinished"/> + <translation>حجم معرف random stream غير صحيح</translation> </message> <message> <source>Invalid inner random stream cipher</source> - <translation type="unfinished"/> + <translation>خطأ داخلي بخورزامية random stream</translation> </message> <message> <source>Not a KeePass database.</source> @@ -2269,14 +2273,14 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Unsupported KeePass 2 database version.</source> - <translation type="unfinished"/> + <translation>إصدار قاعدة بيانات 2 KeePass غير مدعوم.</translation> </message> </context> <context> <name>KdbxXmlReader</name> <message> <source>XML parsing failure: %1</source> - <translation type="unfinished"/> + <translation>فشل تحليل XML: %1</translation> </message> <message> <source>No root group</source> @@ -2284,11 +2288,11 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Missing icon uuid or data</source> - <translation type="unfinished"/> + <translation>uuid او بيانات الرمز مفقودة</translation> </message> <message> <source>Missing custom data key or value</source> - <translation type="unfinished"/> + <translation>مفتاح البيانات المخصص او قيمته مفقودة</translation> </message> <message> <source>Multiple group elements</source> @@ -2296,11 +2300,11 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Null group uuid</source> - <translation type="unfinished"/> + <translation>uuid المجموعة غير معروف</translation> </message> <message> <source>Invalid group icon number</source> - <translation type="unfinished"/> + <translation>رقم رمز المجموعة غير صحيح</translation> </message> <message> <source>Invalid EnableAutoType value</source> @@ -2308,59 +2312,59 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Invalid EnableSearching value</source> - <translation type="unfinished"/> + <translation>قيمة EnableSearching غير صحيحة</translation> </message> <message> <source>No group uuid found</source> - <translation type="unfinished"/> + <translation>لم يُعثر على uuid المجموعة</translation> </message> <message> <source>Null DeleteObject uuid</source> - <translation type="unfinished"/> + <translation>Null DeleteObject uuid</translation> </message> <message> <source>Missing DeletedObject uuid or time</source> - <translation type="unfinished"/> + <translation>uuid او وقت DeletedObject مفقود</translation> </message> <message> <source>Null entry uuid</source> - <translation type="unfinished"/> + <translation>uuid الإدخال غير معروف</translation> </message> <message> <source>Invalid entry icon number</source> - <translation type="unfinished"/> + <translation>رقم الرمز المُدخل غير صحيح</translation> </message> <message> <source>History element in history entry</source> - <translation type="unfinished"/> + <translation>سجل العنصر في سجل الإدخال</translation> </message> <message> <source>No entry uuid found</source> - <translation type="unfinished"/> + <translation>لم يُعثر على uuid المُدخل</translation> </message> <message> <source>History element with different uuid</source> - <translation type="unfinished"/> + <translation>سجل العنصر مع uuid مختلف</translation> </message> <message> <source>Unable to decrypt entry string</source> - <translation type="unfinished"/> + <translation>يتعذر فك تشفير سلسلة الإدخال</translation> </message> <message> <source>Duplicate custom attribute found</source> - <translation type="unfinished"/> + <translation>عُثر على خاصية مخصصة مكررة</translation> </message> <message> <source>Entry string key or value missing</source> - <translation type="unfinished"/> + <translation>مفتاح سلسلة الإدخال أو القيمة مفقودة</translation> </message> <message> <source>Duplicate attachment found</source> - <translation type="unfinished"/> + <translation>عُثر على مرفق مكرر</translation> </message> <message> <source>Entry binary key or value missing</source> - <translation type="unfinished"/> + <translation>مُدخل المفتاح الثنائي او القيمة مفقودة</translation> </message> <message> <source>Auto-type association window or sequence missing</source> @@ -2368,11 +2372,11 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Invalid bool value</source> - <translation type="unfinished"/> + <translation>مُدخل القيمة المنطقية غير صحيح</translation> </message> <message> <source>Invalid date time value</source> - <translation type="unfinished"/> + <translation>قيمة وقت التاريخ غير صحيحة</translation> </message> <message> <source>Invalid color value</source> @@ -2380,7 +2384,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Invalid color rgb part</source> - <translation type="unfinished"/> + <translation>جزء من لون rgb غير صحيح</translation> </message> <message> <source>Invalid number value</source> @@ -2388,12 +2392,12 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Invalid uuid value</source> - <translation type="unfinished"/> + <translation>قيمة uuid غير صحيحة</translation> </message> <message> <source>Unable to decompress binary</source> <extracomment>Translator meant is a binary data inside an entry</extracomment> - <translation type="unfinished"/> + <translation>تعذر فك ضغط القيمة الثنائية</translation> </message> </context> <context> @@ -2428,27 +2432,27 @@ This is a one-way migration. You won't be able to open the imported databas <message> <source>Unable to read encryption IV</source> <comment>IV = Initialization Vector for symmetric cipher</comment> - <translation type="unfinished"/> + <translation>غير قادر على قراءة قيمة التشفير الرابع</translation> </message> <message> <source>Invalid number of groups</source> - <translation type="unfinished"/> + <translation>عدد غير صالح من المجموعات</translation> </message> <message> <source>Invalid number of entries</source> - <translation type="unfinished"/> + <translation>عدد الإدخالات غير صالح</translation> </message> <message> <source>Invalid content hash size</source> - <translation type="unfinished"/> + <translation>حجم محتوى الهاش غير صحيح</translation> </message> <message> <source>Invalid transform seed size</source> - <translation type="unfinished"/> + <translation>حجم seed للتحول غير صحيح</translation> </message> <message> <source>Invalid number of transform rounds</source> - <translation type="unfinished"/> + <translation>عدد جولات التحول غير صحيح</translation> </message> <message> <source>Unable to construct group tree</source> @@ -2602,7 +2606,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>E&ntries</source> - <translation>المُدخلات</translation> + <translation type="unfinished"/> </message> <message> <source>Copy att&ribute to clipboard</source> @@ -2750,7 +2754,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>&Notes</source> - <translation>&الملاحظات</translation> + <translation>&ملاحظات</translation> </message> <message> <source>Copy notes to clipboard</source> @@ -3100,7 +3104,7 @@ Using default port 19455.</source> </message> <message> <source>Lower Case Letters</source> - <translation>أحرف صغيرة</translation> + <translation>الحروف صغيرة</translation> </message> <message> <source>Numbers</source> @@ -3267,7 +3271,7 @@ Using default port 19455.</source> </message> <message> <source>Key file of the database.</source> - <translation>ملف المفتاح لقاعدة البيانات.</translation> + <translation>ملف المفتاح لقاعدة البيانات</translation> </message> <message> <source>path</source> @@ -3283,7 +3287,7 @@ Using default port 19455.</source> </message> <message> <source>URL for the entry.</source> - <translation>الرابط للمُدخل.</translation> + <translation>الرابط للمُدخل</translation> </message> <message> <source>URL</source> @@ -3360,7 +3364,7 @@ Using default port 19455.</source> </message> <message> <source>Insert password to unlock %1: </source> - <translation>ادخل كلمة المرور لإلغاء قفل %1:</translation> + <translation>ادخل كلمة المرور لإلغاء القفل %1:</translation> </message> <message> <source>Failed to load key file %1 : %2</source> @@ -3424,7 +3428,7 @@ Available commands: </message> <message> <source>Key file of the database to merge from.</source> - <translation>ملف المفتاح لقاعدة البيانات للدمج منه.</translation> + <translation>ملف قاعدة البيانات للدمج منه.</translation> </message> <message> <source>Show an entry's information.</source> @@ -3692,7 +3696,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>KeePassXC: No keys found</source> - <translation>KeePassXC: لم يُعثر على أية مفاتيح</translation> + <translation>KeePassXC: لم يتم العثور على أية مفاتيح</translation> </message> <message> <source>No shared encryption-keys found in KeePassHttp Settings.</source> @@ -3778,7 +3782,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Automatically save after every change</source> - <translation>الحفظ تلقائيًا بعد كل تعديل</translation> + <translation type="unfinished"/> </message> <message> <source>Automatically reload the database when modified externally</source> @@ -3826,7 +3830,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Auto-Type</source> - <translation>الطباعة التلقائية</translation> + <translation>المكمل التلقائي</translation> </message> <message> <source>Use entry title to match windows for global Auto-Type</source> @@ -3895,7 +3899,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Lock databases after inactivity of</source> - <translation>أغلق قواعد البيانات بعد حالة عدم النشاط ل</translation> + <translation>أغلق قواعد البيانات بعد حالات عدم النشاط ل</translation> </message> <message> <source>Convenience</source> @@ -3998,11 +4002,11 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Copy</source> - <translation>نسخ</translation> + <translation>نسخة</translation> </message> <message> <source>Expires in</source> - <translation>تنتهي في</translation> + <translation>وتنتهي في</translation> </message> <message> <source>seconds</source> diff --git a/share/translations/keepassx_ca.ts b/share/translations/keepassx_ca.ts index 077dcaf15..ad40c798c 100644 --- a/share/translations/keepassx_ca.ts +++ b/share/translations/keepassx_ca.ts @@ -372,6 +372,10 @@ Seleccioneu si voleu permetre l'accés.</translation> <source>Select custom proxy location</source> <translation type="unfinished"/> </message> + <message> + <source>We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>BrowserService</name> @@ -486,7 +490,7 @@ Per favor, desbloqueu la base de dades seleccionada o escolliu-ne una altra.</t </message> <message> <source>Browse</source> - <translation>Navega</translation> + <translation>Navegar</translation> </message> <message> <source>Create</source> @@ -498,7 +502,7 @@ Per favor, desbloqueu la base de dades seleccionada o escolliu-ne una altra.</t </message> <message> <source>Refresh</source> - <translation>Actualitza</translation> + <translation>L'actualitza</translation> </message> <message> <source>Key files</source> @@ -746,7 +750,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Key files</source> - <translation>Fitxers de clau</translation> + <translation>Arxius de clau</translation> </message> <message> <source>Select key file</source> @@ -1102,7 +1106,7 @@ Disable safe saves and try again?</source> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Realment voleu moure %n entry(s) a la Paperera de reciclatge?</numerusform><numerusform>Realment voleu moure %n entrada(es) a la paperera?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1173,10 +1177,6 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>Esteu segur que voleu suprimir permanentment tot el contingut de la paperera?</translation> </message> - <message> - <source>Entry updated successfully.</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DetailsWidget</name> @@ -1353,11 +1353,11 @@ Do you want to merge your changes?</source> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n setmanes</numerusform><numerusform>%n setmana(es)</numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n mes (OS)</numerusform><numerusform>%n mes(os)</numerusform></translation> </message> <message> <source>1 year</source> @@ -1952,6 +1952,10 @@ This may cause the affected plugins to malfunction.</source> <source>Reset to defaults</source> <translation type="unfinished"/> </message> + <message> + <source>Attachments (icon)</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Group</name> diff --git a/share/translations/keepassx_cs.ts b/share/translations/keepassx_cs.ts index 76c1df6a5..5d2382ef3 100644 --- a/share/translations/keepassx_cs.ts +++ b/share/translations/keepassx_cs.ts @@ -86,7 +86,7 @@ Jádro systému: %3 %4</translation> <name>AccessControlDialog</name> <message> <source>KeePassXC HTTP Confirm Access</source> - <translation>Potvrzení přístupu pro KeePassXC HTTP</translation> + <translation>Potvrzení přístupu KeePassXC HTTP</translation> </message> <message> <source>Remember this decision</source> @@ -153,11 +153,11 @@ Umožnit přístup?</translation> </message> <message> <source>Sequence</source> - <translation>Posloupnost</translation> + <translation>Pořadí</translation> </message> <message> <source>Default sequence</source> - <translation>Výchozí posloupnost</translation> + <translation>Výchozí pořadí</translation> </message> </context> <context> @@ -325,7 +325,7 @@ Umožnit přístup?</translation> </message> <message> <source>&Return advanced string fields which start with "KPH: "</source> - <translation>Odpovědět kolonkami pok&ročilých textových řetězců které začínají na „KPH: “</translation> + <translation>Odpovědět také kolonkami pok&ročilých textových řetězců které začínají na „KPH: “</translation> </message> <message> <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> @@ -373,6 +373,10 @@ Umožnit přístup?</translation> <source>Select custom proxy location</source> <translation>Vybrat uživatelem určené umístění zprostředkovávající aplikace</translation> </message> + <message> + <source>We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</source> + <translation>Je nám líto, ale KeePassXC-Browser v tuto chvíli není ve snap vydáních podporován.</translation> + </message> </context> <context> <name>BrowserService</name> @@ -444,7 +448,7 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> </message> <message numerus="yes"> <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> - <translation><numerusform>Úspěšně odebrán %n šifrovací klíč z nastavení KeePassXC.</numerusform><numerusform>Úspěšně odebrány %n šifrovací klíče z nastavení KeePassXC.</numerusform><numerusform>Úspěšně odebráno %n šifrovacích klíčů z nastavení KeePassXC.</numerusform></translation> + <translation><numerusform>%n šifrovací klíč úspěšně odebrán z nastavení KeePassXC.</numerusform><numerusform>%n šifrovací klíče úspěšně odebrány z nastavení KeePassXC.</numerusform><numerusform>%n šifrovacích klíčů úspěšně odebráno z nastavení KeePassXC.</numerusform></translation> </message> <message> <source>Removing stored permissions…</source> @@ -460,7 +464,7 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> </message> <message numerus="yes"> <source>Successfully removed permissions from %n entry(s).</source> - <translation><numerusform>Úspěšně odebrána oprávnění z %n položky.</numerusform><numerusform>Úspěšně odebrána oprávnění ze %n položek.</numerusform><numerusform>Úspěšně odebrána oprávnění z %n položek.</numerusform></translation> + <translation><numerusform>Z %n položky úspěšně odebrána oprávnění.</numerusform><numerusform>Ze %n položek úspěšně odebrána oprávnění.</numerusform><numerusform>Z %n položek úspěšně odebrána oprávnění.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -499,7 +503,7 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> </message> <message> <source>Cha&llenge Response</source> - <translation>&Výzva–odpověď</translation> + <translation>Výzva–odpověď</translation> </message> <message> <source>Refresh</source> @@ -545,14 +549,14 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> </message> <message> <source>Legacy key file format</source> - <translation>Starší formát souboru s klíčem</translation> + <translation>Starý formát souboru s klíčem</translation> </message> <message> <source>You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation>Používáte starší formát souboru s klíčem, který v budoucnu nemusí být podporován. + <translation>Používáte starý formát souboru s klíčem, který v budoucnu nemusí být podporován. Zvažte vytvoření nového souboru s klíčem.</translation> </message> @@ -604,7 +608,7 @@ Zvažte vytvoření nového souboru s klíčem.</translation> </message> <message> <source>Text is qualified by</source> - <translation>Text je určen pomocí</translation> + <translation>Text je zařazován pomocí</translation> </message> <message> <source>Fields are separated by</source> @@ -620,11 +624,11 @@ Zvažte vytvoření nového souboru s klíčem.</translation> </message> <message> <source>Number of headers line to discard</source> - <translation>Počet řádků hlavičky, které zahodit</translation> + <translation>Počet řádek s hlavičkou, kterou zahodit</translation> </message> <message> <source>Consider '\' an escape character</source> - <translation>Považovat „\“ za význam zbavující (escape) znak</translation> + <translation>Považovat „\“ za únikový znak</translation> </message> <message> <source>Preview</source> @@ -640,7 +644,7 @@ Zvažte vytvoření nového souboru s klíčem.</translation> </message> <message> <source>Empty fieldname </source> - <translation>Prázdný název kolonky</translation> + <translation>Prázný název kolonky</translation> </message> <message> <source>column </source> @@ -681,18 +685,18 @@ Zvažte vytvoření nového souboru s klíčem.</translation> </message> <message> <source>Unable to calculate master key</source> - <translation>Nedaří se vypočítat hlavní klíč</translation> + <translation>Nedaří se spočítat hlavní klíč</translation> </message> </context> <context> <name>CsvParserModel</name> <message numerus="yes"> <source>%n byte(s), </source> - <translation><numerusform>%n bajt,</numerusform><numerusform>%n bajty,</numerusform><numerusform>%n bajtů,</numerusform></translation> + <translation><numerusform>%n bajt</numerusform><numerusform>%n bajty</numerusform><numerusform>%n bajtů</numerusform></translation> </message> <message numerus="yes"> <source>%n row(s), </source> - <translation><numerusform>%n řádek,</numerusform><numerusform>%n řádky,</numerusform><numerusform>%n řádků,</numerusform></translation> + <translation><numerusform>%n řádek</numerusform><numerusform>%n řádky</numerusform><numerusform>%n řádků</numerusform></translation> </message> <message numerus="yes"> <source>%n column(s)</source> @@ -731,7 +735,7 @@ Zvažte vytvoření nového souboru s klíčem.</translation> </message> <message> <source>Can't open key file</source> - <translation>Nedaří se otevřít soubor s klíčem</translation> + <translation>Soubor s klíčem se nedaří otevřít</translation> </message> <message> <source>Legacy key file format</source> @@ -779,7 +783,7 @@ Zvažte vytvoření nového souboru s klíčem.</translation> </message> <message> <source>Unable to open the database.</source> - <translation>Databázi se nedaří otevřít.</translation> + <translation>Nedaří se otevřít databázi.</translation> </message> <message> <source>Database opened fine. Nothing to do.</source> @@ -954,7 +958,7 @@ Pokud tento počet ponecháte, může být velmi snadné prolomit šifrování v </message> <message> <source>KeePass 2 Database</source> - <translation>Databáze ve formátu KeePass 2</translation> + <translation>Databáze ve formátu KeePass verze 2</translation> </message> <message> <source>All files</source> @@ -966,7 +970,7 @@ Pokud tento počet ponecháte, může být velmi snadné prolomit šifrování v </message> <message> <source>File not found!</source> - <translation>Soubor nenalezen!</translation> + <translation>Soubor nebyl nalezen!</translation> </message> <message> <source>Unable to open the database.</source> @@ -1109,7 +1113,7 @@ Vypnout bezpečné ukládání a zkusit to znovu?</translation> </message> <message> <source>Do you really want to move entry "%1" to the recycle bin?</source> - <translation>Opravdu chcete přesunout záznam „%1“ do Koše?</translation> + <translation>Opravdu přesunout záznam "%1" do Koše?</translation> </message> <message> <source>Move entries to recycle bin?</source> @@ -1117,7 +1121,7 @@ Vypnout bezpečné ukládání a zkusit to znovu?</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>Opravdu chcete přesunout %n položku do Koše?</numerusform><numerusform>Opravdu chcete přesunout %n položky do Koše?</numerusform><numerusform>Opravdu chcete přesunout %n položek do Koše?</numerusform></translation> + <translation><numerusform>Opravdu přesunout %n záznam do Koše? ()</numerusform><numerusform>Opravdu přesunout %n záznamy do Koše? ()</numerusform><numerusform>Opravdu přesunout %n záznamů do Koše?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1125,7 +1129,7 @@ Vypnout bezpečné ukládání a zkusit to znovu?</translation> </message> <message> <source>Do you really want to execute the following command?<br><br>%1<br></source> - <translation>Opravdu chcete spustit následující příkaz?<br><br>%1<br></translation> + <translation>Opravdu spustit následující příkaz?<br><br>%1<br></translation> </message> <message> <source>Remember my choice</source> @@ -1141,7 +1145,7 @@ Vypnout bezpečné ukládání a zkusit to znovu?</translation> </message> <message> <source>Unable to calculate master key</source> - <translation>Nedaří se vypočítat hlavní klíč</translation> + <translation>Nedaří se spočítat hlavní klíč</translation> </message> <message> <source>No current database.</source> @@ -1179,7 +1183,7 @@ Přejete si je sloučit?</translation> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> - <translation>Nepodařilo se otevřít nový databázový soubor při pokusu o automatické znovunačtení této databáze.</translation> + <translation>Nepodařilo se otevřít nový soubor, obsahující aktuální verzi této databáze.</translation> </message> <message> <source>Empty recycle bin?</source> @@ -1187,11 +1191,7 @@ Přejete si je sloučit?</translation> </message> <message> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> - <translation>Opravdu natrvalo smazat všechno z Koše?</translation> - </message> - <message> - <source>Entry updated successfully.</source> - <translation type="unfinished"/> + <translation>Opravdu chcete natrvalo smazat všechno z Koše?</translation> </message> </context> <context> @@ -1381,15 +1381,15 @@ Přejete si je sloučit?</translation> </message> <message> <source>Apply generated password?</source> - <translation type="unfinished"/> + <translation>Použít vytvořené heslo?</translation> </message> <message> <source>Do you want to apply the generated password to this entry?</source> - <translation type="unfinished"/> + <translation>Opravdu chcete použít vytvořené heslo na tuto položku?</translation> </message> <message> <source>Entry updated successfully.</source> - <translation type="unfinished"/> + <translation>Položka úspěšně aktualizována.</translation> </message> </context> <context> @@ -1416,7 +1416,7 @@ Přejete si je sloučit?</translation> </message> <message> <source>Reveal</source> - <translation>Odkrýt</translation> + <translation>Odhalit</translation> </message> <message> <source>Attachments</source> @@ -1424,11 +1424,11 @@ Přejete si je sloučit?</translation> </message> <message> <source>Foreground Color:</source> - <translation type="unfinished"/> + <translation>Barva popředí:</translation> </message> <message> <source>Background Color:</source> - <translation type="unfinished"/> + <translation>Barva pozadí:</translation> </message> </context> <context> @@ -1439,11 +1439,11 @@ Přejete si je sloučit?</translation> </message> <message> <source>Inherit default Auto-Type sequence from the &group</source> - <translation>&Převzít výchozí posloupnost automatického vyplňování od skupiny</translation> + <translation>Převzít výchozí pořadí automatického vyplňování od skupiny</translation> </message> <message> <source>&Use custom Auto-Type sequence:</source> - <translation>Po&užít uživatelem určenou posloupnost automatického vyplňování:</translation> + <translation>Po&užít vlastní pořadí automatického vyplňování:</translation> </message> <message> <source>Window Associations</source> @@ -1632,7 +1632,7 @@ Přejete si je sloučit?</translation> </message> <message> <source>Inherit from parent group (%1)</source> - <translation>Převzít z nadřazené skupiny (%1)</translation> + <translation>Převzít od nadřazené skupiny (%1)</translation> </message> </context> <context> @@ -1659,11 +1659,11 @@ Přejete si je sloučit?</translation> </message> <message> <source>&Use default Auto-Type sequence of parent group</source> - <translation>Převzít výchozí posloupnost a&utomatického vyplňování z nadřazené skupiny</translation> + <translation>Převzít výchozí pořadí a&utomatického vyplňování nadřazené skupiny</translation> </message> <message> <source>Set default Auto-Type se&quence</source> - <translation>&Nastavit výchozí posloupnost automatického vyplňování</translation> + <translation>Nastavit výchozí pořadí automatického vyplňování</translation> </message> </context> <context> @@ -1674,15 +1674,15 @@ Přejete si je sloučit?</translation> </message> <message> <source>Use custo&m icon</source> - <translation>Použít uživatele&m určenou ikonu</translation> + <translation>Použít svou vlastní ikonu</translation> </message> <message> <source>Add custom icon</source> - <translation>Přidat uživatelem určenou ikonu</translation> + <translation>Přidat svou vlastní ikonu</translation> </message> <message> <source>Delete custom icon</source> - <translation>Smazat uživatelem určenou ikonu</translation> + <translation>Smazat svou vlastní ikonu</translation> </message> <message> <source>Download favicon</source> @@ -1714,7 +1714,7 @@ Přejete si je sloučit?</translation> </message> <message> <source>Custom icon already exists</source> - <translation>Tato uživatelem určená ikona už existuje</translation> + <translation>Tato vlastní ikona už existuje</translation> </message> <message> <source>Confirm Delete</source> @@ -1741,11 +1741,11 @@ Přejete si je sloučit?</translation> </message> <message> <source>Uuid:</source> - <translation>Nikde se neopakující se identifikátor:</translation> + <translation>Univerzálně jedinečný identifikátor:</translation> </message> <message> <source>Plugin Data</source> - <translation type="unfinished"/> + <translation>Data zásuvného modulu</translation> </message> <message> <source>Remove</source> @@ -1753,20 +1753,21 @@ Přejete si je sloučit?</translation> </message> <message> <source>Delete plugin data?</source> - <translation type="unfinished"/> + <translation>Smazat data zásuvného modulu?</translation> </message> <message> <source>Do you really want to delete the selected plugin data? This may cause the affected plugins to malfunction.</source> - <translation type="unfinished"/> + <translation>Opravdu chcete smazat označená data zásuvného modulu? +Dotčený zásuvný modul to může rozbít.</translation> </message> <message> <source>Key</source> - <translation type="unfinished"/> + <translation>Klíč</translation> </message> <message> <source>Value</source> - <translation type="unfinished"/> + <translation>Hodnota</translation> </message> </context> <context> @@ -1973,6 +1974,10 @@ This may cause the affected plugins to malfunction.</source> <source>Reset to defaults</source> <translation>Vrátit na výchozí</translation> </message> + <message> + <source>Attachments (icon)</source> + <translation>Přípony (ikona)</translation> + </message> </context> <context> <name>Group</name> @@ -2055,7 +2060,7 @@ This may cause the affected plugins to malfunction.</source> </message> <message> <source>Close message</source> - <translation>Zavřít zprávu</translation> + <translation>Uzavřít správu</translation> </message> </context> <context> @@ -2432,7 +2437,7 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>Not a KeePass database.</source> - <translation>Nejedná se o databázi KeePass.</translation> + <translation>Nejedná se o databázi Keepass.</translation> </message> <message> <source>Unsupported encryption algorithm.</source> @@ -2440,7 +2445,7 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>Unsupported KeePass database version.</source> - <translation>Nepodporovaná verze KeePass databáze.</translation> + <translation>Nepodporovaná verze databáze KeePass.</translation> </message> <message> <source>Unable to read encryption IV</source> @@ -2477,11 +2482,11 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>Unable to calculate master key</source> - <translation>Nedaří se vypočítat hlavní klíč</translation> + <translation>Nedaří se spočítat hlavní klíč</translation> </message> <message> <source>Wrong key or database file is corrupt.</source> - <translation>Byl zadán nesprávný klíč, nebo je soubor s databází poškozený.</translation> + <translation>Byl zadán chybný klíč, nebo je poškozen databázový soubor.</translation> </message> <message> <source>Key transformation failed</source> @@ -2588,7 +2593,7 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>Another instance of KeePassXC is already running.</source> - <translation>Už je spuštěná jiná instance KeePassXC.</translation> + <translation>Již je spuštěná jiná instance KeePassXC.</translation> </message> <message> <source>Fatal error while testing the cryptographic functions.</source> @@ -2615,7 +2620,7 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>&Help</source> - <translation>&Nápověda</translation> + <translation>Nápověda</translation> </message> <message> <source>E&ntries</source> @@ -2631,7 +2636,7 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>&Groups</source> - <translation>S&kupiny</translation> + <translation>Skupiny</translation> </message> <message> <source>&Tools</source> @@ -2639,7 +2644,7 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>&Quit</source> - <translation>&Ukončit</translation> + <translation>Ukončit</translation> </message> <message> <source>&About</source> @@ -2651,11 +2656,11 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>&Save database</source> - <translation>&Uložit databázi</translation> + <translation>Uložit databázi</translation> </message> <message> <source>&Close database</source> - <translation>&Zavřít databázi</translation> + <translation>Zavřít databázi</translation> </message> <message> <source>&New database</source> @@ -2675,7 +2680,7 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>&Delete entry</source> - <translation>&Smazat záznam</translation> + <translation>Smazat záznam</translation> </message> <message> <source>&Add new group</source> @@ -2683,11 +2688,11 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>&Edit group</source> - <translation>&Upravit skupinu</translation> + <translation>Upravit skupinu</translation> </message> <message> <source>&Delete group</source> - <translation>&Smazat skupinu</translation> + <translation>Smazat skupinu</translation> </message> <message> <source>Sa&ve database as...</source> @@ -2707,11 +2712,11 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>&Clone entry</source> - <translation>&Klonovat záznam</translation> + <translation>Klonovat záznam</translation> </message> <message> <source>&Find</source> - <translation>&Najít</translation> + <translation>Najít</translation> </message> <message> <source>Copy &username</source> @@ -2723,7 +2728,7 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>Cop&y password</source> - <translation>&Zkopírovat heslo</translation> + <translation>Zkopírovat heslo</translation> </message> <message> <source>Copy password to clipboard</source> @@ -2735,7 +2740,7 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>Password Generator</source> - <translation>Vytváření hesel</translation> + <translation>Generátor hesel</translation> </message> <message> <source>&Perform Auto-Type</source> @@ -2747,7 +2752,7 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>&Lock databases</source> - <translation>&Uzamknout databáze</translation> + <translation>Uzamknout databáze</translation> </message> <message> <source>&Title</source> @@ -2791,15 +2796,15 @@ Jedná se o jednosměrný převod. Databázi, vzniklou z importu, nepůjde otev </message> <message> <source>Show TOTP</source> - <translation>Zobrazit na času založené jednorázové heslo (TOTP)</translation> + <translation>Zobrazit TOTP</translation> </message> <message> <source>Set up TOTP...</source> - <translation>Nastavit na času založené jednorázové heslo (TOTP)…</translation> + <translation>Nastavit TOTP…</translation> </message> <message> <source>Copy &TOTP</source> - <translation>Zkopírovat na času založené jednorázové heslo (&TOTP)</translation> + <translation>Zkopírovat &TOTP</translation> </message> <message> <source>E&mpty recycle bin</source> @@ -2990,19 +2995,19 @@ Tato verze není určena pro produkční použití.</translation> </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation>Odpoví pouze nejlepšími shodami pro konkrétní URL adresu namísto všech položek pro celou doménu.</translation> + <translation>Vrátí pouze nejlepší shody pro konkrétní URL adresu namísto všech položek pro celou doménu.</translation> </message> <message> <source>&Return only best matching entries</source> - <translation>Odpovídat pouze nejlépe se shodujícími položkami</translation> + <translation>V&racet pouze nejlépe odpovídající položky</translation> </message> <message> <source>Re&quest to unlock the database if it is locked</source> - <translation>&Vyžádat odemknutí zamčené databáze</translation> + <translation>Vyžádat odemknutí zamčené databáze</translation> </message> <message> <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation>Je odpovězeno pouze položkami se stejným schématem (http://, https://, ftp://, …).</translation> + <translation>Jsou vráceny pouze položky se stejným schématem (http://, https://, ftp://, …).</translation> </message> <message> <source>&Match URL schemes</source> @@ -3026,7 +3031,7 @@ Tato verze není určena pro produkční použití.</translation> </message> <message> <source>Password Generator</source> - <translation>Vytváření hesel</translation> + <translation>Generátor hesel</translation> </message> <message> <source>Advanced</source> @@ -3042,7 +3047,7 @@ Tato verze není určena pro produkční použití.</translation> </message> <message> <source>Only the selected database has to be connected with a client.</source> - <translation>Pouze označené databáze je třeba spojit s klientem.</translation> + <translation>Pouze označené databáze budou spojeny s klientem.</translation> </message> <message> <source>Searc&h in all opened databases for matching entries</source> @@ -3050,11 +3055,11 @@ Tato verze není určena pro produkční použití.</translation> </message> <message> <source>Automatically creating or updating string fields is not supported.</source> - <translation>Automatické vytváření nebo aktualizace není u textových kolonek podporované!</translation> + <translation>Automatická vytváření nebo aktualizace nejsou u textových kolonek podporované!</translation> </message> <message> <source>&Return advanced string fields which start with "KPH: "</source> - <translation>Odpovědět také kolonkami pok&ročilých textových řetězců které začínají na „KPH: “</translation> + <translation>Odpovědět také kolonkami pok&ročilých textových řetězců které začínají na „KPH:“</translation> </message> <message> <source>HTTP Port:</source> @@ -3084,7 +3089,7 @@ Tato verze není určena pro produkční použití.</translation> <source>Cannot bind to privileged ports below 1024! Using default port 19455.</source> <translation>Není možné navázat na porty s číslem nižším, než 1024! -Náhradně bude použit výchozí port 19455.</translation> +Náhradně bude použit port 19455.</translation> </message> </context> <context> @@ -3188,7 +3193,7 @@ Náhradně bude použit výchozí port 19455.</translation> </message> <message> <source>Password Quality: %1</source> - <translation>Odolnost hesla: %1</translation> + <translation>Kvalita hesla: %1</translation> </message> <message> <source>Poor</source> @@ -3463,7 +3468,7 @@ Příkazy k dispozici: </message> <message> <source>NULL device</source> - <translation>Prázdné zařízení</translation> + <translation>NULL zařízení</translation> </message> <message> <source>error reading from device</source> @@ -3477,7 +3482,7 @@ Příkazy k dispozici: </message> <message> <source>malformed string</source> - <translation>chybně formovaný řetězec</translation> + <translation>špatně formovaný řetězec</translation> </message> <message> <source>missing closing quote</source> @@ -3541,7 +3546,7 @@ Příkazy k dispozici: </message> <message> <source>Browser Integration</source> - <translation>Napojení webového prohlížeče</translation> + <translation>Napojení na webový prohlížeč</translation> </message> <message> <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source> @@ -3633,7 +3638,7 @@ Příkazy k dispozici: <name>QtIOCompressor::open</name> <message> <source>The gzip format not supported in this version of zlib.</source> - <translation>Formát komprese gzip není podporován verzí knihovny zlib, která je právě používána na tomto systému.</translation> + <translation>Použitý formát gzip komprese není podporován verzí knihovny zlib, která je právě používána na tomto systému.</translation> </message> <message> <source>Internal zlib error: </source> @@ -3684,8 +3689,8 @@ neopakující se název pro identifikaci a potvrďte ho.</translation> <message> <source>A shared encryption-key with the name "%1" already exists. Do you want to overwrite it?</source> - <translation>Už existuje sdílený šifrovací klíč s názvem „%1“. -Chcete ho chcete přepsat?</translation> + <translation>Již existuje sdílený šifrovací klíč s názvem „%1“. +Chcete ho přepsat?</translation> </message> <message> <source>KeePassXC: Update Entry</source> @@ -3715,7 +3720,7 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> </message> <message> <source>KeePassXC: No keys found</source> - <translation>KeePassXC: Nebyly nalezeny žádné klíče</translation> + <translation>KeePassXC: Klíče nebyly nalezeny</translation> </message> <message> <source>No shared encryption-keys found in KeePassHttp Settings.</source> @@ -3727,7 +3732,7 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> </message> <message> <source>The active database does not contain an entry of KeePassHttp Settings.</source> - <translation>Právě otevřená databáze neobsahuje žádný záznam nastavení pro KeePassHttp.</translation> + <translation>Právě otevřená databáze neobsahuje žádný záznam nastavení KeePassHttp.</translation> </message> <message> <source>Removing stored permissions...</source> @@ -3743,11 +3748,11 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> </message> <message numerus="yes"> <source>Successfully removed permissions from %n entries.</source> - <translation><numerusform>Úspěšně odebrána oprávnění z %n položky.</numerusform><numerusform>Úspěšně odebrána oprávnění ze %n položek.</numerusform><numerusform>Úspěšně odebrána oprávnění z %n položek.</numerusform></translation> + <translation><numerusform>Úspěšně odebrána oprávnění z %n položky.</numerusform><numerusform>Úspěšně odebrána oprávnění ze %n položek.</numerusform><numerusform>Úspěšně odebrána oprávnění ze %n položek.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> - <translation>KeePassXC: Nebyl nalezen žádný záznam s oprávněními!</translation> + <translation>KeePassXC: Nebyl nalezen záznam s oprávněními!</translation> </message> <message> <source>The active database does not contain an entry with permissions.</source> @@ -3770,7 +3775,7 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> </message> <message> <source>Access error for config file %1</source> - <translation>Chyba přístupu k souboru s nastaveními %1</translation> + <translation>Chyba přístupu pro soubor s nastaveními %1</translation> </message> </context> <context> @@ -3805,7 +3810,7 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> </message> <message> <source>Automatically reload the database when modified externally</source> - <translation>V případě úpravy zvenčí, automaticky znovu načíst databázi</translation> + <translation>V případě úpravy zvenčí, automaticky opětovně načíst databázi</translation> </message> <message> <source>Minimize when copying to clipboard</source> @@ -3817,11 +3822,11 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> </message> <message> <source>Use group icon on entry creation</source> - <translation>Pro vytvářený záznam použít ikonu skupiny, pod kterou je vytvářen</translation> + <translation>Pro vytvářený záznam použít ikonu skupiny, do které spadá</translation> </message> <message> <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> - <translation>Neoznačovat databázi jako upravenou při změnách, nepostihujících údaje (např. rozkliknutí skupin)</translation> + <translation>Neoznačovat databázi jako upravenou při změnách, nepostihujících údaje (např. rozšíření skupin)</translation> </message> <message> <source>Hide the Details view</source> @@ -3926,7 +3931,7 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> </message> <message> <source>Lock databases when session is locked or lid is closed</source> - <translation>Zamknout databáze když je zamčeno sezení uživatele v operačním systému nebo je zavřeno víko notebooku</translation> + <translation>Zamknout databáze když je zamčena relace nebo je zavřeno víko notebooku</translation> </message> <message> <source>Lock databases after minimizing the window</source> @@ -3965,7 +3970,7 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> <name>SetupTotpDialog</name> <message> <source>Setup TOTP</source> - <translation>Nastavit na času založené jednorázové heslo (TOTP)</translation> + <translation>Nastavit TOTP</translation> </message> <message> <source>Key:</source> @@ -4094,7 +4099,7 @@ Buď jí odemkněte, nebo vyberte jinou, odemčenou.</translation> </message> <message> <source>path to a custom config file</source> - <translation>umístění uživatelem určeného souboru s nastaveními</translation> + <translation>umístění vlastního souboru s nastaveními</translation> </message> <message> <source>key file of the database</source> diff --git a/share/translations/keepassx_da.ts b/share/translations/keepassx_da.ts index 31c93e6cf..decc99069 100644 --- a/share/translations/keepassx_da.ts +++ b/share/translations/keepassx_da.ts @@ -73,12 +73,13 @@ Kerne: %3 %4</translation> </message> <message> <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> - <translation type="unfinished"/> + <translation>Særlig tak fra KeePassXC holdet går til debfx for at udvikle den oprindelige KeePassX.</translation> </message> <message> <source>Build Type: %1 </source> - <translation type="unfinished"/> + <translation>Opret type:%1 +</translation> </message> </context> <context> @@ -193,7 +194,7 @@ Vælg venligst hvorvidt du vil tillade denne adgang.</translation> <name>BrowserAccessControlDialog</name> <message> <source>KeePassXC-Browser Confirm Access</source> - <translation type="unfinished"/> + <translation>KeePassXC-Browser Bekræft Adgang</translation> </message> <message> <source>Remember this decision</source> @@ -218,7 +219,7 @@ Vælg venligst hvorvidt du vil tillade denne adgang.</translation> <name>BrowserOptionDialog</name> <message> <source>Dialog</source> - <translation type="unfinished"/> + <translation>Dialog</translation> </message> <message> <source>This is required for accessing your databases with KeePassXC-Browser</source> @@ -238,24 +239,24 @@ Vælg venligst hvorvidt du vil tillade denne adgang.</translation> </message> <message> <source>&Google Chrome</source> - <translation type="unfinished"/> + <translation>&Google Chrome</translation> </message> <message> <source>&Firefox</source> - <translation type="unfinished"/> + <translation>&Firefox</translation> </message> <message> <source>&Chromium</source> - <translation type="unfinished"/> + <translation>&Chromium</translation> </message> <message> <source>&Vivaldi</source> - <translation type="unfinished"/> + <translation>&Vivaldi</translation> </message> <message> <source>Show a &notification when credentials are requested</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Vis en notifikation når legitimationsoplysninger forespørges</translation> </message> <message> <source>Re&quest to unlock the database if it is locked</source> @@ -263,11 +264,11 @@ Vælg venligst hvorvidt du vil tillade denne adgang.</translation> </message> <message> <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> - <translation type="unfinished"/> + <translation>Kun poster med samme skema (http://, https://, ftp://, ...) bliver returneret.</translation> </message> <message> <source>&Match URL scheme (e.g., https://...)</source> - <translation type="unfinished"/> + <translation>&Match URL skemaer</translation> </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> @@ -275,25 +276,25 @@ Vælg venligst hvorvidt du vil tillade denne adgang.</translation> </message> <message> <source>&Return only best-matching credentials</source> - <translation type="unfinished"/> + <translation>&Returnér kun de bedst matchende poster</translation> </message> <message> <source>Sort &matching credentials by title</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Sorter matchende poster efter &navn</translation> </message> <message> <source>Sort matching credentials by &username</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Sorter matchende poster efter &brugernavn</translation> </message> <message> <source>&Disconnect all browsers</source> - <translation type="unfinished"/> + <translation>&Fjern tilslutning til alle browsere</translation> </message> <message> <source>Forget all remembered &permissions</source> - <translation type="unfinished"/> + <translation>Fjern alle tilladelser fra hukommelse</translation> </message> <message> <source>Advanced</source> @@ -302,7 +303,7 @@ Vælg venligst hvorvidt du vil tillade denne adgang.</translation> <message> <source>Never &ask before accessing credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Spørg aldrig om lov for hente leigitamationsoplysninger</translation> </message> <message> <source>Never ask before &updating credentials</source> @@ -324,15 +325,15 @@ Vælg venligst hvorvidt du vil tillade denne adgang.</translation> </message> <message> <source>&Return advanced string fields which start with "KPH: "</source> - <translation type="unfinished"/> + <translation>&Vis avancerede tekst felter som begynder med "KPH:"</translation> </message> <message> <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> - <translation type="unfinished"/> + <translation>Opdaterer KeePassXC eller keepassxc-proxy binære sti automatisk til beskedscript ved opstart</translation> </message> <message> <source>Update &native messaging manifest files at startup</source> - <translation type="unfinished"/> + <translation>Opdater besked manifest dokumenter ved opstart</translation> </message> <message> <source>Support a proxy application between KeePassXC and browser extension.</source> @@ -340,7 +341,7 @@ Vælg venligst hvorvidt du vil tillade denne adgang.</translation> </message> <message> <source>Use a &proxy application between KeePassXC and browser extension</source> - <translation type="unfinished"/> + <translation>Understøt en proxy applikation mellem KeePassXC og browser-udvidelse.</translation> </message> <message> <source>Use a custom proxy location if you installed a proxy manually.</source> @@ -349,7 +350,7 @@ Vælg venligst hvorvidt du vil tillade denne adgang.</translation> <message> <source>Use a &custom proxy location</source> <comment>Meant is the proxy for KeePassXC-Browser</comment> - <translation type="unfinished"/> + <translation>Vælg en brugerdefineret proxy lokation</translation> </message> <message> <source>Browse...</source> @@ -372,6 +373,10 @@ Vælg venligst hvorvidt du vil tillade denne adgang.</translation> <source>Select custom proxy location</source> <translation>Vælg en brugerdefineret proxy lokation</translation> </message> + <message> + <source>We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>BrowserService</name> @@ -405,7 +410,7 @@ Vil du overskrive den?</translation> </message> <message> <source>KeePassXC: Update Entry</source> - <translation type="unfinished"/> + <translation>KeePassXC: Opdater post</translation> </message> <message> <source>Do you want to update the information in %1 - %2?</source> @@ -443,7 +448,7 @@ Lås den valgte database op eller vælg en anden som er åbnet.</translation> </message> <message numerus="yes"> <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> - <translation><numerusform>Succesfuldt fjernet %n kryptering nøgle(r) fra KeePassXC indstillinger.</numerusform><numerusform>Fjernede succesfuldt %n krypteringsnøgle(r) fra KeePassXC indstillinger.</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> <message> <source>Removing stored permissions…</source> @@ -463,11 +468,11 @@ Lås den valgte database op eller vælg en anden som er åbnet.</translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> - <translation type="unfinished"/> + <translation>KeePassXC: Ingen nøgler fundet</translation> </message> <message> <source>The active database does not contain an entry with permissions.</source> - <translation type="unfinished"/> + <translation>Den aktive database indholder ikke en post med tilladelser</translation> </message> </context> <context> @@ -544,14 +549,16 @@ Lås den valgte database op eller vælg en anden som er åbnet.</translation> </message> <message> <source>Legacy key file format</source> - <translation type="unfinished"/> + <translation>Forældet nøglefilformat</translation> </message> <message> <source>You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>Du benytter et forældet nøglefilformat, som muligvis ikke vil blive understøttet i fremtiden. + +Overvej at generere en ny nøglefil.</translation> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -684,15 +691,15 @@ Please consider generating a new key file.</source> <name>CsvParserModel</name> <message numerus="yes"> <source>%n byte(s), </source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n byte(s),</numerusform><numerusform>%n byte(s),</numerusform></translation> </message> <message numerus="yes"> <source>%n row(s), </source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n række(r),</numerusform><numerusform>%n række(r),</numerusform></translation> </message> <message numerus="yes"> <source>%n column(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n kolonne(r)</numerusform><numerusform>%n kolonne(r)</numerusform></translation> </message> </context> <context> @@ -731,18 +738,20 @@ Please consider generating a new key file.</source> </message> <message> <source>Legacy key file format</source> - <translation type="unfinished"/> + <translation>Forældet nøglefilformat</translation> </message> <message> <source>You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>Du benytter et forældet nøglefilformat, som muligvis ikke vil blive understøttet i fremtiden. + +Overvej at generere en ny nøglefil.</translation> </message> <message> <source>Don't show this warning again</source> - <translation type="unfinished"/> + <translation>Vis ikke denne advarsel igen</translation> </message> <message> <source>All files</source> @@ -828,7 +837,7 @@ Hvis du vil beholde antallet, så kan din database tage timer eller dage (eller <message> <source>Number of rounds too low</source> <comment>Key transformation rounds</comment> - <translation type="unfinished"/> + <translation>Antallet af runder er for lavt</translation> </message> <message> <source>You are using a very low number of key transform rounds with AES-KDF. @@ -859,7 +868,7 @@ If you keep this number, your database may be too easy to crack!</source> <name>DatabaseSettingsWidgetEncryption</name> <message> <source>Encryption Algorithm:</source> - <translation type="unfinished"/> + <translation>Krypteringsalgoritme</translation> </message> <message> <source>AES: 256 Bit (default)</source> @@ -1014,7 +1023,7 @@ Gem disse ændringer?</translation> </message> <message> <source>Writing the database failed.</source> - <translation>Skrivning til database fejler.</translation> + <translation>Kan ikke skrive til databasen.</translation> </message> <message> <source>Passwords</source> @@ -1108,7 +1117,7 @@ Disable safe saves and try again?</source> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Ønsker du virkelig at flytte %n post over i papirkurven?</numerusform><numerusform>Ønsker du virkelig at flytte %n poster over i papirkurven?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1132,7 +1141,7 @@ Disable safe saves and try again?</source> </message> <message> <source>Unable to calculate master key</source> - <translation>Kan ikke beregne hovednøgle</translation> + <translation>Kan ikke beregne hovednøgle</translation> </message> <message> <source>No current database.</source> @@ -1179,10 +1188,6 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation type="unfinished"/> </message> - <message> - <source>Entry updated successfully.</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DetailsWidget</name> @@ -1192,7 +1197,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Close</source> - <translation type="unfinished"/> + <translation>Luk</translation> </message> <message> <source>General</source> @@ -1359,11 +1364,11 @@ Do you want to merge your changes?</source> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n uge</numerusform><numerusform>%n uger</numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n måned</numerusform><numerusform>%n måneder</numerusform></translation> </message> <message> <source>1 year</source> @@ -1936,7 +1941,7 @@ This may cause the affected plugins to malfunction.</source> <name>EntryView</name> <message> <source>Customize View</source> - <translation type="unfinished"/> + <translation>Tilpas visning</translation> </message> <message> <source>Hide Usernames</source> @@ -1958,6 +1963,10 @@ This may cause the affected plugins to malfunction.</source> <source>Reset to defaults</source> <translation>Nulstil til standard-indstillinger</translation> </message> + <message> + <source>Attachments (icon)</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Group</name> @@ -2073,7 +2082,7 @@ This may cause the affected plugins to malfunction.</source> <name>Kdbx4Reader</name> <message> <source>missing database headers</source> - <translation type="unfinished"/> + <translation>Database headers mangler</translation> </message> <message> <source>Unable to calculate master key</source> @@ -2081,11 +2090,11 @@ This may cause the affected plugins to malfunction.</source> </message> <message> <source>Invalid header checksum size</source> - <translation type="unfinished"/> + <translation>Invalid størrelse for gruppefelt</translation> </message> <message> <source>Header SHA256 mismatch</source> - <translation type="unfinished"/> + <translation>Header SHA256 stemmer ikke</translation> </message> <message> <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> @@ -2097,23 +2106,23 @@ This may cause the affected plugins to malfunction.</source> </message> <message> <source>Invalid header id size</source> - <translation type="unfinished"/> + <translation>Invalid størrelse for gruppefelt</translation> </message> <message> <source>Invalid header field length</source> - <translation type="unfinished"/> + <translation>Invalid størrelse i headerfelt</translation> </message> <message> <source>Invalid header data length</source> - <translation type="unfinished"/> + <translation>Invalid størrelse i headerfelt</translation> </message> <message> <source>Failed to open buffer for KDF parameters in header</source> - <translation type="unfinished"/> + <translation>Kan ikke åbne buffer for KDF parametre i header</translation> </message> <message> <source>Unsupported key derivation function (KDF) or invalid parameters</source> - <translation type="unfinished"/> + <translation>Ikke understøtet nøgleafledningsfunktion (KDF) eller invalide parametre</translation> </message> <message> <source>Legacy header fields found in KDBX4 file.</source> @@ -2121,11 +2130,11 @@ This may cause the affected plugins to malfunction.</source> </message> <message> <source>Invalid inner header id size</source> - <translation type="unfinished"/> + <translation>Invalid størrelse i indre headerfelt id</translation> </message> <message> <source>Invalid inner header field length</source> - <translation type="unfinished"/> + <translation>Invalid størrelse i headerfelt</translation> </message> <message> <source>Invalid inner header binary size</source> @@ -2417,7 +2426,7 @@ Dette er en envejs konvertering. Du vil ikke være i stand til at åbne den impo </message> <message> <source>Not a KeePass database.</source> - <translation>Dette er ikke en KeePass database.</translation> + <translation>Ikke en KeePass database.</translation> </message> <message> <source>Unsupported encryption algorithm.</source> @@ -2425,7 +2434,7 @@ Dette er en envejs konvertering. Du vil ikke være i stand til at åbne den impo </message> <message> <source>Unsupported KeePass database version.</source> - <translation>KeePass database version ikke understøttet.</translation> + <translation>Ikke understøttet KeePass database version</translation> </message> <message> <source>Unable to read encryption IV</source> @@ -2506,15 +2515,15 @@ Dette er en envejs konvertering. Du vil ikke være i stand til at åbne den impo </message> <message> <source>Incorrect group icon field size</source> - <translation type="unfinished"/> + <translation>Invalid størrelse for gruppefelt</translation> </message> <message> <source>Incorrect group level field size</source> - <translation type="unfinished"/> + <translation>Invalid størrelse for gruppefelt</translation> </message> <message> <source>Invalid group field type</source> - <translation type="unfinished"/> + <translation>Invalid type for gruppefelt</translation> </message> <message> <source>Missing group id or level</source> @@ -2522,19 +2531,19 @@ Dette er en envejs konvertering. Du vil ikke være i stand til at åbne den impo </message> <message> <source>Missing entry field type number</source> - <translation type="unfinished"/> + <translation>Manglende type nummer for gruppefelt</translation> </message> <message> <source>Invalid entry field size</source> - <translation type="unfinished"/> + <translation>Invalid størrelse for gruppefelt</translation> </message> <message> <source>Read entry field data doesn't match size</source> - <translation type="unfinished"/> + <translation>Postens data længde passer ikke</translation> </message> <message> <source>Invalid entry uuid field size</source> - <translation type="unfinished"/> + <translation>Invalid uuid værdi</translation> </message> <message> <source>Invalid entry group id field size</source> @@ -2604,11 +2613,11 @@ Dette er en envejs konvertering. Du vil ikke være i stand til at åbne den impo </message> <message> <source>E&ntries</source> - <translation type="unfinished"/> + <translation>Poster</translation> </message> <message> <source>Copy att&ribute to clipboard</source> - <translation type="unfinished"/> + <translation>Kopiér att&ribute til udklipsholder</translation> </message> <message> <source>Time-based one-time password</source> @@ -2620,7 +2629,7 @@ Dette er en envejs konvertering. Du vil ikke være i stand til at åbne den impo </message> <message> <source>&Tools</source> - <translation>&Værktøj</translation> + <translation type="unfinished"/> </message> <message> <source>&Quit</source> @@ -2648,7 +2657,7 @@ Dette er en envejs konvertering. Du vil ikke være i stand til at åbne den impo </message> <message> <source>Merge from KeePassX database</source> - <translation type="unfinished"/> + <translation>Flet og kombiner fra KeePassX database</translation> </message> <message> <source>&Add new entry</source> @@ -2676,11 +2685,11 @@ Dette er en envejs konvertering. Du vil ikke være i stand til at åbne den impo </message> <message> <source>Sa&ve database as...</source> - <translation type="unfinished"/> + <translation>Gem database som</translation> </message> <message> <source>Change &master key...</source> - <translation type="unfinished"/> + <translation>Skift &hovednøgle...</translation> </message> <message> <source>&Database settings</source> @@ -2708,7 +2717,7 @@ Dette er en envejs konvertering. Du vil ikke være i stand til at åbne den impo </message> <message> <source>Cop&y password</source> - <translation type="unfinished"/> + <translation>Kopier kodeord</translation> </message> <message> <source>Copy password to clipboard</source> @@ -2728,7 +2737,7 @@ Dette er en envejs konvertering. Du vil ikke være i stand til at åbne den impo </message> <message> <source>&Open URL</source> - <translation>&Åben URL</translation> + <translation>&Åbn URL</translation> </message> <message> <source>&Lock databases</source> @@ -2772,7 +2781,7 @@ Dette er en envejs konvertering. Du vil ikke være i stand til at åbne den impo </message> <message> <source>Re&pair database...</source> - <translation type="unfinished"/> + <translation>Reparer database</translation> </message> <message> <source>Show TOTP</source> @@ -2780,7 +2789,7 @@ Dette er en envejs konvertering. Du vil ikke være i stand til at åbne den impo </message> <message> <source>Set up TOTP...</source> - <translation type="unfinished"/> + <translation>Indstil TOTP...</translation> </message> <message> <source>Copy &TOTP</source> @@ -2788,7 +2797,7 @@ Dette er en envejs konvertering. Du vil ikke være i stand til at åbne den impo </message> <message> <source>E&mpty recycle bin</source> - <translation type="unfinished"/> + <translation>Tøm skraldespand</translation> </message> <message> <source>Clear history</source> @@ -2859,7 +2868,7 @@ Denne version er ikke beregnet til at blive brugt i produktion.</translation> </message> <message> <source>PEM boundary mismatch</source> - <translation type="unfinished"/> + <translation>PEM grænse-mismatch</translation> </message> <message> <source>Base64 decoding failed</source> @@ -2871,7 +2880,7 @@ Denne version er ikke beregnet til at blive brugt i produktion.</translation> </message> <message> <source>Key file magic header id invalid</source> - <translation type="unfinished"/> + <translation>Nøglefil magic i header er invalid</translation> </message> <message> <source>Found zero keys</source> @@ -2887,7 +2896,7 @@ Denne version er ikke beregnet til at blive brugt i produktion.</translation> </message> <message> <source>No private key payload to decrypt</source> - <translation type="unfinished"/> + <translation>Der er ingen privat nøgle at dekryptere</translation> </message> <message> <source>Trying to run KDF without cipher</source> @@ -2895,15 +2904,15 @@ Denne version er ikke beregnet til at blive brugt i produktion.</translation> </message> <message> <source>Passphrase is required to decrypt this key</source> - <translation type="unfinished"/> + <translation>Kodefrase er nødvendig for at dekryptere denne nøgle </translation> </message> <message> <source>Key derivation failed, key file corrupted?</source> - <translation type="unfinished"/> + <translation>Nøgleafledning fejlede, er nøglefilen korrupt? </translation> </message> <message> <source>Decryption failed, wrong passphrase?</source> - <translation type="unfinished"/> + <translation>Dekryptering fejlede, forkert kodefrase? </translation> </message> <message> <source>Unexpected EOF while reading public key</source> @@ -2915,19 +2924,19 @@ Denne version er ikke beregnet til at blive brugt i produktion.</translation> </message> <message> <source>Can't write public key as it is empty</source> - <translation type="unfinished"/> + <translation>Kan ikke skrive offentlig nøgle, da den er tom</translation> </message> <message> <source>Unexpected EOF when writing public key</source> - <translation type="unfinished"/> + <translation>Offentlig nøgle sluttede uventet under skrivning</translation> </message> <message> <source>Can't write private key as it is empty</source> - <translation type="unfinished"/> + <translation>Kan ikke skrive nøglen da den er tom</translation> </message> <message> <source>Unexpected EOF when writing private key</source> - <translation type="unfinished"/> + <translation>Privat nøgle sluttede uventet under skrivnig</translation> </message> <message> <source>Unsupported key type: %1</source> @@ -2954,7 +2963,7 @@ Denne version er ikke beregnet til at blive brugt i produktion.</translation> <name>OptionDialog</name> <message> <source>Dialog</source> - <translation type="unfinished"/> + <translation>Dialog</translation> </message> <message> <source>This is required for accessing your databases from ChromeIPass or PassIFox</source> @@ -2971,7 +2980,7 @@ Denne version er ikke beregnet til at blive brugt i produktion.</translation> <message> <source>Sh&ow a notification when credentials are requested</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Vis en notifikation når legitimationsoplysninger forespørges</translation> </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> @@ -2995,19 +3004,19 @@ Denne version er ikke beregnet til at blive brugt i produktion.</translation> </message> <message> <source>Sort matching entries by &username</source> - <translation type="unfinished"/> + <translation>Sorter matchende poster efter &brugernavn</translation> </message> <message> <source>Sort &matching entries by title</source> - <translation type="unfinished"/> + <translation>Sorter &passende poster efter navn</translation> </message> <message> <source>R&emove all shared encryption keys from active database</source> - <translation type="unfinished"/> + <translation>Fjern alle delte krypteringsnøgler i den aktive database</translation> </message> <message> <source>Re&move all stored permissions from entries in active database</source> - <translation type="unfinished"/> + <translation>Fjern alle gemte tilladelser fra poster i den aktive database</translation> </message> <message> <source>Password Generator</source> @@ -3019,11 +3028,11 @@ Denne version er ikke beregnet til at blive brugt i produktion.</translation> </message> <message> <source>Always allow &access to entries</source> - <translation type="unfinished"/> + <translation>Tillad altid &adgang til poster</translation> </message> <message> <source>Always allow &updating entries</source> - <translation type="unfinished"/> + <translation>Tillad alltid &optaterede poster</translation> </message> <message> <source>Only the selected database has to be connected with a client.</source> @@ -3031,7 +3040,7 @@ Denne version er ikke beregnet til at blive brugt i produktion.</translation> </message> <message> <source>Searc&h in all opened databases for matching entries</source> - <translation type="unfinished"/> + <translation>&Returnér kun de bedst matchende poster</translation> </message> <message> <source>Automatically creating or updating string fields is not supported.</source> @@ -3039,19 +3048,19 @@ Denne version er ikke beregnet til at blive brugt i produktion.</translation> </message> <message> <source>&Return advanced string fields which start with "KPH: "</source> - <translation type="unfinished"/> + <translation>&Vis avancerede tekst felter som begynder med "KPH:"</translation> </message> <message> <source>HTTP Port:</source> - <translation type="unfinished"/> + <translation>HTTP Port:</translation> </message> <message> <source>Default port: 19455</source> - <translation type="unfinished"/> + <translation>Standard port: 19455</translation> </message> <message> <source>KeePassXC will listen to this port on 127.0.0.1</source> - <translation type="unfinished"/> + <translation>KeePassXC vil lytte til dette port på 127.0.0.1</translation> </message> <message> <source><b>Warning:</b> The following options can be dangerous!</source> @@ -3063,19 +3072,20 @@ Denne version er ikke beregnet til at blive brugt i produktion.</translation> </message> <message> <source>Cannot bind to privileged ports</source> - <translation type="unfinished"/> + <translation>Kan ikke forbinde via priviligerede porte</translation> </message> <message> <source>Cannot bind to privileged ports below 1024! Using default port 19455.</source> - <translation type="unfinished"/> + <translation>Kan ikke forbinde til prioriterede port under 1024! +Bruger standard port 19455.</translation> </message> </context> <context> <name>PasswordGeneratorWidget</name> <message> <source>%p%</source> - <translation type="unfinished"/> + <translation>%p%</translation> </message> <message> <source>Password:</source> @@ -3084,11 +3094,11 @@ Using default port 19455.</source> <message> <source>strength</source> <comment>Password strength</comment> - <translation type="unfinished"/> + <translation>styrke</translation> </message> <message> <source>entropy</source> - <translation type="unfinished"/> + <translation>entropi:</translation> </message> <message> <source>Password</source> @@ -3124,35 +3134,35 @@ Using default port 19455.</source> </message> <message> <source>Pick characters from every group</source> - <translation type="unfinished"/> + <translation>Vælg tegn fra alle grupper:</translation> </message> <message> <source>&Length:</source> - <translation type="unfinished"/> + <translation>&Længde:</translation> </message> <message> <source>Passphrase</source> - <translation type="unfinished"/> + <translation>Nøgleord sætning/frase:</translation> </message> <message> <source>Wordlist:</source> - <translation type="unfinished"/> + <translation>Ordliste:</translation> </message> <message> <source>Word Count:</source> - <translation type="unfinished"/> + <translation>Antal ord:</translation> </message> <message> <source>Word Separator:</source> - <translation type="unfinished"/> + <translation>Ord separator</translation> </message> <message> <source>Generate</source> - <translation type="unfinished"/> + <translation>Opret</translation> </message> <message> <source>Copy</source> - <translation type="unfinished"/> + <translation>Kopier</translation> </message> <message> <source>Accept</source> @@ -3160,46 +3170,46 @@ Using default port 19455.</source> </message> <message> <source>Close</source> - <translation type="unfinished"/> + <translation>Luk</translation> </message> <message> <source>Apply</source> - <translation type="unfinished"/> + <translation>Entropy: %1 bit</translation> </message> <message> <source>Entropy: %1 bit</source> - <translation type="unfinished"/> + <translation>Entropy: %1 bit</translation> </message> <message> <source>Password Quality: %1</source> - <translation type="unfinished"/> + <translation>Kodeord kvalitet: %1</translation> </message> <message> <source>Poor</source> <comment>Password quality</comment> - <translation type="unfinished"/> + <translation>Dårligt</translation> </message> <message> <source>Weak</source> <comment>Password quality</comment> - <translation type="unfinished"/> + <translation>Svagt</translation> </message> <message> <source>Good</source> <comment>Password quality</comment> - <translation type="unfinished"/> + <translation>Godt</translation> </message> <message> <source>Excellent</source> <comment>Password quality</comment> - <translation type="unfinished"/> + <translation>Udmærket</translation> </message> </context> <context> <name>QObject</name> <message> <source>Database not opened</source> - <translation type="unfinished"/> + <translation>Databasen er ikke åbnet</translation> </message> <message> <source>Database hash not available</source> @@ -3663,7 +3673,7 @@ Do you want to overwrite it?</source> </message> <message> <source>KeePassXC: Update Entry</source> - <translation type="unfinished"/> + <translation>KeePassXC: Opdater post</translation> </message> <message> <source>Do you want to update the information in %1 - %2?</source> @@ -3721,11 +3731,11 @@ Lås den valgte database op eller vælg en anden som er åbnet.</translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> - <translation type="unfinished"/> + <translation>KeePassXC: Ingen nøgler fundet</translation> </message> <message> <source>The active database does not contain an entry with permissions.</source> - <translation type="unfinished"/> + <translation>Den aktive database indholder ikke en post med tilladelser</translation> </message> </context> <context> @@ -3995,7 +4005,7 @@ Lås den valgte database op eller vælg en anden som er åbnet.</translation> </message> <message> <source>Copy</source> - <translation type="unfinished"/> + <translation>Kopier</translation> </message> <message> <source>Expires in</source> diff --git a/share/translations/keepassx_de.ts b/share/translations/keepassx_de.ts index b4f49e6f3..dd0eff6df 100644 --- a/share/translations/keepassx_de.ts +++ b/share/translations/keepassx_de.ts @@ -35,7 +35,7 @@ </message> <message> <source>Copy to clipboard</source> - <translation>In die Zwischenablage kopieren</translation> + <translation>In Zwischenablage kopieren</translation> </message> <message> <source>Version %1 @@ -373,6 +373,10 @@ Bitte wählen Sie, ob Sie den Zugriff erlauben möchten.</translation> <source>Select custom proxy location</source> <translation>Benutzerdefinierten Proxy-Pfad auswählen</translation> </message> + <message> + <source>We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</source> + <translation>Sorry, aber KeePassXC-Browser wird derzeit für Snap-Releases nicht unterstützt.</translation> + </message> </context> <context> <name>BrowserService</name> @@ -444,7 +448,7 @@ Bitte entsperren Sie die ausgewählte Datenbank oder wählen Sie eine andere, di </message> <message numerus="yes"> <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> - <translation><numerusform>Es wurde erfolgreich %n Schlüssel aus den KeePassXC-Einstellungen entfernt.</numerusform><numerusform>Es wurden erfolgreich %n Schlüssel aus den KeePassXC-Einstellungen entfernt.</numerusform></translation> + <translation><numerusform>Es wurden erfolgreich %n Schlüssel aus den KeePassXC-Einstellungen entfernt.</numerusform><numerusform>Es wurden erfolgreich %n Schlüssel aus den KeePassXC-Einstellungen entfernt.</numerusform></translation> </message> <message> <source>Removing stored permissions…</source> @@ -557,7 +561,7 @@ Bitte denken Sie darüber nach, eine neue Schlüsseldatei zu generieren.</transl </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> - <translation>Ändern des Master-Passworts fehlgeschlagen: kein YubiKey eingesteckt.</translation> + <translation>Ändern des Hauptschlüssels fehlgeschlagen: kein YubiKey eingesteckt.</translation> </message> </context> <context> @@ -572,7 +576,7 @@ Bitte denken Sie darüber nach, eine neue Schlüsseldatei zu generieren.</transl </message> <message> <source>Replace username and password with references</source> - <translation>Benutzernamen und Passwort mit Referenzen ersetzen</translation> + <translation>Benutzernamen und Passwort mit Referencen ersetzen</translation> </message> <message> <source>Copy history</source> @@ -679,14 +683,14 @@ Bitte denken Sie darüber nach, eine neue Schlüsseldatei zu generieren.</transl </message> <message> <source>Unable to calculate master key</source> - <translation>Berechnung des Master-Passworts gescheitert</translation> + <translation>Berechnung des Hauptschlüssels gescheitert</translation> </message> </context> <context> <name>CsvParserModel</name> <message numerus="yes"> <source>%n byte(s), </source> - <translation><numerusform>%n Byte</numerusform><numerusform>%n Bytes</numerusform></translation> + <translation><numerusform>%n Byte,</numerusform><numerusform>%n Byte,</numerusform></translation> </message> <message numerus="yes"> <source>%n row(s), </source> @@ -701,7 +705,7 @@ Bitte denken Sie darüber nach, eine neue Schlüsseldatei zu generieren.</transl <name>DatabaseOpenWidget</name> <message> <source>Enter master key</source> - <translation>Master-Passwort eingeben</translation> + <translation>Hauptschlüssel eingeben</translation> </message> <message> <source>Key File:</source> @@ -725,7 +729,7 @@ Bitte denken Sie darüber nach, eine neue Schlüsseldatei zu generieren.</transl </message> <message> <source>Unable to open the database.</source> - <translation>Öffnen der Datenbank ist nicht möglich.</translation> + <translation>Öffnen der Datenbank nicht möglich.</translation> </message> <message> <source>Can't open key file</source> @@ -777,7 +781,7 @@ Bitte denken Sie darüber nach, eine neue Schlüsseldatei zu generieren.</transl </message> <message> <source>Unable to open the database.</source> - <translation>Öffnen der Datenbank ist nicht möglich.</translation> + <translation>Öffnen der Datenbank nicht möglich.</translation> </message> <message> <source>Database opened fine. Nothing to do.</source> @@ -858,7 +862,7 @@ Wenn Sie diese Anzahl beibehalten, könnte Ihre Datenbank zu einfach zu knacken <message numerus="yes"> <source> thread(s)</source> <comment>Threads for parallel execution (KDF settings)</comment> - <translation><numerusform> Thread</numerusform><numerusform> Threads</numerusform></translation> + <translation><numerusform>Thread</numerusform><numerusform>Threads</numerusform></translation> </message> </context> <context> @@ -992,11 +996,11 @@ Wenn Sie diese Anzahl beibehalten, könnte Ihre Datenbank zu einfach zu knacken </message> <message> <source>Open KeePass 1 database</source> - <translation>KeePass 1-Datenbank öffnen</translation> + <translation>KeePass 1 Datenbank öffnen</translation> </message> <message> <source>KeePass 1 database</source> - <translation>KeePass 1-Datenbank</translation> + <translation>KeePass 1 Datenbank</translation> </message> <message> <source>Close?</source> @@ -1028,7 +1032,7 @@ Save changes?</source> </message> <message> <source>Save database as</source> - <translation>Datenbank speichern als</translation> + <translation>Datenbank speichern unter</translation> </message> <message> <source>Export database to CSV file</source> @@ -1083,7 +1087,7 @@ Sicheres Speichern deaktivieren und erneut versuchen?</translation> </message> <message> <source>Change master key</source> - <translation>Master-Passwort ändern</translation> + <translation>Hauptschlüssel ändern</translation> </message> <message> <source>Delete entry?</source> @@ -1115,7 +1119,7 @@ Sicheres Speichern deaktivieren und erneut versuchen?</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>Möchten Sie wirklich %n Eintrag aus dem Papierkorb löschen?</numerusform><numerusform>Möchten Sie wirklich %n Einträge aus dem Papierkorb löschen?</numerusform></translation> + <translation><numerusform>Wollen Sie wirklich %n Eintrag in den Papierkorb verschieben?</numerusform><numerusform>Wollen Sie wirklich %n Einträge in den Papierkorb verschieben?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1139,7 +1143,7 @@ Sicheres Speichern deaktivieren und erneut versuchen?</translation> </message> <message> <source>Unable to calculate master key</source> - <translation>Berechnung des Master-Passworts gescheitert</translation> + <translation>Berechnung des Hauptschlüssels gescheitert</translation> </message> <message> <source>No current database.</source> @@ -1187,10 +1191,6 @@ Möchten Sie Ihre Änderungen zusammenführen?</translation> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>Sind Sie sicher, dass Sie den Inhalt des Papierkorbs unwiederbringlich löschen wollen?</translation> </message> - <message> - <source>Entry updated successfully.</source> - <translation>Eintrag erfolgreich aktualisiert.</translation> - </message> </context> <context> <name>DetailsWidget</name> @@ -1339,7 +1339,7 @@ Möchten Sie Ihre Änderungen zusammenführen?</translation> </message> <message> <source>Different passwords supplied.</source> - <translation>Passwörter sind unterschiedlich</translation> + <translation>Unterschiedliche Passwörter eingegeben.</translation> </message> <message> <source>New attribute</source> @@ -1367,11 +1367,11 @@ Möchten Sie Ihre Änderungen zusammenführen?</translation> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation><numerusform>%n Woche</numerusform><numerusform>%n Wochen</numerusform></translation> + <translation><numerusform>%n Woche</numerusform><numerusform>%n Woche(n)</numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation><numerusform>%n Monat</numerusform><numerusform>%n Monate</numerusform></translation> + <translation><numerusform>%n Monat</numerusform><numerusform>%n Monat(en)</numerusform></translation> </message> <message> <source>1 year</source> @@ -1566,7 +1566,7 @@ Möchten Sie Ihre Änderungen zusammenführen?</translation> </message> <message> <source>Copy to clipboard</source> - <translation>In Zwischenablage kopieren</translation> + <translation>In die Zwischenablage kopieren</translation> </message> <message> <source>Private key</source> @@ -1645,7 +1645,7 @@ Möchten Sie Ihre Änderungen zusammenführen?</translation> </message> <message> <source>Expires</source> - <translation>Verfällt</translation> + <translation>Erlischt</translation> </message> <message> <source>Search</source> @@ -1815,7 +1815,7 @@ Dies kann dazu führen, dass die jeweiligen Plugins nicht mehr richtig funktioni </message> <message numerus="yes"> <source>Are you sure you want to remove %n attachment(s)?</source> - <translation><numerusform>Sind Sie sicher, dass sie einen Anhang löschen möchten?</numerusform><numerusform>Sind Sie sicher, dass sie %n Anhänge löschen möchten?</numerusform></translation> + <translation><numerusform>Sind Sie sicher, dass Sie %n Anhang löschen wollen?</numerusform><numerusform>Sind Sie sicher, dass Sie %n Anhänge löschen möchten?</numerusform></translation> </message> <message> <source>Confirm Remove</source> @@ -1971,6 +1971,10 @@ Dies kann dazu führen, dass die jeweiligen Plugins nicht mehr richtig funktioni <source>Reset to defaults</source> <translation>Zurücksetzen</translation> </message> + <message> + <source>Attachments (icon)</source> + <translation>Anhänge (Icon)</translation> + </message> </context> <context> <name>Group</name> @@ -2419,7 +2423,7 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann </message> <message> <source>Unable to open the database.</source> - <translation>Öffnen der Datenbank ist nicht möglich.</translation> + <translation>Öffnen der Datenbank nicht möglich.</translation> </message> </context> <context> @@ -2475,7 +2479,7 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann </message> <message> <source>Unable to calculate master key</source> - <translation>Berechnung des Master-Passworts gescheitert</translation> + <translation>Berechnung des Hauptschlüssels gescheitert</translation> </message> <message> <source>Wrong key or database file is corrupt.</source> @@ -2661,7 +2665,7 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann </message> <message> <source>Merge from KeePassX database</source> - <translation>Mit KeePassXC-Datenbank zusammenführen</translation> + <translation>Aus KeePassXC-Datenbank zusammenführen</translation> </message> <message> <source>&Add new entry</source> @@ -2693,7 +2697,7 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann </message> <message> <source>Change &master key...</source> - <translation>&Master-Passwort ändern...</translation> + <translation>Ha&uptschlüssel ändern...</translation> </message> <message> <source>&Database settings</source> @@ -2717,7 +2721,7 @@ Dieser Vorgang ist nur in eine Richtung möglich. Die importierte Datenbank kann </message> <message> <source>Copy username to clipboard</source> - <translation>Benutzernamen in die Zwischenablage kopieren</translation> + <translation>Benutzername in die Zwischenablage kopieren</translation> </message> <message> <source>Cop&y password</source> @@ -3008,7 +3012,7 @@ Diese Version ist nicht für den Produktiveinsatz gedacht.</translation> </message> <message> <source>Sort matching entries by &username</source> - <translation>Sortiere gefundene Einträge nach &Benutzernamen</translation> + <translation>Sortiere gefundene Einträge nach &Benutzername</translation> </message> <message> <source>Sort &matching entries by title</source> @@ -3293,11 +3297,11 @@ Es wird der Standard-Port 19455 verwendet.</translation> </message> <message> <source>Username for the entry.</source> - <translation>Benutzername für den Eintrag</translation> + <translation>Nutzername für den Eintrag</translation> </message> <message> <source>username</source> - <translation>Benutzername</translation> + <translation>Nutzername</translation> </message> <message> <source>URL for the entry.</source> diff --git a/share/translations/keepassx_el.ts b/share/translations/keepassx_el.ts index 13bc946ea..426ed4306 100644 --- a/share/translations/keepassx_el.ts +++ b/share/translations/keepassx_el.ts @@ -372,6 +372,10 @@ Please select whether you want to allow access.</source> <source>Select custom proxy location</source> <translation type="unfinished"/> </message> + <message> + <source>We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>BrowserService</name> @@ -529,7 +533,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Different passwords supplied.</source> - <translation>Παρέχονται διαφορετικοί κωδικοί.</translation> + <translation>Έχετε εισάγει διαφορετικούς κωδικούς.</translation> </message> <message> <source>Failed to set %1 as the Key file: @@ -717,11 +721,11 @@ Please consider generating a new key file.</source> </message> <message> <source>Unable to open the database.</source> - <translation>Δεν είναι δυνατό να ανοίξει τη βάση δεδομένων.</translation> + <translation>Αδύνατο να ανοιχτεί η βάση δεδομένων.</translation> </message> <message> <source>Can't open key file</source> - <translation>Δεν είναι δυνατό να ανοίξει αρχείο κλειδιού</translation> + <translation>Αποτυχία ανοίγματος αρχείο κλειδιού</translation> </message> <message> <source>Legacy key file format</source> @@ -740,7 +744,7 @@ Please consider generating a new key file.</source> </message> <message> <source>All files</source> - <translation>Όλα τα αρχεία</translation> + <translation>Όλα τα αρχεία </translation> </message> <message> <source>Key files</source> @@ -945,7 +949,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Open database</source> - <translation>Άνοιγμα Βάσης Δεδομένων</translation> + <translation>Άνοιγμα βάσης δεδομένων</translation> </message> <message> <source>File not found!</source> @@ -1013,7 +1017,7 @@ Save changes?</source> </message> <message> <source>Save database as</source> - <translation>Αποθήκευση βάσης δεδομένων ως</translation> + <translation>Αποθήκευση βάσης δεδομένων σαν</translation> </message> <message> <source>Export database to CSV file</source> @@ -1025,7 +1029,7 @@ Save changes?</source> </message> <message> <source>New database</source> - <translation>Νέα Βάση Δεδομένων</translation> + <translation>Νέα βάση δεδομένων</translation> </message> <message> <source>locked</source> @@ -1170,10 +1174,6 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>Είστε σίγουροι ότι θέλετε να διαγράψετε μόνιμα τα πάντα από το κάδο ανακύκλωσής σας;</translation> </message> - <message> - <source>Entry updated successfully.</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DetailsWidget</name> @@ -1601,7 +1601,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Edit group</source> - <translation>Επεξεργασία Ομάδας</translation> + <translation>Επεξεργασία ομάδας</translation> </message> <message> <source>Enable</source> @@ -1949,6 +1949,10 @@ This may cause the affected plugins to malfunction.</source> <source>Reset to defaults</source> <translation type="unfinished"/> </message> + <message> + <source>Attachments (icon)</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Group</name> @@ -2394,7 +2398,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Unable to open the database.</source> - <translation>Δεν είναι δυνατό να ανοίξει τη βάση δεδομένων.</translation> + <translation>Αποτυχία ανοίγματος βάσης δεδομένων.</translation> </message> </context> <context> @@ -2405,7 +2409,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Not a KeePass database.</source> - <translation>Δεν είναι βάση δεδομένων KeePass.</translation> + <translation>Δεν ειναι βάση δεδομένων KeePass.</translation> </message> <message> <source>Unsupported encryption algorithm.</source> diff --git a/share/translations/keepassx_en.ts b/share/translations/keepassx_en.ts index df3ca8e6f..74d4c5325 100644 --- a/share/translations/keepassx_en.ts +++ b/share/translations/keepassx_en.ts @@ -369,6 +369,10 @@ Please select whether you want to allow access.</source> <source>Select custom proxy location</source> <translation type="unfinished"></translation> </message> + <message> + <source>We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>BrowserService</name> @@ -1186,10 +1190,6 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation type="unfinished"></translation> </message> - <message> - <source>Entry updated successfully.</source> - <translation type="unfinished"></translation> - </message> </context> <context> <name>DetailsWidget</name> @@ -1974,6 +1974,10 @@ This may cause the affected plugins to malfunction.</source> <source>Reset to defaults</source> <translation type="unfinished"></translation> </message> + <message> + <source>Attachments (icon)</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>Group</name> diff --git a/share/translations/keepassx_en_US.ts b/share/translations/keepassx_en_US.ts index dabdb9c02..fadc52902 100644 --- a/share/translations/keepassx_en_US.ts +++ b/share/translations/keepassx_en_US.ts @@ -373,6 +373,10 @@ Please select whether you want to allow access.</translation> <source>Select custom proxy location</source> <translation>Select custom proxy location</translation> </message> + <message> + <source>We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</source> + <translation>We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</translation> + </message> </context> <context> <name>BrowserService</name> @@ -1119,7 +1123,7 @@ Disable safe saves and try again?</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>Do you really want to move %n entry to the recycle bin?</numerusform><numerusform>Do you really want to move %n entries to the recycle bin?</numerusform></translation> + <translation><numerusform>Do you really want to move %n entry(s) to the recycle bin?</numerusform><numerusform>Do you really want to move %n entry(s) to the recycle bin?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1191,10 +1195,6 @@ Do you want to merge your changes?</translation> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>Are you sure you want to permanently delete everything from your recycle bin?</translation> </message> - <message> - <source>Entry updated successfully.</source> - <translation>Entry updated successfully.</translation> - </message> </context> <context> <name>DetailsWidget</name> @@ -1371,11 +1371,11 @@ Do you want to merge your changes?</translation> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation><numerusform>%n week</numerusform><numerusform>%n weeks</numerusform></translation> + <translation><numerusform>%n week(s)</numerusform><numerusform>%n week(s)</numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation><numerusform>%n month</numerusform><numerusform>%n months</numerusform></translation> + <translation><numerusform>%n month(s)</numerusform><numerusform>%n month(s)</numerusform></translation> </message> <message> <source>1 year</source> @@ -1743,7 +1743,7 @@ Do you want to merge your changes?</translation> </message> <message> <source>Uuid:</source> - <translation>UUID:</translation> + <translation>Uuid:</translation> </message> <message> <source>Plugin Data</source> @@ -1819,7 +1819,7 @@ This may cause the affected plugins to malfunction.</translation> </message> <message numerus="yes"> <source>Are you sure you want to remove %n attachment(s)?</source> - <translation><numerusform>Are you sure you want to remove %n attachment?</numerusform><numerusform>Are you sure you want to remove %n attachments?</numerusform></translation> + <translation><numerusform>Are you sure you want to remove %n attachments?</numerusform><numerusform>Are you sure you want to remove %n attachments?</numerusform></translation> </message> <message> <source>Confirm Remove</source> @@ -1976,6 +1976,10 @@ This may cause the affected plugins to malfunction.</translation> <source>Reset to defaults</source> <translation>Reset to defaults</translation> </message> + <message> + <source>Attachments (icon)</source> + <translation>Attachments (icon)</translation> + </message> </context> <context> <name>Group</name> @@ -3715,7 +3719,7 @@ Please unlock the selected database or choose another one which is unlocked.</tr </message> <message numerus="yes"> <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> - <translation><numerusform>Successfully removed %n encryption key from KeePassXC/HTTP Settings.</numerusform><numerusform>Successfully removed %n encryption keys from KeePassXC/HTTP Settings.</numerusform></translation> + <translation><numerusform>Successfully removed %n encryption key from KeePassHTTP Settings.</numerusform><numerusform>Successfully removed %n encryption keys from KeePassHTTP Settings.</numerusform></translation> </message> <message> <source>KeePassXC: No keys found</source> diff --git a/share/translations/keepassx_es.ts b/share/translations/keepassx_es.ts index a94469536..562224575 100644 --- a/share/translations/keepassx_es.ts +++ b/share/translations/keepassx_es.ts @@ -27,7 +27,7 @@ </message> <message> <source>Debug Info</source> - <translation>Información de depuración</translation> + <translation>Información de Depuración</translation> </message> <message> <source>Include the following information whenever you report a bug:</source> @@ -73,12 +73,13 @@ Núcleo: %3 %4</translation> </message> <message> <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> - <translation type="unfinished"/> + <translation>Un agradecimiento especial del equipo de KeePassXC a debfx por crear el KeePassX original.</translation> </message> <message> <source>Build Type: %1 </source> - <translation type="unfinished"/> + <translation>Tipo de compilación: %1 +</translation> </message> </context> <context> @@ -372,6 +373,10 @@ Por favor seleccione si desea autorizar su acceso.</translation> <source>Select custom proxy location</source> <translation>Elegir una ubicación de proxy personalizada</translation> </message> + <message> + <source>We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>BrowserService</name> @@ -460,7 +465,7 @@ Por favor desbloquee la base de datos seleccionada o elija otra que esté desblo </message> <message numerus="yes"> <source>Successfully removed permissions from %n entry(s).</source> - <translation><numerusform>Los permisos fueron eliminados exitosamente de %n entradas</numerusform><numerusform>Los permisos fueron eliminados exitosamente de %n entradas</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -491,7 +496,7 @@ Por favor desbloquee la base de datos seleccionada o elija otra que esté desblo </message> <message> <source>Browse</source> - <translation>Navegar</translation> + <translation>Abrir archivo</translation> </message> <message> <source>Create</source> @@ -621,7 +626,7 @@ Considere generar un nuevo archivo llave.</translation> </message> <message> <source>Number of headers line to discard</source> - <translation>Cantidad de líneas a descartar de la cabecera</translation> + <translation>Cantidad de líneas a descartar del encabezado</translation> </message> <message> <source>Consider '\' an escape character</source> @@ -689,15 +694,15 @@ Considere generar un nuevo archivo llave.</translation> <name>CsvParserModel</name> <message numerus="yes"> <source>%n byte(s), </source> - <translation><numerusform>%n byte(s), </numerusform><numerusform>%n byte(s), </numerusform></translation> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> <message numerus="yes"> <source>%n row(s), </source> - <translation><numerusform>%n fila(s), </numerusform><numerusform>%n fila(s), </numerusform></translation> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> <message numerus="yes"> <source>%n column(s)</source> - <translation><numerusform>%n columna(s)</numerusform><numerusform>%n columna(s) </numerusform></translation> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> </context> <context> @@ -728,7 +733,7 @@ Considere generar un nuevo archivo llave.</translation> </message> <message> <source>Unable to open the database.</source> - <translation>No se pudo abrir la base de datos.</translation> + <translation>Incapaz de abrir la base de datos.</translation> </message> <message> <source>Can't open key file</source> @@ -769,7 +774,7 @@ Considere generar un nuevo archivo llave.</translation> <name>DatabaseRepairWidget</name> <message> <source>Repair database</source> - <translation>Reparar la base de datos</translation> + <translation>Reparar base de datos</translation> </message> <message> <source>Error</source> @@ -862,7 +867,7 @@ Si conserva este número, ¡su base de datos puede ser muy fácil de descifrar!< <message numerus="yes"> <source> thread(s)</source> <comment>Threads for parallel execution (KDF settings)</comment> - <translation><numerusform>hilo(s)</numerusform><numerusform>hilo(s)</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> </context> <context> @@ -944,7 +949,7 @@ Si conserva este número, ¡su base de datos puede ser muy fácil de descifrar!< </message> <message> <source>Enable &compression (recommended)</source> - <translation type="unfinished"/> + <translation>Habilitar &compresión (recomendado)</translation> </message> </context> <context> @@ -956,7 +961,7 @@ Si conserva este número, ¡su base de datos puede ser muy fácil de descifrar!< </message> <message> <source>KeePass 2 Database</source> - <translation>Base de datos de KeePass 2</translation> + <translation>Base de datos KeePass 2</translation> </message> <message> <source>All files</source> @@ -1024,7 +1029,7 @@ Save changes?</source> </message> <message> <source>Writing the database failed.</source> - <translation>Fallo al escribir la base de datos.</translation> + <translation>La escritura de la base de datos falló.</translation> </message> <message> <source>Passwords</source> @@ -1070,12 +1075,13 @@ De lo contrario se perderán los cambios.</translation> </message> <message> <source>Disable safe saves?</source> - <translation type="unfinished"/> + <translation>¿Inhabilitar guardado seguro?</translation> </message> <message> <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. Disable safe saves and try again?</source> - <translation type="unfinished"/> + <translation>KeePassXC no ha podido guardar varias veces la base de datos. Es probable que esto se deba a que los servicios de sincronización de archivos mantienen un bloqueo en el archivo guardado. +¿Deshabilite las copias seguras y vuelva a intentarlo?</translation> </message> </context> <context> @@ -1118,7 +1124,7 @@ Disable safe saves and try again?</source> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>¿Realmente quiere mover la entrada "%1" a la papelera de reciclaje?</numerusform><numerusform>¿Realmente quiere mover las entradas "%1" a la papelera de reciclaje?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1142,7 +1148,7 @@ Disable safe saves and try again?</source> </message> <message> <source>Unable to calculate master key</source> - <translation>No se puede calcular la clave maestra</translation> + <translation>No se puede calcular la llave maestra</translation> </message> <message> <source>No current database.</source> @@ -1189,10 +1195,6 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>¿Está seguro que quiere eliminar permanentemente todo de su papelera de reciclaje?</translation> </message> - <message> - <source>Entry updated successfully.</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DetailsWidget</name> @@ -1369,11 +1371,11 @@ Do you want to merge your changes?</source> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n semana</numerusform><numerusform>%n semana(s)</numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n mes</numerusform><numerusform>%n mes(es)</numerusform></translation> </message> <message> <source>1 year</source> @@ -1381,15 +1383,15 @@ Do you want to merge your changes?</source> </message> <message> <source>Apply generated password?</source> - <translation type="unfinished"/> + <translation>¿Aplicar la contraseña generada?</translation> </message> <message> <source>Do you want to apply the generated password to this entry?</source> - <translation type="unfinished"/> + <translation>¿Desea aplicar la contraseña generada a esta entrada?</translation> </message> <message> <source>Entry updated successfully.</source> - <translation type="unfinished"/> + <translation>Entrada actualizada con éxito.</translation> </message> </context> <context> @@ -1424,11 +1426,11 @@ Do you want to merge your changes?</source> </message> <message> <source>Foreground Color:</source> - <translation type="unfinished"/> + <translation>Color de Primer Plano:</translation> </message> <message> <source>Background Color:</source> - <translation type="unfinished"/> + <translation>Color de Segundo Plano:</translation> </message> </context> <context> @@ -1463,7 +1465,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Use a specific sequence for this association:</source> - <translation type="unfinished"/> + <translation>Usa una secuencia específica para esta asociación:</translation> </message> </context> <context> @@ -1532,7 +1534,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Remove key from agent after</source> - <translation type="unfinished"/> + <translation>Eliminar después la clave del agente </translation> </message> <message> <source> seconds</source> @@ -1880,7 +1882,7 @@ This may cause the affected plugins to malfunction.</source> </message> <message> <source>Username</source> - <translation>Nombre de usuario:</translation> + <translation>Nombre de usuario</translation> </message> <message> <source>URL</source> @@ -1969,6 +1971,10 @@ This may cause the affected plugins to malfunction.</source> <source>Reset to defaults</source> <translation type="unfinished"/> </message> + <message> + <source>Attachments (icon)</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Group</name> @@ -2417,7 +2423,7 @@ Esta migración es en único sentido. No podrá abrir la base de datos importada </message> <message> <source>Unable to open the database.</source> - <translation>No se pudo abrir la base de datos.</translation> + <translation>Incapaz de abrir la base de datos.</translation> </message> </context> <context> @@ -3122,7 +3128,7 @@ Usando el puerto por defecto 19455</translation> </message> <message> <source>Special Characters</source> - <translation>Caracteres especiales</translation> + <translation>Caracteres especiales:</translation> </message> <message> <source>Extended ASCII</source> diff --git a/share/translations/keepassx_fi.ts b/share/translations/keepassx_fi.ts index 5a3a13e93..033cc6ea0 100644 --- a/share/translations/keepassx_fi.ts +++ b/share/translations/keepassx_fi.ts @@ -61,7 +61,7 @@ CPU architecture: %2 Kernel: %3 %4</source> <translation>Käyttöjärjestelmä: %1 Suoritinarkkitehtuuri: %2 -Ydin: %3 %4</translation> +Kernel: %3 %4</translation> </message> <message> <source>Enabled extensions:</source> @@ -102,8 +102,8 @@ Ydin: %3 %4</translation> <message> <source>%1 has requested access to passwords for the following item(s). Please select whether you want to allow access.</source> - <translation>%1 pyytää pääsyä seuraavien kohteiden salasanoihin. -Valitse sallitaanko pääsy.</translation> + <translation>%1 pyytää pääsyä seuraavien tietueiden salasanoihin. +Ole hyvä ja valitse sallitaanko pääsy.</translation> </message> </context> <context> @@ -117,7 +117,7 @@ Valitse sallitaanko pääsy.</translation> <name>AutoType</name> <message> <source>Couldn't find an entry that matches the window title:</source> - <translation>Ikkunan nimeä vastaavaa tietuetta ei löytynyt:</translation> + <translation>Ikkunan nimeä vastaavaa merkintää ei löytynyt:</translation> </message> <message> <source>Auto-Type - KeePassXC</source> @@ -182,11 +182,11 @@ Valitse sallitaanko pääsy.</translation> <name>AutoTypeSelectDialog</name> <message> <source>Auto-Type - KeePassXC</source> - <translation>Automaattisyöttö - KeePassXC</translation> + <translation>Automaattitäydennys - KeePassXC</translation> </message> <message> <source>Select entry to Auto-Type:</source> - <translation>Valitse tietue automaattisyöttöä varten:</translation> + <translation>Valitse merkintä automaattitäydennystä varten:</translation> </message> </context> <context> @@ -210,7 +210,7 @@ Valitse sallitaanko pääsy.</translation> <message> <source>%1 has requested access to passwords for the following item(s). Please select whether you want to allow access.</source> - <translation>%1 pyytää pääsyä seuraavien kohteiden salasanoihin. + <translation>%1 pyytää pääsyä seuraavien tietueiden salasanoihin. Ole hyvä ja valitse sallitaanko pääsy.</translation> </message> </context> @@ -372,6 +372,10 @@ Ole hyvä ja valitse sallitaanko pääsy.</translation> <source>Select custom proxy location</source> <translation>Valitse mukautettu välitysohjelma</translation> </message> + <message> + <source>We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>BrowserService</name> @@ -485,7 +489,7 @@ Avaa valittu tietokanta tai valitse toinen avattu tietokanta.</translation> </message> <message> <source>&Key file</source> - <translation>&Avaintiedosto</translation> + <translation>Avaintiedosto</translation> </message> <message> <source>Browse</source> @@ -517,7 +521,7 @@ Avaa valittu tietokanta tai valitse toinen avattu tietokanta.</translation> </message> <message> <source>Unable to create Key File : </source> - <translation>Avaintiedoston luonti ei onnistunut: </translation> + <translation>Avaintiedoston luonti ei onnistunut:</translation> </message> <message> <source>Select a key file</source> @@ -564,7 +568,7 @@ Ole hyvä ja harkitse uuden avaintiedoston luomista.</translation> <name>CloneDialog</name> <message> <source>Clone Options</source> - <translation>Kloonausasetukset</translation> + <translation>Kopiointiasetukset</translation> </message> <message> <source>Append ' - Clone' to title</source> @@ -639,11 +643,11 @@ Ole hyvä ja harkitse uuden avaintiedoston luomista.</translation> </message> <message> <source>Empty fieldname </source> - <translation>Tyhjä kenttänimi </translation> + <translation>Tyhjä kenttänimi</translation> </message> <message> <source>column </source> - <translation>sarake </translation> + <translation>sarake</translation> </message> <message> <source>Imported from CSV file</source> @@ -651,7 +655,7 @@ Ole hyvä ja harkitse uuden avaintiedoston luomista.</translation> </message> <message> <source>Original data: </source> - <translation>Alkuperäiset tiedot: </translation> + <translation>Alkuperäiset tiedot:</translation> </message> <message> <source>Error(s) detected in CSV file !</source> @@ -659,7 +663,7 @@ Ole hyvä ja harkitse uuden avaintiedoston luomista.</translation> </message> <message> <source> more messages skipped]</source> - <translation> viestiä lisää ohitettu]</translation> + <translation>viestiä lisää ohitettu]</translation> </message> <message> <source>Error</source> @@ -687,15 +691,15 @@ Ole hyvä ja harkitse uuden avaintiedoston luomista.</translation> <name>CsvParserModel</name> <message numerus="yes"> <source>%n byte(s), </source> - <translation><numerusform>%n tavu.</numerusform><numerusform>%n tavua, </numerusform></translation> + <translation><numerusform>%n tavua,</numerusform><numerusform>%n tavua,</numerusform></translation> </message> <message numerus="yes"> <source>%n row(s), </source> - <translation><numerusform>%n rivi.</numerusform><numerusform>%n riviä, </numerusform></translation> + <translation><numerusform>%n riviä,</numerusform><numerusform>%n riviä,</numerusform></translation> </message> <message numerus="yes"> <source>%n column(s)</source> - <translation><numerusform>%n sarake.</numerusform><numerusform>%n saraketta</numerusform></translation> + <translation><numerusform>%n saraketta</numerusform><numerusform>%n saraketta</numerusform></translation> </message> </context> <context> @@ -710,7 +714,7 @@ Ole hyvä ja harkitse uuden avaintiedoston luomista.</translation> </message> <message> <source>Password:</source> - <translation>Salasana:</translation> + <translation>Salasana</translation> </message> <message> <source>Browse</source> @@ -726,11 +730,11 @@ Ole hyvä ja harkitse uuden avaintiedoston luomista.</translation> </message> <message> <source>Unable to open the database.</source> - <translation>Tietokannan avaaminen epäonnistui.</translation> + <translation>Tietokannan avaaminen ei onnistunut.</translation> </message> <message> <source>Can't open key file</source> - <translation>Avaintiedoston avaaminen epäonnistui</translation> + <translation>Avaintiedostoa ei voitu avata</translation> </message> <message> <source>Legacy key file format</source> @@ -787,7 +791,7 @@ Ole hyvä ja harkitse uuden avaintiedoston luomista.</translation> </message> <message> <source>Success</source> - <translation>Onnistui</translation> + <translation>Onnistui!</translation> </message> <message> <source>The database has been successfully repaired @@ -855,12 +859,12 @@ Jos pidät tämän arvon, tietokanta voi olla liian helppo murtaa!</translation> <message numerus="yes"> <source> MiB</source> <comment>Abbreviation for Mebibytes (KDF settings)</comment> - <translation><numerusform>MiB</numerusform><numerusform> Mt</numerusform></translation> + <translation><numerusform> Mt</numerusform><numerusform> Mt</numerusform></translation> </message> <message numerus="yes"> <source> thread(s)</source> <comment>Threads for parallel execution (KDF settings)</comment> - <translation><numerusform>säie</numerusform><numerusform> säie(ttä)</numerusform></translation> + <translation><numerusform> säie(ttä)</numerusform><numerusform> säie(ttä)</numerusform></translation> </message> </context> <context> @@ -922,7 +926,7 @@ Jos pidät tämän arvon, tietokanta voi olla liian helppo murtaa!</translation> </message> <message> <source>Max. history items:</source> - <translation>Maks. historia-kohteiden lukumäärä:</translation> + <translation>Maks. historiamerkintöjen lukumäärä:</translation> </message> <message> <source>Max. history size:</source> @@ -970,7 +974,7 @@ Jos pidät tämän arvon, tietokanta voi olla liian helppo murtaa!</translation> </message> <message> <source>Unable to open the database.</source> - <translation>Tietokannan avaaminen epäonnistui.</translation> + <translation>Tietokannan avaaminen ei onnistunut.</translation> </message> <message> <source>File opened in read only mode.</source> @@ -1017,7 +1021,7 @@ Hylkää muutokset ja sulje?</translation> <message> <source>"%1" was modified. Save changes?</source> - <translation>Tietuetta "%1" muokattiin. + <translation>Kohdetta "%1" muokattiin. Tallennetaanko muutokset?</translation> </message> <message> @@ -1046,7 +1050,7 @@ Tallennetaanko muutokset?</translation> </message> <message> <source>locked</source> - <translation>lukittu</translation> + <translation>Lukittu</translation> </message> <message> <source>Lock database</source> @@ -1093,7 +1097,7 @@ Ota turvallinen tallennus pois käytöstä ja yritä uudelleen?</translation> </message> <message> <source>Do you really want to delete the entry "%1" for good?</source> - <translation>Haluatko varmasti poistaa tietueen "%1", lopullisesti?</translation> + <translation>Haluatko varmasti poistaa tietueen "%1" lopullisesti?</translation> </message> <message> <source>Delete entries?</source> @@ -1117,7 +1121,7 @@ Ota turvallinen tallennus pois käytöstä ja yritä uudelleen?</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>Haluatko varmasti siirtää %n tietueen roskakoriin?</numerusform><numerusform>Haluatko varmasti siirtää %n tietuetta roskakoriin?</numerusform></translation> + <translation><numerusform>Haluatko varmasti siirtää %n kappaletta alkioita roskakoriin?</numerusform><numerusform>Haluatko varmasti siirtää %n tietuetta roskakoriin?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1137,7 +1141,7 @@ Ota turvallinen tallennus pois käytöstä ja yritä uudelleen?</translation> </message> <message> <source>Do you really want to delete the group "%1" for good?</source> - <translation>Haluatko varmasti poistaa ryhmän "%1", lopullisesti?</translation> + <translation>Haluatko varmasti poistaa ryhmän "%1" lopullisesti?</translation> </message> <message> <source>Unable to calculate master key</source> @@ -1189,16 +1193,12 @@ Haluatko yhdistää muutoksesi?</translation> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>Haluatko varmasti tyhjentää kaiken pysyvästi roskakorista?</translation> </message> - <message> - <source>Entry updated successfully.</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DetailsWidget</name> <message> <source>Generate TOTP Token</source> - <translation>Luo ajastetun kertakäyttöisen salasanan (TOTP) tunniste</translation> + <translation>Luo aikapohjaisen salasanan (TOTP) tunniste</translation> </message> <message> <source>Close</source> @@ -1226,11 +1226,11 @@ Haluatko yhdistää muutoksesi?</translation> </message> <message> <source>Autotype</source> - <translation>Automaattisyöttö</translation> + <translation>Automaattitäydennys</translation> </message> <message> <source>Searching</source> - <translation>Hakeminen</translation> + <translation>Etsitään</translation> </message> <message> <source>Attributes</source> @@ -1293,7 +1293,7 @@ Haluatko yhdistää muutoksesi?</translation> </message> <message> <source>Auto-Type</source> - <translation>Automaattisyöttö</translation> + <translation>Automaattitäydennys</translation> </message> <message> <source>Properties</source> @@ -1369,11 +1369,11 @@ Haluatko yhdistää muutoksesi?</translation> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation><numerusform>%n viikko</numerusform><numerusform>%n viikkoa</numerusform></translation> + <translation><numerusform>%n viikkoa</numerusform><numerusform>%n viikkoa</numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation><numerusform>%n kuukausi</numerusform><numerusform>%n kuukautta</numerusform></translation> + <translation><numerusform>%n kuukautta</numerusform><numerusform>%n kuukautta</numerusform></translation> </message> <message> <source>1 year</source> @@ -1381,15 +1381,15 @@ Haluatko yhdistää muutoksesi?</translation> </message> <message> <source>Apply generated password?</source> - <translation type="unfinished"/> + <translation>Käytä luotua salasanaa?</translation> </message> <message> <source>Do you want to apply the generated password to this entry?</source> - <translation type="unfinished"/> + <translation>Haluatko ottaa käyttöön luodun salasanan tälle tietueelle?</translation> </message> <message> <source>Entry updated successfully.</source> - <translation type="unfinished"/> + <translation>Tietue päivitetty onnistuneesti.</translation> </message> </context> <context> @@ -1424,30 +1424,30 @@ Haluatko yhdistää muutoksesi?</translation> </message> <message> <source>Foreground Color:</source> - <translation type="unfinished"/> + <translation>Korostusväri:</translation> </message> <message> <source>Background Color:</source> - <translation type="unfinished"/> + <translation>Taustaväri:</translation> </message> </context> <context> <name>EditEntryWidgetAutoType</name> <message> <source>Enable Auto-Type for this entry</source> - <translation>Salli automaattisyöttö tälle tietueelle</translation> + <translation>Salli automaattitäydennys tälle merkinnälle</translation> </message> <message> <source>Inherit default Auto-Type sequence from the &group</source> - <translation>Peri automaattisyötön oletussekvenssi &ryhmältä</translation> + <translation>Peri automaattitäydennyksen oletussekvenssi &ryhmältä</translation> </message> <message> <source>&Use custom Auto-Type sequence:</source> - <translation>&Käytä mukautettua automaattisyötön sekvenssiä:</translation> + <translation>&Käytä mukautettua automaattitäydennyksen sekvenssiä:</translation> </message> <message> <source>Window Associations</source> - <translation>Ikkunoiden liitokset</translation> + <translation>Ikkunoiden yhteysasetukset</translation> </message> <message> <source>+</source> @@ -1509,11 +1509,11 @@ Haluatko yhdistää muutoksesi?</translation> </message> <message> <source>Presets</source> - <translation>Esiasetukset</translation> + <translation>Esiasetus</translation> </message> <message> <source>Toggle the checkbox to reveal the notes section.</source> - <translation>Ruksi valintaruutu näyttääksesi muistiinpano-osio.</translation> + <translation>Ruksi valintaruutu näyttääksesi huomautusosio.</translation> </message> <message> <source>Username:</source> @@ -1532,11 +1532,11 @@ Haluatko yhdistää muutoksesi?</translation> </message> <message> <source>Remove key from agent after</source> - <translation>Poista avain agentista kun on kulunut</translation> + <translation>Poista avain agentilta viiveellä</translation> </message> <message> <source> seconds</source> - <translation> sekuntia</translation> + <translation>s</translation> </message> <message> <source>Fingerprint</source> @@ -1544,7 +1544,7 @@ Haluatko yhdistää muutoksesi?</translation> </message> <message> <source>Remove key from agent when database is closed/locked</source> - <translation>Poista avain agentista kun tietokanta suljetaan/lukitaan</translation> + <translation>Poista avain agentista kun tietokanta on suljettu/lukittu</translation> </message> <message> <source>Public key</source> @@ -1552,7 +1552,7 @@ Haluatko yhdistää muutoksesi?</translation> </message> <message> <source>Add key to agent when database is opened/unlocked</source> - <translation>Lisää avain agenttiin kun tietokanta avataan/lukitaan</translation> + <translation>Lisää avain agenttiin kun tietokanta on avattu/lukitus avattu</translation> </message> <message> <source>Comment</source> @@ -1655,15 +1655,15 @@ Haluatko yhdistää muutoksesi?</translation> </message> <message> <source>Auto-Type</source> - <translation>Automaattisyöttö</translation> + <translation>Automaattitäydennys</translation> </message> <message> <source>&Use default Auto-Type sequence of parent group</source> - <translation>&Peri automaattisyötön sekvenssi emoryhmältä</translation> + <translation>&Peri auromaattitäydennyksen sekvenssi isäntäryhmältä</translation> </message> <message> <source>Set default Auto-Type se&quence</source> - <translation>Aseta automaattisyötön &oletussekvenssi</translation> + <translation>Aseta automaattitäydennyksen &oletussekvenssi</translation> </message> </context> <context> @@ -1745,7 +1745,7 @@ Haluatko yhdistää muutoksesi?</translation> </message> <message> <source>Plugin Data</source> - <translation type="unfinished"/> + <translation>Liitännäistiedot</translation> </message> <message> <source>Remove</source> @@ -1753,20 +1753,21 @@ Haluatko yhdistää muutoksesi?</translation> </message> <message> <source>Delete plugin data?</source> - <translation type="unfinished"/> + <translation>Poista liitännäistiedot?</translation> </message> <message> <source>Do you really want to delete the selected plugin data? This may cause the affected plugins to malfunction.</source> - <translation type="unfinished"/> + <translation>Haluatko varmasti poistaa valitun liitännäistiedon? +Tämä voi vikaannuttaa tietoa käyttävän liitännäisen.</translation> </message> <message> <source>Key</source> - <translation type="unfinished"/> + <translation>Avain</translation> </message> <message> <source>Value</source> - <translation type="unfinished"/> + <translation>Arvo</translation> </message> </context> <context> @@ -1816,7 +1817,7 @@ This may cause the affected plugins to malfunction.</source> </message> <message numerus="yes"> <source>Are you sure you want to remove %n attachment(s)?</source> - <translation><numerusform>Haluatko varmasti poistaa &n liitettä?</numerusform><numerusform>Haluatko varmasti poistaa &n liitettä?</numerusform></translation> + <translation><numerusform>Haluatko varmasti poistaa %n liitettä?</numerusform><numerusform>Haluatko varmasti poistaa %n liitettä?</numerusform></translation> </message> <message> <source>Confirm Remove</source> @@ -1896,7 +1897,7 @@ This may cause the affected plugins to malfunction.</source> <message> <source>Ref: </source> <comment>Reference abbreviation</comment> - <translation>Viittaus: </translation> + <translation>Viittaus:</translation> </message> <message> <source>Group</source> @@ -1973,6 +1974,10 @@ This may cause the affected plugins to malfunction.</source> <source>Reset to defaults</source> <translation>Palauta oletusasetukset</translation> </message> + <message> + <source>Attachments (icon)</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Group</name> @@ -2421,7 +2426,7 @@ Tämä muunnos toimii yhdensuuntaisesti. Et välttämättä saa enää tietokant </message> <message> <source>Unable to open the database.</source> - <translation>Tietokannan avaaminen epäonnistui.</translation> + <translation>Tietokannan avaaminen ei onnistunut.</translation> </message> </context> <context> @@ -2607,7 +2612,7 @@ Tämä muunnos toimii yhdensuuntaisesti. Et välttämättä saa enää tietokant </message> <message> <source>&Recent databases</source> - <translation>Viimeisimmät tietokannat</translation> + <translation>&Viimeisimmät tietokannat</translation> </message> <message> <source>Import</source> @@ -2631,7 +2636,7 @@ Tämä muunnos toimii yhdensuuntaisesti. Et välttämättä saa enää tietokant </message> <message> <source>&Groups</source> - <translation>Ryhmät</translation> + <translation>&Ryhmät</translation> </message> <message> <source>&Tools</source> @@ -2639,7 +2644,7 @@ Tämä muunnos toimii yhdensuuntaisesti. Et välttämättä saa enää tietokant </message> <message> <source>&Quit</source> - <translation>&Lopeta</translation> + <translation>L&opeta</translation> </message> <message> <source>&About</source> @@ -2663,11 +2668,11 @@ Tämä muunnos toimii yhdensuuntaisesti. Et välttämättä saa enää tietokant </message> <message> <source>Merge from KeePassX database</source> - <translation>Yhdistä KeePassXC-tietokannasta</translation> + <translation>Yhdistä KeePassX-tietokannasta</translation> </message> <message> <source>&Add new entry</source> - <translation>Lisää &tietue</translation> + <translation>&Lisää tietue</translation> </message> <message> <source>&View/Edit entry</source> @@ -2699,7 +2704,7 @@ Tämä muunnos toimii yhdensuuntaisesti. Et välttämättä saa enää tietokant </message> <message> <source>&Database settings</source> - <translation>Tietokannan &asetukset</translation> + <translation>Tietok&annan asetukset</translation> </message> <message> <source>Database settings</source> @@ -2715,7 +2720,7 @@ Tämä muunnos toimii yhdensuuntaisesti. Et välttämättä saa enää tietokant </message> <message> <source>Copy &username</source> - <translation>Kopioi käyttäjä&tunnus</translation> + <translation>Kopioi &käyttäjätunnus</translation> </message> <message> <source>Copy username to clipboard</source> @@ -2739,11 +2744,11 @@ Tämä muunnos toimii yhdensuuntaisesti. Et välttämättä saa enää tietokant </message> <message> <source>&Perform Auto-Type</source> - <translation>Suorita automaattisyöttö</translation> + <translation>S&uorita automaattitäydennys</translation> </message> <message> <source>&Open URL</source> - <translation>Avaa &URL</translation> + <translation>&Avaa URL</translation> </message> <message> <source>&Lock databases</source> @@ -2771,7 +2776,7 @@ Tämä muunnos toimii yhdensuuntaisesti. Et välttämättä saa enää tietokant </message> <message> <source>Copy notes to clipboard</source> - <translation>Kopioi muistiinpanot leikepöydälle</translation> + <translation>Kopioi huomautukset leikepöydälle</translation> </message> <message> <source>&Export to CSV file...</source> @@ -2835,7 +2840,7 @@ Tämä muunnos toimii yhdensuuntaisesti. Et välttämättä saa enää tietokant </message> <message> <source>KeePass 2 Database</source> - <translation>KeePass 2 -tietokanta</translation> + <translation>Keepass 2 -tietokanta</translation> </message> <message> <source>All files</source> @@ -2890,7 +2895,7 @@ Tätä versiota ei ole tarkoitettu päivittäiseen käyttöön.</translation> </message> <message> <source>Found zero keys</source> - <translation>Löytyi nolla avainta</translation> + <translation>Yhtään avainta ei löytynyt</translation> </message> <message> <source>Failed to read public key.</source> @@ -2902,23 +2907,23 @@ Tätä versiota ei ole tarkoitettu päivittäiseen käyttöön.</translation> </message> <message> <source>No private key payload to decrypt</source> - <translation>Salauksen purku epäonnistui: yksityisen avaimen sisältö on tyhjä</translation> + <translation>Salauksen purku epäonnistui: salainen avain ei sisällä dataa </translation> </message> <message> <source>Trying to run KDF without cipher</source> - <translation>Yritetään tehdä avainmuunnosfunktiota ilman salausta</translation> + <translation>Yritetään tehdä avainderivaatiofunktiota ilman salausta</translation> </message> <message> <source>Passphrase is required to decrypt this key</source> - <translation>Avaimen purkuun vaaditaan salalause</translation> + <translation>Avaimen purkuun vaaditaan tunnuslause</translation> </message> <message> <source>Key derivation failed, key file corrupted?</source> - <translation>Avaimen muuntaminen epäonnistui. Onko avaintiedosto korruptoitunut?</translation> + <translation>Avaimen derivointi epäonnistui. Onko avaintiedosto korruptoitunut?</translation> </message> <message> <source>Decryption failed, wrong passphrase?</source> - <translation>Salauksen purku epäonnistui, väärä salalause?</translation> + <translation>Salauksen purku epäonnistui, väärä tunnuslause?</translation> </message> <message> <source>Unexpected EOF while reading public key</source> @@ -3006,15 +3011,15 @@ Tätä versiota ei ole tarkoitettu päivittäiseen käyttöön.</translation> </message> <message> <source>&Match URL schemes</source> - <translation>&Sovita verkko-osoitteen kaavaan</translation> + <translation>Sovita verkko-osoitteen kaavaan</translation> </message> <message> <source>Sort matching entries by &username</source> - <translation>Järjestä sopivat tietueet &käyttäjätunnuksen mukaan</translation> + <translation>Järjestä &vastaavat tietueet käyttäjätunnuksen mukaan</translation> </message> <message> <source>Sort &matching entries by title</source> - <translation>Järjestä sopivat tietueet &nimen mukaan</translation> + <translation>Järjestä &vastaavat merkinnät otsikon mukaan</translation> </message> <message> <source>R&emove all shared encryption keys from active database</source> @@ -3030,7 +3035,7 @@ Tätä versiota ei ole tarkoitettu päivittäiseen käyttöön.</translation> </message> <message> <source>Advanced</source> - <translation>Lisäasetukset</translation> + <translation>Lisää..</translation> </message> <message> <source>Always allow &access to entries</source> @@ -3148,7 +3153,7 @@ Käytetään oletusporttia 19455.</translation> </message> <message> <source>Passphrase</source> - <translation>Salalause</translation> + <translation>Tunnuslause</translation> </message> <message> <source>Wordlist:</source> @@ -3279,7 +3284,7 @@ Käytetään oletusporttia 19455.</translation> </message> <message> <source>Add a new entry to a database.</source> - <translation>Lisää uusi tietue tietokantaan.</translation> + <translation>Lisää uusi tietue tietokantaan</translation> </message> <message> <source>Path of the database.</source> @@ -3295,7 +3300,7 @@ Käytetään oletusporttia 19455.</translation> </message> <message> <source>Username for the entry.</source> - <translation>Tietueen käyttäjänimi.</translation> + <translation>Tietueen käyttäjänimi</translation> </message> <message> <source>username</source> @@ -3348,11 +3353,11 @@ Käytetään oletusporttia 19455.</translation> </message> <message> <source>Title for the entry.</source> - <translation>Tietueen nimi</translation> + <translation>Tietueen otsikko.</translation> </message> <message> <source>title</source> - <translation>nimi</translation> + <translation>otsikko</translation> </message> <message> <source>Path of the entry to edit.</source> @@ -3473,7 +3478,7 @@ Käytettävissä olevat komennot: <message> <source>file empty ! </source> - <translation>tiedosto on tyhjä ! + <translation>tiedosto tyhjä ! </translation> </message> <message> @@ -3611,7 +3616,7 @@ Käytettävissä olevat komennot: <name>QtIOCompressor</name> <message> <source>Internal zlib error when compressing: </source> - <translation>Sisäinen zlib virhe pakatessa: </translation> + <translation>Sisäinen zlib-virhe pakatessa:</translation> </message> <message> <source>Error writing to underlying device: </source> @@ -3638,7 +3643,7 @@ Käytettävissä olevat komennot: </message> <message> <source>Internal zlib error: </source> - <translation>Sisäinen zlib-virhe: </translation> + <translation>Sisäinen zlib-virhe:</translation> </message> </context> <context> @@ -3712,7 +3717,7 @@ Avaa valittu tietokanta tai valitse toinen avattu tietokanta.</translation> </message> <message numerus="yes"> <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> - <translation><numerusform>Poistettiin %n salausavain(ta) KeePassX/Http-asetuksista.</numerusform><numerusform>Poistettiin %n salausavain(ta) KeePassX/Http-asetuksista.</numerusform></translation> + <translation><numerusform>Poistettiin %n salausavain KeePassX/Http-asetuksista.</numerusform><numerusform>Poistettiin %n salausavainta KeePassX/Http-asetuksista.</numerusform></translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -3744,11 +3749,11 @@ Avaa valittu tietokanta tai valitse toinen avattu tietokanta.</translation> </message> <message numerus="yes"> <source>Successfully removed permissions from %n entries.</source> - <translation><numerusform>Poistettiin käyttöoikeudet %1:n tietueen tiedoista.</numerusform><numerusform>Poistettiin käyttöoikeudet %1:n tietueen tiedoista.</numerusform></translation> + <translation><numerusform>Poistettiin käyttöoikeus %n tietueelta.</numerusform><numerusform>Poistettiin käyttöoikeus %n tietueelta.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> - <translation>KeePassXC: Tietuetta käyttöoikeuksilla ei löytynyt!</translation> + <translation>KeePassXC: Merkintää käyttöoikeuksilla ei löytynyt!</translation> </message> <message> <source>The active database does not contain an entry with permissions.</source> @@ -3850,27 +3855,27 @@ Avaa valittu tietokanta tai valitse toinen avattu tietokanta.</translation> </message> <message> <source>Auto-Type</source> - <translation>Automaattisyöttö</translation> + <translation>Automaattitäydennys</translation> </message> <message> <source>Use entry title to match windows for global Auto-Type</source> - <translation>Tietue on sopiva, jos sen nimi sisältyy kohdeikkunan otsikkoon yleisessä automaattisyötössä</translation> + <translation>Tietue on sopiva, jos sen nimi sisältyy kohdeikkunan otsikkoon yleisessä automaattitäydennyksessä</translation> </message> <message> <source>Use entry URL to match windows for global Auto-Type</source> - <translation>Tietue on sopiva, jos sen osoite sisältyy kohdeikkunan otsikkoon yleisessä automaattisyötössä</translation> + <translation>Tietue on sopiva, jos sen osoite sisältyy kohdeikkunan otsikkoon yleisessä automaattitäydennyksessä</translation> </message> <message> <source>Always ask before performing Auto-Type</source> - <translation>Kysy aina ennen automaattisyötön käyttämistä</translation> + <translation>Kysy aina ennen automaattitäydennyksen käyttämistä</translation> </message> <message> <source>Global Auto-Type shortcut</source> - <translation>Yleisen automaattisyötön pikanäppäin</translation> + <translation>Globaalin automaattitäydennyksen pikanäppäin</translation> </message> <message> <source>Auto-Type delay</source> - <translation>Automaattisyötön viive</translation> + <translation>Automaattitäydennyksen viive</translation> </message> <message> <source> ms</source> @@ -3947,7 +3952,7 @@ Avaa valittu tietokanta tai valitse toinen avattu tietokanta.</translation> </message> <message> <source>Hide entry notes by default</source> - <translation>Piilota tietueiden muistiinpanot</translation> + <translation>Piilota tietueiden huomautukset</translation> </message> <message> <source>Privacy</source> diff --git a/share/translations/keepassx_fr.ts b/share/translations/keepassx_fr.ts index 3655a9e90..12a428dcd 100644 --- a/share/translations/keepassx_fr.ts +++ b/share/translations/keepassx_fr.ts @@ -15,7 +15,7 @@ </message> <message> <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassXC est distribué suivant les termes de la Licence Publique Générale GNU (GNU GPL), soit la version 2 de la Licence soit (à votre gré) la version 3.</translation> + <translation>KeePassXC est distribué suivant les termes de la GNU Licence Publique Générale (GNU GPL) version 2 ou version 3 de la licence (à votre choix).</translation> </message> <message> <source>Contributors</source> @@ -23,7 +23,7 @@ </message> <message> <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Voir les contributions sur GitHub</a></translation> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Voir Contributions sur GitHub</a></translation> </message> <message> <source>Debug Info</source> @@ -31,7 +31,7 @@ </message> <message> <source>Include the following information whenever you report a bug:</source> - <translation>Inclure les informations suivantes lorsque vous signaler un bug :</translation> + <translation>Inclure l'information suivante lorsque vous signaler un bug :</translation> </message> <message> <source>Copy to clipboard</source> @@ -45,11 +45,11 @@ </message> <message> <source>Revision: %1</source> - <translation>Révision : %1</translation> + <translation>Révision: %1</translation> </message> <message> <source>Distribution: %1</source> - <translation>Distribution : %1</translation> + <translation>Distribution: %1</translation> </message> <message> <source>Libraries:</source> @@ -61,7 +61,7 @@ CPU architecture: %2 Kernel: %3 %4</source> <translation>Système d'exploitation : %1 Architecture CPU : %2 -Noyau : %3 %4</translation> +Kernel : %3 %4</translation> </message> <message> <source>Enabled extensions:</source> @@ -86,7 +86,7 @@ Noyau : %3 %4</translation> <name>AccessControlDialog</name> <message> <source>KeePassXC HTTP Confirm Access</source> - <translation>Confirmer l'accès pour KeePassXC HTTP</translation> + <translation>Accès KeePassXC HTTP confirmé</translation> </message> <message> <source>Remember this decision</source> @@ -103,7 +103,7 @@ Noyau : %3 %4</translation> <message> <source>%1 has requested access to passwords for the following item(s). Please select whether you want to allow access.</source> - <translation>%1 a demandé l’accès aux mots de passe pour le ou les élément(s) suivant(s). + <translation>%1 a demandé l’accès aux mots de passe pour l'élément suivant (ou les éléments suivants). Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> </message> </context> @@ -122,7 +122,7 @@ Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> </message> <message> <source>Auto-Type - KeePassXC</source> - <translation>Saisie automatique - KeePassXC</translation> + <translation>Remplissage automatique - KeePassXC</translation> </message> <message> <source>Auto-Type</source> @@ -183,11 +183,11 @@ Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> <name>AutoTypeSelectDialog</name> <message> <source>Auto-Type - KeePassXC</source> - <translation>Saisie automatique - KeePassXC</translation> + <translation> Remplissage automatique - KeePassXC</translation> </message> <message> <source>Select entry to Auto-Type:</source> - <translation>Sélectionner une entrée à saisir automatiquement :</translation> + <translation>Choisissez un champ pour Auto-Type :</translation> </message> </context> <context> @@ -373,6 +373,10 @@ Veuillez sélectionner si vous souhaitez autoriser l’accès.</translation> <source>Select custom proxy location</source> <translation>Sélectionner un proxy personnalisé</translation> </message> + <message> + <source>We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>BrowserService</name> @@ -444,7 +448,7 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message numerus="yes"> <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> - <translation><numerusform>Cette clé de chiffrement a été retirée avec succès des paramètres de KeepassXC.</numerusform><numerusform>%n clés de chiffrement on été retirées avec succès des paramètres de KeePassXC.</numerusform></translation> + <translation><numerusform>%n clé(s) de chiffrement ont été retirées avec succès des paramètres de KeePassXC.</numerusform><numerusform>%n clé(s) de chiffrement ont été retirées avec succès des paramètres de KeePassXC.</numerusform></translation> </message> <message> <source>Removing stored permissions…</source> @@ -460,7 +464,7 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message numerus="yes"> <source>Successfully removed permissions from %n entry(s).</source> - <translation><numerusform>Les permissions de cette entrée ont été retirées avec succès.</numerusform><numerusform>Les permissions de %n entrées ont été retirées avec succès.</numerusform></translation> + <translation><numerusform>Les permissions de %n entrées ont été retirées avec succès.</numerusform><numerusform>Autorisations retirées avec succès de %s entrée(s)</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -487,11 +491,11 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message> <source>&Key file</source> - <translation>Fichier clé</translation> + <translation>Fichier-clé</translation> </message> <message> <source>Browse</source> - <translation>Parcourir</translation> + <translation>Naviguer</translation> </message> <message> <source>Create</source> @@ -507,7 +511,7 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message> <source>Key files</source> - <translation>Fichiers clés</translation> + <translation>Fichiers-clés</translation> </message> <message> <source>All files</source> @@ -515,15 +519,15 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message> <source>Create Key File...</source> - <translation>Créer un fichier clé...</translation> + <translation>Créer un fichier-clé...</translation> </message> <message> <source>Unable to create Key File : </source> - <translation>Impossible de créer un fichier clé :</translation> + <translation>Impossible de créer un fichier-clé :</translation> </message> <message> <source>Select a key file</source> - <translation>Choisir un fichier clé</translation> + <translation>Choisir un fichier-clé</translation> </message> <message> <source>Empty password</source> @@ -531,7 +535,7 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message> <source>Do you really want to use an empty string as password?</source> - <translation>Voulez-vous vraiment utiliser une chaîne de caractères vide comme mot de passe ?</translation> + <translation>Voulez-vous vraiment utiliser une chaîne vide comme mot de passe ?</translation> </message> <message> <source>Different passwords supplied.</source> @@ -540,7 +544,7 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui <message> <source>Failed to set %1 as the Key file: %2</source> - <translation>Impossible de définir %1 comme fichier clé : + <translation>Impossible de définir %1 comme fichier-clé : %2</translation> </message> <message> @@ -559,7 +563,7 @@ Veuillez envisager de générer un nouveau fichier clé.</translation> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> - <translation>Échec du changement de clé maître : pas de YubiKey insérée.</translation> + <translation>Échec du changement de clé maître: pas de YubiKey insérée.</translation> </message> </context> <context> @@ -585,7 +589,7 @@ Veuillez envisager de générer un nouveau fichier clé.</translation> <name>CsvImportWidget</name> <message> <source>Import CSV fields</source> - <translation>Importer les champs du CSV</translation> + <translation>Importer les champs CSV</translation> </message> <message> <source>filename</source> @@ -621,7 +625,7 @@ Veuillez envisager de générer un nouveau fichier clé.</translation> </message> <message> <source>Number of headers line to discard</source> - <translation>Nombre de lignes d'en-têtes à ignorer</translation> + <translation>Nombre de lignes d'en-tête à ignorer</translation> </message> <message> <source>Consider '\' an escape character</source> @@ -649,7 +653,7 @@ Veuillez envisager de générer un nouveau fichier clé.</translation> </message> <message> <source>Imported from CSV file</source> - <translation>Importé depuis un fichier CSV</translation> + <translation>Importé du fichier CSV</translation> </message> <message> <source>Original data: </source> @@ -657,7 +661,7 @@ Veuillez envisager de générer un nouveau fichier clé.</translation> </message> <message> <source>Error(s) detected in CSV file !</source> - <translation>Erreur(s) détectée(s) dans le fichier CSV!</translation> + <translation>Erreur(s) détectées dans le fichier CSV!</translation> </message> <message> <source> more messages skipped]</source> @@ -670,7 +674,7 @@ Veuillez envisager de générer un nouveau fichier clé.</translation> <message> <source>CSV import: writer has errors: </source> - <translation>Importation du CSV : erreurs d'écriture: + <translation>Import CSV: erreurs d'écriture: </translation> </message> </context> @@ -689,15 +693,15 @@ Veuillez envisager de générer un nouveau fichier clé.</translation> <name>CsvParserModel</name> <message numerus="yes"> <source>%n byte(s), </source> - <translation><numerusform>%n octet(s)</numerusform><numerusform>%n octet(s)</numerusform></translation> + <translation><numerusform>%n octet (s), </numerusform><numerusform>%n octet(s), </numerusform></translation> </message> <message numerus="yes"> <source>%n row(s), </source> - <translation><numerusform>%n Row (s), </numerusform><numerusform>%n ligne(s), </numerusform></translation> + <translation><numerusform>%n Row (s), </numerusform><numerusform>%n rangée(s), </numerusform></translation> </message> <message numerus="yes"> <source>%n column(s)</source> - <translation><numerusform>%n colonne</numerusform><numerusform>%n colonne(s)</numerusform></translation> + <translation><numerusform>%n/des colonnes</numerusform><numerusform>%n colonne(s)</numerusform></translation> </message> </context> <context> @@ -708,7 +712,7 @@ Veuillez envisager de générer un nouveau fichier clé.</translation> </message> <message> <source>Key File:</source> - <translation>Fichier clé :</translation> + <translation>Fichier-clé :</translation> </message> <message> <source>Password:</source> @@ -716,7 +720,7 @@ Veuillez envisager de générer un nouveau fichier clé.</translation> </message> <message> <source>Browse</source> - <translation>Parcourir</translation> + <translation>Naviguer</translation> </message> <message> <source>Refresh</source> @@ -732,7 +736,7 @@ Veuillez envisager de générer un nouveau fichier clé.</translation> </message> <message> <source>Can't open key file</source> - <translation>Impossible d'ouvrir le fichier clé</translation> + <translation>Impossible d'ouvrir le fichier-clé</translation> </message> <message> <source>Legacy key file format</source> @@ -758,11 +762,11 @@ Veuillez envisager de générer un nouveau fichier clé.</translation> </message> <message> <source>Key files</source> - <translation>Fichiers clés</translation> + <translation>Fichiers-clés</translation> </message> <message> <source>Select key file</source> - <translation>Choisissez un fichier clé</translation> + <translation>Choisissez un fichier-clé</translation> </message> </context> <context> @@ -777,7 +781,7 @@ Veuillez envisager de générer un nouveau fichier clé.</translation> </message> <message> <source>Can't open key file</source> - <translation>Impossible d'ouvrir le fichier clé</translation> + <translation>Impossible d'ouvrir le fichier-clé</translation> </message> <message> <source>Unable to open the database.</source> @@ -857,12 +861,12 @@ Si vous conservez ce nombre, la sécurité de votre base de données peut être <message numerus="yes"> <source> MiB</source> <comment>Abbreviation for Mebibytes (KDF settings)</comment> - <translation><numerusform> MiB</numerusform><numerusform> MiB</numerusform></translation> + <translation><numerusform>Mio</numerusform><numerusform>Mio</numerusform></translation> </message> <message numerus="yes"> <source> thread(s)</source> <comment>Threads for parallel execution (KDF settings)</comment> - <translation><numerusform> fil(s) d'exécution</numerusform><numerusform>fil(s) d'exécution</numerusform></translation> + <translation><numerusform>fil(s) d'exécution</numerusform><numerusform>fil(s) d'exécution</numerusform></translation> </message> </context> <context> @@ -956,7 +960,7 @@ Si vous conservez ce nombre, la sécurité de votre base de données peut être </message> <message> <source>KeePass 2 Database</source> - <translation>Base de données KeePass 2</translation> + <translation>Base de données Keepass 2</translation> </message> <message> <source>All files</source> @@ -1000,7 +1004,7 @@ Si vous conservez ce nombre, la sécurité de votre base de données peut être </message> <message> <source>KeePass 1 database</source> - <translation>Base de données KeePass 1</translation> + <translation>Base de données Keepass 1</translation> </message> <message> <source>Close?</source> @@ -1032,7 +1036,7 @@ Enregistrer les modifications ?</translation> </message> <message> <source>Save database as</source> - <translation>Enregistrer la base de données sous</translation> + <translation>Enregistrer comme nouvelle base de données</translation> </message> <message> <source>Export database to CSV file</source> @@ -1087,7 +1091,7 @@ Désactiver les sauvegardes sécurisées et essayer à nouveau?</translation> </message> <message> <source>Change master key</source> - <translation>Modifier la clé maître</translation> + <translation>Changer la clé maître</translation> </message> <message> <source>Delete entry?</source> @@ -1115,11 +1119,11 @@ Désactiver les sauvegardes sécurisées et essayer à nouveau?</translation> </message> <message> <source>Move entries to recycle bin?</source> - <translation>Déplacer les entrées dans la corbeille ?</translation> + <translation>Déplacer les entrées vers la corbeille ?</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>Voulez-vous vraiment déplacer %n entrée vers la corbeille ?</numerusform><numerusform>Voulez-vous vraiment déplacer %n entrées dans la corbeille?</numerusform></translation> + <translation><numerusform>Voulez-vous déplacer %n entrée(s) vers la corbeille ?</numerusform><numerusform>Voulez-vous déplacer %n entrée(s) vers la corbeille ?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1189,11 +1193,7 @@ Voulez-vous fusionner vos modifications ?</translation> </message> <message> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> - <translation>Êtes-vous certain de vouloir vider définitivement la corbeille?</translation> - </message> - <message> - <source>Entry updated successfully.</source> - <translation type="unfinished"/> + <translation>Êtes-vous certain de vouloir vider définitivement votre corbeille?</translation> </message> </context> <context> @@ -1268,7 +1268,7 @@ Voulez-vous fusionner vos modifications ?</translation> </message> <message> <source>[PROTECTED]</source> - <translation>[PROTÉGER]</translation> + <translation>[PROTÉGÉ]</translation> </message> <message> <source>Disabled</source> @@ -1295,7 +1295,7 @@ Voulez-vous fusionner vos modifications ?</translation> </message> <message> <source>Auto-Type</source> - <translation>Saisie automatique</translation> + <translation>Remplissage automatique</translation> </message> <message> <source>Properties</source> @@ -1343,7 +1343,7 @@ Voulez-vous fusionner vos modifications ?</translation> </message> <message> <source>Different passwords supplied.</source> - <translation>Les mots de passe insérés sont différents.</translation> + <translation>Les mots de passe ne sont pas identiques.</translation> </message> <message> <source>New attribute</source> @@ -1351,7 +1351,7 @@ Voulez-vous fusionner vos modifications ?</translation> </message> <message> <source>Confirm Remove</source> - <translation>Confirmer la suppression</translation> + <translation>Confirmez la suppression</translation> </message> <message> <source>Are you sure you want to remove this attribute?</source> @@ -1383,15 +1383,15 @@ Voulez-vous fusionner vos modifications ?</translation> </message> <message> <source>Apply generated password?</source> - <translation type="unfinished"/> + <translation>Appliquer le mot de passe généré ?</translation> </message> <message> <source>Do you want to apply the generated password to this entry?</source> - <translation type="unfinished"/> + <translation>Souhaitez-vous appliquer le mot de passe généré à cette entrée ?</translation> </message> <message> <source>Entry updated successfully.</source> - <translation type="unfinished"/> + <translation>Entrée mise à jour avec succès.</translation> </message> </context> <context> @@ -1422,30 +1422,30 @@ Voulez-vous fusionner vos modifications ?</translation> </message> <message> <source>Attachments</source> - <translation>Fichiers attachés</translation> + <translation>Affichage</translation> </message> <message> <source>Foreground Color:</source> - <translation type="unfinished"/> + <translation>Couleur du texte :</translation> </message> <message> <source>Background Color:</source> - <translation type="unfinished"/> + <translation>Couleur du fond :</translation> </message> </context> <context> <name>EditEntryWidgetAutoType</name> <message> <source>Enable Auto-Type for this entry</source> - <translation>Activer la saisie automatique pour cette entrée</translation> + <translation>Activer le remplissage automatique pour cette entrée</translation> </message> <message> <source>Inherit default Auto-Type sequence from the &group</source> - <translation>Utiliser la séquence par défaut de saisie automatique du &groupe</translation> + <translation>Utiliser la séquence de remplissage automatique par défaut du groupe</translation> </message> <message> <source>&Use custom Auto-Type sequence:</source> - <translation>&Utiliser une séquence personnalisée de saisie automatique :</translation> + <translation>Utiliser une séquence de remplissage automatique personnalisée :</translation> </message> <message> <source>Window Associations</source> @@ -1653,19 +1653,19 @@ Voulez-vous fusionner vos modifications ?</translation> </message> <message> <source>Search</source> - <translation>Recherche</translation> + <translation>Chercher</translation> </message> <message> <source>Auto-Type</source> - <translation>Saisie automatique</translation> + <translation>Saisie-Automatique</translation> </message> <message> <source>&Use default Auto-Type sequence of parent group</source> - <translation>&Utiliser la séquence par défaut de saisie automatique du groupe parent</translation> + <translation>&Utiliser la séquence de Saisie-Automatique du groupe parent</translation> </message> <message> <source>Set default Auto-Type se&quence</source> - <translation>Définir la sé&quence par défaut de la saisie automatique</translation> + <translation>Définir la sé&quence par défaut de la Saisie-Automatique</translation> </message> </context> <context> @@ -1696,7 +1696,7 @@ Voulez-vous fusionner vos modifications ?</translation> </message> <message> <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation>Astuce : Vous pouvez activer Google en second recours sous Outils>Paramètres>Sécurité</translation> + <translation>Astuce : Vous pouvez activer Google en tant que repli sous Outils>Paramètres>Sécurité</translation> </message> <message> <source>Images</source> @@ -1704,7 +1704,7 @@ Voulez-vous fusionner vos modifications ?</translation> </message> <message> <source>All files</source> - <translation>Tous les fichiers</translation> + <translation>Tous les dossiers</translation> </message> <message> <source>Select Image</source> @@ -1747,7 +1747,7 @@ Voulez-vous fusionner vos modifications ?</translation> </message> <message> <source>Plugin Data</source> - <translation type="unfinished"/> + <translation>Données de l'extension</translation> </message> <message> <source>Remove</source> @@ -1755,20 +1755,20 @@ Voulez-vous fusionner vos modifications ?</translation> </message> <message> <source>Delete plugin data?</source> - <translation type="unfinished"/> + <translation>Supprimer les données de l'extension ?</translation> </message> <message> <source>Do you really want to delete the selected plugin data? This may cause the affected plugins to malfunction.</source> - <translation type="unfinished"/> + <translation>Souhaitez-vous vraiment supprimer les données de l'extension sélectionnée ? Cela peut causer un dysfonctionnement de l'extension.</translation> </message> <message> <source>Key</source> - <translation type="unfinished"/> + <translation>Clé</translation> </message> <message> <source>Value</source> - <translation type="unfinished"/> + <translation>Valeur</translation> </message> </context> <context> @@ -1818,7 +1818,7 @@ This may cause the affected plugins to malfunction.</source> </message> <message numerus="yes"> <source>Are you sure you want to remove %n attachment(s)?</source> - <translation><numerusform>Êtes-vous sûr de vouloir supprimer ce fichier attaché?</numerusform><numerusform>Êtes-vous sûr de vouloir supprimer ces %n fichiers attachés?</numerusform></translation> + <translation><numerusform>Êtes-vous sûr de vouloir supprimer ces %n fichiers attachés ?</numerusform><numerusform>Êtes-vous sûr de vouloir supprimer ces %n fichiers attachés ?</numerusform></translation> </message> <message> <source>Confirm Remove</source> @@ -1953,27 +1953,31 @@ This may cause the affected plugins to malfunction.</source> <name>EntryView</name> <message> <source>Customize View</source> - <translation>Personnaliser l’affichage</translation> + <translation>Personnaliser la vue</translation> </message> <message> <source>Hide Usernames</source> - <translation>Masquer les noms d’utilisateur</translation> + <translation>Cacher les noms d'utilisateurs</translation> </message> <message> <source>Hide Passwords</source> - <translation>Masquer les mots de passe</translation> + <translation>Cacher les mots de passe</translation> </message> <message> <source>Fit to window</source> - <translation>Ajuster à la fenêtre</translation> + <translation>Adapter à la fenêtre</translation> </message> <message> <source>Fit to contents</source> - <translation>Ajuster au contenu</translation> + <translation>Adapter au contenu</translation> </message> <message> <source>Reset to defaults</source> - <translation>Réinitialiser aux valeurs par défaut</translation> + <translation>Remettre les paramètres par défaut</translation> + </message> + <message> + <source>Attachments (icon)</source> + <translation type="unfinished"/> </message> </context> <context> @@ -1998,7 +2002,7 @@ This may cause the affected plugins to malfunction.</source> <name>HttpPasswordGeneratorWidget</name> <message> <source>Length:</source> - <translation>Longueur :</translation> + <translation>Longueur:</translation> </message> <message> <source>Character Types</source> @@ -2419,7 +2423,7 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l <name>KeePass1OpenWidget</name> <message> <source>Import KeePass1 database</source> - <translation>Importer une base de données au format KeePass 1</translation> + <translation>Importer une base de données au format KeePass1</translation> </message> <message> <source>Unable to open the database.</source> @@ -2430,7 +2434,7 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l <name>KeePass1Reader</name> <message> <source>Unable to read keyfile.</source> - <translation>Impossible de lire le fichier clé.</translation> + <translation>Impossible de lire le fichier-clé.</translation> </message> <message> <source>Not a KeePass database.</source> @@ -2586,7 +2590,7 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>The lock file could not be created. Single-instance mode disabled.</source> - <translation>Le fichier de verrouillage ne peut pas être créé. Le mode d'instance unique est désactivé.</translation> + <translation>Le fichier verrou ne peut pas être créé. Le mode instance-unique est désactivé.</translation> </message> <message> <source>Another instance of KeePassXC is already running.</source> @@ -2609,7 +2613,7 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>&Recent databases</source> - <translation>&Bases de données récentes</translation> + <translation>Bases de données récentes</translation> </message> <message> <source>Import</source> @@ -2617,15 +2621,15 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>&Help</source> - <translation>&Aide</translation> + <translation>Aide</translation> </message> <message> <source>E&ntries</source> - <translation>E&ntrées</translation> + <translation>Entrées</translation> </message> <message> <source>Copy att&ribute to clipboard</source> - <translation>Copier l'att&ribut dans le presse-papier</translation> + <translation>Copier l'attribut dans le presse-papier</translation> </message> <message> <source>Time-based one-time password</source> @@ -2633,7 +2637,7 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>&Groups</source> - <translation>&Groupes</translation> + <translation>Groupes</translation> </message> <message> <source>&Tools</source> @@ -2653,11 +2657,11 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>&Save database</source> - <translation>&Enregistrer la base de données</translation> + <translation>Enregistrer la base de données</translation> </message> <message> <source>&Close database</source> - <translation>&Fermer la base de données</translation> + <translation>Fermer la base de données</translation> </message> <message> <source>&New database</source> @@ -2665,19 +2669,19 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>Merge from KeePassX database</source> - <translation>Fusionner avec la base de données de KeePassX...</translation> + <translation>Fusionner depuis la base de données KeePassX</translation> </message> <message> <source>&Add new entry</source> - <translation>&Ajouter une nouvelle entrée</translation> + <translation>Ajouter une nouvelle entrée</translation> </message> <message> <source>&View/Edit entry</source> - <translation>&Voir/Éditer l'entrée</translation> + <translation>Voir/Editer l'entrée</translation> </message> <message> <source>&Delete entry</source> - <translation>&Supprimer l'entrée</translation> + <translation>Supprimer l'entrée</translation> </message> <message> <source>&Add new group</source> @@ -2693,7 +2697,7 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>Sa&ve database as...</source> - <translation>En&registrer la base de données sous...</translation> + <translation>Sau&ver la base de données sous...</translation> </message> <message> <source>Change &master key...</source> @@ -2701,7 +2705,7 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>&Database settings</source> - <translation>&Paramètres de la base de données</translation> + <translation>Paramètre de la base de &données</translation> </message> <message> <source>Database settings</source> @@ -2709,7 +2713,7 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>&Clone entry</source> - <translation>&Cloner l'entrée</translation> + <translation>Cloner l'entrée</translation> </message> <message> <source>&Find</source> @@ -2725,7 +2729,7 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>Cop&y password</source> - <translation>Cop&ier le mot de passe</translation> + <translation>Copier le mot de passe</translation> </message> <message> <source>Copy password to clipboard</source> @@ -2733,7 +2737,7 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>&Settings</source> - <translation>&Paramètres</translation> + <translation>Paramètres</translation> </message> <message> <source>Password Generator</source> @@ -2741,7 +2745,7 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>&Perform Auto-Type</source> - <translation>&Exécuter la saisie automatique</translation> + <translation>Exécuter la saisie semi-automatique</translation> </message> <message> <source>&Open URL</source> @@ -2749,7 +2753,7 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>&Lock databases</source> - <translation>&Verrouiller les bases de données</translation> + <translation>Verrouiller les bases de données</translation> </message> <message> <source>&Title</source> @@ -2821,7 +2825,7 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>read-only</source> - <translation>Lecture seule</translation> + <translation>Lecture seulement</translation> </message> <message> <source>Settings</source> @@ -2833,7 +2837,7 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>Quit KeePassXC</source> - <translation>Quitter KeePassXC</translation> + <translation>Quitter KeePass XC</translation> </message> <message> <source>KeePass 2 Database</source> @@ -2845,7 +2849,7 @@ Il s'agit d'une migration à sens unique. Vous ne pourrez pas ouvrir l </message> <message> <source>Open database</source> - <translation>Ouvrir la base de données</translation> + <translation>Ouvrir une base de données</translation> </message> <message> <source>Save repaired database</source> @@ -2988,7 +2992,7 @@ Cette version n’est pas destinée à la production.</translation> <message> <source>Sh&ow a notification when credentials are requested</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation>Af&ficher une notification quand les identifiants sont demandés</translation> + <translation>Montrer une notification quand les références sont demandées</translation> </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> @@ -3056,7 +3060,7 @@ Cette version n’est pas destinée à la production.</translation> </message> <message> <source>&Return advanced string fields which start with "KPH: "</source> - <translation>& Retourne les champs avancés de chaîne de caractères qui commencent par "KPH :"</translation> + <translation>& Retourne les champs avancés de type chaîne qui commencent par "KPH :"</translation> </message> <message> <source>HTTP Port:</source> @@ -3068,7 +3072,7 @@ Cette version n’est pas destinée à la production.</translation> </message> <message> <source>KeePassXC will listen to this port on 127.0.0.1</source> - <translation>KeePassXC va écouter ce port sur 127.0.0.1</translation> + <translation>KeepassXC va écouter ce port sur 127.0.0.1</translation> </message> <message> <source><b>Warning:</b> The following options can be dangerous!</source> @@ -3114,7 +3118,7 @@ Restauration du port 19455 par défaut.</translation> </message> <message> <source>Character Types</source> - <translation>Types de caractères:</translation> + <translation>Types de caractères</translation> </message> <message> <source>Upper Case Letters</source> @@ -3126,7 +3130,7 @@ Restauration du port 19455 par défaut.</translation> </message> <message> <source>Numbers</source> - <translation>Chiffres</translation> + <translation>Nombres</translation> </message> <message> <source>Special Characters</source> @@ -3138,7 +3142,7 @@ Restauration du port 19455 par défaut.</translation> </message> <message> <source>Exclude look-alike characters</source> - <translation>Exclure les caractères qui se ressemblent</translation> + <translation>Exclure les caractères se ressemblant</translation> </message> <message> <source>Pick characters from every group</source> @@ -3480,7 +3484,7 @@ Commandes disponibles : </message> <message> <source>malformed string</source> - <translation>chaîne de caractères malformée</translation> + <translation>chaîne malformée</translation> </message> <message> <source>missing closing quote</source> @@ -3544,7 +3548,7 @@ Commandes disponibles : </message> <message> <source>Browser Integration</source> - <translation>Intégration au navigateur web</translation> + <translation>Intégration Navigateur</translation> </message> <message> <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source> @@ -3651,7 +3655,7 @@ Commandes disponibles : </message> <message> <source>Search</source> - <translation>Recherche</translation> + <translation>Chercher</translation> </message> <message> <source>Clear</source> @@ -3714,7 +3718,7 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message numerus="yes"> <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> - <translation><numerusform>Cette clé de chiffrement a été retirée avec succès des paramètres de KeePassX/Http.</numerusform><numerusform>%n clés de chiffrement ont été retirées avec succès des paramètres de KeePassX/Http.</numerusform></translation> + <translation><numerusform>Réussi à retirer le chiffrement %n-clé (s) de paramètres KeePassX/Http.</numerusform><numerusform>%n-clé(s) chiffrement ont été retirées des paramètres KeePassX/Http.</numerusform></translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -3726,7 +3730,7 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message> <source>KeePassXC: Settings not available!</source> - <translation>KeePassXC : Paramètres indisponibles !</translation> + <translation>KeePassXC: Paramètre indisponible !</translation> </message> <message> <source>The active database does not contain an entry of KeePassHttp Settings.</source> @@ -3746,7 +3750,7 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message numerus="yes"> <source>Successfully removed permissions from %n entries.</source> - <translation><numerusform>Les permissions de l'entrée ont été retirées avec succès.</numerusform><numerusform>Les permissions de %n entrées ont été retirées avec succès.</numerusform></translation> + <translation><numerusform>Correctement supprimé les autorisations de %n entrées.</numerusform><numerusform>Les autorisations de %n entrées ont été correctement supprimées.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -3852,7 +3856,7 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message> <source>Auto-Type</source> - <translation>Saisie automatique</translation> + <translation>Saisie-Automatique</translation> </message> <message> <source>Use entry title to match windows for global Auto-Type</source> @@ -3864,15 +3868,15 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message> <source>Always ask before performing Auto-Type</source> - <translation>Toujours demander avant de procéder à une saisie automatique</translation> + <translation>Toujours demander avant de procéder à une Saisie-Automatique</translation> </message> <message> <source>Global Auto-Type shortcut</source> - <translation>Raccourci de la saisie automatique</translation> + <translation>Raccourci de la Saisie-Automatique</translation> </message> <message> <source>Auto-Type delay</source> - <translation>Délais de remplissage de la saisie automatique</translation> + <translation>Délais de Remplissage de la Saisie-Automatique</translation> </message> <message> <source> ms</source> @@ -3885,7 +3889,7 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message> <source>File Management</source> - <translation>Gestion des fichiers</translation> + <translation>Gestion de fichiers</translation> </message> <message> <source>Safely save database files (may be incompatible with Dropbox, etc)</source> @@ -3908,7 +3912,7 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui <name>SettingsWidgetSecurity</name> <message> <source>Timeouts</source> - <translation>Expirations</translation> + <translation>Timeouts</translation> </message> <message> <source>Clear clipboard after</source> @@ -3929,11 +3933,11 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message> <source>Lock databases when session is locked or lid is closed</source> - <translation>Verrouiller les bases de données quand la session est verrouillée ou l'écran rabattu</translation> + <translation>Verrouiller les bases de données quand la session est verrouillée ou le capot fermé</translation> </message> <message> <source>Lock databases after minimizing the window</source> - <translation>Verrouiller les bases de données lorsque la fenêtre est minimisée</translation> + <translation>Verrouiller la base de données lorsque la fenêtre est minimisée</translation> </message> <message> <source>Don't require password repeat when it is visible</source> @@ -3957,7 +3961,7 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message> <source>Use Google as fallback for downloading website icons</source> - <translation>Utilisez Google en second recours pour télécharger les icônes des sites internet</translation> + <translation>Utilisez Google en secours pour télécharger des icônes de site web</translation> </message> <message> <source>Re-lock previously locked database after performing Auto-Type</source> @@ -4062,7 +4066,7 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message> <source>Import from CSV</source> - <translation>Importer depuis un CSV</translation> + <translation>Import depuis CSV</translation> </message> <message> <source>Recent databases</source> @@ -4070,7 +4074,7 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message> <source>Welcome to KeePassXC %1</source> - <translation>Bienvenue sur KeePassXC %1</translation> + <translation>Bienvenue dans KeePassXC %1</translation> </message> </context> <context> @@ -4101,7 +4105,7 @@ Veuillez déverrouiller la base de données sélectionnée ou en choisir une qui </message> <message> <source>key file of the database</source> - <translation>Fichier clé de la base de données</translation> + <translation>Fichier-clé de la base de données</translation> </message> <message> <source>read password of the database from stdin</source> diff --git a/share/translations/keepassx_hu.ts b/share/translations/keepassx_hu.ts index fe7f8f8e8..a84903fa6 100644 --- a/share/translations/keepassx_hu.ts +++ b/share/translations/keepassx_hu.ts @@ -15,7 +15,7 @@ </message> <message> <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>A KeePassXC a GNU General Public License (GPL) 2-es vagy (válaszhatóan) 3-as verziója szerint kerül terjesztésre.</translation> + <translation>A KeePassXC a GNU General Public License (GPL) 2. vagy (válaszhatóan ) 3. verziója szerint kerül terjesztésre.</translation> </message> <message> <source>Contributors</source> @@ -372,6 +372,10 @@ Válassza ki, hogy engedélyezi-e a hozzáférést.</translation> <source>Select custom proxy location</source> <translation>Egyedi proxyhely kijelölése</translation> </message> + <message> + <source>We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</source> + <translation>Sajnáljuk, de a KeePassXC-Browser pillanatnyilag nem támogatja a Snap kiadásokat.</translation> + </message> </context> <context> <name>BrowserService</name> @@ -773,7 +777,7 @@ Megfontolandó egy új kulcsfájl készítése.</translation> </message> <message> <source>Can't open key file</source> - <translation>Nem lehet megnyitni a kulcsfájlt</translation> + <translation>Nem lehet megnyitni a kulcsfájl</translation> </message> <message> <source>Unable to open the database.</source> @@ -988,7 +992,7 @@ Ezt a számot megtartva az adatbázis nagyon könnyen törhető lesz.</translati </message> <message> <source>Merge database</source> - <translation>Adatbázis egyesítése</translation> + <translation>Adatbázis összeolvasztása</translation> </message> <message> <source>Open KeePass 1 database</source> @@ -1167,7 +1171,7 @@ Letiltható a biztonságos mentés és úgy megkísérelhető a mentés?</transl </message> <message> <source>Merge Request</source> - <translation>Egyesítési kérelem</translation> + <translation>Összeolvasztási kérelem</translation> </message> <message> <source>The database file has changed and you have unsaved changes. @@ -1187,10 +1191,6 @@ Egyesíti a módosításokat?</translation> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>Valóban véglegesen töröl mindent a kukából?</translation> </message> - <message> - <source>Entry updated successfully.</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DetailsWidget</name> @@ -1379,15 +1379,15 @@ Egyesíti a módosításokat?</translation> </message> <message> <source>Apply generated password?</source> - <translation type="unfinished"/> + <translation>Alkalmazható az előállított jelszó?</translation> </message> <message> <source>Do you want to apply the generated password to this entry?</source> - <translation type="unfinished"/> + <translation>Valóban alkalmazható az előállított jelszó ehhez a bejegyzéshez?</translation> </message> <message> <source>Entry updated successfully.</source> - <translation type="unfinished"/> + <translation>Bejegyzés sikeresen frissítve.</translation> </message> </context> <context> @@ -1422,11 +1422,11 @@ Egyesíti a módosításokat?</translation> </message> <message> <source>Foreground Color:</source> - <translation type="unfinished"/> + <translation>Előtérszín:</translation> </message> <message> <source>Background Color:</source> - <translation type="unfinished"/> + <translation>Háttérszín:</translation> </message> </context> <context> @@ -1739,11 +1739,11 @@ Egyesíti a módosításokat?</translation> </message> <message> <source>Uuid:</source> - <translation>UUID:</translation> + <translation>Uuid:</translation> </message> <message> <source>Plugin Data</source> - <translation type="unfinished"/> + <translation>Bővítmény adati</translation> </message> <message> <source>Remove</source> @@ -1751,20 +1751,21 @@ Egyesíti a módosításokat?</translation> </message> <message> <source>Delete plugin data?</source> - <translation type="unfinished"/> + <translation>Törölhetők a bővítmény adatai?</translation> </message> <message> <source>Do you really want to delete the selected plugin data? This may cause the affected plugins to malfunction.</source> - <translation type="unfinished"/> + <translation>Valóban törölhetők a kijelölt bővítmény adata? +Ez a kijelölt bővítmény hibás működését eredményezheti.</translation> </message> <message> <source>Key</source> - <translation type="unfinished"/> + <translation>Kulcs</translation> </message> <message> <source>Value</source> - <translation type="unfinished"/> + <translation>Érték</translation> </message> </context> <context> @@ -1971,6 +1972,10 @@ This may cause the affected plugins to malfunction.</source> <source>Reset to defaults</source> <translation>Visszaállítás alapértelmezettre</translation> </message> + <message> + <source>Attachments (icon)</source> + <translation>Mellékletek (ikon)</translation> + </message> </context> <context> <name>Group</name> @@ -2030,7 +2035,7 @@ This may cause the affected plugins to malfunction.</source> </message> <message> <source>/*_& ...</source> - <translation>/*_& …</translation> + <translation>/*_& ...</translation> </message> <message> <source>Exclude look-alike characters</source> @@ -2661,7 +2666,7 @@ Ez egyirányú migráció. Nem lehet majd megnyitni az importált adatbázist a </message> <message> <source>Merge from KeePassX database</source> - <translation>Egyesítés KeePassX adatbázisból</translation> + <translation>Összeolvasztás KeePassX adatbázisból</translation> </message> <message> <source>&Add new entry</source> diff --git a/share/translations/keepassx_id.ts b/share/translations/keepassx_id.ts index dcd4a5b96..0540b5afb 100644 --- a/share/translations/keepassx_id.ts +++ b/share/translations/keepassx_id.ts @@ -23,7 +23,7 @@ </message> <message> <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Lihat Semua Kontribusi di GitHub</a></translation> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Lihat Semua Kontribusi pada GitHub</a></translation> </message> <message> <source>Debug Info</source> @@ -372,6 +372,10 @@ Silakan pilih apakah Anda ingin mengizinkannya.</translation> <source>Select custom proxy location</source> <translation>Pilih lokasi proksi khusus</translation> </message> + <message> + <source>We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>BrowserService</name> @@ -443,7 +447,7 @@ Silakan buka kunci atau pilih yang lainnya yang tidak terkunci.</translation> </message> <message numerus="yes"> <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> - <translation><numerusform>Berhasil membuang %n kunci enkripsi dari pengaturan KeePassXC.</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform></translation> </message> <message> <source>Removing stored permissions…</source> @@ -459,7 +463,7 @@ Silakan buka kunci atau pilih yang lainnya yang tidak terkunci.</translation> </message> <message numerus="yes"> <source>Successfully removed permissions from %n entry(s).</source> - <translation><numerusform>Berhasil membuang perizinan dari %n entri.</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -510,7 +514,7 @@ Silakan buka kunci atau pilih yang lainnya yang tidak terkunci.</translation> </message> <message> <source>All files</source> - <translation>Semua Berkas</translation> + <translation>Semua berkas</translation> </message> <message> <source>Create Key File...</source> @@ -588,11 +592,11 @@ Harap pertimbangkan membuat berkas kunci baru.</translation> </message> <message> <source>filename</source> - <translation>nama berkas</translation> + <translation>filename</translation> </message> <message> <source>size, rows, columns</source> - <translation>ukuran, baris, kolom</translation> + <translation>size, rows, columns</translation> </message> <message> <source>Encoding</source> @@ -753,7 +757,7 @@ Harap pertimbangkan membuat berkas kunci baru.</translation> </message> <message> <source>All files</source> - <translation>Semua Berkas</translation> + <translation>Semua berkas</translation> </message> <message> <source>Key files</source> @@ -852,7 +856,7 @@ If you keep this number, your database may be too easy to crack!</source> <message numerus="yes"> <source> MiB</source> <comment>Abbreviation for Mebibytes (KDF settings)</comment> - <translation><numerusform> MiB</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform></translation> </message> <message numerus="yes"> <source> thread(s)</source> @@ -951,11 +955,11 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>KeePass 2 Database</source> - <translation>Basis Data KeePass 2</translation> + <translation>Basis data KeePass 2</translation> </message> <message> <source>All files</source> - <translation>Semua Berkas</translation> + <translation>Semua berkas</translation> </message> <message> <source>Open database</source> @@ -1019,7 +1023,7 @@ Simpan perubahan?</translation> </message> <message> <source>Writing the database failed.</source> - <translation>Gagal menyimpan basis data.</translation> + <translation>Gagal membuat basis data.</translation> </message> <message> <source>Passwords</source> @@ -1186,10 +1190,6 @@ Apakah Anda ingin menggabungkan ubahan Anda?</translation> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>Apakah Anda yakin ingin menghapus semuanya secara permanen dari keranjang sampah?</translation> </message> - <message> - <source>Entry updated successfully.</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DetailsWidget</name> @@ -1699,7 +1699,7 @@ Apakah Anda ingin menggabungkan ubahan Anda?</translation> </message> <message> <source>All files</source> - <translation>Semua Berkas</translation> + <translation>Semua berkas</translation> </message> <message> <source>Select Image</source> @@ -1813,7 +1813,7 @@ This may cause the affected plugins to malfunction.</source> </message> <message numerus="yes"> <source>Are you sure you want to remove %n attachment(s)?</source> - <translation><numerusform>Apakah Anda yakin ingin membuang %n lampiran?</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform></translation> </message> <message> <source>Confirm Remove</source> @@ -1970,6 +1970,10 @@ This may cause the affected plugins to malfunction.</source> <source>Reset to defaults</source> <translation>Kembalikan ke setelan bawaan</translation> </message> + <message> + <source>Attachments (icon)</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Group</name> @@ -3708,7 +3712,7 @@ Silakan buka kunci atau pilih yang lainnya yang tidak terkunci.</translation> </message> <message numerus="yes"> <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> - <translation><numerusform>Berhasil membuang %n kunci enkripsi dari Pengaturan KeePassX/Http</numerusform></translation> + <translation><numerusform>Berhasil membuang %n kunci terenkripsi dari Pengaturan KeePassXC/Http.</numerusform></translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -3740,7 +3744,7 @@ Silakan buka kunci atau pilih yang lainnya yang tidak terkunci.</translation> </message> <message numerus="yes"> <source>Successfully removed permissions from %n entries.</source> - <translation><numerusform>Berhasil membuang perizinan dari %n entri.</numerusform></translation> + <translation><numerusform>Berhasil membuang izin dari %n entri.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> diff --git a/share/translations/keepassx_it.ts b/share/translations/keepassx_it.ts index 76365f2b3..d9bacbf49 100644 --- a/share/translations/keepassx_it.ts +++ b/share/translations/keepassx_it.ts @@ -3,7 +3,7 @@ <name>AboutDialog</name> <message> <source>About KeePassXC</source> - <translation>Informazioni su KeePassXC</translation> + <translation>Info su KeePassXC</translation> </message> <message> <source>About</source> @@ -27,7 +27,7 @@ </message> <message> <source>Debug Info</source> - <translation>Informazioni di debug</translation> + <translation>Informazioni debug</translation> </message> <message> <source>Include the following information whenever you report a bug:</source> @@ -86,11 +86,11 @@ Kernel: %3 %4</translation> <name>AccessControlDialog</name> <message> <source>KeePassXC HTTP Confirm Access</source> - <translation>Conferma l'accesso per KeePassXC HTTP</translation> + <translation>KeePassXC HTTP conferma accesso</translation> </message> <message> <source>Remember this decision</source> - <translation>Ricorda questa scelta</translation> + <translation>Ricorda questa decisione</translation> </message> <message> <source>Allow</source> @@ -122,7 +122,7 @@ Seleziona se vuoi consentire l'accesso.</translation> </message> <message> <source>Auto-Type - KeePassXC</source> - <translation>KeePassXC - Completamento automatico</translation> + <translation>Auto-completamento - KeePassXC</translation> </message> <message> <source>Auto-Type</source> @@ -187,7 +187,7 @@ Seleziona se vuoi consentire l'accesso.</translation> </message> <message> <source>Select entry to Auto-Type:</source> - <translation>Seleziona una voce per il completamento automatico:</translation> + <translation>Seleziona una voce per l'auto-completamento:</translation> </message> </context> <context> @@ -198,7 +198,7 @@ Seleziona se vuoi consentire l'accesso.</translation> </message> <message> <source>Remember this decision</source> - <translation>Ricorda questa decisione</translation> + <translation>Ricorda questa scelta</translation> </message> <message> <source>Allow</source> @@ -373,6 +373,10 @@ Seleziona se vuoi consentire l'accesso.</translation> <source>Select custom proxy location</source> <translation>Selezionare una posizione personalizzata per il proxy</translation> </message> + <message> + <source>We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</source> + <translation>Siamo spiacenti, ma KeePassXC-Browser non è supportato per i rilasci di Snap al momento.</translation> + </message> </context> <context> <name>BrowserService</name> @@ -443,7 +447,7 @@ Sblocca il database selezionato o scegline un altro che sia sbloccato.</translat </message> <message numerus="yes"> <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> - <translation><numerusform>Rimossa con successo %n chiave di cifratura dalle impostazioni di KeePassXC.</numerusform><numerusform>Rimosse con successo %n chiavi di cifratura dalle impostazioni di KeePassXC.</numerusform></translation> + <translation><numerusform>Rimosso con successo %n chiavi di crittografia da KeePassXC impostazioni.</numerusform><numerusform>Rimossa(e) con successo %n chiave(i) di crittografia dalle impostazioni di KeePassXC.</numerusform></translation> </message> <message> <source>Removing stored permissions…</source> @@ -459,7 +463,7 @@ Sblocca il database selezionato o scegline un altro che sia sbloccato.</translat </message> <message numerus="yes"> <source>Successfully removed permissions from %n entry(s).</source> - <translation><numerusform>Permessi rimossi con successo da %n voce.</numerusform><numerusform>Permessi rimossi con successo da %n voci.</numerusform></translation> + <translation><numerusform>Rimosso con successo le autorizzazioni da %n ha.</numerusform><numerusform>Rimossa(e) con successo le autorizzazioni da %n voce(i).</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -861,7 +865,7 @@ Se continui con questo numero, il tuo database potrebbe essere decifrato molto f <message numerus="yes"> <source> thread(s)</source> <comment>Threads for parallel execution (KDF settings)</comment> - <translation><numerusform>thread</numerusform><numerusform>thread</numerusform></translation> + <translation><numerusform> iscritto (i)</numerusform><numerusform> thread(s)</numerusform></translation> </message> </context> <context> @@ -931,7 +935,7 @@ Se continui con questo numero, il tuo database potrebbe essere decifrato molto f </message> <message> <source> MiB</source> - <translation> MB</translation> + <translation> MiB</translation> </message> <message> <source>Use recycle bin</source> @@ -1023,7 +1027,7 @@ Vuoi salvare le modifiche?</translation> </message> <message> <source>Writing the database failed.</source> - <translation>Scrittura database non riuscita.</translation> + <translation>Scrittura del database non riuscita.</translation> </message> <message> <source>Passwords</source> @@ -1039,7 +1043,7 @@ Vuoi salvare le modifiche?</translation> </message> <message> <source>Writing the CSV file failed.</source> - <translation>Scrittura file CSV non riuscita.</translation> + <translation>Scrittura file CSV fallita.</translation> </message> <message> <source>New database</source> @@ -1118,7 +1122,7 @@ Disabilitare i salvataggi sicuri e riprovare?</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>Vuoi veramente cestinare %n voce?</numerusform><numerusform>Vuoi veramente cestinare %n voci?</numerusform></translation> + <translation><numerusform>Vuoi veramente spostare %n elemento nel Cestino?</numerusform><numerusform>Vuoi veramente cestinare %n voci?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1190,10 +1194,6 @@ Vuoi fondere i cambiamenti?</translation> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>Sei sicuro di voler eliminare definitivamente tutto dal cestino?</translation> </message> - <message> - <source>Entry updated successfully.</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DetailsWidget</name> @@ -1382,15 +1382,15 @@ Vuoi fondere i cambiamenti?</translation> </message> <message> <source>Apply generated password?</source> - <translation type="unfinished"/> + <translation>Applicare la password generata?</translation> </message> <message> <source>Do you want to apply the generated password to this entry?</source> - <translation type="unfinished"/> + <translation>Desideri applicare la password generata a questa voce?</translation> </message> <message> <source>Entry updated successfully.</source> - <translation type="unfinished"/> + <translation>Voce aggiornata correttamente.</translation> </message> </context> <context> @@ -1425,11 +1425,11 @@ Vuoi fondere i cambiamenti?</translation> </message> <message> <source>Foreground Color:</source> - <translation type="unfinished"/> + <translation>Colore di primo piano:</translation> </message> <message> <source>Background Color:</source> - <translation type="unfinished"/> + <translation>Colore di sfondo:</translation> </message> </context> <context> @@ -1444,7 +1444,7 @@ Vuoi fondere i cambiamenti?</translation> </message> <message> <source>&Use custom Auto-Type sequence:</source> - <translation>&Usa sequenza di completamento automatico personalizzata:</translation> + <translation>&Usa sequenza di compeltamento automatico personalizzata:</translation> </message> <message> <source>Window Associations</source> @@ -1746,7 +1746,7 @@ Vuoi fondere i cambiamenti?</translation> </message> <message> <source>Plugin Data</source> - <translation type="unfinished"/> + <translation>Dati del plugin</translation> </message> <message> <source>Remove</source> @@ -1754,20 +1754,21 @@ Vuoi fondere i cambiamenti?</translation> </message> <message> <source>Delete plugin data?</source> - <translation type="unfinished"/> + <translation>Eliminare i dati del plugin?</translation> </message> <message> <source>Do you really want to delete the selected plugin data? This may cause the affected plugins to malfunction.</source> - <translation type="unfinished"/> + <translation>Vuoi davvero eliminare i dati del plugin selezionato? +Ciò potrebbe causare malfunzionamenti ai plugin interessati.</translation> </message> <message> <source>Key</source> - <translation type="unfinished"/> + <translation>Chiave</translation> </message> <message> <source>Value</source> - <translation type="unfinished"/> + <translation>Valore</translation> </message> </context> <context> @@ -1817,7 +1818,7 @@ This may cause the affected plugins to malfunction.</source> </message> <message numerus="yes"> <source>Are you sure you want to remove %n attachment(s)?</source> - <translation><numerusform>Sei sicuro di voler rimuovere %n allegato?</numerusform><numerusform>Sei sicuro di voler rimuovere %n allegati?</numerusform></translation> + <translation><numerusform>Sei sicuro di che voler rimuovere %n allegati?</numerusform><numerusform>Sei sicuro di voler rimuovere %n allegato(i)?</numerusform></translation> </message> <message> <source>Confirm Remove</source> @@ -1974,6 +1975,10 @@ This may cause the affected plugins to malfunction.</source> <source>Reset to defaults</source> <translation>Ripristina valori predefiniti</translation> </message> + <message> + <source>Attachments (icon)</source> + <translation>Allegati (icona)</translation> + </message> </context> <context> <name>Group</name> @@ -2001,7 +2006,7 @@ This may cause the affected plugins to malfunction.</source> </message> <message> <source>Character Types</source> - <translation>Tipi di carattere</translation> + <translation>Tipi carattere</translation> </message> <message> <source>Upper Case Letters</source> @@ -2907,7 +2912,7 @@ Questa versione non è pensata per essere utilizzata in ambito di produzione.</t </message> <message> <source>Trying to run KDF without cipher</source> - <translation>Sto cercando di eseguire KDF senza cifratura</translation> + <translation>Tentativo di eseguire KDF senza crittografia</translation> </message> <message> <source>Passphrase is required to decrypt this key</source> @@ -2987,7 +2992,7 @@ Questa versione non è pensata per essere utilizzata in ambito di produzione.</t <message> <source>Sh&ow a notification when credentials are requested</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation>Visualizza una n&otifica quando sono richieste le credenziali</translation> + <translation>Visualizza una n&otifica quando sono richeste le credenziali</translation> </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> @@ -3713,7 +3718,7 @@ Sblocca il database selezionato o scegline un altro che sia sbloccato.</translat </message> <message numerus="yes"> <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> - <translation><numerusform>Rimossa con successo %n chiave di cifratura dalle impostazioni di KeePassX/Http.</numerusform><numerusform>Rimosse con successo %n chiavi di cifratura dalle impostazioni di KeePassX/Http.</numerusform></translation> + <translation><numerusform>Rimossa con successo %n chiave di cifratura dalle impostazioni di KeePassX/Http.</numerusform><numerusform>Rimossa(e) con successo %n chiave(i) di cifratura dalle impostazioni di KeePassX/Http.</numerusform></translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -3831,15 +3836,15 @@ Sblocca il database selezionato o scegline un altro che sia sbloccato.</translat </message> <message> <source>Show a system tray icon</source> - <translation>Visualizza un'icona nell'area di notifica di sistema</translation> + <translation>Visualizza un'icona nell'area di notifica del sistema</translation> </message> <message> <source>Hide window to system tray when minimized</source> - <translation>Nascondi la finestra nell'area di notifica di sistema quando viene minimizzata</translation> + <translation>Nascondi la finestra nell'area di notifica del sistema quando viene minimizzata</translation> </message> <message> <source>Hide window to system tray instead of app exit</source> - <translation>Nascondi la finestra nell'area di notifica di sistema invece di chiudere l'applicazione</translation> + <translation>Nascondi la finestra nella barra di sistema invece di chiudere l'applicazione</translation> </message> <message> <source>Dark system tray icon</source> diff --git a/share/translations/keepassx_ja.ts b/share/translations/keepassx_ja.ts index 1a7afdd9a..1a3c9317f 100644 --- a/share/translations/keepassx_ja.ts +++ b/share/translations/keepassx_ja.ts @@ -60,7 +60,7 @@ CPU architecture: %2 Kernel: %3 %4</source> <translation>オペレーティングシステム: %1 -CPU アーキテクチャ: %2 +CPU アーキテクチャー: %2 カーネル: %3 %4</translation> </message> <message> @@ -227,7 +227,7 @@ Please select whether you want to allow access.</source> </message> <message> <source>Enable KeepassXC browser integration</source> - <translation>KeepassXC のブラウザ統合を有効にする</translation> + <translation>KeepassXC のブラウザー統合を有効にする</translation> </message> <message> <source>General</source> @@ -235,7 +235,7 @@ Please select whether you want to allow access.</source> </message> <message> <source>Enable integration for these browsers:</source> - <translation>これらのブラウザの統合を有効にする:</translation> + <translation>これらのブラウザーの統合を有効にする:</translation> </message> <message> <source>&Google Chrome</source> @@ -290,7 +290,7 @@ Please select whether you want to allow access.</source> </message> <message> <source>&Disconnect all browsers</source> - <translation>全てのブラウザの接続を断つ(&D)</translation> + <translation>全てのブラウザーの接続を断つ(&D)</translation> </message> <message> <source>Forget all remembered &permissions</source> @@ -337,11 +337,11 @@ Please select whether you want to allow access.</source> </message> <message> <source>Support a proxy application between KeePassXC and browser extension.</source> - <translation>KeePassXC とブラウザの拡張機能との間でプロキシアプリケーションをサポートします。</translation> + <translation>KeePassXC とブラウザーの拡張機能との間でプロキシアプリケーションをサポートします。</translation> </message> <message> <source>Use a &proxy application between KeePassXC and browser extension</source> - <translation>KeePassXC とブラウザの拡張機能との間でプロキシアプリケーションを使用する(&P)</translation> + <translation>KeePassXC とブラウザーの拡張機能との間でプロキシアプリケーションを使用する(&P)</translation> </message> <message> <source>Use a custom proxy location if you installed a proxy manually.</source> @@ -373,6 +373,10 @@ Please select whether you want to allow access.</source> <source>Select custom proxy location</source> <translation>カスタムプロキシを選択する</translation> </message> + <message> + <source>We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</source> + <translation>申し訳ありませんが、今の所 KeePassXC-Browser は Snap リリースではサポートしていません。</translation> + </message> </context> <context> <name>BrowserService</name> @@ -444,7 +448,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message numerus="yes"> <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> - <translation><numerusform>KeePassXC の設定から %n 個の暗号化キーが無事に削除されました。</numerusform></translation> + <translation><numerusform>KeePassXC の設定から %n 個の暗号化キーが正常に削除されました。</numerusform></translation> </message> <message> <source>Removing stored permissions…</source> @@ -460,7 +464,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message numerus="yes"> <source>Successfully removed permissions from %n entry(s).</source> - <translation><numerusform>%n 個のエントリーからアクセス許可が無事に削除されました。</numerusform></translation> + <translation><numerusform>%n 個のエントリーからアクセス許可が正常に削除されました。</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -653,7 +657,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Original data: </source> - <translation>元データ: </translation> + <translation>元データ:</translation> </message> <message> <source>Error(s) detected in CSV file !</source> @@ -857,7 +861,7 @@ If you keep this number, your database may be too easy to crack!</source> <message numerus="yes"> <source> MiB</source> <comment>Abbreviation for Mebibytes (KDF settings)</comment> - <translation><numerusform> MiB</numerusform></translation> + <translation><numerusform>MiB</numerusform></translation> </message> <message numerus="yes"> <source> thread(s)</source> @@ -1019,7 +1023,7 @@ Discard changes and close anyway?</source> <message> <source>"%1" was modified. Save changes?</source> - <translation>"%1" は更新されています。 + <translation>"%1" は編集されています。 変更を保存しますか?</translation> </message> <message> @@ -1032,7 +1036,7 @@ Save changes?</source> </message> <message> <source>Save database as</source> - <translation>ファイル名をつけてデータベースを保存</translation> + <translation>データベースを別名で保存</translation> </message> <message> <source>Export database to CSV file</source> @@ -1191,10 +1195,6 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>ゴミ箱にある全項目を永久に削除してもよろしいですか?</translation> </message> - <message> - <source>Entry updated successfully.</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DetailsWidget</name> @@ -1232,7 +1232,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Searching</source> - <translation>検索中</translation> + <translation>検索</translation> </message> <message> <source>Attributes</source> @@ -1371,11 +1371,11 @@ Do you want to merge your changes?</source> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation><numerusform>%n 週間</numerusform></translation> + <translation><numerusform>%n週間</numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation><numerusform>%n ヶ月</numerusform></translation> + <translation><numerusform>%nヶ月</numerusform></translation> </message> <message> <source>1 year</source> @@ -1383,15 +1383,15 @@ Do you want to merge your changes?</source> </message> <message> <source>Apply generated password?</source> - <translation type="unfinished"/> + <translation>生成されたパスワードを適用しますか?</translation> </message> <message> <source>Do you want to apply the generated password to this entry?</source> - <translation type="unfinished"/> + <translation>生成されたパスワードをこのエントリーに適用しますか?</translation> </message> <message> <source>Entry updated successfully.</source> - <translation type="unfinished"/> + <translation>エントリーは正常に更新されました。</translation> </message> </context> <context> @@ -1426,11 +1426,11 @@ Do you want to merge your changes?</source> </message> <message> <source>Foreground Color:</source> - <translation type="unfinished"/> + <translation>文字色:</translation> </message> <message> <source>Background Color:</source> - <translation type="unfinished"/> + <translation>背景色:</translation> </message> </context> <context> @@ -1465,7 +1465,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Use a specific sequence for this association:</source> - <translation>このアソシエーションに特定のシーケンスを使用する:</translation> + <translation>この関連付けに特定のシーケンスを使用する:</translation> </message> </context> <context> @@ -1641,7 +1641,7 @@ Do you want to merge your changes?</source> <name>EditGroupWidgetMain</name> <message> <source>Name</source> - <translation>名前</translation> + <translation>グループ名</translation> </message> <message> <source>Notes</source> @@ -1747,7 +1747,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Plugin Data</source> - <translation type="unfinished"/> + <translation>プラグインデータ</translation> </message> <message> <source>Remove</source> @@ -1755,20 +1755,21 @@ Do you want to merge your changes?</source> </message> <message> <source>Delete plugin data?</source> - <translation type="unfinished"/> + <translation>プラグインデータを削除しますか?</translation> </message> <message> <source>Do you really want to delete the selected plugin data? This may cause the affected plugins to malfunction.</source> - <translation type="unfinished"/> + <translation>本当に選択したプラグインデータを削除しますか? +プラグインの動作に影響を与える可能性があります。</translation> </message> <message> <source>Key</source> - <translation type="unfinished"/> + <translation>キー</translation> </message> <message> <source>Value</source> - <translation type="unfinished"/> + <translation>値</translation> </message> </context> <context> @@ -1898,7 +1899,7 @@ This may cause the affected plugins to malfunction.</source> <message> <source>Ref: </source> <comment>Reference abbreviation</comment> - <translation>参照: </translation> + <translation>参照:</translation> </message> <message> <source>Group</source> @@ -1975,6 +1976,10 @@ This may cause the affected plugins to malfunction.</source> <source>Reset to defaults</source> <translation>デフォルトにリセット</translation> </message> + <message> + <source>Attachments (icon)</source> + <translation>添付ファイル (アイコン)</translation> + </message> </context> <context> <name>Group</name> @@ -2817,7 +2822,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> - <translation><p>ブラウザ統合に KeePassHTTP を使用しています。この機能は将来的に廃止され、削除されます。<br>代わりに KeePassXC-Browser を使用してください。移行に関するヘルプは <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> を参照してください (%1 / 3 回目の警告)。</p></translation> + <translation><p>ブラウザー統合に KeePassHTTP を使用しています。この機能は将来的に廃止され、削除されます。<br>代わりに KeePassXC-Browser を使用してください。移行に関するヘルプは <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> を参照してください (%1 / 3 回目の警告)。</p></translation> </message> <message> <source>read-only</source> @@ -3540,11 +3545,11 @@ Available commands: </message> <message> <source>Legacy Browser Integration</source> - <translation>レガシーなブラウザ統合</translation> + <translation>レガシーなブラウザー統合</translation> </message> <message> <source>Browser Integration</source> - <translation>ブラウザ統合</translation> + <translation>ブラウザー統合</translation> </message> <message> <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source> @@ -3617,15 +3622,15 @@ Available commands: </message> <message> <source>Error writing to underlying device: </source> - <translation>基本デバイスへの書き込み時にエラーが発生しました: </translation> + <translation>基本デバイスへの書き込み時にエラーが発生しました:</translation> </message> <message> <source>Error opening underlying device: </source> - <translation>基本デバイスを開く際にエラーが発生しました: </translation> + <translation>基本デバイスを開く時にエラーが発生しました:</translation> </message> <message> <source>Error reading data from underlying device: </source> - <translation>基本デバイスから読み込み時にエラーが発生しました: </translation> + <translation>基本デバイスから読み込み時にエラーが発生しました:</translation> </message> <message> <source>Internal zlib error when decompressing: </source> @@ -3714,7 +3719,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message numerus="yes"> <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> - <translation><numerusform>KeePassX/Http の設定から %n 個の暗号化キーが無事に削除されました。</numerusform></translation> + <translation><numerusform>KeePassX/Http の設定から %n 個の暗号化キーが正常に削除されました。</numerusform></translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -3746,7 +3751,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message numerus="yes"> <source>Successfully removed permissions from %n entries.</source> - <translation><numerusform>%n 個のエントリーからアクセス許可が無事に削除されました。</numerusform></translation> + <translation><numerusform>%n 個のエントリーからアクセス許可が正常に削除されました。</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> diff --git a/share/translations/keepassx_ko.ts b/share/translations/keepassx_ko.ts index 91be825e7..8dc271166 100644 --- a/share/translations/keepassx_ko.ts +++ b/share/translations/keepassx_ko.ts @@ -11,7 +11,7 @@ </message> <message> <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a> 사이트에 버그를 보고해 주십시오</translation> + <translation> <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a> 사이트에 버그를 보고해 주십시오</translation> </message> <message> <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> @@ -372,6 +372,10 @@ Please select whether you want to allow access.</source> <source>Select custom proxy location</source> <translation>사용자 정의 프록시 위치 지정</translation> </message> + <message> + <source>We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>BrowserService</name> @@ -443,7 +447,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message numerus="yes"> <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> - <translation><numerusform>KeePassXC 설정에서 암호화 키 %n개를 삭제했습니다.</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform></translation> </message> <message> <source>Removing stored permissions…</source> @@ -459,7 +463,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message numerus="yes"> <source>Successfully removed permissions from %n entry(s).</source> - <translation><numerusform>항목 %n개에 저장된 권한을 삭제했습니다.</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -651,7 +655,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Original data: </source> - <translation>원본 데이터: </translation> + <translation>원본 데이터:</translation> </message> <message> <source>Error(s) detected in CSV file !</source> @@ -1140,7 +1144,7 @@ Disable safe saves and try again?</source> </message> <message> <source>Unable to calculate master key</source> - <translation>마스터 키를 계산할 수 없습니다</translation> + <translation>마스터 키를 계산할 수 없음</translation> </message> <message> <source>No current database.</source> @@ -1188,10 +1192,6 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>휴지통에 있는 항목을 영원히 삭제하시겠습니까?</translation> </message> - <message> - <source>Entry updated successfully.</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DetailsWidget</name> @@ -1815,7 +1815,7 @@ This may cause the affected plugins to malfunction.</source> </message> <message numerus="yes"> <source>Are you sure you want to remove %n attachment(s)?</source> - <translation><numerusform>첨부 항목 %n개를 삭제하시겠습니까?</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform></translation> </message> <message> <source>Confirm Remove</source> @@ -1972,6 +1972,10 @@ This may cause the affected plugins to malfunction.</source> <source>Reset to defaults</source> <translation>기본값으로 복원</translation> </message> + <message> + <source>Attachments (icon)</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Group</name> @@ -2476,7 +2480,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Unable to calculate master key</source> - <translation>마스터 키를 계산할 수 없습니다</translation> + <translation>마스터 키를 계산할 수 없음</translation> </message> <message> <source>Wrong key or database file is corrupt.</source> @@ -3609,23 +3613,23 @@ Available commands: <name>QtIOCompressor</name> <message> <source>Internal zlib error when compressing: </source> - <translation>압축 중 내부 zlib 오류 발생: </translation> + <translation>압축 중 내부 zlib 오류 발생:</translation> </message> <message> <source>Error writing to underlying device: </source> - <translation>장치에 기록하는 중 오류 발생: </translation> + <translation>장치에 기록하는 중 오류 발생:</translation> </message> <message> <source>Error opening underlying device: </source> - <translation>장치를 여는 중 오류 발생: </translation> + <translation>장치를 여는 중 오류 발생:</translation> </message> <message> <source>Error reading data from underlying device: </source> - <translation>장치에서 읽는 중 오류 발생: </translation> + <translation>장치에서 읽는 중 오류 발생:</translation> </message> <message> <source>Internal zlib error when decompressing: </source> - <translation>압축 푸는 중 내부 zlib 오류 발생: </translation> + <translation>압축 푸는 중 내부 zlib 오류 발생:</translation> </message> </context> <context> @@ -4024,7 +4028,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Expires in</source> - <translation>만료 시간</translation> + <translation>만료 시간:</translation> </message> <message> <source>seconds</source> diff --git a/share/translations/keepassx_lt.ts b/share/translations/keepassx_lt.ts index 6ab9b483d..8ec502b80 100644 --- a/share/translations/keepassx_lt.ts +++ b/share/translations/keepassx_lt.ts @@ -45,7 +45,7 @@ </message> <message> <source>Revision: %1</source> - <translation>Poversijis: %1</translation> + <translation>Revizija: %1</translation> </message> <message> <source>Distribution: %1</source> @@ -373,6 +373,10 @@ Pasirinkite, ar norite leisti prieigą.</translation> <source>Select custom proxy location</source> <translation type="unfinished"/> </message> + <message> + <source>We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>BrowserService</name> @@ -441,7 +445,7 @@ Prašome atrakinti pasirinktą duomenų bazę arba pasirinkti kitą, kuri būtų </message> <message numerus="yes"> <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> - <translation><numerusform>%n šifravimo raktas sėkmingai pašalintas iš KeePassXC nustatymų.</numerusform><numerusform>%n šifravimo raktai sėkmingai pašalinti iš KeePassXC nustatymų.</numerusform><numerusform>%n šifravimo raktų sėkmingai pašalinta iš KeePassXC nustatymų.</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> </message> <message> <source>Removing stored permissions…</source> @@ -564,7 +568,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Append ' - Clone' to title</source> - <translation>Pridėti prie pavadinimo " - Dublikatas"</translation> + <translation>Pridėti prie antraštės " - Dublikatas"</translation> </message> <message> <source>Replace username and password with references</source> @@ -844,12 +848,12 @@ If you keep this number, your database may be too easy to crack!</source> <message numerus="yes"> <source> MiB</source> <comment>Abbreviation for Mebibytes (KDF settings)</comment> - <translation><numerusform> MiB</numerusform><numerusform> MiB</numerusform><numerusform> MiB</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> </message> <message numerus="yes"> <source> thread(s)</source> <comment>Threads for parallel execution (KDF settings)</comment> - <translation><numerusform> gija</numerusform><numerusform> gijos</numerusform><numerusform> gijų</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> </message> </context> <context> @@ -983,7 +987,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Open KeePass 1 database</source> - <translation>Atverkite KeePass 1 duomenų bazę</translation> + <translation>Atverti KeePass 1 duomenų bazę</translation> </message> <message> <source>KeePass 1 database</source> @@ -991,12 +995,12 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Close?</source> - <translation>Užverti?</translation> + <translation>Uždaryti?</translation> </message> <message> <source>"%1" is in edit mode. Discard changes and close anyway?</source> - <translation>"%1" yra redagavimo veiksenoje. + <translation>"%1" yra taisymo veiksenoje. Vis tiek atmesti pakeitimus ir užverti?</translation> </message> <message> @@ -1044,7 +1048,7 @@ Save changes?</source> <message> <source>Can't lock the database as you are currently editing it. Please press cancel to finish your changes or discard them.</source> - <translation>Nepavyksta užrakinti duomenų bazės, kadangi šiuo metu ją redaguojate. + <translation>Nepavyksta užrakinti duomenų bazės, kadangi šiuo metu ją taisote. Spauskite atšaukti, kad užbaigtumėte savo pakeitimus arba juos atmestumėte.</translation> </message> <message> @@ -1105,7 +1109,7 @@ Disable safe saves and try again?</source> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Ar tikrai norite perkelti %n įrašą į šiukšlinę?</numerusform><numerusform>Ar tikrai norite perkelti %n įrašus į šiukšlinę?</numerusform><numerusform>Ar tikrai norite perkelti %n įrašų į šiukšlinę?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1177,10 +1181,6 @@ Ar norite sulieti savo pakeitimus?</translation> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>Ar tikrai norite negrįžtamai viską ištrinti iš savo šiukšlinės?</translation> </message> - <message> - <source>Entry updated successfully.</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DetailsWidget</name> @@ -1325,7 +1325,7 @@ Ar norite sulieti savo pakeitimus?</translation> </message> <message> <source>Edit entry</source> - <translation>Keisti įrašą</translation> + <translation>Taisyti įrašą</translation> </message> <message> <source>Different passwords supplied.</source> @@ -1369,7 +1369,7 @@ Ar norite sulieti savo pakeitimus?</translation> </message> <message> <source>Apply generated password?</source> - <translation type="unfinished"/> + <translation>Naudoti sugeneruotą slaptaždoį?</translation> </message> <message> <source>Do you want to apply the generated password to this entry?</source> @@ -1608,7 +1608,7 @@ Ar norite sulieti savo pakeitimus?</translation> </message> <message> <source>Edit group</source> - <translation>Keisti grupę</translation> + <translation>Taisyti grupę</translation> </message> <message> <source>Enable</source> @@ -1804,7 +1804,7 @@ This may cause the affected plugins to malfunction.</source> </message> <message numerus="yes"> <source>Are you sure you want to remove %n attachment(s)?</source> - <translation><numerusform>Ar tikrai norite pašalinti %n priedą?</numerusform><numerusform>Ar tikrai norite pašalinti %n priedus?</numerusform><numerusform>Ar tikrai norite pašalinti %n priedų?</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> </message> <message> <source>Confirm Remove</source> @@ -1961,6 +1961,10 @@ This may cause the affected plugins to malfunction.</source> <source>Reset to defaults</source> <translation>Atstatyti į numatytuosius</translation> </message> + <message> + <source>Attachments (icon)</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Group</name> @@ -2743,7 +2747,7 @@ Tai yra vienakryptis perkėlimas. Jūs negalėsite atverti importuotos duomenų </message> <message> <source>Copy title to clipboard</source> - <translation>Kopijuoti pavadinimą į iškarpinę</translation> + <translation>Kopijuoti antraštę į iškarpinę</translation> </message> <message> <source>&URL</source> @@ -3233,7 +3237,7 @@ Naudojamas numatytasis prievadas 19455.</translation> </message> <message> <source>Key change was not successful</source> - <translation type="unfinished"/> + <translation>Rakto keitimas nepavyko</translation> </message> <message> <source>Encryption key is not recognized</source> @@ -3326,7 +3330,7 @@ Naudojamas numatytasis prievadas 19455.</translation> </message> <message> <source>Timeout in seconds before clearing the clipboard.</source> - <translation>Skirtas laikas, sekundėmis, prieš išvalant iškarpinę.</translation> + <translation>Laiko limitas, sekundėmis, prieš išvalant iškarpinę.</translation> </message> <message> <source>Edit an entry.</source> @@ -3334,7 +3338,7 @@ Naudojamas numatytasis prievadas 19455.</translation> </message> <message> <source>Title for the entry.</source> - <translation>Įrašo pavadinimas.</translation> + <translation>Įrašo antraštė.</translation> </message> <message> <source>title</source> @@ -3435,7 +3439,7 @@ Prieinamos komandos: </message> <message> <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> - <translation type="unfinished"/> + <translation>Požymių, kuriuos rodyti, pavadinimai. Ši parinktis gali būti nurodyta daugiau nei vieną kartą, kiekvienoje eilutėje nurodyta tvarka rodant po atskirą požymį. Jei nėra nurodyti jokie požymiai, bus nurodyta numatytųjų požymių santrauka.</translation> </message> <message> <source>attribute</source> @@ -3553,7 +3557,7 @@ Prieinamos komandos: </message> <message> <source>count</source> - <translation type="unfinished"/> + <translation>kiekis</translation> </message> <message> <source>Wordlist for the diceware generator. @@ -3695,7 +3699,7 @@ Prašome atrakinti pasirinktą duomenų bazę arba pasirinkti kitą, kuri būtų </message> <message numerus="yes"> <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n šifravimo raktas sėkmingai pašalintas iš KeePassX/Http nustatymų.</numerusform><numerusform>%n šifravimo raktai sėkmingai pašalinti iš KeePassX/Http nustatymų.</numerusform><numerusform>%n šifravimo raktų sėkmingai pašalinta iš KeePassX/Http nustatymų.</numerusform></translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -3727,7 +3731,7 @@ Prašome atrakinti pasirinktą duomenų bazę arba pasirinkti kitą, kuri būtų </message> <message numerus="yes"> <source>Successfully removed permissions from %n entries.</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Leidimai sėkmingai pašalinti iš %n įrašo.</numerusform><numerusform>Leidimai sėkmingai pašalinti iš %n įrašų.</numerusform><numerusform>Leidimai sėkmingai pašalinti iš %n įrašų.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -3862,7 +3866,7 @@ Prašome atrakinti pasirinktą duomenų bazę arba pasirinkti kitą, kuri būtų </message> <message> <source>Startup</source> - <translation type="unfinished"/> + <translation>Įjungimo</translation> </message> <message> <source>File Management</source> @@ -3874,7 +3878,7 @@ Prašome atrakinti pasirinktą duomenų bazę arba pasirinkti kitą, kuri būtų </message> <message> <source>Backup database file before saving</source> - <translation type="unfinished"/> + <translation>Išsaugoti duomenų bazę prieš išsaugant</translation> </message> <message> <source>Entry Management</source> diff --git a/share/translations/keepassx_nl_NL.ts b/share/translations/keepassx_nl_NL.ts index 546f8524c..1ea6ac0f7 100644 --- a/share/translations/keepassx_nl_NL.ts +++ b/share/translations/keepassx_nl_NL.ts @@ -19,15 +19,15 @@ </message> <message> <source>Contributors</source> - <translation>Bijdragers</translation> + <translation>Bijdragen van</translation> </message> <message> <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Toon bijdragingen op GitHub</a></translation> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Toon bijdragen op GitHub</a></translation> </message> <message> <source>Debug Info</source> - <translation>Debuggingsinformatie</translation> + <translation>Debug informatie</translation> </message> <message> <source>Include the following information whenever you report a bug:</source> @@ -126,7 +126,7 @@ Geef aan of je toegang wilt toestaan of niet.</translation> </message> <message> <source>Auto-Type</source> - <translation>Auto-typen - KeePassX</translation> + <translation>Auto-typen</translation> </message> <message> <source>The Syntax of your Auto-Type statement is incorrect!</source> @@ -272,7 +272,7 @@ Geef aan of je toegang wilt toestaan of niet.</translation> </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation>Geeft alleen de beste overeenkomsten weer voor een specifieke URL in plaats van alle invoer voor het hele domein.</translation> + <translation>Geeft alleen de beste overeenkomsten terug voor een specifieke URL in plaats van alle invoer voor het hele domein.</translation> </message> <message> <source>&Return only best-matching credentials</source> @@ -373,6 +373,10 @@ Geef aan of je toegang wilt toestaan of niet.</translation> <source>Select custom proxy location</source> <translation>Selecteer aangepaste proxy locatie</translation> </message> + <message> + <source>We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>BrowserService</name> @@ -444,7 +448,7 @@ Ontgrendel de geselecteerde database of kies een ontgrendelde database.</transla </message> <message numerus="yes"> <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> - <translation><numerusform>Coderingssleutel uit KeePassXC instellingen verwijderd.</numerusform><numerusform>%n coderingssleutels uit KeePassXC instellingen verwijderd.</numerusform></translation> + <translation><numerusform>%n encryptie-sleutel verwijderd uit KeePassXC-instellingen.</numerusform><numerusform>%n encryptie-sleutels verwijderd uit KeePassXC-instellingen.</numerusform></translation> </message> <message> <source>Removing stored permissions…</source> @@ -460,7 +464,7 @@ Ontgrendel de geselecteerde database of kies een ontgrendelde database.</transla </message> <message numerus="yes"> <source>Successfully removed permissions from %n entry(s).</source> - <translation><numerusform>Permissies zijn verwijderd uit %n item(s).</numerusform><numerusform>Permissies zijn verwijderd uit %n item(s).</numerusform></translation> + <translation><numerusform>Permissies zijn verwijderd uit %n item.</numerusform><numerusform>Permissies zijn verwijderd uit %n items.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -535,7 +539,7 @@ Ontgrendel de geselecteerde database of kies een ontgrendelde database.</transla </message> <message> <source>Different passwords supplied.</source> - <translation>Je hebt verschillende wachtwoorden opgegeven.</translation> + <translation>U heeft verschillende wachtwoorden opgegeven.</translation> </message> <message> <source>Failed to set %1 as the Key file: @@ -688,15 +692,15 @@ Overweeg aub een nieuw sleutelbestand te genereren.</translation> <name>CsvParserModel</name> <message numerus="yes"> <source>%n byte(s), </source> - <translation><numerusform>%n byte(s), </numerusform><numerusform>%n byte(s), </numerusform></translation> + <translation><numerusform>1 byte,</numerusform><numerusform>%n bytes,</numerusform></translation> </message> <message numerus="yes"> <source>%n row(s), </source> - <translation><numerusform>%n rij(en), </numerusform><numerusform>%n rij(en), </numerusform></translation> + <translation><numerusform>1 rij,</numerusform><numerusform>%n rijen,</numerusform></translation> </message> <message numerus="yes"> <source>%n column(s)</source> - <translation><numerusform>%n kolom(men)</numerusform><numerusform>%n kolom(men)</numerusform></translation> + <translation><numerusform>1 kolom</numerusform><numerusform>%n kolommen</numerusform></translation> </message> </context> <context> @@ -727,7 +731,7 @@ Overweeg aub een nieuw sleutelbestand te genereren.</translation> </message> <message> <source>Unable to open the database.</source> - <translation>Het is niet mogelijk om de database te openen.</translation> + <translation>Niet mogelijk om de database te openen.</translation> </message> <message> <source>Can't open key file</source> @@ -779,7 +783,7 @@ Overweeg aub een nieuw sleutelbestand te genereren.</translation> </message> <message> <source>Unable to open the database.</source> - <translation>Het is niet mogelijk om de database te openen.</translation> + <translation>Niet mogelijk om de database te openen.</translation> </message> <message> <source>Database opened fine. Nothing to do.</source> @@ -855,12 +859,12 @@ Als je dit aantal aanhoud is het mogelijk heel gemakkelijk om de database te kra <message numerus="yes"> <source> MiB</source> <comment>Abbreviation for Mebibytes (KDF settings)</comment> - <translation><numerusform> MiB</numerusform><numerusform> MiB</numerusform></translation> + <translation><numerusform>MiB</numerusform><numerusform>MiB</numerusform></translation> </message> <message numerus="yes"> <source> thread(s)</source> <comment>Threads for parallel execution (KDF settings)</comment> - <translation><numerusform>executie thread</numerusform><numerusform> executie thread(s)</numerusform></translation> + <translation><numerusform>executie thread</numerusform><numerusform> executie threads</numerusform></translation> </message> </context> <context> @@ -930,7 +934,7 @@ Als je dit aantal aanhoud is het mogelijk heel gemakkelijk om de database te kra </message> <message> <source> MiB</source> - <translation>MiB</translation> + <translation> MiB</translation> </message> <message> <source>Use recycle bin</source> @@ -1085,7 +1089,7 @@ Uitschakelen van veilig opslaan en opnieuw proberen?</translation> </message> <message> <source>Change master key</source> - <translation>Hoofdsleutel wijzigen</translation> + <translation>Wijzig hoofdsleutel</translation> </message> <message> <source>Delete entry?</source> @@ -1105,7 +1109,7 @@ Uitschakelen van veilig opslaan en opnieuw proberen?</translation> </message> <message> <source>Move entry to recycle bin?</source> - <translation>Wilt je het item naar de prullenbak verplaatsen?</translation> + <translation>Wilt u het item naar de prullenbak verplaatsen?</translation> </message> <message> <source>Do you really want to move entry "%1" to the recycle bin?</source> @@ -1117,7 +1121,7 @@ Uitschakelen van veilig opslaan en opnieuw proberen?</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>Wil je echt %n item(s) naar de Prullenbak verplaatsen?</numerusform><numerusform>Wil je echt %n item(s) naar de Prullenbak verplaatsen?</numerusform></translation> + <translation><numerusform>Wil je echt %n item naar de Prullenbak verplaatsen?</numerusform><numerusform>Wil je echt %n item(s) naar de Prullenbak verplaatsen?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1189,10 +1193,6 @@ Wil je de wijzigingen samenvoegen?</translation> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>Weet je zeker dat je alles uit de prullenbak definitief wil verwijderen?</translation> </message> - <message> - <source>Entry updated successfully.</source> - <translation>Het item is bijgewerkt.</translation> - </message> </context> <context> <name>DetailsWidget</name> @@ -1226,7 +1226,7 @@ Wil je de wijzigingen samenvoegen?</translation> </message> <message> <source>Autotype</source> - <translation>Auto-typen</translation> + <translation>Autotype</translation> </message> <message> <source>Searching</source> @@ -1341,7 +1341,7 @@ Wil je de wijzigingen samenvoegen?</translation> </message> <message> <source>Different passwords supplied.</source> - <translation>Je hebt verschillende wachtwoorden opgegeven.</translation> + <translation>Verschillende wachtwoorden opgegeven.</translation> </message> <message> <source>New attribute</source> @@ -1369,11 +1369,11 @@ Wil je de wijzigingen samenvoegen?</translation> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation><numerusform>1 week</numerusform><numerusform>%n weken</numerusform></translation> + <translation><numerusform>%n week</numerusform><numerusform>%n weken</numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation><numerusform>1 maand</numerusform><numerusform>%n maanden</numerusform></translation> + <translation><numerusform>%n maand</numerusform><numerusform>%n maanden</numerusform></translation> </message> <message> <source>1 year</source> @@ -1424,7 +1424,7 @@ Wil je de wijzigingen samenvoegen?</translation> </message> <message> <source>Foreground Color:</source> - <translation>Kleur voorgrond:</translation> + <translation>Voorgrond kleur:</translation> </message> <message> <source>Background Color:</source> @@ -1435,15 +1435,15 @@ Wil je de wijzigingen samenvoegen?</translation> <name>EditEntryWidgetAutoType</name> <message> <source>Enable Auto-Type for this entry</source> - <translation>Auto-typen activeren voor dit item</translation> + <translation>Auto-typen inschakelen voor dit item</translation> </message> <message> <source>Inherit default Auto-Type sequence from the &group</source> - <translation>Neem standaard Auto-typen volgorde over van de &groep</translation> + <translation>Erf standaard auto-typevolgorde van de &groep</translation> </message> <message> <source>&Use custom Auto-Type sequence:</source> - <translation>&Gebruik aangepaste Auto-typen volgorde:</translation> + <translation>&Gebruik aangepaste auto-typevolgorde:</translation> </message> <message> <source>Window Associations</source> @@ -1620,7 +1620,7 @@ Wil je de wijzigingen samenvoegen?</translation> </message> <message> <source>Edit group</source> - <translation>Bewerk groep</translation> + <translation>Groep wijzigen</translation> </message> <message> <source>Enable</source> @@ -1655,15 +1655,15 @@ Wil je de wijzigingen samenvoegen?</translation> </message> <message> <source>Auto-Type</source> - <translation>Auto-typen</translation> + <translation>Auto-typen - KeePassX</translation> </message> <message> <source>&Use default Auto-Type sequence of parent group</source> - <translation>&Gebruik de standaard Auto-typen volgorde van de bovenliggende groep</translation> + <translation>&Gebruik de standaard autot-type volgorde van de bovenliggende groep</translation> </message> <message> <source>Set default Auto-Type se&quence</source> - <translation>Stel de standaard Auto-Typen volgord&e in</translation> + <translation>Stel de standaard auto-type volgord&e in</translation> </message> </context> <context> @@ -1714,7 +1714,7 @@ Wil je de wijzigingen samenvoegen?</translation> </message> <message> <source>Custom icon already exists</source> - <translation>Icoon bestaat al</translation> + <translation>Speciaal pictogram bestaat al</translation> </message> <message> <source>Confirm Delete</source> @@ -1763,7 +1763,7 @@ Hierdoor werken de plugins mogelijk niet meer goed.</translation> </message> <message> <source>Key</source> - <translation>Sleutel</translation> + <translation>Wachtwoord</translation> </message> <message> <source>Value</source> @@ -1817,7 +1817,7 @@ Hierdoor werken de plugins mogelijk niet meer goed.</translation> </message> <message numerus="yes"> <source>Are you sure you want to remove %n attachment(s)?</source> - <translation><numerusform>Weet je zeker dat je de bijlage wilt verwijderen?</numerusform><numerusform>Weet je zeker dat je %n bijlagen wil verwijderen?</numerusform></translation> + <translation><numerusform>Weet je zeker dat je %n bijlage wil verwijderen?</numerusform><numerusform>Weet je zeker dat je %n bijlagen wil verwijderen?</numerusform></translation> </message> <message> <source>Confirm Remove</source> @@ -1952,7 +1952,7 @@ Hierdoor werken de plugins mogelijk niet meer goed.</translation> <name>EntryView</name> <message> <source>Customize View</source> - <translation>Weergave aanpassen</translation> + <translation>Pas weergave aan</translation> </message> <message> <source>Hide Usernames</source> @@ -1964,16 +1964,20 @@ Hierdoor werken de plugins mogelijk niet meer goed.</translation> </message> <message> <source>Fit to window</source> - <translation>Aanpassen aan venster</translation> + <translation>Pas aan venster aan</translation> </message> <message> <source>Fit to contents</source> - <translation>Aanpassen aan inhoud</translation> + <translation>Pas aan inhoud aan</translation> </message> <message> <source>Reset to defaults</source> <translation>Terugzetten op standaardwaarden</translation> </message> + <message> + <source>Attachments (icon)</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Group</name> @@ -2067,7 +2071,7 @@ Hierdoor werken de plugins mogelijk niet meer goed.</translation> </message> <message> <source>Unable to issue challenge-response.</source> - <translation>Challenge-response uitgeven niet mogelijk</translation> + <translation>Challenge-response uitgeven niet mogelijk.</translation> </message> <message> <source>Wrong key or database file is corrupt.</source> @@ -2078,7 +2082,7 @@ Hierdoor werken de plugins mogelijk niet meer goed.</translation> <name>Kdbx3Writer</name> <message> <source>Unable to issue challenge-response.</source> - <translation>Challenge-response uitgeven niet mogelijk</translation> + <translation>Challenge-response uitgeven niet mogelijk.</translation> </message> <message> <source>Unable to calculate master key</source> @@ -2422,7 +2426,7 @@ Deze actie is niet omkeerbaar. Je kunt de geïmporteerde database niet meer open </message> <message> <source>Unable to open the database.</source> - <translation>Het is niet mogelijk om de database te openen.</translation> + <translation>Niet mogelijk om de database te openen.</translation> </message> </context> <context> @@ -2433,7 +2437,7 @@ Deze actie is niet omkeerbaar. Je kunt de geïmporteerde database niet meer open </message> <message> <source>Not a KeePass database.</source> - <translation>Geen Keepass-database.</translation> + <translation>Geen Keepass-database</translation> </message> <message> <source>Unsupported encryption algorithm.</source> @@ -2441,7 +2445,7 @@ Deze actie is niet omkeerbaar. Je kunt de geïmporteerde database niet meer open </message> <message> <source>Unsupported KeePass database version.</source> - <translation>Niet-ondersteunde versie van Keepass-database.</translation> + <translation>Niet-ondersteunde versie van Keepass-database</translation> </message> <message> <source>Unable to read encryption IV</source> @@ -2581,11 +2585,11 @@ Deze actie is niet omkeerbaar. Je kunt de geïmporteerde database niet meer open <name>Main</name> <message> <source>Existing single-instance lock file is invalid. Launching new instance.</source> - <translation>Het bestaande single-instance lockbestand is niet geldig. Een nieuwe instance wordt gestart.</translation> + <translation>Het bestaande single-instance vergrendelbestand is niet geldig. Een nieuwe instance wordt gestart.</translation> </message> <message> <source>The lock file could not be created. Single-instance mode disabled.</source> - <translation>Het lockbestand kon niet worden aangemaakt. Single-instance mode uitgeschakeld.</translation> + <translation>Het vergrendelbestand kon niet worden aangemaakt. Single-instance mode uitgeschakeld.</translation> </message> <message> <source>Another instance of KeePassXC is already running.</source> @@ -2597,7 +2601,7 @@ Deze actie is niet omkeerbaar. Je kunt de geïmporteerde database niet meer open </message> <message> <source>KeePassXC - Error</source> - <translation>KeePassX - Fout</translation> + <translation>KeePassXC - Fout</translation> </message> </context> <context> @@ -2700,11 +2704,11 @@ Deze actie is niet omkeerbaar. Je kunt de geïmporteerde database niet meer open </message> <message> <source>&Database settings</source> - <translation>&Database instellingen</translation> + <translation>&Database-instellingen</translation> </message> <message> <source>Database settings</source> - <translation>Database instellingen</translation> + <translation>Database-instellingen</translation> </message> <message> <source>&Clone entry</source> @@ -2740,7 +2744,7 @@ Deze actie is niet omkeerbaar. Je kunt de geïmporteerde database niet meer open </message> <message> <source>&Perform Auto-Type</source> - <translation>&Voer Auto-typen uit</translation> + <translation>&Voer auto-typen uit</translation> </message> <message> <source>&Open URL</source> @@ -2836,7 +2840,7 @@ Deze actie is niet omkeerbaar. Je kunt de geïmporteerde database niet meer open </message> <message> <source>KeePass 2 Database</source> - <translation>KeePass 2-database</translation> + <translation>KeePass 2 Database</translation> </message> <message> <source>All files</source> @@ -2844,7 +2848,7 @@ Deze actie is niet omkeerbaar. Je kunt de geïmporteerde database niet meer open </message> <message> <source>Open database</source> - <translation>Database openen</translation> + <translation>Open database</translation> </message> <message> <source>Save repaired database</source> @@ -2852,7 +2856,7 @@ Deze actie is niet omkeerbaar. Je kunt de geïmporteerde database niet meer open </message> <message> <source>Writing the database failed.</source> - <translation>Het opslaan van de database is mislukt.</translation> + <translation>Opslaan van de database is mislukt.</translation> </message> <message> <source>Please touch the button on your YubiKey!</source> @@ -2978,7 +2982,7 @@ Deze versie is niet bedoeld voor productie doeleinden.</translation> </message> <message> <source>Enable KeePassHTTP server</source> - <translation>Schakel de KeePassHTTP server in</translation> + <translation>Activeer de KeePassHTTP server</translation> </message> <message> <source>General</source> @@ -2991,11 +2995,11 @@ Deze versie is niet bedoeld voor productie doeleinden.</translation> </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation>Geeft alleen de beste overeenkomsten weer voor een specifieke URL in plaats van alle invoer voor het hele domein.</translation> + <translation>Geeft alleen de beste overeenkomsten terug voor een specifieke URL in plaats van alle invoer voor het hele domein.</translation> </message> <message> <source>&Return only best matching entries</source> - <translation>Geef alleen de best ove&reenkomende invoer</translation> + <translation>Geef alleen de best ove&reenkomende invoer terug</translation> </message> <message> <source>Re&quest to unlock the database if it is locked</source> @@ -3003,7 +3007,7 @@ Deze versie is niet bedoeld voor productie doeleinden.</translation> </message> <message> <source>Only entries with the same scheme (http://, https://, ftp://, ...) are returned.</source> - <translation>Alleen invoer van hetzelfde schema (http://, https://, ftp://,...) worden gegeven.</translation> + <translation>Alleen invoer van hetzelfde schema (http://, https://, ftp://,...) worden teruggegeven.</translation> </message> <message> <source>&Match URL schemes</source> @@ -3055,7 +3059,7 @@ Deze versie is niet bedoeld voor productie doeleinden.</translation> </message> <message> <source>&Return advanced string fields which start with "KPH: "</source> - <translation>Geef geadvanceerde teken&reeks velden die met "KH: " beginnen.</translation> + <translation>&Geef geadvanceerde tekenreeks velden terug die met "KH: " beginnen.</translation> </message> <message> <source>HTTP Port:</source> @@ -3137,7 +3141,7 @@ Standaardpoort 19455 wordt gebruikt.</translation> </message> <message> <source>Exclude look-alike characters</source> - <translation>Sluit op elkaar lijkende tekens uit</translation> + <translation>Geen op elkaar lijkende tekens</translation> </message> <message> <source>Pick characters from every group</source> @@ -3345,7 +3349,7 @@ Standaardpoort 19455 wordt gebruikt.</translation> </message> <message> <source>Edit an entry.</source> - <translation>Een element bewerken.</translation> + <translation>Een item bewerken.</translation> </message> <message> <source>Title for the entry.</source> @@ -3420,7 +3424,7 @@ Beschikbare instructies: </message> <message> <source>Find entries quickly.</source> - <translation>Zoek invoer snel.</translation> + <translation>Zoek ingang snel.</translation> </message> <message> <source>Search term.</source> @@ -3448,7 +3452,7 @@ Beschikbare instructies: </message> <message> <source>Show an entry's information.</source> - <translation>Toon de informatie die hoort bij een invoer.</translation> + <translation>Toon de informatie die hoort bij een item.</translation> </message> <message> <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> @@ -3482,19 +3486,19 @@ Beschikbare instructies: </message> <message> <source>missing closing quote</source> - <translation>afsluitende aanhalingsteken ontbreekt</translation> + <translation>afsluitend aanhalingsteken ontbreekt</translation> </message> <message> <source>AES: 256-bit</source> - <translation>AES: 256-bits</translation> + <translation>AES: 256-bit</translation> </message> <message> <source>Twofish: 256-bit</source> - <translation>Twofish: 256-bits</translation> + <translation>Twofish: 256-bit</translation> </message> <message> <source>ChaCha20: 256-bit</source> - <translation>ChaCha20: 256-bits</translation> + <translation>ChaCha20: 256-bit</translation> </message> <message> <source>Argon2 (KDBX 4 – recommended)</source> @@ -3744,7 +3748,7 @@ Ontgrendel de geselecteerde database of kies een ontgrendelde database.</transla </message> <message numerus="yes"> <source>Successfully removed permissions from %n entries.</source> - <translation><numerusform>Permissies zijn verwijderd uit %n items.</numerusform><numerusform>Permissies zijn verwijderd uit %n items.</numerusform></translation> + <translation><numerusform>Permissies verwijderd uit %n item.</numerusform><numerusform>Permissies verwijderd uit %n items.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -3850,27 +3854,27 @@ Ontgrendel de geselecteerde database of kies een ontgrendelde database.</transla </message> <message> <source>Auto-Type</source> - <translation>Auto-typen</translation> + <translation>Auto-typen - KeePassX</translation> </message> <message> <source>Use entry title to match windows for global Auto-Type</source> - <translation>Laat vensternaam overeenkomen met item naam bij Auto-typen</translation> + <translation>Gebruik naam van item als vensternaam voor auto-typen</translation> </message> <message> <source>Use entry URL to match windows for global Auto-Type</source> - <translation>Laat URL overeenkomen met item URL bij Auto-typen</translation> + <translation>Laat URL overeenkomen met item URL bij auto-typen</translation> </message> <message> <source>Always ask before performing Auto-Type</source> - <translation>Vraag altijd voordat Auto-typen gebruikt wordt</translation> + <translation>Vraag altijd voordat auto-type gebruikt wordt</translation> </message> <message> <source>Global Auto-Type shortcut</source> - <translation>Globale sneltoets voor Auto-typen</translation> + <translation>Globale sneltoets voor auto-typen</translation> </message> <message> <source>Auto-Type delay</source> - <translation>Vertraging bij Auto-typen</translation> + <translation>auto-typevertraging</translation> </message> <message> <source> ms</source> @@ -3947,7 +3951,7 @@ Ontgrendel de geselecteerde database of kies een ontgrendelde database.</transla </message> <message> <source>Hide entry notes by default</source> - <translation>Verberg aantekening standaard</translation> + <translation>Verberg standaard item aantekeningen</translation> </message> <message> <source>Privacy</source> @@ -3955,7 +3959,7 @@ Ontgrendel de geselecteerde database of kies een ontgrendelde database.</transla </message> <message> <source>Use Google as fallback for downloading website icons</source> - <translation>Gebruik Google als alternatieve manier voor het downloaden van de websiteiconen</translation> + <translation>Gebruik Google om op terug te vallen voor het downloaden van de websiteiconen</translation> </message> <message> <source>Re-lock previously locked database after performing Auto-Type</source> @@ -3974,7 +3978,7 @@ Ontgrendel de geselecteerde database of kies een ontgrendelde database.</transla </message> <message> <source>Default RFC 6238 token settings</source> - <translation>Standaard RFC 6238 token instellingen</translation> + <translation>Standaard "RFC 6238 token" instellingen</translation> </message> <message> <source>Steam token settings</source> @@ -4075,7 +4079,7 @@ Ontgrendel de geselecteerde database of kies een ontgrendelde database.</transla <name>main</name> <message> <source>Remove an entry from the database.</source> - <translation>Verwijder een ingang uit het gegevensbestand.</translation> + <translation>Verwijder een item uit het gegevensbestand.</translation> </message> <message> <source>Path of the database.</source> @@ -4087,7 +4091,7 @@ Ontgrendel de geselecteerde database of kies een ontgrendelde database.</transla </message> <message> <source>KeePassXC - cross-platform password manager</source> - <translation>KeepassX - multi-platform wachtwoordbeheerder</translation> + <translation>KeepassXC - multi-platform wachtwoordbeheerder</translation> </message> <message> <source>filenames of the password databases to open (*.kdbx)</source> diff --git a/share/translations/keepassx_pl.ts b/share/translations/keepassx_pl.ts index 37919ae4a..04c5dc4b5 100644 --- a/share/translations/keepassx_pl.ts +++ b/share/translations/keepassx_pl.ts @@ -118,7 +118,7 @@ Wybierz, czy chcesz zezwolić na dostęp.</translation> <name>AutoType</name> <message> <source>Couldn't find an entry that matches the window title:</source> - <translation>Nie mogę znaleźć wpisu, który by pasował do tytułu okna:</translation> + <translation>Nie mogę znaleźć wpisu, który by pasował do tytułu okna: </translation> </message> <message> <source>Auto-Type - KeePassXC</source> @@ -373,6 +373,10 @@ Wybierz, czy chcesz zezwolić na dostęp.</translation> <source>Select custom proxy location</source> <translation>Wybierz niestandardową lokalizację proxy</translation> </message> + <message> + <source>We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</source> + <translation>Przykro nam, ale KeePassXC-Browser obecnie nie obsługuje wydań Snap.</translation> + </message> </context> <context> <name>BrowserService</name> @@ -460,7 +464,7 @@ Proszę odblokować wybraną bazę albo wybrać inną, która jest odblokowana.< </message> <message numerus="yes"> <source>Successfully removed permissions from %n entry(s).</source> - <translation><numerusform>Pomyślnie usunięto uprawnienia z %n wpisu.</numerusform><numerusform>Pomyślnie usunięto uprawnienia z %n wpisów.</numerusform><numerusform>Pomyślnie usunięto uprawnienia z %n wpisów.</numerusform><numerusform>Pomyślnie usunięto uprawnienia z %n wpisu(ów).</numerusform></translation> + <translation><numerusform>Pomyślnie usunięto uprawnienia z %n wpisu.</numerusform><numerusform>Pomyślnie usunięto uprawnienia z %n wpisów.</numerusform><numerusform>Pomyślnie usunięto uprawnienia z %n wpisów.</numerusform><numerusform>Pomyślnie usunięto uprawnienia z %n wpisów.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -519,7 +523,7 @@ Proszę odblokować wybraną bazę albo wybrać inną, która jest odblokowana.< </message> <message> <source>Unable to create Key File : </source> - <translation>Nie można utworzyć pliku klucza : </translation> + <translation>Nie można utworzyć pliku klucza :</translation> </message> <message> <source>Select a key file</source> @@ -641,11 +645,11 @@ Proszę rozważyć wygenerowanie nowego pliku klucza.</translation> </message> <message> <source>Empty fieldname </source> - <translation>Puste pole tytuł </translation> + <translation>Puste pole tytuł</translation> </message> <message> <source>column </source> - <translation>kolumna </translation> + <translation>kolumna</translation> </message> <message> <source>Imported from CSV file</source> @@ -653,7 +657,7 @@ Proszę rozważyć wygenerowanie nowego pliku klucza.</translation> </message> <message> <source>Original data: </source> - <translation>Oryginalne dane: </translation> + <translation>Oryginalne dane:</translation> </message> <message> <source>Error(s) detected in CSV file !</source> @@ -689,15 +693,15 @@ Proszę rozważyć wygenerowanie nowego pliku klucza.</translation> <name>CsvParserModel</name> <message numerus="yes"> <source>%n byte(s), </source> - <translation><numerusform>%n bajt, </numerusform><numerusform>%n bajty, </numerusform><numerusform>%n bajtów, </numerusform><numerusform>%n bajtów, </numerusform></translation> + <translation><numerusform>%n bajt, </numerusform><numerusform>%n bajty, </numerusform><numerusform>%n bajtów, </numerusform><numerusform>%n bajt, </numerusform></translation> </message> <message numerus="yes"> <source>%n row(s), </source> - <translation><numerusform>%n rząd, </numerusform><numerusform>%n rzędy, </numerusform><numerusform>%n rzędów, </numerusform><numerusform>%n rzędów, </numerusform></translation> + <translation><numerusform>%n rząd, </numerusform><numerusform>%n rzędy, </numerusform><numerusform>%n rzędów, </numerusform><numerusform>%n rząd, </numerusform></translation> </message> <message numerus="yes"> <source>%n column(s)</source> - <translation><numerusform>%n kolumna</numerusform><numerusform>%n kolumny</numerusform><numerusform>%n kolumn</numerusform><numerusform>%n kolumn</numerusform></translation> + <translation><numerusform>%n kolumna</numerusform><numerusform>%n kolumny</numerusform><numerusform>%n kolumn</numerusform><numerusform>%n kolumna</numerusform></translation> </message> </context> <context> @@ -1024,7 +1028,7 @@ Zapisać zmiany?</translation> </message> <message> <source>Writing the database failed.</source> - <translation>Błąd przy zapisie bazy danych.</translation> + <translation>Błąd w zapisywaniu bazy danych.</translation> </message> <message> <source>Passwords</source> @@ -1119,7 +1123,7 @@ Wyłączyć bezpieczne zapisywanie i spróbować ponownie?</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>Czy na pewno chcesz przenieść %n wpis do kosza?</numerusform><numerusform>Czy na pewno chcesz przenieść %n wpisy do kosza?</numerusform><numerusform>Czy na pewno chcesz przenieść %n wpisów do kosza?</numerusform><numerusform>Czy na pewno chcesz przenieść %n wpisów do kosza?</numerusform></translation> + <translation><numerusform>Czy na pewno chcesz przenieść %n wpis do kosza?</numerusform><numerusform>Czy na pewno chcesz przenieść %n wpisów do kosza?</numerusform><numerusform>Czy na pewno chcesz przenieść %n wpisów do kosza?</numerusform><numerusform>Czy na pewno chcesz przenieść %n wpisów do kosza?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1191,10 +1195,6 @@ Czy chcesz połączyć twoje zmiany?</translation> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>Czy na pewno chcesz nieodwracalnie usunąć wszystko z twojego kosza?</translation> </message> - <message> - <source>Entry updated successfully.</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DetailsWidget</name> @@ -1371,11 +1371,11 @@ Czy chcesz połączyć twoje zmiany?</translation> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation><numerusform>%n tydzień</numerusform><numerusform>%n tygodnie</numerusform><numerusform>%n tygodni</numerusform><numerusform>%n tygodni</numerusform></translation> + <translation><numerusform>%n tydzień</numerusform><numerusform>%n tygodni(e)</numerusform><numerusform>%n tygodni(e)</numerusform><numerusform>%n tygodni(e)</numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation><numerusform>%n miesiąc</numerusform><numerusform>%n miesiące</numerusform><numerusform>%n miesięcy</numerusform><numerusform>%n miesięcy</numerusform></translation> + <translation><numerusform>%n miesiąc</numerusform><numerusform>%n miesiąc(e)</numerusform><numerusform>%n miesiąc(e)</numerusform><numerusform>%n miesiąc(e)</numerusform></translation> </message> <message> <source>1 year</source> @@ -1383,15 +1383,15 @@ Czy chcesz połączyć twoje zmiany?</translation> </message> <message> <source>Apply generated password?</source> - <translation type="unfinished"/> + <translation>Zastosować wygenerowane hasło?</translation> </message> <message> <source>Do you want to apply the generated password to this entry?</source> - <translation type="unfinished"/> + <translation>Czy chcesz zastosować wygenerowane hasło do tego wpisu?</translation> </message> <message> <source>Entry updated successfully.</source> - <translation type="unfinished"/> + <translation>Wpis został pomyślnie zaktualizowany.</translation> </message> </context> <context> @@ -1426,11 +1426,11 @@ Czy chcesz połączyć twoje zmiany?</translation> </message> <message> <source>Foreground Color:</source> - <translation type="unfinished"/> + <translation>Kolor pierwszego planu:</translation> </message> <message> <source>Background Color:</source> - <translation type="unfinished"/> + <translation>Kolor tła:</translation> </message> </context> <context> @@ -1747,7 +1747,7 @@ Czy chcesz połączyć twoje zmiany?</translation> </message> <message> <source>Plugin Data</source> - <translation type="unfinished"/> + <translation>Dane wtyczki</translation> </message> <message> <source>Remove</source> @@ -1755,20 +1755,21 @@ Czy chcesz połączyć twoje zmiany?</translation> </message> <message> <source>Delete plugin data?</source> - <translation type="unfinished"/> + <translation>Usunąć dane wtyczki?</translation> </message> <message> <source>Do you really want to delete the selected plugin data? This may cause the affected plugins to malfunction.</source> - <translation type="unfinished"/> + <translation>Czy na pewno chcesz usunąć wybrane dane wtyczki? +Może to spowodować nieprawidłowe działanie wtyczek.</translation> </message> <message> <source>Key</source> - <translation type="unfinished"/> + <translation>Klucz</translation> </message> <message> <source>Value</source> - <translation type="unfinished"/> + <translation>Wartość</translation> </message> </context> <context> @@ -1898,7 +1899,7 @@ This may cause the affected plugins to malfunction.</source> <message> <source>Ref: </source> <comment>Reference abbreviation</comment> - <translation>Odniesienie: </translation> + <translation>Odniesienie:</translation> </message> <message> <source>Group</source> @@ -1975,6 +1976,10 @@ This may cause the affected plugins to malfunction.</source> <source>Reset to defaults</source> <translation>Przywróć domyślne</translation> </message> + <message> + <source>Attachments (icon)</source> + <translation>Załączniki (ikona)</translation> + </message> </context> <context> <name>Group</name> @@ -3118,7 +3123,7 @@ Używam domyślnego portu 19455.</translation> </message> <message> <source>Upper Case Letters</source> - <translation>Wielkie litery</translation> + <translation>Duże litery</translation> </message> <message> <source>Lower Case Letters</source> @@ -3321,7 +3326,7 @@ Używam domyślnego portu 19455.</translation> </message> <message> <source>Length for the generated password.</source> - <translation>Długość wygenerowanego hasła.</translation> + <translation>Długość wygenerowanego hasła</translation> </message> <message> <source>length</source> @@ -3422,7 +3427,7 @@ Dostępne polecenia: </message> <message> <source>Find entries quickly.</source> - <translation>Szybkie wyszukiwanie wpisów.</translation> + <translation>Szybkie wyszukiwanie wpisów. </translation> </message> <message> <source>Search term.</source> @@ -3613,34 +3618,34 @@ Dostępne polecenia: <name>QtIOCompressor</name> <message> <source>Internal zlib error when compressing: </source> - <translation>Błąd wewnętrzny zlib podczas kompresowania: </translation> + <translation>Błąd wewnętrzny zlib podczas kompresowania:</translation> </message> <message> <source>Error writing to underlying device: </source> - <translation>Błąd w zapisie na urządzenie: </translation> + <translation>Błąd w zapisie na urządzenie:</translation> </message> <message> <source>Error opening underlying device: </source> - <translation>Błąd w otwieraniu z urządzenia: </translation> + <translation>Błąd w otwieraniu z urządzenia:</translation> </message> <message> <source>Error reading data from underlying device: </source> - <translation>Błąd w odczycie danych z urządzenia: </translation> + <translation>Błąd w odczycie danych z urządzenia:</translation> </message> <message> <source>Internal zlib error when decompressing: </source> - <translation>Błąd wewnętrzny zlib podczas dekompresowania: </translation> + <translation>Błąd wewnętrzny zlib podczas dekompresowania:</translation> </message> </context> <context> <name>QtIOCompressor::open</name> <message> <source>The gzip format not supported in this version of zlib.</source> - <translation>Format gzip nie wspierany przez tę wersję zlib.</translation> + <translation>Format gzip nie wspierany przez tą wersję zlib.</translation> </message> <message> <source>Internal zlib error: </source> - <translation>Błąd wewnętrzny zlib: </translation> + <translation>Błąd wewnętrzny zlib:</translation> </message> </context> <context> @@ -3714,7 +3719,7 @@ Proszę odblokować wybraną bazę albo wybrać inną, która jest odblokowana.< </message> <message numerus="yes"> <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> - <translation><numerusform>Pomyślnie usunięto %n klucz szyfrowania z ustawień KeePassX/Http.</numerusform><numerusform>Pomyślnie usunięto %n klucze szyfrowania z ustawień KeePassX/Http.</numerusform><numerusform>Pomyślnie usunięto %n kluczy szyfrowania z ustawień KeePassX/Http.</numerusform><numerusform>Pomyślnie usunięto %n kluczy szyfrowania z ustawień KeePassX/Http.</numerusform></translation> + <translation><numerusform>Pomyślnie usunięto %n klucz szyfrowania z ustawień KeePassX/Http.</numerusform><numerusform>Pomyślnie usunięto %n klucze szyfrowania z ustawień KeePassX/Http.</numerusform><numerusform>Pomyślnie usunięto %n kluczy szyfrowania z ustawień KeePassX/Http.</numerusform><numerusform>Pomyślnie usunięto %n klucz szyfrowania z ustawień KeePassX/Http.</numerusform></translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -3746,7 +3751,7 @@ Proszę odblokować wybraną bazę albo wybrać inną, która jest odblokowana.< </message> <message numerus="yes"> <source>Successfully removed permissions from %n entries.</source> - <translation><numerusform>Pomyślnie usunięto uprawnienia z %n wpisu.</numerusform><numerusform>Pomyślnie usunięto uprawnienia z %n wpisów.</numerusform><numerusform>Pomyślnie usunięto uprawnienia z %n wpisów.</numerusform><numerusform>Pomyślnie usunięto uprawnienia z %n wpisów.</numerusform></translation> + <translation><numerusform>Pomyślnie usunięto uprawnienia z %n wpisu.</numerusform><numerusform>Pomyślnie usunięto uprawnienia z %n wpisów.</numerusform><numerusform>Pomyślnie usunięto uprawnienia z %n wpisów.</numerusform><numerusform>Pomyślnie usunięto uprawnienia z %n wpisu.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -3765,7 +3770,7 @@ Proszę odblokować wybraną bazę albo wybrać inną, która jest odblokowana.< </message> <message> <source>General</source> - <translation>Ogólne</translation> + <translation>Główne</translation> </message> <message> <source>Security</source> diff --git a/share/translations/keepassx_pt_BR.ts b/share/translations/keepassx_pt_BR.ts index bfe0d1066..aa99a2e17 100644 --- a/share/translations/keepassx_pt_BR.ts +++ b/share/translations/keepassx_pt_BR.ts @@ -73,12 +73,13 @@ Kernel: %3 %4</translation> </message> <message> <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> - <translation type="unfinished"/> + <translation>A equipe KeePassXC agradece especialmente a debfx pela criação do KeePassX original.</translation> </message> <message> <source>Build Type: %1 </source> - <translation type="unfinished"/> + <translation>Tipo de compilação: %1 +</translation> </message> </context> <context> @@ -137,11 +138,11 @@ Selecione se deseja permitir o acesso.</translation> </message> <message> <source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>Este comando Autotipo contém pressionamentos de teclas muito lentos. Você realmente deseja prosseguir?</translation> </message> <message> <source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source> - <translation type="unfinished"/> + <translation>Este comando Auto-Type contém os argumentos que são repetidos muitas vezes. Você realmente deseja prosseguir?</translation> </message> </context> <context> @@ -255,7 +256,7 @@ Selecione se deseja permitir o acesso.</translation> <message> <source>Show a &notification when credentials are requested</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Mostrar &notificação quando as credenciais forem requisitadas</translation> </message> <message> <source>Re&quest to unlock the database if it is locked</source> @@ -263,11 +264,11 @@ Selecione se deseja permitir o acesso.</translation> </message> <message> <source>Only entries with the same scheme (http://, https://, ...) are returned.</source> - <translation type="unfinished"/> + <translation>Apenas entradas com o mesmo esquema (http://, https://,...) são retornados.</translation> </message> <message> <source>&Match URL scheme (e.g., https://...)</source> - <translation type="unfinished"/> + <translation>&Corresponder ao esquema de URL (por exemplo, https://...)</translation> </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> @@ -275,17 +276,17 @@ Selecione se deseja permitir o acesso.</translation> </message> <message> <source>&Return only best-matching credentials</source> - <translation type="unfinished"/> + <translation>&Retornar apenas credenciais de melhor correspondência</translation> </message> <message> <source>Sort &matching credentials by title</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Ordenar credenciais &correspondentes por título</translation> </message> <message> <source>Sort matching credentials by &username</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Ordenar credenciais correspondentes por &nome de usuário</translation> </message> <message> <source>&Disconnect all browsers</source> @@ -293,7 +294,7 @@ Selecione se deseja permitir o acesso.</translation> </message> <message> <source>Forget all remembered &permissions</source> - <translation type="unfinished"/> + <translation>Descartar todas as &permissões salvas</translation> </message> <message> <source>Advanced</source> @@ -302,21 +303,21 @@ Selecione se deseja permitir o acesso.</translation> <message> <source>Never &ask before accessing credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Nunca peça confirmação antes de &acessar as credenciais</translation> </message> <message> <source>Never ask before &updating credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>Nunca peça confirmação antes de at&ualizar as credenciais</translation> </message> <message> <source>Only the selected database has to be connected with a client.</source> - <translation type="unfinished"/> + <translation>Somente o banco de dados selecionado deve estar conectado com um cliente.</translation> </message> <message> <source>Searc&h in all opened databases for matching credentials</source> <extracomment>Credentials mean login data requested via browser extension</extracomment> - <translation type="unfinished"/> + <translation>&Buscar em todos os bancos de dados abertos por credenciais correspondêntes</translation> </message> <message> <source>Automatically creating or updating string fields is not supported.</source> @@ -328,28 +329,28 @@ Selecione se deseja permitir o acesso.</translation> </message> <message> <source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source> - <translation type="unfinished"/> + <translation>Atualiza o KeePassXC ou keepassxc-proxy caminho binário automaticamente para o envio de mensagens de scripts nativo na inicialização.</translation> </message> <message> <source>Update &native messaging manifest files at startup</source> - <translation type="unfinished"/> + <translation>Atualizar arquivos de manifesto de mensagens &nativas na inicialização</translation> </message> <message> <source>Support a proxy application between KeePassXC and browser extension.</source> - <translation type="unfinished"/> + <translation>Suporte a um aplicativo de proxy entre KeePassXC e extensão de navegador.</translation> </message> <message> <source>Use a &proxy application between KeePassXC and browser extension</source> - <translation type="unfinished"/> + <translation>Uso um aplicativo &proxy entre KeePassXC e uma extensão do navegador</translation> </message> <message> <source>Use a custom proxy location if you installed a proxy manually.</source> - <translation type="unfinished"/> + <translation>Use um local de proxy personalizado se você instalou um proxy manualmente.</translation> </message> <message> <source>Use a &custom proxy location</source> <comment>Meant is the proxy for KeePassXC-Browser</comment> - <translation type="unfinished"/> + <translation>Use um endereço de proxy &customizado</translation> </message> <message> <source>Browse...</source> @@ -358,11 +359,11 @@ Selecione se deseja permitir o acesso.</translation> </message> <message> <source><b>Warning:</b> The following options can be dangerous!</source> - <translation type="unfinished"/> + <translation><b>AVISO:</b> As seguintes opções podem ser perigosas!</translation> </message> <message> <source>Executable Files (*.exe);;All Files (*.*)</source> - <translation type="unfinished"/> + <translation>Arquivos Executáveis (*.exe);;Todos os Arquivos (*.*)</translation> </message> <message> <source>Executable Files (*)</source> @@ -370,7 +371,11 @@ Selecione se deseja permitir o acesso.</translation> </message> <message> <source>Select custom proxy location</source> - <translation type="unfinished"/> + <translation>Selecione localização para o proxy</translation> + </message> + <message> + <source>We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</source> + <translation>Desculpe, o KeePassXC-Browser não é suportado em versões Snap no momento.</translation> </message> </context> <context> @@ -384,7 +389,9 @@ Selecione se deseja permitir o acesso.</translation> If you would like to allow it access to your KeePassXC database, give it a unique name to identify and accept it.</source> - <translation type="unfinished"/> + <translation>Você recebeu uma solicitação de associação para a chave acima. + +Se você gostaria de permitir acesso ao seu banco de dados KeePassXC, atribua um nome exclusivo para identifica-lo e aceitá-lo.</translation> </message> <message> <source>Save and allow access</source> @@ -397,7 +404,8 @@ give it a unique name to identify and accept it.</source> <message> <source>A shared encryption key with the name "%1" already exists. Do you want to overwrite it?</source> - <translation type="unfinished"/> + <translation>Uma chave de criptografia compartilhada com o nome "%1" já existe. +Você deseja sobrescrever-la?</translation> </message> <message> <source>KeePassXC: Update Entry</source> @@ -423,7 +431,7 @@ Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.< </message> <message> <source>The active database does not contain a settings entry.</source> - <translation type="unfinished"/> + <translation>O banco de dados ativo não contém uma entrada de configuração.</translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -431,7 +439,7 @@ Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.< </message> <message> <source>No shared encryption keys found in KeePassXC Settings.</source> - <translation type="unfinished"/> + <translation> Nenhuma chave criptográfica compartilhada encontrada nas Configurações do KeePassXC.</translation> </message> <message> <source>KeePassXC: Removed keys from database</source> @@ -439,7 +447,7 @@ Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.< </message> <message numerus="yes"> <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Removido com sucesso %n chave(s) criptográficas das configurações do KeePassXC.</numerusform><numerusform>Removido com sucesso %n chave(s) criptográficas das configurações do KeePassXC.</numerusform></translation> </message> <message> <source>Removing stored permissions…</source> @@ -455,7 +463,7 @@ Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.< </message> <message numerus="yes"> <source>Successfully removed permissions from %n entry(s).</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Removido com êxito as permissões de %n entrada(s).</numerusform><numerusform>Removido com êxito as permissões de %n entrada(s).</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -494,7 +502,7 @@ Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.< </message> <message> <source>Cha&llenge Response</source> - <translation type="unfinished"/> + <translation>&Desafio Resposta</translation> </message> <message> <source>Refresh</source> @@ -502,11 +510,11 @@ Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.< </message> <message> <source>Key files</source> - <translation>Arquivos-chave</translation> + <translation>Arquivos-Chave</translation> </message> <message> <source>All files</source> - <translation>Todos arquivos</translation> + <translation>Todos os Arquivos</translation> </message> <message> <source>Create Key File...</source> @@ -547,7 +555,9 @@ Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.< unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>Você está usando um formato de arquivo de chave legado que pode tornar-se sem suporte no futuro. + +Por favor, considere gerar um novo arquivo de chave.</translation> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> @@ -562,7 +572,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Append ' - Clone' to title</source> - <translation type="unfinished"/> + <translation>Anexar '-Clonar' ao título</translation> </message> <message> <source>Replace username and password with references</source> @@ -613,7 +623,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Number of headers line to discard</source> - <translation type="unfinished"/> + <translation>Número de linhas do cabeçalho a descartar</translation> </message> <message> <source>Consider '\' an escape character</source> @@ -681,15 +691,15 @@ Please consider generating a new key file.</source> <name>CsvParserModel</name> <message numerus="yes"> <source>%n byte(s), </source> - <translation><numerusform>%n byte(s), </numerusform><numerusform>%n byte(s), </numerusform></translation> + <translation><numerusform>%n bytes(s),</numerusform><numerusform>%n bytes(s),</numerusform></translation> </message> <message numerus="yes"> <source>%n row(s), </source> - <translation><numerusform>%n linha(s), </numerusform><numerusform>%n linha(s), </numerusform></translation> + <translation><numerusform>%n linha(s), </numerusform><numerusform>%n row(s),</numerusform></translation> </message> <message numerus="yes"> <source>%n column(s)</source> - <translation><numerusform>%n coluna(s)</numerusform><numerusform>%n coluna(s)</numerusform></translation> + <translation><numerusform>coluna (s) %n</numerusform><numerusform>%n coluna(s)</numerusform></translation> </message> </context> <context> @@ -724,7 +734,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Can't open key file</source> - <translation>Não foi possível abrir arquivo-chave</translation> + <translation>Não foi possível abrir o arquivo-chave</translation> </message> <message> <source>Legacy key file format</source> @@ -735,7 +745,9 @@ Please consider generating a new key file.</source> unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>Você está usando um formato de arquivo de chave legado que pode tornar-se sem suporte no futuro. + +Por favor, considere gerar um novo arquivo de chave.</translation> </message> <message> <source>Don't show this warning again</source> @@ -743,7 +755,7 @@ Please consider generating a new key file.</source> </message> <message> <source>All files</source> - <translation>Todos arquivos</translation> + <translation>Todos os arquivos</translation> </message> <message> <source>Key files</source> @@ -810,7 +822,9 @@ Você pode salvá-lo agora.</translation> <source>You are using a very high number of key transform rounds with Argon2. If you keep this number, your database may take hours or days (or even longer) to open!</source> - <translation type="unfinished"/> + <translation>Você está usando um número muito elevado de transformação chave rodadas com Argon2. + +Se você mantiver este número, seu banco de dados pode levar horas ou dias (ou até mais) para abrir!</translation> </message> <message> <source>Understood, keep number</source> @@ -829,7 +843,9 @@ If you keep this number, your database may take hours or days (or even longer) t <source>You are using a very low number of key transform rounds with AES-KDF. If you keep this number, your database may be too easy to crack!</source> - <translation type="unfinished"/> + <translation>Você está usando um número muito baixo de transformação chave rodadas com KDF-AES. + +Se você manter este número, seu banco de dados pode ser facilmente crackeado!</translation> </message> <message> <source>KDF unchanged</source> @@ -837,17 +853,17 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Failed to transform key with new KDF parameters; KDF unchanged.</source> - <translation type="unfinished"/> + <translation>Não foi possível transformar a chave com novos parâmetros KDF; KDF inalterado.</translation> </message> <message numerus="yes"> <source> MiB</source> <comment>Abbreviation for Mebibytes (KDF settings)</comment> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform> MiB</numerusform><numerusform> MiB</numerusform></translation> </message> <message numerus="yes"> <source> thread(s)</source> <comment>Threads for parallel execution (KDF settings)</comment> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform> thread(s)</numerusform><numerusform> thread(s)</numerusform></translation> </message> </context> <context> @@ -917,7 +933,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source> MiB</source> - <translation> MB</translation> + <translation>MiB</translation> </message> <message> <source>Use recycle bin</source> @@ -925,11 +941,11 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Additional Database Settings</source> - <translation type="unfinished"/> + <translation>Configurações do Banco de Dados</translation> </message> <message> <source>Enable &compression (recommended)</source> - <translation type="unfinished"/> + <translation>Ativar &compressão (recomendado)</translation> </message> </context> <context> @@ -941,11 +957,11 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>KeePass 2 Database</source> - <translation>Banco de dados Keepass 2</translation> + <translation>Banco de Dados KeePass 2</translation> </message> <message> <source>All files</source> - <translation>Todos arquivos</translation> + <translation>Todos os arquivos</translation> </message> <message> <source>Open database</source> @@ -1009,7 +1025,7 @@ Salvar alterações?</translation> </message> <message> <source>Writing the database failed.</source> - <translation>Escrita do banco de dados falhou.</translation> + <translation>Escrever no banco de dados falhou.</translation> </message> <message> <source>Passwords</source> @@ -1055,12 +1071,13 @@ Do contrário, suas alterações serão perdidas.</translation> </message> <message> <source>Disable safe saves?</source> - <translation type="unfinished"/> + <translation>Desativar armazenamento seguro?</translation> </message> <message> <source>KeePassXC has failed to save the database multiple times. This is likely caused by file sync services holding a lock on the save file. Disable safe saves and try again?</source> - <translation type="unfinished"/> + <translation>KeePassXC não pôde salvar o banco de dados após várias tentativas. Isto é causado provavelmente pelo serviço de sincronização de arquivo que mantém um bloqueio ao salvar o arquivo. +Deseja desabilitar salvamento seguro e tentar de novo?</translation> </message> </context> <context> @@ -1071,7 +1088,7 @@ Disable safe saves and try again?</source> </message> <message> <source>Change master key</source> - <translation>Alterar chave-mestra</translation> + <translation>Alterar chave mestra</translation> </message> <message> <source>Delete entry?</source> @@ -1103,7 +1120,7 @@ Disable safe saves and try again?</source> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Você realmente deseja mover %n entrada para a lixeira?</numerusform><numerusform>Você realmente deseja mover %n entradas para a lixeira?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1127,7 +1144,7 @@ Disable safe saves and try again?</source> </message> <message> <source>Unable to calculate master key</source> - <translation>Não foi possível calcular a chave mestre</translation> + <translation>Não foi possível calcular chave mestra</translation> </message> <message> <source>No current database.</source> @@ -1160,7 +1177,8 @@ Disable safe saves and try again?</source> <message> <source>The database file has changed and you have unsaved changes. Do you want to merge your changes?</source> - <translation type="unfinished"/> + <translation>O arquivo de banco de dados foi alterado e você tem alterações não salvas. +Você deseja combinar suas alterações?</translation> </message> <message> <source>Could not open the new database file while attempting to autoreload this database.</source> @@ -1174,10 +1192,6 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>Você tem certeza que deseja apagar permanentemente tudo que está na lixeira?</translation> </message> - <message> - <source>Entry updated successfully.</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DetailsWidget</name> @@ -1358,7 +1372,7 @@ Do you want to merge your changes?</source> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation><numerusform>%n mese(s)</numerusform><numerusform>%n mese(s)</numerusform></translation> + <translation><numerusform>%n mês</numerusform><numerusform>%n mese(s)</numerusform></translation> </message> <message> <source>1 year</source> @@ -1366,15 +1380,15 @@ Do you want to merge your changes?</source> </message> <message> <source>Apply generated password?</source> - <translation type="unfinished"/> + <translation>Utilizar senha gerada?</translation> </message> <message> <source>Do you want to apply the generated password to this entry?</source> - <translation type="unfinished"/> + <translation>Deseja aplicar a senha gerada a esta entrada?</translation> </message> <message> <source>Entry updated successfully.</source> - <translation type="unfinished"/> + <translation>Item atualizado com sucesso.</translation> </message> </context> <context> @@ -1409,11 +1423,11 @@ Do you want to merge your changes?</source> </message> <message> <source>Foreground Color:</source> - <translation type="unfinished"/> + <translation>Cor de primeiro plano:</translation> </message> <message> <source>Background Color:</source> - <translation type="unfinished"/> + <translation>Cor de fundo:</translation> </message> </context> <context> @@ -1448,7 +1462,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Use a specific sequence for this association:</source> - <translation type="unfinished"/> + <translation>Usar sequência especifica para essa associação:</translation> </message> </context> <context> @@ -1624,7 +1638,7 @@ Do you want to merge your changes?</source> <name>EditGroupWidgetMain</name> <message> <source>Name</source> - <translation>Nome</translation> + <translation>Nom</translation> </message> <message> <source>Notes</source> @@ -1636,7 +1650,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Search</source> - <translation>Pesquisar</translation> + <translation>Buscar</translation> </message> <message> <source>Auto-Type</source> @@ -1648,7 +1662,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Set default Auto-Type se&quence</source> - <translation>Definir sequência padrão de Auto-Digitar</translation> + <translation>Definir se&quência padrão de Auto-Digitar</translation> </message> </context> <context> @@ -1679,8 +1693,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation>Dica: Você pode ativar o Google como um recurso em -Ferramentas>Configurações>Segurança</translation> + <translation>Dica: Você pode ativar o Google como um recurso em Ferramentas>Configurações>Segurança</translation> </message> <message> <source>Images</source> @@ -1688,7 +1701,7 @@ Ferramentas>Configurações>Segurança</translation> </message> <message> <source>All files</source> - <translation>Todos arquivos</translation> + <translation>Todos os arquivos</translation> </message> <message> <source>Select Image</source> @@ -1731,7 +1744,7 @@ Ferramentas>Configurações>Segurança</translation> </message> <message> <source>Plugin Data</source> - <translation type="unfinished"/> + <translation>Dados do plugin</translation> </message> <message> <source>Remove</source> @@ -1739,20 +1752,21 @@ Ferramentas>Configurações>Segurança</translation> </message> <message> <source>Delete plugin data?</source> - <translation type="unfinished"/> + <translation>Apagar dados do plugin?</translation> </message> <message> <source>Do you really want to delete the selected plugin data? This may cause the affected plugins to malfunction.</source> - <translation type="unfinished"/> + <translation>Você quer realmente apagar os dados do plugin selecionados? +Isto pode causar mal funcionamento dos plugins afetados.</translation> </message> <message> <source>Key</source> - <translation type="unfinished"/> + <translation>Chave</translation> </message> <message> <source>Value</source> - <translation type="unfinished"/> + <translation>Valor</translation> </message> </context> <context> @@ -1802,7 +1816,7 @@ This may cause the affected plugins to malfunction.</source> </message> <message numerus="yes"> <source>Are you sure you want to remove %n attachment(s)?</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Tem certeza que deseja remover anexos de %n?</numerusform><numerusform>Tem certeza que deseja remover os %n anexo(s)?</numerusform></translation> </message> <message> <source>Confirm Remove</source> @@ -1815,11 +1829,12 @@ This may cause the affected plugins to malfunction.</source> <message> <source>Unable to create directory: %1</source> - <translation type="unfinished"/> + <translation>Não foi possível criar o diretório: +%1</translation> </message> <message> <source>Are you sure you want to overwrite the existing file "%1" with the attachment?</source> - <translation type="unfinished"/> + <translation>Tem certeza que deseja substituir o arquivo existente "%1" com o anexo?</translation> </message> <message> <source>Confirm overwrite</source> @@ -1828,17 +1843,20 @@ This may cause the affected plugins to malfunction.</source> <message> <source>Unable to save attachments: %1</source> - <translation type="unfinished"/> + <translation>Não foi possível salvar anexos: +%1</translation> </message> <message> <source>Unable to open attachment: %1</source> - <translation type="unfinished"/> + <translation>Não foi possível abrir anexos: +%1</translation> </message> <message> <source>Unable to open attachments: %1</source> - <translation type="unfinished"/> + <translation>Não foi possível abrir anexos: +%1</translation> </message> <message> <source>Unable to open files: @@ -1914,15 +1932,15 @@ This may cause the affected plugins to malfunction.</source> </message> <message> <source>Created</source> - <translation type="unfinished"/> + <translation>Criado</translation> </message> <message> <source>Modified</source> - <translation type="unfinished"/> + <translation>Modificado</translation> </message> <message> <source>Accessed</source> - <translation type="unfinished"/> + <translation>Acessado</translation> </message> <message> <source>Attachments</source> @@ -1933,27 +1951,31 @@ This may cause the affected plugins to malfunction.</source> <name>EntryView</name> <message> <source>Customize View</source> - <translation type="unfinished"/> + <translation>Visualização Personalizada</translation> </message> <message> <source>Hide Usernames</source> - <translation type="unfinished"/> + <translation>Ocultar nome de usuários</translation> </message> <message> <source>Hide Passwords</source> - <translation type="unfinished"/> + <translation>Ocultar Senhas</translation> </message> <message> <source>Fit to window</source> - <translation type="unfinished"/> + <translation>Ajustar à janela</translation> </message> <message> <source>Fit to contents</source> - <translation type="unfinished"/> + <translation>Ajustar ao conteúdo</translation> </message> <message> <source>Reset to defaults</source> - <translation type="unfinished"/> + <translation>Redefinir as configurações padrões</translation> + </message> + <message> + <source>Attachments (icon)</source> + <translation>Anexos (ícone)</translation> </message> </context> <context> @@ -1967,11 +1989,11 @@ This may cause the affected plugins to malfunction.</source> <name>HostInstaller</name> <message> <source>KeePassXC: Cannot save file!</source> - <translation type="unfinished"/> + <translation>KeePassXC: Não foi possível salvar o arquivo!</translation> </message> <message> <source>Cannot save the native messaging script file.</source> - <translation type="unfinished"/> + <translation>Não pode salvar o arquivo de script de envio de mensagens nativo.</translation> </message> </context> <context> @@ -2026,7 +2048,7 @@ This may cause the affected plugins to malfunction.</source> </message> <message> <source>Extended ASCII</source> - <translation type="unfinished"/> + <translation>ASCII extendido</translation> </message> </context> <context> @@ -2070,7 +2092,7 @@ This may cause the affected plugins to malfunction.</source> <name>Kdbx4Reader</name> <message> <source>missing database headers</source> - <translation type="unfinished"/> + <translation>cabeçalhos de banco de dados ausente</translation> </message> <message> <source>Unable to calculate master key</source> @@ -2078,15 +2100,15 @@ This may cause the affected plugins to malfunction.</source> </message> <message> <source>Invalid header checksum size</source> - <translation type="unfinished"/> + <translation>Tamanho de soma de verificação do cabeçalho inválido</translation> </message> <message> <source>Header SHA256 mismatch</source> - <translation type="unfinished"/> + <translation>Incompatibilidade de cabeçalho SHA256</translation> </message> <message> <source>Wrong key or database file is corrupt. (HMAC mismatch)</source> - <translation type="unfinished"/> + <translation>Arquivo errado chave ou banco de dados está corrompido. (Incompatibilidade de HMAC)</translation> </message> <message> <source>Unknown cipher</source> @@ -2094,111 +2116,111 @@ This may cause the affected plugins to malfunction.</source> </message> <message> <source>Invalid header id size</source> - <translation type="unfinished"/> + <translation>Tamanho de header id inválido</translation> </message> <message> <source>Invalid header field length</source> - <translation type="unfinished"/> + <translation>Comprimento do campo de cabeçalho inválido</translation> </message> <message> <source>Invalid header data length</source> - <translation type="unfinished"/> + <translation>Comprimento de dados cabeçalho inválido</translation> </message> <message> <source>Failed to open buffer for KDF parameters in header</source> - <translation type="unfinished"/> + <translation>Falha ao abrir o buffer para parâmetros KDF no cabeçalho</translation> </message> <message> <source>Unsupported key derivation function (KDF) or invalid parameters</source> - <translation type="unfinished"/> + <translation>Função de derivação de chaves sem suporte (KDF) ou parâmetros inválidos</translation> </message> <message> <source>Legacy header fields found in KDBX4 file.</source> - <translation type="unfinished"/> + <translation>Campos de cabeçalho de legado encontrados no arquivo KDBX4.</translation> </message> <message> <source>Invalid inner header id size</source> - <translation type="unfinished"/> + <translation>Cabeçalho interno inválido tamanho do id</translation> </message> <message> <source>Invalid inner header field length</source> - <translation type="unfinished"/> + <translation>Comprimento do campo de cabeçalho interno inválido</translation> </message> <message> <source>Invalid inner header binary size</source> - <translation type="unfinished"/> + <translation>Tamanho binário cabeçalho interno inválido</translation> </message> <message> <source>Unsupported KeePass variant map version.</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Versão não suportada do mapa variante KeePass.</translation> </message> <message> <source>Invalid variant map entry name length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Mapa variante inválido item comprimento do nome</translation> </message> <message> <source>Invalid variant map entry name data</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Mapa de variante inválido dados de nome da entrada</translation> </message> <message> <source>Invalid variant map entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Comprimento de valor de entrada inválida de mapa variante</translation> </message> <message> <source>Invalid variant map entry value data</source> <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Mapa de variante inválido dados de valor da entrada</translation> </message> <message> <source>Invalid variant map Bool entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Mapa de variante inválida valor do comprimento do item Bool</translation> </message> <message> <source>Invalid variant map Int32 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Mapa de variante inválida valor do comprimento do item Int32</translation> </message> <message> <source>Invalid variant map UInt32 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Mapa de variante inválida valor do comprimento do item UInt32</translation> </message> <message> <source>Invalid variant map Int64 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Mapa de variante inválido Int64 comprimento de valor de entrada</translation> </message> <message> <source>Invalid variant map UInt64 entry value length</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Mapa de variante inválida valor do comprimento do item UInt64</translation> </message> <message> <source>Invalid variant map entry type</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Tipo de entrada mapa variante inválido</translation> </message> <message> <source>Invalid variant map field type size</source> <extracomment>Translation: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Tamanho do campo de tipo de mapa de variante inválido</translation> </message> </context> <context> <name>Kdbx4Writer</name> <message> <source>Invalid symmetric cipher algorithm.</source> - <translation type="unfinished"/> + <translation>Algoritmo de cifra simétrica inválido.</translation> </message> <message> <source>Invalid symmetric cipher IV size.</source> <comment>IV = Initialization Vector for symmetric cipher</comment> - <translation type="unfinished"/> + <translation>Tamanho de cifra simétrica IV inválida.</translation> </message> <message> <source>Unable to calculate master key</source> @@ -2207,50 +2229,50 @@ This may cause the affected plugins to malfunction.</source> <message> <source>Failed to serialize KDF parameters variant map</source> <extracomment>Translation comment: variant map = data structure for storing meta data</extracomment> - <translation type="unfinished"/> + <translation>Falha ao serializar mapa variante do KDF parâmetros</translation> </message> </context> <context> <name>KdbxReader</name> <message> <source>Invalid cipher uuid length</source> - <translation type="unfinished"/> + <translation>Comprimento de uuid cifra inválido</translation> </message> <message> <source>Unsupported cipher</source> - <translation type="unfinished"/> + <translation>Cifra não suportada</translation> </message> <message> <source>Invalid compression flags length</source> - <translation type="unfinished"/> + <translation>Comprimento de flags de compressão inválido</translation> </message> <message> <source>Unsupported compression algorithm</source> - <translation type="unfinished"/> + <translation>Algoritmo de compressão não suportado</translation> </message> <message> <source>Invalid master seed size</source> - <translation type="unfinished"/> + <translation>Tamanho da semente de mestre inválido</translation> </message> <message> <source>Invalid transform seed size</source> - <translation type="unfinished"/> + <translation>Tamanho de semente de transformação inválido</translation> </message> <message> <source>Invalid transform rounds size</source> - <translation type="unfinished"/> + <translation>Tamanho do número de rodadas transformação inválido</translation> </message> <message> <source>Invalid start bytes size</source> - <translation type="unfinished"/> + <translation>Tamanho de bytes de início inválido</translation> </message> <message> <source>Invalid random stream id size</source> - <translation type="unfinished"/> + <translation>Tamanho de id de stream aleatório inválido</translation> </message> <message> <source>Invalid inner random stream cipher</source> - <translation type="unfinished"/> + <translation>Cifra de fluxo aleatório interno inválido</translation> </message> <message> <source>Not a KeePass database.</source> @@ -2268,14 +2290,14 @@ Isto é uma migração de caminho único. Você não poderá abrir o banco de da </message> <message> <source>Unsupported KeePass 2 database version.</source> - <translation type="unfinished"/> + <translation>Versão do banco de dados KeePass 2 não suportada.</translation> </message> </context> <context> <name>KdbxXmlReader</name> <message> <source>XML parsing failure: %1</source> - <translation type="unfinished"/> + <translation>Análise de falha de XML: %1</translation> </message> <message> <source>No root group</source> @@ -2287,112 +2309,112 @@ Isto é uma migração de caminho único. Você não poderá abrir o banco de da </message> <message> <source>Missing custom data key or value</source> - <translation type="unfinished"/> + <translation>Chave de dados customizada ou valor ausente</translation> </message> <message> <source>Multiple group elements</source> - <translation type="unfinished"/> + <translation>Elementos de grupo múltiplo</translation> </message> <message> <source>Null group uuid</source> - <translation type="unfinished"/> + <translation>Uuid group inválido</translation> </message> <message> <source>Invalid group icon number</source> - <translation type="unfinished"/> + <translation>Número do grupo de ícone inválido</translation> </message> <message> <source>Invalid EnableAutoType value</source> - <translation type="unfinished"/> + <translation>Valor de EnableAutoType inválido</translation> </message> <message> <source>Invalid EnableSearching value</source> - <translation type="unfinished"/> + <translation>Valor EnableSearching inválido</translation> </message> <message> <source>No group uuid found</source> - <translation type="unfinished"/> + <translation>Nenhum uuid de grupo encontrado</translation> </message> <message> <source>Null DeleteObject uuid</source> - <translation type="unfinished"/> + <translation>DeleteObject uuid nulo</translation> </message> <message> <source>Missing DeletedObject uuid or time</source> - <translation type="unfinished"/> + <translation>DeletedObject uuid ou tempo ausente</translation> </message> <message> <source>Null entry uuid</source> - <translation type="unfinished"/> + <translation>Item uuid nulo</translation> </message> <message> <source>Invalid entry icon number</source> - <translation type="unfinished"/> + <translation>Entrada de número de ícone inválida</translation> </message> <message> <source>History element in history entry</source> - <translation type="unfinished"/> + <translation>Elemento de histórico na entrada de histórico</translation> </message> <message> <source>No entry uuid found</source> - <translation type="unfinished"/> + <translation>Nenhuma entrada uuid encontrado</translation> </message> <message> <source>History element with different uuid</source> - <translation type="unfinished"/> + <translation>Elemento de história com diferente uuid</translation> </message> <message> <source>Unable to decrypt entry string</source> - <translation type="unfinished"/> + <translation>Não é possível descriptografar a sequência de caracteres de entrada</translation> </message> <message> <source>Duplicate custom attribute found</source> - <translation type="unfinished"/> + <translation>Atributo customizado duplicado encontrado</translation> </message> <message> <source>Entry string key or value missing</source> - <translation type="unfinished"/> + <translation>Chave de cadeia de caracteres de entrada ou valor ausente</translation> </message> <message> <source>Duplicate attachment found</source> - <translation type="unfinished"/> + <translation>Anexo duplicado encontrado</translation> </message> <message> <source>Entry binary key or value missing</source> - <translation type="unfinished"/> + <translation>Entrada de chave binária ou valor ausente</translation> </message> <message> <source>Auto-type association window or sequence missing</source> - <translation type="unfinished"/> + <translation>Janela associada ao Auto-Digitar ou sequência ausente</translation> </message> <message> <source>Invalid bool value</source> - <translation type="unfinished"/> + <translation>Valor booleano inválido</translation> </message> <message> <source>Invalid date time value</source> - <translation type="unfinished"/> + <translation>Valor de tempo e data inválido</translation> </message> <message> <source>Invalid color value</source> - <translation type="unfinished"/> + <translation>Valor de cor inválido</translation> </message> <message> <source>Invalid color rgb part</source> - <translation type="unfinished"/> + <translation>Valor de número inválido</translation> </message> <message> <source>Invalid number value</source> - <translation type="unfinished"/> + <translation>Valor numérico inválido</translation> </message> <message> <source>Invalid uuid value</source> - <translation type="unfinished"/> + <translation>Valor uuid inválido</translation> </message> <message> <source>Unable to decompress binary</source> <extracomment>Translator meant is a binary data inside an entry</extracomment> - <translation type="unfinished"/> + <translation>Não é possível descompactar binário</translation> </message> </context> <context> @@ -2422,36 +2444,36 @@ Isto é uma migração de caminho único. Você não poderá abrir o banco de da </message> <message> <source>Unsupported KeePass database version.</source> - <translation>Versão não suportada do banco de dados KeePass.</translation> + <translation>Versão do banco de dados KeePass não suportada.</translation> </message> <message> <source>Unable to read encryption IV</source> <comment>IV = Initialization Vector for symmetric cipher</comment> - <translation type="unfinished"/> + <translation>Não é possível ler criptografia IV</translation> </message> <message> <source>Invalid number of groups</source> - <translation type="unfinished"/> + <translation>Número de grupos inválido</translation> </message> <message> <source>Invalid number of entries</source> - <translation type="unfinished"/> + <translation>Número inválido de entradas</translation> </message> <message> <source>Invalid content hash size</source> - <translation type="unfinished"/> + <translation>Tamanho de hash conteúdo inválido</translation> </message> <message> <source>Invalid transform seed size</source> - <translation type="unfinished"/> + <translation>Tamanho de semente de transformação inválido</translation> </message> <message> <source>Invalid number of transform rounds</source> - <translation type="unfinished"/> + <translation>Número inválido de ciclos de transformção</translation> </message> <message> <source>Unable to construct group tree</source> - <translation type="unfinished"/> + <translation>Não é possível construir árvore de grupo</translation> </message> <message> <source>Root</source> @@ -2459,7 +2481,7 @@ Isto é uma migração de caminho único. Você não poderá abrir o banco de da </message> <message> <source>Unable to calculate master key</source> - <translation>Não foi possível calcular a chave mestre</translation> + <translation>Não foi possível calcular a chave mestra</translation> </message> <message> <source>Wrong key or database file is corrupt.</source> @@ -2467,95 +2489,95 @@ Isto é uma migração de caminho único. Você não poderá abrir o banco de da </message> <message> <source>Key transformation failed</source> - <translation type="unfinished"/> + <translation>Transformação de chave falhou</translation> </message> <message> <source>Invalid group field type number</source> - <translation type="unfinished"/> + <translation>Grupo inválido número do tipo de campo</translation> </message> <message> <source>Invalid group field size</source> - <translation type="unfinished"/> + <translation>Tamanho do campo Grupo inválido</translation> </message> <message> <source>Read group field data doesn't match size</source> - <translation type="unfinished"/> + <translation>Leitura de grupo dados do campo não correspondem em tamanho</translation> </message> <message> <source>Incorrect group id field size</source> - <translation type="unfinished"/> + <translation>Tamanho de campo de id de grupo incorreto</translation> </message> <message> <source>Incorrect group creation time field size</source> - <translation type="unfinished"/> + <translation>Group incorreto tamanho do campo de hora de criação</translation> </message> <message> <source>Incorrect group modification time field size</source> - <translation type="unfinished"/> + <translation>Grupo incorreto tamanho do campo de hora de criação</translation> </message> <message> <source>Incorrect group access time field size</source> - <translation type="unfinished"/> + <translation>Grupo incorreto tamanho do campo de hora de acesso</translation> </message> <message> <source>Incorrect group expiry time field size</source> - <translation type="unfinished"/> + <translation>Grupo incorreto tamanho do campo de hora de expiração</translation> </message> <message> <source>Incorrect group icon field size</source> - <translation type="unfinished"/> + <translation>Grupo incorreto tamanho do campo de ícone</translation> </message> <message> <source>Incorrect group level field size</source> - <translation type="unfinished"/> + <translation>Grupo incorreto tamanho do campo de nível</translation> </message> <message> <source>Invalid group field type</source> - <translation type="unfinished"/> + <translation>Grupo incorreto tipo de campo</translation> </message> <message> <source>Missing group id or level</source> - <translation type="unfinished"/> + <translation>Id do grupo ou nível ausente</translation> </message> <message> <source>Missing entry field type number</source> - <translation type="unfinished"/> + <translation>Item ausente número do tipo de campo</translation> </message> <message> <source>Invalid entry field size</source> - <translation type="unfinished"/> + <translation>Item inválido tamanho do campo</translation> </message> <message> <source>Read entry field data doesn't match size</source> - <translation type="unfinished"/> + <translation>Leitura do dados de campo de entrada não correspondem com o tamanho</translation> </message> <message> <source>Invalid entry uuid field size</source> - <translation type="unfinished"/> + <translation>Entrada inválida tamanho do campo uuid</translation> </message> <message> <source>Invalid entry group id field size</source> - <translation type="unfinished"/> + <translation>Item inválido tamanho do campo de id de groupo</translation> </message> <message> <source>Invalid entry icon field size</source> - <translation type="unfinished"/> + <translation>Item inválido tamanho de campo de ícone</translation> </message> <message> <source>Invalid entry creation time field size</source> - <translation type="unfinished"/> + <translation>Item inválido tamanho do campo de hora de criação</translation> </message> <message> <source>Invalid entry modification time field size</source> - <translation type="unfinished"/> + <translation>Item inválido Tamanho do campo de hora de modificação</translation> </message> <message> <source>Invalid entry expiry time field size</source> - <translation type="unfinished"/> + <translation>Tamanho de campo de tempo de expiração entrada inválida</translation> </message> <message> <source>Invalid entry field type</source> - <translation type="unfinished"/> + <translation>Tipo de campo de entrada inválido</translation> </message> </context> <context> @@ -2609,7 +2631,7 @@ Isto é uma migração de caminho único. Você não poderá abrir o banco de da </message> <message> <source>Time-based one-time password</source> - <translation type="unfinished"/> + <translation>Senha única baseada em tempo</translation> </message> <message> <source>&Groups</source> @@ -2629,7 +2651,7 @@ Isto é uma migração de caminho único. Você não poderá abrir o banco de da </message> <message> <source>&Open database...</source> - <translation>&Abrir banco de dados...</translation> + <translation>&Abrir base de dados...</translation> </message> <message> <source>&Save database</source> @@ -2673,7 +2695,7 @@ Isto é uma migração de caminho único. Você não poderá abrir o banco de da </message> <message> <source>Sa&ve database as...</source> - <translation>Sal&var banco de dados como...</translation> + <translation>Sal&var base de dados como...</translation> </message> <message> <source>Change &master key...</source> @@ -2797,7 +2819,7 @@ Isto é uma migração de caminho único. Você não poderá abrir o banco de da </message> <message> <source><p>It looks like you are using KeePassHTTP for browser integration. This feature has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a> (warning %1 of 3).</p></source> - <translation type="unfinished"/> + <translation><p>Parece que você está usando KeePassHTTP para integração do navegador. Esse recurso é obsoleto e será removido no futuro. <br>Por favor mudar para KeePassXC-Browser! Para obter ajuda com a migração, visite o nosso <a class="link" href="https://keepassxc.org/docs/keepassxc-browser-migration"> guia de migração</a> (aviso %1 de 3).</p></translation> </message> <message> <source>read-only</source> @@ -2843,7 +2865,9 @@ Isto é uma migração de caminho único. Você não poderá abrir o banco de da <source>WARNING: You are using an unstable build of KeePassXC! There is a high risk of corruption, maintain a backup of your databases. This version is not meant for production use.</source> - <translation type="unfinished"/> + <translation>AVISO: você está usando uma compilação instável do KeePassXC! +Existe um alto risco de corrupção, mantenha um backup de seus bancos de dados. +Esta versão não se destina ao uso em produção.</translation> </message> </context> <context> @@ -2854,7 +2878,7 @@ This version is not meant for production use.</source> </message> <message> <source>PEM boundary mismatch</source> - <translation type="unfinished"/> + <translation>Incompatibilidade de limite do PEM</translation> </message> <message> <source>Base64 decoding failed</source> @@ -2874,7 +2898,7 @@ This version is not meant for production use.</source> </message> <message> <source>Failed to read public key.</source> - <translation>Falha ao ler chave pública</translation> + <translation>Falha ao ler chave pública.</translation> </message> <message> <source>Corrupted key file, reading private key failed</source> @@ -2902,47 +2926,47 @@ This version is not meant for production use.</source> </message> <message> <source>Unexpected EOF while reading public key</source> - <translation>EOF inesperado enquanto lendo a chave pública.</translation> + <translation>EOF inesperado enquanto lendo a chave pública</translation> </message> <message> <source>Unexpected EOF while reading private key</source> - <translation>EOF inesperado enquanto lendo a chave privada.</translation> + <translation>EOF inesperado enquanto lendo a chave privada</translation> </message> <message> <source>Can't write public key as it is empty</source> - <translation>Não é possível escrever a chave pública enquanto estiver vazio.</translation> + <translation>Não é possível escrever a chave pública enquanto estiver vazio</translation> </message> <message> <source>Unexpected EOF when writing public key</source> - <translation>EOF inesperado enquanto escrevendo a chave pública.</translation> + <translation>EOF inesperado enquanto escrevendo a chave pública</translation> </message> <message> <source>Can't write private key as it is empty</source> - <translation>EOF inesperado enquanto escrevendo a chave privada.</translation> + <translation>Não é possível escrever a chave privada enquanto estiver vazio</translation> </message> <message> <source>Unexpected EOF when writing private key</source> - <translation>EOF inesperado enquanto escrevendp a chave privada.</translation> + <translation>EOF inesperado enquanto escrevendp a chave privada</translation> </message> <message> <source>Unsupported key type: %1</source> - <translation type="unfinished"/> + <translation>Tipo de chave não suportada: %1</translation> </message> <message> <source>Unknown cipher: %1</source> - <translation type="unfinished"/> + <translation>Cifra desconhecida: %1</translation> </message> <message> <source>Cipher IV is too short for MD5 kdf</source> - <translation type="unfinished"/> + <translation>Cifra de IV é muito curta para MD5 kdf</translation> </message> <message> <source>Unknown KDF: %1</source> - <translation type="unfinished"/> + <translation>KDF desconhecido: %1</translation> </message> <message> <source>Unknown key type: %1</source> - <translation type="unfinished"/> + <translation>Tipo de chave desconhecida: %1</translation> </message> </context> <context> @@ -2986,7 +3010,7 @@ This version is not meant for production use.</source> </message> <message> <source>&Match URL schemes</source> - <translation type="unfinished"/> + <translation>&Combinar esquemas de URL</translation> </message> <message> <source>Sort matching entries by &username</source> @@ -3022,7 +3046,7 @@ This version is not meant for production use.</source> </message> <message> <source>Only the selected database has to be connected with a client.</source> - <translation type="unfinished"/> + <translation>Somente o banco de dados selecionado deve estar conectado com um cliente.</translation> </message> <message> <source>Searc&h in all opened databases for matching entries</source> @@ -3050,11 +3074,11 @@ This version is not meant for production use.</source> </message> <message> <source><b>Warning:</b> The following options can be dangerous!</source> - <translation type="unfinished"/> + <translation><b>AVISO:</b> As seguintes opções podem ser perigosas!</translation> </message> <message> <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> - <translation type="unfinished"/> + <translation><p>KeePassHTTP é obsoleto e será removido no futuro. <br>Por favor mudar para KeePassXC-navegador! Para obter ajuda com a migração, visite o nosso <a href="https://keepassxc.org/docs/keepassxc-browser-migration"> guia de migração</a>.</p></translation> </message> <message> <source>Cannot bind to privileged ports</source> @@ -3092,7 +3116,7 @@ Usando porta padrão 19455.</translation> </message> <message> <source>Character Types</source> - <translation>Tipo de Caracteres</translation> + <translation>Tipos de Caracteres</translation> </message> <message> <source>Upper Case Letters</source> @@ -3112,11 +3136,11 @@ Usando porta padrão 19455.</translation> </message> <message> <source>Extended ASCII</source> - <translation type="unfinished"/> + <translation>ASCII extendido</translation> </message> <message> <source>Exclude look-alike characters</source> - <translation>Excluir caracteres semelhantes</translation> + <translation>Excluir caracteres similares</translation> </message> <message> <source>Pick characters from every group</source> @@ -3195,23 +3219,23 @@ Usando porta padrão 19455.</translation> <name>QObject</name> <message> <source>Database not opened</source> - <translation type="unfinished"/> + <translation>Banco de dados não foi aberto</translation> </message> <message> <source>Database hash not available</source> - <translation type="unfinished"/> + <translation>Hash de banco de dados não disponível</translation> </message> <message> <source>Client public key not received</source> - <translation type="unfinished"/> + <translation>Chave pública do cliente não recebida</translation> </message> <message> <source>Cannot decrypt message</source> - <translation type="unfinished"/> + <translation>Não é possível descriptografar a mensagem</translation> </message> <message> <source>Timeout or cannot connect to KeePassXC</source> - <translation type="unfinished"/> + <translation>Tempo limite ou não pode conectar ao KeePassXC</translation> </message> <message> <source>Action cancelled or denied</source> @@ -3219,31 +3243,31 @@ Usando porta padrão 19455.</translation> </message> <message> <source>Cannot encrypt message or public key not found. Is Native Messaging enabled in KeePassXC?</source> - <translation type="unfinished"/> + <translation>Não foi possível criptografar a mensagem ou chave pública não encontrada. O envio de mensagem nativo está habilitado no KeePassXC?</translation> </message> <message> <source>KeePassXC association failed, try again</source> - <translation type="unfinished"/> + <translation>KeePassXC associação falhou, tente novamente</translation> </message> <message> <source>Key change was not successful</source> - <translation type="unfinished"/> + <translation>Mudança da chave não foi bem sucedida</translation> </message> <message> <source>Encryption key is not recognized</source> - <translation type="unfinished"/> + <translation>Chave criptográfica não é reconhecida</translation> </message> <message> <source>No saved databases found</source> - <translation type="unfinished"/> + <translation>Nenhum banco de dados salvo encontrado</translation> </message> <message> <source>Incorrect action</source> - <translation type="unfinished"/> + <translation>Ação incorreta</translation> </message> <message> <source>Empty message received</source> - <translation type="unfinished"/> + <translation>Mensagem vazia recebida</translation> </message> <message> <source>No URL provided</source> @@ -3263,7 +3287,7 @@ Usando porta padrão 19455.</translation> </message> <message> <source>Path of the database.</source> - <translation>Caminho do banco de dados</translation> + <translation>Caminho do banco de dados.</translation> </message> <message> <source>Key file of the database.</source> @@ -3291,15 +3315,15 @@ Usando porta padrão 19455.</translation> </message> <message> <source>Prompt for the entry's password.</source> - <translation type="unfinished"/> + <translation>Solicitar senha da entrada.</translation> </message> <message> <source>Generate a password for the entry.</source> - <translation type="unfinished"/> + <translation>Gerar uma senha para a entrada.</translation> </message> <message> <source>Length for the generated password.</source> - <translation type="unfinished"/> + <translation>Comprimento para a senha gerada.</translation> </message> <message> <source>length</source> @@ -3311,7 +3335,7 @@ Usando porta padrão 19455.</translation> </message> <message> <source>Copy an entry's password to the clipboard.</source> - <translation type="unfinished"/> + <translation>Copiar a senha de uma entrada para a área de transferência.</translation> </message> <message> <source>Path of the entry to clip.</source> @@ -3320,7 +3344,7 @@ Usando porta padrão 19455.</translation> </message> <message> <source>Timeout in seconds before clearing the clipboard.</source> - <translation type="unfinished"/> + <translation>Tempo limite em segundos antes de limpar a área de transferência.</translation> </message> <message> <source>Edit an entry.</source> @@ -3340,19 +3364,19 @@ Usando porta padrão 19455.</translation> </message> <message> <source>Estimate the entropy of a password.</source> - <translation type="unfinished"/> + <translation>Calcular a entropia da senha.</translation> </message> <message> <source>Password for which to estimate the entropy.</source> - <translation type="unfinished"/> + <translation>Senha para o qual deseja calcular a entropia.</translation> </message> <message> <source>Perform advanced analysis on the password.</source> - <translation type="unfinished"/> + <translation>Execute análise avançada sobre a senha.</translation> </message> <message> <source>Extract and print the content of a database.</source> - <translation type="unfinished"/> + <translation>Extrair e imprimir o conteúdo do banco de dados.</translation> </message> <message> <source>Path of the database to extract.</source> @@ -3360,25 +3384,30 @@ Usando porta padrão 19455.</translation> </message> <message> <source>Insert password to unlock %1: </source> - <translation type="unfinished"/> + <translation>Inserir a senha para desbloquear %1: </translation> </message> <message> <source>Failed to load key file %1 : %2</source> - <translation type="unfinished"/> + <translation>Falha ao carregar o arquivo de chave %1: %2</translation> </message> <message> <source>WARNING: You are using a legacy key file format which may become unsupported in the future. Please consider generating a new key file.</source> - <translation type="unfinished"/> + <translation>Aviso: Você está usando um formato de arquivo de chave legado que pode tornar-se sem suporte no futuro. + +Por favor, considere gerar um novo arquivo de chave.</translation> </message> <message> <source> Available commands: </source> - <translation type="unfinished"/> + <translation> + +Comandos disponíveis: +</translation> </message> <message> <source>Name of the command to execute.</source> @@ -3390,15 +3419,15 @@ Available commands: </message> <message> <source>Path of the group to list. Default is /</source> - <translation type="unfinished"/> + <translation>Caminho do grupo para à lista. O padrão é /</translation> </message> <message> <source>Find entries quickly.</source> - <translation type="unfinished"/> + <translation>Encontrar entradas rapidamente.</translation> </message> <message> <source>Search term.</source> - <translation type="unfinished"/> + <translation>Termo de pesquisa.</translation> </message> <message> <source>Merge two databases.</source> @@ -3406,31 +3435,31 @@ Available commands: </message> <message> <source>Path of the database to merge into.</source> - <translation type="unfinished"/> + <translation>Caminho do banco de dados para combinar.</translation> </message> <message> <source>Path of the database to merge from.</source> - <translation type="unfinished"/> + <translation>Caminho do banco de dados para combinar como base.</translation> </message> <message> <source>Use the same credentials for both database files.</source> - <translation type="unfinished"/> + <translation>Use as mesmas credenciais para ambos os arquivos de banco de dados.</translation> </message> <message> <source>Key file of the database to merge from.</source> - <translation type="unfinished"/> + <translation>Arquivo de chave do banco de dados para combinar como base.</translation> </message> <message> <source>Show an entry's information.</source> - <translation type="unfinished"/> + <translation>Mostre informações de uma entrada.</translation> </message> <message> <source>Names of the attributes to show. This option can be specified more than once, with each attribute shown one-per-line in the given order. If no attributes are specified, a summary of the default attributes is given.</source> - <translation type="unfinished"/> + <translation>Nomes de atributos para exibir. Esta opção pode ser especificada mais de uma vez, com cada atributo mostrado um-por-linha em ordem determinada. Se nenhum atributo é especificado, um resumo dos atributos padrão é fornecido.</translation> </message> <message> <source>attribute</source> - <translation type="unfinished"/> + <translation>atributo</translation> </message> <message> <source>Name of the entry to show.</source> @@ -3438,48 +3467,49 @@ Available commands: </message> <message> <source>NULL device</source> - <translation type="unfinished"/> + <translation>Dispositivo nulo</translation> </message> <message> <source>error reading from device</source> - <translation type="unfinished"/> + <translation>erro ao ler dispositivo</translation> </message> <message> <source>file empty ! </source> - <translation type="unfinished"/> + <translation>Arquivo vazio! +</translation> </message> <message> <source>malformed string</source> - <translation type="unfinished"/> + <translation>sequência de caracteres malformada</translation> </message> <message> <source>missing closing quote</source> - <translation type="unfinished"/> + <translation>cotação de fechamento ausente</translation> </message> <message> <source>AES: 256-bit</source> - <translation type="unfinished"/> + <translation>AES: 256 bits</translation> </message> <message> <source>Twofish: 256-bit</source> - <translation type="unfinished"/> + <translation>Twofish: 256 bits</translation> </message> <message> <source>ChaCha20: 256-bit</source> - <translation type="unfinished"/> + <translation>ChaCha20: 256 bits</translation> </message> <message> <source>Argon2 (KDBX 4 – recommended)</source> - <translation type="unfinished"/> + <translation>Argon2 (KDBX 4 – recomendado)</translation> </message> <message> <source>AES-KDF (KDBX 4)</source> - <translation type="unfinished"/> + <translation>AES-KDF (KDBX 4)</translation> </message> <message> <source>AES-KDF (KDBX 3.1)</source> - <translation type="unfinished"/> + <translation>AES-KDF (KDBX 3.1)</translation> </message> <message> <source>Group</source> @@ -3503,15 +3533,15 @@ Available commands: </message> <message> <source>Last Modified</source> - <translation type="unfinished"/> + <translation>Última modificação</translation> </message> <message> <source>Created</source> - <translation type="unfinished"/> + <translation>Criado</translation> </message> <message> <source>Legacy Browser Integration</source> - <translation type="unfinished"/> + <translation>Integração do legado de navegador</translation> </message> <message> <source>Browser Integration</source> @@ -3519,7 +3549,7 @@ Available commands: </message> <message> <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source> - <translation type="unfinished"/> + <translation>YubiKey [%1] desafio resposta - Slot %2 - %3</translation> </message> <message> <source>Press</source> @@ -3535,48 +3565,49 @@ Available commands: </message> <message> <source>Generate a new random diceware passphrase.</source> - <translation type="unfinished"/> + <translation>Gere uma senha aleatória diceware novamente.</translation> </message> <message> <source>Word count for the diceware passphrase.</source> - <translation type="unfinished"/> + <translation>Contagem de palavra para a frase-chave diceware.</translation> </message> <message> <source>count</source> - <translation type="unfinished"/> + <translation>contagem</translation> </message> <message> <source>Wordlist for the diceware generator. [Default: EFF English]</source> - <translation type="unfinished"/> + <translation>Lista de palavras para o gerador diceware. +[Padrão: EFF inglês]</translation> </message> <message> <source>Generate a new random password.</source> - <translation type="unfinished"/> + <translation>Gerar nova senha aleatória.</translation> </message> <message> <source>Length of the generated password.</source> - <translation type="unfinished"/> + <translation>Tamanho da senha gerada.</translation> </message> <message> <source>Use lowercase characters in the generated password.</source> - <translation type="unfinished"/> + <translation>Use caracteres minúsculos na senha gerada.</translation> </message> <message> <source>Use uppercase characters in the generated password.</source> - <translation type="unfinished"/> + <translation>Use letras maiúsculas para a senha gerada.</translation> </message> <message> <source>Use numbers in the generated password.</source> - <translation type="unfinished"/> + <translation>Use números na senha gerada.</translation> </message> <message> <source>Use special characters in the generated password.</source> - <translation type="unfinished"/> + <translation>Use caracteres especiais na senha gerada.</translation> </message> <message> <source>Use extended ASCII in the generated password.</source> - <translation type="unfinished"/> + <translation>Uso estendido ASCII na senha gerada.</translation> </message> </context> <context> @@ -3684,7 +3715,7 @@ Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.< </message> <message numerus="yes"> <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Removido com êxito %n chave(s) de criptografia das configurações do KeePassX/Http.</numerusform><numerusform>Removido com êxito %n chave(s) de criptografia das configurações do KeePassX/Http.</numerusform></translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -3716,7 +3747,7 @@ Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.< </message> <message numerus="yes"> <source>Successfully removed permissions from %n entries.</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Removido com êxito as permissões de %n entradas.</numerusform><numerusform>Removido com êxito as permissões de %n entradas.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -3762,7 +3793,7 @@ Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.< </message> <message> <source>Remember last key files and security dongles</source> - <translation type="unfinished"/> + <translation>Lembre-se de arquivos de chave passados e dongles de segurança</translation> </message> <message> <source>Load previous databases on startup</source> @@ -3794,11 +3825,11 @@ Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.< </message> <message> <source>Don't mark database as modified for non-data changes (e.g., expanding groups)</source> - <translation type="unfinished"/> + <translation>Não marcar o banco de dados como modificado para alterações sem dados (por exemplo, expansão de grupos)</translation> </message> <message> <source>Hide the Details view</source> - <translation type="unfinished"/> + <translation>Ocultar a visualização de detalhes</translation> </message> <message> <source>Show a system tray icon</source> @@ -3814,7 +3845,7 @@ Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.< </message> <message> <source>Dark system tray icon</source> - <translation type="unfinished"/> + <translation>Ícone de bandeja do sistema escuro</translation> </message> <message> <source>Language</source> @@ -3826,15 +3857,15 @@ Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.< </message> <message> <source>Use entry title to match windows for global Auto-Type</source> - <translation type="unfinished"/> + <translation>Usar o título de entrada para coincidir com a janela para Auto-Digitar global</translation> </message> <message> <source>Use entry URL to match windows for global Auto-Type</source> - <translation type="unfinished"/> + <translation>Use o URL de entrada para coincidir com a janela para Auto-Digitar global</translation> </message> <message> <source>Always ask before performing Auto-Type</source> - <translation type="unfinished"/> + <translation>Sempre perguntar antes de executar o Auto-Digitar</translation> </message> <message> <source>Global Auto-Type shortcut</source> @@ -3842,7 +3873,7 @@ Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.< </message> <message> <source>Auto-Type delay</source> - <translation type="unfinished"/> + <translation>Atraso de autotipo</translation> </message> <message> <source> ms</source> @@ -3851,23 +3882,23 @@ Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.< </message> <message> <source>Startup</source> - <translation type="unfinished"/> + <translation>Inicialização</translation> </message> <message> <source>File Management</source> - <translation type="unfinished"/> + <translation>Gerenciamento de Arquivo</translation> </message> <message> <source>Safely save database files (may be incompatible with Dropbox, etc)</source> - <translation type="unfinished"/> + <translation>Salvar seguramente os arquivos de banco de dados (pode ser incompatível com o Dropbox, etc)</translation> </message> <message> <source>Backup database file before saving</source> - <translation type="unfinished"/> + <translation>Fazer cópia de segurança do banco de dados antes de salvar</translation> </message> <message> <source>Entry Management</source> - <translation type="unfinished"/> + <translation>Gerenciamento de entrada</translation> </message> <message> <source>General</source> @@ -3878,7 +3909,7 @@ Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.< <name>SettingsWidgetSecurity</name> <message> <source>Timeouts</source> - <translation type="unfinished"/> + <translation>Tempos limite</translation> </message> <message> <source>Clear clipboard after</source> @@ -3899,7 +3930,7 @@ Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.< </message> <message> <source>Lock databases when session is locked or lid is closed</source> - <translation type="unfinished"/> + <translation>Bloqueio de bancos de dados quando a sessão estiver bloqueada ou a tampa está fechada</translation> </message> <message> <source>Lock databases after minimizing the window</source> @@ -3915,11 +3946,11 @@ Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.< </message> <message> <source>Hide passwords in the preview panel</source> - <translation type="unfinished"/> + <translation>Ocultar senhas no painel de visualização</translation> </message> <message> <source>Hide entry notes by default</source> - <translation type="unfinished"/> + <translation>Esconder notas de entrada por padrão</translation> </message> <message> <source>Privacy</source> @@ -3927,11 +3958,11 @@ Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.< </message> <message> <source>Use Google as fallback for downloading website icons</source> - <translation type="unfinished"/> + <translation>Usar o Google como fallback para baixar ícones do site</translation> </message> <message> <source>Re-lock previously locked database after performing Auto-Type</source> - <translation type="unfinished"/> + <translation>Bloquear novamente o banco de dados anteriormente bloqueado depois de executar o Auto-Digitar</translation> </message> </context> <context> @@ -3946,11 +3977,11 @@ Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.< </message> <message> <source>Default RFC 6238 token settings</source> - <translation type="unfinished"/> + <translation>Configurações de símbolo padrão RFC 6238</translation> </message> <message> <source>Steam token settings</source> - <translation type="unfinished"/> + <translation>Configurações de steam token</translation> </message> <message> <source>Use custom settings</source> @@ -4040,22 +4071,22 @@ Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.< </message> <message> <source>Welcome to KeePassXC %1</source> - <translation type="unfinished"/> + <translation>Bem-vindo ao KeePassXC %1</translation> </message> </context> <context> <name>main</name> <message> <source>Remove an entry from the database.</source> - <translation type="unfinished"/> + <translation>Remover entrada do banco de dados.</translation> </message> <message> <source>Path of the database.</source> - <translation>Caminho do banco de dados</translation> + <translation>Caminho do banco de dados.</translation> </message> <message> <source>Path of the entry to remove.</source> - <translation type="unfinished"/> + <translation>Caminho do item à ser removido.</translation> </message> <message> <source>KeePassXC - cross-platform password manager</source> @@ -4079,7 +4110,7 @@ Desbloqueie base de dados selecionada ou escolha outra que esteja desbloqueada.< </message> <message> <source>Parent window handle</source> - <translation type="unfinished"/> + <translation>Identificador de janela pai</translation> </message> </context> </TS> \ No newline at end of file diff --git a/share/translations/keepassx_pt_PT.ts b/share/translations/keepassx_pt_PT.ts index d3ecd7b61..878c18eec 100644 --- a/share/translations/keepassx_pt_PT.ts +++ b/share/translations/keepassx_pt_PT.ts @@ -73,12 +73,13 @@ Kernel: %3 %4</translation> </message> <message> <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> - <translation type="unfinished"/> + <translation>Um agradecimento especial da equipa do KeePassXC a debfx por ter criado a aplicação KeePassX.</translation> </message> <message> <source>Build Type: %1 </source> - <translation type="unfinished"/> + <translation>Tipo de compilação: %1 +</translation> </message> </context> <context> @@ -372,6 +373,10 @@ Selecione se deseja permitir o acesso.</translation> <source>Select custom proxy location</source> <translation>Selecionar localização do proxy personalizado</translation> </message> + <message> + <source>We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</source> + <translation>Lamentamos mas, no momento, o KeePassXC-Browser não tem suporte a versões Snap.</translation> + </message> </context> <context> <name>BrowserService</name> @@ -518,7 +523,7 @@ Desbloqueie a base de dados selecionada ou escolha outra que esteja desbloqueada </message> <message> <source>Unable to create Key File : </source> - <translation>Não foi possível criar o ficheiro-chave:</translation> + <translation>Incapaz de criar o ficheiro-chave:</translation> </message> <message> <source>Select a key file</source> @@ -632,7 +637,7 @@ Deve considerar a geração de uma novo ficheiro-chave.</translation> </message> <message> <source>Column layout</source> - <translation>Disposição de colunas</translation> + <translation>Disposição das colunas</translation> </message> <message> <source>Not present in CSV file</source> @@ -681,14 +686,14 @@ Deve considerar a geração de uma novo ficheiro-chave.</translation> </message> <message> <source>Unable to calculate master key</source> - <translation>Não foi possível calcular a chave-mestre</translation> + <translation>Impossível de calcular a chave-mestre</translation> </message> </context> <context> <name>CsvParserModel</name> <message numerus="yes"> <source>%n byte(s), </source> - <translation><numerusform>%n byte,</numerusform><numerusform>%n byte(s), </numerusform></translation> + <translation><numerusform>%n bytes, </numerusform><numerusform>%n bytes, </numerusform></translation> </message> <message numerus="yes"> <source>%n row(s), </source> @@ -727,7 +732,7 @@ Deve considerar a geração de uma novo ficheiro-chave.</translation> </message> <message> <source>Unable to open the database.</source> - <translation>Não foi possível abrir a base de dados.</translation> + <translation>Incapaz de abrir a base de dados.</translation> </message> <message> <source>Can't open key file</source> @@ -780,7 +785,7 @@ Deve considerar a geração de uma novo ficheiro-chave.</translation> </message> <message> <source>Unable to open the database.</source> - <translation>Não foi possível abrir a base de dados.</translation> + <translation>Incapaz de abrir a base de dados.</translation> </message> <message> <source>Database opened fine. Nothing to do.</source> @@ -798,7 +803,7 @@ Agora já a pode guardar.</translation> </message> <message> <source>Unable to repair the database.</source> - <translation>Não foi possível reparar a base de dados.</translation> + <translation>Incapaz de reparar a base de dados.</translation> </message> </context> <context> @@ -971,7 +976,7 @@ Se mantiver este número, a sua base de dados pode ser desbloqueada muito facilm </message> <message> <source>Unable to open the database.</source> - <translation>Não foi possível abrir a base de dados.</translation> + <translation>Incapaz de abrir a base de dados.</translation> </message> <message> <source>File opened in read only mode.</source> @@ -1118,7 +1123,7 @@ Desativar salvaguardas e tentar novamente?</translation> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>Deseja mesmo mover %n entrada para a reciclagem?</numerusform><numerusform>Deseja mesmo mover %n entradas para a reciclagem?</numerusform></translation> + <translation><numerusform>Pretende realmente mover a entrada(s) %n para a reciclagem ?</numerusform><numerusform>Deseja mesmo mover %n entrada(s) para a reciclagem?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1142,7 +1147,7 @@ Desativar salvaguardas e tentar novamente?</translation> </message> <message> <source>Unable to calculate master key</source> - <translation>Não foi possível calcular a chave-mestre</translation> + <translation>Impossível de calcular a chave-mestre</translation> </message> <message> <source>No current database.</source> @@ -1190,10 +1195,6 @@ Deseja juntar as suas alterações?</translation> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>Tem a certeza de que deseja apagar permanentemente os itens da reciclagem?</translation> </message> - <message> - <source>Entry updated successfully.</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DetailsWidget</name> @@ -1370,11 +1371,11 @@ Deseja juntar as suas alterações?</translation> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation><numerusform>%n semana</numerusform><numerusform>%n semanas</numerusform></translation> + <translation><numerusform>%n semana(s)</numerusform><numerusform>%n semana(s)</numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation><numerusform>%n mês</numerusform><numerusform>%n meses</numerusform></translation> + <translation><numerusform>%n mês</numerusform><numerusform>%n mês(es)</numerusform></translation> </message> <message> <source>1 year</source> @@ -1382,15 +1383,15 @@ Deseja juntar as suas alterações?</translation> </message> <message> <source>Apply generated password?</source> - <translation type="unfinished"/> + <translation>Aplicar palavra-passe gerada?</translation> </message> <message> <source>Do you want to apply the generated password to this entry?</source> - <translation type="unfinished"/> + <translation>Deseja aplicar a palavra-passe gerada para esta entrada?</translation> </message> <message> <source>Entry updated successfully.</source> - <translation type="unfinished"/> + <translation>Entrada atualizada com sucesso.</translation> </message> </context> <context> @@ -1417,7 +1418,7 @@ Deseja juntar as suas alterações?</translation> </message> <message> <source>Reveal</source> - <translation>Mostrar</translation> + <translation>Revelar</translation> </message> <message> <source>Attachments</source> @@ -1425,11 +1426,11 @@ Deseja juntar as suas alterações?</translation> </message> <message> <source>Foreground Color:</source> - <translation type="unfinished"/> + <translation>Cor principal:</translation> </message> <message> <source>Background Color:</source> - <translation type="unfinished"/> + <translation>Cor secundária:</translation> </message> </context> <context> @@ -1652,7 +1653,7 @@ Deseja juntar as suas alterações?</translation> </message> <message> <source>Search</source> - <translation>Pesquisa</translation> + <translation>Procurar</translation> </message> <message> <source>Auto-Type</source> @@ -1691,7 +1692,7 @@ Deseja juntar as suas alterações?</translation> </message> <message> <source>Unable to fetch favicon.</source> - <translation>Não foi possível obter o 'favicon'.</translation> + <translation>Incapaz de obter o 'favicon'.</translation> </message> <message> <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> @@ -1746,7 +1747,7 @@ Deseja juntar as suas alterações?</translation> </message> <message> <source>Plugin Data</source> - <translation type="unfinished"/> + <translation>Dados do plugin</translation> </message> <message> <source>Remove</source> @@ -1754,20 +1755,21 @@ Deseja juntar as suas alterações?</translation> </message> <message> <source>Delete plugin data?</source> - <translation type="unfinished"/> + <translation>Apagar dados do plugin?</translation> </message> <message> <source>Do you really want to delete the selected plugin data? This may cause the affected plugins to malfunction.</source> - <translation type="unfinished"/> + <translation>Tem a certeza de que deseja apagar os dados do plugin? +Esta ação pode implicar um funcionamento errático.</translation> </message> <message> <source>Key</source> - <translation type="unfinished"/> + <translation>Chave</translation> </message> <message> <source>Value</source> - <translation type="unfinished"/> + <translation>Valor</translation> </message> </context> <context> @@ -1974,6 +1976,10 @@ This may cause the affected plugins to malfunction.</source> <source>Reset to defaults</source> <translation>Repor predefinições</translation> </message> + <message> + <source>Attachments (icon)</source> + <translation>Anexos (ícone)</translation> + </message> </context> <context> <name>Group</name> @@ -2125,7 +2131,7 @@ This may cause the affected plugins to malfunction.</source> </message> <message> <source>Failed to open buffer for KDF parameters in header</source> - <translation type="unfinished"/> + <translation>Falha ao processar os parâmetros KDF no cabeçalho</translation> </message> <message> <source>Unsupported key derivation function (KDF) or invalid parameters</source> @@ -2212,12 +2218,12 @@ This may cause the affected plugins to malfunction.</source> <name>Kdbx4Writer</name> <message> <source>Invalid symmetric cipher algorithm.</source> - <translation type="unfinished"/> + <translation>Algoritmo inválido de cifra simétrica.</translation> </message> <message> <source>Invalid symmetric cipher IV size.</source> <comment>IV = Initialization Vector for symmetric cipher</comment> - <translation type="unfinished"/> + <translation>Algoritmo inválido de cifra simétrica IV.</translation> </message> <message> <source>Unable to calculate master key</source> @@ -2330,7 +2336,7 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados </message> <message> <source>No group uuid found</source> - <translation type="unfinished"/> + <translation>UUID de grupo não encontrado</translation> </message> <message> <source>Null DeleteObject uuid</source> @@ -2382,7 +2388,7 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados </message> <message> <source>Auto-type association window or sequence missing</source> - <translation type="unfinished"/> + <translation>Associação de escrita automática ou sequência em falta</translation> </message> <message> <source>Invalid bool value</source> @@ -2422,14 +2428,14 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados </message> <message> <source>Unable to open the database.</source> - <translation>Não foi possível abrir a base de dados.</translation> + <translation>Incapaz de abrir a base de dados.</translation> </message> </context> <context> <name>KeePass1Reader</name> <message> <source>Unable to read keyfile.</source> - <translation>Não foi possível ler o ficheiro-chave.</translation> + <translation>Incapaz de ler o ficheiro-chave.</translation> </message> <message> <source>Not a KeePass database.</source> @@ -2478,7 +2484,7 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados </message> <message> <source>Unable to calculate master key</source> - <translation>Não foi possível calcular a chave-mestre</translation> + <translation>Incapaz de calcular a chave-mestre</translation> </message> <message> <source>Wrong key or database file is corrupt.</source> @@ -2736,7 +2742,7 @@ Esta é uma migração unidirecional. Não será possível abrir a base de dados </message> <message> <source>Password Generator</source> - <translation>Gerador de palavra-passe</translation> + <translation>Gerador de palavras-passe</translation> </message> <message> <source>&Perform Auto-Type</source> @@ -2955,7 +2961,7 @@ Esta versão não deve ser utilizada para uma utilização regular.</translation </message> <message> <source>Cipher IV is too short for MD5 kdf</source> - <translation type="unfinished"/> + <translation>Cifra IV é muito curta para MD kdf</translation> </message> <message> <source>Unknown KDF: %1</source> @@ -3019,7 +3025,7 @@ Esta versão não deve ser utilizada para uma utilização regular.</translation </message> <message> <source>R&emove all shared encryption keys from active database</source> - <translation>R&emover todas as chaves de cifra partilhadas da base de dados ativa</translation> + <translation>R&emover todas as chaves cifradas partilhadas da base de dados ativa</translation> </message> <message> <source>Re&move all stored permissions from entries in active database</source> @@ -3071,7 +3077,7 @@ Esta versão não deve ser utilizada para uma utilização regular.</translation </message> <message> <source><b>Warning:</b> The following options can be dangerous!</source> - <translation><b>Atenção</b>: as opções seguintes podem ser perigosas!</translation> + <translation><b>AVISO</b>: as opções seguintes podem ser perigosas!</translation> </message> <message> <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> @@ -3129,7 +3135,7 @@ Será utilizada a porta 19455 (padrão).</translation> </message> <message> <source>Special Characters</source> - <translation>Caracteres especiais</translation> + <translation>Caracteres especiais</translation> </message> <message> <source>Extended ASCII</source> @@ -3687,7 +3693,7 @@ KeePassXC, atribua um nome único para a identificar e aceitar.</translation> <source>A shared encryption-key with the name "%1" already exists. Do you want to overwrite it?</source> <translation>Já existe uma chave de cifra partilhada com o nome "%1". -Deseja substituir a chave atual?</translation> +Deseja substituir a chave de cifra?</translation> </message> <message> <source>KeePassXC: Update Entry</source> @@ -3709,11 +3715,11 @@ Desbloqueie a base de dados selecionada ou escolha outra que esteja desbloqueada </message> <message> <source>KeePassXC: Removed keys from database</source> - <translation>KeePassXC: Chaves removidas da base de dados</translation> + <translation>KeePassXC: Remover chaves da base de dados</translation> </message> <message numerus="yes"> <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> - <translation><numerusform>Removidas com sucesso % chave de cifra das definições KeePassX/Http.</numerusform><numerusform>Removidas com sucesso % chaves de cifra das definições KeePassX/Http.</numerusform></translation> + <translation><numerusform>Removida com sucesso %n chave de cifra das definições KeePassX/Http.</numerusform><numerusform>Removidas com sucesso % chaves de cifra das definições KeePassX/Http.</numerusform></translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -3721,7 +3727,7 @@ Desbloqueie a base de dados selecionada ou escolha outra que esteja desbloqueada </message> <message> <source>No shared encryption-keys found in KeePassHttp Settings.</source> - <translation>Não existem chaves de cifra partilhadas nas definições do KeePassHttp.</translation> + <translation>Nenhuma chaves de cifra partilhadas encontrada nas definições do KeePassHttp.</translation> </message> <message> <source>KeePassXC: Settings not available!</source> diff --git a/share/translations/keepassx_ro.ts b/share/translations/keepassx_ro.ts index 540ecba74..553092057 100644 --- a/share/translations/keepassx_ro.ts +++ b/share/translations/keepassx_ro.ts @@ -23,7 +23,7 @@ </message> <message> <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Vezi contibuțiile pe GitHub</a></translation> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Vezi contribuțiile pe GitHub</a></translation> </message> <message> <source>Debug Info</source> @@ -40,7 +40,7 @@ <message> <source>Version %1 </source> - <translation>Versiunea %1 + <translation>Versiune %1 </translation> </message> <message> @@ -116,7 +116,7 @@ Please select whether you want to allow access.</source> <name>AutoType</name> <message> <source>Couldn't find an entry that matches the window title:</source> - <translation>Nu a putut fi gasită o intrare care să coincidă cu titlul ferestrei:</translation> + <translation>Nu a putut fi gasită nicio intrare care să coincidă cu titlul ferestrei:</translation> </message> <message> <source>Auto-Type - KeePassXC</source> @@ -370,6 +370,10 @@ Please select whether you want to allow access.</source> <source>Select custom proxy location</source> <translation type="unfinished"/> </message> + <message> + <source>We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>BrowserService</name> @@ -467,7 +471,7 @@ Please unlock the selected database or choose another one which is unlocked.</so <name>ChangeMasterKeyWidget</name> <message> <source>Password</source> - <translation>Parolă</translation> + <translation>Parola</translation> </message> <message> <source>Enter password:</source> @@ -680,11 +684,11 @@ Please consider generating a new key file.</source> </message> <message numerus="yes"> <source>%n row(s), </source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n rând, </numerusform><numerusform>%n rânduri, </numerusform><numerusform>%n rânduri, </numerusform></translation> </message> <message numerus="yes"> <source>%n column(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n coloană</numerusform><numerusform>%n coloane</numerusform><numerusform>%n coloane</numerusform></translation> </message> </context> <context> @@ -765,7 +769,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Unable to open the database.</source> - <translation>Nu pot deschide baza de date.</translation> + <translation>Baza de date nu poate fi deschisă.</translation> </message> <message> <source>Database opened fine. Nothing to do.</source> @@ -951,7 +955,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Unable to open the database.</source> - <translation>Nu pot deschide baza de date.</translation> + <translation>Baza de date nu poate fi deschisă.</translation> </message> <message> <source>File opened in read only mode.</source> @@ -971,7 +975,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Merge database</source> - <translation>Îmbină baza de date</translation> + <translation>Îmbina baza de date</translation> </message> <message> <source>Open KeePass 1 database</source> @@ -1121,7 +1125,7 @@ Disable safe saves and try again?</source> </message> <message> <source>No current database.</source> - <translation>Nu există o baza de date curentă.</translation> + <translation>Nu există o bază de date curentă.</translation> </message> <message> <source>No source database, nothing to do.</source> @@ -1164,16 +1168,12 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation type="unfinished"/> </message> - <message> - <source>Entry updated successfully.</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DetailsWidget</name> <message> <source>Generate TOTP Token</source> - <translation>Genereaza token TOTP</translation> + <translation>Generează token TOTP</translation> </message> <message> <source>Close</source> @@ -1185,7 +1185,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Password</source> - <translation>Parolă</translation> + <translation>Parola</translation> </message> <message> <source>URL</source> @@ -1328,7 +1328,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Are you sure you want to remove this attribute?</source> - <translation>Sunteți sigur că doriți să eliminați acest atribut?</translation> + <translation>Sigur doriți să eliminați acest atribut?</translation> </message> <message> <source>[PROTECTED]</source> @@ -1344,11 +1344,11 @@ Do you want to merge your changes?</source> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n săptămână</numerusform><numerusform>%n săptămâni</numerusform><numerusform>%n săptămâni</numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n lună</numerusform><numerusform>%n luni</numerusform><numerusform>%n luni</numerusform></translation> </message> <message> <source>1 year</source> @@ -1767,7 +1767,7 @@ This may cause the affected plugins to malfunction.</source> <name>EntryAttachmentsWidget</name> <message> <source>Form</source> - <translation>De la</translation> + <translation>Formular</translation> </message> <message> <source>Add</source> @@ -1890,7 +1890,7 @@ This may cause the affected plugins to malfunction.</source> </message> <message> <source>Password</source> - <translation>Parolă</translation> + <translation>Parola</translation> </message> <message> <source>Notes</source> @@ -1943,6 +1943,10 @@ This may cause the affected plugins to malfunction.</source> <source>Reset to defaults</source> <translation type="unfinished"/> </message> + <message> + <source>Attachments (icon)</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Group</name> @@ -3247,7 +3251,7 @@ Using default port 19455.</source> </message> <message> <source>Path of the database.</source> - <translation>Calea către baza de date</translation> + <translation>Calea către baza de date.</translation> </message> <message> <source>Key file of the database.</source> diff --git a/share/translations/keepassx_ru.ts b/share/translations/keepassx_ru.ts index 42ee1daaf..1b3b327fc 100644 --- a/share/translations/keepassx_ru.ts +++ b/share/translations/keepassx_ru.ts @@ -15,7 +15,7 @@ </message> <message> <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> - <translation>KeePassXC распространяется на условиях универсальной общественной лицензии GNU (GPL) версии 2 или 3 (на ваше усмотрение).</translation> + <translation>KeePassXC распространяется на условиях Стандартной общественной лицензии GNU (GPL) версии 2 или (на ваше усмотрение) версии 3.</translation> </message> <message> <source>Contributors</source> @@ -31,7 +31,7 @@ </message> <message> <source>Include the following information whenever you report a bug:</source> - <translation>Добавьте в сообщение об ошибке следующую информацию:</translation> + <translation>Включите следующую информацию, когда сообщаете об ошибке:</translation> </message> <message> <source>Copy to clipboard</source> @@ -103,7 +103,7 @@ Kernel: %3 %4</source> <message> <source>%1 has requested access to passwords for the following item(s). Please select whether you want to allow access.</source> - <translation>%1 запросил доступ к паролям для следующего элемента(-ов). + <translation>%1 запросил доступ к паролям для следующего элемента(ов). Разрешить доступ?</translation> </message> </context> @@ -211,7 +211,7 @@ Please select whether you want to allow access.</source> <message> <source>%1 has requested access to passwords for the following item(s). Please select whether you want to allow access.</source> - <translation>%1 запросил доступ к паролям для следующего элемента(ов). + <translation>%1 запросил доступ к паролям для следующего элемента(-ов). Разрешить доступ?</translation> </message> </context> @@ -373,6 +373,10 @@ Please select whether you want to allow access.</source> <source>Select custom proxy location</source> <translation>Выбрать другое расположение прокси</translation> </message> + <message> + <source>We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</source> + <translation>Извините, но KeePassXC-Browser не поддерживается для Snap выпусков на данный момент.</translation> + </message> </context> <context> <name>BrowserService</name> @@ -444,7 +448,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message numerus="yes"> <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> - <translation><numerusform>Успешно удалена %n ключ(и) шифрования от KeePassXC параметров.</numerusform><numerusform>Успешно удалена %n ключ(и) шифрования от KeePassXC параметров.</numerusform><numerusform>Успешно удалена %n ключ(и) шифрования от KeePassXC параметров.</numerusform><numerusform>Успешно удалено %n ключей шифрования из параметров KeePassXC.</numerusform></translation> + <translation><numerusform>Успешно удален %n ключ шифрования из параметров KeePassXC.</numerusform><numerusform>Успешно удалено %n ключей шифрования из параметров KeePassXC.</numerusform><numerusform>Успешно удалено %n ключей шифрования из параметров KeePassXC.</numerusform><numerusform>Успешно удалено %n ключей шифрования из параметров KeePassXC.</numerusform></translation> </message> <message> <source>Removing stored permissions…</source> @@ -460,7 +464,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message numerus="yes"> <source>Successfully removed permissions from %n entry(s).</source> - <translation><numerusform>Успешно удалены разрешения от %n entry(s).</numerusform><numerusform>Успешно удалены разрешения от %n entry(s).</numerusform><numerusform>Успешно удалены разрешения от %n entry(s).</numerusform><numerusform>Успешно удалены доступы для %n записей.</numerusform></translation> + <translation><numerusform>Успешно удалены доступы для %n записи.</numerusform><numerusform>Успешно удалены доступы для %n записей.</numerusform><numerusform>Успешно удалены доступы для %n записей.</numerusform><numerusform>Успешно удалены доступы для %n записей.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -487,7 +491,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>&Key file</source> - <translation>&Ключевой файл</translation> + <translation>&Ключ-файл</translation> </message> <message> <source>Browse</source> @@ -499,7 +503,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Cha&llenge Response</source> - <translation>&Вызов-ответ</translation> + <translation>Запрос ответа</translation> </message> <message> <source>Refresh</source> @@ -507,7 +511,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Key files</source> - <translation>Файлы ключей</translation> + <translation>Файлы-ключи</translation> </message> <message> <source>All files</source> @@ -515,15 +519,15 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Create Key File...</source> - <translation>Создать ключевой файл...</translation> + <translation>Создать ключ-файл...</translation> </message> <message> <source>Unable to create Key File : </source> - <translation>Невозможно создать ключевой файл:</translation> + <translation>Невозможно создать ключ-файл:</translation> </message> <message> <source>Select a key file</source> - <translation>Выберите ключевой файл</translation> + <translation>Выбрать ключ-файл</translation> </message> <message> <source>Empty password</source> @@ -540,7 +544,7 @@ Please unlock the selected database or choose another one which is unlocked.</so <message> <source>Failed to set %1 as the Key file: %2</source> - <translation>Не удалось установить %1 ключевым файлом: + <translation>Не удалось установить %1 как файл-ключ: %2</translation> </message> <message> @@ -558,7 +562,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Changing master key failed: no YubiKey inserted.</source> - <translation>Не удалось сменить мастер-ключ: YubiKey не подключен.</translation> + <translation>Не удалось сменить мастер-ключ: ни один YubiKey не вставлен.</translation> </message> </context> <context> @@ -588,11 +592,11 @@ Please consider generating a new key file.</source> </message> <message> <source>filename</source> - <translation>имя файла</translation> + <translation>Имя файла</translation> </message> <message> <source>size, rows, columns</source> - <translation>размер, строк, столбцов </translation> + <translation>размер, строк, столбцов</translation> </message> <message> <source>Encoding</source> @@ -600,7 +604,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Codec</source> - <translation>Кодировка</translation> + <translation>Кодек</translation> </message> <message> <source>Text is qualified by</source> @@ -608,31 +612,31 @@ Please consider generating a new key file.</source> </message> <message> <source>Fields are separated by</source> - <translation>Разделитель полей</translation> + <translation>Параметры разделены</translation> </message> <message> <source>Comments start with</source> - <translation>Символ начала комментария</translation> + <translation>Комментарии начинаются с</translation> </message> <message> <source>First record has field names</source> - <translation>Первая запись содержит имена полей</translation> + <translation>Первая запись полей</translation> </message> <message> <source>Number of headers line to discard</source> - <translation>Пропустить строк в начале</translation> + <translation>Количество строк заголовков для удаления</translation> </message> <message> <source>Consider '\' an escape character</source> - <translation>Символ «\» является экранирующим</translation> + <translation>Рассматривать маскирующим символом «\»</translation> </message> <message> <source>Preview</source> - <translation>Предварительный просмотр</translation> + <translation>Предпросмотр</translation> </message> <message> <source>Column layout</source> - <translation>Назначение столбцов</translation> + <translation>Расположение столбцов</translation> </message> <message> <source>Not present in CSV file</source> @@ -644,7 +648,7 @@ Please consider generating a new key file.</source> </message> <message> <source>column </source> - <translation>столбец </translation> + <translation>Столбец </translation> </message> <message> <source>Imported from CSV file</source> @@ -688,15 +692,15 @@ Please consider generating a new key file.</source> <name>CsvParserModel</name> <message numerus="yes"> <source>%n byte(s), </source> - <translation><numerusform>%n байт(а), </numerusform><numerusform>%n байт(а), </numerusform><numerusform>%n байт(а), </numerusform><numerusform>%n байт(а), </numerusform></translation> + <translation><numerusform>%n байт, </numerusform><numerusform>%n байт(а), </numerusform><numerusform>%n байт(а), </numerusform><numerusform>%n байт(а), </numerusform></translation> </message> <message numerus="yes"> <source>%n row(s), </source> - <translation><numerusform>%n строк, </numerusform><numerusform>%n строк, </numerusform><numerusform>%n строк, </numerusform><numerusform>%n строк, </numerusform></translation> + <translation><numerusform>%n строка, </numerusform><numerusform>%n строк, </numerusform><numerusform>%n строк, </numerusform><numerusform>%n строк, </numerusform></translation> </message> <message numerus="yes"> <source>%n column(s)</source> - <translation><numerusform>%n столбцов</numerusform><numerusform>%n столбцов</numerusform><numerusform>%n столбцов</numerusform><numerusform>%n столбцов</numerusform></translation> + <translation><numerusform>%n столбец</numerusform><numerusform>%n столбцов</numerusform><numerusform>%n столбцов</numerusform><numerusform>%n столбцов</numerusform></translation> </message> </context> <context> @@ -707,7 +711,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Key File:</source> - <translation>Ключевой файл:</translation> + <translation>Ключ-файл:</translation> </message> <message> <source>Password:</source> @@ -715,7 +719,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Browse</source> - <translation>Обзор файлов</translation> + <translation>Обзор</translation> </message> <message> <source>Refresh</source> @@ -723,7 +727,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Challenge Response:</source> - <translation>Вызов-ответ:</translation> + <translation>Запрос ответа:</translation> </message> <message> <source>Unable to open the database.</source> @@ -731,7 +735,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Can't open key file</source> - <translation>Не удается открыть ключевой файл</translation> + <translation>Не удается открыть ключ-файл</translation> </message> <message> <source>Legacy key file format</source> @@ -756,11 +760,11 @@ Please consider generating a new key file.</source> </message> <message> <source>Key files</source> - <translation>Ключевые файлы</translation> + <translation>Ключ-файлы</translation> </message> <message> <source>Select key file</source> - <translation>Выберите ключевой файл</translation> + <translation>Выберите файл-ключ</translation> </message> </context> <context> @@ -775,7 +779,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Can't open key file</source> - <translation>Не удается открыть ключевой файл</translation> + <translation>Не могу открыть файл-ключ</translation> </message> <message> <source>Unable to open the database.</source> @@ -783,7 +787,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Database opened fine. Nothing to do.</source> - <translation>База данных успешна открыта. Больше нечего делать.</translation> + <translation>База данных открылось прекрасно. Больше нечего делать.</translation> </message> <message> <source>Success</source> @@ -860,7 +864,7 @@ If you keep this number, your database may be too easy to crack!</source> <message numerus="yes"> <source> thread(s)</source> <comment>Threads for parallel execution (KDF settings)</comment> - <translation><numerusform>поток</numerusform><numerusform>потока</numerusform><numerusform>потоков</numerusform><numerusform>потоков</numerusform></translation> + <translation><numerusform> поток</numerusform><numerusform>потоков</numerusform><numerusform>потоков</numerusform><numerusform>поток(ов)</numerusform></translation> </message> </context> <context> @@ -883,7 +887,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Transform rounds:</source> - <translation>Количество раундов преобразования:</translation> + <translation>Раундов преобразований:</translation> </message> <message> <source>Benchmark 1-second delay</source> @@ -930,7 +934,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source> MiB</source> - <translation> МиБ</translation> + <translation>МиБ</translation> </message> <message> <source>Use recycle bin</source> @@ -970,7 +974,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Unable to open the database.</source> - <translation>Невозможно открыть базу данных.</translation> + <translation>Не удаётся открыть базу данных.</translation> </message> <message> <source>File opened in read only mode.</source> @@ -1056,7 +1060,7 @@ Save changes?</source> <source>Can't lock the database as you are currently editing it. Please press cancel to finish your changes or discard them.</source> <translation>Невозможно заблокировать базу данных, так как вы в настоящее время редактируете её. -Нажмите Отмена, чтобы завершить изменения или отменить их.</translation> +Нажмите Отмена, чтобы завершить изменения или отклонить их.</translation> </message> <message> <source>This database has been modified. @@ -1085,7 +1089,7 @@ Disable safe saves and try again?</source> </message> <message> <source>Change master key</source> - <translation>Сменить мастер-пароль</translation> + <translation>Изменить мастер-пароль</translation> </message> <message> <source>Delete entry?</source> @@ -1117,7 +1121,7 @@ Disable safe saves and try again?</source> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>Вы действительно хотите переместить %n entry(s) в корзину?</numerusform><numerusform>Вы действительно хотите переместить %n entry(s) в корзину?</numerusform><numerusform>Вы действительно хотите переместить %n entry(s) в корзину?</numerusform><numerusform>Вы действительно хотите переместить %n записей в корзину?</numerusform></translation> + <translation><numerusform>Вы действительно хотите поместить %n запись в корзину?</numerusform><numerusform>Вы действительно хотите поместить %n записи в корзину?</numerusform><numerusform>Вы действительно хотите поместить %n записей в корзину?</numerusform><numerusform>Вы действительно хотите поместить %n записей в корзину?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1189,10 +1193,6 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>Удалить все из корзины?</translation> </message> - <message> - <source>Entry updated successfully.</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DetailsWidget</name> @@ -1285,7 +1285,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Advanced</source> - <translation>Дополнительные</translation> + <translation>Расширенные</translation> </message> <message> <source>Icon</source> @@ -1337,7 +1337,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Edit entry</source> - <translation>Редактировать запись</translation> + <translation>Править запись</translation> </message> <message> <source>Different passwords supplied.</source> @@ -1369,11 +1369,11 @@ Do you want to merge your changes?</source> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation><numerusform>%n нед</numerusform><numerusform>%n нед</numerusform><numerusform>%n нед</numerusform><numerusform>%n недель</numerusform></translation> + <translation><numerusform>%n неделя</numerusform><numerusform>%n недели</numerusform><numerusform>%n недель</numerusform><numerusform>%n недель</numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation><numerusform>%n месяц(-а)(-ев)</numerusform><numerusform>%n месяц(-а)(-ев)</numerusform><numerusform>%n месяц(-а)(-ев)</numerusform><numerusform>%n месяцев</numerusform></translation> + <translation><numerusform>%n месяц</numerusform><numerusform>%n месяца</numerusform><numerusform>%n месяцев</numerusform><numerusform>%n месяцев</numerusform></translation> </message> <message> <source>1 year</source> @@ -1381,15 +1381,15 @@ Do you want to merge your changes?</source> </message> <message> <source>Apply generated password?</source> - <translation type="unfinished"/> + <translation>Применить сгенерированный пароль?</translation> </message> <message> <source>Do you want to apply the generated password to this entry?</source> - <translation type="unfinished"/> + <translation>Вы действительно хотите применить сгенерированный пароль к этой записи?</translation> </message> <message> <source>Entry updated successfully.</source> - <translation type="unfinished"/> + <translation>Запись успешно обновлена.</translation> </message> </context> <context> @@ -1424,11 +1424,11 @@ Do you want to merge your changes?</source> </message> <message> <source>Foreground Color:</source> - <translation type="unfinished"/> + <translation>Цвет переднего плана:</translation> </message> <message> <source>Background Color:</source> - <translation type="unfinished"/> + <translation>Цвет фона:</translation> </message> </context> <context> @@ -1443,7 +1443,7 @@ Do you want to merge your changes?</source> </message> <message> <source>&Use custom Auto-Type sequence:</source> - <translation>&Использовать свою последовательность автоввода:</translation> + <translation>Использовать сво&ю последовательность автоввода:</translation> </message> <message> <source>Window Associations</source> @@ -1489,7 +1489,7 @@ Do you want to merge your changes?</source> <name>EditEntryWidgetMain</name> <message> <source>URL:</source> - <translation>URL-адрес:</translation> + <translation>Адрес:</translation> </message> <message> <source>Password:</source> @@ -1581,7 +1581,7 @@ Do you want to merge your changes?</source> <message> <source>Browse...</source> <extracomment>Button for opening file dialog</extracomment> - <translation>Просмотр...</translation> + <translation>Обзор...</translation> </message> <message> <source>Attachment</source> @@ -1632,7 +1632,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Inherit from parent group (%1)</source> - <translation>Наследовать от родительской группы (%1)</translation> + <translation>Наследовать у родительской группы (%1)</translation> </message> </context> <context> @@ -1663,7 +1663,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Set default Auto-Type se&quence</source> - <translation>Установить последовательность автоввода по умолчанию</translation> + <translation>Установить по умолчанию последовательность автоввода</translation> </message> </context> <context> @@ -1694,7 +1694,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> - <translation>Подсказка: в качестве резервного варианта для получения значков сайтов возможно использовать Google. Включите этот параметр в меню «Инструменты» -> «Параметры» -> «Безопасность»</translation> + <translation>Подсказка: в качестве резервного варианта для получения значков сайтов возможно использовать Google. Включите этот параметр в меню «Инструменты» -> «Настройки» -> «Безопасность»</translation> </message> <message> <source>Images</source> @@ -1745,7 +1745,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Plugin Data</source> - <translation type="unfinished"/> + <translation>Данные плагина</translation> </message> <message> <source>Remove</source> @@ -1753,20 +1753,21 @@ Do you want to merge your changes?</source> </message> <message> <source>Delete plugin data?</source> - <translation type="unfinished"/> + <translation>Удалить данные плагина?</translation> </message> <message> <source>Do you really want to delete the selected plugin data? This may cause the affected plugins to malfunction.</source> - <translation type="unfinished"/> + <translation>Вы действительно хотите удалить выбранные данные плагинов? +Это может привести к сбоям плагинов.</translation> </message> <message> <source>Key</source> - <translation type="unfinished"/> + <translation>Ключ</translation> </message> <message> <source>Value</source> - <translation type="unfinished"/> + <translation>Значение</translation> </message> </context> <context> @@ -1774,7 +1775,7 @@ This may cause the affected plugins to malfunction.</source> <message> <source> - Clone</source> <comment>Suffix added to cloned entries</comment> - <translation> - клон</translation> + <translation> - Копия</translation> </message> </context> <context> @@ -1816,7 +1817,7 @@ This may cause the affected plugins to malfunction.</source> </message> <message numerus="yes"> <source>Are you sure you want to remove %n attachment(s)?</source> - <translation><numerusform>Вы уверены, что вы хотите удалить %n вложения?</numerusform><numerusform>Вы уверены, что вы хотите удалить %n вложения?</numerusform><numerusform>Вы уверены, что вы хотите удалить %n вложения?</numerusform><numerusform>Вы уверены, что вы хотите удалить %n вложений?</numerusform></translation> + <translation><numerusform>Вы уверены, что вы хотите удалить %n вложение?</numerusform><numerusform>Вы уверены, что вы хотите удалить %n вложений?</numerusform><numerusform>Вы уверены, что вы хотите удалить %n вложений?</numerusform><numerusform>Вы уверены, что вы хотите удалить %n вложений?</numerusform></translation> </message> <message> <source>Confirm Remove</source> @@ -1887,7 +1888,7 @@ This may cause the affected plugins to malfunction.</source> </message> <message> <source>URL</source> - <translation>URL-адрес</translation> + <translation>Адрес</translation> </message> </context> <context> @@ -1911,7 +1912,7 @@ This may cause the affected plugins to malfunction.</source> </message> <message> <source>URL</source> - <translation>URL-адрес</translation> + <translation>Адрес</translation> </message> <message> <source>Never</source> @@ -1972,6 +1973,10 @@ This may cause the affected plugins to malfunction.</source> <source>Reset to defaults</source> <translation>Восстановить значения по умолчанию</translation> </message> + <message> + <source>Attachments (icon)</source> + <translation>Вложения (иконки)</translation> + </message> </context> <context> <name>Group</name> @@ -2035,11 +2040,11 @@ This may cause the affected plugins to malfunction.</source> </message> <message> <source>Exclude look-alike characters</source> - <translation>Не использовать визуально схожие символы</translation> + <translation>Исключить визуально схожие символы</translation> </message> <message> <source>Ensure that the password contains characters from every group</source> - <translation>Формировать пароль с применением символов из каждой группы</translation> + <translation>Убедиться, что пароль содержит символы из каждой группы</translation> </message> <message> <source>Extended ASCII</source> @@ -2427,7 +2432,7 @@ This is a one-way migration. You won't be able to open the imported databas <name>KeePass1Reader</name> <message> <source>Unable to read keyfile.</source> - <translation>Невозможно прочесть ключ-файл.</translation> + <translation>Невозможно прочесть файл-ключ.</translation> </message> <message> <source>Not a KeePass database.</source> @@ -2698,7 +2703,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>&Database settings</source> - <translation>Параметры базы данных</translation> + <translation>Настройки базы данных</translation> </message> <message> <source>Database settings</source> @@ -2730,7 +2735,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>&Settings</source> - <translation>&Параметры</translation> + <translation>&Настройки</translation> </message> <message> <source>Password Generator</source> @@ -2742,7 +2747,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>&Open URL</source> - <translation>&Открыть URL-адрес</translation> + <translation>&Открыть адрес</translation> </message> <message> <source>&Lock databases</source> @@ -2758,7 +2763,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>&URL</source> - <translation>&URL-адрес</translation> + <translation>&Адрес</translation> </message> <message> <source>Copy URL to clipboard</source> @@ -2790,15 +2795,15 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Show TOTP</source> - <translation>Показать TOTP</translation> + <translation>Показать ВРП</translation> </message> <message> <source>Set up TOTP...</source> - <translation>Установить TOTP...</translation> + <translation>Установить ВРП...</translation> </message> <message> <source>Copy &TOTP</source> - <translation>Копировать &TOTP</translation> + <translation>Копировать &ВРП</translation> </message> <message> <source>E&mpty recycle bin</source> @@ -2822,7 +2827,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Settings</source> - <translation>Параметры</translation> + <translation>Настройки</translation> </message> <message> <source>Toggle window</source> @@ -2989,7 +2994,7 @@ This version is not meant for production use.</source> </message> <message> <source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source> - <translation>Возвращает только лучшие совпадения для определенного URL-адрес вместо всех записей для всего домена.</translation> + <translation>Возвращает только лучшие совпадения для определенного URL вместо всех записей для всего домена.</translation> </message> <message> <source>&Return only best matching entries</source> @@ -3005,7 +3010,7 @@ This version is not meant for production use.</source> </message> <message> <source>&Match URL schemes</source> - <translation>&Проверять протокол URL</translation> + <translation>&Проверять протокол</translation> </message> <message> <source>Sort matching entries by &username</source> @@ -3029,7 +3034,7 @@ This version is not meant for production use.</source> </message> <message> <source>Advanced</source> - <translation>Дополнительно</translation> + <translation>Продвинутые</translation> </message> <message> <source>Always allow &access to entries</source> @@ -3053,7 +3058,7 @@ This version is not meant for production use.</source> </message> <message> <source>&Return advanced string fields which start with "KPH: "</source> - <translation>Возвращать дополнительные стро&ковые поля, начинающиеся с «KPH: »</translation> + <translation>Возвращать продвинутые стро&ковые поля, начинающиеся с «KPH: »</translation> </message> <message> <source>HTTP Port:</source> @@ -3069,7 +3074,7 @@ This version is not meant for production use.</source> </message> <message> <source><b>Warning:</b> The following options can be dangerous!</source> - <translation><b>Внимание:</b> Следующие параметры могут быть опасны!</translation> + <translation><b>Предупреждение:</b> Следующие параметры могут быть опасны!</translation> </message> <message> <source><p>KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to KeePassXC-Browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">migration guide</a>.</p></source> @@ -3127,7 +3132,7 @@ Using default port 19455.</source> </message> <message> <source>Special Characters</source> - <translation>Специальные символы</translation> + <translation>Особые символы</translation> </message> <message> <source>Extended ASCII</source> @@ -3135,7 +3140,7 @@ Using default port 19455.</source> </message> <message> <source>Exclude look-alike characters</source> - <translation>Не использовать визуально схожие символы</translation> + <translation>Исключить похожие символы</translation> </message> <message> <source>Pick characters from every group</source> @@ -3306,7 +3311,7 @@ Using default port 19455.</source> </message> <message> <source>URL</source> - <translation>URL-адрес</translation> + <translation>Адрес</translation> </message> <message> <source>Prompt for the entry's password.</source> @@ -3481,7 +3486,7 @@ Available commands: </message> <message> <source>missing closing quote</source> - <translation>Отсутствует закрывающая кавычка</translation> + <translation>Отсутствует закрывающая цитата</translation> </message> <message> <source>AES: 256-bit</source> @@ -3545,7 +3550,7 @@ Available commands: </message> <message> <source>YubiKey[%1] Challenge Response - Slot %2 - %3</source> - <translation>YubiKey[%1] Вызов-ответ - слот %2 - %3</translation> + <translation>YubiKey[%1] Запрос ответа - слот %2 - %3</translation> </message> <message> <source>Press</source> @@ -3719,11 +3724,11 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>No shared encryption-keys found in KeePassHttp Settings.</source> - <translation>Совместно используемые ключи шифрования не заданы в параметрах KeePassHttp.</translation> + <translation>Не найдено общих ключей шифрования в настройках KeePassHttp.</translation> </message> <message> <source>KeePassXC: Settings not available!</source> - <translation>KeePassXC: Параметры недоступны!</translation> + <translation>KeePassXC: Настройки недоступны!</translation> </message> <message> <source>The active database does not contain an entry of KeePassHttp Settings.</source> @@ -3743,7 +3748,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message numerus="yes"> <source>Successfully removed permissions from %n entries.</source> - <translation><numerusform>Успешно удалены разрешения %n записей.</numerusform><numerusform>Успешно удалены разрешения %n записей.</numerusform><numerusform>Успешно удалены разрешения %n записей.</numerusform><numerusform>Успешно удалены доступы для %n записей.</numerusform></translation> + <translation><numerusform>Успешно удалены доступы для %n записи.</numerusform><numerusform>Успешно удалены доступы для %n записей.</numerusform><numerusform>Успешно удалены доступы для %n записей.</numerusform><numerusform>Успешно удалены доступы для %n записей.</numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -3926,11 +3931,11 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Lock databases when session is locked or lid is closed</source> - <translation>Блокировать базу данных при блокировке сеанса или закрытии крышки ноутбука</translation> + <translation>Блокировать базу данных при закрытии сеанса или закрытии крышки</translation> </message> <message> <source>Lock databases after minimizing the window</source> - <translation>Блокировать базу данных при сворачивание окна</translation> + <translation>Блокировать базу данных при сворачивания окна</translation> </message> <message> <source>Don't require password repeat when it is visible</source> @@ -3965,7 +3970,7 @@ Please unlock the selected database or choose another one which is unlocked.</so <name>SetupTotpDialog</name> <message> <source>Setup TOTP</source> - <translation>Настроить TOTP</translation> + <translation>Настроить ВРП</translation> </message> <message> <source>Key:</source> @@ -3981,7 +3986,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Use custom settings</source> - <translation>Использовать пользовательские параметры</translation> + <translation>Использовать пользовательские настройки</translation> </message> <message> <source>Note: Change these settings only if you know what you are doing.</source> @@ -4098,7 +4103,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>key file of the database</source> - <translation>ключ-файл базы данных</translation> + <translation>файл-ключ базы данных</translation> </message> <message> <source>read password of the database from stdin</source> diff --git a/share/translations/keepassx_sr.ts b/share/translations/keepassx_sr.ts index 96adb74f7..676e8c1c0 100644 --- a/share/translations/keepassx_sr.ts +++ b/share/translations/keepassx_sr.ts @@ -3,11 +3,11 @@ <name>AboutDialog</name> <message> <source>About KeePassXC</source> - <translation>O KeePassXC</translation> + <translation>О KeePassXC</translation> </message> <message> <source>About</source> - <translation>O aplikaciji</translation> + <translation>О апликацији</translation> </message> <message> <source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source> @@ -40,7 +40,8 @@ <message> <source>Version %1 </source> - <translation>Верзија %1</translation> + <translation>Верзија %1 +</translation> </message> <message> <source>Revision: %1</source> @@ -101,7 +102,7 @@ Kernel: %3 %4</source> <message> <source>%1 has requested access to passwords for the following item(s). Please select whether you want to allow access.</source> - <translation>%1 тражи приступ лозинкама за следеће ставке. + <translation>%1 тражи приступ лозинкама за следећу ставку (или ставке). Молим вас одаберите да ли желите да одобрите приступ.</translation> </message> </context> @@ -151,7 +152,7 @@ Please select whether you want to allow access.</source> </message> <message> <source>Sequence</source> - <translation>Секвенца</translation> + <translation>Редослед</translation> </message> <message> <source>Default sequence</source> @@ -209,7 +210,7 @@ Please select whether you want to allow access.</source> <message> <source>%1 has requested access to passwords for the following item(s). Please select whether you want to allow access.</source> - <translation>%1 тражи приступ лозинкама за следеће ставке. + <translation>%1 тражи приступ лозинкама за следећу ставку (или ставке). Молим вас одаберите да ли желите да одобрите приступ.</translation> </message> </context> @@ -371,6 +372,10 @@ Please select whether you want to allow access.</source> <source>Select custom proxy location</source> <translation type="unfinished"/> </message> + <message> + <source>We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>BrowserService</name> @@ -484,7 +489,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Browse</source> - <translation>Разгледај</translation> + <translation>Преглед</translation> </message> <message> <source>Create</source> @@ -500,7 +505,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Key files</source> - <translation>Датотеке са кључем</translation> + <translation>Кључ-Датотеке</translation> </message> <message> <source>All files</source> @@ -508,15 +513,15 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Create Key File...</source> - <translation>Креирај датотеку са кључем...</translation> + <translation>Креирај Кључ-Датотеку...</translation> </message> <message> <source>Unable to create Key File : </source> - <translation>Није могуће креирати Датотеку са Кључем:</translation> + <translation>Није могуће креирати Кључ-Датотеку:</translation> </message> <message> <source>Select a key file</source> - <translation>Одаберите датотеку са кључем</translation> + <translation>Одаберите кључ-датотеку</translation> </message> <message> <source>Empty password</source> @@ -533,7 +538,7 @@ Please unlock the selected database or choose another one which is unlocked.</so <message> <source>Failed to set %1 as the Key file: %2</source> - <translation>Неуспешно постављање %1 као Датотеке са Кључем: + <translation>Неуспешно постављање %1 као Кључ-Датотеку: %2</translation> </message> <message> @@ -564,7 +569,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Replace username and password with references</source> - <translation>Замените корисничко име и лозинку са референцама</translation> + <translation>Замени корисничко име и лозинку са референцама</translation> </message> <message> <source>Copy history</source> @@ -619,7 +624,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Preview</source> - <translation>Приказ</translation> + <translation>Преглед</translation> </message> <message> <source>Column layout</source> @@ -679,15 +684,15 @@ Please consider generating a new key file.</source> <name>CsvParserModel</name> <message numerus="yes"> <source>%n byte(s), </source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n бајт(ова),</numerusform><numerusform>%n бајт(ова),</numerusform><numerusform>%n бајт(ова),</numerusform></translation> </message> <message numerus="yes"> <source>%n row(s), </source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n ред(ова),</numerusform><numerusform>%n ред(ова),</numerusform><numerusform>%n ред(ова),</numerusform></translation> </message> <message numerus="yes"> <source>%n column(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n колона</numerusform><numerusform>%n колона</numerusform><numerusform>%n колона</numerusform></translation> </message> </context> <context> @@ -979,7 +984,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Open KeePass 1 database</source> - <translation>Отвори KeePass 1  базу података</translation> + <translation>Отвори KeePass 1 базу података</translation> </message> <message> <source>KeePass 1 database</source> @@ -1101,7 +1106,7 @@ Disable safe saves and try again?</source> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Да ли сте сигурни да желите да преместите %n ставку у корпу за отпатке?</numerusform><numerusform>Да ли сте сигурни да желите да преместите %n ставке у корпу за отпатке?</numerusform><numerusform>Да ли сте сигурни да желите да преместите %n ставку(ставке) у корпу за отпатке?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1172,10 +1177,6 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>Да ли сте сигурни да желите да желите да трајно обришете све ставке из корпе за отпатке?</translation> </message> - <message> - <source>Entry updated successfully.</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DetailsWidget</name> @@ -1233,7 +1234,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Sequence</source> - <translation>Секвенца</translation> + <translation>Редослед</translation> </message> <message> <source>Search</source> @@ -1352,11 +1353,11 @@ Do you want to merge your changes?</source> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n недеља</numerusform><numerusform>%n недеље(а)</numerusform><numerusform>%n недеље(а)</numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n месец</numerusform><numerusform>%n месеца(и)</numerusform><numerusform>%n месеца(и)</numerusform></translation> </message> <message> <source>1 year</source> @@ -1646,7 +1647,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Set default Auto-Type se&quence</source> - <translation>Унеси подразумевану секвенцу за Аутоматско-Куцање</translation> + <translation>Подеси као подразумевану секвенцу за Аутоматско-Куцање</translation> </message> </context> <context> @@ -1661,19 +1662,19 @@ Do you want to merge your changes?</source> </message> <message> <source>Add custom icon</source> - <translation>Додај посебну икону</translation> + <translation>Додај посебну иконицу</translation> </message> <message> <source>Delete custom icon</source> - <translation>Обриши посебну икону</translation> + <translation>Обриши посебну иконицу</translation> </message> <message> <source>Download favicon</source> - <translation>Преузми икону са сајта</translation> + <translation>Преузми иконицу са сајта</translation> </message> <message> <source>Unable to fetch favicon.</source> - <translation>Неуспело добављање иконе са сајта.</translation> + <translation>Није могуће добавити иконицу са сајта.</translation> </message> <message> <source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source> @@ -1952,6 +1953,10 @@ This may cause the affected plugins to malfunction.</source> <source>Reset to defaults</source> <translation type="unfinished"/> </message> + <message> + <source>Attachments (icon)</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Group</name> @@ -3125,7 +3130,7 @@ Using default port 19455.</source> </message> <message> <source>Wordlist:</source> - <translation>Листа речи:</translation> + <translation>Листа фраза:</translation> </message> <message> <source>Word Count:</source> @@ -3166,7 +3171,7 @@ Using default port 19455.</source> <message> <source>Poor</source> <comment>Password quality</comment> - <translation>Слаб</translation> + <translation>Бедан</translation> </message> <message> <source>Weak</source> diff --git a/share/translations/keepassx_sv.ts b/share/translations/keepassx_sv.ts index e580bde0a..e57292e61 100644 --- a/share/translations/keepassx_sv.ts +++ b/share/translations/keepassx_sv.ts @@ -19,15 +19,15 @@ </message> <message> <source>Contributors</source> - <translation>Bidragsgivare</translation> + <translation>Medverkande</translation> </message> <message> <source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source> - <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Se alla bidrag på GitHub</a></translation> + <translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Se Bidragsgivare på GitHub</a></translation> </message> <message> <source>Debug Info</source> - <translation>Felsökningsinformation</translation> + <translation>Felsöknings Information</translation> </message> <message> <source>Include the following information whenever you report a bug:</source> @@ -59,8 +59,8 @@ <source>Operating system: %1 CPU architecture: %2 Kernel: %3 %4</source> - <translation>Operativsystem: %1 -Processorarkitektur: %2 + <translation>Operativ system: %1 +CPU-arkitektur: %2 Kärna: %3 %4</translation> </message> <message> @@ -89,7 +89,7 @@ Kärna: %3 %4</translation> </message> <message> <source>Remember this decision</source> - <translation>Kom ihåg det här valet</translation> + <translation>Kom ihåg detta val</translation> </message> <message> <source>Allow</source> @@ -102,15 +102,15 @@ Kärna: %3 %4</translation> <message> <source>%1 has requested access to passwords for the following item(s). Please select whether you want to allow access.</source> - <translation>%1 har begärt åtkomst till lösenorden för följande objekt. -Vill du tillåta det?</translation> + <translation>%1 har begärt åtkomst till lösenord för följande objekt(en). +Vänligen välj om du vill tillåta åtkomst.</translation> </message> </context> <context> <name>AgentSettingsWidget</name> <message> <source>Enable SSH Agent (requires restart)</source> - <translation>Aktivera SSH-agenten (kräver omstart)</translation> + <translation>Aktivera SSH Agent (kräver omstart)</translation> </message> </context> <context> @@ -156,7 +156,7 @@ Vill du tillåta det?</translation> </message> <message> <source>Default sequence</source> - <translation>Standardsekvens</translation> + <translation>Standard sekvens</translation> </message> </context> <context> @@ -186,7 +186,7 @@ Vill du tillåta det?</translation> </message> <message> <source>Select entry to Auto-Type:</source> - <translation>Välj post att autoskriva:</translation> + <translation>Välj post att auto-skriva</translation> </message> </context> <context> @@ -372,6 +372,10 @@ Vill du tillåta det?</translation> <source>Select custom proxy location</source> <translation type="unfinished"/> </message> + <message> + <source>We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>BrowserService</name> @@ -426,7 +430,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>KeePassXC: No keys found</source> - <translation>KeePassXC: Inga nycklar hittade</translation> + <translation>KeePassXC: Hittade inga nycklar</translation> </message> <message> <source>No shared encryption keys found in KeePassXC Settings.</source> @@ -616,7 +620,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Consider '\' an escape character</source> - <translation type="unfinished"/> + <translation>Överväg '\' som ändelse tecken</translation> </message> <message> <source>Preview</source> @@ -628,7 +632,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Not present in CSV file</source> - <translation>Finns inte i CSV filen</translation> + <translation>Finns inte i CSV fil</translation> </message> <message> <source>Empty fieldname </source> @@ -722,7 +726,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Can't open key file</source> - <translation>Kan inte öppna nyckelfilen</translation> + <translation>Kan inte öppna nyckel-fil</translation> </message> <message> <source>Legacy key file format</source> @@ -768,7 +772,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Unable to open the database.</source> - <translation>Kunde inte öppna databas.</translation> + <translation>Misslyckades att öppna databasen.</translation> </message> <message> <source>Database opened fine. Nothing to do.</source> @@ -793,7 +797,7 @@ Du kan nu spara den.</translation> <name>DatabaseSettingsWidget</name> <message> <source>General</source> - <translation>Allmän</translation> + <translation>Allmänt</translation> </message> <message> <source>Encryption</source> @@ -939,7 +943,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>KeePass 2 Database</source> - <translation>KeePass 2 databas</translation> + <translation>KeePass 2 Databas</translation> </message> <message> <source>All files</source> @@ -1007,7 +1011,7 @@ Spara ändringarna?</translation> </message> <message> <source>Writing the database failed.</source> - <translation>Misslyckades med att skriva till databasen.</translation> + <translation>Kunde inte skriva till databasen.</translation> </message> <message> <source>Passwords</source> @@ -1089,7 +1093,7 @@ Disable safe saves and try again?</source> </message> <message> <source>Move entry to recycle bin?</source> - <translation>Flytta post till soptunnan?</translation> + <translation>Flytta post till papperskorgen?</translation> </message> <message> <source>Do you really want to move entry "%1" to the recycle bin?</source> @@ -1101,7 +1105,7 @@ Disable safe saves and try again?</source> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>Vill du verkligen flytta %n post till papperskorgen?</numerusform><numerusform>Vill du verkligen flytta %n poster till papperskorgen?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1113,7 +1117,7 @@ Disable safe saves and try again?</source> </message> <message> <source>Remember my choice</source> - <translation type="unfinished"/> + <translation>Kom ihåg mitt val</translation> </message> <message> <source>Delete group?</source> @@ -1172,10 +1176,6 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation type="unfinished"/> </message> - <message> - <source>Entry updated successfully.</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DetailsWidget</name> @@ -1352,11 +1352,11 @@ Do you want to merge your changes?</source> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n vecka</numerusform><numerusform>%n veckor</numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n månad</numerusform><numerusform>%n månader</numerusform></translation> </message> <message> <source>1 year</source> @@ -1951,6 +1951,10 @@ This may cause the affected plugins to malfunction.</source> <source>Reset to defaults</source> <translation type="unfinished"/> </message> + <message> + <source>Attachments (icon)</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Group</name> @@ -2407,7 +2411,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Not a KeePass database.</source> - <translation>Inte en KeePass databas.</translation> + <translation>Inte en KeePass databas</translation> </message> <message> <source>Unsupported encryption algorithm.</source> @@ -3031,7 +3035,7 @@ This version is not meant for production use.</source> </message> <message> <source>HTTP Port:</source> - <translation>HTTP Port:</translation> + <translation>Http-Port:</translation> </message> <message> <source>Default port: 19455</source> @@ -3132,7 +3136,7 @@ Using default port 19455.</source> </message> <message> <source>Word Separator:</source> - <translation>Ord separerare:</translation> + <translation>Ord separator:</translation> </message> <message> <source>Generate</source> @@ -3447,7 +3451,7 @@ Tillgängliga kommandon: </message> <message> <source>malformed string</source> - <translation>felaktigt uppbyggd textsträng</translation> + <translation>felaktigt uppbyggd sträng</translation> </message> <message> <source>missing closing quote</source> @@ -3680,7 +3684,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>KeePassXC: No keys found</source> - <translation>KeePassXC: Hittade inga nycklar</translation> + <translation>KeePassXC: Inga nycklar hittade</translation> </message> <message> <source>No shared encryption-keys found in KeePassHttp Settings.</source> @@ -3708,7 +3712,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message numerus="yes"> <source>Successfully removed permissions from %n entries.</source> - <translation><numerusform>Framgångsrikt bort behörigheter från %n poster.</numerusform><numerusform>Lyckades ta bort behörigheter från %n poster.</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -3746,7 +3750,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Start only a single instance of KeePassXC</source> - <translation>Tillåt endast en samtidig instans av KeePassXC</translation> + <translation>Tillåt endast en öppen instans av KeePassXC</translation> </message> <message> <source>Remember last databases</source> @@ -3863,7 +3867,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>General</source> - <translation>Allmän</translation> + <translation>Allmänt</translation> </message> </context> <context> diff --git a/share/translations/keepassx_th.ts b/share/translations/keepassx_th.ts index 84a7676d8..4fd1c06ef 100644 --- a/share/translations/keepassx_th.ts +++ b/share/translations/keepassx_th.ts @@ -371,6 +371,10 @@ Please select whether you want to allow access.</source> <source>Select custom proxy location</source> <translation type="unfinished"/> </message> + <message> + <source>We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>BrowserService</name> @@ -408,7 +412,7 @@ Do you want to overwrite it?</source> </message> <message> <source>KeePassXC: Database locked!</source> - <translation>KeePassXC: ฐานข้อมูลล็อกอยู่!</translation> + <translation>KeePassXC: ฐานข้อมูลถูกล็อก!</translation> </message> <message> <source>The active database is locked! @@ -433,7 +437,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>KeePassXC: Removed keys from database</source> - <translation>KeePassXC: เอากุญแจออกจากฐานข้อมูล</translation> + <translation>KeePassXC: กุญแจถูกนำออกจากฐานข้อมูล</translation> </message> <message numerus="yes"> <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> @@ -678,15 +682,15 @@ Please consider generating a new key file.</source> <name>CsvParserModel</name> <message numerus="yes"> <source>%n byte(s), </source> - <translation><numerusform>%n ไบต์, </numerusform></translation> + <translation type="unfinished"><numerusform></numerusform></translation> </message> <message numerus="yes"> <source>%n row(s), </source> - <translation><numerusform>%n แถว, </numerusform></translation> + <translation type="unfinished"><numerusform></numerusform></translation> </message> <message numerus="yes"> <source>%n column(s)</source> - <translation><numerusform>%n คอลัมน์</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform></translation> </message> </context> <context> @@ -717,7 +721,7 @@ Please consider generating a new key file.</source> </message> <message> <source>Unable to open the database.</source> - <translation>ไม่สามารถเปิดฐานข้อมูลดังกล่าว</translation> + <translation>ไม่สามารถเปิดฐานข้อมูล</translation> </message> <message> <source>Can't open key file</source> @@ -954,7 +958,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source>Unable to open the database.</source> - <translation>ไม่สามารถเปิดฐานข้อมูลดังกล่าว</translation> + <translation>ไม่สามารถเปิดฐานข้อมูล</translation> </message> <message> <source>File opened in read only mode.</source> @@ -1097,7 +1101,7 @@ Disable safe saves and try again?</source> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>คุณต้องการจะย้ายรายการ %1 รายการไปยังถังขยะจริงๆ?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1168,10 +1172,6 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation type="unfinished"/> </message> - <message> - <source>Entry updated successfully.</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DetailsWidget</name> @@ -1951,6 +1951,10 @@ This may cause the affected plugins to malfunction.</source> <source>Reset to defaults</source> <translation type="unfinished"/> </message> + <message> + <source>Attachments (icon)</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Group</name> @@ -2396,7 +2400,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Unable to open the database.</source> - <translation>ไม่สามารถเปิดฐานข้อมูลดังกล่าว</translation> + <translation>ไม่สามารถเปิดฐานข้อมูล</translation> </message> </context> <context> @@ -3088,7 +3092,7 @@ Using default port 19455.</source> </message> <message> <source>Upper Case Letters</source> - <translation>อักษรตัวพิมพ์ใหญ่</translation> + <translation>อักษรพิมพ์ใหญ่</translation> </message> <message> <source>Lower Case Letters</source> @@ -3344,7 +3348,7 @@ Using default port 19455.</source> </message> <message> <source>Extract and print the content of a database.</source> - <translation>สกัดและพิมพ์เนื้อหาของฐานข้อมูล</translation> + <translation>สกัดและแสดงเนื้อหาของฐานข้อมูล</translation> </message> <message> <source>Path of the database to extract.</source> @@ -3660,7 +3664,7 @@ Do you want to overwrite it?</source> </message> <message> <source>KeePassXC: Database locked!</source> - <translation>KeePassXC: ฐานข้อมูลล็อกอยู่!</translation> + <translation>KeePassXC: ฐานข้อมูลถูกล็อก!</translation> </message> <message> <source>The active database is locked! @@ -3669,7 +3673,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>KeePassXC: Removed keys from database</source> - <translation>KeePassXC: เอากุญแจออกจากฐานข้อมูล</translation> + <translation>KeePassXC: กุญแจถูกนำออกจากฐานข้อมูล</translation> </message> <message numerus="yes"> <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> diff --git a/share/translations/keepassx_tr.ts b/share/translations/keepassx_tr.ts index d8d8febc9..5b3b6f439 100644 --- a/share/translations/keepassx_tr.ts +++ b/share/translations/keepassx_tr.ts @@ -372,6 +372,10 @@ Lütfen erişime izin vermek istediklerinizi seçin.</translation> <source>Select custom proxy location</source> <translation type="unfinished"/> </message> + <message> + <source>We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>BrowserService</name> @@ -1103,7 +1107,7 @@ Disable safe saves and try again?</source> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n girdiyi geri dönüşüm kutusuna taşımak istediğinize emin misiniz?</numerusform><numerusform>%n girdiyi geri dönüşüm kutusuna taşımak istediğinize emin misiniz?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1174,10 +1178,6 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>Geri dönüşüm kutunuzdaki her şeyi kalıcı olarak silmek istediğinize emin misiniz?</translation> </message> - <message> - <source>Entry updated successfully.</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DetailsWidget</name> @@ -1354,11 +1354,11 @@ Do you want to merge your changes?</source> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n hafta</numerusform><numerusform>%n hafta</numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> + <translation><numerusform>%n ay</numerusform><numerusform>%n ay</numerusform></translation> </message> <message> <source>1 year</source> @@ -1636,7 +1636,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Search</source> - <translation>Ara</translation> + <translation>Arama</translation> </message> <message> <source>Auto-Type</source> @@ -1953,6 +1953,10 @@ This may cause the affected plugins to malfunction.</source> <source>Reset to defaults</source> <translation type="unfinished"/> </message> + <message> + <source>Attachments (icon)</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Group</name> @@ -2457,7 +2461,7 @@ Bu tek yönlü bir yer değiştirmedir. İçe aktarılan veri tabanını eski Ke </message> <message> <source>Unable to calculate master key</source> - <translation>Ana anahtar hesaplanamıyor</translation> + <translation>Ana anahtar hesaplanamaz</translation> </message> <message> <source>Wrong key or database file is corrupt.</source> diff --git a/share/translations/keepassx_uk.ts b/share/translations/keepassx_uk.ts index fa8b49d09..6c22350db 100644 --- a/share/translations/keepassx_uk.ts +++ b/share/translations/keepassx_uk.ts @@ -35,7 +35,7 @@ </message> <message> <source>Copy to clipboard</source> - <translation>Скопіювати в кишеню</translation> + <translation>Скопіювати у буфер обміну</translation> </message> <message> <source>Version %1 @@ -372,6 +372,10 @@ Please select whether you want to allow access.</source> <source>Select custom proxy location</source> <translation>Вибрати власне розташування посередника</translation> </message> + <message> + <source>We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>BrowserService</name> @@ -443,7 +447,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message numerus="yes"> <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> - <translation><numerusform>Успішно видалив %n шифрувальний ключ з налаштувань KeePassXC.</numerusform><numerusform>Успішно видалив %n шифрувальних ключі з налаштувань KeePassXC.</numerusform><numerusform>Успішно видалив %n шифрувальних ключів з налаштувань KeePassXC.</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> </message> <message> <source>Removing stored permissions…</source> @@ -459,7 +463,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message numerus="yes"> <source>Successfully removed permissions from %n entry(s).</source> - <translation><numerusform>Успішно видалив привілеї для %n запису.</numerusform><numerusform>Успішно видалив привілеї для %n записів.</numerusform><numerusform>Успішно видалив привілеї для %n записів.</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -688,7 +692,7 @@ Please consider generating a new key file.</source> <name>CsvParserModel</name> <message numerus="yes"> <source>%n byte(s), </source> - <translation><numerusform>%n байт, </numerusform><numerusform>%n байти, </numerusform><numerusform>%n байтів, </numerusform></translation> + <translation><numerusform>%n байт,%n byte(s), </numerusform><numerusform>%n байта, </numerusform><numerusform>%n байтів, </numerusform></translation> </message> <message numerus="yes"> <source>%n row(s), </source> @@ -856,12 +860,12 @@ If you keep this number, your database may be too easy to crack!</source> <message numerus="yes"> <source> MiB</source> <comment>Abbreviation for Mebibytes (KDF settings)</comment> - <translation><numerusform>МіБ</numerusform><numerusform>МіБ</numerusform><numerusform>МіБ</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> </message> <message numerus="yes"> <source> thread(s)</source> <comment>Threads for parallel execution (KDF settings)</comment> - <translation><numerusform>потік</numerusform><numerusform>потоки</numerusform><numerusform>потоків</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> </message> </context> <context> @@ -931,7 +935,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source> MiB</source> - <translation> МіБ</translation> + <translation>МіБ</translation> </message> <message> <source>Use recycle bin</source> @@ -1118,7 +1122,7 @@ Disable safe saves and try again?</source> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation><numerusform>Ви дійсно хочете перемістити %n запис у кошик?</numerusform><numerusform>Ви дійсно хочете перемістити %n записи у кошик?</numerusform><numerusform>Ви дійсно хочете перемістити %n записів у кошик?</numerusform></translation> + <translation><numerusform>Ви дійсно хочете перемістити %n запис у смітник?</numerusform><numerusform>Ви дійсно хочете перемістити %n записи в смітник?</numerusform><numerusform>Ви дійсно хочете перемістити %n записів у смітник?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1190,10 +1194,6 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>Ви дійсно бажаєте остаточно видалити все зі смітника?</translation> </message> - <message> - <source>Entry updated successfully.</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DetailsWidget</name> @@ -1362,7 +1362,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Press reveal to view or edit</source> - <translation>Натисніть «показати» для перегляду або зміни</translation> + <translation>Натисніть «показати» для перегляду або редагування</translation> </message> <message> <source>Tomorrow</source> @@ -1370,11 +1370,11 @@ Do you want to merge your changes?</source> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation><numerusform>%n тиждень</numerusform><numerusform>%n тижня</numerusform><numerusform>%n тижнів</numerusform></translation> + <translation><numerusform>%n тиждень</numerusform><numerusform>%n тижні</numerusform><numerusform>%n тижнів</numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation><numerusform>%n місяць</numerusform><numerusform>%n місяця</numerusform><numerusform>%n місяців</numerusform></translation> + <translation><numerusform>%n місяць</numerusform><numerusform>%n місяці</numerusform><numerusform>%n місяців</numerusform></translation> </message> <message> <source>1 year</source> @@ -1569,7 +1569,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Copy to clipboard</source> - <translation>Скопіювати в кишеню</translation> + <translation>Скопіювати у буфер обміну</translation> </message> <message> <source>Private key</source> @@ -1707,7 +1707,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Select Image</source> - <translation>Вибрати зображення</translation> + <translation>Вибір зображення</translation> </message> <message> <source>Can't read icon</source> @@ -1817,7 +1817,7 @@ This may cause the affected plugins to malfunction.</source> </message> <message numerus="yes"> <source>Are you sure you want to remove %n attachment(s)?</source> - <translation><numerusform>Ви дійсно бажаєте видалити %n вкладення?</numerusform><numerusform>Ви дійсно бажаєте видалити %n вкладення?</numerusform><numerusform>Ви дійсно бажаєте видалити %n вкладень?</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> </message> <message> <source>Confirm Remove</source> @@ -1974,6 +1974,10 @@ This may cause the affected plugins to malfunction.</source> <source>Reset to defaults</source> <translation>Повернути до типових налаштувань</translation> </message> + <message> + <source>Attachments (icon)</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Group</name> @@ -2433,15 +2437,15 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Not a KeePass database.</source> - <translation>Не сховище KeePass.</translation> + <translation>Це не сховище KeePass.</translation> </message> <message> <source>Unsupported encryption algorithm.</source> - <translation>Непідтримуваний алгоритм шифрування.</translation> + <translation>Алгоритм шифрування не підтримується.</translation> </message> <message> <source>Unsupported KeePass database version.</source> - <translation>Непідтримувана версія сховища KeePass.</translation> + <translation>Версія сховища KeePass не підтримується.</translation> </message> <message> <source>Unable to read encryption IV</source> @@ -2624,7 +2628,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Copy att&ribute to clipboard</source> - <translation>Скопіювати атрибут у кишеню</translation> + <translation>Копіювати атрибут до буферу обміну</translation> </message> <message> <source>Time-based one-time password</source> @@ -2704,7 +2708,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Database settings</source> - <translation>Налаштування сховища</translation> + <translation>Параметри сховища</translation> </message> <message> <source>&Clone entry</source> @@ -2720,7 +2724,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Copy username to clipboard</source> - <translation>Скопіювати ім’я користувача в кишеню</translation> + <translation>Копіювати ім’я користувача в буфер обміну</translation> </message> <message> <source>Cop&y password</source> @@ -2728,7 +2732,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Copy password to clipboard</source> - <translation>Скопіювати гасло в кишеню</translation> + <translation>Копіювати гасло в буфер обміну</translation> </message> <message> <source>&Settings</source> @@ -2756,7 +2760,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Copy title to clipboard</source> - <translation>Скопіювати заголовок у кишеню</translation> + <translation>Скопіювати заголовок до кишені</translation> </message> <message> <source>&URL</source> @@ -2764,7 +2768,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Copy URL to clipboard</source> - <translation>Скопіювати URL у кишеню</translation> + <translation>Скопіювати URL до кишені</translation> </message> <message> <source>&Notes</source> @@ -2772,7 +2776,7 @@ This is a one-way migration. You won't be able to open the imported databas </message> <message> <source>Copy notes to clipboard</source> - <translation>Скопіювати нотатки у кишеню</translation> + <translation>Скопіювати нотатки до кишені</translation> </message> <message> <source>&Export to CSV file...</source> @@ -2907,7 +2911,7 @@ This version is not meant for production use.</source> </message> <message> <source>Trying to run KDF without cipher</source> - <translation>Пробуємо запустити ФОК без шифрування</translation> + <translation>Пробуємо обчислити ФОК без шифру</translation> </message> <message> <source>Passphrase is required to decrypt this key</source> @@ -3280,7 +3284,7 @@ Using default port 19455.</source> </message> <message> <source>Add a new entry to a database.</source> - <translation>Додати новий запис до сховища.</translation> + <translation>Додати новий запис до сховища</translation> </message> <message> <source>Path of the database.</source> @@ -3341,7 +3345,7 @@ Using default port 19455.</source> </message> <message> <source>Timeout in seconds before clearing the clipboard.</source> - <translation>Час очікування у секундах перед очищенням кишені.</translation> + <translation>Час очікування у </translation> </message> <message> <source>Edit an entry.</source> @@ -3611,7 +3615,7 @@ Available commands: <name>QtIOCompressor</name> <message> <source>Internal zlib error when compressing: </source> - <translation>Внутрішня помилка zlib під час стиснення:</translation> + <translation>Внутрішня помилка zlib при стисненні:</translation> </message> <message> <source>Error writing to underlying device: </source> @@ -3627,7 +3631,7 @@ Available commands: </message> <message> <source>Internal zlib error when decompressing: </source> - <translation>Внутрішня помилка zlib під час розпакування:</translation> + <translation>Внутрішня помилка zlib при розпакуванні:</translation> </message> </context> <context> @@ -3675,8 +3679,8 @@ Available commands: If you would like to allow it access to your KeePassXC database give it a unique name to identify and accept it.</source> <translation>Ви одержали запит на прив'язку вказаного ключа. -Якщо Ви бажаєте надати доступ до Вашого сховища KeePassXC, -вкажіть унікальну назву та підтвердьте прив'язку.</translation> +Якщо Ви бажаєте надати доступ до Вашого сховища KeePassXC +надайте унікальну назву та підтвердьте його. </translation> </message> <message> <source>KeePassXC: Overwrite existing key?</source> @@ -3759,7 +3763,7 @@ Please unlock the selected database or choose another one which is unlocked.</so <name>SettingsWidget</name> <message> <source>Application Settings</source> - <translation>Налаштування застосунку</translation> + <translation>Параметри застосунку</translation> </message> <message> <source>General</source> @@ -3810,7 +3814,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Minimize when copying to clipboard</source> - <translation>Згортати після копіювання до буфера обміну</translation> + <translation>Згортати при копіюванні до буфера обміну</translation> </message> <message> <source>Minimize window at application startup</source> @@ -3830,11 +3834,11 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message> <source>Show a system tray icon</source> - <translation>Показувати значок у лотку</translation> + <translation>Показувати значок в треї</translation> </message> <message> <source>Hide window to system tray when minimized</source> - <translation>Під час згортання ховати вікно у системний лоток</translation> + <translation>При згортанні ховати вікно в область системних повідомлень</translation> </message> <message> <source>Hide window to system tray instead of app exit</source> @@ -3906,7 +3910,7 @@ Please unlock the selected database or choose another one which is unlocked.</so <name>SettingsWidgetSecurity</name> <message> <source>Timeouts</source> - <translation>Час очікування</translation> + <translation>Час очикування</translation> </message> <message> <source>Clear clipboard after</source> diff --git a/share/translations/keepassx_zh_CN.ts b/share/translations/keepassx_zh_CN.ts index 9298211e6..4a2381a68 100644 --- a/share/translations/keepassx_zh_CN.ts +++ b/share/translations/keepassx_zh_CN.ts @@ -275,7 +275,7 @@ Please select whether you want to allow access.</source> </message> <message> <source>&Return only best-matching credentials</source> - <translation type="unfinished"/> + <translation>只返回最匹配的凭据</translation> </message> <message> <source>Sort &matching credentials by title</source> @@ -336,7 +336,7 @@ Please select whether you want to allow access.</source> </message> <message> <source>Support a proxy application between KeePassXC and browser extension.</source> - <translation type="unfinished"/> + <translation>支持KeePassXC和浏览器扩展之间的代理应用程序.</translation> </message> <message> <source>Use a &proxy application between KeePassXC and browser extension</source> @@ -372,6 +372,10 @@ Please select whether you want to allow access.</source> <source>Select custom proxy location</source> <translation type="unfinished"/> </message> + <message> + <source>We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>BrowserService</name> @@ -842,7 +846,7 @@ If you keep this number, your database may be too easy to crack!</source> <message numerus="yes"> <source> MiB</source> <comment>Abbreviation for Mebibytes (KDF settings)</comment> - <translation><numerusform> MiB</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform></translation> </message> <message numerus="yes"> <source> thread(s)</source> @@ -917,7 +921,7 @@ If you keep this number, your database may be too easy to crack!</source> </message> <message> <source> MiB</source> - <translation>MiB</translation> + <translation> MiB</translation> </message> <message> <source>Use recycle bin</source> @@ -1103,7 +1107,7 @@ Disable safe saves and try again?</source> </message> <message numerus="yes"> <source>Do you really want to move %n entry(s) to the recycle bin?</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>你确定要将 %n 个项目移到垃圾桶?</numerusform></translation> </message> <message> <source>Execute command?</source> @@ -1174,10 +1178,6 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>你确定要永久删除回收站中的所有内容?</translation> </message> - <message> - <source>Entry updated successfully.</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DetailsWidget</name> @@ -1354,11 +1354,11 @@ Do you want to merge your changes?</source> </message> <message numerus="yes"> <source>%n week(s)</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>%n 周</numerusform></translation> </message> <message numerus="yes"> <source>%n month(s)</source> - <translation type="unfinished"><numerusform></numerusform></translation> + <translation><numerusform>%n 个月</numerusform></translation> </message> <message> <source>1 year</source> @@ -1953,6 +1953,10 @@ This may cause the affected plugins to malfunction.</source> <source>Reset to defaults</source> <translation type="unfinished"/> </message> + <message> + <source>Attachments (icon)</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Group</name> diff --git a/share/translations/keepassx_zh_TW.ts b/share/translations/keepassx_zh_TW.ts index 397a3e535..af8120977 100644 --- a/share/translations/keepassx_zh_TW.ts +++ b/share/translations/keepassx_zh_TW.ts @@ -372,6 +372,10 @@ Please select whether you want to allow access.</source> <source>Select custom proxy location</source> <translation>選擇自訂代理位置</translation> </message> + <message> + <source>We're sorry, but KeePassXC-Browser is not supported for Snap releases at the moment.</source> + <translation type="unfinished"/> + </message> </context> <context> <name>BrowserService</name> @@ -443,7 +447,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message numerus="yes"> <source>Successfully removed %n encryption key(s) from KeePassXC settings.</source> - <translation><numerusform>成功從 KeePassXC 移除 %n 個加密金鑰。</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform></translation> </message> <message> <source>Removing stored permissions…</source> @@ -459,7 +463,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message numerus="yes"> <source>Successfully removed permissions from %n entry(s).</source> - <translation><numerusform>成功從 %n 個項目中移除權限。</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source> @@ -687,15 +691,15 @@ Please consider generating a new key file.</source> <name>CsvParserModel</name> <message numerus="yes"> <source>%n byte(s), </source> - <translation><numerusform>%n 位元組,</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform></translation> </message> <message numerus="yes"> <source>%n row(s), </source> - <translation><numerusform>%n 行,</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform></translation> </message> <message numerus="yes"> <source>%n column(s)</source> - <translation><numerusform>%n 列,</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform></translation> </message> </context> <context> @@ -1186,10 +1190,6 @@ Do you want to merge your changes?</source> <source>Are you sure you want to permanently delete everything from your recycle bin?</source> <translation>確定要永久刪除回收桶內的項目?</translation> </message> - <message> - <source>Entry updated successfully.</source> - <translation type="unfinished"/> - </message> </context> <context> <name>DetailsWidget</name> @@ -1553,7 +1553,7 @@ Do you want to merge your changes?</source> </message> <message> <source>Comment</source> - <translation>評論</translation> + <translation>註解</translation> </message> <message> <source>Decrypt</source> @@ -1813,7 +1813,7 @@ This may cause the affected plugins to malfunction.</source> </message> <message numerus="yes"> <source>Are you sure you want to remove %n attachment(s)?</source> - <translation><numerusform>確定移除 %n 個附件?</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform></translation> </message> <message> <source>Confirm Remove</source> @@ -1970,6 +1970,10 @@ This may cause the affected plugins to malfunction.</source> <source>Reset to defaults</source> <translation>重設為預設</translation> </message> + <message> + <source>Attachments (icon)</source> + <translation type="unfinished"/> + </message> </context> <context> <name>Group</name> @@ -3181,7 +3185,7 @@ Using default port 19455.</source> </message> <message> <source>Entropy: %1 bit</source> - <translation>Entropy: %1 bit</translation> + <translation>資訊熵:%1 位元</translation> </message> <message> <source>Password Quality: %1</source> @@ -3707,7 +3711,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message numerus="yes"> <source>Successfully removed %n encryption-key(s) from KeePassX/Http Settings.</source> - <translation><numerusform>成功從 KeePassX/Http Settings 移除 %n 加密金鑰。</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform></translation> </message> <message> <source>KeePassXC: No keys found</source> @@ -3739,7 +3743,7 @@ Please unlock the selected database or choose another one which is unlocked.</so </message> <message numerus="yes"> <source>Successfully removed permissions from %n entries.</source> - <translation><numerusform>成功從 %n 個項目中移除權限。</numerusform></translation> + <translation type="unfinished"><numerusform></numerusform></translation> </message> <message> <source>KeePassXC: No entry with permissions found!</source>